ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI2YzMyLi4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0qLWFsbAotKi1jbwotKi1kaXJzCi0qLWRvbmUKLSotaW5zdGFsbC1pbmZvCi0qLXNyYwotKi1zdGFtcC0qCi0qLXRhZ2dlZAotYmxvY2tpdAotY2ZnLXBhcGVyLmluZm8KLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZS5hdXgKLWNvbmZpZ3VyZS5jcAotY29uZmlndXJlLmNwcwotY29uZmlndXJlLmR2aQotY29uZmlndXJlLmZuCi1jb25maWd1cmUuZm5zCi1jb25maWd1cmUua3kKLWNvbmZpZ3VyZS5reXMKLWNvbmZpZ3VyZS5sb2cKLWNvbmZpZ3VyZS5wZwotY29uZmlndXJlLnBncwotY29uZmlndXJlLnRvYwotY29uZmlndXJlLnRwCi1jb25maWd1cmUudHBzCi1jb25maWd1cmUudnIKLWNvbmZpZ3VyZS52cnMKLWRpci5pbmZvCi1NYWtlZmlsZQotbG9zdCtmb3VuZApkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NPUFlJTkcuTElCIGIvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxYjBhNi4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYwICswLDAgQEAKLTE5OTktMDYtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbGQgb24gSVJJWDYuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGRpc3RyaWJ1dGlvbiB0YXJnZXRzIHRvIHVzZSBiemlwMiBpbnN0ZWFkIG9mCi0JZ3ppcC4KLQkoVEVYSU5GT19TVVBQT1JUKTogU2V0IHRvIGp1c3QgdGV4aW5mby90ZXhpbmZvLnRleC4KLQkodGF6KTogRG9uJ3QgdXNlIHRleGluZm8vZ3BsLnRleGluZm8gb3IgdGV4aW5mby9sZ3BsLnRleGluZm8uCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBtY29yZSB0YXJnZXQuCi0KLVN1biBNYXkgMzAgMTY6MDM6MTYgMTk5OSAgQ29ydCBEb3VnYW4gIDxjb3J0QGNzLm5tdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzcyAocHBjLSotbGludXgtZ251KTogQWxzbyB1c2UgbGQgZW11bCBlbGYzMnBwY2xpbnV4LgotCi0xOTk5LTA1LTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBFR0NTIHZlcnNpb24uCi0KLTE5OTktMDQtMzAgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBbbW9kZSBsaW5rXSBBbHdheXMgdXNlIENDIGdpdmVuIGJ5IGx0Y29uZmlnLgotCi0xOTk5LTA0LTIzICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMmYuCi0KLTE5OTktMDQtMjAgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgbGlic3R1YiBmb3IgYXJtLWVsZiB0YXJnZXRzLgotCShub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBhbnkgYnNwIHN0dWZmIGZvciBmb3IgYXJtLW9hYmkgdGFyZ2V0cy4KLQlCYWQgbWVyZ2UgcmVtb3ZlZCB0aGVzZSB0d28gY2hhbmdlcy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpPzg2LSotYmVvcyopOiBEbyBjb25maWcgZ3BlcmY7IGRvbid0IGNvbmZpZwotCWdkYiwgbmV3bGliLCBvciBsaWJnbG9zcy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIG1jb3JlIHRhcmdldHMuCi0KLTE5OTktMDQtMDcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKik6IFVzZSBjb25maWcvbXQtZDMwdiBhcyBtYWtlZmlsZSBmcmFnbWVudCwKLQlub3QgbXQtb3NwYWNlLCBpbiBvcmRlciB0byBzaHV0IHVwIGFzc2VtYmxlciB3YXJuaW5nIGFib3V0IHVzaW5nCi0Jc3ltYm9scyB0aGF0IGFyZSBuYW1lZCB0aGUgc2FtZSBhcyByZWdpc3RlcnMuCi0KLTE5OTktMDQtMDcgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWN5Z21vbik6IEFkZGVkIGFsbC10YXJnZXQtYnNwIHRvIHRoZQotCWRlcGVuZGVuY3kgbGlzdCBmb3IgYWxsLXRhcmdldC1jeWdtb24uCi0KLTE5OTktMDQtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBDaGVjayAkaG9zdCwgbm90ICR0YXJnZXQsIGZvciBzZWxlY3RpdmUgbXVsdGlsaWJzLgotCShhcm0tKi0qKTogQWxsb3cgZGlzYWJsaW5nIG9mIGJpZW5kaWFuLCBoL3cgZnAsIDI2IGJpdCBhcGNzLAotCXRodW1iIGludGVyd29ya2luZywgYW5kIHVuZGVyc2NvcmUgcHJlZml4IG11bHRpbGlicy4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG1pc3Npbmc6IFVwZGF0ZSB0byB2ZXJzaW9uIGZyb20gY3VycmVudCBhdXRvbWFrZS4KLQotRnJpIEFwciAgMiAxNToxMTozMiAxOTk5ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogUmVtb3ZlZC4KLQotCSogY29uZmlndXJlLmluIChneHhfaW5jbHVkZV9kaXIpOiBIYW5kbGUgaXQuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLTE5OTktMDMtMjkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViIChtaXBzNjR2cjQxMTEsbWlwczY0dnI0MTExZWwpIEFkZC4KLQotMTk5OS0wMy0yMSAgQmVuIEVsbGlzdG9uICA8YmplQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IENvcnJlY3QgdHlwbyBmb3IgZGV0ZWN0aW5nIEVMRiBvbiBGcmVlQlNELgotCi1UaHUgTWFyIDE4IDAwOjE3OjUwIDE5OTkgIE1hcmsgRWxicmVjaHQgPHNub3diYWxsM0B1c2EubmV0PgotCi0JKiBjb25maWcvbWgtZ28zMjogRGVsZXRlLgotCSogY29uZmlnL21oLWRqZ3BwOiBOZXcuIFJlbmFtZWQgZnJvbSBtaC1nbzMyLgotCSogY29uZmlndXJlLmluIChwYy1tc2Rvc2RqZ3BwKTogU2V0IGhvc3RfbWFrZWZpbGVfZnJhZyB0bwotCWNvbmZpZy9taC1kamdwcC4KLQotVGh1IE1hciAxMSAxODozNzoyMyAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC1ic3ApOiBBZGRlZCBhbGwtZ2NjIGFsbC1iaW51dGlscyBhbmQKLQlhbGwtdGFyZ2V0LW5ld2xpYiB0byBkZXBlbmRlbmN5IGxpc3QgZm9yIGFsbC10YXJnZXQtYnNwLgotCi1UaHUgTWFyIDExIDAxOjE5OjMxIDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuc3ViOiBBZGQgaTM4Ni11d2luIHN1cHBvcnQuCi0JKiBjb25maWcuZ3Vlc3M6IExpa2V3aXNlLgotCi1UaHUgTWFyIDExIDAxOjA3OjU1IDE5OTkgIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgotCi0JKiBjb25maWd1cmUuaW46IGNsZWFudXAsIGFkZCBtaC0qcGljIGhhbmRsaW5nIGZvciBhcm0sIHNwZWNpYWwKLQljYXNlIHBvd2VycGMqLSotYWl4KgotCi1XZWQgTWFyIDEwIDE4OjM1OjA3IDE5OTkgIEplZmYgSm9obnN0b24gIDxqam9obnN0bkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZWQgdGFyZ2V0LWxpYmdsb3NzIHNvIGxpYm5vc3lzLmEKLQljYW4gYmUgYnVpbHQuCi0KLVdlZCBNYXIgMTAgMTc6Mzk6MDkgMTk5OSAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBic3Agc3VwcG9ydCB0byBhcm0tKi1jb2ZmIGFuZCBhcm0tKi1lbGYKLSAJdGFyZ2V0cy4KLQotMTk5OS0wMy0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVuYW1lIENZR05VUyBMT0NBTCB0byBFR0NTIExPQ0FMCi0KLVN1biBGZWIgMjggMDI6MjA6MDAgMTk5OSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQ2hlY2sgZm9yICJjeWd3aW4qIiByYXRoZXIgdGhhbiAiY3lnd2luMzIqIgotCi0xOTk5LTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBGaXggdHlwbyBpbiBhcm0gcmVjb2duaXRpb24uCi0KLVdlZCBGZWIgMjQgMTM6NTE6NDAgMTk5OSAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBDaGFuZ2VkIHRhcmdldF9jb25maWdkaXJzIHRvCi0JaW5jbHVkZSB0YXJnZXQtYnNwIG9ubHkgZm9yIG02OGstKi1lbGYqIGFuZCBtNjhrLSotY29mZioKLQlyYXRoZXIgdGhhbiBtNjhrLSotKiBzaW5jZSBpdCBpcyBub3Qga25vd24gdG8gd29yayBvbgotCW02OGstYW91dC4gRGl0dG8gZm9yIGFybS0qLSpvYWJpLgotCi1XZWQgRmViIDI0IDEyOjUyOjE3IDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotd2luZG93cyopOiBSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgotCSogY29uZmlnL21oLXdpbmRvd3M6IERpdHRvLgotCi0xOTk5LTAyLTE5ICBCZW4gRWxsaXN0b24gPGJqZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IEF1dG9tYXRpY2FsbHkgcmVjb2duaXNlIEVMRiBvbiBGcmVlQlNELiBGcm9tIE5pYWxsCi0JU21hcnQgYW5kIGltcHJvdmVkIGJ5IEFuZHJldyBDYWduZXkuCi0KLVRodSBGZWIgMTggMTk6NTU6MDkgMTk5OSAgTWFyYyBFc3BpZSA8ZXNwaWVAY3ZzLm9wZW5ic2Qub3JnPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBvcGVuYnNkLSotaHBwYS4KLQotV2VkIEZlYiAxNyAwMTozODo1OSAxOTk5ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIE1ha2VmaWxlLmluIChSRUFMTFlfU0VUX0xJQl9QQVRIKTogQXBwZW5kICQkJChSUEFUSF9FTlZWQVIpCi0Jb25seSBpZiBpdCBpcyBub3QgZW1wdHkuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBmcm9tOiBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQkKLQkqIGNvbmZpZy5ndWVzczogTW9kaWZpZWQgdG8gcmVjb2duaXplIHVuYW1lJ3MgYXJtdiogc3ludGF4LiAKLQotCSogY29uZmlnLnN1YjogTW9kaWZpZWQgdG8gcmVjb2duaXplIHVuYW1lJ3MgYXJtdiogc3ludGF4LgotCi0xOTk5LTAyLTE3ICBNYXJrIFNhbHRlciAgPG1zYWx0ZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCB0YXJnZXQtYnNwIGZvciBzcGFyY2xpdGUuCi0KLU1vbiBGZWIgIDggMTQ6MTc6MjQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGFscGhhcGNhNVs2N10gYW5kIHVwIHRvIGFscGhhZXY4LgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gcG9ydC4KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gdGFyZ2V0LgotCi1TdW4gRmViICA3IDE4OjAxOjU0IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCQotCSogY29uZmlndXJlLmluICgqLSotY3lnd2luMzIqKTogVXNlIGNvbmZpZy9taC1jeWd3aW4gaW5zdGVhZCBvZgotCXRoZSBvbGQgbmFtZSBjb25maWcvbWgtY3lnd2luMzIuCi0JRW5hYmxlIHRleGluZm8uCi0KLVRodSBGZWIgIDQgMjA6NDM6MjUgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvIGJ1aWxkIGxkIGZvciBpeDg2IFNvbGFyaXMuCi0KLVR1ZSBGZWIgIDIgMTk6NDY6NDAgMTk5OSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogIFNldCBBUiB0byAkQVIgaW5zdGVhZCBvZgotCSRBUl9GT1JfVEFSR0VULiAgTGlrZXdpc2UgZm9yIFJBTkxJQi4KLQotVHVlIEZlYiAgMiAyMDowNTowNSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcuc3ViIChvYWJpKTogIFJlY29nbml6ZS4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGFybS0qLW9hYmkpOiAgSGFuZGxlLgotCi1TYXQgSmFuIDMwIDA2OjA5OjAwIDE5OTkgIFJvYmVydCBMaXBlICAocm9iZXJ0bGlwZUB1c2EubmV0KQotCi0JKiBjb25maWcuZ3Vlc3M6IEltcHJvdmUgZGV0ZWN0aW9uIG9mIGk2ODYgb24gVW5peFdhcmUgNy4KLQotU2F0IEphbiAzMCAwODowNDowMCAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgaTM4Ni1wYy1pbnRlcml4LgotCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlnL21oLWludGVyaXg6IE5ldyBmaWxlLgotCi1Nb24gSmFuIDE4IDEzOjU5OjIwIDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgdW5uZWVkZWQgYWxsLXRhcmdldC1saWJpbyBmcm9tCi0JZnJvbSBhbGwtdGFyZ2V0LXdpbnN1cCB0YXJnZXQgc2luY2UgaXQgaXMgbm93IHVubmVlZGVkLgotCUFkZCBhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgaW4gaXRzIHBsYWNlIHNpbmNlIGl0IGlzIG5vdwotCW5lZWRlZC4KLQotV2VkIERlYyAzMCAyMDozNDo1MiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IG1ha2VmaWxlIHN0dWIgZm9yIGN5Z3dpbiB0YXJnZXQgaXMgcHJvYmFibHkKLQl1bm5lY2Vzc2FyeS4gIFJlbW92ZSBpdCBmb3Igbm93LgotCSogY29uZmlnL210LWN5Z3dpbjogUmVtb3ZlLgotCi1XZWQgRGVjIDMwIDAxOjEzOjAzIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogbGlidGVybWNhcC5hIHNob3VsZCBiZSBidWlsdCB3aGVuIGN5Z3dpbiBpcyB0aGUKLQl0YXJnZXQgYXMgd2VsbCBhcyB0aGUgaG9zdC4KLQkqIGNvbmZpZy5ndWVzczogQWxsb3cgbWl4ZWQgY2FzZSBpbiBjeWd3aW4gdW5hbWUgb3V0cHV0LgotCSogTWFrZWZpbGUuaW46IEFkZCBsaWJ0ZXJtY2FwIHRhcmdldC4KLQkqIGNvbmZpZy9tdC1jeWd3aW46IE5ldyBmaWxlLiAgbGlidGVybWNhcCB0YXJnZXQgaW5mby4KLQotVHVlIERlYyAxNSAxNzowMjo1OCAxOTk4ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY3lnbW9uIGZvciB4ODYtY29mZiBhbmQgeDg2LWVsZi4gQ29uZmlndXJlCi0gCWN5Z21vbiBmb3IgYWxsIHNwYXJjbGl0ZSB0YXJnZXRzLCByZWdhcmRsZXNzIG9mIG9iamVjdCBmb3JtYXQuCi0KLTE5OTgtMTItMTUgIE1hcmsgU2FsdGVyICA8bXNhbHRlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIHRhcmdldC1ic3AgZm9yIHNldmVyYWwgdGFyZ2V0IGFyY2hpdGVjdHVyZXMuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBydWxlcyBmb3IgYnNwLgotCi1XZWQgRGVjIDIzIDAwOjIwOjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQ2xlYW4gdXAgaGFuZGxpbmcgb2YgaHBwYTIuMC4KLQotVHVlIERlYyAyMiAyMzo1NjozMSAxOTk4ICBSb2RuZXkgQnJvd24gIChyb2RuZXlicm93bkBwbXNjLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgQyBjb2RlIHRvIGlkZW50aWZ5IG1vcmUgSFAgbWFjaGluZXMuCi0KLVRodSBEZWMgMTcgMDE6MjI6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgaHBwYTIuMC4KLQotRnJpIERlYyAgNCAwMTozNDowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogSW1wcm92ZSBkZXRlY3Rpb24gb2YgaHBwYTIuMCBwcm9jZXNzb3JzLgotCi1GcmkgRGVjICA0IDAxOjMzOjA1IDE5OTggIE5pYWxsIFNtYXJ0IDxuaWFsbHNAZXVyaXN0aXguaWU+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEZyZWVCU0QgdXNpbmcgRUxGIGF1dG9tYXRpY2FsbHkuCi0KLTE5OTgtMTEtMjYgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChza2lwLXRoaXMtZGlyKTogQWRkIGhhbmRsaW5nIGZvciBuZXcgc2hlbGwgc2NyaXB0LCB3aGljaAotCW1pZ2h0IGJlIGNyZWF0ZWQgYnkgYSBzdWItZGlyZWN0b3J5J3MgY29uZmlndXJlIHRvIGluZGljYXRlLCB0aGlzIHBhcnRpY3VsYXIKLQlkaXJlY3RvcnkgaXMgInVud2FudGVkIi4KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBMaWtld2lzZS4KLQotCi1XZWQgTm92IDE4IDE4OjI4OjQ1IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBpbXBvcnQgZnJvbSBsaWJ0b29sLCBhZnRlciBjaGFuZ2luZyBsaWJ0b29sIHRvCi0JYWNjb3VudCBmb3IgdGhlIGN5Z3dpbiBuYW1lIGNoYW5nZS4KLQotV2VkIE5vdiAxOCAxODowOToxNCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ0NfRk9SX1RBUkdFVCBhbmQgQ1hYX0ZPUl9UQVJHRVQgc2hvdWxkIGFsc28KLQlpbmNsdWRlIG5ld2xpYi9saWJjL3N5cy9jeWd3aW4gYW5kIG5ld2xpYi9saWJjL3N5cy9jeWd3aW4zMi4KLQotV2VkIE5vdiAxOCAyMDoxMzoyOSAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBsaWJ0ZXJtY2FwIHRvIGxpc3Qgb2YgY3lnd2luIGRlcGVuZGVuY2llcy4KLQotVHVlIE5vdiAxNyAxNjo1Nzo1MSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogTWFrZWZpbGUuaW46IG1vZGlmeSBDQ19GT1JfVEFSR0VUIGFuZCBDWFhfRk9SX1RBUkdFVCBzbyB0aGF0Ci0gICAgICAgIHRoZXkgaW5jbHVkZSB3aW5zdXAvaW5jbHVkZSB3aGVuIGl0J3MgYSBjeWd3aW4gdGFyZ2V0LgotCi0xOTk4LTExLTEyICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZGVkIHppcC4KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmphdmEpOiBEZXBlbmQgb24gYWxsLXppcC4KLQkoYWxsLXppcCk6IE5ldyB0YXJnZXQuCi0JKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLXppcC4KLQkoTkFUSVZFX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay16aXAuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtemlwLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4temlwLgotCi1UaHUgTm92IDEyIDE3OjI3OjIxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBsb3NlICIzMiIgZnJvbSBjb21tZW50IGFib3V0IGN5Z3dpbi4KLQotVGh1IE5vdiAgNSAxNTowMDozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAtT3MgdG8gYnVpbGQgdGFyZ2V0IGxpYnJhcmllcyBmb3IgdGhlIGZyMzAuCi0KLVdlZCBOb3YgIDQgMTg6NDk6NDMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgZnIzMC4KLQotTW9uIE5vdiAgMiAxNToxOTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkcm9wICIzMiIgZnJvbSBjb25maWcvbWgtY3lnd2luMzIuICBDaGVjawotCWN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0JKiBjb25maWcuc3ViOiBDaGVjayBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqLgotCi0xOTk4LTEwLTIwICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIGNvbmZpZ3VyZS5pbjogQWRkIHRoZSBhYmlsaXR5IHRvIHVzZSB0Y2w4LjEgYW5kIHRrOC4xCi0JaWYgZGVzaXJlZC4KLQotU3VuIE9jdCAxOCAxODozNDo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5pZiAoY3h4X2ludGVyZmFjZSwgbGlic3RkY3h4X2ludGVyZmFjZSk6IERvIG5vdCB0cnkgdG8gc2V0Ci0JdGhlc2UgaWYgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyB0byBub3QgZXhpc3QuCi0KLVdlZCBPY3QgMTQgMTA6Mjk6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGNvbmZpZy5pZi4KLQotVHVlIE9jdCAxMyAwOToxNzowNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEJyaW5nIGJhY2sgbG9zdCBzcGFyY3Y5LgotCi1XZWQgU2VwIDMwIDIyOjIwOjUwIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIGlbMzQ1NjddODYtcGMtdWRrLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotV2VkIFNlcCAzMCAxOToyMzo0OCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGJ6aXAyIHBhY2thZ2UgYnVpbGRpbmcgYml0cyBmb3IgdXNlcgotCXRvb2xzIG1vZHVsZQotCSogY29uZmlndXJlLmluOiBkaXR0bwotCi0xOTk4LTA5LTMwICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkgKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBSZW1vdmUgZHVwbGljYXRlIGxpbmUuCi0KLVR1ZSBTZXAgMjkgMjI6NDU6NDEgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWF1dG9tYWtlKTogZml4IGRlcGVuZGVuY2llcy4KLQotTW9uIFNlcCAyOCAwNDowNDoyNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWlub3IgY2xlYW51cHMgZm9yIGJ1aWxkaW5nIGluIHRoZSAkKHRhcmdldF9hbGlhcykKLQlzdWJkaXIuCi0KLTE5OTgtMDktMjIgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IFNldCByIGFuZCBzIGJlZm9yZSBtYWtlIGFsbC4gIFVzZQotCUJBU0VfRkxBR1NfVE9fUEFTUyBpbiBtYWtlIGFsbC4KLQkoY3Jvc3MpOiBMaWtld2lzZS4KLQotMTk5OC0wOS0yMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IFBhc3MgVEFSR0VUX0ZMQUdTX1RPX1BBU1MgdG8gYG1ha2UgYWxsJy4KLQotCi1TdW4gU2VwIDIwIDAwOjEzOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgotCi0xOTk4LTA5LTE5ICBNaWNoYWVsIEhheWVzICA8bS5oYXllc0BlbGVjLmNhbnRlcmJ1cnkuYWMubno+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBDNHggdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotMTk5OC0wOS0xMyAgRGF2aWQgUy4gTWlsbGVyICA8ZGF2ZW1AcGllcmRvbC5jb2JhbHRtaWNyby5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBzcGFyY3Y5IGp1c3QgbGlrZSBzcGFyYzY0LgotCi1XZWQgU2VwICA5IDE1OjQ0OjUyIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNYXRjaCAiUGVudCBJSSIgb3IgIlBlbnRJSSIgZm9yIE9wZW5TZXJ2ZXIuCi0KLVR1ZSBTZXAgIDggMDE6MTg6MzkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IENvcnJlY3RseSBpZGVudGlmeSBQZW50aXVtIElJIHNjbyBib3hlcy4KLQotCSogY29uZmlnLmd1ZXNzOiBGaXggInRyIiBjb2RlLiAgRnJvbSBXZWl3ZW4gTGl1LgotCi1TYXQgU2VwICA1IDEzOjU2OjUyIDE5OTggIEpvaG4gSHVnaGVzICA8am9obkBDYWx2YS5DT00+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbm90IGFzc3VtZSB4ODYtc3ZyNCBvciB4ODYtdW5peHdhcmUgY2FuIGhhbmRsZQotCXN0YWJzLgotCi1TYXQgU2VwICA1IDAyOjEyOjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTKTogQWRkIGxpYmNoaWxsLgotCShBTExfVEFSR0VUX01PRFVMRVMpOiBBZGQgYWxsLXRhcmdldC1saWJjaGlsbC4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTLCBDSEVDS19UQVJHRVRfTU9EVUxFUyk6IFNpbWlsYXJseS4KLQkoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUywgQ0xFQU5fVEFSR0VUX01PRFVMRVMpOiBTaW1pbGFybHkuCi0JKGFsbC10YXJnZXQtbGliY2hpbGwpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IEFkZCBsaWJjaGlsbC4KLQotU3VuIEF1ZyAzMCAyMjoyNzowMiAxOTk4ICBMdXR6IFdvaGxyYWIgPGx1dHoud29obHJhYkBpbmZvcm1hdGlrLnR1LWNoZW1uaXR6LmRlPgotCi0JKiBjb25maWcuZ3Vlc3M6IEF2b2lkIGFzc3VtcHRpb25zIGFib3V0ICJ0ciIgYmVoYXZlcyB3aGVuCi0JTEFORyBpcyBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gRW5nbGlzaC4KLQotU3VuIEF1ZyAzMCAyMjoxNDo0NCAxOTk4ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogQ2hhbmdlZCB0bwotCScke3ByZWZpeH0vaW5jbHVkZS9nKysnLSR7bGlic3RkY3h4X2ludGVyZmFjZX0uCi0KLQkqIGNvbmZpZy5pZjogTmV3IHRvIGRldGVybWluZSB0aGUgaW50ZXJmYWNlcy4KLQotU3VuIEF1ZyAzMCAyMToxNToxOSAxOTk4ICBNYXJrIEtsZWluIChta2xlaW5AZGlzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBEZXRlY3QgYW5kIGhhbmRsZSBNUEUvSVguCi0JKiBjb25maWcuc3ViOiBEZWFsIHdpdGggTVBFL0lYLgotCi1TYXQgQXVnIDI5IDE0OjMyOjU1IDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1haXg0My4KLQotMTk5OC0wNy0yOSAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmU6IEZpeCAtLXdpdGhvdXQvLS1kaXNhYmxlIGNhc2VzIGZvciBneHgtaW5jbHVkZS1kaXIuCi0KLUZyaSBBdWcgMjggMTI6Mjg6MjYgMTk5OCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+Ci0KLQkqIG1kYXRhLXNoOiAgSW1wb3J0ZWQuICBOZWVkZWQgZm9yIGF1dG9tYWtlIHN1cHBvcnQuCi0KLVRodSBBdWcgMTMgMTI6NDk6MjkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogVHJ5ICJjaG1vZCAtUiBvZz11IC4iIGJlZm9yZSAKLQkiY2htb2Qgb2c9dSBgZmluZCAuIC1wcmludGAiLgotCi1GcmkgSnVsIDMxIDA5OjM4OjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBBZGQgYXJtLWVsZiBhbmQgdGh1bWItZWxmIHN1cHBvcnQuCi0KLU1vbiBKdWwgMjcgMTY6MjM6NTggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVuZG8gcHJldmlvdXMgcGF0Y2guCi0KLUZyaSBKdWwgMjQgMTk6NTU6MjQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfVEFSR0VUKTogTW92ZSBFWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMKLQl0byBoZXJlIC4uLgotCShpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMpOiBhbmQgaGVyZQotCShJTlNUQUxMX01PRFVMRVMpOiAuLi4gZnJvbSBoZXJlLgotCi1GcmkgSnVsIDI0IDE3OjAxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBGU0YuCi0KLQkqIGNvbmZpZy5ndWVzczogTWVyZ2Ugd2l0aCBGU0YuCi0KLUZyaSBKdWwgMjQgMDg6NDM6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChleHRyYWNvbmZpZ2RpcnMpOiBOZXcgdmFyaWFibGUuCi0JKFNVQkRJUlMpOiBBZGQgZXh0cmFjb25maWdkaXJzIGFuZCByZWN1cnNlIG9uIHRoZW0gdG9vLgotCSogTWFrZWZpbGUuaW4gKGFsbCk6IE1vdmUgaGlnaGVyIGluIGZpbGUuCi0JKEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTKTogTmV3IHZhcmlhYmxlLgotCShFWFRSQV9UQVJHRVRfSE9TVF97SU5TVEFMTCxDSEVDS31fTU9EVUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKEFMTF9NT0RVTEVTKTogQWRkIEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkIEVYVFJBX1RBUkdFVF9IT1NUX0NIRUNLX01PRFVMRVMuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZCBFWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMuCi0KLTE5OTgtMDctMjMgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmphdmEpOiBEZXBlbmQgb24gYWxsLWdjYyBhbmQKLQlhbGwtdGFyZ2V0LW5ld2xpYi4KLQkoY29uZmlndXJlLXRhcmdldC1saWJqYXZhKTogRGVwZW5kIG9uICQoQUxMX0dDQykuCi0KLVNhdCBKdWwgMTggMTQ6MzI6NDMgQ0RUIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAoKi1wYy1zY28zLjJ2NSkgQWRkIGRldGVjdGlvbiBmb3IgUGVudGl1bSBJSS4KLQkoKi1wYy11bml4d2FyZTcpIEFkZCBkZXRlY3Rpb24gZm9yIFBlbnRpdW0gSUksIFBlbnRpdW0gUHJvLgotCi1GcmkgSnVsIDE3IDEzOjMwOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeWx3cmFwOiBDaGFuZ2UgYWJzb2x1dGUgcGF0aCBjaGVja3MgdG8gY2hlY2sgZm9yIERPUyBzdHlsZSBwYXRoCi0JbmFtZXMuCi0KLQkqIHlsd3JhcDogRG9uJ3QgdXNlIGEgZnVsbCBwYXRoIG5hbWUgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIGluIHRoZQotCXNhbWUgZGlyZWN0b3J5LiAgRnJvbSBoamxAbHVjb24ub3JnIChILkouIEx1KS4KLQotCSogY29uZmlnLW1sLmluOiBEZWZhdWx0IHRvIGJlaW5nIHZlcmJvc2UsIHRvIG1hdGNoIEZlYiAxOCBjaGFuZ2UgdG8KLQljb25maWd1cmUuCi0KLVRodSBKdWwgMTYgMTI6Mjk6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQnJvdWdodCBvdmVyIGZyb20gZWdjczoKLQotCVNhdCBKdW4gMjcgMjI6NDY6MzIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBTZXQgdG8gJHt0YXJnZXRfYWxpYXN9IGluc3RlYWQKLQlvZiAibGlicmFyaWVzIi4KLQotCU1vbiBTZXAgIDEgMTY6NDU6NDQgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBTZXQgdG8gbGlicmFyaWVzIGlmIGVuYWJsZV9tdWx0aWxpYi4KLQotV2VkIEp1bCAxNSAwMTowMDo1NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBJZiB0aGVyZSBhcmUgYW55Ci0JbXVsdGlsaWJzLCBmb3JjZSByZWNvbmZpZ3VyYXRpb24gdGhlIGZpcnN0IHRpbWUgd2UgY3JlYXRlCi0JbXVsdGlsaWIub3V0IGluIGEgc3ViZGlyZWN0b3J5LCBpbiBjYXNlIFRBUkdFVF9TVUJESVIgaXMgYC4nLgotCi1UdWUgSnVsIDE0IDIzOjQxOjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTdHJpcCBhbnkgLS1ubyBvcHRpb24gZnJvbSBDT05GSUdfQVJHVU1FTlRTLCB0bwotCWF2b2lkIGNvbmZ1c2lvbiB3aXRoIC0tbm8tcmVjdXJzaW9uLgotCi1UdWUgSnVsIDE0IDE1OjM3OjQxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogV2luMzIgaG9zdHMgc2hvdWxkbid0IHVzZSBpbnN0YWxsIC14Ci0JKiBpbnN0YWxsLXNoOiByZW1vdmUgLXggb3B0aW9uLCBhbmQgc3BlY2lhbCAuZXhlLWhhbmRsaW5nCi0JaGFjay4KLQotVHVlIEp1bCAxNCAxNToyODo0MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpNTg2LXBjLWJlb3MuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIHNvbWUgYml0cyBmb3IgYmVvcy4KLQotVHVlIEp1bCAxNCAxMzoyMjoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgQ0MgaXMgc2V0IGJ1dCBDRkxBR1MgaXMgbm90LCBhbmQgQ0MgaXMgZ2NjLCBtYWtlCi0JQ0ZMQUdTIGRlZmF1bHQgdG8gLU8yLgotCi0JKiBsdG1haW4uc2g6IEFkZCBzb21lIGhhY2tzIHRvIG1ha2UgU3VuT1MgLS1lbmFibGUtc2hhcmVkIHdvcmsKLQl3aGVuIHVzaW5nIEdOVSBsZC4KLQotRnJpIEp1bCAxMCAxMzoxODoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0bWFpbi5zaDogQ29ycmVjdCBpbnN0YWxsIHdoZW4gdXNpbmcgYSBkaWZmZXJlbnQgc2hlbGwuCi0KLVR1ZSBKdWwgIDcgMTU6MjQ6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgdG8gbGlidG9vbCAxLjJiLgotCi1UaHUgSnVsICAyIDEzOjU3OjM2IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcm1pLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSB0byBidWlsZCBiaW51dGlscy9tYWtlZmlsZS52bXMuICBBZGQgaW5zdGFsbAotCXRhcmdldC4KLQotV2VkIEp1bCAgMSAxNjo0NToyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgdG8gY29ycmVjdCBBSVggaGFuZGxpbmcuCi0KLVNhdCBKdW4gMjcgMjI6NDY6MzIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogQWRkIFRBUkdFVF9TVUJESVIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byAke3RhcmdldF9hbGlhc30gaW5zdGVhZAotCW9mICJsaWJyYXJpZXMiLgotCi0xOTk4LTA2LTI2ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBBZGQgZ2NjX3ZlcnNpb25fdHJpZ2dlci4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgb24gJChnY2NfdmVyc2lvbl90cmlnZ2VyKS4KLQotCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IENoYW5nZSBkZWZhdWx0IGluaXRpYWxpemVyIHRvIGVtcHR5Ci0Jc3RyaW5nLgotCShnY2NfdmVyc2lvbl90cmlnZ2VyKTogTmV3IHZhcmlhYmxlOyBwYXNzIHRoaXMgdmFyaWFibGUgZG93bgotCXRvIHN1YmRpciBjb25maWd1cmVzIHRvIGVuYWJsZSB0aGVtIGNoZWNraW5nIGdjYydzIHZlcnNpb24KLQl0aGVtc2VsdmVzLiBFbWl0IG1ha2UgbWFjcm9zIGZvciBib3RoIGdjY192ZXJzaW9uIHZhcnMuCi0JKHRvcHNyY2Rpcik6IEluaXRpYWxpemUgcmVsaWFibHkuCi0JKHJlY3Vyc2lvbiBsaW5lKTogUmVtb3ZlIC0td2l0aC1nY2MtdmVyc2lvbj0ke2djY192ZXJzaW9ufS4KLQotMTk5OC0wNi0yNCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyk6IEltcGxlbWVudCBuZXcgZmxhZwotCS0tZW5hYmxlLXZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzIHdoaWNoIGluc3RhbGxzIEMrKyBydW50aW1lIHN0dWZmCi0JaW4gJChsaWJzdWJkaXIpOyBlbWl0IGRlZmluaXRpb24gaW4gZWFjaCBnZW5lcmF0ZWQgTWFrZWZpbGUuCi0JKGd4eF9pbmNsdWRlX2Rpcik6IEluaXRpYWxpemUgZGVwZW5kaW5nIG9uCi0JJGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicy4KLQotMTk5OC0wNi0yNCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKGdjY192ZXJzaW9uKTogSW5pdGlhbGl6ZSBwcm9wZXJseSBkZXBlbmRpbmcgb24KLQlob3cgYW5kIHdoZXJlIGNvbmZpZ3VyZSBpcyBzdGFydGVkLgotCShyZWN1cnNpb24gbGluZSk6IFBhc3MgYSAtLXdpdGgtZ2NjLXZlcnNpb249JHtnY2NfdmVyc2lvbn0KLQl0byBjb25maWd1cmVzIGluIHN1YmRpcnMuCi0KLVdlZCBKdW4gMjQgMTY6MDE6NTkgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgY29uZmlndXJlIHBhdHRlcm4gZm9yIG1pcHMgdHgzOQotIAljeWdtb24KLQotVHVlIEp1biAyMyAyMjo0MjozMiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGN5Z21vbiBhbmQgbGlic3R1YiBzdXBwb3J0IGZvciBtbjEwMjAwLgotCi0xOTk4LTA2LTE5ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAoZ2NjX3ZlcnNpb24pOiBBZGQgbmV3IHZhcmlhYmxlIGRlc2NyaWJpbmcgdGhlCi0JcGFydGljdWxhciBnY2MgdmVyc2lvbiB3ZSdyZSBidWlsZGluZy4KLQkqIE1ha2VmaWxlLmluIChsaWJzdWJkaXIpOiBBZGQgbmV3IG1hY3JvIGZvciB0aGUgZGlyZWN0b3J5Ci0JaW4gd2hpY2ggdGhlIGNvbXBpbGVyIGZpbmRzIGV4ZWN1dGFibGVzLCBsaWJyYXJpZXMsIGV0Yy4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGdjY192ZXJzaW9uLCB0YXJnZXRfYWxpYXMKLQlhbmQgbGlic3ViZGlyLgotCi1GcmkgSnVuIDE5IDAyOjM2OjU5IDE5OTggIEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+Ci0KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1jbGVhbik6IHJlbW92ZSAqLmxvZwotCSh3YXJuaW5nLmxvZyk6IGJ1aWx0IHdpdGggd2Fybl9zdW1tYXJ5IGZyb20gYnVpbGQubG9nCi0JKG1haWwtcmVwb3J0LmxvZyk6IHJ1biB0ZXN0X3N1bW1hcnkKLQkobWFpbC1yZXBvcnQtd2l0aC13YXJuaW5ncy5sb2cpOiBydW4gdGVzdF9zdW1tYXJ5IGluY2x1ZGluZwotCXdhcm5pbmcubG9nIGluIHRoZSByZXBvcnQKLQotVGh1IEp1biAxOCAxMToyNjowMyAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogRGV0ZWN0aW9uIG9mIFBlbnRpdW0gSUkgZm9yICotc2NvLTMuMnY1Ki4KLQotTW9uIEp1biAxNSAxNDo1Mzo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChncmVwKTogR3JlcCBubyBsb25nZXIgZGVwZW5kcyBvbiBsaWJpYmVydHkuCi0KLUZyaSBKdW4gMTIgMTQ6MDM6MzQgMTk5OCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWxsLXNuYXZpZ2F0b3IgbmVlZHMgYWxsLWxpYmd1aS4KLQotVGh1IEp1biAxMSAxOTo0Mzo0NyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGN5Z21vbiBhbmQgbGlic3R1YiBzdXBwb3J0IGZvciBtbjEwMzAwLgotCi1XZWQgSnVuIDEwIDExOjE5OjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlzc2luZzogVXBkYXRlIHRvIHZlcnNpb24gZnJvbSBhdXRvbWFrZSAxLjMuCi0KLQkqIGx0bWFpbi5zaDogT24gaW5zdGFsbGF0aW9uLCBkb24ndCBnZXQgY29uZnVzZWQgaWYgdGhlIHNhbWUgbmFtZQotCWFwcGVhcnMgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGxpc3Qgb2YgbGlicmFyeSBuYW1lcy4KLQotV2VkIEp1biAgMyAxNDo1MTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBtNjgwNjAgYW5kIG01MjAwIGFzIENQVSBuYW1lcy4KLQotTW9uIEp1biAgMSAxNzoyNToxNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogVXNlICYmIHJhdGhlciB0aGFuIHVzaW5nIC1hIGluIHRlc3QsIGJlY2F1c2Ugb2RkCi0Jc3RyaW5ncyBjYW4gY29uZnVzZSB0ZXN0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotVGh1IE1heSAyOCAxOTozMToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEJyaW5nIGluIFZpc3VhbCBDKysgc3VwcG9ydC4KLQotU2F0IE1heSAyMyAyMzo0NDoxMyAxOTk4ICBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vc3RyYXAyLWxlYW4sIGJvb3RzdHJhcDMtbGVhbiwKLQlib290c3RyYXA0LWxlYW4pOiBuZXcgdGFyZ2V0cwotCi1Nb24gTWF5IDExIDIzOjExOjM0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogQ09QWUlORy5MSUI6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KLQotRnJpIE1heSAgOCAwMTozMDoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMmEuCi0KLQkqIE1ha2VmaWxlLmluIChHQVNCX1NVUFBPUlRfRElSUyk6IFJlbW92ZSBpbnRsOyBhbHJlYWR5IGluY2x1ZGVkIHZpYQotCUdBU19TVVBQT1JUX0RJUlMuCi0KLVRodSBNYXkgIDcgMTc6Mjc6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBBdm9pZCBwcm9kdWNpbmcgYSB2ZXJzaW9uIG51bWJlciBpZgotCS12ZXJzaW9uLWluZm8gd2FzIG5vdCB1c2VkLgotCi1UdWUgTWF5ICA1IDE4OjAyOjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgLS13aXRoLW5ld2xpYiB0byBDT05GSUdfQVJHVU1FTlRTIGlmIHdlIGFyZQotCWJ1aWxkaW5nIHdpdGggbmV3bGliLgotCi0xOTk4LTA0LTMwICBQYXVsIEVnZ2VydCAgPGVnZ2VydEB0d2luc3VuLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBSZW1vdmUgYmFja3NsYXNoIGF0IGVuZDsKLSAgICAgICAgU29sYXJpcyBgbWFrZScgY2F1c2VzIGl0IHRvIGNvbnRpbnVlIHRvIG5leHQgZGVmaW5pdGlvbi4gCi0KLVR1ZSBBcHIgMjggMTg6MTE6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBhbHBoYSB0byBhbHBoYSogaW4gc2V2ZXJhbCBwbGFjZXMuCi0KLVR1ZSBBcHIgMjggMDc6NDI6MDAgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgc3BhcmM4NnguCi0KLVR1ZSBBcHIgMjggMDc6MzU6MDIgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0gCi0JKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSk6IFJlbW92ZSBkZWJ1ZyBlY2hvLgotCi1UaHUgQXByIDIzIDIxOjMxOjE2IDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBTZXQgQ1hYRkxBR1MgZnJvbSBDWFhGTEFHUywgbm90IENGTEFHUy4KLQotVGh1IEFwciAyMyAxMjoyNjozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgY3lnd2luMzIgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMpOiBBZGQgaW50bC4KLQkoQklOVVRJTFNfU1VQUE9SVF9ESVJTLCBHQVNCX1NVUFBPUlRfRElSUyk6IExpa2V3aXNlLgotCShHREJfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMjIgMTI6MzA6MTAgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X21ha2VmaWxlX2ZyYWcpOiBJZiAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UsCi0JdXNlIC1PcyB0byBjb21waWxlIHRhcmdldCBsaWJyYXJpZXMgcmF0aGVyIHRoYW4gLU8yLiAgRGVmYXVsdCB0bwotCXVzaW5nIC1PcyBmb3IgZDEwdiBhbmQgbTMyciBpZiAtLXtlbmFibGUsZGlzYWJsZX0tdGFyZ2V0LW9wdHNwYWNlIGlzCi0Jbm90IHVzZWQuCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9jZmxhZ3MpOiBEaXR0byBmb3IgZDMwdi4KLQotVHVlIEFwciAyMSAyMzowNjo1NCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtYmZkKTogRGVwZW5kIG9uIGFsbC1pbnRsLgotCShhbGwtYmludXRpbHMpOiBMaWtld2lzZS4KLQkoYWxsLWdhcyk6IExpa2V3aXNlLgotCShhbGwtZ3Byb2YpOiBMaWtld2lzZS4KLQkoYWxsLWxkKTogTGlrZXdpc2UuCi0KLQotMTk5OC0wNC0xOSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogRml4IHR5cG8sIGxidG9vbCAtPiBsaWJ0b29sLgotCi1GcmkgQXByIDE3IDE2OjIwOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iZmQpOiBEZXBlbmQgdXBvbiBhbGwtbGliaWJlcnR5LgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBCcmluZyBpbiBuZXdlciBjeWd3aW4zMiBzdXBwb3J0LgotCi1GcmkgQXByIDE3IDEyOjIyOjIyIDE5OTggIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGxpYnN0dWIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uIEJ1aWxkIGxpYnN0dWIgZm9yIHRhcmdldHMgdGhhdCBoYXZlIGN5Z21vbgotCXN1cHBvcnQuCi0KLVR1ZSBBcHIgMTQgMTg6MDE6NTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBQSUNGTEFHIG9uIGl4ODYtY3lnd2luMzIuCi0KLVR1ZSBBcHIgMTQgMTI6MjQ6NDUgMTk5OCAgSi4gS2VhbiBKb2huc3RvbiAgPGprakBzY28uY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbmlzZSBpWzM0NTZdOTYtKi1zeXN2NSogYXMgYSB2YWxpZCBob3N0LCBhbmQKLQl1c2UgbWgtc3lzdjUgaWYgc3BlY2lmaWVkLiAgU3VwcG9ydCBncHJvZiBvbiBTQ08gT3BlbiBTZXJ2ZXIuCi0KLVR1ZSBBcHIgMTQgMTE6MzM6NTEgMTk5OCAgS3Jpc3RlciBXYWxmcmlkc3NvbiA8Y2F0b0BkZi5sdGguc2U+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmaW5lIERFRkFVTFRfTTQgYnkgc2VhcmNoaW5nIFBBVEguCi0JKiBNYWtmaWxlLmluOiBVc2UgREVGQVVMVF9NNC4KLQotTW9uIEFwciAxMyAxNTozNzoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBBZGQgY3lnd2luMzIgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQWRkIGxpYnRvb2wgYXMgYSBuYXRpdmUgb25seSBkaXJlY3RvcnkKLSAJdG8gY29uZmlndXJlIGFuZCBidWlsZC4KLQotV2VkIEFwciAgOCAxMzoxODo1NiAxOTk4ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IFhGT08gbGluZXMgc2hvcnRlbmVkLgotCi1UaHUgQXByICAyIDE0OjQ4OjQ0IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBhZGQgYXNoIG1ha2UgcnVsZXMKLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGFzaCB0byBuYXRpdmVfb25seSBhbmQgaG9zdF90b29scyBsaXN0cwotCi1UaHUgTWFyIDI2IDEyOjUzOjIwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZXR0ZXh0LCBhbGwtaW50bCk6IE5ldyB0YXJnZXRzLgotCShBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1nZXR0ZXh0LCBhbGwtaW50bC4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLWdldHRleHQsIGNoZWNrLWludGwuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtZ2V0dGV4dCwgaW5zdGFsbC1pbnRsLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4tZ2V0dGV4dCwgY2xlYW4taW50bC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkZWQgZ2V0dGV4dC4KLQkobmF0aXZlX29ubHkpOiBMaWtld2lzZS4KLQkobm9jb25maWdkaXJzKSBbdmFyaW91cyBjYXNlc106IExpa2V3aXNlLgotCShob3N0X2xpYnMpOiBBZGRlZCBpbnRsLgotCi1XZWQgTWFyIDI1IDExOjQ5OjEyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkoYWxsLXRhcmdldC13aW5zdXApOiAgYWxsLXRhcmdldC1saWJyeCBzdGF5cyBvdXQgb2YgaGVyZS4KLQotVHVlIE1hciAyNCAxNjo1ODoyOSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTLCBBTExfVEFSR0VUX01PRFVMRVMsIAotCUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUywgQ0hFQ0tfVEFSR0VUX01PRFVMRVMsIAotCUlOU1RBTExfVEFSR0VUX01PRFVMRVMsIENMRUFOX1RBUkdFVF9NT0RVTEVTLCBhbGwtdGFyZ2V0LXdpbnN1cCk6IAotCVJlbW92ZSByZWZlcmVuY2VzIHRvIGxpYnJ4IGFuZCBsaWJnKysuCi0KLVR1ZSBNYXIgMjQgMTg6Mjg6MTIgMTk5OCAgRXJpYyBNdW1wb3dlciAgPG5vY3R1cm5lQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzICQobGlzcGRpcikgZG93biB0bwotCXJlY3Vyc2l2ZSBtYWtlcwotCi1UdWUgTWFyIDI0IDExOjM3OjQ1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgJChUQVJHRVRfU1VCRElSKSB3aGVuIHBhc3NpbmcgLUIKLQlmb3IgbmV3bGliIGRpcmVjdG9yeS4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyMyAxMTozMDoyMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgYWZ0ZXIgbGlidG9vbC9sdGNvbmZpZy5pbiBjaGFuZ2UgZm9yCi0JaHB1eDExLgotCi1GcmkgTWFyIDIwIDE4OjUxOjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yLgotCi1GcmkgTWFyIDIwIDA5OjMyOjE0IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZ2NjKTogRG9uJ3Qgc3BlY2lmeSBMQU5HVUFHRVMgaGVyZS4KLQkoaW5zdGFsbC1nY2MtY3Jvc3MpOiBJbnN0ZWFkLCBvdmVycmlkZSBMQU5HVUFHRVMgaGVyZS4KLQotMTk5OC0wMy0xOCAgRGF2ZSBMb3ZlICA8ZC5sb3ZlQGRsLmFjLnVrPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogU2V0IENPTkZJR19TSVRFIHRvIGEKLQlub24tZXhpc3RlbnQgZmlsZSBzaW5jZSAvZGV2L251bGwgbG9zZXMgd2l0aCBiYXNoIDIuMC9hdXRvY29uZiAyLjEyLgotCi1XZWQgTWFyIDE4IDA5OjI0OjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIFRodW1iLXBlIHRhcmdldC4KLQotVHVlIE1hciAxNyAxNjo1OTowMCAxOTk4ICBTeWQgUG9sayA8c3BvbGtAY3lnbnVzLmNvbT4KLQkqIE1ha2VmaWxlLmluIC0gY2hhbmdlZCBzbiB0YXJnZXRzIHRvIHNuYXZpZ2F0b3IKLQkqIGNvbmZpZ3VyZS5pbiAtIGNoYW5nZWQgc24gdGFyZ2V0cyB0byBzbmF2aWdhdG9yCi0KLVR1ZSBNYXIgMTcgMTA6MzM6MjggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWctbWwuaW46IEFmdGVyIGJ1aWxkaW5nIHN5bWxpbmsgdHJlZSBjYWxsIG1ha2UgZGlzdGNsZWFuCi0JaWYgYSBNYWtlZmlsZSBnb3QgbGlua2VkIGludG8gJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgdGhpcyBoYXBwZW5zCi0JdG8gYmUgdGhlIGNhc2UgZm9yIGxpYmliZXJ0eS4KLQotVHVlIE1hciAxNyAxMDoyMjozNyAxOTk4ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWd1cmU6IFdoZW4gbWFraW5nIGxpbmssIGFsc28gY2hlY2sgdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuIFRoZSBjb25maWd1cmUgc2NyaXB0cyBtYXkgY3JlYXRlIG9uZS4KLQotRnJpIE1hciAgNiAwMTowMjowMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgYWxwaGFwY2E1NiBhbmQgYWxwaGFldjYgcHJvcGVybHkuCi0KLUZyaSBNYXIgIDYgMDA6MTQ6NTUgMTk5OCAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0IDMgSmFuIGNoYW5nZSBmb3IgcG93ZXJwYy1saW51eC1nbnVsaWJjMS4KLQotCi1Nb24gRmViIDIzIDE1OjA5OjE4IDE5OTggIEJydW5vIEhhaWJsZSA8YnJ1bm9AbGludWl4Lm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZQotCi0gICAgICAgICogY29uZmlnLnN1YiAoc2NvNSk6IEZpeCB0eXBvLgotCi1Nb24gRmViIDIzIDE0OjQ2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTU9EVUxFUyk6IE1vdmUgaW5zdGFsbC10Y2wgYmVmb3JlCi0JaW5zdGFsbC1pdGNsLgotCShpbnN0YWxsLWl0Y2wpOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBpbnN0YWxsLXRjbC4KLQotTW9uIEZlYiAyMyAwOTo1MzoyOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxpYmdsb3NzIGZyb20gbm9jb25maWdkaXJzIGZvciBNTjEwMzAwLgotCi1GcmkgRmViIDIwIDE2OjQ3OjI0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCBsZXQgYnVpbGRzIGJlIGRvbmUgaW4gc291cmNlIHRyZWUuCi0KLVRodSBGZWIgMTkgMTM6NDA6NDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxpYmd1aSBmb3IgYSBjeWd3aW4zMiB0YXJnZXQgd2hlbiBub3Qgb24KLQlhIGN5Z3dpbjMyIGhvc3QuCi0KLVdlZCBGZWIgMTggMTI6Mjk6MDAgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAocmVkaXJlY3QpOiBTZXQgdG8gbnVsbCwgc28gZGVmYXVsdCBiZWhhdmlvciBvZgotCWNvbmZpZ3VyZSBpcyBub3cgLS12ZXJib3NlLgotCi0xOTk4LTAyLTE2ICBEYXZlIExvdmUgIDxkLmxvdmVAZGwuYWMudWs+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBSdW4gY29uZmlndXJlIHdpdGgKLQlDT05GSUdfU0lURT0vZGV2L251bGwgdG8gZm9yZXN0YWxsIGxvc3NhZ2Ugd2l0aCBzaXRlIGNvbmZpZ3VyYXRpb24uCi0KLU1vbiBGZWIgMTYgMTI6MjM6NTMgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxNYW5mcmVkLkhvbGxzdGVpbkBrcy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUywgRVhUUkFfVEFSR0VUX0ZMQUdTKTogUmVhbGx5IGFkZAotCXRoaXMgY2hhbmdlIHRvIHN5bmMgTWFrZWZpbGUuaW4gd2l0aCBpdHMgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLVRodSBGZWIgMTIgMTU6MDM6MDggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsdG1haW4uc2ggKG1rZGlyKTogQ2hlY2sgdGhhdCB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QKLQliZWZvcmUgd2UgZXhpdCB3aXRoIGVycm9yLCBzbyB0aGF0IHdlIGRvbid0IGdldCByYWNlcyBkdXJpbmcKLQlwYXJhbGxlbCBidWlsZHMuCi0KLVNhdCBGZWIgIDcgMTU6MTk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGkuCi0KLUZyaSBGZWIgIDYgMDE6MzM6NTIgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogRG9uJ3QgcGFzcyBQSUNGTEFHIGFuZAotCVBJQ0ZMQUdfRk9SX1RBUkdFVC4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRG9uJ3QgcGFzcyBQSUNGTEFHX0ZPUl9UQVJHRVQuCi0KLQkqIGNvbmZpZ3VyZTogRW1pdCBhIGRlZmluaXRpb24gZm9yIHRoZSBuZXcgbWFjcm8gZW5hYmxlX3NoYXJlZAotCWludG8gZWFjaCBNYWtlZmlsZS4KLQotCSogY29uZmlnL21oLXNwYXJjcGljIChQSUNGTEFHKTogRGVmaW5lIHRvIHByb3Blcmx5IGFjY29yZGluZwotCXRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZy9tdC1zcGFyY3BpYyAoUElDRkxBR19GT1JfVEFSR0VUKTogRGVmaW5lIHRvIHByb3Blcmx5Ci0JYWNjb3JkaW5nIHRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQotVGh1IEZlYiAgNSAxNzowMToxMiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzLCBuYXRpdmVfb25seSk6IEFkZCBsaWJ0b29sLgotCi1XZWQgRmViICA0IDE2OjUzOjU4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHRhcmdldC1ncGVyZiB0byBub2NvbmZpZ2RpcnMgZm9yIEN5Z3dpbjMyLgotCUZpeCB0eXBvIGluIG1pbmcgY29uZmlnIGNvbW1lbnQuCi0KLVdlZCBGZWIgIDQgMTg6NTY6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGguCi0KLU1vbiBGZWIgIDIgMTk6Mzg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgdGljMzAgY2FzZXMsIGFuZCBtYXAgYzMwIHRvIHRpYzMwLgotCi1GcmkgSmFuIDMwIDE3OjE4OjMyIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFJlbW92ZSBleHBlY3QgZnJvbSBub2NvbmZpZ2RpcnMgd2hlbiB0YXJnZXQKLSAgICAgICAgaXMgY3lnd2luMzIuICBPSyB0byBidWlsZCBleHBlY3QgYW5kIGRlamFnbnUgd2l0aCBDYW5hZGlhbgotICAgICAgICBDcm9zcy4KLQotV2VkIEphbiAyOCAxMjo1ODo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZXhwZWN0LCBkZWphZ251LCBhbmQgY3Zzc3JjIGZvciBhIGN5Z3dpbjMyCi0JaG9zdC4KLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgJHtVTkFNRV9NQUNISU5FfSByYXRoZXIgdGhhbiBpMzg2IGZvciBjeWd3aW4zMgotCWFuZCBtaW5ndzMyLgotCi1XZWQgSmFuIDI4IDEwOjI2OjM3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBwYXNzaW5nICQobG9jYWxfcHJlZml4KQotCWhlcmUgYXMgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHRvcGxldmVsIE1ha2VmaWxlLgotCi1UdWUgSmFuIDI3IDIzOjI1OjA2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWcpOiBOZXcgdmFyaWFibGUsIHdoaWNoIG5hbWVzCi0JYSBmaWxlIHdpdGggZ2VuZXJpYyBydWxlcywgLi4uCi0JQ2hhbmdlIGNvbW1lbnQgdG8gbWVudGlvbiB3ZSBub3cgaGF2ZSBGSVZFIHBhcnRzLgotCSogY29uZmlndXJlOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1UdWUgSmFuIDI3IDIzOjE1OjU1IDE5OTggIExhc3NpIEEuIFR1dXJhICA8bGF0QGlraS5maT4KLQotCSogY29uZmlnLmd1ZXNzOiBNb3JlIGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgSFAgcHJvY2Vzc29yIHR5cGVzLgotCSogY29uZmlnLnN1YjogTW9yZSBhY2N1cmF0ZSBkZXRlcm1pbmF0aW9uIG9mIEhQIHByb2Nlc3NvciB0eXBlcy4KLQotU2F0IEphbiAyNCAwMTo1OTo0NSAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAocGFja2FnZV9tYWtlZmlsZV9mcmFnKTogTW92ZSBpbnNlcnRpbmcgdGhlCi0JJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IHRvIHdoZXJlIGl0IHNob3VsZCBiZSBhY2NvcmRpbmcKLQl0byB0aGUgY29tbWVudC4KLQotRnJpIEphbiAyMyAwMDozMDoyMSAxOTk4ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvQVJNLgotCi1UaHUgSmFuIDIyIDE1OjE0OjAxIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiAuY3ZzaWdub3JlOiBSZW1vdmUgKi1pbmZvIGFuZCAqLWluc3RhbGwgc2luY2UgdGhleSBtYXRjaAotCXJlbGVhc2UtaW5mbyBhbmQgbXB3LWluc3RhbGwsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8ganVzdCBpZ25vcmUuCi0KLVRodSBKYW4gMjIgMDE6Mzg6MzMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXZlcnQgMyBKYW4gY2hhbmdlIGZvciBhbHBoYS1saW51eC1nbnVsaWJjMS4KLQotU2F0IEphbiAxNyAyMToyODowOCAxOTk4ICBQaWV0ZXIgTmFnZWwgPHBuYWdlbEBlcGl1c2UuY28uemE+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGdjY19pbmNsdWRlX2RpciBhbmQKLQlsb2NhbF9wcmVmaXggdG8gc3ViLW1ha2UgaW52b2NhdGlvbnMuCi0KLVNhdCBKYW4gMTcgMjE6MDQ6NTkgMTk5OCBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgbWFrZWZpbGUgZnJhZ21lbnRzIGluIHRoZSBzb3VyY2UKLQlkaXJlY3RvcnkuCi0KLUZyaSBKYW4gMTYgMDA6NDE6MzcgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLQotCSogY29uZmlndXJlLmluOiBjaGVjayB3aGV0aGVyIGhvc3QgYW5kIHRhcmdldCBtYWtlZmlsZQotCWZyYWdtZW50cyBleGlzdCBiZWZvcmUgYWRkaW5nIHRoZW0gdG8gKl9tYWtlZmlsZV9mcmFnCi0KLVdlZCBKYW4gMTQgMjM6Mzk6MTAgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NvbmZpZ2RpcnMpOiBBZGQgY3lnbW9uIGZvciBzcGFyYzY0LWVsZi4KLQkKLVdlZCBKYW4gMTQgMTI6NDg6MDcgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgd2Ugb25seSByZXBsYWNlIFJQQVRIX0VOVlZBUiBvbgotCWxpbmVzIHdoaWNoIGJlZ2luIHdpdGggUlBBVEhfRU5WVkFSLCBpLmUuIGFkZCAiXiIgdG8gdGhlCi0JcmVnZXhwIHRvIHNlZC4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgUlJQQVRIX0VOVlZBUiBkb3duCi0JdG8gc3ViLW1ha2VzLgotCi0xOTk4LTAxLTEzICBMZWUgSXZlcnNvbiAgIChsZWVpQGFpLnNyaS5jb20pCi0KLQkqIGNvbmZpZy1tbC5pbiAobXVsdGktZG8pOiBMREZMQUdTIG11c3QgaW5jbHVkZSBtdWx0aWxpYgotCWRlc2lnbmF0b3IuCi0KLVR1ZSBKYW4gMTMgMDE6MTM6MjQgMTk5OCAgIFJvYmVydCBMaXBlIChyb2JlcnRsQGRnaWkuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpWzM0NTZdLWk1ODYtVW5peFdhcmU3LXN5c3Y1LgotCi1TdW4gSmFuICA0IDAxOjA2OjU1IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuc3ViOiBBZGQgbWluZ3czMiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIG1oLW1pbmd3MzI6IE5ldyBmaWxlLgotCi1TYXQgSmFuICAzIDEyOjExOjA1IDE5OTggRnJhbnogU2lybCA8ZnJhbnouc2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRmluYWxpemUgc3VwcG9ydCBmb3Ige2FscGhhfHBvd2VycGN9Ki0qLWxpbnV4LWdudWxpYmMxCi0KLVN1biBEZWMgMjggMTE6Mjg6NTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9UQVJHRVQpOiBEbyBpbnN0YWxsLWdjYyBmaXJzdC4KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogUHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIHN1YmRpcnMKLQl3aGljaCBkbyBub3QgdXNlIGF1dG9jb25mLgotCi1XZWQgRGVjIDI0IDIyOjQ2OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBTeW5jIHdpdGggZWdjcy4gIFBpY2tzIHVwIG5ldyBhbHBoYSBzdXBwb3J0LAotCUJlT1MgJiBzb21lIGFkZGl0aW9uYWwgbGludXggc3VwcG9ydC4KLQotVHVlIERlYyAyMyAxMjo0NTo1MCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogSFAgOTAwMC84MDMgaXMgYSBQQTEuMSBtYWNoaW5lLgotCi0KLVN1biBEZWMgMjEgMTY6NTM6MTIgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnLCB0YXJnZXRfbWFrZWZpbGVfZnJhZyk6Ci0gICAgICAgIEhhbmRsZSBtdWx0aXBsZSBjb25maWcgZmlsZXMuCi0gICAgICAgIChhbHBoYS0qLWxpbnV4Kik6IFRyZWF0IGFscGhhLSotbGludXgqIGFzIGFscGhhLSotbGludXgqIGFuZAotICAgICAgICBhbHBoYS0qLSouCi0KLVRodSBEZWMgMTggMTM6MTM6MDMgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWtkZXA6IE5ldyBmaWxlLgotCi1XZWQgRGVjIDE3IDA5OjUzOjAyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKi0qKTogQWxsb3cgY29uZmlndXJpbmcgb2YgbGliaWRlLCB2bWFrZSwgZXRjLgotCi1UdWUgRGVjIDE2IDE3OjM2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBsaWJndWkgZGlyZWN0b3J5LgotCShHREJfVEspOiBBZGQgYWxsLWxpYmd1aS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpYmd1aSBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IEFkZCBhbGwtbGliZ3VpIHRvIEdEQl9USy4KLQotTW9uIERlYyAxNSAxNjoxMjoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKG11bHRpZGlycyk6IEFkZCBtMzJyIHRvIG11bHRpbGliIGxpc3QuCi0KLUZyaSBEZWMgMTIgMTA6NDM6MzEgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWdwZXJmKTogQ2hhbmdlIGRlcGVuZGVuY3kgdG8KLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotVGh1IERlYyAxMSAyMzozMDo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgQmVPUyBzdXBwb3J0LgotCi1XZWQgRGVjIDEwIDE1OjEwOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNvdXJjZSBkaXJlY3RvcnkgY3ZzIHJlbmFtZWQgdG8gY3Zzc3JjOgotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQ2hhbmdlIGN2cyB0byBjdnNzcmMuCi0JKG5hdGl2ZV9vbmx5KTogTGlrZXdpc2UuCi0JKG5vY29uZmlnZGlycykgW3ZhcmlvdXMgY2FzZXNdOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IENoYW5nZSBhbGwtY3ZzIHRvIGFsbC1jdnNzcmMuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBDaGFuZ2UgY2hlY2stY3ZzIHRvIGNoZWNrLWN2c3NyYy4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQ2hhbmdlIGluc3RhbGwtY3ZzIHRvIGluc3RhbGwtY3Zzc3JjLgotCShDTEVBTl9NT0RVTEVTKTogQ2hhbmdlIGNsZWFuLWN2cyB0byBjbGVhbi1jdnNzcmMuCi0JKGFsbC1jdnNzcmMpOiBSZW5hbWUgdGFyZ2V0IGZyb20gYWxsLWN2cy4KLQotV2VkIERlYyAgMyAwNzo1NTo1OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogRml4IHRoaW5rby4KLQotVHVlIERlYyAgMiAxMDo1NTozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVF9DUk9TUyk6IERlZmluZS4KLQkoaW5zdGFsbC1jcm9zcywgaW5zdGFsbC1nY2MtY3Jvc3MpOiBOZXcgdGFyZ2V0cy4KLQotVHVlIERlYyAgMiAxMDowODozMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotU3VuIE5vdiAzMCAxNjoxMjoyNyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlcyBmb3IgY3lnbW9uLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGN5Z21vbiBmb3Igc3BhcmMtZWxmIGFuZCBzcGFyY2xpdGUtYW91dC4KLQotVGh1IE5vdiAyNyAwMTozMTozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IERvIGluc3RhbGwtZ2NjIGZpcnN0LgotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBQcm92aWRlIGEgZGVmaW5pdGlvbiBmb3Igc3ViZGlycwotCXdoaWNoIGRvIG5vdCB1c2UgYXV0b2NvbmYuCi0KLVdlZCBOb3YgMjYgMTE6NTM6MzMgMTk5NyAgS2VpdGggU2VpdHogIDxrZWl0aHNAb25pb25zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgQ2hhbmdlTG9nOiBtZXJnZSB3aXRoIGZvdW5kcnkncwotCTExLzE4Lzk3IGJ1aWxkIAotCi1XZWQgTm92IDI2IDE2OjA4OjUwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogRnJvbSBGcmFueiBTaXJsLgotCSogY29uZmlnLmd1ZXNzIChwb3dlcnBjKi0qLWxpbnV4KTogSGFuZGxlIGdsaWJjMiBiZXRhIHJlbGVhc2UKLQlmb3VuZCBvbiBSZWRIYXQgTGludXggc3lzdGVtcy4KLQotRnJpIE5vdiAyMSAwOTo1MTowMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoYWxwaGEgc3R1ZmYpOiBNZXJnZSB3aXRoIEZTRiB0byBhdm9pZCBpbmNvcnJlY3QKLQlndWVzc2VzLgotCi1UaHUgTm92IDEzIDExOjM4OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtbmNyLXN5c3Y0LjMqKTogVHdlYWsuCi0KLU1vbiBOb3YgMTAgMTU6MjM6MjEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbHRtYWluLnNoOiBJZiBta2RpciBmYWlscywgY2hlY2sgd2hldGhlciB0aGUgZGlyZWN0b3J5IHdhcyBjcmVhdGVkCi0JYW55aG93IGJ5IHNvbWUgb3RoZXIgcHJvY2Vzcy4KLQotTW9uIE5vdiAxMCAxNDozODowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBhbGwgZGlyZWN0b3JpZXMuCi0KLVN1biBOb3YgIDkgMTc6MzY6MjAgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgbmV3bGliLCBsaWJpYmVydHkgZGlyZWN0b3JpZXMKLQlmb3IgdGhlIEQzMFYuCi0KLVNhdCBOb3YgIDggMTQ6NDI6NTkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgdGFyZ2V0LWxpYmdsb3NzIG9uIHRoZSBEMzBWLgotCi1GcmkgTm92ICA3IDEwOjM0OjA5IDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGluY2x1ZGUvbGliaWJlcnR5Lmg6IEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3Jtcy4KLSAgICAgICAgKiBpbmNsdWRlL3JlbW90ZS1zaW0uaDogIEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3JhbXMuCi0KLVRodSBPY3QgMzAgMTE6MDk6MjkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgR0NDIG5vdy4KLQotTW9uIE9jdCAyNyAxMzoxNzoyNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGEgInNlY29uZCBwYXNzIiBvZiB0d2Vha2luZyBub2NvbmZpZ2RpcnMsCi0JaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotTW9uIE9jdCAyNyAxMjowMzo1MyAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBjaGVjay10YXJnZXQtbGliaW8gZGVwZW5kcyBvbiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotU3VuIE9jdCAyNiAxMTo0ODoyNyAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgKG1hbmZyZWRAcy1kaXJla3RuZXQuZGUpCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAtbGVhbik6IENvbWJpbmVkIHdpdGggYG5vcm1hbCcgYm9vdHN0cmFwCi0JdGFyZ2V0cyB1c2luZyAiJEAiIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3Igc2ltaWxhciBidXQgbm90IGlkZW50aWNhbAotCXRhcmdldHMgd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIGNvZGUuCi0KLU1vbiBPY3QgMjAgMTU6Mjg6NDkgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRml4IHRvIHdvcmsgd2l0aCBERUMgQy4KLQotVHVlIE9jdCAgNyAyMzo1ODo1NyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1pcHMtdHgzOS1lbGYgdG8gbWFya2V0aW5nIG5hbWVzLgotCi1UdWUgT2N0ICA3IDE0OjI0OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBIYW5kbGUgc3ltbGlua3MgaW4gZ2VuZXJhdGVkIHNjcmlwdC4KLQotV2VkIE9jdCAgMSAxMzoxMToyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIGF1dG9jb25mIHN0eWxlIGRpcmVjdG9yeSBvcHRpb25zOiAtLWJpbmRpciwKLQktLWRhdGFkaXIsIC0taW5jbHVkZWRpciwgLS1pbmZvZGlyLCAtLWxpYmRpciwgLS1saWJleGVjZGlyLAotCS0tbWFuZGlyLCAtLW9sZGluY2x1ZGVkaXIsIC0tc2JpbmRpciwgLS1zaGFyZWRzdGF0ZWRpciwKLQktLXN5c2NvbmZkaXIuCi0JKiBNYWtlZmlsZS5pbiAoc2JpbmRpciwgbGliZXhlY2Rpciwgc3lzY29uZmRpcik6IE5ldyB2YXJpYWJsZXMuCi0JKHNoYXJlZHN0YXRlZGlyLCBsb2NhbHN0YXRlZGlyLCBvbGRpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGJpbmRpciwgZGF0YWRpciwgaW5jbHVkZWRpciwKLQlpbmZvZGlyLCBsaWJkaXIsIGxpYmV4ZWNkaXIsIGxvY2Fsc3RhdGVkaXIsIG1hbmRpciwgb2xkaW5jbHVkZWRpciwKLQlzYmluZGlyLCBzaGFyZWRzdGF0ZWRpciwgYW5kIHN5c2NvbmZkaXIuCi0KLU1vbiBTZXAgMjkgMDA6Mzg6MDggMTk5NyBBYXJvbiBKYWNrc29uIDxqYWNrc29uQG5lZ3JpbC5tc3JjZS5ob3dhcmQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwLWxlYW4pOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDI0IDE4OjA2OjI3IDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYpOiAgUmVtb3ZlIHRjbCwgdGssIGV4cGVjdCwgZ2RiLCBpdGNsLCB0aXgsIGRiLAotIAlzbiwgYW5kIGdudXNlcnYgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVdlZCBTZXAgMjQgMTU6MTg6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IFR3ZWFrIHNoZWxsIHBhdHRlcm4gdG8gYXZvaWQgYnVnIGluIE5ldEJTRCAvYmluL3NoLgotCi1UaHUgU2VwIDE4IDIzOjU4OjI3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotKiBNYWtlZmlsZS5pbiAoY3Jvc3MpOiBOZXcgdGFyZ2V0LgotCi1UaHUgU2VwIDE4IDIxOjQzOjIzIDE5OTcgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCQkJICBKZWZmIExhdyAgICAgICAgIDxsYXdAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBOZXcgdGFyZ2V0cy4KLQkoYWxsLWJvb3RzdHJhcCk6IFJlbW92ZSBvdXRkYXRlZCBhbmQgY29uZnVzaW5nIHRhcmdldC4KLQkoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogRG9uJ3QgcGFzcyBCT09UX0NGTEFHUyBkb3duLgotCi0KLTE5OTctMDktMTUgMDI6MzcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtbGludXg6IERlZmluZSBDWFhGTEFHUyB0byBtYWtlIHN1cmUgLWZ2dGFibGUtdGh1bmtzIGlzCi0JdXNlZC4KLQkqIGNvbmZpZ3VyZS5pbjogTmFtZSBMaW51eCB0YXJnZXQgZnJhZ21lbnQuCi0KLQkqIGNvbmZpZ3VyZTogUmV3cml0ZSBzbyB0aGF0IHByb2plY3QgTWFrZWZpbGUgZnJhZ21lbnQgaXMgaW5zZXJ0ZWQKLQlmaXJzdCBhbmQgYXBwZWFycyBsYXN0IGluIHRoZSByZXN1bHRpbmcgTWFrZWZpbGUuCi0KLVR1ZSBTZXAgMTYgMDk6NTU6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pdGNsKTogSW5zdGFsbCB0Y2wgZmlyc3QuCi0KLVN1biBTZXAgMTQgMjA6NTM6NDIgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWN5Z3dpbjMyOiBvayB0byBidWlsZCBzcGxpdCB0ZXhpbmZvIGZpbGVzCi0KLUZyaSBTZXAgMTIgMTY6MTk6MjAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQkKLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIGJpc29uIGZyb20gbm9jb25maWdkaXJzIGZvciBDeWd3aW4zMiBob3N0Ci0KLVRodSBTZXAgMTEgMTY6NDA6NDYgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6IEFsc28gcmVtb3ZlIG1oLWZyYWcgbXQtZnJhZy4KLQotCSogY29uZmlndXJlLmluIChza2lwZGlycyk6IEFkZCB0YXJnZXQtbGlicnggZm9yIExpbnV4LgotCShhbHBoYS0qLWxpbnV4Kik6IFVzZSBjb25maWcvbWgtZWxmYWxwaGFwaWMgYW5kIGNvbmZpZy9tdC1lbGZhbHBoYXBpYy4KLQotV2VkIFNlcCAxMCAyMToyOTo1NCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXApOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDEwIDE1OjE5OjIyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0ICdhbWlnYWRvcycgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkuCi0KLU1vbiBTZXAgIDggMjA6NDY6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggRlNGLgotCi1TdW4gU2VwICA3IDE1OjU1OjI4IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgIm1hcmtldGluZy1uYW1lcyIgcGF0Y2guCi0KLUZyaSBTZXAgIDUgMTY6MTE6MjggMTk5NyAgSm9lbCBTaGVycmlsbCAgKGpvZWxAT0FSY29ycC5jb20pCi0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKCotKi1ydGVtcyopOiBEbyBub3QgYnVpbGQgbGliZ2xvc3MgZm9yIHJ0ZW1zLgotCi1GcmkgU2VwICA1IDEyOjI3OjE3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogSGFuZGxlIHY4NTAtZWxmLgotCi1XZWQgU2VwICAzIDEyOjE1OjI0IDE5OTcgIENocmlzIFByb3Zlbnphbm8gIDxwcm92ZW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IFNldCBDT05GSUdfU0hFTEwgaW4gbGlidG9vbC4KLQkqIGx0bWFpbi5zaDogVXNlIENPTkZJR19TSEVMTCBpbnN0ZWFkIG9mIC9iaW4vc2gKLQotTW9uIFNlcCAgMSAxNjo0NTo0NCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byBsaWJyYXJpZXMgaWYgZW5hYmxlX211bHRpbGliLgotCi1XZWQgQXVnIDI3IDE2OjE1OjExIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBVcGRhdGUgZnJvbSBnY2MgZGlyZWN0b3J5LgotCi1UdWUgQXVnIDI2IDE2OjQ2OjQ2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1zaW0pOiBEZXBlbmRzIG9uIGFsbC1yZWFkbGluZS4KLQotV2VkIEF1ZyAyMCAxOTo1NzozNyAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTiwgWUFDQyk6IFVzZSAkJHMuCi0JKGFsbC1iaXNvbik6IERlcGVuZCBvbiBhbGwtdGV4aW5mby4KLQotVHVlIEF1ZyAxOSAwMTo0MTozMiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IEFkZCAtTCBmbGFnLgotCShZQUNDKTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMTggMTE6MzA6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LiAKLQkKLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMTozMDo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LiAKLQkKLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMDk6MjQ6MDYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBtaXBzdHgzOS4gIERlbGV0ZSByMzkwMC4KLQotTW9uIEF1ZyAxOCAxNzoyMDoxMCAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWF1dG9jb25mKTogRGVwZW5kcyBvbiBhbGwtdGV4aW5mby4KLQotRnJpIEF1ZyAxNSAyMzowOToyNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluICh7cG93ZXJwYyxyczYwMDB9Ki0qLSopOiBVcGRhdGUgdG8gY3VycmVudCBBSVggYW5kCi0JZWFiaSB0YXJnZXRzLgotCi1UaHUgQXVnIDE0IDE0OjQyOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBHZXQgQ0ZMQUdTIGFuZCBDWFhGTEFHUyBmcm9tIE1ha2VmaWxlLCBpZiBwb3NzaWJsZS4KLQotCSogY29uZmlndXJlOiBXaGVuIGhhbmRsaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIGhhbmRsZSBZQUNDIGFzIHdlbGwgYXMKLQlCSVNPTi4gIEp1c3Qgc2V0IEJJU09OIHRvIGJpc29uLiAgV2hlbiBzZXR0aW5nIFlBQ0MsIHByZWZlciBiaXNvbi4KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoYWxsLWJpc29uKTogRGVwZW5kIHVwb24gYWxsLXRleGluZm8uCi0KLVR1ZSBBdWcgMTIgMjA6MDk6NDggMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBiaXNvbiwgbm90IGJ5YWNjIG9yIGJpc29uIC15LgotCShZQUNDKTogYmlzb24gLXkgb3IgYnlhY2Mgb3IgeWFjYy4KLQkodmFyaW91cyk6IEFkZCAqLWJpc29uIGFzIGFwcHJvcHJpYXRlLgotCSh0YXopOiBObyBuZWVkIHRvIG1lc3Mgd2l0aCBCSVNPTiBhbnltb3JlLgotCi1UdWUgQXVnIDEyIDIyOjMzOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBPU1RZUEUgbWF0Y2hlcyAqd2luMzIqLCB0cnkgdG8gZmluZCBhIGdvb2QgdmFsdWUgZm9yCi0JQ09ORklHX1NIRUxMLgotCi1TdW4gQXVnIDEwIDE0OjQxOjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSBBTV9JTklUX0FVVE9NQUtFIGluCi0JY29uZmlndXJlLmluIGlmIGl0IGlzIHByZXNlbnQuCi0KLVNhdCBBdWcgIDkgMDA6NTg6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTERfRk9SX1RBUkdFVCk6IENoYW5nZSBsZC5uZXcgdG8gbGQtbmV3LgotCi1GcmkgQXVnICA4IDE2OjMwOjEzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBgYXJjJyBjcHUuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlnLW1sLmluOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAgNyAxMTowMjozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKElOU1RBTExfWDExX01PRFVMRVMpKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuCi0KLVdlZCBBdWcgIDYgMTY6Mjc6MjkgMTk5NyAgQ2hyaXMgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IENoYW5nZWQgc2VkIGRlbGltaXRlciBmcm9tICc6JyB0byAnfCcgd2hlbgotCWF0dGVtcHRpbmcgdG8gc3Vic3RpdHV0ZSAke2NvbmZpZ19zaGVsbH0gZm9yIFNIRUxMLiBPbgotCU5UICR7Y29uZmlnX3NoZWxsfSBtYXkgY29udGFpbiBhICc6JyBpbiBpdC4KLQotV2VkIEF1ZyAgNiAxMjoyOTowNSAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBGaXggZm9yIG5vbi1iYXNoIHNoZWxscy4KLQotV2VkIEF1ZyAgNiAwMDo0MjozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBU19GT1JfVEFSR0VUKTogQ2hhbmdlIGFzLm5ldyB0byBhcy1uZXcuCi0KLVR1ZSBBdWcgIDUgMTQ6MDg6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTk1fRk9SX1RBUkdFVCk6IENoYW5nZSBubS5uZXcgdG8gbm0tbmV3LgotCi0JKiB5bHdyYXA6IElmIHRoZSBwcm9ncmFtIGlzIGEgcmVsYXRpdmUgcGF0aCwgZm9yY2UgaXQgdG8gYmUKLQlhYnNvbHV0ZS4KLQotVHVlIEF1ZyAgNSAxMjoxMjo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAodG9vbGRpcik6IFNldCBCSVNPTiB0byBgYmlzb24gLXknIGFuZCBub3QganVzdCBiaXNvbi4KLQotTW9uIEF1ZyAgNCAyMjo1OTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogV2hlbiB3aW5zdXAvTWFrZWZpbGUgcHJlc2VudCwKLSAJY29ycmVjdGx5IHNwZWNpZnkgdGhlIHRhcmdldCBidWlsZCBkaXJlY3RvcnkgJChUQVJHRVRfU1VCRElSKS93aW5zdXAKLSAJZm9yIGxpYnJhcmllcy4KLQotTW9uIEF1ZyAgNCAxMjo0MDoyNCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBGaXggaGFuZGxpbmcgb2YgbWFjcm9zIHdpdGggdmFsdWVzCi0gCXNlcGFyYXRlZCBieSBzcGFjZXMuCi0KLVRodSBKdWwgMzEgMTk6NDk6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB5bHdyYXA6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEFkZCB5bHdyYXAuCi0KLQkqIGx0bWFpbi5zaDogSGFuZGxlIC9iaW4vc2ggYXQgc3RhcnQgb2YgaW5zdGFsbCBwcm9ncmFtLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGx0Y29uZmlnLCBsdG1haW4uc2gsIGFuZCBtaXNzaW5nLgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBOZXcgZmlsZXMsIGZyb20gbGlidG9vbCAxLjAuCi0JKiBtaXNzaW5nOiBOZXcgZmlsZSwgZnJvbSBhdXRvbWFrZSAxLjIuCi0KLVRodSBKdWwgMjQgMTI6NTc6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVHJlYXQgdGl4IGxpa2UgdGssIHB1dHRpbmcgaXQgaW4gWDExX01PRFVMRVMuICBBZGQKLQljaGVjay10ayB0byBDSEVDS19YMTFfTU9EVUxFUy4KLQotV2VkIEp1bCAyMyAxNzowMzoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgotCi1UdWUgSnVsIDIyIDE5OjA4OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIEZTRi4KLQotVHVlIEp1bCAyMiAxNDo1MDo0MiAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGNvbmZpZ3VyZTogVHJlYXQgbXNkb3NkamdwcCBsaWtlIGdvMzIuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLiAgRG9uJ3QgcmVtb3ZlIGdwcm9mIGZvciBnbzMyLgotCi0JKiBjb25maWd1cmU6IENoYW5nZSBNYWtlZmlsZS50ZW0yIHRvIE1ha2VmaWxlLnRtMi4KLQotTW9uIEp1bCAyMSAxMDozMToyNiAxOTk3ICBTdGVwaGVuIFBldGVycyAgPHNwZXRlcnNAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBGb3IgYWxwaGEtZGVjLW9zZiosIGRvbid0IGlnbm9yZSBncmVwLgotCi1UdWUgSnVsIDE1IDE0OjMzOjAzIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogaW5zdGFsbC1zaCAoY2htb2RjbWQpOiBTZXQgdG8gbnVsbCBpZiB0aGUgRFNUIGRpcmVjdG9yeSBhbHJlYWR5Ci0JZXhpc3RzLiAgU2FtZSBhcyBOb3YgMTF0aCBjaGFuZ2UuCi0KLU1vbiBKdWwgMTQgMTE6MDE6MTUgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoR0RCX1RLKTogTmVlZHMgaXRjbCBhbmQgdGl4LiAKLQotTW9uIEp1bCAxNCAwMDozMjoxMCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogVXBkYXRlIGZyb20gRlNGLgotCi1GcmkgSnVsIDExIDExOjU3OjExIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoR0RCX1RLKTogRGVwZW5kIG9uIGl0Y2wgYW5kIHRpeC4KLQotRnJpIEp1bCAgNCAxMzoyNTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1BST0dSQU1fQVJHUyk6IE5ldyB2YXJpYWJsZS4KLQkoSU5TVEFMTF9QUk9HUkFNKTogVXNlICQoSU5TVEFMTF9QUk9HUkFNX0FSR1MpLgotCShJTlNUQUxMX1NDUklQVCk6IE5ldyB2YXJpYWJsZS4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIElOU1RBTExfU0NSSVBULgotCSogY29uZmlndXJlLmluOiBJZiBob3N0IGlzICotKi1jeWd3aW4zMiosIHNldCBJTlNUQUxMX1BST0dSQU1fQVJHUwotCXRvIC14LgotCSogaW5zdGFsbC1zaDogQWRkIHN1cHBvcnQgZm9yIC14IG9wdGlvbi4KLQotTW9uIEp1biAzMCAxNTo1MTozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IFRyZWF0IHRpeCBsaWtlIGl0Y2wuCi0KLVRodSBKdW4gMjYgMTM6NTk6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoV0lORFJFUyk6IE5ldyB2YXJpYWJsZS4KLQkoV0lORFJFU19GT1JfVEFSR0VUKTogTmV3IHZhcmlhYmxlLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBBZGQgV0lORFJFU19GT1JfVEFSR0VULgotCShFWFRSQV9IT1NUX0ZMQUdTKTogQWRkIFdJTkRSRVMuCi0JKEVYVFJBX1RBUkdFVF9GTEFHUyk6IEFkZCBXSU5EUkVTLgotCShFWFRSQV9HQ0NfRkxBR1MpOiBBZGQgV0lORFJFUy4KLQkoJChET19YKSk6IFBhc3MgZG93biBXSU5EUkVTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBTZXQgV0lORFJFUyB3aGVuIGNvbmZpZ3VyaW5nLgotCSogY29uZmlndXJlOiBUcmVhdCBXSU5EUkVTIGxpa2UgRExMVE9PTCwgYW5kIFdJTkRSRVNfRk9SX1RBUkdFVCBsaWtlCi0JRExMVE9PTF9GT1JfVEFSR0VULgotCi1XZWQgSnVuIDI1IDE1OjAxOjI2IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgc2ltIGJlZm9yZSBnZGIgZm9yIHdpbjMyLXgtcHBjCi0KLVdlZCBKdW4gMjUgMTI6MTg6NTQgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JTW92ZSBncGVyZiBpbnRvIHRoZSB0b3BsZXZlbCwgZnJvbSBsaWJnKysuCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF90b29scyk6IEFkZCB0YXJnZXQtZ3BlcmYuCi0JKG5hdGl2ZV9vbmx5KTogQWRkIHRhcmdldC1ncGVyZi4KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWdwZXJmKTogTmV3IHRhcmdldCwgZGVwZW5kIG9uCi0JYWxsLXRhcmdldC1saWJnKysuCi0JKGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYpOiBFbXB0eSBydWxlLgotCShBTExfVEFSR0VUX01PRFVMRVMpOiBBZGQgYWxsLXRhcmdldC1ncGVyZi4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogQWRkIGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYuCi0JKENIRUNLX1RBUkdFVF9NT0RVTEVTKTogQWRkIGNoZWNrLXRhcmdldC1ncGVyZi4KLQkoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBpbnN0YWxsLXRhcmdldC1ncGVyZi4KLQkoQ0xFQU5fVEFSR0VUX01PRFVMRVMpOiBBZGQgY2xlYW4tdGFyZ2V0LWdwZXJmLgotCi1Nb24gSnVuIDIzIDEwOjUxOjUzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLSAKLQkqIGNvbmZpZy5zdWIgKG1uMTAyMDApOiBSZWNvZ25pemUgbmV3IGJhc2ljIG1hY2hpbmUuCi0KLVRodSBKdW4gMTkgMTQ6MTY6NDIgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBFTkFCTEVfTVVMVElMSUIsIHNvIHdlJ2xsIGJlIHBhc3NpbmcKLQktLWVuYWJsZS1tdWx0aWxpYiBkb3duIHRvIHN1YmRpcnM7IHNldHRpbmcgVEFSR0VUX1NVQkRJUiB3YXMgZW5vdWdoLgotCi1UdWUgSnVuIDE3IDE1OjMxOjIwIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiB3ZSdyZSBidWlsZGluZyBtaXBzLXNnaS1pcml4NiogbmF0aXZlLCB0dXJuIG9uCi0JRU5BQkxFX01VTFRJTElCIGFuZCBzZXQgVEFSR0VUX1NVQkRJUi4KLQotVHVlIEp1biAxNyAxMjoyMDo1OSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtc24pOiBEZXBlbmQgb24gYWxsLWdyZXAuCi0KLU1vbiBKdW4gMTYgMTE6MTE6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1wcGNwaWMgYW5kIG10LXBwY3BpYyBmb3IgcG93ZXJwYyotKiB0YXJnZXRzLgotCi0JKiBjb25maWd1cmU6IFNldCBDRkxBR1MgYW5kIENYWEZMQUdTLCBhbmQgc3Vic3RpdHV0ZSB0aGVtIGludG8KLQlNYWtlZmlsZS4gIEZyb20gSmVmZiBNYWtleSA8amVmZkBjdHMuY29tPi4KLQkqIE1ha2VmaWxlLmluOiBBZGQgY29tbWVudCBmb3IgQ0ZMQUdTIGFuZCBDWFhGTEFHUy4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RCSVNPTkZJTEVTKTogUmVtb3ZlLgotCSh0YXopOiBEb24ndCBmdXR6IHdpdGggRElTVEJJU09ORklMRVMuICBDaGFuZ2UgQklTT04gdG8gdXNlCi0JJChERUZBVUxUX1lBQ0MpLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGl0bCwgZGIsIHNuLCBldGMuLCB3aGVuIGJ1aWxkaW5nIGZvciBuYXRpdmUKLSAJY3lnd2luMzIuCi0KLQkqIE1ha2VmaWxlLmluIChMRCk6IE5ldyB2YXJpYWJsZS4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFBhc3MgZG93biBMRC4KLQkoJChET19YKSk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDE2IDExOjEwOjM1IDE5OTcgIFBoaWxpcCBCbHVuZGVsbCAgPFBoaWxpcC5CbHVuZGVsbEBwb2JveC5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlICQoU0hFTEwpIHdoZW4gZXhlY3V0aW5nIGluc3RhbGwtc2guCi0KLUZyaSBKdW4gMTMgMTA6MjI6NTYgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2FyZ3MpOiBTdHJpcCBvdXQgYW55IHN1cHBsaWVkIC0tYnVpbGQgYXJndW1lbnQKLSAJYmVmb3JlIGFkZGluZyBvdXIgb3duLiBBbHdheXMgYWRkIC0tYnVpbGQuCi0KLVRodSBKdW4gMTIgMjE6MTI6MjggMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2FyZ3MpOiBQYXNzIC0tYnVpbGQgaWYgd2UncmUgZG9pbmcKLQlhIGNyb3NzLWNvbXBpbGUuCi0KLUZyaSBKdW4gIDYgMjE6Mzg6NDAgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBVc2UgJ3wnIGluc3RlYWQgb2YgIjoiIGFzIHRoZSBzZXBlcmF0b3IgaW4KLQlzZWQuIE90aGVyd2lzZSBzZWQgY2hva2VzIG9uIE5UIHBhdGggbmFtZXMgd2l0aCBkcml2ZQotCWRlc2lnbmF0b3JzLiBBbHNvIGxvb2sgZm9yICI/OioiIGFzIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgaW4gYW4KLQlhYnNvbHV0ZSBwYXRobmFtZS4KLQotTW9uIEp1biAgMiAxMzowNToyMCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogU3VwcG9ydCBmb3IgcjM5MDAuCi0KLVdlZCBNYXkgMjEgMTc6MzM6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBpbnN0YWxsLXNoLCBub3QgaW5zdGFsbC5zaC4KLQotV2VkIE1heSAxNCAxNjowNjo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBJbXByb3ZlIGNoZWNrIGZvciBCSVNPTiBzbyBpdCBkb2Vzbid0IHRyeSB0bwotCWFwcGx5IGl0IHR3aWNlLgotCi1GcmkgTWF5ICA5IDE3OjIyOjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTU9EVUxFUyk6IFB1dCBpbnN0YWxsLW9wY29kZXMgYmVmb3JlCi0JaW5zdGFsbC1iaW51dGlscy4KLQotVGh1IE1heSAgOCAxNzoyOTo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYXV0b21ha2UgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZCBhdXRvbWFrZS4KLQotVHVlIE1heSAgNiAxNTo0OTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmYXVsdCBDWFggdG8gYysrLCBub3QgZ2NjLgotCSogTWFrZWZpbGUuaW4gKENYWCk6IFNldCB0byBjKyssIG5vdCBnY2MuCi0JKENYWF9GT1JfVEFSR0VUKTogV2hlbiBjcm9zcywgdHJhbnNmb3JtIGMrKywgbm90IGdjYy4KLQotVGh1IE1heSAgMSAxMDoxMTo0MyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLXNoOiB0cnkgYXBwZW5kaW5nIGEgLmV4ZSBpZiBzb3VyY2UgZmlsZSBkb2Vzbid0Ci0JZXhpc3QKLQotV2VkIEFwciAzMCAxMjowNTozNiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVHVybiBvbiBtdWx0aWxpYiBieSBkZWZhdWx0LgotCShjcm9zc19vbmx5KTogUmVtb3ZlIHRhcmdldC1saWJpYmVydHkuCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogRG9uJ3QgZGVwZW5kIG9uIGxpYmliZXJ0eS4KLQotTW9uIEFwciAyOCAxODozOTo0NSAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IGltcHJvdmUgYWxnb3JpdGhtIGZvciByZWNvZ25pemluZyBHbnUgSHVyZCB4ODYuCi0KLVRodSBBcHIgMjQgMTk6MzA6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIG1wdy1pbnN0YWxsLgotCShESVNUQklTT05GSUxFUyk6IEFkZCBsZC9NYWtlZmlsZS5pbgotCi1UdWUgQXByIDIyIDE3OjE3OjI4IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaWYgdGFyZ2V0IGlzIGN5Z3dpbjMyIGJ1dCBob3N0IGlzbid0IGN5Z3dpbjMyLAotCWRvbid0IGNvbmZpZ3VyZSBnZGIgdGNsIHRrIGV4cGVjdCwgbm90IGp1c3QgZ2RiLgotCi1Nb24gQXByIDIxIDEzOjMzOjM5IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBnbnVzZXJ2IGV2ZXJ5d2hlcmUgc24gYXBwZWFycy4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWdudXNlcnYuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1nbnVzZXJ2LgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWdudXNlcnYuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1nbnVzZXJ2LgotCShhbGwtZ251c2Vydik6IE5ldyB0YXJnZXQuCi0KLVRodSBBcHIgMTcgMTM6NTc6MDYgMTk5NyAgUGVyIEZvZ2Vsc3Ryb20gIDxwZWZvQG9wZW5ic2Qub3JnPgotCi0JKiBjb25maWcuZ3Vlc3M6IEZpeGVzIGZvciBNSVBTIE9wZW5CU0Qgc3lzdGVtcy4KLQotVHVlIEFwciAxNSAxMjoyMTowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogUmVtb3ZlLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgSU5TVEFMTF9YRk9STS4KLQotCSogbWtpbnN0YWxsZGlyczogTmV3IGZpbGUsIGNvcGllZCBmcm9tIGF1dG9tYWtlLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxkaXJzKTogUmVuYW1lIGZyb20gaW5zdGFsbC1kaXJzLiAgVXNlCi0JbWtpbnN0YWxsZGlycy4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKERFVk9fU1VQUE9SVCk6IEFkZCBta2luc3RhbGxkaXJzLgotCi1Nb24gQXByIDE0IDExOjIxOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW5zdGFsbC1zaDogUmVuYW1lIGZyb20gaW5zdGFsbC5zaC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQkoREVWT19TVVBQT1JUKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZTogVXNlICR7Y29uZmlnX3NoZWxsfSB3aXRoICR7bW92ZWlmY2hhbmdlfS4gIEZyb20gVGhvbWFzCi0JR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+LgotCi1GcmkgQXByIDExIDE2OjM3OjEwIDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIE9wZW5CU0Qgc3lzdGVtcyBjb3JyZWN0bHkuCi0KLUZyaSBBcHIgMTEgMTc6MDc6MDQgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogUkVBRE1FLCBNYWtlZmlsZS5pbiAoRVRDX1NVUFBPUlQpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bwotCWNmZy1wYXBlciosIGNvbmZpZ3VyZS57dGV4aSxtYW4saW5mbyp9Ll8KLQotU3VuIEFwciAgNiAxODo0Nzo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC5ub3JtYWwpOiBFbnN1cmUgdGhhdCBnY2MgaXMgYnVpbHQgYWZ0ZXIgYWxsCi0JdGhlIHgxMSAtIGllIGdkYiAtIHRhcmdldHMuCi0KLVR1ZSBBcHIgIDEgMTY6Mjg6NTAgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRG9uJ3QgcnVuIGNvbmYtYS1nYXMuCi0KLU1vbiBNYXIgMzEgMTY6MjY6NTUgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGhwcGExLjEtKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KLQotU3VuIE1hciAzMCAxMjozODoyNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbm9jb25maWdkaXJzIGNhc2Ugc2luY2UgZ2RiIGFsc28KLQljb25maWd1cmVzIGFuZCBidWlsZHMgZm9yIHRpYzgwLWNvZmYuCi0KLUZyaSBNYXIgMjggMTg6Mjg6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBjYWNoZV9maWxlIHRvIGNvbmZpZy5jYWNoZS4KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1kaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi1XZWQgTWFyIDI2IDE4OjQ5OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1XZWQgTWFyIDI2IDEwOjM4OjI1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFJlbW92ZSBHKysgbGlicmFyaWVzIGFuZCBsaWJnbG9zcyBmcm9tCi0Jbm9jb25maWdkaXJzLgotCi1Nb24gTWFyIDI0IDE1OjAyOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGlycyk6IERvbid0IGNyYXNoIGlmIHByZWZpeCwgYW5kIGhlbmNlCi0JTUFLRURJUlMsIGlzIGVtcHR5LgotCi1Nb24gTWFyIDI0IDEyOjQwOjU1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFR3ZWFrIG1uMTAzMDAgZW50cnkuCi0KLUZyaSBNYXIgMjEgMTU6MzU6MjcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IFB1dCBzaW0gYmVmb3JlIGdkYiwgc28gZ2RiJ3MKLQljb25maWd1cmUudGd0IGNhbiBkZXRlcm1pbmUgaWYgdGhlIHNpbXVsYXRvciB3YXMgY29uZmlndXJlZC4KLQotU3VuIE1hciAxNiAxNjowNzowOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTW92ZSBCZU9TICRvcyBjYXNlIHRvIGJlIHdpdGggb3RoZXIgQ3lnbnVzCi0JbG9jYWwgY2FzZXMuCi0KLVN1biBNYXIgMTYgMDE6MzQ6NTUgMTk5NyAgTWFydGluIEh1bnQgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVtb3ZlIG1pc3BsYWNlZCBjb21tZW50IHRoYXQgYnJva2UgTGludXguCi0KLVNhdCBNYXIgMTUgMjI6NTA6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBCZU9TIHN1cHBvcnQuCi0KLU1vbiBNYXIgMTAgMTM6MzA6MTEgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tfWDExX01PRFVMRVMpOiBEb24ndCBydW4gY2hlY2stdGsuCi0KLVdlZCBNYXIgIDUgMTI6MDk6MjkgMTk5NyAgTWFydGluICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZSB0Y2wgYW5kIHRrIGZyb20KLQlub2NvbmZpZ2RpcnMgZm9yIGN5Z3dpbjMyIGJ1aWxkcy4KLQotRnJpIEZlYiAyOCAxODoyMDoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBSZW1vdmUgbGQgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVRodSBGZWIgMjcgMTQ6NTc6MjYgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChHQVNfU1VQUE9SVF9ESVJTLCBCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBSZW1vdmUKLQltYWtlLWFsbC5jb20sIHVzZSBtYWtlZmlsZS52bXMgaW5zdGVhZC4KLQotVHVlIEZlYiAyNSAxODo0NjoxNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtbG5ld3MqLgotCi1UdWUgRmViIDI1IDEzOjE5OjE0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIHRhcmdldC1uZXdsaWIsCi0gCXRhcmdldC1leGFtcGxlcyBhbmQgdGFyZ2V0LWxpYmliZXJ0eSBmb3IgZDMwdi4KLQotRnJpIEZlYiAyMSAxNzo1NjoyNSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBFbmFibGUgbGQgZm9yIGQzMHYuCi0KLUZyaSBGZWIgMjEgMjA6NTg6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogQnVpbGQgY29tcGlsZXIuCi0KLVN1biBGZWIgMTYgMTU6NDE6MDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKik6IFJlbW92ZSBzaW0gZGlyZWN0b3J5IGZyb20gbGlzdCBvZgotIAl1bnN1cHBvcnRlZCBkMzB2IGRpcmVjdG9yaWVzCi0KLVR1ZSBGZWIgMTggMTc6MzI6NDIgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbjogQWRkIGQzMHYgdGFyZ2V0IGNwdS4gCi0JCi1UaHUgRmViIDEzIDIyOjA0OjQ0IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCSogbWFrZS1hbGwuY29tOiBSZW1vdmUuCi0KLVdlZCBGZWIgMTIgMTI6NTQ6MTggMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogQWRkIExJQkdDQzJfREVCVUdfQ0ZMQUdTLgotCi1TYXQgRmViICA4IDIwOjM2OjQ5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWl0Y2wpOiBUaGUgcnVsZSBpcyBhbGwtaXRjbCwgbm90IGFsbC10Y2wuCi0KLVR1ZSBGZWIgIDQgMTE6Mzk6MjkgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtZGIuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlYyBjaGVjay1kYi4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1kYi4KLQkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLWRiLgotCi1Nb24gRmViICAzIDEzOjI5OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotVHVlIEphbiAyOCAwOToyMDozNyAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1pdGNsLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2staXRjbC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1pdGNsLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4taXRjbC4KLQotVGh1IEphbiAyMyAwMTo0NDoyNyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGJ1aWxkIGdkYiBmb3IgbW4xMDIwMAotCi1GcmkgSmFuIDE3IDE1OjMyOjE1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LXdpbnN1cCk6IERlcGVuZCBvbiBhbGwtdGFyZ2V0LWxpYmlvLgotCi1Nb24gSmFuIDEzIDIyOjQ2OjU0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBUdXJuIG9mZiBtb3N0IHRhcmdldHMgcmlnaHQgbm93LgotCi1GcmkgSmFuICAzIDE2OjA0OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1BS0VJTkZPKTogQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIE1ha2VmaWxlLAotCXJhdGhlciB0aGFuIHRoZSBtYWtlaW5mbyBwcm9ncmFtLgotCShkby1pbmZvKTogRGVwZW5kIHVwb24gYWxsLXRleGluZm8uCi0KLVR1ZSBEZWMgMzEgMTY6MDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSB1c2VzIG9mIGNvbmZpZy9taC1saW51eC4KLQotCSogY29uZmlnLnN1YiwgY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotRnJpIERlYyAyNyAyMzowNDozMyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoY2FzZSAkYmFzaWNfbWFjaGluZSk6IEFkZCB0aWM4MCBlbnRyaWVzLgotCi1GcmkgRGVjIDI3IDEyOjA3OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotV2VkIERlYyAxOCAyMjo0NjozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1idWlsZC5pbjogQnVpbGQgbGQgYmVmb3JlIGdjYywgdXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZS4KLQkqIG1wdy1jb25maWcuaW46IFRlc3QgZm9yIE5ld0ZvbGRlclJlY3Vyc2l2ZS4KLQkqIG1wdy1pbnN0YWxsOiBVc2Ugc3ltYm9saWMgbmFtZSBmb3Igc3RhcnR1cCBmaWxlbmFtZS4KLQkqIG1wdy1SRUFETUU6IEFkZCB2YXJpb3VzIGFkZGl0aW9uYWwgZGV0YWlscy4KLQotV2VkIERlYyAxOCAxMzoxMTo0NiAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6IFJlbW92ZSBiaW51dGlscyBmcm9tIG5vY29uZmlnZGlycy4KLQotV2VkIERlYyAxOCAxMDoyOTozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZ2NjIGFuZCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBmb3IKLQl0aGUgbW4xMDIwMC4KLQotV2VkIERlYyAgNCAxNjo1MzowNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGF2b2lkIGJ1aWxkaW5nIGdkYiBmb3IgbW4xMDMwMCBhbnkgbW9yZQotCSogTWFrZWZpbGUuaW46IGRvdWJsZS1xdW90ZSBHQ0NfRk9SX1RBUkdFVCBsaW5lIGluIEVYVFJBX0dDQ19GTEFHUwotCWluc3RlYWQgb2Ygc2luZ2xlLXF1b3RpbmcgaXQuCi0KLVR1ZSBEZWMgIDMgMjM6MjY6NTAgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSAtLXdpdGgtc3RhYnMgb24gSVJJWCA2LgotCi1UdWUgRGVjICAzIDA5OjA1OjI1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTMycik6IEJ1aWxkIGdkYiwgbGliZysrIG5vdy4KLQotU3VuIERlYyAgMSAwMDoxODo1OSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6ICBSZW1vdmUgZ2RiIGFuZCByZWxhdGVkCi0JZGlyZWN0b3JpZXMgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVR1ZSBOb3YgMjYgMTE6NDU6MzMgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGJhc2ljX21hY2hpbmUpOiBhZGRlZCBtaXBzMTYgY29uZmlndXJhdGlvbgotCi1TYXQgTm92IDIzIDE5OjI2OjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogSGFuZGxlIGQxMHYtdW5rbm93bi4KLQotU2F0IE5vdiAyMyAxMDoyMzowMSAxOTk2ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogSGFuZGxlIHY4NTAtdW5rbm93bi4KLQotVGh1IE5vdiAyMSAxNjoxOTo0NCAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGZpbmR1dGlscwotCSogY29uZmlndXJlLmluOiBhZGQgZmluZHV0aWxzIHRvIGxpc3Qgb2YgaG9zdF90b29scwotCi1XZWQgTm92IDIwIDEwOjA5OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogSGFuZGxlIG1uMTAyMDAgYW5kIG1uMTAzMDAuCi0KLVR1ZSBOb3YgMTkgMTY6MzU6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKik6IERvIG5vdCBidWlsZCBsaWJyeC4KLQotTW9uIE5vdiAxOCAxMzoyODo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobW4xMDMwMCk6IEJ1aWxkIGV2ZXJ5dGhpbmcgZXhjZXB0IGdkYiAmIGxpYmdsb3NzLgotCi1XZWQgTm92IDEzIDE0OjU5OjQ2IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBQYXRjaCBmb3IgRGFuc2sgRGF0YSBFbGVrdHJvbmlrIHNlcnZlcnMsCi0JZnJvbSBOaWVscyBTa291IE9sc2VuIDxuc29AZGRlLmRrPi4KLQotCUZvciBuY3IsIHVzZSAvYmluL3VuYW1lIHJhdGhlciB0aGFuIHVuYW1lLCBzaW5jZSBHTlUgdW5hbWUgZG9lcyBub3QKLQlzdXBwb3J0IC1wLiAgU3VnZ2VzdGVkIGJ5IE1hcmsgTWl0Y2hlbGwgPG1taXRjaGVsbEB1c2EubmV0Pi4KLQotCVBhdGNoIGZvciBNSVBTIFI0MDAwIHJ1bm5pbmcgU3lzdGVtIFYsCi0JZnJvbSBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4uCi0KLQlGaXggdGhpbmtvIGZvciBuZXh0c3RlcC4KLQotCVBhdGNoIGZvciBPU0YxIGluIGk/ODYsIGZyb20gRGFuIE11cnBoeSA8ZGxtQG9zZi5vcmc+IHZpYSBIYXJsYW4gU3Rlbm4uCi0KLQlTYXQgSnVuIDI0IDE4OjU4OjE3IDE5OTUgIE1vcnRlbiBXZWxpbmRlciAgPHRlcnJhK0Bjcy5jbXUuZWR1PgotCSogY29uZmlnLmd1ZXNzOiBHdWVzcyBtaXBzLWRlYy1tYWNoX2JzZDQuMy4KLQotCVRodSBPY3QgMTAgMDQ6MDc6MDQgMTk5NiAgSGFybGFuIFN0ZW5uIDxoYXJsYW5AcGZjcy5jb20+Ci0JKiBjb25maWcuZ3Vlc3MgKGk/ODYtbmNyLXN5c3YqKTogIEVtaXQganVzdCBlbm91Z2ggb2YgdGhlIG1pbm9yCi0JcmVsZWFzZSBudW1iZXJzLgotCSogY29uZmlnLmd1ZXNzIChtaXBzLW1pcHMtcmlzY29zKik6ICBFbWl0IGp1c3QgZW5vdWdoIG9mIHRoZQotCXJlbGVhc2UgbnVtYmVyLgotCi0JVHVlIE9jdCAgOCAxMDozNzoyMiAxOTk2ICBGcmFuayBWYW5jZSA8ZnZhbmNlQHdhaWkuY29tPgotCSogY29uZmlnLmd1ZXNzIChzcGFyYy1hdXNwZXgtc3Vub3MqKTogIEFkZGVkLgotCShmMzAwLWZ1aml0c3UtKik6IEFkZGVkLgotCi0JV2VkIFNlcCAyNSAyMjowMDozNSAxOTk2ICBKZWZmIFdvb2xzZXkgPHdvb2xzZXlAamx3LmNvbT4KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBhIFRhZHBvbGUgYXMgYSBzcGFyYy4KLQotV2VkIE5vdiAxMyAwMDo1MzowOSAxOTk2ICBEYXZpZCBKLiBNYWNLZW56aWUgIDxkam1AY2h1cmNoeS5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiBEb24ndCBhc3N1bWUgdGhhdCBOZXh0U3RlcCB2ZXJzaW9uIGlzIGVpdGhlciAyIG9yCi0JMy4gIE5leHRTdGVwIDQgKGFrYSBPcGVuU3RlcCA0KSBoYXMgY29tZSBvdXQgbm93LgotCi1Nb24gTm92IDExIDIzOjUyOjAzIDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBjaHVyY2h5LmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3M6IFN1cHBvcnQgQ3JheSBUOTAgdGhhdCByZXBvcnRzIGl0c2VsZiBhcyAiQ1JBWSBUUyIuCi0JRnJvbSBSaWsgRmFpdGggPGZhaXRoQGNzLnVuYy5lZHU+LgotCi1GcmkgTm92ICA4IDExOjM0OjU4IDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBnZWVjaC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLnN1YjogQ29udHJpYnV0aW9ucyBmcm9tIGJ1Zy1nbnUtdXRpbHMgdG86Ci0JU3VwcG9ydCBwbGFpbiAiaHBwYSIgKG5vIHZlcnNpb24gZ2l2ZW4pIGFyY2hpdGVjdHVyZSwgcmVwb3J0ZWQgYnkKLQlPcGVuU3RlcC4KLQlPcGVuQlNEIGxpa2UgTmV0QlNELgotCUx5bnhPcyBpcyBub3QgYSBoYXJkd2FyZSBzdXBwbGllci4KLQotCSogY29uZmlnLmd1ZXNzOiBDb250cmlidXRpb25zIGZyb20gYnVnLWdudS11dGlscyB0byBhZGQgc3VwcG9ydCBmb3I6Ci0gCU9wZW5CU0QgbGlrZSBOZXRCU0QuCi0JU3RyYXR1cyBzeXN0ZW1zLgotCU1vcmUgUHlyYW1pZCBzeXN0ZW1zLgotCWlbbj40XTg2IEludGVsIGNoaXBzLgotCU02ODBbbj40XTAgTW90b3JvbGEgY2hpcHMuCi0JVXNlIHVua25vd24gaW5zdGVhZCBvZiBseW54IGZvciBoYXJkd2FyZSBtYW51ZmFjdHVyZXIuCi0KLU1vbiBOb3YgMTEgMTA6MDk6MDggMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLnNoIChjaG1vZGNtZCk6IFNldCB0byBudWxsIGlmIHRoZSBEU1QgZGlyZWN0b3J5IGFscmVhZHkKLQlleGlzdHMuCi0KLU1vbiBOb3YgMTEgMTA6NDM6NDEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLXtlYWJpLGVsZixsaW51eCxydGVtLHN5c3Ysc29sYXJpc30qKTogRG8KLQlub3QgdXNlIG10LXBwYyB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnQgYW55IG1vcmUuCi0KLVN1biBOb3YgIDMgMTk6MTc6MDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotd2luZG93cyk6ICBFeGNsdWRlIGV2ZXJ5dGhpbmcgYnV0IHRob3NlIGRpcnMKLQluZWVkZWQgdG8gYnVpbGQgd2luZG93cy4KLQotVHVlIE9jdCAyOSAxNjo0MTozMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC13aW5zdXApOiBEZXBlbmQgb24gYWxsLXRhcmdldC1saWJyeC4KLQotTW9uIE9jdCAyOCAxNzozMjo0NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBFeGNsdWRlIG1tYWxsb2MgZnJvbSBpMzg2LXdpbmRvd3MuCi0JKiBjb25maWcvbWgtd2luZG93czogIEFkZCBydWxlcyBmb3IgYnVpbGRpbmcgTVNWQyBtYWtlZmlsZXMuCi0KLVRodSBPY3QgMjQgMDk6MjI6NDYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogVW5kbyBteSBwcmV2aW91cyBjaGFuZ2UuCi0KLVRodSBPY3QgMjQgMTI6MTI6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogUGFzcyBkb3duIEdDQ19GT1JfVEFSR0VUCi0JdW5jb25kaXRpb25hbGx5LgotCShNQUtFT1ZFUlJJREVTKTogRGVmaW5lIChyZXZlcnQgdGhpcyBwYXJ0IG9mIE9jdG9iZXIgMTggY2hhbmdlKS4KLQotVGh1IE9jdCAyNCAwOTowMjowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBBZGQgJChIT1NUX0ZMQUdTKSB0byBhbGxvdyB0aGUKLQlob3N0IHRvIGFkZCBpdCdzIG93biBmbGFncy4KLQkqIGNvbmZpZy9taC13aW5kb3dzIChIT1NUX0ZMQUdTKTogIFNldCBzcmNyb290LCB3aGljaCBpcyBuZWVkZWQKLQlmb3IgTVNWQyBidWlsZCBwcm9jZWR1cmUuCi0KLVR1ZSBPY3QgMjIgMTU6MjA6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEhhbmRsZSBHQ0NfRk9SX1RBUkdFVCBsaWtlIENDX0ZPUl9UQVJHRVQuCi0KLUZyaSBPY3QgMTggMTM6Mzc6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IENoZWNrIGZvciB4Z2NjLCBub3QgTWFrZWZpbGUuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0JKEdDQ19GT1JfVEFSR0VUKTogRGVmaW5lLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgR0NDX0ZPUl9UQVJHRVQuCi0JKEVYVFJBX0dDQ19GTEFHUyk6IERlZmluZSBHQ0NfRk9SX1RBUkdFVCBiYXNlZCBvbiB3aGV0aGVyCi0JQ0NfRk9SX1RBUkdFVCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0JKE1BS0VPVkVSUklERVMpOiBEb24ndCBkZWZpbmUuCi0KLVRodSBPY3QgMTcgMTA6Mjc6NTYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtMzJyKTogRml4IHNwZWxsaW5nIG9mIGxpYmcrKyBsaWJzLgotCi1UaHUgT2N0IDEwIDEwOjM3OjE3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoLWFwcGxlKik6IFJlbW92ZSwgbm93IHJlZHVuZGFudC4KLQotVGh1IE9jdCAxMCAxMjozMDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IENQVS1WRU5ET1ItbGludXgtZ251LgotCi0JKiBjb25maWd1cmU6IFJld29yayB5ZXN0ZXJkYXkncyBzZWQgc2NyaXB0IHBhdGNoLgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIEZTRi4KLQotV2VkIE9jdCAgOSAxNzoyNDo1OSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0YuCi0KLQkxOTk2LTA5LTEyICBSaWNoYXJkIFN0YWxsbWFuICA8cm1zQGV0aGFub2wuZ251LmFpLm1pdC5lZHU+Ci0gICAgICAgICogY29uZmlnLmd1ZXNzOiBVc2UgcGMgaW5zdGVhZCBvZiB1bmtub3duLCBmb3IgcGMgY2xvbmUgc3lzdGVtcy4KLSAgICAgICAgQ2hhbmdlIGxpbnV4IHRvIGxpbnV4LWdudS4KLQotCU1vbiBKdWwgMTUgMjM6NTE6MTEgMTk5NiAgS2FybCBIZXVlciAgPGt3emhAZ251LmFpLm1pdC5lZHU+Ci0gICAgICAgICogY29uZmlnLmd1ZXNzOiBBdm9pZCBub24tcG9ydGFibGUgdHIgc3ludGF4LgotCi1XZWQgT2N0ICA5IDA2OjA2OjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGQgInhhcmdzIiBmb3IgZ2RiLgotCi0JKiBjb25maWd1cmU6IEF2b2lkIGhwdXgxMC4yMCBzZWQgYnVnLgotCi1UdWUgT2N0ICA4IDA4OjMyOjQ4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiBjb25maWcvbWgtd2luZG93czogIEFkZCBzdXBwb3J0IGZvciB3aW5kb3dzIGhvc3QKLQkodGhhdCBpcyBhIGJ1aWxkIGRvbmUgdW5kZXIgdGhlIE1pY3Jvc29mdCBidWlsZCBlbnZpcm9ubWVudCkuCi0KLVR1ZSBPY3QgIDggMTA6Mzk6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSBhbGwgdXNlcyBvZiBzcmNyb290IHdpdGggcywgdG8gc2hyaW5rCi0JY29tbWFuZCBsaW5lIGxlbmd0aHMuCi0KLQlQYXRjaGVzIGZyb20gR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbjogSWYgY29uZmlndXJpbmcgZm9yIG5ld2xpYiwgcGFzcyAtLXdpdGgtbmV3bGliIHRvCi0Jc3ViZGlyZWN0b3JpZXMuCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IElmIHdpbnN1cC9NYWtlZmlsZSBleGlzdHMsIHBhc3MgYQotCS1CbmV3bGliLyBhbmQgLUx3aW5zdXAgdG8gZ2NjLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICA3IDEwOjU5OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVUQ19TVVBQT1JUKTogQWRkIGNvbmZpZ3VyZS4KLQotRnJpIE9jdCAgNCAxMjoyMjo1OCAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgY29uZmlnL21oLWRndXgzODYgZm9yIGlbMzQ1XTg2LWRnLWRndXggCi0JaG9zdCBjb25maWd1cmF0aW9uIGZpbGUuCi0KLVRodSBPY3QgIDMgMDk6Mjg6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJyZWFrIG1uMTB4MDAgc3VwcG9ydCBpbnRvIHNlcGFyYXRlCi0JbW4xMDIwMCBhbmQgbW4xMDMwMCBjb25maWd1cmF0aW9ucy4KLQkqIGNvbmZpZy5zdWI6IExpa2V3aXNlLgotCi1XZWQgT2N0ICAyIDIyOjI3OjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgbG90cyBvZiBzdHVmZiB0byBub2NvbmZpZ2RpcnMgZm9yCi0JdGhlIG1uMTB4MDAgdGFyZ2V0cy4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgbW4xMHgwMCBzdXBwb3J0LgotCi1XZWQgT2N0ICAyIDE1OjUyOjM2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlLWFsbC5jb206IENhbGwgY29uZi1hLWdhcywgbm90IGNvbmZpZy1hLWdhcy4KLQotVHVlIE9jdCAgMSAwMToyODo0MSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgbGliZ2xvc3MgZm9yIGFybS1jb2ZmCi0gCXRhcmdldHMuCi0KLU1vbiBTZXAgMzAgMTQ6MjQ6MDEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctUkVBRE1FOiBBZGQgbXVjaCBtb3JlIGRldGFpbCBmb3IgbmF0aXZlIFBvd2VyTWFjLgotCSogbXB3LWluc3RhbGw6IE5ldyBmaWxlLgotCSogbXB3LWNvbmZpZ3VyZTogQWRkIC0tbm9yZWN1cnNpb24gYW5kIC0taGVscCBvcHRpb25zLgotCSogbXB3LWNvbmZpZy5pbjogVHJhbnNsYXRlIHJlYWRtZSBhbmQgaW5zdGFsbCBmaWxlcyB3aGVuCi0JY29weWluZyB0byBvYmpkaXIuCi0JKiBtcHctYnVpbGQuaW46IERvbid0IGFsd2F5cyBkZXBlbmQgb24gYnlhY2MgYW5kIGZsZXguCi0JKGluc3RhbGwtb25seS10b3ApOiBOZXcgYWN0aW9uLgotCi1GcmkgU2VwIDI3IDE3OjM5OjQ0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFlvdSBjYW4gbm93IGNvbmZpZ3VyZSBHREIgZm9yIHRoZSB2ODUwLgotCi1UdWUgU2VwIDI0IDE5OjA1OjEyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBjb25maWd1cmUgYW55IEMrKyBkaXJzCi0JaWYgdGFyZ2V0aW5nIEQxMFYuCi0KLVR1ZSBTZXAgMTcgMTI6MTU6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbWlwczY0dnI1MDAwLgotCi1Nb24gU2VwIDE2IDE3OjAwOjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgYSBzaW5nbGUgbGluZSBmb3IgaG9zdF90b29scyBhbmQgbmF0aXZlX29ubHkuCi0KLU1vbiBTZXAgIDkgMTI6MjE6MzAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgZW50cmllcyBmb3IgbTMyci4KLQotVGh1IFNlcCAgNSAxMzo1Mjo0NyAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5ldC1pbnN0YWxsKTogRG9uJ3QgcnVuIGluc3RhbGwtZ3ppcC4KLQotV2VkIFNlcCAgNCAxNzoyNjoxMyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBEb24ndCBjb25maWcgbG90cyBvZiB0aGluZ3MgZm9yICotKi13aW5kb3dzKi4KLQotU2F0IEF1ZyAzMSAxMTo0NTo1NyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFRlc3QgZm9yIG1wdy10cnVlLCB0cnVlLCBhbmQgbnVsbC1jb21tYW5kIHNjcmlwdHMuCi0JKGhvc3RfbGlicywgaG9zdF90b29scyk6IENvcHkgZnJvbSBjb25maWd1cmUuaW4uCi0JKiBtcHctY29uZmlndXJlOiBEb24ndCBjb21wbGFpbiBhYm91dCBkaXJlY3RvcmllcyBub3QgZm91bmQuCi0KLVRodSBBdWcgMjkgMTY6NDQ6NTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2KTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCShpWzM0NTZdODYtKi1kZ3V4Kik6IFVzZSBjb25maWcvbWgtc3lzdiBmb3IgdGhlIGhvc3QgY29uZmlndXJhdGlvbgotCWZpbGUuCi0KLQkqIGNvbmZpZy5ndWVzcyAoaVszNDVdODYpOiBEaXR0by4KLQotTW9uIEF1ZyAyNiAxODozNDo0MiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBSZW1vdmVkIGdkYiBmb3IgRDEwVi4KLQotVGh1IEF1ZyAyMiAxNzoxMzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxkLCB0YXJnZXQtbGliaW8sIHRhcmdldC1saWJnKyssIGFuZAotCXRhcmdldC1saWJzdGRjKysgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVdlZCBBdWcgMjEgMTg6NTY6MzggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRml4IHRocmVlIGxvY2F0aW9ucyB3aGVyZSBzaGVsbCBzY3JpcHRzIHdlcmUKLQliZWluZyBydW4gZGlyZWN0bHkgcmF0aGVyIHRoYW4gd2l0aCBjb25maWdfc2hlbGwuCi0KLVR1ZSBBdWcgMjAgMTM6MDg6NDcgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodjg1MC0qLSopOiBTZXQgdXAgaW5pdGlhbCAkbm9jb25maWdkaXJzLgotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IFJlY29nbml6ZSB2ODUwLgotCi1UaHUgQXVnIDE1IDEyOjE5OjMzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSGFuZGxlIG11bHRpcGxlIGVuYWJsZS9kaXNhYmxlIG9wdGlvbnMgYW5kCi0JcGFzcyB0aGVtIGRvd24gcmVjdXJzaXZlbHksIGhhbmRsZSAtYyBhbmQgLXMgZmxhZ3MgYXBwcm9wcmlhdGVseQotCWRlcGVuZGluZyBvbiBjaG9pY2Ugb2YgY29tcGlsZXIsIGFkZCBlc2NhcGUgbWVjaGFuaXNtIGZvcgotCXF1b3RlZCBhcmd1bWVudHMgdG8gZ0MuCi0KLU1vbiBBdWcgMTIgMTM6MTU6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLSotKik6IEZvciBlYWJpLCBzeXN0ZW0gVi40LCBMaW51eCwgYW5kCi0Jc29sYXJpcyB0YXJnZXRzLCB1c2UgY29uZmlnL210LXBwYyB0byBzZXQgQ3ssWFh9RkxBR1NfRk9SX1RBUkdFVFMKLQlzbyB0aGF0IC1tcmVsb2NhdGFibGUtbGliIGFuZCAtbW5vLWVhYmkgYXJlIHVzZWQuCi0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBJZiB0YXJnZXQgY29tcGlsZXIgZG9lcwotCW5vdCBzdXBwb3J0IC0tcHJpbnQtbXVsdGktbGliLCBkb24ndCBhYm9ydC4KLQotU3VuIEF1ZyAxMSAyMDo1MTo1MCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtY3lnd2luMzIgKENGTEFHUyk6ICBEZWZpbmUgX1dJTjMyIHRvIGJlIGNvbXBhdGlibGUKLQl3aXRoIG5vcm1hbCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgotCi1UaHUgQXVnICA4IDEyOjE4OjU5IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlLWFsbC5jb206IFJ1biBjb25maWctYS1nYXMuCi0JKiBzZXR1cC5jb206IERvbid0IGNvcHkgc3ViZGlyZWN0b3J5IGZpbGVzIGFyb3VuZC4KLQotVHVlIEp1bCAzMCAxNzo0OTozMSAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1vc2UpOiBSZW1vdmUgZXhjbHVzaW9uIG9mIGxpYmdsb3NzIGZvciB0aGlzCi0JdGFyZ2V0LCBpdCBub3cgY29tcGlsZXMgY29ycmVjdGx5LgotCi1TYXQgSnVsIDI3IDE1OjEwOjQzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogR2VuZXJhdGUgTWFjIGluY2x1ZGUgZm9yIGVsZi9kd2FyZjIuaC4KLQotVHVlIEp1bCAyMyAxMDo0NzowNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IFJlbW92ZSBsZCBmcm9tICRub2NvbmZpZ2RpcnMuIAotCi1Nb24gSnVsIDIyIDEzOjI4OjUxIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChuYXRpdmVfb25seSk6IEFkZCBwcm1zLgotCi1Nb24gSnVsIDIyIDEyOjI3OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMpOiBBZGQgbWFrZS1hbGwuY29tIGFuZCBzZXR1cC5jb20uCi0JKEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IExpa2V3aXNlLgotCi1UaHUgSnVsIDE4IDEyOjU1OjQwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IERvbid0IGNvbmZpZ3VyZSBsZCBvciBnZGIgdW50aWwgdGhlCi0JZDEwdiBzdXBwb3J0IGlzIGFkZGVkLgotCi1XZWQgSnVsIDE3IDE0OjMzOjA5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogTmV3IHRhcmdldC4KLQotTW9uIEp1bCAxNSAxMTo1MzowMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoSFAgOTAwMC84MTEpOiBSZWNvZ25pemUgdGhpcyBhcyBhIFBBMS4xCi0JbWFjaGluZS4KLQotRnJpIEp1bCAxMiAyMzoyMToxNyAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvLXRhci1neik6IE5ldyB0YXJnZXQsIHNwbGl0IG91dCBmcm9tIHRhaWwgZW5kIG9mCi0JdGF6IHRhcmdldC4gIFJ1biBlYWNoIGNvbW1hbmQgc2VwYXJhdGVseSwgZG9uJ3QgdXNlIHBpcGVzLgotCSh0YXopOiBVc2UgaXQuCi0KLUZyaSBKdWwgMTIgMTI6MDg6MDQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBMb29rIGZvciBnLW1wdy1tYWtlLnNlZCBpbiBjb25maWcvbXB3LgotCSogbXB3LWJ1aWxkLmluOiBObyBidWlsZHMgc2hvdWxkIGRlcGVuZCBvbiBidWlsZGluZyBieWFjYyBvciBmbGV4LAotCXRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgaW5zdGFsbGVkIGFscmVhZHkuCi0KLUZyaSBKdWwgMTIgMDk6NTI6NTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogU2V0IHIgZW52aXJvbm1lbnQKLQl2YXJpYWJsZSB0aGF0IENDX0ZPUl9UQVJHRVQgbmVlZHMuCi0KLVRodSBKdWwgMTEgMTA6MDk6NDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogRGV0ZXJtaW5lIGlmIHRoZSBtdWx0bGliCi0Jb3B0aW9ucyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgc3ViZGlyZWN0b3J5IHdhcwotCWNvbmZpZ3VyZWQsIGFuZCBpZiBpdCBoYXMsIHJlY29uZmlndXJlLgotCShDTEVBTl9UQVJHRVRfTU9EVUxFUyk6IERlbGV0ZSBtdWx0aWxpYi5vdXQgYW5kIHRtcG11bHRpLm91dCwgd2hpY2gKLQlDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMgdXNlcyB0byByZW1lbWJlciB0aGUgb2xkIG11bHRpbGliIG9wdGlvbnMuCi0KLVdlZCBKdWwgMTAgMTg6NTY6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTLENST1NTX0NIRUNLX01PRFVMRVMsSU5TVEFMTF9NT0RVTEVTLAotCUNMRUFOX01PRFVMRVMpOiBBZGQgYmFzaC4KLQkoYWxsLWJhc2gpOiBOZXcgdGFyZ2V0LgotCi1Nb24gSnVsICA4IDE3OjMzOjE0IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLXNnaS1pcml4NiopOiBVc2UgbWgtaXJpeDYgaW5zdGVhZCBvZiBtaC1pcml4NS4KLQotTW9uIEp1bCAgMSAxMzozMTozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGJhc2ljX21hY2hpbmUpOiBSZWNvZ25pemUgZDEwdiBhcyBhIHZhbGlkIHByb2Nlc3Nvci4KLQotRnJpIEp1biAyOCAxMjoxNDozNSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciAtLWJpbmRpci4KLQkqIG1wdy1idWlsZC5pbjogVXNlIGEgR0NDLXNwZWNpZmljIGJ1aWxkIHNjcmlwdCBmb3IgR0NDIGFjdGlvbnMuCi0KLVdlZCBKdW4gMjYgMTc6MjA6MTIgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgYmFzaCwgdGltZSwgZ2F3ayB0byBsaXN0IG9mIGhvc3R0b29scyBhbmQgdGhpbmdzCi0JdG8gb25seSBidWlsZCBmb3IgbmF0aXZlIHRvb2xjaGFpbnMKLQotVHVlIEp1biAyNSAyMzowOTowMyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZG9jZGlyKTogUmVtb3ZlLgotCi1UdWUgSnVuIDI1IDE5OjAwOjA4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogU2V0IHRvICQocHJlZml4KS9zaGFyZS4KLQotTW9uIEp1biAyNCAyMzoyNjowNyAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGJ1aWxkIGRpZmYgYW5kIHBhdGNoIGZvciBjeWd3aW4zMi1ob3N0ZWQKLQl0b29sY2hhaW5zLgotCi1Nb24gSnVuIDI0IDE1OjAxOjEyIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtcnRlbXMqLgotCi1TdW4gSnVuIDIzIDIyOjQxOjU0IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGVuYWJsZSBkb3NyZWwgZm9yIGN5Z3dpbjMyLWhvc3RlZCBidWlsZHMsCi0gICAgICAgICAgICAgICAgcmVtb3ZlIGRpZmYgZnJvbSB0aGUgbGlzdCBvZiB0aGluZ3Mgbm90IGJ1aWxkYWJsZQotICAgICAgICAgICAgICAgIHZpYSBDYW5hZGlhbiBDcm9zcwotCi1TYXQgSnVuIDIyIDExOjM5OjAxIDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9TVUJESVIpOiBNb3ZlIGNvbW1lbnQgdG8gcHJldmlvdXMgbGluZSBzbyB3ZQotIAlkb24ndCBnZXQgIi4gIi4KLQotRnJpIEp1biAyMSAxNzoyNDo0OCAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6IFNldCBub2NvbmZpZ2RpcnMgYXBwcm9wcmlhdGVseS4KLQotVGh1IEp1biAyMCAxNjo1Nzo0MCAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEhhbmRsZSBjYXNlIHdoZXJlIHRleDNwYXRjaCBkaWRuJ3QgZXZlbiBnZXQKLQljaGVja2VkIG91dC4gIEFsc28sIGlmIGl0IHdhcyBmb3VuZCwgcHV0IHRoZSBzeW1saW5rIGluIGEgbmV3IHV0aWwKLQlzdWJkaXJlY3RvcnkuCi0KLVRodSBKdW4gMjAgMTI6MjA6MzMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogQWRkIHN1cHBvcnQgZm9yIFBvd2VyUEMgTGludXguCi0KLVR1ZSBKdW4gMTggMTQ6MjQ6MTIgMTk5NiAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtb3BlbnZtcy4KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotKnZtcyopOiBTZXQgbm9jb25maWdkaXJzLgotCSogbWFrZS1hbGwuY29tLCBzZXR1cC5jb206IE5ldyBmaWxlcy4KLQotTW9uIEp1biAxNyAxNjozNDo0NiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiB0ZXgzcGF0Y2ggbW92ZWQgdG8gdGV4aW5mby91dGlsLgotCi1TYXQgSnVuIDE1IDE3OjEzOjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgbWFrZSBmcm9tIGRpc2FibGUtaWYtQ2FuLUNyb3NzIGxpc3QKLQkJZW5hYmxlIGdkYiBpZiAke2hvc3R9IGFuZCAke3RhcmdldH0gYXJlIGN5Z3dpbjMyCi0KLUZyaSBKdW4gIDcgMTg6MTY6NTIgMTk5NiAgSGFybGFuIFN0ZW5uIDxoYXJsYW5AcGZjcy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoaT84Ni1uY3Itc3lzdiopOiAgRW1pdCBtaW5vciByZWxlYXNlIG51bWJlcnMuCi0JUmVjb2duaXplIHRoZSBOQ1IgNDg1MCBtYWNoaW5lIGFuZCBOQ1IgUGVudGl1bS1iYXNlZCBwbGF0Zm9ybXMuCi0KLVdlZCBKdW4gIDUgMDA6MDk6MTcgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHdvbWJhdC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiAgQ29tYmluZSBtaXBzLW1pcHMtcmlzY29zIGNhc2VzLCBhbmQgdXNlIGNwcCB0bwotCWRpc3Rpbmd1aXNoIHN5c3Yvc3ZyNC9ic2QgdmFyaWFudHMuCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEhhcmxhbiBTdGVubiA8aGFybGFuQHBmY3MuY29tPi4KLQotRnJpIEp1biAgNyAxNDoyNDo0OSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGNvcHlyaWdodCBub3RpY2UuCi0JKiBtb3ZlLWlmLWNoYW5nZTogQWRkZWQgY29weXJpZ2h0IG5vdGljZS4KLQotVGh1IEp1biAgNiAxNjoyNzowNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlLSotc29sYXJpcyopOiBVbnRpbCB3ZSBnZXQgc2hhcmVkCi0JbGlicmFyaWVzIHdvcmtpbmcsIGRvbid0IGJ1aWxkIGdkYiwgc2ltLCBtYWtlLCB0Y2wsIHRrLCBvcgotCWV4cGVjdC4KLQotVHVlIEp1biAgNCAyMDo0MTo0NSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0Y6Ci0KLQlNb24gSnVuICAzIDA4OjQ5OjE0IDE5OTYgIEthcmwgSGV1ZXIgIDxrd3poQGdudS5haS5taXQuZWR1PgotCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IEFkZCBndWVzcyBmb3Igc3BhcmMtdW5rbm93bi1saW51eC4KLQotCUZyaSBNYXkgMjQgMTg6MzQ6NTMgMTk5NiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAZGVsYXN5ZC5nbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy5ndWVzcyAoQVZpaU9OOmRndXg6KjoqKTogRml4IHR5cG8gaW4gcmVjb2duaXppbmcgbWM4ODExMC4KLQotCUZyaSBBcHIgMTIgMjA6MDM6NTkgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHNwaWZmLmdudS5haS5taXQuZWR1PgotCSogY29uZmlnLmd1ZXNzOiAgQ29tYmluZSB0d28gT1NGMSBydWxlcy4KLQlBbHNvIHJlY29nbml6ZSBmaWVsZCB0ZXN0IHZlcnNpb25zLiAgRnJvbSBtanJAemszLmRlYy5jb20uCi0JKiBjb25maWcuZ3Vlc3MgKGRndXgpOiAgVXNlIC91c3IvYmluL3VuYW1lIHJhdGhlciB0aGFuIHVuYW1lLAotCWJlY2F1c2UgR05VIHVuYW1lIGRvZXMgbm90IHN1cHBvcnQgLXAuICBGcm9tIHBtckBwYWphdG8uY29tLgotCi1UdWUgSnVuICA0IDExOjA3OjI1IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRURJUlMpOiBSZW1vdmVkICQodG9vbGRpcikuCi0KLVR1ZSBNYXkgMjggMTI6MzA6NTAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctUkVBRE1FOiBEb2N1bWVudCBHQ0NJbmNsdWRlcy4KLQotU3VuIE1heSAyNiAxNToxNjoyNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLWxpbnV4Kik6IFNldCBlbmFibGVfc2hhcmVkIHRvIHllcy4KLQotVHVlIE1heSAyMSAxNTo0MTozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEhhbmRsZSAtLWVuYWJsZS1GT08gYW5kIC0tZGlzYWJsZS1GT08uCi0KLU1vbiBNYXkgMjAgMTA6MTI6MjkgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotY3lnd2luMzIpOiBDb25maWd1cmUgbWFrZS4KLQotVHVlIE1heSAgNyAxNDoxOTo0MiAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNudWZmbGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluZXQtaW5zdGFsbCk6IFF1b3RlIHZhbHVlIG9mIElOU1RBTExfTU9EVUxFUy4KLQotRnJpIE1heSAgMyAwODo1NzoxNyAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGxpc2EuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC1wZXJsLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5ldC1pbnN0YWxsKTogTmV3IHRhcmdldC4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC10Y2wuCi0JKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC1zZW5kLXByLgotCi1UdWUgQXByIDMwIDEzOjU1OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUtKi1zb2xhcmlzKik6IFR1cm4gb2ZmIHRrIGFuZCB0Y2wKLQl0ZW1wb3JhcmlseS4KLQotVGh1IEFwciAyNSAxMTo0ODoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIC0td2l0aC1nbnUtbGQgb24gQUlYLgotCi1UaHUgQXByIDI1IDA2OjMzOjM2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlLSotc29sYXJpcyopOiBUdXJuIG9mZiBnZGIgdGVtcG9yYXJpbHkuCi0KLVR1ZSBBcHIgMjMgMDk6MDc6MzkgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWluZXQuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1pbmV0LgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWluZXQuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1pbmV0LgotCShhbGwtaW5kZW50KTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkZWQgaW5ldC4KLQkobmF0aXZlX29ubHkpOiBBZGRlZCBpbmV0LgotCShub2NvbmZpZ2RpcnMpOiBBZGRlZCBpbmV0LgotCi1GcmkgQXByIDE5IDE1OjM1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGliZ2xvc3MgaWYgd2UgYXJlIG5vdCBjb25maWd1cmluZwotCW5ld2xpYi4KLQotV2VkIEFwciAxNyAxOTozMDowMSAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsaWJnbG9zcyBmb3IgdW5zdXBwb3J0ZWQKLQlhcmNoaXRlY3R1cmVzLgotCi1UdWUgQXByIDE2IDExOjE3OjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENMRUFOX01PRFVMRVMpOiBBZGQgY2xlYW4tYXBhY2hlLgotCi1Nb24gQXByIDE1IDE1OjA5OjA1IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEluY2x1ZGUgYWxsLWFwYWNoZS4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stYXBhY2hlLgotCShJTlNUQUxMX01PRFVMRVMpOiBJbmNsdWRlIGluc3RhbGwtYXBhY2hlLgotCShhbGwtYXBhY2hlKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBhcGFjaGUgZXZlcnl3aGVyZSBwZXJsIGlzIHNlZW4uCi0KLU1vbiBBcHIgMTUgMTQ6NTk6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHN1cHBvcnQgZm9yIGNsZWFuLXttb2R1bGV9IGFuZAotCWNsZWFuLXRhcmdldC17bW9kdWxlfSBydWxlcy4KLQotV2VkIEFwciAxMCAyMTozNzo0MSBQRFQgMTk5NiAgTWFyaWx5biBFLiBTYW5kZXIgPG1zYW5kZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotb3NlKSBkbyBub3QgYnVpbGQgbGliZ2xvc3MuCi0KLU1vbiBBcHIgIDggMTY6MTY6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKHByZXAqOlN1bk9TOjUuKjoqKTogVHVybiBpbnRvCi0JcG93ZXJwZWxlLXVua25vd24tc29sYXJpczIuCi0KLU1vbiBBcHIgIDggMTQ6NDU6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQotRnJpIEFwciAgNSAwODoxNzo1NyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1zb2xhcmlzKTogUGFzcyBvbmx5IHRoZSBmaXJzdCB3b3JkIG9mICRDQwotCXRvIC91c3IvYmluL3doaWNoIHdoZW4gY2hlY2tpbmcgaWYgd2UncmUgdXNpbmcgL3Vzci9jY3MvYmluL2NjLgotCi1GcmkgQXByICA1IDAzOjE2OjEzIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogcGFzcyBkb3duICQoTUFLRSkuCi0KLVRodSBNYXIgMjggMTQ6MTE6MTEgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogSW5jbHVkZSBhbGwtcGVybC4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stcGVybC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogSW5jbHVkZSBpbnN0YWxsLXBlcmwuCi0JKEFMTF9YMTFfTU9EVUxFUyk6IEluY2x1ZGUgYWxsLWd1aWxlLgotCShDSEVDS19YMTFfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stZ3VpbGUuCi0JKElOU1RBTExfWDExX01PRFVMRVMpOiBJbmNsdWRlIGluc3RhbGwtZ3VpbGUuCi0JKGFsbC1wZXJsKTogTmV3IHRhcmdldC4KLQkoYWxsLWd1aWxlKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogSW5jbHVkZSBwZXJsIGFuZCBndWlsZS4KLQkobmF0aXZlX29ubHkpOiBJbmNsdWRlIHBlcmwgYW5kIGd1aWxlLgotCShub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBndWlsZSBhbmQgcGVybDsgbm8gcG9ydHMgaGF2ZSBiZWVuCi0JZG9uZS4KLQotVHVlIE1hciAyNiAyMToxODo1MCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0gICAgICAgICogY29uZmlndXJlICgtLWVuYWJsZS0qKTogSGFuZGxlIHF1b3RlZCBvcHRpb24gbGlzdHMgc3VjaCBhcwotICAgICAgICAtLWVuYWJsZS1zaW0tY2ZsYWdzPSctZzAgLU8nIGJldHRlci4KLQotVGh1IE1hciAyMSAxMTo1MzowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh7LGluc3R9YWxsLXRhcmdldCk6IE5ldyBydWxlIHNvIHdlIGNhbiBtYWtlIGFuZAotCWluc3RhbGwgYWxsIG9mIHRoZSB0YXJnZXQgZGlyZWN0b3JpZXMgZWFzaWx5LgotCi1XZWQgTWFyIDIwIDE4OjEwOjU3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtaXNzaW5nIGdsb2JhbCBmbGFnIGluIHNlZCBzdWJzdGl0dXRpb24gd2hlbgotCWRlbGV0aW5nIGB0YXJnZXQtJyBmcm9tICR7Y29uZmlnZGlyc30uCi0KLVRodSBNYXIgMTQgMTk6MTU6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRE9fWCk6IERvbid0IGdldCBjb25mdXNlZCBpZiBDQyBjb250YWlucyBgPScgaW4gYW4KLQlvcHRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotbmVjLXN5c3ZyNCopOiBVc2UgYSBob3N0X21ha2VmaWxlX2ZyYWcgb2YKLQljb25maWcvbWgtbmVjdjQuCi0KLQkqIGluc3RhbGwuc2g6IENvcnJlY3QgbWlzc3BlbGxpbmcgb2YgdHJhbnNmb3JtYmFzZW5hbWUuCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG1pcHMtKi1zeXN2Ki4KLQotTW9uIE1hciAxMSAxNTozNjo0MiAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBtb245NjAuCi0KLVN1biBNYXIgMTAgMTM6MTg6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlc3RvcmUgQ2FuYWRpYW4gQ3Jvc3MgaGFuZGxpbmcgb2YgQklTT04gYW5kIExFWCwKLQlyZW1vdmVkIGluIEZlYiAyMCBjaGFuZ2UuCi0KLUZyaSBNYXIgIDggMjA6MDc6MDkgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogIFN1Z2dlc3Rpb25zIGZyb20gVG9yYmpvcm4gR3Jhbmx1bmQgPHRlZ2VAbWF0ZW1hdGlrLnN1LnNlPjoKLQlNZW50aW9uIG1ha2UgaW5zdGFsbC4gIFJlbW92ZSB0aGUgb2xkIGNvcHlyaWdodCBkYXRlIGFzIHdlbGwgdGhlCi0JY2x1bXN5IGFuZCByYXRoZXIgcG9pbnRsZXNzIGNvcHlyaWdodCBvbiB0aGUgUkVBRE1FIGZpbGUuCi0KLUZyaSBNYXIgIDggMTc6NTE6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogSWYgdGhlcmUgaXMgYQotCU1ha2VmaWxlIGFmdGVyIHJ1bm5pbmcgc3ltbGluay10cmVlLCB0aGVuIHJ1biBgbWFrZSBkaXN0Y2xlYW4nIHRvCi0JYXZvaWQgY2xvYmJlcmluZyBhbnkgZ2VuZXJhdGVkIGZpbGVzIGluIHNyY2Rpci4KLQotVHVlIE1hciAgNSAwODoyMTo0NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLW5ldGJzZCopOiBCdWlsZCBldmVyeXRoaW5nIG5vdy4KLQotV2VkIEZlYiAyOCAxMjoyNTo0NiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBGaXggcXVvdGluZy4KLQotVHVlIEZlYiAyNyAxMTozMzo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyY2xldC0qLSopOiBCdWlsZCBldmVyeXRoaW5nIG5vdy4KLQotVHVlIEZlYiAyNyAxNDozMTo1MSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotbGludXgqKTogTmV3IGhvc3QuCi0KLU1vbiBGZWIgMjYgMTQ6MzI6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IENoZWNrIGZvciBiaXNvbiBiZWZvcmUgYnlhY2MuCi0KLVR1ZSBGZWIgMjAgMjM6MTI6MzUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gY29uZmlndXJlOiAgQ2hhbmdlIHRoZSB3YXkgTEVYIGFuZCBCSVNPTi9ZQUNDIGFyZQotCXNldC4gIGNvbmZpZ3VyZSBub3cgZGVmaW5lcyBERUZBVUxUX0xFWCBhbmQgREVGQVVMVF9ZQUNDIGJ5Ci0Jc2VhcmNoaW5nIFBBVEguICBUaGVzZSBhcmUgdXNlZCBhcyBmYWxsYmFja3MgYnkgTWFrZWZpbGUuaW4gaWYKLQlmbGV4L2Jpc29uL2J5YWNjIGFyZW4ndCBpbiBvYmpkaXIuCi0KLU1vbiBGZWIgMTkgMTE6NDU6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSBldmVyeXRoaW5nIHdoaWNoIGRlcGVuZHMgdXBvbiBhbGwtYmZkIGFsc28KLQlkZXBlbmQgdXBvbiBhbGwtb3Bjb2RlcywgaW4gY2FzZSAtLXdpdGgtY29tbW9uYmZkbGliIGlzIHVzZWQuCi0KLVRodSBGZWIgMTUgMTk6NTA6NTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgKi0qLWN5Z3dpbjMyKTogRG9uJ3QgYnVpbGQgZ2RiIGlmIHdlIGFyZQotCWJ1aWxkaW5nIE5UIG5hdGl2ZSBjb21waWxlcnMgb24gVW5peC4KLQotVGh1IEZlYiAxNSAxNzo0MjoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgZ2V0IENDIGZyb20gdGhlIGhvc3QgTWFrZWZpbGUgZnJhZ21lbnQgaWYgd2UKLQljYW4gZmluZCBnY2MgaW4gUEFUSCwgb3IgaWYgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzLiAgTW92ZSB0aGUKLQlTb2xhcmlzIHRlc3QgZm9yIC91c3IvdWNiL2NjIHRvIHRoZSBwb3N0IHRhcmdldCBzY3JpcHQsIGp1c3QgYWZ0ZXIKLQl0aGUgY29tcGlsZXIgc2FuaXR5IHRlc3QuCi0KLVdlZCBGZWIgMTQgMTY6NTc6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIEZTRi4KLQotVHVlIEZlYiAxMyAxNDoyNzo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCi0JKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBVc2UgaXQuCi0JKiBjb25maWd1cmUuaW46IE9uIEhQL1VYLCBzZXQgUlBBVEhfRU5WVkFSIHRvIFNITElCX1BBVEguCi0KLU1vbiBGZWIgMTIgMTU6Mjg6NDkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIHNwYXJjbGV0IGNwdS4KLQotTW9uIEZlYiAxMiAxNTozMzo1OSAxOTk2ICBDaHJpc3RpYW4gQmF1ZXJuZmVpbmQgPGNocmlzYmZkQHRoZW9yaWUzLnBoeXNpay51bmktZXJsYW5nZW4uZGU+Ci0KLQkqIGNvbmZpZy5ndWVzczogIFN1cHBvcnQgbTY4ay1jYm0tc3lzdjQuCi0KLVNhdCBGZWIgMTAgMTI6MDY6NDIgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBHdWVzcyBtNjhrLXVua25vd24tbGludXggYW5kCi0JbTY4ay11bmtub3duLWxpbnV4YW91dCBmcm9tIGxpbmtlciBoZWxwIHN0cmluZy4gIFB1dCBxdW90ZXMgYXJvdW5kCi0JJGxkX2hlbHBfc3RyaW5nLgotCi1UaHUgRGVjICA3IDA5OjAzOjI0IDE5OTUgIFRvbSBIb3JzbGV5ICA8VG9tLkhvcnNsZXlAbWFpbC5oY3NjLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgpOiBBZGQgZ3Vlc3MgZm9yIHBvcnQKLQl0byBuZXcgdGFyZ2V0LgotCi1UaHUgRmViICA4IDE1OjM3OjUyIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChVTkFNRV9WRVJTSU9OKTogUmVjb2duaXplIFg0LnggYXMgYW4gT1NGIHZlcnNpb24uCi0KLU1vbiBGZWIgIDUgMTY6MzY6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIC0tZW5hYmxlLXNoYXJlZCB3YXMgdXNlZCwgc2V0IFNFVF9MSUJfUEFUSCB0bwotCSQoUkVBTExZX1NFVF9MSUJfUEFUSCkgaW4gTWFrZWZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoU0VUX0xJQl9QQVRIKTogTmV3IHZhcmlhYmxlLgotCShSRUFMTFlfU0VUX0xJQl9QQVRIKTogTmV3IHZhcmlhYmxlLgotCSgkKERPX1gpKTogVXNlICQoU0VUX0xJQl9QQVRIKS4KLQkoaW5zdGFsbC5hbGwsIGdjYy1uby1maXhlZGluY2x1ZGVzLCAkKEFMTF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKE5BVElWRV9DSEVDS19NT0RVTEVTKSwgJChDUk9TU19DSEVDS19NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKElOU1RBTExfTU9EVUxFUyksICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKEFMTF9UQVJHRVRfTU9EVUxFUyksICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpKTogTGlrZXdpc2UuCi0JKCQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyksICQoQUxMX1gxMV9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKENIRUNLX1gxMV9NT0RVTEVTKSwgJChJTlNUQUxMX1gxMV9NT0RVTEVTKSk6IExpa2V3aXNlLgotCShhbGwtZ2NjLCBhbGwtYm9vdHN0cmFwLCBjaGVjay1nY2MsIGluc3RhbGwtZ2NjKTogTGlrZXdpc2UuCi0JKGluc3RhbGwtZG9zcmVsKTogTGlrZXdpc2UuCi0JKGFsbC1vcGNvZGVzKTogRGVwZW5kIHVwb24gYWxsLWxpYmliZXJ0eS4KLQotU3VuIEZlYiAgNCAxNjo1MToxMSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKCo6Q1lHV0lOKik6IE5ldwotCi1TYXQgRmViICAzIDEwOjQyOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtd2luc3VwKTogQWxsIGFsbC10YXJnZXQtbGliaWJlcnR5LgotCi1GcmkgRmViICAyIDE3OjU4OjU2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgbWlzc2luZyAjIGluIGZyb250IG9mIGNvbW1lbnQuCi0KLVRodSBGZWIgIDEgMTQ6Mzg6MTMgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgc2Vjb25kIHBhc3MgdG8gdGhpbmdzIGFkZGVkIHRvIG5vY29uZmlnZGlycwotCXNvICotZ20tbWFnaWMgY2FuIGV4Y2x1ZGUgbGliZ2xvc3MgcHJvcGVybHkuCi0KLVRodSBGZWIgIDEgMTE6MTA6MTYgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlIChleHRyYWxpYnNfbmFtZSwgcmV6X25hbWUpOiBTZXQgY29ycmVjdGx5Ci0JZm9yIE1XQzY4SyBjb21waWxlci4KLQotCSogbXB3LVJFQURNRTogQWRkIG1vcmUgaW5mbyBvbiB0aGUgbmVjZXNzYXJ5IGJ1aWxkIHRvb2xzLgotCi1UaHUgRmViICAxIDEwOjIyOjM4IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLnN1YjogUmVjb2duaXplIGN5Z3dpbjMyLgotCi1XZWQgSmFuIDMxIDE0OjE3OjEwIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBBL1VYLgotCi1XZWQgSmFuIDMxIDEzOjUyOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBnY2MvY29uZmlnLnN1Yi4KLQotVGh1IEphbiAyNSAxMTowMToxMCAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHctYnVpbGQuaW4gKGRvLWJpbnV0aWxzKTogQWRkIGJ1aWxkIG9mIHN0YW1wcy4KLQotVGh1IEphbiAyNSAxNzowNToyNiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCByZWNvZ25pdGlvbiBmb3IgbWlwczY0dnI0MTAwKi0qIHRhcmdldHMuCi0KLVdlZCBKYW4gMjQgMTI6NDc6NTUgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBBZGQgY2hlY2tpbmcgb2YgYGhwdXg5JyByYXRoZXIgdGhhbiBqdXN0IGBocHV4Jy4KLQlBZGQgY3JlYXRpb24gb2YgZ2NvbmZpZ2FyZ3Mgd2l0aCBgLS1lbmFibGUtc2hhcmVkJyB0dXJuZWQgb24uCi0JKCQoaG9zdCktc3RhbXAtc3RhZ2UyLWNvbmZpZ3VyZWQpOiBQYXNzICQoZ2NvbmZpZ2FyZ3MpLgotCSgkKGhvc3QpLXN0YW1wLXN0YWdlMy1jb25maWd1cmVkKTogTGlrZXdpc2UuCi0JKEhPTEVTKTogQWRkIGNoYXRyIGFuZCBsZGQuCi0JKGkzODYtbmNyLXN5c3Y0LjMqKTogQWRkIHVzZSBvZiAvdXNyL2Njcy9iaW4gaW4gdGhlIFBBVEggYW5kIEhPTEVfRElSUy4KLQotV2VkIEphbiAyNCAyMDozMjozMCAxOTk2ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAbm9pc3kubWF0ZW1hdGlrLnN1LnNlPgotCi0JKiBjb25maWd1cmU6IFBhc3MgLS1uZnAgdG8gcmVjdXJzaXZlIGNvbmZpZ3VyZXMuCi0KLU1vbiBKYW4gMjIgMTA6NDE6NTYgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERMTFRPT0wpOiBOZXcuCi0JKERMTFRPT0xfRk9SX1RBUkdFVCk6IE5ldy4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFBhc3MgZG93biBETExUT09MLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQkoRVhUUkFfR0NDX0ZMQUdTKTogRGl0dG8uCi0JKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IERpdHRvLgotCShET19YKTogRGl0dG8uCi0JKiBjb25maWd1cmU6IEFkZCBETExUT09MLgotCi1GcmkgSmFuIDE5IDEzOjMwOjE1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCVNDTyBPcGVuU2VydmVyIDUgY2hhbmdlcyBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1zY28zLjJ2NSopOiBVc2UgbWgtc3lzdiBpbnN0ZWFkIG9mCi0JbWgtc2NvLCBzaW5jZSBvbGQgd29ya2Fyb3VuZHMgbm8gbG9uZ2VyIG5lZWRlZCwgYW5kIGRvbid0Ci0JYnVpbGQgbGQsIHNpbmNlIGxpYnJhcmllcyBoYXZlIHdlYWsgc3ltYm9scyBpbiBDT0ZGLgotCi1TdW4gSmFuIDE0IDIzOjAxOjMxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogQWRkIG1pc3NpbmcgJzsnLgotCi1GcmkgSmFuIDEyIDE1OjI1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgdGhhdCAke0NDfSBjYW4gYmUgdXNlZCB0byBjb21waWxlIGFuCi0JZXhlY3V0YWJsZS4KLQotV2VkIEphbiAgMyAxNzo1NDo0MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobmV3bGliLnRhci5neik6IERlbGV0ZSBidWlsZGluZyBvZiBuZXdsaWIncyBpbmZvIGZpbGVzLgotCi1Nb24gSmFuICAxIDE5OjA5OjE0IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFB1dCBsZCBvciBnYXMgaW4gdGhpcyBlYXJseSwgaWYgdGhlCi0JdXNlciBzcGVjaWZpY2FsbHkgdXNlZCAtLXdpdGgtZ251LWxkPW5vIG9yIC0td2l0aC1nbnUtYXM9bm8uCi0KLVNhdCBEZWMgMzAgMTY6MDg6NTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBBZGQgc3VwcG9ydCBmb3IKLQktLWRpc2FibGUte3NvZnRmbG9hdCxtNjg4ODEsbTY4MDAwLG02ODAyMH0gb24gbTY4Ki0qLSouCi0JU2ltcGxpZnkgc2V0dGluZyBvZiBtdWx0aWRpcnMgZnJvbSAtLWRpc2FibGUtZm9vLgotCi1GcmkgRGVjIDI5IDA3OjU2OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IElmIGFueSBvZiB0aGUgbWFrZSB2YXJpYWJsZXMKLQlMQU5HVUFHRVMsIEJPT1RfQ0ZMQUdTLCBTVE1QX0ZJWFBST1RPLCBMSU1JVFNfSF9URVNULAotCUxJQkdDQzFfVEVTVCwgTElCR0NDMl9DRkxBR1MsIExJQkdDQzJfSU5DTFVERVMsIGFuZCBFTlFVSVJFIGFyZQotCW5vbi1lbXB0eSwgcGFzcyB0aGVtIG9uIHRvIHRoZSAJR0NDIG1ha2UuCi0JKGFsbC1ib290c3RyYXApOiBOZXcgcnVsZSB0aGF0IGlzIGxpa2UgYWxsLWdjYywgZXhjZXB0IGl0IGV4ZWN1dGVzCi0JdGhlIEdDQyBib290c3RyYXAgcnVsZSBpbnN0ZWFkIG9mIHRoZSBHQ0MgYWxsIHJ1bGUuCi0KLVdlZCBEZWMgMjcgMTU6NTE6NDggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluIChtbF9yZWFsc3JjZGlyKTogTmV3LCB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0KLVR1ZSBEZWMgMjYgMTE6NDU6MzEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IFVwZGF0ZSBmcm9tIEZTRiB0byBhZGQgcGVudGl1bQotCURHL1VYIHN1cHBvcnQuCi0KLUZyaSBEZWMgMTUgMTA6MDE6MjcgMTk5NSAgU3RhbiBDb3ggIDxjb3hzQGRnLXJ0cC5kZy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGkqODYqKSBDaGFuZ2UgWzM0NV0gdG8gWzM0NTZdCi0KLVdlZCBEZWMgMjAgMTc6NDE6NDAgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBnYXMgb3IgbGQgaWYgLS13aXRoLWdudS1hcz1ubyBvcgotCS0td2l0aC1nbnUtbGQ9bm8uCi0KLVdlZCBEZWMgMjAgMTU6MTU6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKHJzNjAwMCosIHBvd2VycGMqKTogQWRkIHN3aXRjaGVzIHRvIGNvbnRyb2wgd2hpY2gKLQlBSVggbXVsdGlsaWJzIGdldCBidWlsdC4KLQotTW9uIERlYyAxOCAxNzo1NTo0NiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LXdpbjMyKTogRG9uJ3QgYnVpbGQgZXhwZWN0IGlmIHdlJ3JlIG5vdAotCWJ1aWxkaW5nIHRoZSB0Y2wgc3ViZGlyLgotCi1Nb24gRGVjIDE4IDExOjQ3OjE5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IChjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzLCBhbGwtdGFyZ2V0LWV4YW1wbGVzKToKLQlOZXcgdGFyZ2V0cywgY29uZmlndXJlIGFuZCBidWlsZCBleGFtcGxlIHByb2dyYW1zLgotCi1GcmkgRGVjIDE1IDE2OjEzOjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSWYgYW4gbXB3LWNvbmZpZy5pbiBnZW5lcmF0ZWQgYSBmaWxlIG1rLnNlZCwKLQl1c2UgaXQgYXMgaW5wdXQgdG8gc2VkaXQgdGhlIGdlbmVyYXRlZCBNUFcgbWFrZWZpbGUuCi0JKiBtcHctUkVBRE1FOiBBZGQgYSBzdWdnZXN0aW9uIGFib3V0IEdlc3RhbHQuaC4KLQotV2VkIERlYyAxMyAxNjo0Mzo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAqLSotaWVlZSouCi0KLVR1ZSBEZWMgMTIgMTE6NTI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogUmVtb3ZlICQoVEFSR0VUX1NVQkRJUikuICBGcm9tCi0JUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotTW9uIERlYyAxMSAxNTozMTo1OCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1wb3dlcnBjLXBlKTogQWRkIG1hbnkgZGlyZWN0b3JpZXMgdG8gbm9jb25maWdkaXJzCi0JZm9yIHBvd2VycGMtcGUgbmF0aXZlLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgdGNsLCBtYWtlIHRvIG5vY29uZmlnZGlycyBpZiBjYW5hZGlhbiBjcm9zcy4KLQkodGFyZ2V0PT1wb3dlcnBjLXBlKTogZHVwbGljYXRlIGkzODYtd2luMzIgZW50cnkuCi0KLVNhdCBEZWMgIDkgMTQ6NTg6MjggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEV4Y2x1ZGUgdGFyZ2V0LW5ld2xpYiBmb3IgYWxsIHZlcnNpb25zCi0Jb2Ygdnh3b3Jrcywgbm90IGp1c3Qgdnh3b3JrczUuMS4KLQotTW9uIERlYyAgNCAxMjowNTo0MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciBleGVjLXByZWZpeC4KLQotTW9uIERlYyAgNCAxMDoyMjo1MCAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSFAgbW9kZWwgODE2IG1hY2hpbmVzIGFzIGhhdmluZwotCWEgUEExLjEgcHJvY2Vzc29yLgotCi1Nb24gRGVjICA0IDEyOjM4OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZ25vcmUgbmV3IGF1dG9jb25mIGNvbmZpZ3VyZSBvcHRpb25zLgotCi1UaHUgTm92IDMwIDE0OjQ1OjI1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXY4MTAgKENDX0ZPUl9UQVJHRVQpOiBBZGQgLWFuc2kgZmxhZy4gIE5FQyBjb21waWxlcgotIAlkZWZhdWx0cyB0byBLJlIgbW9kZSwgYnV0IGRvZXNuJ3QgaGF2ZSB2YXJhcmdzLmgsIHNvIHdlIGhhdmUgdG8gCi0JY29tcGlsZSBpbiBBTlNJIG1vZGUuCi0KLVRodSBOb3YgMzAgMTY6NTc6MzMgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHdvbWJhdC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIFBlbnRpdW0gdW5kZXIgU0NPLgotCUZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotV2VkIE5vdiAyOSAxMzo0OTowOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSB0YXJnZXQtbGliaW8gb24gdjgxMC0qLSouCi0JKiBjb25maWcvbXQtdjgxMCAoQ0NfRk9SX1RBUkdFVCwgQVNfRk9SX1RBUkdFVCwgQVJfRk9SX1RBUkdFVCwKLQlSQU5MSUJfRk9SX1RBUkdFVCk6IFNldCBhcyBhcHByb3ByaWF0ZSBmb3IgTkVDIHY4MTAgdG9vbGNoYWluLgotCi1XZWQgTm92IDI5IDEyOjEyOjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgZ2FzIGZvciBhbHBoYS1kZWMtb3NmKi4KLQotVHVlIE5vdiAyOCAxNzoxNjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmYXVsdCB0byAtLXdpdGgtc3RhYnMgZm9yIHNvbWUgdGFyZ2V0cyBmb3Igd2hpY2gKLQlpdCBtYWtlcyBzZW5zZTogbWlwcyotKi0qLCBhbHBoYSotKi1vc2YqLCBpWzM0NV04NiotKi1zeXN2NCogYW5kCi0JaVszNDVdODYqLSotdW5peHdhcmUqLgotCi1Nb24gTm92IDI3IDEzOjQ0OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBHZXQgbGlzdCBvZiBtdWx0aWRpcnMgdXNpbmcgZ2NjIC0tcHJpbnQtbXVsdGktbGliCi0JcmF0aGVyIHRoYW4gYmFzaW5nIGl0IG9uIHRoZSB0YXJnZXQuICBTaW1wbGlmeSBoYW5kbGluZyBvZiBvcHRpb25zCi0JY29udHJvbGxpbmcgd2hpY2ggZGlyZWN0b3JpZXMgdG8gY29uZmlndXJlLiAgUmVtb3ZlIGV4dHJhbmVvdXMKLQlzbGFzaCBpbiBtdWx0aS1jbGVhbiB0YXJnZXQuCi0KLUZyaSBOb3YgMjQgMTc6Mjk6MjkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IFByZWZpeCBtb3JlIHZhcmlhYmxlcyB3aXRoIG1sXyBzbyB0aGV5IGRvbid0IGNvbGxpZGUKLQl3aXRoIGNvbmZpZ3VyZSdzLgotCi1XZWQgTm92IDIyIDExOjI3OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCB0dXJuIC12IGludG8gLS12LgotCi1UdWUgTm92IDIxIDE2OjQ4OjAyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IEZpeCB0eXBvLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIHN5bWxpbmstdHJlZS4KLQotVHVlIE5vdiAyMSAxNDowODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RyaXAgLS1ob3N0IGFuZCAtLXRhcmdldCBvcHRpb25zIGZyb20KLQlDT05GSUdfQVJHVU1FTlRTLCBhbmQgYWx3YXlzIGNvbmZpZ3VyZSBmb3IgLS1ob3N0IG9ubHkuICBBZGQKLQktLXdpdGgtY3Jvc3MtaG9zdCBvcHRpb24gd2hlbiBidWlsZGluZyB3aXRoIGEgY3Jvc3MtY29tcGlsZXIuCi0JKiBjb25maWd1cmU6IENhbm9uaWNhbGl6ZSB0aGUgYXJndW1lbnRzIHB1dCBpbnRvIGNvbmZpZy5zdGF0dXMgYnkKLQlhbHdheXMgdXNpbmcgYD0nIGZvciBhbiBvcHRpb24gd2l0aCBhbiBhcmd1bWVudC4gIFBhc3MgYSBwcmVzdW1lZAotCS0taG9zdCBvciAtLXRhcmdldCBleHBsaWNpdGx5LgotCi1GcmkgTm92IDE3IDE3OjUwOjMwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2UgLW1hY29zKiwgLW1hZ2ljKiwgLXBlKiwgYW5kIC13aW4zMiBjYXNlcwotCWludG8gZ2VuZXJhbCBPUyByZWNvZ25pdGlvbiBjYXNlLgotCi1GcmkgTm92IDE3IDE3OjQyOjI1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9jb25maWdkaXJzKTogYWRkIHRhcmdldC13aW5zdXAgb25seQotCWZvciB3aW4zMiB0YXJnZXQgc3lzdGVtcy4KLQotVGh1IE5vdiAxNiAxNDowNDo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmdsb3NzKTogRGVwZW5kIHVwb24KLQljb25maWd1cmUtdGFyZ2V0LW5ld2xpYiwgc2luY2Ugd2hlbiBsaWJnbG9zcyBpcyBidWlsdCBpdCBsb29rcyB0bwotCXNlZSBpZiB0aGUgbmV3bGliIGRpcmVjdG9yeSBleGlzdHMuCi0KLVdlZCBOb3YgMTUgMTQ6NDc6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBVc2UgY29uZmlnLW1sLmluIGluc3RlYWQgb2YKLQljZmctbWwtKi5pbi4KLQotV2VkIE5vdiAxNSAxMTo0NToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIExEIGFuZCBMRF9GT1JfVEFSR0VUIHdoZW4gY29uZmlndXJpbmcgYQotCUNhbmFkaWFuIENyb3NzLgotCi1UdWUgTm92IDE0IDE1OjAzOjEyIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaTM4NndpbjMyOiBhZGQgTERfRk9SX1RBUkdFVC4KLQotVHVlIE5vdiAxNCAxNDo1NjoxMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IGFkZCB0YXJnZXQtd2luc3VwLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgcGF0Y2ggZGlmZiBmbGV4IG1ha2UgdG8gJG5vY29uZmlnZGlycy4KLQkodGFyZ2V0PT1wcGNsZS1wZSk6IHJlbW92ZSBsZCBmcm9tICRub2NvbmZpZ2RpcnMuCi0KLVR1ZSBOb3YgMTQgMDE6MjU6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IFBhc3MgLS13aXRoLXRhcmdldC1zdWJkaXIuCi0JUHJlc2VydmUgcmVsYXRpdmUgcGF0aCBuYW1lcyBpbiAkc3JjZGlyLiAgQnVpbGQgc3ltbGluayB0cmVlIGlmCi0JY29uZmlndXJpbmcgY3Jvc3MgdGFyZ2V0IGRpciBhbmQgc3JjZGlyPS4gKD0gbm8gVlBBVEggc3VwcG9ydCkuCi0JKGNvbmZpZ3VyZS10YXJnZXQtbGliZysrKTogRGVwZW5kIG9uIGNvbmZpZ3VyZS10YXJnZXQtbGlicnguCi0JKiBjZmctbWwtY29tLmluLCBjZmctbWwtcG9zLmluOiBEZWxldGVkLgotCSogY29uZmlnLW1sLmluOiBOZXcgZmlsZS4KLQkqIHN5bWxpbmstdHJlZTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IEVuc3VyZSBzcmNkaXI9Ii4iIGlmIHRoYXQncyB3aGF0IGl0IGlzLgotCi1Nb24gTm92IDEzIDEyOjM0OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LVJFQURNRTogQ2xhcmlmeSBzb21lIHBocmFzaW5nLCBhZGQgbm90ZXMgYWJvdXQgQ29kZVdhcnJpb3IKLQlpbmNsdWRlcyBhbmQgRkxFWF9TS0VMRVRPTiBzZXR0aW5nLgotCSogbXB3LWNvbmZpZ3VyZSAoLS13aXRoLWdudS1sZCk6IE5ldyBvcHRpb24sIGNvbnRyb2xzIHdoZXRoZXIKLQl0byB1c2UgUFBDTGluayBvciBsZCB3aXRoIFBvd2VyTWFjIEdDQy4KLQkqIG1wdy1idWlsZC5pbiAoYWxsLWdyZXosIGRvLWdyZXosIGluc3RhbGwtZ3Jleik6IE5ldyB0YXJnZXRzLgotCSogbXB3LWNvbmZpZy5pbjogQ29uZmlndXJlIGdyZXogaWYgdGFyZ2V0aW5nIE1hYy4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IHBtYWMgYW5kIHBtYWMtbXB3IGFzIG5hbWVzIGZvciBQb3dlck1hY3MsCi0gCWFjY2VwdCBtcHcgYW5kIG1hYy1tcHcgYXMgbmFtZXMgZm9yIG02OGsgTWFjcywgY2hhbmdlIG1hY29zNyB0bwotIAlqdXN0IG1hY29zLgotCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgZ3JleiByZXNvdXJjZSBjb21waWxlciBpZiB0YXJnZXRpbmcgTWFjLgotCSogTWFrZWZpbGUuaW4gKGFsbC1ncmV6LCBpbnN0YWxsLWdyZXopOiBOZXcgdGFyZ2V0cy4KLQotV2VkIE5vdiAgOCAxNzozMzo1MSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQ1hYIGRlZmF1bHRzIHRvIGdjYywgbm90IGcrKy4gIElmIHdlIGZpbmQKLSAJZ2NjIGluIHRoZSBwYXRoLCBzZXQgQ0MgdG8gZ2NjIC1PMi4KLQotVHVlIE5vdiAgNyAxNTo0NToxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmYXVsdCAke2J1aWxkfSBjb3JyZWN0bHkuICBBdm9pZCBwaWNraW5nIHVwIGV4dHJhCi0Jc3BhY2VzIHdoZW4gcmVhZGluZyBDQyBhbmQgQ1hYIGZyb20gTWFrZWZpbGUuICBXaGVuIGRvaW5nIGEKLQlDYW5hZGlhbiBDcm9zcywgdXNlIHBsYXVzaWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgbnVtZXJvdXMKLQl2YXJpYWJsZXMuCi0JKiBjb25maWd1cmUuaW46IFdoZW4gZG9pbmcgYSBDYW5hZGlhbiBDcm9zcywgZG9uJ3QgdHJ5IHRvCi0JY29uZmlndXJlIHRvb2xzIHdob3NlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgaGFuZGxlIGl0LgotCi1Nb24gTm92ICA2IDE5OjMyOjE3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoc2gtKi0qKTogQWRkIG0yIGFuZCBtbC9tMiB0byBtdWx0aWRpcnMuCi0KLVN1biBOb3YgIDUgMDA6MTU6NDEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogIFJlbW92ZSBkdWJpb3VzIGJ1ZyByZXBvcnRpbmcgYWRkcmVzcy4KLQotRnJpIE5vdiAgMyAwODoxNzo1NCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6ICBJZiBzdWJkaXIgaGFzCi0JY29uZmlndXJlIHNjcmlwdCwgcnVuIHRoYXQgaW5zdGVhZCBvZiB0aGlzIGRpcmVjdG9yeSdzIGNvbmZpZ3VyZS4KLQlJbiBlaXRoZXIgY2FzZSwgcHJpbnQgYSBtZXNzYWdlIHRoYXQgd2UncmUgY29uZmlndXJpbmcgdGhlIHN1Yi1kaXIuCi0KLVRodSBOb3YgIDIgMjM6MjM6MzYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQmVmb3JlIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHZhcmlvdXMgZmlsZXMsCi0JdXNlIHNlZCB0byBmaWx0ZXIgb3V0ICJ0YXJnZXQtIi4KLQotVGh1IE5vdiAgMiAxMzoyNDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChET19YKTogU3BsaXQgcnVsZSB0byBkZWNyZWFzZSBjb21tYW5kIGxpbmUgbGVuZ3RoCi0JZm9yIHN5c3RlbXMgd2l0aCBzbWFsbCBBUkdfTUFYIHZhbHVlcy4gIEZyb20gcGhkbUBpbmZvLnVjbC5hYy5iZQotCShQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDE1OjE4OjM1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXBhdGNoKTogZGVwZW5kIG9uIGFsbC1saWJpYmVydHkuCi0KLVdlZCBOb3YgIDEgMTI6MjM6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHRoZSBvbmx5IGRpcmVjdG9yeSBpbiB0YXJnZXRfY29uZmlnZGlycyB3aGljaAotCWFjdHVhbGx5IGV4aXN0cyBpcyBsaWJpYmVydHksIHRoZW4gc2V0IHRhcmdldF9jb25maWdkaXJzIHRvIGVtcHR5LAotCXRvIGF2b2lkIHRyeWluZyB0byBidWlsZCBhIHRhcmdldCBsaWJpYmVydHkgaW4gYSBnYXMgb3IgZ2RiCi0JZGlzdHJpYnV0aW9uLgotCi1UdWUgT2N0IDMxIDE3OjUyOjM5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BzbGF2ZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6IFVzZSBtNjhrLXN1bi1zdW5vcyogaW5zdGVhZAotIAlvZiBtNjhrLXN1bi0qIHdoZW4gc2VsZWN0aW5nIG1oLXN1bjMgdG8gYXZvaWQgbWF0Y2hpbmcgTmV0QlNEL3N1bjMKLSAJc3lzdGVtcy4KLQotVHVlIE9jdCAzMSAxNjo1NzozMiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY29weV9kaXJzKTogVXNlIHN5cy1pbmNsdWRlIGluc3RlYWQgb2YgaW5jbHVkZQotCWZvciAtLXdpdGgtaGVhZGVycyBvcHRpb24uCi0KLVR1ZSBPY3QgMzEgMTA6Mjk6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogTWFrZSB3aW5zdXAgYnVpbGRzIHdvcmsgd2l0aAotCW5ldyBzY2hlbWUuCi0KLU1vbiBPY3QgMzAgMTg6NTc6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIHRoZSBsaW5rZXIgb24gQUlYLgotCi1Nb24gT2N0IDMwIDEyOjI3OjE2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiAgQWRkICQoVEFSR0VUX1NVQkRJUikKLQl3aGVyZSBuZWVkZWQuCi0KLU1vbiBPY3QgMzAgMTI6NDU6MjUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEZpeCB0eXBvLgotCi1TYXQgT2N0IDI4IDEwOjI3OjU5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDSEVDS19UQVJHRVRfTU9EVUxFUykpOiAgRml4IHR5cG8uCi0KLUZyaSBPY3QgMjcgMjM6MTQ6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbmFtZSBsaWJGT08gdG8gdGFyZ2V0LWxpYkZPTywgYW5kIHhpYmVydHkKLQl0byB0YXJnZXQteGliZXJ0eSwgdG8gcHJvdmlkZSBtb3JlIGZsZXhpYmlsaXR5LgotCSh0YXJnZXRfc3ViZGlyKTogIERlZmluZS4gIENyZWF0ZSBpZiBjcm9zcy4KLQlTZXQgVEFSR0VUX1NVQkRJUiBpbiBNYWtlZmlsZSB0byAke3RhcmdldF9zdWJkaXJ9LgotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgYWxsLWxpYkZPTyAtPiBhbGwtdGFyZ2V0LWxpYkZPTywgYWxsLXhpYmVydHkKLQktPiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSwgY29uZmlndXJlLWxpYkZPTyAtPiBjb25maWd1cmUtdGFyZ2V0LWxpYkZPTywKLQljaGVjay1saWJGT08gLT4gY2hlY2stdGFyZ2V0LWxpYkZPTywgZXRjLgotCSgkKERPX1gpKTogIEl0ZXJhdGUgb3ZlciBUQVJHRVRfQ09ORklHRElSUyBhZnRlciBTVUJESVJTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyksICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpLAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSk6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkoY29uZmlndXJlLXRhcmdldC1YWFgpOiAgRGVwZW5kIG9uICQoQUxMX0dDQyksIG5vdCBhbGwtZ2NjLCB0bwotCWFsbG93IEFMTF9HQ0M9IiIgdG8gb25seSBjb25maWd1cmUuCi0JKERFVk9fU1VQUE9SVCk6ICBBZGQgY2ZnLW1sLWNvbS5pbiBhbmQgY2ZnLW1sLXBvcy5pbi4KLQkoRVRDX1NVUFBPUlQsIEVUQ19TVVBQT1JUX1BGWCk6ICBNZXJnZTsgIHVwZGF0ZSAndGF6JyBhY2NvcmRpbmdseS4KLQkoTElCR1hYX1NVUFBPUlRfRElSUyk6ICBSZW1vdmUgeGliZXJ0eS4KLQotU2F0IE9jdCAyOCAwMTo1Mzo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEJ1aWxkICJpbmZvIiBpbiBldGMgZXhwbGljaXRseS4KLQotRnJpIE9jdCAyNyAwOTozMjozMCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIHN1cmUgdGhhdCBDQyBpcyB1bmRlZmluZWQgKGFzIG9wcG9zZWQgdG8KLQludWxsKSBpZiB0b3BsZXZlbC9jb25maWcvbWgte2hvc3R9IGRvZXNuJ3QgZGVmaW5lIGl0LiAgRml4ZXMgYQotCXByb2JsZW0gd2l0aCBhdXRvY29uZiB0cnlpbmcgdG8gY29uZmlndXJlIG9uIGEgaG9zdCB3aXRob3V0IEdDQy4KLQotVGh1IE9jdCAyNiAyMjozNTowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IFNldCBob3N0IGFsaWFzIGZyb20gY2hvaWNlIG9mIGhvc3QgY29tcGlsZXIsCi0Jb25seSB1c2UgZ2VuZXJpYyBNUFcgTWFrZWZpbGUgc2VkIGlmIHByZXNlbnQsIGVkaXQgYSBmaWxlCi0JbmFtZWQgImhhY2tlZF9NYWtlZmlsZS5pbiIgaW5zdGVhZCBvZiAiTWFrZWZpbGUuaW4iIGlmIHByZXNlbnQuCi0JKiBtcHctUkVBRE1FOiBBZGQgcHJvYmxlbSBub3RlcyBhYm91dCBDVzYgYW5kIENXNy4KLQotVGh1IE9jdCAyNiAwNTo0NToxMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFVzZSAiOyIgaW5zdGVhZCBvZiAiOzsiLgotCi1XZWQgT2N0IDI1IDE1OjE4OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIEdyZXAgZm9yICdeZGlzdHN0dWZmOicgb3IgJ15pbmZvOicgaW4KLQlzdWItZGlyZWN0b3J5IE1ha2VmaWxlcywgaW5zdGVhZCBvZiB1c2luZyBESVNUU1RVRkZESVJTIGFuZAotCURJU1RET0NESVJTLgotCShESVNUU1RVRkZESVJTLCBESVNURE9DRElSUyk6ICBSZW1vdmVkIC0gbm8gbG9uZ2VyIHVzZWQuCi0JKG5ld2xpYi50YXIuZ3opOiAgRG9uJ3QgcGFzcyBESVNURE9DRElSUyB0byByZWN1cnNpdmUgbWFrZS4KLQotV2VkIE9jdCAyNSAxNDo0Mzo1NSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIFJlbW92ZSBsZCBncHJvZiBibnV0aWxzIGdhcyBsaWJnKysgZ2RiCi0JYW5kIGduYXRzLCBiZWNhdXNlIHRoZXkgYXJlIG5vdyBzdWJzdW1lZCBieSBESVNUU1RVRkZESVJTLgotCU1vdmUgYmZkIHRvIERJU1RTVFVGRkRJUlMuCi0KLVR1ZSBPY3QgMjQgMTg6MTk6MDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYMTFfTElCKTogUmVtb3ZlZC4KLQkoWDExX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIG9ubHkgWDExX0VYVFJBX0NGTEFHUyBhbmQgWDExX0VYVFJBX0xJQlMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogbWgtYWl4ICYgbWgtc3VuIHJlbW92ZWQuCi0KLVN1biBPY3QgMjIgMTM6MDQ6NDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKik6IFNob3J0ZW4gc29tZSBvZiB0aGUgbXVsdGlsaWIgZGlyZWN0b3J5Ci0JbmFtZXMuCi0KLUZyaSBPY3QgMjAgMTg6MDI6MTAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi1lYWJpKik6IEFkZCBtY2FsbC1haXhkZXNjIHZhcmllbnRzLgotCi1UaHUgT2N0IDE5IDEwOjQwOjU3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi13aW4zMik6IEFsd2F5cyBidWlsZCBuZXdsaWIuCi0JRG9uJ3QgY29uZmlndXJlIGN2cywgYXV0b2NvbmYgb3IgdGV4aW5mby4KLQkqIE1ha2VmaWxlLmluIChMRF9GT1JfVEFSR0VUKTogTmV3LgotCShCQVNFX0ZMQUdTX1RPX1BBU1MsIEVYVFJBX1RBUkdFVF9GTEFHUywgQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKToKLQlQYXNzIGRvd24gTERfRk9SX1RBUkdFVC4KLQotV2VkIE9jdCAxOCAxNTo1Mzo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3aW5zdXA6IE5ldyBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgd2luc3VwLgotCSogY29uZmlndXJlLmluOiBXaW5zdXAgaXMgY29uZmlndXJlZCB3aGVuIHRhcmdldCBpcyB3aW4zMi4KLQlDYW4gb25seSBidWlsZCB3aW4zMiB0YXJnZXQgR0RCIHdoZW4gbmF0aXZlLgotCQotTW9uIE9jdCAxNiAwOTo0MjozMSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEhQIG1vZGVsIDgxOSBtYWNoaW5lcyBhcyBoYXZpbmcKLQlhIFBBIDEuMSBwcm9jZXNzb3IuCi0KLU1vbiBPY3QgMTYgMTA6NDk6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEZpeCBzZWQgbG9vcCB3aGljaCBzdWJzdGl0dXRlcyBmb3IgQ0MgYW5kIENYWCB0bwotCWF2b2lkIGJ1ZyBmb3VuZCBpbiB2YXJpb3VzIHNlZCBpbXBsZW1lbnRhdGlvbnMuCi0KLVdlZCBPY3QgMTEgMTY6MTY6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjLSotZWFiaXNpbSk6IERlbGV0ZSBzZXBhcmF0ZSBydWxlIGZvcgotCXNpbXVsYXRvci4gIFVzZSBzdGFuZGFyZCBwb3dlcnBjLSotZWFiaSouCi0KLU1vbiBPY3QgIDkgMTc6MjE6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0b3AgcHV0dGluZyBnYXMgYW5kIGJpbnV0aWxzIGluIG5vY29uZmlnZGlycyBmb3IKLQlwb3dlcnBjLSotYWl4KiBhbmQgcnM2MDAwLSotKi4KLQotTW9uIE9jdCAgOSAxMjozODo0MCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZwotCS1tY2FsbC1haXhkZXNjIGxpYnJhcmllcy4KLQotRnJpIE9jdCAgNiAxNjoxNzo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy5zdWIgKGFybSB8IGFybWVsIHwgYXJtZWIpOiBGaXggc2hlbGwgc3ludGF4LgotCi1GcmkgT2N0ICA2IDE0OjQwOjI4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoe3Bvd2VycGMscnM2MDAwfS1pYm0tYWl4Kik6IEFkZCBtdWx0aWxpYnMgZm9yCi0JLW1zb2Z0LWZsb2F0IGFuZCAtbWNwdT1jb21tb24gc3VwcG9ydC4KLQkocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyAtbWNhbGwtYWl4Ci0JbGlicmFyaWVzLgotCi1UaHUgT2N0ICA1IDEzOjI2OjM3IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBbGxvdyBjb25maWd1cmF0aW9uIGFuZCBidWlsZCBvZiBlbWFjczE5IGZvciB0aGUgYWxwaGEuCi0KLVdlZCBPY3QgIDQgMjI6MDU6MzYgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQ0MpOiBHZXQgXkNDLCBub3QganVzdCBhbnkgb2xkIENDLCBmcm9tCi0JJHtob3N0X21ha2VmaWxlX2ZyYWd9LgotCi1XZWQgT2N0ICA0IDIxOjU1OjAwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKENDKTogVHJ5IHRvIGdldCBDQyBmcm9tIAotCSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30sIG5vdCAke2hvc3RfbWFrZWZpbGVfZnJhZ30uCi0KLVdlZCBPY3QgIDQgMjE6NDQ6MTIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IGNvbmZpZ3VyZSB0YXJnZXRkaXJzCi0Jb25seSBpZiBpdCBleGlzdHMgaW4gJChzcmNkaXIpLgotCi1XZWQgT2N0ICA0IDExOjUyOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBDQyBhbmQgQ1hYIGFyZSBub3Qgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgc2V0Ci0JdGhlbSwgYmFzZWQgb24gZWl0aGVyIGFuIGV4aXN0aW5nIE1ha2VmaWxlIG9yIG9uIHNlYXJjaGluZyBmb3IgZ2NjCi0JaW4gUEFUSC4gIFN1YnN0aXR1dGUgZm9yIENDIGFuZCBDWFggaW4gTWFrZWZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBsaWJtIGZyb20gdGFyZ2V0X2xpYnMuICBTZXBhcmF0ZQotCXRhcmdldF9jb25maWdkaXJzIGZyb20gY29uZmlnZGlycy4gIElmIENDIGlzIG5vdCBzZXQgaW4KLQllbnZpcm9ubWVudCwgdHJ5IHRvIGdldCBpdCBmcm9tIGEgaG9zdCBNYWtlZmlsZSBmcmFnbWVudC4gIFJld3JpdGUKLQljaGFuZ2VzIG9mIGNvbmZpZ2RpcnMgdG8gdXNlIHNraXBkaXJzIGluc3RlYWQuICBBIGZldyBtaW5vcgotCXR3ZWFrcy4gIFRha2UgZGlyZWN0b3JpZXMgb3V0IG9mIHRhcmdldF9jb25maWdkaXJzIGFzIHRoZXkgYXJlCi0JdGFrZW4gb3V0IG9mIGNvbmZpZ2RpcnMuICBSZW1vdmUgZXhpc3RpbmcgTWFrZWZpbGUgZmlsZXMgZnJvbQotCXN1YmRpcmVjdG9yaWVzLiAgU3Vic3RpdHV0ZSBmb3IgVEFSR0VUX0NPTkZJR0RJUlMgYW5kCi0JQ09ORklHX0FSR1VNRU5UUyBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IE5ldyB2YXJpYWJsZSwgYXV0b21hdGljYWxseSBzZXQKLQlieSBjb25maWd1cmUuaW4uCi0JKENPTkZJR19BUkdVTUVOVFMpOiBMaWtld2lzZS4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogTmV3IHZhcmlhYmxlLgotCSgkKERPX1gpKTogTG9vcCBvdmVyIFRBUkdFVF9DT05GSUdESVJTIGFzIHdlbGwgYXMgU1VCRElSUy4KLQkoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTmV3IHRhcmdldC4KLQkoY29uZmlndXJlLWxpYmcrKywgY29uZmlndXJlLWxpYmlvKTogTmV3IHRhcmdldHMuCi0JKGFsbC1saWJnKyspOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliZysrLgotCShhbGwtbGliaW8pOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliaW8uCi0JKGNvbmZpZ3VyZS1saWJnbG9zcywgYWxsLWxpYmdsb3NzKTogTmV3IHRhcmdldHMuCi0JKGNvbmZpZ3VyZS1saWJzdGRjKyspOiBOZXcgdGFyZ2V0LgotCShhbGwtbGlic3RkYysrKTogRGVwZW5kIHVwb24gY29uZmlndXJlLWxpYnN0ZGMrKy4KLQkoY29uZmlndXJlLWxpYnJ4LCBhbGwtbGlicngpOiBOZXcgdGFyZ2V0cy4KLQkoY29uZmlndXJlLW5ld2xpYik6IE5ldyB0YXJnZXQuCi0JKGFsbC1uZXdsaWIpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbmV3bGliCi0JKGNvbmZpZ3VyZS14aWJlcnR5KTogTmV3IHRhcmdldC4KLQkoYWxsLXhpYmVydHkpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUteGliZXJ0eS4KLQotU2F0IFNlcCAzMCAwNDozMjo1OSAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6ICBFeHBhbmQgdGhlCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1UaHUgU2VwIDI4IDIxOjE4OjQ5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogRml4IHNlZCBjb21tYW5kIGZpbGUgbmFtZS4KLQotVGh1IFNlcCAyOCAxNzozOTo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6IFJlZHVjZSB0aGUgCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1XZWQgU2VwIDI3IDEyOjI0OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGQgYW5kIGdkYiBmb3IgcG93ZXJwYyotKi13aW5udCoKLQlvciBwb3dlcnBjKi0qLXBlKiwgc2luY2UgdGhleSBhcmUgbm90IHlldCBzdXBwb3J0ZWQuCi0KLVR1ZSBTZXAgMjYgMTQ6MzA6MDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JQWRkIFBvd2VyTWFjIHN1cHBvcnQgYW5kIG1hbnkgb3RoZXIgZW5oYW5jZW1lbnRzLgotCSogbXB3LWNvbmZpZ3VyZTogTmV3IG9wdGlvbiAtLWNjIHRvIHNlbGVjdCBjb21waWxlciB0byB1c2UsCi0JcGFzdGUgb3B0aW9ucyBzZXQgYWNjb3JkaW5nIHRvIC0tY2MgaW50byB0aGUgZ2VuZXJhdGVkCi0JTWFrZWZpbGUsIGdlbmVyYXRlIHRoZSBNYWtlZmlsZSBieSBzZWQnaW5nIHRoZSBVbml4IE1ha2VmaWxlLmluCi0JaWYgbXB3LW1ha2Uuc2VkIGlzIHByZXNlbnQuCi0JKiBtcHctY29uZmlnLmluOiBEb24ndCB0ZXN0IGZvciBnQzEsIHRlc3QgZm9yIG1wdy10b3VjaCwKLQlhZGQgZm9yd2FyZCBpbmNsdWRlcyBmb3IgUG93ZXJQQyBpbmNsdWRlIGZpbGVzLgotCSogbXB3LWJ1aWxkLmluOiBCdWlsZCB1c2luZyBNYWtlZmlsZS5QUEMgaWYgcHJlc2VudC4KLQkoZG8tYnlhY2MsIGV0Yyk6IFJlbW92ZSBzZXBhcmF0ZSB2ZXJzaW9uIHJlc291cmNlIGJ1aWxkcy4KLQkoZG8tZ2FzKTogQnVpbGQgInN0YW1wcyIgYmVmb3JlICJhbGwiLgotCShkby1nY2MpOiBCdWlsZCAic3RhbXBzLWgiIGFuZCAic3RhbXBzLWMiIGJlZm9yZSAiYWxsIi4KLQkqIG1wdy1SRUFETUU6IFVwZGF0ZSB0byByZWZsZWN0IC0tY2Mgb3B0aW9uLCBQb3dlck1hYyBzdXBwb3J0LAotCWFuZCByZWNlbnRseS1yZXBvcnRlZCBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgotCi1GcmkgU2VwIDIyIDEyOjE1OjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAobTY4Ki0qLSopOiBPbmx5IGJ1aWxkIG11bHRpbGlicyBmb3IKLQllbWJlZGRlZCBtNjhrIHN5c3RlbXMgKC1hb3V0LCAtY29mZiwgLWVsZiwgLXZ4d29ya3MpLgotCSgtLXdpdGgtbXVsdGlsaWItdG9wKTogUGFzcyB0byByZWN1cnNpdmUgaW52b2NhdGlvbnMuCi0KLVR1ZSBTZXAgMTkgMTM6NTE6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSBsaWJnKysgYW5kIGxpYnN0ZGMrKyBvbgotCXY4MTAtKi0qLgotCi1Nb24gU2VwIDE4IDIzOjA4OjI2IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIGJmZCwgYmludXRpbHMsIGdhcywgZ2NjLAotCWdkYiwgbGQgYW5kIG9wY29kZXMgb24gdjgxMC0qLSouCi0KLVNhdCBTZXAgMTYgMTg6MzE6MDggUERUIDE5OTUgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgPGFuZ2VsYUBjeWdudXMuY29tPgotCQotCSogY29uZmlnL21oLW5jcnN2cjQzOiBSZW1vdmVkIEFSX0ZMQUdTCi0KLVR1ZSBTZXAgMTIgMTg6MDM6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRE9fWCk6IENoYW5nZSBkby1yZWFsY2xlYW4gdG8gZG8tbWFpbnRhaW5lci1jbGVhbi4KLQkobG9jYWwtbWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0JKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCShyZWFsY2xlYW4pOiBKdXN0IGRlcGVuZCB1cG9uIG1haW50YWluZXItY2xlYW4uCi0KLUZyaSBTZXAgIDggMTc6MTE6MTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgZ2RiIG9uIG02OGstKi1uZXRic2QqLgotCi1GcmkgU2VwICA4IDE2OjQ2OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCBpbiBtaXBzKi0qLWJzZCogY2FzZS4KLQotVGh1IFNlcCAgNyAyMDowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogT1MuICBGcm9tIElhbiBEYWxsLgotCi1GcmkgU2VwICAxIDA4OjA2OjU4IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiByZWNvZ25pc2UgbWlwczY0dnI0MzAwIGFuZCBtaXBzNjR2cjQzMDBlbCBhcyB2YWxpZAotIAl0YXJnZXRzLgotCi1XZWQgQXVnIDMwIDIxOjA2OjUwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHRyZWF0IGkzODYtd2luMzIgY2FuYWRpYW4gY3Jvc3MgdGhlIHNhbWUgYXMKLQlpMzg2LWdvMzIgY2FuYWRpYW4gY3Jvc3MuCi0KLVRodSBBdWcgMjQgMTQ6NTM6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi0qLWVhYmlzaW0pOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQwotCXJ1bm5pbmcgdW5kZXIgdGhlIHNpbXVsYXRvciB0byBidWlsZCBhIHJlZHVjZWQgc2V0IG9mIGxpYnJhcmllcy4KLQkocG93ZXJwYy0qLWVhYmlhaXgpOiBBZGQgZmluZSBncmFpbmVkIG11bHRpbGliIHN1cHBvcnQgYWRkZWQgdG8KLQlvdGhlciBwb3dlcnBjIHRhcmdldHMgeWVzdGVyZGF5LgotCi1XZWQgQXVnIDIzIDA5OjQxOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyopOiBBZGQgc3VwcG9ydCBmb3IgLWRpc2FibGUtYmllbmRpYW4sCi0JLWRpc2FibGUtc29mdGZsb2F0LCAtZGlzYWJsZS1yZWxvY2F0YWJsZSwgLWRpc2FibGUtYWl4LCBhbmQKLQktZGlzYWJsZS1zeXN2IHRvIGNvbnRyb2wgd2hpY2ggbXVsdGlsaWIgbGlicmFyaWVzIGdldCBidWlsdC4KLQotVGh1IEF1ZyAxNyAxNjowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIE1ha2VmaWxlLnRlbSB0byBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSBpbiB0cmFwCi0JaGFuZGxlci4KLQotTW9uIEF1ZyAxNCAxOToyNzo1NiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzICgqTGludXgqKTogIEFkZCBtaXNzaW5nICJleGl0InMuCi0JQWxzbywgbmVlZCBzcGVjaWZpYyBjaGVjayBmb3IgYWxwaGEtdW5rbm93bi1saW51eCAodXNlcyBDT0ZGKS4KLQotRnJpIEF1ZyAxMSAxNTozODoyMCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0Y6Ci0KLQlXZWQgSnVuIDI4IDE3OjU3OjI3IDE5OTUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCSogY29uZmlnLmd1ZXNzIChBSVg0KTogTW9yZSByb2J1c3QgcmVsZWFzZSBudW1iZXJpbmcgZGlzY292ZXJ5LgotCi0JVGh1IEp1biAyMiAxOTowMToyNCAxOTk1ICBLZW5uZXRoIFN0YWlsZXkgIChrc3RhaWxleUBlYWdsZS5kb2wtZXNhLmdvdikKLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni1zZXF1ZW50LXB0eCk6IFByb3Blcmx5IGdldCB2ZXJzaW9uIG51bWJlci4KLQotCVRodSBKdW4gMjIgMTg6MzY6NDIgMTk5NSAgVXdlIFNlaW1ldCAgKHNlaW1ldEBpcmlzMS5jaGVtaWUudW5pLWtsLmRlKQotCSogY29uZmlnLmd1ZXNzIChtaXBzOio6NCo6VU1JUFMpOiBOZXcgY2FzZS4KLQotTW9uIEF1ZyAgNyAwOToyMTozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtZ28zMiBob3N0KTogRml4IHR5cG8gKGRlamEtZ251IC0+IGRlamFnbnUpLgotCShpMzg2LXdpbjMyIGhvc3QpOiBMaWtld2lzZS4gIERvbid0IGJ1aWxkIHJlYWRsaW5lLgotCi1GcmkgQXVnICA0IDEzOjA0OjM2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoR0RCX1NVUFBPUlRfRElSUyk6IEFkZCB1dGlscy4KLQkoREVWT19TVVBQT1JUKTogQWRkIG1wdy1SRUFETUUsIG1wdy1idWlsZC5pbiwgbXB3LWNvbmZpZy5oIGFuZAotCW1wdy1jb25maWd1cmUuCi0KLVdlZCBBdWcgIDIgMTY6MzI6NDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYXBwZGlycyk6IFVzZSA9LCBub3QgPT0sIGluIHRlc3QgZXhwcmVzc2lvbiB3aGVuCi0JdHJ5aW5nIHRvIGJ1aWxkIHRoZSB0ZXh0IHRvIHByaW50IGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UgZm9yCi0JU29sYXJpcyB1c2Vycy4KLQotTW9uIEp1bCAzMSAwOTo1NjoxOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluICh6OGstKi1jb2ZmKTogQWRkICdzdGQnIG11bHRpbGliIGJ1aWxkLgotCi1GcmkgSnVsIDI4IDAwOjE2OjMxIDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBseW54LTIuMy4KLQotVGh1IEp1bCAyNyAxNTo0Nzo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViICh6OGtzaW0pOiBEZWxldGVkCi0JKHo4ay0qLWNvZmYpOiBOZXcsIHRoaXMgaXMgdGhlIG9uZSB0cnVlIG5hbWUgb2YgdGhlIHRhcmdldC4KLQotVGh1IEp1bCAyNyAxNDozMzozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtcG9zLmluIChkb3Rkb3QpOiBXb3JrIGFyb3VuZCBTdW5PUyBzZWQgYnVnLgotCi1UaHUgSnVsIDI3IDEzOjMxOjA1IDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogRmlyc3QgdHJ5IGFza2luZyB0aGUgbGlua2VyIHdoYXQgdGhlCi0JZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMgKGVsZiwgYW91dCwgb3IgY29mZikuICBUaGVuIGlmIHRoaXMKLQlmYWlscywgdHJ5IHByZXZpb3VzIG1ldGhvZHMuCi0KLVRodSBKdWwgMjcgMTE6Mjg6MTcgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5ld2xpYiBmb3IgKi0qLXZ4d29ya3M1LjEuCi0KLVRodSBKdWwgMjcgMTE6MTg6NDcgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5ld2xpYiBmb3IgYTI5ay0qLXZ4d29ya3M1LjEuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBBZGQgc2V0dGluZyBvZiAtLXdpdGgtaGVhZGVycyBmb3IgYTI5ay12eHdvcmtzNS4xLgotCi1UdWUgSnVsIDI1IDIxOjI1OjM5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1wb3MuaW4gKE1VTFRJVE9QKTogVHJpbSBleGNlc3MgdHJhaWxpbmcgIi8uIi4KLQotRnJpIEp1bCAyMSAxMDo0MToxMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluOiBOZXcgZmlsZS4KLQkqIGNmZy1tbC1wb3MuaW46IE5ldyBmaWxlLgotCi1XZWQgSnVsIDE5IDAwOjM3OjI3IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBDT1BZSU5HLk5FV0xJQjogQWRkIEhQIGZyZWUgY29weXJpZ2h0IHRvIGxpc3QuCi0KLVR1ZSBKdWwgMTggMTA6NTg6NTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgLWVhYmkqIGZvciB0aGUgc3lzdGVtLCBub3QganVzdCAtZWFiaS4KLQotTW9uIEp1bCAgMyAxMzo0NDo1MSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtmaWxlLmluIChETExUT09MX0ZPUl9UQVJHRVQpOiBOZXcgbmFtZSwgcGFzcyBpdCBkb3duLgotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluICh3aW4zMik6IE5ldyB0YXJnZXQgYW5kIGhvc3QuCi0KLVdlZCBKdW4gMjggMjM6NTc6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgaTM4Ni1wZSBjb25maWd1cmF0aW9uLgotCi1GcmkgSnVuIDIzIDE0OjI4OjQ0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWJ1aWxkLmluIChpbnN0YWxsKTogSW5zdGFsbCBHREIgYWZ0ZXIgTEQuCi0KLVRodSBKdW4gMjIgMTc6MTA6NTMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChlbGYvbWlwcy5oKTogQWx3YXlzIGZvcndhcmQtaW5jbHVkZSwgbmVlZGVkCi0JZm9yIEdEQiB0byBidWlsZC4KLQotV2VkIEp1biAyMSAxNToxNzozMCAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIHRlc3RzdWl0ZTogTmV3IGRpcmVjdG9yeSBmb3IgY3VzdG9tZXIgYWNjZXB0YW5jZSBhbmQgd2hvbGUgdG9vbAotCWNoYWluIHRlc3RzLgotCi1XZWQgSnVuIDIxIDE2OjUwOjI5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgcGVyLWhvc3QgbGluZSBpc24ndCBmb3VuZCwgYnV0IEFDX09VVFBVVCBpcyBmb3VuZAotCWFuZCBhIGNvbmZpZ3VyZSBzY3JpcHQgZXhpc3RzLCBydW4gaXQgaW5zdGVhZC4KLQotVGh1IEp1biAxNSAyMTowOToyNCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLCBmb3IgYWxwaGEtZGVjLXdpbm50My41IGFuZCAgQ3JheXMuCi0KLVR1ZSBKdW4gMTMgMjE6NDM6MjcgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBidWlsZF97Y3B1LHZlbmRvcixvcyxhbGlhc30gdG8gaG9zdCB2YWx1ZXMgd2hlbgotCS0tYnVpbGQgaXNuJ3Qgc3BlY2lmaWVkLgotCi1Nb24gSnVuICA1IDE4OjI2OjM2IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUElDRkxBRywgUElDRkxBR19GT1JfVEFSR0VUKTogTmV3IG1hY3Jvcy4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgdGhlbS4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRGl0dG8uCi0KLQkqIGNvbmZpZy9tPy0qcGljOiBEZWZpbmUgUElDRkxBRyogaW5zdGVhZCBvZiBMSUIqRkxBR1MqLgotCi1XZWQgTWF5IDMxIDIyOjI3OjQyIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1saWJnKyspOiBEZXBlbmQgb24gYWxsLWxpYnN0ZGMrKy4KLQotVGh1IE1heSAyNSAyMjo0MDo1OSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRW5hYmxlIGFsbCBwYWNrYWdlcyBmb3IKLQkgIGkzODYtdW5rbm93bi1uZXRic2QuCi0KLVNhdCBNYXkgMjAgMTM6MjI6MzEgMTk5NSAgQW5nZWxhIE1hcmllIFRob21hcyAgPGFuZ2VsYUBjaXJkYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBjb25maWd1cmUgdGsgZm9yIGkzODYtZ28zMgotCWhvc3RlZCBidWlsZHMgKERPUyBidWlsZHMpCi0KLVRodSBNYXkgMTggMTg6MDg6NDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmb3IgQVJNIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSaWNoYXJkIEVhcm5zaGF3OgotCSogY29uZmlnLnN1YjogSGFuZGxlIGFybWViIGFuZCBhcm1lbC4KLQkqIGNvbmZpZ3VyZS5pbjogT21pdCBhcm0gbGlua2VyIG9ubHkgZm9yIHJpc2NpeC4KLQotVGh1IE1heSAxMSAxNzoyMzoyNiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLgotCi1UdWUgTWF5ICA5IDE1OjUyOjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgcG93ZXJwY2xlIGFzIHRoZSBsaXR0bGUgZW5kaWFuIHZhcmllbnQgb2YKLQl0aGUgUG93ZXJQQy4gIFJlY2dvbml6ZSBwcGMgYXMgYSBQb3dlclBDIHZhcmlhbnQsIGFuZCBwcGNsZSBhcyBhCi0JcG93ZXJwY2xlIHZhcmlhbnQuICBDb252ZXJ0IHBlbnRpdW0gaW50byBpNTg2LCBub3QgaTQ4Ni4gIEFkZCBwNQotCWFsaWFzIGZvciBpNTg2LiAgTWFwIG5ldyB4ODYgdmFyaWFudHMgcDYsIGs1LCBuZXhnZW4gaW50byBpNTg2Ci0JdGVtcG9yYXJpbHkuCi0KLVR1ZSBNYXkgIDIgMTY6Mjk6NDEgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1saXRlcyopOiBUcmVhdCBsaWtlIGhwcGEqLSotKmVsZiouCi0KLVN1biBBcHIgMzAgMjE6Mzg6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtbGl0ZXMqIGFzIGEgYmFzaWMgc3lzdGVtIHR5cGUuCi0KLVRodSBBcHIgMjcgMTE6MzM6MjkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBDaGVjayBmb3Igd2hldGhlciB0aGUgcHJlLUJGRCBsaW5rZXIgaXMKLQlpbnN0YWxsZWQsIGFuZCBpZiBzbyByZXR1cm4gbGludXhvbGRsZCBhcyB0aGUgc3lzdGVtIG5hbWUuCi0KLVdlZCBBcHIgMjYgMTA6NTk6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIGhwcGExLjEtaHAtbGl0ZXMgc3VwcG9ydC4KLQotVHVlIEFwciAyNSAxMTowODoxMSAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciBtNjhrLXZ4d29ya3M1LjEuCi0KLVdlZCBBcHIgMTkgMTc6MDI6NDMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXg2KTogVXNlIG1oLWlyaXg1LgotCi1GcmkgQXByIDE0IDE1OjIxOjE3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nY2MpOiBEZXBlbmQgb24gYWxsLWxkIChmb3IgbGliZ2NjMS10ZXN0KS4KLQotV2VkIEFwciAxMiAxNjowNjowMSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogdGVzdC1idWlsZC5tazogRW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gSVJJWCA1IGFuZAotICAgICAgICBPU0YvMS4gIEZpeCBjb21waWxlciBmbGFncy4KLQkqIGJ1aWxkLWFsbC5tazogU3VwcG9ydCBMaW51eCBhbmQgT1NGLzEgMy4wLiAgRml4IGNvbXBpbGVyIGZsYWdzLgotCi1UdWUgQXByIDExIDE4OjU1OjQwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIC0td2l0aC1uZXdsaWIuCi0JKHNwYXJjLSotc3Vub3M0Kik6IEJ1aWxkIHNpbSwgZGVqYWdudSwgZXhwZWN0LCB0Y2wgaWYgY3Jvc3MgdGFyZ2V0LgotCi1Nb24gQXByIDEwIDExOjQyOjIyIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgotCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBnZW5lcmljIGluY2x1ZGUgZm9yd2FyZHMgZm9yIGNwdS1zcGVjaWZpYwotCWluY2x1ZGUgZmlsZXMgaW4gYW91dCBhbmQgZWxmIGRpcmVjdG9yaWVzLgotCi0JKiBtcHctY29uZmlndXJlOiBBZGRlZCBjb3B5cmlnaHQuCi0JKiBtcHctY29uZmlnLmluOiBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgcmVxdWlyZWQgYnVpbGQgdG9vbHMuCi0JKHRhcmdldF9saWJzKTogQWRkIG5ld2xpYi4KLQkodGFyZ2V0X3Rvb2xzKTogQWRkIGV4YW1wbGVzLgotCShSZWFkIE1lKTogR2VuZXJhdGUgYXMgIlJlYWQgTWUgZm9yIE1QVyIgaW5zdGVhZC4KLQkqIG1wdy1idWlsZC5pbjogQmFzZSBzdWItYnVpbGRzIG9uIGFsbC1mb28gaW5zdGVhZCBvZiBkby1mb28uCi0JKGFsbC1ieWFjYywgZG8tYnlhY2MsIGFsbC1mbGV4LCBkby1mbGV4LCBkby1uZXdsaWIpOiBOZXcgYWN0aW9ucy4KLQkoZG8tZ2FzLCBkby1nY2MsIGRvLWdkYiwgZG8tbGQpOiBCdWlsZCBWZXJzaW9uLnIgZmlyc3QuCi0KLQkqIG1wdy1jb25maWd1cmU6IFJlbW92ZSBzdWJkaXItc3BlY2lmaWMgbWFrZWZpbGUgaGFja2VyeSwKLQlkZWxldGUgbWsudG1wIGFmdGVyIHVzaW5nIGl0LgotCi0JKiBtcHctYnVpbGQuaW4gKGFsbCk6IERpc3BsYXkgc3RhcnQgYW5kIGVuZCB0aW1lcy4KLQotCSogbXB3LWNvbmZpZ3VyZSAoaG9zdF9jYW5vbmljYWwpOiBTZXQuCi0JKHRhcmdldF9jcHUpOiBBbHdheXMgYWRkIHRvIG1ha2VmaWxlcy4KLQkoQVJDSERFRlMsIEVNVUwpOiBBZGQgdG8gbWFrZWZpbGUgb25seSBpZiBub25lbXB0eS4KLQkoVE1fRklMRSwgWE1fRklMRSwgTk1fRklMRSk6IE5vIGxvbmdlciBhZGQgdG8gbWFrZWZpbGUuCi0JKG1wdy1taC1tcHcpOiBMb29rIGZvciBpbiBzcmNkaXIgYW5kIHNyY3Jvb3QuCi0JVXNlIHNlZCBpbnN0ZWFkIG9mIG1wdy1lZGl0LXByZWZpeCB0byBlZGl0IHByZWZpeCBkZWZpbml0aW9ucy4KLQotCSogbXB3LWJ1aWxkLmluOiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQotCSogbXB3LWNvbmZpZ3VyZSAoaG9zdF9hbGlhcywgdGFyZ2V0X2FsaWFzKTogUmVuYW1lIGZyb20gaG9zdGFsaWFzCi0JYW5kIHRhcmdldGFsaWFzLCBhZGQgaW50byBnZW5lcmF0ZWQgTWFrZWZpbGUuCi0JKG1rLnRtcCk6IElmIHByZXNlbnQsIGFkZCBpbnRvIGdlbmVyYXRlZCBNYWtlZmlsZS4KLQkqIG1wdy1idWlsZC5pbiAoYWxsLWdhcyk6IEJ1aWxkIGNvbmZpZy5oIGZpcnN0IGJlZm9yZSBnYXMgcHJvcGVyLgotCi0JKiBtcHctY29uZmlndXJlIChjb25maWcuc3RhdHVzKTogV3JpdGUgb25seSBpZiBjaGFuZ2VkLgotCSogbXB3LWNvbmZpZy5pbiAocmVhZGxpbmUpOiBDb25maWd1cmUgaXQgKG5vdCBidWlsdCwganVzdCB1c2VkIGZvcgotCWRlZmluaXRpb25zKS4KLQotCSogbXB3LWNvbmZpZy5pbiAoZWxmL21pcHMuaCk6IEFkZCBhIGZvcndhcmQgaW5jbHVkZS4KLQotCSogbXB3LWNvbmZpZy5pbjogRm9yd2FyZC1pbmNsdWRlIG1vc3QgLmggZmlsZXMgaW4gaW5jbHVkZSBpbnRvCi0JZXh0cmEtaW5jbHVkZS4KLQkocmVhZGxpbmUpOiBEb24ndCBidWlsZC4KLQltcHctYnVpbGQuaW4gKGluc3RhbGwpOiBJbnN0YWxsIEdEQi4KLQotCSogbXB3LWNvbmZpZ3VyZSAocHJlZml4LCBtcHdfcHJlZml4KTogSGFuZGxlIGl0LgotCSogbXB3LWNvbmZpZy5pbiAobW1hbGxvYywgcmVhZGxpbmUpOiBEb24ndCBjb25maWd1cmUuCi0JKiBtcHctYnVpbGQuaW4gKHRoaXNzY3JpcHQpOiBSZW5hbWUgdG8gVGhpc1NjcmlwdC4KLQlVc2UgbXB3LWJ1aWxkIGluc3RlYWQgb2YgQnVpbGRQcm9ncmFtIGV2ZXJ5d2hlcmUuCi0JKG1tYWxsb2MsIHJlYWRsaW5lKTogRG9uJ3QgYnVpbGQuCi0JKiBtcHctUkVBRE1FOiBOZXcgZmlsZSwgYmFzaWMgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgTVBXIHBvcnQuCi0KLQkqIG1wdy1jb25maWcuaW46IFVzZSBmb3J3YXJkLWluY2x1ZGUgdG8gY3JlYXRlIGluY2x1ZGUgZmlsZXMuCi0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBtb3JlIHRoaW5ncyB0byB0aGUgdG9wIG9mIGVhY2ggY29uZmlndXJlZAotCU1ha2VmaWxlLCBpbmNsdWRpbmcgY29udGVudHMgb2YgY29uZmlnL21wdy1taC1tcHcuCi0JKiBtcHctY29uZmlnLmluIChleHRyYS1pbmNsdWRlKTogQ3JlYXRlIHRoaXMgZGlyZWN0b3J5IGFuZCBmaWxsIGl0Ci0Jd2l0aCBQb3NpeC1saWtlIGluY2x1ZGUgZmlsZXMgd2hlbiBjb25maWd1cmluZy4KLQotCSogY29uZmlnLnN1YiAoYXBwbGUsIG1hYywgbXB3KTogQWRkIHZhcmlvdXMgYWxpYXNlcy4KLQotCSogbXB3LWJ1aWxkLmluOiBOZXcgZmlsZSwgdG9wLWxldmVsIGJ1aWxkIHNjcmlwdCBmcmFnbWVudCBmb3IgTVBXLgotCSogbXB3LWNvbmZpZ3VyZTogTmV3IGZpbGUsIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIE1QVy4KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBjb25maWcgZnJhZ21lbnQgZm9yIE1QVy4KLQotRnJpIEFwciAgNyAxOTozMzoxNiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X2xpYnMpOiBSZW1vdmUgZ2xvYiwgc2luY2UgaXQgaXMgZ29uZSBmcm9tIHRoZQotCXNvdXJjZXMuCi0KLUZyaSBNYXIgMzEgMTE6MzY6MTcgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgZW1wdHkgR0RCX05MTV9ERVBTIHZhci4KLQotCSogY29uZmlndXJlLmluKHRhcmdldF9tYWtlZmlsZV9mcmFnKTogdXNlIGNvbmZpZy9tdC1uZXR3YXJlCi0JZm9yIG5ldHdhcmUgdGFyZ2V0cy4KLQotVGh1IE1hciAzMCAxMzo1MTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIGluIHJlY2VudCBGU0YgY2hhbmdlcy4gIFJlbW92ZSBsaW51eCBzcGVjaWFsCi0JY2FzZXMuCi0KLVR1ZSBNYXIgMjggMTQ6NDc6MzQgMTk5NSAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCWJ1aWxkLWFsbC5tayxjb25maWcvbWgtc29sYXJpczogIHJldmVydCB0aGVzZSB0d28gY2hhbmdlczoKLQotCVR1ZSBNYXIgMzAgMTA6MDM6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JCSogYnVpbGQtYWxsLm1rOiBVc2UgQ0M9Y2MgLVhzIG9uIFNvbGFyaXMuCi0KLQlNb24gTWFyIDI5IDE5OjU5OjI2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCQkqIGNvbmZpZy9taC1zb2xhcmlzOiBTdW5QUk8gQyBuZWVkcyAtWHMgdG8gYmUgYWJsZSB0byBnZXQgYQotCQl3b3JraW5nIHhtYWtlZmlsZSBmb3IgRW1hY3MuCi0KLVR1ZSBNYXIgMjEgMTA6NDM6MzIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGdsb2IvKjogUmVtb3ZlZC4gIFNjaGF1ZXIncyAyNCBGZWIgMTk5NCByZWFkbGluZSBjaGFuZ2UgbWFkZSB1cwotCXN0b3AgdXNpbmcgaXQuCi0JKiBNYWtlZmlsZS5pbjogTnVrZSBhbGwgcmVmZXJlbmNlcyB0byBnbG9iIHN1YmRpcmVjdG9yeS4KLQotVGh1IE1hciAxNiAxMzozNTozMCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGaXggLS1lbmFibGUtc2hhcmVkIGxvZ2ljIGluIHBlci1ob3N0LgotCi1Nb24gTWFyIDEzIDEyOjMzOjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLWhwLWhwdXhbNzhdKik6IFVzZSBtaC1ocHV4OC4KLQotTW9uIE1hciAgNiAxMDoyMTo1OCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBnYXMgb24gQUlYLCBmb3IKLQlwb3dlcnBjKi0qLWFpeCogYXMgd2VsbCBhcyBmb3IgcnM2MDAwKi0qLWFpeCouCi0KLVdlZCBNYXIgIDEgMTI6NTE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEZpeCAtLWNhY2hlLWZpbGUgdG8gd29yayBpZiB0aGUgZmlsZSBhcmd1bWVudCBpcyBhCi0JcmVsYXRpdmUgcGF0aC4KLQotVHVlIEZlYiAyOCAxNzozNjowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgdGhlIC0tY2FjaGUtZmlsZSBpcyB1c2VkLCBwYXNzIGl0IGRvd24gdG8KLQljb25maWd1cmUgaW4gc3ViZGlyZWN0b3JpZXMuCi0KLU1vbiBGZWIgMjcgMTI6NTI6NDYgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogYWRkIHZ4d29ya3MyOWsgY29uZmlndXJhdGlvbi4KLQotRnJpIEZlYiAxMCAxNjoxMjoyNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogRG8gImRpc3RzdHVmZiIgcGFydCBxdWlldGx5LgotCi1TdW4gRmViICA1IDE0OjE2OjM1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1pbmktbWVyZ2Ugd2l0aCBnY2MvY29uZmlnLnN1Yi4KLQotU2F0IEZlYiAgNCAxMjoxMTozNSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoSVJJWCk6IFNlZCAtIHRvIF8uCi0KLUZyaSBGZWIgIDMgMTE6NTQ6NDIgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc291cmNlLXZhdWx0LCBiaW5hcnktdmF1bHQpOiBOZXcgdGFyZ2V0cy4KLQotVGh1IEphbiAyNiAxMzowMDoxMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIC1lYWJpIGFzIGEgYmFzaWMgc3lzdGVtIHR5cGUuCi0KLVRodSBKYW4gMTIgMTM6MTM6MjMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlX3NoYXJlZCBzdHVmZik6IEZpeCB0eXBvLgotCi1UaHUgSmFuIDEyIDAxOjM2OjUxIDE5OTUgIGRlYW5tQG1lZHVsbGEuTEFCUy5URUsuQ09NIChEZWFuIE1lc3NpbmcpCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBGaXggdHlwbyBpbiBwYXNzaW5nIExJQkNYWEZMQUdTKi4KLQotV2VkIEphbiAxMSAxNjoyOTo1MyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpOiBBZGQgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMuCi0KLU1vbiBKYW4gIDkgMTI6NDg6MDEgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwLSotKik6IERvbid0IGJ1aWxkIGdhcy4KLQotV2VkIEphbiAgNCAyMzo1Mzo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVc2UgL3gveC8gaW5zdGVhZCBvZiAvYnJva2Vuc2VkL2Jyb2tlbnNlZC8sIHRvCi0JcmVkdWNlIGNvbW1hbmQgbGluZSBsZW5ndGguCi0JKEFTX0ZPUl9UQVJHRVQpOiBDaGVjayBmb3IgYXMubmV3LCBub3QgTWFrZWZpbGUuCi0JKE5NX0ZPUl9UQVJHRVQpOiBDaGVjayBmb3Igbm0ubmV3LCBub3QgTWFrZWZpbGUuCi0KLVdlZCBKYW4gIDQgMTM6MDI6MzkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIGZyb20gRlNGLgotCi1UaHUgRGVjIDE1IDE3OjExOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCB1c2UgJCB3aGVuIGhhbmRsaW5nIHByb2dyYW1fc3VmZml4LgotCi1Nb24gRGVjIDEyIDEyOjA5OjM3IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENvbmZpZ3VyZSB0ayBmb3IgaHBwYS9ocHV4LgotCi1GcmkgRGVjICAyIDE1OjU1OjM4IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTElCR1hYX1NVUFBPUlRfRElSUyk6ICBBZGQgbGlic3RkYysrLgotCi1UdWUgTm92IDI5IDE5OjM3OjU2IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogIE1vdmUgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZSBmcm9tIENYWEZMQUdTCi0JdG8gTElCQ1hYRkxBR1MuICBUZXN0cyBhcmUgYmV0dGVyIHJ1biB3aXRob3V0IGl0LgotCi1XZWQgTm92IDIzIDEwOjI5OjI1IDE5OTQgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pc3BlbGwpOiBEZXBlbmQgb24gYWxsLWVtYWNzMTkgaW5zdGVhZCBvZiBhbGwtZW1hY3MuCi0KLU1vbiBOb3YgMjEgMTE6MTQ6MDEgMTk5NCAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlKik6IERvbid0IGNvbmZpZ3VyZSB4aWJlcnR5LgotCi1Nb24gTm92IDE0IDA4OjQ5OjE1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbW92ZSB0ayBmcm9tIG5hdGl2ZV9vbmx5IGxpc3QuCi0KLUZyaSBOb3YgMTEgMTU6MzE6MjYgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IEFkZCBtaXBzLW5jZC1lbGYgdGFyZ2V0IHRvIHN1bjQgdGFyZ2V0cwotCSAgZm9yIHNwZWNpYWwgTkNEIGJ1aWxkLgotCi1Nb24gTm92ICA3IDIwOjU4OjE3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBSZW1vdmUgY29uZmlndXJlLmJhdCBhbmQKLQltYWtlYWxsLmJhdCwgdGhleSdyZSBvbmx5IHVzZWZ1bCBmb3IgYmludXRpbHMgc25hcHNob3RzLgotCShiaW51dGlscy50YXIuZ3osIGdhcytiaW51dGlscy50YXIuZ3opOiBBZGQgY29uZmlndXJlLmJhdCBhbmQKLQltYWtlYWxsLmJhdCB0byBzcGVjaWZpZWQgU1VQUE9SVF9GSUxFUy4KLQotTW9uIE5vdiAgNyAxNzoyNToxOCAxOTk0ICBCaWxsIENveCAgKGJpbGxAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogQWRkIEVyaWNzc29uIHRhcmdldHMgdG8gc3VuNCBhbmQgc29sYXJpcwotCSAgaG9zdHMuICBBZGQgIEJOUidzIHN1bjQgdGFyZ2V0IHRvIHNvbGFyaXMgaG9zdCwgc28gdGhlaXIKLQkgIGJ1aWxkLWZyb20tc291cmNlIHdpbGwgYmUgdGVzdGVkIGluLWhvdXNlIGZpcnN0LgotCi1TYXQgTm92ICA1IDE4OjQzOjMwIDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTElCQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShDRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShMSUJDRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShMSUJDWFhGTEFHUyk6IERpdHRvLgotCShDWFhGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCi0JKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyB0aGVtLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbVt0aF0tKnBpYzogU3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQuCi0KLVNhdCBOb3YgIDUgMTU6NDQ6MDAgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiAgSW5jbHVkZSBsaWJzdGRjKysgYWdhaW4uCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YgKGZvciBGcmVlQlNEKS4KLQotVGh1IE5vdiAgMyAxNjozMjozMCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogSW5jbHVkZSBjb25maWd1cmUuYmF0IGFuZAotCW1ha2VhbGwuYmF0LgotCShESVNURE9DRElSUyk6IEFkZCBgZXRjJy4KLQkoRVRDX1NVUFBPUlRfUEZYKTogTmV3IHZhcmlhYmxlLgotCSh0YXopOiBJbmNsdWRlIGFueXRoaW5nIGZyb20gZXRjIHN0YXJ0aW5nIHdpdGggYSB3b3JkIGluCi0JRVRDX1NVUFBPUlRfUEZYLgotCi1XZWQgT2N0IDI2IDE2OjE5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogVXBkYXRlIGZvciByZWNlbnQgRlNGIGNoYW5nZXMuICBSZW1vdmUgb2Jzb2xldGUKLQloODMwMGhkcyBlbnRyeS4gIEFkZCAtd2luZG93cyogYW5kIC1vc3ggYXMgYmFzaWMgb3MuICBNaW5vcgotCXNwYWNpbmcgY2hhbmdlcy4KLQotVGh1IE9jdCAyMCAxODo0MTo1NiAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6ICBSZW1vdmUgbGlic3RkYysrIGZvciBsaWJnKystMi42LjEuCi0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIHdpdGggRlNGLgotCSogY29uZmlndXJlLmluOiAgTWF0Y2ggb24gaT84Ni1uY3Itc3lzdjQuMywgbm90IGk/ODYtbmNyLXN5c3Y0My4KLQotVGh1IE9jdCAyMCAxOToyNjo1NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNpbmNlIHRoZSAidHJhcCAwIiBoYW5kbGVyIHdpbGwgb3ZlcnJpZGUgdGhlIGV4aXQKLQlzdGF0dXMgb24gbWFueSBzeXN0ZW1zLCBvbmx5IHVzZSBpdCBmb3IgImV4aXQgMSIsIGFuZCBtYWtlIGl0IHNldAotCWEgbm9uLXplcm8gZXhpdCBzdGF0dXM7IHJlc2V0IGl0IGJlZm9yZSAiZXhpdCAwIi4gIEFsc28sIGNoZWNrCi0JZXhpdCBzdGF0dXMgb2YgY29uZmlnLnN1YiwgYW5kIGVycm9yIG91dCBpZiBpdCBmYWlsZWQuCi0KLVdlZCBPY3QgMTkgMTg6NDk6NTUgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogKEFMTF9UQVJHRVRfTU9EVUxFUyxJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBCdWlsZAotCWFuZCBpbnN0YWxsIGxpYmdsb3NzLgotCi1UdWUgT2N0IDE4IDE1OjI1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iaW51dGlscyk6IERlcGVuZCB1cG9uIGFsbC1ieWFjYy4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBlbWFjcyBvbiBJcml4IDUuCi0KLU1vbiBPY3QgMTcgMTY6MjI6MTIgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlKik6IEFkZCBsaWJpby4KLQotVGh1IE9jdCAxMyAxNTo1MToyMCAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBsaWJzdGRjKysuCi0JKENIRUNLX1RBUkdFVF9NT0RVTEVTKTogRGl0dG8uCi0JKElOU1RBTExfVEFSR0VUX01PRFVMRVMpOiBEaXR0by4KLQkoVEFSR0VUX0xJQlMpOiBEaXR0by4KLQkoYWxsLWxpYnN0ZGMrKyk6IE5vdGUgZGVwZW5kZW5jaWVzLgotCi1UaHUgT2N0IDEzIDAxOjQzOjA4IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBBZGQgZ2FzLgotCi1UdWUgT2N0IDExIDEyOjEyOjI5IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ1hYRkxBR1MpOiBVc2UgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMgaW5zdGVhZCBvZgotCS1mZXh0ZXJuYWwtdGVtcGxhdGVzLgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogQWRkIGxpYnN0ZGMrKy4KLQkobm9jb25maWdkaXJzKTogQWRkIGxpYnN0ZGMrKyBhcyBhcHByb3ByaWF0ZS4KLQotVGh1IE9jdCAgNiAxODowMDo1NCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLgotCi1UdWUgT2N0ICA0IDEyOjA1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBVc2UgJHtjb25maWdfc2hlbGx9IHdoZW4gcnVubmluZyAke2NvbmZpZ3N1Yn0uCi0KLU1vbiBPY3QgIDMgMTQ6Mjg6MzQgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTm8gbG9uZ2VyIHJlY29nbml6ZSBoODMwMGguCi0KLU1vbiBPY3QgIDMgMTI6NDA6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZW1vdmUgZXh0cmFuZW91cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbmZpZy5zdWIgYW5kCi0JZ2NjL2NvbmZpZy5zdWIuCi0KLVNhdCBPY3QgIDEgMDA6MjM6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRkRJUlMpOiBBZGQgZ2FzLgotCi1UaHUgU2VwIDIyIDE5OjA0OjU1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIENPUFlJTkcuTkVXTElCOiBOZXcgZmlsZS4KLQotTW9uIFNlcCAxOSAxODoyNTo0MCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChIUC1VWCk6ICBQYXRjaCBmcm9tIEhhcmxhbiBTdGVubgotCTxoYXJsYW5AbGFuZG1hcmsuY29tPiB0byBhbHNvIGVtaXQgcmVsZWFzZSBsZXZlbC4KLQotV2VkIFNlcCAgNyAxMzoxNToyNSAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoc3VuNCo6U3VuT1M6KjoqKTogQ2hhbmdlICctSkwnIHRvICdfSkwnLgotCi1UdWUgU2VwICA2IDIzOjIzOjE4IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgTWVyZ2UgbmV4dHN0ZXAgY2xlYW51cCBmcm9tIEZTRi4KLQotTW9uIFNlcCAgNSAwNTowMTozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhcm0tKi0qKTogRG9uJ3QgY29uZmlndXJlIGxkIGZvciB0aGlzIHRhcmdldC4KLQotVGh1IFNlcCAgMSAwOTozNTowMCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUpOiBkb24ndCBjb25maWd1cmUgbGliZysrLCBsaWJpbywKLQkgIGxpYnJ4LCBvciBuZXdsaWIuCi0KLVdlZCBBdWcgMzEgMTM6NTI6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLWRlYy1vc2YqKTogVXNlIG9zZiosIG5vdCBvc2YxKi4gIERvbid0Ci0JY29uZmlndXJlIGxkLS1pdCB3b3JrcywgYnV0IGl0IGRvZXNuJ3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi1TdW4gQXVnIDI4IDE4OjEzOjQ1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKCotdW5rbm93bi1mcmVlYnNkKik6ICBHZXQgcmlkIG9mIHBvc3NpYmxlCi0JdHJhaWxpbmcgIihSZWxlYXNlKSIgaW4gdmVyc2lvbiBzdHJpbmcuCi0JUGF0Y2ggZnJvbSBQYXVsIFJpY2hhcmRzIDxwYXVsQGlzbC5jZi5hYy51az4uCi0KLVNhdCBBdWcgMjcgMTU6MDA6NDkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEZpeCBpNDg2LW5jci1zeXN2NDMgLT4gaTQ4Ni1uY3Itc3lzdjQuMy4KLQlGaXggdHlwZTogKi1uZXh0LW5lc3RzdGVwIC0+ICotbmV4dC1uZXh0c3RlcC4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0Y6Ci0KLQlGcmkgQXVnIDI2IDE4OjQ1OjI1IDE5OTQgIFBoaWxpcHBlIERlIE11eXRlciAocGhkbUBpbmZvLnVjbC5hYy5iZSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgcG93ZXJwYy1pYm0tYWl4My4yLjUuCi0KLQlXZWQgQXByIDIwIDA2OjM2OjMyIDE5OTQgIFBoaWxpcHBlIERlIE11eXRlciAgKHBoZG1AaW5mby51Y2wuYWMuYmUpCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIFVuaXhXYXJlIDEuMSAoVU5BTUVfU1lTVEVNIGlzIFNZU1RFTV9WCi0JaW5zdGVhZCBvZiBVTklYX1NWIGZvciBVbml4V2FyZSAxLjApLgotCi1TYXQgQXVnIDI3IDAxOjU2OjMwIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2RiKTogIEFkZCBkZXBlbmRlbmNpZXMgb24gYWxsLWdjYyBhbmQgYWxsLWxkCi0JdG8gbWFrZSBnZGIvbmxtLyogYnVpbGQgYWZ0ZXIgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIuCi0KLUZyaSBBdWcgMjYgMTQ6MzA6MDUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAobmV0YnNkLCBmcmVlYnNkLCBsaW51eCk6ICBBY2NlcHQgYW55IG1hY2hpbmUsCi0Jbm90IGp1c3QgaVszNF04Ni4KLQkobTY4ay1hdGFyaS1zeXN2NCk6ICBSZWxvY2F0ZSB0byBtYXRjaCBGU0YgdmVyc2lvbi4KLQotCSogY29uZmlnLmd1ZXNzOiAgTW9yZSBtZXJnZXMgZnJvbSB0aGUgRlNGOgotCi0JQWRkIGEgc3BhY2UgYmVmb3JlIGZ1bmN0aW9uIGNhbGwgb3IgbWFjcm8gaW52b2NhdGlvbi4KLQotCVR1ZSBNYXkgMTAgMTY6NTM6NTUgMTk5NCAgUm9sYW5kIE1jR3JhdGggKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCB0cmFwIGNtZCB0byByZW1vdmUgZHVtbXkuYyBhbmQgZHVtbXkgd2hlbgotCWludGVycnVwdGVkLgotCi0JV2VkIEFwciAyMCAxODowNzoxMyAxOTk0ICBSb2xhbmQgTWNHcmF0aCAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzcyAoZHVtbXkuYyk6IFJlZGlyZWN0IHN0ZGVyciBmb3IgYGhvc3RpbmZvJyBjb21tYW5kLgotCShkdW1teSk6IFJlZGlyZWN0IHN0ZGVyciBmcm9tIGNvbXBpbGF0aW9uIG9mIGR1bW15LmMuCi0KLQlTYXQgQXByICA5IDE0OjU5OjI4IDE5OTQgIENocmlzdGlhbiBLcmFueiAgKGtyYW56QHNlbnQ1LnVuaS1kdWlzYnVyZy5kZSkKLQotCSogY29uZmlnLmd1ZXNzOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIE5lWFRTdGVwIDIuMSBhbmQgMy54LgotCi1GcmkgQXVnIDI2IDEzOjQyOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBY2NlcHQgYW5kIGlnbm9yZSAtLWNhY2hlKiwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotCW5ldyBhdXRvY29uZi4KLQotRnJpIEF1ZyAyNiAxMzowNToyNyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0Y6Ci0KLQlUaHUgQXVnIDI1IDIwOjI4OjUxIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIDxybXNAbW9sZS5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzIChQeXJhbWlkKjpPU3gqOio6Kik6IE5ldyBjYXNlLgotICAgICAgICAoUEFUSCk6IEFkZCAvLmF0dGJpbiBhdCBlbmQgZm9yIGZpbmRpbmcgdW5hbWUuCi0gICAgICAgIChkdW1teS5jKTogSGFuZGxlIGk4NjAtYWxsaWFudC1ic2QuICBGb2xsb3cgd2hpdGVzcGFjZSBjb252ZW50aW9ucy4KLQotCVdlZCBBdWcgMTcgMTg6MjE6MDIgMTk5NCAgVG9yIEVnZ2UgICh0ZWdnZUBwdnYudW5pdC5ubykKLQotICAgICAgICAqIGNvbmZpZy5ndWVzcyAoTTg4KjpEb2xwaGluT1M6KjoqKTogTmV3IGNhc2UuCi0KLQlUaHUgQXVnIDExIDE3OjAwOjEzIDE5OTQgIFN0YW4gQ294ICAoY294c0BkZy1ydHAuZGcuY29tKQotCi0gICAgICAgICogY29uZmlnLmd1ZXNzIChBVmlpT046ZGd1eDoqOiopOiBVc2UgVEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0UKLSAgICAgICAgdG8gc2VsZWN0IHdoZXRoZXIgdG8gdXNlIEVMRiBvciBDT0ZGLgotCi0JU3VuIEp1bCAyNCAxNjoyMDo1MyAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICA8cm1zQG1vbGUuZ251LmFpLm1pdC5lZHU+Ci0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpODYwLXN0YXJkZW50LXN5c3YgYW5kIGk4NjAtdW5rbm93bi1zeXN2LgotCi0JU3VuIE1heSAgMSAxMDoyMzoxMCAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogR3Vlc3MgdGhlIE9TIHZlcnNpb24gZm9yIEhQVVguCi0KLQlUdWUgTWFyICAxIDIxOjUzOjAzIDE5OTQgIEthcmwgSGV1ZXIgIChrd3poQGhhbC5nbnUuYWkubWl0LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzIChVTkFNRV9WRVJTSU9OKTogUmVjb2duaXplIGFpeDMuMi40IGFuZCBhaXgzLjIuNS4KLQotRnJpIEF1ZyAyNiAxMToxOTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIC0td2l0aC1oZWFkZXJzLCAtLXdpdGgtbGlicywgYW5kCi0JLS13aXRob3V0LW5ld2xpYi4KLQkqIE1ha2VmaWxlLmluIChhbGwteGliZXJ0eSk6IERlcGVuZCB1cG9uIGFsbC1sZC4KLQotV2VkIEF1ZyAyNCAxMjozNjo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLU1vbiBBdWcgMjIgMTA6NTg6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgKHZlcnNpb24pOiBBIGZldyBtb3JlIHR3ZWFrcyB0byBoZWxwIG1lc3NhZ2UuCi0KLUZyaSBBdWcgMTkgMTI6NDA6MjUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIChmb3Igbm93KSBsaWJyeCBhcyBhIGhvc3QgbGlicmFyeSwKLQlub3cgdGhhdCB3ZSdyZSBidWlsZGluZyBpdCBmb3IgdGFyZ2V0LgotCi1GcmkgQXVnIDE5IDEwOjQ5OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBGaXggdXAgaGVscCBtZXNzYWdlOyBmcm9tIGthcmxAb3dsLmhxLmlsZWFmLmNvbQotCShLYXJsIEJlcnJ5KS4KLQotVHVlIEF1ZyAxNiAxNjoxMTowOCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWxzbyBjb25maWd1cmUgbGlicnguCi0KLU1vbiBBdWcgMTUgMTY6NTE6NDUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIHZhcmlvdXMgcnVsZXMgdG8gcmVmbGVjdCB0aGF0IGxpYnJ4Ci0JaXMgbm93IG5lZWRlZCBmb3IgbGliZysrLgotCi1GcmkgQXVnIDEyIDE4OjA3OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IG1pcHM2NG9yaW9uIGFuZCBtaXBzNjRvcmlvbmVsIGFzIGEgQ1BVIG5hbWUuCi0KLU1vbiBBdWcgIDggMTE6MzY6MTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LgotCi1UaHUgQXVnICA0IDE2OjEyOjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBTaW1wbGlmeSBKdW4gMiAxOTk0IGNoYW5nZS4KLQotV2VkIEF1ZyAgMyAwNDo1ODoxNiAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNoYW5nZSBDQyB0byAvdXNyL2xhdGVzdC9iaW4vZ2NjIGZvciBseW54IGhvc3QgYnVpbGRzLCBzaW5jZQotCS9iaW4vZ2NjIGlzbid0IGdvb2QgZW5vdWdoIHRvIGJ1aWxkIGdjYy4KLQotV2VkIEp1bCAyNyAwOTowNzoxNCAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdEQl9TVVBQT1JUX0ZJTEVTKTogUmVtb3ZlCi0JKHNldHVwLWRpcnMtZ2RiLCBnZGIudGFyLmd6LCBtYWtlLWdkYi50YXIuZ3opOiAgUmVtb3ZlIG9sZCBydWxlcy4KLQkoZ2RiLnRhci5neik6IEFkZCBuZXcgcnVsZSB0byB1c2Ugc3RhbmRhcmQgZGlzdHJpYnV0aW9uIGJ1aWxkaW5nCi0JbWVjaGFuaXNtLgotCi1Nb24gSnVsIDI1IDExOjEwOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBXYXJuIGFib3V0IHVzZSBvZiAvdXNyL3VjYi9jYyBvbiBTb2xhcmlzLiAgRnJvbQotCUJpbGwgQ294IDxiaWxsQGN5Z251cy5jb20+LgotCi1TYXQgSnVsIDIzIDEyOjE5OjQ2IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgSVNDLiAgUGF0Y2ggZnJvbSBrd3poQGdudS5haS5taXQuZWR1LgotCi1GcmkgSnVsIDIyIDE3OjUzOjU5IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIFNlYXJjaCBjdXJyZW50IGRpciBmaXJzdCBpbiAuZ2RiaW5pdC4KLQotRnJpIEp1bCAyMiAxMToyODozMCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIFJlY29nbml6ZSBmcmVlYnNkIChtZXJnZWQgZnJvbSBnY2MgY29uZmlnLnN1YikuCi0KLVRodSBKdWwgMjEgMTQ6MTA6NTIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBSZWZlciB0byBOZVhUJ3Mgb3BlcmF0aW5nIHN5c3RlbSBhcyBuZXh0c3RlcC4KLQotCSogY29uZmlnLnN1YiAoY2FzZSAkYmFzaWNfbWFjaGluZSk6ICBSZS1vcmRlciB0aGUgY2FzZXMsIHRvIG1hdGNoCi0JdGhlIG9yZGVyIGluIHRoZSBGU0YgdmVyc2lvbiAod2hpY2ggaXMgbW9zdGx5IGFscGhhYmV0aGljYWwpLgotCU1lcmdlIGluIHNvbWUgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIGZyb20gdGhlIEZTRi4KLQotU2F0IEp1bCAxNiAxMjowMzowOCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG02OGstYXRhcmktc3lzdjQgYW5kIG04OGstaGFycmlzLWNzdXg3LgotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGN4dXg3LgotCSogY29uZmlndXJlLmluOiBVc2UgbWgtY3h1eCBmb3IgbTg4ay1oYXJyaXMtY3h1eCouCi0KLU1vbiBKdWwgMTEgMTQ6Mzc6MzkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBGaXggdHlwbyBwb3dlcnBjIC0+IHBvd2VycGMtKi4KLQotU2F0IEp1bCAgOSAxMzowMzo0MyAxOTk0ICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGJsdWVzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBgYWxsLWVtYWNzMTknIGRlcGVuZHMgb24gYGFsbC1ieWFjYycuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWVtYWNzMTkgYW5kIGluc3RhbGwtZW1hY3MxOSBydWxlcyAoaW4KLQlwYXJhbGxlbCB3aXRoIGFsbC1lbWFjcyBhbmQgaW5zdGFsbC1lbWFjcykuICBUb3AtbGV2ZWwgY29tbWFuZAotCWBtYWtlIGFsbC1lbWFjczE5IENDPWdjYycgbm93IGJlaGF2ZXMgYXMgYG1ha2UgYWxsLWVtYWNzIENDPWdjYycuCi0KLVRodSBKdW4gMzAgMTY6NTM6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rICgkKGhvc3QpLXN0YW1wLXN0YWdlMi1pbnN0YWxsZWQpOiBSZW1vdmUKLQkkKHJlbGJpbmRpcikvbWFrZSBiZWZvcmUgZG9pbmcgYGBtYWtlIGluc3RhbGwnJywgYW5kIHVzZQotCSQoR05VX01BS0UpIHdoaWxlIGRvaW5nIGl0LiAgQXZvaWRzIHByb2JsZW0gb24gU3VuT1Mgd2l0aAotCWluc3RhbGxpbmcgb3ZlciBydW5uaW5nIG1ha2UgYmluYXJ5LgotCSgkKGhvc3QpLXN0YW1wLXN0YWdlMy1pbnN0YWxsZWQpOiBMaWtld2lzZS4KLQotVHVlIEp1biAyOCAxMzo0MzoyNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgTWFjaC4KLQotTW9uIEp1biAyNyAxNjo0MToxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQ2hlY2sgJHtleGVjX3ByZWZpeG9wdGlvbn0sIG5vdCAke2V4ZWNfcHJlZml4fSwgdG8KLQlzZWUgd2hldGhlciAtLWV4ZWMtcHJlZml4IHdhcyB1c2VkLgotCi1TdW4gSnVuIDI2IDIxOjE1OjU0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBFeHBsaWNpdGx5IG1lbnRpb24gbGliZysrL1JFQURNRS4gIChab28ncyBpZGVhLikKLQotVHVlIEp1biAyMSAxMjo0NTo1NSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtbGlicnggdGFyZ2V0IHNpbWlsYXIgdG8gYWxsLWxpYnByb2MuCi0KLVdlZCBKdW4gIDggMjM6MTE6NTUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVhcnJhbmdlIHRlc3RzIGZvciBBbHBoYS1PU0YxIHRvIHByb3Blcmx5IGRlYWwKLQl3aXRoIHBvc3QgMS4yIHVuYW1lIGJvZ29zaXR5LgotCi1UaHUgSnVuICA5IDAwOjI3OjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBSZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIG9uIHJlY2VpcHQgb2YgYSBzaWduYWwuCi0KLVR1ZSBKdW4gIDcgMTI6MDY6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIHRoZXJlIGlzIGEgcGFja2FnZV9tYWtlZmlsZV9mcmFnLCByZW1vdmUKLQkke3N1YmRpcn0vTWFrZWZpbGUudGVtIGFmdGVyIGNvcHlpbmcgaXQgaW4uCi0KLU1vbiBKdW4gIDYgMjE6MzU6MDIgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBidWlsZF9hbGwubWs6IHN1cHBvcnQgcnM2MDAwIGx5bnggaWRlbnRpZmllcyBpdHNlbGYgYXMKLQlyczYwMDAtbHlueC1seW54b3MyLjIuMi4gIEFsc28sIHVzZSAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9iaW4vZ2NjCi0Jc2luY2UgL2Jpbi9nY2MgaXMgdG9vIGZlZWJsZSB0byBjb21waWxlIGEgbW9kZXJuIGdjYy4KLQotTW9uIEp1biAgNiAxNjowNjozNCAxOTk0ICBLYXJlbiBDaHJpc3RpYW5zZW4gKGthcmVuQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBicm91Z2h0IGRldm8vdGVzdC1idWlsZC5tayB1cGRhdGUtdG8tZGF0ZSB3aXRoIHByb2dyZXNzaXZlLwotCSAgdGVzdC1idWlsZC5tay4gQWRkIGx5bnggdGFyZ2V0cyBhbmQgaHBwYSBmbGFnIGluZm8uCi0KLVNhdCBKdW4gIDQgMTc6MjM6NTQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBtaC1uY3JzdnI0My4gIFBhdGNoIGZyb20KLQlUb20gTWNDb25uZWxsIDx0bWNjb25uZUBzZWRvbmEuaW50ZWwuY29tPi4KLQotRnJpIEp1biAgMyAxNzo0NzoyNCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChpMzg2LXVua25vd24tYnNkaSk6ICBObyBsb25nZXIgbmVlZCB0bwotCWNoZWNrICNpZiBkZWZpbmVkKF9fYnNkaV9fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKS4KLQotVGh1IEp1biAgMiAxODo1Njo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU2V0IHByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb24gY29ycmVjdGx5LgotCi1UaHUgSnVuICAyIDEwOjU3OjA2IDE5OTQgIEthcmVuIENocmlzdGlhbnNlbiAoa2FyZW5AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGJyb3VnaHQgYnVpbGQtYWxsLm1rIHVwZGF0ZS10by1kYXRlIHdpdGggcHJvZ3Jlc3NpdmUgYnVpbGQtYWxsLm1rLAotCSAgYWRkZWQgbmV3IHRhcmdldHMgYW5kIGhwcGEgaW5mby4KLQkKLVRodSBKdW4gIDIgMDA6MTI6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIGNvbmZpZy5ndWVzcyByZXN1bHQgaXMgYSBwcmVmaXggb2YgdGhlIHVzZXIKLQlzcGVjaWZpZWQgdGFyZ2V0LCBhc3N1bWUgYSBuYXRpdmUgYnVpbGQgYW5kIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQKLQl0YXJnZXQgYXMgdGhlIGhvc3QgYWxpYXMuICBSZW1vdmUgU3VuT1MgcGF0Y2ggc3VmZml4IHJlbW92YWwgaGFjay4KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIFN1bk9TIHBhdGNoIHN1ZmZpeCByZW1vdmFsIGhhY2suCi0KLQkqIE1ha2VmaWxlLmluIChDUk9TU19DSEVDS19NT0RVTEVTKTogUmVtb3ZlIGNoZWNrLWZsZXgsIHNpbmNlIGl0J3MKLQlpbiBOQVRJVkVfQ0hFQ0tfTU9EVUxFUy4KLQotV2VkIEp1biAgMSAxMDo0OTo0MSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW5hbWUgSE9TVF9PTkxZIHRvIE5BVElWRS4KLQkqIGNvbmZpZ3VyZTogRGVsZXRlIFN1bk9zIHBhdGNoIHN1ZmZpeCBmcm9tIGhvc3RfY2Fub25pY2FsCi0JICBhbmQgYnVpbGRfY2Fub25pY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSBwcmVwZW5kZWQgdG8gTWFrZWZpbGVzLgotCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudHMgZm9yIGVhc2llciBtYWludGVuYW5jZS4KLQotVHVlIE1heSAzMSAxOTozOTo0NyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtbGlicHJvYyB0YXJnZXQgc2ltaWxhciB0byBhbGwtZ3VpLgotCi1UdWUgTWF5IDMxIDE3OjE2OjMzIDE5OTQgIFRvbSBMb3JkICAobG9yZEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tfTU9EVUxFUyk6IHNwbGl0IGludG8KLQlIT1NUX09OTFlfQ0hFQ0tfTU9EVUxFUyBhbmQgQ1JPU1NfQ0hFQ0tfTU9EVUxFUy4KLQotVHVlIE1heSAzMSAxNjozNjozNiAxOTk0ICBQYXVsIEVnZ2VydCAgKGVnZ2VydEB0d2luc3VuLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChpMzg2LXVua25vd24tYnNkaSk6IE5ldyBzeXN0ZW0gdG8gZ3Vlc3MuCi0KLVdlZCBNYXkgMjUgMTY6NDc6MTAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWd1aSB0YXJnZXQgKGJ1dCBub3QgeWV0IGJ1aWxkIGJ5ICJhbGwiKS4KLQotVGh1IE1heSAyNiAwODo1MzoxOSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IE1vdmUgZGVsZXRpb24gb2YgcGF0Y2ggc3VmZml4IGZyb20gaGVyZS4uLgotCSogY29uZmlndXJlLmluOiBUbyBoZXJlLCBhdCBJYW4ncyBzdWdnZXN0aW9uLiAgVGhlIHRvcC0KLQkgIGxldmVsIHNjcmlwdHMgbWlnaHQgbmVlZCB0byBrbm93IG9mIGEgcGF0Y2ggbGV2ZWwuCi0KLVdlZCBNYXkgMjUgMDk6MTU6NTQgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBTdHJpcCBvZmYgcGF0Y2ggc3VmZml4IHNvIHJ0bCBpcyByZWNvZ25pemVkCi0JICBhcyBhIHN1bm9zNC4xLjMgbWFjaGluZSwgZXZlbiB0aG91Z2ggaXQncyBiZWVuIHBhdGNoZWQuCi0KLUZyaSBNYXkgMjAgMDg6MjU6NDkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTEFTVCk6IERlbGV0ZS4KLQkoSU5TVEFMTF9ET1NSRUwpOiBOZXcuCi0KLVRodSBNYXkgMTkgMTc6MTI6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBsZCBmb3IgaVszNF04Ni0qLXN5c3Y0KiBhbmQgc3BhcmMtKi1zb2xhcmlzMiouCi0JRG9uJ3Qgc2V0IHVzZV9nbnVfbGQgdG8gbm8gZm9yICotKi1zeXN2NDsgdGhhdCBvbmx5IGNvbnRyb2xzCi0Jd2hldGhlciB3ZSBwYXNzIGRvd24gLS13aXRoLWdudS1sZCBhbnlob3cuCi0KLVRodSBNYXkgMTkgMDk6Mjk6MTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTEFTVCk6IENoYW5nZSBvcGVyYXRpb24gc28gaXQgd29ya3MKLQlvbiBtb3JlIGZsYXZvcnMgb2YgbWFrZS4KLQkqIGNvbmZpZ3VyZS5pbiAoZ28zMik6IERvbid0IGJ1aWxkIGxpYmcrKyBvciBsaWJpby4KLQotRnJpIE1heSAxMyAxMzoyODozNCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTW92ZSBIT1NUX1BSRUZJWF8xIGFuZCBmcmllbmRzIHVwIHNvCi0JdGhleSBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHRlbXBsYXRlcy4KLQotU2F0IE1heSAgNyAxNjo0Njo0NCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldD09Z28zMik6IERvbid0IGJ1aWxkIGdkYi4KLQkqIGRvc3JlbDogTmV3IGRpcmVjdG9yeS4KLQotRnJpIE1heSAgNiAxNDoxOToyNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PWdvMzIpOiBDb25maWd1cmUgZG9zcmVsIHRvby4KLQkqIE1ha2VmaWxlLmluIChJTlRBTExfVEFSR0VUKTogQ2FsbCBJTlNUQUxMX0xBU1QgbGFzdC4KLQkoSE9TVF9DQywgSE9TVF9QUkVGSVgsIEhPU1RfUFJFRklYXzEpOiBVbmRlZmluZSwgdGhleSBzaG91bGQKLQliZSBzZXQgYnkgaW5jb21pbmcgbmFtZXMgb3IgdGVtcGxhdGVzLgotCShJTlNUQUxMX0xBU1QpOiBOZXcgcnVsZS4KLQkqIGNvbmZpZy9taC1nbzMyOiBOZXcgZnJhZ21lbnQuCi0KLVRodSBNYXkgIDUgMTc6MzU6MDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChzcGFyY2xpdGVmcncsIHNwYXJjbGl0ZWZyd2NvbXBhdCk6IERvbid0IHNldCB0aGUgb3MuCi0KLVRodSBNYXkgIDUgMjA6MDY6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWx5bnhyczZrOiBSZW5hbWVkIGZyb20gbWgtbHlueG9zcnM2aywgdG8gbWFrZSBpdAotCXVuaXF1ZSBpbiA4LjMgbmFtaW5nIHNjaGVtZXMuCi0JKiBjb25maWd1cmUuaW4gKGFwcGRpcnMpOiBOZXcgdmFyaWFibGUuICBDdXJyZW50bHkgZW1wdHksIGJ1dCB3aWxsCi0JYmUgdXNlZCBpbiBnYXMgZGlzdHJpYnV0aW9uLiAgSWYgbm9uZW1wdHksIGxpc3RzIGEgc2V0IG9mCi0JZGlyZWN0b3JpZXMgYXQgbGVhc3Qgb25lIG9mIHdoaWNoIG11c3QgZ2V0IGNvbmZpZ3VyZWQsIG9yIHRvcAotCWxldmVsIGNvbmZpZ3VyYXRpb24gaXMgY29uc2lkZXJlZCB0byBoYXZlIGZhaWxlZC4KLQkocnM2MDAwLSotbHlueG9zKik6IFVzZSBuZXcgZmlsZSBuYW1lLgotCi1UaHUgTWF5ICA1IDEzOjM4OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUVsaW1pbmF0ZSBYVFJBRkxBR1MuCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IElmIG5ld2xpYiBleGlzdHMsIHJlZmVyIHRvIHRoZQotCW5ld2xpYiBpbmNsdWRlIGZpbGVzIHVzaW5nIC1pZGlyYWZ0ZXIsIGFuZCBhbHNvIHVzZSAtbm9zdGRpbmMuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0JKFhUUkFGTEFHUyk6IFJlbW92ZWQuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBYVFJBRkxBR1NfRk9SX1RBUkdFVC4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFJlbW92ZSBYVFJBRkxBR1MuCi0JKEVYVFJBX1RBUkdFVF9GTEFHUywgRVhUUkFfR0NDX0ZMQUdTKTogTGlrZXdpc2UuCi0JKCQoRE9fWCkpOiBEb24ndCBwYXNzIGRvd24gWFRSQUZMQUdTLgotCi1UaHUgTWF5ICA1IDAwOjE2OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLWRlYy1ic2QqKTogTmV3IHRhcmdldDsgZG8gYnVpbGQgbGlua2VyLgotCShtaXBzKi0qLWJzZCopOiBOZXcgdGFyZ2V0OyBkb24ndCBidWlsZCBsaW5rZXIuCi0KLVdlZCBNYXkgIDQgMjA6MTA6MTAgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHN1cHBvcnQgcnM2MDAwLSotbHlueG9zKiBjb25maWd1cmF0aW9uLgotCXN1cHBvcnQgc3Vub3M0IGFzIGEgY3Jvc3MgdGFyZ2V0LgotCi0JKiBjb25maWcuc3ViOiBsb29rIGZvciBseW54Kiwgbm90IGx5bnggc2luY2UgdGhlIE9TIHZlcnNpb24gbWF5Ci0JbGVnaXRpbWF0ZWx5IGJlIHBhcnQgb2YgdGhlIG5hbWUuCi0KLVR1ZSBNYXkgIDMgMjE6NDg6MTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc2NvKik6IE1vdmUgdG8gYmUgd2l0aCBvdGhlciBpMzg2Ci0JdGFyZ2V0cy4KLQkocm9tcC0qLSopOiBOZXcgdGFyZ2V0LiAgU2tpcCB2YXJpb3VzIGJpbmFyeSB1dGlsaXRpZXMuCi0JKHZheC0qLSopOiBOZXcgdGFyZ2V0LiAgRG9uJ3QgYnVpbGQgbmV3bGliLgotCSh2YXgtKi12bXMpOiBSZW5hbWVkIGZyb20gKi0qLXZtcy4gIERvbid0IGJ1aWxkIG9wY29kZXMgb3IgbmV3bGliLgotCi1UaHUgQXByIDI4IDE1OjAzOjA1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBPbmx5IHNldCBob3N0X21ha2VmaWxlX2ZyYWcgaWYgY29uZmlnCi0JZGlyZWN0b3J5IGV4aXN0cy4KLQotV2VkIEFwciAyNyAxMjoxNDozMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IElmICRkc3RkaXIgZXhpc3RzLCBkb24ndCBjaGVjayB3aGV0aGVyIGVhY2gKLQljb21wb25lbnQgZG9lcy4KLQotVHVlIEFwciAyNiAxODoxMTozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkIHNsZWVwOyB1c2VkIGJ5IHJjcy9zcmMvY29uZi5zaC4KLQotTW9uIEFwciAyNSAxNTowNjozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLSAJKiBjb25maWd1cmUuaW4gKCotKi1seW54b3MqKTogRG9uJ3QgY29uZmlndXJlIG5ld2xpYiBmb3IgZWl0aGVyCi0gCW5hdGl2ZSBvciBjcm9zcyBMeW54LgotCi1TYXQgQXByIDE2IDExOjU4OjE2IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKHNwYXJjNjQtZWxmKTogRml4IG9zLgotCSh6OGspOiBSZW1vdmUgZHVwbGljYXRlLgotCi1UaHUgQXByIDE0IDIzOjMzOjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdjYy1uby1maXhlZGluY2x1ZGVzKTogVG91Y2ggZ2NjL2luY2x1ZGUvZml4ZWQsIG5vdAotCWdjYy9zdG1wLWZpeHByb3RvLCB0byB0cnkgdG8gcHJldmVudCBmaXhwcm90byBmcm9tIGJlaW5nIHJ1bi4KLQotV2VkIEFwciAxMyAxNToxNDo1MiAxOTk0ICBCaWxsIENveCAgKGJpbGxAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBNYWtlIGZpbGUgbGlua3MgY2xlYW5seSBldmVuIGlmIEx5bnggZmFpbHMgb24KLSAgICAgICAgICBhbiBORlMgc3ltbGluayAoYXQgbGVhc3QgZmFpbCBjbGVhbmx5KS4KLQotTW9uIEFwciAxMSAxMDo1ODo1NiAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKENDKTogRm9yIG1pcHMtc2dpLWlyaXg0LCBjaGFuZ2UgLVhOaDE1MDAgdG8KLQktWE5oMjAwMC4KLQotU2F0IEFwciAgOSAxNToxMDo0NSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogVW5rbm93biBvcHRpb25zIGFyZSBmYXRhbCBhZ2Fpbi4KLQotRnJpIEFwciAgOCAxMjowMTo0MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZ25vcmUgLS14LWluY2x1ZGVzIGFuZCAtLXgtbGlicmFyaWVzLCBmb3IgQXV0b2NvbmYKLQljb21wYXRpYmlsaXR5LiAKLQotVGh1IEFwciAgNyAxNzozMTo0MyAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IEFkZCBgY2xlYW4nIHRhcmdldC4KLQotV2VkIEFwciAgNiAyMDo0NDo1NiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZy5ndWVzczogIEFkZCBTSU5JWCBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiAgQWRkIG1pcHMtKi1zeXN2NCogc3VwcG9ydC4KLQotTW9uIEFwciAgNCAxNzo0MTo0NCAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IERvY3VtZW50IGFsbCB1c2VmdWwgdGFyZ2V0cy4KLQlJZiBjYW5vbmhvc3QgaXMgc3BhcmMtc3VuLXNvbGFyaXMyLjMsIGNoYW5nZSBpdCB0byBzcGFyYy1zdW4tc29sYXJpczIuCi0JSWYgY2Fub25ob3N0IGlzIG1pcHMtc2dpLWlyaXg0LjAuNUgsIGNoYW5nZSBpdCB0byBtaXBzLXNnaS1pcml4NC4KLQotVGh1IE1hciAzMSAwNDo1NTo1NyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU3VwcG9ydCAtLXNpbGVudCwgLS1xdWlldC4KLQotV2VkIE1hciAzMCAyMTozNzozOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU3VwcG9ydCAtLWRpc2FibGUtRkVBVFVSRS4KLQotVHVlIE1hciAyOSAxOToxNTowNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgTkNSIHJ1bm5pbmcgU1ZSNC4zLgotCi1Nb24gTWFyIDI4IDE0OjU1OjE1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBNYWtlIEJTREkgZ2VuZXJhdGUgaTM4Ni11bmtub3duLWJzZDM4Ni4KLQlQYXRjaCBmcm9tIFBhdWwgRWdnZXJ0IDxlZ2dlcnRAdHdpbnN1bi5jb20+LgotCi1Nb24gTWFyIDI4IDEyOjU0OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotYWl4Kik6IFRyZWF0IGxpa2UgcnM2MDAwLSotKi4KLQotU2F0IE1hciAyNiAxMToyNTo0OCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogTWFrZSB1bnJlY29nbml6ZWQgb3B0aW9ucyBnaXZlIG5vbmZhdGFsIHdhcm5pbmdzCi0JaW5zdGVhZCBvZiBmYXRhbCBlcnJvcnMsIGFuZCBwYXNzIHRoZW0gdG8gYW55IHN1YmRpcmVjdG9yeQotCWNvbmZpZ3VyZXMgaW4gY2FzZSB0aGV5IHJlY29nbml6ZSB0aGVtLgotCU1ha2UgLS14IGVxdWl2YWxlbnQgdG8gLS13aXRoLXguCi0KLUZyaSBNYXIgMjUgMjE6NTI6MTAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFkZCAtLWVuYWJsZS0qIG9wdGlvbnMuICBDbGVhbiB1cCB1c2FnZSBtZXNzYWdlIGFuZAotCXNvbWUgY29tbWVudHMuCi0KLVRodSBNYXIgMjQgMDk6MTI6NTMgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE5NX0ZPUl9UQVJHRVQpOiBCdWlsZCB0cmVlIHZlcnNpb24gaXMgbm93IG5tLm5ldy4KLQotU3VuIE1hciAyMCAxMToyODoyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLSopOiBFbmFibGUgYmludXRpbHMuCi0KLVNhdCBNYXIgMTkgMTE6NTA6MTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBjaXNjby4KLQotRnJpIE1hciAxOCAxNjo0MjozMiAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENYWEZMQUdTKTogQWRkIC1mZXh0ZXJuYWwtdGVtcGxhdGVzLgotCi1UdWUgTWFyIDE1IDExOjI1OjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFib3V0IHRhcmdldCAqLWhpdGFjaGktaGl1eHdlMiwgZG9uJ3QgcHJpbnQgbW9yZQotCXRoYW4gb25lIGNvbmZpZ3VyYXRpb24gbmFtZS4gIEFkZCBjb21tZW50LgotCi1TdW4gTWFyICA2IDIzOjEzOjM4IDE5OTQgIEhpc2FzaGkgTUlOQU1JTk8gIChtaW5hbWlub0BzcmEuY28uanApCi0KLQkqIGNvbmZpZy5ndWVzczogYWJvdXQgdGFyZ2V0ICotaGl0YWNoaS1oaXV4d2UyLCBmaXhlZAotCW1hY2hpbmUgZ3Vlc3Npbmcgb3JkZXIuICBbSGl0YWNoaSdzIENQVV9JU19IUF9NQzY4SwotCW1hY3JvIGlzIGluY29ycmVjdC5dCi0KLVN1biBNYXIgMTMgMDk6MTA6MDggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogSnVzdCBidWlsZCBUQUdTIGluIGVhY2ggc3ViZGlyZWN0b3J5LCByYXRoZXIKLQl0aGFuIHRoZSAibWFrZSBscyIgc3R1ZmYgd2hpY2ggdXNlZCB0byBiZSBoZXJlLgotCi1GcmkgTWFyIDExIDEyOjUyOjM5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaVszNF04Ni11bmtub3duLWZyZWVic2QuCi0JRnJvbSBTaGF3biBNIENhcmV5IDxzbWNhcmV5QHJvZGFuLnN5ci5lZHU+LgotCi1UaHUgTWFyICAzIDE0OjI0OjIxIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyBmb3IgYWxwaGEpOiBSZW1vdmUgbGliZysrIGFuZCBsaWJpby4KLQotV2VkIE1hciAgMiAxMzoyODo0OCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBDaGVjayBmb3IgcHR4LgotCi1Nb24gRmViIDI4IDE2OjQ2OjUwIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFkZCBvczlrIGNoZWNraW5nLgotCi1UaHUgRmViIDI0IDA3OjA5OjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEhhbmRsZSBPU0YxIHJ1bm5pbmcgb24gSFBQQSBwcm9jZXNzb3JzCi0KLUZyaSBGZWIgMTggMTQ6MTQ6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIHN1YmRpciBjb25maWd1cmUgZmFpbHMsIHByaW50IG91dCBhIG1lc3NhZ2Ugd2l0aAotCXN1YmRpcmVjdG9yeSBuYW1lLCBpbiBjYXNlIHN1YmRpcidzIGNvbmZpZ3VyZSBjb2RlIGRpZG4ndCBpZGVudGlmeQotCWl0c2VsZi4KLQotRnJpIEZlYiAxOCAxMjo1MDoxNSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGVtYmVkZGVkIG5ld2xpbmVzIGZyb20gY29uZmlnZGlycy4KLQlBdm9pZCBtaXNtYXRjaGVzIG9mIHN1YnN0cmluZ3MuICBGaXggbWF0Y2hpbmcgc3RyaW5ncyBhdCBlbmQKLQlvZiBjb25maWdkaXJzLgotCi1GcmkgRmViIDExIDE1OjMzOjMzIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEFkZCBMeW54L3JzNjAwMCBjb25maWcgc3VwcG9ydC4KLQotVHVlIEZlYiAgOCAxMzo0MTowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtZGVjLW9zZjEqLCBhbHBoYSotKi0qKTogQnVpbGQgZ2FzLgotCi1Nb24gRmViICA3IDE1OjQyOjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1vc2YqKTogVHJlYXQgdGhpcyBqdXN0IGxpa2UgbW9zdCBvdGhlcgotCVBBIGNvbmZpZ3VyYXRpb25zIChlZyBubyBiaW51dGlscyBvciBsZCkuCi0JKGhwcGEqLSotKmVsZiopOiBUaGVzZSBjb25maWd1cmF0aW9ucyBoYXZlIGJpbnV0aWxzIGFuZCBsZC4KLQotU3VuIEZlYiAgNiAxNjozNTowNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLnN1YiAoaGl1eCk6IEZpeCB0eXBvLiAgRnJvbSBtLWthc2FockBzcmFtaGMuc3JhLmNvLkpQLgotCi1TYXQgRmViICA1IDAxOjAwOjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChyczYwMDAtKi0qKTogQnVpbGQgZ2FzLgotCi1XZWQgRmViICAyIDEzOjU3OjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogTWFrZWZpbGUuaW46ICBBdm9pZCBidWcgaW4gbG9zaW5nIGhwdXggc2VkLgotCi1XZWQgRmViICAyIDE0OjUzOjA1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgdGVzdC1idWlsZC5tazogUmVtb3ZlIE1VTkNIX05NOyBpdCB3YXMgb25seSBuZWVkZWQKLQlmb3IgR0RCIGFuZCBHREIgaGFzIGJlZW4gZml4ZWQgdG8gbm90IG5lZWQgaXQuCi0KLU1vbiBKYW4gMzEgMTg6NDA6NTUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWx5bnhvc3JzNms6ICBBY2NvdW50IGZvciBsYWNrIG9mIHJhbmxpYiEKLQotU3VuIEphbiAzMCAxNzo1ODowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSB2YXggaG9zdHMuCi0KLUZyaSBKYW4gMjggMTU6Mjk6MzggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh3aGlsZSBsb29wKTogRG9uJ3QgdXNlICJicmVhayAyIiBpbnNpZGUgY2FzZQotCXN0YXRlbWVudCAtLSB0aGUgY2FzZSBzdGF0ZW1lbnQgaXNuJ3QgYW4gZW5jbG9zaW5nIGxvb3AuCi0KLU1vbiBKYW4gMjQgMTg6NDA6MDYgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIENsZWFuIHVwIE5lWFQgc3VwcG9ydCwgdG8gYWxsb3cgbmV4dHN0ZXAKLQlvbiBJbnRlbCBtYWNoaW5lcy4gIE1ha2UgT1MgYmUgbmV4dHN0ZXAuCi0KLVN1biBKYW4gMjMgMTg6NDc6MjIgMTk5NCAgUmljaGFyZCBLZW5uZXIgIChrZW5uZXJAdmxzaTEudWx0cmEubnl1LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgYWx0ZXJuYXRlIGZvcm1zIGZvciBDb252ZXguCi0KLVRodSBKYW4gMjAgMTY6MTM6NDEgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQ29tcGxldGVseSByZXdyaXRlIG9wdGlvbiBwcm9jZXNzaW5nLiAgVGFrZQotCWFkdmFudGFnZSBvZiBwYXR0ZXJuLW1hdGNoaW5nIHRvIGF2b2lkIGludm9raW5nIHRlc3QgZnJlcXVlbnRseS4KLQlBbHNvIGNsZWFuIHVwIGhvc3QgYW5kIHRhcmdldCBkZWZhdWx0aW5nIGxvZ2ljLgotCi1Nb24gSmFuIDE3IDE1OjA2OjU2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGFsbCBvY2N1cnJhbmNlcyBvZiAicm9vdG1lIiB3aXRoICJyIiBhbmQKLQkiJCR7cm9vdG1lfSIgd2l0aCAiJCRyIiwgdG8gaW5jcmVhc2UgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgZG8tKgotCWNvbW1hbmRzIChwbHVzIHVzZXIgZW52aXJvbm1lbnQpIHdpbGwgZml0IFNDTyBsaW1pdHMuCi0KLVRodSBKYW4gIDYgMTE6MjA6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGlzc3VlIHdhcm5pbmdzIGFib3V0IGRpcmVjdG9yaWVzIHdoaWNoIGFyZQotCW5vdCBiZWluZyBjb25maWd1cmVkIGlmIC1ub3JlY3Vyc2lvbiBpcyBzZXQuICBDb3JyZWN0IHRlc3QgZm9yCi0JLS13aXRoLWdudS1hcyBhbmQgLS13aXRoLWdudS1sZCB0byBub3QgZ2V0IGNvbmZ1c2VkIGJ5IHN1YnN0cmluZwotCW1hdGNoZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgZ2FzIGZvciBhbHBoYS1kZWMtb3NmMSouCi0KLVR1ZSBKYW4gIDQgMTc6MTA6MTkgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQmFjayBvdXQgUGVyJ3MgY2hhbmdlIG9mIDEyLzE5LzE5OTMuICBJdCBjaGFuZ2VzIHRoZQotCWJlaGF2aW9yIG9mIGNvbmZpZ3VyZSBpbiB1bmV4cGVjdGVkIGFuZCBjb25mdXNpbmcgd2F5cy4KLQotCUFsc28sIHVzZSBkaWZmZXJlbnQgZGVsaW0gY2hhciB3aGVuIGNhbGN1bGF0aW5nCi0JcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBzbyB0aGF0IHRoZSBuYW1lIGNhbiBjb250YWluIHNsYXNoZXMuCi0KLVNhdCBKYW4gIDEgMTM6NDU6MzEgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBWU1RhIG1pY3JvLWtlcm5lbC4KLQotU2F0IERlYyAyNSAyMDowMDo0NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluOiBOdWtlIGhhY2tzIHdoaWNoIHdlcmUgdXNlZCB0byBnZXQgYSBzcGVjaWFsCi0JdmVyc2lvbiBvZiBHQVMgZm9yIEhQUEEgY29uZmlndXJhdGlvbnMuCi0KLVN1biBEZWMgMTkgMjA6NDA6NDQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIElmIG9ubHkgJHt0YXJnZXRfYWxpYXN9IGlzIGdpdmVuLCB1c2UgdGhhdAotCWFzIHRoZSBkZWZhdWx0IGZvciAke2hvc3RfYWxpYXN9LgotCSogY29uZmlndXJlOiAgQWRkIG1pc3NpbmcgYmFjay1zbGFzaGVzIGJlZm9yZSBuZXN0ZWQgcXVvdGVzLgotCi1XZWQgRGVjIDE1IDE4OjA3OjE4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IGFkZCBZQUNDPSQoQklTT04pCi0KLVR1ZSBEZWMgMTQgMjE6MjU6MzMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBzb21lIFRla3Ryb25peCBjb25maWd1cmF0aW9ucy4KLQlGcm9tIEthdmVoIFIuIEdoYXppIDxnaGF6aUBub2MucnV0Z2Vycy5lZHU+LgotCi1TYXQgRGVjIDExIDExOjE4OjAwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBNYXRjaCBhbnkgZmxhdm9yIG9mIFNILgotCi1UaHUgRGVjICAyIDE3OjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdHJ5IHRvIGNvbmZpZ3VyZSBuZXdsaWIgZm9yIEFscGhhLgotCi1UaHUgRGVjICAyIDE0OjM1OjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBsZCBmb3IgSXJpeCA1LiAgRG9uJ3QgYnVpbGQgZ2FzLAotCWxpYmcrKyBvciBsaWJpbyBmb3IgYW55IEFscGhhIHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDUqKTogTmV3IHRhcmdldDsgdXNlIG1oLWlyaXg1LgotCSogY29uZmlnL21oLWlyaXg1LiBOZXcgZmlsZSBmb3IgSXJpeCA1LgotCi1XZWQgRGVjICAxIDE3OjAwOjMzIDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR1pJUFBST0cpOiBSZW5hbWVkIGZyb20gR1pJUCwgd2hpY2ggZ3ppcCB1c2VzIGZvcgotCWRlZmF1bHQgYXJndW1lbnRzIC0tIHNvIGl0IHRyaWVkIHRvIGNvbXByZXNzIGl0c2VsZi4KLQotVHVlIE5vdiAzMCAxMzo0NToxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobm90c3VwcCk6IGVuc3VyZSB0aGF0IGEgc3BhY2UgaXMgYWx3YXlzIGF0IHRoZSBlbmQKLQkgIG9mIHRoZSBjb25maWdkaXJzIGxpc3QsIHNpbmNlIHRoZSBncmVwIGNoZWNrcyBmb3IgYW4gZXhwbGljaXQgc3BhY2UKLQotVHVlIE5vdiAxNiAxNTowNDoyNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGkzODYtc3lzdjQuMik6IGRvbid0IGJ1aWxkIGxkLCBzaW5jZSBzdGF0aWMKLQkgIHZlcnNpb25zIG9mIG1hbnkgbGlicmFyaWVzIGFyZSBub3QgYXZhaWxhYmxlLgotCi1UdWUgTm92IDE2IDE0OjI4OjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBBcG9sbG9zICh1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLgotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGQsIGJpbnV0aWxzLCBvciBncHJvZiBmb3IgQXBvbGxvLgotCi1UaHUgTm92IDExIDEyOjAzOjUwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBTb255IG5ld3MgbWlwcyBydW5uaW5nIG5ld3Nvcy4KLQotV2VkIE5vdiAxMCAxNjo1NzowMCAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWN5Z251cywgYnVpbGQtY3lnbnVzKTogImZpIGVsc2UiIG5lZWRzIHRvIGJlCi0JImZpIDsgZWxzZSIgZm9yIGJhc2guCi0KLVR1ZSBOb3YgIDkgMTU6NTQ6MDEgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IHBhc3MgU0hFTEwuCi0KLUZyaSBOb3YgIDUgMDg6MDc6MjcgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhY2NlcHQgdW5peHdhcmUgYXMgYW4gYWxpYXMgZm9yIHN2cjQuMi4KLQlGaXggc29tZSBpbmNvbnNpc3RhbmNpZXMgd2l0aCB0aGUgZ2NjIHZlcnNpb24uCi0KLUZyaSBOb3YgIDUgMTU6MTQ6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNURE9DRElSUyk6ICBBZGQgZ2RiLgotCi1GcmkgTm92ICA1IDExOjU5OjQyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiAgQWRkIGxpYmcrKyBhbmQgbGliaW8uCi0KLUZyaSBOb3YgIDUgMTA6MzU6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBPbmx5IGJ1aWxkICJpbmZvIiBpbiBESVNURE9DRElSUy4KLQkoRElTVERPQ0RJUlMpOiBEb24ndCBhc3N1bWUgbGliZysrIGFuZCBnZGIgZm9sa3MgbmVjZXNzYXJpbHkgd2FudAotCXRoaXMgbm93LgotCi1UaHUgTm92ICA0IDE4OjU4OjIzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgaGl1eCogYXMgYW4gT1MgbmFtZS4KLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNUX0ZMQUdTIGJhY2sgdG8gUlVOVEVTVEZMQUdTIHBlcgotCWV0Yy9tYWtlLXN0ZHMudGV4aS4gIFRoZSB1bmRlcnNjb3JlIGNhbWUgZnJvbSBnY2MsIGFuZCBkamUgbm93Ci0JYWdyZWVzIHRoYXQgUlVOVEVTVEZMQUdTIGlzIHRoZSBjb3JyZWN0IG5hbWUuCi0KLVRodSBOb3YgIDQgMTA6NDk6MDEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6ICBSZW1vdmUgJ3NldCAtZScuICBJdCBtYWtlcyBhbnkgY29uZGl0aW9uYWxzCi0JaW4gdGhlIHNjcmlwdCB1c2VsZXNzLgotCi0JKiBjb25maWcuZ3Vlc3M6IEF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGFybS1hY29ybi1yaXNjaXgKLQlQYXRjaCBmcm9tIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZTExQGNsLmNhbS5hYy51aykuCi0KLVRodSBOb3YgMDQgMDg6MDg6MDQgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUwotCi1XZWQgTm92ICAzIDIyOjA5OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogTmV3IHZhcmlhYmxlLgotCSh0YXopOiBFZGl0IGxvY2FsIE1ha2VmaWxlLmluIHNvb25lciwgaW5zdGVhZCBvZiBwcm90by10b3BsZXYKLQlNYWtlZmlsZS5pbiBsYXRlci4gIEJ1aWxkICJpbmZvIiBhbmQgImR2aSIgaW4gRElTVERPQ0RJUlMuICAKLQotV2VkIE5vdiAgMyAyMTozMTo1MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSB0YXJnZXQpOiBjaGVjayB0aGUgc291cmNlIGRpcmVjdG9yeSBmb3IgdGhlCi0JICBwYWdhcyBzdWItZGlyZWN0b3J5Ci0KLVdlZCBOb3YgIDMgMTE6MTI6MjIgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWxsb3cgLWFvdXQqIGFuZCAtZWxmKi4KLQotV2VkIE5vdiAgMyAxMTowODozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbGQgb24gaTM4Ni1zb2xhcmlzMiwgc2FtZSBhcyBmb3IKLQlzcGFyYy1zb2xhcmlzMi4KLQotVHVlIE5vdiAgMiAxNDoyMToyNSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEFkZCB0ZXhpbmZvL2xncGwudGV4aW5mbyAoZm9yIGxpYmcrKykuCi0KLVR1ZSBOb3YgIDIgMTM6Mzg6MzAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBDb25maWd1cmUgZ2RiIGZvciBhbHBoYS4KLQotTW9uIE5vdiAgMSAxMDo0Mjo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENYWEZMQUdTKTogQWRkIC1PLgotCi1XZWQgT2N0IDI3IDEwOjQ1OjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGRlZCBzdXBwb3J0IGZvciBERyBBdmlpb24KLQotVHVlIE9jdCAyNiAxNDozNzozNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBQcm9kdWNlIHdhcm5pbmcgbWVzc2FnZSBmb3Igc3ViZGlyZWN0b3JpZXMgbm90Ci0JY29uZmlndXJhYmxlIGZvciB0aGlzIGhvc3QvdGFyZ2V0IGNvbWJpbmF0aW9uLiAgRG9uJ3QgdHJ5IHRvCi0JY29uZmlndXJlIGdkYiBmb3Igdm1zLgotCi1Nb24gT2N0IDI1IDExOjIyOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogUmVwbGFjZSAiYnlhY2MiIHdpdGggImJpc29uIC15IiBpbiB0aGUKLQlhcHByb3ByaWF0ZSBmaWxlcyBiZWZvcmUgbWFraW5nICJkaXN0c3R1ZmYiLgotCShESVNUQklTT05GSUxFUyk6IE5ldyB2YXI6IGxpc3Qgb2YgZmlsZXMgdG8gYmUgZWRpdGVkLgotCShESVNUU1RVRkZESVJTKTogQWRkIGJpbnV0aWxzLgotCi1GcmkgT2N0IDIyIDIwOjMyOjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWxzbyBoYW5kbGUgbWlwc2VsIGFuZCBtaXBzNjRlbCAoZm9yIGxpdHRsZSBlbmRpYW4gbWlwcykKLQotRnJpIE9jdCAyMiAwNzo1OToyMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UaHUgT2N0IDIxIDExOjM4OjI4IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBuZXdsaWIgZm9yIEx5bnhPUyBuYXRpdmUuCi0KLVdlZCBPY3QgMjAgMDk6NTY6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIHN1cHBvcnQgZm9yIGRlbHRhIDg4ayBydW5uaW5nIFNWUjMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnQgYWJvdXQgSFAgY29tcGlsZXIgdnMuIGVtYWNzLgotCi1UdWUgT2N0IDE5IDE2OjAyOjIyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCBidWlsZCBsZCBvbiBzb2xhcmlzMiAobm90IGEgdmlhYmxlIG9wdGlvbgotCSAgZHVlIHRvIGJ1Z3MgaW4gZ2V0cHduYW0gJiBnZXRwd3VpZCkKLQotVHVlIE9jdCAxOSAxNToxMzo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IGFscGhhLWRlYy1vc2YxKiwgbm90IGp1c3QgLW9zZjEsIHNpbmNlCi0JY29uZmlnLmd1ZXNzIHdpbGwgcHJvZHVjZSBhIGZ1bGwgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBPY3QgMTkgMTU6NTg6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGxpbmtlciBhbmQgYmludXRpbHMgZm9yIGFscGhhLWRlYy1vc2YxLgotCi1UdWUgT2N0IDE5IDExOjQxOjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIC1PIGZyb20gQ1hYRkxBR1MgZm9yIGNvbnNpc3RlbmN5IHdpdGggQ0ZMQUdTLAotCWFuZCBnZGIvdGVzdHN1aXRlL01ha2VmaWxlLmluLgotCi1TYXQgT2N0ICA5IDE4OjM5OjA3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbWlwcyotIGluc3RlYWQgb2YgbWlwcy0KLQotRnJpIE9jdCAgOCAxNDoxNTozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IGxpbnV4KmNvZmYgYW5kIGxpbnV4KmVsZiBhcyBvcGVyYXRpbmcKLQlzeXN0ZW1zLgotCi1UaHUgT2N0ICA3IDEyOjU3OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIG1pcHM2NCwgYW5kIG1pcHMzIGFzIGFuIGFsaWFzIGZvciBpdC4KLQotV2VkIE9jdCAgNiAxMzo1NDoyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGFscGhhLWRlYy1vc2YqLCBubyBsb25nZXIgbmVjZXNzYXJ5IG5vdyB0aGF0Ci0JZ2RiIGtub3dzIGhvdyB0byBoYW5kbGUgT1NGLzEgc2hhcmVkIGxpYnJhcmllcy4KLQotVHVlIE9jdCAgNSAxMTo1NTowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaHBwYSotKi1oaXV4KiAoY3VycmVudGx5IHN5bm9ueW0gZm9yIGhwdXgpLgotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSGl0YWNoaSdzIEhJVVguCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgaDMwNTByKiBhbmQgaHBwYWhpdGFjaGkuCi0JUmVtb3ZlIHJlZHVuZGFudCBjYXNlcyBmb3IgaHA5a1syM10qLgotCi1Nb24gT2N0ICA0IDE2OjE1OjA5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkZWZhdWx0IHRvICctLXdpdGgtZ251LWFzJyBhbmQgJy0td2l0aC1nbnUtbGQnCi0JaWYgZ2FzIGFuZCBsZCBhcmUgaW4gdGhlIHNvdXJjZSB0cmVlIGFuZCBhcmUgaW4gJHtjb25maWdkaXJzfS4KLQlJZiAke3VzZV9nbnVfYXN9IG9yICR7dXNlX2dudV9sZH0gYXJlICdubycsIHRoZW4gZG9uJ3Qgc2V0IHRoZQotCXRoZSAtLXdpdGggb3B0aW9ucyAoYnV0IHN0aWxsIHBhc3MgdGhlbSBkb3duIG9uIHRoZSBjb21tYW5kIGxpbmUsCi0JaWYgdGhleSB3ZXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkKS4KLQotRnJpIFNlcCAyNCAxOToxMToxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogc3Vic3RpdHV0ZSBTSEVMTCB2YWx1ZSBpbiBNYWtlZmlsZS5pbiB3aXRoCi0JJHtDT05GSUdfU0hFTEx9Ci0KLVRodSBTZXAgMjMgMTg6MDU6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGdhcywgbGQsIGFuZCBiaW51dGlscyBmb3IgKi0qLXN5c3Y0KiBhbmQKLQkqLSotc29sYXJpczIqIHRhcmdldHMuCi0KLVN1biBTZXAgMTkgMTc6MDE6NDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIE00LCBhbmQgcGFzcyBpdCBkb3duIHRvIHN1Yi1tYWtlczsKLQlhbGwtYXV0b2NvbmYgbm93IGRlcGVuZHMgb24gYWxsLW00Ci0KLVNhdCBTZXAgMTggMDA6Mzg6MjMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoe0FSLFJBTkxJQn1fRk9SX1RBUkdFVCk6IG1ha2UgY29udGluZ2VudCBvbgotCXByZXNlbmNlIG9mIHthcixyYW5saWJ9IGluc3RlYWQgb2YgYSBjb25maWd1cmVkIGRpcmVjdG9yeQotCi1XZWQgU2VwIDE1IDA4OjQxOjQ0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBBY2NlcHQgMzQ/PyBhcyB3ZWxsIGFzIDMzPz8gZm9yIE5DUi4KLQotTW9uIFNlcCAxMyAxMjoyODo0MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZ3JhYiBtdC1ocHBhIGZvciBIUFBBIHRhcmdldHM7IHVzZSAnZ2FzICcgaW5zdGVhZAotCW9mICdnYXMnIGluIHNlZCBjb21tYW5kcywgc2luY2UgJ2dhc2gnIGlzIG5vdyBpbiB0aGUgdHJlZSBhcyB3ZWxsLgotCi1GcmkgU2VwIDEwIDExOjIzOjUyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBncmFiIHZhbHVlcyBmb3IgJChDQykgYW5kICQoQ1hYKSBmcm9tIHRoZQotCWVudmlyb25tZW50LCBzbyB0aGF0IHNvbWVvbmUgY2FuIGRvICJDQz1nY2MgY29uZmlndXJlOyBtYWtlIiBhbmQKLQloYXZlIGl0IHdvcmsgcmlnaHQgKG1hdGNoaW5nIHRoZSB3YXkgdGhhdCBhdXRvY29uZiB3b3JrcyBub3cpCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGFkZCBzdXBwb3J0IGZvciBnYXNoLCB0aGUgdGNsCi0JaW50ZXJmYWNlIHRvIEdhbGF4eQotCi0JKiBjb25maWcuZ3Vlc3M6IGFkZCBOZXRCU0QgdmFyaWFudHMgKGhwMzAwLCB4ODYpCi0KLVRodSBTZXAgIDkgMTY6NDg6NTIgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IFN1cHBvcnQgLWQgb3B0aW9uIChpbiB0aGUgbWFubmVyIG9mIFN1bk9TIDQgaW5zdGFsbCwKLQlhcyBpdCBpcyBtb3JlIGRldGVybWluaXN0aWMgdGhhbiB0aGF0IG9mIEdOVSBpbnN0YWxsKQotCShjaG1vZGNtZCk6IFNldCBmaWxlIHRvIG1vZGUgNzU1IGJ5IGRlZmF1bHQgKHNob3VsZCBhbHNvIGRvIGRlZmF1bHQKLQljaGdycCBhbmQgY2hvd24sIGJ1dCBJIGRvbid0IGZlZWwgbGlrZSBkZWFsaW5nIHdpdGggdGhhdCBub3cpCi0KLVR1ZSBTZXAgIDcgMTE6NTk6MzkgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVtb3ZlIGg4MzAwaGhtcyBhbGlhcy4KLQotVHVlIEF1ZyAzMSAxMTowMDowOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNYXRjaCAqLSotc29sYXJpczIqIG5vdCAqLXN1bi1zb2xhcmlzMiouCi0KLU1vbiBBdWcgMzAgMTg6Mjk6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiB0b3VjaCBzdG1wLWZpeHByb3RvIGFzIHdlbGwKLQlhcyBzdG1wLWZpeGluYwotCi1XZWQgQXVnIDI1IDE2OjM1OjU5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVjb2duaXplIG04ODExMC1idWctY29mZi4KLQotVHVlIEF1ZyAyNCAxMDoyMzoyNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtbGliaW8pOiBhbGwgZGVwZW5kZW5jaWVzIG9uIHRoZSB0b29sY2hhaW4gdXNlZAotCXRvIGJ1aWxkIHRoaXMgKGdjYywgZ2FzLCBsZCwgZXRjKQotCi1GcmkgQXVnIDIwIDE3OjI0OjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IERlYWwgd2l0aCBPU0YvMSAxLjMgb24gYWxwaGEuCi0KLVRodSBBdWcgMTkgMTE6NDM6MDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBhZGQgc29tZSAnZWxzZSB0cnVlJyBjbGF1c2VzIGZvciBwb3J0YWJpbGl0eQotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGJ1aWxkIGxpYmlvIGZvciBoOFszNV0wMC0qLSogdGFyZ2V0cwotCi1UdWUgQXVnIDE3IDE5OjAyOjMxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBzdXBwb3J0IGZvciBuZXcgbGliaW8uCi0KLVN1biBBdWcgMTUgMjA6NDg6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IElmIG9uZSBjb21tYW5kIGZhaWxzLCBkb24ndCB0cnkgdGhlIHJlc3QuICBEb24ndCB0cnkKLQl0byByZW1vdmUgJGRzdHRtcCAodmlhIHRyYXApIHVubGVzcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBpdC4KLQlJZiAkc3JjIGRvZXNuJ3QgZXhpc3QsIGRldGVjdCBpdCBhbmQgZXhpdCB3aXRoIGFuIGVycm9yLgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBCU0Qgb24gaHAzMDAuCi0KLVdlZCBBdWcgMTEgMTg6MzU6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIE1hcCAoOTAwMC9bMzRdPz86SFAtVVg6KjoqKSB0byBtNjhrLWhwLWhwdXguCi0JQnVnIHJlcG9ydCBmcm9tICJIYW1pc2ggKEguSS4pIE1hY2RvbmFsZCIgPGhhbWlzaEBibnIuY2E+LgotCi1XZWQgQXVnIDExIDE1OjM3OjUxIDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXNlbmQtcHIpOiBkZXBlbmRzIG9uIGFsbC1wcm1zCi0KLVdlZCBBdWcgMTEgMTY6NTY6MDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRml4IHR5cG8gKDkwMDAvOD8/OjQuM2JzZCAtPiA5MDAwLzc/Pzo0LjNic2QpLgotCi1GcmkgQXVnICA2IDE0OjQ1OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBGcm9tIG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2EgKE1pY2hhZWwgUmVuZGVsbCk6Ci0JQWRkZWQgdGVzdCBmb3IgbWlwcy1taXBzLXJpc2NvczUuCi0KLVRodSBBdWcgIDUgMTU6NDU6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBtaC1ocDMwMCBmb3IgNjhrIEhQIGhvc3RzCi0KLU1vbiBBdWcgIDIgMTE6NTY6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZCBzdXBwb3J0IGZvciBDT05GSUdfU0hFTEwsIHNvIHRoYXQgeW91IGNhbiB1c2UKLQlzb21lIGFsdGVybmF0ZSBzaGVsbCBmb3IgZXZhbHVhdGluZyBjb25maWd1cmUgc2NyaXB0cwotCi1TdW4gQXVnICAxIDExOjM2OjI3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLmd6KTogIFNlZCBidWcgcmVwb3J0aW5nIGFkZHJlc3MKLQlpbiBjb25maWd1cmUgc2NyaXB0IHRvIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1IHdoZW4gYnVpbGRpbmcKLQlkaXN0cmlidXRpb24gYXJjaGl2ZS4KLQkqIE1ha2VmaWxlLmluIChDT01QUkVTUyk6ICBSZW1vdmUgZGVmLgotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuZ3osIG1ha2UtZ2RiLnRhci5neik6ICBSZW5hbWVkIGZyb20KLQlnZGIudGFyLlogYW5kIG1ha2UtZ2RiLnRhci5aIHJlc3BlY3RpdmVseS4KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuZ3opOiAgTm93IG9ubHkgYnVpbGQgZ3ppcCdkIGFyY2hpdmUuCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLmd6KTogIE1pbm9yIGNoYW5nZXMgdG8gbW92ZSBjbG9zZXIKLQl0byBjb252ZXJnZW5jZSB3aXRoICd0YXonIHRhcmdldCBpbiBNYWtlZmlsZS5pbi4KLQotRnJpIEp1bCAzMCAxMjozNDo1NyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2ggKGRzdHRtcCk6IHVzZSB0cmFwIHRvIGVuc3VyZSB0aGF0IHRtcCBmaWxlcyBnbwotCWF3YXkgb24gZXJyb3IgY29uZGl0aW9ucwotCi1XZWQgSnVsIDI4IDExOjU3OjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IHJlbW92ZSBMT0FETElCRVMKLQotVHVlIEp1bCAyNyAxMjo0Mzo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGlycyk6IERlYWwgd2l0aCBhIHByZWZpeCBsaWtlIC9nbnU7Ci0JaXRzIHBhcmVudCBpcyAnLycgbm90ICcnLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGNvbW1lbnRzIGFib3V0IENoYW5nZUxvZy4KLQotRnJpIEp1bCAyMyAwOTo1MzozNyAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25Ad2FoaW5pLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogaWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZSBkb2Vzbid0IGV4aXN0LCBkb24ndCBhc3N1bWUKLQl0aGF0ICR7bmV3c3JjZGlyfS9jb25maWd1cmUuaW4gZG9lcy4KLQotVHVlIEp1bCAyMCAxMToyODo1MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHN1cHBvcnQgZm9yIENPTkZJR19TSEVMTAotCi1Nb24gSnVsIDE5IDIxOjU0OjQ2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChuZXR3YXJlKTogIEFkZCBhcyBhIGJhc2ljIHN5c3RlbSB0eXBlLgotCi1XZWQgSnVsIDE0IDEyOjAzOjExIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogZGVwZW5kIG9uIGNvbmZpZ3VyZS5pbi4gIEFsc28gZHJvcCB0aGUKLQkgICQoc3JjZGlyKS8gZnJvbSB0aGUgZGVwZW5kZW5jeSBvbiBNYWtlZmlsZS5pbi4KLQotVHVlIEp1bCAxMyAyMDoxMDo1OCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgaDgzMDBoaG1zIGFzIGg4MzAwaC1oaXRhY2hpLWhtcy4KLQkoaDgzMDBoaG1zIGlzIHRlbXBvcmFyeSB1bnRpbCBtdWx0aS1saWJyYXJpZXMgYXJlIGltcGxlbWVudGVkKS4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGg4MzAwaCB0b28uCi0KLVN1biBKdWwgMTEgMTc6MzU6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGRweC8yIGFzIG02OGstYnVsbC1zeXN2My4KLQotVGh1IEp1bCAgOCAxODoyNjoxMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgUmVtb3ZlIGV4dHJhbmVvdXMgb3V0cHV0IHdoZW4gZ3Vlc3NpbmcgaG9zdCB0eXBlLgotCSogY29uZmlnLmd1ZXNzOiAgUmVtb3ZlIGV4dHJhbmVvdXMgb3V0cHV0IHdoZW4gZ3Vlc3NpbmcgdXNpbmcgQwotCWNvbXBpbGVyIHJhdGhlciB0aGFuIHVuYW1lLCBvciB3aGVuIGd1ZXNzaW5nIGZhaWxzLgotCi1XZWQgSnVsICA3IDE3OjU4OjE0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBhbGwuY3Jvc3MgYW5kIGluc3RhbGwuY3Jvc3MgdGFyZ2V0cwotCi0JKiBjb25maWd1cmU6IHJlbW92ZSBDUk9TUz0tRENST1NTX0NPTVBJTEUgYW5kIEFMTD1hbGwuY3Jvc3MKLQkgIGRlZmluaXRpb25zCi0KLVR1ZSBKdWwgIDYgMTA6Mzk6NDQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXQgc2gpOiBCdWlsZCBncHJvZi4KLQotVGh1IEp1bCAgMSAxNjo1Mjo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGNoYW5nZSAtc29sYXJpcyB0byAtc29sYXJpczIKLQotVGh1IEp1bCAgMSAxNTo0NjoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgY29uZmlnL21oLXJpc2NvcyBmb3IgbWlwcy0qLXN5c3YqLgotCi1XZWQgSnVuIDMwIDA5OjMxOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDb3JyZWN0IGVycm9yIG1lc3NhZ2UgZm9yIG1pc3NpbmcgTWFrZWZpbGUuaW4gdG8KLQlwcmludCBjb3JyZWN0IGRpcmVjdG9yeS4KLQotVHVlIEp1biAyOSAxMzo1MjoxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IGtsdWRnZSBhcm91bmQgMzg2QlNEIHNoZWxsIGJ1ZwotCi1UdWUgSnVuIDI5IDEzOjA2OjQ5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIE5lWFQuCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaTQ4Ni1uY3Itc3lzdjQuCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIHJtICQoVE9PTCktJCRWRVIgYmVmb3JlIGxpbmtpbmcuCi0KLVR1ZSBKdW4gMjkgMTI6NTA6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRUlORk9GTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgTUFLRUlORk8gYXMgTUFLRUlORk8gTUFLRUlORk9GTEFHUy4KLQkqIGJ1aWxkLWFsbC5taywgdGVzdC1idWlsZC5tazogUGFzcyBkb3duIC0tbm8tc3BsaXQgYXMKLQlNQUtFSU5GT0ZMQUdTIHdoZW4gaG9zdGVkIG9uIERPUy4gIENvbXBpbGUgRE9TIGhvc3RlZCB3aXRob3V0IC1nLgotCi1UaHUgSnVuIDI0IDEzOjM5OjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6ICBBZGQgQ09QWUlORyBDT1BZSU5HLkxJQiBpbnN0YWxsLnNoLgotCi1XZWQgSnVuIDIzIDEyOjU5OjIxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxpYmcrKy50YXIueik6ICBOZXcgcnVsZS4KLQkqIE1ha2VmaWxlLmluICh0YXopOiAgUmVwbGFjZSAnY29uZmlndXJlIC1ybScgYnkgJ21ha2UgZGlzdGNsZWFuJy4KLQkqIE1ha2VmaWxlLmluICh0YXopOiAgT25seSBkbyBhIHNpbmdsZSBjaG1vZC4KLQotRnJpIEp1biAxOCAxMjowMzoxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgbWFqaXBvb3IuY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogZG9uJ3QgdXNlIGRpcm5hbWUgYW55bW9yZSAocmVwbGFjZWQgd2l0aCBzZWQgdXNhZ2UpCi0KLVRodSBKdW4gMTcgMTg6NDM6NDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGV4dGVuc2lvbiBmb3IgZ3ppcCdkIGZpbGVzIGZyb20gJy56JyB0bwotCScuZ3onIHBlciBuZXcgRlNGIHN0YW5kYXJkIHVzYWdlLgotCi1UaHUgSnVuIDE3IDE2OjU4OjUwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBtYWppcG9vci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBmaW5hbCB2YWx1ZSBvZiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0KLVR1ZSBKdW4gMTUgMTY6NDg6NTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IGluc3RhbGwuc2ggc3VwcG9ydDsgdXBkYXRlIGluc3RhbGwtaW5mbyBydWxlcwotCi1XZWQgSnVuICA5IDEyOjMxOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBkaWZmIGZvciBjcm9zc2VzLCBidXQgbm90IGZvciBnbzMyIGhvc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZ3Byb2Ygb25seSBmb3IgbmF0aXZlLCBhbmQgZG9uJ3QgYnVpbGQgaXQKLQlmb3IgbWlwcy0qLSosIHJzNjAwMC0qLSosIG9yIGlbMzRdODYtKi1zY28qLgotCi1Nb24gSnVuICA3IDEzOjEyOjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGJ1aWxkIGdhcyxsZCxiaW51dGlscyBvbiBmb3IgKi0qLXN5c3Y0Ci0KLU1vbiBKdW4gIDcgMTE6NDA6MTEgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGQgcHJtcy4KLQotRnJpIEp1biAgNCAxMzozMDo0MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIGdjYywgZG8gaW5zdGFsbGF0aW9uIG9mICQoSU5TVEFMTF9NT0RVTEVTKQotCXdpdGggJChGTEFHU19UT19QQVNTKSBvbiB0aGUgY29tbWFuZCBsaW5lCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBseW54IGFuZCBseW54b3MKLQotRnJpIEp1biAgNCAxMDo1OTo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtZWNvZmYqLCBub3QganVzdCAtZWNvZmYuCi0KLVRodSBKdW4gIDMgMTc6Mzg6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogVXNlIC5neiBzdWZmaXggaW5zdGVhZCBvZiAuei4KLQkoYmludXRpbHMudGFyLmd6LCBnYXMrYmludXRpbHMudGFyLmd6LCBnYXMudGFyLmd6KTogRml4ZWQgdGFyZ2V0Ci0JbmFtZXMuCi0KLVRodSBKdW4gIDMgMDA6Mjc6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodmF1bHQtaW5zdGFsbCk6IGFkZCBhbiAnZWxzZSB0cnVlJyAoZm9yIFVsdHJpeCkKLQotV2VkIEp1biAgMiAxODoxOToxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMpOiAgaW5zdGFsbCBnY2MgbGFzdCwgc28KLQl0aGF0IHJlYnVpbGRzIHRoYXQgbWlnaHQgaGFwcGVuIGR1cmluZyAnbWFrZSBpbnN0YWxsJyBkb24ndCBnZXQKLQlib2d1cyBnY2MgaW5jbHVkZSBmaWxlcwotCi1XZWQgSnVuICAyIDE2OjE0OjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUNoYW5nZSBmcm9tIFV0YWggZm9yIEhQUEEgc3VwcG9ydDoKLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGhwcGExLngtaHAtYnNkLgotCi1XZWQgSnVuICAyIDExOjUzOjMzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgQWRkIHN1cHBvcnQgZm9yIE1vdG9yb2xhIERlbHRhIDY4aywgdXAgdG8gcjN2Ny4KLQlQYXRjaCBmcm9tIHBvdEBmbHkuY251Y2UuY25yLml0IChGcmFuY2VzY28gUG90b3J0aWApLgotCi1UdWUgSnVuICAxIDE3OjQ4OjQyIDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIHJvbTY4ayBhbmQgYnVnIGJvb3QgbW9uaXRvcnMuCi0KLU1vbiBNYXkgMzEgMDk6MzY6MzcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlIGFsbC1vcGNvZGVzIGRlcGVuZCBvbiBhbGwtYmZkLgotCi1UaHUgTWF5IDI3IDA4OjA1OjMxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGRlZCBzcGVjaWFsIGNoZWNrIGZvciBpWzM0XTg2LXVuaXZlbC1zeXN2NCouCi0KLVdlZCBNYXkgMjYgMTY6MzM6NDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEZvciBpWzM0XTg2LXVua25vd24tc3lzdjQgdXNlIFVOQU1FX01BQ0hJTkUgZm9yCi0JdGhlIHByb2Nlc3NvciByYXRoZXIgdGhhbiBhc3N1bWluZyBpNDg2LgotCi1XZWQgTWF5IDI2IDA5OjQwOjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBTdW5PUzYgYXMgU29sYXJpczMuCi0KLVR1ZSBNYXkgMjUgMjM6MDM6MTEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEZpeCB0eXBvLiAgQXZvaWQgI2VsaWYgKG5vdCBpbiBLJlIgMSkuCi0JUmVjb2duaXplIFN1bk9TIDUuKiBvbmx5IChhbmQgbm90IFs2LTldLiopIGFzIGJlaW5nIFNvbGFyaXMyLgotCi1UdWUgTWF5IDI1IDEyOjQ0OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rIChhbGwtY3Jvc3MpOiBOZXcgdGFyZ2V0IGZvciBDYW5hZGlhbiBDcm9zcy4KLQlBZGRlZCBRMiBnbzMyIHRhcmdldHMuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBDb25maWd1cmUgZ28zMiBjcm9zcyBzcGFyY2xpdGUtYW91dCBhbmQKLQltaXBzLWlkdC1lY29mZiAtd2l0aC1nbnUtbGQuICBNb3ZlZCBidWlsZCBiaW5hcnkgZGlyZWN0b3J5IGZyb20KLQlQQVJUSUFMX0hPTEVfRElSUyB0byBCVUlMRF9IT0xFU19ESVJTLgotCi1Nb24gTWF5IDI0IDE1OjMwOjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBmaXggQWxwaGEgR0RCIHR5cG87IGFsc28sIGRvbid0IGJ1aWxkIERlamFHbnUgZm9yCi0JR08zMiBob3N0ZWQgdG9vbGNoYWlucwotCi1Nb24gTWF5IDI0IDE0OjE4OjQxIDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBjaGFuZ2UgIHNvICItZXhlYy1wcmVmaXgiIGdldHMgcGFzc2VkIGRvd24gcmF0aGVyCi0JdGhhbiAiLWV4ZWNfcHJlZml4IiBzbyBhdXRvY29uZiBnZW5lcmF0ZWQgTWFrZWZpbGVzIGdldCB0aGUKLQlleGVjX3ByZWZpeCBzZXQgcmlnaHQuCi0KLUZyaSBNYXkgMjEgMTA6NDI6MjUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGdldCB0aGUgU29sYXJpczIgbWlub3IgdmVyc2lvbiBudW1iZXIKLQotCSogTWFrZWZpbGUuaW46IGFkZCBzdGFuZGFyZHMudGV4aSBhbmQgbWFrZS1zdGRzLnRleGkgdG8gRVRDX1NVUFBPUlQKLQotRnJpIE1heSAyMSAwNjoyMDo1MiAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIHNvbWUgU2VxdWVudCBwbGF0Zm9ybXMuCi0KLVRodSBNYXkgMjAgMTQ6MzM6NDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdGhlIHZhdWx0LWluc3RhbGwgdGFyZ2V0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWN0dWFsbHkgdXNlIHRoZSBTdW4zIG1ha2VmaWxlIGZyYWdtZW50IHRoYXQncyBpbgotCWNvbmZpZywgYWxzbyBhZGRlZCB0aGUgcmVsZWFzZSBkaXIgdG8gY29uZmlnZGlycwotCi1UaHUgTWF5IDIwIDE0OjE5OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEZpeCBtb2RlcyBvbiBzdHVmZiBpbiAkKFRPT0wpIGRpciBhbHNvLgotCi1UdWUgTWF5IDE4IDIwOjI2OjQxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgc29tZSBwcm9ncmFtIGZyb20gQWxwaGEgdGFyZ2V0dGVkIHRvb2xjaGFpbnMKLQotVHVlIE1heSAxOCAxNToyMzoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRkRJUlMpOiBSZW5hbWVkIGZyb20gUFJPVE9ESVJTLiAgQWRkIGxkIGFuZAotCWdwcm9mLgotCSh0YXopOiBSdW4gIm1ha2UgZGlzdHN0dWZmIiBpbiB0aG9zZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mICJtYWtlCi0JcHJvdG8tZGlyIi4gIExvb2sgZm9yICJWRVJTSU9OPSIgb25seSBhdCBzdGFydCBvZiBsaW5lIGluIHN1YmRpcgotCU1ha2VmaWxlLiAgVXNlICJnemlwIC05IiBmb3IgY29tcHJlc3Npb24uCi0JKFRFWElORk9fU1VQUE9SVCwgRElTVF9TVVBQT1JULCBCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBOZXcgdmFycy4KLQkoYmludXRpbHMudGFyLnopOiBOZXcgdGFyZ2V0LgotCi1Nb24gTWF5IDE3IDE3OjAxOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogSW5jbHVkZSBncGwudGV4aW5mby4KLQotRnJpIE1heSAxNCAwNjo0ODozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMpOiBNZXJnZWQgaW50byAidGF6IiB0YXJnZXQuCi0JKHRheik6IE9ubHkgZG8gYHByb3RvLWRpcicgc3R1ZmYgaWYgYSBkaXJlY3RvcnkgaXMgYWN0dWFsbHkgbmVlZGVkCi0JZm9yIHRoaXMgdGFyZ2V0LgotCi1XZWQgTWF5IDEyIDEzOjA5OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1VTkNIX05NKTogTmV3IHZhcmlhYmxlLCBkZWZpbmVkIHRvIGJlICQoTk0pLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIE1VTkNIX05NLgotCShIT1NUX0NDLCBIT1NUX1BSRUZJWCwgSE9TVF9QUkVGSVhfMSk6IE5ldyB2YXJpYWJsZXMuCi0JKEVYVFJBX0dDQ19GTEFHUyk6IFBhc3MgZG93biBIT1NUXyogdmFyaWFibGVzLgotCShnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IENvcnJlY3QgZm9yIGN1cnJlbnQgZ2NjIE1ha2VmaWxlLgotCi1UdWUgTWF5IDExIDEwOjE0OjI1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgQWRkIGNvbmZpZ3VyZSwgY29uZmlnLmd1ZXNzLAotCWNvbmZpZy5zdWIsIGFuZCBtb3ZlLWlmLWNoYW5nZSB0byBnZGIgdGVzdHN1aXRlIGRpc3RyaWJ1dGlvbgotCWFyY2hpdmUsIHNvIHRoZSB0ZXN0c3VpdGUgY2FuIGJlIGV4dHJhY3RlZCwgY29uZmlndXJlZCwgYW5kCi0JcnVuIHNlcGFyYXRlbHkgZnJvbSB0aGUgZ2RiIGRpc3RyaWJ1dGlvbi4gIEJsb3cgYXdheSB0aGUgQ2hpbGwKLQl0ZXN0cyB0aGF0IHJlcXVpcmUgYSBDaGlsbCBjb21waWxlZCBleGVjdXRhYmxlLCBzaW5jZSBHTlUgQ2hpbGwKLQlpcyBub3QgeWV0IHB1YmxpY2FsbHkgYXZhaWxhYmxlLgotCi1Nb24gTWF5IDEwIDE3OjIyOjI2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHNpbmdsZSBjb21tYW5kLAotCWluc3RlYWQgb2YgYSBsaXN0IG9mIGFzc2lnbm1lbnRzIGFuZCBleHBvcnRzCi0KLQkqIGNvbmZpZy5ndWVzczogcmVjb2duaXplIEFscGhhL09TRjEgc3lzdGVtcwotCi1Nb24gTWF5IDEwIDE0OjU1OjUxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDaGFuZ2UgaGVscCBtZXNzYWdlIHRvIHByZWZlciAtLW9wdGlvbnMgcmF0aGVyIHRoYW4KLQkgIC1vcHRpb25zLgotCi1Nb24gTWF5IDEwIDA1OjU4OjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBDb252ZXJnZW50IFRlY2guICJtaW5pZnJhbWUiIHVzZXMgbTY4MDEwLCBzZXoKLQl6aXBweUBlY3N0LmNzdWNoaWNvLmVkdS4KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG1pbmlmcmFtZS4KLQotU3VuIE1heSAgOSAxNzo0Nzo1NyAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLSAgICAgICAqIE1ha2VmaWxlLmluOiBVc2Ugc3Jjcm9vdCB0byBmaW5kIHJ1bnRlc3QgcmF0aGVyIHRoYW4gcm9vdG1lLgotICAgICAgIFBhc3MgUlVOVEVTVEZMQUdTIGFuZCBFWFBFQ1QgZG93biBpbiBCQVNFX0ZMQUdTX1RPX1BBU1MuCi0KLUZyaSBNYXkgIDcgMTQ6NTU6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIHN1cHBvcnQgYnVpbGRpbmcgb24gYQotCW1hY2hpbmUgb3RoZXIgdGhhbiB0aGUgaG9zdC4KLQotV2VkIE1heSAgNSAwODozNTowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh0b29sZGlyKTogRml4IGZvciBpMzg2LWFpeCBhZ2Fpbi4KLQotTW9uIE1heSAgMyAxOTowMDoyNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogIENoYW5nZSBkZWZpbml0aW9uIG9mICQodG9vbGRpcikKLQl0byBtYXRjaCB0aGUgRlNGLgotCi1GcmkgQXByIDMwIDE1OjU1OjIxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaVszNF04Ni9TVlI0LgotCi1GcmkgQXByIDMwIDE1OjUyOjQ2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdkYik6IGdkYiBkZXBlbmRzIG9uIHNpbS4KLQotVGh1IEFwciAyOSAyMzozMDo0OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuWik6ICBNYWtlIHByb3RvdHlwZSBnZGIgdGVzdHN1aXRlIGRpcmVjdG9yeQotCWF0IHRoZSBzYW1lIHRpbWUgd2UgbWFrZSB0aGUgcHJvdG90eXBlIGdkYiBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgTWFrZSB0aGUgdGVzdHN1aXRlIGRpc3RyaWJ1dGlvbgotCWZpbGVzIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGdkYiBiYXNlIHJlbGVhc2UgZGlzdHJpYnV0aW9uLgotCi1UaHUgQXByIDI5IDEyOjUwOjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogVXNlIGluZGl2aWR1YWwgY2hlY2sgdGFyZ2V0cyByYXRoZXIgdGhhbgotCURPX1ggcnVsZS4KLQkoY2hlY2stZ2NjKTogQWRkZWQuCi0KLVRodSBBcHIgMjkgMDk6NTA6MDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFVzZSBzeXN2My4yIG5vdCBzeXN2MzIgZm9yIGNhbm9uaWNhbCBPUwotCWZvciBTeXN0ZW0gViByZWxlYXNlIDMuMi4KLQotVGh1IEFwciAyOSAxMDozMzoyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBocHBhb3NmLgotCSogY29uZmlndXJlLmluOiBEbyBjb25maWd1cmUgbGQvYmludXRpbHMvZ2FzIGZvciBpdC4KLQotVHVlIEFwciAyNyAwNjoyNTozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh0b29sZGlyKTogQWx0ZXIgc3ludGF4IHVzZWQgdG8gc2V0IHRoaXMsIGZvciBzeXN0ZW1zCi0Jd2hlcmUgIlwkIiBpc24ndCBoYW5kbGVkIHJpZ2h0LCBsaWtlIGkzODYtYWl4LgotCi1UaHUgQXByIDIyIDA4OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBQYXNzIHByb2dyYW0tdHJhbnNmb3JtLW5hbWUsIG5vdAotCXByb2dyYW1fdHJhbnNmb3JtX25hbWUsIHRvIHJlY3Vyc2l2ZSBjb25maWd1cmVzLgotCi1UaHUgQXByIDIyIDAyOjU4OjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2FzK2JpbnV0aWxzLnRhci56KTogTmV3IHJ1bGUgZm9yIGJ1aWxkaW5nIHNuYXBzaG90cwotCW9mIGdhcytsZCtiaW51dGlscy4KLQotTW9uIEFwciAxOSAxNzo0MTozMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIEFJWDMuMiBhcyBkaXN0aW5jdCBmcm9tIDMuMS4KLQotU2F0IEFwciAxNyAxNzoxOTo1MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVuYW1lIG04OGstbW90b3JvbGEtbTg4a2JjcyB0byBtODhrLW1vdG9yb2xhLXN5c3YKLQotCSogY29uZmlnL21oLWRlbHRhODg6IHJlbW92ZSBleHRyYW5lb3VzIEdDQyByZWZlcmVuY2VzCi0KLVR1ZSBBcHIgMTMgMTY6NTI6MTYgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUFJNUyk6IFNldCBiYWNrIHRvIGFsbC1wcm1zLgotCi1TYXQgQXByIDEwIDEyOjA0OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogUGFzcyAtd2l0aC1nbnUtYXMgZm9yIGtub3duIE1JUFMgbmF0aXZlIGFuZCBNSVBTCi0JdGFyZ2V0cywgcmF0aGVyIHRoYW4gZm9yIE1JUFMgaG9zdHMuCi0KLUZyaSBBcHIgIDkgMTM6NTE6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBjb21tZW50IGZvciAtLXdpdGgteCBkZWZhdWx0IHZhbHVlcwotCi0JKiBjb25maWcuZ3Vlc3M6IGhhbmRsZSBNb3Rvcm9sYSBEZWx0YTg4IGJveCBmb3IgU1ZSMyBhbmQgU1ZSNC4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBjaGVjay0qIHRhcmdldHMgZm9yIGVhY2ggb2YgdGhlIGRpcmVjdG9yaWVzIGluCi0JdGhlIHRyZWUuICBBZGQgYSBkZWZpbml0aW9uIG9mIFJVTlRFU1QgdGhhdCB3aWxsIHVzZSB0aGUgb25lIHdlCi0JanVzdCBidWlsdCwgaWYgaXQgZXhpc3RzLiAgUGFzcyB0aGlzIGRvd24gdmlhIEZMQUdTX1RPX1BBU1MuCi0KLVRodSBBcHIgIDggMDk6MjE6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZWQgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBiZmRfdGFyZ2V0IGFuZAotCXRhcmdldF9tYWtlZmlsZV9mcmFnLgotCi0JKiBidWlsZC1hbGwubWs6IFNldCBhc3NvcnRlZCB0YXJnZXRzIGZvciBRMi4KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSB6OGstc2ltIGFuZCBoODMwMC1obXMuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBSZWFsbHkgZG9uJ3QgcGFzcyBob3N0IHRvIGNvbmZpZ3VyZS4KLQkoSE9MRVMpOiBBZGRlZCB1bmFtZS4KLQotV2VkIEFwciAgNyAxNTo0ODoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIGFuIGVtcHR5IHByb2dyYW0tcHJlZml4LCBwcm9ncmFtLXN1ZmZpeCBvcgotCXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgY29ycmVjdGx5LgotCi1UdWUgQXByICA2IDEzOjQ4OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiAtRyA4IG5vIGxvbmdlciByZXF1aXJlZCBmb3IgTUlQUyB0YXJnZXRzLgotCSogdGVzdC1idWlsZC5tazogRG9uJ3QgcGFzcyBob3N0IGFyZ3VtZW50IHRvIGNvbmZpZ3VyZTsgbWFrZSBpdAotCWd1ZXNzLgotCi1UdWUgQXByICA2IDEwOjM2OjUzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5aKTogIEZpeCBmb3IgYnVpbGRpbmcgZ3ppcCdkIGRpc3RyaWJ1dGlvbi4KLQkqIE1ha2VmaWxlLmluIChDT01QUkVTUyk6ICBOZXcgbWFjcm8sIGxpa2UgR1pJUC4KLQotRnJpIEFwciAgMiAwOTowMjozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IFVzZSAtd2l0aC1nbnUtYXMgZm9yIG1pcHMtc2dpLWlyaXg0IGFzIHdlbGwuCi0KLQkqIGJ1aWxkLWFsbC5tazogU2V0IEdDQyB0byBnY2MgLU8gLUcgOCBmb3IgTUlQUyB0YXJnZXRzLCBzaW5jZSBnY2MKLQl3aXRoIGdhcyBjdXJyZW50bHkgZGVmYXVsdHMgdG8gLUcgMC4KLQotVGh1IEFwciAgMSAwODoyNTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZmxleCk6IGZsZXggZGVwZW5kcyBvbiBieWFjYy4KLQotCSogYnVpbGQtYWxsLm1rOiBJZiBob3N0IG5vdCBzcGVjaWZpZWQsIHVzZSBjb25maWcuZ3Vlc3MuICBQYXNzIFRBRwotCXRvIHRlc3QtYnVpbGQubWsgYXMgUkVMRUFTRV9UQUcuCi0JKiB0ZXN0LWJ1aWxkLm1rIChjb25maWdhcmdzKTogTmV3IHZhcmlhYmxlIGNvbnRhaW5pbmcgYXJndW1lbnRzIHRvCi0JcGFzcyB0byBjb25maWd1cmUuICBTZXQgdG8gLXdpdGgtZ251LWFzIG9uIG1pcHMtZGVjLXVsdHJpeC4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBSRUxFQVNFX1RBRy4KLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgL2Jpbi91bmFtZSB3aGVuIGNoZWNraW5nIC1YIGFyZ3VtZW50IG9uIFNDTywKLQl0byBhdm9pZCBpbnZva2luZyBHTlUgdW5hbWUgd2hpY2ggZG9lc24ndCB1bmRlcnN0YW5kIC1YLgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBEb24ndCB1c2UgL3Vzci91bnN1cHBvcnRlZC9iaW4vYXMgb24gQUlYLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGdhcyBmb3IgbWlwcy0qLSouCi0KLVdlZCBNYXIgMzEgMjE6MjA6NTggMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLm5vcm1hbCk6IGluc2VydCBtaXNzaW5nIGJhY2tzbGFzaC4KLQotV2VkIE1hciAzMSAxMjozMTo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5taywgY29uZmlnL21oLWlyaXg0OiBCdW1wIC1YTmggdmFsdWUgdG8gMTUwMCB0byBtYXRjaAotCWdjYyByZXF1aXJlbWVudHMuCi0KLQkqIE1ha2VmaWxlLmluOiBDb21wbGV0ZSBvdmVyaGF1bCB0byBtZXJnZSBtYW55IGFsbW9zdCBpZGVudGljYWwKLQl0YXJnZXRzLgotCi1UdWUgTWFyIDMwIDIwOjE3OjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMtZ2RiKTogUmVuYW1lZCBmcm9tIHNldHVwLWRpcnMuCi0JKGdkYi50YXIuWik6IEFkanVzdGVkLgotCi0JKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycywgdGF6KTogTmV3IHRhcmdldHM7IHNob3VsZCBiZSBnZW5lcmFsCi0JZW5vdWdoIHRvIGFkYXB0IGZvciBnZGIgc29tZXRpbWUuICBCdWlsZCBvbmx5IC56IGZpbGUuCi0JKGdhcy50YXIueik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBNYXIgMzAgMTA6MDM6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IFVzZSBDQz1jYyAtWHMgb24gU29sYXJpcy4KLQotTW9uIE1hciAyOSAxOTo1OToyNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zdW4zOiBjYyBuZWVkcyAtSiB0byBjb21waWxlIGNwLXBhcnNlLmMgY29ycmVjdGx5Ci0KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiBTdW5QUk8gQyBuZWVkcyAtWHMgdG8gYmUgYWJsZSB0byBnZXQgYQotCXdvcmtpbmcgeG1ha2VmaWxlIGZvciBFbWFjcy4KLQotVGh1IE1hciAyNSAxNToxNDozMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBJbmNvcnBvcmF0ZSBjaGFuZ2VzIHN1Z2dlc3RlZCBieSB3aWxzb25AY3lnbnVzLmNvbQotCWZvciBoYW5kbGluZyBCSVNPTiBmb3IgRlNGIHJlbGVhc2VzLgotCi1UaHUgTWFyIDI1IDA2OjE5OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFjdHVhbGx5IGltcGxlbWVudCB0aGUgY2hhbmdlIHpvbyBqdXN0IGRvY3VtZW50ZWQuCi0KLVdlZCBNYXIgMjQgMTM6MDI6NDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogd2hlbiB1c2luZyBjb25maWcuZ3Vlc3MsIG9ubHkgc2V0IHRhcmdldF9hbGlhcyB3aGVuCi0JaXQncyBub3QgYWxyZWFkeSBiZWVuIHNldCAoaWUsIG9uIHRoZSBjb21tYW5kIGxpbmUpCi0KLU1vbiBNYXIgMjIgMjM6MDc6MzkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayB0YXJnZXQsIHNldCBQUk1TIHRvIGluc3RhbGwtcHJtcwotCi1TdW4gTWFyIDIxIDE2OjQ2OjEyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGQgc3VwcG9ydCBmb3IgcGFja2FnZV9tYWtlZmlsZV9mcmFnbWVudCwgaGFuZGxlIHRoZQotCWNhc2Ugd2hlcmUgYSBkaXJlY3RvcnkgaGFzIGEgY29uZmlndXJlLmluIGZpbGUgYnV0IG5vIE1ha2VmaWxlLmluCi0JbW9yZSBncmFjZWZ1bGx5ICh3aXRoIGFuIGFjdHVhbCB1bmRlcnN0YW5kYWJsZSBlcnJvciBtZXNzYWdlLCBldmVuKTsKLQlhZGQgc3VwcG9ydCBmb3IgLS13aXRob3V0IChhbmQgYWRkIHRoaXMgdG8gdGhlIHVzYWdlIG1lc3NhZ2UpOyBhbHNvCi0JZXhwbGljaXRseSBhZGQgYSAtLWhvc3Q9JHtob3N0X2FsaWFzfSB0byB0aGUgY29tbWFuZCBsaW5lIHdoZW4KLQljb25maWcuZ3Vlc3MgaXMgdXNlZAotCi1TdW4gTWFyIDIxIDEyOjExOjU4IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBNdXN0IHVzZSBib3RoIC0taG9zdCBhbmQgLS10YXJnZXQgaW4gcmVjdXJzaXZlIGNhbGxzLgotCi1UaHUgTWFyIDE4IDEyOjMxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBkZWphLWdudSB0byBkZWphZ251LgotCi1Nb24gTWFyIDE1IDE1OjQ0OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChoODMwMC0qLSosIGg4NTAwLSotKik6IERvbid0IGJ1aWxkIGxpYmcrKy4KLQotRnJpIE1hciAxMiAxODozMDoxNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogY2Fub25pY2FsaXplIGFsbCBpbnN0YW5jZXMgdG8gKi0qLXNvbGFyaXMyKiwKLQlhbHNvIHN0cmlwIG91dCBhIG51bWJlciBvZiB0b29scyB0byBub3QgYnVpbGQgZm9yIGdvMzIgaG9zdAotCi1XZWQgTWFyIDEwIDEyOjA4OjI3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGQgR1BMLgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmd1ZXNzLCBjb25maWcuc3ViLCBjb25maWd1cmU6IGJ1bXAKLQkgIGNvcHlyaWdodHMgdG8gOTMuCi0KLVdlZCBNYXIgMTAgMDc6MTI6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZG8taW5mbyk6IFJlbW92ZWQgb2Jzb2xldGUgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZgotCWxvY2FsZW52IGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCi1XZWQgTWFyIDEwIDAzOjExOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGEgY291cGxlIG9mICdlbHNlIHRydWUnIGZvciBkZWNzdGF0aW9uLAotCXN1cHBvcnQgZm9yIFRjbFgKLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgdGNsWCB0b287IGRvbid0IHJlbW92ZSBUayBvbiBSUy82MDAwIGFueW1vcmUKLQotVHVlIE1hciAgOSAxNjowNjoxMiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMpOiBjaGFuZ2UgaW52b2NhdGlvbiBvZiBtYWtlIHRvICQoTUFLRSkuCi0KLU1vbiBNYXIgIDggMTQ6NTI6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaTM4Ni1pYm0tYWl4IChQUy8yKS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGNvbmZpZy9taC1haXgzODYgZmlsZSBmb3IgaXQuCi0KLU1vbiBNYXIgIDggMTE6MTI6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR0NDX0ZPUl9UQVJHRVQpOiBFbGltaW5hdGVkIGRlZmluaXRpb247IHVzZQotCUNDX0ZPUl9UQVJHRVQgaW5zdGVhZC4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBHQ0NfRk9SX1RBUkdFVD0kKENDX0ZPUl9UQVJHRVQpLgotCi1XZWQgTWFyICAzIDE2OjAwOjI4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQG9rLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc2ltIHRvIGxpc3Qgb2YgZGlyZWN0b3JpZXMgc2VudCB3aXRoIGdkYgotCi1XZWQgTWFyICAzIDExOjQyOjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFB1dCBiYWNrIG1pcHMtZGVjLWJzZCogY2FzZS4KLQotVHVlIE1hciAgMiAyMToxNTo1OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCShVbHRyaXggMi4yIHN1cHBvcnQgZnJvbSBNaWNoYWVsIFJlbmRlbGwgPG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2E+KQotCSogY29uZmlndXJlLmluICh2YXgtKi11bHRyaXgyKik6ICBBZGQgVWx0cml4IDIuMiB0cmlwbGV0LgotCSogY29uZmlnLmd1ZXNzOiAgQ2hhbmdlICdWQVgqOlVMVFJJWDoqOionIHRvICdWQVgqOlVMVFJJWCo6KjoqJy4KLQkqIGNvbmZpZy9taC12YXh1bHQyOiAgTmV3IGZpbGUuCi0KLVR1ZSBNYXIgIDIgMTg6MTE6MDMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBuby1vcCBtaXBzLWRlYy1ic2QqIGluICJjYXNlICR0YXJnZXQiCi0KLQkqIE1ha2VmaWxlLmluIChkaXIuaW5mbyk6IG9ubHkgcnVuIGdlbi1pbmZvLWRpciBpZiBpdCBleGlzdHMsCi0JKGluc3RhbGwtaW5mbyk6IGluc3RhbGwgZGlyLmluZm8gb25seSBpZiBpdCBleGlzdHMsCi0JKGFsbC1leHBlY3QsIGluc3RhbGwtZXhwZWN0KTogcGFzcyBhbG9uZyBYMTFfRkxBR1NfVE9fUEFTUwotCi1UdWUgTWFyICAyIDA5OjAxOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciB2bXMgdGFyZ2V0LCBza2lwIGJmZCwgbGQsIGJpbnV0aWxzLiAgRG8gYnVpbGQKLQlnYXMgZm9yIG1pcHMtZGVjLWJzZC4KLQotVHVlIE1hciAgMiAwODozNToyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAobWFrZXNyY2Rpcik6IElmICR7c3JjZGlyfSBpcyByZWxhdGl2ZSBhbmQgbm90ICIuIiwKLQlhbmQgJHtzdWJkaXJ9IGlzIG5vdCAiLiIsIHNldCBtYWtlc3JjZGlyIGJhc2VkIG9uICR7aW52c3ViZGlyfS4KLQotVHVlIEZlYiAyMyAxNDoxODoyOCAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkICJkZWphZ251IiB0byBob3N0dG9vbHMgbGlzdC4KLQotTW9uIEZlYiAyMiAyMzoyODozOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbiwgY29uZmlnLmd1ZXNzOiAgQWRkIHN1cHBvcnQKLQlmb3IgQm9zeCwgYW4gQUlYIHZhcmlhbnQgZnJvbSBCdWxsLgotCVBhdGNoZXMgZnJvbSBGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIuCi0KLVN1biBGZWIgMjEgMTE6MTU6MjIgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZGV2by9kZWphZ251OiBJbml0aWFsIGNyZWF0aW9uIG9mIGRldm8vZGVqYWdudS4KLQlNaWdyYXRlZCBkZWphZ251IHRlc3RjYXNlcyBhbmQgc3VwcG9ydCBmaWxlcyBmb3IgdGVzdGluZyBzb2Z0d2FyZQotCXRvb2xzIHRvIHJlc2lkZSBhcyBzdWJkaXJlY3RvcmllcywgY3VycmVudGx5IGNhbGxlZCAidGVzdHN1aXRlIiwKLQl3aXRoaW4gdGhlIGRpcmVjdG9yeSBvZiB0aGUgc29mdHdhcmUgdG9vbC4gIE1pZ3JhdGVkIGFsbCBwcm9ncmFtcywKLQlzdXBwb3J0IGxpYnJhcmllcywgZXRjLiBiZWxvZ2luZyB0byBkZWphZ251IHByb3BlciBmcm9tCi0JZGV2by9kZWphLWdudSB0byBkZXZvL2RlamFnbnUuCVRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgotCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4JVGhlIGNoYW5nZXMgdG8gdGhlc2UgZmlsZXMgd2hpY2ggd2lsbAotCWFsbG93IHRoZW0gdG8gY29uZmlndXJlLCBidWlsZCwgYW5kIGV4ZWN1dGUgcHJvcGVybHkgd2lsbCBiZSBtYWRlCi0JaW4gYSBmdXR1cmUgdXBkYXRlLgotCi1GcmkgRmViIDE5IDIwOjE5OjM5IDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBzZW5kX3ByIHRvIHNlbmQtcHIuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogc2VuZF9wcjogUmVuYW1lZCBkaXJlY3RvcnkgdG8gc2VuZC1wci4KLQotRnJpIEZlYiAxOSAxOTowMDoxMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgc29tZSBleHRyYSBzZW1pLWNvbG9ucyAobmVlZGVkIGlmIFNIRUxMPWJhc2gpLgotCi1GcmkgRmViIDE5IDAwOjU5OjMzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBVcGRhdGUgZm9yIGdkYi00LjggcmVsZWFzZS4KLQkqIE1ha2VmaWxlLmluIChnZGIudGFyLlopOiAgQWRkIHRleGluZm8vdGV4M3BhdGNoLiAgQnVpbGQKLQlnZGIteHh4LnRhci56IChnemlwJ2QpIGZpbGUgYWxzby4KLQotVGh1IEZlYiAxOCAwOToxNjoxNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWtlIGFsbC1kaWZmIGRlcGVuZCBvbiBhbGwtbGliaWJlcnR5Ci0KLVR1ZSBGZWIgMTYgMTY6MDY6MzEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogYWRkIHZheC11bHRyaXggaW4gdGhlIHNwaXJpdCBvZiBtaXBzLXVsdHJpeC4KLQotVHVlIEZlYiAxNiAwNTo1NzoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGFkZCBoZWxsbywgdGFyLCBnemlwLCByZWNvZGUsIGluZGVudAotCi1UdWUgRmViIDE2IDAwOjU4OjIwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogIFJlbW92ZSBldGMgZGlyZWN0b3J5Ci0JKEVUQ19TVVBQT1JUKTogIE9ubHkgYWRkIHRoZSBmaWxlcyBHREIgd2FudHMgZnJvbSBldGMvLgotCShnZGIudGFyLlopOiAgVXNlIEVUQ19TVVBQT1JULiAgVXNlIGJ5YWNjIHdoZW4gYnVpbGRpbmcgdGhlIGZpbGUuCi0KLVRodSBGZWIgMTEgMjA6MTQ6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIG1ha2VpbmZvIGJpbmFyeSBpcyBpbiBhIG5ldyBsb2NhdGlvbgotCi1UdWUgRmViICA5IDEyOjQyOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1lY29mZiBhcyBhbiBPUy4KLQotCSogTWFrZWZpbGUuaW46IFZhcmlvdXMgY2hhbmdlcyB0byBlbGltaW5hdGUgYSBsZXZlbCBvZiBtYWtlCi0JcmVjdXJzaW9uIGFuZCByZWR1Y2UgdGhlIHJlcXVpcmVkIGNvbW1hbmQgbGluZSBsZW5ndGguCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IE5ldyB2YXJpYWJsZSBob2xkaW5nIGZsYWdzIHBhc3NlZCB0byBhbGwKLQlzdWItbWFrZXMuCi0JKEVYVFJBX0hPU1RfRkxBR1MsIEVYVFJBX1RBUkdFVF9GTEFHUywgRVhUUkFfR0NDX0ZMQUdTKTogTmV3Ci0JdmFyaWFibGVzIGhvbGRpbmcgc2V0dGluZ3MgZm9yIHNwZWNpZmljIHN1Yi1tYWtlcy4KLQkoRkxBR1NfVE9fUEFTUywgVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIEdDQ19GTEFHU19UT19QQVNTKTogUmV3cm90ZQotCWluIHRlcm1zIG9mIEJBU0VfRkxBR1NfVE9fUEFTUy4KLQkoVEFSR0VUX0xJQlMpOiBOZXcgdmFyaWFibGUgbGlzdGluZyBkaXJlY3RvcmllcyB3aGljaCB1c2UKLQlUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLQkoc3ViZGlyX2RvKTogRWxpbWluYXRlZC4KLQkoZG8tKik6IE5ldyBzZXQgb2YgdGFyZ2V0cyB0byByZXBsYWNlIHN1YmRpcl9kby4KLQkodmFyaW91cyk6IEFsbCB0YXJnZXRzIHdoaWNoIHVzZWQgc3ViZGlyX2RvIG5vdyBkZXBlbmQgb24gZG8tKi4KLQkobG9jYWwtY2xlYW4pOiBSZW5hbWVkIGZyb20gZG9fY2xlYW4uCi0JKGxvY2FsLWRpc3RjbGVhbik6IE5ldyB0YXJnZXQsIGRlcGVuZGVuY3kgb2YgZGlzdGNsZWFuIGFuZAotCXJlYWxjbGVhbi4KLQkoaW5zdGFsbC1pbmZvKTogRG9uJ3QgY3JlYXRlIGRpcmVjdG9yaWVzLiAgRGVwZW5kIG9uIGRpci5pbmZvCi0JcmF0aGVyIHRoYW4gY2FsbGluZyBtYWtlIHJlY3Vyc2l2ZWx5LgotCShpbnN0YWxsLWRpci5pbmZvKTogRWxpbWluYXRlZC4KLQkoaW5zdGFsbC1pbmZvLWRpcnMpOiBDcmVhdGUgYWxsIGluZm8gZGlyZWN0b3JpZXMgaGVyZS4KLQkoZGlyLmluZm8pOiBEZXBlbmQgdXBvbiBkby1pbnN0YWxsLWluZm8uCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkZWQgZmFsc2UuCi0KLVNhdCBGZWIgIDYgMTQ6MDU6MDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgQlNESSBhbmQgQlNESiAoSm9saXR6IDM4NmJzZCkuCi0KLVRodSBGZWIgIDQgMjA6NDk6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5mbyk6IHJlbW92ZSBkZXBlbmRlbmN5IG9uIGFsbC10ZXhpbmZvLiAgVGhlCi0JcHJvYmxlbSB3YXMgcmVhbGx5IGluIHRleGluZm8vQywgbm90IGF0IHRoaXMgbGV2ZWwuCi0KLVRodSBGZWIgIDQgMTM6Mzg6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5mbyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYWxsLXRleGluZm8gKFBSIDIxMTIpLgotCi1UaHUgRmViICA0IDAxOjUwOjUzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgQ2hhbmdlIEJJU09OIHRvICdiaXNvbiAteScgZm9yCi0JR0RCIHJlbGVhc2VzLgotCi1XZWQgRmViICAzIDE3OjIyOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJbmNsdWRlIHNyY2RpciBpbiBtZXNzYWdlIGFib3V0IHRhcmdldCBvZiBsaW5rIG5vdAotCWJlaW5nIGZvdW5kLiAgRG9uJ3QgY29udmVydCBgLScgdG8gYF8nIGluIGB3aXRoJyBvcHRpb25zIGJlaW5nCi0JcGFzc2VkIHRvIHN1YmRpcnMuCi0KLVR1ZSBGZWIgIDIgMTg6NTc6NTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCB1dWRlY29kZSB0byBob3N0X3Rvb2xzCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB7YWxsLGluc3RhbGx9LXV1ZGVjb2RlIHRhcmdldHMsIGFkZGVkIHRoZW0gdG8KLQl0aGUgYXBwcm9wcmlhdGUgbGlzdHMKLQotVHVlIEZlYiAgMiAxMTo0NTo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogQWRkZWQgZGVwZW5kZW5jeSBvbiBhbGwtZ2FzLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi0qKTogQnVpbGQgbGQgYW5kIGJpbnV0aWxzLgotCi1Nb24gRmViICAxIDEyOjM1OjQxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBjaGVjayByZXR1cm4gY29kZSBmcm9tIG1rZGlyLCBwcmludCBlcnJvciBtZXNzYWdlIGFuZAotCSAgZXhpdCBvbiBmYWlsdXJlLgotCi1TYXQgSmFuIDMwIDE2OjQwOjI4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgTmV3IGxvY2F0aW9uIGZvciB0ZXhpbmZvLnRleC4KLQotVGh1IEphbiAyOCAxNTowOTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkZWQgdGFyLCBjcGlvIGFuZCB1dWRlY29kZS4KLQotV2VkIEphbiAyNyAxNjo1MDozMiAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKGg4NTAwKTogIFJlY29nbml6ZSB0aGlzIGFzIGEgY3B1IHR5cGUuCi0KLVNhdCBKYW4gMjMgMjA6MzI6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHNvdXJjZSBkaXJlY3RvcnkgbWlzc2luZyBpcyBubyBsb25nZXIgYSB3YXJuaW5nCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGlyaXhbMzRdKiBpbnN0ZWFkIG9mIGlyaXhbMzRdCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgYW5kIHBhc3MgZG93biBYMTFfTElCCi0KLQkqIGNvbmZpZy9taC1zY286IGRlZmluZSBYMTFfTElCIHRvIHRoZSBtZXNzIHRoYXQgU0NPIE9EVCByZXF1aXJlcwotCi1TYXQgSmFuIDIzIDEzOjQ5OjQwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBndWVzcy1zeXN0eXBlOiBSZW5hbWVkIHRvIC4uLgotCSogY29uZmlnLmd1ZXNzOiAgLi4uIGJ5IHBvcHVsYXIgcmVxdWVzdC4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46ICBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLVRodSBKYW4gMjEgMTI6MjA6NTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGd1ZXNzLXN5c3R5cGU6ICBQYXRjaGVzIGZyb20gSm9obiBFYXRvbiA8andlQGNoZS51dGV4YXMuZWR1PjoKLQkrIEFkZCBDb252ZXgsIENyYXkvVW5pY29zLCBhbmQgRW5jb3JlL011bHRpbWF4IHN1cHBvcnQuCi0JKyBFeGVjdXRlIC4vZHVtbXkgaW5zdGVhZCBvZiBhc3N1bWluZyAuIGlzIGluIFBBVEguCi0KLVR1ZSBKYW4gMTkgMTc6MTg6MDYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGd1ZXNzLXN5c3R5cGU6ICBOZXcgc2hlbGwgc2NyaXB0LiAgQXR0ZW1wdHMgdG8gZ3Vlc3MgdGhlCi0JY2Fub25pY2FsIGhvc3QgbmFtZSBvZiB0aGUgZXhlY3V0aW5nIGhvc3QuCi0JT25seSBhIGZldyBob3N0cyBhcmUgc3VwcG9ydGVkIHNvIGZhci4KLQkqIGNvbmZpZ3VyZTogIENhbGwgZ3Vlc3Mtc3lzdHlwZSBpZiBubyBob3N0IGlzIHNwZWNpZmllZC4KLQotVHVlIEphbiAxOSAwODoyNjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IE1hZGUgdG8gd29yayB3aXRoIGN1cnJlbnQKLQlnY2MgTWFrZWZpbGUuCi0KLQotRnJpIEphbiAxNSAxMDoyNzowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHQ0NfRkxBR1NfVE9fUEFTUyk6IE5ldyB2YXJpYWJsZS4KLQkoYWxsLWdjYywgaW5zdGFsbC1nY2MsIHN1YmRpcl9kbyk6IFVzZSBpdC4KLQotV2VkIEphbiAxMyAxNzowNjo0NSAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW5hbWUgdW5pbnN0YWxsZWQgZ2NjIGRyaXZlciBmcm9tIGdjYyB0byB4Z2NjLgotCi1XZWQgSmFuICA2IDIwOjI5OjE2IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlZCBleHBsaWNpdCBzZXR0aW5nIG9mIFNVQkRJUlMuIFNVQkRJUlMgaXMgbm93Ci0JICBzZXQgZXhjbHVzaXZlbHkgYnkgY29uZmlndXJlLCB1c2luZyBjb25maWd1cmUuaW4gLgotCi1XZWQgSmFuICA2IDEzOjQ0OjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogc2V0ICRQQVRIIGZvciBhbGwgYnVpbGRzCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIFRBUkdFVF9GTEFHU19UT19QQVNTIGZvciB4aWJlcnR5IGFuZCBsaWJtCi0KLVdlZCBKYW4gIDYgMTE6MDI6MTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHQ0NfRk9SX1RBUkdFVCk6ICBTdXBwbHkgYSBkZWZhdWx0IHRoYXQgbWF0Y2hlcwotCXRoZSBvbmUgdXNlZCBpbiBnY2MvTWFrZWZpbGUuaW4sIHNvIHRoYXQgYSBudWxsIGV4cGFuc2lvbiBkb2Vzbid0Ci0Jb3ZlcnJpZGUgdGhlIG9uZSBuZWVkZWQgdG8gYnVpbGQgZ2NjIHdpdGggYSBuYXRpdmUgY2MuCi0KLQotVHVlIEphbiAgNSAwNzo1NToxMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWNjZXB0IC13aXRoIGFyZ3VtZW50cy4KLQotU3VuIEphbiAgMyAxNToxNTowOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGg4MzAwc2ltCi0KLVR1ZSBEZWMgMjkgMTU6MDY6MDAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc2NvOiBEb24ndCBvdmVycmlkZSBCSVNPTiBkZWZpbml0aW9uLgotCi0JKiBidWlsZC1hbGwubWs6IElmIGNhbm9uaG9zdCBpcyBpMzg2LXVua25vd24tc2NvMy4ydjQsIGNoYW5nZSBpdAotCXRvIGkzODYtc2NvMy4ydjQuICBTZXQgVEFSR0VUUyBhbmQgQ0ZMQUdTIGZvciBpMzg2LXNjbzMuMnY0LgotCShhbGwtY3lnbnVzLCBuYXRpdmUsIGJ1aWxkLWN5Z251cyk6IE1ha2UKLQkkKGNhbm9uaG9zdCktc3RhbXAtM3N0YWdlLWRvbmUsIG5vdCAkKGhvc3QpLi4uLgotCSogdGVzdC1idWlsZC5tayAoc3RhbXAtM3N0YWdlLWNvbXBhcmVkKTogVXNlIHRhaWwgKzEwYyBmb3IKLQlpMzg2LXNjbzMuMnY0LiAgQWRkZWQgZWxzZSB0cnVlIHRvIGlmIGNvbW1hbmQuCi0KLU1vbiBEZWMgMjggMTI6MDg6NTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IChmcm9tIEZTRikgU2VxdWVudCB1c2VzIGEgQlNELWxpa2UgT1MuCi0KLU1vbiBEZWMgMjggMDg6MzI6MDYgMTk5MiAgTWluaCBUcmFuLUxlICAobXRyYW5sZUBwYXJpcy5pbnRlbGxpY29ycC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLWlzYyopOiBhZGRlZDsgdXNlcyBtaC1zeXN2LgotCi1UaHUgRGVjIDI0IDE3OjI2OjI0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCByZW1vdmUgYmludXRpbHMgZnJvbSBTb2xhcmlzIGJ1aWxkcwotCi1UaHUgRGVjIDI0IDE0OjA4OjM4IDE5OTIgZGF2aWQgZGB6b28nIHp1aG4gICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGdldCByaWQgb2YgZWFybGllciBkZWZpbml0aW9ucyBmb3IgKmNsZWFuLAotCWFsc28gaGFuZGxlIHRoZSByZWN1cnNpdmUgaW5mbyBydWxlIGJldHRlcgotCi1UaHUgRGVjIDI0IDEyOjQwOjIxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4sIHJlYWxjbGVhbik6ICBGaXggdG8KLQlkbyBtb3JlLW9yLWxlc3MgdGhlIHJpZ2h0IHRoaW5nLgotCi1XZWQgRGVjIDE2IDEwOjI1OjMxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBsaW5lcyBkZWZpbmluZyBDQyBhbmQgQ1hYLCBhbmQgdXNlIENYWCByYXRoZXIKLQl0aGFuIGdjYyBpbiBkZWZpbml0aW9ucyBvZiBDWFhfRk9SX0JVSUxEIGFuZCBDWFhfRk9SX1RBUkdFVC4KLQotVHVlIERlYyAxNSAwMDozNDozMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGFuZ2UgYWxsICQoaG9zdF9jcHUpLSQoaG9zdF92ZW5kb3IpLSQoaG9zdF9vcykgdG8KLQkkKGhvc3RfY2Fub25pY2FsKS4KLQotCSogY29uZmlndXJlLmluOiBzcGxpdCB0aGUgY29uZmlnZGlycyBsaXN0IGludG8gNCBjYXRlZ29yaWVzIChuYXRpdmUKLQl2LiBjcm9zcywgbGlicmFyeSB2LiB0b29sKSBhbmQgaGFuZGxlIHRoZSBjcm9zcy1vbmx5IGFuZCBuYXRpdmUtCi0Jb25seSBpbiBtb3JlIHJlYXNvbmFibGUgKGFuZCBjb3JyZWN0ISkgd2F5LgotCi1Nb24gRGVjIDE0IDE3OjA0OjIyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qKTogIERvbid0IHJlbW92ZSBiZmQgYW5kIGdkYiBmcm9tCi0JY29uZmlnZGlycyBhbnltb3JlLgotCi1TdW4gRGVjIDEzIDAwOjM3OjI2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGV4dGVuc2l2ZSBjbGVhbnVwOjogIHJlbW92ZWQgYWxsIG9mIHRoZSBleHBsaWNpdAotCWNsZWFuLSogdGFyZ2V0cywgY29sbGFwc2VkIG1hbnkgd3JhcHBlcnMgYXJvdW5kIHN1YmRpcl9kbyBpbnRvCi0Jb25lLCBhZGRlZCBhZGRpdGlvbmFsIHRhcmdldHMgdG8gc2F0aXNmeSBzdGFuZGFyZHMudGV4aSwgZGVsZXRlZAotCXNvbWUgb2xkIHRhcmdldHMsIHNvbWUgY2hhbmdlcyBmb3IgY29uc2lzdGVuY3kKLQotRnJpIERlYyAxMSAyMDoxODowMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIHNvbWUgcHJvZ3JhbXMgYXMgY3Jvc3Mtb25seSwgYW5kIG90aGVycyBhcwotCW5hdGl2ZSBvbmx5Ci0KLQkqIHRlc3QtYnVpbGQubWs6IGhhbmRsZSBwYXJ0aWFsIGhvbGVzIGluIGEgbW9yZSBnZW5lcmljIG1hbm5lcgotCi0JKiBNYWtlZmlsZS5pbjogbTQgZGVwZW5kcyBvbiBsaWJpYmVydHkKLQotTW9uIERlYyAgNyAwNjo0MzoyNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zY286IGRvbid0IGRlZmF1bHQgJChDQykgdG8gZ2NjCi0KLVRodSBEZWMgIDMgMjE6NTI6MTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBtNCwgdGV4dHV0aWxzLCBmaWxldXRpbHMsIHNlZCwgc2hlbGx1dGlscywKLQl0aW1lLCB3ZGlmZiwgYW5kIGZpbmQgdG8gY29uZmlnZGlycwotCi0JKiBNYWtlZmlsZS5pbjogYWxsLCBjbGVhbiwgYW5kIGluc3RhbGwgcnVsZXMgZm9yIHRoZSBuZXcgcHJvZ3JhbXMKLQlhZGRlZCB0byBjb25maWd1cmUuaW4KLQotTW9uIE5vdiAzMCAxNDo1NDozNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIG1oLXN1biBmb3IgYWxsICotc3VuLSogaG9zdHMKLQotCSogY29uZmlnL21oLXNvbGFyaXM6IHJld29yayBzdGFuZGFyZCBYIGxvY2F0aW9uIHRvIHVzZQotCSRPUEVOV0lOSE9NRSwgaWYgZGVmaW5lZC4KLQotCSogY29uZmlnL21oLXN1bjogaGFuZGxlIFgxMSBpbmNsdWRlIGxvY2F0aW9ucwotCi0JKiBjb25maWcvbWgtZGVjc3RhdGlvbjogZGVmaW5lIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgdG8gMCwgdG8KLQl3b3JrIGFyb3VuZCBkYWluLWJyYW1hZ2VkIERFQ3dpbmRvd3MgaW5jbHVkZSBmaWxlcwotCi1GcmkgTm92IDI3IDE4OjM1OjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBmbGFncyBmb3IgWDExIGluY2x1ZGUgZmlsZXMgYW5kIGxpYnJhcnkgZmlsZQotCWxvY2F0aW9ucywgcGFzcyB0aGVtIGRvd24gdG8gdGhlIHByb2dyYW1zIHRoYXQgbmVlZCB0aGlzIGluZm8KLQotCSogYnVpbGQtYWxsLm1rOiBhZGRlZCBhICduYXRpdmUnIHRhcmdldCwgdG8gM3N0YWdlIHRoZSBuYXRpdmUgdG9vbGNoYWluCi0KLQkqIGNvbmZpZy97bWgtaHB1eCxtaC1zb2xhcmlzfTogZGVmaW5lIHRoZSAic3RhbmRhcmQiIGxvY2F0aW9ucyBmb3IKLQl0aGUgdmVuZG9yIHN1cHBsaWVkIFgxMSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMKLQotU3VuIE5vdiAyMiAxODo1OToxMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogc3RhcnQgYnVpbGRpbmcgbGliZysrIGZvciBIUC1VWCB0YXJnZXRzCi0KLVdlZCBOb3YgMTggMTk6MzM6MTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIFVwZGF0ZSByZWZlcmVuY2VzIHRvIGZpbGVzIG1vdmVkIGludG8gZXRjLy4KLQotU3VuIE5vdiAxNSAwOTozNjowOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoaTM4NnNvbDIsIGk0ODZzb2wyKTogIGlbMzRdODYtdW5rbm93bi1zb2xhcmlzMi4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNvbGFyaXMyKik6ICBVc2UgY29uZmlnL21oLXN5c3Y0LgotCi1UaHUgTm92IDEyIDA4OjUwOjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhY2NlcHQgZGFzaCBhcyB3ZWxsIGFzIHVuZGVyc2NvcmUgaW4gbG9uZyBvcHRpb24KLQluYW1lcyBmb3IgRlNGIGNvbXBhdGliaWxpdHkuCi0KLVdlZCBOb3YgMTEgMDg6MDQ6MzcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhZGRlZCAtc2NvMy4ydjQgc3VwcG9ydCBmcm9tIEZTRi4KLQotU3VuIE5vdiAgOCAyMToxNDozMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZXhwYW5kIHRoZSBzZWN0aW9uIHRoYXQgYWRkcyBvciByZW1vdmVzCi0JZGlyZWN0b3JpZXMgZnJvbSB0aGUgbGlzdCBvZiBwcm9ncmFtcyB0byBidWlsZCwgdG8gaGFuZGxlIG5hdGl2ZQotCXZzLiBjcm9zcyBpbiBhZGRpdGlvbiB0byBob3N0IHYuIG5hdGl2ZQotCi1TYXQgTm92ICA3IDE4OjUyOjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZXBsYWNlIEMrKyBpbiBtYWNybyBuYW1lcyB3aXRoIENYWC4KLQlUaGlzIGlzIGxlc3MgbGlrZWx5IHRvIGJyZWFrIC4uLgotCi1TYXQgTm92ICA3IDE1OjE2OjU4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogYWRkIC13IHRvIEdOVV9NQUtFCi0KLUZyaSBOb3YgIDYgMjM6MTA6MzcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiByZW1vdmUgJ3NwYXJjJy0tPidzcGFyYy1zdW4nIGRlZmF1bHQgdHJhbnNmb3JtYXRpb24sCi0JYWRkICdzcGFyYycgdG8gbGlzdCBvZiByZWNvZ25pemVkIGNwdXMuICBUaGlzIG5lZWRlZCB0byBtYWtlCi0JJ3NwYXJjLWFvdXQnIGV4cGFuZCB0byAnc3BhcmMtdW5rbm93bi1hb3V0JyBpbnN0ZWFkIG9mICdzcGFyYy1zdW4tYW91dCcuCi0JRGVsZXRlIHNvbWUgcmVkdW5kYW50IG9zZTY4IHZhcmlhbnRzLiAgUmVjb2duaXplIC13cnMgYXMgYW4gb3MsCi0JdGhlbiBjaGFuZ2VzIHRoYXQgaW50byAkQ1BVLXdycy12eHdvcmtzLgotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBtb3N0IHJlZmVyZW5jZXMgdG8gZ2RidGVzdCwgcmVndWxhcml6ZQotCXRhcmdldCBiYXNlZCBwcm9ncmFtIHJlbW92YWwKLQotCSogdGVzdC1idWlsZC5tazogaW1wb3J0IGZyb20gcDMgdHJlZSAobWFueSBmaXhlcyBhbmQgY2hhbmdlcykKLQotRnJpIE5vdiAgNiAyMDo1OTowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHJ1bGVzIHRvIGhhbmRsZSB0Y2wsIHRrLCBhbmQgZXhwZWN0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIHRob3NlIGRpcmVjdG9yaWVzIGlmIHRoZXkgZXhpc3QKLQotVGh1IE5vdiAgNSAxNDozNTo0MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IHJlbW92ZWQgYm9ndXMgaHBwYWJzZCBhbmQgaHBwYWhwdXggbmFtZXMsIHNpbmNlCi0JImhwcGEiIGlzIG5vdCBhIHZhbGlkIGNwdSAoaHBwYTEuMSBvciBocHBhMS4wIGFyZSwgdGhvdWdoKQotCi1UaHUgT2N0IDI5IDAwOjEyOjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsbC1nY2Mgbm93IGRlcGVuZHMgb24gYWxsLWJpbnV0aWxzLiAgYWxsLWxpYmcrKwotCWRlcGVuZHMgdXBvbiBhbGwteGliZXJ0eQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlcyBmcm9tIHAzLCBpbmNsdWRpbmc6Ci0KLQlUaHUgT2N0ICA4IDE1OjAwOjE3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFhUUkFGTEFHUyk6IGluY2x1ZGUgbmV3bGliIGRpcmVjdG9yaWVzIGlmCi0JbmV3bGliL01ha2VmaWxlIGV4aXN0cywgcmF0aGVyIHRoYW4gaWYgaG9zdCAhPSB0YXJnZXQuCi0KLQlGcmkgU2VwIDI1IDEzOjQxOjUyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1ub3N0ZGluYyB0byBYVFJBRkxBR1MgaWYgd2UgYXJlIHVzaW5nIGdjYwotCWZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUgYW5kIG5vdCBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyLiAgVGhpcwotCW1hdHRlcnMgZm9yIHRoZSBsaWJnKysgY29uZmlndXJhdGlvbiBpZiByZWNvbmZpZ3VyaW5nIGEgdHJlZSB0aGF0Ci0JaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQuCi0KLQlUaHUgU2VwIDEwIDEwOjM1OjUxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1JIGZvciBuZXdsaWIvdGFyZy1pbmNsdWRlIHRvIFhUUkFGTEFHUywgdG8KLQlwaWNrIHVwIHRoZSBtYWNoaW5lIGFuZCBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgQVNfRk9SX1RBUkdFVCwgcGFzc2VkIGRvd24gaW4KLQlUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIEFkZGVkIENDX0ZPUl9CVUlMRCwgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUKLQl0aGUgQyBjb21waWxlciB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIGFyZSBydW4gaW4gdGhlCi0JYnVpbGQgZW52aXJvbm1lbnQsIHNldCBpdCB0byBkZWZhdWx0IHRvICQoQ0MpLCBhbmQgcGFzc2VkIGl0IGRvd24KLQlpbiBGTEFHU19UT19QQVNTIGFuZCBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLQotCU1vbiBTZXAgIDcgMjI6MzQ6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCAkKGhvc3QpID0gJCh0YXJnZXQpIHRlc3RzIGJhY2sgdG8gKl9GT1JfVEFSR0VULgotCVdlIG5lZWQgdGhlbSBmb3IgdW51c3VhbCBuYXRpdmUgYnVpbGRzLCBsaWtlIHN5c3RlbXMgd2l0aG91dAotCXJhbmxpYi4KLQotCSogY29uZmlndXJlOiBhbHNvIGRlZmluZSAkKGhvc3RfY2Fub25pY2FsKSBhbmQKLSAgICAgICAgJCh0YXJnZXRfY2Fub25pY2FsKSwgd2hpY2ggYXJlIHRoZSBmdWxsLCBjYW5vbmljYWwgbmFtZXMgZm9yIHRoZQotICAgICAgICBnaXZlbiBob3N0IGFuZCB0YXJnZXQKLQotU3VuIE5vdiAgMSAxNjozODoxNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBzZXBhcmF0ZSBkZWZpbml0aW9ucyBmb3IgQysrLgotCi1GcmkgT2N0IDMwIDExOjM3OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiAgQWRkIGRlamEtZ251LgotCi1GcmkgT2N0IDIzIDAwOjM5OjE4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBVcGRhdGUgZm9yIGNvbmZpZ3VyZS50ZXhpIGFuZCBnZGItNC43IHJlbGVhc2UuCi0KLVdlZCBPY3QgMjEgMjE6NTQ6MjcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTW92ZSAiYWxsIiB0YXJnZXQgdG8gdG9wIG9mIGZpbGUuCi0JUHJldmlvdXNseSwgZmlyc3QgdGFyZ2V0IHdhcyAiLlBIT05ZIiB3aGljaCBjYXVzZWQgQlNENC40IG1ha2UKLQl0byBidWlsZCAuUEhPTlkgd2hlbiBtYWtlIHdhcyBydW4gd2l0aG91dCBhcmd1bWVudHMuCi0KLU1vbiBPY3QgMTkgMDE6MTc6NTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIENPUFlJTkcuTElCIHRvIEdEQiByZWxlYXNlcywgbm93IHRoYXQgdGhlcmUncwotCUxpYnJhcnktY29weWxlZnRlZCBjb2RlIGluIGxpYmliZXJ0eS4KLQotVHVlIE9jdCAxMyAwMToyMjozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIFJlcGxhY2UgbTY4a21vdGUgd2l0aCBwbGFpbiBvbGQgbTY4ay4KLQotRnJpIE9jdCAgOSAwMzoxNDoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgc3BhY2UgZnJvbSBibGFuayBsaW5lLCBhdm9pZCBNYWtlIGNvbXBsYWludHMuCi0KLVRodSBPY3QgIDggMTg6NDE6NDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IENvbXBsYWluIGlmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLiAgQWRkZWQgc3VwcG9ydCBmb3IKLQkzODZic2QgYXMgT1MgYW5kIHRhcmdldCBhbGlhcy4KLQotVGh1IE9jdCAgOCAxNTowNzoyMiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYVFJBRkxBR1MpOiBpbmNsdWRlIG5ld2xpYiBkaXJlY3RvcmllcyBpZgotCW5ld2xpYi9NYWtlZmlsZSBleGlzdHMsIHJhdGhlciB0aGFuIGlmIGhvc3QgIT0gdGFyZ2V0LgotCi1Nb24gT2N0ICA1IDAzOjAwOjA5IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVjb2duaXplIHNwYXJjbGl0ZS13cnMtdnh3b3Jrcy4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwteGliZXJ0eSk6IGFkZGVkICoteGliZXJ0eSBtYWtlIHJ1bGVzIChmcm9tCi0JcDMuKSBBZGRlZCBjbGVhbi14aWJlcnR5IHRvIGNsZWFuLgotCi1UaHUgT2N0ICAxIDE3OjU5OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgKi0qLSogaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMgZm9yIGhvc3QgYW5kIHRhcmdldAotCi1UdWUgU2VwIDI5IDE0OjExOjE4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1ub3N0ZGluYyB0byBYVFJBRkxBR1MgaWYgd2UgYXJlIHVzaW5nIGdjYwotCWZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUgYW5kIG5vdCBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyLiAgVGhpcwotCW1hdHRlcnMgZm9yIHRoZSBsaWJnKysgY29uZmlndXJhdGlvbiBpZiByZWNvbmZpZ3VyaW5nIGEgdHJlZSB0aGF0Ci0JaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQuCi0KLVNlcCAyMCAwODo1MzoxMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoaTQ4NnYvaTQ4NnY0KTogIE1lcmdlIGluIGZyb20gRlNGIHZlcnNpb24uCi0KLUZyaSBTZXAgMTggMDA6MzI6MDAgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBvbmx5IHNldCBQV0QgaWYgaXQgaXMgYWxyZWFkeSBzZXQuCi0KLVRodSBTZXAgMTcgMjM6MDU6NTMgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBqdXN0IHNldCBQV0Q9YHB3ZGAgYXQgdGhlIHRvcCwgc2luY2UgVWx0cml4IHNoCi0JZG9lc24ndCBoYXZlIHVuc2V0IGFuZCBhbGwgc3VjY2VzcyBwYXRocyAoYW5kIG1vc3QgZXJyb3IgcGF0aHMpCi0Jb3V0IHNldCBpdCBhbnl3YXkuIChOb3RlOiBzaG91bGQgY2hhbmdlIGFsbCB1c2VzIG9mICR7UFdEPWBwd2RgfQotCXRvIGp1c3QgJHtQV0R9IHRvIGF2b2lkIGNvbmZ1c2lvbi4pCi0KLVR1ZSBTZXAgMTUgMTY6MDA6NTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFsd2F5cyBzZXQgJCh0b29sZGlyKSB0byAkKGxpYmRpcikvJCh0YXJnZXRfYWxpYXMpLAotCWV2ZW4gZm9yIGEgbmF0aXZlIGNvbXBpbGF0aW9uLgotCi1UdWUgU2VwIDE1IDAyOjIyOjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBtYWtlIHRoZSBnZGIudGFyLlogcnVsZSB3b3JrIGJldHRlci4KLQotCSogTWFrZWZpbGUuaW4gKEdEQl9TVVBQT1JUX0RJUlMpOiAgQWRkIG9wY29kZXMuCi0JKERFVk9fU1VQUE9SVCk6ICBBZGQgY29uZmlndXJlLnRleGkuCi0JKGJmZC1pbHJ0LnRhci5aKTogIFJlbW92ZSBhbmNpZW50IHJ1bGUuCi0KLVRodSBTZXAgMTAgMTA6NDM6MTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLUkgZm9yIG5ld2xpYi90YXJnLWluY2x1ZGUgdG8gWFRSQUZMQUdTLCB0bwotCXBpY2sgdXAgdGhlIG1hY2hpbmUgYW5kIHN5c3RlbSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLnN1YjogYWRkZWQgbmV3IHRhcmdldCBtNjgwMTAtYWRvYmUtc2NvdXQsCi0Jd2l0aCBhbGlhcyBvZiBhZG9iZTY4ay4gIENoYW5nZWQgY29uZmlndXJlLmluIHRvIGNoZWNrIGZvcgotCS1zY291dCBiZWZvcmUgLXNjbyogdG8gYXZvaWQgYSBmYWxzZSBtYXRjaC4KLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIEFTX0ZPUl9UQVJHRVQsIHBhc3NlZCBkb3duIGluCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MuICBBZGRlZCBDQ19GT1JfQlVJTEQsIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlCi0JdGhlIEMgY29tcGlsZXIgdG8gdXNlIHRvIGNyZWF0ZSBwcm9ncmFtcyB3aGljaCBhcmUgcnVuIGluIHRoZQotCWJ1aWxkIGVudmlyb25tZW50LCBzZXQgaXQgdG8gZGVmYXVsdCB0byAkKENDKSwgYW5kIHBhc3NlZCBpdCBkb3duCi0JaW4gRkxBR1NfVE9fUEFTUyBhbmQgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0KLVdlZCBTZXAgIDkgMTI6MjE6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIENDX0ZPUl9UQVJHRVQsCi0JQVJfRk9SX1RBUkdFVCwgUkFOTElCX0ZPUl9UQVJHRVQsIE5NX0ZPUl9UQVJHRVQuICBQYXNzCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIHdoaWNoIGRlZmluZXMgQ0MsIEFSLCBSQU5MSUIgYW5kIE5NIGFzIHRoZQotCUZPUl9UQVJHRVQgdmFyaWFudHMsIHRvIG5ld2xpYiBhbmQgbGliZysrLgotCi1UdWUgU2VwICA4IDE3OjI4OjMwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nYXMsIGFsbC1nZGIpOiBSZXF1aXJlIGFsbC1vcGNvZGVzIHRvIGJlIGJ1aWx0Ci0JZmlyc3QuCi0KLVdlZCBTZXAgIDIgMDI6NTA6MDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBY2NlcHQgYGVsZicgYXMgYW4gZW52aXJvbm1lbnQuCi0KLVR1ZSBTZXAgIDEgMTU6NDg6MzAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtb3Bjb2Rlcyk6ICBjZCBpbnRvIHRoZSByaWdodCBkaXJlY3RvcnkKLQotU3VuIEF1ZyAzMCAyMToxMjoxMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgb3B0aW9uLCB1c2VkIGFzCi0JYXJndW1lbnQgdG8gc2VkIHdoZW4gaW5zdGFsbGluZyBwcm9ncmFtcy4KLQljb25maWd1cmUudGV4aTogYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgLXByb2dyYW1fcHJlZml4LAotCS1wcm9ncmFtX3N1ZmZpeCBhbmQgLXByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLVRodSBBdWcgMjcgMjE6NTk6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBY2NlcHQgaTQ4NiB3aGVyZSBpMzg2IG9rLgotCi1UaHUgQXVnIDI3IDEzOjA0OjQyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhY2NlcHQgd2UzMmsKLQotTW9uIEF1ZyAyNCAxNDowNToxNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLSAJKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IGFjY2VwdCBPU0U2ODAwMCBhbmQgT1NFNjhrLgotCi0JKiBNYWtlZmlsZS5pbjogZG9uJ3QgY3JlYXRlIGFsbCBkaXJlY3RvcmllcyBmb3IgYGBtYWtlIGluc3RhbGwnJzsKLQlsZXQgdGhlIHN1YmRpcmVjdG9yaWVzIGNyZWF0ZSB0aGUgb25lcyB0aGV5IG5lZWQuCi0KLVR1ZSBBdWcgMTEgMjM6MTM6MTcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0gICAgICAgICogQ09QWUlORzogbmV3IGZpbGUsIEdQTCB2MgotCi1UdWUgQXVnICA0IDAxOjEyOjQzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSB0aGUgbmV3IGdlbi1pbmZvLWRpciwgd2hpY2ggbmVlZHMgYSB0ZW1wbGF0ZQotCWFyZ3VtZW50ICh3aGljaCBhbHNvIGxpdmVzIGluIHRleGluZm8pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpLCBzdGFuZGFyZHMudGV4aTogZml4IElORk8tRElSLUVOVFJZCi0KLU1vbiBBdWcgIDMgMTU6NDE6MjggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc29sYXJpczogcmVtb3ZlZCB0aGUgLXhzIGZyb20gQ0ZMQUdTIChsZXQgdGhlIHBlb3BsZQotCXdpdGggU3VuJ3MgQyBjb21waWxlciBkZWFsIHdpdGggaXQgdGhlbXNlbHZlZCkKLQotTW9uIEF1ZyAgMyAwMDozNDoxNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAobmNyMzAwMCk6ICBDaGFuZ2UgaTM4NiB0byBpNDg2LgotCi1UaHUgSnVsIDIzIDAwOjEyOjE3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsLXJjcywgaW5zdGFsbC1ncmVwIHRvCi0JaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzLCByZW1vdmVkIGluc3RhbGwtYmlzb24gYW5kIGluc3RhbGwtbGliZ2NjCi0KLVR1ZSBKdWwgMjEgMDE6MDE6NTAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBncmFiIHRoZSBIUFVYIG1ha2VmaWxlIGZyYWdtZW50IGlmIG9uIEhQVVgKLQotTW9uIEp1bCAyMCAxMTowMjowOSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBlcmFkaWNhdGUgYmlzb24gc3Bvb3IgKGRpdHRvIGxpYmdjYykuCi0JIGNvbmZpZ3VyZS5pbjogcmVjb2duaXNlIG02OHtrLDAwMH0tZXJpY3Nzb24tT1NFLgotCSBlczE4MDAgaXMgYWxpYXMgZm9yIG02OGstZXJpY3Nzb24tT1NFCi0KLVN1biBKdWwgMTkgMTc6NDk6MDIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlYXJyYW5nZSB0aGUgcGFydHMgdGhhdCByZW1vdmUgcHJvZ3JhbXMgZnJvbQotCWNvbmZpZ2RpcnMsIGJhc2VkIG5vdyBvbiBIT1NUPT1UQVJHRVQgb3IgYnkgY2Fub25pY2FsIHRyaXBsZS4KLQotRnJpIEp1bCAxNyAyMjo1Mjo0OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHJlY3Vyc2UgZXhwbGljaXRseSB3aXRoIC1mIHRlc3QtYnVpbGQubWsgd2hlbgotCSAgYXBwcm9wcmlhdGUuICBwcmVkaWNhdGUgc3RhZ2UzIGFuZCBjb21wYXJpc29uIG9uIHRoZSBleGlzdGVuY2UKLQkgIG9mIGdjYy4gIFRoYXQgaXMsIGlmIGdjYyBpc24ndCBhcm91bmQsIHdlIGFyZW4ndCB0aHJlZS1zdGFnaW5nLgotCSAgT24gdmVyeSBjbGVhbiwgYWxzbyByZW1vdmUgLi4uc3RhbXAtY28uICBCdWlsZCBpbi1wbGFjZSBiZWZvcmUKLQkgIGRvaW5nIG90aGVyIGJ1aWxkcy4KLQotVGh1IEp1bCAxNiAxODozMzowOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogYWRkIHRnYXMKLQotVGh1IEp1bCAxNiAxNjowNToyOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhIG51bWJlciBvZiBjaGFuZ2VzIG1lcmdlZCBpbiBmcm9tIHByb2dyZXNzaXZlLgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBsaWJtLgotCi0JKiAuY3ZzaWdub3JlOiBpZ25vcmUgc29tZSBzdHVmZiB0aGF0IGNvbWVzIGZyb20gdGVzdC1idWlsZC5tay4KLQotV2VkIEp1bCAgOCAwMDowMTozMCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc29sYXJpczogIFVzZSAteHMgd2hlbiBjb21waWxpbmcgc28gdGhhdCBTdW4tQyBwdXRzCi0JYSBzeW1ib2wtdGFibGUgaW50byB0aGUgZXhlY3V0YWJsZS4KLQotVHVlIEp1bCAgNyAwMDoyNDo1MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFkZCBlczE4MDAgKG02OGstZXJpY3Nzb24tZXMxODAwKS4KLQotVHVlIEp1biAzMCAyMDoyNDo0MSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKLQkqIE1ha2VmaWxlLmluOiBhZGp1c3QgZGlyZWN0b3J5LWNyZWF0aW5nIHNjcmlwdCBmb3IgbG9zaW5nIGRlY3N0YXRpb24KLQotTW9uIEp1biAyMiAyMzo0Mzo0OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgTWlub3IgJHN1YmRpci1yZWxhdGVkIGZpeGVzLgotCi1Nb24gSnVuIDIyIDE4OjMwOjI2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGZpeCB2YXJpb3VzIHByb2JsZW1zIHdpdGggcHJvcG9nYXRpbmcKLQltYWtlZmlsZV90YXJnZXRfZnJhZyBpbiBzdWJkaXJzLgotCSogY29uZmlndXJlLmluOiBjb25maWcgbGliZ2NjIGlmIGl0cyB0aGVyZQotCi1GcmkgSnVuIDE5IDE1OjE5OjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBIUFBBIG1lcmdlLgotCi1Nb24gSnVuIDE1IDEyOjMxOjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoSU5TVEFMTCk6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCBpcyBicm9rZW4gb24gbmNyIDMwMDAncy4KLQotU3VuIEp1biAxNCAxMDoyOToxOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZXBsYWNlIGFsbC1iaXNvbiB3aXRoIGFsbC1ieWFjYyBpbiBhbGwKLQlkZXBlbmRlbmN5IGxpbmVzIGZvciBvdGhlciB0b29scyAod2hpY2ggbm93IHVzZSBieWFjYykuCi0KLUZyaSBKdW4gMTIgMjI6MjE6NTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3VuNHNvbDIgPT4gc3BhcmMtc3VuLXNvbGFyaXMyLgotCi1UdWUgSnVuICA5IDE3OjE4OjExIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIEFkZCBJTlNUQUxMLgotCi1UaHUgSnVuICA0IDEyOjA3OjMyIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWtlIGdwcm9mIHJ1bGVzIHNpbWlsYXIgdG8gYnlhY2MgcnVsZXMgKGluc3RlYWQgb2YKLQl2ZXN0aWdhbCAkKHVuc3ViZGlyKSB0aGF0IGRpZG4ndCB3b3JrLi4uKQotCi1UaHUgSnVuICA0IDAwOjM3OjA1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFkZCBzdXBwb3J0IGZvciBMaW51eC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlICQoRkxBR1NfVE9fUEFTUykgbW9yZSBjb25zaXN0ZW50bHkKLQkoYXQgbGVhc3QgZm9yIGxpYmcrKykuCi0KLVR1ZSBKdW4gMDIgMjA6MDM6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IGZpeCBkb2MgZm9yIHRoZSAtbmZwIG9wdGlvbiB0byBjb25maWd1cmUKLQotVHVlIEp1biAgMiAxNzoyMDo1MiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtYmludXRpbHMpOiBhciBuZWVkcyBmbGV4LCBzbyBkZXBlbmQgb24gYWxsLWZsZXguCi0KLVN1biBNYXkgMzEgMTU6MDQ6MDggMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogY2hhbmdlZCBbXi1dKyB0byBbXi1dW14tXSogc28gdGhhdCBpdCB3b3JrcyB1bmRlcgotCVN1biBzZWQuIChCU0QgNC4zIHNlZCBkb2Vzbid0IGhhbmRsZSBbXi1dKyBlaXRoZXIuKQotCSogY29uZmlndXJlLmluOiBhZGRlZCBzb2xhcmlzKiBob3N0X21ha2VmaWxlX2ZyYWcgaG9vay4KLQotU3VuIE1heSAzMSAwMToxMDozNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGNoYW5nZWQgcmVjb2duaXRpb24gb2YgbTY4MDAwIHNvIHRoYXQgdmFyaW91cwotCW02OGsgdHlwZXMgY2FuIGJlIHNwZWNpZmllZCB2aWEgbTY4MFswMTIzNF0wCi0KLVNhdCBNYXkgMzAgMjE6MDE6MDYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChiYXNpY19tYWNoaW5lKTogZml4IHNlZCBzbyB0aGF0ICctZm9vJyBpc24ndAotCWNvbXBsZXRlbHkgc3Vic3RpdHV0ZWQgb3V0IHdoaWxlIC4rJy1mb28nIGxvc2VzIHRoZSAnLWZvbycKLQotV2VkIE1heSAyNyAyMzoxODo1MiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViICgkb3MpOiBBZGQgLWFvdXQuCi0KLUZyaSBNYXkgMjIgMTQ6MDA6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIElmIGhvc3RfbWFrZWZpbGVfZnJhZyBpcyBhYnNvbHV0ZSwgZG9uJ3QKLQlwcmVmaXggJHtpbnZzdWJkaXJ9IChyZWxldmFudCB0byBsaWJnKysgYXV0by1jb25maWd1cmUpLgotCi1UaHUgTWF5IDIxIDE4OjAwOjA5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0b29sZGlyKTogRGVmaW5lIGl0LgotCShhbGwtbGQpOiBEZXBlbmQgb24gYWxsLWZsZXguCi0KLVN1biBNYXkgMTAgMjE6NDU6NTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiAgRml4IGxpYmcrKyBzcGVjaWFsIGNhc2UuCi0KLUZyaSBNYXkgIDggMDg6MzE6NDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZG8gbm90IGJ1cnkgYHB3ZGAgaW50byBjb25maWcuc3RhdHVzLCB0aHVzIGRvIGZld2VyCi0JICBwd2Qncy4KLQotCSogY29uZmlndXJlOiBwcmludCB0aGUgIkJ1aWxkaW5nIGluIiBtZXNzYWdlIG9ubHkgd2hlbiBidWlsZGluZyBpbgotCSAgb3RoZXIgdGhhbiAiLiIgQU5EIHZlcmJvc2UuCi0KLQkqIGNvbmZpZ3VyZTogcmVtb3ZlIC1zLCByZXdvcmsgLXYgdG8gYmV0dGVyIGFjY29tb2RhdGUgZ3Vlc3RlZAotCSAgY29uZmlndXJlcy4KLQotCSogc3RhbmRhcmRzLnRleGk6IHVwZGF0ZWQgdG8gMyBtYXksIGZpeGVkIGxpYnJpZCA8LT4gbGliZGlyIHR5cG8uCi0KLUZyaSBNYXkgIDEgMTg6MDA6NTAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWNyb2l6ZSBmbGFncyBwYXNzZWQgb24gcmVjdXJzaW9uLiAgcmVtb3ZlCi0JICBmaWxldXRpbHMuCi0KLVRodSBBcHIgMzAgMDg6NTY6MjAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZ2V0IG1ha2VzcmNkaXIgcmlnaHQgZm9yIHN1YmRpcnMgZGVlcGVyIHRoYW4gMS4KLQotCSogTWFrZWZpbGUuaW46IHBhc3MgSU5TVEFMTCwgSU5TVEFMTF9EQVRBLCBJTlNUQUxMX1BST0dSQU0gb24KLQkgIGluc3RhbGwuCi0KLUZyaSBBcHIgMjQgMTU6NTE6NTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkb24ndCBwcmludCBzdWJkaXJfZG8gb3IgcmVjdXJzaW9uIGxpbmVzLgotCi1GcmkgQXByIDI0IDE1OjIyOjA0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogYWRkZWQgbWVudSBpdGVtLgotCi0JKiBNYWtlZmlsZS5pbjogYnVpbGQgYW5kIGluc3RhbGwgc3RhbmRhcmRzLmluZm8uCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBuZXcgZmlsZS4KLQotV2VkIEFwciAyMiAxODowNjo1NSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogdGVzdCBmb3IgYW5kIG1vdmUgY29uZmlnLnN0YXR1cyBwaWVjZXMgZnJvbQotCSAgJHtzdWJkaXJ9Ly4KLQotV2VkIEFwciAyMiAxNDozODozNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWRlbHRhODgsIGNvbmZpZy9taC1uY3IzMDAwOiAgUmVwbGFjZSBNSU5VU19HIHdpdGgKLQlDRkxBR1MgcGVyIG5ldyBjb25maWd1cmF0aW9uIHN0cmF0ZWd5LgotCSogY29uZmlndXJlOiAgVGVzdCBmb3IgZXhpc3RhbmNlIG9mIGZpbGVzIGJlZm9yZSB0cnlpbmcgdG8gbXYKLQl0aGVtLCB0byBhdm9pZCBudW1lcm91cyBub24tZXhpc3RhbmNlIG1lc3NhZ2VzLgotCi1UdWUgQXByIDIxIDEyOjMxOjMzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGNvcnJlY3QgZmluYWwgbGluZSBvZiBjb25maWcuc3RhdHVzLgotCi0JKiBjb25maWd1cmU6IHBhdGNoIGZyb20gZWdnZXJ0LiAgQXZvaWRzIGEgcHJvdGVjdGlvbiBwcm9ibGVtIGlmCi0JICB0aGUgb3JpZ2luYWwgTWFrZWZpbGUuaW4gaXMgcmVhZCBvbmx5LgotCi0JKiBjb25maWd1cmU6IHVzZSBtb3ZlLWlmLWNoYW5nZSBmcm9tIGdjYyB0byBjcmVhdGUgY29uZmlnLnN0YXR1cy4KLQkgIFNvbWUgbWFrZWZpbGVzIGRlcGVuZCBvbiBjb25maWcuc3RhdHVzIHRvIHRlbGwgaWYgYSBkaXJlY3RvcnkKLQkgIGhhcyBiZWVuIHJlY29uZmlndXJlZCBmb3IgYSBkaWZmZXJlbnQgaG9zdC4gIFRoaXMgY2hhbmdlCi0JICBwcmV2ZW50cyB0aG9zZSBkaXJlY3RvcmllcyBmcm9tIHJlbWFraW5nIGV2ZXJ5dGhpbmcgaW4gdGhlIGNhc2UKLQkgIHdoZXJlIHRoZSByZWNvbmZpZyB3YXMgb25seSBpbnRlbmRlZCB0byByZWJ1aWxkIGEgTWFrZWZpbGUuCi0KLQkqIGNvbmZpZ3VyZTogdGVzdCBmb3IgY29uZmlnLnN1YiB3aXRoICJjb25maWcuc3ViIHN1bjQiIHJhdGhlcgotCSAgdGhhbiAiY29uZmlnLnN1YiAke2hvc3RfYWxpYXN9Ii4gIE90aGVyd2lzZSB3ZSBjYW4ndCB0ZWxsIGEgYmFkCi0JICBob3N0IGFsaWFzIGZyb20gYSBtaXNzaW5nIGNvbmZpZy5zdWIuCi0KLU1vbiBBcHIgMjAgMTg6MTY6MzYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZXhwbGljaXRseSBwYXNzIENGTEFHUyBvbiByZWN1cnNpb24uIG5vIGxvbmdlciBwYXNzCi0JICBNSU5VU19HICh0aGlzIGNhbiBiZSBkb25lIHdpdGggQ0ZMQUdTKS4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1GcmkgQXByIDE3IDE4OjI3OjUxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IG1rZGlyICR7c3ViZGlyfSBhcyBuZWVkZWQuCi0KLVdlZCBBcHIgMTUgMTc6Mzc6MjIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLGNvbmZpZ3VyZS5pbjogYWRkZWQgYXV0b2NvbmYuCi0KLVdlZCBBcHIgMTUgMTc6Mjc6MzQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbm8gbG9uZ2VyIHBhc3MgYWdhaW5zdCBvbiByZWN1cnNpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAuTk9FWFBPUlQ6IHNvIHRoYXQgc3RyYXkgbWFrZWZpbGVfZnJhZwotCSAgZGVmaW5pdGlvbnMgYXJlIG5vdCBpbmhlcml0ZWQuCi0KLQkqIGNvbmZpZ3VyZTogY29ycmVjdCBtYWtlc3JjZGlyIHdoZW4gc3ViZGlyIGlzIC4KLQotVHVlIEFwciAxNCAxMTo1NjowOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQWRkIHN1cHBvcnQgZm9yICdzdWJkaXJzJyB2YXJpYWJsZSwgd2hpY2ggaXMKLQlsaWtlICdjb25maWdkaXJzJywgZXhjZXB0IHRoYXQgY29uZmlndXJlIGRvZXNuJ3QgcmUtaW52b2tlCi0JaXRzZWxmIGZvciBzdWJkaXJzLCBpdCBqdXN0IGNyZWF0ZXMgYSBNYWtlZmlsZSBmb3IgZWFjaCBzdWJkaXIuCi0JKiBjb25maWd1cmUudGV4aTogIERvY3VtZW50IHN1YmRpcnMuCi0KLU1vbiBBcHIgMTMgMTg6NTA6MTYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGZsZXggdG8gY29uZmlnZGlycwotCi1Nb24gQXByIDEzIDE4OjQzOjU1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGNsZWFuLXN0YW1wcyBmcm9tIGNsZWFuLgotCi1TYXQgQXByIDExIDAzOjUyOjAzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgZ2RidGVzdCB0byBjb25maWdkaXJzLgotCi1GcmkgQXByIDEwIDIzOjExOjQ5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBBZGQgbWFjcm8sIGRlZmF1bHQgdG8gLWcsIHBhc3Mgb24KLQl0byByZWN1cnNpdmUgbWFrZXMuCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmV3IG5jcjMwMDAgY29uZmlnLgotCi1XZWQgQXByICA4IDIzOjA4OjEyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHJlZmVyZW5jZXMgdG8gZ2RibS4KLQotVHVlIEFwciAgNyAxNjo0ODoyMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIERvbid0IGNhbm9uaWNhbGl6ZSBvcyB2YWx1ZQotCW5ld3NvcyogdG8gYnNkIChyZWFkbGluZSBuZWVkcyB0byBjaGVjayBmb3IgbmV3c29zKS4KLQkoVGhpcyBmaXggd2FzIGVhcmxpZXIgbWFkZSBKYW4gMzEsIGJ1dCBnb3QgcmUtYnJva2VuLikKLQotTW9uIEFwciAgNiAxNDozNDowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBzY28gaXMgYW4gb3MsIG5vdCBhIHZlbmRvciEKLQotCSogY29uZmlndXJlOiAgUXVvdGUgJCggYmV0dGVyLiAgS2VlcCB2YXJpb3VzIHNoZWxscyBoYXBweS4KLQotVHVlIE1hciAzMSAxNjozMjo1NyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGVsaW1pbmF0ZSBzdGFtcC1maWxlcy4KLQotTW9uIE1hciAzMCAyMjoyMDoyMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBzZW5kX3ByLiAgcmVtb3ZlICJmb3JjZSIgZnJvbSAuc3RtcC1ncHJvZiBydWxlLgotCSAgU3VwcmVzcyBlY2hvaW5nIG9mIGFsbCB0aGUgImlmIFsgLWQgLi4uICQoTUFLRSkiIGxpbmVzLgotCi1XZWQgTWFyIDI1IDE1OjIwOjA0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBmaXggaXJpcy9pcmlzMy4KLQotV2VkIE1hciAyNSAxMDozNDoxOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiByZS1hZGQgLXJtLgotCi1UdWUgTWFyIDI0IDIzOjUwOjE2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYXNrZWZpbGUuaW46IGFkZCAuc3RtcC1yY3MgdG8gYWxsLgotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBnYXMgZnJvbSByczYwMDAgYnVpbGQsIHVzZSBhaXggaG9zdCBmcmFnbWVudC4KLQotTW9uIE1hciAyMyAxOTo0MzozNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBwYXNzIGRvd24gc2l0ZV9vcHRpb24gZHVyaW5nIHJlY3Vyc2lvbi4KLQotVGh1IE1hciAxOSAxNjo0OTozNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLmNyb3NzKTogIEFkZCAuc3RtcC1iZmQgLnN0bXAtcmVhZGxpbmUuCi0KLVdlZCBNYXIgMTggMTU6Mjk6MzMgMTk5MiAgTWlrZSBTdHVtcCAgKG1yc0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IENoYW5nZSBleGVjX3ByZWZpeCBzbyB0aGF0IGl0IHJlYWxseSBkZWZhdWx0cyB0byBwcmVmaXguCi0KLVNhdCBNYXIgMTQgMTc6MjA6MzggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46ICBBZGQgc3VwcG9ydCBmb3IgbW1hbGxvYyBsaWJyYXJ5LgotCi1GcmkgTWFyIDEzIDE4OjQ0OjE4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIHN0bXAgZGVwZW5kZW5jaWVzIGZvciBhIGZldyBtb3JlIHRoaW5ncy4KLQotVGh1IE1hciAxMiAwNDo1NjoyNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGp1c3RlZCBlcnJvciBtZXNzYWdlIG9uIG9iamRpci9zcmNkaXIgY29uZmlndXJlCi0JICBjb2xsaXNpb24sIHBlciBqb2huJ3Mgc3VnZ2VzdGlvbi4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBsaWJpYmVydHkgc3RtcCB0byBhbGwgYW5kIGFsbC5jcm9zcy4KLQotV2VkIE1hciAxMSAwMjowNzo1MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBmb3JjZSBkZXBlbmRlbmNpZXMsIGFkZCBncmVwIHRvIGFsbC4KLQotVHVlIE1hciAxMCAyMTo0OToxOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAbWFycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZHJvcCBmbGV4LiAgbWFrZSBzdGFtcCBmaWxlcyB3b3JrLgotCi0JKiBjb25maWd1cmU6IGFkZGVkIHRlc3QgZm9yIGNvbmZsaWN0aW5nIGNvbmZpZ3VyYXRpb24gaW4gc3JjZGlyLAotCSAgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuICBPdGhlcndpc2UgZW1hY3MgZ2RiIG1vZGUKLQkgIGdldHMgY3Jhbmt5LiAgdXNlIHJlbGF0aXZlIHBhdGhzIGZvciBjb25maWd1cmUgYW5kIHNyY2RpcgotCSAgd2hlbmV2ZXIgcG9zc2libGUuICBTZW5kIHNvbWUgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyIHRoYXQgd2VyZQotCSAgZ29pbmcgdG8gc3Rkb3V0LgotCi1UdWUgTWFyIDEwIDE4OjAxOjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEZpeCBsaWJnKysgcnVsZSB0byBjaGVjayBmb3IgZ2NjIGRpcmVjdG9yeQotCWJlZm9yZSB1c2luZyBnY2MvZ2NjLiAgQWxzbyBwYXNzIFhUUkFGTEFHUy4KLQotVGh1IE1hciAgNSAyMTo0NTowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3RtcC1maWxlcyBzbyB0aGF0IGRpcmVjdG9yaWVzIGFyZW4ndCBwb2xsZWQKLQkgIHdoZW4gdGhleSBhcmUgYWxyZWFkeSBidWlsdC4KLQotCSogY29uZmlndXJlLnRleGk6IGZpeGVkIGEgbm9kZSBwb2ludGVyIHByb2JsZW0uCi0KLVRodSBNYXIgIDUgMTI6MDU6NTggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiBjb25maWd1cmUuaW4gY29uZmlnL21oLWlyaXg0IGdkYi9jb25maWd1cmUuaW4KLQlnZGIvbWlwcy10ZGVwLmMgZ2RiL21pcHNyZWFkLmMgZ2RiL3Byb2Nmcy5jIGdkYi9zaWduYW1lLmgKLQlnZGIvdG0taXJpeDMuaCBnZGIvdG0tbWlwcy5oIGdkYi94bS1pcml4NC5oIGdkYi9jb25maWcvbXQtaXJpeDMKLQlnZGIvY29uZmlnL21oLWlyaXg0IHRleGluZm8vY29uZmlndXJlLmluOiAgUG9ydCB0byBTR0kgSXJpeC00LnguCi0KLVdlZCBNYXIgIDQgMDI6NTc6NDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IC1yZWN1cnJpbmcgYmVjb21lcyAtc2lsZW50LiAgY29ycmVjdGVkIGhlbHAgbWVzc2FnZQotCSAgZm9yIC1zaXRlPSBvcHRpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBta2RpciAkKGV4ZWNfcHJlZml4KSBhbmQgJCh0b29sZGlyKS4KLQotVHVlIE1hciAgMyAxNDo1MToyMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogd2hlbiBidWlsZGluZyBNYWtlZmlsZSBmb3IgY3Jvc3NlcywgcmVwbGFjZQotCSAgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguICBkZWZhdWx0IHNyY2RpciBmcm9tIGxvY2F0aW9uIG9mCi0JICBjb25maWcuc3ViLiAgcmVtb3ZlICJmb3IgaG9zdCBpbiBob3N0cyIgYW5kICJmb3IgdGFyZ2V0IGluCi0JICB0YXJnZXRzIiBsb29wcy4KLQotV2VkIEZlYiAyNiAxOTo0ODoyNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBEbyBub3QgcGFzcyBiaW5kaXIgb3IgbWFuZGlyIHRvIGN2cy4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiByZW1vdmUgbW9zdCByZWZlcmVuY2VzIHRvIG11bHRpcGxlIGhvc3RzLAotCSAgbXVsdGlwbGUgdGFyZ2V0cywgc3ViZGlycywgZXRjLgotCi0JKiBjb25maWd1cmUubWFuOiByZW1vdmVkIHJjc2lkLiByZWZlcmVuY2UgY29uZmlnLnN1YiBub3QKLQkgIGNvbmZpZy5zdWJyLgotCi0JKiBNYWtlZmlsZS5pbjogbWtkaXIgJChpbmZvZGlyKSBvbiBpbnN0YWxsLWluZm8uCi0KLVdlZCBGZWIgMTkgMTU6NDE6MTMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiAgRXhwbGFpbiBiZXR0ZXIgYWJvdXQgLmdkYmluaXQgYW5kIGFib3V0Ci0JdGhlIGVudmlyb25tZW50IHRoYXQgY29uZmlndXJlLmluIHNlY3Rpb25zIHJ1biBpbi4KLQotRnJpIEZlYiAgNyAwNzo1NTowMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgVWx0cml4IGlzIG9ubHkgYSBkZWNzdGF0aW9uIGlmIGl0J3MgYSBNSVBTLgotCi1GcmkgSmFuIDMxIDIxOjU0OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBET0MuY29uZmlndXJlID0+IGNmZy1wYXBlci50ZXhpLgotCi1GcmkgSmFuIDMxIDIxOjQ4OjE4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKG5lYXIgY2FzZSAkb3MpOiAgRG9uJ3QgY29udmVydCBuZXdzb3MqIHRvIGJzZCEKLQotRnJpIEphbiAzMSAwMjoyNzozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZWluc3RhbGwgY2hhbmdlIGZyb20gZ2RiLTQuMyB0aGF0IHJlZHVjZXMKLQl0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiBDT1BZSU5HIHRoYXQgZ28gaW50byB0aGUgR0RCIHRhciBmaWxlLgotCi1UaHUgSmFuIDMwIDE2OjE3OjMwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC9jb25maWd1cmUuaW4sIGNvbmZpZy9taC1zY28sIGdkYi9jb25maWcvbWgtaTM4NnNjbywKLQlnZGIvY29uZmlnL210LWkzODZ2MzIsIGdkYi9jb25maWd1cmUuaW4sIHJlYWRsaW5lL2NvbmZpZ3VyZS5pbjoKLQlGaXggU0NPIGNvbmZpZ3VyYXRpb24gc3R1ZmYuCi0KLVR1ZSBKYW4gMjggMjM6NTE6MDcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgRm9yIGxpYmcrKywgbWFrZSBzdXJlIHRoZSAtSSBwb2ludGluZwotCXRvIHRoZSBnY2MgZGlyZWN0b3J5IGdvZXMgKmFmdGVyKiBhbGwgdGhlIGxpYmcrKy1sb2NhbCAtSSBmbGFncy4KLQlBbHNvLCBtb3ZlIGp1c3QtZ2NjIGRlcGVuZGVuY3kgZnJvbSBqdXN0LWxpYmcrKyB0byBhbGwtbGliZysrLgotCi1UdWUgSmFuIDI4IDEyOjU2OjI0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIENoYW5nZSAteCB0byAtZiB0byBrZWVwIFVsdHJpeCAvYmluL3Rlc3QgaGFwcHkuCi0KLVNhdCBKYW4gMTggMTc6NDU6MTEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIFJlbW92ZSB0ZXhpbmZvIHRhcmdldHMuCi0KLVNhdCBKYW4gMTggMTc6MDM6MjEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3RyYXR1cyBjb25maWd1cmF0aW9uIGZyYWdzLiAgQWxzbwotCXN1Ym1pdHRlZCB0byBGU0YuCi0KLVNhdCBKYW4gMTggMTU6MzU6MjkgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVl9TVVBQT1JUKTogIGFkZCBjb25maWd1cmUubWFuLgotCi0JKiBjb25maWcuc3ViKERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMpOiAgYWRkIC1ub25lKi4KLQotRnJpIEphbiAxNyAxNzo1ODowNSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIHJlbW92ZSBmb3JtIGZlZWRzIHRvIG1ha2UgU3VuJ3MgbWFrZSBoYXBweS4KLQkoREVWT19TVVBQT1JUKTogIERPQy5jb25maWd1cmUgPT4gY2ZnLXBhcGVyLnRleGkuCi0KLVNhdCBKYW4gIDQgMTY6MTE6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBNYWtlIHF1aWV0ZXIuCi0KLVRodSBKYW4gIDIgMjI6NTc6MTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBsaWJnKysuCi0JKiBjb25maWd1cmU6ICBXaGVuIHZlcmJvc2UsIGRvbid0IG91dHB1dCB0aGUgY29tbWFuZCBsaW5lIGF0IGVhY2gKLQlsZXZlbDsgaXQgd2lsbCBiZSB1bnJlbWFya2FibHkgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24sCi0Jd2hpY2ggd2lsbCBiZSB0aGUgc2FtZSBhcyB3aGF0IHRoZSB1c2VyIHR5cGVkLgotCi1GcmkgRGVjIDI3IDE2OjI2OjQ3IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBmaXggY2xlYW4taW5mbywgYWRkIGZsZXguICBhZGQKLQkgIGZpbGV1dGlscy4KLQotCSogY29uZmlndXJlOiBiZSBsZXNzIHNlbnNpdGl2ZSB0byBzcGFjZXMgaW4gTWFrZWZpbGUuaW4uICBEbyBub3QKLQkgIGxvb2sgZm9yIHNvdXJjZXMgaW4gIi4uIi4gIERvaW5nIHNvIGJyZWFrcyBzdWJkaXJlY3RvcmllcyB0aGF0Ci0JICBtaWdodCBoYXZlIHRoZWlyIG93biBjb25maWd1cmUuICBJZiBhIHN1YmRpciBoYXMgaXQncyBvd24KLQkgIGNvbmZpZ3VyZSBzY3JpcHQsIHVzZSBpdC4KLQotVGh1IERlYyAyNiAxNjozMDoyNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY2ZnLXBhcGVyLnRleGk6IHNvbWUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgcm1zLgotCi1UaHUgRGVjIDI2IDEwOjEzOjM2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgTWVyZ2UgaW4gc29tZSBzbWFsbCBhZGRpdGlvbnMgZnJvbSB0aGUgRlNGIHZlcnNpb24sCi0JdGFrZW4gZnJvbSB0aGUgZ2NjIGRpc3RyaWJ1dGlvbiwgdG8gYnJpbmcgdGhlIEN5Z251cyBhbmQgRlNGCi0JdmVyc2lvbnMgaW50byBjbG9zZXIgc3luYy4KLQotRnJpIERlYyAyMCAxMTozNDoxOCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlZCBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLVRodSBEZWMgMTkgMTU6NTQ6MjkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgLVYgZm9yIHZlcnNpb24gbnVtYmVyIG9wdGlvbi4KLQotV2VkIERlYyAxOCAxNTozOTozNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogRE9DLmNvbmZpZ3VyZSwgY2ZnLXBhcGVyLnRleGk6IHJldmlzZWQsIHVwZGF0ZWQsIGFuZCB0ZXhpbmZvJ2QuCi0JICByZW5hbWVkIGZyb20gRE9DLmNvbmZpZ3VyZSB0byBjZmctcGFwZXIudGV4aS4KLQotTW9uIERlYyAxNiAyMzowNToxOSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLnN1YnIsIGNvbmZpZy5zdWI6IGNvbmZpZy5zdWJyIGlzIG5vdwotCSAgY29uZmlnLnN1YiBhZ2Fpbi4KLQotRnJpIERlYyAxMyAwMToxNzowNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IG5ldyBmaWxlLCBpbiBwcm9ncmVzcy4KLQotCSogTWFrZWZpbGUuaW46IGJ1aWxkIGluZm8gZmlsZSBhbmQgaW5zdGFsbCB0aGUgbWFuIHBhZ2UgZm9yCi0JICBjb25maWd1cmUuCi0KLQkqIGNvbmZpZ3VyZS5tYW46IG5ldyBmaWxlLCBmaXJzdCBjdXQuCi0KLQkqIGNvbmZpZ3VyZTogZmluZCBjb25maWcuc3ViciBhZ2FpbiBub3cgdGhhdCBjb25maWd1cmF0aW9uICJub25lIgotCSAgaGFzIGdvbmUuICByZW1vdmVkIGFsbCB0cmFjZXMgb2YgdGhlIC1hbnNpIG9wdGlvbi4gIHJlbW92ZWQgYWxsCi0JICB0cmFjZXMgb2YgdGhlIC1sYW5ndWFnZXMgb3B0aW9uLgotCi0JKiBjb25maWcuc3VicjogcmVzeW5jIGZyb20gcm1zLgotCi1XZWQgRGVjIDExIDIyOjI1OjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLCBjb25maWcuc3ViLCBjb25maWcuc3VicjogbWVyZ2UgY29uZmlnLnN1YiBpbnRvCi0JICBjb25maWcuc3ViciwgY2FsbCB0aGUgcmVzdWx0IGNvbmZpZy5zdWJyLCByZW1vdmUgY29uZmlnLnN1YiwgdXNlCi0JICBjb25maWcuc3Vici4KLQotCSogTWFrZWZpbGUuaW46IHJldmlzZWQgaW5zdGFsbCBmb3IgZGlyLmluZm8uCi0KLVR1ZSBEZWMgMTAgMDA6MDQ6MzUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBkZWNzdGF0aW9uIGhvc3QgbWFrZWZpbGUgZnJhZy4KLQotCSogTWFrZWZpbGUuaW46IEJJU09OIG5vdyBiaXNvbiAteSBhZ2Fpbi4gIGFsc28gaW5zdGFsbC1nY2Mgb24KLQkgIGluc3RhbGwuICBjbGVhbi1nZGJtIG9uIGNsZWFuLiAgaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0JICBNYWtlIGRpcmVjdG9yaWVzIGZvciBpbmZvIGluc3RhbGwuICBCdWlsZCBkaXIuaW5mbyBoZXJlIHRoZW4KLQkgIGluc3RhbGwgaXQuCi0KLU1vbiBEZWMgIDkgMTY6NDg6MzMgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IGZvciBiYWQgZGlyZWN0b3J5IHRlc3RzLgotCi1TYXQgRGVjICA3IDAwOjE3OjAxIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBcezEsMlx9IGFwcGVhcnMgdG8gYmUgYSBzeXN2J2lzbS4gIFVzZSBhIGRpZmZlcmVudAotCSAgcmVnZXhwLiAgLXNyY2RpciByZWxhdGl2ZSB3YXMgYmVpbmcgaGFuZGxlZCBpbmNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW46IHVud3JhcHBlZCBzb21lIGZvciBsb29wcyBzbyB0aGF0IHBhcmFsbGVsIG1ha2VzCi0JICB3b3JrIGFnYWluIGFuZCBzbyBvbmUgY2FuIGZvY3VzIG9uZSdzIGF0dGVudGlvbiBvbiBhIHBhcnRpY3VsYXIKLQkgIHBhY2thZ2UuCi0KLUZyaSBEZWMgIDYgMDA6MjI6MDggMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZGVkIFBXRCBhcyBhIHN0YW5kIGluIGZvciBgcHdkYCAoZm9yIHNwZWVkKS4gdXNlCi0JICBlbGlmIHdoZXJldmVyIHBvc3NpYmxlLiAgbWFrZSAtc3JjZGlyIHdvcmsgd2l0aG91dCAtb2JqZGlyLgotCSAgLW9iamRpcj0gY29tbWVudGVkIG91dC4KLQotVGh1IERlYyAgNSAyMjo0Njo1MiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogK29wdGlvbnMgYmVjb21lIC0tb3B0aW9ucy4gIC1zdWJkaXJzIGNvbW1lbnRlZCBvdXQuCi0JICBhZGRlZCAtaG9zdCwgLWRhdGFkaXIuICBSZW5hbWVkIC1kZXN0ZGlyIHRvIC1wcmVmaXguICBDb21tZW50IGluCi0JICBNYWtlZmlsZSBub3cgYXQgdG9wIG9mIGdlbmVyYXRlZCBNYWtlZmlsZS4gIFJlbW92ZWQgY3ZzIGxvZwotCSAgZW50cmllcy4gIGFkZGVkIC1zcmNkaXIuICBjcmVhdGUgLmdkYmluaXQgb25seSBpZiB0aGVyZSBpcyBvbmUKLQkgIGluICR7c3JjZGlyfS4KLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAwNzozODoxMSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIEZyZXNobHkgY3JlYXRlZCBDaGFuZ2VMb2cuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzYKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTg4YjQuLjAwMDAwMDAKLS0tIGEvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODE3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIHN1YmRpcnMgdG8gYnVpbGQuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0KLXNyY2RpciA9IC4KLQotcHJlZml4ID0gL3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAkKHByZWZpeCkKLQotYmluZGlyPSR7ZXhlY19wcmVmaXh9L2Jpbgotc2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9zYmluCi1saWJleGVjZGlyPSR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKLWRhdGFkaXI9JHtwcmVmaXh9L3NoYXJlCi1zeXNjb25mZGlyPSR7cHJlZml4fS9ldGMKLXNoYXJlZHN0YXRlZGlyPSR7cHJlZml4fS9jb20KLWxvY2Fsc3RhdGVkaXI9JHtwcmVmaXh9L3ZhcgotbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgotaW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQotb2xkaW5jbHVkZWRpcj0vdXNyL2luY2x1ZGUKLWluZm9kaXI9JHtwcmVmaXh9L2luZm8KLW1hbmRpcj0ke3ByZWZpeH0vbWFuCi1neHhfaW5jbHVkZV9kaXI9JHtpbmNsdWRlZGlyfS9nKysKLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0KQotCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0KLQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9ICQocHJlZml4KS9pbmZvCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLSMgRGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlciBmaW5kcyBleGVjdXRhYmxlcywgbGlicmFyaWVzLCBldGMuCi1saWJzdWJkaXIgPSAkKGxpYmRpcikvZ2NjLWxpYi8kKHRhcmdldF9hbGlhcykvJChnY2NfdmVyc2lvbikKLUdEQl9OTE1fREVQUyA9IAotCi1TSEVMTCA9IC9iaW4vc2gKLQotIyBJTlNUQUxMX1BST0dSQU1fQVJHUyBpcyBjaGFuZ2VkIGJ5IGNvbmZpZ3VyZS5pbiB0byB1c2UgLXggZm9yIGEKLSMgY3lnd2luIGhvc3QuCi1JTlNUQUxMX1BST0dSQU1fQVJHUyA9Ci0KLUlOU1RBTEwgPSAkKFNIRUxMKSAkJHMvaW5zdGFsbC1zaCAtYwotSU5TVEFMTF9QUk9HUkFNID0gJChJTlNUQUxMKSAkKElOU1RBTExfUFJPR1JBTV9BUkdTKQotSU5TVEFMTF9TQ1JJUFQgPSAkKElOU1RBTEwpCi1JTlNUQUxMX0RBVEEgPSAkKElOU1RBTEwpIC1tIDY0NAotCi1JTlNUQUxMX0RPU1JFTCA9IGluc3RhbGwtZG9zcmVsLWZha2UKLQotQVMgPSBhcwotQVIgPSBhcgotQVJfRkxBR1MgPSByYwotQ0MgPSBjYwotCi0jIFNwZWNpYWwgdmFyaWFibGVzIHBhc3NlZCBkb3duIGluIEVYVFJBX0dDQ19GTEFHUy4gIFRoZXkgYXJlIGRlZmluZWQKLSMgaGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnkgTWFrZWZpbGUgZnJhZ21lbnRzLgotSE9TVF9DQyA9ICQoQ0NfRk9SX0JVSUxEKQotSE9TVF9QUkVGSVggPSAKLUhPU1RfUFJFRklYXzEgPSBsb3Nlci0KLQotIyBUaGVzZSBmbGFnIHZhbHVlcyBhcmUgbm9ybWFsbHkgb3ZlcnJpZGRlbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KLUNGTEFHUyA9IC1nCi1DWFhGTEFHUyA9IC1nIC1PMgotCi1MSUJDRkxBR1MgPSAkKENGTEFHUykKLUNGTEFHU19GT1JfVEFSR0VUID0gJChDRkxBR1MpCi1MREZMQUdTX0ZPUl9UQVJHRVQgPSAKLUxJQkNGTEFHU19GT1JfVEFSR0VUID0gJChDRkxBR1NfRk9SX1RBUkdFVCkKLVBJQ0ZMQUcgPSAKLVBJQ0ZMQUdfRk9SX1RBUkdFVCA9IAotCi1DSElMTEZMQUdTID0gJChDRkxBR1MpCi1DSElMTF9MSUIgPSAtbGNoaWxsCi1DWFggPSBjKysKLQotIyBVc2UgLU8yIHRvIHN0cmVzcyB0ZXN0IHRoZSBjb21waWxlci4KLUxJQkNYWEZMQUdTID0gJChDWFhGTEFHUykgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMgLWZleGNlcHRpb25zCi1DWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHUykKLUxJQkNYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTX0ZPUl9UQVJHRVQpIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIC1mZXhjZXB0aW9ucwotCi1SQU5MSUIgPSByYW5saWIKLQotRExMVE9PTCA9IGRsbHRvb2wKLVdJTkRSRVMgPSB3aW5kcmVzCi0KLU5NID0gbm0KLQotTEQgPSBsZAotCi1CWklQUFJPRyA9IGJ6aXAyCi0KLSMgVGhlc2UgdmFsdWVzIGFyZSBzdWJzdGl0dXRlZCBieSBjb25maWd1cmUuCi1ERUZBVUxUX1lBQ0MgPSB5YWNjCi1ERUZBVUxUX0xFWCA9IGxleAotREVGQVVMVF9NNCA9IG00Ci0KLUJJU09OID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLUwgJCRzL2Jpc29uLyA7IFwKLQkgZWxzZSBcCi0JICAgIGVjaG8gYmlzb24gOyBcCi0JIGZpYAotCi1ZQUNDID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLXkgLUwgJCRzL2Jpc29uLyA7IFwKLQllbGlmIFsgLWYgJCRyL2J5YWNjL2J5YWNjIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYnlhY2MvYnlhY2MgOyBcCi0JZWxzZSBcCi0JICAgIGVjaG8gJHtERUZBVUxUX1lBQ0N9IDsgXAotCWZpYAotCi1MRVggPSBgaWYgWyAtZiAkJHIvZmxleC9mbGV4IF0gOyBcCi0JdGhlbiBlY2hvICQkci9mbGV4L2ZsZXggOyBcCi0JZWxzZSBlY2hvICR7REVGQVVMVF9MRVh9IDsgZmlgCi0KLU00ID0gYGlmIFsgLWYgJCRyL200L200IF0gOyBcCi0JdGhlbiBlY2hvICQkci9tNC9tNCA7IFwKLQllbHNlIGVjaG8gJHtERUZBVUxUX000fSA7IGZpYAotCi1NQUtFSU5GTyA9IGBpZiBbIC1mICQkci90ZXhpbmZvL21ha2VpbmZvL01ha2VmaWxlIF0gOyBcCi0JdGhlbiBlY2hvICQkci90ZXhpbmZvL21ha2VpbmZvL21ha2VpbmZvIDsgXAotCWVsc2UgZWNobyBtYWtlaW5mbyA7IGZpYAotCi0jIFRoaXMganVzdCBiZWNvbWVzIHBhcnQgb2YgdGhlIE1BS0VJTkZPIGRlZmluaXRpb24gcGFzc2VkIGRvd24gdG8KLSMgc3ViLW1ha2VzLiAgSXQgbGV0cyBmbGFncyBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIHdoaWxlIHN0aWxsCi0jIHVzaW5nIHRoZSBtYWtlaW5mbyBmcm9tIHRoZSBvYmplY3QgdHJlZS4KLU1BS0VJTkZPRkxBR1MgPQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvZXhwZWN0L2V4cGVjdCBdIDsgXAotCXRoZW4gZWNobyAkJHIvZXhwZWN0L2V4cGVjdCA7IFwKLQllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHMvZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQkcy9kZWphZ251L3J1bnRlc3QgOyBcCi0JZWxzZSBlY2hvIHJ1bnRlc3QgOyBmaWAKLQotCi0jIGNvbXBpbGVycyB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIG11c3QgYmUgcnVuIGluIHRoZSBidWlsZAotIyBlbnZpcm9ubWVudC4KLUNDX0ZPUl9CVUlMRCA9ICQoQ0MpCi1DWFhfRk9SX0JVSUxEID0gJChDWFgpCi0KLVNVQkRJUlMgPSAidGhpcyBpcyBzZXQgdmlhIGNvbmZpZ3VyZSwgZG9uJ3QgZWRpdCB0aGlzIgotT1RIRVJTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hpY2gKLSMgc2hvdWxkIGJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCi0KLQotVEFSR0VUX0NPTkZJR0RJUlMgPSBsaWJpYmVydHkgbGliZ2xvc3MgJChTUEVDSUFMX0xJQlMpIG5ld2xpYiBsaWJpbyBsaWJyeCBsaWJzdGRjKysgbGliZysrIHdpbnN1cCBvcGNvZGVzIGJzcCBsaWJzdHViIGN5Z21vbgotCi0jIFRhcmdldCBsaWJyYXJpZXMgYXJlIHB1dCB1bmRlciB0aGlzIGRpcmVjdG9yeToKLSMgQ2hhbmdlZCBieSBjb25maWd1cmUgdG8gJCh0YXJnZXRfYWxpYXMpIGlmIGNyb3NzLgotVEFSR0VUX1NVQkRJUiA9IC4KLQotIyBUaGlzIGlzIHNldCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBjb25maWd1cmUuCi1DT05GSUdfQVJHVU1FTlRTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgY29uZmlndXJlIHRvIFJFQUxMWV9TRVRfTElCX1BBVEggaWYgLS1lbmFibGUtc2hhcmVkCi0jIHdhcyB1c2VkLgotU0VUX0xJQl9QQVRIID0KLQotIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2VkIGZvciB0aGUgcGF0aCB0bwotIyB0aGUgbGlicmFyaWVzLiAgVGhpcyBtYXkgYmUgY2hhbmdlZCBieSBjb25maWd1cmUuaW4uCi1SUEFUSF9FTlZWQVIgPSBMRF9MSUJSQVJZX1BBVEgKLQotIyBjb25maWd1cmUuaW4gc2V0cyBTRVRfTElCX1BBVEggdG8gdGhpcyBpZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHVzZWQuCi1SRUFMTFlfU0VUX0xJQl9QQVRIID0gXAotICBpZiBbIHgiJCQkKFJQQVRIX0VOVlZBUikiICE9IHggXTsgdGhlbiBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM6JCQkKFJQQVRIX0VOVlZBUik7IFwKLSAgZWxzZSBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM7IFwKLSAgZmk7IFwKLSAgZXhwb3J0ICQoUlBBVEhfRU5WVkFSKTsKLQotQUxMID0gYWxsLm5vcm1hbAotSU5TVEFMTF9UQVJHRVQgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotSU5TVEFMTF9UQVJHRVRfQ1JPU1MgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MtY3Jvc3MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgY2FzZSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgaW4gXAotICAgICAgICBpWzM0NTZdODYtKi1jeWd3aW4qKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtQiQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi8gLUwkJHIvJChUQVJHRVRfU1VCRElSKS93aW5zdXAgLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL3dpbnN1cC9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luMzIgLW5vc3RkaW5jOyBcCi0gICAgICAgICAgOzsgXAotICAgICAgICAqKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLQkgIDs7IFwKLSAgICAgIGVzYWMgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLSMgSWYgQ0NfRk9SX1RBUkdFVCBpcyBub3Qgb3ZlcnJpZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gdGhpcwotIyB2YXJpYWJsZSBpcyBwYXNzZWQgZG93biB0byB0aGUgZ2NjIE1ha2VmaWxlLCB3aGVyZSBpdCBpcyB1c2VkIHRvCi0jIGJ1aWxkIGxpYmdjYzIuYS4gIFdlIGRlZmluZSBpdCBoZXJlIHNvIHRoYXQgaXQgY2FuIGl0c2VsZiBiZQotIyBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1HQ0NfRk9SX1RBUkdFVCA9ICQkci9nY2MveGdjYyAtQiQkci9nY2MvCi0KLUNISUxMX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLUwkJHIvZ2NjL2NoL3J1bnRpbWUvOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUNYWF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBjYXNlICIkKHRhcmdldF9jYW5vbmljYWwpIiBpbiBcCi0gICAgICAgIGlbMzQ1Nl04Ni0qLWN5Z3dpbiopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1CJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliLyAtTCQkci8kKFRBUkdFVF9TVUJESVIpL3dpbnN1cCAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvd2luc3VwL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4zMiAtbm9zdGRpbmM7IFwKLSAgICAgICAgICA7OyBcCi0gICAgICAgICopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotCSAgOzsgXAotICAgICAgZXNhYyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBjKysgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUFTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2FzL2FzLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvZ2FzL2FzLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUyk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhcyB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUxEX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvbGQvbGQtbmV3IF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9sZC9sZC1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoTEQpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gbGQgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1ETExUT09MX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvZGxsdG9vbCBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvZGxsdG9vbCA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChETExUT09MKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGRsbHRvb2wgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1XSU5EUkVTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvd2luZHJlcyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvd2luZHJlcyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChXSU5EUkVTKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHdpbmRyZXMgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1BUl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL2FyIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy9hciA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhciB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLVJBTkxJQl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL3JhbmxpYiBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvcmFubGliIDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKFJBTkxJQik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyByYW5saWIgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1OTV9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL25tLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvbm0tbmV3IDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKE5NKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIG5tIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotIyBUaGUgZmlyc3QgcnVsZSBpbiB0aGUgZmlsZSBoYWQgYmV0dGVyIGJlIHRoaXMgb25lLiAgRG9uJ3QgcHV0IGFueSBhYm92ZSBpdC4KLSMgVGhpcyBsaXZlcyBoZXJlIHRvIGFsbG93IG1ha2VmaWxlIGZyYWdtZW50cyB0byBjb250YWluIGRlcGVuZGVuY2llcy4KLWFsbDogYWxsLm5vcm1hbAotLlBIT05ZOiBhbGwKLQotIyBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb25maWcvbXQtKi4KLSMgVGhlIF9UQVJHRVRfIGlzIGJlY2F1c2UgdGhleSdyZSBzcGVjaWZpZWQgaW4gbXQtZm9vLgotIyBUaGUgX0hPU1RfIGlzIGJlY2F1c2UgdGhleSdyZSBwcm9ncmFtcyB0aGF0IHJ1biBvbiB0aGUgaG9zdC4KLUVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTID0KLUVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUyA9Ci1FWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTID0KLQotIyMjIyBob3N0IGFuZCB0YXJnZXQgc3BlY2lmaWMgbWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLSMjIwotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBhbGwgc3ViLW1ha2VzLgotIyBQbGVhc2Uga2VlcCB0aGVzZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi1CQVNFX0ZMQUdTX1RPX1BBU1MgPSBcCi0JIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCi0JIkFSX0ZPUl9UQVJHRVQ9JChBUl9GT1JfVEFSR0VUKSIgXAotCSJBU19GT1JfVEFSR0VUPSQoQVNfRk9SX1RBUkdFVCkiIFwKLQkiQklTT049JChCSVNPTikiIFwKLQkiQ0NfRk9SX0JVSUxEPSQoQ0NfRk9SX0JVSUxEKSIgXAotCSJDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAotCSJDRkxBR1NfRk9SX1RBUkdFVD0kKENGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKLQkiQ0hJTExfRk9SX1RBUkdFVD0kKENISUxMX0ZPUl9UQVJHRVQpIiBcCi0JIkNISUxMX0xJQj0kKENISUxMX0xJQikiIFwKLQkiQ1hYX0ZPUl9CVUlMRD0kKENYWF9GT1JfQlVJTEQpIiBcCi0JIkNYWEZMQUdTPSQoQ1hYRkxBR1MpIiBcCi0JIkNYWEZMQUdTX0ZPUl9UQVJHRVQ9JChDWFhGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDWFhfRk9SX1RBUkdFVD0kKENYWF9GT1JfVEFSR0VUKSIgXAotCSJETExUT09MX0ZPUl9UQVJHRVQ9JChETExUT09MX0ZPUl9UQVJHRVQpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCi0JIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLQkiSU5TVEFMTF9TQ1JJUFQ9JChJTlNUQUxMX1NDUklQVCkiIFwKLQkiTERGTEFHUz0kKExERkxBR1MpIiBcCi0JIkxFWD0kKExFWCkiIFwKLQkiTERfRk9SX1RBUkdFVD0kKExEX0ZPUl9UQVJHRVQpIiBcCi0JIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKLQkiTElCQ0ZMQUdTX0ZPUl9UQVJHRVQ9JChMSUJDRkxBR1NfRk9SX1RBUkdFVCkiIFwKLQkiTElCQ1hYRkxBR1M9JChMSUJDWFhGTEFHUykiIFwKLQkiTElCQ1hYRkxBR1NfRk9SX1RBUkdFVD0kKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpIiBcCi0JIk00PSQoTTQpIiBcCi0JIk1BS0U9JChNQUtFKSIgXAotCSJNQUtFSU5GTz0kKE1BS0VJTkZPKSAkKE1BS0VJTkZPRkxBR1MpIiBcCi0JIk5NX0ZPUl9UQVJHRVQ9JChOTV9GT1JfVEFSR0VUKSIgXAotCSJSQU5MSUJfRk9SX1RBUkdFVD0kKFJBTkxJQl9GT1JfVEFSR0VUKSIgXAotCSJSUEFUSF9FTlZWQVI9JChSUEFUSF9FTlZWQVIpIiBcCi0JIlNIRUxMPSQoU0hFTEwpIiBcCi0JIkVYUEVDVD0kKEVYUEVDVCkiIFwKLQkiUlVOVEVTVD0kKFJVTlRFU1QpIiBcCi0JIlJVTlRFU1RGTEFHUz0kKFJVTlRFU1RGTEFHUykiIFwKLQkiVEFSR0VUX1NVQkRJUj0kKFRBUkdFVF9TVUJESVIpIiBcCi0JIldJTkRSRVNfRk9SX1RBUkdFVD0kKFdJTkRSRVNfRk9SX1RBUkdFVCkiIFwKLQkiWUFDQz0kKFlBQ0MpIiBcCi0JImJpbmRpcj0kKGJpbmRpcikiIFwKLQkiZGF0YWRpcj0kKGRhdGFkaXIpIiBcCi0JImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCi0JImluY2x1ZGVkaXI9JChpbmNsdWRlZGlyKSIgXAotCSJpbmZvZGlyPSQoaW5mb2RpcikiIFwKLQkibGliZGlyPSQobGliZGlyKSIgXAotCSJsaWJleGVjZGlyPSQobGliZXhlY2RpcikiIFwKLQkibGlzcGRpcj0kKGxpc3BkaXIpIiBcCi0JImxvY2Fsc3RhdGVkaXI9JChsb2NhbHN0YXRlZGlyKSIgXAotCSJtYW5kaXI9JChtYW5kaXIpIiBcCi0JIm9sZGluY2x1ZGVkaXI9JChvbGRpbmNsdWRlZGlyKSIgXAotCSJwcmVmaXg9JChwcmVmaXgpIiBcCi0JInNiaW5kaXI9JChzYmluZGlyKSIgXAotCSJzaGFyZWRzdGF0ZWRpcj0kKHNoYXJlZHN0YXRlZGlyKSIgXAotCSJzeXNjb25mZGlyPSQoc3lzY29uZmRpcikiIFwKLQkidG9vbGRpcj0kKHRvb2xkaXIpIiBcCi0JImd4eF9pbmNsdWRlX2Rpcj0kKGd4eF9pbmNsdWRlX2RpcikiIFwKLQkiZ2NjX3ZlcnNpb249JChnY2NfdmVyc2lvbikiIFwKLQkiZ2NjX3ZlcnNpb25fdHJpZ2dlcj0kKGdjY192ZXJzaW9uX3RyaWdnZXIpIiBcCi0JInRhcmdldF9hbGlhcz0kKHRhcmdldF9hbGlhcykiIFwKLQkibGlic3ViZGlyPSQobGlic3ViZGlyKSIKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbW9zdCBzdWItbWFrZXMsIGluIHdoaWNoIHdlJ3JlIGJ1aWxkaW5nIHdpdGgKLSMgdGhlIGhvc3QgZW52aXJvbm1lbnQuCi0jIElmIGFueSB2YXJpYWJsZXMgYXJlIGFkZGVkIGhlcmUsIHRoZXkgbXVzdCBiZSBhZGRlZCB0byBkby0qLCBiZWxvdy4KLUVYVFJBX0hPU1RfRkxBR1MgPSBcCi0JJ0FSPSQoQVIpJyBcCi0JJ0FTPSQoQVMpJyBcCi0JJ0NDPSQoQ0MpJyBcCi0JJ0NYWD0kKENYWCknIFwKLQknRExMVE9PTD0kKERMTFRPT0wpJyBcCi0JJ0xEPSQoTEQpJyBcCi0JJ05NPSQoTk0pJyBcCi0JJ1JBTkxJQj0kKFJBTkxJQiknIFwKLQknV0lORFJFUz0kKFdJTkRSRVMpJwotCi1GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfSE9TVF9GTEFHUykKLQotIyBGbGFncyB0aGF0IGFyZSBjb25jZXJuZWQgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIFgxMSBpbmNsdWRlIGZpbGVzCi0jIGFuZCBsaWJyYXJ5IGZpbGVzCi0jCi0jIE5PVEU6IHVudGlsIHRoZSB0b3AtbGV2ZWwgaXMgZ2V0dGluZyB0aGUgdmFsdWVzIHZpYSBhdXRvY29uZiwgaXQgb25seQotIyBjYXVzZXMgcHJvYmxlbXMgdG8gaGF2ZSB0aGlzIHRvcC1sZXZlbCBNYWtlZmlsZSBvdmVycmlkaW5nIHRoZSBhdXRvY29uZi1zZXQKLSMgdmFsdWVzIGluIGNoaWxkIGRpcmVjdG9yaWVzLiAgT25seSB2YXJpYWJsZXMgdGhhdCBkb24ndCBjb25mbGljdCB3aXRoCi0jIGF1dG9jb25mJ2VkIG9uZXMgc2hvdWxkIGJlIHBhc3NlZCBieSBYMTFfRkxBR1NfVE9fUEFTUyBmb3Igbm93LgotIwotWDExX0ZMQUdTX1RPX1BBU1MgPSBcCi0JJ1gxMV9FWFRSQV9DRkxBR1M9JChYMTFfRVhUUkFfQ0ZMQUdTKScgXAotCSdYMTFfRVhUUkFfTElCUz0kKFgxMV9FWFRSQV9MSUJTKScKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbWFrZXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGggdGhlIHRhcmdldCBlbnZpcm9ubWVudC4KLSMgVGhlIGRvdWJsZSAkIGRlY3JlYXNlcyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGxpbmU7IHRoZSB2YXJpYWJsZXMKLSMgYXJlIHNldCBpbiBCQVNFX0ZMQUdTX1RPX1BBU1MsIGFuZCB0aGUgc3ViLW1ha2Ugd2lsbCBleHBhbmQgdGhlbS4KLSMgSWYgYW55IHZhcmlhYmxlcyBhcmUgYWRkZWQgaGVyZSwgdGhleSBtdXN0IGJlIGFkZGVkIHRvIGRvLSosIGJlbG93LgotRVhUUkFfVEFSR0VUX0ZMQUdTID0gXAotCSdBUj0kJChBUl9GT1JfVEFSR0VUKScgXAotCSdBUz0kJChBU19GT1JfVEFSR0VUKScgXAotCSdDQz0kJChDQ19GT1JfVEFSR0VUKScgXAotCSdDRkxBR1M9JCQoQ0ZMQUdTX0ZPUl9UQVJHRVQpJyBcCi0JJ0NYWD0kJChDWFhfRk9SX1RBUkdFVCknIFwKLQknQ1hYRkxBR1M9JCQoQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknRExMVE9PTD0kJChETExUT09MX0ZPUl9UQVJHRVQpJyBcCi0JJ0xEPSQkKExEX0ZPUl9UQVJHRVQpJyBcCi0JJ0xJQkNGTEFHUz0kJChMSUJDRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTElCQ1hYRkxBR1M9JCQoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTk09JCQoTk1fRk9SX1RBUkdFVCknIFwKLQknUkFOTElCPSQkKFJBTkxJQl9GT1JfVEFSR0VUKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknCi0KLVRBUkdFVF9GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfVEFSR0VUX0ZMQUdTKQotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBnY2MuICBnY2MgYnVpbGRzIGEgbGlicmFyeSwgbGliZ2NjLmEsIHNvIGl0Ci0jIHVuZm9ydHVuYXRlbHkgbmVlZHMgdGhlIG5hdGl2ZSBjb21waWxlciBhbmQgdGhlIHRhcmdldCBhciBhbmQKLSMgcmFubGliLgotIyBJZiBhbnkgdmFyaWFibGVzIGFyZSBhZGRlZCBoZXJlLCB0aGV5IG11c3QgYmUgYWRkZWQgdG8gZG8tKiwgYmVsb3cuCi0jIFRoZSBIT1NUXyogdmFyaWFibGVzIGFyZSBhIHNwZWNpYWwgY2FzZSwgd2hpY2ggYXJlIHVzZWQgZm9yIHRoZSBnY2MKLSMgY3Jvc3MtYnVpbGRpbmcgc2NoZW1lLgotRVhUUkFfR0NDX0ZMQUdTID0gXAotCSdBUj0kKEFSKScgXAotCSdBUz0kKEFTKScgXAotCSdDQz0kKENDKScgXAotCSdDWFg9JChDWFgpJyBcCi0JJ0RMTFRPT0w9JCQoRExMVE9PTF9GT1JfVEFSR0VUKScgXAotCSdIT1NUX0NDPSQoQ0NfRk9SX0JVSUxEKScgXAotCSdIT1NUX1BSRUZJWD0kKEhPU1RfUFJFRklYKScgXAotCSdIT1NUX1BSRUZJWF8xPSQoSE9TVF9QUkVGSVhfMSknIFwKLQknTk09JChOTSknIFwKLQknUkFOTElCPSQoUkFOTElCKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknIFwKLQkiR0NDX0ZPUl9UQVJHRVQ9JChHQ0NfRk9SX1RBUkdFVCkiIFwKLQkiYGVjaG8gJ0xBTkdVQUdFUz0kKExBTkdVQUdFUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnU1RNUF9GSVhQUk9UTz0kKFNUTVBfRklYUFJPVE8pJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJTUlUU19IX1RFU1Q9JChMSU1JVFNfSF9URVNUKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSUJHQ0MxX1RFU1Q9JChMSUJHQ0MxX1RFU1QpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfQ0ZMQUdTPSQoTElCR0NDMl9DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfREVCVUdfQ0ZMQUdTPSQoTElCR0NDMl9ERUJVR19DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfSU5DTFVERVM9JChMSUJHQ0MyX0lOQ0xVREVTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdFTlFVSVJFPSQoRU5RVUlSRSknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnQk9PVF9DRkxBR1M9JChCT09UX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIKLQotR0NDX0ZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9HQ0NfRkxBR1MpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUgY29tcGlsZWQKLSMgdXNpbmcgJChGTEFHU19UT19QQVNTKS4KLUFMTF9NT0RVTEVTID0gXAotCWFsbC1hcGFjaGUgXAotCWFsbC1hc2ggXAotCWFsbC1hdXRvY29uZiBcCi0JYWxsLWF1dG9tYWtlIFwKLQlhbGwtYmFzaCBcCi0JYWxsLWJmZCBcCi0JYWxsLWJpbnV0aWxzIFwKLQlhbGwtYmlzb24gXAotCWFsbC1ieWFjYyBcCi0JYWxsLWJ6aXAyIFwKLQlhbGwtY3Zzc3JjIFwKLQlhbGwtZGIgXAotCWFsbC1kZWphZ251IFwKLQlhbGwtZGlmZiBcCi0JYWxsLWRvc3V0aWxzIFwKLQlhbGwtZXRjIFwKLQlhbGwtZmlsZXV0aWxzIFwKLQlhbGwtZmluZHV0aWxzIFwKLQlhbGwtZmluZCBcCi0JYWxsLWZsZXggXAotCWFsbC1nYXMgXAotCWFsbC1nYXdrIFwKLQlhbGwtZ2V0dGV4dCBcCi0JYWxsLWdudXNlcnYgXAotCWFsbC1ncHJvZiBcCi0JYWxsLWdyZXAgXAotCWFsbC1ncmV6IFwKLQlhbGwtZ3ppcCBcCi0JYWxsLWhlbGxvIFwKLQlhbGwtaW5kZW50IFwKLQlhbGwtaW5ldCBcCi0JYWxsLWludGwgXAotCWFsbC1pc3BlbGwgXAotCWFsbC1pdGNsIFwKLQlhbGwtbGQgXAotCWFsbC1saWJndWkgXAotCWFsbC1saWJpYmVydHkgXAotCWFsbC1saWJ0b29sIFwKLQlhbGwtbTQgXAotCWFsbC1tYWtlIFwKLQlhbGwtbW1hbGxvYyBcCi0JYWxsLW9wY29kZXMgXAotCWFsbC1wYXRjaCBcCi0JYWxsLXBlcmwgXAotCWFsbC1wcm1zIFwKLQlhbGwtcmNzIFwKLQlhbGwtcmVhZGxpbmUgXAotCWFsbC1yZWxlYXNlIFwKLQlhbGwtcmVjb2RlIFwKLQlhbGwtc2VkIFwKLQlhbGwtc2VuZC1wciBcCi0JYWxsLXNoZWxsdXRpbHMgXAotCWFsbC1zaW0gXAotCWFsbC10YXIgXAotCWFsbC10Y2wgXAotCWFsbC10Y2w4LjEgXAotCWFsbC10ZXhpbmZvIFwKLQlhbGwtdGV4dHV0aWxzIFwKLQlhbGwtdGdhcyBcCi0JYWxsLXRpbWUgXAotCWFsbC11dWRlY29kZSBcCi0JYWxsLXdkaWZmIFwKLQlhbGwtemlwIFwKLQkkKEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoRkxBR1NfVE9fUEFTUykuCi0jCi0jIFRoZSBsaXN0IGlzIGluIHR3byBwYXJ0cy4gIFRoZSBmaXJzdCBsaXN0cyB0aG9zZSB0b29scyB3aGljaAotIyBhcmUgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIGhvc3QncyBuYXRpdmUgdG9vbC1jaGFpbiwgYW5kIG5vdAotIyB0ZXN0ZWQgaW4gYSBjcm9zcyBjb25maWd1cmF0aW9uLgotTkFUSVZFX0NIRUNLX01PRFVMRVMgPSBcCi0JY2hlY2stYmlzb24gXAotCWNoZWNrLWJ5YWNjIFwKLQljaGVjay1mbGV4IFwKLQljaGVjay16aXAKLQotQ1JPU1NfQ0hFQ0tfTU9EVUxFUyA9IFwKLQljaGVjay1hcGFjaGUgXAotCWNoZWNrLWFzaCBcCi0JY2hlY2stYXV0b2NvbmYgXAotCWNoZWNrLWF1dG9tYWtlIFwKLQljaGVjay1iYXNoIFwKLQljaGVjay1iZmQgXAotCWNoZWNrLWJpbnV0aWxzIFwKLQljaGVjay1iemlwMiBcCi0JY2hlY2stY3Zzc3JjIFwKLQljaGVjay1kYiBcCi0JY2hlY2stZGVqYWdudSBcCi0JY2hlY2stZGlmZiBcCi0JY2hlY2stZXRjIFwKLQljaGVjay1maWxldXRpbHMgXAotCWNoZWNrLWZpbmR1dGlscyBcCi0JY2hlY2stZmluZCBcCi0JY2hlY2stZ2FzIFwKLQljaGVjay1nYXdrIFwKLQljaGVjay1nZXR0ZXh0IFwKLQljaGVjay1nbnVzZXJ2IFwKLQljaGVjay1ncHJvZiBcCi0JY2hlY2stZ3JlcCBcCi0JY2hlY2stZ3ppcCBcCi0JY2hlY2staGVsbG8gXAotCWNoZWNrLWluZGVudCBcCi0JY2hlY2staW5ldCBcCi0JY2hlY2staW50bCBcCi0JY2hlY2staXNwZWxsIFwKLQljaGVjay1pdGNsIFwKLQljaGVjay1sZCBcCi0JY2hlY2stbGliZ3VpIFwKLQljaGVjay1saWJpYmVydHkgXAotCWNoZWNrLWxpYnRvb2wgXAotCWNoZWNrLW00IFwKLQljaGVjay1tYWtlIFwKLQljaGVjay1tbWNoZWNrb2MgXAotCWNoZWNrLW9wY29kZXMgXAotCWNoZWNrLXBhdGNoIFwKLQljaGVjay1wZXJsIFwKLQljaGVjay1wcm1zIFwKLQljaGVjay1yY3MgXAotCWNoZWNrLXJlYWRsaW5lIFwKLQljaGVjay1yZWNvZGUgXAotCWNoZWNrLXNlZCBcCi0JY2hlY2stc2VuZC1wciBcCi0JY2hlY2stc2hlbGx1dGlscyBcCi0JY2hlY2stc2ltIFwKLQljaGVjay10YXIgXAotCWNoZWNrLXRjbCBcCi0JY2hlY2stdGV4aW5mbyBcCi0JY2hlY2stdGV4dHV0aWxzIFwKLQljaGVjay10Z2FzIFwKLQljaGVjay10aW1lIFwKLQljaGVjay11dWRlY29kZSBcCi0JY2hlY2std2RpZmYgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfQ0hFQ0tfTU9EVUxFUykKLQotQ0hFQ0tfTU9EVUxFUz0kKE5BVElWRV9DSEVDS19NT0RVTEVTKSAkKENST1NTX0NIRUNLX01PRFVMRVMpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKEZMQUdTX1RPX1BBU1MpLgotIyBXZSBwdXQgaW5zdGFsbC1vcGNvZGVzIGJlZm9yZSBpbnN0YWxsLWJpbnV0aWxzIGJlY2F1c2UgdGhlIGluc3RhbGxlZAotIyBiaW51dGlscyBtaWdodCBiZSBvbiBQQVRILCBhbmQgdGhleSBtaWdodCBuZWVkIHRoZSBzaGFyZWQgb3Bjb2RlcwotIyBsaWJyYXJ5LgotIyBXZSBwdXQgaW5zdGFsbC10Y2wgYmVmb3JlIGluc3RhbGwtaXRjbCBiZWNhdXNlIGl0Y2wgd2FudHMgdG8gcnVuIGEKLSMgcHJvZ3JhbSBvbiBpbnN0YWxsYXRpb24gd2hpY2ggdXNlcyB0aGUgVGNsIGxpYnJhcmllcy4KLUlOU1RBTExfTU9EVUxFUyA9IFwKLQlpbnN0YWxsLWFwYWNoZSBcCi0JaW5zdGFsbC1hc2ggXAotCWluc3RhbGwtYXV0b2NvbmYgXAotCWluc3RhbGwtYXV0b21ha2UgXAotCWluc3RhbGwtYmFzaCBcCi0JaW5zdGFsbC1iZmQgXAotCWluc3RhbGwtYnppcDIgXAotCWluc3RhbGwtb3Bjb2RlcyBcCi0JaW5zdGFsbC1iaW51dGlscyBcCi0JaW5zdGFsbC1iaXNvbiBcCi0JaW5zdGFsbC1ieWFjYyBcCi0JaW5zdGFsbC1jdnNzcmMgXAotCWluc3RhbGwtZGIgXAotCWluc3RhbGwtZGVqYWdudSBcCi0JaW5zdGFsbC1kaWZmIFwKLQlpbnN0YWxsLWRvc3V0aWxzIFwKLQlpbnN0YWxsLWV0YyBcCi0JaW5zdGFsbC1maWxldXRpbHMgXAotCWluc3RhbGwtZmluZHV0aWxzIFwKLQlpbnN0YWxsLWZpbmQgXAotCWluc3RhbGwtZmxleCBcCi0JaW5zdGFsbC1nYXMgXAotCWluc3RhbGwtZ2F3ayBcCi0JaW5zdGFsbC1nZXR0ZXh0IFwKLQlpbnN0YWxsLWdudXNlcnYgXAotCWluc3RhbGwtZ3Byb2YgXAotCWluc3RhbGwtZ3JlcCBcCi0JaW5zdGFsbC1ncmV6IFwKLQlpbnN0YWxsLWd6aXAgXAotCWluc3RhbGwtaGVsbG8gXAotCWluc3RhbGwtaW5kZW50IFwKLQlpbnN0YWxsLWluZXQgXAotCWluc3RhbGwtaW50bCBcCi0JaW5zdGFsbC1pc3BlbGwgXAotCWluc3RhbGwtdGNsIFwKLQlpbnN0YWxsLXRjbDguMSBcCi0JaW5zdGFsbC1pdGNsIFwKLQlpbnN0YWxsLWxkIFwKLQlpbnN0YWxsLWxpYmd1aSBcCi0JaW5zdGFsbC1saWJpYmVydHkgXAotCWluc3RhbGwtbGlidG9vbCBcCi0JaW5zdGFsbC1tNCBcCi0JaW5zdGFsbC1tYWtlIFwKLQlpbnN0YWxsLW1tYWxsb2MgXAotCWluc3RhbGwtcGF0Y2ggXAotCWluc3RhbGwtcGVybCBcCi0JaW5zdGFsbC1wcm1zIFwKLQlpbnN0YWxsLXJjcyBcCi0JaW5zdGFsbC1yZWFkbGluZSBcCi0JaW5zdGFsbC1yZWNvZGUgXAotCWluc3RhbGwtc2VkIFwKLQlpbnN0YWxsLXNlbmQtcHIgXAotCWluc3RhbGwtc2hlbGx1dGlscyBcCi0JaW5zdGFsbC1zaW0gXAotCWluc3RhbGwtdGFyIFwKLQlpbnN0YWxsLXRleGluZm8gXAotCWluc3RhbGwtdGV4dHV0aWxzIFwKLQlpbnN0YWxsLXRnYXMgXAotCWluc3RhbGwtdGltZSBcCi0JaW5zdGFsbC11dWRlY29kZSBcCi0JaW5zdGFsbC13ZGlmZiBcCi0JaW5zdGFsbC16aXAgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGNvbXBpbGVkCi0jIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQUxMX1gxMV9NT0RVTEVTID0gXAotCWFsbC1lbWFjcyBcCi0JYWxsLWVtYWNzMTkgXAotCWFsbC1nZGIgXAotCWFsbC1leHBlY3QgXAotCWFsbC1nYXNoIFwKLQlhbGwtZ3VpbGUgXAotCWFsbC10Y2xYIFwKLQlhbGwtdGsgXAotCWFsbC10azguMSBcCi0JYWxsLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQ0hFQ0tfWDExX01PRFVMRVMgPSBcCi0JY2hlY2stZW1hY3MgXAotCWNoZWNrLWdkYiBcCi0JY2hlY2stZ3VpbGUgXAotCWNoZWNrLWV4cGVjdCBcCi0JY2hlY2stZ2FzaCBcCi0JY2hlY2stdGNsWCBcCi0JY2hlY2stdGsgXAotCWNoZWNrLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBpbnN0YWxsIHRhcmdldHMgZm9yIGFsbCB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCi1JTlNUQUxMX1gxMV9NT0RVTEVTID0gXAotCWluc3RhbGwtZW1hY3MgXAotCWluc3RhbGwtZW1hY3MxOSBcCi0JaW5zdGFsbC1nZGIgXAotCWluc3RhbGwtZ3VpbGUgXAotCWluc3RhbGwtZXhwZWN0IFwKLQlpbnN0YWxsLWdhc2ggXAotCWluc3RhbGwtdGNsWCBcCi0JaW5zdGFsbC10ayBcCi0JaW5zdGFsbC10azguMSBcCi0JaW5zdGFsbC10aXgKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBjb21waWxlZAotIyB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUFMTF9UQVJHRVRfTU9EVUxFUyA9IFwKLQlhbGwtdGFyZ2V0LWxpYmlvIFwKLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JYWxsLXRhcmdldC1saWJyeCBcCi0JYWxsLXRhcmdldC1saWJnKysgXAotCWFsbC10YXJnZXQtbmV3bGliIFwKLQlhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWFsbC10YXJnZXQtd2luc3VwIFwKLQlhbGwtdGFyZ2V0LWxpYmdsb3NzIFwKLQlhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JYWxsLXRhcmdldC1ncGVyZiBcCi0JYWxsLXRhcmdldC1leGFtcGxlcyBcCi0JYWxsLXRhcmdldC1saWJzdHViIFwKLQlhbGwtdGFyZ2V0LWJzcCBcCi0JYWxsLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY29uZmlndXJlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaAotIyBhcmUgY29tcGlsZWQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyA9IFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmlvIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJyeCBcCi0JY29uZmlndXJlLXRhcmdldC1saWJnKysgXAotCWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmdsb3NzIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY29uZmlndXJlLXRhcmdldC1ncGVyZiBcCi0JY29uZmlndXJlLXRhcmdldC1leGFtcGxlcyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJzdHViIFwKLQljb25maWd1cmUtdGFyZ2V0LWJzcCBcCi0JY29uZmlndXJlLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY2hlY2sgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUNIRUNLX1RBUkdFVF9NT0RVTEVTID0gXAotCWNoZWNrLXRhcmdldC1saWJpbyBcCi0JY2hlY2stdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY2hlY2stdGFyZ2V0LWxpYmcrKyBcCi0JY2hlY2stdGFyZ2V0LW5ld2xpYiBcCi0JY2hlY2stdGFyZ2V0LXdpbnN1cCBcCi0JY2hlY2stdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY2hlY2stdGFyZ2V0LWdwZXJmCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUlOU1RBTExfVEFSR0VUX01PRFVMRVMgPSBcCi0JaW5zdGFsbC10YXJnZXQtbGliaW8gXAotCWluc3RhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JaW5zdGFsbC10YXJnZXQtbGliZysrIFwKLQlpbnN0YWxsLXRhcmdldC1uZXdsaWIgXAotCWluc3RhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWluc3RhbGwtdGFyZ2V0LXdpbnN1cCBcCi0JaW5zdGFsbC10YXJnZXQtbGliZ2xvc3MgXAotCWluc3RhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JaW5zdGFsbC10YXJnZXQtYnNwIFwKLQlpbnN0YWxsLXRhcmdldC1ncGVyZgotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciB3aGljaCB3ZSBjYW4gZG8gYSBjbGVhbi17dGFyZ2V0fS4KLUNMRUFOX01PRFVMRVMgPSBcCi0JY2xlYW4tYXBhY2hlIFwKLQljbGVhbi1hc2ggXAotCWNsZWFuLWF1dG9jb25mIFwKLQljbGVhbi1hdXRvbWFrZSBcCi0JY2xlYW4tYmFzaCBcCi0JY2xlYW4tYmZkIFwKLQljbGVhbi1iaW51dGlscyBcCi0JY2xlYW4tYmlzb24gXAotCWNsZWFuLWJ5YWNjIFwKLQljbGVhbi1iemlwMiBcCi0JY2xlYW4tY3Zzc3JjIFwKLQljbGVhbi1kYiBcCi0JY2xlYW4tZGVqYWdudSBcCi0JY2xlYW4tZGlmZiBcCi0JY2xlYW4tZG9zdXRpbHMgXAotCWNsZWFuLWV0YyBcCi0JY2xlYW4tZmlsZXV0aWxzIFwKLQljbGVhbi1maW5kdXRpbHMgXAotCWNsZWFuLWZpbmQgXAotCWNsZWFuLWZsZXggXAotCWNsZWFuLWdhcyBcCi0JY2xlYW4tZ2F3ayBcCi0JY2xlYW4tZ2V0dGV4dCBcCi0JY2xlYW4tZ251c2VydiBcCi0JY2xlYW4tZ3Byb2YgXAotCWNsZWFuLWdyZXAgXAotCWNsZWFuLWdyZXogXAotCWNsZWFuLWd6aXAgXAotCWNsZWFuLWhlbGxvIFwKLQljbGVhbi1pbmRlbnQgXAotCWNsZWFuLWluZXQgXAotCWNsZWFuLWludGwgXAotCWNsZWFuLWlzcGVsbCBcCi0JY2xlYW4taXRjbCBcCi0JY2xlYW4tbGQgXAotCWNsZWFuLWxpYmd1aSBcCi0JY2xlYW4tbGliaWJlcnR5IFwKLQljbGVhbi1saWJ0b29sIFwKLQljbGVhbi1tNCBcCi0JY2xlYW4tbWFrZSBcCi0JY2xlYW4tbW1hbGxvYyBcCi0JY2xlYW4tb3Bjb2RlcyBcCi0JY2xlYW4tcGF0Y2ggXAotCWNsZWFuLXBlcmwgXAotCWNsZWFuLXBybXMgXAotCWNsZWFuLXJjcyBcCi0JY2xlYW4tcmVhZGxpbmUgXAotCWNsZWFuLXJlbGVhc2UgXAotCWNsZWFuLXJlY29kZSBcCi0JY2xlYW4tc2VkIFwKLQljbGVhbi1zZW5kLXByIFwKLQljbGVhbi1zaGVsbHV0aWxzIFwKLQljbGVhbi1zaW0gXAotCWNsZWFuLXRhciBcCi0JY2xlYW4tdGNsIFwKLQljbGVhbi10ZXhpbmZvIFwKLQljbGVhbi10ZXh0dXRpbHMgXAotCWNsZWFuLXRnYXMgXAotCWNsZWFuLXRpbWUgXAotCWNsZWFuLXV1ZGVjb2RlIFwKLQljbGVhbi13ZGlmZiBcCi0JY2xlYW4temlwCi0KLSMgQWxsIG9mIHRoZSB0YXJnZXQgbW9kdWxlcyB0aGF0IGNhbiBiZSBjbGVhbmVkCi1DTEVBTl9UQVJHRVRfTU9EVUxFUyA9IFwKLQljbGVhbi10YXJnZXQtbGliaW8gXAotCWNsZWFuLXRhcmdldC1saWJzdGRjKysgXAotCWNsZWFuLXRhcmdldC1saWJyeCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmcrKyBcCi0JY2xlYW4tdGFyZ2V0LW5ld2xpYiBcCi0JY2xlYW4tdGFyZ2V0LXdpbnN1cCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmdsb3NzIFwKLQljbGVhbi10YXJnZXQtbGliaWJlcnR5IFwKLQljbGVhbi10YXJnZXQtZ3BlcmYgXAotCWNsZWFuLXRhcmdldC1leGFtcGxlcyBcCi0JY2xlYW4tdGFyZ2V0LWxpYnN0dWIgXAotCWNsZWFuLXRhcmdldC1ic3AgXAotCWNsZWFuLXRhcmdldC1jeWdtb24KLQotIyBBbGwgb2YgdGhlIHgxMSBtb2R1bGVzIHRoYXQgY2FuIGJlIGNsZWFuZWQKLUNMRUFOX1gxMV9NT0RVTEVTID0gXAotCWNsZWFuLWVtYWNzIFwKLQljbGVhbi1lbWFjczE5IFwKLQljbGVhbi1nZGIgXAotCWNsZWFuLWV4cGVjdCBcCi0JY2xlYW4tZ2FzaCBcCi0JY2xlYW4tZ3VpbGUgXAotCWNsZWFuLXRjbFggXAotCWNsZWFuLXRrIFwKLQljbGVhbi10aXgKLQotIyBUaGUgdGFyZ2V0IGJ1aWx0IGZvciBhIG5hdGl2ZSBidWlsZC4KLS5QSE9OWTogYWxsLm5vcm1hbAotYWxsLm5vcm1hbDogXAotCSQoQUxMX01PRFVMRVMpIFwKLQkkKEFMTF9YMTFfTU9EVUxFUykgXAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JYWxsLWdjYwotCi0jIERvIGEgdGFyZ2V0IGZvciBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzLiAgQSBgYG1ha2UgZG8tWCcnIHdpbGwgZG8gYQotIyBgYG1ha2UgWCcnIGluIGFsbCBzdWJkaXJlY3RvcmllcyAoYmVjYXVzZSwgaW4gZ2VuZXJhbCwgdGhlcmUgaXMgYQotIyBkZXBlbmRlbmN5IChiZWxvdykgb2YgWCB1cG9uIGRvLVgsIGEgYGBtYWtlIFgnJyB3aWxsIGFsc28gZG8gdGhpcywKLSMgYnV0IGl0IG1heSBkbyBhZGRpdGlvbmFsIHdvcmsgYXMgd2VsbCkuCi0jIFRoaXMgdGFyZ2V0IGVuc3VyZXMgdGhhdCAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYXBwZWFycyBvbmx5IG9uY2UsCi0jIGJlY2F1c2UgaXQgaXMgc28gbGFyZ2UgdGhhdCBpdCBjYW4gZWFzaWx5IG92ZXJmbG93IHRoZSBjb21tYW5kIGxpbmUKLSMgbGVuZ3RoIGxpbWl0IG9uIHNvbWUgc3lzdGVtcy4KLURPX1ggPSBcCi0JZG8tY2xlYW4gXAotCWRvLWRpc3RjbGVhbiBcCi0JZG8tZHZpIFwKLQlkby1pbmZvIFwKLQlkby1pbnN0YWxsLWluZm8gXAotCWRvLWluc3RhbGxjaGVjayBcCi0JZG8tbW9zdGx5Y2xlYW4gXAotCWRvLW1haW50YWluZXItY2xlYW4gXAotCWRvLVRBR1MKLS5QSE9OWTogJChET19YKQotJChET19YKToKLQlAdGFyZ2V0PWBlY2hvICRAIHwgc2VkIC1lICdzL15kby0vLydgOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQlmb3IgaSBpbiAkKFNVQkRJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgLi8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGNhc2UgJCRpIGluIFwKLQkgICAgZ2NjKSBcCi0JICAgICAgZm9yIGZsYWcgaW4gJChFWFRSQV9HQ0NfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgICopIFwKLQkgICAgICBmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgIGVzYWMgOyBcCi0JICAgIGV4cG9ydCBBUiBBUyBDQyBDWFggTEQgTk0gUkFOTElCIERMTFRPT0wgV0lORFJFUzsgXAotCSAgICBpZiAoY2QgLi8kJGk7IFwKLQkgICAgICAgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKLQkJCSJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAotCQkJIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCi0JCQkiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKLQkJCSQke3RhcmdldH0pOyBcCi0JICAgIHRoZW4gdHJ1ZTsgZWxzZSBleGl0IDE7IGZpOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCUB0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXmRvLS8vJ2A7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWZvciBpIGluICQoVEFSR0VUX0NPTkZJR0RJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAotCQlldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMid8ImA7IFwKLQkgICAgZG9uZTsgXAotCSAgICBleHBvcnQgQVIgQVMgQ0MgQ1hYIExEIE5NIFJBTkxJQiBETExUT09MIFdJTkRSRVM7IFwKLQkgICAgaWYgKGNkICQoVEFSR0VUX1NVQkRJUikvJCRpOyBcCi0JICAgICAgICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCi0JCQkiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKLQkJCSJSQU5MSUI9JCR7UkFOTElCfSIgXAotCQkJIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCi0JCQkkJHt0YXJnZXR9KTsgXAotCSAgICB0aGVuIHRydWU7IGVsc2UgZXhpdCAxOyBmaTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQotIyBIZXJlIGFyZSB0aGUgdGFyZ2V0cyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBkby1YIHRhcmdldHMuCi0KLS5QSE9OWTogaW5mbyBpbnN0YWxsY2hlY2sgZHZpIGluc3RhbGwtaW5mbwotLlBIT05ZOiBjbGVhbiBkaXN0Y2xlYW4gbW9zdGx5Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4KLS5QSE9OWTogbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuIGxvY2FsLW1haW50YWluZXItY2xlYW4KLWluZm86IGRvLWluZm8KLWluc3RhbGxjaGVjazogZG8taW5zdGFsbGNoZWNrCi1kdmk6IGRvLWR2aQotCi0jIE1ha2Ugc3VyZSBtYWtlaW5mbyBpcyBidWlsdCBiZWZvcmUgd2UgZG8gYSBgbWFrZSBpbmZvJy4KLWRvLWluZm86IGFsbC10ZXhpbmZvCi0KLWluc3RhbGwtaW5mbzogZG8taW5zdGFsbC1pbmZvIGRpci5pbmZvCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCWlmIFsgLWYgZGlyLmluZm8gXSA7IHRoZW4gXAotCSAgJChJTlNUQUxMX0RBVEEpIGRpci5pbmZvICQoaW5mb2RpcikvZGlyLmluZm8gOyBcCi0JZWxzZSB0cnVlIDsgZmkKLQotbG9jYWwtY2xlYW46Ci0JLXJtIC1mICouYSBURU1QIGVycnMgY29yZSAqLm8gKn4gXCMqIFRBR1MgKi5FICoubG9nCi0KLWxvY2FsLWRpc3RjbGVhbjoKLQktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgbWgtZnJhZyBtdC1mcmFnCi0JLWlmIFsgIiQoVEFSR0VUX1NVQkRJUikiICE9ICIuIiBdOyB0aGVuIFwKLQkgIHJtIC1yZiAkKFRBUkdFVF9TVUJESVIpOyBcCi0JZWxzZSB0cnVlOyBmaQotCi1sb2NhbC1tYWludGFpbmVyLWNsZWFuOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1jbGVhbjogZG8tY2xlYW4gbG9jYWwtY2xlYW4KLW1vc3RseWNsZWFuOiBkby1tb3N0bHljbGVhbiBsb2NhbC1jbGVhbgotZGlzdGNsZWFuOiBkby1kaXN0Y2xlYW4gbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1tYWludGFpbmVyLWNsZWFuIGRvLW1haW50YWluZXItY2xlYW4gbG9jYWwtY2xlYW4gCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1kaXN0Y2xlYW4KLXJlYWxjbGVhbjogbWFpbnRhaW5lci1jbGVhbgotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNsZWFuIHNwZWNpZmljIG1vZHVsZXMuCi0uUEhPTlk6ICQoQ0xFQU5fTU9EVUxFUykgJChDTEVBTl9YMTFfTU9EVUxFUykgY2xlYW4tZ2NjCi0kKENMRUFOX01PRFVMRVMpICQoQ0xFQU5fWDExX01PRFVMRVMpIGNsZWFuLWdjYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NsZWFuLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2xlYW4pOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotLlBIT05ZOiAkKENMRUFOX1RBUkdFVF9NT0RVTEVTKQotJChDTEVBTl9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jbGVhbi10YXJnZXQtLy8nYDsgXAotCXJtIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBjbGVhbik7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi1jbGVhbi10YXJnZXQ6ICQoQ0xFQU5fVEFSR0VUX01PRFVMRVMpCi0KLSMgQ2hlY2sgdGFyZ2V0LgotCi0uUEhPTlk6IGNoZWNrCi1jaGVjazogJChDSEVDS19NT0RVTEVTKSBcCi0JJChDSEVDS19UQVJHRVRfTU9EVUxFUykgXAotCSQoQ0hFQ0tfWDExX01PRFVMRVMpIFwKLQljaGVjay1nY2MKLQotIyBBdXRvbWF0ZWQgcmVwb3J0aW5nIG9mIHRlc3QgcmVzdWx0cy4KLQotd2FybmluZy5sb2c6IGJ1aWxkLmxvZwotCSQoc3JjZGlyKS9jb250cmliL3dhcm5fc3VtbWFyeSBidWlsZC5sb2cgPiAkQAotCi1tYWlsLXJlcG9ydC5sb2c6Ci0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotbWFpbC1yZXBvcnQtd2l0aC13YXJuaW5ncy5sb2c6IHdhcm5pbmcubG9nCi0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCAtaSB3YXJuaW5nLmxvZyA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotIyBJbnN0YWxsYXRpb24gdGFyZ2V0cy4KLQotLlBIT05ZOiBpbnN0YWxsIGluc3RhbGwtY3Jvc3MgdW5pbnN0YWxsIHNvdXJjZS12YXVsdCBiaW5hcnktdmF1bHQgdmF1bHQtaW5zdGFsbAotaW5zdGFsbDogJChJTlNUQUxMX1RBUkdFVCkgCi1pbnN0YWxsLWNyb3NzOiAkKElOU1RBTExfVEFSR0VUX0NST1NTKSAKLQotdW5pbnN0YWxsOgotCUBlY2hvICJ0aGUgdW5pbnN0YWxsIHRhcmdldCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdHJlZSIKLQotc291cmNlLXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSBzb3VyY2UtdmF1bHQKLQotYmluYXJ5LXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSB0YXJnZXQ9JCh0YXJnZXRfYWxpYXMpCi0KLXZhdWx0LWluc3RhbGw6Ci0JQGlmIFsgLWYgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgXSA7IHRoZW4gXAotCSAgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgJChob3N0X2FsaWFzKSAkKHRhcmdldF9hbGlhcykgOyBcCi0JZWxzZSBcCi0JICB0cnVlIDsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC5hbGwKLWluc3RhbGwuYWxsOiBpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JCXI9YHB3ZGAgOyBleHBvcnQgciA7IFwKLQkJJChTRVRfTElCX1BBVEgpIFwKLQkJKGNkIC4vZ2NjOyBcCi0JCSQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsLWhlYWRlcnMpIDsgXAotCWVsc2UgXAotCQl0cnVlIDsgXAotCWZpCi0KLSMgaW5ldC1pbnN0YWxsIGlzIHVzZWQgYmVjYXVzZSB0aGUgSSpOZXQgd2FudHMgRGVqYUdOVSBpbnN0YWxsZWQgYnV0Ci0jIG5vdCBidWlsdC4gIFNpbWlsYXJseSwgZ3ppcCBpcyBidWlsdCBidXQgbm90IGluc3RhbGxlZC4KLWluZXQtaW5zdGFsbDoKLQkkKE1BS0UpIElOU1RBTExfTU9EVUxFUz0iYGVjaG8gJChJTlNUQUxMX01PRFVMRVMpIHwgc2VkIC1lICdzL2luc3RhbGwtZGVqYWdudS8vJyAtZSAncy9pbnN0YWxsLWd6aXAvLydgIiBpbnN0YWxsCi0KLSMgaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzIGlzIHVzZWQgYmVjYXVzZSBDeWdudXMgY2FuIG5vdCBkaXN0cmlidXRlCi0jIHRoZSBmaXhlZCBoZWFkZXIgZmlsZXMuCi0uUEhPTlk6IGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcwotaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzOiBcCi0JaW5zdGFsbGRpcnMgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JZ2NjLW5vLWZpeGVkaW5jbHVkZXMgCi0KLSMgSW5zdGFsbCB0aGUgZ2NjIGhlYWRlcnMgZmlsZXMsIGJ1dCBub3QgdGhlIGZpeGVkIGluY2x1ZGUgZmlsZXMsCi0jIHdoaWNoIEN5Z251cyBpcyBub3QgYWxsb3dlZCB0byBkaXN0cmlidXRlLiAgVGhpcyBydWxlIGlzIHZlcnkKLSMgZGVwZW5kZW50IG9uIHRoZSB3b3JraW5ncyBvZiB0aGUgZ2NjIE1ha2VmaWxlLmluLgotLlBIT05ZOiBnY2Mtbm8tZml4ZWRpbmNsdWRlcwotZ2NjLW5vLWZpeGVkaW5jbHVkZXM6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICBybSAtcmYgZ2NjL3RtcC1pbmNsdWRlOyBcCi0JICBtdiBnY2MvaW5jbHVkZSBnY2MvdG1wLWluY2x1ZGUgMj4vZGV2L251bGw7IFwKLQkgIG1rZGlyIGdjYy9pbmNsdWRlOyBcCi0JICBjcCAkKHNyY2RpcikvZ2NjL2dzeXNsaW1pdHMuaCBnY2MvaW5jbHVkZS9zeXNsaW1pdHMuaDsgXAotCSAgdG91Y2ggZ2NjL3N0bXAtZml4aW5jIGdjYy9pbmNsdWRlL2ZpeGVkOyBcCi0JICBybSAtZiBnY2Mvc3RtcC1oZWFkZXJzIGdjYy9zdG1wLWludC1oZHJzOyBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgIDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgLi9nY2M7IFwKLQkgICAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JICBybSAtcmYgZ2NjL2luY2x1ZGU7IFwKLQkgIG12IGdjYy90bXAtaW5jbHVkZSBnY2MvaW5jbHVkZSAyPi9kZXYvbnVsbDsgXAotCWVsc2UgdHJ1ZTsgZmkKLQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLiAgVG8KLSMgYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0jCi0jIGFsbC1ndWksIGFuZCBhbGwtbGlicHJvYyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZQotIyB0aGV5IGFyZSBzdGlsbCBleHBlcmltZW50YWwsIGFuZCBpZiB0aGV5IGZhaWwgdG8gYnVpbGQsIHRoYXQKLSMgc2hvdWxkbid0IHN0b3AgIm1ha2UgYWxsIi4KLS5QSE9OWTogJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYwotJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2FsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoZXNlIHJ1bGVzIGFyZSB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBjaGVjay1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgY2hlY2suICBTb21lCi0jIG1vZHVsZXMgYXJlIG9ubHkgdGVzdGVkIGluIGEgbmF0aXZlIHRvb2xjaGFpbi4KLQotLlBIT05ZOiAkKENIRUNLX01PRFVMRVMpICQoTkFUSVZFX0NIRUNLX01PRFVMRVMpICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykKLSQoTkFUSVZFX0NIRUNLX01PRFVMRVMpOgotCUBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotCSAgZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQkgIGlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCSAgZWxzZSBcCi0JICAgIHRydWU7IFwKLQkgIGZpOyBcCi0JZmkKLQotJChDUk9TU19DSEVDS19NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKElOU1RBTExfTU9EVUxFUykKLSQoSU5TVEFMTF9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBidWlsdCB3aXRoIHRoZQotIyB0YXJnZXQgdG9vbHMuCi0uUEhPTlk6ICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKQotJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgJChDQ19GT1JfVEFSR0VUKSAtLXByaW50LW11bHRpLWxpYiA+ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgMj4gL2Rldi9udWxsOyBcCi0JICBpZiBbIC1zICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgXTsgdGhlbiBcCi0JICAgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCBdOyB0aGVuIFwKLQkgICAgICBpZiBjbXAgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ID4gL2Rldi9udWxsOyB0aGVuIFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCSAgICAgIGVsc2UgXAotCQllY2hvICJNdWx0aWxpYnMgY2hhbmdlZCBmb3IgJCR7ZGlyfSwgcmVjb25maWd1cmluZyI7IFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGU7IFwKLQkJbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgICAgZmk7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWZpOyBleGl0IDAJIyBicmVhayBjb21tYW5kIGludG8gdHdvIHBpZWNlcwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAhIC1kICQoVEFSR0VUX1NVQkRJUikgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBlY2hvICIgJChUQVJHRVRfQ09ORklHRElSUykgIiB8IGdyZXAgIiAkJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlmIFsgLWQgJChzcmNkaXIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICAgIFsgLWQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9IF0gfHwgbWtkaXIgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9O1wKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICBBUj0iJChBUl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUjsgXAotCSAgICBBUz0iJChBU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUzsgXAotCSAgICBDQz0iJChDQ19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDQzsgXAotCSAgICBDRkxBR1M9IiQoQ0ZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENGTEFHUzsgXAotCSAgICBDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENYWDsgXAotCSAgICBDWFhGTEFHUz0iJChDWFhGTEFHU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDWFhGTEFHUzsgXAotCSAgICBETExUT09MPSIkKERMTFRPT0xfRk9SX1RBUkdFVCkiOyBleHBvcnQgRExMVE9PTDsgXAotCSAgICBMRD0iJChMRF9GT1JfVEFSR0VUKSI7IGV4cG9ydCBMRDsgXAotICAgICAgICAgICAgTERGTEFHUz0iJChMREZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IExERkxBR1M7IFwKLQkgICAgTk09IiQoTk1fRk9SX1RBUkdFVCkiOyBleHBvcnQgTk07IFwKLQkgICAgUkFOTElCPSIkKFJBTkxJQl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBSQU5MSUI7IFwKLQkgICAgV0lORFJFUz0iJChXSU5EUkVTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IFdJTkRSRVM7IFwKLQkgICAgZWNobyBDb25maWd1cmluZyBpbiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKLQkgICAgY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgIGNhc2UgJChzcmNkaXIpIGluIFwKLQkgICAgLyopIFwKLQkgICAgICB0b3BkaXI9JChzcmNkaXIpIDs7IFwKLQkgICAgKikgXAotCSAgICAgIGNhc2UgIiQoVEFSR0VUX1NVQkRJUikiIGluIFwKLQkgICAgICAuKSB0b3BkaXI9Ii4uLyQoc3JjZGlyKSIgOzsgXAotCSAgICAgICopIHRvcGRpcj0iLi4vLi4vJChzcmNkaXIpIiA7OyBcCi0JICAgICAgZXNhYyA7OyBcCi0JICAgIGVzYWM7IFwKLQkgICAgaWYgWyAiJChzcmNkaXIpIiA9ICIuIiBdIDsgdGhlbiBcCi0JICAgICAgaWYgWyAiJChUQVJHRVRfU1VCRElSKSIgIT0gIi4iIF0gOyB0aGVuIFwKLQkJaWYgJChTSEVMTCkgJCRzL3N5bWxpbmstdHJlZSAkJHt0b3BkaXJ9LyQke2Rpcn0gIm5vLXN1Y2gtZmlsZSIgOyB0aGVuIFwKLQkJICBpZiBbIC1mIE1ha2VmaWxlIF07IHRoZW4gXAotCQkgICAgaWYgJChNQUtFKSBkaXN0Y2xlYW47IHRoZW4gXAotCQkgICAgICB0cnVlOyBcCi0JCSAgICBlbHNlIFwKLQkJICAgICAgZXhpdCAxOyBcCi0JCSAgICBmaTsgXAotCQkgIGVsc2UgXAotCQkgICAgdHJ1ZTsgXAotCQkgIGZpOyBcCi0JCWVsc2UgXAotCQkgIGV4aXQgMTsgXAotCQlmaTsgXAotCSAgICAgIGVsc2UgXAotCQl0cnVlOyBcCi0JICAgICAgZmk7IFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPS4iOyBcCi0JICAgICAgbGlic3JjZGlyPSIuIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSQke3RvcGRpcn0vJCR7ZGlyfSI7IFwKLQkgICAgICBsaWJzcmNkaXI9IiQkcy8kJHtkaXJ9IjsgXAotCSAgICBmaTsgXAotCSAgICBpZiBbIC1mICQke2xpYnNyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHtsaWJzcmNkaXJ9L2NvbmZpZ3VyZSBcCi0JCSQoQ09ORklHX0FSR1VNRU5UUykgJCR7c3JjZGlyb3B0aW9ufSBcCi0JCS0td2l0aC10YXJnZXQtc3ViZGlyPSIkKFRBUkdFVF9TVUJESVIpIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHMvY29uZmlndXJlIFwKLQkJJChDT05GSUdfQVJHVU1FTlRTKSAkJHtzcmNkaXJvcHRpb259IFwKLQkJLS13aXRoLXRhcmdldC1zdWJkaXI9IiQoVEFSR0VUX1NVQkRJUikiOyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIFsgLWYgc2tpcC10aGlzLWRpciBdIDsgdGhlbiBcCi0JICAgICAgc2ggc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIHJtIC1mIHNraXAtdGhpcy1kaXI7IFwKLQkgICAgICBjZCAuLjsgcm1kaXIgJCR7ZGlyfSB8fCB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGVsc2UgXAotCSAgICB0cnVlOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChBTExfVEFSR0VUX01PRFVMRVMpCi0kKEFMTF9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9hbGwtdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07ICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKENIRUNLX1RBUkdFVF9NT0RVTEVTKQotJChDSEVDS19UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay10YXJnZXQtLy8nYDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTskKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTtcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZQotIyBUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYCi0jIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6ICQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykKLSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IGluc3RhbGxkaXJzCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9pbnN0YWxsLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0uUEhPTlk6ICQoQUxMX1gxMV9NT0RVTEVTKQotJChBTExfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvYWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyBcCi0JICAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgY2hlY2stWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChDSEVDS19YMTFfTU9EVUxFUykKLSQoQ0hFQ0tfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogJChJTlNUQUxMX1gxMV9NT0RVTEVTKQotJChJTlNUQUxMX1gxMV9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIGdjYyBpcyB0aGUgb25seSBtb2R1bGUgd2hpY2ggdXNlcyBHQ0NfRkxBR1NfVE9fUEFTUy4KLS5QSE9OWTogYWxsLWdjYwotYWxsLWdjYzoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgQnVpbGRpbmcgR0NDIHVzZXMgc29tZSB0b29scyBmb3IgcmVidWlsZGluZyAic291cmNlIiBmaWxlcwotIyBsaWtlIHRleGluZm8sIGJpc29uL2J5YWNjLCBldGMuICBTbyB3ZSBtdXN0IGRlcGVuZCBvbiB0aG9zZS4KLSMKLSMgV2hpbGUgYnVpbGRpbmcgR0NDLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJ1biB2YXJpb3VzIHRhcmdldAotIyBwcm9ncmFtcyBsaWtlIHRoZSBhc3NlbWJsZXIsIGxpbmtlciwgZXRjLiAgU28gd2UgZGVwZW5kIG9uCi0jIHRob3NlIHRvby4KLSMKLSMgSW4gdGhlb3J5LCBvbiBhbiBTTVAgYWxsIHRob3NlIGRlcGVuZGVuY2llcyBjYW4gYmUgcmVzb2x2ZWQKLSMgaW4gcGFyYWxsZWwuCi0jCi0uUEhPTlk6IGJvb3RzdHJhcCBib290c3RyYXAtbGVhbiBib290c3RyYXAyIGJvb3RzdHJhcDItbGVhbiBib290c3RyYXAzIGJvb3RzdHJhcDMtbGVhbiBib290c3RyYXA0IGJvb3RzdHJhcDQtbGVhbgotYm9vdHN0cmFwIGJvb3RzdHJhcC1sZWFuIGJvb3RzdHJhcDIgYm9vdHN0cmFwMi1sZWFuIGJvb3RzdHJhcDMgYm9vdHN0cmFwMy1sZWFuIGJvb3RzdHJhcDQgYm9vdHN0cmFwNC1sZWFuOiBhbGwtdGV4aW5mbyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIkJvb3RzdHJhcHBpbmcgdGhlIGNvbXBpbGVyIjsgXAotCWNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSAkQAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQljYXNlICIkQCIgaW4gXAotCSAgKmJvb3RzdHJhcDQtbGVhbiApIFwKLQkJCW1zZz0iQ29tcGFyaW5nIHN0YWdlMyBhbmQgc3RhZ2U0IG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlMy1sZWFuIDs7IFwKLQkgICpib290c3RyYXA0ICkgbXNnPSJDb21wYXJpbmcgc3RhZ2UzIGFuZCBzdGFnZTQgb2YgdGhlIGNvbXBpbGVyIjsgXAotCSAgCQljb21wYXJlPWNvbXBhcmUzIDs7IFwKLQkgICotbGVhbiApCW1zZz0iQ29tcGFyaW5nIHN0YWdlMiBhbmQgc3RhZ2UzIG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlLWxlYW4gOzsgXAotCSAgKiApCQltc2c9IkNvbXBhcmluZyBzdGFnZTIgYW5kIHN0YWdlMyBvZiB0aGUgY29tcGlsZXIiOyBcCi0JICAJCWNvbXBhcmU9Y29tcGFyZSA7OyBcCi0JZXNhYzsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiJCRtc2ciOyBcCi0JY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpICQkY29tcGFyZQotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYCA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICJCdWlsZGluZyBydW50aW1lIGxpYnJhcmllcyI7IFwKLQkkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSBhbGwKLQotLlBIT05ZOiBjcm9zcwotY3Jvc3M6IGFsbC10ZXhpbmZvIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgdGhlIEMgYW5kIEMrKyBjb21waWxlciI7IFwKLQljZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgTEFOR1VBR0VTPSJjIGMrKyIKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGAgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgcnVudGltZSBsaWJyYXJpZXMiOyBcCi0JJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYWxsIExBTkdVQUdFUz0iYyBjKysiCi0KLS5QSE9OWTogY2hlY2stZ2NjCi1jaGVjay1nY2M6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MKLWluc3RhbGwtZ2NjOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MtY3Jvc3MKLWluc3RhbGwtZ2NjLWNyb3NzOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBMQU5HVUFHRVM9ImMgYysrIiBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0jIEVYUEVSSU1FTlRBTCBTVFVGRgotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiBpbnN0YWxsLWRvc3JlbAotaW5zdGFsbC1kb3NyZWw6IGluc3RhbGxkaXJzIGluZm8KLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLWluc3RhbGwtZG9zcmVsLWZha2U6Ci0KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiBpbnRlci1kZXBlbmRlbmNpZXMgYW1vbmcgbW9kdWxlcy4KLWFsbC1hcGFjaGU6Ci1hbGwtYXNoOgotYWxsLWF1dG9jb25mOiBhbGwtbTQgYWxsLXRleGluZm8KLWFsbC1hdXRvbWFrZTogYWxsLW00IGFsbC10ZXhpbmZvCi1hbGwtYmFzaDoKLWFsbC1iZmQ6IGFsbC1saWJpYmVydHkgYWxsLWludGwKLWFsbC1iaW51dGlsczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1mbGV4IGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWludGwKLWFsbC1iaXNvbjogYWxsLXRleGluZm8KLWNvbmZpZ3VyZS10YXJnZXQtYnNwOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWJzcDogY29uZmlndXJlLXRhcmdldC1ic3AgYWxsLWdjYyBhbGwtYmludXRpbHMgYWxsLXRhcmdldC1uZXdsaWIKLWFsbC1ieWFjYzoKLWFsbC1iemlwMjoKLWFsbC1jdnNzcmM6Ci1jb25maWd1cmUtdGFyZ2V0LWN5Z21vbjogJChBTExfR0NDKQotYWxsLXRhcmdldC1jeWdtb246IGNvbmZpZ3VyZS10YXJnZXQtY3lnbW9uIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbyBhbGwtdGFyZ2V0LWxpYnN0dWIgYWxsLXRhcmdldC1ic3AKLWFsbC1kYjoKLWFsbC1kZWphZ251OiBhbGwtdGNsIGFsbC1leHBlY3QgYWxsLXRrCi1hbGwtZGlmZjogYWxsLWxpYmliZXJ0eQotYWxsLWVtYWNzOgotYWxsLWVtYWNzMTk6IGFsbC1iaXNvbiBhbGwtYnlhY2MKLWFsbC1ldGM6Ci1jb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWV4YW1wbGVzOiBjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzCi1hbGwtZXhwZWN0OiBhbGwtdGNsIGFsbC10awotYWxsLWZpbGV1dGlsczogYWxsLWxpYmliZXJ0eQotYWxsLWZpbmR1dGlsczoKLWFsbC1maW5kOgotYWxsLWZsZXg6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYwotYWxsLWdhczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1pbnRsCi1hbGwtZ2FzaDogYWxsLXRjbAotYWxsLWdhd2s6Ci1BTExfR0NDID0gYWxsLWdjYwotYWxsLWdjYzogYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLWFsbC1ib290c3RyYXA6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLUdEQl9USyA9IGFsbC10ayBhbGwtdGNsIGFsbC1pdGNsIGFsbC10aXggYWxsLWxpYmd1aQotYWxsLWdkYjogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1tbWFsbG9jIGFsbC1yZWFkbGluZSBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1zaW0gJChnZGJubG1yZXF1aXJlbWVudHMpICQoR0RCX1RLKQotYWxsLWdldHRleHQ6Ci1hbGwtZ251c2VydjoKLWNvbmZpZ3VyZS10YXJnZXQtZ3BlcmY6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtZ3BlcmY6IGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1saWJzdGRjKysKLWFsbC1ncHJvZjogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1pbnRsCi1hbGwtZ3JlejogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzCi1hbGwtZ3VpOiBhbGwtZ2RiIGFsbC1saWJwcm9jIGFsbC10YXJnZXQtbGlicngKLWFsbC1ndWlsZToKLWFsbC1nemlwOiBhbGwtbGliaWJlcnR5Ci1hbGwtaGVsbG86IGFsbC1saWJpYmVydHkKLWFsbC1pbmRlbnQ6Ci1hbGwtaW5ldDogYWxsLXRjbCBhbGwtc2VuZC1wciBhbGwtcGVybAotYWxsLWludGw6Ci1hbGwtaXNwZWxsOiBhbGwtZW1hY3MxOQotYWxsLWl0Y2w6IGFsbC10Y2wgYWxsLXRrIGFsbC10Y2w4LjEgYWxsLXRrOC4xCi1hbGwtbGQ6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1mbGV4IGFsbC1pbnRsCi1jb25maWd1cmUtdGFyZ2V0LWxpYmcrKzogJChBTExfR0NDKSBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1hbGwtdGFyZ2V0LWxpYmcrKzogY29uZmlndXJlLXRhcmdldC1saWJnKysgYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvIGFsbC10YXJnZXQtbGlicnggYWxsLXRhcmdldC1saWJzdGRjKysKLWNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3M6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliZ2xvc3M6IGNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3MgY29uZmlndXJlLXRhcmdldC1uZXdsaWIKLWNvbmZpZ3VyZS10YXJnZXQtbGliaW86ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaW86IGNvbmZpZ3VyZS10YXJnZXQtbGliaW8gYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYgotY2hlY2stdGFyZ2V0LWxpYmlvOiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKwotYWxsLWxpYmd1aTogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEgYWxsLWl0Y2wKLWFsbC1saWJpYmVydHk6Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnJ4OiAkKEFMTF9HQ0MpIGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliCi1hbGwtdGFyZ2V0LWxpYnJ4OiBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKzogJChBTExfR0NDKQotYWxsLXRhcmdldC1saWJzdGRjKys6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbwotY29uZmlndXJlLXRhcmdldC1saWJzdHViOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYnN0dWI6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3R1YgotYWxsLWxpYnRvb2w6Ci1hbGwtbTQ6IGFsbC1saWJpYmVydHkKLWFsbC1tYWtlOiBhbGwtbGliaWJlcnR5Ci1hbGwtbW1hbGxvYzoKLWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliOiAkKEFMTF9HQ0MpCi1jb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXA6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbmV3bGliOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYiBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtdGFyZ2V0LWxpYnRlcm1jYXA6IGNvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcCBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtb3Bjb2RlczogYWxsLWJmZCBhbGwtbGliaWJlcnR5Ci1hbGwtcGF0Y2g6IGFsbC1saWJpYmVydHkKLWFsbC1wZXJsOgotYWxsLXBybXM6IGFsbC1saWJpYmVydHkKLWFsbC1yY3M6Ci1hbGwtcmVhZGxpbmU6Ci1hbGwtcmVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VkOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VuZC1wcjogYWxsLXBybXMKLWFsbC1zaGVsbHV0aWxzOgotYWxsLXNpbTogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1yZWFkbGluZQotYWxsLXRhcjogYWxsLWxpYmliZXJ0eQotYWxsLXRjbDoKLWFsbC10Y2w4LjE6Ci1hbGwtdGNsWDogYWxsLXRjbCBhbGwtdGsKLWFsbC10azogYWxsLXRjbAotYWxsLXRrOC4xOiBhbGwtdGNsOC4xCi1hbGwtdGV4aW5mbzogYWxsLWxpYmliZXJ0eQotYWxsLXRleHR1dGlsczoKLWFsbC10Z2FzOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMKLWFsbC10aW1lOgotYWxsLXRpeDogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEKLWFsbC13ZGlmZjoKLWFsbC10YXJnZXQtd2luc3VwOiBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgY29uZmlndXJlLXRhcmdldC13aW5zdXAKLWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgotYWxsLXV1ZGVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtemlwOgotY29uZmlndXJlLXRhcmdldC1saWJpYmVydHk6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaWJlcnR5OiBjb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtZ2NjIGFsbC1sZCBhbGwtdGFyZ2V0LW5ld2xpYgotYWxsLXRhcmdldDogJChBTExfVEFSR0VUX01PRFVMRVMpCi1pbnN0YWxsLXRhcmdldDogJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKQotIyMjIG90aGVyIHN1cHBvcnRpbmcgdGFyZ2V0cwotCi1NQUtFRElSUz0gXAotCSQocHJlZml4KSBcCi0JJChleGVjX3ByZWZpeCkKLS5QSE9OWTogaW5zdGFsbGRpcnMKLWluc3RhbGxkaXJzOiBta2luc3RhbGxkaXJzCi0JJChTSEVMTCkgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChNQUtFRElSUykKLQotZGlyLmluZm86IGRvLWluc3RhbGwtaW5mbwotCWlmIFsgLWYgJChzcmNkaXIpL3RleGluZm8vZ2VuLWluZm8tZGlyIF0gOyB0aGVuIFwKLQkgICQoc3JjZGlyKS90ZXhpbmZvL2dlbi1pbmZvLWRpciAkKGluZm9kaXIpICQoc3JjZGlyKS90ZXhpbmZvL2Rpci5pbmZvLXRlbXBsYXRlID4gZGlyLmluZm8ubmV3IDsgXAotCSAgbXYgLWYgZGlyLmluZm8ubmV3IGRpci5pbmZvIDsgXAotCWVsc2UgdHJ1ZSA7IFwKLQlmaQotCi1kaXN0OgotCUBlY2hvICJCdWlsZGluZyBhIGZ1bGwgZGlzdHJpYnV0aW9uIG9mIHRoaXMgdHJlZSBpc24ndCBkb25lIgotCUBlY2hvICJ2aWEgJ21ha2UgZGlzdCcuICBDaGVjayBvdXQgdGhlIGV0Yy8gc3ViZGlyZWN0b3J5IiAKLQotZXRhZ3MgdGFnczogVEFHUwotCi0jIFJpZ2h0IG5vdyB0aGlzIGp1c3QgYnVpbGRzIFRBR1MgaW4gZWFjaCBzdWJkaXJlY3RvcnkuICBlbWFjczE5IGhhcyB0aGUKLSMgYWJpbGl0eSB0byB1c2Ugc2V2ZXJhbCB0YWdzIGZpbGVzIGF0IG9uY2UsIHNvIHRoZXJlIGlzIHByb2JhYmx5IG5vIG5lZWQKLSMgdG8gY29tYmluZSB0aGVtIGludG8gb25lIGJpZyBUQUdTIGZpbGUgKGxpa2UgQ1ZTIDEuMyBkb2VzKS4gIFdlIGNvdWxkCi0jIChpZiB3ZSBmZWx0IGxpa2UgaXQpIGhhdmUgdGhpcyBNYWtlZmlsZSB3cml0ZSBhIHBpZWNlIG9mIGVsaXNwIHdoaWNoCi0jIHRoZSB1c2VyIGNvdWxkIGxvYWQgdG8gdGVsbCBlbWFjczE5IHdoZXJlIGFsbCB0aGUgVEFHUyBmaWxlcyB3ZSBqdXN0Ci0jIGJ1aWx0IGFyZS4KLVRBR1M6IGRvLVRBR1MKLQotIyB3aXRoIHRoZSBnbnUgbWFrZSwgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWd1cmUuaW4gJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpICQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIwotIyBTdXBwb3J0IGZvciBidWlsZGluZyBuZXQgcmVsZWFzZXMKLQotIyBGaWxlcyBpbiBkZXZvIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1ERVZPX1NVUFBPUlQ9IFJFQURNRSBNYWtlZmlsZS5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKLQljb25maWcuZ3Vlc3MgY29uZmlnLmlmIGNvbmZpZy5zdWIgY29uZmlnIG1vdmUtaWYtY2hhbmdlIFwKLQltcHctUkVBRE1FIG1wdy1idWlsZC5pbiBtcHctY29uZmlnLmluIG1wdy1jb25maWd1cmUgbXB3LWluc3RhbGwgXAotCUNPUFlJTkcgQ09QWUlORy5MSUIgaW5zdGFsbC1zaCBjb25maWctbWwuaW4gc3ltbGluay10cmVlIFwKLQlta2luc3RhbGxkaXJzIGx0Y29uZmlnIGx0bWFpbi5zaCBtaXNzaW5nIHlsd3JhcAotCi0jIEZpbGVzIGluIGRldm8vZXRjIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1FVENfU1VQUE9SVD0gTWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBzdGFuZGFyZHMudGV4aSBcCi0JbWFrZS1zdGRzLnRleGkgc3RhbmRhcmRzLmluZm8qCi0KLSMgV2hlbiB5b3UgdXNlIGBtYWtlIHNldHVwLWRpcnMnIG9yIGBtYWtlIHRheicgeW91IHNob3VsZCBhbHdheXMgcmVkZWZpbmUKLSMgdGhpcyBtYWNyby4KLVNVUFBPUlRfRklMRVMgPSBsaXN0LW9mLXN1cHBvcnQtZmlsZXMtZm9yLXRvb2wtaW4tcXVlc3Rpb24KLQotLlBIT05ZOiB0YXoKLQotdGF6OiAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSB0ZXhpbmZvL3RleGluZm8udGV4Ci0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gYSBmZXcgcGxhY2VzLgotCXNlZCAtZSAnL15hbGxcLm5vcm1hbDogL3MvXGFsbC10ZXhpbmZvIC8vJyBcCi0JICAgIC1lICcvXglpbnN0YWxsLXRleGluZm8gL2QnIFwKLQk8TWFrZWZpbGUuaW4gPnRtcAotCW12IC1mIHRtcCBNYWtlZmlsZS5pbgotCSMKLQkuL2NvbmZpZ3VyZSBzdW40Ci0JWyAteiAiJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIiBdIFwKLQkgIHx8ICQoTUFLRSkgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIEFMTF9HQ0M9IiIgXAotCSAgICBDQ19GT1JfVEFSR0VUPSIkKENDKSIgQ1hYX0ZPUl9UQVJHRVQ9IiQoQ1hYKSIKLQkjIE1ha2UgbGlua3MsIGFuZCBydW4gIm1ha2UgZGlzdHN0dWZmIiBvciAibWFrZSBpbmZvIiB3aGVuIG5lZWRlZC4KLQlybSAtcmYgcHJvdG8tdG9wbGV2IDsgbWtkaXIgcHJvdG8tdG9wbGV2Ci0Jc2V0IC1lIDsgZGlycz0iJChUT09MKSAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSIgOyBcCi0JZm9yIGQgaW4gJCRkaXJzIDsgZG8gXAotCSAgaWYgWyAtZCAkJGQgXTsgdGhlbiBcCi0JICAgIGlmIFsgISAtZiAkJGQvTWFrZWZpbGUgXSA7IHRoZW4gdHJ1ZSA7IFwKLQkgICAgZWxpZiBncmVwICdeZGlzdHN0dWZmOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkJKGNkICQkZCA7ICQoTUFLRSkgZGlzdHN0dWZmICkgfHwgZXhpdCAxIDsgXAotCSAgICBlbGlmIGdyZXAgJ15pbmZvOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkgICAgICAgIChjZCAkJGQgOyAkKE1BS0UpIGluZm8gKSB8fCBleGl0IDEgOyBcCi0JICAgIGZpIDsgXAotCSAgICBpZiBbIC1kICQkZC9wcm90by0kJGQuZGlyIF07IHRoZW4gXAotCSAgICAgIGxuIC1zIC4uLyQkZC9wcm90by0kJGQuZGlyIHByb3RvLXRvcGxldi8kJGQgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGxuIC1zIC4uLyQkZCBwcm90by10b3BsZXYvJCRkIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgbG4gLXMgLi4vJCRkIHByb3RvLXRvcGxldi8kJGQgOyBmaSA7IFwKLQlkb25lCi0JY2QgZXRjIDsgJChNQUtFKSBpbmZvCi0JJChNQUtFKSBkaXN0Y2xlYW4KLQkjCi0JbWtkaXIgcHJvdG8tdG9wbGV2L2V0YwotCShjZCBwcm90by10b3BsZXYvZXRjOyBcCi0JIGZvciBpIGluICQoRVRDX1NVUFBPUlQpOyBkbyBcCi0JCWxuIC1zIC4uLy4uL2V0Yy8kJGkgLiA7IFwKLQkgZG9uZSkKLQkjCi0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gY29uZmlndXJhYmxlIGRpcnMKLQlybSBwcm90by10b3BsZXYvY29uZmlndXJlLmluCi0Jc2VkIC1lICcvXmhvc3RfdG9vbHM9L3MvdGV4aW5mbyAvLycgXAotCSAgICA8Y29uZmlndXJlLmluID5wcm90by10b3BsZXYvY29uZmlndXJlLmluCi0JIwotCW1rZGlyIHByb3RvLXRvcGxldi90ZXhpbmZvCi0JbG4gLXMgLi4vLi4vdGV4aW5mby90ZXhpbmZvLnRleAkJcHJvdG8tdG9wbGV2L3RleGluZm8vCi0JaWYgdGVzdCAtciB0ZXhpbmZvL3V0aWwvdGV4M3BhdGNoIDsgdGhlbiBcCi0JICBta2RpciBwcm90by10b3BsZXYvdGV4aW5mby91dGlsICYmIFwKLQkgIGxuIC1zIC4uLy4uLy4uL3RleGluZm8vdXRpbC90ZXgzcGF0Y2gJcHJvdG8tdG9wbGV2L3RleGluZm8vdXRpbCA7IFwKLQllbHNlIHRydWU7IGZpCi0JY2htb2QgLVIgb2c9dSAuIHx8IGNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgCi0JaWYgZ3JlcCBBTV9JTklUX0FVVE9NQUtFICQoVE9PTCkvY29uZmlndXJlLmluID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICB2ZXI9YHNlZCA8ICQoVE9PTCkvY29uZmlndXJlLmluIC1uICdzL0FNX0lOSVRfQVVUT01BS0VbXixdKiwgKlwoW14pXSpcKSkvXDEvcCdgOyBcCi0JZWxzZSBcCi0JICB2ZXI9YHNlZCA8JChUT09MKS9NYWtlZmlsZS5pbiAtbiAncy9eVkVSU0lPTiAqPSAqLy9wJ2A7IFwKLQlmaTsgXAotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gZG8tdGFyLWJ6MiBUT09MPSQoVE9PTCkgVkVSPSQkdmVyCi0KLWRvLXRhci1iejI6Ci0JZWNobyAiPT0+IE1ha2luZyAkKFRPT0wpLSQoVkVSKS50YXIuYnoyIgotCS1ybSAtZiAkKFRPT0wpLSQoVkVSKQotCWxuIC1zIHByb3RvLXRvcGxldiAkKFRPT0wpLSQoVkVSKQotCXRhciBjZmggJChUT09MKS0kKFZFUikudGFyICQoVE9PTCktJChWRVIpCi0JJChCWklQUFJPRykgLXYgLTkgJChUT09MKS0kKFZFUikudGFyCi0KLVRFWElORk9fU1VQUE9SVD0gdGV4aW5mby90ZXhpbmZvLnRleAotRElTVF9TVVBQT1JUPSAkKERFVk9fU1VQUE9SVCkgJChURVhJTkZPX1NVUFBPUlQpCi0KLS5QSE9OWTogZ2FzLnRhci5iejIKLUdBU19TVVBQT1JUX0RJUlM9IGJmZCBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcwotZ2FzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdBU19TVVBQT1JUX0RJUlMpIGdhcwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2FzIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHQVNfU1VQUE9SVF9ESVJTKSIKLQotIyBUaGUgRlNGICJiaW51dGlscyIgcmVsZWFzZSBpbmNsdWRlcyBncHJvZiBhbmQgbGQuCi0uUEhPTlk6IGJpbnV0aWxzLnRhci5iejIKLUJJTlVUSUxTX1NVUFBPUlRfRElSUz0gYmZkIGdhcyBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGxkIGdwcm9mIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcwotYmludXRpbHMudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoQklOVVRJTFNfU1VQUE9SVF9ESVJTKSBiaW51dGlscwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9YmludXRpbHMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEJJTlVUSUxTX1NVUFBPUlRfRElSUykgbWFrZWFsbC5iYXQgY29uZmlndXJlLmJhdCIKLQotLlBIT05ZOiBnYXMrYmludXRpbHMudGFyLmJ6MgotR0FTQl9TVVBQT1JUX0RJUlM9ICQoR0FTX1NVUFBPUlRfRElSUykgYmludXRpbHMgbGQgZ3Byb2YKLWdhcytiaW51dGlscy50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHQVNCX1NVUFBPUlRfRElSUykgZ2FzCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1nYXMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdBU0JfU1VQUE9SVF9ESVJTKSBtYWtlYWxsLmJhdCBjb25maWd1cmUuYmF0IgotCi0uUEhPTlk6IGxpYmcrKy50YXIuYnoyCi1MSUJHWFhfU1VQUE9SVF9ESVJTPWluY2x1ZGUgbGlic3RkYysrIGxpYmlvIGxpYnJ4IGxpYmliZXJ0eQotbGliZysrLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSBsaWJnKysKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWxpYmcrKyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoTElCR1hYX1NVUFBPUlRfRElSUykiCi0KLUdOQVRTX1NVUFBPUlRfRElSUz1pbmNsdWRlIGxpYmliZXJ0eSBzZW5kLXByCi1nbmF0cy50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHTkFUU19TVVBQT1JUX0RJUlMpIGduYXRzCi0JJChNQUtFKSAtZiAgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z25hdHMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdOQVRTX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZ2RiLnRhci5iejIKLUdEQl9TVVBQT1JUX0RJUlM9IGJmZCBpbmNsdWRlIGxpYmliZXJ0eSBtbWFsbG9jIG9wY29kZXMgcmVhZGxpbmUgc2ltIHV0aWxzIGludGwKLWdkYi50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHREJfU1VQUE9SVF9ESVJTKSBnZGIKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdkYiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0RCX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogbmV3bGliLnRhci5iejIKLU5FV0xJQl9TVVBQT1JUX0RJUlM9bGliZ2xvc3MKLSMgdGF6IGNvbmZpZ3VyZXMgZm9yIHRoZSBzdW40IHRhcmdldCB3aGljaCB3b24ndCBjb25maWd1cmUgbmV3bGliLgotIyBXZSBuZWVkIG5ld2xpYiBjb25maWd1cmVkIHNvIHRoYXQgdGhlIC5pbmZvIGZpbGVzIGFyZSBtYWRlLgotIyBVbmZvcnR1bmF0ZWx5LCBpdCBpcyBub3QgZW5vdWdoIHRvIGp1c3QgY29uZmlndXJlIG5ld2xpYiBzZXBhcmF0ZWx5OgotIyB0YXogd2lsbCBidWlsZCB0aGUgLmluZm8gZmlsZXMgYnV0IHNpbmNlIFNVQkRJUlMgd29uJ3QgY29udGFpbiBuZXdsaWIsCi0jIGRpc3RjbGVhbiB3b24ndCBiZSBydW4gKGxlYXZpbmcgTWFrZWZpbGUsIGNvbmZpZy5zdGF0dXMsIGFuZCB0aGUgdG1wIGZpbGVzCi0jIHVzZWQgaW4gYnVpbGRpbmcgdGhlIC5pbmZvIGZpbGVzLCBlZzogKi5kZWYsICoucmVmKS4KLSMgVGhlIHByb2JsZW0gaXNuJ3Qgc29sdmFibGUgaG93ZXZlciB3aXRob3V0IGEgbG90IG9mIGV4dHJhIHdvcmsgYmVjYXVzZQotIyB0YXJnZXQgbGlicmFyaWVzIGFyZSBidWlsdCBpbiBzdWJkaXIgJCh0YXJnZXRfYWxpYXMpIHdoaWNoIGdldHMgbnVrZWQgZHVyaW5nCi0jIHRoZSBtYWtlIGRpc3RjbGVhbi4gIEZvciBub3cgcHVudCBvbiB0aGUgaXNzdWUgb2Ygc2hpcHBpbmcgbmV3bGliIGluZm8gZmlsZXMKLSMgd2l0aCBuZXdsaWIgbmV0IHJlbGVhc2VzIGFuZCB3YWl0IGZvciBhIGRheSB3aGVuIHNvbWUgbmF0aXZlIHRhcmdldCAoc3VuND8pCi0jIHN1cHBvcnRzIG5ld2xpYiAoaWYgb25seSBtaW5pbWFsbHkpLgotbmV3bGliLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKE5FV0xJQl9TVVBQT1JUX0RJUlMpIG5ld2xpYgotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9bmV3bGliIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChORVdMSUJfU1VQUE9SVF9ESVJTKSIgXAotCQlERVZPX1NVUFBPUlQ9IiQoREVWT19TVVBQT1JUKSBDT1BZSU5HLk5FV0xJQiIgbmV3bGliCi0KLS5OT0VYUE9SVDoKLU1BS0VPVkVSUklERVM9Ci0KLSMgZW5kIG9mIE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGU0MzYuLjAwMDAwMDAKLS0tIGEvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotCQkgICBSRUFETUUgZm9yIEdOVSBkZXZlbG9wbWVudCB0b29scwotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB2YXJpb3VzIEdOVSBjb21waWxlcnMsIGFzc2VtYmxlcnMsIGxpbmtlcnMsIAotZGVidWdnZXJzLCBldGMuLCBwbHVzIHRoZWlyIHN1cHBvcnQgcm91dGluZXMsIGRlZmluaXRpb25zLCBhbmQgZG9jdW1lbnRhdGlvbi4KLQotSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBhcyBwYXJ0IG9mIGEgR0RCIHJlbGVhc2UsIHNlZSB0aGUgZmlsZSBnZGIvUkVBRE1FLgotSWYgd2l0aCBhIGJpbnV0aWxzIHJlbGVhc2UsIHNlZSBiaW51dGlscy9SRUFETUU7ICBpZiB3aXRoIGEgbGliZysrIHJlbGVhc2UsCi1zZWUgbGliZysrL1JFQURNRSwgZXRjLiAgVGhhdCdsbCBnaXZlIHlvdSBpbmZvIGFib3V0IHRoaXMKLXBhY2thZ2UgLS0gc3VwcG9ydGVkIHRhcmdldHMsIGhvdyB0byB1c2UgaXQsIGhvdyB0byByZXBvcnQgYnVncywgZXRjLgotCi1JdCBpcyBub3cgcG9zc2libGUgdG8gYXV0b21hdGljYWxseSBjb25maWd1cmUgYW5kIGJ1aWxkIGEgdmFyaWV0eSBvZgotdG9vbHMgd2l0aCBvbmUgY29tbWFuZC4gIFRvIGJ1aWxkIGFsbCBvZiB0aGUgdG9vbHMgY29udGFpbmVkIGhlcmVpbiwKLXJ1biB0aGUgYGBjb25maWd1cmUnJyBzY3JpcHQgaGVyZSwgZS5nLjoKLQotCS4vY29uZmlndXJlIAotCW1ha2UKLQotVG8gaW5zdGFsbCB0aGVtIChieSBkZWZhdWx0IGluIC91c3IvbG9jYWwvYmluLCAvdXNyL2xvY2FsL2xpYiwgZXRjKSwKLXRoZW4gZG86Ci0JbWFrZSBpbnN0YWxsCi0KLShJZiB0aGUgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBkZXRlcm1pbmUgeW91ciB0eXBlIG9mIGNvbXB1dGVyLCBnaXZlIGl0Ci10aGUgbmFtZSBhcyBhbiBhcmd1bWVudCwgZm9yIGluc3RhbmNlIGBgLi9jb25maWd1cmUgc3VuNCcnLiAgWW91IGNhbgotdXNlIHRoZSBzY3JpcHQgYGBjb25maWcuc3ViJycgdG8gdGVzdCB3aGV0aGVyIGEgbmFtZSBpcyByZWNvZ25pemVkOyBpZgotaXQgaXMsIGNvbmZpZy5zdWIgdHJhbnNsYXRlcyBpdCB0byBhIHRyaXBsZXQgc3BlY2lmeWluZyBDUFUsIHZlbmRvciwKLWFuZCBPUy4pCi0KLUlmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgY29tcGlsZXIgb24geW91ciBzeXN0ZW0sIGl0IGlzIG9mdGVuIGJlc3QgdG8KLWV4cGxpY2l0bHkgc2V0IENDIGluIHRoZSBlbnZpcm9ubWVudCBiZWZvcmUgcnVubmluZyBjb25maWd1cmUsIGFuZCB0bwotYWxzbyBzZXQgQ0Mgd2hlbiBydW5uaW5nIG1ha2UuICBGb3IgZXhhbXBsZSAoYXNzdW1pbmcgc2gvYmFzaC9rc2gpOgotCi0JQ0M9Z2NjIC4vY29uZmlndXJlCi0JbWFrZQotCi1BIHNpbWlsYXIgZXhhbXBsZSB1c2luZyBjc2g6Ci0KLQlzZXRlbnYgQ0MgZ2NjCi0JLi9jb25maWd1cmUKLQltYWtlCi0KLU11Y2ggb2YgdGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZW5jbG9zZWQgaXMgY29weXJpZ2h0IGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBvcgotQ09QWUlORy5MSUIgaW4gdGhlIHZhcmlvdXMgZGlyZWN0b3JpZXMsIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGVybXMgdW5kZXIgd2hpY2ggeW91IGNhbiBjb3B5IHRoZSBmaWxlcy4KLQotUkVQT1JUSU5HIEJVR1M6IEFnYWluLCBzZWUgZ2RiL1JFQURNRSwgYmludXRpbHMvUkVBRE1FLCBldGMuLCBmb3IgaW5mbwotb24gd2hlcmUgYW5kIGhvdyB0byByZXBvcnQgcHJvYmxlbXMuCmRpZmYgLS1naXQgYS9iZmQvQ09QWUlORyBiL2JmZC9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU0OWJlLi4wMDAwMDAwCi0tLSBhL2JmZC9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZyBiL2JmZC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYWJmMjYuLjAwMDAwMDAKLS0tIGEvYmZkL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDM5MTQgKzAsMCBAQAotMTk5OS0wNy0wNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogQXNzZXJ0IHRoYXQgc2VjdGlvbiByZWxvY19jb3VudAotCWZpZWxkIGVxdWFscyB0aGUgbmV3IHJlbF9jb3VudCBmaWVsZC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB1c2UgdGhlIG5ldwotCXJlbF9jb3VudCBmaWVsZCByYXRoZXIgdGhhbiB0aGUgcmVsb2NfY291bnQgZmllbGQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBQZXJtaXQgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEKLQlzaGFyZWQgbGlicmFyeSB0byBvdmVycmlkZSBhIHdlYWsgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotCi1UdWUgSnVsICA2IDEwOjIzOjM5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGxpYmhwcGEuaDogUmV2ZXJ0IEp1bHkgMiwgMTk5OSBwYXRjaC4KLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IFQgbW9kZSBzZWxlY3RvcnMKLQluZWVkIHRvIGdlbmVyYXRlIERMVElORCByZWxvY2F0aW9ucywgbm90IERMVFJFTCByZWxvY2F0aW9ucy4KLQotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZWNvZ25pc2UgYXJtIDUKLQlhcmNoaXRlY3R1cmVzLiAKLQkoY29mZl9zZXRfZmxhZ3MpOiBSZWNvZ25pc2UgYXJtIDUgYXJjaGl0ZWN0dXJlcy4KLQotCSogY3B1LWFybS5jOiBBZGQgc3VwcG9ydCBmb3Igc3Ryb25nYXJtIGFuZCBhcm05IGNwdXMuCi0JQWRkIHN1cHBvcnQgZm9yIGFybXY1IGFyY2hpdGVjdHVyZS4KLQotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9tYWNoX2FybV81IGFuZCBiZmRfbWFjaF9hcm1fNVQuCi0JCi0JKiByZWxvYy5jOiBBZGQgbmV3LCBhc3NlbWJsZXIgb25seSwgQVJNIHJlbG9jOgotCUJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEUuCi0JCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDctMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGR3YXJmMi5jIChwYXJzZV9jb21wX3VuaXQpOiBBZGQgQUJCUkVWX0xFTkdUSCBwYXJhbWV0ZXIuCi0JKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkIEFERFJfU0laRSBwYXJhbWV0ZXIuCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBQYXNzIGl0LgotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChBQklfNjRfUCk6IE5ldyBtYWNyby4KLQkoSVJJWF9DT01QQVQpOiBXZSBhcmUgSVJJWDYtY29tcGF0aWJsZSBpZiBBQklfNjRfUC4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEFkanVzdCBjYWxsIHRvCi0JX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBVcGRhdGUgcHJvdG90eXBlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA3LTAyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkICogYXQgdGhlIGVuZCBvZiBpWzM0NTZdODYtKi11bml4d2FyZS4KLQotRnJpIEp1bCAgMiAxMjoyMToxMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoSFBQQV9SX0FSR19SRUxPQyk6IERlbGV0ZS4KLQkoSFBQQV9SX0NPTlNUQU5ULCBIUFBBX1JfQURERU5EKTogTGlrZXdpc2UuCi0KLTE5OTktMDctMDEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgcmVsX2NvdW50IGFuZCByZWxfY291bnQyCi0JZmllbGRzLgotCShfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYuYyAoX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayk6IFVzZSBiZmRfemFsbG9jLCByYXRoZXIgdGhhbgotCWJmZF9hbGxvYyBmb2xsb3dlZCBieSBtZW1zZXQuCi0JKF9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkcik6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogSGVyZS4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEFzc2lnbiBzZWN0aW9uIG51bWJlcnMgZm9yIHRoZSBzZWNvbmQKLQlyZWxvY2F0aW9uIHNlY3Rpb24sIGlmIHJlcXVpcmVkLgotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogVXNlIGVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbi4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIGVsZl9saW5rX291dHB1dF9yZWxvY3MuCi0JCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFVzZQotCV9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciB0byBpbml0aWFsaXplIHJlbF9oZHIyLgotCi1UaHUgSnVsICAxIDEzOjU4OjQ4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSBSX1BDUkVMX0NBTEwKLQl3aXRoIDIyYml0IGZvcm1hdC4KLQotMTk5OS0wNi0yOCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9nb3RfaW5mbyk6IE1vdmUgZGVjbGFyYXRpb24gYmVmb3JlCi0JcHJvdG90eXBlcy4gIENoYW5nZSBnbG9iYWxfZ290c3ltIHRvIGJlIGEgcG9pbnRlciB0byBhIGhhc2ggZW50cnksCi0JcmF0aGVyIHRoYW4gYSBudW1iZXIgaW5kZXguCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgZGVjbGFyYXRpb24gYmVmb3JlIHByb3RvdHlwZXMuCi0JKG1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfc2lnbl9leHRlbmQpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfaGlnaCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9oaWdoZXIpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfaGlnaGVzdCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2xvY2FsX2dvdF9pbmRleCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXgpOiBMaWtlaXdzZS4KLQkobWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9wYWdlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9hc3NpZ25fZ3ApOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2YpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc29ydF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9pbmZvKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290MTZfZW50cnkpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBkZXNjcmlwdGlvbiBvZiBSX01JUFNfU0NOX0RJU1AuCi0JKG1pcHNfZWxmX2ZpbmFsX2dwKTogVXNlIG1pcHNfZWxmX2Fzc2lnbl9ncC4KLQkoX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IERvbid0IG1vdmUgU0hOX0NPTU1PTiBzeW1ib2xzCi0JaW50byBTSE5fU0NPTU1PTiBhdXRvbWF0aWNhbGx5IG9uIElSSVg2LgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUsIHVzaW5nCi0JbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gYW5kIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbik6IFVzZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRS4KLQlEb24ndCBkZWFsIHdpdGggLnJsZF9tYXAgb24gSVJJWDYuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFkanVzdCB1c2Ugb2YgZ2xvYmFsX2dvdHN5bS4gIFNldAotCXNlY3Rpb24gZmxhZ3MgYXBwcm9wcmlhdGVseSBmb3IgLmdvdC4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogSGFuZGxlIElSSVg2IHJlbG9jYXRpb25zIG1ha2luZyB1c2Ugb2YKLQl0aGUgZ290LiAgQ2FsbCBtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgYW5kIGFsbG9jYXRlCi0JbG9jYWwgZ290IHNwYWNlIGFwcHJvcHJpYXRlbHkuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBiZmRfYnl0ZSAqLCBub3QgdW5zaWduZWQKLQljaGFyICouICBSZXdvcmsgY2FsY3VsYXRpb24gb2YgR09UIHNpemUuICBTb3J0IGR5bmFtaWMgc3ltYm9sCi0JdGFibGUgZW50cmllcyBzbyBlbnRyaWVzIHRoYXQgZG8gbm90IHJlcXVpcmUgR09UIGVudHJpZXMgYXBwZWFyIGF0Ci0JdGhlIGJlZ2lubmluZy4gIERvbid0IHVzZSBEVF9NSVBTX0hJUEFHRU5PIG9uIElSSVg2LiAgUmVtb3ZlIGRlYWQKLQljb2RlIGRlYWxpbmcgd2l0aCBEVF9JTklUIGFuZCBEVF9GSU5JLiAgUmVtb3ZlIGZpZGRsaW5nIHdpdGgKLQlnbG9iYWxfZ290c3ltLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBZGp1c3QgY3JlYXRpb24gb2YgZ2xvYmFsIEdPVAotCWVudHJpZXMuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZQotCW1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IG9mZi1ieS1vbmUgZXJyb3IKLQlzZXR0aW5nIERUX01JUFNfVU5SRUZFWFROTy4gIEFkanVzdCBzZXR0aW5nIG9mIERUX01JUFNfR09UU1lNIGZvcgotCWNoYW5nZSB0byBnbG9iYWxfZ290c3ltLiAgU2V0IERUX01JUFNfT1BUSU9OUyBvbiBJUklYNi4KLQkJCi0xOTk5LTA2LTMwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IENQSUMgd2hlbiBkb2luZyBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuICBGcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkB1bmkta29ibGVuei5kZT4uCi0KLTE5OTktMDYtMDQgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSk6IExpa2V3aXNlLgotCi0xOTk5LTA2LTI4ICBKaW0gUGljayAgPGppbUBqaW1waWNrLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogTWluZCBub191bmRlZmluZWQKLQotVHVlIEp1biAyOSAwMjoyNTowMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogVXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBhcwotCXJlbG9jYXRpb24gZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogS2lsbCB1bnVzZWQvdW53YW50ZWQgZnVuY3Rpb24uCi0KLTE5OTktMDYtMjcgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRSk6IE5ldyBtYWNyby4KLQkoTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSB0aGVtLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4gIEFkZCAuc3JkYXRhIHRvIHRoZSBsaXN0Ci0Jb2YgR1AtcmVsYXRpdmUgc2VjdGlvbnMuCi0JKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBVc2UgdGhlbS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBTaGFyZSBjb2RlIGJldHdlZW4gLnNkYXRhIGFuZAotCS5saXQ0Ly5saXQ4IHNlY3Rpb25zLiAgU2V0IGFwcHJvcHJpYXRlIGZsYWdzIGZvciAuc3JkYXRhLgotCShtaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IEFkZCBoYW5kbGluZyBmb3IKLQlQVF9NSVBTX09QVElPTlMgc2VnbWVudCBvbiBJUklYNi4KLQkobWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwKTogTGlrZWl3c2UuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBTZXQgRUZfTUlQU19DUElDIHdoZW4gcmVxdWlyZWQgYnkgdGhlIEFCSS4KLQlJbmNsdWRlIHRoZSBvcHRpb25zIHNlY3Rpb25zIG9uIElSSVg2LiAgRG9uJ3QgbG9vayBmb3IgR1AtcmVsYXRpdmUKLQlzZWN0aW9ucyBieSBuYW1lOyB1c2UgU0hGX01JUFNfR1BSRUwgaW5zdGVhZC4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBBZGp1c3QgdG8gdXNlIC91c3IvbGliMzIvbGliYy5zby4xIGZvcgotCXRoZSBOMzIgQUJJLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IG11Y2sgYWJvdXQgd2l0aCBzZWN0aW9uCi0JYWxpZ25tZW50cyBhbmQgc3VjaCBvbiBJUklYNi4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogVXNlIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4gQWRqdXN0IHRvIGhhbmRsZSB0aGUKLQlmYWN0IHRoYXQgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgaXMgbm8gbG9uZ2VyIGEgY29uc3RhbnQuICBVc2UKLQliZmRfemFsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvYyBhbmQgbWVtc2V0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JRG9uJ3QgYXNzZXJ0IHRoZSBleGlzdGVuY2Ugb2YgLnJsZF9tYXAgb24gSVJJWDYuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogVXNlIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FLgotCQkKLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRqdXN0X2R5bmluZHgpOiBSZW1vdmUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4Ci0JaW5zdGVhZC4KLQotMTk5OS0wNi0yNiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zd2FwX21zeW1faW4pOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX3N3YXBfbXN5bV9vdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUpOiBOZXcgbWFjcm8uCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9saW5rIGZvciAubXN5bS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFJlamVjdCBhbiBTSFRfTUlQU19NU1lNCi0Jc2VjdGlvbiBub3QgbmFtZWQgLm1zeW0uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSwgbm90Ci0JLm1zeW0gZGlyZWN0bHkuICBTZXQgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBmb3IgdGhlIC5tc3ltCi0Jc2VjdGlvbi4KLQkobWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG1pbl9keW5fcmVsb2NfaW5kZXggZmllbGQuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2xlYXIgaXQuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIHRoZSAubXN5bSBzZWN0aW9uCi0Jb24gSVJJWDYuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6ICBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlCi0JLm1zeW0gc2VjdGlvbi4gIEFkZCBhIERUX01JUFNfTVNZTSBlbnRyeS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogV3JpdGUgb3V0IGEgLm1zeW0gZW50cnkgZm9yCi0JdGhlIHN5bWJvbC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBBc3NpZ24gYSB2YWx1ZSBmb3IKLQlEVF9NSVBTX01TWU0uICBBZGQgLm1zeW0gZW50cmllcyBmb3IgdGhlIHNlY3Rpb24gc3ltYm9scyBhcyB3ZWxsLgotCi0JKiBlbGYzMi1taXBzLmMgKGlyaXhfY29tcGF0X3QpOiBOZXcgZW51bWVyYXRpb24uCi0JKEFCSV9OMzJfUCk6IE5ldyBtYWNyby4KLQkoSVJJWF9DT01QQVQpOiBMaWtld2lzZS4KLQkoU0dJX0NPTVBBVCk6IEltcGxlbWVudCBpbiB0ZXJtcyBvZiBJUklYX0NPTVBBVC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvLgotCQotMTk5OS0wNi0yNiAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBNYXJrIG5vbiByZWFkb25seSBCRkQgc2VjdGlvbnMKLQlhcyB3cml0YWJsZSBQRSBzZWN0aW9ucy4KLQotMTk5OS0wNi0yNiAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMi5jIChzdHJ1Y3QgYXJhbmdlKTogTmV3IHR5cGUuCi0JKHN0cnVjdCBjb21wX3VuaXQpOiBSZXBsYWNlIExPVyBhbmQgSElHSCBieSBtZW1iZXIgQVJBTkdFLgotCShhcmFuZ2VfYWRkKTogTmV3IGZ1bmN0aW9uLgotCShkZWNvZGVfbGluZV9pbmZvKTogS2VlcCB0cmFjayBvZiBhZGRyZXNzIHJhbmdlcyB0aGF0IGEgY29tcGlsYXRpb24KLQl1bml0IGNvdmVycy4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBSZXR1cm4gdHJ1ZSBpZiBhZGRyZXNzIGlzIGNvbnRhaW5lZAotCWluIF9hbnlfIG9mIHRoZSBhZGRyZXNzIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggYSBjb21waWxhdGlvbiB1bml0LgotCShfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IENhbGwgY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lCi0Jb24gdGhlIGZpcnN0IGNvbXBfdW5pdCB0aGF0IGNvbnRhaW5zIHRoZSBhZGRyZXNzLgotCi0xOTk5LTA2LTI2ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBkd2FyZjJfZGVidWcpOiBBZGQgbWVtYmVyIGR3YXJmX2xpbmVfYnVmZmVyLgotCShkZWNvZGVfbGluZV9pbmZvKTogQWRkIHZhcmlhYmxlIFNUQVNIIGFuZCBpbml0aWFsaXplIGl0IHRvIHBvaW50Ci0JdG8gdGhlIHBlci1iZmQgZHdhcmYyX2RlYnVnIGluZm8uICBSZW1vdmUgc3RhdGljIHZhcmlhYmxlCi0JZHdhcmZfbGluZV9idWZmZXIgYW5kIHVzZSBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIgaW4gaXRzIHBsYWNlLgotCi0xOTk5LTA2LTI2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSXQncyBPSyBmb3IgYSAtQnN5bWJvbGljCi0Jc2hhcmVkIGxpYnJhcnkgdG8gaGF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sLgotCi0JRnJvbSBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT46Ci0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IGxhc3QgcGF0Y2guCi0KLVRodSBKdW4gMjQgMjA6NTk6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5jIChlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItaHBwYS5jOiBSZW1vdmUgZXZlcnl0aGluZyByZWxhdGVkIHRvIHN5bWJvbCBleHRlbnNpb24KLQlzZWN0aW9ucyAmIHJlY29yZHMuICBVc2UgdGhlIGNvbW1vbiBlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nLgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKHNpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSB1c2VyLXNwZWNpZmllZCBpbml0L2ZpbmkKLQlmdW5jdGlvbnMgaW5zdGVhZCBvZiBfaW5pdC9fZmluaSBpZiByZXF1ZXN0ZWQuCi0KLTE5OTktMDYtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogQXZvaWQgY3Jhc2hpbmcgb24gYSBib2d1cyBzaF9saW5rCi0JZmllbGQuCi0KLTE5OTktMDYtMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT46Ci0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdW51c2VkIGR5bmluZHgKLQlmaWVsZCB0byAwLCBub3QgLTEuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDaGVjayBmb3IgcG9zaXRpdmUgc2VjdGlvbgotCWR5bmluZHggZmllbGQsIHJhdGhlciB0aGFuIGNvbXBhcmluZyBhZ2FpbnN0IC0xLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBPbmx5IHJldHVybiBmYWxzZSBpZiB1bmRlZmluZWRfc3ltYm9sCi0Jb3IgcmVsb2Nfb3ZlcmZsb3cgZmFpbCwgbm90IGFsd2F5cyB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvci4KLQotMTk5OS0wNi0yMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChsaW5rX3JlYWRfcmVsb2NzKTogRXhwbGljaXRseSBjYXN0IGV4dGVybmFsX3JlbG9jcyB0bwotCWJmZF9ieXRlICogYmVmb3JlIHBlcmZvcm1pbmcgcG9pbnRlciBhcml0aG1ldGljLgotCi1UdWUgSnVuIDIyIDEzOjA2OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaDogTmV3IGZpbGUuICBDb21tb24gc3R1ZmYgZm9yIGVsZjMyIGFuZCBlbGY2NCBQQQotCXN1cHBvcnQuCi0JKiBlbGYzMi1ocHBhLmM6IEluY2x1ZGUgZWxmLWhwcGEuaC4KLQkoQVJDSF9TSVpFKTogRGVmaW5lLgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IERlbGV0ZS4gIEZvdW5kIGluIHRoZSBjb21tb24gY29kZQotCW5vdy4KLQkoZWxmMzJfaHBwYV9pbmZvX3RvX2hvd3RvKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9ob3d0b190YWJsZSk6IFNpbWlsYXJseS4KLQkoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBTaW1pbGFybHkuCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogU2ltaWxhcmx5LgotCSogZWxmMzItaHBwYS5oIChFTEZfSE9XVE9fVEFMQkUsIE5fUEFSSVNDX1JFTE9DUyk6IERlbGV0ZS4KLQotMTk5OS0wNi0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2F0Y2ggb3ZlcmZsb3cKLQloYW5kbGluZyBSX1Y4NTBfMjJfUENSRUwgcmVsb2NhdGlvbi4KLQotMTk5OS0wNi0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSk6IEV4cGxpY2l0bHkgZGVjbGFyZSByZXR1cm4KLQl0eXBlLgotCi1TdW4gSnVuIDIwIDE0OjEzOjU3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogSWdub3JlIHNlY3Rpb25zCi0JRElTQ0FSRGVkIGJ5IHRoZSBsaW5rIHNjcmlwdC4KLQotMTk5OS0wNi0xOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVtb3ZlX3NlY3Rpb25fYW5kX2FkanVzdF9keW5pbmRpY2VzKToKLQlSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIHNwcC4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBjcmFzaCBpZgotCXRoZSBlbnRyeSBzeW1ib2wgaXMgbm90IHNldC4KLQotRnJpIEp1biAxOCAwNDoyNDo1NyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYWRqdXN0Ci0JR1BESVNQIG9yIExJVFVTRSBpbiBhIHJlbG9jYXRhYmxlIGxpbmsuCi0KLVRodSBKdW4gMTcgMjE6MjQ6NDMgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkd2FyZjEuYyAoYWxsb2NfZHdhcmYxX3VuaXQpOiBBbGxvY2F0ZSB1c2luZyBiZmRfemFsbG9jLgotCSogKGFsbG9jX2R3YXJmMV9mdW5jKTogTGlrZXdpc2UuCi0KLVdlZCBKdW4gMTYgMDM6MDk6NTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IEZpeCB2YXJpb3VzIGZvcm1hdHRpbmcgZXJyb3JzLgotCShhc3NlbWJsZV8zKTsgUmV3cml0ZSB1c2luZyBDQVRFTkFURS4KLQkoYXNzZW1ibGVfMTcpOiBGaXggdmFyaW91cyBidWdzLgotCi0xOTk5LTA2LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tY29yZS5jIChSX01DT1JFX1JBVyk6IEZpeCBkZWZpbml0aW9uLgotCi0xOTk5LTA2LTE1ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKFNFQ19TSE9SVCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wNi0xMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMpOgotCVJlbW92ZSBhYmZkIHBhcmFtZXRlci4gIFVzZSBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQuCi0JKGJmZF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRqdXN0IGNhbGxlcnMgYWNjb3JkaW5nbHkuCi0JCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgpOiBEZWZpbmUgaXQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyk6IE5ldwotCWZ1bmN0aW9uLgotCShiZmRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBpdC4KLQotMTk5OS0wNi0xMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IENoYW5nZSBSXzM4Nl9QQzggZnJvbQotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkIHRvIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotMTk5OS0wNi0xMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sCi0Jc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9saW5rX3JlYWRfcmVsb2NzKTogSGVyZS4gIFVzZSBpdCBmb3IgYm90aCByZWxvY2F0aW9uCi0Jc2VjdGlvbnMuCi0KLTE5OTktMDYtMTIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbik6IERvbid0IGFzc3VtZQotCWFzZWN0LT5yZWxvY19jb3VudCBpcyB2YWxpZC4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBQZXJtaXQgYQotCVNIVF9NSVBTX1JFR0lORk8gc2VjdGlvbiB0byBoYXZlIGEgc2l6ZSBvZiAwLgotCi0xOTk5LTA2LTEyICBEYXZpZCBPJ0JyaWVuICA8b2JyaWVuQGZyZWVic2Qub3JnPgotCi0JKiBjb25maWcuYmZkIChhbHBoYSotKi1mcmVlYnNkKik6IE5ldyB0YXJnZXQuCi0JKGlbMzQ1Nl04Ni0qLWZyZWVic2QqKTogTm93IGRlZmF1bHRzIHRvIEVMRi4KLQotMTk5OS0wNi0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBQZXJtaXQgYml0ZmllbGQgcmVsb2NhdGlvbnMgdG8KLQl3cmFwIGlmIHRoZSByZWxvY2F0aW9uIGNvdmVycyB0aGUgaGlnaCBiaXQgb2YgYW4gYWRkcmVzcy4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGZpcnN0X3RpbWUuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjRfc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBSX1NQQVJDX21heF9zdGQKLQlpbnN0ZWFkIG9mIFJfU1BBUkNfbWF4LgotCShzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKiBlbGYzMl9zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8pOiBMaWtld2lzZTsgaGFuZGxlIHZ0YWJsZSByZWxvY2F0aW9ucy4KLQotMTk5OS0wNi0wNyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBSZW1vdmUgb3V0cHV0Ci0Jc2VjdGlvbnMgd2l0aCBubyBpbml0aWFsIGxpbmtfb3JkZXIuCi0KLTE5OTktMDYtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW04OGsuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi1Nb24gSnVuICA3IDExOjQ5OjQzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKFNPVVJDRV9IRklMRVMpOiBBZGQgbWlzc2luZyBoZWFkZXJzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA2LTA2ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9kYXRhKTogUmVjb2duaXplCi0JdGhlIE4zMiBBQkkuCi0KLTE5OTktMDYtMDQgIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYmFyZiBvbiBvdXQgb2YKLQlyYW5nZSB1bmRlZndlYWsgc3ltYm9scy4KLQkqIGhhc2guYzogQWRkIG1pc3NpbmcgY29tbWEgYWZ0ZXIgQHhyZWZ7fQotCSogbGlua2VyLmM6IExpa2V3aXNlLgotCi0xOTk5LTA2LTA0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoRUxGX01BWFBBR0VTSVpFKTogUHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlCi0JaWYgbm90IGRlZmluZWQuCi0JKiBlbGYzMi1nZW4uYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCSogZWxmMzItaTg2MC5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKiBlbGYzMi1pOTYwLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQkqIGVsZjY0LWdlbi5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLTE5OTktMDYtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGR3YXJmMS5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGR3YXJmMS5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgZXBvYy1hcm0tcGUgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBwZS1hcm0uYzogT25seSByZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgaWYgdGhleSBoYXZlCi0Jbm90IGFscmVhZHkgYmVlbiByZWRlZmluZWQuCi0JKiBwZWktYXJtLmM6IE9ubHkgcmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIGlmIHRoZXkgaGF2ZQotCW5vdCBhbHJlYWR5IGJlZW4gcmVkZWZpbmVkLgotCSogZXBvYy1wZS1hcm0uYzogUmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIHRvIGF2b2lkIGEKLQluYW1lIHNwYWNlIGNsYXNoLgotCSogZXBvYy1wZWktYXJtLmM6IFJlZGVmaW5lIGludGVyd29ya2luZyBmdW5jdGlvbiBuYW1lcyB0byBhdm9pZCBhCi0JbmFtZSBzcGFjZSBjbGFzaC4KLQotMTk5OS0wNi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmeHgtdGFyZ2V0LmggKEVMRl9NQVhQQUdFU0laRSk6IERlZmF1bHQgdG8gMHgxMDAwIG5vdCAxLgotCi1GcmkgSnVuICA0IDEwOjA1OjExIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogVW5kbyBjaGFuZ2Ugb2YgMTk5OS0wNS0xMC4KLQotRnJpIEp1biAgNCAwMzoxMDo0OSAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBGaXggc2V0dGluZyBvZgotCXN0YXJ0IC8gc3RvcCBmb3IgcmVjYWxjdWxhdGluZyBvZiByX2FkZGVuZCBvZiBSX1NIX1NXSVRDSCouCi0KLUZyaSBKdW4gIDQgMDI6NTM6MTMgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogSGFuZGxlIFJfU0hfU1dJVENIMzIKLQlpbiBvdGhlciB0ZXh0IHNlY3Rpb25zLgotCi1GcmkgSnVuICA0IDAyOjI5OjM0IDE5OTkgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogbGliYmZkLmMgKF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCSogY29mZi1zaC5jIChzaF9tZXJnZV9wcml2YXRlX2RhdGEpOiBEZWxldGUuCi0JKGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGFuZ2UgdG8KLQlfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaC4KLQkoZWxmMzItc2guYyk6IGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YTogRGVmaW5lLgotCi0xOTk5LTA2LTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmg6IEZpeCB0eXBvOiBjaGFuZ2UgRUxGX01BWFBBR0VfU0laRSB0byBFTEZfTUFYUEFHRVNJWkUuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiBDb3JyZWN0Ci0JcHJvdG90eXBlLgotCShiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wNi0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMi5jIChzdHJ1Y3QgbGluZV9pbmZvKTogQWRkIG1lbWJlciBFTkRfU0VRVUVOQ0UgdG8ga2VlcAotCXRyYWNrIG9mIGVuZF9zZXF1ZW5jZSBtYXJrZXJzLgotCShhZGRfbGluZV9pbmZvKTogQWRkIEVORF9TRVFVRU5DRSBhcmcuCi0JKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnkgdG8gaW5mZXIgbG9fcGMgYW5kIGhpX3BjIGZyb20gdGhlCi0JZGVidWctbGluZSBpbmZvLS0taXQgZG9lc24ndCB3b3JrIHJpZ2h0IGlmIGEgY29tcGlsYXRpb24gdW5pdAotCWNvbnNpc3RzIG9mIG11bHRpcGxlIGRpc2NvbnRpZ3VvdXMgY29kZS1zZXF1ZW5jZXMuICBJdCB3b3VsZCBiZQotCXdvcnRod2hpbGUgdG8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBhIGNvbXBpbGF0aW9uCi0JdW5pdCByZXN1bHRzIGluIGEgY29udGlndW91cyBzZXQgb2YgY29kZSBzZXF1ZW5jZXMsIGJ1dCB0aGlzIGlzCi0JcXVpdGUgdHJpY2t5IHRvIGdldCByaWdodCBmb3IgYXJiaXRyYXJ5IERXQVJGMiBmaWxlcy4KLQkobG9va3VwX2FkZHJlc3NfaW5fbGluZV9pbmZvX3RhYmxlKTogRG9uJ3QgdXNlIHRoZSBsYXN0IGxpbmUgZW50cnkKLQlmb3IgYSBjb21waWxhdGlvbiB1bml0IGZvciBhbnl0aGluZyB3aXRoIGFuIGFkZHJlc3MgaGlnaGVyIHRoYW4KLQl0aGlzIGxpbmUgZW50cnkuICBBbHNvLCBjaGVjayBmb3IgZW5kX3NlcXVlbmNlIG1hcmtlcnMgdG8KLQljb3JyZWN0bHkgaGFuZGxlIGRpc2NvbnRpbnVpdGllcy4KLQkoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBXaGVuIGNoZWNraW5nIHByZXZpb3VzbHkgbG9hZGVkCi0JY29tcGlsYXRpb24gdW5pdHMsIGNoZWNrIGFsbCBjb21waWxhdGlvbiB1bml0cyB3aXRoIGVhY2gtPmhpZ2g9PTAKLQlqdXN0IGxpa2Ugd2hlbiByZWFkaW5nIGNvbXBpbGF0aW9uIHVuaXRzLgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IEluaXRpYWxpemUgdGFibGUtPmZpbGVzIGFuZAotCXRhYmxlLT5sYXN0X2xpbmUgdG8gTlVMTCB0byBhdm9pZCBzZWdmYXVsdHMgZHVlIHRvIHJhbmRvbQotCXZhbHVlcyBpbiB0aGVzZSBtZW1iZXJzLgotCShjb25jYXRfZmlsZW5hbWUpOiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGZpbGUgbnVtYmVyIGJlZm9yZQotCWluZGV4aW5nIGZpbGVuYW1lIHRhYmxlLiAgU2VnZmF1bHRzIHN1Y2suCi0KLQkqIGR3YXJmMi5jIChkZWNvZGVfbGluZV9pbmZvKTogRG9uJ3QgdHJ1bmNhdGUgYWRkcmVzcyB0byBsZWFzdAotCXNpZ25pZmljYW50IDMyIGJpdHMgKGJyZWFrcyA2NCBiaXQgdGFyZ2V0cykuCi0JKGxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlKTogRGl0dG8uCi0JKGNvbXBfdW5pdF9jb250YWluc19hZGRyZXNzKTogRGl0dG8uCi0KLTE5OTktMDYtMDIgIE1hcmsgTWl0Y2hlbGwgIDxNYXJrIE1pdGNoZWxsIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+PgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIFJfTUlQU19KQUxSLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbCk6IExpa2V3aXNlLgotCShtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbGEpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLAotCXNwbGl0IG91dCBmcm9tIC4uLgotCShlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBIZXJlLiAgVXNlIGl0IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhCi0Jc2luZ2xlIHNlY3Rpb24gaGFzIHR3byBhc3NvY2lhdGVkIHJlbG9jYXRpb24gc2VjdGlvbnMuCi0KLTE5OTktMDYtMDIgIE1hcmsgU2FsdGVyICA8bXNhbHRlckBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFNldCBsbWEgZnJvbSBzX3ZhZGRyIGlmCi0JQ09GRl9XSVRIX1BFIGRlZmluZWQuCi0KLTE5OTktMDYtMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlLWFybS5jOiBSZW5hbWUgZ2xvYmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zIHRvIGF2b2lkIG5hbWUKLQljb2xsaXNpb24gd2hlbiBhbGwgdGFyZ2V0cyBCRkQgaXMgYnVpbHQuCi0JKiBwZWktYXJtLmM6IERpdHRvLgotCi0xOTk5LTA1LTMxICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYtYmZkLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgdXNlX3JlbGFfcC4gIEFkZAotCW1heV91c2VfcmVsX3AsIG1heV91c2VfcmVsYV9wLCBkZWZhdWx0X3VzZV9yZWxhX3AuCi0JKGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHVzZV9yZWxhX3AuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogU2V0IHVzZV9yZWxhX3AgYXBwcm9wcmlhdGVseS4KLQkoX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayk6IExpa2V3aXNlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBtYXlfdXNlX3JlbGFfcCwgZXRjLiwgaW5zdGVhZCBvZgotCXVzZV9yZWxhX3AuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHVzZV9yZWxhX3AuCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB1c2UgcmVsYQotCXJlbG9jcyBiYXNlZCBvbiB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIGhlYWRlci4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgZGVmYXVsdF91c2VfcmVsYV9wCi0JaW5zdGVhZCBvZiB1c2VfcmVsYV9wLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX21heV91c2VfcmVscCk6IE5ldyBtYWNyby4KLQkoZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3ApOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wKTogTGlrZXdpc2UuCi0JKGVsZk5OX2JlZCk6IFVzZSB0aGVtLgotCi1XZWQgSnVuICAyIDEyOjM4OjQ5IDE5OTkgIE1pb2RyYWcgVmFsbGF0IDxtaW9kcmFnQG11bHRpbWFuaWEuY29tPgotCi0JKiBob3N0cy9hbHBoYWxpbnV4LmggKFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQpOiBFeHBhbmQgdG8gNDA5Ni4KLQotVHVlIEp1biAgMSAxNzo1Nzo1OCAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWl0Y2hlbGxAbjAyLmFjbC5sYW5sLmdvdj4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFNfU1VCKTogTmV3IHJlbG9jYXRpb24uCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFKTogTGlrZXdpc2UuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNUKTogTGlrZXdpc2UuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogbGliYmZkLmg6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2luZm9fdG9faG93dG9fcmVsYSk6IE5ldyBmdW5jdGlvbi4KLQkoVVNFX1JFTCk6IEFkanVzdCBmb3IgbmV3IGNvbnZlbnRpb25zLgotCShNSU5VU19PTkUpOiBOZXcgbWFjcm8uCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIFJfTUlQU19TVUIuCi0JKG1pcHNfcik6IEFkZCBlbnRyaWVzIGZvciBNSVBTX1NVQiwgTUlQU19HT1RfUEFHRSwgTUlQU19HT1RfT0ZTVCwKLQlhbmQgTUlQU19HT1RfRElTUC4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9saW5rLCBub3Qgc2hfaW5mbywgZm9yIGEKLQkuTUlQUy5jb250ZW50IHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFRyZWF0IGFsbCBzZWN0aW9ucyB0aGF0IGJlZ2luCi0Jd2l0aCAuTUlQUy5jb250ZW50IGFzIC5NSVBTLmNvbnRlbnQgc2VjdGlvbnMuICBTZXQKLQlTSEZfTU5JUFNfTk9TVFJJUCBmb3Igc3VjaCBzZWN0aW9uLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZSB0byBtaXBzX2luZm9fdG9faG93dG9fcmVsYS4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19yKTogIEFkZCBlbnRyaWVzIGZvciBNSVBTX1NVQiwgTUlQU19HT1RfUEFHRSwKLQlNSVBTX0dPVF9PRlNULCBhbmQgTUlQU19HT1RfRElTUC4KLQotV2VkIEp1biAgMiAxMTo1MToxMiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHZtcy1taXNjLmMgKF9iZmRfdm1zX2hhc2hfbmV3ZnVuYyk6IEZpeCB1c2Ugb2YgdW5pbml0aWFsaXplZAotCXZhcmlhYmxlLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEF2b2lkIGFtYmlnb3VzCi0JYGVsc2UnLgotCi0xOTk5LTA1LTMwICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWluc3RhdGUgY2hhbmdlIG9mCi0JMTk5My0wMy0yNSAoISEpLiAgVGFrZSBpbnRvIGFjY291bnQgdGhlIGJpdG1hc2tzIGZvciB0aGUgcmVsb2Mgc28KLQl0aGUgYWRkZW5kIGRvZXMgbm90IG92ZXJmbG93IGludG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmQuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBBbWVuZCBwcm90b3R5cGUgZm9yCi0JYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIC4KLQkqIGJmZC1pbi5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZhcm0tb2FiaS5jIChOVU1fRUxFTSk6IE5ldyBtYWNybzogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mCi0JZWxlbWVudHMgaW4gYSBmaXhlZCBzaXplZCBhcnJheS4KLQkoQVJNX0VMRl9BQklfVkVSU0lPTik6IERlZmluZS4KLQkoQVJNX0VMRl9PU19BQklfVkVSU0lPTik6IERlZmluZS4KLQkoUl9BUk1fVEhNX0FCUzUpOiBGaXggcmlnaHRzaGlmdCBhbmQgc2l6ZS4KLQkoUl9BUk1fVEhNX1BDMjIpOiBGaXggc2l6ZS4KLQkoUl9BUk1fUExUMzIpOiBEZWZpbmUgSG93dG8uCi0JKGZpbmRfaG93dG8pOiBOZXcgZnVuY3Rpb246IExvY2F0ZSBhIGhvd3RvIGJhc2VkIG9uIGEgcmVsb2MKLQludW1iZXIuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvKTogVXNlIGZpbmRfaG93dG8gaWYgbmVjZXNzYXJ5LgotCShlbGYzMl9hcm1fcmVsb2NfbWFwKTogQ2hhbmdlIHR5cGUgb2YgZmllbGQgYmZkX3JlbG9jX3ZhbCB0bwotCWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZS4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcFtdKTogQWRkIGVudHJpZXMgZm9yIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotCWFuZCBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiBVc2UgZmluZF9ob3d0byBpZiBuZWNlc3NhcnkuCi0KLQkqIGVsZmFybS1uYWJpLmMgKE5VTV9FTEVNKTogTmV3IG1hY3JvOiBDb21wdXRlIHRoZSBudW1iZXIgb2YKLQllbGVtZW50cyBpbiBhIGZpeGVkIHNpemVkIGFycmF5LgotCShBUk1fRUxGX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShBUk1fRUxGX09TX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShSX0FSTV9USE1fQUJTNSk6IEZpeCByaWdodHNoaWZ0IGFuZCBzaXplLgotCShSX0FSTV9USE1fUEMyMik6IEZpeCBzaXplLgotCShlbGYzMl9hcm1faW5mb190b19ob3d0b19yZWwpOiBSZW5hbWUgdG8gZWxmMzJfYXJtX2luZm9fdG9faG93dG8uCi0JKGVsZjMyX2FybV9yZWxvY19tYXApOiBDaGFuZ2UgdHlwZSBvZiBmaWVsZCBiZmRfcmVsb2NfdmFsIHRvCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCi0JKiBlbGYzMi1hcm0uaCAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmV3IGZpZWxkOgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZS4KLQkoZWxmMzJfYXJtX2xpbmtfaGFzaF9jcmVhdGUpOiBJbml0aWFsaXNlIG5ldyBmaWVsZCB0byB6ZXJvLgotCShiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBBZGQgbmV3IHBhcmFlbXRlcjoKLQlub19waXBlbGluZV9rbm93bGVkZ2UuICBVc2UgdGhpcyBwYXJhbWV0ZXIgdG8gaW5pdGlhbGlzZSB0aGUgZmllbGQKLQlpbiB0aGUgZ2xvYmFscyBkYXRhIHN0cnVjdHVyZS4KLQkoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBPbmx5IGFkZCBpbiBwaXBlbGluZSBvZmZzZXQgaWYKLQlub19waXBlbGluZV9rbm93bGVkZ2UgaXMgZmFsc2UgYW5kIHRoZSBiaW5hcnkgaXMgZnJvbSBhbiBvbGQKLQl0b29sY2hhaW4uCi0JKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2RhdGEpOiBHZW5lcmF0ZSBhbiBlcnJvciBpZiBhbiBhdHRlbXB0IGlzCi0JbWFkZSB0byBsaW5sIHRvZ2V0aGVyIGJpZyBlbmRpYW4gYW5kIGxpdHRsZSBlbmRpYW4gY29kZS4KLQkoZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogTmV3IGZ1bmN0aW9uOiAgSW5pdGlhbGlzZSB0aGUKLQlFSV9PU0FCSSBhbmQgRUlfQUJJVkVSU0lPTiBmaWVsZHMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgRUxGIHByb2dyYW0KLQloZWFkZXIuCi0JKGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogRGVmaW5lLgotCi0xOTk5LTA1LTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZDoKLQllbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycy4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogRGVmaW5lIHRvCi0JTlVMTCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShlbGZOTl9iZWQpOiBJbml0aWFsaXNlIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzIGZpZWxkLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogU2V0IHRoZSBFSV9PU0FCSSBhbmQgRUlfQUJJVkVSU0lPTiBmaWVsZHMKLQl0byB6ZXJvLgotCShfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDYWxsCi0JZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMgaWYgZGVmaW5lZC4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgd2hldGhlciBnZXR1aWQgYW5kIGdldGdpZCBleGlzdC4KLQkqIGFyY2hpdmUuYzogRGVmaW5lIGdldHVpZCBhbmQgZ2V0Z2lkIGFzIG1hY3JvcyBpZiBIQVZFX0dFVFVJRCBvcgotCUhBVkVfR0VUR0lEIGFyZSBub3QgZGVmaW5lZCwgcmVzcGVjdGl2ZWx5LgotCShiZmRfd3JpdGVfYXJtYXApOiBEb24ndCBzcGVjaWFsIGNhc2Ugb24gX1dJTjMyIGZvciBnZXR1aWQgYW5kCi0JZ2V0Z2lkLgotCSogY29uZmlndXJlLmhvc3Q6IFNldCBhY19jdl9mdW5jX2dldHt1Z31pZCBmb3IgKi0qLXdpbmRvd3MqLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDUtMjggIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIGVsZjMyLWk5NjAuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX2k5NjAuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkICZiZmRfZWxmMzJfaTk2MF92ZWMuCi0JKiBjb25maWcuYmZkIChpOTYwLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9pOTYwX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLWk5NjAubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1pOTYwLmMuCi0JKiBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZW50cnkgZm9yCi0JUl9BUk1fUExUMzIuCi0JKGZpbmRfaG93dG8pOiBOZXcgZnVuY3Rpb246IEZpbmQgZW50cmllcyBpbiB0aGUKLQllbGYzMl9hcm1faG93dG9fdGFibGUuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvKTogVXNlIGZpbmRfaG93dG8gaWYgdGhlIGVudHJ5IGNhbm5vdCBiZQotCWNvbXB1dGVkIHNpbXBseS4KLQkoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIGxvb2t1cCBmb3IKLQlCRkRfUkVMT0NfQVJNX1BMVDMyLgotCi0xOTk5LTA1LTI1ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogYmZkL2VsZjMyLWFybS5oIChlbGYzMl9hcm1fbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogVXNlIGFib3ZlIGZ1bmN0aW9uIGFzIHRoZQotCWNvbnN0cnVjdG9yIGZvciBoYXNoIHRhYmxlIGVudHJpZXMuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQXZvaWQgY3Jhc2ggd2hlbiB0aGVyZSBpcyBubyBvdXRwdXQKLQlzZWN0aW9uLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBwYXJhbWV0ZXIgaC4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQYXNzIHN5bWJvbCBoYXNoIGVudHJ5IHRvIGFib3ZlCi0gCXJvdXRpbmUuCi0JKGVsZjMyX2FybV9nY19zd2VlcF9ob29rLCBlbGYzMl9hcm1fY2hlY2sgcmVsb2NzKTogQ29ycmVjdAotCWNvbW1lbnRzLgotCi0xOTk5LTA1LTI1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBlbWl0Ci0gICAgICAgIGJhc2UgZmlsZSBlbnRyaWVzIGZvciBwYy1yZWxhdGl2ZSB2YWx1ZXMuCi0KLTE5OTktMDUtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBXaGVuIHdlIGNyZWF0ZSB0aGUgYWN0dWFsIHNlY3Rpb24KLQl0byByZWZsZWN0IHRoZSBub3QtdGhlcmUgc2VjdGlvbiBDX1NFQ1RJT04gc3ltYm9scyByZWZlciB0bywKLQljaGFuZ2UgdGhlIHN5bWJvbCBjbGFzcyB0byBDX1NUQVQgYXMgdGhlIHNlY3Rpb24gaXMgbm93IHJlYWxseQotCXRoZXJlLgotCi0xOTk5LTA1LTI0ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVW5kbyBjaGFuZ2Ugb2YKLSAJMTk5OS0wMy0yNS4KLQotTW9uIE1heSAxNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyk6IENoYW5nZWQKLQlGX1BJQ19JTlQgdG8gRl9QSUMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZGVkIEZfQVJNXzJhLCBhbmQKLQlGX0FSTV8zTSBsYWJlbHMuICBDaGFuZ2VkIEZfUElDX0lOVCB0byBGX1BJQy4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChpbl9yZWxvY19wKTogUmVpbnN0YXRlLgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUNPUkVfUlZBKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29mZi1tY29yZS5jIChpbl9yZWxvY19wKTogUmVtb3ZlIGRlZmludGlvbi4KLQkobWNvcmVfY29mZl9ob3d0byk6IEFkZCBJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShtY29yZV9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogTWFwIEJGRF9SRUxPQ19SVkEgdG8KLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvKTogQWRkIHNwZWNpYWwgcHJvY2Vzc2luZyBmb3IKLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgc3VwcG9ydCBmb3IKLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCSogZWxmMzItbWNvcmUgKG1jb3JlX2VsZl9ob3d0b18pOiBBZGQgUl9NQ09SRV9SRUxBVElWRS4KLQkobWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTWFwIEJGRF9SRUxPQ19SVkEgdG8KLQlSX01DT1JFX1JFTEFUSVZFLgotCShtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERlbGV0ZSByZWR1bmRhbnQgY2FzZSBsYWJlbHMuCi0KLUZyaSBNYXkgMTQgMTA6NTk6NTUgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggb3BlcmF0b3IKLSAJcHJlY2VkZW5jZSBiZXR3ZWVuIGJpdC1hbmQgYW5kIGNvbXBhcmlzb24uCi0KLVRodSBNYXkgMTMgMDk6NDU6MjMgMTk5OSAgSm9lbCBTaGVycmlsbCAoam9lbEBPQVJjb3JwLmNvbSkKLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2Ki0qLXJ0ZW1zKiwgbTY4ayotKi1ydGVtcyopOiBBZGRlZCB0bwotCWxpc3Qgb2YgdGFyZ2V0IGZvcm1hdHMgKHRhcmdfc2VsdmVjcykuCi0JKGlbMzQ1Nl04NiotKi1ydGVtc2VsZiosIG1pcHMqZWwtKi1ydGVtcyopOiBOZXcgdGFyZ2V0cy4KLQkocG93ZXJwY2xlKi0qcnRlbXMqLCBzaC0qLXJ0ZW1zZWxmKik6IE5ldyB0YXJnZXRzLgotCi0xOTk5LTA1LTEwICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9hcm1hcCk6IGdpdmUgdGhlIHN5bXRhYiBlbGVtZW50IGEKLQlyZWFzb25hYmxlIG1vZGUgdW50aWwgImFyIHgiIGlzIHNtYXJ0IGVub3VnaCB0byBza2lwIGl0IChmaXhlcwotCWdjYy9saWJnY2MuYSBidWlsZHMgb24gbWlwcy1lY29mZiB0YXJnZXRzCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRXhwbGFpbiBob3cgQ09NREFUcyBhcmUgc3VwcG9zZWQKLQl0byB3b3JrLiAgSGFjayB0byBzdXBwb3J0IE1TIGltcG9ydCBsaWJyYXJpZXMsIHdoaWNoIHVzZSBkaWZmZXJlbnQKLQlDT01EQVQgdHlwZXMgdGhhbiBHTlUuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ19TRUNUSU9OIHN5bWJvbHMgYXJlIGxvY2FsOyB0aGV5IHJlZmVyCi0JdG8gaW1wbGllZCB6ZXJvLWxlbmd0aCBzZWN0aW9ucyAoc2VlIHBlaWNvZGUgYmVsb3cpCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogUHJvcGVybHkgcmVhZCBsb25nIE1TCi0JZmlsZW5hbWUgc3ltYm9scywgd2hpY2ggdXNlIG9uZSAqb3IgbW9yZSogYXV4ZW50cy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBkaXR0bwotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQnVpbGQgdGhlIGltcGxpZWQgemVyby1sZW5ndGgKLQlzZWN0aW9ucwotCi1UdWUgTWF5IDExIDE1OjUxOjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSk6IE1ha2UgcGFydGlhbF9pbnBsYWNlIGZhbHNlCi0JZm9yIGFsbCByZWxvY2F0aW9ucy4KLQotMTk5OS0wNS0xMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBiZmQtaW4uaCAoYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiAgU3RhdGljCi0gICAgICAgIGlmIENPRkZfSU1BR0VfV0lUSF9QRS4KLSAgICAgICAgKGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotICAgICAgICAoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBMaWtld2lzZS4KLSAgICAgICAgKiBjb2ZmLWFybS5jOiBMaWtld2lzZS4KLSAgICAgICAgKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLmluIChhcm1wZV9saXR0bGVfdmVjKTogUmVtb3ZlIGNvZmYtYXJtLmxvLgotICAgICAgICAoYXJtcGVfYmlnX3ZlYyk6IExpa2V3aXNlLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNS0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgZm9yIC5yZWwuIGFzIHN0YXJ0IG9mIHJlbAotCXNlY3Rpb24sIG5vdCBqdXN0IC5yZWwuICBTYW1lIGZvciAucmVsYS4KLQotMTk5OS0wNS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXBsYWNlIGFzc2VydCBhYm91dAotCWVuZGlhbmlzbSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBNYXkgIDYgMTc6MDk6MDkgMTk5OSAgRnJlZCBGaXNoICA8Zm5mQGJlLmNvbT4KLQotCSogZHdhcmYyLmMgKHJlYWRfYWJicmV2cyk6IENoYW5nZSBjYXN0IG9mIGR3YXJmX2FiYnJldl9idWZmZXIKLQlhc3NpZ25tZW50IGZyb20gInVuc2lnbmVkIGNoYXIgKiIgdG8gImNoYXIgKiIuCi0JKGRlY29kZV9saW5lX2luZm8pOiBMaWtld2lzZSBmb3IgZHdhcmZfbGluZV9idWZmZXIgYXNzaWdubWVudC4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIEFkZCBvbmUgdG8KLSAgICAgICAgYWRkcmVzcyBvZiBBUk1fUlZBMzIgdGh1bWIgZnVuY3Rpb25zLgotCi0xOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLW02OGsuYyAoZWxmMzJfbTY4a19zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldy4KLSAgICAgICAgKGVsZjMyX202OGtfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotICAgICAgICAoZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotICAgICAgICAoZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotICAgICAgICAoQ1BVMzJfRkxBRyk6IERlZmluZS4KLSAgICAgICAgKFBMVF9DUFUzMl9FTlRSWV9TSVpFKTogRGVmaW5lLgotICAgICAgICAoZWxmX2NwdTMyX3BsdDBfZW50cnkpOiBEZWNsYXJlLgotICAgICAgICAoZWxmX2NwdTMyX3BsdF9lbnRyeSk6IERlY2xhcmUuCi0gICAgICAgIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBHZW5lcmF0ZSBjcHUzMiBwbHQgZW50cmllcy4KLSAgICAgICAgKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotICAgICAgICAoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLSAgICAgICAgKGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSk6IFJlbW92ZSBkZWZpbml0aW9uLgotICAgICAgICAoYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0gICAgICAgIChiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0gICAgICAgIChiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogRGVmaW5lLgotICAgICAgICAoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCi1Nb24gTWF5ICAzIDA5OjI0OjQ5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogRml4IGNvbW1lbnRzIGZvciBSX1NIT1JUX1BDUkVMX01PREUKLQlhbmQgUl9MT05HX1BDUkVMX01PREUuCi0KLTE5OTktMDQtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG9zLgotCi1GcmkgQXByIDI4IDE2OjM2OjE5IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluY2x1ZGUgcmVsb2NhdGlvbiBhZGRlbmQKLQlpbiByZWxvY2F0aW9uIGNhbGN1bGF0aW9uLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgcmVsb2NzLgotCi0xOTk5LTA0LTIwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBTY3JhcCB0aGUKLQlpbmNvcnJlY3QgdXNlIEVGX01JUFNfeHhCSVRQVFJTLgotCi0xOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwKLQl2YXJpYWJsZSBpbnNuLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotU2F0IEFwciAxNyAyMDo1NToxNSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBSZW1vdmUgQVJNMjZEIHRyYW5zZm9ybS4KLQkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBBZGQgQVJNMjZEIHRyYW5zZm9ybS4gIE9ubHkKLQljaGFuZ2UgdG8gQVJNMjZEIGZvciByZWxvY2F0ZWFibGUgbGlua3MuCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCi0xOTk5LTA0LTE1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBGb3IgUl9BUk1fVEhNX0FCUzUsCi0JcmVmZXRjaCBhZGRlbmQgaWYgVVNFX1JFTCwgYWRkIG1hbnkgY29tbWVudHMgcmVnYXJkaW5nIGN1cnJlbnQgc3RhdGUuCi0JRm9yIFJfQVJNX1RITV9QQzIyLCByZWZldGNoIGFkZGVuZCBpZiBVU0VfUkVMLCBzaW1wbGlmeS4KLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEZvciBSX0FSTV9USE1fQUJTNSwgZml4Ci0Jc2l6ZSBhbmQgcmlnaHRzaGlmdC4gIEZvciBSX0FSTV9USE1fUEMyMiwgZml4IGJpdHNpemUuCi0JKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBEaXR0by4KLQotV2VkIEFwciAxNCAxNDozMzowOCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogWmVybyBgZGVidWcnLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvKTogTGlrZXdpc2UuCi0KLTE5OTktMDQtMTMgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IERvbid0IHRydW5jYXRlIGFkZHJlc3MgdG8gbGVhc3QKLQlzaWduaWZpY2FudCAzMiBiaXRzIChicmVha3MgNjQgYml0IHRhcmdldHMpLgotCShsb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSk6IERpdHRvLgotCShjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyk6IERpdHRvLgotCi1UdWUgQXByIDEzIDIxOjI3OjE5IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkpOiBOZXcgcm91dGluZS4KLQkoQTJUM19PRkZTRVQpOiBEZWZpbmUuCi0JKFQyQTNfT0ZGU0VUKTogRGVmaW5lLgotCShjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIEVtaXQgYmFzZSBmaWxlIGVudHJpZXMgZm9yIGludGVyd29ya2luZwotCXN0dWJzLgotCi0xOTk5LTA0LTEzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZHVtbXkgZW50cmllcyBmb3IKLQlyZWxvY3MgMTcgdGhyb3VnaCAxOS4KLQotU3VuIEFwciAxMSAwMToyNToxNyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmg6IFJlbW92ZSBmbm1hdGNoLmguCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IENhbGwgYmFjayB0byBsZAotCWluc3RlYWQgb2YgY2FsbGluZyBmbm1hdGNoLgotCi0JKiBjb25maWcuYmZkIChpPzg2LSotYmVvc2VsZik6IEluY2x1ZGUgcGUgdmVjcy4KLQotU3VuIEFwciAxMSAwMToxNDowNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQWxsb3cgLnBsdAotCXRvIGdvIG1pc3NpbmcuCi0KLTE5OTktMDQtMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE1pbmQgbm9fdW5kZWZpbmVkCi0Jd2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSBkeW5hbWljIHN5bWJvbCByZWZlcmVuY2VzLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCi1TYXQgQXByIDEwIDE1OjEyOjA5IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogTmV3IGZ1bmN0aW9uIG1vdmVkIGZyb20KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiAuLi4gaGVyZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIGl0LgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZS4KLQotMTk5OS0wNC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjY0LXNwYXJjLmM6IEZpeCBpbmNvcnJlY3QgY2FsbHMgdG8gYmZkX2NoZWNrX292ZXJmbG93LgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXRzLgotCSogY3B1LW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZSB0YXJnZXRzLgotCSogZWxmMzItbWNvcmUuYzogTmV3IEZpbGU6IFN1cHBvcnQgZm9yIG1jb3JlLWVsZiB0YXJnZXQuCi0JKiBwZS1tY29yZS5jOiBOZXcgRmlsZTogRGVmaW5pdGlvbnMgZm9yIG1jb3JlLXBlIHRhcmdldC4KLQkqIHBlaS1tY29yZS5jOiBOZXcgRmlsZTogRGVmaW5pdGlvbnMgZm9yIG1jb3JlLXBlaSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSBhcmNoaXRlY3R1cmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmY29kZS5oOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUtcGUgdGFyZ2V0cy4KLQkqIGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUtZWxmIHRhcmdldC4KLQkqIHJlbG9jLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSByZWxvY3MuCi0JKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCi0xOTk5LTA0LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IKLQlSX0FSTV9YUEMyNSBhbmQgUl9BUk1fVEhNX1hQQzIyLgotCShlbGYzMl9hcm1fcmVsb2NfbWFwKTogUmVtb3ZlIHJlZHVuZGFudCBlbnRyaWVzLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3lzZGVwLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCi0xOTk5LTA0LTA2ICBDaHJpcyBUb3JlayAgPHRvcmVrQGJzZGkuY29tPgotCi0JKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBBZGQgYWRkcnNpemUgcGFyYW1ldGVyLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuICBSZXdyaXRlIGNvbXBsZXRlbHkuCi0JKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBSZXdyaXRlIG92ZXJmbG93IGNoZWNraW5nLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA0LTA1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gR2FicmllbCBQYXViZXJ0IDxwYXViZXJ0QGlyYW0uZXM+OgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogU2V0IFJfUFBDX0dPVDE2X0xPLAotCVJfUFBDX1BMVDE2X0xPIGFuZCBSX1BQQ19TRUNUT0ZGX0xPIHRvIGJlIGNvbXBsYWluX292ZXJmbG93X2RvbnQuCi0JU2V0IFJfUFBDX1BMVDE2X0hBLCBSX1BQQ19TRUNUT0ZGX0hBIGFuZCBSX1BQQ19FTUJfTkFERFIxNl9IQSB0bwotCWhhdmUgYSByaWdodHNoaWZ0IG9mIDE2IGFuZCB1c2UgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MuCi0JKiBwcGNib290LmMgKHBwY2Jvb3RfdmVjKTogVXNlIGxpdHRsZSBlbmRpYW4gcm91dGluZXMgZm9yCi0JaGVhZGVycy4KLQotCSogZWxmLmMgKGVsZmNvcmVfc3RybmR1cCk6IE9ubHkgZGVmaW5lIGlmIGl0IHdpbGwgYmUgdXNlZC4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbGF4X3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FscyBpcmVsCi0JYW5kIGlyZWxlbmQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBpLgotCShwcGNfZWxmX2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCi0JRnJvbSBCZXJuZCBOaXR6bGVyIDxuaXR6bGVyQGthZ2NwZDAxLmFnMDEua29kYWsuQ09NPjoKLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogQWNjZXB0IFxyIGluIHN5bWJvbCBkZWZpbml0aW9ucy4KLQkoc3JlY19vYmplY3RfcCk6IFNldCBIQVNfU1lNUyBpZiB3ZSBzYXcgYW55IHN5bWJvbHMuCi0JKHN5bWJvbHNyZWNfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQotMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtaXBzKmVsLSotdnh3b3JrcyogYW5kIG1pcHMqLSotdnh3b3JrcyouCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkd2FyZjEuYyAocGFyc2VfbGluZV90YWJsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGxhc3RfcGMgYW5kCi0JbGFzdF9saW5lLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIpOiBEZWNsYXJlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9nY19tYXJrX2hvb2spOiBBZGQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoLgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCBpLgotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCB2YWwuCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb2ZmLWFybS5jOiBBbGxvdyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZgotCVRBUkdFVF9VTkRFUlNDT1JFIGFuZCBVU0VSX0xBQkVMX1BSRUZJWC4KLQkqIHBlLWFybS5oOiBBbGxvdyBwcmV2aW91cyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZgotCVRBUkdFVF9MSVRUTEVfU1lNIGFuZCBUQVJHRVRfQklHX1NZTS4KLQkqIHBlaS1hcm0uaDogQWxsb3cgcHJldmlvdXMgaGVhZGVyIGZpbGVzIHRvIG92ZXJyaWRlIGRlZmluaXRpb24gb2YKLQlUQVJHRVRfTElUVExFX1NZTSBhbmQgVEFSR0VUX0JJR19TWU0uCi0JKiBlcG9jLXBlLWFybS5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogZXBvYy1wZWktYXJtLmM6IE5ldyBmaWxlLiAgU3VwcG9ydCBhcm0tZXBvYy1wZWkgdGFyZ2V0LgotCi0xOTk5LTAzLTMwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoZWxmX21hcF9zeW1ib2xzKTogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHNlY3Rpb24KLQlzeW1ib2xzIGFyZSBnZW5lcmF0ZWQgZm9yIGNvbnRlbnQtbGVzcyBzZWN0aW9ucyB3aGljaCBhcmUKLQlub3QgbWFwcGVkIHRvIHRoZSBvdXRwdXQgZmlsZS4KLQotCSogbGlua2VyLmM6IFJlcGxhY2UgZGlyZWN0IHJlZmVyZW5jZXMgdG8gZmllbGRzIGluIEJGRCBzdHJ1Y3R1cmUKLQl3aXRoIGFjY2Vzc29yIG1hY3Jvcy4KLQotCSogZWxmbGluay5oOiBSZXBsYWNlIGRpcmVjdCByZWZlcmVuY2VzIHRvIGZpZWxkcyBpbiBCRkQgc3RydWN0dXJlCi0Jd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0KLTE5OTktMDMtMjUgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBjb25maWcuYmZkOiBFbGltaW5hdGUgcmVkdW5kYW5jeSBpbiBjaGVja3MgZm9yIExpbnV4L0FSTS4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVGFrZSB0aGUgcmlnaHRzaGlmdCBpbnRvCi0JYWNjb3VudCB3aGVuIGFkanVzdGluZyBzZWN0aW9uIHN5bWJvbHMgZHVyaW5nIGEgcGFydGlhbCBsaW5rLgotCi0xOTk5LTAzLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNwYXJjLmMgKHN0cnVjdCBjb2ZmX3JlbG9jX21hcCk6IENoYW5nZSB0eXBlIG9mIGZpZWxkCi0JICAnYmZkX3JlbG9jX3ZhbCcgdG8gYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCSogZWxmLW0xMDIwMC5jIChzdHJ1Y3QgbW4xMDIwMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZi1tMTAzMDAuYyAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1hcmMuYyAoc3RydWN0IGFyY19yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLWQxMHYuYyAoc3RydWN0IGQxMHZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1kMzB2LmMgKHN0cnVjdCBkMzB2X3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItZnIzMC5jIChzdHJ1Y3QgZnIzMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLW0zMnIuYyAoc3RydWN0IG0zMnJfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1zaC5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItc3BhcmMuYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLXY4NTAuYyAoc3RydWN0IHY4NTBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGY2NC1zcGFyYy5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmYXJtLW5hYmkuYyAoc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZmFybS1vYWJpLmMgKHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwKTogRGl0dG8uCi0KLTE5OTktMDMtMTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2hhbmdlZCB0aGlzCi0JZnVuY3Rpb24gc28gc291cmNlLWxldmVsIGFzc2VtYmx5IHdvcmtzLiAgSWYgbXVsdGlwbGUgTl9TT3MKLQlhcmUgc2VlbiB3aXRob3V0IGFuZCBOX0ZVTnMsIGNyZWF0ZSBhbiBpbmRleHRhYmxlIGVudHJ5IHdpdGgKLQlhIE5VTEwgZnVuY3Rpb24gbmFtZS4KLQotMTk5OS0wMy0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSBBbGxvdyBtZXJnaW5nCi0Jb2YgY2VydGlhbiBzaW1pbGFyIGNwdXMuCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JQWRkIHRoZSA1MDAwLiAgQ2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoZSA1NDAwIHRvIG1pcHM0LgotCShlbGZfbWlwc19tYWNoKTogQWRkIHI1MDAwLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS1pOTYwLmMgKHNjYW5faTk2MF9tYWNoKTogUmVjb2duaXplIGk5NjA6a2Ffc2EgYW5kIGk5NjA6a2Jfc2IuCi0KLTE5OTktMDMtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBHZW5lcmF0ZSB3YXJuaW5nIGFib3V0Ci0JaHVnZSBmaWxlIG9mZnNldHMgZm9yIGFueSBzZWN0aW9uIHRoYXQgd2lsbCBvY2N1cHkgZmlsZSBzcGFjZSwgbm90Ci0JanVzdCB0aG9zZSB0aGF0IGFyZSBsb2FkYWJsZS4KLQotMTk5OS0wMi0yNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZSBhZnRlciBOaWNrIENsaWZ0b24ncyBGZWIgMTcgY2hhbmdlcy4KLQotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jOiBBZGQgcHBjX2VsZl9yZWxheF9zZWN0aW9uKCkgZm9yIHRoZSBsZCBvcHRpb24gbXBjODYwYzAuCi0KLU1vbiBGZWIgMjIgMTg6MjY6NTEgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyk6IERlZmluZS4KLQkqIGVsZmxpbmsuaDogUmV2ZXJ0IGFsbCBjaGFuZ2VzIHNpbmNlIEZlYiAxNi4gIEluc3RlYWQ6Ci0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZsYWcgaWYKLQlhcHByb3ByaWF0ZS4gIENvcHkgaXQgdG8gdmVyc2lvbiBzeW1ib2xzLgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciBub24gRUxGCi0Jc3ltYm9scyBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciB3ZWFrZGVmCi0Jc3ltYm9sIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSWYgc3ltYm9sIGlzIG1hcmtlZCBhcyB1bmRlZmluZWQsIGFuZAotCWhhcyBubyBub253ZWFrIHJlZmVyZW5jZXMsIG1hcmsgaXQgYXMgd2VhayB1bmRlZmluZWQuCi0KLUZyaSBGZWIgMTkgMTY6MDE6MTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSBkeW5hbWljCi0JZGVmaW5pdGlvbiB3aXRoIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLCBzZXQgTkVFRFNfUExUIGlmIGl0IGlzIGEKLQlmdW5jdGlvbi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY29weSB0aGUgb3RoZXIgZmllbGQgaWYgd2UKLQlhcmUgb3ZlcnJpZGRpbmcuCi0KLVRodSBGZWIgMTggMTg6MDc6NDMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEbyBub3QgbWVyZ2UgYW55IHN5bWJvbCBmcm9tIGEKLQlzaGFyZWQgb2JqZWN0IHdpdGggYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuCi0KLTE5OTktMDItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1uYWJpLmM6IFNldCBwYXJ0aWFsX2lucGxhY2UgYmFjayB0byBmYWxzZS4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBSZS1lbmFibGUuCi0JKFVTRVJfTEFCRUxfUFJFRklYKTogU2V0IHRvICJfIi4KLQotCVRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgZnJvbTogU2NvdHQgQmFtYnJvdWdoCi0JPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQotCSogbGliYW91dC5oIChNX0FSTTZfTkVUQlNEKTogU2V0IHRvIDE0My4KLQotCSogcmVsb2MuYzogQWRkIEFSTSBQSUMgcmVsb2NzOiAgIEJGRF9SRUxPQ19BUk1fR09UMTIsCi0JQkZEX1JFTE9DX0FSTV9HT1QzMiwgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsIEJGRF9SRUxPQ19BUk1fQ09QWSwKLQlCRkRfUkVMT0NfQVJNX0dMT0JfREFULCBCRkRfUkVMT0NfQVJNX1BMVDMyLAotCUJGRF9SRUxPQ19BUk1fUkVMQVRJVkUsIEJGRF9SRUxPQ19BUk1fR09UT0ZGLCBCRkRfUkVMT0NfQVJNX0dPVFBDLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBTZXQgcGFydGlhbF9pbnBsYWNlIHRvCi0JJ3RydWUnIGFzIFJFTCByZWxvY3MgYXJlIG5vdyBiZWluZyB1c2VkLiAgQWRkIG5ldyBQSUMgcmVsb2NzOgotCVJfQVJNX0NPUFksIFJfQVJNX0dMT0JfREFULCBSX0FSTV9KVU1QX1NMT1QsIFJfQVJNX1JFTEFUSVZFLAotCVJfQVJNX0dPVE9GRiwgUl9BUk1fR09UUEMsIFJfQVJNX0dPVDMyLCBSX0FSTV9QTFQzMi4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgYnl0ZSBvcmRlcgotCW9mIHRhcmdldHMuCi0JKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2hhbmdlIHBhcmFtZXRlcnMgc28gdGhhdCBlbnRpcmUKLQlyZWxvYyBpcyBwYXNzZWQuICBBZGQgc3VwcG9ydCBmb3IgUElDIHJlbG9jcy4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQYXNzIGVudGlyZSByZWxvYyB0bwotCWVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlLgotCShlbGYzMl9hcm1fY2hlY2tfcmVsb2NzKTogSGFuZGxlIG5ldyBQSUMgcmVsb2NzLgotCShlbGYzMl9hcm1fYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoRUxGX01BWFBBR0VfU0laRSk6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltKTogRGVmaW5lLgotCi1XZWQgRmViIDE3IDEyOjAyOjI2IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIHJlZ2luZm8KLQlzZWN0aW9ucyBTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTcgMTI6MDc6MjMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0gICAgICAgICogZWxmYXJtLW9hYmkuYyAoYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMsCi0gICAgICAgIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLAotICAgICAgICBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBEZWZpbmUgdG8gYXZvaWQgY2xhc2gKLSAgICAgICAgd2l0aCBlbGZhcm0tbmFiaS5jLgotCi0gICAgICAgICogZWxmMzItYXJtLmg6IERvbid0IGRlY2xhcmUgZWxmMzJfYXJtX2luZm9fdG9faG93dG8uCi0gICAgICAgIChlbGYzMl90aHVtYl90b19hcm1fc3R1YiwgZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIsCi0gICAgICAgIGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IE1ha2UgdGhlbSBzdGF0aWMuCi0KLVR1ZSBGZWIgMTYgMjI6NDQ6MzcgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBBZGQgcGZsYWdzIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgRG8gbm90IG1lcmdlIGEgZGVmaW5pdGlvbiBmcm9tIGEgc2hhcmVkIG9iamVjdCB3aXRoIGEKLQl3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvIG5vdCBjaGFuZ2UgdGhlIHN5bWJvbCB0eXBlIG9yCi0Jc2l6ZSBpZiB0aGUgb2xkIHN5bWJvbCBvdmVycmlkZXMgdGhlIG5ldyBvbmUuCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gdGFyZ2V0LgotCi1Nb24gRmViICA4IDExOjE4OjE0IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChyZWxvY19tYXApOiBVc2UgdGhlIGNvcnJlY3QgdHlwZXMgZm9yIHRoZSBzdHJ1Y3QKLQlmaWVsZHMgaW5zdGVhZCBvZiB1bnNpZ25lZCBjaGFyLgotCi1GcmkgRmViICA1IDAwOjIyOjM2IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBGZWIgIDQgMjI6MzA6MTMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBBQ19QUkVSRVEgdG8gMi4xMy4gIFJlbW92ZSBBTV9DWUdXSU4zMi4KLQlDaGFuZ2UgQU1fRVhFRVhUIHRvIEFDX0VYRUVYVCBhbmQgQU1fUFJPR19JTlNUQUxMIHRvCi0JQUNfUFJPR19JTlNUQUxMLiAgQWRkIGNvbW1lbnRzIHRvIHVzZXMgb2YgQUNfREVGSU5FLgotCSogYWNpbmNsdWRlLm00OiBBZGQgY29tbWVudHMgdG8gdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGF1dG9jb25mL2F1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBjb25maWcuaW46IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi0xOTk5LTAyLTA0ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKHJlYWxfcmVhZCk6IGRvbid0IGNhbGwgZnJlYWQgZm9yIHplcm8gYnl0ZXMuICBUaGlzCi0JY292ZXJzIHVwIGEgYnVnIChvciBtaXN1c2Ugb2YgYmZkKSB0aGF0J3MgZXhwb3NlZCBieSBTb2xhcmlzLgotCi1UaHUgRmViICA0IDEyOjM4OjEwIDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbnN1cmUgdGhhdCB0aGUgdGFyZ2V0Ci0Jb2YgYSBqdW1wIGlzIGluIHRoZSBjdXJyZW50IDI1NiBNQiByZWdpb24uCi0KLVRodSBGZWIgIDQgMTI6MTU6MzggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2hhbmdlIGxhc3QgcGF0Y2ggdG8gb25seQotCXRha2UgZWZmZWN0IGZvciB0aGUgYmluYXJ5IHRhcmdldC4KLQotV2VkIEZlYiAgMyAxOTo0MDoxMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgQkZEX1JFTE9DX0NUT1IuCi0KLVdlZCBGZWIgIDMgMTU6MDI6NDQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfY2hlY2tfcmVsb2NzKTogIE5ldyByb3V0aW5lLgotCi1UdWUgRmViICAyIDIxOjM4OjI4IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IElmIHRoZSB0YXJnZXQgd2FzCi0JcHJldmlvdXNseSBzcGVjaWZpZWQsIGRvbid0IGNoZWNrIG90aGVyIHRhcmdldHMgd2hlbiBjaGVja2luZyBmb3IKLQlhbiBhcmNoaXZlIGZpbGUuCi0KLVR1ZSBGZWIgIDIgMTg6MTY6NDMgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jX21hcCk6ICBSZW1vdmVkLgotICAgICAgICAoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogIFJlbW92ZWQKLSAgICAgICAgKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIE5ldy4KLSAgICAgICAgKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6ICBOZXcuCi0gICAgICAgICogZWxmYXJtLW9hYmkuYyAoZWxmMzJfYXJtX3JlbG9jX21hcCk6ICBOZXcuCi0gICAgICAgIChlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiAgTmV3LgotCi1Nb24gRmViICAxIDE5OjQ5OjIxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmYXJtLW5hYmkuYzogIFJlbmFtZWQgZnJvbSBlbGYzMi1hcm0tbmV3YWJpLmMuCi0gICAgICAgICogZWxmYXJtLW9hYmkuYzogIFJlbmFtZWQgZnJvbSBlbGYzMi1hcm0tb2xkYWJpLmMKLSAgICAgICAgKiBNYWtlZmlsZS5hbTogIFVzZSBuZXcgZmlsZXMuCi0gICAgICAgICogTWFrZWZpbGUuaW46ICBSZWdlbmVyYXRlLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogIFVzZSBuZXcgZmlsZXMuCi0gICAgICAgICogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLQotMTk5OS0wMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9nY19tYXJrX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBfZWxmX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQotTW9uIEZlYiAgMSAxMjoyMTo0NyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiAgQWRkIGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMKLSAgICAgICAgYW5kIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMuCi0KLU1vbiBGZWIgIDEgMTE6NDY6MzEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5hbSAoZWxmMzItYXJtLW9sZGFiaS5sbyk6ICBOZXcuCi0gICAgICAgIChlbGYzMi1hcm0tbmV3YWJpLmxvKTogIE5ldy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlnLmJmZCAodGh1bWItKi1lbGYpOiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgdGFyZ191bmRlcnNjb3JlLgotICAgICAgICAoYXJtLSotZWxmKTogIExpa2V3aXNlLgotICAgICAgICAoYXJtLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICh0aHVtYi0qLW9hYmkpOiAgTmV3LgotICAgICAgICAqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLmluIChiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKTogIE5ldy4KLSAgICAgICAgKGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMpOiAgTmV3LgotICAgICAgICAqIGVsZjMyLWFybS1uZXdhYmkuYzogIE5ldy4KLSAgICAgICAgKiBlbGYzMi1hcm0tb2xkYWJpLmM6ICBOZXcuCi0gICAgICAgICogZWxmMzItYXJtLmM6ICBSZW1vdmVkLgotICAgICAgICAqIGVsZjMyLWFybS5oOiAgTmV3LgotCi1Nb24gRmViICAxIDExOjUyOjEyIDE5OTkgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBPbWl0IHdhcm5pbmdzIGZvcgotCXVubG9hZGFibGUgc2VjdGlvbnMuCi0KLTE5OTktMDEtMzEgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0tKi12eHdvcmtzKik6IEFkZCBhbGlhc2VzIHRvCi0JcG93ZXJwY3ssbGV9LSotZWFiaS4KLQotMTk5OS0wMS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmMgKHJlYWRfdW5zaWduZWRfbGViMTI4KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKiBkd2FyZjIuYyAocmVhZF9zaWduZWRfbGViMTI4KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLUZyaSBKYW4gMjkgMDA6NDc6MjEgMTk5OSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IE9ubHkgYWRqdXN0Ci0JcF9hbGlnbiB3aGVuIG5lZWRlZC4KLQotVGh1IEphbiAyOCAyMDowNToyMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCByZXR1cm4gZWFybHkgZm9yIGEKLSAJbm9uLWxvYWRhYmxlIHNlY3Rpb24sIGluIGNhc2UgdGhlIGZpcnN0IHNlY3Rpb24gaXMgbm9uLWxvYWRhYmxlLgotICAJRG9uJ3Qgc2V0IHRoZSBsb3cgbG1hIGZvciBhIFNFQ19ORVZFUl9MT0FEIHNlY3Rpb24uICBGcm9tIE1hY2llagotCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgotCi0xOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfcmVsb2NfbWFwKTogQWRkIFJfRlIzMF9HTlVfVlRJTkhFUklUIGFuZAotCVJfRlIzMF9HTlVfVlRFTlRSWSByZWxvY3MuCi0KLVRodSBKYW4gMjggMTE6MDg6MTYgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X3N5bSk6ICBaZXJvIHN5bXMgd2hpY2ggYXJlCi0gICAgICAgcGFydCBvZiBzZWN0aW9ucyB3aGljaCBoYXZlIGJlZW4gZXhjbHVkZWQuCi0KLVdlZCBKYW4gMjcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2VkIEZfUElDCi0JdG8gRl9QSUNfSU5ULgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZW1vdmVkIEZfQVJNXzJhIGFuZAotCUZfQVJNXzNNIGxhYmVscy4gIENoYW5nZWQgRl9QSUMgdG8gRl9QSUNfSU5ULgotCi0xOTk5LTAxLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX2hvd3RvX3RhYmxlKTogRml4IG5hbWUgb2YgUl9GUjMwXzQ4Ci0JcmVsb2NhdGlvbi4KLQkoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogVXNlIGNvbXB1dGVkIHZhbHVlIGFzIHJlc3VsdCBvZgotCXJlbG9jYXRpb24uCi0KLTE5OTktMDEtMjYgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBFbWl0IHdhcm5pbmcgZm9yCi0JaHVnZSBmaWxlIG9mZnNldHMgZHVlIHRvIHdpZGVseS1kaXNwZXJzZWQgc2VjdGlvbiBMTUFzLgotCi1Nb24gSmFuIDE4IDAzOjM1OjM1IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiBub3QgRF9QQUdFRCwKLQlhbGlnbiBmaXJzdCBzZWN0aW9uIHRvIGxhcmdlc3Qgc2VjdGlvbiBhbGlnbm1lbnQsIG5vdCBmaXJzdAotCXNlY3Rpb24gYWxpZ25tZW50LgotCi0xOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgotCi1UdWUgRGVjIDIyIDE1OjIxOjQxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCk6ICBEZWZpbmUuCi0gICAgICAgICogYmZkLWluMi5oOiAgTGlrZXdpc2UuCi0gICAgICAgICogY3B1LWkzODYuYyAoYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXgpOiAgTmV3LgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyxiZmQtaW4yLmggKGJmZF9tYWNoX21pcHM0MTExKTogTmV3LgotCSogY3B1LW1pcHMuYzogQWRkIHN1cHBvcnQgZm9yIGFuZCBpbmRlcGVuZGVudCA0MTExLgotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19tYWNoKTogRV9NSVBTX01BQ0hfNDExMSAtPiBiZmRfbWFjaF9taXBzNDExMS4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQliZmRfbWFjaF9taXBzNDExMSAtPiBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDExMS4KLQotMTk5OC0xMi0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfYWJpX25hbWUpOiBOZXcuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENvbXBhcmUgRUZfTUlQU19BQkkgZmxhZ3MuCi0KLTE5OTgtMTItMTIgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JSGFuZGxlIGJmZF9tYWNoX21pcHM0MzAwLgotCi0xOTk4LTEyLTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jOiBSZW1vdmUgbGVha2VkIGRldmVsb3BtZW50IGNvZGUgZnJvbSBwYXRjaAotCTE5OTgtMTItMTAgYnkgUmljaGFyZCBIZW5kZXJzb24uCi0KLTE5OTgtMTItMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGZhaWwgcmVsb2NhdGlvbnMKLQlpbiBkZWJ1ZyBzZWN0aW9ucyBmb3Igc3ltYm9sIGRlZmluZWQgZXh0ZXJuYWxseS4KLQotVGh1IERlYyAxMCAxMDo1ODozOCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBSZW1vdmUgZHVwbGljYXRlIGVudHJ5IGZvcgotCXRla2hleF92ZWMuCi0KLTE5OTgtMTItMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfaG93dG9fdGFibGUpOiBTZXQgc3JjX21hc2sgZmllbGRzIHRvIDAKLQlzaW5jZSB3ZSBhcmUgdXNpbmcgUkVMQXMuCi0KLVR1ZSBEZWMgIDggMjI6MTU6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU0NPIE9wZW4gU2VydmVyIFJlbGVhc2UgNSBjb3JlIGZpbGUgc3VwcG9ydCwgZnJvbSBKb3VrZSBOdW1hbgotCTxqbnVtYW5AaGlzY29tLm5sPjoKLQkqIHNjbzUtY29yZS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDU2XTg2LSotc2NvMy4ydjUqKTogVXNlIHNjbzUtY29yZS5sby4KLQkoc2NvNS1jb3JlLmxvKTogRGVmaW5lIFNDTzVfQ09SRSBpbiBDT1JFRkxBRy4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoT1BUSU9OQUxfQkFDS0VORFMpOiBBZGQgc2NvNS1jb3JlLmxvLgotCShPUFRJT05BTF9CQUNLRU5EU19DRklMRVMpOiBBZGQgc2NvNS1jb3JlLmMuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgc2NvNV9jb3JlX2RhdGEgZmllbGQgdG8gdGRhdGEuCi0JKiB0YXJnZXRzLmMgKHNjbzVfY29yZV92ZWMpOiBBZGQgdG8gdGFyZ2V0IGxpc3QgaWYgU0NPNV9DT1JFLgotCSogYmZkLWluMi5oLCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgRGVjICA4IDE5OjM4OjQyIDE5OTggIE1hcmsgS2xlaW4gIDxta2xlaW5AZGlzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaHBwYSotKi1tcGVpeCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfSEVBREVSX0RJUkVOVC4KLQkoaHBwYSotKi1tcGVpeCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKGhwcGEqLSotbXBlaXgqKTogTmV3IGhvc3QuCi0JKiBocHV4LWNvcmUuYzogQ2hlY2sgSE9TVF9IUFBBTVBFSVguICBVc2UgSEFWRV9ESVJFTlRfSCBhbmQKLQlmcmllbmRzIHJhdGhlciB0aGFuIGp1c3QgaW5jbHVkaW5nIDxzeXMvZGlyLmg+LgotCSogc29tLmggKHN0cnVjdCBzb21fc3ltYm9sKTogQWRkIGhwcGFfcHJpdl9sZXZlbCBhbmQgYXB0bwotCXRjX2RhdGEuICBDaGFuZ2UgYWxsIHVzZXJzLgotCShzdHJ1Y3Qgc29tZGF0YSk6IEFkZCBjb21wX3VuaXQgZmllbGQuCi0JKG9ial9zb21fY29tcGlsYXRpb25fdW5pdCk6IERlZmluZS4KLQkoYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5peCk6IERlY2xhcmUuCi0JKiBzb20uYzogQ2hlY2sgSE9TVF9IUFBBTVBFSVguCi0JKHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyk6IEFkZCBuZXcgZmllbGQgcHJpdl9sZXZlbC4KLQkoc29tX29iamVjdF9zZXR1cCk6IEFkZCBjdXJyZW50X29mZnNldCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoc2V0dXBfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoc29tX29iamVjdF9wKTogRm9yIEVYRUNMSUJNQUdJQywgcmVhZCB0aGUgbHN0IGhlYWRlci4KLQkoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzKTogQWRkIGNvbXBpbGF0aW9uX3VuaXQgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogV3JpdGUgb3V0IGNvbXBpbGF0aW9uX3VuaXQuCi0JKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBTZXQgcHJpdl9sZXZlbC4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBTZXQgeGxlYXN0IGZpZWxkIHRvIDMuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgc3ltYm9sIHByaXZfbGV2ZWwuCi0JKGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogU2V0IHhsZWFzdCBmaWVsZCB0byAzLiAgU2V0Ci0JcHJpdl9sZXZlbCBpbnRvIHN5bWJvbF92YWx1ZS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1UdWUgRGVjICA4IDE2OjIxOjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IENoYW5nZSBjYWxsIHRvIG5vbmV4aXN0ZW50Ci0Jd2FybmluZyBmdW5jdGlvbiB0byBjYWxsIF9iZmRfZXJyb3JfaGFuZGxlciBpbnN0ZWFkLgotCi0JKiBsaWJiZmQuYyAoQ09FUkNFMzIpOiBDYXN0IHRocm91Z2ggdW5zaWduZWQgbG9uZyBhbmQgbG9uZyB0bwotCWF2b2lkIGJ1ZyBpbiBvbGQgdmVyc2lvbiBvZiBnY2MuCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogUmVtb3ZlLgotCShlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IERvbid0IGRlZmluZS4KLQotMTk5OC0xMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBGaXggUEMgcmVsYXRpdmUKLQlyZWxvY2F0aW9ucyB0byBpbmNsdWRlIG9mZnNldCBvZiAyIGluY2x1ZGVkIGluIHRoZSBpbnNucywgYW5kIHRoZQotCW9mZnNldCBvZiB0aGUgcmVsb2NzIHdpdGhpbiB0aGUgc2VjdGlvbi4KLQotV2VkIERlYyAgMiAxNTowMzo1OSAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkgRGF2aWQgVGF5bG9yCi0gCTx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4sIEVkaXRoIEVwc3RlaW4KLSAJPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiwgSmltIEJsYW5keQotIAk8amltYkB6d2luZ2xpLmN5Z251cy5jb20+LCBhbmQgRWxlbmEgWmFubm9uaQotIAk8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+IGFzIHBhcnQgb2YgdGhlIHByb2plY3QgdG8gbWVyZ2UgaW4KLSAJY2hhbmdlcyBvcmlnaW5hbGx5IG1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZwotIAllbnRyaWVzLgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWx0IHVzaW5nIGxhdGVzdAotIAlhdXRvbWFrZSBtYWNybyBsaWJyYXJ5LgotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogdGhpcyBmdW5jdGlvbiBub3cKLSAJdW5kZXJzdGFuZHMgSFBVWCAxMC4zMCB0aHJlYWQgaW5mby4gWWVzLCB0aGUgdGhyZWFkIHN0YWNrcyBjYW4gYmUKLSAJZm91bmQgaW4gdGhlIGNvcmVmaWxlISBBbHNvLCBpbiBocHV4X2NvcmVfY29yZV9maWxlX3AsIGlmIHdlCi0gCWVuY291bnRlciBhIHNlY3Rpb24gd2l0aCBhbiB1bmtub3duIHR5cGUsIGRvbid0IHB1bnQuICBJbnN0ZWFkLAotIAlqdXN0IHNraXAgaXQuICBBbHNvLCBjb3VudCB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIG9mIGtub3duIHR5cGUKLSAJdGhhdCB3ZSBlbmNvdW50ZXIuICBJZiB3ZSBlbmNvdW50ZXIgYXQgbGVhc3Qgb25lIGdvb2Qgb25lLCB0aGVuCi0gCXdlJ2xsIGRlY2xhcmUgdGhhdCB0aGUgZmlsZSBpcyBhIGNvcmUgZmlsZS4gIElmIHdlIGVuY291bnRlciBhbnkKLSAJdW5rbm93biBvbmVzIGJ1dCBzb21lIGtub3duIG9uZXMsIHRoZW4gd2UnbGwgaXNzdWUgYSB3YXJuaW5nIChidXQKLSAJc3RpbGwgZGVjbGFyZSBpdCB0byBiZSBhIGNvcmUgZmlsZSkuIEFsc28sIGNvcnJlY3RseSBkZWNpZGUgd2hlbiBhCi0gCWZpbGUgaXMgbm90IGEgY29yZS4KLQkoUFJPQ19JTkZPX0hBU19USFJFQURfSUQpOiBkZWZpbmUgaWYgQ09SRV9BTk9OX1NITUVNIGRlZmluZWQuCi0JKENPUkVfQU5PTl9TSE1FTSk6IGRlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoaHB1eF9jb3JlX3N0cnVjdCk6IGFkZCBtZW1iZXJzIGx3cGlkIGFuZCB1c2VyX3RpZC4KLQkoY29yZV9rZXJuZWxfdGhyZWFkX2lkLCBjb3JlX3VzZXJfdGhyZWFkX2lkKTogbmV3IG1hY3Jvcy4KLQkobWFrZV9iZmRfYXNlY3Rpb24pOiB1c2UgYmZkX2FsbG9jIHRvIGFsbG9jYXRlIHJvb20gZm9yIGEgY29weSBvZgotIAl0aGUgbmFtZSBiZWZvcmUgc3RvcmluZyBpdCBpbiB0aGUgYmZkLgotCShocHV4X2NvcmVfY29yZV9maWxlX3ApOiBoYW5kbGUgdGhyZWFkcy4KLQotCSogbGliaHBwYS5oIChHRVRfRklFTEQpOiBwcm90ZWN0IGFnYWluc3QgcmVkZWZpbml0aW9uLgotCShIUFBBX1dJREUpOiBkZWZpbmUuCi0JKEdFVF9GSUVMRCk6IGRlZmluZS4KLQkoR0VUX0JJVCk6IGRlZmluZS4KLQkoTUFTSyk6IGRlZmluZS4KLQkoQ0FURU5BVEUpOiBkZWZpbmUuCi0JKEVMRVZFTik6IGRlZmluZS4KLQkoc2lnbl9leHRlbmQpOiByZWRlZmluZS4KLQkoYXNzZW1ibGVfNik6IGRlZmluZS4KLQkoYXNzZW1ibGVfMTIpOiByZXdyaXRlLgotCShhc3NlbWJsZV8xNik6IGRlZmluZS4KLQkoYXNzZW1ibGVfMTZhKTogZGVmaW5lLgotCShhc3NlbWJsZV8xNyk6IHJld3JpdGUuCi0JKGFzc2VtYmxlXzIyKTogZGVmaW5lLgotCi0xOTk4LTEyLTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IFVzaW5nIHNpZ25lZAotCXJlbG9jYXRpb25zIGZvciBzaWduZWQgdmFsdWVzLgotCi1TdW4gRGVjICA2IDE2OjMwOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwc2JzZC5jIChNWShzZXRfYXJjaF9tYWNoKSk6IE1ha2Ugc3RhdGljLgotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBGb3IgYmZkX2FyY2hfbWlwcywgdXNlCi0JYmZkX21hY2hfbWlwcyogbWFjcm9zIHJhdGhlciB0aGFuIHNpbXBsZSBudW1iZXJzLgotCi0JQ09GRiB3ZWFrIHN5bWJvbCBzdXBwb3J0LCBiYXNlZCBvbiBwYXRjaGVzIGZyb20gTWFyayBFbGJyZWNodAotCTxzbm93YmFsbDNAdXNhLm5ldD46Ci0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEhhbmRsZSBDX1dFQUtFWFQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCi0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBbHdheXMgaW5pdGlhbGl6ZSB0aGUKLQlpbmNsdWRlc19waGRycyBmaWVsZC4KLQotCSogZWxmbGluay5oIChlbGZfZml4X3N5bWJvbF9mbGFncyk6IENoZWNrIGZvciBjYXNlIHdoZXJlIGEgbm9uLUVMRgotCWZpbGUgZGVmaW5lcyBhIHN5bWJvbCBmaXJzdCBtZW50aW9uZWQgaW4gYW4gRUxGIGZpbGUuCi0KLQkqIGJmZC1pbi5oOiBBbHdheXMgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBhbmQgQkZEX0hPU1RfVV82NF9CSVQgaWYKLQlwb3NzaWJsZSwgcmF0aGVyIHRoYW4gb25seSBpZiBCRkQ2NC4KLQkqIGVsZmxpbmsuaCAoY29tcHV0ZV9idWNrZXRfY291bnQpOiBKdXN0IGNoZWNrIEJGRF9IT1NUX1VfNjRfQklULAotCW5vdCBfX0dOVUNfXy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ29ycmVjdCB0ZXN0IHRvIGF2b2lkCi0Jc3dpdGNoaW5nIHRvIDQgYnl0ZSBhZGRyZXNzZXMgYWZ0ZXIgc2VlaW5nIGEgc2Vjb25kIHNlY3Rpb24gd2hpY2gKLQlyZXF1aXJlcyAzIGJ5dGUgYWRkcmVzc2VzLiAgRnJvbSBKb2VsIFNjaGFudHoKLQk8am9lbC5zY2hhbnR6QGFyZ29zeXMuYm9laW5nLmNvbT4uCi0KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gQXltZXJpYyBWaW5jZW50Ci0JPGF5bWVyaWMudmluY2VudEBlbWkudS1ib3JkZWF1eC5mcj4uCi0KLTE5OTgtMTItMDQgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEZpeCBsb2dpYyB0bwotCWRlY2lkZSB3aGV0aGVyIHRoZSBvdXRwdXQgZmlsZSBpcyAtbXJlbG9jYXRhYmxlLWxpYiwKLQktbXJlbG9jYXRhYmxlLCBvciBuZWl0aGVyLiAgKGdkYi5iYXNlL25vZGVidWcuZXhwKQotCi0xOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmM6IEFkZCBzdXBwb3J0IGZvciBSX0ZSMzBfNDggcmVsb2MuCi0JKiByZWxvYy5jOiBBZGQgQkZEX1JFTE9DX0ZSMzBfNDggcmVsb2NhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlCi0KLVdlZCBEZWMgIDIgMDA6NTg6MzcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBXYXJuIG9uIGFuIGF0dGVtcHQgdG8KLQlsaW5rIGFnYWluc3QgYSBkeW5hbWljIHN5bWJvbCB3aXRoIG5vIHR5cGUgb3Igc2l6ZS4KLQotMTk5OC0xMi0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoaTM4Nl9jaGVja19yZWxvY3MpIFtSXzM4Nl8zMl06IERvbid0IGVtaXQKLQlyZWxvY2F0aW9uIGZvciBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGdldCBsb2FkZWQuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pIFtSXzM4Nl8zMl06IExpa2V3aXNlLgotCi1UdWUgRGVjICAxIDExOjMzOjMzIDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jIChoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyk6IE1ha2UgcmVsb2Nfc2l6ZSwKLQlyZWxvY19jb3VudCBhbmQgaSBsb25nIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4gIEhhbmRsZSBlcnJvcgotCXJldHVybiBmcm9tIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0KLTE5OTgtMTItMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERldGVjdCB0aGUgYWJzZW5jZSBvZgotCWEgaGFzaCB0YWJsZS4KLQotTW9uIE5vdiAzMCAxNToyODowOSAxOTk4ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZjMyLXNoLmMgKGVsZi9zaC5oKTogSW5jbHVkZS4KLQlzaF9yZWxvY190eXBlOiBEZWxldGUuICBDaGFuZ2VkIGFsbCByZWZlcmVuY2VzIHRvIGVsZl9zaF9yZWxvY190eXBlLgotCShzaF9lbGZfaG93dG9fdGFiKTogQWRkIEhPV1RPIGZvciBSX1NIX1NXSVRDSDguCi0JKHNoX3JlbG9jX21hcCk6IE1hcCBCRkRfUkVMT0NfOF9QQ1JFTCB0byBSX1NIX1NXSVRDSDguCi0JKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBIYW5kbGUgUl9TSF9TV0lUQ0g4LgotCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmN5IG9mIGVsZjMyLXNoLmxvIG9uICQoSU5DRElSKS9lbGYvc2guaC4KLQotRnJpIE5vdiAyNyAxNzo1MTozOCAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGZsaW5rLmggKGNvbXB1dGVfYnVja2V0X2NvdW50KTogRG9uJ3QgYWxsb3cgbWluc2l6ZT09MCwgaXQKLQljYXVzZXMgZGl2aXNpb24gYnkgemVybyBsYXRlciBvbi4KLQotVGh1IE5vdiAyNiAxMToxOTozNSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfcGM5X3JlbG9jLGZyMzBfZWxmX3BjMTJfcmVsb2MpOiBOb3QKLQluZWVkZWQuCi0KLTE5OTgtMTEtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogUmVtb3ZlIGhhY2suICBVc2UgbmV3IGVtdWxhdGlvbgotCWhvb2sgbm93LgotCi1UdWUgTm92IDI0IDEwOjI1OjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwKLQlmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0JKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIEkyMCBhbmQgSTMyCi0JcmVsb2NzLgotCShmcjMwX2VsZl9pMzJfcmVsb2MpOiBOZXcgZnVuY3Rpb246IEhhbmRsZSBJMzIgcmVsb2NzLgotCShmcjMwX2VsZl9wYzlfcmVsb2MpOiBOZXcgZnVuY3Rpb246IEhhbmRsZSA5X1BDUkVMIHJlbG9jcy4KLQkoZnIzMF9lbGZfcGMxMl9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIDEyX1BDUkVMIHJlbG9jcy4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVzZXQgaGkxNnMgcmVsb2MKLQljaGFpbiB0byBlbXB0eS4KLQotCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyBhcmUgYmFzZWQgb24gYSBwYXRjaCBzdWJtaXR0ZWQgYnkgR2lhbmx1Y2EKLQlNb3JvIDxnbGN0ckBhYmMuaXQ+OgotCi0JKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IE9ubHkgdXBkYXRlIGEgaGkxNnMgcmVsb2MgaWYgaXQgaGFzCi0Jbm90IGFscmVhZHkgYmVlbiB1cGRhdGVkLgotCShmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MpOiBOZXcgcGFyYW1ldGVyICdhbHJlYWR5X2ZvdW5kJwotCXJldHVybnMgc3RhdGUgb2YgcmVtZW1iZXJlZCBoaTE2cyByZWxvYy4KLQkocmVtZW1iZXJfaGkxNnNfcmVsb2MpOiBTZXQgJ2ZvdW5kJyBmaWVsZCB0byBmYWxzZS4KLQkoaGkxNnNfbG9jYXRpb24pOiBBZGQgJ2ZvdW5kJyBmaWVsZC4KLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChiZmRfcGVfZGxsX25vdF9yZWNvZ25pemVkX2hhY2spOiB0aGUgbGlua2VyIHdhbnRzCi0JdG8gc2VlIC5ETEwgZmlsZXMgYXMgdW5yZWNvZ25pemVkLgotCShpM2NvZmZfb2JqZWN0X3ApOiBTb3JyeSwgaGFkIHRvIGhhY2sgaXQgdG8gbm90IHJlY29nbml6ZSB0aGVzZQotCWZpbGVzIChwZWktaTM4Nikgb24gcmVxdWVzdC4KLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIG9wbmNscy5jIChiZmRfbWFrZV9yZWFkYWJsZSk6IG5lZWQgbW9yZSBjbGVhbnVwIGZvciBzeW1ib2xzIGFuZAotCXJlbGVudHMuICBDYWxsIGJmZF9jaGVja19mb3JtYXQgdG8gcmVpbml0aWFsaXplLgotCi1GcmkgTm92IDIwIDE0OjIxOjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBzcHVyaW91cwotCXdhcm5pbmdzLgotCi1UaHUgTm92IDE5IDE0OjQyOjE1IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IHJlZ2VuZXJhdGUKLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgTm92IDE3IDIwOjIzOjM1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgdnRhYmxlX2VudHJpZXNfc2l6ZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IENsZWFyIGl0LgotCSogZWxmbGluay5oIChlbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQpOiBDb3B5IGl0LCBhbmQKLQlyZXNwZWN0IGl0IGFzIGFuIHVwcGVyIGJvdW5kIG9uIHdoYXQgbWVtb3J5IHRvIHJlZmVyZW5jZS4KLQkoZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcyk6IExpa2V3aXNlLgotCShlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBIYW5kbGUgYXMteWV0IHVuZGVmaW5lZCB2dGFibGVzLiAgU2V0IGFuZAotCXVwZGF0ZSB2dGFibGVfZW50cmllc19zaXplIGFwcHJvcHJpYXRlbHkuCi0KLVR1ZSBOb3YgMTcgMTU6Mjg6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX3JlbG9jX3R5cGVfbG9va3VwKTogVXNlZCBpbnRlZ2VycyB0byBob2xkCi0JcmVsb2MgbnVtYmVyLgotCi1Nb24gTm92IDE2IDIyOjE5OjIxIDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtKTogc3VwcG9ydCBCRkRfSU5fTUVNT1JZCi0gCWJmZHM7IHRoZXkgaGF2ZSBubyAiZmlsZSIgc28gd2UgZmFrZSBpdC4KLQkqIGJmZC1pbjIuaDogYWRkIGJmZF9tYWtlX3dyaXRhYmxlIGFuZCBiZmRfbWFrZV9yZWFkYWJsZSAocmVnZW4pCi0JKiBsaWJiZmQuYyAoYmZkX3dyaXRlKTogQWxsb3cgd3JpdGluZyB0byBCRkRfSU5fTUVNT1JZIGJmZHMgYnkKLSAJcmVzaXppbmcgdGhlIG1lbW9yeSBidWZmZXIuCi0JKiBvcG5jbHMuYyAoYmZkX21ha2Vfd3JpdGFibGUpOiBOZXcgZnVuY3Rpb247IGxldHMgeW91IHdyaXRlIGEKLSAJYmZkX2NyZWF0ZSdkIGJmZCB0byBhbiBpbi1tZW1vcnkgYnVmZmVyLgotCShiZmRfbWFrZV9yZWFkYWJsZSk6IE5ldyBmdW5jdGlvbjsgbGV0cyB5b3UgcmVhZCBiYWNrIHRoYXQgYnVmZmVyCi0gCWFzIGlmIGl0IHdlcmUgZnJvbSBiZmRfb3BlbnIuICBVc2VkIHRvIGJ1aWxkIGdlbmVyYXRlZCBhcmNoaXZlCi0gCW1lbWJlcnMgKHdpbnN1cCdzIGxkJ3MgZGxsdG9vbCkKLQotTW9uIE5vdiAxNiAxOToxNToxOSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2JmZC5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTm92IDE2IDEwOjU3OjA2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAoaGkxNnNfbG9jYXRpb24pOiBSZXBsYWNlZCBmaXhlZCBzaXplIGFycmF5IHdpdGgKLQlsaW5rZWQgbGlzdC4KLQotU3VuIE5vdiAxNSAyMDoyODoyNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uKTogU2VhcmNoIGZvciB0aGUgcHJvcGVyCi0JZWxlbWVudCBvZiB0aGUgZ290ZW50cnkgbGlzdCBmb3IgbG9jYWwgc3ltYm9scyB0b28uCi0JKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBVbmlmeSBsb2NhbCBhbmQgZ2xvYmFsIGhhbmRsaW5nLgotCUFzc2VydCB0aGF0IGdvdGVudC0+dXNlX2NvdW50ID4gMC4KLQotU2F0IE5vdiAxNCAxNToxNjowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodm1zX2FscGhhX3ZlYyk6IFJlbmFtZSBmcm9tIGV2YXhfYWxwaGFfdmVjLCBhbmQKLQl1cGRhdGUgZm9yIGZpbGUgbmFtZSBjaGFuZ2VzIG9mIEp1bHkgMiwgMTk5OC4KLQkodm1zX3ZheF92ZWMpOiBOZXcuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBOb3YgMTIgMTk6MTk6NTQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9iZmQucG90OiBSZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAxMCAxNjoxNzowNiAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQsIGNvbmZpZy5iZmQ6IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBOb3YgMTAgMTU6MTM6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciBiZmRfYXJjaF9mcjMwLgotCi1UdWUgTm92IDEwIDEzOjM3OjM2IDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00IChCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUsCi0gCUJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIpOiBkaWRuJ3QgZGVmaW5lIG1hY3JvIHdoZW4gdmFsdWUKLSAJd2FzIGNhY2hlZC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMTAgMTQ6MzE6MDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1kMTB2LmMgKHJlbG9jX3R5cGUpOiAgQWRkIFJfRDEwVl9HTlVfVlRJTkhFUklUIGFuZAotICAgICAgICBSX0QxMFZfR05VX1ZURU5UUlkgcmVsb2NzLgotICAgICAgICAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiAgTGlrZXdpc2UuCi0gICAgICAgIChkMTB2X3JlbG9jX21hcCBkMTB2X3JlbG9jX21hcCk6ICBMaWtld2lzZS4KLSAgICAgICAgKGVsZjMyX2QxMHZfZ2NfbWFya19ob29rKTogIE5ldy4KLSAgICAgICAgKGVsZjMyX2QxMHZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcuCi0gICAgICAgIChlbGYzMl9kMTB2X2NoZWNrX3JlbG9jcyk6ICBOZXcuCi0gICAgICAgIChlbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24pOiAgTmV3LgotICAgICAgICAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6ICBEZWZpbmUuCi0gICAgICAgIChlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCi1TYXQgTm92ICA3IDE4OjA3OjUxIDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXRlci5zY2hhdWVyQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IE1vdmUgdm1zIGZpbGVzIGhlcmUuLi4KLQkoQkZENjRfQkFDS0VORFMpOiAuLi5mcm9tIGhlcmUuCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IE1vdmUgdm1zIGZpbGVzIGhlcmUuLi4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogLi4uZnJvbSBoZXJlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBOb3YgIDQgMTU6NTg6NDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBGUjMwIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgRlIzMCB0YXJnZXQuCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3IgRlIzMC4KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBGUjMwLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgRlIzMC4KLQkqIHJlbG9jLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHJlbG9jYXRpb25zLgotCSogdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCByZWxvY2F0aW9ucy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiAgUmVnZW5lcmF0ZS4KLQkqIGNwdS1mcjMwLmM6IE5ldyBmaWxlLgotCSogZWxmMzItZnIzMC5jOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgMiAxNDo1OTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotU3VuIE5vdiAgMSAxOTozMjoyOCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IERvIG5vdCB1c2UgYWxsb2NhLAotCXVzZSBiZmRfbWFsbG9jIGFuZCBmcmVlIGluc3RlYWQgYW5kIGNoZWNrIHJldHVybiB2YWx1ZSBmcm9tIGJmZF9tYWxsb2MuCi0KLVN1biBOb3YgIDEgMTY6MjA6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZHluc3ltX3NlY19uYW1lcyk6IENvbW1lbnQgb3V0LgotCShTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVMpOiBMaWtld2lzZS4KLQkoTUlQU19URVhUX0RZTlNZTV9TRUNOKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IERvbid0IHNldCBzaF9pbmZvIGZpZWxkIG9mIGEgLmhhc2gKLQlzZWN0aW9uLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogUmVtb3ZlIGR5bnN5bV9zZWNfc3RyaW5kZXgKLQlmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERvbid0IGluaXRpYWxpemUKLQlkeW5zeW1fc2VjX3N0cmluZGV4LgotCShtaXBzX2VsZl9nY19tYXJrX2hvb2spOiBBZGQgZGVmYXVsdCBjYXNlIHRvIGF2b2lkIHdhcm5pbmcuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEdlbmVyYXRlIGEgc2VjdGlvbiBzeW1ib2wgZm9yCi0JZXZlcnkgb3V0cHV0IHNlY3Rpb24uCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQ291bnQgYWxsIHNlY3Rpb25zIGZvcgotCURUX01JUFNfVU5SRUZFWFROTy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgZHluYW1pYyBzeW1ib2xzIGZvciBhbGwKLQlvdXRwdXQgc2VjdGlvbnMuCi0KLVN1biBOb3YgIDEgMTI6NDY6NTMgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQWxsb2NhdGUgdHdvIHNsb3RzCi0JZm9yIGxhdGVyIFBMVCBlbnRyaWVzIGluIGxhcmdlIFBMVHMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQWxsb3cgZm9yIHRoZSBleHRyYSBzbG90cy4KLQotU2F0IE9jdCAzMSAyMDoxMDowOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9hZF9zZWN0aW9uKTogRml4IHR5cG8uCi0KLTE5OTgtMTAtMjYgMTU6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZCBlbGZfaGFzaF92YWx1ZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2NvbGxlY3RfaGFzaF9jb2Rlcyk6IE5ldyBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMKLQljYWxsZWQgZm9yIGVhY2ggZXhwb3J0ZWQgc3ltYm9sIGFuZCB3ZSBjb21wdXRlIHRoZSBFTEYgaGFzaCB2YWx1ZSBmb3IKLQlpdC4KLQkoY29tcHV0ZV9idWNrZXRfdmFsdWUpOiBOZXcgZnVuY3Rpb24uICBJdCBpcyBjYWxsZWQgZnJvbQotCXNpemVfZHluYW1pY19zZWN0aW9ucyB0byBkZXRlcm1pbmUgdGhlIGhhc2ggdGFibGUgc2l6ZS4gIFdoZW4gd2UgYXJlCi0Jb3B0aW1pemluZyBhIGJldHRlciwgYnV0IHNsb3dlciwgYWxnb3JpdGhtIGlzIHVzZWQuCi0JKHNpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgY29tcHV0ZV9idWNrZXRfdmFsdWUuCi0KLQkqIGVsZi5jIChiZmRfZWxmX2hhc2gpOiBPcHRpbWl6ZSB0aGUgaGFzaCBmdW5jdGlvbiBhIGJpdC4KLQotTW9uIE9jdCAxOSAyMDowMzoyMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLXNoLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9TSF9HTlVfVlRJTkhFUklUIGFuZAotICAgICAgICBSX1NIX0dOVV9WVEVOVFJZLgotICAgICAgICAoc2hfZWxmX2djX21hcmtfaG9vayk6ICBOZXcuCi0gICAgICAgIChzaF9lbGZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcuCi0gICAgICAgIChzaF9lbGZfY2hlY2tfcmVsb2NzKTogIE5ldy4KLSAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLU1vbiBPY3QgMTkgMTY6NTc6MDUgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IHVuZG8gcHJldmlvdXMgZ2V0dGV4dCBjaGFuZ2UKLQkqIGFjbG9jYWwubTQ6IHJlYnVpbGQgd2l0aCByaWdodCB2ZXJzaW9uIG9mIGFjbG9jYWwuCi0KLU1vbiBPY3QgMTkgMDE6NDc6MjEgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQsIGFjbG9jYWwubTQ6IG1vdmUgZ2V0dGV4dC1yZWxhdGVkIGZyYWdtZW50cyBmcm9tCi0gCWFjbG9jYWwubTQgdG8gYWNpbmNsdWRlLm00LCBzbyB0aGV5IGRvbid0IGdldCBsb3N0LgotCi0JKiBlbGZjb3JlLmg6IHJld3JpdGUgZm9yIGJldHRlciBjb3JlZmlsZSBzdXBwb3J0LgotCSogZWxmLmMgKGVsZmNvcmVfKik6IG5ldyBmdW5jdGlvbnMuCi0JKiBlbGYtYmZkLmggKGVsZl9vYmpfdGRhdGEpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCi0JKiBhY2NvbmZpZy5oLCBhY2luY2x1ZGUubTQsIGNvbmZpZ3VyZS5pbjogYWRkIGZlYXR1cmUtdGVzdHMgZm9yCi0gCWZsYXZvciBvZiBwcm9jZnMuCi0JKiBhY2xvY2FsLm00LCBjb25maWcuaW4sIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGVkLgotCi1GcmkgT2N0IDE2IDE0OjA3OjQ1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItbTMyci5jOiAgQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfTTMyUl9HTlVfVlRJTkhFUklUCi0gICAgICAgIGFuZCBSX00zMlJfR05VX1ZURU5UUlkuCi0gICAgICAgIChlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotICAgICAgICAobTMycl9lbGZfY2hlY2tfcmVsb2NzKTogIE5ldy4KLSAgICAgICAgKG0zMnJfZWxmX2djX21hcmtfaG9vayk6ICBOZXcuCi0gICAgICAgIChtMzJyX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldy4KLSAgICAgICAgKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgSGFuZGxlIFZUIHJlbG9jcy4KLQotTW9uIE9jdCAxMiAxNDoxODo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhcm1fcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSByZWR1bmRhbnQgdGVzdC4KLQotCSogYmZkLWluMi5oIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogSW1wcm92ZSBjb21tZW50IHRvIG1ha2UKLQljbGVhdCB0aGF0IHRoZSAnYml0c2l6ZScgZmllbGQgaXMgdGhlIHNpemUgb2YgdGhlIGJpdGZpZWxkIEFGVEVSCi0JcmVsb2NhdGlvbiBub3QgYmVmb3JlLgotCi0JKiBlbGYzMi1tMzJyLmMgKFJfTTMyUl8xOF9QQ1JFTCk6IEZpeCBzaXplIG9mIGJpdGZpZWxkLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9oaSk6IENvcGUgd2l0aCBtaXNzaW5nIHJlZmhpIG9yIHJlZmxvCi0JcmVsb2NzLgotCi1UdWUgT2N0ICA2IDA5OjIwOjQ0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItc3BhcmMuYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1NQQVJDX0dOVV9WVElOSEVSSVQgYW5kCi0gICAgICAgIFJfU1BBUkNfR05VX1ZURU5UUlkuCi0gICAgICAgIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiAgSGFuZGxlIHRoZW0uCi0gICAgICAgIChlbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCk6ICBMaWtld2lzZS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiAgTGlrZXdpc2UuCi0gICAgICAgIChlbGYzMl9zcGFyY19nY19tYXJrX2hvb2spOiAgTmV3LgotICAgICAgICAoZWxmMzJfc3BhcmNfZ2Nfc3dlZXBfaG9vayk6ICBOZXcuCi0KLU1vbiBPY3QgIDUgMTQ6NTU6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2ZpbmlzaF93cml0aW5nKTogUGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3Mgd2hlbgotCXdyaXRpbmcgYW4gZXhlY3V0YWJsZSBvciBzaGFyZWQgbGlicmFyeS4KLQotTW9uIE9jdCAgNSAxMjowMjozMSAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZHdhcmYxLmMgOiBOZXcgZmlsZS4gIEFkZHMgX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBjb25maWd1cmUuaW4gKGVsZik6IEFkZCBkd2FyZjEubG8uCi0JKiBlbGZfYmZkLmggKGVsZl9vYl90ZGF0YSk6IEFkZCBkd2FyZjFfZmluZF9saW5lX2luZm8uCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBBZGQgY2FsbCB0bwotCV9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKToKLQlBZGQgY2FsbCB0byBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIE9jdCAgNSAxMDowNjoyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZmxpbmsuaCAoZWxmX2djX3NlY3Rpb25zKTogIERvIG5vdCBhbGxvdyBnYXJiYWdlCi0gICAgICAgIGNvbGxlY3Rpb24gaWYgZHluYW1pYyBzZWN0aW9ucyBoYXZlIGJlZW4gY3JlYXRlZC4KLQotTW9uIE9jdCAgNSAwOTowNzozNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLXY4NTAuYzogQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfVjg1MF9HTlVfVlRJTkhFUklUIGFuZAotICAgICAgICBSX1Y4NTBfR05VX1ZURU5UUlkuCi0gICAgICAgICh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiAgSGFuZGxlIFZUSU5IRVJJVCBhbmQgVlRFTlRSWSByZWxvY3MuCi0gICAgICAgICh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiAgTGlrZXdpc2UuCi0gICAgICAgICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIExpa2V3aXNlLgotICAgICAgICAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBMaWtld2lzZS4KLSAgICAgICAgKHY4NTBfZWxmX2djX3N3ZWVwX2hvb2spOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgICh2ODUwX2VsZl9nY19tYXJrX2hvb2spOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCi1Nb24gT2N0ICA1IDA5OjA0OjI1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItbTY4ay5jIChlbGZfbTY4a19nY19zd2VlcF9ob29rKTogIERvbid0IGFzc3VtZQotICAgICAgICB0aGF0IGR5bm9iaiBleGlzdHMuCi0KLVN1biBPY3QgIDQgMjM6Mjk6MzQgMTk5OCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKToKLQlEZWNsYXJlIHNpemUgYXMgYmZkX3NpemVfdHlwZS4KLQkocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlY2xhcmUgY291bnQgYXMgYmZkX3NpemVfdHlwZS4KLQotU3VuIE9jdCAgNCAyMDozODoyOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNwdS1ocHBhLmMgKGJmZF9ocHBhMjBfYXJjaCk6IERlZmluZS4gIExpbmsgaXQgaW50byB0aGUgYmZkX2hwcGFfYXJjaAotCXN0cnVjdHVyZS4KLQkqIHNvbS5jIChDUFVfUEFfUklTQzJfMCk6IERlZmluZS4KLQkoX1BBX1JJU0MyXzBfSUQpOiBMaWtld2lzZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogVXNlIENQVV9QQV9SSVNDMl8wIGZvciB0aGUgc3lzdGVtX2lkIGFzIG5lZWRlZC4KLQotU3VuIE9jdCAgNCAyMToxOTowOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBhIHZlcnNpb25lZCBzeW1ib2wKLQloYXMgYSBiYXNlIHdoaWNoIGlzIGFscmVhZHkgZGVmaW5lZCwgb25seSBhZGQgdGhlIHJlZmVyZW5jZWQKLQlzeW1ib2wgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGl0IGlzIGRlZmluZWQgb3IgcmVmZXJlbmNlZAotCWJ5IGEgcmVndWxhciBmaWxlLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogSGFuZGxlIHZ0YWJsZSByZWxvY3MKLQljb3JyZWN0bHkuCi0KLTE5OTgtMDktMjcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0gICAgICAgICogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1XZWQgU2VwIDIzIDE2OjA5OjMxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHJlY29yZCBhIGR5bmFtaWMKLSAgICAgICAgc3ltYm9sIGZvciB0aGUgaW5kaXJlY3QgYWxpYXMgdG8gYSB2ZXJzaW9uZWQgc3ltYm9sLgotCi1Nb24gU2VwIDIxIDEyOjE1OjIyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItaTM4Ni5jIChlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byk6IE5ldy4KLSAgICAgICAgKGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0byk6IE5ldy4KLSAgICAgICAgKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogIFJldHVybiBlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG8KLSAgICAgICAgb3IgZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG8gIG9uIGxvb2t1cC4KLQotU3VuIFNlcCAyMCAwMDo0ODowNyAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jOiBJbmNsdWRlICJlbGYvbTY4ay5oIi4gIFJlbW92ZSBkZWZpbml0aW9uIG9mIGVudW0KLQlyZWxvY190eXBlLiAgUmVuYW1lIFJfNjhLX19tYXggdG8gUl82OEtfbWF4LgotCShob3d0b190YWJsZSk6IFVzZSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuIGZvciBhIFZURU5UUlkKLQlyZWxvYy4KLQotU3VuIFNlcCAyMCAwMDowOToyNSAxOTk4ICBDaHJpcyBUb3JlayAgPHRvcmVrQGJzZGkuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldGIzMik6IFJld3JpdGUgZXhwcmVzc2lvbiB0byBnZXQgYmV0dGVyIGNvZGUuCi0JKGJmZF9nZXRsMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX2dldGxfc2lnbmVkXzMyKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC5jIChiZmRfbG9nMik6IENhc3QgdG8gYmZkX3ZtYSBiZWZvcmUgc2hpZnRpbmcsIG5vdAotCWFmdGVyLgotCi1TYXQgU2VwIDE5IDIyOjQyOjIzIDE5OTggIERvdWcgUmFic29uICA8ZGZyQG5sc3lzdGVtcy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRW5zdXJlIHRoYXQgdGhlIHdhcm5pbmcKLQltZXNzYWdlIGhhcyBhIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLgotCi1GcmkgU2VwIDE4IDE0OjM1OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogSWdub3JlIGNvbnRlbnRzIG9mCi0Jd29yZCBzdWJqZWN0IHRvIFJfVjg1MF8zMiByZWxvY2F0aW9uLgotCi1UaHUgU2VwIDE3IDE3OjIwOjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5jOiBBZGQgY29tbWVudCBkZXNjcmliaW5nIHByb2JsZW0gY29tcHV0aW5nIGxpbmUgbnVtYmVycwotCWZvciB1bmRlZmluZWQgc3ltYm9scyBhdCBsaW5rIHRpbWUuCi0KLVRodSBTZXAgMTcgMTY6MDM6MjggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0Ci0gICAgICAgIHRyYW5zZm9ybSBhIGRlZndlYWsgaW50byBhIHBsdCBlbnRyeS4KLSAgICAgICAgKGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzKTogQWxsb3cgcm9vbSBmb3Igc2Vjb25kYXJ5Ci0gICAgICAgIHBsdCBlbnRyeSByZWZlcmVuY2VzIHRvIHJlY2VpdmUgYSBSRUxBVElWRSByZWxvYy4KLSAgICAgICAgKGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpbGwgdGhlbSBpbi4KLSAgICAgICAgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBBc3NlcnQgd2UgZG9uJ3Qgb3ZlcnJ1bgotICAgICAgICB0aGUgYWxsb2NhdGVkIHJlbG9jYXRpb24gc3BhY2UuCi0KLVdlZCBTZXAgMTYgMTg6MDM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBBbHdheXMgdHJlYXQgc2VjdGlvbiBzeW1ib2xzIGFzCi0Jc3BlY2lhbCwgZXZlbiBpZiB0aGV5IGFyZSBhdHRhY2hlZCB0byBhIGNvbW1vbiBzZWN0aW9uLgotCi1XZWQgU2VwIDE2IDEwOjM0OjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBNb3ZlIHN5bWJvbHMgaW4KLQlzZWN0aW9ucyB3aXRoIHY4NTAgY29tbW9uIHNlY3Rpb24gYXR0cmlidXRlcyBpbnRvIG5hbWVkIHY4NTAKLQljb21tb24gc2VjdGlvbnMuCi0JKHY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vayk6IE1vdmUgc3ltYm9scyBpbiBzZWN0aW9ucyB3aXRoIHY4NTAKLQljb21tb24gc2VjdGlvbiBhdHRyaWJ1dGVzIGludG8gbmFtZWQgdjg1MCBjb21tb24gc2VjdGlvbnMuCi0KLVdlZCBTZXAgMTYgMTE6MjY6NDkgQ0RUIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9nY19tYXJrX2hvb2spOiAgUmVtb3ZlIHByaW50Ci0gICAgICAgIHN0YXRlbWVudC4KLQotMTk5OC0wOS0xNSAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJldmVyc2Ugb3V0cHV0X29mZnNldAotCXBhcnQgb2YgVmxhZGltaXIncyBjaGFuZ2Ugb2YgMTk5OC0wOC0xOS4gIE1ha2UgYSBSX1BQQ19TREFSRUwxNgotCXJlbG9jIHRvIHRoZSB3cm9uZyBzZWN0aW9uIGEgd2FybmluZywgbm90IGFuIGVycm9yLiAgLmR5bnNic3MKLQlpcyBub3QgYW4gb3V0cHV0IHNlY3Rpb24sIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGl0LgotCi1UdWUgU2VwIDE1IDEyOjQwOjA1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYtYmZkLmg6ICBBZGQgYXJndW1lbnQgdG8gZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotCi1UdWUgU2VwIDE1IDA4OjM0OjQwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6ICBQYXNzIHR5cGUgdG8gZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotICAgICAgICogZWxmMzItYXJtLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9BUk1fR05VX1ZUSU5IRVJJVCBhbmQKLSAgICAgICBSX0FSTV9HTlVfVlRFTlRSWS4KLSAgICAgICAoZWxmMzJfYXJtX2djX21hcmtfaG9vayk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2djX3N3ZWVwX2hvb2spOiBOZXcuCi0gICAgICAgKGVsZjMyX2FybV9jaGVja19yZWxvY3MpOiBOZXcuCi0gICAgICAgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIEhhbmRsZSBWVElOSEVSSVQgYW5kIFZURU5UUlkKLSAgICAgICByZWxvY2F0aW9ucy4KLSAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgVlRJTkhFUklUIGFuZCBWVEVOVFJZCi0gICAgICAgcmVsb2NhdGlvbnMuCi0KLTE5OTgtMDktMTAgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLSAgICAgICAgKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgZHlub2JqIGlzIE5VTEwsCi0gICAgICAgIGFzc3VtZSB0aGVyZSBpcyBubyBQTFQgb3IgR09ULgotCi1XZWQgU2VwICA5IDE0OjI0OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUpOiBOZXcgZnVuY3Rpb246ICBqdXN0Ci0JbGlrZSBfZWxmX2JmZF9maW5kX25lYXJlc3RfbGluZSgpIGV4Y2VwdCB0aGF0IFNUVF9BUk1fVEZVTkMgaXMKLQlhbHNvIGFjY2VwdGVkIGFzIGEgZnVuY3Rpb24gc3ltYm9sIHR5cGUuCi0KLU1vbiBTZXAgIDcgMTM6MjQ6MDMgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiByczYwMDAtY29yZS5jIChfTE9OR19MT05HKTogIERlZmluZSBmb3IgQUlYIDQueCBvbmx5LgotCi1TYXQgU2VwICA1IDIwOjQwOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyk6IENvcnJlY3QgZGVmaW5pdGlvbiB0bwotCW1hdGNoIGRlZmluaXRpb24gb2YgX2JmZF9nY19zZWN0aW9ucyBmaWVsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1GcmkgU2VwICA0IDEzOjU0OjIzIDE5OTggIERhdmlkIE1pbGxlciAgPGRhdmVtQGRtLmNvYmFsdG1pY3JvLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFByb3Blcmx5IGFkanVzdAotCXRoZSBhZGRlbmQgb2YgYSBkeW5hbWljIHJlbG9jYXRpb24gcmVmZXJlbmNpbmcgYSBzZWN0aW9uLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaXggdGhlIFBMVCByZWxvY2F0aW9uIG9mZnNldC4KLQotVGh1IFNlcCAgMyAxNzoyODo1MCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGJmZF9lbGZOTl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBWZXJpZnkgdGhhdCB0aGUKLQliZWQgaGFzIGEgc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJvdXRpbmUgYmVmb3JlIHRyeWluZyB0byB1c2UgaXQuCi0KLU1vbiBBdWcgMzEgMTQ6NDk6MjIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byk6IFVzZQotCV9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4uCi0KLU1vbiBBdWcgMzEgMTA6MjM6NDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5hbTogIEFkZCBlbGYzMi1hcm0uYy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlYnVpbGQuCi0gICAgICAgICogZWxmLWJmZC5oOiAgQWRkIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLSAgICAgICAgKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6ICBJZiBkZWZpbmVkLCBjYWxsCi0gICAgICAgIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLSAgICAgICAgKiBlbGYzMi1hcm0uYzogRGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLSAgICAgICAgKGVsZjMyX2FybV9nZXRfc3ltYm9sLXR5cGUpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChyZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUpOiAgQ2hhbmdlIHRvIHVzZSBTVFRfQVJNX1RGVU5DLgotICAgICAgICAoYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogIENoYW5nZSB0bwotICAgICAgICBjaGVjayBmb3IgU1RUX0FSTV9URlVOQy4KLSAgICAgICAgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIExpa2V3aXNlLgotICAgICAgICAqIGVsZnh4LXRhcmdldC5oOiAgQWRkIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQotRnJpIEF1ZyAyOCAxOTo0NDowNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9hbHBoYV9ldls0NTZdKTogTmV3LgotCSogY3B1LWFscGhhLmM6IFJld29yayB0byBtYXRjaCB0aGVzZSB0eXBlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIEF1ZyAyOCAxOTozODo1MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4pOiBEZWNsYXJlLgotCSogZWxmLmMgKF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4pOiBOZXcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWRkIHZ0YWJsZSByZWxvY3MuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogUmVjb2duaXplIHRoZW0uCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IFBhc3MgdGhlbSBvZmYgdG8gZ2VuZXJpYyBjb2RlLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZW0uCi0JKGVsZl9pMzg2X2djX21hcmtfaG9vaywgZWxmX2kzODZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogVHJ1ZS4KLQotVGh1IEF1ZyAyMCAxNTowMzo0NSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYyAoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIpOiBDaGVjayBzeW1fc2VjIGlzIG5vdCBOVUxMCi0JYmVmb3JlIGxvb2tpbmcgYXQgb3duZXIgZmllbGQuCi0JKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogRGl0dG8uCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQ29tcHV0ZSBuYW1lIGJlZm9yZSBjYWxsaW5nCi0JZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUoKS4KLQotVGh1IEF1ZyAyMCAxMTozMDoxNyAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBlbGYuYzogY29tbWVudCBhbmQgZm9ybWF0dGluZyBjbGVhbnVwcy4KLQkqIGVsZmNvcmUuaDogZGl0dG8uCi0KLVdlZCBBdWcgMTkgMTU6NDM6MjYgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSZWplY3QgZmlsZXMgb2YgaGVhZGVyIHR5cGUgRVRfQ09SRQotCShjb3JlIGZpbGVzIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IHRoYW4gb2JqZWN0IGZpbGVzKS4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMsCi0JYmZkX2VsZl9ta2NvcmVmaWxlKTogZGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oIChfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLQliZmRfZWxmX21rY29yZWZpbGUpOiBhZGQgdG8gYmZkX3RhcmdldCB2ZWN0b3IuCi0JKiBlbGZjb3JlLmggKGVsZl9jb3JlX2ZpbGVfcCk6IHNhdmUgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLAotCWFuZCBzZXQgdGhlIGJmZCBhcmNoaXRlY3R1cmUgZnJvbSB0aGUgZWxmIGZpbGUgaGVhZGVyLgotCSogZWxmLmMgKGJmZF9lbGZfbWtjb3JlZmlsZSk6IG5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMpOiBuZXcgZnVuY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBhZGQgY2FzZXMgZm9yIGhhbmRsaW5nCi0JUFRfTk9URSBzZWdtZW50cy4gIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6Ci0JY29yZSBmaWxlcyBzaG91bGQgYmUgaGFuZGxlZCB0aGUgc2FtZSBhcyBleGVjIGZpbGVzLgotCShwcmVwX2hlYWRlcnMpOiBpZGVudGlmeSBjb3JlIGZpbGVzIGFzIHR5cGUgRVRfQ09SRS4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogaWRlbnRpZnkgdGhlIHNlY3Rpb25zIGJlbG9uZ2luZyB0bwotCXRoZSBQVF9OT1RFIHNlZ21lbnQuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCWFkZCBicmVhayBzdGF0ZW1lbnQgdG8gZGVmYXVsdCBjYXNlLgotCi0xOTk4LTA4LTE5ICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHRoYXQgb3V0cHV0Ci0Jc2VjdGlvbiAobm90IGlucHV0KSB3aWxsIGJlIGluIHNlY3Rpb25zICIuc2JzcyIsICIuc2JzczIiLAotCSIuc2RhdGEiLCBhbmQgIi5zZGF0YSIgZm9yIFJfUFBDX1NEQVJFTDE2LCBSX1BQQ19FTUJfU0RBMlJFTCwKLQlSX1BQQ19FTUJfU0RBMjEsIFJfUFBDX0VNQl9SRUxTREEuICBJbiBhbGwgdGhlc2UgY2FzZXMgYWxzbyBpZ25vcmUKLQlvdXRwdXRfb2Zmc2V0IGZvciBjb3JyZWN0IGV2YWx1YXRpb24gb2YgYWRkZW5kLgotCi1UdWUgQXVnIDE4IDExOjQ4OjEyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItYXJtLmM6IEFkZCBwcmVmaXggYmZkXyB0byBlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLAotICAgICAgICBlbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIGFuZAotICAgICAgICBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLQotVHVlIEF1ZyAxOCAxMTo0NjowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0gICAgICAgICogYmZkLWluLmg6IEFtbWVuZCBwcm90b3R5cGUgZm9yCi0gICAgICAgIGVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIHRvIHJlbW92ZSBzdXJwbHVzIHRoaXJkCi0gICAgICAgIGFyZ3VtZW50LgotCi0gICAgICAgICogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi1TYXQgQXVnIDE1IDIwOjU1OjA4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBIYW5kbGUgaW5kaXJlY3Qgc3ltYm9scy4KLQotRnJpIEF1ZyAxNCAwOToxMjoyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogVXNlIHRoZSByZWxvY2F0aW9uIGFscmVhZHkKLQljYWxjdWxhdGVkIGZvciBSRUxPQ19TUEFSQ19SRVYzMiBjYXNlLgotCi1UaHUgQXVnIDEzIDE0OjAyOjAyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBiZmQtaW4uaDogIEFkZCBwcm90b3R5cGVzIGZvciBlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLAotICAgICAgIGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgYW5kCi0gICAgICAgZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24uCi0gICAgICAgKiBiZmQtaW4yLmg6ICBSZWdlbmVyYXRlZC4KLSAgICAgICAqIGVsZjMyLWFybS5jIERlZmluZSBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlLgotICAgICAgIChpbnNlcnRfdGh1bWJfYnJhbmNoKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGZpbmRfdGh1bWJfZ2x1ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChmaW5kX2FybV9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKHJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChyZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUpOiBOZXcgcm91dGluZS4KLSAgICAgICAoZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgcm91dGluZS4KLSAgICAgICAoZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zKSBOZXcgcm91dGluZS4KLSAgICAgICAoZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pIE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl90aHVtYl90b19hcm1fc3R1Yik6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fdG9fdGh1bWJfc3R1Yik6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRml4IHR5cG8uCi0gICAgICAgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIEFkZCBhcmd1bWVudCBzeW1fc2VjLgotICAgICAgIENoZWNrIGZvciBicmFuY2hlcyB0byB0aHVtYiBzeW1ib2xzIGluIGNhc2UgUl9BUk1fUEMyNC4KLSAgICAgICBDaGVjayBmb3IgYnJhbmNoZXMgdG8gYXJtIHN5bWJvbHMgaW4gY2FzZSBSX0FSTV9USE1fUEMyMi4KLSAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgUGFzcyBzeW1ib2wgc2VjdGlvbiB0bwotICAgICAgIGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlLgotCi1XZWQgQXVnIDEyIDE5OjAwOjM5IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIFBMVAotCWVudHJpZXMgdW5sZXNzIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgZXhlY3V0YWJsZTsgaW4KLQlwYXJ0aWN1bGFyLCB1bmRlZmluZWQgd2VhayBzeW1ib2xzIGdldCBhIFBMVCBlbnRyeS4KLQotV2VkIEF1ZyAxMiAxNDo0ODozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaDogUmVtb3ZlIG5lc3RlZCBjb21tZW50IHRvIGF2b2lkIHdhcm5pbmcuCi0KLVdlZCBBdWcgMTIgMDg6MTA6MTEgMTk5OCBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIFJld29yawotICAgICAgIFJfQVJNX1BDMjQgcmVsb2NhdGlvbi4KLQotVHVlIEF1ZyAxMSAxNDo0MjoyNiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIFJlbW92ZSB1bnVzZWQKLSAgICAgICBhcmd1bWVudCBpc19sb2NhbC4gIEFkZCBhcmd1bWVudCBzeW1fZmxhZ3MuICBDaGVjayBzeW1fZmxhZ3MKLSAgICAgICBpbiBSX0FSTV9BQlMzMiBjYXNlLiAgSW5jbHVkZSBhZGRlbmQgZm9yIFJfQVJNX1RITV9QQzIyIGNhc2UuCi0gICAgICAgKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIERvbid0IHBhc3MgbG9jYWwgc3ltIGFuZCBwYXNzCi0gICAgICAgc3ltX2ZsYWdzIHRvIGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlLgotCi1Nb24gQXVnIDEwIDIwOjM4OjM5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzKTogQ29ycmVjdCBsYXN0IGNoYW5nZQotCXRvIG5vdCBjb3VudCB0b28gZmV3IHJlbG9jcyBmb3IgZHluYW1pY2x5IGxpbmtlZCBleGVjdXRhYmxlcy4KLQotTW9uIEF1ZyAxMCAxNTozNTozNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IE5ldmVyIGNvbnNpZGVyCi0Jc3ltYm9scyB3aXRob3V0IGEgZHluYW1pYyBpbmRleCBkeW5hbWljLiAgQ29uc2lkZXIgYWxsIHdlYWsKLQlzeW1ib2xzIGR5bmFtaWMuCi0JKGVsZjY0X2FscGhhX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBEb24ndCBhc3N1bWUgMS0xCi0JY29ycmVzcG9uZGFuY2UgYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IHNlY3Rpb25zLgotCi1Nb24gQXVnIDEwIDE1OjMxOjM5IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBGb3IgYmFja2VuZHMKLQl0aGF0IHVzZSBhIC5nb3QucGx0IHNlY3Rpb24gc3RhcnQgdGhlIGdvdCBvZmZzZXQgYXQgemVyby4KLQotTW9uIEF1ZyAxMCAxNzozMToyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9wcm9jZXNzb3IpOiBDb3JyZWN0IHRoZSBwcm9jZXNzb3IgSUQgd3JpdHRlbgotCW91dCBmb3IgYmZkX2FyY2hfbTY4aywgYWNjb21tb2RhdGluZyBjaGFuZ2Ugb2YgTWFyY2ggMjUuCi0KLVN1biBBdWcgIDkgMjA6NTU6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmV3b3JrCi0gICAgICAgIFJfQVJNX1RITV9SUEMyMiByZWxvY2F0aW9ucy4KLQotU2F0IEF1ZyAgOCAxNToxNTozMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IFVuZGVmIHdlYWsgc3ltYm9scwotCWFyZSBhbHdheXMgZHluYW1pYy4KLQkoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyBlbm91Z2ggcm9vbSBmb3IgUkVMQVRJVkUKLQkuZ290IHJlbG9jcyBpbiAtQnN5bWJvbGljIHNoYXJlZCBvYmplY3RzLgotCi1XZWQgQXVnICA1IDE1OjQ4OjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jOiBBZGQgcHJpdmF0ZSBmbGFncyB0byBFTEYgaGVhZGVyLgotCShlbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBGdW5jdGlvbi4KLQkoZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fY29weV9wcml2YXRlX2ZsYWdzKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBGdW5jdGlvbi4KLQotTW9uIEF1ZyAgMyAxNzoxMDoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IFBlcm1pdCBXUExUMzAgYWdhaW5zdAotCWEgbG9jYWwgc3ltYm9sLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVN1biBBdWcgIDIgMDM6MTk6MjMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogSW5pdCBzZ290IHRvIE5VTEwuICBDcmVhdGUgdGhlCi0JLmdvdCBpZiBhbnkgcmVsb2NhdGlvbiByZWZlcnJzIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUHVsbCBzZ290IGFuZCBzcGx0IHNlYXJjaCB0byB0aGUgc3RhcnQKLQlvZiB0aGUgZnVuY3Rpb24uICBSZWNvZ25pemUgbm8gLnBsdCBhcyBzdGF0aWMgbGlua2luZy4KLQotMTk5OC0wOC0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IHBhc3MKLQkiLmxpYmxpc3QiIHN0cmluZyB0aHJvdWdoIGdldHRleHQuCi0KLUZyaSBKdWwgMzEgMTY6Mzg6MTQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIGVsZjMyLWFybS5sby4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLSAgICAgICAgKiBjb25maWcuYmZkIChhcm0tKi1lbGYpOiAgRGVmaW5lIHRhcmdfZGVmdmVjIGFuZCB0YXJnX3NlbHZlY3MuCi0gICAgICAgICh0aHVtYi0qLWVsZik6IERlZmluZSB0YXJnX2RlZnZlYyBhbmQgdGFyZ19zZWx2ZWNzLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYyBhbmQgYmZkX2VsZjMyX2JpZ2FybV92ZWMuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotICAgICAgICAqIGVsZi5jOiAocHJlcF9oZWFkZXJzKTogIFN1cHBvcnQgYXJjaF90eXBlIG9mIEVNX0FSTS4KLSAgICAgICAgKiB0YXJnZXRzLmM6ICBTdXBwb3J0IG5ldyB0YXJnZXRzIGJmZF9lbGYzMl9iaWdhcm1fdmVjIGFuZAotICAgICAgICBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjLgotICAgICAgICAqIGVsZjMyLWFybS5jOiAgTmV3IGZpbGUuCi0KLVR1ZSBKdW4gMjggMTk6MDU6MjggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoTV9TUEFSQ0xJVEVfTEUpOiBOZXcgbWFjaGluZS4KLQkqIHN1bm9zLmMgKE1BQ0hUWVBFX09LKTogQWRkIG1hY2hpbmUgTV9TUEFSQ0xJVEVfTEUuCi0JKiBhb3V0ZjEuaCAoc3Vub3Nfc2V0X2FyY2hfbWFjaCk6IEFkZCBtYWNoaW5lIE1fU1BBUkNMSVRFX0xFLgotCShzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMpOiBBZGQgbWFjaGluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUKLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IEFkZCByZWxvY2F0aW9uIFJfU1BBUkNfUkVWMzIuCi0JKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKSBBZGQgbWFjaGluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUKLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogQWRkIFJFTE9DX1NQQVJDX1JFVjMyIHN1cHBvcnQuCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSwgc3BhcmNfcmVsb2NfbWFwLAotCWVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgUl9TUEFSQ18zMkxFIHRvIGJlIFJfU1BBUkNfUkVWMzIKLQkqIGxpYmJmZC5oIChiZmRfcmVsb2NfY29kZV9yZWFsX25hbWVzKTogUmVuYW1lIEJGRF9SRUxPQ19TUEFSQ18zMkxFIHRvCi0JYmUgQkZEX1JFTE9DX1NQQVJDX1JFVjMyLgotCSogcmVsb2MuYzogRGl0dG8uCi0JKiBjb25maWcuYmZkIChzcGFyYzg2eC0qLWFvdXQpOiBOZXcKLQotRnJpIEp1bCAyNCAxMzo1NDoxOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBbGxvY2F0ZSBOVUxMIHN5bWJvbCBiZWZvcmUKLQlhY3R1YWxseSBtYXBwaW5nIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0KLUZyaSBKdWwgMjQgMTE6MjQ6MjkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfaG93dG8pOiBBZGQgUl9NTjEwMzAwXzI0IGVudHJ5LgotCShtbjEwMzAwX2VsZl9yZWxvY19tYXApOiBTaW1pbGFybHkuCi0JKG1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgUl9NTjEwMzAwXzI0LgotCi1GcmkgSnVsIDI0IDEyOjM2OjA0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCByZWxvYyB0eXBlcyB1c2VkIG9uCi0JSXJpeCA2LgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIGRlZmF1bHQgY2FzZS4KLQkqIGVsZjY0LW1pcHMuYzogUmVwbGFjZSBhbGwgdXNlcyBvZiBtaXBzX2VsZjY0X3JlbG9jX3R5cGUgd2l0aAotCWVsZl9taXBzX3JlbG9jX3R5cGUgZGVmaW5lZCBpbiBlbGYvbWlwcy5oLgotCi0xOTk4LTA3LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jOiBSZW1vdmUgcmVsb2NfdHlwZSBkZWZpbml0aW9uIGNvbXBsZXRlbHkuICBJdCdzIG5vdwotCWluIGVsZi9taXBzLmguCi0KLVRodSBKdWwgMjMgMTM6MzM6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3JlbG9jX3R5cGUpOiAjaWYgMCBvdXQgbW9yZSByZWxvY2F0aW9ucwotCWFzIHRoZXkgYXJlIGRlZmluZWQgaW4gZWxmL21pcHMuaCBub3cuCi0KLVRodSBKdWwgMjMgMTE6Mjk6NDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0KLQkqIFJlLWFkZCBsb3N0IGNoYW5nZToKLSAgICAgICAgKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZAotICAgICAgICAibW92bV9zdGFja19zaXplIi4KLSAgICAgICAgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBJbmNsdWRlIHN0YWNrIHNwYWNlIGZvciByZWdpc3RlciBzYXZlcwotICAgICAgICBpbiB0aGUgaW1tOCBmaWVsZCBvZiBhICJjYWxsIiBpbnN0cnVjdGlvbi4KLSAgICAgICAgKGNvbXB1dGVfZnVuY3Rpb25faW5mbyk6IERldGVybWluZSBob3cgbXVjaCBzdGFjayBpcyBhbGxvY2F0ZWQgYnkKLSAgICAgICAgdGhlIG1vdm0gaW5zdHJ1Y3Rpb24uICBGaXggdHlwby4KLSAgICAgICAgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG1vdm1fc3RhY2tfc2l6ZS4KLQotVGh1IEp1bCAyMyAxMTozODowNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSk6IERlZmluZSBhcyA0LgotCSogZWxmNjQtc3BhcmMuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lIGFzIDguCi0KLTE5OTgtMDctMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYzogQ2hhbmdlIHVzZSBvZiBwcF9yZWxvY190eXBlIHRvIGVsZl9wcGNfcmVsb2NfdHlwZS4KLQotV2VkIEp1bCAyMiAxNjoyNzoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1ocHBhLmg6IExldCBFTEYgaGVhZGVyIGRlZmluZSB0aGUgZW51bSBjb250YWluaW5nIHRoZQotCWV4dGVybmFsIHJlbG9jIG51bWJlcnMuCi0JKiBlbGYzMi1pMzg2Lmg6IExpa2V3aXNlLgotCi0xOTk4LTA3LTIyIDE0OjU3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLW0xMDMwMC5jOiBMZXQgRUxGIGhlYWRlciBub3cgZGVmaW5lIHRoZSBtYWNyb3MgdG8gZ2V0IHRoZSBlbnVtLgotCSogZWxmMzItbWlwcy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jOiBMaWtld2lzZS4KLQotV2VkIEp1bCAyMiAxMzo1Mzo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmQtaW4yLmg6IENoYW5nZSB0eXBlIG9mICdjbGFzcycgcGFyYW1ldGVyIHRvICd1bnNpZ25lZCBpbnQnIGluCi0JYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcygpLCBpbiBvcmRlciB0byBhdm9pZCBLJlIgY29tcGF0YWJpbGl0eQotCXByYmxlbXMuCi0JKiBiZmQtaW4uaDogUmVnZW5lcmF0ZS4KLQkqIGNvZmZnZW4uYyAoYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyk6IENoYW5nZSB0eXBlIG9mICdjbGFzcycKLQlwYXJhbWV0ZXIgdG8gJ3Vuc2lnbmVkIGludCcgdG8gYXZvaWQgSyZSIGNvbXBhdGFiaWxpdHkgcHJvYmxlbXMuCi0KLVdlZCBKdWwgMjIgMTY6NDM6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfZmluZF9uZWFyZXN0X2xpbmUpOiBDaGFuZ2UgZmlsZW5hbWVfcHRyIGFuZAotCWZ1bmN0aW9ubmFtZV9wdHIgdG8gYmUgY29uc3QuICBDaGFuZ2UgbGluZV9wdHIgdG8gYmUgdW5zaWduZWQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKTogU2ltcGxpZnkgaGFuZGxpbmcgd2hlbgotCW1hY3JvIGlzIG5vdCBkZWZpbmVkLiAgQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgZnJvbSBiZmRfbGlua19pbmZvCi0JdG8gY29mZl9maW5hbF9saW5rX2luZm8uICBBZGQgcHJvdG90eXBlLgotCShjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IFNpbXBsaWZ5IGhhbmRsaW5nIHdoZW4gbWFjcm8gaXMgbm90Ci0JZGVmaW5lZC4gIEFkZCBwcm90b3R5cGUuCi0KLTE5OTgtMDctMjIgMTM6MDggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYtbW4xMDMwMC5jOiBCZWZvcmUgaW5jbHVkZSBzeXN0ZW0gc3BlY2lmaWMgRUxGIGhlYWRlciBkZWZpbmUKLQlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIGFuZCBFTkRfUkVMT0NfTlVNQkVSUy4KLQkqIGVsZjMyLW1pcHMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYzogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMjIgMTM6NDY6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfcmVsb2NfdHlwZSk6IENvcHkgVWxyaWNoJ3MgZWxmMzItbWlwcy5jCi0JdGVtcG9yYXJ5IHBhdGNoIG92ZXIgdG8gZWxmNjQtbWlwcy5jIGFzIHdlbGwuCi0KLTE5OTgtMDctMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHJlbG9jX3R5cGUpOiBUZW1wb3JhcmlseSBkaXNhYmxlIGRlZmluaXRpb24gb2YKLQlzdGFuZGFyZCByZWxvY2F0aW9uIHNpbmNlIHRoZXkgYXJlIG5vdyBkZWZpbmVkIGluIGVsZi9taXBzLmguCi0KLVR1ZSBKdWwgMjEgMDk6NDc6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYtbTEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOgotICAgICAgICBNb2RpZnkgcmFuZ2UgdGVzdCBmb3IgY2FzZSBSX01OMTAyMDBfOC4KLQotICAgICAgICAqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6Ci0gICAgICAgIE1vZGlmeSByYW5nZSB0ZXN0IGZvciBjYXNlIFJfTU4xMDMwMF84LgotCi1Nb24gSnVsIDIwIDE4OjUwOjU0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZ290XyAmIHBsdF9oZWFkZXJfc2l6ZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKiBlbGYzMi1tNjhrLmMsIGVsZjMyLW1pcHMuYywgZWxmMzItcHBjLmM6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYywgZWxmNjQtYWxwaGEuYywgZWxmNjQtc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBlbGZ4eC10YXJnZXQuaDogUHJvdmlkZSBhIGRlZmF1bHQgb2YgemVyby4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogVXNlIGdvdF9oZWFkZXJfc2l6ZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCByZW1vdmUgYSBQTFQKLQllbnRyeSBmcm9tIGFuIGV4ZWN1dGFibGUsIGV2ZW4gaWYgdGhlIHBsdCByZWZjb3VudCBnb2VzIHRvIDAuCi0KLU1vbiBKdWwgMjAgMTI6NDc6MjYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBBbHNvIHJlbWVtYmVyIHRoZQotCWRpcmVjdG9yeSBuYW1lIGF0IHRoZSBsaW5lIG51bWJlci4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWxzbyBjb25zaWRlciBzeW1ib2xzCi0Jd2l0aCBhbiB1bnNwZWNpZmllZCB0eXBlLgotCi1XZWQgSnVsIDE1IDExOjIwOjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYzogQWRkIHVuZGVmIG9mIHZhbGlkIHRvIGF2b2lkIHByb2JsZW0gb24gU3VuT1MuCi0KLVR1ZSBKdWwgMTQgMTU6MzA6NTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaT84Ni1wYy1iZW9ze3BlLGVsZix9Kik6IFJlY29nbml6ZS4KLQotVHVlIEp1bCAxNCAxMToyMjoyMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MpOiBBbHNvIHJlZmVyZW5jZSBjb3VudAotCVJfNjhLX1BDeHggYW5kIFJfNjhLX3h4IHJlbG9jYXRpb25zLiAgTWFrZSBzdXJlIHRoYXQKLQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBpcyBhbHdheXMgc2V0IGZvciBhIFBMVCByZWxvYyByZWZlcmVuY2UuCi0JKGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiBBbHNvIHJlZmVyZW5jZSBjb3VudCBSXzY4S19QQ3h4IGFuZAotCVJfNjhLX3h4IHJlbG9jYXRpb25zLgotCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXNldCB0aGUgcGx0IG9mZnNldCBvZiBhIHN5bWJvbAotCXRoYXQgaGFzIG5vIHBsdCBlbnRyeS4KLQkoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IElnbm9yZSB0aGUgcGx0IG9mZnNldCBpbiBhIHN0YXRpYwotCWxpbmsuCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXNldCB0aGUgcGx0IG9mZnNldCBmb3IKLQlhbiBpZ25vcmVkIHN5bWJvbC4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IFNldCB0aGUgZ290IG9mZnNldHMgYWxzbyBpbgotCWEgc3RhdGljIGxpbmsuCi0KLQkqIGVsZjMyLW02OGsuYyAoUl82OEtfR05VX1ZUSU5IRVJJVCwgUl82OEtfR05VX1ZURU5UUlkpOiBOZXcgcmVsb2MKLQl0eXBlcy4KLQkoaG93dG9fdGFibGUsIHJlbG9jX21hcCk6IEFkZCBlbnRyaWVzIGZvciB0aGVtLgotCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBIYW5kbGUgdGhlbS4gIEltcGxlbWVudCByZWZlcmVuY2UKLQljb3VudGluZyBmb3IgZ290IGFuZCBwbHQgZW50cmllcy4KLQkoZWxmX202OGtfZ2NfbWFya19ob29rLCBlbGZfbTY4a19nY19zd2VlcF9ob29rKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSGFuZGxlIHVucmVmZXJlbmNlZCBwbHQKLQlzeW1ib2xzLgotCShydHlwZV90b19ob3d0b19yZWwsIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCk6IERlbGV0ZS4KLQkoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSB0aGUgbmV3IHJlbG9jIHR5cGVzLgotCShiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmssIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vaywKLQllbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLCBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gY3JlYXRpbmcgYW4KLQlpbmRpcmVjdCByZWZlcmVuY2UgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nIGFsc28gY29weSB0aGUgcGx0Ci0Jb2Zmc2V0LgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IFdoZW4gY2xlYXJpbmcgdGhlIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUCi0JZmxhZyBhbHNvIHJlc2V0IHRoZSBwbHQgb2Zmc2V0LgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBMaWtld2lzZS4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEluY3JlbWVudCB0aGUgZ290IG9mZnNldCBieQotCXRoZSBzaXplIG9mIHRoZSBlbnRyeSBpbiBieXRlcy4KLQkoZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzKTogTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMTQgMTE6MTg6MTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19zZWN0aW9ucyk6IFJldHVybiB0cnVlIHJhdGhlciB0aGFuIGZhbGxpbmcgb2ZmCi0JdGhlIGJvdHRvbS4KLQotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogQ2FsbCBiZmRfYWxsb2MsIG5vdAotCXhtYWxsb2MuCi0KLU1vbiBKdWwgMTMgMTE6MDY6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogU3VwcmVzcyBkZWZpbml0aW9uIG9mIFRBUkdFVF9VTkRFUlNDT1JFIGFuZCBhZGQgYQotCWNvbW1lbnQgZGVzY3JpYmluZyB3aGVuIGl0IHNob3VsZCBiZSBlbmFibGVkLgotCUNoYW5nZWQgZGVmaW5pdGlvbiBvZiBVU0VSX0xBQkVMX1BSRUZJWCB0byAiIiwgdG8gZmFsbCBpbnRvIGxpbmUKLQl3aXRoIEdDQyBzb3VyY2VzLgotCi1Nb24gSnVsIDEzIDEzOjA2OjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBIYW5kbGUgY2FsbCBvcHRpbWl6YXRpb24KLQlpbmZvcm1hdGlvbiBBVE4gcmVjb3Jkcy4KLQotRnJpIEp1bCAxMCAxNjozMTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogU2VsZWN0IGFuIGFwcHJvcHJpYXRlCi0Jc2VjdGlvbiBmb3IgYW4gYWJzb2x1dGUgc3ltYm9sIGluIGEgZnVsbHkgbGlua2VkIGZpbGUuICBCYXNlZCBvbgotCXBhdGNoIGZyb20gQ2hyaXN0aWFuIEhvbGxhbmQgPENIb2xsYW5kQGRlLmx1Y2VudC5jb20+LgotCi1XZWQgSnVsICA4IDExOjI5OjU2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29mZi1tODhrLmMgKG04OGtfc3BlY2lhbF9yZWxvYyk6IERvbid0IGxvc2UgdGhlIGluZm9ybWF0aW9uCi0JdGhhdCBhIHN5bWJvbCBpcyB1bmRlZmluZWQuCi0KLVR1ZSBKdWwgIDcgMjE6NDc6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2JmZF9nY19zZWN0aW9ucyk6IERlZmluZS4KLQotTW9uIEp1bCAgNiAxMTozNTo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IERvIG5vdCBjb21wbGFpbiBhYm91dAotCW92ZXJmbG93cyBpbiBBUk1fMjZEIHBhdGNoZXMsIHNpbmNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4KLQlpbXBsbWVudGVkLiAgUGF0Y2ggc3VibWl0dGVkIGJ5IERyLiBSLkouIEJsYWNrIDxyamJAZGNzLmdsYS5hYy51az4KLQotU2F0IEp1bCAgNCAxMjoyNTozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgd2UgaGF2ZSBhbnkgbG9uZwotCXNlY3Rpb24gbmFtZXMsIGNhbGwgY29mZl93cml0ZV9zeW1ib2xzIGV2ZW4gaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scy4KLQotRnJpIEp1bCAgMyAxMzoxMTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBPbmx5IHNldCBwaGRyX2luY2x1ZGVkIG9uY2UgZm9yIGEKLQlQVF9MT0FEIHNlZ21lbnQsIHJhdGhlciB0aGFuIG9ubHkgc2V0dGluZyBpdCBvbmNlIGZvciB0aGUgZW50aXJlCi0JZmlsZS4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBXaGVuIHNldHRpbmcgdGhlIExNQSwKLQlyYXRoZXIgdGhhbiBpZ25vcmluZyBldmVyeSBwaGRyIHdpdGggYSBwX3BhZGRyIG9mIDAsIGlnbm9yZSBhbGwKLQl0aGUgcGhkcnMgaWYgdGhleSBhbGwgaGF2ZSBhIHBfcGFkZHIgb2YgMC4KLQotCSogc3RhYnMuYyAoX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MpOiBDaGVjayB3aGV0aGVyIHRoZSAuc3RhYnN0cgotCXNlY3Rpb24gd2FzIGRpc2NhcmRlZCBmcm9tIHRoZSBsaW5rLgotCi1GcmkgSnVsICAzIDE0OjM5OjA1IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi1zaC5jIChzaF9pbnNuX3VzZXNfZnJlZyk6IElnbm9yZSBsb3dlc3QgYml0IG9mIHJlZ2lzdGVyIG51bWJlci4KLQotRnJpIEp1bCAgMyAxNDozNTo0OCAxOTk4ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYtc2guYyAoc2hfaW5zbnNfY29uZmxpY3QpOiBMb2FkIG9mIGZwc2NyIGNvbmZsaWN0cyB3aXRoCi0JZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucy4KLQotVGh1IEp1bCAgMiAxODozNzoyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFNraXAgdW5kZWZpbmVkIGdsb2JhbAotCWZ1bmN0aW9uIHN5bWJvbHMuCi0KLVRodSBKdWwgIDIgMTQ6NTk6NDIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLQlNZXJnZSBvZiB2YXgvdm1zIChyZWFkLW9ubHkpIHN1cHBvcnQKLQkqIGNvbmZpZ3VyZS5jb206IFN1cHBvcnQgVmF4IHRhcmdldC4KLQkqIG1ha2VmaWxlLnZtczogU3VwcG9ydCBWYXggdGFyZ2V0LgotICAgICAgICAqIHZtcy5oOiBSZW5hbWVkIGZyb20gZXZheC5oLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KSBzdXBwb3J0LgotCSogdm1zLmM6IFJlbmFtZWQgZnJvbSBldmF4LWFscGhhLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy1oZHIuYzogUmVuYW1lZCBmcm9tIGV2YXgtZW1oLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy1nc2QuYzogUmVuYW1lZCBmcm9tIGV2YXgtZWdzZC5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiB2bXMtdGlyLmM6IFJlbmFtZWQgZnJvbSBldmF4LWV0aXIuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLW1pc2MuYzogUmVuYW1lZCBmcm9tIGV2YXgtbWlzYy5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogVXNlIHVuYnVmZmVyZWQgcmVhZCBvbiBWTVMvVmF4LgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X292YXhfZmxhdm91cik6IE5ldyBmbGF2b3VyLgotCSh2bXNfYWxwaGFfdmVjKTogUmVuYW1lZCBmcm9tIGV2YXhfYWxwaGFfdmVjLgotCSh2bXNfdmF4X3ZlYyk6IE5ldy4KLQkodGFyZ2V0X3ZlY3Rvcik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZy5iZmQgKGFscGhhKi0qLSp2bXMqKTogVXNlIHZtc19hbHBoYV92ZWMsIG5vdAotCWV2YXhfYWxwaGFfdmVjLgotCSh2YXgqLSotKnZtcyopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IFVwZGF0ZSBmb3IgcmVuYW1lZCBmaWxlcy4gIFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZC4KLQotVGh1IEp1bCAgMiAxMzozMTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIE1hdHQgU2VtZXJza3kgPG1hdHRzQHNjZC5ocC5jb20+OgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogRm9yY2UgYSB0cmFpbGluZyBOVUxMCi0JcG9pbnRlciBvbiBhYmZkLT5vdXRzeW1ib2xzLgotCShnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sKTogSGFuZGxlIE5VTEwgc3ltIHBhcmFtZXRlci4KLQotV2VkIEp1bCAgMSAxNzowNTo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogQWRkIHN1cHBvcnQgZm9yIGNoYW5naW5nIFZNQSBvcgotCUxNQSBvZiBzZWN0aW9ucy4KLQotV2VkIEp1bCAgMSAxNjo1ODo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogQ29ycmVjdCBhZGRyZXNzIGNvbXBhcmlzb25zCi0gCXdoZW4gaGFuZGxpbmcgMzIgYml0IGltbWVkaWF0ZSByZWxvY3MuCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0KLVR1ZSBKdW4gMzAgMDk6NTU6MDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogQWNjb3VudCBmb3IgcmVjZW50bHkgYWRkZWQgZ2NfbWFyawotCWZpZWxkIGluIHN0cnVjdCBhc2VjdGlvbi4KLQotCSogZWxmLW0xMDMwMC5jIChiZmRfbW4xMDMwMF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCi1UaHUgSnVuIDI1IDE4OjMxOjQxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQlFTEYgU2VjdGlvbi1sZXZlbCBHYXJiYWdlIENvbGxlY3Rpb246Ci0JKiBiZmQuYyAoYmZkX2djX3NlY3Rpb25zKTogTmV3LgotCSogYW91dC1hZG9iZS5jOiBIb29rIHRvIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCi0JKiBhb3V0LXRhcmdldC5oLCBhb3V0LXRpYzMwLmMsIGJpbmFyeS5jLCBib3V0LmM6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgY29mZi1yczYwMDAuYywgY29mZmNvZGUuaDogTGlrZXdpc2UuCi0JKiBldmF4LWFscGhhLmMsIGkzODZtc2Rvcy5jLCBpMzg2b3M5ay5jLCBpZWVlLmM6IExpa2V3aXNlLgotCSogaWhleC5jLCBubG0tdGFyZ2V0LmgsIG9hc3lzLmMsIHBwY2Jvb3QuYywgc3JlYy5jOiBMaWtld2lzZS4KLQkqIHRla2hleC5jLCB2ZXJzYWRvcy5jOiBMaWtld2lzZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMpOiBOZXcuCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0xJTkspOiBBZGQgX2JmZF9nY19zZWN0aW9ucy4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKTogTmV3LgotCShiZmRfZ2VuZXJpY19nY19zZWN0aW9ucyk6IE5ldy4KLQkqIHNlY3Rpb24uYyAoU0VDX0tFRVApOiBOZXcuCi0JKGFzZWN0aW9uKTogQWRkIGdjX21hcmsgbWVtYmVyLgotCi0JKiBlbGZjb2RlLmggKGVsZl9nYyopOiBOZXcgbmFtZSByZW1hcHBpbmdzLgotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBzZXQgY29udGVudHMgb24gc3RhYnMKLQlzZWN0aW9ucyB0byBiZSBleGNsdWRlZC4KLQkoZWxmX2djX21hcmssIGVsZl9nY19zd2VlcCwgZWxmX2djX3N3ZWVwX3N5bWJvbCk6IE5ldy4KLQkoZWxmX2djX3Byb3BvZ2F0ZV92dGFibGVfZW50cmllc191c2VkKTogTmV3LgotCShlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzKTogTmV3LgotCShlbGZfZ2Nfc2VjdGlvbnMsIGVsZl9nY19yZWNvcmRfdnRpbmhlcml0LCBlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBOZXcuCi0JKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBOZXcuCi0JKGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cywgZWxmX2djX2NvbW1vbl9maW5hbF9saW5rKTogTmV3LgotCSogZWxmeHgtdGFyZ2V0Lmg6IEFkZCBhbmQgZGVmYXVsdCBnYyBob29rcy4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IFN3YXAgZ290X29mZnNldC9wbHRfb2Zmc2V0Ci0JZm9yIHVuaW9ucy4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBMaWtld2lzZSBmb3IgbG9jYWxfZ290X29mZnNldHMuCi0JKiBlbGYuYywgZWxmLWkzODYuYywgZWxmMzItbTY4ay5jLCBlbGYzMi1taXBzLmM6IFVwZGF0ZSBhbGwgdXNlcy4KLQkqIGVsZjMyLXBwYy5jLCBlbGYzMi1zcGFyYy5jLCBlbGY2NC1hbHBoYS5jOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMsIGVsZmxpbmsuaDogTGlrZXdpc2UuCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgdnRhYmxlIG1lbWJlcnMuCi0JKEVMRl9MSU5LX0hBU0hfTUFSSyk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgR0MgaG9va3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBaZXJvIHZ0YWJsZSBtZW1iZXJzLgotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcyk6IE5ldy4KLQkobW4xMDMwMF9lbGZfZ2NfbWFya19ob29rKTogTmV3LgotCShSX01OMTAzMDBfR05VX1ZUSU5IRVJJVCwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZKTogTmV3LgotCShlbGZfbW4xMDMwMF9ob3d0bywgbW4xMDMwMF9yZWxvY19tYXApOiBIYW5kbGUgdGhlbS4KLQkobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZjMyLW1pcHMuYyAoUl9NSVBTX0dOVV9WVElOSEVSSVQsIFJfTUlQU19HTlVfVlRFTlRSWSk6IE5ldy4KLQkoZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0bywgZWxmX21pcHNfZ251X3Z0ZW50cnlfaG93dG8pOiBOZXcuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgdGhlbS4KLQkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nY19tYXJrX2hvb2ssIG1pcHNfZWxmX2djX3N3ZWVwX2hvb2spOiBOZXcuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZjMyLXBwYy5jIChSX1BQQ19HTlVfVlRJTkhFUklULCBSX1BQQ19HTlVfVlRFTlRSWSk6IE5ldy4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBIYW5kbGUgdGhlbS4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZWZlcmVuY2UgY291bnQgLmdvdCBhbmQgLnBsdCBlbnRpcmVzLgotCUhhbmRsZSBuZXcgdnRhYmxlIHJlbG9jcy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZWNvZ25pemUgdW51c2VkIC5wbHQgZW50cmllcy4KLQkocHBjX2VsZl9nY19tYXJrX2hvb2ssIHBwY19lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1GcmkgSnVuIDI2IDEwOjQ4OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbW4xMDMwMCk6IERlZmluZS4KLQkqIGVsZi1tMTAzMDAuYzogSW5jbHVkZSBlbGYvbW4xMDMwMC5oCi0JKGVsZl9tbjEwMzAwX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbW4xMDMwMF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShfYmZkX21uMTAzMDBfZWxmX29iamVjdF9wKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQotVGh1IEp1biAyNSAxODozMTowOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBISTE2X1MKLQlyZWxvY2F0aW9uLgotCi1XZWQgSnVuIDI0IDE3OjE3OjU3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBMb29wIG92ZXIgaW5wdXRfYmZkcyB1c2luZyB0aGUKLQlsaW5rX25leHQgZmllbGQsIG5vdCB0aGUgbmV4dCBmaWVsZC4KLQotU3VuIEp1biAyMSAxOTozODozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBDaGVjayB0aGUgc2VjdGlvbiBhZGRyZXNzCi0JYWdhaW5zdCB0aGUgcGhkciBzaXplIGJvdGggd2l0aCBhbmQgd2l0aG91dCBhIG1vZHVsbyBvZgotCW1heHBhZ2VzaXplLgotCi1GcmkgSnVuIDE5IDE3OjA4OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHN0cmlwIGEKLQlsaW5rZXIgY3JlYXRlZCBlbXB0eSBpbnB1dCBzZWN0aW9uIGlmIHRoZSBvdXRwdXQgc2VjdGlvbiBoYXMgdGhlCi0Jc2FtZSBuYW1lLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGlmCi0JX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGZhaWxzLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ2FsbCBiZmRfc2V0X2Vycm9yIG9uCi0JZmFpbHVyZS4KLQotVHVlIEp1biAxNiAxMTo1NTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBJbXByb3ZlIGhhbmRsaW5nIG9mIFNvbGFyaXMKLSAJbmF0aXZlIGxpbmtlciBvdXRwdXQuICBBdm9pZCBwdXR0aW5nIGFuIGVtcHR5IHNlY3Rpb24gaW4gbW9yZSB0aGFuCi0gCW9uZSBzZWdtZW50LgotCi1GcmkgSnVuIDEyIDEzOjMwOjE3IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KLQkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgotCi1GcmkgSnVuIDEyIDEzOjM0OjAyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogTmV3IGFyZyByZWxvY2F0YWJsZV9wLgotCURvbid0IGFkZCBzZWN0aW9uIFZNQSB0byBzeW1ib2xzIGZvciByZWxvY2F0YWJsZSBvdXRwdXQuCi0JKF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFVwZGF0ZSBjYWxsIHRvCi0Jc3dhcF9vdXRfc3ltcy4KLQotTW9uIEp1biAgOCAxNToyMDo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IE1ha2UgY29tcGFyaXNvbnMKLQlhZ2FpbnN0ICdhZGRlbmQnIGJlIHNpZ25lZCByYXRoZXIgdGhhbiB1bnNpZ25lZC4KLQotU2F0IEp1biAgNiAwMDozMToyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmM6IEFkZCBwcm90b3R5cHMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIGNvZmYtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLgotCi1GcmkgSnVuICA1IDE3OjIxOjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZfc29ydF9zZWN0aW9ucyk6IFNvcnQgYnkgTE1BIGZpcnN0IHRoZW4gVk1BLCBzaW5jZSB0aGUKLQlMTUEgaXMgdXNlZCB0byBvcmRlciBzZWN0aW9ucyBpbiBhIHNlZ21lbnQuCi0KLQkqIGVsZjMyLXY4NTAuYzogQWRkIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0JQ2hhbmdlIHR5cGUgb2YgYWRkZW5kIHBhcmFtZXRlciB0byBiZmRfdm1hIGluIHZhcmlvdXMgZnVuY3Rpb25zLgotCi1GcmkgSnVuICA1IDE4OjA5OjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQ2hhbmdlIFJFTE9DX0JBU0UxMyB0byB1c2UKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQgaW5zdGVhZCBvZiBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZC4KLQotRnJpIEp1biAgNSAxNToxMToxMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmLmMgKGVsZl9tYXBfc3ltYm9scyk6IERvbid0IGFkZCBzZWN0aW9uIFZNQSB0byBzeW1ib2wgdmFsdWUKLQl3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IDAuCi0KLVdlZCBKdW4gIDMgMTc6NTI6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEp1biAgMyAxMjoxODoyNCAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogR2l2ZSBhbgotCWVycm9yIGlmIHByZXZpb3VzIG9iamVjdCBlbmRpYW5uZXNzIGRvZXNuJ3QgbWF0Y2ggY3VycmVudCBvYmplY3QuCi0KLVR1ZSBKdW4gIDIgMTc6NTA6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2FsbAotCV9iZmRfZWxmX3ByaW50X3ByaXZhdGUpYmZkX2RhdGEgKCkuCi0KLVR1ZSBKdW4gIDIgMTU6Mjk6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEb24ndCBhbHdheXMgc2V0IHR5cGVfY2hhbmdlX29rCi0JYW5kIHNpemVfY2hhbmdlX29rLgotIAkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHR5cGVfY2hhbmdlX29rIGFuZAotCXNpemVfY2hhbmdlX29rIGJlZm9yZSBjYWxsaW5nIGVsZl9tZXJnZV9zeW1ib2wuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IElmIHdlIGlzc3VlIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCBlcnJvciwgZG9uJ3QgYWxzbyBpc3N1ZSBhbiBvdmVyZmxvdyBlcnJvci4KLQotVHVlIEp1biAgMiAxMzo1MTowMCAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVGhlIHRhcmdldCBvZiBhbgotCVJfUFBDX0xPQ0FMMjRQQyByZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhbDsgaWYgbm90LCBwcmludCBhbiBlcnJvcgotCW1lc3NhZ2UgaW5zdGVhZCBvZiBjcmFzaGluZy4KLQotTW9uIEp1biAgMSAxODoyMzoxMiAxOTk4ICBZdWxpIEJhcmNvaGVuICA8eXVsaS5iYXJjb2hlbkB0ZWxyYWQuY28uaWw+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2NwdTMyKTogRGVmaW5lLgotCShiZmRfZGVmYXVsdF9zY2FuKTogQWRkIGNhc2UgZm9yIDY4MDYwLiAgRml4IDY4MzMyIGNhc2UgdG8gdXNlCi0JYmZkX21hY2hfY3B1MzIuCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG02OGs6Y3B1MzIuCi0JKiBpZWVlLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShpZWVlX29iamVjdF9wKTogUGFyc2Ugb3V0IHByb2Nlc3MgSUQgc3RyaW5nIHRvIG1ha2UgaXQgbW9yZQotCWxpa2VseSB0byBiZSBhY2NlcHRhYmxlIGZvciBiZmRfc2Nhbl9hcmNoLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gSnVuICAxIDExOjEyOjAyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsc28gY2FsbAotCV9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoKSBzbyB0aGF0IHRoZSBwcm9ncmFtIGhlYWRlciB3aWxsCi0JYmUgZGlzcGxheWVkLgotCi1Nb24gSnVuICAxIDEyOjE0OjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQ2hlY2sgZm9yIENfU0VDVElPTiByYXRoZXIgdGhhbgotCTB4NjguICBSZWluZGVudC4gIEFkZCBzb21lIGNvbW1lbnRzLgotCi1GcmkgTWF5IDI5IDA5OjU4OjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGp1c3QgcGh5c2ljYWwgYWRkcmVzcyBvZgotCXNlZ21lbnQgaW4gb3V0cHV0IEJGRCB0byBjb250YWluIExNQXMgb2YgaXRzIHNlY3Rpb25zLgotCi1UdWUgTWF5IDI2IDE5OjM3OjQ3IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlLCBzcGFyY19yZWxvY19tYXAsCi0JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IEFkZGVkIFJfU1BBUkNfMzJMRSBmb3IgbGl0dGxlCi0JZW5kaWFuIGRhdGEgMzIgYml0IHJlbG9jYXRpb25zLgotCShlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgaWYgbGlua2luZyBsaXR0bGUKLQllbmRpYW4gb2JqZWN0cyB3aXRoIGJpZyBlbmRpYW4gb2JqZWN0cy4KLQkoZWxmMzJfc3BhcmNfb2JqZWN0X3ApOiBTZXQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgotCShlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IEVGX1NQQVJDX0xFREFUQSBpbiBlX2ZsYWdzLgotCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBBZGRlZCBCRkRfUkVMT0NfU1BBUkNfMzJMRS4KLQkqIHJlbG9jLmM6IFNhbWUuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZGVkIHNwYXJjOnNwYXJjbGl0ZV9sZQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTogTmV3LgotCSogYmZkLWluMi5oIChCRkRfUkVMT0NfU1BBUkNfMzJMRSwgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTogTmV3LgotCi1UaHUgTWF5IDIxIDE2OjU5OjI4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBGaXggcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMgaW4gaWYgKCkKLQlzdGF0ZW1lbnQuCi0KLVR1ZSBNYXkgMTkgMTg6NDE6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogTW92ZSBvdmVyIHBhdGNoIHRvIGJmZC1pbjIuaC4KLQotCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogQWRkIGNhc3RzIGJlZm9yZSBzaGlmdHMgd2hpY2ggbWF5Ci0gCW5vdCBmaXQgaW4gMzIgYml0cy4KLQkoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IExpa2V3aXNlLgotCi1Nb24gTWF5IDE4IDE0OjQ0OjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBJZiB0aGUgc2VjdGlvbiBoYXMgbm8gcHJpdmF0ZSBkYXRhCi0JdGhlbiBkbyBub3QgY3JlYXRlIGEgRGF0YSBEaWN0aW9uYXJ5IGVudHJ5IGZvciBpdC4KLQotTW9uIE1heSAxOCAwMDowOToyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uKTogU2V0IGFnYWluIG9uIGNoYW5nZXMuCi0JKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzLCBlbGY2NF9hbHBoYV9tZXJnZV9nb3RzLAotCWVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zKTogUmV3cml0ZSwgaGFuZGxpbmcgbXVsdGlwbGUgZ290Ci0Jc3Vic2VjdGlvbnMgZHVyaW5nIHJlbGF4YXRpb24gbW9yZSBjb3JyZWN0bHkuCi0KLVRodSBNYXkgMTQgMTQ6MjI6NTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluMi5oOiBBZGQgbmV3IHByb3RvdHlwZTogYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyAoKS4KLQlBZGQgZXh0cmEgYXJndW1lbnQgdG8gYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uICgpLgotCSogYmZkLWluLmg6IFJlZmxlY3QgY2hhbmdlcyBtYWRlIGluIGJmZC1pbjIuaC4KLQkqIGNvZmZnZW4uYyAoYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyk6IE5ldyBmdW5jdGlvbi4gIFNldCB0aGUKLQljb2ZmIGNsYXNzIG9mIGEgQkZEIHN5bWJvbC4KLQkqIGNvZmYtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBpbnRlcndvcmtpbmcgYmV0d2VlbiBUaHVtYiBjb2RlIGFuZAotCW5vbi1pbnRlcndvcmtpbmcgYXdhcmUgQVJNIGNvZGUuCi0KLVN1biBNYXkgMTAgMjI6MzM6NTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UaHUgTWF5ICA3IDE3OjQwOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZmlsZW1vZGUuYzogUmVtb3ZlOyBub3QgdXNlZC4KLQotCUlmIHN5c2RlcC5oIGluY2x1ZGVzIGEgaGVhZGVyIGZpbGUsIGRvbid0IGluY2x1ZGUgaXQgYWdhaW46Ci0JKiBhaXgzODYtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN0ZGRlZi5oPiwgb3IKLQk8ZXJybm8uaD4uCi0JKiBhb3V0eC5oOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4uICBVc2UgInN5c2RlcC5oIiByYXRoZXIgdGhhbgotCTxzeXNkZXAuaD4uCi0JKiBhcmNoaXZlLmM6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPiBvciA8ZXJybm8uaD4uCi0JKiBldmF4LWFscGhhLmM7IERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+LgotCSogZXZheC1lZ3NkLmM6IExpa2V3aXNlLgotCSogZXZheC1ldGlyLmM6IExpa2V3aXNlLgotCSogZXZheC1taXNjLmM6IExpa2V3aXNlLgotCSogZXZheC1lbWguYzogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0JKiBocHBhYnNkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4sIDxzeXMvdHlwZXMuaD4sIG9yCi0JPGVycm5vLmg+LgotCSogaHB1eC1jb3JlLmM6IExpa2V3aXNlLgotCSogbmV0YnNkLWNvcmUuYzogTGlrZXdpc2UuCi0JKiBzb20uYzogTGlrZXdpc2UuCi0JKiBsaWJiZmQuYzogRG9uJ3QgaW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCSogbmxtY29kZS5oOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4uCi0JKiBvc2YtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4gb3IgPHN0ZGlvLmg+LgotCSogcHRyYWNlLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4sIDxzeXMvdHlwZXMuaD4sCi0JPGVycm5vLmg+LCBvciA8dW5pc3RkLmg+LgotCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+IG9yIDxzeXMvdHlwZXMuaD4uCi0KLVRodSBNYXkgIDcgMTM6MTI6NTAgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IElmIHRoZSB2ZXJzaW9uIG51bWJlciBjYW4gbm90IGJlIGZvdW5kIGluCi0JY29uZmlndXJlLmluLCBzZXQgaXQgdG8gInVua25vd24iIHJhdGhlciB0aGFuICIyLjguMSIuCi0KLVdlZCBNYXkgIDYgMDk6NDY6MDUgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfbWFjaCk6IE5ldy4KLQkoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IFVzZSBlbGZfbWlwc19tYWNoLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBVc2UgdGhlIG5hbWVzCi0Jb2YgbWFjaGluZXMsIHJhdGhlciB0aGFuIHRoZSBudW1iZXJzLiAgU2V0IGJvdGggdGhlIEFSQ0gKLQlhbmQgTUFDSCBpbiBlX2ZsYWdzLiAgSGFuZGxlIGEgZmV3IG1vcmUgc3BlY2lmaWMgbWFjaGluZXMuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE1lcmdlIGJvdGgKLQlFRl9NSVBTX0FSQ0ggYW5kIEVGX01JUFNfTUFDSC4KLQotVHVlIE1heSAgNSAyMTowMTo1MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IFJldmVydCBsYXN0IGNoYW5nZS4KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogRGlzY2FyZCBkZWJ1Z2dpbmcgc3ltYm9scy4KLQotVHVlIE1heSAgNSAyMzozNjowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkqIHNvbS5oOiBEb24ndCBpbmNsdWRlIHN5c2RlcC5oLgotCi1UdWUgTWF5ICA1IDE4OjI5OjI0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQtaW4uaDogUmVtb3ZlZCBnZXR0ZXh0IGluY2x1ZGVzIGFuZCBkZWZpbmVzLgotCSogc3lzZGVwLmg6IE1vdmVkIGdldHRleHQtcmVsYXRlZCBpbmNsdWRlcyBhbmQgZGVmaW5lcyBoZXJlLgotCi1UdWUgTWF5ICA1IDE2OjQ3OjU0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogVXNlIGJmZF9pc19sb2NhbF9sYWJlbCByYXRoZXIgdGhhbgotCWFuIGFkLWhvYyB0ZXN0LiAgS2lsbCBib2d1cyAjaWYgMCBjb2RlLgotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBDb25zaWRlciBCU0ZfREVCVUdHSU5HIHN5bWJvbHMgbG9jYWwuCi0KLU1vbiBNYXkgIDQgMTY6MTA6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogRG9uJ3QgdXNlIHRoZSBQTFQgYWRkcmVzcwotCXdoZW4gZ2VuZXJhdGluZyBhIG5vcm1hbCBleGVjdXRhYmxlIGZvciBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQlyZWd1bGFyIGZpbGUuICBXaGVuIGNvcHlpbmcgYSByZWxvYyBpbnRvIHRoZSBvdXRwdXQgZmlsZSwgYWRqdXN0Ci0JdGhlIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbC4KLQotTW9uIE1heSAgNCAxMDowODoxOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliYmZkLWluLmggKF8pOiBEZWZpbmUgYXMgZGdldHRleHQuCi0KLU1vbiBNYXkgIDQgMTE6MDI6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FzdCB0byBiZmRfc2lnbmVkX3ZtYSwKLQlub3Qgc2lnbmVkLgotCSogcGVpY29kZS5oIChwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogVXNlIFBBUkFNUwotCXdoZW4gZGVjbGFyaW5nIHBhcmFtZXRlciB0eXBlcy4KLQkocGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMjkgMTU6MzU6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBJZiB3ZSBpbmNsdWRlIGFueSBFTEYgdGFyZ2V0cyBpbiB0YXJnX2RlZnZlYyBhbmQvb3IKLQl0YXJnX3NlbHZlY3MsIHRoZW4gYWRkIHRoZSBnZW5lcmljIEVMRiB0YXJnZXRzIHRvIHRhcmdfc2VsdmVjcy4KLQkqIGVsZjMyLWdlbi5jIChkdW1teSk6IE5ldyBzdGF0aWMgY29uc3QgdmFyaWFibGUuCi0JKGVsZl9nZW5lcmljX2luZm9fdG9faG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIGFzIGVsZl9nZW5lcmljX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvX3JlbCk6IERlZmluZSBhcyBlbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbC4KLQkqIGVsZjY0LWdlbi5jOiBTYW1lIGNoYW5nZXMgYXMgZWxmMzItZ2VuLmMuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IEZvciB0aGUgZ2VuZXJpYyB0YXJnZXQsIGlnbm9yZSBhCi0JZmFpbHVyZSBvZiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLiAgRml4IGluZGVudGF0aW9uIGEgYml0LgotCi1UdWUgQXByIDI4IDIwOjA1OjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChXSU4zMkxJQkFERCk6IEFkZCAtbGludGwgb24gY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBBcHIgMjggMTI6MTY6NTcgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6ICBVcGRhdGUgT1NSNS9Vbml4d2FyZSBwYXR0ZXJucy4KLQotTW9uIEFwciAyNyAxODowMjoyNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEFsbG93IGZvciBob2xlcwotCWJldHdlZW4gc2VjdGlvbnMgYWRkZWQgYnkgYSBsaW5rIHNjcmlwdC4KLQotTW9uIEFwciAyNyAxMTo0OTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOS40Ci0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIGVsZi5jIChiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotU2F0IEFwciAyNSAyMDowNzo1MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyk6IFJlcGxhY2UgZWxmc3ltIHdpdGggb3RoZXIuCi0JQ2hhbmdlIGFsbCB1c2Vycy4KLQotU2F0IEFwciAyNSAxODoyOTowNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyk6IEFkZCB0c2VjICYgZWxmc3ltIG1lbWJlcnMuCi0JKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBGaWxsIHRoZW0gaW4uCi0JKGVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsKTogSW1wbGVtZW50IG1vcmUgdGhhbiBhIHN0dWIuCi0JKGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayk6IERvbid0IHNldCBTRUNfTE9BRCBvciBkZWZhdWx0Ci0JYWxpZ25tZW50IG9uIC5zY29tbW9uLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogTWVyZ2UgdXNlIGNvdW50cyBhcyB3ZWxsLgotCi1TYXQgQXByIDI1IDE0OjA3OjI5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBVc2UgdGhlIHByb3BlciBzZWN0aW9uCi0JZm9yIGNhbGN1bGF0aW5nIGEgbG9jYWwgc3ltYm9sJ3MgYWRkcmVzcy4KLQkoZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyk6IFNraXAgZW50cmllcyB3aXRoIDAgdXNlIGNvdW50LgotCVNldCB0aGUgLmdvdCdzIGNvb2tlZCBzaXplIGFzIHdlbGwgYXMgdGhlIHJhdyBzaXplLgotCi1GcmkgQXByIDI0IDA5OjE2OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZAotCWludGVybmF0aW9uYWxpc2F0aW9uIG9mIHByaW50ZWQgaW5mb3JtYXRpb24uCi0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQKLQlpbnRlcm5hdGlvbmFsaXNhdGlvbiBvZiBwcmludGVkIGluZm9ybWF0aW9uLgotCi1GcmkgQXByIDI0IDEyOjA5OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChzdHJ1Y3QgaW5kZXhlbnRyeSk6IENoYW5nZSBkaXJlY3RvcnlfbmFtZSwgZmlsZV9uYW1lLAotCWFuZCBmdW5jdGlvbl9uYW1lIGZpZWxkcyB0byBjaGFyICouCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IENoYW5nZSBjYWNoZWRfZmlsZV9uYW1lIGZpZWxkIHRvIGNoYXIgKi4KLQotVGh1IEFwciAyMyAwODoxMzowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGRpcl9uYW1lcyk6IEFkZCBtaXNzaW5nIE5fKCkgbWFjcm9zIHRvIGRpcl9uYW1lcyBhcnJheS4KLQotV2VkIEFwciAyMiAxMzowNjoxNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCi0KLVdlZCBBcHIgMjIgMTc6NDg6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWxvY2FsKTogTWFrZSAkKGluY2x1ZGVkaXIpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBcHIgMjIgMTM6MDY6MTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaDogVXNlIGBnZXR0ZXh0JyBhbmQgbm90IGBkZ2V0dGV4dCcgZm9yIG5vdy4KLQotV2VkIEFwciAyMiAxMjo1Mzo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IEFkZCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQgZm9yIE5pY2sncyBjaGFuZ2VzLgotCi1UdWUgQXByIDIxIDIzOjExOjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyk6IEZpeCBsb3NzYWdlIGluIGxhc3QKLQljaGFuZ2Ugd3J0IGxlbmd0aCA9PSBtYXhfbmFtZWxlbi4KLQotVHVlIEFwciAyMSAyMToxOTozNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYW55IGZpbGVzOiBBZGRlZCBnZXR0ZXh0IGludm9jYXRpb25zIGFyb3VuZCB1c2VyLXZpc2libGUKLQlzdHJpbmdzLgotCSogbGliYmZkLWluLmg6IEFkZGVkIGdldHRleHQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCi0JKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCi0JSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIENyZWF0ZSBwby9NYWtlZmlsZS5pbiBhbmQKLQlwby9NYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogQWRkZWQgcG8uCi0JKFBPVEZJTEVTKTogTmV3IG1hY3JvLgotCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCi0JKFNPVVJDRV9IRklMRVMpOiBOZXcgbWFjcm8uCi0JKEhGSUxFUyk6IFVzZSBpdC4KLQkqIHBvL01ha2UtaW4sIHBvL1BPVEZJTEVTLmluLCBwby9iZmQucG90OiBOZXcgZmlsZXMuCi0KLVR1ZSBBcHIgMjEgMTM6Mzg6MTggMTk5OCBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvcmUuaCAoYmZkX3Byc3RhdHVzKTogIENvcHkgY29yZV9wcnN0YXR1cyBmcm9tIHRoZSBmaXJzdAotCU5UX1BSU1RBVFVTIG5vdGUgc2VjdGlvbiBlbmNvdW50ZXJlZCwgaXQgY29udGFpbnMgdGhlIHN0YXR1cyBvZgotCXRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZCB3aGVuIHRoZSBjb3JlIGZpbGUgd2FzIHdyaXR0ZW4uCi0KLVR1ZSBBcHIgMjEgMTA6MDA6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi5oOiBBZGQgZXh0cmEgcGFyYW1ldGVyIHRvCi0JYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIG92ZXJyaWRlYWJsZSBmdW5jdGlvbi4KLQkqIGNvZmZsaW5rLmM6IFBhc3MgZXh0cmEgcGFyYW1ldGVyIHRvCi0JYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIGZ1bmN0aW9uLgotCSogYmZkLWluLmg6IEFkZCBwcm90b3R5cGVzIGZvciBleHBvcnRlZCBBUk0gaW50ZXJ3b3JraW5nCi0JZnVuY3Rpb25zLgotCSogcGVpY29kZS5oOiBBUk0gc3BlY2lmaWMgY29kZSByZW9yZ2FuaXNlZCB0byBjb25mb3JtIHRvIEJGRAotCWNvZGluZyBjb252ZW50aW9ucy4KLQkqIGNvZmZjb2RlLmg6IEFSTSBzcGVjaWZpYyBjb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gQkZECi0JY29kaW5nIGNvbnZlbnRpb25zLgotCSogY29mZi1hcm0uYzogQ29kZSByZW9yZ2FuaXNlZCB0byBjb25mb3JtIHRvIHRoZSBCRkQgY29kaW5nCi0JY29udmVudGlvbnMuICBHbG9iYWwgdmFyaWFibGVzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGFuIEFSTQotCXNwZWNpZmljIGhhc2ggdGFibGUgc3RydWN0dXJlIGFuZCBhIG5ldyBmdW5jdGlvbjoKLQliZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZygpIGhhcyBiZWVuIGNyZWF0ZWQgd2hpY2ggaXMKLQljYWxsZWQgZnJvbSB0aGUgbGlua2VyIHNjcmlwdHMuCi0KLVR1ZSBBcHIgMjEgMDA6MTE6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogU2ltcGxpZnkgZW5kLW9mLW5hbWUgdGVzdC4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMpOiBSZW5hbWVkIGZyb20KLQllbGY2NF9hbHBoYV9yZWxheF9maW5kX3JlbG9jX29mcy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayk6IFB1dCBzbWFsbCBjb21tb25zIGluIC5zY29tbW9uIG5vdCAuc2Jzcy4KLQkoZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMpOiBEb24ndCBtZXJnZSAuZ290IHNlY3Rpb25zIHR3aWNlLgotCi1TYXQgQXByIDE4IDAxOjIxOjA0IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGRlZCBzcGFyYzg2eCBzdXBwb3J0LgotCi1GcmkgQXByIDE3IDIyOjI5OjA0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGNvbXBsYWluIGFib3V0Ci0JYW4gb3V0IG9mIHJhbmdlIHBjLXJlbGF0aXZlIGp1bXAvY2FsbCB0byBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0KLVRodSBBcHIgMTYgMTM6NDk6MDAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwKTogRG8gYWxsIGdwZGlzcAotCWNvbXBhcmlzb25zIHNpZ25lZC4KLQotVGh1IEFwciAxNiAxMTo0MzozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSWYgYSBzbHVycCBzdWJyb3V0aW5lIHJldHVybnMKLSAJYW4gZXJyb3Igb3RoZXIgdGhhbiBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsIHNldCB0aGUgZXJyb3IgdG8KLSAJYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3RvcikgW1NFTEVDVF9WRUNTIG5vdCBkZWZpbmVkXTogQWRkCi0JYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMuCi0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBJZiBhbGwgdGhlIHBfcGFkZHIgZmllbGRzIGluIHRoZQotCXByb2dyYW0gc2VnbWVudHMgYXJlIHplcm8sIGRvbid0IHNldCBwX3BhZGRyX3ZhbGlkLgotCi1XZWQgQXByIDE1IDIyOjE1OjE2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmM6IEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgcmVsYXhhdGlvbiAtLQotCShzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB1c2VfY291bnQgbWVtYmVyLgotCShlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MpOiBJbml0aWFsaXplIGFuZCBpbmNyZW1lbnQgaXQuCi0JKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzKTogQ2hlY2sgaXQgd2hlbiBjb25zaWRlcmluZyBtZXJnaW5nLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogRHJvcCBlbnRyaWVzIHdpdGggemVybyB1c2UuCi0JKGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IFNwbGl0IG91dCBnb3Qgc2l6aW5nIC4uLgotCShlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyk6IC4uLiBoZXJlLiAgTmV3IGZ1bmN0aW9uLgotCShlbGY2NF9hbHBoYV9yZWxheF9maW5kX3JlbG9jX29mcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfaG93dG9fdGFibGUpOiBJbXBsZW1lbnQgR1BSRUxISUdIL0xPVyAmIElNTUVEX0dQXzE2LgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMTUgMTY6MDg6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFVzZSBuZXcgRU1fU1BBUkNWOSBzeW1ib2wuCi0JKiBlbGY2NC1zcGFyYy5jIChFTEZfTUFDSElORV9DT0RFKTogTGlrZXdpc2UuCi0JKEVMRl9NQUNISU5FX0FMVDEpOiBOZXcuICBTZXQgdG8gRU1fT0xEX1NQQVJDNjQuCi0KLVdlZCBBcHIgMTUgMTE6MzQ6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCAtbGtlcm5lbDMyIHRvIFdJTjMyTElCQUREIG9uIGN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gQXByIDEzIDE2OjQ2OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZF9sYV9MSUJBREQpOiBBZGQgQFdJTjMyTElCQUREQC4KLQkobGliYmZkX2xhX0xERkxBR1MpOiBBZGQgQFdJTjMyTERGTEFHU0AuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBXSU4zMkxERkxBR1MgYW5kCi0JV0lOMzJMSUJBREQuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXByIDEwIDEzOjQ0OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNb3ZlIGEgUEUgQ09NREFUIHN5bWJvbAotCWJlZm9yZSBhbnkgb3RoZXIgc3ltYm9scyBpbiB0aGUgc2FtZSBzZWN0aW9uLgotCi1XZWQgQXByICA4IDE0OjUwOjIzIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjKi0qLSopOiBSZW1vdmUgUG93ZXJQQyBOVCBzdXBwb3J0IGZyb20gRUxGCi0Jc3lzdGVtcy4KLQotVHVlIEFwciAgNyAxNjoyNTozMSAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmMgKGNvbXBfdW5pdCk6IE1vdmUgaXQgZWFybGllciBpbiB0aGUgc291cmNlLiBBZGQKLQlhZGRyX3NpemUuCi0JKHJlYWRfYWRkcmVzcyk6IFJlcGxhY2UgJ2JkZionIGFyZ3VtZW50IHdpdGggJ2NvbXBfdW5pdConIGFyZ3VtZW50LgotICAgICAgICBVc2UgYWRkcl9zaXplIGZvciBhZGRyZXNzIHNpemUsIHJhdGhlciB0aGFuIHNpemVvZihiZmRfdm1hKS4KLQkocmVhZF9hdHRyaWJ1dGUpOiBSZXBsYWNlIGJkZiogYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0JRml4IGNhbGwgdG8gcmVhZF9hZGRyZXNzLgotCShkZWNvZGVfbGluZV9pbmZvKTogUmVwbGFjZSBiZGYqIGFyZ3VtZW50IHdpdGggJ2NvbXBfdW5pdConIGFyZ3VtZW50LgotCVNjcmFwIG90aGVyIHVubmVlZGVkIGFyZ3VtZW50cy4gIEZpeCBjYWxsIHRvIHJlYWRfYWRkcmVzcy4KLQkoc2Nhbl91bml0X2Zvcl9mdW5jdGlvbnMpOiBGaXggY2FsbCB0byByZWFkX2F0dHJpYnV0ZS4KLQkocGFyc2VfY29tcF91bml0KTogV2Ugbm93IGhhbmRsZSBtb3JlIHZhbHVlcyBmb3IgYWRkcl9zaXplLgotCVNldCBhZGRyX3NpemUgaW4gdW5pdC4gIEZpeCBjYWxsIHRvIHJlYWRfYXR0cmlidXRlIGFuZAotCWRlY29kZV9saW5lX2luZm8uCi0KLVR1ZSBBcHIgIDcgMTU6NDQ6NDcgMTk5OCAgR2F2aW4gUm9taWctS29jaCA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmMgKHBhcnNlX2NvbXBfdW5pdCk6IERyb3AgdXNlIG9mIHVuaXQtPm5hbWUgd2hlbiBpdCBpcyBudWxsLgotCi1UdWUgQXByICA3IDEyOjM1OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IEFkZCBtNjhrIGNhc2VzIGJhY2sgdG8gZGVmYXVsdAotCXN3aXRjaCwgcmV2ZXJ0aW5nIHBhdGNoIG9mIE1hcmNoIDI1LCBzaW5jZSBJRUVFIHN1cHBvcnQgZGVwZW5kcwotCXVwb24gdGhlbS4KLQotTW9uIEFwciAgNiAxNDowNjo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVN1biBBcHIgIDUgMTY6MjE6NDQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBGaXggY29tcHV0YXRpb24gb2YKLQlzb21fb2Zmc2V0IHdoZW4gd2UgaGF2ZSBhbiBleHRlbmRlZCBuYW1lIHRhYmxlLgotCi1TdW4gQXByICA1IDE2OjA0OjM5IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKHN0YW1wLWxpYik6IENoZWNrIHRoYXQgLmxpYnMvbGliYmZkLmEgZXhpc3RzIGJlZm9yZQotCXRyeWluZyB0byBjb3B5IGl0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDMgMTE6MDk6NDIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogR2VuZXJhdGUgc2VjdGlvbgotCXN5bWJvbHMgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShlbGZfbTY4a19hZGp1c3RfZHluaW5keCk6IE5ldyBmdW5jdGlvbiwgdXNlZCBieSBhYm92ZSBjb2RlLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEluaXRpYWxpemUgdGhlIHNlY3Rpb24KLQlzeW1ib2xzLgotCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogQ2hhbmdlIGFib3J0IHRvIEJGRF9BU1NFUlQuCi0KLVdlZCBBcHIgIDEgMTY6MDQ6MDIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoaW5fcmVsb2NfcCk6IFVzZSBBUk1fUlZBMzIgaW4gcGxhY2Ugb2YgY29uc3RhbnQKLQl2YWx1ZSAxMS4KLQotV2VkIEFwciAgMSAxMzozNjo1OCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uLCBjYXNlIFJfNjhLX1BMVCpPKTogRml4Ci0JYXNzZXJ0aW9uLgotCi1UdWUgTWFyIDMxIDAwOjEyOjEyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogQ29ycmVjdGx5IGhhbmRsZQotCWFic29sdXRlIHN5bWJvbHMuCi0KLU1vbiBNYXIgMzAgMTI6NDY6MTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLU1vbiBNYXIgMzAgMTI6MjA6NTAgMTk5OCAgQnJlbnQgQmFjY2FsYSAgPGJhY2NhbGFAZnJlZXNvZnQub3JnPgotCi0JKiBzeW1zLmMgKEVOQUJMRV9DQUNISU5HKTogRGVmaW5lLgotCShzdHJ1Y3QgaW5kZXhlbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IHN0YWJfY2FjaGUpOiBSZW1vdmUuCi0JKGNtcGluZGV4ZW50cnkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3Qgc3RhYl9maW5kX2luZm8pOiBBZGQgbmV3IGZpZWxkczogaW5kZXh0YWJsZSwKLQlpbmRleHRhYmxlc2l6ZSwgY2FjaGVkX2luZGV4ZW50cnksIGNhY2hlZF9vZmZzZXQsIGNhY2hlZF9zdGFiLCBhbmQKLQljYWNoZWRfZmlsZV9uYW1lLiAgUmVtb3ZlIGZpZWxkczogZmlsZV9jYWNoZSwgZnVuY3Rpb25fY2FjaGUsIGFuZAotCWxpbmVfY2FjaGUuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogUmV3cml0ZSB0byBidWlsZCBhIHNvcnRlZAotCWluZGV4IHRhYmxlIGFuZCBzZWFyY2ggaXQuCi0KLU1vbiBNYXIgMzAgMTA6Mzk6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENhbGwKLQljb3B5X3ByaXZhdGVfYmZkX2RhdGEgb25jZSB3ZSd2ZSBzZWVuIHRoZSBsYXN0IFNFQ19BTExPQyBzZWN0aW9uLgotCi0JKiBjcHUtbWlwcy5jOiBSZW1vdmUgdHJhaWxpbmcgY29tbWEgYXQgZW5kIG9mIGVudW1lcmF0aW9uIGxpc3QuCi0KLVNhdCBNYXIgMjggMTY6MzM6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBEZWZpbmUgYWxsIGdsb2JhbGx5IHZpc2libGUgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMKLQlvbmx5IHdoZW4gQ09GRl9XSVRIX1BFIGlzIG5vdCBkZWZpbmVkLgotCSogY29uZmlndXJlLmluIChhcm1wZV9saXR0bGVfdmVjLCBhcm1wZV9iaWdfdmVjKTogQWRkCi0JY29mZi1hcm0ubG8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjcgMTY6MDY6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogYW91dC1hcm0uYyAoTVkoZml4X3BjcmVsXzI2KSk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyk6IExpa2V3aXNlLgotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IExpa2V3aXNlLgotCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IExpa2V3aXNlLgotCSogYmluYXJ5LmMgKG1hbmdsZV9uYW1lKTogTGlrZXdpc2UKLQkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fZml4X3BjcmVsXzI2KTogTGlrZXdpc2UuCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtc3RnbzMyLmMgKGNyZWF0ZV9nbzMyX3N0dWIpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBMaWtld2lzZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkobWFuZ2xlX25hbWUpOiBMaWtld2lzZS4KLQkqIHJpc2NpeC5jIChyaXNjaXhfZml4X3BjcmVsXzI2KTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IExpa2V3aXNlLgotCSogc3RhYnMuYyAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBhb3V0LW5zMzJrLmMgKF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMpOiBBZGQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoLiAgRGVjbGFyZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbiBwb2ludGVycy4KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBBZGQgYnJhY2VzIHRvIGF2b2lkIGFtYmlndW91cyBpZgotCXdhcm5pbmcuCi0JKiBlbGYuYyAoZWxmX3NvcnRfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uKTogSW5pdGlhbGl6ZSByZWxvY2F0aW9uLgotCUFkZCBkZWZhdWx0IGNhc2VzIHRvIHN3aXRjaGVzLgotCShjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JQWx3YXlzIHNldCByc3RhdC4KLQkoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogQ2hhbmdlIGZsYWcgdmFyaWFibGUgdG8gdHlwZQotCWZsYWd3b3JkLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEluaXRpYWxpemUgdXNlX2xvLgotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF90b2NfZW50cnkpOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKGR1bXBfdG9jKTogQ2hhbmdlIGNhdCB0byBjb25zdCwgYW5kIGluaXRpYWxpemUgaXQuCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEluaXRpYWxpemUgc3RhcnQgYW5kIHZvZmYuCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0JKHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSW5pdGlhbGl6ZSByX3N5bW5keC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogT25seSBkZWNsYXJlCi0Jb2xkX3NvZmFyIGlmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW5pdGlhbGl6ZSBjc3ltLgotCSogY29mZmdlbi5jIChjb2ZmX3BvaW50ZXJpemVfYXV4KTogTWFrZSB0eXBlIGFuZCBjbGFzcyB1bnNpZ25lZC4KLQkqIGNwdS1uczMyay5jIChfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQpOiBBZGQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoLgotCSogZHdhcmYyLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHJlYWRfMl9zaWduZWRfYnl0ZXMsIHJlYWRfNF9zaWduZWRfYnl0ZXMpOiBDb21tZW50IG91dC4KLQkoZGVjb2RlX2xpbmVfaW5mbyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9zZGExNl9yZWxvYyk6IExpa2V3aXNlLgotCShtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogTGlrZXdpc2UuCi0JKHY4NTBfZWxmX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBlbGYtYmZkLmggKGVsZl9saW5rZXJfc2VjdGlvbl90KTogTWFrZSBhbGlnbm1lbnQgdW5zaWduZWQuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTWFrZSBjdmVyZGVmcyBhbmQgY3ZlcnJlZnMgdW5zaWduZWQuCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEFsd2F5cyBzZXQgYWRqdXN0LgotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBJbml0aWFsaXplIHRtcF9hZGRyLiAgRnVsbHkKLQlwYXJlbnRoZXNpemUgZXhwcmVzc2lvbi4KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFsd2F5cyBpbml0aWFsaXplIGguCi0JKG0zMnJfZWxmX29iamVjdF9wKTogUmV0dXJuIGEgdmFsdWUuCi0JKG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDaGFuZ2UgZnByaW50ZiBmb3JtYXQgc3RyaW5nLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBsYXN0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEluaXRpYWxpemUgbGFzdCBhbmQgZGluZHguCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX29iamVjdF9wKTogUmV0dXJuIGEgdmFsdWUuCi0JKHY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDaGFuZ2UgZnByaW50ZiBmb3JtYXQgc3RyaW5nLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hhbmdlIHN5bWNvdW50IGFuZCBpIHRvCi0JdW5zaWduZWQgbG9uZy4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2hhbmdlIHZlcm51bSB0bwotCXVuc2lnbmVkIGludCwgYW5kIGluaXRpYWxpemUgaXQuICBDaGFuZ2UgZnByaW50ZiBmb3JtYXQgc3RyaW5nLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENhc3QgLTEgdG8gYmZkX3NpemVfdHlwZQotCXdoZW4gc2V0dGluZyBvciBjb21wYXJpbmcgdG8gc29uYW1lX2luZHguCi0JKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IENoYW5nZSBudW1fc3ltYm9scyB0bwotCXVuc2lnbmVkIGludC4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUpOiBDaGFuZ2UgZmxhZ3MgdG8gZmxhZ3dvcmQuCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogSW5pdGlhbGl6ZSBpZHguICBDaGFuZ2UgaiB0bwotCWJmZF9zaXplX3R5cGUuICBJbml0aWFsaXplIGhpbnRfbWVtYmVyLiAgUmVtb3ZlIHVzZWxlc3MgdGVzdCB0bwotCXRpbWVfc3RhbXAuCi0JKHBlX3ByaW50X2VkYXRhKTogQ2hhbmdlIG51bV9mdW5jdGlvbnMgYW5kIG51bV9uYW1lcyBpbiBzdHJ1Y3QKLQlFRFRfdHlwZSB0byB1bnNpZ25lZCBsb25nLiAgUmVtb3ZlIGNhc3QuICBDaGFuZ2UgZnByaW50ZiBmb3JtYXQKLQlzdHJpbmcuCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfb2JqZWN0X3ApOiBDaGFuZ2UgaSB0byBzaXplX3QuCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gdW5zaWduZWQKLQlpbnQuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IENoYW5nZSBzaHJpbmtzIHRvCi0JaW50ICouICBVcGRhdGUgdXNlcy4gIENoYW5nZSBqIHRvIGxvbmcuCi0JKiBiZmQtaW4yLmgsIGxpYmNvZmYuaDogUmVidWlsZC4KLQotRnJpIE1hciAyNyAxMDoxMDo0NiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgUmVtb3ZlIGRlZmluaXRpb24gb2YgVVNFX1JFTC4KLQkodjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhKTogTmV3IGZ1bmN0aW9uLgotCSh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiAgUmVuYW1lZCBmcm9tCi0Jdjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24uICBSZW1vdmVkIHJlcGxhY2UgYXJndW1lbnQuCi0JKHY4NTBfZWxmX3JlbG9jKTogc3RvcmUgdGhlIHJlbG9jYXRpb24gaW4gdGhlIGFkZGVuZCBmaWVsZCBpbnN0ZWFkCi0Jb2YgdGhlIGluc24uCi0JKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTm93IGNhbGxzCi0Jdjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLgotCSh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIFJlbW92ZSBjb2RlIHRvIGdlbmVyYXRlIFJFTAotCXJlbG9jYXRpb25zLgotCi1UaHUgTWFyIDI2IDEzOjMyOjE3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IHRoZSB0eXBlIGFuZCBzdG9yYWdlCi0JY2xhc3MgaW4gdGhlIG5hdGl2ZSBzeW1ib2wgaW5mb3JtYXRpb24gYWxsb2NhdGVkIGZvciBhIG5ldyBzZWN0aW9uCi0Jc3ltYm9sLgotCi1UaHUgTWFyIDI2IDEwOjEzOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaDogQ2hhaW4gdG9nZXRoZXIgY2FsbHMgdG8KLQljb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgYW5kCi0JY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCSogY29mZi1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yCi0JY29mZl9hcm1fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgYW5kCi0JY29mZl9hcm1fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KLQotV2VkIE1hciAyNSAxNTo0NTo1NSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBTZXQgcHJpdmF0ZSBmYWxncyBldmVuIGZvciBhIFBFCi0JYnVpbGQuCi0KLQkqIHBlaWNvZGUuaDogQ2FsbCBhcm0tY29mZiBwcml2YXRlIGRhdGEgZnVuY3Rpb25zIGFmdGVyIGhhbmRsaW5nCi0JcGUgcHJpdmF0ZSBkYXRhLgotCi0JKiBjb2ZmLWFybS5jOiBUdXJuIHN0YXRpY3MgaW50byBnbG9iYWxzIHNvIHRoYXQgdGhleSBjYW4gYmUgc2hhcmVkCi0JYm90aCBwZSBhbmQgcGVpIGJhY2tlbmRzLgotCi1XZWQgTWFyIDI1IDE1OjE5OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dGYxLmggKHN1bm9zX3NldF9hcmNoX21hY2gpOiBVc2UgYmZkX21hY2hfbTY4KiByYXRoZXIgdGhhbgotCXBsYWluIG51bWJlcnMuCi0JKHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMjUgMTM6NTk6MjQgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX202OCopOiBBZGQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgbTY4awotCXZhcmlhbnRzLgotCShiZmRfZGVmYXVsdF9zY2FuKTogUmVtb3ZlIG02OGsgc3BlY2lhbCBjYXNlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIG1pcHNic2QuYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFVzZSBiZmRfbWFjaF9tNjgqIHJhdGhlcgotCXRoYW4gcGxhaW4gbnVtYmVycy4KLQkqIHNwYXJjbHlueC5jIChOQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkpOiBMaWtld2lzZS4KLQkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBMaWtld2lzZS4gIEFkZCBlbnRyeSBmb3IKLQltNjhrOjY4MDAwLgotCShiZmRfbTY4a19hcmNoKTogU2V0IG1hY2ggZmllbGQgdG8gemVybyB0byBzaWduYWwgbm8gZXhwbGljaXQKLQlzZWxlY3Rpb24sIGNoYW5nZSBwcmludGFibGVfbmFtZSB0byBqdXN0ICJtNjhrIiBhbmQgbWFrZSB0aGF0IHRoZQotCWRlZmF1bHQgaW5zdGVhZCBvZiBtNjhrOjY4MDIwLgotCi0JKiBhb3V0LXRpYzMwLmMgKE5BTUUpOiBEZWZpbmUgdGhpcyB0byBhdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9ucwotCWZyb20gYW91dHguaC4KLQkoTVlfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUgYXMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotCXJhdGhlciB0aGFuIE5BTUUoYW91dCxnZXRfc2VjdGlvbl9jb250ZW50cykuCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRml4IGNhc3QuCi0KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9zZXRfYXJjaF9tYWNoKTogT25seSBhY2NlcHQgYmZkX2FyY2hfYWxwaGEKLQlhbmQgY2FsbCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIHRvIGRvIHRoZSByZWFsIHdvcmsuCi0KLVdlZCBNYXIgMjUgMTA6NDE6MzUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChCQUxYKTogSW5jbHVkZSByZXR1cm4gcmVnaXN0ZXIgZzE0IGFzIHBhcnQgb2YgdGhlIGluc24uCi0JKEJBTFhfTUFTSyk6IE5ldy4KLQkoY2FsbGp4X2NhbGxiYWNrKTogVXNlIGl0LgotCi1XZWQgTWFyIDI1IDExOjE5OjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKEJGRF9BTElHTik6IENhc3QgdGhpcyBwYXJhbWV0ZXIgdG8gYmZkX3ZtYS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkpOiBDaGFuZ2UKLQlieXRlX2NvdW50IHRvIHVuc2lnbmVkIGludC4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluaXRpYWxpemUgaW50ZXJuYWxfcmVsb2NzLiAgUmVtb3ZlCi0JdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQotCSogZXZheC1hbHBoYS5jIChldmF4X2Nsb3NlX2FuZF9jbGVhbnVwKTogUmVtb3ZlIHVudXNlZCBsb2NhbAotCXZhcmlhYmxlcyBlciBhbmQgZXIxLgotCi0JKiBjcHUtdjg1MC5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoc2Nhbik6IENhc2UgaXNkaWdpdCBhcmd1bWVudCB0byB1bnNpZ25lZCBjaGFyLgotCi0JRnJvbSBZYW4gTWVyb3RoIDxZQU4uTUVST1RIQHN0LmNvbT46Ci0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IEFkZCBleHRiYXNlIHZhcmlhYmxlIHNvIHRoYXQgZ2V0dGluZyBhbgotIAlleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgZG9lcyBub3QgaWdub3JlIGFueSBwcmV2aW91cwotIAlleHRlbmRlZCBhZGRyZXNzLgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFdoZW4gd3JpdGluZyBvdXQgYW4gZXh0ZW5kZWQgbGluZWFyCi0gCWFkZHJlc3MgcmVjb3JkLCB6ZXJvIG91dCBhbnkgcHJldmlvdXMgZXh0ZW5kZWQgYWRkcmVzcy4KLQotVHVlIE1hciAyNCAxNjowOTo0MyAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGllZWUuYyAoZG9fb25lKTogQ2hlY2sgc2VjdGlvbiBiZWZvcmUgZGVyZWZlcmVuY2luZyBpdC4KLQkoaWVlZV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZSB3aXRoIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyLgotCShpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IExpa2V3aXNlIHdpdGggYWJmZC0+bXlfYXJjaGl2ZS4KLQotTW9uIE1hciAyMyAxODo1MTo0NyAxOTk4ICBKb2VsIFNoZXJyaWxsICA8am9lbEBPQVJjb3JwLmNvbT4KLQotCSogY29uZmlnLmJmZDogKHNoKi0qLXJ0ZW1zKik6IFN3aXRjaGVkIGZyb20gRUxGIHRvIENPRkYuCi0KLU1vbiBNYXIgMjMgMTQ6MjM6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogQWRkIGludGVyd29ya2luZyBmdW5jdGlvbnMgdG8gcGUgYmFja2VuZHMuCi0KLUZyaSBNYXIgMjAgMTg6NDc6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBBTV9ESVNBQkxFX1NIQVJFRC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1GcmkgTWFyIDIwIDExOjI1OjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBCZXR0ZXIgZXJyb3IgbWVzc2FnZXMKLQl3aGVuIGludGVyb3dya2luZyBjb25mbHVjdHMgb2NjdXIuICBDb3VydGVzeSBvZiBKb25hdGhhbiBXYWx0b24KLQlhbmQgVG9ueSBUaG9tcHNvbi4KLQkoYW91dGFybV9zdGRfcmVsb2NfaG93dG8pOiBGaXhlZCBiaXRzaXplIGZpZWxkcyBvZiByaWdodHNoaWZ0ZWQKLQlyZWxvY2F0aW9ucy4gIFBhdGNoIGNvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbiBhbmQgVG9ueQotCVRob21wc29uLgotCi1GcmkgTWFyIDIwIDAyOjI2OjQzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJldmVydAotCXBhcnQgb2YgRmViIDIyIGNoYW5nZSBjb250cm9saW5nIHdoZW4gdG8gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nCi0Jc3ltYm9sIHdpdGggdGhlIC5wbHQgZW50cnkuCi0KLVdlZCBNYXIgMTggMDk6MjY6MjUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAodGFyZ19jcHUpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi0JKiBjb2ZmY29kZS5oIChPVEhFUl9HTE9CQUxfQ0xBU1MpOiBTdXBwb3J0IHRodW1iIGV4dGVybmFsCi0JZnVuY3Rpb25zIGluIFBFIGJ1aWxkLgotCi1TdW4gTWFyICA4IDIzOjM3OjI2IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjbGl0ZS0qLWVsZiopOiBBZGRlZC4KLQotTW9uIEZlYiAyMyAxOTozMToxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGVsZi5sbyB0byBlbGYgc2hlbGwgdmFyaWFibGUuCi0JKiBNYWtlZmlsZS5hbSAoQkZEX0xJQlMpOiBSZW1vdmUgZWxmLmxvLgotCShCRkRfTElCU19DRklMRVMpOiBSZW1vdmUgZWxmLmMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZi5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZi5jLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OC0wMi0yMyAxNTo1MyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogQSBwYy1yZWxhdGl2ZQotCXJlbG9jYXRpb24gYWdhaW5zdCBhIG5vdy1sb2NhbCBzeW1ib2wgc2hvdWxkIG5vdCBoYXZlIGEgZHluYW1pYwotCXJlbG9jYXRpb24uCi0KLU1vbiBGZWIgMjMgMTY6MTc6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogRG9uJ3Qgc2V0IEJGRCBmbGFnIEhBU19TWU1TIGluCi0JQ09GRiBmaWxlaGRyIGZsYWdzLgotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUHJpbnQgUEUgZmxhZ3MuICBGcm9tIE1pa2V5Ci0JPGplZmZkYkBuZXR6b25lLmNvbT4uCi0KLVN1biBGZWIgMjIgMjA6Mzk6MDAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgY3JlYXRlCi0gCWEgcGx0IGVudHJ5IHdoZW4gd2UgY2FuIGRldGVybWluZSB0aGF0IHdlIGF1dGhvcml0YXRpdmVseSBkZWZpbmUKLSAJdGhlIHN5bWJvbC4KLQotU3VuIEZlYiAyMiAyMDozMzowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKENPUkVGSUxFIHNlbGVjdGlvbik6IFJlbW92ZSBzcGFyYy0qLWxpbnV4Ki4gIFRoZXkKLQlkb24ndCBhY3R1YWxseSB1c2UgdHJhZC1jb3JlLCBidXQgYSBTdW5PUy1zdHlsZSBjb3JlIGZpbGUgaGFuZGxlZAotCWJ5IGdkYiBkaXJlY3RseS4KLQkqIGhvc3RzL3NwYXJjbGludXguaDogUmVtb3ZlLgotCi1XZWQgRmViIDE4IDE1OjMxOjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IElmIHRoZXJlIGlzIG5vIC5pZGF0YSBzZWN0aW9uLCBsb29rCi0JZm9yIHRoZSBpbXBvcnQgdGFibGVzIGluIHNvbWUgb3RoZXIgc2VjdGlvbi4gIE1ha2UgdGhlIGluaXRpYWwKLQlsYWJlbCBsaW5lIHVwIGJldHRlciB3aXRoIHRoZSBkYXRhLiAgUHJpbnQgdGhlIGltcG9ydCBhZGRyZXNzCi0JdGFibGUgZXZlbiBpZiB0aGVyZSBpcyBubyBpbXBvcnQgbmFtZSB0YWJsZS4gIElmIHRoZSBpbXBvcnQKLQlhZGRyZXNzIHRhYmxlIGhvbGRzIGFjdHVhbCBhZGRyZXNzZXMsIHByaW50IHRoZW0uCi0KLVR1ZSBGZWIgMTcgMTI6NTg6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX3NlZWspOiBJZiBmc2VlayBmYWlscywgc2F2ZSBlcnJubyBhcm91bmQgY2FsbCB0bwotCWJmZF90ZWxsLiAgSWYgZXJybm8gaXMgRUlOVkFMLCBzZXQgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLCBub3QKLQliZmRfZXJyb3Jfc3lzdGVtX2NhbGwuCi0KLUZyaSBGZWIgMTMgMTM6MTE6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCi0JRnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAobGliYmZkX2xhX0xERkxBR1MpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEZlYiAxMiAxNzozMToxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIG5ldGJzZC5oIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQkoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFVzZSBERUZBVUxUX0FSQ0ggYW5kIERFRkFVTFRfTUlEIHdoZW4KLQljYWxsaW5nIE5fU0VUX01BQ0hUWVBFLCByYXRoZXIgdGhhbiBoYXZpbmcgYSBzd2l0Y2guCi0JKiBsaWJhb3V0LmggKGVudW0gbWFjaGluZV90eXBlKTogQWRkIE1fUE1BWF9ORVRCU0QsIE1fVkFYX05FVEJTRCwKLQlhbmQgTV9BTFBIQV9ORVRCU0QuCi0JKiBpMzg2bmV0YnNkLmMgKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQkqIG02OGs0a25ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQkqIG02OGtuZXRic2QuYzogKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQkqIG5zMzJrbmV0YnNkLmMgKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQkqIHNwYXJjbmV0YnNkLmMgKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQotCU5ldEJTRCBwYXRjaGVzIGZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogdmF4bmV0YnNkLmM6IE5ldyBmaWxlLgotCSogbmV0YnNkLWNvcmUuYzogQ2xlYW4gdXAuICBSZW1vdmUgdW51c2VkIG1hY3Jvcy4gIFVzZSBuZXRic2QKLQlyYXRoZXIgdGhhbiBuZXRic2RfY29yZS4KLQkqIHRhcmdldHMuYyAodmF4bmV0YnNkX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHZheG5ldGJzZF92ZWMuICBJZiBORVRCU0RfQ09SRSBpcwotCWRlZmluZWQsIGFkZCBuZXRic2RfY29yZV92ZWMuCi0JKiBjb25maWd1cmUuaW46IFNldCBDT1JFRklMRSBmb3IgYWxwaGEqLSotbmV0YnNkKiBhbmQKLQlwb3dlcnBjLSotbmV0YnNkKiB0byBuZXRic2QtY29yZS5sby4gIElmIENPUkVGSUxFIGlzCi0JbmV0YnNkLWNvcmUubG8sIHNldCBDT1JFRkxBRyB0byAtRE5FVEJTRF9DT1JFLgotCSogY29uZmlnLmJmZCAoYWxwaGEqLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCB2YXhuZXRic2QubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCB2YXhuZXRic2QuYy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZW1vdmUgdGhlIG9sZCBzaGFyZWQgbGlicmFyeSBidWlsZCBzdHVmZi4gIFdlCi0Jbm93IHVzZSBsaWJ0b29sIGluc3RlYWQuCi0KLVdlZCBGZWIgMTEgMTc6MTM6MDkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGVraGV4LmMgKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIHRla2hleF9pbml0LgotCi1UdWUgRmViIDEwIDE5OjIzOjI4IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlndXJlLmluOiBUYWtlIHN0YWItc3ltcy5sbyBvdXQgb2Ygc3BhcmNsaW51eF92ZWMgbGlzdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEZlYiAxMCAxNToxNjozOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCSogZWxmMzItdjg1MC5jIChyZW1lbWJlcl9oaTE2c19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IFVzZSB0aGUgYWJvdmUgbmV3IGZ1bmN0aW9ucyB0bwotCW1hdGNoIHVwIEhJNlMgcmVsb2NzIHdpdGggTE8xNiByZWxvY3MuCi0KLVR1ZSBGZWIgMTAgMTU6MDE6MzkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtbGludXgqIHRvIC1saW51eC1nbnUqLgotCSogY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3Q6IExpa2V3aXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gRmViICA5IDE5OjQwOjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBGaXggYW5vdGhlcgotCUxPMTYvSEkxNlMgYnVnIGFuZCBpbXByb3ZlIGNvbW1lbnRzIGFib3V0IHdoYXQgaXMgZ29pbmcgb24uCi0KLVNhdCBGZWIgIDcgMTU6Mjc6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotRnJpIEZlYiAgNiAxNDo0ODoyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEbyBub3QgY29tcGxhaW4KLQl3aGVuIG1lcmdpbmcgdjg1MCBjb2RlIGludG8gdjg1MGUvdjg1MGVhIGNvZGUuICBEbyBub3QgaW5pdGlhbGlzZQotCW91dHB1dCBmbGFncyBpZiB0aGUgaW5wdXQgaXMgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlLgotCi1GcmkgRmViICA2IDExOjUwOjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jIChiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRm9yIEJGRF9SRUxPQ19DVE9SCi0JZ2V0IHRoZSBzaXplIGZyb20gYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyBpbnN0ZWFkIG9mIGRpcmVjdGx5Ci0JZnJvbSB0aGUgaXNhLgotCi1UaHUgRmViICA1IDE0OjIxOjM0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoQkZEX0FMSUdOKTogSWYgcm91bmRpbmcgdXAgd291bGQgY2F1c2UgdGhlIGFkZHJlc3MKLQl0byB3cmFwLCBqdXN0IHJldHVybiBhbGwgMSdzIGJpdHMgaW5zdGVhZC4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViICA1IDExOjUxOjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbgotCWlmIENPRkZfV0lUSF9QRS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgQ09GRl9XSVRIX1BFLCBkZWZpbmUgYXMKLQljb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLAotCXNraXAgZW1wdHkgc2VjdGlvbnMsIHRvIG1hdGNoIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLgotCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogU3dhcCBvdXQgcl9hZGRlbmQsCi0gCXJhdGhlciB0aGFuIHN3YXBwaW5nIG91dCByX29mZnNldCB0d2ljZS4gIEZyb20gTHVrZSBEZWxsZXIKLSAJPGx1a2VkQGNzZS51bnN3LmVkdS5hdT4uCi0KLVdlZCBGZWIgIDQgMTk6MTE6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBsaWJ0b29sX2VuYWJsZV9zaGFyZWQgcmF0aGVyIHRoYW4KLQlsaWJ0b29sX3NoYXJlZC4gIFJlbW92ZSBkaXZlcnNpb24gaGFjay4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZAotCXdpdGggbmV3IGxpYnRvb2wuCi0KLVdlZCBGZWIgIDQgMTY6MTA6MjEgMTk5OCAgQnJlbnQgQmFjY2FsYSAgPGJhY2NhbGFAZnJlZXNvZnQub3JnPgotCi0JKiBzeW1zLmMgKHN0cnVjdCBzdGFiX2NhY2hlKTogRGVmaW5lLgotCShzdHJ1Y3Qgc3RhYl9maW5kX2luZm8pOiBSZW1vdmUgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsCi0JY2FjaGVkX3N0ciwgYW5kIGNhY2hlZF9zdHJvZmYgZmllbGRzLiAgQWRkIGZpbGVfY2FjaGUsCi0JZnVuY3Rpb25fY2FjaGUsIGFuZCBsaW5lX2NhY2hlIGZpZWxkcy4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgZXh0ZW5zaXZlIGNhY2hpbmcgdG8KLQlzcGVlZCB1cCBzZWFyY2hlcy4KLQotV2VkIEZlYiAgNCAxMzozNDoyMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBDaGVjayBmb3IgaW1wb3J0IG9mIG9yZGluYWwgcmF0aGVyCi0JdGhhbiBuYW1lLgotCShwZV9wcmludF9lZGF0YSk6IElmIHRoZXJlIGlzIG5vIC5lZGF0YSBzZWN0aW9uLCBsb29rIGZvciB0aGUKLQlleHBvcnQgZGF0YSBpbiBzb21lIG90aGVyIHNlY3Rpb24uCi0KLU1vbiBGZWIgIDIgMjA6MDU6NDIgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gdG8gMi44LjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gRmViICAyIDE3OjM5OjM5IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQlBZGQgdG1zMzIwYzMwIHN1cHBvcnQ6Ci0JKiBjcHUtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBhb3V0LXRpYzMwLmM6IE5ldyBmaWxlLgotCSogY29mZi10aWMzMC5jOiBOZXcgZmlsZS4KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX3RpYzMwKTogRGVmaW5lLgotCShiZmRfdGljMzBfYXJjaCk6IERlY2xhcmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF90aWMzMF9hcmNoLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aWMzMF9hb3V0X3ZlYyBhbmQKLQl0aWMzMF9jb2ZmX3ZlYy4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19USUMzMF9MRFApOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZCB0aWMzMCBjYXNlLgotCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKHRpYzMwX2FvdXRfdmVjLCB0aWMzMF9jb2ZmX3ZlYyk6IE5ldyB2ZWN0b3JzLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LXRpYzMwLmxvLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS10aWMzMC5jLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LXRpYzMwLmxvIGFuZCBjb2ZmLXRpYzMwLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgYW91dC10aWMzMC5jIGFuZCBjb2ZmLXRpYzMwLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDEyOjI1OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBBbGxvdyBISTE2X1MgcmVsb2MKLQl0byBsYWcgYmVoaW5kIExPMTYgcmVsb2MgYnkgYSBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gRmViICAyIDE0OjA5OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBBZGQgZHVtbXkgY29tbWFuZCB0byBmb3JjZQotCW1ha2UgdG8gcmVleGFtaW5lIHRoZSBmaWxlIHRpbWVzdGFtcC4KLQkoJChzcmNkaXIpL2xpYmJmZC5oLCAkKHNyY2RkaXIpL2xpYmNvZmYuaCk6IExpa2V3aXNlLgotCi0JKiBlbGY2NC1hbHBoYS5jIChFTEZfTUFYUEFHRVNJWkUpOiBDaGFuZ2UgdG8gMHgxMDAwMCBmcm9tCi0JMHgxMDAwMDAuCi0KLUZyaSBKYW4gMzAgMTk6MDc6MDcgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgcHJvY2VkdXJlCi0JdG8gY3JlYXRlIC5keW5zYnNzIGFuZCAucmVsYS5zYnNzIHNlY3Rpb25zLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFB1dCBzcGFjZSBmb3Igc21hbGwgZGF0YSB0byBiZQotCWNvcGllZCBmcm9tIGR5bmFtaWMgb2JqZWN0cyBpbnRvIC5zYnNzLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFN0cmlwIC5yZWxhLnNic3MgaWYgd2UgZG9uJ3QKLQl1c2UgaXQuICBDb3JyZWN0IHR5cG8gb2YgLnJlbGEuc2RhdGEyLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIHJlbG9jIHRvIHdoZXJlIHdlCi0JcHV0IHRoZSBkYXRhLCB3aGljaCBtYXkgbm93IGJlIGluIC5zYnNzLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBIFNEQVJFTDE2IHJlbG9jIGNhbiBiZSBpbiBkeW5zYnNzLgotCShlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZSBhcwotCXBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IERvbid0IGVtaXQgUl9QUENfUkVMKiByZWxvY3MKLQlhZ2FpbnN0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KLSAJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQgUl9QUENfUkVMMzIgcmVsb2NzIGluCi0Jc2hhcmVkIGxpYnJhcmllcyB3aGljaCByZWZlciB0byBsb2NhbCBzeW1ib2xzLiAgTWFrZSBzdXJlIHRoYXQgdGhlCi0JdGVzdCBmb3IgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSByZWxvYyBpbiBhIHNoYXJlZCBvYmplY3QgaXMgdGhlCi0Jc2FtZSBhcyB0aGUgdGVzdCBmb3IgZW1pdHRpbmcgYSByZWxvYy4KLQotVGh1IEphbiAyOSAxNTo1NTozNSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XS0qLW1pbmd3MzIqKTogTmV3IHRhcmdldC4KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0JJTkFSWV9PUEVOKTogQ2hlY2sgZm9yIG1pbmd3MzIuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMjggMTM6NDE6MjYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXApOiBPbmx5IGNoZWNrIHRoZSBzdHJ0YWIgaWYgd2UKLQloYXZlIGEgYmZkX29iamVjdC4KLQotVHVlIEphbiAyNyAyMTo0Mzo1NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JU3BhcmMgdjkgQUJJIGNvbXBsaWFudCBQTFQ6Ci0JKiBlbGY2NC1zcGFyYy5jIChQTFRfSEVBREVSX1NJWkUpOiBWOSBBQkkgdXNlcyA0IGVudHJpZXMuCi0JKHBsdF90ZW1wbGF0ZXMsIHNwYXJjNjRfZWxmX2J1aWxkX3BsdF9lbnRyeSk6IERlbGV0ZS4KLQkoTEFSR0VfUExUX1RIUkVTSE9MRCk6IE5ldyBkZWZpbmUuCi0JKEdPVF9SRVNFUlZFRF9FTlRSSUVTKTogVjkgQUJJIG9ubHkgdXNlcyAxLgotCShzcGFyYzY0X2VsZl9idWlsZF9wbHQpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQpOiBMaWtld2lzZS4KLQkoc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQpOiBMaWtld2lzZS4KLQkoc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIGgtPnBsdF9vZmZzZXQgdG8KLQljb250YWluIHRoZSBpbmRleCBmb3IgY29udmVuaWVuY2UuICBTa2lwIHRoZSBpbml0aWFsIGVudHJpZXMKLQlpbiAucmVsYS5wbHQuCi0JKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFplcm8gdGhlIGFsbG9jYXRlZCBjb250ZW50cwotCW1lbW9yeSBmb3IgdGhlIGJlbmVmaXQgb2YgLnJlbGEucGx0LgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbCBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0LgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBLaWxsIHRlbXBsYXRlIHN0dWZmLiAgVXNlCi0Jc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAmIHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0IGZvciByZWxvYy4KLQkoc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEVF9QTFRHT1QgcG9pbnRzIHRvIC5wbHQuCi0JQ2FsbCBzcGFyYzY0X2VsZl9idWlsZF9wbHQuCi0JKGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCk6IE5vLgotCShlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBOby4KLQkoZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCk6IDguCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCk6IE5ldyBmdW5jdGlvbjsgZnJlZSB0aGUgc2hzdHJ0YWIuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVjbGFyZSBpdC4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fY2xvc2VfYW5kX2NsZWFudXApOiBBcnJhbmdlIGZvciBpdAotCXRvIGJlIGNhbGxlZC4KLQotVHVlIEphbiAyNyAyMTo0NToxNSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX21pcHMqKTogQWRkIGRlZmluaXRpb25zIGZvciB2YXJpb3VzIE1JUFMKLQlwcm9jZXNzb3JzLgotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBtaXBzIHZhcmlhbnRzLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1UdWUgSmFuIDI3IDE1OjA2OjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQcmVzZXJ2ZSB0aGUgY29udGVudHMgb2YKLQl0MmEzX2JfaW5zbi4KLQotVHVlIEphbiAyNyAxMjo0NzoyNyAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni1zY28zLjJ2NSopOiBFTEYgbm93IHRoZSBkZWZhdWx0LgotCShpWzM0NTZdODZzY28zLjJ2NSpjb2ZmKTogTmV3IHRhcmdldC4KLQotTW9uIEphbiAyNiAxNTo0MTozMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbjIuaDogUmVidWlsZCB3aXRoIGNoYW5nZXMgdG8gY2hldy0tdGFiIGV4cGFuc2lvbi4KLQotVGh1IEphbiAyMiAyMToyNjo0OCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2dldF9lcnJvcl9oYW5kbGVyKTogQWRkIG9ydGhvZ29uYWwgZnVuY3Rpb24uCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBKYW4gMjIgMjE6MTM6MzkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGVraGV4LmMgKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBmb3Igbm8gc3ltYm9scy4KLQotV2VkIEphbiAyMSAyMToxOTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBJZiBDT0ZGX1dJVEhfUEUsIGRvbid0Ci0gCWFkanVzdCBhZGRlbmQgZm9yIGFuIG91dHB1dCBjb21tb24gc3ltYm9sIChmcm9tIEppbW15IEJsYWlyCi0gCTxqaW1teWJAd3JzLmNvbT4pLiAgSWYgQ09GRl9XSVRIX1BFLCBhZGp1c3QgYWRkZW5kIGZvciBQQyByZWxhdGl2ZQotIAlkZWZpbmVkIHN5bWJvbCB0byBjb3VudGVyYWN0IGFkanVzdG1lbnQgbWFkZSBpbiBnZW5lcmljIHJlbG9jYXRpb24KLSAJY29kZS4KLQotCSogZHdhcmYyLmM6IEluY2x1ZGUgc3lzZGVwLmgsIG5vdCBzdGRpby5oIGFuZCBzdGRsaWIuaC4KLQotV2VkIEphbiAyMSAyMToxNjowNiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChHRVRfU0NOREhSX05SRUxPQyk6IEZpeCB0eXBvIGluIG1hY3JvIG5hbWUuCi0JKEdFVF9TQ05ESFJfTkxOTk8pOiBMaWtld2lzZS4KLQotTW9uIEphbiAxOSAxMjo0OTo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1zaC5jIChhcmNoX2luZm9fc3RydWN0KTogQ29ycmVjdCBuZXh0IGZpZWxkIG9mIHNoM2UuCi0KLVdlZCBKYW4gMTQgMTc6MjM6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jOiBBZGQgbWFjcm9zIHRvIGhhbmRsZSBOT1AgaW5zZXJ0aW9uLgotCi1XZWQgSmFuIDE0IDE2OjE1OjIyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrX3N5bWJvbCk6IERvbid0IG1hcmsgdGhlIGFic29sdXRlIHNlY3Rpb24uCi0JKHhjb2ZmX21hcmspOiBMaWtld2lzZS4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogTWFyayBhYnNvbHV0ZSBzeW1ib2xzLgotCi1XZWQgSmFuIDE0IDE2OjAzOjExIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU29ydCBzeW1ib2xzIGJlZm9yZSBvdXRwdXQKLQl0byBrZWVwIHtDQUxMLEJBTH1OQU1FIHN5bWJvbHMgYWRqYWNlbnQuCi0JKGJfb3V0X3N5bWJvbF9jbXApOiBOZXcgZnVuY3Rpb24uCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTY5NwotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05MTkzIGIvYmZkL0NoYW5nZUxvZy05MTkzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWFmOTMxLi4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2ctOTE5MworKysgL2Rldi9udWxsCkBAIC0xLDc4NTEgKzAsMCBAQAotRnJpIERlYyAzMSAxNjoyMzo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlNaW5vciBjbGVhbnVwcyBzdWdnZXN0ZWQgYnkgQ29kZUNlbnRlci4KLQkqIGFvdXR4LmgsIGNvZmZnZW4uYywgZWNvZmYuYywgZWNvZmZsaW5rLmMsIGVsZi5jLCBsaWJiZmQuYywKLQlsaW5rZXIuYywgcmVsb2MuYywgc2VjdGlvbi5jLCBzcmVjLmM6IEFkZGVkIC8qQVJHU1VTRUQqLyBhcwotCWFwcHJvcHJpYXRlLgotCSogYW91dHguaCAoc3RydWN0IGV4dGVybmFsX2V4ZWMpOiBSZW1vdmVkIHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9uLgotCShOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IFNldCBzb21lIHRkYXRhIHBvaW50ZXJzIHRvIE5VTEwuCi0JKGFkanVzdF96X21hZ2ljKTogUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlIGRhdGFfdm1hLgotCShzdHJpbmd0YWJfaW5pdCk6IEluaXRpYWxpemUgaGFzaF96ZXJvLgotCShhZGRfdG9fc3RyaW5ndGFiKTogUmVtb3ZlZCB1bnVzZWQgZm91cnRoIGFyZ3VtZW50LgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IFJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZQotCXJfYWRkZW5kLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IEFkZGVkIHNvbWUgY2FzdHMuCi0JKiBhcmNoaXZlLmMgKGdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSwgZG9fc2x1cnBfY29mZl9hcm1hcCwKLQliZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSwgYnNkX3dyaXRlX2FybWFwLCBjb2ZmX3dyaXRlX2FybWFwKToKLQlNaW5vciBjb2RlIHJld3JpdGluZyB0byBtYWtlIGl0IG1vcmUgQyBsaWtlLgotCShkb19zbHVycF9ic2RfYXJtYXApOiBBZGRlZCBzb21lIGNhc3RzLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlCi0Jc2NuX2Jhc2UuCi0JKGVjb2ZmX3dyaXRlX2FybWFwKTogQWRkZWQgc29tZSBjYXN0cy4gIFVzZSAiIiByYXRoZXIgdGhhbiAiXDAiLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl93cml0ZV9kZWJ1Zyk6IEFkZGVkIGEgY2FzdC4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGludGVybmFsX2V4ZWMpOiBSZW1vdmVkIHVubmVjZXNzYXJ5Ci0JZGVjbGFyYXRpb24uCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBBZGRlZCBhIGNhc3QuCi0JKiBvcG5jbHMuYyAobmV3X2JmZCk6IFJlbW92ZWQgYSBjYXN0LgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkZWQKLQlzb21lIGNhc3RzLgotCSogc3JlYy5jIChpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZWQgdXNlbGVzcwotCXZhcmlhYmxlIGJ5dGVzX3dyaXR0ZW4uCi0KLUZyaSBEZWMgMzEgMTE6NDY6MTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpMzg2bWFjaDMuYyAoTl9UWFRBRERSKTogRG9uJ3QgZGVmaW5lIGFmdGVyIGFsbC4KLQkoVEVYVF9TVEFSVF9BRERSKTogRG9uJ3QgaW5jbHVkZSBleGVjIGhlYWRlciBzaXplIGluIHZhbHVlLgotCi1UaHUgRGVjIDMwIDE1OjQ3OjU0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Nm1hY2gzLmMgKE5fVFhUQUREUik6IERlZmluZS4KLQotVGh1IERlYyAzMCAxMzozNzoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlFeHRlbnNpdmUgY2hhbmdlcyB0byBtb3ZlIHRoZSBidWxrIG9mIHRoZSBsaW5rZXIgaW50byBCRkQgc28gdGhhdAotCW1vcmUgZWZmaWNpZW50IGJhY2tlbmQgY29kZSBjYW4gYmUgd3JpdHRlbiBmb3Igc3BlY2lmaWMgb2JqZWN0Ci0JZmlsZXMuICBPbmx5IGV4aXN0aW5nIGVmZmljaWVudCBiYWNrZW5kIGlzIGEub3V0LgotCSogc2VjbGV0LmMsIHNlY2xldC5oOiBSZW1vdmVkLgotCSogaGFzaC5jLCBsaW5rZXIuYywgZ2VubGluay5oOiBOZXcgZmlsZXMuCi0JKiBiZmQtaW4uaDogUmVtb3ZlZCBiZmRfZXJyb3JfdmVjdG9yLiAgRGVjbGFyZWQgaGFzaCB0YWJsZQotCXN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy4KLQkoSlVNUF9UQUJMRSk6IFJlbW92ZWQgYmZkX3NlY2xldF9saW5rLCBhZGRlZAotCWJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBiZmRfbGlua19hZGRfc3ltYm9scyBhbmQKLQliZmRfZmluYWxfbGluay4KLQkqIEFsbCBiYWNrZW5kczogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZGVkIGxpbmtfbmV4dCBhbmQgYXJjaGl2ZV9wYXNzIGZpZWxkcy4KLQlSZW1vdmVkIGxkX3N5bWJvbHMgZmllbGQuCi0JKGJmZF9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sIGJmZF91bmRlZmluZWRfc3ltYm9sLAotCWJmZF9yZWxvY192YWx1ZV90cnVuY2F0ZWQsIGJmZF9yZWxvY19pc19kYW5nZXJvdXMsCi0JYmZkX2Vycm9yX3ZlY3Rvcik6IFJlbW92ZWQuCi0JKGJmZF9kZWZhdWx0X2Vycm9yX3RyYXAsIGJmZF9lcnJvcl90cmFwLAotCWJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmx0cmFwKTogUmVtb3ZlZC4KLQkoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFBhc3MgbGlua19pbmZvLiAgUGFzcwotCWxpbmtfb3JkZXIgaW5zdGVhZCBvZiBzZWNsZXQuICBQYXNzIHN5bWJvbHMuCi0JKGJmZF9yZWxheF9zZWN0aW9uKTogUGFzcyBsaW5rX2luZm8uCi0JKGJmZF9zZWNsZXRfbGluayk6IFJlbW92ZWQuCi0JKGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBiZmRfbGlua19hZGRfc3ltYm9scywKLQliZmRfZmluYWxfbGluayk6IE5ldyBtYWNyb3MuCi0JKiBsaWJiZmQtaW4uaDogSWYgX19HTlVDX18gaXMgZGVmaW5lZCBhbmQgYWxsb2NhIGlzIG5vdCwgZGVmaW5lCi0JYWxsb2NhIGFzIF9fYnVpbHRpbl9hbGxvY2EuICBEZWNsYXJlIGludGVybmFsIGxpbmtpbmcgZnVuY3Rpb25zLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuYyAoYmZkX3NlZWspOiBDb21tZW50IG91dCBmc2VlayBhc3NlcnRpb24uICBJdCdzIHdvcmtlZAotCWZvciBtb250aHMuCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogQWRkZWQgZXJyb3JfbWVzc2FnZSBhcmd1bWVudCB0bwotCXNwZWNpYWxfZnVuY3Rpb24gZmllbGQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzIGFuZCBhbGwgZGVmaW5pdGlvbnMuCi0JKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IE1ha2UgYXJndW1lbnQgYSBjb25zdCBwb2ludGVyLgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkIGVycm9yX21lc3NhZ2UgYXJndW1lbnQgdG8gaG9sZAotCXN0cmluZyBzZXQgaWYgcmV0dXJuIHZhbHVlIGlmIGJmZF9yZWxvY19kYW5nZXJvdXMuICBDaGFuZ2VkIGFsbAotCWNhbGxlcnMuCi0JKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSwgX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzZWN0aW9uLmMgKGFzZWN0aW9uKTogUmVuYW1lZCBzZWNsZXRzX2hlYWQgYW5kIHNlY2xldHNfdGFpbCB0bwotCWxpbmtfb3JkZXJfaGVhZCBhbmQgbGlua19vcmRlcl90YWlsLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVwbGFjZWQgc2VjbGV0IGFyZ3VtZW50IHdpdGggbGlua19pbmZvCi0JYW5kIGxpbmtfb3JkZXIgYW5kIHN5bWJvbHMgYXJndW1lbnRzIGluCi0JYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4gIEFkZGVkIHN5bWJvbHMgYXJndW1lbnQgdG8KLQliZmRfcmVsYXhfc2VjdGlvbi4gIFJlbW92ZWQgYmZkX3NlY2xldF9saW5rLiAgQWRkZWQKLQliZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgYW5kCi0JYmZkX2ZpbmFsX2xpbmsuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZGVkIGV4dGVybmFsX3N5bXMsCi0JZXh0ZXJuYWxfc3ltX2NvdW50LCBleHRlcm5hbF9zdHJpbmdzLCBzeW1faGFzaGVzIGZpZWxkcy4KLQkob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcywgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50LAotCW9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MsIG9ial9hb3V0X3N5bV9oYXNoZXMpOiBOZXcgYWNjZXNzb3IKLQltYWNyb3MuCi0JKFdSSVRFX0hFQURFUlMpOiBPbmx5IG91dHB1dCBzeW1ib2xzIGlmIG91dHN5bWJvbHMgaXMgbm90IE5VTEwuCi0JKiBhb3V0eC5oOiBXcm90ZSBuZXcgYmFjayBlbmQgbGlua2VyIHJvdXRpbmVzLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IFJldHVybiBib29sZWFuIHZhbHVlLiAgRG9uJ3QgdXNlCi0JYmZkX2Vycm9yX3ZlY3Rvci4KLQkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBDaGVjayByZXR1cm4gdmFsdWUKLQlvZiB0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyBhbmQgYmZkX3dyaXRlLgotCSogYW91dC10YXJnZXQuaCAoZmluYWxfbGlua19jYWxsYmFjayk6IE5ldyBmdW5jdGlvbi4KLQkoTVlfYmZkX2ZpbmFsX2xpbmspOiBOZXcgZnVuY3Rpb24uCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuCi0JdmFsdWUgb2YgYW91dF8zMl93cml0ZV9zeW1zLgotCSogaHAzMDBocHV4LmMgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBMaWtld2lzZS4KLQkqIGkzODZseW54LmMgKFdSSVRFX0hFQURFUlMpOiBMaWtld2lzZS4KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSUyk6IExpa2V3aXNlLgotCSogYm91dC5jOiBDaGFuZ2VkIGZ1bmN0aW9ucyB0byB1c2UgbGlua19pbmZvLT5jYWxsYmFja3MgcmF0aGVyCi0JdGhhbiBiZmRfZXJyb3JfdmVjdG9yLCBhbmQgbGlua19vcmRlcnMgcmF0aGVyIHRoYW4gc2VjbGV0cy4KLQkqIGNvZmYtYWxwaGEuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4MzAwLmM6IExpa2V3aXNlLgotCSogY29mZi1oODUwMC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtc2guYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXo4ay5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYzogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmM6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMb29rCi0JdXAgX2dwIGluIHRoZSBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGluIG91dHN5bWJvbHMuCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IFBhc3MgZXJyb3JzIGJhY2sgaW4gbmV3IGVycm9yX21lc3NhZ2UKLQlhcmd1bWVudCByYXRoZXIgdGhhbiBwcmludGluZyB0aGVtLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyk6IFRha2UgbGlua19pbmZvIGFuZAotCWxpbmtfb3JkZXIgYXJndW1lbnRzIHJhdGhlciB0aGFuIHNlY2xldC4gIENoYW5nZWQgYWxsIHVzZXMgYW5kCi0JZGVmaW5pdGlvbnMuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpOiBQYXNzIGxpbmtfaW5mbyBhcmd1bWVudHMuICBDaGFuZ2VkCi0JYWxsIHVzZXMgYW5kIGRlZmluaXRpb25zLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogZWNvZmYuYyAoZWNvZmZfZ2V0X2V4dHIpOiBJZiBzeW1ib2wgaXMgZGVmaW5lZCBieSBsaW5rZXIsIGJ1dAotCW5vdCBieSBFQ09GRiwgbWFrZSBpdCBzY0Ficy4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBSZW5hbWVkIGZyb20gZWNvZmZfYmZkX3NlY2xldF9saW5rIGFuZAotCXJld3JpdHRlbi4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IFJlbmFtZWQgZnJvbQotCW1pcHNfZWxmX3NlY2xldF9saW5rIGFuZCByZXdyaXR0ZW4uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbik6IEFkZGVkIGxpbmtfaW5mbwotCWZpZWxkLgotCShuZXdfc3R1YiwgYWRkX3N0dWJfYnlfbmFtZSwgaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIsCi0JaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1YiwgaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKToKLQlBZGRlZCBsaW5rX2luZm8gYXJndW1lbnRzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHF1aXQgaWYgb3V0c3ltYm9scyBpcwotCW5vdCBOVUxMLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZSByYXRoZXIgdGhhbgotCXVzaW5nIGJmZF9lcnJvcl92ZWN0b3IuCi0JKG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCW9hc3lzX3dyaXRlX3NlY3Rpb25zLgotCSogaG9zdHMvc3RkLWhvc3QuaDogRG9uJ3QgZGVjbGFyZSBxc29ydCBvciBzdHJ0b2wuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogUmVtb3ZlZCBzZWNsZXQuby4gIEFkZGVkIGhhc2gubyBhbmQgbGlua2VyLm8uCi0JKENGSUxFUyk6IFJlbW92ZWQgc2VjbGV0LmMuICBBZGRlZCBoYXNoLmMgYW5kIGxpbmtlci5jLgotCShIRklMRVMpOiBSZW1vdmVkIHNlY2xldC5oLiAgQWRkZWQgZ2VubGluay5oLgotCi1UaHUgRGVjIDMwIDA3OjQxOjM2IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiAgUmV0dXJuIHplcm8gZmlsbGVkIGJ1ZmZlcgotCWlmIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzLgotCi1UdWUgRGVjIDI4IDEyOjQzOjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9lbGZfZ2VuZXJpY19yZWxvYyk6IElmIHRoaXMgaXMgbm90IGFuIGlucGxhY2UgcmVsb2MsCi0JdGhlbiBza2lwIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZXZlbiBpZiB0aGUgYWRkZW5kIGlzIG5vbi16ZXJvLgotCi1UdWUgRGVjIDIxIDA5OjIyOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpIFtTV0FQX09VVF9SRUxPQ19PRkZTRVRdOiBDb3B5Ci0JYWRkZW5kIHRvIHJfb2Zmc2V0IGZpZWxkLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkZWQgY29mZi1zcGFyYy5jLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvZmYtc3BhcmMuYyAoU1dBUF9JTl9SRUxPQ19PRkZTRVQsIFNXQVBfT1VUX1JFTE9DX09GRlNFVCwKLQlDQUxDX0FEREVORCk6IERlZmluZS4KLQotCSogYWl4Mzg2LWNvcmUuYyAoYWl4Mzg2X2NvcmVfZmlsZV9wKTogVXNlIGNkX3JlZ3NbMF0gZm9yIGNvbXB1dGluZwotCXRoZSBvZmZzZXRvZiBiZWNhdXNlIEFJWCAvYmluL2NjIGRvZXMgbm90IGxpa2UgdG8gdGFrZSB0aGUgYWRkcmVzcwotCW9mIGFuIGFycmF5LiAgKEZyb20gTWluaCBUcmFuLUxlLikKLQotVGh1IERlYyAxNiAxMzowNjozMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogVGh1IERlYyAxNiAxNTo0MTowNiAxOTkzICBQZXRlciBIb29nZW5ib29tICAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogTWFrZSBzdXJlIHRvIGNvcHkKLQl0aGUgcmV0dXJuIHBvaW50ZXIgaW50byAlcjIgaWYgbm8ganVtcC1pbi1jYWxsLWRlbGF5LXNsb3QKLQlvcHRpbWl6YXRpb24gd2FzIGRvbmUuCi0KLQkqIGhvc3RzL2hwMzAwYnNkLmg6IENvcnJlY3RseSBpZGVudGlmeSA0LjNCU0QgdnMgNC40QlNELgotCi1XZWQgRGVjIDE1IDA4OjA0OjE2IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogKHRpbWUpOiBEb24ndCBkZWNsYXJlOyBjb25mbGljdHMgb24gTWFjaDMuCi0KLQkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1BBR0VfU0laRSk6IFNldCB0byAxIHRvIGF2b2lkIHBhZGRpbmcuCi0JKEhPU1RfU0VHTUVOVF9TSVpFKTogU2V0IHRvIDAgZm9yIHNhbWUgcmVhc29uLgotCi0JKiBpMzg2bWFjaDMuYyAoUEFHRV9TSVpFLCBTRUdNRU5UX1NJWkUpOiBTYW1lIGNoYW5nZXMgYXMgYWJvdmUuCi0JKFRFWFRfU1RBUlRfQUREUik6IENvcnJlY3QuCi0JKE1ZX2JhY2tlbmRfZGF0YSk6IERlZmluZS4KLQotCSogYW91dHguaCAoYWRqdXN0X29fbWFnaWMsIGFkanVzdF96X21hZ2ljLCBhZGp1c3Rfbl9tYWdpYyk6Ci0JTmV3IGZ1bmN0aW9uczsgY29kZSBtb3ZlZCBmcm9tIGFvdXRfPHNpemU+X2FkanVzdF9zaXplc19hbmRfdm1hcy4KLQotVHVlIERlYyAxNCAyMTo0ODozMyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZpeCB0aGlua29zIGluIGF1eGlsaWFyeSBoZWFkZXIKLQlzdXBwb3J0LgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogTGlrZXdpc2UuCi0KLU1vbiBEZWMgMTMgMjM6MzQ6NDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgJ1QnIGZpZWxkCi0Jc2VsZWN0b3JzIGZvciBQSUMgY29kZS4KLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSGFuZGxlICdUJyBmaWVsZCBzZWxlY3RvcnMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9ETFRfUkVMLCBSX0ZTRUwsIFJfUlNFTCwgUl9MU0VMCi0JcmVsb2NhdGlvbnMgbmVlZGVkIGJ5IFBJQy4KLQotVHVlIERlYyAgNyAxNTo0Nzo1MSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmg6ICBGaXhlcyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4uLgotCi1UdWUgRGVjICA3IDE1OjEwOjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlibmxtLmggKG5sbV9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIG1hY3JvIGRlZmluaXRpb24uCi0JKG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEpOiBBZGp1c3RlZCBhY2NvcmRpbmdseS4KLQotU3VuIERlYyAgNSAxOTozMjowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRmxlc2ggb3V0IGNvZGUgZm9yIGhhbmRsaW5nIHNpbXBsZQotCWF1eGlsaWFyeSBoZWFkZXJzLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uaCAoc3RydWN0IHNvbWRhdGEpOiBBZGQgZmllbGRzIGZvciBhdHRhY2hpbmcgdmVyc2lvbiBhbmQKLQljb3B5cmlnaHQgaGVhZGVycy4gIEFkZCBhY2Nlc3NvciBtYWNyb3MuCi0KLQkqIHNvbS5jIChSX0RMVF9SRUwsIFJfQVVYX1VOV0lORCwgUl9TRUNfU1RNVCk6IEFkZCBwcm90ZWN0ZWQKLQlkZWZpbml0aW9ucyBmb3Igb2xkIHZlcnNpb25zIG9mIEhQVVggd2hpY2ggZmFpbCB0byBkZWZpbmUgdGhlbS4KLQkoc29tX2hwcGFfaG93dG9fdGFsYmUpOiBBZGQgUl9ETFRfUkVMLCBSX0FVWF9VTldJTkQsIGFuZCBSX1NFQ19TVE1UCi0Jbm93IHRoYXQgdGhleSdyZSBzYWZlLiAgRGVsZXRlIGJvZ3VzIFJfU1RBVEVNRU5UIHJlbG9jYXRpb25zLgotCi0JKiBzb20uYyAoc29tX2hwcGFfaG93dG9fdGFibGUpOiBBZGQgbWlzc2luZyBSX0VORF9UUlkuICBEZWxldGUgCi0JZXh0cmEgUl9EQVRBX09WRVJSSURFLgotCShocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEdlbmVyYXRlIGEgcmVsb2NhdGlvbiBmb3IgdGhlIHJvdW5kaW5nCi0JbW9kZSBzZWxlY3RvciBpZiBuZWVkZWQuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgcmVxdWVzdHMgZm9yIGEgY2hhbmdlIGluIHRoZSBkZWZhdWx0Ci0Jcm91bmRpbmcgbW9kZS4gIFJvdW5kaW5nIG1vZGVzIGRvIG5vdCBjb25zdW1lIGlucHV0IGJ5dGVzLCBidXQKLQlhcmUganVzdCBtYXJrZXJzIG11Y2ggbGlrZSBSX0VOVFJZIGFuZCBSX0VYSVQuCi0KLVNhdCBEZWMgIDQgMTk6NDA6MzIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQlGcmkgRGVjICAzIDA5OjU1OjE3IDE5OTMgIFBldGUgSG9vZ2VuYm9vbSAgKGhvb2dlbkBjcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2MpOiAgRG8gbm90IGRvIGNvZGUgcmVvcmRlcmluZyB3aGVuCi0JdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiBhcyBvcmlnaW5hbGx5IGJlZW4gbnVsbGlmaWVkLgotCWhwcGFfZWxmX3JlbG9jKTogIEF2b2lkIHVzZWxlc3MgY2FsbCB0byBiZmRfcHV0XzMyICgpIGluIHRoZQotCWNhc2Ugb2Ygbm8gY29kZSByZW9yZGVyaW5nIGR1ZSB0byBhbiBMRE8gaW5zdHJ1Y3Rpb24gaW4gdGhlCi0JZGVsYXkgc2xvdCBvZiB0aGUgYnJhbmNoLiAgTWFrZSBzdXJlIHRvIHJlbG9jYXRlIHRoZSBjb3JyZWN0Ci0JaW5zdHJ1Y3Rpb24uICBEbyBub3QgcGVyZm9ybSBpbnN0cnVjdGlvbiByZW9yZGVyaW5nIGZvciBtaWxsaWNvZGUKLQljYWxscy4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiAgQ2hhbmdlIHRoZSByZWxvY2F0aW9uIHR5cGUKLQl0byBSX0hQUEFfU1RVQl9DQUxMXzE3IHdoZW4gc3BlY2lhbCBwcm9jZXNzaW5nIG1pZ2h0IGJlIG5lZWRlZC4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IFByZXZlbnQgY29kZSByZW9yZGVyaW5nIG9uCi0JYSBjYWxsIGZyb20gYSBsaW5rZXIgc3R1YiB0byBhbm90aGVyIGxpbmtlciBzdHViIGFuZCBmb3IgbWlsbGljb2RlCi0JY2FsbHMuICBEbyBub3QgdHJhc2ggdGhlIHJldHVybiByZWdpc3RlciBmb3IgY2FsbHMgZnJvbSBvbmUgbGlua2VyCi0Jc3R1YiB0byBhIHNlY29uZCBsaW5rZXIgc3R1Yi4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiAgUExBQkVMIGFuZCBETFQKLQlyZWxvY2F0aW9ucyBhcmUgbm90IHBjLXJlbGF0aXZlLgotCi0JKiBocHBhX3N0dWJzLmg6IChCTEVfTl9YWFhfMF8zMSk6ICBOZXcgaW5zdHJ1Y3Rpb24gdXNlZCBpbgotCWxpbmtlciBzdHViIGNvZGUuIAotCShDT1BZXzJfMzEpOiAgTGlrZXdpc2UuCi0KLUZyaSBEZWMgIDMgMTg6NDA6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc29sYXJpczIubWggKEhERUZJTkVTKTogUmVtb3ZlIC1EY29uc3Q9Ci0JKiBob3N0cy9zb2xhcmlzLmg6IElmIG5vdCBfX0dOVUNfXywgZGVmaW5lIGNvbnN0IGFzIGVtcHR5LgotCi1UaHUgRGVjICAyIDE1OjQzOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYzogQWRkZWQgdmFyaW91cyBjYXN0cyBmb3IgMzIvNjQgYml0IGNyb3NzIHRhcmdldGluZy4KLQkoZWNvZmZfbWtvYmplY3RfaG9vayk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIHRoZSAucmVnaW5mbwotCXNlY3Rpb24gc28gdGhhdCB0aGUgbGlua2VyIGlnbm9yZXMgaXQuCi0JKiBlY29mZmxpbmsuYzogQWRkZWQgdmFyaW91cyBjYXN0cyBmb3IgMzIvNjQgYml0IGNyb3NzIHRhcmdldGluZy4KLQkoZWNvZmZfYWRkX2J5dGVzKTogQ2hhbmdlZCBuZWVkIGFyZ3VtZW50IHRvIHNpemVfdC4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2xpbmtfb3RoZXIpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQllY29mZl9hZGRfc3RyaW5nLgotCi0JKiBsaWJiZmQtaW4uaCAobmV3X2JmZCk6IFVzZSB2b2lkIHJhdGhlciB0aGFuIGFuIGVtcHR5IHBhcmFtZXRlcgotCWxpc3QuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogTmV3IGZpZWxkIGJhY2tlbmRfZGF0YS4KLQkobmxtX2JhY2tlbmRfZGF0YSwgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSk6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCi0JKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkIG5vX3VuaW5pdGlhbGl6ZWRfZGF0YS4KLQkobmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIG5sbWNvZGUuaCAobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEhhbmRsZQotCW5vX3VuaW5pdGlhbGl6ZWRfZGF0YS4KLQkobmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUpOiBTb3J0IHJlbG9jcyBieSBhZGRyZXNzIGZvciBhCi0JcGFydGljdWxhciBzeW1ib2wsIHRvIG1ha2UgdGhlIHNvcnQgbW9yZSBzdGFibGUuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYXN0IHRoZSBhcmd1bWVudHMgdG8gcXNvcnQuICBHZXQgdGhlCi0JdmFsdWUgb2YgYSBkZWJ1Z2dpbmcgc3ltYm9sIHRoZSBzYW1lIHdheSB3ZSBnZXQgdGhlIHZhbHVlIG9mIGEKLQlub3JtYWwgc3ltYm9sLgotCSogbmxtMzItYWxwaGEuYzogVmFyaW91cyBjaGFuZ2VzLiAgV3JpdGUgb3V0IEdQIGFuZCAubGl0YSByZWxvY3MuCi0JU2V0IG5vX3VuaW5pdGlhbGl6ZWRfZGF0YSB0byB0cnVlLgotCSogbmxtMzItaTM4Ni5jIChubG0zMl9pMzg2X2JhY2tlbmQpLCBubG0zMi1zcGFyYy5jCi0JKG5sbTMyX3NwYXJjX2JhY2tlbmQpOiBTZXQgbm9fdW5pbml0aWFsaXplZF9kYXRhIGZpZWxkIGZhbHNlLgotCSogbmxtc3dhcC5oIChubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0KTogWmVybyBvdXQgZGVzdGluYXRpb24KLQliZWZvcmUgZmlsbGluZyBpdCBpbi4KLQotV2VkIERlYyAgMSAyMTo0Nzo1OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZWN0aW9uX3R5cGUsIHNvbV9kZWNvZGVfc3ltY2Fsc3MpOiBOZXcgZnVuY3Rpb25zLgotCShzb21fZ2V0X3N5bWJvbF9pbmZvKTogVXNlIHRoZW0uCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgdGhlIHNlY3Rpb24gb2YgY29tbW9uIGFuZCB1bmRlZmluZWQKLQlzeW1ib2xzIGNvcnJlY3RseS4KLQotV2VkIERlYyAgMSAxNDoxNToxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBJbml0aWFsaXplIGxvY2FsIHZhciBMQVNUX1NZTV9JRFgsIHRvCi0JbWFrZSBnY2MgaGFwcHkuCi0KLQkqIG1pcHNic2QuYzogQ2hhbmdlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgotCShtaXBzX2hvd3RvX3RhYmxlX2V4dCk6IE1JUFNfUkVMT0NfTE8xNiBzaG91bGQgdXNlCi0JY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4KLQkoYW91dF9taXBzXypfdmVjKTogTWFrZSBuYW1lIHVzZSAiYS5vdXQiIGluc3RlYWQgb2YgImFvdXQiLCB0bwotCW1ha2UgZ2RiIGhhcHB5LgotCi0JKiBiZmQuYyAoYmZkX2Vycm1zZ3MpOiBSZXdvcmQgaW52YWxpZC10YXJnZXQgbWVzc2FnZS4KLQotCSogY29uZmlnLmJmZDogRm9yIHNwYXJjKi0qLWNvZmYsIHVzZSBzcGFyYy1jb2ZmLgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgc3BhcmNjb2ZmX3ZlYy4KLQkqIHRhcmdldHMuYyAoc3BhcmNjb2ZmX3ZlYyk6IERlY2xhcmUuCi0KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc3RydWN0IHJlbG9jX2hvd3RvX3R5cGUpOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBvZiBzaXplIGZpZWxkLgotCi1XZWQgRGVjICAxIDE0OjM5OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtMzItYWxwaGEuYzogTmV3IGZpbGU7IHByZWxpbWluYXJ5IEFscGhhIE5ldFdhcmUgc3VwcG9ydC4KLQkqIGNvbmZpZy5iZmQgKGFscGhhLSotbmV0d2FyZSopOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEtbmxtLgotCSogY29uZmlnL2FscGhhLW5sbS5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKG5sbTMyX2FscGhhX3ZlYyk6IE5ldyB2ZWN0b3I7IHVzZSBubG0zMi1hbHBoYS5vLAotCW5sbTMyLm8sIGFuZCBubG0uby4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZGVkIG5sbTMyLWFscGhhLm8uCi0JKENGSUxFUyk6IEFkZGVkIG5sbTMyLWFscGhhLmMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKiB0YXJnZXRzLmMgKG5sbTMyX2FscGhhX3ZlYyk6IERlY2xhcmUuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZHMKLQlvcHRpb25hbF9wcmVmaXhfc2l6ZSwgbmxtX2JhY2tlbmRfb2JqZWN0X3AsIG5sbV93cml0ZV9wcmVmaXgsCi0JbmxtX3NldF9wdWJsaWNfc2VjdGlvbiwgbmxtX2dldF9wdWJsaWNfb2Zmc2V0LiAgUmVtb3ZlZCB1bnVzZWQKLQlubG1fd3JpdGVfcmVsb2MgZmllbGQuICBDaGFuZ2VkIG5sbV93cml0ZV9pbXBvcnQgdG8gcmVtb3ZlCi0JdW5uZWNlc3Nhcnkgc3ltYm9sIGFyZ3VtZW50LiAgUmVuYW1lZCBubG1fd3JpdGVfZXh0ZXJuYWxzIHRvCi0JbmxtX3dyaXRlX2V4dGVybmFsLCBhbmQgY2hhbmdlZCBjb3VuZCBhcmd1bWVudCBmcm9tIGJmZF92bWEgdG8KLQliZmRfc2l6ZV90eXBlLgotCShubG1fb3B0aW9uYWxfcHJlZml4X3NpemUsIG5sbV9iYWNrZW5kX29iamVjdF9wX2Z1bmMsCi0JbmxtX3dyaXRlX3ByZWZpeF9mdW5jLCBubG1fc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMsCi0JbmxtX2dldF9wdWJsaWNfb2Zmc2V0X2Z1bmMpOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCShubG1fd3JpdGVfcmVsb2NfZnVuYyk6IFJlbW92ZWQuCi0JKG5sbV93cml0ZV9leHRlcm5hbF9mdW5jKTogQWRqdXN0ZWQgZm9yIGZpZWxkIHJlbmFtaW5nLgotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl93cml0ZV9pbXBvcnQpOiBSZW5hbWVkIGZyb20KLQlubG1faTM4Nl93cml0ZV9yZWxvYy4gIFJlbW92ZWQgb2xkIG5sbV9pMzg2X3dyaXRlX2ltcG9ydCB3aGljaAotCWp1c3QgY2FsbGVkIG9sZCBubG1faTM4Nl93cml0ZV9yZWxvYy4KLQkobmxtX2kzODZfd3JpdGVfZXh0ZXJuYWwpOiBSZW5hbWVkIGZyb20gbmxtX2kzODZfd3JpdGVfZXh0ZXJuYWxzLgotCURlY2xhcmVkLiAgQ2hhbmdlZCBzZWNvbmQgYXJndW1lbnQgZnJvbSBiZmRfdm1hIHRvIGJmZF9zaXplX3R5cGUuCi0JKG5sbTMyX2kzODZfYmFja2VuZCk6IEFkanVzdGVkIGZvciBjaGFuZ2VzIHRvIGZpZWxkcyBhbmQgbmFtZXMuCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcyk6IFJlbW92ZWQgdW51c2VkLAotCWlmZGVmZmVkIG91dCBjb2RlLgotCShubG1fc3BhcmNfd3JpdGVfaW1wb3J0KTogUmVtb3ZlZCBzZWNvbmQgYXJndW1lbnQuCi0JKG5sbV9zcGFyY193cml0ZV9leHRlcm5hbCk6IFJlbmFtZWQgZnJvbQotCW5sbV9zcGFyY193cml0ZV9leHRlcm5hbHMuICBDaGFuZ2VkIHNlY29uZCBhcmd1bWVudCBmcm9tIGJmZF92bWEKLQl0byBiZmRfc2l6ZV90eXBlLgotCShubG0zMl9zcGFyY19iYWNrZW5kKTogQWRqdXN0ZWQgZm9yIGNoYW5nZXMgdG8gZmllbGRzIGFuZCBuYW1lcy4KLQkqIG5sbWNvZGUuaDogUmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgotCShubG1fb2JqZWN0X3ApOiBEb24ndCBkZXN0cm95IHRkYXRhIHBvaW50ZXIuICBDYWxsCi0JYmFja2VuZF9vYmplY3RfcCBmdW5jdGlvbiBpZiBpdCBleGlzdHMuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSByY291bnQuICBDYWxsCi0Jc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMgaWYgaXQgZXhpc3RzIGluc3RlYWQgb2YgY2hlY2tpbmcKLQlOTE1fSElCSVQuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBY2NvdW50IGZvcgotCW9wdGlvbmFsX3ByZWZpeF9zaXplLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWNjb3VudCBmb3Igb3B0aW9uYWxfcHJlZml4X3NpemUuCi0JUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlIHdyaXRlX3JlbG9jX2Z1bmMuICBDaGFuZ2VkIGRlY2xhcmF0aW9uCi0JYW5kIGNhbGwgb2Ygd3JpdGVfaW1wb3J0X2Z1bmMuICBDYWxsIHdyaXRlX3ByZWZpeF9mdW5jIGlmIGl0Ci0JZXhpc3RzLiAgUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzIGxlbiBhbmQgdGVtcC4gIENhbGwKLQlnZXRfcHVibGljX29mZnNldF9mdW5jIGlmIGl0IGV4aXN0cyByYXRoZXIgdGhhbiBzZXR0aW5nIE5MTV9ISUJJVC4KLQkqIG5sbXN3YXAuaDogRGVjbGFyZSBmdW5jdGlvbnMuCi0KLQkqIGJmZC1pbi5oICh1aW50NjRfdHlwZUxPVywgdWludDY0X3R5cGVISUdIKTogRnVsbHkgcGFyZW50aGVzaXplCi0JZm9yIGNsYXJpdHkuCi0JKGZwcmludGZfdm1hLCBzcHJpbnRmX3ZtYSk6IFVzZSAlbHgsIG5vdCAleC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGhvc3RzL2FscGhhb3NmLmggKHVpbnQ2NF90eXBlTE9XLCB1aW50NjRfdHlwZUhJR0gpOiBDYXN0IHJlc3VsdHMKLQl0byB1bnNpZ25lZCBsb25nLgotCi0JKiBjb25maWcuYmZkOiBEb24ndCBzZXQgdGFyZ2V0NjQgaGVyZSwgYXMgdGhlIHNldHRpbmcgaXMgaWdub3JlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogU2V0IHRhcmdldDY0LgotCi0JKiBjb25maWcvYWxwaGFvc2YubXQgKFRERUZJTkVTKTogUmVtb3ZlZDsgc2V0dGluZyBob3N0IHBhcmFtZXRlcnMKLQlpbiBUREVGSU5FUyBpcyB3cm9uZy4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUgb3V0cHV0X3NlY3Rpb24uCi0KLVR1ZSBOb3YgMzAgMTY6NDU6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpcml4LWNvcmUuYzogTmV3IGZpbGUgZm9yIElyaXggNCBhbmQgSXJpeCA1IGNvcmUgc3VwcG9ydC4KLQlGdW5jdGlvbnMgdGFrZW4gb3V0IG9mIGNvZmYtbWlwcy5jLiAgSGFuZGxlIHZtYXAgdHlwZSBWTUFQRklMRS4KLQkqIGNvZmYtbWlwcy5jOiBJcml4IDQgY29yZSBmaWxlIHN1cHBvcnQgbW92ZWQgdG8gaXJpeC1jb3JlLmMuCi0JKiB0YXJnZXRzLmM6IElmIElSSVhfQ09SRSBkZWZpbmVkLCBpbmNsdWRlIGlyaXhfY29yZV92ZWMgaW4KLQl0YXJnZXRfdmVjdG9yLgotCSogY29uZmlnL2lyaXg0Lm1oIChIREVGSU5FUyk6IEFkZCAtRElSSVhfQ09SRS4KLQkoSERFUEZJTEVTKTogRGVmaW5lIHRvIGJlIGlyaXgtY29yZS5vLgotCSogY29uZmlnL2lyaXg1Lm1oIChIREVGSU5FUyk6IERlZmluZSB0byBiZSAtRElSSVhfQ09SRS4KLQkoSERFUEZJTEVTKTogRGVmaW5lIHRvIGJlIGlyaXgtY29yZS5vLgotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogQWRkZWQgaXJpeC1jb3JlLm8uICBSZW1vdmVkCi0Jc2NvLWNvcmUubywgd2hpY2ggbm8gbG9uZ2VyIGV4aXN0cy4KLQkoQ0ZJTEVTKTogQWRkZWQgYWxsICotY29yZS5jIGZpbGVzLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1XZWQgTm92IDI0IDAyOjAyOjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IFJlc3RvcmUgY2hlY2sgb2YgZmlsZV9zaXplICE9Ci0JbWVtX3NpemUsIGJ1dCBvbmx5IGlmIFNIVF9QUk9HQklUUy4KLQotCSogZWNvZmZsaW5rLmM6IE5ldyBmaWxlIHRvIGhvbGQgRUNPRkYgZGVidWcgaW5mb3JtYXRpb24gbGlua2luZwotCXJvdXRpbmVzLgotCSogZWNvZmYuYyAoZWNvZmZfY2xlYXJfb3V0cHV0X2ZsYWdzLCBlY29mZl9yZWwsIGVjb2ZmX2R1bXBfc2VjbGV0LAotCWVjb2ZmX2FkZF9zdHJpbmcsIGVjb2ZmX2dldF9kZWJ1Zyk6IFJlbW92ZWQuICBGdW5jdGlvbmFsaXR5IG5vdyBpbgotCWVjb2ZmbGluay5jLgotCShlY29mZl9nZXRfZXh0ciwgZWNvZmZfc2V0X2luZGV4KTogTmV3IGZ1bmN0aW9ucy4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IERvbid0IHNhdmUgcmF3X3NpemUuCi0JKGVjb2ZmX2JmZF9zZWNsZXRfbGluayk6IFJld3JvdGUgdG8gdXNlIGVjb2ZmbGluay5jIGZ1bmN0aW9ucy4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3Qgc2V0IEVYRUNfUCBqdXN0Ci0JYmVjYXVzZSB0aGVyZSBpcyBhIHN0YXJ0IGFkZHJlc3MuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBleHRlcm5hbCBzeW1ib2xzIGhlcmUuICBVc2UKLQllY29mZmxpbmsuYyBmdW5jdGlvbnMgdG8gd3JpdGUgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvLCBtaXBzX2VsZl9nZXRfZXh0ciwKLQltaXBzX2VsZl9zZXRfaW5kZXgpOiBOZXcgZnVuY3Rpb25zLgotCShtaXBzX2VsZl9zZWNsZXRfbGluayk6IERpc2NhcmQgZW1wdHkgc2VjdGlvbnMsIHRoZSAub3B0aW9ucwotCXNlY3Rpb24gYW5kIC5ncHRhYiBzZWN0aW9ucy4gIEhhbmRsZSBsaW5raW5nIC5tZGVidWcgc2VjdGlvbi4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IFJlbW92ZWQgcmF3X3NpemUgYW5kIGlmZGJhc2UuCi0JKiBsaWJlbGYuaCAoZWxmX3N5bWJvbF90eXBlKTogQWRkZWQgbWlwc19leHRyIHRvIHRjX2RhdGEgdW5pb24uCi0JKiBiZmQtaW4uaDogQWRkZWQgcHJvdG90eXBlcyBmb3Igcm91dGluZXMgaW4gZWNvZmZsaW5rLmMgKHNvbWUgYXJlCi0JY2FsbGVkIGJ5IGdhcywgc28gdGhleSBhcmUgcHVibGljKS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFkZGVkIGVjb2ZmbGluay5vLgotCShDRklMRVMpOiBBZGRlZCBlY29mZmxpbmsuYy4KLQkoZWNvZmZsaW5rLm8pOiBOZXcgdGFyZ2V0LiAgUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBOb3YgMjIgMjI6MjY6NDIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX29iamVjdF9wKTogQWxzbyByZWNvZ25pemUgU0hBUkVEX01BR0lDX0NOWCBhcwotCWEgdmFsaWQgbWFnaWMgbnVtYmVyIGlmIGl0J3MgYmVlbiBkZWZpbmVkLgotCi1Nb24gTm92IDIyIDE0OjE3OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3QpOiBEb24ndCBjcmVhdGUgLnNjb21tb24gc2VjdGlvbjsgbGlua2VyCi0Jbm8gbG9uZ2VyIHJlcXVpcmVzIGl0LgotCShlY29mZl9iZmRfc2VjbGV0X2xpbmssIGVjb2ZmX3NpemVvZl9oZWFkZXJzLAotCWVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHRyZWF0IC5zY29tbW9uIHNlY3Rpb24KLQlzcGVjaWFsbHkuCi0KLU1vbiBOb3YgMjIgMTA6NTQ6MjcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIGtldkBzcHVkcy5nZWcubW90LmNvbSAoS2V2aW4gQS4gQnVldHRuZXIpOgotCSogYmZkL2NvbmZpZy9kZWx0YTg4Lm1oIChIREVGSU5FUyk6IERlZmluZSB0aGlzIHRvIGJlIC1EUFRSQUNFX0NPUkUuCi0JKiBiZmQvY29uZmlnL2RlbHRhODgubWggKEhERVBGSUxFUyk6IERlZmluZWQgdG8gYmUgcHRyYWNlLWNvcmUuby4KLQkqIGJmZC9wdHJhY2UtY29yZS5jOiAgTmV3IGZpbGUgZm9yIGRlYWxpbmcgd2l0aCBjb3JlIGZpbGVzIHdpdGgKLQlzdGFydCB3aXRoIHRoZSBwdHJhY2VfdXNlciBzdHJ1Y3R1cmUgZm91bmQgb24gQkNTIGNvbXBsaWFudCBzeXN0ZW1zLgotCSogYmZkL3RhcmdldHMuYyAocHRyYWNlX2NvcmVfdmVjKTogIE5ldyB2ZWN0b3IuCi0KLU1vbiBOb3YgMjIgMDI6MzM6MTIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1pbmltYWwgc3VwcG9ydCBmb3IgcmVhZGluZyBTT00gZml4dXAgc3RyZWFtcy4gIEFsbG93cwotCW9iamR1bXAgLXIgdG8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGUuCi0JKiBzb20uYyAoc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IEltcGxlbWVudC4KLQkoc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IEltcGxlbWVudC4KLQkoc29tX3NldF9yZWxvY19pbmZvLCBzb21fc2x1cnBfcmVsb2NfdGFibGUpOiBOZXcgZnVuY3Rpb25zLgotCi1TdW4gTm92IDIxIDEzOjQ2OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvbHlueC5oIChGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQpOiBEZWZpbmUuCi0JKiBob3N0cy9zcGFyY2x5bnguaDogSW5jbHVkZSBseW54LmggaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdC4KLQotRnJpIE5vdiAxOSAxNDozNDowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogRm9yIFJfSVJFTCwgZG9uJ3QgbGVmdCBzaGlmdAotCXNpZ25lZF92YWx1ZSBiZWZvcmUgc2lnbiBleHRlbmRpbmcgaXQuICBEb24ndCBzdWJ0cmFjdCBvdXQKLQlyZWxvY19lbnRyeS0+YWRkcmVzcy4gIFRoaXMgbWFrZXMgaXQgY29tcGF0aWJsZSB3aXRoIHdoYXQgZ2FzIGlzCi0JZ2VuZXJhdGluZy4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IEFjY2VwdCAuc2JzcyBhcyB0aGUgbmFtZSBmb3IgYQotCVNIVF9OT0JJVFMgc2VjdGlvbnMuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogRG9uJ3QgbGVhdmUgdGhlIGxvb3AgYWZ0ZXIgdGhlIGZpcnN0Ci0JU0hUX05PQklUUyBzZWN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IE9ubHkgZm9yY2Ugc2hfb2Zmc2V0IGFuZAotCXNoX2FkZHIgdG8gbWF0Y2ggbW9kdWxvIG1heHBhZ2VzaXplIGZvciBhIHNlY3Rpb24gd2hpY2ggaXMgbm90Ci0JU0hUX05PQklUUy4gIENoYW5nZWQgdGhlIG1ldGhvZCB1c2VkIHRvIGZvcmNlIHBhZ2UgYWxpZ25tZW50IGFmdGVyCi0JYSBTSFRfTk9CSVRTIHNlY3Rpb24gdG8gb25seSBkbyBpdCBmb3IgdGhlIGxhc3Qgc3VjaCBjb25zZWN1dGl2ZQotCXNlY3Rpb24sIGFuZCB0byByZWFsbHkgZm9yY2UgcGFnZSBhbGlnbm1lbnQuCi0KLUZyaSBOb3YgMTkgMDQ6MDI6MDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFByaW50IG1vcmUgdmVyYm9zZSBtZXNzYWdlCi0JaW4gdGhlIGNhc2Ugb2YgYW4gdW5rbm93biAob3IgdW5oYW5kbGVkKSBzdG9yYWdlIGNsYXNzLgotCi0JKiBjb25maWcvaTM4Ni1seW54Lm10IChUREVGSU5FUyk6IEZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRCBzaG91bGQKLQlub3QgYmUgZGVmaW5lZCBoZXJlLCBzaW5jZSBpdCBpcyBhIGhvc3QgYXR0cmlidXRlLCBub3QgYSB0YXJnZXQKLQlvbmUuCi0JKiBjb25maWcvbTY4ay1seW54Lm10LCBjb25maWcvc3BhcmMtbHlueC5tdDogRGl0dG8uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkKLQlkZWZpbmVkLgotCi0JKiBjb2ZmLXNwYXJjLmM6IERlZmluZSBzb21lIHJlbG9jYXRpb25zLCBiYXNlZCBvbiBFTEYgcmVsb2NhdGlvbnMuCi0JKGVudW0gcmVsb2NfdHlwZSwgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywgY29mZl9zcGFyY19ob3d0b190YWJsZSwKLQlzdHJ1Y3QgY29mZl9yZWxvY19tYXAsIHNwYXJjX3JlbG9jX21hcCwKLQljb2ZmX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogQm9ycm93ZWQgZnJvbSBlbGYzMi1zcGFyYy5jIGFuZAotCWVsZi5jLCByZW5hbWVkLgotCShjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZSB0byBiZSBjb2ZmX3NwYXJjX3JlbG9jXy4uLi4KLQkocnR5cGUyaG93dG8pOiBJbmRleCBpbnRvIGNvZmZfc3BhcmNfaG93dG9fdGFibGUgdXNpbmcKLQlkc3QtPnJfdHlwZS4KLQotVGh1IE5vdiAxOCAxMTo0NTozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqLSotaXJpeDUqKTogTmV3IHRhcmdldDsgdXNlIG1pcHNiZWxmLgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtc2dpLWlyaXg1KikgTmV3IGhvc3Q7IHVzZSBpcml4NSAobm8KLQlob3N0cy9pcml4NS5oIGNyZWF0ZWQ7IGp1c3QgdXNlIHN0ZC1ob3N0LmgpLgotCSogY29uZmlnL2lyaXg1Lm1oOiBOZXcgZmlsZTsgbGlrZSBpcml4NC5taCwgYnV0IGRvbid0IHVzZSAtRyBvcgotCS1sbWFsbG9jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlY29mZnN3YXAuaDogQ2hhbmdlZCB0eXBlIG9mIGludGVybmFsIHBvaW50ZXJzIGZvciBzd2FwIG91dAotCWZ1bmN0aW9ucyB0byBjb25zdCAqLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2dvdDE2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlIEdPVDE2Ci0JY29ycmVjdGx5IGZvciBhc3NlbWJsZXIsIGJ1dCBsaW5rZXIgc3VwcG9ydCBub3QgaW1wbGVtZW50ZWQuCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogVXNlIG1pcHNfZWxmX2dvdDE2X3JlbG9jIGZvciBHT1QxNi4KLQkobWlwc19lbGZfc3ltX2lzX2dsb2JhbCk6IE5ldyBmdW5jdGlvbjsgYXQgbGVhc3Qgb24gSXJpeCA1LCBhbGwKLQlub24gc2VjdGlvbiBzeW1ib2xzIGFyZSBjb25zaWRlcmVkIGdsb2JhbC4KLQkoZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCk6IERlZmluZS4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbi4gIFNldCB0aGUgTUlQUwotCWFyY2hpdGVjdHVyZSBsZXZlbCBjb3JyZWN0bHkuCi0JKGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWZpbmUuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX09QVElPTlMuCi0JKG1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgZW50c2l6ZSBvZiAubWRlYnVnIG9yIC5yZWdpbmZvCi0Jc2VjdGlvbiB0byAxLiAgSGFuZGxlIC5vcHRpb25zIHNlY3Rpb24uCi0JKG1pcHNfZWxmX2Fjb21fc2VjdGlvbiwgbWlwc19lbGZfYWNvbV9zeW1ib2wsCi0JbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMsIHVzZWQgdG8gYnVpbGQgYQotCWdlbmVyaWMgLmFjb21tb24gc2VjdGlvbiB0byBob2xkIFNITl9NSVBTX0FDT01NT04gc3ltYm9scy4KLQkobWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBIYW5kbGUgU0hOX01JUFNfQUNPTU1PTiBzeW1ib2xzIGJ5Ci0JcHV0dGluZyB0aGVtIGFsbCBpbiBhIGdsb2JhbCAuYWNvbW1vbiBzZWN0aW9uLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IGR1bXAgY29yZSBpZiB0YXJnZXQKLQlzZWN0aW9uIGhhcyBubyBFTEYgc2VjdGlvbiBkYXRhLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IFNldCBhZGRyYWxpZ24gb2YgcmVsb2Mgc2VjdGlvbiB0byA0LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6CURvbid0IGNvbnNpZGVyIHNlY3Rpb24gMC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBEb24ndCBjb25zaWRlciBzZWN0aW9uIDAuCi0JSW4gdGhlIG1haW4gbG9vcCwgc2tpcCB0aGUgc3ltdGFiIGFuZCBzdHJ0YWIgc2VjdGlvbnMsIHNpbmNlIHRoZWlyCi0JcG9zaXRpb25zIGFyZSBzZXQgZWxzZXdoZXJlLgotCShzd2FwX291dF9zeW1zKTogU2V0IGFkZHJhbGlnbiBvZiBzeW10YWIgc2VjdGlvbiB0byA0LiAgU2V0Ci0JYWRkcmFsaWduIG9mIHN0cnRhYiBzZWN0aW9ucyB0byAxLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IERvbid0IGNvbnNpZGVyIHNlY3Rpb24gMC4KLQkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgd3JpdGUgb3V0IHNlY3Rpb24gMC4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkZWQgZmllbGRzCi0JZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCBhbmQgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGYzMl9iZWQpOiBBZGRlZCBjb3JyZXNwb25kaW5nIGluaXRpYWxpemVycy4KLQkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoc3ltX2lzX2dsb2JhbCk6IFRha2UgYWJmZCBhcmd1bWVudC4gIENhbGwKLQllbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsIGlmIGl0IGlzIG5vdCBOVUxMLgotCShlbGZfbWFwX3N5bWJvbHMpOiBQYXNzIGFiZmQgdG8gc3ltX2lzX2dsb2JhbC4KLQkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0JaWYgaXQgaXMgZGVmaW5lZC4KLQotV2VkIE5vdiAxNyAxODo0MzoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmVjb2ZmLmg6IEluY2x1ZGUgY29mZi9lY29mZi5oLgotCShzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogTW92ZSBleHRlcm5hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQlmaWVsZHMgaW50byBhIHNpbmdsZSBmaWVsZCBwb2ludGluZyB0byBhbiBlY29mZl9kZWJ1Z19zd2FwCi0Jc3RydWN0dXJlLgotCShlY29mZl9kYXRhX3R5cGUpOiBNb3ZlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmaWVsZHMgaW50byBhIHNpbmdsZQotCWZpZWxkIHBvaW50aW5nIHRvIGFuIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgZWNvZmYuYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1XZWQgTm92IDE3IDE3OjM4OjU4IDE5OTMgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBubG1zd2FwLmg6IE5ldyBmaWxlIHRvIHN3YXAgZml4ZWQgaGVhZGVyLiAgSW5jbHVkZWQgYnkgTkxNCi0JYmFja2VuZHMuCi0JKiBsaWJubG0uaCAoc3RydWN0IHJlbG9jX2FuZF9zZWMpOiBEZWZpbmUuCi0JKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBmaXhlZF9oZWFkZXJfc2l6ZSwKLQlubG1fcmVhZF9pbXBvcnQsIG5sbV93cml0ZV9pbXBvcnQsIG5sbV9zd2FwX2ZoZHJfaW4sCi0JbmxtX3N3YXBfZmhkcl9vdXQuCi0JKG5sbV9maXhlZF9oZWFkZXJfc2l6ZSwgbmxtX3JlYWRfaW1wb3J0X2Z1bmMsCi0JbmxtX3dyaXRlX2ltcG9ydF9mdW5jLCBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW5fZnVuYywKLQlubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMsIG5sbV93cml0ZV9leHRlcm5hbF9mdW5jKTogTmV3Ci0JYWNjZXNzb3IgbWFjcm9zLgotCSogbmxtY29kZS5oOiBVc2UgbmV3IGZ1bmN0aW9ucy4KLQkqIG5sbTMyLWkzODYuYzogUHJvdmlkZSBuZXcgZnVuY3Rpb25zLgotCSogbmxtMzItc3BhcmMuYzogTmV3IGZpbGU7IFNQQVJDIE5MTSBiYWNrZW5kLgotCi1XZWQgTm92IDE3IDEzOjU2OjEwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYyAoc3dhcF9zdGRfcmVsb2NfaW4sIHN3YXBfZXh0X3JlbG9jX2luKTogSWdub3JlCi0JZ2FyYmFnZSBiaXRzIGFwcGVhcmluZyBpbiB0aGUgdXBwZXIgZW5kIG9mIHN5bWJvbG51bXMuCi0KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10IChUREVGSU5FUyk6IEFkZCAtREZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRC4KLQotVHVlIE5vdiAxNiAxNzowMzo0MSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBseW54LWNvcmUuYyAobHlueF9jb3JlX2ZpbGVfcCk6ICBDaGFuZ2UgYmZkX3phbGxvYyB0byBiZmRfYWxsb2MuCi0JKiBtNjhrbHlueC5jOiAgRGVmaW5lIGNvcmUgZmlsZSBtYWNyb3MuCi0JKiBob3N0cy9pMzg2bHlueC5oLCBob3N0cy9tNjhrbHlueC5oLCBob3N0cy9seW54Lmg6ICBNb3ZlIGFsbAotCW5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgc3R1ZmYgaW50byBseW54LmguCi0KLVR1ZSBOb3YgMTYgMTU6NDU6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGkzODZsaW51eC5jOiBEZWZpbmUgbmV3IG1hY3JvIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgdG8gMTAyNCwgYW5kCi0JY2hhbmdlIFBBR0VfU0laRSB0byA0MDk2LgotCi1Nb24gTm92IDE1IDExOjQ4OjA4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0KLQkqIFZFUlNJT046IFVwZGF0ZWQuCi0KLVN1biBOb3YgMTQgMjM6MzM6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogRG8gbm90IGNyZWF0ZSBkdW1teSAiLnRleHQiLCAiLmRhdGEiLAotCWFuZCAiLmJzcyIgc2VjdGlvbnMuCi0JKHNldHVwX3NlY3Rpb25zKTogRG8gbm90IHNldCBTRUNfSEFTX0NPTlRFTlRTIGlmIGEgc2VjdGlvbidzIHNpemUKLQlpcyB6ZXJvLiAgUmVjb2duaXplIEJTUyB0eXBlIHNlY3Rpb25zIGFuZCB0dXJuIG9mZiBTRUNfTE9BRCBhbmQKLQlTRUNfREFUQSAoc28gYmludXRpbHMvc2l6ZSB3b3JrcykuICBTZXQgdGhlIGNvcnJlY3QgdmFsdWUgZm9yCi0JYSBzZWN0aW9uJ3MgX3Jhd19zaXplLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogUHJvZ3JhbSBlbnRyeSBwb2ludHMsIGFuZCBtaWxsaWNvZGUgYXJlCi0JYWxzbyBmdW5jdGlvbnMuICBNYXJrIHRoZW0gYXMgc3VjaC4gIEFsc28gbWFyayBMJCogc3ltYm9scyBhcwotCWRlYnVnZ2luZyBzeW1ib2xzLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVNhdCBOb3YgMTMgMTU6Mjc6MTUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIG1pc3NpbmcgcHJvdG90eXBlLiAgUmV0dXJucwotCWEgcG9pbnRlciB0byBjb25zdGFudCBkYXRhLiAgRGVsZXRlIGJvZ3VzICNkZWZpbmUgd2hpY2ggbWFkZSB0aGUgCi0JZnVuY3Rpb24gdXNlbGVzcy4KLQotCSogc29tLmMgKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV93cml0ZV9maXh1cHMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV93cml0ZV9zcGFjZV9zdHJpbmdzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZWdpbl93cml0aW5nKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgTm92IDEyIDE1OjI5OjM2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvIG5vdCBhYm9ydC4gIEZsZXNoIG91dC4KLQkoc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG8gbm90IGFib3J0LiAgRmxlc2ggb3V0LgotCi0JKiBzb20uYyAoc29tX3dyaXRlX2hlYWRlcnMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoc29tX3NpemVvZl9oZWFkZXJzKTogQWRkIG1pc3NpbmcgcHJvdG90eXBlLgotCShzb21fc2V0X2FyY2hfbWFjaCk6IERvIG5vdCBhYm9ydC4KLQotCSogc29tLmMgKHNvbV9jb3VudF9zcGFjZXMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9jb3VudF9zdWJzcGFjZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNvbXBhcmVfc3ltcyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2NvbXB1dGVfY2hlY2tzdW0pOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHRyeV9wcmV2X2ZpeHVwKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcmVsb2Nfc2tpcCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX2FkZGVuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX2NhbGwpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChzb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX3F1ZXVlX2luc2VydCk6IExpa2V3aXNlLgotCShzb21fcmVsb2NfcXVldWVfZml4KTogTGlrZXdpc2UuCi0JKHNvbV9yZWxvY19xdWV1ZV9maW5kKTogTGlrZXdpc2UuCi0KLQkqIHNvbS5jIChzb21faHBwYV9ob3d0b190YWJsZSk6IFNPTSBob3d0byByZWxvY2F0aW9uIHRhYmxlLgotCShocHBhX3NvbV9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHN0cnVjdCByZWxvY19xdWV1ZSk6IE5ldyBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZgotCXRoZSBsYXN0IGZvdXIgbXVsdGlieXRlIHJlbG9jYXRpb25zIGVtaXR0ZWQuCi0JKGVudW0gcGFfc3ltYm9sX3R5cGUpOiBUeXBlIHRvIGZ1bGx5IGRlc2NyaWJlIHRoZSBzeW1ib2wgdHlwZXMKLQlhc3NvY2lhdGVkIHdpdGggLmltcG9ydC8uZXhwb3J0IGFzc2VtYmxlciBkaXJlY3RpdmVzLgotCi0JKiBzb20uYzogSW5jbHVkZSBsaWJocHBhLmgKLQotCSogc29tLmMgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzKTogTGlrZXdpc2UuCi0JKGJmZF9zb21fc2V0X3N5bWJvTF90eXBlKTogTGlrZXdpc2UuCi0JKGJmZF9zb21fYXR0YWNoX3Vud2luZF9pbmZvKTogTGlrZXdpc2UuCi0JKiBzb20uaDogRGVjbGFyZSBuZXcgZXhwb3J0ZWQgZnVuY3Rpb25zLgotCi0JKiBzb20uaCAoc3RydWN0IHNvbV9zeW1ib2wpOiBBZGQgbmV3IGZpZWxkcyB0byBob2xkIGFkZGl0aW9uYWwKLQlpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQvd3JpdGUgc3ltYm9sIHRhYmxlcyBhbmQgZml4dXAgc3RyZWFtcy4KLQkoc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogQWRkIG5ldyBmaWVsZHMgdG8gaG9sZCBhZGRpdGlvbmFsCi0JaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkL3dyaXRlIHNwYWNlIGFuZCBzdWJzcGFjZSBoZWFkZXJzLgotCShzb21fc3ltYm9sX2RhdGEpOiBOZXcgYWNjZXNzb3IgbWFjcm8gZm9yIFNPTSBzeW1ib2wgaW5mb3JtYXRpb24uCi0JKFJfSFBQQV8qKTogQmFzaWMgcmVsb2NhdGlvbiB0eXBlcyB0byBiZSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuCi0KLUZyaSBOb3YgMTIgMTE6MDA6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBJZiBuZXcgaG9vawotCVRSQURfQ09SRV9BTExPV19BTllfRVhUUkFfU0laRSBkZWZpbmVkLCB0aGVuIHNraXAgdGhlIGNoZWNrIGZvciB0aGUKLQljb3JlZmlsZSBiZWluZyB0b28gYmlnLgotCSogaG9zdHMvaTM4NnNjby5oOiBEZWZpbmUgaXQuCi0KLVRodSBOb3YgMTEgMTU6MTY6MjggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBocHBhYnNkX2NvcmVfZGF0YS4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZCBocHBhYnNkX2NvcmVfdmVjLgotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IEZhaWwgaWYgYW4gdW5rbm93biBjb3JlCi0Jc2VjdGlvbiBpcyBlbmNvdW50ZXJlZCBkdXJpbmcgY29yZSBzZWN0aW9uIHNjYW5uaW5nLgotCSogaHBwYWJzZC1jb3JlLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL2hwcGFic2QubWg6IEVuYWJsZSBIUFBBIEJTRCBjb3JlIGZpbGVzLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogUmVtb3ZlIERFRlVOIGNydWQuICBSZW1vdmUgY29kZQotCXdoaWNoIGlzIGVpdGhlciBjb21tZW50ZWQgb3V0IG9yIGlmZGVmJ2Qgb3V0LiAgQWRkLCB1cGRhdGUgYW5kCi0JY2xlYW4gY29tbWVudHMuICBGaXggdmFyaW91cyBpbmRlbnRpb24gYW5kIHNwYWNpbmcgcHJvYmxlbXMuICBIYW5kbGUKLQlwcm9ibGVtcyByZWxhdGVkIHRvIHVzaW5nICJibGUiIHRvIGp1bXAgdG8gYSBzdHViIHJhdGhlciB0aGFuICJibCIKLQkoJXIzMSBpcyB0cmFzaGVkIGJ5ICJibGUiLCBidXQgbm90IGJ5ICJibCIpLgotCShORVdfSU5TVFJVQ1RJT04pOiBQdXQgaW5zaWRlIGN1cmx5IGJyYWNlcy4KLQkoQ1VSUkVOVF9TVFVCX09GRlNFVCk6IEZpeCBpbmRlbnRpb24gcHJvYmxlbXMuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogRml4IGluZGVudGlvbiBhbmQgc3BhY2luZyBwcm9ibGVtcy4KLQlBZGQsIHVwZGF0ZSBhbmQgY2xlYW4gY29tbWVudHMuICBIYW5kbGUgImJsZSIgJXIzMSBsb3NzYWdlIHByb2JsZW1zLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogTGlrZXdpc2UuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IExpa2V3aXNlLgotCShocHBhX2VsZl9zdHViX2NoZWNrKTogUmVtb3ZlIG9ic29sZXRlIGZ1bmN0aW9uLgotCi0JKiBocHBhX3N0dWJzLmg6IEFkZCBuZXcgaW5zdHJ1Y3Rpb25zIHRvIGRlYWwgd2l0aCAlcjMxIGxvc3NhZ2UKLQlwcm9ibGVtcy4gIERlbGV0ZSB1bnVzZWQgaW5zdHJ1Y3Rpb25zLgotCQotVHVlIE5vdiAgOSAxMTo0MDoyNyAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIG02OGtseW54LmMgKFRBUkdFVF9JU19CSUdfRU5ESUFOX1ApOiBEZWZpbmUuCi0KLVR1ZSBOb3YgIDkgMTE6MjY6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaCBhbiBhcnJheQotCW9mIGFyY2hpdGVjdHVyZXMsIGdldCB0aGUgRUxGIEVNX3h4eCBjb2RlIGZyb20gdGhlIGJhY2tlbmQKLQlpbmZvcm1hdGlvbi4gIExldCB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0IG1hdGNoIGFueSBFTV94eHggY29kZSBub3QKLQltYXRjaGVkIGJ5IGFub3RoZXIgRUxGIHRhcmdldC4gIENhbGwgZWxmX2JhY2tlbmRfb2JqZWN0X3AgdG8gbGV0Ci0JdGhlIGJhY2tlbmQgZG8gbW9yZSBjaGVja3MgYW5kIHNldCBnbG9iYWwgaW5mb3JtYXRpb24uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBlbGZfbWFjaGluZV9jb2RlIGFuZAotCWVsZl9iYWNrZW5kX29iamVjdF9wIGZpZWxkcy4KLQkoc3RydWN0IGJmZF9lbGZfYXJjaF9tYXApOiBSZW1vdmVkLgotCShiZmRfZWxmX2FyY2hfbWFwLCBiZmRfZWxmX2FyY2hfbWFwX3NpemUpOiBEb24ndCBkZWNsYXJlLgotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBJbml0aWFsaXplIGVsZl9tYWNoaW5lX2NvZGUKLQlmaWVsZCB3aXRoIEVMRl9NQUNISU5FX0NPREUuICBJbml0aWFsaXplIGVsZl9iYWNrZW5kX29iamVjdF9wCi0JZmllbGQgd2l0aCBlbGZfYmFja2VuZF9vYmplY3RfcCAoaWYgaXQgaXMgZGVmaW5lZCkuCi0JKiBlbGYzMi1nZW4uYywgZWxmMzItaHBwYS5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywKLQllbGYzMi1tNjhrLmMsIGVsZjMyLW04OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1zcGFyYy5jLAotCWVsZjY0LWdlbi5jIChFTEZfTUFDSElORV9DT0RFKTogRGVmaW5lZC4KLQkqIGVsZjMyLW1pcHMuYzogSW5jbHVkZSBlY29mZnN3YXAuaCB0byBnZXQgRUNPRkYgc3dhcHBpbmcKLQlyb3V0aW5lcy4KLQkobWlwc19lbGZfb2JqZWN0X3ApOiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLgotCShtaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwKTogRGVmaW5lZC4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBEZWZpbmVkIHRvIGJlIG1pcHNfZWxmX29iamVjdF9wLgotCShlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTogRGVmaW5lZCB0byBiZQotCW1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXAuCi0JKiBlbGYuYyAoYmZkX2VsZl9hcmNoX21hcCwgYmZkX2VsZl9hcmNoX21hcF9zaXplKTogUmVtb3ZlZC4KLQotCSogbGliYmZkLWluLmggKHRhcmdldF92ZWN0b3IsIGRlZmF1bHRfdmVjdG9yKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogZm9ybWF0LmMgKHRhcmdldF92ZWN0b3IsIGRlZmF1bHRfdmVjdG9yKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IERvbid0IGNvbXBsYWluIG9uIG92ZXJmbG93Ci0JZm9yIFJfTUlQU18yNi4gIENvcnJlY3Qgb3ZlcmZsb3cgZGV0ZWN0aW9uIHJlcXVpcmVzIG1hdGNoaW5nIHRoZQotCXVwcGVyIGZvdXIgYml0cyBvZiB0aGUgZGVzdGluYXRpb24gYWdhaW5zdCB0aGUgUEMuICBGcm9tIFRlZCBMZW1vbgotCTxtZWxsb25AcGVwcGVyLm5jZC5jb20+LgotCi0JKiBib3V0LmMgKGJfb3V0X3JlbG9jX3R5cGVfbG9va3VwKTogUmV0dXJuIHR5cGUgc2hvdWxkIHBvaW50IHRvCi0JY29uc3QgZGF0YS4KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkocmVsb2NfaG93dG9fdHlwZV9sb29rdXApKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogTWFkZSBob3d0byBjb25zdC4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX2RhdGEpOiBNYWRlIGhvdyBjb25zdC4KLQotCSogbGliZWxmLmg6IEFkZGVkIHNvbWUgY29tbWVudHMuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkZWQgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAotCWZpZWxkLiAgUmVtb3ZlZCB1bnVzZWQgd3JpdGVfcmVsb2NzIGZpZWxkLgotCSogZWxmMzItdGFyZ2V0Lmg6IEFkanVzdGVkIGVsZl9iYWNrZW5kX2RhdGEgaW5pdGlhbGl6YXRpb24KLQlhY2NvcmRpbmdseS4KLQkqIGVsZjY0LXRhcmdldC5oOiBDb3JyZWN0ZWQgZWxmX2JhY2tlbmRfZGF0YSBpbml0aWFsaXphdGlvbiB0bwotCWZpbGwgaW4gYWxsIGZpZWxkcyBhbmQgdG8gc2V0IGVsZl82NF9wIHRvIDEuCi0KLU1vbiBOb3YgIDggMTg6MTM6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbW92ZSBkdXBsaWNhdGUgYXNzaWdubWVudAotCXRvIGZpbGVwb3MgaW4gU0hUX1NUUlRBQiBjYXNlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IFNldCBCRkQgc2VjdGlvbiBmaWxlcG9zIGFzCi0Jd2VsbCBhcyBFTEYgc2VjdGlvbiBzaF9vZmZzZXQuCi0KLQkqIHJlbG9jLmM6IFVzZSBjb25zdCBpbnN0ZWFkIG9mIENPTlNULgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogTWFrZSB2YXJpYWJsZSBob3d0byBhIGNvbnN0IHBvaW50ZXIuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1Nb24gTm92ICA4IDEyOjE5OjE1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAocmVhbGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGdlbmVyYXRlZCBoZWFkZXJzLiAgUmV2ZXJ0cwotCWNoYW5nZSBvZiAyIEp1bCAxOTkzLgotCi1Nb24gTm92ICA4IDA2OjA4OjMxIDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iZmQ6IG1ha2UgdW5peHdhcmUgZXF1aXZhbGVudCB0byBzeXN2NC4KLQotCSogY29uZmlnL2kzODYtbmxtLm10OiBicmluZyBpbiBlbGYgY29uZmlnOyBtYWtlIGl0IHRoZSBkZWZhdWx0LgotCi1TdW4gTm92ICA3IDIwOjIxOjM4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJiZmQuYyAoYmZkX3B1dF84KTogQWRkIHBhcmVucyBhcm91bmQgcmVmZXJlbmNlIHRvICJ2YWwiCi0JYXJndW1lbnQuCi0KLUZyaSBOb3YgIDUgMjE6NDU6MDkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bWFjaDMuaCAoSE9TVF9TRUdNRU5UX1NJWkUpLAotCWkzODZtYWNoMy5jIChTRUdNRU5UX1NJWkUsIFRFWFRfU1RBUlRfQUREUik6IENvcnJlY3QgdmFsdWVzICg/KS4KLQotRnJpIE5vdiAgNSAxNToxNzo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogWmVybyBvdXQgaW50ZXJuYWxfYS4KLQotRnJpIE5vdiAgNSAxMDo0MTowNyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgYmZkLmMsIGNhY2hlLmMsIGNvZmZjb2RlLmgsCi0JY29yZS5jLCBjdG9yLmMsIGZvcm1hdC5jLCBpbml0LmMsIGxpYmJmZC5jLCBvcG5jbHMuYywgcmVsb2MuYywKLQlzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jOgotCURvYyBjbGVhbnVwIChzcGVsbGluZywgcHVuY3R1YXRpb24sIGdyYW1tYXIsIGZvcm1hdHRpbmcpLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotVGh1IE5vdiAgNCAxNDo0NjoxNCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2NhY2hlYWJsZSwgYmZkX3NldF9jYWNoZWFibGUpOiAgTmV3IGFjY2Vzc29ycy4KLQkqIGJmZC5jLCBvcG5jbHMuYzogIEltcHJvdmUgY29tbWVudHMgb24gZmlsZSBkZXNjcmlwdG9yIGNhY2hlaW5nLgotCi1UaHUgTm92ICA0IDA4OjU0OjMwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBGcm9tIFBldGUgSG9vZ2VuYm9vbSAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IEZpeCBsb2dpYyBlcnJvcgotCWluIGxhc3QgY2hhbmdlLiAgQWx3YXlzIHJlYnVpbGQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIHRoZSBmaXJzdAotCXRpbWUgdGhvdWdoIGlmIG91dHB1dCBzZWN0aW9ucyBleGlzdCAoZml4ZXMgbGQgLXIgcHJvYmxlbXMpLgotCi1UaHUgTm92IDA0IDA4OjA4OjQ2IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgLlBIT05ZIGZvciBjaGVjayBhbmQgaW5zdGFsbGNoZWNrIHJ1bGVzLgotCi1UdWUgTm92ICAyIDE0OjQyOjI3IDE5OTMgIEJpbGwgQ294IChiaWxsQHRhcmthcy5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoYXJ0ZGF0YSk6IFVzZSBsb25nLCBub3QgdGltZV90IGZvciBwb3J0YWJpbGl0eSwgYXQKLQkgIGxlYXN0IHRvIEhQVVguICBGaWxlIGJlbG93IGlzIGEgZGVyaXZlZCBmaWxlLgotCi1UdWUgTm92ICAyIDE0OjQyOjI3IDE5OTMgIEJpbGwgQ294IChiaWxsQHRhcmthcy5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuaCAoYXJ0ZGF0YSk6IFVzZSBsb25nLCBub3QgdGltZV90IGZvciBwb3J0YWJpbGl0eSwgYXQKLQkgIGxlYXN0IHRvIEhQVVguCi0KLVR1ZSBOb3YgIDIgMDk6MzI6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBiaWdtaXBzIGZvciBtaXBzKi0qLWJzZCouCi0KLU1vbiBOb3YgIDEgMTQ6MzA6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY2FfdGFibGUsIGVsZl9zbHVycF9yZWxvY190YWJsZSk6Ci0JSGFuZGxlIHN5bWJvbCBudW1iZXIgb2YgemVyby4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQKLQlCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBCRkRfUkVMT0NfTUlQU19HT1QxNiwKLQlCRkRfUkVMT0NfTUlQU19DQUxMMTYsIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUKLQlCRkRfUkVMT0NfTUlQU19MSVRFUkFMLgotCSogZWxmMzItbWlwcy5jIChtaXBzX3JlbG9jX21hcCk6IEhhbmRsZSBuZXcgcmVsb2NzLgotCShtaXBzX2VsZl9oaTE2X3JlbG9jLCBtaXBzX2VsZl9sbzE2X3JlbG9jKTogUmVhcnJhbmdlIF9ncF9kaXNwCi0JY2hlY2tzIHNsaWdodGx5LgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfZGVidWdfaW5mb19zdGFydCwgTVlfYmZkX2RlYnVnX2luZm9fZW5kLAotCU1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdCBbc2ljXSk6IFJlbW92ZSB1bnVzZWQgZGVmaW5pdGlvbnMuCi0JKE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIE1ZX2JmZF9yZWxheF9zZWN0aW9uLAotCU1ZX2JmZF9zZWNsZXRfbGluayk6IERlZmluZS4KLQkoTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KLQlNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cC4KLQkoTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogUmVuYW1lIGZyb20gTVlfbWFrZV9kZWJ1Z19zeW1ib2wuCi0JKE1ZKHZlYykpOiBVc2UgSlVNUF9UQUJMRSByYXRoZXIgdGhhbiBsaXN0aW5nIGZ1bmN0aW9ucy4KLQkqIGhwMzAwaHB1eC5jIChNWV9nZXRfc3ltdGFiLCBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLAotCU1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYywgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgZGVmaW5lIGluCi0JdGVybXMgb2YgTVksIGJlY2F1c2UgdGhhdCBjYXVzZXMgYSByZWN1c2l2ZSBpbnZvY2F0aW9uIG9mIENBVCB3aGVuCi0JZXhwYW5kZWQgd2l0aGluIEpVTVBfVEFCTEUsIGFuZCBBTlNJIGNvbXBpbGVycyBkb24ndCBleHBhbmQKLQlyZWN1cnNpdmUgbWFjcm9zLgotCSogbWlwc2JzZC5jIChNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgZnJvbQotCU1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwLCBhbmQgZG9uJ3QgZGVmaW5lIGluIHRlcm1zIG9mIE1ZLgotCShNWV9jYW5vbmljYWxpemVfcmVsb2MpOiBEb24ndCBkZWZpbmUgaW4gdGVybXMgb2YgTVkuCi0JKGFvdXRfbWlwc19saXR0bGVfdmVjLCBhb3V0X21pcHNfYmlnX3ZlYyk6IFVzZSBKVU1QX1RBQkxFIHJhdGhlcgotCXRoYW4gbGlzdGluZyBmdW5jdGlvbnMuCi0KLU1vbiBOb3YgIDEgMDk6MTI6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBtNjhrLWVsZiBmb3IgbTY4Ki0qLXN5c3Y0Ki4KLQotU3VuIE9jdCAzMSAwOTozNTo0OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiBNb3ZlIGVudW0gdGFyZ2V0X2ZsYXZvdXIgb3V0c2lkZSBvZiBzdHJ1Y3QgYW5kIGNoYW5nZQotCXRoZSBuYW1lIHRvIGVudW0gYmZkX2ZsYXZvdXIuICBUaGlzIG1lYW5zIGJmZCBjbGllbnRzIGNhbiB1c2UgaXQuCi0JKiBiZmQtaW4uaDogQWRkIG1hY3JvIGJmZF9nZXRfZmxhdm91ci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogc29tLmM6IEFkZCBjb21tZW50IGFib3V0IGhvdyBhYm9ydCgpIG9uIGNvcnJ1cHQgZXhlY3V0YWJsZSBpcyBldmlsLgotCi1TYXQgT2N0IDMwIDEyOjI3OjA5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dCxzbHVycF9yZWxvY190YWJsZSk6IEF2b2lkIGEgZ290by4KLQotRnJpIE9jdCAyOSAxNjowNDozMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdlbi1hb3V0LmMsIGxpYmJmZC5jOiBleGl0KDEpIGluc3RlYWQgb2YgZXhpdCgtMSkuCi0KLUZyaSBPY3QgMjkgMTM6MTc6MjEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogQWRkZWQgY29tbWFuZHMgZm9yIG9iamVjdCBmaWxlIGZsYWcgdmFsdWVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBJZiB0eXBlIGlzIEVUX0RZTiwgc2V0IERZTkFNSUMgZmxhZywKLQlub3QgRVhFQ19QLgotCSogYm91dC5jLCBjb2ZmLWg4MzAwLmMsIGNvZmYtc2guYzogQWRkIEJGRF9JU19SRUxBWEFCTEUgdG8KLQlvYmplY3RfZmxhZ3MgZmllbGQgZm9yIHRhcmdldCB2ZWN0b3IuCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LWFkb2JlLmMsIGFvdXQtdGFyZ2V0LmgsIGJvdXQuYywgY29mZi1hMjlrLmMsCi0JY29mZi1hbHBoYS5jLCBjb2ZmLWFwb2xsby5jLCBjb2ZmLWg4MzAwLmMsIGNvZmYtaDg1MDAuYywKLQljb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywgY29mZi1taXBzLmMsCi0JY29mZi1yczYwMDAuYywgY29mZi1zaC5jLCBjb2ZmLXdlMzJrLmMsIGNvZmYtejhrLmMsIGhwdXgtY29yZS5jLAotCWllZWUuYywgbWlwc2JzZC5jLCBubG0tdGFyZ2V0LmgsIG9hc3lzLmMsIG9zZi1jb3JlLmMsIHNvbS5jLAotCXNyZWMuYywgdGVraGV4LmMsIHRyYWQtY29yZS5jOglSZW1vdmUgRFlOQU1JQyBmcm9tIG9iamVjdF9mbGFncwotCWZpZWxkIGZvciB0YXJnZXQgdmVjdG9yLgotCi1UaHUgT2N0IDI4IDIwOjAyOjMxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogRG9uJ3QgZGVjbGFyZSB0aW1lOyBjYXVzZXMgZXJyb3Igb24gbWFjaDMuCi0JKiBjb25maWd1cmUuaW4gKGkzODZtYWNoM192ZWMpOiBSZXF1aXJlIGFvdXQzMi5vIHN0YWItc3ltcy5vLgotCi1UaHUgT2N0IDI4IDE2OjMzOjI2IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCUx5bnhPUyBhbmQgU3BhcmMgTHlueE9TIGNoYW5nZXM6Ci0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgc3BhcmMtKi1seW54b3MqLgotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBzcGFyYy0qLWx5bnhvcyouCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBTcGFyYyBMeW54IHZlY3RvcnMuCi0JKiB0YXJnZXRzLmMgKHNwYXJjbHlueF9hb3V0X3ZlYyk6IERlY2xhcmUuCi0JKHNwYXJjbHlueF9jb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKHRhcmdldF92ZWN0b3IpOiBBZGQgdGhlbS4KLQkqIGNmLWkzODZseW54LmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gaTM4Nmx5bngtY2YuYy4KLQkqIGNmLW02OGtseW54LmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gbTY4a2x5bngtY2YuYy4KLQkqIGNmLXNwYXJjbHlueC5jOiBOZXcgZmlsZSwgc3VwcG9ydCBmb3IgY29mZiBpbiBTcGFyYyBMeW54T1MuCi0JKiBjb2ZmLXNwYXJjLmM6IE5ldyBmaWxlLCBiYXNpYyBTcGFyYyBjb2ZmIHN1cHBvcnQuCi0JKiBzcGFyY2x5bnguYzogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIGEub3V0IGluIFNwYXJjIEx5bnhPUy4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgZmlsZW5hbWVzIGFwcHJvcHJpYXRlbHksIGFkZCBTcGFyYyBydWxlcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogUmVjb2duaXplIFNwYXJjIG1hZ2ljCi0JbnVtYmVyLgotCShjb2ZmX3NldF9mbGFncyk6IFVzZSBMeW54T1MgbWFnaWMgbnVtYmVyIGZvciBpMzg2LCBtNjhrLCBhbmQKLQlTcGFyYyBMeW54T1MsIHNldCBTcGFyYyBtYWdpYyBudW1iZXIgZm9yIFNwYXJjcy4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQgKFNFTEVDVF9WRUNTKTogUmVtb3ZlIHJlZHVuZGFudCB2ZWN0b3IuCi0JKiBjb25maWcvc3BhcmMtbHlueC5tdDogTmV3IGZpbGUuCi0JKiBob3N0cy9pMzg2bHlueC5oOiBDb3NtZXRpYyBpbXByb3ZlbWVudHMuCi0JKiBob3N0cy9tNjhrbHlueC5oOiBBZGQgaWZkZWZzLCAjZGVmaW5lIG9mIGNmcmVlLgotCSogaG9zdHMvc3BhcmNseW54Lmg6IE5ldyBmaWxlLgotCi1UaHUgT2N0IDI4IDE2OjIzOjQwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogRGVjbGFyZSByZXR1cm4gdHlwZS4KLQlSZW1vdmUgdXNlbGVzcyBzdGF0ZW1lbnQgcHJvYmFibHkgbGVmdCBieSBjb2RlIGNvcHkuCi0JKiBjcHUtaTk2MC5jIChjb21wYXRpYmxlKTogRnVsbHkgYnJhY2tldCBtYXRyaXggaW5pdGlhbGl6ZXIuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogVXNlIGJmZF94bWFsbG9jCi0JcmF0aGVyIHRoYW4geG1hbGxvYy4gIFVzZSByZWFsbG9jIGFuZCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlCi0JcmF0aGVyIHRoYW4geHJlYWxsb2MuCi0JKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkIHNvbWUgY2FzdHMuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlLiAgQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0JKiBocDMwMGhwdXguYzogRGVjbGFyZSBhb3V0XzMyX3dyaXRlX3N5bXMuCi0JKiBpMzg2YnNkLmMsIGkzODZsaW51eC5jLCBuZXRic2QzODYuYyAoTl9TSEFSRURfTElCKTogRGVmaW5lIGFzIDAKLQkoZGVmaW5pdGlvbiBmcm9tIGFvdXQvYW91dDY0LmggaXMgYWx3YXlzIDAgYW55aG93KS4KLQkqIGkzODZseW54LmMgKHN3YXBfc3RkX3JlbG9jX2luKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9pZCk6IGxlbmd0aCBjYW4gbmV2ZXIgYmUgbmVnYXRpdmUuCi0JKHJlYWRfaWQpOiBMaWtld2lzZS4KLQkoaWVlZV9hcmNoaXZlX3ApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCSogbGliY29mZi1pbi5oIChiZmRfcGVyZm9ybV9zbGlwKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogUmVtb3ZlIHplcm8gaW5pdGlhbGl6YXRpb24gb2YKLQlzdGF0aWMgc3RydWN0dXJlLgotCSogcmVsb2MxNi5jOiBJbmRlbnRhdGlvbiBjaGFuZ2UuCi0KLVdlZCBPY3QgMjcgMTY6NTE6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2kzODYtbWFjaDMubXQ6IFVwZGF0ZSBmb3IgbmV3IGNvbmZpZ3VyYXRpb24KLQkoLS13aXRoLXRhcmdldHMJYW5kIHNvIG9uKS4KLQkqIGhvc3RzL2kzODZtYWNoMy5oOiBEZWNsYXJlIGVycm5vLgotCSogdGFyZ2V0cy5jOiBEZWNsYXJlIGkzODZtYWNoM192ZWMuCi0KLVdlZCBPY3QgMjcgMTI6MTg6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luLAotCW5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IEhhbmRsZSBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldAotCWFuZCBzaGFyZWREZWJ1Z1JlY29yZENvdW50IGZpZWxkcy4KLQotVHVlIE9jdCAyNiAxNjoyMToxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmVtb3ZlIFNDT19DT1JFLiAgT24gU2VwIDExIDE5OTMsCi0Jd2Ugc3RhcnRlZCB1c2luZyB0cmFkLWNvcmUuYyBmb3IgU0NPIGluc3RlYWQuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlLWVuYWJsZSBnZW5lcmljIEVMRiBhbmQgTkxNIHRhcmdldHMuCi0KLVR1ZSBPY3QgMjYgMTY6NTM6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogQWxpZ24gc2hfb2Zmc2V0IHRvCi0Jc2hfYWRkcmFsaWduICh0aGlzIGlzIHdoYXQgVW5peFdhcmUgZG9lcywgYW5kIGl0IHNob3VsZG4ndCBodXJ0KS4KLQotVHVlIE9jdCAyNiAxMDoxNjo1NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCUZyb20gSmVmZiBMYXcgYW5kIFBldGUgSG9vZ2VuYm9vbSBhdCBVdGFoOgotCi0JKiBlbGYzMi1ocHBhLmggKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogQWRkIHByb3RvdHlwZS4KLQkoRUxGMzJfSFBQQV9SX0FSR19SRUxPQyk6IFJlbmFtZWQgd2l0aG91dCB0aGUgRUxGMzIgcHJlZml4Ci0JYW5kIG1vdmVkIGludG8gbGliaHBwYS5oLiAgQWxsIHJlZmVyZW5jZXMgY2hhbmdlZC4KLQkoRUxGMzJfSFBQQV9SX0NPTlNUQU5ULCBFTEYzMl9IUFBBX1JfQURERU5EKTogTGlrZXdpc2UuCi0JKGdldF9vcGNvZGUgYW5kIG9wY29kZSBkZWZpbmVzKTogTW92ZSBpbnRvIGxpYmhwcGEuaAotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9pbnNuMmZtdCk6IFJlbmFtZSBhbmQgbW92ZSBpbmZvCi0JbGliaHBwYS5oLgotCSogbGliaHBwYS5oIChIUFBBX1JfKik6IE1vdmVkIGhlcmUuICBSZWZvcm1hdHRlZCBzbGlnaHRseSB0byBtYWtlCi0JZm9yIGVhc2llciByZWFkaW5nLgotCShnZXRfb3Bjb2RlKTogTW92ZWQgaGVyZS4gIEZJWE1FISB0aGlzIHJlYWxseSBzaG91bGQgYmUgYSBDIGZ1bmN0aW9uCi0JaW5zaWRlIHRoZSBvcGNvZGUgbGlicmFyeSEKLQkoYmZkX2hwcGFfaW5zbjJmbXQpOiBMaWtld2lzZS4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogRW5hYmxlIGVsZjMyLWhwcGEgdmVjdG9yLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkIG5ldyBjb21tZW50cwotCWFuZCBjbGFyaWZ5IGV4aXN0aW5nIGNvbW1lbnRzLiAgRG8gbm90IHVzZSBERUZVTiB0byBkZWNsYXJlIHRoaXMKLQlmdW5jdGlvbi4gIEZpeCBudW1lcm91cyBpbmRlbnRpb24gcHJvYmxlbXMuICBDb3JyZWN0bHkgaGFuZGxlIGNhc2VzCi0Jd2hlcmUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIG1heSBuZWVkIHRvIGJlIHJlYWQgZnJvbSBkaXNrLCAKLQlyZWFkIGZyb20gbWVtb3J5LCBvciBidWlsdCB0aGVuIHJlYWQgZnJvbSBtZW1vcnkuCi0KLQkqIGVsZjMyLWhwcGEuaDogUmVmb3JtYXQgd2l0aCBnbnUtaW5kZW50IGFuZCBoYW5kIGZpeCBudW1lcm91cwotCWZvcm1hdHRpbmcgYW5kIGluZGVudGlvbiBwcm9ibGVtcyBnbnUtaW5kZW50IGNhbiBub3QgaGFuZGxlLgotCUNsYXJpZnkgc29tZSBjb21tZW50cyBhYm91dCByZWxvY2F0aW9uIHR5cGVzLiAgQ29tbWVudCBiYXNpYwotCXJlbG9jYXRpb24gImNsYXNzZXMiLiAgR3JvdXAgUEFSQU0gZGVjbGFyYXRpb25zIHRvZ2V0aGVyLgotCShIUFBBX1NYVF97TlVMTCwgU1lNTkRYLCBSR19SRUxPQ30pOiBNYWtlIG1lbWJlcnMgb2YgYSBuZXcgCi0JZW51bWVyYXRlZCB0eXBlIHJhdGhlciB0aGFuICNkZWZpbmVzLgotCi1UdWUgT2N0IDI2IDAyOjQwOjQ2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChocHBhX29iamVjdF9zZXR1cCk6ICBTZXQgU0VDX0NPREUgZm9yIC50ZXh0IHNlY3Rpb24gc28KLQl0aGF0IEdEQiBjYW4gZmlndXJlIG91dCB0ZXh0X3N0YXJ0IGFuZCB0ZXh0X2VuZC4KLQotTW9uIE9jdCAyNSAxNjowNToyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlGaXggdXAgd2FybmluZ3MgZnJvbSBnY2MgLVdhbGw6Ci0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogVXNlICVseCBhbmQgY2FzdCBuX3ZhbHVlIHRvCi0JdW5zaWduZWQgbG9uZy4gIFVzZSAlbGQgZm9yIHRhZ25keC4gIFVzZSAlbHggZm9yIG9mZnNldCArIHZtYSBhbmQKLQljYXN0IGl0IHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBlY29mZi5jIChlY29mZl9lbWl0X2FnZ3JlZ2F0ZSk6IFVzZSAlbGQuCQotCShlY29mZl9wcmludF9zeW1ib2wpOiBVc2UgJWxkLCBhbmQgY2FzdCBpbmR4IGFuZCBzeW1fYmFzZSB0byBsb25nLgotCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSk6IFNwZWNpZnkgcmV0dXJuIHR5cGUuCi0KLQkqIGxpYmJmZC5jIChiZmRfd3JpdGUpOiBJZiBub3QgZXZlcnl0aGluZyBpcyB3cml0dGVuIG91dCwgc2V0Ci0JYmZkX2Vycm9yIHRvIHN5c3RlbV9jYWxsX2Vycm9yLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcwotCW5vbi1uZWdhdGl2ZSwgc2V0IGVycm5vIHRvIEVOT1NQQyAoaWYgRU5PU1BDIGlzIGRlZmluZWQpLgotCShiZmRfc2Vlayk6IElmIHRoZSBzZWVrIGZhaWxzLCBzZXQgYmZkX2Vycm9yIHRvIHN5c3RlbV9jYWxsX2Vycm9yLgotCShiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IEZvciBhIGJhZCBvZmZzZXQgKyBjb3VudCwgc2V0Ci0JYmZkX2Vycm9yIHRvIGJhZF92YWx1ZS4KLQkqIHNlY2xldC5jIChyZWwpOiBEb24ndCBhYm9ydC4gIEluc3RlYWQsIHJldHVybiBmYWxzZS4KLQotTW9uIE9jdCAyNSAwOTo1OTozNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAocmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIuCi0KLUZyaSBPY3QgMjIgMjA6MzU6NTQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBoYW5kbGUgbWlwcyotKiBpbnN0ZWFkIG9mIG1pcHMtKiwgdXNlIG1pcHMqZWwKLQkgIGluc3RlYWQgb2YgbWlwcy0qLSpsCi0KLUZyaSBPY3QgMjIgMTQ6MDM6MzMgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1seW54Lm10LCBpMzg2LWx5bngubXQgKFRERUZJTkVTKTogc2V0Ci0JRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVEIGJlY2F1c2UgdGhlIG9iamR1bXAuYyBkZWNsYXJhdGlvbiBvZgotCWZwcmludGYgY29sbGlkZXMgd2l0aCB0aGUgbmF0aXZlIG9uZS4KLQotRnJpIE9jdCAyMiAxMTo1MDoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEVuYWJsZSBNSVBTIEVMRiB2ZWN0b3JzLgotCi1GcmkgT2N0IDIyIDA3OjUxOjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgYmlnbWlwcyBmb3IgbWlwcy1zb255LWJzZCouCi0KLQkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWcuYmZkOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UaHUgT2N0IDIxIDEyOjE2OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKEZJTEVfQUxJR04pOiBSZW5hbWVkIGZyb20gRUFMSUdOLCB0byBhdm9pZCBjb25mbGljdAotCXdpdGggVWx0cml4IGhlYWRlciBmaWxlcy4KLQotCSogc29tLmggKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IFJlbmFtZWQgZnJvbQotCXNvbV9zZWN0aW9uX2RhdGEgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBtYWNybyBieSB0aGF0IG5hbWUuCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGVyIEhvb2dlbmJvb20gYXQgVXRhaDoKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvYyk6ICBUYXJnZXQgcmVnaXN0ZXIgZm9yIGEgJ2p1bXAKLQlpbiBkZWxheSBzbG90JyBvcHRpbWl6YXRpb24gaW4gY29tYmluYXRpb24gd2l0aCBhIGxvbmcgY2FsbAotCXN0dWIgc2hvdWxkIGFsd2F5cyBiZSByMzEuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jYXRlX2luc24pOiBUbyBiZSBjb25zaXN0ZW50Ci0JYWNyb3NzIGFsbCByZWxvY2F0aW9uIHR5cGVzLCByZXRyaWV2ZSBpbnN0cnVjdGlvbiBhZGRlbmRzIGZyb20KLQl0aGUgcmVsb2NhdGlvbiBlbnRyeSByYXRoZXIgdGhhbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jYXRlX2luc24pOiBGaXggYSByZWxvY2F0aW9uCi0JZXJyb3IgdGhhdCBvbmx5IG9jY3VycmVkIHdoZW4gdGhlIGFkZGVuZCBvZiBhbiAnYWRkaWwnIG9yCi0JJ2xkaWwnIHdhcyBsYXJnZXIgdGhhbiAyMSBiaXRzIGFuZCB2ZXJ5IGNsb3NlIHRvIGEgMksgYnl0ZQotCWJvdW5kYXJ5LgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvYyk6ICBIYW5kbGUgdGhlIG9wdGltaXphdGlvbiBpbgotCXdoaWNoIGEganVtcCBpcyBwbGFjZWQgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgYSBmdW5jdGlvbiBjYWxsLgotCVRoZSBqdW1wIHdhcyBiZWluZyBhY2NvbXBsaXNoZWQgdmlhIGFuIGFkanVzdG1lbnQgdG8gdGhlCi0JcmV0dXJuIHBvaW50ZXIuICBUaGlzIG9wdGltaXphdGlvbiB3b3VsZCBicmVhayB0aGUgbG9uZyBjYWxsCi0Jc3R1YiBjb2RlLCBpZiB0aGVyZSB3YXMgYW55LgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogQ29ycmVjdGlvbnMKLQl0byBsb25nIGJyYW5jaCBzdHVicyB0byBhdm9pZCB1c2Ugb2YgZ2VuZXJhbCByZWdpc3RlciAyLgotCi0JKiBocHBhX3N0dWJzLmg6IE5ldyBzdHViIGluc3RydWN0aW9ucy4KLQotCSogZWxmY29kZS5oOiBEZWNsYXJlIGJmZF9lbGZfZmluZF9zZWN0aW9uLgotCi0JKiBzb20uaCAoc29tX3NlY3Rpb25fZGF0YSk6IEFkZCBuZXcgInN1YnNwYWNlX2luZGV4IiBmaWVsZC4KLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogU2F2ZSB0aGUgb3JpZ2luYWwgU09NIHN1YnNwYWNlIGluZGV4Ci0JaW4gdGhlIEJGRCBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHN1YnNwYWNlLiAgCi0JKHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogSW1wbGVtZW50LgotCShzb21fZ2V0X3N5bXRhYik6IEltcGxlbWVudC4KLQkoc29tX3ByaW50X3N5bWJvbCk6IEltcGxlbWVudC4KLQkoc29tX3NsdXJwX3N0cmluZ190YWJsZSk6IE5ldyBmdW5jdGlvbiB0byByZWFkIGEgc3RyaW5nIHRhYmxlCi0JZnJvbSBhIFNPTSBvYmplY3QgZmlsZS4KLQkoc29tX3NlY3Rpb25fZnJvbV9zdWJzcGFjZV9pbmRleCk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gdGhlCi0Jc2VjdGlvbiB3aGljaCBjb3JyZXNwb25kcyB0byBhIFNPTSBzdWJzcGFjZSBpbmRleC4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IE5ldyBmdW5jdGlvbiB0byByZWFkIHRoZSBzeW1ib2wKLQl0YWJsZSBmcm9tIGEgU09NIG9iamVjdCBmaWxlLgotCShzb21fbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX3phbGxvYy4KLQkoc29tX25ld19zZWN0aW9uX2hvb2spOiBJbml0aWFsaXplIHN1YnNwYWNlX2luZGV4IGZpZWxkIHRvCi0JLTEgaW5zdGVhZCBvZiAwLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IEZpeCBwb2xhcml0eSBvZiB0ZXN0IHRvIHNldCBIQVNfUkVMT0MuCi0JU2V0IEVYRUNfUCBmb3IgZXhlY3V0YWJsZXMuCi0JKHNldHVwX3NlY3Rpb25zKTogQ29ycmVjdGx5IGlkZW50aWZ5IHdoZW4gYSBzZWN0aW9uIGhhcwotCXJlbG9jYXRpb25zLgotCShsb2cyKTogTmV3IGZ1bmN0aW9uLgotCShzZXR1cF9zZWN0aW9ucyk6IENvcnJlY3RseSBjb252ZXJ0IGJldHdlZW4gU09NIGFsaWdubWVudHMgYW5kIEJGRAotCWFsaWdubWVudHMuCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IERvIG5vdCBzZXQgU0VDX0FMTE9DIG9yIFNFQ19MT0FECi0JZm9yIHNlY3Rpb25zIHdoaWNoIGNvcnJlc3BvbmQgdG8gU09NIHNwYWNlcywgZG9pbmcgc28gY29uZnVzZXMKLQltYW55IHV0aWxpdGllcy4gIFNldCBhc3NvcnRlZCBTRUNfKiBmbGFncyBmb3IgU09NIHN1YnNwYWNlcwotCXdoaWNoIGNvcnJlc3BvbmQgdG8gQkZEIHNlY3Rpb25zLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IFRoZSBzdGFiCi0Jc3RyaW5nIHRhYmxlIHNob3VsZCBoYXZlIHNoX3R5cGUgPT0gU0hUX1NUUlRBQi4gIEFkZAotCXByb2Nlc3NpbmcgdG8gbWFrZSBpdCBzby4KLQotCSogZWxmY29kZS5oOiAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogU3RyaW5nIHRhYmxlcyAob3RoZXIKLQl0aGFuIC5zdHJ0YWIpIHdlcmUgbm90IGdldHRpbmcgdGhlIGZpbGUgb2Zmc2V0cyByZWNvcmRlZCwgc28KLQl0aGV5IGNvdWxkIG5vdCBiZSByZWFkIGZyb20gZGlzay4KLQotCSogZWxmY29kZS5oOiAoZWxmX21ha2Vfc2VjdGlvbnMpOiAgTGVhdmUgdGhlIHNoX2FkZHIgZmllbGQgb2YKLQl0aGUgc2VjdGlvbiBoZWFkZXIgYW5kIHRoZSB2bWEgZmllbGQgb2YgYSBzZWN0aW9uIGF0IDAgaWYgdGhlCi0Jc2VjdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgcHJvZ3JhbSBleGVjdXRpb24gaW1hZ2UuIChlLmcuLAotCS5zdGFiKQotCi0JKiBzb20uW2hjXTogQ2hhbmdlIHRhcmdldCB2ZWN0b3IgcHJlZml4IGZyb20gImhwcGEiIHRvICJzb20iLgotCUNvbnNpc3RlbnRseSB1c2Ugb2JqX3NvbSBwcmVmaXggdG8gYWNjZXNzIGZpZWxkcyBpbiBiYWNrZW5kIGRhdGEKLQlzdHJ1Y3R1cmVzLiAgRml4IGFsbCBjYWxsZXJzL3JlZmVyZW5jZXMuCi0KLQkqIHNvbS5oOiBEbyBub3QgaW5jbHVkZSBmaWxlcyBvbmx5IG5lZWRlZCBmb3IgY29yZSBmaWxlIHJlYWRpbmcgaGVyZS4KLQlJbmNsdWRlIGEub3V0IGZvciBib3RoIEhPU1RfSFBQQUhQVVggYW5kIEhPU1RfSFBQQUJTRC4gIERlbGV0ZQotCWZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9ucywgdGhleSBhcmUgdW5uZWNlc3NhcnkuCi0JKHN0cnVjdCBzb21kYXRhKTogRGVsZXRlIGF1eF9oZHIsIGFuZCBocF9zeW1ib2xfZW50cnlfc2l6ZSBmaWVsZHMuCi0JQ2hhbmdlICJzeW1ib2xzIiB0byAic3ltdGFiIi4gIEFkZCAic3RyaW5ndGFiIiBhbmQgInJlbG9jX2ZpbGVwb3MiCi0JZmllbGRzIGZvciBmdXR1cmUgdXNlLiAgQ2hhbmdlIG9ial9zb21fKiBtYWNyb3MgYXMgYXBwcm9wcmlhdGUuCi0JKHNvbV9zZWN0aW9uX2RhdGEpOiBOZXcgc3RydWN0dXJlIHRvIGtlZXAgU09NIHNwZWNpZmljIGluZm9ybWF0aW9uCi0JYWJvdXQgQkZEIHNlY3Rpb25zIChmb3IgZnV0dXJlIHVzZSkuCi0KLQkqIHNvbS5jOiBQcm92aWRlIFBBUkFNUyBkZWNsYXJhdGlvbnMgZm9yIGFsbCBmdW5jdGlvbnMgY3VycmVudGx5Ci0JaW4gdGhpcyBmaWxlLgotCShzdHJ1Y3QgY29udGFpbmVyKTogRGVsZXRlIHVud2FudGVkIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotCShzb21fb2JqZWN0X3NldHVwKTogQWRkIGNvbW1lbnRzLiAgVXNlIHNvbV9ta29iamVjdCB0byBhbGxvY2F0ZQotCVNPTSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpbiB0aGUgQkZEOyB1c2UgaW5mb3JtYXRpb24gZnJvbSB0aGUKLQlmaWxlIGFuZCAocG9zc2libHkgZW1wdHkpIGF1eGlsaWFyeSBoZWFkZXJzIHRvIGluaXRpYWxpemUgdGhpcwotCWluZm9ybWF0aW9uLiAgRGVsZXRlIHJlZHVuZGFudCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAiY2FsbHMiLgotCShzZXR1cF9zZWN0aW9ucyk6IFJldHVybiB0eXBlIGlzIG5vdyBib29sZWFuLCBmaXggcmV0dXJuIHN0YXRlbWVudHMuCi0JIkZpeCIgaGFuZGxpbmcgb2YgQlNTIGxpa2Ugc3Vic3BhY2VzIGluIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUKLQljb250YWluaW5nIHNwYWNlJ3Mgc2l6ZS4gIElmIHRoZSBzdWJzcGFjZSBoYXMgcmVsb2NhdGlvbnMsIHNldCB0aGUKLQlhcHByb3ByaWF0ZSBCRkQgc2VjdGlvbiBmbGFncyBhbmQgcmVjb3JkIHRoZSBpbmRleCBpbnRvIGFuZCB0aGUKLQlzaXplIG9mIHRoZSBmaXh1cCBzdHJlYW0uICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKHNvbV9vYmplY3RfcCk6IFNldCBiZmRfZXJyb3IgYXBwcm9wcmlhdGVseSBpZiBlcnJvcnMgYXJlIGRldGVjdGVkCi0JZnJvbSBiZmRfe3JlYWQsc2Vla30gZnVuY3Rpb25zLiAgSGFuZGxlIEVYRUNMSUJNQUdJQyB0eXBlIGZpbGVzLgotCURvIG5vdCB0cnkgdG8gcmVhZCBhIG5vbi1leGlzdGFudCBhdXhpbGlhcnkgaGVhZGVyLgotCShzb21fbWtvYmplY3QpOiBGbGVzaCBvdXQuCi0JKHNvbV9zZWN0aW9uX2hvb2spOiBBbGxvY2F0ZSBzcGFjZSB0byBob2xkIFNPTSBzcGVjaWZpYyBpbmZvcm1hdGlvbgotCWFib3V0IHNlY3Rpb25zLgotCi1UaHUgT2N0IDIxIDEyOjQxOjM0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBjb2ZmLWg4MzAwLmMsIGNvZmZjb2RlLmg6IENoYW5nZSBzaHJpbmsgcGFyYW1ldGVyCi0JaW4gKl9yZWxvYzE2X2VzdGltYXRlIHRvIHVuc2lnbmVkIHRvIG1hdGNoIHByb3RvdHlwZS4KLQkqIGFyY2hpdmUuYzogQXZvaWQgIi8qIiBpbiBjb21tZW50LgotCi1UaHUgT2N0IDIxIDEzOjA1OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZGVwLWluLnNlZDogQ3JlYXRlIG91ciBvd24gbGluZSBicmVha3MgZm9yIGEgbW9yZSBhZXN0aGV0aWMKLQlNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWxmMzItbWlwcy5jOiBJbmNsdWRlICJzZWNsZXQuaCIuCi0JKG1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBGb3JjZSBzaXplIG9mIC5yZWdpbmZvIHNlY3Rpb24gdG8gc2l6ZW9mCi0JRWxmMzJfRXh0ZXJuYWxfUmVnSW5mby4KLQkobWlwc19lbGZfc2VjbGV0X2xpbmspOiBOZXcgZnVuY3Rpb24uICBMaW5rIHRoZSAucmVnaW5mbyBzZWN0aW9uCi0Jc3BlY2lhbGx5LCBhbmQgcGFzcyBldmVyeXRoaW5nIGVsc2UgdG8gdGhlIGdlbmVyaWMgcm91dGluZS4KLQkoYmZkX2VsZjMyX2JmZF9zZWNsZXRfbGluayk6IERlZmluZSBtYWNyby4KLQkqIGVsZjMyLXRhcmdldC5oOiBJZiBiZmRfZWxmMzJfYmZkX3NlY2xldF9saW5rIGlzIGFscmVhZHkgZGVmaW5lZCwKLQlkb24ndCBvdmVycmlkZSBpdC4KLQotV2VkIE9jdCAyMCAxMjoyMjozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYm5sbS5oIChubG1fYmFja2VuZF9kYXRhKTogQWRkZWQgc2lnbmF0dXJlIGZpZWxkLgotCShubG1fc2lnbmF0dXJlKTogTmV3IG1hY3JvLgotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3AsIG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgdGhlIE5MTQotCXNpZ25hdHVyZSBmcm9tIHRoZSBiYWNrZW5kIHJhdGhlciB0aGFuIHRoZSBjb25zdGFudCBOTE1fU0lHTkFUVVJFLgotCSogbmxtMzItaTM4Ni5jIChubG0zMl9pMzg2X2JhY2tlbmQpOiBJbml0aWFsaXplIHNpZ25hdHVyZSBmaWVsZC4KLQotCSogYW91dGYxLmggKE1BQ0hUWVBFX09LKTogQWNjZXB0IE1fVU5LTk9XTi4KLQkoTkFNRShzdW5vcyxzZXRfYXJjaF9tYWNoKSk6IFRyZWF0IE1fVU5LTk9XTiBhcyA2ODAwMCwgbm90IDY4MDIwLgotCi1XZWQgT2N0IDIwIDEwOjI4OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2YnNkLmggW19fYnNkaV9fXTogRGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSLgotCi1XZWQgT2N0IDIwIDEwOjEwOjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogTmV3IHZhcmlhYmxlLCBmb3IgdXNlIGluICJtYWtlIGRlcCIuCi0JKC5kZXApOiBEZXBlbmQgb24gJChDRklMRVMpIGFuZCAkKEhGSUxFUykuICBEZWxldGUgLmRlcDEgYW5kCi0JcmVtYWtlIGl0LCBzbyB0aGF0ICIkPyIgaXMgY29tcGxldGUuCi0JKC5kZXAxKTogRG9uJ3QgbmVlZCB0byByZW1vdmUgLmRlcDEgZmlyc3QuCi0JKGRlcC5zZWQpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cywgbm90IE1ha2VmaWxlLgotCShDRklMRVMpOiBBZGQgbmxtLmMuCi0KLVR1ZSBPY3QgMTkgMTU6MjY6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmM6IEltcGxlbWVudGVkIHJlbG9jIGhhbmRsaW5nIGZvciB0aGUgbGlua2VyLCBtYWRlCi0JdmFyaW91cyBvdGhlciByZWxhdGVkIGNoYW5nZXMuCi0JKiBsaWJlY29mZi5oIChlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCByZGF0YV9pbl90ZXh0IGZpZWxkLgotCVJlbmFtZWQgZmluaXNoX3JlbG9jIHRvIGFkanVzdF9yZWxvY19pbi4gIEFkZGVkIGFkanVzdF9yZWxvY19vdXQKLQlmaWVsZC4KLQkoZWNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IGRlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzLCBlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6Ci0JSGFuZGxlIC5saXRhIHNlY3Rpb24uCi0JKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogSGFuZGxlIFJFTE9DX1NFQ1RJT05fRklOSS4KLQlmaW5pc2hfcmVsb2MgYmFja2VuZCBmaWVsZCByZW5hbWVkIHRvIGFkanVzdF9yZWxvY19pbi4KLQkoZWNvZmZfYmZkX3NlY2xldF9saW5rKTogQWRqdXN0IG51bWJlciBvZiBhdXggZW50cmllcyB0bwotCWRlYnVnX2FsaWduIGJvdW5kYXJ5LgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiByZGF0YV9pbl90ZXh0IHB1dAotCS5yZGF0YSBzZWN0aW9uIGluIHRleHQgc2VnbWVudCwgbm90IGRhdGEgc2VnbWVudC4gIFB1dCAucGRhdGEKLQlzZWN0aW9uIGluIHRleHQgc2VnbWVudC4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBBbHNvLCBjYWxsCi0JYWRqdXN0X3JlbG9jX291dCwgYW5kIGhhbmRsZSAubGl0YSwgLnhkYXRhLCAucGRhdGEsIC5maW5pIGFuZAotCWFic29sdXRlIHNlY3Rpb25zIHdoZW4gd3JpdGluZyBvdXQgcmVsb2NzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRm9yIEFMUEhBRUNPRkYsIG91dHB1dCAyIGZvcgotCWJsZHJldiBmaWVsZCwgYXMgb24gQWxwaGEgT1NGLzEuICBQYWRkaW5nIGZpZWxkIGlzIG5vdyAyIGJ5dGVzLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQpOiBBZGRlZCBhc3NlcnRpb24uCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogUmVuYW1lZCBmcm9tIG1pcHNfZmluaXNoX3JlbG9jLgotCShtaXBzX2FkanVzdF9yZWxvY19vdXQpOiBOZXcgZnVuY3Rpb24gKGRvZXMgbm90aGluZykuCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShlY29mZl9iZmRfZ2V0X3JlbG9jYXRpb25fc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSB0byBiZQotCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZGVkIGNhc3RzIHRvIGF2b2lkIEFscGhhCi0JT1NGLzEgY2MgYnVnLgotCi1UaHUgT2N0IDE0IDAxOjEwOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBjb21tZW50cyBhdHRlbXB0aW5nIHRvCi0JZXhwbGFpbiBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBEb24ndCBzZXQgU0VDX0RFQlVHR0lORyB1bnRpbCBpdAotCWlzIG1hZGUgdG8gd29yay4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBSZW1vdmUgY2hlY2sgZm9yCi0JVVNFX0RJU0NBUkRFRF9TRUNUSU9OU19DT1VOVC4KLQkqIGNvZmYtaTM4Ni5jOiBEb24ndCBkZWZpbmUgVVNFX0RJU0NBUkRFRF9TRUNUSU9OU19DT1VOVC4gIEJhc2luZwotCWl0IG9uIGhvc3QgZGVmaW5lcyBpcyB3cm9uZy4KLQotCSogZWNvZmYuYyAoZWNvZmZfYmZkX3NlY2xldF9saW5rKTogRG9uJ3QgbGluayBhIC5yZWdpbmZvIHNlY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHJlcXVpcmUgdGhlIC5yZWdpbmZvIHNlY3Rpb24KLQl0byBiZSBhIHBhcnRpY3VsYXIgc2l6ZS4KLQotV2VkIE9jdCAxMyAxODozOTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkZXAtaW4pOiBOZXcgcnVsZSwgZm9yIGVkaXRpbmcgZGVwZW5kZW5jaWVzIGludG8KLQlNYWtlZmlsZS5pbiBpbiAkKHNyY2RpcikuICBVc2UgbW92ZS1pZi1jaGFuZ2UuCi0JKC5kZXAxLCBkZXApOiBVc2UgbW92ZS1pZi1jaGFuZ2UuCi0JKENGSUxFUyk6IEFkZCBjb2ZmLWFwb2xsby5jLgotCi0JU3VuIE9jdCAxMCAxODowMjo1NiAxOTkzICBUcm95IFJvbGxvICh0cm95QGNibWUudW5zdy5FRFUuQVUpCi0KLQkqIE1ha2VmaWxlLmluOiBSZWNvZ25pc2UgbmV3IGZpbGUsIGNvZmYtYXBvbGxvLm8KLQotCSogY29mZi1hcG9sbG8uYzogTmV3IGZpbGUKLQotCSogY29mZmNvZGUuaDogUmVjb2duaXNlIGFwb2xsbyBtYWdpYyBudW1iZXJzIGFuZCB3cml0YWJsZSB0ZXh0Ci0KLQkqIGNvZmZzd2FwLmg6IFN3YXAgQXBvbGxvIG9wdGlvbmFsIGhlYWRlciBlbnRyaWVzCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBsaW5lIGZvciBBcG9sbG8KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlcGxhY2UgYXBvbGxvNjhiIGFuZCBhcG9sbG82OHYgd2l0aCBBcG9sbG8KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pc2UgYXBvbGxvY29mZl92ZWMKLQotCSogdGFyZ2V0cy5jOiBMaWtld2lzZQotCi0JKiBjb25maWcvYXBvbGxvLm1oLCBjb25maWcvYXBvbGxvLm10OiBOZXcgZmlsZXMKLQotCSogaG9zdHMvYXBvbGxvNjguaDogUmVtb3ZlIGluY2x1c2lvbiBvZiBzdHJpbmdzLmgKLQotV2VkIE9jdCAxMyAxNDoyODoxNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBOb3cgc3RhdGljLgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCBkZXBlbmRlbmNpZXMuCi0JKC5kZXAsIC5kZXAxLCBkZXAuc2VkKTogTmV3IHRhcmdldHMsIHRvIG1ha2UgIm1ha2UgZGVwIiB3b3JrCi0JYmV0dGVyLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUuCi0KLQkqIG02OGtseW54LWNmLmMgKE9OTFlfREVDTEFSRV9SRUxPQ1MpOiBEZWZpbmUsIHRvIGF2b2lkIG5hbWUKLQljb25mbGljdHMgd2hlbiAiLS13aXRoLXRhcmdldHM9YWxsIi4KLQkqIGNvZmYtbTY4ay5jIChtNjhrY29mZl9ob3d0b190YWJsZSwgbTY4a19ydHlwZTJob3d0bywKLQltNjhrX2hvd3RvMnJ0eXBlKTogUmVuYW1lIHZpYSBtYWNyb3MgdG8ga2VlcCBuYW1lc3BhY2UgY2xlYW4uCi0JKiBjb25maWd1cmUuaW46IEZvciBtNjhrbHlueF9jb2ZmX3ZlYywgaW5jbHVkZSBjb2ZmLW02OGsubyBmb3IKLQlub3cuCi0KLVR1ZSBPY3QgMTIgMTc6MDM6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmM6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gZG8gcmVsb2NhdGlvbnMgYW5kIHRvCi0JaGFuZGxlIE1JUFMgc3BlY2lmaWMgc2VjdGlvbnMuCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IFBhc3MgZm91cnRoIGFyZ3VtZW50IHRvCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIHRvIHBlcm1pdCBpdCB0byBjb250cm9sIHRoZQotCXNlY3Rpb24gaW5kZXggdG8gdXNlLgotCShlbGZfb2JqX3RkYXRhKTogQWRkIGdwIGFuZCBncF9zaXplIGZpZWxkcy4KLQkoZWxmX2dwLCBlbGZfZ3Bfc2l6ZSk6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCi0JKiBlbGZjb2RlLmg6IFJlbW92ZWQgYSBudW1iZXIgb2YgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDbGVhciBzZWN0aW9uIGhlYWRlciBiZWZvcmUgY2FsbGluZwotCWVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMsIG5vdCBhZnRlci4KLQkocHJlcF9oZWFkZXJzKTogUmV0dXJuIHRydWUgYXQgZW5kLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogUGFzcyByZXR2YWwgYXJndW1lbnQgdG8KLQllbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOgotCUFjY2VwdCBhbmQgaWdub3JlIG5ldyByZXR2YWwgYXJndW1lbnQuCi0JKiBiZmQuYzogSW5jbHVkZSBsaWJlbGYuaC4KLQkoYmZkX3NldF9ncF9zaXplKTogSGFuZGxlIEVMRiB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW4gKGJmZC5vKTogRGVwZW5kcyB1cG9uIGxpYmVsZi5oLgotCShlbGYzMi1taXBzLm8pOiBEZXBlbmRzIHVwb24gJChJTkNESVIpL2VsZi9taXBzLmguCi0KLU1vbiBPY3QgMTEgMTc6MjU6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdCk6IENoZWNrIGJmZF9tYWtlX3NlY3Rpb24gcmV0dXJuIHZhbHVlLgotCShlY29mZl9ta29iamVjdF9ob29rKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9uZXdfc2VjdGlvbl9ob29rLCBlY29mZl9zaXplb2ZfaGVhZGVycywKLQllY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsIGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzLAotCWVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBkdW1teSBSRUdJTkZPIHNlY3Rpb24uCi0JKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSByZWFkaW5nCi0JUkVHSU5GTyBzZWN0aW9uLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgZnJvbSBtYWNybwotCWRlZmluaXRpb24gdG8gZnVuY3Rpb24gcHJvdG90eXBlLgotCShlY29mZl9ta29iamVjdF9ob29rKTogTmV3IHByb3RvdHlwZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayk6IFJlbW92ZWQuCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFVzZSBlY29mZl9ta29iamVjdF9ob29rLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfbWtvYmplY3RfaG9vayk6IFJlbW92ZWQuCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogVXNlIGVjb2ZmX21rb2JqZWN0X2hvb2suCi0KLUZyaSBPY3QgIDggMTU6MjU6MzMgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBsaWJiZmQuYyAoYmZkX2dldCozMiwgYmZkX2dldCo2NCk6ICBQcmV2ZW50IEFOU0kgc2lnbiBleHRlbnNpb24KLQlieSBjYXN0aW5nIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgdG8gYmZkX3ZtYS4KLQotRnJpIE9jdCAgOCAwMjozNDoyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogIERvIG5vdCBkZWZpbmUgU0VMRUNUX1ZFQ1MsIFNFTEVDVF9BUkNISVRFQ1RVUkVTCi0JaWYgY29uZmlndXJpbmcgLS13aXRoLXRhcmdldHM9YWxsLgotCi1UaHUgT2N0ICA3IDE3OjM0OjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkKTogQ29ycmVjdCB0aGUgInNpemUiIGZpZWxkIGluIHNvbWUKLQllbnRyaWVzLgotCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogQ2hhbmdlIGRvY3VtZW50YXRpb24gdG8gZGlzcGVsIGFueQotCW5vdGlvbiB0aGF0IHRoZSAic2l6ZSIgZmllbGQgaXMgYSBwb3dlci1vZi10d28gaW5kaWNhdG9yLgotCi1UaHUgT2N0ICA3IDEwOjUwOjM4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLSAgICAgICAqIGNvZmZzd2FwLmg6IChiZmRfc3dhcF9yZWxvY19pbik6IGEgc3ltbmR4IGlzIHNpZ25lZC4KLQotCU1ha2Ugc3VwcG9ydCBmb3IgcmVsYXhpbmcgbW9yZSBnZW5lcmljLgotCSogcmVsb2MxNi5jOiBBZGQgbmV3IHRhcmdldCBlbnRyeSAtIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUsCi0JZml4IGJpdCByb3QuCi0JKiBsaWJjb2ZmLmgsIGxpYmNvZmYtaW4uaDogZGVjbGFyYXRpb25zLiBQcm90b3R5cGVzCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEFkZCBjYWxscyB0bwotCWNvZmZfcmVsb2NfMTZfZXh0cmFfY2FzZXMgYW5kIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZS4KLQkoZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IE5ldyBmdW5jdGlvbgotCi1UaHUgT2N0ICA3IDE0OjI0OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChFQUxJR04pOiBEZWZpbmUsIGRlcGVuZGVudCBvbiBBUkNIX1NJWkUuCi0JKGFsaWduX2ZpbGVfcG9zaXRpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9sb2NhdGVfc2gpOiBEaXNhYmxlZCBmdW5jdGlvbiBkZWxldGVkLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3N5bXRhYl9hbmRfc3RydGFicyk6IEFsaWduIHBvc2l0aW9uLAotCXRoZW4gcGxhY2Ugc3ltdGFiLCB0aGVuIGRvIG90aGVyIHNlY3Rpb25zLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IEFsaWduIHByb2dyYW0gaGVhZGVyLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFsaWduIHNlY3Rpb24gaGVhZGVycy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBBbGlnbiByZWxvY2F0aW9uIHNlY3Rpb25zLgotCi1UdWUgT2N0ICA1IDEwOjQ0OjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIGhwcGEqLSotaGl1eCogKGN1cnJlbnRseSBzeW5vbnltIGZvciBocHV4KS4KLQlDaGFuZ2Ugb3RoZXIgaHBwYSBlbnRyaWVzIHRvIHVzZSAtKi0gbm90IC1ocC0uCi0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgaHBwYSotKi1oaXV4KiAoY3VycmVudGx5IHN5bm9ueW0gZm9yIGhwdXgpLgotCi0JKiBjb2ZmLXJzNjAwMC5jLCBjcHUtcnM2MDAwLmMsIHJzNjAwMC1jb3JlLmM6IENoYW5nZSBub24tQVNDSUkKLQljaGFyYWN0ZXJzIGluIGNvbW1lbnQgdG8gb2N0YWwgZXNjYXBlcy4KLQotU3VuIE9jdCAgMyAxMjozNToxNSAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTM4Nmx5bnguYzogUmVtb3ZlZCwgbmFtZSB0b28gbG9uZy4KLQkqIGkzODZseW54LWNmLmM6IE5ldyBmaWxlLCB3YXMgY29mZi1pMzg2bHlueC5jLgotCSogY29uZmlndXJlLmluOiBSZWZsZWN0IGZpbGUgbmFtZSBjaGFuZ2VzLgotCSogTWFrZWZpbGUuaW46IE1lbnRpb24gTHlueC1yZWxhdGVkIGZpbGVzLgotCi0JKiBpMzg2bHlueC5jIChseW54XzMyX3N3YXBfZXh0X3JlbG9jX2luKTogZ2V0IHJlbG9jIGJpdHMgaW4gaTM4NgotCUx5bngtc3BlY2lmaWMgd2F5LgotCi0JKiBtNjhrbHlueC1jZi5jOiBOZXcgZmlsZSwgZGVmaW5lcyBjb2ZmIGZvcm1hdCBmb3IgTTY4SyBMeW54T1MuCi0JKiBtNjhrbHlueC5jOiBSZW1vdmUgY29mZiB2ZWN0b3IgZGVmaW5pdGlvbiwgbm93IGluIG02OGtseW54LWNmLmMuCi0KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogU2V0IHNlY3Rpb24gZmxhZyB0byBTVFlQX0lORk8KLQlmb3IgLnN0YWIsIC5zdGFic3RyIGFuZCAuZGVidWcgc2VjdGlvbnMsIGFuZCBzZXQgU0VDX0RFQlVHR0lORyBmb3IKLQlzZWN0aW9ucyBvZiB0eXBlIFNUWVBfSU5GTy4gIChmcm9tIE1pbmggVHJhbi1MZSkKLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGQgZGlzY2FyZGVkX3NlY3Rpb25zX2NvdW50Ci0JdG8gYWJmZC0+c2VjdGlvbl9jb3VudCwgd2hpY2ggaGVscHMgYHN0cmlwJyBrZWVwIHRoZSBzaXplCi0Jb2YgdGhlIGV4ZWN1dGFibGUgaGVhZGVyIGNvbnN0YW50LgotCSogY29mZi1pMzg2LmMgKGRpc2NhcmRlZF9zZWN0aW9uc19jb3VudCk6IE5ldyB2YXJpYWJsZSwgaW5pdGlhbGl6ZWQKLQl0byB6ZXJvLiAgRm9yIHVzZSBieSBgc3RyaXAnLiAgQ3VycmVudGx5IGJlaW5nIHVzZWQgb25seSBpbiBhaXgzODYKLQljb2ZmLCBidXQgbWF5IGJlIHVzZWZ1bCBmb3Igb3RoZXIgY29mZiBzeXN0ZW1zLiAgKGZyb20gTWluaCBUcmFuLUxlKQotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBBZGRlZCBhIG1pc3NpbmcgY2FzdC4KLQotCSogYXJjaGl2ZS5jOiBDb3NtZXRpYyBpbXByb3ZlbWVudHMuCi0JKiBvcG5jbHMuYzogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgotCShuZXdfYmZkKTogUmVtb3ZlZCByZWR1bmRhbnQgc3RydWN0dXJlIHNsb3QgaW5pdC4KLQotU2F0IE9jdCAgMiAxODo0ODoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL25ld3MtbWlwcy5taCwgaG9zdHMvbmV3cy1taXBzLmg6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgbmV3cy1taXBzIGZvciBtaXBzLXNvbnktYnNkKi4KLQotRnJpIE9jdCAgMSAxMzoxNDoxNyAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaTM4Nmx5bnhfY29mZl92ZWMgcmVxdWlyZXMgY29mZi1pMzg2bHlueC5vLgotCSogY29mZi1pMzg2bHlueC5jOiBOZXcgZmlsZSwgZGVmaW5lcyBMeW54IHRhcmdldCB2ZWN0b3IgYW5kIG5hbWUsCi0JaW5jbHVkZXMgY29mZi1pMzg2LmMuCi0JKiBjb2ZmLWkzODYuYyAoaTM4NmNvZmZfdmVjKTogQWxsb3cgcmVkZWZpbml0aW9uIG9mIHRhcmdldCB2ZWN0b3IKLQlzeW1ib2wgYW5kIG5hbWUsIGlmIFRBUkdFVF9TWU0gYW5kL29yIFRBUkdFVF9OQU1FIGFyZSBkZWZpbmVkLgotCSogaTM4Nmx5bnguYzogUmVtb3ZlIGNvZmYgdmVjdG9yIGRlZmluaXRpb24gZW50aXJlbHkuCi0JKGx5bnhfMzJfc3dhcF9leHRfcmVsb2NfaW4pOiBEZWZpbmUuCi0JKGx5bnhfMzJfc3dhcF9zdGRfcmVsb2NfaW4pOiBEZWZpbmUsIGdldCByZWxvYyBiaXRzIGluIGkzODYKLQlMeW54LXNwZWNpZmljIHdheS4KLQkobHlueF8zMl9zd2FwX2V4dF9yZWxvY19vdXQpOiBEZWZpbmUuCi0JKGx5bnhfMzJfc3dhcF9zdGRfcmVsb2Nfb3V0KTogRGVmaW5lLgotCShseW54XzMyX3NsdXJwX3JlbG9jX3RhYmxlKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgotCShseW54XzMyX3NxdWlydF9vdXRfcmVsb2NzKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgotCShseW54XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQkoV1JJVEVfSEVBREVSUyk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQotCSogY29uZmlnL2kzODYtbHlueC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmUgcmVkdW5kYW50IHZlY3Rvci4KLQotVGh1IFNlcCAzMCAxNzo1MDo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBBZGQgbGlua2FnZS10YWJsZSByZWxhdGl2ZQotCXJlbG9jYXRpb25zIG9mIHNpemUgOCwgMTYsIDMyLiAgU29ydCBnZW5lcmljIHJlbG9jcyBieSB0eXBlIHJhdGhlcgotCXRoYW4gc2l6ZS4gIEFkZGVkIGEgbGl0dGxlIGRvY3VtZW50YXRpb24gdG9vLgotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQpOiBBZGQgQkFTRTE2IGFuZCBCQVNFMzIgcmVsb2NzLgotCShUQUJMRV9TSVpFKTogTmV3IG1hY3JvLgotCShyZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfezE2LDMyfV9CQVNFUkVMIGZvciBzdGQKLQlyZWxvY3MuCi0JKHN3YXBfc3RkX3JlbG9jX291dCk6IFdyaXRlIGJhc2VyZWwgcmVsb2NzIGNvcnJlY3RseS4KLQkoc3dhcF9zdGRfcmVsb2NfaW4pOiBIYW5kbGUgcl9iYXNlcmVsIGZpZWxkLiAgQXNzZXJ0IHRoYXQKLQlyX2ptcHRhYmxlIGFuZCByX3JlbGF0aXZlIGZpZWxkcyBhcmUgY2xlYXIsIGFuZCB0aGF0IHRoZSBjb21wdXRlZAotCWluZGV4IGRvZXMgcmVmZXIgdG8gYSBkZWZpbmVkIGVudHJ5IG9mIHRoZSBob3d0byB0YWJsZS4KLQotVHVlIFNlcCAyOCAxNDo0Nzo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IE5ldyBmdW5jdGlvbi4KLQkqIHNlY3Rpb24uYzogQ2hhbmdlIGNvbW1lbnRzIHRvIHNheSBzZXZlcmFsIHNlY3Rpb25zIGNhbiBoYXZlCi0JdGhlIHNhbWUgbmFtZS4KLQkqIGJmZC1pbjIuaDogUmUtZ2VuZXJhdGUgdG8gcmVmbGVjdCBhYm92ZSBjaGFuZ2UuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IENhbGwgYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQlpZiBzdGlsbCBubyBzZWN0aW9uIGFmdGVyIHRoZSBiZmRfY29mZl9tYWtlX3NlY3Rpb25faG9vay4KLQkqIGNvZmZjb2RlLmg6IEFkZCBjb21tZW50IGFib3V0IFRXT19EQVRBX1NFQ1MuCi0KLVR1ZSBTZXAgMjggMDM6MjI6MjQgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogIEFsd2F5cyBkZXRlcm1pbmUgcmF3X3NpemUKLQlleHBsaWNpdGx5LgotCSogZWNvZmYuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MsIGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogIEhhbmRsZQotCS5maW5pIHNlY3Rpb24uCi0KLU1vbiBTZXAgMjcgMTg6Mjk6MTggMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIGNvbmZpZ3VyZS5ob3N0OiBNYXRjaCBvbiAqLWx5bnhvcyogZm9yIEx5bnhPUywKLQlhZGQgbTY4Ki0qLWx5bnhvcyouCi0JKiBjb25maWd1cmUuaW4gOiBSZXBsYWNlZCBpMzg2bHlueF92ZWMgd2l0aCBpMzg2bHlueF9hb3V0X3ZlYwotCWFuZCBpMzg2bHlueF9jb2ZmX3ZlYy4KLQlBZGRlZCBtNjhrbHlueF9hb3V0X3ZlYyBhbmQgbTY4a2x5bnhfY29mZl92ZWMuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZW1vdmVkIGkzODZseW54X3ZlYywgYWRkZWQKLQl7aTM4NixtNjhrfWx5bnhfe2FvdXQsY29mZn1fdmVjLgotCSogaTM4Nmx5bnguYzogQWRkZWQgY29weSBvZiBpMzg2Y29mZi5jLCByZW5hbWVkIGJmZCB0YXJnZXQgdG8KLQlpMzg2bHlueF9jb2ZmX3ZlYy4KLQkqIG02OGtseW54LmM6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYtbHlueC5tdDogUmVwbGFjZWQgaTM4Nmx5bnhfdmVjIHdpdGggaTM4Nmx5bnhfYW91dF92ZWMKLQlhbmQgaTM4Nmx5bnhfY29mZl92ZWMuCi0JKiBjb25maWcvbTY4ay1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGhvc3RzL2kzODZseW54Lmg6IEFkZGVkIGRlZmluaXRpb24gb2YgY2ZyZWUgYXMgZnJlZSAoZnJvbSBFaWNoaW4pLgotCSogaG9zdHMvbTY4a2x5bnguaDogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMjcgMTg6MDA6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYzogRGVmaW5lIG9mZnNldG9mIGhlcmUuCi0JKiBob3N0cy8qLmg6IERvbid0IGRlZmluZSBpdCBoZXJlLgotCi1Nb24gU2VwIDI3IDE5OjA5OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBTZXQgZmlsZXBvcyBmb3IgU0hUX1NUUlRBQgotCXNlY3Rpb24uCi0KLUZyaSBTZXAgMjQgMTU6NDc6NDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhwdXgtY29yZS5jOiBBZGQgY29tbWVudCBhYm91dCBocHV4IHZlcnNpb24gNy4KLQotRnJpIFNlcCAyNCAxNjo1MDoyNiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBseW54LWNvcmUuYyAobHlueF9jb3JlX2ZpbGVfcCk6ICBDaGFuZ2UgcGVyLXRocmVhZCByZWdpc3RlcgotCXNlY3Rpb24gbmFtZXMgZnJvbSAucmVnWFhYIHRvIC5yZWcvWFhYIHRvIGF2b2lkIHBhcnNpbmcgYW1iaWd1aXR5Ci0JaW4gZ2RiL2NvcmVsb3cuYy4gIENyZWF0ZSBhbGlhcyAucmVnIHNlY3Rpb24gZm9yIHRoZSBjdXJyZW50bHkKLQlydW5uaW5nIHRocmVhZC4KLQotRnJpIFNlcCAyNCAxMzoyMjozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgYmlnX21hZ2ljIGFuZAotCWxpdHRsZV9tYWdpYyBmaWVsZHMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgaW5pdGlhbGl6YXRpb24KLQlvZiBiaWdfbWFnaWMgYW5kIGxpdHRsZV9tYWdpYy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayk6IE1ha2Ugc3VyZSBtYWdpYyBudW1iZXIKLQltYXRjaGVzIGVuZGlhbmVzcyBvZiBiZmQuCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBpbml0aWFsaXphdGlvbiBvZiBiaWdfbWFnaWMgYW5kCi0JbGl0dGxlX21hZ2ljLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogU2V0IE1JUFMgbWFjaGluZSBudW1iZXIKLQliYXNlZCBvbiBtYWdpYyBudW1iZXIuICBTdXBwb3J0IHI0MDAwIG1hZ2ljIG51bWJlcnMuCi0JKGVjb2ZmX2dldF9tYWdpYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIGVjb2ZmX2dldF9tYWdpYywgbm90IGZpZWxkcyBpbgotCXRoZSBiYWNrZW5kIHN0cnVjdHVyZS4KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGRlZCBjYXNlIGZvciByNjAwMC4KLQotCUZvciBNSVBTIGNvbmZpZ3VyYXRpb25zIHB1dCBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiB2ZXJzaW9ucyBpbgotCXRoZSBsaXN0IG9mIHRhcmdldHM7IHRoZSBjb2RlIGlzIGdldHRpbmcgY29tcGlsZWQgaW4gYW55aG93LgotCSogYmlnbWlwcy5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgZWNvZmZfbGl0dGxlX3ZlYy4KLQkqIGRlY3N0YXRpb24ubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGVjb2ZmX2JpZ192ZWMuCi0JKiBtaXBzYmVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjLgotCSogbWlwc2xlbGYubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGJmZF9lbGYzMl9iaXRtaXBzX3ZlYy4KLQkqIHJpc2Nvcy5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgZWNvZmZfbGl0dGxlX3ZlYy4KLQotRnJpIFNlcCAyNCAwMDo0MjoyMyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG9zZi1jb3JlLmM6ICBOZXcgZmlsZSBmb3IgT1NGLzEgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBjb25maWcvYWxwaGFvc2YubWggKEhERUZJTkVTKTogIEFkZCAtRE9TRl9DT1JFLgotCShIREVQRklMRVMpOiAgU2V0IHRvIG9zZi1jb3JlLm8uCi0JKiBiZmQtaW4yLmggKHVuaW9uIHRkYXRhKTogIEFkZCBvc2ZfY29yZV9kYXRhIG1lbWJlci4KLQkqIHRhcmdldHMuYzogIElmIE9TRl9DT1JFIGlzIGRlZmluZWQsIGFkZCBvc2ZfY29yZV92ZWMgdG8gdGFyZ2V0IGxpc3QuCi0JKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiAgQWRkIG9zZi1jb3JlLm8uCi0JKG9zZi1jb3JlLm8pOiAgTmV3IGRlcGVuZGVuY3kuCi0KLVRodSBTZXAgMjMgMjE6MDQ6NTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIFRPRE86IFJlbW92ZSBub3RlIGFib3V0IG1ha2luZyAtLXdpdGgtYmZkLXRhcmdldHMgdXNlIGNhbm9uaWNhbAotCXRhcmdldCBjb25maWd1cmF0aW9uIG5hbWUgKGFscmVhZHkgZG9uZSk7IHJld29yZCBpdGVtIGFib3V0Ci0Jc2VwYXJhdGluZyByZWFkaW5nIGFuZCB3cml0aW5nIHN0dWZmIHRvIG5vdCByZWZlciB0byBhCi0Jbm9uLWV4aXN0ZW50IGl0ZW0uCi0KLQkqIGVjb2ZmLmggKGVjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFjY2VwdCBNSVBTX01BR0lDX0xJVFRMRTIKLQlhbmQgTUlQU19NQUdJQ19CSUcyLgotCi1UaHUgU2VwIDIzIDExOjA2OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZ2VuLWFvdXQuYyAobWFpbik6IE91dHB1dCBuZXdsaW5lIGFmdGVyIGVuZCBvZiBjb21tZW50LCBub3QKLQliZWZvcmUuICAoUmVwb3J0ZWQgYnkgSm9uYXRoYW4gU3RvbmUsCi0Jam9uYXRoYW5Ab3NjYXIuc3RhbmZvcmQuZWR1KS4KLQotVGh1IFNlcCAyMyAxMDo0ODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBQdXQgd2VhayBzeW1ib2xzIGluIHRoZQotCWFybWFwLgotCi0JKiBlbGZjb2RlLmggKGZpeF91cF9zdHJ0YWJzKTogU2V0IHNoX2VudHNpemUgZm9yIHRoZSAuc3RhYgotCXNlY3Rpb24sIG5vdCB0aGUgLnN0YWJzdHIgc2VjdGlvbi4gIFNldCB0aGUgdHlwZSBvZiB0aGUgLnN0YWJzdHIKLQlzZWN0aW9uIHRvIFNIVF9TVFJUQUIuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBIYW5kbGUgU0hUX1NUUlRBQiBzZWN0aW9ucy4KLQotCSogc2VjdGlvbi5jIChTRUNfREVCVUdHSU5HKTogTmV3IHNlY3Rpb24gZmxhZy4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSWYgc2VjdGlvbiBpcyBTSFRfUFJPR0JJVFMsCi0JYW5kIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIC5kZWJ1ZywgLmxpbmUgb3IgLnN0YWIsIHNldAotCVNFQ19ERUJVR0dJTkcuICBJZiBTSFRfU1RSVEFCLCBjaGVjayBmb3IgLmRlYnVnIGFuZCAuc3RhYi4KLQkqIGVsZjMyLXRhcmdldC5oIChUQVJHRVRfQklHX1NZTSwgVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGRlZAotCVNFQ19ERUJVR0dJTkcgdG8gc2VjdGlvbl9mbGFncy4KLQkqIGVsZjY0LXRhcmdldC5oIChUQVJHRVRfQklHX1NZTSwgVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGRlZAotCVNFQ19ERUJVR0dJTkcgYW5kIFNFQ19DT0RFIHRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQuCi0KLVdlZCBTZXAgMjIgMTY6MzQ6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAodGRhdGEpOiBBZGQgbHlueF9jb3JlX2RhdGEuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNldCBmaWxlcG9zIGZvcgotCXNlY3Rpb25zIHdpdGggU0VDX0xPQUQgc2V0LCBldmVuIGlmIFNFQ19IQVNfQ09OVEVOVFMgaXMgY2xlYXIuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHNldCBzY25wdHIgdG8gemVybyBqdXN0Ci0JYmVjYXVzZSBzaXplIG9mIHNlY3Rpb24gaXMgemVyby4gIE5lZWRlZCBmb3IgSXJpeCA0LjAuNUYuCi0KLVdlZCBTZXAgMjIgMDk6NDk6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBpOTYwLWJvdXQsIG5vdCBpOTYwLWNvZmYgZm9yIGk5NjAtKi1uaW5keSouCi0KLVdlZCBTZXAgMjIgMDc6MzQ6MDkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogIEFkZCBseW54LWNvcmUuby4KLQkqIGJmZC1pbjIuaCAodGRhdGEpOiAgQWRkIGx5bnhfY29yZV9kYXRhOwotCSogY29uZmlnLmJmZCBjb25maWd1cmUuaG9zdDogIEdldCByaWQgb2Ygc3VwZXJmbHVvdXMgbmV0YnNkIGFuZAotCWx5bnhvcyBlbnRyaWVzLgotCSogY29uZmlndXJlLmluOiAgQWRkIGx5bngtY29yZS5vIHRvIEx5bnggY29uZmlnLgotCSogaTM4Nmx5bnguYzogIEFkZCBkZWZzIGZvciBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGx5bngtY29yZS5jOiAgTmV3IGZpbGUgd2l0aCBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvaTM4Nmx5bnguaDogIE1vdmUgbG90cyBvZiBob3N0IHNwZWNpZmljIGluY2x1ZGVzIHRvIGhlcmUuCi0JQWRkIGRlZiBvZiBIT1NUX0xZTlguICBSZW1vdmUgdW5uZWNlc3NhcnkgZGVmcy4KLQotTW9uIFNlcCAyMCAxOToxODoxMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogT25seSBzZXQgU0VDX0RBVEEgZm9yIGEKLQlTSEZfUFJPR0JJVFMgb3IgU0hUX1NUUlRBQiBzZWN0aW9uIGlmIFNFQ19BTExPQyBpcyBzZXQuICBOZXZlciBzZXQKLQlTRUNfREFUQSBmb3IgYSBTSEZfTk9CSVRTIHNlY3Rpb24uCi0KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfbWFuZ2xlX3JlbG9jcyk6IENoZWNrIFNFQ19MT0FEIHJhdGhlcgotCXRoYW4gU0VDX0NPREUgfCBTRUNfREFUQS4gIEFkZCBzb21lIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbmxtY29kZS5oOiBBZGQgc29tZSBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElnbm9yZSByZWxvY3MgZm9yIHNlY3Rpb25zIHRoYXQgYXJlCi0JbmVpdGhlciBjb2RlIG5vciBkYXRhLiAgSnVzdCB1c2UgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgZGVidWdnaW5nCi0Jc3ltYm9sczsgZG9uJ3Qgb2Zmc2V0IGJ5IHRoZSBzZWN0aW9uIHZtYS4KLQotRnJpIFNlcCAxNyAxODowODo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCByZXR1cm4gYW4gZXJyb3Igd2hlbgotCXBlcmZvcm1pbmcgYSByZWxvYyBhZ2FpbnN0IGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQkqIHN5bXMuYyAoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IFNob3cgdmFsdWUgb2YgQlNGX1dFQUsgcmF0aGVyCi0JdGhhbiBvYnNvbGV0ZSBCU0ZfRVhQT1JULgotCi1GcmkgU2VwIDE3IDAyOjA0OjMxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBob3N0cy97YWxwaGFvc2YuaCwgYW1peC5oLCBhcG9sbG82OC5oLCBhcG9sbG92NjguaCwKLQlkZWNzdGF0aW9uLmgsIGRlbHRhODguaCwgZGd1eC5oLCBkb3NlLmgsIGdvMzIuaCwgaGFycmlzLmgsCi0JaHAzMDAuaCwgaHAzMDBic2QuaCwgaHBwYWJzZC5oLCBocHBhaHB1eC5oLCBpMzg2YWl4LmgsIGkzODZic2QuaCwKLQlpMzg2bGludXguaCwgaTM4Nmx5bnguaCwgaTM4NnYuaCwgaTM4NnY0LmgsIGlyaXgzLmgsIGlyaXg0LmgsCi0JbWlwc2JzZC5oLCBuY3IzMDAwLmgsIHJzNjAwMC5oLCBydGJzZC5oLCBzb2xhcmlzMi5oLCBzcGFyYy1sbC5oLAotCXN0ZC1ob3N0LmgsIHN0cmF0dXMuaCwgc3VuMy5oLCBzeXN2NC5oLCB0YWhvZS5oLCB1bHRyYTMuaCwKLQl2YXh1bHQuaCwgdmF4dWx0Mi5oLCB3ZTMyay5ofTogIE1ha2Ugc3VyZSB0aGF0ICJvZmZzZXRvZiIgaXMKLQlkZWZpbmVkIG9uIGFsbCBob3N0cywgbm93IHRoYXQgYXJjaGl2ZS5jIHVzZXMgaXQuCi0KLVRodSBTZXAgMTYgMTg6MjA6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IENyZWF0ZSBzZWN0aW9uIHN5bWJvbHMgZm9yIGFsbAotCXNlY3Rpb25zLCBub3QganVzdCBhbGxvY2F0ZWQgc2VjdGlvbnM7IGRlYnVnZ2luZyBzZWN0aW9ucyBjYW4gaGF2ZQotCXJlbG9jcy4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBJZiB0aGVyZSBpcyBhbiBvdXRwdXQgc2VjdGlvbiwgdXNlCi0JdGhlIHNlY3Rpb24gaW5kZXggZnJvbSB0aGF0IHJhdGhlciB0aGFuIHRoZSBpbnB1dCBzZWN0aW9uLgotCi1UaHUgU2VwIDE2IDEyOjIwOjUwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2ZsdXNoLCBiZmRfc3RhdCk6IFJlZmxlY3QgSm9obidzIGNoYW5nZXMgdG8KLQlsaWJiZmQuaCwgd2hpY2ggaXMgcmVnZW5lcmF0ZWQgZnJvbSB0aGlzIGZpbGUuCi0KLQkqIGJmZC1pbi5oIChzeW10eXBlKTogRGVsZXRlZCB0eXBlZGVmLgotCi1XZWQgU2VwIDE1IDExOjQ4OjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKENPRVJDRXh4KTogQ2FzdCB4IHRvIGJmZF9zaWduZWRfdm1hIGJlZm9yZSBkb2luZyB0aGUKLQl4b3IgYW5kIHN1YnRyYWN0LiAgT3RoZXJ3aXNlIGl0IHdpbGwgbm90IHNpZ24gZXh0ZW5kIGlmIHRoZSB0eXBlCi0Jb2YgYmZkX3ZtYSBpcyBsYXJnZXIgdGhhbiBpbnQuCi0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl9pbik6IEdldCByZWdvZmZzZXQsIGlvcHQsIGZyZWdvZmZzZXQKLQlhbmQgZnJhbWVvZmZzZXQgYXMgc2lnbmVkIG51bWJlcnMuICBGcm9tIFBldGVyIFNjaGF1ZXIuCi0KLVR1ZSBTZXAgMTQgMTg6MjA6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IEFkZCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MKLQlzcGVjaWFsIGZ1bmN0aW9uIGZvciBhbGwgcmVsb2MgZW50cmllcy4KLQkqIGVsZjMyLXRhcmdldC5oIChUQVJHRVRfTElUVExFX1NZTSk6IEFkZCBTRUNfQ09ERSB0bwotCXNlY3Rpb25fZmxhZ3MuCi0JKiBsaWJlbGYuaCAoZWxmX3N5bWJvbF90eXBlKTogUmVtb3ZlIGRlc2MsIHR5cGUgYW5kIG90aGVyIGZpZWxkcy4KLQkqIE1ha2VmaWxlLmluIChlbGYzMi0qLm8pOiBUaGVzZSBkZXBlbmQgdXBvbiBlbGYzMi10YXJnZXQuaC4KLQotVHVlIFNlcCAxNCAxNDozNDo0NSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoc3RydWN0IGFydGRhdGEpOiAgQWRkIGFybWFwX3RpbWVzdGFtcCBhbmQKLQlhcm1hcF9kYXRlcG9zIGhlcmUgdG9vLgotCi1Nb24gU2VwIDEzIDIxOjAzOjE4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjYWNvcGhvbnkuY3lnbnVzLmNvbSkKLQotCUltcHJvdmUgdGltZXN0YW1wIHN1cHBvcnQgaW4gQlNEIGFyY2hpdmUgZmlsZXMgdG8gYXZvaWQgbGlua2VyCi0Jd2FybmluZ3MuCi0KLQkqIGxpYmJmZC5oIChzdHJ1Y3QgYXJ0ZGF0YSk6ICBBZGQgYXJtYXBfdGltZXN0YW1wIGFuZCBhcm1hcF9kYXRlcG9zLgotCShiZmRfZmx1c2gsIGJmZF9zdGF0KTogIEFkZCBwcm90b3R5cGVzLgotCSogbGliYmZkLmMgKGJmZF9mbHVzaCk6ICBBZGQsIGRvZXMgZmZsdXNoIG9uIGEgQkZELgotCShiZmRfc3RhdCk6ICBBZGQsIGRvZXMgZnN0YXQgb24gYSBCRkQuCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogQXQgZW5kIG9mIGZpbGUgd3JpdGluZywKLQl2ZXJpZnkgYW5kIHBvc3NpYmx5IHVwZGF0ZSB0aGUgdGltZXN0YW1wIGluIHRoZSBhcm1hcCwgaWYgYSBCU0QKLQlhcmNoaXZlLiAgRklYTUUhICBLbHVkZ2UgcmVjb2duaXplcyBCU0QgYXJjaGl2ZSwgcmF0aGVyIHRoYW4KLQl2ZWN0b3JpbmcgcHJvcGVybHkuICBTaG91bGQgYWRkIHRvIHh2ZWMuCi0JKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogIE1vdmUgcHJvdG90eXBlIHRvIHRvcCwgYXZvaWQgUFJPVE8uCi0JKGJzZF93cml0ZV9hcm1hcCk6IFNhdmUgdGltZXN0YW1wIGFuZCBmaWxlIGxvY2F0aW9uIHRoZXJlb2YsIHdoZW4KLQl3cml0aW5nIHRoZSBhcm1hcCBpbiBhIEJTRCBmaWxlLgotCShic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6ICBOZXcgZnVuY3Rpb24gdG8gY2hlY2sgYW5kCi0JcmV3cml0ZSB0aGUgdGltZXN0YW1wLgotCi0JKiBob3N0cy9zdGQtaG9zdC5oIChvZmZzZXRvZik6ICBEZWZpbmUsIGlmIG5vdCBhbHJlYWR5LCBmb3IgYXJjaGl2ZS5jLgotCi1TYXQgU2VwIDExIDE4OjEzOjQyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2c2NvLmg6IERlZmluZSBhIGJ1bmNoIG9mIHN0dWZmIGZvciBjb3JlIGZpbGVzLgotCSogc2NvLWNvcmUuYzogUmVtb3ZlLCByZXBsYWNlIGJ5IHRyYWQtY29yZS5jLgotCSogdHJhZC1jb3JlLmM6IElmIEhPU1RfU1RBQ0tfU1RBUlRfQUREUiBpcyBkZWZpbmVkLCB1c2UgaXQuCi0JKiBjb25maWcvaTM4NnNjby5taDogVXNlIHRyYWQtY29yZSBub3Qgc2NvLWNvcmUuCi0JKiBob3N0cy9pMzg2aXNjLmgsIGNvbmZpZy9pMzg2aXNjLm1oOiBSZW1vdmUuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGkzODZzY28gZm9yIGlzYy4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdDogUmVtb3ZlLCBpZGVudGljYWwgdG8gaTM4Ni1jb2ZmLm10LgotCSogY29uZmlnLmJmZDogVXNlIGkzODYtY29mZiBub3QgaTM4Ni1zY28uCi0KLQkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBpWzM0XTg2LSotc29sYXJpczIqIHNwZWNpZmljYWxseSByYXRoZXIKLQl0aGFuIHVzaW5nICotKi1zb2xhcmlzMiogKGk0ODYtdW5rbm93bi1zb2xhcmlzMiBpcyBpMzg2LWVsZiwgbm90Ci0JaTQ4Ni1lbGYgd2hpY2ggZG9lc24ndCBleGlzdCkuCi0KLUZyaSBTZXAgMTAgMTI6NTY6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgQUxQSEFFQ09GRiwgZm9yY2UKLQlwYWRkaW5nIGZpZWxkIHRvIHplcm8uCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzRdODYtKi1uZXRic2QqKTogTmV3IHRhcmdldDsgdXNlIGkzODYtbmV0YnNkLgotCSogY29uZmlndXJlLmluOiBSZW1vdmUgYm9ndXMgbmV0YnNkMzg2IGhhbmRsaW5nLgotCi0JKiBjb2ZmLW1pcHMuYzogRG9uJ3Qgd2FybiBhYm91dCBvdmVyZmxvdyBmb3IgTUlQU19SX0pNUEFERFIgcmVsb2MuCi0JQ29ycmVjdCBvdmVyZmxvdyBkZXRlY3Rpb24gcmVxdWlyZXMgbWF0Y2hpbmcgdGhlIHVwcGVyIGZvdXIgYml0cwotCW9mIHRoZSBkZXN0aW5hdGlvbiBhZ2FpbnN0IHRoZSBQQy4KLQotVGh1IFNlcCAgOSAxNjo1Nzo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSA2NC1iaXQgc3R1ZmYgd29yayB3aXRoICItLXdpdGgtdGFyZ2V0cz1hbGwiLgotCi1UdWUgU2VwICA3IDE0OjE3OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmg6IFJlbW92ZWQgc3dhcHBpbmcgcm91dGluZXMgZGVjbGFyYXRpb25zLgotCSogYmZkLWluLmg6IEFkZGVkIHN3YXBwaW5nIHJvdXRpbmUgZGVjbGFyYXRpb25zLCBhbmQgcmVuYW1lZCB0aGVtCi0JZnJvbSBfZG9fKiB0byBiZmRfKi4KLQkqIGxpYmJmZC5jOiBSZW5hbWVkIHN3YXBwaW5nIHJvdXRpbmVzIGZyb20gX2RvXyogdG8gX2JmZF8qLgotCSogQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLU1vbiBTZXAgIDYgMTU6Mjg6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IFNldCBwY3JlbF9vZmZzZXQgdG8gdHJ1ZSBmb3IKLQlSXzM4Nl9QQzMyLgotCi1GcmkgU2VwICAzIDEzOjA2OjEyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW9yZ2FuaXplZCBzZXR0aW5nIG9mIG1ha2VmaWxlIHZhcmlhYmxlcyBzbwotCTY0LWJpdCBzdHVmZiB3b3JrcyBhZ2Fpbi4KLQotCSogbGliYmZkLWluLmggKF9kb19nZXQqLCBfZG9fcHV0Kik6IFJlbmFtZWQgdmlhIG1hY3JvcyB0byBjbGVhbiB1cAotCW5hbWVzcGFjZS4KLQotCSogbGliZWxmLmggKGVsZjMyX3N5bWJvbF90eXBlLCBlbGY2NF9zeW1ib2xfdHlwZSk6IERlbGV0ZWQKLQkibmF0aXZlX2VsZl9zeW0iIGZpZWxkLCBtZXJnZWQgdG8gbWFrZSBuZXcgdHlwZSAiZWxmX3N5bWJvbF90eXBlIi4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBGaWVsZCBzeW1ib2xzIGlzIG5vdyBlbGZfc3ltYm9sX3R5cGUqLgotCURlbGV0ZWQgZmllbGQgcmF3X3N5bXMuCi0JKG9ial9zeW1ib2xzKTogUmVtb3ZlIGNhc3QuCi0JKG9ial9yYXdfc3ltcyk6IERlbGV0ZWQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBzZXQgcmF3X3N5bXMgb3IKLQluYXRpdmVfZWxmX3N5bSBmaWVsZHMuCi0JKiBlbGYzMi1ocHBhLmM6IENoYW5nZWQgdXNlcyBvZiBlbGYzMl9zeW1ib2xfdHlwZSB0bwotCWVsZl9zeW1ib2xfdHlwZS4KLQotCUZyb20gUGV0ZSBIb29nZW5ib29tIGFuZCBKZWZmIExhdzoKLQotCSogZWxmMzItaHBwYS5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfdGNfc3ltYm9sKTogSWYgdGhlIGFyZ3VtZW50IHJlbG9jYXRpb24KLQliaXRzIGFyZSB6ZXJvIChlLmcuLCB0aGV5IHNwZWNpZnkgbm8gcmVsb2NhdGlvbnMpLCB0aGVuIGRvIG5vdAotCWV2ZW4gYm90aGVyIGFkZGluZyB0aGVpciBlbnRyaWVzIHRvIHRoZSBzeW1leHRuIHNlY3Rpb24uCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfdGNfc3ltYm9sKTogQW55IGZ1bmN0aW9uLCByZWdhcmRsZXNzCi0Jb2Ygc2NvcGUgY2FuIGhhdmUgYW4gYXJndW1lbnQgcmVsb2NhdGlvbiBzdHViLgotCi0JKiBlbGYzMi1ocHBhLmM6IChFbGYzMl9ocHBhX1N0dWJfZGVzY3JpcHRpb24pOiAgUmVuYW1lIHRoaXMKLQlzdHJ1Y3R1cmUgYW5kIHR5cGUgdG8gZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uLiAgVGhpcyBtYWtlcwotCWl0IGNvbnNpc3RlbnQgd2l0aCB0aGUgR05VIGNvZGluZyBjb252ZW50aW9ucy4KLQkoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uKTogQWRkZWQgYSAnbmV4dCcgZmllbGQgdG8gYWxsb3cKLQlsaW5raW5nIG9mIHN0dWIgZGVzY3JpcHRpb24gc3RydWN0dXJlcy4KLQkoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uKTogQWRkZWQgYSAnc3R1Yl9saXN0UCcgZmllbGQgdG8KLQlrZWVwIHRyYWNrIG9mIGluZGl2aWR1YWwgc3R1YnMuCi0JKEVsZjMyX2hwcGFfU3R1Yl9saXN0LCBFbGYzMl9ocHBhX1N0dWJfbGlzdF9zdHJ1Y3QpOiAgUmVtb3ZlZC4KLQlDb21iaW5lZCB3aXRoIHRoZSBlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24gc3RydWN0dXJlLgotCShlbGYzMl9ocHBhX3N0dWJfbmFtZV9saXN0KTogIE5ldyB0eXBlIHRvIGtlZXAgdHJhY2sgb2YKLQlpbmRpdmlkdWFsIHN0dWJzLgotCShhZGRfc3R1Yik6ICBSZW1vdmVkLgotCShhZGRfc3R1Yl9ieV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX3N0dWJfYnlfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBBbGxvdyByZXVzaW5nIHN0dWJzIHRoYXQKLQlhbHJlYWR5IGV4aXN0LgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogQWxsb3cgcmV1c2luZyBzdHVicyB0aGF0Ci0JYWxyZWFkeSBleGlzdC4KLQotCSogZWxmMzItaHBwYS5jOiAocmV0dmFsX21pc21hdGNoZXMpOiAgVGhlIGRpcmVjdGlvbiBvZiBhcmd1bWVudAotCXJlbG9jYXRpb24gd2FzIHJldmVyc2VkLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFJldHVybiBhZGRyZXNzIHdhcyBub3QgYmVpbmcKLQlyZXN0b3JlZC4KLQkoaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZF9wKTogQWRkIGFyZ3VtZW50IGNvbnRhaW5pbmcgY2FsbGVyCi0JYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIHNvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gdGhlIGNoZWNrCi0JZm9yIHBsYWJlbCBzdHVicy4KLQkoaHBwYV9lbGZfc3R1Yl9jaGVjayk6IFBhc3MgY2FsbGVyIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBpbnRvCi0JaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZF9wKCkuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IEFkZCBjaGVjayBmb3IgcGxhYmVsIHN0dWJzIGFuZAotCXBhc3MgY2FsbGVyIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBpbnRvCi0JaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZF9wKCkuCi0KLVRodSBTZXAgIDIgMDA6NTk6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoaHBwYV9maWVsZF9hZGp1c3QpOiBSZW1vdmUgdW51c2VkIGBpbml0X3ZhbHVlJyB2YXJpYWJsZS4KLQotCSogaG9zdHMvZGVsdGE4OHY0Lmg6IE5ldyBmb3IgU1ZSNC4KLQkqIGNvbmZpZ3VyZS5ob3N0czogVXNlIGl0LgotCi1XZWQgU2VwICAxIDE0OjIzOjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmgsIG5ldGJzZDM4Ni5jOiBDaGFuZ2UgTV9JMzg2IHRvIE1fMzg2X05FVEJTRC4gIE1fSTM4NgotCWlzIGFuIFNDTyBwcmUtZGVmaW5lLgotCi1UdWUgQXVnIDMxIDEyOjUwOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiBTZXQgSEFTX1NZTVMgaWYgdGhlcmUgYXJlIGV4dGVybmFsCi0JcmVmZXJlbmNlcy4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfe2luLG91dH0pOiBUaGUgY29weXJpZ2h0IGxlbmd0aCBpcwotCW9ubHkgb25lIGJ5dGUuCi0JKG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogSW5jbHVkZSBkZWJ1Z2dpbmcgc3ltYm9scyBpbiBzeW1ib2wKLQljb3VudC4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IE1ha2Ugc3ltbGVuZ3RoIHVuc2lnbmVkLiAgUmVhZCBkZWJ1Z2dpbmcKLQlzeW1ib2xzIGFzIEJGRCBsb2NhbCBzeW1ib2xzLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgYm90aGVyIHdyaXRpbmcgb3V0IGV4cG9ydGVkCi0Jc3ltYm9scyBtb3JlIHRoYW4gb25jZTsgdGhleSBub3cgYXBwZWFyIGluIHRoZSBzeW1ib2wgdGFibGUgbW9yZQotCXRoYW4gb25jZSAod2l0aCBhbmQgd2l0aG91dCBhIHByZWZpeCkgaWYgbmVjZXNzYXJ5LiAgU2V0IG9mZnNldAotCXZhbHVlcyB0byBiZSBub24temVybyBhcyBOTE1MSU5LIGRvZXMuCi0KLVR1ZSBBdWcgMzEgMTI6MDc6NDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogUmVzdG9yZSAjdW5kZWZzIG9mIGVfZnNlbCBhbmQgb3RoZXIgZV8qIHN5bWJvbHMuCi0KLUZyaSBBdWcgMjcgMTY6NDM6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKHN0cnVjdCBzZWMpOiBNb3ZlIHBvc2l0aW9uIG9mIHVzZXJfc2V0X3ZtYSwgYW5kCi0JZG9jdW1lbnQgaXQuCi0JKFNFQ19CQUxJR04pOiBEaXNhYmxlIGZvciBub3cuICBJIGRvbid0IHRoaW5rIGl0J3MgY3VycmVudGx5IHVzZWQuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBOb3cgc3RhdGljLgotCShzeW1leHRfcm9vdFAsIHN5bWV4dF9sYXN0UCwgZ2xvYmFsX3ZhbHVlLCBHT1RfdmFsdWUsCi0JZ2xvYmFsX3N5bWJvbCwgZ2xvYmFsX3N5bV9kZWZpbmVkLCBzeW1leHRuX2NvbnRlbnRzLAotCXN5bWV4dG5fY29udGVudHNfcmVhbF9zaXplLCBlbGZfaHBwYV9zdHViX3Jvb3RQLAotCWVsZjMyX2hwcGFfc3ltZXh0bl9tYXAsIGVsZjMyX2hwcGFfc3ltZXh0bl9tYXBfc2l6ZSk6IFJlbHkgb24KLQlkZWZhdWx0IGluaXRpYWxpemF0aW9uLgotCShocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IE1hY3JvICJVTkRFRklORUQiIGRvZXNuJ3QgbmVlZCBhCi0JdHJhaWxpbmcgc2VtaWNvbG9uLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBJbnRyb2R1Y2UgdGVtcG9yYXJpZXMgdG8gbWFrZQotCWNvZGUgbW9yZSByZWFkYWJsZSBpbiA4MCBjb2x1bW5zLgotCi0JKiBsaWJocHBhLmggKGFsbCBmdW5jdGlvbnMpOiBOb3cgaW5saW5lIHVuZGVyIEdOVSBDLgotCi0JTW9yZSBwYXRjaGVzIGZyb20gSmVmZiBMYXc6Ci0KLQkqIGVsZjMyLWhwcGEuYyAoQVJfV0FSTik6IEdpdmUgYXJndW1lbnQgd2hpY2ggY2F1c2VkIHRoZQotCWludmFsaWQgYXJndW1lbnQgcmVsb2NhdGlvbi4KLQkoQVJfVU5JTVApOiBEZWxldGUgdW51c2VkIG1hY3JvLgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3RhYmxlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZzogTGlrZXdpc2UuCi0KLQkqIHNvbS5jOiBOZXcgZmlsZSBjb250YWluaW5nIFNPTSBzcGVjaWZpYyBjb2RlIGV4dHJhY3RlZAotCWZyb20gaHBwYS5jCi0KLQkqIHNvbS5oOiBOZXcgZmlsZSBjb250YWluaW5nIFNPTSBzcGVjaWZpYyBjb2RlIGV4dHJhY3RlZAotCWZyb20gbGliaHBwYS5oCi0KLQkqIGhwcGEuYzogRGVsZXRlZC4KLQotCSogbGliaHBwYS5oOiBEZWxldGUgU09NIHNwZWNpZmljIGNvZGUuICBBZGQgZ2VuZXJpYyBQQQotCWNvZGUgd2hpY2ggY2FuIGJlIHNoYXJlZCBieSBib3RoIFNPTSBhbmQgRUxGIGJhY2tlbmRzLgotCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSBocHBhLmMgd2l0aCBzb20uYy4gIGVsZjMyLWhwcGEubwotCWRlcGVuZHMgb24gbGliaHBwYS5oIG5vdy4KLQotCSogY29uZmlndXJlLmluIChocHBhX3ZlYyk6IE5lZWRzIHNvbS5vIG1vZHVsZSBpbnN0ZWFkIG9mCi0JaHBwYS5vLgotCi0JKiBlbGYzMi1ocHBhLmM6IEluY2x1ZGUgbGliaHBwYS5oLiAgRG8gbm90IGRlZmluZQotCUJZVEVTX0lOX1dPUkQuCi0KLQkqIGVsZjMyLWhwcGEuaCAoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlKTogRGVsZXRlCi0Jbm93IGxpdmVzIGluIGxpYmhwcGEuaC4KLQkoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCk6IExpa2V3aXNlLgotCi0JKiBob3N0cy9ocHBhYnNkLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPiBhbmQgPHVuaXN0ZC5oPi4gIERvIG5vdAotCWRlZmluZSBtYWxsb2Mgb3IgZnJlZS4KLQotCSogY29uZmlnL2hwcGEtZWxmLm10IChTRUxFQ1RfQVJDSElURUNUVVJFUyk6IERvbid0IGRlZmluZQotCVNFTEVDVF9WRUNTLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jYXRlX3Vud2luZF90YWJsZSk6IERlbGV0ZSB1bnVzZWQKLQl2YXJpYWJsZXMuCi0JKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZF9wKTogTGlrZXdpc2UuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBMaWtld2lzZS4KLQkoZWxmX3JlbG9jX21hcCk6IERlbGV0ZSwgbm8gbG9uZ2VyIHVzZWQuCi0JKGVsZl9ocHBhX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX3N5bWV4dG5fbWFwX21heF9zaXplKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfZ2V0X3N5bV9leHRuKTogQWJvcnQgaWYgdHlwZSBpcyBib2d1cy4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IEFkZCBwcm9jZXNzaW5nCi0Jb2YgdGhlIC5ocHBhX3Vud2luZCBzZWN0aW9uLgotCi1XZWQgQXVnIDI1IDE2OjEzOjQ5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogcmVjb2duaXplIG04ODExMC4KLQotVHVlIEF1ZyAyNCAxNjozMjozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlIEhvb2dlbmJvb20gYXQgVXRhaDoKLQotCSogZWxmY29kZS5oIChlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQWRkIGRldGVjdGlvbiBvZgotCVNIVF9OT1RFIHNlY3Rpb25zLgotCi0JKiBlbGYzMi1ocHBhLmM6Ci0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIsaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOgotCU5ldyBmdW5jdGlvbnMgZm9yIHN1cHBvcnQgb2YgbG9uZyBicmFuY2ggc3R1YnMuCi0JKGhwcGFfZWxmX3N0dWJfY2hlY2ssaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogIEFkZAotCWNoZWNrIGZvciBsb25nIGJyYW5jaCBzdHVicy4KLQkoaHBwYV9sb29rX2Zvcl9zdHVicyk6ICBVbnVzZWQgZnVuY3Rpb24uICBSZW1vdmVkLgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEltcGxlbWVudCBhIFBBL0VMRi1zcGVjaWZpYwotCXZlcnNpb24gb2YgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzLgotCShocHBhX2VsZl9sb25nX2JyYW5jaF9uZWVkZWRfcCk6IE9ubHkgb3V0cHV0IGRlYnVnZ2luZyBkaWFnbm9zdGljcwotCXdoZW4gQkZEIGlzIGNvbmZpZ3VyZWQgZm9yIGRlYnVnZ2luZy4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmMzJfaHBwYV9nZXRfc3ltZXh0bl9jaGFpbik6ICBOZXcgZnVuY3Rpb24KLQl0byByZXR1cm4gYSBsaXN0IG9mIHN5bWJvbHMgdGhhdCBoYXZlIG5vbi16ZXJvIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiBiaXRzLgotCShocHBhX2VsZl9zdHViX2ZpbmlzaCk6IE1ha2Ugc3VyZSBzdHViIGdlbmVyYXRpb24gaXMgZG9uZSBvbmx5Ci0Jb25jZS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfc3R1Yl9yZWxvYyk6ICBOZXcgZnVuY3Rpb24gZm9yCi0JZ2VuZXJhdGlvbiByZWxvY2F0aW9uIGVudHJpZXMgd2l0aGluIGEgc3R1Yi4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBDb3JyZWN0aW9ucyB0byBhcmd1bWVudAotCXJlbG9jYXRpb24gc3R1YnMuCi0KLQkqIGVsZjMyLWhwcGEuYzogTmV3ICNkZWZpbmUncyBmb3IgYXJndW1lbnQgcmVsb2NhdGlvbiB0eXBlcy4KLQkobWlzbWF0Y2hlcywgcmV0dmFsX21pc21hdGNoZXMpOiBVcGRhdGVkIHRvIHJlZmxlY3QgbmV3Ci0JYXJndW1lbnQgcmVsb2NhdGlvbiB0eXBlcy4KLQkoQ1VSUkVOVF9TVFVCX09GRlNFVCk6IE5ldyBtYWNyby4KLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IFNldCB0aGUgUEZfWCBiaXQgZm9yIGRhdGEKLQlzZWdtZW50cy4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBBZGQKLQlSX0hQUEFfU1RVQl9DQUxMXzE3IGZvciBzdXBwb3J0IG9mIGxpbmtlciBzdHViIGdlbmVyYXRpb24uCi0JKGhwcGFfZWxmX3JlbG9jKTogQWRkIHN1cHBvcnQgb2YgUl9IUFBBX1NUVUJfQ0FMTF8xNwotCXJlbG9jYXRpb24gdHlwZS4KLQotCSogZWxmMzItaHBwYS5oOiAoZWxmMzJfaHBwYV9yZWxvY190eXBlKTogQWRkCi0JUl9IUFBBX1NUVUJfQ0FMTF8xNyBmb3Igc3VwcG9ydCBvZiBsaW5rZXIgc3R1YiBnZW5lcmF0aW9uLgotCi0JKiBocHBhX3N0dWJzLmg6IEFkZCBuZXcgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHVzZWQgaW4gbGlua2VyCi0Jc3R1YiBnZW5lcmF0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jYXRlX3Vud2luZF90YWJsZSk6IFRoZSBvZmZzZXRzIGluIGFuCi0JdW53aW5kIGRlc2NyaXB0b3Igd2VyZSBpbmNvcnJlY3QuCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IERlY2xhcmUuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZyk6ICBOZXcKLQlmdW5jdGlvbiBpbiBwbGFjZSBvZiBnbG9iYWxfc3ltIGZpZWxkIGluIGVsZl9iYWNrZW5kX2RhdGEKLQlzdHJ1Y3R1cmUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLQllbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nLAotCWVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zLAotCWVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkciwKLQllbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogIE5ldyBmdW5jdGlvbnMgdG8KLQlwcm92aWRlIHN1cHBvcnQgb2Ygc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucyBhbmQgYXJndW1lbnQKLQlyZWxvY2F0aW9uIHN0dWJzLgotCShlbGZfaW5mb190b19ob3d0byk6ICBSZW1vdmUgY2FsbCB0byBhYm9ydCgpLgotCi0JKiBlbGYzMi10YXJnZXQuaDogIFN1cHBvcnQgZm9yIHNwZWNpYWwgcHJvY2Vzc2luZyBieSB0aGUgYmFja2VuZC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiAgQWRkZWQgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcsCi0JZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcsCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nLCBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkciwKLQllbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLCBhbmQKLQllbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gZmllbGRzLgotCSogZWxmY29kZS5oOiAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogQWRkIGEgY2hlY2sgZm9yCi0JcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogIEFkZCBhIGNoZWNrIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMKLQlzZWN0aW9uIHR5cGVzLgotCShiZmRfZWxmMzJfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIEFkZCBhIGNoZWNrIHRvIHNlZSBpZgotCXRoZXJlIGlzIGFueSBmaW5hbCBzZWN0aW9uIHByb2Nlc3NpbmcgdG8gYmUgZG9uZSBieSB0aGUKLQliYWNrZW5kLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogIEFkZCBhIGNoZWNrIGZvcgotCXByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIFJlbW92ZSByZWZlcmVuY2UgdG8gZ2xvYmFsX3N5bSBpbiB0aGUKLQllbGZfYmFja2VuZF9kYXRhIHN0cnVjdHVyZS4gIFJlcGxhY2UgaXQgd2l0aCBhIGNhbGwgdG8KLQllbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZy4KLQkqIGxpYmVsZi5oOiBSZW1vdmUgZ2xvYmFsX3N5bSBmaWVsZCBpbiB0aGUgZWxmX2JhY2tlbmRfZGF0YQotCXN0cnVjdHVyZS4gIFJlcGxhY2UgaXQgd2l0aCBhIHNlcmllcyBvZiBiYWNrZW5kLXNwZWNpZmljCi0JZnVuY3Rpb25zLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfYnJhbmNoX3JlbG9jKTogVGhlIGZvcm1hbCBhcmd1bWVudAotCXN0dWJfc3ltIHNob3VsZCBiZSBjYWxsZWQgdGFyZ2V0X3N5bS4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBSZWZlciB0byB0aGUgc3R1YiBiZmQgKGFiZmQpCi0JcmF0aGVyIHRoYW4gdGhlIG91dHB1dCBiZmQgKG91dHB1dF9iZmQpLgotCShocHBhX2VsZl9yZWxvYyk6IEdldCByaWQgb2YgcmVmZXJlbmNlcyB0byB0aGUgZ2xvYmFsX3N5bSBmaWVsZCBpbgotCXRoZSBlbGZfYmFja2VuZF9kYXRhIHN0cnVjdHVyZS4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIHRoZSBjb3JyZWN0IGNvbmRpdGlvbiBmb3IKLQkuYnNzLiAgQWxzbywgZGV0ZWN0IHRoZSBleGlzdGVuY2Ugb2YgYSAubm90ZSBzZWN0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jYXRlX2luc24pOiByX2Zvcm1hdCBhcmd1bWVudCBzaG91bGQKLQloYXZlIGJlZW4gcl9maWVsZC4KLQotCSogaG9zdHMvaHBwYWJzZC5oIChIT1NUX01BQ0hJTkVfQVJDSCk6IFJlZmVyZW5jZSB0byBiZmRfYXJjaF9tNjhrCi0Jc2hvdWxkIGJlIGEgcmVmZXJlbmNlIHRvIGJmZF9hcmNoX2hwcGEuCi0KLQkqIGhwcGEuYyAoaHBwYV92ZWMpOiBSZXBsYWNlIGJmZF9mYWxzZSB3aXRoIF9iZmRfZHVtbXlfdGFyZ2V0IGluCi0JdGhlIGJmZF9jaGVja19mb3JtYXQgc3RydWN0dXJlIHRvIGF2b2lkIGEgdHlwZSBtaXNtYXRjaC4KLQotTW9uIEF1ZyAyMyAxOTkzICBTZWFuIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0JCSBhbmQgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQlBZGQgTmV0QlNEIHN1cHBvcnQ6Ci0JKiBuZXRic2QzODYuYzogTmV3IGZpbGUuCi0JKiBhb3V0eC5oOiBNYWtlIHN5bV9pc19kZWJ1Z2dlcl9pbmZvIHRydWUgZm9yIE5fRk4uCi0JKiBNYWtlZmlsZS5pbiwgYW91dC10YXJnZXQuaCwgY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS5pbiwKLQlsaWJhb3V0LmgsIHRhcmdldHMuYzogT3RoZXIgY2hhbmdlcy4KLQotRnJpIEF1ZyAyMCAxNzowNDo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL204OGstZWxmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQ6IFVzZSBpdCBmb3IgbTg4Ki0qLXN5c3Y0Ki4KLQotRnJpIEF1ZyAyMCAxNToxNjo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2J1aWxkX3BoZHJzKTogVW51c2VkIGZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGJmZF9zaGRyX2Zyb21fc2VjdGlvbik6IERpdHRvLgotCSh3cml0ZV9yZWxvY3MpOiBEb24ndCBjaGFuZ2Ugc2VjdGlvbiBjb250ZW50cyBmb3IgYWRkZW5kLgotCShlbGZfbG9jYXRlX3NoKTogUmV0dXJuIHR5cGUgaXMgbm93IGFsd2F5cyBlbGZfaW50ZXJuYWxfc2hkciwKLQlzaW5jZSB0aGUgb3RoZXIgdHlwZXMgd2VyZSByZWFsbHkgYWxpYXNlcyBmb3IgdGhpcyB0eXBlIGFueXdheXMuCi0JRG9uJ3QgY29tcGlsZSB0aGlzIGZ1bmN0aW9uLCBzaW5jZSBpdCBpcyBzdGF0aWMgYW5kIGRvZXNuJ3QgYXBwZWFyCi0JdG8gYmUgdXNlZCBpbiB0aGlzIGZpbGUuCi0JKHN5bV9pc19nbG9iYWwpOiBSZXR1cm4gbm9uLXplcm8gZm9yIHdlYWsgc3ltYm9scy4gIEFib3J0IGlmCi0Jc2VjdGlvbiBwb2ludGVyIGlzIG51bGwuCi0JKHN3YXBfb3V0X3N5bXMpOiBSZW9yZGVyIHRlc3RzIHNvIGZ1bmN0aW9uIHN5bWJvbHMgY2FuIGJlIHdlYWsuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCB1c2UgQlNGX0VYUE9SVC4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IE1ha2UgUkVMT0NfUFJPQ0VTU0lORyBzZWN0aW9uIHNtYWxsZXIgYnkKLQlleHRyYWN0aW5nIG91dCBzb21lIGNvbW1vbiBjb2RlLiAgQWJvcnQgaWYgQkZEIHNlY3Rpb24gc3ltYm9sIGhhcwotCW51bGwgbmFtZS4KLQkoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogVHJhbnNsYXRlIEVMRiBzZWN0aW9uIHN5bWJvbHMgaW50byBCRkQKLQlzZWN0aW9uIHN5bWJvbHMuICBEb24ndCByZWFkIHNlY3Rpb24gY29udGVudHMgdG8gZmlsbCBpbiBhZGRlbmQKLQlmaWVsZC4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBbGwgcGFydGlhbF9pbnBsYWNlIGZpZWxkcwotCXNob3VsZCBiZSAidHJ1ZSIuCi0KLQkqIE1lcmdlZCBmcm9tIE9TRjoKLQotCVR1ZSBKdW4gMTUgMTQ6Mzg6MzIgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgRWxmX1N5bV9FeHRyYSk6IE5ldyBzdHJ1Y3R1cmUgdG8gY29udGFpbiBFTEYKLQlzcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICBQdXQgaW4gZWxmX3N5bV9udW0sIHdoaWNoCi0JZ2l2ZXMgdGhlIGV4dGVybmFsIHN5bWJvbCBudW1iZXIgaW4gdGhlIGVsZiBvYmplY3QgZmlsZSwgc2luY2UKLQlsb2NhbCBzeW1ib2xzIG11c3QgY29tZSBiZWZvcmUgZ2xvYmFsIHN5bWJvbHMuCi0JKGVsZl9zeW1fZXh0cmEpOiBOZXcgbWFjcm8uCi0JKGVsZl9zeW10YWJfbWFwKTogRGVsZXRlLCBpbiBmYXZvciBvZiB1c2luZyBFbGZfU3ltX0V4dHJhLgotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBVc2UgRWxmX1N5bV9FeHRyYSB0byBtYXAgaW50ZXJuYWwKLQlzeW1ib2wgbnVtYmVyIHRvIGV4dGVybmFsIG51bWJlci4gIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZQotCUVsZl9TeW1fRXh0cmEgZmllbGQgZm9yIHRoZSBzeW1ib2wgaW4gdGhlIHVkYXRhIGZpZWxkLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIEVsZl9TeW1fRXh0cmEgdG8gbWFwIG91dCBzeW1ib2xzLgotCi0JU3VuIEp1biAyMCAxNjozMDoxMSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfb2JqX3RkYXRhKTogQWRkIGZpZWxkIHRvIGNvdW50IHRoZSBzaXplIG9mIHRoZQotCWFycmF5IG9mIHBvaW50ZXJzIHRvIHNlY3Rpb24gc3ltYm9scy4KLQkoZWxmX21hcF9zeW1ib2xzKTogQnVtcCB0aGUgbWF4IGluZGV4IG9mIHRoZSBzZWN0aW9uIHN5bWJvbHMgc28KLQl0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBtZW1vcnkuICBTdG9yZSB0aGUgbWF4IGluZGV4IGludG8gdGhlCi0JZWxmX29ial90ZGF0YSBmaWVsZC4KLQotCVNhdCBKdW4gMTkgMTA6MTI6MjcgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzCi0JdG8gdGhlIHNlY3Rpb24gc3ltYm9scyB3ZSBjcmVhdGVkLiAgUmVtb3ZlIHVudXNlZCBmaWVsZAotCWludGVybmFsX3N5bXMuCi0JKGVsZl9tYXBfc3ltYm9scyk6IEZpbGwgaW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2VjdGlvbiBzeW1ib2xzLgotCU9ubHkgY3JlYXRlIHNlY3Rpb24gc3ltYm9scyBmb3Igc2VjdGlvbnMgdGhhdCBoYXZlIFNFQ19BTExPQyBzZXQsCi0JYW5kIGhhdmUgbm9uLXplcm8gc2l6ZS4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBJZiB1ZGF0YSBpcyBOVUxMLCBhbmQgdGhpcyBpcyBhCi0Jc2VjdGlvbiBzeW1ib2wsIGxvb2sgdXAgdGhlIHNlY3Rpb24gaW4gdGhlIGxpc3Qgb2Ygc2VjdGlvbgotCXN5bWJvbHMsIGFuZCBzZXQgdGhlIHVkYXRhIHBvaW50ZXIgYXBwcm9wcmlhdGVseS4gIE90aGVyd2lzZSwgaWYKLQl1ZGF0YSBpcyBzdGlsbCBOVUxMLCBmYWlsIGFuIGFzc2VydGlvbiwgYW5kIHVzZSAwLCBpbnN0ZWFkIG9mCi0JZHJvcHBpbmcgY29yZS4KLQotRnJpIEF1ZyAyMCAxMjoxODowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKG1pcHMtKi1lbGZsKiwgbWlwcy0qLWVsZiopOiBOZXcgdGFyZ2V0cywgdXNpbmcKLQltaXBzbGVsZiBhbmQgbWlwc2JlbGYgcmVzcGVjdGl2ZWx5LgotCSogY29uZmlnL21pcHNsZWxmLm10LCBjb25maWcvbWlwc2JlbGYubXQ6IE5ldyBmaWxlcy4KLQkqIGVsZjMyLW1pcHMuYzogQWRkZWQgc29tZSByZWxvYyBpbmZvcm1hdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbjogRml4ZWQgZXJyb3IgbWVzc2FnZS4KLQotCSogZWNvZmYuYyAoRUNPRkZfTE9OR19TSVpFKTogUmVtb3ZlZC4gIEp1c3QgdXNlIGNvbnN0YW50cy4KLQotVGh1IEF1ZyAxOSAwOTo0NTo1MSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUywgQUxMX01BQ0hJTkVTLCBCRkQzMl9CQUNLRU5EUywgQkZENjRfQkFDS0VORFMsCi0JT1BUSU9OQUxfQkFDS0VORFMpOiBBbHBoYWJldGl6ZSBlbnRyaWVzIGFuZCBhZGQgYSBmZXcgbWlzc2luZyBvbmVzLgotCSogYXJjaHVyZXMuYzogQWxwaGFiZXRpemUgZGVjbHMuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jOiBBZGQgbWlzc2luZyB2ZWN0b3JzIHRvIHRoZSB0YWJsZXMuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpIFshU0VMRUNUX1ZFQ1NdOiBBZGQgREVGQVVMVF9WRUNUT1IuCi0JUmVtb3ZlIGhwMzAwYnNkX3ZlYyBkdWUgdG8gY2xhc2ggd2l0aCBzdW5vc19iaWdfdmVjLgotCi1UdWUgQXVnIDE3IDE4OjEyOjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2e21hY2gzLG9zZjFta30uaDogTmV3IGZpbGVzLCBmb3IgTWFjaCBob3N0aW5nLgotCSogaG9zdHMvaTM4Nm1hY2guaDogcmVtb3ZlZCwgcmVwbGFjZWQgYnkgaTM4Nm9zZjFtay5oLgotCSogY29uZmlnL2kzODZtYWNoMy5tdCwgaTM4Nm1hY2gzLmM6IE5ldyBmaWxlcywgZm9yIE1hY2ggYS5vdXQgZm9ybWF0LgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5ob3N0LCBjb25maWcuYmZkOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBob3N0cy9kZWNzdGF0aW9uLmg6IEluY2x1ZGUgPHN5cy9wYXJhbS5oPiBub3QgPG1hY2hpbmUvcGFyYW0uaD4uCi0KLVR1ZSBBdWcgMTcgMTU6MTk6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBJZiBzZWN0aW9uJ3Mgb3V0cHV0X3NlY3Rpb24gaXMKLQlub3QgeWV0IHNldCwgcG9pbnQgdG8gaXRzZWxmLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGlzIGlzCi0JY2FsbGVkIG9uIHRoZSBvdXRwdXQgZmlsZSwgbm90IHRoZSBpbnB1dCBmaWxlLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChkdW1teV9yZWxvYywgUlRZUEUySE9XVE8pOiBTZXQgaG93dG8gZmllbGQgdG8gYQotCWR1bW15IHZhbHVlLCByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IE5VTEwuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gpOiBTZXQgYmZkX2Vycm9yIG9uCi0JZmFpbHVyZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guCi0KLVR1ZSBBdWcgMTcgMDk6NDI6MTYgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChjcHUpOiBFeHRyYWN0IGZyb20gY2Fub25pY2FsIG5hbWUgd2l0aCBzZWQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHBhc3MgaXQuCi0KLVN1biBBdWcgMTUgMjA6NDU6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBSZW1vdmUge0JZVEUsV09SRCxMT05HfV9TSVpFOyB0aGV5IGFyZSBwb2ludGxlc3MgYW5kCi0JQllURV9TSVpFIGNvbmZsaWN0cyB3aXRoIGEgTWFjaCBoZWFkZXIuCi0JKiBlY29mZi5jOiBDaGFuZ2UgTE9OR19TSVpFIHRvIEVDT0ZGX0xPTkdfU0laRSBhbmQgZGVmaW5lIGl0LgotCi0JKiBjb25maWd1cmUuaG9zdDogTWFrZSBzdXJlIGFsbCBPUyBmaWVsZHMgZW5kIGluICouCi0KLUZyaSBBdWcgMTMgMTY6MzM6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFVzZSBiZmRfYWJzX3NlY3Rpb24gZm9yCi0JUkVMT0NfU0VDVElPTl9OT05FIGFuZCBSRUxPQ19TRUNUSU9OX0FCUy4gIElmIGEgcmVsb2Mgc2VjdGlvbgotCWRvZXNuJ3QgZXhpc3QsIGRvbid0IHRyeSB0byBjcmVhdGUgaXQuCi0KLQkqIG5sbWNvZGUuaCAobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHByb2NlZHVyZSBvZmZzZXRzIGFyZQotCWZyb20gc3RhcnQgb2YgY29kZSBzZWdtZW50LCBub3Qgc3RhcnQgb2YgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LW5sbS5tdCAoREVGQVVMVF9WRUNUT1IpOiBJdCdzIG5sbTMyX2kzODZfdmVjLCBub3QKLQliZmRfbmxtMzJfaTM4Nl92ZWMuCi0JKiBjb25maWd1cmUuaW4gKFNFTEVDVF9WRUNTIHN3aXRjaCk6IExpa2V3aXNlLgotCi1UaHUgQXVnIDEyIDEwOjMyOjQ3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXQpOiBJZiB0aGUgdGFyZ2V0IG1hdGNoZXMgdGhlIGRlZmF1bHQKLQl0YXJnZXQsIHNldCBtYXRjaF9jb3VudCB0byAxLCB0byBpZ25vcmUgYW55IHByZXZpb3VzIG1hdGNoZXMuCi0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBzcmVjLm8sIGFkZCByZWxvYzE2Lm8uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHJlbG9jMTYubyB3aGVuIHdlIGFkZAotCWNvZmYtaDgzMDAubywgY29mZi1oODUwMC5vLCBjb2ZmLXNoLm8sIGNvZmYtejhrLm8uCi0JTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogUmVtb3ZlIHJlbG9jMTYuby4KLQotCSogY29uZmlnL3U2OGstY29mZi5tdDogRml4IHR5cG8sIERFRkFVTFRfVEFSR0VUIGZvcgotCURFRkFVTFRfVkVDVE9SLgotCi0JKiBjb25maWcvaDgzMDAtY29mZi5tdCwgaDg1MDAtY29mZi5tdCwgc2gtY29mZi5tdCwgc3QyMDAwLm10LAotCXo4ay1jb2ZmLm10IChERUZBVUxUX1ZFQ1RPUik6IERlZmluZS4gIERvbid0IGV4cGxpY2l0bHkgYWRkCi0JUy1yZWNvcmRzIHZpYSBTRUxFQ1RfVkVDUy4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKSwgTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWx3YXlzCi0Jc3VwcG9ydCBTLXJlY29yZHMsIGZvciBjb252ZW5pZW5jZS4KLQotVGh1IEF1ZyAxMiAwODozMDowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfaG93dG9fdGFibGUsIGFscGhhX2ZpbmlzaF9yZWxvYywKLQlhbHBoYV9lY29mZl9zd2FwX3JlbG9jX3tpbixvdXR9LCBhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOgotCVJlYWQgYW5kIHdyaXRlIEFscGhhIHJlbG9jcy4gIENhbid0IHByb2Nlc3MgdGhlbSB5ZXQuCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFJlY29nbml6ZSBuZXcgcmVsb2Mgc2VjdGlvbnMuCi0JSWYgdGhlIHNlY3Rpb24gZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgY3JlYXRlIGl0LgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfe2luLG91dH0pOiBIYW5kbGUgbmV3IGZpZWxkcyBkZWZpbmVkCi0Jb24gdGhlIEFscGhhLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBjb25zdHJ1Y3Rvcl9yZWxvYyBhbmQKLQlmaW5pc2hfcmVsb2MgZmllbGRzLgotCSogZWNvZmYuYzogTW92ZSBNSVBTIHJlbG9jIHN1cHBvcnQgZnJvbSBoZXJlLi4uCi0JKiBjb2ZmLW1pcHMuYzogdG8gaGVyZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEdldCBjb25zdHJ1Y3RvciByZWxvYyBob3d0bwotCWZyb20gYmFja2VuZC4KLQkoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZW1vdmVkIE1JUFMgc3BlY2lmaWMgc3R1ZmYuICBDYWxsCi0JZmluaXNoX3JlbG9jIGJhY2tlbmQgZnVuY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZWQgTUlQUyBzcGVjaWZpYyBhc3NlcnRpb25zLgotCSogY29mZi1taXBzLmMgKG1pcHNfZmluaXNoX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEZpbGwgaW4gbmV3IGZpZWxkcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogVXNlIE5VTEwgZm9yIG5ldwotCWZpZWxkcy4KLQkqIHRhcmdldHMuYzogQWRkZWQgZXh0ZXJuIGZvciBlY29mZmFscGhhX2xpdHRsZV92ZWMuCi0KLQkqIGJmZC5jIChfYmZkX2hvc3RfYmlnX2VuZGlhbik6IFJlbW92ZWQuCi0JKiBiZmQtaW4uaCAoSE9TVF9CWVRFX09SREVSX0JJR19QLCBiZmRfaGVhZGVyX3R3aWRkbGVfcmVxdWlyZWQpOgotCVJlbW92ZWQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1XZWQgQXVnIDExIDEyOjExOjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogTmV3IGZpbGUsIGJyb2tlbiBvdXQgb2YgY29uZmlndXJlLmluLgotCSogY29uZmlndXJlLmluOiBVc2UgaXQsIGFuZCB1c2Ugc3RhbmRhcmQgdGFyZ2V0IG5hbWVzIGZvcgotCS0td2l0aC10YXJnZXRzLCByZXBsYWNpbmcgLS13aXRoLWJmZC10YXJnZXRzLgotCi0JKiBhcmNodXJlcy5jIChhcmNodXJlc19pbml0X3RhYmxlKTogQWRkIGJmZF9zaF9hcmNoLgotCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgY29mZi1tNjhrLm8gZm9yIG02OGtjb2ZmdW5fdmVjLgotCUluY2x1ZGUgbmxtMzIubyBhbmQgbmxtLm8gZm9yIGJmZF9ubG0zMl9pMzg2X3ZlYy4KLQlGaXggZXJyb3IgaW4gZXJyb3IgbWVzc2FnZS4KLQotCSogb2FzeXMuYzogTWFrZSBiZmRfZXJyb3JfdmVjdG9yIGV4dGVybi4KLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIHN0YWItc3ltcy5vIGZvciBhLm91dC9iLm91dCB0YXJnZXRzCi0JYW5kIGhwMzAwe2JzZCxocHV4fS4KLQotV2VkIEF1ZyAxMSAwNjo0MDo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCB0aGUgLmJzcwotCXNlY3Rpb24gYmVmb3JlIHNldHRpbmcgb3V0cHV0X2hhc19iZWd1bi4KLQkobmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogUmVtb3ZlIGFyZ3VtZW50IG5hbWVzIGZyb20KLQltYW5nbGVfcmVsb2NzX2Z1bmMgcHJvdG90eXBlLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIHNoYWRvd2luZyBsb2NhbCB2YXJpYWJsZS4KLQlEb24ndCB3cml0ZSBvdXQgZGVidWdnaW5nIHN5bWJvbHMgaWYgZGVidWdJbmZvT2Zmc2V0IGlzIC0xLiAgQWRkCi0JdGhlIGNvZGVJbWFnZU9mZnNldCB0byB0aGUgc3RhcnQsIGV4aXQsIGFuZCBjaGVjayBwcm9jZWR1cmUKLQlvZmZzZXRzLgotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl93cml0ZV9yZWxvYywgbmxtX2kzODZfbWFuZ2xlX3JlbG9jcyk6Ci0JRG9uJ3QgY2hlY2sgcGFydGlhbF9pbnBsYWNlIGZpZWxkOyBpdHMgdmFsdWUgaXMgaXJyZWxldmFudC4KLQotCSogQmFzZSB1c2Ugb2Ygc2NvLWNvcmUgb24gaG9zdCwgbm90IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0XTg2LSotc2NvKik6IFVzZSBpMzg2c2NvIHJhdGhlciB0aGFuIGkzODZ2LgotCSogY29uZmlnL2kzODYtc2NvLm10IChUREVGSU5FUyk6IFJlbW92ZWQuCi0JKiBjb25maWcvaTM4NnNjby5taDogTmV3IGZpbGUgdG8gdXNlIHNjby1jb3JlLgotCSogaG9zdHMvaTM4NnNjby5oOiBOZXcgZmlsZTsganVzdCBpbmNsdWRlcyBob3N0cy9pMzg2di5oLgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF97aGRyLGV4dH1fe2luLG91dH0pOiBVc2Ugc2lnbmVkCi0JY29udmVyc2lvbnMgZm9yIHNvbWUgZmllbGRzLgotCi1UdWUgQXVnIDEwIDEzOjMyOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZ3ByZWxfcmVsb2MpOiBJZiBfZ3AgaXMgbm90IGRlZmluZWQsIGdpdmUgYW4KLQllcnJvciByYXRoZXIgdGhhbiBhYm9ydGluZy4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogQWRkZWQgbWFjaCBmaWVsZC4KLQkobmxtX21hY2hpbmUpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBubG0uYyAobmxtX21rb2JqZWN0KTogU2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBmcm9tIGJhY2tlbmQKLQlpbmZvcm1hdGlvbi4KLQkqIG5sbTMyLWkzODYuYyAobmxtMzJfaTM4Nl9iYWNrZW5kKTogSW5pdGlhbGl6ZSBuZXcgbWFjaCBmaWVsZC4KLQotVHVlIEF1ZyAxMCAwOTozMToxOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVwbGFjZSBjYWxscyB0byBzb3J0IHdpdGggc2hlbGwgY29kZQotCXRvIHVuaXEgdGhlIGxpc3RzLgotCi1UdWUgQXVnIDEwIDA2OjIzOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGFvdXQzMi5vIGZvciBhbnkgYS5vdXQvYi5vdXQgZm9ybWF0cy4KLQotTW9uIEF1ZyAgOSAwOTozNzoxOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgYmZkX2VsZjMyX2kzODZfdmVjLgotCSogY29uZmlnL202OGstZWxmLm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgbTY4a2NvZmZfdmVjLgotCSogY29uZmlnL2kzODYtZWxmLm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgaTM4NmNvZmZfdmVjLgotCSogY29uZmlnL2hwcGEtZWxmLm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgaHBwYV92ZWMuCi0JKiBjb25maWcvc3BhcmMtZWxmLm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgc3Vub3NfYmlnX3ZlYy4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdCAoU0VMRUNUX1ZFQ1MpOiBEb24ndCBkZWZpbmU7IElhbiBzYXlzIGl0IHdhcwotCWp1c3QgYSBoYWNrLgotCi1Nb24gQXVnICA5IDEzOjE1OjAwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL204OGstY29mZi5tdCAoREVGQVVMVF9WRUMgLT4gREVGQVVMVF9WRUNUT1IpOiByZW5hbWVkLgotCi1Nb24gQXVnICA5IDE0OjI2OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3ltcy5jIChCU0ZfRVhQT1JUKTogTm93IHNhbWUgYXMgQlNGX0dMT0JBTC4KLQotCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IE5ldyBmdW5jdGlvbi4KLQotTW9uIEF1ZyAgOSAxMToyOTo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2FyY2hpdGVjdHVyZSwgYmZkX2dldF9tYWNoaW5lKTogUmVtb3ZlZAotCW9ic29sZXRlIG1hY3Jvcy4KLQkqIGJmZC1pbjIuaDogVXBkYXRlZC4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfYXJtYXApOiBDb3JyZWN0IGJ1ZyBpbiBpbml0aWFsaXphdGlvbiBvZgotCXN0cmluZ2Jhc2UuCi0KLVN1biBBdWcgIDggMTI6MjE6MTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSB1bm5lZWRlZCB0ZXN0LgotCi1TdW4gQXVnICA4IDEyOjQxOjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoe2Rpc3QscmVhbH1jbGVhbik6IFVzZSAkKE1BS0UpLCBub3QgbWFrZS4KLQotU2F0IEF1ZyAgNyAwOToxNDoyMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zdDIwMDAubXQgKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIE1SSTsgbm90IHVzZWQuCi0KLQkqIFBPUlRJTkcsIFRPRE8sIGNvbmZpZy9SRUFETUU6IFVwZGF0ZSB0byByZWZsZWN0IGJlbG93IGNoYW5nZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVwbGFjZSBNSU5JTUlaRSBhbmQgLS13aXRoLW1pbmltYWwtYmZkIHdpdGgKLQktLXdpdGgtYmZkLXRhcmdldHM9InRhcmdldDEsdGFyZ2V0MiwuLi4iIGFuZCB0aGUgc3BlY2lhbCB0YXJnZXQKLQkiYWxsIiB0byBnZXQgdGhlIHByZXZpb3VzIGRlZmF1bHQgYmVoYXZpb3IuCi0JRmlndXJlIG91dCB3aGljaCBhcmNoaXRlY3R1cmUgYW5kIGJhY2tlbmQgLm8gZmlsZXMgYXJlIG5lZWRlZCBmcm9tCi0JREVGQVVMVF9WRUNUT1IsIFNFTEVDVF9WRUNTLCBhbmQgU0VMRUNUX0FSQ0hJVEVDVFVSRVMgYXMgc2V0IGluCi0JdGhlIC5tdCBmaWxlcy4gIERlZmluZSBUREVGQVVMVFMgYmFzZWQgb24gdGhlbSwgYWxzby4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIE1JTklNSVpFLgotCSogYXJjaHVyZXMuYywgdGFyZ2V0cy5jOiBEaXR0by4KLQotCSogY29uZmlnLyoubXQ6IERlZmluZSBERUZBVUxUX1ZFQ1RPUiwgU0VMRUNUX1ZFQ1MsIGFuZAotCVNFTEVDVF9BUkNISVRFQ1RVUkVTIGFzIHZhcmlhYmxlcyByYXRoZXIgdGhhbiBhcyAtRCBhcmd1bWVudHMgdG8KLQlUREVGQVVMVFMuCi0KLQkqIGNvbmZpZy9hMjlrLWNvZmYubXQsYWxwaGFvc2YubXQsIGkzODYtc2NvLm10LCBpOTYwLWJvdXQubXQsCi0JaTk2MC1jb2ZmLm10IChUREVGQVVMVFMpOiBEb24ndCBwdXQgdGhlIGRlZmF1bHQgdmVjdG9yIGluCi0JU0VMRUNUX1ZFQ1MgbWFudWFsbHk7IGl0J3MgYXV0b21hdGljIG5vdy4KLQotCSogY29uZmlnL2kzODYtc2NvLm10IChUREVGQVVMVFMpOiBEb24ndCBwdXQgJnNjb19jb3JlX3ZlYyBpbgotCVNFTEVDVF9WRUNTIG1hbnVhbGx5OyAtRFNDT19DT1JFIGRvZXMgaXQgYXV0b21hdGljYWxseSBub3cuCi0KLQkqIGNvbmZpZy9oODMwMC1jb2ZmLm10LGg4NTAwLWNvZmYubXQsc2gtY29mZi5tdCxzdDIwMDAubXQsejhrLWNvZmYubXQKLQkoVERFRkFVTFRTKTogRG9uJ3QgZGVmaW5lIEJGRDsgbm90IHVzZWQuCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChIREVGSU5FUyk6IERvbid0IGRlZmluZSBTRUxFQ1RfQVJDSElURUNUVVJFUzsKLQl0aGlzIGlzIGEgaG9zdCwgbm90IGEgdGFyZ2V0LgotCi1TYXQgQXVnICA3IDA1OjI4OjAzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6ICBBZGQgY29tbWVudCBhYm91dCB3aGF0IHRoaXMgZnVuY3Rpb24KLQlkb2VzIGFuZCB0byB3YXRjaCBvdXQgZm9yIHNpZGUgZWZmZWN0cy4gIEFkZCBGSVhNRSBmb3IgbWVtb3J5IGxlYWtzLgotCUZpeCBjb21tZW50IGFib3V0IGNoZWNraW5nIGZvciBtYXRjaGluZyBieXRlIG9yZGVyLiAgUHJlc2VydmUKLQlwb2ludGVyIHRvIG9sZCB0ZGF0YSAoaWYgYW55KSwgYW5kIHJlc3RvcmUgaXQgaWYgd2UgZG9uJ3QgbWF0Y2gKLQlmaWxlIHdpdGggdGFyZ2V0IHZlY3Rvci4gIElmIHdlIGFyZSBnb2luZyB0byB1c2UgZ290bydzLCB1c2UgdGhlbQotCWNvbnNpc3RlbnRseSBhbmQgbWFpbnRhaW5hYmx5LgotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiAgRXhwYW5kIGNvbW1lbnRzIGFib3V0IGxlYWtlZCBtZW1vcnkKLQl0byBub3RlIHRoYXQgdGhlIHByb2JsZW0gaXMgZXZlbiBtb3JlIHNlcmlvdXMgdGhhbiBqdXN0IGxlYWtlZAotCW1lbW9yeS4gIFJlcGxhY2UgZ290byB3aXRoIG1vcmUgdHJhZGl0aW9uYWwgcmV0dXJuLgotCi1GcmkgQXVnICA2IDEyOjAwOjAzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUZpeCBpbmNvcnJlY3Qgb3IgdXNlbGVzcyBtYWtlZmlsZSB2YXJpYWJsZSBkZWZpbml0aW9uczoKLQkqIGNvbmZpZy9uZXdzLm10LCBjb25maWcvdTY4ay1jb2ZmLm10IChUREVGQVVMVFMpOiBVc2UgdGhpcyB0bwotCWRlZmluZSBERUZBVUxUX1ZFQ1RPUiwgaW5zdGVhZCBvZiBUREVGSU5FUy4KLQkqIGNvbmZpZy9pMzg2YWl4Lm1oIChNSU5JTUlaRSk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChNSU5JTUlaRSk6IERvbid0IGNvbmRpdGlvbmFsaXplLgotCSogY29uZmlnL3JzNjAwMC5taCAoQUxMT0NBKSwKLQkqIGNvbmZpZy9pMzg2di5taCAoQUxMT0NBKSwKLQkqIGNvbmZpZy9pMzg2bGludXgubWggKEFMTE9DQSksCi0JKiBjb25maWcvaTM4NmlzYy5taCAoQUxMT0NBKSwKLQkqIGNvbmZpZy9nbzMyLm1oIChFWFRSQUxJQlMpOiBEb24ndCBkZWZpbmU7IG5vdCB1c2VkLgotCSogY29uZmlnL3NvbGFyaXMyLm1oIChIREVGSU5FUyk6IFJlbmFtZWQgZnJvbSBIX0RFRklORVMuCi0JKiBjb25maWcvYWxwaGFvc2YubXQgKFRERUZJTkVTKTogU2V0IGl0LCBub3QgSERFRklORVMuCi0JKiBjb25maWcvejhrLWNvZmYubXQgKENDKTogRG9uJ3QgZGVmaW5lLiAgSXQncyBhIHRhcmdldCwgbm90IGEgaG9zdC4KLQotCSogY29uZmlnL1JFQURNRTogTmV3IGZpbGUsIGV4cGxhaW5pbmcgdGhlIHZhcmlhYmxlcy4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogQWRkIGhwMzAwX2JzZF92ZWMuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMsIENGSUxFUyk6IEFkZCBocDMwMGJzZC4KLQkoaHAzMDBic2Qubyk6IE5ldyBydWxlLgotCi1GcmkgQXVnICA2IDE1OjEzOjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKE5BTUUpOiBQcm92aWRlIGEgZGVmYXVsdCBkZWZpbml0aW9uLCB0aGF0J3MgbmVpdGhlcgotCWZvciAzMiBiaXRzIG5vciBmb3IgNjQuCi0KLQlUdWUgSnVuIDE1IDE0OjM4OjMyIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBsaWJlbGYuaCAoZWxmX2hhc2gpOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gYmZkX2VsZl9oYXNoLCBzaW5jZQotCXRoYXQgaXMgd2hhdCBpcyBpbiBlbGYuYy4KLQotRnJpIEF1ZyAgNiAxMjoyODozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbW92ZWQgc3BlY2lhbCBoYW5kbGluZyBmb3IKLQlzY0JzcyBhbmQgc2NTQnNzIHN5bWJvbHMsIHNpbmNlIGl0IHdhcyB3cm9uZy4KLQotCSogTWFrZWZpbGUuaW4gKGNvZmYtbWlwcy5vLCBjb2ZmLWFscGhhLm8pOiBEb24ndCBkZXBlbmQgb24KLQljb2ZmY29kZS5oLgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IEluc3BpcmVkIGJ5IG1iQHR0aS5DT00gKE1pY2hhZWwKLQlCbG9vbSk6IE9ubHkgc2V0IFNUWVBfQlNTIGZvciBTRUNfQUxMT0Mgc2VjdGlvbnMuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX2FybWFwKTogRnJvbSBBcm5lIEhlbnJpayBKdXVsCi0JPGFybmVqQGthcmkuZm0udW5pdC5ubz46IEhhbmRsZSBhIENPRkYgc3R5bGUgYXJtYXAuCi0KLUZyaSBBdWcgIDYgMDk6NTk6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhwdXgtY29yZS5jOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tIGJmZF96YWxsb2MuCi0KLVRodSBBdWcgIDUgMTM6MjI6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChsb2cyKTogRGVsZXRlIGkzODctc3BlY2lmaWMgY29kZS4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWx3YXlzIGluY2x1ZGUgZWxmLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogRG9uJ3QgaW5jbHVkZSBlbGYubyBoZXJlLgotCShvZmlsZXMpOiBEZWxldGUgcmVmZXJlbmNlcyB0byBvZmlsZXMyIGFuZCBvZmlsZXMzLgotCShkb19jbGVhbik6IERlbGV0ZSBvZmlsZXMuCi0JKEJGRElOX0gpOiBDaGFuZ2VkIHJlZmVyZW5jZXMgdG8gJChzcmNkaXIpL2JmZC1pbjIuaC4KLQkoc3RtcC1iZmQuaCk6IFVzZSBiZmQuaC1uZXcgYXMgdGVtcG9yYXJ5IG5hbWUsIG5vdCBiZmQuaDIuCi0JKGhlYWRlcnMpOiBVc2UgYmZkLWluMi5oLW5ldyBhcyB0ZW1wb3JhcnkgbmFtZSwgbm90IGJmZC5oLW5ldy4KLQotCSogYmZkLWluLmg6IFJld29yZGVkIGNvbW1lbnQgdG8gbWFrZSBpdCBjbGVhciB0aGF0IGJmZC1pbjIuaCBpcyBhCi0JZ2VuZXJhdGVkIGZpbGUuCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkIGkzODYtZWxmIHJlbG9jIHR5cGVzCi0JKGZyb20gTWVpc3NuZXIncyBhZGRpdGlvbnMgdG8gYmZkLWluMi5oKS4KLQotCSogZWxmMzItaTM4Ni5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQlNZXJnZWQ6Ci0KLQlXZWQgSnVuIDIzIDA2OjA1OjU4IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBkcm9wIGNvcmUgaWYKLQllbGZfc3ltYm9sX2Zyb20gcmV0dXJucyBhIE5VTEwgcG9pbnRlciB3aGVuIHByb2Nlc3NpbmcgYSBub24tZWxmCi0Jc3ltYm9sLCB1c2UgYSAwIHNpemUgaW5zdGVhZC4KLQotCVR1ZSBKdW4gMTUgMTQ6Mzg6MzIgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2hhc2gpOiBEZWxldGUgbWFjcm8gbWFwcGluZyBlbGZfaGFzaCB0bwotCWJmZF9lbGYzMl9oYXNoLCBzaW5jZSB0aGUgaGFzaCB0YWJsZSBpcyBpbmRlcGVuZGVudCBvZiB0aGUgMzIvNjQKLQliaXQgc3lzdGVtLgotCi0JKiBsaWJlbGYuaCAoZWxmX2hhc2gpOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gYmZkX2VsZl9oYXNoLCBzaW5jZQotCXRoYXQgaXMgd2hhdCBpcyBpbiBlbGYuYy4KLQotCVNhdCBKdW4gMTkgMTA6MTI6MjcgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZjMyLWkzODYuaCAocmVsb2NfdHlwZSk6IFJlZm9ybWF0IHNwYWNpbmcuCi0JKGVsZl9ob3d0b190YWJsZSk6IEFkZCB0aGUgcmVzdCBvZiB0aGUgMzg2L0VMRiByZWxvY2F0aW9ucy4KLQkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0byk6IERpdHRvLgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCk6IERpdHRvLgotCi1UaHUgQXVnICA1IDEwOjA3OjQzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiAgVGVzdCByZXR1cm4gdmFsdWUKLQlvZiBubG1fc2x1cnBfc3ltYm9sX3RhYmxlIGFzIGJvb2xlYW4sIG5vdCBwb2ludGVyLgotCSogbmxtY29kZS5oIChubG1fY2Fub25pY2FsaXplX3JlbG9jKTogIFRlc3QgcmV0dXJuIHZhbHVlCi0Jb2YgbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyBhcyBib29sZWFuLCBub3QgcG9pbnRlci4KLQotV2VkIEF1ZyAgNCAxNjoyMjo1NSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiByZW1vdmUgSERFRklORVM7IHNpbmNlIF9fTVNET1NfXyBhbmQgX19HTzMyX18KLQlhcmUgbm93IHByZWRlZmluZWQgYnkgR0NDCi0KLVdlZCBBdWcgIDQgMTY6MDY6MjkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQWRkIHRoZSBzZWN0aW9uIG9mZnNldCB0byB0aGUKLQlsaW5lIG51bWJlciBhZGRyZXNzLCBzbyBpdCdzIHByaW50ZWQgdGhlIHNhbWUgd2F5IGFzIHRoZSBmdW5jdGlvbgotCWFkZHJlc3MuICBPbmx5IHNob3dlZCB1cCBmb3IgbGluZSBudW1iZXJzIHRoYXQgYXJlbid0IGluIHRoZSBmaXJzdAotCXNlY3Rpb24gKC50ZXh0KS4KLQotV2VkIEF1ZyAgNCAwODozMzo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYm5sbS5oIChubG1fYmFja2VuZF9kYXRhKTogQWRkZWQgbmxtX21hbmdsZV9yZWxvY3MuCi0JKG5sbV9tYW5nbGVfcmVsb2NzX2Z1bmMpOiBOZXcgbWFjcm8uCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3dyaXRlX3JlbG9jKTogUmV3cm90ZSBjb3JyZWN0bHkuCi0JKG5sbV9pMzg2X21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBubG1jb2RlLmggKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBNb3ZlIGFsbCBjb21tb24KLQlzeW1ib2xzIGludG8gdGhlIC5ic3Mgc2VjdGlvbi4KLQkobmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCB0aGUgbWFuZ2xlX3JlbG9jcyBmdW5jdGlvbi4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhbnkgZGVmaW5lZAotCXN5bWJvbCBhcyBhbiBpbnRlcm5hbCByZWxvYy4gIEZpeCBidWcgaW4gZXh0ZXJuYWwgcmVsb2MgY291bnRpbmcuCi0JR2V0IHRoZSBvZmZzZXQgYW5kIGRlYnVnZ2luZyB0eXBlIHJpZ2h0IGZvciAuYnNzIHN5bWJvbHMuICBPbmx5Ci0Jb3V0cHV0IGRlYnVnZ2luZyBzeW1ib2xzIGZvciBkZWZpbmVkIHN5bWJvbHMuCi0KLQkqIGNvZmYtaDg1MDAuYyAocnR5cGUyaG93dG8pOiBEbyBhbiBmcHJpbnRmIHRvIHN0ZGVyciByYXRoZXIgdGhhbgotCXVzaW5nIHByaW50Zi4KLQkqIGNvZmYtejhrLmMgKHJ0eXBlMmhvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKFRSQUNFKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSwgc3dhcF9zdGRfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBEbyBhbiBmcHJpbnRmIHRvIHRoZSBmaWxlCi0JYXJndW1lbnQgcmF0aGVyIHRoYW4gdXNpbmcgcHJpbnRmLgotCi1UdWUgQXVnICAzIDE4OjE3OjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZnN3YXAuaDogQWRkZWQgbWFjcm9zIHVzZWQgd2hlbiBhY2Nlc3Npbmcgc2V2ZXJhbCBmaWVsZHM7Ci0JZGVmYXVsdCBpcyB0aGUgc2FtZSBhcyBiZWZvcmUuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX3tpbixvdXR9KTogSGFuZGxlIHRoZSBBbHBoYSBFQ09GRiBmaWVsZHMuCi0JKiBjb2ZmLWFscGhhLmM6IERlZmluZWQgbWFjcm9zIHRvIHVzZSB0aGUgcmlnaHQgc2l6ZXMgaW4KLQljb2Zmc3dhcC5oLgotCSogbGliZWNvZmYuaDogQmFja2VuZCBpbmZvcm1hdGlvbiBpcyBub3cgaW4gdGFyZ2V0IHZlY3Rvciwgbm90Ci0JQkZELiAgU3RhcnQgb2YgYmFja2VuZCBpbmZvcm1hdGlvbiBpcyBDT0ZGIGJhY2tlbmQgaW5mb3JtYXRpb24uCi0JKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3QpOiBOZXcgZnVuY3Rpb24uCi0JKEFSTUFQX1NUQVJUKTogQ2hhbmdlZCBpbnRvIGJhY2tlbmQgaW5mb3JtYXRpb24sIHNpbmNlIEFscGhhIHVzZXMKLQlhIGRpZmZlcmVudCBuYW1lLgotCShlY29mZl9zbHVycF9hcm1hcCk6IERvbid0IG92ZXJsYXkgYXJjaGl2ZSBoZWFkZXIuCi0JKiBiZmQuYzogSW5jbHVkZSBsaWJjb2ZmLmguCi0KLVR1ZSBBdWcgIDMgMTY6MzM6MTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEZpeCBzaCBzeW50YXggZXJyb3IuCi0KLQkqIGFvdXRmMS5oOiBNYWtlIGJmZF9lcnJvcl90cmFwIGV4dGVybjsgaXQncyBkZWZpbmVkIGluIGJmZC5jLgotCi1UdWUgQXVnICAzIDE1OjE5OjA5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1fc2x1cnBfc3ltYm9sX3RhYmxlOiBEb24ndCB1c2UgJyYnIG9uIGFycmF5cy4KLQotVHVlIEF1ZyAgMyAxMTowNjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmM6IE5ldyBmaWxlIGZvciBnZW5lcmljIEVDT0ZGIGZ1bmN0aW9ucy4KLQkqIGVjb2Zmc3dhcC5oOiBOZXcgZmlsZSBmb3IgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zIHdoaWNoIGRpZmZlcgotCW9ubHkgc2xpZ2h0bHkgZm9yIGRpZmZlcmVudCB0YXJnZXRzLgotCSogbGliZWNvZmYuaDogQWRkZWQgcHJvdG90eXBlcyBmb3IgZWNvZmYuYyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGVjb2ZmX3RkYXRhKTogQWRkZWQgYmFja2VuZF9kYXRhIGZpZWxkLiAgQ2hhbmdlZCBleHRlcm5hbCBkYXRhCi0JcG9pbnRlcnMgdG8gYmUgUFRSIHJhdGhlciB0aGFuIHRvIGEgcGFydGljdWxhciBzdHJ1Y3QuCi0JKGVjb2ZmX3N5bWJvbF9zdHJ1Y3QpOiBNb3ZlZCBpbiBmcm9tIGNvZmYtbWlwcy5jLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYzogTW92ZWQgY29tbW9uIGZ1bmN0aW9ucyBpbnRvIGVjb2ZmLmMuCi0JQWRkZWQgRUNPRkYgYmFja2VuZCBzdHJ1Y3R1cmVzLiAgSW5jbHVkZSBlY29mZnN3YXAuaC4KLQkqIGNvZmYtbXN5bS5jOiBSZW1vdmVkOyBzdXBlcnNlZGVkIGJ5IGVjb2Zmc3dhcC5oLgotCSogYmZkLmM6IEluY2x1ZGUgY29mZi9pbnRlcm5hbC5oLgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogUmVtb3ZlZCBjb2ZmLW1pcHMubyBhbmQgY29mZi1tc3ltLm8uCi0JQWRkZWQgZWNvZmYuby4KLQkoQkZENjRfQkFDS0VORFMpOiBBZGRlZCBjb2ZmLWFscGhhLm8uCi0JKENGSUxFUyk6IFJlbW92ZWQgY29mZi1tc3ltLmMuICBBZGRlZCBlY29mZi5jLgotCShiZmQubyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gJChJTkNESVIpL2NvZmYvc3ltLmguCi0JKGNvZmYtbWlwcy5vKTogQWRkZWQgZGVwZW5kZW5jeSBvbiBlY29mZnN3YXAuaCBhbmQgY29mZi9lY29mZi5oLgotCShlY29mZi5vLCBjb2ZmLWFscGhhLm8pOiBOZXcgdGFyZ2V0cy4KLQkoY29mZi1tc3ltLm8pOiBSZW1vdmVkIHRhcmdldC4KLQotTW9uIEF1ZyAgMiAyMzozMzozOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5oLCBob3N0cy8qOiAgUmVtb3ZlIChvbmUgbW9yZSB0aW1lKSBhbGwgb2NjdXJyYW5jZXMKLQlvZiBFWEZVTiBpbiB0aGUgQkZEIHNvdXJjZXMuICBIZWF2ZSBobyEKLQotTW9uIEF1ZyAgMiAxNjo0NTo1NyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6ICBBZGQgY2hlY2sgZm9yIEkzODZMWU5YTUFHSUMuCi0KLU1vbiBBdWcgIDIgMTI6MTg6MDMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IHJlbW92ZSBzb21lIG1vcmUgY29uZmxpY3RpbmcgZGVjbHMKLQotTW9uIEF1ZyAgMiAxMTo0ODoyMyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBpMzg2bHlueC5jOiAgUmVtb3ZlIHVubmVjZXNzYXJ5IGRlZiBvZiBOX0hFQURFUl9JTl9URVhULAotCXJlZGVmaW5lIFRFWFRfU1RBUlRfQUREUiB0byBiZSAwLgotCi1TdW4gQXVnICAxIDIyOjU0OjA4IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUuaW4sIGhvc3RzL2kzODZseW54Lmg6ICBMeW54LzM4NgotCWhvc3QgYW5kIHRhcmdldCBpbmZvLgotCi1GcmkgSnVsIDMwIDE4OjA4OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtMzItaTM4Ni5jOiBOZXcgZmlsZS4gIEZpcnN0IGN1dCBhdCBpMzg2IE5MTSBjb2RlLgotCSogbGlibmxtLmg6IEFkZGVkIHNvbWUgbW9yZSBwcm90b3R5cGVzLgotCShzdHJ1Y3QgbmxtX3JlbGVudCk6IE5ldyBzdHJ1Y3R1cmUuCi0JKG5sbU5BTUUoc3ltYm9sX3R5cGUpKTogQWRkZWQgcmNudCBhbmQgcmVsb2NzIGZpZWxkcy4KLQkoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBBZGRlZCBuZXcgZmllbGRzOiBubG1fc3ltYm9scywKLQlubG1fdGV4dF9sb3csIG5sbV9kYXRhX2xvdywgbmxtX3JlbG9jX2ZpeHVwcywKLQlubG1fcmVsb2NfZml4dXBfc2Vjcy4KLQkoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBOZXcgc3RydWN0dXJlLCB3aXRoIGFjY2Vzc29yIG1hY3Jvcy4KLQkqIG5sbWNvZGUuaDogVXNlIE5MTV9ISUJJVCByYXRoZXIgdGhhbiBNU0IuCi0JKG5sbV9vYmplY3RfcCk6IFNldCBTRUNfUkVMT0MgZm9yIC50ZXh0IGFuZCAuZGF0YS4gIERvbid0IHNldAotCVNFQ19EQVRBIGZvciAuYnNzLiAgU2V0IEhBU19SRUxPQyBhbmQgSEFTX1NZTVMgZm9yIGFiZmQuICBTZXQgdGhlCi0JYXJjaGl0ZWN0dXJlLgotCShubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LCBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0LAotCWZpbmRfbm9uemVybywgbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogTmV3IG91dGJvdW5kCi0Jc3dhcHBpbmcgZnVuY3Rpb25zLgotCShubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgbmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IEluY2x1ZGUKLQlleHRlcm5hbCByZWZlcmVuY2VzIGluIHN5bWJvbCB0YWJsZSBhcyB1bmRlZmluZWQgc3ltYm9scy4KLQkobmxtX2dldF9zeW10YWIsIG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBGaWxsIGluIGFsb2NhdGlvbgotCWFyZ3VtZW50IGluIGdldF9zeW10YWIgcmF0aGVyIHRoYW4gaW4gc2x1cnBfc3ltYm9sX3RhYmxlLgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2F2ZSBzeW1ib2wgaW5mb3JtYXRpb24gaW4gdGRhdGEuCi0JKG5sbV9wcmludF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKG5sbV9zbHVycF9yZWxvY19maXh1cHMsIG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQsCi0JbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IE5ldyBmdW5jdGlvbnMgdG8gcmVhZCByZWxvY3MuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cywKLQlubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSwgbmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE5ldwotCWZ1bmN0aW9ucyB0byBjcmVhdGUgTkxNIGZpbGVzLgotCSogbmxtLXRhcmdldC5oOiBEZWZpbmUgYWxsIHRoZSBubG0gZnVuY3Rpb25zIGhlcmUgZWl0aGVyIGFzCi0JZGVmYXVsdCB2YWx1ZXMgb3IgaW4gdGVybXMgb2YgbmxtTkFNRS4gIFVzZSBKVU1QX1RBQkxFKG5sbSkuICBTZXQKLQl0aGUgYmFja2VuZF9kYXRhIGZpZWxkIHRvIFRBUkdFVF9CQUNLRU5EX0RBVEEuCi0JKiBubG0zMi1nZW4uYywgbmxtNjQtZ2VuLmM6IERvbid0IGRlZmluZSBmdW5jdGlvbiBtYWNyb3MgaGVyZTsKLQl0aGV5IGFyZSBub3cgaW4gbmxtLXRhcmdldC5oLgotCShUQVJHRVRfQkFDS0VORF9EQVRBKTogRGVmaW5lIGFzIE5VTEwuCi0JKiBubG0uYyAobmxtX21rb2JqZWN0KTogRG8gYWxsb2NhdGUgdGhlIHRkYXRhIGZpZWxkLgotCShubG1fc2V0X2FyY2hfbWFjaCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRhcmdldHMuYzogQWRkZWQgbmxtMzJfaTM4Nl92ZWMuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGRlZCBubG0zMi1pMzg2Lm8uCi0JKENGSUxFUyk6IEFkZGVkIG5sbTMyLWkzODYuYy4KLQkobmxtMzItZ2VuLm8sIG5sbTY0LWdlbi5vKTogRGVwZW5kIG9uIG5sbS10YXJnZXQuaC4KLQkobmxtMzItaTM4Ni5vKTogTmV3IHRhcmdldC4KLQotVGh1IEp1bCAyOSAyMDoyMDozOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogcmVtb3ZlIHNvbWUgZnVuY3Rpb24gZGVjbHMgdGhhdCBjb25mbGljdCB3LyBBTlNJCi0JQywgYW5kIGFyZW4ndCBuZWVkZWQgYW55d2F5IChyZXR1cm4gaW50KQotCi1XZWQgSnVsIDI4IDE1OjQ2OjM4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oOiBVc2UgY2FzdHMgd2l0aCBiZmRfYWxsb2MgYW5kIGFsbG9jYS4KLQotVHVlIEp1bCAyNyAxMjo1MTo0MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtezMyLDY0fS1nZW4uYyAoSlVNUF9UQUJMRV9QUkVGSVgpOiAgRGVsZXRlLgotCSogbmxtezMyLDY0fS1nZW4uYyAoSlVNUF9UQUJMRV9JTklUKTogIE5ldyBtYWNybyB0aGF0IHdvcmtzIHdpdGgKLQlvbGRlciBjcHAncywgdGhhdCBkb24ndCBkbyBhZGRpdGlvbmFsIHJlcGxhY2VtZW50IG9uIHRoZSBKVU1QX1RBQkxFCi0JbWFjcm8ncyBhcmd1bWVudC4KLQkqIG5sbS10YXJnZXQuaCAoSlVNUF9UQUJMRV9JTklUKTogIFVzZSBuZXcgbWFjcm8gaW4gcGxhY2Ugb2YKLQlKVU1QX1RBQkxFIG1hY3JvLgotCi1Nb24gSnVsIDI2IDE3OjM5OjAxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JWWV0IGFub3RoZXIgdHJhZC1jb3JlIHZhcmlhbnQ6Ci0JKiBjb25maWcvZXNpeC5taCwgaG9zdHMvZXNpeC5oOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaG9zdHM6IFVzZSB0aGVtLgotCi1Nb24gSnVsIDI2IDEzOjIyOjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSB0aGUgY2FzZSBvZgotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCByaWdodHNoaWZ0ID4gYml0cG9zLCBhbmQgYSBuZWdhdGl2ZQotCW51bWJlci4KLQotTW9uIEp1bCAyNiAxNDo0MDoxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogUmVpbXBsZW1lbnQgc2VnbWVudCB3cml0aW5nLgotCShlbGZfd3JpdGVfcGhkcnMpOiBVc2UgcHJlY29tcHV0ZWQgZV9waG9mZiByYXRoZXIgdGhhbiBtYWtpbmcKLQlhc3N1bXB0aW9ucy4KLQkoZWxmX2J1aWxkX3BoZHJzKTogRGlzYWJsZWQsIGZvciBub3cuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogRG9uJ3QgY2hhbmdlIGZpbGUgb2Zmc2V0IGZvcgotCVNIVF9OT0JJVFMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc3ltdGFiX2FuZF9zdHJ0YWJzKTogTmV3IGZ1bmN0aW9uLgotCShzdHJ1Y3Qgc2VnX2luZm8pOiBOZXcgdHlwZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRm9yIGV4ZWN1dGFibGVzLCBsZWF2ZQotCXNlY3Rpb24gaGVhZGVycyAmYyBmb3IgbGFzdCwgYW5kIHByb3Blcmx5IGFsaWduIGFsbCBzZWN0aW9ucyB3aXRoCi0JZmxhZyBTSEZfQUxMT0Mgc2V0LgotCShwcmVwX2hlYWRlcnMpOiBObyBsb25nZXIgYWJvcnQgd2hlbiBFWEVDX1AgaXMgc2V0LgotCSh3cml0ZV9zaGRyc19hbmRfZWhkcik6IERlbGV0ZWQgYWxsIGNvZGUgcmVsYXRpbmcgdG8gcHJvZ3JhbQotCXNlZ21lbnRzLgotCi0JKiBlbGZjb2RlLmggKHZhcmlvdXMpOiBEZWxldGVkIHNvbWUgdW51c2VkIGNvZGUsIGFuZCBkZWJ1Z2dpbmcKLQkibWFsbG9jKDApIiBjYWxscy4KLQkod3JpdGVfcmVsb2NzKTogQ2FjaGUgdmFsdWUgb2YgbGFzdCBzeW1ib2wgbG9va2VkIHVwLCB0byBzYXZlCi0JdGltZSBpZiB0aGUgc3ltYm9sIGlzIHJlZmVycmVkIHRvIHJlcGVhdGVkbHkuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgb25seSBTRUNfUkVMT0MgZmxhZywgbm90IG51bWJlciBvZgotCXJlbG9jcy4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbiAob2ZpbGVzKTogU3RhcnMgaW4gd2lsZGNhcmRzIGJlbG9uZyBvdXRzaWRlIHF1b3Rlcy4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkLCBtYXhwYWdlc2l6ZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgZmllbGQsIHBoZHIuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBtYXhwYWdlc2l6ZSBmcm9tCi0JRUxGX01BWFBBR0VTSVpFLgotCShFTEZfTUFYUEFHRVNJWkUpOiBEZWZhdWx0IHRvIDEuCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmNjRfYmVkLCBFTEZfTUFYUEFHRVNJWkUpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQkoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogQWxsIHJlbG9jcyBzaG91bGQgaGF2ZSBwY3JlbF9vZmZzZXQ9dHJ1ZS4KLQlNb3N0IHNob3VsZCBoYXZlIGxlbmd0aCBmaWVsZCBvZiBgMicuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgNjQtYml0IHJlbG9jcy4KLQotCSogY29uZmlnL3NwYXJjLWFvdXQubXQgKFRBUkdFVF9CQUNLRU5EUyk6IERlZmluZS4KLQotTW9uIEp1bCAyNiAwODo1NjoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgbG9vayBpbiAke3NyY2Rpcn0gZm9yICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9OwotCXRoZSB0b3AgbGV2ZWwgc2NyaXB0IGhhcyBhbHJlYWR5IGFkanVzdGVkIGZvciBpdC4KLQotTW9uIEp1bCAyNiAwODowOToxOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfc3ltYm9scyk6ICBHZXQgQ1IgTEYgaW4gdGhlIHJpZ2h0IG9yZGVyLgotCi1Nb24gSnVsIDI2IDAyOjA4OjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy92YXhic2QuaDogSW5jbHVkZSBzdGQtaG9zdC5oLiAgRG9uJ3QgaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPi4KLQotU2F0IEp1bCAyNCAxNjoxMzowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgY2FzZSBvZiByaWdodHNoaWZ0ICE9Ci0JYml0cG9zIHdoZW4gb3ZlcmZsb3cgY2hlY2tpbmcuCi0KLUZyaSBKdWwgMjMgMTA6MjA6MjcgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sIGJmZF91bmRlZmluZWRfc3ltYm9sLAotCWJmZF9yZWxvY192YWx1ZV90cnVuY2F0ZWQsIGJmZF9yZWxvY19pc19kYW5nZXJvdXMsIGJmZF9hc3NlcnQpOgotCVNlbmQgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyLgotCi1UaHUgSnVsIDIyIDE1OjU3OjI5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG17MzIsNjR9LXRhcmdldC5oOiAgUmVtb3ZlLgotCSogbmxtLXRhcmdldC5oOiAgTmV3IGZpbGUsIG1lcmdlZCBmcm9tIG5sbXszMiw2NH0tdGFyZ2V0LmgKLQkqIGxpYm5sbS5oIChOTE1fQVJDSF9TSVpFKTogIERlZmluZSB0byBBUkNIX1NJWkUuCi0JKiBubG0uYyAoQVJDSF9TSVpFKTogIFJlbW92ZSBkZWZpbmUgdG8gemVyby4KLQkqIG5sbTMyLWdlbi5jIChBUkNIX1NJWkUpOiAgRGVmaW5lIHRvIDMyLgotCSogbmxtMzItZ2VuLmMgKEpVTVBfVEFCTEVfUFJFRklYKTogIERlZmluZSB0byBubG0zMi4KLQkqIG5sbXszMiw2NH0tZ2VuLmMgKG5sbS10YXJnZXQuaCk6ICBJbmNsdWRlLgotCSogdGFyZ2V0cy5jLCBsaWJubG0uaCwgbmxtLmMsIG5sbXszMiw2NH0tZ2VuLmMsIG5sbXszMiw2NH0uYywKLQlubG1jb2RlLmg6ICBDb252ZXJ0IHByZWZpeGVzIGZyb20gYmZkX25sbTxzaXplPiB0byBqdXN0Ci0JbmxtPHNpemU+LCBhbmQgdXNlIG1hY3JvcyBzZWxlY3Qgc2l6ZS4KLQotVGh1IEp1bCAyMiAxNTo0MDoxNCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IGFkZCBjb25maWd1cmUuaW4sIGRyb3AgcmVkdW5kYW50Ci0JICAkKHNyY2RpciksIGRyb3AgcmVkdW5kYW50IC4vCi0KLVRodSBKdWwgMjIgMTM6MzQ6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBocHV4LWNvcmUuYzogTmV3IGZpbGU7IGJhY2tlbmQgZm9yIEhQL1VYIHN0eWxlIGNvcmUgZmlsZXMuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBSZW5hbWVkIGhwcGFfY29yZV9kYXRhIGZpZWxkIHRvCi0JaHB1eF9jb3JlX2RhdGEuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQuCi0JKiBocHBhLmMgKG1ha2VfYmZkX2FzZWN0aW9uLCBocHBhX2NvcmVfZmlsZV9wLAotCWhwcGFfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwgaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwsCi0JaHBwYV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBNb3ZlZCBpbnRvIGhwdXgtY29yZS5jLgotCVJlbW92ZWQgZnJvbSB0YXJnZXQgdmVjdG9yLgotCSogbGliaHBwYS5oIChzdHJ1Y3QgaHBwYV9jb3JlX3N0cnVjdCBhbmQgYWNjZXNzb3IgbWFjcm9zKTogTW92ZWQKLQlpbnRvIGhwdXgtY29yZS5jLgotCSogdGFyZ2V0cy5jOiBJZiBIUFVYX0NPUkUgaXMgZGVmaW5lZCwgYWRkIGhwdXhfY29yZV92ZWMgdG8KLQl0YXJnZXQgbGlzdC4KLQkqIGNvbmZpZy9ocDMwMC5taCAoSERFRklORVMpOiBTZXQgdG8gLURIUFVYX0NPUkUuCi0JKEhERVBGSUxFUyk6IFNldCB0byBocHV4LWNvcmUuby4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oLCBjb25maWcvaHBwYWhwdXgubWg6IExpa2V3aXNlLgotCSogaG9zdHMvaHAzMDAuaCAoSE9TVF9IUDMwMEhQVVgpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiBBZGRlZCBzY28tY29yZS5vLAotCWFpeDM4Ni1jb3JlLm8sIGhwdXgtY29yZS5vLgotCShzY28tY29yZS5vLCBhaXgzODYtY29yZS5vLCBocHV4LWNvcmUubyk6IE5ldyBkZXBlbmRlbmNpZXMuCi0KLQkqIHJlbG9jLmMgKGVudW0gY29tcGxhaW5fb3ZlcmZsb3cpOiBOZXcgZW51bWVyYXRpb24gd2l0aCB0aGUKLQl2YXJpb3VzIGZsYXZvdXJzIG9mIG92ZXJmbG93IGNoZWNraW5nLgotCShzcnR1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogQ2hhbmdlZCBjb21wbGFpbl9vbl9vdmVyZmxvdyBmaWVsZAotCWZyb20gYm9vbGVhbiB0byBlbXVtIGNvbXBsYWluX292ZXJmbG93LiAgUmVtb3ZlZCBvYnNvbGV0ZSBhYnNvbHV0ZQotCWZpZWxkLgotCShIT1dUTyk6IFJlbW92ZWQgYWJzb2x1dGUgYXJndW1lbnQuCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEbyBvdmVyZmxvdyBjaGVja2luZyBvbiBhbGwgdHlwZXMgb2YKLQlmaWVsZHMuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0JKiBhbGwgdGFyZ2V0czogVXBkYXRlZCBpbml0aWFsaXphdGlvbiBvZiByZWxvYyBob3d0byB0YWJsZXMuCi0KLVdlZCBKdWwgMjEgMjA6MzQ6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2NyZWF0ZSk6IERvbid0IHVzZSBDKysga2V5d29yZCAidGVtcGxhdGUiIGFzIGEgQwotCXZhcmlhYmxlIG5hbWUuCi0KLVR1ZSBKdWwgMjAgMTU6MDI6MjMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jIChtNjhrX2hvd3RvMnJ0eXBlKTogIE1ha2UgYXJnIENPTlNUIHRvIG1hdGNoIGNhbGxlcnMuCi0KLQkqIGVsZmNvZGUuaDogIEZpeCBzZXZlcmFsIGlsbGVnYWwgcG9pbnRlciBjb21iaW5hdGlvbiB3YXJuaW5ncyBmb3IKLQl1c2FnZXMgb2YgYmZkX2FsbG9jIGFuZCBhbGxvY2EuCi0KLQkqIGxpYm5sbS5oIChubG1fb2JqX3RkYXRhKTogIFJlbmFtZSBoaWRkZW4gc3RydWN0IG1lbWJlcnMgdG8gYXZvaWQKLQlhcHBhcmVudCBTdW4gQyBwcmVwcm9jZXNzb3IgcmVjdXJzaW9uLiAgRml4IGFjY2VzcyBtYWNyb3MuCi0JKiBubG1jb2RlLmg6ICBSZW1vdmUgc3B1cmlvdXMgJyYnIGJlZm9yZSBzZXZlcmFsIGFycmF5IHJlZmVyZW5jZXMuCi0KLVR1ZSBKdWwgMjAgMTQ6MzY6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBmb3IgRE9TIHVuaXF1ZW5lc3M6IGNvZmYtbTY4ay11bi5jIC0+IGNvZmYtdTY4ay5jCi0JY29uZmlnL202OGstY29mZnVuLm10IC0+IHU2OGstY29mZi5tdC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIEp1bCAyMCAxNjoyMTo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IERvbid0IHVzZSAiJiIgYmVmb3JlCi0JZnVuY3Rpb24gbmFtZTsgaXQncyB2YWxpZCB3aXRob3V0LCBhbmQgc29tZSBjb21waWxlcnMgZ2l2ZQotCXdhcm5pbmdzIHdpdGggaXQgdGhlcmUuCi0KLVR1ZSBKdWwgMjAgMDg6MjE6MTUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiAgQXBwbHkgc29tZSBvZiB0aGUgY2hhbmdlcyB0aGF0IHdlcmUgbWFkZSB0byBiZmQtaW4yLmguCi0JKiBiZmQuYyAodW5pb24gdGRhdGEpOiAgQWRkIG5sbV9vYmpfZGF0YTsKLQkqIHRhcmdldHMuYyAoZW51bSB0YXJnZXRfZmxhdm91cik6ICBBZGQgYmZkX3RhcmdldF9ubG1fZmxhdm91ci4KLQotTW9uIEp1bCAxOSAyMDo0NjoxOCAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotbmV0d2FyZSwgaVszNF04Ni0qLW5ldHdhcmUpOiAgTmV3IGNvbmZpZ3MuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiAgQWRkIG5sbS5vLCBubG0zMi5vLCBubG0zMi1nZW4uby4KLQkqIE1ha2VmaWxlLmluIChCRkQ2NF9CQUNLRU5EUyk6ICBBZGQgbmxtNjQubywgbmxtNjQtZ2VuLm8uCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogIEFkZCBubG17MzIsNjR9LmMsIG5sbXszMiw2NH0tZ2VuLmMuCi0JKiBNYWtlZmlsZS5pbiAobmxtLm8sIG5sbXszMiw2NH0ubywgbmxtezMyLDY0fS1nZW4ubzogIE5ldyB0YXJnZXRzLgotCSogYmZkLWluMi5oIChJTkxJTkUpOiAgRGVmaW5lcyBtb3ZlZCBoZXJlLgotCSoge2FvdXR4LmgsIGVsZi5jLCBlbGZjb2RlLmh9OiAgTW92ZSBJTkxJTkUgZGVmaW5lcyB0byBiZmQtaW4yLmguCi0JKiBsaWJlbGYuaCAoQ0FUNCk6ICBNb3ZlIGRlZmluZSB0byBiZmQtaW4yLmguCi0JKiBiZmQtaW4yLmggKENBVDQpOiAgTWVyZ2UgQ0FUNCBtYWNybyB3aXRoIG90aGVyIENBVCBtYWNyb3MuCi0JKiBiZmQtaW4yLmggKHVuaW9uIHRkYXRhKTogIEFkZCBubG1fb2JqX2RhdGEuCi0JKiBiZmQtaW4yLmggKGVudW0gdGFyZ2V0X2ZsYXZvdXIpOiAgQWRkIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIuCi0JKiB0YXJnZXRzLmMgKGJmZF9ubG17MzIsNjR9X3tiaWcsbGl0dGxlfV92ZWMpOiAgQWRkIHByb3RvdHlwZXMuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgQWRkIGJmZF9ubG17MzIsNjR9X3tiaWcsbGl0dGxlfV92ZWMuCi0JKiAobGlibmxtLmgsIG5sbS5jLCBubG1jb2RlLmgsIG5sbXszMiw2NH0tZ2VuLmMsCi0JbmxtezMyLDY0fS10YXJnZXQuaCwgbmxtezMyLDY0fS5jLCBjb25maWcvaTM4Ni1ubG0ubXQpOiAgTmV3IGZpbGVzCi0JZm9yIE5MTSBzdXBwb3J0LgotCi1Nb24gSnVsIDE5IDE1OjA5OjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLntob3N0cyxpbn06IGFkZCBpWzM0XTg2LSotbHlueG9zKiBzdXBwb3J0Ci0KLU1vbiBKdWwgMTkgMTQ6NTM6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBlbGYuYywgZWxmY29kZS5oLCBsaWJlbGYuaDogU2VyaW91cyByZW9yZ2FuaXphdGlvbi4KLQlEZWxldGVkIGB0aHVuaycgc3RydWN0dXJlLCBtZXJnZWQgaW50byB0ZGF0YSwgZHVwbGljYXRlIGRhdGEKLQllbGltaW5hdGVkLgotCVJlYXJyYW5nZWQgZnVuY3Rpb25zLCBncm91cGluZyBieSBmdW5jdGlvbmFsaXR5LgotCUJyb2tlIHVwIG1hbnkgZnVuY3Rpb25zIGluIGVsZmNvZGUuaCwgcmUtb3JkZXJlZCBtYW55IHBhcnRzIG9mCi0JZmlsZSB3cml0aW5nIHRvIGhhbmRsZSB1bnByZWRpY3RhYmxlIHN0YXRlIG9mIHNlY3Rpb24gcmVsb2NhdGlvbgotCXRhYmxlIGFzIHByb3ZpZGVkIGJ5IHZhcmlvdXMgYXBwbGljYXRpb25zLgotCVN0aWxsIG5lZWRzIGNsZWFudXA6IE1lcmdlIGZ1bmN0aW9ucyBiYWNrIHRvZ2V0aGVyLCBzcGxpdCBvdXQKLQlkYXRhIHN0cnVjdHVyZSB3aXRoIG9ubHkgZGF0YSB0aGF0IGlzIHVzZWQgb25seSB3aGVuIHdyaXRpbmcgb3V0Ci0Jb2JqZWN0IGZpbGUuCi0KLQkqIGVsZi5jIChiZmRfZWxmX2dlbmVyaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24sIHRha2VuIGZyb20KLQljb2ZmLW1pcHMuYy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFVzZSBpdCwgdG8gd29yayBhcm91bmQKLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGxvc3NhZ2UuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEluY2x1ZGUgY29mZi1taXBzLm8gYW5kIGNvZmYtbXN5bS5vLCBzbwotCXRoYXQgZ2RiIHdpbGwgbGluay4KLQkob2ZpbGVzKTogRG9uJ3QgdXNlIHNvcnQgb3IgdW5pcTsgZG8gaXQgd2l0aCBzaCBjb25zdHJ1Y3RzLgotCi1TdW4gSnVsIDE4IDE5OjQyOjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogUmVjb2duaXplIEkzODZQVFhNQUdJQy4KLQkqIGFvdXRmMS5oLCBsaWJhb3V0Lmg6IEFkZCBNXzM4Nl9EWU5JWC4KLQkqIHRyYWQtY29yZS5jIChUUkFEX0NPUkVfVVNFUl9PRkZTRVQsIFRSQURfQ09SRV9TVEFDS19GSUxFUE9TKToKLQlOZXcgbWFjcm9zOyB1c2UgaXQgaWYgZGVmaW5lZC4KLQkqIGNvbmZpZy9zeW1tZXRyeS5taCwgaG9zdHMvc3ltbWV0cnkuaDogTmV3IGZpbGVzLgotCi1GcmkgSnVsIDE2IDE0OjU2OjMxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIGVsZnszMiw2NH0tZ2VuZXJpYy5jIHRvICotZ2VuLmMgZm9yIDE0IGNoYXIgZmlsZW5hbWVzLgotCSogTWFrZWZpbGUuaW46IENoYW5nZSBhY2NvcmRpbmdseS4KLQkoQ0ZJTEVTKTogQWRkIGVsZjY0LWdlbi5jLgotCi1GcmkgSnVsIDE2IDA5OjUzOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmM6IFVzZSBNSVBTX0FPVVRfe09afU1BR0lDIHJhdGhlciB0aGFuIHtPWn1NQUdJQy4KLQotVGh1IEp1bCAxNSAxNjowMjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jIChob3d0b190YWJsZSk6IENvcnJlY3RlZCBiaXRzaXplIGZvciBSX1BDUjI2TCBmcm9tCi0JMTYgdG8gMjYuCi0KLVdlZCBKdWwgMTQgMTU6Mjk6NTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyBbSE9TVF9IUFBBQlNEXTogVXNlIGhwdXgtc3R5bGUgY29yZSBmaWxlcy4KLQkqIGxpYmhwcGEuaCBbSE9TVF9IUFBBQlNEXTogSW5jbHVkZSBocHV4IHZlcnNpb24gb2YgY29yZS5oCi0KLVdlZCBKdWwgMTQgMDk6MzA6NDggMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaDgzMDBoLSotKi4KLQotVHVlIEp1bCAxMyAxMjowMzowMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4NTAwLmMgKHJlbG9jX3Byb2Nlc3NpbmcsIHJ0eXBlMmhvd3RvKTogTmV3IHJlbG9jYXRpb24KLQl0eXBlIFJfSDg1MDBfSElHSF8xNi4KLQkqIGNvZmYtc2guYyAocl9pbW0zMik6IEdldCB0aGUgd2lkdGggb2YgdGhlIHJlbG9jIHJpZ2h0LgotCi1UdWUgSnVsIDEzIDE2OjQ4OjU2IDE5OTMgIEZyZWRlcmljIFBpZXJyZXN0ZWd1eSAoRi5QaWVycmVzdGVndXlAZnJjbC5idWxsLmZyKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBuZXcgdGFyZ2V0IG02OGstY29mZnVuIHRvIHRoZSBkcHgvMi4KLQkqIGNvbmZpZy9tNjhrLWNvZmZ1bi5tdDogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBjb25maWcvZHB4Mi5tdC4KLQotTW9uIEp1bCAxMiAxMDo0Mjo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogTW92ZSBTUEFSQ19CQVNFMTMgcmVsb2MgaW50bwotCXNwYXJjLWFvdXQtc3BlY2lmaWMgbGlzdC4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGZpZWxkIGB0aHVuaycuCi0KLQkqIGNvbmZpZy9zcGFyYy1lbGYubXQgKFRBUkdFVF9CQUNLRU5EUyk6IE5ldyBtYWtlIHZhcmlhYmxlLgotCi1UaHUgSnVsICAxIDE0OjUyOjQ3IDE5OTMgIEZyZWRlcmljIFBpZXJyZXN0ZWd1eSAoRi5QaWVycmVzdGVndXlAZnJjbC5idWxsLmZyKQotCQkJICBhbmQgSmltIEtpbmdkb24gKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oOiBVc2UgbWVtc2V0IG5vdCBiemVyby4KLQkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzeXMvZmlsZS5oPi4KLQkqIGkzODZsaW51eC5oOiBJbmNsdWRlIDxzeXMvZmlsZS5oPi4KLQkqIGNvZmYtbTY4ay11bi5jOiBuZXcgZmlsZSB0byBoYW5kbGUgbmFtZXMgd2l0aCB1bmRlcnNjb3JlcyBvbgotCXN2cjMgbWFjaGluZXMuCi0JKiBjb2ZmLW02OGsuYyAobTY4a19ydHlwZTJob3d0byk6IGFkZGVkICNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi0JdG8gbm90IGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb24gaW4gdGhlIGV4ZWN1dGFibGUuCi0JKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FLCBOQU1FU19IQVZFX1VOREVSU0NPUkUpOiBuZXcgbWFjcm9zIG5lZWRlZAotCWJ5IGNvZmYtbTY4ay11bi5jLgotCSogY29mZmNvZGUuaCAoTUM2OEtCQ1NNQUdJQyk6IGNhc2UgYWRkZWQuCi0JKiB0YXJnZXRzLmM6IEFkZCBtNjhrY29mZnVuX3ZlYy4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBhZGRlZCBzdXBwb3J0IGZvciBCdWxsIGRweC8yLgotCSogY29uZmlnL2RweDIubWgsIGhvc3RzL2RweDIuaDogbmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRhcmdldCBjb2ZmLW02OGstdW4uCi0KLUZyaSBKdWwgIDkgMDA6NDM6MDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oOiBBZGQgZGVmaW5pdGlvbiBvZiBNQUNIVFlQRV9PSy4KLQotVGh1IEp1bCAgOCAxNDozNzo0NCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCBzdWJ0cmFjdCB0aGUgYWRkZW5kCi0JYWdhaW4gZm9yIGNvZmYuCi0KLQkqIHN5bXMuYywgYmZkLWluMi5oOiBEb2MgZml4LgotCi0JKiBjb2ZmY29kZS5oIChDQUxDX0FEREVORCk6IENoZWNrIGZvciBjb21tb24gc2VjdGlvbiB1c2luZyB0aGUKLQlzZWN0aW9uIGZsYWcgYXMgd2VsbCBhcyB0aGUgc3ltYm9sIGZsYWcuCi0KLVRodSBKdWwgIDggMTM6NDM6NTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZic2QuaDogQ29uZGl0aW9uYWxpemUgSE9TVF9TVEFDS19FTkRfQUREUiBvbiBfX2JzZGlfXy4KLQlpMzg2YnNkLmM6IFJlbW92ZSBkZWZpbmVzIG9mIE5fVFhUKjsgdGhlIHZlcnNpb25zIGluIGFvdXQ2NC5oIHNob3VsZAotCWJlIHN1ZmZpY2llbnQuICBEZWZpbmUgVEVYVF9TVEFSVF9BRERSLgotCi1XZWQgSnVsICA3IDEwOjU2OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFJlbW92ZWQgc3RhdGVwCi0JYXJndW1lbnQuICBKdXN0IGxldCBhbiBpbmRpcmVjdCBzeW1ib2wgcG9pbnQgdG8gdGhlIG5leHQgc3ltYm9sCi0Jd2l0aG91dCBmb3JjaW5nIHRoZSBuZXh0IHN5bWJvbCB0byBiZSB1bmRlZmluZWQuICBDaGFuZ2VkIGFsbAotCWNhbGxlcnMuCi0JKiBocDMwMGhwdXguYyAoc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hhbmdlZCBjYWxsIHRvCi0JdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4KLQkqIHRhcmdldHMuYzogQWRkZWQgaHAzMDBocHV4X3ZlYy4KLQkqIE1ha2VmaWxlLmluIChocDMwMGhwdXgubyk6IEFkZGVkIGRlcGVuZGVuY2llcy4KLQotVHVlIEp1bCAgNiAxMzoyNDo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IFB1dCBzaW1wbGUgcG93ZXItb2YtdHdvCi0JcmVsb2NzIHRvZ2V0aGVyLCBhbmQgYWRkIDY0LWJpdCB2ZXJzaW9ucy4KLQkoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQXJndW1lbnQgdG8gYWxsb2NhCi0JaXMgc2l6ZV90LgotCi0JKiBsaWJiZmQuYyAoYmZkX3htYWxsb2NfYnlfc2l6ZV90KTogTmV3IGZ1bmN0aW9uLgotCSogb3BuY2xzLmMgKGJmZF9jYWNoZV9pbml0LCBiZmRfb3Blbl9maWxlKTogQWRkIHByb3RvdHlwZXMgdG8KLQlkZWNsYXJhdGlvbnMuCi0JKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBVc2UgYmZkX3htYWxsb2NfYnlfc2l6ZV90LgotCShuZXdfYmZkKTogUHJvdG90eXBlLXN0eWxlIGRlZmluaXRpb24sIHVzaW5nIERFRlVOLgotCShiZmRfYWxsb2NfZ3JvdywgYmZkX2FsbG9jLCBiZmRfemFsbG9jLCBiZmRfcmVhbGxvYyk6IFNpemUKLQlhcmd1bWVudCBpcyB0eXBlIHNpemVfdCwgbm90IGJmZF9zaXplX3R5cGUuCi0JKiBpZWVlLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBVc2UgYmZkX3htYWxsb2NfYnlfc2l6ZV90LgotCSogYmZkLmMgKGJmZF9kZWZhdWx0X2Vycm9yX3RyYXAsIGJmZF9lcnJvcl90cmFwLAotCWJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmx0cmFwKTogUHJvdG90eXBlcy4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYWxsb2MsIGJmZF96YWxsb2MsIGJmZF9yZWFsbG9jLAotCWJmZF9hbGxvY19ncm93KTogQWRqdXN0ZWQgcHJvdG90eXBlcyBmb3IgYXJnIHR5cGUgY2hhbmdlLgotCSogYXJjaGl2ZS5jIChnZXRfZWx0X2F0X2ZpbGVwb3MsIGRvX3NsdXJwX2JzZF9hcm1hcCwgbm9ybWFsaXplLAotCWRvX3NsdXJwX2NvZmZfYXJtYXAsIGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6Ci0JUHJvdG90eXBlcy4KLQkqIGVsZmNvZGUuaCAoZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIpOiBQcm90b3R5cGVzLgotCSogbGliZWxmLmggKGVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiwgZWxmX2dldF9zdHJfc2VjdGlvbik6Ci0JUHJvdG90eXBlcy4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IFJlbmFtZWQgZnJvbSBCRkRfTUFDSElORVMuCi0JKG9maWxlcyk6IE5ldyB0YXJnZXQuICBCdWlsZCBhIGxpc3Qgb2YgdW5pcXVlIGZpbGUgbmFtZXMsIGluIGNhc2UKLQlhbnkgZ290IGR1cGxpY2F0ZWQuCi0JKFRBUkdFVExJQik6IFVzZSBsaXN0IG9mIGZpbGVzIGZyb20gb2ZpbGVzLgotCSogY29uZmlndXJlLmluOiBTZXQgQkZEX01BQ0hJTkVTIGFuZCBCRkRfQkFDS0VORFMgZGVwZW5kaW5nIG9uCi0JbWluaW1hbC1iZmQgZmxhZyBhbmQgdGFyZ2V0IG1ha2VmaWxlIGZyYWcgY29udGVudHMuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3JlYWQpOiBEZWxldGUgc3RhdGljIGRlY2xhcmF0aW9uLCBzaW5jZSBmdW5jdGlvbgotCWhhcyBtb3ZlZC4KLQkoZWxmX21hcF9zeW1ib2xzKTogV3JpdGUgb3V0IHNlY3Rpb24gc3ltYm9scyBmb3IgYWxsIHNlY3Rpb25zLCBmb3IKLQlub3cuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogQWxsb3cgbWF0Y2ggaWYgYm90aCBzeW1ib2xzIGFyZQotCXNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIHNhbWUgc2VjdGlvbi4KLQkoZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgcHJpbnQgbWVzc2FnZSwganVzdCByZXR1cm4gZmFsc2UuCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmX2xvY2F0ZV9zaCk6IERlY2xhcmF0aW9uIGRlbGV0ZWQuCi0KLU1vbiBKdWwgIDUgMTY6NDg6MTEgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4MzAwLmMgKGg4MzAwX3NjYW4pOiBGaXggcGFyc2luZyBvZiBhcmNoaXRlY3R1cmUgc3RyaW5nLgotCi1GcmkgSnVsICAyIDE4OjI3OjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgYmZkLmggYW5kIHN0bXAtYmZkLmguCi0JKHJlYWxjbGVhbik6IFJlbW92ZSBnZW5lcmF0ZWQgaGVhZGVycy4KLQotRnJpIEp1bCAgMiAxNDo1MTo1MSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnQpOiAgRGVueSBpZiBmaWxlIGlzIG5vdCBvcGVuZWQgd2l0aAotCXRoZSBwcm9wZXIgbW9kZSwgc2V0IG91dHB1dF9oYXNfYmVndW4gaWYgZmlsZSBpcyBvcGVuZW5lZCBmb3IgdXBkYXRlLgotCSogYW91dHguaCAoYW91dF8qX3NldF9zZWN0aW9uX2NvbnRlbnQpOiAgUmVtb3ZlIGNoZWNrcyB0aGF0IGFyZSBub3cKLQlkb25lIGluIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50LgotCi1GcmkgSnVsICAyIDA5OjI1OjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogUmVtb3ZlZCBkZWNsYXJhdGlvbnMgb2YgcHJpbnRmLCBmcHJpbnRmLAotCWZjbnRsLCBmcmVhZCBhbmQgZndyaXRlLiAgVGhleSBhcmUgYWxsIGVycm9yIHByb25lIGZvciBvbmUgcmVhc29uCi0Jb3IgYW5vdGhlci4gIENoYW5nZWQgZGVjbGFyYXRpb24gb2YgbWVtY2hyIGZyb20gY2hhciAqIHRvIFBUUi4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotcmlzY29zKik6IE5ldyB0YXJnZXQ7IHVzZSByaXNjb3MuCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy0qLXJpc2NvcyopOiBOZXcgaG9zdDsgdXNlIHJpc2Nvcy4KLQkqIGNvbmZpZy9yaXNjb3MubWggKEhERUZJTkVTKTogQWRkIC1HIDQuCi0KLQkqIGxpYmFvdXQuaCAoR0VUX1NXT1JEKTogVXNlIHRoZSBiZmRfaF9nZXRfc2lnbmVkIGVudHJ5IHBvaW50cwotCXJhdGhlciB0aGFuIGNhc3RpbmcgdGhlIHJlc3VsdCBvZiBiZmRfaF9nZXQuCi0KLUZyaSBKdWwgIDIgMTA6MTM6NDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgaG9zdHMvZGVsdGE2OC5oLCBjb25maWcvZGVsdGE2OC5taDogQWRkIHN0dWZmIGZvcgotCU1vdG9yb2xhIERlbHRhIDY4LgotCi1XZWQgSnVuIDMwIDA2OjAyOjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfe2JpZyxsaXR0bGV9X2dlbmVyaWNfdmVjKTogRGVjbGFyZSwgYW5kCi0JaW5jbHVkZSBpbiBzZWFyY2ggbGlzdCBpZiBCRkQ2NCBpcyBkZWZpbmVkLgotCi0JKiBsaWJlbGYuaCAoQ0FUNCk6IEFkZGVkIGEgdmVyc2lvbiBmb3IgU2FiZXItQywgQU5TSSBtb2RlLgotCShiZmRfZWxmNjRfKik6IERlY2xhcmF0aW9ucyBmb3IgNjQtYml0IHZlcnNpb25zIG9mIG1hbnkgcm91dGluZXMuCi0KLVR1ZSBKdW4gMjkgMjI6NTA6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGY2NC10YXJnZXQuaCwgZWxmNjQtZ2VuZXJpYy5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQkZENjRfQkFDS0VORFMpOiBJbmNsdWRlIGVsZjY0LWdlbmVyaWMuby4KLQkoZWxmNjQtZ2VuZXJpYy5vKTogTGlzdCBkZXBlbmRlbmNpZXMuCi0KLQkqIE1ha2VmaWxlLmluOiBMaXN0IHRhcmdldCBgYWxsJyBleHBsaWNpdGx5IGJlZm9yZSBob3N0L3RhcmdldAotCW1ha2VmaWxlIGZyYWdtZW50cyBhcmUgaW5jbHVkZWQsIGluIGNhc2UgdGhleSBkZWZpbmUgYW55IG5ldwotCXRhcmdldHMuCi0KLQkqIGVsZmNvZGUuaCAoRUxGX1JfSU5GTywgRUxGX1JfU1lNKTogRGVmaW5lIGFzIDMyLSBvciA2NC1iaXQKLQl2ZXJzaW9ucyBhcyBhcHByb3ByaWF0ZS4gIFVzZXMgdXBkYXRlZC4KLQkoZWxmX2RlYnVnX3NlY3Rpb24pOiBEZWNsYXJlIGJlZm9yZSB1c2UuCi0JKGVsZl9kZWJ1Z19maWxlKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGJmZF9zaGRyX2Zyb21fc2VjdGlvbiwgZWxmX2Zha2Vfc2VjdGlvbnMpOgotCUFsaWdubWVudCB2YWx1ZSBpbiBzZWN0aW9uIGhlYWRlciBpcyBuX2J5dGVzLCBub3QgbG9nMi4KLQkobmV3X3NlY3Rpb25faG9vayk6IERvIG5vdGhpbmcgZm9yIG5vdy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIEVsZl9FeHRlcm5hbF9SZWxbYV0sIG5vdCAzMi1iaXQKLQl2ZXJzaW9uIGV4cGxpY2l0bHkuCi0JKGVsZl9jb3JlX2ZpbGVfcCk6IFNpbXBsaWZ5IGNoZWNrIGZvciBjb3JyZWN0IGNsYXNzICh3b3JkIHNpemUpLgotCShlbGZfbWFrZV9zZWN0aW9ucywgZWxmX2Zha2Vfc2VjdGlvbnMsIGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOgotCUluaXRpYWxpemUgYWxsIGZpZWxkcyB3aGVuIGNyZWF0aW5nIGRhdGEgc3RydWN0dXJlcy4KLQkoZWxmX2xvY2F0ZV9zaCk6IFJlbmFtZWQgZnJvbSBiZmRfZWxmWFhfbG9jYXRlX3NoLCBtYWRlIHN0YXRpYy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNldCBjb3JyZWN0IGNsYXNzIGluIG91dHB1dAotCWZpbGUuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZWN0aW9uIHN5bWJvbHMgaGF2ZSBlbXB0eSBuYW1lcyBpbgotCW91dHB1dCBmaWxlLgotCi0JKiBsaWJiZmQuYyAoYmZkX3htYWxsb2MsIHphbGxvYyk6IEJlIHN1cmUgdG8gY2FzdCBtYWxsb2MsIG1lbXNldAotCWFyZ3MgdG8gc2l6ZV90IGJlZm9yZSBjYWxsLgotCShiZmRfYWRkX3RvX3N0cmluZ190YWJsZSk6IENhc3QgemFsbG9jIGFyZyB0byBiZmRfc2l6ZV90eXBlLgotCi1UdWUgSnVuIDI5IDEwOjQ5OjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSWYgcHJvY2VkdXJlIGhhcyBubyBsaW5lCi0JbnVtYmVyIGluZm9ybWF0aW9uLCByZXR1cm4gMCBmb3IgbGluZSBudW1iZXIuCi0KLU1vbiBKdW4gMjggMTA6NDU6MDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IElmICpvbGRyYXdwdHIgaXMgbm9uLU5VTEwsIGNvcHkgaXQKLQlpbnRvICpyYXdwdHIuCi0KLVN1biBKdW4gMjcgMDk6MDU6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3Jpc2Nvcy5oOiBEZWZpbmUgTkJQRyBhbmQgVVBBR0VTLgotCi1TdW4gSnVuIDI3IDE2OjI4OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCB1c2Ugb2JqX3Jhd19zeW1zIGFzCi0JbHZhbHVlOyBpdCBjb250YWlucyBhIGNhc3QuCi0KLUZyaSBKdW4gMjUgMTc6MDk6NTUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChoYXNoLCBjb21wYXJlLCBzdHJ1Y3Qgc3RyaW5ndGFiX2VudHJ5LCBhZGRfdG9fc3RyaW5ndGFiKToKLQlVc2UgdW5zaWduZWQgaGFzaCB2YWx1ZXMgZm9yIGJldHRlciBoYXNoaW5nLgotCShoYXNoKTogSGFzaCBpbiB0aGUgc3RyaW5nIGxlbmd0aCBmb3IgbG9uZyBzdHJpbmdzLgotCi1UaHUgSnVuIDI0IDE1OjQ3OjUxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoY29tcGFyZSk6IFJlcGxhY2UgMyBpZidzIHdpdGggYSBzdWJ0cmFjdGlvbi4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MsIGFkZF90b19zdHJpbmd0YWIpOiBSZW9yZGVyIHRlc3RzCi0JaW4gZGVjcmVhc2luZyBvcmRlciBvZiBzdWNjZXNzLCBhcyBhbiBvcHRpbWl6YXRpb24uCi0JKGhhc2gpOiBUYWtlIGEgbGVuZ3RoIGFyZzsgaWdub3JlIGNoYXJzIGFmdGVyICMyNSwgZm9yIHNwZWVkLgotCShhZGRfdG9fc3RyaW5ndGFiKTogUGFzcyBsZW5ndGggdG8gaGFzaC4KLQotVGh1IEp1biAyNCAxNzoyNTo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZWxmMzItc3BhcmMuYyAoc3BhcmNfcmVsb2NfbWFwKTogQWRkIFNQQVJDX1dESVNQMjIgcmVsb2MuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX25ld19zZWN0aW9uX2hvb2spOiBEbyBub3RoaW5nIGZvciBub3cuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPdXRwdXQgY29tbW9uIHN5bWJvbHMgdGhlIHdheSBFTEYKLQl3YW50cyB0aGVtLgotCi1XZWQgSnVuIDIzIDE2OjIwOjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEgYW5kIGFzc29jaWF0ZWQgbWFjcm9zKTogTW92ZWQKLQloZXJlIGZyb20gZWxmY29kZS5oLiAgQSBjb3VwbGUgb2Ygc2l6ZS1zcGVjaWZpYyBzdHJ1Y3R1cmUgcG9pbnRlcnMKLQl3ZXJlIGNoYW5nZWQgdG8gUFRSOyB1c2VzIGZpeGVkIGFwcHJvcHJpYXRlbHkuCi0JKGVsZjMyX3N5bWJvbF90eXBlLCBlbGY2NF9zeW1ib2xfdHlwZSk6IFNlcGFyYXRlZCBkZWZpbml0aW9ucy4KLQkoYmZkX2VsZl9ta29iamVjdCk6IFJlbmFtZWQgZnJvbSBiZmRfZWxmMzJfbWtvYmplY3QuCi0JKGJmZF9lbGYzMl9ta29iamVjdCwgYmZkX2VsZjY0X21rb2JqZWN0LCBlbGZfbWtvYmplY3QpOiBOZXcKLQl0ZW1wb3JhcnkgbWFjcm9zIHRvIGVhc2UgbmFtZSBjaGFuZ2UuCi0JKiBlbGYuYyAoZWxmX3JlYWQsIGVsZl9ta29iamVjdCwgZWxmX2dldF9zdHJfc2VjdGlvbiwKLQllbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24sIGJmZF9lbGZfZmluZF9zZWN0aW9uKTogTW92ZWQgaGVyZQotCWZyb20gZWxmY29kZS5oLgotCSogZG9jL01ha2VmaWxlLmluIChsaWJiZmQuaCk6IFByb2Nlc3MgZWxmLmMgdG9vLgotCSogTWFrZWZpbGUuaW4gKGVsZi5vKTogTm90ZSBuZXcgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGZjb2RlLmg6IExvdHMgb2Ygc3R1ZmYgbW92ZWQgZWxzZXdoZXJlLiAgRGVsZXRlZCBzb21lIHVudXNlZAotCWNvZGUsIHR3ZWFrZWQgc29tZSBkZWJ1ZyBob29rcy4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IFRyYW5zbGF0ZSBFTEYgc2VjdGlvbiBzeW1ib2xzIGludG8gQkZECi0Jc2VjdGlvbiBzeW1ib2xzLgotCi1XZWQgSnVuIDIzIDExOjM0OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9yaXNjb3MuaDogTmV3IGZpbGUuCi0KLVR1ZSBKdW4gMjIgMTQ6MzU6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBjYXNlIFNIVF9QUk9HQklUUyk6IEV2ZW4gaWYKLQlzZWN0aW9uIGFscmVhZHkgZXhpc3RzLCB1c2UgaXRzIHBvaW50ZXIgdG8gZmlsbCBpbiByYXdkYXRhIHNsb3QuCi0KLVR1ZSBKdW4gMjIgMTY6MzY6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IFJldHVybiB2YWx1ZSBvZiBwdXRzIGFuZCBmcHV0cyBpcyBpbnQgbm90IHZvaWQuCi0KLVR1ZSBKdW4gMjIgMTQ6MjU6NTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBDb21tZW50IHRoZSBmaWVsZCBuYW1lcy4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBGaXggbWF4IGFuZCBtaW4gdmFsdWVzLgotCi1Nb24gSnVuIDIxIDE4OjE5OjE0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmMzItaHBwYS5jLCBlbGZjb2RlLmg6IFVzZSBuZXcKLQlzaXplLWluZGVwZW5kZW50IGVsZiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCi0JKiBlbGZjb2RlLmggKHB1dF93b3JkLCBnZXRfd29yZCk6IERlZmluZSBhcyBhcHByb3ByaWF0ZSBmb3IKLQlhcmNoaXRlY3R1cmUgd29yZCBzaXplLiAgU3RydWN0dXJlIHN3YXBwaW5nIGZ1bmN0aW9ucyBjaGFuZ2VkIHRvCi0JdXNlIHRoZW0gYXMgYXBwcm9wcmlhdGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgY29tcGlsaW5nIDY0LWJpdCBiYWNrIGVuZHMsIGRvIHRoZW0gYmVmb3JlCi0JMzItYml0IG9uZXMuCi0KLQkqIGxpYmVsZi5oOiBVc2UgbmV3IHNpemUtaW5kZXBlbmRlbnQgdmVyc2lvbnMgb2YgZWxmIGludGVybmFsIGRhdGEKLQlzdHJ1Y3R1cmVzLgotCShzeW1ib2xfdHlwZSk6IFJlb3JkZXJlZCB0byBwdXQgYW55IGZpZWxkcyBkZXBlbmRlbnQgb24gdGFyZ2V0Ci0Jc2l6ZSBhdCB0aGUgZW5kLgotCShlbGZfYmFja2VuZF9kYXRhKTogUmVuYW1lZCBmcm9tIGVsZiMjX2JhY2tlbmRfZGF0YSBhbmQgbWFkZQotCXNpemUtaW5kZXBlbmRlbnQuCi0JKGVsZl9zZWN0X3RodW5rKTogTm93IHNpemUtaW5kZXBlbmRlbnQuCi0KLQkqIGxpYmJmZC5jIChiZmRfbG9nMik6IE5vdyByZXR1cm5zIHVuc2lnbmVkIGludC4KLQotTW9uIEp1biAyMSAxMjozMDo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIGNvbmZpZy9tODhrLWFvdXQubXQgdG8gY29uZmlnL25vb3AubXQuCi0JY29uZmlndXJlLmluOiBVc2UgaXQgZm9yIG1pcHMtKi1ic2QqLgotCi1TdW4gSnVuIDIwIDIwOjMyOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogRWxpbWluYXRlICJwYXJ0aWFsbHkgYnJhY2tldGVkCi0JaW5pdGlhbGl6ZXIiIHdhcm5pbmcgZnJvbSBnY2MuCi0JKiBjcHUtaDg1MDAuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLgotCSogY3B1LXNoLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBMaWtld2lzZS4KLQotCSogY3B1LWg4MzAwLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgaG93dG8qX2NhbGxiYWNrLAotCWhvd3RvXyopOiBVbnVzZWQgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgY29tbWVudGVkIG91dC4KLQkqIGNwdS16OGsuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCBob3d0bypfY2FsbGJhY2ssCi0JaG93dG9fKik6IExpa2V3aXNlLgotCSogY3B1LWg4NTAwLmMgKGNvbXBhdGlibGUpOiBMaWtld2lzZS4KLQkqIGNwdS1zaC5jIChjb21wYXRpYmxlKTogTGlrZXdpc2UuCi0KLQkqIGhwMzAwaHB1eC5jIChzd2FwX3N0ZF9yZWxvY19pbik6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGVzLgotCUFsd2F5cyBzZXQgYSB2YWxpZCBsZW5ndGggdmFsdWUsIGV2ZW4gZm9yIGludmFsaWQgaW5wdXQuCi0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogVXNlIHNwcmludGZfdm1hLgotCi0JKiBiZmQtaW4uaCAodWludDY0X3R5cGVMT1csIHVpbnQ2NF90eXBlSElHSCwgaW50NjRfdHlwZSwKLQl1aW50NjRfdHlwZSk6IFByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9ucy4KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKGludDY0IHN0dWZmKTogUmVtb3ZlIHRoZW0gZnJvbSBoZXJlLgotCi0JKiBiZmQtaW4uaCAoc3ByaW50Zl92bWEpOiBEZWZpbmUgcGFyYWxsZWwgdG8gZnByaW50Zl92bWEuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBEZWxldGUgdW51c2VkCi0JdmFyaWFibGUuICBBZGRlZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogQmVmb3JlIGNhc3RpbmcKLQlwb2ludGVycyB0byBpbnRlZ2VycywgbWFrZSBzdXJlIHRoZSBpbnRlZ2VyIHR5cGUgaXMgd2lkZSBlbm91Z2guCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogRGl0dG8uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU2luY2UgYGNvdW50JyBpcyB1bnNpZ25lZCwKLQlkb24ndCBib3RoZXIgY29tcGFyaW5nIGZvciBsZXNzLXRoYW4temVyby4KLQkoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2FkZF90b19zdHJ0YWIpOiBOb3cgc3RhdGljLgotCShzeW1faXNfZ2xvYmFsKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbWFwX3N5bWJvbHMpOiBDYWxsIGl0LiAgTm93IHJldHVybnMgdm9pZC4gIFJlbW92ZWQgdW51c2VkCi0JbG9jYWwgdmFyaWFibGUuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1hcmsgc3RyaW5nIHRhYmxlcyBvdGhlciB0aGFuIGZvciBzZWN0aW9uCi0JYW5kIHN5bWJvbCBuYW1lcyBhcyBub3JtYWwgc2VjdGlvbnMgaGF2aW5nIGNvbnRlbnRzLgotCShmaXhfdXBfc3RydGFicyk6IE5ldyBmdW5jdGlvbjsgZml4ZXMgdXAgRUxGIGhlYWRlciBmaWVsZHMgZm9yCi0Jc3RhYiBzZWN0aW9ucyB3aXRoIHN0cmluZyB0YWJsZXMgYXNzb2NpYXRlZC4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1hcCBmaXhfdXBfc3RydGFicyBvdmVyIGFsbCBCRkQKLQlzZWN0aW9ucy4gIFJlb3JkZXJlZCBjb25kaXRpb24gdGVzdHMgZm9yIHN5bWJvbCBmbGFnczsgZGVmYXVsdCB0bwotCWxvY2FsLW9iamVjdCB2YWx1ZSBpbnN0ZWFkIG9mIGdsb2JhbC1vYmplY3QuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogSGlkIGNvbmRpdGlvbmFsbHktdXNlZCB2YXJpYWJsZQotCWluc2lkZSBjb25kaXRpb24gdGVzdC4KLQkoZWxmX3ByaW50X3N5bWJvbCk6IFVzZSBmcHJpbnRmX3ZtYS4KLQkoZWxmX2lkeF9vZl9zeW0sIGJmZF9zaGRyX2Zyb21fc2VjdGlvbik6IFVudXNlZCBmdW5jdGlvbnMKLQljb21tZW50ZWQgb3V0LgotCi0JKiBiZmQtaW4uaCAoaW50NjRfdHlwZSwgdWludDY0X3R5cGUpOiBEZWZpbmUgdGhlc2UgaWYgd2UgZmFsbAotCWJhY2sgdG8gImxvbmcgbG9uZyIgZm9yIEhPU1RfNjRfQklULgotCi0JKiBsaWJlbGYuaCAoZWxmTkFNRSwgRWxmTkFNRSk6IE5ldyB2ZXJzaW9ucyB0byBnZXQgZGVzaXJlZCByZXN1bHRzCi0Jd2l0aG91dCB1c2luZyBpbnZhbGlkIEFOU0kgQyBwcmVwcm9jZXNzaW5nIHRva2Vucy4KLQotCSogZWxmMzItdGFyZ2V0LmggKGJmZF9lbGYzMl9uZXdfc2VjdGlvbl9ob29rKTogRGVsZXRlIG1hY3JvLgotCSogbGliZWxmLmggKGJmZF9lbGYzMl9uZXdfc2VjdGlvbl9ob29rKTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAobmV3X3NlY3Rpb25faG9vayk6IERlZmluZSBoZXJlLgotCi0JKiBob3N0cy9zcGFyYy5oLCBob3N0cy9zdGQtaG9zdC5oLCBob3N0cy9pMzg2YnNkLmg6IFByb3RlY3QKLQlhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0KLQkqIGhvc3RzL25ld3MuaDogSW5jbHVkZSBob3N0cy9zdGQtaG9zdC5oLCBub3QgcGxhaW4gc3RkLWhvc3QuaC4KLQotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogR2VuZXJhdGUgaW50byBjdXJyZW50IGRpcmVjdG9yeSBieSBncmFiYmluZwotCTY0LWJpdCBkZWZpbml0aW9uIChpZiBhbnkpIGZyb20gc3lzZGVwLmguCi0JKiBiZmQtaW4uaDogUHV0IGluIG1hcmtlciBmb3Igc3lzZGVwLmggaW5jbHVzaW9uLgotCi1GcmkgSnVuIDE4IDE5OjU3OjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IENoZWNrIGZvciBvdmVyZmxvdyBvbgotCXBjLXJlbGF0aXZlIHJlbG9jYXRpb25zIGlmIHRoZSBob3d0byBhc2tlZCBmb3IgaXQuCi0KLUZyaSBKdW4gMTggMTY6MDA6MjAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzdG1wLWJmZC5oKTogSWdub3JlIG5vbnplcm8gZXhpdCBzdGF0dXMgZnJvbSBncmVwLgotCi1GcmkgSnVuIDE4IDE2OjU0OjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvcmlzY29zLm17aCx0fTogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLntob3N0LGlufTogVXNlIHRoZW0uCi0KLUZyaSBKdW4gMTggMTI6NTU6MTAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1pcHMuYzogY29tbWVudCBjaGFuZ2UuICBUaGlzIGlzIGEgbWlwcyBmaWxlLCBub3QgODhrLgotCi1Nb24gSnVuIDE0IDE0OjAyOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjYWNoZS5jIChiZmRfY2FjaGVfaW5pdCk6IEluY3JlbWVudCBvcGVuX2ZpbGVzIGFuZCBjYWxsIGNsb3NlX29uZQotCWlmIG5lY2Vzc2FyeS4KLQkoYmZkX29wZW5fZmlsZSk6IERvbid0IGluY3JlbWVudCBvcGVuX2ZpbGVzIGhlcmUuCi0KLUZyaSBKdW4gMTggMTA6MDA6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWx0YTg4Lm1oOiBEb24ndCBzZXQgQ0MuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZWxmMzIte21pcHMsbTg4ayxnZW5lcmljfS4KLQllbGYzMi17bWlwcyxtODhrLGdlbmVyaWN9LmM6IE5ldyBmaWxlcy4KLQl0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBJbmNsdWRlIGJmZF9lbGYzMl97bWlwcyxtODhrLGdlbmVyaWN9X3ZlYy4KLQllbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IE1hdGNoIGVsZjMyLWdlbmVyaWMgZm9yIGFsbCBtYWNoaW5lcyB3aGljaAotCWRvbid0IG1hdGNoIGEgZGlmZmVyZW50IHRhcmdldC4KLQotRnJpIEp1biAxOCAwMzoxMjoxMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUVsaW1pbmF0ZSAiaW50OF90eXBlIiwgImludDE2X3R5cGUiLCAiaW50MzJfdHlwZSIsIGFuZCB0aGVpcgotCXZhcmlhbnRzIGZyb20gdGhlIEJGRCB1bml2ZXJzZS4gIExlYXZlIHRoZSA2NC1iaXQgdHlwZXMgZm9yIG5vdywKLQlzaW5jZSB0aGV5IGFyZSBpbiBmbHV4LgotCi0JKiBhb3V0eC5oLCBocDMwMGhwdXguYzogIEVsaW1pbmF0ZSBuZWVkbGVzcyAoaW50MzJfdHlwZSkgY2FzdHMuCi0JKiBsaWJhb3V0LmggKEdFVF9TV09SRCk6ICBDb252ZXJ0IChpbnQzMl90eXBlKSB0byAoaW50KS4KLQkqIGllZWUuYzogIENvbnZlcnQgdWludDhlX3R5cGUgPT4gdW5zaWduZWQgY2hhci4KLQkqIG9hc3lzLmM6ICBFeHRlbnNpdmUgY2hhbmdlcyB0byBlbGltaW5hdGUgb2Jzb2xldGUgdHlwZXMuCi0JVGhlc2UgZGVwZW5kIG9uIGNoYW5nZXMgaW4gLi4vaW5jbHVkZS9vYXN5cy5oIGFzIHdlbGwuCi0JKiBob3N0cy8qLmg6ICBSZW1vdmUgZGVjbGFyYXRpb25zIG9mIGFsbCB0aGVzZSB0eXBlcy4KLQotTW9uIEp1biAxNCAxNDowMjo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvZGVsdGE4OC5oOiAjaWYgMCBvdXQgc29tZSBkZWNsYXJhdGlvbnMgd2hpY2ggY29uZmxpY3Qgd2l0aAotCXN5c3RlbSBoZWFkZXJzLgotCi1Nb24gSnVuIDE0IDE3OjA4OjE4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiByZW1vdmUgcGFyZW50ZGlyIGNydWZ0Ci0KLU1vbiBKdW4gMTQgMTk6MDQ6MDkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX2dldF9zeW1ib2xfaW5mbyk6ICBSZW1vdmUgcmVkdW5kYW50IGNvcHkuCi0JKiBFeHB1cmdhdGUgcmFuZG9tIERFRlVOcyB0aGF0IGhhdmUgY3JlcHQgaW4uCi0KLU1vbiBKdW4gMTQgMTA6MjM6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQ29uc3RydWN0b3Igc2VjdGlvbnMgc2hvdWxkCi0Jb25seSBiZSBhbGlnbmVkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgotCi1TYXQgSnVuIDEyIDE2OjEzOjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oIChzdHJ1Y3QgaW50NjRlX3N0cnVjdCk6IFJlbW92ZSBuZWVkbGVzcyB0eXBlZGVmCi0Ja2V5d29yZC4KLQotRnJpIEp1biAxMSAxNDoyNTozNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCBmbGFncyB0byAxLCBicmVha2luZwotCTE5MjcgYnV0IGZpeGluZyBzb21lIG90aGVyIGltcG9ydGFudCB0aGluZ3MuCi0KLVRodSBKdW4gMTAgMjA6MzY6MjIgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaCAoaW50NjRlX3R5cGUpOiBGaXggZGVmaW5pdGlvbi4KLQotVGh1IEp1biAxMCAxMTo0ODoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IFVzZSBTVFlQX01JUFNfSU5JVCBmb3IKLQlzZWN0aW9uIG5hbWVkIF9JTklULiAgRG9uJ3Qgc2V0IFNUWVBfVEVYVCB1bmxlc3MgU0VDX0NPREUgaXMgc2V0LgotCShlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IFRyZWF0IGEgU1RZUF9NSVBTX0lOSVQgc2VjdGlvbiBsaWtlCi0JYSBTVFlQX1RFWFQgc2VjdGlvbi4KLQotV2VkIEp1biAgOSAxNjo0ODoxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLCBoZWFkZXJzKTogZG9uJ3QgcHV0IGNvbW1lbnRzIGFmdGVyIGEgdGFiCi0JaW4gdGhlIGFjdGlvbnMgc2VjdGlvbiBvZiBhIHJ1bGUKLQotV2VkIEp1biAgOSAxNTowMDowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9ta29iamVjdF9ob29rKTogTWFyayBaTUFHSUMgZmlsZXMgYXMgRF9QQUdFRC4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgbm90IERfUEFHRUQsIGRvbid0IGFkZCB0aGUKLQlzZWN0aW9uIGhlYWRlcnMgdG8gdGV4dF9zaXplLiAgSWYgbm90IERfUEFHRUQsIHNldCB0aGUgbWFnaWMKLQludW1iZXIgdG8gT01BR0lDIHJhdGhlciB0aGFuIFpNQUdJQy4gIElmIGNyZWF0aW5nIGEgRF9QQUdFRAotCWV4ZWN1dGFibGUsIHRoZSBleGVjdXRhYmxlIG11c3QgZnVsbHkgb2NjdXB5IGFuIGV2ZW4gbnVtYmVyIG9mCi0JcGFnZXMuCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbywgbWFrZV9iZmRfYXNlY3Rpb24sIGVjb2ZmX2xpdHRsZV92ZWMsCi0JZWNvZmZfYmlnX3ZlYyk6IENvbnNpc3RlbnRseSBzZXQgc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgdG8gNCwKLQlzaW5jZSBFQ09GRiBzZWN0aW9ucyBzaG91bGQgYmUgbXVsdGlwbGVzIG9mIDE2IGJ5dGVzLgotCShlY29mZl9saXR0bGVfdmVjLCBlY29mZl9iaWdfdmVjKTogQWRkZWQgRF9QQUdFRCB0byBvYmplY3RfZmxhZ3MuCi0JTWFkZSBhcl9wYWRfY2hhciBhbmQgYXJfbWF4X25hbWVsZW4gYWdyZWUgZm9yIGJvdGguCi0KLVR1ZSBKdW4gIDggMjA6Mjg6MDIgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlcikKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogc3VidHJhY3Qgc2VjdGlvbiB2bWEgZnJvbQotCXN5bWJvbCB2YWx1ZSwgc2luY2UgYmZkIHN5bWJvbHMgYXJlIHNlY3Rpb24gcmVsYXRpdmUsIGJ1dCBFTEYKLQlzeW1ib2xzIGFyZW4ndC4KLQotVHVlIEp1biAgOCAxMjowODoyNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjcHUtaTk2MC5jLCBjcHUtaDgzMDAuYyAoY29tcGF0aWJsZSk6IE1ha2Ugc3RhdGljLgotCi1UdWUgSnVuICA4IDE0OjI3OjU2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvbmV3cy5oLCBjb25maWcvbmV3cy5taDogTmV3IGZpbGVzLgotCi1UdWUgSnVuICA4IDEyOjA4OjI3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbjIuaCwgYXJjaHVyZXMuYyAoYmZkX21hY2hfaDgzMDBbaF0pOiBuZXcgZGVmaW5lcy4KLQkqIGNvZmYtaDgzMDAuYzogTW9yZSBhZGRyZXNzaW5nIG1vZGVzLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBDb3BlIHdpdGggSDgzMDAgbWFnaWMKLQludW1iZXIuCi0JKiBjcHUtaDgzMDAuYzogUmVtb3ZlZCBkaXNhc3NlbWJsZSBzdHVmZi4gKGg4MzAwX3NjYW4pOiBSZWNvZ25pc2UKLQlIOC8zMDBIIG5hbWUuIChjb21wYXRpYmxlKTogTmV3IGZ1bmN0aW9uLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjKTogQ29wZSB3aXRoIG1vcmUKLQlhZGRyZXNzaW5nIG1vZGVzLgotCi1UdWUgSnVuICA4IDEwOjMwOjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLQllY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbmx5IHJvdW5kIHRvIHBhZ2UgYm91bmRhcmllcyBpZgotCURfUEFHRUQgZmxhZyBpcyBzZXQgZm9yIHRoZSBvdXRwdXQgQkZELgotCi1GcmkgSnVuICA0IDE1OjQ3OjUyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGdldF9pbmRleCwgY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBGaXggcG9pbnRlcgotCWNhc3RzIHRvIHdvcmsgb24gbWFjaGluZSB3aGVyZSBzaXplb2YobG9uZykgIT0gc2l6ZW9mKGludCkgIT0KLQlzaXplb2YoY2hhciAqKS4KLSAgICAgICAgKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogRGl0dG8uCi0JKiBjcHUtaDgzMDAuYyBjb2ZmLWg4MzAwLmM6IFN1cHBvcnQgZm9yIEg4LzMwMC1ILgotCi1GcmkgSnVuICA0IDE1OjI0OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbHMpOiBGb3IgZW1wdHkgc3RyaW5nIHRhYmxlLCB3cml0ZQotCW91dCA0IGluIGNvcnJlY3QgYnl0ZSBvcmRlci4gIChmcm9tIG1pbnlhcmRAYm5yLmNhKQotCi0JKiBlbGYzMi1ocHBhLmM6IERvbid0IGluY2x1ZGUgbGliaHBwYS5oIGZvciBub3c7IGRlZmluZQotCUJZVEVTX0lOX1dPUkQgaW5zdGVhZCwgdW50aWwgVXRhaCBzZW5kcyBhIGJldHRlciBmaXguCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogVXNlIHhtYWxsb2MgYW5kIHhyZWFsbG9jIGluc3RlYWQKLQlvZiBtYWxsb2MgYW5kIHJlYWxsb2MuCi0KLUZyaSBKdW4gIDQgMDc6NDk6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lY29mZmwqKTogTmV3IHRhcmdldDsgdXNlIGRlY3N0YXRpb24uCi0JKG1pcHMtKi1lY29mZiopOiBBZGRlZCB0cmFpbGluZyAnKicuCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9nZXRfZGVidWcpOiBHZXQgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBQRFIKLQlmb3IgdGhlIEZEUiwgbm90IGZyb20gdGhlIGZpcnN0IFBEUiBpbiB0aGUgZmlsZS4KLQotVGh1IEp1biAgMyAxNjo0MToxMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfZ2V0X3N5bWJvbF9pbmZvKTogIE5ldyBmdW5jIG5lZWRlZCBmb3IgSlVNUF9UQUJMRS4KLQotVGh1IEp1biAgMyAxNTozMzo1NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9nZXRfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBKdW4gIDMgMTM6MDc6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IERvbid0IGNyYXNoIGlmIG5vIHN5bWJvbHMgaGF2ZSBiZWVuCi0JYWxsb2NhdGVkIHlldC4KLQotCUZyb20gUGV0ZXIgSG9vZ2VuYm9vbSAoaG9vZ2VuQHNjaGFmZXIuY3MudXRhaC5lZHUpOgotCSogbGliaHBwYS5oIChNQVhDT01MRU4pOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCShfUEFfUklTQ19JRCk6IE9ubHkgZGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBlbGYzMi1ocHBhLmM6IEluY2x1ZGUgbGliaHBwYS5oLgotCi0JRnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkqIGhvc3RzL21pcHNic2QuaCAoSE9TVF9EQVRBX1NUQVJUX0FERFIpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQotCSogZWxmMzItaHBwYS5oIChzeW1leHRfcm9vdFAsIHN5bWV4dF9sYXN0UCk6IERlbGV0ZSBkZWNscy4KLQotVGh1IEp1biAgMyAwMDoyMzo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiBkZWZpbmUgRVhUUkFMSUJFUyB0byAtbG0gKGZvciBiaW51dGlscyksIGFsc28KLQlyZW1vdmUgZGVmaW5lcyBvZiBfX01TRE9TX18gYW5kIF9fR08zMl9fICh0aGVzZSBhcmUgaW4gdGhlCi0JY29tcGlsZXIgbm93KS4KLQotV2VkIEp1biAgMiAxNzo1NzoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlGcm9tIFV0YWg6Ci0JKiBob3N0cy9ocHBhYnNkLmg6IEVsaW1pbmF0ZSB1c2Ugb2Ygb2Jzb2xldGUgRVhGVU4uCi0JKiBjb25maWcvaHBwYWJzZC5taDogRG9uJ3QgdXNlIHJhbmxpYi4KLQotVHVlIEp1biAgMSAwNDoxNTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IE5ldyBmaWxlLCBmb3Igd29yZC1zaXplIGluZGVwZW5kZW50IGNvZGUuCi0JKiBlbGZjb2RlLmggKGVsZl9oYXNoKTogTW92ZWQgdG8gdGhlcmUsIHJlbmFtZWQgYmZkX2VsZl9oYXNoLgotCSogTWFrZWZpbGUuaW46IEluY2x1ZGUgZWxmLm8gaW4gc3RhbmRhcmQgb2JqZWN0cy4KLQotCSogYmZkLWluLmggKENBVDMpOiBEZWZpbmUgaGVyZS4KLQkqIGxpYmFvdXQuaCwgbGliZWxmLmg6IE5vdCBoZXJlLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IHN0cnRhYik6IERlZmluZSBoZXJlLgotCShiZmRfZWxmX2xvY2F0ZV9zaCk6IERlY2xhcmUgaGVyZS4KLQkqIGVsZmNvZGUuaCAoc3RydWN0IHN0cnRhYik6IERlZmluaXRpb24gZGVsZXRlZC4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgSFBQQV9QQ1JFTF9DQUxMXzEyLgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSAiYWxsIiwgbm90ICJiZmQuaCIsIGJlIHRoZSBkZWZhdWx0IHRhcmdldC4KLQkoc3RtcC1iZmQuaCk6IE5ldyB0YXJnZXQ7IHByZXZlbnRzIHJlYnVpbGRpbmcgd29ybGQgaWYgYmZkLmgKLQloYXNuJ3QgcmVhbGx5IGNoYW5nZWQuCi0KLQlUdWUgTWF5IDI1IDEyOjE1OjE1IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9oYXNoKTogUHJvdmlkZSBlbGYgc3RhbmRhcmQgaGFzaCBmdW5jdGlvbi4KLQkodmFyaW91cyk6IEtleSBvZmYgb2YgdGhlIG1hY2hpbmVzIHVzZV9yZWxhX3AgZmllbGQgdG8gZGV0ZXJtaW5lCi0Jd2hldGhlciB0byB1c2UgUkVMIG9yIFJFTEEgcmVsb2NhdGlvbnMuCi0JKGVsZl9zd2FwX3JlbG9jX291dCwgZWxmX3N3YXBfcmVsb2NfaW4pOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IEFsbG9jYXRlIGEgcG9pbnRlciB0byBob2xkIGFsbCBkYXRhIGZvciBhCi0JZ2l2ZW4gc2VjdGlvbiwgYW5kIGNvcHkgZWFjaCBmcmFnbWVudCBpbnRvIHRoZSBkYXRhIHJlZ2lvbi4KLQlVcGRhdGUgdGhlIHNlY3Rpb24ncyBwb2ludGVyIHdpdGggdGhlIFJFTCBpbXBsaWNpdCBhZGRlbmRzIGlmIHRoZQotCW1hY2hpbmUgdXNlcyBSRUwgcmVsb2NhdGlvbi4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIHRvCi0JZWxmX2kzODZfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCBhbmQgdXNlIGNwcCB0byBtYXAgdGhlIG5hbWUgYmFjawotCWludG8gd2FzIGVsZjMyLXRhcmdldC5oIGV4cGVjdHMuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIHRvIGVsZl9pMzg2X2luZm9fdG9faG93dG8uCi0JKGVsZl9pMzg2X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCByZWxvY2F0aW9uIHN1cHBvcnQuCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG8pOiBBZGQgbWluaW1hbCByZWxvY2F0aW9uIHN1cHBvcnQuCi0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogQWRkIHVzZV9yZWxhX3AsIGVsZl82NF9wLAotCWVsZl9pbmZvX3RvX2hvd3RvX3JlbCBmaWVsZHMuCi0KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmVkKTogQWRkIHN1cHBvcnQgZm9yIG5ldyBmaWVsZHMgaW4KLQllbGZfYmFja2VuZF9kYXRhLgotCi0JU3VuIE1heSAzMCAxNjozODoyNCAxOTkzICBQZXRlciBIb29nZW5ib29tICAoaG9vZ2VuQGZhc3QuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYzogQWRkIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBzdXBwb3J0LCBmaXgKLQlyZWxvY2F0aW9uIGhvd3RvIHRhYmxlLCBhZGQgc3R1YiBnZW5lcmF0aW9uIHN1cHBvcnQuCi0KLQkqIGVsZjMyLWhwcGEuaDogQWRkIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBzdXBwb3J0LCBmaXgKLQlyZWxvY2F0aW9uIGhvd3RvIHRhYmxlLCBhZGQgc3R1YiBnZW5lcmF0aW9uIHN1cHBvcnQuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2VsZl9sb2NhdGVfc2gpOiBOZXcgZnVuY3Rpb24gdG8gbG9jYXRlIEVMRgotCXNlY3Rpb24gaGVhZGVyLgotCi0JKiBlbGZjb2RlLmggKGJmZF9hZGRfdG9fc3RydGFiKTogTWFkZSBub24tc3RhdGljIGR1ZSB0byBhIGNhbGwKLQlmcm9tIGVsZjMyLWhwcGEuYy4KLQotCSogZWxmY29kZS5oIChlbGZfaWR4X29mX3N5bSk6IFJldHVybiBTVE5fVU5ERUYgaW5zdGVhZCBvZiAwIHdoZW4KLQl0aGUgc3ltYm9sIGlzIG5vdCBmb3VuZC4KLQotCSogZWxmY29kZS5oIChlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTm90IGFsbCBzZWN0aW9uCi0JZmlsZSBwb3NpdGlvbnMgd2VyZSBjb21wdXRlZC4KLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X3NlY3RfdGh1bmspOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGhwcGEuYyAoc2lnbl9leHQpOiBSZWltcGxlbWVudC4KLQotCSogaHBwYS5jIChyb3VuZF9kb3duLHJvdW5kLHJvdW5kX3VwLEwsUixMUyxSUyxMRCxSRCxMUixSUik6IE1ha2UKLQl0aGVzZSBmdW5jdGlvbnMgc3RhdGljLgotCi1UdWUgSnVuICAxIDE0OjQwOjQxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogIE1vdmUgY2xvc2VyIHRvIGhlYWRlcnMgLSBhbmQgYWZ0ZXIgJ2FsbCchCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiAgRG9uJ3Qgc2V0Ci0JQlNGX0RFQlVHR0lORyBmb3IgY29uc3RydWN0b3Igc3ltYm9scywgb25seSBCU0ZfQ09OU1RSVUNUT1IuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6ICBUcmFuc2xhdGUKLQljb25zdHJ1Y3RvciBzeW1ib2xzIHByb3Blcmx5LgotCi1UaHUgTWF5IDI3IDE2OjA5OjA0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KTogdXNlIDQgYnl0ZSBhbGlnbm1lbnQgYXMgYQotCW1pbmltdW0uCi0JKiBhb3V0LXRhcmdldC5oIChtaW5pbXVtX2FsaWdubWVudCk6IDggYnl0ZSBhbGlnbm1lbnQgaXMgcmlnaHQuCi0JKGZpeCBsZC8yNjgwKQotCi1UaHUgTWF5IDI3IDEzOjM4OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogQnVpbGQgYmZkLWluMi5oIGluIHNvdXJjZSBkaXJlY3RvcnksCi0JZnJvbSBiZmQtaW4uaCBhbmQgLmMgZmlsZXMuICBCdWlsZCBiZmQuaCBpbiBidWlsZCBkaXJlY3RvcnksCi0Jc3Vic3RpdHV0aW5nIGluIHJlcXVlc3RlZCB0YXJnZXQgd29yZCBzaXplLiAgSW5zZXJ0IHdvcmQgc2l6ZSBpbnRvCi0JbWFrZWZpbGUsIGFuZCBtYXliZSBlbmFibGUgNjQtYml0IHRhcmdldHMuCi0KLQkqIGJmZC1pbi5oLCBsaWJiZmQuYywgZGVtbzY0LmMsIHRhcmdldHMuYzogRGVmaW5lIEJGRDY0IGlmIDY0IGJpdHMKLQlhcmUgYXZhaWxhYmxlLiAgQ29uZGl0aW9uYWxpemUgb24gdGhpcy4gIEFzc3VtZSBIT1NUXzY0X0JJVAotCXdpbGwgYmUgZGVmaW5lZCBpZiBuZWVkZWQsIHNvIDY0LWJpdCB0YXJnZXRzIGFyZSBjb25kaXRpb25hbGl6ZWQKLQlvbmx5IGluIHRoZSBNYWtlZmlsZS4KLQotVHVlIE1heSAyNSAxNDowMzo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0U2NCk6IFJld3JpdGUgdG8gYXZvaWQgb3V0LW9mLXJhbmdlIHZhbHVlcy4KLQotCSogY29mZi1zaC5jIChydHlwZTJob3d0byk6IFB1dCBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyci4KLQkoZXh0cmFfY2FzZSk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUuCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9wcmludF9zeW1ib2wpOiBDYXN0IGJmZF92bWEgdmFsdWVzIHRvIGxvbmcKLQliZWZvcmUgY2FsbGluZyBwcmludGYuCi0KLQkqIGVsZmNvZGUuaDogTmV3IGZpbGUsIGFsbW9zdCBjb21wbGV0ZWx5IGRlcml2ZWQgZnJvbSBvbGQgZWxmMzIuYy4KLQkqIGVsZjMyLmM6IE5vdyBqdXN0IGRlZmluZSBBUkNIX1NJWkUgYW5kIGluY2x1ZGUgZWxmY29kZS5oLgotCSogTWFrZWZpbGUuaW4gKGVsZjY0Lm8pOiBMaXN0IGRlcGVuZGVuY2llcywgZG9uJ3QgYnVpbGQgYnkKLQlkZWZhdWx0LgotCShlbGY2NC5jKTogQWRkIHRvIGxpc3Qgb2Ygc291cmNlcy4KLQkoZWxmMzIubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBlbGYzMi0qLmM6IFVwZGF0ZWQgdHlwZS9tYWNyby9zdHJ1Y3R1cmUgbmFtZXMuICBDbGVhbmVkIHVwCi0JbmFtZXNwYWNlIHBvbGx1dGlvbjsgcmVuYW1lIHZlY3RvcnMuCi0JKiB0YXJnZXRzLmMsIGNvbmZpZy8qLWVsZi5tdDogVXBkYXRlZC4KLQkqIEFsbCB1c2VzIG9mIDMyLWJpdCB2ZXJzaW9ucyBvZiBzdHJ1Y3R1cmVzLCByb3V0aW5lcywgYW5kIG1hY3JvcwotCXJlbmFtZWQuCi0KLQkqIE1ha2VmaWxlLmluIChhcmNodXJlcy5vLCB0YXJnZXRzLm8pOiBEZXBlbmQgb24gTWFrZWZpbGUuCi0KLU1vbiBNYXkgMjQgMTU6NTM6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZW51bSByZWxvY190eXBlKTogTm8gY29tbWEgYWZ0ZXIgbGFzdCBlbnVtZXJhdG9yLgotCi0JKiBlbGYzMi5jIChlbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24pOiBIYW5kbGUgaW5kZXggb2YgemVybwotCXNwZWNpYWxseS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgbmVlZCB0byBkbwotCXNvIGhlcmUuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWxldGVkIG9uZSB1bnVzZWQgdmFyaWFibGUgYW5kCi0JaW5pdGlhbGl6ZWQgYW5vdGhlciB0byBhdm9pZCBnY2Mgd2FybmluZ3MuCi0JKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUuCi0KLUZyaSBNYXkgMjEgMTk6MDQ6MjEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYzogIE5ldyBtb2R1bGUgZm9yIEx5bnggdmFyaWFudCBvZiBhLm91dC4KLQkqIE1ha2VmaWxlLmluIChCRkRfQkFDS0VORFMgQ0ZJTEVTIGRlcGVuZHMpOiAgQWRkIGkzODZseW54LmMuCi0JKiBnZW4tYW91dC5jOiAgR2V0IHJpZCBvZiBkZWZ1bmN0IGVuZGlhbiBzdHVmZiwgcHJpbnQgb3V0IHRydWUKLQlwYWdlc2l6ZS4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBBZGQgaTM4Nmx5bnhfdmVjLgotCi1GcmkgTWF5IDIxIDE3OjAyOjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBpMzg2LXNjby5tdCBmb3IgaVszNl04Ni0qLWlzYyouCi0KLUZyaSBNYXkgMjEgMTM6NDQ6MTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LXRhcmdldC5oLCBhb3V0eC5oLCBjb2ZmLWFscGhhLmMsCi0JY29mZi1taXBzLmMsIGNvZmZnZW4uYywgZWxmMzIuYywgaWVlZS5jLCBsaWJhb3V0LmgsIGxpYmNvZmYtaW4uaCwKLQlsaWJlbGYuaCwgbWlwc2JzZC5jLCBvYXN5cy5jLCBzY28tY29yZS5jLCBzcmVjLmMsIHRla2hleC5jLAotCXRyYWQtY29yZS5jOiBEZWZpbmUgYSBUQVJHRVRfZ2V0X3N5bWJvbF9pbmZvIGZ1bmN0aW9uIG9yIG1hY3JvLgotCVJlbW92ZSB0aGUgYmZkX3ByaW50X3N5bWJvbF9ubSBjYXNlIGZyb20gVEFSR0VUX3ByaW50X3N5bWJvbC4KLQotCSogYmZkLWluLmg6IERvbid0IGRlZmluZSBiZmRfcHJpbnRfc3ltYm9sX25tLgotCURlZmluZSBzeW1ib2xfaW5mbyB0eXBlLgotCShKVU1QX1RBQkxFKTogU2V0IF9nZXRfc3ltYm9sX2luZm8gZWxlbWVudC4KLQotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSwgYmZkX3N5bWJvbF9pbmZvKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX2RlY29kZV9zeW1jbGFzcyk6IFVzZSBjb2ZmX3NlY3Rpb25fdHlwZS4KLQotCSogdGFyZ2V0cy5jOiBBZGQgYmZkX2dldF9zeW1ib2xfaW5mbyBjYWxsLgotCi1XZWQgTWF5IDE5IDE1OjMwOjUyIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiAgVXNlIHVuc2lnbmVkIGNoYXIgdG8gYXZvaWQKLQljb21wbGFpbnRzIGZyb20gYW5jaWVudCBnY2Mncy4KLQotV2VkIE1heSAxOSAxNTo1MToxOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmM6ICBDaGVjayBtYWNybyBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VELgotCWhvc3RzL2kzODZsaW51eC5oOiAgRGVmaW5lIGl0LgotCi1Nb24gTWF5IDE3IDE1OjAwOjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBWRVJTSU9OLCBiZmQtaW4uaDogQnVtcCB2ZXJzaW9uIG51bWJlciB0byAyLjIuCi0KLQkqIGhwcGEuYyAoYXNzZW1ibGVfMywgZGlzX2Fzc2VtYmxlXzMsIGFzc2VtYmxlXzEyLAotCWRpc19hc3NlbWJsZV8xMiwgYXNzZW1ibGVfMTcsIGRpc19hc3NlbWJsZV8xNywgYXNzZW1ibGVfMjEsCi0JZGlzX2Fzc2VtYmxlXzIxLCBzaWduX2V4dCwgb25lcywgc2lnbl91bmV4dCwgbG93X3NpZ25fZXh0LAotCWxvd19zaWduX3VuZXh0LCByb3VuZF9kb3duLCByb3VuZCwgcm91bmRfdXAsIEwsIFIsIExTLCBSUywgTEQsIFJELAotCUxSLCBSUiwgaHBwYV9maWVsZF9hZGp1c3QpOiBOZXcgZnVuY3Rpb25zLgotCi1Nb24gTWF5IDE3IDEwOjA0OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEFkZGVkIHN1cHBvcnQgZm9yIGluZGlyZWN0Ci0Jc3RhYnMgc3ltYm9scywgaW5jbHVkaW5nIG5ldyBpbmRpcmVjdF9wdHJfcHRyIGFyZ3VtZW50LgotCShlY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQYXNzIG5ldyBhcmd1bWVudCBpbiBjYWxscyB0bwotCWVjb2ZmX3NldF9zeW1ib2xfaW5mby4KLQotRnJpIE1heSAxNCAwMDowNTowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIG02OGsgc3lzdiBzeXN0ZW1zLCB1c2UgbTY4ay1jb2ZmLgotCi0JKiBjb25maWcvaHBwYS1lbGYubXQgKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIERFRkFVTFRfVkVDVE9SIGhlcmUuCi0JKFRERUZBVUxUUyk6IERlZmluZSBpdCBoZXJlLiAgVXNlIHRoZSBuZXcgbmFtZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9iYWNrZW5kX2RhdGEpOiBEZWxldGU7IHJlbHkgb24gZGVmYXVsdAotCXZhbHVlcyBpbnN0ZWFkLgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgc29tZSBIUFBBIHJlbG9jIHR5cGVzLgotCi0JKiBhaXgzODYtY29yZS5jIChOT19HRVRTKTogRml4IFBST1RPIGludm9jYXRpb24gdG8gaGF2ZSBjb3JyZWN0Ci0JbnVtYmVyIG9mIGFyZ3VtZW50cy4KLQkoYWl4Mzg2X2NvcmVfZmlsZV9wKTogSW5pdGlhbGl6ZSBjb3JlX3NpemUgdG8gY29ycmVjdCB2YWx1ZS4KLQotV2VkIE1heSAxMiAxNDozOTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUsIHNldCB0byAkKENDKS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBDQ19GT1JfQlVJTEQuCi0KLQkqIGJvdXQuYyAoYW91dDMyX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUgdG8gYmUKLQlfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgcmF0aGVyIHRoYW4gYmZkX3RydWUuCi0KLQkqIGNvZmYtbWlwcy5jOiBJbmNsdWRlIGxpYmFvdXQuaCBhbmQgYW91dC9hb3V0NjQuaCB0byBnZXQKLQlkZWZpbml0aW9ucyBmb3IgTl9TRVRbQVREQl0uCi0JKGVjb2ZmX2hvd3RvX3RhYmxlKTogTW92ZWQgbmVhciB0b3Agb2YgZmlsZS4KLQkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogSWYgYSBTVEFCUyBzeW1ib2wgb2YgdHlwZSBOX1NFVFtBVERCXSBpcwotCXNlZW4sIGNvb2sgdXAgYSBjb25zdHJ1Y3RvciBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUgYW5kIHB1dCBpbiBhCi0JcmVsb2MgcG9pbnRpbmcgdG8gdGhlIHN5bWJvbC4gIFRoaXMgbGV0cyB0aGUgR05VIGxpbmtlciBidWlsZAotCWdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIHdpdGhvdXQgdXNpbmcgY29sbGVjdC4KLQotVHVlIE1heSAxMSAwMDozMzozMSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29mZi1tODhrLmMgKG04OGtiY3NfdmVjKTogIFN5bWJvbHMgaGF2ZSB1bmRlcmJhcnMuCi0KLU1vbiBNYXkgMTAgMDU6NTU6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL21pbmlmcmFtZS5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgaXQuCi0KLVN1biBNYXkgIDkgMTY6MzY6NTkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1ic2QpOiAgQ2hhbmdlIHRvIGhwcGEqLSotYnNkKgotCSogY29uZmlndXJlLmluIChocHBhKi0qLWhwdXgpOiAgQ2hhbmdlIHRvIGhwcGEqLSotaHB1eCoKLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki1ocC1ic2QpOiAgQ2hhbmdlIHRvIG02OCotaHAtYnNkKgotCSogY29uZmlndXJlLmluIChtNjgqLSotaHB1eCk6ICBDaGFuZ2UgdG8gbTY4Ki0qLWhwdXgqCi0JKiBjb25maWd1cmUuaW4gKCotKi1ic2QpOiAgQ2hhbmdlIHRvICotKi1ic2QqCi0KLVdlZCBNYXkgIDUgMTY6MDg6MzIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiAgQ2FzdCBlbnVtcyB0bwotCWludCwgZm9yIHRoZSBzYWtlIG9mIHRoZSBvbGQgUG9ydGFibGUgQyBDb21waWxlci4KLQotTW9uIE1heSAgMyAxNDozNzowMSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogIEFkZCBjcHUtc2guYyBhbmQgY29mZi1zaC5jLgotCi1Nb24gTWF5ICAzIDE0OjAzOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEdldCB0YXJnZXQgbmFtZSByaWdodCBmb3IgbTY4Ki0qLWhwdXguCi0KLVN1biBNYXkgIDIgMTE6Mzk6NDQgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jIChOT19TSUdORURfR0VUKTogIE5ldyBtYWNyby4KLQkqIHRyYWQtY29yZS5jICh0cmFkX2NvcmVfdmVjKTogIFVzZSBuZXcgTk9fU0lHTkVEX0dFVCBpbnN0ZWFkIG9mCi0Jc2lnbmVkIE5PX0dFVCwgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLWxpbnV4Kik6ICBBZGQ7IGJmZF90YXJnZXQgPSBpMzg2LWxpbnV4LgotCSogY29uZmlndXJlLmluICgqLSotbGludXgqKTogIFJlbW92ZSB1bnRpbCBsaW51eCBwb3J0IGZvciBhCi0Jbm9uLWkzODYvaTQ4NiBzeXN0ZW0gaXMgYWN0dWFsbHkgYXZhaWxhYmxlLgotCi1GcmkgQXByIDMwIDIwOjA0OjEwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogICN1bmRlZiBlXyogc3ltYm9scyB3aGljaCBjb21lIGZyb20gPG1hY2hpbmUvc29tLmg+Ci0Jd2hlbiBjb21waWxpbmcgdW5kZXIgSFBVWC4KLQotRnJpIEFwciAzMCAxNzoyNToyMyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBUaGUgZm9sbG93aW5nIHBhdGNoZXMgYXJlIGZyb20gSmVmZnJleSBMYXcgPGxhd0Bjcy51dGFoLmVkdT4uCi0JKiBocHBhLmMgKGhwcGFfY29yZV9maWxlX3ApOiBQcm92aWRlIGEgdGVtcG9yYXJ5IGR1bW15IHJvdXRpbmUKLQlmb3IgSE9TVF9IUFBBQlNELgotCSogYmZkL2hvc3RzL2hwcGFic2QuaDogRml4IGRlY2xhcmF0aW9ucyBvZiBtYWxsb2MgYW5kIGZyZWUuCi0JKiBiZmQvbGliaHBwYS5oOiBJbmNsdWRlIHN5c2RlcCBoZXJlLiAgQ29uZGl0aW9uYWxpemUKLQlpbmNsdWRlcyBiYXNlZCBvbiBIT1NUX0hQUEFIUFVYIG9yIEhPU1RfSFBQQUJTRC4KLQlQcm92aWRlIGRlZmluaXRpb25zIGZvciBNQVhDT01MRU4gYW5kIF9QQV9SSVNDX0lEIHN1aXRhYmxlCi0JZm9yIEJTRC4KLQotRnJpIEFwciAzMCAxNzozNDoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYzogRG9uJ3QgaW5jbHVkZSBhLm91dC5oLiAgQXBwYXJlbnRseSBub3QgZXZlbiB0aGUKLQlHTlUgdmVyc2lvbiBpcyBuZWVkZWQuCi0KLUZyaSBBcHIgMzAgMDk6Mzg6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IHVzZSBkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzIHJhdGhlciB0aGFuIGNhc3RpbmcgYWJvcnQuCi0KLVRodSBBcHIgMjkgMTE6MzA6MzIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBlbGYzMi1ocHBhLm8uCi0KLQkqIHN5bXMuYyAoQlNGX0ZVTkNUSU9OKTogTmV3IHN5bWJvbCBmbGFnLgotCi0JKiBlbGYzMi1ocHBhLmM6IEZpeGVkIHRvIHdvcmsgd2l0aCBlbGYzMi10YXJnZXQuaC4KLQotCSogaHAzMDBocHV4LmMgKE5BTUUsIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbik6IEZpeCBmb3IKLQl0cmFkaXRpb25hbCBDLgotCSogbGliYW91dC5oIChOQU1FKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQotCSogbGliZWxmLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCShlbGZfc3ltYm9sX3R5cGUpOiBNb3ZlZCBoZXJlLCBhZGRlZCBuZXcgZmllbGRzLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZCBgZ2xvYmFsX3N5bSc7IEkgc3VzcGVjdCB0aGlzCi0JbWF5IGJlIG1pc3BsYWNlZC4KLQkqIGVsZjMyLmMgKGVsZl9zeW1ib2xfdHlwZSk6IERlbGV0ZWQgZnJvbSBoZXJlLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZHMgcmF3X3N5bXMgYW5kIGludGVybmFsX3N5bXMsIHRvCi0JcG9pbnQgdG8gYmFja2VuZCB2ZXJzaW9ucyBvZiBzeW1ib2xzLgotCShvYmpfc3ltYm9scywgb2JqX3Jhd19zeW1zLCBvYmpfaW50ZXJuYWxfc3ltcyk6IE5ldyBtYWNyb3MuCi0JKGVsZl9zd2FwX3BoZHJfb3V0LCBlbGZfYnVpbGRfcGhkcnMsIGVsZl93cml0ZV9waGRycyk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFdyaXRlIHByb2dyYW0gaGVhZGVycyBpZiBhcHByb3ByaWF0ZS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVW5uYW1lZCBzZWN0aW9ucyBnZXQgZW1wdHkgc3RyaW5nIGZvcgotCW5hbWUsIG5vdCAidW5uYW1lZCIuICBIYW5kbGUgU0hUX05PQklUUyBzZXBhcmF0ZWx5IGZyb20KLQlTSFRfUFJPR0JJVFMsIGFuZCBzZXQgc29tZSBkaWZmZXJlbnQgZmxhZ3MuCi0JKGVsZl9maWxlX3ApOiBOZXcgcm91dGluZS4KLQkoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiBDYWxsIGl0LgotCShlbGZfb2JqZWN0X3ApOiBIYW5kbGUgRU1fSFBQQS4KLQkoZWxmX3N5bWJvbF9mcm9tLCBlbGZfaWR4X29mX3N5bSk6IE5ldyBmdW5jdGlvbnMuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogR2V0IHN5bWJvbCBudW1iZXIgcmlnaHQgZm9yIHJlbG9jYXRpb25zLiAgU2V0Ci0JU0hGX0FMTE9DLCBTSEZfV1JJVEUsIFNIRl9FWEVDSU5TVFIgd2hlbiBhcHByb3ByaWF0ZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBCU1Mgc2VjdGlvbiBzaG91bGQgYmUgU0hUX05PQklUUywgbm90Ci0JU0hUX1BST0dCSVRTLiAgQWx3YXlzIGdlbmVyYXRlIHN5bXRhYiBhbmQgc3RydGFiLCBub3Qgb25seSBpZgotCXJlbG9jYXRpb25zIGFyZSBuZWVkZWQuICBTZXQgU0hGXyogZmxhZ3MgYXMgYXBwcm9wcmlhdGUuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUgYmZkX2FyY2hfaHBwYS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZpeCBvZmYtYnktb25lIGVycm9yIGluIHN5bWJvbCBjb3VudC4KLQlTdG9yZSBhIGNvcnJlY3QgdmFsdWUgZm9yIHRoZSBzeW1ib2w7IHdyaXRlIHRoZSBzaXplIGZpZWxkCi0JcHJvcGVybHk7IG1ha2Ugc29tZSBndWVzc2VzIGFib3V0IHRoZSB0eXBlIGZpZWxkLiAgU2V0IHNlY3Rpb24KLQl0eXBlIGNvcnJlY3RseSBmb3Igc3RyaW5nIHRhYmxlcy4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IENoZWNrIGZvciBhYnNvbHV0ZSBhbmQgY29tbW9uIHNlY3Rpb25zCi0JZmlyc3QuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEaXR0by4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBlbGZfc3ltYm9sX3R5cGUgaW5zdGVhZCBvZiBhc3ltYm9sLgotCVVzZSBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiAidW5uYW1lZCIgZm9yIG5hbWVsZXNzIHN5bWJvbHMuCi0JSGFuZGxlIFNUVFlfRlVOQyB0eXBlLCBhbmQgd2VpcmRuZXNzIHdpdGggIiRnbG9iYWwkIiBzeW1ib2wgZm9yCi0JSFBQQSAob25seT8pLiAgRG9uJ3QgZnJlZSByYXcgc3ltYm9sczsga2VlcCB0aGUgcG9pbnRlciBhcm91bmQgZm9yCi0JbGF0ZXIuCi0JKGVsZl9zZXRfYXJjaF9tYWNoKTogSGFuZGxlIGJmZF9hcmNoX2hwcGEuCi0JKGVsZl9maW5kX25lYXJlc3RfbGluZSk6IEp1c3QgcmV0dXJuIGZhbHNlLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQKLQlvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkIGFmdGVyIGNvbXB1dGluZyBmaWxlIHBvc2l0aW9ucy4KLQkoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogV3JpdGUgc2VjdGlvbiBjb250ZW50cyBpbW1lZGlhdGVseSwKLQlyYXRoZXIgdGhhbiBjYWNoaW5nIHRoZSB3aG9sZSBmaWxlIGFuZCB3cml0aW5nIGl0IGF0IGNsb3NlIHRpbWUuCi0KLQkqIGxpYmhwcGEuaCAoZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUsIGVudW0KLQlocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cF9hbHQsIGVudW0gaHBwYV9yZWxvY19leHByX3R5cGUsIGVudW0KLQlocHBhX3JlbG9jX2V4cHJfdHlwZV9hbHQpOiBOZXcgZW51bWVyYXRvciB0eXBlcy4KLQotCSogY29uZmlnL2hwcGEtZWxmLm10LC4gY29uZmlnL2hwcGFvc2YubWg6IEhQIFBBL09TRiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmUuaG9zdDogVXNlIHRoZW0uCi0KLVdlZCBBcHIgMjggMjM6MjE6MDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYzMi10YXJnZXQuaDogQWxsb3cgb3ZlcnJpZGVzIG9mIGFybWFwIGRlZmF1bHRzLgotCi0JKiBlbGYzMi1ocHBhLmMsIGVsZjMyLWhwcGEuaDogTmV3IGZpbGVzLgotCi0JKiBjb25maWcvaHAzMDBocHV4Lm10OiBOZXcgZmlsZS4KLQotVHVlIEFwciAyNyAwNTozOTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYWl4Mzg2LWNvcmUuYyAoTk9fR0VUUyk6IE5ldyBtYWNybzsgTk9fR0VUIGZvciBzaWduZWQgdmFsdWVzLgotCShhaXgzODZfY29yZV92ZWMpOiBVcGRhdGUgZm9yIG5ldyBmaWVsZHMuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogQ2FsbCB0YXJnZXQtc3BlY2lmaWMKLQlzbHVycF9hcm1hcCBjb2RlLCBpbnN0ZWFkIG9mIGJmZF9zbHVycF9hcm1hcC4KLQkoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogRGVjbGFyZSBpdC4KLQkqIGFvdXQtdGFyZ2V0LmggKEFSX1BBRF9DSEFSKTogRGVmaW5lIGl0IGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKHZlYyk6IFVzZSBpdC4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogTmV3IGZpZWxkIGZvciBzdWJmb3JtYXQsIGZvcgotCWRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIGhpZ2hseSBzaW1pbGFyIGEub3V0IGZvcm1hdHMuCi0JKiBhb3V0eC5oIChOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBOZXcgbWFjcm8sIGRlZmF1bHRzIHRvIGxvY2FsCi0JdmVyc2lvbiBvZiBmdW5jdGlvbi4KLQkoc3dhcF9leGVjX2hlYWRlcl9pbik6IERvbid0IGRlZmluZSBpZiBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4gaXMKLQlhbHJlYWR5IGRlZmluZWQuCi0JKiBocDMwMGhwdXguYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogSW5jbHVkZSBpdC4KLQotTW9uIEFwciAyNiAxMzoyNDo0MyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIHRhcmdldHMuYzogU3VwcG9ydCBmb3IKLQlIaXRhY2hpIFNILgotCi1Nb24gQXByIDI2IDEzOjU1OjQyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogQ2hlY2sgdGhlIGZpbGUgc2l6ZS4KLQotTW9uIEFwciAyNiAxMzoyNDo0MyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jOiBSZW1vdmUgZHVwbGljYXRlIGZ1bmN0aW9uIGFuZCBhZGQgd2FybmluZ3MuCi0KLU1vbiBBcHIgMjYgMTE6MjU6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzY28tY29yZS5jIChzY29fY29yZV92ZWMpOiBBZGQgaW5pdGlhbGl6ZXJzIGZvciBuZXcgdGFyZ2V0Ci0JZmllbGRzLgotCi1TYXQgQXByIDI0IDIxOjMzOjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIFtfTElUXTogUmVjb2duaXplIC5saXQgc2VjdGlvbi4KLQotRnJpIEFwciAyMyAxOTowMDozNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jLCBjcHUtYWxwaGEuYywgY29uZmlnL2FscGhhb3NmLm10LAotCWNvbmZpZy9hbHBoYW9zZi5tdCwgaG9zdHMvYWxwaGFvc2YuaDogIE5ldyBmaWxlcy4KLQotRnJpIEFwciAyMyAxNjo0ODo0NiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBNZXJnZSBpbiBIUFBBL0JTRCBjaGFuZ2VzIGZyb20gVXRhaC4KLQkqIGhwcGEuYzogIFVzZSB0aGlzIGZvciBib3RoIEhQVVggJiBCU0QuCi0JKiB0YXJnZXRzLmM6ICBFbmFibGUgaHBwYV92ZWMgZm9yIGJvdGggSFBVWCAmIEJTRC4KLQkqIGNvbmZpZy9ocHBhYnNkLm10OiAgVERFRklORVMgPT4gVERFRkFVTFRTLgotCSogaG9zdHMvaHBwYWJzZC5oOiAgI2RlZmluZSBIT1NUX0hQUEFCU0QuCi0KLVdlZCBBcHIgMjEgMDE6NTA6MTAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jOiAgV2hpdGVzcGFjZSBjaGFuZ2VzIGFyb3VuZCBieXRlc3dhcCBtYWNyb3MuCi0JKiBsaWJiZmQtaW4uaDogIFdoaXRlc3BhY2UgY2hhbmdlcyBhcm91bmQgYnl0ZXN3YXAgZGVjbGFyYXRpb25zLgotCi1UdWUgQXByIDIwIDE1OjU5OjA3IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfY29yZV9maWxlX3ApOiAgRG9uJ3QgZGVmYXVsdCBiZmRfZXJyb3IgdG8KLQlzeXN0ZW1fZXJyb3IgYW55bW9yZS4gIEl0IGNvbmZ1c2VzIGJmZF9jaGVja19mb3JtYXQoKS4KLQotTW9uIEFwciAxOSAyMzowMzowOCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIEFkZCBzZ2lfY29yZV9kYXRhIHRvIHRkYXRhIHVuaW9uLgotCSogY29mZi1taXBzLmM6ICBBZGQgSXJpeCA0LnggY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBob3N0cy9pcml4NC5oOiAgI2RlZmluZSBIT1NUX0lSSVg0LgotCi1Nb24gQXByIDE5IDE4OjUyOjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogQ2hlY2sgdGhhdCB0aGUKLQlzeW1ib2wncyBzZWN0aW9uIGRvZXMgZ2V0IHNldC4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogWmVybyBpbmRleCBtZWFucyBudWxsLXN0cmluZyBuYW1lLgotCi0JKiBhb3V0eC5oIChzdHJ1Y3Qgc3RyaW5ndGFiX2VudHJ5LCBzdHJ1Y3Qgc3RyaW5ndGFiX2RhdGEpOiBOZXcKLQlkYXRhIHN0cnVjdHVyZXMuCi0JKGhhc2gsIHN0cmluZ3RhYl9pbml0LCBhZGRfdG9fc3RyaW5ndGFiLCBlbWl0X3N0cnRhYiwgY29tcGFyZSk6Ci0JTmV3IGZ1bmN0aW9ucy4KLQkod3JpdGVfc3ltcyk6IFVzZSB0aGVtLCB0byByZWR1Y2Ugc3RyaW5nIHRhYmxlIHNpemUuCi0KLU1vbiBBcHIgMTkgMTY6NDU6MTIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX2NvcmVfdmVjKTogIEFkZCA2IG5ldyBpbml0aWFsaXplcnMgdG8gbWF0Y2gKLQkgIG5ldyBzaWduZWQgZ2V0L3B1dCBmaWVsZHMuICBNaW5vciByZWZvcm1hdHRpbmcgdG8gbGFiZWwKLQkgIHNvbWUgZmllbGRzLgotCi1Nb24gQXByIDE5IDA2OjA5OjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogSW5zZXJ0IGNvbW1lbnQgYWJvdXQgU1ZSMyBjb21waWxlciB3YXJuaW5ncy4KLQotCSogaG9zdHMve2hwMzAwLGkzODZpc2MsaTM4NnZ9Lmg6IFJlbW92ZSB1bnVzZWQgI2RlZmluZXMgb2Yge3IsfWluZGV4Ci0JKGJmZCB1c2VzIHN0cmNociBhbmQgdGhlIGJyb2tlbiBTVlIzLjIgY3BwIGxvc2VzIHdpdGggdGhlIGRlZmluZXMpLgotCi0JKiBsaWJiZmQuYzogYmZkX3B1dCo6IFJlbW92ZSBjYXN0cyB0byBiZmRfdm1hLgotCi1GcmkgQXByIDE2IDE3OjQ5OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoaW50ZXJuYWxfc3Vub3NfY29yZSk6IE1ha2UgY19zdGFja3RvcCBhIGJmZF92bWEuCi0JKHN3YXBjb3JlX3NwYXJjKTogTWFrZSBzcCBhIGJmZF92bWEuCi0KLVRodSBBcHIgMTUgMDk6MDk6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jOiBBZGQgc2lnbmVkIHZlcnNpb25zIG9mIGJmZF97aF8sfXtnZXQscHV0fV9zaWduZWRfPHNpemU+LgotCWxpYmJmZC5jLCBsaWJiZmQtaW4uaDogQWRkIF9kbypzaWduZWQqLgotCXRhcmdldHMuYywgYWxsIHRhcmdldHM6IEFkZCBiZmQqc2lnbmVkKi4KLQliZmQtaW4uaDogQWRkIGJmZF9zaWduZWRfdm1hLiAgQWRkIGNvbW1lbnRzLgotCi0JKiBiZmQtaW4uaCAoYmZkX2Vycm9yKSwgYmZkLmMgKGJmZF9lcnJtc2dzKTogQWRkIGZpbGVfdHJ1bmNhdGVkLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Vycm9yKTogQ2hlY2sgZXJyb3IgcmV0dXJuIGZyb20KLQlfYmZkX2NoZWNrX2Zvcm1hdCByb3V0aW5lcy4KLQotV2VkIEFwciAxNCAyMzo0ODoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiBJbXByb3ZlIGVycm9yIGNoZWNraW5nIGFuZAotCXJlY29nbml6ZSAuZGF0YSBzZWN0aW9uIGlmIHByZXNlbnQuCi0KLVRodSBBcHIgMTUgMDE6MDA6MjkgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfKl9hZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiAgQXZvaWQgYHNhbml0eScKLQljaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgc2V0cyB0aGUgYWRkcmVzcyBvZiB0aGUgQlNTCi0Jc2VjdGlvbiAoYW5kIHRoZSBmaWxlIGhlYWRlciBjYW4ndCBzcGVjaWZ5IHRoaXMpLiAgTGV0IHRoZSB1c2VyCi0Jc2V0IGl0IHdoZXJldmVyIHRoZXkgd2FudCwgcmVnYXJkbGVzcyBvZiB3aGF0IGdvZXMgaW4gdGhlIGhlYWRlci4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25zKTogIFBhc3MgYWxsIGllZWUgc2VjdGlvbiBuYW1lcwotCXN0cmFpZ2h0IHRocm91Z2ggaW50byBCRkQgc2VjdGlvbnMuICBBZGQgY29tbWVudHMuCi0KLVdlZCBBcHIgMTQgMjA6MzQ6NTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlDbGVhbnVwIGluIHByZXBhcmF0aW9uIGZvciBiZXR0ZXIgNjQtYml0IGhvc3Qgc3VwcG9ydC4KLQotCSogYmZkLWluLmggKGJmZF82NF90eXBlKTogIFJlbW92ZS4KLQkqIGxpYmJmZC5jIChfZG9fZ2V0YjY0LCBfZG9fcHV0YjY0KTogIFVzZSBiZmRfdm1hLCBub3QgYmZkXzY0X3R5cGUuCi0KLQkqIGJmZC1pbi5oIChiZmRfc2l6ZSk6ICBSZW1vdmUuCi0KLQkqIGJmZC1pbi5oIChiZmRfb2Zmc2V0KTogIFJlbW92ZSwgYWZ0ZXIgZml4aW5nIGxkL2xkbGFuZy5bY2hdLgotCi0JKiBiZmQtaW4uaCAoYmZkX3dvcmQpOiAgUmVtb3ZlLgotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6ICBSZXBsYWNlIGJmZF93b3JkIHdpdGggYmZkX3ZtYS4KLQotCSogYmZkLWluLmggKHJhd2RhdGFfb2Zmc2V0KTogIFJlbW92ZS4KLQkqIHJlbG9jLmMgKGFyZWxlbnQpOiAgUmVwbGFjZSByYXdkYXRhX29mZnNldCB3aXRoIGJmZF9zaXplX3R5cGUuCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiAgTGludC4KLQkoZW51bSBiZmRfcmVsb2Nfc3RhdHVzKTogIENvbW1lbnQgY2xlYW51cC4KLQotCSogYW91dC1hZG9iZS5jLCBjcHUtaDgzMDAuYywgbWlwc2JzZC5jLCBzcmVjLmM6IGxpbnQgLVdhbGwuCi0KLVR1ZSBBcHIgMTMgMTE6MTk6NTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzd2FwY29yZV9zcGFyYyk6IEd1ZXNzIHRoZSByaWdodCB2YWx1ZSBvZiBVU1JTVEFDSy4KLQotTW9uIEFwciAxMiAxNDoxODowMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZWxmMzIuYzogIENsZWFuIHVwIG9sZCBjb21tZW50cy4KLQotRnJpIEFwciAgOSAxMDo0MzoyMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zdW4zLmg6IFN0cmluZyBhcmd1bWVudCB0byBmcHJpbnRmIGlzIGNvbnN0LgotCi0JKiBjb2ZmLW1pcHMuYzogUmVuYW1lZCBQQUdFX1NJWkUgdG8gUk9VTkRfU0laRSwgdG8gYXZvaWQgY29uZnVzaW9uCi0Jb24gc3lzdGVtcyB3aGljaCBkZWZpbmUgUEFHRV9TSVpFIGluIDxsaW1pdHMuaD4uCi0KLVRodSBBcHIgIDggMTA6Mjg6MDAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6IFVzZSBuZXcgbWFjcm8KLQlUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMIHRvIGFsbG93IGhvc3QgZmlsZXMgdG8gc3BlY2lmeQotCXRoZSBjb3JlIGZpbGUgZmFpbGluZyBzaWduYWwuCi0JKiBob3N0cy9kZWNzdGF0aW9uLmggKFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwpOiBEZWZpbmUKLQl0byBzdXBwbHkgdGhlIGNvcmUgZmlsZSBmYWlsaW5nIHNpZ25hbC4KLQotVGh1IEFwciAgOCAwOToxNzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogT25seSBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvcgotCWEgU1RZUF9OT0xPQUQgfCBTVFlQX0JTUyBzZWN0aW9uIGlmIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQlpcyBkZWZpbmVkLiAgT24gbWFueSBDT0ZGIHRhcmdldHMgU1RZUF9CU1MgaXMgYWx3YXlzIFNUWVBfTk9MT0FELgotCSogY29mZi1pMzg2LmggKEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkpOiBEZWZpbmUuCi0KLVdlZCBBcHIgIDcgMTE6MzM6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoUEFHRVNJWkUpOiBDb3JyZWN0IHZhbHVlLgotCi1UdWUgQXByICA2IDEyOjA1OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkcmVzcyBvZiBmaXJzdCBQRFIgaXMKLQlhbiBvZmZzZXQgKHBhdGNoIGZyb20gSmVhbi1EYW5pZWwgRmVrZXRlIDxqZGZAbHJpLmxyaS5mcj4pLgotCi1Nb24gQXByICA1IDEyOjA3OjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvciBhCi0JU1RZUF9OT0xPQUQgfCBTVFlQX0JTUyBzZWN0aW9uLiAgRG9uJ3Qgc2V0IFNFQ19ORVZFUl9MT0FEIGZvciBhCi0JU1RZUF9JTkZPIHNlY3Rpb24uCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yY2Ugdm1hIGFuZCBsbWEgb2YgX0xJQgotCXNlY3Rpb24gdG8gYmUgemVyby4KLQkoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENvdW50IG51bWJlciBvZiBlbnRyaWVzIGluIG5ldyBsbWEKLQlmaWVsZCwgbm90IGluIHZtYS4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogRm9yY2UgbGluZW5vX2NvdW50IG9mCi0JU0VDX1NIQVJFRF9MSUJSQVJZIHNlY3Rpb24gdG8gYmUgemVybywgc2luY2UgaXQgaXMgbm9uLXplcm8gb24gdGhlCi0JU0NPIDMuMnY0IHNoYXJlZCBsaWJyYXJ5LgotCSogc2VjbGV0LmMgKHJlbCk6IENvcHkgb3ZlciBhbnkgc2VjdGlvbiB3aXRoIGNvbnRlbnRzLCBub3QganVzdAotCWxvYWRhYmxlIHNlY3Rpb25zLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wpOiBaZXJvIG91dCBuZXdseSBhbGxvY2F0ZWQKLQlzeW1ib2wuCi0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBOZXcgZnVuY3Rpb24sIHRvIGdlbmVyYXRlCi0JcmVsb2NhdGVhYmxlIG91dHB1dCBjb3JyZWN0bHkuCi0JKGhvd3RvX3RhYmxlKTogVXNlIGNvZmZfaTM4Nl9yZWxvYyBmb3IgYWxsIHJlbG9jIHR5cGVzLgotCShDQUxDX0FEREVORCk6IFVzZSBhIG1vcmUgZWZmaWNpZW50IGhhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0IGFkZGVuZAotCWZvciBhIGNvbW1vbiBzeW1ib2wuCi0JKGkzODZjb21tX3ZhbHVlKTogUmVtb3ZlZDsgbm8gbG9uZ2VyIG5lZWRlZC4KLQotU3VuIEFwciAgNCAxNTowODo0OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IHdyaXRlIG91dAotCXNlY3Rpb25zIHdpdGhvdXQgYSBmaWxlcG9zLgotCi1GcmkgQXByICAyIDE0OjM1OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2VjbGV0LmMgKHNlY2xldF9kdW1wX3NlY2xldCk6IENvcnJlY3QgU0VDX0hBU19DT05URU5UUyB0ZXN0LgotCi1XZWQgTWFyIDMxIDE3OjQxOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkZWQgQkZEX1JFTE9DX01JUFNfR1BSRUwuCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBBZGRlZCBncF9zaXplIGZpZWxkLgotCSogY29mZi1taXBzLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIGdwX3NpemUgdG8gOC4KLQkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQ29tcGFyZSBhZ2FpbnN0IGdwX3NpemUsIG5vdCBoYXJkY29kZWQgOC4KLQlTZXQgZmxhZ3MgdG8gMCBmb3IgbGFyZ2UgY29tbW9uIHN5bWJvbHMuCi0JKGVjb2ZmX2dwcmVsX3JlbG9jKTogSGFuZGxlIG5vbi16ZXJvIGFkZGVuZCBmb3IgZXh0ZXJuYWwgc3ltYm9scywKLQl3aGljaCBjYW4gb2NjdXIgZm9yIGdhcy1nZW5lcmF0ZWQgcmVsb2NzLgotCShlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGRlZCBCRkRfUkVMT0NfTUlQU19HUFJFTCBjYXNlLgotCSogYmZkLmMgKGJmZF9nZXRfZ3Bfc2l6ZSwgYmZkX3NldF9ncF9zaXplKTogTmV3IGZ1bmN0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChiZmQubyk6IE5vdyBkZXBlbmRzIG9uIGNvZmYvc3ltLmggYW5kIGxpYmVjb2ZmLmguCi0KLVR1ZSBNYXIgMzAgMDk6MzM6MTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IFVzZSBsbWEgZmllbGQgZm9yIGxvYWQKLQlhZGRyZXNzLgotCSogc2VjdGlvbi5jOiBBZGQgZGVjbGFyYXRpb24gb2YgbG1hIGZpZWxkIHRvIHNlY3Rpb24gc3RydWN0dXJlLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgbG1hIGZpZWxkIGZvciBsb2FkCi0JYWRkcmVzcy4KLQkqIGJmZC1pbi5oIChiZmRfc2V0X3NlY3Rpb25fdm1hKTogU2V0IGxtYSBhbG9uZyB3aXRoIHZtYS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IE5vdyBoYW5kbGVzIGluZGlyZWN0Ci0Jc3ltYm9scyBpbiBhIGJldHRlciB3YXkuICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFnKTogU2V0IHRoZQotCU5fSU5EUiBiaXQgd2hlbiBuZWNlc3NhcnkuIChhb3V0PD5zbHVycF9zeW1ib2xfdGFibGUpOiBNYWludGFpbgotCWluZGlyZWN0IHN0YXRlLgotCSogc2VjdGlvbi5jOiBBZGRlZCBCRkRfSU5EX1NFQ1RJT05fTkFNRSBhbmQgYmZkX2luZF9zZWN0aW9uLgotCShiZmRfbWFrZV9zZWN0aW9uKTogQ29wZSB3aXRoIG5ldyBidWlsdGluIHNlY3Rpb24uCi0JKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBDYW4gbm93IHByaW50IGluZGlyZWN0IHNlY3Rpb24KLQlpbmZvLgotCi1XZWQgTWFyIDI0IDEzOjM2OjMzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoTVkob2JqZWN0X3ApKTogIEZhaWwgaWYgTUFDSFRZUEVfT0sgaXMKLQlkZWZpbmVkLCBhbmQgeWllbGRzIGZhbHNlLgotCSogYW91dC1taXBzYnNkLmMsIGkzODZic2QuYzogIERlZmluZSBNQUNIVFlQRV9PSyBhcHByb3ByaWF0ZWx5LgotCi0JKiBhcmNoaXZlLmMgKHNuYXJmX2FyX2hkcik6ICBBZGQgc3VwcG9ydCBmb3IgcmVhZGluZyAob25seSwKLQlzbyBmYXIpIEJTRC00LjQtc3R5bGUgZXh0ZW5kZWQgaGVhZGVycy4KLQkqIGFyY2hpdmUuYzogIFNvbWUgbW9yZSBjb21tZW50cy4KLQotV2VkIE1hciAyNCAwMjowNToxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCBydWxlIGZvciBkdmkgYW5kIGluZm8sIHNvIHRoYXQgdGhlIHJlY3Vyc2l2ZQotCW1ha2VzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLCBpbnN0ZWFkIG9mIGFsd2F5cyBpbmZvCi0KLVdlZCBNYXIgMjQgMDI6NTY6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoYmZkX3NlZWspOiBEaXNhYmxlIG9wdGltaXplZCBoYW5kbGluZyBmb3IgYXJjaGl2ZXMgYW5kCi0JYXJjaGl2ZSBtZW1iZXJzOyB0aGV5IG5lZWQgbW9yZSBzcGVjaWFsIHJlYXRtZW50LiAgRm9yIG5vdywgdmVyaWZ5Ci0JdGhhdCBjb21wdXRlZCBhbmQgYWN0dWFsIGZpbGUgcG9zaXRpb25zIGNvcnJlc3BvbmQuCi0KLVR1ZSBNYXIgMjMgMDg6NDU6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtaXBzYnNkLmM6IFJlbmFtZWQgZnJvbSBhb3V0LW1pcHNic2QuYy4KLQkoc2V0X2FyY2hfbWFjaCk6IERlbGV0ZSBub24tTUlQUyBjb2RlLgotCShyZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IERpdHRvLgotCSogTWFrZWZpbGUuaW46IEFkanVzdGVkLgotCi0JKiBsaWJiZmQuYyAoYmZkX3RlbGwpOiBVcGRhdGUgYHdoZXJlJyBmaWVsZC4KLQkoYmZkX3NlZWspOiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBub3QgY2hhbmdpbmcgdGhlIGZpbGUKLQlwb3NpdGlvbi4gIElmIEZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVggaXMgZGVmaW5lZCwgY2hlY2sgYHdoZXJlJwotCWZpZWxkIGFnYWluc3QgYSBTRUVLX1NFVCByZXF1ZXN0LiAgQ2FsbCBiZmRfdGVsbCB0byByZS11cGRhdGUKLQlgd2hlcmUnIGZpZWxkIHdoZW4gZG9uZS4KLQkoYmZkX3JlYWQsIGJmZF93cml0ZSkgW0ZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVhdOiBNYWludGFpbgotCWB3aGVyZScgZmllbGQuCi0JKiBob3N0cy9zcGFyYy5oOiBEZWZpbmUgRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWC4KLQotTW9uIE1hciAyMiAyMzoxODoxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLU1vbiBNYXIgMjIgMTQ6NTc6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogUmVsb2NhdGUgZW5jYXBzdWxhdGVkIHN0YWJzCi0JaWYgdGhlIHR5cGUgaXMgbm90IHN0TmlsLgotCi1UdWUgTWFyIDE2IDEwOjM1OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi5jIChlbGZfbGl0dGxlX3ZlYywgZWxmX2JpZ192ZWMpOiBEZWxldGUgbm93LWludmFsaWQKLQlmb3J3YXJkIGRlY2xhcmF0aW9ucy4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRG9uJ3QgdXNlIENPTlNUIGhlcmUsCi0JaXQncyBpbXBsaWVkIGJ5IHRoZSB0eXBlLgotCi1GcmkgTWFyIDEyIDE4OjU4OjA4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IHJlY29nbml6ZSBzcGFyYy1zdW4tc29sYXJpczIqIGluc3RlYWQgb2Ygc3BhcmMtc3VuLXNvbGFyaXMqCi0KLVR1ZSBNYXIgIDkgMDk6MjM6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmM6IEFkZCAubGRpbmZvIHNlY3Rpb24uCi0KLUZyaSBNYXIgMTIgMTE6NTc6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRU9WRVJSSURFUyk6IERlZmluZSB0byBiZSBlbXB0eS4KLQotRnJpIE1hciAxMiAwODozMjoxMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpOiB3aGl0ZXNwYWNlCi0JKiBzZWNsZXQuYyAoc2VjbGV0X2R1bXBfc2VjbGV0KTogRG9uJ3QgdHJ5IGFuZCBmaWxsIHNlY3Rpb25zIHdpdGgKLQlubyBjb250ZW50cy4KLQotVGh1IE1hciAxMSAxOToyNjoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2dvMzIuaDogZG9uJ3QgZGVmaW5lIFBPU0lYX1VUSU1FCi0KLVR1ZSBNYXIgIDkgMTA6NTI6MDEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLmMgKGVsZl9vYmplY3RfcCk6ICBVc2UgRUxGX0FSQ0ggc3RvcmVkIGluIHh2ZWMgdG8gbWF0Y2gKLQlhZ2FpbnN0IG1hY2hpbmUgYXJjaGl0ZWN0dXJlIHN0b3JlZCBpbiB0aGUgRUxGIGhlYWRlciwgdG8gcmVzb2x2ZQotCWFtYmlndWl0aWVzLgotCSogZWxmMzIuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIEJmZF9tYWtlX3NlY3Rpb24gY2FuIHJldHVybgotCU5VTEwsIHNvIG9ubHkgdXNlIHJlc3VsdHMgd2hlbiBub24tTlVMTC4KLQkqIHRhcmdldHMuYyAoZWxmMzJfbTY4a192ZWMsIGVsZjMyX2k4NjBfdmVjKTogIEFkZCBleHRlcm4gZGVjbHMKLQlhbmQgYWRkIHRvIHZlY3RvciBvZiB0YXJnZXRzLgotCi1Nb24gTWFyICA4IDE1OjEzOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEVuY2Fwc3VsYXRlZCBTVEFCUyBzeW1ib2xzCi0JYXJlIGFsd2F5cyBqdXN0IGRlYnVnZ2luZyBzeW1ib2xzLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfW2dzXWV0X3N5bV9pbmRleCk6IE1vdmVkIG1hY3JvcyBmcm9tIGhlcmUuLi4KLQlsaWJlY29mZi5oIChlY29mZl9bZ3NdZXRfc3ltX2luZGV4KTogLi4udG8gaGVyZS4KLQotTW9uIE1hciAgOCAxNDo1NToxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoX1BBX1JJU0NfSUQpOiBEZWZpbmVkIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQgKGUuZy4sIGZvcgotCWhwdXggNykuICBQYXRjaCBmcm9tIGZyaWVkbWFuQGdudS5haS5taXQuZWR1LgotCShocHBhX29iamVjdF9wKTogT25seSBjaGVjayBmb3IgRExfTUFHSUMgYW5kIFNITF9NQUdJQyBpZiB0aGV5J3JlCi0JZGVmaW5lZCwgd2hpY2ggdGhleSBhcmVuJ3QgaW4gaHB1eCA3LjAuCi0KLQkqIGFpeDM4Ni1jb3JlLmM6IEluY2x1ZGUgdWluZm8uaCBhbmQgY29yZWR1bXAuaC4gIFBhdGNoIGZyb20gTWluaAotCVRyYW4tTGUsIHRyYW5sZUBpbnRlbGxpY29ycC5jb20uCi0KLUZyaSBNYXIgIDUgMTQ6NTQ6MjEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZ2VuZXJpY19yZWxvYyk6IElmIHRoZSBhZGRlbmQgaXMgbm9uLXplcm8sIGdvCi0JYWhlYWQgYW5kIGRvIHRoZSByZWxvY2F0aW9uLgotCShlY29mZl9yZWZoaV9yZWxvYyk6IERvbid0IHRvIHRoZSByZWxvY2F0aW9uIGhlcmUsIGp1c3QgcmVtZW1iZXIKLQl3aGF0IG5lZWRzIHRvIGJlIGRvbmUuCi0JKGVjb2ZmX3JlZmxvX3JlbG9jKTogRG8gdGhlIFJFRkhJIHJlbG9jYXRpb24gaGVyZS4KLQotVGh1IE1hciAgNCAxNDo0NDowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZGVkIEJGRF9BU1NFUlQgY2FsbHMgdG8gZW5zdXJlCi0JcmVsb2NzIGFyZSByZWFzb25hYmxlLgotCSogY29mZi1tc3ltLmM6IEVsaW1pbmF0ZWQgdXNlcyBvZiBERUZVTi4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgTWFyICAyIDE3OjUyOjU4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKFVsdHJpeCAyLjIgc3VwcG9ydCBmcm9tIE1pY2hhZWwgUmVuZGVsbCA8bWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYT4pCi0JKiBjb25maWd1cmUuaG9zdCAodmF4LSotdWx0cml4MiopOiAgQWRkIHRyaXBsZXQuCi0JKiBob3N0cy92YXh1bHQyLmg6ICBOZXcgZmlsZS4KLQkqIGNvbmZpZy92YXh1bHQyLm1oOiAgTmV3IGZpbGUuCi0KLQkqIGFvdXR4LmggKHN0cmluZy5oKTogIEluY2x1ZGUgZm9yIHN0cmNociBhbmQgZnJpZW5kcy4KLQkqIGFyY2hpdmUuYyAoc3RyaW5nLmgpOiAgSW5jbHVkZSBmb3IgbWVtY2hyIGFuZCBmcmllbmRzLgotCSogZWxmMzIuYyAoc3RyaW5nLmgpOiAgSW5jbHVkZSBmb3Igc3RycmNociBhbmQgZnJpZW5kcy4KLQotU2F0IEZlYiAyNyAwMDo0NDoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5jIChzdW5vczRfcmVsb2NfdHlwZV9sb29rdXApOiBVbnVzZWQ7IGRlbGV0ZWQuCi0JKE1ZX3NldF9zaXplcyk6IFVzZSBzdW5vczRfc2V0X3NpemVzLgotCi0JKiBlbGYzMi5jOiBSZW5hbWVkIGZyb20gZWxmLmMuICBTZXZlcmFsIENQVS1zcGVjaWZpYyBmdW5jdGlvbnMKLQlkZWxldGVkLCBhcyB3ZWxsIGFzIGVsZi1iaWcgYW5kIGVsZi1saXR0bGUgdGFyZ2V0cy4KLQkqIGxpYmVsZi5oOiBOZXcgZmlsZS4KLQkqIGVsZjMyLXNwYXJjLmMsIGVsZjMyLWkzODYuYywgZWxmMzItaTg2MC5jLCBlbGYzMi1tNjhrLmM6IE5ldwotCWZpbGVzLCBuZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWcvKi1lbGYubXQsIHRhcmdldHMuYzogQWRqdXN0ZWQuCi0KLQkqIGkzODZsaW51eC5jIChUQVJHRVROQU1FKTogVXNlIGh5cGhlbnMgaW5zdGVhZCBvZiBwYXJlbnRoZXNlcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndCBuZWVkCi0JdmFyaWFibGUgIm9sZF9zb2ZhciIgaWYgY29tcGlsaW5nIGZvciBpOTYwLgotCi0JKiByZWxvYy5jIChiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCk6IEZpcnN0IGFyZ3VtZW50IGlzIG5vdyBhCi0JYmZkIHBvaW50ZXIuCi0JKiBsaWJiZmQuaDogVXBkYXRlZC4KLQotCSogaWVlZS5jIChleHRlbiwgZW52aSk6ICJzdGF0aWMiIGJlbG9uZ3MgZmlyc3QgaW4gZGVjbGFyYXRpb24uCi0KLUZyaSBGZWIgMjYgMTc6Mzc6MzQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYzogYWRkIHN1cHBvcnQgZm9yIHN5bWJvbHNyZWMsIHNyZWNvcmRzIHdpdGggc3ltYm9scyBpbgotCXRoZW0uCi0KLVRodSBGZWIgMjUgMTE6NDM6MzAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGNhY29waG9ueS5jeWdudXMuY29tKQotCi0JKiBpZWVlLmM6ICBjYXN0IGFsbCBhcmd1bWVudHMgb2YgaWVlZV93cml0ZV9ieXRlIHRvIGJmZF9ieXRlCi0JdG8gYXZvaWQgbGludCBjb21wbGFpbnRzLgotCi1UaHUgRmViIDI1IDAyOjE1OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZWN0aW9uICIuc2hzdHJ0YWIiIHNob3VsZCBiZQotCXR5cGUgU0hUX1NUUlRBQi4gIERvbid0IGFsdGVyIGZpbGUgb2Zmc2V0IGZvciBzZWN0aW9uIDAuCi0JKHJlbG9jX3R5cGVfbmFtZXMpOiBOb3cgYW4gYXJyYXkgaW5zdGVhZCBvZiBhIG1hY3JvLiAgU3RpbGwgaW5zaWRlCi0JIiNpZiAwIiwgc2luY2UgaXQncyB1c2VkIG9ubHkgaW4gZGVidWdnaW5nIGNvZGUgYWxzbyBpbiAiI2lmIDAiLgotCShzdHJ1Y3QgZWxmX3JlbG9jX21hcF9lbHQsIHN0cnVjdCBlbGZfcmVsb2NfbWFwKTogTmV3IHR5cGVzLgotCShzb3J0X3JlbG9jX21hcCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogTmV3IHZhcmlhYmxlLgotCShlbGZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgRmViIDIzIDEyOjE3OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBBZGRlZCBiZmRfcmVsb2NfdHlwZV9sb29rdXAgYW5kCi0JYmZkX21ha2VfZGVidWdfc3ltYm9sOyB0aGV5IHdlcmUgYWxyZWFkeSBpbiB0aGUgdGFyZ2V0IHN0cnVjdHVyZS4KLQkqIEFkanVzdGVkIGFsbCB1c2VzIG9mIEpVTVBfVEFCTEUuCi0JKiBjb2ZmZ2VuLmMsIGxpYmNvZmYtaW4uaCAoY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBSZW5hbWVkCi0JZnJvbSBjb2ZmX21ha2VfZGVidWdfc3ltYm9sLgotCSogbGliY29mZi5oOiBVcGRhdGVkIGFjY29yZGluZ2x5LgotCi0JKiBNaW5vciBjbGVhbnVwcyBwcm92b2tlZCBieSBnY2Mgd2FybmluZ3M6Ci0JKiBhb3V0eC5oIChOQU1FKGFvdXQsIHJlbG9jX3R5cGVfbG9va3VwKSksCi0JY3B1LWg4MzAwLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCksCi0JY3B1LXo4ay5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGRlZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2hlcy4KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfYnNkX2FybWFwLCBkb19zbHVycF9jb2ZmX2FybWFwKSwKLQlpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKSwKLQllbGYuYyAoZWxmX21ha2Vfc2VjdGlvbnMsIGVsZl9mYWtlX3NlY3Rpb25zLAotCWVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsIGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOgotCVJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcy4KLQkqIGFyY2h1cmVzLmM6IFJlbW92ZWQgLyogZnJvbSB3aXRoaW4gY29tbWVudC4KLQkqIGJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBJbml0aWFsaXplIHJfZXh0ZXJuLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfZGF0YSk6IEluaXRpYWxpemUgaS4KLQotTW9uIEZlYiAyMiAxODo0MDowNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxpYmNvZmYuaCAob2JqX3Jhd19zeW1lbnRfY291bik6ICBOZXcgbWFjcm8uCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogIEluaXRpYWxpemUKLQlyYXdfc3ltZW50X2NvdW50LgotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogIE51bWVyb3VzIGxpdHRsZSBmaXhlcy4KLQotTW9uIEZlYiAyMiAxNTowMzowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBzdEJsb2NrIHN5bWJvbHMgYXJlIGFsd2F5cwotCWRlYnVnZ2luZyBzeW1ib2xzLgotCShlY29mZl9nZXRfZGVidWcpOiBPZmZzZXQgdGhlIGZkciBhZHIgYnkgdGhlIGFkciBvZiB0aGUgZmlyc3QgcGRyLAotCWZvciBjb21wYXRpYmlsaXR5IHdpdGggdG9vbHMgZnJvbSBNSVBTLgotCi0JKiBjb25maWcvYmlnbWlwcy5tdDogTmV3IGZpbGU7IGRlZmF1bHQgdmVjdG9yIGlzIGVjb2ZmX2JpZ192ZWMuCi0JKiBjb25maWcvaXJpeDMubXQsIGNvbmZpZy9pcml4NC5tdDogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVjb2ZmKTogTmV3IHRhcmdldDsgdXNlcyBiaWdtaXBzLm10LgotCShtaXBzLXNnaS0qLCBtaXBzLWJpZy0qKTogVXNlIGJpZ21pcHMgcmF0aGVyIHRoYW4gaXJpeDMuCi0KLVdlZCBGZWIgMTcgMjM6NDA6NDEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2hwMzAwYnNkLmg6ICBBZGQgZ3Jvc3MgaGFjayB0byBkZXRlcm1pbmUgd2hldGhlciB3ZQotCWFyZSBydW5uaW5nIG9uIEJTRCA0LjMgb3IgQlNEIDQuNCwgYW5kIHVzZSBhcHByb3ByaWF0ZSBpbmNsdWRlCi0JZmlsZXMgKGFuZCBzZXQgb3RoZXIgcGFyYW1ldGVycykgdG8gbWF0Y2guCi0KLVdlZCBGZWIgMTcgMTI6Mjg6MTMgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfbWFrZV9lbXB0eV9zeW1ib2wpOiB3cmFwIFBBUkFNUyBhcm91bmQgYW4KLQkgIGFuc2kgZGVmaW5pdGlvbiB3aGljaCBvdGhlcndpc2UgY29uZnVzZXMgbm9uLWFuc2kgY29tcGlsZXJzLgotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfb2JqZWN0X3ApOiBlbGltaW5hdGUgYSB3YXJuaW5nIGZyb20gdmF4Ci0JICB1bHRyaXggY2MgYnkgZm9yd2FyZCBkZWNsYXJpbmcgZ2V0ZW52IGFzIGlzIGRvbmUgaW4KLQkgIGJmZF9maW5kX3RhcmdldC4KLQotVHVlIEZlYiAxNiAxNzo1Njo1OCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9pbmZvX3RvX2hvd3RvKTogY2FzdCBhbiBlbnVtIGludG8gdW5zaWduZWQgY2hhcgotCSAgYXZvaWRpbmcgYSBmYXRhbCBlcnJvciBpbiB2YXggdWx0cml4IDQuMiBjYy4KLQotVHVlIEZlYiAxNiAwMDo0NDo1NCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmgsIFZFUlNJT046ICBSb2xsIHRvIHZlcnNpb24gMi4xLgotCi1Nb24gRmViIDE1IDIwOjQzOjUxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiAgTGludC4KLQkqIHNyZWMuYzogIFdoaXRlc3BhY2UgY2xlYW51cC4KLQotRnJpIEZlYiAxMiAxNDoyMzowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBQcmludCBjb3JyZWN0IHRhZ25keCB2YWx1ZTsKLQljbGVhbmVkIHVwIG91dHB1dCBmb3JtYXR0aW5nIGEgYml0LgotCi1GcmkgRmViIDEyIDA4OjI4OjU2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6ICpGSVhNRSogdGhlIEg4LzMwMCBpcyBhbHdheXMKLQlyZWxheGFibGUuICBTaG91bGQgYmUgbW92ZWQgc29tZXdoZXJlIGVsc2UuCi0KLVRodSBGZWIgMTEgMTQ6MDk6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0LW1pcHNic2QuYzogRWxpbWluYXRlZCB1c2VzIG9mIERFRlVOLgotCShhb3V0X21pcHNfKl92ZWMpOiBBZGRlZCBzZWNsZXRfbGluayBlbGVtZW50LgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0JBQ0tFTkRTLCBDRklMRVMsIGFvdXQtbWlwc2JzZC5vKTogQWRkZWQKLQlzdXBwb3J0IGZvciBhb3V0LW1pcHNic2QgdGFyZ2V0LgotCi0JKiBib3V0LmMgKGdldF92YWx1ZSk6IERvbid0IHRydW5jYXRlIDMyLWJpdCBhZGRlbmQgdG8gMTYgYml0cy4KLQotRnJpIEZlYiAgNSAwODowODo0MyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4NTAwLmMgKHNjYW5fbWFjaCk6IHJldHVybiBmYWxzZSBpZiBpdCdzIG5vdCBhbiBIOC81MDAKLQotVGh1IEZlYiAgNCAxMjo1Mjo0MCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUFkZCBzdXBwb3J0IGZvciB0aGUgSDgvNTAwCi0KLQkqIGNvZmYtaDg1MDAuYywgY3B1LWg4NTAwLmMsIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIHRhcmdldHMuYwotCi1UaHUgRmViICA0IDEyOjM1OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGliZWNvZmYuaDogTmV3IGZpbGUuICBEZWZpbmVzIEVDT0ZGIGJhY2tlbmQgZGF0YSBmb3IgZ2RiLgotCSogY29mZi1taXBzLmM6IE5vdyBpbmNsdWRlcyBsaWJlY29mZi5oLgotCShlY29mZl9kYXRhX3R5cGUpOiBNb3ZlZCB0byBsaWJlY29mZi5oLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogTWFkZSBnbG9iYWxseSB2aXNpYmxlIHNvIHRoYXQgZ2RiIGNhbgotCWNhbGwgaXQuICBJZiB0aGVyZSBpcyBldmVyIGFub3RoZXIgRUNPRkYgdGFyZ2V0LCB0aGlzIGFuZCB0aGUKLQlzd2FwcGluZyBmdW5jdGlvbnMgc2hvdWxkIGJlIGFjY2Vzc2VkIHZpYSBhbiBFQ09GRiBzcGVjaWZpYyB0YXJnZXQKLQl2ZWN0b3IuCi0JKiBNYWtlZmlsZS5pbiAoY29mZi1taXBzLm8pOiBEZXBlbmRzIG9uIGxpYmVjb2ZmLmguCi0KLVdlZCBGZWIgIDMgMDk6MTQ6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBSZW1vdmVkIE1JUFMgc3BlY2lmaWMgaW5mb3JtYXRpb24sIHNpbmNlIGNvZmYtbWlwcy5jCi0Jbm8gbG9uZ2VyIGluY2x1ZGVzIHRoaXMgZmlsZS4KLQotCSogY29mZi1tc3ltLmMgKGVjb2ZmX3N3YXBfZmRyX2luLCBlY29mZl9zd2FwX2V4dF9pbik6IFNldCByZXNlcnZlZAotCWJpdHMgdG8gMCB0byBtYWtlIGNvbXBhcmlzb24gdGVzdCB1c2VmdWwuCi0KLQkqIGNvbmZpZy9pcml4My5taCwgY29uZmlnL2lyaXg0Lm1oIChIREVGSU5FUyk6IFNldCB0byAtRyA0IHRvCi0JYXZvaWQgb3ZlcmZsb3dpbmcgR1AgYWNjZXNzaWJsZSBzZWN0aW9ucyBpbiBiaW51dGlscy9vYmpkdW1wLgotCi1UdWUgRmViICAyIDE1OjM2OjU1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6ICBNYWRlIHN5bWJvbAotCXJlYWRpbmcgbW9yZSByb2J1c3Q6ICBGYWlsIGlmIHN0cmluZyBpbmRleCBpcyBvdXQgb2Ygc3RyaW5nCi0JdGFibGUgcmFuZ2UuCi0KLVR1ZSBGZWIgIDIgMTE6NDM6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgY2FzZXMgUENSRUwyNCBhbmQKLQlQQ1JFTDEzKTogRG9uJ3QgdGFrZSBkc3RfYWRkcmVzcyBpbnRvIGFjY291bnQ7IHRoZSBpbnB1dCBmaWxlIGhhcwotCWFscmVhZHkgdGFrZW4gY2FyZSBvZiB0aGF0LgotCi1UdWUgRmViICAyIDExOjQxOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmM6IENvbXBsZXRlZCBzdXBwb3J0IGZvciBsaW5rZXIgYW5kIGJpbnV0aWxzLgotCi1Nb24gRmViICAxIDE0OjQ1OjM4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIGNhc2UgQUJTMzIpOiBLZWVwCi0Jb3JpZ2luYWwgYWRkZW5kIGZyb20gc2VjdGlvbiBjb250ZW50cy4KLQotVGh1IEphbiAyOCAyMTowMTozNyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUZpeCBtaW5vciBidWdzIHJlcG9ydGVkIGJ5IENhcmwgR3JlY28sIDxjZ3JlY29AcGFycm90LmNyZWlnaHRvbi5lZHU+OgotCSogaG9zdHMvZGVsdGE4OC5oIChzdHJ0b2wpOiAgRml4IHByb3RvdHlwZS4KLQkqIGNvbmZpZy9tODhrLWNvZmYubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogIEZpeCBuYW1lLgotCi1XZWQgSmFuIDI3IDE3OjE2OjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IEdldCByaWQgb2YgIiNpZmRlZiBzcGFyYyIuCi0JKFJFTE9DX1RZUEVfTkFNRVMpOiBOZXZlciB1c2VkIChjdXJyZW50bHkpLCBzbyBkb24ndCBpbmNsdWRlIGl0LgotCShlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBSZW5hbWVkIGZyb20gZWxmX2hvd3RvX3RhYmxlLCBhbmQgYWx3YXlzCi0JdXNlZC4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBVc2UgcnVudGltZSBjb25kaXRpb25hbHMgb24gQ1BVIHR5cGUsIG5vdAotCWNvbXBpbGUgdHlwZSBjb25kaXRpb25hbHMgb24gaG9zdCBDUFUuCi0JKGVsZl9saXR0bGVfdmVjLCBlbGZfYmlnX3ZlYyk6IFVzZSBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCwKLQlub3QgbnVsbCBwb2ludGVyLgotCShyZWxvY190eXBlLCBSRUxPQ19UWVBFX05BTUVTKTogSW5jbHVkZSBpMzg2IHZhbHVlcy4KLQotVHVlIEphbiAyNiAxMTo0MzoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0lTX0NPTU1PTik6IE5ldyBzZWN0aW9uIGZsYWcsIG5lZWRlZCBmb3IgTUlQUwotCUVDT0ZGIHdoaWNoIGhhcyB0d28gY29tbW9uIHNlY3Rpb25zLgotCShiZmRfY29tX3NlY3Rpb24pOiBTZXQgU0VDX0lTX0NPTU1PTiBmbGFnLgotCSogYmZkLWluLmggKGJmZF9pc19jb21fc2VjdGlvbik6IE5ldyBtYWNybyB0byB0ZXN0IFNFQ19JU19DT01NT04uCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGJvdXQuYywgY29mZi1hMjlrLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmZ2VuLmMsIGllZWUuYywgb2FzeXMuYywgcmVsb2MuYywgc3ltcy46IFVzZQotCWJmZF9pc19jb21fc2VjdGlvbiBtYWNybyByYXRoZXIgdGhhbiBjaGVja2luZyBmb3IgZXF1YWxpdHkgdG8KLQliZmRfY29tX3NlY3Rpb24uCi0KLU1vbiBKYW4gMjUgMTU6Mjc6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChfYmZkX2NvZmZfbWtvYmplY3RfaG9vayk6IFBhc3MgYW91dGhkciBhcmd1bWVudC4KLQkoY29mZl9ta29iamVjdF9ob29rKTogQWNjZXB0IGFvdXRoZHIgYXJndW1lbnQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFBhc3MgYW91dGhkciB0byBta29iamVjdF9ob29rLgotCUhhbmRsZSBOVUxMIGFvdXRoZHIgYXJndW1lbnQuCi0JKGNvZmZfb2JqZWN0X3ApOiBJZiB0aGVyZSBpcyBubyBhb3V0aGRyLCBwYXNzIGl0IGFzIE5VTEwgdG8KLQljb2ZmX3JlYWxfb2JqZWN0X3AuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQgZm9yIG1rb2JqZWN0X2hvb2sgY2hhbmdlcy4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4sIGNvZmZfc3dhcF9hb3V0aGRyX2luKTogU3dhcAotCWFkZGl0aW9uYWwgTUlQUyBFQ09GRiBmaWVsZHMuCi0KLVNhdCBKYW4gMjMgMTg6MzY6MjAgUFNUIDE5OTMgIFJhbHBoIENhbXBiZWxsICAocmFscGhjQHB5cmFtaWQuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogYWRkZWQgbWlwcy1kZWMtYnNkKgotCSogY29uZmlndXJlLmluOiBhZGRlZCBtaXBzLWRlYy1ic2QqCi0JKiBhb3V0LW1pcHNic2QuYzogbmV3IGZpbGUgZm9yIG1pcHMtZGVjLWJzZCoKLQkqIGFvdXQtdGFyZ2V0Lmg6IGRvbid0IGRlZmluZSAnJyBpZiAnTVlfQkZEX1RBUkdFVCcgaXMgZGVmaW5lZC4KLQkqIGFvdXR4Lmg6IGFkZGVkIG1pcHMgc3VwcG9ydC4KLQkqIGFyY2h1cmVzLmM6IGFkZGVkIG1pcHMgc3VwcG9ydCB0byBiZmRfZGVmYXVsdF9zY2FuKCkuCi0JKiBjcHUtbWlwcy5jOiBhZGRlZCBzdXBwb3J0IGZvciBSNDAwMCAodW50ZXN0ZWQpLgotCSogbGliYW91dC5oOiBhZGRlZCBNSVBTMSAmIE1JUFMyIG1hZ2ljIG51bWJlcnMuCi0JKiByZWxvYy5jOiBmaXggdHlwbydzIGluIGNvbW1lbnRzLiBBZGRlZCBCRkRfUkVMT0MgZW50cmllcyB3aGljaCBJCi0JCWhvcGUgd2lsbCBtYWtlIGl0IGludG8gaW5jbHVkZS9iZmQuaC4KLQkqIHRhcmdldHMuYzogYWRkZWQgYW91dF9taXBzXypfdmVjLgotCi1XZWQgSmFuIDIwIDE3OjE1OjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlY3N0YXRpb24ubXQ6IFNldCBERUZBVUxUX1ZFQ1RPUiB0byBlY29mZl9saXR0bGVfdmVjLgotCi1UdWUgSmFuIDE5IDA5OjA2OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKGJmZF9hc3ltYm9sX3ZhbHVlKTogQWRkIG5lZWRlZCBwYXJlbnRoZXNlcy4KLQotCSogbGliY29mZi1pbi5oOiBVcGRhdGUgcHJvdG90eXBlIGZvciBjb2ZmX2NvdW50X2xpbmVudW1iZXJzLgotCi1GcmkgSmFuIDE1IDE4OjEzOjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tc3ltLmMgKGVjb2ZmX3N3YXBfaGRyX291dCwgZWNvZmZfc3dhcF9mZHJfb3V0LAotCWVjb2ZmX3N3YXBfcGRyX291dCwgZWNvZmZfc3dhcF9zeW1fb3V0LCBlY29mZl9zd2FwX2V4dF9vdXQsCi0JZWNvZmZfc3dhcF9ybmR4X291dCwgZWNvZmZfc3dhcF9yZmRfb3V0LCBlY29mZl9zd2FwX29wdF9pbiwKLQllY29mZl9zd2FwX29wdF9vdXQsIGVjb2ZmX3N3YXBfZG5yX2luLCBlY29mZl9zd2FwX2Rucl9vdXQpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKiBjb2Zmc3dhcC5oOiBJZiBOT19DT0ZGX1JFTE9DUyBpcyBkZWZpbmVkLCBkb24ndCBkZWZpbmUKLQliZmRfc3dhcF9yZWxvY19pbiBvciBjb2ZmX3N3YXBfcmVsb2Nfb3V0LgotCSogY29mZi1taXBzLmM6IEFkZGVkIGNvZGUgdG8gbGluayBhbmQgd3JpdGUgb3V0IHN5bWJvbGljIGRlYnVnZ2luZwotCWluZm9ybWF0aW9uLCBhbmQgdG8gc3dhcCByZWxvY3MgaW4gYW5kIG91dC4KLQotVGh1IEphbiAxNCAxNTo1MTo1OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGliY29mZi5oLCBjb2ZmZ2VuLmMgKGNvZmZfY291bnRfbGluZW51bWJlcnMpLCBjb2ZmY29kZS5oCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogY29mZl9jb3VudF9saW5lbnVtYmVycyByZXR1cm5zIHRoZQotCW51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzIGl0IGZvdW5kLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfbGluZW51bWJlcnMpOiBvbmx5IHdyaXRlIG91dCBsaW5lIG51bWJlcnMKLQlpbiB0aGUgc2VjdGlvbiB0aGV5IGJlbG9uZyB0by4KLQotTW9uIEphbiAxMSAxODozMjoyMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZGVkIHJlbG9jYXRlYWJsZSBhcmd1bWVudCB0bwotCV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLiAgQWRkZWQgX2JmZF9zZWNsZXRfbGluawotCXRhcmdldCB2ZWN0b3IgZm9yIGxpbmtlciB1c2UuCi0JKiBiZmQuYyAoYmZkX3NlY2xldF9saW5rKTogTmV3IG1hY3JvLgotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBBZGRlZCBfYmZkX3NlY2xldF9saW5rLgotCSogc2VjbGV0LmMgKHJlbCwgc2VjbGV0X2R1bXBfc2VjbGV0KTogQWRkZWQgcmVsb2NhdGVhYmxlIGFyZ3VtZW50Ci0JYW5kIGJvb2xlYW4gcmV0dXJuIHZhbHVlLiAgTWFkZSBzdGF0aWMuCi0JKGJmZF9nZW5lcmljX3NlY2xldF9saW5rKTogUmVuYW1lZCBmcm9tIHNlY2xldF9kdW1wLiAgQWRkZWQKLQlyZWxvY2F0ZWFibGUgYXJndW1lbnQuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBZGRlZAotCXJlbG9jYXRlYWJsZSBhcmd1bWVudCAoaWYgcmVsb2NhdGVhYmxlLCBzYXZlcyByZWxvY3MpLgotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLAotCXJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBZGRlZAotCXJlbG9jYXRlYWJsZSBhcmd1bWVudCAoaWYgcmVsb2NhdGVhYmxlLCBqdXN0IGNhbGxzCi0JYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKS4KLQkqIGxpYmNvZmYtaW4uaCAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBBZGRlZCByZWxvY2F0ZWFibGUKLQlhcmd1bWVudCB0byBwcm90b3R5cGUuCi0JKiBBbGwgdGFyZ2V0czogU2V0IG5ldyBfYmZkX3NlY2xldF9saW5rIHZlY3RvciB0bwotCWJmZF9nZW5lcmljX3NlY2xldF9saW5rLgotCi1TYXQgSmFuICA5IDIxOjI5OjMyIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYzogICNpbmNsdWRlIHNlY2xldC5oLgotCi1TYXQgSmFuICA5IDE5OjQ4OjE0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9vYmplY3Rfc2V0dXApOiAgR2V0IHJpZCBvZiBhbGwga25vd2xlZGdlIG9mIHN0YWJzCi0JZGVidWcgaW5mby4gIFNldHVwIGluZm8gYWJvdXQgbGlua2VyIHN5bWJvbHMgb25seSwgYW5kIHVzZQotCXN0YW5kYXJkIGJmZCBmaWVsZHMgdG8gaG9sZCB0aGUgaW5mby4KLQkqIChocHBhX29iamVjdF9wKTogIFJlbW92ZSB1bm5lZWRlZCBkZWNscy4KLQkqIChocHBhX25ld19zZWN0aW9uX2hvb2spOiAgR2V0IHJpZCBvZiBtb3N0IG9mIHRoaXMuCi0JKiBsaWJocHBhLmggKHN0cnVjdCBocHBhZGF0YSk6ICBSZW1vdmUgdGVuIHBvdW5kcyBvZiB1c2VsZXNzIHVnbHkKLQlmYXQuICBSZW1vdmUgYWxsIGtub3dsZWRnZSBvZiBzdGFicywgcmVtb3ZlIHJlZHVuZGFudCBrbm93bGVkZ2Ugb2YKLQlsaW5rZXIgc3ltYm9scy4KLQkqIFJlbW92ZSBtYWNyb3MgZm9yIGFjY2Vzc2luZyBmaWVsZHMgd2hpY2ggYXJlIG5vdyBnb25lLgotCi1GcmkgSmFuICA4IDE1OjIwOjAwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IGFsbG93IFNFQ19ORVZFUl9MT0FEIHRvIHR1cm4gb24KLQlTVFlQX05PTE9BRCBiaXQuCi0JKiBjb2ZmLXo4ay5jOiBkZWxldGUgdW51c2VkIHJlbG9jIGZ1bmN0aW9ucwotCi1GcmkgSmFuICA4IDE1OjQ3OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkZWQgZWNvZmZfdGRhdGEgdG8gdGRhdGEgdW5pb24uCi0JKiB0YXJnZXRzLmMgKGVudW0gdGFyZ2V0X2ZsYXZvdXIpOiBBZGRlZCBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIuCi0JKiBjb2ZmLW1zeW0uYzogVXNlIERFRlVOIGZvciBmdW5jdGlvbiBkZWZpbml0b25zLgotCSogY29mZi1taXBzLmM6IEFkZGVkIGNvZGUgdG8gcmVhZCBhbmQgcHJpbnQgc3ltYm9scywgYW5kIHRvIGZpbmQKLQlsaW5lIG51bWJlcnMuCi0KLQkqIGNvZmZjb2RlLmg6IE1vdmVkIG1hbnkgZ2VuZXJpYyBmdW5jdGlvbnMgaW50byBjb2ZmZ2VuLmMuICBNb3ZlZAotCXN3YXBwaW5nIGZ1bmN0aW9ucyBpbnRvIGNvZmZzd2FwLmggZm9yIEVDT0ZGIHVzZS4gIE1vdmVkCi0JcmVsb2NhdGlvbiBmdW5jdGlvbnMsIG9ubHkgdXNlZCBieSBoODMwMCBhbmQgejhrLCBpbnRvIHJlbG9jMTYuYy4KLQlBZGRlZCBob29rcyBmb3IgY29mZmdlbi5jIGZ1bmN0aW9ucyB0byBiYWNrZW5kIGRhdGEgc3RydWN0dXJlLCBhbmQKLQlhZGRlZCBob29rIGZ1bmN0aW9ucy4gIFN0aWxsIG1vcmUgY291bGQgYmUgZG9uZS4KLQkqIGNvZmZzd2FwLmg6IE5ldyBmaWxlIHRvIGhvbGQgQ09GRiBzd2FwcGluZyByb3V0aW5lcy4KLQkqIGNvZmZnZW4uYzogTmV3IGZpbGUgdG8gaG9sZCBnZW5lcmljIENPRkYgZnVuY3Rpb25zLgotCSogcmVsb2MxNi5jOiBOZXcgZmlsZSB0byBob2xkIGg4MzAwIGFuZCB6OGsgc3BlY2lmaWMgcmVsb2NhdGlvbgotCWZ1bmN0aW9ucy4KLQkqIGxpYmNvZmYtaW4uaDogQWRkZWQgZGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgaW4gY29mZmdlbi5jLgotCSogbGliY29mZi5oOiBSZWJ1aWx0IHRvIGluY29ycG9yYXRlIGNoYW5nZXMuCi0JKiBjb2ZmLWg4MzAwLmM6IEZ1bmN0aW9uIG5hbWUgY2hhbmdlcy4KLQkqIGNvZmYtejhrLmM6IEZ1bmN0aW9uIG5hbWUgY2hhbmdlcy4gIFVzZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMKLQlob29rIHJhdGhlciB0aGFuIGRlZmluaW5nIEVYVFJBX0NBU0VTLgotCSogTWFrZWZpbGUuaW46IEJ1aWxkIG5ldyBmaWxlcyBjb2ZmZ2VuIGFuZCByZWxvYzE2LiAgQWRkZWQKLQlkZXBlbmRlbmNpZXMgb2YgY29mZi0qLm8gb24gY29mZnN3YXAuaCBhbmQgc2VjbGV0LmguCi0KLVRodSBKYW4gIDcgMTY6MTY6MjYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9ucyk6ICBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nCi0JYWJvdXQgZGlzY2FyZGluZyBjb25zdC4KLQotV2VkIEphbiAgNiAwMDoxNjo0OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYywgc2VjbGV0LmMsIGVsZi5jIHVzZSBiZmRfeG1hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYwotCi1UdWUgSmFuICA1IDA5OjM1OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwb3N0LXRhcmdldCk6IElmIC0td2l0aC1taW5pbWFsLWJmZCBpcyBzcGVjaWZpZWQsCi0Jc2V0IE1JTklNSVpFPTEuCi0KLU1vbiBKYW4gIDQgMDc6MjA6MDEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9yZWNvcmRzKTogb25lIG9mIG15IGJvYXJkcyB3YW50cyBhIENSIGJldHdlZW4KLQlyZWNvcmRzLgotCi1XZWQgRGVjIDMwIDEyOjQ2OjMwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogc2V0IHN5bWRlZl9jb3VudCBjb3JyZWN0bHkKLQkoaXQgYnJva2UgYSBjb3VwbGUgb2Ygd2Vla3MgYWdvKS4KLQotVHVlIERlYyAyOSAyMTo0MTowNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IFN3aXRjaCBiYWNrIHRvICJzdHJ1Y3QgLi4uIiBmb3IKLQlyZXR1cm4gdHlwZSwgc28gbGliYmZkLmggZG9lc24ndCByZWZlcmVuY2UgdW5kZWZpbmVkIHR5cGVkZWZuYW1lcy4KLQotVHVlIERlYyAyOSAxMzo1NDozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCk6IHVzZSBuYW1lIEkzODZBSVhNQUdJQyByYXRoZXIKLQl0aGFuIEkzODZTVk1BR0lDLgotCShjb2ZmX3BvaW50ZXJpemVfYXV4KTogZG9uJ3QgcG9pbnRlcml6ZSBhIG5lZ2F0aXZlIHRhZ25keAotCShzb21ldGltZXMgZ2VuZXJhdGVkIGJ5IFNDTyAzLjJ2NCBjYykuCi0KLQkqIGJvdXQuYyAoY2FsbGp4X2NhbGxiYWNrLCBjYWxsal9jYWxsYmFjaywKLQliX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiB3YXJuIGlmIHJlbG9jYXRpbmcgYWdhaW5zdAotCWFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLU1vbiBEZWMgMjggMTQ6MzA6NTUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiAgR2V0IHJpZCBvZiBERUZVTiwgdXNlIG1vcmUgY29udmVudGlvbmFsIHByb2xvZyBzdHVmZi4KLQlNYWtlIGEgYnVuY2ggbW9yZSByb3V0aW5lcyBiZSBzdGF0aWMuCi0JKiBocHBhLmMgKGZpbGxfc3BhY2VzKTogIEdldCByaWQgb2YgdGhpcywgcmVwbGFjZSB3aXRoIG11Y2ggYmV0dGVyCi0Jd3JpdHRlbiBzZXR1cF9zZWN0aW9ucygpLgotCSogKHNldHVwX3NlY3Rpb25zKTogIE5ldyByb3V0aW5lIHRvIGNyZWF0ZSBCRkQgc2VjdGlvbnMgZm9yIGVhY2gKLQlzcGFjZSBhbmQgc3Vic3BhY2UgaW4gU09NIGZpbGVzLgotCSogKGhwcGFfb2JqZWN0X3NldHVwKTogIFVzZSBCRkQgc2VjdGlvbnMgY3JlYXRlZCBieQotCXNldHVwX3NlY3Rpb25zKCkgdG8gbG9jYXRlIEdEQiBzeW1ib2wgdGFibGUgaW5mby4KLQkqIChtYWtlX3VuaXF1ZV9zZWN0aW9uKTogIE5ldyByb3V0aW5lIHRvIGNyZWF0ZSBhIEJGRCBzZWN0aW9uLiAgSXQKLQllbnN1cmVzIHRoYXQgdGhlIGdpdmVuIG5hbWUgaXMgdW5pcXVlLCBhbmQgd2lsbCBnZW5lcmF0ZSBhIHVuaXF1ZQotCW9uZSBpZiBuZWNlc3NhcnkuCi0JKiAoaHBwYV9vYmplY3RfcCk6ICBCZWNvbWUgbXVjaCBtb3JlIHBhcmFub2lkIGFib3V0IGZpbGUgaGVhZGVyLgotCSogKG1ha2VfYmZkX2FzZWN0aW9uKTogIENhbGwgYmZkX21ha2Vfc2VjdGlvbiB0byBkbyB0aGUgZGlydHkKLQl3b3JrLiAgU2ltcGxpZnkgY29kZSBzb21ld2hhdC4KLQkqIChocHBhX2NvcmVfZmlsZV9wKTogIFVzZSBwcm9wZXIgbmFtZSBmb3Igc3RhY2sgc2VjdGlvbi4KLQkqIGxpYmhwcGEuaDogIFJlbW92ZSBtaWxsaWNvZGVfc3RhcnQsIG1pbGxpY29kZV9lbmQgZGVjbHMuCi0KLU1vbiBEZWMgMjggMTE6MDM6MjIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjb2ZmLXdlMzJrLm8sIGNvZmYtejhrLm8pOiBOb3RlIGRlcGVuZGVuY2llcy4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZvciBub3JtYWwgMi0gb3IgNC1ieXRlCi0JcmVsb2NzLCBkb24ndCBib3RoZXIgZG9pbmcgdGhlIGFkanVzdG1lbnQgaWYgdGhlIHZhbHVlIHRvIGFkZCBpcwotCXplcm8uCi0KLVN1biBEZWMgMjcgMTc6NDU6MDUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X3NpemUpOiAgTmV3IGZ1bmN0aW9uIHRoYXQgZ2V0cyBhbiB1cHBlciBib3VuZAotCW9uIHRoZSBwb3NzaWJsZSBzaXplIG9mIGFueSBvYmplY3QgaW4gYSBiZmQuCi0JKiBlbGYuYyAoYmZkX2VsZl9maW5kX3NlY3Rpb24sIGVsZl9nZXRfc3RyX3NlY3Rpb24sCi0JZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiAgUmV3cml0ZSB0byBhdm9pZCBOVUxMIHBvaW50ZXIKLQlkZXJlZmVyZW5jZXMuCi0JKiBlbGYuYyAoZWxmX2JpZ192ZWMsIGVsZl9saXR0bGVfdmVjKTogIERvY3VtZW50IGxhc3QgdGhyZWUKLQltZW1iZXJzIGluaXRpYWxpemVkIHRvIE5VTEwuCi0KLVRodSBEZWMgMjQgMTc6NDk6MDkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBocHBhLmM6IGNoYW5nZSBhICdjb25zdCcgdG8gJ0NPTlNUJywgb3IgZWxzZSBIUCBDIGNvbXBpbGVyIGRpZXMKLQotTW9uIERlYyAyMSAxNjozMzozNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6ICBOZXcgZmlsZS4gIEF0dGVtcHQgYXQgYSBnZW5lcmljL2RlZmF1bHQKLQlzZXQgb2YgZGVmaW5pdGlvbnMsIHRvIGRpc2NvdXJhZ2UgcG9ydGluZyB0byBuZXcgaG9zdHMgYnkgY29weWluZy4KLQkqIGhvc3RzL25ld3MuaDogIFJlbW92ZWQuCi0JKiBob3N0cy9zcGFyYy5oOiAgVXNlIHN0ZC1ob3N0LmguCi0JKiBiZmQtaW4uaDogIE5ldyBtYWNyb3MgYmZkX2FzeW1ib2xfYmZkIGFuZCBiZmRfYXN5bWJvbF9mbGF2b3VyOwotCXBlcmhhcHMgd2UgY2FuIGxhdGVyIHJlbW92ZSB0aGUgdGhlX2JmZCBmaWVsZCBmcm9tIGVhY2ggc3ltYm9sLgotCSogc3ltcy5jIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5KTogIFJlbW92ZSB1bnVzZWQgZmllbGQKLQlhcHBfZGF0YS4gIEFkZCBjb21tZW50IG5vdGluZyB0aGF0IHRoZV9iZmQgaXMgYWxtb3N0IHJlZHVuZGFudCwKLQlidXQgbm90IHF1aXRlLgotCSogYW91dHguaCwgY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZmNvZGUuaDoKLQlVc2UgbmV3IG1hY3JvcyBiZmRfYXN5bWJvbF9iZmQgYW5kIGJmZF9hc3ltYm9sX2ZsYXZvdXIuCi0JKiBocHBhLmMgKGZpbGxfc3BhY2VzKTogIE1ha2Ugc2xpZ2h0bHkgbW9yZSByZWJ1c3QuCi0JKiBjb25maWd1cmUuaW46ICBBbGxvdyBzdGQtaG9zdCBhcyB0aGUgImRlZmF1bHQiIGhvc3QuCi0KLU1vbiBEZWMgMjEgMTc6MjQ6MTMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBBZGQgc3RydWN0IGhwcGFfY29yZV9kYXRhIHRvIHRkYXRhIHVuaW9uLgotCSogaHBwYS5jOiAgQ29uZGl0aW9uYWxpemUgb24gSE9TVF9IUFBBSFBVWCBpbnN0ZWFkIG9mIGhwOTAwMHM4MDAuCi0JR2V0IHJpZCBvZiBIUFBBL0JTRCBzcGVjaWZpYyBjb2RlLiAgVGhhdCB3aWxsIGdvIHNvbWV3aGVyZSBlbHNlCi0Jc29tZWRheS4KLQkqIChmaWxsX3NwYWNlcyk6ICBEb24ndCBzcGluIGZvcmV2ZXIgYW5kIGRpZSBpZiB5b3UgZG9uJ3QgZmluZAotCSRNSUxMSUNPREUkIHN1YnNwYWNlLgotCSogKGhwcGFfb2JqZWN0X3ApOiAgTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIHJlYWwgaG9uZXN0LXRvLWN0aHVsdQotCWV4ZWMgZmlsZSEKLQkqIChocHBhX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCwgaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKToKLQlNYWtlIHRoZXNlIHdvcmsgZm9yIEhQVVguCi0JKiAobWFrZV9iZmRfYXNlY3Rpb24pOiAgTmV3IHJvdXRpbmUgdG8gbWFrZSBzZWN0aW9uIGNyZWF0aW9uIGEKLQlsaXR0bGUgZWFzaWVyLgotCSogKGhwcGFfY29yZV9maWxlX3ApOiAgQ29tcGxldGVseSByZXdyaXRlLCBsZWF2ZSBvdXQgYnVncy4KLQkqIGxpYmhwcGEuaDogICNpbmNsdWRlIHRoZSByaWdodCBzeXN0ZW0gZmlsZXMuICBSZWRlZmluZSBhbGwgb2YKLQl0aGUgc3RydWN0cy9tYWNyb3MgZm9yIGhhY2tpbmcgY29yZSBmaWxlcyB0byB1c2UgbW9yZSBzZW5zaWJsZQotCUhQVVggY29yZSBmaWxlIHN0cnVjdHVyZXMuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgQ29uZGl0aW9uYWxpemUgaHBwYV92ZWMgb24KLQlIT1NUX0hQUEFIUFVYLCBub3QgaHA5MDAwczgwMC4KLQkqIGhvc3RzL2hwcGFocHV4Lmg6ICAjaW5jbHVkZSBzdGRsaWIuaCB0byBnZXQgY29ycmVjdCBkZWNscyBmb3IKLQltYWxsb2MgYW5kIHJlYWxsb2MuICAjZGVmaW5lIEhPU1RfSFBQQUhQVVguCi0KLU1vbiBEZWMgMjEgMTI6NDA6MTAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBQYXRjaGVzIGZyb20gTWluaCBUcmFuLWxlIDxtdHJhbmxlQHBhcmlzLmludGVsbGljb3JwLmNvbT4uCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1pc2MqLCBpMzg2LSotYWl4Kik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmhvc3QgKGkzODYtKi1pc2MqLCBpMzg2LSotYWl4Kik6IE5ldyBob3N0cy4KLQkqIGhvc3RzL2kzODZpc2MuaCwgY29uZmlnL2kzODZpc2MubWg6IE5ldyBmaWxlcyBmb3IgSW50ZXJhY3RpdmUKLQlVbml4LgotCSogaG9zdHMvaTM4NmFpeC5oLCBjb25maWcvaTM4NmFpeC5taDogTmV3IGZpbGVzIGZvciBBSVggb24gUFMvMi4KLQkqIGFpeDM4Ni1jb3JlLmM6IE5ldyBmaWxlIGZvciBoYW5kbGluZyBjb3JlIGZpbGVzIG9uIEFJWCBvbiBQUy8yLgotCSogdGFyZ2V0cy5jOiBpZiBBSVgzODZfQ09SRSwgdXNlIGFpeDM4Nl9jb3JlX3ZlYy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCk6IGNoZWNrIGZvciBJMzg2U1ZNQUdJQyBhcyB3ZWxsCi0JYXMgSTM4Nk1BR0lDLgotCi1GcmkgRGVjIDE4IDEwOjIwOjI3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCBmbGFncyB0byAwLCBmaXhpbmcKLQkxOTI3LgotCi1UaHUgRGVjIDE3IDE5OjM1OjMyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGR2aSB0YXJnZXQKLQotVGh1IERlYyAxNyAwMDozNjoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBVc2UgcmlnaHQgbmFtZSBmb3IgdGVraGV4IHRkYXRhIHN0cnVjdC4KLQkqIHRla2hleC5jOiAgSW5zZXJ0IGxlYWRpbmdfY2hhciAoMCkgaW50byBiZmRfdGFyZ2V0IHN0cnVjdC4gIFN0eWxlLgotCSogbGliY29mZi5oOiAgVXBkYXRlZCB0byBnZXQgc3BhY2luZyBjaGFuZ2UgZnJvbSBjb2ZmY29kZS5oLgotCSogdHJhZC1jb3JlLmM6ICBsZWFkaW5nX2NoYXIgaXMgMCAobm8gc3ltYm9scyEpLCBub3QgJ18nLgotCi1UdWUgRGVjIDE1IDE1OjQwOjMwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgZG9fc2x1cnBfY29mZl9hcm1hcCk6ICBOZXcKLQlmdW5jdGlvbnMsIHdpdGggdGhlICJndXRzIiBvZiB0aGUgb2xkIGJmZF9zbHVycF9ic2RfYXJtYXAKLQlhbmQgYmZkX3NsdXJwX2NvZmZfYXJtYXAsIGJ1dCBhc3N1bWluZyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQKLQlpZiB0aGUgYXJtYXAgaXMgcHJlc2VudCBvciBub3QuCi0JQWxzbywgcmV3cml0ZSBhIGJpdCB0byBhdm9pZCBrZWVwaW5nIGFyb3VuZCBvYnN0YWNrIGRhdGEKLQl0aGF0IHdlIGRvbid0IG5lZWQuCi0JKiBhcmNoaXZlLmMgKHNuYXJmX2FyX2hlYWRlciwgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKToKLQlWYXJpb3VzIGZpeGVzIHRvIGNvcnJlY3RseSBoYW5kbGUgQ09GRl9zdHlsZSBhcmNoaXZlcyBuYW1lcy4KLQkoTm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgaGF2ZSBhIHRyYWlsaW5nICcvJywgdGhlIG5hbWVzIGNhbgotCWhhdmUgZW1iZWRkZWQgc3BhY2VzLikKLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogIE5ldyBmdW5jdGlvbiwgcmVwbGFjZXMgb2xkCi0JYmZkX3NsdXJwX2JzZF9hcm1hcCBhbmQgYmZkX3NsdXJwX2NvZmZfYXJtYXAuICBSZWNvZ25pemVzCi0JX2VpdGhlcl8gZm9ybWF0LCBhbmQgY2FsbHMgZG9fc2x1cnBfYnNkX2FybWFwIG9yCi0JZG9fc2x1cnBfY29mZl9hcm1hcCBpZiBlaXRoZXIgZm9ybSBvZiBtYXAgaXMgc2Vlbi4KLQkqIGxpYmJmZC1pbi5oOiAgQ2hhbmdlZCBiZmRfc2x1cnBfYnNkX2FybWFwIGFuZAotCWJmZF9zbHVycF9jb2ZmX2FybWFwIGludG8gbWFjcm8gc3lub255bXMgZm9yIGJmZF9zbHVycF9hcm1hcC4KLQkqIGVsZi5jIChlbGZfc2x1cnBfYXJtYXAsIGVsZl93cml0ZV9hcm1hcCk6ICBGaXguCi0JKiBNYWtlZmlsZS5pbiAoQVJfRkxBR1MpOiAgVXNlIHJjIGluc3RlYWQgb2Ygbm9uLXN0YW5kYXJkIHFjLgotCi1Nb24gRGVjIDE0IDE3OjA4OjA4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogICNpbmNsdWRlICJzeXNkZXAuaCIsIG5vdCA8c3lzZGVwLmg+LgotCSogbGliaHBwYS5oOiAgTWFrZSBtaWxsaWNvZGVfc3RhcnQgYW5kIG1pbGxpY29kZV9lbmQgYmUgdW5zaWduZWQKLQlpbnQgdG8gYmUgc2FtZSB0eXBlIGFzIENPUkVfQUREUiBpbiBHREIuICBXaHkgYXJlIHRoZXNlIGhlcmU/Ci0KLVNhdCBEZWMgMTIgMTU6NTQ6MzYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODYuYyAoQ0FMQ19BRERFTkQpOiBpZiByZWxvYyBpcyBQQyByZWxhdGl2ZSwgYWRkIHRoZQotCXZhZGRyIG9mIHRoZSBzZWN0aW9uIHRvIHRoZSBhZGRlbmQuCi0JKiB0YXJnZXRzLmM6IGlmIE1JTklNSVpFIGlzIDEsIGFuZCBTQ09fQ09SRSBpcyBkZWZpbmVkLCBhZGQKLQlTQ09fQ09SRSB0byBTRUxFQ1RfVkVDUy4KLQkodGFyZ2V0X3ZlY3Rvcik6IGFkZCBzY29fY29yZV92ZWMuCi0JKiBzY28tY29yZS5jIChzY29fY29yZV92ZWMpOiBhZGQgbGVhZGluZyB1bmRlcnNjb3JlIGluaXRpYWxpemVyLgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc2NvKik6IHVzZSB0YXJnZXQgaTM4Ni1zY28uCi0JKiBjb25maWcvaTM4Ni1zY28ubXQ6IG5ldyBmaWxlOyBkZWZpbmUgU0NPX0NPUkUuCi0KLVRodSBEZWMgMTAgMDI6MTM6MTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9vYmplY3RfcCk6ICBGaXggIXN0cmNtcCB0aGlua28uCi0KLUZyaSBEZWMgIDQgMTQ6MDI6NDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IE5vdyBzdGF0aWMgYW5kIGNvbnN0LgotCi1UaHUgRGVjICAzIDE2OjU0OjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmxpbnV4Lmg6IEluY2x1ZGUgdW5pc3RkLmguCi0KLQkqIGFvdXR4LmggKHByaW50X3N5bWJvbCk6IGFvdXRfc3RhYl9uYW1lIHJldHVybnMgYSBjb25zdGFudAotCXN0cmluZy4KLQkqIGxpYmFvdXQuaCAoYW91dF9zdGFiX25hbWUpOiBGaXggcHJvdG90eXBlLgotCSogc3RhYi1zeW1zLmMgKGFvdXRfc3RhYl9uYW1lcyk6IEFycmF5IGlzIG5vdyBjb25zdC4KLQkoYW91dF9zdGFiX25hbWUpOiBSZXR1cm4gdmFsdWUgaXMgbm93IHBvaW50ZXIgdG8gY29uc3QuCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgY3Rvci5jLCByZWxvYy5jLAotCXN5bXMuYzogRG9jIGZpeGVzLgotCi0JKiBzeW1zLmMgKGFzeW1ib2wpOiBBZGRlZCBuZXcgZmllbGQgImFwcF9kYXRhIiwgZm9yIGRhdGEKLQlwYXJ0aWN1bGFyIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFNvbWUgb2YgdGhlIGxpbmtlciBmbGFncyBvdWdodCB0bwotCWdldCBtb3ZlZCB0byB0aGlzIGZpZWxkIHNvbWVkYXkuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBSZWNvZ25pemUgYSBmZXcgbW9yZSBudW1iZXJzOgotCTgwNDg2LCA4MDk2MCwgYW5kIDk2MC4KLQotCSogYmZkLWluLmggKENPRkZfU1dBUF9UQUJMRSk6IE5ldyBpcyBqdXN0IGFkZHJlc3Mgb2YKLQliZmRfY29mZl9zdGRfc3dhcF90YWJsZSwgY2FzdCB0byBQVFIuCi0JKiBiZmQuYyAoYmZkX2NvZmZfc3dhcF8qKTogRGVsZXRlZCBtYWNyb3MuCi0JKiB0YXJnZXRzLmMgKHN0cnVjdCBiZmRfdGFyZ2V0KTogRGVsZXRlZCBDT0ZGLXNwZWNpZmljIHN3YXBwaW5nCi0Jcm91dGluZSBwb2ludGVycy4KLQkqIGNvZmZjb2RlLmggKHR5cGUgYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogTmV3IHN0cnVjdHVyZSB0eXBlLAotCWNvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSBDT0ZGLXNwZWNpZmljIHN3YXBwaW5nIHJvdXRpbmVzLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IE5ldyBkYXRhIHN0cnVjdHVyZSwgdG8gYmUgdXNlZCB3aGVuCi0JTk9fQ09GRl9TWU1CT0xTIGFuZCBOT19DT0ZGX0xJTkVOT1MgYXJlIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zd2FwXyopOiBOZXcgbWFjcm9zLgotCSogY29mZi1taXBzLmMgKG1pcHNfY29mZl9zd2FwX3RhYmxlKTogTmV3IGRhdGEgc3RydWN0dXJlLgotCShlY29mZl9iaWdfdmVjKTogVXNlIGl0LgotCSogQWxsIENPRkYgdGFyZ2V0czogTW92ZWQgQ09GRl9TV0FQX1RBQkxFIHRvIHRhcmdldC1zcGVjaWZpYyBkYXRhLgotCSogQWxsIG90aGVyIHRhcmdldHM6IERlbGV0ZWQgY29mZi1zcGVjaWZpYyB2ZWN0b3IgZW50cmllcy4KLQotCSogdHJhZC1jb3JlLmM6IEZpeGVkIHNvbWUgYFBBUkFNUycgdXNlcyB0aGF0IHdlcmUgbWlzc2luZwotCXBhcmVudGhlc2VzLgotCi1TdW4gTm92IDI5IDA4OjM3OjEzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgUHJvdGVjdCBhcmcgcHJvdG90eXBlIGluCi0JY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCB3aXRoIFBBUkFNUyBtYWNybyBmb3Igbm9uLUFOU0kgY29tcGlsZXJzLgotCi1TYXQgTm92IDI4IDA0OjAxOjIxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oLCBhb3V0ZjEuaCwgdHJhZC1jb3JlLmMsIGNvZmZjb2RlLmgsIGxpYmFvdXQuaCwKLQlsaWJiZmQtaW4uaCwgYmZkLWluLmg6IEVsaW1pbmF0ZSBhbGwgUFJPVE8gY2FsbHMsIHJlcGxhY2Ugd2l0aAotCVBBUkFNUyBmb3IgcmVhZGFiaWxpdHkuCi0KLQkqIGFvdXR4Lmg6ICBBZGQgdHlwZSB0byBjYWxsYmFjayBwYXJhbWV0ZXIuCi0JKiBjb2ZmLW1pcHMuYzogIERvbid0IGNhbGwgdHJhZC1jb3JlLmgsIG5vdCBuZWVkZWQuCi0JKiB0cmFkLWNvcmUuYzogIEluY29ycG9yYXRlIHRyYWQtY29yZS5oIGRlY2xhcmF0aW9ucy4gIEZpeCBjb21tZW50cy4KLQkqIHRyYWQtY29yZS5oOiAgRWxpbWluYXRlLCB1bnVzZWQuCi0KLVdlZCBOb3YgMTggMTM6MTY6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0KTogaWYgZGVmYXVsdCB0YXJnZXQgaXNuJ3QgZm91bmQKLQl0aGVuIGxvb2sgdGhyb3VnaCB0aGUgZW50aXJlIGxpc3QgcmF0aGVyIHRoYW4gcmV0dXJuIGVhcmx5LgotCi1Nb24gTm92IDE2IDE0OjMzOjAzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2k5NjAtY29mZi5tdDogcmVvcmRlciB2ZWMgdG8gbWF0Y2ggYmZkX2NoZWNrX2Zvcm1hdCAoZnJvbSBQZXIpCi0KLVRodSBOb3YgMTIgMTc6MDE6NDEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIHByZWZpeCBhbmQgZXhlY19wcmVmaXggaW4gRkxBR1NfVE9fUEFTUwotCi1UaHUgTm92IDEyIDA5OjQ2OjQ3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXo4ay5jOiBjaGVja3BvaW50LCBtb3JlIGFkZHJlc3NpbmcgbW9kZXMgaGFuZGxlZAotCSogY29mZmNvZGUuaCAoZ2V0X3ZhbHVlKTogZG9uJ3QgdHJ1bmNhdGUgcmVsb2MtPmFkZGVuZCBmaWVsZCwgaXQncwotCWEgbG9uZyBub3cuCi0KLVdlZCBOb3YgMTEgMjM6NTc6NTUgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogd2UzMmsubXQgKFRERUZBVUxUUyk6IFVzZSB3ZTMya2NvZmZfdmVjLCBub3QgaTM4NmNvZmZfdmVjLgotCi1UdWUgTm92IDEwIDE0OjA0OjM4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1pbm9yIHR3ZWFrcyB0byBtYWtlICQoQ0MpIGNvbW1hbmQgbGluZXMgbW9yZSBjb25zaXN0ZW50Ci0KLU1vbiBOb3YgIDkgMjM6NTg6MTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVuciwgYmZkX2Nsb3NlKTogIEFkZCBkb2MgYWJvdXQgY2FjaGVpbmcKLQlhbmQgYWJvdXQgd2hlbiBmaWxlIGRlc2NyaXB0b3JzIGFyZSBjbG9zZWQuCi0KLVNhdCBOb3YgIDcgMDA6NDI6MjAgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogTWFrZSBzdXJlIGFsaWdubWVudCByZWxvY3MgZ2V0Ci0Jd3JpdHRlbiBvdXQgY29ycmVjdGx5LgotCi1UaHUgTm92ICA1IDE1OjM0OjE5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jOiBOZXcgc2VjdGlvbiBiaXQgU0VDX1NIQVJFRF9MSUJSQVJZLgotCWNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogaWYgU1RZUF9OT0xPQUQgJiYgKFNUWVBfVEVYVCB8fAotCVNUWVBfREFUQSksIHNldCBTRUNfU0hBUkVEX0xJQlJBUlkuICBUaGlzIHNlZW1zIHRvIGJlIGNvcnJlY3QgZm9yCi0JaTM4Ni1zeXN2LgotCi1UaHUgTm92ICA1IDA0OjQzOjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiB0YXJnZXQuYyAoc3RydWN0IGJmZF90YXJnZXQpOiAgRWxpbWluYXRlIHRoZSBTREVGIGFuZCBTREVGX0ZNVAotCW1hY3JvczsgdXNlIFBBUkFNUyB0byBkZWNsYXJlIHRoZSBmdW5jdGlvbiBwb2ludGVycyBpbnZvbHZlZC4KLQotCSogYmZkLWluLmgsIGJmZC5jLCBsaWJiZmQuaCwgcmVsb2MuYywgc2VjbGV0LmgsIHNlY3Rpb24uYywKLQl0YXJnZXRzLmM6IFJlbmFtZSBzdHJ1Y3QgYmZkX3NlY2xldF9zdHJ1Y3QgdG8gc3RydWN0IGJmZF9zZWNsZXQuCi0KLVRodSBOb3YgIDUgMDI6NTk6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlDbGVhbnVwOiAgUmVwbGFjZSBhbGwgdXNlcyBvZiBFWEZVTiBpbiB0aGUgQkZEIHNvdXJjZXMsIHdpdGggUEFSQU1TLgotCi0JKiBhcmNodXJlcy5jLCByZWxvYy5jLCBzZWN0aW9uLmMsIHRla2hleC5jOiAgVXNlIFBBUkFNUyBpbgotCWRlY2xhcmluZyBwb2ludGVycyB0byBmdW5jdGlvbnMuCi0JKiBjYWNoZS5jLCBlbGYuYzogIE1vdmUgc3RhdGljIGZ1bmN0aW9uIGRlY2xzIHRvIHRvcCwgdXNlIFBBUkFNUy4KLQkqIHNlY2xldC5oOiAgRGVjbGFyZSBleHRlcm5hbCBmdW5jdGlvbiB3aXRoIFBBUkFNUy4KLQotCSogZG9jL2NoZXcuYyAoZXhmdW5zdHVmZik6ICBFbGltaW5hdGUuCi0JKHBhcmFtc3R1ZmYpOiAgUmVwbGFjZSBleGZ1bnN0dWZmIHdpdGggZnVuY3Rpb24gdG8gZ2VuZXJhdGUgUEFSQU1TLgotCSogZG9jL3Byb3RvLnN0cjogIFVzZSBwYXJhbXN0dWZmIHJhdGhlciB0aGFuIGV4ZnVuc3R1ZmYuCi0KLQkqIGxpYmJmZC5oOiAgVXBkYXRlLCBiYXNlZCBvbiBjaGFuZ2VzIGluIHNvdXJjZSBjb2RlIGFuZCBjaGV3LgotCi1XZWQgTm92ICA0IDIyOjQ3OjI5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsaWJpZWVlLmg6ICBBZGQgRklYTUUgYWJvdXQgcmVtb3ZpbmcgbGltaXQgb24gbnVtYmVyIG9mIHNlY3Rpb25zLgotCSogYmZkLWluLmg6ICBJbXByb3ZlIGNvbW1lbnRzIHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBiZmQuaCBpcwotCXRoZSB3cm9uZyBwbGFjZSB0byBlZGl0IHRoaXMgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogIEluc3RhbGwgYW5zaWRlY2wuaCBhbmQgb2JzdGFjay5oIGluIHRoZQotCXNhbWUgcGxhY2VzIHdoZXJlIHdlIGluc3RhbGwgYmZkLmguCi0KLVdlZCBOb3YgIDQgMTM6NDA6MjMgMTk5MiAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfb3V0LCBjb2ZmX3N3YXBfYXV4X2luKTogIGNoZWNrIGZvcgotCXN5bWJvbCB0eXBlIGJlZm9yZSBibGluZGx5IG1vZGlmeWluZyB0aGUgYXV4ZW50LiAgU3BlY2lmaWNhbGx5LAotCW9ubHkgbW9kaWZ5IHRoZSBlbmRuZHggZmllbGRzIGZvciB0eXBlcyB0aGF0IG5lZWQgaXQsIGFuZCBkb24ndAotCXNldCB0aGUgYXJyYXkgaW5mb3JtYXRpb24gZm9yIG5vbi1hcnJheXMuCi0KLVdlZCBOb3YgIDQgMDk6MzA6NTAgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IFNlY3Rpb24gbGlzdCBzaG91bGQgYmUgc2V0IHVwCi0JY29ycmVjdGx5IGFueXdheXM7IGRvbid0IGhhdmUgdG8gc2V0IHVwICJuZXh0IiBwb2ludGVycyBtYW51YWxseS4KLQotTW9uIE5vdiAgMiAxMjozNjoxNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWx0YTg4Lm1oLCBjb25maWcvaHAzMDAubWgsIGNvbmZpZy9ocHBhaHB1eC5taCwKLQljb25maWcvaTM4NnYubWg6IHJlbW92ZWQgLURVU0cgZnJvbSBIREVGSU5FUy4KLQlob3N0cy9kZWx0YTg4LmgsIGhvc3RzL2hwMzAwLmgsIGhvc3RzL2hwcGFocHV4LmgsIGhvc3RzL2kzODZ2Lmg6Ci0JZGVmaW5lZCBVU0VfVVRJTUUuCi0JaG9zdHMvaTM4NnYuaDogZG9uJ3QgZGVmaW5lIFBPU0lYX1VUSU1FLgotCi1GcmkgT2N0IDMwIDE2OjEzOjUyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBtYWtlIGEgcHJpdmF0ZSBjb3B5IG9mIHRoZQotCXNlY3Rpb24ncyBuYW1lIGJlZm9yZSB0cnVuY2F0aW5nIGl0LgotCi1UaHUgT2N0IDI5IDA4OjMwOjUwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBocHBhLmM6IGFkZCBzeW1ib2xfbGVhZGluZ19jaGFyIGVudHJ5IGluIHRyYW5zZmVyIHZlYwotCi0sV2VkIE9jdCAyOCAxNjoxMTo1NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChnZXRfc3ltYm9sKTogY2FuIG5vdyBjb3BlIHdoZW4gdHdvIHN5bWJvbHMgb2YgYQotCWRpZmZlcmVudCBjbGFzcywgYnV0IHRoZSBzYW1lIGluZGV4IG51bWJlciBvY2N1ciBjb25zZWN1dGl2ZWx5LgotCShnZXRfc2VjdGlvbl9lbnRyeSk6IG5pY2VyIG5hbWUgZm9yIHNlY3Rpb25zIGJlaW5nIGZvcndhcmQKLQlyZWZlcmVuY2VkLiAoaWVlZV9hcmNoaXZlX3ApOiBkb24ndCBmcmVlIHRoZSBmaWxlbmFtZSBzdHJpbmcsCi0Jc2luY2UgaXQgd2FzIG5ldmVyIG1hbGxvY2VkLgotCi1XZWQgT2N0IDI4IDEzOjQyOjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBaZXJvIHRpbWVzdGFtcCBmaWVsZC4KLQotVHVlIE9jdCAyNyAxMjoyNDozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfb3V0KTogc2V0IHRoZSBmY25hcnkgaW5mbyBiZWZvcmUKLQlvcHRpb25hbGx5IHNldHRpbmcgdGhlIGRpbWVuIGluZm8sIHNpbmNlIHRoZXkgYXJlIGluIHRoZSBzYW1lCi0JbWVtb3J5IGxvY2F0aW9ucy4gIEFsc28gemVybyBvdXQgZXh0ZXJuYWwgYXV4ZW50LgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IGRvbid0IHplcm8gZXh0ZXJuYWwgYXV4ZW50OyBub3cgZG9uZSBpbgotCWNvZmZfc3dhcF9hdXhfb3V0LgotCi1GcmkgT2N0IDIzIDEzOjU1OjM1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQ2hlY2sgZmNsb3NlIHJldHVybiB2YWx1ZSBmb3IgZXJyb3JzLgotCWxpYmJmZC5oOiBiZmRfY2FjaGVfY2xvc2Ugbm93IHJldHVybnMgYSBib29sZWFuLgotCWNhY2hlLmMgKGJmZF9jYWNoZV9kZWxldGUpOiByZXR1cm4gZmNsb3NlIHN1Y2Nlc3MgdmFsdWUuCi0JKGJmZF9jYWNoZV9jbG9zZSk6IHJldHVybiBiZmRfY2FjaGVfZGVsZXRlIHJldHVybiB2YWx1ZS4KLQlvcG5jbHMuYyAoYmZkX2Nsb3NlLCBiZmRfY2xvc2VfYWxsX2RvbmUpOiByZXR1cm4gcmVzdWx0IG9mCi0JYmZkX2NhY2hlX2Nsb3NlLgotCi1GcmkgT2N0IDIzIDEwOjMyOjM2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzZWNsZXQuYyAocmVsKTogZG9uJ3QgbG9hZCBzZWN0aW9ucyB3aXRob3V0IHRoZSBTRUNfTE9BRCBiaXQuCi0KLVRodSBPY3QgMTUgMTA6MTY6MzUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jIChtNjhrX2hvd3RvMnR5cGUsIFNFTEVDVF9SRUxPQyk6IG5ldyBmdW5jdGlvbiB0bwotCXdvcmsgb3V0IGEgY29mZiByZWxvY2F0aW9uIHR5cGUgZnJvbSBhIGhvd3RvJ3MgYXR0cmlidXRlcyByYXRoZXIKLQl0aGFuIHVzaW5nIHRoZSBpbnB1dCByX3R5cGUgZmllbGQuIFRoaXMgZml4ZXMgUFIxNjc3IGFuZCBhbGxvd3MKLQljb252ZXJzaW9uIG9mIGEub3V0IHJlbG9jcyB0byBjb2ZmIHJlbG9jcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBpZiBzdXBwbGllZCBhIHJlbG9jYXRpb24KLQlyZWxhdGl2ZSB0byBhbiBhYnNvbHV0ZSBzeW1ib2wsIHVzZSB0aGUgcmlnaHQgc3ltYm9sIGluZGV4LgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogZG8gYSBwYXJ0aWFsIGxpbmsgZm9yIGNvZmYKLQlyZWxvY3MgcmlnaHQuCi0KLUZyaSBPY3QgMjMgMDg6MTU6NTYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjaGFuZ2VzIHRvIHN1cHBvcnQgaTM4Ni1zeXN2IHdpdGggc2hhcmVkIGxpYnJhcmllczoKLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogaWYgVFdPX0RBVEFfU0VDUyBpcyBkZWZpbmVkLAotCWNoZWNrIGZvciAuZGF0YTI7IGlmIF9MSUIgaXMgZGVmaW5lZCwgY2hlY2sgZm9yIGl0OyBtYXAKLQlTRUNfTkVWRVJfTE9BRCB0byBTVFlQX05PTE9BRC4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBtYXAgU1RZUF9OT0xPQUQgdG8gU0VDX05FVkVSX0xPQUQuCi0JKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IGlmIFRXT19EQVRBX1NFQ1MsIGFjY2VwdCAuZGF0YTIuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogZm9yY2UgdmFkZHIgb2YgLmxpYiB0byAwOyBzZXQgc2NucHRyCi0JaWYgc2VjdGlvbiBoYXMgY29udGVudHMsIG5vdCBqdXN0IGlmIGl0IGlzIGxvYWRhYmxlOyBpZgotCVRXT19EQVRBX1NFQ1MsIGNoZWNrIGZvciAuZGF0YTIKLQkoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IHNldCB2bWEgb2YgLmxpYiBzZWN0aW9uIHRvIG51bWJlciBvZgotCS5saWIgc2VjdGlvbnMuCi0JKiBjb2ZmLWkzODYuYzogZGVmaW5lIFRXT19EQVRBX1NFQ1M7IHVzZSBhIHNwZWNpYWwgQ0FMQ19BRERFTkQ7Ci0JZG9uJ3QgZGVmaW5lIGNvZmZfd3JpdGVfYXJtYXAgdG8gYnNkX3dyaXRlX2FybWFwLgotCSogaG9zdHMvaTM4NnYuaDogZG9uJ3QgaW5jbHVkZSA8dXRpbWUuaD4sIHNpbmNlIGl0IGlzIG5vdCBwcm92aWRlZAotCWJ5IFNWUjMuMi4KLQotVGh1IE9jdCAyMiAyMjo0MDoyMCAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIHNvbGFyaXMyLmg6IEdldCB0aGUgZGVmaW5pdGlvbiBvZiBhbGxvY2EgZnJvbSBhbGxvY2EuaCBpZiB3ZQotCWFyZW4ndCB1c2luZyBnY2MuCi0KLVRodSBPY3QgMjIgMDM6MDc6MjggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLXthb3V0LGJvdXR9KTogIFN1cHBvcnQgdGhlc2UuCi0KLVdlZCBPY3QgMjEgMDM6NDY6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hMjlrLWFvdXQubXQgKERFRkFVTFRfVEFSR0VUKTogIFNldCB0byBvbmUgdGhhdCBleGlzdHMuCi0KLVRodSBPY3QgMTUgMTU6MDU6MzkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFwb2xsbzY4LmgsIGFwb2xsb3Y2OC5oLCBocDMwMC5oLCBpMzg2di5oLCBpcml4My5oOiBSZW1vdmUKLQluby1sb25nZXItdXNlZCBkZWZpbml0aW9ucyBvZiBMX1NFVCBhbmQgTF9JTkNSLgotCSogaTM4NmxpbnV4Lmg6ICBUd2Vha3MgdG8gc21vb3RoIExpbnV4IGJ1aWxkLgotCi1UaHUgT2N0IDE1IDAxOjMyOjIyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzZWNsZXQuaDogIEFkZCBlbnVtIHRhZyB0byBiZmRfc2VjbGV0X2VudW1fdHlwZS4KLQotCSogYmZkLWluLmggKGZpbGVfcHRyKTogIFVwZGF0ZSBjb21tZW50cywgbWFrZSBGSVhNRSByZSBvZmZfdC4KLQotCSogYW91dC1hZG9iZS5jLCBhb3V0ZjEuaCwgYXJjaGl2ZS5jLCBib3V0LmMsIGNvZmYtcnM2MDAwLmMsCi0JY29mZmNvZGUuaCwgZWxmLmMsIGllZWUuYywgbGliYW91dC5oLCBsaWJiZmQuYywgb2FzeXMuYywKLQlzY28tY29yZS5jOiAgTGludDogIFNlY29uZCBhcmd1bWVudCBvZiBiZmRfc2VlayBpcyBhbHdheXMgZmlsZV9wdHIuCi0JVGhpcmQgYXJndW1lbnQgaXMgU0VFS19TRVQgb3IgU0VFS19DVVIuICBSZXN1bHQgaXMgYWx3YXlzIDAgb3IgLTEuCi0KLQkqIGFvdXQtYWRvYmUuYywgYW91dGYxLmgsIGFvdXR4LmgsIGJvdXQuYyBjb2ZmLW02OGsuYywgY29mZi16OGsuYywKLQljb2ZmY29kZS5oLCBlbGYuYywgbGliYW91dC5oLCBsaWJiZmQtaW4uaCwgc3JlYy5jOiAgTGludC4KLQotRnJpIE9jdCAgOSAwMzo0NjozNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBOZXcgZmlsZSwgY29udGFpbnMgbWFwcGluZyBvZiBob3N0IGNvbmZpZ3MKLQl0byBob3N0IHN1cHBvcnQgZmlsZSBuYW1lcyBmb3IgYmZkLCBiaW51dGlscywgb3Bjb2Rlcy4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBpdC4KLQkqIGkzODZhb3V0LmM6ICBDbGVhbnVwLCBkdW1wIFRBUkdFVF9JU19MSVRUTEVfRU5ESUFOX1AuCi0JKiBpMzg2YnNkLmM6ICBDbGVhbnVwLCByZWZvcm1hdC4KLQkqIGNvbmZpZy9pMzg2LWJzZC5tdDogIENvbW1lbnQgY2hhbmdlcy4KLQkqIGNvbmZpZy9pMzg2YnNkLm1oOiAgTmV3IGZpbGUgZm9yIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvaTM4NmJzZC5oOiAgTWVyZ2UgY2hhbmdlcyBmcm9tIFBldGVyIFNjaGF1ZXIuCi0JKiBib3V0LmMgKEFMSUdOKTogIFJlbmFtZSB0byBBTElHTkVSLCBzaW5jZSBzeXN0ZW0gaGVhZGVyIGZpbGVzCi0Jb24gQlNEIDQuNCBkZWZpbmUgQUxJR04gKHNpZ2ghKS4KLQotVGh1IE9jdCAgOCAyMjoxODoxMCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoYW91dF9iYWNrZW5kX2RhdGEpOiBhZGRlZCBleGVjX2hlYWRlcl9ub3RfY291bnRlZAotCWZpZWxkLiBGb3IgWk1BR0lDIGZpbGVzIG9ubHksIHdoZW4gdGV4dF9pbmNsdWRlc19oZWFkZXIgaXMgc2V0LCBieQotCWRlZmF1bHQgdGhlIGxlbmd0aCBvZiB0aGUgZXhlYyBoZWFkZXIgaXMgY291bnRlZCBpbiB0aGUgdGV4dAotCXNlY3Rpb24gc2l6ZS4gRm9yIGdvMzIsIGV4ZWMgaGVhZGVyIGlzIG1hcHBlZCBpbiBidXQgZG9lcyAqbm90KgotCWNvbnRyaWJ1dGUgdG8gdGhlIHNpemUgb2Ygc2VjdGlvbi4KLQkqIGFvdXR4LmggKGFvdXRfYWRqdXN0X3NpemVzX2FuZF92bWFzKTogaWYgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLQlpcyBub3Qgc2V0LCBidXQgenRpaCBpcywgYWRkIHRoZSBzaXplIG9mIHRoZSBleGVjIGhlYWRlciB0byB0aGUKLQlyZWNvcmRlZCBzaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24uCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IGNsZWFyIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkLgotCSogaTM4NmFvdXQuYyAoaTM4NmFvdXRfYmFja2VuZF9kYXRhKTogc2V0IGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkLgotCUFsc28gc2V0IHRleHRfaW5jbHVkZXNfaGVhZGVyLgotCSogYW91dC10YXJnZXQuaCAoKl9iYWNrZW5kX2RhdGEpOiBjbGVhcmUgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLQlieSBkZWZhdWx0IGluIE1ZKGJhY2tlbmRfZGF0YSkuCi0KLVRodSBPY3QgIDggMTg6MTI6NDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKGNhbGxiYWNrKTogRG9uJ3QgZGVmaW5lIHRoaXMgZnVuY3Rpb24gaWYgaXQgd29uJ3QgYmUKLQl1c2VkLgotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBSZXN0b3JlIG9sZCBhb3V0X2RhdGEgdmFsdWUgaWYgdGhpcwotCXR5cGUgZG9lc24ndCBtYXRjaC4gIERvbid0IGxvc2UgaWYgZmlsZSBzZWN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbgotCWNyZWF0ZWQuCi0JKHNldF9hcmNoX21hY2gpOiBTZXQgcmVsb2NfZW50cnlfc2l6ZS4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIGJmZF9oX2dldF97MTYsOH0gZm9yIHJlYWVkaW5nIHN5bWJvbCBkYXRhLgotCi0JKiBob3N0cy9pMzg2YnNkLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaVszNF04Ni0qLWJzZCBob3N0LgotCi0JKiBhb3V0LXRhcmdldC5oIChjYWxsYmFjaywgd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVsZXRlIHVudXNlZAotCXZhcmlhYmxlcy4KLQotCSogYW91dHguaCAocmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IFVzZSBpdCBhcyBkZWZhdWx0LgotCSogYW91dGYxLmggKHN1bm9zNF9yZWxvY190eXBlX2xvb2t1cCk6IERlbGV0ZWQuCi0JKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRG9uJ3QgZGVmaW5lIGl0LgotCi0JKiBhb3V0eC5oIChhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiBEb24ndCBib3RoZXIgd2l0aCBwYWRkaW5nIGZvcgotCU9NQUdJQyBmaWxlcy4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIGhlYWRlciBieXRlIG9yZGVyLCBub3QgdGFyZ2V0IGJ5dGUKLQlvcmRlciwgZm9yIHJlYWRpbmcgc3ltYm9sIGRhdGEuCi0KLVRodSBPY3QgIDggMTc6MzM6MzkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVuZG8gc29tZSBicmFpbiBkYW1hZ2UgaW4gdGhlIGhvc3Qgc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbjogIFJlZm9ybWF0IHRoZSB0YXJnZXQgc2VjdGlvbiwgdGVzdCBtYW55IGNvbmZpZ3MuCi0JKiBNYWtlZmlsZS5pbiAobWFrZSk6ICBSZW1vdmUgb2Jzb2xldGUgYG1ha2UgbWFrZScuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgTWFrZSBkZWZpbmVzIGxpbmUgdXAuCi0KLVRodSBPY3QgIDggMDg6NTI6NDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlOb3cgYSBiZmQga25vd3Mgd2hldGhlciB1bmRlcnNjb3JlcyBhcmUgbm9ybWFsbHkgcHJlcGVuZGVkCi0JdG8gc3ltYm9scyBpbiBpdHMgZmlsZSBmb3JtYXQuCi0KLQkqIGFvdXQtYWRvYmUuYywgYW91dC10YXJnZXQuaCwgYm91dC5jLCBjb2ZmLWEyOWsuYywgY29mZi1oODMwMC5jLAotCWNvZmYtejhrLmM6IHRhcmdldHMgc2V0IHNvIHRoZXkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmUKLQkqIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbWlwcy5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLXJzNjAwMC5jLCBjb2ZmLXdlMzJrLmMsIGVsZi5jLCBpZWVlLmMsIHNyZWMuYzogdGFyZ2V0cyBzZXQKLQl3aXRob3V0IGxlYWRpbmcgdW5kZXJzY29yZSBmbGFnCi0JKiB0YXJnZXRzLmM6IGFkZCBzeW1ib2wgbGVhZGluZyBjaGFyIHRvIHh2ZWMgZGVzY3JpcHRpb24KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBuZXcgbWFjcm8uCi0KLU1vbiBPY3QgIDUgMTQ6MzI6NTUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYzogIE1ha2UgZXJybm8gZ2xvYmFsLgotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiAgSWYgcmVhZCBmYWlscyAoYW5kCi0JZXJybm8hPTApIHNldCBiZmRfZXJyb3IgdG8gbWFsZm9ybWVkX2FyY2hpdmUgKHNpbmNlIHRoaXMgcHJvYmFibHkKLQlpbmRpY2F0ZXMgYSB0cnVuY2F0ZWQgYXJjaGl2ZSksIHJhdGhlciB0aGFuIHN5c3RlbV9jYWxsX2Vycm9yLgotCi1Nb24gT2N0ICA1IDAzOjMzOjM5IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHJ1bGVzIGZvciBpMzg2YnNkLmMKLQkqIGkzODZic2QuYzogbmV3IGZpbGUsIHN1cHBvcnRpbmcgMzg2YnNkLgotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaTM4Ni0qLWJzZCB0YXJnZXQuCi0JKiBjb25maWcvaTM4Ni1ic2QubXQ6IG5ldyBmaWxlIC0gMzg2YnNkIHRhcmdldCBjb25maWd1cmF0aW9uLgotCi1UaHUgT2N0ICAxIDE3OjUxOjA3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZS1hcnJhbmdlIGhvc3Qgc2VjdGlvbiB0byB1c2UgKi0qLSogbm90YXRpb24sCi0JY2xlYW4gdXAgc29tZSBvZiB0aGUgdGFyZ2V0IHNlY3Rpb24gYXMgd2VsbAotCi0JKiBzZWNsZXQuYzogY2FzdCByZXN1bHQgb2YgYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyB0bwotCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCi0KLVR1ZSBTZXAgMjkgMTM6MjQ6MDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBDcmVhdGUgc2VjdGlvbiBpZiBpdCBkb2Vzbid0Ci0JYWxyZWFkeSBleGlzdC4KLQotCSogYm91dC5jOiBSZW1vdmVkIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KLQotVHVlIFNlcCAyOSAwODozMDoyMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIFBvcnRhYmlsaXR5IGZpeGVzIGZyb20gcDM6Ci0JY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiByZW1vdmVkIHNhbml0eSBjaGVjayB1bnRpbCBpdAotCXdvcmtzIG9uIGFsbCB0YXJnZXRzIChwZXIgYWR2aWNlIGZyb20gc2FjKS4KLQljb25maWcvaHA5MDAwLm1oOiBuZXcgZmlsZSB0byBkZWZpbmUgVVNHLgotCWhwcGEuYzogI3VuZGVmIGhwcGEgYmVmb3JlIHRoZSBKVU1QX1RBQkxFLgotCWhvc3RzL2hwcGFocHV4Lmg6ICNkZWZpbmUgTkFUSVZFX0hQUEFIUFVYX0NPTVBJTEVSIGlmIG5vdAotCV9fU1REQ19fLgotCXRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KTogaWYgTkFUSVZFX0hQUEFIUFVYX0NPTVBJTEVSLCBtYWtlCi0JbG9jYWwgdmFyaWFibGUgdGFyZ2V0IHZvbGF0aWxlIHRvIGF2b2lkIG15c3RlcmlvdXMgYnVnIGluCi0JSFA5MDAwLzcwMCBjYy4KLQotU2F0IFNlcCAyNiAwMzo1ODo0OSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hwcGFic2QubWgsIGNvbmZpZy5ocHBhaHB1eC5taDogIFJlbW92ZSB2YXJpb3VzIGJvZ29zaXR5LgotCSogaG9zdHMvaHBwYWhwdXguaDogIFJlbW92ZSBiY29weSBhbmQgaW5kZXggY2lyY3VtdmVudGlvbnMuCi0KLUZyaSBTZXAgMjUgMjI6MzY6NTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtejhrLmMgKGZ1bmNfZGEsIGZ1bmNfanIpOiAgTGludC4KLQkqIGNvZmZjb2RlLmg6ICBVc2UgbWVtc2V0IHJhdGhlciB0aGFuIGJ6ZXJvLgotCSogZWxmLmM6ICBVc2UgbWVtY3B5IHJhdGhlciB0aGFuIGJjb3B5LgotCSogdGVraGV4LmM6ICBVc2UgbWVtc2V0IHJhdGhlciB0aGFuIGJ6ZXJvLgotCi1GcmkgU2VwIDI1IDE5OjE0OjQ4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQWRkIEFkb2JlIGEub3V0IHN1cHBvcnQuCi0KLQkqIGFvdXQtYWRvYmUuYzogIE5ldyBmaWxlLiAgU28gZmFyLCBvbmx5IHJlYWRzIGEub3V0LmFkb2JlLiAgRklYTUUuCi0JKiBjb25maWcvYWRvYmUubXQ6ICBBZGQuCi0JKiBjb25maWd1cmUuaW4gKCotYWRvYmUtKiB0YXJnZXQpOiAgQWRkLgotCSogdGFyZ2V0cy5jIChhX291dF9hZG9iZV92ZWMpOiAgQWRkLgotCSogTWFrZWZpbGUuaW46ICBhZGQgYW91dC1hZG9iZS5jLgotCi0JKiBjb25maWd1cmUuaW46ICBQdXQgdHdvIGRhc2hlcyBpbiBhbGwgZW50cmllcyB0byBiZSBtYXRjaGVkLgotCUFkZCBjb21tZW50cyB0byByZW1pbmQgcGVvcGxlIHRvIGRvIHRoaXMuCi0JUmVvcmRlciBhbGwgZW50cmllcyB0aGF0IG1hdGNoIG1hbnVmYWN0dXJlciBuYW1lcywgdG8gb2NjdXIKLQlsYXN0LCBzbyB0aGV5IHdpbGwgb25seSBiZSBtYXRjaGVkIGlmIG5vIG1vcmUgc3BlY2lmaWMgbWF0Y2gKLQlvY2N1cnMuICBSZW1vdmUgbWFudWZhY3R1cmVycyBgYW91dCcsIGBib3V0JywgYGNvZmYnLCBhbmQgYGVsZicuCi0KLUZyaSBTZXAgMjUgMTU6MDM6MjIgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogUmV0dXJuIGJmZF9hYnNfc2VjdGlvbiwgbm90IDAsCi0Jc2luY2Ugd2Ugc2hvdWxkIG5ldmVyIGhhdmUgYSBOVUxMIHNlY3Rpb24uCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBzdF9zaG5keCBkb2Vzbid0IG1hdGNoIGFueSBvZiBvdXIKLQl0ZXN0cywgc2V0IHRoZSBzZWN0aW9uIHRvIGJmZF9hYnNfc2VjdGlvbi4KLQotRnJpIFNlcCAyNSAxMToxMTo1NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi16OGsuYzogZ2V0dGluZyBjbG9zZXIKLQkqIGNvZmZjb2RlLmggKGNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogYWxsb3cKLQlFWFRSQV9DQVNFUyBob29rcyBmb3IgZGlmZmVyZW50IGFyY2hlcyB0byBwcm92aWRlIGRpZmZlcmVudCByZWxvYwotCXR5cGVzLgotCSogc2VjbGV0Lmg6ICNpZm5kZWYgYXJvdW5kIGl0IHRvIGFsbG93IG11bHRpcGxlIGluY2x1c2lvbgotCSogc3JlYy5jOiBtaW5vciBkb2MgZml4Ci0KLU1vbiBTZXAgMjEgMTQ6MzM6NTggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9ocDkwMDAuaCwgaG9zdHMvaXJpeDMuaDogY2hhbmdlcyBmcm9tIFdSUy4KLQotU3VuIFNlcCAyMCAwODo0ODoyNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgVXNlIGkzODYtZWxmIGZvciBhbGwgaTM4Ni9pNDg2IHN5c3Y0IGhvc3RzLCBub3QKLQlqdXN0IG5jci4KLQotVGh1IFNlcCAxNyAwNjo0MDo0NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUpOiBDbGVhciBob3d0byBmaWVsZCBiZWZvcmUKLQlmaWxsaW5nIGluIHJlbG9jLCBpbiBjYXNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBjb2RlIGRvZXNuJ3Qgc2V0Ci0JaXQuCi0KLUZyaSBTZXAgMTEgMTU6Mzc6MDYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBzZXQgdGhlIGxhc3QgcmVudW1iZXJlZAotCXN5bWJvbCBwb2ludGVyIHRvIE5VTEwsIGFzIGV4cGVjdGVkIGJ5IGNvZmZfd3JpdGVfbGluZW51bWJlcnMuCi0JKGNvZmZfd3JpdGVfcmVsb2NzKTogYXBwYXJlbnRseSBhIG5vbi16ZXJvIGFkZGVuZCBpcyBPSyBmb3IgcmVsb2MKLQl0eXBlIFJfSUhDT05TVCB1c2VkIG9uIHRoZSAyOWsuCi0KLVRodSBTZXAgMTAgMTM6Mjg6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBEZXRlcm1pbmUgd2hldGhlciB0byBmZG9wZW4gZm9yCi0JdXBkYXRlLCBiYXNlZCBvbiBob3cgdGhlIHVuZGVybHlpbmcgZmlsZSB3YXMgb3BlbmVkLiAgT2Jzb2xldGVzCi0JRkFTQ0lTVF9GRE9QRU4uCi0JKiBob3N0cy9yczYwMDAuaCwgaG9zdHMvdGFob2UuaCwgaG9zdHMvdmF4YnNkLmg6ICBSZW1vdmUKLQlhbGwgRkFTQ0lTVF9GRE9QRU4gY29uZmlnIGRlZmluZXMuCi0KLVR1ZSBTZXAgIDggMjE6Mzc6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogTW92ZWQgdG8gb3Bjb2RlcyBsaWJyYXJ5LCBub3cgdGhhdCB3ZSBoYXZlIG9uZS4KLQkqIE1ha2VmaWxlOiBEb24ndCBjb21waWxlIGl0LgotCi1UdWUgU2VwICA4IDEwOjEwOjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW91dHguaDogYWRqdXN0X3NpemVzX2FuZF92bWFzIGRpZCBub3QgcmV0dXJuIGFueXRoaW5nLgotCi1UaHUgU2VwICAzIDE5OjI5OjA0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fZmxhZ3MpOiAgUmVtb3ZlIGEgc2FuaXR5IGNoZWNrLgotCUl0IGlzIHVuZm9ydHVuYXRlbHkgYnJva2VuLCBhbmQgcHJldmVudHMgc3RyaXAgZnJvbSB3b3JraW5nLgotCi1UaHUgU2VwICAzIDE2OjE0OjQwIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmMgKGNvbmRyKTogUmVtb3ZlIGV4dHJhbmVvdXMsIGJ1dCBoYXJtbGVzcywgYmFja2xhc2gKLQljcmVhdGVkIGJ5IGxhc3QgY2hhbmdlLgotCi1UaHUgU2VwICAzIDEzOjUyOjM4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fc3RydWN0KTogIE1ha2Ugc2l6ZSBmaWVsZCBiZSB1bnNpZ25lZC4KLQkqIGJmZC1pbi5oOiAgQnVtcCB0byB2ZXJzaW9uIDIuMC4KLQotVGh1IFNlcCAgMyAwOTowNTozNyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBib3V0LmMsIGNwdS16OGsuYzogIFVzZSBlbnVtcyB3aGVuIGluaXRpYWxpemluZyBzdHJ1Y3RzIHRvIGtlZXAKLQlicmFpbmRhbWFnZWQgSFAvQXBvbGxvIGNvbXBpbGVyIGhhcHB5LgotCi1XZWQgU2VwICAyIDAyOjUzOjI5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYzogIEZpeCBkZXNjcmlwdGlvbiBvZiBzZWFyY2ggZm9yIG1hdGNoaW5nIHRhcmdldC4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBTZXQgU0VDX0NPREUgYW5kIFNFQ19EQVRBLgotCSogdGFyZ2V0cy5jOiAgVXBkYXRlIGRlc2NyaXB0aW9uIG9mIHNlYXJjaCBmb3IgbWF0Y2hpbmcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKGRvX2NsZWFuLCBjbGVhbik6ICBGaXggaW5mYW50IG1vcnRhbGl0eSB0eXBvLgotCShkb2NkaXIpOiAgU2V0IHRvIC4vZG9jLCBub3QgJHtzcmNkaXJ9L2RvYywgd2hpY2ggaGFzIG5vIG1ha2VmaWxlLgotCSh6OGsgYW5kIHdlMzJrIGZpbGVzKTogIGAqLm86ICouYyc6IGF2b2lkIFN1biBNYWtlIGJ1Zy4KLQotV2VkIFNlcCAgMiAwMDoyNjozMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgbW9zdGx5Y2xlYW4vY2xlYW4vZGlzdGNsZWFuIHJ1bGVzLgotCi1UdWUgU2VwICAxIDEzOjM4OjQwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgVGFrZSBvdXQgb2FzeXMgKHVubGVzcyB0aGF0IGlzCi0JdGhlIGRlZmF1bHQpOiAgQmVjYXVzZSB0aGVyZSBpcyBubyBtYWdpYyBudW1iZXIgaW4gYXJjaGl2ZXMsCi0JdGhlcmUgY2FuIGJlIGFubm95aW5nIHRhcmdldCBtaXMtbWF0Y2hlcy4KLQotTW9uIEF1ZyAzMSAxMDoxMTozNyAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jOiBSaWdvcm91c2x5IHVwZGF0ZWQgdG8gbWF0Y2ggYXJjaGl0ZWN0dXJlIG1hbnVhbC4KLQotTW9uIEF1ZyAzMSAwODowNzo1OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dDxuPnN3YXBfZXh0X3JlbG9jX291dCksIGJvdXQuYwotCShiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IGZpeCBidWcgMTUwNiB3aGVyZSBhYnMgc3ltYm9scyBhdHRhY2hlZAotCXRvIHRoZSBidWlsdC1pbiBhYnNfc2VjdGlvbiB3ZXJlIG5vdCB3cml0dGVuIG91dCBjb3JyZWN0bHkuCi0KLUZyaSBBdWcgMjggMTY6Mjk6MTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9ic2RfYXJtYXApOiBpZiB0aGUgc3ltZGVmX2NvdW50IGlzIHRvbwotCWxhcmdlLCBhc3N1bWUgd2UncmUgdXNpbmcgYSBzd2FwcGVkIGJ5dGUgb3JkZXIgYW5kIGZhaWwgd2l0aAotCXdyb25nX2Zvcm1hdCByYXRoZXIgdGhhbiBkdW1waW5nIGNvcmUuCi0KLUZyaSBBdWcgMjggMTU6Mzg6MDMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZWQgb3BjLXNwYXJjLmMgdG8gc3BhcmMtb3BjLmMgZm9yIHN5c3RlbXMgd2l0aCBzaG9ydAotCWZpbGVuYW1lIGNvbnN0cmFpbnRzLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgdG8gcmVmbGVjdCBjaGFuZ2UuCi0KLVRodSBBdWcgMjcgMTM6MDU6MjggMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCUFkZCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB0aGUgd2UzMms6Ci0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb2Zmb2NvZGUuaCwgY29uZmlndXJlLmluLCB0YXJnZXRzLmM6Ci0JTWlub3IgZWRpdHMuCi0JKiBjb2ZmLXdlMzJrLmMsIGNwdS13ZTMyay5jLCBjb25maWcvd2UzMmsubXQsIGhvc3RzL3dlMzJrLmg6IE5ldyBmaWxlcy4KLQotV2VkIEF1ZyAyNiAxNDoyMDoxNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jOiBhZGRlZCBzdXBwb3J0IGZvciByZWxheGFibGUgYWxpZ25tZW50IHJlbG9jcy4KLQotCSogc2VjbGV0LmMgKHJlbCwgc2VjbGV0X2R1bXBfc2VjbGV0LCBzZWNsZXRfZHVtcCk6IGdldCB0aGUgYXBwIHRvCi0JcGFzcyBkb3duIHBvaW50ZXIgdG8gcGxheSBhcmVhIHJhdGhlciB0aGFuIHVzZSBhbGxvY2EKLQotCSogY3B1LXo4ay5jIChjb21wYXRpYmxlKTogbWFkZSBzdGF0aWMgdG8gcmVkdWNlIG5hbWUgc3BhY2UKLQlwb2x1dGlvbi4KLQotVHVlIEF1ZyAyNSAwODozOToxMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgICAgICBBZGQgYmFzaWMgc3VwcG9ydCBmb3IgdGhlIHo4azoKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIGNvbmZpZ3VyZS5pbiwgcmVsb2MuYywKLQlzZWN0aW9uLmMsIHRhcmdldHMuYywKLQotCSogc3ltcy5jOiBtb3ZlIG1pcy1pbnNlcnRlZCBwYXRjaC4KLQotRnJpIEF1ZyAxNCAxNTozOToyOSBQRFQgMTk5MiAgSG93YXJkIENodSAgKGh5Y0BoYW5hdW1hLmpwbC5uYXNhLmdvdikKLQotCURvY3VtZW50YXRpb24gZml4ZXM6Ci0JKiBjdG9ycy5jLCBmb3JtYXQuYywgc2VjdGlvbi5jLCByZWxvYy5jOiBhcHBlbmQgIiAtIiB0byBpdGVtIHRhZ3MuCi0JKiByZWxvYy5jLCBzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jOiBhZGQgRE9DREQgYmVmb3JlIEBub2RlCi0JCWNvbW1lbnRzLgotCSogcmVsb2MuYzogYnJlYWsgb3V0IGFkZGVuZCBpdGVtIGZyb20gc3Vycm91bmRpbmcgdGV4dC4KLQotCSogZG9jLnN0ciAoRE9DREQpOiBEZWZpbmVkLiBBZGRzIHRleHQgdG8gb3V0cHV0LgotCShib2R5dGV4dCk6IFB1dCBidWxsZXRpemUgYmVmb3JlIGtpbGxfYm9ndXNfbGluZXMuCi0JKiBjaGV3LmMgKGJ1bGxldGl6ZSk6IEVuZCBpdGVtaXphdGlvbiBhZnRlciBhIGJsYW5rIGxpbmUsIHRvCi0JcHJldmVudCBmb2xsb3dpbmcgdGV4dCBmcm9tIGJlaW5nIHN3YWxsb3dlZCB1cCBpbiBhbiBpdGVtLgotCi1Nb24gQXVnIDI0IDIwOjUwOjIyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBzcGFyY2xpdGUgYXMgYSB0YXJnZXQuCi0KLU1vbiBBdWcgMjQgMTI6MDY6MzEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoaWVlZV9nZXRfc3ltdGFiKTogYWx3YXlzIG51bGwgdGVybWluYXRlIHRoZSBzeW1ib2wgbGlzdCwKLQlsaW50LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBpZiBzeW1ib2xzIGRvbid0IGNvbWUKLQlmcm9tIGEgY29mZiBmaWxlIChjc3ltIGlzIG51bGwpLCBkb250IGRlcmVmIHRoZW0KLQotCSogaWVlZS5jIChwYXJzZV9leHByZXNzaW9uKTogZ2V0IHRoZSBhbnN3ZXIgcmlnaHQgd2hlbiBhZGRpbmcgYW4KLQlhYnMrKHNlYytvZmYpLCAoaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBjYWxsIGllZWVfb2JqZWN0X3AKLQlvbiBlbHRzIHNvIHRoYXQgZmlsZW5hbWUgaXMgZmlsbGVkIGluLgotCi1UaHUgQXVnIDIwIDE5OjA1OjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGhvd3RvX2FsaWduX3RhYmxlKTogTmV3IHNldCBvZiByZWxvY3MsIHdpdGggZW5vdWdoCi0JZGF0YSBmb3IgIm9iamR1bXAgLXIiIHRvIHdvcmsuCi0JKGJfb3V0X3JlbG9jX3R5cGVfbG9va3VwKTogUmVjb2duaXplIGFsaWdubWVudCByZWxvY3MuCi0KLVR1ZSBBdWcgMTggMTI6NTc6NDUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0gCSogTWFrZWZpbGUuaW46IGFkZGVkIEZMQUdTX1RPX1BBU1MsIGFuZCB1c2VkIGl0IGZvciBhbGwgcmVjdXJzaXZlCi0JaW52b2NhdGlvbnMgb2YgbWFrZS4gIEFsc28sIGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uCi0JZGlyZWN0b3JpZXMuCi0KLQkqIGNvbmZpZy9hcG9sbG92NjgubWg6IHJlbW92ZWQgLWcgZnJvbSBDQyBkZWZpbml0aW9uLgotCi1Nb24gQXVnIDE3IDEzOjQwOjA4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVjc3RhdGlvbi5taCAoSERFRklORVMpOiBTcGVjaWZ5ICItRyA0IiB0byBhdm9pZAotCW92ZXJmbG93aW5nIGdwLW9mZnNldCByYW5nZS4KLQotTW9uIEF1ZyAxNyAxMTo0NDoyOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogZG9uJ3Qgd3JpdGUgb3V0IHNlY3Rpb25zCi0Jd2l0aG91dCB0aGUgTE9BRCBhbmQgQUxMT0MgYXR0cmlidXRlcwotCi1Nb24gQXVnIDE3IDExOjU1OjA3IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYywgY3B1LW02OGsuYywgY3B1LXNwYXJjLmM6IFVuZG8gMTYgSnVuZSBjaGFuZ2VzLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBOZXcgY2FsbGJhY2sgInNldF9zaXplcyIuCi0JKiBhb3V0LXRhcmdldC5oIChjYWxsYmFjayk6IERvbid0IHNldCBwYWdlL3NlZyBzaXplcy4KLQkobWtvYmplY3QpOiBEaXR0by4KLQkoc2V0X3NpemVzKTogTmV3IHJvdXRpbmUuCi0JKGJhY2tlbmRfZGF0YSk6IFBvaW50IHRvIGl0LgotCSogYW91dGYxLmggKHN1bm9zNF9zZXRfc2l6ZXMpOiBIZWVkIGFyY2hpdGVjdHVyZSB3aGVuIHNldHRpbmcgc2l6ZXMuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBQb2ludCB0byBpdC4KLQkqIGFvdXR4LmggKHNldF9hcmNoX21hY2gpOiBDYWxsIHNldF9zaXplcyBjYWxsYmFjay4KLQotRnJpIEF1ZyAxNCAxOToyMjoxOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaDogIE1ha2UgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJlCi0JdGhlIGRlZmF1bHQuICBHaXZlbiB0aGF0IHdlICp3cml0ZSogdGhlIHN1Y2tlcnMgKGZvciBsb25nCi0JYXJjaGl2ZSBtZW1iZXIgbmFtZXMpLCB3ZSByZWFsbHkgb3VnaHQgdG8gYmUgYWJsZSB0byByZWFkIHRoZW0hCi0JKiB0cmFkLWNvcmUuYzogIERvbid0IGluY2x1ZGUgPG1hY2hpbmUvcmVnLmg+LiAgSXQgZG9lc24ndAotCXNlZW0gdG8gYmUgbmVlZGVkLCBhbmQgbWFueSBtYWNoaW5lcyBkb24ndCBoYXZlIGl0LgotCi1UaHUgQXVnIDEzIDA5OjUzOjM5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAodmVjdG9yKTogcmVhZCBhbmQgd3JpdGUgYXJjaGl2ZXMgaW4gY29mZiBmb3JtYXQuCi0KLVR1ZSBBdWcgMTEgMTI6MTk6NDIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG9wYy1zcGFyYy5jOiBOZXcgZmlsZS4KLQotU2F0IEF1ZyAgOCAyMzoxNTozNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiZmRfcmVsb2Nfc3RhdHVzX3R5cGUsIGNhbGxqX2NhbGxiYWNrKTogIENhc3Qgdm9pZCoKLQlwb2ludGVycyB0byBiZmRfYnl0ZSogYmVmb3JlIHBlcmZvcm1pbmcgYXJpdGhtZXRpYyBvbiB0aGVtLiAgU3VjaAotCXVzZSB3aXRoIGJhcmUgdm9pZCogcG9pbnRlcnMgaXMgYSBnY2MgZXh0ZW5zaW9uLgotCSogY2FjaGUuYyAoYmZkX2NhY2hlX2RlbGV0ZSk6ICBGb3J3YXJkIGRlY2wgd2l0aCBwcm90b3R5cGUgZm9ybS4KLQkqIGFyY2hpdmUgKG5vcm1hbGl6ZSk6ICBBZGQgdG8gQ09OU1QgdG8gbWF0Y2ggYWN0dWFsIHVzYWdlcyB3aXRoCi0JQ09OU1QuCi0KLU1vbiBBdWcgIDMgMDA6MzU6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBpNDg2IGhvc3QgY3B1LCBhbmQgdXNlIGkzODYtZWxmCi0JZm9yIGk0ODYtbmNyLXN5c3Y0LgotCi1TYXQgQXVnICAxIDEzOjQ5OjU5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3RyYXR1cy5tdCAoQ0MpOiAgUmVtb3ZlIGRlZmluaXRpb24uCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIFRlc3QgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0Ci0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleCByZXR1cm5zIE5VTEwgYW5kIGRvbid0IGRlcmVmZXJlbmNlIGl0LgotCi1Nb24gSnVsIDIwIDAyOjQ2OjA5IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogYWRkIGhwcGFfZGF0YSB0byBiZmQgdGRhdGEgKGluZGlyZWN0bHkgdmlhIHNlZikuCi0KLQkqIGNvbmZpZy9ocHBhaHB1eC5taDogaHB1eCBpcyAtRFVTRyAocGF0Y2ggYnkgc2VmKQotCi1TYXQgSnVsIDE4IDE1OjUwOjExIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIsIG5vdCBzdGRvdXQKLQotRnJpIEp1bCAxNyAxODozMjo0NiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jLCBjYWNoZS5jLCBjb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLAotCSAgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLCBkZW1vNjQuYywgbGliYW91dC5oLCBsaWJiZmQuYywKLQkgIG9hc3lzLmMsIG9wbmNscy5jLCBzdW5vcy5jLCB0YXJnZXRzLmM6IHJlbW92ZWQgcmNzaWQncy4KLQotRnJpIEp1bCAxNyAxNzowNjo1NiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGhwcGEqIGluc3RlYWQgb2YgaHBwYQotCi1UaHUgSnVsIDE2IDE2OjM5OjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYzogYWRkZWQgUl9SRUxMT05HX05FRyByZWxvYyB0eXBlLCBhbmQgY2hhbmdlZAotCVJUWVBFMkhPV1RPIHRvIGNvcGUgd2l0aCBzYW1lLgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IGFkZGVkIHN1cHBvcnQgZm9yIHNpemUgb2YgLTIKLQkoc3VidHJhY3QgYSB3b3JkIHJlbG9jIHR5cGUpLiBVcGRhdGVkIGRvYy4KLQotVGh1IEp1bCAxNiAxNjoyODowOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtZXJnZWQgY2hhbmdlcyBmcm9tIHByb2dyZXNzaXZlLCByZW1vdmVkIHJjc2lkLgotCi0JKiBhcmNodXJlcy5jLCBhcmNoaXZlLmMsIE1ha2VmaWxlLmRvczogcmVtb3ZlZCByY3NpZC4KLQotVGh1IEp1bCAxNiAwODowODoyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggOiBhZGQgQkZEX0lTX1JFTEFYQUJMRSBmbGFnCi0JKiBib3V0LmMgKGJvdXRfc3dhcF9leGVjX2hlYWRlcl9baW5fb3V0XSk6IG5ldyBmaWVsZCBpbiBleGVjCi0JaGVhZGVyIGVfcmVsYXhhYmxlLCBtYWpvciBoYWNrZXJ5IGluIGNhbGxiYWNrcwotCSogbGliYW91dC5oIDogYWRkIHNwYWNlIGZvciBhX3JlbGF4YWJsZS4KLQkqIHNlY2xldC5jIChyZWwpOiBkb24ndCByZWxheCBlbXB0eSBzZWN0aW9ucwotCi0KLVdlZCBKdWwgMTUgMDc6NTc6NDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiBhZGQgc29tZSBjYXN0cyB0byB0aGUgaW5pdGlhbGl6ZXJzIGZvcgotCWR1bWIgY29tcGlsZXJzCi0KLVR1ZSBKdWwgMTQgMTQ6MDY6MjggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgR3JlYXRseSBzaW1wbGlmeSBleHByZXNzaW9uLAotCWFuZCBhZGQgYXBwcm9wcmlhdGUgY2FzdHMgdG8ga2VlcCAocGljYXl1bmUpIGFpeC1jYyBoYXBweS4KLQotTW9uIEp1bCAxMyAwNTowNjo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgTm93IDJuZCBhcmcgaXMgd2hlcmUgdG8gd3JpdGUKLQlzeW1ib2wgcG9pbnRlcnMuICBQdW50IGV4cGVuc2l2ZSAmIHVzZWxlc3MgYmZkX3JlYWxsb2MuICBVc2UKLQltYWxsb2MgZm9yIHJhdyBzeW1ib2xzLCBhbmQgZnJlZSBpdCBiZWZvcmUgcmV0dXJuaW5nLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgRG8gbm90IHNsdXJwIHN5bWJvbCB0YWJsZSB1bnRpbCBwb2xpdGVseQotCWFza2VkLiAJRG8gbm90IGV2ZW4gc2x1cnAgc3RyaW5nIHRhYmxlcy4KLQkoZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiAgQ291bnQgJ2VtIHdpdGhvdXQgcmVhZGluZyB0aGVtLgotCShlbGZfZ2V0X3N5bXRhYik6ICBUaGlzIGlzIGhvdyB0byBwb2xpdGVseSBhc2suICBTY2hsdXJwIQotCVRoaXMgc2hvdWxkIHByb2JhYmx5IGp1c3QgKmJlY29tZSogZWxmX3NsdXJwX3N5bWJvbF90YWJsZSwgRklYTUUuCi0KLVdlZCBKdWwgIDggMTY6MjQ6MzMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogd3JpdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUKLQlhcmNoaXZlIGhlYWRlciB0byBiZSBqdXN0IGEgbGl0dGxlIGJpdCBsYXRlciB0aGFuIHRoZSB0aW1lc3RhbXAgb2YKLQl0aGUgZmlsZSwgb3RoZXJ3aXNlIHRoZSBsaW5rZXIgd2lsbCBjb21wbGFpbiB0aGF0IHRoZSBpbmRleCBpcwotCW91dCBvZiBkYXRlLgotCi1UdWUgSnVsICA3IDAwOjIzOjIzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtNjhrLWVyaWNzc29uLSouCi0KLVNhdCBKdWwgIDQgMDM6Mjk6NDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bXMuaDogIERlZmluZSBCU0ZfRklMRSwgdXBkYXRlIEJTRl9TRUNUSU9OX1NZTSBkZXNjLgotCSogZWxmLmM6ICBSZW1vdmUgdW5jb25kaXRpb25hbCBkZWJ1ZyBwcmludGYncy4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cywgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBIYW5kbGUKLQlCU0ZfU0VDVElPTl9TWU0gPD0+IFNUVF9TRUNUSU9OLCBCU0ZfRklMRSA8PT4gU1RUX0ZJTEUuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgSGFuZCBvdXQgc3ltYm9scyBpbiBmb3J3YXJkLCBub3QKLQlyZXZlcnNlIG9yZGVyLiAgU2ltcGxpZnkgZHVwbGljYXRlIGNvZGUuCi0KLUZyaSBKdWwgIDMgMjA6MjM6MzQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgUmVtb3ZlICIodm9pZCkiIGNhc3RzIGZyb20gZnVuY3Rpb24gY2FsbHMgd2hlcmUgdGhlCi0JcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQsIGluIGFjY29yZGFuY2Ugd2l0aCBHTlUgY29kaW5nIHN0YW5kYXJkcy4KLQotVHVlIEp1biAzMCAxNjo0OToxMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiAgQXBwbHkgSm9obidzIHN0YW5kYXJkIGZpeCB0byBhdm9pZCAiZW1wdHkgdHJhbnNsYXRpb24KLQl1bml0IiB3YXJuaW5ncyBmcm9tIHNvbWUgQU5TSS1DIGNvbXBpbGVycy4KLQotVGh1IEp1biAyNSAwNDozOToyNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc29sYXJpczIuaDogIENvbmZpZ3VyZSBzYW1lIGFzIHN5c3Y0LgotCi1UdWUgSnVuIDIzIDIxOjU0OjQ0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQuaCwgbGliYmZkLWluLmggKGJmZF9zZWVrKTogIE1ha2UgcHJvdG90eXBlIG1hdGNoIGRlZmluaXRpb24uCi0JKiByZWxvYy5jIChiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCk6ICBNYWtlIGNhc3Qgb24gcmV0dXJuCi0JdHlwZSBtYXRjaCBhY3R1YWwgcmV0dXJuIHR5cGUuCi0JKiBlbGZfcHJpbnRfc3ltYm9sIChzZWN0aW9uX25hbWUpOiAgTWFrZSBDT05TVC4KLQotTW9uIEp1biAyMiAxNzozNToyNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMsIGhvc3RzL2kzODZsaW51eC5oLCBjb25maWcvaTM4Ni1saW51eC5tdDoKLQlOZXcgZmlsZXMsIGZvciBMaW51eCAoYSBmcmVlIFVuaXggY2xvbmUgZm9yIDM4NiBtYWNoaW5lcykuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCB0YXJnZXRzLmM6ICBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLUZyaSBKdW4gMTkgMjA6MjM6MjEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0JTGludHMgZm9yIGJmZF9yZWxvY19jb2RlX3R5cGUtPmJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYW5kCi0JY29ycmVjdCBjYWxsaW5nIG9mIGhvd3RvIHNwZWNpYWwgZnVuY3Rpb25zIGFuZCBmaXhlcyBmcm9tIFJhZWJ1cm4KLQlmb3IgZ2FzPD5iZmRuZXNzCi0JKiBhcmNodXJlcy5jOiBudWtlIGJmZF9yZWxvY19jb2RlX3R5cGUKLQkqIGJvdXQuYywgY3B1LWg4MzAwLmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW04OGsuYzogc3BlY2lhbCBmdW5jdGlvbiBsaW50Ci0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IFNUWVBfSU5GTyBpcyBtYXJrZWQgYXMKLQlTRUNfTkVWRVJfTE9BRCwgdmFyaW91cyBvdGhlciBiZmRnYXMgbmV3bmVzcwotCSogcmVsb2MuYy0+bGliYmZkLmg6IGNoYW5nZSBwcm90eXBlIG9mIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0JKiB0YXJnZXRzLmM6IGNoYW5nZSBqdW1wIHRhYmxlIHZlY3RvciB0byBhYm92ZQotCi0KLUZyaSBKdW4gMTkgMTk6MDA6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfZWxmX2ZpbmRfc2VjdGlvbik6ICBNYXJrIGFzIElOVEVSTkFMX0ZVTkNUSU9OIHNvCi0JaXRzIHByb3RvdHlwZSB3aWxsIGJlIGluY2x1ZGVkIGluIGxpYmJmZC5oLiAgQ2hhbmdlIHJlc3VsdCB0eXBlCi0JdG8gc3RydWN0ICogKHJhdGhlciB0aGFuIGVxdWl2YWxlbnQgdHlwZWRlZikgc28gaXQgY2FuIGJlIHVzZWQgaW4KLQl0aGUgcHJvdG90eXBlLCB3aGVyZSB0aGV5IHR5cGVkZWYgd29uJ3QgYmUga25vd24uCi0JKiBsaWJiZmQuaDogIFVwZGF0ZWQgdmVyc2lvbi4KLQotRnJpIEp1biAxOSAxNToyMTo1NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29uZmlndXJlLmluLCBjcHUtaHBwYS5jLCBocHBhLmMsIGxpYmhwcGEuaCwKLQl0YXJnZXRzLmM6ICBIUFBBIG1lcmdlLgotCi1GcmkgSnVuIDE5IDEyOjIxOjM4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBTZXBhcmF0ZSBTb2xhcmlzMiBmcm9tIFNZU1Y0IG9uIFNQQVJDLgotCSogY29uZmlnL3NvbGFyaXMyLm1oOiAgS2x1ZGdlIGFyb3VuZCBTdW4gY29tcGlsZXIgYnVnLgotCi1XZWQgSnVuIDE3IDE0OjAyOjQ2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoYW91dF9iYWNrZW5kX2RhdGEpOiAgQ2hhbmdlIGRlZnMgb2YgdHdvIGJpdGZpZWxkcyB0bwotCWJlIHVuc2lnbmVkIGNoYXJzIGluc3RlYWQgdG8gZ2V0IGFyb3VuZCByczYwMDAgY29tcGlsZXIgcHJvYmxlbS4KLQotV2VkIEp1biAxNyAxMzo1NTozMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6Ci0JQ29ycmVjdCBtaXNjb25jZXB0aW9uIHRoYXQgdGhlcmUgY2FuIGJlIG9ubHkgb25lIHN5bWJvbCB0YWJsZS4KLQlPbmx5IGNhbGwgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSBvbiB0aGUgZnVsbCBzeW1ib2wgdGFibGUsIG5vdAotCXRoZSBkeW5hbWljIG9uZSB3aGljaCBpcyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBmdWxsIG9uZS4KLQotV2VkIEp1biAxNyAxNTo1NDo1NyAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3IgSTk2MCwKLQlkb24ndCBhbGlnbiBzZWN0aW9ucyBpbiBmaWxlLgotCi1UdWUgSnVuIDE2IDA2OjI4OjIxIDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiB0YXJnZXRzLmMgKHN0cnVjdCBiZmRfdGFyZ2V0KTogQWRkZWQgZmllbGQgZm9yIHRhcmdldC1zcGVjaWZpYwotCShidXQgbm90IGZpbGUtc3BlY2lmaWMpIGRhdGEsIGZvciBkaXN0aW5ndWlzaGluZyBtaW5vcgotCWNoYXJhY3RlcmlzdGljcyBiZXR3ZWVuIChlLmcuKSBhLm91dCBmb3JtYXRzLgotCi0JKiBzZWN0aW9uLmMgKHN0cnVjdCBzZWMpOiBOZXcgZmllbGQgdXNlcl9zZXRfdm1hIGluZGljYXRlcyB2bWEKLQlmaWVsZCBzaG91bGQgYmUgaGVlZGVkLCBub3QgYXNzdW1lZCB0byBiZSB1bnNldC4KLQkoU1REX1NFQ1RJT04pOiBJbml0aWFsaXplIHRoYXQgZmllbGQgb2Ygc3RhbmRhcmQgc2VjdGlvbnMgdG8gemVyby4KLQkqIGJmZC1pbi5oIChiZmRfc2V0X3NlY3Rpb25fdm1hKTogU2V0IHVzZXJfc2V0X3ZtYSB0byB0cnVlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IFdyaXRlIG91dCBzd2FwcGVkIHJlbG9jLCBub3QKLQlwcmUtc3dhcHBlZCB2ZXJzaW9uLgotCi0JKiBhcmNodXJlcy5jIChzdHJ1Y3QgYmZkX2FyY2hfaW5mbyk6IEZpeGVkIG9yZGVyIG9mIGNvbW1lbnQgYW5kCi0JZmllbGQgZGVjbC4gIE5ldyBmaWVsZHMgaW5kaWNhdGUgc2l6ZSBvZiBwYWdlIGFuZCBzZWdtZW50IGZvcgotCWFyY2hpdGVjdHVyZS4KLQkqIGNwdS1tNjhrLmMgKE4pOiBGaWxsIGluIHZhbHVlcy4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogRGl0dG8uCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogVmFyaW91cyBiaXRzIG9mIGRhdGEgKG5vdAotCWFsbCB1c2VkIGN1cnJlbnRseSkgd2l0aCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYS5vdXQgaW1wbGVtZW50YXRpb24uCi0JSW1wb3J0YW50IGZpZWxkIGZvciBub3cgaXMgdGV4dF9pbmNsdWRlc19oZWFkZXIsIGluZGljYXRpbmcgdGhhdAotCXRoZSB0ZXh0IHNlY3Rpb24gc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGhlYWRlciwgd2hpY2gKLQlnZXRzIG1hcHBlZCBpbiB3aXRoIGl0LgotCShzdHJ1Y3QgYW91dF9kYXRhKTogTmV3IGZpZWxkcyBpbmRpY2F0ZSB3aGV0aGVyIHZtYSBoYXMgYmVlbgotCWFkanVzdGVkIHlldCAobm90IHlldCB1c2VkKSwgYW5kIHdoYXQgbWFnaWMgbnVtYmVyIHdpbGwgYmUgdXNlZCBpbgotCXRoZSBvdXRwdXQgZmlsZSAoc2hvdWxkIGdvIGF3YXkgaW4gZmF2b3Igb2Ygdm1hX2FkanVzdGVkKS4KLQkoV1JJVEVfSEVBREVSUyk6IENvZGUgZm9yIGRlYWxpbmcgd2l0aCBzZWN0aW9uIHNpemVzIGFuZCByZWxhdGVkCi0JaGVhZGVyIGZpZWxkcyByZXBsYWNlZCB3aXRoIGNhbGwgdG8gYWRqdXN0X3NpemVzX2FuZF92bWFzLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogRmlsbCBpbiBtYWdpYyBudW1iZXIgZmllbGQuCi0JU2V0IFdQX1RFWFQgZmxhZyBmb3IgWk1BR0lDIGFzIHdlbGwgYXMgTk1BR0lDIGZpbGVzLgotCShzZXRfYXJjaF9tYWNoKTogU2V0IHBhZ2Ugc2l6ZSBhbmQgc2VnbWVudCBzaXplIG9uY2UgQ1BVCi0JdHlwZSBpcyBrbm93bi4KLQkoYWRqdXN0X3NpemVzX2FuZF92bWFzKTogTmV3IGZ1bmN0aW9uOyBoYXMgbXVjaCBjb2RlIG1vdmVkCi0JZnJvbSBzZXRfc2VjdGlvbl9jb250ZW50cyBhbmQgV1JJVEVfSEVBREVSUy4gIFNldHMgb3IgYWRqdXN0cyB2bWEKLQlhbmQgc2l6ZSBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIG1hbnkgaGVhZGVyIGZpZWxkcywgYWZ0ZXIgZGVjaWRpbmcKLQlvbiBtYWdpYyBudW1iZXIgZm9yIG91dHB1dCBmaWxlLiAgQ2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoaXMKLQlhZGp1c3RtZW50IGhhcyBvbmx5IGJlZW4gZG9uZSBvbmNlLgotCShzZXRfc2VjdGlvbl9jb250ZW50cyk6IENhbGwgYWRqdXN0X3NpemVzX2FuZF92bWFzIGluc3RlYWQgb2YKLQlkb2luZyBtdWNoIG9mIHRoZSB3b3JrIGhlcmUuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX21ha2VfZGVidWdfc3ltYm9sLCBNWV9iYWNrZW5kX2RhdGEpOiBQcm92aWRlCi0JZGVmYXVsdCAobnVsbCkgdmFsdWVzIG9mIHRoZXNlIGZpZWxkcy4KLQkqIGFvdXRmMS5oIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgb3ZlcnJpZGUgYV90ZXh0Ci0JdmFsdWUgaW4gZXhlYyBoZWFkZXIuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQsIE1ZX2JhY2tlbmRfZGF0YSk6IERlZmluZSBiYWNrZW5kIGRhdGEKLQlpbmRpY2F0aW5nIGZpbGUgaGVhZGVyIGlzIGluY2x1ZGVkIGluIHRleHQgc2VjdGlvbi4KLQotCSogYW91dGYxLmggKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRml4IHR5cG8uCi0KLQkqIGhvc3RzL3NwYXJjLmggKGFib3J0LCBleGl0KTogSGlkZSB0aGVzZSBuYW1lcyBpZiBjb21waWxpbmcgd2l0aAotCWdjYyB2ZXJzaW9uIDIsIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1Nb24gSnVuIDE1IDEyOjI2OjU2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbmNyMzAwMC5taCAoSU5TVEFMTCwgUkFOTElCKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAotCWl0J3MgYnJva2VuIG9uIG5jciAzMDAwJ3MuICBVc2Ugc2ltcGxlICJ0cnVlIiBmb3IgUkFOTElCLgotCi1TYXQgSnVuIDEzIDA5OjE2OjQzIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4MFswMTIzNF0wLXdycy0qKTogRml4IHR5cG8gaW4gbWF0Y2ggcGF0dGVybi4KLQotRnJpIEp1biAxMiAxOTo0ODozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6ICBSZW1vdmUgZXh0cmEgc2VtaWNvbG9uIGluIGRlY2xhcmF0aW9ucy4KLQkqIGNvbmZpZ3VyZS5pbjogIFJld3JpdGUgdGFyZ2V0IHBhcnNpbmcgdG8gdXNlIHNpbXBsZSBmb3JtYXQuCi0JSGFuZGxlIHNwYXJjLXN1bi1zb2xhcmlzMiBjb25maWd1cmF0aW9uLgotCSogYW91dDY0Lmg6ICBBdm9pZCBBTlNJIEMgYnJhaW4gZGVhdGggd2FybmluZy4KLQkqIGVsZi5jOiAgQXZvaWQgdHJpZ3JhcGggKD8/Pykgb3IgLyogaW4gY29tbWVudHMuCi0KLUZyaSBKdW4gMTIgMTQ6NTE6MTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc3lzdjQubWg6IG5ldyBmaWxlLCBSQU5MSUI9ZWNobwotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSBTb2xhcmlzMiBhcyAtc3lzdjQgb3IgLXNvbGFyaXMyCi0KLVRodSBKdW4gMTEgMDA6NTI6MDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfb2JqX3RkYXRhKTogIE1lcmdlIGVsZl9vYmpfdGRhdGFfc3RydWN0IGFuZAotCWVsZl9jb3JlX3RkYXRhX3N0cnVjdCBpbnRvIGEgc2luZ2xlIGNvbW1vbiBzdHJ1Y3QuICBDb3JlIGZpbGVzCi0Jd291bGRuJ3QgaGF2ZSB3b3JrZWQgYXQgYWxsIHdpdGhvdXQgdGhpcy4KLQkoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiAgTmV3IGZ1bmN0aW9uIGZvciBHREIncyB1bmRlcmNvdmVyIHVzZQotCXRvIGZpbmQgc3RyaW5nIHNlY3Rpb25zIHRoYXQgQkZEIGhpZGVzIGZyb20gaXQuCi0JKGVsZl9nZXRfc3RyX3NlY3Rpb24pOiAgQXZvaWQgbXVsdGlwbGUgYWxsb2MmcmVhZHMgZm9yIHNhbWUgZGF0YTsKLQlsaW50LgotCShlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBBbGxvY2F0ZSBpbnRlcm5hbCBmaWxlIGhlYWRlcgotCXN0b3JhZ2UgZHluYW1pY2FsbHkuCi0JKiBiZmQuYyAodW5pb24gey4uLn0gdGRhdGEpOiAgUmVtb3ZlIGVsZl9jb3JlX3RkYXRhX3N0cnVjdC4KLQkqIGRlbW82NC5jOiAgUHJldmVudCAiZW1wdHkgdHJhbnNsYXRpb24gdW5pdCIgd2FybmluZ3MgZnJvbSBpZGlvdHMuCi0KLVR1ZSBKdW4gIDkgMTc6MTU6MjYgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97aTM4NnY0Lm1oLCBuY3IzMDAwLm1ofTogIFVwZGF0ZSBSQU5MSUIsIGFkZCBJTlNUQUxMLgotCi1TYXQgSnVuICA2IDE3OjAyOjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgU29sYXJpczIgYXMgKi1zdW4tc3lzdjQgb3IgYXMgKi1zdW4tc3Vub3M1LgotCi1TdW4gTWF5IDMxIDA1OjQ1OjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIG02ODBbMDEyMzRdMCBhcyBhbGlhc2VzIGZvciBtNjhrCi0KLVR1ZSBNYXkgMjYgMTY6NTA6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jOiBkbyBieXRlIHJlbG9jcyBjb3JyZWN0bHkKLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogbmV2ZXIgbG9hZCBJTkZPIHNlY3Rpb25zCi0JKiBzZWNsZXQuYyAocmVsKTogZG9uJ3QgcmVsb2NhdGUgSU5GTyBzZWN0aW9ucwotCi1XZWQgTWF5IDIwIDA4OjE4OjE4IDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiBzZWN0aW9uLmMgKGJmZF8qX3N5bWJvbCwgYmZkXypfc2VjdGlvbik6IEluaXRpYWxpemUgc3RhdGljYWxseS4KLQlNYWtlIHRoZSBzeW1ib2xzIHVubW9kaWZpYWJsZS4KLQkoYmZkX3NlY3Rpb25faW5pdCk6IERlbGV0ZWQuCi0JKiBpbml0LmMgKGJmZF9pbml0KTogRG9uJ3QgY2FsbCBiZmRfc2VjdGlvbl9pbml0LgotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEVuc3VyZSB0aGF0IHJhbmdlIHRvIGJlCi0Jd3JpdHRlbiBpcyB3aXRoaW4gc2VjdGlvbiBib3VuZGFyaWVzLgotCShiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4gIERvbid0IGJvdGhlciBkaXNwYXRjaGluZyBpZgotCXNpemUgaXMgemVyby4KLQotCSogbGliYmZkLmMgKGJmZF94bWFsbG9jKTogVGV4dCBvZiBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBjb25zdC4KLQotCSogY29mZi1pOTYwLmMgKGhvd3RvX3RhYmxlKTogRGVsZXRlZC4KLQkoaG93dG9fcmVsbG9uZywgaG93dG9faXBybWVkLCBob3d0b19vcHRjYWxsKTogTmV3IHZhcnM7Ci0JaW50ZXJlc3RpbmcgZW50cmllcyBmcm9tIG9sZCBob3d0b190YWJsZS4KLQkoUlRZUEUySE9XVE8pOiBBZGp1c3RlZCB0byB1c2Ugc3dpdGNoLgotCShjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IEFsbG9jYXRlIHN0b3JhZ2UgZm9yIGF1eAotCXJlY29yZHMgZm9yIHNlY3Rpb24gc3ltYm9sLgotCShtYWtlX2Fic19zZWN0aW9uKTogVW51c2VkOyBkZWxldGVkLgotCShyZW51bWJlcl9zeW1ib2xzKTogUmUtb3JkZXIgc3ltYm9scyBzbyB1bmRlZmluZWQgc3ltYm9scyBjb21lCi0JbGFzdCwgYXMgQ09GRiBmb3JtYXQgZGVzaXJlcy4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBQdXQgQ19GSUxFIHN5bWJvbHMgaW4gZGVidWcgc2VjdGlvbiBhbHdheXMuCi0JKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBOZXcgZnVuY3Rpb247IGNyZWF0ZXMgYSBzeW1ib2wgd2l0aCB0aGUKLQlzYW1lIG5hbWUgYXMgYSBzZWN0aW9uLCBhbmQgc2V0cyB1cCBhdXggcmVjb3JkcyBmb3IgaXQuCi0JKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IE5ldyBmdW5jdGlvbjsgYWRkcyBzZWN0aW9uIHN5bWJvbHMgdG8KLQlzeW1ib2wgdGFibGUgaWYgdGhleSBhcmVuJ3QgdGhlcmUgYWxyZWFkeS4gIFNob3VsZCBzb21lZGF5IGFsc28KLQlhZGQgYSBkdW1teSBDX0ZJTEUgc3ltYm9sIGlmIG5vbmUgaXMgcHJlc2VudC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBBZGQgbWlzc2luZyBzeW1ib2xzIGJlZm9yZSBwcmVwYXJpbmcKLQlzeW1ib2wgdGFibGUgdG8gYmUgd3JpdHRlbi4KLQkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFZlcmlmeSB0aGF0IHN5bWJvbCBpbmRpY2VzIHJlYWQgaW4gYXJlCi0JaW4gYSByZWFzb25hYmxlIHJhbmdlLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl90ZGF0YSk6IE5ldyBmaWVsZCBjb252X3RhYmxlX3NpemUuCi0JKG9ial9jb252X3RhYmxlX3NpemUpOiBBY2Nlc3NvciBtYWNyby4KLQotCSogYm91dC5jIChiX291dF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4gIEhhbmRsZXMgdGhyZWUKLQlyZWxvYyB0eXBlcyBvbiBpOTYwLgotCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9zZWN0aW9uX25hbWUpOiBOZXcgbWFjcm8uICBMaWtlCi0JYmZkX3NlY3Rpb25fbmFtZSwgYnV0IHJldHVybnMgcnZhbHVlLCBub3QgbHZhbHVlLgotCShiZmRfZ2V0X3NlY3Rpb25fdm1hLCBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KTogU2ltaWxhci4KLQkoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKTogTm93IHJldHVybnMgcnZhbHVlLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGQgc2V2ZXJhbCBuZXcgdmFsdWVzLCBzb21lCi0JZ2VuZXJhbCwgc29tZSBzcGVjaWZpYyB0byBzcGFyYyBvciBpOTYwLgotCi0JKiBhb3V0eC5oIChzZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldCBWTUEgZm9yIGVhY2ggc2VjdGlvbiBiYXNlZAotCW9uIHByZXZpb3VzIHNlY3Rpb24uICBJZiB0ZXh0IHNlY3Rpb24gVk1BIGRvZXNuJ3QgYXBwZWFyIHRvIGhhdmUKLQliZWVuIHNldCwgbWFrZSBhIGJlc3QgZ3Vlc3MgZnJvbSB0aGUgdHlwZSBvZiBmaWxlLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IERlZmluZSBhcyB6ZXJvIGlmCi0Jbm90IGRlZmluZWQuCi0JKE1ZKHZlYykpOiBJbml0aWFsaXplIHJlbG9jX3R5cGVfbG9va3VwIGZpZWxkLgotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV8qKTogRXhwb3J0IGFzIGFvdXRfI18qX2hvd3RvX3RhYmxlLgotCShiZmRfZXJyb3JfdHJhcCwgYmZkX2Vycm9yX3ZlY3Rvcik6IEV4dGVybiwgbm90IGNvbW1vbi4KLQotCSogYW91dGYxLmggKHN1bm9zNF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4gIEhhbmRsZXMgYQotCWZldyB0eXBlcyBvZiByZWxvY3MgZm9yIHNwYXJjOyB3aWxsIG5lZWQgZW5oYW5jZW1lbnQuCi0KLQkqIGJvdXQuYyAoY2FsbGpfY2FsbGJhY2spOiBVc2UgREVGVU4gbWFjcm8gaW4gZGVmaW5pdGlvbi4KLQkqIGNvZmYtaTk2MC5jIChvcHRjYWxsX2NhbGxiYWNrKTogTGlrZXdpc2UuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZGVkIGZpZWxkcyByZWxvY190eXBlX2xvb2t1cCBhbmQKLQlfYmZkX21ha2VfZGVidWdfc3ltYm9sLiAgQWxzbyBtaW5vciBjb21tZW50IGNoYW5nZXMuCi0JKiBzeW1zLmMgKGJmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IE5ldyBkaXNwYXRjaGluZyBtYWNyby4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY190eXBlX2xvb2t1cCk6IFRha2UgYSBCRkQgcHRyIGFzIGFyZyByYXRoZXIKLQl0aGFuIGFyY2ggaW5mbywgYW5kIGRpc3BhdGNoIHdpdGggQkZEX1NFTkQuICBDYWxsZXJzIGNoYW5nZWQuCi0JKiBhcmNodXJlcy5jIChzdHJ1Y3QgYmZkX2FyY2hfaW5mbyk6IERlbGV0ZWQgZmllbGQKLQlyZWxvY190eXBlX2xvb2t1cC4KLQkqIGNwdS0qLmM6IERvbid0IGluaXRpYWxpemUgdGhhdCBmaWVsZC4KLQotCSogYmZkLWluLmggKGVudW0gYmZkX2Vycm9yKTogQWRkIG5ldyB2YWx1ZSAiYmFkX3ZhbHVlIi4KLQkqIGJmZC5jIChiZmRfZXJybXNncyk6IE5vdyBjb25zdDsgYWRkZWQgZW50cnkgZm9yIGJhZF92YWx1ZS4KLQkoYmZkX2Vycm1zZyk6IE5vdyByZXR1cm5zIHB0ciB0byBjb25zdC4KLQkqIGJmZC1pbi5oIChiZmRfZXJybXNnKTogRml4IHByb3RvdHlwZS4KLQotCSogY2FjaGUuYyAoQkZEX0NBQ0hFX01BWF9PUEVOKTogRml4IHR5cG8gaW4gZG9jLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbik6IERpdHRvLgotCi0JKiBzZWN0aW9uLmMgKFNlY3Rpb24gT3V0cHV0IGRvYyk6IEltcHJvdmUgZGVzY3JpcHRpb24gb2YgdXNlIG9mCi0Jb3V0cHV0X3NlY3Rpb24gYW5kIG91dHB1dF9vZmZzZXQuCi0KLVR1ZSBNYXkgMTkgMjM6NDI6MTAgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBzY28tY29yZS5jOiBuZXcgZmlsZSBmcm9tIG5ldC4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogYnVnZml4IGZyb20gbmV0OgotCSAgTm93IHdlIGhhdmUgdGhlIGhhaXJ5IGxpbmtlciwgaXQncyBwb3NzaWJsZSB0byBtb3ZlIHN5bWJvbHMgZnJvbQotCSAgb25lIHNlY3Rpb24gaW50byBhbm90aGVyLiAgQWN0dWFsbHkgbWFrZSB0aGF0IHdvcmshCi0KLVNhdCBNYXkgMTYgMTc6NTc6NTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IGZpeCBkZWNsYXJhdGlvbiBvZiBmcmVlLgotCi1UdWUgTWF5IDEyIDE0OjA4OjU5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYyAocGVyZm9ybV9yZWxvYyk6IGZpeCBidWcgaW4gam1wL2NhbGwgZXZhbHVhdGlvbgotCSogY29mZi1oODMwMC5jIChyZWxvY19wcm9jZXNzaW5nKTogYWxsIHJlbG9jcyBhcmUgcmVsYXRpdmUgdG8KLQlzZWN0aW9uIHN0YXJ0LgotCSogb3BuY2xzLmM6IGRvbid0IHVzZSBmZG9wZW4gb24gRE9TIHN5c3RlbXMKLQotCXNob3J0IHBhdGNoZXMgZnJvbSBHbGVubiBLYXN0ZW4gKGdsZW5uQHJlYWR5LmNvbSkKLQkqIHRhcmdldC5jOiBlbmFibGVkIG9hc3lzIHN1cHBvcnQKLQkqIG9hc3lzLmM6ICBJbnNlcnQgLiB3aGVuIFVOREVSU0NPUkVfSEFDSyBpcyBlbmFibGVkLAotCWZpeCBwcm9ibGVtIHdoZXJlIGEgcmVsb2NhdGlvbiB3aGljaCBjcm9zc2VkIGEgbW9kaWZpY2F0aW9uIGJ5dGUKLQlib3VuZGFyeSBkaWQgbm90IHdvcmsuIEZpeCBwcm9ibGVtIHdoZXJlIGEgcmVsb2NhdGlvbiBuZWFyIHRoZSBlbmQKLQlvZiBhIGRhdGEgcmVjb3JkIGRpZCBub3Qgd29yay4KLQotCi1UdWUgTWF5ICA1IDE4OjExOjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9jb2ZmX2FybWFwKTogb2xkIHZlcnNpb25zIG9mIEJGRCB3cm90ZQotCWFyY2h2aWUgaGVhZGVyIHN0cmluZyBjb3VudHMgdGhlIGVuZGlhbiB3YXksIHRoaXMgaGV1cmlzdGljIHNlZXMKLQlob3cgYmlnIGFuIGFyY2hpdmUgc3RyaW5nIHRvIHJlYWQgYnkgdHJ5aW5nIGl0IG9uZSB3YXkgYW5kIGlmIHRoZQotCXN0cmluZyB0YWJsZSBpcyB1bnJlYXNvbmFibHkgYmlnLCB0cnlpbmcgaXQgdGhlIG90aGVyLiAqRklYTUUqLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogY2FuJ3QgZG8gZmRvcGVucyBvbiBWTVMKLQotVHVlIE1heSAgNSAxNDoxODoyNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiAgSW5jcmVhc2UgdmVyc2lvbiBudW1iZXIgdG8gMS45NywgZm9yIGNvbnNpc3RlbmN5Ci0Jd2l0aCAuLi9iaW51dGlscy4KLQkqIE1ha2VmaWxlLmluOiAgZG9jZGlyIGlzIC4vZG9jLCBub3QgJHtzcmNkaXJ9L2RvYy4KLQotTW9uIE1heSAgNCAxMTo0OToxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGJmZC1pbi5oOiBidW1wIHZlcnNpb24gdG8gMS45NgotICAgICAgICAgTWFqb3IgY2hhbmdlOyBjaGFuZ2VkIGNhbGxpbmcgY29udmVudGlvbiBmb3IKLQkgYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBzbyB0aGF0IGNhbGxlciBhbGxvY2F0ZXMKLQkgbWVtb3J5IGZvciBzZWN0aW9uIGRhdGEuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLCByZWxvYy5jLAotCXNlY2xldC5jLCB0YXJnZXRzLmMsIGJmZC5jOiByZWZsZWN0IG5ldyBjb252ZW50aW9uLgotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBpZiBzdHlwX2ZsYWdzIGlzIG5vdCBhIHNwZWNpYWwKLQljYXNlLCB0aGVuIHVzZSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzIGZvciBTRUNfKiBmbGFncy4KLQotRnJpIE1heSAgMSAxMjo1ODozNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiB1c2UgUkVMU1ogdG8gd29yayBvdXQKLQlzaXplIG9mIG91dHB1dCByZWxvYyBzdHJ1Y3QuCi0JKiB0YXJnZXRzLmMsIE1ha2VmaWxlLmluOiBjb21tZW50IG91dCB0ZWtoZXggZm9yIHRoZSBtb21lbnQuCi0JKiBpZWVlLmM6IGlmIHNvbWUgcGxhY2VzIHdoZXJlIG51bGwgcG9pbnRlcnMgd2VyZSB1c2VkIGluc3RlYWQgb2YgJmJmZF9hYnNfc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbjogdGFuZGVtIHRhcmdldCBpcyBzdDIwMDAKLQkqIGNvZmYtbTY4ay5jOiByZW5hbWUgc3RhdGljIGhvd3RvX3RhYmxlIHRvIGdsb2JhbAotCW02OGtjb2ZmX2hvd3RvX3RhYmxlLgotCSogYm91dC5jOiByZW1vdmUgdW5uZWNlc3NhcnkgYWJvcnQKLQkqIGNvZmYtYTI5ay5jOiB2YXJpb3VzIGNoYW5nZXMgdG8gdGhlIHdheSByZWxvY2F0aW9ucyB3b3JrIHRvIGNvcGUKLQl3aXRoIHRoZSAibmV3IG9yZGVyIiBhbmQgbGF0ZW50IGJ1Z3MuCi0JKiBjb2ZmY29kZS5oOiBsaW50Ci0KLVdlZCBBcHIgMjkgMTI6Mzc6MDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfc3dhcF9leHRfcmVsb2Nfb3V0LCBhb3V0X3N3YXBfc3RkX3JlbG9jX291dCkKLQlib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogdHJlYXQgYWJzIHN1bWJvbHMgdGhlIHJpZ2h0IHdheS4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtLXJlbG9jYXRpb24pOiBkb24ndCByZWxvY2F0ZSByZWZzIHRvCi0JYWJzb2x1dGUgc3ltYm9scyBpZiBkb2luZyBhIHBhcnRpYWwgbGluay4KLQotRnJpIEFwciAyNCAwNzozNToyNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgYTI5ay1hbWQtdWRpLgotCi1UaHUgQXByIDIzIDE4OjM3OjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0XzxiaXRzPl9zd2FwX2V4ZWNfaGVhZGVyX2luKTogIFplcm8gb3V0IHRoZQotCWludGVybmFsX2V4ZWMgc3RydWN0dXJlIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIGZpZWxkcyB0aGF0Ci0JYXJlIHVzZWQsIHNvIHRoYXQgdGhlIHVudXNlZCBmaWVsZHMgYXJlIGluIGEga25vd24gc3RhdGUuCi0KLVdlZCBBcHIgMjIgMDk6MzY6MDggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHRla2hleC5jIChzdHJ1Y3QgZGF0YV9zdHJ1Y3QpOiAgQ29udmVydCBmcm9tIHR5cGVkZWYgdGhhdAotCXR5cGVkZWZzIG5vdGhpbmcgdG8gYSBub3JtYWwgc3RydWN0dXJlIGRlY2xhcmF0aW9uLgotCSogdGVraGV4LmMgKHBhc3Nfb3Zlcik6ICBQcm90b3R5cGUgYXJncyBmb3IgZnVuY3Rpb24gdGhhdAotCXNlY29uZCBhcmcgcG9pbnRzIHRvLgotCi1Nb24gQXByIDIwIDIyOjIyOjUxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBvbGQgc3R5bGUgc3RhZ2luZy4gIERvIG5vdCBwcmludCByZWN1cnNpb24KLQkgIGxpbmVzLgotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IENGTEFHUyBjYW4gYmUgcGFzc2VkIGZyb20gdGhlCi0JICBNYWtlZmlsZSBjb21tYW5kIGxpbmUuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCSAgUGFzcyBDRkxBR1MuCi0KLUZyaSBBcHIgMTcgMDk6MTU6MzEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jLCBNYWtlZmlsZS5pbjogYWRkZWQgdGVraGV4Ci0JKiBhb3V0eC5oIChzZXRfc2VjdGlvbl9jb250ZW50cyk6IHBhZ2VzIHNob3VsZCBiZSBwYWRkZWQgdG8gdGhlCi0Jc2l6ZSBvZiBhIHBhZ2UsIG5vdCB0aGUgc2l6ZSBvZiBhIHNlZ21lbnQuCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGdvMzIgaG9zdCBhbmQgaTM4Ni1hb3V0IHRhcmdldC4KLQkqIGkzODZhb3V0LmMsIGxpYmFvdXQuaDogbm93IHdvcmtzIGZvciBnbzMyIHRhcmdldAotCSogaWVlZS5jOiBmaXggYml0IHJvdC4KLQkqIHNlY2xldC5jOiBzdXBwb3J0IGZvciBwYWRkaW5nIHNlY2xldCB0eXBlLgotCi1XZWQgQXByIDE1IDE4OjExOjU4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC5OT0VYUE9SVDoKLQotVHVlIEFwciAxNCAxNDozNDo0MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9hZGRfc3RydGFiLCBiZmRfYWRkXzJfdG9fc3RydGFiKTogIENPTlNUIHNwcmVhZHMKLQlsaWtlIG9vemUuCi0JKiBlbGYuYyAoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLQllbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIFJldHVybiBib29sZWFuLCBub3QgTlVMTCAod2hpY2gKLQljYW4gYmUgdm9pZCAqKS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgSWZkZWYtb3V0IGRlYnVnZ2luZyBjb2RlLgotCUFsc28gaWZkZWYtb3V0IGNvZGUgdGhhdCBhYm9ydHMgb24gdW5oYW5kbGVkIHNlY3Rpb24gdHlwZXMuCi0KLUZyaSBBcHIgMTAgMjI6Mjk6MTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuY3IzMDAwIGNvbmZpZwotCSogTWFrZWZpbGUuaW4gKE1JTlVTX0cpOiAgUGFzcyBvbiB0byByZWN1cnNpdmUgbWFrZXMuCi0JKiBob3N0cy9uY3IzMDAwLmgsIGNvbmZpZy9uY3IzMDAwLm1oOiAgQWRkIGhvc3QgY29uZmlnIGZpbGVzLgotCi1UaHUgQXByICAyIDE3OjQyOjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE5vdyB0aGF0IHdlIGhhdmUgc3ltLmggYW5kIHN5bWNvbnN0LmgsIGNvbXBpbGUKLQljb2ZmLW1zeW0uYyBvbiBhbGwgc3lzdGVtcy4KLQkqIGNvbmZpZy97ZGVjc3RhdGlvbi5taCwgaXJpeDMubWgsIGlyaXg0Lm1ofTogIFJlbW92ZSBjb2ZmLW1zeW0ubyBkZXAuCi0JKiBjb2ZmLW1zeW0uYzogIFVwZGF0ZSBpbmNsdWRlIGZpbGVzIGFuZCBjb21tZW50czsgYWRkIHdlYWtleHQgYml0LgotCi1XZWQgQXByICAxIDIzOjE2OjM4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMsIGJmZC5jLCBib3V0LmMsIGNvZmZjb2RlLmgsIGluaXQuYywgcmVsb2MuYywKLQlzZWN0aW9uLmMsIHNyZWMuYywgc3ltcy5jLCBjb2ZmLWg4MzAwLmM6ICBMaW50LgotCi1TdW4gTWFyIDI5IDA5OjM3OjU5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBib3V0LmMsIGNvZmYtYTI5ay5jLCBjb2ZmLWk5NjAuYzogIExpbnQuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbmV3IGhvc3QgYW5kIHRhcmdldCBjb25maWdzLgotCSogZWxmLmMgKGJmZF9wcnN0YXR1cywgYmZkX2ZwcmVnc2V0KTogIEF2b2lkIHR5cGVuYW1lIG9mIHJlZ2lzdGVyCi0Jc3RydWN0cywgd2hpY2ggdmFyeTsganVzdCB1c2UgbWVtYmVyIG5hbWUuCi0JKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIExpbnQsIGZpeCBjb21tZW50cy4KLQkqIGNvbmZpZy9zcGFyYy1lbGYubXQsIGhvc3RzL3N5c3Y0Lmg6ICBOZXcgY29uZmlnIGZpbGVzLgotCi1TYXQgTWFyIDI4IDEzOjA3OjAyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgRml4IHRvIHVzZSBvbmx5IGEgc2luZ2xlCi0JbG9jYWwsIGRpc3Bvc2FibGUsIGNvcHkgb2YgdGhlIGV4dGVybmFsIGZvcm0gb2Ygc2VjdGlvbiBoZWFkZXIKLQl0YWJsZSBhbmQgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcy4KLQotVGh1IE1hciAyNiAxNjo1OTo1OCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBTZXQgTUlOSU1JWkUgYmFjayB0byAwIGZvciBhIHJlYWwgcmVsZWFzZS4KLQotVHVlIE1hciAyNCAxNTo1NzowMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBjb25maWcvaXJpeDQubVtodF0sIGhvc3RzL2lyaXg0Lmg6IGFkZCBzdXBwb3J0IGZvcgotCSAgaXJpeDQuCi0KLU1vbiBNYXIgMjMgMjI6Mzc6MzQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1tc3ltLmMgKGVjb2ZmX3N3YXBfcmZkX2luKTogIHJlbW92ZSAmIGZvciBhcnJheSByZWYuCi0KLVR1ZSBNYXIgMTcgMTQ6MTI6MjUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogIFVzZSBCRkRfQVNTRVJUIG1hY3JvLAotCW5vdCBpbnRlcm5hbCBiZmRfYXNzZXJ0IGZ1bmN0aW9uICh0d2ljZSkuCi0KLVR1ZSBNYXIgMTcgMTA6NDU6MTIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6IGNoYW5nZSBhcl9tYXhfbmFtZWxlbiB0byAxNSAodGhlIHJpZ2h0IHZhbHVlKQotCSogY29mZi1hMjlrLCBjb2ZmY29kZS5oOiBtb3JlIGhhbmdvdmVycyBmcm9tIHRoZSBiZmRfYWJzX3NlY3Rpb24KLQljaGFuZ2UKLQotTW9uIE1hciAxNiAxNDo1NzoyMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BydGwuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBjaGVjayBmb3IgYm91dCBhcmNoaXZlcyB0b28uCi0JKiBib3V0LmM6IG1ha2UgaXQgd29yayBhZ2Fpbi4KLQotU2F0IE1hciAxNCAxNzozMDo0MCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9jb3JlZmlsZV9ub3RlKTogIENhbGwgYmZkX3htYWxsb2MoKSBpbnN0ZWFkIG9mIGJhcmUKLQltYWxsb2MoKS4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6ICBDYWxsCi0JYmZkX3htYWxsb2MoKSBpbnN0ZWFkIG9mIGJhcmUgbWFsbG9jKCkuCi0KLUZyaSBNYXIgMTMgMTU6NDQ6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gTUFLRUlORk8gb24gaW5mby4KLQotRnJpIE1hciAxMyAwNzo0MToxMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LTxmb28+IG5vdyA8Zm9vPi5tdCwgY29uZmlnL21oLTxmb28+IG5vdyA8Zm9vPi5taC4KLQlob3N0L2gtPGZvbz4gbm93IGp1c3QgPGZvbz4uCi0JKiBjb25maWd1cmUuaW46IHJlZmxlY3QgY2hhbmdlcwotCi1UaHUgTWFyIDEyIDExOjE1OjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoc2V0X3RkYXRhKTogIE1ha2UgY2hhbmdlIG9mIEZlYiAyNyBpbiB0aGUKLQlhY3R1YWwgc291cmNlIGZpbGUsIG5vdCBqdXN0IHRoZSBnZW5lcmF0ZWQgbGliYmZkLmguCi0KLVNhdCBNYXIgIDcgMTA6MzM6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChpY29mZl9saXR0bGVfdmVjKTogYWRkIENPRkZfU1dBUF9UQUJMRSBzbyB3ZSBjYW4gcnVuCi0JZ2RiIG9uIGxpdHRsZS1lbmRpYW4gOTYwIGNvZGUuCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogaW5kaXJlY3Qgc3ltYm9scyBzaG91bGQgZ28KLQlpbnRvIHRoZSBhcmNoaXZlIGhlYWRlciB0b28uCi0KLUZyaSBNYXIgIDYgMjE6NTU6MTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVRodSBNYXIgIDUgMjM6NTE6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbXN5bS5jOiAgTW92ZSB0aGlzIGZpbGUgZnJvbSBnZGIvZWNvZmYuYy4gIEl0Ci0JaGFuZGxlcyBieXRlLXN3YXBwaW5nIGZvciBFQ09GRiAoTUlQUyBzeW1ib2wpIGZpbGVzLgotCSogY29uZmlnL21oLWRlY3N0YXRpb24sIGNvbmZpZy9taC1pcml4MzogIEFkZCBjb2ZmLW1zeW0ubwotCXRvIHRoZSBmaWxlcyBidWlsdCBvbiBNSVBTLWJhc2VkIGhvc3RzLgotCSogTWFrZWZpbGUuaW46ICBBZGQgcnVsZSBmb3IgY29mZi1tc3ltLgotCi1UaHUgTWFyICA1IDIxOjM2OjA1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2xlYW4taW5mbyB0YXJnZXQuICBNSU5JTUlaRT0xLgotCi1TdW4gTWFyICAxIDIyOjMyOjU4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5jOiAgTW92ZSBjb3JlIGZpbGUgZnVuY3Rpb25zIGludG8gc2VwYXJhdGUKLQluZXcgZmlsZSByczYwMDAtY29yZS5jLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSByZWFkaW5nCi0JY29yZSBmaWxlcyBkZXBlbmRzIG9uIG5hdGl2ZSBpbmNsdWRlIGZpbGVzIHRoYXQgY29uZmxpY3QKLQl3aXRoIC4uL2luY2x1ZGUvY29mZi9yczYwMDAuaC4KLQkqIGNvbmZpZy9taC1yczYwMDA6ICBBZGQgcnM2MDAwLWNvcmUubyB0byBIREVQRklMRVMuCi0KLVRodSBGZWIgMjcgMjI6MTk6NTUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxwcmludF9zeW1ib2wpKTogRG9uJ3QgcHJpbnQKLQlzeW1ib2wgYWRkcmVzc3MgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLgotCSogY29mZi1yczYwMDAuYzogIFZhcmlvdXMgdXBkYXRlcyAoZHVlIHRvIHRhcmdldC0KLQlpbmRlcGVuZGVudCBjaGFuZ2VzKS4KLQkqIGxpYmJmZC5oOiAgRGl0dG8gKHRkYXRhIGZpZWxkIGlzIG5vdyBhIHVuaW9uKS4KLQkqIGhvc3RzL2gtc3BhcmMuaDogIFJlbW92ZWQgcHJvdG90eXBlIGZvciBib2d1cyBmdW5jdGlvbgotCSdlbXNldCcgKHByZXN1bWFibHkgc2hvdWxkIGhhdmUgYmVlbiAnbWVtc2V0JyAtIHdoaWNoIGlzIHRoZXJlKS4KLQotVGh1IEZlYiAyNyAxMTo0NjozMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLWJpZy0qIHRhcmdldCk6ICBTYW1lIGlzIElyaXMuCi0KLVRodSBGZWIgMjcgMDk6MjQ6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiB3aGVuIGNyZWF0aW5nIGFuCi0JYWxpYXMgc3ltYm9sLCBmaWxsIGluIHRoZSBzZWN0aW9uIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4KLQlsZWF2aW5nIGl0IGJsYW5rLiBJZiBhbiBvdXRwdXQgc2VjdGlvbiBjYW4ndCBiZSBmb3VuZCBmb3IgYQotCXN5bWJvbCwgdGhlbiBkb24ndCBjb3JlIGR1bXAuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1XZWQgRmViIDI2IDE5OjQwOjU5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYzogbGludAotCSogY29mZi1oODMwMC5jOiBmaXggc3R1cGlkIHJlbG9jIHN1YnRyYWN0aW9uIGJ1ZwotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9vdXQpOiBvbmx5IHN3YXAgYSB0dm5keCBieSAyIGJ5dGVzLAotCXNpbmNlIHRoYXQncyBob3cgd2lkZSBpdCBpcy4gKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogYWx3YXlzIHplcm8gb3V0Ci0JdGhlIHN5bWJvbC5mbGFncyBhbmQgZG9uZV9saW5lbm8gZmllbGRzLgotCi1UdWUgRmViIDI1IDE0OjI5OjI0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3N5bWJvbCk6IHdyaXRlIG91dCB0aGUgY29ycmVjdCBudW1iZXIgb2YKLQlhdXhlbnRzLgotCSogY3B1LWg4MzAwLmM6IGZpeCBkaXNhc3NlbWJseSBidWcKLQotRnJpIEZlYiAyMSAyMTozOTo1NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKGJmZF9lcnJtc2cpLCBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luLAotCXNlY3Rpb25fZnJvbV9iZmRfaW5kZXgpLCBjcHUtaDgzMDAuYyAoaG93dG8qX2NhbGxiYWNrKSwKLQlyZWxvYy5jLCBzZWN0aW9uLmMgKGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyksIHRhcmdldHMuYwotCShiZmRfdGFyZ2V0X2xpc3QpOiAgUHJvdG9saW50LgotCSogbGliYmZkLmg6ICBVcGRhdGUgdG8gbWF0Y2ggYSBsaWJiZmQtaW4uaCBmcm9tIGEgbW9udGggYWdvLgotCi1GcmkgRmViIDIxIDEwOjU3OjU0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogbGludCwgKGNvZmZfcHJpbnRfc3ltYm9sKTogcHJpbnRzCi0Jb3V0IHRhZ25keCB0b28uCi0JKiBhb3V0eC5oIChzd2FwX3N0ZF9yZWxvY19vdXQsIHN3YXBfZXh0X3JlbG9jX291dCk6IHVzZSB0aGUgb3V0cHV0Ci0Jc2VjdGlvbiBvZiBhIHN5bWJvbCByYXRoZXIgdGhhbiB0aGUgc2VjdGlvbiBvZiBhIHJlZmZlZCBzeW1ib2wgdG8KLQlkZXRlcm1pbmUgdGhlIHJfaW5kZXggb2YgYW4gZW1taXR0ZWQgcmVsb2MuCi0KLVRodSBGZWIgMjAgMTg6MTA6MzQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFBPUlRJTkc6IE5ldyAocHJlbGltaW5hcnkpIHBvcnRpbmcgZ3VpZGUuCi0KLVdlZCBGZWIgMTkgMjE6Mzk6MzcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoY2FsbGpfY2FsbGJhY2spLCBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyksIGNvZmYtbTg4ay5jCi0JKGhvd3RvX2h2cnQxNik6ICBsaW50LgotCi1Nb24gRmViIDE3IDEyOjAyOjE3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBocDMwMGJzZC5jIChuZXcpLCBjb25maWcvbXQtaHAzMDBic2Q6ICBNYWtlIGhwMzAwYnNkCi0JYSBmdWxsIGNvbmZpZ3VyYXRpb24gKHdpdGggcG9zc2libGUgY3Jvc3MtZGV2ZWxvcG1lbnQpLAotCWluc3RlYWQgb2YgdXNpbmcgaG9zdC1hb3V0LmMuCi0KLVN1biBGZWIgMTYgMTM6MDE6NDkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cyk6Ci0JU2V0IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKS4KLQkqIGdlbi1hb3V0LmM6ICBDaGFuZ2UgdG8gZW1pdCBhIC5jIGZpbGVzLCBub3QgYSAuaCBmaWxlLgotCi1UaHUgRmViIDEzIDIwOjExOjQ3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBSZW1vdmUgb2Jzb2xldGUgdXNlIG9mCi0JQlNGX0FCU09MVVRFIGFuZCByZXBsYWNlIHdpdGggYmZkX2Fic19zZWN0aW9uIHJlZmVyZW5jZS4KLQotVGh1IEZlYiAxMyAxNzoyMjo0NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogZml4ZWQgYnVnIHdoZXJlIHN5bWJvbHMKLQl3aXRoIG1vcmUgdGhhbiBvbmUgYXV4ZW50IGNhbiBjYXVzZSBuYXN0eSBjb3JlIGR1bXBzLgotCi0JKiBjb2ZmY29kZS5oLCBsaWJjb2ZmLmM6IGFkZGVkIG5ldyBmaWVsZGVkIHRvIGNvZmZfc3ltYm9sX3N0cnVjdAotCSJkb25lX2xpbmVubyIgc28gdGhhdCBhIHN5bWJvbCB3aGljaCBhcHBlYXJzIHR3aWNlIGluIHRoZSBzeW1ib2wKLQl0YWJsZSBvbmx5IGdldHMgaXQncyBsaW5lbnVtYmVycyByZWxvY2F0ZWQgb25jZS4gTW9kaWZlZAotCShjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpIGFuZCAoY29mZl9tYWtlX2VtcHR5X3N5bWJvbCkgdG8gbWFrZQotCXVzZSBvZiBpdC4KLQotVHVlIEZlYiAgNCAxNTozOTo1NSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaDogKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBmaXggY29uc3RydWN0b3IKLQlzdHVmZiB0byB1c2UgdGhlIE5ldyBPcmRlci4KLQotRnJpIEphbiAzMSAwMTozNDo0NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBpZWVlLmM6ICBDaGFuZ2UgdHlwZSBvZiBlbnZpW10gdG8gdW5zaWduZWQgY2hhci4KLQotCSogY29uZmlndXJlLmluOiAgZml4IHZheCB1bHRyaXggY29uZmlndXJhdGlvbi4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBEZWFsIHdpdGggbnVsbCByZXR1cm4gZnJvbQotCWJmZF9tYWtlX3NlY3Rpb24oKS4gIChlbGZfb2JqZWN0X3ApOiAgU2VsZWN0IGVuZGlhbmVzcyBwcm9wZXJseS4KLQotRnJpIEphbiAzMSAwMToxOTo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC10YWhvZS5oLCBoLXZheGJzZC5oOiAgRml4IHN0YWNrIGluIGNvcmUgZmlsZXMuCi0KLVRodSBKYW4gMzAgMjM6NTE6MDcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgaG9zdC1hb3V0LmMgZG9lc24ndCBkZXBlbmQgb24gYW91dC1wYXJhbXMuaC4KLQkqIGFvdXQtdGFyZ2V0Lmg6ICBVc2UgVEFSR0VUX0JJR19FTkRJQU5fUCB0byBzZXQgdXAgdmVjdG9yLgotCSogaG9zdC1hb3V0LmM6ICBEb24ndCB1c2UgYW91dC1wYXJhbXMuaDsgY29uZmlndXJlIHRoZXNlIHN5c3RlbXMKLQlpbiB0aGVpciB4bSBmaWxlcywgbm90IGluIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIGZpbGUuCi0JKiBob3N0cy9oLWhwMzAwYnNkLmgsIGgtdGFob2UuaCwgaC12YXhic2QuaCwgaC12YXh1bHQuaDoKLQlTcGVjaWZ5IGJ5dGUgb3JkZXIuCi0JKiBob3N0cy9oLXZheGJzZC5oOiAgRGVmaW5lIHRoZSBmb3JtIG9mIGV4ZWMgYW5kIGNvcmUgZmlsZXMuCi0KLVRodSBKYW4gMzAgMTM6MDI6NDEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC10YWhvZSwgY29uZmlnL210LXZheDogIENoYW5nZSBERUZBVUxUX1ZFQ1RPUiB0bwotCWhvc3RfYW91dF92ZWMgaGVyZSBhcyB3ZWxsLgotCi1UaHUgSmFuIDMwIDExOjQxOjQ1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3QtYW91dC5jOiAgQ2hhbmdlIFRBUkdFVE5BTUUgdG8gImEub3V0IiB0byBiZSBjb21wYXRpYmxlIHdpdGgKLQlnZGIuICBjb25maWcvbXQtaHAzMDBic2Q6ICBDaGFuZ2UgREVGQVVMVF9WRUNUT1IgdG8gaG9zdF9hb3V0X3ZlYwotCXRvIHByZXZlbnQgdW5kZWZpbmVkIHN5bWJvbC4KLQotVGh1IEphbiAzMCAwNzoyNjo1MyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCVZhcmlvdXMgbGludHMgZm91bmQgb24gUGVyc1NvbnkKLQkqIGFvdXR4Lmg6IGNhc3QgYW4gZW51bQotCSogY29mZi1hMjlrLmM6IG1hbnkgaW50cyBpbiByZWxvYyBzdHJ1Y3R1cmUgdHVybmVkIHRvIGVudW0KLQkqIGNvZmZjb2RlLmg6IG1vcmUgZW51bXMKLQkqIGNwdS1oODMwMC5jOiBtb3JlIGVudW1zCi0JKiBvcG5jbHMuYzogbW9yZSBlbnVtcwotCi1UaHUgSmFuIDMwIDAxOjE5OjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIFRhaG9lIGNvbmZpZ3VyYXRpb24gd29yayBhZ2Fpbi4KLQkqIGJmZC1pbi5oOiAgUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gZW51bSBkZWNsYXJhdGlvbi4KLQkqIGllZWUuYzogIENhbid0IHB1dCBieXRlIHZhbHVlcyA+MHg3RiBpbnRvIGEgc2lnbmVkIGNoYXIuCi0KLVR1ZSBKYW4gMjggMjE6MTA6NTEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGRlcGVuZGVuY2llcyBmb3IgdmFyaW91cyBjb2ZmLSoubyBmaWxlcy4KLQotCSogZWxmLmM6ICBSZW1vdmUgZXh0cmFuZW91cyBwYXJlbiBmcm9tIGNvcmVfcHJwc2luZm8gYW5kCi0JY29yZV9wcnBzdGF0dXMgbWFjcm9zLCByZW5hbWUgY29yZV9wcnBzdGF0dXMgdG8gY29yZV9wcnN0YXR1cy4KLQlSZXBsYWNlIHJlZmVyZW5jZXMgdG8gb2xkIHNlY3Rpb24gInNpemUiIG1lbWJlciB3aXRoIG5ldwotCSJfcmF3X3NpemUiIG1lbWJlci4gIEltcGxlbWVudCBlbGZfbWFrZV9lbXB0eV9zeW1ib2wsIHdoaWNoCi0JaXMgbm93IHVzZWQuCi0KLVR1ZSBKYW4gMjggMTQ6NTE6NDAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMsIGJmZC5jLCAuLi9pbmNsdWRlL2JmZC5oOiAgVmFyaW91cyBmaXhlcyBmb3IgUE1BWAotCWNvcmUgcmVhZGluZy4KLQotVHVlIEphbiAyOCAxMDo0NjozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfcmVsYXhfc2VjdGlvbik6IG5vdyBzdGF0aWMuCi0JKGJmZF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IHZhcmlvdXMgdHlwZSBsaW50cy4KLQotTW9uIEphbiAyNyAxOTo0NDowOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCU5ldyBlbnRyeSBwb2ludCBpbiB0aGUgdHJhbnNmZXIgdmVjdG9yIC0gYmZkX3JlbGF4X3NlY3Rpb24uCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6IGFkZCB0byB2ZWN0b3IsIGNhbGwgZ2VuZXJpY19yZWxheAotCSogYmZkLWluLmg6IGFkZCB0byB2ZWN0b3IKLQkqIGJmZC5jOiBhZGQgI2RlZmluZSBmb3IgdmVjdG9yCi0JKiBib3V0LmM6IGFkZCB0byB2ZWN0b3IsIGNhbGwgZ2VuZXJpY19yZWxheAotCSogY29mZmNvZGUuaDogYWRkIHRvIHZlY3RvciwgYWxzbyBub3cgaGFzIGNvZmYgc3BlY2lmaWMgcmVsYXggY29kZQotCWZvciB0aGUgcmVsYXhhYmxlIEg4LzMwMCByZWxvY3MuIEFsc28gY2xlYW4gdXAgYWJzIHNlY3Rpb24gY3J1ZnQuCi0JKiBlbGYuYzogY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiBpZWVlLmM6IGNhbGwgbmV3IHZlY3RvciwgY2xlYW4gdXAgc29tZSBidWdzIGR1ZSB0byB0aGUgY3JlYXRpb24KLQlvZiBiZmRfYWJzX3NlY3Rpb24KLQkqIGxpYmJmZC5oOiBhZGQgYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbiBFWEZVTgotCSogb2FzeXMuYzogY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiByZWxvYy5jOiBpbXBsZW1lbnQgZ2VuZXJpY19yZWxheAotCSogc2VjbGV0LmM6IG1vdmVkIG11Y2ggb2YgdGhpcyBpbnRvIGNvZmZjb2RlLmgKLQkqIHNyZWMuYzogY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiB0YXJnZXRzLmM6IGRlZmluZSBuZXcgdHJhbnNmZXIgdmVjdG9yCi0KLUZyaSBKYW4gMjQgMTQ6NDA6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGV2ZXJ5dGhpbmc6IG5vdyBtb2RpZmllZCB0byB1c2Ugc21hbGxlciByZWxvYyB0eXBlLiBTZWxmIGhvc3RzCi0Jb24gc3VuMyAmIHN1bjQuCi0KLVNhdCBKYW4gMTggMTc6MDA6MTYgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zdHJhdHVzLCBjb25maWcvbXQtaTg2MC1lbGYsIGhvc3RzL2gtc3RyYXR1czoKLQlOZXcgZmlsZXMgZm9yIHN0cmF0dXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBjb25maWd1cmF0aW9uIGZyYWdtZW50cyBmb3Igc3RyYXR1cy4KLQotV2VkIEphbiAxNSAxMDowMjo0MyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IERlY2xhcmUgdmFyaW91cyBmaWxlbmFtZQotCXZhcmlhYmxlcyBhcyBDT05TVCBzaW5jZSB0aGV5IGFyZSBzZXQgdG8gcG9pbnQgdG8gYSBjb25zdCBjaGFyCi0Jc3RyaW5nLiAgRml4ZXMgY29tcGlsZXIgY29tcGxhaW50cy4KLQotRnJpIEphbiAxMCAxNzo0NDo1MyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC1hbWl4LmggaG9zdHMvaC1pMzg2djQuaDogIENoYW5nZSBhYm9ydCgpIHRvIGEgZnVuY3Rpb24KLQlyZXR1cm5pbmcgdm9pZC4KLQotRnJpIEphbiAxMCAxNDozMzozMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6ICBSZWNvZ25pemUgTl9TT0wKLQlzeW1ib2xzLCBzbyB0aGF0IHdlIGNhbiBlbWl0IHRoZSBjb3JyZWN0IGZpbGUgbmFtZSBldmVuCi0JaWYgaXQncyBhbiBpbmNsdWRlIGZpbGUuCi0KLVRodSBKYW4gIDIgMTY6NDM6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jOiAgQWRkIENPRkZfU1dBUF9UQUJMRSB0byBsaXR0bGVfdmVjIGFzIHdlbGwgYXMgYmlnX3ZlYy4KLQkoUmVwb3J0ZWQgYnkgam9obkBsYWJ0YW0ubGFidGFtLm96LmF1IChKb2huIENhcmV5KSkuCi0KLVdlZCBKYW4gIDEgMDQ6MjM6MDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgQ2hhbmdlIGFsbCAnI2lmIEhBVkVfUFJPQ0ZTJyB0byAnI2lmZGVmIEhBVkVfUFJPQ0ZTJy4KLQotCSogY29uZmlnL21oLWFtaXgsIGNvbmZpZy9taC1pMzg2djQ6ICBSZW1vdmUgSERFRklORVMgdGhhdCB3YXMKLQliZWluZyB1c2VkIHRvIC1ESEFWRV9QUk9DRlMuCi0KLQkqIGhvc3RzL2gtYW1peCwgaG9zdHMvaC1pMzg2djQ6ICBBZGQgJyNkZWZpbmUgSEFWRV9QUk9DRlMnLiAgTW92ZQotCScjaW5jbHVkZSAiZm9wZW4tc2FtZS5oIicgdG8gZW5kIG9mIGZpbGUgdG8gbWF0Y2ggb3RoZXIgaC0qIGZpbGVzLgotCi1GcmkgRGVjIDIwIDEyOjA2OjE3IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDaGFuZ2Ugc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LiAgQWRkIGNhc2UKLQkidW5rbm93biIgZm9yIHRhcmdldCB2ZW5kb3IgYW5kIGluZmVyIHNvbWUgdGFyZ2V0cyBiYXNlZAotCW9uIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW5nIHN5c3RlbS4KLQotV2VkIERlYyAxOCAxNzoxNzo1OSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCwgbGliYW91dC5oOiAgQU5TSWZ5IGVudW1zLgotCi1XZWQgRGVjIDE4IDE2OjEyOjI1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKG5vcm1hbGl6ZSk6IGNyZWF0ZWQgdmVyc2lvbiBmb3IgVk1TIHdoaWNoIHJlbW92ZXMgdGhlCi0JVk1TIGRpcmVjdG9yeSBjcmFwIGZyb20gdGhlIGZyb250IGFuZCBlbmQgb2YgYSBmaWxlbmFtZSwgZWcgdHVybgotCVstLmZvb11iYXIub2JqOzEyMyBpbnRvIGJhci5vYmoKLQkoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogbm93IHdyaXRlcyBpbmRleCBpbnRvIGFuCi0JZXh0ZW5kZWQgbmFtZSB0YWJsZSBpbiBkZWNpbWFsIC0gdGhlIHNhbWUgYmFzZSB1c2VkIHRvIHJlYWQgYW4KLQlleHRlbmRlZCBuYW1lIHRhYmxlLgotCi1XZWQgRGVjIDE4IDE0OjQwOjM5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0LWVuY2FwLmM6ICBGaXggdG8gdXNlIGFvdXQtdGFyZ2V0LmguCi0JKiBhb3V0ZjEuaDogIFVzZSBzdGFuZGFyZCBNWV9vYmplY3RfcCBhbmQgTVlfY2FsbGJhY2sKLQlpbiBhb3V0LXRhcmdldC5oLiAgUmVtb3ZlIHRhcmdldC1zcGVjaWZpYyB2ZXJzaW9ucy4KLQkqIGhvc3QtYW91dC5jOiAgUmUtd3JpdGUgdG8gdXNlIGFvdXQtdGFyZ2V0LmguCi0JKiBnZW4tYW91dC5jOiAgTmV3IGZpbGVzIHVzZSB3aXRoIGhvc3QtYW91dC5jIHRvIGdlbmVyYXRlCi0JaG9zdC1zcGVjaWZpYyBhLm91dC1yZWxhdGVkIHBhcmFtZXRlcnMuCi0JKiBNYWtlZmlsZS5pbjogIGhvc3QtYW91dC5vIGRlcGVuZHMgb24gYW91dC1wYXJhbXMuaCwgd2hpY2ggaXMKLQlnZW5lcmF0ZWQgYnkgZ2VuLWFvdXQuCi0JKiBhb3V0LXRhcmdldC5oOiAgTWFrZSBhIGxpdHRsZSBtb3JlIGZsZXhpYmxlLgotCSogbGliYW91dC5oLCBhb3V0LXRhcmdldC5oOiAgUmVtb3ZlZCBXT1JLX09VVF9GSUxFX1BPU1RJT05TCi0JbWFjcm8uICBJbnN0ZWFkLCBpbmxpbmUgaXQgaW4gYW91dC10YXJnZXQuaC4KLQkqIG5ld3NvczMuYzogIERlZmluZSBOX1NIQVJFRF9MSUIoeCkgYXMgMCB0byBhdm9pZAotCWEgZ2NjIC1XYWxsIHdhcm5pbmcuCi0JKiBhcmNoaXZlLmM6ICBBZGQgbWlzc2luZyBjb21tYXMgaW4gREVGVU4gbWFjcm8gKDIgcGxhY2VzKS4KLQkqIGVsZi5jLCBjb2ZmY29kZS5oLCBhb3V0ZjEuaDogIFVzZSBBTlNJIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mCi0JQmVya2VsZXkgb25lcywgbm93IHRoYXQgbGliaWJlcnR5IGhhcyB0aGVtOgotCWJjb3B5LT5tZW1jcHksIGJ6ZXJvLT5tZW1zZXQsIGJjbXAtPm1lbWNtcC4KLQkqIGFvdXR4Lmg6ICBWYXJpb3VzIHRvdWNoLXVwczogIFJlLWZvcm1hdHRpbmcsIGZpeCBhIGNhc3QsCi0JcmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQotVHVlIERlYyAxNyAxOTo0ODo1OSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgRW5jbG9zZSBjb3JlbmFtZQotCWFuZCBleGVjbmFtZSBpbnNpZGUgSEFWRV9QUk9DRlMgaWZkZWYgc2luY2UgdGhleSBhcmUgdW51c2VkCi0Jd2hlbiBpdCBpcyBub3QgZGVmaW5lZC4KLQotTW9uIERlYyAxNiAxMjowMDoxMCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBGbGFnIGFsbCBzZWN0aW9ucyBhcyBlaXRoZXIgY29kZSBvciBkYXRhLiAgV2UgY2FuJ3QKLQliZSBzdXJlIHdoYXQgdGhleSBhcmUgYW55d2F5LCBzaW5jZSBFTEYgZG9lc24ndCBmaXQgdGhlCi0JdHJhZGl0aW9uYWwgbW9kZWwgb2YgdGV4dCtkYXRhK2JzcyB2ZXJ5IHdlbGwuICBBZGQgbmV3IGxvY2FsCi0JZnVuY3Rpb24gZWxmX3JlYWQoKSB0byBzaW1wbGlmeSBjb2RlLiAgUmVjb3JkIGVudHJ5IHBvaW50IGluCi0JdGhlIGJmZCBzdHJ1Y3R1cmUuCi0KLVRodSBEZWMgMTIgMjE6MDE6MjIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtKi5oOiAgQ29uZmlndXJlIGZvcGVuIHVzaW5nIC4uL2luY2x1ZGUvZm9wZW4tKi5oCi0JcmF0aGVyIHRoYW4gTiBjb3BpZXMgb2YgdGhlIHNhbWUgbGluZXMuCi0KLVdlZCBEZWMgMTEgMTY6Mzk6NDUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODMwMC5jOiBkaXNhc3NlbWJsZSBicmFuY2ggZGlzcGxhY2VtZW50cyBjb3JyZWN0bHkKLQkqIGNvZmYtaDgzMDAuYzogcHV0IHJlbG9jIG9mZnNldHMgb3V0IGluIDMyYml0cwotCi0JKiBtYWtlZmlsZS5kb3MsIGNvbmZpZ2RqLmJhdDogTmV3IGZpbGVzIGZyb20gREoKLQkqIGNhY2hlLmM6IGZvcGVuIHdpdGggbmV3IG1hY3JvcyBpcyBuZWVkZWQgZm9yIERPUy4KLQkqIGllZWUuYzogZW52aXJvbiByZW5hbWVkIHRvIGVudmkgdG8gc3RvcCBhbiBpbmNsdWRlIGZpbGUKLQljb25mbGljdC4KLQkqIG9wbmNscy5jLCBjb2ZmLXJzNjAwMC5jOiBtb3JlIGZvcGVucyB3aXRoIG1hY3Jvcy4KLQotVHVlIERlYyAxMCAwNDowNzoyNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotU2F0IERlYyAgNyAxNjozOToyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSAqIE1ha2VmaWxlLmluOiBmaXggd2hlcmUgZG9jZGlyIGxpdmVzCi0KLQkgKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGJmZC5jLCBjYWNoZS5jLCBjb2ZmLW04OGsuYywKLQkgY29mZmNvZGUuaCwgY29yZS5jLCBjdG9yLmMsIGVsZi5jLCBmb3JtYXQuYywgaWVlZS5jLCBpbml0LmMsCi0JIGxpYmJmZC5jLCBsaWJiZmQuaCwgbGliY29mZi5oLCBvcG5jbHMuYywgcmVsb2MuYywgc2VjdGlvbi5jLAotCSBzcmVjLmMsIHN5bXMuYywgdGFyZ2V0cy5jIDogYWxsIG5ldyBkb2N1bWVudGF0aW9uIGFuZCBsaW50Ci0JIHJlbW92YWwuCi0KLQotU2F0IERlYyAgNyAwNzoyMjowOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCwgc3JlYy5jOiAgTGludC4KLQotRnJpIERlYyAgNiAyMjo1ODo0OCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIHVzaW5nIElOU1RBTExfREFUQSwgYWRkZWQgc3RhbmRhcmRzLnRleHQKLQkgIHN1cHBvcnQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogbWFyayBkaXJlY3RvcnkgYXMgdGFyZ2V0IGRlcGVuZGVudC4gIGNvbmZpZ3VyZQotCSAgbm93cyB3b3JrcyBpbiBvYmpkaXIgYWx3YXlzIHNvIG1ha2UgZmlsZSBleGlzdGVuY2UgY2hlY2tzCi0JICBhZ2FpbnN0ICR7c3JjZGlyfS4KLQotVGh1IERlYyAgNSAyMjo0NjoxOSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLVdlZCBEZWMgIDQgMTA6MTQ6MTcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vc188c2l6ZT5fb2JqZWN0X3AsIHN1bm9zNF9jYWxsYmFjayk6IG1vdmVkIHRoZQotCWNvbXB1dGF0aW9uIG9mIGFyY2ggYW5kIG1hY2hpbmUgdHlwZSBzbyBpdCdzIHdvcmtlZCBvdXQgYmVmb3JlCi0Jc29tZV9hb3V0X29iamVjdF9wIGlzIGNhbGxlZC4KLQkqIGFvdXR4Lmg6IChzb21lX2FvdXRfb2JqZWN0X3ApOiBkb24ndCBzZXQgYXJjaCBhbmQgbWFjaCB0bwotCXVua25vd24uCi0JKiBhcmNodXJlcy5jOiBhZGQgZXh0cmEgZmllbGQgJ3NlY3Rpb25fYWxpZ25fcG93ZXInIHRvIGhvbGQKLQlkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IGluIG9iamVjdCBmaWxlcy4KLQkqIGNwdS1hMjlrLmMsIGNwdS1oODMwMC5jLCBjcHUtaTM4Ni5jLCBjcHUtaTk2MC5jLCBjcHUtbTY4ay5jLAotCWNwdS1tODhrLmMsIGNwdS1taXBzLmMsIGNwdS1yczYwMDAuYywgY3B1LXNwYXJjLmMsIGNwdS12YXguYzoKLQlpbml0aWFsaXplIHRoZSBuZXcgZmllbGQuCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogcmVwbGFjZSB0aGUgdGV4dCBzaXplLCBzaW5jZSBhb3V0Ci0JZnJpZXMgdGhlbS4KLQkqIGFvdXR4Lmg6IERvY3VtZW50YXRpb24gaW4gdGhlIG5ldyBzdHlsZQotCi1XZWQgRGVjICA0IDAyOjAwOjMwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9tdGltZSk6ICBEb24ndCBjYWNoZSBtdGltZSBhbnkgbW9yZTsgb25seQotCXVzZSB0aGUgc2F2ZWQgdmFsdWUgaWYgbXRpbWVfc2V0IGlzIGFscmVhZHkgc2V0IChpbnRlbmRlZAotCWZvciBhcmNoaXZlIGZpbGVzLCB0aG91Z2ggYXBwYXJlbnRseSBub3QgdXNlZCB5ZXQpLgotCi1UdWUgRGVjICAzIDIyOjU0OjUwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6ICBSZXZpc2UgY29tbWVudHMgYWJvdXQgaG93IHRvIGNvbmZpZ3VyZSB0aGUgdGFyZ2V0Ci0JdmVjdG9yLCB0byBtYXRjaCByZWFsaXR5LiAgUmVtb3ZlIG1lbnRpb24gb2Ygb2Jzb2xldGUgbWV0aG9kcy4KLQlSZW1vdmUgbG9uZyBsaXN0cyBvZiBjYXBpdGFsaXplZCBtYWNyb3MgdGhhdCB0dXJuIGludG8gdGhlIHNhbWUKLQl0aGluZyBpbiBsb3dlcmNhc2UuICBOb3JtYWwgdmVjdG9yIHNpbXBseSBsaXN0cyBhbGwga25vd24KLQlsb3dlcmNhc2UgeHZlYyBuYW1lczsgYWxsIG90aGVyIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IFNFTEVDVF9WRUNTLgotCi0JKiBjb25maWcvbXQtaTM4Ni1jb2ZmOiAgU2V0IERFRkFVTFRfVkVDVE9SIHRvIHJlYWwgaWRlbnRpZmllciwKLQlub3QgbWFjcm8gbmFtZS4KLQotCSogY29uZmlnL210LWk5NjAte2NvZmYsYm91dH06ICBVc2UgU0VMRUNUX1ZFQ1MgdG8gbWFrZSBhIHNob3J0Ci0JbGlzdCBvZiBzdXBwb3J0ZWQgdGFyZ2V0cy4KLQotVHVlIERlYyAgMyAxNDowNjoxNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiAgVGhlIHBhZCBieXRlIHNvbWV0aW1lcyBhZGRlZCB0bwotCXRoZSBzdHJpbmcgdGFibGUgaW4gYSBfXy5TWU1ERUYgbWVtYmVyIGlzIG5vdwotCWNvdW50ZWQgYXMgcGFydCBvZiB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHRhYmxlLgotCVRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgcmFubGliLCBhcyB3ZWxsIGFzIFN1bidzLgotCi1UdWUgRGVjICAzIDEwOjUzOjMwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBzcmVjLmM6IFJld3JvdGUgdG8gZml4IG1hbnkgYnVnczsgbm93IGdldHMgdGhlIHJlY29yZCB0eXBlCi0JcmlnaHQsIGRvZXNuJ3QgY2hva2Ugb24gaW5wdXQsIHNldHMgdGhlIHN0YXJ0IGFkZHJlc3MgaW4gYW4gUzkgYW5kCi0JZmlsbHMgaW4gdGhlIGZpbGVuYW1lIG9uIGFuIFMwLgotCi1TYXQgTm92IDMwIDIxOjE5OjE1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcHUtaDgzMDAuYzogQWRkIHN1cHBvcnQgZm9yIE1FTUlORCBhZGRyZXNzaW5nIG1vZGUKLQotCSogY29mZi1hMjlrLmM6IGRlZmluZWQgUkVMT0NfUFJPQ0VTU0lORyB0byB0YWtlIHRoZSAjaWZkZWYgb3V0IG9mCi0JY29mZmNvZGUuaAotCSogY29mZmNvZGUuaDogdXNlIHRoZSBuZXcgbWFjcm8gaWYgYXZhaWxhYmxlCi0KLQkqIGVsZi5jIChlbGZfY29yZWZpbGVfbm90ZSk6IGNhc3QgbWFsbG9jIHRvIGF2b2lkIHdhcm5pbmcuCi0JKiBNYWtlZmlsZS5pbjogRml4ZWQgZGVwZW5kZW5jaWVzIGR1ZSB0byBmaWxlIHJlbmFtZQotCi0JKiBhb3V0LWVuY2FwLmMsIGFvdXRmMS5oLCBhb3V0eC5oLCBhcmNoaXZlLmMsIGJvdXQuYywgY29mZi1hMjlrLmMsCi0JY29mZi1oODMwMC5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLW1pcHMuYywgY29mZi1yczYwMDAuYywgY3B1LWgzMDAuYywgZWxmLmMsIGkzODZhb3V0LmMsCi0JbmV3b3MzLmMsIHN0YWItc3ltcy5jLCBzeW1zLmM6IEFsbCB0aGVzZSBmaWxlcyBoYXZlIGhhZCB0aGVpcgotCSNpbmNsdWRlcyBhbHRlcmVkIHRvIHBvaW50IHRvIHRoZSBuZXcgcGxhY2VzLgotCi1GcmkgTm92IDI5IDIwOjA0OjQ5IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaTM4NnY0LCBjb25maWcvbWgtaTM4Ni1lbGYsIGhvc3RzL2gtaTM4NnY0Lmg6ICBOZXcgZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCB2ZW5kb3IgIm5jciIgYXMgc3VwcG9ydGVkIHBlci10YXJnZXQgdmVuZG9yLgotCUFkZCBzdnI0IGNhc2UgZm9yIGkzODYgcGVyLWhvc3QgY2FzZS4KLQotCSogZWxmLmMgKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIEFkZCBtaXNzaW5nICJicmVhayIgdG8KLQlFTEZEQVRBMkxTQiBjYXNlcy4KLQotRnJpIE5vdiAyOSAxMjoxNjo1MSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKTogIFJldHVybiAnQScKLQlmb3Igc3ltYm9scyB0aGF0IGFyZSBib3RoIGFic29sdXRlIGFuZCBnbG9iYWwuCi0JKiBhcmNoaXZlLmMgKGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlKTogIFJldHVybiBOVUxMCi0JaWYgYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gcmV0dXJucyBOVUxMLgotCi1UdWUgTm92IDI2IDA5OjEwOjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjb2ZmLWg4MzAwCi0JKiBjb25maWd1cmUuaW46IG5vdyBoOCBpcyBhIGNvZmYgdGFyZ2V0Ci0JKiBjcHUtaDgzMDAuYzogZml4IHZhcmlvdXMgZGlzYXNzZW1ibHkgcHJvYmxlbXMKLQkqIGxpYmNvZmYuaDogdG9vayBvdXQgc29tZSBjb2RlIHdoaWNoIGhhcyBiZWVuICMwZWQgZm9yIGEgbG9uZwotCXRpbWUuCi0JKiB0YXJnZXRzLmM6IGFkZGVkIGg4IGNvZmYKLQkqIGNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYwotCWFkZGVkIG5ldyBtYWNybyBSVFlQRTJIT1dUTyB0byB0YWtlIGEgbG9hZCBvZiAjaWZkZWZzIG91dCBvZgotCWNvZmZjb2RlLmgKLQkqIGNvZmZjb2RlLmg6IFN0YXJ0ZWQgdG8gY2hhbmdlIHRoZSB3YXkgbWFjaGluZSBkZXBlbmRlbmNpZXMgYXJlCi0JaGFuZGxlZCwgZnJvbSB0aGUgbmVzdCBvZiAjaWZkZWZzIHRvIG1hY3JvcyBkZWZpbmVkIGluIHRoZQotCWluY2x1ZGluZyBjb2ZmLTxmb28+LmMKLQotRnJpIE5vdiAyMiAwODoxMTo0MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIFNldCB0aGUgYGV4ZWN1dGFibGUnIGJpdAotCWlmIHRoZSBlbnRyeSBwb2ludCBpcyBjb250YWluZWQgaW4gdGhlIHRleHQgc2VnbWVudCwgZXZlbiBpZiB0aGUKLQl0ZXh0IHNlZ21lbnQgaXMgYXQgbG9jYXRpb24gMC4KLQotCSogY29mZi1taXBzLmMsIGNvZmZjb2RlLmg6ICBQZXRlciBTY2hhdWVyJ3MgcGF0Y2ggdG8ga2x1ZGdlIGluCi0Jbm9uc3RhbmRhcmQgTUlQUyBzZWN0aW9ucyAoLnJkYXRhLCAuc2RhdGEsIGV0YykuCi0KLQkqIGFvdXR4LmgsIGJmZC5jLCBjb2ZmY29kZS5oLCBpZWVlLmMsIG9hc3lzLmMsIHRhcmdldHMuYzogQ09OU1QgbGludC4KLQkqIGxpYmJmZC1pbi5oLCBsaWJiZmQuaCwgYW91dHguaCwgY29mZmNvZGUuaCwgZWxmLmMsIGxpYmFvdXQuaDoKLQlSZW5hbWUgQUxJR04gdG8gQkZEX0FMSUdOIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggQlNEIDxzeXMvcGFyYW0uaD4uCi0JKiBsaWJiZmQuYzogIExpbnQuCi0JKiBob3N0LWFvdXQuYywgdHJhZC1jb3JlLmM6ICBGaXggd3JpdGVfYXJtYXAgcHJvdG90eXBlcy4gIExpbnQuCi0KLVRodSBOb3YgMjEgMTk6NTY6NDAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWItc3ltcy5jLCBzeW1zLmM6ICBNb3ZlZCBiZmRfc3RhYl9uYW1lKCkgYW5kIGJmZF9zdGFiX25hbWVzW10KLQlmcm9tIHN5bXMuYyB0byBuZXcgZmlsZSBzdGFiLXN5bXMuYy4gIEFsc28sIHNpbmNlIEdOVSBleHRlbmRlZAotCXR5cGUgY29kZXMgc3VjaCBhcyBOX1NFVFQgYXJlIG5vIGxvbmdlciBpbiAuLi9pbmNsdWRlL3N0YWIuZGVmLAotCWluY2x1ZGUgdGhlbSBtYW51YWxseS4KLQkqIHN0YWItc3ltcy5jLCBhb3V0eC5oOiBSZW5hbWVkIGJmZF9zdGFiX25hbWUoKSBhbmQKLQliZmRfc3RhYl9uYW1lc1tdIHRvIGFvdXRfc3RhYl9uYW1lKCkgYW5kIGFvdXRfc3RhYl9uYW1lc1tdLgotCSogbGliYW91dC5oOiBBZGRlZCBwcm90b3R5cGUgZm9yIGFvdXRfc3RhYl9uYW1lKCkuCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBNYWtlZmlsZSBmb3IgbmV3IHN0YWItc3ltcy5bY29dLgotCi1UaHUgTm92IDIxIDExOjUwOjQ5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKFdPUktfT1VUX0ZJTEVfUE9TSVRJT05TKTogIE9uZSBtb3JlIHRyeSBhdCB0aGlzCi0JcmF0aGVyIGNvbXBsaWNhdGVkIHNlZW1pbmcgcHJvYmxlbS4gIEVsaW1pbmF0ZSBMT0dJQ0FMXyB2ZXJzaW9ucywKLQlqdXN0IG1ha2UgTl9YWFggd29yayBieSBleGNsdWRpbmcgdGhlIGhlYWRlciBmcm9tIHRoZSB0ZXh0IHNlZ21lbnQuCi0JKiBhb3V0eC5oOiAgRml4IGNvbW1lbnRzIHRvIG1hdGNoLgotCi1UdWUgTm92IDE5IDE4OjQ5OjAxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKFdPUktfT1VUX0ZJTEVfUE9TSVRJT05TKTogIFVzZSBuZXcgTE9HSUNBTF9UWFRBRERSLAotCUxPR0lDQUxfVFhUT0ZGLCBMT0dJQ0FMX1RYVFNJWkUgbWFjcm9zIHRvIGZpZ3VyZSBvdXQgbnVtYmVycwotCWZvciB0aGUgImxvZ2ljYWwiIHRleHQgc2VnbWVudCAoaS5lLiBuZXZlciBjb25zaWRlciB0aGUgZXhlYwotCWhlYWRlciB0byBiZSBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQpLiAgVGhpcyBjaGFuZ2UgaXMKLQluZWVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdmFyaW91cyBvdGhlciBwYXJ0cyBvZiBiZmQgYW5kIGxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvZV9hb3V0X29iamVjdF9wKSk6ICBGaXggY29tbWVudCwKLQlhbmQgbW92ZSBjYWxjdWxhdGlvbiBvZiBvYmpfdGV4dHNlYyhhYmZkKS0+c2l6ZSB0byBsaWJhb3V0LmguCi0JKiBiZmQtaW4uaDogIFJlbW92ZWQgYm9ndXMgJzsnLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBNSU5JTUlaRSBmbGFnIHRvIHNlbGVjdCBsZWFuCi0Jb3IgYmxvYXRlZCB0YXJnZXRfdmVjdG9yLgotCSogdGFyZ2V0cy5jOiAgVXNlIG5ldyBNSU5JTUlaRSBtYWNybywgYW5kIGFkZCB0cmFkX2NvcmUgaWYgbmVlZGVkLgotCSogbmV3c29zMy5jOiAgRml4ZXMgdG8gLi4vaW5jbHVkZS9hb3V0NjQuaCByZW1vdmUgbmVlZAotCWZvciBzcGVjaWFsIE5fVFhUT0ZGIG1hY3JvLCBidXQgcmVxdWlyZSBOX0hFQURFUl9JTl9URVhULgotCi1Nb24gTm92IDE4IDEyOjAwOjU5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oLCBhb3V0ZjEuaCwgbmV3c29zMy5jOiAgTWFrZSBhb3V0LXRhcmdldC5oCi0JaGFuZGxlIGJvdGggbGl0dGxlIGFuZCBiaWctZW5kaWFuIHRhcmdldHMsIHdpdGggbGl0dGxlCi0JdGhlIGRlZmF1bHQgdW5sZXNzIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AgaXMgZGVmaW5lZC4KLQkqIGhvc3QtYW91dC5jOiAgQWRkIEZJWE1FIG5vdGUuCi0KLVN1biBOb3YgMTcgMTM6Mjk6MzkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogIE1ha2UgdGhlIGRlZmF1bHQgdGFyZ2V0X3ZlY3RvciBjb250YWluCi0JanVzdCAmREVGQVVMVF9WRUNUT1IuICBUaGlzIG1ha2VzIGV4ZWN1dGFibGVzIGEgbG90IHNtYWxsZXIuCi0JT2xkIGJlaGF2aW9yIGNhbiBiZSBnb3R0ZW4gYnkgZGVmaW5pbmcgQUxMX1RBUkdFVFMuCi0JKiBhb3V0ZjEuaCwgZGVtbzY0LmMsIGkzODZhb3V0LmMsIG5ld3NvczMuYywgc3Vub3MuYzoKLQlGYWN0b3JlZCBvdXQgY29tbW9uIGNvZGUgaW50byBuZXcgZmlsZSBhb3V0LXRhcmdldC5oLgotCVNhdmVzIGEgbG90IG9mIGR1cGxpY2F0ZSBjb2RlIGZvciBhLm91dCB2YXJpYW50cy4KLQotRnJpIE5vdiAxNSAxMzowMDo0MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCUdldCAnbWFrZSBoZWFkZXJzJyB0byB3b3JrIHdoZW4gY29uZmlndXJlZCB3aXRoICtzdWJkaXJzLgotCSogTWFrZWZpbGUuaW46IEFkZCAkKHN1YmRpcikgdG8gZG9jZGlyIHBhdGguCi0JKiBkb2MvTWFrZWZpbGUuaW4gKHByb3Rvcyk6IEFkZCAkKHNyY2RpcikgcHJlZml4Ci0JdG8gbmFtZSBvZiBzZWQgc2NyaXB0cy4KLQotVGh1IE5vdiAxNCAxOTo0OToxMCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHByaW50X3N5bWJvbCkpOiAgRml4IHRoaW5rby4KLQkqIHN5bXMuYyAoYmZkX3N0YWJfbmFtZXMpOiAgVHVybiBvbiBuZXcgR05VX0VYVFJBX1NUQUJTIG1hY3JvCi0JdG8gaW5jbHVkZSBuYW1lcyBvZiBOX1NFVFQgZXRjLgotCi1UaHUgTm92IDE0IDE5OjExOjEzIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0gICAgCSogZWxmLmM6ICBBZGQgbWluaW1hbCBzdXBwb3J0IGZvciBFTEYgc3ltYm9sIHRhYmxlcy4gIEdlbmVyYXRlcwotCWNhbm9uaWNhbCBiZmQgc3ltYm9sIHRhYmxlcyBmcm9tIEVMRiBzeW1ib2wgdGFibGVzLiAgQ2hhbmdlIHRoZQotCW5hbWUgb2Ygc29tZSBmdW5jdGlvbnMgZnJvbSBiZmRfPG5hbWU+IHRvIGVsZl88bmFtZT4uCi0KLQkqIHN5bXMuYzogIFRyaXZpYWwgZml4IHRvIGNvbW1lbnQgdG8gcmVtb3ZlIGEgcmVkdW5kYW50ICJ0byIuCi0KLVdlZCBOb3YgMTMgMTc6MDI6MDEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYte2kzODYsbTY4ayxtODhrfS5jOiAgQ2hhbmdlIG5hbWUgb2YgZmlsZSBmb3JtYXQgdG8gc3RhbmRhcmQKLQlmb3JtIHRoYXQgR0RCIHJlY29nbml6ZXMgYXMgQ09GRi4KLQotV2VkIE5vdiAxMyAwOTowOTo0MSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfb2JqZWN0X3ApOiAgY2FzdCBOVUxMIGNvcnJlY3RseS4KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgaGFycmlzIGhvc3QKLQotCSogY29mZi1hMjlrLmM6IExvdHMgb2YgY2hhbmdlcywgbW9zdCBmcm9tIERhdmlkIFdvb2QuCi0KLVR1ZSBOb3YgMTIgMDc6MjE6NDEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jIChjb2ZmX3dyaXRlX2FybWFwKTogIEp1c3QgI3VuZGVmIGl0LgotCi1Nb24gTm92IDExIDIwOjMwOjE4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBzdGFuZGFyZGl6ZSBvbiBNSU5VU19HIHRvIGRpc2FibGUgZGVidWdnaW5nCi0JKiBjb2ZmLW04OGsuYzogY3JlYXRlIGNvZmYgYXJtYXBzIGluc3RlYWQgb2YgYnNkIG9uZXMuCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlX2FsbF9kb25lKSwgKGJmZF9jbG9zZSk6IE1hc2sgb3V0IHJhbmRvbSBiaXRzCi0Jd2hlbiBjYWxsaW5nIGNobW9kLgotCi1Nb24gTm92IDExIDE5OjA3OjMyIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIEFkZGl0aW9ucyB0byBzdXBwb3J0IEVMRiBmb3JtYXQgY29yZSBmaWxlcy4KLQkqIGNvbmZpZy9taC1hbWl4OiAgQWRkIC1ESEFWRV9QUk9DRlMgdG8gSERFRklORVMsIHNpbmNlIGhvc3QKLQloYXMgc3VwcG9ydCBmb3IgL3Byb2MgKGFsbCB0aGUgaW5jbHVkZSBmaWxlcyBpbiBwYXJ0aWN1bGFyKS4KLQotTW9uIE5vdiAxMSAxODozNjo0NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6ICBIYW5kbGUgdGhlIGNhc2UKLQlvZiB0d28gTl9TTyBzdGFicywgb25lIGZvciBkaXJlY3RvcnksIGFuZCBvbmUgZm9yIGZpbGVuYW1lLgotCi0JKiBiZmQtaW4uaCAocHJpbnRfdm1hKTogIEZhY3RvciBvdXQgZHVwbGljYXRlIGRlZmluaXRpb24uCi0KLQlFeGl0IGEgbGl0dGxlIG1vcmUgZ3JhY2VmdWxseSB3aGVuIG1hbGxvYyByZXR1cm5zIE5VTEwuCi0JKiBsaWJiZmQuYzogTmV3IGZ1bmN0aW9uIGJmZF94bWFsbG9jIChtYWxsb2Mgd3JhcHBlcikuCi0JKiBvcG5jbHMuYywgc3ltcy5jLCBib3V0LmMsIGFvdXR4Lmg6ICBSZXBsYWNlIG1hbGxvYyBieSBiZmRfeG1hbGxvYy4KLQkqIGxpYmJmZC5oOiBScmUtZ2VuZXJhdGVkIGR1ZSB0byBsaWJiZmQuYyB1cGRhdGUuCi0KLVNhdCBOb3YgIDkgMTM6NDU6MDEgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC1tNjhrLWVsZjogIERlZmluZSBERUZBVUxUX1ZFQ1RPUiBhcyBlbGZfYmlnX3ZlYy4KLQotCSogZWxmLmMgKGVsZl9vYmplY3RfcCk6ICBEb24ndCB0cnkgdG8gY3JlYXRlIGEgYmZkIHNlY3Rpb24gZm9yCi0JdGhlIGZpcnN0IEVMRiBzZWN0aW9uIGhlYWRlci4gIEl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlci4KLQotU2F0IE5vdiAgOSAwMzowNDoyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYywgY29uZmlnL21oLXJzNjAwMDogIE1ha2UgaXQgd29yayBvbiBhcmNoaXZlIGFuZAotCWNvcmUgZmlsZXMsIHdoZW4gY29tcGlsaW5nIG5hdGl2ZS4KLQkqIGhvc3RzL2gtcnM2MDAwLmg6ICBEZWZpbmUgRkFTQ0lTVF9GRE9QRU4gZm9yIGJmZF9mZG9wZW5yLgotCi0JRklYTUU6ICBUaGUgYW91dGYxLmggY2hhbmdlIGJlbG93IG5lZWRzIHRvIGJlIHJldmVyc2VkIGJhY2sKLQl0byB0aGUgd2F5IGl0IHdhcy4KLQotVGh1IE5vdiAgNyAxMTowMzo1NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogRGVmaW5lZCBuZXcgbWFjcm9zIFtQVVR8R0VUXUxJTkVOT19MTk5PIGZvcgotCW1hbmlwdWxhdGlvbiBvZiBsbm5vIGZpZWxkcyBpbiBsaW5lbm8gc3RydWN0cyBpbiBhIGNvZmYtPGY+LmgKLQlpbmRlcGVuZGVudCB3YXkuIE92ZXJyaWRlIGl0IGluIGNvZmYtPGY+LmggdG8geW91ciBmYXZvdXJpdGUKLQludW1iZXIgaWYgeW91IGRvbid0IGhhdmUgYSAxNmJpdCBsbm5vIGZpZWxkLiAoY29mZl9zd2FwX2xpbmVub19pbikKLQkoY29mZl9zd2FwX2xpbmVub19vdXQpOiBtb2RpZmllZCB0byB1c2UgdGhlIG5ldyBtYWNyb3MuCi0KLU1vbiBOb3YgIDQgMTE6Mzg6MzMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF9jYWxsYmFjayk6IE5vdyBkZWZhdWx0cyB0byA2ODAyMCByYXRoZXIgdGhhbgotCXVua25vd24gYXJjaCB3aGVuIHRoZSBtYWdpYyBudW1iZXIgZG9lc24ndCBzcGVjaWZ5IHRoZQotCWFyY2hpdGVjdHVyZSwgc2luY2Ugc29tZSBPU3MgKGVnIG9sZCBzdW4zcykgZG9uJ3Qgc2V0IHRoZSBudW1iZXIsIGFuZAotCTAyMCBpcyBwcm9iYWJseSB0aGUgcmlnaHQgYW5zd2VyIGFueXdheS4KLQotU3VuIE5vdiAgMyAxMjowNzowOCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC1uZXdzLmgsIGhvc3RzL2gtcnRic2QuaDoKLQlHZXQgcmlkIG9mIE1JU1NJTkdfVkZQUklOVEYsIHNpbmNlIGxpYmliZXJ0eSBwcm92aWRlcyBvbmUuCi0JKiBiZmQtaW4uaCAoYmZkX3ByaW50X3N5bWJvbF90eXBlX2hvcHcgZW51bSk6ICAgQWRkIG5ldyBvcHRpb24KLQliZmRfcHJpbnRfc3ltYm9sX25tLCBmb3IgdXNlIGJ5IG5tLgotCSogYW91dHguaCAoTkFNRShhb3V0LHByaW50X3N5bWJvbCkpOiAgQWRkIGNvZGUgZm9yIG5ldwotCWJmZF9wcmludF9zeW1ib2xfbm0gb3B0aW9uLCB0byBwcmludCBpbiBubSBmb3JtYXQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3ByaW50X3N5bWJvbCksIGllZWUuYyAoaWVlZV9wcmludF9zeW1ib2wpCi0Jb2FzeXMuYyAob2FzeXNfcHJpbnRfc3ltYm9sKTogIFByb3ZpZGUgc3R1YiBpbXBsZW1lbnRhdGlvbnMKLQlmb3IgYmZkX3ByaW50X3N5bWJvbF9ubS4KLQkqIHN5bXMuYzogIE5ldyBmdW5jdGlvbiBiZmRfZGVjb2RlX3N5bWNsYXNzLCB1c2VkIGJ5IG5tIHByaW50ZXIuCi0JTmV3IGZ1bmN0aW9uIGJmZF9zdGFiX25hbWUgdG8gbG9vayB1cCBzdHJpbmcgbmFtZSBvZiBzdGFiIGNvZGUuCi0KLVNhdCBOb3YgIDIgMTQ6MjY6MDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgY3Rvci5jCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCkgYWRkZWQKLQliZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cC4KLQkqIGNvZmZjb2RlLmg6IHJlbW92ZWQgYSBsb2FkIG9mICNpZiAwZWQgY29kZS4KLQkoY29mZl9jb21wdXRlX2ZpbGVfc2VjdGlvbl9wb3NpdGlvbnMpOiBub3cgd29ya3Mgb3V0IHRoZSBzZWN0aW9uCi0JYWxpZ25tZW50IGFuZCBzaXplIGNvcnJlY3RseSBpbiBhbGwgY2FzZXMuCi0JKGNvZmZfZ2V0X3N5bXRhYik6IGxvb2tzIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzIGFuZCBjYWxscyB0aGUKLQlyaWdodCBmdW5jdGlvbiB3aGVuIHRoZXkncmUgZm91bmQuIChjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6Ci0Ja25vd3Mgd2hlbiBhIHNlY3Rpb24gaXMgZnVsbCBvZiBjb25zdHJ1Y3RvcnMgYW5kIGRvZXMgdGhlIHJpZ2h0Ci0JdGhpbmcuCi0JKiBjcHUtbTg4ay5jOiBBZGRlZCBkZWZhdWx0X3JlbG9jX3R5cGUgbG9va3VwIHRvIHRoZSBhcmNoaXRlY3R1cmUKLQlkZXNjcmlwdGlvbi4KLQkqIGxpYmJmZC1pbi5oOiAoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApIGRlZnVuICBhZGRlZC4KLQkqIGxpYmNvZmYuaDogcmVtb3ZlZCAjaWYgMGVkIGNvZGUKLQkqIHJlbG9jLmM6IChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIGFkZGVkIEJGRF9SRUxPQ19DVE9SIGZvcgotCWFyY2ggaW5kZXBlbmRlbnQgY29uc3RydWN0b3IgcmVsb2NhdGlvbiB0eXBlLgotCShiZmRfcmVsb2NfdHlwZV9sb29rdXApOiByZW1vdmVkIHRoZSBjb21tZW50ICJ0aGlzIHdpbGwgZ28gYXdheSIKLQlzaW5jZSBpdCB3b24ndC4gKGJmZF9ob3d0b18zMik6IHN0b2xlbiBmcm9tIDg4aywgdGhpcyBpcyBhIDMyYml0Ci0JcmVsb2Mgd2hpY2ggaXMgdXNlZCB3aGVuIEJGRF9SRUxPQ19DVE9SIGZhbGxzIHRocm91Z2ggdG8gZ2l2ZSBhCi0JZGVmYXVsdCAzMmJpdCByZWxvYyBmb3IgY29uc3RydWN0b3JzLgotCShiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCk6IGFkZGVkLgotCSogYW91dGYxLmg6IGZpeGVkIFNFR01FTlRfU0laRSB0eXBvLgotCi1UaHUgT2N0IDMxIDE4OjIzOjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5jOiAgQ2hhbmdlIG5hbWUgdG8gImFpeGNvZmYtcnM2MDAwIiwgdG8gYXZvaWQKLQltYXRjaGluZyBwcmVmaXggImNvZmYiLgotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbiwgY29mZl9zd2FwX2F1eF9vdXQpOiAgSGFuZGxlCi0JcnMvNjAwMCBjc2VjdCByZWNvcmRzLgotCi1TdW4gT2N0IDI3IDE2OjU2OjU4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1tODhrLmMsIHRhcmdldHMuYzogY2hhbmdlIG5hbWUgb2YgbTg4a19iY3MgdG8gbTg4a2JjcwotCSogY29uZmlndXJlLmluOiBhZGQgbW90b3JvbGEgZGVsdGE4OCBjYXNlcwotCSogbGliYmZkLmgsIGxpYmJmZC1pbi5oLCBhcmNoaXZlLmMsIGllZWUuYywgZWxmLmMsIHNyZWMuYzogZml4Ci0Jd3JpdGVfYXJtYXAgcHJvdG90eXBlCi0JKiBsaWJiZmQuYzogYWRkIGRvYyBvbiBiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludAotCi1GcmkgT2N0IDI1IDAyOjQ4OjE5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBSZW5hbWUgQ09GRi1yZWxhdGVkIGZpbGVzIGluIGBjb2ZmLUFSQ0guYycgZm9ybS4KLQljb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsCi0JY29mZi1taXBzLmMsIGNvZmYtcnM2MDAwLmMgdG8gYmUgZXhhY3QuCi0KLQkqIE1ha2VmaWxlLmluOiAgT25seSBzdXBwbHkgVEFSR0VUX0RFRkFVTFRTIHRvIHRhcmdldHMuYywgcmVkdWNpbmcKLQltYWtlIG91dHB1dCBjbHV0dGVyLgotCSogY29uZmlnL210LSo6ICBEaXR0by4KLQotVGh1IE9jdCAyNCAyMjo0MDowNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJTLzYwMDAgc3VwcG9ydCwgYnkgTWV0aW4gRy4gT3ppc2lrLCBNaW1pIFBo+/RuZy1UaOVvIFb1LCBhbmQKLQlKb2huIEdpbG1vcmUuICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgY3B1LXJzNjAwMC5jIGFuZCByczYwMDBjb2ZmLmMuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgcnM2MDAwIGNhc2UuCi0JKiB0YXJnZXRzLmM6ICBBZGQgcnM2MDAwIHZlY3Rvci4KLQkqIGFyY2h1cmVzLmM6ICBBZGQgcnM2MDAwLCBmaXggY29tbWVudCBvbiByb21wLgotCSogYmZkLWluLmggKGVudW0gYmZkX2Vycm9yKTogIEFkZCBub19kZWJ1Z19zZWN0aW9uIGVycm9yLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl90ZGF0YSk6ICBSZW1vdmUgdW51c2VkIHN0cmluZ190YWJsZS4KLQkqIGJmZC5jIChiZmRfZXJybXNncyk6ICBBZGQgbm9fZGVidWdfc2VjdGlvbiBlcnJvciBtZXNzYWdlLgotCSogc2VjdGlvbi5jIChiZmRfbWFrZV9zZWN0aW9uKTogIFJldHVybiBOVUxMIG9uIGF0dGVtcHQgdG8gY3JlYXRlCi0JYSBzZWN0aW9uIHR3aWNlLgotCSogY29mZmNvZGUuaCAoYmZkX3N3YXBfcmVsb2NfaW4pOiAgSGFuZGxlIHJfdHlwZSBhbmQgcl9zaXplLgotCShiZmRfc3dhcF9hb3V0aGRyX2luKTogIEhhbmRsZSBsb3RzIG1vcmUgbWVtYmVycy4KLQkobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogIElmIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBzZWVuLAotCWp1c3QgcmV0dXJuIGZhbHNlIHJhdGhlciB0aGFuIG92ZXJ3cml0aW5nIGl0LgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApOiAgVW5kZXJzdGFuZCBpbmNvbWluZyBtYWdpYyBudW1iZXJzLgotCShjb2ZmX3NldF9mbGFncyk6ICBVbmRlcnN0YW5kIG91dGdvaW5nIG1hZ2ljIG51bWJlcnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogIG91dGdvaW5nIGFvdXRoZHIgbWFnaWMgIy4KLQkoYnVpbGRfZGVidWdfc2VjdGlvbik6ICBBZGQgZm4gZm9yIHJlYWRpbmcgZGVidWcgc3RyaW5nIHNlY3Rpb24uCi0JKGdldF9ub3JtYWxpemVkX3N5bXRhYik6ICBIYW5kbGUgc3ltYm9sIG5hbWVzIGluIGRlYnVnIHN0cmluZyBzZWN0aW9uLgotCVJlbW92ZSB1bnVzZWQgb2JqX3N0cmluZ190YWJsZS4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgSGFuZGxlIHJzNjAwMC1zcGVjaWZpYyBzdG9yYWdlIGNsYXNzZXMuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLCBOX1NFVCopOiAgQ2hlY2sgZm9yCi0JZXhpc3Rpbmcgc2VjdGlvbiBiZWZvcmUgbWFraW5nIG9uZS4KLQkqIGNwdS1yczYwMDAuYzogIE5ldyBmaWxlLgotCSogcnM2MDAwY29mZi5jOiAgTmV3IGZpbGUuCi0KLVRodSBPY3QgMjQgMDI6MDM6MjQgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiBBZGQgcGFydGlhbCBzdXBwb3J0IGZvciBFTEYgZm9ybWF0IGNvcmVmaWxlcy4gU3RpbGwgbmVlZHMKLQlzdXBwb3J0IGZvciBleHRyYWN0aW5nIHJlZ2lzdGVycyBmcm9tIGNvcmVmaWxlcy4KLQotCSogY29uZmlnL3QtbTY4ay1lbGY6ICBTZXQgREVGQVVMVF9WRUNUT1IgdG8gZWxmX2JpZ192ZWMuCi0KLQkqIGNvbmZpZy97aC1hbWl4LGgtZGd1eCxoLWlyaXgzLGgtdWx0cmEzfTogRm9yIHN5c3RlbXMgd2hlcmUKLQlSQU5MSUIgaXMgZGVmaW5lZCBhcyBlY2hvLCBzZW5kIHRoZSBvdXRwdXQgdG8gL2Rldi9udWxsIHRvIGhlbHAKLQlyZWR1Y2UgY2x1dHRlciBpbiB0aGUgb3V0cHV0IGZyb20gZG9pbmcgYSBtYWtlLgotCi1Nb24gT2N0IDIxIDE3OjQ4OjQ4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLXZheHVsdC5oOiAgUmVtb3ZlIG1hbGxvYy9mcmVlIGRlY2xzIGNvdmVyZWQgaW4gc3RkbGliLmguCi0JRml4IEhPU1RfUEFHRV9TSVpFIGFuZCBIT1NUX1NFR01FTlRfU0laRS4gIEZyb20gRGF2aWQgVGF5bG9yLgotCi1Nb24gT2N0IDIxIDA5OjM0OjExIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogbWFrZSBpdCBwYWQKLQlzZWN0aW9uIHNpemUgb3V0IGlmIHRoZXJlIGFyZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIHNvIHRoYXQgdGhlCi0JaW1hZ2Ugd2lsbCBiZSBvayBvbiBhIHN5c3RlbSB3aGVyZSBzZWN0aW9uIHBvc2l0aW9ucyBhcmUgd29ya2VkCi0Jb3V0IGJ5IGFjY3VtdWxhdGluZyBzaXplcyByYXRoZXIgdGhhbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMuCi0JKiB0YXJnZXRzLmMgKHByb3RvIHdyaXRlX2FybWFwKS4gQ2hhbmdlZCBvcmxfY291bnQgdG8gdW5zaWduZWQuCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlX2FsbF9kb25lKS4gQWRkZWQgc28gdGhhdCBnZW5lcmF0aXZlCi0JcHJvZ3JhbXMgbGlrZSBnYXMgY2FuIGNsb3NlIGEgYmZkIHdpdGhvdXQgY2F1c2luZyBiZmQgY29uZnVzaW9uLgotCSogbGliYmZkLmggKGNoYW5nZWQgYmVjdWFzZSBvZiBwcm90b3MpCi0JKiBhbWRjb2ZmLmM6IG1lc3NlZCB3aXRoIHRoZSB3YXkgdGhhdCBqbXAgZGlzcGxhY2VtZW50cyBhcmUKLQljYWxjdWFsYXRlZC4gVGhpcyBtYXkgbm90IHlldCBiZSB0b3RhbGx5IGNvcnJlY3QuCi0JKiBhcmNoaXZlLmMgKGNvZmZfd3JpdGVfYXJtYXApOiByZXdyb3RlIHRoZSB3YXkgdGhhdCByYW5saWJzIGFyZQotCXdyaXR0ZW4gb3V0LgotCSogY29mZmNvZGUuaCAoZml4dXBfc3ltYm9sX3ZhbHVlKTogbm93IGRvZXNuJ3QgY29yZSBkdW1wIGlmIGEgbm9uCi0JYWJzIHN5bWJvbCBoYXMgbm8gc2VjdGlvbiAobGlrZSBhIHJlZ2lzdGVyIHN5bWJvbCkuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKSBub3cgemVyb3MgYXV4ZW50IGJlZm9yZSBmaWxsaW5nIGl0IHVwIHRvIGhlbHAKLQl3aXRoIHNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMuCi0JKiBsaWJiZmQuYyAoYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQpOiBhZGRlZC4KLQotV2VkIE9jdCAxNiAyMjo1ODo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGEgbWFjcm8gc3RyZXJyb3IoKS4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBJZiBGQVNDSVNUX0ZET1BFTiwgdXNlICJyIiwgbm90ICJyKyIuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOiAgU3VwcHJlc3MKLQlhdHRlbXB0IHRvIHJlY292ZXIgY29tbWFuZCwgaWZkZWYgTk9fQ09SRV9DT01NQU5ELgotCSogaG9zdHMvaC10YWhvZS5oOiAgQWRkIEZBU0NJU1RfRkRPUEVOIGFuZCBOT19DT1JFX0NPTU1BTkQ7Ci0JcmV2YW1wIEhPU1RfKiwgZXRjLgotCSogaG9zdHMvaC1pMzg2di5oOiAgVXNlIDx1dGltZS5oPiwgbm90IDxzeXMvdXRpbWUuaD4sIHVubGlrZSBQT1NJWC4KLQotV2VkIE9jdCAxNiAxMjo0Mzo0OSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJnbWFwKTogVGhlIHNpemUgb2YgdGhlIHJhbmxpYiBzdHJ1Y3R1cmVzCi0Jc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBzaXplIGZpZWxkIGl0c2VsZi4KLQkqIGFvdXR4LmgsIGxpYmFvdXQuaCAoTkFNRShhb3V0LCBzaXplb2ZfaGVhZGVycykpOiAgVXNlCi0JYWRhdGEoYWJmZCktPmV4ZWNfYnl0ZXNfc2l6ZSBmaWVsZCBpbnN0ZWFkIG9mIGNvbnN0YW50IG1hY3JvLAotCWJlY2F1c2UgYW91dHguaCBjb21waWxlcyB0byBhIHNpbXBsZSAubyBmaWxlIHNoYXJlZCBieQotCWFsbCAzMi1iaXRzIGEub3V0IHRhcmdldHMuCi0KLVdlZCBPY3QgMTYgMTE6MTE6MDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IGkzODYtc2NvLXN5c3YuCi0JKiBib3V0LmM6ICBSZW1vdmUgdW51c2VkIGk5NjBfYWxpZ247IGxpbnQgZHVtbXkgY29yZSBmaWxlIGhhbmRsZXJzLgotCSogY3B1LWg4MzAwLmM6ICBsaW50LgotCi0JKiBob3N0LWFvdXQuYzogIE5ldyBzdHJhdGVneS4gIFdlIHVzZSBjb21tb24gY29kZSwgaW5jbHVkZSBmaWxlcywKLQlhbmQgZGF0YSBzdHJ1Y3R1cmVzIHRvIGhhbmRsZSB0aGUgZmlsZSwgYnV0IHNldCBhIGZldyBwYXJhbWV0ZXJzCi0JZnJvbSB0aGUgaG9zdCdzIGNvbmZpZyBmaWxlIChwYWdlIHNpemUsIHRleHQgc3RhcnQgYWRkciwgZXRjKS4KLQkqIGxpYmFvdXQuaDogIERlZmluZSBIUCBCU0QgbWFjaGluZSB0eXBlcy4KLQkqIGFvdXRmMS5oOiAgSGFuZGxlIHJlYWRpbmcgYS5vdXRzIHdpdGggdGhlc2UgdHlwZXMuCi0KLQkqIHRyYWQtY29yZS5jOiAgUGFzcyB0aGUgdS51X2FyMCB2YWx1ZSBhcyB0aGUgbmVnYXRpdmUgb2YgdGhlCi0JdmlydHVhbC1tZW1vcnktYWRkcmVzcyBvZiB0aGUgLnJlZyBzZWN0aW9uLiAgV2UgY2FuJ3QganVzdCBtYWtlIGEKLQlzZWN0aW9uIGZvciAiYWxsIHRoZSByZWdzIGFuZCBub3RoaW5nIGVsc2UiIGJlY2F1c2Ugb25seSBHREIga25vd3MKLQlleGFjdGx5IHdoZXJlIHRoZSByZWdzIGFyZSAoc2NhdHRlcmVkIGFyb3VuZCB0aGUgdXBhZ2UgYW5kIHN0YWNrKS4KLQlDbGVhbiB1cCBtZW1vcnkgYWxsb2NhdGlvbi4gIFJlbW92ZSBiaWctIGFuZCBsaXR0bGUtZW5kaWFuCi0JdmVjdG9ycywgcmVwbGFjZSB3aXRoIHNpbmdsZSB2ZWN0b3I7IHRoaXMgb25seSBydW5zIG9uIHRoZSBob3N0LAotCWluIGhvc3QgYnl0ZSBvcmRlci4gIFJlcGxhY2UgYnl0ZXN3YXAgcm91dGluZXMgd2l0aCBhYm9ydHMgaW4gY2FzZQotCWFueW9uZSBjYWxscyB0aGVtLgotCSogdGFyZ2V0cy5jOiAgVGhlcmUncyBvbmx5IG9uZSB0cmFkX2NvcmVfdmVjIG5vdy4KLQkqIGFvdXRmMS5oIChzdW5vc19jb3JlX2ZpbGVfcCk6ICBWTUEgb2YgLnJlZyogbm93IG5lZWRzIHRvIGJlIDAuCi0KLVR1ZSBPY3QgMTUgMDg6Mjk6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtYW1peC5oIChmcmVlKTogIEZpeCBwcm90b3R5cGUuCi0KLQkqIGFvdXR4Lmg6ICBEb24ndCB1c2UgTlVMTCBhcyBhbiBpbnRlZ2VyLCBmb3IgYnJhaW5kZWFkIHN5c3RlbXMKLQl0aGF0IGRlY2xhcmUgaXQgYXMgKHZvaWQgKikwLiAgKEZyb20gUGV0ZXIgU2NoYXVlci4pCi0KLU1vbiBPY3QgMTQgMTc6MjA6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBBZGQgcGFyZW50aGVzZXMgdG8gYXZvaWQgcmVwb3J0ZWQKLQlwcm9ibGVtIHdpdGggYmFkIFVsdHJpeCBzeXN0ZW0gaGVhZGVycy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykpOiAgVHJ5IHRvIGhhbmRsZSB0aGUKLQl2YXJpb3VzIGtpbmRzIG9mIGFsaWdubWVudHMgZm9yIHRoZSB2YXJpb3VzIGtpbmRzIG9mCi0JbWFnaWMgbnVtYmVycy4KLQotTW9uIE9jdCAxNCAxNDoyMzoxMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlOiAgRG9uJ3QgYXNzdW1lIC4gaXMgb24gdGhlIHBhdGggKGZyb20gSmFtZXMgQ2xhcmspLgotCi1GcmkgT2N0IDExIDIyOjQ1OjE0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Z3MuCi0JKiB0YXJnZXRzLmM6ICBEZWNsYXJlIHRyYWRfY29yZSB2ZWN0b3JzIGV4dGVybi4KLQotRnJpIE9jdCAxMSAxMzowMzowMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogTW92ZWQgQUxJR04gbWFjcm8gdG8gbGliYmZkLmguIFJlbW92ZWQgaTk2MF9hbGlnbi4KLQkqIGxpYmJmZC5oOiBNb3ZlZCBBTElHTiBtYWNybyBoZXJlLgotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IFJlcGxhY2UgaTk2MF9hbGlnbiBieSBhbGlnbl9wb3dlci4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiAgQWRkZWQgZmllbGRzIHBhZ2Vfc2l6ZSwKLQlzZWdtZW50X3NpemUgYW5kIGV4ZWNfYnl0ZXNfc2l6ZS4gIFRoZXNlIGhlbHAgZ2VuZXJpYyBjb2RlCi0JKGluIGFvdXR4LmggYW5kIGxpYmFvdXQuaCkgdG8gZmlndXJlIG91dCB3aGVyZSB0byBhbGlnbgotCXRoZSB2YXJpb3VzIHNlZ21lbnRzIGluIGEgZGVtYW5kIHBhZ2VkIGZpbGUuCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUik6ICBVc2UgbmV3IChzdHJ1Y3QgYW91dGRhdGEpIGZpZWxkcwotCXRvIGRlY2lkZSBpZiB0aGUgZXhlYyBoZWFkZXIgY291bnRzIGluIGFfdGV4dCAodGV4dCBzZWdtZW50IHNpemUpLgotCUFsc28sIGFzc3VtZSBEX1BBR0VEIGZsYWcgaXMgc2V0OyBkb24ndCBzZXQgaXQgaGVyZS4KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiBBZGQgaW5pdGlhbGl6YXRpb24gb2YKLQlhZGF0YSBmaWVsZHMgcGFnZV9zaXplLCBzZWdtZW50X3NpemUsIGFuZCBleGVjX2J5dGVzX3NpemUuCi0JKiBob3N0LWFvdXQuYyAoTkFNRShob3N0X2FvdXQsIGNhbGxiYWNrKSBhbmQKLQlOQU1FKGhvc3RfYW91dCxta29iamVjdCk6IERpdHRvLgotCSogaTM4NmFvdXQuYyAoYW91dDM4Nl9jYWxsYmFjaykgYW5kIG5ldyBhb3V0Mzg2X21rb2JqZWN0KTogRGl0dG8uCi0JKiBuZXdvczMuYyAobmV3c29zM19jYWxsYmFjaykgYW5kIG5ldyBuZXdzb3NfbWtvYmplY3QpOiBEaXR0by4KLQkqIGFvdXRmMS5jIChzdW5vczRfY2FsbGJhY2spIGFuZCBuZXcgc3Vub3NfbWtvYmplY3QpOiBEaXR0by4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogRG9uJ3Qgc3VidHJhY3QKLQlFWEVDX0JZVEVTX1NJWkUgZnJvbSB0aGUgYV90ZXN0IHNpemU7IHRoaXMgaXMgb25seSBhcHByb3ByaWF0ZQotCWZvciBzb21lIHN5c3RlbXMgKG1haW5seSBzdW5vcyksIHNvIGRvIGl0IGluIHRoZSBjYWxsYmFjayBpbnN0ZWFkLgotCVNhbWUgcm91dGluZTogQWRkIHN0dWZmIHRvIHRoZSBUSElTX0lTX09OTFlfRE9DVU1FTlRBVElPTiBjb21tZW50LgotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIHRoZSB3YXkKLQlmaWxlcG9zIGFuZCBzaXplIG9mIHNlY3Rpb25zIGFyZSBjYXJyaWVkIG91dCB0byBzdXBwb3J0Ci0Jb2xkZXIgc3R5bGVzIG9mIGRlbWFuZCBwYWdlZCBleGVjdXRhYmxlcy4KLQotCi1GcmkgT2N0IDExIDEyOjMzOjM2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IEFkZGVkIG1vcmUgbWFjcm9zIHRvIENPRkZfU1dBUF9UQUJMRS4KLQkqIGJmZC5jOiBBZGRlZCBtYWNyb3MgdG8gZW5hYmxlIGdhcyB0byBzd2FwIGNvZmYgcmVjb3Jkcy4KLQkqIGNvZmZjb2RlLmg6IE1ha2UgdGhlIGNvZmZfc3dhcF8qX291dCByb3V0aW5lcyByZXR1cm4gdGhlIG51bWJlcgotCW9mIGJ5dGVzIHN3YXBwZWQsIGFuZCBjbGVhbmVkIHVwIHRoZWlyIHByb3RvdHlwZXMuCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGVibW9uL2NvZmYgc3VwcG9ydAotCSogZWNvZmYuYzogQ2hhbmdlZCBudWxsIGRlZmluaXRpb25zIG9mIGNvZmZfc3dhcF8qX291dCB0byBjb25mb3JtCi0JdG8gbmV3IHByb3RvdHlwZXMKLQkqIHRhcmdldHMuYzogQWRkZWQgbmV3IGVudHJ5IHBvaW50cyBmb3IgY29mZiBzd2FwcGluZwotCi1GcmkgT2N0IDExIDAzOjAxOjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUmVzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBzY2hlbWUgZm9yIGJmZCwgYmludXRpbHMsIGxkLgotCi0JKiBpbmNsdWRlL3N5cy9oLSouaDogIE1vdmUgdG8gYmZkL2hvc3RzL2gtKi5oLgotCSogY29uZmlndXJlLmluOiAgUmV2aXNlIHRvIHN5bWxpbmsgc3lzZGVwLmggdG8gaG9zdHMvaC14eHguaC4KLQlDaGFuZ2Ugc29tZSBjb25maWcgbmFtZXMgdG8gbWF0Y2ggb3RoZXIgZGlycy4KLQkqICouYzogIEluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLCBzbyBhbnNpZGVjbCBhbmQgUFJPVE8oKQotCWdldCBkZWZpbmVkIGZpcnN0LgotCSogTWFrZWZpbGUuaW46ICBVc2UgLUkuIHRvIGdldCBzeXNkZXAuaC4gIFJlbW92ZSByZWZzIHRvCi0JLi4vaW5jbHVkZS9zeXNkZXAuaC4KLQkqIGNwdS1pOTYwLmM6ICBTdHJuY21wIG5lZWRlZCBhIGxlbmd0aCBhcmcuCi0JKiBlY29mZi5jOiAgRG9uJ3QgZXZlciBjYWxsIHRyYWRfdW5peF9jb3JlX2ZpbGVfcCBmcm9tIGhlcmUuCi0JKiBpMzg2YW91dC5jOiAgUmVtb3ZlIGRlYWQgTl9UWFRPRkYgb3ZlcnJpZGUuCi0JKiB0cmFkLWNvcmUuYzogIERvbid0IGRpc2FibGUgdGhlIHdob2xlIGZpbGUgaWYgU1VONF9TWVMuCi0JKiBjb25maWcvOiAgUmVuYW1lIHNvbWUgY29uZmlnIGZpbGVzIHRvIG1hdGNoIHVwIGgtKi5oIG5hbWVzLgotCVJlbW92ZSBhbGwgdGhlIEhPU1RfU1lTIGRlZmluaXRpb25zIGZyb20gdGhlIGNvbmZpZyBmaWxlcy4KLQkqIGhvc3RzL2gtYW1peC5oLCBoLWkzODZ2Lmg6ICBEZWZpbmUgUE9TSVhfVVRJTUUsIG5vdCBVU0cuCi0JKiBob3N0cy9oLWhwOTAwMC5oOiAgUmVtb3ZlIFVTRyBjb21tZW50LgotCSogaG9zdHMvaC1yczYwMDAuaDogIEluY2x1ZGUgPHN0ZGxpYi5oPiBmb3IgbWFsbG9jLgotCSogaG9zdHMvaC1uZXdzLmgsIGgtc3BhcmMtNjQuaDogIE5ldyBjb25maWcgZmlsZXMgdGhhdCBoYWQKLQlwcmV2aW91c2x5IGJlZW4ga2x1ZGdlZCBpbiB0aGUgPHN5c2RlcC5oPiBmaWxlLgotCi1UaHUgT2N0IDEwIDE3OjU0OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvKjogIHRyYWQtY29yZSBzdXBwb3J0IGlzIEhPU1QgZGVwZW5kZW50LCBub3QgdGFyZ2V0Ci0JZGVwZW5kZW50LiAgVGFyZ2V0IGNvbmZpZyBmaWxlcyBvbmx5IHNldCBERUZBVUxUX1ZFQ1RPUiBhbmQvb3IKLQlvdGhlciB2ZWN0b3IgZWxlbWVudHMuICBFeGNlcHRpb246ICB3aGVuIGhvc3QtYW91dC5jIGlzIGluIHVzZSwKLQlpbiB3aGljaCBjYXNlIHdlJ3JlIGZvcmNlZCB0byBhc3N1bWUgd2UncmUgbmF0aXZlIChocCwgdmF4LAotCXRhaG9lKS4gIFJlbmFtZSBYREVQRklMRVMgdG8gSERFUEZJTEVTLgotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgWERFUEZJTEVTLgotCSogY29uZmlnL2gtc3VuKjogIERvbid0IGZvcmNlIHN0YXRpYyBsaW5raW5nLgotCSogdHJhZC1jb3JlLmM6ICBEb2N1bWVudCBob3cgdG8gdXNlIGl0IG5vd2FkYXlzLgotCSogaTM4NmFvdXQuYywgbmV3c29zMy5jOiAgQ2xlYW4gdXAuCi0JKiBpMzg2Y29mZi5jOiAgQWxsb3cgMzg2IGNvZmYgZmlsZXMgdG8gYmUgdXNlZCBhcyBjb3JlIGZpbGVzIHRvbwotCShmb3IgcmVhZGluZyBjb3JlIGZpbGVzIGZyb20gZW1iZWRkZWQgc3lzdGVtcykuCi0KLVR1ZSBPY3QgIDggMTU6MzA6MzkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIEFkZCBpMzg2YW91dC5jIGZvciBhLm91dCBzdXBwb3J0IG9uIHRoZSBpMzg2LgotCi1UdWUgT2N0ICA4IDEyOjE4OjU0IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMsIHNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmM6IGNvcnJlY3QgaW5mby1ub2RlCi0Jc3RydWN0dXJlIGluICpkb2MqIGNvbW1lbnRzLgotCWRvYy9NYWtlZmlsZTogc3RvcCBoaWRpbmcgY29tcGxhaW50cyBmcm9tIG1ha2VpbmZvLgotCi1TdW4gT2N0ICA2IDE5OjEwOjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICguLi5zb21lX2FvdXRfb2JqZWN0X3ApOiAgVGFrZSBhIHRoaXJkIHBhcmFtZXRlciwKLQl0aGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3QsIGFuZCBhdm9pZCBldmVyIGxvb2tpbmcgYXQgYW4KLQlleHRlcm5hbF9leGVjLiAgQWxsIGNhbGxlcnMgY2hhbmdlZCB0byByZWFkIHRoZSBlbnRpcmUKLQlleHRlcm5hbF9leGVjIHN0cnVjdCwgc3dhcCBhbmQgY2hlY2sgaXRzIG1hZ2ljIG51bWJlciwKLQlzd2FwIGluIHRoZSB3aG9sZSBzdHJ1Y3R1cmUsIGFuZCBwYXNzIHRoZSBzd2FwcGVkLWluIHZlcnNpb24gdG8KLQlzb21lX2FvdXRfb2JqZWN0X3AuCi0JKiBib3V0LmM6ICBCcmluZyBpbnRvIG1vZGVybiBlcmEuICBVc2Ugc2luZ2xlIF9vYmplY3RfcCByb3V0aW5lCi0JZm9yIGJpZy0gYWFuZCBsaXR0bGUtZW5kaWFuLiAgUHJvdmlkZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwKLQlleGVjIGhlYWRlciBzdHJ1Y3RzLiAgVXNlIHNlcGFyYXRlIHN3YXAtaW4gYW5kIHN3YXAtb3V0IHJvdXRpbmVzLgotCi0JKiBsaWJhb3V0Lmg6ICBNb3ZlIHN0cnVjdCBpbnRlcm5hbF9leGVjIGZyb20gLi4vaW5jbHVkZS9hb3V0NjQuaAotCXRvIGhlcmUuICBBZGQgb2JqX3N5bWJvbF9lbnRyeV9zaXplIHRvIHN0cnVjdCBhb3V0ZGF0YS4KLQkqIGFvdXR4LmggKC4uLnNvbWVfYW91dF9vYmplY3RfcCk6ICBTZXQgb2JqX3N5bWJvbF9lbnRyeV9zaXplLgotCi0JKiAuLi9pbmNsdWRlL2FvdXQ2NC5oOiAgQ2hhbmdlIEVYVEVSTkFMX0xJU1RfU0laRSB0bwotCUVYVEVSTkFMX05MSVNUX1NJWkUuICBDYWxsZXJzIGNoYW5nZWQuCi0KLUZyaSBPY3QgIDQgMTg6MTg6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgUmVtb3ZlIHN0cmVycm9yKCkgdG8gbGliaWJlcnR5LgotCi0JKiBlbGYuYzogIFJlbW92ZSBlbGZfc2V0X3NlY3Rpb25fY29udGVudHMsIHVzZSBnZW5lcmljIG9uZS4gIExpbnQuCi0JKiBsaWJiZmQtaW4uaCwgbGliYmZkLmM6ICBBZGQgYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMuCi0JKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfe2dldCxzZXR9X3NlY3Rpb25fY29udGVudHMpOiAgQ2hlY2sgdGhhdAotCWxhc3QgYnl0ZSBvZiB0cmFuc2Zlciwgbm90IGZpcnN0IGJ5dGUsIGlzIHdpdGhpbiB0aGUgc2VjdGlvbi4KLQotCSogaG9zdC1hb3V0LmM6ICBSZW1vdmUgYEJTRCcgYXJjaGl2ZSBzdXBwb3J0LiAgTGludC4KLQotCSogYXJjaHVyZXMuYzogUmVuYW1lIGBzdHJ1Y3QgYmZkX2FyY2hfaW5mb19zdHJ1Y3QnIHRvIGBzdHJ1Y3QKLQliZmRfYXJjaF9pbmZvJy4gIFJlbmFtZSBgdHlwZWRlZiBiZmRfYXJjaF9pbmZvX3N0cnVjdF90eXBlJyB0bwotCWBiZmRfYXJjaF9pbmZvX3R5cGUnLiAgQWxsIHVzZXMgY2hhbmdlZC4KLQkqIHJlbG9jLmM6ICBSZW5hbWUgYGJmZF9yZWxvY19zdGF0dXNfZW51bV90eXBlJyB0bwotCWBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUnLiAgUmVuYW1lIGBiZmRfcmVsb2NfY29kZV9lbnVtX3JlYWxfdHlwZScKLQl0byBgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlJy4gIChUaGlzIHNlZW1zIHRvIGJlIGEgbWlzbm9tZXIsCi0JaXQgbmVlZHMgYSBiZXR0ZXIgbmFtZS4pICBBbGwgdXNlcyBjaGFuZ2VkLgotCSogdGFyZ2V0cy5jOiAgUmVuYW1lIGBlbnVtIHRhcmdldF9mbGF2b3VyX2VudW0nIHRvIGBlbnVtCi0JdGFyZ2V0X2ZsYXZvdXInLCBhbmQgcmVtb3ZlIHRoZSBgX2VudW0nIGZyb20gYWxsIG9mIHRoZSBlbnVtCi0JdmFsdWVzIHRoZW1zZWx2ZXMuICBBbGwgdXNlcyBjaGFuZ2VkLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9oLWkzODZtYWNoOiAgaTM4NiBtYWNoIGhvc3QuCi0JKiBjb25maWcvdC1pMzg2LWFvdXQ6ICBVc2UgaG9zdC1hb3V0LmMuCi0KLQkqIHRyYWQtY29yZS5jOiAgR2l2ZSBpdCBpdHMgb3duIHh2ZWMncyB0byBtYWtlIGl0IGluZGVwZW5kZW50Ci0Jb2Ygb3RoZXIgZmlsZSBmb3JtYXRzLgotCSogZWNvZmYuYywgaG9zdC1hb3V0LmM6ICBSZW1vdmUgcmVmcyB0byB0cmFkLWNvcmUuCi0JKiBjb25maWcvdC1kZWMzMTAwLCB0LWhwMzAwYnNkLCB0LXRhaG9lLCB0LXZheDogIERlZmluZSBUUkFEX0NPUkUuCi0JKiB0YXJnZXRzLmM6ICAjaWZkZWYgVFJBRF9DT1JFLCBpbmNsdWRlIGl0IGluIHRoZSB2ZWN0b3IuCi0KLUZyaSBPY3QgIDQgMTc6Mzg6MDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jOiBFeHRlbmRlZCBORVdIT1dUTyBtYWNybwotCSogaWVlZS5jOiBDaGFuZ2VkIHRoZSB3YXkgOGJpdCBwY3JlbCBpcyBkb25lCi0JKiBjcHUtaDgzMDAuYzogZ290IHRoZSByZWdpc3RlcnMgaW4gdGhlIHJpZ2h0IG9yZGVyCi0KLVRodSBPY3QgIDMgMTk6Mzk6NTUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiAgZW51bSBib29sZWFuID0+IGVudW0gYmZkX2Jvb2xlYW4gZm9yIFNWUjQuICBHdW1ieSdzCi0JcHJlZGljdGlvbiBpcyB2aW5kaWNhdGVkIQotCi0JKiBiZmQtaW4uaCwgbGliYmZkLWluLmgsIGRvYy9NYWtlZmlsZSwgZG9jL3RvbGliYmZkLCBkb2MvaW50b2JmZDoKLQlSZW1vdmUgcmVmcyB0byBob3d0by5jLCBzaW5jZSBTdGV2ZSBmb3Jnb3QuCi0KLVRodSBPY3QgIDMgMDc6NDk6MjEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogdG9vayB0aGUgYWJvcnQgb3V0IG9mIHNldF9hcmNoX21hY2ggc28gdGhhdCBvYmpkdW1wIC1pIHdpbGwKLQlzdGlsbCB3b3JrLiBOb3cgYWxsb3dzIGFueSBhcmNoaXRlY3R1cmUvbWFjaGluZSB0byBiZSBzZXQuCi0KLVdlZCBPY3QgIDIgMTM6NTA6MzUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBob3d0by5jIGRlbGV0ZWQgYW5kIG1vdmVkIGNvZGUgdG8gcmVsb2MuYwotCi0JKiBsaWJiZmQuaCwgbGliYmZkLWluLmggcmVtb3ZlZCAkaWQgc3R1ZmYgZm9yIHJlYWwKLQotCSogY3B1LWg4MzAwLmMgTWFkZSBpdCBtYXRjaCB2YXJpb3VzIGRpZmZlcmVudCBzcGVsbGluZ3Mgb2YgaDgzMDAuCi0KLQkqIGFyY2h1cmVzLmM6IFRvb2sgb3V0IHRoZSBmaXJzdCBjaGFyIGZpbHRlciB3aGljaCBtYWRlIGl0IG9ubHkKLQlsb29rIGZvciBhIGNwdS9hcmNoIG1hdGNoIHdoZW4gdGhlIGZpcnN0IGNoYXJzIG9mIHN1cHBsaWVkIGFuZAotCXRlc3RlZCBuYW1lcyB3ZXJlIHRoZSBzYW1lLgotCi0JKiB0YXJnZXRzLmMgcmVtb3ZlZCBvYXN5cyBzdHVmZiwgcGVuZGluZyBzb21lb25lIHRvIGZpeCB0aGUgYnVncwotCWluIGl0LgotCi0KLVR1ZSBPY3QgIDEgMTI6Mjk6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYywgZWxmLmM6ICBBZGQgcHJlbGltaW5hcnkKLQlFTEYgc3VwcG9ydCBnb29kIGVub3VnaCBmb3IgR0RCLgotCSogY29uZmlndXJlLmluLCBjb25maWcvaC1hbWl4LCBjb25maWcvdC1tNjhrLWVsZjogIEhhbmRsZQotCW02OGstY2JtLXN2cjQgaG9zdCBhbmQgdGFyZ2V0LgotCSogY29uZmlnL3QtbTY4ay1jb2ZmLCB0LW04OGstY29mZiwgdC1tODhrLWFvdXQ6ICBNYWtlIGZpbGVzIG5vbmVtcHR5Ci0Jc28gYGRpZmYnIGFuZCBgcGF0Y2gnIGNhbiBjb3BlLgotCi1UdWUgT2N0ICAxIDExOjI0OjMxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYzogcmVtb3ZlZCB0ZXhpbmZvIGVycm9yCi0KLQkqIGluaXQuYzogYWRkZWQgdGV4aW5mbyBob29rcywgYW5kIHJlbW92ZWQgaW5pdGlhbGl6YXRpb24gZXJyb3IKLQltZXNzYWdlLgotCi0JKiBsaWJjb2ZmLWluLmgsIGxpYmJmZC1pbi5oIHJlbW92ZWQgJGlkIGZpZWxkIHNvIGN2cyBjYW4gbWVyZ2UKLQl3aXRob3V0IGNvbXBsYWludHMuCi0KLVR1ZSBPY3QgIDEgMDU6MDI6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNwdS1pOTYwLmM6ICBBdm9pZCBudW1lcmljYWwgY291bnQgb2YgaW5pdGlhbGl6ZXJzLgotCi0JVmF4IFVsdHJpeCBjaGFuZ2VzIGZyb20gRGF2aWQgVGF5bG9yIDx0YXlsb3JAdGhpbmsuY29tPjoKLQkqIGhvc3QtYW91dC5jOiAgTWFrZSBsaXR0bGUtZW5kaWFuIHZlY3RvciByZWFsbHkgbGl0dGxlLWVuZGlhbi4KLQkqIGNvbmZpZ3VyZS5pbjogIFNlcGFyYXRlIHZheCBhbmQgdGFob2UgY2FzZXMsIGhhbmRsZSB1bHRyaXguCi0JKiBjb25maWcvdC12YXg6ICBBZGQgdHJhZC1jb3JlLm8uCi0JKiBjb25maWcvaC12YXh1bHQ6ICBOZXcgaG9zdCBzeXN0ZW0uCi0KLU1vbiBTZXAgMzAgMTU6MTM6NDYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCBWRVJTSU9OLCBjaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMC4xOCwgdGhpcyBtYWtlcyBhCi0JZ2FwLCBidXQgbm93IGlzIHRoZSBzYW1lIGFzIHRoZSBsaW5rZXIgdmVyc2lvbiBudW1iZXIuCi0KLQkqIGNwdS1hMjlrLmMsIGNwdS1pMzg2LmMsIGNwdS1tNjhrLmMsIGNwdS1taXBzLmMsIGNwdS12YXguYywKLQljcHUtaDgzMDAuYywgY3B1LWk5NjAuYywgY3B1LW04OGsuYywgY3B1LXNwYXJjLmM6IGFkZGVkLiBUaGVzZQotCWZpbGVzIHdpbGwgZXZlbnR1YWxseSBjb250YWluIHByb2Nlc3NvciBzcGVjaWZpYyBiaXRzIGZvciBiZmQsCi0JbGlrZSBzdHJhbmdlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYW5kIGRpcy9hc3NlbWJseS4gIFNvIGZhciBvbmx5Ci0JdGhlIEg4IGhhcyBiZWVuIGV2ZW4gcGFydGlhbGx5IGRvbmUuICBUaGlzIHdvcmsgYWxzbyB0aWVzIGluIHdpdGgKLQl0aGUgY2hhbmdlIGluIGhhbmRsaW5nIGFyY2hpdGVjdHVyZXMuCi0KLQkqIGFtZGNvZmYuYzogKGEyOWtfcmVsb2MpIGZpeCBlcnJvciBtZXNzYWdlLgotCi0JKiBhb3V0LWYxLmg6IChjaG9vc2VfcmVsb2Nfc2l6ZSkgbm93IGNhbGxzIGJmZF9nZXRfYXJjaCB0bwotCWRpc2NvdmVyIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGJmZC4gKHN1bm9zNF9jYWxsYmFjaykgY2FsbHMgdGhlCi0JZnVuY3Rpb24gYmZkX3NldF9hcmNoX21hY2ggcmF0aGVyIHRoYW4gc3R1ZmZpbmcgc3R1ZmYgZGlyZWN0bHkKLQlpbnRvIHRoZSBiZmQuIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSwgY2hhbmdlZCBuYW1lcyBvZgotCWFjY2Vzc29yIGZ1bmN0aW9ucy4KLQotCSogYW91dHguaDogKHNldF9hcmNoX21hY2gpIG5vdyBjYWxscyBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIHRvCi0Jc2V0dXAgdGhlIGVudmlyb25tZW50LgotCi0JKiBhcmNoaXZlLmM6IChiZmRfc2x1cnBfY29mZl9hcm1hcCkgY29mZiBhcmNoaXZlcyBhbHdheXMgaGF2ZSB0aGUKLQloZWFkZXJzIGluIGJpZyBlbmRpYW4gZm9ybWF0LCByZWdhcmRsZXNzIG9mIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCi0JaG9zdCBvciB0YXJnZXQuCi0KLQkqIGFyY2h1cmVzLmM6IHRvdGFsbHkgY2hhbmdlZC4gTm93IGFuIGFyY2hpdGVjdHVyZSBpcyByZXByZXNlbnRlZAotCXdpdGggYSBwb2ludGVyIHRvIGFuIGluZm8gc3RydWN0dXJlIHJhdGhlciB0aGFuIGFuIGVudW1lcmF0ZWQgdHlwZQotCWFuZCBhIGxvbmcuIFRoZSBvbGQgaW5mbyBpcyBhdmFpbGFibGUgYXMgdHdvIGVsZW1lbnRzIGluIHRoZQotCXN0cnVjdHVyZS4gIEZ1dHVyZSBlbmhhbmNlbWVudHMgdG8gYXJjaGl0ZWN1cmUgc3VwcG9ydCB3aWxsCi0JaW52b2x2ZSBwb2ludGVycyB0byBtZXRob2RzIGJlaW5nIHBsYWNlZCBpbnRvIHRoZSBpbmZvIHN0cnVjdHVyZS4KLQotCSogYmZkLmM6IGNoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGJmZCBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcKLQlhcmNoaXRlY3R1cmUgc3R1ZmYuCi0KLQkqIGJvdXQuYzogKGJfb3V0X3NldF9hcmNoX21hY2gpIGNoYW5nZWQgdG8gdXNlIHRoZSBuZXcKLQlhcmNoaXRlY3R1cmUgbWVjaGFuaXNtLgotCi0JKiBjb2ZmY29kZS5oOiAoY29mZl9zZXRfYXJjaF9tYWNoLCBjb2ZmX3NldF9mbGFncykgY2hhbmdlZCB0byB1c2UKLQl0aGUgbmV3IGFyY2hpdGVjdHVyZSBtZWNoYW5pc20uCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgaDggc3R1ZmYuCi0KLQkqIGllZWUuYzogdG9vIG1hbnkgY2hhbmdlcyB0byBub3RlLiAgTm93IGllZWUgZmlsZXMgd3JpdHRlbiB3aXRoCi0JYmZkIGdhcyBhbmQgbGQgY2FuIGJlIHJlYWQgYnkgZ2xkIGFuZCBpZWVlIG9ubHkgbGlua2VycyBhbmQKLQlzaW11bGF0b3JzLgotCi0JKiBsaWJiZmQuYywgbGliYmZkLmg6IGNoYW5nZWQgcHJvdG90eXBlIG9mIGJmZF93cml0ZS4KLQotCSogbmV3c29zMy5jOiAobmV3b3MzX2NhbGxiYWNrKSBub3cgY2FsbHMgYmZkX3NldF9hcmNoX21hY2ggcmF0aGVyCi0JdGhhbiBmaXhpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4KLQotCSogb2FzeXMuYzogKG9hc3lzX29iamVjdF9wKSBub3cgY2FsbHMgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCByYXRoZXIKLQl0aGFuIGZpeGluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5LgotCi0JKiBvcG5jbHMuYzogKG5ld19iZmQpIG1ha2VzIHN1cmUgdGhhdCBiZmRfaW5pdCBoYXMgYmVlbiBjYWxsZWQKLQliZWZvcmUgb3BlbmluZyBhIGJmZC4KLQotCSogc3JlYy5jOiAoc3JlY19zZXRfYXJjaF9tYWNoKSBub3cgY2FsbHMgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCXJhdGhlciB0aGFuIGZpeGluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5LgotCi0JKiB0YXJnZXRzLmM6ICh0YXJnZXRfdmVjdG9yKSBub3cgYnkgZGVmaW5pbmcgU0VMRUNUX1ZFQ1MgKHBlcmhhcHMKLQlpbiB0aGUgdC9obWFrZSBmaWxlKSBhIHVzZXIgY2FuIHNlbGVjdCB3aGljaCBiYWNrZW5kcyB0aGV5IHdhbnQKLQlsaW5rZWQgd2l0aCBiZmQgd2l0aG91dCBjaGFuZ2luZyB0aGUgc291cmNlLgotCi0JKiBpbml0LmM6IG5ldywgbG9va3MgYWZ0ZXIgaW5pdGlhbGl6aW5nIG1vZHVsZXMuCi0KLQkqIGhvd3RvLmM6IGZvciBmdXR1cmUgdXNlLCB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHdvcmsgb3V0Ci0Jd2hhdCBjb29raWUgdG8gdXNlIGFzIGEgaGFuZGxlIG9uIGEgcmVsY29hdGlvIGhvd3RvLgotCi1Nb24gU2VwIDMwIDEzOjMxOjE1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzcmVjLmM6ICBCZXR0ZXIgZXJyb3IgY2hlY2tpbmcsIHBhcnRseSBmcm9tIFBldGVyIFNjaGF1ZXIuCi0JKHNyZWNfb2JqZWN0X3ApOiAgQXZvaWQgYXNzdW1pbmcgYW55IGZpbGUgdGhhdCBzdGFydHMgd2l0aCAnUycgaXMKLQlhbiBTLXJlY29yZCBmaWxlISAgKENoZWNrIGZvciAzIHVwcGVyY2FzZS1oZXggZGlnaXRzIGFmdGVyIGl0LikKLQkoSVNIRVgpOiAgRGVmaW5lIG5ldyBtYWNybyBmb3IgY2hlY2tpbmcgc3VwcG9zZWRseSBoZXggY2hhcmFjdGVycy4KLQkocGFzc19vdmVyKTogIFRyZWF0IGFzIEVPRiBhbnkgUy1yZWNvcmQgbGluZSB0aGF0OgotCSAgICAqICBkb2Vzbid0IGhhdmUgaGV4IGluIGVpdGhlciBzaXplIGNoYXJhY3RlcgotCSAgICAqICBwcm9kdWNlcyBhIHNpemUgbGFyZ2VyIHRoYW4gMHg3RgotCSAgICAqICBoYXMgYW4gdW5yZWNvZ25pemVkIHR5cGUgbnVtYmVyCi0KLVRodSBTZXAgMjYgMTU6Mjc6MjkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oLCBhb3V0eC5oLCBib3V0LmMsIGNvZmZjb2RlLmgsIGhvc3QtYW91dC5jLCBvYXN5cy5jLAotCW9wbmNscy5jOiAgTGludCAoc2FiZXIgYWN0dWFsbHkpLgotCi1UaHUgU2VwIDI2IDExOjI0OjI0IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUlMpOiBTZXQgaGVhZGVyJ3MgYV90ZXh0IGZpZWxkIGFsd2F5cy4KLQkqIG5ld3NvczMuYzogRml4ZWQgdHdvIHR5cGVzOiBuZXdvczMgLT4gbmV3c29zMy4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBGaXggcGMtcmVsYXRpdmUgcmVsb2NhdGlvbgotCXRvIHVzZSBjb3JyZWN0IHNlZ21lbnQuCi0KLU1vbiBTZXAgMjMgMTg6MjQ6MzQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHByaW50X3N5bWJvbCk6ICBIYW5kbGUgbWlzc2luZyBzeW1ib2wtPm5hbWUuCi0KLUZyaSBTZXAgMjAgMTI6MjY6MDEgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN3YXBjb3JlX3NwYXJjKTogIENoYW5nZSBuYW1lIG9mIFVTUlNUQUNLLCBmaXggY29tbWVudAotCWF0IHRvcCBvZiByb3V0aW5lLgotCi1UdWUgU2VwIDE3IDE3OjIzOjQ5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG9hc3lzLmMsIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2gtaXJpeDMsIGNvbmZpZy90LWlyaXgzOgotCWFkZCBzZ2kvaXJpeCBzdXBwb3J0LgotCi1UaHUgU2VwIDEyIDE0OjI5OjA5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgZm9yIHRoZSBBTUQgMjkwMDAgVWx0cmFjb21wdXRlciBwb3J0IGZyb20gRGF2aWQgV29vZC4KLQkod29vZEBueXUuZWR1KS4KLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIEhhbmRsZSBOT19GQ05UTC4KLQotCSogTWFrZWZpbGUuaW46ICBNYWtlIHN1YmRpcnMgd29yayBieSB1c2luZyAkKElOQ0RJUikgaW4gdGhlCi0JY3J1ZGUgZGVwZW5kZW5jaWVzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiAgUGFzcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQljdXJyZW50IGZpbGUncyBjb2ZmIHN5bWJvbCBmb3JtYXQgdG8gQkZEIHZpYSB0aGUgY29mZl9kYXRhIHN0cnVjdC4KLQkoY29mZl9maW5kX25lYXJlc3RfbGluZSk6ICBvYmpfaWNvZiA9PiBjb2ZmX2RhdGEuCi0JKGNvZmZfc3dhcF9zeW1fe2luLG91dH0pOiAgQ2hlY2sgdGhhdCBTWU1OTUxFTiA9PSBFX1NZTU5NTEVOLgotCShjb2ZmX3N3YXBfYXV4X3tpbixvdXR9KTogIENoZWNrIHRoYXQgRklMTk1MRU4gPT0gRV9GSUxOTUxFTgotCWFuZCBESU1OVU0gPT0gRV9ESU1OVU0uCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgYTI5ay0qLSogaG9zdHMsIGFuZCB0YXJnZXRzCi0JYTI5ay0qLWNvZmYsIGEyOWstKi1hb3V0LCBhbmQgYTI5ay0qLXN5bTEuCi0JKiBsaWJjb2ZmLWluLmg6ICBBZGQgbG9jYWxfbl9idG1hc2ssIGxvY2FsX25fYnRzaGZ0LAotCWxvY2FsX25fdG1hc2ssIGxvY2FsX25fdHNoaWZ0LCBsb2NhbF9zeW1lc3osIGxvY2FsX2F1eGVzeiwKLQlsb2NhbF9saW5lc3ogdG8gYGNvZmZfZGF0YScgKHRkYXRhKSBzdHJ1Y3QuCi0JKGNvZmZfZGF0YSwgY29mZl9kYXRhX3R5cGUsIGNvZmZfdGRhdGEpOiAgUmVuYW1lIHN0cnVjdCBpY29mZGF0YS4KLQkqIGNvbmZpZy9oLXVsdHJhMzogIEhhbmRsZSBhMjlrLSotKiBob3N0cyBhcyBVbHRyYWNvbXB1dGVycy4KLQotVGh1IFNlcCAxMiAxNDowNzoyMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICQoTUFLRSkgZm9yIG1ha2UsICQoZG9jZGlyKSBmb3IgZG9jCi0JKiBkb2MvTWFrZWZpbGU6IHJlZHVuZGFudCBkZXBlbmRlbmNpZXMgZm9yIFN1bi1tYWtlIFZQQVRIIGJ1ZwotCi1UdWUgU2VwIDEwIDIwOjM0OjEyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBSZWxlYXNlIHRoZSByaWdodCBzdG9yYWdlIGluCi0JZXJyb3IgY2FzZS4KLQkoc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6ICBGaXggaGVhZGVyIGNvbXBhcmlzb24uCi0JKiBhb3V0eC5oOiAgQXZvaWQgc2hpZnRzIG9mIDMyIGJpdHMsIHVuZGVmaW5lZCBpbiBDLiAgTGludC4KLQkqIGJvdXQuYywgaWNvZmYuYywgaWVlZS5jLCBsaWJiZmQuYywgb2FzeXMuYzogIGdjYyAtTyAtVyBsaW50LgotCi1XZWQgU2VwICA0IDAwOjQ0OjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCUFsbG93IEdEQiB0byBwYXRjaCBvYmplY3QgZmlsZXMuCi0KLQkqIGFvdXRmMS5oIChzdW5vc19jb3JlX2ZpbGVfcCk6ICBTZXQgU0VDX0hBU19DT05URU5UUyBvbiBhbGwgc2VjdGlvbnMuCi0JKiB0cmFkLWNvcmUuaCAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogIERpdHRvLgotCSogYW91dHguaCAoYW91dF9zZXRfc2VjdGlvbl9jb250ZW50cyk6ICBPbiBmaXJzdCBvdXRwdXQsIGNoZWNrCi0JYWJmZC0+ZGlyZWN0aW9uIGFuZCBjb21wbGFpbiBpZiBlcnJvbmVvdXMuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGNydWRlIGRlcGVuZGVuY2llcy4KLQotVHVlIFNlcCAgMyAxMzo0NjoxOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvKiBhb3V0eC5oIGNvbmZpZ3VyZSogc2hvcnRlbmVkIGFsbCB0aGUgaC90bWFrZS14eHh4Ci0JdG8gaC90LXh4eHggZmlsZXMgc28gdGhhdCBldmVyeXRoaW5nIHdpbGwgd29yayBvbiBTeXN0ZW0gVi4KLQotRnJpIEF1ZyAyMyAxMzo1MTowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXR4Lmg6ICBBZGQgaW5mb3JtYXRpb24gb24gaG9zdC1hb3V0LmMgYW5kIGhvdyB0byBjb25maWd1cmUKLQl0byB1c2UgaXQsIHRvIHRoZSBtYW51YWwuCi0JKiBjb25maWd1cmUuaW46ICBUaXggdHlwby4KLQkqIGVjb2ZmLmM6ICBJZiBjb21waWxpbmcgZm9yIERFQzMxMDAsIHVzZSB0cmFkX3VuaXggY29yZSBmaWxlcywKLQllbHNlIGR1bW15IG91dCB0aGUgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogIElmIEhPU1RfREFUQV9TVEFSVF9BRERSIGlzCi0Jc3BlY2lmaWVkLCB1c2UgaXQgdG8gbG9jYXRlIHRoZSBkYXRhIHNlY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3N5bWJvbHMpOiAgRGVjbGFyZSBidWZmZXIgYXMgYmZkX2J5dGVzCi0JcmF0aGVyIHRoYW4gYXMgY2hhcnMgKGxpbnQpLgotCi1UaHUgQXVnIDIyIDIyOjIwOjE5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oLCBjb2ZmY29kZS5oOiAgc2FiZXJpemVkLgotCi1UaHUgQXVnIDIyIDExOjI3OjA2IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogc29tZSBjbGVhbnVwLCByZWluY29ycG9yYXRlZCBtb3JlIGludHJvIG1hdHRlciBmcm9tCi0JYmZkLmRvYwotCWJmZC5jLCB0YXJnZXRzLmM6IG1pbm9yIHJld29yZGluZyBvZiBkb2Mgc2VnbWVudHMKLQotCi1XZWQgQXVnIDIxIDE5OjEzOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6ICBVc2UgSE9TVF9URVhUX1NUQVJUX0FERFIsCi0JZXRjLCByYXRoZXIgdGhhbiBURVhUX1NUQVJUX0FERFIuCi0JKiBob3N0LWFvdXQuYzogIFJlbW92ZSAjaWYgMCBhcm91bmQgd2hvbGUgdGhpbmcuCi0JVXBkYXRlIHRvIG1vZGVybiAoMzIvNjQtYml0KSBhLm91dCBuYW1pbmcgY29udmVudGlvbnMuCi0JSW5jbHVkZSBhIGxhcmdlIGNodW5rIG9mIC4uL2luY2x1ZGUvYS5vdXQuZ251LmggdG8gZ2V0IG1hY3JvcyB0aGF0Ci0JYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4KLQkoaG9zdF9hb3V0X3szMiw2NH1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIFVzZSB0aGUgV1JJVEVfSEVBREVSUwotCW1hY3JvIHVzZWQgYnkgdGhlIG90aGVyIGEub3V0IGltcGxlbWVudGF0aW9ucy4KLQkqIE1ha2VmaWxlLmluOiAgR2l2ZSBkZXBlbmRlbmNpZXMgdG8gT1BUSU9OQUxfQkFDS0VORFMuCi0KLVdlZCBBdWcgMjEgMTQ6MzM6MDYgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgdGFyZ2V0cyAiYmZkLmR2aSIgYW5kICJiZmQucHMiIGluc3RlYWQgb2YKLQl0ZXhkb2MgYW5kIHBzZG9jOyBtYWtlIHRoZXNlIGRlcGVuZCBvbiBnZW5lcmF0ZWQgLnRleGkncwotCi0JKiBzY2FuaXQsIChuZXcpIHVuUFJPVE86IHR1cm4gUFJPVE8gbWFjcm9zIGludG8gQU5TSSBkZWNsYXJhdGlvbnMgaW4KLQlkb2MKLQotCSogYmZkLmMsIHJlbG9jLmMsIHN5bXMuYzogbWlub3Igc3BlbGxpbmcvd29yZGluZyBmaXhlcyBpbiBkb2MKLQlwb3J0aW9ucwotCi0JKiBNYWtlZmlsZS5pbiwgYXdrc2Nhbi1pcCwgYXdrc2Nhbi1wLCBpbnRvYmZkLAotCWxpYmJmZC5oLCBsaWJjb2ZmLmgsIHRvbGliY29mZjsgbmV3IGJmZC1pbi5oLCBsaWJiZmQtaW4uaCwKLQlsaWJjb2ZmLWluLmg6IChhKSB1c2Ugc2VwYXJhdGUgZmlsZXMgZm9yIGludmFyaWFudCBwYXJ0cyBvZiBiZmQuaCwKLQlsaWJiZmQuaCwgYW5kIGxpYmNvZmYuaDsgKGIpIGluIGdlbmVyYXRlZCBwYXJ0cyBvZiBzYW1lLCB1c2UgbGVzcwotCW9idHJ1c2l2ZSBtYXJrcyBpbmRpY2F0aW5nIC5jIG9yaWdpbnMuCi0KLQkqIGJmZC50ZXhpbmZvOiBnZW5lcmFsaXplIG1vc3QgcmVmZXJlbmNlcyB0byBsaW5rZXIKLQotVHVlIEF1ZyAyMCAxNToxODowMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluY2x1ZGUgY29yZS5wIGluIFBST1RPUyAoYnVpbGRpbmcgYmV0dGVyIGJmZC5oKQotCSogYXJjaHVyZXMuYzogcmVtb3ZlIGVtcHR5IGZvbygpIGRlZmluaXRpb24gKGNyZXB0IGluIGF0IHZuMS45KQotCi1Nb24gQXVnIDE5IDEzOjQ4OjIyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogdXNlIEBzZXRjaGFwdGVybmV3cGFnZSBvbiBpbnN0ZWFkIG9mIGxvdHMgb2YKLQlAcGFnZSdzOyBtaW5vciByZXBocmFzaW5nIGluIEludHJvZHVjdGlvbi4KLQotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBiZmQuYywgYmZkLnRleGluZm8sIGNhY2hlLmMsCi0JY29mZmNvZGUuaCwgY29yZS5jLCBmb3JtYXQuYywgaWVlZS5jLCBsaWJiZmQuYywgbGliYmZkLmgsIGxpYmNvZmYuaCwKLQlvYXN5cy5jLCBvcG5jbHMuYywgcmVsb2MuYywgc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYyAoZG9jdW1lbnRhdGlvbgotCXNlZ21lbnRzKTogdXNlZCBCRkQgKGNhcHMpIG1vcmUgY29uc2lzdGVudGx5IGFzIGEgbmFtZSBpbgotCWRpc2NvdXJzZSwgZml4ZWQgYSBmZXcgb3RoZXIgbWlub3IgdHlwb3MgYW5kIHVzZXMgb2YgZm9udHMKLQotCi1UaHUgQXVnICA4IDE2OjQ3OjQzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IGZpeGVkIGJ1ZyB3aGVyZSBzdHJpbmcgdGFibGUgc2l6ZSB3YXNuJ3QgYmVpbmcgc3dhcHBlZC4KLQotVGh1IEF1ZyAgMSAxNjozNToyOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmM6IGFkZGVkIFNFQ19DT05TVFJVQ1RPUl9URVhUfERBVEF8QlNTIGZsYWdzCi0KLQkqIHN5bXMuYzogYWRkZWQgQlNGX0NPTlNUUlVDVE9SLCBCU0ZfV0FSTklORyBhbmQgQlNGX0lORElSRUNUCi0JZmxhZ3MuIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKSBub3cga25vd3Mgd2hhdCB0byBkbyB3aXRoIHRoZQotCWFib3ZlIGZsYWdzLgotCi0JKiBhb3V0eC5oOiBtYWRlIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgYW5kCi0JdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgcHJvZHVjZSB0aGUgYWJvdmUgZmxhZ3MuCi0KLQotV2VkIEp1bCAzMSAwOTo1Mzo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFsbCBmaWxlczogIHVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlcyBmb3IgR1BMIHZlcnNpb24gMi4KLQlJbnN0YWxsIGhlYWRlciBjb21tZW50cyBhbmQgYXR0cmlidXRlIG1vc3QgbW9kdWxlcyB0byB0aGVpcgotCWF1dGhvcnMuICBCRkQncyBuYW1lIGlzIG5vdyBvZmZpY2lhbGx5ICJCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIiwKLQlzbyByZW1vdmUgYW55IGNvbmZsaWN0aW5nIHBlam9yYXRpdmVzLgotCWFyY2h1cmVzLmg6ICBDb25zaXN0cyBzb2xlbHkgb2YgY29tbWVudHM7IHJlbW92ZSBpdC4KLQotRnJpIEp1bCAyNiAxODoxMTozNCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYmZkLmM6IE1hZGUgaXQgY29tcGlsZSBhZ2Fpbi4KLQotRnJpIEp1bCAxOSAwODoxNzowOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBuZXdzb3MzLmMsIHRhcmdldHMuYywgY29mZmNvZGUuaDogbmV3IHBhdGNoZXMgZnJvbSBEYXZpZCBXb29kCi0KLQotTW9uIEp1bCAxNSAxNjoyNzo0MiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCBhcmNoaXZlLmMgYmZkLmMgY29mZmNvZGUuaCBjb3JlLmMgZWNvZmYuYyBpZWVlLmMKLQliZmQudGV4aW5mbyBvYXN5cy5jIG9wbmNscy5jIHJlbG9jLmMgc3JlYy5jOiBNb3JlIGRvY3VtZW50YXRpb24gb24KLQlsaW50IGZpeGVzLgotCi0JKiBhbWRjb2ZmLmMgYmZkLnRleGluZm8gTWFrZWZpbGUuaW4gOiBGb2xkZWQgaW4gY2hhbmdlcyBmb3IgYW1kCi0JMjlrIGNvZmYgYnkgRGF2aWQgV29vZCAod29vZEBsYWIudWx0cmEubnl1LmVkdSkuCi0KLVRodSBKdWwgIDQgMDk6NTM6MTYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogRXZlcnl0aGluZzogY3JlYXRlZCBzb21lIG5ldyBmaWxlcywgY29yZS5jIGZvcm1hdC5jLCByZWxvYy5jLAotCXNlY3Rpb24uYyBhbmQgc3ltcy5jIHRvIHNwbGl0IHRoZSBmdW5jdGlvbmFsaXR5IGEgYml0IGJldHRlci4KLQlDbGVhbmVkIHVwIHRoZSByZXN0IG9mIHRoZSBmaWxlcyBhIGJpdCwgYW5kIGFkZGVkIHNvbWUKLQlkb2N1bWVudGF0aW9uLgotCi0KLU1vbiBKdWwgIDEgMTM6Mjk6NDcgMTk5MSAgRGF2aWQgV29vZCAod29vZCBhdCBkYXZpZC51bHRyYS5ueWEuZWR1KQotCi0JKiBvcG5jbHMuYywgLi4vaW5jbHVkZS9zeXMvaC1zdW4zLmggLi4vaW5jbHVkZS9zeXMvaC1zdW40Lmg6IGZjbnRsCi0JcmVhbGx5IHRha2VzIDMgYXJndW1lbnRzLCBwYXRjaGVkIGNvZGUgYW5kIGFtbWVuZGVkIHByb3RvdHlwZXMuCi0KLUZyaSBKdW4gMTQgMTM6MTk6NDAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogLi4vaW5jbHVkZS9iZmQuaCAoc3RydWN0IGJmZF90YXJnZXQpOiBBZGRlZCBuZXcgZmllbGQKLQkiYWxpZ25fcG93ZXJfbWluIiB3aGljaCBjb250YWlucyB0aGUgbWluaW11bSBhbGlnbm1lbnQgZm9yIGEKLQlzZWN0aW9uLiBUaGlzIGlzIHVzZWQgaW4gY29mZl9uZXdfc2VjdGlvbl9ob29rLiBUaGUgZmllbGQKLQlpbnNlcnRpb24gbmVjZXNzaXRhdGVzIGFuIHVwZGF0ZSBvZiBhbGwgYmFja2VuZHMuLgotCi0JKiBhb3V0ZjEuaCBqdW1wIHRhYmxlIGZpZWxkIGluc2VydGVkCi0KLQkqIGFyY2hpdmUuYyhzbmFyZl9hcl9oZHIpKGJmZF9zbHVycF9jb2ZmX2FybWFwKSBjYW4gbm93IHBhcnNlIGRndXggc3R5bGUgZXh0ZW5kZWQKLQlmaWxlbmFtZXMgdG9vLgotCi0JKiBib3V0LmMoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpIGZpeCB0byBhc3NlcnRpb24gdGVzdHMuIEp1bXAKLQl0YWJsZSBmaWVsZCBpbnNlcnRlZC4KLQotCSogY29mZmNvZGUuaChqdXN0IGFib3V0IGV2ZXJ5dGhpbmcpIE5vdyBwYXRjaGVzIHVwIHN5bWJvbCB0YWJsZXMKLQl1c2luZyBhIGRpZmZlcmVudCBtZWNoYW5pc20uIFRoZSBJbnRlbCBtYWpvciBidWcgaGFzIGJlZW4gZml4ZWQsCi0JYW5kIHRoZSBsaW5rZXIgY2FuIHNlbGYgaG9zdCBvbiB0aGUgQXZpaW9uIGFuZCBiZSBkZWJ1Z2dlZCB3aXRoCi0JZ2RiLgotCi0JKiBlY29mZi5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwgaTM4NmNvZmYuYzogbmV3Ci0JaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwgIGljb2ZmLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlCi0JcGF0Y2gsIGllZWUuYzogY2FuIG5vdyByZWFkIGFyY2hpdmVzIGNvbnRhaW5pbmcgaWVlZSBtb2R1bGVzLiwKLQlsaWJjb2ZmLmg6IGFkZGVkIChjb21iaW5lZF9lbnRyeV90eXBlKSwgbGliaWVlZS5oOiB1cGVkIG1heAotCXNlY3Rpb25zIHRvIDIwLCBtNjhrY29mZi5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwKLQltODhrYmNzLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLCBvYXN5cy5jOiB2YXJpb3VzIGJ1Z3MKLQlmaXhlZC4gb3BuY2xzLmM6IGFkZGVkIGJmZF9hbGxvY19ncm93IGFuZCBiZmRfYWxsb2NfZmluaXNoLgotCXNyZWMuYzoganVtcCB0YWJsZSBwYXRjaC4gdHJhZC1jb2RlLmMgZml4ZWQgI0lGIHR5cGVvCi0KLUZyaSBKdW4gIDcgMTI6MzU6NDYgMTk5MSAgU2VhbiBGYWdhbiAgKHNlZiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotIAkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBhZGRlZCBlbHNlIGNhc2UgdG8gZGVhbCB3aXRoCi0gCWZpbGVuYW1lcyBsZXNzIHRoYW4gOSBjaGFyYWN0ZXJzLgotCi0KLVRodSBKdW4gIDYgMTg6Mjc6MzggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogLi4vaW5jbHVkZS9vYXN5cy5oIG9hc3lzLmMgKG9hc3lzX2FyY2hpdmVfcCk6IGZpeGVkIHNvIGl0IHdvcmtzCi0KLQkqIHNyZWMuYzogbm93IGFsbG93cyBhbnkgbnVtYmVyIG9mIHNlY3Rpb25zIHRvIGJlIGNyZWF0ZWQgaW4gYQotCWZpbGUuIE91dHB1dHMgYWRkcmVzc2VzIG9mIHRoZSByaWdodCBsZW5ndGguCi0KLVRodSBNYXkgMzAgMTU6MzA6MTAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9jaGVja19mb3JtYXQpOiBGaXhlZCBwcm9ibGVtIHdoZXJlIHdoZW4gYSBkZWZhdWx0ZWQKLQl0YXJnZXQgZGlkbid0IG1hdGNoLCB0aGUgZm9ybWF0IGdvdCBzZXQgdG8gdGhlIGF0dGVtcHRlZCBtYXRjaCwKLQlicmVha2luZyBhIGZ1dHVyZSB0ZXN0LgotCi0gICAgICAgICouLi9pbmNsdWRlL2kzODZjb2ZmLmggOiBmaXhlZCB0eXBvIGluIHR5cGUgZmllbGQgd2l0aCBzaXplCi0KLQkqIGkzODZjb2ZmLmMgaWNvZmYuYyBtODhrLWJjcy5jIGVjb2ZmLmMgLi4vaW5jbHVkZS9iZmQuaCA6IEFkZGVkCi0Jc3VwcG9ydCBpbiB0aGUganVtcCB0YWJsZSBmb3IgdGhlIHN3YXBwaW5nIHJvdXRpbmVzIGV4cG9ydGVkIHRvCi0JZ2RiLiBOb3cgZ2RiIHdvcmtzIHdpdGggdGhlIDM4Ni4KLQotVHVlIE1heSAyOCAxNzoyMTo0MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1lcmdlIGluIGNoYW5nZXMgZnJvbSBnZGItMy45NSByZWxlYXNlLgotCU1ha2VmaWxlLmluOiAgQWxsb3cgaG1ha2UgYW5kIHRtYWtlIGZpbGVzIHRvIGFkZCBPRklMRVMuCi0JYW91dGYxLmg6Ci0JYmZkLmM6ICBzdXBwb3J0IHNwZWNpZmljIHRhcmdldHMgYXMgd2VsbCBhcyBzZWFyY2hpbmcuICBXaGVuCi0Jc2VhcmNoaW5nLCB0YWtlIGRlZmF1bHQgdGFyZ2V0IGluIHByZWZlcmVuY2UgdG8gb3RoZXJzLgotCWJmZC5kb2M6ICB0eXBvcwotCWllZWUuYywgb2FzeXMuYzogIEF2b2lkIHVzaW5nIHRoZSAidGRhdGEiIG1hY3JvcyBsZWZ0IG9mIGFzc2lnbm1lbnQuCi0JbGliYS5vdXQuaDogIERvbid0IGhhcmQtY29kZSBmaWxlIG9mZnNldHM7IHVzZSBOXyBtYWNyb3MgZm9yIHRoZW0uCi0JbGliYmZkLmg6ICBTdXBwb3J0IHNwZWNpZmljIHRhcmdldHMgYXMgd2VsbCBhcyBzZWFyY2hpbmcuCi0Jb3BuY2xzLmM6ICBTdXBwb3J0IHNwZWNpZmljIHRhcmdldHMgYXMgd2VsbCBhcyBzZWFyY2hpbmcuCi0JdGFyZ2V0cy5jOiAgU2VhcmNoIGlzIHNob3J0LWNpcmN1aXRlZCBpZiBkZWZhdWx0IHRhcmdldCBtYXRjaGVzLgotCWxpYm9hc3lzLmMsIGxpYmllZWUuYzogIFVuZG8gYm90aG5lciBjaGFuZ2VzIHRoYXQgbWFrZSBtYWNyb3MKLQl3b3JrIHRvIHRoZSBsZWZ0IG9mIGFzc2lnbm1lbnQsIGJ1dCB3aGljaCBkZXBlbmQgb24gdGhlCi0JcmVwcmVzZW50YXRpb25zIG9mIGRpZmZlcmVudCBwb2ludGVyIHR5cGVzIGJlaW5nIHRoZSBzYW1lLgotCi1GcmkgTWF5IDI0IDE4OjU2OjUyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGkzODZjb2ZmLmM6IGNyZWF0ZWQuCi0JKiBjb2ZmY29kZS5oOiBhZGRlZCBzdXBwb3J0IGZvciAzODYuCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3VwcG9ydCBmb3IgMzg2LgotCSogLi4vaW5jbHVkZS9pMzg2Y29mZi5oOiBjcmVhdGVkCi0KLVdlZCBNYXkgMjIgMDc6MjY6MzggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogcmVtb3ZlZCBhbGwgcHV0X3hfPHNpemVzPgotCSogbGliYmZkLmM6IENoYW5nZWQgI2lmZGVmIF9fR05VQ19fIHRvICNpZmRlZiBIT1NUXzY0X0JJVCwgQWRkZWQKLQlERUZVTlMKLQotCi1UdWUgTWF5IDIxIDA4OjU4OjU4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0JKGJvdGhuZXIpCi0JKiBvcG5jbHMuYzogQ2hhbmdlZCBvYnN0YWNrX2NodW5rX2FsbG9jIHVzZSB4bWFsbG9jCi0KLU1vbiBNYXkgMjAgMTc6MTI6MTcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogZXZlcnl0aGluZzogUmVtb3ZlZCBzeXNkZXAuaCBmcm9tIGJmZC5oIGFuZCBwdXQgYmFjayBpbnRvIGZpbGVzCi0JZnJvbSB3aGljaCBpdCB3YXMgc3BsaXQgb3V0LiBOb3cgNjQgYml0IHZlcnNpb24gaXMgYnVpbHQgd2l0aCBhCi0JLURIT1NUXzY0X0JJVD0ibG9uZyBsb25nIiBvbiB0aGUgY29tcGlsZSBsaW5lLgotCi1GcmkgTWF5IDE3IDE5OjM1OjI2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlDaGFuZ2VkIGFsbCB0aGUgW2dldHxwdXRdW25hbWVdIHJvdXRpbmVzIHRvIHVzZSAgW2dldHxwdXRdX1tzaXplCi0JaW4gYnl0ZXNdLgotCi0JUHV0IGluIHN1cHBvcnQgZm9yIDY0IGJpdCB3b3JrLiBOb3cgdHdvIHZlcnNpb25zIG9mIGJmZCBtYXkgYmUKLQlnZW5lcmF0ZWQsIGFjY29yZGluZyB0byB0aGUgc3RhdGUgb2YgVEFSR0VUXzY0X0JJVCwgb25lIHdoaWNoIGlzCi0JMzIgYml0IG9ubHksIGFuZCBvbmUgd2hpY2ggaXMgNjQvMzIgYml0cy4KLQlDcmVhdGVkIG5ldyBiYWNrIGVuZCAnZGVtbzY0JyB0byB0ZXN0IDY0IGJpdCBmdW5jdGlvbmFsaXR5LgotCi0JUmVuYW1lZCBzb21lIGZpbGVzIHRvIHdvcmsgb24gRE9TLgotCi0JKiBhcmNoaXZlLmM6IGxpbnQgKiBiZmQuYzogcHJvdG90eXBlcyBhbmQgbGludC4gKiBlY29mZi5jOiBhZGRlZAotCTY0Yml0IHRyYW5zZmVyIAkqIGljb2ZmLmM6IGFkZGVkIDY0Yml0IHRyYW5zZmVyICogaWVlZS5jOiBuYW1lCi0JY2hhZ2UsIDY0IGJpdCB0cmFuc2Zlci4gKiBsaWJhLm91dC5oOiBTcGxpdCBvdXQgY29tbW9uIGNvZGUgZnJvbQotCXN1bm9zIGFuZCBuZXdzb3MgaW50byBsaWJhLm91dC4gTmFtZSBjaGFuZ2VzIGFuZCBwcm90b3R5cGUgbW9kcy4gKgotCWxpYmJmZC5jOiBsaW50IGFuZCBwcm90b3R5cGVzLCBleHRyYSA2NGJpdCBzd2Fwcy4gKiBsaWJiZmQuaDoKLQlwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLiAqIGxpYmNvZmYuaDogbGludCAqIGxpYmllZWUuaDogbWFrZQotCXdvcmsgb24gRE9TICogbGlib2FzeXMuaDogbWFrZSB3b3JrIG9uIERPUyAqIG04OGstYmNzLmM6IE5hbWUKLQljaGFuZ2UgYW5kIDY0Yml0IHN0dWZmLiogbmV3c29zMy5jOiBjb21tb24gY29kZSByZW1vdmVkLCBuZXcganVtcAotCXRhYmxlLiAqIG9hc3lzLmM6IE5hbWUgY2hhbmdlICogb3BuY2xzLmM6IFBvcnRhYmlsaXR5IGZpeGVzICoKLQlzcmVjLmM6IE5hbWUgY2hhbmdlcyAqIHN1bm9zLmM6IFJlbW92ZWQgY29tb24gY29kZS4gKiB0YXJnZXRzLmM6Ci0JQWRkZWQgZGVtbyAqIGFvdXQzMiwgYW91dDY0LmMgaW5jbHVkZSAgYW91dHguaCAqIGJvdXQuYzogdXNlZCB0bwotCWJlIGNhbGxlZCBiLm91dC5jICogY29mZmNvZGUuaDogdXNlZCB0byBiZSBjYWxsZWQgY29mZi1jb2RlLmgsIG5vdwotCTY0Yml0IGl6ZWQuICogZGVtbzY0LmM6IDY0IGJpdCBhLm91dCBiYWNrIGVuZAotCi1UaHUgTWF5IDE2IDE2OjAyOjA3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0JZnJvbSBib3RobmVyCi0gCSogbGliaWVlZS5oOiBNYWtlIGllZWVfZGF0YSBhbmQgaWVlZV9hcl9kYXRhIG1hY3JvcyB1c2FibGUKLQlvbiBMSFMgb2YgYXNzaWdubWVudCwgZXZlbiB3aGVuIHVzaW5nIG9sZCBjb21waWxlcnMuCi0JKiBsaWJvYXN5cy5oOiBEaXR0byBmb3Igb2FzeXNfZGF0YSBhbmQgb2FzeXNfYXJfZGF0YS4KLQkqIG02OGtjb2ZmLmM6IEFkZCBlbnVtLXRvLWludCBjYXN0cyB0byBhY2NvbW9kYXRlIG9sZCBjb21waWxlcnMuCi0JKiBuZXdzb3MzLmM6IEZpeCBkZWZpbml0aW9ucyBvZiBTRUdNRU5UX1NJWkUgYW5kIFRFWFRfU1RBUlRfQUREUi4KLQkqIG9wbmNscy5jOiBEZWZpbmUgU19JWFVTUiwgU19JWEdSUCwgU19JWE9USCBpZiB1bmRlZmluZWQuCi0JKiB0YXJnZXRzLmM6IEFkZCBkZWNsYXJhdGlvbiBvZiBuZXdzb3MzX3ZlYy4KLQotTW9uIE1heSAxMyAxMDowMzoyOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0LmM6IGZpeHhlZCBzb21lIG9mIHRoZSBwcm9ibGVtcyB3aXRoIGZpbGVwb3MgY2FsY3VsYXRpb24uCi0JKHN3YXBfZXh0X3JlbG9jKTogZml4ZWQgcHJvYmxlbSB3aXRoIGNyZWF0aW9uIG9mIHJlbG9jcy4KLQkoYW91dF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IGZpeGVkIGZpbGVwb3MgcHJvYmxlbQotCi0JKiBjb2ZmLWNvZGUuaDogKHN3YXBfZmlsZWhkcl9pbiwgc3dhcF9maWxlaGRyX291dCkgYWRkLgotCShzd2FwX2ZpbGVoZHIpIGRlbGV0ZS4gQ2hhbmdlZCBhbGwgdGhlIHVzYWdlIG9mIGJmZF9oX3B1dF94LgotCShzd2FwX2FvdXRoZHJfaW4sIHN3YXBfYW91dGhkcl9vdXQpIGFkZC4gKHN3YXBfYW91dGhkcikgZGVsZXRlLgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApIGNsZWFuZWQgdXAsIGFkZGVkIE1JUFMuIChjb2ZmX29iamVjdF9wKQotCWNsZWFuZWQgdXAuIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cykgY2xlYW5lZCB1cC4KLQotCSogZWNvZmYuYzogVG90YWxseSBkaWZmZXJlbnQuIE5vdyBzdXBwb3J0cyBlY29mZiBmdWxseS4KLQotCSogaWNvZmYuYzogZml4ZWQgcHJvYmxlbXMgaW4gcmVsb2NhdGlvbiBjYWxsb3V0LgotCi0JKiBsaWJjb2ZmLmg6IChzdHJ1Y3QgaWNvZmRhdGEpIHJlbW92ZWQgaGRyIHN0cnVjdHVyZSBmcm9tIHRkYXRhLgotCi0JKiBtNjhrY29mZi5jOiB1cGRhdGVkIHRhcmdldCB2ZWN0b3IuCi0KLQkqIHN1bm9zLmM6IChjaG9vc2VfcmVsb2Nfc2l6ZSkgYWRkZWQ6IChzdW5vczRfY2FsbGJhY2spIGNhbGxzCi0JY2hvb3NlX3JlbG9jX3NpemUuIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBub3cgY2FsbHMKLQljaG9vc2VfcmVsb2Nfc2l6ZSBzbyBvdXRwdXRzIHJlbG9jcyBjb3JyZWN0bHksIGFsc28gY2FsY3VsYXRlcyB0aGUKLQlzaXplIG9mIHRoZSBzZWN0aW9ucyBjb3JyZWN0bHkuCi0KLQotCi1GcmkgTWF5IDEwIDE2OjU4OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCU1lcmdlIFBlciBCb3RobmVyJ3MgY2hhbmdlcyB0byBtb2R1bGFyaXplIEJGRCBhLm91dCBhIGJpdC4KLQotCSogbGliYmZkLmgsIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyk6ICBBZGQuCi0JKiBpZWVlLmM6ICBDYXN0IGVudW1zIHRvIGludCBiZWZvcmUgY29tcGFyaW5nIHRoZW0sIGZvciBicmFpbi0KLQlkZWFkIGNvbXBpbGVycy4KLQkqIGNvZmYtY29kZS5oOiAgUmVtb3ZlIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB1c2UgdGhlCi0JZ2VuZXJpYyBvbmUgaW5zdGVhZC4KLQotCSogYW91dC5jOiAgRGVyaXZlIG5ldyBtb2R1bGUgZnJvbSBzdW5vcy5jLCBjb250YWluaW5nIGdlbmVyaWMKLQlzdXBwb3J0IGNvZGUgZm9yIGFsbCBraW5kcyBvZiBhLm91dCBmaWxlcy4KLQotCSogc3Vub3MuYzogUmVtb3ZlIGFsbCBjb2RlIHRoYXQgZ29lcyBpbiBhb3V0LmMuICBTcGxpdCBvdXQKLQltYWNoaW5lIGRlcGVuZGVudCBmb2xsb3d1cCBpbiBzdW5vczRfb2JqZWN0X3AgaW50bwotCXN1bm9zNF9jYWxsYmFjay4gIFVzZSBKVU1QX1RBQkxFKGFvdXQpIGZvciB0aGUgdHJhbnN2ZXIgdmVjdG9yLAotCWFuZCByZWRlZmluZSBvbmx5IHRoZSBuYW1lcyB3ZSBDSEFOR0UsIG5vdCBhbGwgdGhlIG5hbWVzLiAgRHJvcAotCXRoZSBsaXR0bGUtZW5kaWFuIHZlY3RvciwgYW5kIHJlbmFtZSB0aGUgdmVjdG9yIGFzIHN1bm9zNCByYXRoZXIKLQl0aGFuIGdlbmVyaWMuCi0KLQkqIGIub3V0LmM6ICBVc2UgYW91dC5jIHJvdXRpbmVzIGZvciBtb3N0IG9mIHRoZSB3b3JrLiAgU2xpZ2h0Ci0JY2hhbmdlcyBmb3IgdGhlIG5ldyByZWdpbWUuICBSZW1vdmUgY2xvc2VfYW5kX2NsZWFudXAgYW5kCi0JZ2V0X3NlY3Rpb25fY29udGVudHMgaW4gZmF2b3Igb2YgZ2VuZXJpY3MuICBOZXcgdHJhbnNmZXIgdmVjdG9yCi0JcmVnaW1lLgotCi0JKiBuZXdzb3MuYzogIE5ldyBzdXBwb3J0IGZvciBTb255IE5FV1MsIGFub3RoZXIgYS5vdXQgZm9ybWF0LgotCi0JKiBlY29mZi5jOiAgUmVtb3ZlIGNsb3NlX2FuZF9jbGVhbnVwLiAgTmV3IHR2ZWMgcmVnaW1lLgotCSogaWNvZmYuYywgbTg4ay1iY3MuYzogIEFkZCB3cml0ZV9jb250ZW50cyB0byB0dmVjLgotCSogaWVlZS5jLCBvYXN5cy5jOiAgUmVtb3ZlIGNsb3NlX2FuZF9jbGVhbnVwLCBhZGQgd3JpdGVfY29udGVudHMKLQl0byB0dmVjLgotCSogb3BuY2xzLmMgKGJmZF9jbG9zZSk6ICBDYWxsIGZvcm1hdC1kZXBlbmRlbnQgd3JpdGVfY29udGVudHMKLQlyb3V0aW5lLCBpZiB3cml0aW5nLCBiZWZvcmUgY2FsbGluZyB0YXJnZXQtZGVwZW5kZW50Ci0JY2xvc2VfYW5kX2NsZWFudXAgcm91dGluZSAod2hpY2ggaXMgbm93IGFsd2F5cyBnZW5lcmljLCBJIHRoaW5rKS4KLQkqIHNyZWMuYzogIFVzZSBiZmRfYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuICBSZW1vdmUKLQljbG9zZV9hbmRfY2xlYW51cCBhbmQgbW92ZSBjb2RlIGZyb20gaXQgdG8KLQlzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cy4gIEFkZCB3cml0ZV9jb250ZW50cyB0byB0dmVjLgotCSogdGFyZ2V0cy5jOiAgUmVtb3ZlIGEub3V0IGxpdHRsZSB2ZWN0b3IsIHJlcGxhY2UgYS5vdXQgYmlnCi0JdmVjdG9yIHdpdGggU3VuT1MgdmVjdG9yLiAgRklYTUU6ICBOZWVkIFZheCBzdXBwb3J0IGFnYWluIG5vdy4KLQotCSogbGliYmZkLmg6ICBBZGQgd3JpdGVfY29udGVudHMgZm9ybWF0LWRlcGVuZGVudC12ZWN0b3IgdG8gdGhlCi0JYmZkX3RhcmdldCB2ZWN0b3IuICBTdXBwbHkgYSBnZW5lcmljIGNsb3NlX2FuZF9jbGVhbnVwIHJvdXRpbmUuCi0JKiBsaWJhLm91dC5oOiAgSGFuZGxlIHRoZSBuZXcgYW91dC5jIHNwbGl0LiAgQWRkIHByb3RvdHlwZXMgZm9yCi0JYWxsIHJvdXRpbmVzIGRlZmluZWQgaW4gYW91dC5jLiAgUmVuYW1lICJzdW5vcyIgdGhpbmdzIHRvICJhb3V0IgotCXRoaW5ncy4gIEFkZCBhIGZldyBmaWVsZHMgd2hlcmUgbmVlZGVkIGZvciB2YXJpb3VzIGZvcm1hdHMuCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBhb3V0LmMgYW5kIG5ld3Nvcy5jLgotCi0JKiBhcmNoaXZlLmMsIGllZWUuYywgb2FzeXMuYzogIExpbnQuCi0KLUZyaSBNYXkgMTAgMTI6MzQ6NDggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogLi4vaW5jbHVkZS9iZmQuaAotCWNoYW5nZWQgZm9yd2FyZCBkZWNsYXJhdGlvbiBzdHJ1Y3Qgc3RhdDsgdG8gcmVkdWNlIHdhcm5pbmdzLiBDaGFuZ2VkCi0JY29tbWVudCBvbiBiZmRfaF88eD5feC4KLQotCSogLi4vaW5jbHVkZS9tNjhrY29mZi5oLCAuLi9pbmNsdWRlL2ludGVsLWNvZmYuaCwKLQkuLi9pbmNsdWRlL204OGstYmNzLmgKLQlOb3cgdGhlcmUgYXJlIHR3byBpbmNhcm5hdGlvbnMgb2YgcmVsb2NzLCBsaW5lbm9zIGFuZCBzeW1lbnRzLiBPbmUgZm9yCi0JaW50ZXJuYWwgZGlnZXN0aW9uLCBhbmQgb25lIGZ1bGwgb2YgY2hhciBhcnJheXMgZm9yIEkvTy4gVGhlIG9yaWdpbmFsCi0JbmFtZXMgaGF2ZSBnb25lIHRvIGRldGVjdCBlcnJvcnMuCi0KLQkqIE1ha2VmaWxlLmluLCBtNjhrY29mZi5jLCB0YXJnZXRzLmMKLQlUZXN0IG5ldyBzdHJ1Y3R1cmUgY29kZSB3aXRoIGEgNjhrIGNvZmYgaW1wbGVtZW50YWlvbgotCi0JKiBjb2ZmLWNvZGUuaCwgaWNvZmYuYywgY29mZnN3YXAuYywgbGliY29mZi5oCi0JRml4ZWQgYWxsIHRoZSBwbGFjZXMgd2hlcmUgdGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIHRoZSBzaXplIGFuZAotCWFsaWdubWVudHMgb2Ygc3RydWN0dXJlcyBvbiBkaXNrIGFuZCBzdHJ1Y3R1cmVzIGluIG1lbW9yeS4gI2lmZWQgb3V0Ci0JYWxsIHRoZSBjb2RlIGluIGNvZmZzd2FwLmMsIHNpbmNlIGl0IHNob3VsZCBiZSBkb25lIHVzaW5nIHRoZSB0YXJnZXQKLQlzd2FwIHJvdXRpbmVzIG5vdy4KLQotVGh1IE1heSAgOSAxMTowMDo0NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGRvX29uZSwgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBub3cgc3VwcG9ydHMgdGhlIGxvYWQKLQltdWx0aXBsZSByZWxvYyBjb21tYW5kLgotCi0JKiBzdW5vcy5jIChzdW5vczRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBNYWRlIGl0IHNvIHRoYXQgc2VjdGlvbnMKLQlhcmUgYWx3YXlzIHBhZGRlZCB0byB0aGVpciBhbGlnbm1lbnQgc2l6ZS4KLQotU2F0IE1heSAgNCAxNTo0OTo0MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYywgYmZkLmMsIGNvZmYtY29kZS5oLCBvcG5jbHMuYywgc3Vub3MuYywgdHJhZC1jb3JlLmM6Ci0JQ2xlYW4gdXAgdHlwZXMgYW5kIHN1Y2ggKHNhYmVyIEMgcHJvYmxlbXMpLgotCSogZWNvZmYuYzogIENsZWFuIHVwIHR5cGVzIGFuZCBzdWNoLiAgUmVtb3ZlIHJvdXRpbmVzIHRoYXQgYXJlCi0Jbm90IHVzZWQuICBGaXggdXAgcmVhZGluZyBhbmQgc3dhcHBpbmcgb2Ygc2hvcnRzIGZyb20gZmlsZXMuCi0KLSAgIE5vdGVzIG9uIGJmZC0wLjUuMi1wYXRjaDFhLCBmcm9tIFBlciBCb3RobmVyOgotCi0JKiBhLm91dC52YXguYzogUmVtb3ZlIHR3byBib2d1cyAic3RhdGljIiBmcm9tIHByb3RvdHlwZXMuCi0KLQkqIGVjb2ZmLmM6IEdvdCByaWQgb2YgbG90cyBvZiBub24td29ya2luZyBqdW5rICh0aGF0IGhhZAotCWJlZW4gY29waWVkIGRpcmVjdGx5IGZyb20gY29mZi1jb2RlLmgpLgotCVVwZGF0ZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIHVwZGF0ZXMgdG8gaWNvZmYuYyBhbmQgY29mZi1jb2RlLmguCi0KLQkqIGxpYmJmZC5oOiBBZGRlZCBkZWZpbml0aW9ucyBmb3IgU19JWFVTUiwgU19JWEdSUCwgYW5kIFNfSVhPVEgKLQlpZiB0aGV5J3JlIG1pc3NpbmcgKGFzIHRoZXkgYXJlIGluIChCRFMtNC4zLWJhc2VkKSBOZXdzT1MtMykuCi0KLQkqIHN1bm9zLmMgKG5fdHh0b2ZmKTogKFJlLSlBZGQgc3VwcG9ydCBmb3Igc29ueS4gVGhpcyBpcyBhIGtsdWRnZSwKLQlidXQgdW50aWwgdGhlIHRhcmdldF92ZWN0b3IgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQsCi0JaXQncyBhcyBnb29kIGFzIGFueS4gTm90ZSB0aGF0IHRoZSB0ZXh0IG9mZnNldCBpcyB0aGUgb25seQotCWRpZmZlcmVuY2UgYmV0d2VlbiBOZXdzT1MgYW5kIFN1bk9zIChpbmNsdWRpbmcgbWFnaWMgbnVtYmVycykuCi0JKE1vc3Qgb2YgdGhlIHN1bm9zXyogcm91dGluZXMgc2hvdWxkIHRvIHJlbmFtZWQgYnNkXyoKLQlhbmQgbW92ZSB0byBhIGJzZC5jIGZpbGUuIFRoZW4gKGFuZCB3aGVuIHRoZSB0YXJnZXRfdmVjdG9yCi0JaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQpIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gY3JlYXRlCi0JYSBzZXBhcmF0ZSBTb255IHRhcmdldC4pCi0KLQkqIHN5c2RlcC5oOiBEb24ndCBkZWNsYXJlIGZyZWFkIGFuZCBmd3JpdGUuIENhdXNlcyB0cm91YmxlCi0Jb24gc29tZSBzeXN0ZW1zLCBhbmQgZG9lc24ndCBoZWxwIG9uIG90aGVycy4KLQlTaW1pbGFybHksIG9ubHkgZGVmaW5lIFhfT0sgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQotCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgc3lzL3N0YXQuaCAtIGF0IGxlYXN0Ci0Jb24gTmV3c09TIDMsIGl0IGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQuCi0KLVR1ZSBNYXIgIDUgMDE6NDc6NTcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWNvZGUuaCAoYmZkX2NvZmZfc3dhcF9zeW0sIGJmZF9jb2ZmX3N3YXBfYXV4LAotCWJmZF9jb2ZmX3N3YXBfbGluZW5vKTogIEV4cG9ydCB0aGUgcm91dGluZXMgdGhhdCBieXRlLXN3YXAgQ09GRgotCXN5bWJvbCB0YWJsZXMgaWYgbmVjZXNzYXJ5IHdoZW4gcmVhZGluZyB0aGVtIGluLCBzbyBnZGIgY2FuIHVzZQotCXRoZW0uICBBZGQgImJmZF9jb2ZmXyIgdG8gdGhlIG5hbWVzIHNvIHRoZXkgd29uJ3QgY29uZmxpY3Qgd2l0aAotCW5hbWVzIGluIGNhbGxpbmcgcHJvZ3JhbXMuICBGSVhNRS1zb29uOiAgaWYgY29mZi1jb2RlLmggaXMKLQlpbmNsdWRlZCBpbiB0d28gQkZEIG1vZHVsZXMsIHRoaXMgd2lsbCBjYXVzZSBkdXBsaWNhdGUKLQlkZWZpbml0aW9uczsgdGhlIHJvdXRpbmVzIHNob3VsZCBiZSBleHBvcnRlZCB0byBhIHNlcGFyYXRlLAotCWNvbW1vbiwgbW9kdWxlIChwcm9iYWJseSBhbG9uZyB3aXRoIGEgbWVzcyBvZiBvdGhlciBvbmVzKS4KLQotU2F0IE1hciAgMiAxMjoxMToyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlJbXByb3ZlIG1vZHRpbWUgc3VwcG9ydC4KLQotCSogYmZkLmg6ICBBZGQgYm9vbGVhbiBtdGltZV9zZXQsIGFuZCBkZWNsYXJlIGJmZF9nZXRfbXRpbWUuCi0JUmVtb3ZlICNkZWZpbmUgZm9yIGJmZF9nZXRfbXRpbWUuICBSZW1vdmUgZ3JhdHVpdG91cyBjb21tZW50LgotCSogYmZkLmMgKGJmZF9nZXRfbXRpbWUpOiAgTmV3IGZuLCBjYWNoZXMgbXRpbWUsIGdldHMgaWYgbm90IGNhY2hlZC4KLQlCVUc6ICBhcmNoaXZlIG1lbWJlcnMgc3RpbGwgZG8gbm90IGdldCBjb3JyZWN0IG1vZCB0aW1lcy4KLQotCUltcHJvdmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBmb3IgY29yZSBmaWxlcy4KLQotCSogc3Vub3MuYyAoc3RydWN0IGNvcmUpOiAgQ2hhbmdlIHZvaWQgKmZwYV9kdW1teSB0byBkb3VibGUgZnBfc3R1ZmYuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBDcmVhdGUgYSBzZWNvbmQgcmVnaXN0ZXJzIHNlY3Rpb24gaW4gdGhlCi0JY29yZSBmaWxlLCBjYWxsZWQgIi5yZWcyIiwgZm9yIHRoZSBmbG9hdCByZWdpc3RlcnMuCi0KLVRodSBGZWIgMTQgMTU6NDk6MDYgMTk5MSAgR3VtYnkgVmluYXlhayBXYWxsYWNlICAoZ3VtYnkgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIG1hbnkgY2hhbmdlcyB0byBpbXByb3ZlIGFyY2hpdmUgaGFuZGxpbmc7IGZvdW5kIGEgbG9naWMgZmxhdyBpbgotCSAgYmZkX2NoZWNrX2Zvcm1hdCB3aGljaCBvbmx5IGp1c3QgaGFwcGVuZWQgdG8gd29yayBieSBjb29uY2lkZW5jZS4KLQotVGh1IEZlYiAxNCAwNzo1MzoxNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IGZpeGVkIHRvIHVzZSBvdXRwdXRfb2Zmc2V0cwotCWNvcnJlY3RseS4KLQotCSogYmZkLmg6IGNoYW5nZWQgdHlwZSBvZiB1ZGF0YSBpbiBhc3ltYm9sIHRvIHZvaWQgKiwgbGlrZSBpdAotCXNob3VsZCBiZS4gQWRkZWQgYmZkX3JlbG9jX2Rhbmdlcm91cyBlbnVtIG1lbWJlci4KLQotCSogY29mZi1jb2RlLmg6IEZpeGVkIGl0IHNvIHRoYXQgaW50ZXJuYWxseSBnZW5lcmF0ZWQgc3ltYm9scyBnZXQKLQl0aGVpciB2YWx1ZXMgcmVsb2NhdGVkIGNvcnJlY3RseSBpbiBhbGwgY2FzZXMuIFJlbW92ZWQgY2FsbHMgdG8KLQl4bWFsbG9jLgotCi0JKiBpY29mZi5jOiBOb3QgdW5kZXJzdGFuZGluZyB0aGUgZGVzdGluYXRpb24gc3ltYm9sIG9mIGEgcmVsb2MgaXMKLQlub3QgYSBmYWlsdXJlIGFueSBtb3JlLCBqdXN0ICdkYW5nZXJvdXMnLiBUaGlzIGFsbG93cyBsaW5raW5nIG9mCi0JYi5vdXQgYW5kIGNvZmYgaW1hZ2VzLgotCi0JKiBzdW5vcy5jOiBDbGVhbmVkIHVwIHRoZSB3YXkgdGhhdCBaTUFHSUMgc2VjdGlvbiBzaXplcyBhcmUKLQljYWxjdWxhdGVkLgotCi0KLVR1ZSBGZWIgMTIgMTM6MjU6NDYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogc3Vub3MuYyAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBmaXhlZAotCXN5bV9wb2ludGVyLT5uX3ZhbHVlIHNvIHRoYXQgc3ltYm9scyBvbiB0aGUgd2F5IG91dCBnZXQgdGhlaXIKLQlzZWN0aW9uIHJlbGF0aXZlIHZhbHVlcyBjYWxjdWxhdGVkIGNvcnJlY3RseS4KLQotCSogY29mZi1jb2RlLmggKG1hbmdsZV9zeW1ib2xzKTogZml4ZWQgcHJvYmxlbSB3aGVyZSB0YWdzIHdlcmUgbm90Ci0JYmVpbmcgcmVsb2NhdGVkIGZvciBzdHJ1Y3RzLCBlbnVtcywgdW5pb25zLiBBbHNvIHZhcmlvdXMgbGludHMuCi0KLU1vbiBGZWIgMTEgMTk6NTI6MjYgMTk5MSAgR3VtYnkgVmluYXlhayBXYWxsYWNlICAoZ3VtYnkgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoZ2V0X2VsdF9hdF9maWxlcG9zKTogc3lzdGVtX2NhbGxfZXJyb3IgcmV0dXJuZWQKLQkgIGluY29ycmVjdGx5LgotCi1TdW4gRmViIDEwIDIzOjE4OjQwIDE5OTEgIEd1bWJ5IFZpbmF5YWsgV2FsbGFjZSAgKGd1bWJ5IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBSZXNvbHZlIHRoZSB1c2Ugb2Ygbm9fZXJyb3IgYW5kIHN5c3RlbV9jYWxsX2Vycm9yLgotCSAgVGhlIGJmZCBsaWJyYXJ5IGl0c2VsZiBub3cgd2lsbCBuZXZlciBzZXQgYmZkX2Vycm9yIHRvCi0JICBub19lcnJvci4KLQotCSAgVGhlIGNvZGUgc3RpbGwgbmVlZHMgdG8gYmUgY29tYmVkIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGVycm9yCi0JICBjb2RlcyBhcmUgY29ycmVjdC4gIEkgc3VzcGVjdCB0aGV5IGFyZSBub3QgYWx3YXlzIHNldCBjb3JyZWN0bHkuCi0KLQkqIFRoZSBuYW1lcyBvZiBhbGwgdGhlIG1lc3NhZ2VzIGhhdmUgXyBwcmVwZW5kZWQgYmVjYXVzZSB0aGUgc3VuCi0JICBidW5kbGVkIGNvbXBpbGVyIGNhbid0IGRpc3Rpbmd1aXNoIGZyb20gYSBtYWNybyB3aGljaCB0YWtlcyBhbgotCSAgYXJndW1lbnQgYW5kIHRoZSBzYW1lIGlkZW50aWZpZXIgaW4gYSBub24tbWFjcm8gY29udGV4dC4KLQotCSogVGhlIHJlYXNvbiBmb3IgdGhlIGFib3ZlIGJlaW5nIHRoYXQgZW50cnkgcG9pbnRzIHdoaWNoIHVzZWQgdG8KLQkgIGJlIHRyYW1wb2xpbmUgZnVuY3Rpb25zIGFyZSBub3cganVzdCBtYWNyb3Mgd2hpY2ggZXhwYW5kIHRvIGEKLQkgIGRpcmVjdCBjYWxsIHRocm91Z2ggdGhlIGJmZCdzIHhmZXIgdmVjdG9yLgotCi0JKiAoLi4vaW5jbHVkZS9pbnRlbC1jb2ZmLmgpIEZfQVIzMldSOiBmaXggdGhpcyBjb25zdGFudC4gIFdoeQotCSAgbXVzdCBnYXMgaGF2ZSBpdHMgb3duIHZlcnNpb24gb2YgZXZlcnl0aGluZyAodGhlIGdhcyB2ZXJzaW9uCi0JICBoYWQgdGhlIGNvcnJlY3QgdmFsdWUpCi0KLVR1ZSBGZWIgIDUgMTE6NDY6NTMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYi5vdXQuYzogQWRkZWQgcGF0Y2hlcyBzdXBwbGllZCBieSBjaHJpc2JAbWlwb24yLmludGVsLmNvbSB0bwotCXByb3Blcmx5IHN1cHBvcnQgaTk2MCBhcmNoaXRlY3R1cmUgYW5kIG91dHB1dCBjb3JyZWN0IHJlbG9jIHN0dWZmLgotCi0JKiBiZmQuaDogYWRkZWQgcHJvdG90eXBlIGZvciBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCwgYWRkZWQKLQlCRkRfRkFJTAotCi0JKiBjb2ZmLWNvZGUuaDogQXBwbGllZCBwYXRjaGVzIGZyb20gY2hyaXNiIHRvIHN1cHBvcnQgaTk2MAotCWFyY2hpdGVjdHVyZSwgemVybyByZWxvY3MgYW5kIHN3YXAgdGhlbSBjb3JyZWNseSBhbmQgY29uZGl0aW9uYWxseQotCWNvbXBpbGVkIHRoZSB0aW1lc3RhbXAuCi0KLQkqIHN1bm9zLmM6IE1hZGUgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgMl4zIHNvIHRoYXQgZG91YmxlcwotCWFyZSBkb25lIHByb3Blcmx5LiBGaXhlZCB0aGUgc2FtZSByZWxvYyBidWcgdGhhdCB3YXMgaW4gYi5vdXQuYwotCi0JKiBzeXNkZXAuaDogTm93IGNvbXBpbGVzIG9uIGEgUG9zaXggYm94Ci0KLVdlZCBKYW4gMzAgMjE6MzY6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpY29mZi5jOiAgRml4IGNvbW1lbnQgb24gYmlnLWVuZGlhbiB2ZXJzaW9uLgotCSogY29mZi1jb2RlLmg6ICBNYWtlIEhBU19SRUxPQyByZWFsbHkgd29yayAoaXQncyBiYWNrd2FyZHMgZnJvbQotCUZfUkVMRkxHKS4gIFNldCBGX0FSMzJXUiBpbiBvdXRwdXQgZmlsZXMgaWYgbGl0dGxlIGVuZGlhbgotCWFyY2hpdGVjdHVyZS4KLQotVHVlIEphbiAyOSAyMDo1NjoxMCBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGFyY2h1cmVzLmMgZml4ZWQgPS89PSB0eXBvCi0KLQkqIHN1bm9zLmMgYWRkZWQgYXJjaGl0ZWN0dXJlIHN0dWZmIGZvciBvdXRwdXQuIEZpeGVkCi0JYnVnIHdoZXJlIGZpbGVzIHdoZXJlIHZtYShkYXRhKSAhPSBzaXplKHRleHQpCi0Jd2VyZSBwcm9jZXNzZWQgd3JvbmcuCi0KLQkqIGNvZmYtY29kZS5oIGFkZGVkIGEgbGludCBjYXN0Ci0KLQkqICguLi9pbmNsdWRlL2Eub3V0LnN1bjQuaCkgZml4ZWQgaXQgc28gem1hZ2ljCi0Jd29ya2VkCi0KLU1vbiBKYW4gMjggMTk6MTU6MjkgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBhcmNoaXZlLmMgcmVtb3ZlZCBsb2FkcyBvZiBpbmNsdWRlcywgYW5kIGZpeGVkIGJ1ZyB3aGVyZSBzdHJpbmcKLQl0YWJsZSBkaWRuJ3QgaGF2ZSBhIG51bGwgYXQgdGhlIGVuZC4KLQotCSogYmZkLmMgZml4ZWQgaW5jbHVkZXMsIGFkZGVkIHN5bWJvbHMgYXJndW1lbnQgdG8KLQljYW5vbmljYWxpemVfcmVsb2MgZW50cnkgcG9pbnQuCi0KLQkqIGxpYmJmZC5jIGZpeGVkIGluY2x1ZGVzIGFuZCBhZGRlZCBzb21lIGxpbnQgcGF0Y2hlcy4KLQotCSogdGFyZ2V0cy5jIGFkZGVkIGJvdGggc29ydHMgb2YgaW50ZWwgY29mZi4KLQotCSogYi5vdXQuYyBmaXhlZCBpbmNsdWRlZCwgY2hhbmdlZCB3YXMgdGhlIGNhbm9uaWNhbAotCXJlbG9jcyB3ZXJlIGRvbmUuCi0KLQkqIGljb2ZmLmMgYWRkZWQgc3VwcG9ydCBmb3IgY2FsbGogYW5kIGJpZyBhbmQgbGl0dGxlCi0JZW5pZGlhbiB0YWJsZXMuCi0KLQkqIG9wbmNscy5jIGFkZGVkIGNobW9kK3hpbmcgZm9yIGZpbGVzIHdpdGggRVhFQ19QIHNldC4KLQotCSogc3Vub3MuYyBmaXhlZCBpbmNsdWRlcy4gQ2hhbmdlZCBkZWZhdWx0IHNlY3Rpb24KLQlhbGlnbmVtZW50IHRvIHdvcmRzLiBGaXhlZCByZWxvY2F0aW9uIHN0dWZmIHRvIHdvcmsgd2l0aAotCW5ldyBzY2hlbWUKLQotCSogYmZkLmggdmFyaW91cyBuZXcgdHlwZXMgYWRkZWQsIHByb3RvdHlwZSBmb3IgbmV3Ci0JcmVsb2MgY2FsbHMsIGNoYW5nZWQgYmZkLT5pb3N0cmVhbSB0byBhIHZvaWQgKgotCXRvIGluY2x1ZGluZyBmaWxlcyBkb24ndCBuZWVkIHN0ZGlvLmguCi0KLQkqIGxpYmNvZmYuaCBhZGRlZCBjb252ZXJzaW9uIHRhYmxlIHRvIHRpZSByZWxvY3MgdG8KLQljYW5vbmljYWwgc3ltYm9scwotCi0JKiBzeXNkZXAuaCBjcmVhdGVkCi0KLQkqIGNvZmYtY29kZS5oIGZpeGVkIGluY2x1ZGVzLiBBZGRlZCBjb2RlIHRvIHN1cHBvcnQKLQliaWcgYW5kIGxpdHRsZSBlbmRpYW4gZm9ybWF0cy4gVmFyaW91cyBsaW50cy4gQmV0dGVyCi0JcHJvY2Vzc2luZyBvZiBzeW1ib2xzLiBDaGFuZ2VkIHJlbG9jIHN0dWZmIHRvIG5ldwotCW9yZGVyCi0KLQkqIGxpYmJmZC5oIGZpeGVkIGluY2x1ZGVzCi0KLQotTW9uIEphbiAyMSAxMTo1Mzo1MSBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGJmZC5oCWNoYW5nZWQgbmFtZSBvZiBhbGlnbm1lbnQgZW50cnkgaW4gc2VjX3N0cnVjdCB0bwotCWFsaWdubWVudF9wb3dlciwgYmVjYXVzZSBvZiBjb25mbGljdGluZyB1c2VzIHdpdGhpbiBiZmQuCi0JTm93IGl0IHNob3VsZCBiZSBvYnZpb3VzIHRoYXQgaXQncyBhIDIqKm4gYWxpZ25tZW50Ci0Jc3BlY2lmaWVyLiBSZW1vdmVkIHN0YXJ0X3BhZCwgZW5kX2FsaWdubWVudCwgYmxvY2ssIG1pbnNpemUsCi0Jb3V0cHV0X2ZpbGVfYWxpZ25tZW50LCBzdWJzZWN0aW9uX2FsaWdubWVudCBhbmQgb3JpZ2luYWxfdm1hIGZpZWxkcy4KLQlBZGRlZCBhbGlnbl9wb3dlcigpIG1hY3JvLiBGaXhlZCBiZmRfc2VjdGlvbl9hbGlnbm1lbnQKLQlhY2Vzc29yIG1hY3Jvcy4gQWRkZWQgYmZkX3N5bWJvbF9zYW1lX3RhcmdldCBtYWNyby4KLQotCSogYi5vdXQuYyAoYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBmaXhlZCB0byB1c2UKLQluZXcgYWxpZ25tZW50IG1lbWJlci4gRml4ZWQgKGNhbGxqX2NhbGxiYWNrKSB0byB1c2Ugc2VjdGlvbgotCXJlbGF0aXZlIHN5bWJvbHMgcHJvcGVybHkuCi0KLQkqIHN1bm9zLmMgKHN1bm9zNF9vYmplY3RfcCkgZml4ZWQgdG8gdXNlIG5ldyBhbGlnbm1lbnRfcG93ZXIuCi0JRml4ZWQgKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpIHRvIGNvcnJlY3RseSBtYWtlCi0Jc3ltYm9scyBzZWN0aW9uIHJlbGF0aXZlLgotCi0JKiBiZmQuYyAoYmZkX2Vycm1zZykgZml4ZWQgdmFyaW91cyBlbnVtIGNhc3QgcHJvYmxlbXMuCi0JKGJmZF9tYWtlX3NlY3Rpb24pIHRvb2sgb3V0IGluaXRpYWxpemF0aW9uIG9mIG9ic29sZXRlIG1lbWJlcnMuCi0JKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpIGFkZGVkCi0KLQkqIG9wbmNscy5jIChiZmRfY3JlYXRlKSBjcmVhdGVkLgotCi0JKiBjb2ZmLWNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKSB0b29rIGF3YXkgcmVmcwotCXRvIG9ic29sZXRlIG1lbWJlcnMuIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpIGFkZGVkCi0JY29udmVyc2lvbiBiZXR3ZWVuIGFsaWdubWVudCB0eXBlcy4gKGNvZmZfc3ltYm9sX2Zyb20pCi0JYWRkZWQuIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKSBvbmx5IGNvdW50cyBsaW5lbnVtYmVycwotCWlmIHN5bWJvbCBpcyBvZiBjb2ZmLXR5cGUuIChjb2ZmX21hbmdsZV9zeW1ib2xzKSBvbmx5Ci0JaGVhdmlseSBtYW5nbGVzIHN5bWJvbHMgaWYgc3ltYm9sIGlzIGNvZmYtdHlwZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKSB2YXJpb3VzIGxpbnRzLiAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpCi0JdmFyaW91cyBsaW50cyBhbmQgbW9kaWZpY2F0aW9uIGZvciBhbGlnbm1lbnQgY29udmVyc2lvbi4KLQkoY29mZl9zbHVycF9yZWxvY3MpIGZpeGVkIGZvciB1c2Ugd2l0aCBuZXcgYXNlY3Rpb24gc2hhcGUuCi0KLVNhdCBKYW4gMTkgMTY6MTA6NDIgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBhcmNoaXZlLmMgbG90cyBvZiBsaW50Ci0KLQkqIGIub3V0LmMgYWRkZWQgY2FsbGogcmVsb2NhdGlvbiBzdXBwb3J0LCB1cGdyYXRlZCByZWxvYyBob3d0by4KLQlGaXhlZCBzbyB0aGF0IGFzeW1ib2wgYW5kIHJlbG9jIHJlY29yZHMgYXJlIG91dHB1dAotCWNvcnJlY3RseS4KLQotCSogYmZkLmMgbG90cyBvZiBsaW50LCBzdXBwb3J0IGZvciBuZXcgYmZkIGVudHJ5IHBvaW50Ci0JYmZkX3ByaW50X3N5bWJvbC4KLQotCSogYmZkLmggY2hhbmdlZCBkZWZpbml0aW9uIG9mIGFzeW1ib2wgdG8gY29udGFpbiBwb2ludGVyIHRvCi0Jb3duaW5nIGJmZCwgcmVtb3ZlZCB0YXJnZXQgZGVwZW5kZW5jaWVzLgotCi0JKiBjYWNoZS5jIHRvb2sgb3V0IHByaW50IHN0YXRlbWVudHMsIHB1dCBpbiBCRkRfQVNTRVJUIGNhbGxzLgotCi0JKiBjb2ZmLWNvZGUuaCB2YXJpb3VzIGxpbnRzLCBjb3JyZWN0ZWQgbGluZW51bWJlciBvdXRwdXQKLQlmdW5jdGlvbmFsaXR5LiBBZGRlZCBzdXBwb3J0IGZvciBuZXcgc3R5bGUgYXN5bWJvbHMgYW5kCi0JYmZkX3ByaW50X3N5bWJvbC4gRml4ZWQgc28gdGhhdCBhc3ltYm9sIGFuZAotCXJlbG9jIHJlY29yZHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiBBZGRlZCB0aW1lc3RhbXAuCi0KLQkqIGljb2ZmLmMgQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGhvd3RvIHNoYXBlLgotCi0JKiBsaWJhLm91dC5oIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBhc3ltYm9sIHNoYXBlCi0KLQkqIGxpYmJmZC5jIHZhcmlvdXMgbGludHMKLQotCSogbGliYmZkLmggdmFyaW91cyBsaW50cwotCi0JKiBsaWJjb2ZmLmggYWRkZWQgc3VwcG9ydCBmb3IgbmV3IGFzeW1ib2wgc2hhcGUuCi0KLQkqIHN1bm9zLmMgIHZhcmlvdXMgbGludHMuIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBhc3ltYm9sIHNoYXBlCi0JYW5kIGJmZF9wcmludF9zeW1ib2wuCi0KLVdlZCBKYW4gMTYgMjE6Mzg6MDkgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBiLm91dC5jIHJlbW92ZWQgcHJvdG90eXBlIG9mIHN1bm9zNF9lbm5hdGl2YXRlX3N5bXRhYiwgbG90cyBvZgotCXBvaW50ZXIgbGludC4gQWRkZWQgc3VwcG9ydCBmb3IgY2FsbGogcmVsb2NhdGlvbi4gRml4ZWQgYnVnIHdoZXJlCi0JdGhlIGxhc3QgMzIgYnl0ZXMgb2YgdGhlIHRleHQgc2VjdGlvbiB3ZXJlIG92ZXJ3cml0dGVuIGJ5IGRhdGEuIEZpeGVkIGJ1ZwotCXdoZXJlIGFyY2hpdmVzIG9mIGIub3V0IGRpZG4ndCB3b3JrIGR1ZSBiZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotCXJldHVybmluZyBmYWxzZS4KLQotCSogc3Vub3MuYyBhZGRlZCBzdXBwb3J0IGZvciBuX290aGVyIGZpZWxkLiBCcmFjZWQgdGhlIGhvd3RvIHRhYmxlIHNvCi0JdGhhdCBpdCB3b24ndCBiZSBhZmZlY3RlZCBieSBhbnkgbGVuZ3RoaW5nIG9mIHRoZSBob3d0byBzdHJ1Y3QgdHlwZWRlZi4KLQlWYXJpb3VzIGxpbnRzCi0KLQkqIGJmZC5oIGFkZGVkIHN1cHBvcnQgZm9yIG5fb3RoZXIgZmllbGQsIGFkZGVkIHNwZWNpYWxfZnVuY3Rpb24KLQlyZWxvYyB0eXBlLCBtb2RpZmllZCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHByb3RvdHlwZS4gQWRkZWQgYmZkX2hfZ2V0X3gKLQltYWNyb3MuCi0KLQkqIGJmZC5jIHVwZ3JhZGVkIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIHZhcmlvdXMgbGludHMuCi0KLVdlZCBKYW4gMTYgMDE6NTU6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IHJ0bCkKLQotCSogQ2hhbmdlTG9nOiAgU3RhcnRlZCBDaGFuZ2VMb2cgZm9yIEJGRC4KLQkqIFRvRG86ICBDcmVhdGUgZmlsZSBmb3Igc3VnZ2VzdGlvbnMuCi0KLQkqIE1ha2VmaWxlOiAgU3VwcG9ydCBlYXN5IGxvYWRpbmcgaW50byBTYWJlciBDLgotCUFkZCBkZXBlbmRlbmNpZXMgZm9yIGljb2ZmLm8gYW5kIGJjczg4a2NvZmYuby4KLQlSZW5hbWUgY29mZi5jIHRvIGNvZmYtY29kZS5oLiAgQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGJmZC5jIChiZmRfY2hlY2tfZm9ybWF0KTogIEFsbG93IHRoZSBjaGVja19mb3JtYXQgcm91dGluZXMKLQl0byByZXR1cm4gdGhlIGRlc2lyZWQgdGFyZ2V0IHZlY3RvciwgcmF0aGVyIHRoYW4ganVzdCBhIEJvb2xlYW4uCi0JYmZkLmggKGJmZF9jaGVja19mb3JtYXQpOiAgQ2hhbmdlIGZ1bmN0aW9uIHBvaW50ZXIgcmV0dXJuIHR5cGUuCi0JYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiAgY2hhbmdlIGNhbGxlZS4KLQliLm91dC5jIChiX291dF9saXR0bGVfb2JqZWN0X3AsIGJfb3V0X2JpZ19vYmplY3RfcCwKLQliX291dF9yZWFsX29iamVjdF9wKTogIGNoYW5nZSBjYWxsZWUuCi0JbGliYmZkLmMgKF9iZmRfZHVtbXlfdGFyZ2V0KTogIER1bW15IHJvdXRpbmUgcmVwbGFjaW5nIGJmZF9mYWxzZQotCWluIGNoZWNrX2Zvcm1hdCB0cmFuc2ZlciB2ZWN0b3JzIHRoYXQgbmVlZCBhIGZpbGxlci4KLQlsaWJiZmQuaCAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldCk6ICBGaXggZGVjbHMuCi0JYmNzODhrY29mZi5jOiAgY2hhbmdlIGNhbGxlZS4KLQljb2ZmLWNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wLCBjb2ZmX2JpZ19vYmplY3RfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCWljb2ZmLmM6ICBjaGFuZ2UgY2FsbGVlLgotCXN1bm9zLmMgKHN1bm9zNF9vYmplY3RfcCwgc3Vub3M0X2NvcmVfZmlsZV9wKTogIGNoYW5nZSBjYWxsZWUuCi0KLQkqIGxpYmJmZC5jICh6YWxsb2MpOiAgSXQgc2hvdWxkIGFjdHVhbGx5IHplcm8gdGhlIHN0b3JhZ2UhCi0JVGhpcyB3YXMgY29tbWVudGVkIG91dCBmb3Igc29tZSByZWFzb24uCi0KLQkqIGxpYmJmZC5oOiAgQWRkIG1hbGxvYywgeG1hbGxvYywgbWVtY3B5LCBhbmQgZmF0YWwgZGVjbHMuCi0JVGhpcyBpcyBzbyBjYWxsZXJzIGNhbiBhdm9pZCA8c3RkbGliLmg+IHdoaWNoIGRvZXNuJ3QgZXhpc3QKLQlvbiBvbGRlciBzeXN0ZW1zLgotCi0JKiBiZmQuYyAobWFwX292ZXJfc2VjdGlvbnMpOiAgQWRkIGRlYnVnZ2luZyBjb2RlLCBzaW5jZSBJCi0Jbm90aWNlZCB0aGUgc2VjdGlvbiBjb3VudCBmb3Igc3Vub3MgY29yZSBmaWxlcyB3YXMgYmFkLCBidXQgb25seQotCUdEQiBoYWQgZGV0ZWN0ZWQgdGhlIHByb2JsZW0uCi0JKGJmZF9zZXRfc2VjdGlvbl9saW5lbm9fc2l6ZSwgYmZkX3NldF9zZWN0aW9uX2xpbmVub3MsCi0JYmZkX2dldF9zZWN0aW9uX2xpbmVub3MpOiAgUmVtb3ZlIG9ic29sZXRlIGZ1bmN0aW9ucy4KLQkoYmZkX2FwcGx5X3JlbG9jYXRpb25zKTogIFVzZSBsb25ncywgbm90IGludHMsIGZvciB0aGUgbWF0aC4KLQotCSogYmZkLmg6ICBEZWNsYXJlIGVudW0gYm9vbGVhbiBhbmQgc3RydWN0IGJmZF90YXJnZXQgYXMgd2VsbAotCWFzIHR5cGVkZWZzIGZvciB0aGVtLiAgUmVtb3ZlIG9ic29sZXRlCi0JYmZkX2dldF9zZWN0aW9uX2xpbmVub19zaXplLgotCi0JKiBjYWNoZS5jOiAgTWFrZSB0aGUgImZkb3BlbiIgc3VwcG9ydCB3b3JrLiAgS2VlcCBiZXR0ZXIgdHJhY2sKLQlvZiBob3cgbWFueSBmaWxlcyBhcmUgb3Blbi4gIENlbnRyYWxpemUgdGhlIG9wZW5pbmcgb2YgZmlsZXMKLQlhbmQgYmUgc3VyZSBiZmRfb3Blbltyd10gYWN0dWFsbHkgdHJ5IHRvIG9wZW4gdGhlIGZpbGUuICBFdmFkZQotCWxpbmtlZCBsaXN0IGluaXRpYWxpemF0aW9uIHByb2JsZW1zLgotCi0JKiBiLm91dC5jLCBjb2ZmLWNvZGUuaCwgb3BuY2xzLmMsIHN1bm9zLmM6ICBsaW50LgotCi0JKiBjb2ZmLWNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgTnVsbC10ZXJtaW5hdGUgc3ltdGFiIG5hbWVzLgotCi0JKiBjcGx1cy1kZW0uYzogIERlbGV0ZSBmaWxlLCBzaW5jZSBpdCBpcyBub3QgcGFydCBvZiBCRkQuCi0KLQkqIG9wbmNscy5jIChiZmRfb3BlbnIpOiAgRWxpbWluYXRlIG1pc3BsYWNlZCAjaWYgMCBjb2RlLgotCShiZmRfb3BlbnIsIGJmZF9vcGVudyk6ICBBY3R1YWxseSBvcGVuIHRoZSBmaWxlLCBnaXZlIGVycm9yIG5vdy4KLQotCSogc3Vub3MuYyAoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFNldCBzZWN0aW9uIGNvdW50LgotCShzdW5vczRfc2V0X3NlY3Rpb25fbGluZW5vcywgc3RhYl9uYW1lcywgZnByaW50X25hbWUpOiAgRWxpbWluaWF0ZQotCW9ic29sZXRlIGRlZmluaXRpb25zLgotCShfd3JpdGVfc3ltYm9sX3RhYmxlKTogIEluaXRpYWxpemUgPGlkeD4gY291bnRlci4KLQkoZm9vcCk6ICBFbGltaW5hdGUgZGVidWdnaW5nIGNvZGUuCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nLTk0OTUgYi9iZmQvQ2hhbmdlTG9nLTk0OTUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Njg1ODMuLjAwMDAwMDAKLS0tIGEvYmZkL0NoYW5nZUxvZy05NDk1CisrKyAvZGV2L251bGwKQEAgLTEsMTAwNDMgKzAsMCBAQAotVGh1IERlYyAyMSAxMjo0Mzo0OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEFkZCBhIHBob255IHJlbG9jIHRvIGhhbmRsZSB0aGUKLQlvbGQgc3R5bGUgVE9DMTYgcmVmZXJlbmNlcyB3aXRob3V0IHVzaW5nIFJfUFBDX0dPVC4KLQkocHBjX3JlbG9jX3R5cGUpOiBEaXR0by4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBzdXBwb3J0IGZvciBUT0MxNi4KLQkocHBjX2VsZl90b2MxNl9pbm5lcik6IFJlbmFtZWQgZnJvbSBwcGNfZWxmX2dvdDE2X2lubmVyLgotCShwcGNfZWxmX3RvYzE2X3JlbG9jKTogUmVuYW1lZCBmcm9tIHBwY19lbGZfdG9jMTZfcmVsb2MuCi0JKHBwY19lbGZfZ290MTZfe2lubmVyLHJlbG9jfSk6IFN0dWJzIGZvciByZWFsIEdPVCBzdXBwb3J0LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbiBmb3IgR09UL1BMVCBzdXBwb3J0IHRoYXQgaXMKLQl3b3JrIGluIHByb2dyZXNzLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERpdHRvLgotCShwcGNfZWxmX2FkanVzdF9keW5pbmR4KTogRGl0dG8uCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGl0dG8uCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRGl0dG8uCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEaXR0by4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBEZWZpbmUuCi0KLVdlZCBEZWMgMjAgMTk6MTQ6MTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBXaGVuIGF0dGFjaGluZyBzZWN0aW9ucyB0bwotCXNlZ21lbnRzIGlnbm9yZSBzZWN0aW9ucyB0aGF0IHdvbid0IGJlIGFsbG9jYXRlZC4gIFBhdGNoIGZyb20KLQlBbmRyZWFzIFNjaHdhYi4KLQotVHVlIERlYyAxOSAyMDowMTo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogTWF0Y2ggb24gbTY4ay1jYm0tKiBvbmx5IGlmIE9TIGRvZXNuJ3QgbWF0Y2gKLQlhbnl0aGluZyBlbHNlLgotCi1UdWUgRGVjIDE5IDE2OjM4OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKENBTENfQURERU5EKTogRGVmaW5lLgotCShjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCB0aGUgaW5wdXQgc2VjdGlvbiBWTUEgdG8gdGhlCi0JYWRkZW5kIGZvciBQQyByZWxhdGl2ZSByZWxvY3MuCi0KLVN1biBEZWMgMTcgMjA6MTE6NTUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcGRhdGEpOiBNdXN0IHRlc3QgdGhlIGVudGlyZSBlbnRyeSBmb3IgemVybwotCXRvIGNvcnJlY3RseSB0ZXJtaW5hdGUuCi0KLUZyaSBEZWMgMTUgMTI6MDU6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGVudW0gYmZkX2VuZGlhbik6IERlZmluZS4KLQkoYmZkX3RhcmdldCk6IFJlbmFtZSBieXRlb3JkZXJfYmlnX3AgdG8gYnl0ZW9yZGVyLCBhbmQgY2hhbmdlIGl0Ci0JZnJvbSBib29sZWFuIHRvIGVudW0gYmZkX2VuZGlhbi4gIENoYW5nZSBoZWFkZXJfYnl0ZW9yZGVyX2JpZ19wCi0JY29ycmVzcG9uZGluZ2x5LgotCSogYmZkLWluLmggKGJmZF9iaWdfZW5kaWFuLCBiZmRfbGl0dGxlX2VuZGlhbik6IE5ldyBtYWNyb3MuCi0JKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiwgYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuKTogTmV3IG1hY3Jvcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIEFsbCB0YXJnZXRzOiBDaGFuZ2UgaW5pdGlhbGl6YXRpb24gb2YgYnl0ZW9yZGVyIGFuZAotCWhlYWRlcl9ieXRlb3JkZXIgdG8gdXNlIGVudW0gYmZkX2VuZGlhbiB2YWx1ZXMgcmF0aGVyIHRoYW4KLQlib29sZWFucy4KLQkqIEFsbCBmaWxlczogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvIGJ5dGVvcmRlcl9iaWdfcCBhbmQKLQloZWFkZXJfYnl0ZW9yZGVyX2JpZ19wIHRvIHVzZSBuZXcgYmZkXypfZW5kaWFuIG1hY3Jvcy4KLQotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBTZXQgbG1hIHRvIHNfcGFkZHIsIG5vdAotCXNfdmFkZHIuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBzX3BhZGRyIHRvIGxtYSwgbm90Ci0Jdm1hLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQotRnJpIERlYyAxNSAwNzozMjowOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZVtpXS1pMzg2LmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogRGVmaW5lIHRvICdfJy4KLQotVGh1IERlYyAxNCAxMzo0NTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogTG90cyBvZiBtaW5vciBjbGVhbnVwcy4gIE1ha2UgbWFueSBmdW5jdGlvbnMgcmV0dXJuCi0JZXJyb3JzIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuICBBbHNvOgotCShpZWVlX3dyaXRlX3R3b2J5dGUpOiBSZW1vdmU7IGNoYW5nZSBjYWxsZXJzIHRvIGNhbGwgZXhpc3RpbmcKLQlpZWVlX3dyaXRlXzJieXRlcyBmdW5jdGlvbi4KLQkoaWVlZV93cml0ZV9leHByZXNzaW9uKTogRG9uJ3Qgb3V0cHV0IHRoZSBzZWN0aW9uIHR3aWNlIHdoZW4KLQlvdXRwdXR0aW5nIGEgbG9jYWwgc3ltYm9sLiAgRG9uJ3QgZW1pdCBhbiBleHRyYW5lb3VzIHplcm8gaWYgdGhlcmUKLQlpcyBvbmx5IG9uZSB0ZXJtLgotCShpZWVlX3NsdXJwX3NlY3Rpb25zKTogU2V0IHRoZSBsbWEgYXMgd2VsbCBhcyB0aGUgdm1hLgotCShpZWVlX2FyY2hpdmVfcCk6IFVzZSBiZmRfYWxsb2NfZ3JvdyByYXRoZXIgdGhhbiBhbiBvYnN0YWNrLgotCi0JKiBpaGV4LmMgKGloZXhfc2V0X2FyY2hfbWFjaCk6IERvbid0IGFjY2VwdCBhbnkgYXJjaGl0ZWN0dXJlLCBqdXN0Ci0JYSByZWNvZ25pemVkIG9uZSBvciBiZmRfYXJjaF91bmtub3duLgotCShpaGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEZWZpbmUgYXMgYmZkXzBsLCB0byBwZXJtaXQgb2JqY29weQotCXRvIHN1Y2NlZWQuCi0JKGloZXhfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCi1XZWQgRGVjIDEzIDE1OjQ0OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaDogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdGFibGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzKTogRGVmaW5lLgotCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5KTogRGVmaW5lLgotCShhb3V0X2xpbmtfaW5jbHVkZXNfbG9va3VwKTogRGVmaW5lIG1hY3JvLgotCShzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8pOiBBZGQgaW5jbHVkZXMgZmllbGQuCi0JKGFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSW5pdGlhbGl6ZSBpbmNsdWRlcyBoYXNoIHRhYmxlLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IEVsaW1pbmF0ZSBkdXBsaWNhdGUgTl9CSU5DTCBlbnRyaWVzLgotCi1XZWQgRGVjIDEzIDEwOjUyOjE0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogTWF0Y2ggb24gbWlwcy0qLSogaW5zdGVhZCBvZiBtaXBzLWlkdC1lY29mZi4KLQotV2VkIERlYyAxMyAxMTowNzo0NSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IHJlbW92ZWQgZGVidWdnaW5nIGNvZGUuCi0KLVR1ZSBEZWMgMTIgMTc6NDI6MDYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcmVsb2MpOiBOZXcgZnVuY3Rpb24gdG8gZHVtcCB0aGUgLnJlbG9jIHNlY3Rpb24uCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBjYWxsIHBlX3ByaW50X3JlbG9jLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiAucmVsb2Mgc2VjdGlvbiBhbGlnbm1lbnQuCi0JKiBjb2ZmLXBwYy5jIChpbl9yZWxvY19wKTogQWRkZWQgbWlzc2luZyBub24tZWxpZ2libGUgcmVsb2NzLiBTcGlmZmVkCi0JdXAgc29tZSBkZWJ1Z2dpbmcgYXMgd2VsbC4KLQotVHVlIERlYyAxMiAxMTozNDoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEhhbmRsZSBzcGFyYy0qLWVsZiouICBGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUKLQk8cmZnQG1vbmtleXMuY29tPi4KLQotRnJpIERlYyAgOCAxNzo0NzowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHNlY3Rpb25fY291bnQgdG8gMAotCXdoZW4gc2V0dGluZyBzZWN0aW9ucyB0byBOVUxMLgotCi1XZWQgRGVjICA2IDE3OjA1OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbyk6IEFkZCBleHBvcnRfZGVmaW5lZHMKLQlmaWVsZC4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBleHBvcnRfZGVmaW5lZHMgcGFyYW1ldGVyLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBJZiBleHBvcnRfZGVmaW5lZHMgaXMgc2V0LCBzZXQgWENPRkZfRVhQT1JUCi0JZm9yIGFsbCBzeW1ib2xzLgotCSogYmZkLWluLmggKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBEZWMgIDQgMTY6NDA6NDcgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogUmVtb3ZlZCBzb21lIGRlYnVnZ2luZyBwcmludGYncwotCi1Nb24gRGVjICA0IDExOjI1OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBIYW5kbGUgcmVjb3JkIHR5cGVzIDQgYW5kIDUuCi0JKGloZXhfb2JqZWN0X3ApOiBQZXJtaXQgdHlwZXMgNCBhbmQgNS4KLQkoaWhleF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFJlbW92ZSBjaGVjayBmb3Igb3V0IG9mIHJhbmdlCi0JYWRkcmVzc2VzLgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEdlbmVyYXRlIHR5cGVzIDQgYW5kIDUuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEp1c3QgaWdub3JlIHdhcm5pbmcgYW5kCi0JaW5kaXJlY3QgcmVmZXJlbmNlcyB0byBzeW1ib2xzIHdoaWNoIGRvbid0IHJlYWxseSBleGlzdC4KLQotU3VuIERlYyAgMyAxOTowMDoyNyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IE1pbm9yIGZvcm1hdCBmaXhlcwotCShwZV9wcmludF9lZGF0YSk6IE5ldyBmdW5jdGlvbi4gVW5kZXIgcHJpdmF0ZSBwcmludGluZywgdGhpcyBmb3JtYXRzCi0JdGhlIGVkYXRhIHNlY3Rpb24gb2YgYSBQRSBmaWxlLgotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkZWQgY2FsbCB0byBwZV9wcmludF9lZGF0YS4KLQotU3VuIERlYyAgMyAxNjo0Njo1NCAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGFvdXQtYXJtLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX291dCk6IFVzZSBLRUVQSVQgdG8gZ2V0IHRoZSBzeW1ib2wKLQlpbmRleCwgZG9uJ3QgY2FsbCBzdG9pLgotCi1GcmkgRGVjICAxIDE0OjQ2OjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBTZXQgbG1hIGFzIHdlbGwgYXMgdm1hLgotCi0JKiBpaGV4LmM6IE5ldyBmaWxlOyBzdXBwb3J0IGZvciBJbnRlbCBIZXggZm9ybWF0LgotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9mbGF2b3VyKTogQWRkIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLgotCShpaGV4X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWx3YXlzIGluY2x1ZGUgaWhleF92ZWMuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgaWhleF9kYXRhIGZpZWxkIHRvIHRkYXRhIHVuaW9uLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IEFkZCBpaGV4Lm8KLQkoQkZEX0xJQlNfQ0ZJTEVTKTogQWRkIGloZXguYy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBTb3J0IHRoZSBzZWN0aW9ucyBpbgotCWVhY2ggc2VnbWVudC4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBSZXR1cm4gdGhlIHJpZ2h0IHNpemUgaWYgc2VnbWVudF9tYXAgaXMKLQlub3QgTlVMTC4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgYm90aGVyIHRvIHNvcnQgdGhlIHNlY3Rpb25zLgotCi0JKiBiZmQuYyAoYmZkX3JlY29yZF9waGRyKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9yZWNvcmRfcGhkcik6IERlY2xhcmUuCi0JKiBiZmRfaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgYm9ndXMKLQlCRkRfQVNTRVJULgotCi0JKiBsaWJiZmQuYyAoYmZkX21hbGxvYywgYmZkX3JlYWxsb2MpOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfem1hbGxvYyk6IFJldHVybiBQVFIsIG5vdCBjaGFyICouICBUYWtlIHNpemVfdCwgbm90Ci0JYmZkX3NpemVfdHlwZS4KLQkqIGxpYmJmZC1pbi5oIChiZmRfbWFsbG9jLCBiZmRfcmVhbGxvYyk6IERlY2xhcmUuCi0JKGJmZF96bWFsbG9jKTogQ2hhbmdlIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYW55IGZpbGVzOiBVc2UgYmZkX21hbGxvYyBhbmQgYmZkX3JlYWxsb2MgcmF0aGVyIHRoYW4gbWFsbG9jCi0JYW5kIHJlYWxsb2MuICBEb24ndCBzZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiB0aGV5IGZhaWwuCi0KLVRodSBOb3YgMzAgMTk6MzI6MjYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmM6IEFkZGVkIG1hY3JvcyB0byB0aWR5IHVwIHRvYyBjZWxsIHRyZWF0bWVudC4gTnVtZXJvdXMKLQl1c2VzIGFzIHdlbGwuIEFkZGVkIGEgbmV3IGhvd3RvIHRvIGRlYWwgd2l0aCBUT0NSRUwxNiByZWxvY3MgdGhhdAotCWFyZSBUT0NERUZOIGFzIHdlbGwuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBFeHBhbmRlZCB0cmVhdG1lbnQgb2YgQUREUjMyTkIgcmVsb2NzCi0JdG8gaGFuZGxlIFJWQSByZWxvY3MgZnJvbSBkbGx0b29sLgotCShwcGNfY29mZl9ydHlwZTJob3d0byk6IFRPQ0RFRk4gcmVsb2MgYWRkaXRpb24uCi0JKGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvKTogVE9DREVGTiByZWxvYyBhZGRpdGlvbi4KLQkocHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBUT0NERUZOIHJlbG9jIGFkZGl0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IGNoZWNrIGlkYXRhJFggc2VjdGlvbnMKLQl0byBnZXQgdGhlIHJpZ2h0IHNlY3Rpb24gYWxpZ25tZW50LgotCi1UaHUgTm92IDMwIDE2OjQ4OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCBzZXQgbG1hIGJhc2VkIG9uCi0JcF9wYWRkciBpZiBwX3BhZGRyIGlzIHplcm8uCi0JKG1ha2VfbWFwcGluZyk6IFNldCBpbmNsdWRlc19maWxlaGRyIGFuZCBpbmNsdWRlc19waGRycyBmb3IgZmlyc3QKLQlQVF9MT0FEIHNlZ21lbnQuCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IFNldCBpbmNsdWRlc19waGRycyBmb3IgUFRfUEhEUgotCXNlZ21lbnQuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBIYW5kbGUgaW5jbHVkZXNfZmlsZWhkciBhbmQKLQlpbmNsdWRlc19waGRycy4gIFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIFBUX1BIRFIgYW5kIGZpcnN0Ci0JUFRfTE9BRCBzZWdtZW50cy4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogU2V0IGluY2x1ZGVzX2ZpbGVoZHIgYW5kIGluY2x1ZGVzX3BoZHIKLQl3aGVuIGFwcHJvcHJpYXRlLiAgUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgUFRfUEhEUiBzZWdtZW50LgotCVVzZSBhIG1vcmUgY29tcGxleCBjb25kaXRpb24gZm9yIHdoZW4gYSBzZWN0aW9uIGlzIGluY2x1ZGVkIGluIGEKLQlzZWdtZW50IHRvIGhhbmRsZSBTb2xhcmlzIGxpbmtlciBvZGRpdGllcy4KLQotVGh1IE5vdiAzMCAxMToxNzozMyAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29mZi1tODhrLmMgKGhvd3RvX3RhYmxlKTogUmVmb3JtYXR0ZWQgZm9yIGVhc2llciByZWFkaW5nOwotCXNwZWNpYWxfZnVuY3Rpb24gbm93IHBvaW50cyB0byBuZXcgZnVuY3Rpb24gbTg4a19zcGVjaWFsX3JlbG9jLgotCShob3d0b19odnJ0MTYpOiBGdW5jdGlvbiBwcmV2aW91c2x5IHVzZWQgZm9yIGhhbmRsaW5nIEhWUlQxNiByZWxvY3MKLQlyZW1vdmVkLgotCShydHlwZTJob3d0byk6IERvIG5vdCBhZGQgcmVsb2MncyByX29mZnNldCB0byB0aGUgYWRkZW5kLCB0aGlzIHdpbGwKLQliZSBkb25lIGNvcnJlY3RseSBieSBtODhrX3NwZWNpYWxfcmVsb2MuCi0JKHJlbG9jX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24gdG8gYmUgdXNlZCBieSBSRUxPQ19QUk9DRVNTSU5HLgotCShSRUxPQ19QUk9DRVNTSU5HKTogRGVmaW5lIHRvIGNhbGwgcmVsb2NfcHJvY2Vzc2luZy4KLQotV2VkIE5vdiAyOSAxMjo0MjozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBDYWxsIG1hbGxvYyByYXRoZXIgdGhhbiB4bWFsbG9jLgotCShwZV9wcmludF9wZGF0YSk6IExpa2V3aXNlLgotCi0JKiBvcG5jbHMuYyAoYmZkX2FsbG9jX2J5X3NpemVfdCk6IFNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmCi0Jb2JzdGFja19hbGxvYyBmYWlscy4KLQkoYmZkX2FsbG9jX2ZpbmlzaCk6IFNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmIG9ic3RhY2tfZmluaXNoCi0JZmFpbHMuCi0JKiBsaWJiZmQuYyAoYmZkX3ptYWxsb2MpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiBtYWxsb2MgZmFpbHMuCi0JKiBNYW55IGZpbGVzOiBkb24ndCBzZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiBvbmUgb2YgdGhlIGFib3ZlCi0Jcm91dGluZXMgZmFpbHMuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRG9uJ3QgYWRqdXN0IHBfcGFkZHIKLQlpZiBwX3BhZGRyX3ZhbGlkIGlzIHNldC4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENhbGwgY29weV9wcml2YXRlX2JmZF9kYXRhLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEZpeCBjYXNlIHdoZXJlIGV4dHJhCi0JcHJvZ3JhbSBoZWFkZXJzIHdlcmUgYWxsb2NhdGVkLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lIHRvCi0JX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luKTogRG9uJ3QgYWJvcnQgaWYKLQlyX3N5bW5keCBpcyBSRUxPQ19TRUNUSU9OX05PTkUgZm9yIGFuIEFMUEhBX1JfSUdOT1JFIHJlbG9jLgotCUNoYW5nZSBhIFJFTE9DX1NFQ1RJT05fTElUQSBzeW1uZHggdG8gUkVMT0NfU0VDVElPTl9BQlMuCi0JKGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogQ2hhbmdlIFJFTE9DX1NFQ1RJT05fQUJTIHRvCi0JUkVMT0NfU0VDVElPTl9MSVRBIGZvciBBTFBIQV9SX0lHTk9SRS4KLQkoYWxwaGFfYWRqdXN0X3JlbG9jX291dCk6IEZvciBBTFBIQV9SX0lHTk9SRSwgZG9uJ3QgY2hhbmdlCi0JUkVMT0NfU0VDVElPTl9BQlMgdG8gUkVMT0NfU0VDVElPTl9OT05FLgotCi1UdWUgTm92IDI4IDE2OjU5OjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBzZWdtZW50X21hcCBmaWVsZC4KLQkqIGVsZi5jIChtYWtlX21hcHBpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfc29ydF9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IFJlbW92ZS4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBSZW1vdmUgc29ydGVkX2hkcnMsIGNvdW50LCBhbmQKLQltYXhwYWdlc2l6ZSBwYXJhbWV0ZXJzLiAgU2ltcGxpZnkuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogV2hlbiBnZW5lcmF0aW5nIGFuCi0JZXhlY3V0YWJsZSwgdXNlIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMuCi0JKGVsZl9zb3J0X2hkcnMpOiBSZW1vdmUuCi0JKF9iZmRfZWxmX3NpemVvZl9oZWFkZXJzKTogUmVtb3ZlIGVsaW1pbmF0ZWQgcGFyYW1ldGVycyBmcm9tIGNhbGwKLQl0byBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KLQotTW9uIE5vdiAyNyAxMjoyNzo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwMzAwaHB1eC5jIChNWShjYWxsYmFjaykpOiBTZXQgbG1hIGFzIHdlbGwgYXMgdm1hLgotCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuNy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBTZXQgY29ycmVjdGx5LCB0byAxLgotCSogZWxmMzItc3BhcmMuYyAoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogU2V0IGNvcnJlY3RseSwgdG8gMC4KLQotV2VkIE5vdiAyMiAxMjowMjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IEhhbmRsZSAucmNvbnN0IHNlY3Rpb24uCi0JKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBIYW5kbGUgU1RZUF9SQ09OU1QuCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEhhbmRsZSBzY1JDb25zdC4KLQkoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9SQ09OU1QuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEhhbmRsZSAucmNvbnN0IHNlY3Rpb24uCi0JKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogSGFuZGxlIHNjUkNvbnN0LgotCShlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IEhhbmRsZSAucmNvbnN0IHNlY3Rpb24uCi0JKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IEhhbmRsZSBzY1JDb25zdC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyk6IEhhbmRsZSAucmNvbnN0Ci0Jc2VjdGlvbi4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSRUxPQ19TRUNUSU9OX1JDT05TVC4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IE9ubHkgc2V0IHdyaXR0ZW4gaWYgdGhlCi0JREVGX0RZTkFNSUMgZmxhZyBpcyBzZXQuCi0KLVR1ZSBOb3YgMjEgMTM6MjU6MjkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGhvc3QtYW91dC5jOiBJZiBUUkFEX0hFQURFUiBpcyBkZWZpbmVkLCBpbmNsdWRlIGl0LgotCi1UdWUgTm92IDIxIDEzOjAzOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQUNfUFJPR19DQyk6IFJlbW92ZSBsb2NhbCBkZWZpbml0aW9uLgotCShCRkRfQklOQVJZX0ZPUEVOKTogUmVxdWlyZSBBQ19DQU5PTklDQUxfU1lTVEVNLgotCShCRkRfTkVFRF9ERUNMQVJBVElPTik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9ORUVEX0RFQ0xBUkFUSU9OLgotCSogYWNjb25maWcuaDogUHV0IE5FRURfREVDTEFSQVRJT05fKiBpbiBAVE9QQCBzZWN0aW9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2xlYXIKLQlzcGVjaWFsX3NlY3Rpb25zIGJlZm9yZSByZXR1cm5pbmcgd2hlbiBjYWxsZWQgd2l0aCBhIG5vbiBYQ09GRgotCUJGRC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBTb3J0IGNvbW1vbiBzeW1ib2xzIHdpdGgKLQlnbG9iYWwgc3ltYm9scy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IHBhZCB0aGUKLQlwcmV2aW91cyBzZWN0aW9uIHRvIGZvcmNlIGZpbGUgYWxpZ25tZW50IHdoZW4gY3JlYXRpbmcgYW4KLQlleGVjdXRhYmxlLgotCi1Nb24gTm92IDIwIDE0OjU0OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZgotCVJTNjAwMENPRkZfQywgc2V0IHVwIHRoZSAuZGVidWcgc2VjdGlvbi4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQWRqdXN0IHRoZSBUT0MgYW5jaG9yIHZhbHVlCi0JaWYgaXQgaXMgbm90IGxhcmdlIGVub3VnaCB0byBhY2NvbW9kYXRlIHRoZSBlbnRpcmUgVE9DIGFyZWEgd2l0aAotCXNpZ25lZCAxNiBiaXQgb2Zmc2V0cy4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IEhhbmRsZSBuZWdhdGl2ZSBUT0Mgb2Zmc2V0cyBpbiBnbG9iYWwKLQlsaW5rYWdlIGNvZGUuCi0JKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgcmVsb2NhdGlvbnMgYWdhaW5zdCBhCi0JVE9DIGFuY2hvciB0byB1c2UgdGhlIFRPQyB2YWx1ZSB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotU2F0IE5vdiAxOCAxODowMTo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzKTogQ2FzdCBtYWxsb2MgcmV0dXJuLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBMaWtld2lzZS4KLQotU2F0IE5vdiAxOCAxOTo0MzowNCAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIHBlLWFybS5jOiBGaXggdHlwb3MuCi0JKiBjb2ZmLWFybS5jOiBMaWtld2lzZS4KLQotRnJpIE5vdiAxNyAxNjoyMjowNCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAobGlzdF9lbGUpOiBBZGRlZCAiY2F0ImVnb3J5IG1lbWJlci4KLQkocmVjb3JkX3RvYyk6IE5ldyBjYXRlZ29yeSBwYXJhbWV0ZXIgKHByaXYgb3IgcHViKS4KLQkocHBjX3JlY29yZF90b2NfZW50cnkpOiBDaGVjayB0byBzZWUgaWYgdG9jIGJvdW5kcyBleGNlZWRlZC4KLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBSZW1vdmVkIGVtYnJpb25pYyBkYXRhLWluLXRvYyBmcm9tCi0JdGhlIG1haW5saW5lLiBJdCBhZGRlcyBleHRyYSB0b2MgY2VsbHMgaW4gZXJyb3IuCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBBZGRlZCBzb21lIGRvY3VtZW50YXRpb24uCi0JKGR1bXBfdG9jKTogQ2FuIG5vdyBkaWFnbm9zZSAidmlydHVhbCB0b2MiIGNoaWNhbmVyeS4KLQotRnJpIE5vdiAxNyAxMDo0MToyNSAxOTk1ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQ2hhbmdlIHR5cGUgb2YKLQlkeW5zeW1jb3VudCBhbmQgYnVja2V0Y291bnQgZmllbGRzIGZyb20gc2l6ZV90IHRvIGJmZF9zaXplX3R5cGUuCi0KLUZyaSBOb3YgMTcgMTA6MDI6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spOiBJOTYwIHZlcnNpb246IGRvbid0Ci0JcG9pbnRlcml6ZSBDX0xFQUZTVEFUIG9yIENfTEVBRkVYVCBlbnRyaWVzLgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogT25seSBjcmVhdGUKLQlEVF9JTklUIGFuZCBEVF9GSU5JIGVudHJpZXMgaWYgdGhlIF9pbml0IG9yIF9maW5pIHN5bWJvbCBpcwotCWRlZmluZWQgb3IgbWVudGlvbmVkIGluIGEgcmVndWxhciBmaWxlLgotCi1UaHUgTm92IDE2IDE1OjE2OjQyIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX2RhdGFfaW5fdG9jX2VudHJ5KTogbmV3IGZ1bmN0aW9uCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgVE9DREVGTiBhdHRyaWJ1dGUKLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgUkVMMjQgaGFuZGxpbmcKLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBDb3JyZWN0IFRPQ0RFRk4gaGFuZGxpbmcKLQotCSogcGVpY29kZS5oIChkaXJfbmFtZXMpOiBBZGRlZCBuYW1lIGRlc2NyaXB0aW9ucwotCi1UaHUgTm92IDE2IDAzOjM4OjAzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBVcGRhdGVkIHRvIGN5Z251cy0yLjYuCi0KLVdlZCBOb3YgMTUgMTk6MzA6MDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAobTY4azRrbmV0YnNkX3ZlYyk6IERlY2xhcmUuCi0KLVdlZCBOb3YgMTUgMTg6MDU6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBDaGFuZ2UgdHlwZSBvZiBzZWNvbmQgYXJndW1lbnQgdG8KLQlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgZnJvbSB2b2lkICogdG8gUFRSLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENhc3QKLQl1c2luZyBQVFIgcmF0aGVyIHRoYW4gdm9pZCAqLgotCSogYmZkLWluMiwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDaGFuZ2UgdmZpbGUgZnJvbSB2b2lkICoKLQl0byBQVFIuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lIGFzCi0JX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIHJhdGhlciB0aGFuIGNhc3RpbmcKLQliZmRfdHJ1ZS4KLQotV2VkIE5vdiAxNSAwNDowOToxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5kZXAxKTogRml4IHN0dXBpZCB0eXBvIGluIGxhc3QgY2hhbmdlLiAgUmVtb3ZlIGFueQotCSJETyBOT1QgREVMRVRFIiBsaW5lcyBvciBibGFuayBsaW5lcyB0aGF0IG1rZGVwIHdyaXRlcyBvbiBzb21lCi0Jc3lzdGVtcy4KLQkoQkZEX0xJQlNfQ0ZJTEVTLCBBTExfTUFDSElORVNfQ0ZJTEVTLCBCRkQzMl9CQUNLRU5EU19DRklMRVMsCi0JQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkoQ0ZJTEVTKTogVXNlIHRoZW0uCi0KLVR1ZSBOb3YgMTQgMTE6NTI6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEZvciBQUEMgUEUsIHN0YXJ0IGlzaXplIGF0IDAsCi0Jbm90IGF0IHRoZSBmaWxlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBzZWN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBdm9pZCB1c2luZwotCXVucG9ydGFibGUgI2VsaWYuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV2hlbiBnZW5lcmF0aW5nIGEgUFBDIFBFIGV4ZWN1dGFibGUKLQl3aXRoIG5vIHN5bWJvbHMsIHJvdW5kIHVwIHRoZSBmaWxlIHNpemUgdG8gYSBDT0ZGX1BBR0VfU0laRQotCWJvdW5kYXJ5LgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywKLQlkb24ndCB3cml0ZSBvdXQgYSBzdHJpbmcgdGFibGUuCi0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBXaGVuIHVzaW5nIGEgZGlmZmVyZW50IHNlY3Rpb24KLQloZWFkZXIsIHBhc3MgdGhlIG5ldyBvbmUgdG8gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkci4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBEb24ndCBzZXQgc2hfaW5mbyBhbmQgc2hfZW50c2l6ZSBmaWVsZHMuCi0JKGVsZl9tYXBfc3ltYm9scyk6IEFkZCBzZWN0aW9uIFZNQSB0byBzeW1ib2wgdmFsdWUgd2hlbiBjb21wYXJpbmcKLQlhZ2FpbnN0IDAuCi0JKF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE9ubHkgYnVpbGQgc3ltYm9sIHRhYmxlCi0JaWYgdGhlcmUgYXJlIHNvbWUgc3ltYm9scy4gIFNldCBmaWxlIG9mZnNldCBvZiBzeW10YWIgYW5kIHN0cnRhYgotCXNlY3Rpb25zLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFJlbW92ZSBkb3N5bXMgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4gIE5ldmVyIHNldCBmaWxlIG9mZnNldCBvZiBzeW10YWIgYW5kIHN0cnRhYgotCXNlY3Rpb25zLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShNQVBfT05FU1lNVEFCLCBNQVBfRFlOU1lNVEFCLCBNQVBfU1RSVEFCLCBNQVBfU0hTVFJUQUIpOiBEZWZpbmUuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoc3dhcF9vdXRfc3ltcyk6IENoZWNrIGZvciBzcGVjaWFsIG1hcHBpbmcgb2Ygc3Rfc2huZHggY3JlYXRlZCBieQotCWNvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YS4KLQkqIGVsZnh4LXRhcmdldC5oOiBVc2UgbmV3IGNvcHkgcm91dGluZXMuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBEZWNsYXJlLgotCi0JKiBjb25maWcuYmZkIChzaC0qLSopOiBTZXQgdGFyZ19kZWZ2ZWMgdG8gc2hjb2ZmX3ZlYy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBDT0ZGX1dJVEhfUEUsIGhhbmRsZQotCUNfTlRfV0VBSy4KLQotCSogY29mZi1zaC5jIChzaGxjb2ZmX3ZlYyk6IFVzZSBfYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBub3QKLQlfYmZkX2R1bW15X3RhcmdldCwgbWF0Y2hpbmcgdGhlIHJlY2VudCBjaGFuZ2UgdG8gYXJjaGl2ZQotCXJlY29nbml0aW9uLgotCi1Nb24gTm92IDEzIDEzOjI0OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBVc2UgY2FzdHMgdG8gYXZvaWQgZG9pbmcKLQlhcml0aG1ldGljIG9uIFBUUiB0eXBlcy4KLQotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogU2V0IHRoZSBsbWEgb2YgdGhlIHNlY3Rpb25zLgotCi0JKiBlY29mZi5jIChlY29mZl9yZWxvY19saW5rX29yZGVyKTogVHVybiBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkCi0Jc3ltYm9sIGludG8gYSByZWxvYyBhZ2FpbnN0IHRoZSBzZWN0aW9uLgotCi1Nb24gTm92IDEzIDA3OjMxOjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpOiBhZGRlZCBzdXBwb3J0IGZvciBpbmxpbmUKLQlnbHVlIGZvciB0aGUgcmVsb2NzOiBJTUdMVUUgYW5kIElGR0xVRS4KLQkocmVjb3JkX3RvYyk6IG5ldyBmdW5jdGlvbiAtIHRyYWNrcyB0b2MgY29udGVudHMKLQkocHBjX21hcmtfc3ltYm9sX2FzX2dsdWUpOiBuZXcgZnVuY3Rpb24gLSBzdXBwb3J0cyB0aGUgSU1HTFVFIHJlbG9jCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGRlZCBzdXBwb3J0IGFuZCBmaXhlcyBmb3IgSU1HTFVFL0lGR0xVRQotCShwcGNfY29mZl9ydHlwZTJob3d0byk6IHJlbW92ZWQgaW52YWxpZCBJTUdMVUUgaGFjawotCShjb2ZmX3BwY19ydHlwZV90b19ob3d0byk6IHJlbW92ZWQgaW52YWxpZCBJTUdMVUUgaGFjawotCShwcGNfcmVjb3JkX3RvY19lbnRyeSk6IFJlbW92ZWQgYSBkZWJ1ZyBkZWZpbmUgKGR1aCkKLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEZpeGVkIGludmFsaWQgc3RyY21wIGZvciAiLnJlbGRhdGEiCi0JKHBlX3ByaW50X2lkYXRhKTogTmV3IGZ1bmN0aW9uIC0gZm9ybWF0cyB0aGUgaWRhdGEgc2VjdGlvbiBkYXRhCi0JKHBlX3ByaW50X3BkYXRhKTogTmV3IGZ1bmN0aW9uIC0gZm9ybWF0cyB0aGUgcGRhdGEgc2VjdGlvbiBkYXRhCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBjYWxscyB0byBhYm92ZQotCi1TdW4gTm92IDEyIDEyOjIzOjI0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJmZF9saWJzX2hlcmUsIGV0Yyk6IFByb3ZpZGUgZW1wdHkgZGVmaW5pdGlvbnMuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX3ZlYyk6IEFkZCBjb25kaXRpb25hbCBkZWZpbmVzCi0JVEFSR0VUX1NZTSBhbmQgVEFSR0VUX05BTUUgZm9yIHZlY3RvciBhbmQgQkZEIG5hbWUuCi0JKiBjb2ZmLXBtYWMuYyAocG1hY194Y29mZl92ZWMpOiBSZW1vdmUuCi0JKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIFtQT1dFUk1BQ106IFNldCB0aGUKLQltYWNoaW5lIHRvIDAsIG5vdCBhbGwgUG93ZXJNYWNzIGFyZSA2MDFzLgotCi1GcmkgTm92IDEwIDEyOjEwOjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSZWFkIGluIGFueSBwcm9ncmFtIGhlYWRlcnMuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IEFkanVzdCBzZWN0aW9uIGxtYQotCWJhc2VkIG9uIHRoZSBwcm9ncmFtIGhlYWRlcnMsIGlmIGFueS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2hfYWRkciBmcm9tIHRoZSB2bWEsIG5vdCB0aGUgbG1hLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IFNldCBwX3BhZGRyIG9mIHByb2dyYW0gaGVhZGVycyBiYXNlZCBvbgotCXRoZSBsbWEuCi0KLVRodSBOb3YgIDkgMTM6MDE6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IFByZXNlcnZlIHRkYXRhIGluIGNhc2Ugb2YKLQlmYWlsdXJlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBSZXBvcnQgYSByZWFzb25hYmxlIGVycm9yIHdoZW4KLQl0cnlpbmcgdG8gZG8gYSByZWxvY2F0ZWFibGUgbGluayB3aXRoIGEgbm9uLWEub3V0IG9iamVjdCBmaWxlLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IENoZWNrIHRoZSBmaXJzdCBvYmplY3QgZmlsZQotCWluIGFuIGFyY2hpdmUgZXZlbiBpZiB0YXJnZXRfZGVmYXVsdGVkIGlzIHNldC4gIElmIHRoZSBvYmplY3QgZmlsZQotCWhhcyB0aGUgd3JvbmcgeHZlYywgcmVqZWN0IGl0LgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogSWYgYSBzZWN0aW9uIGNhbiBub3QKLQliZSByZXByZXNlbnRlZCwgcmVwb3J0IHRoZSBuYW1lIHZpYSBfYmZkX2Vycm9yX2hhbmRsZXIuCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogV3JpdGUgUlM2MDAwQ09GRl9DIHZlcnNpb24KLQl3aGljaCBjaGVja3MgZm9yIFNUWVBfT1ZSRkxPIHNlY3Rpb25zLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIFJTNjAwMENPRkZfQywgaGFuZGxlCi0JcmVsb2MgYW5kIGxpbmVubyBjb3VudCBvdmVyZmxvd3MuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIGJlZm9yZQotCWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUKLQlyZWxvYyBhbmQgbGluZW5vIGNvdW50IG92ZXJmbG93cy4KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogQ291bnQgbGluZSBudW1iZXJzIGFuZAotCXJlbG9jcyBiZWZvcmUgZGVhbGluZyB3aXRoIC5wYWQgc2VjdGlvbnMuICBDb3VudCBvdmVyZmxvdyBzZWN0aW9uCi0JaGVhZGVycyB3aGVuIGhhbmRsaW5nIC5wYWQgc2VjdGlvbnMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGEub3V0IHZzdGFtcCB0byAxCi0JaWYgUlM2MDAwQ09GRl9DLgotCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfREVTQ1JJUFRPUik6IERlZmluZS4KLQkoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBkZXNjcmlwdG9yX3NlY3Rpb24gYW5kCi0Jc3BlY2lhbF9zZWN0aW9ucyBmaWVsZHMuCi0JKF9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBTZXQgbGlua2FnZSBzZWN0aW9uIGFsaWdubWVudC4gIENyZWF0ZQotCWRlc2NyaXB0b3Igc2VjdGlvbi4gIENoZWNrIGZvciBtYWdpYyBzeW1ib2wgbmFtZXMgKF90ZXh0LCBldGMuKSwKLQlhbmQgcmVjb3JkIHRoZW0gaW4gc3BlY2lhbF9zZWN0aW9ucyBpZiBmb3VuZC4gIFNldAotCVhDT0ZGX0RFU0NSSVBUT1IgZmxhZyBmb3IgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBhbmQgc2V0IGl0cwotCWRlc2NyaXB0b3IgZmllbGQgdG8gcG9pbnQgYmFjayB0byB0aGUgZnVuY3Rpb24gY29kZSBzeW1ib2wuCi0JKHhjb2ZmX3N3ZWVwKTogQWx3YXlzIG1hcmsgdGhlIHNwZWNpYWwgZGVzY3JpcHRvcl9zZWN0aW9uLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IENoZWNrIHdoZXRoZXIgdGhlIHN5bWJvbCBtaWdodCBiZSBhCi0JZnVuY3Rpb24gZGVzY3JpcHRvciwgYW5kIG1hcmsgaXQgaWYgaXQgaXMuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgbmV3IHNwZWNpYWxfc2VjdGlvbnMKLQlwYXJhbWV0ZXIsIGFuZCBmaWxsIGl0IGluLiAgQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXNjcmlwdG9yCi0Jc2VjdGlvbi4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogU2V0IFhDT0ZGX0RFRl9SRUdVTEFSIGZsYWcgd2hlbiBkZWZpbmluZwotCWdsb2JhbCBsaW5rYWdlIGNvZGUuICBJZiBhbiB1bmRlZmluZWQgZnVuY3Rpb24gZGVzY3JpcHRvciBpcwotCWV4cG9ydGVkLCBhcnJhbmdlIHRvIGRlZmluZSBpdC4gIFdhcm4gYWJvdXQgYW55IG90aGVyIHVuZGVmaW5lZAotCWV4cG9ydGVkIHN5bWJvbC4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IFdyaXRlIG91dCB0aGUgZGVzY3JpcHRvciBzZWN0aW9uLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogQ3JlYXRlIGEgZnVuY3Rpb24gZGVzY3JpcHRvciB3aGVuCi0JbmVjZXNzYXJ5LgotCSogYmZkLWluLmggKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVRodSBOb3YgIDkgMDg6NDA6MjMgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IG5ldyB0eXBlcyBmb3IgaGFzaGluZwotCShwcGNfY29mZl9saW5rX2hhc2hfdGFibGUpOiBuZXcgdHlwZXMgZm9yIGhhc2hpbmcKLQkocHBjX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBoYXNoIGVudHJ5IGNvbnN0cnVjdG9yCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogaGFzaCB0YWJsZSBpbml0aWFsaXplcgotCShwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogaGFzaCB0YWJsZSBjb25zdHJ1Y3RvcgotCShwcGNfcmVjb3JkX3RvY19lbnRyeSk6IGNoYW5nZWQgcmVmZXJlbmNlcyB0byBoYXNoIHRhYmxlCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBjaGFuZ2VkIHJlZmVyZW5jZXMgdG8gaGFzaCB0YWJsZQotCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogcmVtb3ZlZCB0b2Nfb2Zmc2V0Ci0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQKLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogcmVtb3ZlZCB0b2Nfb2Zmc2V0IGluaXQKLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogcmVtb3ZlZCB0b2Nfb2Zmc2V0IGluaXQKLQotVGh1IE5vdiAgOSAwNDowMDozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5kZXAxKTogTWFrZSBzdXJlIHRoZSBmaWxlIG1rZGVwIGlzIHRvIHdyaXRlIGV4aXN0cwotCWZpcnN0LgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIG5ldyBvcHRpb24gLS13aXRoW291dF0tbW1hcC4gIFNldCBVU0VfTU1BUAotCWlmIGl0IGlzIGdpdmVuIGFuZCBtbWVwIGlzIGF2YWlsYWJsZS4KLQkqIGFjY29uZmlnLmg6IFVuZGVmIFVTRV9NTUFQLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCSogYW91dHguaDogSWYgVVNFX01NQVAgaXMgbm90IGRlZmluZWQsIGRvIGFsbCBzeW1ib2wgYW5kIHN0cmluZwotCXRhYmxlIGhhbmRsaW5nIHRoZSBvbGQgd2F5LgotCShhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogRG9uJ3QgY29tcGxhaW4gaWYgbGFzdCBieXRlIG9mIHN0cmluZwotCXRhYmxlIGlzIG5vbnplcm8uCi0JKiBsaWJiZmQuYyBbSEFWRV9NQURWSVNFXTogSW5jbHVkZSBzeXMvdHlwZXMuaCBhbmQgc3lzL21tYW4uaC4KLQkoYmZkX2ZyZWVfd2luZG93KSBbISBVU0VfTU1BUF06IERvbid0IGRlZmluZS4KLQkoYmZkX2dldF9maWxlX3dpbmRvdywKLQlfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KSBbISBVU0VfTU1BUF06IEFib3J0LgotCi1XZWQgTm92ICA4IDIwOjAzOjQ0IDE5OTUgIEVyaWMgRnJldWRlbnRoYWwgPGZyZXVkZW50aGFsQG55dS5lZHU+Ci0KLQkqIGNvZmYtYTI5ay5jIChTSUdOX0VYVEVORF9IV09SRCk6IFVzZSB+MHhmZmZmIHJhdGhlciB0aGFuCi0JMHhmZmZmMDAwMC4KLQotV2VkIE5vdiAgOCAxMTozMToxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogQ2hhbmdlIGhhbmRsaW5nIG9mIFJfSVJFTCByZWxvYyB0byBiZQotCWNvbXBhdGlibGUgd2l0aCBBTUQgZ2VuZXJhdGVkIENPRkYgZmlsZXMuICBUcnkgdG8gc3VwcG9ydCBib3RoIEFNRAotCWFuZCBHTlUgZm9ybWF0cyBzaW11bHRhbmVvdXNseS4KLQkoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBDaGFuZ2Ugd3JpdGFibGUgcGFyYW1ldGVyIGZyb20KLQlpbnQgdG8gYm9vbGVhbjsgdXBkYXRlIGFsbCBjYWxsZXJzLiAgUGFzcyBNQVBfU0hBUkVEIGlmIG5vdAotCXdyaXRhYmxlLS1pdCdzIHJlcXVpcmVkIG9uIFNvbGFyaXMuICBDYXN0IGZwcmludGYgYXJndW1lbnQgdG8KLQlhdm9pZCB3YXJuaW5nLgotCSogYmZkLWluLmggKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oOiBVcGRhdGUgY2FsbHMgdG8gYmZkX2dldF9maWxlX3dpbmRvdy4KLQotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX0RFRl9EWU5BTUlDKTogUmVuYW1lIGZyb20gWENPRkZfUkVGX0RZTkFNSUMuCi0JQ2hhbmdlIGFsbCB1c2VzLgotCSh4Y29mZl9zd2FwX2xkaGRyX2luKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfc3dhcF9sZHN5bV9pbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX2ZpbmRfcmVsb2MpOiBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzaW5nbGUgcmVsb2MgY29ycmVjdGx5LgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogSWYgd2UganVzdCBjcmVhdGVkIGEgZGVzY3JpcHRvciwgcGFzcyBpdAotCXRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLCB0byBzYXZlIGEgaGFzaCBsb29rdXAuCi0JSGFuZGxlIFhUWV9FUi9YTUNfWE8gc3ltYm9scyBjb3JyZWN0bHkuCi0JKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFJld3JpdGUgdG8gcmVhZCAubG9hZGVyIHN5bWJvbHMKLQlyYXRoZXIgdGhhbiBub3JtYWwgc3ltYm9sIHRhYmxlLgotCShiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IEl0J3Mgbm90IGFuIGVycm9yIGlmIHRoZSBzeW1ib2wgaXMKLQlhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGUgc2FtZSBhYnNvbHV0ZSB2YWx1ZS4KLQkoeGNvZmZfbWFyayk6IFdoZW4gY29uc2lkZXJpbmcgY2FsbGVkIHN5bWJvbHMsIGNoZWNrIHdoZXRoZXIgdGhlCi0JZGVzY3JpcHRvciBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QsIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wKLQlpdHNlbGYuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IExpa2V3aXNlLgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldF9maWxlX3dpbmRvdyk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCUNhc3QgcmVhbGxvYyBhbmQgbWFsbG9jIHJldHVybiB2YWx1ZXMuICBJZiBtYWxsb2Mgb3IgcmVhbGxvYyBmYWlsLAotCXNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5LgotCSogYmZkLWluLmggKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBDaGFuZ2UgdHlwZSB0byBib29sZWFuLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UdWUgTm92ICA3IDExOjUzOjQ4IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IG5ldyBmdW5jdGlvbi4KLQkoaW5fcmVsb2NfcCk6IGNoYW5nZWQgcmV0dXJuIHZhbHVlLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogbXVjaCByZXdvcmsuCi0JKHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbik6IG5ldyBmdW5jdGlvbi4KLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBuZXcgZnVuY3Rpb24uCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBuZXcgZnVuY3Rpb24uCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IGluaXRpYWxpemUgdG9jX29mZnNldC4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogaW5pdGlhbGl6ZSB0b2Nfb2Zmc2V0LgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBBZGRlZCBjb2ZmX3N3YXBfc3ltX2luX2hvb2sKLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogQWRkZWQgbW9yZSBzZWN0aW9ucyB0byB0aGUgZGF0YQotCWRpY3Rpb25hcnkgZm9yIHRoZSBwZSBmaWxlIGhlYWRlci4gQWxzbyBjaGFuZ2VkIGxpbmtlciB2ZXJzaW9uCi0JbnVtYmVyIG9uIHRoZSBwcGMgc2lkZS4KLQkoZGlyX25hbWVzKTogc21hbGwgaW1wcm92ZW1lbnRzIHRvIHRoZSBkaWN0aW9uYXJ5IHByaW50aW5nLgotCShwZV9ta29iamVjdF9ob29rKTogc2F2ZSB0aGUgZmlsZSBsZXZlbCBmbGFncy4KLQotCSogbGliY29mZi1pbi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IGFkZGVkIHRvY19vZmZzZXQgZmllbGQKLQkocGVfdGRhdGEpOiBhZGRlZCByZWFsX2ZsYWdzIGZpZWxkCi0JKGNvZmZfdGRhdGEpOiBhZGRlZCBsb2NhbF90b2Nfc3ltX21hcCBhbmQgYWNjZXNzIG1hY3JvCi0KLQkqIGxpYmNvZmYuaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiBhZGRlZCB0b2Nfb2Zmc2V0IGZpZWxkCi0JKHBlX3RkYXRhKTogYWRkZWQgcmVhbF9mbGFncyBmaWVsZAotCShjb2ZmX3RkYXRhKTogYWRkZWQgbG9jYWxfdG9jX3N5bV9tYXAgYW5kIGFjY2VzcyBtYWNybwotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IGFkZGVkIGhvb2sgZm9yIFBFLgotCShjb2ZmX21rb2JqZWN0KTogaW5pdCBmb3IgbG9jYWxfdG9jX3N5bV9tYXAKLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgdGhlIGludGVybmFsX2EubWFnaWMgdG8KLSAgICAgICAgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDIHdoaWNoIGFwcGVhcnMgdG8gYmUgd2hhdCBvdGhlcgotCXBwYyBjb21waWxlcnMgdXNlLgotCi1UdWUgTm92ICA3IDEzOjQ4OjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmZsaW5rLmMgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBLZWVwIGxvb2tpbmcgdGhyb3VnaCBzdGFicwotCWVudHJpZXMgdW50aWwgYm90aCB0aGUgbGluZSBudW1iZXIgYWRkcmVzcyBhbmQgdGhlIGZ1bmN0aW9uIG5hbWUKLQlhZGRyZXNzIGFyZSB0b28gbGFyZ2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DSEVDS19QUk9HIHRvIGZpbmQgYW5kIGNhY2hlIEFSLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi0JKiBhY2xvY2FsLm00IChCRkRfQ0NfRk9SX0JVSUxEKTogRG9uJ3QgZGVmaW5lIENDX0ZPUl9CVUlMRCBpZiBpdAotCWlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LgotCi1UdWUgTm92ICA3IDEwOjU3OjI0IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOiBEZWZpbmUgdG8gdXNlCi0JZ2VuZXJpYyB2ZXJzaW9uLgotCi1Nb24gTm92ICA2IDE3OjEzOjE1IDE5OTUgIEhhcnJ5IERvbGFuICA8ZG9sYW5Ac3NkLmludGVsLmNvbT4KLQotCSogY29mZi1pODYwLmM6IE5ldyBmaWxlLCBiYXNlZCBvbiBjb2ZmLWkzODYuYy4KLQkqIGNwdS1pODYwLmM6IE5ldyBmaWxlLCBiYXNlZCBvbiBjcHUtaTM4Ni5jLgotCSogaG9zdHMvaTg2MG1hY2gzLmg6IE5ldyBmaWxlLCBiYXNlZCBvbiBob3N0cy9pMzg2bWFjaDMuaC4KLQkqIGNvbmZpZy5iZmQgKGk4NjAtKi1tYWNoMyosIGk4NjAtKi1vc2YxKiwgaTg2MC0qLWNvZmYqKTogTmV3Ci0JdGFyZ2V0cywgdXNpbmcgaTg2MGNvZmZfdmVjLgotCSogY29uZmlndXJlLmluIChpODYwLSotbWFjaDMqLCBpODYwLSotb3NmMSopOiBOZXcgaG9zdHMsIHVzaW5nCi0JdHJhZC1jb3JlLm8gYW5kIGhvc3RzL2k4NjBtYWNoMy5oLgotCShpODYwY29mZl92ZWMpOiBVc2UgY29mZi1pODYwLm8gYW5kIGNvZmZsaW5rLm8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtaTg2MC5vLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWk4NjAuby4KLQkoQ0ZJTEVTKTogQWRkIGNwdS1pODYwLmMgYW5kIGNvZmYtaTg2MC5jLgotCSogdGFyZ2V0cy5jIChpODYwY29mZl92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCAmaTg2MGNvZmZfdmVjLgotCSogYXJjaHVyZXMuYyAoYmZkX2k4NjBfYXJjaCk6IERlY2xhcmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkICZiZmRfaTg2MF9hcmNoLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBIYW5kbGUgSTg2MCBtYWdpYyBudW1iZXIuCi0JKGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlIGJmZF9hcmNoX2k4NjAuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIEk4NjAgYS5vdXQgbWFnaWMgbnVtYmVyLgotCi1Nb24gTm92ICA2IDE0OjM0OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBTZXQgdGhlIGFsaWdubWVudCBwb3dlciBvZgotCXRoZSBjcmVhdGVkIC50YyBzZWN0aW9uIHRvIDIuCi0JKHhjb2ZmX21hcmspOiBEb24ndCBrZWVwIGEgLmxvYWRlciByZWxvYyBmb3IgYSBjYWxsIHRvIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgZ2VuZXJhdGUKLQlnbG9iYWwgbGlua2FnZSBjb2RlIGZvciBhIGNhbGwgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQotU3VuIE5vdiAgNSAyMTo0NDoxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IFJlYnVpbGQgbGlzdCBmcm9tIEJGRF9MSUJTLCBBTExfTUFDSElORVMsCi0JQkZEMzJfQkFDS0VORFMsIEJGRDY0X0JBQ0tFTkRTLgotCSguZGVwMSk6IFB1dCBta2RlcCBvdXRwdXQgaW4gYSBzZXBhcmF0ZSBmaWxlLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwKTogQ2FzdCBfYmZkX3JlYWRfYXJfaGRyIHJldHVybgotCXZhbHVlLgotCi0JUGVybWl0IHVzZSBvZiBtbWFwIHdoZW4gYXZhaWxhYmxlOgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBtbWFwLCBtYWR2aXNlLCBtcHJvdGVjdC4KLQkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCSogbGliYmZkLmMgKHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCk6IERlZmluZSB0eXBlLgotCShiZmRfaW5pdF93aW5kb3csIGJmZF9mcmVlX3dpbmRvdywgYmZkX2dldF9maWxlX3dpbmRvdyk6IE5ldwotCWZ1bmN0aW9ucy4KLQkob2tfdG9fbWFwKTogTmV3IHN0YXRpYyB2YXJpYWJsZSBmb3IgZGVidWdnaW5nLgotCShfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF93aW5kb3dfaW50ZXJuYWwpOiBEZWNsYXJlIHR5cGUuCi0JKGJmZF93aW5kb3cpOiBEZWZpbmUgdHlwZS4KLQkoYmZkX2luaXRfd2luZG93LCBiZmRfZnJlZV93aW5kb3csIGJmZF9nZXRfZmlsZV93aW5kb3cpOiBEZWNsYXJlLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOgotCURlY2xhcmUuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIHR3byB3aW5kb3cgZmllbGRzLgotCShvYmpfYW91dF9zeW1fd2luZG93LCBvYmpfYW91dF9zdHJpbmdfd2luZG93KTogTmV3IG1hY3Jvcy4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IEluaXRpYWxpemUgd2luZG93cy4KLQkoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IEdldCBzeW1ib2wgZGF0YSBhbmQgc3RyaW5ncyBpbgotCXdpbmRvd3MgaW5zdGVhZCBvZiBleHBsaWNpdGx5IGFsbG9jYXRlZCBidWZmZXJzLgotCShzbHVycF9zeW1ib2xfdGFibGUpOiBGcmVlIHdpbmRvdyBpbnN0ZWFkIG9mIG1lbW9yeS4KLQkoYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBSZWxlYXNlIHdpbmRvd3MgaW5zdGVhZCBvZiBmcmVlaW5nIHN0b3JhZ2UKLQlkaXJlY3RseS4KLQkoYW91dF9saW5rX2ZyZWVfc3ltYm9scyk6IERpdHRvLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgbmV3IGZpZWxkIGZvcgotCWdldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdy4KLQkoQkZEX0pVTVBfVEFCTEVfR0VORVJJQyk6IFVwZGF0ZWQuCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXQtdGFyZ2V0LmgsIGJpbmFyeS5jLCBib3V0LmMsIGNvZmYtYWxwaGEuYywKLQljb2ZmLW1pcHMuYywgZWxmeHgtdGFyZ2V0LmgsIGkzODZtc2Rvcy5jLCBpMzg2b3M5ay5jLCBpZWVlLmMsCi0JbGliY29mZi1pbi5oLCBvYXN5cy5jLCBzcmVjLmMsIHRla2hleC5jLCB2ZXJzYWRvcy5jOiBBZGRlZCBuZXcKLQltYWNyb3MgZm9yIGdldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBmaWVsZC4KLQotU2F0IE5vdiAgNCAxMjoyMzoyNiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29yZS5jOiBSZW5hbWVkIHRvIGNvcmVmaWxlLmMKLQkqIG1ha2VmaWxlLmRvcyAoT0JKUyk6IENoYW5nZSBjb3JlLm8gdG8gY29yZWZpbGUubwotCSogTWFrZWZpbGUuaW4gKENGSUxFUywgQkZEX0xJQlMpOiBVc2UgY29yZWZpbGUuYyBpbnN0ZWFkIG9mIGNvcmUuYwotCi1GcmkgTm92ICAzIDE1OjU0OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGUgc3ViCi0JdG8gby4gIENsb2JiZXIgYW5kIHJlc3RvcmUgdGhlIGxpc3Qgb2YgbmV3IGNzZWN0cyBhcm91bmQgdGhlIGNhbGwKLQl0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCwgaW4gY2FzZSBpdCB3YW50cyB0byByZXBvcnQgYQotCWxpbmtlciBlcnJvciBhbmQgdGhlIGxpbmtlciB3YW50cyB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICBSZXNldAotCXRoZSBsaW5lIG51bWJlciBjb3VudCBvZiBhIHJlYWwgc2VjdGlvbiBldmVuIGlmIGl0IGhhcyBubyByZWxvY3MuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBJZiBzaGFyZWQsIHNldCB0aGUgRFlOQU1JQyBmbGFnLgotCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IFdhcm4gaWYgdGhlIHN0cmluZyBzaXplCi0JaXMgdG9vIHNtYWxsLgotCi1UaHUgTm92ICAyIDIzOjE2OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB3YXJuIGFib3V0Ci0JYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiBhIHNoYXJlZCBsaW5rLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBDb3JyZWN0IHR5cGUgb2YKLQlvbGR0eXBlIGZyb20gYmZkX2xpbmtfb3JkZXJfdHlwZSB0byBiZmRfbGlua19oYXNoX3R5cGUuICBGcm9tCi0JcGhkbUBpbmZvLnVjbC5hYy5iZSAoUGhpbGlwcGUgRGUgTXV5dGVyKS4KLQotV2VkIE5vdiAgMSAxNDoyNjowMiAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29mZi1tODhrLmMgKHJ0eXBlMmhvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoUlRZUEUySE9XVE8pOiBVc2UgaXQgcmF0aGVyIHRoYW4gYSBtYWNybyBkZWZpbml0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCBpbnRlcm5hbF9hLm1hZ2ljCi0JdG8gUEFHRU1BR0lDUEVYRUNQQUdFRCAjaWYgZGVmaW5lZCAoTTY4KSAmJiAhZGVmaW5lZCAoTFlOWE9TKS4KLQotCSogY29uZmlndXJlLmluOiBtNjgqLW1vdG9yb2xhLXN5c3YqIGRvZXMgbm90IHVzZSBwdHJhY2UtY29yZS5vOwotCWRlZmluZSBUUkFEX0hFQURFUiB0byBuZXcgZmlsZSBob3N0cy9kZWx0YTY4LmguCi0JbTg4Ki1tb3Rvcm9sYS1zeXN2KiwgaG93ZXZlciwgZG9lcyB1c2UgcHRyYWNlLWNvcmUuby4KLQkqIGhvc3RzL2RlbHRhNjguaDogTmV3IGZpbGUuCi0KLQkqIHB0cmFjZS1jb3JlLmMgKHB0cmFjZV91bml4X2NvcmVfZmlsZV9wKTogY2hhbmdlIGJmZF96bWFsbG9jIHRvCi0JYmZkX3phbGxvYzsgcHJvdmlkZSBwcm9wZXIgcGFybSBhYmZkIHRvIGNhbGxzIHRvIGJmZF96YWxsb2MuCi0KLVdlZCBOb3YgIDEgMTM6NTE6NTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODZsaW51eC5jIChNWSh2ZWMpKTogRGVjbGFyZSBiZWZvcmUgdXNlLgotCi1XZWQgTm92ICAxIDExOjQ1OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JUGFzcyBpbnB1dF9iZmQsIG5vdCBpbl9iZmQsIHRvIGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZQotCUJGRCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGUuCi0JKGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0KTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAoYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX1hWRUNQKTogRGVmaW5lLgotCShiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0KTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIEJGRCBpcyBub3QKLQlvZiB0aGUgcmlnaHQgdHlwZS4KLQkoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBPbmx5IGNoZWNrIHRoZSByZWxvYyBzeW1ib2wKLQl0YWJsZSBpbmRleCBhZ2FpbnN0IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3IgYSBiYXNlIHJlbGF0aXZlCi0JcmVsb2MuCi0KLQkqIGNvZmYtcnM2MDAwLmMgKF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBDaGFuZ2UgZnJvbSBtYWNybyB0bwotCXN0YXRpYyBmdW5jdGlvbi4KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogU2V0Ci0JZnVsbF9hb3V0aGRyIGZsYWcgaGVyZS4uLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogLi4ubm90IGhlcmUuCi0KLVR1ZSBPY3QgMzEgMTI6NTI6MDIgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oOiAgUmVuYW1lIHRvIGVsZi1iZmQuaCB0byBhdm9pZCBjb25mbGljdCB3aXRoCi0Jc3lzdGVtcyB0aGF0IGhhdmUgYSBzeXN0ZW0gPGxpYmVsZi5oPi4KLQkqIE1ha2VmaWxlLmluOiBHbG9iYWxseSByZXBsYWNlIGxpYmVsZi5oIHdpdGggZWxmLWJmZC5oLgotCSogYmZkLmMsIGVsZi5jLCBlbGYzMi1hcmMuYywgZWxmMzItZ2VuLmMsIGVsZjMyLWhwcGEuYywKLQllbGYzMi1ocHBhLmgsIGVsZjMyLWkzODYuYywgZWxmMzItaTg2MC5jLCBlbGYzMi1tNjhrLmMsCi0JZWxmMzItbTg4ay5jLCBlbGYzMi1taXBzLmMsIGVsZjMyLXBwYy5jLCBlbGYzMi1zcGFyYy5jLAotCWVsZjY0LWdlbi5jLCBlbGY2NC1zcGFyYy5jLCBlbGZjb2RlLmgsIGVsZmxpbmsuYywKLQllbGZ4eC10YXJnZXQuaDogSW5jbHVkZSBlbGYtYmZkLmggcmF0aGVyIHRoYW4gbGliZWxmLmguCi0JKiBlbGZ4eC10YXJnZXQuaDogQ2hhbmdlIGxpYmVsZi5oIHJlZmVyZW5jZSB0byBlbGYtYmZkLmguCi0KLVR1ZSBPY3QgMzEgMTU6MzA6MDcgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQWRkIG5ldyBwYXJhbWV0ZXIgd2Vhay4gIElmCi0Jc2V0LCBzZXQgQlNGX1dFQUsgaW4gc3ltYm9sLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl9nZXRfZXh0cik6IFNldCB3ZWFrZXh0IGJhc2VkIG9uIEJTRl9XRUFLLgotCShlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBJZiB3ZWFrZXh0IGlzIHNldCwgcGFzcyBCU0ZfV0VBSyB0bwotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyKTogQ2hlY2sgdGhhdCB0aGUgc2VjdGlvbiB0ZGF0YSByZWxvY3MKLQlhcmUgbm90IE5VTEwgYmVmb3JlIHVzaW5nIHRoZW0uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotbGludXgqKTogU2V0IENPUkVGSUxFIHRvIHRyYWQtY29yZS5vIGFuZAotCWRlZmluZSBUUkFEX0hFQURFUiBhcyBob3N0cy9hbHBoYWxpbnV4LmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBob3N0cy9hbHBoYWxpbnV4Lmg6IE5ldyBmaWxlLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENhc3QgdS51X2FyMCB0byBiZmRfdm1hLAotCW5vdCBpbnQuCi0KLVR1ZSBPY3QgMzEgMTI6MzQ6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFjY2VwdCBDX0JDT01NIGFuZAotCUNfRUNPTU0gc3RvcmFnZSBjbGFzc2VzLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFya19zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2YgeGNvZmZfbWFyay4KLQkoeGNvZmZfbWFyayk6IENhbGwgeGNvZmZfbWFya19zeW1ib2wuCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogQ2FsbCB4Y29mZl9tYXJrX3N5bWJvbC4KLQkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBDYWxsIHhjb2ZmX21hcmtfc3ltYm9sIHJhdGhlciB0aGFuCi0JZG9pbmcgaXQgYnkgaGFuZC4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogQnVpbGQgYSAubG9hZGVyIHN5bWJvbCBmb3IgYW4gZXhwb3J0IHN5bWJvbC4KLQotTW9uIE9jdCAzMCAxNDo1Mzo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvKTogQWRkIG5ldyBsaW5lX2ZpbGVwb3MKLQlmaWVsZC4KLQkoeGNvZmZfZmluZF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBVc2UgaXQuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgZmluZm8ubGluZV9maWxlcG9zLgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBDX0JJTkNMIGFuZCBDX0VJTkNMLiAgRG9uJ3QKLQlyZWxvY2F0ZSB0aGUgdmFsdWUgb2YgQ19ERUNMLgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZW1vdmUgYm9ndXMgQkZEX0FTU0VSVC4KLQotU2F0IE9jdCAyOCAwMToyNTozNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZQotCWNhbGxiYWNrIGRlY2lkZSB3aGF0IGdvZXMgaW4gLnJlbG9jcy4KLQkqIHBlW2ldLWkzODYuYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBEZWZpbmUuCi0JKiBwZWljb2RlLmggKHBlX21rb2JqZWN0X2hvb2spOiBPbmx5IGNvcHkgYW91dGhkciBpZgotCXRoZXJlIGlzIG9uZS4KLQotU2F0IE9jdCAyOCAwMTo1MTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogSGFuZGxlIGNzZWN0cyBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLgotCi1GcmkgT2N0IDI3IDE4OjE0OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmM6IE1vcmUgaW1wcm92ZW1lbnRzLCBtb3N0bHkgdG8gZml4IGhhbmRsaW5nIG9mCi0JY29uc3RydWN0b3JzIGFuZCBhIGZldyBvdGhlciBzcGVjaWFsIGNhc2VzLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBTZXQgc3ltYm9sX2xlYWRpbmdfY2hhciBiYWNrIHRvCi0JemVybywgcmV2ZXJ0aW5nIHllc3RlcmRheSdzIGNoYW5nZS4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0KTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBPY3QgMjcgMTQ6NDI6MTUgMTk5NSAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogUE9SVElORywgYW91dC1hcm0uYywgYW91dC1lbmNhcC5jLCBhb3V0LXRhcmdldC5oLAotCWFvdXR4LmgsIGdlbi1hb3V0LmMsIGhvc3QtYW91dC5jLCBocDMwMGJzZC5jLCBpMzg2YW91dC5jCi0JaTM4NmJzZC5jLCBpMzg2ZHluaXguYywgaTM4NmxpbnV4LmMsIGkzODZseW54LmMsIGkzODZtYWNoMy5jLAotCWkzODZuZXRic2QuYywgbTY4a2x5bnguYywgbTg4a21hY2gzLmMsIG1pcHNic2QuYywgbmV3c29zMy5jLAotCW5zMzJrbmV0YnNkLmMsIHBjNTMyLW1hY2guYywgcmlzY2l4LmMsIHNwYXJjbHlueC5jLCBzcGFyY25ldGJzZC5jOgotCUNoYW5nZSBQQUdFX1NJWkUgdG8gVEFSR0VUX1BBR0VfU0laRS4KLQotCSogbTY4a25ldGJzZC5jOiBEaXR0byBhcyB3ZWxsIGFzIGFkZCBzdXBwb3J0IGZvciB0aGUgbTY4azRrIG9iamVjdAotCWZvcm1hdC4KLQotCSogbmV0YnNkLmg6IERvdWJsZSBkaXR0byAoaW5jbC4gbTY4azRrIHN1cHBvcnQpLiAgTmV0QlNEJ3MgdGV4dAotCXNlZ21lbnRzIGluY2x1ZGVzIHRoZSBhLm91dCBoZWFkZXIuICBTZWUgdG8gdGhhdCB0aGUgbWFnaWMgbnVtYmVyCi0JKmFsd2F5cyogaXMgYmlnLWVuZGlhbi4KLQotCSogY29uZmlnLmJmZDogQWRkIG02OCotaHAqLW5ldGJzZCogY2FzZS4gIENyb3NzLXBvbGxpbmF0ZSBtNjhrIGFuZAotCW02OGs0ayBOZXRCU0QgY29uZmlndXJhdGlvbnMuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBTZXBhcmF0ZSBpMzg2ICYgbWlwcyBOZXRCU0QKLQljb25maWd1cmF0aW9ucyBmcm9tIG90aGVyIEJTRCBvbmVzLiAgRG9uJ3QgYXNzdW1lIERFQyBpcyB0aGUgb25seQotCXRoaW5nIE5ldEJTRC9taXBzIHJ1biBvbi4gIEFkZCB7bTY4ayxuczMyayxzcGFyY30tKi1uZXRic2QqCi0JY29uZmlndXJhdGlvbnMuICBBZGQgc3VwcG9ydCBmb3IgbTY4azRrIE5ldEJTRCBvYmplY3QgZm9ybWF0LgotCi0JKiBsaWJhb3V0Lmg6IEFkZGVkIE1fNjhLNEtfTkVUQlNEIG1hZ2ljLgotCi0JKiBtNjhrNGtuZXRic2QuYzogTmV3IGZpbGUuCi0KLQkqIGhvc3RzL3ttNjhrLHNwYXJjfW5ic2QuaDogRG9uJ3QgZGVmaW5lIEhPU1RfQklHX0VORElBTl9QLgotCi0JKiBob3N0cy9uYnNkLmg6IERlZmluZSBIT1NUX0JJR19FTkRJQU5fUCBhY2NvcmRpbmcgdG8KLQk8bWFjaGluZS9lbmRpYW4uaD4uCi0KLQkqIGhvc3RzL21pcHNuYnNkLmg6IE5ldyBmaWxlLgotCi1UaHUgT2N0IDI2IDE0OjE2OjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmM6IE51bWVyb3VzIGNoYW5nZXMgdG8gZ2V0IGNsb3NlciB0byBhIHdvcmtpbmcgWENPRkYKLQlsaW5rZXIuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBmdWxsX2FvdXRoZHIsCi0JdG9jX3NlY3Rpb24sIGFuZCBlbnRyeV9zZWN0aW9uIGZpZWxkcy4KLQkoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpOiBSZW1vdmUgbGRyZWxfY291bnQgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIG5ldyB4Y29mZl9kYXRhCi0JZmllbGRzLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIFJTNjAwMENPRkZfQywgZ2VuZXJhdGUKLQlmdWxsIGEub3V0IGhlYWRlciBpZiBmdWxsX2FvdXRoZHIgaXMgc2V0IGluIHhjb2ZmX2RhdGEuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBTZXQgb19zbmVudHJ5IGFuZCBvX3NudG9jCi0JYmFzZWQgb24gc2VjdGlvbnMgc3RvcmVkIGluIHhjb2ZmX2RhdGEuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IG5ldyB4Y29mZl9kYXRhCi0JZmllbGRzLgotCSh4Y29mZl9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUi4KLQkocnM2MDAwY29mZl92ZWMpOiBTZXQgc3ltYm9sX2xlYWRpbmdfY2hhciB0byAnLicuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X3N5bWJvbF9pbmZvKTogSWYgZml4X3ZhbHVlIGlzIHNldCwgZml4IHRoZQotCXZhbHVlIHN0b3JlZCBpbiByZXQgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEgcG9pbnRlciB2YWx1ZS4KLQotV2VkIE9jdCAyNSAyMzoxMDozOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGN7LGxlfS17ZWxmLHN5c3Y0LGVhYmksc29sYXJpczJ9KTogUmVtb3ZlIE1BQwotCWZvcm1hdCBmb3Igbm93LgotCi1XZWQgT2N0IDI1IDE2OjE5OjI3IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBBbGxvY2F0ZSB0aGUgc3RyaW5ncyB3aXRoIG1hbGxvYwotCXNpbmNlIHRoZXkncmUgZnJlZSdkIGJ5IGZyZWVfY2FjaGVkX2luZm8uCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTaW1pbGFybHkgZm9yIHRoZSBzeW1ib2wgdGFibGUuCi0KLVdlZCBPY3QgMjUgMTQ6NTk6MjIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgRG9uJ3QgbWFrZSBoZWFkZXJzLgotCi1XZWQgT2N0IDI1IDExOjMyOjU0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBzdW5vcy5jIChiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERvbid0IGRvIGFueXRoaW5nIGlmCi0Jb3V0cHV0X2JmZCBpcyBub3QgU3VuT1MuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4gIERvbid0IHNjYW4gcmVsb2NzIG9mCi0Jbm9uLVN1bk9TIGlucHV0IGZpbGVzLgotCi0JKiB4Y29mZmxpbmsuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gc3VwcG9ydCBsaW5raW5nIHNoYXJlZCBvYmplY3RzCi0JYW5kIGdlbmVyYXRpbmcgYSAubG9hZGVyIHNlY3Rpb24uCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBpbXBvcnRfZmlsZV9pZCBmaWVsZC4KLQkoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgbGluZW5vX2NvdW50LCBmaXJzdF9zeW1uZHgsCi0JbGFzdF9zeW1uZHgsIGFuZCBsZHJlbF9jb3VudCBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9ob3d0b190YWJsZSk6IENvcnJlY3QgcmVsb2MgbmFtZXMuCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IERvbid0IHNldCBhbnkgZmxhZ3MgaWYgU1RZUF9QQUQKLQlpcyBzZXQuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UdWUgT2N0IDI0IDE3OjQ0OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgeGNvZmZsaW5rLm8gdG8gcG1hY194Y29mZl92ZWMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBtcHctY29uZmlnLmluOiBBZGQgeGNvZmZsaW5rLmMubyB0byBwb3dlcnBjLWFwcGxlLW1hY29zLgotCSogY29mZi1wbWFjLmM6IEluY2x1ZGUgY29mZi1yczYwMDAuYyBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0cwotCWNvbnRlbnRzLgotCShwbWFjX3hjb2ZmX3ZlYyk6IFVwZGF0ZSB0byB1c2UgbmV3IHhjb2ZmIHN1cHBvcnQuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBNYWtlIHN0YXRpYy4KLQkoeGNvZmZfd3JpdGVfYXJtYXApOiBEZWNsYXJlIGJ1ZiBhcyB1bnNpZ25lZCBjaGFyLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlIGEgbG9jYWwgYXMgUFRSLgotCi0JKiBtcHctbWFrZS5zZWQ6IEdlbmVyYWxpemUgc3ViZGlyX2RvIGVkaXQuCi0KLVR1ZSBPY3QgMjQgMTA6MjU6MDEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhYnNkLWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24pOiBJbml0aWFsaXplIGFzZWN0LT5maWxlcG9zCi0JY29ycmVjdGx5LiAgRG9uJ3QgaW5pdGlhbGl6ZSBhc2VjdC0+dm1hLgotCi1GcmkgT2N0IDIwIDEzOjIzOjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogSWYgX2JmZF9jaHVua3NpemUgd2Fzbid0IHByZXNldCwgdXNlCi0Jc29tZXRoaW5nIGEgbGl0dGxlIGxlc3MgdGhhbiB0aGUgcGFnZSBzaXplLgotCi1UaHUgT2N0IDE5IDEzOjA2OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9hZGp1c3Rfc3ltbmR4KTogQ2xlYXIgKmFkanVzdGVkcC4KLQotV2VkIE9jdCAxOCAxNjoyMDowOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogTmV3LgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiAuYnNzIGlzIGJlZm9yZQotCS5kYXRhIHVzIHRoYXQgYXMgZGF0YV9zdGFydC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBHZXQgcmVsb2MKLQljYWxjIGNvcnJlY3QuCi0JKiBwZWljb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogVXNlIF9jb29rZWRfc2l6ZSBvZiBkYXRhIGRpcmVjdG9yeS4KLQkoY29mZl9zd2FwX291dGhkcl9vdXQpOiBIYXJkd2lyZSBpbiB2ZXJzaW9uIG51bWJlci4KLQotV2VkIE9jdCAxOCAxNjo1MDo1NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZXMKLQltYWpvciBhbmQgbWlub3IgdG8gKl92bm8sIHNpbmNlIHRoZSBmb3JtZXIgYXJlIGFsc28gbWFjcm9zIGluCi0JU3VuT1MgaGVhZGVyIGZpbGVzLiAgQ2FzdCByZXN1bHQgb2YgYmZkX2FsbG9jIHRvIGFwcHJvcHJpYXRlCi0JdHlwZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2FzdCB1c2VkX2J5X2JmZCB2YWx1ZQotCWJlZm9yZSBhc3NpZ25pbmcgdG8gc2VjX2RhdGEuCi0KLVdlZCBPY3QgMTggMTM6MjU6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVGhlIG9mZnNldCBhcmd1bWVudCBpcwotCW5vdyByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbiwgbm90IGFic29sdXRlLgotCSogZWNvZmZsaW5rLmMgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBVc2UgdGhlIHJpZ2h0IHN5bWJvbCB0bwotCWdldCB0aGUgZmlsZSBuYW1lIHdoZW4gdGhlcmUgaXMgYSBOX1NPIGRpcmVjdG9yeSBuYW1lLiAgV2hlbgotCWhhbmRsaW5nIHN0YWJzLCByZW1lbWJlciB0aGF0IHNlY3Rpb24tPnZtYSB3YXMgYWRkZWQgdG8gdGhlCi0Jb2Zmc2V0LgotCi1UdWUgT2N0IDE3IDE4OjI0OjU0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZWVkZWQgZmllbGQuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBDYWxsIGJmZF9yZWxlYXNlLCBub3QgZnJlZS4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgbmVlZGVkIGZpZWxkLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogUmVjb3JkIG5lZWRlZCBvYmplY3RzLgotCShiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0KTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gT2N0IDE2IDE0OjQzOjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAocGVfZGF0YV90eXBlLmluX3JlbG9jX3ApOiBOZXcuCi0KLU1vbiBPY3QgMTYgMTA6NTI6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0KTogUmVuYW1lIGZyb20KLQliZmRfZWxmX2xpbmtfbmVlZGVkX2xpc3QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGYuYywgZWxmbGluay5oLCBsaWJlbGYuaDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi0JQWRkIHN0YXJ0IGF0IEFJWCBsaW5rZXIgc3VwcG9ydDsgbm8gc2hhcmVkIGxpYnJhcmllcyB5ZXQuCi0JKiB4Y29mZmxpbmsuYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwY29mZl92ZWMpOiBVc2UgeGNvZmZsaW5rLm8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBjc2VjdHMgYW5kIGRlYnVnX2luZGljZXMKLQlmaWVsZHMuCi0JKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogRGVmaW5lLgotCSh4Y29mZl9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgbWFjcm8uCi0JKF9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1yczYwMDAuYzogQ2xlYW4gdXAgYSBiaXQuCi0JKHhjb2ZmX21rb2JqZWN0KTogRGVmYXVsdCBtb2R0eXBlIHRvIDFMLCBub3QgUkUuICBJbml0aWFsaXplCi0JY3B1dHlwZSwgY3NlY3RzLCBhbmQgZGVidWdfaW5kaWNlcy4KLQkoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBjcHV0eXBlLgotCSh4Y29mZl9ob3d0b190YWJsZSk6IFJlbmFtZSBmcm9tIHJzNjAwMGNvZmZfaG93dG9fdGFibGUuCi0JKHhjb2ZmX3J0eXBlMmhvd3RvKTogUmVuYW1lIGZyb20gcnM2MDAwY29mZl9ydHlwZTJob3d0by4KLQkoeGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgZnJvbQotCXJzNjAwMGNvZmZfcmVsb2NfdHlwZV9sb29rdXAuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoX2JmZF94Y29mZl9zaXplb2ZfaGVhZGVycyk6IERlZmluZS4KLQkoX2JmZF94Y29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCShfYmZkX3hjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pOiBEZWZpbmUuCi0JKHJzNjAwMGNvZmZfdmVjKTogRm9yIEJGRF9KVU1QX1RBQkxFX0xJTkssIHVzZSBfYmZkX3hjb2ZmLCBub3QKLQljb2ZmLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBBSVgsCi0JaW5jcmVtZW50IHNvZmFyIGJ5IFNNQUxMX0FPVVRTWiBpZiBub3QgZXhlY3V0YWJsZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBBSVgsIGFsd2F5cyBvdXRwdXQgYW4gYS5vdXQKLQloZWFkZXI7IGlmIG5vdCBleGVjdXRhYmxlLCBoZWFkZXIgc2l6ZSBvZiBTTUFMTF9BT1VUU1ouCi0JKiBoYXNoLmMgKHN0cnVjdCBiZmRfc3RydGFiX2hhc2gpOiBBZGQgeGNvZmYgZmllbGQuCi0JKF9iZmRfc3RyaW5ndGFiX2luaXQpOiBJbml0aWFsaXplIHhjb2ZmIGZpZWxkLgotCShfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0KTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX3N0cmluZ3RhYl9hZGQpOiBJbiBYQ09GRiBtb2RlLCBsZWF2ZSB0d28gYnl0ZXMgZm9yIGxlbmd0aC4KLQkoX2JmZF9zdHJpbmd0YWJfZW1pdCk6IEluIFhDT0ZGIG1vZGUsIHdyaXRlIG91dCBsZW5ndGguCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgeGNvZmZsaW5rLm8uCi0JKENGSUxFUyk6IEFkZCB4Y29mZmxpbmsuYy4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IFNldCBTRUNfQUxMT0MsIG5vdAotCVNFQ19OT19GTEFHUywgZm9yIC5hY29tbW9uIHNlY3Rpb24uICBGcm9tIFBldGVyIFNjaGF1ZXIKLQk8UGV0ZXIuU2NoYXVlckBSZWdlbnQuRS1UZWNobmlrLlRVLU11ZW5jaGVuLkRFPi4KLQotU2F0IE9jdCAxNCAyMTozNjowMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGluX3JlbG9jX3ApOiBBZGQsIGNsb25lIGZyb20gY29mZi1pMzg2LmMuCi0KLUZyaSBPY3QgMTMgMTc6NDg6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGFjY29uZmlnLmggKEhBVkVfU1lTX1BST0NGU19IKTogVW5kZWYsIHdpdGggY29tbWVudC4KLQkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCi0KLQkqIG9wbmNscy5jIChnZXRwYWdlc2l6ZSkgWyFIQVZFX0dFVFBBR0VTSVpFXTogRGVmaW5lIGFzIDIwNDguCi0JKF9iZmRfY2h1bmtzaXplKTogTmV3IHZhcmlhYmxlLgotCShfYmZkX25ld19iZmQpOiBTZXQgaXQgdG8gZ2V0cGFnZXNpemUoKSBpZiBuZWdhdGl2ZSwgYW5kIHVzZSBpdAotCWZvciBvYnN0YWNrIGNodW5rIHNpemUuCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBnZXRwYWdlc2l6ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiB0cmFkLWNvcmUuYyAocmF3cHRyKTogTWFrZSBpdCBhIGxvY2FsIHZhcmlhYmxlIG9mCi0gCXB0cmFjZV91bml4X2NvcmVfZmlsZV9wLgotCi1GcmkgT2N0IDEzIDExOjIyOjAxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGluX3JlbG9jX3ApOiBOZXcuCi0JKiBjb2ZmLWkzODYuYyAoaW5fcmVsb2NfcCk6IE5ldy4KLQkqIGNvZmZjb2RlLmg6IEFsbHdheXMgaW5jbHVkZSBwZWljb2RlLmggaWYgQ09GRl9XSVRIX1BFLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE9ubHkgc2V0IGhhc19yZWxvY19zZWN0aW9uCi0JaWYgUEVfSU1BR0UuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbAotCWluX3JlbG9jX3AgdG8gZGVjaWRlIGlmIHJlbG9jIHNob3VsZCBiZSBlbWl0dGVkLgotCSogbGliY29mZi5oIChwZV9kYXRhX3R5cGUuaW5fcmVsb2NfcCk6IE5ldy4KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3QpOiBJbml0aWFsaXplIGluX3JlbG9jX3AuCi0KLVdlZCBPY3QgMTEgMDA6NDk6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBNb3ZlIHRvIGNvZmZnZW4uYy4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IENvcHkgZnJvbSBjb2ZmZ2VuLmMuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENvcnJlY3QgY29uZGl0aW9ucwotCXVuZGVyIHdoaWNoIHR5cGUgYW5kIHNpemUgY2hhbmdlIHdhcm5pbmdzIGFyZSBpc3N1ZWQuCi0KLVR1ZSBPY3QgMTAgMTg6MzI6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfY291bnRfbGluZW51bWJlcnMpOiBEb24ndCBjb3VudCBsaW5lIG51bWJlcnMgZm9yCi0JYSBzeW1ib2wgd2hpY2ggaXMgbm90IGluIGEgcmVhbCBzZWN0aW9uLgotCShjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lIGZyb20KLQljb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIGFuZCBtYWtlIG5vbi1zdGF0aWMuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCV9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFVzZSBpdC4KLQkocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IE1ha2Ugc3RhdGljLgotCSogbGliY29mZi1pbi5oICgoX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSWYgUlM2MDAwQ09GRl9DLCBzZXQgY3B1dHlwZQotCWZpZWxkIGluIFhDT0ZGIHRkYXRhLgotCShjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IENoZWNrIGlmZGVmIFJTNjAwMENPRkZfQywgbm90IGlmZGVmCi0JVTgwMlJPTUFHSUMsIGZvciBjbGFyaXR5LiAgVHJ5IHRvIHNldCBhcmNoIGFuZCBtYWNoaW5lIGNvcnJlY3RseQotCWJhc2VkIG9uIGNwdXR5cGUgc3RvcmVkIGluIGEub3V0IGhlYWRlciwgb3IgaW4gbl90eXBlIG9mIGluaXRpYWwKLQkuZmlsZSBzeW1ib2wuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGNwdXR5cGUgY29ycmVjdGx5IGluIGEub3V0Ci0JaGVhZGVyLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFkZCBjYXN0cyB0byBmaWxlX3B0ciB0byBhdm9pZAotCXdhcm5pbmdzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBTd2FwIGluIGNwdXR5cGUgZmllbGQuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IFN3YXAgb3V0IGNwdXR5cGUgZmllbGQuICBEb24ndCBjbGVhcgotCW9sZCByZXN2MSBmaWVsZC4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogQWRkIGNwdXR5cGUgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNwdS1yczYwMDAuYyAocnM2MDAwX2NvbXBhdGlibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfcnM2MDAwX2FyY2gpOiBVc2UgaXQuCi0JKiBjcHUtcG93ZXJwYy5jIChwb3dlcnBjX2NvbXBhdGlibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhcmNoX2luZm9fc3RydWN0KTogRGVmaW5lIHZhcmlvdXMgZmxhdm91cnMgb2YgUG93ZXJQQy4KLQkoYmZkX3Bvd2VycGNfYXJjaCk6IFVzZSBwb3dlcnBjX2NvbXBhdGlibGUuICBQb2ludCBhdAotCWFyY2hfaW5mb19zdHJ1Y3QuCi0KLVR1ZSBPY3QgMTAgMTA6NTA6NDYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogIFJlbW92ZSBCSVNPTi4KLQotVHVlIE9jdCAxMCAwMToyODoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3Qgd2FybiBhYm91dAotCWNoYW5naW5nIHRoZSBzaXplIG9yIHR5cGUgaWYgdGhlIG9sZCBkZWZpbml0aW9uIHdhcyB3ZWFrLgotCi1Nb24gT2N0ICA5IDExOjI0OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29tYmluZWRfZW50cnlfdHlwZSk6IEFkZCBmaXhfbGluZSBmaWVsZC4KLQkoY29mZl9zbHVycF9saW5lX3RhYmxlKTogV2FybiBpZiB3ZSB0cnkgdG8gc2V0IHRoZSBsaW5lbm8gZmllbGQgb2YKLQlhIHN5bWJvbCB0d2ljZS4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSBDX0JJTkNMIGFuZAotCUNfRUlOQ0wgYnkgc2V0dGluZyBmaXhfbGluZS4gIEZpeCBDX0JTVEFUIHN5bWJvbCB2YWx1ZS4KLQkqIGNvZmZnZW4uYyAoY29mZl9tYW5nbGVfc3ltYm9scyk6IEhhbmRsZSBmaXhfbGluZS4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBPbmx5IHVzZSBOX0RFQlVHIGlmIHRoZSBzeW1ib2wgaXMgaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4KLQkoY29mZl9wcmludF9zeW1ib2wpOiBQcmludCBmaXhfdmFsdWUgc3ltYm9scyBpbiBhIHVzZWZ1bCBmYXNoaW9uLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IERlZmluZS4KLQkoeGNvZmZfZGF0YSk6IERlZmluZS4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCB4Y29mZl9vYmpfZGF0YSBmaWVsZCB0byB0ZGF0YSB1bmlvbi4KLQkqIGJmZC1pbjIuaCwgbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfbWtvYmplY3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX21rb2JqZWN0KTogRGVmaW5lLgotCSh4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKHJzNjAwMGNvZmZfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9UT0MgY29tcGxhaW5fb25fb3ZlcmZsb3cgZnJvbQotCXNpZ25lZCB0byBiaXRmaWVsZC4KLQkocnM2MDAwY29mZl92ZWMpOiBBZGQgRFlOQU1JQyB0byBvYmplY3RfZmxhZ3MuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIFJTNjAwMENPRkZfQywgaGFuZGxlIC5wYWQgYW5kCi0JLmxvYWRlciBzZWN0aW9ucyBzcGVjaWFsbHkuCi0JKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IElmIFJTNjAwMENPRkZfQywgZ2V0IHRoZSAudGV4dCBhbmQgLmRhdGEKLQlzZWN0aW9uIGFsaWdubWVudCBmcm9tIHRoZSBYQ09GRiB0ZGF0YSBpbmZvcm1hdGlvbi4KLQkoY29mZl9ta29iamVjdF9ob29rKTogSWYgUlM2MDAwQ09GRl9DLCBzZXQgRFlOQU1JQyBiYXNlZCBvbgotCUZfU0hST0JKLCBhbmQgY29weSB0aGUgZXh0cmEgYS5vdXQgaGVhZGVyIGluZm9ybWF0aW9uIGludG8gdGhlCi0JWENPRkYgdGRhdGEgc3RydWN0dXJlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIFJTNjAwMENPRkZfQywgc2V0IEZfU0hST0JKLAotCUZfRFlOTE9BRCBhbmQgdGhlIGV4dHJhIGEub3V0IGhlYWRlciBpbmZvcm1hdGlvbi4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQlNGX05PVF9BVF9FTkQgZm9yIGEgQ19FWFQgb3IKLQlDX0hJREVYVCBzeW1ib2wgd2l0aCBhdHRhY2hlZCBjc2VjdCBpbmZvcm1hdGlvbi4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogSWYgUlM2MDAwQ09GRl9DLCBzd2FwCi0JaW4gdGhlIG9fbWF4ZGF0YSBmaWVsZC4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogSWYgUlM2MDAwQ09GRl9DLCBzd2FwIGV4dHJhIFhDT0ZGIGZpZWxkcy4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogRG9uJ3QgbW92ZSBhbnkgc3ltYm9sIHRvIHRoZQotCWVuZCBpZiBCU0ZfTk9UX0FUX0VORCBpcyBzZXQuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlbmFtZSBfYmZkX3JlYWRfYXJfaGRyIGZpZWxkIHRvCi0JX2JmZF9yZWFkX2FyX2hkcl9mbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3JlYWRfYXJfaGRyKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBDYXN0IF9iZmRfcmVhZF9hcl9oZHIKLQlyZXR1cm4gdmFsdWUuCi0JKGRvX3NsdXJwX2JzZF9hcm1hcCwgZG9fc2x1cnBfY29mZl9hcm1hcCk6IExpa2V3aXNlLgotCShiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogTGlrZXdpc2UuCi0JKF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IExpa2V3aXNlLgotCi1GcmkgT2N0ICA2IDE2OjE4OjM1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2V0X25leHRfbWFwZW50KTogUmV0dXJuIEJGRF9OT19NT1JFX1NZTUJPTFMKLQl3aGVuIHRoZSBzeW1ib2wgdGFibGUgaXMgZW1wdHkuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgcmVzZXJ2ZQotCXNwYWNlIGZvciBzZWN0aW9uIHN5bWJvbHMsIHNpbmNlIHdlIGRvbid0IG91dHB1dCB0aGVtIGVpdGhlci4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmluZHgpOiBSZW1vdmVkLgotCi0JKiBwdHJhY2UtY29yZS5jIChyYXdwdHIpOiBNYWtlIGl0IGEgbG9jYWwgdmFyaWFibGUgb2YKLSAJcHRyYWNlX3VuaXhfY29yZV9maWxlX3AuCi0KLUZyaSBPY3QgIDYgMTI6MjQ6NDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogUmV0dXJuIGZhbHNlLCBub3QKLQlOVUxMLgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0te2VsZixzeXN2NCxlYWJpLHNvbGFyaXMyfSk6IEFkZCBOVCwgYW5kCi0JTWFjIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUZyaSBPY3QgIDYgMTI6MDQ6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogRG9uJ3QgdHJ5IHRvIHNldCB1cCBmaWxlCi0JYXV4ZW50IGlmIHRoZXJlIGlzbid0IG9uZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogSWYgdGhlcmUgaXMgbm8gZmlsZSBhdXhlbnQsIHVzZSBTWU1OTUxFTgotCXJhdGhlciB0aGFuIEZJTE5NTEVOIGFzIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX3ByaW50X2F1eC4KLQkoYmZkX2NvZmZfcHJpbnRfYXV4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9wb2ludGVyaXplX2F1eF9ob29rIChSUzYwMDBDT0ZGX0MgdmVyc2lvbikpOiBQb2ludGVyaXplIHRoZQotCXNjbmxlbiBmaWVsZCBvZiBhbiBYVFlfTEQgY3NlY3QgYXV4IGVudHJ5LgotCShjb2ZmX3ByaW50X2F1eCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgcG9pbnRlcml6ZSBzY25sZW4gZmllbGQ7IG5vdyBkb25lCi0JaW4gY29mZl9wb2ludGVyaXplX2F1eF9ob29rLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IENhbGwgYmZkX2NvZmZfcHJpbnRfYXV4LgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE9uIEFJWCwgY2xlYXIgRl9SRUxGTEcKLQlpZiB0aGVyZSBhcmUgc3ltYm9scywgZm9yIG5hdGl2ZSBBSVggbGQgY29tcGF0aWJpbGl0eS4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rLgotCShjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spOiBEZWZpbmUgYXMgYSBmdW5jdGlvbiBpZiBSUzYwMDBDT0ZGX0MKLQlvciBJOTYwLCBhbmQgYXMgMCBvdGhlcndpc2UuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBDaGFuZ2UgcGFyYW1ldGVycyAgdG8gdGFrZQotCXN5bWJvbCBwb2ludGVyIGluc3RlYWQgb2YgdHlwZSBhbmQgY2xhc3MsIGFuZCB0byB0YWtlIGF1eCBpbmRleC4KLQlDYWxsIF9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rIGlmIGl0IGlzIGRlZmluZWQuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQWx3YXlzIGNhbGwgY29mZl9wb2ludGVyaXplX2F1eC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBhbGwgZmllbGRzLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtcnM2MDAwLmM6IEFkZCBmdWxsIHN1cHBvcnQgZm9yIEFJWCBhcmNoaXZlcy4gIFJld3JpdGUgb2xkCi0JcmVhZC1vbmx5L2hvc3Qtb25seSBzdXBwb3J0LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBDX0hJREVYVCBzeW1ib2xzIHRvIGJlCi0JQlNGX0xPQ0FMLgotCShPVEhFUl9HTE9CQUxfQ0xBU1MpOiBEbyBub3QgZGVmaW5lIHRvIGJlIENfSElERVhUIGlmCi0JUlM2MDAwQ09GRl9DLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgX2JmZF9yZWFkX2FyX2hkciBmaWVsZC4gIE1vZGlmeQotCUJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgYWNjb3JkaW5nbHkuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zbmFyZl9hcl9oZHIpOiBEb24ndCBkZWNsYXJlLgotCShfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogRGVjbGFyZS4KLQkoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyKTogRGVjbGFyZS4KLQkoX2JmZF9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkoX2JmZF9ub2FyY2hpdmVfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogYXJjaGl2ZS5jOiBDaGFuZ2UgYWxsIGNhbGxlcnMgb2YgX2JmZF9zbmFyZl9hcl9oZHIgdG8gY2FsbAotCV9iZmRfcmVhZF9hcl9oZHIgaW5zdGVhZC4KLQkoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyKTogUmVuYW1lIGZyb20gX2JmZF9zbmFyZl9hcl9oZHIuCi0JKF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBSZW5hbWUgZnJvbQotCWNvbXB1dGVfYW5kX3dyaXRlX2FybWFwLiAgTWFrZSBub24tc3RhdGljLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCk6IENhbGwgX2JmZF9yZWFkX2FyX2hkciByYXRoZXIKLQl0aGFuIF9iZmRfc25hcmZfYXJfaGRyLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVhZF9hcl9oZHIpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKiBpZWVlLmMgKGllZWVfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotVGh1IE9jdCAgNSAxNDowNDowNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmMgKGNvZmZfc3dhcF9maWxlaGRyX2luKTogSWYgc3ltcHRyIGlzCi0JemVybywgdGhlcmUgYXJlbid0IGFueSBzeW1ib2xzLCBldmVuIGlmIG5zeW1zIGlzIHNldC4KLQotVGh1IE9jdCAgNSAxMTo0NTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgYWRqdXN0X2hlYWRlcnMKLQlmaWVsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogQ2hlY2sgZm9yIHZhcmlvdXMgQWxwaGEKLQlzZWN0aW9ucywgYW5kIHNldCBzdHlwIGNvcnJlY3RseSBmb3IgdGhlbTogLmdvdCwgLmhhc2gsIC5keW5hbWljLAotCS5saWJsaXN0LCAucmVsLmR5biwgLmNvbmZsaWMsIC5keW5zdHIsIC5keW5zeW0sIC5jb21tZW50LgotCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQ2hlY2sgZm9yIHZhcmlvdXMgQWxwaGEgc2VjdGlvbgotCXR5cGVzLgotCShlY29mZl9zb3J0X2hkcnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBSZXR1cm4gYm9vbGVhbiwgbm90IHZvaWQuCi0JU29ydCB0aGUgc2VjdGlvbnMgYnkgVk1BIGJlZm9yZSBsb29raW5nIHRocm91Z2ggdGhlbS4gIFB1dCB0aGUKLQlmaXJzdCBub24gU0VDX0FMTE9DIHNlY3Rpb24gb24gYSBuZXcgcGFnZS4gIFB1dCBldmVyeSBTRUNfQUxMT0MKLQlzZWN0aW9uIG9uIGFuIGFwcHJvcHJpYXRlIGJvdW5kYXJ5IHdpdGhpbiB0aGUgcGFnZS4KLQkoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhCi0Jc2VjdGlvbiB0eXBlcyB3aGVuIGluY3JlbWVudGluZyB0ZXh0X3NpemUgYW5kIGRhdGFfc2l6ZS4gIENhbGwKLQlhZGp1c3RfaGVhZGVycyBiYWNrZW5kIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfYWRqdXN0X2hlYWRlcnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIGFkanVzdF9oZWFkZXJzIGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGhvc3RzL2kzODZic2QuaDogUmVzdG9yZSBmaWxlIGluY29ycmVjdGx5IGRlbGV0ZWQgb24gU2VwIDYuCi0KLVdlZCBPY3QgIDQgMTg6MTU6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jIChDT1JFX1ZFUlNJT05fMSk6IFVzZSBDT1JFX1ZFUlNJT05fMSBpbnN0ZWFkCi0Jb2YgQUxURVJOQVRFX0FJWF9DT1JFX0ZPUk1BVC4KLQkqIGNvbmZpZ3VyZS5pbiAoYWl4NCk6IE5vIGxvbmdlciBuZWVkIENPUkVfRkxBR1MuCi0JKiBjb25maWd1cmU6IFVwZGF0ZWQuCi0KLVdlZCBPY3QgIDQgMTU6MzY6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlOUzMyayBjaGFuZ2VzIGZyb20gSWFuIERhbGw6Ci0JKiBhb3V0eC5oIChNWV9maW5hbF9saW5rX3JlbG9jYXRlLCBNWV9yZWxvY2F0ZV9jb250ZW50cyk6IE5ldwotCW1hY3Jvcy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkLCBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQsCi0JYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBDYWxsIHRoZW0gaW5zdGVhZCBvZiBfYmZkXyoKLQl2ZXJzaW9ucy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkKTogTmV3IG1hY3JvLCBkZWZhdWx0cwotCXRvIHplcm8uCi0JKGJhY2tlbmRfZGF0YSk6IFVzZSBpdCBpbnN0ZWFkIG9mIGhhcmRjb2RlZCB6ZXJvLgotCi0JKiBhb3V0LW5zMzJrLmMgKENUT1JfVEFCTEVfUkVMT0NfSE9XVE8pOiBOZXcgbWFjcm8uCi0JKE1ZX3N3YXBfc3RkX3JlbG9jX291dCk6IFVzZSB1ZGF0YS5pIGZvciBLRUVQSVQsIGRvbid0IGNhbGwgc3RvaS4KLQotCSogbnMzMmtuZXRic2QuYzogSW5jbHVkZSBiZmQuaC4KLQkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBtYWNyb3MuCi0JKE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlY2xhcmUgZnVuY3Rpb24gdG9vLgotCSogcGM1MzItbWFjaC5jIChzZXRfc2l6ZXMpOiBEb24ndCBkZWNsYXJlLgotCShNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciwgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQpOiBEZWZpbmUuCi0JKGJhY2tlbmRfZGF0YSwgTVlfYmFja2VuZF9kYXRhKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb25maWcuYmZkOiBUcmVhdCBuczMyay1wYzUzMi11eCogbGlrZSBuczMyay1wYzUzMi1tYWNoKiwgYW5kCi0JbnMzMmstKi1saXRlcyogbGlrZSBuczMyay0qLW5ldGJzZCouCi0KLQkqIGhvc3RzL25ic2QuaDogU3dhcCBvcmRlciBvZiBzeXMvdm1wYXJhbS5oIGFuZCBzeXMvcGFyYW0uaCwgdG8KLQljb21waWxlIG9uIGxpdGVzLgotCi1XZWQgT2N0ICA0IDE0OjE1OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZXN0b3JlIHNldHRpbmcKLQlmX3RpbWRhdCB0byAwLCBkZWxldGVkIG9uIEF1Z3VzdCAyMi4KLQotVHVlIE9jdCAgMyAxNjoyODozMiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsCi0JY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwKLQljb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBpZmRlZiB0byBhbGxvdyBvdmVycmlkZXMuCi0JKiBwZWljb2RlLmggKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldwotCShwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogU3dhcCBic3Mgc2l6ZSBpbnRvIHRoZSByaWdodCBwbGFjZS4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZCBzb21lIG5ld2xpbmVzLgotCi1UdWUgT2N0ICAzIDExOjUzOjA0IDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgZGllIGlmIGEgc3BhY2UgaGFzIG5vIHN1YnNwYWNlcy4KLQotTW9uIE9jdCAgMiAxNDowODo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgbGV0IGEgd2VhawotCWR5bmFtaWMgc3ltYm9sIG92ZXJyaWRlIGEgY29tbW9uIHN5bWJvbC4gIERvbid0IGNoYW5nZSB0aGUgc2l6ZSBvcgotCXR5cGUgaWYgdGhleSBoYXZlIGJlZW4gc2V0IGFuZCB0aGUgbmV3IHN5bWJvbCBpcyBub3QgYSBkZWZpbml0aW9uLgotCVdhcm4gaWYgdGhlIHNpemUgb3IgdHlwZSBjaGFuZ2VzLgotCi1TdW4gT2N0ICAxIDAxOjM0OjQxIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IHdyaXRlIHRoZSBzeW1ib2wgdGFibGUgb3IKLQlzeW1ib2wJc3RyaW5ncy4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogV3JpdGUgdGhlbSBoZXJlLiAgUGxhY2UgdGhlbSBhZnRlciB0aGUKLQlzdWJzcGFjZSBkYXRhLCBidXQgYmVmb3JlIHRoZSByZWxvY3MuCi0KLUZyaSBTZXAgMjkgMTE6MDE6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IEp1c3QgcGFzcyBmYWxzZSwgbm90Ci0JaW5mby0+c2hhcmVkX2xpYnJhcnksIHRvIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBEb24ndCB3YXJuIGFib3V0IGEgcmVsb2MgaW4gdGhlIC50ZXh0Ci0Jc2VjdGlvbi4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IFJlbW92ZSAudGV4dCBzZWN0aW9uIGFzc2VydGlvbi4KLQotVGh1IFNlcCAyOCAxODo0ODo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBwb3dlcnBjLSotbWFjb3MqLCBwb3dlcnBjLSotbXB3Ki4KLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBBZGQgcG1hY194Y29mZl92ZWMgY2FzZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXBtYWMuby4KLQkqIGNvZmYtcG1hYy5jOiBOZXcgZmlsZSwgUG93ZXJNYWMgWENPRkYgc3VwcG9ydC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkIFBvd2VyTWFjIGNhc2UuCi0JKiB0YXJnZXRzLmMgKHBtYWNfeGNvZmZfdmVjKTogRGVjbGFyZS4KLQotCSogbXB3LWNvbmZpZy5pbjogVmFyaW91cyBjaGFuZ2VzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKLQlhdXRvY29uZi1iYXNlZCBjb25maWd1cnkuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlIFVuaXgKLQltYWtlZmlsZSBpbnRvIE1QVyBzeW50YXguCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogaG9zdHMvbXB3Lmg6IFJlbW92ZS4KLQkqIGJmZC1pbi5oLCBiZmQtaW4yLmg6IElmIE1QVywgaW5jbHVkZSB0aGUgZmlsZSB0aGF0IGRlZmluZXMKLQl0cnVlIGFuZCBmYWxzZSBhcyBlbnVtcywgdGhlbiBkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQuCi0KLVRodSBTZXAgMjggMTc6MDY6MjMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9nZXRfc3ltdGFiKTogUmV0dXJuIGFuIGVtcHR5IHN0cmluZyBvbiBlcnJvci4KLQkqIG9wbmNscy5jIChiZmRfZmRwZW5yKTogQ2hhbmdlIFdJTjMyIHJlc3RyaWN0aW9uIHRvIFdJTkdEQi4KLQotVGh1IFNlcCAyOCAxNTozMDo0NCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb2ZmLXBwYy5jOiBSZWZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gZ251IGNvbnZlbnRpb25zCi0JICAgICAgICAgICAgICBSZW1vdmVkIGlycmVsZXZhbnQgImlmIDAiIGNvZGUKLQotVGh1IFNlcCAyOCAxMToxOTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlKTogVHJlYXQgc2Vjb25kYXJ5IHN5bWJvbHMgYXMgd2VhawotCXN5bWJvbHMgcmF0aGVyIHRoYW4gYXMgaW5kaXJlY3Qgc3ltYm9scy4KLQkoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwgYWJvdXQKLQlzZWNvbmRhcnkgc3ltYm9scy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogTWFrZSBzdXJlIHRoYXQgdGhlIGFsaWdubWVudAotCW9mIC5jdG9ycyBhbmQgLmR0b3JzIHNlY3Rpb25zIGlzIG5vIGxhcmdlciB0aGFuIDIuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgY2hhbmdlCi0JYmZkX2xpbmtfaGFzaF9jb21tb24gdG8gYmZkX2xpbmtfaGFzaF9uZXcsIHNpbmNlIGl0IG1heSBiZSBvbiB0aGUKLQl1bmRlZiBsaXN0LgotCShiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERvbid0IHB1dCBfX0RZTkFNSUMgaW4gdGhlCi0JZHluYW1pYyBzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogSGFuZGxlIHJlbG9jcyBjb3JyZWN0bHkgd2hlbiBjcmVhdGluZyBhCi0Jc2hhcmVkIGxpYnJhcnkuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBEb24ndCBtYXJrIHRoZSBfX0RZTkFNSUMgc3ltYm9sIGFzCi0Jd3JpdHRlbiBldmVuIGlmIGl0IGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogVXNlIHBsdF9vZmZzZXQgZm9yIHRoZSBhZGRyZXNzIG9mCi0JdGhlIGp1bXAgdGFibGUgcmVsb2MuICBBZGQgYW4gYXNzZXJ0aW9uLiAgVXNlIFJFTE9DX0pNUF9TTE9UCi0JcmF0aGVyIHRoYW4gdGhlIGNvbnN0YW50IDIyLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogSGFuZGxlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmspOiBTZXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBHT1QgdG8KLQl6ZXJvIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IElmIHRoZXJlIGlzIGEgc3ltYm9sIF9fRFlOQU1JQywKLQl3cml0ZSBpdCBvdXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzeW1ib2wgdGFibGUuCi0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWFybS5vLgotCi1UaHUgU2VwIDI4IDAwOjU4OjA1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIGFybS0qLWNvZmYuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogQWRkIGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYy4KLQkqIHRhcmdldHMuYyAoYXJtY29mZl97bGl0dGxlLGJpZ31fdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYXJtY29mZl97bGl0dGxlLGJpZ31fdmVjLgotCSogY29mZi1hcm0uYyAoYXJtY29mZl97bGl0dGxlLGJpZ31fdmVjKTogQWx3YXlzIGRlZmluZS4KLQotV2VkIFNlcCAyNyAxMDozNzoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX2ZpbmRfdGFyZ2V0KTogUmVtb3ZlIGRlYnVnZ2luZyBjb2RlLgotCi1XZWQgU2VwIDI3IDA3OjIzOjM5IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIGNvZmYtcHBjLmMsIHBlLXBwYy5jLCBwZWktcHBjLmM6IEluaXRpYWwgYmZkIGZvciBjb2ZmL1BFCi0gICAgICAgIHN1cHBvcnQgb24gcG93ZXJwYy4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAqLXBwYyBmaWxlcwotCSogY29mZmNvZGUuaDogcHBjIE1BR0lDLCBhbmQgdXNlIHBlaWNvZGUuaCByYXRoZXIgdGhhbiBjb2Zmc3dhcC5oIHRvCi0gICAgICAgIGFsbG93IHBlIGJhc2VkIC5vJ3MgdG8gYmUgc2hhcmVkIHdpdGggb3RoZXIgdG9vbHMgb24gcHBjL05UCi0JKiBjb25maWcuYmZkOiBhZGRlZCBwb3dlcnBjW2xlXS1bcGV8d2lubnRdIGNvbmZpZyBzdXBwb3J0Ci0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogYWRkZWQgYmZkX3Bvd2VycGNbbGVdX3BlW2ldX3ZlYwotCSogcGVpY29kZS5oOiBBZGRlZCBtb3JlIHNlY3Rpb24gZmxhZ3MgZm9yIFBFIG9uIHBwYwotCSAgICAgICAgICAgICBBZGRlZCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgdG8gYWxsb3cgcGVpY29kZS5oIHRvIGJlCi0JCSAgICAgdXNlZCBmb3Igbm9uLWltYWdlIFBFIGZpbGVzIG9uIHBwYy4KLQkJICAgICBDaGVjayBmb3IgaW1hZ2UsIG9yIG5vdCwgYmVmb3JlIGNvcHlpbmcgcGVfb3B0aGRyCi0JKiB0YXJnZXRzLmM6IEFkZGVkIG5ldyBiZmQncwotCSogdGFyZ2V0cy5jOiBSZW1vdmVkIHR3byBpbmFjdGl2ZSBiZmRzIHRoYXQgc2hvdWxkbid0IGhhdmUgbWFkZSBpdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICBmYXIuCi0KLVR1ZSBTZXAgMjYgMTQ6MDY6NDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX3JlbG9jX3R5cGUpOiBSZW5hbWUgZnJvbSByZWxvY190eXBlLCBhbmQgdXNlCi0JZXhwbGljaXQgdmFsdWVzIHRvIGluaXRpYWxpemUgYWxsIHJlbG9jcy4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKHBwY19lbGZfYnJ0YWtlbl9pbm5lcik6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgYnJhbmNoIHByZWRpY2l0aW9uCi0JcmVsb2NzLgotCShwcGNfZWxmX2JydGFrZW5fcmVsb2MpOiBEaXR0by4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBVc2UgbmV3IGZ1bmN0aW9ucy4gIE1ha2Ugc3VyZSBhbGwgdW5zdXBwb3J0ZWQKLQlyZWxvY3MgdXNlIHBwY19lbGZfdW5zdXBwb3J0ZWRfcmVsb2MuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEtlZXAgdHJhY2sgb2Ygd2hldGhlciBhbiBlcnJvcgotCW5lZWRzIHRvIGJlIHJlcG9ydGVkLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBTdXBwb3J0IGJyYW5jaCBwcmVkaWN0aW9uIHJlbG9jcy4KLQotVHVlIFNlcCAyNiAxMjo0ODowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfYXNzZXJ0KTogUmVtb3ZlIFxuIGZyb20gc3RyaW5nIHBhc3NlZCB0bwotICAgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIuCi0KLQkqIGNvZmYtaTM4Ni5jOiAoVFdPX0RBVEFfU0VDUyk6IERvbid0IGRlZmluZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBfYmZkX21ha2Vfc2VjdGlvbl9ob29rLgotCShiZmRfY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IERvbid0IGRlZmluZS4KLQkoY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IFJlbW92ZS4KLQkoc2VjX3RvX3N0eXBfZmxhZ3MpOiBSZW1vdmUgVFdPX0RBVEFfU0VDUyBjYXNlLgotCShzdHlwX3RvX3NlY19mbGFncyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IERvbid0IGluaXRpYWxpemUgbWFrZV9zZWN0aW9uX2hvb2sKLQlmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSnVzdCBjYWxsCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXksIG5vdCBiZmRfbWFrZV9zZWN0aW9uIG9yCi0JYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2suCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX21ha2Vfc2VjdGlvbl9ob29rKTogUmVtb3ZlLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IERvbid0IGRlY2xhcmUuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IERvbid0IGluaXRpYWxpemUKLQltYWtlX3NlY3Rpb25faG9vayBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3QgdHJ5IHRvIHN0dWZmCi0JcG9pbnRlcnMgaW50byB2YWx1ZSBmaWVsZCBmb3Igd2FybmluZyBhbmQgaW5kaXJlY3Qgc3ltYm9sczsganVzdAotCWxlYXZlIHRoZSB2YWx1ZSBmaWVsZCBhbG9uZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogVXNlIG5leHQgc3ltYm9sIGZvcgotCXdhcm5pbmcgYW5kIGluZGlyZWN0IHN5bWJvbHMsIHJhdGhlciB0aGFuIGxvb2tpbmcgaW4gc3ltYm9sIHZhbHVlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogUmVtb3ZlIGluZGlyZWN0X3B0cl9wdHIKLQlwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBSZW1vdmUgc3VwcG9ydCBmb3IgaW5kaXJlY3QKLQlzeW1ib2xzOyBpdCBkaWRuJ3Qgd29yayBhbnlob3cuCi0JKF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVtb3ZlIGluZGlyZWN0X3B0ciB2YXJpYWJsZS4KLQkqIHN5bXMuYzogQ2hhbmdlIGNvbW1lbnRzIGFib3V0IEJTRl9XQVJOSU5HIGFuZCBCU0ZfSU5ESVJFQ1QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBTZXAgMjUgMTY6MDQ6MDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBGb3IgYWxsIDE0LWJpdCBicmFuY2ggcmVsb2NzLAotCWdvIGJhY2sgdG8gdGVsbGluZyB0aGUgdG9vbHMgdGhpcyByZWxvYyBvcGVyYXRlcyBvbiAzMiBiaXRzLgotCi1Nb24gU2VwIDI1IDExOjQ4OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX2NhbGxiYWNrKTogVXNlIF9iZmRfZXJyb3JfaGFuZGxlcgotCXJhdGhlciB0aGFuIGEgZGlyZWN0IGZwcmludGYuCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkocHBjX2VsZl91bnN1cHBvcnRlZF9yZWxvYyk6IExpa2V3aXNlLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChsaW51eF90YWxseV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KLQkqIG9zZi1jb3JlLmMgKG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogTGlrZXdpc2UuCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX3NpemVvZl9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKHNyZWNfYmFkX2J5dGUpOiBMaWtld2lzZS4KLQkqIGJmZC5jIChiZmRfYXNzZXJ0KTogTGlrZXdpc2UuICBBbHNvIGNoYW5nZSBmaWxlIHRvIGJlIGNvbnN0LgotCSogbGliYmZkLWluLmggKGJmZF9hc3NlcnQpOiBEZWNsYXJlIGZpcnN0IHBhcmFtZXRlciBjb25zdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBEb24ndCBib3RoZXIgdG8gZnByaW50ZjsgcmV0dXJuaW5nCi0JYmZkX3JlbG9jX292ZXJmbG93IGlzIGVub3VnaC4KLQkqIGNvZmYtaDgzMDAuYyAocnR5cGUyaG93dG8pOiBEb24ndCBib3RoZXIgdG8gZnByaW50ZjsganVzdCBhYm9ydC4KLQkqIGNvZmYtaDg1MDAuYyAocnR5cGUyaG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmYtejhrLmMgKHJ0eXBlMmhvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfZ2V0X2xpbmVubyk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX25vX2luZm9fdG9faG93dG9fcmVsKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSk6IExpa2V3aXNlLgotCShNWShzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUgI2lmIDAgc2VjdGlvbnMuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGxpbmVfYnVmIGZpZWxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IFJlbW92ZSBzdGF0aWNzIGJ1ZmZlcgotCWFuZCBmaWxlbmFtZV9idWZmZXIuICBJbnN0ZWFkLCB1c2UgYSBtYWxsb2MgYnVmZmVyIHN0b3JlZCBpbiB0aGUKLQluZXcgbGluZV9idWYgZmllbGQuICBSZW1vdmUgbGVuZ3RoIHJlc3RyaWN0aW9ucy4KLQotCSogY29mZmdlbi5jIChzdHJpbmdfc2l6ZSk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKGRlYnVnX3N0cmluZ19zaXplLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbik6IExpa2V3aXNlLgotCShjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IEFkZCBzdHJpbmdfc2l6ZV9wLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLAotCWFuZCBkZWJ1Z19zdHJpbmdfc2l6ZV9wIHBhcmFtZXRlcnMuICBVc2UgdGhlbSBpbnN0ZWFkIG9mIHRoZQotCWdsb2JhbCB2YXJpYWJsZXMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sLCBjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogQWRkIGxvY2FsIHZhcmlhYmxlcyB0byByZXBsYWNlIHJlbW92ZWQKLQlnbG9iYWwgdmFyaWFibGVzLgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgb2Zmc2V0LCBpLAotCWZ1bmN0aW9uLCBhbmQgbGluZV9iYXNlIGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBzZWN0aW9uIHRkYXRhIHRvIGNhY2hlCi0JaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogQWRqdXN0IG9mZnNldHMgaW4gYW4gTk1BR0lDCi0JZmlsZS4gIEZyb20gUGV0ZXIgRGVXb2xmIDxwbGRAYW10LnRheTEuZGVjLmNvbT4uCi0KLQkqIGluaXQuYyAoaW5pdGlhbGl6ZWQpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShiZmRfaW5pdCk6IERvbid0IGJvdGhlciBzZXR0aW5nIGluaXRpYWxpemVkLgotCShiZmRfY2hlY2tfaW5pdCk6IFJlbW92ZS4KLQkqIG9wbmNscy5jIChfYmZkX25ld19iZmQpOiBEb24ndCBjYWxsIGJmZF9jaGVja19pbml0LgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLVNhdCBTZXAgMjMgMDE6MjI6MjMgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBEb24ndCBjaGVjayB0aGUgY29yZSBmaWxlCi0Jc2l6ZSBmb3IgZnVsbCBjb3JlIGR1bXBzLiBDb3B5IGNvcmUgZmlsZSBoZWFkZXIgdG8gcHJpdmF0ZSBkYXRhLgotCShyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQsCi0JcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiAgTmV3IGZ1bmN0aW9ucyB0byBleHRyYWN0Ci0JdGhlIGZpbGUgbmFtZSBhbmQgdGVybWluYXRpbmcgc2lnbmFsIGZyb20gdGhlIGNvcmUgZmlsZS4KLQkqIGNvZmYtcnM2MDAwLmM6ICBVc2UgdGhlbS4KLQotRnJpIFNlcCAyMiAxNzo0NDo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlDaGFuZ2UgYXJjaCBpbmZvIHRvIGJlIGNvbnN0LCBpbml0aWFsaXplZCBhdCBjb21waWxlIHRpbWUuCi0JKiBhcmNodXJlcy5jOiBSZWluZGVudCBtYW55IGZ1bmN0aW9ucy4gIENoYW5nZSBDT05TVCB0byBjb25zdC4KLQkoYmZkX2FyY2hfaW5mb190eXBlKTogTWFrZSBhcmNoX25hbWUgY29uc3QuICBSZW1vdmUgZGlzYXNzZW1ibGU7Ci0Jbm90aGluZyBzZXQgaXQgYW55aG93LiAgTWFrZSBuZXh0IGNvbnN0LgotCShiZmRfYXJjaF9pbmZvX2xpc3QpOiBSZW1vdmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogUmVuYW1lIGZyb20gYXJjaHVyZXNfaW5pdF90YWJsZS4gIENoYW5nZSBmcm9tCi0JYSB0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycyB0byBhIHRhYmxlIG9mIGJmZF9hcmNoX2luZm9fdHlwZQotCXN0cnVjdHVyZSBhZGRyZXNzZXMuCi0JKGJmZF9zY2FuX2FyY2gpOiBSZXdyaXRlIGFjY29yZGluZ2x5LiAgUmV0dXJuIGEgY29uc3QgcG9pbnRlci4KLQkoYmZkX2xvb2t1cF9hcmNoKTogTGlrZXdpc2UuCi0JKGJmZF9zZXRfYXJjaF9pbmZvKTogUmV3cml0ZSBhY2NvcmRpbmdseS4gIENoYW5nZSBhcmd1bWVudCB0byBiZSBhCi0JY29uc3QgcG9pbnRlci4KLQkoYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QpOiBNYWtlIGNvbnN0LgotCShiZmRfYXJjaF9pbml0LCBiZmRfYXJjaF9saW5raW4pOiBSZW1vdmUuCi0JKGJmZF9nZXRfYXJjaF9pbmZvKTogUmV0dXJuIGEgY29uc3QgcG9pbnRlci4KLQkqIGluaXQuYyAoYmZkX2luaXQpOiBEb24ndCBjYWxsIGJmZF9hcmNoX2luaXQuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBNYWtlIGFyY2hfaW5mbyBjb25zdC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBQdXQgJiBiZWZvcmUgZXZlcnl0aGluZyBpbiAkc2VsYXJjaHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjcHUtKi5jOiBDaGFuZ2UgYmZkXypfYXJjaCBmcm9tIGEgZnVuY3Rpb24gd2hpY2ggY2FsbHMKLQliZmRfYXJjaF9saW5raW4gdG8gYSBjb25zdCBzdHJ1Y3R1cmUuCi0JKiBpZWVlLmMgKGllZWVfb2JqZWN0X3ApOiBNYWtlIGFyY2ggY29uc3QuCi0KLUZyaSBTZXAgMjIgMTY6MjM6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV90eXBlKTogQWRkIHJlbG9jYXRpb25zIHRvIHN1cHBvcnQgYWxsIG9mCi0JUG93ZXJQQyBWLjQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmMzItcHBjLmMgKHJlbG9jX3R5cGUpOiBVcGRhdGUgbmFtZXMgdG8gbWF0Y2ggY3VycmVudCBkcmFmdC4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBNYXJrIDE0IGJpdCByZWxvY3MgYXMgc2hvcnQgc2l6ZWQgYW5kIFBDCi0JcmVsYXRpdmUuICBVcGRhdGUgbmFtZXMgdG8gY3VycmVudCBWLjQgZHJhZnQuCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgc3VwcG9ydCBmb3IgbW9yZSByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVuYW1lIHJlbG9jYXRpb25zIHRvIG1hdGNoIGRyYWZ0LgotCi1UaHUgU2VwIDIxIDIxOjUzOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQWxsb3cgbW9kdWxlcwotCWNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZS1saWIgdG8gYmUgbGlua2VkIHdpdGggZWl0aGVyIG5vcm1hbAotCW1vZHVsZXMgb3IgLW1yZWxvY2F0YWJsZSBtb2R1bGVzLgotCi1XZWQgU2VwIDIwIDEyOjAzOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDbGVhciB0aGUgdnN0YW1wIGZpZWxkCi0JaW4gdGhlIGEub3V0IGhlYWRlci4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkpOiBEb24ndCBzZXQgcl9leHRlcm4gZm9yCi0JYSByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCBldmVuIGlmIGl0J3Mgbm90IGEgc2VjdGlvbi4KLQotVHVlIFNlcCAxOSAxNzowMjoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlbW92ZSB1bnVzZWQgYWxpZ25fcG93ZXJfbWluIGZpZWxkLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogQWxsIGJhY2tlbmRzOiBSZW1vdmUgaW5pdGlhbGl6YXRpb24gb2YgYWxpZ25fcG93ZXJfbWluLgotCi1UdWUgU2VwIDE5IDE0OjAyOjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBHZXQgc2l6ZXMgZm9yIEJTUyByaWdodC4KLQotTW9uIFNlcCAxOCAxNDozNTowMSAxOTk1ICBBcm5lIEguIEp1dWwgIDxhcm5lakBwdnYudW5pdC5ubz4KLQotCSogY29uZmlnLmJmZCAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyBob3N0LgotCSogY29uZmlndXJlLmluIChtaXBzLWRlYy1uZXRic2QqKTogTmV3IG5hdGl2ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIFNlcCAxNSAxMDoyNDozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlNYWtlIHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIG1lcmdlIGNvbW1vbiB0eXBlczoKLQkqIGNvZmZsaW5rLmMgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KTogRGVmaW5lLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSk6IERlZmluZS4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvKTogQWRkIGRlYnVnX21lcmdlIGZpZWxkLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogQWxsb2NhdGUgYW5kIGZyZWUgZGVidWdfbWVyZ2UgdGFibGUuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBNZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0IGFuZCB1bmlvbgotCXR5cGVzLgotCi1UaHUgU2VwIDE0IDE0OjUzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUNvbnZlcnQgaTk2MCBDT0ZGIHRvIHVzZSBDT0ZGIGJhY2tlbmQgbGlua2VyLgotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IFVzZSBhIGNvZmZfc2VjdGlvbl9kYXRhCi0Jc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBzeW1ib2wgYmVpbmcgdXNlZC4KLQkoY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmspOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfaTk2MF9hZGp1c3Rfc3ltbmR4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zdGFydF9maW5hbF9saW5rKTogRGVmaW5lLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgY2FsbGJhY2sgZnVuY3Rpb24KLQlfYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluay4KLQkoYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZS4KLQkoY29mZl9zdGFydF9maW5hbF9saW5rKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEFkZCBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBNYWtlIGdsb2JhbGx5Ci0JdmlzaWJsZS4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBDYWxsIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgaWYgdGhlCi0JZnVuY3Rpb24gY2FsbGJhY2sgaXMgbm90IE5VTEwuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgdGRhdGEgZmllbGQuCi0JKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW4gKGljb2ZmX2JpZ192ZWMpOiBBZGQgY29mZmxpbmsuby4KLQkoaWNvZmZfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwIDEzIDE3OjM4OjIzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuLWluZm8pOiBSZW1vdmUgZXh0cmFuZW91cyB0YWIgZnJvbSBsaW5lCi0JZm9sbG93aW5nIGFjdGlvbi4KLQotV2VkIFNlcCAxMyAxMzoyNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBGYWlsIGlmIGEgc2VjdGlvbiB3aXRoIG5vCi0JY29udGVudHMgaGFzIHJlbG9jcy4KLQotVGh1IFNlcCAxMiAxMjo0NTozNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEtlZXAgdGhlCi0JcmF3IHNpemUgc2FmZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1lbWJlciBpZiBpdCdzIGEgcmVsb2NhdGFibGUKLQlmaWxlLgotCSogbGliY29mZi1pbi5oIChwZV9kYXRhX3R5cGUpOiBOZXcgbWVtYmVyICdoYXNfcmVsb2Nfc2VjdGlvbicKLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogQ2xlYXIgbm90LXJlbG9jIGZsYWcKLQlpZiByZWxvY2F0YWJsZSBmaWxlLiBTd2FwIG91dCBzYXZlZCByYXcgc2l6ZS4KLQotVHVlIFNlcCAxMiAxMjoxNDozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkb19tYWludGFpbmVyX2NsZWFuKTogUmVuYW1lIGZyb20gZG9fcmVhbGNsZWFuLgotCShtYWludGFpbmVyLWNsZWFuKTogUmVuYW1lIGZyb20gcmVhbGNsZWFuLCBwYXNzaW5nCi0JbWFpbnRhaW5lci1jbGVhbiBkb3duIHRvIHN1YmRpcmVjdG9yaWVzLCBidXQgbGVhdmUgcmVhbGNsZWFuIGFzIGEKLQlzeW5vbnltLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBQYXNzIHN5bWJvbCBuYW1lIHRvCi0Jd2FybmluZyBjYWxsYmFjay4KLQotCSogZGVwLWluLnNlZDogUmVtb3ZlIGNvbmZpZy5oIGZyb20gZ2VuZXJhdGVkIGRlcGVuZGVuY2llcy4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLAotCWJyb2tlbiBvdXQgb2Ygc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLgotCShzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBDYWxsIG5ldyBmdW5jdGlvbgotCXN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogQWRkIHRocmVlIG5ldyBwYXJhbWV0ZXJzLiAgUmV0dXJuIHRoZQotCWR5bmFtaWMgc3ltYm9sIHRhYmxlIHRvIHRoZSBjYWxsZXIuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBQZXJtaXQgYWRkX2R5bmFtaWNfc3ltYm9scwotCWNhbGxiYWNrIHRvIG92ZXJyaWRlIHRoZSBzeW1ib2xzIGJlaW5nIHJlYWQuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCB0aHJlZSBuZXcgcGFyYW1ldGVycwotCXRvIGFkZF9keW5hbWljX3N5bWJvbHMgY2FsbGJhY2suCi0KLQlFeHRlbnNpdmUgbWlub3IgY2hhbmdlcyB0byBhdm9pZCB2YXJpb3VzIGdjYyB3YXJuaW5ncy4gIEFsc286Ci0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgY29mZi1hcm0uby4KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX2luZm9fdHlwZSk6IENoYW5nZSBtYWNoIGZpZWxkIGZyb20gbG9uZyB0bwotCXVuc2lnbmVkIGxvbmcuCi0JKGJmZF9sb29rdXBfYXJjaCk6IENoYW5nZSBtYWNoaW5lIHBhcmFtZXRlciBmcm9tIGxvbmcgdG8gdW5zaWduZWQKLQlsb25nLgotCi1Nb24gU2VwIDExIDEwOjU1OjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogRml4IEJGRF9BU1NFUlQ6IGl0J3MgT0sgdG8gZmluZAotCWEgc3ltYm9sIHdpdGggYSBub24temVybyBwbHRfb2Zmc2V0LgotCi1GcmkgU2VwICA4IDExOjQ3OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChhbGlnbl9maWxlX3Bvc2l0aW9uKTogUmVtb3ZlOyBub3QgdXNlZC4KLQotCSogY29uZmlndXJlLmluOiBPbmx5IGNoZWNrIGZvciA8c3lzL3Byb2Nmcy5oPiBvbiBhIG5hdGl2ZSBzeXN0ZW0sCi0JYW5kIG1ha2Ugc3VyZSBpdCBkZWZpbmVzIHByc3RhdHVzX3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBTZXAgIDcgMTI6NDg6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IENvcnJlY3QgbTY4ayBhYm9ydCB0ZXN0LgotCi0JKiBjb25maWcuaW46IFJlbmFtZSBmcm9tIGNvbmZpZy5oLmluLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIgd2l0aCBjb25maWcuaDpjb25maWcuaW4uCi0JQ2hlY2sgZm9yIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuIGNyZWF0aW5nIHN0YW1wLWguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIGNvbmZpZy5pbiByYXRoZXIgdGhhbgotCWNvbmZpZy5oLmluLiAgU2V0IENPTkZJR19IRUFERVJTIHRvIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuCi0JY2FsbGluZyBjb25maWcuc3RhdHVzLgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5oIGFuZCBzdGFtcC1oLgotCShNYWtlZmlsZSk6IEp1c3QgcmVidWlsZCBNYWtlZmlsZS4KLQkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQ3JlYXRlIHN0YW1wLWggd2hlbiByZWJ1aWxkaW5nIGNvbmZpZy5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwICA2IDE1OjAwOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIuICBTdWJzdGl0dXRlCi0JSE9TVF82NEJJVF9MT05HLiAgQ2hlY2sgdGhhdCB2YXJpb3VzIGhlYWRlciBmaWxlcyBleGlzdC4gIENoZWNrCi0JdGhhdCBmY250bCBleGlzdHMuICBDYWxsIEJGRF9CSU5BUllfRk9QRU4uICBDaGVjayB3aGV0aGVyIG1hbGxvYwotCWFuZC9vciBmcmVlIG5lZWQgdG8gYmUgZGVjbGFyZWQuICBEb24ndCBtYWtlIGEgbGluayB0byBzeXNkZXAuaC4KLQlEZWZpbmUgVFJBRF9IRUFERVIgZm9yIHZhcmlvdXMgaG9zdHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogRG9uJ3Qgc2V0IG15X2hvc3QuICBBZGQgZGVmaW5pdGlvbnMgdGFrZW4gZnJvbQotCWhvc3QgaGVhZGVyIGZpbGVzIGZvciB2YXJpb3VzIGVudHJpZXMuICBSZW1vdmUgZW50cmllcyB3aGljaCBub3cKLQlkbyBub3RoaW5nLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWcuaC5pbjogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9oZWFkZXIuCi0JKiBzeXNkZXAuaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoZG9fZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIHN5c2RlcC5oLgotCShSRUNPTkZJRyk6IFJlbW92ZS4KLQkoTE9DQUxfSF9ERVBTKTogTmV3IHZhcmlhYmxlLgotCSgkKEJGRF9MSUJTKSk6IFVzZSAkKExPQ0FMX0hfREVQUykgcmF0aGVyIHRoYW4gbGliYmZkLmggYW5kCi0JJChSRUNPTkZJRykuCi0JKCQoQkZEX01BQ0hJTkVTKSwgJChCRkRfQkFDS0VORFMpKTogTGlrZXdpc2UuCi0JKCQoT1BUSU9OQUxfQkFDS0VORFMpKTogTGlrZXdpc2UuCi0JKHN0bXAtYmZkLmgpOiBKdXN0IHN1YnN0aXR1dGUgZm9yIEJGRF9IT1NUXzY0QklUX0xPTkcsIHJhdGhlciB0aGFuCi0JbG9va2luZyB0aHJvdWdoIHN5c2RlcC5oLgotCSogYmZkLWluLmggKEJGRF9IT1NUXzY0QklUX0xPTkcpOiBEZWZpbmU7IHNldCBieSBNYWtlZmlsZS4KLQkoQkZEX0hPU1RfNjRfQklUKTogRGVmaW5lIGJhc2VkIG9uIEJGRF9IT1NUXzY0QklUX0xPTkcuCi0JKGZwcmludGZfdm1hLCBzcHJpbnRmX3ZtYSk6IExpa2V3aXNlLgotCShpbnQ2NF90eXBlLCB1aW50NjRfdHlwZSk6IERvbid0IGRlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFyY2h1cmVzLmMsIGJmZC5jLCBzcmVjLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCSogZWxmY29yZS5oOiBDaGVjayBIQVZFX1NZU19QUk9DRlNfSCByYXRoZXIgdGhhbiBIQVZFX1BST0NGUy4KLQkqIGx5bngtY29yZS5jOiBJbmNsdWRlIHN0dWZmIGZyb20gb2xkIGhvc3RzL2x5bnguaC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENoZWNrIEhBVkVfRk5DVEwgYW5kIGRlZmluZWQgKEZfR0VURkwpLAotCXJhdGhlciB0aGFuIE5PX0ZDTlRMLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2xpc3QpOiBDaGVjayBIT1NUX0hQUEFIUFVYIGFuZCAhIF9fU1REQ19fCi0JcmF0aGVyIHRoYW4gTkFUSVZFX0hQUEFIUFVYX0NPTVBJTEVSLgotCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgPGVycm5vLmg+LiAgSW5jbHVkZSBUUkFEX0hFQURFUiBpZiBpdAotCWlzIGRlZmluZWQuCi0JKiBob3N0cy8qLmg6IFJlbW92ZSBhbGwgaGVhZGVyIGZpbGVzIHdoaWNoIG1lcmVseSBpbmNsdWRlLAotCWRlY2xhcmUsIGFuZCBkZWZpbmUgdGhpbmdzLiAgTGVhdmUgaGVhZGVyIGZpbGVzIHdoaWNoIGRlZmluZQotCWluZm9ybWF0aW9uIG5lZWRlZCBieSB0cmFkLWNvcmUuYy4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0JJTkFSWV9GT1BFTik6IERlZmluZS4KLQkoQkZEX0NDX0ZPUl9CVUlMRCk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9DQ19GT1JfQlVJTEQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgIDUgMTk6MzU6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBEb24ndCB0cnkgdG8gZ3JlcCAuLi9NYWtlZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb2ZmLXNwYXJjLmMgKENBTENfQURERU5EKTogRG9uJ3Qgc2V0IHRoZSBhZGRlbmQgdG8gdGhlIHZhbHVlIG9mCi0JYSBnbG9iYWwgc3ltYm9sLgotCi1UdWUgU2VwICA1IDEyOjQ4OjI2IDE5OTUgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogaTM4NnBlX3ZlIC0+IGkzODZwZV92ZWMuCi0KLU1vbiBTZXAgIDQgMTQ6MDI6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogSW5jb3Jwb3JhdGUgaG9zdCBNYWtlZmlsZSBmcmFnbWVudHMgYnkgc2V0dGluZwotCXNoZWxsIHZhcmlhYmxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDLiAgU3Vic3RpdHV0ZSBDRkxBR1MsIEhERUZJTkVTIGFuZAotCUFSLiAgQ2FsbCBBQ19QUk9HX0lOU1RBTEwuICBTdWJzdGl0dXRlIENDX0ZPUl9CVUlMRCwgY2hvb3NpbmcgYQotCXZhbHVlIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGNvZGUgaXMgYmVpbmcgY29tcGlsZWQgYnkgYSBjcm9zcwotCWNvbXBpbGVyLiAgRG9uJ3Qgc3Vic3RpdHV0ZSBob3N0X21ha2VmaWxlX2ZyYWcgb3IgZnJhZ3MuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZSB0byBkZWZpbmUgbG9jYWwgQUNfUFJPR19DQy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9QUk9HUkFNKTogU2V0IHRvIEBJTlNUQUxMX1BST0dSQU1ALgotCShJTlNUQUxMX0RBVEEpOiBTZXQgdG8gQElOU1RBTExfREFUQUAuCi0JKEFSKTogU2V0IHRvIEBBUkAuCi0JKENDKTogRGVmaW5lIGFzIEBDQ0AuCi0JKENGTEFHUyk6IFNldCB0byBAQ0ZMQUdTQC4KLQkoQ0NfRk9SX0JVSUxEKTogU2V0IHRvIEBDQ19GT1JfQlVJTERALgotCShAaG9zdF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoQUxMX0NGTEFHUyk6IENoYW5nZSAkKEhERUZJTkVTKSB0byBASERFRklORVNALiAgTW92ZSAkKENGTEFHUykKLQlhZnRlciBvdGhlciBvcHRpb25zLgotCShjb25maWcuc3RhdHVzKTogUmVtb3ZlIGRlcGVuZGVuY3kgdXBvbiBAZnJhZ3NALgotCSogY29uZmlnLyoubWgsIGNvbmZpZy9SRUFETUU6IFJlbW92ZS4KLQotCSogY29uZmlnLmJmZDogUmV3cml0ZSB0byBpbmNvcnBvcmF0ZSB0aGUgY29udGVudHMgb2YgdGhlIE1ha2VmaWxlCi0JZnJhZ21lbnRzIGJ5IHNldHRpbmcgc2hlbGwgdmFyaWFibGVzLCByYXRoZXIgdGhhbiBtZXJlbHkgcmV0dXJuaW5nCi0JdGhlIG5hbWUgb2YgYSBNYWtlZmlsZSBmcmFnbWVudC4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHNoZWxsIHZhcmlhYmxlcyBzZXQgYnkgY29uZmlnLmJmZCByYXRoZXIgdGhhbgotCWxvb2tpbmcgYXQgdGhlIHRhcmdldCBNYWtlZmlsZSBmcmFnbWVudCBmaWxlcy4gIERvbid0IHN1YnN0aXR1dGUKLQl0YXJnZXRfbWFrZWZpbGVfZnJhZy4gIERvIHN1YnN0aXR1dGUgVERFRklORVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQHRhcmdldF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoQUxMX0NGTEFHUyk6IENoYW5nZSAkKFRERUZJTkVTKSB0byBAVERFRklORVNALgotCSogY29uZmlnLyoubXQ6IFJlbW92ZS4KLQotTW9uIFNlcCAgNCAwMzoxMzoyOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQdXQgY2hhbmdlcXVvdGUgbGluZXMgYXJvdW5kICJpWzM0NV04NiIgcGF0dGVybnMKLQlzZWN0aW9uIG9mIGNvcmUgZmlsZSBzdXBwb3J0LgotCi1TdW4gU2VwICAzIDExOjMxOjU4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lIHRvIHVzZSB0aGUKLQlnZW5lcmljIHZlcnNpb24uCi0KLUZyaSBTZXAgIDEgMTc6MDg6NDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IEFkZCBJbWFnZUJhc2UgdG8KLQllbnRyeSwgdGV4dF9zdGFydCBhbmQgZGF0YV9zdGFydC4KLQotRnJpIFNlcCAgMSAxODowNjoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChPRklMRVMpOiBSZW1vdmUgJChUREVQRklMRVMpLgotCSogY29uZmlnL2Fwb2xsby5tdCAoVERFUEZJTEVTKTogUmVtb3ZlLgotCSogY29uZmlnL1JFQURNRTogVXBkYXRlLgotCi0JKiBjb25maWd1cmUuaW46IEZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCBzZXQgQ09SRUZJTEUgYW5kCi0JQ09SRUZMQUcgYmFzZWQgb24gdGhlIGNhbm9uaWNhbCBob3N0IG5hbWUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9DRkxBR1MpOiBBZGQgQENPUkVGTEFHQC4KLQkoT0ZJTEVTKTogUmVwbGFjZSAkKEhERVBGSUxFUykgd2l0aCBAQ09SRUZJTEVALgotCSogY29mZi1yczYwMDAuYzogQ2hlY2sgQUlYX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9BSVggZm9yIGNvcmUgZmlsZQotCXN1cHBvcnQgcm91dGluZXMuICBDaGVjayBMWU5YX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9MWU5YLgotCSogbHlueC1jb3JlLmM6IENoZWNrIExZTlhfQ09SRSByYXRoZXIgdGhhbiBIT1NUX0xZTlguCi0JKiBpMzg2bHlueC5jOiBMaWtld2lzZS4KLQkqIG02OGtseW54LmM6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmM6IExpa2V3aXNlLgotCSogcnM2MDAwLWNvcmUuYzogQ2hlY2sgQUlYX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9BSVguCi0JKiAqLWNvcmUuYzogQ29tbWVudCBjaGFuZ2VzLgotCSogY29uZmlnL2RlY3N0YXRpb24ubWggKEhERVBGSUxFUyk6IFJlbW92ZS4KLQkoSERFRklORVMpOiBSZW1vdmUgLURUUkFEX0NPUkUuCi0JKiBjb25maWcvaXJpeDMubWggKFJBTkxJQik6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NC5taCAoSERFUEZJTEVTLCBSQU5MSUIpOiBSZW1vdmUuCi0JKEhERUZJTkVTKTogUmVtb3ZlIC1ESVJJWF9DT1JFLgotCSogY29uZmlnL3Jpc2Nvcy5taCAoUkFOTElCLCBIREVQRklMRVMpOiBSZW1vdmUuCi0JKEhERUZJTkVTKTogUmVtb3ZlIC1EVFJBRF9DT1JFLgotCSogY29uZmlnL25jcjMwMDAubWggKEFSX0ZMQUdTLCBSQU5MSUIpOiBSZW1vdmUuCi0JKiBjb25maWcvdWx0cmEzLm1oIChSQU5MSUIpOiBSZW1vdmUuCi0JKiBjb25maWcvYWl4NC5taCwgY29uZmlnL2FscGhhb3NmLm1oLCBjb25maWcvYW1peC5taDogUmVtb3ZlLgotCSogY29uZmlnL2Fwb2xsby5taCwgY29uZmlnL2RlbHRhNjgubWgsIGNvbmZpZy9kZWx0YTg4Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvZHB4Mi5taCwgY29uZmlnL2VzaXgubWgsIGNvbmZpZy9oYXJyaXMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9ocDMwMC5taCwgY29uZmlnL2hwMzAwYnNkLm1oLCBjb25maWcvaHBwYWJzZC5taDogUmVtb3ZlLgotCSogY29uZmlnL2hwcGFocHV4Lm1oLCBjb25maWcvaHBwYW9zZi5taDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZhaXgubWgsIGNvbmZpZy9pMzg2YnNkLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oLCBjb25maWcvaTM4Nm1hY2gzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NnNjby5taCwgY29uZmlnL2kzODZ2Lm1oLCBjb25maWcvaTM4NnY0Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDUubWgsIGNvbmZpZy9tODhrbWFjaDMubWgsIGNvbmZpZy9taXBzYnNkLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvbWlwc21hY2gzLm1oLCBjb25maWcvbmV3cy1taXBzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvbmV3cy5taCwgY29uZmlnL3BjNTMybWFjaC5taCwgY29uZmlnL3Jpc2NpeC5taDogUmVtb3ZlLgotCSogY29uZmlnL3JzNjAwLm1oLCBjb25maWcvcnM2MDAwbHlueC5taDogUmVtb3ZlLgotCSogY29uZmlnL3NvbGFyaXMyLm1oLCBjb25maWcvc3RyYXR1cy5taDogUmVtb3ZlLgotCSogY29uZmlnL3N5bW1ldHJ5Lm1oLCBjb25maWcvc3lzdjQubWgsIGNvbmZpZy90YWhvZS5taDogUmVtb3ZlLgotCSogY29uZmlnL3ZheGJzZC5taCwgY29uZmlnL3ZheHVsdC5taCwgY29uZmlnL3ZheHVsdDIubWg6IFJlbW92ZS4KLQotRnJpIFNlcCAgMSAxNToxODo1MCAxOTk1ICBLYXp1bW90byBLb2ppbWEgIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBjaGFuZ2UgYSBEVF9JTklUIG9yCi0JRFRfRklOSSBlbnRyeSBpZiB0aGUgYXBwcm9wcmlhdGUgc3ltYm9sIGlzIG5vdCBpbiB0aGUgaGFzaCB0YWJsZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMKLQlhbmQgd2FudF9oZHJfaW5fc2VnIGZpZWxkcy4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF93YW50X2hkcl9pbl9zZWcpOiBEZWZpbmUgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX3Byb2dyYW1faGVhZGVycyk6IExpa2V3aXNlLgotCShlbGZOTl9iZWQpOiBJbml0aWFsaXplIGNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgYW5kCi0Jd2FudF9oZHJfaW5fc2VnLgotCSogZWxmLmMgKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogQ2FsbCBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzCi0JYmFja2VuZCByb3V0aW5lLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENoZWNrIHdhbnRfaGRyX2luX3NlZyBiYWNrZW5kIGZpZWxkLiAgQ2FsbAotCWNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgYmFja2VuZCByb3V0aW5lLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBbGlnbiBub24gYWxsb2NhdGVkCi0Jc2VjdGlvbnMgd2hlbiBjcmVhdGluZyBhbiBleGVjdXRhYmxlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3BoZHJfaW4pOiBNYWtlIG5vbiBzdGF0aWMuCi0JKGVsZl9zd2FwX3BoZHJfb3V0KTogTWFrZSBub24gc3RhdGljLgotCSogbGliZWxmLmggKGJmZF9lbGYzMl9zd2FwX3BoZHJfaW4pOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9waGRyX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfaW4pOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX291dCk6IERlY2xhcmUuCi0KLQkqIGVjb2ZmbGluay5jIChlY29mZl9jb2xsZWN0X3NodWZmbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyKTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltKTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDEgMTM6MjA6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRml4IHR5cG8uCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSGFuZGxlIGluZGlyZWN0IGFuZAotCXdhcm5pbmcgc3ltYm9scy4gIElmIGFueSBzZWN0aW9uIGlzIG5hbWVkIC5nbnUud2FybmluZy5YWFgsIHRyZWF0Ci0JdGhlIGNvbnRlbnRzIGFzIGEgd2FybmluZyB0byBiZSBpc3N1ZWQgaWYgdGhlIHN5bWJvbCBYWFggaXMKLQlyZWZlcmVuY2VkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRm9yIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLCBqdXN0Ci0Jb3V0cHV0IHRoZSBzeW1ib2wgaXQgcG9pbnRzIHRvLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGJvdGhlciB0byBzZXQgYmZkX2Vycm9yCi0JaWYgYmZkX2hhc2hfYWxsb2NhdGUgZmFpbHMsIHNpbmNlIGl0IHdpbGwgYWxyZWFkeSBiZSBzZXQuCi0JKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBMaWtld2lzZS4KLQkoYXJjaGl2ZV9oYXNoX25ld2Z1bmMpOiBMaWtld2lzZS4KLQkoaGFzaF9lbnRyeV9iZmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFBhc3MgbmV3IGFyZ3VtZW50cyB0byB3YXJuaW5nCi0JY2FsbGJhY2suICBBbGxvY2F0ZSBhIG5ldyB3YXJuaW5nIHVzaW5nIHRoZSBoYXNoIHRhYmxlIG5ld2Z1bmMuCi0JVXNlIGJmZF9oYXNoX3JlcGxhY2UgdG8gdXBkYXRlIHRoZSBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSwgcmF0aGVyCi0JdGhhbiBhc3N1bWluZyB3ZSBjYW4gY29weSB0aGUgZmllbGRzIHdpdGggc3RydWN0dXJlIGFzc2lnbm1lbnQuCi0KLQkqIGhhc2guYyAoYmZkX2hhc2hfcmVwbGFjZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfaGFzaF9yZXBsYWNlKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIFNlcCAgMSAwODoxMjo1MCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIG1pcHMqdnI0MzAwLSotZWxmKiB0YXJnZXQuCi0JKiBjb25maWcvbWlwc2J2cjQzMDAubXQ6IEFkZGVkLgotCi1UaHUgQXVnIDMxIDE2OjAwOjUzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBiZmQtaW4uaCAoUEUgU1RVRkYpOiBEZWxldGVkLgotCSogYmZkLmMgKHRkYXRhLT5wZV9vYmpfZGF0YSk6IE5ldy4KLQkoYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBjb2ZmLWkzODYuYywgY29mZi1hcm0uYyAoY29mZl8qLXJ0eXBlX3RvX2hvd3RvKTogR2V0IGltYWdlIGJhc2UgZnJvbQotCW5ldyBwbGFjZS4KLQkqIGxpYmNvZmYuaCwgbGliYmZkLmgsIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKHBlX3ZhbHVlKTogRGVsZXRlCi0JKGNvZmZfbWtvYmplY3QsIGNvZmZfbWtvYmplY3RfaG9vayk6IENvbmRpdGlvbmFsbHkgYnVpbGQuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTG9vayBpbiBuZXcgcGxhY2UuCi0JKGFkZF9kYXRhX2VudHJ5LCBmaWxsX3BlX2hlYWRlcl9pbmZvKTogRGVsZXRlZC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgUEUgc3R1ZmYuCi0JKGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBjb2Zmc3dhcC5oOiBSZW1vdmUgUEUgc3R1ZmYuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGxpYmNvZmYtaW4uaCAocGVfZGF0YV90eXBlKTogTmV3LgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIHRhcmdldHMuYyAoX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogcGVpY29kZS5oOiBOZXcgZmlsZS4KLQotVGh1IEF1ZyAzMSAxMTo0OToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBBZGQgZXh0ZXJuICJDIiBpZiBfX2NwbHVzcGx1cy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGNvbnZlcnQgYSByZWxvYwotCWFnYWluc3QgYW4gYWJzb2x1dGUgc3ltYm9sIGludG8gYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbi4KLQotVGh1IEF1ZyAzMSAwODowMDoxNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2MpOiBGaXggY29tbW9uIHNpemUgcHJvYmxlbS4KLQkoaTNjb2ZmX29iamVjdF9wKTogRGVsZXRlLgotCi1XZWQgQXVnIDMwIDIwOjQxOjI3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGRlbGV0ZW1lYWNvZmZfYXJtX3JlbG9jKTogRGVsZXRlZC4KLQkoYXJtMjYpOiBOb3QgcGFydGlhbCBpbnBsYWNlLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndAotCWRvIHBhZ2UgYWxpZ25pbmcgaWYgQ09GRl9QQUdFX1NJWkUgaXNuJ3QgZGVmaW5lZC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBVcGRhdGUgaW1hZ2UgYmFzZSBjb3JyZWN0bHkuCi0KLVR1ZSBBdWcgMjkgMTM6NTA6MjEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOgotCUNvbXBpbGUgZXZlbiBpZiBDT0ZGX1BBR0VfU0laRSBpc24ndCBkZWZpbmVkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyYXRlX3JlbG9jX3NlY3Rpb24pOiBXcml0ZQotCWJhc2UgZmlsZSBpbmZvIGFzIHJ2YXMuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVhbCB3aXRoIHJlbG9jIDExLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgI2lmMGVkIGNvZGUKLQlPbmx5IHJlbW92ZSBlbXB0eSBzZWN0aW9ucyBpbiBQRSBpbm1hZ2UgZmlsZXMuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiByZWdlbmVyYXRlZC4KLQkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG8pOiBOZXcgZW50cnkgYXQgMTEuCi0JKGFybV9yZWxvY190eXBlX2xvb2t1cCkgOiBVbmRlcnN0YW5kIHR5cGUgMTEuCi0JKiBjb2ZmLWkzODYuYyAoaG93dG9fdGFibGUpOiBmaXggbmFtZSBvZiBydmEgdHlwZS4KLQkoY29mZi1pMzg2X3J0eXBlX3RvX2hvd3RvKTogVW5kZXJzdGFuZCBSX0lNQUdFQkFTRSB0eXBlLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiAuZWRhdGEgaXMgZGF0YS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBHZXQgcGFnZSBzaXplIHJpZ2h0IGZvciBQRS4KLQlQYWdlc2l6ZSBpbmZvIGlzIG9ubHkgdmFsaWQgaW4gUEUgaW1hZ2UgZmlsZXMuCi0JKGZpbGxfcGVfaGVhZGVyX2luZm8pOiBGaXggZmllbGRzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBlbmRfb2ZfaW1hZ2UgY2FsYy4KLQkoX2JmZF9jb2ZmX2dlbmVyYXRlX3JlbG9jX3NlY3Rpb24pOiBSZW1vdmUgb3JwaGFuZWQgY29tbWVudC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBEb24ndCBhbHdheXMgYWRkIElNQUdFX0JBU0UuCi0JU3dhcCBpbiBQRSBoZWFkZXIuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0dXAgUEUgZmxhZ3MgY29ycmVjdGx5LgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1JWQSk6IE5ldyBmaWVsZC4KLQotVGh1IEF1ZyAyNCAxNzo0OTo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBpbmNsdWRlIGxpbmUgbnVtYmVycyBmb3IKLQlhIHNlY3Rpb24gaWYgaXRzIG91dHB1dCBzZWN0aW9uIGhhcyBubyBjb250ZW50cy4KLQotV2VkIEF1ZyAyMyAxNjo0ODo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IEFkZCBwYXJlbnRoZXNlcyB0byBGSVgKLQlleHByZXNzaW9uIHRvIGF2b2lkIGNvbXBpbGVyIGJ1ZyBvbiBIUC1VWCA5LjAxLgotCi1XZWQgQXVnIDIzIDA5OjQ5OjM5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IFVuYW5zaWZ5LgotCi1Nb24gQXVnIDIxIDE3OjQ5OjI4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfbGlua19zdWJzeXN0ZW0pOiBUdXJuIGVudW0gaW50byAjZGVmaW5lcy4KLQkoYmZkX2xpbmtfcGVfaW5mb19kdmFsKTogTmV3Ci0JKGJmZF9saW5rX3N0YWNrX2hlYXApOiBSZW5hbWVkIGFuZCBtYXNzYWdlZCBpbnRvIGJmZF9saW5rX3BlX2luZm8uCi0JKiBiZmQtaW4yLmg6IHJlYnVpbHQuCi0JKiBiZmQuYyAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogRGVsZXRlZC4KLQkqIGNvZmZjb2RlLmggKHBlX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShmaWxsX3BlX2hlYWRlcl9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBuZXcgZnVuY3Rpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW5pdGlhbHplIGxpbmtfZGF0YSBpZiBub3Qgc2V0LgotCSogY29mZmxpbmsuYyAoY29mZl9maW5hbF9saW5rX2luZm8pOiBSZW1vdmUgcGUgcmFuZG9tbmVzcy4KLQkoZG9yZXNfY29tKTogVXBkYXRlIGluZm8gaW4gYmZkX2xpbmtfcGVfaW5mb19kdmFsLgotCShwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzKTogVXNlIHRoZSBiZmRfbGlua19wZV9pbmZvX2R2YWwuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogUmVtb3ZlIFBFIHN0dWZmLCBpbml0aWFsaXplCi0JY29mZl9kYXRhLT5saW5rX2luZm8uCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfW2FvdXR8ZmlsZWhkcl1fb3V0KTogVXNlIGluZGlyZWN0IFBFIHBvaW50ZXIuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIHJlYWwgaW1hZ2ViYXNlLgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZS5saW5rX2luZm8pOiBOZXcgZmllbGQuCi0KLU1vbiBBdWcgMjEgMTE6MTA6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBJZiBhbiB1bmRlZmluZWQgcmVmZXJlbmNlIGZvbGxvd3MgYW4KLQl1bmRlZmluZWQgd2VhayByZWZlcmVuY2UsIGNoYW5nZSB0aGUgdHlwZSB0byB1bmRlZmluZWQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBEb24ndCByZWNvcmQgYW4KLQl1bmRlZmluZWQgd2VhayByZWZlcmVuY2UgYXMgZGVmaW5lZCwgaW4gY2FzZSBpdCB0dXJucyBpbnRvIGEgcmVhbAotCXVuZGVmaW5lZCByZWZlcmVuY2UgbGF0ZXIgaW4gdGhlIHNhbWUgYXJjaGl2ZS4KLQotVGh1IEF1ZyAxNyAxNjoyOTowOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfc2VjdGlvbik6IENhc3QgdmFsdWUgZm9yIHVzZWRfYnlfYmZkIGZpZWxkCi0JdG8gUFRSLCBub3QgY29mZl9zZWN0aW9uX3RkYXRhIHBvaW50ZXIsIHNpbmNlIFBUUiBpcyB0aGUgcmVhbCB0eXBlCi0Jb2YgdGhlIGZpZWxkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogRGl0dG8uCi0KLVRodSBBdWcgMTcgMTQ6NDQ6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIGxpbmtpbmcgU1BBUkMgU3VuT1MgUElDIGNvbXBpbGVkIGNvZGUuCi0JKiBzdW5vcy5jIChTUEFSQ19QTFRfUElDX1dPUkQwKTogRGVmaW5lLgotCShTUEFSQ19QTFRfUElDX1dPUkQxLCBTUEFSQ19QTFRfUElDX1dPUkQyKTogRGVmaW5lLgotCShzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5KTogQWRkIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQKLQlmaWVsZHMuCi0JKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIGFuZAotCWR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkIGZpZWxkcy4KLQkoc3Vub3NfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMuCi0JKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBDYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCShzdW5vc19hZGRfb25lX3N5bWJvbCk6IENhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIHN1bm9zX3NjYW5fcmVsb2NzIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgd2UgbmVlZCB0byBzZXQgdXAgdGhlIGR5bmFtaWMgbGluayBpbmZvcm1hdGlvbi4KLQlEZWZpbmUgX19HTE9CQUxfT0ZGU0VUX1RBQkxFIGlmIGFueXRoaW5nIHJlZmVycmVkIHRvIGl0LgotCShzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBDYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgVXNlCi0JcGx0X29mZnNldCBmaWVsZDsgb25seSBwdXQgc3ltYm9sIGluIC5wbHQgaWYgaXQgaXMgbm90IGRlZmluZWQgYnkKLQlhIHJlZ3VsYXIgb2JqZWN0LgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBMaWtld2lzZS4gIEhhbmRsZSBiYXNlIHJlbGF0aXZlIHJlbG9jcy4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IFN0b3JlIGR5bm9iaiBpbiBsb2NhbCB2YXJpYWJsZS4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBDaGVjayBwbHRfb2Zmc2V0IHJhdGhlciB0aGFuCi0JY2hlY2tpbmcgd2hldGhlciBzeW1ib2wgaXMgaW4gLnBsdCBzZWN0aW9uLiAgSWYgc3ltYm9sIGlzIGRlZmluZWQKLQlpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIHVzZSBTUEFSQ19QTFRfUElDX1dPUkRbMDEyXSwgYW5kIGRvbid0Ci0JYWRkIGEgSk1QX1RCTCByZWxvYy4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IEFkZCBjb250ZW50cyBhbmQgcmVsb2NhdGlvbnAgZmllbGRzLgotCUlmIHBsdF9vZmZzZXQgaXMgc2V0LCByZWRpcmVjdCByZWxvY2F0aW9uIHRvIFBMVC4gIElmIHRoaXMgaXMgYQotCWJhc2UgcmVsYXRpdmUgcmVsb2MsIHJlZGlyZWN0IHJlbG9jYXRpb24gdG8gR09ULiAgQ2hlY2sKLQlkeW5hbWljX3NlY3Rpb25zX25lZWRlZCBmaWVsZCByYXRoZXIgdGhhbiB3aGV0aGVyIGR5bm9iaiBpcyBzZXQuCi0JKHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmspOiBDaGVjayBkeW5hbWljX3NlY3Rpb25zX25lZWRlZCBmaWVsZAotCXJhdGhlciB0aGFuIHdoZXRoZXIgZHlub2JqIGlzIHNldC4gIERvbid0IGRpZSBpZiAubmVlZCBhbmQgLnJ1bGVzCi0Jc2VjdGlvbnMgd2VyZSBub3QgY3JlYXRlZC4KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IE1hcmsgUEMxMCwgUEMyMiwgYW5kIEpNUF9UQkwgZW50cmllcwotCVBDIHJlbGF0aXZlLiAgTWFyayBQQzEwIGNvbXBsYWluX292ZXJmbG93X2RvbnQuICBNYXJrIFBDMjIgYW5kCi0JSk1QX1RCTCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IElmIGluZm8tPnNoYXJlZCBpcyBzZXQsIHNldCBEWU5BTUlDLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBDYWxsIGNoZWNrX2R5bmFtaWNfcmVsb2MgZm9yIGFsbAotCXJlbG9jcy4gIFBhc3MgY29udGVudHMgYW5kICZyZWxvY2F0aW9uLiAgRG9uJ3Qgd2FybiBhYm91dCBhbgotCXVuZGVmaW5lZCBzeW1ib2wgdW50aWwgY2hlY2tfZHluYW1pY19yZWxvYyBoYXMgYmVlbiBjYWxsZWQuICBEb24ndAotCXdhcm4gYWJvdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBmb3IgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4gIEZvciBhIGJhc2UgcmVsYXRpdmUKLQlyZWxvYywgYWx3YXlzIHRyZWF0IHJfaW5kZXggYXMgYW4gaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgY29udGVudHMgYW5kCi0JcmVsb2NhdGlvbiBhcmd1bWVudCB0byBjaGVja19keW5hbWljX3JlbG9jIGVudHJ5IHBvaW50LgotCShzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgbG9jYWxfZ290X29mZnNldHMgZmllbGQuCi0KLVdlZCBBdWcgMTYgMDE6MDM6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEZpeCBidWcgaW4gbGFzdCBjaGFuZ2UuCi0KLU1vbiBBdWcgMTQgMTE6Mzk6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEhhbmRsZSBhIG1hY2hpbmUgb2YKLQliZmRfbWFjaF9zcGFyYyBvciBiZmRfbWFjaF9zcGFyYzY0LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGEgc3ltYm9sIGlzIGEgd2VhawotCWRlZmluaXRpb24sIGFkZCBpdCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgYW55IGR5bmFtaWMKLQlvYmplY3QgbWVudGlvbnMgaXQuICBJZiB3ZSBkbyBhZGQgaXQsIG1ha2Ugc3VyZSB3ZSBhZGQgdGhlCi0JY29ycmVzcG9uZGluZyByZWFsIHN5bWJvbC4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEFkanVzdCBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2UKLQlwdXQgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBldmVuIGlmIG5vIHJlZ3VsYXIgb2JqZWN0IHJlZmVycwotCXRvIGl0LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgZG9uJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhCi0JbG9jYWwgc3ltYm9sLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDaGFuZ2UgYXNzZXJ0aW9uCi0JdG8gYWNjZXB0IHN5bWJvbCB3aXRoIHdlYWtkZWYgc2V0LgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogV2hlbiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYmFyeSwgZG9uJ3QgY29weSBvdmVyIGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIGxvY2FsCi0Jc3ltYm9sLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1TdW4gQXVnIDEzIDAwOjQwOjU4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoUl9IUFBBX0JFR0lOX0JSVEFCKTogRGVmaW5lLgotCShSX0hQUEFfRU5EX0JSVEFCKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0JFR0lOX0JSVEFCIGFuZCBSX0VORF9CUlRBQi4KLQotVGh1IEF1ZyAxMCAxNTo1MzoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBTd2FwIHRoZSBhcnJheSBkaW1lbnNpb25zCi0Jd2hlbmV2ZXIgeF9mY25hcnkgaXMgbm90IGJlaW5nIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlLCByYXRoZXIKLQl0aGFuIG9ubHkgZm9yIGFuIGFycmF5LgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCi1UdWUgQXVnICA4IDE2OjM0OjU3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgbW9zdAotCW9mIHNwZWNpYWwgY2FzZSBzdHVmZiBmb3IgUEUuICBOb3cgaGFuZGxlZCBieSByZWxvY3MuCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogU3BlY2lhbCBjYXNlIG9mIFBFIHR5cGUgN3MuCi0JKGhvd3RvX3RhYmxlKTogVHlwZSA3IGlzIGRpcjMyLXJ2YS4KLQotVHVlIEF1ZyAgOCAxMDoxNTo0MyAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBhaXg0IGV4cGxpY2l0bHkuCi0JKiByczYwMDAtY29yZS5jIChDT1JFX0RBVEFfU0laRV9GSUVMRCk6IE5ldyBtYWNybyB0byBnZXQgYSB0aGUgc2l6ZQotCW9mIGEgY29yZSBkdW1wJ3MgZGF0YSBzZWN0aW9uLiAgUHJvdmlkZSBhbHRlcm5hdGUgZGVmaW5pdGlvbiBmb3IgYWl4NC4KLQkoU0FWRV9GSUVMRCk6IFNpbWlsYXJseSBmb3Igc2F2ZSBzdGF0ZSBmaWVsZCAocmVnaXN0ZXIgaW5mbykuCi0JKFNUQUNLX0VORF9BRERSKTogUHJvdmlkZSBkZWZpbml0aW9uIHN1aXRhYmxlIGZvciBhaXg0LgotCSogY29uZmlnL3thaXg0Lm1oLGFpeDQubXR9OiBOZXcgY29uZmlndXJhdGlvbiBmaWxlcy4KLQkqIGhvc3RzL2FpeDQuaDogTGlrZXdpc2UuCi0KLU1vbiBBdWcgIDcgMjM6MDM6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBDYXN0IGluaXRpYWxpemF0aW9ucwotCXRvIGF2b2lkIHdhcm5pbmdzLgotCi1Nb24gQXVnICA3IDE0OjUxOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2RlY29kZV9zeW1jbGFzcyk6IEhhbmRsZSBhYnNvbHV0ZSBzeW1ib2xzIGJ5IGNoZWNraW5nCi0JdGhlIFNPTSB0eXBlIChzaW5jZSB0aGV5IHdpbGwgcmFyZWx5IGlmIGV2ZXIgYmUgaW4gdGhlIGFic29sdXRlCi0Jc2VjdGlvbikuCi0KLVdlZCBBdWcgIDYgMDk6MTI6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjNjQpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogY3B1LXNwYXJjLmMgKHNwYXJjX2FyY2hfaW5mbyk6IFJlbmFtZWQgZnJvbSBhcmNoX2luZm9fc3RydWN0LgotCShzcGFyYzY0X2FyY2hfaW5mbyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGJmZF9zcGFyY19hcmNoKTogTGluayBpbiBzcGFyYzY0X2FyY2hfaW5mby4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3h4eCk6IFJlbmFtZWQgZnJvbSBlbGY2NF94eHguCi0JKHNwYXJjNjRfZWxmX29iamVjdF9wKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBEZWZpbmUuCi0JKiBjb25maWcvc3BhcmM2NC1lbGYubXQgKFNFTEVDVF9WRUNTKTogQWRkIGJmZF9lbGYzMl9zcGFyY192ZWMuCi0KLVNhdCBBdWcgIDUgMDA6MDQ6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbSAoc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IFJldHVybiAtMSBvbiBlcnJvci4gIENvbXB1dGUKLQlyZXR1cm4gdmFsdWUgd2l0aCBzaXplb2YgKGFyZWxlbnQgKiksIG5vdCBzaXplb2YgKGFyZWxlbnQpLgotCi1XZWQgQXVnICAyIDEyOjMyOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIHRoZSBzZWN0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0Jc2hfbGluayBmaWVsZCBvZiBhIHJlbG9jIHNlY3Rpb24gaXMgbm90IGEgc3ltYm9sIHRhYmxlLCBhbmQgdGhlCi0JZmlsZSBjb250YWlucyBhIHNpbmdsZSBzeW1ib2wgdGFibGUsIGNsb2JiZXIgdGhlIHNoX2xpbmsgZmllbGQgb2YKLQl0aGUgcmVsb2Mgc2VjdGlvbiB0byBwb2ludCB0byB0aGUgc3ltYm9sIHRhYmxlLgotCi1UdWUgQXVnICAxIDEwOjA5OjAxIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGhvd3RvIHJlbG9jIEFSTTI2KTogQ2hhbmdlIHNpemUgZnJvbSAzIHRvIDIuCi0JKGhvd3RvIHJlbG9jIEFSTTI2RCk6IExpa2V3aXNlLgotCi1Nb24gSnVsIDI0IDE0OjE3OjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IFVzZSB0aGUgbGluZSBqdXN0IGJlZm9yZQotCXRoZSBvZmZzZXQsIG5vdCB0aGUgb25lIGp1c3QgYWZ0ZXIuICBCcmVhayBvdXQgb2YgdGhlIGxvb3AgYWZ0ZXIKLQlmaW5kaW5nIGEgZnVuY3Rpb24gcGFzdCB0aGUgb2Zmc2V0LCBub3QgbWVyZWx5IHdoZW4gZmluZGluZyBhCi0JZnVuY3Rpb24gd2l0aCBhIGxpbmUgZGVmaW5lZC4KLQotCSogZWNvZmZsaW5rLmMgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBXaGVuIGhhbmRsaW5nIHN0YWJzOgotCWNvcnJlY3Qgc2V0dGluZyBvZiBzeW1fcHRyX2VuZCB0byBjb25zaWRlciBzeW1ib2xzIHNraXBwZWQgd2hlbgotCXNldHRpbmcgc3ltX3B0cjsgZG9uJ3QgbGVhdmUgbG9vcCBlYXJseSB1bmxlc3MgYW4gTl9GVU4gaXMgZm91bmQKLQl3aXRoIGEgbGFyZ2VyIHZhbHVlLgotCi0JKiBjb2ZmLXNoLmMgKHNoX2NvZmZfaG93dG9zKTogTWFyayBSX1NIX1BDRElTUDhCWTIgYW5kIFJfU0hfUENESVNQCi0JYXMgUEMgcmVsYXRpdmUuICBEZXNjcmliZSBSX1NIX0lNTTE2LiAgQWRkIGVudHJpZXMgZm9yCi0JUl9TSF9TV0lUQ0gxNiwgUl9TSF9TV0lUQ0gzMiwgUl9TSF9VU0VTLCBSX1NIX0NPVU5ULCBhbmQKLQlSX1NIX0FMSUdOLgotCShTV0FQX0lOX1JFTE9DX09GRlNFVCk6IERlZmluZS4KLQkoU1dBUF9PVVRfUkVMT0NfT0ZGU0VUKTogRGVmaW5lLgotCShDQUxDX0FEREVORCk6IERlZmluZS4KLQkoc2hfcmVsb2MpOiBDaGFuZ2Ugc3ltX3ZhbHVlIGFuZCBhZGRyIHRvIHR5cGUgYmZkX3ZtYS4gIFNraXAgcmVsb2MKLQl0eXBlcyBvdGhlciB0aGFuIFJfU0hfSU1NMzIgYW5kIFJfU0hfUENESVNQIG9uIGFuIGV4dGVybmFsIHN5bWJvbC4KLQkoY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCShzaF9yZWxheF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2hfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX1NIX1BDRElTUCBvbiBhbiBleHRlcm5hbCBzeW1ib2wuCi0JKHNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhbGwKLQlfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMsIG5vdCBjb2ZmX2xpbmtfZ2V0X3N5bWJvbHMuICBDYWxsCi0JX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scywgbm90IGNvZmZfbGlua19mcmVlX3N5bWJvbHMuICBDYWxsCi0JX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLCBub3QgY29mZl9yZWFkX3N0cmluZ190YWJsZS4KLQkoY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19nZXRfc3ltYm9scyk6IE1vdmUgdG8gY29mZmdlbi5jLgotCShjb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19mcmVlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBVc2UgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IFVzZSBjYWNoZWQgc2VjdGlvbiBjb250ZW50cyBpZiBhdmFpbGFibGUuCi0JVXNlIF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgY2FsbCBiZmRfc2Vlay4KLQkoY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogT25seSBkZWZpbmUgaWYgbm90Ci0JYWxyZWFkeSBkZWZpbmVkLgotCShjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGJ1aWxkX3N0cmluZ190YWJsZSk6IFJlbW92ZS4KLQkoX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tIG9sZAotCWNvZmZfbGlua19nZXRfc3ltYm9scyBpbiBjb2ZmbGluay5jLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20gb2xkCi0JY29mZl9yZWFkX3N0cmluZ190YWJsZSBpbiBjb2ZmbGluay5jLgotCShfYmZkX2NvZmZfZnJlZV9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm1vIG9sZAotCWNvZmZfbGlua19mcmVlX3N5bWJvbHMgaW4gY29mZmxpbmsuYy4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBVc2UgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzCi0JcmF0aGVyIHRoYW4gcmVhZGluZyB0aGUgc3ltYm9scyBkaXJlY3RseS4gIFRvIGZyZWUgdGhlbSwgY2FsbAotCV9iZmRfY29mZl9mcmVlX3N5bWJvbHMuICBVc2UgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIHJhdGhlcgotCXRoYW4gYnVpbGRfc3RyaW5nX3RhYmxlLgotCSogbGliY29mZi1pbi5oIChvYmpfY29mZl9rZWVwX3N5bXMpOiBEZWZpbmUuCi0JKG9ial9jb2ZmX2tlZXBfc3RyaW5ncyk6IERlZmluZS4KLQkoY29mZl9kYXRhX3R5cGUpOiBBZGQgZmllbGRzIGtlZXBfc3ltcyBhbmQga2VlcF9zdHJpbmdzLgotCShjb2ZmX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkoY29mZl9zZWN0aW9uX2RhdGEpOiBEZWZpbmUuCi0JKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9mcmVlX3N5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDIxIDIyOjMyOjU0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgc3VwcG9ydCBmb3IgUl9QUENfU0RBUkVMCi0JcmVsb2NhdGlvbi4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCShwcGNfZWxmX2dvdDE2X2lubmVyKTogRGl0dG8uCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1UaHUgSnVsIDIwIDE5OjE5OjA2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogQWRkIG5ldyAoaWdub3JlZCkKLQlhcmd1bWVudC4KLQkqIGVsZjMyLWhwcGEuaDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVRodSBKdWwgMjAgMTk6MDE6MDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoc2V0X2FvdXRfc2VjdGlvbl9kYXRhKTogTmV3IG1hY3JvLgotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9yZWxvY3MpOiBVc2UgaXQuCi0KLQkqIGFvdXQtbnMzMmsuYyAoTVlfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVW5kZWYgS0VFUElUIGJlZm9yZQotCWRlZmluaW5nIGl0LgotCi1UaHUgSnVsIDIwIDEzOjQ4OjAwIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBob3N0cy9pMzg2djQuaCAoZ2V0Z2lkLCBnZXR1aWQpOiAgQ2hhbmdlIHByb3RvdHlwZXMgdG8gYmUKLQljb21wYXRpYmxlIHdpdGggVW5peHdhcmUgMS54IGFuZCBVbml4d2FyZSAyLngsIGFuZCBwcm9iYWJseSBvdGhlcgotCWkzODYgc3ZyNCB2ZXJzaW9ucyBhcyB3ZWxsLgotCi1UaHUgSnVsIDIwIDEzOjQxOjIxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogU2luY2UgYXJtcGUgYW5kIGFybXBlaSBoYXZlIGJlZW4KLQlzcGxpdCBpbnRvIGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gdmFyaWFudHMsIGxpc3QgYWxsIG9mIHRoZW0sCi0JaW5zdGVhZCBvZiB0aGUgbm93LW5vbmV4aXN0YW50IGFybXBlW2ldX3ZlYy4KLQotVGh1IEp1bCAyMCAwMDowNjozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBTZXQgbG1hIGJhc2VkIG9uIHBfcGFkZHIuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2FkZHIgYmFzZWQgb24gbG1hLCBub3Qgdm1hLgotCi1XZWQgSnVsIDE5IDE1OjUyOjAxIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IFJlcGxhY2VzIFRBUkdFVF9TWU0uCi0JKiBjb25maWd1cmUuaW4gKGFybXBlX3ZlYywgYXJtcGVpX3ZlYyk6IEFkZCBiaS1lbmRpYW4gc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZTogInJlZ2VuZXJhdGVkIi4KLQkqIHBlLWFybS5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBSZXBsYWNlcyBUQVJHRVRfU1lNLgotCShUQVJHRVRfTElUVExFX05BTUUsIFRBUkdFVF9CSUdfTkFNRSk6IFJlcGxhY2VzIFRBUkdFVF9OQU1FLgotCSogcGVpLWFybS5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBSZXBsYWNlcyBUQVJHRVRfU1lNLgotCShUQVJHRVRfTElUVExFX05BTUUsIFRBUkdFVF9CSUdfTkFNRSk6IFJlcGxhY2VzIFRBUkdFVF9OQU1FLgotCSogdGFyZ2V0cy5jIChhcm1wZV92ZWMsIGFybXBlaV92ZWMpOiBEZWxldGVkLgotCShhcm1wZV9saXR0bGVfdmVjLCBhcm1wZV9iaWdfdmVjLCBhcm1wZWlfbGl0dGxlX3ZlYywgYXJtcGVpX2JpZ192ZWMpOgotCUFkZGVkLgotCSogY29uZmlnL2FybS1wZS5tdCAoREVGQVVMVF9WRUNUT1IpOiBEZWZhdWx0IGlzIGFybXBlX2xpdHRsZV92ZWMuCi0JKFNFTEVDVF9WRUNTKTogQWRkIGJpLWVuZGlhbiBzdXBwb3J0LgotCi1XZWQgSnVsIDE5IDEwOjQ3OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jOiBDbGVhbiB1cCBhbmQgY29tbWVudC4KLQkocl9pbW0zMik6IFJlbW92ZS4KLQkoc2hfY29mZl9ob3d0b3MpOiBOZXcgc3RhdGljIGFycmF5LgotCShTSF9DT0ZGX0hPV1RPX0NPVU5UKTogRGVmaW5lLgotCShnZXRfc3ltYm9sX3ZhbHVlKTogTWFrZSByZWxvY2F0aW9uIGJmZF92bWEgcmF0aGVyIHRoYW4gbG9uZy4KLQkoUlRZUEUySE9XVE8pOiBSZXdyaXRlIHRvIHVzZSBzaF9jb2ZmX2hvd3Rvcy4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lIHRvIHNoX3JlbG9jYXRlX3NlY3Rpb24uCi0JKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1TYXQgSnVsIDE1IDAxOjAyOjUzIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJpYyBtNjhrIFNWUjQgaG9zdC4KLQotRnJpIEp1bCAxNCAxMzoxMzo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKEtFRVBJVCk6IENoYW5nZSBkZWZpbml0aW9uIHRvIHVkYXRhLmkuCi0JKEtFRVBJVFRZUEUpOiBSZW1vdmUuCi0JKE5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkpOiBBZGQgY2FzZXMgdG8gdGhlCi0JZXh0ZW5kZWQgcmVsb2MgdHlwZSBzd2l0Y2g6IFNQQVJDX0dPVDEwLCBTUEFSQ19HT1QxMywgU1BBUkNfR09UMjIsCi0JU1BBUkNfUEMxMCwgU1BBUkNfUEMyMiwgU1BBUkNfV1BMVDMwLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IERvbid0IGJvdGhlciB0byB1c2Ugc3RvaSB3aGVuCi0JcmV0cmlldmluZyBLRUVQSVQgdmFsdWUuCi0JKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogTGlrZXdpc2UuICBBbHNvLCBvbmx5IGFkZCBpbgotCW91dHB1dCBzZWN0aW9uIFZNQSBmb3Igc2VjdGlvbiBzeW1ib2xzLCBhbmQgY2hlY2sgQlNGX1NFQ1RJT05fU1lNCi0JdG8gY29udHJvbCB3aGV0aGVyIHRvIHNldCByX2V4dGVybiB0byAxLgotCi0JKiBzeW1zLmM6IEZpeCBjb21tZW50cyBzbyB0aGF0IGBtYWtlIGluZm8nIHdvcmtzLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogU2V0IFNFQ19IQVNfQ09OVEVOVFMKLQlpbiAubWRlYnVnIHNlY3Rpb24sIGluIGNhc2UgYmFja2VuZCBsaW5rZXIgaGFzIGNsZWFyZWQgaXQuCi0KLUZyaSBKdWwgMTQgMTE6NTg6MzQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIpOiBSZXdyaXRlIHRvIHRha2UganVzdCBvbmUKLQlhcmd1bWVudCwgdGhlIGZpbmFsIHJlbG9jYXRlZCBhZGRyZXNzLgotCShwcGNfZWxmX2FkZHIxNl9oYV9pbm5lcik6IEFkanVzdCBwcGNfZWxmX2FkZHIxNl9oYV9pbm5lciBjYWxsZXIuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1UaHUgSnVsIDEzIDE3OjIyOjAzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBDaG9vc2UgYSByZWFzb25hYmxlIGZpZWxkCi0Jc2VsZWN0b3IgcmVsb2NhdGlvbiBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuCi0KLVRodSBKdWwgMTMgMTA6MzM6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogQ2FzdCBhcmd1bWVudCB0byBzaXplX3QKLQlmb3IgbWFsbG9jLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLCBmb3IgbWVtbW92ZS4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBjb2ZmbGluay5jIChwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUpOiBMaWtld2lzZS4KLQkoZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLCBmb3IgbWVtY3B5IGFuZCBtYWxsb2MuCi0JKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGVjb2ZmbGluay5jIChlY29mZl9hbGlnbl9kZWJ1Zyk6IExpa2V3aXNlLCBmb3IgbWVtc2V0LgotCShlY29mZl93cml0ZV9zeW1oZHIpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBMaWtld2lzZSwgZm9yCi0JcXNvcnQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBMaWtld2lzZS4KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVmaWxlX25vdGUpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX3JlYWRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogTGlrZXdpc2UsIGZvciBtZW1zZXQuCi0JKiBpMzg2bGludXguYyAoYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogaWVlZS5jIChkb193aXRoX3JlbG9jcyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwgZm9yIG1lbWNweS4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLAotCWZvciBtYWxsb2MuCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLCBmb3IgbWVtY3B5LgotCSogc3JlYy5jIChzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZSwgZm9yCi0JcmVhbGxvYyBhbmQgbWVtc2V0LgotCShzdW5vc19zY2FuX3JlbG9jcyk6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UsIGZvciByZWFsbG9jLgotCSogc3ltcy5jIChfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogdmVyc2Fkb3MuYyAodmVyc2Fkb3NfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwgZm9yCi0JbWVtY3B5LgotCi0JKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogQWRkIHByb3RvdHlwZS4gIENoYW5nZSBhcmd1bWVudCB0eXBlcyBmcm9tCi0JaW50IHRvIHNpemVfdC4KLQkoYmZkX3JlYWQpOiBDYXN0IHJlYWxfcmVhZCBhcmd1bWVudCB0byBzaXplX3QsIG5vdCBpbnQuCi0JKGJmZF93cml0ZSk6IENhc3QgZndyaXRlIGFyZ3VtZW50IHRvIHNpemVfdCwgbm90IGludC4KLQotCSogZWxmNjQtZ2VuLmMgKGVsZl9pbmZvX3RvX2hvd3RvKTogRml4IGRlZmluaXRpb24gZm9yIHJlY2VudCBlbGYuYwotCWNoYW5nZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG86IGNoYW5nZSB7JGVuYWJsZXZhbH0gdG8gJHtlbmFibGV2YWx9LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmbGluay5vLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgZmllbGRzIF9yZWFkX21pbmlzeW1ib2xzIGFuZAotCV9taW5pc3ltYm9sX3RvX3N5bWJvbC4KLQkoQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyk6IEFkZCBfcmVhZF9taW5pc3ltYm9scyBhbmQKLQlfbWluaXN5bWJvbF90b19zeW1ib2wuCi0JKGJmZF9yZWFkX21pbmlzeW1ib2xzKTogRGVmaW5lLgotCShiZmRfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKiBzeW1zLmMgKF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogYW91dHguaCAoTUlOSVNZTV9USFJFU0hPTEQpOiBEZWZpbmUuCi0JKE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKSk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpKTogRGVjbGFyZS4KLQkoTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKSk6IERlY2xhcmUuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWFkX21pbmlzeW1ib2xzKTogRGVmaW5lLgotCShNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlZmluZS4KLQkqIEFsbCB0YXJnZXRzOiBEZWZpbmUgcmVhZF9taW5pc3ltYm9scyBhbmQgbWluaXN5bWJvbF90b19zeW1ib2wuCi0KLVdlZCBKdWwgMTIgMTc6NTU6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbQotCWJmZF9hbGxvYy4KLQotCSogZWxmY29kZS5oIChzaXplX2luZm8pOiBEb24ndCB1c2UgIiYiIGJlZm9yZSBmdW5jdGlvbiBuYW1lcy4KLQotV2VkIEp1bCAxMiAwMDoxNjo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBVc2UgdW5zaWduZWQsIG5vdCB1bnNpZ25lZCBjaGFyLAotCWZvciBiaXRmaWVsZHMuCi0KLVR1ZSBKdWwgMTEgMTU6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSW4gY2FzZSBTSFRfUkVMW0FdLCBvbmx5IGdldCB0aGUKLSAgICAgICAgQkZEIHNlY3Rpb24gZm9yIHRoZSBzaF9saW5rIHNlY3Rpb24gaWYgaXQgaXMgYSBTWU1UQUIgc2VjdGlvbi4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrCi0JdGhhdCBhcmNoaXZlcyBob2xkIGEub3V0IG9iamVjdHMuCi0JKiBjZi1pMzg2bHlueC5jIChjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBSZW1vdmUuCi0JKiBjZi1tNjhrbHlueC5jIChjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBSZW1vdmUuCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGJvdGhlciB0byBjaGVjayB0aGF0Ci0JYXJjaGl2ZXMgaG9sZCBFTEYgb2JqZWN0cy4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiB0aGUgYXJjaGl2ZSBoYXMgYSBtYXAsIGFuZAotCXRoZSB0YXJnZXQgd2FzIGRlZmF1bHRlZCwgYnV0IHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGFyY2hpdmUgY2FuCi0Jbm90IGJlIG1hdGNoZWQgd2l0aCB0aGF0IHRhcmdldCwgdGhlbiByZXR1cm4gYSBiYWQgZm9ybWF0IGVycm9yLgotCi0JKiBlbGY2NC1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBTZXQgaG93dG8gZm9yIFdESVNQMTYgdG8KLQllbGY2NF93ZGlzcDE2X3JlbG9jLgotCShlbGY2NF93ZGlzcDE2X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmNjRfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGxhc3QgYXJndW1lbnQgdG8KLQlzd2FwX3N5bWJvbF9vdXQgZnJvbSBjaGFyICogdG8gUFRSLgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3N5bWJvbF9vdXQpOiBDaGFuZ2UgdHlwZSBvZiBjZHN0IGZyb20gY2hhciAqCi0JdG8gUFRSLgotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBDYXN0IHRvIFBUUiwgbm90IGNoYXIgKiwgd2hlbiBjYWxsaW5nCi0Jc3dhcF9zeW1ib2xfb3V0IHJvdXRpbmUuCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9zeW0pOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotVHVlIEp1bCAxMSAxMjoyOTo0OSAxOTk1ICBSaWNrIFNsYWRrZXkgIDxqcnNAd29ybGQuc3RkLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogSGFuZGxlIHRoZSBzaW1wbGUgY2FzZSB3aGVyZQotCXRoZXJlIGlzIG5vIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotTW9uIEp1bCAxMCAxMTo0NTo1NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWFrZWZpbGUuZG9zIChPQkpTKTogQWRkIGJpbmFyeS5vIGFuZCB0ZWtoZXguby4gIEZyb20gREoKLQlEZWxvcmllLgotCi1Nb24gSnVsIDEwIDExOjA5OjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKHNldF9zeW1ib2xfZnJvbV9oYXNoKTogYmZkX2xpbmtfaGFzaF9uZXcgY2FzZTogRG9uJ3QKLQlhYm9ydDsgaXQgY2FuIGhhcHBlbiBmb3IgY29uc3RydWN0b3Igc3ltYm9scyB3aGVuIG5vdCBidWlsZGluZwotCWNvbnN0cnVjdG9ycy4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IENvcnJlY3QgdHlwbzogdXNlICEgb24gc3RyY21wLAotCW5vdCBvbiBzdHJpbmcuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZAotCWxvY2FsIGkuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9ydHlwZV90b19ob3d0byk6IERvbid0IGRlY2xhcmUuCi0JKFBDUkVMT0ZGU0VUKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtYXJtLm8KLQkoQ0ZJTEVTKTogQWRkIGNvZmYtYXJtLmMsIHBlLWFybS5jLCBwZWktYXJtLmMuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKSk6IEFsbG9jYXRlIGhhc2ggdGFibGUKLQl1c2luZyBiZmRfYWxsb2MsIG5vdCBtYWxsb2MuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFpYi5jb20+OgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IElmIC1Cc3ltYm9saWMsCi0Jb3V0cHV0IGEgRFRfU1lNQk9MSUMgZHluYW1pYyBlbnRyeS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIC1Cc3ltYm9saWMsIGRvbid0IHJlcXVpcmUgYSBQTFQKLQllbnRyeSBmb3IgYSBsb2NhbGx5IGRlZmluZWQgc3ltYm9sLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8gd2FybgotCWFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhIHN5bWJvbAotCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYSBSRUxBVElWRQotCXJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCXJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkbyB3YXJuCi0JYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBmaWxsIGluIHRoZSBHT1QgZW50cnkgZm9yIGEgc3ltYm9sCi0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IElmIC1Cc3ltYm9saWMsIG91dHB1dCBhIFJFTEFUSVZFCi0JcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVCByZWxvYyBmb3IgYSBzeW1ib2wgZGVmaW5lZCBpbiBhCi0JcmVndWxhciBvYmplY3QgZmlsZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkbwotCXdhcm4gYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBmaWxsIGluIHRoZSBHT1QgZW50cnkgZm9yIGEKLQlzeW1ib2wgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IElmIC1Cc3ltYm9saWMsIG91dHB1dCBhCi0JUkVMQVRJVkUgcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVCByZWxvYyBmb3IgYSBzeW1ib2wgZGVmaW5lZAotCWluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQotCSogY29uZmlnL202OGstY29mZi5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW5hbWUgZnJvbSBTRUxFQ1RfVkVDVE9SUy4KLQlDb3JyZWN0IGVsZW1lbnRzIHRvIGJlIGFjdHVhbCBCRkQgdmVjdG9yIG5hbWVzLgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBEb24ndCBkZXBlbmQgdXBvbiBAZnJhZ3NALgotCShjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gQGZyYWdzQC4KLQotRnJpIEp1bCAgNyAxNzozNjo0NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogU29ydCBkZWZpbmVkIHN5bWJvbHMgdGhhdCBhcmUKLQluZWl0aGVyIEJTRl9GVU5DVElPTiBub3QgQlNGX05PVF9BVF9FTkQganVzdCBiZWZvcmUgdW5kZWZpbmVkCi0Jc3ltYm9scy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9GVU5DVElPTiBhcyB3ZWxsCi0JYXMgQlNGX05PVF9BVF9FTkQuCi0KLUZyaSBKdWwgIDcgMTc6MTY6MTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkb19tb3N0bHljbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCShkb19kaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi1UaHUgSnVsICA2IDE0OjM3OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV2ZXJ0IE1heSAyNCBwYXRjaC4KLSAgICAgICAgRG9uJ3QgY29weSBQQzMyIHJlbG9jIGFnYWluc3Qgc2VjdGlvbiBpbnRvIHNoYXJlZCBvYmplY3QuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkZWQgZWxmbGluay5jLgotCShNYWtlZmlsZSk6IERlcGVuZCB1cG9uIGNvbmZpZy5zdGF0dXMsIG5vdCBjb25maWd1cmUuaW4uCi0JKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0OyBkZXBlbmQgdXBvbiBjb25maWd1cmUgY29uZmlndXJlLmhvc3QKLQlhbmQgY29uZmlnLmJmZC4KLQotV2VkIEp1bCAgNSAyMDoxNzoxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29yZS5oLCBlbGZsaW5rLmgsIGVsZmNvZGUuaCwgZWxmLmMsIGVsZmxpbmsuYzogTW92ZWQgc29tZQotIAlwcmltYXJpbHkgc2l6ZS1pbmRlcGVuZGVudCBjb2RlIGZyb20gZWxmY29kZS5oIHRvIGVsZi5jIGFuZCBuZXcKLSAJZmlsZSBlbGZsaW5rLmM7IG1vdmVkIG91dCBvdGhlciBjb3JlLSBvciBsaW5rZXItcmVsYXRlZCByb3V0aW5lcwotIAlpbnRvIG90aGVyIG5ldyAuaCBmaWxlcyBmb3IgY2xhcml0eS4gIFJlbmFtZWQgbWFueSByb3V0aW5lcyB0bwotIAlzdGFydCB3aXRoIGJmZF9lbGYgb3IgX2JmZF9lbGYuICBBZGRlZCBhIHN0cnVjdHVyZSBvZgotIAlzaXplLWRlcGVuZGVudCBidXQgdGFyZ2V0LWluZGVwZW5kZW50IGluZm8gdG8gZWxmY29kZS5oLgotCSogTWFrZWZpbGUuaW46IEJ1aWxkIGVsZmxpbmsuby4gIFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBsaWJlbGYuaDogVXBkYXRlZCBzb21lIGRlY2xhcmF0aW9ucy4gIEFkZGVkIGEgZGVmaW5pdGlvbiBmb3IgdGhlCi0JbmV3IHN0cnVjdHVyZSBpbiBlbGZjb2RlLmguICBBZGRlZCBtb3JlIGZpZWxkcyB0byBlbGYgYmFja2VuZCBkYXRhCi0Jc3RydWN0dXJlLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBzaXplLWRlcGVuZGVudCBpbmZvLgotCSogZWxmMzItKi5jOiBDaGFuZ2VkIHNvbWUgZnVuY3Rpb24gbmFtZXMuICBNb3ZlZCBjb21tb24KLQljcmVhdGVfZHluYW1pY19zZWN0aW9ucyBjb2RlIGZyb20gbTY4aywgc3BhcmMsIGFuZCBpMzg2IHN1cHBvcnQKLQlpbnRvIGVsZmxpbmsuYy4gIERlZmluZSBzb21lIG5ldyBtYWNyb3MgdG8gZmlsbCBpbiBuZXcgZmllbGRzIG9mCi0JYmFjayBlbmQgZGF0YS4gIEFsc28gY2xlYW4gdXAgc29tZSAiZ2NjIC1XYWxsIiB3YXJuaW5ncyByZWdhcmRpbmcKLQl1bnVzZWQgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IE5vLCBkb24ndCBwdXQgZWxmbGluay5vIGhlcmUuCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgaXQgaGVyZSB3aGVuZXZlciBlbGYubyBpcyBzcGVjaWZpZWQuCi0KLVdlZCBKdWwgIDUgMTA6MzE6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX29iamVjdF9wKTogVW5jb25kaXRpb25hbGx5IHNldAotCWVsZl9iYWRfc3ltdGFiLCBzaW5jZSBzb21ldGltZXMgdGhlIHN5bWJvbCB0YWJsZSBpcyBtZXNzZWQgdXAgYW5kCi0JdGhlIGxhc3Qgc3ltYm9sIGlzIGdsb2JhbC4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbCk6IERlY2xhcmUuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbCk6IERlZmluZS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgJGFjX2NvbmZpZ19zdWIsIG5vdCAkY29uZmlnc3ViLgotCSogY29uZmlndXJlOiBMaWtld2lzZS4KLQotCVBlcm1pdCAtLWVuYWJsZS10YXJnZXRzPWllZWU6Ci0JKiBjb25maWcuYmZkICgqLSotaWVlZSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL2llZWUubXQ6IE5ldyBmaWxlLgotCi1XZWQgSnVsICA1IDA0OjE2OjM1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvaTM4NmFpeC5taCAoSERFRklORVMpOiBSZW1vdmUgLURGQVNDSVNUX0ZET1BFTi4KLQotCUF1dG9jb25maXNjYXRpb246Ci0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFN3aXRjaCBmcm9tIEN5Z251cwotCWNvbmZpZ3VyZSB0byBhdXRvY29uZiB3YXlzIG9mIHByb2Nlc3NpbmcgLS1lbmFibGUgYXJndW1lbnRzLAotCXNldHRpbmcgdXAgc3ltbGlua3MsIGluY29ycG9yYXRpbmcgbWFrZWZpbGUgZnJhZ21lbnRzLCBwcmludGluZwotCW1lc3NhZ2VzIGF0IGNvbmZpZ3VyYXRpb24gdGltZSwgc2V0dGluZyB2YXJpYWJsZXMgaW4gTWFrZWZpbGUuCi0JRGVsZXRlZCBzb21lIHVudXNlZCB2YXJpYWJsZXMuICBDaGVjayBmb3IgcmFubGliIHZpYSBhdXRvY29uZi4KLQlGb3Igbm93LCBjb25maWd1cmUgc2NyaXB0IHJlbW92ZXMgZG9jL2NvbmZpZy5zdGF0dXMuCi0JKiBjb25maWd1cmU6IE5ldyBmaWxlLgotCSogZGVwLWluLnNlZDogVXNlIEBTUkNESVJAIGluc3RlYWQgb2YgQHNyY2RpckAsIHNvIE1ha2VmaWxlLmluCi0JbGluZSBkb2Vzbid0IGdldCBicm9rZW4gYnkgY29uZmlndXJlLgotCSogZG9jL2NvbmZpZ3VyZS5pbjogUmVtb3ZlZC4KLQotVHVlIEp1bCAgNCAxMjoyMjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IElmCi0JQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpcyBzZXQsIGxpbWl0IHRoZSBsZW5ndGggb2YgYWxsIGZpbGUgbmFtZXMKLQl0byBhcl9tYXhfbmFtZWxlbi4KLQkoYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lKTogSWYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpcyBzZXQsIGNhbGwKLQliZmRfYnNkX3RydW5jYXRlX2FybmFtZS4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogUmV2ZXJ0IEp1bmUgMSBjaGFuZ2UuCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogQWRkIHByb3ZpZGUKLQlhcmd1bWVudC4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZWVkZWQgZmllbGQuICBSZW1vdmUKLQlzYXdfbmVlZGVkIGZpZWxkLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfZHRfbmVlZGVkX25hbWUKLQlpcyBhbiBlbXB0eSBzdHJpbmcsIGRvbid0IG1ha2UgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIG91dHB1dAotCWZpbGUuICBSZWNvcmQgYWxsIERUX05FRURFRCBlbnRyaWVzIGZvdW5kIGluIGlucHV0IGR5bmFtaWMKLQlvYmplY3RzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3QgY2hlY2sgc2F3X25lZWRlZCB3aGVuIGlzc3VpbmcKLQl3YXJuaW5ncy4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgbmVlZGVkLCBub3QKLQlzYXdfbmVlZGVkLgotCShiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChzdHJ1Y3QgYmZkX2VsZl9saW5rX25lZWRlZF9saXN0KTogRGVmaW5lLgotCShiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEFsc28gaW5pdGlhbGl6ZQotCWZpbmRfYnVmZmVyIGFuZCBmZHJ0YWJfbGVuIGZpZWxkcyBvZiBuZXdseSBhbGxvY2F0ZWQKLQlmaW5kX2xpbmVfaW5mbyBzdHJ1Y3R1cmUuCi0KLU1vbiBKdWwgIDMgMTc6MDM6NTIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IE5ldyBhcmd1bWVudCAic3ltX2RpZmYiLAotCW5vbnplcm8gd2hlbiB3ZSdyZSBnZW5lcmF0aW5nIHJlbG9jYXRpb25zIGZvciBhbiBleHByZXNzaW9uCi0JdXNpbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCUhhbmRsZSBkaWZmZXJlbmNlIG9mIHN5bWJvbHMgZm9yIGJvdGggUl9IUFBBIGFuZCBSX0NPTVBMRVgKLQljYXNlcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCBSX0NPREVfRVhQUgotCWZpeHVwcy4KLQotTW9uIEp1bCAgMyAxMzo1NToxOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh3aW4zMik6IE5ldyBjb25maWd1cmF0aW9uLgotCSogY29uZmlndXJlLmhvc3QgKHBlKTogQ2hhbmdlZCB0byBpMzg2d2luMzIuCi0JKiBjb25maWcvaTM4NnBlLm1oOiBEZWxldGVkLgotCSogY29uZmlnL2kzODZ3aW4zMi5taDogTmV3IGZpbGUuCi0KLU1vbiBKdWwgIDMgMTE6MzA6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSWYgd2UgYWxsb2NhdGUKLQlmaW5kX2xpbmVfaW5mbywgY2xlYXIgdGhlIGZkcnRhYiBmaWVsZC4KLQotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9mbGF2b3VyKTogQWRkIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ciBoZXJlLAotCXJhdGhlciB0aGFuIGluIGJmZC1pbjIuaC4KLQotCSogYmZkLmMgKGVudW0gYmZkX2Vycm9yKTogRGVmaW5lIGJmZF9lcnJvcl9ub19hcm1hcC4KLQkoYmZkX2Vycm1zZ3MpOiBBZGQgc3RyaW5nIGZvciBiZmRfZXJyb3Jfbm9fYXJtYXAuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJZiBhbiBhcmNoaXZlIGhhcyBubwotCWFybWFwLCBzZXQgYmZkX2Vycm9yX25vX2FybWFwIHJhdGhlciB0aGFuIGJmZF9lcnJvcl9ub19zeW1ib2xzLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFBlcm1pdCBjb21tb24gYW5kCi0JaW5kaXJlY3Qgc3ltYm9scyBpbiB3ZWFrZGVmcyBCRkRfQVNTRVJULgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBTaW1wbGlmeQotCUJGRF9BU1NFUlQgdG8gcGVybWl0IHNvbWUgbGVnYWwsIGJ1dCBvZGQsIGNhc2VzLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHZlcnNhZG9zLm8uCi0JKENGSUxFUyk6IEFkZCBwZS1pMzg2LmMsIHBlaS1pMzg2LmMsIGFuZCB2ZXJzYWRvcy5jLgotCi1TdW4gSnVsICAyIDE3OjQ5OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENhc3QgYmFzZV9maWxlCi0JdG8gRklMRSAqIGJlZm9yZSB1c2luZyBpdC4KLQkqIHN0YWItc3ltcy5jOiBSZXZlcnQgeWVzdGVyZGF5J3MgcGF0Y2guCi0KLVNhdCBKdWwgIDEgMTI6MTA6NDIgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHN0YWItc3ltcy5jIChzdGRpby5oKTogIEluY2x1ZGUgcHJpb3IgdG8gbGliYW91dC5oLCB3aGljaAotCWluY2x1ZGVzIGJmZGxpbmsuaCwgd2hpY2ggbm93IHVzZXMgRklMRS4KLQotU2F0IEp1bCAgMSAwMDoxMTowOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZWxmeHgtdGFyZ2V0Lmg6IE5ldyBmaWxlLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgZWxmXzY0X3AgZmllbGQuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmTk5fYmVkKTogRG9uJ3Qgc2V0IGl0LgotCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IERlbGV0ZWQuCi0JKiBNYWtlZmlsZS5pbiAoZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oKTogQnVpbGQgdGhlbSBmcm9tCi0JZWxmeHgtdGFyZ2V0LmguCi0KLUZyaSBKdW4gMzAgMTY6MDc6MTggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENvbXBhcmUKLQl0aGUgZnVsbCB0ZXh0IG9mIC5yZWxvYyBvciAuZWRhdGEgc2VjdGlvbiBuYW1lcy4KLQotRnJpIEp1biAzMCAxNTo0NzozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6Ci0JUmVtb3ZlIGV4dHJhICcrJy4KLQotVGh1IEp1biAyOSAxNzoyNDo1MiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmUuCi0KLVdlZCBKdW4gMjggMTg6MDQ6NDIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IHZlcnNhZG9zLm8gaXMgbm93IGNvbmRpdGlvbmFsbHkgYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDbGVhbiB1cC4gQ2FsY3VsYXRlCi0JZGF0YSBlbnRyaWVzLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6Ci0JLnJlbG9jIGFuZCAuZWRhdGEgc2VjdGlvbnMgYXJlIElNQUdFX0JBU0VEIHRvby4KLQlJZiB0aGVyZSdzIGEgYmFzZV9maWxlIHRoZW4gd3JpdGUgb3V0IGJhc2UgaW5mb3JtYXRpb24uCi0JKiBjb25maWd1cmUuaG9zdCAoaTM4Ni0qLXBlKTogTmV3LgotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IE9ubHkgc2NhbiBwcmVmaXhlcy4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBWZXJzYWRvcyBpcyBub3cgY29uZGl0aW9uYWxseQotCWJ1aWx0LgotCSogY29uZmlnL202OGstY29mZi5tdDogQnVpbGQgdmVyc2Fkb3MubwotCSogaG9zdHMvaTM4NnBlLmg6IE5ldyBmaWxlLgotCi1Nb24gSnVuIDI2IDEzOjUzOjQ5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2xvc2UgY29tbWVudCBiZWZvcmUKLQlSX1BBUklTQ19EUFJFTDIxTCBoYW5kbGluZy4KLQotVGh1IEp1biAyMiAxOToyODozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU3VuIE1heSAgNyAxMTo1Mzo0MSBNRFQgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogY29uZmlnL2kzODYtbW9zcy5tdDogY3JlYXRlZC4KLQotVGh1IEp1biAyMiAwODo1NjoxMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkIGNhc2UgZm9yIC12ZSB3b3Jkcy4KLQotV2VkIEp1biAyMSAxMzoxMzo0OSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB0cnkgdG8gYXBwbHkgYQotCXJlbG9jYXRpb24gYWdhaW5zdCBhbiB1bmRlZmluZWQgc3ltYm9scy4KLQotV2VkIEp1biAyMSAxMDoxNjoxMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB2ZXJzYWRvcy5jOiBTZWNvbmQgcGFzcy9yZXdyaXRlLgotCi1Nb24gSnVuIDE5IDA4OjQwOjQ1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBDb21wYXJlIG9ubHkgdGhlIGZyb250IHBhcnQKLQlvZiBhIHNlY3Rpb24gbmFtZS4KLQotU2F0IEp1biAxNyAwOTo0MDo0NCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBTZXQgdGhlIHNpemUgb2YgdGhlIHN0dWIKLQlzZWN0aW9uIGlmIHdlIGdldCBhbiBlcnJvci4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRG9uJ3QgbWVzcwotCXdpdGggdGhlIG9wZXJhbmRzIG9mIGFuIFJfUEFSSVNDX0RQUkVMMjFMIHJlbG9jYXRpb24gaWYgdGhlIGluc24KLQlpcyBub3QgImFkZGlsIDxzeW1ib2w+LCVyMjciLgotCi1GcmkgSnVuIDE2IDE1OjA0OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlY2xhcmUgYnV0IGRvbid0Ci0JZGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogYmZkLmMgKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlZmluZS4KLQotRnJpIEp1biAxNiAwMDowNzoyNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9saW5rX2xpbmtfcmVsb2NhdGUpOiBVc2UgdGhlIHJpZ2h0Ci0JdHlwZSBmaWVsZCAodGhlcmUgYXJlIHR3byEpIHdoZW4gY2hlY2tpbmcgdG8gc2VlIGlmICRnbG9iYWwkIGlzCi0JZGVmaW5lZC4KLQotVGh1IEp1biAxNSAxNDowMzo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oLCBiZmQtaW4yLmggKGJmZF9ib29sZWFuKTogUmVuYW1lIGJmZF90cnVlLCBiZmRfZmFsc2UKLQl0byBiZmRfdHR0cnVlLCBiZmRfZmZmYWxzZSBzbyBhcyBub3QgdG8gY29uZmxpY3Qgd2l0aCBmdW5jdGlvbnMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFJlbW92ZSB2ZXJzaW9uIHRoYXQgd2FzCi0JaGFja2VkIGZvciBNUFcgQy4KLQkqIG1wdy1jb25maWcuaW46IFNldCBzaGVsbCB2YXJzIGluc3RlYWQgb2YgcGFzdGluZyB0byBtYWtlZmlsZQotCWZvciBlYWNoIGNvbmZpZ3VyYXRpb24sIGVkaXQgY29mZnN3YXAuaCB0byBtYWtlIE1QVyBDIG5vdCBjaG9rZS4KLQkoaTM4Ni11bmtub3duLWNvZmYsIHNoLWhpdGFjaGktaG1zKTogUmVjb2duaXplLgotCSogbXB3LW1ha2UuaW4gKEJGRF9MSUJTKTogQWRkIHZlcnNhZG9zLmMuby4KLQotCSogdmVyc2Fkb3MuYyAodmVyc2Fkb3Nfc2Nhbik6IFByb3Blcmx5IGNhc3QgcmVzdWx0cyBmcm9tIGJmZF9hbGxvYy4KLQotV2VkIEp1biAxNCAxNToyNzozMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzKTogTmV3IGZ1bmN0aW9uCi0JcmVhZHMgYW5kIGhhbmRsZXMgLmRyZWN0dmUgc2VjdGlvbnMgZm9yIFBFLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2FsbCBuZXcgZnVuY3Rpb24gaWYgUEUuCi0KLU1vbiBKdW4gMTIgMTI6MDk6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC1pbi5oIChiZmRfc2V0X3NlY3Rpb25fdm1hKTogQ2FzZSB0cnVlIHRvIGEgYm9vbGVhbi4KLQkoYmZkX3NldF9jYWNoZWFibGUpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIEp1biAgOSAxMjoyMDoyOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BydGwuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogUmV3cml0ZSB0byBiZSBzeW1tZXRyaWNhbC4KLQotRnJpIEp1biAgOSAxMjo0OTowMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogdGFyZ2V0cy5jOiBBZGQgY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIGFuZCBsaW5rX3NwbGl0X3NlY3Rpb24KLQl0byB0aGUgdGFyZ2V0IHZlY3Rvci4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IERlZmluZS4KLQkoX2JmZF9ub2xpbmtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24pOiBEZWNsYXJlLgotCSogc3ltcy5jIChiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogRGVmaW5lLgotCSogbGlua2VyLmMgKGJmX2xpbmtfc3BsaXRfc2VjdGlvbik6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTmV3IGZ1bmN0aW9uCi0JKHNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBBbGwgb3RoZXIgdGFyZ2V0cyB1cGRhdGVkIHdpdGggZGVmYXVsdCB2ZXJzaW9ucyBvZiBuZXcgcm91dGluZXMuCi0KLQkqIFRha2Ugb3V0IG15IGJyYWluZGFtYWdlZCBiZmRfdHJ1ZS9iZmRfZmFsc2UgY2hhbmdlcyBmcm9tIGVhcmxpZXIKLQl0b2RheS4gIFJlcGxhY2Ugd2l0aCBqdXN0OgotCSogYmZkLWluLmg6IChUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRCk6IERlZmluZSB0aGlzIGlmCi0JY29tcGlsaW5nIHdpdGggZysrLTIuNiBvciBsYXRlci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIEp1biAgOSAwNzo1NDoyOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB2ZXJzYWRvcy5jIChzdHJ1Y3QgZXNkLCBnZXRfNCk6IExpbnQ7IHVzZSB1bnNpZ25lZCBjaGFycy4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6ICBDb21wYXJlIG91dHB1dCBzZWN0aW9uIG5hbWVzCi0Jd2hlbiBjb252ZXJ0aW5nIGZvciB2eHdvcmtzLgotCi1XZWQgSnVuICA3IDE5OjAxOjMwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBQZXJtaXQgLnNjb21tb24gb3IgQ09NTU9OCi0Jc2VjdGlvbnMgYXMgcmFuZG9tIFNIVF9OT0JJVFMgc2VjdGlvbnMsIGluIGNhc2UgYSBsaW5rZXIgc2NyaXB0IGlzCi0Jc3RyYW5nZS4KLQotVHVlIEp1biAgNiAxNzoyOTozMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogTW92ZWQgZnJvbSBwZS5oCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogR2V0IFBFIHJlbG9jcyByaWdodC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3QpOiBTZXQgcGUgdGRhdGEgYml0IHdoZW4gdXNpbmcgUEUuCi0JKiBjb2ZmbGluay5jIChDT0ZGX1dJVEhfUEUgY29kZSk6IFRlc3Qgb24gb2JqX3BlIGJpdCByYXRoZXIKLQl0aGFuIGNvbmRpdGlvbmFsIGNvbXBpbGUuCi0JKiBjb25maWd1cmUuaW46IEZpeCBQRSBkZXBlbmRlbmNpZXMuCi0JKiBsaWJjb2ZmLWluLmggKG9ial9wZSk6IE5ldy4KLQkoY29mZl90ZGF0YSk6IEFkZGVkIHBlIGVudHJ5LgotCSogbGliY29mZi5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIEp1biAgNSAwOTowNzoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX2FkanVzdF9zeW1uZHgpOiBDb21wbGV0ZWx5IHBhcmVudGhlc2l6ZQotCW1hY3JvLgotCi1Nb24gSnVuICA1IDAyOjE1OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCUxpbmtlciBzdXBwb3J0IGZvciBtNjhrLWVsZiBmcm9tIEFuZHJlYXMgU2Nod2FiCi0JPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46Ci0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENoZWNrIGZvciBOVUxMIHdoZW4KLQlsb29waW5nIHRocm91Z2ggdGhlIHN5bWJvbCBoYXNoZXMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFdoZW4gbG9va2luZyBmb3IgX2luaXQgYW5kIF9maW5pIGRvbid0IHVzZQotCXRoZSBzeW1ib2wgaWYgaXQgaXMgaW1wb3J0ZWQgZnJvbSBhbm90aGVyIG9iamVjdC4KLQkqIGVsZjMyLW02OGsuYzogUmVsb2NhdGlvbiB0eXBlIGNoYW5nZWQgZnJvbSBSRUwgdG8gUkVMQS4gIFJlZ3VsYXIKLQlhbmQgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQgZnVuY3Rpb25zIGFkZGVkLCBzaW1pbGFyIHRvIG90aGVyIGVsZgotCXRhcmdldHMuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZ251Kik6IFVzZSBFTEYgY29uZmlndXJhdGlvbi4KLQotRnJpIEp1biAgMiAxODo1NDo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB2ZXJzYWRvcy5jOiBOZXcgZmlsZS4KLQkqIGJmZC1pbjIuaCAoc3RydWN0IF9iZmQpOiBOZXcgZmllbGQuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBOZXcgZmllbGQuCi0JKiBjb25maWd1cmUuaW4gKHZlcnNhZG9zX3ZlYyk6IE5ldyBmaWVsZC4KLQkqIHRhcmdldHMuYyAoYmZkX2ZsYXZvcik6IEFkZGVkIHZlcnNhZG9zLgotCi1UaHUgSnVuICAxIDEzOjUxOjQ5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzLCBzdHlwX3RvX3NlY19mbGFncywgCi0JY29mZl9uZXdfc2VjdGlvbl9ob29rKTogIEFueSBzZWN0aW9uIHRoYXQgc3RhcnRzICIuc3RhYiIKLQlpcyBub3cgbWFya2VkIGFzIGRlYnVnZ2luZy4KLQotVGh1IEp1biAgMSAxNjoxNToxNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IERpc2FibGUgZXh0ZW5kZWQgbmFtZQotCXRhYmxlIHVudGlsIGl0IGNhbiBiZSBtYWRlIG9wdGlvbmFsLCBzbyB0aGF0IG5hdGl2ZSBBUiBoYXMgaGFsZiBhCi0JY2hhbmNlIG9uIFN1bk9TIGFuZCBIUC9VWC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzLCBjYXNlCi0JYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk6IEFkZCBjYXN0IHRvIGNvcnJlY3QgcG9pbnRlciB0eXBlcy4KLQotU2F0IE1heSAyNyAyMTozNzozMSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKG02OGstYnVsbC1zeXN2Kik6IEFkZGVkIHN0cmlwX3VuZGVyc2NvcmU9eWVzLgotCSAgKG02OGstZXN0LWNvZmYpOiBSZW1vdmVkLiAgdGFyZ2V0IGRvZXMgbm90IGVmZmVjdCBvYmplY3QgZm9ybWF0LgotCi1XZWQgTWF5IDI0IDEwOjUyOjAxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IENvcGUgd2l0aAotCWluZGlyZWN0IHN5bWJvbHMuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEdpdmUgZXJyb3IKLQltZXNzYWdlIHdoZW4gbGlua2luZyB0byBhIHNoYXJlZCByZWxvYyB3aGljaCBpc24ndCB0aGVyZS4KLQotV2VkIE1heSAyNCAxMDo0MDowMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgQVJNLVBFLgotCi0JKiBNYWtlZmlsZS5pbiwgY29mZmNvZGUuaCwgY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBwZS1hcm0uYywKLQkgcGVpLWFybS5jLCBjb2ZmLWFybS5jLCByZWxvYy5jLCB0YXJnZXRzLmMsIGNvbmZpZy9hcm0tcGUubXQ6Ci0JIFN1cHBvcnQgZm9yIEFSTSBDT0ZGL1BFLgotCi1UdWUgTWF5IDIzIDE5OjI0OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTm93IGEgZnVuY3Rpb24sCi0JdHJpZXMgY2FsbGluZyByb3V0aW5lIGZyb20gaW5wdXQgYmZkIHRhcmdldCB2ZWN0b3IgZm9yCi0JYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIuICBQdXQgYSBkZWNsYXJhdGlvbiBpbnRvIHRoZSBoZWFkZXIgZmlsZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1taXBzLmMgKGdwcmVsMTZfd2l0aF9ncCk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20KLQltaXBzX2VsZl9ncHJlbDE2X3JlbG9jLgotCShtaXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogQ2FsbCBpdC4gIElmIG91dHB1dCBiZmQgdGFyZ2V0IHZlY3RvcgotCWlzbid0IGVsZiBmbGF2b3VyZWQsIGFib3J0LCBzaW5jZSBpdCdzIGFzc3VtZWQgdG8gYmUgZWxmIGluIHNvbWUKLQlvZiB0aGlzIGNvZGUsIGluY2x1ZGluZyB0aGUgY29kZSB0aGF0IGxvb2tzIHVwIHRoZSBncCB2YWx1ZS4KLQkoZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24sCi0JbW9kaWZpZWQgZnJvbSBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgdG8gZGVhbAotCXdpdGggcGFzc2luZyBncCB0byBncHJlbDE2X3dpdGhfZ3AuCi0JKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IG1hY3JvLgotCSogZWxmMzItdGFyZ2V0LmggKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCi1UdWUgTWF5IDIzIDE1OjU4OjE1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbjogSW5zdGFsbCBiZmRsaW5rLmggdG9vLgotCi1TdW4gTWF5IDIxIDIyOjI1OjA5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSB1bmRlZmluZWQgYW5kCi0Jbm90c3VwcG9ydGVkIHJldHVybiBjb2RlcyBmcm9tIGZpbmFsX2xpbmtfcmVsb2NhdGUgKHVzZWQgd2hlbgotCSRnbG9iYWwkIGlzIHVuZGVmaW5lZCBvciBub25leGlzdGFudCkuCi0JKGVsZjMyX2hwcGFfYmZkX2xpbmtfbGlua19yZWxvY2F0ZSk6IElmICRnbG9iYWwkIGV4aXN0cywgYnV0IGlzCi0Jbm90IGRlZmluZWQsdGhlbiByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZC4KLQotRnJpIE1heSAxOSAxMDowMDoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaDogKElNQUdFX0JBU0UpOiBEZWZpbmUgdG8gMCBpZiBub3QuCi0KLVRodSBNYXkgMTggMDQ6MjQ6MDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RhbmRhcmQpOiBJZiBkZWZpbmVkLCBjYWxsCi0JTVlfcmVsb2NhdGFibGVfcmVsb2MgYmVmb3JlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLgotCi0JKiBhb3V0LWFybS5jOiAoV1JJVEVfSEVBREVSUyk6IERlbGV0ZS4KLQkoTkFNRSk6IERlZmluZSB2ZXJzaW9uIHRvIG92ZXJyaWRlIGRlZmF1bHQgaW4gYW91dHguaAotCShNWShob3d0b190YWJsZSkpOiBSZWZvcm1hdC4gIEFsdGVyIHNvbWUgZW50cmllcyBzbGlnaHRseS4KLQkoUkVMT0NfQVJNX0JJVFNfTkVHX3tCSUcsTElUVExFfSk6IERlZmluZS4KLQkoTVkocmVsb2NfaG93dG8pLCBNWShwdXRfcmVsb2MpLCBNWShyZWxvY2F0YWJsZV9yZWxvYykpOiBOZXcgZnVuY3Rpb25zLgotCShNWV9yZWxvY19ob3d0bywgTVlfcHV0X3JlbG9jLCBNWV9yZWxvY2F0YWJsZV9yZWxvYyk6IERlZmluZS4KLQkoTVkoZml4X3BjcmVsXzI2KSk6IFJlbmFtZWQgZnJvbSBhb3V0YXJtX2ZpeF9wY3JlbF8yNiwgcmV0dXJuCi0JYmZkX3JlbG9jX29rIG5vdCBiZmRfcmVsb2NfY29udGludWUuCi0JKE1ZKGZpeF9wY3JlbF8yNl9kb25lKSk6IExpa2V3aXNlLgotCShNWShiZmRfcmVsb2NfdHlwZV9sb29rdXApKTogUmVuYW1lZCBmcm9tIGFvdXRhcm1fcmVsb2NfdHlwZV9sb29rdXAuCi0JKE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBNWV9iZmRfbGlua19hZGRfc3ltYm9scywKLQlNWV9iZmRfZmluYWxfbGluayk6IERlbGV0ZS4KLQkoTVlfc3dhcF9zdGRfcmVsb2NfaW4sIE1ZX3N3YXBfc3RkX3JlbG9jX291dCwgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMpOgotCURlZmluZS4KLQkoYW91dHguaCk6IEluY2x1ZGUgaXQuCi0JKE1ZKHN3YXBfc3RkX3JlbG9jX3tpbixvdXR9KSk6IE5ldyBmdW5jdGlvbnMuCi0JVXNlIFJFTE9DX0FSTV9CSVRTX05FR197QklHLExJVFRMRX0gdG8gZXh0cmFjdCBuZWdhdGl2ZSByZWxvYyBiaXQuCi0JKGFvdXRhcm1fc3F1aXJ0X291dF9yZWxvY3MpOiBEZWxldGUuCi0gCi0JRnJvbTogRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQkqIGNvbmZpZy9hcm1bbGJdLWFvdXQubXQ6IE5ldyBmaWxlcy4KLQkqIGFvdXQtYXJtLmM6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZDogSGFuZGxlIGFybXssZVtsYl19LSotYW91dAotCSogY29uZmlndXJlLmluOiBBZGQgdmV0b3IgZm9yIGFvdXRfYXJtX3tiaWcsbGl0dGxlfV92ZWMuCi0JKiByZWxvYy5jOiBOZXcgcmVsb2NhdGlvbiB0eXBlcyBmb3IgdGhlIEFSTS4KLQkqIHRhcmdldHMuYyAoYW91dF9hcm1fe2JpZyxsaXR0bGV9X3ZlYyk6IGRlY2xhcmUuCi0KLVR1ZSBNYXkgMTYgMTA6Mjk6NTEgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfc3RhdCk6IElmIGJmZF9jYWNoZV9sb29rdXAgcmV0dXJucyBhbiBlcnJvciwKLQlyZXR1cm4gYW4gZXJyb3IgdG8gdGhlIGNhbGxlci4gIENhbGwgYmZkX3NldF9lcnJvciBvbiBlcnJvcnMuCi0KLVR1ZSBNYXkgMTYgMTQ6NDQ6NDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBNb2RpZmllZCBwcm90b3R5cGVzIGluCi0JYWNjb3JkYW5jZSB3aXRoIDExIE1heSBsaWJjb2ZmLmggY2hhbmdlLgotCi1UaHUgTWF5IDExIDE2OjQzOjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQl0ZWtoZXguYyAoZmlyc3RfcGhhc2UpOiBVbmRlcnN0YW5kIHR5cGUgMCBzeW1ib2xzLgotCSh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRml4IHR5cG8gaW4gZmluYWwgcmVjb3JkLgotCi1UaHUgTWF5IDExIDE2OjQzOjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChvcHRjYWxsX2NhbGxiYWNrKTogZG9uJ3QgdHJ5IGFuZCBvcHRpbWl6ZQotCXVuZGVmaW5lZCByZWZzLiAKLQkoY29mZl93cml0ZV9yZWxvY3MpOiBTZWFyY2ggZm9yIGJyb2tlbiByZWxvY3Mgb24gdGhlIHdheQotCW91dCBhbmQgZml4IHRoZW0gdXAuCi0JKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IENhbGN1bGF0ZSBhbmQgcmV0dXJuIGluZGV4IG9mCi0JZmlyc3QgdW5kZWZpbmVkIHN5bWJvbC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGNvZmZfcmVudW1iZXJfc3ltYm9scyAKLQlhbmQgY29mZl93cml0ZV9yZWxvY3Mgd2l0aCB0aGUgbmV3IGFyZ3MuCi0JKiBsaWJjb2ZmLmg6IChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMsIGNvZmZfcmVudW1iZXJfc3ltYm9scyk6Ci0JTW9kaWZpZWQgcHJvdG90eXBlcy4KLQotVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCQkJICBUb20gR3JpZXN0IDxncmllc3RAY3MueWFsZS5lZHU+Ci0KLQlJbml0aWFsIHN1cHBvcnQgZm9yIFBFIGZvcm1hdC4gCi0JCi0JKiBNYWtlZmlsZS5pbiwgdGFyZ2V0cy5jLCBjb25maWd1cmUuaW4sIGNvbmZpZy5iZmQ6Ci0JQWRkIHN1cHBvcnQgZm9yIGkzODYtKi13aW5udCBhbmQgaTM4Ni0qLXBlLgotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogIFVuZGVyc3RhbmQgTlRQRSBmb3JtYXQKLQlhcmNoaXZlcy4KLQkoX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogVHVybiBcIGluIGEgZmlsZW5hbWUKLQlpbnRvIC8uCi0JKiBiZmQtaW4uaCAoYmZkX2xpbmtfc3Vic3lzdGVtLCBfYmZkX2xpbmtfc3RhY2tfaGVhcCk6IE5ldy4KLQkqIGNvZmYtaTM4Ni5jICAoaG93dG9fdGFibGUpOiBDb25kaXRpb25hbGl6ZSBQQ1JFTE9GRlNFVC4KLQkqIGNvZmZjb2RlLmggKElNQUdFX0JBU0UpOiBOZXcuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVGhyb3cgYXdheSAuanVuawotCXNlY3Rpb25zIGZvciBQRSwgYWxpZ24gc3ltYm9scy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBUaHJvdyBhd2F5IC5qdW5rIHNlY3Rpb25zCi0JZm9yIFBFLiBSZW1lbWJlciBpbmZvIG9uIC5pZGF0YSBhbmQgLnJzcmMgc2VjdGlvbnMuCi0JRmlsbCBpbiB0aGUgUEUgaGVhZGVyLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFBFIHVzZXMgQ19TRUNUSU9OIGNsYXNzLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBLZWVwIFBFIGluZm8gdXAgdG8gZGF0ZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENvcGUgd2l0aCBQRSByZWxvY3MuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfe2FvdXQvZmlsZS9zY24vc3ltfWhkcl97aW4vb3V0fSk6IAotCU5ldyBjb2RlIGZvciBQRSBoZWFkZXJzLgotCi1UdWUgTWF5ICA5IDE3OjAxOjM4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBEaXR0by4KLQkqIHRhcmdldHMuYzogRGl0dG8uCi0JKiBjb25maWcvcHBjbGUtZWxmLm10OiBOZXcgZmlsZSwgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQwotCXN1cHBvcnQuCi0JKiBjb25maWcvcHBjLWVsZi5tdDogQWRkIGxpdHRsZSBlbmRpYW4gcG93ZXJwYyB0byB0aGUgQkZECi0Jc2VsZWN0aW9uIHZlY3RvcnMuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ29tcGxhaW4gaWYKLQlsaW5raW5nIGEgZGlmZmVyZW50IGVuZGlhbiBvYmplY3QgdGhhbiB3ZSBleHBlY3QuCi0JKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfTElUVExFX05BTUUpOiBEZWZpbmUsIHRvIHByb3ZpZGUgbGl0dGxlCi0JZW5kaWFuIHN1cHBvcnQuCi0KLVR1ZSBNYXkgIDIgMTY6MzI6MjQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqLSotbGl0ZXMqKTogVHJlYXQganVzdCBsaWtlIGhwcGEqLSotKmVsZiouCi0KLVR1ZSBBcHIgMjUgMTk6Mzg6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBJbml0aWFsaXplIGxtYSBzYW1lIGFzCi0Jdm1hLgotCi1UdWUgQXByIDI1IDExOjAzOjIxIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiAjaW5jbHVkZSBhbnNpZGVjbC5oICdjYXVzZSBQVFIgaXMgdXNlZCBpbgotCXN0ZC1ob3N0LmguCi0KLU1vbiBBcHIgMjQgMjM6NTY6NDQgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZsaW51eC5oIChIQVZFX1BST0NGUyk6IERvbid0IGRlZmluZSBpdC4gIEFkZGVkIGxlbmd0aHkKLQljb21tZW50IGV4cGxhaW5pbmcgd2h5LgotCi1Nb24gQXByIDI0IDEwOjM0OjAyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBJZiBOT19QUk9DRlMgaXMgZGVmaW5lZCwgZG9uJ3QKLQlkZWZpbmUgSEFWRV9QUk9DRlMuCi0KLU1vbiBBcHIgMjQgMDg6MzM6MTIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgY29udGludWUKLQlwcm9jZXNzaW5nIHVua25vd24gc3ltYm9scyB0byBwcmV2ZW50IGEgY2FzY2FkZSBvZiBlcnJvcnMuCi0KLUZyaSBBcHIgMjEgMTI6NDg6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVBhdGNoZXMgZnJvbSBILkouIEx1IGZvciBMaW51eCBFTEYgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBlbGZjb2RlLmggKGVsZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApIFtIQVZFX1BST0NGU106Ci0JVXNlIHBycHNpbmZvX3QgaW5zdGVhZCBvZiBzdHJ1Y3QgcHJwc2luZm8sIGZvciBjb25zaXN0ZW5jeS4KLQkqIGhvc3RzL2kzODZsaW51eC5oIChIQVZFX1BST0NGUyk6IERlZmluZS4KLQotVGh1IEFwciAyMCAwOTowNzozOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBEbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBhIHVuZGVmaW5lZAotCXN0cm9uZyBzeW1ib2wgYXBwZWFycyBhZnRlciBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0KLUZyaSBBcHIgMTQgMTY6NTE6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvIHJlbG9jYXRlCi0JYSB3aG9sZSBzZWN0aW9uIGZvciB0aGUgbGlua2VyLCBieXBhc3NpbmcgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbiB0byBtYXAgdGhlIEJGRAotCWVudW1lcmF0aW9uIGNvZGUgaW50byBhIGhvd3RvIHN0cnVjdHVyZS4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBSZW5hbWUgZnJvbSBwcGNfZWxmX2hvd3RvX3RhYmxlLgotCShwcGNfZWxmX2hvd3RvX3RhYmxlKTogTmV3IGFycmF5IHRoYXQgbWFwcyBQb3dlclBDIHJlbG9jYXRpb24KLQludW1iZXJzIHRvIGhvd3RvIHN0cnVjdHVyZXMgd2l0aG91dCBhIGxpbmVhciBzZWFyY2guICBDaGFuZ2UgZnJvbQotCXVzaW5nIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyB0byB1c2UgcHBjX2VsZl9zdGRfcmVsb2MuCi0JKHBwY19lbGZfaG93dG9faW5pdCk6IEluaXRpYWxpemUgcHBjX2VsZl9ob3d0b190YWJsZSBmcm9tCi0JcHBjX2VsZl9ob3d0b19yYXcuCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBVc2UgYSBjYXNlIHN0YXRlbWVudCBpbnN0ZWFkIG9mIGEKLQlsb29wLgotCShwcGNfZWxmX3N0ZF9yZWxvYyk6IFJlcGxhY2VtZW50IGZvciBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCi0JKHBwY19lbGZfdW5zdXBwb3J0ZWRfcmVsb2MpOiBQcmludCBhIHJlYWwgZXJyb3IgbWVzc2FnZSwgaW5zdGVhZAotCW9mIGNhbGxpbmcgYWJvcnQuCi0JKHBwY19lbGZfYWRkcjE2X2hhX2lubmVyKTogQWJzdHJhY3QgZ2V0dGluZyBhZGp1c3RtZW50IGZyb20KLQlwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgc28gcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbiB1c2UgaXQKLQl0b28uCi0JKHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jKTogQ2FsbCBpdC4KLQkocHBjX2VsZl9nb3QxNl9pbm5lcik6IEFic3RyYWN0IGdldHRpbmcgYWRqdXN0bWVudCBmcm9tCi0JcHBjX2VsZl9nb3QxNl9yZWxvYywgc28gcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbiB1c2UgaXQgdG9vLgotCShwcGNfZWxmX2dvdDE2X3JlbG9jKTogQ2FsbCBpdC4KLQkocHBjX2VsZl9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20gcG93ZXJwY19pbmZvX3RvX2hvd3RvLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogT21pdCBzcGFjZSBpbiBkZWJ1Z2dpbmcKLQlvdXRwdXQuCi0JKGVsZl9zeW1ib2xfZmxhZ3MpOiBBZGQgZGVidWcgZnVuY3Rpb24gdG8gZGVjb2RlIGZsYWdzIHNvIHRoYXQKLQlkZWZpbmluZyBERUJVRyB0byBiZSA0IHdpbGwgY29tcGlsZSBhZ2Fpbi4KLQkoZWxmX2RlYnVnX3NlY3Rpb24pOiBGaXggdHlwbyBpbiBkZWJ1ZyBvdXRwdXQuCi0KLUZyaSBBcHIgMTQgMTY6MDM6MDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIG02OCotKi1lbGYqLgotCSogZWxmMzItbTY4ay5jOiBGaWxsZWQgb3V0IGltcGxlbWVudGF0aW9uLCBleGNlcHQgZm9yIGR5bmFtaWMKLQlsaW5raW5nIHN1cHBvcnQuCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZCAqX0dPVF9QQ1JFTCwgKl9HT1RPRkYsCi0JKl9QTFRfUENSRUwsICpfUExUT0ZGLCAqXzY4S18qIHJlbG9jYXRpb25zIGZvciBFTEYuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IEFwciAxMyAxNDoyODowNCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KLQotCSogY29mZi1tNjhrLmMgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik6IENoYW5nZSBmcm9tCi0JMSB0byAyLgotCShiZmRfdGFyZ2V0KTogQ2hhbmdlIG1pbmltdW0gc2VjdGlvbiBhbGlnbm1lbnQgZnJvbSAxIHRvIDIuCi0KLVdlZCBBcHIgMTIgMTI6NDA6MDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAobWFjaGluZV90eXBlLCBjYXNlIGJmZF9hcmNoX21pcHMpOiBUcmVhdCBSODAwMCBsaWtlCi0JUjYwMDAgYW5kIFI0MDAwIGZvciBub3cuCi0KLVR1ZSBBcHIgIDQgMTI6Mjg6MjUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KLQkqIGhvc3RzL21wdy5oOiBOZXcgZmlsZSwgTVBXIGhvc3QgZGVmaW5pdGlvbnMuCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4sIGVjb2ZmX3N3YXBfcGRyX2luKSBbTVBXX0NdOgotCUFsdGVybmF0ZSB2ZXJzaW9ucyB3aXRob3V0IEVDT0ZGXzY0IHRoYXQgY2hva2VzIE1QVyBDLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBBZGQgYWx0ZXJuYXRpdmUgdmVyc2lvbiB3aXRoCi0JcGFydGx5LWV4cGFuZGVkIG1hY3Jvcy4KLQotVGh1IE1hciAzMCAxNDo1NjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yCi0Jb3ZlcmZsb3cgaWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuCi0KLVRodSBNYXIgMzAgMTQ6MzI6MjYgMTk5NSAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBjb25maWcuYmZkOiBDaGFuZ2UgbGludXggdG8gZGVmYXVsdCB0byBlbGYuICBVc2luZwotCWlbMzQ1XTg2LSotbGludXhhb3V0IHdpbGwgYnVpbGQgYSBsaWJyYXJ5IHdoaWNoIGRlZmF1bHRzIHRvIGEub3V0LgotCSogY29uZmlnL2kzODYtbGFvdXQubXQ6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcvaTM4Ni1saW51eC5tdC4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGVsZi5tdC4KLQlDb21tZW50IG91dCBFWFRSQUxJQlMuCi0JKiBjb25maWcvaTM4Ni1sZWxmLm10OiBSZW1vdmUuCi0KLVdlZCBNYXIgMjkgMTI6MDE6MzAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogQ2FjaGUgdGhlIHNlY3Rpb24gc3ltYm9sIGluCi0JdGhlIHVzZWRfYnlfYmZkIGZpZWxkIG9mIHRoZSBzZWN0aW9uLCB0byBhdm9pZCBsb29waW5nIGZvciBlYWNoCi0JcmVsb2MuCi0KLQkqIGNwdS1oODUwMC5jIChhcmNoX2luZm9fc3RydWN0KTogQ2hhbmdlIG5hbWUgZnJvbSAiSDgvMzAwIiB0bwotCSJoODMwMCIgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgY3B1LSogZmlsZXMuCi0KLVR1ZSBNYXIgMjggMTU6MTQ6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IEhhbmRsZSBTRUNfQ09OU1RSVUNUT1IKLQlzZWN0aW9ucy4KLQkoYl9vdXRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogU2tpcCBjb25zdHJ1Y3RvcgotCXN5bWJvbHMgd2hpY2ggdGhlIG1haW4gbGlua2VyIGNvZGUgZGlkIG5vdCBkbyBhbnl0aGluZyB3aXRoLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IFVzZSB1ZGF0YS5wIGlmIGl0IGlzIHNldCwKLQlyYXRoZXIgdGhhbiBsb29raW5nIHRoZSBzeW1ib2wgdXAgaW4gdGhlIGhhc2ggdGFibGUuICBKdXN0IHBhc3MKLQl0aHJvdWdoIGNvbnN0cnVjdG9yIHN5bWJvbHMgZm9yIHdoaWNoIHVkYXRhLnAgaXMgbm90IHNldC4gIElmIHRoZQotCWxpbmtlciBkZWZpbmVkIHRoZSBzeW1ib2wsIGNsZWFyIHRoZSBjb25zdHJ1Y3RvciBmbGFnLgotCi1UdWUgTWFyIDIxIDEwOjUwOjMyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvKTogU2lnbiBleHRlbmQgY29uc3RhbnRzIGZyb20KLQlSX0RBVEFfT1ZFUlJJREUgZml4dXBzLgotCSogbGliaHBwYS5oIChzaWduX2V4dGVuZCk6IFJlbmFtZWQgZnJvbSBzaWduX2V4dC4gIEZpeC4KLQkobG93X3NpZ25fZXh0ZW5kKTogTGlrZXdpc2UuCi0KLU1vbiBNYXIgMjAgMjI6Mzk6MTAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogVGlnaHRlbiB0ZXN0IHRvIGRldGVybWluZQotCXdoYXQgc3ltYm9scyBhcmUgc2VjdGlvbiBzeW1ib2xzLgotCi1TYXQgTWFyIDE4IDAxOjU0OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBBbiBlbXB0eSBhcmNoaXZlIGlzIE9LLgotCi1GcmkgTWFyIDE3IDE2OjI5OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogSnVzdCByZXR1cm4gdHJ1ZSB3aGVuCi0JZWl0aGVyIHRoZSBpbnB1dCBvciBvdXRwdXQgc2VjdGlvbiBpc24ndCBhdHRhY2hlZCB0byBhIFNPTSBCRkQuCi0JKHNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogU2ltaWxhcmx5IGZvciBCRkQgcHJpdmF0ZSBkYXRhLgotCi1GcmkgTWFyIDE3IDExOjUwOjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGVjayB3aGV0aGVyIGEgZHluYW1pYwotCW9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLCBhbmQgaWdub3JlIGl0IHRoZSBzZWNvbmQgdGltZS4KLQotV2VkIE1hciAxNSAxMTo1Njo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IENoYW5nZSBSX1NQQVJDX0dPVDEzIGZyb20KLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCB0byBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfX3dyaXRlX3JlbG9jcyk6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9lbGY2NF9fd3JpdGVfcmVsb2NzKTogRG9uJ3QgZGVjbGFyZS4KLQotVHVlIE1hciAxNCAwNTo1NDozMyAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogc3RhYi1zeW1zLmMgKGFvdXRfc3RhYl9uYW1lKTogTW92ZWQgYW91dF9zdGFiX25hbWVzIHRvIGJlIGxvY2FsCi0JdG8gdGhpcyBmdW5jdGlvbi4gIFJlY29kZWQgZnVuY3Rpb24gdG8gc3RvcCB1c2luZyB0YWJsZSwgdG8KLQlpbXByb3ZlIHBlcmZvcm1hbmNlIChvbiBpNDg2LW5ldGJzZCBob3N0KS4gIExlZnQgb2xkIHZlcnNpb24KLQlpbnRhY3QgdW5kZXIgIiNpZiAwIiBmb3IgZnVydGhlciBwZXJmb3JtYW5jZSB0ZXN0aW5nLgotCi1Nb24gTWFyIDEzIDEzOjQ4OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBNYWtlIHN0YXRpYy4gIFVzZSBQVFIgYXJndW1lbnQgYXMgYQotCXBvaW50ZXIgdG8gYSBib29sZWFuIHZhcmlhYmxlIHNldCB0byB0cnVlIGlmIHNvbWV0aGluZyBmYWlscy4KLQlDYXN0IHRvIFBUUiByYXRoZXIgdGhhbiB2b2lkICouCi0JKHN5bV9pc19nbG9iYWwpOiBSZXdyaXRlIGZvciBjbGFyaXR5LgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IElmIHRoZSBwcm9ncmFtIGhlYWRlciBzaXplIGlzIHRvbyBzbWFsbCwKLQljYWxsIF9iZmRfZXJyb3JfaGFuZGxlciBhbmQgcmV0dXJuIGZhaWx1cmUgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogUGFzcyBib29sZWFuIHZhcmlhYmxlIHdoZW4KLQljYWxsaW5nIHdyaXRlX3JlbG9jcy4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhYm9ydC4KLQkoc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCk6IERlZmluZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEZWNsYXJlIHZhcmlhYmxlcyBpbiBpbm5lcgotCWJsb2Nrcy4gIFBhc3MgZWxmX2luZm9fZmFpbGVkIHN0cnVjdHVyZSB3aGVuIGNhbGxpbmcKLQllbGZfZXhwb3J0X3N5bWJvbCBhbmQgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4KLQkoZWxmX2V4cG9ydF9zeW1ib2wpOiBUcmVhdCBkYXRhIGFyZ3VtZW50IGFzIGVsZl9pbmZvX2ZhaWxlZCByYXRoZXIKLQl0aGFuIGJmZF9saW5rX2luZm8uICBTZXQgZmFpbGVkIGZpZWxkIG9uIGVycm9yLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBlbGZfZmluZm9fZmFpbGVkKTogRGVmaW5lLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBQYXNzIGVsZl9maW5mb19mYWlsZWQgc3RydWN0dXJlIHdoZW4gY2FsbGluZwotCWVsZl9saW5rX291dHB1dF9leHRzeW0uICBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhYm9ydC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFRyZWF0IGRhdGEgYXJndW1lbnQgYXMgZWxmX2ZpbmZvX2ZhaWxlZAotCXJhdGhlciB0aGFuIGVsZl9maW5hbF9saW5rX2luZm8uICBTZXQgZmFpbGVkIGZpZWxkIG9uIGVycm9yLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhYm9ydC4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSB3cml0ZQotCW91dCBQTFRSRUxTWiwgUExUUkVMIGFuZCBKTVBSRUwgcmVsb2NzIGlmIHRoZXJlIGlzIGEgLnJlbGEucGx0Ci0Jc2VjdGlvbi4gIFNvbGFyaXMgMi40IGFwcGFyZW50bHkgZG9lcyBub3QgaGFuZGxlIGVtcHR5IHJlbG9jCi0JaW5mb3JtYXRpb24gY29ycmVjdGx5LgotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6IENhc3QgZ2V0dWlkIGFuZCBnZXRnaWQgcmVzdWx0cyB0bwotCWxvbmcsIGFuZCBwcmludCB3aXRoICVsZC4KLQotRnJpIE1hciAxMCAxNjo0MTowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogQWx3YXlzIHVzZSB0aGUgb3V0cHV0Ci0Jc2VjdGlvbiBpZiBpdCBpcyBub3QgTlVMTC4KLQotVGh1IE1hciAgOSAxNTowNjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogSWYgdGhlIGxpbmUgbnVtYmVyIGNvdW50IG9yCi0JdGhlIHJlbG9jIGNvdW50IGRvZXMgbm90IGZpdCwgcHJpbnQgYW4gZXJyb3IgYW5kIHJldHVybiAwLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQljb2ZmX3N3YXBfc2NuaGRyX291dC4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlCi0Jb2YgYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0LgotCi0JKiBiZmQuYzogSW5jbHVkZSA8c3RkYXJnLmg+IG9yIDx2YXJhcmdzLmg+LCBkZXBlbmRpbmcgdXBvbgotCUFOU0lfUFJPVE9UWVBFUy4KLQkoYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSk6IE5ldyBnbG9iYWwgdHlwZS4KLQkoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZXJyb3JfaGFuZGxlcik6IE5ldyBCRkQgcHJpdmF0ZSBnbG9iYWwgdmFyaWFibGUuCi0JKGJmZF9zZXRfZXJyb3JfaGFuZGxlcik6IE5ldyBnbG9iYWxseSB2aXNpYmxlIGZ1bmN0aW9uLgotCShiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSk6IE5ldyBnbG9iYWxseSB2aXNpYmxlIGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZXJyb3JfaGFuZGxlcik6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlciwKLQlhbmQgdXNlIGl0IGluc3RlYWQgb2YgYmZkX2dldF9zeW1jb3VudC4gIENoZWNrIHJfaW5kZXggYWZ0ZXIKLQlzZXR0aW5nIHJfZXh0ZXJuIGJhc2VkIG9uIHdoZXRoZXIgdGhpcyBpcyBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19JTikpOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyLCBhbmQgdXNlIGl0Ci0JaW5zdGVhZCBvZiBiZmRfZ2V0X3N5bWNvdW50LgotCShOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogUGFzcyBiZmRfZ2V0X3N5bWNvdW50IHRvIHJlbG9jCi0Jc3dhcCByb3V0aW5lcy4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIKLQl0byBkZWNsYXJhdGlvbi4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBQYXNzCi0JaW5mby0+ZHluc3ltX2NvdW50IHRvIHJlbG9jIHN3YXAgcm91dGluZXMuCi0JKiBhb3V0LW5zMzJrLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX2luKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlci4KLQkqIGhwMzAwaHB1eC5jIChNWShzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkoTVkoc2x1cnBfcmVsb2NfdGFibGUpKTogUGFzcyBiZmRfZ2V0X3N5bWNvdW50IHRvIHJlbG9jIHN3YXAKLQlyb3V0aW5lLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX2luKSk6IEFkZCBzeW1jb3VudAotCXBhcmFtZXRlci4KLQkoTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCShOQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpKTogUGFzcyBiZmRfZ2V0X3N5bWNvdW50IHRvIHJlbG9jCi0Jc3dhcCByb3V0aW5lcy4KLQotVGh1IE1hciAgOSAxMjowNDowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbiB2ZWN0b3IgdG8gYmUKLQljYWxsZWQgYnkgdGhlIGxpbmtlciB0byBtZXJnZSBhbnkgcHJpdmF0ZSBiZmQgZGF0YSBvZiB0aGUgaW5wdXQKLQlmaWxlcyBhbmQgdGhlIG91dHB1dCBmaWxlLiAgVXNlZCBieSB0aGUgUG93ZXJQQyBFTEYgc3VwcG9ydCB0bwotCWNoZWNrIHdoZXRoZXIgLW1yZWxvY2F0YWJsZSBpcyB1c2VkIGZvciBhbGwgbW9kdWxlcy4KLQkoYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3IGZ1bmN0aW9uIHZlY3RvciB0byBiZSBjYWxsZWQgYnkgdGhlCi0JYXNzZW1ibGVyIHRvIHNldCBwcml2YXRlIGZsYWdzLiAgVXNlZCBieSB0aGUgUG93ZXJQQyBFTEYgc3VwcG9ydAotCXRvIHNldCB0aGF0IGEgcGFydGljdWxhciBvYmplY3QgZmlsZSB3YXMgYXNzZW1ibGVkIHdpdGggdGhlCi0JLW1yZWxvY2F0YWJsZSBvcHRpb24uCi0KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfQ09QWSk6IEFkZCBpbnRpaWFsaXphdGlvbiBvZiB0aGUKLQliZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBhbmQgYmZkX3NldF9wcml2YXRlX2ZsYWdzIGZ1bmN0aW9uCi0JdmVjdG9ycy4KLQotCSogYmZkLWluMi5oLCBsaWJiZmQtaW4uaDogUmVidWlsZCB3aXRoIGJmZC5jIGFuZCB0YXJnZXRzLmMKLQljaGFuZ2VzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldyBmdW5jdGlvbiB0byBzZXQgdGhlCi0JRUxGIGVfZmxhZ3MgZmllbGQuCi0JKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSB0aGUgZV9mbGFncyBmaWVsZCBmcm9tIHRoZQotCWlucHV0IGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGVjayBmb3IgYSBtaXNtYXRjaCBiZXR3ZWVuIHRoZQotCWVfZmxhZ3MgZmllbGQgb2YgYWxsIG9mIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMuCi0KLQkqIGxpYmVsZi5oIChlbGZfb2JqX3RkYXRhKTogQWRkIHBwY19mbGFnc19pbml0IGZpZWxkIHNvIHRoYXQgdGhlCi0JUG93ZXJQQyBzdXBwb3J0IGNhbiBjaGVjayBpZiBjb21wYXRhaWJsZSBlX2ZsYWdzIGFyZSBwcmVzZW50LgotCi0JKiBhb3V0LXRhcmdldC5oOiBBZGQgTk9QIGZvciB0aGUgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQlhbmQgYmZkX3NldF9wcml2YXRlX2ZsYWdzIGZ1bmN0aW9uIHZlY3RvcnMuCi0JKiBjb2ZmY29kZS5oOiBEaXR0by4KLQkqIGVsZjMyLXRhcmdldC5oOiBEaXR0by4KLQkqIGVsZjY0LXRhcmdldC5oOiBEaXR0by4KLQkqIGxpYmJmZC5oOiBEaXR0by4KLQkqIGxpYmVjb2ZmLmg6IERpdHRvLgotCSogc29tLmM6IERpdHRvLgotCi1XZWQgTWFyICA4IDAwOjUzOjU0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBtaXBzOjgwMDAgZW50cnkuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IE1hcmsgYW4gdW5kZWZpbmVkIEJTRl9XRUFLIHN5bWJvbCBhcwotCVNUQl9XRUFLIHJhdGhlciB0aGFuIFNUQl9HTE9CQUwuCi0KLVR1ZSBNYXIgIDcgMTI6MjM6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX2FkanVzdF9zeW1uZHguCi0JKGJmZF9jb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZSBhcyBOVUxMIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQgdG8KLQljb2ZmX2FkanVzdF9zeW1uZHguCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2FsbCBjb2ZmX2FkanVzdF9zeW1uZHggaWYgaXQKLQlpcyBkZWZpbmVkLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lIGJlZm9yZSBpbmNsdWRpbmcgY29mZmNvZGUuaC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IFNraXAgYmluYXJ5X3ZlYyB3aGVuCi0Jc2VhcmNoaW5nIHRocm91Z2ggYmZkX3RhcmdldF92ZWN0b3IuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IENoZWNrIFNIVF9OT0JJVFMgYmVmb3JlIGNoZWNraW5nCi0Jc2hfc2l6ZS4KLQotTW9uIE1hciAgNiAyMzozMTozNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IEtlZXAgU0hUX05PQklUUyBzZWN0aW9ucyBhZnRlcgotCSFTSFRfTk9CSVRTIG9uZXMuCi0KLU1vbiBNYXIgIDYgMDk6NTM6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNwdS1ocHBhLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBTdXBwb3J0IGJvdGggUEExLjAgYW5kIFBBMS4xCi0JbWFjaGluZSB0eXBlcy4KLQkoYmZkX2hwcGFfYXJjaCk6IExpbmsgaW4gYm90aCBQQTEuMCBhbmQgUEExLjEgYXJjaGl0ZWN0dXJlIGluZm8KLQlzdHJ1Y3R1cmVzLgotCSogbGliaHBwYS5oIChlbnVtIHBhX2FyY2gpOiBOZXcgZW51bWVyYXRpb24gdG8gZGVzY3JpYmUgdGhlCi0JZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoZSBQQSBhcmNoaXRlY3R1cmUuCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IFVzZSBuZXcgZW51bWVyYXRpb24gdG8gc2V0IG1hY2hpbmUKLQl0eXBlLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBJZiB0aGUgbWFjaGluZSB0eXBlIGlzIFBBMS4xLCB0aGVuIHVzZSB0aGUKLQlQQTEuMSBtYWNoaW5lIGlkZW50aWZpZXIgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1UaHUgTWFyICAyIDE1OjU4OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IFRyZWF0IHRoZSBpbmRleCBvZiBhCi0gICAgICAgIGJhc2UgcmVsYXRpdmUgcmVsb2MgYXMgYW4gaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlLCByZWdhcmRsZXNzCi0gICAgICAgIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykpOiBEb3VibGUgY2hlY2sgdGhhdCB0aGUKLQljYWxsZXIgaXMgd3JpdGluZyB0byBhIHZhbGlkIHNlY3Rpb24uCi0KLVRodSBNYXIgIDIgMTQ6Mzc6NTcgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogYmluYXJ5LmM6IEFkZCBzdXBwb3J0IGZvciByZWFkaW5nIGJpbmFyeSBmaWxlcy4gIExvYWRzIHRoZSByYXcKLQljb250ZW50cyBvZiB0aGUgZmlsZSBpbnRvIGEgZGF0YSBzZWN0aW9uIGFuZCB3cmFwcyBzb21lIHN5bWJvbHMKLQlhcm91bmQgaXQuICBUaGUgc3ltYm9scyBgX2JpbmFyeV88ZmlsZW5hbWU+X3N0YXJ0JyBhbmQKLQlgX2JpbmFyeV88ZmlsZW5hbWU+X2VuZCcgaW5kaWNhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGRhdGEsCi0Jd2hpbGUgYF9iaW5hcnlfPGZpbGVuYW1lPl9zaXplJyBpcyBhbiBhYnNvbHV0ZSBzeW1ib2wgd2hvc2UgdmFsdWUKLQlpcyB0aGUgc2l6ZSBvZiB0aGUgZGF0YS4gIDxmaWxlbmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhlIGJpbmFyeQotCWlucHV0IGZpbGUsIHdpdGggYWxsIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8KLQl1bmRlcnNjb3Jlcy4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUpOiBBc3N1bWUgdXNlcnMga25vd3Mgd2hhdAotCXRoZXkncmUgZG9pbmcgaWYgb25lIG9mIHRoZSBhcmNoaXRlY3R1cmVzIGlzIGJmZF9hcmNoX3Vua25vd24uCi0KLVdlZCBNYXIgIDEgMTc6MzA6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChlbGZfcG93ZXJwY19ob3d0b190YWJsZSk6IEZvciByZWxvY2F0aW9uCi0JUl9QUENfR09UMTYsIGNoYW5nZSBjb21wbGFpbl9vbl9vdmVyZmxvdyB0byBiZQotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotV2VkIE1hciAgMSAxMTo1Mjo1NSAxOTk1ICBKYXNvbiBNb2xlbmRhICA8Y3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBwb3dlcnBjLSotYWl4Ki4KLQotV2VkIE1hciAgMSAxMTo1NzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChDT0ZGX1BBR0VfU0laRSk6IERlZmluZS4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIG91dHB1dCBvZiBUREVGQVVMVFMgdG8gYXZvaWQgcmVseWluZyBvbgotCXNlbWFudGljcyBvZiBzaW5nbGUgcXVvdGVzIGluIHBhcmFtZXRlciBzdWJzdGl0dXRpb24uCi0KLVR1ZSBGZWIgMjggMTI6NTM6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBTb3J0IGVtcHR5IHNlY3Rpb25zIGJlZm9yZSBub24tZW1wdHkKLQlzZWN0aW9ucywgaWYgdGhleSBoYXZlIHRoZSBzYW1lIFZNQS4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1saW51eGVsZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGkzODYtbGVsZi4KLQkoaVszNDVdODYtKi1nbnVlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWdlbGYuCi0JKiBjb25maWcvaTM4Ni1sZWxmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LWdlbGYubXQ6IE5ldyBmaWxlLgotCi1Nb24gRmViIDI3IDEyOjU4OjI1IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IGFkZCBhMjlrLSotdnh3b3JrcyBjb25maWd1cmF0aW9uLgotCi1XZWQgRmViIDIyIDE0OjQwOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvCi0JdXNlIHJlbG9jX2hvd3RvX3R5cGUgcmF0aGVyIHRoYW4gY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdC4KLQotVHVlIEZlYiAyMSAxODoxOToyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCByZXR1cm4gYW4gZXJyb3IgaWYgYXNrZWQKLQlmb3IgcmVsb2NhdGlvbnMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uCi0KLVR1ZSBGZWIgMjEgMTU6MTM6MDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEhhbmRsZSBvYmplY3RzIHdpdGggb2RkCi0JbGVuZ3Rocy4KLQotRnJpIEZlYiAxNyAxMjozNDozNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZ290MTZfcmVsb2MpOiBNYWtlIEdPVCBzdHlsZSByZWxvY3MgYWRkCi0JMzI3NjgsIHNvIHRoZSBHT1QgcG9pbnRlciBjYW4gcG9pbnQgdG8gMTYzODQgcG9pbnRlcnMsIGluc3RlYWQgb2YKLQk4MTkyLgotCi1GcmkgRmViIDE3IDExOjQ1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvc3lzdjQuaDogSW5jbHVkZSA8dW5pc3RkLmg+LCA8c3RkbGliLmg+LCBhbmQgPHRpbWUuaD4uCi0JT25seSBkZWZpbmUgU0VFS19TRVQgYW5kIFNFRUtfQ1VSIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JUmVtb3ZlIGFsbCBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0KLQkqIHN5bXMuYyAoYmZkX2RlY29kZV9zeW1jbGFzcyk6IFJldHVybiAnVycgZm9yIGEgd2VhayBzeW1ib2wuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogU2V0IHN0YXJ0IGFkZHJlc3MgYW5kIGZsYWdzCi0JYmVmb3JlIGNhbGxpbmcgY29mZl9ta29iamVjdF9ob29rLiAgUmVzdG9yZSB0aGVtIG9uIGZhaWx1cmUuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBub3QgRUNPRkZfQU9VVF9aTUFHSUMsCi0JY2xlYXIgRF9QQUdFRC4KLQotCSogY29mZmdlbi5jOiBSZWluZGVudGVkLgotCi1UaHUgRmViIDE2IDE0OjM3OjIzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IHVzZSBiaXRwb3MgaW4gb3ZlcmZsb3cKLQljYWxjdWxhdGlvbnMuCi0JKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxNiAxMzoyMjoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IFJlbW92ZSBhbGwgZnVuY3Rpb24gZGVjbGFyYXRpb25zIHdoaWNoIHJldHVybgotCWludCBvciB2b2lkLCBleGNlcHQgdGhlIG9uZSBmb3IgZnJlZS4KLQotV2VkIEZlYiAxNSAxNDo1NDoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChlbGZfcG93ZXJwY19ob3d0b190YWJsZSk6IFVzZSBhIGRlc3RpbmF0aW9uIG1hc2sgb2YKLQkweGZmZmZmZmZmIGZvciBSX1BQQ19SRUwzMiwgbm90IDAuCi0JKHBvd2VycGNfcmVsb2NfbWFwKTogQWRkIGxvdyAxNiBiaXQsIGhpZ2ggMTYgYml0LCBhbmQgaGlnaCAxNiBiaXQKLQlhZGp1c3RlZCByZWxvY2F0aW9ucy4KLQotVHVlIEZlYiAxNCAxNzo0NzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSk6IERlZmluZS4KLQkobWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWZpbmUuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgZmluZF9saW5lX2luZm8gZmllbGQuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc3dhcF90aXJfaW4pOiBNb3ZlIHRvIGVjb2ZmbGluay5jLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbik6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoY21wX2ZkcnRhYl9lbnRyeSk6IExpa2V3aXNlLgotCShta19mZHJ0YWIpOiBMaWtld2lzZS4KLQkobG9va3VwKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBKdXN0IGNhbGwgX2JmZF9lY29mZl9sb2NhdGVfbGluZQotCXRvIGRvIG1vc3Qgb2YgdGhlIHdvcmsuICBBbGxvY2F0ZSBmaW5kX2xpbmVfaW5mbyBpZiBuZWNlc3NhcnkuCi0JKiBlY29mZmxpbmsuYzogSW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIi4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9pbik6IE1vdmUgaW4gZnJvbSBlY29mZi5jLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbik6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoY21wX2ZkcnRhYl9lbnRyeSk6IExpa2V3aXNlLiAgVXNlIFBUUiBpbnN0ZWFkIG9mIHZvaWQgKi4KLQkobWtfZmRydGFiKTogTW92ZSBpbiBmcm9tIGVjb2ZmLmMuICBBZGQgZGVidWdfaW5mbywgZGVidWdfc3dhcCwKLQlhbmQgbGluZV9pbmZvIGFyZ3VtZW50cywgYW5kIHVzZSB0aGVtIGluc3RlYWQgb2YgZWNvZmZfZGF0YS4KLQkoZmRydGFiX2xvb2t1cCk6IE1vdmUgaW4gZnJvbSBsb29rdXAgaW4gZWNvZmYuYy4gIFJlbW92ZSBhYmZkCi0JYXJndW1lbnQsIGFkZCBsaW5lX2luZm8gYXJndW1lbnQuICBVc2UgaXQgaW5zdGVhZCBvZiBlY29mZl9kYXRhLgotCShfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogTmV3IGZ1bmN0aW9uLCBtb3N0bHkgZnJvbSB0aGUgb2xkCi0JX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSBpbiBlY29mZi5jLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogUmVtb3ZlIGZpbmRfYnVmZmVyLCBmZHJ0YWJfbGVuIGFuZAotCWZkcnRhYiBmaWVsZHMsIHJlcGxhY2luZyB0aGVtIGZpbmRfbGluZV9pbmZvIGZpZWxkLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luKTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbik6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCk6IERlY2xhcmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIGVjb2ZmLm8gZm9yIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYyBvcgotCWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotVHVlIEZlYiAxNCAxNDowNDoyMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBlbGZfbWFjaGluZV9hbHQxIGFuZAotCWVsZl9tYWNoaW5lX2FsdDIgd2hpY2ggcHJvdmlkZSBhbHRlcm5hdGUgdmVyc2lvbnMgb2YgdGhlIG1hY2hpbmUKLQljb2RlLgotCi0JKiBlbGYzMi1wcGMuYyAoRUxGX01BQ0hJTkVfQUxUMSwgRUxGX01BQ0hJTkVfQUxUMik6IERlZmluZSB0bwotCXJlY29nbml6ZSBvbGQgdmVyc2lvbnMgb2YgdGhlIFBvd2VyUEMgbWFjaGluZSBjb2RlLgotCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBhbHRlcm5hdGUgbWFjaGluZSBjb2RlCi0JZmllbGRzIGRlZmluZWQgYnkgRUxGX01BQ0hJTkVfQUxUMSBhbmQgRUxGX01BQ0hJTkVfQUxUMi4KLQotCSogZWxmNjQtdGFyZ2V0LmggKGVsZjY0X2JlZCk6IEluaXRpYWxpemUgYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQotCWZpZWxkcyBkZWZpbmVkIGJ5IEVMRl9NQUNISU5FX0FMVDEgYW5kIEVMRl9NQUNISU5FX0FMVDIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiBJbiBhZGRpdGlvbiB0byB0aGUKLQltYWluIG1hY2hpbmUgY29kZSBmaWVsZCwgY2hlY2sgdGhlIHR3byBhbHRlcm5hdGUgbWFjaGluZSBjb2RlCi0JZmllbGRzLgotCi1UdWUgRmViIDE0IDEyOjQ2OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dGYxLmggKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4gIERvbid0Ci0JYWNjZXB0IE1fU1BBUkMgaWYgYmZkX2FyY2hfc3BhcmMgaXMgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZAotCWFyY2hpdGVjdHVyZXMsIGFuZCBkb24ndCBhY2NlcHQgYSA2ODB4MCBtYWNoaW5lIHR5cGUgaWYKLQliZmRfYXJjaF9tNjhrIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcy4KLQkqIGFvdXQwLmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCi1Nb24gRmViIDEzIDIzOjI1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IERvbid0IHJldHVybiBhIHBvaW50ZXIKLQl0byBnYXJiYWdlIGlmIHRoZSBzeW1ib2wgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgIDkgMTg6MzY6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGkzODZtc2Rvcy5vLgotCi1UaHUgRmViICA5IDEyOjAyOjM1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4NmxpbnV4LmMgKE5FRURTX1NIUkxJQik6IERlZmluZS4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IENyYXNoIGlmIGEgTkVFRFNfU0hSTElCIHN5bWJvbCBpcwotCXVuZGVmaW5lZC4gIEZyb20gaGpsQG55bmV4c3QuY29tIChILkouIEx1KS4KLQotV2VkIEZlYiAgOCAxNzoyNjowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogQWxsb2NhdGUgY29tbW9uCi0Jc3ltYm9sIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIERvbid0IGJvdGhlciB0byBjaGVjayBmb3IgY29tbW9uCi0Jc3ltYm9sIHNpemUgb3ZlcmZsb3cuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBBZGp1c3QgcmVmZXJlbmNlcwotCXRvIGNvbW1vbiBzeW1ib2wgaW5mb3JtYXRpb24gZm9yIG5ldyBzdHJ1Y3R1cmUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgOCAwOTo1Mzo0MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBQdXQgU0hUX05PQklUUyBzZWN0aW9ucyBhZnRlciAhU0hUX05PQklUUy4KLQotVHVlIEZlYiAgNyAxNjoyNzozMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfZmluZF9uZWFyZXN0X2xpbmUpOiBKdXN0IHJldHVybiBmYWxzZSwgZG9uJ3QKLQlhYm9ydC4KLQotVHVlIEZlYiAgNyAxNDo0MzozMyAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYzogUmVmb3JtYXR0ZWQgc29tZSBjb21tZW50cyBhbmQgYnJhY2UgY29uc3RydWN0cyBpbgotCXJlY2VudCBjaGFuZ2VzIHRvIEdOVSBzdHlsZS4KLQkoY21wX2ZkcnRhYl9lbnRyeSwgbWtfZmRydGFiLCBsb29rdXApOiBVc2Ugb2xkLXN0eWxlIGZ1bmN0aW9uCi0JZGVmaW5pdGlvbnMuCi0KLVR1ZSBGZWIgIDcgMTQ6MjE6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4pOiBaZXJvIG91dCBpbnRlcm4gYmVmb3JlIHNldHRpbmcKLQlhbnkgb2YgdGhlIGZpZWxkcy4KLQotTW9uIEZlYiAgNiAyMDowMToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU2F0IEZlYiAgNCAxNDoyMDoyNCAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl9pbiwgZWNvZmZfc3dhcF9wZHJfb3V0KTogYWRkZWQKLQlpbnRlcm5hbGl6aW5nL2V4dGVybmFsaXppbmcgbmV3ICJwcm9mIiBmaWVsZC4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfdGRhdGEpOiBhZGRlZCBmZHJ0YWIuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBGaXhlZC4KLQotTW9uIEZlYiAgNiAxNDoyNToyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBzYXdfbmVlZGVkIGZpZWxkLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgc2F3X25lZWRlZCBpZgotCURUX05FRURFRCBzZWVuIGluIC5keW5hbWljIHNlY3Rpb24uCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBXYXJuIGlmIGFuIHVuZGVmaW5lZCBzeW1ib2wgaXMKLQlvbmx5IHJlZmVyZW5jZWQgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgbm90IG1ha2luZyBhIHNoYXJlZAotCW9iamVjdCwgYW5kIHNhd19uZWVkZWQgaXMgZmFsc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIHNhd19uZWVkZWQuCi0KLQkqIGxpYmVsZi5oIChFTEZfTElOS19IQVNIX0RFRklORURfV0VBSyk6IERvbid0IGRlZmluZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY2xlYXIgb3Igc2V0Ci0JRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUsuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBjaGVjayBFTEZfTElOS19IQVNIX0RFRklORURfV0VBSy4KLQotCURpc3Rpbmd1aXNoIGEgd2VhayBkZWZpbmVkIHN5bWJvbCBmcm9tIGEgcmVndWxhciBkZWZpbmVkIHN5bWJvbC4KLQkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIERFRlcuCi0JKGxpbmtfYWN0aW9uKTogQWRkIGJmZF9saW5rX2hhc2hfZGVmd2VhayBjb2x1bW4uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQWRkIERFRlcgY2FzZS4gIEhhbmRsZQotCWJmZF9saW5rX2hhc2hfZGVmd2VhayBpbiBhIGZldyBvdGhlciBjYXNlcy4KLQkqIE1hbnkgZmlsZXMgKGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKTogUmVuYW1lZCBmcm9tCi0JYmZkX2xpbmtfaGFzaF93ZWFrLgotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBIYW5kbGUgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkqIGJvdXQuYyAoZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyk6IExpa2V3aXNlLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBjb2ZmbGluay5jIChjb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBMSWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkobGludXhfZmluaXNoX2R5bmFtaWNfbGluayk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHNldF9zeW1ib2xfZnJvbV9oYXNoKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKGJmZF9wZXJmb3JtX3NsaXApOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IExpa2V3aXNlLgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi1Nb24gRmViICA2IDAzOjIwOjE3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gQnJ5YW4gRm9yZCwgYmFmb3JkQHNjaGlyZi5jcy51dGFoLmVkdToKLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotbXNkb3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Nm1zZG9zX3ZlYyk6IEhhbmRsZSBpdC4KLQkqIGkzODZtc2Rvcy5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LW1zZG9zLm10OiBOZXcgZmlsZS4KLQkqIGJmZC5jIChlbnVtIGJmZF9lcnJvcik6IEFkZGVkIG5ldyB2YWx1ZSBiZmRfZXJyb3JfZmlsZV90b29fYmlnLgotCShiZmRfZXJybXNncyk6IEFkZGVkIHN0cmluZyB0byB0YWJsZS4KLQkqIGxpYmFvdXQuaCAocmVsb2NfdHlwZS1sb29rdXApOiBEZWNsYXJlIGl0LgotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9mbGF2b3VyKTogQWRkZWQgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLgotCShpMzg2bXNkb3NfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgaXQgdG8gdGhlIGxpc3QuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1XZWQgRmViICAxIDAxOjMyOjE0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvLCBjYXNlIFJfREFUQV9PTkVfU1lNQk9MKTogSWYgdGhlcmUncwotCW5vdGhpbmcgaW4gUl9EQVRBX09WRVJSSURFLCB0aGVuIHRyeSB0byBmaW5kIHRoZSBhZGRlbmQgaW4gdGhlCi0Jc2VjdGlvbidzIGNvbnRlbnRzLgotCShzb21fd3JpdGVfZml4dXBzKTogSWdub3JlIHRoZSBhZGRlbmQgaW4gYSBSX0RBVEFfT05FX1NZTUJPTCBmaXh1cC4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBNb3JlIGhlcnVpc3RpY3MgdG8gZGV0ZWN0IHRoZQotCWJyYWluZGFtYWdlZCBIUCBPU0YxIGxpbmtlci4gCi0JKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgZm9yZ2V0IHRvIGZyZWUgc3Vic3BhY2Vfc2VjdGlvbnMgaWYgd2UgZ2V0Ci0JYW4gZXJyb3IuCi0JKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBBbGxvY2F0ZSBzdHJpbmdzIG9uIHRoaXMgYmZkJ3Mgb2JzdGFjawotCXJhdGhlciB0aGFuIGRpcmVjdGx5IG91dCBvZiB0aGUgaGVhcC4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgc2F2ZWQgY29weSBvZiB0aGUKLQljYW5vbmljYWwgc3ltYm9scy4KLQkoc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UgZm9yIHRoZSBzYXZlZCBjb3B5IG9mIHRoZQotCWNhbm9uaWNhbCByZWxvY2F0aW9ucy4gIEZyZWUgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucyB3aGVuIHdlJ3JlCi0JZG9uZSB3aXRoIHRoZW0uCi0KLVR1ZSBKYW4gMzEgMjE6NTM6MjggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IG1lbWJlciBwcm9ncmFtX2hlYWRlcl9zaXplLgotCSogZWxmY29kZS5oIChnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IE5ldyBwYXJhbWV0ZXJzIHNvcnRlZF9oZHJzLAotCWNvdW50LCBhbmQgbWF4cGFnZXNpemUuICBBbGwgY2FsbGVycyB1cGRhdGVkLgotCUlmIHNvcnRlZF9oZHJzIGlzIG5vbi1OVUxMLCB1c2UgaXQgdG8gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzLgotCVNhdmUgcmVzdWx0IGluIGNhc2UgY2FsbGVkIGFnYWluLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFNvcnQgaGVhZGVycyBiZWZvcmUgY2FsbGluZwotCWdldF9wcm9ncmFtX2hlYWRlcl9zaXplLgotCi1UdWUgSmFuIDMxIDE1OjI3OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IEFkZCBzb3J0ZWRfaGRycyBwYXJhbWV0ZXIuCi0JU2VhcmNoIHRocm91Z2ggaXQgcmF0aGVyIHRoYW4gdGhyb3VnaCB1bnNvcnRlZCBzZWN0aW9uIGhlYWRlcnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogUGFzcyBzb3J0ZWRfaGRycyB0bwotCW1hcF9wcm9ncmFtX3NlZ21lbnRzLgotCi1Nb24gSmFuIDMwIDIyOjA0OjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBGaXggcHJvYmxlbXMgaW4gcmFuZ2UKLQljaGVja2luZy4gIEV4cGVjdCBhcmd1bWVudCBPRkZTRVQgdG8gYmUgc2VjdGlvbi1yZWxhdGl2ZS4gIEZyb20KLQlEYXZpZCBNb3NiZXJnZXItVGFuZywgZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdS4KLQotTW9uIEphbiAzMCAxMToyMjoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogRG9uJ3QgZG8KLQlhbnl0aGluZyBpZiB3ZSBhcmUgbm90IGxpbmtpbmcgYW4gRUxGIGZpbGUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogTGlrZXdpc2UuCi0KLVNhdCBKYW4gMjggMTI6NDg6NTcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChjb21wYXJlX3N1YnNwYWNlcyk6IE5ldyBmdW5jdGlvbiB0byBzb3J0IHN1YnNwYWNlcyBieQotCXRoZWlyIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4KLQkoc2V0dXBfc2VjdGlvbnMpOiBXaGVuIGNvbXB1dGluZyB0aGUgaW5kZXggZm9yIGVhY2ggc3Vic3BhY2UsCi0JaGFuZGxlIGNhc2Ugd2hlcmUgc2V0dXBfc2VjdGlvbnMgcmVhZHMgdGhlIHN1YnNwYWNlcyBpbiBhCi0JZGlmZmVyZW50IG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLgotCShzb21faXNfc3BhY2UpOiBBbHNvIGV4YW1pbmUgdGhlIG91dHB1dCBzZWN0aW9uIGZvciB0aGUgY29udGFpbmluZwotCXNlY3Rpb24uCi0JKHNvbV9pc19zdWJzcGFjZSwgc29tX2lzX2NvbnRhaW5lcik6IExpa2V3aXNlLgotCShzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IHByZXBhcmUgb3Igd3JpdGUgZml4dXBzIGhlcmUuICBXaGVuCi0Jd3JpdGluZyB0aGUgc3ltYm9sIHN0cmluZ3MsIHVzZSB0aGUgdW5zb3J0ZWQgc3ltYm9sIHRhYmxlLgotCShzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZSBoZXJlLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBQcmVwYXJlIGFuZCB3cml0ZSB0aGUgZml4dXBzIGhlcmUuICBMaWtld2lzZQotCWZvciB0aGUgc3ltYm9sIHRhYmxlLgotCShzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogVW5kZWZpbmVkIHN5bWJvbHMgYWx3YXlzIGhhdmUKLQl0eXBlIFNTX1VOU0FUIHJlZ2FyZGxlc3Mgb2YgQlNGX0VYUE9SVC4KLQkoc29tX3NldF9yZWxvY19pbmZvKTogVW5wYWNrIGFuZCBhdHRhY2ggYXJndW1lbnQgbG9jYXRpb24KLQlpbmZvcm1hdGlvbiBmb3IgUl9QQ1JFTF9DQUxMIGFuZCBSX0FCU19DQUxMIHJlbG9jYXRpb25zLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IE5ldyBoZXVyaXN0aWMgdG8gZGV0ZXJtaW5lIGlmIHRoZQotCWVudHJ5IGFuZCBmbGFncyBmaWVsZHMgYXJlIHN3aXRjaGVkIGluIHRoZSBleGVjIGhlYWRlci4KLQotU2F0IEphbiAyOCAwMDoxNjowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlICpzeW1faGFzaCBpbnN0ZWFkCi0Jb2YgaCBpZiB3ZSBtaWdodCBub3QgYmUgZG9pbmcgYW4gRUxGIGxpbmsuCi0KLUZyaSBKYW4gMjcgMTY6MTM6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJZiB0aGUgc2l6ZSBvZiBhbiBpbnB1dAotCS5yZWdpbmZvIHNlY3Rpb24gaXMgemVybywgZm9yY2UgaXQgdG8gdGhlIGNvcnJlY3Qgc2l6ZSwgc2luY2UgdGhlCi0JbGlua2VyIGVtdWxhdGlvbiBjb2RlIG1heSBoYXZlIGNsb2JiZXJlZCBpdC4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogQ29ycmVjdCBTSEZfQUxMT0MgdGVzdC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBGcmVlIHNvcnRlZF9oZHJzLgotCi1UaHUgSmFuIDI2IDA5OjAwOjEyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBGaXggb2ZmIGJ5Ci0Jb25lIGVuZCBhZGRyZXNzIGNhbGN1bGF0aW9uLgotCi0JKiBjb25maWcuYmZkOiAobTY4Ki1lc3QtY29mZik6IE5ldyBjb25maWd1cmF0aW9uLgotCi1UaHUgSmFuIDI2IDExOjM5OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IGV4YW1pbmUgd2Vha2RlZiBpZgotCXdlIGFyZSB1c2luZyBhbiBFTEYgaGFzaCB0YWJsZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBBbHdheXMgc2V0IEVYRUNfUCBpZgotCXRoZSBzdGFydCBhZGRyZXNzIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLCBldmVuIGlmIFNUQVRfRk9SX0VYRUMKLQlpcyBzZXQuICBKdXN0IHVzZSBTVEFUX0ZPUl9FWEVDIGFzIGFuIGFkZGl0aW9uYWwgdGVzdC4KLQotVGh1IEphbiAyNiAxMToxMjo1NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBVc2UgRU1fUFBDIGluc3RlYWQgb2YKLQlFTV9DWUdOVVNfUE9XRVJQQy4KLQotCSogZWxmMzItcHBjLmMgKHJlbG9jX3R5cGUpOiBBZGQgYWxsIFN5c3RlbSBWLjQgYW5kIGVBQkkKLQlyZWxvY2F0aW9ucyBjdXJyZW50bHkgZGVmaW5lZC4KLQkocG93ZXJwY19yZWxvY19tYXApOiBBZGp1c3QgdG8gbmV3IHJlbG9jYXRpb24gbmFtZXMuCi0JKGVsZl9wb3dlcnBjX2hvd3RvX3RhYmxlKTogQWRkIG1vc3Qgb2YgdGhlIG5ldyByZWxvY2F0aW9ucy4KLQkoRUxGX01BQ0hJTkVfQ09ERSk6IFVzZSBFTV9QUEMgaW5zdGVhZCBvZiBFTV9DWUdOVVNfUE9XRVJQQy4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYWJpLgotCi0JKiBjb25maWcvcHBjLWVsZi5tdDogQWRkIHJzNjAwMCBhcmNoaXRlY3R1cmUgc3VwcG9ydCB0byB0aGUKLQlQb3dlclBDLiAgQWxzbyBhZGQgWENPRkYgc3VwcG9ydC4KLQotV2VkIEphbiAyNSAyMzoyNjoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoQ0FMQ19BRERFTkQpOiBEb24ndCBkZWZpbmUuCi0JKGNvZmZfc2hfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uCi0KLVR1ZSBKYW4gMjQgMTQ6MjI6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX291dHB1dF9leHRzeW0pOiBTZXQgdGhlIHZhbHVlIG9mIHRoZQotCUVDT0ZGIHN5bWJvbCBmcm9tIHRoZSBoYXNoIHRhYmxlIGVudHJ5LgotCi1Nb24gSmFuIDIzIDE0OjUzOjM1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBjb2ZmLXNoLmMgKGNvZmZfc2hfcmVsb2NhdGVfc2VjdGlvbik6ICBEb24ndCBzdWJ0cmFjdAotCXZtYSB0d2ljZS4KLQotTW9uIEphbiAyMyAxMzozMzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsb2MpOiBEb24ndCBpZ25vcmUgdGhlIHByZXZpb3VzIGNvbnRlbnRzIG9mIGFuCi0JUl9TSF9JTU0zMiByZWxvYy4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1nbnUqKTogU2V0IGJmZF9uYW1lIHRvIGkzODYtZ251LgotCSogY29uZmlnL2kzODYtZ251Lm10OiBOZXcgZmlsZS4gIEluY2x1ZGUgRUxGIHN1cHBvcnQuCi0KLQkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBDYWxsIGJmZF9jYWNoZV9pbml0LgotCi1GcmkgSmFuIDIwIDExOjQ0OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBPbmx5IHNldCB0aGUgc3Vub3Mgc3BlY2lmaWMKLQlmaWVsZHMgaWYgd2UgYXJlIGRvaW5nIGEgc3Vub3MgbGluay4KLQotV2VkIEphbiAxOCAxMjoyODoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNwdS1oODMwMC5jIChoODMwMF9pbmZvX3N0cnVjdCk6IENoYW5nZSBuYW1lIGZyb20gIkg4LzMwMCIgdG8KLQkiaDgzMDAiIGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGNwdS0qIGZpbGVzLgotCShoODMwMGhfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbmFtZSBmcm9tICJIOC8zMDBIIiB0byAiaDgzMDBoIi4KLQkqIGNvZmYtaDgzMDAuYyAoc3BlY2lhbCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgZGlmZi4KLQotVHVlIEphbiAxNyAxMDo1MjozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfYnl0ZSwgcmVsb2NfaG93dG9fdHlwZSk6IERlZmluZSBoZXJlLCBub3QuLi4KLQkqIHJlbG9jLmMgKGJmZF9ieXRlLCByZWxvY19ob3d0b190eXBlKTogaGVyZS4KLQkqIENoYW5nZWQgYWxsIG9jY3VycmVuY2VzIG9mIGBgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCcnCi0JdG8gYmUgYGByZWxvY19ob3d0b190eXBlJycgaW5zdGVhZC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmgsIGxpYmNvZmYuaDogUmVidWlsdC4KLQotCSogb3BuY2xzLmMgKGJmZF9vcGVuc3RyZWFtcik6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogZWxmMzItbWlwcy5jIChlbnVtIHJlbG9jX3R5cGUpOiBEZWZpbmUgbmV3IHJlbG9jcyB1c2VkIG9uIElyaXguCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIG5ldyByZWxvY3MuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX01TWU0sCi0JU0hUX01JUFNfRFdBUkYsIGFuZCBTSFRfTUlQU19FVkVOVFMuCi0JKG1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBIYW5kbGUgc2VjdGlvbnMgbmFtZWQgLm1zeW0sIC5kZWJ1Z18qCi0JYW5kIC5NSVBTLmV2ZW50cy4qLgotCi0JKiBzcmVjLmMgKHNyZWNfaW5pdCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQotU2F0IEphbiAxNCAxOTowOTo0OCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bqb25ueT4KLQotCSogYXJjaHVyZXMuYywgTWFrZWZpbGUuaW4sIHRhcmdldHMuYywgYmZkLWluMi5oLCBjb2ZmY29kZS5oLAotCWNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgY29uZmlnL3c2NS5tdDogSW5pdGlhbCBzdXBwb3J0IGZvciB0aGUgVzY1LgotCi1TdW4gSmFuIDE1IDEzOjU3OjQ1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDb25maWd1cmUgZm9yIFdJTjMyLgotCi1UaHUgSmFuIDEyIDE2OjMwOjQ3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiBJbmNsdWRlIGBoZWFkZXJzJy4KLQotCSogc3Vub3MuYyAobTY4a19wbHRfZmlyc3RfZW50cnksIHNwYXJjX3BsdF9maXJzdF9lbnRyeSk6IE5vdwotCWNvbnN0LgotCSogdGVraGV4LmMgKGRpZ3MpOiBEaXR0by4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcGx0MF9lbnRyeSwgZWxmX2kzODZfcGx0X2VudHJ5KTogRGl0dG8uCi0KLQkqIHNyZWMuYywgdGVraGV4LmM6IEluY2x1ZGUgbGliaWJlcnR5LmguICBEZWxldGUgc3RhdGljIGFycmF5Ci0JaGV4X3ZhbHVlIGFuZCByZXBsYWNlIHJlZmVyZW5jZXMgdG8gaXQgd2l0aCByZWZlcmVuY2VzIHRvCi0JaGV4X2luaXQsIGhleF9wLCBhbmQgaGV4X3ZhbHVlLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgZGVwZW5kZW5jaWVzLgotCi0JKiBhcmNodXJlcy5jIChhcmNodXJlc19pbml0X3RhYmxlKTogTm93IGNvbnN0LgotCShiZmRfYXJjaF9pbml0KTogQWRqdXN0ZWQgdHlwZSBvZiBsb2NhbCB2YXIgYHB0YWJsZScuCi0KLVRodSBKYW4gMTIgMDk6MzM6MjQgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBob3N0cy9zeW1tZXRyeS5oOiAgUmVkZWZpbmUgYHNoYXJlZCcgdG8gZW5hYmxlIGNvbXBpbGF0aW9uCi0Jd2l0aCB0aGUgbmF0aXZlIER5bml4IGNjIGNvbXBpbGVyLgotCSogaTM4NmR5bml4LmM6ICBJbmNsdWRlIGFvdXR4LmggaW5zdGVhZCBvZiB1c2luZyByb3V0aW5lcwotCWZyb20gYW91dDMyLmMuCi0KLVdlZCBKYW4gMTEgMjE6MzE6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6IE1ha2UgdHlwZWRlZiBpbmNsdWRlIGBjb25zdCcuCi0JKiBhb3V0LW5zMzJrLmMsIGFvdXR4LmgsIGJvdXQuYywgY2YtbTY4a2x5bnguYywgY29mZi1pMzg2LmMsCi0JY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmbGluay5jLCBjcHUtbnMzMmsuYywgZWNvZmYuYywKLQllbGYzMi1ocHBhLmMsIGVsZjMyLWkzODYuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1zcGFyYy5jLAotCWVsZmNvZGUuaCwgbGliYmZkLWluLmgsIGxpbmtlci5jLCBtaXBzYnNkLmMsIG5sbTMyLXBwYy5jLCBvYXN5cy5jLAotCXJlbG9jLmMsIHNvbS5jOiBEb24ndCB1c2UgYGNvbnN0JyBpbiBjb21iaW5hdGlvbiB3aXRoCi0JYHJlbG9jX2hvd3RvX3R5cGUnLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3R5cGVfdG9fc3RyaW5nKTogTG9jYWwgdmFyaWFibGUgYGJ1ZmZlcjEnIGRvZXNuJ3QKLQluZWVkIHRvIGJlIHN0YXRpYy4KLQotV2VkIEphbiAxMSAxNDozNjo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgY29yZSBkdW1wIGlmIGEgbXVsdGlwbGUKLQlkZWZpbml0aW9uIG9mIGFuIGFic29sdXRlIHN5bWJvbCBpcyBlbmNvdW50ZXJlZC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSWdub3JlCi0JcmVkZWZpbml0aW9ucyBvZiBhbiBhYnNvbHV0ZSBzeW1ib2wgdG8gdGhlIHNhbWUgdmFsdWUuCi0KLU1vbiBKYW4gIDkgMTU6NTE6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEl0J3MgcmVhc29uYWJsZSBmb3Igbm8KLQlmbGFncyB0byBiZSBzZXQsIHNvIGRvbid0IGluc2lzdCBvdGhlcndpc2UuCi0KLUZyaSBKYW4gIDYgMTY6Mzk6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBzZXQgQlNGX0dMT0JBTCBmb3IgYW4KLQl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gIDQgMTQ6MTQ6MDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBPbmx5IHJldHVybiBzZWN0aW9ucyB3aGljaAotCWNvcnJlc3BvbmQgdG8gc3Vic3BhY2VzLgotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCBmb3JnZXQgdG8gYnVtcCB0aGUKLQl0b3RhbF9zdWJzcGFjZXMgd2hlbiB3cml0aW5nIHRoZSB1bmxvYWRhYmxlIHN1YnNwYWNlcy4KLQotV2VkIERlYyAyOCAyMDo1NDo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBVc2UgU0VDX0hBU19DT05URU5UUyB0byBpZGVudGlmeQotCWJzcy1saWtlIHNlY3Rpb25zLgotCShzb21fZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMjcgMTQ6MDM6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IFR1cm4gb2ZmIFNFQ19IQVNfQ09OVEVOVFMgZm9yIGJzcy1saWtlCi0Jc2VjdGlvbnMuCi0KLVR1ZSBEZWMgMjAgMTU6MzA6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChiZmRfZGVidWdfc2VjdGlvbik6IERlbGV0ZWQuCi0JKGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCk6IFJldHVybiBhYnNvbHV0ZSBzZWN0aW9uIGZvciBkZWJ1ZwotCXN5bWJvbC4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBTZXQgQlNGX0RFQlVHR0lORyBmb3IgQ19GSUxFIHN5bWJvbHMuICBJZgotCUJTRl9ERUJVR0dJTkcgaXMgc2V0LCBzZXQgc2VjdGlvbiB0byBOX0RFQlVHLgotCShjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IFVzZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogSW4gYXNzZXJ0aW9uLAotCWZvcmNlIGFsbCB2YWx1ZXMgdG8gdGhlIHNhbWUgdHlwZS4KLQotVHVlIERlYyAyMCAxMToxMTo1OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGhvd3RvX3RhYmxlKTogQWxsIHJlbG9jcyBnZXQgYSBzcGVjaWFsIGZ1bmN0aW9uLgotCShzcGVjaWFsKTogTmV2ZXIgZG8gYW55dGhpbmcgd2hlbiBsaW5raW5nIC1yLgotCi1UdWUgRGVjIDIwIDEzOjU4OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgZG8gYW55dGhpbmcgTGludXgKLQlzcGVjaWZpYyBpZiB0aGlzIGlzIG5vdCBhIExpbnV4IGhhc2ggdGFibGUuICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWNAYWliLmNvbT4uCi0KLQlQYXRjaGVzIGZyb20ga2tvamltYUBtaXgub3IuanAgKEthenVtb3RvIEtvamltYSk6Ci0JKiBtaXBzYnNkLmMgKG1pcHNfaG93dG9fdGFibGVfZXh0KTogQ2hhbmdlIHNpemVzIG9mIG1lbW9yeSByZWxvY3MKLQlhcHBseSB0byBmcm9tIHR3byBieXRlcyB0byBmb3VyIGJ5dGVzLgotCSogTVkocmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgYW5kIGV4cGFuZCB0aGUKLQlsaXN0IG9mIGNhc2VzIGZvciB3aGljaCByZWxvY2F0aW9uIG5lZWQgbm90IGJlIGNvbXB1dGVkLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1Nb24gRGVjIDE5IDIzOjA5OjE2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IERlbGV0ZSBkb19sb2NhbHMgYW5kCi0JZG9fZ2xvYmFscyBhcmd1bWVudHMsIGFsd2F5cyByZWFkIHN5bWJvbCBleHRlbnNpb24gaW5mb3JtYXRpb24gZm9yCi0JZ2xvYmFscyBhbmQgbG9jYWxzLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogUmV3b3JrIHRvIG9ubHkgcmVhZCBzeW1ib2wgZXh0ZW5zaW9uCi0JaW5mb3JtYXRpb24gb25jZSBmb3IgZWFjaCBpbnB1dCBiZmQuICAxMCUgaW1wcm92ZW1lbnQgaW4gbGlua2VyCi0JcGVyZm9ybWFuY2UuCi0KLUZyaSBEZWMgMTYgMTI6Mjg6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBDaGVjawotCWJmZF9pc19hYnNfc2VjdGlvbiwgZXRjLiwgb25seSBhZnRlciBjaGVja2luZyBmb3IgdGhlIHNlY3Rpb24gaW4KLQl0aGUgQkZEIGFuZCBhZnRlciBjYWxsaW5nIHRoZSBiYWNrZW5kIHJvdXRpbmUuCi0KLVdlZCBEZWMgMTQgMjA6MjE6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IE9ubHkgdXNlIHNlY3Rpb24gc3ltYm9scyB3aG9zZQotCXZhbHVlIGlzIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiwgY2hlY2tpbmcgb3V0cHV0X29mZnNldCB3aGVuCi0JdXNpbmcgb3V0cHV0X3NlY3Rpb24uICBXaGVuIGNyZWF0aW5nIGEgbmV3IHN5bWJvbCwgc2V0IHRoZSB2YWx1ZQotCXRvIDAsIHNpbmNlIEJGRCBzeW1ib2wgdmFsdWVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLgotCi1UdWUgRGVjIDEzIDEzOjMxOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY3B1LXo4ay5jIChhcmNoX2luZm9fc3RydWN0KTogTWFrZSB6ODAwMiB0aGUgZGVmYXVsdAotCWFyY2hpdGVjdHVyZS4KLQotRnJpIERlYyAgOSAxMjo0MzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogSWYgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUKLQlhcmNoaXZlIGlzIG5vdCBhbiBFTEYgb2JqZWN0LCBwYXNzIHRoZSBhcmNoaXZlIHRvIHRoZSBhZGRfc3ltYm9scwotCWVudHJ5IHBvaW50IGFwcHJvcHJpYXRlIGZvciB0aGUgZmlyc3Qgb2JqZWN0LiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljQGFpYi5jb20+LgotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpKTogU2ltaWxhciBjaGFuZ2UgaWYgdGhlCi0JZmlyc3Qgb2JqZWN0IGlzIG5vdCBhbiBhLm91dCBvYmplY3QuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGNvbXB1dGUKLQlyZWxvY2F0aW9uIGluIGNhc2VzIHdoZXJlIHdlIHdvbid0IHVzZSBpdC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotVGh1IERlYyAgOCAxNDoxOTo0MSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBwYzUzMi1tYWNoLmMgKE5BTUUpOiBEZWZpbmUgdG8gdXNlIG5zMzJrYW91dCBwcmVmaXguCi0JKiBuczMya25ldGJzZC5jIChOQU1FKTogRGl0dG8uCi0JKG5zMzJrYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSB0byBzdGFuZGFyZCBhb3V0LTMyCi0JdmVyc2lvbi4KLQotRnJpIERlYyAgMiAxMzo1Njo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWFkX3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiBtaXBzX3JlbGF4X3NlY3Rpb24uCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IENhbGwgbWlwc19yZWFkX3JlbG9jcy4KLQkoYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfbW5pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVdlZCBOb3YgMzAgMTQ6MTI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNoLmM6IFVzZSBfYmZkX2R1bW15X3RhcmdldCBpbnN0ZWFkIG9mIG5vX2FyY2hpdmUuCi0KLVR1ZSBOb3YgMjkgMTQ6MDA6MTkgMTk5NCAgSi5ULiBDb25rbGluICA8anRjQC5ydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1mcmVlYnNkKik6IFVzZSBpMzg2LWJzZCBhcyBiZmRfbmFtZS4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLWZyZWVic2QqKTogVXNlIGkzODZic2QgYXMgbXlfaG9zdC4KLQotTW9uIE5vdiAyOCAxNTozNjowNCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tNjhrLW5ic2QubXQgKERFRkFVTFRfVkVDVE9SKTogc2V0IHRvIG02OGtuZXRic2RfdmVjLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kYW5jaWVzLgotCSAgKENGSUxFUyk6IEFkZGVkIG02OGtuZXRic2QuYy4KLQkgIChIRklMRVMpOiBBZGRlZCBuZXRic2QuaC4KLQotV2VkIE5vdiAyMyAxOToyMTo0MSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNoLmMgKHNobGNvZmZfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKG5vX2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywgY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUKLQlsaXR0bGUgZW5kaWFuIFNILgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgc2hsLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzaGxjb2ZmX3ZlYy4KLQkqIGNvbmZpZy9zaC1jb2ZmLm10IChTRUxFQ1RfVkVDUyk6IEhhbmRsZSBzaGxfY29mZl92ZWMuCi0KLVdlZCBOb3YgMjMgMTA6NTA6MTMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRG8gbm90IHN1YnRyYWN0IHRoZSBzZWN0aW9uJ3Mgdm1hIGZyb20KLQl0aGUgcmVsb2MncyBvZmZzZXQgd2hlbiB3cml0aW5nIC5vJ3MuICBJbnN0ZWFkIGFkZCB0aGUgc2VjdGlvbidzCi0Jdm1hIHRvIHRoZSByZWxvYydzIG9mZnNldCB3aGVuIHdyaXRpbmcgYW4gZXhlY3V0YWJsZSBvciBzaGFyZWQKLQlsaWJyYXJ5LgotCi1UdWUgTm92IDIyIDIzOjM0OjM3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEbyBub3QgYWRkCi0JaW5wdXRfc2VjdGlvbi0+dm1hIHRvIHRoZSByZWxvY2F0aW9uJ3Mgb2Zmc2V0LgotCi1Nb24gTm92IDIxIDEyOjM3OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoc3JlY19jYW5vbmljYWxpemVfcmVsb2MpOiBEZWZpbmUuCi0JKHNyZWNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCShzcmVjX3ZlYywgc3ltYm9sc3JlY192ZWMpOiBVc2UgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzcmVjKS4KLQotU2F0IE5vdiAxOSAwMzoxMDo1MSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLXNvbGFyaXMqKTogIFVzZSBzb2xhcmlzMiB0bwotCWVuYWJsZSBleHRyYWN0aW9uIG9mIHByb2NmcyBpbmZvIGZyb20gY29yZSBmaWxlIGZvciBHREIuCi0KLVRodSBOb3YgMTcgMTc6Mzc6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCBuZXcgdmFsdWUgQkZEX1JFTE9DXzEyX1BDUkVMLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotVGh1IE5vdiAxNyAxMzoxMjowOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkL2VsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZWQpOiBVc2UgdGhlCi0Jdm1hIGZyb20gdGhlIG91dHB1dF9zZWN0aW9uIGNvbnRhaW5pbmcgJGdsb2JhbCQgd2hlbiBjb21wdXRpbmcKLQlnbG9iYWxfdmxhdWUuCi0KLVRodSBOb3YgMTcgMTQ6Mjk6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJvdW5kIHVwIHRoZSBhcmNoaXZlCi0JaGVhZGVyIHNpemUgb2YgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgdG8gYW4gZXZlbiBudW1iZXIuCi0KLVdlZCBOb3YgMTYgMTY6MDg6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jOiBEZWxldGVkIHNvbWUgY29kZSB0aGF0IHdhcyBjb21tZW50ZWQgb3V0IG9yIGluc2lkZQotCSIjaWYgMCIuCi0JKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmUuCi0KLQkqIGNwdS1zaC5jIChhcmNoX2luZm9fc3RydWN0KTogQ29udmVydCBuYW1lIHRvIGxvd2VyY2FzZSwgZm9yCi0JY29uc2lzdGVuY3kgd2l0aCBvdGhlciBhcmNoaXRlY3R1cmVzLgotCi1TYXQgTm92IDEyIDIzOjUwOjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfZXhwb3J0X3N5bWJvbCk6IEFsc28gZXhwb3J0IHN5bWJvbHMgd2hpY2ggYXJlCi0JcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgZmlsZS4KLQotRnJpIE5vdiAxMSAxNDoyOTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQKLQlleHBvcnRfZHluYW1pYyBhcmd1bWVudCwgYW5kIGhhbmRsZSBpdC4KLQkoZWxmX2V4cG9ydF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIE5vdiAxMSAxMDozNTozMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9zdHJ1Y3QpOiBEZWxldGUgaGFuZGxlcyBmb3IgdGhlCi0JZGF0YSwgcmVnIGFuZCBzdGFjayBzZWN0aW9ucy4gIFRoZXkncmUgbmV2ZXIgdXNlZC4gIERlbGV0ZQotCWFjY2Vzc29yIG1hY3Jvcy4KLQkobWFrZV9iZmRfYXNlY3Rpb24pOiBVc2UgYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgc2luY2UgZGVidWdnaW5nCi0JY29yZXMgZnJvbSBkeW5hbWljIGV4ZWN1dGFibGVzIG1heSBoYXZlIHNldmVyYWwgc2VjdGlvbnMgd2l0aCB0aGUKLQlzYW1lIGxvZ2ljYWwgbmFtZS4KLQkoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogRG9uJ3Qgc2F2ZSBoYW5kbGVzIHRvIGRhdGEsIHJlZyBhbmQKLQlzdGFjayBzZWN0aW9ucy4gIEhhbmRsZSBDT1JFX1RFWFQsIENPUkVfTU1GIGFuZCBDT1JFX1NITS4KLQotVHVlIE5vdiAgOCAxMzowMzozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoY2FsbGpfY2FsbGJhY2spOiBBZGQgbmV3IGFyZ3VtZW50IHNocmlua2luZy4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgSGFuZGxlIHJlbG9jcyBhZ2FpbnN0IHNlY3Rpb24gc3ltYm9scyBjb3JyZWN0bHkuICBJZiBub3QKLQlzaHJpbmtpbmcsIGRvbid0IHN1YnRyYWN0IG91dCBkc3RpZHg7IHRoZSBzdWJ0cmFjdGlvbiBpcyBhbHJlYWR5Ci0JaW4gdGhlIG9iamVjdCBmaWxlLgotCi1TdW4gTm92ICA2IDEyOjUyOjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaDogQ29uZGl0aW9uYWxseSBpbmNsdWRlIDxzaGwuaD4gYW5kIDxkbC5oPi4KLQotVGh1IE5vdiAgMyAxODoxOToxMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogSW5jbHVkZSBtNjhrbmV0YnNkLm8uCi0KLQkqIGNvbmZpZy9pMzg2bGludXgubWggKEVYVFJBTElCUyk6IEluY2x1ZGUgLWxtLgotCi0JUGF0Y2hlcyBmcm9tIERKIERlbG9yaWU6Ci0JKiBjb2ZmLWdvMzIuYzogUmVwbGFjZW1lbnQgZmlsZSwgdXNlcyBjb2ZmLWkzODYuYyB3aXRoIG1pbm9yCi0JY2hhbmdlcy4KLQkqIGNvZmYtaTM4Ni5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IGFsbG93IG90aGVyIGZpbGVzIHRvIG92ZXJyaWRlCi0JdW5kZXJzY29yZSBhbHNvCi0JKiBtYWtlZmlsZS5kb3M6IGRlbCBjdG9yLm8sIGFkZCBjb2ZmbGluay5vIGFuZCBlbGYzMi5vCi0KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljKTogSWYgdXNlciBzZXQgZGF0YSBzZWN0aW9uIHZtYSwgdXNlIGl0Ci0JdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGJzcyB2bWEuICBQYXRjaCBmcm9tIFRha2FkYSBIaXJvYWtpLAotCWhpcm9AaXMucy51LXRva3lvLmFjLmpwLgotCShtYWNoaW5lX3R5cGUsIGNhc2UgYmZkX2FyY2hfdmF4KTogU2V0ICp1bmtub3duIHRvIGZhbHNlLiAgUGF0Y2gKLQlmcm9tIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4uCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGIpOiBSZW5hbWUgbnMzMmtuZXRic2RfdmVjIHRvIHBjNTMybmV0YnNkX3ZlYywKLQlzaW5jZSB0aGF0J3Mgd2hhdCBpdCdzIGNhbGxlZC4KLQotV2VkIE5vdiAgMiAxNToyNDo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAobm9ybWFsaXplKTogQ2hhbmdlIHRvIHRha2UgYSBCRkQgYXMgYW4gYXJndW1lbnQuCi0JQ2hhbmdlIFZNUyB2ZXJzaW9uIHRvIHVzZSBiZmRfYWxsb2MgcmF0aGVyIHRoYW4gbWFsbG9jLCBzbyB0aGF0IHdlCi0JZG9uJ3QgbG9zZSB0aGUgbWVtb3J5IGZvcmV2ZXIuCi0JKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBDaGVjayB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlCi0JZW50cnkgd2hpY2ggaXMgbm90IGJlaW5nIGV4dGVuZGVkLCBhbmQgY29ycmVjdCBpdCBpZiBpdCBpcyB3cm9uZy4KLQlUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlIHRoZSBhcmNoaXZlIHdhcyBjb25zdHJ1Y3RlZCBieSBhbm90aGVyCi0JcHJvZ3JhbSB3aGljaCBwdXQgYW4gZW50cnkgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgd2hpY2ggd2UKLQlkb24ndCBwbGFuIHRvIHB1dCBpbiBvdXJzZWx2ZXMuICBGcm9tIGpqY0BqY2xhcmsuY29tIChKYW1lcwotCUNsYXJrKS4KLQkoYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIG5vcm1hbGl6ZS4KLQotTW9uIE9jdCAzMSAxNDoxOTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWhwcGEuYyAoRUxGMzJfUEFSSVNDX1NYX1NJWkUpOiBEZWZpbmUuCi0JKEVMRjMyX1BBUklTQ19TWF9HRVQsIEVMRjMyX1BBUklTQ19TWF9QVVQpOiBEZWZpbmUuCi0JKHN5bWV4dG5fZW50cnkpOiBEb24ndCBkZWZpbmUuCi0JKHN5bWV4dF9jaGFpbl9zaXplKTogQ2hhbmdlIHR5cGUgdG8gYmZkX3NpemVfdHlwZS4KLQkoc3ltZXh0bl9jb250ZW50cyk6IENoYW5nZSB0eXBlIHRvIGJmZF9ieXRlICouCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogVXNlCi0JRUxGMzJfUEFSSVNDX1NYX1NJWkUgaW5zdGVhZCBvZiBzaXplb2YgKHN5bWV4dF9lbnRyeVMpLgotCShlbGYzMl9ocHBhX3NpemVfc3ltZXh0KTogTGlrZXdpc2UuICBBbHNvLCBjaGFuZ2UgdHlwZSBvZiBzaXplcCB0bwotCWJmZF9zaXplX3R5cGUgKi4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IENhc3Qgc3ltZXh0bl9jb250ZW50cyBhc3NpZ25tZW50IHRvCi0JYmZkX2J5dGUgKi4gIFVzZSBFTEYzMl9QQVJJU0NfU1hfUFVUIGluc3RlYWQgb2YgZGlyZWN0IGFzc2lnbm1lbnQuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IFVzZQotCUVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQgb2Ygc2l6ZW9mIChzeW1leHRfZW50cnlTKS4gIFVzZQotCUVMRjMyX1BBUklTQ19TWF9HRVQgaW5zZXRhZCBvZiBkaXJlY3QgYXNzaWdubWVudC4KLQkoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogQ2hhbmdlIHR5cGUgb2YgY29udGVudHMsIGFuZCBpdHMKLQlhc3NpZ25tZW50IGNhc3QsIHRvIGJmZF9ieXRlICouICBVc2UgRUxGMzJfUEFSSVNDX1NYX1NJWkUgaW5zdGVhZAotCW9mIHNpemVvZiAoc3ltZXh0bl9lbnRyeSkuICBVc2Ugc3ltZXh0X2VudHJ5UyBpbnN0ZWFkIG9mCi0Jc3ltZXh0bl9lbnRyeS4gIFVzZSBFTEYzMl9QQVJJU0NfU1hfR0VUIGluc3RlYWQgb2YgZGlyZWN0Ci0JYXNzaWdubWVudC4KLQotCSogYXJjaGl2ZS5jIChiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUpOiBBZGQgdGhlIGFyIHBhZGRpbmcKLQljaGFyYWN0ZXIsIGlmIHRoZXJlIGlzIHJvb20gZm9yIGl0LCBldmVuIGlmIHRoZSBuYW1lIGlzIHRoZQotCW1heGltdW0gbGVuZ3RoLgotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogU29ydCB0aGUgRUxGCi0JaGVhZGVycyBieSBzZWN0aW9uIGFkZHJlc3Mgd2hlbiBhc3NpZ25pbmcgZmlsZSBwb3NpdGlvbnMuCi0JKGVsZl9zb3J0X2hkcnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1TdW4gT2N0IDMwIDE4OjU2OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENyZWF0ZSBEVF9JTklUCi0JYW5kIERUX0ZJTkkgZHluYW1pYyBlbnRyaWVzIGJhc2VkIG9uIHRoZSBleGlzdGVuY2Ugb2YgX2luaXQgYW5kCi0JX2Zpbmkgc3ltYm9scywgbm90IG9uIHRoZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMuICBUaGlzIGlzCi0JY29tcGF0aWJsZSB3aXRoIHNvbWUgU1ZSNCBsaW5rZXJzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotU2F0IE9jdCAyOSAxMjoxODoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbW92ZSBhCi0Jc3ltYm9sIHdpdGggYSBQTFQgZW50cnkgaW50byB0aGUgLnBsdCBzZWN0aW9uIGlmIGl0IGlzIGRlZmluZWQgaW4KLQlhIHJlZ3VsYXIgZmlsZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEl0J3Mgbm90IGFuCi0JZXJyb3IgaWYgYW4gZW1wdHkgYXJjaGl2ZSBoYXMgbm8gc3ltYm9sIHRhYmxlLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotRnJpIE9jdCAyOCAxMDowODo0MSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLSAgICAgICAgTmV0QlNEL202OGsgc3VwcG9ydCwgYmFzZWQgb24gd29yayBieSBtaWtlYkBzbm93LmRhdGFtZXRyaWNzLmNvbTogCi0JKiBjb25maWcuYmZkIChtNjgqLSotbmV0YnNkKik6IFVzZSBtNjhrLW5ic2QgYXMgYmZkX25hbWUuCi0JKiBjb25maWd1cmUuaW4gKG02OGtuZXRic2RfdmVjKTogQWRkZWQuCi0JKiB0YXJnZXRzLmMgKGJmZF9tNjhrbmV0YnNkX3ZlYyk6IEFkZGVkLgotCSogaG9zdHMvbTY4a25ic2QuaCwgY29uZmlnL202OGstbmJzZC5tdCwgbTY4a25ldGJzZC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMsIENGSUxFUyk6IEFkZCBtNjhrbmV0YnNkLmMuCi0KLQltaXNjZWxsYW5lb3VzIGNsZWFudXAgcmVxdWlyZWQgYnkgYWxsIG5ldGJzZCB0YXJnZXRzLCBiYXNlZCBvbiB3b3JrIAotCWJ5IEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+OgotCSogbmV0YnNkLmggKE5fTUFHSUMsIE5fU0VUX01BR0lDLCBOX0dFVE1BR0lDLCBOX0dFVE1BR0lDMiwgTl9UWFRBRERSLAotCSAgTl9UWFRPRkYsIE5fQUxJR04sIE5fREFUQUREUiwgTl9EQVRPRkYpOiBSZW1vdmVkLiAgR2VuZXJpYyBhLm91dAotCSAgZGVmaW5pdGlvbnMgd29yay4KLQkqIGkzODZuYnNkLmMsIG5zMzJrbmJzZC5jLCBzcGFyY25ic2QuYyAoX19MRFBHU1opOiBSZW1vdmVkLgotCSAgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBVc2UgTmV0QlNEJ3MgbWFnaWMgbnVtYmVycwotCi1UaHUgT2N0IDI3IDE2OjU5OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCBmaWVsZCBkeW5pbmR4LgotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IERvbid0IGZpbmFsaXplCi0JdGhlIC5keW5zeW0sIC5keW5zdHIgb3IgLmhhc2ggc2VjdGlvbnMgdW50aWwgYWZ0ZXIgdGhlIGJhY2tlbmQKLQlzaXplX2R5bmFtaWNfc2VjdGlvbnMgcm91dGluZSwgc28gdGhhdCBpdCBjYW4gYWRkIGR5bmFtaWMgc3ltYm9scwotCWlmIGl0IHdhbnRzIHRvLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBkZWZpbmUgdGhlCi0Jc3ltYm9sIHRvIGJlIGluIHRoZSAucGx0IHNlY3Rpb24gd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkKLQlpZiBpdCBpcyBhIGRlZmluZWQgc3ltYm9sLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIGFsbG9jYXRlIHNwYWNlIGZvciBhIGR5bmFtaWMgc3ltYm9sIGZvciBlYWNoIG91dHB1dAotCXNlY3Rpb24sIHN0b3JpbmcgdGhlIGluZGV4IGluIHRoZSBkeW5pbmR4IGZpZWxkIG9mIHRoZSBFTEYgc2VjdGlvbgotCWRhdGEuICBBZGp1c3QgdGhlIG90aGVyIGR5bmluZHggZmllbGRzIHRvIGFjY291bnQgZm9yIHRoaXMuCi0JKGVsZjMyX3NwYXJjX2FkanVzdF9keW5pbmR4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gY29weWluZyBhIHJlbG9jIGludG8gYSBzaGFyZWQKLQlsaWJyYXJ5LCB1c2UgdGhlIG9yaWdpbmFsIGFkZGVuZCBhcyBhcHByb3ByaWF0ZS4gIENvbnZlcnQgYW4KLQlSX1NQQVJDXzMyIHJlbG9jIGludG8gYW4gUl9TUEFSQ19SRUxBVElWRSByZWxvYy4gIFVzZSB0aGUgZHluYW1pYwotCXN5bWJvbCBpbmRleCBvZiB0aGUgb3V0cHV0IHNlY3Rpb24sIG5vdCB0aGUgbm9ybWFsIHN5bWJvbCBpbmRleC4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBkaWUgaWYgYSBzZWN0aW9uIGRvZXMKLQlub3QgZXhpc3Qgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgZHluYW1pYyB0YWdzLiAgV3JpdGUgb3V0Ci0JYSBkeW5hbWljIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbi4KLQotV2VkIE9jdCAyNiAwMToxNTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogRG9uJ3QgYm90aGVyIHRvIHJlYWQgb3Igd3JpdGUKLQl0aGUgcmVsb2NzIGlmIHRoZXJlIGFyZW4ndCBhbnkuCi0KLVR1ZSBPY3QgMjUgMTE6NDQ6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHRla2hleC5vLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IElmIFNFTEVDVF9WRUNTIGlzIG5vdCBkZWZpbmVkLAotCWluY2x1ZGUgdGVraGV4X3ZlYy4KLQkqIHRla2hleC5jIChOSUJCTEUsIElTSEVYKTogQ2FzdCBhcnJheSBhcmd1bWVudHMgdG8gdW5zaWduZWQgY2hhci4KLQkoZ2V0dmFsdWUsIGdldHN5bSwgb3V0KTogTGlrZXdpc2UuCi0JKGZpbmRfY2h1bmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHMuCi0JKGZpcnN0X3BoYXNlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzLgotCShwYXNzX292ZXIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGFkZHJlc3MuCi0JKHRla2hleF9vYmplY3RfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc2VjdGlvbi4KLQkobW92ZV9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIHJldHVybiB0eXBlIGZyb20gYm9vbGVhbiB0byB2b2lkLgotCSh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgdGRhdGEgYW5kCi0JbGlzdC4KLQotCSogbGlua2VyLmMgKGVudW0gbGlua19hY3Rpb24pOiBBZGQgQ0lORC4KLQkobGlua19hY3Rpb24pOiBDaGFuZ2UgQ09NTU9OX1JPV1xpbmRyIGZyb20gTURFRiB0byBDUkVGLiAgQ2hhbmdlCi0JSU5EUl9ST1dcY29tbW9uIGZyb20gTURFRiB0byBDSU5ELgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEluIENSRUYgY2FzZSwgaGFuZGxlIGFuCi0JZXhpc3Rpbmcgc3ltYm9sIHdoaWNoIGlzIGluZGlyZWN0IHJhdGhlciB0aGFuIGRlZmluZWQuICBBZGQgbmV3Ci0JQ0lORCBjYXNlLgotCi1Nb24gT2N0IDI0IDE1OjMzOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCUNoYW5nZSBTLXJlY29yZCBiYWNrZW5kIHRvIHVzZSBtdWx0aXBsZSBzZWN0aW9ucyB0byBoYW5kbGUgZ2FwcyBpbgotCWZpbGUuCi0JKiBzcmVjLmMgKHNyZWNfZGF0YV9saXN0X3N0cnVjdCk6IE1vdmUgZmllbGQgbmV4dCBmcm9tIGxhc3QgcGxhY2UKLQl0byBmaXJzdC4gIENoYW5nZSB0eXBlIG9mIGRhdGEgdG8gYmZkX2J5dGUgKi4KLQkoc3RydWN0IHNyZWNfc3ltYm9sKTogRGVmaW5lLgotCSh0ZGF0YV90eXBlKTogUmVtb3ZlIGRvbmVfc3ltYm9sX3JlYWQsIGNvdW50LCBzdHJpbmdzLCBzeW1ib2xfaWR4LAotCXN0cmluZ19zaXplLCBzdHJpbmdfaWR4LiAgQ2hhbmdlIHR5cGUgb2Ygc3ltYm9scyB0byBzdHJ1Y3QKLQlzcmVjX3N5bWJvbCAqLiAgQWRkIHN5bXRhaWwgYW5kIGNzeW1ib2xzLgotCShsb3csIGhpZ2gpOiBSZW1vdmUuCi0JKHNpemVfc3ltYm9scywgZmlsbHVwX3N5bWJvbHMsIHNpemVfc3JlYywgZmlsbHVwKTogUmVtb3ZlLgotCSh3aGl0ZSwgc2tpcHdoaXRlLCBwYXNzX292ZXIsIG9iamVjdF9wKTogUmVtb3ZlLgotCShzcmVjX21rb2JqZWN0KTogQ2FsbCBzcmVjX2luaXQuICBBZGp1c3QgdGRhdGEgaW5pdGlhbGl6YXRpb24gZm9yCi0JZmllbGQgY2hhbmdlcy4KLQkoc3JlY19nZXRfYnl0ZSwgc3JlY19iYWRfYnl0ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzcmVjX25ld19zeW1ib2wsIHNyZWNfc2Nhbik6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzcmVjX29iamVjdF9wKTogQ2hhbmdlIHR5cGUgb2YgYiB0byBiZmRfYnl0ZS4gIEV4cGxpY2l0bHkgc2V0Ci0Jd3JvbmdfZm9ybWF0IGVycm9yLiAgQ2FsbCBzcmVjX21rb2JqZWN0IGFuZCBzcmVjX3NjYW4gaW5zdGVhZCBvZgotCW9iamVjdF9wLgotCShzeW1ib2xzcmVjX29iamVjdF9wKTogTGlrZXdpc2UuICBBbHNvLCBjaGFuZ2UgYiB0byBiZSBvbmx5IHR3bwotCWJ5dGVzLgotCShzcmVjX3JlYWRfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBDYWxsIHNyZWNfcmVhZF9zZWN0aW9uIHJhdGhlciB0aGFuCi0JcGFzc19vdmVyLiAgSGFuZGxlIHplcm8gbGVuZ3RoIHNlY3Rpb24gY29ycmVjdGx5LgotCShzZXRfc2V0X2FyY2hfbWFjaCk6IENoYW5nZSBmcm9tIGZ1bmN0aW9uIHRvIG1hY3JvLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIGRhdGEgdG8gYmZkX2J5dGUgKi4KLQkoc3JlY193cml0ZV9yZWNvcmQpOiBDaGFuZ2UgZGF0YSwgZW5kIGFuZCBzcmMgdG8gYmZkX2J5dGUgKi4KLQkoc3JlY193cml0ZV9oZWFkZXIpOiBDaGFuZ2UgYnVmZmVyIGFuZCBkc3QgdG8gYmZkX2J5dGUgKi4KLQkoc3JlY193cml0ZV9zZWN0aW9uKTogQ2hhbmdlIGxvY2F0aW9uIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfdGVybWluYXRvcik6IENoYW5nZSBidWZmZXIgdG8gYmZkX2J5dGUgKi4KLQkoc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRG9uJ3QgY2FsbAotCXNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMuCi0JKHNyZWNfZ2V0X3N5bXRhYik6IFJld3JpdGUuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFNldCB1ZGF0YS5pIHRvIDAsIG5vdCBOVUxMLgotCi1GcmkgT2N0IDIxIDE2OjQzOjEzIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChtYWNoaW5lX3R5cGUpOiBhZGRlZCBNXzY4S19ORVRCU0QgYW5kIE1fU1BBUkNfTkVUQlNELgotCSogaTM4Nm5ldGJzZC5jLCBuczMya25ldGJzZC5jLCBzcGFyY25ldGJzZC5jOiByZW1vdmVkIFJDUyBJZCdzLgotCSAgY2hhbmdlZCBob3cgUEFHRV9TSVpFIGFuZCBTRUdNRU5UX1NJWkUgYXJlIGRlZmluZWQgc28gdGhleSBhcmUKLQkgIGNvbnNpc3RhbnQgd2l0aCBlYWNoIG90aGVyLgotCSogbmV0YnNkLmggKE5fSEVBREVSX0lOX1RFWFQsIFRFWFRfU1RBUlRfQUREUik6IE5ldEJTRCBmaXRzIGl0cwotCSAgaGVhZGVyIGludG8gdGhlIHN0YXJ0IG9mIGl0cyB0ZXh0IHNlZ21lbnQuCi0KLUZyaSBPY3QgMjEgMTc6MTM6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgY2FzZSBmb3IKLQlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuCi0JKGJmZF90YXJnZXQpOiBBZGQgX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZS4KLQkqIGFyY2hpdmUuYyAoX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IE5ldwotCWZ1bmN0aW9uLgotCShfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFJlbmFtZWQgYnkgYWRkaW5nIGEgbGVhZGluZwotCXVuZGVyc2NvcmUsIGFuZCBtYWRlIGV4dGVybmFsbHkgdmlzaWJsZS4gIEFkZGVkIHRyYWlsaW5nX3NsYXNoCi0JYXJndW1lbnQsIGFuZCB1c2VkIGl0IGluc3RlYWQgb2YgZWxmX3N0eWxlLiAgQ2hhbmdlZCB0eXBlIG9mCi0JdGFibGVuIHRvIGJmZF9zaXplX3R5cGUgKi4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogVXNlIEJGRF9TRU5EIHRvIGNhbGwKLQljb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZS4gIFVzZSB0aGUgcmV0dXJuZWQgbmFtZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVjbGFyZS4KLQkoX2JmZF9ub2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWNsYXJlLgotCShfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHNvbS5jIChzb21fY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogYW91dC10YXJnZXQuaCAoTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKToKLQlEZWZpbmUuCi0JKiBpZWVlLmMgKGllZWVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0KLQlGaXggdGhlIEVMRiBsaW5rZXIgdG8gbm90IHJlcXVpcmUgYW4gaW50ZXJwcmV0ZXIgaWYgbm8gZHluYW1pYwotCW9iamVjdHMgd2VyZSBzZWVuLCBldmVuIHdoZW4gbGlua2luZyBQSUMgY29kZS4KLQkqIGxpYmVsZi5oIChFTEZfTElOS19IQVNIX05FRURTX1BMVCk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZmllbGQgZHluYW1pY19zZWN0aW9uc19jcmVhdGVkLgotCSogZWxmY29kZS5oIChlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgZHluc3RyIGlmIGl0Ci0JZG9lc24ndCBhbHJlYWR5IGV4aXN0LgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDcmVhdGUgZHluYW1pYyBzZWN0aW9ucyBiYXNlZCBvbgotCWR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBmaWVsZCwgbm90IGR5bm9iaiBmaWVsZC4gIERvbid0IGJvdGhlciB0bwotCXNldCBkeW5vYmouCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgZHluYW1pYyBzZWN0aW9ucyB3ZXJlCi0JYWxyZWFkeSBjcmVhdGVkLCBkb24ndCBkbyBhbnl0aGluZy4gIElmIGR5bm9iaiBpcyBhbHJlYWR5IHNldCwgdXNlCi0JaXQ7IG90aGVyd2lzZSwgc2V0IGl0IHRvIHRoZSBiZmQgYXJndW1lbnQuICBEb24ndCBpbml0aWFsaXplCi0JZHluc3ltY291bnQuICBPbmx5IGNyZWF0ZSBkeW5zdHIgaWYgaXQgZG9lcyBub3QgZXhpc3QuICBTZXQKLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgdG8gdHJ1ZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBTa2lwIG1vc3Qgb2YgdGhpcyBmdW5jdGlvbgotCWlmIG5vIGR5bmFtaWMgb2JqZWN0cyB3ZXJlIHNlZW4uCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMgdGhlCi0JRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgZmxhZyBzZXQsIGxldCB0aGUgYmFja2VuZCBhZGp1c3QgaXQuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENoYW5nZSBtb3N0IGRlY2lzaW9ucyBiYXNlZCBvbiBkeW5vYmogdG8KLQljaGVjayBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgaW5zdGVhZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IE9ubHkgaGFuZGxlIGR5bmFtaWMgc3ltYm9scyBpZiBhIGR5bmFtaWMKLQlvYmplY3Qgd2FzIHNlZW4uCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIG5ldyBmaWVsZAotCWR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZC4gIFNldCBkeW5zeW1jb3VudCB0byAxLCBub3QgMC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsCi0JZWxmX2kzODZfY3JlYXRlX2dvdF9zZWN0aW9uIHJhdGhlciB0aGFuIGNyZWF0aW5nIHRoZSAuZ290IGFuZAotCS5nb3QucGx0IHNlY3Rpb25zLgotCShlbGZfaTM4Nl9jcmVhdGVfZ290X3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBKdXN0IGNhbGwgZWxmX2kzODZfY3JlYXRlX2dvdF9zZWN0aW9uIGlmCi0JYSBHT1QgdGFibGUgaXMgbmVlZGVkLCBub3QgYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JT25seSBjcmVhdGUgdGhlIC5yZWwuZ290IHNlY3Rpb24sIGFuZCBvbmx5IG1ha2Ugc3BhY2UgZm9yIGEgcmVsb2MsCi0JZm9yIGEgZ2xvYmFsIHN5bWJvbCBvciB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgRm9yIGEKLQlSXzM4Nl9QTFQzMiByZWxvYywganVzdCBzZXQgdGhlCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGZsYWcuCi0JKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJld29yayBpbml0aWFsIGFzc2VydGlvbiB0bwotCXBlcm1pdCBFTEZfTElOS19IQVNIX05FRURTX1BMVCBub24gZHluYW1pYyBzeW1ib2xzLiAgQ3JlYXRlIGEKLQlwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBmb3Igc3VjaCBzeW1ib2xzLiAgQnV0LCBpZiBubwotCWR5bmFtaWMgb2JqZWN0cyB3ZXJlIHNlZW4sIG5ldmVyIGNyZWF0ZSBhIFBMVCBlbnRyeS4KLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbm8gZHluYW1pYyBvYmplY3RzIHdlcmUgc2VlbiwKLQlza2lwIG1vc3Qgb2YgdGhpcyBmdW5jdGlvbiwgYW5kIGZvcmNlIHRoZSBzaXplIG9mIHRoZSAucmVsLmdvdAotCXNlY3Rpb24gdG8gemVyby4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBhIFJfMzg2X0dPVDMyIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwKLQlzeW1ib2wgd2hlbiBubyBkeW5hbWljIG9iamVjdCB3YXMgc2VlbiwgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLQl0aGUgLmdvdCBzZWN0aW9uLiAgRm9yIGEgUl8zODZfR09UMzIgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgb25seQotCWNyZWF0ZSBhIFJfMzg2X1JFTEFUSVZFIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCi0JVHJlYXQgYSBSXzM4Nl9QTFQzMiByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGZvciB3aGljaCB3ZSBkaWQgbm90Ci0JY3JlYXRlIGEgUExUIGVudHJ5IGFzIGEgUl8zODZfUEMzMiByZWxvYy4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGZpZGRsZSB3aXRoIHRoZSBkeW5hbWljCi0JZW50cmllcyBhbmQgdGhlIFBMVCBpZiB3ZSBzYXcgYSBkeW5hbWljIG9iamVjdC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IEZpeCBSX1NQQVJDX1BDMjIgYnkKLQlzZXR0aW5nIHJpZ2h0c2hpZnQgdG8gMTAuICBGaXggUl9TUEFSQ19XUExUMjAgYnkgc2V0dGluZwotCXJpZ2h0c2hpZnQgdG8gMiwgc2l6ZSB0byAyLCBiaXRzaXplIHRvIDMwLCBhbmQgZHN0X21hc2sgdG8KLQkweDNmZmZmZmZmLgotCShlbGYzMl9zcGFyY19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCB0aGUgc2l6ZSBvZiB0aGUKLQkucGx0IHNlY3Rpb24uICBDYWxsIGVsZjMyX3NwYXJjX2NyZWF0ZV9nb3Rfc2VjdGlvbiByYXRoZXIgdGhhbgotCWNyZWF0aW5nIHRoZSAuZ290IHNlY3Rpb24uCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IENhbGwgZWxmMzJfc3BhcmNfY3JlYXRlX2dvdF9zZWN0aW9uIGlmCi0JYSBHT1QgdGFibGUgaXMgbmVlZGVkLCBub3QgYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JT25seSBjcmVhdGUgdGhlIC5yZWxhLmdvdCBzZWN0aW9uLCBhbmQgb25seSBtYWtlIHNwYWNlIGZvciBhCi0JcmVsb2MsIGZvciBhIGdsb2JhbCBzeW1ib2wgb3Igd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4KLQlTZXQgdGhlIGFsaWdubWVudCBvZiB0aGUgLnJlbGEuZ290IHNlY3Rpb24gdG8gMi4gIEZvciBhCi0JUl9TUEFSQ19XUExUMzAgcmVsb2MsIGp1c3Qgc2V0IHRoZSBFTEZfTElOS19IQVNIX05FRURTX1BMVCBmbGFnLgotCShlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXdvcmsgaW5pdGlhbCBhc3NlcnRpb24gdG8KLQlwZXJtaXQgRUxGX0xJTktfSEFTSF9ORURTX1BMVCBub24gZHluYW1pYyBzeW1ib2xzLiAgQ3JlYXRlIGEKLQlwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBmb3Igc3VjaCBzeW1ib2xzLiAgQnV0LCBpZiBubyBkeW5hbWljCi0Jb2JqZWN0cyB3ZXJlIHNlZW4sIG5ldmVyIGNyZWF0ZSBhIFBMVCBlbnRyeS4gIEluaXRpYWxpemUgdGhlIHNpemUKLQlvZiB0aGUgLnBsdCBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBubyBkeW5hbWljIG9iamVjdHMgd2VyZQotCXNlZW4sIHNraXAgbW9zdCBvZiB0aGlzIGZ1bmN0aW9uLCBhbmQgZm9yY2UgdGhlIHNpemUgb2YgdGhlCi0JLnJlbGEuZ290IHNlY3Rpb24gdG8gemVyby4gIFN0cmlwIGVtcHR5IHJlbG9jIHNlY3Rpb25zLCBhbmQgc3RyaXAKLQlhbiBlbXB0eSAucGx0IHNlY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBHT1QgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbAotCXN5bWJvbCB3aGVuIG5vIGR5bmFtaWMgb2JqZWN0IHdhcyBzZWVuLCBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZgotCXRoZSAuZ290IHNlY3Rpb24uICBGb3IgYSBHT1QgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgb25seQotCWNyZWF0ZSBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4KLQlUcmVhdCBhIFJfU1BBUkNfV1BMVDMwIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZm9yIHdoaWNoIHdlIGRpZCBub3QKLQljcmVhdGUgYSBQTFQgZW50cnkgYXMgYSBSX1NQQVJDX1dESVNQMzAgcmVsb2MuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBmaWRkbGUgd2l0aCB0aGUKLQlkeW5hbWljIGVudHJpZXMgYW5kIHRoZSBQTFQgaWYgd2Ugc2F3IGEgZHluYW1pYyBvYmplY3QuCi0KLVRodSBPY3QgMjAgMTM6Mjg6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IERvbid0IHdvcnJ5IGFib3V0IHNlY3Rpb24gc3ltYm9scwotCWluIGEgc2VjdGlvbiBub3Qgb3duZWQgYnkgYW55IEJGRC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFNlcGFyYXRlIG91dCBsb29wIHdoaWNoIGNhbGxzCi0JYmFja2VuZCByb3V0aW5lLiAgQ2hlY2sgYmZkX3NlY3Rpb24gYW5kIGNhbGwgdGhlIGJhY2tlbmQgcm91dGluZQotCWV2ZW4gZm9yIGEgc2VjdGlvbiBub3Qgb3duZWQgYnkgYW55IEJGRC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogSGFuZGxlCi0JLmFjb21tb24gc2VjdGlvbi4KLQotV2VkIE9jdCAxOSAxMzoyODoyOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IE1ha2UgbmFtZXMgZm9yIHNlY3Rpb24gbnVtYmVyIGFuZAotCXN0b3JhZ2UgY2xhc3Mgc2xpZ2h0bHkgbW9yZSB2ZXJib3NlLiAgSXQncyBub3QgY2xlYXIgaG93IG1hbnkKLQljaGFyYWN0ZXJzIEkgY2FuIGp1c3RpZnkgdXNpbmcgdXAsIGJ1dCBiZWZvcmUgdGhpcyBjaGFuZ2UgdGhleQotCWJvdGggd2VyZSBhYmJyZXZpYXRlZCAic2MiIHdoaWNoIGlzIChJTUhPKSBjbGVhcmx5IHVuYWNjZXB0YWJsZS4KLQotV2VkIE9jdCAxOSAwMToyNjozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQgdGhlIGJhc2UgZmlsZQotCXBvc2l0aW9uIGZyb20gdGhlIGxvd2VzdCBzZWN0aW9uIFZNQSwgbm90IHRoZSBzdGFydCBhZGRyZXNzLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IHJldHVybiBhbiBlcnJvcgotCWlmIHRoZXJlIGFyZSBubyBzeW1ib2xzLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBMaWtld2lzZS4KLQotVHVlIE9jdCAxOCAxMjo1Njo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogT25seSBjb3B5Ci0Jc3ViZm9ybWF0IHRvIGFub3RoZXIgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIgZmlsZS4KLQotCSogYmluYXJ5LmM6IE5ldyBmaWxlIGZvciByYXcgYmluYXJ5IG91dHB1dCBmb3JtYXQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBZGQgYmluYXJ5Lm8uCi0JKENGSUxFUyk6IEFkZCBiaW5hcnkuYy4KLQkqIHRhcmdldHMuYyAoYmluYXJ5X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogSW5jbHVkZSBiaW5hcnlfdmVjLgotCi0JKiBzcmVjLmMgKHRkYXRhX3R5cGUpOiBBZGQgZmllbGQgdGFpbC4KLQkoc3JlY19ta29iamVjdCk6IEluaXRpYWxpemUgdGFpbC4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNvcnQgUyByZWNvcmQgbGlzdCBieSBhZGRyZXNzLgotCi1Nb24gT2N0IDE3IDExOjM4OjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBTb3J0IHRoZSBzeW1ib2xzIGludG8gYSBuZXcgYXJyYXksCi0JcmF0aGVyIHRoYW4gbWVzc2luZyB3aXRoIEVsZl9TeW1fRXh0cmEuICBTdG9yZSB0aGUgc3ltYm9sIGluZGV4IGluCi0JdGhlIHVkYXRhLmkgZmllbGQuCi0JKHN3YXBfb3V0X3N5bXMpOiBVc2Ugb3V0Ym91bmRfc3ltcyBhcyBhIHBvaW50ZXIgcmF0aGVyIHRoYW4gYXMgYW4KLQlhcnJheS4gIERvbid0IHdvcnJ5IGFib3V0IGVsZl9zeW1fbnVtLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfc3ltX2V4dHJhKTogRG9uJ3QgZGVmaW5lLgotCShFbGZfU3ltX0V4dHJhKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbW92ZSBzeW1fZXh0cmEgZmllbGQuCi0JKGVsZl9zeW1fZXh0cmEpOiBEb24ndCBkZWZpbmUuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVXNlCi0JdWRhdGEuaSByYXRoZXIgdGhhbiBlbGZfc3ltX2V4dHJhIGFycmF5LgotCi0JKiBzeW1zLmMgKGFzeW1ib2wpOiBDaGFuZ2UgdWRhdGEgZmllbGQgaW50byBhIHVuaW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpKTogVXNlIHVkYXRhLnAgcmF0aGVyCi0JdGhhbiBqdXN0IHVkYXRhLgotCSogYm91dC5jIChwZXJmb3JtX3NsaXApOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogTGlrZXdpc2UuCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX3BlcmZvcm1fc2xpcCk6IExpa2V3aXNlLgotCSogc3JlYy5jIChmaWxsdXBfc3ltYm9scyk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoZ2V0X2luZGV4KTogVXNlIHVkYXRhLmkgcmF0aGVyIHRoYW4ganVzdCB1ZGF0YS4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoc2V0X2luZGV4KTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zeW1faW5kZXgsIGVjb2ZmX3NldF9zeW1faW5kZXgpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChjb21wYXJlX3N5bXMpOiBMaWtld2lzZS4KLQkoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IExpa2V3aXNlLgotCShzb21fd3JpdGVfZml4dXBzKTogTGlrZXdpc2UuCi0KLQlVc2UgYSBoYXNoIHRhYmxlIHdoZW4gd3JpdGluZyBvdXQgRUxGIHN5bWJvbCBuYW1lcy4KLQkqIGVsZmNvZGUuaCAoZWxmX3N0cmluZ3RhYl9pbml0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX25ld19zdHJ0YWIsIGJmZF9hZGRfdG9fc3RydGFiLCBiZmRfYWRkXzJfdG9fc3RydGFiKTogUmVtb3ZlLgotCUNoYW5nZSBhbGwgY2FsbGVycyB0byB1c2UgZWxmX3N0cmluZ3RhYl9pbml0IG9yCi0JX2JmZF9zdHJpbmd0YWJfYWRkLCBhbmQgZ2V0IHN0cmluZ3RhYiBsZW5ndGhzIHVzaW5nCi0JX2JmZF9zdHJpbmd0YWJfc2l6ZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGFuZ2UgaWdub3JlZCBhcmd1bWVudCB0byBwb2ludGVyIHRvCi0JYm9vbGVhbiwgYW5kIHNldCB0aGUgYm9vbGVhbiB0byB0cnVlIGlmIGFuIGVycm9yIG9jY3Vycy4gIElmIGFuCi0JZXJyb3IgaGFzIGFscmVhZHkgb2NjdXJyZWQsIGRvbid0IGRvIGFueXRoaW5nLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogSnVzdCBzZXQgc2hfc2l6ZSwgbm90IGNvbnRlbnRzLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUGFzcyB0aGUgYWRkcmVzcyBvZiBhCi0JYm9vbGVhbiB0byBlbGZfZmFrZV9zZWN0aW9ucy4gIFBhc3MgdGhlIGFkZHJlc3Mgb2YgYQotCWJmZF9zdHJ0YWJfaGFzaCB0byBzd2FwX291dF9zeW1zLiAgV3JpdGUgb3V0IHRoZSAuc3RydGFiIHNlY3Rpb24uCi0JKHByZXBfaGVhZGVycyk6IENoYW5nZSBzaHN0cnRhYiB0byBiZmRfc3RydGFiX2hhc2guCi0JKHN3YXBfb3V0X3N5bXMpOiBUYWtlIGEgcG9pbnRlciB0byBhIGJmZF9zdHJ0YWJfaGFzaCBhcyBhbgotCWFyZ3VtZW50LiAgU2V0IGl0IHRvIHRoZSBzeW1ib2wgbmFtZXMuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogV3JpdGUgb3V0IHRoZSBzZWN0aW9uCi0JaGVhZGVyIG5hbWVzIHVzaW5nIF9iZmRfc3RyaW5ndGFiX2VtaXQuCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogUmVtb3ZlIGZpcnN0IGFyZ3VtZW50OyBnZXQgdGhlIHNlY3Rpb24gbmFtZQotCXZpYSB0aGUgYmZkX3NlY3Rpb24gcG9pbnRlci4gIENoYW5nZSBjYWxsZXIuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFdyaXRlIG91dCB0aGUgc3ltYm9sIG5hbWVzIHVzaW5nCi0JX2JmZF9zdHJpbmd0YWJfZW1pdC4gIExpa2V3aXNlIGZvciB0aGUgLmR5bnN0ciBzZWN0aW9uIGNvbnRlbnRzLgotCUZyZWUgdGhlIHN5bWJvbCBuYW1lcyBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogUmVtb3ZlIHRoZSBsYXN0IGFyZ3VtZW50LCBvdXRwdXRfbmFtZXMsCi0JZnJvbSByZWxvY2F0ZV9zZWN0aW9uLiAgU2F2ZSB0aGUgb2xkIHN5bWJvbCBjb250ZW50cyBiZWZvcmUKLQljYWxsaW5nIGVsZl9saW5rX291dHB1dF9zeW0sIGFuZCByZXN0b3JlIHRoZW0gYWZ0ZXJ3YXJkLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQ2hhbmdlIGR5bnN0ciBmaWVsZCB0bwotCXN0cnVjdCBiZmRfc3RydGFiX2hhc2guCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIGxhc3QgYXJndW1lbnQsIG91dHB1dF9uYW1lcywKLQlmcm9tIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0JKHN0cnVjdCBzdHJ0YWIpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQ2hhbmdlIHN0cnRhYl9wdHIgZmllbGQgdG8gc3RydWN0Ci0JYmZkX3N0cnRhYl9oYXNoLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgbGFzdAotCWFyZ3VtZW50LCBvdXRwdXRfbmFtZXMuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBsaWJiZmQtaW4uaCAoREVGQVVMVF9TVFJJTkdfU1BBQ0VfU0laRSk6IERvbid0IGRlZmluZS4KLQkoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpOiBEb24ndCBkZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuYyAoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpOiBSZW1vdmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfc2hkcl9pbik6IFVzZSBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuCi0JQ2xlYXIgY29udGVudHMgZmllbGQuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEluIFNIVF9TVFJUQUIgY2FzZSwgY2hlY2sgYmZkX3NlY3Rpb24sCi0Jbm90IHJhd2RhdGEuICBEb24ndCBzZXQgcmF3ZGF0YSBpZiBlX3Noc3RybmR4LiAgVXNlIGJmZF9zZWN0aW9uCi0JcmF0aGVyIHRoYW4gcmF3ZGF0YSBpbiBjb21tZW50ZWQgb3V0IGNvZGUuICBJbiBTSFRfUkVMW0FdIGNhc2UsCi0JZG9uJ3QgYm90aGVyIHRvIGNoZWNrIGVsZl9zZWN0aW9uX2RhdGEgb2Ygc2VjdGlvbiByZXR1cm5lZCBieQotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXguCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IGJmZF9zZWN0aW9uLCBub3QgcmF3ZGF0YS4gIERvbid0IHNldAotCXNpemUuCi0JKGVsZl9tYXBfc3ltYm9scyk6IERvbid0IHNldCBlbGZfbnVtX3NlY3Rpb25fc3ltcy4gIERvbid0IGNyZWF0ZQotCXNlY3Rpb24gc3ltYm9scyB0aGF0IGFscmVhZHkgZXhpc3QuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogVXNlIGJmZF9zZWN0aW9uLCBub3QgcmF3ZGF0YS4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IEp1c3QgY2hlY2sgYmZkX3NlY3Rpb24gZmllbGQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2RlYnVnX3NlY3Rpb24pOiBEb24ndCBwcmludCByYXdkYXRhLCBjb250ZW50cywgb3Igc2l6ZS4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgZXJyb3Igb3V0IGlmCi0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleCByZXR1cm5zIE5VTEwuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENoZWNrIHJldHVybiB2YWx1ZSBmcm9tCi0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBhZ2FpbnN0IE5VTEwsIG5vdCBiZmRfaXNfYWJzX3NlY3Rpb24uCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGNoZWNrIHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJuCi0JdmFsdWUuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW1vdmUgbnVtX3NlY3Rpb25fc3ltcyBmaWVsZC4KLQkoZWxmX251bV9zZWN0aW9uX3N5bXMpOiBEb24ndCBkZWZpbmUuCi0JKiBlbGYuYyAoZWxmX2dldF9zdHJfc2VjdGlvbik6IFN0b3JlIHNlY3Rpb24gY29udGVudHMgaW4gY29udGVudHMKLQlmaWVsZCByYXRoZXIgdGhhbiByYXdkYXRhIGZpZWxkLgotCShlbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IFN0b3JlIEJGRCBzZWN0aW9uIHBvaW50ZXIgaW4KLQliZmRfc2VjdGlvbiBmaWVsZCByYXRoZXIgdGhhbiByYXdkYXRhIGZpZWxkLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBVc2UgYmZkX3NlY3Rpb24KLQlyYXRoZXIgdGhhbiByYXdkYXRhLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogRG9uJ3Qgc2V0Ci0Jc3ltZXh0bl9oZHItPnNpemU7IGp1c3QgdXNlIHNoX3NpemUuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBVc2UgYmZkX3NlY3Rpb24KLQlyYXRoZXJuIHRoYW4gcmF3ZGF0YS4KLQkobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFJlbW92ZSByYXdkYXRhIGNoZWNrLgotCi0JKiBzcmVjLmMgKHBhc3Nfb3Zlcik6IFNldCB0aGUgc3RhcnQgYWRkcmVzcyBmb3IgUzcsIFM4IG9yIFM5LgotCi1GcmkgT2N0IDE0IDE5OjE1OjQ2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIFZFUlNJT046IFVwZGF0ZWQgdG8gMi41LgotCi1GcmkgT2N0IDE0IDExOjA3OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IENhc3QgZW5kIHRvIGJlIG5vbiBjb25zdCBiZWZvcmUgcGFzc2luZyBpdAotCXRvIHN0cnRvdWwuCi0KLVRodSBPY3QgMTMgMTQ6NDA6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogUGFzcyBlbmQgYXJndW1lbnQgb24gdG8gc3RydG91bC4KLQotV2VkIE9jdCAxMiAxNjo0Njo0MyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvcG5jbHMuYyAoYmZkX3JlYWxsb2MpOiBEZWxldGVkLCBzaW5jZSBpdCdzIGJyb2tlbiBhbmQgZml4aW5nIGl0Ci0Jd291bGQgbWFrZSBpdCBzbG93LiAgQmVzaWRlcywgaXQgaXNuJ3QgdXNlZCBtdWNoLgotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBBbHdheXMgYWxsb2NhdGUgbmV3IHN0b3JhZ2UgZm9yIHRoZQotCXN5bWJvbCB0YWJsZS4KLQotV2VkIE9jdCAxMiAxMTo1NDozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IE1hcmsgbG9jYWwgc3RQcm9jLCBzdExhYmVsIG9yCi0Jc3RhYnMgc3ltYm9scyBhcyBCU0ZfREVCVUdHSU5HLgotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IE1ha2UKLQlzdHIxIGFuZCBzdHIyIGNvbnN0IHBvaW50ZXJzLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFVzZSB0b3AgbGV2ZWwgaW5zdGFsbC5zaCBzY3JpcHQuCi0JKiBjb25maWcvUkVBRE1FIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2RlbHRhODgubWggKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NnY0Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg0Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg1Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL25jcnQzMDAwLm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCi1UdWUgT2N0IDExIDEzOjU3OjU2IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY0BhbmRhbnRlLmFpYi5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogTWFrZSBzdXJlIHRoYXQgYSBzeW1ib2wKLQl3aXRoIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBvciBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlCi0JZW50cnkgaXMgYWRkZWQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIGhhcwotCWFscmVhZHkgZ290dGVuIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnksIGNoYW5nZSB0aGUKLQlkZWZpbml0aW9uIHRvIHRoZSBQTFQgZW50cnkuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotVHVlIE9jdCAxMSAxNzoxMjowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGx5bngtY29yZS5jIChseW54X2NvcmVfZmlsZV9wKTogU1BBUkMgTHlueCBhcHBlYXJzIHRvIHN0YXJ0Ci0JZHVtcGluZyB0aGUgLmRhdGEgc2VjdGlvbiBpbiBhIGNvcmUgZmlsZSBhdCBhIHBhZ2UgYm91bmRhcnkuCi0KLU1vbiBPY3QgMTAgMTY6MjQ6NDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBDYXN0IGFyZ3VtZW50IHRvIGJmZF9oX3B1dF8zMgotCXRvIGNvcnJlY3QgdHlwZS4KLQkoY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IENhc3QgYXJndW1lbnQgdG8gYmZkX2hfZ2V0XzMyIHRvIGNvcnJlY3QKLQl0eXBlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQ2FzdCBhcmd1bWVudCB0bwotCWJmZF9lbGZfaGFzaCB0byBjb3JyZWN0IHR5cGUuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFRoZSBQQzEwLCBQQzIyLCBhbmQKLQlXUExUMzAgcmVsb2NhdGlvbnMgYXJlIFBDLXJlbGF0aXZlLgotCi1UaHUgT2N0ICA2IDEyOjU3OjI2IDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljKTogQ29ycmVjdGx5IGluaXRpYWxpemUgdm1hIGlmIHRoZSB2bWEgb2YKLQl0aGUgdGV4dCBzZWN0aW9uIHdhcyB1c2VyLWRlZmluZWQuCi0KLVdlZCBPY3QgIDUgMTQ6NDI6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFNWUjQgdXNlcyBzbGFzaAotCW5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBuYW1lLCBub3QganVzdCBuZXdsaW5lLgotCi1UdWUgT2N0ICA0IDExOjIzOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudAotCXBvd2VyIHRvIDQsIHJhdGhlciB0aGFuIHVzaW5nIGFsaWduX3Bvd2VyX21pbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRG9uJ3QgdXNlIGFsaWduX3Bvd2VyX21pbjsKLQl1c2UgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSIGluc3RlYWQuICBGb3JjZSB0aGUgLnN0YWIKLQlhbmQgLnN0YWJzdHIgc2VjdGlvbnMgdG8gYmUgYWxpZ25lZCB0byBubyBtb3JlIHRoYW4gMi4gIFJlbW92ZQotCUNPRkZfU1BBUkMgc3BlY2lhbCBjYXNlcy4KLQkqIGNvZmYtYTI5ay5jOiBEZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLgotCSogY29mZi1hcG9sbG8uYywgY29mZi1nbzMyLmMsIGNvZmYtaDgzMDAuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4NTAwLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmM6IExpa2V3aXNlLgotCSogY29mZi1tODhrLmMsIGNvZmYtcnM2MDAwLmMsIGNvZmYtc2guYywgY29mZi1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgY29uZmlnLmJmZC4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHRyeSB0byBjb252ZXJ0IGEgbG9uZwotCWZpbGVuYW1lIGlmIHRoZSBvZmZzZXQgZmllbGQgaXMgemVyby4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogSWYgdGhlIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wKLQl3YXMgbm90IHNldCwgdXNlIGEgc2Vuc2libGUgZGVmYXVsdCByYXRoZXIgdGhhbiB6ZXJvLgotCi1Nb24gT2N0ICAzIDE2OjA0OjI5IDE5OTQgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9jbG9zZSk6IEhvbm9yIHVtYXNrIHdoZW4gc2V0dGluZyBleGVjdXRpb24gYml0cy4KLQkoYmZkX2Nsb3NlX2FsbF9kb25lKTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgIDMgMDQ6NDE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBTZXQgU0VDX0hBU19DT05URU5UUyBmbGFnCi0JZm9yIC5zdGFjayBhbmQgLmxkaW5mbyBzZWN0aW9ucy4gQ2FzdCBjb3JlZGF0YS5jX3RhYiB0byBhCi0JZmlsZV9wdHIgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBnY2MuCi0KLUZyaSBTZXAgMzAgMTM6MTE6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFJlbW92ZSBhc3NlcnRpb24gd2hlbiBhIG5vbgotICAgICAgICBTRUNfSU5fTUVNT1JZIHNlY3Rpb24gaXMgZm91bmQgaW4gZHlub2JqLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4KLQlsaW5raW5nIFBJQyBjb21waWxlZCBjb2RlLgotCi1UaHUgU2VwIDI5IDE1OjIxOjQ0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBDaGFuZ2UgdHlwZSBvZiAiZGF0YSIgdG8KLQliZmRfYnl0ZSAqLCB0byBnbyBhbG9uZyB3aXRoIHllc3RlcmRheSdzIGNoYW5nZS4KLQotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogTW92ZWQgaGVyZSBmcm9tIGVsZl9wcmludF9zeW1ib2wKLQlpbiBlbGZjb2RlLmguICAoY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbCk6IFByaW50IHN5bWJvbCdzIHNpemUKLQlmaWVsZCwgZXhjZXB0IGZvciBjb21tb24gc3ltYm9sczsgcHJpbnQgdGhlaXIgYWxpZ25tZW50LgotCSogZWxmY29kZS5oIChlbGZfcHJpbnRfc3ltYm9sKTogRGVsZXRlZC4KLQkqIGxpYmVsZi5oIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IERlY2xhcmUuCi0JKGJmZF9lbGZ7MzIsNjR9X3ByaW50X3N5bWJvbCk6IFJlcGxhY2UgZGVjbGFyYXRpb25zIHdpdGggbWFjcm9zLgotCi0JKiBzeW1zLmMgKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBTaG93IEJTRl9MT0NBTCBhbmQgQlNGX0dMT0JBTAotCWluIG9uZSBjb2x1bW4uICBVc2UgdGhlIGNvbHVtbiBmcmVlZCB1cCB0byBzaG93IEJTRl9GVU5DVElPTiBhbmQKLQlCU0ZfRklMRS4KLQotVGh1IFNlcCAyOSAxMjoyOTowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHN5bXMuYyAoc3R0KTogQWRkIC5yZGF0YSBhbmQgLnJvZGF0YS4KLQotV2VkIFNlcCAyOCAxMzozNTowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBDYXN0IGRhdGFfc3RhcnQgdG8gYmZkX2J5dGUgKgotCWJlZm9yZSB0cnlpbmcgdG8gYWRkIHZhbHVlcyB0byBpdC4KLQotVHVlIFNlcCAyNyAxNjo0Nzo1OCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogQ2FzdAotCXJldHVybiB2YWx1ZSBmcm9tIGVsZl9zeW1fZXh0cmEuCi0JKGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tIGJmZF96YWxsb2MuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20gbWFsbG9jLgotCi0JKiBnZW4tYW91dC5jIChtYWluKTogRGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSAiYXJjaCIuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENhc3QgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2hhc2hfYWxsb2NhdGUuCi0KLQkqIHJpc2NpeC5jIChyaXNjaXhfY2FsbGJhY2spOiBVc2UgUEFSQU1TIG1hY3JvIGluIHByb3RvdHlwZS4KLQotCSogcmVsb2MuYyAoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IE5ldyBmdW5jdGlvbiwgbW9zdGx5IGNvcGllZAotCWZyb20gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgYWRqdXN0ZWQgZm9yIHRoZSBhc3NlbWJsZXIncyBuZWVkcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBTZXAgMjYgMTE6MDA6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gdGhlCi0Jc2VjdGlvbiBWTUEgYW5kIHRoZSBmaWxlIHBvc2l0aW9uIGV2ZW4gaWYgRF9QQUdFRCBpcyBub3Qgc2V0LgotCi0JKiBiZmQtaW4uaCAoYmZkX3NlZWspOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gbm90IG1hcmsgZnAgY29uc3QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuYyAoYmZkX3NlZWspOiBEb24ndCBtYXJrIHBhcmFtZXRlcnMgY29uc3QsIHRvIGF2b2lkCi0JY29uZmxpY3RzIHdpdGggZGVjbGFyYXRpb24uCi0KLUZyaSBTZXAgMjMgMTU6MTU6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogRG9uJ3QgYWJvcnQgaWYgd2UgYWxsb2NhdGVkCi0JdG9vIG11Y2ggc3BhY2UgZm9yIHRoZSBwcm9ncmFtIGhlYWRlciwgb25seSBpZiB3ZSBhbGxvY2F0ZWQgdG9vCi0JbGl0dGxlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFNpbWlsYXIgY2hhbmdlLgotCi1UdWUgU2VwIDIwIDEzOjE3OjA3IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oOiBGaXggY29tbWVudC4KLQkqIG5zMzJrbmJzZC5oOiBDaGFuZ2VkIE1fTlMzMktfTkVUQlNEIHRvIE1fNTMyX05FVEJTRCB0byBtYXRjaAotCSAgbGliYW91dC5oLgotCi1UdWUgU2VwIDIwIDE1OjIzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBzcGFyY25ldGJzZC5vLgotCShDRklMRVMpOiBBZGQgbnMzMmtuZXRic2QuYyBhbmQgc3BhcmNuZXRic2QuYy4KLQkqIHRhcmdldHMuYzogbnMzMmtuZXRic2RfdmVjIHdhcyByZW5hbWVkIHRvIHBjNTMybmV0YnNkX3ZlYy4KLQotCSogY29mZi1zaC5jIChydHlwZTJob3d0byk6IFJlbW92ZTsgdW51c2VkLgotCShjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIHJzdGF0LgotCShyZWxvY19wcm9jZXNzaW5nKTogQ29tbWVudCBvdXQ7IHVudXNlZC4KLQotRnJpIFNlcCAxNiAxMjoxMjoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBJZiBoLT5pbmR4IGlzIC0yLCB0aGVuCi0JYWx3YXlzIHdyaXRlIGl0IG91dCBldmVuIGlmIGl0IHdvdWxkIG5vcm1hbGx5IGJlIHN0cmlwcGVkLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBJZiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhCi0Jc3RyaXBwZWQgZ2xvYmFsIHN5bWJvbCwgZm9yY2UgaXQgdG8gYmUgd3JpdHRlbiBvdXQgcmF0aGVyIHRoYW4KLQltZXJlbHkgY2FsbGluZyB1bmF0dGFjaGVkX3JlbG9jLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAxNCAxNTozNzoxOSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKHN0cnVjdCBzb21kYXRhKTogTmV3IGZpZWxkIHNvcnRlZF9zeW1zLgotCShvYmpfc29tX3NvcnRlZF9zeW1zKTogQWNjZXNzb3IgbWFjcm8uCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IEluaXRpYWxpemUgc29ydGVkX3N5bXMgdG8gTlVMTC4KLQkoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IFNvcnQgYSBjb3B5IG9mIHRoZSBCRkQncyBzeW1ib2wgdGFibGU7Ci0Jc3RvcmUgdGhlIHNvcnRlZCBzeW1ib2wgdGFibGUgaW4gc29ydGVkX3N5bXMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBJbml0YWxpemUgdG1wX3JlbG9jIHRvIE5VTEwgdG8gbWFrZSBHQ0MgaGFwcHkuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogU2ltaWxhcmx5IGZvciBleGVjX2hlYWRlci4gIFBhc3MgdGhlIHNvcnRlZAotCXN5bWJvbCB0YWJsZSB0byBzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MuCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogVXNlIHRoZSBzb3J0ZWQgc3ltYm9scyByYXRoZXIKLQl0aGFuIHRoZSBjYW5vbmljYWwgc3ltYm9sIHRhYmxlLgotCi0JKiBzb20uaCAoc29tX3N5bWJvbF90eXBlKTogQWRkICJzdHJpbmd0YWJfb2Zmc2V0IiBmaWVsZC4KLQkqIHNvbS5jIChzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBVc2UgInN0cmluZ3RhYl9vZmZzZXQiCi0JcmF0aGVyIHRoYW4gZGVzdHJveWluZyB0aGUgIm5hbWUiIGZpZWxkIGluIHRoZSBCRkQgc3ltYm9sLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCi1XZWQgU2VwIDE0IDE1OjA2OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBSZW5hbWUgc2tpcF9pbmRpcmVjdCB0bwotCXNraXBfbmV4dC4gIElmIHdlIGZpbmQgYW4gTl9XQVJOSU5HIHN5bWJvbCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuCi0Jd3JpdHRlbiBvdXQsIHNldCBza2lwX25leHQuCi0KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl90ZGF0YSk6IEFkZCBmaWVsZCBmaW5kX2J1ZmZlci4KLQkqIGVjb2ZmLmM6IEluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgotCShlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEhhbmRsZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEtlZXAgYSBzeW1ib2wgbWFya2VkIGFzIHdlYWsKLQlldmVuIGlmIGl0IGlzIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBvYmplY3QuCi0KLVR1ZSBTZXAgMTMgMTc6NTc6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fZml4dXBfZm9ybWF0cyk6IENhc2UgUl9FTlRSWSAoMHhiMyksIHNldCBib3RoCi0JJ1QnIGFuZCAnVScgdG8gZ3JhYiBhbGwgdGhlIHVud2luZCBpbmZvcm1hdGlvbi4KLQkoc29tX3NldF9yZWxvY19pbmZvKTogTWFrZSAnVScgdW53aW5kIGJpdHMgcGVyc2lzdCBhY3Jvc3MKLQltdWx0aXBsZSBTT00gcmVsb2NhdGlvbnMuICBTZXQgdGhlIGFkZGVuZCBmaWVsZCBvZiBhbiBSX0VOVFJZCi0JcmVsb2NhdGlvbiB0byB0aGUgdmFsdWUgaW4gJ1QnOyBzZXQgdGhlIGFkZGVuZCBmaWVsZCBvbiBhbgotCVJfRVhJVCByZWxvY2F0aW9uIHRvIHRoZSB2YWx1ZSBpbiAnVScuCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX3R5cGUpOiBEZWxldGUgdW53aW5kIGZpZWxkLgotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEZvciBSX0VOVFJZIGZpeHVwcywgZ2V0IDMyYml0cyBvZgotCXVud2luZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhZGRlbmQgZmllbGQgb2YgdGhlIFJfRU5UUlksIGdldCB0aGUKLQlvdGhlciAzMmJpdHMgZnJvbSB0aGUgYWRkZW5kIGZpZWxkIG9mIHRoZSBSX0VYSVQuCi0JKGJmZF9zb21fYXR0YWNoX3Vud2luZF9pbmZvKTogRGVsZXRlIGZ1bmN0aW9uIGFuZCBhbGwgcmVmZXJlbmNlcy4KLQotCSogc29tLmggKHNvbV9zeW1ib2xfdHlwZSk6IERlbGV0ZSB1bnVzZWQgYS5vdXQtcmVsYXRlZCBmaWVsZHMuCi0KLQkqIHNvbS5jIChiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBVc2UgYmZkX2Fic19zZWN0aW9uX3B0cgotCWluc3RlYWQgb2YgJmJmZF9hYnNfc2VjdGlvbi4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBIYW5kbGUgZXhlY19lbnRyeSBhbmQgZXhlY19mbGFncyBiZWluZwotCXN3aXRjaGVkIGluIGV4ZWN1dGFibGVzIGNyZWF0ZWQgYnkgdGhlIE9TRjEgbGlua2VyLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfRVhJVCBqdXN0IGxpa2UgdGhlIFJfe0YsTCxSfVNFTAotCWZpeHVwcy4gIFN1cHBvcnQgUl9BTFRfRU5UUlkgKGhhbmRsZSBqdXN0IGxpa2UgUl9FWElUKS4KLQotVHVlIFNlcCAxMyAxNjowNDowNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogc3ltZW50X2Jhc2UgaXMgdW5zaWduZWQKLQlzbyBjYW4ndCBjb21wYXJlIC12ZSBudW1iZXJzIHdpdGggaXQuCi0KLU1vbiBTZXAgMTIgMjA6MzE6MTcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChzaGNvZmZfdmVjKTogVXNlIGNvZmZsaW5rLm8gbm93LgotCSogY29mZi1zaC5jOiBSZXdyaXR0ZW4gdG8gdXNlIG5ldyBmYXN0IGNvZmYgYmFja2VuZC4KLQotVHVlIFNlcCAxMyAxNjoyMzo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGFzc3VtZSB0aGF0IGFsbCB0aGUgaW5wdXQKLSAgICAgICAgZmlsZXMgYXJlIGEub3V0LgotCi1UdWUgU2VwIDEzIDExOjA5OjM5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotbmV0YnNkKTogdXNlIHNwYXJjbmJzZC4KLQkgIChuczMyay0qLW5ldGJzZCk6IHVzZSBuczMya25ic2QuCi0KLQkqIGhvc3RzL3tuYnNkLGkzODZuYnNkLG5zMzJrbmJzZCxzcGFyY25ic2R9Lmg6IE5ldyBmaWxlcywgTmV0QlNECi0JICBob3N0IHN1cHBvcnQuCi0KLQkqIHNwYXJjbmV0YnNkLmM6IE5ldyBmaWxlLCBhZGRzIHN1cHBvcnQgZm9yIE5ldEJTRC9zcGFyYy4KLQkqIGNvbmZpZy9zcGFyYy1uYnNkLm10OiBMaWtld2lzZS4KLQotCSogbmV0YnNkLmg6IE5ldyBmaWxlLCBkZWZpbml0aW9ucyBjb21tb24gdG8gYWxsIG5ldGJzZCBwb3J0cy4KLQkqIGkzODZuZXRic2QuYzogVXNlIGl0LgotICAgICAgICAqIG5zMzJrbmV0YnNkLmM6IFVzZSBpdC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jLCBjb25maWcvaTM4Ni1uYnNkLm10LAotCSAgY29uZmlnL25zMzJrLW5ic2QubXQ6IGNhbm9uaWNhbGl6ZSBuZXRic2QgdGFyZ2V0cyB0byBjb25mb3JtIHRvCi0JICBmaWxlL3ZhcmlhYmxlIG5hbWluZyBjb252ZW50aW9ucy4KLQkqIGkzODZuZXRic2QuYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBuZXRic2QzODYuYy4KLQkqIG5zMzJrbmV0YnNkLmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gbmV0YnNkNTMyLmMuCi0JCi1Nb24gU2VwIDEyIDIxOjU2OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3JlbG9jX3NraXApOiBDb3JyZWN0IG9mZi1ieS1vbmUgZXJyb3IgZm9yIDQtYnl0ZQotCVJfTk9fUkVMT0NBVElPTiBmaXh1cHMuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJldHVybiB0aGUgYWJzb2x1dGUgc2VjdGlvbiBpZiB0aGUKLQlzeW1ib2wgaXNuJ3QgY29udGFpbmVkIGluIGFueSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNUX1BSSV9QUk9HIGFuZCBTVF9TRUNfUFJPRyBzeW1ib2xzIGFyZQotCW5vdCBmdW5jdGlvbiBzeW1ib2xzICh0aGV5IGFyZSBtYWdpYyBjb2RlIGxhYmVscyB3aGljaCAqY2FuKiBiZSB0aGUKLQl0YXJnZXRzIG9mIGNyb3NzIHNwYWNlIGJyYW5jaGVzKS4gICRTVEFSVCQgaXMgbm90IGEgc2VjdGlvbiBzeW1ib2wuCi0KLU1vbiBTZXAgMTIgMTE6NDM6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IEFkZCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEKLQl0byBzZWN0aW9uX2ZsYWdzLgotCSogY29mZi1taXBzLmMgKGVjb2ZmX2xpdHRsZV92ZWMsIGVjb2ZmX2JpZ192ZWMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogU2V0IHRoZSB0eXBlIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wKLQl0byBTVFRfRlVOQyBpZiB0aGUgQlNGX0ZVTkNUSU9OIGZsYWcgaXMgc2V0LgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgcl9zeW1uZHggaXMgLTEsIGRvbid0Ci0JY2hhbmdlIGl0LgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgcl9zeW1uZHggaXMgLTEsIGl0IGlzIGFuCi0JYWJzb2x1dGUgcmVsb2MuICBEb24ndCBkdW1wIGNvcmUgdXNpbmcgcl9zeW1uZHggYXMgYW4gYXJyYXkgaW5kZXguCi0JKiBjZi1tNjhrbHlueC5jIChjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIChjb3B5IG9mIGZ1bmN0aW9uIGluCi0JY29mZi1pMzg2LmMpLgotCShjb2ZmX202OGtfbHlueHJ0eXBlX3RvX2hvd3RvKTogc3ltIGFyZ3VtZW50IG1heSBiZSBOVUxMLgotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IExpa2V3aXNlLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIGFuIHJfc3ltbmR4Ci0JdmFsdWUgb2YgLTEsIG1lYW5pbmcgYW4gYWJzb2x1dGUgcmVsb2MuCi0KLQkqIGN0b3IuYzogUmVtb3ZlOyBvYnNvbGV0ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBSZW1vdmUgY3Rvci5vLgotCShDRklMRVMpOiBSZW1vdmUgY3Rvci5jLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBTZXAgMTIgMDE6NTg6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgdGhlcmUgd2FzIGEgbGluawotCWVycm9yIG9mIHNvbWUgc29ydCAoZm9yIGV4YW1wbGUsIHVuZGVmaW5lZCBzeW1ib2xzKSwgdGhlbiBkbyBub3QKLQlhcHBseSBhbnkgcmVsb2NzLCBqdXN0IG5vdGlmeSB0aGUgdXNlciBvZiB0aGUgZXJyb3JzLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IERvIG5vdCBidWlsZCBhIHN5bWJvbAotCWV4dGVuc2lvbiBzZWN0aW9uIGZvciBhbiBleGVjdXRhYmxlIChpdCdzIHVzZWxlc3MpLgotCShlbGYzMl9ocHBhX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogRG8gbm90aGluZyBpZiB0aGVyZSB3YXMgYQotCWxpbmsgZXJyb3Igb2Ygc29tZSBzb3J0IChmb3IgZXhhbXBsZSwgdW5kZWZpbmVkIHN5bWJvbHMpLgotCShlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBLbHVkZ2UuICBUdXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTCi0JZm9yIGFsbCB0aGUgaW5wdXQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucyB0byBrZWVwIHRoZSBnZW5lcmljCi0JQkZEIGNvZGUgaGFwcHkuICBUZW1wb3JhcmlseSB0dXJuIGl0IG9uIHRvIHJlYWQgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4KLQotU3VuIFNlcCAxMSAyMTo1ODo1OSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL2hwcGFvc2YubWggKFJBTkxJQik6IERvIG5vdCBzZXQuCi0JKiBjb25maWcvaHBwYWJzZC5taCAoUkFOTElCKTogTGlrZXdpc2UuCi0KLVN1biBTZXAgMTEgMjI6NTA6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjZi1pMzg2bHlueC5jOiBSZW1vdmUgI2lmIDAgY29kZS4KLQkoaTM4Nl9seW54b3NfY29mZl9vYmplY3RfcCk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWZpbmUuCi0JKGx5bnhfbGlua19hZGRfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSWYKLQljb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMgZGVmaW5lZCwgb25seSBkZWZpbmUgdGhpcyBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMsIGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogSGFuZGxlCi0JYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIgZXhwbGljaXRseSwgcmF0aGVyIHRoYW4gdmlhCi0JX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0JKHNldF9zeW1ib2xfZnJvbV9oYXNoKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCV9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wuCi0JKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBTeW1ib2wgc2V0dGluZyBjb2RlIG1vdmVkCi0JdG8gc2V0X3N5bWJvbF9mcm9tX2hhc2g7IGNhbGwgaXQuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IEFkZCBnZW5lcmljX2xpbmtlciBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuICBJZiBmYWxzZSwgc2V0IHRoZSBnZW5lcmljIHN5bWJvbHMgYmFzZWQgb24KLQl0aGUgaGFzaCB0YWJsZSBlbnRyaWVzLgotCi1GcmkgU2VwICA5IDExOjUxOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9zeW10YWIpOiBSZWluZGVudGVkLiAgUmVtb3ZlZCBjb21tZW50ZWQgb3V0Ci0JY2FsbCB0byBiZmRfY29uc3RydWN0b3JfZW50cnkuCi0KLQlDb252ZXJ0IG02OGsgQ09GRiB0byB1c2UgbmV3IENPRkYgYmFja2VuZCBsaW5rZXIuCi0JKiBjb2ZmLW02OGsuYyAoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZS4KLQkoY29mZl9tNjhrX2x5bnhfcnR5cGVfdG9faG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlndXJlLmluIChtNjhrY29mZl92ZWMpOiBCdWlsZCBjb2ZmbGluay5vLgotCShtNjhrY29mZnVuX3ZlYywgbTY4a2x5bnhfY29mZl92ZWMpOiBMaWtld2lzZS4KLQotVGh1IFNlcCAgOCAxNjoyMDozOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNhc2UgUkVMQllURSk6IEZsYWcKLQlvdmVyZmxvd3MgY29ycmVjdGx5LgotCi1XZWQgU2VwICA3IDE5OjAxOjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQ2hhbmdlIHNlY29uZCBhcmd1bWVudCBvZgotCWVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vayB0byBib29sZWFuLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsaW5rZXIgZmllbGQuCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogUGFzcyB2YWx1ZSBvZgotCXRkYXRhIGxpbmtlciBmaWVsZCB0byBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLCByYXRoZXIgdGhhbiBOVUxMLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBjYWxsIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vay4gIFNldAotCXRkYXRhIGxpbmtlciBmaWVsZCB0byB0cnVlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogQ2hhbmdlIHR5cGUgb2YKLQlzZWNvbmQgYXJndW1lbnQgdG8gYm9vbGVhbi4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCUxpa2V3aXNlLgotCi0JKiBjb2ZmLWdvMzIuYyAoUlRZUEUySE9XVE8pOiBGdWxseSBwYXJlbnRoZXNpemUgYXJndW1lbnRzLgotCSogY29mZi1pOTYwLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW04OGsuYyAoUlRZUEUySE9XVE8pOiBMaWtld2lzZS4KLQkqIGNvZmYtd2UzMmsuYyAoUlRZUEUySE9XVE8pOiBMaWtld2lzZS4KLQotCU1ha2UgaTM4NiBDT0ZGIHVzZSBuZXcgQ09GRiBiYWNrZW5kIGxpbmtlci4KLQkqIGNvZmYtaTM4Ni5jIChSVFlQRTJIT1dUTyk6IEZ1bGx5IHBhcmVudGhlc2l6ZSBhcmd1bWVudHMuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlndXJlLmluIChpMzg2Y29mZl92ZWMpOiBVc2UgY29mZmxpbmsuby4KLQkoaTM4Nmx5bnhfY29mZl92ZWMpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9ydHlwZV90b19ob3d0by4KLQkoYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUuCi0JKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUgdG8gdXNlIFJUWVBFMkhPV1RPLCBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEFsbG9jYXRlIHNlY3Rpb25fY291bnQgKyAxCi0Jc2VjdGlvbl9pbmZvIHN0cnVjdHVyZXMsIHNpbmNlIHRoZSB0YXJnZXRfaW5kZXggaXMgMSBiYXNlZC4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IFNldCAqc2VjcHAgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciBmb3IgYQotCWNvbW1vbiBzeW1ib2wuICBBZGp1c3QgcmVsX2hhc2ggYnkgdGhlIG91dHB1dCByZWxvYyBjb3VudC4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmNvZmYtaW4uaCAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLVR1ZSBTZXAgIDYgMjM6Mjg6NTIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogVHJlYXQgdW5kZWZpbmVkIGNvZGUKLQlzeW1ib2xzIGFuZCB1bmRlZmluZWQgc3ltYm9scyB3aGljaCBubyB0eXBlIGluIHRoZSBzYW1lIG1hbm5lcgotCWlmIHRoZSBhc3NvY2lhdGVkIEJGRCBzeW1ib2wgaGFzIEJTRl9GVU5DVElPTiBzZXQuICBGb3IgYSBkZWZpbmVkCi0Jc3ltYm9sIHdoaWNoIG5vIHR5cGUsIHNlbGVjdCBhIFNPTSB0eXBlIGJhc2VkIG9uIHRoZSBmbGFncyBvZiB0aGUKLQlzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC4KLQkoc29tX3NsdXJwX3N5bWJvbF90eXBlKTogU2V0IEJTRl9GVU5DVElPTiBmb3IgdW5kZWZpbmVkIFNUX1NUVUIKLQlvciBTVF9DT0RFIHN5bWJvbHMgKGltcG9ydGluZyBhIG5vbi1mdW5jdGlvbiBjb2RlIHN5bWJvbCBpcwotCW1lYW5pbmdsZXNzIGluIFNPTSkuCi0JKHNvbV9zZXRfcmVsb2NfaW5mbyk6IERvbid0IHNldCAib2Zmc2V0IiB0byB0aGUgc2VjdGlvbidzIHZtYTsgaXQKLQlzaG91bGQgYWx3YXlzIHN0YXJ0IGF0IHplcm8uCi0KLVR1ZSBTZXAgIDYgMTQ6NTE6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JQWRkIG5ldyBzdHlsZSBsaW5rZXIgc3VwcG9ydCB0byBDT0ZGIGJhY2tlbmQuICBhMjlrIG9ubHkgZm9yIG5vdy4KLQkqIGNvZmZsaW5rLmM6IE5ldyBmaWxlLgotCSogbGliY29mZi1pbi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcywgb2JqX2NvZmZfc3RyaW5ncyk6IERlZmluZSBhY2Nlc3NvciBtYWNyby4KLQkob2JqX2NvZmZfc3ltX2hhc2hlcyk6IERlZmluZSBhY2Nlc3NvciBtYWNyby4KLQkoc3RydWN0IGNvZmZfdGRhdGEpOiBBZGQgZmllbGRzIGV4dGVybmFsX3N5bXMsIHN0cmluZ3MsIGFuZAotCXN5bV9oYXNoZXMuCi0JKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShjb2ZmX2xpbmtfaGFzaF9sb29rdXAsIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lLgotCShjb2ZmX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMsIF9iZmRfY29mZl9maW5hbF9saW5rKTogRGVjbGFyZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgX2JmZF9yZWxzeiwKLQlfYmZkX2NvZmZfc3dhcF9yZWxvY19pbiwgX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwsCi0JX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLQlfYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbi4KLQkoYmZkX2NvZmZfcmVsc3osIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3N5bV9pc19nbG9iYWwpOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERlZmluZS4KLQkoYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBvYmpfcmF3X3N5bWVudF9jb3VudCBhbmQKLQlvYmpfY29udl90YWJsZV9zaXplLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNldCB0YXJnZXRfaW5kZXggb2YgYWxsCi0Jc2VjdGlvbnMuICBTZXQgb3V0cHV0X2hhc19iZWd1biBmaWVsZC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBzZXQgdGFyZ2V0X2luZGV4OyBub3cgZG9uZSBieQotCWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgUmVtb3ZlIG9ic29sZXRlIGhhbmRsaW5nIG9mCi0Jc2NuX2Jhc2UgYW5kIGRhdGFfYmFzZS4gIERvbid0IGJvdGhlciB0byBjaGVjayB0aGF0IHRhcmdldF9pbmRleAotCWlzIHBvc2l0aXZlLCBzaW5jZSBpdCBhbHdheXMgaXMuICBSZW1vdmUgdXNlIG9mIHBhZCwgd2hpY2ggaXMKLQlhbHdheXMgemVyby4gIENoZWNrIG9ial9yYXdfc3ltZW50X2NvdW50LCBub3QgYmZkX2dldF9zeW1jb3VudCwKLQlmb3IgdGhlIG51bWJlciBvZiBzeW1ib2xzLCBidXQgb25seSB3cml0ZSB0aGVtIG91dCBpZgotCWJmZF9nZXRfc3ltY291bnQgaXMgbm9uLXplcm8uICBEb24ndCBjaGVjayBvYmpfcmF3X3N5bWVudF9jb3VudAotCXVudGlsIGFmdGVyIGNvZmZfd3JpdGVfc3ltYm9scyBpcyBjYWxsZWQuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIG9ial9yYXdfc3ltZW50X2NvdW50LCBub3QKLQliZmRfZ2V0X3N5bWNvdW50IGZvciB0aGUgbnVtYmVyIG9mIHN5bWJvbHMuICBEb24ndCBzZXQKLQlvYmpfY29udl90YWJsZV9zaXplLgotCShjb2ZmX3N5bV9pc19nbG9iYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIG9yIG1hY3JvLgotCShjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogQ2FsbCBjb2ZmX3N3YXBfcmVsb2NfaW4sIG5vdAotCWJmZF9zd2FwX3JlbG9jX2luLgotCShjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzCi0JZGVmaW5lZCwgZGVmaW5lIGFzIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogU2ltaWxhciBjaGFuZ2UuCi0JKGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBTaW1pbGFyIGNoYW5nZS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lIGFzIE5VTEwgaWYgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBEb24ndCBzZXQgb2JqX3Jhd19zeW1lbnRfY291bnQKLQlhbmQgb2JqX2NvbnZfdGFibGVfc2l6ZSBoZXJlLgotCShjb2ZmX2NvdW50X2xpbmVudW1iZXJzKTogUmVpbmRlbnQuICBJZiBiZmRfZ2V0X3N5bWNvdW50IGlzIHplcm8sCi0JYWRkIHVwIHRoZSBsaW5lIG51bWJlcnMgZnJvbSB0aGUgc2VjdGlvbnMuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IFNldCBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90Ci0JYmZkX2dldF9zeW1jb3VudC4KLQkoY29mZl9wb2ludGVyaXplX2F1eCk6IERvbid0IHBvaW50ZXJpemUgYSBub25wb3NpdGl2ZSB4X2VuZG5keAotCWZpZWxkLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFVzZSBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90Ci0JYmZkX2dldF9zeW1jb3VudC4KLQkoY29mZl9wcmludF9zeW1ib2wpOiBJZiBhdXhwLT5maXhfZW5kLCBwcmludCB4X2VuZG5keCB2YWx1ZS4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19pbik6IFJlbmFtZSBmcm9tIGJmZF9zd2FwX3JlbG9jX2luLgotCVJlaW5kZW50LiAgQ2hhbmdlIGFyZ3VtZW50IHR5cGUgdG8gIFBUUi4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbiAoYTI5a2NvZmZfYmlnX3ZlYyk6IENvbXBpbGUgY29mZmxpbmsuby4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmZsaW5rLm8uCi0JKENGSUxFUyk6IEFkZCBjb2ZmbGluay5jLgotCi1UdWUgU2VwICA2IDE0OjAwOjQ1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wsIGNhc2UgYmZkX3N5bWJvbF9wcmludF9hbGwpOiBDaGVjawotCWZvciBzZWN0aW9uIHN5bWJvbCwgYW5kIHByaW50IGl0cyBhdXggZmllbGRzIHdpdGggYXBwcm9wcmlhdGUKLQlsYWJlbHMuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGRlZCBjcHUtYXJtLm8uCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBSZWNvZ25pemUgdGhlIEFSTSBwcm9jZXNzb3IuCi0JKiBhcmNodXJlcy5jLCBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdCwgbGliYW91dC5oLCByZWxvYy5jLAotCXRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIHRoZSBBUk0uCi0JKiBjcHUtYXJtLmMsIHJpc2NpeC5jLCBjb25maWcvcmlzY2l4Lm1oLCBjb25maWcvcmlzY2l4Lm10OiBOZXcgZmlsZXMuCi0KLQkqIGFvdXR4LmggKGFkZF90b19zdHJpbmd0YWJsZSk6IENoZWNrIHRoYXQgc3RyIGlzbid0IGEgTlVMTCBwb2ludGVyLgotCi1GcmkgU2VwICAyIDE0OjEwOjMwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IFJld3JvdGUgZGVmaW5pdGlvbiB0byB1c2UKLQluZXcgImNoZXciIGNvbW1hbmRzIGZvciBzaW11bHRhbmVvdXMgZGVmaW5pdGlvbiBvZiBlbnVtZXJhdG9yIGFuZAotCWVudW1lcmF0b3IgbmFtZSB0YWJsZS4KLQkoYmZkX2dldF9yZWxvY19jb2RlX25hbWUpOiBOZXcgZnVuY3Rpb24sIGZvciByZXRyaWV2aW5nIGEgc3ltYm9saWMKLQluYW1lIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnVtZXJhdG9yLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBBdWcgMzAgMjE6MjQ6NTQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzLCBjYXNlIFJfRU5UUlkpOiBIYW5kbGUgY2FzZSB3aGVyZSBubwotCXVud2luZCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KLQotVHVlIEF1ZyAzMCAxMTo0MzozMCAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgc29uYW1lCi0JYXJndW1lbnQsIGFuZCB1c2UgaXQgdG8gc2V0IERUX1NPTkFNRSBkeW5hbWljIGVudHJ5LgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIEF1ZyAyNiAxNTo0Nzo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogU2V0IG9ial9yYXdfc3ltZW50X2NvdW50LgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFZlcmlmeSBvYmpfcmF3X3N5bWVudF9jb3VudCwgcmF0aGVyCi0JdGhhbiBzZXR0aW5nIGl0LgotCi1UaHUgQXVnIDI1IDEwOjQ0OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiBSZW1vdmUgaG9zdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGFvdXR4LmggKGFkZF90b19zdHJpbmd0YWIpOiBDaGVjayBmb3IgX2JmZF9zdHJpbmd0YWJfYWRkIGVycm9yCi0JYmVmb3JlIGFkZGluZyBCWVRFU19JTl9XT1JELgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBMb29rIGZvciB0aGUgYmVzdCBDX0ZJTEUsCi0Jbm90IG1lcmVseSB0aGUgZmlyc3QuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBJZiB3ZSBhcmUgbm90IHVzaW5nIHRoZQotCXN5bWJvbCwgY2xlYXIgdGhlIG5hbWUgc28gdGhhdCBpdCBpcyBub3QgcHV0IGluIHRoZSBzdHJpbmcgdGFibGUuCi0JRnJvbSBBbnR0aS5NaWV0dGluZW5AbnRjLm5va2lhLmNvbS4KLQotV2VkIEF1ZyAyNCAxMTo0OToxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBDYXN0IHBvaW50ZXIgZGlmZmVyZW50IHRvIGxvbmcKLQlhbmQgdXNlICVsZCB0byBwcmludCBpdC4KLQkqIG9zZi1jb3JlLmMgKG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQotCWRzZWNjbnQuCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9leHRfb3V0KTogSWYgRUNPRkZfNjQsIGNsZWFyIHJlbWFpbmluZwotCWJ5dGVzIGluIGJpdHMyLgotCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlnLmJmZDogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBvYmpfY29udl90YWJsZV9zaXplIGhlcmUsCi0JcmF0aGVyIHRoYW4gd2FpdGluZyB1bnRpbCBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBKdXN0IGlnbm9yZSBCU0ZfREVCVUdHSU5HIHN5bWJvbHMuCi0JRnJvbSBBbnR0aS5NaWV0dGluZW5AbnRjLm5va2lhLmNvbS4KLQotCSogc2VjdGlvbi5jIChiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IEZpeCBmYWlsdXJlIGNoZWNrIG9mCi0JYmZkX21ha2VfZW1wdHlfc3ltYm9sLiAgRnJvbSBBbnR0aS5NaWV0dGluZW5AbnRjLm5va2lhLmNvbS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBVc2UgdGhlIG91dHB1dF9zZWN0aW9uCi0JKGFuZCBvdXRwdXRfb2Zmc2V0KSBpZiB0aGVyZSBpcyBvbmUuCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBEaXNjYXJkIHRoZSBzeW1ib2xzCi0JaWYgdGhlIGFyY2hpdmUgZWxlbWVudCB3YXMgbm90IG5lZWRlZC4KLQotCSogYW91dHguaCAoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IEVuc3VyZSB0aGF0IGEgemVybyBzdHJpbmcKLQlpbmRleCB5aWVsZHMgYW4gZW1wdHkgc3RyaW5nLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IElmIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCB1c2UgbmFtZQotCWZyb20gb3JpZ2luYWwgaGFzaCB0YWJsZSBlbnRyeSwgbm90IGZyb20gZW50cnkgaW4gKnN5bV9oYXNoLgotCi0JKiBhb3V0eC5oIChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8pOiBBZGQgZmllbGRzIGNvbnRlbnRzLAotCXJlbG9jcywgc3ltYm9sX21hcCBhbmQgb3V0cHV0X3N5bXMuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IFdvcmsgb3V0IHRoZSBsYXJnZXN0IHNlY3Rpb24gc2l6ZSwgcmVsb2MKLQlzaXplLCBhbmQgbnVtYmVyIG9mIHN5bWJvbHMuICBVc2UgdGhlbSB0byBwcmVhbGxvY2F0ZSBidWZmZXJzIHRoYXQKLQlhcmUgbGFyZ2UgZW5vdWdoIGZvciBhbGwgY2FzZXMuCi0JKGFvdXRfbGlua19pbnB1dF9iZmQpOiBVc2UgcHJlYWxsb2NhdGVkIHN5bWJvbF9tYXAuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogUmVtb3ZlIHN5bWJvbF9tYXAgYXJndW1lbnQ7IHVzZQotCXByZWFsbG9jYXRlZCBzeW1ib2xfbWFwIGluc3RlYWQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBVc2UKLQlwcmVhbGxvY2F0ZWQgb3V0cHV0X3N5bXMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogUmVtb3ZlIHN5bWJvbF9tYXAgYXJndW1lbnQuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIFVzZSBwcmVhbGxvY2F0ZWQgY29udGVudHMgYW5kIHJlbG9jcy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogUmVtb3ZlIHN5bWJvbF9tYXAgYXJndW1lbnQ7IHVzZQotCXByZWFsbG9jYXRlZCBzeW1ib2xfbWFwIGluc3RlYWQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCi1UdWUgQXVnIDIzIDEwOjUxOjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEb24ndCB1cGRhdGUgdGhlCi0Jc3ltYm9sIG1hcCB0aW1lc3RhbXAgaWYgdGhlcmUgaXMgbm8gc3ltYm9sIG1hcC4gIEZyb20KLQlzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUgKEFuZHJlYXMgU2Nod2FiKS4KLQotTW9uIEF1ZyAyMiAxMjoyNjo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IEFkZCBfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4KLQkoYmZkX3RhcmdldCk6IEFkZCBmaWVsZCBfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuCi0JKiBiZmQuYyAoYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2FyY2hpdmVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVjbGFyZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBDYWxsCi0JYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgaW5zdGVhZCBvZiBjaGVja2luZyBmb3IgYSBCU0QgYXJjaGl2ZQotCWFuZCBjYWxsaW5nIGJzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLgotCShfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBSZW5hbWUgZnJvbQotCV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4gIERvbid0IGFzc3VtZSB0aGF0IGFybWFwX2RhdGVwb3MgaXMKLQlhbHJlYWR5IHNldC4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogaWVlZS5jIChpZWVlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBvYXN5cy5jIChvYXN5c191cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogc29tLmMgKHNvbV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCi0JKiBoYXNoLmM6IENvcHkgc3RyaW5nIGhhc2ggZnVuY3Rpb25zIGZyb20gYW91dHguaC4KLQkqIGFvdXR4Lmg6IFN0cmluZyBoYXNoIGZ1bmN0aW9ucyBtb3ZlZCB0byBoYXNoLmMuICBSZXRhaW4KLQlzaW1wbGlmaWVkIHZlcnNpb25zIG9mIGFkZF90b19zdHJpbmd0YWIgYW5kIGVtaXRfc3RyaW5ndGFiLgotCUNoYW5nZSBhbGwgY2FsbGVycyB0byB1c2UgbmV3IGZ1bmN0aW9uIGFuZCBzdHJ1Y3R1cmUgbmFtZXMuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zdHJpbmd0YWJfaW5pdCwgX2JmZF9zdHJpbmd0YWJfZnJlZSk6IERlY2xhcmUuCi0JKF9iZmRfc3RyaW5ndGFiX3NpemUsIF9iZmRfc3RyaW5ndGFiX2FkZCk6IERlY2xhcmUuCi0JKF9iZmRfc3RyaW5ndGFiX2VtaXQpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLU1vbiBBdWcgMjIgMTA6NDk6MzcgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBDcmVhdGUgYSBmaXh1cCBmb3IgYW55Ci0JZGVmaW5lZCBhYnNvbHV0ZSBzeW1ib2wsIG5vdCBqdXN0IEdPVCBvciBQTFQgc3ltYm9scy4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgcmVmZXJlbmNlcyB0byBkZWZpbmVkCi0Jc3ltYm9scy4KLQotVGh1IEF1ZyAxOCAxNjoyOTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlHZXQgbGQgLXggLXIgdG8gaGFuZGxlIGEub3V0IHNldCBzeW1ib2xzIGNvcnJlY3RseS4KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljKTogSWYgdGhlIC5ic3MgVk1BIHdhcyBzZXQgb3V0c2lkZSBvZgotCUJGRCwgcGFkIHRoZSAuZGF0YSBzZWN0aW9uIHVwIHRvIHRoZSBWTUEgb2YgdGhlIC5ic3Mgc2VjdGlvbi4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogSWYgYSBzZXQgc3ltYm9sIGRvZXMgbm90IGdldCBtb2RpZmllZCwKLQl0cmVhdCBpdCBhcyBhIGxvY2FsIHN5bWJvbC4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBTZXQgdGhlIHZhbHVlIG9mIHNldCBzeW1ib2xzCi0JY29ycmVjdGx5LiAgRG9uJ3QgZGlzY2FyZCBzZXQgc3ltYm9scyBldmVuIGlmIGRpc2NhcmRpbmcgbG9jYWwKLQlzeW1ib2xzLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogRG9uJ3QgYWJvcnQgb24gYmZkX2xpbmtfaGFzaF9uZXcsCi0Jc2luY2UgaXQgY2FuIG5vdyBoYXBwZW4gZm9yIHNldCBzeW1ib2xzLgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogSnVzdCBjaGVjayBmb3IgIi5yZWxhIiBhbmQKLQkiLnJlbCIsIG5vdCAiLnJlbGEuIiBhbmQgIi5yZWwuIjsgbWFrZSB0aGlzIHdvcmsgYnkgY2hlY2tpbmcKLQl1c2VfcmVsYV9wLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBKdXN0IGNoZWNrIGZvciAiLnJlbCIsIG5vdAotCSIucmVsLiIKLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IEp1c3QgY2hlY2sgZm9yCi0JIi5yZWxhIiwgbm90ICIucmVsYS4iCi0JKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTcgMTY6NTQ6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEluaXRpYWxpemUKLQlQQVNTIHRvIHRoZSBvbGQgdmFsdWUgKyAxLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogSWYgYSBDX0ZJTEUgc3ltYm9sIGhhcwotCW5vIGF1eCBlbnRyaWVzLCB1c2UgdGhlIHN5bWJvbCBuYW1lIGFzIHRoZSBmaWxlIG5hbWUuCi0JKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBMb29rIGZvciB0aGUgcmlnaHQgQ19GSUxFIHN5bWJvbCwgcmF0aGVyCi0JdGhhbiBhbHdheXMgdXNpbmcgdGhlIGZpcnN0IG9uZS4gIElmIHRoZXJlIGlzIGEgZGVidWdnaW5nIHN5bWJvbAotCWFmdGVyIGEgZnVuY3Rpb24gc3ltYm9sLCBza2lwIGl0LiAgQWRkIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUgbGluZQotCW9mZnNldCwgc2luY2UgaXQgd2FzIHN1YnRyYWN0ZWQgb3V0IGluIGNvZmZfc2x1cnBfbGluZV90YWJsZS4KLQotVHVlIEF1ZyAxNiAxNjo1MzowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBJZiB3cml0aW5nIHNvbWUgZm9ybSBvZiBhbiBleGVjdXRhYmxlLAotCWFsbG9jYXRlIGFuZCBhdHRhY2ggYW4gZXhlYyBoZWFkZXIgdG8gdGhlIEJGRCBwcml2YXRlIGRhdGEuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3QgZmlsbCBmaWVsZHMgb2YgdGhlIGV4ZWMgaGVhZGVyIGJhc2VkCi0Jb24gQkZEIHByaXZhdGUgZGF0YSBoZXJlIChsaWtlIHRoZSBleGVjIGZsYWdzKS4gIERvIG5vdCB3cml0ZQotCXRoZSBleGVjIGhlYWRlciBoZXJlLgotCShzb21fd3JpdGVfaGVhZGVycyk6IEluc3RlYWQgZG8gaXQgaGVyZS4KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IE5ldyBmaWVsZCAiZXhlY19oZHIiIGZvciB0aGUgZXhlY3V0YWJsZQotCWZpbGUgaGVhZGVyLgotCShvYmpfc29tX2V4ZWNfaGRyKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCi1UdWUgQXVnIDE2IDAwOjEyOjMxIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgc2VjdGlvbgotCW5hbWVkIC5saW51eC1keW5hbWljLCBub3QgLmR5bmFtaWMuCi0JKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogVXNlIC5saW51eC1keW5hbWljLCBub3QgLmR5bmFtaWMuCi0JKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkobGludXhfZmluaXNoX2R5bmFtaWNfbGluayk6IExpa2V3aXNlLgotCi1Nb24gQXVnIDE1IDEyOjE2OjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChTVFJJTkdfU0laRV9TSVpFKTogRGVmaW5lLgotCShjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IFVzZSBTVFJJTkdfU0laRV9TSVpFLCBub3QgNC4KLQkoY29mZl93cml0ZV9zeW1ib2xzLCBidWlsZF9zdHJpbmdfdGFibGUpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBMaWtld2lzZS4KLQotCSogbGliY29mZi1pbi5oIChvYmpfc3ltYm9sX3NsZXcpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX3RkYXRhKTogUmVtb3ZlIHVudXNlZCBmaWVsZHMgaW5kZXhfc2xldywgcmF3X2xpbmVub3MsCi0JYW5kIGZsYWdzLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdCk6IERvbid0IGluaXRpYWxpemUgcmF3X2xpbmVub3MuCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IERvbid0IGluaXRpYWxpemUgZmxhZ3MuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3ptYWdpY19jb250aWd1b3VzKTogRGVmaW5lIGFzIDAgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShNWShiYWNrZW5kX2RhdGEpKTogVXNlIE1ZX3ptYWdpY19jb250aWd1b3VzLCBub3QgaGFyZGNvZGVkIDAuCi0JKiBpMzg2bGludXguYyAoTVlfem1hZ2ljX2NvbnRpZ3VvdXMpOiBEZWZpbmUuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSWYgYSBTSFRfU1lNVEFCIHNlY3Rpb24gaW4gYQotCXNoYXJlZCBvYmplY3QgaGFzIFNIRl9BTExPQyBzZXQsIGNyZWF0ZSBhIEJGRCBzZWN0aW9uIGZvciBpdC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFRoZXJlIG1heSBiZSBhIEJGRCBzZWN0aW9uIGZvciBhCi0JU0hUX1NZTVRBQiBzZWN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IEFkZCBuYW1lIGFyZ3VtZW50LiAgSWYgbm8gZmxhZ3MKLQlhcmUgcmVjb2duaXplZCwgY2hvc2Ugc2VjdGlvbiBmbGFncyBiYXNlZCBvbiB0aGUgbmFtZS4KLQkoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogX2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rIGZpZWxkOiBBZGQKLQluYW1lIGFyZ3VtZW50LgotCShiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rKTogQWRkIG5hbWUgYXJndW1lbnQuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QgYWRqdXN0IHRoZSBzZWN0aW9uCi0JcG9zaXRpb24gYnkgQ09GRl9QQUdFX1NJWkUgdW5sZXNzIFNFQ19BTExPQyBpcyBzZXQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IFBhc3Mgc2VjdGlvbiBuYW1lIHRvCi0JYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vay4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBBZGQgdW51c2VkIG5hbWUKLQlhcmd1bWVudC4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBBZGQgbmFtZSBhcmd1bWVudCB0bwotCXByb3RvdHlwZS4KLQotRnJpIEF1ZyAxMiAxMToyMjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IENvcnJlY3QgY2hlY2sgZm9yIGludmFsaWQKLQlzZWN0aW9uIGluZGV4LgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIHRoZXJlIGlzIG5vIHN5bWJvbAotCXRhYmxlLCB0cnkgdXNpbmcgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotc29sYXJpczIqKTogVXNlIHNvbGFyaXMyLCBub3Qgc3lzdjQuCi0JVGhlIGxpbmtlciBkZXBlbmRzIHVwb24gY29uZmlndXJpbmcgZm9yIHNvbGFyaXMyLgotCSogaG9zdHMvc29sYXJpczIuaDogTmV3IGZpbGU7IGluY2x1ZGUgaG9zdHMvc3lzdjQuaC4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogTmV3IGZpbGU7IGNvcHkgb2YgY29uZmlnL3N5c3Y0Lm1oLgotCi1XZWQgQXVnIDEwIDEzOjA5OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBNYWtlIHN1cmUgZGF0YSBzZWN0aW9uIGlzIHBhZGRlZCB0bwotCXBhZ2UgYm91bmRhcnkgd2hlbiB0aGUgVk1BIGlzIHNldCBieSB0aGUgY2FsbGluZyBwcm9ncmFtLiAgRnJvbQotCUVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQotTW9uIEF1ZyAgOCAxNzoxODo0OSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQlVcGRhdGUgdG8gbnMzMmsgc3VwcG9ydCwgZnJvbSBJYW4gRGFsbCAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KS4KLQkqIGFvdXQtbnMzMmsuYzogQWRkIGRlY2xhcmF0aW9ucyB0aGF0IHdlcmUgaW4gYW91dC1uczMyay5oLCBjaGFuZ2UKLQlkZWNsYXJhdGlvbnMgdG8gdHJhZGl0aW9uYWwgZm9ybS4KLQkoTVlfcmVsb2NfaG93dG8sIE1ZX3B1dF9yZWxvYyk6IENoYW5nZSBmcm9tIG1hY3JvIHRvIGZ1bmN0aW9uLgotCShuczMya19yZWxvY2F0ZV9jb250ZW50cyk6IE5ldyBmdW5jdGlvbi4KLQkqIGFvdXQtbnMzMmsuaDogUmVtb3ZlLgotCSogY3B1LW5zMzJrLmM6IEFkZCBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIGluIGFvdXQtbnMzMmsuaCwgY2hhbmdlCi0JZGVjbGFyYXRpb25zIHRvIHRyYWRpdGlvbmFsIGZvcm0uCi0JKG5zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDYWxsIG5zMzJrX3JlbG9jYXRlX2NvbnRlbnRzLgotCSogbmV0YnNkNTMyLmM6IFJlZm9ybWF0IHRvIHN0YW5kYXJkcywgYWRkIGNvcHlyaWdodCBub3RpY2UuCi0JKEFSQ0gpOiBEb24ndCBkZWZpbmUuCi0JKGFvdXQtbnMzMmsuaCk6IERvbid0IGluY2x1ZGUuCi0JKiBwYzUzMi1tYWNoLmM6IERpdHRvLgotCi1Nb24gQXVnICA4IDE3OjU1OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IERvbid0IHRyeSB0byBjb252ZXJ0IHJlbG9jcwotCWFnYWluc3QgY29tbW9uIHN5bWJvbHMuCi0KLVNhdCBBdWcgIDYgMjI6Mjc6MzAgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogIElnbm9yZSBzZWN0aW9ucyB0aGF0Ci0JYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIGNvcmUgZmlsZS4KLQotVGh1IEF1ZyAgNCAxMTozMjoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jIChtNjhrX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkqIGNmLW02OGtseW54LmMgKF9iZmRfbTY4a2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRm9yY2UgdGhlIHZtYSBvZiBzZWN0aW9ucyB3aGljaAotCWRvIG5vdCBoYXZlIFNFQ19BTExPQyBzZXQgdG8gYmUgMC4gIFRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZQotCXJlbG9jcyBhZ2FpbnN0IGRlYnVnZ2luZyBzZWN0aW9ucy4KLQotV2VkIEF1ZyAgMyAxNjo0NTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBSZXdyb3RlIHRvIGNoYW5nZSByZWxvY3MKLQlhZ2FpbnN0IGxvY2FsbHkgZGVmaW5lZCBzeW1ib2xzIGludG8gcmVsb2NzIGFnYWluc3Qgc2VjdGlvbgotCXN5bWJvbHMsIGZvciBWeFdvcmtzIDUuMS4KLQotV2VkIEF1ZyAgMyAxMDozNDozNyAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IE9ubHkgaGFuZGxlCi0JU0hBUkFCTEVfQ09ORkxJQ1RTIHNwZWNpYWxseSBpZiBCU0ZfQ09OU1RSVUNUT1IgaXMgc2V0LiAgU2V0IGhhc2hwCi0JZm9yIGEgR09UIG9yIFBMVCBzeW1ib2wuICBTZXQganVtcCBmaWVsZCBvZiBmaXh1cCBmb3IgYSBQTFQgc3ltYm9sLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogQ2hlY2sgc2VjdGlvbiBvZiByZWFsIHN5bWJvbC4gIFdoZW4gbG9va2luZwotCWZvciBhIGJ1aWx0aW4gZml4dXAsIGNoZWNrIGJ1aWx0aW4gYW5kIGp1bXAgZmxhZ3MuICBDcmVhdGUgbm8gbW9yZQotCXRoYW4gb25lIGZpeHVwLCBhbmQgYWx3YXlzIGNyZWF0ZSBvbmUgaWYgdGhlIHJlYWwgc3ltYm9sIGlzIGluIHRoZQotCWFic29sdXRlIHNlY3Rpb24uICBPbmx5IHN0cmlwIGFic29sdXRlIHN5bWJvbHMuCi0KLVdlZCBBdWcgIDMgMDU6MDg6MjQgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCBpbnRlcm5hbF9hLm1hZ2ljIHRvCi0JTFlOWENPRkZNQUdJQyB3aGVuZXZlciA2OGssIFNQQVJDIG9yIGkzODYgTHlueE9TCi0JKHllcywgdGhleSBoYXZlIHRoZSBzYW1lIG1hZ2ljIG51bWJlciEpCi0KLVR1ZSBBdWcgIDIgMTA6NDM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguYyAoQk1BR0lDKTogRGVmaW5lIGFzIEhQVVhfRE9UX09fTUFHSUMsIHRvIG1ha2UgdGVzdAotCWluIGFvdXR4Lmggd29yayBjb3JyZWN0bHkuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGhvd3RvX3JlbGxvbmcsIGhvd3RvX2lwcm1lZCk6IFVzZSBpdCBhcyBzcGVjaWFsX2Z1bmN0aW9uLgotCi0JKiBsaWJiZmQtaW4uaDogTW92ZSBkZWNsYXJhdGlvbnMgb2YgYmZkX3JlYWQsIGJmZF93cml0ZSwgYmZkX3NlZWssCi0JYmZkX3RlbGwsIGJmZF9mbHVzaCwgYW5kIGJmZF9zdGF0IGZyb20gaGVyZS4uLgotCSogYmZkLWluLmg6IC4uLnRvIGhlcmUsIHRvIG1ha2UgdGhlbSB2aXNpYmxlIHRvIHByb2dyYW1zIHdoaWNoCi0Ja25vdyBtb3JlIGFib3V0IHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgdGhhbiBCRkQgZG9lcy4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLU1vbiBBdWcgIDEgMTc6NTU6NTMgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHB0cmFjZS1jb3JlLmMgKHB0cmFjZV91bml4X2NvcmVfZmlsZV9wKTogIENvbnZlcnQgemFsbG9jIHVzYWdlCi0JdG8gYmZkX3phbGxvYy4KLQotTW9uIEF1ZyAgMSAxMjowNDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZjY0LXNwYXJjLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotCUVMRiBsaW5rZXIgcGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdHlwZSBvZgotCV9EWU5BTUlDIHRvIFNUVF9PQkpFQ1QuCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IEFsd2F5cyBjcmVhdGUgaGFzaCB0YWJsZQotCWVudHJ5LiAgU2V0IHR5cGUgdG8gU1RUX09CSkVDVC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IHNldCB0eXBlIG9mIHdlYWsgZGVmaW5lZCBzeW1ib2wgdG8KLQlTVEJfV0VBSyBpZiBzeW1ib2wgd2FzIHJlZmVyZW5jZWQuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQ2hlY2sgRFlOQU1JQyBhcyB3ZWxsIGFzIEVYRUNfUC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdHlwZSBvZgotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFIHRvIFNUVF9PQkpFQ1QuCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IElnbm9yZSBsb2NhbCBQTFQzMiByZWxvY3MuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBUcmVhdCBsb2NhbCBQTFQzMiByZWxvY3MgYXMgUEMzMi4KLQotCSogZWxmY29kZS5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ29ycmVjdCB3ZWFrIHN5bWJvbAotCWhhbmRsaW5nIGFnYWluLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IERvbid0IHRyeSB0byByZWFkIHRoZSByZWxvY3MKLQlpZiB0aGVyZSBhcmVuJ3QgYW55LgotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1zb2xhcmlzMiopOiBVc2Ugc3lzdjQsIG5vdCBzb2xhcmlzMi4KLQkqIGhvc3RzL3NvbGFyaXMyLmg6IFJlbW92ZS4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogUmVtb3ZlLgotCi1TdW4gSnVsIDMxIDE0OjI3OjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMsIGVsZjMyLWhwcGEuaDogVXBkYXRlIGNvbW1lbnQgcmVmbGVjdGluZyB3aGljaAotCUhQUEEgRUxGIHNwZWMgdGhlIGNvZGUgaW1wbGVtZW50cy4KLQotVHVlIEp1bCAyNiAxNzozODowMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjcHUtaTk2MC5jIChNQVhfQVJDSCk6IE5ldyBtYWNyby4KLQkoY29tcGF0aWJsZSk6IFVzZSBpdCBpbiBjb21wdXRpbmcgYXJyYXkgYm91bmRzLiAgUHV0IGNvbW1hIGFmdGVyCi0JbGFzdCBlbnRyeSBpbiBhcnJheSwgZm9yIHJlZ3VsYXJpdHkuCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGp1c3Qgc3BhY2luZyBmb3IgZWFzaWVyIHJlYWRpbmcuCi0KLQkqIGNvZmYtaTk2MC5jIChob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQsIGhvd3RvX29wdGNhbGwpOiBVc2UKLQlIT1dUTyBtYWNyby4KLQotCSogY3B1LWk5NjAuYyAoSlgpOiBEZWZpbmUgYXMgYmZkX21hY2hfaTk2MF9qeC4KLQkoc2Nhbl85NjBfbWFjaCk6IFJlY29nbml6ZSBqeCBtYWNoaW5lLgotCShNQVhfQVJDSCk6IERlZmluZSB0byBiZSBKWC4KLQkoY29tcGF0aWJsZSk6IEFkZCBKWCByb3cgdG8gYXJyYXkuCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgSlggZW50cnkuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2k5NjBfangpOiBOZXcgbWFjcm8uCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEZvciBGX0k5NjBKWCwgc2V0IG1hY2hpbmUKLQl0byBiZmRfbWFjaF9pOTYwX2p4LgotCShjb2ZmX3NldF9mbGFncyk6IEZvciBiZmRfbWFjaF9pOTYwX2p4LCBzZXQgRl9JOTYwSlguCi0KLVR1ZSBKdWwgMjYgMTE6MDQ6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBXaGVuIGhhbmRsaW5nIGEgd2VhawotCXN5bWJvbCwgY29ycmVjdCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZXF1aXZhbGVudCBub3JtYWwgc3ltYm9sCi0Jd2FzIHJlZmVyZW5jZWQuCi0KLQlBZGQgc3VwcG9ydCBmb3IgY3JlYXRpbmcgc2hhcmVkIGxpYnJhcmllcyB1bmRlciBpMzg2IEVMRiBhbmQgU1BBUkMKLQlFTEYuICBCYXNlZCBvbiBwYXRjaGVzIGJ5IEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IFJlbW92ZSBjb3B5X29mZnNldCBmaWVsZC4KLQlBZGQgZ290X29mZnNldCBhbmQgcGx0X29mZnNldCBmaWVsZHMuCi0JKEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUNfTVVMVElQTEUpOiBEb24ndCBkZWZpbmUuCi0JKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUNfTVVMVElQTEUpOiBEb24ndCBkZWZpbmUuCi0JKEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgY2hlY2tfcmVsb2NzIGZpZWxkLgotCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBDaGFuZ2UgcmVsb2NzIGZyb20gUFRSIHRvCi0JRWxmX0ludGVybmFsX1JlbGEgKi4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbG9jYWxfZ290X29mZnNldHMgZmllbGQuCi0JKGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyk6IERlZmluZSBhY2Nlc3NvciBtYWNyby4KLQkoYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IERvbid0IHVzZSB0aGUgc2VjdGlvbiBkYXRhCi0JcmVsb2NzIGZpZWxkLgotCShlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBVc2UKLQltYWNybyB0byByZW5hbWUgdG8gTkFNRShiZmRfZWxmLGxpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKS4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgcHV0Ci0JbWFrZSBhbGwgbG9jYWwgc3ltYm9scyBkeW5hbWljLiAgRG9uJ3QgYm90aGVyIHdpdGggdGhlCi0JRFlOQU1JQ19NVUxUSVBMRSBmbGFncy4gIENhbGwgdGhlIGNoZWNrX3JlbG9jcyBiYWNrZW5kIGZ1bmN0aW9uIGlmCi0JaXQgaXMgZGVmaW5lZC4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBVc2UKLQltYWNybyB0byByZW5hbWUgdG8gTkFNRShiZmRfZWxmLGxpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpLiAgSWYKLQljcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBtYWtlIHN1cmUgdGhhdCBfRFlOQU1JQyBpcyBhZGRlZCBhcyBhCi0JZHluYW1pYyBzeW1ib2wuCi0JKGVsZl9saW5rX3JlYWRfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBJZiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIGFsd2F5cyBjcmVhdGUgc3ltYm9scywgYW5kIGFsd2F5cyBtYWtlIHRoZW0gZHluYW1pYy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogUGVybWl0IGNyZWF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFVzZSBlbGZfbGlua19yZWFkX3JlbG9jcyB0byBnZXQgdGhlIHJlbG9jcy4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGluaXRpYWxpemUKLQljb3B5X29mZnNldC4gIEluaXRpYWxpemUgZ290X29mZnNldCBhbmQgcGx0X29mZnNldC4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUgYXMgMCBpZiBub3QKLQlkZWZpbmVkLgotCShlbGYzMl9iZWQpOiBJbml0aWFsaXplIGNoZWNrX3JlbG9jcyBmaWVsZC4KLQkqIGVsZjY0LXRhcmdldC5oIChlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUgYXMgMCBpZiBub3QKLQlkZWZpbmVkLgotCShlbGY2NF9iZWQpOiBJbml0aWFsaXplIGNoZWNrX3JlbG9jcyBmaWVsZC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfMzg2X1BMVDMyIGFuZAotCVJfMzg2X0dPVFBDIHRvIGJlIHBjX3JlbGF0aXZlIGFuZCBwY3JlbF9vZmZzZXQuCi0JKGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5KTogRGVmaW5lLgotCShlbGZfaTM4Nl9waWNfcGx0X2VudHJ5KTogRGVmaW5lLgotCShlbGZfaTM4Nl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENyZWF0ZSBhIC5nb3QucGx0IHNlY3Rpb24sIGFuZAotCWRlZmluZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXQgdGhlIHN0YXJ0IG9mIGl0LiAgSWYgY3JlYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LCBtYWtlIHN1cmUgdGhhdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYWRkZWQgYXMgYQotCWR5bmFtaWMgc3ltYm9sLiAgRG9uJ3QgY3JlYXRlIC5yZWwuYnNzIGlmIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeS4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBtYWtlIGEgUExUIGVudHJ5IGlmIHRoZQotCXN5bWJvbCBhbHJlYWR5IGhhcyBvbmUuICBXaGVuIG1ha2luZyBhIFBMVCBlbnRyeSwgc2V0IHBsdF9vZmZzZXQuCi0JRG9uJ3QgY3JlYXRlIGEgY29weSByZWxvYyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBEb24ndAotCXNldCBjb3B5X29mZnNldCwganVzdCBzZXQgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZLgotCShlbGZfaTM4Nl9hbGxvY2F0ZV9keW5hbWljX3NlY3Rpb24pOiBSZW1vdmUuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExvb2sgdGhyb3VnaCBhbGwgdGhlIHNlY3Rpb25zCi0JcmF0aGVyIHRoYW4gYXNzdW1pbmcgd2Uga25vdyB0aGVpciBuYW1lcy4gIFJlbW92ZSBhbnkgZW1wdHkgcmVsb2MKLQlvciBwbHQgc2VjdGlvbnMuICBPbmx5IGFkZCBhIERUX0RFQlVHIGVudHJ5IGlmIG5vdCBjcmVhdGluZyBhCi0Jc2hhcmVkIGxpYnJhcnkuICBPbmx5IGFkZCBhIERUX1BMVEdPVCBlbnRyeSBpZiB0aGVyZSBpcyBhIFBMVC4KLQlBZGQgYSBEVF9URVhUUkVMIGVudHJ5IGlmIHJlcXVpcmVkLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IHVuZGVmaW5lZCBzeW1ib2xzIHdoZW4KLQljcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgSGFuZGxlIHRoZSBzcGVjaWFsIHJlbG9jYXRpb24gdHlwZXMKLQlzcGVjaWFsbHkuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSBhIFBMVCBlbnRyeSBpZiBwbHRfb2Zmc2V0Ci0JaXMgc2V0LiAgSWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgcHJvZHVjZSBhIFBJQyBQTFQgZW50cnkuCi0JT25seSBtYXJrIGEgUExUIHN5bWJvbCBhcyB1bmRlZmluZWQgaWYgaXQgd2FzIG5vdCBkZWZpbmVkIGJ5IGEKLQlyZWd1bGFyIG9iamVjdCBmaWxlLiAgQ3JlYXRlIGEgR09UIGVudHJ5IGlmIGdvdF9vZmZzZXQgaXMgc2V0LgotCUNyZWF0ZSBhIGNvcHkgcmVsb2MgaWYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIGlzIHNldC4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mCi0JRFRfUkVMU1ogdG8gc2ltcGx5IHN1YnRyYWN0IG91dCB0aGUgc2l6ZSBvZiAucmVsLnBsdC4gIElmIGNyZWF0aW5nCi0JYSBzaGFyZWQgbGlicmFyeSwgcHJvZHVjZSBQSUMgUExUIGNvZGUuCi0JKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IENoYW5nZSBSX1NQQVJDX0dPVDEwLAotCVJfU1BBUkNfR09UMjIsIGFuZCBSX1NQQVJDX1BDMTAgdG8gbm90IHdhcm4gYWJvdXQgcmVsb2Mgb3ZlcmZsb3cuCi0JKGVsZjMyX3NwYXJjX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBtYWtlIHN1cmUgdGhhdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYWRkZWQgYXMgYQotICAgICAgICBkeW5hbWljIHN5bWJvbCwgYW5kIHNldCB0aGUgdHlwZSB0byBTVFRfT0JKRUNULiAgTGlrZXdpc2UgZm9yCi0gICAgICAgIF9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8uICBEb24ndCBjcmVhdGUgLnJlbC5ic3MgaWYgY3JlYXRpbmcgYQotICAgICAgICBzaGFyZWQgbGlicmFyeS4KLQkoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBtYWtlIGEgUExUIGVudHJ5IGlmIHRoZQotCXN5bWJvbCBhbHJlYWR5IGhhcyBvbmUuICBXaGVuIG1ha2luZyBhIFBMVCBlbnRyeSwgc2V0IHBsdF9vZmZzZXQuCi0JRG9uJ3QgY3JlYXRlIGEgY29weSByZWxvYyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBEb24ndAotCXNldCBjb3B5X29mZnNldCwganVzdCBzZXQgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZLgotCShlbGYzMl9zcGFyY19hbGxvY2F0ZV9keW5hbWljX3NlY3Rpb24pOiBSZW1vdmUuCi0JKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExvb2sgdGhyb3VnaCBhbGwgdGhlIHNlY3Rpb25zCi0JcmF0aGVyIHRoYW4gYXNzdW1pbmcgd2Uga25vdyB0aGVpciBuYW1lcy4gIE9ubHkgYWRkIGEgRFRfREVCVUcKLQllbnRyeSBpZiBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIEFkZCBhIERUX1RFWFRSRUwgZW50cnkgaWYKLQlyZXF1aXJlZC4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCB1bmRlZmluZWQgc3ltYm9scyB3aGVuCi0JY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIEhhbmRsZSB0aGUgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzCi0Jc3BlY2lhbGx5LgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgYSBQTFQgZW50cnkgaWYgcGx0X29mZnNldAotCWlzIHNldC4gIE9ubHkgbWFyayBhIFBMVCBzeW1ib2wgYXMgdW5kZWZpbmVkIGlmIGl0IHdhcyBub3QgZGVmaW5lZAotCWJ5IGEgcmVndWxhciBvYmplY3QgZmlsZS4gIENyZWF0ZSBhIEdPVCBlbnRyeSBpZiBnb3Rfb2Zmc2V0IGlzCi0Jc2V0LiAgQ3JlYXRlIGEgY29weSByZWxvYyBpZiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkgaXMgc2V0LgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFN0b3JlIGR5bm9iaiBpbiBhIGxvY2FsCi0JdmFyaWFibGUuCi0JKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZS4KLQotTW9uIEp1bCAyNSAxMjoyMTowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocGM1MzJtYWNoX3ZlYyk6IENoYW5nZSB0byBwYzUzMm1hY2hhb3V0X3ZlYy4KLQkqIGNvbmZpZy5iZmQgKG5zMzJrLSotbmV0YnNkKik6IFVzZSBuczMyay1uYnNkIGFzIGJmZF9uYW1lLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtbnMzMmsuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dC1uczMyay5vLCBuZXRic2Q1MzIubywgbTg4a21hY2gzLm8sCi0JcGM1MzItbWFjaC5vLgotCSogdGFyZ2V0cy5jIChwYzUzMm1hY2hhb3V0X3ZlYyk6IFVzZSBpbnN0ZWFkIG9mIHBjNTMybWFjaF92ZWMuCi0JKiBjb25maWcvcGM1MzItbWFjaC5tdCAoREVGQVVMVF9WRUNUT1IpOiBEaXR0by4KLQkoU0VMRUNUX1ZFQ1MpOiBSZW1vdmUuCi0JKiBjb25maWcvbnMzMmstbmJzZC5tdDogTmV3IGZpbGUsIHdhcyBuczMyay1uZXRic2QubXQuCi0JKiBjb25maWcvbnMzMmstbmV0YnNkLm10OiBSZW1vdmUsIG5hbWUgdG9vIGxvbmcuCi0KLUZyaSBKdWwgMjIgMTE6MDc6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IFdoZW4gY2hhbmdpbmcgYQotCXN5bWJvbCB0byBjb21tb24sIHNldCB0aGUgYWxpZ25tZW50LgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFdoZW4gY3JlYXRpbmcgYSBjb21tb24gc3ltYm9sLAotCXNldCB0aGUgYWxpZ25tZW50LgotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBXaGVuIGNoYW5naW5nIGEgc3ltYm9sIHRvCi0JY29tbW9uLCBzZXQgdGhlIGFsaWdubWVudC4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUmVzdHJpY3QgdGhlIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wKLQl0byB0aGUgYWxpZ25tZW50IHBvd2VyIGdpdmVuIGJ5IHRoZSBhcmNoaXRlY3R1cmUuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgYWxpZ24gZmllbGQuICBBZGQKLQljb3B5X29mZnNldCBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU3RvcmUgYWxpZ25tZW50IGluCi0JbmV3IGJmZF9saW5rX2hhc2hfZW50cnkgZmllbGQsIG5vdCBpbiBlbGZfbGlua19oYXNoX2VudHJ5IGZpZWxkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogU2ltaWxhciBjaGFuZ2Ugd2hlbiBnZXR0aW5nIGFsaWdubWVudC4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGluaXRpYWxpemUgYWxpZ24uICBEbwotCWluaXRpYWxpemUgY29weV9vZmZzZXQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFVzZSBjb3B5X29mZnNldAotCWZpZWxkIHJhdGhlciB0aGFuIGFsaWduIGZpZWxkLiAgR2V0IGFsaWdubWVudCB1c2luZyBiZmRfbG9nMgotCXJhdGhlciB0aGFuIHN3aXRjaC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBVc2UgY29weV9vZmZzZXQsCi0Jbm90IGFsaWduLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSnVzdCBjaGVjawotCVNUQVRfRk9SX0VYRUMsIGRvbid0IGNoZWNrIE1BQ0guCi0JKiBtODhrbWFjaDMuYyAoTUFDSCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9pMzg2LW1hY2gzLm10IChUREVGSU5FUyk6IERlZmluZSBTVEFUX0ZPUl9FWEVDLgotCSogY29uZmlnL204OGstbWFjaDMubXQgKFRERUZJTkVTKTogTGlrZXdpc2UuCi0JKiBjb25maWcvbWlwcy1tYWNoMy5tdCAoVERFRklORVMpOiBMaWtld2lzZS4KLQotVGh1IEp1bCAyMSAxNzoyNDozMSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGkzODZtYWNoMy5jOiBSZXZlcnRlZCB0byB2ZXJzaW9uIGZyb20gYmVmb3JlIEp1bCA1IDE5OTQgY2hhbmdlcy4KLQotVGh1IEp1bCAyMSAxMjoyNjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBSZW1vdmUgc3BlY2lhbF9mdW5jdGlvbjEuCi0JSXQncyB0aGUgd3Jvbmcgd2F5IHRvIGRvIHRoaW5ncy4KLQkoSE9XVE8pOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKEhPV1RPMik6IFJlbW92ZS4KLQkoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8KLQlzcGVjaWFsX2Z1bmN0aW9uMS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCi0Jc3BlY2lhbF9mdW5jdGlvbjEuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMjAgMTU6NDY6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHJwYXRoCi0JYXJndW1lbnQuICBJZiBpdCBpcyBub3QgTlVMTCwgdXNlIGl0IHRvIHNldCBEVF9SUEFUSC4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1TYXQgSnVsIDE2IDIxOjEwOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogSWYgdGhlcmUgaXMgbm8KLQlkeW5hbWljIHN5bXRhYiwgcmV0dXJuIGVycm9yLgotCi0JKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUspOiBEZWZpbmUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGFzCi0Jd2Vhaywgc2V0IEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSWYgc3ltYm9sIGlzIGRlZmluZWQgYXMgd2VhaywgbWFyayBpdAotCVNUQl9XRUFLLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHJlbG9jcyBmaWVsZC4KLQkoc2hkcl9uYW1lKTogUmVtb3ZlOyB1bnVzZWQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IFJld3JvdGUgdG8gaGFuZGxlIGJvdGggUkVMCi0JYW5kIFJFTEEgcmVsb2NzLiAgRnJlZSB1cCB0aGUgdW5zd2FwcGVkIHJlbG9jcy4gIFBlcm1pdCB0aGUgcmVsb2NzCi0JdG8gYmUgY2FjaGVkIGluIHRoZSBzZWN0aW9uX2RhdGEuICBDb3JyZWN0IHRoZSByZWxvYyBhZGRyZXNzLgotCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogUmVtb3ZlLgotCShlbGZfY2Fub25pY2FsaXplX3JlbG9jKTogUmV3cm90ZS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogUGVybWl0IHRoZSByZWxvY3MgdG8gYmUgY2FjaGVkIGluIHRoZQotCXNlY3Rpb24gZGF0YS4KLQotU2F0IEp1bCAxNiAxMzo1NTozOCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKG04OCotaGFycmlzLWN4dXgqKTogUmVjb2duaXplLgotCSogaG9zdHMvaGFycmlzLmggKFBPU0lYX1VUSU1FLCBIQVZFX1BST0NGUyk6IERlZmluZS4KLQotCSogY29uZmlndXJlLmhvc3QgKG02OCotYXRhcmktc3lzdjQqKTogTmV3IGhvc3QuCi0JKG02OCotY2JtLXN5c3Y0Kik6IFVzZSBtNjhrdjQgaW5zdGVhZCBvZiBhbWl4LgotCSogaG9zdHMvYW1peC5oOiBSZW1vdmUuCi0JKiBob3N0cy9tNjhrdjQuaDogTmV3IGZpbGUsIHdhcyBhbWl4LmguCi0KLVRodSBKdWwgMTQgMTU6MTI6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsLCBiZmRfdHlwZSwgc3RydWN0Ci0JcmVsb2NfaG93dG9fc3RydWN0LCByZWxvY19ob3d0b190eXBlLCBIT1dUTywgSE9XVE8yKTogQ29waWVkCi0JY2hhbmdlcyBvdmVyIGZyb20gYmZkLWluMi5oIHNvIHRoZXkgZ2V0IGdlbmVyYXRlZCBwcm9wZXJseSBuZXh0Ci0JdGltZSBzb21lb25lIHJ1bnMgIm1ha2UgaGVhZGVycyIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIHRhcmdldHMuYyAobmV0YnNkNTMyX3ZlYywgcGM1MzJtYWNoX3ZlYyk6IERlY2xhcmUgY29uc3QuCi0JKG04OGttYWNoM192ZWMpOiBSZXN0b3JlIGRlbGV0ZWQgZGVjbGFyYXRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWxwaGFiZXRpemUgdGFyZ2V0IHZlY3RvciBuYW1lcy4KLQotCSogY29uZmlnL3BjNTMybWFjaC5taDogTmV3IGZpbGUuCi0JKEhERVBGSUxFUywgSERFRklORVMpOiBEZWZpbmUgaGVyZS4KLQkqIGNvbmZpZy9wYzUzMi1tYWNoLm10IChIREVQRklMRVMsIEhERUZJTkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9uczMyay1uZXRic2QubXQgKEhERVBGSUxFUywgSERFRklORVMpOiBEZWxldGVkLgotCi0JU3VuIEp1bCAxMCAwMDowNDoyMCAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogcGM1MzItbWFjaC5jOiBOZXcgRmlsZS4gcGM1MzItbWFjaCBhLm91dCBmb3JtYXQuCi0KLQkqIG5ldGJzZDUzMi5jOiBOZXcgZmlsZS4gcGM1MzItbmV0YnNkNTMyIGEub3V0IGZvcm1hdC4KLQotCSogaG9zdHMvcGM1MzJtYWNoLmg6IE5ldyBmaWxlLiBwYzUzMi1tYWNoIGhvc3Qgc3VwcG9ydC4KLQotCSogY3B1LW5zMzJrLmM6IE5ldyBmaWxlLiBuczMyayBzdXBwb3J0IGNwdSBzcGVjaWZpYyBjb2RlIHJhdGhlcgotCXRoYW4gZm9ybWF0IHNwZWNpZmljIGNvZGUuCi0KLQkqIGNvbmZpZy9wYzUzMi1tYWNoLm10OiBOZXcgZmlsZS4gU3VwcG9ydCBmb3IgcGM1MzItbWFjaCB0YXJnZXQuCi0KLQkqIGNvbmZpZy9uczMyay1uZXRic2QubXQ6IE5ldyBmaWxlLiBTdXBwb3J0IGZvciBuZXRic2Q1MzIgdGFyZ2V0LgotCi0JKiBhb3V0LW5zMzJrLmMsIGFvdXQtbnMzMmsuaDogTmV3IGZpbGVzIHN1cHBvcnRpbmcgYW91dCBmb3JtYXQgZm9yCi0JbnMzMmsgc2VyaWVzLiAKLQotCSogdGFyZ2V0cy5jOiBBZGQgbmV0YnNkNTMyX3ZlYyBhbmQgcGM1MzJtYWNoYW91dF92ZWMgaW50bwotCWJmZF90YXJnZXRfdmVjdG9yIGFycmF5LiBNb3ZlIG5ldGJzZDM4Nl92ZWMgdG8gYWxwaGFiZXRpYyBvcmRlcgotCWxvY2F0aW9uLgotCi0JKiByZWxvYy5jIChfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpIEFkZCBzdXBwb3J0IGZvcgotCXNwZWNpYWxfZnVuY3Rpb24xIGluIGhvd3RvLgotCi0JKiBsaWJhb3V0Lmg6IGFkZCBNX05TMzIwMzIsIE1fTlMzMjUzMiwgTV81MzJfTkVUQlNEIGVudHJpZXMgaW4KLQltYWNoaW5lX3R5cGUgZW51bS4KLQotCSogY29uZmlndXJlLmluOiBhZGQgcGM1MzJtYWNoX3ZlYyBhbmQgbmV0YnNkNTMyX3ZlYyBlbnRyaWVzLgotCi0JKiBjb25maWcuYmZkOiBhZGQgcGM1MzJtYWNoIGhvc3QgZW50cmllcy4gVXNlIGZvciBib3RoCi0JbnMzMmstcGM1MzItbWFjaCBhbmQgbnMzMmstcGM1MzItbmV0YnNkLgotCi0JKiBjb25maWcuYmZkOiBpdCBkb2Vzbid0IHdvcmsgdG8gdXNlIGkzODYtbWFjaDMgZm9yIG5zMzJrKi0qLW1hY2guCi0JYWRkIG5zMzJrLXBjNTMyLW1hY2gqIGFuZCBuczMyay0qLW5ldGJzZCogZW50cmllcy4KLQotCSogYmZkLWluMi5oOiBBZGQgbnMzMmsgc3BlY2lmaWMgcmVsb2NhdGlvbnMgdG8gYmZkX3JlbG9jX2NvZGVfcmVhbAotCWVudW0uCi0KLQkqIGJmZC1pbjIuaDogQWRkIHNwZWNpYWxfZnVuY3Rpb24xIHRvIHN0cnVjdCBob3d0by4gQ2hhbmdlIEhPV1RPCi0JYW5kIE5FV0hPV1RPIG1hY3JvcyB0byBtYWtlIHNwZWNpYWxfZnVuY3Rpb24xIE5VTEwuIE5ld3cgSE9XVE8yCi0JbWFjcm8uCi0KLQkqIGJmZC1pbjIuaDogU3BsaXQgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0Ci0JYW5kIGNvcnJlc3BvbmRpbmcgdHlwZWRlZiBpbnRvIHR3byBzdGF0ZW1lbnRzLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBlbnRyeSBiZmRfYXJjaF9uczMyayB0byBiZmRfYXJjaGl0ZWN0dXJlIGVudW0uCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfbnMzMmtfYXJjaCBwcm90b3R5cGUsIGFuZCBlbnRyeSBpbgotCWFyY2h1cmVzX2luaXRfdGFibGUuIAotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IEFsbG93IGZvciB0YXJnZXQgZGVwZW5kZW50Ci0JTVlfcHV0X3JlbG9jIG1hY3JvLiBBbGxvdyBmb3IgdGFyZ2V0IGRlcGVuZGVudCBzcGVjaWFsX2Z1bmN0aW9uMQotCXRvIGFwcGx5IHRoZSByZWxvY2F0aW9uLiAKLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogQWxsb3cgZm9yIHRhcmdldAotCWRlcGVuZGVudCBkZXRlcm1pbmF0aW9uIG9mIHJlbG9jIGhvd3RvLiBBbGxvdyBmb3IgdGFyZ2V0IGRlcGVuZGVudAotCXNwZWNpYWxfZnVuY3Rpb24xIHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uLgotCi0JKiBhb3V0eC5oIChnZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZXRlY3QgYnNzIGFuZCByZXR1cm4gMC4KLQotCSogYW91dHguaCAoc2x1cnBfcmVsb2NfdGFibGUpOiBEZXRlY3QgYnNzIGFuZCBzdWNjZXNmdWxseSByZWFkCi0JemVybyByZWxvYyBlbnRyaWVzLgotCi0JKiBhb3V0eC5oIChtYWNoaW5lX3R5cGUpOiBBZGQgYmZkX2FyY2hfbnMzMmsgY2FzZS4KLQotCSogYW91dHguaDogU3RhdCB0byBkZXRlcm1pbmUgZXhlY3V0YWJsZSBzdGF0dXMgaWYgU1RBVF9GT1JfRVhFQwotCWlzIGRlZmluZWQgKG5vdCBqdXN0IE1BQ0gpLiBVc2UgZnN0YXQgaW5zdGVhZCBvZiBzdGF0IGFuZCBjaGVjawotCWZvciBmc3RhdCBlcnJvci4KLQotCSogYW91dHguaDogQWxsb3cgdGFyZ2V0IGRlcGVuZGVudCBzd2FwX3N0ZF9yZWxvY197aW4sb3V0fS4KLQotCSogYW91dHguaDogQWxsb3cgQ1RPUlMgcmVsb2MgaW5mbyB0byBiZSBpbiB0YXJnZXQgZGVwZW5kZW50IHJlbG9jCi0JdGFibGUuCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6IEFwcGx5IFNXQVBfTUFHSUMgKGlmIGRlZmluZWQpIGFmdGVyCi0Jc3dhcF9leGVjX2hlYWRlcl9pbiwgb3RoZXJ3aXNlIHdlIGhhdmUgbWFnaWMgaW4gdGhlIHdyb25nIG9yZGVyLgotCi1UaHUgSnVsIDE0IDExOjQ3OjI3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogSGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzLgotCi1UdWUgSnVsIDEyIDEyOjA4OjEwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWl4Mzg2LWNvcmUuYywgYW91dGYxLmgsIGNpc2NvLWNvcmUuYywgZWxmY29kZS5oLCBocHBhYnNkLWNvcmUuYywKLQlocHV4LWNvcmUuYywgaXJpeC1jb3JlLmMsIGx5bngtY29yZS5jLCBvc2YtY29yZS5jLCBwdHJhY2UtY29yZS5jLAotCXJzNjAwMC1jb3JlLmMsIHRyYWQtY29yZS5jOiAgUmVtb3ZlIFNFQ19BTExPQyBmbGFnIGZyb20gLnJlZwotCXNlY3Rpb25zLCAucmVnIHNlY3Rpb25zIGFyZSBub3QgYWxsb2NhdGVkIGFuZCBjb250YWluIGRlYnVnCi0JaW5mb3JtYXRpb24gb25seS4KLQkqIG9zZi1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uLCBvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6ICBVc2UKLQliZmRfbWFrZV9zZWN0aW9uX2FueXdheSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIHVuaXF1ZSBzZWN0aW9uIG5hbWVzLgotCi1UdWUgSnVsIDEyIDExOjQxOjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbik6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4sIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQpOiBEZWNsYXJlLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZV9pbml0KTogQ29ycmVjdCBjYXN0LgotCi0JKiBhb3V0LWVuY2FwLmMgKEFSQ0gpOiBEb24ndCBkZWZpbmUuICBPYnNvbGV0ZS4KLQkqIGFvdXQwLmMsIGFvdXR4LmgsIGdlbi1hb3V0LmMsIGhwMzAwYnNkLmMsIGhwMzAwaHB1eC5jOiBMaWtld2lzZS4KLQkqIGkzODZhb3V0LmMsIGkzODZic2QuYywgaTM4NmR5bml4LmMsIGkzODZsaW51eC5jOiBMaWtld2lzZS4KLQkqIGkzODZseW54LmMsIG02OGtseW54LmMsIG1pcHNic2QuYywgbmV0YnNkMzg2LmM6IExpa2V3aXNlLgotCSogbmV3c29zMy5jLCBzcGFyY2x5bnguYywgc3Vub3MuYzogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMTEgMjA6MDg6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogTWFrZSB0aGUgc2l4dGggYXJndW1lbnQgYm9vbGVhbiwgbm90Ci0JdGhlIHNldmVudGguICBGcm9tIGdhcnlAdHV2YS5wYWNzZW1pLm96LmF1IChnYXJ5IGtvcGZmKS4KLQotU3VuIEp1bCAxMCAwOToxMjowMiAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGJmZF9mcmVlX2NhY2hlZF9pbmZvKTogQ2hhbmdlIG5hbWUgb2YgRlJFRSB0byBCRkNJX0ZSRUUKLQlpbiBvcmRlciBub3QgdG8gY29sbGlkZSB3aXRoIEx5bnhPUydzIGRlZmluaXRpb24gb2YgRlJFRSBpbgotCS91c3IvaW5jbHVkZS9zeXMvcHJvYy5oCi0KLVRodSBKdWwgIDcgMTQ6MTg6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgY2xvYmJlciB0aGUgcmVsb2NhdGlvbgotCXZhbHVlIGZvciBjb2ZmLUludGVsLWxpdHRsZSBvciBjb2ZmLUludGVsLWJpZy4gIEhhY2sgdXBvbiBoYWNrLgotCi1UaHUgSnVsICA3IDEwOjEwOjM0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkKTogIEFkZCBlbnRyeSBmb3IgR09UIHJlbG9jYXRpb25zCi0Jd2hpY2ggYXJlIHByZXNlbnQgaW4gc3VuMyBzaGFyZWQgbGlicmFyaWVzLCB0byBhdm9pZCBhc3NlcnRpb25zCi0Jd2hlbiByZWFkaW5nIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLgotCi1UaHUgSnVsICA3IDEwOjE5OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoUl9IUFBBX0NPTVBMRVgpOiBGaXggZHVtYiB0eXBvLiAKLQotV2VkIEp1bCAgNiAxOToyMTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N5c3Y0LmggKHFzb3J0LCBzdHJ0b2wpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX291dHB1dF9zeW0pOiBEb24ndCBjYWxsIG91dHB1dF9zeW1ib2xfaG9vawotCWlmIGl0IGlzIE5VTEwuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IEFkZCBpZ25vcmVkIGluZm8KLQlhcmd1bWVudCB0byBjb3JyZXNwb25kIHRvIHJlY2VudCBsaWJlbGYuaCBjaGFuZ2UuCi0KLVdlZCBKdWwgIDYgMDA6NDg6NTcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiAgTmV3IGhvb2sgdG8KLQlhZGRpdGlvbmFsbHkgY29weSBvYmplY3QgdHlwZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhbHBoYSBmaWxlCi0JaGVhZGVyIHRvIHRoZSBCRkQgZmxhZ3MuCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6ICBVc2UgaXQuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6ICBBZGQgRFlOQU1JQyB0byBvYmplY3RfZmxhZ3MuCi0JKiBhb3V0NjQuYzogIEZpeCB0eXBvIGluIGNvbmRpdGlvbmFsIFFNQUdJQyBkZWZpbml0aW9uLgotCi1XZWQgSnVsICA2IDAwOjEzOjE3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhYnNkLWNvcmUuYyAoaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wKTogU2FuaXR5IGNoZWNrIHRoZQotCXZhbHVlIG9mIGNsaWNrc3ogdG8gaGVscCB3ZWVkIG91dCBub24gSFBQQSBCU0QgY29yZSBmaWxlcy4KLQotVHVlIEp1bCAgNSAxMzoyNjowMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQlNYWNoIDMgc3VwcG9ydC4KLQkqIGNvbmZpZy5iZmQgKG04OCotKi1tYWNoMyosIG1pcHMqLWRlYy1tYWNoMyosIG1pcHMqLSotbWFjaDMqKToKLQlOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0XTg2LSotbWFjaDMqLCBuczMyay0qLW1hY2gzKik6IFJlY29nbml6ZQotCSJtYWNoMyIgaW5zdGVhZCBvZiAibWFjaCIuCi0JKG04OCotKi1tYWNoMyosIG1pcHMqLWRlYy1tYWNoMyosIG1pcHMqLSotbWFjaDMqKTogTmV3IGhvc3RzLgotCSogdGFyZ2V0cy5jIChtODhrbWFjaDNfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGkzODZtYWNoM192ZWMgYW5kIG04OGttYWNoM192ZWMsIGJ1dAotCWluc2lkZSAjaWYgMC4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCkgW01BQ0hdOiBSZWNvZ25pemUgZXhlY3V0YWJsZXMgYnkKLQljaGVja2luZyBmb3IgZXhlY3V0ZSBwZXJtaXNzaW9uLCBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQgZW50cnkKLQlwb2ludC4KLQkqIGkzODZtYWNoMy5jOiBVcGRhdGUsIGRlZmluZSBNQUNILCBOX1RYVE9GRiwgTl9UWFRBRERSLAotCU5fU0hBUkVEX0xJQiwgZG9uJ3QgaW5jbHVkZSBhb3V0LyouaCBmaWxlcywgZXRjLgotCSogbTg4a21hY2gzLmM6IE5ldyBmaWxlLCBtODhrIE1hY2ggMyB0YXJnZXQuCi0JKiBjb25maWcvbTg4ay1tYWNoMy5tdCwJY29uZmlnL21pcHMtbWFjaDMubXQ6IE5ldyBmaWxlcywgdGFyZ2V0Ci0JbWFrZWZpbGUgZnJhZ21lbnRzLgotCSogY29uZmlnL2kzODZtYWNoMy5taCwgY29uZmlnL204OGttYWNoMy5taCwgY29uZmlnL21pcHNtYWNoMy5taDoKLQlOZXcgZmlsZXMsIGhvc3QJbWFrZWZpbGUgZnJhZ21lbnRzLgotCSogaG9zdHMvbTg4a21hY2gzLmgsIGhvc3RzL21pcHNtYWNoMy5oOiBOZXcgZmlsZXMsIGhvc3QgZGVmaW5pdGlvbnMuCi0KLVR1ZSBKdWwgIDUgMTM6NTY6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBHZXQgYWxpZ25tZW50IG9mIGNvbW1vbiBzeW1ib2wgZnJvbQotCXN0X3ZhbHVlIGZpZWxkIG9mIHNhdmVkIEVMRiBzeW1ib2wgaW5mb3JtYXRpb24sIGlmIHRoZXJlIGlzIGFueS4KLQotTW9uIEp1bCAgNCAxOToxMzozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKFJfSFBQQV9DT01QTEVYKTogRGVmaW5lLgotCSogZWxmMzItaHBwYS5oIChSX0hQUEFfQ09NUExFWCk6IERlZmluZS4KLQkoZWxmMzJfaHBwYV9yZWxvY190eXBlKTogRGVsZXRlIFJfUEFSSVNDX1NUVUJfQ0FMTF8xNy4KLQotRnJpIEp1bCAgMSAxMjowNzo0MSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogU3VwcG9ydCBjb2RlIGZvciBlbmFibGluZyB0aGUgbmV3IHN0eWxlIGxpbmtlciBmb3IgUEEgRUxGLgotCSogZWxmY29kZS5oIChzd2FwX3N5bWJvbF9pbiwgc3dhcF9zeW1ib2xfb3V0KTogRXh0ZXJuYWxpemUuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBQYXNzIGxpbmtfaW5mbyB0bwotCXRoZSBiZWdpbl93cml0ZV9wcm9jZXNzaW5nIGhvb2suCi0JKGJmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUGFzcyBOVUxMIGZvciBuZXcgbGlua19pbmZvCi0JYXJndW1lbnQgdG8gZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rLgotCShlbGZfbGlua19vdXRwdXRfc3ltKTogQWNjZXB0IG5ldyAiaW5wdXRfc2VjdGlvbiIgYXJndW1lbnQgZm9yCi0JdGhlIHN5bWJvbHMncyBpbnB1dCBzZWN0aW9uLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4gIENhbGwgdGhlCi0JbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgaWYgaXQncyBkZWZpbmVkLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDYWxsIHRoZSBmaW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2sgaWYKLQlpdCdzIGRlZmluZWQuCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBEZWNsYXJlLgotCShlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogQWRkIG5ldyAiaW5mbyIgYXJndW1lbnQuCi0JKGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IFByb3ZpZGUKLQlhIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkoZWxmMzJfYmVkKTogQWRkIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rLgotCSogZWxmNjQtdGFyZ2V0Lmg6IExpa2V3aXNlLgotCQotCSogTWFqb3IgcmV3b3JrIG9mIHRoZSBQQSBFTEYgY29kZS4gIFVzZXMgdGhlIG5ldyBzdHlsZSBCRkQKLQlsaW5rZXIsIG1ham9yIGNsZWFudXBzLgotCSogaHBwYV9zdHVicy5oOiBSZXdyaXRlIGZyb20gc2NyYXRjaC4gIE11Y2ggc21hbGxlciBhbmQgc2ltcGxlci4KLQkqIGVsZjMyLWhwcGEuaDogRGVsZXRlIGFsbCBzeW1ib2wgZXh0ZW5zaW9uIHJlbGF0ZWQgY29kZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogRGVsZXRlIGRlY2wuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicywgZWxmMzJfaHBwYV9idWlsZF9zdHVicyk6IE5ldyBkZWNscy4KLQkqIGVsZjMyLWhwcGEuYzogU3ltYm9sIGV4dGVuc2lvbiBzdHVmZiBtb3ZlZCBmb3JtIGVsZjMyLWhwcGEuaAotCWludG8gZWxmMzItaHBwYS5jLiAgRG8gbm90IGluY2x1ZGUgYW91dDY0LmguCi0JKHR5cGRlZiBocHBhX3N0dWJfdHlwZSk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9zdHViX25hbWVfbGlzdF9zdHJ1Y3QpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbl9zdHJ1Y3QpOiBEZWxldGUuCi0JKGFyZ19yZWxvY190eXBlKTogVXNlIHNpbXBsZXIgZW51bWVyYXRpb25zLiAgQWxsIHJlZmVyZW5jZXMgY2hhbmdlZC4KLQkoYXJnX2xvY2F0aW9uLCBhcmdfcmVsb2NfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX3N5bWV4dG5fbWFwX3N0cnVjdCk6IERlbGV0ZS4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9nZXRfc3ltX2V4dG4pOiBEZWxldGUuCi0JKGZpbmRfc3R1YnMsIG5ld19zdHVicywgdHlwZV9vZl9taXNtYXRjaCk6IERlbGV0ZS4KLQkoZmluZF9zdHViX2J5X25hbWUsIGFkZF9zdHViX2J5X25hbWUpOiBEZWxldGUuCi0JKGhwcGFfZWxmX3N0dWJfZmluaXNoLCBocHBhX2VsZl9zdHViX3JlbG9jKTogRGVsZXRlLgotCShocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkKTogUmVuYW1lZC4gIFNpbXBsaWZ5LgotCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1YiwgaHBwYV9lbGZfY3JlYXRlX3N0dWJfc2VjKTogRGVsZXRlLgotCShocHBhX2VsZl9sb25nX2JyYW5jaF9uZWVkZWRfcCk6IERlbGV0ZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogRGVsZXRlLgotCShocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGVsZXRlLgotCShORVdfSU5TVFJVQ1RJT04pOiBEZWxldGUuCi0JKENVUlJFTlRfU1RVQl9PRkZTRVQpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9zaXplX3N5bWV4dCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2J1aWxkX29uZV9zdWIpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IE5ldyBmdW5jdGlvbi4KLQkobGlua2VyLCBzdHViIGFuZCBhcmd1bWVudCBoYXNoIHRhYmxlcyk6IEFkZCBhcHByb3ByaWF0ZQotCXN0cnVjdHVyZXMsIGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IGFsbCB0aHJlZQotCWhhc2ggdGFibGVzLgotCShocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogRG9uJ3QgbmVlZCBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbgotCWluIHRoaXMgZnVuY3Rpb24uCi0JKGFkZF9lbnRyeV90b19zeW1leHRfY2hhaW4pOiBBY2NlcHQgYSBzeW1ib2wncyBhcmd1bWVudCBsb2NhdGlvbgotCWluZm9ybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wgaXRzZWxmLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBTaW1wbGlmeS4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTdHViIHNlY3Rpb24gaXMgbm8gbG9uZ2VyIHNwZWNpYWwuCi0JKGhwcGFfZWxmX3JlbG9jKTogR3JlYXRseSBzaW1wbGlmeS4KLQkoZWxmMzJfaHBwYV9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogQWNjZXB0IGxpbmtfaW5mbyBhcmd1bWVudC4KLQlIYW5kbGUgYmVpbmcgY2FsbGVkIGZyb20gdGhlIEJGRCBiYWNrZW5kIGxpbmtlci4KLQkoZWxmMzJfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBObyBsb25nZXIgY2FsbCBzdHViX2ZpbmlzaC4KLQkKLU1vbiBKdW4gMjcgMTg6MDc6MDYgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogUHV0IGluIHBhcmVucyB0byBnZXQKLQlwcmVjZWRlbmNlIHJpZ2h0LgotCi1TdW4gSnVuIDI2IDE4OjA4OjI5IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJlbGYuaCAocmVsb2NhdGVfc2VjdGlvbik6IE5ldyBhcmd1bWVudCAib3V0cHV0X25hbWVzIiBhZGRlZAotCXRvIHByb3RvdHlwZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogTmV3IGFyZ3VtZW50ICJvdXRwdXRfbmFtZXMiCi0JYWRkZWQgdG8gcHJvdG90eXBlIG9mIHJlbG9jYXRlX3NlY3Rpb24uICBQYXNzIHRoZSBvdXRwdXQgc3ltYm9sCi0JbmFtZXMgdG8gcmVsb2NhdGVfc2VjdGlvbi4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSAib3V0cHV0X25hbWVzIiB0bwotCWRldGVybWluZSB0aGUgbmFtZSBvZiBhIGxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1GcmkgSnVuIDI0IDA4OjE1OjQyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCUFkZCBTb2xhcmlzIEJDUCAodGhlIHBhcnQgb2YgU29sYXJpcyB3aGljaCBhbGxvd3MgaXQgdG8gcnVuCi0JU3VuT1M0IGEub3V0IGZpbGVzKSBjb3JlIGZpbGUgaGFuZGxpbmcuCi0JKiBhb3V0ZjEuaCAoZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSwgc3dhcGNvcmVfc29sYXJpc19iY3ApOgotCU5ldyBzdHJ1Y3R1cmUgYW5kIGl0cyBzd2FwIGluIGZ1bmN0aW9uLgotCShpbnRlcm5hbF9zdW5vc19jb3JlKTogIE5ldyBtZW1iZXIgY19kYXRhX2FkZHIsIHRvIHJlY2VpdmUgdGhlCi0Jc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWN0aW9uIGluIHRoZSBjb3JlIGZpbGUuCi0JKHN3YXBjb3JlX3N1bjMsIHN3YXBjb3JlX3NwYXJjLCBzdW5vczRfY29yZV9maWxlX3ApOiAgVXNlIGl0LgotCShzdW5vczRfY29yZV9maWxlX3ApOiAgUmVjb2duaXplIFNvbGFyaXMgQkNQIGNvcmUgZmlsZS4KLQkoc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6ICBBbHdheXMgaW5kaWNhdGUgbWF0Y2gKLQlmb3IgU29sYXJpcyBCQ1AgY29yZSBmaWxlcy4KLQotVGh1IEp1biAyMyAxNTozMToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHNoYXJlZCBsaWJyYXJpZXMsIGZyb20gRXJpYwotCVlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IElmIERZTkFNSUMsIHNldCBlX3R5cGUgdG8gRVRfRFlOLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksCi0JY3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgZm9yIGZpcnN0IGlucHV0IEJGRCB3aXRoIHRoZSByaWdodCBmb3JtYXQuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgY3JlYXRlIC5pbnRlcnAgc2VjdGlvbgotCWlmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFNraXAgZHluYW1pYyBzZWN0aW9ucyBpbiBpbnB1dCBmaWxlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBpdCdzIE9LIGZvcgotCWR5bm9iaiB0byBoYXZlIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgU0VDX0lOX01FTU9SWS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSBzZXQgLmludGVycAotCXNlY3Rpb24gaWYgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogRG9uJ3Qgc2V0IERZTkFNSUMganVzdCBiZWNhdXNlIHRoZXJlCi0JaXMgYW4gU0hUX0RZTkFNSUMgc2VjdGlvbi4KLQotCSogY2YtaTM4Nmx5bnguYyAoaTM4NmNvZmZfdmVjKTogRG9uJ3QgaW5jbHVkZSBEWU5BTUlDIGluCi0Jb2JqZWN0X2ZsYWdzLgotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogTGlrZXdpc2UuCi0JKiBocHBhYnNkLWNvcmUuYyAoaHBwYWJzZF9jb3JlX3ZlYyk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IERvbid0IHNldCBTRUNfUkVMT0MKLQlqdXN0IGJlY2F1c2UgRFlOQU1JQyBpcyBzZXQuCi0KLVRodSBKdW4gMjMgMTI6NTM6NDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzIGFuZAotCS0td2l0aC02NC1iaXQtYmZkIHRvIC0tZW5hYmxlLTY0LWJpdC1iZmQuCi0JKiBNYWtlZmlsZS5pbiwgbXB3LW1ha2UuaW4sIHRhcmdldHMuYzogQ2hhbmdlIGNvbW1lbnRzLgotCi1XZWQgSnVuIDIyIDE3OjU5OjU5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1lbGYqKTogTmV3IHRhcmdldCwganVzdCBsaWtlCi0JcG93ZXJwYy0qLXN5c3Y0Ki4KLQotCSogbGlua2VyLmMgKEZBSUwpOiBVbmRlZmluZSBtYWNybyBiZWZvcmUgZGVmaW5pbmcgYXMgZW51bS4KLQotV2VkIEp1biAyMiAxMDo1Mjo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSW5pdGlhbGl6ZQotCXBhc3MgZnJvbSBhYmZkLT5hcmNoaXZlX3Bhc3MsIGFuZCBzYXZlIGl0IHRoZXJlIGFzIHdlbGwuCi0KLQkqIGhhc2guYyAoYmZkX2hhc2hfYWxsb2NhdGUpOiBEb24ndCBjYWxsIGJmZF9zZXRfZXJyb3IgaWYKLQlvYnN0YWNrX2FsbG9jIHJldHVybnMgTlVMTCB1bmxlc3MgdGhlIHNpemUgaXMgbm9uLXplcm8uCi0KLQkqIGxpbmtlci5jIChhcmNoaXZlX2hhc2hfYWxsb2NhdGUpOiBEZWZpbmUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBVc2UgYXJjaGl2ZV9oYXNoX2FsbG9jYXRlCi0JcmF0aGVyIHRoYW4gb2JzdGFja19hbGxvYywgZm9yIGNsYXJpdHkuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IENvcnJlY3QuCi0KLQkqIGFvdXQ2NC5jIChCTUFHSUMsIFFNQUdJQyk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgRnJvbQotCVBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4KLQotCUxpbnV4IFpNQUdJQyBzdXBwb3J0IGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgZmllbGQgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZS4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IE9ubHkgc2V0IGFsaWdubWVudCBhY2NvcmRpbmcgdG8KLQlhcmNoaXRlY3R1cmUgaWYgdGhlIHNlY3Rpb24gc2l6ZXMgYXJlIGFsaWduZWQgdG8gdGhhdCBhbGlnbm1lbnQsCi0JZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0JKE1ZKHNldF9zaXplcykpOiBJbml0aWFsaXplIHptYWdpY19kaXNrX2Jsb2NrX3NpemUgZmllbGQuCi0JKiBhb3V0eC5oIChhZGp1c3Rfel9tYWdpYyk6IFNldCB6dGloIGlmIHVzaW5nIHFfbWFnaWNfZm9ybWF0LiAgU2V0Ci0JdGV4dCBzZWN0aW9uIGZpbGVwb3MgdG8gem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSBpZiBub3QgenRpaC4gIFVzZSBhCi0JZGlmZmVyZW50IHBhZGRpbmcgYWxnb3JpdGhtIGlmIG5vdCB6dGloLgotCSogaTM4NmxpbnV4LmMgKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IEp1c3Qgc2tpcCBOX1NUQUIgYW5kIE5fRk4KLSAgICAgICAgc3ltYm9sczsgZG9uJ3QgbG9vayB0aGVtIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgRnJvbQotICAgICAgICByYWxwaGNAcHlyYW1pZC5jb20gKFJhbHBoIENhbXBiZWxsKS4KLQotVHVlIEp1biAyMSAxMTo0NzoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtZ28zMi5jIChnbzMyY29mZl9hcmNoaXZlX3ApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9hYnNfc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF9hYnNfc2VjdGlvbl9wdHIsIGJmZF9pc19hYnNfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX3VuZF9zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX3VuZF9zZWN0aW9uX3B0ciwgYmZkX2lzX3VuZF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfY29tX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfY29tX3NlY3Rpb25fcHRyKTogRGVmaW5lLgotCShiZmRfaW5kX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfaW5kX3NlY3Rpb25fcHRyLCBiZmRfaXNfaW5kX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9hYnNfc3ltYm9sLCBiZmRfY29tX3N5bWJvbCk6IE1ha2UgY29uc3QuCi0JKGJmZF91bmRfc3ltYm9sLCBiZmRfaW5kX3N5bWJvbCk6IExpa2V3aXNlLgotCShnbG9iYWxfc3ltcyk6IENhc3QgaW5pdGlhbGl6YXRpb24gb2Ygc2VjdGlvbiBmaWVsZC4KLQkoU1REX1NFQ1RJT04pOiBEZWZpbmUgYXMgY29uc3QsIGFuZCBjYXN0IGluaXRpYWxpemF0aW9ucy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIE1hbnkgZmlsZXM6IENoYW5nZSB1c2VzIG9mIGJmZF9hYnNfc2VjdGlvbiwgZXRjLiwgdG8gdXNlCi0JYmZkX2Fic19zZWN0aW9uX3B0ciBvciBiZmRfaXNfYWJzX3NlY3Rpb24sIGV0Yy4KLQotTW9uIEp1biAyMCAxMTowNjoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1hbnkgZmlsZXM6IGNoYW5nZSBhbGwgYmZkX3RhcmdldCB2ZWN0b3JzIHRvIGJlIGNvbnN0LiAgQ2hhbmdlCi0JYWxsIHVzZXMgb2YgYmZkX3RhcmdldCAqIHRvIGJlIGNvbnN0IGJmZF90YXJnZXQgKi4gIENoYW5nZQotCWJmZF90YXJnZXRfdmVjdG9yIGFuZCBiZmRfZGVmYXVsdF92ZWN0b3IgYXJyYXlzIHRvIGJlIGNvbnN0Ci0JYmZkX3RhcmdldCAqIGNvbnN0ICouCi0KLQkqIGVjb2ZmLmMsIGxpYmVjb2ZmLmgsIGVjb2Zmc3dhcC5oLCBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLAotCWVsZjMyLW1pcHMuYzogUmVuYW1lZCBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIEVDT0ZGIHJvdXRpbmVzIHdoaWNoCi0JYXJlIGxvY2FsIHRvIEJGRCB0byBzdGFydCB3aXRoIF9iZmRfZWNvZmYgaW5zdGVhZCBvZiBqdXN0IGVjb2ZmLgotCi0JKiBlY29mZi5jIChlY29mZl9zd2FwX3Rpcl9pbik6IENoYW5nZSBpbnB1dCBhcmd1bWVudCB0byBjb25zdC4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQWRkIG5ldyBhcmd1bWVudHMgdG8gY29ycmVzcG9uZCB0bwotCXJlYWRfZGVidWdfaW5mbyBlbnRyeSBwb2ludCBpbiBlY29mZl9kZWJ1Z19zd2FwIHN0cnVjdHVyZS4KLQlDaGFuZ2UgYWxsIGNhbGxzLgotCSogbGliZWNvZmYuaCAoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IENoYW5nZSBkZWNsYXJhdGlvbi4KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Rpcl9pbiwgZWNvZmZfc3dhcF90aXJfb3V0KTogRGVjbGFyZS4KLQkoZWNvZmZfc3dhcF9ybmR4X2luLCBlY29mZl9zd2FwX3JuZHhfb3V0KTogRGVjbGFyZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcKLQllY29mZl9kZWJ1Z19zd2FwIGZpZWxkcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBVbmRlZmluZSBSRUFELgotCShtaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwKTogSW5pdGlhbGl6ZSBuZXcgZWNvZmZfZGVidWdfc3dhcAotCWZpZWxkcy4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX2JpZ21pcHNfdmVjKTogVXNlIGVjb2ZmLm8gYW5kCi0JZWNvZmZsaW5rLm8uCi0JKGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyk6IExpa2V3aXNlLgotCShlY29mZl9iaWdfdmVjLCBlY29mZl9saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogUmVtb3ZlIGVjb2ZmLm8gYW5kIGVjb2ZmbGluay5vLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlY29mZi5vIGFuZCBlY29mZmxpbmsuby4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogQ2hlY2sgZmxhdm91ciBvZiBzdWIsIG5vdCBhYmZkLAotCXdoZW4gY29tcHV0aW5nIHJlbG9jIHNpemVzLiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgdHJ5IHRvIGNvbXB1dGUgbWF4aW11bQotCXJlbG9jIGNvdW50IG9yIHNpemUgZm9yIGEgbm9uLUVMRiBmaWxlLgotCi0JKiBtaXBzYnNkLmMgKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBEZWZpbmUgdG8gYXZvaWQgd2FybmluZy4KLQotCSogaHAzMDBocHV4LmMgKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBEZWZpbmUgdG8gYXZvaWQgd2FybmluZy4KLQkoQk1BR0lDLCBRTUFHSUMpOiBEZWZpbmU7IHVzZWQgYnkgYW91dHguaC4KLQkoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENoYW5nZSB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzCi0JY2FsbHMgdG8gdXNlIG5ldyBwYXJhbWV0ZXJzLgotCi1GcmkgSnVuIDE3IDE0OjQ1OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogU2V0IHRoZSBhbGlnbm1lbnRzIG9mIHRoZSB0ZXh0LAotCWRhdGEgYW5kIGJzcyBzZWN0aW9ucyBhZnRlciBkZXRlcm1pbmluZyB0aGUgYXJjaGl0ZWN0dXJlLgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IFRyZWF0IGEgY29tbW9uIHN5bWJvbCBmcm9tIGEKLQlkeW5hbWljIG9iamVjdCBhcyBiZWluZyBpbiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBvYmplY3QsIHJhdGhlcgotCXRoYW4gYXMgYmVpbmcgdW5kZWZpbmVkLgotCi1GcmkgSnVuIDE3IDExOjE2OjUwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJocHBhLmggKGJmZF9ocHBhX2luc24yZm10LCBocHBhX3JlYnVpbGRfaW5zbik6IE1ha2UgSU5MSU5FLgotCi0JKiBlbGYzMi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBEZWxldGUgZGVjbC4KLQotVGh1IEp1biAxNiAyMzozNjoyMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gcmVhZCBsb2NhbCBzeW1ib2xzCi0JaWYgdGhlcmUgYXJlbid0IGFueSBpbiB0aGUgaW5wdXQgZmlsZS4KLQotVGh1IEp1biAxNiAxNDoyNToyMiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jOiBNYW55IG5ldyBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIGZvciBsaW5rZXIKLQlzdXBwb3J0IGZvciBMaW51eCBzaGFyZWQgbGlicmFyaWVzLgotCSogYmZkLWluLmggKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UaHUgSnVuIDE2IDE0OjIzOjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogSWYgc2Vjb25kIGFyZ3VtZW50IGlzIGBgXycnLCB0aGVuLCBpbnN0ZWFkIG9mCi0JZWNob2luZyBjb25maWcgZmlsZSBuYW1lLCBlY2hvIHdoZXRoZXIgdGFyZ2V0IHVzZXMgbGVhZGluZwotCXVuZGVyc2NvcmVzIG9uIHN5bWJvbCBuYW1lcy4gIEFkZCBhcHByb3ByaWF0ZSBzZXR0aW5ncyB0bwotCWRpZmZlcmVudCBjYXNlcy4gIFVzZWQgYnkgYmludXRpbHMvY29uZmlndXJlLmluIHRvIHNldCBkZWZhdWx0IGZvcgotCWMrK2ZpbHQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgdHJ5aW5nIHRvIGdlbmVyYXRlIGEgc2hhcmVkCi0Jb2JqZWN0LCB3YXJuIGFuZCByZXR1cm4gZmFsc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQWNjZXB0IEJNQUdJQyBvYmplY3RzCi0JYW5kIHRyZWF0IHRoZW0gYXMgT01BR0lDLgotCi1XZWQgSnVuIDE1IDE4OjAyOjIxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQlFbmFibGUgc3BhcmMgdjkgc3VwcG9ydCBmb3IgcmVsZWFzZS4gIE5vdGUgdGhhdCB0aGlzIGlzIHN0aWxsIGEKLQl3b3JrIGluIHByb2dyZXNzLCBwZW5kaW5nIHJlbGVhc2Ugb2YgYW4gQUJJIHNwZWNpZmljYXRpb24uCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaW46IEluY2x1ZGUgc3BhcmMgdjkgZWxmIGNvbmZpZy4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogSGFuZGxlIHNwYXJjIHY5ICg2NCBiaXQpLgotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbCk6IE5ldyByZWxvYyB0eXBlcy4KLQkqIGVsZjY0LXNwYXJjLmM6IEltcGxlbWVudCBlbGY2NC1zcGFyYyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiwgdGFyZ2V0cy5jOiBVcGRhdGVkLgotCi1XZWQgSnVuIDE1IDAxOjM0OjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IGZpZWxkIGR0X25lZWRlZF9uYW1lLgotCShlbGZfZHRfbmVlZGVkX25hbWUpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGVsZl9kdF9uZWVkZWRfbmFtZQotCWlzIHNldCwgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgZmlsZW5hbWUgZm9yIHRoZSBEVF9ORUVERUQgZHluYW1pYwotCWVudHJ5LgotCSogZWxmLmMgKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCBzaW50ZXJwcHRyCi0JYXJndW1lbnQsIGFuZCBzZXQgaXQgdG8gdGhlIC5pbnRlcnAgc2VjdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBjb2ZmLXNwYXJjLmMgKFNXQVBfT1VUX1JFTE9DX0VYVFJBKTogRGVmaW5lIHRvIGNsZWFyIHRoZSByX3NwYXJlCi0JZmllbGQgb2YgdGhlIHJlbG9jIHJhdGhlciB0aGFuIGxldHRpbmcgaXQgYmUgZ2FyYmFnZS4KLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYXJtYXApOiBSZWNvZ25pemUgX18uU1lNREVGLyBhcyB3ZWxsIGFzCi0JX18uU1lNREVGOyB0aGUgZm9ybWVyIHdhcyB1c2VkIGluIG9sZCBMaW51eCBhcmNoaXZlcy4gIEZyb20KLQlqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KS4KLQotCSogaTM4NmxpbnV4LmMgKGkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmU7IGxpa2UKLQlNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIGluIGFvdXQtdGFyZ2V0LmgsIGJ1dCBzZXQgTUFDSFRZUEUgdG8KLQlNXzM4Ni4gIEZyb20ganJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0JKE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlZmluZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFRyZWF0IE5fU0VUViBzeW1ib2xzCi0JYXMgTl9EQVRBIHN5bWJvbHMuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oOiBSZXdyaXRlIHN5bWJvbCBkdXBsaWNhdGUgZWxpbWluYXRpb24gdG8gdXNlIEJGRCBoYXNoCi0JdGFibGVzLgotCShzdHJ1Y3Qgc3RyaW5ndGFiX2VudHJ5LCBzdHJ1Y3Qgc3RyaW5ndGFiX2RhdGEpOiBSZW1vdmUuCi0JKEhBU0hNQVhMRU4sIEhBU0hfQ0hBUiwgaGFzaCwgY29tcGFyZSwgbG9nMiwgZW1pdF9zdHJ0YWIpOiBSZW1vdmUuCi0JKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSwgc3RydWN0IHN0cnRhYl9oYXNoKTogRGVmaW5lLgotCShzdHJ0YWJfaGFzaF9uZXdmdW5jLCBzdHJ0YWJfaGFzaF9sb29rdXApOiBEZWZpbmUuCi0JKHN0cmluZ3RhYl9mcmVlLCBlbWl0X3N0cmluZ3RhYik6IERlZmluZS4KLQkoc3RyaW5ndGFiX2luaXQsIGFkZF90b19zdHJpbmd0YWIpOiBSZXdyaXRlLgotCShOQU1FKGFvdXQsd3JpdGVfc3ltcykpOiBVc2UgbmV3IHN0cmluZ3RhYiBjb2RlLgotCShzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8sIE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scywgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBiZmQtaW4uaCAoQkZEX1RSQURJVElPTkFMX0ZPUk1BVCk6IERlZmluZSBuZXcgQkZEIGZsYWcgdG8KLQlyZXF1ZXN0IEJGRCB0byB3cml0ZSBvYmplY3QgaW4gdGhlIHRyYWRpdGlvbmFsIGZvcm1hdCwgd2hhdGV2ZXIKLQl0aGF0IG1lYW5zIGZvciB0aGUgcGFydGljdWxhciBiYWNrZW5kLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBoYXNoLmMgKGJmZF9oYXNoX2FsbG9jYXRlKTogSWYgb2JzdGFja19hbGxvYyBmYWlscywgc2V0Ci0JYmZkX2Vycm9yX25vX21lbW9yeS4KLQotVHVlIEp1biAxNCAxMzowMDowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIHFfbWFnaWNfZm9ybWF0IHRvIHN1YmZvcm1hdAotCWVudW0uCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lIGFzIGZ1bmN0aW9uCi0JaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIENvcHkgc3ViZm9ybWF0IGluZm9ybWF0aW9uLgotCShNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERlZmluZSBhcyAwIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKE1ZKGJhY2tlbmRfZGF0YSkpOiBVc2UgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgcmF0aGVyIHRoYW4gMC4KLQkoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IFJlbmFtZSBmcm9tIGZpbmFsX2xpbmtfY2FsbGJhY2ssIGFuZAotCWRlZmluZSBvbmx5IGlmIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgaXMgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoTVlfYmZkX2ZpbmFsX2xpbmspOiBSZW5hbWUgdXNlIG9mIGZpbmFsX2xpbmtfY2FsbGJhY2sgdG8KLQlNWV9maW5hbF9saW5rX2NhbGxiYWNrLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBIYW5kbGUgUU1BR0lDIGxpa2UKLQlaTUFHSUMsIGJ1dCBzZXQgdGhlIHN1YmZvcm1hdCB0byBxX21hZ2ljX2Zvcm1hdC4gIEFib3J0IGlmIHRoZQotCW1hZ2ljIG51bWJlciBpZiBub3QgcmVjb2duaXplZC4KLQkoYWRqdXN0X3pfbWFnaWMpOiBVc2UgUU1BR0lDIGlmIHFfbWFnaWNfZm9ybWF0LgotCSogaTM4NmxpbnV4LmMgKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyKTogRGVmaW5lIGFzIDEuCi0JKGkzODZsaW51eF9iZmRfZmluYWxfbGluayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE1ZX2JmZF9maW5hbF9saW5rKTogRGVmaW5lIGFzIGkzODZsaW51eF9iZmRfZmluYWxfbGluay4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBDaGVjayBib3RoIHNlY3Rpb24gYW5kCi0Jb3V0cHV0X3NlY3Rpb24gYWdhaW5zdCBzZWN0aW9ucyBvZiBhYmZkLgotCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHR5cGUgb2YKLQl3cml0dGVuIGZyb20gYm9vbGVhbiB0byBjaGFyLiAgQWRkIG5ldyBmaWVsZCBzbWFsbC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB3cml0dGVuIHRvIDAKLQlyYXRoZXIgdGhhbiBmYWxzZS4gIEluaXRpYWxpemUgc21hbGwgdG8gMC4KLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogSWYgRUNPRkYgdHlwZSBpcyBzY1NVbmRlZmluZWQsIHNldAotCXNtYWxsLiAgSWYgc21hbGwgaXMgc2V0LCBhbmQgaGFzaCB0YWJsZSB0eXBlIGlzIGNvbW1vbiwgZm9yY2UgdGhlCi0Jc3ltYm9sIGludG8gYSBzZWN0aW9uIG5hbWVkIFNDT01NT04gYW5kIGNoYW5nZSB0aGUgRUNPRkYgdHlwZSBmcm9tCi0Jc2NDb21tb24gdG8gc2NTQ29tbW9uLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogU2V0IHdyaXR0ZW4gdG8gMSByYXRoZXIgdGhhbiB0cnVlLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgSk1QQUREUiByZWxvYwotCW92ZXJmbG93IGNoZWNrIHRvIGNvbnNpZGVyIHNlY3Rpb24gVk1BIG9mIGlucHV0IGZpbGUuCi0KLU1vbiBKdW4gMTMgMTQ6MjA6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGEKLQltYWNoaW5lIHR5cGUgb2YgNjgwMDAuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEFkZCBuZXcgYXJndW1lbnQgdW5rbm93bi4KLQlTZXQgKnVua25vd24gdG8gdHJ1ZSBpZiBtYWNoaW5lIHR5cGUgaXMgcmVhbGx5IHVua25vd24sIGFzIG9wcG9zZWQKLQl0byBNX1VOS05PV04gZm9yIHRoZSA2ODAwMC4KLQkoTkFNRShhb3V0LHNldF9hcmNoX21hY2gpKTogQ2hhbmdlIE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIGNhbGwKLQlhY2NvcmRpbmdseS4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBBZGQgbmV3IGFyZ3VtZW50IHRvCi0JcHJvdG90eXBlLgotCi1TdW4gSnVuIDEyIDIwOjIxOjAzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoRVhFQ19BVVhfSUQpOiBEZWZpbmUgYmFzZWQgb24gYXZhaWxhYmxpdHkgb2YgSFBVWF9BVVhfSUQKLQlvciBISVVYX0FVWF9JRC4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBVc2UgRVhFQ19BVVhfSUQgaW5zdGVhZCBvZiBIUFVYX0FVWF9JRC4KLQkoc29tX3dyaXRlX2FybWFwKTogVXNlIENQVV9QQV9SSVNDMV8wIGFzIHRoZSBtYWdpYyBudW1iZXIuICBOb3RlCi0Jc29tLmMgaXMgY2FyZWZ1bCB0byBhbHdheXMgZGVmaW5lIENQVV9QQV9SSVNDMV8wLgotCi1TYXQgSnVuIDExIDE2OjMyOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCB3ZWFrIHN5bWJvbHMgYXMgYW4gZXh0ZW5zaW9uIHRvIGEub3V0LgotCSogYW91dHguaCAoc3ltX2luX3RleHRfc2VjdGlvbik6IERvbid0IGRlZmluZS4KLQkoc3ltX2luX2RhdGFfc2VjdGlvbiwgc3ltX2luX2Jzc19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHN5bV9pc191bmRlZmluZWQsIHN5bV9pc19nbG9iYWxfZGVmbik6IExpa2V3aXNlLgotCShzeW1faXNfZGVidWdnZXJfaW5mbywgc3ltX2lzX2ZvcnRyYW5jb21tb24pOiBMaWtld2lzZS4KLQkoc3ltX2lzX2Fic29sdXRlLCBzeW1faXNfaW5kaXJlY3QpOiBMaWtld2lzZS4KLQkodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFJld3JpdGUgZm9yIGNsYXJpdHkuICBSZWFycmFuZ2UKLQlhcmd1bWVudHMgYW5kIGNoYW5nZSBjYWxsZXIuICBIYW5kbGUgd2VhayBzeW1ib2xzLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IERvbid0IGlnbm9yZSB3ZWFrIHN5bWJvbHMuICBQdWxsCi0Jb2JqZWN0IGluIGZyb20gYXJjaGl2ZSBpZiBhIHdlYWsgZGVmaW50aW9uIGlzIGZvdW5kIGZvciBhbgotCWV4aXN0aW5nIHVuZGVmaW5lZCBzeW1ib2wuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFB1dCBhbGwgY2FzZXMgaW4gc3dpdGNoLiAgU2V0IGZsYWdzIG9mIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCB0byAwLiAgSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMTAgMTM6MjU6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IEhhbmRsZSAuYnNzIHNlY3Rpb24uCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgQkZEX1JFTE9DX0NUT1IuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IGFzc3VtZQotCXRoZSBzZWN0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCBpcyBub3QgTlVMTC4KLQotV2VkIEp1biAgOCAyMzoxNTo1MyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6ICBTZXQgRVhFQ19QIGFuZCBzdGFydCBhZGRyZXNzIGZvciBHREIuCi0KLVdlZCBKdW4gIDggMjM6NTc6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogRG9uJ3QgdHJ5IHRvIHJlYWQgdGhlCi0Jc3RyaW5ncyBpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IFVzZSB0aGUgb3V0cHV0IHNlY3Rpb24gd2hlbgotCXdvcmtpbmcgb3V0IHRoZSB0eXBlLgotCi1UdWUgSnVuICA3IDEzOjI1OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogUHV0IHNoc3RydGFiLCBzeW10YWIgYW5kCi0Jc3RydGFiIHNlY3Rpb25zIGF0IGVuZCBvZiBmaWxlLiAgQXZvaWRzIGJ1ZyBpbiBzb21lIHZlcnNpb25zIG9mCi0JU1ZSNCBzdHJpcC4gIEZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAdGFudGFsdXMubnJsLm5hdnkubWlsPi4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBJZiBDT0ZGX1BBR0VfU0laRSBpcyBkZWZpbmVkLAotCXNldCBTRUNfREVCVUdHSU5HIGZvciBTVFlQX0lORk8gc2VjdGlvbnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgQ09GRl9QQUdFX1NJWkUgaXMKLQlkZWZpbmVkLCBhbmQgRF9QQUdFRCBpcyBzZXQsIHNldCB0aGUgZmlsZSBwb3NpdGlvbiBlcXVhbCB0byB0aGUKLQlzZWN0aW9uIFZNQSBtb2R1bG8gQ09GRl9QQUdFX1NJWkUuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IElmIEZfRVhFQyBpcyBzZXQsIHNldCBEX1BBR0VELgotCSogY29mZi1pMzg2LmM6IFNldCBEX1BBR0VEIGluIEJGRCB0YXJnZXQuCi0JKENPRkZfUEFHRV9TSVpFKTogRGVmaW5lLgotCSogY29mZi1tNjhrLmMsIGNvZmYtc3BhcmMuYzogTGlrZXdpc2UuCi0KLU1vbiBKdW4gIDYgMTA6NTc6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IHR1cm4gYSByZWxvYyBzZWN0aW9uCi0JaW50byBhIEJGRCBzZWN0aW9uIGp1c3QgYmVjYXVzZSBTSEZfQUxMT0MgaXMgc2V0OyByZXF1aXJlIHRoYXQgaXQKLQlub3QgdXNlIHRoZSBub3JtYWwgc3ltYm9sIHRhYmxlLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQlCZXR0ZXIgaW5kaXJlY3QgYW5kIHdhcm5pbmcgc3ltYm9sIGhhbmRsaW5nIGluc3BpcmVkIGJ5IFN0dWFydAotCVF1aWNrIDxzdHVja0Bjcy5tYW4uYWMudWs+LgotCSogbGlua2VyLmMgKGVudW0gbGlua19hY3Rpb24pOiBBZGQgUkVGLCBNSU5ELCBDV0FSTiwgUkVGQy4KLQkobGlua19hY3Rpb24pOiBDaGFuZ2UgVU5ERUZfUk9XL2RlZiBhbmQgVU5ERUZXX1JPVy9kZWYgZnJvbSBOT0FDVAotCXRvIFJFRi4gIENoYW5nZSBVTkRFRl9ST1cvaW5kciBhbmQgVU5ERUZXX1JPVy9pbmRyIGZyb20gQ1lDTEUgdG8KLQlSRUZDLiAgQ2hhbmdlIERFRl9ST1cvaW5kciBhbmQgQ09NTU9OX1JPVy9pbmRyIGZyb20gQ1lDTEUgdG8gTURFRi4KLQlDaGFuZ2UgREVGV19ST1cvaW5kciBmcm9tIENZQ0xFIHRvIE5PQUNULiAgQ2hhbmdlIElORFJfUk9XL2luZHIKLQlmcm9tIE1ERUYgdG8gTUlORC4gIENoYW5nZSBJTkRSX1JPVy93YXJuIGZyb20gV0FSTkMgdG8gQ1lDTEUuCi0JQ2hhbmdlIFdBUk5fUk9XL2RlZiBhbmQgV0FSTl9ST1cvaW5kciBmcm9tIE1XQVJOIHRvIENXQVJOLiAgQ2hhbmdlCi0JV0FSTl9ST1cvY29tIGZyb20gTVdBUk4gdG8gV0FSTi4gIENoYW5nZSBXQVJOX1JPVy93YXJuIGZyb20gTk9BQ1QKLQl0byBDWUNMRS4gIENoYW5nZSBTRVRfUk9XL3dhcm4gZnJvbSBXQVJOQyB0byBDWUNMRT4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBIYW5kbGUgUkVGLCBNSU5ELCBDV0FSTiBhbmQKLQlSRUZDLiAgSWYgYSBuZXcgaW5kaXJlY3Qgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQsIHB1c2ggdGhlCi0JcmVmZXJlbmNlIGRvd24gdG8gdGhlIHN5bWJvbCBpdCBwb2ludHMgdG8uICBGSXggaGFuZGxpbmcgb2YgV0FSTi4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBJZiBOX1dBUk5JTkcsIGRvbid0Ci0JY2xvYmJlciBlX3R5cGUgb2YgbmV4dCBzeW1ib2wuCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogTG9vcCBvbiBiZmRfbGlua19oYXNoX3dhcm5pbmcgYXMgd2VsbAotCWFzIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KTogTmV3IGZpZWxkIHdyaXR0ZW4uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpKTogSW5pdGlhbGl6ZSB3cml0dGVuLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVzZSB3cml0dGVuLCBub3Qgcm9vdC53cml0dGVuLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KTogTmV3IGZpZWxkIHdyaXR0ZW4uCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbi4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IHVzZSB3cml0dGVuLCBub3Qgcm9vdC53cml0dGVuLgotCSogZ2VubGluay5oIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkpOiBOZXcgZmllbGQgd3JpdHRlbi4KLQkqIGxpbmtlci5jIChfYmZkX2xpbmtfaGFzaF9uZXdmdW5jKTogRG9uJ3QgaW5pdGlhbGl6ZSB3cml0dGVuLgotCShnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB3cml0dGVuLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IFVzZSB3cml0dGVuLCBub3Qgcm9vdC53cml0dGVuLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZCBsaW5rZXIgZmllbGQuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBuZXcgdGRhdGEgbGlua2VyCi0JZmllbGQsIHJhdGhlciB0aGFuIG91dHN5bWJvbHMgYmVpbmcgbm9uLU5VTEwsIHRvIGRlY2lkZSB3aGV0aGVyIHRvCi0Jb3V0cHV0IHRoZSBzeW1ib2xzIGFuZCByZWxvY3MuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogU2V0IG5ldyB0ZGF0YSBsaW5rZXIgZmllbGQgdG8gdHJ1ZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IHRyeSB0byBjb3B5Ci0JZGF0YSB0byBhIG5vbi1FQ09GRiBmaWxlLgotCi0JKiBsaWJiZmQtaW4uaDogQWRkIHdhcm5pbmcgdGhhdCBsaWJiZmQuaCBpcyBhIGdlbmVyYXRlZCBmaWxlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVN1biBKdW4gIDUgMTU6MDI6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBzdXBwb3J0IEVMRiBzdHJpcCBhbmQgb2JqY29weSBvbiBkeW5hbWljYWxseSBsaW5rZWQKLQlmaWxlcy4KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBBZGQgcHJvdG90eXBlLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIGEgQkZEIHNlY3Rpb24gZnJvbSBhbiBTSFRfSEFTSAotCXNlY3Rpb24sIGFuZCBmcm9tIGFuIFNIVF9EWU5TWU0gc2VjdGlvbiwgYW5kIGZyb20gdGhlIGR5bmFtaWMKLQlzdHJpbmcgdGFibGUgc2VjdGlvbi4KLQkoZWxmX29iamVjdF9wKTogU2V0IERfUEFHRUQgaWYgdGhlcmUgaXMgYSBwcm9ncmFtIGhlYWRlci4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBSZW1vdmUuCi0JKGZpeF91cF9zdHJ0YWJzKTogUmVtb3ZlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFJld3JpdGUuICBOb3cgc2V0cyBzaF9lbnRzaXplLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogUmV3cml0ZS4gIE5vdyBzZXRzIHNoX2xpbmsgYW5kIHNoX2luZm8KLQlmb3IgYWxsIHNlY3Rpb25zLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogIERvbid0IGNhbGwgb2Jzb2xldGUKLQlmdW5jdGlvbnMgZWxmX21ha2Vfc2VjdGlvbnMgb3IgZml4X3VwX3N0cnRhYnMuCi0JKHN3YXBfb3V0X3N5bXMpOiBTZXQgc2hfYWRkcmFsaWduIHRvIEZJTEVfQUxJR04gcmF0aGVyIHRoYW4gNC4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBQZXJtaXQgd3JpdGluZyBEWU5BTUlDCi0Jb2JqZWN0cy4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFRyZWF0IFNIVF9EWU5TWU0gbGlrZSBvdGhlciBub3JtYWwKLQlzZWN0aW9ucy4gIElmIGFuIFNIVF9SRUwgb3IgU0hUX1JFTEEgc2VjdGlvbiBpcyBhbGxvY2F0ZWQgb3IgdXNlcwotCWFuIHVudXN1YWwgc3ltYm9sIHRhYmxlLCBwZXJtaXQgYSBCRkQgc2VjdGlvbiB0byBtYXAgdG8gaXQuCi0JUGVybWl0IG1vc3QgU0hUX1NUUlRBQiBzZWN0aW9ucyB0byBoYXZlIGEgQkZEIHNlY3Rpb24gbWFwcGVkIHRvCi0JdGhlbS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IHNoX2xpbmssIHNoX2luZm8gb3Igc2hfZW50c2l6ZQotCWZpZWxkcyBvZiBkeW5hbWljIHNlY3Rpb25zIGhlcmU7IGRvIGl0IGluIGFzc2lnbl9zZWN0aW9uX251bWJlcnMuCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IEFkZCBEX1BBR0VEIHRvIHBlcm1pdHRlZCBvYmplY3QKLQlmbGFncy4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBPbmx5IHNldCBTRUNfREFUQSBpZgotCVNFQ19MT0FEIGlzIHNldCwgcmF0aGVyIHRoYW4gY2hlY2tpbmcgU0VDX0FMTE9DLgotCi0JKiBsaWJiZmQtaW4uaCAoYmZkX3JlYWxsb2MpOiBDaGFuZ2UgbGFzdCBhcmcgdG8gInNpemVfdCBzaXplIi4KLQotRnJpIEp1biAgMyAxMDo1ODowMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjb21wdXRlIHRoZSBmaWxlIGhlYWRlcidzCi0JY2hlY2tzdW0gaGVyZS4KLQkoc29tX3dyaXRlX2hlYWRlcnMpOiBJbnN0ZWFkIGRvIGl0IGhlcmUuCi0KLQkqIGxpYmJmZC5oIChiZmRfcmVhbGxvYyk6IENoYW5nZSBsYXN0IGFyZyB0byAic2l6ZV90IHNpemUiLgotCi1UaHUgSnVuICAyIDE3OjM5OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiBJbmNsdWRlIDxzdGRsaWIuaD4uICBEb24ndCBkZWNsYXJlIGZyZWUsIGV4aXQgb3IKLQlnZXRlbnYuCi0KLQlBZGQgbGlua2VyIHN1cHBvcnQgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBzdW5vcy5jOiBJbmNsdWRlIGJmZGxpbmsuaC4gIEFkZCBtYW55IG5ldyBmdW5jdGlvbnMgYW5kCi0JZGVmaW5pdGlvbnMgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0JKiBiZmQtaW4uaCAoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGFvdXR4LmggKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgdG8gbGliYW91dC5oLgotCShzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2hhc2hfbG9va3VwLCBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgotCShhb3V0X2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSk6IFJlbmFtZSBmcm9tIGFvdXRfbGlua19oYXNoX25ld2Z1bmMKLQlhbmQgbWFrZSBleHRlcm5hbGx5IHZpc2libGUuCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKSk6IENhbGwKLQlOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpLCBub3QgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdC4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgZmFpbCBpZiBubyBzeW1ib2xzLiAgSWYgaXQgZXhpc3RzLAotCWNhbGwgYWRkX2R5bmFtaWNfc3ltYm9scyBiYWNrZW5kIGVudHJ5IHBvaW50IGZvciBkeW5hbWljIG9iamVjdHMuCi0JVXNlIGFkZF9vbmVfc3ltYm9sIGJhY2tlbmQgZW50cnkgcG9pbnQgaWYgaXQgZXhpc3RzLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBDYWxsIGZpbmlzaF9keW5hbWljX2xpbmsgYmFja2VuZCBlbnRyeQotCXBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua19pbnB1dF9iZmQpOiBGb3IgYSBkeW5hbWljIG9iamVjdCwgY2FsbAotCWxpbmtfZHluYW1pY19vYmplY3QgYmFja2VuZCBlbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogQ2FsbCB3cml0ZV9keW5hbWljX3N5bWJvbCBiYWNrZW5kCi0JZW50cnkgcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBEb24ndCByZWFkIHRoZSByZWxvY3MgaWYgdGhleSBoYXZlCi0JYWxyZWFkeSBiZWVuIHJlYWQuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLCBmb3IgYQotCXJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCBjYWxsIGNoZWNrX2R5bmFtaWNfcmVsb2MgYmFja2VuZAotCWVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCSogbGliYW91dC5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAgSW5jbHVkZQotCWJmZGxpbmsuaC4KLQkoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KTogTW92ZSBpbiBmcm9tIGFvdXR4LmguCi0JKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaGFzaF9sb29rdXAsIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKTogTGlrZXdpc2UuCi0JKGFvdXRfaGFzaF90YWJsZSk6IExpa2V3aXNlLgotCShzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGFkZF9keW5hbWljX3N5bWJvbHMsCi0JYWRkX29uZV9zeW1ib2wsIGxpbmtfZHluYW1pY19vYmplY3QsIHdyaXRlX2R5bmFtaWNfc3ltYm9sLAotCWNoZWNrX2R5bmFtaWNfcmVsb2MsIGFuZCBmaW5pc2hfZHluYW1pY19saW5rLgotCShzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0KTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKGFvdXRfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG5ldyBhY2Nlc3NvciBtYWNyby4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkpOiBEZWNsYXJlLgotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBJbml0aWFsaXplIG5ldyBhb3V0X2JhY2tlbmRfZGF0YQotCWZpZWxkcy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIGkzODZhb3V0LmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIGkzODZtYWNoMy5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jIChzcGFyY2x5bnhfYW91dF9iYWNrZW5kKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgemVybyBvdXQgY2FjaGVkCi0JdW50aWwgd2Uga25vdyBpdCBpcyBub24tTlVMTC4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBEb24ndCBza2lwIGEgd2FybmluZyBzeW1ib2wgZXZlbiBpZiBpdAotCWhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiBvdXQuICBJZiBza2lwcGluZyBhbiBpbmRpcmVjdCBzeW1ib2wsCi0Jc2tpcCB0aGUgbmV4dCBzeW1ib2wgYXMgd2VsbC4KLQotV2VkIEp1biAgMSAxNDozNzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogRG9uJ3QgZGVjbGFyZSBxc29ydCwgbWFsbG9jIG9yIHJlYWxsb2MuCi0KLVRodSBNYXkgMjYgMTM6NTY6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IENhc3QgYmZkX2J5dGUgcG9pbnRlcgotCXRvIGNoYXIgcG9pbnRlciB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQotCSogZGVwLWluLnNlZDogUmVtb3ZlIHNwYWNlcyBiZWZvcmUgY29sb25zLgotCi0JTWVyZ2VkIGNoYW5nZXMgYmFjayBpbiBmcm9tIEZTRiBnYXMgcmVsZWFzZSAyLjM6Ci0KLQkqIE1ha2VmaWxlLmluIChzdG1wLWJmZC5oKTogV3JhcCBgaWYnIGJsb2NrIGFyb3VuZCBncmVwCi0JaW52b2NhdGlvbiwgdG8gYXZvaWQgYSBidWcgaW4gQlNEIDQuNCBtYWtlLgotCi0JRnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkqIG1pcHNic2QuYyAobWlwc19maXhfam1wX2FkZHIpOiBJZiBzeW1ib2wgaXMgdW5kZWZpbmVkLCByZXR1cm4gYW4KLQllcnJvci4KLQkobWlwc19maXhfaGkxNl9zKTogRGl0dG8uCi0KLQlGcmkgTWF5IDEzIDIxOjIxOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogbWFrZWZpbGUuZG9zOiBkZWZpbmUgYSBkZWZhdWx0IHRhcmdldCwgb3IgYXJjaGl2ZXMgd29uJ3Qgd29yawotCSAgZHVlIHRvIG11bHRpcGxlIG1hdGNoZXMuCi0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIGZvciBsYXRlc3QgZmlsZXMKLQkqIG1ha2VmaWxlLmRvczogdXBkYXRlIGZvciBjb3JyZWN0IHRhcmdldHMgYW5kIHNvdXJjZXMKLQkqIGNvZmYtZ28zMi5jOiBbbmV3XSBnbzMyJ3MgQ09GRiBmb3JtYXQgKGkzODZjb2ZmIHdpdGggdW5kZXJzY29yZXMpCi0JKiB0YXJnZXRzLmM6IGFkZCBnbzMyY29mZiB0YXJnZXQKLQkqIG1ha2VmaWxlLmluOiBhZGQgY29mZi1nbzMyLmMgc3VwcG9ydAotCi1UaHUgTWF5IDI2IDEwOjEwOjIxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IERvIG5vdCBzZXQgdGhlIHN5c3RlbV9pZCBoZXJlLCBwcml2YXRlCi0JYmZkIGRhdGEgaGFzIG5vdCBiZWVuIGNvcGllZCB5ZXQuCi0JKHNvbV93cml0ZV9oZWFkZXJzKTogSW5zdGVhZCBkbyBpdCBoZXJlLgotCi1UdWUgTWF5IDI0IDE2OjE3OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCU1ha2UgTUlQUyBFTEYgdXNlIG5ldyBFTEYgYmFja2VuZCBsaW5rZXIuICBObyBzaGFyZWQgbGlicmFyeQotCXN1cHBvcnQgeWV0LgotCSogZWxmMzItbWlwcy5jIChiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfb2JqZWN0X3ApOiBJZiBsYXN0IHN5bWJvbCBpcyBMT0NBTCwgc2V0IGVsZl9iYWRfc3ltdGFiLgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IHNoX2luZm8gZmllbGQgZm9yIC5ncHRhYi4qCi0Jc2VjdGlvbnMuCi0JKG1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2hfZW50c2l6ZSBmb3IgLmdwdGFiLiogc2VjdGlvbnMuCi0JKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFJlYWQgYW5kIGZyZWUgZXh0ZXJuYWwgc3ltYm9scyBsYXN0LAotCW5vdCBmaXJzdCwgZm9yIGNsYXJpdHkuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwKTogRGVmaW5lIG5ldyBtYWNyby4KLQkobWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lIG5ldyBtYWNyby4KLQkobWlwc19lbGZfaGFzaF90YWJsZSk6IERlZmluZSBuZXcgbWFjcm8uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBleHRzeW1faW5mbyk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShtaXBzX2VsZl9nZXRfZXh0ciwgbWlwc19lbGZfc2V0X2luZGV4KTogUmVtb3ZlLgotCShtaXBzX2VsZl9vdXRwdXRfZXh0c3ltKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ3B0YWJfY29tcGFyZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZXdyaXRlIHRvIHVzZSBFTEYgYmFja2VuZCBsaW5rZXIsIGFuZCB0bwotCW1lcmdlIGdwdGFiIGluZm9ybWF0aW9uIGluIGlucHV0IGZpbGVzLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9oaTE2KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlZmluZSBhcyBtYWNybyBiZWZvcmUKLQlpbmNsdWRpbmcgZWxmMzItdGFyZ2V0LmguCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBSZW5hbWUgZnJvbQotCWVsZl9saW5rX2hhc2hfbmV3ZnVuYyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgQ2hhbmdlIGNhbGxlci4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogVXNlCi0JX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbmV3IGZpZWxkIGJhZF9zeW10YWIuCi0JKGVsZl9iYWRfc3ltdGFiKTogRGVmaW5lIG5ldyBhY2Nlc3NvciBtYWNyby4KLQkoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEZWNsYXJlLgotCShfYmV3X2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IENhbGwgYmFja2VuZCBvYmplY3RfcCBob29rIGFmdGVyCi0Jc3dhcHBpbmcgaW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQ29ycmVjdCB0eXBvOiBJbnRlcm5hbCBmb3IgRXh0ZXJuYWwuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGVsZl9iYWRfc3ltdGFiIGlzIHNldCwgcmVhZCBhbGwKLQl0aGUgc3ltYm9scy4gIFNraXAgU1RCX0xPQ0FMIHN5bWJvbHMgcmF0aGVyIHRoYW4gZ2l2aW5nIGFuIGVycm9yLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJZiBlbGZfYmFkX3N5bXRhYiBpcyBzZXQsIGFsbG9jYXRlIHNwYWNlIGZvcgotCWFsbCBzeW1ib2xzLCBub3QganVzdCBsb2NhbHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBPbmx5IHNraXAgYSBzeW1ib2wgbm90IG1lbnRpb25lZCBieSBhCi0JcmVndWxhciBmaWxlIGlmIGl0IGlzIG1lbnRpb25lZCBieSBhIGR5bmFtaWMgb2JqZWN0LgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBJZiBlbGZfYmFkX3N5bXRhYiBpcyBzZXQsIHJlYWQgYWxsIHRoZQotCXN5bWJvbHMuCi0KLUZyaSBNYXkgMjAgMTM6Mzg6MjMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2V0X3JlbG9jX2luZm8pOiBEbyBub3Qgc2V0IGFueSByZWxvY2F0aW9uIGluZm8KLQlmb3IgU09NIGZpeHVwcyB3aGljaCBhcmUgbmV2ZXIgcGFzc2VkIHRvIEJGRC4KLQotRnJpIE1heSAyMCAxMTo1NzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgTUlQU19SX0pNUEFERFIgb3ZlcmZsb3cKLQljaGVja2luZy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgRFRfREVCVUcgdG8KLQl0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgZGVidWdnZXIuCi0JRnJvbSBQZXRlciBTY2hhdWVyLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogTmV3IGZ1bmN0aW9uLCBiYXNlZCBvbgotCWNvZGUgcmVwZWF0ZWQgdGhyZWUgdGltZXMgaW4gYmZkX3NlY3Rpb25fZnJvbV9zaGRyIGluIGVsZmNvZGUuaC4KLQkqIGxpYmVsZi5oIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIG5ldyBmdW5jdGlvbgotCV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgdG8gY3JlYXRlIEJGRCBzZWN0aW9ucy4gIElmIGEKLQlyZWxvYyBzZWN0aW9uIGRvZXMgbm90IHVzZSB0aGUgbWFpbiBzeW1ib2wgdGFibGUsIG9yIGl0IGlzIHBhcnQgb2YKLQl0aGUgcHJvY2VzcyBpbWFnZSwgdHJlYXQgaXQgYXMgYSBub3JtYWwgc2VjdGlvbiwgbm90IHJlbG9jcy4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgbmV3IGZ1bmN0aW9uCi0JX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkci4KLQotVGh1IE1heSAxOSAxMTozNzoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogQ2hhbmdlIGFyX21heF9uYW1lbGVuIHZhbHVlIGZyb20KLQkxNSB0byAxNCB0byBtYXRjaCBTVlI0IGFyLgotCi0JQWRkIHN1cHBvcnQgZm9yIEVMRiBzaGFyZWQgbGlicmFyaWVzLiAgTG9vc2VseSBiYXNlZCBvbiB3b3JrIGJ5Ci0JRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY29tPi4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGRzIGZvciBkeW5hbWljCi0JbGlua2luZzogZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsCi0JZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotCWVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucywKLQllbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wsCi0JZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHR5cGUgb2YgYWxpZ24gZmllbGQgdG8KLQliZmRfc2l6ZV90eXBlLiAgQWRkIGZpZWxkcyBkeW5pbmR4LCBkeW5zdHJfaW5kZXgsIHdlYWtkZWYsCi0JZWxmX2xpbmtfaGFzaF9mbGFncy4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZmllbGRzIGR5bm9iaiwgZHluc3ltY291bnQsCi0JZHluc3RyLCBidWNrZXRjb3VudC4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NfaW4sIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbiwgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zd2FwX2R5bl9pbiwgYmZkX2VsZjMyX3N3YXBfZHluX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jX2luLCBiZmRfZWxmNjRfc3dhcF9yZWxvY19vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4sIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9keW5faW4sIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChFbGZfRXh0ZXJuYWxfRHluKTogRGVmaW5lLgotCShlbGZfc3dhcF9yZWxvY19pbik6IERlZmluZSBhcyBtYWNybyB1c2luZyBOQU1FLiAgTWFrZSBleHRlcm5hbGx5Ci0JdmlzaWJsZS4KLQkoZWxmX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3JlbG9jYV9pbiwgZWxmX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9keW5faW4sIGVsZl9zd2FwX2R5bl9vdXQpOiBEZWZpbmUgYXMgbWFjcm8gdXNpbmcgTkFNRQotCWFuZCBhcyBuZXcgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9uLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzZWN0aW9uIHR5cGUgb2YgZHluYW1pYyBzZWN0aW9ucyBiYXNlZCBvbgotCXNlY3Rpb24gbmFtZXMuCi0JKGVsZl93cml0ZV9waGRycyk6IFJlbW92ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBBZGQgbmV3IGFsaWduIGFyZ3VtZW50LgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3Qgc2VnX2luZm8pOiBSZW1vdmUuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQ29tcGxldGVseSByZXdyaXRlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IENvbXBsZXRlbHkgcmV3cml0ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBEb24ndCBzZXQgYSBmaWxlIHBvc2l0aW9uIGZvcgotCXNlY3Rpb25zIHdoaWNoIGFscmVhZHkgaGF2ZSBvbmUuICBEb24ndCBib3RoZXIgdG8gYWxpZ24gdGhlIGZpbGUKLQlwb3NpdGlvbiBoZXJlLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogSGFuZGxlIFNIVF9IQVNIIGFuZCBTSFRfRFlOQU1JQwotCXNlY3Rpb24gdHlwZXMuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggZmFpbHMsIGp1c3QKLQl1c2UgYmZkX2Fic19zZWN0aW9uIHJhdGhlciB0aGFuIHJldHVybmluZyBhbiBlcnJvci4KLQkoZWxmX3NpemVvZl9oZWFkZXJzKTogTWFrZSB1c2VmdWwuCi0JKGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEhhbmRsZSBkeW5hbWljIG9iamVjdHMuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2FkZF9keW5hbWljX2VudHJ5KTogRGVmaW5lIGFzIG1hY3JvIHVzaW5nIE5BTUUgYW5kIGFzIG5ldwotCWV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYnVja2V0cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogTmV3IGZ1bmN0aW9uLgotCShzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBkeW5zeW1fc2VjIGFuZCBoYXNoX3NlYyBmaWVsZHMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IEhhbmRsZSBkeW5hbWljIGxpbmtpbmcuICBDcmVhdGUgYSBzZWN0aW9uCi0Jc3ltYm9sIGZvciBhbGwgRUxGIHNlY3Rpb25zLCBub3QgYWxsIEJGRCBzZWN0aW9ucy4gIFN0b3JlIHNlY3Rpb24KLQlzeW1ib2wgaW5kZXggaW4gdGFyZ2V0X2luZGV4IGZpZWxkLCBub3QgaW5kZXggZmllbGQuICBUcmF2ZXJzZQotCW92ZXIgZ2xvYmFsIHN5bWJvbHMgZXZlbiBpZiBzdHJpcHBpbmcuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBPdXRwdXQgZHluYW1pYyBzeW1ib2xzLiAgTWFyayBzeW1ib2xzCi0JZGVmaW5lZCBieSBkeW5hbWljIG9iamVjdHMgYXMgdW5kZWZpbmVkLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBJZ25vcmUgZHluYW1pYyBvYmplY3RzLiAgVXNlIHRhcmdldF9pbmRleAotCWZpZWxkIGZvciBzZWN0aW9uIHJlbG9jcywgYW5kIG1ha2Ugc3VyZSBpdCBpcyBzZXQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogVXNlIHRhcmdldF9pbmRleCBmaWVsZCBmb3Igc2VjdGlvbiByZWxvY3MsCi0JYW5kIG1ha2Ugc3VyZSBpdCBpcyBzZXQuCi0JKiBlbGYuYyAoZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBkeW5pbmR4LCBkeW5zdHJfaW5kZXgsCi0Jd2Vha2RlZiBhbmQgZWxmX2xpbmtfaGFzaF9mbGFncyBmaWVsZHMuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIGR5bm9iaiwgZHluc3ltY291bnQsCi0JZHluc3RyIGFuZCBidWNrZXRjb3VudCBmaWVsZHMuCi0JKiBlbGYzMi10YXJnZXQuaDogSW5pdGlhbGl6ZSBuZXcgZHluYW1pYyBsaW5raW5nIGZpZWxkcy4KLQkqIGVsZjY0LXRhcmdldC5oOiBMaWtld2lzZS4gIAotCSogZWxmMzItaTM4Ni5jOiBOZXcgZnVuY3Rpb25zIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4KLQkqIGVsZjMyLXNwYXJjLmM6IExpa2V3aXNlLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVdlZCBNYXkgMTggMDg6Mjk6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzb20uYzogRG9uJ3QgaW5jbHVkZSA8c3lzL2Rpci5oPiBvciA8c3lzL3VzZXIuaD4uCi0JKHNvbV9yZWxvY19xdWV1ZV9maW5kKTogQ2FsbCBtZW1jbXAgaW5zdGVhZCBvZiBiY21wLgotCShzb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQ2hhbmdlIGZpcnN0IGFyZ3VtZW50IHRvIGJmZCAqLgotCShjb21wYXJlX3N5bXMpOiBDaGFuZ2UgdHlwZXMgb2YgYXJndW1lbnRzIHRvIGNvbnN0IHZvaWQgKi4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgZm91bmQuCi0JKHNvbV93cml0ZV9hcm1hcCk6IEFkZCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCBhbmQgaW50IGFyZ3VtZW50cy4KLQkoc29tX3dyaXRlX2FybWFwKTogVXNlICVsZCBhbmQgY2FzdCB0byBsb25nIGZvciBnZXR1aWQgcmVzdWx0LgotCi1XZWQgTWF5IDE4IDA5OjA5OjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmggKFJfSFBQQV9BQlNfQ0FMTCk6IERlZmluZS4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgYWJzb2x1dGUgY2FsbHMuCi0KLQkqIHNvbS5oIChSX0hQUEFfQUJTX0NBTEwpOiBEZWZpbmUuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBEZWxldGUgY29tcGxleCByZWxvY2F0aW9uIHR5cGVzLgotCi1UdWUgTWF5IDE3IDE5OjMzOjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChpY29mZl9saXR0bGVfdmVjLCBpY29mZl9iaWdfdmVjKTogSW5kaWNhdGUgbGVhZGluZwotCXVuZGVyc2NvcmUsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggSW50ZWwgdG9vbCBjaGFpbiAoZ251OTYwdjIpLgotCi1Nb24gTWF5IDE2IDEwOjA5OjIyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLWhwcGEuYzogQ2hhbmdlIC5ocHBhX2xpbmtlcl9zdHVicyB0byAuUEFSSVNDLnN0dWJzLAotCWxpa2V3aXNlIGZvciBvdGhlciBQQSBzcGVjaWZpYyBzZWN0aW9ucy4KLQkoaHBwYV9lbGZfcmVsb2NhdGVfdW53aW5kX3RhYmxlKTogRGVsZXRlIHVudXNlZAotCWZ1bmN0aW9uLgotCShlbGZfaHBwYV9ob3d0b190YWJsZSk6IENvbXBsZXRlbHkgbmV3IHRhYmxlIGJhc2VkIG9uIDk0LTAyLTAyCi0JZHJhZnQgUEEgRUxGIHNwZWMuICBDaGFuZ2UgcmVsb2NhdGlvbiB0YWdzIGFwcHJvcHJpYXRlbHkKLQl0aHJvdWdob3V0IGVsZjMyLWhwcGEuYwotCShocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFJld3JpdGUgYW5kIHNpbXBsaWZ5IGJhc2VkIG9uIDk0LTAyLTAyCi0Jc3BlYy4KLQkoaHBwYV9lbGZfcmVsb2MpOiBMaWtld2lzZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTGlrZXdpc2UKLQkoRUxGX01BQ0hJTkVfQ09ERSk6IENoYW5nZSB0byBFTV9QQVJJU0MuCi0JKiBlbGYzMi1ocHBhLmg6IEluY2x1ZGUgImVsZi9ocHBhLmgiLiAgQ2hhbmdlIHJlbG9jYXRpb24gdGFncyAKLQlhcHByb3ByaWF0ZWx5IHRocm91Z2hvdXQgZWxmMzItaHBwYS5oLgotCShlbGYzMl9ocHBhX3JlbG9jX3R5cGUpOiBOZXcgdGFibGUgYmFzZWQgb24gOTQtMDItMDIgZHJhZnQgUEEgRUxGCi0Jc3BlYy4KLQkoUl9IUFBBX0FCU19DQUxMLCBSX0hQUEFfQ09NUExFWCosIFJfSFBQQV9VTldJTkQpOiBEZWxldGUgZGVmaW5pdGlvbnMuCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IFVzZSBFTV9QQVJJU0MgaW5zdGVhZCBvZiBFTV9IUFBBLgotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbCk6IERlbGV0ZSB1bnVzZWQgSFBQQSByZWxvY2F0aW9ucy4KLQkqIHNvbS5oIChSX0hQUEFfQUJTX0NBTEwsIFJfSFBQQV9DT01QTEVYKTogRGVsZXRlIGRlZmluaXRpb25zLgotCi0JKiBsaWJocHBhLmggKGhwcGFfZmllbGRfYWRqdXN0KTogQXZvaWQgYWRkaW5nIGNvbnN0YW50X3ZhbHVlIGludG8KLQl0aGUgZmluYWwgdmFsdWUgdHdpY2UgZm9yIExSIGFuZCBSUiBmaWVsZCBzZWxlY3RvcnMuCi0KLVNhdCBNYXkgMTQgMDk6MDk6MTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFkZF90b19zdHJpbmd0YWIpOiBVc2UgQkZEX0FTU0VSVCBub3QgYXNzZXJ0LiAgVGhpcwotCWF2b2lkcyBfX2VwcmludGYgdHJvdWJsZXMuCi0KLUZyaSBNYXkgMTMgMTA6NTE6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUi4KLQotCSogY29uZmlnL21pcHNiZWxmLm10IChTRUxFQ1RfVkVDUyk6IEFkZCBlY29mZl9iaWdfdmVjIGFuZAotCWVjb2ZmX2xpdHRsZV92ZWMgc2luY2UgSXJpeCA1IHN1cHBvcnRzIEVDT0ZGIGV4ZWN1dGFibGVzLgotCi1XZWQgTWF5IDExIDAwOjMxOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBIYW5kbGUgZmRyLmFkciAhPSBwZHIuYWRyCi0JY29ycmVjdGx5LgotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IFVzZSB8fCBpbnN0ZWFkIG9mIDsgdG8gZm9yY2UgU3VuT1MKLQltYWtlIHRvIGludm9rZSB0aGUgc2hlbGwuCi0KLVR1ZSBNYXkgMTAgMTQ6MjM6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKTogUmVuYW1lZCBmcm9tCi0JU0VDX1NIQVJFRF9MSUJSQVJZIGZvciBjbGFyaXR5LiAgQ2hhbmdlZCBhbGwgdXNlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSWYgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgaXMKLQlzZXQsIHNldCBTVFlQX05PTE9BRC4KLQkqIGNvZmZnZW4uYyAoY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4KTogRG9uJ3QgZ2V0IGFuIGFzc2VydGlvbgotCWZhaWx1cmUgYmVjYXVzZSBvZiBhIGJhZCBzaGFyZWQgbGlicmFyeS4KLQotTW9uIE1heSAgOSAxODo1Mzo0MCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jOiBBZGQgbWlzc2luZyBjb21tZW50IHRlcm1pbmF0b3IuCi0KLU1vbiBNYXkgIDkgMTE6NTM6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJZiBoYXNocCBhbmQgKmhhc2hwCi0JYXJlIG5vdCBOVUxMLCBhc3N1bWUgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBsb29rZWQgdXAgdGhlIHN5bWJvbAotCWluIHRoZSBoYXNoIHRhYmxlIGFuZCBoYXMgc3RvcmVkIHRoZSBlbnRyeSBpbiAqaGFzaHAuCi0JKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBTZXQgaCB0byBOVUxMIGJlZm9yZSBjYWxsaW5nCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IHJlcXVpcmUKLQlwYWdlIHNoYXJlZCBiZXR3ZWVuIC5kYXRhIGFuZCAuYnNzIHNlZ21lbnRzIHRvIGNvbnRhaW4gemVyb2VzLgotCi0JKiBlbGZjb2RlLmg6IEluY2x1ZGUgYmZkbGluay5oLiAgQWRkZWQgc2V2ZXJhbCBuZXcgZnVuY3Rpb25zIHRvIGRvCi0JbGlua2luZy4KLQkoRUxGX1JfVFlQRSk6IERlZmluZS4KLQkoYmZkX2FkZF90b19zdHJ0YWIpOiBSZXR1cm4gdW5zaWduZWQgbG9uZy4gIENoYW5nZSBjaGVjayBmb3IKLQlyZWFsbG9jIGZhaWx1cmUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9hZGRfdG9fc3RydGFiLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIGxpbmtfaW5mbyBhcmd1bWVudC4KLQlDYWxsIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcgaG9vayBhbmQgcHJlcF9oZWFkZXJzCi0JaGVyZS4gIE9ubHkgY2FsbCBzd2FwX291dF9zeW1zIGlmIGxpbmtfaW5mbyBpcyBOVUxMLiAgU2V0IHVwCi0JLnNoc3RydGFiIHNlY3Rpb24gaGVyZS4gIFBhc3MgZG9zeW1zIGFyZ3VtZW50IHRvCi0JYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MuICBTZXQgb3V0cHV0X2hhc19iZWd1biBmbGFnLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3N5bXRhYl9hbmRfc3RydGFicyk6IEFkZCBkb3N5bXMKLQlhcmd1bWVudCwgYW5kIHVzZSBpdCB0byBjb250cm9sIHNldHRpbmcgLnN5bXRhYiBhbmQgLnN0cnRhYiBmaWxlCi0JcG9zaXRpb25zLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFkZCBkb3N5bXMgYXJndW1lbnQsIGFuZAotCXBhc3MgaXQgb24uCi0JKHByZXBfaGVhZGVycyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfYWRkX3RvX3N0cnRhYi4KLQkoc3dhcF9vdXRfc3ltcyk6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3Qgc2V0IHVwIC5zaHN0cnRhYiBoZXJlLgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFNvbWUgY2FsbHMgbW92ZWQgaW50bwotCWVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU0hOX0xPUkVTRVJWIGNvcnJlY3RlZCB0byBTSE5fTE9SRVNFUlZFLgotCSogbGliZWxmLmg6IEluY2x1ZGUgYmZkbGluay5oLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgY29sbGVjdCwKLQllbGZfYWRkX3N5bWJvbF9ob29rLCBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uLgotCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgZmllbGQgcmVsX2hhc2hlcy4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW1vdmUgZmllbGRzIGludGVybmFsX3N5bXMgYW5kIHN5bWJvbHMuCi0JQWRkIGZpZWxkIHN5bV9oYXNoZXMuCi0JKG9ial9zeW1ib2xzLCBvYmpfaW50ZXJuYWxfc3ltcyk6IFJlbW92ZSBkZWZpbml0aW9ucy4KLQkoZWxmX3N5bV9oYXNoZXMpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWxmX2xpbmtfaGFzaF9sb29rdXApOiBEZWZpbmUuCi0JKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUuCi0JKGVsZl9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rKTogRGVjbGFyZS4KLQkqIGVsZi5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBub3QgZGVmaW5lZCwKLQlkZWZpbmUgYXMgMCBhbmQgdXNlIGdlbmVyaWMgbGlua2VyLiAgT3RoZXJ3aXNlLCB1c2UgRUxGIGJhY2tlbmQKLQlsaW5rZXIuCi0JKGVsZl9iYWNrZW5kX2NvbGxlY3QpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIGZhbHNlLgotCShlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCi0JKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkqIGVsZjY0LXRhcmdldC5oOiBTYW1lIGNoYW5nZXMgYXMgZWxmMzItdGFyZ2V0LmguCi0JKiBlbGYzMi1pMzg2LmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogZWxmMzItc3BhcmMuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogQ2hhbmdlIHR5cGUgb2YgZHN0IGZyb20gRWxmMzJfSW50ZXJuYWxfUmVsYQotCXRvIEVsZl9JbnRlcm5hbF9SZWxhICh0aGV5J3JlIHRoZSBzYW1lIHR5cGUgYW55aG93KS4KLQkoZWxmX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9iYWNrZW5kX2NvbGxlY3QpOiBEZWZpbmUuCi0KLQkqIE1ha2VmaWxlLmluIChzdG1wLWJmZC5oKTogQXZvaWQgdXNlbGVzcyBtYWtlIGVycm9yIG1lc3NhZ2UgaW4gYQotCWRpZmZlcmVudCB3YXk7IHRvdWNoIHRha2VzIGEgbnVtZXJpYyBhcmd1bWVudCBvbiBzb21lIHN5c3RlbXMuCi0KLUZyaSBNYXkgIDYgMTM6MzQ6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogUmV3b3JrIGN1c3RvbSBoZWFkZXIKLQloYW5kbGluZyBmb3IgbGF0ZXN0IHN1Z2dlc3RlZCBmb3JtYXQuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IExpa2V3aXNlLgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0KLUZyaSBNYXkgIDYgMTE6MTE6NTAgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogaGFuZGxlIGVycmljc3NvbiBjb25maWcgKGZvciBPU0UpLgotCi1UaHUgTWF5ICA1IDE1OjQwOjQ3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQlQYXRjaGVzIGZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBtaXBzYnNkLmMgKG1pcHNfZml4X2ptcF9hZGRyKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2ZpeF9oaTE2X3MpOiBVc2UgYmZkX2lzX2NvbV9zZWN0aW9uLgotCShtaXBzX2hvd3RvX3RhYmxlX2V4dCk6IENhbGwgbWlwc19maXhfam1wX2FkZHIgZm9yIE1JUFNfUkVMT0NfSk1QLgotCi1GcmkgTWF5ICA2IDExOjQ4OjU1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiBYWCBzdXBwb3J0LgotCi0JRnJvbSBiaWxsCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgc3lzZGVwLmggd2l0aG91dCBjYXVzaW5nIHdvcnJ5aW5nIGJ1dAotCWhhcm1sZXNzIGVycm9yIG1lc3NhZ2UuCi0KLVdlZCBNYXkgIDQgMTE6MDk6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JQ2hhbmdlZCBtNjhrLWFvdXQgdG8gc2V0IGZsYWdzIHRvIDA7IG02OGstc3Vub3Mgc3RpbGwgdXNlcyAxLgotCSogYW91dDAuYzogTmV3IGZpbGUuCi0JKiB0YXJnZXRzLmMgKGFvdXQwX2JpZ192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBhb3V0MF9iaWdfdmVjLgotCSogY29uZmlnLmJmZCAobTY4Ki0qLWFvdXQqKTogVXNlIG02OGstMGFvdXQsIG5vdCBtNjhrLWFvdXQuCi0JKiBjb25maWcvbTY4ay1hb3V0Lm10IChTRUxFQ1RfVkVDUyk6IFJlbW92ZWQuCi0JKiBjb25maWcvbTY4ay0wYW91dC5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGFvdXQwX2JpZ192ZWMpOiBOZXcgdGFyZ2V0IHZlY3RvcjogdXNlIGFvdXQwLm8sCi0JYW91dDMyLm8gYW5kIHN0YWItc3ltcy5vLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0MC5vLgotCShDRklMRVMpOiBBZGQgYW91dDAuYy4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGQgZXhlY19oZHJfZmxhZ3MuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9leGVjX2hkcl9mbGFncyk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KLQlNWShiYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIGV4ZWNfaGRyX2ZsYWdzIGZpZWxkLgotCSogYW91dGYxLmggKHN1bm9zXzMyX3NldF9hcmNoX21hY2gpOiBNYWtlIHN0YXRpYy4KLQkoYW91dDMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgZmxhZ3MgZnJvbSBiYWNrZW5kCi0JaW5mby4KLQkoTVlfZXhlY19oZHJfZmxhZ3MpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDEuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBJbml0aWFsaXplIGV4ZWNfaGRyX2ZsYWdzIGZpZWxkLgotCSogYW91dC1lbmNhcC5jIChlbmNhcF93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgZmxhZ3MgZnJvbQotCWJhY2tlbmQgaW5mby4KLQkoTVlfZXhlY19oZHJfZmxhZ3MpOiBEZWZpbmUgYXMgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFLgotCSogaHAzMDBocHV4LmMgKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogRGVmaW5lIGFzIDB4Mi4KLQkoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFNldCBmbGFncyBmcm9tIGJhY2tlbmQgaW5mby4KLQkqIGkzODZhb3V0LmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplIGV4ZWNfaGRyX2ZsYWdzIGZpZWxkLgotCSogaTM4Nm1hY2gzLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmMgKE5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFNldAotCWZsYWdzIGZyb20gYmFja2VuZCBpbmZvLgotCShzcGFyY2x5bnhfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQotV2VkIE1heSAgNCAwMjo1NjowMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAoaTM4Ni0qLWdudSopOiBUcmVhdCBsaWtlIGkzODYtKi1tYWNoKi4KLQkobTY4Ki1hcG9sbG8tKik6IFRyZWF0IGFsbCBBcG9sbG8gY29uZmlncyB0aGUgc2FtZSwgZG9uJ3QgaGFuZGxlCi0JQlNEIHNwZWNpYWxseS4KLQotVHVlIE1heSAgMyAxOTo0MzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNhY2hlLmM6IFJld3JvdGUgdG8gd29yayBjb3JyZWN0bHkuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIG9wbmNscy5jIChiZmRfY2FjaGVfaW5pdCwgYmZkX29wZW5fZmlsZSk6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9mZG9wZW5yKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9jYWNoZV9pbml0LgotCi1GcmkgQXByIDI5IDE1OjA4OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2YtbTY4a2x5bnguYyAoQ0FMQ19BRERFTkQpOiBDaGVjayBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzIGJ5Ci0JZW51bWVyYXRpbmcgdGhlbSwgc2luY2UgdGhlIHJlbG9jIHR5cGUgY2FuIG5vdCBzZXJ2ZSBhcyBhbiBpbmRleAotCWludG8gdGhlIG02OGsgQ09GRiBob3d0b190YWJsZS4KLQotRnJpIEFwciAyOSAwOTo0MjozOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnLmJmZCAoKi1nbzMyKTogQ2hhbmdlZCB0byBjb2ZmLgotCSogY29mZi1oODMwMC5jIChKTVBMMSk6IEdldCBIT1dUTyByaWdodCBmb3IgMjRiaXQgYnJhbmNoZXMuCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfc3ltYm9scyk6IFdyaXRlIG91dCB0aGUgY29ycmVjdCBudW1iZXIgb2YKLQlzeW1ib2xzIGFuZCBkb24ndCBzdGljayBpbiBleHRyYSBudWxscy4KLQotVHVlIEFwciAyNiAxNTowNzoyNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNmLXNwYXJjbHlueC5jIChMWU5YT1MsIENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmUuCi0JKiBjb2ZmLXNwYXJjLmMgKEJBRE1BRyk6IFJlY29nbml6ZSBMWU5YQ09GRk1BR0lDLgotCShDT0ZGX1NQQVJDKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogSWYgQ09GRl9TUEFSQywgc2V0IGFsaWdubWVudAotCXBvd2VyIG9mIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0byAzLgotCSogaG9zdHMvbHlueC5oIChfX0xZTlhPUyk6IERlZmluZS4KLQotVHVlIEFwciAyNiAxNTowNDoyNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvYyk6IEFkanVzdCB0aGUgYWRkZW5kIG9mIHJlbG9jYXRpb25zCi0JYWdhaW5zdCBzZWN0aW9uIHN5bWJvbHMgdG8gYXZvaWQgbG9zaW5nIGR1cmluZyBsZCAtci4KLQotVHVlIEFwciAyNiAxMjoxNjo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoc2hzdHJ0YWJfbGVuZ3RoX2ZpeGVkKTogUmVtb3ZlIHVzZWxlc3Mgc3RhdGljCi0JdmFyaWFibGUuCi0JKHN0cnVjdCBlbGZfc2VjdF9kYXRhKTogUmVtb3ZlIHVudXNlZCBzdHJ1Y3R1cmUuCi0JKGVsZl9vYmplY3RfcCk6IEZyZWUgbWVtb3J5IGlmIGVycm9yIG9jY3Vycy4gIENoZWNrIHJldHVybiB2YWx1ZQotCW9mIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBJZiBlbGZfZ2V0X3N0cl9zZWN0aW9uIGZhaWxzLAotCXByZXNlcnZlIGVycm9yIGNvZGUgcmF0aGVyIHRoYW4gc2V0dGluZyB3cm9uZ19mb3JtYXQuCi0JKG51bGxfc2hkcik6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBSZW1vdmUgc2hzdHJ0YWJfbGVuZ3RoX2ZpeGVkIGFzc2lnbm1lbnQuCi0JQWxsb2NhdGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIgb24gQkZEIG9ic3RhY2sgcmF0aGVyIHRoYW4gdXNpbmcKLQludWxsX3NoZHIuCi0JKGJmZF9wcnBzaW5mbyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgbmV3c2VjdC4KLQotTW9uIEFwciAyNSAxNTozMTowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogVW5kbyBwYXRjaCBvZiBBcHIgMTA7IGJyZWFrcyBTb2xhcmlzLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheQotCXRvIGNyZWF0ZSBzZWN0aW9ucy4gIENoZWNrIHJldHVybiB2YWx1ZSBvZiByZWN1cnNpdmUgY2FsbHMuCi0JKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfbWFrZV9zZWN0aW9uLgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGZfb2JqZWN0X3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX3NlY3Rpb25fZnJvbV9zaGRyLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogTGlrZXdpc2UuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4LgotCShiZmRfcHJzdGF0dXMpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4gIENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9tYWtlX3NlY3Rpb24uCi0JKGJmZF9mcHJlZ3NldCk6IExpa2V3aXNlLgotCShiZmRfcHJwc2luZm8pOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4KLQkoZWxmX2NvcmVmaWxlX25vdGUpOiBDaGVjayByZXR1cm4gdmFsdWVzIG9mIGJmZF9wcnN0YXR1cywKLQliZmRfZnByZWdzZXQsIGFuZCBiZmRfcHJwc2luZm8uCi0JKGVsZl9jb3JlX2ZpbGVfcCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBlbGZfY29yZWZpbGVfbm90ZS4KLQotRnJpIEFwciAyMiAxMTowODozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlHZXQgcmlkIG9mIHRoZSBFQ09GRiAucmVnaW5mbyBzZWN0aW9uIGhhY2suCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdF9ob29rKTogRG9uJ3QgY3JlYXRlIGEgLnJlZ2luZm8gc2VjdGlvbi4KLQkoZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IGhhbmRsZSB0aGUgLnJlZ2luZm8gc2VjdGlvbi4KLQkoZWNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IHRoZSBHUCB2YWx1ZSBhbmQgdGhlCi0JcmVnaXN0ZXIgbWFza3MuCi0JKGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lY29mZl9zZXRfcmVnbWFza3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCShiZmRfZWNvZmZfc2V0X3JlZ21hc2tzKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCUZpeCBFQ09GRiBvYmpjb3B5IHRvIGFjdHVhbGx5IGNvcHkgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSogZWNvZmYuYyAoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfZ2V0X2V4dHIpOiBBc3N1bWUgdGhhdCBhbnkgRUNPRkYgc3ltYm9sIHdpdGggbG9jYWwgY2xlYXIgaXMKLQlhbiBleHRlcm5hbCBzeW1ib2wsIHJhdGhlciB0aGFuIGNoZWNraW5nIHRoZSBzeW1ib2wgZmxhZ3MuICBPbmx5Ci0JY2hlY2sgdGhlIGZsYWdzIGZvciBub24tRUNPRkYgc3ltYm9scy4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzKTogRG9uJ3QgY3Jhc2ggaWYgdGhlCi0Jb3V0cHV0X3NlY3Rpb24gZmllbGQgb2YgdGhlIHN5bWJvbCBzZWN0aW9uIGlzIE5VTEwuCi0JKiBsaWJlY29mZi5oIChlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZSBhcwotCWZ1bmN0aW9uIHJhdGhlciB0aGFuIGRlZmluaW5nIGFzIG1hY3JvLgotCi0JKiBpZWVlLmMgKGllZWVfb2JqZWN0X3ApOiBTZXQgYmZkX2Vycm9yX2dvdF93cm9uZ19mb3JtYXQgaWYKLQlhcHByb3ByaWF0ZS4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmMzJfcG93ZXJwY192ZWMuCi0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9zZXRfYXJjaF9tYWNoKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4gIEFjY2VwdCBiZmRfYXJjaF9tNjhrIGFzIHdlbGwgYXMKLQliZmRfYXJjaF91bmtub3duLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NldF9hcmNoX21hY2gpOiBEb24ndCBjaGVjayBhIGxpc3Qgb2YgRUxGCi0JYXJjaGl0ZWN0dXJlcywganVzdCBzZWUgaWYgdGhlIGRlc2lyZWQgYXJjaGl0ZWN0dXJlIG1hdGNoZXMgd2hhdAotCXRoZSBFTEYgYmFja2VuZCBwZXJtaXRzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlbmFtZSBTSE1BR0lDIHRvCi0JU0hfQVJDSF9NQUdJQyB0byBtYXRjaCBjaGFuZ2UgaW4gY29mZi9zaC5oLgotCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgotCi0JRm9sbG93IGNvbnZlbnRpb24gaW4gd2hpY2ggZWFjaCBOTE0gaGVhZGVyIGhhcyBhbiA4IGJ5dGUgc3RhbXAKLQlmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSBsZW5ndGguCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBSZW5hbWUgbmxtX2N5Z251c19zZWN0aW9uX2hkcgotCXRvIG5sbV9jeWdudXNfZXh0X2hlYWRlciwgYW5kIGNoYW5nZSB0eXBlIHRvCi0JTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyLgotCShubG1fY3lnbnVzX2V4dF9oZWFkZXIpOiBSZW5hbWUgZnJvbSBubG1fY3lnbnVzX3NlY3Rpb25faGVhZGVyLgotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IFVzZSBDeUduVXNFeCBpbnN0ZWFkCi0Jb2YgQ3lHblVzU2VDcy4gIFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9uIHRvIGN5Z251c19leHQuICBSZXF1aXJlCi0JbGVuZ3RoIHdvcmQgdG8gYmUgOC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb24gdG8KLQljeWdudXNfZXh0LiAgU2V0IGxlbmd0aCB3b3JkIHRvIDguCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbgotCXRvIGN5Z251c19leHQuCi0KLVRodSBBcHIgMjEgMjI6NTQ6MjIgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6ICBLZWVwIHNlY3Rpb24gdGFibGUKLQkoZnJvbSBDeUduVXNTZUNzKSBpbiBtb3JlIHBlcm1hbmVudCBtZW1vcnkgdG8ga2VlcCBzZWN0aW9uIG5hbWVzCi0JZnJvbSBnZXR0aW5nIHRyYXNoZWQuCi0KLVRodSBBcHIgMjEgMDk6Mjk6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBsaWJlbGYuaCAoZWxmX29ial90ZGF0YSk6ICBBZGQgbWVtYmVycyBmb3IgZHluYW1pYyBzeW1ib2wgdGFibGUKLQloYW5kbGluZy4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIEhhbmRsZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBUYWtlIGFkZGl0aW9uYWwgcGFyYW1ldGVyCi0JdG8gc2VsZWN0IHN0YXRpYyBvciBkeW5hbWljIHN5bWJvbCB0YWJsZSBhbmQgcmV0dXJuIG51bWJlciBvZgotCXN5bWJvbHMgc2x1cnBlZCBvciAtMSBvbiBlcnJvci4KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zeW10YWIpOiAgU2V0IGJmZCBzeW1jb3VudCBmcm9tCi0JZWxmX3NsdXJwX3N5bWJvbF90YWJsZSByZXN1bHQuCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQsCi0JZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6ICBOZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBkeW5hbWljCi0Jc3ltYm9sIHRhYmxlLgotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oIChCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKToKLQlDaGFuZ2UgdG8gaGFuZGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBwcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMKLQlmb3IgZHluYW1pYyByZWxvY3MuCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQsIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpLAotCU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbiksIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwKLQlhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6ICBIYW5kbGUgcl9qbXB0YWJsZSBhbmQgcl9yZWxhdGl2ZQotCXJlbG9jYXRpb25zLgotCi1UaHUgQXByIDIxIDExOjU4OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNsZWFuIHVwIHVzZXMgb2YgX2JmZF9kdW1teV90YXJnZXQgKGZyb20gUGV0ZXIgU2NoYXVlcikuCi0JKiBsaWJiZmQuYyAoX2JmZF9kdW1teV90YXJnZXQpOiBTZXQgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KLQkqIG5sbS10YXJnZXQuaCAobmxtX2NvcmVfZmlsZV9wKTogRGVmaW5lIGFzIF9iZmRfZHVtbXlfdGFyZ2V0LCBub3QKLQlOVUxMLgotCSogc3JlYy5jIChzcmVjX3ZlYyk6IFVzZSBfYmZkX2R1bW15X3RhcmdldCwgbm90IE5VTEwsIGluCi0JX2JmZF9jaGVja19mb3JtYXQuCi0JKHN5bWJvbHNyZWNfdmVjKTogTGlrZXdpc2UuCi0JKiB0ZWtoZXguYyAodGVraGV4X3ZlYyk6IExpa2V3aXNlLgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBBZGQgbmxtX2N5Z251c19zZWN0aW9uX2hkcgotCWZpZWxkLgotCShubG1fY3lnbnVzX3NlY3Rpb25faGVhZGVyKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiBGcmVlIG5ldyB0ZGF0YSBzdHJ1Y3R1cmUgaWYgZmFpbHVyZS4KLQlBZGQgZml4ZWQgc2VjdGlvbnMgYmVmb3JlIHN3YXBwaW5nIGluIGF1eGlsaWFyeSBoZWFkZXJzLiAgQWZ0ZXIKLQlhZGRpbmcgc2VjdGlvbnMsIHRyZWF0IGVycm9ycyBhcyByZWFsLCBub3QgYXMgd3JvbmcgZm9ybWF0LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IFN3YXAgaW4gdGhlIHNlY3Rpb25zIGhlYWRlcjsgYWRkCi0Jc2VjdGlvbnMgdG8gdGhlIEJGRCBmb3IgZWFjaCBzZWN0aW9uIGl0IGRlc2NyaWJlcy4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogU3dhcCBvdXQgdGhlIHNlY3Rpb25zIGhlYWRlci4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFjY291bnQgZm9yIHRoZSBzaXplIG9mIHRoZQotCXNlY3Rpb25zIGhlYWRlci4KLQotV2VkIEFwciAyMCAxNjo0NTo1MSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNwYXJjLmMgKHNwYXJjY29mZl92ZWMpOiBDaGFuZ2UgbWluaW11bSBhbGlnbm1lbnQgcG93ZXIgdG8KLQkyLCBzbyB0aGF0IHN0YWIgc2VjdGlvbnMgY2FuIGJlIG11bHRpcGxlcyBvZiA0IGJ5dGVzIG9ubHkuCi0KLQkqIGhvc3RzL2kzODZhaXguaDogQ2hhbmdlcyB0byBhdm9pZCBwcm90b3R5cGVzIGNvbmZsaWN0cyB3aXRoIHRoZQotCW9uZXMgZGVmaW5lZCBpbiBzdGRsaWIuaC4gIChGcm9tIE1pbmggVHJhbi1MZS4pCi0KLVdlZCBBcHIgMjAgMTQ6MTU6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG0zMi1wcGMuYzogQ29tcGxldGUgcmV3cml0ZSBmb3IgbmV3IHZlcnNpb24gb2YgUG93ZXJQQwotCU5ldFdhcmUuICBPbGQgY29kZSBzdGlsbCBwcmVzZW50LCBidXQgaWZkZWZmZWQgb3V0LgotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogRG9uJ3QgYXNzdW1lIGEKLQlwYXJ0aWN1bGFyIGZvcm1hdCBmb3IgdGhlIGN1c3RvbWVyIGhlYWRlci4gIEFsbG9jYXRlIGEgYmxvY2sgb2YKLQltZW1vcnkgYW5kIHJlYWQgaXQgaW50byB0aGF0LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBXcml0ZSBvdXQgdGhlIGJsb2NrIG9mIG1lbW9yeS4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEluY2x1ZGUgbGVuZ3RoIG9mIGN1c3RvbWVyCi0JaGVhZGVyIHdoZW4gY29tcHV0aW5nIGl0cyBzaXplLgotCi1Nb24gQXByIDE4IDE0OjI3OjE3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IEdldCB0aGUgc3BhY2UncyBudW1iZXIgZnJvbSB0aGUKLQliYWNrZW5kIHByaXZhdGUgc2VjdGlvbiBkYXRhIHJhdGhlciB0aGFuIHRhcmdldF9pbmRleC4KLQkoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogU3RvcmUgdGhlIHNwYWNlJ3MgbnVtYmVyCi0JaW4gdGhlIGJhY2tlbmQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgcmF0aGVyIHRoYW4gdGFyZ2V0X2luZGV4LgotCi0JKiBzb20uaCAoc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBBZGQgc3BhY2VfbnVtYmVyLgotCi1GcmkgQXByIDE1IDEyOjIyOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmMgKHJlbG9jX3Byb2Nlc3NpbmcpOiBBbHdheXMgc2V0IHRoZSBhZGRyZXNzIG9mIGEKLQlSX0lIQ09OU1QgcmVsb2MgdG8gdGhhdCBvZiB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIFJfSUhJSEFMRi4KLQlnYXMgZG9lcyB0aGlzIGFueWhvdywgYnV0IHNvbWUgb3RoZXIgYXNzZW1ibGVycyBzZWVtIHRvIGxlYXZlCi0JZ2FyYmFnZSBpbiB0aGUgUl9JSENPTlNUIGFkZHJlc3MgZmllbGQuCi0KLQkqIGJmZC9hcmNoaXZlLmM6IENvbnNpc3RlbnRseSB1c2UgQVJGTUFHOyBmcm9tCi0Jc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlIChBbmRyZWFzIFNjaHdhYikuCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFVzZSBBUkZNQUcgcmF0aGVyIHRoYW4gJ2AnIGFuZAotCSdcMDEyJy4KLQkoYnNkX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfYXJtYXApOiBMaWtld2lzZS4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gcmVsYXhpbmcsIGFkanVzdCBsb2NhbAotCXJlbG9jcyBhZ2FpbnN0IHRoZSAudGV4dCBzZWN0aW9uIGFzIHJlcXVpcmVkLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogV2hlbiByZWxheGluZywgYWRqdXN0Ci0JUERSIGFkZHJlc3NlcyBhcyByZXF1aXJlZC4KLQotCSogZWNvZmYuYyAoZWNvZmZfZW1pdF9hZ2dyZWdhdGUpOiBUYWtlIGZkciBhcmd1bWVudC4gIE1hcCBmZHIKLQlpbmRleCB0aHJvdWdoIHJmZCBtYXAgaWYgaXQgZXhpc3RzLiAgQ2hlY2sgZm9yIGEgY291cGxlIG9mIGNhc2VzCi0Jd2hpY2ggZ2RiIGhhbmRsZXMgc3BlY2lhbGx5LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl90eXBlX3RvX3N0cmluZyk6IFRha2UgZmRyIGFyZ3VtZW50IHJhdGhlciB0aGFuIGF1eF9wdHIgYW5kCi0JYmlnZW5kaWFuIGFyZ3VtZW50LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl9wcmludF9zeW1ib2wpOiBIYW5kbGUgc3RTdHJ1Y3QsIHN0VW5pb24gYW5kIHN0RW51bS4KLQotVGh1IEFwciAxNCAxMzowNToxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQWRkIGR1bW15IGVudHJpZXMgdG8gYWNjb3VudCBmb3IKLQludW1iZXJpbmcgY2hhbmdlcyBpbiBpbmNsdWRlL2NvZmYvbWlwcy5oLiAgQWRkIGVudHJpZXMgZm9yCi0JTUlQU19SX1JFTEhJIGFuZCBNSVBTX1JfUkVMTE8uCi0JKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbik6IEhhbmRsZSBhbiBleHRyYSBiaXQgZm9yIHRoZSByZWxvYyB0eXBlCi0Jd2hlbiBsaXR0bGUgZW5kaWFuLiAgVHJlYXQgaW50ZXJuYWwgTUlQU19SX1JFTExPIG9yIE1JUFNfUl9SRUxISQotCXJlbG9jcyBsaWtlIE1JUFNfUl9TV0lUQ0gsIGFuZCBjb252ZXJ0IHJfb2Zmc2V0IGZyb20gMjQgdG8gMzIKLQliaXRzLgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogSGFuZGxlIGludGVybmFsIE1JUFNfUl9SRUxMTyBvcgotCU1JUFNfUl9SRUxISSByZWxvY3MgbGlrZSBNSVBTX1JfU1dJVENILgotCShtaXBzX2FkanVzdF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkobWlwc19yZWxoaV9hZGRyLCBtaXBzX3JlbGhpX2FkZGVuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtaXBzX3JlbGhpX3JlbG9jLCBtaXBzX3JlbGxvX3JlbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUdXJuIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgaW50bwotCU1JUFNfUl9SRUxISSBhbmQgdHVybiBCRkRfUkVMT0NfUENSRUxfTE8xNiBpbnRvIE1JUFNfUl9SRUxMTy4KLQkobWlwc19yZWxvY2F0ZV9oaSk6IFJlbmFtZSBmcm9tIG1pcHNfcmVsb2NhdGVfcmVmaGksIGFuZCBhZGQgcGNyZWwKLQlhcmd1bWVudC4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSBnb3RfcmVmbG8gdG8gZ290X2xvIGFuZAotCXJlZmxvX2ludF9yZWwgdG8gbG9faW50X3JlbC4gIEhhbmRsZSBNSVBTX1JfUkVMTE8gYW5kIE1JUFNfUl9SRUxISQotCXJlbG9jcy4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogQWRqdXN0IE1JUFNfUl9SRUxISS9NSVBTX1JfUkVMTE8gcGFpcnMgd2hlbgotCWV4cGFuZGluZyBhIFBDIHJlbGF0aXZlIGNhbGwuCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZCBCRkRfUkVMT0NfUENSRUxfSEkxNl9TCi0JYW5kIEJGRF9SRUxPQ19QQ1JFTF9MTzE2LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1XZWQgQXByIDEzIDExOjUwOjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogU2V0IG1pbmltdW0gYWxpZ25tZW50IHBvd2VyIHRvIDMuCi0KLVR1ZSBBcHIgMTIgMTM6MzY6MjAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogQWx3YXlzIGVtaXQgYXQgbGVhc3QKLSAgICAgICAgb25lIHJlbG9jYXRpb24gZm9yIGFueSBub24tYnNzIHNlY3Rpb24uCi0KLU1vbiBBcHIgMTEgMTQ6NDE6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRG9uJ3QgcmVxdWlyZQotCXRoZSBmaWxlIGFsaWdubWVudCB0byBjb3JyZXNwb25kIHRvIHRoZSBwYWdlIHNpemUgd2hlbiBsaW5raW5nCi0Jd2l0aCAtTi4KLQotU3VuIEFwciAxMCAwMTowMjoyNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBGb3IgcmVsYSByZWxvY2F0aW9ucywgYWRqdXN0IHRoZQotCWFkZGVuZCBmb3IgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHNlY3Rpb24gc3ltYm9scyB0byBhY2NvdW50Ci0JZm9yIHRoZSBsb3NzYWdlIG9mIDE6MSBtYXBwaW5nIGZyb20gaW5wdXQgc2VjdGlvbiBzeW1ib2xzIHRvCi0Jb3V0cHV0IHNlY3Rpb24gc3ltYm9scy4KLQotRnJpIEFwciAgOCAxMjoyMjowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBDYWxsIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKQotCXJhdGhlciB0aGFuIG1ha2luZyBzZWN0aW9ucyBpbmxpbmUuCi0JKE5BTUUoYW91dCxta29iamVjdCkpOiBEb24ndCBtYWtlIGFueSBzZWN0aW9ucy4KLQkoTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykpOiBDYWxsIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKS4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgZGVyZWZlcmVuY2Ugb2JqX3RleHRzZWMgKGFiZmQpIG9yCi0Jb2JqX2RhdGFzZWMgKGFiZmQpIGlmIHRoZXkgYXJlIE5VTEwuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSk6IERlY2xhcmUuCi0JKiBib3V0LmMgKGJfb3V0X21rb2JqZWN0KTogRG9uJ3QgbWFrZSBhbnkgc2VjdGlvbnMuCi0JKGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgYW91dF8zMl9tYWtlX3NlY3Rpb25zLgotCShiX291dF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogaTM4Nm9zOWsuYyAob3M5a19ta29iamVjdCk6IERvbid0IG1ha2UgYW55IHNlY3Rpb25zLgotCShvczlrX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgYW91dF8zMl9tYWtlX3NlY3Rpb25zLgotCShvczlrX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSk6IERvbid0IHNldCBOX0VYVCBpbiB0YXJnZXQKLQlpbmRleC4KLQotV2VkIEFwciAgNiAyMDo0NDo1NiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIG1pcHMtKi1zeXN2NCogc3VwcG9ydC4KLQotVGh1IEFwciAgNyAxNDoyMzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQWRkIGVudHJ5IGZvciBNSVBTX1JfU1dJVENILgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4pOiBGb3IgTUlQU19SX1NXVElDSCwgY29weSByX3N5bW5keCBpbnRvCi0Jcl9vZmZzZXQgYW5kIHNldCByX3N5bW5keCB0byBSRUxPQ19TRUNUSU9OX1RFWFQuCi0JKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQpOiBGb3IgTUlQU19SX1NXSVRDSCwgZ2V0IHRoZSByX3N5bW5keAotCXZhbHVlIGZyb20gdGhlIHJfb2Zmc2V0IGZpZWxkLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IE1heGltdW0gcl90eXBlIHZhbHVlIGlzIG5vdyBNSVBTX1JfU1dJVENILgotCUZvciBNSVBTX1JfU1dJVENILCBjb3B5IHRoZSByX29mZnNldCBmaWVsZCBpbnRvIHRoZSBhZGRlbmQgZmllbGQuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX291dCk6IEZvciBNSVBTX1JfU1dJVENILCBjb3B5IHRoZSBhZGRlbmQgZmllbGQKLQlpbnRvIHRoZSByX29mZnNldCBmaWVsZC4KLQkobWlwc19zd2l0Y2hfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVHJhbnNsYXRlIEJGRF9SRUxPQ19HUFJFTDMyIGludG8KLQlNSVBTX1JfU1dJVENILgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgTUlQU19SX1NXSVRDSC4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogQWRqdXN0IE1JUFNfUl9TV0lUQ0ggb2Zmc2V0IGlmIG5lY2Vzc2FyeS4KLQotVGh1IEFwciAgNyAxMToxMDo1MSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oIChlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTdXBwb3J0IGNhbGxpbmcgdGhlIGJhY2tlbmQKLQlmdW5jdGlvbiBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nIHdoZW4ganVzdCBiZWdpbm5pbmcgdG8KLQl3cml0ZSBhbiBvYmplY3QgZmlsZS4KLQotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCi0JKiBlbGZ7MzIsNjR9LXRhcmdldC5oIChlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogUHJvdmlkZQotCWEgZGVmYXVsdCBkZWZpbml0aW9uLgotCShlbGZ7MzIsNjR9X2JlZCk6IEFkZCBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nLgotCQotCSogZWxmMzItaHBwYS5oIChlbGZfaHBwYV90Y19zeW1ib2wpOiBEZWxldGUgZXh0ZXJuIGRlY2xhcmF0aW9uLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLWhwcGEuYyAoc3ltZXh0X2NoYWluX2J1aWx0KTogRGVsZXRlLgotCShzeW1leHRfY2hhaW5fc2l6ZSk6IFJlbmFtZWQgZnJvbSBzeW1leHRuX2NvbnRlbnRzX3JlYWxfc2l6ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3tiZWdpbixmaW5hbH1fd3JpdGVfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbnMuCi0JKGFkZF9lbnRyeV90b19zeW1leHRfY2hhaW4pOiBOZXcgZnVuY3Rpb24uCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSWdub3JlIHdyaXRlcyB0byB0aGUgc3ltYm9sIGV4dGVuc2lvbgotCXNlY3Rpb24gdW50aWwgaXQncyBiZWVuIHJlYnVpbHQgaW50ZXJuYWxseS4KLQkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBTeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gaXMgbm8KLQlsb25nZXIgc3BlY2lhbC4KLQkoZWxmX2JhY2tlbmRfe2JlZ2luLGZpbmFsfV93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogU2ltcGxpZnkgbm93IHRoYXQgbXVjaCBjb2RlIGhhcwotCW1pZ3JhdGVkIGludG8gZWxmMzJfaHBwYV9iYWNrZW5kX3tiZWluZyxmaW5hbH1fd3JpdGVfcHJvY2Vzc2luZy4KLQotV2VkIEFwciAgNiAxNzoyNDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgbmV3IHRhcmdldCB2ZWN0b3JzIHRvIHJlYWQgdGhlIGR5bmFtaWMgc3ltYm9scyBhbmQgZHluYW1pYwotCXJlbG9jcy4gIENoYW5nZSBhLm91dCB0byB1c2UgdGhlc2UgcmF0aGVyIHRoYW4gcmVhZGluZyB0aGUgZHluYW1pYwotCXN5bWJvbHMgYW5kIHJlbG9jcyBhbG9uZyB3aXRoIHRoZSBub3JtYWwgc3ltYm9scyBhbmQgcmVsb2NzLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIGZpZWxkcwotCV9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLAotCV9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLAotCV9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsCi0JX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYy4KLQkoQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyk6IERlZmluZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOgotCURlZmluZS4KLQkoX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVmaW5lLgotCShfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWZpbmUuCi0JKiBiZmQuYyAoYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlZmluZS4KLQkoYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWZpbmUuCi0JKiBzdW5vcy5jIChNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KLQkoTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWZpbmUuCi0JKE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlZmluZS4KLQkoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGR5bnN5bV9jb3VudCBhbmQKLQlkeW5yZWxfY291bnQgdG8gbG9uZy4gIEFkZCBmaWVsZHMgY2Fub25pY2FsX2R5bnN5bSBhbmQKLQljYW5vbmljYWxfZHlucmVsLgotCShzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IENoZWNrIHRoYXQgQkZEIGhhZCBEWU5BTUlDIGZsYWcgc2V0LgotCUNsZWFyIGluZm8tPmNhbm9uaWNhbF9keW5zeW0gYW5kIGluZm8tPmNhbm9uaWNhbF9keW5yZWwuCi0JKE1ZKHJlYWRfZHluYW1pY19zeW1ib2xzKSk6IFJlbW92ZWQuCi0JKE1ZKHJlYWRfZHluYW1pY19yZWxvY3MpKTogUmVtb3ZlZC4KLQkoc3Vub3NfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCShzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCShzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmFvdXQuaDogRGVjbGFyZSBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIGFuZAotCXJlbG9jX3N0ZF9leHRlcm5hbCB0byBhdm9pZCBwcm90b3R5cGUgcHJvYmxlbXMuCi0JKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBmaWVsZHMgcmVhZF9keW5hbWljX3N5bWJvbHMgYW5kCi0JcmVhZF9keW5hbWljX3JlbG9jcy4KLQkoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpKTogRGVjbGFyZS4KLQkoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBEZWNsYXJlLgotCSogYW91dHguaCAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpKTogUmVuYW1lZCBmcm9tCi0JdHJhbnNsYXRlX3N5bWJvbF90YWJsZSBhbmQgbWFkZSBub24tc3RhdGljLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCByZWFkIGR5bmFtaWMgc3ltYm9scy4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IERvbid0IHJlYWQgZHluYW1pYyByZWxvY3MuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogRG9uJ3QgY291bnQgZHluYW1pYyByZWxvY3MuCi0JKiBhb3V0ZjEuaCAoYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgYm90aGVyIHRvCi0JcmVtb3ZlIGR5bmFtaWMgc3ltYm9scyBhbmQgcmVsb2NzLiAgVGhleSB3aWxsIG5vIGxvbmdlciBiZQotCXByZXNlbnQuCi0JKE1ZX3JlYWRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShNWV9yZWFkX2R5bmFtaWNfcmVsb2NzKTogRG9uJ3QgZGVmaW5lLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogRG9uJ3QgaW5pdGlhbGl6ZSBkeW5hbWljIGVudHJ5IHBvaW50cy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlYWRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShNWV9yZWFkX2R5bmFtaWNfcmVsb2NzKTogRG9uJ3QgZGVmaW5lLgotCShNWShiYWNrZW5kX2RhdGEpKTogRG9uJ3QgaW5pdGlhbGl6ZSBkeW5hbWljIGVudHJ5IHBvaW50cy4KLQkoTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSB0bwotCV9iZmRfbm9keW5hbWljIHZlcnNpb24uCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IExpa2V3aXNlLgotCShNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IExpa2V3aXNlLgotCSogQWxsIGJhY2tlbmRzOiBBZGRlZCBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIHRvIHRhcmdldCB2ZWN0b3IuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogY2YtbTY4a2x5bnguYzogSW5jbHVkZSBzeXNkZXAuaC4KLQotCSogaHAzMDBocHV4LmM6IFJlbW92ZWQgc29tZSBzcGFjZXMgaW4gdXNlcyBvZiBOQU1FIHRvIGF2b2lkCi0JcHJvYmxlbXMgd2l0aCB0cmFkaXRpb25hbCBDIGNvbXBpbGVycy4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVhcnJhbmdlZCBmaWVsZHMgaW4gdGFyZ2V0IHZlY3Rvci4KLQlSZW1vdmVkIF9iZmRfZGVidWdfaW5mb19zdGFydCwgX2JmZF9kZWJ1Z19pbmZvX2VuZCBhbmQKLQlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSwgd2hpY2ggd2VyZSBuZXZlciB1c2VkLgotCShCRkRfSlVNUF9UQUJMRV9HRU5FUklDLCBCRkRfSlVNUF9UQUJMRV9DT1BZKTogRGVmaW5lZC4KLQkoQkZEX0pVTVBfVEFCTEVfQ09SRSwgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IERlZmluZWQuCi0JKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMsIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyk6IERlZmluZWQuCi0JKEJGRF9KVU1QX1RBQkxFX1dSSVRFLCBCRkRfSlVNUF9UQUJMRV9MSU5LKTogRGVmaW5lZC4KLQkqIEFsbCBiYWNrZW5kczogQ2hhbmdlZCB0byB1c2UgdGhlIG5ldyBCRkRfSlVNUF9UQUJMRV8qIG1hY3JvcwotCXJhdGhlciB0aGFuIHRoZSBzaW5nbGUgSlVNUF9UQUJMRSBtYWNyby4gIFJlbW92ZWQgbWFueSBvZiB0aGUKLQl3ZWlyZCBtYWNybyBkZWZpbml0aW9ucyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgbW9ub2xpdGhpYwotCUpVTVBfVEFCTEUuCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IFJlbW92ZWQuCi0JKiBsaWJiZmQtaW4uaDogRGVmaW5lIGEgYnVuY2ggb2YgbWFjcm9zLCBhbmQgZGVjbGFyZSBhIGZldwotCWZ1bmN0aW9ucywgZm9yIHVzZSB3aXRoIHRoZSBuZXcgQkZEX0pVTVBfVEFCTEVfKiBtYWNyb3MuCi0JKiBsaWJiZmQuYyAoX2JmZF9kdW1teV9uZXdfc2VjdGlvbl9ob29rKTogUmVtb3ZlZC4KLQkoYmZkX2ZhbHNlKTogU2V0IGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbi4KLQkoYmZkX251bGx2b2lkcHRyKTogTGlrZXdpc2UuCi0JKGJmZF9uMSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogUmVuYW1lZCBmcm9tCi0JX2JmZF9kdW1teV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AuCi0JKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOiBTaW1pbGFyIHJlbmFtZS4gIFNldAotCWJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbi4KLQkoX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IFJlbmFtZWQgZnJvbQotCWJmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2ltaWxhciByZW5hbWUuCi0JKiBpZWVlLmM6ICNpZiAwIG91dCBpZWVlX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LAotCWllZWVfYmZkX2RlYnVnX2luZm9fZW5kLCBpZWVlX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUuICBUaGV5Ci0Jd2VyZSBuZXZlciBjYWxsZWQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIEFwciAgNSAyMjoxMDowNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogQ3J1ZGUgc3VwcG9ydCBmb3IgZXhhbWluaW5nIGR5bmFtaWMgbGlicmFyaWVzLgotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBTZXQgRFlOQU1JQyBmbGFnIGZvciBTSExfTUFHSUMgYW5kCi0JRExfTUFHSUMgb2JqZWN0cy4KLQkoc29tX3ByZXBfaGVhZGVycyk6IFByZXNlcnZlIHRoZSBzeXN0ZW1faWQgZm9yIERZTkFNSUMgb2JqZWN0cy4KLQlVc2UgU0hMX01BR0lDIGFzIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIERZTkFNSUMgZmxhZyBpcyBzZXQuCi0JV3JpdGUgZXhlYyBoZWFkZXJzIGZvciBEWU5BTUlDIG9iamVjdHMuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogRFlOQU1JQyBvYmplY3RzIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50Ci0JcmVzdHJpY3Rpb25zIGFzIERfUEFHRUQgb2JqZWN0cy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogVHJlYXQgRFlOQU1JQyBvYmplY3RzIGxpa2UgRVhFQ19QCi0Jb2JqZWN0cy4KLQkob2JqZWN0X2ZsYWdzKTogQWRkIERZTkFNSUMuCi0KLVR1ZSBBcHIgIDUgMTc6NDg6NTIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBpMzg2bHlueC5jLCBzcGFyY2x5bnguYyAoTkFNRSk6IFJlbW92ZSBlbWJlZGRlZCB3aGl0ZXNwYWNlIGluCi0JbWFjcm8gdXNlcywgY29uZnVzZXMgc29tZSBub24tQU5TSSBjb21waWxlcnMuCi0KLVR1ZSBBcHIgIDUgMTU6NTA6MDEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBBZGQgbWlzc2luZyBQQVJBTVMgZGVjbC4KLQlEb24ndCBmcmVlIGFueXRoaW5nIGlmIHdlIGRvbid0IGhhdmUgYSBiZmRfb2JqZWN0LgotCShzb21fY2xvc2VfYW5kX2NsZWFudXApOiBDYWxsIHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mby4KLQotVHVlIEFwciAgNSAxMToyMjozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IERvbid0IHJlbW92ZSBlbXB0eSBzZWN0aW9ucy4KLQlJdCB0dXJucyBvdXQgbm90IHRvIGJlIHJlcXVpcmVkIG9uIElyaXggNSwgYW5kIGl0IGNhdXNlcyBwcm9ibGVtcwotCWlmIHRoZSBzZWN0aW9ucyBoYXBwZW4gdG8gY29udGFpbiBzeW1ib2xzLgotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogQ29ycmVjdCBiZmRfd3JpdGUgY2hlY2suCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogRG9uJ3QgZXJyb3Igb3V0IGlmCi0Jc2VjdGlvbi0+cmVsb2NhdGlvbiBpcyBOVUxMOyBtYWxsb2MgbWlnaHQgaGF2ZSByZXR1cm5lZCBOVUxMIHdoZW4KLQlnaXZlbiBhIHplcm8gc2l6ZSBpZiB0aGVyZSB3ZXJlIG5vIHJlbG9jYXRpb25zLgotCSogYm91dC5jIChiX291dF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogbmxtY29kZS5oIChubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3JlbG9jX3RhYmxlKSk6IExpa2V3aXNlLiAgQWxzbywgaWYgbWFsbG9jCi0JcmV0dXJucyBOVUxMLCBkb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgd2UgYXNrZWQgZm9yIHplcm8gYnl0ZXMuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpKTogSWYgbWFsbG9jIHJldHVybnMKLQlOVUxMLCBkb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgd2UgYXNrZWQgZm9yIHplcm8gYnl0ZXMuCi0JKiBubG1jb2RlLmggKG5sbV9zbHVycF9yZWxvY19maXh1cHMpOiBMaWtld2lzZS4KLQotTW9uIEFwciAgNCAxNTozMDo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykpOiBEb24ndCBmcmVlIGFueXRoaW5nCi0JaWYgd2UgZG9uJ3QgaGF2ZSBhIGJmZF9vYmplY3QuCi0KLQlNYWRlIHN1cmUgdGhhdCBldmVyeSBjYWxsIHRvIGJmZF9yZWFkLCBiZmRfd3JpdGUsIGFuZCBiZmRfc2VlawotCWNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIGFuZCBoYW5kbGVkIGJmZF9lcnJvciBjb3JyZWN0bHkuICBUaGVzZQotCWNoYW5nZXMgYXJlIG5vdCBpdGVtaXNlZC4gIEFsc286Ci0JKiBhb3V0eC5oIChlbWl0X3N0cnRhYik6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLCBhbmQgcmV0dXJuCi0JZXJyb3JzLgotCShOQU1FKGFvdXQsd3JpdGVfc3ltcykpOiBDaGVjayBlbWl0X3N0cnRhYiByZXR1cm4gdmFsdWUuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbiwKLQlhbmQgcmV0dXJuIGVycm9ycy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBjb2ZmX3dyaXRlX3JlbG9jcyByZXR1cm4KLQl2YWx1ZS4KLQkqIGkzODZvczlrLmMgKG9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbik6IENoYW5nZSByZXR1cm4gdHlwZSB0bwotCWJvb2xlYW4uCi0JKG9zOWtfb2JqZWN0X3ApOiBDaGVjayBvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4gcmV0dXJuIHZhbHVlLgotCSogb2FzeXMuYyAob2FzeXNfcmVhZF9yZWNvcmQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQkob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlOiBDaGVjayBvYXN5c19yZWFkX3JlY29yZCByZXR1cm4gdmFsdWUuCi0JKG9hc3lzX29iamVjdF9wLCBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEpOiBMaWtld2lzZS4KLQkob2FzeXNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKG9hc3lzX3dyaXRlX3N5bXMpOiBMaWtld2lzZS4gIEFsc28sIGNoZWNrIG9hc3lzX3dyaXRlX3JlY29yZAotCXJldHVybiB2YWx1ZS4KLQkob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBDaGVjayBvYXN5c193cml0ZV9yZWNvcmQgcmV0dXJuIHZhbHVlLgotCShvYXN5c193cml0ZV9oZWFkZXIpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4gIENoZWNrCi0Jb2FzeXNfd3JpdGVfcmVjb3JkIHJldHVybiB2YWx1ZS4KLQkob2FzeXNfd3JpdGVfZW5kLCBvYXN5c193cml0ZV9kYXRhKTogTGlrZXdpc2UuCi0JKG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZXMgb2YKLQlvYXN5c193cml0ZV9oZWFkZXIsIG9hc3lzX3dyaXRlX3N5bXMsIG9hc3lzX3dyaXRlX2RhdGEsIGFuZAotCW9hc3lzX3dyaXRlX2VuZC4KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9yZWNvcmQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQkoc3JlY193cml0ZV9oZWFkZXIpOiBMaWtld2lzZS4gIEFsc28sIGNoZWNrIHNyZWNfd3JpdGVfcmVjb3JkCi0JcmV0dXJuIHZhbHVlLgotCShzcmVjX3dyaXRlX3NlY3Rpb24sIHNyZWNfd3JpdGVfdGVybWluYXRvcik6IExpa2V3aXNlLgotCShzcmVjX3dyaXRlX3N5bWJvbHMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQkoaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlzcmVjX3dyaXRlX3N5bWJvbHMsIHNyZWNfd3JpdGVfaGVhZGVyLCBzcmVjX3dyaXRlX3NlY3Rpb24sIGFuZAotCXNyZWNfd3JpdGVfdGVybWluYXRvci4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1Nb24gQXByICA0IDEwOjU2OjQ1IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWl4Mzg2LWNvcmUuYyAoYWl4Mzg2X2JmZF9pc19sb2NhbF9sYWJlbCk6ICBDb3JyZWN0IGNhc3QgZnJvbQotCWFzZWN0aW9uIHRvIGFzeW1ib2wuCi0JKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9iZmRfaXNfbG9jYWxfbGFiZWwpOiAgQ29ycmVjdCBjYXN0IGZyb20KLQliZmQgdG8gYXN5bWJvbC4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogIENvcnJlY3QgY2FzdCBmcm9tCi0JYXNlY3Rpb24gdG8gYXN5bWJvbC4KLQotU3VuIEFwciAgMyAxODoyNzoyOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBVc2UgbWFsbG9jIHRvIGFsbG9jYXRlIHNwYWNlCi0JZm9yIHRoZSBjYWNoZWQgY29weSBvZiB0aGUgbmF0aXZlIHN0cmluZyB0YWJsZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgbmF0aXZlIHN5bWJvbCB0YWJsZS4KLQkoc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UgZm9yIHRoZSBuYXRpdmUgYW5kIGdlbmVyaWMKLQlyZWxvY2F0aW9uIHRhYmxlcy4KLQkoc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRnJlZSB0aGUgY2FjaGVkIG5hdGl2ZSBzdHJpbmdzLAotCXN5bWJvbHMsIGFuZCByZWxvY2F0aW9ucy4gIEFsc28gZnJlZSB0aGUgY2Fub25pY2FsIGNhY2hlZAotCXJlbG9jYXRpb25zLgotCi1GcmkgQXByICAxIDEyOjQwOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBJZiBrZWVwX21lbW9yeSBpcyBmYWxzZSwgbWFrZQotCXN1cmUgdGhlIHN5bWJvbCBuYW1lIGlzIHN0b3JlZCBpbiBwZXJtYW5lbnQgbWVtb3J5IGJlZm9yZSBhZGRpbmcKLQlpdCB0byB0aGUgc3RyaW5nIHRhYmxlLgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IE9uY2Ugd2UndmUgZm91bmQgYW4KLQlvYmplY3QsIGRvbid0IGJvdGhlciB0byBsb29rIGZvciBtb3JlIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0bwotCWJ1aWxkIGEgbWFwLgotCShjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IEFmdGVyIGFkZGluZyB0aGUgc3ltYm9scyBmb3IgYSBCRkQsCi0JY2FsbCBiZmRfZnJlZV9jYWNoZWRfaW5mbyBvbiBpdC4KLQotCUFkZCBiZmRfZnJlZV9jYWNoZWRfaW5mbyBzdXBwb3J0IHRvIGEub3V0IGJhY2tlbmRzLgotCSogYW91dHguaCAoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IFJlbmFtZWQgZnJvbQotCWFvdXRfbGlua19nZXRfc3ltYm9scy4gIFJlYWQgc3RyaW5ncyBldmVuIGlmIHN5bWJvbHMgaGF2ZSBiZWVuCi0JcmVhZC4gIFN0b3JlIHN0cmluZyBzaXplIGluIG9ial9hb3V0X3N0cmluZ19zaXplLgotCShOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENhbGwgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyB0bwotCXJlYWQgdGhlIHN5bWJvbHMuICBBbGxvY2F0ZSB0aGUgY2FjaGVkIHN5bWJvbHMgd2l0aCBtYWxsb2MsIG5vdAotCWJmZF9hbGxvYy4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IEFsbG9jYXRlIHRoZSBjYWNoZWQgcmVsb2NzIHdpdGgKLQltYWxsb2MsIG5vdCBiZmRfYWxsb2MuCi0JKE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykpOiBOZXcgZnVuY3Rpb247IGZyZWUgY2FjaGVkCi0Jc3ltYm9scyBhbmQgcmVsb2NzLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgZXh0ZXJuYWxfc3RyaW5nX3NpemUgZmllbGQuCi0JKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCShOQU1FKGFvdXQsY2xvc2VfYW5kX2NsZWFudXApKTogRG9uJ3QgZGVjbGFyZS4KLQkoTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSk6IERlY2xhcmUuCi0JKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEb24ndCBkZWZpbmUuCi0JKGFvdXRfNjRfY2xvc2VfYW5kX2NsZWFudXApOiBEb24ndCBkZWZpbmUuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IElmIG5vdCBhbHJlYWR5IGRlZmluZWQsCi0JZGVmaW5lIGFzIE5BTUUoYW91dCxmcmVlX2NhY2hlZF9pbmZvKS4KLQkoTVlfY2xvc2VfYW5kX2NsZWFudXApOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLCBkZWZpbmUgYXMKLQlNWV9iZmRfZnJlZV9jYWNoZWRfaW5mby4KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KLQkoYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERvbid0IGRlZmluZS4KLQkqIGJvdXQuYyAoYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KLQkoYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERvbid0IGRlZmluZS4KLQkqIGhwMzAwaHB1eC5jIChNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERlZmluZSBhcyBiZmRfdHJ1ZS4KLQkoTVlfY2xvc2VfYW5kX2NsZWFudXApOiBEb24ndCBkZWZpbmUuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpKTogQWxsb2NhdGUgdGhlIGNhY2hlZAotCXJlbG9jcyB3aXRoIG1hbGxvYywgbm90IGJmZF9hbGxvYy4KLQkqIGkzODZvczlrLmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCi0KLQlBZGQgYSBuZXcgZW50cnkgcG9pbnQgdG8gZnJlZSBtZW1vcnkgY2FjaGVkIGJ5IGEgQkZELgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBmaWVsZC4KLQkqIGJmZC5jIChiZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERlZmluZS4KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkIF9iZmRfZnJlZV9jYWNoZWRfaW5mby4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIEFsbCBiYWNrZW5kczogSW5pdGlhbGl6ZSBiZmRfZnJlZV9jYWNoZWRfaW5mbyBlbnRyeSBwb2ludCB0bwotCWJmZF90cnVlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogQ29ycmVjdCB0eXBlIG9mCi0JZmlyc3QsIHVudXNlZCwgYXJndW1lbnQuCi0JKGhwcGFfZWxmX2lzX2xvY2FsX2xhYmVsKTogRGVjbGFyZSBpbnN0ZWFkIG9mCi0Jc29tX2JmZF9pc19sb2NhbF9sYWJlbC4KLQotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBBZGQgcmVsb2NfZW50cnktPmFkZHJlc3MgdG8gdmFsdWUgb2YKLQlhYnNvbHV0ZSBSX0lSRUwgcmVsb2MuCi0KLVRodSBNYXIgMzEgMTE6NTI6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkZWQgc29tZSBzdXBwb3J0IGZvciBJcml4IDQgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvciBhCi0JLmxpYiBzZWN0aW9uLgotCShlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgaWYKLQlTVFlQX0VDT0ZGX0xJQiBiaXQgaXMgc2V0LgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBSb3VuZCB0aGUgY29udGVudHMgb2YgYQotCS5saWIgc2VjdGlvbiB1cCB0byB0aGUgbmV4dCBwYWdlIGJvdW5kYXJ5LgotCShlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElmIHdlIHNlZSBhIC5saWIgc2VjdGlvbiwgaW5jcmVtZW50Ci0JdGhlIHZtYSBieSBvbmUgdG8gY291bnQgdGhlIG51bWJlciBvZiBzaGFyZWQgbGlicmFyaWVzIHdlIGhhdmUuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNyYXNoIGlmIHdlIHNlZSBhCi0JU1RZUF9FQ09GRl9MSUIgc2VjdGlvbiwgYW5kIGRvbid0IGFkanVzdCB0ZXh0X3N0YXJ0IG9yIGRhdGFfc3RhcnQKLQlvciBic3Nfc2l6ZSBlaXRoZXIuCi0KLQkqIGNvZmZjb2RlLmggKENBTENfQURERU5EKTogQ2hhbmdlIHRvIGZldGNoIG9yaWdpbmFsIHN5bWJvbCB2YWx1ZQotCWZyb20gb3JpZ2luYWwgQkZELCByYXRoZXIgdGhhbiB1c2luZyB2YWx1ZSBvZiBjdXJyZW50IEJGRCBzeW1ib2wuCi0JTmVlZGVkIGZvciBuZXcgbGlua2VyLgotCSogY29mZi1zcGFyYy5jIChDQUxDX0FEREVORCk6IExpa2V3aXNlLgotCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgdGhlIHRleHRfc3RhcnQgYW5kCi0JZGF0YV9zdGFydCBlbnRyaWVzIGluIHRoZSBvcHRpb25hbCBoZWFkZXIgY29ycmVjdGx5IGV2ZW4gaWYgYSB0ZXh0Ci0Jb3IgZGF0YSBzZWN0aW9uIHN0YXJ0cyBhdCBsb2NhdGlvbiB6ZXJvLgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGRlZCBCRkRfUkVMT0NfMjYgKGZyb20gc2VmCi0JYW5kIHJhZWJ1cm4pLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3JlYWRfaW1wb3J0KTogTnVsbCB0ZXJtaW5hdGUgdGhlIHN5bWJvbAotCW5hbWUuCi0JKiBubG0zMi1hbHBoYS5jIChubG1fYWxwaGFfcmVhZF9pbXBvcnQpOiBMaWtld2lzZS4KLQkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19yZWFkX2ltcG9ydCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfc3ltYm9sKTogUmVpbmRlbnRlZC4gIENoYW5nZWQgdG8gcmV0dXJuCi0JYm9vbGVhbiwgYW5kIGNoYW5nZWQgd3JpdHRlbiB0byB1bnNpZ25lZCBpbnQgKi4gIENoZWNrIGVycm9yCi0JcmV0dXJucyBmcm9tIGNhbGxlZCBmdW5jdGlvbnMuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBMaWtld2lzZS4gIFJld29ya2VkIGNoZWNrcyBvbiB3aGV0aGVyIHRvCi0Jd3JpdGUgc3ltYm9sIG5hbWUgdG8gc3RyaW5nIHRhYmxlIGZvciBjbGFyaXR5IGFuZCB0byBhdm9pZCBjb3JlCi0JZHVtcGluZyB3aGVuIGdpdmVuIGEgbm9uIENPRkYgc3ltYm9sLgotCSogbGliY29mZi1pbi5oIChjb2ZmX3dyaXRlX3N5bWJvbHMpOiBEZWNsYXJlIGFzIHJldHVybmluZyBib29sZWFuLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQljb2ZmX3dyaXRlX3N5bWJvbHMuCi0KLVdlZCBNYXIgMzAgMTY6MjU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBsZXQgQkZEIHJldHVybiBhbiBlcnJvciBpbmRpY2F0aW9uIGZyb20KLQlnZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiwKLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4gIFRoZXkgbm93Ci0JcmV0dXJuIGxvbmcgaW5zdGVhZCBvZiB1bnNpZ25lZCBpbnQsIGFuZCB1c2UgLTEgdG8gaW5kaWNhdGUgYW4KLQllcnJvci4gIEFsb25nIHRoZSB3YXksIHJlbmFtZSBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQuCi0JKiBiZmQuYyAoYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IFJldHVybiBsb25nLCBhbmQgLTEgb24KLQllcnJvcnMuCi0JKGJmZF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHN5bXMuYyAoYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBSZW5hbWVkIGZyb20KLQlnZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVuYW1lZCBfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0bwotCV9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYW5kIGNoYW5nZWQgaXQgYW5kCi0JX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiIGFuZCBfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZAotCV9iZmRfY2Fub25pY2FsaXplX3JlbG9jIHRvIGFsbCByZXR1cm4gbG9uZy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxnZXRfc3ltdGFiKSk6IFJldHVybiBsb25nLCBhbmQgLTEgb24gZXJyb3JzLgotCShOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkqIGJvdXQuYyAoYl9vdXRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlY29mZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGVsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoZWxmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShnZXRfc3ltdGFiKSk6IExpa2V3aXNlLgotCShNWShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShNWShjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlib29sZWFuLiAgQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGdldF9zeW1ib2wuCi0JKGllZWVfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uICBDaGVjawotCWZvciBlcnJvcnMgZnJvbSBpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMuCi0JKGllZWVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFJldHVybiBsb25nLCBhbmQgLTEgb24gZXJyb3JzLgotCShpZWVlX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoaWVlZV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoaWVlZV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogbmxtY29kZS5oIChubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShubG1fZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkob2FzeXNfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShvYXN5c19nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkob2FzeXNfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoc29tX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShzb21fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShzcmVjX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUgYXMgYmZkXzBsLgotCShzcmVjX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogdGVraGV4LmMgKHRla2hleF9nZXRfc3ltdGFiKTogUmV0dXJuIGxvbmcsIGFuZCAtMSBvbiBlcnJvcnMuCi0JKHRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHRla2hleF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUgYXMgYmZkXzBsLgotCSh0ZWtoZXhfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IENoYW5nZQotCWRlY2xhcmF0aW9uIHRvIHJldHVybiBsb25nLgotCShOQU1FKGFvdXQsZ2V0X3N5bXRhYikpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlY29mZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbGliZWxmLmggKGJmZF9lbGYzMl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxpYm5sbS5oIChubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKG5sbU5BTUUoZ2V0X3N5bXRhYikpOiBMaWtld2lzZS4KLQkobmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKG5sbU5BTUUoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFVzZSBlcnJvcl9yZXR1cm4gYW5kCi0Jbm9fbWVtb3J5X3JldHVybiBsYWJlbHMgcmF0aGVyIHRoYW4gZnJlZWluZyBpbmZvcm1hdGlvbiBpbiB2YXJpb3VzCi0JcGxhY2VzLiAgQ2hhbmdlIHN0b3JhZ2UsIHN5bWNvdW50IGFuZCBzcmNfY291bnQgdG8gbG9uZy4gIENoZWNrCi0JZXJyb3JzIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBib3V0LmMgKGJfb3V0X3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2UgcmVsb2Nfc2l6ZSB0byBsb25nLiAgQ2hlY2sKLQlmb3IgZXJyb3JzIGZyb20gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTGlrZXdpc2UuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiwgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcik6IENoZWNrIGZvciBlcnJvcnMKLQlmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGxpYmJmZC5jIChiZmRfMGwpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoYmZkXzBsKTogRGVjbGFyZS4KLQkqIGFpeDM4Ni1jb3JlLmM6IENoYW5nZSBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBnZXRfc3ltdGFiLAotCWdldF9yZWxvY191cHBlcl9ib3VuZCwgYW5kIGNhbm9uaWNhbGl6ZV9yZWxvYyB0byB1c2UgYmZkXzBsIHJhdGhlcgotCXRoYW4gYmZkXzB1LgotCSogY2lzY28tY29yZS5jLCBocHBhYnNkLWNvcmUuYywgaHB1eC1jb3JlLmM6IExpa2V3aXNlLgotCSogaXJpeC1jb3JlLmMsIG9zZi1jb3JlLmMsIHB0cmFjZS1jb3JlLmMsIHRyYWQtY29yZS5jOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9yZWxvYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCi0JdGVtcCBhbmQgbmFtZS4KLQotV2VkIE1hciAzMCAwODozMzowNCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvZHB4Mi5oOiBEZWZpbmUgUE9TSVhfVVRJTUUuCi0KLVdlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpMzg2ZHluaXguYywgY29uZmlnL2kzODYtZHluaXgubXQ6ICBOZXcgZmlsZXMsIGhhbmRsaW5nIER5bml4Ci0JdmFyaWFudCBvZiBhLm91dC4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLmJmZDogIFVzZSB0aGVtIGZvciBEeW5peC4KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGRlcGVuZGVuY2llcyBmb3IgaTM4NmR5bml4Lm8uIAotCSogdGFyZ2V0cy5jOiAgQWRkIGRlZmluaXRpb24gZm9yIGkzODZkeW5peF92ZWMuCi0JKiBob3N0cy9zeW1tZXRyeS5oOiAgRG8gbm90IGRlZmluZSBUUkFEX0NPUkVfVVNFUl9PRkZTRVQgZm9yIER5bml4LgotCURlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiBhbmQgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTAotCWZvciBEeW5peC4gUmVtb3ZlIGluY2x1c2lvbiBvZiBkeW5peDMuaCwgRHluaXggYmZkIGlzIG5vdyBoYW5kbGVkIGJ5Ci0JaTM4NmR5bml4LmMKLQotTW9uIE1hciAyOCAxMjo1MzoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXNwYXJjLm8uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlIGJmZF9hcmNoX3Bvd2VycGMgbGlrZQotCWJmZF9hcmNoX3JzNjAwMC4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgcnM2MDAwLm10LgotCSogY29uZmlnL3JzNjAwMC5tdCAoU0VMRUNUX0FSQ0hJVEVDVFVSRVMpOiBBZGQgYmZkX3Bvd2VycGNfYXJjaC4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFNldCBTRUNfUkVMT0MgZmxhZwotCWZvciBnZW5lcmF0ZWQgY29uc3RydWN0b3Igc2VjdGlvbi4KLQotU3VuIE1hciAyNyAxNjoyNToyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogTmV3IGFwcHJvYWNoIGF0IGRlYWxpbmcgd2l0aCBob2xlcwotCWluIGV4ZWN1dGFibGVzIGxlZnQgYnkgdGhlIEhQIGxpbmtlci4gIERvZXMgbm90IHJlbHkgb24gc3Vic3BhY2UKLQlhbGlnbm1lbnRzIGFzIHN1YnNwYWNlcyBhcmUgKk5PVCogZ3VhcmFudGVlZCB0byBiZSBwcm9wZXJseQotCWFsaWduZWQgaW4gYW4gZXhlY3V0YWJsZSAoY2FuIHlvdSBiZWxpZXZlIHRoYXQhKS4KLQotU2F0IE1hciAyNiAxMDoyNTo0MyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbi4gIERvIG5vdCB0cnkKLQl0byBhY3R1YWxseSByZWFkIGRhdGEgZnJvbSBhIHNlY3Rpb24gdGhhdCBkb2Vzbid0IGhhdmUgZWl0aGVyCi0JU0VDX0xPQUQgb3IgU0VDX0RFQlVHR0lORyBzZXQgKGVnICRCU1MkKSBqdXN0IHJldHVybiB0cnVlLgotCi0gICAgICAgICogbGliYmZkLmMgKGJmZF9yZWFkKTogU2V0IGJmZF9lcnJvciBhcyBhcHByb3ByaWF0ZSBmb3IgYSBzaG9ydAotCXJlYWQuIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwgb3IgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKS4KLQotCSogc29tLmM6IERvIG5vdCBibGluZGx5IHNldCBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwgYWZ0ZXIgYQotCWZhaWxpbmcgYmZkX3JlYWQsIGJmZF93cml0ZSwgb3IgYmZkX3NlZWsuICBJbiBhIGZldyBwbGFjZXMKLQkobGlrZSBzb21fb2JqZWN0X3ApIG92ZXJyaWRlIHRoZSBlcnJvciBzdGF0dXMgc2V0IGJ5IGJmZF9yZWFkLgotCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LWVuY2FwLGMgYXJjaGl2ZS5jLCBib3V0LmM6IExpa2V3aXNlLgotCSogY29mZi1yczYwMDAuYywgY29mZmdlbi5jIGVjb2ZmLmMsIGVsZi5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYywgZWxmY29kZS5oLCBocDMwMGhwdXguYywgaTM4Nmx5bnguYzogTGlrZXdpc2UuCi0JKiBubG0zMi1hbHBoYS5jLCBubG0zMi1pMzg2LmMsIG5sbTMyLXNwYXJjLmM6IExpa2V3aXNlLgotCi0JKiBzb20uYzogQ2hlY2sgcmV0dXJuIHZhbHVlcyBmcm9tIHNldmVyYWwgYmZkX3tzZWVrLHJlYWQsd3JpdGV9Ci0JY2FsbHMgdGhhdCB3ZSBqdXN0IGFzc3VtZWQgd2VyZSBub3QgZmFpbGluZy4KLQotRnJpIE1hciAyNSAxMTo0NDowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3lzdjQuaCAoSEFWRV9QUk9DRlMpOiBBZGQgY29tbWVudHMgYWJvdXQgcHR4NC4KLQkqIGNvbmZpZy9zeXN2NC5taDogQWRkIGNvbW1lbnQuCi0JKiBjb25maWcvc3ltbWV0cnkubWg6IENoYW5nZSBjb21tZW50LgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBzeXN2NCwgbm90IHN5bW1ldHJ5LCBmb3IgaVszNF04Ni1zZXF1ZW50LXN5c3Y0Ki4KLQotRnJpIE1hciAyNSAxNzoxMDo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIHRvIHN1cHBvcnQgbGlua2VyIHJlbGF4aW5nIG9mIGVtYmVkZGVkIE1JUFMgUElDIGNvZGUgdG8KLQl1c2UgYSBmaXZlIGluc3RydWN0aW9uIHNlcXVlbmNlIGZvciBmdW5jdGlvbiBjYWxscyB3aGljaCBhcmUgb3V0IG9mCi0JcmFuZ2Ugb2YgdGhlIGJhbCBpbnN0cnVjdGlvbi4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhKTogRGVmaW5lLgotCShlY29mZl9zZWN0aW9uX2RhdGEpOiBEZWZpbmUuCi0JKGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRG9uJ3QgZGVmaW5lLgotCSogZWNvZmYuYyAoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogRG9uJ3QgcmVhZCBvciBmcmVlCi0JdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlYWQuCi0JKGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBIYW5kbGUgX2Nvb2tlZF9zaXplIGJlaW5nIGRpZmZlcmVudAotCWZyb20gX3Jhd19zaXplLiAgRG9uJ3QgcmVyZWFkIHRoZSBjb250ZW50cyBvciB0aGUgcmVsb2NzIGlmIHRoZXkKLQloYXZlIGFscmVhZHkgYmVlbiByZWFkIGluLgotCSogY29mZi1taXBzLmMgKG1pcHNfaG93dG9fdGFibGUpOiBDaGFuZ2UgYml0c2l6ZSBvZiBQQ1JFTDE2IGZyb20KLQkxOCB0byAxNi4KLQkoUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVCk6IERlZmluZS4KLQkobWlwc19yZWxvY2F0ZV9yZWZoaSk6IFRha2UgYWRqdXN0IGFyZ3VtZW50LgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgcmVsb2Mgb2Zmc2V0cyBzdG9yZWQgaW4gc2VjdGlvbgotCXVzZWRfYnlfYmZkIGZpZWxkLiAgQ2FsbCBtaXBzX3JlbGF4X3BjcmVsMTYgdG8gaGFuZGxlIGRldGFpbHMgb2YKLQlleHBhbmRpbmcgYW4gb3V0IG9mIHJhbmdlIFBDUkVMMTYuICBLZWVwIHRyYWNlIG9mIGFkanVzdG1lbnRzCi0JcmVxdWlyZWQgYnkgZXhwYW5zaW9ucy4gIFNldCBzIGFuZCB1bnNldCBoIHdoZW4gY29udmVydGluZyBhIHJlbG9jCi0JZnJvbSB1bmRlZmluZWQgdG8gc2VjdGlvbi4gIENoYW5nZSBoYW5kbGluZyBvZiBQQyByZWxhdGl2ZSByZWxvY3M6Ci0JaWYgYWdhaW5zdCBhIHNlY3Rpb24sIHRoZXkgYXJlIGNvcnJlY3QgaW4gdGhlIG9iamVjdCBmaWxlLCBpZgotCWFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIHRoZXkgYXJlIHBjcmVsX29mZnNldC4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX3JlbGF4X3BjcmVsMTYpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCSogY29mZi1hbHBoYS5jIChlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IEhhbmRsZSBhZGp1c3RtZW50cwotCWJ1aWx0IGJ5IG1pcHNfcmVsYXhfc2VjdGlvbiB3aGVuIHdyaXRpbmcgb3V0IGFkZHJlc3Nlcy4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogQ2xlYXIgYWRqdXN0IGZpZWxkLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogVGhlIGNhbGxlciBleHBlY3RzCi0JZnVuY3Rpb25uYW1lX3B0ciB0byBiZSBzZXQgdG8gYSBzeW1ib2wgbmFtZSwgc28gcHJlcGVuZAotCXN5bWJvbF9sZWFkaW5nX2NoYXIuCi0KLVRodSBNYXIgMjQgMTE6MzM6NDYgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogQWRkIHJlbGF4aW5nIGluZm8KLQlmb3IgMTZiaXQgcmVsYXRpdmUgYnJhbmNoZXMuCi0JKiBjb2ZmLWg4NTAwLmMgKHJfaGlnaDgsIHJfbG93MTYsIHJfaGlnaDE2KTogRG9uJ3QgY29tcGxhaW4gb24KLQlvdmVyZmxvdy4KLQotVGh1IE1hciAyNCAwOToyMToxMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUpOiBJZ25vcmUgbm9uLVNPTSBvYmplY3RzLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiwgc29tX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMjMgMTQ6Mjk6MzEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBuZXRic2QzODYuYyAoTl9TRVRfRkxBR1MpOiBEZWxldGUgdGhlIG9sZCBkZWZpbml0aW9uLgotCi1XZWQgTWFyIDIzIDE0OjU4OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNsZWFuIHVwIHRoZSByZWxheGluZyBjb2RlIGZvciB0aGUgbmV3IGxpbmtlci4KLQkqIHRhcmdldHMuYyAoX2JmZF9yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbiBhcmd1bWVudAotCXJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQkqIGJmZC5jIChiZmRfcmVsYXhfc2VjdGlvbik6IENoYW5nZSBuYW1lIG9mIGZvdXJ0aCBhcmd1bWVudCBmcm9tCi0Jc3ltYm9scyB0byBhZ2Fpbi4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24pOiBUYWtlIGJvb2xlYW4gKmFnYWluCi0JYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LiAgQWx3YXlzIHJldHVybiB0cnVlLgotCSogYm91dC5jOiBJbmNsdWRlIGdlbmxpbmsuaC4KLQkoYWxpZ25jb2RlLCBwZXJmb3JtX3NsaXApOiBEZWNsYXJlLgotCShwZXJmb3JtX3NsaXApOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JQ2hhbmdlZCBhbGwgY2FsbGVycy4gIEdldCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQuICBDaGFuZ2UgdGhlCi0JaGFzaCB0YWJsZSBlbnRyeSB2YWx1ZSBhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgdmFsdWUuCi0JKGFiczMyY29kZSk6IFRha2UgQkZEIGFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4gIENoYW5nZWQKLQlhbGwgY2FsbGVycy4KLQkoYWxpZ25jb2RlKTogTGlrZXdpc2UuCi0JKGJfb3V0X3JlbGF4X3NlY3Rpb24pOiBUYWtlIGJvb2xlYW4gKmFnYWluIGFyZ3VtZW50IHJhdGhlciB0aGFuCi0JYXN5bWJvbCBsaXN0LiAgT25seSByZXR1cm4gZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuICBTZXQgKmFnYWluCi0JdG8gZmFsc2UuICBHZXQgc3ltYm9scyBmcm9tIEJGRC4KLQkqIHJlbG9jMTYuYzogSW5jbHVkZSBnZW5saW5rLmguCi0JKGJmZF9wZXJmb3JtX3NsaXApOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JR2V0IHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRC4gIENoYW5nZSB0aGUgaGFzaCB0YWJsZSBlbnRyeSB2YWx1ZQotCWFzIHdlbGwgYXMgdGhlIHN5bWJvbCB2YWx1ZS4KLQkoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbiBhcmd1bWVudAotCXJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4gIE9ubHkgcmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLgotCVNldCAqYWdhaW4gdG8gZmFsc2UuICBHZXQgc3ltYm9scyBmcm9tIEJGRC4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IENoYW5nZQotCV9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlIHRvIHRha2UgQkZEIGFyZ3VtZW50IHJhdGhlciB0aGFuCi0JYXN5bWJvbCBsaXN0LgotCShiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0JKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQkqIGxpYmNvZmYtaW4uaCAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogQ2hhbmdlCi0JZGVjbGFyYXRpb24gdG8gdGFrZSBib29sZWFuICogcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCShiZmRfcGVyZm9ybV9zbGlwKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIHRha2UgQkZEIHJhdGhlciB0aGFuCi0JYXN5bWJvbCBsaXN0LgotCSogY29mZi1oODMwMC5jIChoMzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIKLQl0aGFuIGFzeW1ib2wgbGlzdC4gIENoYW5nZWQgY2FsbHMgdG8gYmZkX3BlcmZvcm1fc2xpcC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBnZW5saW5rLmggKF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQpOiBEZWZpbmUuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBpdC4gIFVzZQotCV9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIGFuZCBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQKLQl0byBnZXQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZELgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogU3RvcmUgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5Ci0JaW4gYXN5bWJvbCB1ZGF0YSBmaWVsZC4KLQotVHVlIE1hciAyMiAxMzowOTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQWRkIGVudHJ5IGZvciBuZXcgTUlQU19SX1BDUkVMMTYKLQlyZWxvYywgdXNlZCBpbiBlbWJlZGRlZCBQSUMgY29kZS4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBDaGFuZ2Ugc2FuaXR5IGNoZWNrIHRvIHBlcm1pdCBuZXcgcmVsb2MuCi0JKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVHVybiBCRkRfUkVMT0NfMTZfUENSRUxfUzIgaW50bwotCU1JUFNfUl9QQ1JFTDE2LgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBBY2NvdW50IGZvciBsaW5rX29yZGVyCi0JcmVsb2NzIHdoZW4gYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBTZXQgU0VDX1JFTE9DIGZsYWcKLQlmb3IgYW55IHNlY3Rpb24gd2hpY2ggaGFzIHJlbG9jcy4gIEhhbmRsZSBsaW5rX29yZGVyIHJlbG9jcyBpbgotCWxpbmtfb3JkZXIgbG9vcC4gIFVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0IGZvcgotCWFkZF9zeW1ibHMgZW50cnkgcG9pbnQuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IFNldCByZWxvY19jb3VudCB0byAwIGJlZm9yZQotCWNvdW50aW5nIHJlbG9jcy4gIFNldCBTRUNfUkVMT0MgZmxhZyBmb3IgYW55IHNlY3Rpb24gd2hpY2ggaGFzCi0JcmVsb2NzLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIpOiBIYW5kbGUgYmZkX2RhdGFfbGlua19vcmRlci4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzKTogSnVzdCBjYWxsCi0JZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0KTogTmV3IGZ1bmN0aW9uLCBsaWtlCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgYnV0IGFsc28gY29sbGVjdCBjb25zdHJ1Y3RvcnMgYW5kCi0JZGVzdHJ1Y3RvcnMgYnkgbmFtZSBhcyBjb2xsZWN0MiBkb2VzLgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24sIGxpa2Ugb2xkCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgYnV0IHdpdGggY29sbGVjdCBhcmd1bWVudC4KLQkoZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFRha2UgY29sbGVjdCBhcmd1bWVudC4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0KTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QpOiBOZXcgZnVuY3Rpb24uCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBUYWtlIGNvbGxlY3QgYXJndW1lbnQuCi0JKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBUYWtlIGNvbGxlY3QgYXJndW1lbnQuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVuYW1lIGNvbnN0cnVjdG9yIGFyZ3VtZW50IHRvCi0JY29sbGVjdC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgTWFyIDIyIDEwOjA0OjAwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBhcmNoaXZlLmMgKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFVzZSBhcl9wYWRjaGFyCi0JZm9yIGZpcnN0IGNoYXJhY3RlciBpbiBhbiBleHRlbmRlZCBuYW1lLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBJZiBhcl9wYWRjaGFyID09ICcvJywgdGhlbiB1c2UKLQkiLy8iIGFzIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWFsIGFyY2hpdmUgbWVtYmVyIGhvbGRpbmcgdGhlCi0JZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotTW9uIE1hciAyMSAxMjoyODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlTdXBwb3J0IGZvciBsaW5rX29yZGVyIHR5cGVzIHdoaWNoIGdlbmVyYXRlIHJlbG9jcyBpbiBvcmRlciB0bwotCXN1cHBvcnQgLVVyIGluIHRoZSBsaW5rZXIuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50Ci0JZnJvbSBjYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50LgotCURvbid0IHBhc3MgYml0c2l6ZSB0byBjb25zdHJ1Y3RvciBjYWxsIGJhY2suICBQYXNzIEJGRF9SRUxPQ19DVE9SCi0JaW5zdGVhZCBvZiBiaXRzaXplIHRvIGFkZF90b19zZXQgY2FsbCBiYWNrLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIgcmVsb2NzIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIEhhbmRsZSB0aGVtIGluIGxpbmtfb3JkZXIgbG9vcC4KLQkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSWYgYSByZWxvY19saW5rX29yZGVyIGlzIHNlZW4gaGVyZSwKLQlhYm9ydC4KLQkoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbW92ZSBiaXRzaXplCi0JYXJndW1lbnQgZnJvbSBkZWNsYXJhdGlvbi4KLQkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBEZWNsYXJlLgotCShfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQgZnJvbQotCWNhbGwgdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIgcmVsb2NzIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIEhhbmRsZSB0aGVtIGFmdGVyIGhhbmRsaW5nIGFsbAotCWlucHV0IEJGRHMuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQgZnJvbQotCWNhbGwgdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQWNjb3VudCBmb3IgbGlua19vcmRlciByZWxvY3Mgd2hlbgotCWFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgSGFuZGxlIHRoZW0gaW4gbGlua19vcmRlciBsb29wLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogU2V0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGEgZGVmaW5lZAotCWxpbmtlciBjcmVhdGVkIHN5bWJvbCBiYXNlZCBvbiB0aGUgc2VjdGlvbiBpdCBpcyBpbi4gIENvcnJlY3QKLQliZmRfbGlua19oYXNoX3dlYWsgY2FzZSB0byB1c2UgLnNjIHJhdGhlciB0aGFuIC5zdC4KLQkoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlCi0JQkZEX1JFTE9DX0NUT1IuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBSZW1vdmUgdW51c2VkIGxvY2FscyBkeW5zeW0KLQlhbmQgYnVmLgotCi0JKiBjaXNjby1jb3JlLmMgKGNpc2NvX2NvcmVfZmlsZV9wKTogT25seSBwYXNzIG9uZSBhcmd1bWVudCB0bwotCWJmZF96bWFsbG9jLiAgRnJlZSBhIHBvaW50ZXIsIG5vdCBhIHVuaW9uLgotCShjaXNjb19iZmRfaXNfbG9jYWxfbGFiZWwpOiBDb3JyZWN0IGNhc3QgZnJvbSBhc2VjdGlvbiB0byBhc3ltYm9sLgotCi1TdW4gTWFyIDIwIDA5OjI0OjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQvc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IHRoaW5rbyAob2ZmIGJ5IG9uZSBlcnJvcikuCi0KLQkqIHNvbS5jIChiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBPbmx5IHRvIGRvIHRoZSB2YWx1ZQotCWNvbXBhcmlzb24gZm9yIGZ1bmN0aW9uIHN5bWJvbHMgd2l0aGluIGV4ZWN1dGFibGVzLgotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogUmVuYW1lZCBmcm9tCi0Jc29tX3NlY3Rpb25fZnJvbV9zdWJzcGFjZV9pbmRleC4gIFBhc3MgaW4gYSBuYXRpdmUgU09NIHN5bWJvbC4KLQlGb3IgZXhlY3V0YWJsZXMsIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VjdGlvbnMgdG8gZmluZCBvdXQKLQl3aGljaCBjb250YWlucyB0aGUgc3ltYm9sJ3MgYWRkcmVzcyByYXRoZXIgdGhhbiB1c2luZyB0aGUKLQlzeW1ib2xfaW5mbyBmaWVsZC4gIChzeW1ib2xfaW5mbyBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3IKLQlkeW5hbWljbHkgbGlua2VkIGV4ZWN1dGFibGVzLikKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IERvbid0IHBhc3MgYWJmZCB0bwotCWJmZF96bWFsbG9jLgotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGaXggYnJhaW5vIChvbmUgY2FsbCB0byBhbGlnbgotCXNwYWNlL3N1YnNwYWNlIGRhdGEgd2FzIGRvbmUgdW5jb25kaXRpb25hbGx5IHJhdGhlciB0aGFuCi0JanVzdCBmb3IgZXhlY3V0YWJsZXMuKQotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBBbGlnbiB0ZXh0IGluIGFsbCBleGVjdXRhYmxlcyB0bwotCW1ha2UgSFBVWCBrZXJuZWwgaGFwcHkuICBGaXhlcyBzdHJpcC9vYmpjb3B5IGZvciBzaGFyZWQKLQlleGVjdXRhYmxlcy4KLQotU2F0IE1hciAxOSAwNzowNjo1OSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogQWNjb3VudCBmb3IgYWxpZ25tZW50IG5lZWRzIG9mCi0Jc3Vic3BhY2VzIHRvbyB3aGVuIHdyaXRpbmcgZXhlY3V0YWJsZXMuICBOZXZlciByZXF1ZXN0IGEgbmVnYXRpdmUKLQlic3Mgc2l6ZS4gIEZpeGVzIHNvbWUgcHJvYmxlbXMgd2l0aCBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMsCi0Jc3RpbGwgaGF2aW5nIHByb2JsZW1zIHdpdGggcHVyZSBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIGV4ZWN1dGFibGVzLgotCi1GcmkgTWFyIDE4IDE5OjEyOjQ3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogQ2FsbCBiZmRfem1hbGxvYyBub3QKLQliZmRfemFsbG9jIGZvciByYXdwdHIsIGJlY2F1c2UgbGF0ZXIgb24gd2UgbWF5IGNhbGwgZnJlZSwgbm90Ci0JYmZkX3JlbGVhc2UsIG9uIGl0LgotCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgY2lzY29fY29yZV9zdHJ1Y3QgdG8gdGRhdGEgdW5pb24uCi0JKiBsaWJiZmQuYyAoYmZkX3JlYWQsIGJmZF9zZWVrKTogQWRkIGNvbW1lbnRzIHJlZ2FyZGluZyBlcnJvcnMuCi0JKiBjaXNjby1jb3JlLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IENoYW5nZSBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGNpc2NvX2NvcmVfdmVjLgotCSogY29uZmlnL202OGstYW91dC5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgY2lzY29fY29yZV92ZWMuCi0JKiB0YXJnZXRzLmM6IEFkZCBjaXNjb19jb3JlX3ZlYy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIE1hciAxOCAxODoxMzo0OSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KTogTmV3IHN0cnVjdHVyZQotCWNvbnRhaW5pbmcgYWxsIHRoZSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24gd2hpY2ggbmVlZHMKLQl0byBiZSBjb3BpZWQgZnJvbSBpbnB1dCBzZWN0aW9uIHRvIG91dHB1dCBzZWN0aW9uIGR1cmluZwotCW9iamNvcHkgb3Igc3RyaXAuCi0JKHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogUmVtb3ZlIHNldmVyYWwgZmllbGRzIG5vdyBpbgotCXNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0LiAgTWFrZSB0aGUgc3BhY2UgYW5kIAotCXN1YnNwYWNlIGRpY3Rpb25hcmllcyBiZSBwb2ludGVycyAodG8gc2F2ZSBzcGFjZSB3aGVuCi0Jb25seSByZWFkaW5nIG9iamVjdHMpLgotCi0JKiBzb20uYyAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogTm93IHJldHVybnMgYSBib29sZWFuOwotCXNvbWUgcmVmZXJlbmNlcyBjaGFuZ2VkLiAgQWxsb2NhdGUgYSBjb3B5YWJsZSBkYXRhIHN0dWN0dXJlIGlmCi0Jbm9uZSBleGlzdHMuICBTdG9yZSBpbmZvIGludG8gdGhlIGNvcHlhYmxlIGRhdGEgc3RydWN0dXJlLgotCShiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KLQkoc29tX2lzX3NwYWNlLCBzb21faXNfc3Vic3BhY2UsIHNvbV9pc19jb250YWluZXIpOiBOZXcgZnVuY3Rpb25zLgotCVVzZSB0aGVzZSBpbnN0ZWFkIG9mIGRpcmVjdGx5IGFjY2Vzc2luZyBwcml2YXRlIGRhdGEuCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBBbGxvY2F0ZSBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycyBoZXJlLgotCUZpbGwgaW4gc29tZSBmaWVsZHMgaW4gdGhlIHNwYWNlL3N1YnNwYWNlIGhlYWRlcnMgZnJvbSB0aGUKLQljb3B5YWJsZSBkYXRhLgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBPbmx5IGNvcHkgdGhlIHN0dWZmCi0JdGhhdCB3ZSByZWFsbHkgbmVlZCB0byBtYWtlIG9iamNvcHkgYW5kIHN0cmlwIHdvcmsuICBBbGxvY2F0ZQotCXRoZSBjb3B5X2RhdGEgc3RydWN0dXJlIGZvciB0aGUgb3V0cHV0IGJmZCBiZWZvcmUgY29weWluZy4KLQotCSogc29tLmggKHN0cnVjdCBzb21fZXhlY19kYXRhKTogTmV3IHN0cnVjdHVyZSB0byBob2xkIGV4ZWMKLQlpbmZvIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgd2hlbiBydW5uaW5nIG9iamNvcHkvc3RyaXAuCi0JKHN0cnVjdCBzb21kYXRhKTogQWRkIG5ldyAiZXhlY19kYXRhIiBmaWVsZCBhbmQgYWNjZXNzb3IKLQltYWNyby4gIEFkZCBzb21lIGNvbW1lbnRzIG9uIGhvdyB0aGUgdmFyaW91cyBmaWVsZHMgYXJlIHVzZWQuCi0JKHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogTWFrZSBpc19zcGFjZSBhbmQgaXNfc3Vic3BhY2UgYml0ZmllbGRzLgotCURlbGV0ZSB1bnVzZWQgc3Vic3BhY2VfaW5kZXguICBBbGwgcmVmZXJlbmNlcyBub3cgdXNlIHRoZQotCXRhcmdldF9pbmRleCBmaWVsZCB3aXRoaW4gdGhlIHNlY3Rpb24gc3RydWN0dXJlIGl0c2VsZi4KLQotCSogc29tLmMgKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiBEZWxldGUgdW51c2VkIGRlY2xhcmF0aW9uLgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX29iamVjdF9zZXR1cCk6IEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgc2F2ZSBleGVjIGluZm9ybWF0aW9uCi0JdGhhdCBuZWVkcyB0byBiZSBjb3BpZWQgZHVyaW5nIG9iamNvcHkvc3RyaXAuCi0JKHNvbV9ta29iamVjdCk6IERvIG5vdCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBmaWxlIGhlYWRlciBoZXJlLgotCUl0IGlzIG5vdCB1c2VkIHdoZW4gb25seSByZWFkaW5nIFNPTSBvYmplY3RzLgotCShzb21fcHJlcF9oZWFkZXJzKTogQWxsb2NhdGUgc3BhY2UgZm9yIGFuZCBhdHRhY2ggYSBmaWxlIGhlYWRlcgotCXRvIHRoZSBvdXRwdXQgYmZkLiAgRm9yIGV4ZWN1dGFibGVzLCB1c2UgdGhlIHNhdmVkIHN5c3RlbV9pZAotCXZhbHVlIHJhdGhlciB0aGFuIHRyeWluZyB0byBndWVzcyB0aGUgcmlnaHQgdmFsdWUuICBEbyBub3QgYWJvcnQKLQl3d2hlbiBzZXR0aW5nIGZpbGVfaGRyLT5lbnRyeSogZm9yIGV4ZWN1dGFibGVzLgotCShzb21fYmVnaW5fd3JpdGluZyk6IEZvciBleGVjdXRhYmxlcywgc2V0IHRoZSBleGVjX2VudHJ5IGFuZAotCWV4ZWNfZmxhZ3MgZmllbGRzLgotCShzb21fY29weV9wcml2YXRlX2JhY2tlbmRfc2VjdGlvbl9kYXRhKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCi0JKiBsaWJocHBhLmggKFBBX1BBR0VTSVpFKTogRGVmaW5lLgotCi0JKiBzb20uYyAoU09NX0FMSUdOKTogRGVmaW5lLgotCShzb21fYmVnaW5fd3JpdGluZyk6IElmIHdyaXRpbmcgYW4gZXhlY3V0YWJsZSwgaW5pdGlhbGl6ZSBhbGwKLQlmaWVsZHMgaW4gdGhlIGV4ZWMgaGVhZGVyIHRvIHplcm8uICBVcGRhdGUgZmllbGRzIGluIHRoZSBleGVjCi0JaGVhZGVyIGFzIHNpemVzIG9mIGxvYWRhYmxlIHN1YnNwYWNlcyBhcmUgY29tcHV0ZWQuICBDYXJlZnVsbHkKLQlwcmVzZXJ2ZSBhbGlnbm1lbnRzIHdoZW4gYnVpbGRpbmcgZXhlY3V0YWJsZXMuICBBY3R1YWxseSB3cml0ZSB0aGUKLQlleGVjIGFmdGVyIGFsbCB0aGUgZmllbGRzIGFyZSBmaWxsZWQgaW4uCi0KLSAgICAgICAgKiBCZXR0ZXIgbG9uZy1maWxlbmFtZSBoYW5kbGluZy4gIFJlYWRzIFNPTSBBQkkgY29tcGxpYW50IGV4dGVuZGVkCi0JbmFtZXMsIGJ1dCBkb2Vzbid0IHF1aXRlIHdyaXRlIGNvbXBsaWFudCBleHRlbmRlZCBuYW1lcyB5ZXQuCi0JKiBzb20uYyAoc29tX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWxldGUgZnVuY3Rpb24uICBUaGUKLQlnZW5lcmljIGNvZGUgd2lsbCBoYW5kbGUgdGhpbmdzIGNvcnJlY3RseS4KLQkoc29tX3NsdXJwX2FybWFwKTogU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IG1lbWJlci4KLQkobm9ybWFsaXplKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IFRha2UgdGhlIHNpemUgb2YgdGhlIGV4dGVuZGVkCi0JbmFtZSB0YWJsZSBpbnRvIGFjY291bnQgd2hlbiBjb21wdXRpbmcgdGhlIGZpbGUgb2Zmc2V0cyBpbiB0aGUKLQlTT00gZGljdGlvbmFyeS4gIE1ha2Ugc3VyZSB0byBhbGlnbiB0byBhbiBldmVuIGJvdW5kYXJ5LgotCShzb21fd3JpdGVfYXJtYXApOiBJbml0aWFsaXplIHRoZSBjaGVja3N1bSB0byB6ZXJvLgotCShhcl9tYXhjaGFycyk6IEZpeC4gIE9wcHMuCi0KLUZyaSBNYXIgMTggMjA6MzU6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAocmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1Igb24gYSA2NC1iaXQKLQltYWNoaW5lLiAgSGFuZGxlIEJGRF9SRUxPQ19TUEFSQzEzIGFuZCBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLgotCi1UaHUgTWFyIDE3IDE4OjI2OjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChCRkRfVkVSU0lPTik6IFVzZSBAVkVSU0lPTkAuCi0JKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiBSZXBsYWNlIGl0IHdpdGggY29udGVudHMgb2YgVkVSU0lPTiBmaWxlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9iZmRfaXNfbG9jYWxfbGFiZWwpOiBGaXhlZCB0eXBvIHdoZXJlCi0JdGhpcyB3YXMgYWxzbyBuYW1lZCB0cmFkX3VuaXhfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KLQotVGh1IE1hciAxNyAxMDozNzowNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCwgZWxmY29kZS5oLCBjb2ZmLWFscGhhLmMsIGJvdXQuYywgZWNvZmYuYywgZWNvZmZsaW5rLmMsCi0JZWxmMzItaHBwYS5jLCBlbGYzMi1taXBzLmMsIGxpbmtlci5jLCBzb20uYywgc3Vub3MuYzogSWYgbWFsbG9jKDApCi0JcmV0dXJucyBOVUxMLCBpdCBpcyBub3QgYW4gZXJyb3IuICBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBvZgotCXRoZXNlIGNoZWNrcyBhcmUgbm90IG5lY2Vzc2FyeSAoYmVjYXVzZSB0aGUgc2l6ZSBjYW4gbmV2ZXIgYmUKLQl6ZXJvKSwgYnV0IHB1dHRpbmcgaW4gdGhlIGNoZWNrcyBpcyB0aGUgY29uc2VydmF0aXZlIHRoaW5nIHRvIGRvCi0JaW4gbGlnaHQgb2YgdGhlIGZhY3QgdGhhdCBzb21lIG9mIHRoZXNlIG1hbGxvYyBjYWxscyByZXBsYWNlZAotCXVuY2hlY2tlZCBhbGxvY2EgY2FsbHMsIGluIHdoaWNoIGEgemVybyBhcmd1bWVudCB3b3VsZCB3b3JrIGZpbmUuCi0KLVRodSBNYXIgMTcgMTE6NDQ6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUmVtb3ZlCi0JZHVwbGljYXRlIGRlZmluaXRpb24uCi0JKG9zZl9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbCk6IERlZmluZS4KLQotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgZmFpbAotCWlmIG1hbGxvYyAoMCkgZmFpbHMuICBiZmRfY2Fub25pY2FsaXplX3JlbG9jIHJldHVybmluZyAwIGlzIG5vdCBhCi0JZmFpbHVyZSBpbmRpY2F0aW9uLCBpdCBtZXJlbHkgbWVhbnMgdGhlcmUgYXJlIG5vIHJlbG9jcy4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERvbid0IHVzZSBzcGFjZQotCWFmdGVyIE5BTUUsIHNpbmNlIFN1bk9TIC9iaW4vY2MgY2FuJ3QgaGFuZGxlIGl0LgotCi1XZWQgTWFyIDE2IDE2OjQzOjMzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbmV0YnNkMzg2LmMgKE5fU0VUX0ZMQUdTKTogRG9uJ3QgbnVrZSB0aGUgbWFjaGluZSBpZCBmaWVsZC4KLQlGcm9tIHN1a2VzQGdsdWUudW1kLmVkdSAoVGFzdWtpIEhpcmF0YSkuCi0KLVdlZCBNYXIgMTYgMDc6NTU6NTQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oICg0IHBsYWNlcyk6IFVzZSBhIHNpbXBsZSAjaWYgb24gQVJDSF9TSVpFLCByYXRoZXIgdGhhbgotCWFsbCB0aGF0IGNvbnZvbHV0ZWQgc3R1ZmYgd2l0aCBOQU1FLCBDQVQzLCBldGMuICBUaGUgY29udm9sdXRlZAotCXN0dWZmIGJyb2tlIGZvciBTdW5PUzQgL2Jpbi9jYyAoZHVlIHRvIERFRlVOIGVsaW1pbmF0aW9uLCBJIGd1ZXNzKS4KLQotV2VkIE1hciAxNiAwMDowMjowNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBEZXRlY3Qgc2VjdGlvbiBzeW1ib2xzIGJhc2VkCi0Jb24gZWl0aGVyIHRoZSBsYWNrIG9mIHByaXZhdGUgZGF0YSBvciB0aGUgc3ltYm9sIGZsYWdzLiAgRG8gbm90Ci0JbXVuZ2Ugc2VjdGlvbiBzeW1ib2wgbmFtZXMgYW55bW9yZSAtLSB0aGV5IG5vIGxvbmdlciBjb25mdXNlIEdEQi4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBMZWF2ZSBzcGFjZSBmb3IgYW4gZXhlYyBoZWFkZXIgaWYgd3JpdGluZwotCWFuIGV4ZWN1dGFibGUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBSZWNvZ25pemUgYm90aCBmb3JtcyBvZiBzZWN0aW9uIHN5bWJvbAotCW5hbWVzICJMJDBcMDAyIiBhbmQgIiQ8Rk9PPiQiLiAgQ2hhbmdlIHRoZSBuYW1lIG9mICJMJDBcMDAyIgotCXNlY3Rpb24gc3ltYm9scyB0byBiZSB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiB0aGV5IHJlcHJlc2VudC4KLQlEZWJ1Z2dpbmcgIHN5bWJvbHMgYmVnaW4gd2l0aCAiTCQwXDAwMSIsIG5vdCBqdXN0ICJMJCIuCi0KLVR1ZSBNYXIgMTUgMjI6NTg6MjggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmgsIGxpYmNvZmYuaDogUmVidWlsdC4KLQotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBBZGQgbmV3IGVudHJpZXMgdG8gdGhlIGp1bXAgdGFibGUKLQlmb3IgYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsCi0JYW5kIGJmZF9pc19sb2NhbF9sYWJlbC4KLQotCSogdGFyZ2V0cy5jOiBBZGQgbmV3IGVudHJpZXMgdG8gdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlLgotCQotCSogYmZkLmMgKGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZGVmaW5pdGlvbi4KLQotCSogc2VjdGlvbi5jIChiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBkZWZpbml0aW9uLgotCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IE5ldyBkZWZpbml0aW9uLgotCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgotCi0JKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0KLQkqICotY29yZS5jOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIG5ldyBmdW5jdGlvbnMgaW4KLQl0aGUgdGFyZ2V0IHZlY3RvciB3aGljaCBhbGwgcG9pbnQgdG8gYmZkX2ZhbHNlLgotCi0JKiBhb3V0LXRhcmdldC5oLCBjb2ZmY29kZS5oLCBlbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCwgaWVlZS5jCi0JbGliYW91dC5oLCBsaWJlY29mZi5oLCBubG0tdGFyZ2V0LmgsIG9hc3lzLmMsIHNyZWMuYywgdGVraGV4LmMKLQlEZWZhdWx0IG5ldyB2ZWN0b3JzIGZvciBjb3B5aW5nIHByaXZhdGUgYmFja2VuZCBkYXRhIHRvIGJmZF90cnVlLgotCURlZmF1bHQgbmV3IHZlY3RvciBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBzeW1ib2wgaXMgYSBsb2NhbCBsYWJlbAotCXRvIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsLgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEZvciBub3cgZGVmYXVsdCB0byBiZmRfdHJ1ZS4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIE1hciAxNSAyMzo1NTo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNmLW02OGtseW54LmMgKENBTENfQURERU5EKTogVXNlIF9iZmRfbTY4a2x5bnhfaG93dG9fdGFibGUuCi0KLVR1ZSBNYXIgMTUgMDQ6NDE6MTMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNb3N0IGZpbGVzOgotCVJlcGxhY2UgREVGVU4gYW5kIERFRlVOX1ZPSUQgd2l0aCBLJlItc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLQlJbmRlbnQgc29tZSBvZiB0aGVtIHRvIEdOVSBzdGFuZGFyZHMuCi0KLQkqIGFvdXQzMi5jLCBhcmNodXJlcy5jLCBjb3JlLmMsIGNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLAotCWNwdS1tNjhrLmMsIGNwdS1tODhrLmMsIGNwdS1taXBzLmMsIGNwdS12YXguYywgY3Rvci5jLCBkZW1vNjQuYywKLQllbGYzMi1ocHBhLmgsIGdlbi1hb3V0LmMsIGhvc3QtYW91dC5jLCBpbml0LmMsIGxpYmhwcGEuaCwKLQlsaWJpZWVlLmgsIGxpYm9hc3lzLmgsIG5ld3NvczMuYywgc29tLmgsIHN0YWItc3ltcy5jLCBzdW5vcy5jOgotCVVwZGF0ZSBjb3B5cmlnaHQgeWVhcnMuCi0KLU1vbiBNYXIgMTQgMTE6NDE6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogQSByZWxvY2F0aW9uIGludm9sdmluZyB0aGUgc2VjdGlvbgotCXN5bWJvbCBmb3IgdGhlICpBQlMqIHNlY3Rpb24gaXMgcmVhbGx5IGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcKLQlubyBzeW1ib2wuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBEbyBub3Qgc2V0IEJTRl9HTE9CQUwgb3IgQlNGX0VYUE9SVCBmb3IKLQl1bmRlZmluZWQgc3ltYm9scy4gIENvcnJlY3RseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRlYnVnZ2VyIHN5bWJvbHMKLQlhbmQgc2VjdGlvbiBzeW1ib2xzLgotCi0JKiBzb20gKHNldHVwX3NlY3Rpb25zKTogU2V0IFNFQ19ERUJVR0dJTkcgYW5kIHRoZSBzZWN0aW9uIGF0dHJpYnV0ZXMKLQlmb3Igc3BhY2VzIGFuZCBzdWJzcGFjZXMuCi0KLQkqIHNvbS5jIChzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMpOiBGaXggdHlwby4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBTZXQgRVhFQ19QLCBEX1BBR0VELCBXUF9URVhULCBhbmQKLQlIQVNfUkVMT0MgYmFzZWQgb24gdGhlIG9iamVjdCdzIG1hZ2ljIG51bWJlci4KLQkobWFrZV91bmlxdWVfc2VjdGlvbik6IERlbGV0ZSBmdW5jdGlvbi4gIEJGRCBhbmQgaXRzIHVzZXJzIGFyZQotCXByZXBhcmVkIHRvIGhhbmRsZSBtdWx0aXBsZSBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuCi0JKHNldHVwX3NlY3Rpb25zKTogQWxsb2NhdGUgc3BhY2Ugb24gdGhlIEJGRCdzIG9ic3RhY2sgdG8gaG9sZAotCXNlY3Rpb24gbmFtZXMuICBVc2UgYmZkX21ha2Vfc2V0aW9uX2FueXdheSByYXRoZXIgdGhhbiB0aGUKLQlvYnNvbGV0ZSBtYWtlX3VuaXF1ZV9zZWN0aW9uLgotCShzb21fcHJlcF9oZWFkZXJzKTogQ2hvb3NlIHRoZSBjb3JyZWN0IFNPTSBtYWdpYyBudW1iZXIgYmFzZWQKLQlvbiB0aGUgQkZEJ3MgZmxhZ3MuCi0JKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogUmV0dXJuIGZhbHNlLCBub3QgTlVMTCBvbiBlcnJvci4KLQotU2F0IE1hciAxMiAwOTo0NjowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXBwYy5jOiBSZW5hbWVkIGZyb20gZWxmMzItcG93ZXJwYy5jLgotCSogbmxtMzItcHBjLmM6IFJlbmFtZWQgZnJvbSBubG0zMi1wb3dlcnBjLmMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLUZyaSBNYXIgMTEgMjI6Mjc6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1wb3dlcnBjLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHVwZGF0ZSB0byBwcmVsaW1pbmFyeSBBQkkuCi0KLUZyaSBNYXIgMTEgMDA6MzQ6NTkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6ICBBc3N1bWUgdGhhdCBkeW5hbWljIGluZm8KLQlpcyBhbHdheXMgbG9jYXRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VjdGlvbiB0byBhbGxvdwotCXJlY292ZXJ5IG9mIHRoZSBkeW5hbWljIGluZm8gZnJvbSBhIHN0cmlwcGVkIGV4ZWN1dGFibGUuCi0JKiBlY29mZi5jIChlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6ICBIYW5kbGUgU1RZUF9QREFUQSwgU1RZUF9YREFUQQotCWFuZCBTVFlQX0NPTU1FTlQuCi0KLVdlZCBNYXIgIDkgMTc6MTc6NTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oOiBSZW1vdmUgYWxsb2NhIGNydWZ0LiAgSXQgd2FzIG1pc3Npbmcgc29tZSBuZWNlc3NhcnkKLQljcnVmdCAobGlrZSB0aGUgI3ByYWdtYSBhbGxvY2EgZm9yIEFJWCkuCi0JSW4gYWRkaXRpb24gdG8gdGhhdCBwcm9ibGVtLCB0aGUgQyBhbGxvY2EgY2FsbHMgeG1hbGxvYywgd2hpY2gKLQltZWFucyBjaGVja2luZyBmb3IgYmVpbmcgb3V0IG9mIG1lbW9yeSBjYW4ndCB3b3JrIHJpZ2h0LiAgVGhlCi0JZm9sbG93aW5nIGNoYW5nZXMgcmVtb3ZlIGFsbCB1c2VzIG9mIGFsbG9jYSBmcm9tIEJGRC4KLQkqIGhvc3RzL3NvbGFyaXMyLmg6IFJlbW92ZSBhbGxvY2EgY3J1ZnQuCi0JKiBzb20uYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBhIGZpeGVkIHNpemUgYXV0byBhcnJheS4KLQkqIGFvdXR4LmgsIGVsZmNvZGUuaCwgbmxtY29kZS5oLCBib3V0LmMsIGNvZmYtYWxwaGEuYywgZWNvZmYuYywKLQllY29mZmxpbmsuYywgZWxmMzItaHBwYS5jLCBlbGYzMi1taXBzLmMsIGxpbmtlci5jLCByZWxvYy5jLCBzb20uYywKLQlzdW5vcy5jOiBSZXBsYWNlIGFsbG9jYSB3aXRoIG1hbGxvYyBhbmQgYXBwcm9wcmlhdGUgZXJyb3IgY2hlY2tpbmcgYW5kCi0JZnJlZWluZy4KLQkqIGxpbmtlci5jOiBSZXBsYWNlIGFsbG9jYSB3aXRoIG9ic3RhY2tfYWxsb2MuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIE1hciAgOCAxMjoxMDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgTUlQU19SX0xJVEVSQUwgbGlrZQotCU1JUFNfUl9HUFJFTC4KLQotU2F0IE1hciAgNSAxNDowODo1NCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZjMyLWhwcGEuaCwgZWxmY29kZS5oOiAgUmVwbGFjZSB1c2VzIG9mIEVsZipfSGFsZiwgRWxmKl9Xb3JkLAotCUVsZipfT2ZmIHR5cGVkZWZzIGJ5IHRoZWlyIGV4cGFuc2lvbiwgdGhlIHR5cGVkZWZzIGhhdmUgYmVlbgotCXJlbW92ZWQgZnJvbSBpbmNsdWRlL2VsZi9pbnRlcm5hbC5oLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgSGFuZGxlIFNIVF9EWU5BTUlDIHNlY3Rpb24gbGlrZQotCVNIVF9QUk9HQklUUyBzZWN0aW9uLgotCi1UaHUgTWFyICAzIDIwOjAzOjM5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoX1BBX1JJU0NfSUQpOiBUcmVhdCBIT1NUX0hQUEFPU0YganVzdCBsaWtlIEhPU1RfSFBQQUJTRC4KLQotV2VkIE1hciAgMiAxMzoyODowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBpWzM0XTg2LXNlcXVlbnQtKi4KLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IEEgbm9uLXplcm8sIG5vdCB6ZXJvLAotCXJldHVybiBmcm9tIGJmZF9zZWVrIGluZGljYXRlcyBhbiBlcnJvci4KLQlOZXcgbWFjcm8gVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFIHRvIHJlcGxhY2UKLQlUUkFEX0NPUkVfU1RBQ0tfT0ZGU0VULgotCSogaG9zdHMvc3ltbWV0cnkuaDogRGVmaW5lIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRSBhbmQKLQlUUkFEX0NPUkVfVVNFUl9PRkZTRVQgYnV0IG5vdCBIT1NUX1NUQUNLX09GRlNFVC4KLQotV2VkIE1hciAgMiAxMTo1NzowMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLltjaF06IERvIG5vdCBpbmNsdWRlIGxpYmhwcGEuaCBpbiBzb20uYywgaW5zdGVhZCBpbmNsdWRlCi0JaXQgaW4gc29tLmguCi0KLQkqIGVsZjMyLWhwcGEuW2NoXTogRG8gbm90IGluY2x1ZGUgbGliaHBwYS5oIGluIGVsZjMyLWhwcGEuYywgaW5zdGVhZAotCWluY2x1ZGUgaXQgaW4gZWxmMzItaHBwYS5oLgotCi0JKiBzb20uYyAobG9nMik6IFJldHVybiAtMSBvbiBlcnJvciByYXRoZXIgdGhhbiBhYm9ydGluZy4KLQkoc2V0dXBfc2VjdGlvbnMpOiBCdWJibGUgdXAgYW4gZXJyb3IgZnJvbSBsb2cyLgotCi0JKiBDaGFuZ2VzIHRvIG1ha2UgSFAgQyBjb21waWxlciBoYXBweSBpbiBib3RoIHRyYWRpdGlvbmFsCi0JYW5kIEFOU0kgbW9kZS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IFVzZSBjb3JyZWN0IGVudW0gdHlwZSBmb3IKLQlmaWVsZCBwYXJhbWV0ZXIuCi0JKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IFVzZSB1bnNpZ25lZCBpbnQgcmF0aGVyIHRoYW4KLQl1bnNpZ25lZCBjaGFyIHRvIGF2b2lkIEdOVS1DIGV4dGVuc2lvbnMuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBSZXR1cm4gYSBib29sZWFuIHRvIGluZGljYXRlIHN1Y2Nlc3MKLQlvciBmYWlsdXJlIHJhdGhlciB0aGFuIGFib3J0aW5nIG9uIGZhaWx1cmUuCi0KLQkqIHNvbS5oIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBGaXggcHJvdG90eXBlIHRvIG1hdGNoCi0Jc29tLmMgY2hhbmdlcy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IEFkZCBwcm90b3R5cGUuCi0JKGhwcGFfc29tLWdlbl9yZWxvY190eXBlKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLWhwcGEuYzogQWRkIGEgY291cGxlIGNhc3RzIHRvIG1ha2UgSFAgY29tcGlsZXIgaGFwcHkuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERvIG5vdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQotCXVudGlsIHJlc3Qgb2YgY29kZSBpcyByZWFkeSB0byBoYW5kbGUgaXQuICBBYm9ydCBmb3Igbm93LgotCi1UdWUgTWFyICAxIDE4OjMzOjU5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVR1ZSBNYXIgIDEgMTM6MDY6NTMgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogaTM4Nm9zOWsuYzogdXNlIG5ldyBmdW5jdGlvbnMgYmZkX3NldF9lcnJvciBhbmQgYmZkX2dldF9lcnJvci4KLQkqIE1ha2VmaWxlLmluOiBkZWxldGUgYW4gZXh0cmEgYmxhbmsuCi0JKiBjb25maWd1cmUuaW4gOiBBZGQgaTM5Nm9zOWtfdmVjLgotCi1Nb24gRmViIDI4IDE1OjQxOjAxIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgOiBBZGQgaTM4Ni1vczlrLgotCSogY29uZmlnL2kzODYtb3M5ay5tdCA6IE5ld2x5IGFkZCBvczlrIHRhcmdldCBtYWtlZmlsZS4KLQotCSogaTM4Nm9zOWsuYyA6IG5ldyBmaWxlIHRvIGhhbmRsZSBvczlrIGZvcm1hdCBiZmQuCi0JKiBNYWtlZmlsZS5pbiA6IEhhbmRsZSBuZXcgZmlsZSBpMzg2b3M5ay5jCi0JKiB0YXJnZXRzLmMgOiBBZGQgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIgYW5kIGkzODZvczlrX3ZlYy4KLQkqIGNhY2hlLmMgOiBJbml0aWFsaXplIGNhY2hlX3NlbnRpbmVsIHRvIDAuCi0KLVN1biBGZWIgMjcgMTY6MzA6NTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAobWlzbWF0Y2hlcywgcmV0dmFsX21pc21hdGNoZXMpOiBGaXggbWlzbWF0Y2gKLQlhY3Rpb24gaW4gY2FzZSB3aGVyZSBjYWxsZXIgc3BlY2lmaWVkIG5vIGFyZ3VtZW50IHJlbG9jYXRpb24uCi0JKGhwcGFfZWxmX2J1aWxkX2xpbmtlcl9zdHViKTogVHJ5IGFnYWluIHRvIGdldCB0aGUgc3ltX3B0cl9wdHIKLQlyaWdodCBpbiB0aGUgb3JpZ2luYWwgcmVsb2NhdGlvbiBhbmQgdGhlIHN0dWIncyByZWxvY2F0aW9uLgotCi0gICAgICAgICogZWxmMzItaHBwYS5oIChocHBhX2xvb2tfZm9yX3N0dWJfaW5fc2VjdGlvbik6IEZpeCB0eXBvLiAgRGVsZXRlCi0JdW51c2VkIHN5bWJvbHMgYXJndW1lbnQuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IEFjY2VwdCBhc3ltYm9sICoqIHJhdGhlcgotCXRoYW4gYXN5bWJvbCAqIGZvciBvcmlnaW5hbCB0YXJnZXQgc3ltYm9sLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQlTZXQgcmVsb2MtPnN5bV9wdHJfcHRyIGFwcHJvcHJpYXRlbHkuCi0JKGhwcGFfZWxmX2J1aWxkX2xpbmtlcl9zdHViKTogU2V0IHJlbG9jLT5zeW1fcHRyX3B0ciBjb3JyZWN0bHkuCi0JKGhwcGFfZWxmX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBObyBsb25nZXIgbmVlZCBzeW1ib2xzCi0JYXJndW1lbnQuICBVc2UgdGhlIG91dHB1dCBzeW1ib2xzIHdoZW4gY2Fub25pY2FsaXppbmcgdGhlIHJlbG9jcywKLQljcmVhdGluZyB0aGVtIGlmIG5lY2Vzc2FyeS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogRG8gbm90Ci0JcmVidWlsZC9jbG9iYmVyIHRoZSBvdXRwdXQgc3ltYm9scyBpZiB0aGV5IGFscmVhZHkgZXhpc3QuCi0KLVN1biBGZWIgMjcgMTU6MjI6MzYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKEJGRF9TRU5ELCBCRkRfU0VORF9GTVQpOiBBZGQgZGVidWdnaW5nIHZlcnNpb25zIHRoYXQKLQljaGVjayBhbGwgdGhlIHBvaW50ZXIgZGVyZWZlcmVuY2VzLiAgRW5hYmxlZCB2aWEgREVCVUdfQkZEX1NFTkQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIHNyZWMuYyAoaGV4X3ZhbHVlKTogQWx3YXlzIHNldCB0byBhIHNpemUgb2YgMjU2IGJ5dGVzLgotCShzcmVjX2luaXQpOiBDb3NtZXRpYyBjaGFuZ2VzLgotCi1TdW4gRmViIDI3IDExOjE4OjQ3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmM6IFNlY29uZCBoYWxmIG9mIG1ham9yIGNsZWFudXAuICBNb3JlIGNvbW1lbnRzLAotCVBBUkFNaXplIGFuZCBzdGF0aWNpemUgcmVzdCBvZiBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkCi0JZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZC91bm5lY2Vzc2FyeSBhcmd1bWVudHMgdG8gc29tZSBmdW5jdGlvbnMuCi0JR3JvdXAgc3RhdGljIHZhcnMgdG9nZXRoZXIuICBBYm9ydCBmb3IgYmFkIGVycm9ycyB1bnRpbCB3ZSBoYXZlCi0JZXJyb3IgY29kZSBwcm9wb2dhdGlvbiB3b3JraW5nLiAgV29yayBvbiBzcGFjaW5nIGFuZCBpbmRlbnRpb24uCi0JQWRkIEZJWE1FcyBmb3IgdW5yZXNvbHZlZCBwcm9ibGVtcy4gIFVzZSBlbnVtcyByYXRoZXIgdGhhbgotCSNkZWZpbmVzIGZvciBsb3RzIG9mIHRoaW5ncy4gIE1lcmdlIHR3byBmdW5jdGlvbnMgd2hpY2ggYnVpbGQKLQlsaW5rZXIgc3R1YnMgaW50byBhIHNpbmdsZSBmdW5jdGlvbiAoc28gdGhleSBjYW4gZWFzaWx5IHNoYXJlIGEKLQl0b24gb2YgY29tbW9uIGNvZGUpLgotCi1TYXQgRmViIDI2IDEwOjAwOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IEFkanVzdCBoYW5kbGluZyBvZiBvdmVyZmxvdyB0bwotCWF2b2lkIGRlcGVuZGluZyB1cG9uIHJpZ2h0IHNoaWZ0cyBvZiBzaWduZWQgbnVtYmVycywgYW5kIHRvCi0JY29ycmVjdCBoYW5kbGluZyBvZiBzcmNfbWFzayB3aXRoIGxvd2VyIGJpdHMgemVyby4KLQotCSogYW91dHguaCwgYXJjaGl2ZS5jOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgotCSogZWNvZmYuYywgZWNvZmZsaW5rLmMsIGVjb2Zmc3dhcC5oLCBzcmVjLmM6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFrZSBpIHVuc2lnbmVkOyByZW1vdmUgb2xkCi0JI2lmIDAgY29kZS4KLQkoZWxmX3dyaXRlX3BoZHJzKTogTWFrZSBpIHVuc2lnbmVkLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IE1ha2UgaSBhbmQgbl9sZWZ0IHVuc2lnbmVkLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IE1ha2UgaSB1bnNpZ25lZC4KLQkod3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBNYWtlIGNvdW50IHVuc2lnbmVkLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IE1ha2UgaSB1bnNpZ25lZC4KLQkoTkFNRShiZmQsZWxmX3dyaXRlX29iamVjdF9jb250ZW50cykpOiBNYWtlIGNvdW50IHVuc2lnbmVkLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogTWFrZSBpbmRleCBhcmd1bWVudCB1bnNpZ25lZC4KLQotRnJpIEZlYiAyNSAyMTozNDo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogRG9uJ3QgaW5jbHVkZSBhc3NlcnQuaC4KLQkoc3dhcF9vdXRfc3ltcyk6IFVzZSBCRkRfQVNTRVJUIHJhdGhlciB0aGFuIGFzc2VydC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBBZGQgbWlzc2luZwotCWJyZWFrIGluIHN3aXRjaC4KLQotCSogaG9zdHMvaTM4NnY0LmggKHFzb3J0LCBzdHJ0b2wpOiBSZW1vdmUgaW5jb3JyZWN0IGFuZCB1c2VsZXNzCi0JZGVjbGFyYXRpb25zLgotCi1GcmkgRmViIDI1IDE2OjM1OjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJocHBhLmggKGhwcGFfcmVidWlsZF9pbnNuKTogTW92ZWQgaGVyZSBmcm9tIGVsZjMyLWhwcGEuYy4KLQotCSogZWxmMzItaHBwYS5oIChlbGZfaHBwYV90Y19zeW1ib2wpOiBBZGQgbmV3IGFyZ3VtZW50cy4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogQWRkIGV4dGVybiBkZWNsLgotCi0JKiBlbGYzMi1ocHBhLmM6IEZpcnN0IGhhbGYgb2YgbWFqb3IgY2xlYW51cC4gIEFkZC9jbGVhbnVwIGxvdHMgb2YKLQljb21tZW50cy4gIFBBUkFNaXplIHNvbWUgc3RhdGljIGZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQgZnVuY3Rpb25zLgotCURlbGV0ZSB1bnVzZWQvdW5uZWNlc3NhcnkgYXJndW1lbnRzIHRvIG1hbnkgZnVuY3Rpb25zLiAgR3JvdXAKLQlzdGF0aWMgdmFycyB0b2dldGhlci4gIENvbGxhcHNlIGNvbW1vbiBjYXNlIHN0YXRlbWVudHMgdG9nZXRoZXIKLQlpbiBtYW55IHBsYWNlcy4gIFVzZSBkZWZhdWx0IGNhc2Ugd2hlbiBwb3NzaWJsZSBpbnN0ZWFkIG9mIGxpc3RpbmcKLQllYWNoIGNhc2Ugc2VwYXJhdGVseS4gIEFib3J0IGZvciBiYWQgZXJyb3JzIHVudGlsIHdlIGdldCBlcnJvcgotCWNvZGUgcHJvcG9nYXRpb24gd29ya2luZy4gIFdvcmsgb24gc3BhY2luZyBhbmQgaW5kZW50aW9uIHByb2JsZW1zLgotCUFkZCBGSVhNRXMgZm9yIHNvbWUgdW5yZXNvbHZlZCBwcm9ibGVtcy4gIERlbGV0ZSBob3BlbGVzc2x5IGJyb2tlbiAKLQlDT01QTEVYIHJlbG9jYXRpb24gc3VwcG9ydCAoaXQncyBuZXZlciB1c2VkIGFueXdheSkuCi0JKGhwcGFfZWxmX3JlYnVpbGRfaW5zbik6IERlbGV0ZS4gIE1vdmVkIGludG8gbGliaHBwYS5oLgotCShlbGZfaHBwYV90Y19zeW1ib2wpOiBBY2NlcHQgYW5kIHVzZSBuZXcgYXJndW1lbnRzIChzeW1leHQgY2hhaW5zKS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogSW5pdGlhbGl6ZSBtYXRjaGluZ192ZWN0b3IKLQl0byBrZWVwIGdjYyAtV2FsbCBxdWlldC4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogRml4IHR5cG8uCi0KLQkqIHNvbS5jIChzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFVzZSAic2l6ZW9mIChhc3ltYm9sICopIgotCW5vdCAic2l6ZW9mIChzb21fc3ltYm9sX3R5cGUgKikiLgotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogVXNlICJzaXplb2YgKGFzeW1ib2wgKikiCi0Jbm90ICJzaXplb2YgKGFzeW1ib2wiKS4gIE9wcHMuCi0KLUZyaSBGZWIgMjUgMTM6MTk6MDQgMTk5NCAgVGVkIExlbW9uICAobWVsbG9uQHBlcHBlci5uY2QuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplKTogQ2FuJ3QgcmV0dXJuIGdwIHZhbHVlIG9uIGFuIGFyY2hpdmUuCi0JKGJmZF9zZXRfZ3Bfc2l6ZSk6ICBDYW4ndCBzZXQgZ3AgdmFsdWUgb24gYW4gYXJjaGl2ZS4KLQotRnJpIEZlYiAyNSAxMjo1NzowMCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHBhc3Nfb3Zlcik6IERvbid0IHNraXAgdG9vIG1hbnkgY2hhcmFjdGVycyB3aGVuCi0JZW5kIG9mIGxpbmUgc2Vlbi4KLQotRnJpIEZlYiAyNSAxMTo0MTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NpemVvZl9oZWFkZXJzKTogQWxpZ24gcmVzdWx0IHRvIDE2IGJ5dGUKLQlib3VuZGFyeS4KLQotVGh1IEZlYiAyNCAwNzoxMzoyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBEZXJpdmUgc3ltYm9sX2luZm8KLQlmaWVsZCBmb3IgYWJzb2x1dGUgc3ltYm9scyBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdW5kZWZpbmVkCi0JYW5kIGNvbW1vbiBzeW1ib2xzLgotCi1UaHUgRmViIDI0IDA0OjI5OjE5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29kZS5oIChlbGZfY29yZV9maWxlX3ApOiAgQ2hlY2sgZm9yIGNvcmUgZmlsZSBlX21hY2hpbmUgbWF0Y2gKLQlsaWtlIGluIGVsZl9vYmplY3RfcC4KLQotV2VkIEZlYiAyMyAxODoyODozNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oIChhbGxvY2EpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogVXNlIENQVV9QQV9SSVNDMV8wIGZvciBtYWdpYwotCW51bWJlciByYXRoZXIgdGhhbiBIUDkwMDBTODAwX0lELiAgTm90ZSBzb20uYyBpcyBjYXJlZnVsCi0JdG8gbWFrZSBzdXJlIENQVV9QQV9SSVNDMV8wIGlzIGFsd2F5cyBkZWZpbmVkLgotCi1Nb24gRmViIDIxIDEwOjEyOjAyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRhcmdldHMubywgYXJjaHVyZXMubyk6IFVzZSBBTExfQ0ZMQUdTIHRvIHN1cHBseQotCWZsYWdzIHRvIGV4cGxpY2l0IGNvbXBpbGUgYWN0aW9ucy4KLQotTW9uIEZlYiAyMSAwOTo1MDowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX3dyaXRlX3N5bWhkcik6IFNldCBzeW1oZHItPm1hZ2ljIGhlcmUuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYWtlIHN1cmUgLmJzcyBzZWN0aW9uCi0JZW5kcyBvbiBhIHBhZ2UgYm91bmRhcnkgaWYgdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCBzeW1oZHItPm1hZ2ljIGhlcmUuCi0KLQkqIGhvc3RzL2hwMzAwLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPjsgZG9uJ3QgZGVjbGFyZSBmcmVlLgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzKTogVXNlIGEgcG9pbnRlciBhbmQgYWxsb2NhCi0JcmF0aGVyIHRoYW4gYW4gYXJyYXkgb2YgdmFyaWFibGUgc2l6ZS4KLQkoc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBMaWtld2lzZS4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogUmV3cml0ZSBtYXNrIGFuZCBzaGlmdAotCW9wZXJhdGlvbiB0byBhdm9pZCBPU0YgMS4zIGNjIGJ1Zy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1ha2UgdGV4dF9zaXplLCBkYXRhX3NpemUKLQlhbmQgYnNzX3NpemUgYmZkX3NpemVfdHlwZSBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuICBNYWtlCi0JdGV4dF9zdGFydCBhbmQgZGF0YV9zdGFydCBiZmRfdm1hIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4KLQkqIGVjb2ZmbGluay5jIChlY29mZl9hZGRfc3RyaW5nKTogUmVtb3ZlIGluY29ycmVjdCBjYXN0IG9mIHJldHVybgotCXZhbHVlLgotCi1TdW4gRmViIDIwIDE2OjA2OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IENvbnNpZGVyCi0Jc3ltYm9scyBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGFyY2hpdmUgbWFwLgotCi1TYXQgRmViIDE5IDAzOjE3OjMyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29mZi1hbHBoYS5jIChyZWxvY19uaWwpOiAgQWRkIGZvcndhcmQgZGVjbGFyYXRpb24sIGFkZCBtaXNzaW5nCi0JZXJyb3JfbWVzc2FnZSBhcmd1bWVudC4KLQkqIGNvZmYtc3BhcmMuYyAoYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyk6ICBBZGQgZm9yd2FyZCBkZWNsYXJhdGlvbiwKLQlhZGQgbWlzc2luZyBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50LgotCSogbWlwc2JzZC5jIChtaXBzX2ZpeF9oaTE2X3MpOiAgQWRkIGZvcndhcmQgZGVjbGFyYXRpb24sIGFkZCBtaXNzaW5nCi0JZXJyb3JfbWVzc2FnZSBhcmd1bWVudC4KLQotRnJpIEZlYiAxOCAxMTo0MTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlTdXBwb3J0IGZvciBQb3dlclBDIE5ldFdhcmUuCi0JKiBubG0zMi1wb3dlcnBjLmM6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLW5ldHdhcmUqKTogTmV3IHRhcmdldDsgdXNlIHBwYy1ubG0uCi0JKiBjb25maWcvcHBjLW5sbS5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKG5sbTMyX3Bvd2VycGNfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3I7IHVzZQotCW5sbTMyLXBvd2VycGMubywgbmxtMzIubywgbmxtLm8uCi0JKiB0YXJnZXRzLmMgKG5sbTMyX3Bvd2VycGNfdmVjKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBubG0zMi1wb3dlcnBjLm8uCi0JKENGSUxFUyk6IEFkZCBubG0zMi1wb3dlcnBjLmMuCi0KLQlJbml0aWFsIHN1cHBvcnQgZm9yIFBvd2VyUEMgRUxGLiAgRG9uZSB3aXRob3V0IGFuIEFCSSwgYW5kCi0JcHJvYmFibHkgdG8gYmUgY2hhbmdlZCB3aGVuIEkgZ2V0IGFuIEFCSS4KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1zeXN2NCopOiBOZXcgdGFyZ2V0OyB1c2UgcHBjLWVsZi4KLQkqIGNvbmZpZy9wcGMtZWxmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3Bvd2VycGNfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3I7IHVzZQotCWVsZjMyLXBvd2VycGMubywgZWxmMzIubywgZWxmLm8uCi0JKiBlbGYzMi1wb3dlcnBjLmM6IE5ldyBmaWxlLgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBBZGQgYmZkX2FyY2hfcG93ZXJwYyBjYXNlLgotCShlbGZfc2V0X2FyY2hfbWFjaCk6IExpa2V3aXNlLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfcG93ZXJwY192ZWMpOiBEZWNsYXJlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLXBvd2VycGMuby4KLQkoQ0ZJTEVTKTogQWRkIGVsZjMyLXBvd2VycGMuYy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotVGh1IEZlYiAxNyAxNToyOTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9saW5lbnVtYmVycyk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSGFuZGxlIHplcm8gc3ltYm9scwotCXJlYXNvbmFibHkuICBBbGxvY2F0ZSB4X3N5bXAgdXNpbmcgYWxsb2NhLgotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogRUxGIHByb2dyYW0gaGVhZGVyIGVudHJpZXMKLQltdXN0IGJlIHNvcnRlZCBieSBsb2FkIGFkZHJlc3MuICBUaGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGVudHJpZXMKLQlpbiByZXZlcnNlIG9yZGVyLgotCi0JKiBzZWN0aW9uLmMgKFNFQ19JTl9NRU1PUlkpOiBEZWZpbmUuCi0JKGFzZWN0aW9uKTogUmVuYW1lIHVudXNlZCBmaWVsZCBvdGhlcnVzZXJkYXRhIHRvIGNvbnRlbnRzLCBhbmQKLQltYWtlIGl0IGNoYXIgKi4KLQkoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBJbml0aWFsaXplIGNvbnRlbnRzIGZpZWxkIHRvIE5VTEwuCi0JKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IElmIFNFQ19JTl9NRU1PUlkgaXMgc2V0LCBnZXQgc2VjdGlvbgotCWNvbnRlbnRzIGZyb20gY29udGVudHMgZmllbGQgcmF0aGVyIHRoYW4gZnJvbSBmaWxlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1UaHUgRmViIDE3IDA4OjMwOjUzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfZXJyb3IsIGJmZF9zZXRfZXJyb3IpOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfZXJyb3IpOiBNYWtlIHN0YXRpYy4KLQkoYmZkX2Vycm9yX3R5cGUpOiBSZW5hbWVkIGZyb20gYmZkX2VjLiAgUHJlcGVuZCAiYmZkX2Vycm9yXyIgdG8KLQlhbGwgdmFsdWVzLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtYWRvYmUuYywgYW91dC1lbmNhcC5jLCBhb3V0LXRhcmdldC5oLCAKLQlhb3V0ZjEuaCwgYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCAKLQliZmQuYywgYm91dC5jLCBjYWNoZS5jLCBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLCAKLQljb2ZmLXJzNjAwMC5jLCBjb2ZmY29kZS5oLCBjb2ZmZ2VuLmMsIGNvcmUuYywgY3Rvci5jLCAKLQllY29mZi5jLCBlY29mZmxpbmsuYywgZWxmLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCAKLQllbGZjb2RlLmgsIGZvcm1hdC5jLCBoYXNoLmMsIGhwMzAwaHB1eC5jLCBocHBhYnNkLWNvcmUuYywgCi0JaTM4Nmx5bnguYywgaWVlZS5jLCBsaWJiZmQuYywgbGliZWxmLmgsIGxpbmtlci5jLCAKLQlseW54LWNvcmUuYywgbmxtLmMsIG5sbTMyLWFscGhhLmMsIG5sbTMyLWkzODYuYywgCi0JbmxtMzItc3BhcmMuYywgbmxtY29kZS5oLCBvYXN5cy5jLCBvcG5jbHMuYywgb3NmLWNvcmUuYywgCi0JcHRyYWNlLWNvcmUuYywgcmVsb2MxNi5jLCByczYwMDAtY29yZS5jLCBzZWN0aW9uLmMsIHNvbS5jLCAKLQlzcmVjLmMsIHN1bm9zLmMsIHN5bXMuYywgdGFyZ2V0cy5jLCB0ZWtoZXguYywgCi0JdHJhZC1jb3JlLmM6IENoYW5nZSBjYWxsZXJzLgotCi1UdWUgRmViIDE1IDIyOjI3OjI3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYzogUmVtb3ZlIEZJWE1FcyBmb3IgdGhpbmdzIHdoaWNoIGhhdmUgYmVlbiBkZWFsdCB3aXRoLgotCi1UdWUgRmViIDE1IDE5OjM5OjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU2luY2UgdGhpcyBmdW5jdGlvbiByZWFkcwotCXVucmVsb2NhdGVkIGNvbnRlbnRzLCB0aGUgc2VjdGlvbidzIHJhdyBzaXplIGlzIGFsd2F5cyB0aGUgb25lIHRvCi0JdXNlIGZvciBib3VuZHMgY2hlY2tpbmcuCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBJbiBhc3NlcnRpb24sIGNvbXBhcmUKLQlsaW5rX29yZGVyIHNpemUgZmllbGQgYWdhaW5zdCBjb29rZWQgc2l6ZSwgbm90IHJhdyBzaXplLCBvZiBpbnB1dAotCXNlY3Rpb24uCi0KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRm9yIEJTUyBzZWN0aW9uLCBqdXN0Ci0JcmV0dXJuIDAuCi0JKGFsaWduY29kZSk6IFdoZW4gc2hyaW5raW5nLCB0aGUgYWRkZW5kIHNob3VsZCBiZSBzZXQgdG8gdGhlCi0JY3VycmVudCBvZmZzZXQgaW4gdGhlIHNlY3Rpb24gcGx1cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHBhZGRpbmcKLQl0aGF0IHdpbGwgYWN0dWFsbHkgYmUgcmV0YWluZWQuCi0JKGJfb3V0X3JlbGF4X3NlY3Rpb24pOiBJZiBhIHNlY3Rpb24gY29udGFpbnMgbm8gcmVsb2NhdGlvbnMsIGRvbid0Ci0JYm90aGVyIHByb2Nlc3NpbmcgdGhlbS4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHJlbG9jX2RvbmUuICBBc3NlcnQKLQl0aGF0IGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyByZXR1cm5zIHRydWUuICBDaGVjayB0aGF0IHJlbG9jcyBhcmUKLQlwcm9wZXJseSBvcmRlcmVkLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIGNhc2UgQUxJR05ET05FKTogQXNzZXJ0Ci0JdGhhdCByZWxvYy0+YWRkZW5kIGZhbGxzIGJldHdlZW4gdGhlIGN1cnJlbnQgc291cmNlIG9mZnNldCBhbmQgdGhlCi0JcmF3IHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb24uCi0KLQkqIGNvbmZpZy5iZmQ6IFN1cHBvcnQgaTk2MCB2eHdvcmtzIHZlcnNpb25zID4gNS4wIHdpdGggY29mZiwgbm90Ci0JYm91dC4gIERlZmF1bHQgd2l0aCBubyB2ZXJzaW9uIG51bWJlciBpcyBzdGlsbCBib3V0LiAgU3VwcG9ydAotCWV4cGxpY2l0IGk5NjAtY29mZiB0YXJnZXQgdG9vLgotCi0JKiBib3V0LmM6IENoYW5nZWQgc29tZSBpbmRlbnRhdGlvbiwgZGVsZXRlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLAotCWZpeGVkIHNvbWUgY29tbWVudHMsIHJlbW92ZWQgc29tZSAiI2lmIDEiIGxpbmVzLgotCShvdXRwdXRfYWRkcik6IE5ldyBtYWNyby4KLQkoY2FsbGp4X2NhbGxiYWNrLCBjYWxsal9jYWxsYmFjaywgZ2V0X3ZhbHVlLCBhYnMzMmNvZGUsIGFsaWduY29kZSwKLQliX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBVc2UgaXQgZm9yIHJlYWRhYmlsaXR5LgotCi1UdWUgRmViIDE1IDA5OjAwOjE2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSk6IEl0ZXJhdGUgdGhyb3VnaCB0aGUgU09NCi0Jc3ltYm9scywgbm90IHRoZSBCRkQgc3ltYm9scy4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAxNCAyMjo1NToyMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBEbyBub3QgZGllIGlmIGEgQkZEIGRvZXNuJ3QKLQloYXZlIGFueSBzeW1ib2xzLgotCi0JKiBGaW5pc2ggYmFzaWMgcmVhZC13cml0ZSBzdXBwb3J0IGZvciBTT00gYXJjaGl2ZSBsaWJyYXJpZXMuICBCdWdzCi0Jc3VyZWx5IHJlbWFpbiBhcyB0aGlzIGhhc24ndCBiZWVuIHRlc3RlZCBhbGwgdGhhdCBtdWNoLgotCSogc29tLmMgKFNPTV9MU1RfSEFTSF9TSVpFLCBTT01fTFNUX01PRFVMRV9MSU1JVCk6IERlZmluZS4KLQkoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKTogTmV3IHN0cnVjdHVyZSB0byBob2xkIGluZm8gbmVjZXNzYXJ5Ci0JdG8gYnVpbGQgYm90aCBub3JtYWwgYW5kIGxpYnJhcnkgc3ltYm9sIHRhYmxlcy4KLQkoc29tX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogTmV3IGZ1bmN0aW9uIHRvIGRlcml2ZSBpbmZvIG5lY2Vzc2FyeQotCXRvIGJ1aWxkIGJvdGggbm9ybWFsIGFuZCBsaWJyYXJ5IHN5bWJvbCB0YWJsZXMuCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogVXNlIG5ldyBmdW5jdGlvbiB0byBkZXJpdmUgbWlzYwotCXN5bWJvbCBpbmZvcm1hdGlvbi4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVwZGF0ZSBiYWNrZW5kIHByaXZhdGUgZGF0YSBmb3Igc3ltYm9scwotCWFwcHJvcHJpYXRlbHkuCi0JKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfc3ltYm9sX2hhc2gpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfYXJtYXApOiBGbGVzaCBvdXQuCi0JKHNvbV92ZWMpOiBGaXggYXIgcGFkZGluZyBjaGFyYWN0ZXIuCi0KLQkqIHNvbS5jOiBDb25zaXN0ZW50bHkgdXNlIG1lbXNldCByYXRoZXIgdGhhbiBiemVyby4KLQotTW9uIEZlYiAxNCAxNzowMjoyOCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5jOiAgQWRkIEx5bnggY29yZSBmaWxlIHN1cHBvcnQsIHVzZSBIT1NUX0FJWCwgd2hlcmUKLQlhcHByb3ByaWF0ZS4KLQkqIHJzNjAwMC1jb3JlLmM6ICBVc2UgSE9TVF9BSVggaW5zdGVhZCBvZiBDT1JFRklMRVNfUExFQVNFLgotCSogY29uZmlnL3JzNjAwMC5taDogIFJlbW92ZSBkZWZzIG9mIEFSQ0hJVkVTX1BMRUFTRSBhbmQKLQlDT1JFRklMRVNfUExFQVNFLgotCSogY29uZmlnL3JzNjAwMGx5bngubWg6ICBUdXJuIG9uIEx5bnggY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBob3N0cy9yczYwMDAuaDogICNkZWZpbmUgSE9TVF9BSVguCi0JKiBob3N0cy9yczYwMDBseW54Lmg6ICBDcmVhdGUgdGhpcyB0byBlbmFibGUgTHlueCBob3N0IHN1cHBvcnQuCi0KLVN1biBGZWIgMTMgMTQ6MzA6MDAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX2RhdGEpOiBTYWZlbHkgYWNjZXNzIGJhY2tlbmQgcHJpdmF0ZSBkYXRhCi0JZm9yIEJGRCBzeW1ib2xzLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQotCSogUmVhZC1vbmx5IFNPTSBhcmNoaXZlIHN1cHBvcnQuCi0JKiBzb20uYyAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzKTogTmV3IGhlbHBlciBmdW5jdGlvbi4KLQkoc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMpOiBOZXcgaGVscGVyIGZ1bmN0aW9uLgotCShzb21fc2x1cnBfYXJtYXApOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCBhIFNPTSBMU1QuCi0KLQkqIHNvbS5oOiBJbmNsdWRlIDxsc3QuaD4gYW5kIDxhci5oPi4KLQotU2F0IEZlYiAxMiAyMjozNDoxNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBGaXggdHlwby4KLQkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlcyBmcm9tIHByZXBfaGVhZGVycyBhbmQKLQllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShzZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi1GcmkgRmViIDExIDE2OjU2OjUwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChub3JtYWxpemUpIFtWTVNdOiBDYWxsIG1hbGxvYywgbm90IGJmZF94bWFsbG9jLgotCShiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBDaGVjayByZXN1bHQgb2Ygbm9ybWFsaXplLgotCi1UdWUgRmViICA4IDA4OjU3OjMxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCU1ha2UgYWxsIGNhbGxlcnMgb2YgbWFsbG9jIG9yIHJlYWxsb2MgKGluY2x1ZGluZyB2aWEgb2JzdGFja3MpCi0JY2hlY2sgdGhlIHJlc3VsdCBmb3IgTlVMTC4gIE1vc3Qgc2V0IGJmZF9lcnJvciB0byBub19tZW1vcnkgYW5kCi0JcmV0dXJuIGluIHRoYXQgY2FzZTsgYSBmZXcgYXJlIGhhcmRlciB0byBmaXgsIGFuZCBhcmUgbWFya2VkCi0Jd2l0aCAiRklYTUUgPHJldHVybiB0eXBlPiIuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIKLQlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogIENoZWNrIGJmZF9tYWtlX2VtcHR5X3N5bWJvbCByZXR1cm4uCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMKLQlfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogRGl0dG8KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBEaXR0by4KLQotCSogdGVraGV4LmMgKGZpbmRfY2h1bmsgdGVraGV4X21rb2JqZWN0KTogQ2hlY2sgYmZkX2FsbG9jLgotCShmaXJzdF9waGFzZSk6IERpdHRvLiAgRklYTUUgdm9pZAotCSh0ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IENoZWNrIGJmZF96YWxsb2MuCi0JKE1ZKHJlYWRfZHluYW1pY19zeW1ib2xzKSBNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogc3RyaW5naGFzaC5jIChfYmZkX3N0cmluZ3RhYl9oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZS4KLQotCSogc3JlYy5jOiBJbmRlbnQuCi0JKGZpbGx1cF9zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jLiAgRklYTUUgdm9pZAotCShzcmVjX21rb2JqZWN0IHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLQlzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hlY2sgYmZkX2FsbG9jLiAKLQkoc3JlY19tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCi0JKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiBDaGVjayBiZmRfYWxsb2MuCi0JKHNvbV9uZXdfc2VjdGlvbl9ob29rKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IERpdHRvLiAgRklYTUUgdm9pZAotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIG9zZi1jb3JlLmMgKG9zZl9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkob3NmX2NvcmVfY29yZV9maWxlX3ApOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIG9hc3lzLmMgKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSBvYXN5c19hcmNoaXZlX3AKLQlvYXN5c19ta29iamVjdCBvYXN5c19vYmplY3RfcCBvYXN5c19uZXdfc2VjdGlvbl9ob29rCi0Jb2FzeXNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGVjayBiZmRfYWxsb2MuCi0JKG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSk6IENoZWNrIGJmZF96YWxsb2MgYW5kIGJmZF9hbGxvYy4KLQkob2FzeXNfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBubG1jb2RlLmggKG5sbV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayBiZmRfemFsbG9jIGFuZCBiZmRfYWxsb2MuCi0KLQkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19yZWFkX2ltcG9ydCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9yZWFkX2ltcG9ydCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogbmxtMzItYWxwaGEuYyAobmxtX2FscGhhX3JlYWRfaW1wb3J0KTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9saW5rX2hhc2hfbmV3ZnVuYwotCShnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jCi0JKGFyY2hpdmVfaGFzaF9uZXdmdW5jCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IENoZWNrIGJmZF9hbGxvYy4KLQkoYmZkX25ld19saW5rX29yZGVyKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4KLQotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIGllZWUuYzogSW5kZW50LgotCShyZWFkX2lkIGdldF9zeW1ib2wgZ2V0X3NlY3Rpb25fZW50cnkgaWVlZV9hcmNoaXZlX3AgaWVlZV9vYmplY3RfcAotCWllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIGllZWVfbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZG9fb25lKTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBDaGVjayBpdC4KLQkoaW5pdF9mb3Jfb3V0cHV0KTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoaWVlZV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoZWNrIGl0LgotCShkb193aXRoX3JlbG9jcyk6ICBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShpZWVlX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUpOiBEaXR0by4gIEZJWE1FIHZvaWQuCi0JKGllZWVfbWtvYmplY3QpOiBDaGVjayBiZmRfemFsbG9jLgotCShpZWVlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3ptYWxsb2MuCi0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjawotCWJmZF96YWxsb2MuCi0KLQkqIGhwcGFic2QtY29yZS5jIChocHBhYnNkX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjawotCWJmZF96YWxsb2MuCi0JKGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBlbGZjb2RlLmggKGVsZl9uZXdfc2VjdGlvbl9ob29rKTogQ2hlY2sgYmZkX2FsbG9jLgotCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBEaXR0by4KLQkod3JpdGVfcmVsb2NzKTogRGl0dG8uICBGSVhNRSB2b2lkCi0JKGVsZl9tYXBfc3ltYm9scyBhc3NpZ25fc2VjdGlvbl9udW1iZXJzIG1hcF9wcm9ncmFtX3NlZ21lbnRzKToKLQlEaXR0by4gIFJldHVybiBhIGJvb2xlYW4uIAotCShzd2FwX291dF9zeW1zKTogRGl0dG8uICBDaGVjayBlbGZfbWFwX3N5bWJvbHMuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayBiZmRfemFsbG9jLgotCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogQ2hlY2sgYmZkX2FsbG9jLgotCShlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEaXR0by4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoZWNrIGFzc2lnbl9zZWN0aW9uX251bWJlcnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogUmV0dXJuIGEgYm9vbGVhbi4KLQlDaGVjayBtYXBfcHJvZ3JhbV9zZWdtZW50cy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoZWNrIGl0LgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpOiBDaGVjayBiZmRfem1hbGxvYyBhbmQKLQlyZWFsbG9jLiAKLQkoaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IERpdHRvLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IENoZWNrIGJmZF96YWxsb2MuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBEaXR0by4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogRGl0dG8uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoZWNrIGl0LgotCShlY29mZl9zbHVycF9hcm1hcCk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZWNvZmZfd3JpdGVfYXJtYXApOiBDaGVjayBiZmRfemFsbG9jLgotCShlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIGFuZAotCV9iZmRfbGlua19oYXNoX25ld2Z1bmMuIAotCShlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGN0b3IuYyAoYmZkX2NvbnN0cnVjdG9yX2VudHJ5KTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IENoZWNrIGJmZF9hbGxvYy4KLQkoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogQ2hlY2sgYmZkX2FsbG9jLiAgRklYTUUgaW50Ci0JKGNvZmZfd3JpdGVfbGluZW51bWJlcnMpOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShjb2ZmX3NlY3Rpb25fc3ltYm9sKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkqIGxpYmNvZmYtaW4uaDogQ2hhbmdlIGRlY2xzIG9mIGNvZmZfcmVudW1iZXJfc3ltYm9scywKLQljb2ZmX3dyaXRlX2xpbmVudW1iZXJzLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjawotCWNvZmZfcmVudW1iZXJfc3ltYm9scywgY29mZl93cml0ZV9saW5lbnVtYmVycy4KLQotCSogY29mZmNvZGUuaDogSW5kZW50LgotCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LiAgUmV0dXJuIGEKLQlib29sZWFuLiAKLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBpdC4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgYmZkX2FsbG9jLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBDaGVjayBiZmRfYWxsb2MgdmFsdWUuCi0JKGRvX3NsdXJwX2JzZF9hcm1hcCk6IERpdHRvLgotCShjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IENoZWNrIGJmZF9yZWFsbG9jIHZhbHVlLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogQ2hlY2sgYmZkX2FsbG9jCi0JcmV0dXJuIHZhbHVlLiAgUmV0dXJuIGJvb2xlYW4gdmFsdWUuCi0JKE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkpOiBDaGVjayBiZmRfemFsbG9jIHJldHVybiB2YWx1ZS4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDaGVjayBiZl9hbGxvYyBhbmQgYmZkX3phbGxvYwotCXJldHVybiB2YWx1ZS4KLQkoYWRkX3RvX3N0cmluZ3RhYik6IERpdHRvLiAgRklYTUUgdm9pZAotCShhb3V0X2xpbmtfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUgcmV0dXJuIHZhbHVlLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBDaGVjayBiZmRfYWxsb2MgdmFsdWUuCi0JKHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpOiBDaGVjayB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLgotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEaXR0by4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19oYXNoX25ld2Z1bmMpOiBDaGVjayBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jLgotCi0JKiBvcG5jbHMuYyAoYmZkX3phbGxvYyBiZmRfcmVhbGxvYyk6IENoZWNrIHJlc3VsdCBvZiBiZmRfYWxsb2MuCi0KLQkqIG9wbmNscy5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQkoX2JmZF9uZXdfYmZkKTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4uCi0KLQkqIGllZWUuYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JKGllZWVfYXJjaGl2ZV9wKTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4gYW5kCi0Jb2JzdGFja19maW5pc2ggZm9yIE5VTEwgcmV0dXJuLgotCi0JKiBoYXNoLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCShiZmRfaGFzaF90YWJsZV9pbml0X24pOiBDaGVjayBvYnN0YWNrX2JlZ2luIGZvciAwIHJldHVybiBhbmQKLQlvYnN0YWNrX2ZpbmlzaCBmb3IgTlVMTCByZXR1cm4uCi0JKGJmZF9oYXNoX2xvb2t1cCk6IENoZWNrIG9ic3RhY2tfYWxsb2MgZm9yIE5VTEwgcmV0dXJuLgotCi0JKiBlY29mZmxpbmsuYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLQliZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcik6IENoZWNrIG9ic3RhY2tfYWxsb2MuCi0JKGFkZF9maWxlX3NodWZmbGUgYWRkX21lbW9yeV9zaHVmZmxlKTogQ2hlY2sgb2JzdGFja19hbGxvYyBmb3IKLQlOVUxMIHJldHVybi4gIFJldHVybiBib29sZWFuLCBub3Qgdm9pZC4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2luaXQpOiBDaGVjayBvYnN0YWNrX2JlZ2luIGZvciAwIHJldHVybi4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBDaGVjayBhZGRfZmlsZV9zaHVmZmxlCi0JYW5kIGFkZF9tZW1vcnlfc2h1ZmZsZSByZXR1cm4uIAotCShzdHJpbmdfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUgYW5kIGJmZF9oYXNoX25ld2Z1bmMuCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogQ2hlY2sgYmZkX2FsbG9jLgotCShlY29mZl9hZGRfc3RyaW5nKTogQ2hlY2sgYWRkX21lbW9yeV9zaHVmZmxlIHJldHVybi4KLQotCSogbGliYmZkLWluLmggKHhtYWxsb2MsIGJmZF94bWFsbG9jLCBiZmRfeG1hbGxvY19ieV9zaXplX3QpOgotCVJlbW92ZSBkZWNscy4gCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotRnJpIEZlYiAxMSAxNTozNTozMiAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogIEFkZCBMeW54L3JzNjAwMCBzdXBwb3J0LgotCSogY29uZmlnL2kzODYtbmxtLm10OiAgRW5hYmxlIGEub3V0IGZpbGUgc3VwcG9ydC4KLQkqIGNvbmZpZy9yczYwMDBseW54Lm1oOiAgTHlueC9yczYwMDAgaG9zdCBzdXBwb3J0LgotCi1GcmkgRmViIDExIDE3OjI1OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFJld3JpdGUgc29tZXdoYXQgdG8gaW1wcm92ZQotCW1lbW9yeSB1c2FnZS4KLQotRnJpIEZlYiAxMSAxMzoxMDo0MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYzogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvICdcbicgaW4gYXJjaGl2ZSBtYWdpYwotCXRvICdcMDEyJywgZm9yIGdyZWF0ZXIgcG9ydGFiaWxpdHkuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9hcm1hcCk6IERpdHRvLgotCi1UaHUgRmViIDEwIDEyOjU4OjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IENoZWNrIHN0cmlwIHNldHRpbmdzIHRvCi0Jc2VlIHdoZXRoZXIgc3ltYm9sIHNob3VsZCBiZSBvdXRwdXQuCi0JKiBnZW5saW5rLmggKHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyk6IEFkZGVkIGluZm8KLQlmaWVsZC4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEluaXRpYWxpemUgd2dpbmZvLmluZm8uCi0JKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBDaGVjayBzdHJpcCBzZXR0aW5ncyB0bwotCXNlZSB3aGV0aGVyIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSB3Z2luZm8uaW5mby4KLQotV2VkIEZlYiAgOSAyMTozNDo1OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9yZWxvY19xdWV1ZV9maW5kKTogRG8gbm90IGV4YW1pbmUgYSBOVUxMIHF1ZXVlIGVudHJ5LgotCi0JKiBzb20uYzogQ2FzdCByZXR1cm4gdmFsdWVzIGZyb20gQkZEIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHRvCi0JYXZvaWQgd2FybmluZ3MgZnJvbSB0aGUgSFAgY29tcGlsZXIuCi0KLVdlZCBGZWIgIDkgMTI6NTU6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBBY2NlcHQgYSBMSVRFUkFMCi0JcmVsb2Mgb24gYW4gImxkbCIgaW5zdHJ1Y3Rpb24gdG9vLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtKTogQ2FzdCBzdGF0dXMgZWxlbWVudHMKLQl3aGVuIHBhc3NpbmcgdGhlbSB0byBzcHJpbnRmLiAgVXNlICVsZCBpbnN0ZWFkIG9mICVkLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX21rYXJjaGl2ZSk6IFJldHVybiBmYWxzZS4KLQkocnM2MDAwX2NvZmZfc25hcmZfYXJfaGRyKTogRG9uJ3QgZGVjbGFyZSBlcnJubzsgaXQncyBub3QgdXNlZC4KLQlBbHNvIHJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIG5hbWVsZW4uCi0JKHJzNjAwMGNvZmZfd3JpdGVfYXJtYXApOiBEZWNsYXJlIG9ybF9jb3VudCBhbmQgc3RyaWR4IHBhcmFtZXRlcnMuCi0KLVR1ZSBGZWIgIDggMTg6MDA6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoeG1hbGxvYyk6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVyIHR5cGUsIHRvIGF2b2lkCi0JY29uZmxpY3RzLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBGZWIgIDggMTU6NTU6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChyZWxvY19uaWwpOiBOZXcgZnVuY3Rpb24uCi0JKGFscGhhX2hvd3RvX3RhYmxlKTogVXNlIGl0IGFzIHNwZWNpYWxfZnVuY3Rpb24gdG8gcHJldmVudCBjZXJ0YWluCi0JcmVsb2NzIGZyb20gYmVpbmcgYWRqdXN0ZWQgYnkgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElHTk9SRQotCXJlbG9jIHNob3VsZCBiZSBwYXJ0aWFsX2lucGxhY2UuCi0JKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFjY2VwdCBhIExJVEVSQUwKLQlyZWxvYyBvbiBhbiAibGRsIiBpbnN0cnVjdGlvbiB0b28uCi0KLVR1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGYzMi1ocHBhLmMgKENVUlJFTlRfU1RVQl9PRkZTRVQsIGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViLAotCWhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiAgQ2FzdCB0byBjaGFyICogaW5zdGVhZCBvZiBpbnQKLQliZWZvcmUgcGVyZm9ybWluZyBwb2ludGVyIGFyaXRobWV0aWMuCi0KLU1vbiBGZWIgIDcgMjA6NTY6MjcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqLSotb3NmKik6IFVzZSBiZmRfbmFtZSBocHBhb3NmIGZvciB0aGlzCi0JY29uZmlndXJhdGlvbi4KLQkoaHBwYSotKi0qZWxmKik6IFRoaXMgY29uZmlndXJhdGlvbiB1c2VkIGhwcGEtZWxmIG5vdy4KLQotCSogc29tLmM6IFRoaXMgZmlsZSBpcyBhbHNvIHVzZWQgZm9yIEhPU1RfSFBQQU9TRi4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEVuYWJsZSBzb21fdmVjIGZvciBIT1NUX0hQUEFPU0YuCi0KLQkqIGhvc3RzL2hwcGFvc2YuaDogTmV3IGhvc3QgY29uZmlndXJhdGlvbiBmaWxlLgotCi0JKiBjb25maWcvaHBwYWJzZC5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgYmZkX2VsZjMyX2hwcGFfdmVjIGFzCi0JQlNEIGhhbmRsZXMgYm90aCBTT00gYW5kIEVMRiBvYmplY3QgZmlsZXMuCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChIREVGSU5FUyk6IERlbGV0ZS4gIE5vIGxvbmdlciBuZWVkZWQuCi0JKFJBTkxJQik6IERvZXNuJ3QgZG8gYW55dGhpbmcsIGRlZmluZSBpdCB0byBiZSAiZWNobyIuCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm10OiBOZXcgdGFyZ2V0IG1ha2VmaWxlIGZyYWdtZW50IGZvciBhIFBBIHJ1bm5pbmcKLQlPU0YxLgotCi1Nb24gRmViICA3IDE1OjAyOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkZWQgYmZkX2FyY2hfcG93ZXJwYy4KLQkoYXJjaHVyZXNfaW5pdF90YWJsZSk6IElmIFNFTEVDVF9BUkNISVRFQ1RVUkVTIGlzIG5vdCBkZWZpbmVkLAotCWFkZGVkIGJmZF9wb3dlcnBjX2FyY2guCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjcHUtcG93ZXJwYy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMsIENGSUxFUyk6IEFkZGVkIGNwdS1wb3dlcnBjLmMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogR2V0IHZtYSBhbmQgYWxpZ25tZW50X3Bvd2VyCi0Jb2YgYW4gU0hUX1NUUlRBQiBzZWN0aW9uIGZyb20gc2hfYWRkciBhbmQgc2hfYWRkcmFsaWduLCByYXRoZXIKLQl0aGFuIGp1c3Qgc2V0dGluZyB0aGVtIHRvIHplcm8uCi0KLVN1biBGZWIgIDYgMjA6MDQ6MTAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycywgc3dhcF9vdXRfc3ltcyk6IENoZWNrIGZvciBOVUxMIHJldHVybgotCWZyb20gYmZkX25ld19zdHJ0YWIuIAotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hlY2sgZm9yIGZhbHNlIHJldHVybiBmcm9tCi0Jc3dhcF9vdXRfc3ltcy4gCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBDaGVjayBmb3IgTlVMTCByZXR1cm4KLQlmcm9tIGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuCi0KLQkqIHN5bXMuYzogTWFrZSBleGFtcGxlIGFwcGxpY2F0aW9uIGluIGRvYyBjYWxsIHhtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jLiAKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSksCi0JYW91dF9saW5rX2dldF9zeW1ib2xzLCBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOgotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSwgYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOgotCSogZWNvZmYuYyAoZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiAKLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfaW5pdCk6IAotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IAotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IAotCShiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IAotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IAotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogCi0JKiBlbGZjb2RlLmggKGJmZF9uZXdfc3RydGFiKTogCi0JKGJmZF9hZGRfMl90b19zdHJ0YWIpOiAKLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IAotCShlbGZfY29yZWZpbGVfbm90ZSk6IAotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogCi0JVXNlIG1hbGxvYyBhbmQgY2hlY2sgdGhlIHJlc3VsdCwgaW5zdGVhZCBvZiBiZmRfeG1hbGxvYy4KLQotU2F0IEZlYiAgNSAxMjozOToyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogUHV0IG02OCotKi1zeXN2KiBsaW5lIGFmdGVyIG02OCotKi1zeXN2NCouCi0KLVNhdCBGZWIgIDUgMDU6MzI6NDQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3JkKTogIFB1dCBDT05TVCBrZXl3b3JkIGZvciAic3JjIiBiZWZvcmUKLQkidW5zaWduZWQiLCBzb21lIGNvbXBpbGVycyBkb24ndCBsaWtlIGl0IGFmdGVyICJ1bnNpZ25lZCIuCi0JKiBsaWJjb2ZmLmgsIGxpYmNvZmYtaW4uaCAoYmZkX3BlcmZvcm1fc2xpcCk6ICBSZW5hbWUgInZhbHVlIiB0bwotCSJ2YWwiIGluIHByb3RvdHlwZSBkZWNsYXJhdGlvbiBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIGRvbid0IGxpa2UKLQlhcmd1bWVudHMgd2hvc2UgbmFtZXMgYXJlIHRoZSBzYW1lIGFzIHR5cGVzLgotCi1TYXQgRmViICA1IDAxOjE0OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBDb3JyZWN0IHRlc3QgZm9yIHdoZXRoZXIKLQlvYmplY3QgZmlsZSBkZWZpbmVzIHN5bWJvbC4gIEFsc28sIGlmIHNraXBwaW5nIGEgc3ltYm9sLCBza2lwIHRoZQotCXNlY29uZCBzeW1ib2wgb2YgYSBOX1dBUk5JTkcgb3IgTl9JTkRSIHN5bWJvbCBhcyB3ZWxsLgotCi1GcmkgRmViICA0IDIzOjU1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCBiYXNpYyBzdXBwb3J0IGZvciB3cml0aW5nIFJTLzYwMDAgWENPRkYgZmlsZXMuCi0JKiBjb2ZmLXJzNjAwMC5jIChkdW1teV9yZWxvYyk6IFJlbW92ZWQuCi0JKHJzNjAwMGNvZmZfaG93dG9fdGFibGUpOiBEZWZpbmVkIFhDT0ZGIHJlbG9jcy4KLQkoUlRZUEUySE9XVE8pOiBEZWZpbmVkIHRvIHVzZSByczYwMDBjb2ZmX3J0eXBlMmhvd3RvLgotCShyczYwMDBjb2ZmX3J0eXBlMmhvd3RvKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZWQgdG8gdXNlCi0JcnM2MDAwY29mZl9yZWxvY190eXBlX2xvb2t1cC4gCi0JKHJzNjAwMGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKFNFTEVDVF9SRUxPQyk6IERlZmluZWQgdG8gc2V0IHJfdHlwZSBhbmQgcl9zaXplIGZpZWxkcy4KLQkoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZWQuCi0JKiBjb2ZmY29kZS5oIChjb21iaW5lZF9lbnRyeV90eXBlKTogQ2hhbmdlZCBmaXhfdGFnIGFuZCBmaXhfZW5kCi0JZmllbGRzIHRvIGJpdGZpZWxkcy4gIEFkZGVkIGZpZWxkcyBmaXhfdmFsdWUgYW5kIGZpeF9zY25sZW4uCi0JKHNlY190b19zdHlwX2ZsYWdzKTogSWYgU1RZUF9ERUJVRyBpcyBkZWZpbmVkLCB1c2UgaXQgcmF0aGVyIHRoYW4KLQlTVFlQX0lORk8gZm9yIHRoZSB0eXBlIG9mIGEgc2VjdGlvbiBuYW1lZCAuZGVidWcuCi0JKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IERvbid0IGRlZmluZSBpZiBSUzYwMDBDT0ZGX0MuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgUlM2MDAwQ09GRl9DLCBkb24ndCBjYWxsCi0JY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIFJTNjAwMENPRkZfQywgdGhlbiBpZiB0aGUgbGFzdCBhdXgKLQllbnRyeSBoYXMgdHlwZSBTVFlfTEQgY2hhbmdlIHRoZSB4X3NjbmxlbiBpbnRvIGEgcG9pbnRlciB0byBhCi0Jc3ltYm9sIGFuZCBzZXQgZml4X3Njbmxlbi4gIEFsc28sIGZvciBhIENfQlNUQVQgc3ltYm9sLCBjaGFuZ2UgdGhlCi0JdmFsdWUgaW50byBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgYW5kIHNldCBmaXhfdmFsdWUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfbWFuZ2xlX3N5bWJvbHMpOiBSZWluZGVudC4gIElmIGZpeF92YWx1ZSBpcyBzZXQsCi0JZ2V0IHRoZSBzeW1ib2wgb2Zmc2V0LiBMaWtld2lzZSBmb3IgZml4X3Njbmxlbi4KLQkoc3RyaW5nX3NpemUpOiBDaGFuZ2UgdHlwZSB0byBiZmRfc2l6ZV90eXBlLgotCShkZWJ1Z19zdHJpbmdfc2l6ZSwgZGVidWdfc3RyaW5nX3NlY3Rpb24pOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBJZiBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIHJldHVybnMgdHJ1ZSwKLQl3cml0ZSB0aGUgc3ltYm9sIG5hbWUgaW50byB0aGUgLmRlYnVnIHNlY3Rpb247IGFzc3VtZSB0aGF0IHRoZQotCXNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIHdpdGggdGhlIHJpZ2h0IHNpemUuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IEluaXRpYWxpemUgZGVidWdfc3RyaW5nX3NpemUgdG8gMC4gIElmCi0JYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyByZXR1cm5zIHRydWUsIGRvbid0IHB1dCBzeW1ib2wgbmFtZSBpbgotCXVzdWFsIHN0cmluZyB0YWJsZS4gIEFmdGVyIHdyaXRpbmcgb3V0IGFsbCBzeW1ib2xzLCBpZgotCWRlYnVnX3N0cmluZ19zaXplIGlzIG5vdCAwLCBjaGVjayB0aGF0IGl0IG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlCi0JLmRlYnVnIHNlY3Rpb24uCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2xlYXIgbmV3IGZpeF92YWx1ZSBhbmQgZml4X3NjbmxlbgotCWZpZWxkcy4gIElmIHRoZSBzdHJpbmcgb2Zmc2V0IGlzIDAsIGFsd2F5cyB1c2UgYW4gZW1wdHkgc3RyaW5nIGFzCi0JdGhlIG5hbWUuCi0JKGNvZmZfbWFrZV9lbXB0eV9zeW1ib2wpOiBaZXJvIG91dCB0aGUgc3ltYm9sIHN0cnVjdHVyZS4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBXb3JrIGFyb3VuZCBvbmUgZ3Jvc3MgaGFjawotCXdpdGggYW5vdGhlcjogYWN0dWFsbHkgbG9vayBhdCB0aGUgdGFyZ2V0IG5hbWUgdG8gYXZvaWQgdGhlIGJyb2tlbgotCUNPRkYgY2hlY2suCi0JKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZCBCRkRfUkVMT0NfUFBDX0IyNiwKLQlCRkRfUkVMT0NfUFBDX0JBMjYgYW5kIEJGRF9SRUxPQ19QUENfVE9DMTYuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBGZWIgIDQgMTc6Mjg6MzIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoYmZkX3ptYWxsb2MpOiBDYWxsIGJmZF94bWFsbG9jIGluc3RlYWQgb2YgbWFsbG9jLgotCShiZmRfeG1hbGxvYywgYmZkX3htYWxsb2NfYnlfc2l6ZV90KTogRnVuY3Rpb25zIGRlbGV0ZWQuCi0JKiBsaWJiZmQtaW4uaDogRGVmaW5lIHRoZW0gYXMgbWFjcm9zIGNhbGxpbmcgeG1hbGxvYyBhbmQgZGVjbGFyZQotCXhtYWxsb2MuIAotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVRodSBGZWIgIDMgMTY6NDk6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyk6IElmIGEgc21hbGwgdW5kZWZpbmVkCi0Jc3ltYm9sIGhhcyBhIHZhbHVlIGluIHRoZSBFQ09GRiBzeW1ib2wgYnV0IG5vdCBpbiB0aGUgQkZEIHN5bWJvbCwKLQlrZWVwIHRoZSB2YWx1ZSBpbiB0aGUgRUNPRkYgc3ltYm9sLiAgVGhpcyBoZWxwcyBnYXMuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scywKLQlfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogRG9uJ3QgcmVxdWlyZSB0aGF0IGFsbAotCXJlZmVyZW5jZXMgdG8gYSBjb21tb24gc3ltYm9sIGJlIHRoZW1zZWx2ZXMgY29tbW9uIHN5bWJvbHMuCi0KLQkqIGFvdXR4LmggKGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbik6IEhhbmRsZSBOX1VOREYuCi0KLVdlZCBGZWIgIDIgMjA6Mzc6MTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jLCBiZmQtaW4uaCwgaG9zdHMvYWxwaGFvc2YuaCwgaG9zdHMvc3BhcmMtbGwuaCwgYW91dGYxLmgsCi0Jc3BhcmNseW54LmMsIE1ha2VmaWxlLmluOiBDaGFuZ2UgSE9TVF82NF9CSVQgdG8gQkZEX0hPU1RfNjRfQklULgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1XZWQgRmViICAyIDEyOjMwOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3JlbG9jX291dCk6IElmIFJTNjAwMENPRkZfQywgaGFuZGxlIHR5cGUKLQlhbmQgc2l6ZSBjb3JyZWN0bHkuCi0JKGNvZmZfc3dhcF9hdXhfaW4pOiBJZiBSUzYwMDBDT0ZGX0MsIGNoYW5nZSB4X2NzZWN0Lnhfc2NubGVuIHRvCi0JeF9jc2VjdC54X3Njbmxlbi5sIHRvIG1hdGNoIGNoYW5nZSBpbiBjb2ZmL2ludGVybmFsLmguCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSksIGNvZmYtYWxwaGEuYwotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UgY2FzdHMgb2YgYXV4X2luIGFuZCBhdXhfb3V0Ci0JZmllbGRzIHRvIG1hdGNoIHllc3RlcmRheSdzIGNoYW5nZXMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogSWYgU0VMRUNUX1JFTE9DIGlzIGRlZmluZWQsIHBhc3MKLQlpbiB0aGUgaW50ZXJuYWxfcmVsb2MgaXRzZWxmLCBub3QgdGhlIHR5cGUuCi0JKiBjb2ZmLWFwb2xsby5jLCBjb2ZmLWg4MzAwLmMsIGNvZmYtaDg1MDAuYywgY29mZi1pMzg2LmMsCi0JY29mZi1tNjhrLmMsIGNvZmYtc2guYywgY29mZi13ZTMyay5jLCBjb2ZmLXo4ay5jOiBDaGFuZ2VkCi0JZGVmaW5pdGlvbiBvZiBTRUxFQ1RfUkVMT0MgYWNjb3JkaW5nbHkuCi0KLVR1ZSBGZWIgIDEgMTI6MDU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBuZXcgYXJndW1lbnRzIHRvCi0JX2JmZF9jb2ZmX3N3YXBfYXV4X2luIGFuZCBfYmZkX2NvZmZfc3dhcF9hdXhfb3V0OiBhdXggaW5kZXggbnVtYmVyCi0JYW5kIG51bWJlciBvZiBhdXggZW50cmllcy4KLQkoYmZkX2NvZmZfc3dhcF9hdXhfaW4sIGJmZF9jb2ZmX3N3YXBfYXV4X291dCk6IENoYW5nZWQKLQlhY2NvcmRpbmdseS4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4sIGNvZmZfc3dhcF9hdXhfb3V0KTogQWNjZXB0IG5ldwotCWFyZ3VtZW50cy4gIElmIFJTNjAwMENPRkZfQywgb25seSB0cmVhdCBDX0VYVCBhbmQgQ19ISURFWFQKLQlzcGVjaWFsbHkgaWYgdGhpcyBpcyB0aGUgbGFzdCBhdXggZW50cnkuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfc3ltYm9sLCBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFBhc3MKLQluZXcgYXJndW1lbnRzIHRvIHN3YXBfYXV4IGZ1bmN0aW9ucy4KLQotU3VuIEphbiAzMCAxNToxNDozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnZW4tYW91dC5jIChtYWluKTogU2V0IERFRkFVTFRfQVJDSCBiYXNlZCBvbiBwcmVwcm9jZXNzb3IgbWFjcm9zCi0JKG9ubHkgdGVzdGluZyBmb3IgbTY4ayBhbmQgdmF4IGF0IHRoZSBtb21lbnQpOyBkbyB2ZXJpZnkgdGhhdCB0aGUKLQlwcmVwcm9jZXNzb3IgZGlkbid0IHRyYXNoIHRoZSBhcmNoIG5hbWUgaW5zaWRlIHRoZSBzdHJpbmcgdmVyc2lvbi4KLQlEb24ndCBwcmludCBvdXQgInBhZ2VzaXplID0iIGxpbmUgdGhhdCBwcmV2ZW50cyBvdXRwdXQgZnJvbQotCWNvbXBpbGluZy4gIERlcml2ZSBCWVRFU19JTl9XT1JEIGFuZCBBUkNIIHZhbHVlcyBmcm9tIHNpemVvZgotCXJlc3VsdHMuCi0JKiBNYWtlZmlsZS5pbiAoYW91dC1wYXJhbXMuaCk6IFBhc3MgZ2VuLWFvdXQgYSBkdW1teSB0YXJnZXQgbmFtZS4KLQkoY2hlY2ssIGluc3RhbGxjaGVjayk6IElkZW50aWZ5IGRpcmVjdG9yeSBpbiAibm8gdGVzdHN1aXRlcyIKLQltZXNzYWdlLgotCi1TdW4gSmFuIDMwIDEzOjI1OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBXcml0ZSBvdXQgY29ycmVjdCB2YWx1ZSBmb3IKLQlvYmplY3QgZmlsZSBzeW1ib2wuCi0KLUZyaSBKYW4gMjggMTg6MzQ6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvdmF4YnNkLmggKEhPU1RfU1RBQ0tfRU5EX0FERFIpOiBWYXggQlNEIGRvZXNuJ3QgZGVmaW5lCi0JS0VSTkJBU0UsIHNvIGhhcmQtY29kZSAweDgwMDAwMDAwIGluc3RlYWQuCi0KLVRodSBKYW4gMjcgMTM6NTQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IElmIHN5bWJvbCBpcyBjb21tb24sCi0Jc2V0IHRoZSBCU0ZfT0xEX0NPTU1PTiBmbGFnLgotCi1XZWQgSmFuIDI2IDEzOjQ3OjE1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IFB1dCB0aGUgbmV3IGVudHJ5IGluIHRoZQotCWNvcnJlY3QgZWxlbWVudCBvZiBtYXRjaGluZ192ZWN0b3IuCi0KLVR1ZSBKYW4gMjUgMTE6NDM6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNvbS5jLCBzb20uaCAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzLAotCWJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyk6IENoYW5nZSBwYXJhbWV0ZXJzIGZyb20gY2hhcgotCXRvIGludC4gIEZvbGxvd2luZyBhIHByb3RvdHlwZSB3aXRoIGFuIG9sZC1zdHlsZSBmdW5jdGlvbiBkZWZpbml0aW9uCi0JaW4gdGhlIHByZXNlbmNlIG9mIHdpZGVuZWQgcGFyYW1ldGVycyBpcyBhIEdDQy1pc20gbm90IHN1cHBvcnRlZAotCWJ5IHRoZSBIUCBjb21waWxlciBpbiBBTlNJIG1vZGUuCi0KLVR1ZSBKYW4gMjUgMTE6NDY6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBTaXplIG9mIHR5cGUgLTIgaXMgNCBieXRlcywgbm90IDIuCi0KLQkqIGhwMzAwaHB1eC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogV3JpdGUgb3V0IHRoZSBzeW1ib2xzCi0JYmVmb3JlIHdyaXRpbmcgb3V0IHRoZSByZWxvY3MsIHNvIHRoYXQgdGhlIHJpZ2h0IHN5bWJvbCBpbmRpY2VzCi0JYXJlIHVzZWQuCi0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfYnNkX2FybWFwLCBiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogRG8gbm90Ci0JdHJ5IHRvIG92ZXJsYXkgdGhlIGludGVybmFsIGNhcnN5bXMgb24gdGhlIGV4dGVybmFsIHN5bWRlZnMuICBUaGF0Ci0JY2FuIG5vdCB3b3JrIGlmIHRoZSBzaXplIG9mIGEgaG9zdCBwb2ludGVyIGlzIGxhcmdlciB0aGFuIDQgYnl0ZXMuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBDYXN0IHJlc3VsdCBvZgotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4KLQkqIG9wbmNscy5jIChfYmZkX25ld19iZmQpOiBBdm9pZCBBTlNJIEMgcHJvdG90eXBlLgotCi0JKiBhcmNoaXZlLmM6IFJlaW5kZW50ZWQgdG8gR05VIHN0YW5kYXJkcy4KLQotTW9uIEphbiAyNCAxNDo0MToyMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChfYmZkX25ld19iZmQsIF9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4pOiBBZGQKLQkiX2JmZF8iIHRvIGZ1bmN0aW9uIG5hbWVzLgotCSogYXJjaGl2ZS5jIChfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwpLAotCWxpYmJmZC1pbi5oOiBDaGFuZ2UgY2FsbGVycy4KLQotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogUmVuYW1lZCBmcm9tIHphbGxvYy4KLQkqIGxpYmJmZC5jIChiZmRfYWRkX3RvX3N0cmluZ190YWJsZSksCi0JdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCksCi0JdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2xpc3QpLAotCXB0cmFjZS1jb3JlLmMgKHB0cmFjZV91bml4X2NvcmVfZmlsZV9wKSwKLQlvcG5jbHMuYyAobmV3X2JmZCksIGxpYmJmZC1pbi5oLAotCWllZWUuYyAoaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCksCi0JZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2JyYW5jaF9yZWxvYyksCi0JKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBDaGFuZ2UgY2FsbGVycy4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSk6IEFkZCAiX2JmZF8iIHRvIG5hbWUuCi0JKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKSwgCi0JY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MpLCBsaWJiZmQtaW4uaDoKLQlDaGFuZ2UgY2FsbGVycy4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyksIGxpYmJmZC1pbi5oLCB0YXJnZXRzLmMsCi0JZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSZW5hbWUgdGFyZ2V0X3ZlY3RvciB0byBiZmRfdGFyZ2V0X3ZlY3RvcgotCWFuZCBkZWZhdWx0X3ZlY3RvciB0byBiZmRfZGVmYXVsdF92ZWN0b3IuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9jaGVja19mb3JtYXQpOiBDYWxsIGl0LgotCShiZmRfbWF0Y2hpbmdfZm9ybWF0cyk6IEZ1bmN0aW9uIHJlbW92ZWQuCi0JKiB0YXJnZXRzLmM6IFJlcGxhY2UgdGhlIHZlY3RvciBhZGRlZCBvbiBKYW4gMjEgd2l0aCBhIGNvdW50IG9mCi0JZW50cmllcyBpbiBkZWZhdWx0X3ZlY3Rvci4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBKYW4gMjQgMTI6Mzg6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX29iamVjdF9wKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHNpemUgb2YKLQkucGRhdGEgc2VjdGlvbiBiYXNlZCBvbiBsbm5vcHRyIGZpZWxkLCBub3Qgc2VjdGlvbiBoZWFkZXIuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgaWYgcl9zeW1uZHggPj0gMCwKLQlzaW5jZSBpdCBpcyB1bnNpZ25lZC4KLQkoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogVXNlIGFscGhhX2Vjb2ZmX29iamVjdF9wIHJhdGhlciB0aGFuCi0JY29mZl9vYmplY3RfcC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgYWxpZ25tZW50X3Bvd2VyIGZpZWxkIG9mCi0JLnBkYXRhIHNlY3Rpb24gdG8gMy4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2F2ZSB0aGUgc2l6ZSBvZiB0aGUKLQkucGRhdGEgc2VjdGlvbiBpbiB0aGUgbGluZV9maWxlcG9zIGZpZWxkLCBhbmQgYWN0dWFsbHkgYWxpZ24gdGhlCi0JLnBkYXRhIHNlY3Rpb24gdG8gYW4gYWxpZ25tZW50IHBvd2VyIG9mIDQuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBTZXQgb3V0cHV0X2hhc19iZWd1biBhZnRlcgotCWNhbGxpbmcgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgc19sbm5vcHRyIGZvciB0aGUgLnBkYXRhCi0Jc2VjdGlvbiBmcm9tIHRoZSBsaW5lX2ZpbGVwb3MgZmllbGQuICBTZXQgdnN0YW1wIGZvciB0aGUgb3B0aW9uYWwKLQloZWFkZXIgZnJvbSB0aGUgdnN0YW1wIG9mIHRoZSBzeW1ib2xpYyBoZWFkZXIuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogU2V0IHZzdGFtcCBvZiB0aGUgc3ltYm9saWMgaGVhZGVyIHRvIHRoZQotCXZzdGFtcCB1c2VkIGJ5IHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbiB0aGUgbGluay4KLQotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX2FsaWduX2RlYnVnKTogQWxpZ24gUkZEcyB0byBkZWJ1Z19hbGlnbi4KLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hY2hpdmVfZWxlbWVudCk6IFNldCBTRUNfQUxMT0MgZmxhZwotCWZvciBhIGNyZWF0ZWQgY29tbW9uIHNlY3Rpb24uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IFVzZSBlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIHRvCi0JZ2V0IHRoZSBpbmRleCBvZiBhIGNvbW1vbiBzZWN0aW9uLCByYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcKLQlTSE5fQ09NTU9OIChNSVBTIGhhcyBtdWx0aXBsZSBjb21tb24gc2VjdGlvbnMpLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogVHlwbyAoPT0gZm9yID0pLgotCi0JKiBiZmQvYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkLAotCWFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IFBhc3MgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8KLQlyZWxvY19vdmVyZmxvdyBjYWxsYmFjay4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLAotCWFscGhhX3JlbG9jYXRfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4NTAwLmMgKGV4dHJhX2Nhc2UpOiBMaWtld2lzZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtejhrLmMgKGV4dHJhX2Nhc2UpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBMaWtld2lzZS4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi0JKiBib3V0LmMgKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2spOiBVc2UgZ2V0X3ZhbHVlIHRvIGdldAotCXRoZSBzeW1ib2wgdmFsdWUgYW5kIGNoZWNrIGZvciB1bmRlZmluZWQgc3ltYm9scy4KLQkoZ2V0X3ZhbHVlKTogSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIGxvb2sgaXQgdXAgaW4gdGhlIGxpbmtlcgotCWhhc2ggdGFibGUuCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEZvciBQQ1JFTDI0IGFuZCBQQ1JFTDEzCi0JdXNlIGdldF92YWx1ZSB0byBnZXQgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgY2hlY2sgZm9yIHVuZGVmaW5lZAotCXN5bWJvbHMuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogSWYgdGhlIHN5bWJvbCBpcwotCXVuZGVmaW5lZCwgbG9vayBpdCB1cCBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpOiBUaGUgc3RyaW5nIGluZGV4IDAgaGFzIGEKLQlzcGVjaWFsIG1lYW5pbmcgZm9yIG5vcm1hbCBzeW1ib2xzLCBidXQgbm90IGZvciBkeW5hbWljIHN5bWJvbHMuCi0KLVNhdCBKYW4gMjIgMTI6MjY6MDEgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmNseW54LmM6ICBTZXR1cCBhcHByb3ByaWF0ZSBtYWNyb3MgdG8gZW5hYmxlIGNvcmUgZmlsZQotCXN1cHBvcnQuCi0KLUZyaSBKYW4gMjEgMTY6MjU6MzUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6IEFkZCBhIHZlY3RvciBvZiBtYXRjaGluZyBmb3JtYXQgbmFtZXMuCi0JKiBmb3JtYXQuYyAoYmZkX21hdGNoaW5nX2Zvcm1hdHMpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIGl0LgotCShiZmRfY2hlY2tfZm9ybWF0KTogU2V0IGl0LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotCSogYmZkLWluLmg6IFJlbW92ZSBkZWNscyBvZiBiZmRfZWMgdHlwZSBhbmQgZXJyb3IgcHJpbnRpbmcgZnVuY3Rpb25zLgotCVJlbW92ZSBkZWNsIG9mIHR5cGUgc3ltY2xhc3M7IHdhc24ndCB1c2VkLgotCSogYmZkLmM6IERvY3VtZW50IGVycm9yIGhhbmRsaW5nLCBpbmNsdWRpbmcgY29kZSBmcmFnbWVudHMKLQljb250YWluaW5nIHRoZSBlcnJvciBkZWNscyB0aGF0IHdlcmUgaW4gYmZkLWluLmguCi0JUmVtb3ZlIERFRlVOcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLUZyaSBKYW4gMjEgMTQ6MTE6MTYgMTk5NCAgU2VhbiBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmgsIGxpYmxubS5oLCBubG0zMi1hbHBoYS5jIG5sbTMyLWkzODYuYyBubG0zMi1zcGFyYy5jOgotCVRoZSBzcGFyYyAoYW5kIHBvc3NpYmx5IG90aGVyPykgTkxNIGZvcm1hdCByZXF1aXJlcyBhIGRpZmZlcmVudAotCXdheSB0byB3cml0ZSBleHBvcnRzLCBzbyBhZGQgYSB3cml0ZV9leHBvcnQgZmllbGQgdG8gdGhlIGJhY2tlbmQKLQlkYXRhIChhbmQgc2V0IGl0IHRvIE5VTEwgZm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBzcGFyYykuCi0KLUZyaSBKYW4gMjEgMTQ6MTE6MTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN1bm9zLmMgKE1ZKHJlYWRfZHluYW1pY19yZWxvY3MpKTogQ29tcGFyZSBpbmZvLT5keW5yZWwgd2l0aCBOVUxMLAotCW5vdCAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwuICBpbmZvLT5keW5yZWwgaXMgYSBQVFIsIG5vdAotCWEgc3RydWN0IGV4dGVybmFsX25saXN0ICouCi0KLUZyaSBKYW4gMjEgMDk6Mjk6MDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYzogUmVtb3ZlIGVycm9yIHN0cmluZ3MgZm9yIGVycm9ycyByZW1vdmVkIGJlbG93LgotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpLCBiZmQtaW4uaCAoYmZkX2VjKSwKLQlvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IFJlbmFtZQotCWJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24gdG8gbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLgotCU5vbmUgb2YgdGhlIG90aGVyIGJmZCBlcnJvciBuYW1lcyBzdGFydCB3aXRoICJiZmRfZXJyb3IiLgotCVJlbW92ZSBlcnJvcnMgc3ltYm9sX25vdF9mb3VuZCBhbmQgbm9fcmVsb2NhdGlvbl9pbmZvLCB3aGljaCBzZWVtCi0JdG8gYmUgdW51c2VkLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotRnJpIEphbiAyMSAwMToxMTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X2dwX3NpemUpOiBBZGRlZCBzdXBwb3J0IGZvciBFTEYuCi0KLQkqIHN5bXMuYyAoQlNGX0RZTkFNSUMpOiBOZXcgc3ltYm9sIGZsYWcuCi0JKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBQcmludCBpdC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogTmV3IHJlYWRfZHluYW1pY19zeW1ib2xzCi0JYW5kIHJlYWRfZHluYW1pY19yZWxvY3MgZmllbGRzLgotCShzdHJ1Y3QgYW91dGRhdGEpOiBOZXcgZHluYW1pY19pbmZvIGZpZWxkLgotCShvYmpfYW91dF9keW5hbWljX2luZm8pOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvKTogTmV3IHN0cnVjdHVyZS4KLQkoc3Vub3NfcmVhZF9keW5hbWljX2luZm8sIE1ZKHJlYWRfZHluYW1pY19zeW1ib2xzKSwKLQlNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IE5ldyBmdW5jdGlvbnMgdG8gcmVhZCBkeW5hbWljIHN5bWJvbHMKLQlhbmQgcmVsb2NzLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBJZiB0aGUgb2JqZWN0IGlzCi0JZHluYW1pY2FsbHkgbGlua2VkLCBzZXQgU0VDX1JFTE9DIGZvciBib3RoIHRoZSAudGV4dCBhbmQgLmRhdGEKLQlzZWN0aW9ucy4KLQkodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IHNldCBCU0ZfTE9DQUwgZm9yIGFuCi0JdW5kZWZpbmVkIHN5bWJvbC4KLQkodHJhbnNsYXRlX3N5bWJvbF90YWJsZSk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IG9mCi0Jc2x1cnBfc3ltYm9sX3RhYmxlOyBzZXQgdGhlIEJTRl9EWU5BTUlDIGZsYWcgYXBwcm9wcmlhdGVseS4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBSZWFkIGR5bmFtaWMgc3ltYm9scywgaWYgYW55LgotCShOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogUmVhZCBkeW5hbWljIHJlbG9jcywgaWYgYW55LgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IEluY2x1ZGUgZHluYW1pYyByZWxvYyBjb3VudCBpbgotCXJldHVybiB2YWx1ZS4KLQkqIGFvdXRmMS5oIChOQU1FKGFvdXQsc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykpOiBEb24ndCB3cml0ZQotCW91dCBkeW5hbWljIHN5bWJvbHMgb3IgcmVsb2NzIGFnYWluc3QgcmVsb2Mgc3ltYm9scywgc2luY2UgdGhleQotCWFyZSBhbHJlYWR5IGluIHRoZSAudGV4dCBzZWN0aW9uIGFuZCB3ZSB3b3VsZG4ndCBrbm93IHdoZXJlIHRvCi0Jd3JpdGUgdGhlbSBhbnlob3cuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBJbml0aWFsaXplIHJlYWRfZHluYW1pY19zeW1ib2xzIGFuZAotCXJlYWRfZHluYW1pY19yZWxvY3MgZmllbGRzLgotCSogYW91dC10YXJnZXQuaCAoTVkoYmFja2VuZF9kYXRhKSk6IEluaXRpYWxpemUKLQlyZWFkX2R5bmFtaWNfc3ltYm9scyBhbmQgcmVhZF9keW5hbWljX3JlbG9jcyBmaWVsZHMuCi0KLVRodSBKYW4gMjAgMjA6NTc6MjcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvYWxwaGFvc2YuaCAodWludDY0ZV90eXBlLCB1aW50NjRfdHlwZSwgaW50NjRfdHlwZSk6IERlbGV0ZQotCXR5cGVkZWZzLCBzaW5jZSBIT1NUXzY0X0JJVCB3aWxsIHRha2UgY2FyZSBvZiBkZWZpbmluZyB0aGVtIGluCi0JYmZkLmguCi0KLVdlZCBKYW4gMTkgMTc6Mjg6NTkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2FscGhhb3NmLm1oIChIREVGSU5FUyk6IERvbid0IGRlZmluZSBIT1NUXzY0X0JJVCBoZXJlOwotCXRoYXQncyBkZWFsdCB3aXRoIGVsc2V3aGVyZS4KLQkqIGhvc3RzL2FscGhhb3NmLmggKHNwcmludGZfdm1hLCBmcHJpbnRmX3ZtYSk6IE5ldyBtYWNyb3MuCi0JKHVpbnQ2NF90eXBlSElHSCwgdWludDY0X3R5cGVMT1cpOiBDb21tZW50IHdpdGggSE9TVF82NF9CSVQgc28KLQl0aGV5IGdldCBjb3BpZWQgdG8gYmZkLmguCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZCBzb21lIEFscGhhIHJlbG9jYXRpb24KLQl0eXBlcy4gIFJlb3JnYW5pemVkIHNvbWUgb2YgdGhlIGV4aXN0aW5nIG9uZXMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2hvd3RvX3RhYmxlKTogQ29uc3RydWN0IDY0LWJpdCBuZWdhdGl2ZSBvbmUKLQl2YWx1ZXMgaW4gY2FzZSBvZiBjb21waWxhdGlvbiBvbiBhIDMyLWJpdCBtYWNoaW5lLiAgRml4IHBjcmVsCi0JZmllbGRzIG9mIHNvbWUgcmVsb2MgdHlwZXMuCi0JKGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBtb3JlIHJlbG9jYXRpb24gdHlwZXMuCi0KLQkqIGJmZC1pbi5oICh1aW50NjRfdHlwZUhJR0gsIHVpbnQ2NF90eXBlTE9XKTogU3VwcGx5IGRlZmF1bHQKLQlkZWZpbml0aW9ucyB3aGVuIG5vdCBkZWZpbmVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdWludDY0X3R5cGUgaXMKLQlhIGRlZmluZWQgbWFjcm8gb3Igbm90LgotCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBEZWZpbmUgb25seSBpZiBmcHJpbnRmX3ZtYSBpcyBub3QKLQlhbHJlYWR5IGRlZmluZWQuCi0KLVdlZCBKYW4gMTkgMDA6MDI6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IFNldCB0aGUgdHlwZSBvZiBhCi0JQlNGX1dBUk5JTkcgc3ltYm9sIHRvIE5fV0FSTklORy4KLQotVHVlIEphbiAxOCAxNjo0MzoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IEluY3JlbWVudCBzeW1faGFzaCBhcyB3ZWxsIGFzIHAKLQlmb3IgYW4gaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXBkYXRlIHN5bV9oYXNoIHdpdGggdGhlIHRhcmdldCBvZiBhbgotCWluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLiAgSWYgYW4gaW5kaXJlY3Qgc3ltYm9sIGlzIGRlZmluZWQsCi0Jb3V0cHV0IHRoZSBjYWxjdWxhdGVkIHZhbHVlIGFuZCBkb24ndCBvdXRwdXQgdGhlIHRhcmdldCBzeW1ib2wuCi0KLVR1ZSBKYW4gMTggMDM6NTQ6NTkgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogR2l2ZSB3YXJuaW5nIHN5bWJvbHMKLQlhbiAodW51c2VkKSBub256ZXJvIHNlY3Rpb24gdmFsdWUsIG5lZWRlZCBmb3IgY2hlY2sgYmVsb3cuCi0KLU1vbiBKYW4gMTcgMTU6MTI6MDcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLAotCWFvdXRfbGlua19hZGRfc3ltYm9scyk6IFRyZWF0IE5fU0VUW0FCRFRdIHwgTl9FWFQgbGlrZQotCU5fU0VUW0FCRFRdLgotCi1GcmkgSmFuIDE0IDE2OjQ1OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBJZiB0aGVyZSBpcyBhIFNIVF9EWU5BTUlDIHNlY3Rpb24sIHNldAotCXRoZSBEWU5BTUlDIGZsYWcgZm9yIHRoZSBCRkQuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogRG9uJ3QgdHJ5IHRvIHdyaXRlIG91dCBhCi0JQkZEIHdpdGggdGhlIERZTkFNSUMgZmxhZyBzZXQsIHNpbmNlIHdlIGRvbid0IGdlbmVyYXRlIHRoZSBwcm9ncmFtCi0JaGVhZGVyIHRhYmxlIGNvcnJlY3RseS4KLQotRnJpIEphbiAxNCAwMTowNDozNiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBGcmVlIHhfc3ltcCBhdCB0aGUgZW5kCi0Jb2YgdGhlIGZ1bmN0aW9uIHRvIGF2b2lkIHN0b3JhZ2UgbGVhay4KLQotVGh1IEphbiAxMyAyMzowNzozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBBbiBpZmQgY2FuIGJlIC0xLgotCi1UaHUgSmFuIDEzIDEyOjMzOjI3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvKTogUHJvdmlkZSBhIGRlZmF1bHQgc3ltYm9sIGZvcgotCXJlbG9jYXRpb25zIHdoaWNoIGRvbid0IGFjdHVhbGx5IGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wuCi0KLQkqIHNvbS5jIChocHBhX3NvbV9yZWxvYyk6IEFkZCBuZXcgImVycm9yIG1lc3NhZ2UiIGFyZ3VtZW50LgotCi1XZWQgSmFuIDEyIDEzOjM2OjQzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCUVuYWJsZSBnZGIgdG8gd3JpdGUgdG8gY29yZSBmaWxlcyBvbiBtb3JlIGNvcmUgZmlsZSByZWFkZXJzLgotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogIFJlbW92ZSByYW5nZSBjaGVjawotCWZvciBzZWN0aW9uIHNpemUsIGl0IGlzIGFscmVhZHkgZG9uZSBpbiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLQl3aXRoIGJmZF9nZXRfc2VjdGlvbl9zaXplX25vdy4KLQkqIGFpeDM4Ni1jb3JlLmMsIGhwcGFic2QtY29yZS5jLCBocHV4LWNvcmUuYywgaXJpeC1jb3JlLmMsCi0Jb3NmLWNvcmUuYywgcHRyYWNlLWNvcmUuYywgdHJhZC1jb3JlLmMgKCpfc2V0X3NlY3Rpb25fY29udGVudHMpOgotCVVzZSBiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyBpbnN0ZWFkIG9mIGJmZF9mYWxzZS4KLQotV2VkIEphbiAxMiAxNTozMTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jOiBBZGRlZCBpbml0aWFsIGRvY3VtZW50YXRpb24uCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBEb24ndCBleHBlY3Qgc3BhY2UgZm9yCi0Jb3V0cHV0IHJlbG9jYXRpb25zIGlmIHRoZXJlIGFyZW4ndCBhbnkgaW5wdXQgcmVsb2NhdGlvbnMuCi0KLVR1ZSBKYW4gMTEgMTQ6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBTZXQgYV9lbnRyeSBiZWZvcmUgY29tcHV0aW5nCi0JZmlsZSBvZmZzZXRzLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBBIGNvbW1vbiBzeW1ib2wgaXMgU1RUX09CSkVDVCwgbm90Ci0JU1RUX05PVFlQRS4KLQotVHVlIEphbiAxMSAwOToxMDo1NiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIEVMRiwgbm90IENPRkYgZm9yIG04OCotKi1kZ3V4Ki4KLQlDb21iaW5lIG04OGstKi0qIGFuZCBtODgxMTAtKi0qIGNhc2VzIGludG8gbTg4Ki0qLSouCi0KLVR1ZSBKYW4gMTEgMDA6MDc6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZmxpbmsuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gY29tcHJlc3MgYW5kIG1lcmdlIGRlYnVnZ2luZwotCWluZm9ybWF0aW9uLCBhbmQgdG8gd3JpdGUgc29tZSBvZiBvdXQgZGlyZWN0bHkgcmF0aGVyIHRoYW4gc2F2aW5nCi0JaXQgaW4gbWVtb3J5LiAgU2V2ZXJhbCBuZXcgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzLCBhbmQgbmV3Ci0JYXJndW1lbnRzIHRvIGV4aXN0aW5nIGZ1bmN0aW9ucy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBDb21wdXRlCi0Jc3ltX2ZpbGVwb3MgYXMgd2VsbC4KLQkoZWNvZmZfZ2V0X2V4dHIpOiBVc2UgaWZkbWFwIGluc3RlYWQgb2YgaWZkYmFzZS4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY29tcHV0ZSBzeW1fZmlsZXBvcyBoZXJlLgotCU9ubHkgb3V0cHV0IHN5bWJvbHMgaWYgb3V0c3ltYm9scyBpcyBub3QgTlVMTC4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4gZWNvZmZfZGVidWdfaW5mbyBhbmQKLQliZmRfZWNvZmZfZGVidWcgZnVuY3Rpb25zLiAgV3JpdGUgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoZXJlLgotCShlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUpOiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4KLQliZmRfZWNvZmZfZGVidWcgZnVuY3Rpb25zLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogVXNlIGlmZG1hcCByYXRoZXIgdGhhbiBpZmRiYXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBSZWFkIGV4dGVybmFsIHN5bWJvbHMKLQlmaXJzdCwgdG8gcHV0IHRoZW0gaW4gdGhlIGZpcnN0IG1lbW9yeSBidWZmZXIuICBDbGVhciBmZHIgZmllbGQuCi0JKG1pcHNfZWxmX2dldF9leHRyKTogVXNlIHBvaW50ZXIgdG8gdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbC4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IEFkanVzdCBmb3IgY2hhbmdlcyBpbiBiZmRfZWNvZmYgZnVuY3Rpb25zLgotCVByZXNlcnZlIC50ZXh0LCAuZGF0YSBhbmQgLmJzcyBldmVuIGlmIHRoZXkgYXJlIGVtcHR5LiAgU2F2ZQotCXBvaW50ZXIgdG8gdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbCByYXRoZXIgdGhhbiBjb3B5aW5nIGl0LgotCURvbid0IGZyZWUgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMuCi0JKiBsaWJlbGYuaCAoZWxmX3N5bWJvbF90eXBlKTogQ2hhbmdlIG1pcHNfZXh0ciB0byBQVFIuCi0JKiBiZmQtaW4uaCAoYmZkX2Vjb2ZmX2RlYnVnX2luaXQsIGJmZF9lY29mZl9kZWJ1Z19mcmVlKTogRGVjbGFyZS4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyKTogUmVuYW1lIGRlY2xhcmF0aW9uIGZyb20KLQliZmRfZWNvZmZfZGVidWdfbGlua19vdGhlciBhbmQgdXBkYXRlLgotCShiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1Nb24gSmFuIDEwIDIwOjQ2OjUzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSAiQCIgd2hpY2ggZm9sbG93cyBhIGJhY2tzbGFzaC4gIEluCi0JdGhpcyBwb3NpdGlvbiBpdCBqdXN0IGNhdXNlcyBlcnJvcnMsIG5vdCBzdXBwcmVzc2VzIGVjaG9lcy4KLQotTW9uIEphbiAxMCAwOTowNjoyMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogRml4IGhhbmRsaW5nIG9mIExUIGFuZCBSVAotCWZpZWxkIHNlbGVjdG9ycy4KLQotU3VuIEphbiAgOSAwNDozMjoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODYtbmV0YnNkLm10IChTRUxFQ1RfVkVDUyk6IEluY2x1ZGUgaTM4NmJzZF92ZWMuCi0KLUZyaSBKYW4gIDcgMTA6Mjc6MjcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhZGp1c3Rfel9tYWdpYyk6IERvbid0IG1lcmdlIHRoZSBzdGFydCBvZiBic3Mgd2l0aCB0aGUKLQllbmQgb2YgZGF0YSBpZiB0aGV5IGFyZSBub3QgY29udGlndW91cy4KLQotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBDb21tZW50IHRoZSBmaWVsZHMnIG1lYW5pbmdzLgotCi1GcmkgSmFuICA3IDE1OjQwOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IERvbid0IHNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZmxhZwotCWZvciAucmVnaW5mbyBzZWN0aW9uIGhlcmUuCi0JKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgaXQgaGVyZSBpbnN0ZWFkLgotCi1GcmkgSmFuICA3IDEwOjI5OjI3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotICAgIAkqIGJmZC1pbi5oOiAoYmZkX2Jvb2xlYW4pOiBBZGQgd29ya2Fyb3VuZCBmb3Igc3lzdGVtcyB0aGF0IGFsc28KLQlkZWZpbmUgdHJ1ZSBhbmQgZmFsc2UgYXMgZW51bXMuCi0JKEFMTU9TVF9TVERDKTogQWRkIGFzIGFsdGVybmF0aXZlIHRvIF9fU1REQ19fLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogQ29udmVydCBhIFBUUiB0byBGSUxFKi4KLQotVGh1IEphbiAgNiAxNDoyNDo0NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogQ2F0Y2ggdGhlIGNhc2Ugd2hlcmUKLQl0aGVyZSBpcyBubyBvdXRwdXQgc2VjdGlvbi4KLQotVGh1IEphbiAgNiAxNDozNzo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogSWYgd2UgY2FuJ3QgcmVhZCB0aGUgZml4ZWQgaGVhZGVyLAotCWNvdW50IGl0IGFzIGEgd3JvbmcgZm9ybWF0IGVycm9yLCBub3QgYSBzeXN0ZW0gY2FsbCBlcnJvciwgc2luY2UKLQl0aGUgb2JqZWN0IGZpbGUgbWlnaHQgc2ltcGx5IGJlIHRvbyBzbWFsbC4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogQWRkZWQgbmxtMzJfYWxwaGFfdmVjIGluc2lkZSAjaWZkZWYKLQlCRkQ2NC4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBubG0zMi1hbHBoYS5vLgotCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBubG0zMi1hbHBoYS5vLiAgSXQgZGVwZW5kcyBvbiA2NCBiaXQKLQlzdXBwb3J0LCBldmVuIHRob3VnaCBpdCBpcyBmb3IgYW4gQWxwaGEgaW4gMzIgYml0IG1vZGUuCi0JKiBjb25maWd1cmUuaW4gKG5sbTMyX2FscGhhX3ZlYyk6IFNldCB0YXJnZXQ2NCB0byB0cnVlLgotCi0JKiBubG0zMi1nZW4uYywgbmxtNjQtZ2VuLmM6IFJlbW92ZWQuICBBbGwgbmxtIHRhcmdldHMgYXJlCi0JZGlmZmVyZW50LCBzbyB0aGVyZSBpcyBubyBwb2ludCB0byBwcm92aWRpbmcgYSBnZW5lcmljIG9uZS4KLQkqIGxpYm5sbS5oOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yIG5sbV9iYWNrZW5kKGJmZCkgYmVpbmcgTlVMTAotCWluIHRoZSBiYWNrZW5kIGFjY2Vzc29yIG1hY3JvczsgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIHBvc3NpYmxlLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmVtb3ZlZCBubG0zMl9iaWdfZ2VuZXJpY192ZWMsCi0JbmxtNjRfYmlnX2dlbmVyaWNfdmVjLCBubG02NF9saXR0bGVfZ2VuZXJpY192ZWMuCi0JKiBjb25maWd1cmUuaW4gKG5sbTMyX2JpZ19nZW5lcmljX3ZlYywgbmxtMzJfbGl0dGxlX2dlbmVyaWNfdmVjLAotCW5sbTY0X2JpZ19nZW5lcmljX3ZlYywgbmxtNjRfbGl0dGxlX2dlbmVyaWNfdmVjKTogUmVtb3ZlZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcywgYW5kCi0JKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlZCBubG0zMi1nZW4uby4KLQkoQkZENjRfQkFDS0VORFMpOiBSZW1vdmVkIG5sbTY0LWdlbi5vLgotCShDRklMRVMpOiBSZW1vdmVkIG5sbTMyLWdlbi5jIGFuZCBubG02NC1nZW4uYy4KLQotCSogaHAzMDBocHV4LmMgKEFSQ0hfU0laRSk6IERlZmluZSBiZWZvcmUgaW5jbHVkaW5nIGFvdXR4LmguCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBjb25zdHJ1Y3RvciBhbmQKLQliaXRzaXplIGFyZ3VtZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMgKGFvdXR4LmgpLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQWRkIGNvbnN0cnVjdG9yCi0JYW5kIGJpdHNpemUgYXJndW1lbnRzIHRvIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGVjb2ZmLmM6IEZpcnN0IGN1dCBhdCBuZXcgc3R5bGUgb2YgbGlua2VyIGJhY2tlbmQgZm9yCi0JRUNPRkYtLWFkZGVkIGEgYnVuY2ggb2YgZnVuY3Rpb25zLiAgQWxzbzoKLQkoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgZmxhZ3MgZm9yIC5wZGF0YSBhbmQgLnhkYXRhLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBDYWxsIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlci4KLQkoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBHZXQgb3V0IHF1aWNrbHkgaWYgY291bnQgaXMgemVyby4KLQlDaGVjayBlcnJvcnMgYmV0dGVyLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBQdXQgLnhkYXRhIHNlY3Rpb24gaW4gZGF0YSBzZWdtZW50LgotCUNhbGwgZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucy4gIERvbid0IG91dHB1dCByZWxvY3Mgb3IKLQlleHRlcm5hbCBzeW1ib2xzIGlmIG91dHN5bWJvbHMgaXMgTlVMTC4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBDb21wbGV0ZWx5IHJld3JpdHRlbi4KLQkqIGxpYmVjb2ZmLmg6IEluY2x1ZGUgYmZkbGluay5oLgotCShzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIHJlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0JKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZCBzeW1faGFzaGVzIGFuZCBzeW1uZHhfdG9fc2VjdGlvbiBmaWVsZHMuCi0JKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZSBhcyBmdW5jdGlvbiwgbm90IG1hY3JvLgotCShlY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMpOiBDYWxsIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwuCi0JKiBiZmQtaW4uaCAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2hvd3RvX3RhYmxlKTogTWFyayBCUkFERFIgYXMKLQlwYXJ0aWFsX2lucGxhY2UsIGFuZCBzZXQgdGhlIHNyY19tYXNrIHRvIDB4MWZmZmZmLgotCShhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUgZ3Bfd2FybmVkLgotCShhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgcmVsb2NhdGVfc2VjdGlvbiBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3JlZmhpKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIHJlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBDb3JyZWN0ZWQgc2lnbmVkIG92ZXJmbG93Ci0JY2hlY2tpbmcgd2hlbiB0aGVyZSBpcyBhbiBhZGRlbmQuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGFib3J0IHdoZW4gdHJ5aW5nIHRvIGxpbmsKLQlhIG5vbiBhLm91dCBmaWxlLCBqdXN0IHBhc3MgaXQgdG8gX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFdoZW4gZG9pbmcgYSBmaW5hbCBQQyByZWxhdGl2ZSBsaW5rCi0JYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLCBzdWJ0cmFjdCB0aGUgVk1BIG9mIHRoZSBpbnB1dCBzZWN0aW9uLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IFJlbmFtZWQgZnJvbQotCV9iZmRfZ2VuZXJpY19pbmRpcmVjdF9saW5rX29yZGVyIGFuZCBtYWRlIHN0YXRpYy4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBEb24ndCBzd2l0Y2ggb24gbGlua19vcmRlciB0eXBlLCBqdXN0Ci0JY2FsbCBfYmZkX2RlZmF1bHRfbGlua19vcmRlci4KLQkoX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIpOiBIYW5kbGUgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIgdHlwZS4KLQkqIGdlbmxpbmsuaDogUmVtb3ZlZCBkZWNsYXJhdGlvbiBvZgotCV9iZmRfZ2VuZXJpY19pbmRpcmVjdF9saW5rX29yZGVyLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3Qgc3dpdGNoIG9uIGxpbmtfb3JkZXIKLQl0eXBlLCBqdXN0IGNhbGwgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0KLVR1ZSBKYW4gIDQgMjE6MjM6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEJhc2UgdGhlIG5hbWUgb2YKLQl0aGUgY3JlYXRlZCBjb21tb24gc2VjdGlvbiBvbiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiB0aGUgc3ltYm9sCi0JY2FtZSBmcm9tLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IChjYXNlIEJJRyk6IEEgY29tbW9uIHN5bWJvbAotCW11c3QgaGF2ZSBhIHNlY3Rpb24sIHNvIGRvbid0IGJvdGhlciB0byBjcmVhdGUgb25lLgotCi1Nb24gSmFuICAzIDE1OjMyOjE2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoTVkodmVjKSk6IEFkZCBEWU5BTUlDIHRvIG1hc2sgb2Ygb2JqZWN0IGZsYWdzLgotCSogYW91dGYxLmggKE5BTUUoYW91dCxzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6Ci0JSWYgdGhlIERZTkFNSUMgZmxhZyBpcyBzZXQsIHNldCBpdCBpbiB0aGUgZXhlYyBoZWFkZXIuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IElmIHRoZSBvYmplY3QgaXMKLQlkeW5hbWljYWxseSBsaW5rZWQsIHNldCB0aGUgRFlOQU1JQyBmbGFnIGluIHRoZSBCRkQuCi0JKiBsaWJhb3V0LmggKE5fU0VUX0RZTkFNSUMpOiBOZXcgbWFjcm8uCi0JKE5fRFlOQU1JQyk6IEFkZCBtaXNzaW5nIDAgaW4gbWFzay4KLQotTW9uIEphbiAgMyAxMTo0MTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9leHRyKTogRG9uJ3Qgb3V0cHV0IHNlY3Rpb24gc3ltYm9scyBhcwotCWV4dGVybmFsIHN5bWJvbHMuCi0KLQkqIGJmZC1pbi5oLCBoYXNoLmM6IENoYW5nZSBiZmRfaGFzaF9hbGxvY2F0ZSBhcmd1bWVudCBmcm9tIHNpemVfdAotCXRvIHVuc2lnbmVkIGludCwgYmVjYXVzZSBzaXplX3QgbWF5IG5vdCBiZSBkZWZpbmVkIGluIGJmZC5oLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBiZmQtaW4uaCAoYmZkX2dldHtiLGx9W19zaWduZWRfXXsxNiwzMiw2NH0pOiBEZWNsYXJlIGFyZ3VtZW50IHRvCi0JYmUgYSBjb25zdCBwb2ludGVyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmMgKGJmZF9nZXR7YixsfVtfc2lnbmVkX117MTYsMzIsNjR9KTogRGVjbGFyZSBhcmd1bWVudCB0bwotCWJlIGEgY29uc3QgcG9pbnRlci4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IENoYW5nZSBzd2FwIGZ1bmN0aW9uIHBvaW50ZXJzCi0JYWNjb3JkaW5nbHkuCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiBDaGFuZ2Ugc3dhcCBhY2NvcmRpbmdseS4KLQkqIGFpeDM4Ni1jb3JlLmM6IENoYW5nZSBOT19HRVQgYW5kIE5PX0dFVFMgYWNjb3JkaW5nbHkuCi0JKiBocHBhYnNkLWNvcmUuYywgaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLCBvc2YtY29yZS5jLAotCXB0cmFjZS1jb3JlLmMsIHRyYWQtY29yZS5jOiBDaGFuZ2UgTk9fR0VUIGFuZCBOT19TSUdORURfR0VUCi0JYWNjb3JkaW5nbHkuCi0KLQkqIGxpYmJmZC1pbi5oIChzdHJ1Y3QgYXJ0ZGF0YSk6IEFkZGVkIHRkYXRhIGZpZWxkLgotCShfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSk6IERlY2xhcmUuCi0JKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKTogRGVjbGFyZS4KLQkoX2JmZF9zbmFyZl9hcl9oZHIpOiBSZW5hbWVkIGZyb20gc25hcmZfYXJfaGRyLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBhcmNoaXZlLmM6IENsZWFuZWQgdXAgc29tZSBtb3JlLgotCShfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJbml0aWFsaXplCi0JcG9pbnRlciBlbGVtZW50cyBvZiBhcnRkYXRhLgotCShfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSk6IFJlbmFtZWQgZnJvbSBhZGRfYmZkX3RvX2NhY2hlLgotCShfYmZkX3NuYXJmX2FyX2hkcik6IFJlbmFtZWQgZnJvbSBzbmFyZl9hcl9oZHIuCi0JKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKTogUmVuYW1lZCBmcm9tIGdldF9lbHRfYXRfZmlsZXBvcy4KLQkoZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lLCBiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUsCi0JYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0sIGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogTWFkZSBzdGF0aWMuCi0JKiBlY29mZi5jOiBTb21lIGNvbW1lbnQgY2hhbmdlcy4KLQkoZWNvZmZfc2x1cnBfYXJtYXApOiBIYW5kbGUgcmVuYW1lIG9mIHNuYXJmX2FyX2hkci4gIFNldAotCWFyZGF0YS0+dGRhdGEgdG8gcmF3X2FybWFwLgotCShlY29mZl9hcmNoaXZlX3ApOiBJbml0aWFsaXplIHBvaW50ZXIgZWxlbWVudHMgb2YgYXJ0ZGF0YS4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKTogSGFuZGxlIHJlbmFtZSBvZgotCWFkZF9iZmRfdG9fY2FjaGUuCi0KLQkqIGhhc2guYzogQWRkZWQgc29tZSBkb2N1bWVudGF0aW9uLgotCi1Nb24gSmFuICAzIDExOjA5OjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oLCBuZXRic2QzODYuYzogUmVwbGFjZSBOT19TV0FQX01BR0lDIHdpdGggU1dBUF9NQUdJQywKLQlhbmQgZG8gdGhlIHN3YXBwaW5nIGhlcmUgcmF0aGVyIHRoYW4gY2FsbGluZyBudG9obCBmcm9tIHRoZSBOXyoKLQltYWNyb3MuICBUaGlzIGNsZWFucyB1cCBhc3N1bXB0aW9ucyBhYm91dCB0aGUgc2l6ZSBvZiBhIGhvc3QgbG9uZywKLQl0aGUgZXhpc3RlbmNlIHRvIG50b2hsLCBldGMuCi0KLVNhdCBKYW4gIDEgMTM6NTA6MDUgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgVlNUYSBtaWNyby1rZXJuZWwuIEl0IGN1cnJlbnRseSB1c2VzCi0JaTM4Ni1hb3V0LgotCi1TYXQgSmFuICAxIDEwOjE4OjU0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4Nm1hY2gzLmggKEhPU1RfU0VHTUVOVF9TSVpFKTogRml4IHZhbHVlLgotCSogaTM4Nm1hY2gzLmMgKFNFR01FTlRfU0laRSk6IEZpeCB2YWx1ZS4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05MTkzCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nLTk2OTcgYi9iZmQvQ2hhbmdlTG9nLTk2OTcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjJjOGMuLjAwMDAwMDAKLS0tIGEvYmZkL0NoYW5nZUxvZy05Njk3CisrKyAvZGV2L251bGwKQEAgLTEsNjcxMSArMCwwIEBACi1UdWUgRGVjIDMwIDEyOjQ1OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSWYgLUJzeW1ib2xpYywgZG9uJ3QKLQlhbGxvY2F0ZSBzcGFjZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGlzCi0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvbid0IGNvcHkgYSBQQwotCXJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlmaWxlLgotCi1Nb24gRGVjIDI5IDE4OjAyOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gSm9uYXRoYW4gU3RvbmUgPGpvbmF0aGFuQERTRy5TdGFuZm9yZC5FRFU+OgotCSogY29uZmlnLmJmZCAobWlwcy1kZWMtbmV0YnNkKik6IEFkZCBFQ09GRiB2ZWN0b3JzIHRvCi0JdGFyZ19zZWx2ZWNzLgotCShtaXBzKmVsLSotbmV0YnNkKik6IExpa2UgbWlwcy1kZWMtbmV0YnNkKi4KLQkobWlwcyotKi1uZXRic2QqKTogTmV3IHRhcmdldC4KLQotTW9uIERlYyAyOSAxNzoxMzoyOCAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UKLQlmcm9tICJ1bmRlZmluZWQgdmVyc2lvbiBuYW1lIiB0byAidW5kZWZpbmVkIHZlcnNpb25lZCBzeW1ib2wKLQluYW1lIi4KLQotTW9uIERlYyAyOSAxMTo0MToxNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8gZnJvbSBwcmV2aW91cwotCWRlbHRhLgotCi1UdWUgRGVjIDIzIDE3OjAxOjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IC5yZWxvYyBzZWN0aW9uIHRvIGJlCi0Jc2hhcmVkLiAgU2V0IHN0YWIqIHNlY3Rpb25zIHRvIGJlIHNoYXJlZCBhbmQgcmVhZC4gIFNldCAucnNyYwotCXNlY3Rpb24gdG8gYmUgcmVhZCBhbmQgc2hhcmVkLgotCi1Nb24gRGVjIDIyIDEzOjIwOjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBkd2FyZjIubG8uCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZHdhcmYyLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29mZi1hcm0uYzogRG9uJ3QgaW5jbHVkZSBvYnN0YWNrLmguCi0KLU1vbiBEZWMgMjIgMTM6MDQ6MzMgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuYmZkIChpWzM0NTZdODYqLWdvMzItcnRlbXMqKTogRml4IHRvIGJlIHRoZSBzYW1lIGFzCi0JaVszNDU2XTg2LWdvMzIuCi0KLVRodSBEZWMgMTggMTY6MDE6MjUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIGdldCBAU0hFTExAIHN1YnN0aXR1dGVkLgotCi1XZWQgRGVjIDE3IDA5OjQ1OjA5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBPbmx5IGxvb2sgYXQgc2VjdGlvbgotCW93bmVyIGlmIHRoZXJlIGlzIG9uZS4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGYWlsIGlmIHRoZXJlIGlzIG5vdAotCWVub3VnaCByb29tIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotCi1UdWUgRGVjIDE2IDA4OjA5OjU2IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBDYWxsCi0JX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgZmlyc3QuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBTYW1lLgotCSogZHdhcmYyLmM6IE5ldyBmaWxlOyBpbXBsZW1lbnQgX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUuCi0KLU1vbiBEZWMgMTUgMTY6MDg6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9tYWNoX20zMnIuCi0KLU1vbiBEZWMgMTUgMTY6MTE6MjIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUpOiBEZWZpbmUgaWYgSTk2MCBub3QgZGVmaW5lZC4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBVc2UgQUxJR05fU0VDVElPTlNfSU5fRklMRQotCXRvIGRlY2lkZSB3aGVuIHRvIGFsaWduIHRoZSBmaWxlIHNlY3Rpb25zIGZvciBwYWdpbmcuCi0JKiBjb2ZmY29kZS5oIChBTElHTl9TRUNUSU9OU19JTl9GSUxFKTogVW5kZWZpbmUgZm9yIFRJQzgwQ09GRi4KLQotTW9uIERlYyAxNSAxNTowMToxNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX29iamVjdF9wKTogTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiAgTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiAgTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6ICBOZXcgRnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wKTogUG9pbnQgdG8gbTMycl9vYmplY3RfcC4KLQkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFBvaW50IHRvCi0JbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4KLQkoYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBQb2ludCB0bwotCW0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KLQkoYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KLQltMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLgotCShiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogUG9pbnQgdG8KLQltMzJyX2VsZl9zZXRfcHJpdmF0ZV9iZmRfZGF0YS4KLQkoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KLQltMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhLgotCi0KLQkqIGJmZC1pbjIuaCAoYmZkX21hY2hfbTMycik6IEFkZCBpZGVudGlmaWVyIGZvciBNMzJSIGFyY2hpdGVjdHVyZQotCW1hY2hpbmVzLgotCi1GcmkgRGVjIDEyIDExOjMwOjI4IDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IE9ubHkgYnVpbGQgbGliYmZkIHNoYXJlZCBpZiAtLWVuYWJsZS1zaGFyZWQncyB2YWx1ZQotCXdhcyBgeWVzJywgb3Igd2FzIHNldCB0byBgKmJmZConLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBOT1RFOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBmaXhlZCBpbiBsaWJ0b29sL2xpYnRvb2wubTQsIHRoZQotCW9yaWdpbmFsIHNvdXJjZSBvZiB0aGlzIGJpdCBvZiBjb2RlLiAgSXQncyBub3QgY2xlYXIgd2hhdCB0aGUgYmVzdCBmaXgKLQl3b3VsZCBiZSwgdGhvdWdoLgotCi1UaHUgRGVjIDExIDE3OjQ4OjExIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogQWx3YXlzIGluaXQgdWRhdGEucCBzbwotCXRoYXQgdGhlIGdlbmVyaWMgcmVsYXhhdGlvbiBjb2RlIGNhbiBmdW5jdGlvbiB3aGVuIGlucHV0IGFuZCBvdXRwdXQKLQlmaWxlIGZvcm1hdHMgYXJlIG1pc21hdGNoZWQuCi0KLVRodSBEZWMgMTEgMDE6MDI6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRm9yIGEgbG9hZGFibGUKLQlzZWN0aW9uLCBtYWtlIHN1cmUgdGhhdCB0aGUgbG9hZCBhZGRyZXNzIGlzIGNvcnJlY3QgcmVsYXRpdmUgdG8KLQl0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IHBsdXMgdGhlIHNpemUgb2YgdGhlIHNlZ21lbnQgc28KLQlmYXIuCi0KLQkqIGNvZmZjb2RlLmggKF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bik6IE1ha2Ugc3RhdGljLgotCShfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBMaWtld2lzZS4KLQotV2VkIERlYyAxMCAyMzozNzoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIGEgcmVsb2NhdGVhYmxlIGxpbmsgaW4KLQl3aGljaCBhIHJlbG9jYXRpb24gcmVmZXJzIHRvIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLgotCi1XZWQgRGVjIDEwIDExOjE1OjU1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGJmZF9hcm1fY29mZl9maW5hbF9saW5rKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0KTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4pOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGxpYmNvZmYuaCAoc3RydWN0IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGRzOgotCV9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gYW5kCi0JX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdC4gIEFkZCBuZXcgbWFjcm9zOgotCWJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bigpIGFuZAotCWJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCgpLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEluc2VydCBjYWxscyB0bwotCWJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bigpIGFuZAotCWJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCgpLgotCi0JKiBjb2ZmY29kZS5oOiBBZGQgdHdvIG5ldyBmaWVsZHMgdG8gYmZkX2NvZmZfYmFja2VuZF9kYXRhCi0Jc3RydWN0dXJlOiBfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIGFuZAotCV9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQuICBBZGQgZGVmYXVsdCBpbml0aWFsaXNlcnMgZm9yCi0JdGhlc2UgZmllbGRzLiAgQWRkIG92ZXJyaWRhYmxlIGFsaWFzZXMgZm9yIHRoZSBjb2ZmIHN3YXAgZnVuY3Rpb25zCi0JaW4gdGhlIGJhY2tlbmQgZGF0YSBzdHJ1Y3R1cmUuCi0KLQkqIGVsZjMyLXY4NTAuYzogVXBkYXRlIHdpdGggcGF0Y2hlcyBmcm9tIHRoZSBicmFuY2ggdG8gZml4Ci0JSEkxNl9TL0xPMTYgcmVsb2MgcGFpcnMuCi0KLVdlZCBEZWMgMTAgMTQ6MDY6NDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydAotCVJFTEEgcmVsb2NhdGlvbnMuCi0JKFVTRV9SRUwpOiBEb24ndCBkZWZpbmUgYW55IG1vcmUsIHN3aXRjaCB0byB1c2luZyBSRUxBCi0JcmVsb2NhdGlvbnMuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIGFzIGQzMHZfaW5mb190b19ob3d0b19yZWxhLgotCi1UdWUgRGVjICA5IDExOjM3OjUzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbWlwcyopOiBEZWZpbmUuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBGb3IgMzAwMCBhbmQgNDAwMCByZXBsYWNlIG1hZ2ljIGNvbnN0YW50IHdpdGgKLSAJbWFjcm8uCi0KLQkqIGNwdS1taXBzLmMgKE4pOiBEZWZpbmUuCi0JKGJmZF9taXBzX2FyY2gsIGFyY2hfaW5mb19zdHJ1Y3QpOiBSZS13cml0ZSB1c2luZyBtYWNybyBOLCByZXBsYWNlCi0gCW51bWJlcnMgd2l0aCBiZmRfbWFjaF9taXBzKiBtYWNyb3MuCi0KLUZyaSBEZWMgIDUgMTE6MTM6NDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24sCi0Jdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCByZWxvYyBhZGRlbmQgaGFuZGxpbmcuCi0JKHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiwgdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcsCi0Jdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rLCB2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vaywKLQl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkciwgdjg1MF9lbGZfZmFrZV9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbnMKLQl0byBjcmVhdGUgYW5kIGhhbmRsZSBzcGVjaWFsIGNvbW1vbiBzZWN0aW9ucy4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBISTE2IGFuZCBISTE2X1MgcmVsb2NhdGlvbnMKLQl3aGljaCBoYXZlIGRhdGEgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBEZWMgIDIgMTA6MjY6MTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBSZXZlcnQgYmFjayB0byAnXycKLQkoVVNFUl9MQUJFTF9QUkVGSVgpOiBSZXZlcnQgYmFjayB0byAnXycKLQotCSogY29uZmlnLmJmZCAodGFyZ19jcHUpOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgdGFyZ2V0LgotCi1Nb24gRGVjICAxIDIwOjI0OjE4IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi1zaC5jIChzaF9jb2ZmX2hvd3Rvcyk6IEFkZCBSX1NIX1NXSVRDSDggZW50cnkuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgUl9TSF9TV0lUQ0g4LgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQotV2VkIE5vdiAyNiAxNDoxMzozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IENoYW5nZWQgdG8gbWF0Y2ggZGVmaW5pdGlvbiBpbgotCWdjYy9jb25maWcvYXJtL3NlbWkuaAotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFkZCBBUk0gYW5kIFRodW1iIHN5bWJvbAotCWNsYXNzZXMuCi0KLVN1biBOb3YgMjMgMTY6MDI6NTggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBmcmVlYnNkLmggKFNXQVBfTUFHSUMpOiBSZWFkIG1hZ2ljIG51bWJlciBsaXR0bGUgYW5kIG5vdCBiaWcKLSAJZW5kaWFuLgotCi1XZWQgTm92IDI2IDA5OjMwOjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IE9ubHkgc2V0IHByaXZhdGUgZmxhZ3MgZm9yIG5vbgotCVBFIEFSTSBwb3J0cy4KLQotVHVlIE5vdiAyNSAxNTozMzoyMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQWxzbyBpZ25vcmUgTkVWRVJfTE9BRAotCXNlY3Rpb25zLgotCi1UdWUgTm92IDI1IDEwOjU1OjM2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG8gbm90Ci0JY29tcGxhaW4gaWYgaW5vdXQgYW5kIG91dHB1dCBmb3JtYXRzIGRpZmZlci4KLQotVHVlIE5vdiAyNSAxMToyNjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSB0ZWtoZXgubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IFJlbW92ZSB0ZWtoZXguYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBzcmMvTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBjdXJyZW50Ci0JYXV0b21ha2UgYW5kIGF1dG9jb25mLgotCi0JKiBjb2ZmLWFybS5jIChhcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zKTogRml4IHR5cG8KLQkoQ09GRl9XSVRIX1BSIHRvIENPRkZfV0lUSF9QRSkuCi0KLU1vbiBOb3YgMjQgMTU6NDc6NDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogTWFrZSB2YXJpYWJsZXMgYW5kIHNvbWUgZnVuY3Rpb25zIHN0YXRpYywgc28gdGhhdAotCXRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQgaW4gbXVsdGlwbGUgb2JqZWN0IGZpbGVzLgotCShjb2ZmX2FybV9iZmRfZmluYWxfbGluayk6IEZpeCBtaW5vciBidWcuCi0KLVNhdCBOb3YgMjIgMTU6MTY6MDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIFBJQyBhbmQgQVBDUy1GTE9BVCB0eXBlIGJpbmFyaWVzLgotCi0JKiBjb2ZmY29kZS5oOiBBZGQgc3VwcG9ydCBmb3IgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMuCi0KLVNhdCBOb3YgMjIgMTY6MDY6NTYgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGV2YXgtZW1oLmMgKF9iZmRfZXZheF93cml0ZV9lbWgpOiBVc2UgYWxsb2NhIGluc3RlYWQgb2Ygc3RyZHVwLgotCi1TYXQgTm92IDIyIDEyOjI5OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSBkZWZpbmVkCi0Jc3ltYm9sLCBzZXQgaXQgdG8gdW5kZWZpbmVkLCBub3QgbmV3LgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3Qga2lsbCBMQUJFTAotCXJlbG9jcy4KLQotRnJpIE5vdiAyMSAxNDoxNDoyMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X3NlY3Rpb24pOiBGb3JjZSBzaWduIGV4dGVudGlvbiBvZiBVU0VTIHJfb2Zmc2V0LgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBraWxsIExBQkVMIHJlbG9jcy4KLQotTW9uIE5vdiAxNyAxNTowODozOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IEZpeCB0eXBvLgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVNhdCBOb3YgMTUgMTU6MzY6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBDYXN0IHNlY29uZCBhcmcgb2YKLQliZmRfaF9nZXRfKiBjYWxscyB0byAiYmZkX2J5dGUgKiIuCi0KLVR1ZSBOb3YgMTEgMTA6Mzc6MjMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZAotCSJtb3ZtX3N0YWNrX3NpemUiLgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5jbHVkZSBzdGFjayBzcGFjZSBmb3IgcmVnaXN0ZXIgc2F2ZXMKLQlpbiB0aGUgaW1tOCBmaWVsZCBvZiBhICJjYWxsIiBpbnN0cnVjdGlvbi4KLQkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogRGV0ZXJtaW5lIGhvdyBtdWNoIHN0YWNrIGlzIGFsbG9jYXRlZCBieQotCXRoZSBtb3ZtIGluc3RydWN0aW9uLiAgRml4IHR5cG8uCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG1vdm1fc3RhY2tfc2l6ZS4KLQotTW9uIE5vdiAxMCAxNDozMjo0MCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IERvbid0IGNyYXNoIGlmCi0JYSB2ZXJzaW9uIGRlcGVuZGVuY3kgY291bGQgbm90IGJlIGZvdW5kLgotCi1UdWUgTm92ICA0IDEyOjA1OjU2IDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tOiBHZXQgdmVyc2lvbiBpbmZvIGZyb20gY29uZmlndXJlLmluCi0KLUZyaSBPY3QgMjQgMTE6MTU6NTggMTk5NyAgSmFrdWIgSmVsaW5layAgPGpqQHN1bnNpdGUubWZmLmN1bmkuY3o+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOgotCU5ldyBmdW5jdGlvbi4gQXZvaWQgbWl4aW5nIFVTMSBhbmQgSEFMIFIxIGNvZGUuCi0JU2V0IHJlc3VsdGluZyBtZW1vcnkgb3JkZXJpbmcgdG8gdGhlIHN0cm9uZ2VzdCBvbmUgdXNlZC4KLQkoc3BhcmM2NF9lbGZfb2JqZWN0X3ApOiBTZXQgYmZkX21hY2ggY29ycmVjdGx5LgotCi1UaHUgT2N0IDIzIDE0OjA5OjMzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogQWRkIFVBNjQgJiBVQTE2LgotCShzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MpOiBIYW5kbGUgdGhlbS4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLiAgQmVmb3JlIGVtaXR0aW5nIGEgZHluIHJlbG9jLAotCWNoZWNrIGFsaWdubWVudCBhbmQgdHJhbnNtdXRlIFJfU1BBUkNfeDwtPlJfU1BBUkNfVUF4LgotCi1UaHUgT2N0IDIzIDAwOjUzOjE0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLWxpbnV4Kik6IFVzZSB0cmFkLWNvcmUgYW5kIC4uLgotCSogaG9zdHMvc3BhcmNsaW51eC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyMyAwMDoyNToyOSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgcGx0X2FsaWdubWVudCBtZW1iZXIuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFNldCAuZ290IGFsaWdubWVudCBiYXNlZAotCW9uIGFyY2hfc2l6ZS4KLQkoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZSBmb3IgLnJlbCogc2VjdGlvbnMuCi0JU2V0IC5wbHQgYWxpZ25tZW50IGZyb20gbmV3IHBsdF9hbGlnbm1lbnQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHZlcnNpb24gc2VjdGlvbgotCWFsaWdubWVudCB0byBMT0dfRklMRV9BTElHTi4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50KTogUHJvdmlkZSBkZWZhdWx0LgotCShlbGZYWF9iZWQpOiBJbml0IHBsdF9hbGlnbm1lbnQuCi0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcywKLQlzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucywKLQlzcGFyYzY0X2VsZl9hZGp1c3RfZHluaW5keCwgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotCXNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9ucy4KLQkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBGaXggYSBmZXcgbmFtZSBzdHJpbmdzLgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IE5ldyBkZWZpbml0aW9uLgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHNoYXJlZCBsaWJyYXJpZXMuCi0KLQkqIGVsZjY0LXNwYXJjLmMgKHN0cnVjdCBwbHRfdGVtcGxhdGUsIHBsdF8qX2hlYWRlciwgcGx0XypfZW50cnksCi0Jc3BhcmM2NF9lbGZfYnVpbGRfcGx0X2VudHJ5LCBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOgotCVBMVCBkZWZpbml0aW9ucyBzcGFyYzY0LWxpbnV4IG9yaWdpbmFsbHkgY2hvb3NlLiAgVGhlc2Ugd2lsbCBnbwotCWF3YXkgc29vbiBpbiBmYXZvdXIgb2YgdGhlIG9mZmljaWFsIGFiaSBkZWZpbml0aW9ucy4KLQotV2VkIE9jdCAyMiAxNjowODo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoY29mZl9zbWFsbF9vYmplY3RfcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc21hbGxfbmV3X3NlY3Rpb25faG9vayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUpOiBOZXcgc3RhdGljIGNvbnN0IHN0cnVjdHVyZS4KLQkoY29mZl9zbWFsbF9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KLQkoY29mZl9zbWFsbF9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERlZmluZS4KLQkoY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkoY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOiBEZWZpbmUuCi0JKHNoY29mZl9zbWFsbF92ZWMpOiBOZXcgc3RhdGljIHN0cnVjdHVyZS4KLQkoc2hsY29mZl9zbWFsbF92ZWMpOiBOZXcgc3RhdGljIHN0cnVjdHVyZS4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQKLQlzaGxjb2ZmX3NtYWxsX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKHNoLSotZWxmKik6IEFkZCBzaGNvZmZfc21hbGxfdmVjIGFuZAotCXNobGNvZmZfc21hbGxfdmVjIHRvIHRhcmdfc2VsdmVjcy4KLQkoc2gtKi0qKTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzaGNvZmZfc21hbGxfdmVjIGFuZCBzaGxjb2ZmX3NtYWxsX3ZlYyBjYXNlcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIE9jdCAyMCAxNTowMToyNyAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZXZheC1lZ3NkLmM6IFdlYWsgc3ltYm9scyBhcmUgZ2xvYmFsLgotCi0JKiBldmF4LWVtaC5jOiBVc2UgcHJvcGVyIGNhc3RzLgotCi0JKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBSZW1vdmUgdW5uZWVkZWQgdW5hbWUuCi0KLQkqIGV2YXgtZWdzZC5jOiBTZWN0aW9uIG5hbWVzIGFuZCBzeW1ib2xzIGhhdmUgZGlmZmVyZW50Ci0JbGVuZ3RoIHJlc3RyaWN0aW9ucy4gQWRkIGxlbmd0aCBwYXJhbWV0ZXIgdG8KLQlfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sLgotCSogZXZheC1ldGlyLmM6IExpa2V3aXNlLgotCSogZXZheC1taXNjLmMgKF9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wpOiBBZGQgbGVuZ3RoCi0JcGFyYW1ldGVyLgotCSogZXZheC5oIChFT0JKX1NfQ19TRUNTSVopOiBEZWZpbmUuCi0KLQkqIGV2YXgtYWxwaGEuYzogUmVtb3ZlIGR1cGxpY2F0ZSB0ZXN0LgotCi0JKiBldmF4LWVtaC5jOiBTWVMkIGZ1bmN0aW9ucyBhcmUgdXBwZXItY2FzZS4KLQotCSogZXZheC1lZ3NkLmM6IENyZWF0ZSBzZXBhcmF0ZSBzZWN0aW9ucyBmb3IgY29tbW9uIHN5bWJvbHMuCi0JKiBldmF4LWV0aXIuYzogRG9uJ3Qgb3V0cHV0IGNvbW1vbiBzZWN0aW9uLgotCSogZXZheC5oOiBCdW1wIHVwIHNlY3Rpb24gY291bnQuCi0KLQkqIGNvbmZpZ3VyZS5jb206IFVzZSA2NGJpdCBpbnRlZ2VycyB3aXRoIERFQyBDLgotCi0JKiBldmF4LWVnc2QuYzogTWFrZSBzZWN0aW9uIGZsYWdzIGRlYyBjIGNvbXBhdGlibGUuCi0KLU1vbiBPY3QgMjAgMDk6Mzg6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAobm9ybWFsaXplKTogRGVsZXRlIGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IE5ldyBwYXJhbWV0ZXIgZWxlbmd0aC4gIEFsbCBjYWxsZXJzCi0JY2hhbmdlZC4gIFVzZSBwYXNzZWQgaW4gZWxlbmd0aCB0byBkZXRlcm1pbmUgc2l6ZSBvZiB0aGUgZXh0ZW5kZWQKLQluYW1lIHRhYmxlIGluc3RlYWQgb2YgY29tcHV0aW5nIGl0IGFnYWluLgotCi1TdW4gT2N0IDE5IDIzOjM2OjIxIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSB8PSBub3QgPSB0byBzZXQKLQlJTUFHRV9TQ05fTUVNX1JFQUQgZm9yIGFuIHVucmVjb2duaXplZCBzZWN0aW9uLgotCi1TdW4gT2N0IDE5IDIxOjA0OjU2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogQWNjb3VudCBmb3IgdHJhaWxpbmcKLQknLycgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLUZyaSBPY3QgMTcgMDA6MDQ6MTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBGb3IgZXhwbGljaXRseSB2ZXJzaW9uZWQKLQlzeW1ib2xzLCBjaGVjayBnbG9iYWxzIGxpc3QgYmVmb3JlIG1hdGNoaW5nIG9uIGxvY2Fscy4KLQotVGh1IE9jdCAxNiAwODoxNzowNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCxwZV9wcmludF9pZGF0YSk6IEZpeCBtYW5nbGVkCi0JcGF0Y2guCi0KLVdlZCBPY3QgMTUgMTM6NDU6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX21rb2JqZWN0X2hvb2spOiBTZXQgRExMIGZsYWcuCi0JKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IERMTCBmbGFnLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUKLQlmb3IgLnN0YWIqIHNlY3Rpb25zLiAgUmVwbGFjZSBzdHJsZW4gb2YgY29uc3RhbnQgc3RyaW5ncyB3aXRoCi0JbnVtYmVyLgotCi1UdWUgT2N0IDE0IDE1OjQyOjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIHRvCi0JbWVyZ2UgZ290IGFuZCByZWxvYyBlbnRyaWVzIGZyb20gaW5kIHN5bXMgdG8gdGhlaXIgdGFyZ2V0LgotCShlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IENhbGwgaXQuCi0JKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IE9wZXJhdGUgb24gdGhlIHRhcmdldCBvZiBpbmRpcmVjdCBzeW1ib2xzLgotCShlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cyk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogTGlrZXdpc2UuCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBCYWNrIG91dCBISidzIGNoYW5nZSwKLQlhcyBpdCBpcyBpbnN1ZmZpY2llbnQgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9uIGNoYW5nZXMgYXMgd2VsbC4KLQotTW9uIE9jdCAxMyAyMzoxMDowOCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IEFsbG93IGZvciBSRUxBVElWRQotCXJlbG9jcyBmb3Igc3ltYm9scyBpbiBzaGxpYnMgdGhhdCBoYXZlIGJlZW4gZm9yY2VkIGxvY2FsLgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogT3V0cHV0IFJFTEFUSVZFcyBpbiAuZ290IGZvciBzYW1lLgotCi1Nb24gT2N0IDEzIDIxOjI0OjA0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgdGhlCi0JZ290X2VudGllcyBvZiB0aGUgZGVmYXVsdCBzeW1ib2wgZm9yIHRoZSBkZWZhdWx0IHZlcnNpb25lZAotCXN5bWJvbC4gIFBhdGNoIGZyb20gaGpsQGdudS5haS5taXQuZWR1LCBtb2RpZmllZCBub3QgdG8gdXNlCi0JYWxsb2NhIGluIHRoZSBsb29wLgotCi1Nb24gT2N0IDEzIDE3OjM3OjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IE9ubHkgdXNlIHRoZSBib3R0b20KLQkyNCBiaXRzIG9mIHRoZSBQQyB3aGVuIGNvbXB1dGluZyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0KLUZyaSBPY3QgMTAgMTY6MDE6MzAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6Ci0JQ29ycmVjdCB2YWx1ZSBmb3IgbWF4aW11bSBwb3NpdGl2ZSAyMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBQcmV2ZW50IG92ZXJmbG93IGZyb20gSEkxNl9TIGFuZAotCUhJXzE2IHJlbG9jYXRpb25zLiAgQ29ycmVjdCBiaXQgYWRqdXN0bWVudCBpbiBUREEgb2Zmc2V0cy4KLQotVGh1IE9jdCAgOSAxNjo0MzozOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyY19lbGZfe2hpeDIyLGxveDEwfV9yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogVXNlIHRoZW0gZm9yIEhJWDIyLExPWDEwIHJlbG9jcy4KLQotV2VkIE9jdCAgOCAxMTozODo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZjb3JlLmggKGJmZF9wcnN0YXR1cyk6IFBlZGFudGljbHksIGFsaWdubWVudF9wb3dlciBzaG91bGQKLQliZSBMT0dfRklMRV9BTElHTi4KLQotV2VkIE9jdCAgOCAxMTozNjowMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBNaXNzZWQgb25lIGFscGhhKiBjaGFuZ2UuCi0KLVR1ZSBPY3QgIDcgMTM6MDA6MTcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW1vdmUgQkZENjQgc3VwcG9ydC4KLQkqIGVsZjY0LXNwYXJjLmMgKFNQQVJDNjRfT0xEX1JFTE9DUyk6IFVuZGVmLgotCShNSU5VU19PTkUpOiBOZXcgbWFjcm8uCi0JKHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIERJU1A2NCxQTFQ2NCxISVgyMixMT1gxMCwKLQlINDQsTTQ0LEw0NCxSRUdJU1RFUi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogTGlrZXdpc2UuICBNYXAgQkZEX1JFTE9DX0NUT1IgdG8gUl9TUEFSQ182NC4KLQkoaW5pdF9pbnNuX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IFVzZSBpdC4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBlbnRyaWVzIGZvciBPTE8xMCxISVgyMixMT1gxMC4KLQotVHVlIE9jdCAgNyAxMTo0MDozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jIChzb21fY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBSZW1vdmUgc3RhdGljCi0JZnVuY3Rpb24sIGFuZCBkZWZpbmUgYXMgbWFjcm8gaW5zdGVhZC4KLQotRnJpIE9jdCAgMyAxNDowMjoxNyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBDaGFuZ2UgYWxwaGEtKi0qIHRvIGFscGhhKi0qLSo7IGNvbmZpZy5ndWVzcyBub3cKLQlyZWNvZ25pemVzIGFscGhhZXY1IGV0Yy4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBMaWtld2lzZS4KLQotRnJpIE9jdCAgMyAxMToyMzo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlNYWtlIGxkIC1zIHdvcmsgb24gQUlYOgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBjcmVhdGUgdGhlIC5kZWJ1ZwotCXNlY3Rpb24gaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCB0aGUgLmRlYnVnIHNlY3Rpb24KLQlzaXplIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgU0VDX1JFTE9DIG9yIHJlbF9maWxlcG9zLAotCWFuZCBkb24ndCB3cml0ZSBvdXQgcmVsb2NzLCBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNldCB1cCByZWxvYyBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogRG9uJ3Qgd3JpdGUgb3V0IHN5bWJvbCBvciByZWxvYyBpZiB3ZQotCWFyZSBzdHJpcHBpbmcuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgaW5jbHVkZSBlbGYubG8gYWdhaW4gZm9yIEVMRiB0YXJnZXRzOyBpdCdzCi0JYWx3YXlzIGluIHRoZSBsaWJyYXJ5IGFueWhvdy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBlbGYzMi1zcGFyYy5jIChzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IENhc3QgdG8gYmZkX2J5dGUgKiwgbm90Ci0JY2hhciAqLCB3aGVuIGNhbGxpbmcgYmZkX2dldF8zMiBhbmQgYmZkX3B1dF8zMi4KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBDYXN0IGNvbnRlbnRzIHRvIGNoYXIgKgotCXdoZW4gY2FsbGluZyBzdHJjcHkuCi0KLVRodSBPY3QgIDIgMTY6MTU6NTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogTmV3IGZ1bmN0aW9uLgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogVXNlIGl0LgotCShCRkRfUkVMT0NfU1BBUkNfe0RJU1A2NCxQTFQ2NH0pOiBOZXcgcmVsb2NzLgotCShCRkRfUkVMT0NfU1BBUkNfe0hJWDIyLExPWDEwLEg0NCxNNDQsTDQ0LFJFR0lTVEVSfSk6IE5ldyByZWxvY3MuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotVGh1IE9jdCAgMiAxMzoxNzoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXQgSU1BR0VfU0NOX01FTV9SRUFEIGZvciBhbgotCXVucmVjb2duaXplZCBzZWN0aW9uLiAgRnJvbSBKb24gVGhhY2tyYXkgPGpvbnRAaGFybGVxdWluLmNvLnVrPi4KLQotV2VkIE9jdCAgMSAxNDowMzo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICgkKEJGRF9IKSk6IENoYW5nZSBzdG1wLWJmZC5oIHRvIHN0bXAtYmZkLWguCi0gCShzdG1wLWJmZC1oKTogUmVuYW1lIGZyb20gc3RtcC1iZmQuaC4KLSAJKEJGRF9IX0ZJTEVTLCBMSUJCRkRfSF9GSUxFUywgTElCQ09GRl9IX0ZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkoJChzcmNkaXIpL2JmZC1pbjIuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1iaW4yLWguCi0JKHN0bXAtYmluMi1oKTogTmV3IHRhcmdldC4KLQkoJChzcmNkaXIpL2xpYmJmZC5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdG1wLWxiZmQtaC4KLQkoc3RtcC1sYmZkLWgpOiBOZXcgdGFyZ2V0LgotCSgkKHNyY2RpcikvbGliY29mZi5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdG1wLWxjb2ZmLWguCi0JKHN0bXAtbGNvZmYtaCk6IE5ldyB0YXJnZXQuCi0JKENMRUFORklMRVMpOiBDaGFuZ2Ugc3RtcC1iZmQuaCB0byBzdG1wLWJmZC1oLiAgQWRkIHN0bXAtYmluMi5oLAotCXN0bXAtbGJmZC1oLCBhbmQgc3RtcC1sY29mZi1oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGEgZGl2ZXJzaW9uIHRvIHNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSB0aGUKLQlhcmd1bWVudHMgYXJlIHBhcnNlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAzMCAxNDoxODozMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJfU1BBUkNfR0xPQl9KTVAKLQlyZW5hbWVkIHRvIFJfU1BBUkNfVU5VU0VEXzQyLgotCShzcGFyY19yZWxvY19tYXApOiBEZWxldGUgUl9TUEFSQ19HTE9CX0pNUCBlbnRyeS4KLQkqIGVsZjY0LXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUl9TUEFSQ19HTE9CX0pNUAotCXJlbmFtZWQgdG8gUl9TUEFSQ19VTlVTRURfNDIuCi0JKHNwYXJjX3JlbG9jX21hcCk6IERlbGV0ZSBSX1NQQVJDX0dMT0JfSk1QIGVudHJ5LgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1NQQVJDX0dMT0JfSk1QKTogRGVsZXRlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IFNlcCAyNSAxMjoxNTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IERvbid0IGNoZWNrIHRoZSBoYXNoIGNyZWF0b3IgdW50aWwKLQlhZnRlciB3ZSBoYXZlIHNldCAqc3ltX2hhc2guCi0KLVdlZCBTZXAgMjQgMTY6NTI6MjggMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuYmZkIChzaCotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIHNoLSotKmVsZiouCi0KLVdlZCBTZXAgMjQgMTE6Mjc6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliYmZkX2FfU09VUkNFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfVE9PTCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwIDIzIDE5OjAzOjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IEV2ZW4gaWYgd2UgYXJlIG5vdCBkZW1hbmQKLQlwYWdlZCwgZG9uJ3QgcHV0IGEgbG9hZGFibGUgc2VjdGlvbiBhZnRlciBhIG5vbmxvYWRhYmxlIHNlY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJbmNyZW1lbnQgdGhlIGZpbGUgb2Zmc2V0Ci0JZm9yIGEgc2VjdGlvbiB3aXRoIGNvbnRlbnRzLCBldmVuIGlmIGl0IGlzIG5vdCBsb2FkYWJsZS4KLQotU3VuIFNlcCAyMSAxMTowMzoyNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBBZGQgcmV0dXJuIGNvZGUKLQlpbmRpY2F0aW5nIHRoYXQgX19jdGJwIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQotVGh1IFNlcCAxOCAxNTowNDo1NyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KLQotV2VkIFNlcCAxNyAwOTo1NDo1MSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIHY4NTBfZWxmX3JlbG9jLAotCXY4NTBfZWxmX2NoZWNrX3JlbG9jcywgdjg1MF9lbGZfcmVsb2NfbWFwLCB2ODUwX2VsZl9ob3d0b190YWJsZSk6Ci0JQWRkIHN1cHBvcnQgZm9yIHRoZSBDQUxMVCByZWxvY3MuCi0KLQkqIHJlbG9jLmMgKENPTU1FTlQpOiBBZGQgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCBhbmQKLQlCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQuCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEFkZCBjaGVja3MgdG8gY2F0Y2gKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IG5vbi1leGlzdGFudCBzeW1ib2xzLgotCi1UdWUgU2VwIDE2IDE0OjIwOjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCBCRlJfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VULgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jLCB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlLAotCXY4NTBfZWxmX2hvd3RvX3RhYmxlLCB2ODUwX2VsZl9yZWxvY19tYXApOiBBZGQgc3VwcG9ydCBmb3IgYSAxNgotCWJpdCByZWxvYyBpbiB0aGUgdGlueSBkYXRhIGFyZWEuCi0KLU1vbiBTZXAgMTUgMTE6Mjc6MzYgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IENoYW5nZSBwYy1yZWxhdGl2ZSByZWxvY3MKLQlvdmVyIDJeMzIgYnl0ZXMgdG8gYmUgYWJzb2x1dGUuICBOZWVkZWQgYmVjYXVzZSBEMzBWIFBDIGRvZXNuJ3QKLQluZWNlc3NhcmlseSB3cmFwLgotCi0JKiByZWxvYy5jLCBlbGYzMi1kMzB2LmMgKEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsCi0JQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SKTogTmV3IHJlbG9jcy4KLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2NfMjEpOiBOZXcgZnVuY3Rpb24uCi0JRG8gMTUgYW5kIDIxIGJpdCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IpOgotCU5ldyByZWxvY2F0aW9ucy4KLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBBZGRlbmQgbmVlZHMgdG8gYmUKLQlhZGRlZCB0byB0aGUgcmVsb2NhdGlvbiwgbm90IG9yJ2QuCi0KLVdlZCBTZXAgMTAgMTU6MTc6MjUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYyk6IFJlbW92ZSBzcHVyaW91cyBlcnJvciBtZXNzYWdlLgotCi1XZWQgU2VwIDEwIDExOjE3OjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IFVzZSBzdHJjYXNlY21wLgotCShiZmRfZGVmYXVsdF9zY2FuKTogVGVzdCBmb3IgbWF0Y2ggd2l0aCBhcmNoX25hbWUgKyAiOiIgKwotIAlwcmludGFibGVfbmFtZS4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IFRlc3QgZm9yIG1hdGNoIHdpdGggcHJpbnRhYmxlX25hbWUgLSAiOiIuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBEZWxldGUgdzY1LCBoODMwMCwgaDg1MDAsIHo4aywgaTk2MCBzcGVjaWFsCi0gCWNhc2VzLiAgRWFjaCBpbXBsZW1lbnRzIHRoZWlyIG93biBzY2FuIGZ1bmN0aW9uLgotCShiZmRfZGVmYXVsdF9zY2FuKTogRGVsZXRlIDM4NiwgMjkwMCwgODYwLCBtaXBzIDIwMDAsIG1pcHMgNDQwMAotIAlzcGVjaWFsIGNhc2VzLiAgU2luY2UgaW5mby0+bWFjaCA9PSAwLiAgVGhlIHRlc3QgbWFjaCA9PSBudW1iZXIKLSAJZmFpbHMuCi0JKGJmZF9hcmNoX2xpc3QpOiBOZXcgZnVuY3Rpb24sIHJldHVybiBuYW1lIG9mIGFsbCB0aGUgc3VwcG9ydGVkCi0gCWFyY2hpdGVjdHVyZXMuCi0KLVR1ZSBTZXAgIDkgMTA6MjE6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQnJlYWsgYWZ0ZXIKLQlkZWNvZGluZyBhcmNoaXRlY3R1cmUuCi0JKHY4NTBfZWxmX3JlbG9jKTogRG8gbm90IGNvbXBsYWluIGlmIGEgUl9WODUwX0xPMTYgcmVsb2MgaGFzIGJpdAotCTE1IHNldC4KLQotU3VuIFNlcCAgNyAxMjoyNToyMiAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBiZmQvZWxmNjQtYWxwaGEuYyAocmVsb2NfaG93dG9fdHlwZSk6IEZpeCB0aGUgaG93dG8gdGFibGUuCi0KLVRodSBTZXAgIDQgMDk6NDQ6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS12ODUwLmMuCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZWxmMzItdjg1MC5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIHJlbG9jLmM6IFJlbW92ZSBleHRyYW5lb3VzIGNvbW1hcyBmcm9tIHJlbG9jYXRpb24gZW50cmllcy4KLQlSZW1vdmUgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUHV0IFhUWV9DTS9YTUNfVEQgc3ltYm9scwotCWluIHNlY3Rpb25zIG5hbWVkIC50b2Nic3MgcmF0aGVyIHRoYW4gLmJzcy4KLQotV2VkIFNlcCAgMyAxMToyMzoyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oLCBlbGYzMi12ODUwLmM6IFJlbW92ZWQKLQlCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAyMDo0NDoxMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBIYW5kbGUgQ19TWVNURU0gc3ltcwotCXRoZSBzYW1lIGFzIENfRVhUIHN5bXMuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERpdHRvLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEaXR0by4KLQkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IEFkZCBzYXZlX2dsb2JhbF90b19zdGF0aWMuICBVc2UKLQlpdCB0byBwcmVzZXJ2ZSBhbmQgcmVzdG9yZSBzdGF0ZSBvZiBnbG9iYWxfdG9fc3RhdGljIGZsYWcuCi0KLVR1ZSBTZXAgIDIgMTc6NDU6MjIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9vYmplY3RfcCk6IFNldCBtYWNoaW5lIG51bWJlciBiYXNlZCBvbgotCWJpdHMgaW4gZV9mbGFncyBmaWVsZCByYXRoZXIgdGhhbiBtYWdpYyBudW1iZXJzLgotCSh2ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nLCB2ODUwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncywKLQl2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsIHY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsCi0Jdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbnMuCi0KLVR1ZSBTZXAgIDIgMTc6NDM6NDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFJlbW92ZSBWODUwRSBtYWdpYyBudW1iZXIuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogUmVtb3ZlIFY4NTBFQSBtYWdpYyBudW1iZXIuCi0KLVR1ZSBTZXAgIDIgMTc6MzU6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY3B1LWFyYy5jIChhcmNfZ2V0X21hY2gpOiBQcm9wZXJseSBzY2FuIGRlZmluZWQgbWFjaCBlbnRyaWVzLgotCi1UdWUgU2VwICAyIDE4OjI5OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogUEMgcmVsYXRpdmUKLQlpbnN0cnVjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlCi0JY3VycmVudCBpbnN0cnVjdGlvbi4KLQkobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IFNpbWlsYXJseS4KLQotVHVlIFNlcCAgMiAxNTo0NTo0NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MC5jOiBVc2UgYSBtYWNybyB0byBjb25zdHJ1Y3QgYmZkX2FyY2hfaW5mb190eXBlCi0JZW50cmllcy4KLQotCSogcmVsb2MuYywgbGliYmZkLmgsIGJmZC1pbjIuaCwgZWxmMzItdjg1MC5jOiBSZXBsYWNlCi0JQkZEX1JFTE9DX1Y4NTBfe1NEQS9UREEvWkRBfV9PRkZTRVQgcmVsb2NzIHdpdGggbmV3IGJpdCBwYXR0ZXJuCi0Jc3BlY2lmaWMgdmVyc2lvbnM6IEJGRF9SRUxPQ19WODUwX3thcmVhfV97Yml0c31fT0ZGU0VULgotCi1UaHUgQXVnIDI4IDE3OjAxOjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTAuYzogUmVtb3ZlICJwbGFpbiIgZnJvbSB2ODUwIHByaW50YWJsZSBuYW1lLgotCShzY2FuKTogVXNlIHN0cmNhc2VjbXAuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3Y4NTApOiBEZWZpbmUuCi0KLQkqIGNwdS1zaC5jIChzY2FuX21hY2gpOiBDb21wYXJlIHdpdGggdGFibGUgaW5zdGVhZCBvZiBoYXJkd2lyZWQgdG8KLSAJanVzdCBzaC9TSCwgdXNlIHN0cmNhc2VjbXAuCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgZW50cmllcyBmb3Igc2gzIGV0LmFsLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zaCwgLi4uKTogRGVmaW5lLgotCi1XZWQgQXVnIDI3IDE3OjMzOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2h1cmVzX2xpc3QpOiBBbHdheXMgTlVMTCB0ZXJtaW5hdGUgdGhlIGxpc3QuCi0KLVR1ZSBBdWcgMjYgMTc6MjY6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LWFyYy5jLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLWFyYy5jLgotCShlbGYzMi1hcmMubG8pOiBSZW1vdmUgZXhwbGljaXQgZGVwZW5kZW5jeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBTZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLQkqIGRvYy9NYWtlZmlsZS5hbSAoTUtET0MpOiBVc2UgRVhFRVhUX0ZPUl9CVUlMRCwgbm90IEVYRUVYVC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEF1ZyAyNSAxNjoxNDozNCAxOTk3ICBDaHJpc3RvcGhlciBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxhdGVzdCBkZXZvIGF1dG9jb25mIGZvciBOVCBzdXBwb3J0Ci0KLU1vbiBBdWcgMjUgMTY6MTE6MDQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogSWYgQiBpcyBhIGRlZmF1bHQgdHlwZSwgcmV0dXJuIEEuCi0KLU1vbiBBdWcgMjUgMTU6MzU6NDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTAuYyAoc2Nhbik6IE5ldyBmdW5jdGlvbi4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGJmZF92ODUwX2FyY2gpOiBBZGQgbGluayBpbnRvIGFyY2hfaW5mb19zdHJ1Y3R1cmUuCi0KLQkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogQWxsIHY4NTAgdmFyaWFudHMgdXNlIHRoZSBiZmRfYXJjaF92ODUwCi0JYXJjaGl0ZWN0dXJlLgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX29iamVjdF9wKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF92ODUwZSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlLgotCi0JKiBiZmQtaW4yLmggKGJmZF9tYWNoX3Y4NTBlKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGUuCi0KLQkqIGVsZjMyLXY4NTAuYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmF1bHQgdG8gdjg1MGUgbWFjaGluZQotCW51bWJlci4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSBtYWNoaW5lIG51bWJlci4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfdjg1MGVhKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGVhLgotCi0JKiBiZmQtaW4yLmggKGJmZF9tYWNoX3Y4NTBlYSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlYS4KLQotCSogZWxmMzItdjg1MC5jIChFTEZfTUFDSElORV9DT0RFKTogRGVmYXVsdCB0byB2ODUwZWEgbWFjaGluZQotCW51bWJlci4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgbWFjaGluZSBudW1iZXIuCi0KLU1vbiBBdWcgMjUgMTQ6MDc6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2xlYXIgdGhlCi0gCWNhY2hlZF9zdGFiIGZpZWxkIGlmIHRoZSBvZmZzZXQgcHJldmVudHMgdXMgZnJvbSB1c2luZyB0aGUgY2FjaGUuCi0KLU1vbiBBdWcgMjUgMTI6MDg6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWSh2ZWMpKTogQWRkIFNFQ19DT0RFIGFuZCBTRUNfREFUQSB0byBzZWN0aW9uCi0JZmxhZ3MuCi0JKiBhb3V0LWFybS5jIChhb3V0X2FybV9saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKGFvdXRfYXJtX2JpZ192ZWMpOiBMaWtld2lzZS4KLQkqIGJvdXQuYyAoYl9vdXRfdmVjX2JpZ19ob3N0KTogTGlrZXdpc2UuCi0JKGJfb3V0X3ZlY19saXR0bGVfaG9zdCk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChhb3V0X21pcHNfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCShhb3V0X21pcHNfYmlnX3ZlYyk6IExpa2V3aXNlLgotCi1UdWUgQXVnIDE5IDEwOjA5OjEwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKENPRkZfQUxJR05fSU5fU0ZMQUdTKTogRGVmaW5lIHRvIDEuCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IElnbm9yZSBpbmNvbWluZyBTVFlQX0lORk8KLQliaXQgaW4gc19mbGFncyBpZiBDT0ZGX0FMSUdOX0lOX1NfRkxBR1MgaXMgZGVmaW5lZC4KLQotVHVlIEF1ZyAxOSAwODo0NzoxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIpOiBEZWZpbmUgdG8gMS4KLQkoR0VUX1NDTkhEUl9BTElHTiwgUFVUX1NDTkhEUl9BTElHTik6IERlZmluZS4KLQkqIGNvZmYtbTg4ay5jIChHRVRfU0NOSERSX05SRUxPQywgR0VUX1NDTkhEUl9OTE5OTyk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogQ29uZGl0aW9uYWxseSBjb21waWxlIGluIGlmCi0JQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiBpcyBkZWZpbmVkLiAgQ29udmVydCBhbGlnbm1lbnQgdG8gcG93ZXIKLQlvZiB0d28gZm9yIEk5NjAgb25seS4KLQkqIGNvZmZzd2FwLmggKEdFVF9TQ05IRFJfTlJFTE9DLCBQVVRfU0NOSERSX05SRUxPQywgR0VUX1NDTkRIUl9OTE5OTywKLQlQVVRfU0NOSERSX05MTk5PLCBHRVRfU0NOSERSX0ZMQUdTLCBQVVRfU0NOSERSX0ZMQUdTKTogUHJvdmlkZQotCWRlZmF1bHQgZGVmaW5pdGlvbnMuCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBVc2UgR0VUX1NDTkhEUl9GTEFHUywgR0VUX1NDTkhEUl9OUkVMT0MsCi0JR0VUX1NDTkhEUl9OTE5OTywgYW5kIEdFVF9TQ05IRFJfQUxJR04uCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIFBVVF9TQ05IRFJfRkxBR1MsIFBVVF9TQ05IRFJfQUxJR04uCi0JKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogRGVwZW5kcyB1cG9uIGNvZmZzd2FwLmguCi0JKiBjb2ZmLXRpYzgwLmMgKENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIpOiBEZWZpbmUgdG8gMS4KLQkoR0VUX1NDTkhEUl9GTEFHUywgUFVUX1NDTkhEUl9GTEFHUyk6IERlZmluZQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgYWxpZ25tZW50IGZpZWxkIGluCi0gCXNlY3Rpb24gaGVhZGVyIGZvciBUSUM4MENPRkYgZmlsZXMuCi0KLU1vbiBBdWcgMTggMTE6MzY6MTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSwgdjg1MF9lbGZfcmVsb2NfbWFwLAotCXY4NTBfZWxmX2NoZWNrX3JlbG9jcywgdjg1MF9lbGZfcmVsb2MsCi0Jdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBBZGQgc3VwcG9ydCBmb3IKLQlCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgotCi0JKiByZWxvYy5jIChDT01NRU5UKTogQWRkIHN1dXBvcnQgZm9yIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMCi0JcmVsb2NhdGlvbi4KLQotCSogbGliYmZkLmg6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgotCi1Nb24gQXVnIDE4IDExOjMzOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwZTogTmV3IGZpbGUuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi0JKiBiZmQtaW4yLmggKGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi1Nb24gQXVnIDE4IDExOjMzOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwZWE6IE5ldyBmaWxlLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLQkqIGJmZC1pbjIuaCAoYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLUZyaSBBdWcgMTUgMTI6MDE6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBDb3JyZWN0bHkgaGFuZGxlIHRoZSBvZmZzZXQKLQlhcmd1bWVudCBhcyBzZWN0aW9uIHJlbGF0aXZlLCByYXRoZXIgdGhhbiBhbiBhYnNvbHV0ZSBhZGRyZXNzLgotCUZyb20gSmFuIEhvb2dlbnJhYWQgPGhvb2dlbnJkQG5hdGxhYi5yZXNlYXJjaC5waGlsaXBzLmNvbT4uCi0KLUZyaSBBdWcgMTUgMDQ6NTg6MDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoYXJjLSotZWxmKik6IEFkZC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3tsaXR0bGUsYmlnfWFyY192ZWMpOiBBZGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1hcmMubG8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLWFyYy5sby4KLQkoY3B1LWFyYy5sbyxlbGYzMi1hcmMubG8pOiBBZGQgcnVsZXMgZm9yLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBhcmNodXJlcy5jIChhcmNoaXRlY3R1cmUgbGlzdCk6IEFkZCBiZmRfYXJjaF9hcmMuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF9hcmNfYXJjaC4KLQkoYmZkX21hY2hfYXJjX2Jhc2UpOiBEZWZpbmUuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCxCRkRfUkVMT0NfQVJDX0IyNik6IEFkZC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3tsaXR0bGUsYmlnfWFyY192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3QpOiBBZGQgdGhlbS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjcHUtYXJjLmMsIGVsZjMyLWFyYy5jOiBOZXcgZmlsZXMuCi0JKiBlbGYuYyAocHJlX2hlYWRlcnMpOiBSZWNvZ25pemUgYmZkX2FyY2hfYXJjLgotCi1UdWUgQXVnIDEyIDExOjQ1OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSWYgbm8gc3ltYm9scywgbWFrZSBzdXJlIHRoZQotCWRhdGEgc2VjdGlvbiBpcyBjb3JyZWN0bHkgcm91bmRlZCB0byBhIHBhZ2UgaW4gdGhlIGZpbGUuCi0KLU1vbiBBdWcgMTEgMTI6NDU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBlbWl0IHRoZSBzdHJpbmcgdGFibGUgaWYKLQl0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQotU3VuIEF1ZyAxMCAxNDo0NTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc3RnbzMyLmM6IFJlbmFtZSBmcm9tIGNvZmYtc3R1YmdvMzIuYyB0byBhdm9pZCBvbGQgU3lzdGVtIFYKLQlmaWxlIHN5c3RlbSAxNCBjaGFyYWN0ZXIgbGltaXQuCi0JKiBNYWtlZmlsZS5hbSwgY29uZmlndXJlLmluOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXVnICA4IDE4OjM0OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IChBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLWQxMHYuYy4KLQlSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgQXVnICA2IDE4OjU2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRvY2Rpcik6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXVnICA1IDIzOjA1OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4xLgotCi1Nb24gQXVnICA0IDEyOjAwOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlIHBhdGNoZXMuCi0KLVN1biBBdWcgIDMgMDg6MTU6MTIgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbik6ICBOZXcgZnVuY3Rpb24gdG8gYWRkIGEgc2VjdGlvbgotCXRvIHRoZSBjb3JlIGZpbGUgYmZkLgotCShyczYwMDBjb2ZmX2NvcmVfcCk6ICBVc2UgbWFrZV9iZmRfYXNlY3Rpb24gdG8gYWRkIHRoZSBjb3JlIGZpbGUKLQlzZWN0aW9ucy4KLQlVc2UgQkZEIHJvdXRpbmVzIHRvIHNlZWssIHJlYWQgYW5kIHN0YXQgdGhlIGNvcmUgZmlsZS4KLQlIYW5kbGUgLmRhdGEgc2VjdGlvbnMgZnJvbSBsb2FkZWQgb2JqZWN0cyBhbmQgYW5vbnltb3VzbHkgbW1hcHBlZAotCXJlZ2lvbnMsIHRoZXNlIGFyZSBhdmFpbGFibGUgaW4gQUlYIDQgY29yZSBmaWxlcy4KLQotRnJpIEF1ZyAgMSAxMjo1ODozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjaW5jbHVkZS5tNDogTW92ZSBhY21hY3Jvcy5tNCBpbiBoZXJlLiAgUmVtb3ZlIEFNX1BST0dfTElCVE9PTAotCWNvcHk7IHVzZSBhIHBhdGNoZXMgbGlidG9vbCBpbnN0ZWFkLgotCSogYWNtYWNyb3MubTQ6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBKdWwgMzEgMTk6NTU6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjbWFjcm9zLm00OiBOZXcgZmlsZSwgY29waWVkIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZSBzaGFyZWQgbGlicmFyeQotCWhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZSBBQ19DT05GSUdfSEVBREVSIHdpdGgKLQlBTV9DT05GSUdfSEVBREVSLiAgUmVwbGFjZSBBQ19QUk9HX0lOU1RBTEwgd2l0aCBBTV9QUk9HX0lOU1RBTEwuCi0JQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsIEFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgQ2hhbmdlIGFsbAotCS5vIGZpbGVzIHRvIC5sby4gIFJlbW92ZSBzdGFtcC1oIGhhbmRsaW5nIGluIEFDX09VVFBVVC4KLQkqIGFjY29uZmlnLmg6IE1lbnRpb24gUEFDS0FHRSBhbmQgVkVSU0lPTi4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogZGVwLWluLnNlZDogQ2hhbmdlIC5vIHRvIC5sby4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIFZFUlNJT046IFJlbW92ZS4KLQotVGh1IEp1bCAzMSAxMjowOToyMCAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgVEVYVFJFTAotIAlpZiB0aGVyZSBpcyBvbmx5IGEgcmVsb2NhdGlvbiB0byBhIHJlYWQtb25seSBidXQgbm90IGFsbG9jYXRhYmxlCi0gCXNlY3Rpb24gKGxpa2UgLnN0YWIpLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQ29ycmVjdCB2YXJpb3VzIGNvbW1lbnRzLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFRoZXNlIHNlY3Rpb25zIGFyZSBub3QKLQljcmVhdGVkIGJ5IHRoZSBsaW5rZXIgKHRoYXQgaXMsIHRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIHVzZXIKLQlwdXR0aW5nIGRhdGEgaW4gdGhlbSkuIEluIHBhcnRpY3VsYXIsIHRoZXkgY2FuIGJlIHRoZSBzb3VyY2UKLQlhbmQgdGFyZ2V0IG9mIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENoZWNrIHBvc3Rjb25kaXRpb24gb2YKLSAJYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sLiAgQWxpZ24gMTYtYnl0ZSBjb21tb24KLSAJb2JqZWN0cyAoZm9yIGluc3RhbmNlLCAnbG9uZyBkb3VibGUnKSB0byAxNi1ieXRlIGJvdW5kYXJpZXMuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSB0aGUgY29kZSB0aGF0IGdlbmVyYXRlcwotCXNlY3Rpb24gc3ltYm9scyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciBzcGFyYywgcmVkdWNpbmcgdGhlCi0JbnVtYmVyIG9mIHNlY3Rpb24gc3ltYm9scyBvdXRwdXQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQ2hlY2sgcG9zdGNvbmRpdGlvbiBvZgotCWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbC4gIE1ha2UgZGVmYXVsdCBjYXNlIHRoZQotCXNhbWUgYXMgY29ycmVzcG9uZGluZyBjb2RlIGZvciBzcGFyYywgZml4aW5nIGJ1ZyBpbnZvbHZpbmcKLQkucmVsYS5zdGFicy4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaXggY2FzZSBpbnZvbHZpbmcgR09UIHN5bWJvbHMKLSAJZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgdmVyc2lvbmluZyAoYnkgcmVwbGljYXRpbmcKLSAJY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gc3BhcmMpLiAgVHJlYXQgUl9QUENfUkVMQVRJVkUgUkVMQSByZWxvY3MKLSAJYXMgdXN1YWwgaW4gRUxGLCBub3QgYXMgcHNldWRvLVJFTCByZWxvY3MgKGFzIHRoZSBzcGFyYyBsaW5rZXIKLSAJZG9lcykuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBoYW5keSBkZWJ1Z2dpbmcgY29kZSBmb3Igd2hlbgotIAlhc3NlcnRpb24gZmFpbHMuICBBZGQgc29tZSBtb3JlICdzeW1ib2wgbWFkZSBsb2NhbCBiZWNhdXNlIG9mCi0gCXZlcnNpb25pbmcnIGNhc2VzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29wZSB3aXRoIGFkZGVuZCB3aGVuCi0JcHJvY2Vzc2luZyBhIEdPVCByZWxvY2F0aW9uIGFzIHJlcXVpcmVkIGJ5IEFCSS4KLQotV2VkIEp1bCAzMCAyMTozMDozNSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBSZW1vdmUgYW55Ci0JdmVyc2lvbiBpbmZvIGlmIHRoaXMgc3ltYm9sIGNhbWUgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgdGhlIHZlcnNpb24gaW5mbyBvZiBhIHN5bWJvbAotCW9ubHkgaWYgdGhlIG9iamVjdCBhY3R1YWxseSBjb250YWlucyB2ZXJzaW9uIGRlZmluaXRpb25zIGFuZAotCWRlZmluZXMgdGhpcyBzeW1ib2wuCi0KLU1vbiBKdWwgMjggMTg6MDc6NDMgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogQWRkIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3Jvcy4KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNybyB0byBsb29rIGZvcgotICAgICAgICB3aW4zMiBkZXBlbmRlbmNpZXMuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0gICAgICAgICogZG9jL01ha2VmaWxlLmluOiBBZGQgJChFWEVFWFQpIHRvIGNoZXcgZXhlY3V0YWJsZS4KLQotTW9uIEp1bCAyOCAwMjo1MDoyOSAxOTk3ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIElmIENPUkVfVFJVTkMgaXMgc2V0LCBwcmludAotCWEgd2FybmluZyByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gZXJyb3IuCi0KLVN1biBKdWwgMjcgMTk6NTQ6MTQgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogYWRkIHNlbWljb2xvbiB0byBtYWtlIE1TVkMgaGFwcHkuCi0KLUZyaSBKdWwgMjUgMTQ6NTA6MDggMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjaXNjby1jb3JlLmM6IGRlZmluZSBzaWduYWxzIGZvciB3aW5nZGIuCi0KLUZyaSBKdWwgMjUgMTY6Mjc6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBPbmx5IG1lcmdlIGZpbGVzIHdpdGgKLQl0aGUgc2FtZSBudW1iZXIgb2YgYXV4IGVudHJpZXMuCi0KLUZyaSBKdWwgMjUgMDg6MjI6MTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVc2UgUl9EQVRBX0VYUFIgZm9yIHRoZQotCWRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaWYgdGhlIHJlbG9jYXRpb24gc2l6ZSBpcyAzMiBiaXRzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfREFUQV9FWFBSLgotCi1XZWQgSnVsIDIzIDE2OjA4OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IERvbid0IG9mZnNldCBhIGNvbW1vbiBzeW1ib2wgYnkKLQlpdHMgdmFsdWUgaWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQuCi0KLVR1ZSBKdWwgMjIgMTc6MTk6NDUgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBjb2ZmLXN0dWJnbzMyLmM6IE5ldyBmaWxlLgotCSogZ28zMnN0dWIuaDogTmV3IGZpbGUuCi0JKiBjb2ZmLWkzODYuYzogSWYgQ09GRl9HTzMyX0VYRSwgaW5jbHVkZSBjb2ZmL2dvMzJleGUuaC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogSW52b2tlCi0JQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QUkUgYW5kIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCBpZiB0aGV5Ci0JYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IEludm9rZSBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUgYW5kCi0JQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfYXV4X2luKTogSW52b2tlIENPRkZfQURKVVNUX0FVWF9JTl9QUkUgYW5kCi0JQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUgYW5kCi0JQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBJbnZva2UgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEludm9rZSBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkqIHRhcmdldHMuYyAoZ28zMnN0dWJiZWRjb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGdvMzJzdHViYmVkY29mZl92ZWMuCi0JKiBjb25maWd1cmUuaW4gKGdvMzJjb2ZmX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShnbzMyc3R1YmJlZGNvZmZfdmVjKTogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKik6IE5ldyB0YXJnZXQuCi0JKGlbMzQ1Nl04Ni0qLWdvMzIqKTogQ2hhbmdlIHRvIGJlIGxpa2UgbmV3IG1zZG9zZGpncHAqLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zdHViZ28zMi5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgY29mZi1zdHViZ28zMi5jLgotCShIRklMRVMpOiBBZGQgZ28zMnN0dWIuaC4KLQotVHVlIEp1bCAyMiAxNTowOToxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGZkb3Blbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ2hlY2sgSEFWRV9GRE9QRU4gcmF0aGVyIHRoYW4gVk1TIG9yCi0JX19HTzMyX18uICBSZWluZGVudCBhIGJpdC4KLQotU3VuIEp1bCAyMCAyMDowNToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IFNFQ19MSU5LRVJfQ1JFQVRFRAotCWZsYWcgZm9yIG5ld2x5IGNyZWF0ZWQgc2VjdGlvbnMuCi0JKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkaXNjYXJkIG5ld2x5IGNyZWF0ZWQgc2VjdGlvbnMKLQlpZiBzaGFyZWQgbGlicmFyeSBpcyBkeW5vYmouCi0KLU1vbiBKdWwgMTQgMTU6MzM6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogV2hlbiBjaGVja2luZyB3aGV0aGVyCi0JaW5jbHVkaW5nIGEgc2VjdGlvbiBpbiBhIHNlZ21lbnQgd291bGQgZm9yY2UgdXMgdG8gc2tpcCBhIHBhZ2UsCi0JYWxpZ24gdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgc2VnbWVudCB0byBhdm9pZCB3cmFwYXJvdW5kCi0JcHJvYmxlbXMuCi0KLVR1ZSBKdWwgIDggMTI6MTE6MjkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW5pdGlhbGl6ZQotIAl0YXJnZXQgaWQgZmllbGQgdG8gVElDODBfVEFSR0VUX0lELgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogU3dhcCBvdXQgdGFyZ2V0IGlkIGZpZWxkCi0gCWlmIHVzZWQuCi0JKGNvZmZfc3dhcF9maWxlaGRyX2luKTogU3dhcCBpbiB0YXJnZXQgaWQgZmllbGQgaWYgdXNlZC4KLQotTW9uIEp1bCAgNyAxNjo0MToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24KLQlpZiBUQVJHRVRfVU5ERVJTQ09SRS4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZSBpZiBUQVJHRVRfVU5ERVJTQ09SRS4KLQkoaTM4NmNvZmZfdmVjKTogQWRkIFNFQ19DT0RFIGFuZCBTRUNfREFUQSB0byBzZWN0aW9uX2ZsYWdzLgotCi1Nb24gSnVuIDMwIDE0OjI5OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTY4ay5jIChob3d0b190YWJsZSk6IFVzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgbm90Ci0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBmb3IgMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCi1UaHUgSnVuIDI2IDAxOjI2OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGEgdmVyc2lvbgotCWluZGlyZWN0aW9uIHN5bWJvbCBpcyBvdmVycmlkZGVuLCBtYWtlIHRoZSBvcmlnaW5hbCBzeW1ib2wgcG9pbnQKLQlhdCB0aGUgcmVhbCBvdmVycmlkaW5nIHN5bWJvbC4KLQotCSogZWxmLmMgKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24pOiBDaGVjayBmb3IgYW4gaW52YWxpZAotCXN0cmluZyBpbmRleC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogVXNlIHRoZSByaWdodCBzZWN0aW9uIGZvciBhCi0JY29tbW9uIHN5bWJvbC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBJZiBhIGNvbW1vbgotCXN5bWJvbCB3YXMgaW4gLnNjb21tb24sIG1hcmsgaXQgYXMgU0hOX01JUFNfU0NPTU1PTi4KLQotV2VkIEp1biAyNSAxMjo0MzoxMCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2xzKTogUmVzb2x2ZSBpbmRpcmVjdCBhbmQgd2FybmluZwotCXN5bWJvbHMgYmVmb3JlIGNoZWNraW5nIGZvciBuZXcgc3ltYm9scy4KLQotCSogZWxmY29yZS5oIChlbGZfY29yZWZpbGVfbm90ZSk6IE1vdmUgb3V0IG9mIEhBVkVfU1lTX1BST0NGU19ILgotCi1UdWUgSnVuIDI0IDExOjIwOjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX29iamVjdF9wKTogUmVhZCB0aGUgZl9vcHRoZHIgYnl0ZXMgZnJvbSB0aGUKLQlmaWxlLCBub3QgYW91dHN6IGJ5dGVzICh0aGV5IGFyZSBkaWZmZXJlbnQgaW4gWENPRkYgLm8gZmlsZXMpLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFBlcm1pdCBzeW1ib2xzIHRvIGJlCi0JcmVkZWZpbmVkIGJ5IG9iamVjdHMgaW5jbHVkZWQgZnJvbSBhcmNoaXZlcy4KLQotTW9uIEp1biAyMyAxODowMzoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IEluIHRoZSBjYXNlIG9mIGEgbmV3IGRlZmluZWQKLQlzeW1ib2wgb3ZlcnJpZGluZyBhbiBvbGQgZGVmaW5lZCBzeW1ib2wsIHJldHVybiB0aGUgaGFzaCB0YWJsZQotCWVudHJ5IHdoaWNoIHdlIG1vZGlmeSwgZXZlbiBpZiBpdCBpcyB0aGUgdGFyZ2V0IG9mIGFuCi0JaW5kaXJlY3Rpb24uCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIHRoZSByZWFsIG5hbWUgb2YgdGhlIHN5bWJvbCBnZXRzCi0Jb3ZlcnJpZGRlbiwgY29udmVydCB0aGUgdmVyc2lvbmVkIHN5bWJvbCBpbnRvIGFuIGluZGlyZWN0IHN5bWJvbAotCXRvIHRoZSByZWFsIHN5bWJvbC4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scy4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FsbCBpdC4KLQotU3VuIEp1biAyMiAxOTo0MDo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsIGhhY2sgdG8KLQloYW5kbGUgY2FzZSB3aGVyZSBDT0ZGIGZpbGVoZHIgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93IFBFCi0JaGVhZGVyLgotCSogY29mZmdlbi5jIChjb2ZmX29iamVjdF9wKTogUmVtb3ZlIHVzZWxlc3Mgc2VlayB0byBjdXJyZW50Ci0JbG9jYXRpb24uCi0KLVdlZCBKdW4gMTggMTk6MDM6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBDaGFuZ2UgQ09NTU9OX1JPVy9pbmRyIHRvIGZyb20gQ1JFRiB0bwotCVJFRkMuCi0KLVR1ZSBKdW4gMTcgMTE6NTU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBJZiBzdHJpcHBpbmcgZGVidWdnaW5nCi0Jc3ltYm9scywgc2tpcCBOX0FCUyBzeW1ib2xzIHdpdGggZGVidWdnaW5nIHN0b3JhZ2UgY2xhc3Nlcy4KLQotTW9uIEp1biAxNiAxODo1NjoyNyAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdCBSX1BQQ19SRUwqCi0JcmVsb2NzIGluIHNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggcmVmZXIgdG8gbG9jYWwgc3ltYm9scy4gIENvcGUKLQl3aXRoIGFkZGVuZCB3aGVuIHByb2Nlc3NpbmcgYSBHT1QgcmVsb2NhdGlvbi4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSBjcmVhdGUgc3ltYm9scwotCWZvciBzZWN0aW9ucyB0aGF0IHRoZSBsaW5rZXIgZGlkbid0IGNyZWF0ZS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgdHJ5IHRvIHdyaXRlIG91dCBhIHNlY3Rpb24KLQlzeW1ib2wgaWYgaXQgd2FzIGNyZWF0ZWQgaW4gcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvbXBsYWluIGlmIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSByZWxvYwotCXJlbGF0aXZlIHRvIGEgc2VjdGlvbiBmb3Igd2hpY2ggd2UgZGlkbid0IG91dHB1dCBhIHN5bWJvbC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2xlYW4gdXAuICBQTFQKLQlyZWxvY3MgYXJlICdyZWxhJyByZWxvY3MsIGxpa2UgZXZlcnl0aGluZyBlbHNlLiAgLnJlbGEucGx0IGlzIG5vdAotCWEgcmVhZC1vbmx5IHNlY3Rpb24sIHNvIHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIGl0LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBFbnRyaWVzIGluIHRoZQotCS5yZWxhLmJzcyBzZWN0aW9uIGFyZSAob2YgY291cnNlKSAncmVsYScgcmVsb2NzIG5vdCAncmVsJyByZWxvY3MuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEluaXRpYWxpc2Ugc3JlbGdvdC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQGdvdCBvZmZzZXRzIGFyZSA0IGZyb20gc3RhcnQgb2YgdGhlCi0JYWN0dWFsIC5nb3Qgc2VjdGlvbi4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogVGhlIHRocmVlIHJlc2VydmVkCi0Jd29yZHMgc3RhcnQgZnJvbSB0aGUgc3ltYm9sICdfR0xPQkFMX09GRlNFVF9UQUJMRV8nLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiAnLnJlbGEnIGlzIDUKLQljaGFyYWN0ZXJzLCBub3QgNC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVXNlCi0JX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIHRvIGNyZWF0ZSB0aGUgR09UIHJhdGhlciB0aGFuCi0JcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24uIENyZWF0ZSB0aGUgJy5yZWxhLmdvdCcgc2VjdGlvbgotCW91cnNlbHZlcy4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBTZXQgdXAgR09UIHJlbG9jYXRpb25zIHdoZW4gYQotCXN5bWJvbCBoYXMgYSBHT1QgZW50cnkuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlY29yZCB3aGVuIGEgc3ltYm9sIGlzIHVzZWQgdGhyb3VnaAotCXRoZSBHT1QsIGFuZCBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgR09UIGZvciBlYWNoIHN1Y2ggc3ltYm9sLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERlbGV0ZSB1bnVzZWQgLmdvdC5wbHQgc3R1ZmYuCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBMSU5LRVJfU0VDVElPTl9HT1QKLQlzdHVmZi4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogR09UMTZfSEEgcmVsb2NzIHNob3VsZCBiZQotCXRyZWF0ZWQgaW4gYSBzaW1pbGFyIHdheSB0byBBRERSMTZfSEEgcmVsb2NzLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQTFRSRUwyNCByZWxvY3MgZG8gbm90IGdldCBjb3BpZWQgaW50bwotCXNoYXJlZCBvYmplY3RzOyB0aGUgbGlua2VyIG11c3QgZGVhbCB3aXRoIHRoZW0uCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogU3RvcCBzZXR0aW5nCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHRvIHRoZSB3cm9uZyB2YWx1ZTsgZGVsZXRlIHVudXNlZAotCUxJTktFUl9TRUNUSU9OX1BMVCBzdHVmZi4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBEZWxldGUgdW51c2VkIExJTktFUl9TRUNUSU9OX1BMVCBzdHVmZi4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBCRkQgY2FsbHMgdG8gZ2V0IEdPVAotCXNlY3Rpb24sIG5vdCBFTEYtc3BlY2lmaWMgY2FsbHMuCi0JKGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkKTogU2V0IHRvIDEuCi0JKGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0KTogU2V0IHRvIDQuCi0JKiBlbGYtYmZkLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgJ3BsdF9ub3RfbG9hZGVkJyBtZW1iZXIKLQlmb3Igd2hlbiBsZC5zbyBmaWxscyBpbiB0aGUgUExUOyBhbmQgJ2dvdF9zeW1ib2xfb2Zmc2V0JyBtZW1iZXIuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQXBwbHkKLQlwbHRfbm90X2xvYWRlZCBtZW1iZXIuCi0JKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFwcGx5IGdvdF9zeW1ib2xfb2Zmc2V0LgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkKTogU2V0IGRlZmF1bHQgdG8KLQknbG9hZGVkJy4KLQkoZWxmX2JhY2tlbmRfR19PX1Rfb2Zmc2V0KTogU2V0IGRlZmF1bHQgdG8gMC4KLQkoZWxmTk5fYmVkKTogU2V0IGFkZGVkIGZpZWxkcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogV2FzIHNldHRpbmcKLQlEVF9SRUxFTlQgaW4gc2hhcmVkIG9iamVjdHM7IHNob3VsZCBiZSBEVF9SRUxBRU5ULgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUHJvcGFnYXRlCi0JUl9QUENfQUREUjE2X0hBIHJlbG9jcyB0byBzaGFyZWQgb2JqZWN0cy4gQ29wZSB3aXRoIGNhc2Ugd2hlcmUKLQlzdWNoIGEgcmVsb2MgKGluIGEgbm9uLXNoYXJlZCBvYmplY3QpIHJlZmVycyB0byBhIHN5bWJvbCB0aGF0J3MKLQlub3QgZGVmaW5lZC4KLQotTW9uIEp1biAxNiAxNDo0MjoxNCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBlbGZjb2RlLmggKHB1dF9zaWduZWRfd29yZCk6IERlZmluZS4KLQkoZ2V0X3NpZ25lZF93b3JkKTogRGVmaW5lLgotCShlbGZfc3dhcF9yZWxvY2FfaW4pOiBVc2UgZ2V0X3NpZ25lZF93b3JkIGZvciB0aGUgcl9hZGRlbmQgZmllbGQuCi0JKGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBVc2UgcHV0X3NpZ25lZF93b3JkIGZvciB0aGUgcl9hZGRlbmQKLQlmaWVsZC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlCi0JYmZkX2dldF9zaWduZWRfMzIgdG8gc2V0IHRoZSByX2FkZGVuZCBmaWVsZC4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbik6IFVzZQotCWJmZF9oX2dldF9zaWduZWRfNjQgdG8gc2V0IHRoZSByX2FkZGVuZCBmaWVsZC4KLQotTW9uIEp1biAxNiAxMjozMToyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gZ2VuZXJhdGluZyBhCi0Jc2hhcmVkIGxpYnJhcnksIGRvIHRoZSByZWxvY2F0aW9uIGlmIHRoZSBpbnB1dCBzZWN0aW9uIGlzIG5vdAotCWFsbG9jYXRlZCBpbiBtZW1vcnkuCi0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDYWxsCi0JZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIGJlZm9yZSBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQllbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2FsbCBlbGZfZml4X3N5bWJvbF9mbGFncy4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogTGlrZXdpc2UuICBQZXJtaXQgYSBzeW1ib2wgdG8gYmUKLQlmb3JjZWQgbG9jYWwgZXZlbiBpZiBORUVEU19QTFQgaXMgc2V0LiAgV2hlbiBmb3JjaW5nIGEgc3ltYm9sIHRvCi0JYmUgbG9jYWwsIGNsZWFyIE5FRURTX1BMVC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgYmVkLgotCi1XZWQgSnVuIDExIDIyOjQ0OjIwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBzdHJ1Y3R1cmUKLQlmb3IgZGVyaXZlZCBlbGYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gIFJlZmVyZW5jZXMgdG8KLQllbGZfbGlua19oYXNoX2VudHJ5IGNoYW5nZWQgYXBwcm9wcmlhdGVseS4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUpOiBOZXcgc3RydWN0dXJlIGZvciBkZXJpdmVkIGVsZgotCWxpbmtlciBoYXNoIHRhYmxlLgotCShlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlKTogTGlrZXdpc2UuCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCShlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5KTogTGlrZXdpc2UuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBIYW5kbGUgImNhbGwiIC0+ICJjYWxscyIsIHJlbW92YWwKLQlvZiBwcm9sb2d1ZSBjb2RlLCBhbmQgY2FsbDozMi0+Y2FsbDoxNiByZWxheGluZy4KLQkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfaWxpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUuCi0KLVdlZCBKdW4gMTEgMDA6MDA6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBDYWxsIGZpbmlzaF9keW5hbWljX3N5bWJvbAotCWZvciBhIHN5bWJvbCB3aGljaCBpcyBiZWluZyBmb3JjZWQgdG8gYmUgbG9jYWwuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXcml0ZSBvdXQgdGhlCi0JcmVsb2NhdGlvbiB2YWx1ZSBmb3IgYSBHT1QgcmVsb2MgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIHR1cm5pbmcKLQlpbnRvIGEgbG9jYWwgc3ltYm9sLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBpcyB0dXJuaW5nIGludG8gYQotCWxvY2FsIHN5bWJvbCwgd3JpdGUgb3V0IGEgUkVMQVRJVkUgcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVAotCXJlbG9jLgotCSogZWxmMzItbTY4ay5jLCBlbGYzMi1zcGFyYy5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEdldCB0aGUgcmVsb2NhdGlvbgotCXZhbHVlIGlmIHRoZSBzeW1ib2wgaXMgdHVybmluZyBpbnRvIGEgbG9jYWwgc3ltYm9sLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTE5OTctMDYtMTAgMjI6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEFsc28gcmVhZCB2ZXJuZWVkCi0JaW5mb3JtYXRpb24gYnkgY2FsbGluZyBgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMnLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBGb3IgdW5kZWZpbmVkIHN5bWJvbHMgbG9vayBmb3IKLQl2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSB2ZXJuZWVkIHJlY29yZHMuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBzb25hbWUgb2Ygc2hhcmVkIG9iamVjdAotCWZvciB2ZXJuZWVkIHJlY29yZCBpZiBpdCBpcyBhdmFpbGFibGUuCi0KLVR1ZSBKdW4gMTAgMTE6MTM6MDMgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY3B1LWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IgY29tcGF0aWJsZSBhbmQgc2Nhbi4KLQkqIGNvZmZsaW5rLmM6IEFkZCBwcm90b3R5cGUgZm9yIG1hcmtfcmVsb2NzLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlKTogQ2hhbmdlIGZpbGVuYW1lIHRvCi0JY29uc3QgcG9pbnRlci4gIEFkZCBwcm90b3R5cGUuCi0KLU1vbiBKdW4gIDkgMTI6MzQ6MjEgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWdub3JlIHJlbG9jYXRpb25zIG9mCi0Jc2VjdGlvbnMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZC4KLQotMTk5Ny0wNi0wNiAyMjo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IFdoZW4gc2VhcmNoaW5nCi0JZm9yIGtub3duIHZlcnNpb24gc3ltYm9sIHNraXAgbm9uLW1hdGNoaW5nIHZlcmRlZiByZWNvcmRzLCBub3QKLQltYXRjaGluZyByZWNvcmRzLgotCi1UaHUgSnVuICA1IDE1OjUyOjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFdyaXRlIGEgbG9uZywKLQlub3QgYSBiZmRfdm1hLCB0byB0aGUgYmFzZSBmaWxlLCB0byBtYXRjaCBob3cgZGxsdG9vbCByZWFkcyBpdC4KLQotVHVlIEp1biAgMyAxNjo1Nzo0NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgdGh1bWIgcmVsb2NhdGlvbnMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIFRodW1iIHJlbG9jYXRpb25zLgotCi0JKiBsaWJiZmQuaDogQWRkIFRodW1iIHJlbG9jYXRpb25zLgotCi1Nb24gSnVuICAyIDEwOjQxOjUyIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogRml4IDY4MDYwIGNwdSBuYW1lLgotCi1GcmkgTWF5IDMwIDEyOjQ2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IGR5bmluZHgKLQlmb3IgYSBzZWN0aW9uIGV2ZW4gaWYgaXQgaXMgbm90IGxvYWRlZC4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogSWYgUEUgZmlsZSwgZG9uJ3Qgc3VidHJhY3QKLQlzZWN0aW9uIFZNQS4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2VwYXJhdGUgc2VjdGlvbiBWTUEgaGFuZGxpbmcgZm9yCi0JaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHdoZXRoZXIgaW5wdXQgZmlsZSwKLQlub3Qgb3V0cHV0IGZpbGUsIGlzIGEgUEUgZmlsZS4KLQotV2VkIE1heSAyOCAxNTo0ODo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiAoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogTWFrZSBzdGF0aWMuCi0KLVdlZCBNYXkgMjggMTY6MTY6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogRG9uJ3QganVzdCBleGl0IGlmIHdlIHNlZSBhbgotCVJfSU1BR0VCQVNFIHJlbG9jLgotCi1XZWQgTWF5IDI4IDA5OjQ4OjQzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6IEFkZCB0ZXN0IGZvciBzdXBlcnNldHMgb2YgQVJNCi0JYXJjaGl0ZWN0dXJlcy4KLQotVHVlIE1heSAyNyAxOTo0MjowMyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGdsb2JhbF90b19zdGF0aWMKLQltZW1iZXIuCi0KLVR1ZSBNYXkgMjcgMTQ6MzQ6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogTWFrZSBnbG9iYWwuICBJdCBpcwotCWNhbGxlZCBkaXJlY3RseSBieSBnYXMvY29uZmlnL3RjLWFybS5jLgotCi1UdWUgTWF5IDI3IDE1OjU4OjUzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChQTFRfRU5UUllfKik6IFVzZSBhIG5ldyB0aHJlYWQtc2FmZSBmb3JtYXQuCi0JKGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpbGwgaXQgaW4gcHJvcGVybHkuCi0KLU1vbiBNYXkgMjYgMTQ6MDU6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgUEUgZmlsZSwgZG9uJ3QgYWRkCi0Jc2VjdGlvbiBWTUEuCi0KLU1vbiBNYXkgMjYgMTA6NTc6NDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6ICN1bmRlZiBiZWZvcmUgI2RlZmluZS4KLQkoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGl0dG8uCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE1ha2Ugc3RhdGljLgotCShjb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCShjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEaXR0by4KLQkoY29mZl9hcm1fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCi1GcmkgTWF5IDIzIDE1OjE0OjU4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBib29sZWFuCi0JZ2xvYmFsX3RvX3N0YXRpYyBtZW1iZXIgZm9yIHN1cHBvcnQgb2YgdGFzayBsaW5raW5nLgotCShfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzKTogQWRkIHByb3RvdHlwZS4KLQkqIGxpYmNvZmYuaDogUmVnZW5lcmF0ZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlICNpZmRlZiB0bwotCWNoZWNrIFJTNjAwMENPRkZfQywgdG8gYmUgY29uc2lzdGVudCB3aXRoIGFsbCBvdGhlciB1c2VzCi0JaW4gdGhpcyBmaWxlLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsCi0JY2FsbCBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQKLQlnbG9iYWwgZnVuY3Rpb25zIHRvIHN0YXRpYy4KLQkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQKLQlnbG9iYWwgdmFyaWFibGVzIHRvIHN0YXRpYy4KLQkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvZmYtdGljODAuYyAoVElDODBDT0ZGKTogRGVmaW5lIHRoaXMgaW5zdGVhZCBvZiBqdXN0IFRJQzgwLgotCShDX0FVVE9BUkcpOiAjdW5kZWYgc2luY2UgaXQgY2xhc2hlcyB3aXRoIENfVUVYVC4KLQkoQ19MQVNURU5UKTogI3VuZGVmIHNpbmNlIGl0IGNsYXNoZXMgd2l0aCBDX1NUQVRMQUIuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBUSUM4MENPRkYKLQlyYXRoZXIgdGhhbiBUSUM4MC4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgQ19TWVNURU0uICBIaWRlIENfQVVUT0FSRyB1c2UKLQl3aGVuIFRJQzgwQ09GRiBkZWZpbmVkIChjbGFzaGVzIHdpdGggQ19VRVhUKS4gIEV4cGxpY2l0bHkKLQlyZWNvZ25pemUgQ19VRVhULCBDX1NUQVRMQUIsIGFuZCBDX0VYVExBQiBhcyB1bnN1cHBvcnRlZC4KLQotRnJpIE1heSAyMyAxMjozODoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBDaGFuZ2Ugb3ZlcmZsb3cgY2hlY2sgZm9yIG1vc3QKLQlQUCByZWxvY2F0aW9ucyB0byBjb21wbGFpbl9vdmVyZmxvd19kb250LgotCi1UaHUgTWF5IDIyIDIwOjIyOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MF9ob3d0b190YWJsZSk6IEFkZCBQUCByZWxvY2F0aW9ucy4gIENoYW5nZQotCW5hbWUgb2YgUl9SRUxMT05HIHRvICJSRUxMT05HIi4gIFNldCByaWdodHNoaWZ0IGFuZCBjb21wbGFpbiBmb3IKLQlNX1BQQ1IuCi0JKHBwYmFzZV9yZWxvYywgZ2xvYjE1X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGdsb2IxNl9yZWxvYywgbG9jYWwxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShydHlwZTJob3d0byk6IEhhbmRsZSBhbGwgcmVsb2NhdGlvbiB0eXBlcy4KLQkoY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lIHRvIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbi4KLQkqIE1ha2VmaWxlLmluIChjb2ZmLXRpYzgwLm8pOiBEZXBlbmRzIHVwb24gaW5jbHVkZS9jb2ZmL3RpYzgwLmguCi0KLVdlZCBNYXkgMjEgMTc6MTU6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIENPRkZfV0lUSF9QRSBvcgotCUNPRkZfSU1BR0VfV0lUSF9QRSwgZG9uJ3Qgc3VidHJhY3QgdGhlIHNlY3Rpb24gVk1BIGZyb20gdGhlIHN5bWJvbAotCXZhbHVlLgotCSogY29mZmdlbi5jIChmaXh1cF9zeW1ib2xfdmFsdWUpOiBBZGQgYWJmZCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIElmIFBFIGZpbGUsIGRvbid0IGFkZCBzZWN0aW9uIFZNQS4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBJZiBQRSBmaWxlLCBkb24ndCBhZGQgc2VjdGlvbiBWTUEuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBwZWljb2RlLmg6IEFkZCAmIDB4ZmZmZmZmZmYgd2hlbiB1c2luZyBJbWFnZUJhc2UgaW4gY2FzZSBiZmRfdm1hCi0JaXMgNjQgYml0cy4KLQotV2VkIE1heSAyMSAwOTo1ODoxMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChtYXJrX3JlbG9jcyk6IEFkZCBuZXcgZnVuY3Rpb24gdG8gbWFyayBzeW1ib2xzIHdoaWNoCi0JYXJlIHVzZWQgYnkgcmVsb2NhdGlvbnMuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IEFkZCBjYWxsIHRvIG1hcmtfcmVsb2NzKCkgYW5kIGNvZGUgdG8KLQlzdXBwcmVzcyB0aGUgc2tpcHBpbmcgb2Ygc3ltYm9scyB0aGF0IGhhdmUgdGh1cyBiZWVuIG1hcmtlZC4KLQotVHVlIE1heSAyMCAxODo0NToyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfbWVyZ2VfcHJpdmF0ZV9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQotTW9uIE1heSAxOSAxNDo0NjowMCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYzogUmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZnMuCi0JKiBjb25maWcuYmZkOiBTZXQgdGFyZ191bmRlcnNjb3JlIHRvIHllcyBmb3IgdGljODAuCi0KLU1vbiBNYXkgMTkgMTQ6MjY6MzYgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKE5BTUVTX0hBVkVfVU5ERVJTQ09SRSk6IERlZmluZSAoZml4ZXMgcHJvYmxlbQotCXdpdGggdW5yZXNvbHZlZCBleHRlcm5hbCBzeW1ib2xzIGluIEdEQikuCi0KLUZyaSBNYXkgMTYgMTA6MjM6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfcmVsYXhfc2VjdGlvbik6IFJlYWQgaW4gYWxsCi0JdGhlIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggQkZELgotCShtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBhZGp1c3QgdGhlIHNhbWUgc3ltYm9sCi0JbW9yZSB0aGFuIG9uY2UuCi0JKiBlbGYtbTEwMjAwLmM6IExpa2V3aXNlLgotCSogZWxmMzItbTMyci5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNoLmM6IExpa2V3aXNlLgotCi1GcmkgTWF5IDE2IDEyOjEwOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBkZWNyZWFzZSB0aGUKLQlhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sLiAgSWYgdHdvIHN5bWJvbHMgdGhhdCBsb29rIGxpa2UKLQljb21tb24gc3ltYm9scyBhcmUgZm91bmQgaW4gdHdvIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCB0aGUgc2l6ZSBpcwotCWRpZmZlcmVudCwgdXNlIHRoZSBsYXJnZXIgc2l6ZSwgYW5kIHdhcm4gaWYgLS13YXJuLWNvbW1vbi4gIElmIGEKLQljb21tb24gc3ltYm9sIG92ZXJyaWRlcyBhIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeSwgc2V0IHRoZQotCXNpemUgdG8gdGhlIGxhcmdlciBzaXplLCBhbmQgd2FybiBpZiAtLXdhcm4tY29tbW9uLgotCi1UaHUgTWF5IDE1IDE0OjMxOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6ICBBbGxvdyBkZWZhdWx0IG1hY2hpbmUgdG8gYmUgcG9seW1vcnBoZWQKLQlpbnRvIGFueSBvdGhlciBtYWNoaW5lIHR5cGUuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogIEluaXRpYWxpc2UgZmxhZ3MgdmFyaWFibGUgdG8gMC4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiAgV2hlbiBtZXJnaW5nCi0JZGF0YSBpbnRvIGFuIHVuaXRpYWxpc2VkIGRlc3RpbmF0aW9uIHNldCBpdHMgbWFjaGluZSB0eXBlIGFzIHdlbGwuCi0KLVRodSBNYXkgMTUgMTY6NDA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEZvcmNlIEVMRiBzeW1ib2wgc2l6ZQotCXRvIGNvbW1vbiBzeW1ib2wgc2l6ZS4gIENvbnNpc3RlbnRseSB0cmVhdCB1bmluaXRpYWxpemVkIHN5bWJvbHMKLQlpbiBzaGFyZWQgb2JqZWN0cyBhcyBjb21tb24gc3ltYm9scy4KLQotRnJpIE1heSAgOSAxMDoxNToyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChjb25zdGFudHMpOiAgQWRkZWQgbmV3IGNvbnN0YW50cyB0byBpZGVudGlmeSB0aGUKLQl0eXBlIG9mIHRoZSBBUk0gYXJjaGl0ZWN0dXJlOiBiZmRfbWFjaF9hcm1fMiwgYmZkX21hY2hfYXJtXzJhLAotCWJmZF9tYWNoX2FybV8zLAliZmRfbWFjaF9hcm1fM00sIGJmZF9tYWNoX2FybV80IGFuZCBiZmRfbWFjaF9hcm1fNFQuCi0KLQkqIGJmZC1pbjIuaCAoY29uc3RhbnRzKTogICBBZGRlZCBuZXcgY29uc3RhbnRzIHRvIGlkZW50aWZ5Ci0JdGhlIHR5cGUgb2YgdGhlIEFSTSBhcmNoaXRlY3R1cmU6IGJmZF9tYWNoX2FybV8yLCBiZmRfbWFjaF9hcm1fMmEsCi0JYmZkX21hY2hfYXJtXzMsIGJmZF9tYWNoX2FybV8zTSwgYmZkX21hY2hfYXJtXzQgYW5kCi0JYmZkX21hY2hfYXJtXzRULiAgVGhpcyBmaWxlIGlzIGF1dG8tbWFnaWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZQotCWFyY2h1cmVzLmMgZmlsZS4gIFRoaXMgdXBkYXRlIGlzIGp1c3QgdG8gc2F2ZSB3b3JrLgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwKLQljb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwKLQljb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MsCi0JY29mZl9hcm1fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZGVkIHRoZXNlIG5ldyBmdW5jdGlvbnMuCi0JKGdsb2JhbCk6IE1hY3JvIHJlZGVmaW5pdGlvbnMgc2V0IHVwIHRvIHVzZSB0aGVzZSBuZXcgZnVuY3Rpb25zLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBBZGRlZCBjYWxsIHRvCi0JY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKCkuCi0JKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkZWQgY29kZSB0byBzZXQgbWFjaGluZSB0eXBlIGJhc2VkIG9uCi0JYml0cyBzdG9yZWQgaW4gaW50ZXJuYWwgZmxhZ3MuCi0gIAkoY29mZl9zZXRfZmxhZ3MpOiBBZGRlZCBjb2RlIHRvIHNldCB0aGUgbmV3IGJpdHMgaW4gdGhlIGZsYWdzCi0JZmllbGQgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgotCShmdW5jdGlvbiBkZWZpbml0aW9uIG1hY3Jvcyk6IE1hZGUgYWxsIGZ1bmN0aW9uIGRlZmluaXRpb24gbWFjcm9zCi0JY29uZGl0aW9uYWwgc28gdGhhdCB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRhcmdldCBzcGVjaWZpYwotCWZpbGVzLgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiBBZGRlZCB0aGlzIGZ1bmN0aW9uLiAgKGFyY2hfaW5mb19zdHJ1Y3QpOgotCVN0cnVjdHVyZSBleHRlbmRlZCB0byBpbmNsdWRlIG5ldyB0eXBlcywgb25lIGVhY2ggZm9yIEFSTXYyLAotCUFSTXYyYSwgQVJNdjMsIEFSTXYzTSwgQVJNdjQgYW5kIEFSTXY0VC4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl90ZGF0YSk6ICBBZGRlZCBmbGFncyBmaWVsZC4KLQotRnJpIE1heSAgOSAxNzo0MDowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWdudSopOiBEb24ndCBpbmNsdWRlIE1hY2ggc3VwcG9ydC4KLQotCSogY29uZmlnLmJmZDogQ2hhbmdlICNpZiAwIGFyb3VuZCB1c2VzIG9mIGhvc3RfYW91dF92ZWMgdG8gI2lmCi0JSEFWRV9ob3N0X2FvdXRfdmVjLgotCi1Nb24gTWF5ICA1IDEzOjU3OjMyIDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBJZiB0aGVyZSBhcmUgbm8gc3ltZW50cywKLQlqdXN0IHJldHVybiBmYWxzZS4KLQotTW9uIE1heSAgNSAxODoxODo0NSAxOTk3ICBQaGlsaXAgQmx1bmRlbGwgIDxwamIyN0BjYW0uYWMudWs+Ci0KLQkqIGNvbmZpZy5iZmQ6IGNvcGUgd2l0aCAnKi0qLWxpbnV4LWdudWFvdXQnIHRhcmdldHMuCi0KLVRodSBNYXkgIDEgMTE6MzE6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnbWF0Y2guc2VkOiBBZGQgZXhwbGljaXQgXG4gY2hhcmFjdGVycyB0byB3b3JrIGFyb3VuZCBidWcgaW4KLQlIUC9VWCAxMC4yMCBzZWQgcHJvZ3JhbS4KLQotV2VkIEFwciAzMCAxMjoyNzowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDYXN0IGNzZWNzIHRvIGF2b2lkIHNpZ24KLQlleHRlbnNpb24gcHJvYmxlbXMuCi0KLVR1ZSBBcHIgMjIgMTI6MDY6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IERvbid0IHJlbW92ZSBiZmQtaW4yLmguCi0KLU1vbiBBcHIgMjEgMTE6MjE6MzEgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYzogRm9sbG93IHRoZSBsYXN0IGNoYW5nZXMgaW4gZWxmMzItaTM4Ni5jOgotCShzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCwgc3RydWN0Ci0JZWxmX202OGtfbGlua19oYXNoX2VudHJ5LCBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlLAotCWVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSwgZWxmX202OGtfaGFzaF90YWJsZSwKLQllbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYywgZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwKLQllbGZfbTY4a19kaXNjYXJkX2NvcGllcywgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKToKLQlOZXcgZGVmaW5pdGlvbnMuCi0JKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBkb24ndCBjb3B5Ci0JUEMgcmVsYXRpdmUgcmVsb2NzIGZvciBhIGdsb2JhbCBzeW1ib2wgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlvYmplY3QsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIGFueQotCWdsb2JhbCBzeW1ib2wuCi0JKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLAotCXRyYXZlcnNlIHdpdGggZWxmX202OGtfZGlzY2FyZF9jb3BpZXMuCi0KLVNhdCBBcHIgMTkgMjI6NTA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE9ubHkgY291bnQgUEMgcmVsYXRpdmUKLQlyZWxvY3MuICBGcm9tIEphbWllIExva2llciA8amFtaWVAcmViZWxsaW9uLmNvLnVrPi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3JjZSB0aGUKLQlwb3RlbnRpYWwgbGFzdCBieXRlIGluIHRoZSBmaWxlIHRvIGJlIHdyaXR0ZW4gb3V0IHdoZW4KLQlDT0ZGX0lNQUdFX1dJVEhfUEUuCi0KLVRodSBBcHIgMTcgMTM6NDY6NTYgMTk5NyAgUGVyIEZvZ2Vsc3Ryb20gIDxwZWZvQG9wZW5ic2Qub3JnPgotCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcyotKi1vcGVuYnNkKik6IE5ldyBob3N0LgotCi1UaHUgQXByIDE3IDExOjEwOjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IHN1YnRyYWN0IHRoZQotCXNlY3Rpb24gVk1BIGZyb20gdGhlIHN5bWJvbCB2YWx1ZSBpZiB0aGlzIGlzIGEgZnVsbHkgbGlua2VkIGZpbGUuCi0KLQkqIGVsZjMyLWkzODYuYyAoc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KLQkoZWxmX2kzODZfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGRvbid0IGNvcHkKLQlQQyByZWxhdGl2ZSByZWxvY3MgZm9yIGEgZ2xvYmFsIHN5bWJvbCBkZWZpbmVkIGluIGEgcmVndWxhcgotCW9iamVjdCwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgYW55Ci0JZ2xvYmFsIHN5bWJvbC4KLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsCi0JdHJhdmVyc2Ugd2l0aCBlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcy4KLQkoZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUuCi0KLQlGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIGFvdXRmMS5oIChNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBVc2UgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzLgotCi1XZWQgQXByIDE2IDEyOjQzOjMyIDE5OTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGVsZl9kMzB2X2hvd3RvX3RhYmxlKTogQ2hhbmdlZCBzaXplIG9mCi0JUl9EMzBWXzMyX05PUk1BTCB0byAyICg0IGJ5dGVzKS4KLQotV2VkIEFwciAxNiAxNDowMjoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIG5ldGJzZC5oIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUuCi0JKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KLQkqIG02OGtuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lIChyZXZlcnQgY2hhbmdlIG9mCi0JQXByaWwgMTEpLgotCSogc3BhcmNuZXRic2QuYyAoVEFSR0VUX1BBR0VfU0laRSk6IERlZmluZSBhcyAweDIwMDAuCi0JKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogU2V0IC5yZWxhLmJzcyBzaXplCi0JdG8gc2l6ZW9mIFJlbGEgc3RydWN0dXJlLCBub3Qgc2l6ZW9mIFJlbCBzdHJ1Y3R1cmUuICBGcm9tIEdhcnkKLQlUaG9tYXMgPGcudGhvbWFzQG9wZW5ncm91cC5vcmc+LgotCi1UdWUgQXByIDE1IDExOjUwOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogSWYgZW50cnlfaXNfdGV4dF9hZGRyZXNzLCBhZGp1c3QKLQl3aGVuZXZlciBlbnRyeSBpcyBsYXJnZXIgdGhhbiB0ZXh0IGFkZHJlc3MsIGJ1dCBvbmx5IGJ5IHdob2xlCi0JcGFnZXMuICBGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPi4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4gIFVzZQotCW1raW5zdGFsbGRpcnMgdG8gYnVpbGQgJChvbGRpbmNsdWRlZGlyKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNhbGwgY2hlY2tfcmVsb2NzCi0JaWYgdGhpcyBpcyBhIGRlYnVnZ2luZyBzZWN0aW9uIHdoaWNoIHdlIGFyZSBzdHJpcHBpbmcuCi0KLU1vbiBBcHIgMTQgMTI6Mzk6MzAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX29iamVjdF9wKTogQWxsb2NhdGUgdGhlCi0JYWxwaGEtc3BlY2lmaWMgdGFyZ2V0IGRhdGEgc3RydWN0LgotCi1Nb24gQXByIDE0IDExOjQ1OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIE1ha2VmaWxlLmluOiBBbHdheXMgdXNlICQoU0hFTEwpIHdoZW4gcnVubmluZyBtb3ZlLWlmLWNoYW5nZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTEgMTU6NDM6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBPbmx5IHN1YnRyYWN0IHRoZSBzZWN0aW9uCi0JVk1BIGlmIHRoaXMgaXMgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIGEgc2hhcmVkIG9iamVjdC4KLQotCSogdGFyZ2V0cy5jIChuZXRic2RfY29yZV92ZWMpOiBEZWNsYXJlLiAgRnJvbSBHb3Jkb24gVy4gUm9zcwotCTxnd3JAbWMuY29tPi4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgZW50cnlfaXNfdGV4dF9hZGRyZXNzCi0JZmllbGQuCi0JKiBhb3V0LXRhcmdldC5oIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgdG8gVEFSR0VUX1BBR0VfU0laRSBhdCB0aGUKLQlzdGFydCBvZiB0aGUgZmlsZS4gIFJlbW92ZSB1c2VzIGxhdGVyIG9uIHdoaWNoIHN3aXRjaCB1c2luZwotCWlmZGVmLgotCShNWShjYWxsYmFjaykpOiBIYW5kbGUgZW50cnlfaXNfdGV4dF9hZGRyZXNzLgotCShNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogTGlrZXdpc2UuCi0JKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYyAoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgotCSogbmV0YnNkLmggKFNFR01FTlRfU0laRSk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lLgotCSogbTY4a25ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgYXMgMHgyMDAwMC4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogSGFuZGxlIGltcG9ydGluZyBhIHN5bWJvbAotCXdob3NlIG5hbWUgc3RhcnRzIHdpdGggYC4nLgotCi1GcmkgQXByIDExIDExOjU3OjE1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZy5iZmQ6IChpWzM0NTZdODYtKi1vcGVuYnNkKiwgbTY4Ki0qLW9wZW5ic2QqLAotCW1pcHMqZWwqLSotb3BlbmJzZCosIG1pcHMqLSotb3BlbmJzZCosIG5zMzJrLSotb3BlbmJzZCosCi0JcG93ZXJwYy0qLSpic2QqLCBzcGFyYy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1Nl04Ni0qLW9wZW5ic2QqLCBtaXBzKi0qLW9wZW5ic2QqLAotCW02OCotKi1vcGVuYnNkKiwgbnMzMmstKi1vcGVuYnNkKiwgcG93ZXJwYy0qLSpic2QqLAotCXNwYXJjLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEFwciAgOCAxODowOToyOSAxOTk3ICBKYW1pZSBMb2tpZXIgIDxqYW1pZUByZWJlbGxpb24uY28udWs+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyk6IE5ldyBmaWVsZAotCWBjdW11bGF0aXZlX3NraXBzJy4KLQkoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBGaWxsIHRoZSBhYm92ZSBhcnJheS4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0KTogVXNlIGBjdW11bGF0aXZlX3NraXBzJyB0bwotCXNwZWVkIHVwIG9mZnNldCBjYWxjdWxhdGlvbi4KLQotVHVlIEFwciAgOCAwMDowMTozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBlbGYtbW4xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogRG9uJ3QgZm9yZ2V0IHRoZQotICAgICAgICBhZGRlbmQgZm9yIG5vbiBwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotCSogZWxmLW0xMDMwMC5jIChiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IFJlbW92ZSBwcm90b3R5cGUKLQlmb3Igbm9uLWV4aXN0ZW50IGZ1bmN0aW9uLgotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wKTogTGlrZXdpc2UuCi0JKG1uMTAzMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLU1vbiBBcHIgIDcgMTY6NDc6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IFNITElCX0xJQlMuCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgU0hMSUJfTElCUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChTSExJQl9MSUJTKTogTmV3IHZhcmlhYmxlLgotCSgkKFNITElCKSk6IFVzZSAkKFNITElCX0xJQlMpLgotCi1Nb24gQXByICA3IDEwOjUzOjUyIDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIGJmZC1pbjIuaDogYWRkIGJmZF9zZWN0aW9uX2xtYSBtYWNybyB0byBjb3JyZXNwb25kCi0Jd2l0aCBiZmRfc2VjdGlvbl92bWEuCi0KLUZyaSBBcHIgIDQgMTE6Mzc6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVwZGF0ZSBmaWxlIG5hbWVzIGZvciBiZmRfZWxmMzJfbW4xMFsyM10wMF92ZWMuCi0JQ29ycmVjdCBDUFUgZmlsZSBuYW1lcyBmb3IgbW4xMFsyM10wMC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYmZkLmMgKGJmZF9yZWNvcmRfcGhkcik6IENhc3QgY291bnQgdG8gc2l6ZV90IGJlZm9yZQotCXN1YnRyYWN0aW9uLgotCi0JKiBjb2ZmLXBwYy5jIChkdW1wX3RvYyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcgZnJvbSBTdW5PUyBjYy4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX3JlYWRfYXJfaGRyKTogTGlrZXdpc2UuCi0JKHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBMSWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogTGlrZXdpc2UuCi0JKHBlX3ByaW50X2VkYXRhLCBwZV9wcmludF9wZGF0YSwgcGVfcHJpbnRfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IExpa2V3aXNlLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotCSogcHBjYm9vdC5jIChwcGNib290X3NldF9hcmNoX21hY2gpOiBNYWtlIHN0YXRpYy4KLQkocHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2N0b3I2NF9ob3d0byk6IFNldCBjb21wbGFpbl9vbl9vdmVyZmxvdwotCXRvIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotVGh1IEFwciAgMyAxMTo1MTo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFZFUlNJT046IFNldCB0byAyLjguMS4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiAgRG9uJ3QgY2hlY2sgU0VDX0FMTE9DIHdoZW4KLQlkZWNpZGluZyB3aGV0aGVyIHRvIGNvcHkgYSByZWxvYyBpbnRvIGEgc2hhcmVkIG9iamVjdC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuICBSZWxvY2F0ZSBSX1BQQ19SRUxBVElWRQotCXJlbG9jcyBpbiB1bmFsbG9jYXRlZCBzZWN0aW9ucy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWxvY2F0ZQotCVJfU1BBUkNfUkVMQVRJVkUgcmVsb2NzIGluIHVuYWxsb2NhdGVkIHNlY3Rpb25zLgotCi1XZWQgQXByICAyIDE2OjE5OjQxIDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBVbmRvIE1hcmNoIDI2IGNoYW5nZSBhbmQKLQlhbHdheXMgY3JlYXRlIGdvdCBzZWN0aW9uIHNvIHRoYXQgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBsYWJlbAotCWlzIGFsd2F5cyBjcmVhdGVkLgotCi1XZWQgQXByICAyIDEwOjQ5OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMZXQgYSBjb21tb24gc3ltYm9sCi0Jb3ZlcnJpZGUgYW4gdW5pbml0aWFsaXplZCBzeW1ib2wgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5IHdpdGggYQotCXNtYWxsZXIgc2l6ZS4KLQotCSogZWxmLW0xMDIwMC5jOiBSZW5hbWUgZnJvbSBlbGYzMi1tbjEwMjAwLmMuCi0JKiBlbGYtbTEwMzAwLmM6IFJlbmFtZSBmcm9tIGVsZjMyLW1uMTAzMDAuYy4KLQkqIGNwdS1tMTAyMDAuYzogUmVuYW1lIGZyb20gY3B1LW1uMTAyMDAuYwotCSogY3B1LW0xMDMwMC5jOiBSZW5hbWUgZnJvbSBjcHUtbW4xMDMwMC5jCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGFjY29yZGluZ2x5LgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2N0b3I2NF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGVsZl9taXBzX2lzYSk6IE1vdmUgdG8gZWFybGllciBpbiBmaWxlLgotCShtaXBzX3JlbG9jX21hcCk6IFJlbW92ZSBCRkRfUkVMT0NfQ1RPUiBlbnRyeS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUgotCXNwZWNpYWxseS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzMTZfanVtcF9yZWxvYyk6IFByaW50IGEgd2FybmluZyByYXRoZXIgdGhhbgotCWNhbGxpbmcgYWJvcnQuCi0KLVR1ZSBBcHIgIDEgMTY6MTg6MDUgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IE5ldyBmaWxlLgotCSogY29uZmlnLmgtdm1zOiBSZW1vdmUgZmlsZS4KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBuZXcgY29uZmlndXJlIHNjaGVtZS4KLQotTW9uIE1hciAzMSAyMzoyODozOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBsaWJjb2ZmLWluLmggKHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbik6IERlY2xhcmUuCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogRGVjbGFyZSBpZiBub3QgYSBtYWNyby4KLQotTW9uIE1hciAzMSAxNjoyOTo1MCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5iZmQgKGhwcGEqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBocHBhLSotKmVsZiouCi0KLU1vbiBNYXIgMzEgMTY6MTE6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB1c2Ugc3ltbmR4IGFzIGEKLQlzeW1ib2wgaW5kZXggZm9yIGEgUl9JSENPTlNUIHJlbG9jLgotCi1Nb24gTWFyIDMxIDE1OjQwOjU5IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIHRhcmdtYXRjaC5zZWQ6IERvIG5vdCB1c2UgXChcKSByZWN1cnNpdmVseS4KLQotRnJpIE1hciAyOCAxNDo0NDowOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBtNjhrbGludXguYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0JKiBpMzg2bGludXguYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0KLUZyaSBNYXIgMjggMTE6NTY6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGNhaXAucnV0Z2Vycy5lZHU+IGFuZCBILkouIEx1Ci0JPGhqbEBnbnUuYWkubWl0LmVkdT46Ci0JKiBzcGFyY2xpbnV4LmM6IE5ldyBmaWxlLgotCSogYmZkLWluLmggKGJmZF9zcGFyY2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb25maWcuYmZkIChzcGFyYy0qLWxpbnV4YW91dCosIHNwYXJjLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGludXhfdmVjKTogQWRkIHRvIGxpc3Qgb2YgdmVjdG9ycy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoc3BhcmNsaW51eF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzcGFyY2xpbnV4X3ZlYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgc3BhcmNsaW51eC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgc3BhcmNsaW51eC5jLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldwotCWJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBmaWVsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBiZmRfZWxmNjRfe2JpZyxsaXR0bGV9bWlwc192ZWMgdG8gdGFyZ19zZWx2ZWNzCi0JZm9yIG1pcHMqZWwqLSotbGludXgqIGFuZCBtaXBzKi0qLWxpbnV4Ki4gIEZyb20gSC5KLiBMdQotCTxoamxAbHVjb24ub3JnPiBhbmQgUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1Pi4KLQotCSogYmZkLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoc3RyZXJyb3IpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZXJybXNnKTogQ2FsbCB4c3RyZXJyb3IgcmF0aGVyIHRoYW4gc3RyZXJyb3IuCi0KLVRodSBNYXIgMjcgMTI6NTU6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIGEgQ09QWQotCXJlbG9jIGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgLmJzcyBzZWN0aW9uLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlci4KLQkoYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcik6IERlZmluZS4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpbWl0IGFsaWdubWVudCBvZiBhIGNvbW1vbgotCXN5bWJvbCB0byB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudC4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1UaHUgTWFyIDI3IDAwOjQ1OjU3IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGVsZl9kMzB2X2hvd3RvX3RhYmxlKTogRml4IGEgdHlwbyBpbiB0aGUKLQkyMS1iaXQgYWJzb2x1dGUgdGhhdCBtYWRlIGl0IGFjdCBhcyBhIHJlbGF0aXZlLgotCi1XZWQgTWFyIDI2IDE0OjUwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBEb24ndCBzZXQKLQlic3Nfc2VjdGlvbiBhbmQgcmVsX3NlY3Rpb24gZnJvbSBleGlzdGluZyBzZWN0aW9ucy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogT25seSBjcmVhdGUgdGhlIGdvdCBzZWN0aW9uCi0JaWYgaXQgaXMgbmVlZGVkLgotCi1UdWUgTWFyIDI1IDIyOjI2OjU2IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBDaGFuZ2UgZXhlY3V0YWJsZSB0ZXN0IHRvIGZpeAotCXByb2JsZW1zIHdpdGggZW1iZWRkZWQgYS5vdXQgc3lzdGVtcy4KLQotVHVlIE1hciAyNSAxNDozNTozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgdGhlIG9mZnNldCBvZiBhCi0Jc3RhYiByZWxvYy4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogQ29weSBvdmVyIHRoZSBmaXJzdCBoZWFkZXIKLQlzeW1ib2wuICBDaGVjayBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvZiAqcHNpbmZvLgotCShfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBBZGQgcHNpbmZvIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyIHN5bWJvbC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIE1hciAyNCAyMDowNzoyOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MF9ob3d0b190YWJsZSk6IEFkZCBSX0FCUyBlbnRyeS4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9BQlMgcmVsb2MgdHlwZS4gIEFsc28gYWJvcnQgb24gdW5oYW5kbGVkCi0JcmVsb2MgdHlwZXMsIHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcgdG8gZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUuCi0KLU1vbiBNYXIgMjQgMTM6NDE6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnbWF0Y2guc2VkOiBVc2UgdGhlIGhvbGQgc3BhY2UgdG8gcHV0IHRoZSAjaWZkZWYgYXJvdW5kIHRoZQotCXRoZSBzdHJpbmcgY29uc3RhbnQuCi0JKiB0YXJnZXRzLmMgKFVOU1VQUE9SVEVEX1RBUkdFVCk6IERvbid0IGRlZmluZS4KLQkoZmluZF90YXJnZXQpOiBEb24ndCBjaGVjayBmb3IgVU5TVVBQT1JURURfVEFSR0VULgotCShiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0KTogRG9uJ3QgdHJ5IHRvIG9wdGltaXplIGJ5IGNoZWNraW5nIGZvcgotCWRlZmF1bHQuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LW0zMnIuYy4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLW0zMnIuYy4KLQkoZWxmMzItbTMyci5vKTogUmVtb3ZlIGV4cGxpY2l0IHRhcmdldC4KLQotCSogY29uZmlnLmJmZDogRG9uJ3Qgc2V0IHRhcmdfdW5kZXJzY29yZSBmb3IgaVszNDU2XTg2LSotZ251KiBvcgotCWlbMzQ1Nl04Ni0qLWxpbnV4Ki4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QKLQljb3VudCBzZWN0aW9uIHN5bWJvbHMgZm9yIHNlY3Rpb25zIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IHRoZQotCWxpbmtlciwgb3IgYXJlIG5vdCBhbGxvY2F0YWJsZSBvciBub3QgbG9hZGFibGUuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT3V0cHV0IG91dHB1dCBzZWN0aW9uCi0Jc3ltYm9scyBmb3Igc2VjdGlvbiBmb3Igd2hpY2ggd2UgbWFkZSBzcGFjZSBmb3IgdGhlbS4KLQotRnJpIE1hciAyMSAxMzowODoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZXJlIGlzCi0Jbm8gLnJlbGEucGx0IHNlY3Rpb24sIGRvbid0IG91dHB1dCBhIERUX1BMVEdPVCBkeW5hbWljIGVudHJ5LgotCi1GcmkgTWFyIDIxIDEyOjM2OjQ2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfaG93dG9fdGFibGUpOiBVc2Ugc3BlY2lhbCBmdW5jdGlvbiBmb3IgTE8xNi4KLQkobTMycl9oaTE2X2xpc3QpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtMzJyX2VsZl9oaTE2X3JlbG9jKTogRG9uJ3QgcGVyZm9ybSByZWxvYywganVzdCBxdWV1ZSBpdCB1cC4KLQkobTMycl9lbGZfZG9faGkxNl9yZWxvYyk6IERlbGV0ZS4KLQkobTMycl9lbGZfcmVsb2NhdGVfaGkxNik6IE5ldyBmdW5jdGlvbi4KLQkobTMycl9lbGZfbG8xNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBISTE2IHJlbG9jcywgc2NhbiBmb3IgY29ycmVzcG9uZGluZwotCUxPMTYgcmVsb2MuCi0KLQlNb24gTWFyIDEwIDE2OjAzOjMxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IERlbGV0ZS4KLQkobTMycl9lbGZfYWRkX3N5bWJvbF9ob29rKTogUmV3cml0ZSBfU0RBX0JBU0VfIHN1cHBvcnQuCi0JKG0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlKTogTmV3IGZ1bmN0aW9uLgotCShtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV3cml0ZSBzZGF0YSBzdXBwb3J0LgotCShtMzJyX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERlbGV0ZS4KLQotVGh1IE1hciAyMCAxMjozOTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQkqIGNvZmYtc3ZtNjhrLmM6IE5ldyBmaWxlLiAgSnVzdCBkZWZpbmVzIHNvbWUgbWFjcm9zIGFuZCBpbmNsdWRlcwotCWNvZmYtbTY4ay5jLgotCSogY29mZi1tNjhrLmM6IEFkZCBmdW5jdGlvbnMgdG8gaGFuZGxlIGNvbW1vbiBhZGRlbmRzLCBtb3ZlZCBpbgotCWZyb20gY2YtbTY4a2x5bnguYy4gIENvbnRyb2wgdGhlbSB1c2luZyBDT0ZGX0NPTU1PTl9BRERFTkQgbWFjcm8uCi0JQ29udHJvbCB3aGV0aGVyIHJlbG9jcyBhcmUgdmlzaWJsZSB1c2luZyBTVEFUSUNfUkVMT0NTLgotCSogY2YtbTY4a2x5bnguYzogU2ltcGxpZnkgZ3JlYXRseToganVzdCBkZWZpbmUgbWFjcm9zIHRvIGNvbnRyb2wKLQljb2ZmLW02OGsuYy4KLQkqIGNvZmYtYXV4LmM6IExpa2V3aXNlLiAgSnVzdCBsZWF2ZSBhZGRfb25lX3N5bWJvbCByb3V0aW5lLgotCSogdGFyZ2V0cy4gKG02OGtzeXN2Y29mZl92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBtNjhrc3lzdmNvZmZfdmVjLgotCSogY29uZmlnLmJmZCAobTY4Ki1tb3Rvcm9sYS1zeXN2Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKG02OGtzeXN2Y29mZl92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zdm02OGsuby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtc3ZtNjhrLmMuCi0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCBnZXQgbWlzbGVkIGlmIHRoZQotIAlmaXJzdCBzZWN0aW9uIGlzIG5vdCBsb2FkYWJsZS4gIEZyb20gTWF0dGhldyBMLiBNYXJ0aW4KLSAJPG1sbUB4ZWRpYS5jb20+LgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFNldCB0aGUgdmFsdWUgb2YgYSBzZWN0aW9uCi0Jc3ltYm9sIHRvIHRoZSBzZWN0aW9uIGFkZHJlc3MgdW5sZXNzIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuCi0KLVR1ZSBNYXIgMTggMjM6MDM6MTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IGNyZWF0ZQotCS5wbHQgZW50cnkgaWYgd2UndmUgdGFrZW4gdGhlIGZ1bmN0aW9uJ3MgYWRkcmVzcy4KLQkoZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyk6IE1lcmdlIGNvbGxlY3RlZCBmbGFncyBpbmZvIGFzIHdlbGwuCi0KLVR1ZSBNYXIgMTggMjI6NDA6MDkgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZCBmdW5jdGlvbiBwcm90b3R5cGVzLgotCSogY3B1LW02OGsuYyAoYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCk6IERvbid0IGRlY2xhcmUuCi0JKiBlY29mZmxpbmsuYzogSW5jbHVkZSAibGliY29mZi5oIiBhbmQgImxpYmVjb2ZmLmgiLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZmFrZV9zZWN0aW9ucyk6IE1ha2Ugc3RhdGljLgotCSogb3BuY2xzLmMgKGJmZF9vcGVuc3RyZWFtcik6IENoYW5nZSBzdHJlYW0gcGFyYW1ldGVyIHRvIFBUUi4KLQkqIHBlaWNvZGUuaDogQ2hhbmdlIHNldmVyYWwgdm9pZCAqIHBhcmFtZXRlcnMgdG8gUFRSLgotCSogc3JlYy5jIChzcmVjX2dldF9zeW1ib2xfaW5mbyk6IE1ha2Ugc3RhdGljLgotCSogc3ltcy5jIChiZmRfc3ltYm9sX2lzX2Fic29sdXRlKTogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1UdWUgTWFyIDE4IDEyOjU4OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogUmVtb3ZlLgotCShiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVmaW5lLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IENhbGwgYmZkX21hbGxvYyByYXRoZXIKLQl0aGFuIG1hbGxvYy4KLQotTW9uIE1hciAxNyAxMTozMjo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBEb24ndCBpbmNsdWRlIG9ic3RhY2suaC4KLQkoc3RydWN0IGJmZF9oYXNoX3RhYmxlKTogQ2hhbmdlIG1lbW9yeSBmaWVsZCB0byBQVFIuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBDaGFuZ2UgbWVtb3J5IGZpZWxkIHRvIFBUUi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC1pbi5oIChiZmRfcmVsZWFzZSk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIGRvbid0IGRlZmluZSBhcwotCW1hY3JvLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBvcG5jbHMuYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKLQlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgotCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCi0JKGdldHBhZ2VzaXplKTogRG9uJ3QgZGVmaW5lLgotCShfYmZkX25ld19iZmQpOiBEb24ndCBzZXQgX2JmZF9jaHVua3NpemUuCi0JKGJmZF9vcGVucik6IEZyZWUgbmV3IGJmZCBhbmQgb2JqYWxsb2Mgb24gZmFpbHVyZS4KLQkoYmZkX2Zkb3BlbnIsIGJmZF9vcGVuc3RyZWFtciwgYmZkX29wZW53KTogTGlrZXdpc2UuCi0JKGJmZF9hbGxvY19zaXplKTogUmVtb3ZlLgotCShiZmRfcmVsZWFzZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGhhc2guYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKLQlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgotCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCi0JKiBlY29mZmxpbmsuYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKLQlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgotCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBhY2N1bXVsYXRlKTogQ2hhbmdlIG1lbW9yeSB0byBzdHJ1Y3Qgb2JqYWxsb2MgKi4KLQkqIGxpYm9hc3lzLmggKG9hc3lzX2RhdGFfdHlwZSk6IFJlbW92ZSBvYXN5c19vYnN0YWNrIGZpZWxkLgotCSogZGVwLWluLnNlZDogRG9uJ3QgcmVtb3ZlIG9ic3RhY2suaCBmcm9tIGRlcGVuZGVuY3kgbGlzdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0hfREVQUyk6IFJlbW92ZSBvYnN0YWNrLmguCi0JKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIG9ic3RhY2suaC4KLQkqIE1hbnkgZmlsZXM6IERvbid0IGluY2x1ZGUgIm9ic3RhY2suaCIuCi0JKiBWRVJTSU9OOiBCdW1wLgotCi0JKiBvcG5jbHMuYyAoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvY19maW5pc2gpOiBSZW1vdmUuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvY19maW5pc2gpOiBEb24ndCBkZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBpZWVlLmMgKGllZWVfYXJjaGl2ZV9wKTogUmV3cml0ZSB0byBub3QgdXNlIGJmZF9hbGxvY19ncm93LgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBSZXdyaXRlIHRvIG5vdCB1c2Ugb2JzdGFja18xZ3Jvdy4KLQotCSogb3BuY2xzLmMgKGJmZF9hbGxvYyk6IFJlbmFtZSBmcm9tIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZW1vdmUKLQlvbGQgdmVyc2lvbiBvZiBiZmRfYWxsb2MuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jX2J5X3NpemVfdCk6IERvbid0IGRlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIFNldmVyYWwgZmlsZXM6IENhbGwgYmZkX2FsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvY19ieV9zaXplX3QuCi0KLVNhdCBNYXIgMTUgMTU6MjQ6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBBY2NlcHQgdGhlIGdlbmVyaWMKLQlFTEYgbG9jYWwgbGFiZWwgc3ludGF4IGFzIHdlbGwuCi0KLVNhdCBNYXIgMTUgMTA6MTY6NDIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1iZW9zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMtKi1iZW9zKik6IEFkZCBjYXNlIHRoYXQgZXhwbGljaXRseQotCWRvZXMgbm90IHNldCBDT1JFRklMRSBmb3Igbm93LiAgQSBmdXR1cmUgQmVPUyB2ZXJzaW9uIGlzCi0JZXhwZWN0ZWQgdG8gc3VwcG9ydCBjb3JlIGZpbGVzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0KLUZyaSBNYXIgMTQgMTY6NDM6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEdpdmUgYW4gZXJyb3IgaWYgQ0FMTDE2IGlzCi0gCXNlZW4gd2l0aCBhIGxvY2FsIHN5bWJvbCwgcmF0aGVyIHRoYW4gY3Jhc2hpbmcuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHRyeSB0byByZWFkIHRoZQotCXZlcnNpb24gc3ltYm9scyBpZiB0aGVyZSBhcmVuJ3QgYW55LgotCi1UaHUgTWFyIDEzIDE2OjM4OjMwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUKLQkoY29mZl90aWM4MF9ydHlwZV90b19ob3d0byk6IENsb25lIGdlbmVyaWMgY29mZiB2ZXJzaW9uIGFuZAotCWFkZCBjb2RlIHRvIGhhbmRsZSB0aGUgZnVua3kgVEkgImludGVybmFsIHJlbG9jYXRpb25zIi4KLQotVGh1IE1hciAxMyAxNDowODo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3Qgd2FybiBhYm91dCB0eXBlCi0Jb3Igc2l6ZSBjaGFuZ2VzIGJlY2F1c2Ugb2YgYSB3ZWFrIHN5bWJvbC4KLQotCSogY2lzY28tY29yZS5jIChTSUdFTVQpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0KLVdlZCBNYXIgMTIgMjE6MzY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBleHRzeW1vZmYgd2hlbgotCXNldHRpbmcgZXZlci4gIFNhbml0eSBjaGVjayB0aGUgdmVyc2lvbiBudW1iZXIuICBTb3J0IG91dCBjb3B5aW5nCi0JZmxhZ3MgYW5kIG90aGVyIGluZm9ybWF0aW9uIHdoZW4gYWRkaW5nIGFuIGluZGlyZWN0IHN5bWJvbC4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBQcmVzZXJ2ZSBhbnkgZHluYW1pYwotCXN5bWJvbHMgYWRkZWQgYnkgdGhlIGJhY2tlbmQuICBDbGVhciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZQotCXZlcnN5bSBzZWN0aW9uLgotCShlbGZfZXhwb3J0X3N5bWJvbCk6IElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQWNjZXB0IGEgc2VjdGlvbiB3aXRob3V0IGFuIG93bmVyIGluIGFuCi0JYXNzZXJ0LgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWRkIGEgc2FuaXR5IGNoZWNrIG9uIHRoZQotCXZlcnNpb24gY291bnQuICBDb3JyZWN0IHRoZSBhbGxvY2F0aW9uIG9mIHhfdmVyc3ltcC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEb24ndCBzZXQgdGhlIG93bmVyIG9mCi0JdGhlIG1hZ2ljIHNlY3Rpb25zIHVzZWQgZm9yIFNITl9NSVBTX1RFWFQgYW5kIFNITl9NSVBTX0RBVEEuCi0JRG9uJ3QgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHIgd2hlbiBpbmZvLT5zaGFyZWQuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBTZXQgdGhlIGFsaWdubWVudCBvZiAucnRwcm9jIHRvIDQsIG5vdCAxMi4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IHR5cGU6IF49IGZvciAmPS4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogUmVzb2x2ZSBhbiBpbmRpcmVjdCBzeW1ib2wgaW4KLQlzeW1faGFzaGVzLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjaGFuZ2UgU0hOX0FCUyBpbnRvCi0JU0hOX01JUFNfVEVYVCBvciBTSE5fTUlQU19EQVRBLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBUd2VhayB2ZXJzaW9uIG91dHB1dCBzbGlnaHRseS4KLQotVHVlIE1hciAxMSAwMTozODozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCk6IERlZmluZS4KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IENvcnJlY3QgZXJyb3JzIGluIGxhc3QgY2hhbmdlLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgY2FzZXMgaW4gd2hpY2ggYQotCXZlcnNpb25lZCBzeW1ib2wgYXBwZWFycyBpbiBib3RoIGEgcmVndWxhciBhbmQgYSBzaGFyZWQgb2JqZWN0LgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBTZXQgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMIHdoZW4KLQlhcHByb3ByaWF0ZS4gIEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KLQkoc3RydWN0IGVsZl9vdXRleHRfaW5mbyk6IFJlbmFtZSBmcm9tIGVsZl9maW5mb19mYWlsZWQuICBDaGFuZ2UKLQlhbGwgdXNlcy4gIEFkZCBsb2NhbHN5bXMgZmllbGQuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBjYWxsCi0JZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSB0byBvdXRwdXQgYWxsIGxvY2FsIHN5bWJvbHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBIYW5kbGUgc3ltYm9scyB3aGljaCB3ZXJlIGZvcmNlZCB0bwotCWJlY29tZSBsb2NhbC4KLQotU3VuIE1hciAgOSAyMzowODo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBlbGYtYmZkLmggKGVsZl9zeW1ib2xfdHlwZSk6IEFkZCB2ZXJzaW9uIGZpZWxkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHZlcnNpb24gZmllbGQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gY3JlYXRpbmcgYW4KLSAJaW5kaXJlY3Qgc3ltYm9sIGZvciBhIGRlZmF1bHQgdmVyc2lvbiBzeW1ib2wsIHNldCBERUZfRFlOQU1JQyBpZgotIAlhcHByb3ByaWF0ZS4gIFNldCB1cCBhbiBpbmRpcmVjdGlvbiBmcm9tIHRoZSBub25kZWZhdWx0IHZlcnNpb24gb2YKLQl0aGUgc3ltYm9sIGFzIHdlbGwuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FsbAotCWVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGVyZSBhcmUgYW55Ci0JdmVyc2lvbnMuICBBbHdheXMgcmVjb3JkIHRoZSB2ZXJzaW9uIG5hbWUgYXMgYSBkeW5hbWljIHN5bWJvbC4KLQlJbml0aWFsaXplIGNvdW50ZXJzLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBBZnRlciBmaW5kaW5nIGEgdmVyc2lvbiwgc2VlIGlmIGEKLQlzeW1ib2wgc2hvdWxkIGJlIGZvcmNlZCB0byBsb2NhbCBzY29wZS4gIENyZWF0ZSBhIG5ldyB2ZXJzaW9uCi0JZGVmaW5pdGlvbiBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENvcnJlY3QgaW5kaXJlY3Qgc3ltYm9sIGhhbmRsaW5nLgotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVHVybiB2ZXJzaW9uIHNlY3Rpb25zIGludG8gQkZEIHNlY3Rpb25zLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IE9ubHkgY29weSBjdmVyZGVmcyBhbmQgY3ZlcnJlZnMgaW50byBzaF9pbmZvCi0JaWYgc2hfaW5mbyBpcyBub3QgYWxyZWFkeSBzZXQuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHNoX2luZm8gZm9yIHZlcnNpb24KLQlzZWN0aW9ucy4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBUZWxsCi0JX2JmZF9zdHJpbmd0YWJfYWRkIHRvIGNvcHkgdGhlIG5hbWUgaW50byBwZXJtYW5lbnQgbWVtb3J5IGlmCi0JYXBwcm9wcmlhdGUuCi0KLUZyaSBNYXIgIDcgMTE6NTU6MzEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3ApOiBGdWxseSBwYXJlbnRoZXNpemUuCi0KLUZyaSBNYXIgIDcgMTA6Mzc6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UKLQlfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIHRvIHJldHVybiBhIGJvb2xlYW4KLQl2YWx1ZS4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlib29sZWFuLiAgSWYgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbiBjaGFuZ2VkLCB0aGVuIG91dHB1dCBhCi0JemVybyBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogQWx3YXlzIGFsbG9jYXRlIHNwYWNlCi0JZm9yIGF0IGxlYXN0IDYgb3V0cHV0IHN5bWJvbHMuCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBXaGVuIGVtaXR0aW5nIFRPQyBlbnRyeSByZWxvY3MsIGFsc28KLQllbWl0IGEgVEMgY3NlY3QgdG8gcmVwcmVzZW50IHRoZSBzcGFjZSB0aGV5IHRha2UgdXAuICBGb3IgYW4gWE8KLQlzeW1ib2wsIGp1c3QgZW1pdCBhIHJlZmVyZW5jZSwgbm90IGEgY3NlY3QuCi0KLQkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBKdXN0IHVzZSBsbiAtcywgbm90IGxuIC1zZiwgc2luY2UKLQlTb2xhcmlzIGRvZXNuJ3QgbGlrZSB0aGUgY29tYmluZWQgb3B0aW9ucywgYW5kIHRoZSAtZiBpcwotCXVubmVjZXNzYXJ5LgotCShzdGFtcC10c2hsaW5rLCBpbnN0YWxsKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgUl9NSVBTMTZfMjYKLQloYW5kbGluZyB3aGVuIGxpdHRsZSBlbmRpYW4uCi0KLVRodSBNYXIgIDYgMTM6NTE6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKG1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotCSogZWxmMzItbW4xMDMwMC5jIChyZWxvY190eXBlKTogUmVtb3ZlIFBDUkVMezgsMTYsMzJ9X3sxLDJ9QllURQotCXJlbG9jcy4gIFJlcGxhY2UgdGhlbSB3aXRoIGdlbmVyaWMgUENSRUxfezgsMTYsMzJ9IHJlbG9jcy4KLQkoZWxmMzJfbW4xMDMwMF9ob3d0b190YWJsZSk6IExpa2V3aXNlLgotCShlbGYzMl9tbjEwMzAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0KLVRodSBNYXIgIDYgMTI6MTk6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAocnR5cGUyaG93dG8pOiBJZiBwYXNzZWQgYSByZWxvY2F0aW9uIHR5cGUgd2UgZG9uJ3QKLQl1bmRlcnN0YW5kLCBqdXN0IHNldCB0aGUgaG93dG8gZmllbGQgdG8gTlVMTCwgYW5kIHRoZSBjYWxsZXIgd2lsbAotCXByaW50IGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUHVsbCBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIGFuZAotCWNvZGUgZnJhZ21lbnQgb3V0IG9mIGJvdGggbGVncyBvZiAjaWZkZWYgUkVMT0NfUFJPQ0VTU0lORyAuLi4gI2VuZGlmCi0JYmxvY2suICBVc2UgTlVMTCBmb3IgaW5pdGlhbGl6YXRpb25zIG9mICJwdHIiIHJhdGhlciB0aGFuIGJhcmUgMC4KLQkqIGNvZmYtaDgzMDAuYzogRml4IHR5cG8gaW4gY29tbWVudC4KLQkqIGNvZmYtaDg1MDAuYzogRGl0dG8uCi0JKiBjb2ZmLXc2NS5jOiBEaXR0bwotCSogY29mZi16OGsuYzogRGl0dG8uCi0KLVdlZCBNYXIgIDUgMTM6NTk6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MpOiBGaXggb3ZlcmZsb3cgY2FsYy4KLQkobTMycl9lbGZfcmVsYXhfc2VjdGlvbiwgbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzLAotCW0zMnJfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEZpcnN0IHBhc3MgYXQgcmVsYXggc3VwcG9ydC4KLQotTW9uIE1hciAgMyAxMzoyNzowOSAxOTk3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGNvcnJlY3Qgc2hfc2l6ZQotCWVudHJ5IGZvciByZWFkaW5nIHZlcmRlZiByZWNvcmRzLgotCVVzZSBjb3JyZWN0IGJyYWNlcyBmb3IgY29tcHV0aW5nIGluY3JlbWVudHMgb2YgZXh0dmVyZGF1eCBhbmQKLQlleHRldmVyZGVmIHJlY29yZCBwb2ludGVycy4KLQotU3VuIE1hciAgMiAyMjo0Nzo1NCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBTZXQgdGhpcyB0byAyCi0JaW5zdGVhZCBvZiA0LgotCi1TdW4gTWFyICAyIDE2OjI1OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzKTogQ2hlY2sgdGhhdAotCURFRl9SRUdVTEFSIGlzIG5vdCBzZXQgYXMgd2VsbCBhcyBjaGVja2luZyB0aGF0IERFRl9EWU5BTUlDIGlzCi0Jc2V0LgotCi1GcmkgRmViIDI4IDE2OjUyOjQwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IEFkZCBjYXNlIGZvciBUSUM4MF9BUkNIX01BR0lDLgotCi1GcmkgRmViIDI4IDE1OjA2OjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfZGVmYXVsdF92ZWN0b3IpOiBNYWtlIG5vbi1jb25zdC4KLQkoZmluZF90YXJnZXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JYmZkX2ZpbmRfdGFyZ2V0LgotCShiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZmluZF90YXJnZXQpOiBDYWxsIGZpbmRfdGFyZ2V0LiAgV2hlbiBkZWZhdWx0aW5nLCB1c2UKLQliZmRfZGVmYXVsdF92ZWN0b3JbMF0gaWYgaXQgaXMgbm90IE5VTEwuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2RlZmF1bHRfdmVjdG9yKTogQWRqdXN0IGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBSZXR1cm4gZmFsc2UgaWYgdGhlIHN5bWJvbCBoYXMgbm8KLQluYW1lLgotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCSogY29mZi1tNjhrLmMgKG02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogVHJlYXQgc3ltYm9scyBiZWdpbm5pbmcKLQl3aXRoIC4uIG9yIF8uTF8gYXMgbG9jYWwuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFRyZWF0IHN5bWJvbHMKLQliZWdpbm5pbmcgd2l0aCAkIGFzIGxvY2FsLgotCi1UaHUgRmViIDI3IDE4OjM2OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLQlyYXRoZXIgdGhhbiBjb21wYXJpbmcgYWdhaW5zdCBpbmZvLT5scHJlZml4LgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZSBhcwotCV9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVjbGFyZS4KLQotCSogY29mZi1tODhrLmMgKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKG04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgYXMKLQlfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmNvZmYtaW4uaCAoX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMpOiBDaGFuZ2UgX2JmZF9pc19sb2NhbF9sYWJlbAotCXRvIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZS4KLQkoYmZkX3RhcmdldCk6IExpa2V3aXNlLgotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUgYXMgZnVuY3Rpb24sIG5vdCBtYWNyby4KLQkoYmZkX2lzX2xvY2FsX25hbWUpOiBEZWZpbmUuCi0JKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFJlbmFtZSBmcm9tCi0JYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwsIGFuZCB0YWtlIGEgc3RyaW5nIHJhdGhlciB0aGFuIGEKLQlzeW1ib2wuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVmaW5lLgotCShfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLSAJKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogQWxsIGJhY2tlbmRzOiBDaGFuZ2UgbG9jYWxfbGFiZWwgdG8gbG9jYWxfbGFiZWxfbmFtZS4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19nb3RfaW5mbyk6IEFkZCBhc3NpZ25lZF9nb3RubyBmaWVsZC4KLQkobWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JRG9uJ3QgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IHplcm8gZW50cnkgaXMgdW5hc3NpZ25lZDsgaW5zdGVhZCwgdXNlCi0JYXNzaWduZWRfZ290bm8uCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQltaXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEluaXRpYWxpemUgYXNzaWduZWRfZ290bm8gZmllbGQuCi0KLVdlZCBGZWIgMjYgMTU6MTk6NTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogQWRkIGNvZGUgdG8gZG8gMzItYml0Ci0JcmVsb2NhdGlvbnMuCi0KLVdlZCBGZWIgMjYgMTM6MzM6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNraXAgc3ltYm9scyBmcm9tIHNlY3Rpb25zCi0JdGhhdCBoYXZlIG5vIGNvbnRlbnRzIG1lcmVseSBiZWNhdXNlIGxpbmtlcl9tYXJrIGlzIG5vdCBzZXQuCi0KLVR1ZSBGZWIgMjUgMTg6NTE6MzUgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZSBhc3NlcnQgY29tcGFyZQotCWNvbnRlbnQgYnl0ZW9yZGVyIGluc3RlYWQgb2YgaGVhZGVyIGJ5dGVvcmRlci4KLQkoZWNvZmZfYmlnbGl0dGxlX3ZlYyk6IE5ldyBCRkQsIGJpZy1lbmRpYW4gaGVhZGVycywgbGl0dGxlLWVuZGlhbgotCWRhdGEuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGVjb2ZmX2JpZ2xpdHRsZV92ZWMuCi0JKiBjb25maWd1cmUuaW4gKGVjb2ZmX2JpZ2xpdHRsZV92ZWMpOiBBZGQgY2FzZS4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCi1UdWUgRmViIDI1IDAwOjMyOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogVXNlIFNIVF9OT1RFIGZvciBhbnkgc2VjdGlvbiB3aG9zZQotCW5hbWUgYmVnaW5zIHdpdGggIi5ub3RlIi4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogQWRkIGEgUFRfTk9URSBzZWdtZW50IGZvciBhbnkgbG9hZGFibGUKLQlzZWN0aW9uIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggIi5ub3RlIi4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZm9yIG1pc2FsaWduZWQKLQlqYWwgYW5kIGZvciBqYWwgb3ZlcmZsb3cuCi0KLU1vbiBGZWIgMjQgMTc6NTM6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSWYgYSBkZWZhdWx0IHN5bWJvbCBpcwotCW5vdCBmb3VuZCwgdHJ5IGxvb2tpbmcgaXQgdXAgYWdhaW4gd2l0aG91dCB0aGUgdmVyc2lvbiBuYW1lLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBBbHdheXMgbGluayBhZ2FpbnN0IHRoZSBkeW5hbWljCi0Jc3ltYm9sIHRhYmxlIG9mIGEgZHluYW1pYyBvYmplY3QuICBXaGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMKLQlvYmplY3QsIGluY2x1ZGUgdmVyc2lvbiBzdHJpbmdzIGluIHN5bWJvbCBuYW1lcywgYW5kIHNldCB1cAotCXZlcnNpb24gaW5mb3JtYXRpb24uICBBZGQgaW5kaXJlY3Qgc3ltYm9scyBmb3IgZGVmYXVsdCB2ZXJzaW9ucy4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgc3BlY2lhbCB2ZXJzaW9uIHNlY3Rpb25zLgotCShzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8pOiBEZWZpbmUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHZlcmRlZnMgcGFyYW1ldGVyLiAgU2V0Ci0JdXAgdmVyc2lvbiBzZWN0aW9ucy4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLgotCShlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvKTogQWRkIHN5bXZlcl9zZWMgZmllbGQuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IEluaXRpYWxpemUgZmluZm8uc3ltdmVyX3NlYy4gIERvbid0IGNvdW50Ci0JbG9jYWwgc3ltYm9scyBvZiBhIGR5bmFtaWMgb2JqZWN0LiAgSGFuZGxlIERUX1ZFUiogY29uc3RhbnRzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogU2ltcGxpZnkgQkZEX0FTU0VSVCBjaGVja2luZyBmb3IgYQotCWR5bmFtaWMgb2JqZWN0LiAgU2tpcCBpbmRpcmVjdCBzeW1ib2xzIGZyb20gRUxGIG9iamVjdHMuICBSZW1vdmUKLQl0aGUgdmVyc2lvbiBuYW1lIGJlZm9yZSBjaG9vc2luZyBhIGhhc2ggYnVja2V0LiAgV3JpdGUgb3V0IHRoZQotCXZlcnNpb24gaW5mb3JtYXRpb24gaWYgYXBwcm9wcmlhdGUuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGZvciBEWU5BTUlDLCBub3QgRVRfRFlOLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgdmVyaW5mbyBmaWVsZC4KLQlDaGFuZ2UgZWxmX2xpbmtfaGFzaF9mbGFncyB0byB1bnNpZ25lZCBzaG9ydC4KLQkoRUxGX0xJTktfSElEREVOKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZHMgZHludmVyc3ltX2hkciwgZHludmVycmVmX2hkciwKLQlkeW52ZXJkZWZfaGRyLCBkeW52ZXJzeW1fc2VjdGlvbiwgZHludmVyZGVmX3NlY3Rpb24sCi0JZHludmVycmVmX3NlY3Rpb24sIGN2ZXJkZWZzLCBjdmVycmVmcywgdmVyZGVmLCB2ZXJyZWYuCi0JKGVsZl9keW52ZXJzeW0sIGVsZl9keW52ZXJkZWYsIGVsZl9keW52ZXJyZWYpOiBEZWZpbmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiwgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMpOiBEZWNsYXJlLgotCSogZWxmLmMgKF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4sIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkIERUX1ZFUiogY29uc3RhbnRzLiAgUHJpbnQKLQl2ZXJzaW9uIGluZm9ybWF0aW9uIGlmIHRoZXJlIGlzIGFueS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHZlcmluZm8gZmllbGQuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfR05VX3Zlciogc2VjdGlvbiB0eXBlcy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBIYW5kbGUgLmdudS52ZXJzaW9uKiBzZWN0aW9uIG5hbWVzLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogSGFuZGxlIFNIVF9HTlVfdmVyKiBzZWN0aW9uIHR5cGVzLgotCShfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEb24ndCBpbmNsdWRlCi0JdmVyc2lvbiBuYW1lIGluIHN0cmluZyBlbnRlcmVkIGluIGR5bmFtaWMgaGFzaCB0YWJsZS4KLQkqIGVsZmNvZGUuaDogSW5jbHVkZSBmbm1hdGNoLmguCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgYSBkeW5hbWljCi0Jc3ltYm9sIHdoaWNoIHdhcyBmb3JjZWQgdG8gYmVjb21lIGxvY2FsLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IExpa2V3aXNlLgotCi1GcmkgRmViIDIxIDE2OjE1OjE4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogU2ltcGxpZnkKLQlzb21ld2hhdC4KLQkobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IENvcnJlY3RseSBjb21wdXRlIGEgc3ltYm9sJ3MgdmFsdWUKLQl3aGVuIHRoZSBzeW1ib2wgaXMgbG9jYWwsIGJ1dCBub3QgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcyB3ZSBhcmUKLQlyZWxheGluZy4gIEltcGxlbWVudCBhYnMyNCAtPiBhYnMxNiwgaW1tMjQgLT4gaW1tMTYgYW5kIGQyNCAtPiBkMTYKLQlyZWxheGluZy4KLQotRnJpIEZlYiAyMSAxMzo1NToxNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jOiBSZXdyaXRlIHRvIHVzZSBFTEYgYmFja2VuZCBsaW5rZXIuCi0JU3RvcmUgbG93ZXIgMTYgYml0cyBvZiBhZGRlbmQgaW4gUl9NMzJSX0hJMTZfW1NVXUxPIGluc25zLgotCUFkZCBzbWFsbCBkYXRhIGFyZWEgc3VwcG9ydCAoUl9NMzJSX1NEQTE2KS4KLQkqIHJlbG9jLmM6IERvY3VtZW50IEJGRF9SRUxPQ19NMzJSX1NEQTE2LgotCSogYmZkLWluMi5oLGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IEZlYiAyMCAyMzo1MDozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3ApOiBMaWtld2lzZS4KLQkobW4xMDIwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbW4xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLVR1ZSBGZWIgMTggMTc6MjI6NTkgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGVsZi5jLAotCXJlbG9jLmMsIHRhcmdldHMuYzogTmV3IHRhcmdldCwgZWxmLSotRDMwVi4KLQotCSogYmZkLWluMi5oLCBjb25maWd1cmUsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBjcHUtZDMwdi5jLCBlbGYzMi1kMzB2LmM6IE5ldyBmaWxlcy4KLQotVHVlIEZlYiAxOCAxNTozMTo0OCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogY29mZi10aWM4MC5jIChSVFlQRTJIT1dUTyk6IFJlcGxhY2UgYWJvcnQgd2l0aCByZWFsIGZ1bmN0aW9uLgotCShydHlwZTJob3d0byk6IEFkZCBmdW5jdGlvbi4KLQkodGljODBfaG93dG9fdGFibGUpOiBBZGQuCi0KLVR1ZSBGZWIgMTggMTE6NDE6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBzeXNkZXAuaDogRG9uJ3QgZGVmaW5lIGVycm5vIGluIE1TVkMgaWYgZXJyb3IuaCBpcyBpbmNsdWRlZC4KLQotVHVlIEZlYiAxOCAxMDowNDoxMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2Ugc3VyZSByX3N5bW5keAotCWlzIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyB1c2VkLgotCi1Nb24gRmViIDE3IDExOjI4OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBEb24ndCBjb252ZXJ0IGEgc2Vjb25kYXJ5IGNvbW1vbgotCXN5bWJvbCBpbnRvIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sOyBsZWF2ZSBpdCBhcyBhIGNvbW1vbiBzeW1ib2wuCi0KLUZyaSBGZWIgMTQgMTk6MDg6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGlzc3VlIGEgd2FybmluZwotCWFib3V0IGEgc3ltYm9sIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCi0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotCi1UaHUgRmViIDEzIDIwOjUzOjIyIDE5OTcgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAcHJvZ2lzLmRlKQotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBnY2MgZmxhZ3MgdG8gYWxsb3cgY29tcGlsaW5nIHdpdGggY3VycmVudCBnY2MKLQlzbmFwc2hvdAotCSh0YXJnbWF0Y2guaCk6IE5ldyBkZXBlbmRlbmN5LgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOiBOZXcgcmVsb2NhdGlvbiBmb3IKLQlvcGVuVk1TL0FscGhhLgotCSogZXZheC5oIChBTFBIQV9SX0NPREVBRERSKTogTmV3IHJlbG9jYXRpb24uCi0JKiBldmF4LWFscGhhLmMgKEFMUEhBX1JfQ09ERUFERFIpOiA2NCBiaXQgcHJvY2VkdXJlIHJlbG9jYXRpb24gZm9yCi0Jb3BlblZNUy9BbHBoYS4KLQkqIGV2YXgtZXRpci5jIChBTFBIQV9SX0NPREVBRERSKTogT3V0cHV0IG9iamVjdCBjb2RlIGZvciB0aGlzCi0JcmVsb2NhdGlvbi4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQlSZXN0cmljdCBzeW1ib2wgbGVuZ3RoIHRvIDY0IGJ5dGVzLCBjYXNlIHByZXNlcnZpbmc6Ci0JKiBldmF4LWVtaC5jIChfYmZkX2V2YXhfd3JpdGVfZW1oKTogUmVtb3ZlIGNhc2UgaGFja2luZy4KLQkqIGV2YXgtbWlzYy5jIChfYmZkX2V2YXhfY2FzZV9oYWNrX3N5bWJvbCk6IFJlbW92ZS4KLQkoX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbCk6IEFkZGVkLgotCSogZXZheC1ldGlyLmMgKF9iZmRfZXZheF93cml0ZV9ldGlyKTogQ2FsbAotCV9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wgYmVmb3JlIG91dHB1dCBvZiBzeW1ib2wuCi0JKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBMaWtld2lzZS4KLQkqIGV2YXguaCAoZmxhZ19oYXNoX2xvbmdfbmFtZXMsIGZsYWdfc2hvd19hZnRlcl90cnVuYyk6IFJlbW92ZS4KLQotCSogZXZheC1lbWguYzogT3V0cHV0IGZpbGVuYW1lIHRvIG9iamVjdCBmaWxlIHdpdGhvdXQgcGF0aC4KLQotCSogZXZheC1lZ3NkLmM6IE5ldyBzZWN0aW9ucyBmb3IgbG9jYWwgYW5kIGdsb2JhbCBjb21tb25zLgotCi0JKiBldmF4LWFscGhhLmMsIGV2YXgtZW1oLmMsIGV2YXgtZWdzZC5jLCBldmF4LWV0aXIuYywKLQlldmF4LW1pc2MuYywgZXZheC5oOiBSZW1vdmUgOCBiaXQgY2hhcmFjdGVycyBmcm9tIGNvcHlyaWdodAotCW5vdGljZXMuICBSZXBsYWNlIEFYUCB3aXRoIEFscGhhLgotCi1XZWQgRmViIDEyIDE4OjEwOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBXZSBuZWVkIHRoZSBkeW5hbWljCi0Jc2VjdGlvbnMgaWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0KLVR1ZSBGZWIgMTEgMTU6NDU6NDMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKGkzODYtd2luZG93cyk6IERvbid0IHNldCBob3N0NjQ9dHJ1ZS4KLQotVHVlIEZlYiAxMSAxNToyNzozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAocmVsb2NfdHlwZSk6IEFkZCBSX01JUFMxNl9HUFJFTC4KLQkoZWxmX21pcHMxNl9ncHJlbF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHMxNl9ncHJlbF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX01JUFMxNl9HUFJFTC4KLQkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gRmViIDEwIDIzOjI1OjAwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKGVsZl9tMzJyX2hvd3RvX3RhYmxlKTogQ2hhbmdlIHBhcnRpYWxfaW5wbGFjZSB0byB0cnVlCi0JZm9yIFJfTTMyUl97MTYsMzIsMjQsSEkxNl9VTE8sSEkxNl9TTE8sTE8xNn0uCi0KLUZyaSBGZWIgIDcgMTI6Mzk6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IElmIHdlJ3ZlIGRpc2NhcmRlZCBhIHNlY3Rpb24sCi0JdGhlIG91dHB1dCBzZWN0aW9uIHdpbGwgYmUgdGhlIGFic29sdXRlIHNlY3Rpb247IGRvbid0IHByaW50IGFuCi0JYXNzZXJ0aW9uIG1lc3NhZ2UgZm9yIHRoYXQgY2FzZSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuCi0KLVRodSBGZWIgIDYgMTY6NTU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKEZOX1NUVUIsIENBTExfU1RVQiwgQ0FMTF9GUF9TVFVCKTogRGVmaW5lLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZHMgZm5fc3R1YiwKLQluZWVkX2ZuX3N1YiwgY2FsbF9zdHViLCBhbmQgY2FsbF9mcF9zdHViLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkIG1pcHMxNl9zdHVic19zZWVuLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVkaXJlY3QgcmVsb2NhdGlvbnMgdG8gdXNlIG1pcHMxNgotCXN0dWJzIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEF0dGFjaCBzdHViIHNlY3Rpb25zIHRvIHRoZSBhcHByb3ByaWF0ZQotCXN5bWJvbC4gIFNldCBuZWVkX2ZuX3N0dWIgd2hlbiBhcHByb3ByaWF0ZS4KLQkobWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbG9jYWxfc3R1YnMgZmllbGQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRGlzY2FyZCBsb2NhbCBzeW1ib2xzIHRoYXQgYXJlCi0JYXR0YWNoZWQgdG8gc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4KLQotV2VkIEZlYiAgNSAxMzoyMDoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJZ25vcmUgdGhlCi0Jc3ltYm9sIHZhbHVlIHdoZW4gY29tcHV0aW5nIHRoZSBhZGRlbmQgZm9yIGEgcGNfcmVsYXRpdmUKLQlwY3JlbF9vZmZzZXQgcmVsb2MuCi0KLU1vbiBGZWIgIDMgMTE6NTQ6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgZG9pbmcgYQotCXJlbG9jYXRlYWJsZSBsaW5rLCBqdXN0IHNraXAgcGNfcmVsYXRpdmUgcGNyZWxfb2Zmc2V0IHJlbG9jcy4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogUmV0dXJuIGEgZGlmZmVyZW50IGhvd3RvCi0Jc3RydWN0dXJlIGZvciBhbiBBUk0yNiByZWxvYyB3aGljaCBjYW4gYmUgcmVzb2x2ZWQuCi0JKGNvZmZfYXJtX2FkanVzdF9zeW1uZHgpOiBPbmx5IGNvbnZlcnQgQVJNMjYgdG8gQVJNMjZEIGlmIHRoZQotCXJlbG9jIGNhbiBiZSByZXNvbHZlZC4KLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogQ29ycmVjdCBvZmYgYnkgb25lCi0JZXJyb3IgaW4gb3ZlcmZsb3cgY2hlY2sgZm9yIFJfUkVMQllURS4KLQotRnJpIEphbiAzMSAxNDowNzoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBQaWNrIHVwIHRoZSBzdGFydCBhZGRyZXNzLgotCUZyb20gTWFyayBSYXNpbiA8bWFyay5yYXNpbkB0ZWxyYWQuY28uaWw+LgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IERvbid0IGFwcGx5IGRpc2NhcmRfbCB0bwotCWRlYnVnZ2luZyBzeW1ib2xzLgotCi1XZWQgSmFuIDI5IDAwOjAwOjQ5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChyZWxvY190eXBlKTogQWRkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLgotCShlbGZfbW4xMDIwMF9ob3d0b190YWJsZSk6IExpa2V3aXNlLgotCShtbjEwMjAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCi1Nb24gSmFuIDI3IDEyOjA3OjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgcmVsb2NzIEJGRF9SRUxPQ19NMzJSX3tISTE2X1tVU11MTyxMTzE2fS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbTMyci5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlbS4KLQotTW9uIEphbiAyNyAxMjoyNTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtYXJtLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX2luKTogUmVtb3ZlIHVudXNlZCByX2xlbmd0aC4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbW92ZSB1bnVzZWQgcGx0LgotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogUmVtb3ZlIHVzZWQKLQlyX2Zvcm1hdCBhbmQgcl9wY3JlbC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkqIHJpc2NpeC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGR1bW15IHZhbHVlLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFdoZW4gY2hlY2tpbmcgZm9yCi0JcmVsb2NhdGlvbnMgYWdhaW5zdCB0aGUgdGV4dCBzZWdtZW50LCBsb29rIHVwIHRoZSBvdXRwdXQgbmFtZSBvZgotCXRoZSByZWxvYyBzZWN0aW9uLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMjIgMTU6NDA6MjggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBjb2ZmX3ZlYyk6IFVzZSBjb3JyZWN0IGRhdGEgcHV0L2dldAotCXJvdXRpbmVzIGZvciBsaXR0bGUgZW5kaWFuIGRhdGEuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBtYWdpYyB0bwotIAlUSUM4MF9BUkNIX01BR0lDIGZvciBUSWM4MC4KLQotVHVlIEphbiAyMSAxMjozMjo0MyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MGNvZmZfdmVjKTogQ2hhbmdlIHRvIGxpdHRsZSBlbmRpYW4gZGF0YQotCWFzIHRoZSBkZWZhdWx0LgotCi1UaHUgSmFuIDE2IDE3OjQ1OjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENoYW5nZSB0eXBlIG9mCi0JYXV4aWxpYXJ5X2ZpbHRlcnMgcGFyYW1ldGVyIHRvIGJlIGNvbnN0IGNoYXIgKiBjb25zdCAqLiAgQWNjZXB0IGEKLQlOVUxMIHRlcm1pbmF0ZWQgYXJyYXkuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotV2VkIEphbiAxNSAxMToyMTozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFRyZWF0IGEKLQlOT1RZUEUgc3ltYm9sIGluIGEgdGV4dCBzZWN0aW9uIGFzIGEgRlVOQyBzeW1ib2wuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yY2UKLQlyZWxvY2Jhc2UgdG8gYmUgYWxpZ25lZCB0byBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIuCi0KLVR1ZSBKYW4gMTQgMDg6NDY6MzMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChtYWNoaW5lX3R5cGUpOiBSZXNlcnZlIHNldmVyYWwgdmFsdWVzIGZvciBzcGFyY2xldC4KLQotTW9uIEphbiAxMyAyMjozOTowOCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHRpYzgwLSotKik6IERvbid0IHJlcXVpcmUgJ2NvZmYnLgotCi1Nb24gSmFuIDEzIDE5OjM2OjI1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSk6IFNldCB0aGUgc3BlY2lhbF9mdW5jdGlvbgotCXRhYmxlIHRvIHY4NTBfZWxmX3JlbG9jIGZvciBhbGwgbm9uLXN0YW5kYXJkIHJlbG9jYXRpb25zLgotCSh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgY2hlY2sgZm9yIGggYmVpbmcgbm9uLW51bGwuCi0JKHY4NTBfZWxmX3JlbG9jKTogQWRkICBSX1Y4NTBfWkRBX09GRlNFVCBzdXBwb3J0LiAgVXNlIHN3aXRjaAotCXN0YXRlbWVudCBpbnN0ZWFkIG9mIG11bHRpcGxlIGlmcy4KLQkodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB1cCBlcnJvciBtZXNzYWdlLCBkb24ndCBqdXN0IGNhbGwKLQlhYm9ydC4KLQotTW9uIEphbiAgNiAxMzoyODozNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZWxmX21uMTAyMDBfaG93dG8pOiBEb24ndCBldmVyIHNldCBwYXJ0aWFsLWlucGxhY2UuCi0JVXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBhcyBzcGVjaWFsIGZ1bmN0aW9uIGZvciBhbGwgcmVsb2NzLgotCShiZmRfZWxmMzJfbW4xMDIwMF9yZWxvYyk6IFJlbW92ZSB1bm5lY2Vzc2FyeSBmdW5jdGlvbi4KLQotCSogZWxmMzItbW4xMDIwMC5jIChlbGZfbW4xMDIwMF9ob3d0byk6IFNldCBwY3JlbF9vZmZzZXQgZm9yCi0JMjRiaXQgcGMtcmVsYXRpdmUgcmVsb2MuCi0KLUZyaSBKYW4gIDMgMTY6MzM6MDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb2ZmLXRpYzgwLm8pOiBBZGQgY29mZmNvZGUuaCB0byBkZXBlbmRlbmN5IGxpc3QuCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwY29mZl92ZWMpOiBEYXRhIGJ5dGUgb3JkZXIgaXMgYmlnIGVuZGlhbiBhbmQKLQloZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgZW5kaWFuLiAgVXNlIGNvcnJlY3QgYmZkX2dldCBhbmQKLQliZmRfcHV0IHJvdXRpbmVzIGZvciBsaXR0bGUgZW5kaWFuIGhlYWRlcnMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFNldCBhcmNoIHRvCi0JYmZkX2FyY2hfdGljODAgZm9yIFRJQzgwX0FSQ0hfTUFHSUMgbnVtYmVyLgotCi1GcmkgSmFuICAzIDE2OjU0OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYzogQWRkIEJGRF9SRUxPQ18yNC4KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIDI0Yml0IGFuZCBwY3JlbCByZWxvY3MuCi0JKGVsZl9tbjEwMjAwX2hvd3RvLCBtbjEwMjAwX3JlbG9jX21hcCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLUZyaSBKYW4gIDMgMTY6NTg6MzEgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQllbGY2NC1hbHBoYSBtdWx0aXBsZSAuZ290IHJld3JpdGU6Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgYWx3YXlzX3NpemVfc2VjdGlvbnMgZW50cnkuCi0JKGJmZF9lbGYqX21rb2JqZWN0KTogRG9uJ3QgZGVmaW5lIGhlcmUgLi4uCi0JKiBlbGZ4eC10YXJnZXQuaDogLi4uIGJ1dCByYXRoZXIgaGVyZS4gIERlZmF1bHQgYWx3YXlzX3NpemVfc2VjdGlvbnMKLQlob29rIHRvIE5VTEwuCi0JKiBlbGYuYyAoZWxmX21rb2JqZWN0KTogUmVuYW1lIHRvIGJmZF9lbGZfbWtvYmplY3QsIHNpbmNlIHRoYXQgd2FzCi0Jd2hhdCB0aGUgI2RlZmluZXMgaW4gZWxmLWJmZC5oIHRyYW5zbXV0ZWQgaXQgdG8gYW55d2F5LgotCi0JKiBzZWN0aW9uLmM6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgZmxhZy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogQWRkIFNFQ19MSU5LRVJfQ1JFQVRFRCB0bwotCXJlbG9jYXRpb24gc2VjdGlvbiBmbGFncy4KLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIFNFQ19MSU5LRVJfQ1JFQVRFRCBpbnN0ZWFkIG9mCi0JU0VDX0lOX01FTU9SWSB0byByZWNvZ25pemUgZ2VuZXJhdGVkIGJpdHMuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcywgZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKToKLQlMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluaywgbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsCi0JbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24sIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiwKLQltaXBzX2VsZl9jaGVja19yZWxvY3MsIG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uLAotCXBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MsCi0JZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgdG8KLQlzZWN0aW9uIGZsYWdzLgotCShfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIHRoZSBhbHdheXNfc2l6ZV9zZWN0aW9ucyBob29rLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBVc2UgU0VDX0xJTktFUl9DUkVBVEVEIGluc3RlYWQgb2YgU0VDX0lOX01FTU9SWQotCXRvIGlkZW50aWZ5IGdlbmVyYXRlZCBiaXRzLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQotCSogZWxmNjQtYWxwaGEuYzogUmV3cml0ZSBldmVyeXRoaW5nIHRvdWNoaW5nIHJlbG9jYXRpb25zLgotCi1GcmkgSmFuICAzIDExOjQyOjUzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChhbGwgZnVuY3Rpb25zIGFuZCBzdGF0aWMgdmFyaWFibGVzKTogR28gdGhyb3VnaAotCWFuZCByZWd1bGFyaXplIG5hbWVzIHRvIGJlIG9mIHRoZSBmb3JtIHY4NTBfZWxmXzx4eHg+LgotCSh0b3BsZXZlbCk6IEluY2x1ZGUgPGVsZi92ODUwLmg+LgotCShlbnVtIHJlbG9jX3R5cGUpOiBNb3ZlIHRvIGluY2x1ZGUvZWxmL3Y4NTAuaC4KLQkodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogRm9yIGNvbW1vbiB2YXJpYWJsZXMsIGlmIHRoZSB2YXJpYWJsZSBpcwotCXJlZmVyZW5jZWQgYnkgYSBSX1Y4NTBfe1NEQSxaREEsVERBfSByZWxvY2F0aW9uLCBwdXQgdGhlIHZhcmlhYmxlCi0JaW50byB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4KLQkoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lLgotCi1UdWUgRGVjIDMxIDE1OjE1OjI4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChlbGZfdjg1MF9ob3d0b190YWJsZSk6IEZpeCBzb21lIHNwYWNpbmcuCi0KLVR1ZSBEZWMgMzEgMTQ6NDQ6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChtaXBzKmVsLSotbGludXgqKTogTmV3IHRhcmdldC4KLQkobWlwcyotKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENsZWFuIHVwLgotCVJldHVybiBhIHVzZWZ1bCB2YWx1ZS4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkLCBub3QKLQlhY19jdl9mdW5jX21tYXAuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgaW5zdGVhZCBvZgotCWFjX2N2X2Z1bmNfbW1hcCBpbiBiZmQvY29uZmlndXJlLmhvc3QuCi0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQKLQlmaWx0ZXJfc2hsaWIgYW5kIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIgcGFyYW1ldGVycy4KLQkqIGVsZi5jIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogSGFuZGxlIERUX0FVWElMSUFSWSBhbmQKLQlEVF9GSUxURVIuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gRGVjIDMwIDE4OjQ4OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFdoZW4gZXhwb3J0aW5nIGFsbCBkZWZpbmVkCi0Jc3ltYm9scywgZG9uJ3QgZXhwb3J0IGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgYnkgYW4gb2JqZWN0IGluIGFuCi0JYXJjaGl2ZSB3aGljaCBjb250YWlucyBzaGFyZWQgb2JqZWN0cy4KLQotTW9uIERlYyAzMCAxNjoxMjo1OCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX3RpYzgwCi0JZm9yIFRJIFRNUzMyMGM4MCAoTVZQKS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX3RpYzgwX2FyY2guCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUgYnkgcnVubmluZyAibWFrZSBoZWFkZXJzIi4KLQotU3VuIERlYyAyOSAxNjoxODo1MiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY3B1LXRpYzgwLmMgKGJmZF90aWM4MF9hcmNoKTogQWRkIHN0cnVjdC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAkdmVjKTogQ29ycmVjdCB0eXBvLCAidGIiIG5vdCAidHAiLgotCUFsc28gYWRkIGNvZmZsaW5rLm8gZm9yIHRpYzgwY29mZl92ZWMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQotTW9uIERlYyAzMCAxMTo1NDo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jOiBQYXRjaCB1cCB0aGUgbW1hcCBjb2RlIHNvIHRoYXQgaXQgaXMgb25seSBidWlsdCBpZiBCRkQKLQlpcyBjb25maWd1cmVkIHdpdGggLS13aXRoLW1tYXAuCi0KLVN1biBEZWMgMjkgMTA6NDg6NTcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXRpYzgwLm8KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS10aWM4MC5vCi0JKGNwdS10aWM4MC5vLCBjb2ZmLXRpYzgwLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29mZi10aWM4MC5jOiBBZGQgc2tlbGV0b24sIGNsb25lZCBmcm9tIGFub3RoZXIgY29mZiBjb25maWcuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBtYWdpYyB0byBUSUM4ME1BR0lDCi0gCWZvciBUSWM4MC4KLQotRnJpIERlYyAyNyAyMDo1Njo0MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogVE9ETzogQ29ycmVjdCBhIG1pc3NwZWxsaW5nLgotCSogY29mZi10aWM4MC5jOiBOZXcgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVlApLgotCSogY3B1LXRpYzgwLmM6IE5ldyBmaWxlIGZvciBUSSBUTVMzMjBDODAgKE1WUCkuCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHZlYyk6IEFkZCB0aWM4MGNvZmZfdmVjIGVudHJ5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0JKiBhcmNodXJlcy5jIChiZmRfdGljODBfYXJjaCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmggKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBiZmRfYXJjaF90aWM4MC4KLQkqIGNvbmZpZy5iZmQgKGNhc2UgJHt0YXJnfSk6IEFkZCB0aWM4MCotKi1jb2ZmKiB0YXJnZXQuCi0JKiB0YXJnZXRzLmMgKHRpYzgwY29mZl92ZWMpOiBBZGQgZGVjbCBhcyBleHRlcm4gYmZkX3RhcmdldC4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdGljODBjb2ZmX3ZlYyBlbnRyeS4KLQotRnJpIERlYyAyNyAxMTo0ODoxMiAxOTk2ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogZWxmbGluay5oIChlbGZfYnVja2V0cyk6IEFkZCBzb21lIG1vcmUgdmFsdWVzIGZvciBsYXJnZXIKLQliaW5hcmllcy4KLQotVGh1IERlYyAyNiAxODozNjo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogTW92ZSBzdWJkaXJfZG8gb3V0IG9mIGNvbmRpdGlvbmFsLiBGcm9tCi0JRnJlZCBGaXNoIDxmbmZAY3lnbnVzLmNvbT4uCi0KLVdlZCBEZWMgMTggMTA6MDQ6MzAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEVuYWJsZSBiYXNpYyA4LCAxNiwgYW5kCi0JMzIgYml0IHJlbG9jcy4KLQkoZWxmX21uMTAyMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQkobW4xMDIwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQotVHVlIERlYyAxNyAxMTowOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogQWRkIDEgdG8gdGhlIHZhbHVlIG9mIGEKLQltaXBzMTYgc3ltYm9sIGR1cmluZyB0aGUgbGluay4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU3VidHJhY3QgMSBmcm9tIHRoZSB2YWx1ZSBvZiBhCi0JbWlwczE2IHN5bWJvbC4KLQkobWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERlZmluZS4KLQotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogUHJpbnQgdGhlIHN0X290aGVyIGZpZWxkIGlmIGl0IGlzCi0Jbm90IHplcm8uCi0KLU1vbiBEZWMgMTYgMTQ6Mzg6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgY2hlY2sgZm9yIHJlbG9jIHNlY3Rpb25zCi0JYWdhaW5zdCBTRUNfREVCVUdHSU5HIHNlY3Rpb25zIGhlcmUgKHJldmVydCBwYXRjaCBvZiBEZWNlbWJlciA1KS4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogQ2hlY2sgZm9yIHRoZW0gaGVyZSwgaW5zdGVhZC4KLQotU3VuIERlYyAxNSAxNDo0NjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogQWRkIGR5bmFtaWMgcGFyYW1ldGVyLgotCSogZWxmLmMgKF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IFBhc3MgbmV3IGFyZ3VtZW50IHRvCi0Jc2x1cnBfcmVsb2NfdGFibGUuCi0JKF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBVcGRhdGUgZGVjbGFyYXRpb24gb2YKLQlzbHVycF9yZWxvY190YWJsZS4KLQkoX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlY2xhcmUuCi0JKiBlbGZ4eC10YXJnZXQuaDogVXNlIG5ldyBkeW5hbWljIHJlbG9jIHJvdXRpbmVzIGJ5IGRlZmF1bHQuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUpOiBBZGQgZHluYW1pYwotCXBhcmFtZXRlci4KLQotRnJpIERlYyAxMyAxMzoxODo0OSAxOTk2ICBEYW4gV2lsZGVyICA8ZGFuQGdhc2JveS5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogVXNlIE1DNjhLQkNTTUFHSUMgZm9yIGJmZF9hcmNoX202OGsKLQlpZiBOQU1FU19IQVZFX1VOREVSU0NPUkUgaXMgZGVmaW5lZC4KLQotRnJpIERlYyAxMyAxMToxMzoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKGVudW0gbWFjaGluZV90eXBlKTogQ2hhbmdlIE1fU1BBUkNMRVQgZnJvbSAxNDIgdG8gMTMxLgotCi1UaHUgRGVjIDEyIDE1OjA3OjIwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogTW92ZSBSX1BQQ19QTFRSRUwyNCBpbnRvIHRoZQotCXN1cHBvcnRlZCByZWxvY3MuCi0KLVRodSBEZWMgMTIgMTQ6NTU6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgYWRkIGEgd2VhawotCXN5bWJvbCBpZiB0aGUgcmVhbCBkZWZpbml0aW9uIGlzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQlBZnRlciBmaW5kaW5nIHRoZSByZWFsIGRlZmluaXRpb24sIHRoZW4sIGlmIGl0IGlzIGR5bmFtaWMsIGFkZCB0aGUKLQl3ZWFrIHN5bWJvbCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0KLQkqIGNvZmYtYXV4LmMgKGNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbCk6IE1ha2Ugc3RhdGljLgotCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfc2V0X2FyY2hfbWFjaCk6IERvbid0IGRlZmluZTsgaXQncyBhCi0JZnVuY3Rpb24uCi0JKHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB0YWtlIHRoZSBhZGRyZXNzIG9mIGFuCi0JYXJyYXkuCi0KLVR1ZSBEZWMgMTAgMjM6MjM6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKHJlbG9jX3R5cGUpOiBSZW1vdmUgYmlnIGVuZGlhbiBtbjEwMzAwIHJlbG9jCi0JdmFyaWFudHMuCi0JKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUsIG1uMTAzMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogV3JpdGUgZGF0YSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KLQkqIHJlbG9jLmM6IFJlbW92ZSBtbjEwMzAwIGJpZyBlbmRpYW4gcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogZWxmMzItbW4xMDIwMC5jOiBVcGRhdGUgZnJvbSBlbGYzMi1tbjEwMzAwLmMuCi0KLUZyaSBEZWMgIDYgMTU6MTg6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyKTogRGVmaW5lLgotCi0JKiBlbGYzMi1tbjEwMzAwLmM6IEFkZCBzb21lIGNvbW1lbnRzLgotCi1GcmkgRGVjICA2IDE3OjE2OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBBbHdheXMgaW5pdGlhbGl6ZSBidWYgYmVmb3JlIGp1bXBpbmcgdG8KLQllcnJvcl9yZXR1cm4uCi0JKGloZXhfcmVhZF9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBEZWMgIDUgMjI6Mjk6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKGVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlKTogRG9uJ3Qgc2V0IHBhcnRpYWwtCi0JaW5wbGFjZSBmb3IgbW9zdCByZWxvY3MuCi0KLVRodSBEZWMgIDUgMTM6MjQ6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhbGxpbmcgY2hlY2tfcmVsb2NzCi0JZXZlbiBpZiBTRUNfQUxMT0MgaXMgbm90IHNldC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgY2hlY2sgU0VDX0FMTE9DCi0Jd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGNvcHkgYSByZWxvYyBpbnRvIGEgc2hhcmVkIG9iamVjdC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRG9uJ3Qgc2V0IFNFQ19BTExPQyBpbiBhCi0JcmVsb2Mgc2VjdGlvbiBpZiBpdCBpcyBub3Qgc2V0IGluIHRoZSBzb3VyY2Ugc2VjdGlvbi4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1hcmsgYSByZWxvYyBzZWN0aW9uIGFzc29jaWF0ZWQKLQl3aXRoIGEgU0VDX0RFQlVHR0lORyBzZWN0aW9uIGFzIFNFQ19ERUJVR0dJTkcuCi0KLVdlZCBEZWMgIDQgMTQ6MTg6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiAjaWYgMCBjb2RlIHRoYXQKLQlleHBlY3RzIGEgLmdvdC5wbHQgdW50aWwgd2UgYWN0dWFsbHkgY3JlYXRlIGl0LgotCi1Nb24gRGVjICAyIDEyOjEzOjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFByaW50IGFuIGVycm9yCi0JbWVzc2FnZSBmb3IgYmZkX3JlbG9jX291dG9mcmFuZ2UsIHJhdGhlciB0aGFuIGFib3J0aW5nLiAgRnJvbQotCVBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MgaW4KLQlhIHJlbG9jYXRlYWJsZSBsaW5rLCBkb24ndCB0cnkgdG8gcHJvY2VzcyB0aGVtLiAgRnJvbSBIZWlueiBXcm9iZWwKLQk8d3JvYmVsQGxwci5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+LgotCi1Nb24gRGVjICAyIDAwOjM5OjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChtbjEwMzAwX2luZm9faG93dG8pOiBSZW5hbWVkIGZyb20KLQltbjEwMzAwX2luZm9faG93dG9fcmVsLiAgVHdlYWsgcmVsb2MgYXJndW1lbnQgdG8gYmUgYW4KLQlFbGYzMl9JbnRlcm5hbF9SZWxhLgotCShVU0VfUkVMQSk6IERlZmluZSBpbnN0ZWFkIG9mIFVTRV9SRUwuCi0JKGVsZl9pbmZvX3RvX2hvd3RvLCBlbGZfaW5mb19ob3d0b19yZWwpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVN1biBEZWMgIDEgMDA6MTg6NTkgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogIEhhbmRsZSBtaXBzKi1zZ2ktaXJpeDYqLgotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6ICBBY2NlcHQgQ09SRV9NQUdJQ04zMgotCWNvcmUgZmlsZXMuCi0KLVdlZCBOb3YgMjcgMTI6MTA6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXYXJuIGFib3V0IGEKLQlyZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiBhIHNlY3Rpb24gd2l0aCBubyBvdXRwdXQKLQlzZWN0aW9uLgotCi1UdWUgTm92IDI2IDExOjA3OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IERvbid0IHJlcXVpcmUgQUNfQ19DUk9TUy4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBvdGhlciBmaWVsZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgb3RoZXIgZmllbGQuCi0JKHN3YXBfb3V0X3N5bXMpOiBTZXQgc3Rfb3RoZXIgZnJvbSBleGlzdGluZyBzdF9vdGhlciBmaWVsZC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU3RvcmUgc3Rfb3RoZXIgaW4gaGFzaAotCXRhYmxlIG90aGVyIGZpZWxkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogU2V0IHRoZSBvdGhlciBmaWVsZCBmcm9tIHRoZSBnbG9iYWwgaGFzaAotCXRhYmxlIGVudHJ5LgotCSogZWxmMzItbWlwcy5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9NSVBTMTZfMjYuCi0JKGVsZl9taXBzMTZfanVtcF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHMxNl9qdW1wX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQUzE2X0pNUC4KLQkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IEhhbmRsZSBSX01JUFMxNl8yNi4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFMxNl8yNi4gIEhhbmRsZSBSX01JUFNfMjYKLQl0byBhIG1pcHMxNiBzeW1ib2wuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQUzE2X0pNUCk6IEFkZCB0byBsaXN0IG9mIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG1pcHM6MTYgZW50cnkuCi0KLU1vbiBOb3YgMjUgMTE6MjM6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGxvbmcgbG9uZyBmb3IgbWlwcy1zZ2ktaXJpeDYqLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IE1ha2UgbGluZSBudW1iZXIgb3ZlcmZsb3cKLQlvbmx5IGEgd2FybmluZy4gIEZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRlbXV5dEB1bGIuYWMuYmU+LgotCi1Nb24gTm92IDI1IDA4OjUyOjI5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZW51bSByZWxvY190eXBlKTogQWRkIG1vcmUgcmVsb2MgdHlwZXMuCi0JKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUpOiBVcGRhdGUgZm9yIG5ldyByZWxvYyB0eXBlcy4KLQkoZWxmMzJfbW4xMDMwMF9yZWxvY19tYXApOiBVcGRhdGUgZm9yIG5ldyByZWxvYyB0eXBlcy4KLQkqIHJlbG9jLmM6IEFkZCBzb21lIG5ldyByZWxvY3MgZm9yIHRoZSBtbjEwMzAwIHNlcmllcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLVNhdCBOb3YgMjMgMTM6MjY6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBsb3NlIGZvciBhIHNwYWNlIHdoaWNoIGhhcwotCW5vIGRhdGEsIGJ1dCBzb21lIHN5bWJvbHMuCi0KLUZyaSBOb3YgMjIgMTE6MzI6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGdvdF9uZWVkZWQgZmllbGQuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIGdvdF9uZWVkZWQuCi0JKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSBzZXQgLmdvdCBzZWN0aW9uIHNpemUgaWYgaXQKLQlpcyBub3QgYWxyZWFkeSBzZXQuICBTZXQgZ290X25lZWRlZC4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENoZWNrIGdvdF9uZWVkZWQuICBPbmx5IHNldAotCXNkeW5wdHIsIGFuZCBvbmx5IGhhbmRsZSBkeW5hbWljIHNlY3Rpb25zLCBpZiBkeW5hbWljIHNlY3Rpb25zIGFyZQotCW5lZWRlZC4KLQkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogUGFzcyBmYWxzZSB0byBjcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQlJbml0aWFsaXplIC5nb3Qgc2VjdGlvbi4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogU2V0IHVwIFBMVCBlbnRyeSBldmVuIGlmIHRoaXMgaXMgbm90Ci0JYSBkeW5hbWljIHN5bWJvbC4KLQkoc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluayk6IENoZWNrIGdvdF9uZWVkZWQuICBPbmx5IHNldCB1cAotCWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBpZiBuZWVkZWQuCi0KLVRodSBOb3YgMjEgMTA6MzE6MzEgMTk5NiAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBBZGRlZCBWZXJzYURPUyBmb3JtYXQgdG8gdGhlIEVyaWNzc29uIGNvbmZpZ3VyYXRpb24uCi0KLVdlZCBOb3YgMjAgMTY6MzE6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmM6IFJvdWdoIGN1dCBhdCByZWxvY3MgZm9yIHRoZSBtbjEwMzAwLgotCi1XZWQgTm92IDEzIDA4OjEyOjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVsZjMyLWQxMHYubyk6IERvbid0IGRlcGVuZCBvbiBlbGYvZDEwdi5oCi0JYW55bW9yZS4KLQotVHVlIE5vdiAxMiAxMzozMDowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGZpbGVtb2RlLmM6IEluY2x1ZGUgc3lzZGVwLmguCi0JKiBpaGV4LmM6IEFkZCBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCi0JKiBzdW5vcy5jOiBBZGQgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCi1Nb24gTm92IDExIDEwOjM3OjAyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIC5nb3QucGx0Ci0Jc2VjdGlvbi4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgc3VwcG9ydCBmb3IgUl9QUENfTE9DQUwyNFBDLiAgTWFrZQotCWFwcHJvcHJpYXRlIHJlbG9jYXRpb25zIGluIHRoZSAuc28gZmlsZSBpZiBzaGFyZWQuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1UdWUgT2N0IDI5IDE1OjAzOjAyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8yNCk6IFVzZQotCWNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLgotCi1UdWUgT2N0IDI5IDEyOjUzOjQ2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogRG9uJ3QgY29tcGxhaW4gb24KLQlvdmVyZmxvd3MgZm9yIFJfRDEwVl8xNiBhbmQgUl9EMTBWXzE4LgotCi1UdWUgT2N0IDI5IDEzOjIzOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCk6IFVzZSBMTUEgcmF0aGVyIHRoYW4gVk1BLgotCShkb193aXRoX3JlbG9jcyk6IExpa2V3aXNlLgotCShkb19hc19yZXBlYXQpOiBMaWtld2lzZS4KLQkoY29weV9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0KLUZyaSBPY3QgMjUgMTY6NTY6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCk6IENvcnJlY3RseSByZWNvcmQgd2hldGhlcgotCXRoZXJlIGlzIGFuIGV4dGVybmFsIHBhcnQuCi0KLVRodSBPY3QgMjQgMTQ6MzI6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDb3JyZWN0bHkKLQloYW5kbGUgdGRhIG9mZnNldHMgZm9yIHNsZC53IGFuZCBzc3QudyBpbnN0cnVjdGlvbnMuCi0JRml4IGFsaWdubWVudCBjaGVjayBpbiBzbGQudyBhbmQgc3N0LncgdGRhIHJlbG9jIGhhbmRsaW5nLgotCi1UaHUgT2N0IDI0IDA5OjA4OjQ3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogIFNldCBVU0VfQklOQVJZX0ZPUEVOIGZvciAqLSotd2luZG93cy4KLQotV2VkIE9jdCAyMyAwMDo1MzoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYzogQWRkIGNvbW1lbnRzIGFib3V0IGFzc3VtcHRpb25zIGFib3V0Ci0JY2hhciwgc2hvcnQgJiBsb25nIHNpemVzLgotCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRml4IHNpZ24gZXh0ZW5zaW9uCi0JcHJvYmxlbXMgZm9yIHNldmVyYWwgcmVsb2NzLgotCi0JKiBlbGYzMi12ODUwLmMgKGVsZjMyX3Y4NTBfaG93dG9fdGFibGUpOiBGaXggdHlwbyBpbgotCVJfVjg1MF9TREFfT0ZGU0VUIGVudHJ5LgotCi1XZWQgT2N0IDIzIDAwOjIwOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogRG9uJ3QgYWxsb2NhdGUgbGRzeW0uCi0JU3RvcmUgaW1wb3J0IGZpbGUgaW5kZXggaW4gbGRpbmR4LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBBc3N1bWUgdGhhdCBsZHN5bSB3YXMgbm90IHByZXZpb3VzbHkKLQlhbGxvY2F0ZWQuICBGb3IgYW4gaW1wb3J0ZWQgc3ltYm9sLCBjb3B5IGxkaW5keCBpbnRvIGxfaWZpbGUuCi0KLVR1ZSBPY3QgMjIgMTk6MjA6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogRml4IG9yZGVyaW5nIG9mCi0JUl9WODUwX1pEQV9PRkZTRVQgYW5kIFJfVjg1MF9UREFfT0ZGU0VULiAgRml4IHZhcmlvdXMKLQlmaWVsZHMgaW4gUl9WODUwX1REQV9PRkZTRVQuCi0JKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBUd2VhayBwYy1yZWxhdGl2ZQotCXJlbG9jcyB0byB3b3JrIG1vcmUgbGlrZSBvdGhlciByZWxvY3MuICBIYW5kbGUgUl9WODUwX1REQV9PRkZTRVQKLQlyZWxvY2F0aW9ucy4KLQotCSogZWxmMzItdjg1MC5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBSZXR1cm4gYW4gZXJyb3IgaWYgd2UgZ2V0IGEgcmVsb2MKLQl3ZSBjYW4ndCBoYW5kbGUuCi0JKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3JlbG9jYXRpb25fc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi1UdWUgT2N0IDIyIDE3OjIyOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElnbm9yZSBzZWN0aW9ucyB3aGljaAotCWRvbid0IGhhdmUgU0VDX0xPQUQgYW5kIFNFQ19BTExPQyBzZXQuCi0KLU1vbiBPY3QgMjEgMTI6MTM6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBdm9pZCBsb3Npbmcgc3RhdGljCi0Jc3ltYm9scyBpbiB0aGUgLmJzcyBzZWN0aW9uLgotCi1Nb24gT2N0IDIxIDEwOjU0OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IERlc2NyaWJlIFJfTUlQU182NC4KLQkobWlwczMyXzY0Yml0X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19yZWxvY19tYXApOiBBZGQgZW50cnkgZm9yIEJGRF9SRUxPQ182NC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFNfNjQuCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBQcmludCBhbiBlcnJvciBtZXNzYWdlCi0Jd2hlbiBhdHRlbXB0aW5nIHRvIGRvIGEgcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCBkaWZmZXJlbnQgb2JqZWN0Ci0JZmlsZSBmb3JtYXRzLCByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgotCi1UaHUgT2N0IDE3IDEwOjQzOjI5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKG0zMnIgcmVsb2NzKTogUmVuYW1lIHRoZW0uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW0zMnIuYzogVXBkYXRlLgotCShtMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8xMF9QQ1JFTCBlbnRyeSk6IFVzZSBpdC4KLQkoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8yNCBlbnRyeSk6IEZpeCB7c3JjLGRzdH1fbWFza3MuCi0KLVdlZCBPY3QgMTYgMTE6MjQ6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBTZXQgImxpbmtlcl9tYXJrIiBmb3IKLQlhbGwgc2VjdGlvbnMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBEaXNjYXJkIHN5bWJvbHMgaW4gc2VjdGlvbnMKLQl3aGljaCBhcmUgYmVpbmcgZGlzY2FyZGVkLgotCSogZWxmMzItdjg1MC5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9WODUwX1NEQV9PRkZTRVQsCi0JUl9WODUwX1REQV9PRkZTRVQgYW5kIFJfVjg1MF9aREFfT0ZGU0VULgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkoZWxmX3Y4NTBfcmVsb2NfbWFwKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogcmVsb2MuYzogQWRkIGFkZGl0aW9uYWwgVjg1MCByZWxvY2F0aW9ucy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBNYXNrIG91dCBiaXRzIHdlCi0Jbm8gbG9uZ2VyIHdhbnQgaW4gcGMtcmVsYXRpdmUgcmVsb2NzLgotCi1UdWUgT2N0IDE1IDIyOjE3OjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IERvbid0IHNpbGVudGx5Ci0JYWNjZXB0IGEgcmVsb2MgYWdhaW5zdCBhbiB1bmRlZmluZWQgc3libW9sIQotCi1UdWUgT2N0IDE1IDE2OjE3OjI4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYzogIERlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciB0byBiZSAnXycuCi0KLVR1ZSBPY3QgMTUgMTI6NDA6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBCdW1wIGZvciBuZXcgcmVsb2NhdGlvbi4KLQotCSogaG9zdHMvaTM4NmJzZC5oOiBJZiBOQlBHIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgaXQgYXMKLQlQQUdFX1NJWkUsIGZvciByZWNlbnQgdmVyc2lvbnMgb2YgRnJlZUJTRC4KLQotTW9uIE9jdCAxNCAxMjozNzoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgYGxvbmcgbG9uZycgYXMgdGhlIDY0IGJpdCB0eXBlIG9uIGEgU29sYXJpcwotCWhvc3QsIHNpbmNlIGJvdGggZ2NjIGFuZCB0aGUgU3VuUFJPIGNvbXBpbGVycyBzdXBwb3J0IGl0LgotCi1Nb24gT2N0IDE0IDExOjE3OjI0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiByZWxvYy5jOiBDcmVhdGUgYSBuZXcgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLiAgSXQgd2FzIGEKLQltaXN0YWtlIHRvIGhhdmUgcmV1c2VkIHRoZSBFQ09GRiBMSVRFUkFMIGZvciBFTEYgc2luY2UgdGhleSBoYXZlCi0JZGlmZmVyZW50IHNlbWFudGljcy4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZl9yZWxvY19tYXApOiBNYXAgZnJvbSBFTEZfTElURVJBTC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFRyYXAgLmdvdAotCXNlY3Rpb24gb3ZlcmZsb3cuCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgZW1pdCBhCi0JZHluYW1pYyByZWxvY2F0aW9uIGZvciBhbiB1bmRlZndlYWsgc3ltYm9sIHdoZW4gd2UgYXJlIGJ1aWxkaW5nCi0JYSBzdGF0aWMgZXhlY3V0YWJsZS4KLQotVGh1IE9jdCAxMCAxMToxNTowNiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZCAoY29uZmlnLmJmZCwgdGFyZ21hdGNoLnNlZCk6IEVkaXQgcmVmZXJlbmNlcyB0bwotCXBvaW50IGV4cGxpY2l0bHkgdG8gc3JjZGlyLgotCSh0YXJnbWF0Y2guaCk6IEVkaXQgcmVmZXJlbmNlcyB0byBwb2ludCBleHBsaWNpdGx5IHRvIG9iamRpci4KLQotVGh1IE9jdCAxMCAxNDoxNDoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IFdoZW4gc2V0dGluZyB0YXJnX2NwdSwgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5Ci0JbGludXgtZ251LgotCi1UdWUgT2N0ICA4IDA4OjUxOjE5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIHN1cHBvcnQgZm9yIHdpbmRvd3MgaG9zdCAoYSBidWlsZCBkb25lCi0JdW5kZXIgdGhlIE1pY3Jvc29mdCBidWlsZCBlbnZpcm9ubWVudCkuCi0KLVR1ZSBPY3QgIDggMTE6NDA6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGEgc3ltYm9sIGlzIGEgd2VhawotCWRlZmluaXRpb24gaW4gYSBkeW5hbWljIG9iamVjdCwgYWRkIGl0IHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZQotCWlmIGFueSBkeW5hbWljIG9iamVjdCBtZW50aW9ucyBpdC4gIFJldmVydHMgcGFydCBvZiBsYXN0IHBhdGNoLgotCi0JKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGdvdF9iYXNlIGZpZWxkLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBnb3RfYmFzZS4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZQotCXRoYW4gMHgxMDAwIGJ5dGVzLCBzZXQgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhbmQgZ290X2Jhc2UgdG8KLQkweDEwMDAuCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBTdWJ0cmFjdCBnb3RfYmFzZSBmcm9tIGEgYmFzZQotCXJlbGF0aXZlIHJlbG9jYXRpb24uCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaXNhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3Qgd2FybiBhYm91dCBsaW5raW5nCi0JLW1pcHMxIGFuZCAtbWlwczIgY29kZSB0b2dldGhlciwgb3IgLW1pcHMzIGFuZCAtbWlwczQgY29kZS4KLQotTW9uIE9jdCAgNyAxMTo0NDoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6IE9ubHkgdHJlYXQgYXJjaGl2ZSBhcyBsaXR0bGUKLQllbmRpYW4gZm9yIGk5NjAgQ09GRi4KLQotRnJpIE9jdCAgNCAxMzo0OTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRqdXN0IHNvZmFyCi0gCWJ5IHRoZSBjaGFuZ2UgaW4gc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aGVuIEVYRUNfUCBpcyBub3Qgc2V0LgotCi0JKiBjb2ZmLW02OGsuYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkobTY4a2NvZmZfcnR5cGVfdG9faG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9tNjhrX2x5bnhfcnR5cGVfdG9faG93dG8pOiBBZGQgdGhlIHNlY3Rpb24KLQlWTUEgdG8gdGhlIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYy4KLQotCSogZGVwLWluLnNlZDogUmV3b3JrIGJhY2tzbGFzaCBsb29wIGEgYml0IHRvIGF2b2lkIGJ1ZyBpbiBzZWQgb24KLQlIUC9VWCAxMC4yMC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZGVwLWluLnNlZDogUmVtb3ZlIC4uL2JmZC9zeXNkZXAuaCwgc2luY2UgaXQgd2lsbCBhcHBlYXIgd2hlbgotCXNvbS5oIGlzIGluY2x1ZGVkLgotCi1GcmkgT2N0ICA0IDExOjQxOjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBleHBsaWNpdCBkZXBlbmRlbmNpZXMgZm9yIG1uMTAyMDAgYW5kCi0JbW4xMDMwMCBmaWxlcy4KLQkoQUxMX01BQ0hJTkVfQ0ZJTEVTKTogQWRkIGNwdS1tbjEwMjAwLmMgYW5kIGNwdS1tbjEwMzAwLmMuCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1tbjEwMjAwLmMgYW5kIGVsZjMyLW1uMTAzMDAuYwotCShkZXBlbmRlbmNpZXMpOiBSZWJ1aWx0LgotCi1UaHUgT2N0ICAzIDE2OjU3OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IG9ial9jb2ZmX2tlZXBfc3ltcwotCWR1cmluZyB0aGlzIGZ1bmN0aW9uLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE9ubHkgdXNlIGFuIGV4aXN0aW5nCi0Jc2VjdGlvbiBpZiB0aGUgZmxhZ3MgYXJlIGNvbXBhdGlibGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGhhdmV2ZWNzLCBhbmQgcHV0IGl0IGluIHRkZWZhdWx0cy4KLQkqIG1wdy1jb25maWcuaW46IExpa2V3aXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ21hdGNoLnNlZDogTmV3IGZpbGU7IGEgc2VkIHNjcmlwdCB0byBidWlsZCB0YXJnbWF0Y2guaCBmcm9tCi0JY29uZmlnLmJmZC4KLQkqIGNvbmZpZy5iZmQ6IEFkZCAjaWYsICNlbmRpZiwgYW5kIGNvbW1lbnRzIGZvciB0YXJnbWF0Y2guaC4KLQkqIHRhcmdldHMuYzogSW5jbHVkZSAiZm5tYXRjaC5oIi4KLQkoc3RydWN0IHRhcmdtYXRjaCk6IERlZmluZS4KLQkoYmZkX3RhcmdldF9tYXRjaCk6IERlZmluZSBieSBpbmNsdWRpbmcgdGFyZ21hdGNoLmguCi0JKGJmZF9maW5kX3RhcmdldCk6IElmIHRoZSB0YXJnZXQgaXMgbm90IGZvdW5kIGJ5IG5hbWUsIHNlYXJjaCBmb3IKLQlpdCBhcyBhIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtYXJtLm8sIGFvdXQtc3BhcmNsZS5vLCBocDMwMGJzZC5vLAotCWkzODZkeW5peC5vLCBtNjhrNGtuZXRic2QubywgYW5kIHJpc2NpeC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgYW91dC1hcm0uYywgYW91dC1zcGFyY2xlLmMsCi0JaHAzMDBic2QuYywgaTM4NmR5bml4LmMsIG02OGs0a25ldGJzZC5jLCBhbmQgcmlzY2l4LmMuCi0JKEhGSUxFUyk6IEFkZCB0YXJnbWF0Y2guaC4gIEFsc28sIGFscGhhYmV0aXplIGFuZCByZWluZGVudC4KLQkoQ0ZJTEVTKTogUmVtb3ZlIGkzODZkeW5peC5jIGFuZCBocDMwMGJzZC5jLgotCSh0YXJnbWF0Y2guaCk6IE5ldyB0YXJnZXQuCi0JKGRvX2NsZWFuKTogUmVtb3ZlIHRhcmdtYXRjaC5oLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBCRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpLgotCSogYWNjb25maWcuaDogQWRkIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaDogSWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYsIGRlY2xhcmUgZ2V0ZW52LgotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogRG9uJ3QgZGVjbGFyZSBnZXRlbnYuCi0KLVRodSBPY3QgIDMgMDk6Mjk6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjcHUtbW4xMHgwMC5jLCBlbGYzMi1tbjEweDAwOiBSZW1vdmVkLgotCSogY3B1LW1uMTAyMDAuYywgY3B1LW1uMTAzMDAuYzogTmV3IGZpbGVzLgotCSogZWxmMzItbW4xMDIwMC5jLCBlbGYzMi1tbjEwMzAwLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byB0d28gc2VwYXJhdGUKLQljb25maWd1cmF0aW9ucywgbW4xMDIwMCBhbmQgbW4xMDMwMC4KLQkqIGFyY2h1cmVzLmMsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgZWxmLmMsIHRhcmdldHMuYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVGh1IE9jdCAgMyAxNTozODoxOSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZG9fY2xlYW4pOiBNb3ZlIGNvbmZpZy5sb2cgdG8gZG9fZGlzdGNsZWFuLgotCi1XZWQgT2N0ICAyIDIxOjQwOjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY3B1LW1uMTB4MDAuYywgZWxmMzItbW4xMHgwMC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1tbjEweDAwLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogU2ltaWxhcmx5IGZvciBlbGYzMi1tbjEweDAwLm8uCi0JKGVsZjMyLW1uMTB4MDAubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBhcmNodXJlcy5jIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfbW4xMHgwMC4KLQkoYmZkX21uMTB4MDBfYXJjaCk6IERlY2xhcmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF9tbjEweDAwX2FyY2guCi0JKiBjb25maWcuYmZkOiBBZGQgbW4xMHgwMC0qLSouCi0JKiBjb25maWd1cmUuaW46IEFkZCBiZmRfZWxmMzJfbW4xMHgwMF92ZWMuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX21uMTB4MDAuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9tbjEweDAwX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGYzMl9tbjEweDAwX3ZlYy4KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlOiBSZWJ1aWx0LgotCi1XZWQgT2N0ICAyIDE1OjQ2OjQ1IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0Jb3BlblZNUy9BbHBoYTogUHJvdmlkZSBmaWxlbmFtZSBhbmQgY2FzZV9oYWNrIGZsYWdzIHZpYQotCXN5bWJvbCB0YWJsZSBmcm9tIGdhcy4KLQlBZGQgY2FzZV9oYWNrIGNvZGUgZm9yIHN5bWJvbCBvdXRwdXQgZnJvbSB2YXgvdm1zLgotCSogZXZheC1hbHBoYS5jIChldmF4X2luaXRpYWxpemUpOiBSZW1vdmUgZmlsZW5hbWUgaGFuZGxpbmcsCi0JZmlsZW5hbWUgaXMgcHJvdmlkZWQgdmlhIHN5bWJvbCB0YWJsZS4KLQkoZXZheF9nZXRfc3ltdGFiKTogVXNlIGxvY2FsIHN5bWJvbCBjb3VudCB3aGVuIHNldHRpbmcgdXAgdGFibGUuCi0JKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3NsdXJwX2Vnc2QpOiBQcmludCBjb3JyZWN0IG5hbWUgd2hlbgotCWRlYnVnZ2luZy4KLQkoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBTa2lwIGZpbGUgbmFtZSBzeW1ib2wuCi0JKiBldmF4LWVtaC5jIChnZXRfdm1zX3RpbWVfc3RyaW5nKTogTG9jYWwgZnVuY3Rpb24gbm93LgotCShfYmZkX2V2YXhfd3JpdGVfZW1oKTogRXh0cmFjdCBzb3VyY2UgZmlsZW5hbWUgYW5kIGNhc2VfaGFjayBmbGFncwotCWZyb20gc3ltYm9sIHRhYmxlLgotCSogZXZheF93cml0ZV9ldGlyIChfYmZkX2V2YXhfd3JpdGVfZXRpcik6IFBhc3MgYWxsIHN5bWJvbCBuYW1lcwotCXRocm91Z2ggX2JmZF9ldmF4X2Nhc2VfaGFja19zeW1ib2wuCi0JKiBldmF4LW1pc2MuYyAoaGFzaF9zdHJpbmcsIF9iZmRfZXZheF9jYXNlX2hhY2tfc3ltYm9sKTogTmV3Ci0JZnVuY3Rpb25zLgotCShfYmZkX2V2YXhfYmFzZW5hbWUpOiBSZW1vdmVkLgotCShfYmZkX2dldF92bXNfdGltZV9zdHJpbmcpOiBNb3ZlZCB0byBldmF4LWVtaC5jLgotCSogZXZheC5oIChldmF4X3ByaXZhdGVfZGF0YV9zdHJ1Y3QpOiBSZW1vdmUgZmlsZW5hbWUuCi0JKGZsYWdfaGFzaF9sb25nX25hbWVzLCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMsCi0JZmxhZ19ub19oYXNoX21peGVkX2Nhc2UsIHZtc19uYW1lX21hcHBpbmcpOiBOZXcgZmxhZ3MgZm9yCi0Jdm1zX2Nhc2VfaGFjay4KLQotV2VkIE9jdCAgMiAxMjowMjowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZyZWVic2QuaCAoTl9HRVRfTUFHSUNfTkVUKTogRG9uJ3QgdXNlIG50b2hsLgotCShOX0dFVE1JRF9ORVQsIE5fR0VURkxBR19ORVQpOiBMaWtld2lzZS4KLQkoTk9fU1dBUF9NQUdJQyk6IERvbid0IGRlZmluZS4KLQkoU1dBUF9NQUdJQyk6IERlZmluZS4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgY3Jhc2ggaWYgdGhlcmUgaXMKLQlubyBoYXNoIHRhYmxlIGVudHJ5IGZvciBhIGdsb2JhbCBzeW1ib2wuCi0KLVR1ZSBPY3QgIDEgMTY6MTQ6MjIgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBtaXBzKi0qLWVsZiouCi0KLVR1ZSBPY3QgIDEgMTI6MzE6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBvdmVycmlkZSBhIG1lYW5pbmdmdWwKLQlzeW1ib2wgdHlwZSB3aXRoIFRfTlVMTC4gIFdhcm4gaWYgc3ltYm9sIHR5cGUgY2hhbmdlcy4gIEJhc2VkIG9uCi0JcGF0Y2ggZnJvbSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgcHV0IGEgc3ltYm9sIGZyb20KLQlhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiBpdCBpcyByZWZlcmVuY2VkCi0Jb3IgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LgotCi1GcmkgU2VwIDI3IDE4OjQxOjA3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfaXNfbG9jYWxfbGFiZWwpOiAgTmV3IGZ1bmN0aW9uIHRvCi0JcmVtb3ZlIGR3YXJmIGxvY2FsIGxhYmVscy4gIFNocmlua3MgYmluYXJpZXMgYnkgYSBmYWN0b3Igb2YgMyEKLQotTW9uIFNlcCAyMyAxMzozMzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IENyZWF0ZSB0aGUgLnNic3Mgc2VjdGlvbgotCWJ5IGhhbmQsIHJhdGhlciB0aGFuIGJ5IGNhbGxpbmcgYmZkX21ha2Vfc2VjdGlvbi4KLQotTW9uIFNlcCAyMyAwOToyMzo0MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogUmVuYW1lIG0zMnIgcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGVsZjMyLW0zMnIuYzogVXBkYXRlLgotCi1GcmkgU2VwIDIwIDExOjQzOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZQotCWxpbmssIGFkanVzdCB0aGUgc3ltYm9sIGluZGV4IG9mIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4gIERvbid0Ci0JY2hhbmdlIHRoZSBhZGRlbmQgb2YgYSBQQyByZWxhdGl2ZSByZWxvYyBpZiBwY3JlbF9vZmZzZXQgaXMgc2V0LgotCSogc3Vub3MuYyAoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGRvIGFueXRoaW5nIGZvcgotCWEgcmVsb2NhdGVhYmxlIGxpbmsuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBcHBseSB0aGUgcmVsb2NhdGlvbiBldmVuIGlmCi0JaXQgaXMgemVybywgaW4gY2FzZSBzcmNfbWFzayBtYXR0ZXJzLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgMTkgMTE6MDM6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IEFsd2F5cyBpbml0aWFsaXplCi0Ja2VlcF9zeW1zLgotIAkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCB0YXJnZXRfaW5kZXgKLQl0byBhbiB1bmluaXRpYWxpemVkIHZhbHVlLgotCi1UdWUgU2VwIDE3IDE0OjE4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9saW5lX3RhYmxlKTogV2FybiBhYm91dCBpbGxlZ2FsIHN5bWJvbAotCWluZGljZXMsIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCShjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UuICBDaGVjayB3aGV0aGVyIHRoZSBob3d0byBmaWVsZAotCWlzIE5VTEwuCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBmb3IgYW4gaWxsZWdhbCBzeW1ib2wKLQlpbmRleC4KLQotTW9uIFNlcCAxNiAxMjozOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogQ2hhbmdlIGRzdF9tYXNrIGZvciBBUk0yNkQKLSAJcmVsb2MgdG8gMC4KLQkoY29mZl9hcm1fYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZS4KLQotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBBY2NlcHQgbXVsdGlwbGUgc3ltYm9scyBvbiBhIHNpbmdsZSBsaW5lLgotCUZyb20gUGFzY2FsIE1hcnRpbiA8cG1hcnRpbkBhbHN5cy5jb20+LgotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCi1GcmkgU2VwIDEzIDE0OjMyOjQyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQkoc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQotRnJpIFNlcCAxMyAxNTo1MDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogU3dpdGNoIG9uIG91dHB1dCBCRkQgcmF0aGVyCi0JdGhhbiBpbnB1dCBCRkQuCi0JKGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBzZWN0aW9uLmMgKGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCi0JKiBzeW1zLmMgKGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2hlY2sgdGhhdAotCWJvdGggQkZEJ3MgYXJlIHRoZSByaWdodCBmbGF2b3VyLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogRmlsbCBpbiBzb21lIGZpZWxkcyBmb3IKLQlSX1BBUklTQ19ESVIzMiwgc28gdGhhdCBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSBwYXNzZXMKLQlpdHMgc2FuaXR5IGNoZWNrLgotCi1UaHUgU2VwIDEyIDExOjQ1OjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgbTMyciByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogY3B1LW0zMnIuYyxlbGYzMi1tMzJyLmM6IE5ldyBmaWxlcy4KLQotVGh1IFNlcCAxMiAxMToxMDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV92ZWMpOiBTZXQgc3ltYm9sX2xlYWRpbmdfY2hhciBmaWVsZCB0byAnXycuCi0KLVdlZCBTZXAgMTEgMTE6NTc6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAoZmlyc3RfcGhhc2UpOiBDaGFuZ2UgdHlwZSBwYXJhbWV0ZXIgZnJvbSBjaGFyIHRvIGludC4KLQkob3V0KTogTGlrZXdpc2UuCi0JKHBhc3Nfb3Zlcik6IENoYW5nZSBmdW5jIHRvIGV4cGVjdCBpbnQsIG5vdCBjaGFyLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IFRlc3QgU0VDX0FMTE9DCi0JcmF0aGVyIHRoYW4gU0VDX0xPQUQgd2hlbiBhbGlnbmluZyB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBmaXJzdAotCXNlY3Rpb24gaW4gYSBzZWdtZW50LgotCi1UdWUgU2VwIDEwIDE2OjE4OjMwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogTWFrZSBhcmcgY29uc3QuCi0JKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogUmVtb3ZlIGV4dHJhbmVvdXMgZXh0cmEgYXJnCi0JdG8gbWFrZV9iZmRfYXNlY3Rpb24oKS4KLQkqIGVsZi1iZmQuaCAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogQWRkIHByb3RvdHlwZS4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogUmVtb3ZlIHByb3RvdHlwZS4KLQkoX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQpOiBSZW1vdmUgcHJvdG90eXBlLgotCi0JKiBuZXRic2QtY29yZS5jIChzd2FwX2Fib3J0KTogQWRkIHByb3RvdHlwZS4KLQkqIGFpeDM4Ni1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljCi0JKiBocHV4LWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiBpcml4LWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiBwdHJhY2UtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkqIHRyYWQtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9maWxlaGRyX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfc3ltX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zeW1fb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hdXhfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2xpbmVub19pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfYW91dGhkcl9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IERpdHRvLgotCSogaWhleC5jIChpaGV4X3NpemVvZl9oZWFkZXJzKTogRGl0dG8uCi0JKiB0ZWtoZXguYyAoZ2V0c3ltKTogRGl0dG8uCi0JKGZpbmRfY2h1bmspOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCShpbnNlcnRfYnl0ZSk6IERpdHRvLgotCShmaXJzdF9waGFzZSk6IERpdHRvLgotCShwYXNzX292ZXIpOiBEaXR0by4KLQkodGVraGV4X2dldF9zeW10YWIpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSh0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKHRla2hleF9ta29iamVjdCk6IERpdHRvLgotCSh0ZWtoZXhfb2JqZWN0X3ApOiBEaXR0by4KLQkobW92ZV9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKHRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCSh0ZWtoZXhfc2V0X2FyY2hfbWFjaCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKHRla2hleF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCSh3cml0ZXZhbHVlKTogRGl0dG8uCi0JKHdyaXRlc3ltKTogRGl0dG8uCi0JKG91dCk6IERpdHRvLgotCSh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCi0JKHRla2hleF9zaXplb2ZfaGVhZGVycyk6IERpdHRvLgotCSh0ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KLQkodGVraGV4X2dldF9zeW1ib2xfaW5mbyk6IERpdHRvLgotCSh0ZWtoZXhfcHJpbnRfc3ltYm9sKTogRGl0dG8uCi0JKiBpcml4LWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24pOiBEaXR0by4KLQkoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiBEaXR0by4KLQkoaXJpeF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IERpdHRvLgotCShpcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCSogc3JlYy5jIChzcmVjX25ld19zeW1ib2wpOiBEaXR0by4KLQkoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCShzcmVjX3NldF9hcmNoX21hY2gpOiBEaXR0by4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCShpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCShzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCShzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCShzcmVjX3NpemVvZl9oZWFkZXJzKTogRGl0dG8uCi0JKHNyZWNfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KLQkoc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGl0dG8uCi0JKHNyZWNfZ2V0X3N5bXRhYik6IERpdHRvLgotCShzcmVjX3ByaW50X3N5bWJvbCk6IERpdHRvIGFuZCBtYWtlIHN0YXRpYy4KLQkqIGVsZi5jIChlbGZfcmVhZCk6IERpdHRvCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBEaXR0by4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBEaXR0by4KLQkoc3ltX2lzX2dsb2JhbCk6IERpdHRvLgotCShlbGZfbWFwX3N5bWJvbHMpOiBEaXR0by4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBEaXR0by4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogRGl0dG8uCi0JKGNvZmZfcmVhbF9vYmplY3RfcCk6IERpdHRvLgotCShmaXh1cF9zeW1ib2xfdmFsdWUpOiBEaXR0by4KLQkoYnVpbGRfZGVidWdfc2VjdGlvbik6IERpdHRvLgotCShjb3B5X25hbWUpOiBEaXR0by4KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBEaXR0by4KLQotTW9uIFNlcCAgOSAyMjozNjowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsdCBhZnRlciBtMzJyIGNoYW5nZXMuCi0KLU1vbiBTZXAgIDkgMTI6MzE6MjIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCxjb25maWd1cmUuaW4sY29uZmlndXJlOiBBZGQgbTMyciBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW4sYXJjaHVyZXMuYyxlbGYuYyx0YXJnZXRzLmM6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZDogS2VlcCB0YXJnZXQgbGlzdCBhbHBoYWJldGljYWxseSBzb3J0ZWQuCi0KLU1vbiBTZXAgIDkgMTE6NDg6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jLCBjYXNlIFJfVjg1MF9ISTE2KTogRG9uJ3QgZm9yZ2V0Ci0JdG8gYWRkIGluIHRoZSBjb25zdGFudCBwYXJ0IGZvdW5kIGluIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuCi0JKGNhc2UgUl9WODUwX0hJMTZfUyk6IExpa2V3aXNlLgotCi1GcmkgU2VwICA2IDE3OjA0OjM5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogTW9kaWZ5IHRoZSBzaXplIG9mIFJfRDEwVl8xNgotCWFuZCBSX0QxMFZfMTggdG8gYmUgMSAod29yZCkuCi0KLVRodSBTZXAgIDUgMTU6MjM6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IElmIHRoZSBvdXRwdXRfc2VjdGlvbiBmaWVsZAotCW9mIGVpdGhlciBzZWN0aW9uIGlzIGJmZF9hYnNfc2VjdGlvbiwgdGhlbiB0aGUgbGlua2VyIGlzCi0JZGlzY2FyZGluZyB0aGUgc2VjdGlvbiBhbmQgd2Ugc2hvdWxkIG5vdCBvcHRpbWl6ZSBpdC4KLQotVHVlIFNlcCAgMyAxMjoxNjoyMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYW91dC1zcGFyY2xlLm8pOiBOZXcgdGFyZ2V0LgotCSogYW91dGYxLmggKFRBUkdFVF9JU19CSUdfRU5ESUFOX1ApOiBEb24ndCBkZWZpbmUgaWYgbGl0dGxlIGVuZGlhbi4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjbGV0LSotYW91dCopOiBBZGQgY2FzZS4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsZV9hb3V0X3ZlYyk6IEFkZCBjYXNlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIHRhcmdldHMuYyAoc3BhcmNsZV9hb3V0X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNwYXJjbGVfYW91dF92ZWMuCi0JKiBhb3V0LXNwYXJjbGUuYzogTmV3IGZpbGUuCi0KLVR1ZSBTZXAgIDMgMDA6NTc6MDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogRml4IGhhbmRsaW5nIG9mCi0JbG93IG9yZGVyIHNpZ24gYml0IHByb3BvZ2F0aW9uIGZvciBSX1Y4NTBfSEkxNl9TLgotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGZvcgotCWhhbmRsaW5nIFY4NTAgc3BlY2lmaWMgcmVsb2NzLgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IFVzZSB0aGUgbmV3IGZ1bmN0aW9uIGZvciBzb21lCi0JcmVsb2NhdGlvbnMuICBUd2lkZGxlIG1hc2tzICYgc2hpZnRzIGZvciBzb21lIHJlbG9jcy4KLQlTZXQgcGFydGlhbF9pbnBsYWNlIHdoZXJlIG5lZWRlZC4KLQotTW9uIFNlcCAgMiAxMjoxMjozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1taXBzLmM6IEFkZCBhbiBleHBsaWNpdCBtaXBzOjMwMDAgZW50cnksIGFuZCBjaGFuZ2UgdGhlCi0JZGVmYXVsdCBhcmNoaXRlY3R1cmUgdG8gYSBtYWNoaW5lIG51bWJlciBvZiAwLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX29iamVjdF9wKTogU2V0IHRoZSBtYWNoaW5lIG51bWJlcgotCWZvciBFX01JUFNfQVJDSF8xLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBJZiB0aGUgbWFjaGluZSBudW1iZXIgb2YKLQl0aGUgb3V0cHV0IEJGRCBpcyB0aGUgZGVmYXVsdCwgc2V0IGl0IGZyb20gdGhlIGZpcnN0IGlucHV0IEJGRC4KLQotU3VuIFNlcCAgMSAxODozODowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBBbGwgdGhlIDE2Yml0IHJlbG9jcwotCWluc2VydCBhdCBiaXRwb3MgemVyby4gIFRoZSBISTE2IHJlbG9jcyBhcmUgc2hpZnRlZCByaWdodAotCWJ5IDE2IGJpdHMuICBGaXggc3JjX21hc2sgZm9yIGFsbCByZWxvY3MuCi0JKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfTElUVExFX05BTUUpOiBEZWZpbmUuICBUaGUgVjg1MCBpcwotCWxpdHRsZSBlbmRpYW4hCi0JKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUpOiBSZW1vdmUuICBUaGUgVjg1MCBpcyBsaXR0bGUKLQllbmRpYW4hCi0KLVN1biBTZXAgIDEgMTU6NDE6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6Ci0JUmV3cml0ZSB0byB1c2UgQkZEIGZpbGUgcmVhZCByb3V0aW5lcyBhbmQgdG8gYXZvaWQgdXNpbmcgYSBmaXhlZAotCWxlbmd0aCBmb3IgdGhlIGZpbGUgbmFtZS4KLQotU2F0IEF1ZyAzMSAxMDoyMjoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfVjg1MF97MzIsMTYsOH0uCi0JKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQWRkIHN1cHBvcnQgZm9yIFJfVjg1MF97MzIsMTYsOH0uCi0JKHY4NTBfcmVsb2NfbWFwKTogQWRkIHRyYW5zbGF0aW9uIGZyb20gQkZEX1JFTE9DX3szMiwxNiw4fQotCXRvIFJfVjg1MF97MzIsMTYsOH0uCi0KLUZyaSBBdWcgMzAgMTg6MDY6MDQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAocmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfSEkxNl9TLgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IEFkZCBpbmZvIGZvciBISTE2X1MgcmVsb2MuCi0JKHY4NTBfcmVsb2NfbWFwKTogQWRkIEhJXzE2X1MgcmVsb2MuCi0JKiByZWxvYy5jOiBEZWZpbmUgQkZEX1JFTE9DX1Y4NTBfKiByZWxvY3MuCi0KLUZyaSBBdWcgMzAgMTE6NDk6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIFNIIEVMRiBzdXBwb3J0LgotCSogZWxmMzItc2guYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX3NoLgotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBIYW5kbGUgYWJzb2x1dGUgc3ltYm9sLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MpOiBEZWNsYXJlLgotCShfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MpOiBEZWNsYXJlLgotCSogZWxmbGluay5oIChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpKTogUmVuYW1lIGZyb20KLQllbGZfbGlua19yZWFkX3JlbG9jcy4gIE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBHZXQgZXh0ZXJuYWwgc3ltYm9scyBmcm9tIGNhY2hlIGluCi0Jc3ltdGFiX2hkci0+Y29udGVudHMuICBHZXQgY29udGVudHMgZnJvbSBjYWNoZSBpbgotCWVsZl9zZWN0aW9uX2RhdGEuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZEX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uKTogT25seSBkZWZpbmUgaWYgbm90Ci0JYWxyZWFkeSBkZWZpbmVkLgotCSogcmVsb2MuYzogRGVmaW5lIEJGRF9SRUxPQ19TSF8qIHJlbG9jcy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbik6IERlY2xhcmUuCi0JKiBjb2ZmLXNoLmMgKHNoX2luc25zX2NvbmZsaWN0KTogRml4IGEgcmV0dXJuIHZhbHVlLgotCShfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbik6IE5ldyBnbG9iYWxseSB2aXNpYmxlIGZ1bmN0aW9uLCBicm9rZW4KLQlvdXQgb2Ygc2hfYWxpZ25fbG9hZC4KLQkoc2hfYWxpZ25fbG9hZCk6IENhbGwgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4uCi0JKHNoX3N3YXBfaW5zbnMpOiBDaGFuZ2UgcmVsb2NzIHBhcmFtZXRlciB0byBQVFIuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfc2hfdmVjKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3NobF92ZWMpOiBEZWNsYXJlLgotCSogY29uZmlnLmJmZCAoc2gtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3NoX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShiZmRfZWxmMzJfc2hsX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItc2guby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLXNoLmMuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBDaGVjayB0aGF0IExNQSBkb2VzIG5vdCBza2lwIGEKLQlwYWdlIGJlZm9yZSBjaGVja2luZyBEX1BBR0VELgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IFJlbW92ZWQgdW5uZWNlc3NhcnkgZXh0YmFzZSB2YXJpYWJsZS4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgZXh0YmFzZTsgYWx3YXlzIHVzZSBzZWdiYXNlCi0JaW5zdGVhZC4KLQotVGh1IEF1ZyAyOSAxNjo1MjoxNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotKik6IERpdHRvLgotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi0qKTogRGl0dG8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWRndXgqKTogUmVjb2duaXplIGFzIGEgc3lub255bSBmb3IgeDg2Ci0JZWxmLgotCi1UdWUgQXVnIDI3IDA5OjE4OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgYXJndW1lbnQuCi0JKiBlbGYzMi1ocHBhLmggKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgYXJndW1lbnQuICBJZgotCXdlIGVuY291bnRlciBhbiBSX0RBVEFfT05FX1NZTUJPTCByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHRoYXQKLQl3aWxsIGhhdmUgYW4gU1RfQ09ERSB0eXBlLCBjaGFuZ2UgdGhlIHN5bWJvbCdzIHR5cGUgdG8gU1RfREFUQS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IFVwZGF0ZSBwcm90b3R5cGUuCi0KLVR1ZSBBdWcgMjcgMDA6MTI6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IFNldCBkeW5vYmogaWYgbmVlZGVkIGZvcgotCVJfTUlQU18zMiBhbmQgUl9NSVBTX1JFTDMyLiAgU2V0IHNnb3QgYW5kIGcgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgcmVxdWlyZSAuZ290IHRvIGV4aXN0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1UaHUgQXVnIDIyIDEwOjU0OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKEhMREVOVik6IE5ldyB2YXJpYWJsZSB0byBzZXQuICBTZXQgaXQgZm9yCi0JKi0qLXN5c3Y0Kiwgc2luY2UgdGhvc2UgbGlua2VycyBtYXkgbm90IHN1cHBvcnQgLVIgYnV0IHRoZXkgYWx3YXlzCi0Jc3VwcG9ydCBMRF9SVU5fUEFUSC4KLQotCSogbGliaWVlZS5oIChOU0VDVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKGllZWVfZGF0YV9zdHJ1Y3QpOiBDaGFuZ2Ugc2VjdGlvbl90YWJsZSB0byBhc2VjdGlvbiAqKi4gIEFkZAotCXNlY3Rpb25fdGFibGVfc2l6ZS4KLQkqIGllZWUuYyAoZ2V0X3NlY3Rpb25fZW50cnkpOiBJZiB0aGUgdGFibGUgaXNuJ3QgYmlnIGVub3VnaCwgbWFrZQotCWl0IGJpZ2dlci4KLQkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IFJlbW92ZSBhc3NlcnRpb24gYWJvdXQgbnVtYmVyIG9mIHNlY3Rpb25zLgotCShpZWVlX29iamVjdF9wKTogQWRqdXN0IGluaXRpYWxpemF0aW9uIG9mIGllZWUgdG8gbWF0Y2ggY2hhbmdlcyB0bwotCXRoZSBzdHJ1Y3R1cmUuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrKTogRG9uJ3QgY29weSByZWxvY3MgZm9yIHVuZGVmaW5lZAotCXN5bWJvbHMgbWVyZWx5IGJlY2F1c2Ugd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogRG9uJ3Qgc2V0IHVwIGdsb2JhbCBsaW5rYWdlIGNvZGUgZm9yIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCBtZXJlbHkgYmVjYXVzZSB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZAotCWxpYnJhcnkuCi0KLVR1ZSBBdWcgMjAgMTU6MDY6MDUgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LXY4NTAuby4KLQkoQkZEMzJfQkFDS0VORFMpIEFkZCBlbGYzMi12ODUwLm8uCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX3Y4NTBfYXJjaC4KLQkqIGJmZC1pbjIuaDogQWRkIGJmZF92ODUwX2FyY2guCi0JKiBjb25maWcuYmZkICh2ODUwLSotKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IChiZmRfZWxmMzJfdjg1MF92ZWMpIE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmUuaW46IChiZmRfZWxmMzJfdjg1MF92ZWMpIE5ldyB2ZWN0b3IuCi0JKiBjcHUtdjg1MC5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGRlZCBjYXNlIGJmZF9hcmNoX3Y4NTAuCi0JKiBlbGYzMi12ODUwLmM6IE5ldyBmaWxlLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfdjg1MF92ZWMpOiBOZXcgdmVjdG9yLgotCi1GcmkgQXVnIDE2IDE2OjI1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IENyZWF0ZSBhbmQgZGVmaW5lCi0gCWEgZnVuY3Rpb24gY29kZSBzeW1ib2wgZm9yIGFuIFhNQ19YTyBzeW1ib2wuCi0KLVRodSBBdWcgMTUgMTI6MzM6MjkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBVcGRhdGUgZWRpdGluZyBvZiBhdXRvY29uZiB2YXJzIHRvIHJlZmxlY3QKLQlKdWwgMTggY29uZmlndXJlLmluIGNoYW5nZS4KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIGVkaXRpbmcgb2YgaW5jbHVkZSBwYXRobmFtZXMgdG8gYmUKLQltb3JlIGdlbmVyYWwsIGFkZCBAREFTSF9DX0ZMQUdAIHRvIGV4cGxpY2l0IGNvbXBpbGUgcnVsZSBlZGl0LgotCi1UaHUgQXVnIDE1IDEwOjM1OjEzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltKTogVGhlIHNlY3Rpb24gZnJvbQotCXdoaWNoIHRvIG9mZnNldCB0byBnZXQgdGhlIC5wbHQgZW50cnkgYWRkcmVzcyBpcyAiLnBsdCIuCi0KLVRodSBBdWcgMTUgMTY6NDA6MzAgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiByZWxvYy5jOiAoQkZEX1JFTE9DX0FSTV9USFVNQl9BREQsIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NLAotCUJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQsIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUKToKLSAJQWRkZWQsIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIEFSTSBnYXMuCi0JKiBsaWJiZmQuaDogUmVidWlsdAotCSogYmZkLWluMi5oOiBSZWJ1aWx0Ci0KLVdlZCBBdWcgMTQgMTc6MDI6MDkgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENvcnJlY3QgdHlwbwotCWluIHNlY3Rpb24gZHluaWR4IHN0YXJ0LgotCi1UdWUgQXVnIDEzIDE0OjM1OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBUcmVhdCBzZWN0aW9ucyB3aG9zZQotCW5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSBhcyBTRUNfTElOS19PTkNFLiAgVGhpcyBpcyBhbgotCW9wdGltaXphdGlvbiBmb3IgZysrLgotCi1UdWUgQXVnIDEzIDE3OjA0OjQwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IElmIG9uZSBtb2R1bGUgaGFzCi0JdGhlIC1tcmVsb2NhdGFibGUtbGliIGJpdCBzZXQgYW5kIHRoZSBvdGhlciBkb2Vzbid0LCBjbGVhciB0aGUKLQktbXJlbG9jYXRhYmxlLWxpYiBiaXQgaW4gdGhlIGhlYWRlci4KLQotU2F0IEF1ZyAxMCAyMjo1OToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG8gbm90IHJlc29sdmUgYSBjb21tb24KLQlzeW1ib2wgYWdhaW5zdCBhIFNUVF9GVU5DIHN5bWJvbCBpbiBhIHNoYXJlZCBsaWJyYXJ5LgotCi1GcmkgQXVnICA5IDEyOjQ0OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IElmIGEgZGVzY3JpcHRvcgotIAlzeW1ib2wgaXMgZm91bmQsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCi0gCWNvZGUuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IE9ubHkgc2V0ICgqc3ltX2hhc2gpLT5udW1hdXgKLQlpZiBzeW0ubl9udW1hdXggaXMgbm90IHplcm8uCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFBlcm1pdCB0aGUgc3ltYm9sIGFuZCB0aGUgaGFzaCB0YWJsZQotCWVudHJ5IHRvIGRpc2FncmVlIGFib3V0IHRoZSBudW1iZXIgb2YgYXV4IGVudHJpZXMgaWYgdGhlIHN5bWJvbAotCWhhcyB6ZXJvLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IENyZWF0ZSB0aGUgLnJlbC5keW4KLQlzZWN0aW9uIGlmIGl0IG1pZ2h0IGJlIG5lZWRlZCwgbm90IGp1c3QgaWYgaW5mby0+c2hhcmVkLgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBNYWtlIHJvb20gZm9yIGEgbnVsbCBlbGVtZW50IGF0Ci0JdGhlIHN0YXJ0IG9mIC5yZWwuZHluIGlmIHdlIGFyZSBnb2luZyB0byB1c2UgaXQuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBjbGVhciB0aGUgZmlyc3QgZWxlbWVudAotCW9mIC5yZWwuZHluIGlmIHRoZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi1UaHUgQXVnICA4IDE2OjI0OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgd2UgYWxyZWFkeSBjYWxsZWQgdGhlCi0JdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjayBmb3IgYSBzeW1ib2wsIHRoZW4gZG9uJ3QgaXNzdWUgYW55IG1vcmUKLQl3YXJuaW5ncyBhYm91dCBsb2FkZXIgcmVsb2NzLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZG8gYW55IGZ1cnRoZXIgcHJvY2Vzc2luZwotCWFmdGVyIGNhbGxpbmcgdGhlIHVuZGVmaW5lZF9zeW1ib2wgY2FsbGJhY2suCi0KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9NVUxUSVBMWV9ERUZJTkVEKTogRGVmaW5lLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgc3ltYm9sCi0JYXMgdGhlIEFJWCBsaW5rZXIgc2VlbXMgdG8gZG8uCi0KLVRodSBBdWcgIDggMTI6MjE6NTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9hbHBoYV92ZWMpOiBDb3JyZWN0ZWQgZmxhZ3MsIGNsZWFudXAuCi0JKGV2YXhfaW5pdGlhbGl6ZSk6IFJlbW92ZSBldmF4X3JlbG9jX3RhYmxlLgotCShldmF4X2Nsb3NlX2FuZF9jbGVhbnVwKTogRGl0dG8uCi0JKHJlbG9jX25pbCk6IERpdHRvLgotCShhbHBoYV9ob3d0b190YWJsZSk6IFJlbW92ZSBBTFBIQV9SX1NXUkVMMzIgYW5kIEFMUEhBX1JfU1dSRUw2NAotCWVudHJpZXMuCi0JKGV2YXhfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3NsdXJwX2Vnc2QpOiBBZGQgYSBmZXcgY2FzdHM7IHNldAotCWNvb2tlZF9zaXplID09IHJhd19zaXplLgotCSogZXZheC1lbWguYyAoX2JmZF9ldmF4X3JlZ2lzdGVyX2ZpbGVuYW1lKTogUmVtb3ZlLgotCSogZXZheC1ldGlyLmMgKGV0aXJfc3RjKTogQWxsb3cgRVRJUl9TX0NfU1RDX3h4IGNvbW1hbmRzLgotCSogZXZheC1taXNjLmMgKGFkZF9uZXdfY29udGVudHMpOiBNYWxsb2Mgc2VjdGlvbiBhdCBmdWxsIHNpemUuCi0JKF9iZmRfc2F2ZV9ldmF4X3NlY3Rpb24pOiBNZW1jcHkgc2VjdGlvbiBjb250ZW50cyBkaXJlY3RseS4KLQkqIGV2YXguaCAoQUxQSEFfUl9TV1JFTDMyLCBBTFBIQV9SX1NXUkVMNjQpOiBSZW1vdmUuCi0JKGV2YXhfcmVsb2NfdGFibGUpOiBSZW1vdmUuCi0KLQkqIGhvc3RzL2FscGhhdm1zLmggKE9fQUNDTU9ERSk6IERlZmluZSBpZiBuZWVkZWQuCi0KLQkqIG1ha2VmaWxlLnZtczogQWRkIGJldHRlciBzdXBwb3J0IGZvciBERUMgQyBjb21waWxhdGlvbgotCUFkZCBldmF4LmggZGVwZW5kZW5jaWVzCi0KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IEFkZCBjYXNlIGZvciAxNiBieXRlIHJlbG9jLgotCShCRkRfUkVMT0NfU1dSRUwzMixCRkRfUkVMT0NfU1dSRUw2NCk6IFJlbW92ZS4KLQkoQkZEX1JFTE9DX0FMUEhBX0JBU0VSRUcpOiBSZW1vdmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1UaHUgQXVnICA4IDA4OjE3OjMyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogIElmZGVmIGFyb3VuZCBjYWxscyB0byBnZXR1aWQgYW5kCi0JZ2V0Z2lkIGlmIF9XSU4zMiBpcyBkZWZpbmVkLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIFJlbW92ZSB1bm5lY2Vzc2FyeSBXSU5HREIgaWZkZWYuCi0KLVdlZCBBdWcgIDcgMjM6MTk6MDAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCBiZmQtaW4uaCBiZmQtaW4yLmggb3BuY2xzLmMgcmlzY2l4LmMgc29tLmMgdGFyZ2V0cy5jOgotCUNoYW5nZSBOT19GTEFHUyB0byBCRkRfTk9fRkxBR1MgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBhbiBIUFVYCi0JaW5jbHVkZSBmaWxlLgotCSogbGliYmZkLmM6ICBDcmVhdGUgZHVtbXkgZ2V0cGFnZXNpemUoKSBtYWNybyBpZiBIQVZFX0dFVFBBR0VTSVpFCi0JaXNuJ3QgZGVmaW5lZC4KLQotV2VkIEF1ZyAgNyAxNDoxMTo0NCAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURFRF9ERUNMQVJBVElPTiBvbiBzdHJzdHIgYW5kCi0JcmVhbGxvYy4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgotCShORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MpOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIHN5c2RlcC5oIChzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgotCShyZWFsbG9jKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MuCi0KLQkqIGFjbG9jYWwubTQgKEJGRF9ORUVEX0RFQ0xBUkFUSU9OKTogSW5jbHVkZSA8c3RyaW5nLmg+IG9yCi0JPHN0cmluZ3MuaD4gaWYgdGhleSBleGlzdC4KLQotCSogaWVlZS5jIChpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FzdCBiZmRfYWxsb2MgcmV0dXJuLgotCi1XZWQgQXVnICA3IDEyOjEyOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LWkzODYuYyAoaTgwODZfYXJjaCk6IEFyY2hpdGVjdHVyZSBpbmZvIGZvciB0aGUgaTgwODYuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRXJpYyBWYWxldHRlIDx2YWxldHRlQGNyZi5jYW5vbi5mcj46Ci0JKiBlbGYzMi1pMzg2LmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBGSVJTVF9JTlZBTElEX1JFTE9DLAotCUxBU1RfSU5WQUxJRF9SRUxPQywgUl8zODZfMTYsIFJfMzg2X1BDMTYsIFJfMzg2XzgsIFJfMzg2X1BDOC4KLQkoZWxmX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIG5ldyByZWxvY3MuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIG5ldyByZWxvY3MuCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG8pOiBKdXN0IGNhbGwgYWJvcnQuCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogQ2hlY2sgdGhhdCB0aGUgcmVsb2MgdHlwZSBpcyB2YWxpZC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1UdWUgQXVnICA2IDEyOjU0OjU2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogQWRkZWQgUl9EMTBWXzMyLgotCi1Nb24gQXVnICA1IDEzOjQyOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBGb3IgYSBsb2FkYWJsZSBzZWN0aW9uLAotCW9ubHkgZ2V0IHRoZSBMTUEgZnJvbSB0aGUgcGhkciBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBwYXJ0IG9mIHRoZQotCWZpbGUuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBSZXdyaXRlIHRlc3RzIGZvciBzdGFydGluZyBhCi0JbmV3IHNlZ21lbnQgdG8gbWFrZSB0aGVtIG1vcmUgY29tcHJlaGVuc2libGUuICBJZiB0aGUgcmVsYXRpb25zaGlwCi0JYmV0d2VlbiB0aGUgTE1BIGFuZCB0aGUgVk1BIGNoYW5nZWQsIHN0YXJ0IGEgbmV3IHNlZ21lbnQuICBEb24ndAotCWNoZWNrIGR5bnNlYyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gc3RhcnQgYSBuZXcgc2VnbWVudCBmb3IgYQotCXdyaXRlYWJsZSBzZWN0aW9uOyAtTiB3aWxsIG5vdyBoYW5kbGUgdGhpcy4KLQotVGh1IEF1ZyAgMSAyMjo0MzowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogUmVtb3ZlICJlc2VsIiBjaGFuZ2VzLiAgTm90IHRoZSByaWdodCBhcHByb2FjaC4KLQkqIHNvbS5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBVc2UgU1RfREFUQSBmb3Igc3ltYm9scwotCXdoaWNoIGRvbid0IGhhdmUgYSBTT00gc3ltYm9sIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi0JUmV2ZXJzZXMgYSAxOTk0IGNoYW5nZS4KLQotV2VkIEp1bCAzMSAxNTo1MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlNYWtlIGxkIC1OIG1vcmUgcmVhc29uYWJsZSBmb3IgRUxGOgotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IElmIERfUEFHRUQgaXMgbm90IHNldCwgc2V0Ci0JcGhkcl9pbl9zZWN0aW9uIHRvIGZhbHNlLCBhbmQgYWx3YXlzIHVzZSBhIHNpbmdsZSBsb2FkIHNlZ21lbnQuCi0JKGVsZl9zb3J0X3NlY3Rpb25zKTogU29ydCBzZWN0aW9ucyBieSBMTUEgYWZ0ZXIgVk1BLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgRF9QQUdFRCBpcyBub3Qgc2V0LCBkb24ndAotCWFsaWduIHRvIG1heHBhZ2VzaXplLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBJZiBhIHNlY3Rpb24gaXMgbG9hZGVkIGJ1dCBub3QgcGFnZQotCWFsaWduZWQsIGNsZWFyIERfUEFHRUQuCi0KLVdlZCBKdWwgMzEgMTU6MDA6MTIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiByZWxvYy5jOiAoQkZEX1JFTE9DX0FSTV9PRkZTRVRJTU04LCBCRkRfUkVMT0NfQVJNX0hXTElURVJBTCk6Ci0gCUFkZGVkLCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBBUk0gZ2FzLgotCSogbGliYmZkLmg6IFJlYnVpbHQKLQkqIGJmZC1pbjIuaDogUmVidWlsdAotCi1UdWUgSnVsIDMwIDE0OjE0OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChSX0hQUEFfRVNFTCk6IE5ldyBmaWVsZCBzZWxlY3Rvci4KLQkoZV9lc2VsKTogU2ltaWxhcmx5LgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSWYgd2UgZW5jb3VudGVyIGFuIGVfZXNlbCwKLQl0aGVuIGdlbmVyYXRlIFJfQ09NUDIgKFBVU0hfU1lNKSwgUl9EQVRBX0VYUFIgZml4dXAgc3RyZWFtLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfREFUQV9FWFBSIGp1c3QgbGlrZSBSX0NPREVfRVhQUi4KLQotVHVlIEp1bCAzMCAxMzozMToyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG8gdGhlIHJlZ3VsYXIKLQlhcmNoaXZlIHNlYXJjaCBiZWZvcmUgbG9va2luZyBmb3Igc3RyaXBwZWQgZHluYW1pYyBvYmplY3RzLgotCi1GcmkgSnVsIDI2IDE3OjUxOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IE1ha2UgZXhwb3J0aW5nIGFuIHVuZGVmaW5lZAotCXN5bWJvbCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4gYW4gZXJyb3IuCi0KLVdlZCBKdWwgMjQgMTI6MDI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IFRyYWNrIHRoZSB2aXJ0dWFsCi0JbWVtb3J5IHBvc2l0aW9uIHNlcGFyYXRlbHkgZnJvbSB0aGUgZmlsZSBwb3NpdGlvbiwgYW5kIHVzZSBpdCB0bwotCWNvbXB1dGUgdGhlIGFsaWdubWVudCBhZGp1c3RtZW50LgotCi1UdWUgSnVsIDIzIDEwOjQzOjMxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogQ2hhbmdlZCBhbGwgcmVsb2NzIHRvICJsb25nIgotIAlhbmQgZml4ZWQgbWFzayBvbiBSX0QxMFZfMTBfUENSRUxfTC4KLQotTW9uIEp1bCAyMiAxNTozMDozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYzogSW5jbHVkZSAiYW91dC9hci5oIi4KLQkobWlwc19lbGY2NF9zbHVycF9hcm1hcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmNjRfd3JpdGVfYXJtYXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmNjRfYXJjaGl2ZV8qKTogRGVmaW5lLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9hcmNoaXZlX3ApOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JVXNlIGluc3RlYWQgb2YgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLgotCShiZmRfZWxmTk5fd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4gIFVzZQotCWluc3RlYWQgb2YgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLgotCShiZmRfZWxmTk5fbWtkYXJjaGl2ZSk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4gIFVzZSBpbnN0ZWFkIG9mCi0JX2JmZF9nZW5lcmljX21rYXJjaGl2ZS4KLQkoVEFSR0VUX0JJR19TWU0pOiBJZiBiZmRfZWxmTk5fYXJjaGl2ZV9mdW5jdGlvbnMgaXMgZGVmaW5lZCwgdXNlCi0JYmZkX2VsZk5OX2FyY2hpdmUgaW4gQkZEX0pVTVBfVEFCTEVfQVJDSElWRSByYXRoZXIgdGhhbgotCV9iZmRfYXJjaGl2ZV9jb2ZmLgotCShUQVJHRVRfTElUVExFX1NZTSk6IExpa2V3aXNlLgotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYXJtYXApOiBDaGVjayBmb3IgYW5kIHJlamVjdCBhbiBhcmNoaXZlIG1hcAotCW5hbWUgb2YgL1NZTTY0Ly4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBIYW5kbGUKLQlTSFRfTUlQU19MSUJMSVNULCBTSFRfTUlQU19DT05URU5ULCBTSFRfTUlQU19TWU1CT0xfTElCLCBhbmQKLQlTSFRfTUlQU19FVkVOVFMgc2VjdGlvbnMuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfSUZBQ0UsCi0JU0hUX01JUFNfQ09OVEVOVCwgU0hUX01JUFNfU1lNQk9MX0xJQiwgYW5kIFNIVF9NSVBTX0VWRU5UUwotCXNlY3Rpb25zLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogQWRkIHJkYXRhX2luX3RleHQgZmllbGQuCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDb3B5Ci0JcmRhdGFfaW5fdGV4dCBmcm9tIGJhY2tlbmQgaW5mbyB0byB0ZGF0YS4gIENsZWFyIGl0IGlmIGFueSBkYXRhCi0Jc2VjdGlvbiBjb21lcyBiZWZvcmUgLnJkYXRhLgotCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSByZGF0YV9pbl90ZXh0IGZpZWxkIGluCi0JdGRhdGEgcmF0aGVyIHRoYW4gYmFja2VuZCBpbmZvLgotCi1GcmkgSnVsIDE5IDE4OjE1OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGaXggdGVzdCBmb3Igd2hldGhlciBhIGNvbXBpbGVyIGhhcyBhIDY0IGJpdAotCXR5cGUuICBGcm9tIEppbSBXaWxzb24gPHdpbHNvbkBjeWdudXMuY29tPi4KLQotVGh1IEp1bCAxOCAxNTozOToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLXNnaS1pcml4NiopOiBOZXcgaG9zdC4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgVkVSU0lPTiwgQkZEX0hPU1RfNjRCSVRfTE9ORwotCShyZXBsYWNpbmcgSE9TVF82NEJJVExPTkcpLCBCRkRfSE9TVF82NF9CSVRfREVGSU5FRCwKLQlCRkRfSE9TVF82NF9CSVQsIGFuZCBCRkRfSE9TVF9VXzY0X0JJVC4gIEFkZCBiZmQtaW4yLmg6YmZkLWluMi5oCi0JdG8gQUNfT1VUUFVUIGNhbGwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBiZmQtaW4uaCAoQkZEX0FSQ0hfU0laRSk6IERlZmluZSBhcyBAd29yZHNpemVALCBub3QgQFdPUkRTSVpFQC4KLQkoQkZEX0hPU1RfNjRfQklUKTogRGVmaW5lIGNvbmRpdGlvbmFsbHkuCi0JKEJGRF9IT1NUX1VfNjRfQklUKTogRGVmaW5lIHdoZW4gQkZEX0hPU1RfNjRfQklUIGlzIGRlZmluZWQuCi0JKGJmZF92bWEpOiBUeXBlZGVmIGFzIEJGRF9IT1NUX1VfNjRfQklULgotCShzeW12YWx1ZSwgYmZkX3NpemVfdHlwZSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKGRvX2NsZWFuKTogUmVtb3ZlIGJmZC10bXAuaC4KLQkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGJmZC1pbjMuaC4KLQkoc3RtcC1iZmQuaCk6IEp1c3QgZG8gY29weS1pZi1jaGFuZ2UgYmZkLWluMy5oIGJmZC5oLgotCShiZmQtaW4zLmgpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWcuYmZkIChzcGFyYy0qLXN5c3Y0Kik6IERvbid0IGJ1aWxkIHN1bm9zX2JpZ192ZWMuICBGcm9tCi0JQW5kcmV3IEdpZXJ0aCA8QU5EUkVXR0BtaWNyb2xpc2UuY28udWs+LgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IElOU1RBTExfU0hMSUIuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfU1VCU1QgKElOU1RBTExfU0hMSUIpLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBVc2UgQElOU1RBTExfU0hMSUJALgotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLWlyaXg2Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdDogSGFuZGxlIElyaXggNiBzaGFyZWQgbGlicmFyeSBsaWtlIElyaXggNS4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBjaGVjayBhbiBYTUNfVEQKLQlzeW1ib2wgZm9yIGEgbWFnaWMgbmFtZS4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjaGFuZ2UgdGhlIHJlbG9jIHN5bWJvbCBmb3IgYW4KLQlYTUNfVEQgc3ltYm9sLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZ2V0IHRoZSBUT0Mgb2Zmc2V0IGZvciBhbgotCVhNQ19URCBzeW1ib2wuCi0KLVRodSBKdWwgMTggMTE6MzY6MzEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgRUxGIHN1cHBvcnQgdG8gbWlwcyBjb25maWcsIGNyZWF0ZSB0aGUKLQllbGYzMi10YXJnZXQuaCBmaWxlIGluIHRoZSBvYmplY3QgZGlyLgotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IGVsZlhYLXRhcmdldC5oIHJlZnMgYXQgYmVnaW5uaW5ncyBvZiBsaW5lcy4KLQotV2VkIEp1bCAxNyAxODowMjozMiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYzogUmVkaWQgZGVidWcgc2NoZW1lIC0gbnVtZXJvdXMgZnByaW50ZidzIGdvbmUuCi0JQWxzbyByZW1vdmVkIG1vc3QgYWJvcnQgY2FsbHMsIGluIGZhdm9yIG9mIHVzaW5nIGJmZCByZXBvcnRpbmcuCi0KLVdlZCBKdWwgMTcgMTQ6NTE6NTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LWQxMHYuby4KLQkoQkZEMzJfQkFDS0VORFMpIEFkZCBlbGYzMi1kMTB2Lm8uCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX2QxMHZfYXJjaC4KLQkqIGJmZC1pbjIuaDogQWRkIGJmZF9kMTB2X2FyY2guCi0JKiBjb25maWcuYmZkIChkMTB2LSotKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IChiZmRfZWxmMzJfZDEwdl92ZWMpIE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmUuaW46IChiZmRfZWxmMzJfZDEwdl92ZWMpIE5ldyB2ZWN0b3IuCi0JKiBjcHUtZDEwdi5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGRlZCBjYXNlIGJmZF9hcmNoX2QxMHYuCi0JKiBlbGYzMi1kMTB2LmM6IE5ldyBmaWxlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SLCBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MLAotIAlCRkRfUkVMT0NfRDEwVl8xOCwgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwpOiBEZWZpbmUuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9kMTB2X3ZlYyk6IE5ldyB2ZWN0b3IuCi0KLVdlZCBKdWwgMTcgMTA6NTg6NTUgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmVkIGJvZ3VzIGZwcmludGYKLQotVHVlIEp1bCAxNiAyMzo0OTowMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIGJmZC1pbjIuaDogIEFkZCBiZmRfbWFjaF9pMzg2X2kzODYgYW5kCi0JYmZkX21hY2hfaTM4Nl9pODA4NiBtYWNoaW5lIHR5cGVzLgotCi1XZWQgSnVsIDEwIDEyOjQyOjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IFNFQ19DT0RFIGZvciBfSU5JVAotCWFuZCBfRklOSSBzZWN0aW9ucy4KLQotV2VkIEp1bCAxMCAxMToxODoyMSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEEvVVggZG9lcyBub3QgcmVxdWlyZQotCXNwZWNpYWwgaGFuZGxpbmcgb2YgdGhlIF9MSUIgc2VjdGlvbi4KLQotVHVlIEp1bCAgOSAxNTo1MjoyMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IFVzZSB0aGUgY29ycmVjdAotCXZhbHVlIGZvciBSX1JFTEJZVEUuCi0KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogT25seSAic2hyaW5rcyIKLQlhcnJheSBpZiBvbmUgd2FzIGFsbG9jYXRlZC4KLQotVHVlIEp1bCAgOSAxMjoyMTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEthenVtb3RvIEtvamltYSA8a2tvamltYUBray5pbmZvLmthbmFnYXdhLXUuYWMuanA+OgotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIG5ldyBmaWVsZHMKLQl1c2VfcmxkX29ial9oZWFkIGFuZCBybGRfdmFsdWUuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IE1hcmsgX19ybGRfb2JqX2hlYWQgc3ltYm9sIGFzCi0JZHluYW1pYy4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgLnJsZF9tYXAgc2VjdGlvbi4gIElmCi0JX19ybGRfb2JqX2hlYWQgc3ltYm9sIG5vdCBzZWVuLCBjcmVhdGUgYW4gX19ybGRfbWFwIHN5bWJvbC4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSBzcGFjZSBpbiAucmxkX21hcCBzZWN0aW9uLgotCUNyZWF0ZSBhIERUX01JUFNfUkxEX01BUCBlbnRyeSByYXRoZXIgdGhhbiBhIERUX0RFQlVHIGVudHJ5LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBTYXZlIHZhbHVlIG9mIF9fcmxkX21hcCBvcgotCV9fcmxkX29ial9oZWFkIHN5bWJvbC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBIYW5kbGUgRFRfTUlQU19STERfTUFQLgotCi1Nb24gSnVsICA4IDE2OjE4OjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX3JlbG9jX21hcCk6IFJlbW92ZSBCRkRfUkVMT0NfMzJfUENSRUwgZW50cnkuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEZvciBSX1BQQ19BRERSMTZfSEEsIHVzZQotCXBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLgotCShwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmYtbWlwcy5jIChzdHJ1Y3QgbWlwc19oaSk6IERlZmluZS4KLQkobWlwc19yZWZoaV9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLSAJKG1pcHNfcmVmaGlfYWRkciwgbWlwc19yZWZoaV9hZGRlbmQpOiBSZW1vdmUuCi0JKG1pcHNfcmVmaGlfcmVsb2MpOiBNYWludGFpbiBhIGxpc3Qgb2YgdW5tYXRjaGVkIFJFRkhJIHJlbG9jcy4KLQkobWlwc19yZWZsb19yZWxvYyk6IFByb2Nlc3MgbWlwc19yZWZoaV9saXN0LgotCShtaXBzX3JlbGhpX2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzX3JlbGhpX2FkZHIsIG1pcHNfcmVsaGlfYWRkZW5kKTogUmVtb3ZlLgotCShtaXBzX3JlbGhpX3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBSRUxISSByZWxvY3MuCi0JKG1pcHNfcmVsbG9fcmVsb2MpOiBQcm9jZXNzIG1pcHNfcmVsaGlfbGlzdC4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgUkVGSEkgb3IKLQlSRUxISSByZWxvY3MgYmVmb3JlIHRoZSBhc3NvY2lhdGVkIFJFRkxPIG9yIFJFTExPIHJlbG9jLgotCi1GcmkgSnVsICA1IDE5OjI3OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogU2V0IHJlbG9jX2NvdW50IGZpZWxkcy4KLQotVGh1IEp1bCAgNCAxMjowMDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBjcmVhdGUgZHluYW1pYwotCXNlY3Rpb25zIHVubGVzcyB0aGlzIGlzIGEgU3VuT1MgbGluay4KLQotCSogVkVSU0lPTjogU2V0IHRvIDIuNy4xLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLVdlZCBKdWwgIDMgMTQ6NTk6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2YW91dC5jOiBJbmNsdWRlICJhb3V0L2FvdXQ2NC5oIi4KLSAJKGkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlZmluZS4KLQotCSogbmV0YnNkLmggKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBNYWtlIHN1cmUgdGhhdAotCWFkanVzdF9zaXplc19hbmRfdm1hcyBpcyBjYWxsZWQgYmVmb3JlIGZpZGRsaW5nIHdpdGggdGhlIG1hZ2ljCi0JbnVtYmVyLgotCi1UdWUgSnVsICAyIDIzOjMwOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBGaXggY2FzdHMgb2YgcHNpbmZvLgotCi1TdW4gSnVuIDMwIDEzOjM0OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKGl0b3MsIHN0b2kpOiBEb24ndCBkZWZpbmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGkzODZseW54LmMgKEtFRVBJVCk6IERlZmluZSBhcyB1ZGF0YS5pLgotCShOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IERvbid0IHVzZSBzdG9pLgotCShOQU1FKGx5bngsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLgotCSogcmlzY2l4LmMgKHJpc2NpeF9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgdWRhdGEuaSByYXRoZXIgdGhhbgotCWZsYWdzLiAgRG9uJ3QgdXNlIHN0b2kuCi0KLQkqIGVsZjMyLW1pcHMuYyAoRUxGX01BR1BBR0VTSVpFKTogQ2hhbmdlIGRlZmluaXRpb24gdG8gMHgxMDAwLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogRG9uJ3Qgc3RhcnQgYSBuZXcgc2VnbWVudCBmb3IKLSAJYSB3cml0YWJsZSBzZWN0aW9uIGlmIGl0J3Mgb24gdGhlIHNhbWUgcGFnZSBhcyB0aGUgcHJldmlvdXMKLSAJc2VnbWVudC4gIFJlc2V0IHRoZSB3cml0YWJsZSB2YXJpYWJsZSBmb3IgYSByZWFkb25seSBzZWN0aW9uLgotCi1TYXQgSnVuIDI5IDE2OjE4OjUxIDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogTWlzc2luZyBpbml0aWFsaXphdGlvbnMgb2YKLQlmaXJzdF90aHVua19hZGRyZXNzLCB0aHVua19zaXplLCBhbmQgaW1wb3J0X3RhYmxlX3NpemUuCi0JKiBwZWljb2RlLmg6IEltcHJvdmVkIHNvbWUgZGlhZ25vc3RpY3MgcmVnYXJkaW5nIGVkYXRhIHNlY3Rpb25zLgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogRWFybGllciBlcnJvciBjaGVjawotCW9uIElNR0xVRSByZWxvY3MuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBJbXByb3ZlZCBkaWFnbm9zdGljIGZvciBsYXJnZSBUT0NERUZOJ3MuCi0JKFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQgbWlzc2luZyBEX1BBR0VELgotCi1GcmkgSnVuIDI4IDEzOjQ4OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IEFuIHVuZGVmaW5lZCBzeW1ib2wKLQl3aXRoIFhDT0ZGX0RFRl9EWU5BTUlDIHNldCBpcyByZWFsbHkgZGVmaW5lZC4KLQkoeGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IE9ubHkgY3JlYXRlIHNwZWNpYWwgc2VjdGlvbnMgaWYgdXNpbmcgYW4KLQlYQ09GRiBoYXNoIHRhYmxlLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIHhjb2ZmLXBvd2VybWFjIGxpa2UKLQlhaXhjb2ZmLXJzNjAwMC4KLQkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1GcmkgSnVuIDI4IDExOjE3OjAwIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBmbGFncwotCWZpZWxkLgotCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIpOiBEZWZpbmUuCi0JKEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfTUVNKTogRGVmaW5lLgotCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMpOiBEZWZpbmUuCi0JKGVsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBmbGFncyBmaWVsZC4KLQkoZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzKTogUmVjb3JkIHR5cGVzIG9mIExJVFVTRSBlbnRyaWVzIHRoYXQKLQlhcmUgZm91bmQgZm9yIExJVEVSQUwgcmVsb2NzLgotCShlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMgaXRzIGFkZHJlc3MKLQl0YWtlbiwgd2UgY2Fubm90IGdlbmVyYXRlIGEgLnBsdCBlbnRyeSBmb3IgdGhlIHN5bWJvbC4KLQotVGh1IEp1biAyNyAxMToyNDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0lTQ19QT1NJWCwgYW5kIGNoZWNrIGZvciBzZXRpdGltZXIgYW5kCi0Jc3lzY29uZiBmdW5jdGlvbnMgKGZvciBncHJvZikuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotV2VkIEp1biAyNiAxNjoyOTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYXJjaGl2ZV9wKTogQ2hlY2sgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGluCi0JYW4gYXJjaGl2ZSBpZiBpdCBoYXMgYSBtYXAuICBJZiB0aGUgb2JqZWN0IGZpbGUgaGFzIHRoZSB3cm9uZwotCXh2ZWMsIHJlamVjdCBpdC4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9hZGp1c3RfcmVsb2NfaW4pOiBTZXQgdGhlIGFkZGVuZCBmb3IgYQotCUJSQUREUiwgU1JFTDE2LCBTUkVMMzIsIG9yIFNSRUw2NCByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsCi0Jc3ltYm9sLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBVc2UgUkVMU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IFVzZSBGSUxIU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9zeW1fb3V0KTogVXNlIFNZTUVTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBVc2UgQVVYRVNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IFVzZSBMSU5FU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IFVzZSBBT1VUU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIFNDTkhTWiwgbm90IHNpemVvZi4KLQkqIHBlaWNvZGUuaDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UdWUgSnVuIDI1IDE1OjI4OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBDb21tZW50IG91dCBjb2RlCi0JZGVhbGluZyB3aXRoIG1ha2luZyBHT1QgcG9pbnRlcnMgbmVnYXRpdmUgb2YgdGhlIEdPVCBzeW1ib2wgZm9yCi0Jbm93LgotCi1UdWUgSnVuIDI1IDExOjQxOjI0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndAotCWluY3JlbWVudCB0aGUgLnJlbGEucGx0IHNpemUgdW50aWwgYWZ0ZXIgd2UncmUgZG9uZSBjcmVhdGluZyB0aGUKLQkucGx0IGVudHJ5LgotCShlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDaGFuZ2UgLnBsdCBlbnRyeSB0byBsb2FkIHRoZQotCS5yZWxhLnBsdCBvZmZzZXQgZGlyZWN0bHkgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgaXQuCi0KLU1vbiBKdW4gMjQgMTc6MTU6MTAgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotICAgICAgICAqIE1ha2VmaWxlLmluLCAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpcik6Ci0JVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0gICAgICAgICogZG9jL01ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLAotCWluY2x1ZGVkaXIsIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldAotCXZhbHVlcy4KLSAgICAgICAgKGRvY2Rpcik6IERlbGV0ZWQuCi0gICAgICAgICogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiB2Mi41IG9yIGhpZ2hlci4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBKdW4gMjQgMjI6NTA6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEZpeCB0eXBvIGluIFJfRU5EX1RSWSBmb3IgZXhjZXB0aW9uCi0JaGFuZGxpbmcgY29kZSA+IDFrIGF3YXkuCi0KLU1vbiBKdW4gMjQgMTg6NDE6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IElmIERFQlVHIGlzCi0JZGVmaW5lZCwgb3V0cHV0IHdoZW5ldmVyIHRoZSBzeW1ib2wgaXMgdXBkYXRlZC4KLQotTW9uIEp1biAyNCAxNzo1ODoxMiAxOTk2ICBKb3VrZSBOdW1hbiAgPGpudW1hbkBiYXppcy5ubD4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2FkZHIgb2YgYSBub24gU0VDX0FMTE9DCi0Jc2VjdGlvbiB0byAwIGlmIHVzZXJfc2V0X3ZtYSBpcyBzZXQuCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCi1TdW4gSnVuIDIzIDIwOjQyOjUxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlQYXJ0aWFsbHkgdW5kbyBwYXRjaCBvZiBKdW4gMjAuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFVzZSBDT0ZGX0lNQUdFX1dJVEhfUEUuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBSZS1hZGQgZGVsZXRlZCBjb2RlLCBidXQKLQl1c2UgI2lmZGVmIENPRkZfV0lUSF9QRSwgbm90IENPRkZfT0JKX1dJVEhfUEUuCi0JKiBwZWljb2RlLmggKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBSZS1hZGQgI2lmZGVmLgotCi1GcmkgSnVuIDIxIDE3OjM4OjE1IDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgotCi1GcmkgSnVuIDIxIDE1OjE5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBiZmRfYXJjaF9hbHBoYSBjYXNlLgotCi1GcmkgSnVuIDIxIDEyOjM1OjI3IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKGFscGhhLSotbGludXhlY29mZiopOiBOZXcgdGFyZ2V0LgotCShhbHBoYS0qLWxpbnV4KiwgYWxwaGEtKi1lbGYqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGY2NF9hbHBoYV92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfYWxwaGFfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjY0X2FscGhhX3ZlYyBpZiBCRkQ2NC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BTFBIQV9HUERJU1ApOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZENjRfQkFDS0VORFMpOiBBZGQgZWxmNjQtYWxwaGEuby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjY0LWFscGhhLmMuCi0KLVRodSBKdW4gMjAgMTg6MTQ6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9hcm1hcF9oYXNoKTogSWYgaGxvZyBpcyAwLCBqdXN0IHJldHVybiAwLCByYXRoZXIKLQl0aGFuIHJlbHlpbmcgb24gYSByaWdodCBzaGlmdCBvZiAzMi4KLQotVGh1IEp1biAyMCAxMTowMDo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IENoYW5nZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLQlpZmRlZiB0byBDT0ZGX1dJVEhfUEUuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBEZWxldGUgQ09GRl9PQkpfV0lUSF9QRS4KLQkqIHBlLXthcm0saTM4NixwcGN9LmMgKENPRkZfT0JKX1dJVEhfUEUpOiBEZWxldGUuCi0JKiBwZWljb2RlLmggKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWxldGUgaWZkZWYKLQlDT0ZGX0lNQUdFX1dJVEhfUEUsIGFsd2F5cyBpbmNsdWRlLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogIi5kcmVjdHZlIiBkb2Vzbid0IGhhdmUgdHJhaWxpbmcgMC4KLQotV2VkIEp1biAxOSAxMTozNzo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBGaXggdXAgdGhlIHRlc3QgZm9yIC1UdGV4dCB0bwotCWFwcHJveGltYXRlIHRoZSBjb3JyZWN0IGFuc3dlciBpZiBTSVpFT0ZfSEVBREVSUyB3YXMgbm90IHVzZWQuCi0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQgc2VjdGlvbiBmaWxlCi0JcG9zaXRpb24gYmFzZWQgb24gTE1BIHJhdGhlciB0aGFuIFZNQS4KLQotV2VkIEp1biAxOSAxMToxOToyNSAxOTk2ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FSUM1IDYwLzMvMTQyICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBEb24ndCBvdXRwdXQgYW55Ci0Jc3ltYm9scyBpZiBpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwuCi0KLVR1ZSBKdW4gMTggMTU6MTc6MzYgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYzogUmVtb3ZlICNpZiAwIGNvZGUuCi0JKGNvbXBhdGFibGUpOiBEb24ndCBhbGxvdyBtaXhpbmcvbWF0Y2hpbmcgb2YgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2g4MzAwcyk6IEFkZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmYtaDgzMDAuYyAoZnVuY3ZlY19oYXNoX25ld2Z1bmMpOiBIYW5kbGUgSDgvUyB0b28uCi0JKEJBRE1BRyk6IExpa2V3aXNlLgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogTGlrZXdpc2UuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogTGlrZXdpc2UuCi0JKGNvZmZfc2V0X2ZsYWdzKTogTGlrZXdpc2UuCi0JKiBjcHUtaDgzMDAuYyAoaDgzMDBfc2Nhbik6IExpa2V3aXNlLgotCUFkZCBIOC9TIHRvIGJmZF9oODMwMF9hcmNoIGxpc3QuCi0KLVR1ZSBKdW4gMTggMTQ6NDI6NTggMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQlBZGRlZCBzdXBwb3J0IGZvciBBbHBoYSBPcGVuVk1TOgotCSogZXZheC5oLCBldmF4LWFscGhhLmMsIGV2YXgtZWdzZC5jLCBldmF4LWVtaC5jOiBOZXcgZmlsZXMuCi0JKiBldmF4LWV0aXIuYywgZXZheC1taXNjLmMsIGhvc3RzL2FscGhhdm1zLmg6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZy5oLXZtcywgbWFrZWZpbGUudm1zOiBOZXcgZmlsZXMuCi0JKiBjb25maWcuYmZkIChhbHBoYS0qLSp2bXMqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoZXZheF9hbHBoYV92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TV1JFTDMyLCBCRkRfUkVMT0NfU1dSRUw2NCk6IERlZmluZS4KLQkoQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UsIEJGRF9SRUxPQ19BTFBIQV9CQVNFUkVHKTogRGVmaW5lLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cik6IERlZmluZS4KLQkoZXZheF9hbHBoYV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBlY29mZmFscGhhX2xpdHRsZV92ZWMgYW5kIGV2YXhfYWxwaGFfdmVjCi0JaWYgQkZENjQgaXMgZGVmaW5lZC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGV2YXgtYWxwaGEubywgZXZheC1lZ3NkLm8sIGV2YXgtZXRpci5vLAotCWV2YXgtZW1oLm8sIGFuZCBldmF4LW1pc2Muby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGV2YXgtYWxwaGEuYywgZXZheC1lZ3NkLmMsCi0JZXZheC1ldGlyLmMsIGV2YXgtZW1oLmMsIGFuZCBldmF4LW1pc2MuYy4KLQkoSEZJTEVTKTogQWRkIGV2YXguaC4KLQotVHVlIEp1biAxOCAxMzo1NDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IE1ha2UgbmFtZSBhIGNvbnN0Ci0JcG9pbnRlci4KLQkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotTW9uIEp1biAxNyAxMDowNjo1MCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogc29tLmggKFJfSFBQQV9CRUdJTl9UUlksIFJfSFBQQV9FTkRfVFJZKTogRGVmaW5lLgotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9CRUdJTl9UUlkgYW5kIFJfRU5EX1RSWS4KLQotTW9uIEp1biAxNyAxMjo0OToxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGNyZWF0ZSBhIHJlbG9jCi0JZm9yIFJfTUlQU19SRUwzMiBhbmQgUl9NSVBTXzMyIHJlbG9jcyBpZiBubyBkeW5hbWljIHNlY3Rpb25zIHdlcmUKLQljcmVhdGVkLgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBPbmx5IGNyZWF0ZSAucmVsLmR5biBmb3IgUl9NSVBTX1JFTDMyIGFuZAotCVJfTUlQU18zMiByZWxvY3MgaWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQotVGh1IEp1biAxMyAyMDoxNDo1MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogVXNlIHBlaV9zZWN0aW9uX2RhdGEgcmF0aGVyIHRoYW4KLQlfY29va2VkX3NpemUuICBDb3JyZXNwb25kcyB0byBNYXkgMTMgY2hhbmdlIGluIGNvZmZjb2RlLmguCi0KLVRodSBKdW4gMTMgMTA6MjM6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIHRoZXJlIGFyZSBsb25nCi0Jc2VjdGlvbiBuYW1lcywgYWx3YXlzIHNldCB0aGUgZl9zeW1wdHIgZmllbGQsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scy4KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEb24ndCBjbGVhciB0aGUgZl9zeW1wdHIgZmllbGQKLQlpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuCi0JKGNvZmZfcmVhbF9vYmplY3RfcCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCW1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZS4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgc29tZSBzeW1ib2xzCi0JYmVmb3JlIHRyeWluZyB0byByZWFkIHRoZSBzdHJpbmcgdGFibGUgc2l6ZS4KLQotV2VkIEp1biAxMiAxMToxNjozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogV2hlbiBjb25zaWRlcmluZyB3aGV0aGVyCi0JdG8gcmVwbGFjZSBhIHN5bWJvbCBpbiBhIGR5bmFtaWMgb2JqZWN0IHdpdGggYSBzeW1ib2wgZnJvbSBhbm90aGVyCi0JZHluYW1pYyBvYmplY3QsIGRvIHRoZSByZXBsYWNlbWVudCBpZiB0aGUgZXhpc3Rpbmcgc3ltYm9sIGlzCi0JZ2xvYmFsIGxpbmthZ2UgY29kZS4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBleHBsaWNpdGx5Ci0JZm9yIF9wdHJnbCwgYW5kIHRyZWF0IGl0IGFzIGdsb2JhbCBsaW5rYWdlIGNvZGUuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBOb3RpY2UgaWYgd2UgZmluZCBhCi0JZmlsZW5hbWUgb3IgTl9TTyBzeW1ib2wgcGFzdCB0aGUgb2Zmc2V0LCBhbmQgdXNlIGl0IHRvIGluZGljYXRlCi0JdGhhdCB0aGVyZSBpcyBubyBsaW5lIG51bWJlciBvciBmdW5jdGlvbiB3aGVuIGFwcHJvcHJpYXRlLgotCi1UdWUgSnVuIDExIDE1OjI0OjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFNldCBYQ09GRl9ERUZfUkVHVUxBUiBmb3IgYQotCWNvbW1vbiBzeW1ib2wgZGVmaW5lZCBieSB0aGUgbGlua2VyLiAgRG9uJ3QgZXhwb3J0IGZ1bmN0aW9uIGNvZGUKLQlldmVuIGlmIGV4cG9ydF9kZWZpbmVkcyBpcyBzZXQuCi0KLU1vbiBKdW4gMTAgMTE6NTc6MjcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGhvd3RvX3RhYmxlKTogQWRkIG5ldyBlbnRyaWVzIGZvciBSX0JDQ19JTlYKLQlhbmQgUl9KTVBfREVMLgotCShydHlwZTJob3d0byk6IEhhbmRsZSBSX0JDQ19JTlYgYW5kIFJfSk1QX0RFTC4KLQkoaDgzMDBfc3ltYm9sX2FkZHJlc3NfcCk6IE5ldyBmdW5jdGlvbi4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IEVsaW1pbmF0ZSBqdW1wcyBtYWRlIHVubmVjZXNzYXJ5IGJ5Ci0JcmVsYXhpbmcuCi0KLVN1biBKdW4gIDkgMTY6MzA6MjAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBGaXggbWFueSBtaW5vciBzcGFjaW5nCi0JcHJvYmxlbXMuCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUsIGNhc2VzIFJfSk1QMSwgUl9KTVAyKTogQWRqdXN0ICJkb3QiCi0JY29ycmVjdGx5IGZvciB0aGUgdHdvIHZhcmlhbnRzLiAgQWxsb3cgcmVsYXhpbmcgaWYgdGhlIHRhcmdldAotCWlzIDEyOCBieXRlcyBhd2F5IHNpbmNlIGFmdGVyIHJlbGF4YXRpb24gaXQnbGwgYmUgMTI2IGJ5dGVzIGF3YXkuCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUsIGNhc2UgUl9QQ1JXT1JEKTogQ29ycmVjdGx5IGFkanVzdAotCSJkb3QiIGFuZCAidmFsdWUiLiAgQWxsb3cgcmVsYXhpbmcgaWYgdGhlIHRhcmdldCBpcyAxMjggYnl0ZXMKLQlhd2F5IHNpbmNlIGFmdGVyIHJlbGF4YXRpb24gaXQnbGwgYmUgMTI2IGJ5dGVzIGF3YXkuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IEtlZXAgcmVsYXhpbmcKLQl0aGUgZ2l2ZW4gc2VjdGlvbiB1bnRpbCBub3RoaW5nIGNoYW5nZXMuCi0KLVRodSBKdW4gIDYgMTU6MjQ6NDUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFJlbW92ZSB0aGUgX1BEQVRBCi0gCWFsaWdubWVudCBoYWNrLS13ZSBjYW4gZ2V0IHRoZSBsbm5vcHRyIGluZm8gYW5vdGhlciB3YXkgd2l0aG91dAotIAlzdWRkZW5seSBpbmNyZWFzaW5nIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLiAgU2V0IHRoZSBmbGFncyBmb3IKLQl0aGUgX1BEQVRBIHNlY3Rpb24uCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvIHNvLgotCi1UaHUgSnVuICA2IDExOjI0OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFB1dCBhIHRpbWVzdGFtcCBpbiB0aGUgZmlsZQotCXRvIGtlZXAgdGhlIEhQIGVtdWxhdG9yIGRhdGFiYXNlIGhhcHB5LgotCi0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgcG93ZXJwYy0qLWxpbnV4KiBhbmQgcG93ZXJwY2xlLSotbGludXgqLgotCUZyb20gS2V2aW4gQnVldHRuZXIgPGtldkBwcmltZW5ldC5jb20+LgotCi1XZWQgSnVuICA1IDE1OjE2OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCB0cnkgdG8gcHJpbnQgdGhlCi0JbmFtZSBvZiBhIE5VTEwgc2VjdGlvbi4KLQotVHVlIEp1biAgNCAxODo1Mzo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElmIG5vdGljZV9hbGwgaXMKLQlzZXQsIGFsd2F5cyBjYWxsIHRoZSBub3RpY2UgY2FsbGJhY2suCi0KLQkqIFZFUlNJT046IEluY3JlbWVudCBmb3IgYmZkbGluay5oIGNoYW5nZS4KLQotTW9uIEp1biAgMyAxMTowMTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTogU2V0IHRvIDQuCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgZGlmZmVyZW50bHkgc2l6ZWQKLQl0cmFpbGluZyBhbGlnbm1lbnQgcmVsb2MuCi0KLQkqIGJmZC1pbi5oOiBVc2UgI2Vycm9yIGlmIEJGRF9IT1NUXzY0X0JJVCBjYW4gbm90IGJlIGRlZmluZWQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IFdhcm4gaWYgdGhlcmUgaXMgbm8ga25vd24gNjQgYml0IHR5cGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHBwY2Jvb3Quby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHBwY2Jvb3QuYy4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJbml0aWFsaXplIGMuCi0JRnJvbSBQZXIgRm9nZWxzdHJvbSA8cGVyLmZvZ2Vsc3Ryb21AbWFpbGJveDIwMC5zd2lwbmV0LnNlPi4KLQotU2F0IEp1biAgMSAyMTo0OTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYyAoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luKQotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogTW92ZSBmcm9tIGhlcmUuLi4KLQkqIGVsZjMyLW1pcHMuYyAoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luKQotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogLi4udG8gaGVyZS4KLQotRnJpIE1heSAzMSAxMzo1MToyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYzogSW1wcm92ZSByZWxvYyBzcGVjaWFsX2Z1bmN0aW9ucyBhbmQgaGFuZGxpbmcgb2YKLQlTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfaGkxNl9yZWxvYyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9sbzE2X3JlbG9jIGFuZAotCW1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2dvdDE2X3JlbG9jIGFuZAotCW1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfZ3ByZWwxNl9yZWxvYwotCWFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKGdwcmVsMTZfd2l0aF9ncCk6IENoZWNrIGhvd3RvLT5zcmNfbWFzayBiZWZvcmUgdXNpbmcgdmFsdWUgaW4KLQlpbnNuLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9ncHJlbDMyX3JlbG9jCi0JYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoZ3ByZWwzMl93aXRoX2dwKTogQ2hlY2sgaG93dG8tPnNyY19tYXNrIGJlZm9yZSBmZXRjaGluZyB2YWx1ZS4KLQkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbik6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBBY2NlcHQgLk1JUFMub3B0aW9ucyBhcyBhIG5hbWUKLQlmb3IgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBDb25zaWRlciAuTUlQUy5vcHRpb25zIHRvIGJlIHRoZQotCW5hbWUgb2YgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nKTogU2V0IHRoZSBHUCB2YWx1ZSBpbiBhCi0JU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShiZmRfZWxmMzJfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKiBlbGYtYmZkLmggKF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERlY2xhcmUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KLQllbGZfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KLQllbGZfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KLQllbGZfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCi0KLQkqIGNvZmYtdzY1LmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBSZW5hbWUgUl9NT1ZCWzEyXSB0bwotCVJfTU9WMTZCWzEyXSwgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvaW50ZXJuYWwuaC4KLQotVGh1IE1heSAzMCAxMjozODo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYzogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBwcm92aWRlIGJldHRlciBzdXBwb3J0IGZvcgotCXdyaXRpbmcgZmlsZXMgYW5kIGZvciBnYXMuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiBtaXBzX2VsZl9vYmplY3RfcC4KLQkobWlwc19lbGYzMl9vYmplY3RfcCk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX29iamVjdF9wOyBjYWxsCi0JX2JmZF9taXBzX2VsZl9vYmplY3RfcC4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZmFrZV9zZWN0aW9ucyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nOyBjYWxsCi0JX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcuCi0JKF9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkobWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwLgotCSogZWxmLmMgKF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBVc2UgYXN5bWJvbCByYXRoZXIgdGhhbgotCXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkuCi0JKF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tCi0JZWxmY29kZS5oOnZhbGlkYXRlX3JlbG9jLgotCSogZWxmY29kZS5oICh2YWxpZGF0ZV9yZWxvYyk6IFJlbW92ZTsgbW92ZWQgaW50byBlbGYuYyBhbmQgcmVuYW1lZAotCXRvIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCSogZWxmLWJmZC5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX29iamVjdF9wKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERvbid0IGRlZmluZQotCWlmIGFscmVhZHkgZGVmaW5lZC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vYmplY3RfcCk6IEhhbmRsZSBFX01JUFNfQVJDSF80LgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0KLVdlZCBNYXkgMjkgMTY6MTU6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JNjQtYml0IE1JUFMgRUxGIEFCSSBvYmpkdW1wIHN1cHBvcnQ6Ci0JKiBlbGY2NC1taXBzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZENjRfQkFDS0VORFMpOiBBZGQgZWxmNjQtbWlwcy5vLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmNjQtbWlwcy5jLgotCSogY29uZmlnLmJmZCAobWlwcyplbC0qLWVsZiopIEFkZCBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYW5kCi0JYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIHRvIHRhcmdfc2VsdmVjcy4KLQkobWlwcyotKi1lbGYqKTogTGlrZXdpc2UuCi0JKiBjb25maW5ndXJlLmluOiBBZGQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGFuZAotCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyB0byB2ZWN0b3Igc3dpdGNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTmV3IGZ1bmN0aW9uLAotCWJyb2tlbiBvdXQgb2YgbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyLiAgQ2FsbCBuZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKTogVXBkYXRlIG5hbWUgb2YgcmVuYW1lZCBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBvZgotCXdyaXRlX291dF9waGRycyB0byBiZSBjb25zdC4gIExpa2V3aXNlIGZvciBzZWNvbmQgcGFyYW1ldGVyIG9mCi0Jc3dhcF9zeW1ib2xfb3V0LgotCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgcmVsX2hkcjIgZmllbGQuCi0JKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9waGRyX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9keW5fb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zbHVycF9zeW1ib2xfdGFibGUpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfd3JpdGVfb3V0X3BoZHJzKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZSk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF93cml0ZV9zaGRyc19hbmRfZWhkcik6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVjbGFyZS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUgYXNzZXJ0aW9uIHJlcXVpcmluZwotCVNIVF9SRUwvU0hUX1JFTEEgdG8gbWF0Y2ggdXNlX3JlbGFfcC4gIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZWxvYwotCXNlY3Rpb24gZm9yIHRoZSBzZWN0aW9uLCBhZGQgdGhlIG5ldyBvbmUgdG8gcmVsX2hkcjIuICBJbmNyZW1lbnQKLQlyZWxvY19jb3VudCByYXRoZXIgdGhhbiBzZXR0aW5nIGl0LgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRGVmaW5lIG5hbWUgYXMgbWFjcm8uCi0JUmVtb3ZlIHN0YXRpYyBkZWNsYXJhdGlvbi4KLQkoZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVmaW5lIG5hbWUgYXMgbWFjcm8uCi0JKGVsZl93cml0ZV9vdXRfcGhkcnMpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfZWhkcl9pbiwgZWxmX3N3YXBfZWhkcl9vdXQpOiBEZWNsYXJlLgotCShlbGZfc3dhcF9zaGRyX2luLCBlbGZfc3dhcF9zaGRyX291dCk6IERlY2xhcmUuCi0JKGVsZl9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShlbGZfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX2VoZHJfaW4sIGVsZl9zd2FwX2VoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3NoZHJfaW4sIGVsZl9zd2FwX3NoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3BoZHJfaW4sIGVsZl9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3JlbG9jX2luLCBlbGZfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfcmVsb2NhX2luLCBlbGZfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCi0JKGVsZl93cml0ZV9vdXRfcGhkcnMpOiBSZW5hbWUgZnJvbSB3cml0ZV9vdXRfcGhkcnMuICBDaGFuZ2Ugc2Vjb25kCi0JcGFyYW1ldGVyIHRvIGJlIGNvbnN0LiAgTWFrZSBub24tc3RhdGljLgotCShlbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBSZW5hbWUgZnJvbSB3cml0ZV9zaGRyc19hbmRfZWhkci4KLQlNYWtlIG5vbi1zdGF0aWMuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKE5BTUUoX2JmZF9lbGYsc2l6ZV9pbmZvKSk6IFVwZGF0ZSBuYW1lcyBvZiByZW5hbWVkIGZ1bmN0aW9ucy4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfaW5mb190b19ob3d0byk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoZWxmX2JhY2tlbmRfc2l6ZV9pbmZvKTogTGlrZXdpc2UuCi0JKGVsZk5OX2JlZCk6IFVzZSBlbGZfYmFja2VuZF9zaXplX2luZm8uCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBhbmQKLQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgaWYgQkZENjQgaXMgZGVmaW5lZC4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBBZGQgY2FzdCB0byBmcHJpbnRmIGFyZ3VtZW50LgotCi1UdWUgTWF5IDI4IDExOjQyOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBJbnNlcnQgbm9wIGluc3RydWN0aW9ucywgbm90Ci0JemVyb2VzLCBpbiBhbGlnbm1lbnQgaG9sZXMuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBNYWtlIHJvb20gZm9yIHRoZQotCXBvdGVudGlhbCBsZWFkaW5nIHVuZGVyc2NvcmUgaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIuCi0KLUZyaSBNYXkgMjQgMTQ6Mjg6MzggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEbyBub3QgcHV0IHNtYWxsIGNvbW1vbgotCXN5bWJvbHMgaW50byAuc2JzcyBpZiB0aGlzIGlzIGEgcmVsb2NhdGFibGUgbGluay4KLQotVGh1IE1heSAyMyAxMjoyNjoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogV2FybiBhYm91dAotCXVuZGVmaW5lZCBzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQotRnJpIE1heSAxNyAxMzo1NDoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYzogQWRkIGEgYnVuY2ggb2YgbmV3IGNvZGUgYW5kIHN0YXRpYyBjb25zdCBhcnJheXMgdG8KLQlzdXBwb3J0IGFsaWduaW5nIGxvYWRzIGFuZCBzdG9yZXMgb24gZm91ciBieXRlIG1lbW9yeSBib3VuZGFyaWVzLgotCUFsc286Ci0JKHNoX2NvZmZfaG93dG9zKTogQWRkIGVudHJpZXMgZm9yIFJfU0hfQ09ERSwgUl9TSF9EQVRBIGFuZAotCVJfU0hfTEFCRUwuCi0JKHNoX3JlbGF4X3NlY3Rpb24pOiBMb29rIGZvciBSX1NIX0NPREUgcmVsb2NzLiAgSWYgd2UgZmluZCBvbmUsCi0JY2FsbCBzaF9hbGlnbl9sb2Fkcy4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3QgbWFyayBSX1NIX0NPREUgb3IgUl9TSF9EQVRBIHJlbG9jcwotCWFzIHVudXNlZC4KLQotVGh1IE1heSAxNiAxNjozNDoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNhY2hlLmMgKGJmZF9vcGVuX2ZpbGUpOiBVbmxpbmsgdGhlIGZpbGUgYmVmb3JlIG9wZW5pbmcgaXQgZm9yCi0Jd3JpdGUuICBGcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBTZXQgb3BlbmVkX29uY2UuCi0KLVR1ZSBNYXkgMTQgMTI6MzU6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzb20uYyAoc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogQ2xlYXIgZXh0ZXJuYWxfcmVsb2NzIGNhY2hlIGFmdGVyCi0JZnJlZWluZyBpdC4KLQotCSogbGliYmZkLmM6IFJlbW92ZSAjaWZkZWYgRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWCwgYW5kIGNvbXBpbGUKLQl0aGUgY29kZSB1bmNvbmRpdGlvbmFsbHkuCi0KLU1vbiBNYXkgMTMgMTk6NTE6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSk6IERlZmluZSBzdHJ1Y3R1cmUuCi0JKHBlaV9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgbWFjcm8uCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwKLQlzdG9yZSBzX3BhZGRyIGZpZWxkIGluIHBlaV9zZWN0aW9uX2RhdGEuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXNlIHBlaV9zZWN0aW9uX2RhdGEgcmF0aGVyCi0JdGhhbiBfY29va2VkX3NpemUsIGFuZCBkb24ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdmFsdWUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9PQkpfV0lUSF9QRSwgc2V0IHNfcGFkZHIgdG8KLQkwLiAgSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCBzZXQgc19wYWRkciB0byBwZWlfc2VjdGlvbl9kYXRhLgotCSogcGVpY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogRGVmaW5lIGlmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotIAkocGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotCi1XZWQgTWF5ICA4IDE2OjEwOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX3NldF9hcmNoX21hY2gpOiBXcml0ZSBhcyBhIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGEKLQltYWNybyBkZWZpbml0aW9uLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IElmIGFuIGFyY2hpdmUgaGFzCi0Jbm8gbWFwLCBqdXN0IGNoZWNrIGVhY2ggbWVtYmVyIGluIHR1cm4gdG8gc2VlIHdoZXRoZXIgaXQgaXMKLQlyZXF1aXJlZC4KLQotV2VkIE1heSAgOCAwOToxNzozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IENoZWNrIGZvciB0eXBlIDB4NDEgaW4gcGFydGl0aW9uCi0JdGFibGUuICBDYWxsIEJGRF9BU1NFUlQgdG8gdmFsaWRhdGUgaGVhZGVyIHNpemUsIGluc3RlYWQgb2YKLQljYWxsaW5nIGZhdGFsLgotCShwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUHV0IHF1b3RlcyBhcm91bmQgcGFydGl0aW9uCi0JbmFtZS4KLQotVHVlIE1heSAgNyAxNjoxMDoxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwY2Jvb3QuYzogTmV3IHRhcmdldCBmb3IgbG9va2luZyBhdCBQUENidWcgYm9vdCByZWNvcmRzLgotCi0JKiBjb25maWd7dXJlLmluLC5iZmR9OiBBZGQgc3VwcG9ydCBmb3IgcHBjYm9vdCB0YXJnZXQuCi0JKiB0YXJnZXRzLmM6IERpdHRvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UdWUgTWF5ICA3IDExOjE1OjE5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IFVwZGF0ZSBuYW1lcyB0byBtYXRjaCByZWNlbnQKLQljaGFuZ2VzIHRvIGluY2x1ZGUvY29mZi9pbnRlcm5hbC5oLiAgRml4IG1pbm9yIGVycm9ycyBpbiB0aGUKLQlleGlzdGluZyByZWxvY3MuICBBZGQgUl9NT1ZMMSBhbmQgUl9NT1ZMMi4KLQkocnR5cGUyaG93dG8pOiBTaW1pbGFybHkuCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBSZXdyaXRlIHRvIHNpbXBsaWZ5LCBmaXggYnVncyBpbiB0aGUKLQlleGlzdGluZyByZWxheGluZyBjb2RlICBhbmQgcGVmb3JtIG1vcmUgcmVsYXhpbmcuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQotTW9uIE1heSAgNiAxODoyNDowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBIYW5kbGUgY29tbW9uCi0Jc3ltYm9scyBjb3JyZWN0bHkuCi0KLVNhdCBNYXkgIDQgMDU6MDg6NDUgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6ICBSZWplY3QgZ2VuZXJpYyBFTEYgdGFyZ2V0IGlmCi0JZV9tYWNoaW5lIG1hdGNoZXMgYW4gYWx0ZXJuYXRlIG1hY2hpbmUgY29kZSBpbiBhIHNwZWNpZmljIGJhY2tlbmQuCi0KLQkqIG5ldGJzZC1jb3JlLmMgKG5ldGJzZF9jb3JlX3ZlYyk6ICBSZW1vdmUgaW5pdGlhbGl6ZXIgZm9yCi0Jb2Jzb2xldGUgYWxpZ25fcG93ZXJfbWluIGZpZWxkLgotCi1GcmkgTWF5ICAzIDEzOjA3OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChyZWxvY19ob3d0b190eXBlKTogQWRkIGhvd3RvIGVudHJ5IGZvcgotCVJfUENSV09SRF9CLgotCShydHlwZTJob3d0byk6IEhhbmRsZSBSX1BDUldPUkRfQi4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEhhbmRsZSBSX1BDUldPUkRfQi4KLQkoaDgzMDBfcmVsb2NfMTZfZXN0aW1hdGUpOiBMaWtld2lzZS4gIFRyeSB0byB0dXJuIGEgMTZiaXQKLQlwYy1yZWxhdGl2ZSBicmFuY2ggKFJfUENSV09SRCkgaW50byBhbiA4Yml0IHBjLXJlbGF0aXZlCi0JYnJhbmNoIChSX1BDV09SRF9CKS4KLQotRnJpIE1heSAgMyAxMDo0Nzo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgdGhlIHNlY3Rpb24gZm9yCi0JQlNGX0NPTlNUUlVDVE9SIHN5bWJvbHMuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IENvcnJlY3Qgc2V0dGluZyBvZgotCWxhc3RfYmZfaW5kZXguCi0KLVdlZCBNYXkgIDEgMTg6Mzk6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbiBjb21kYXQgc2VjdGlvbiBsb29rdXAsCi0Jc3RvcCBsb29raW5nIHdoZW4gc2VjdGlvbiBpcyBmb3VuZC4KLQotV2VkIE1heSAgMSAxNDoxNzo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKFNUUklOR19TSVpFX1NJWkUpOiBEZWZpbmUuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogSGFuZGxlIGxvbmcgc3ltYm9sIG5hbWVzIHdoZW4gbG9va2luZyBmb3IgdGhlCi0Jc2VjdGlvbiBzeW1ib2wuCi0JKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBfYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIGZpZWxkLgotCShiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpOiBEZWZpbmUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSGFuZGxlIGxvbmcgc2VjdGlvbgotCW5hbWVzLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogcGUtYXJtLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGVpLWFybS5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlLWkzODYuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZWktaTM4Ni5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlLXBwYy5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlaS1wcGMuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiBTZXQgbG1hIG9mIHNlY3Rpb25zLgotCShiX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUmVuYW1lIGluX2FiZmQKLQlwYXJhbWV0ZXIgdG8gb3V0cHV0X2JmZC4gIFVzZWQgaW5wdXRfYmZkIGluc3RlYWQgb2Ygb3V0cHV0X2JmZCBpbgotCXNldmVyYWwgcGxhY2VzLgotCi1UdWUgQXByIDMwIDE3OjU2OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IGNyZWF0ZQotCVNFQ19DT05TVFJVQ1RPUiBzZWN0aW9ucy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgZWxmX2dwLgotCUZyb20gRG9uIEJvd21hbiA8Ym93bWFuQHdhdGVybG9vLmhwLmNvbT4uCi0KLVR1ZSBBcHIgMzAgMTc6MDY6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtY29mZl9saXR0bGVfdmVjKTogSWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQsIGFkZAotCVNFQ19MSU5LX09OQ0UgYW5kIFNFQ19MSU5LX0RVUExJQ0FURVMgdG8gc2VjdGlvbl9mbGFncy4KLQotTW9uIEFwciAyOSAxMzoxNToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZAotCW1pcHNfMzJfcmVsb2NzIGZpZWxkLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbWlwc18zMl9yZWxvY3MgZmllbGQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3B5IFJfTUlQU19SRUwzMiBhbmQgUl9NSVBTXzMyCi0JcmVsb2NzIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhcgotCWZpbGUuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEZvciBhIFJfTUlQU19SRUwzMiBvciBSX01JUFNfMzIgcmVsb2MKLQlhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgaW5jcmVtZW50IG1pcHNfMzJfcmVsb2NzLgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBtaXBzXzMyX3JlbG9jcyBpcyBzZXQsIGFuZAotCXRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIG1ha2Ugcm9vbSBpbiB0aGUKLQkucmVsLmR5biBzZWN0aW9uLgotCi1GcmkgQXByIDI2IDE4OjAwOjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVHJhY2sgdGhlIHJlYWwKLQlmaWxlIHBvc2l0aW9uIGFuZCB0aGUgdmlydHVhbCBmaWxlIHBvc2l0aW9uIHNlcGFyYXRlbHkuICBTZXQKLQlmaWxlcG9zIGluZm9ybWF0aW9uIGJzYWVkIG9uIHRoZSByZWFsIGZpbGUgcG9zaXRpb24uCi0JKF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBIYW5kbGUgLmxpYiBzZWN0aW9ucyBsaWtlIHRoZQotCUphbiAyMyBjaGFuZ2UgdG8gY29mZmNvZGUuaC4KLQotCSogc29tLmMgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgdGhlIHN5bWJvbCBjb3VudCB0byB0aGUKLQludW1iZXIgb2YgQkZEIHN5bWJvbHMgY3JlYXRlZC4KLQotRnJpIEFwciAyNiAxMjozNDoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEZvcndhcmQgcmVsb2NhdGlvbnMgdG8gdGhlCi0Jb3V0cHV0IGZpbGUgaWYgbGlua2luZyBzaGFyZWQgb2JqZWN0cy4gIExvb3AgdG8gY2hlY2sgYWxsIHJlbG9jcywKLQlyYXRoZXIgdGhhbiByZXR1cm5pbmcgZmFsc2Ugb24gZmlyc3QgZXJyb3IuCi0KLVRodSBBcHIgMjUgMTM6MjU6MTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBBZGQgUExUIGNhc2UuCi0JKHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBJZiAuaW50ZXJwIHNlY3Rpb24sIGJ1bXAgIwotCW9mIHByb2dyYW0gaGVhZGVycyBieSAxLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEZsZXNoIG91dCBzdXBwb3J0LgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciAucGx0IHNlY3Rpb24uCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUHJpbnQgb3V0IGZpbGVuYW1lIGluIGRlYnVnIGNvZGUuICBFbmFibGUKLQlQTFQgc3VwcG9ydC4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBZGQgc3VwcG9ydCBmb3IgUExUJ3MsIGJlZWYgdXAKLQlkZWJ1ZyBvdXRwdXQuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IElmIHRoZSBvdXRwdXQgc2VjdGlvbiBpc24ndCBkZWZpbmVkLAotCWRvbid0IGFib3J0LCBqdXN0IGdpdmUgYW4gZXJyb3IgbWVzc2FnZS4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZSBzZWN0aW9uCi0JYmVpbmcgY3JlYXRlZCBpcyAuc2RhdGEgb3IgLnNkYXRhMiwgZG9uJ3QgbWFrZSB0aGUgc3ltYm9sIGR5bmFtaWMuCi0KLVdlZCBBcHIgMjQgMTQ6MDQ6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IExvb2sgdGhyb3VnaCB0aGUKLQltZW1iZXJzIG9mIGFuIGFyY2hpdmUgZm9yIGR5bmFtaWMgb2JqZWN0cyB3aXRoIG5vIHN5bWJvbHMsIGFuZAotCXBhc3MgdGhlbSBkaXJlY3RseSB0byBjaGVja19hcmNoaXZlX2VsZW1lbnQuCi0JKHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IFBhc3MgZHluYW1pYyBvYmplY3RzIHRvCi0JeGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMuCi0JKHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBDaGFuZ2UgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQwotCWZyb20gX2JmZF9ub2R5bmFtaWMgdG8gX2JmZF94Y29mZi4KLQkqIGxpYmNvZmYtaW4uaCAoX2JmZF94Y29mZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOgotCURlY2xhcmUuCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX3N3YXBfbGRyZWxfaW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoeGNvZmZfZHluYW1pY19yZWxvYyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFVzZSB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cy4KLQotVHVlIEFwciAyMyAxMjo0ODo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc3BhcmMuYyAoYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyk6IFJldHVybiBiZmRfcmVsb2Nfb2sgZXZlbgotCWlmIHJlbG9jX2VudHJ5LT5hZGRlbmQgaXMgbm90IDAuCi0JKENBTENfQURERU5EKTogSnVzdCBzZXQgdGhlIGFkZGVuZCB0byByZWxvYy5yX29mZnNldC4KLQotTW9uIEFwciAyMiAxODoyOTowMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IEZpeCBzcGVsbGluZyBvZgotCVJfU1BBUkNfR0xPQl9KTVAuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IExpa2V3aXNlLgotCUFkZCBlbnRyaWVzIGZvciBSX1NQQVJDX1s1Nl0uCi0JKHNwYXJjX3JlbG9jX21hcCk6IEFkZCBlbnRyaWVzIGZvciBSX1NQQVJDX1s1Nl0uCi0KLU1vbiBBcHIgMjIgMTU6MDc6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JT3B0aW1pemUgbGlua2luZyBvZiBzdGFicyBpbiBzZWN0aW9ucyBhcyB1c2VkIGluIEVMRiBhbmQgQ09GRi4KLQkqIHN0YWJzLmM6IE5ldyBmaWxlLgotCSogbGliYmZkLWluLmggKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRGVjbGFyZS4KLQkoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogRGVjbGFyZS4KLQkoX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgotCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZQotCXN0YWJfaW5mbyBmaWVsZC4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ2FsbCBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyBpZgotCWFwcHJvcHJpYXRlLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MgaGFzaCB0YWJsZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIG9wdGltaXplZCBzdGFicyBzZWN0aW9ucy4KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogV3JpdGUgb3V0IHN0YWIgc3RyaW5ncwotCWhhc2ggdGFibGUuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgc3RhYl9pbmZvCi0JZmllbGQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGFwcHJvcHJpYXRlLCBjYWxsCi0JX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MgaGFzaCB0YWJsZS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIG9wdGltaXplZCBzdGFicyBzZWN0aW9ucy4KLQkqIHJlbG9jLmMgKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IENoZWNrIGFkZHJlc3MgYWdhaW5zdAotCV9yYXdfc2l6ZSByYXRoZXIgdGhhbiBfY29va2VkX3NpemUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogQWRkIHN0YWJzLm8KLQkoQkZEX0xJQlNfQ0ZJTEVTKTogQWRkIHN0YWJzLmMuCi0KLQkqIFZFUlNJT046IEluY3JlbWVudCBmb3IgYmZkbGluay5oIGNoYW5nZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mCi0JQlNGX05PVF9BVF9FTkQgY29tbW9uIHN5bWJvbHMuCi0KLUZyaSBBcHIgMTkgMTk6MjE6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChyZWNvcmRfdG9jKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkocHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uLgotCShwcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbW92ZSB1bnJlYWNoZWQgY29kZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgdGFrZSB0aGUgYWRkcmVzcwotCW9mIGFuIGFycmF5LgotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5nLgotCShwZV9wcmludF9lZGF0YSk6IExpa2V3aXNlLgotCShwZV9wcmludF9yZWxvYyk6IFJlbW92ZSBBTlNJIEMgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi0KLVRodSBBcHIgMTggMTg6NTE6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBsYXN0X2JmX2luZGV4Ci0JYW5kIGxhc3RfYmYgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IFN3YXAgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTgotCXN5bWJvbHMuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBMaWtld2lzZS4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoY29mZl9wb2ludGVyaXplX2F1eCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KLQlzeW1ib2xzLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3RfYmZfaW5kZXgKLQlmaWVsZC4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTiBzeW1ib2xzLgotCUZpeCB1cCAuYmYgZW5kbmR4IGxpbmsgZmllbGRzLgotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3RfYmZfaW5kZXgKLQlmaWVsZC4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KLQlzeW1ib2xzLgotCi1XZWQgQXByIDE3IDEyOjA4OjI0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcGV7LGl9LXBwYy5jIChQUENfUEUpOiBEZWZpbmUgaW5zdGVhZCBvZiBQUEMsIHNvIHRoYXQgY29tcGlsaW5nCi0Jb24gU29sYXJpcyBQb3dlclBDIHN5c3RlbXMgZG9lc24ndCBnZXQgY29uZnVzZWQuCi0KLQkqIGNjZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlICNpZmRlZiBQUENfUEUsIG5vdAotCSNpZmRlZiBQUEMuCi0KLQkqIGVsZmNvcmUuaCAoYmZkX3Byc3RhdHVzLCBiZmRfZnByZWdzZXQpOiBBZGQgdGhyZWFkIGFyZ3VtZW50LgotCShlbGZfY29yZWZpbGVfbm90ZSk6IElmIEhBVkVfU1lTX1BST0NGU19IIGlzIG5vdCBkZWZpbmVkLCBkb24ndAotCXVwZGF0ZSBkaWRfcmVnIGFuZCBkaWRfcmVnMi4KLQotV2VkIEFwciAxNyAxMzowNzozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGZvciBUT0Mgb3ZlcmZsb3cuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFdoZW4gY2FsbGluZyB0aGUKLQljYWxsYmFjayByb3V0aW5lcywgcGFzcyBoLT5yb290LnN0cmluZyByYXRoZXIgdGhhbiBuYW1lLCBpbiBjYXNlCi0JY29weSBpcyB0cnVlIGFuZCBuYW1lIGlzIHRyYW5zaWVudC4KLQotVHVlIEFwciAxNiAxNjozNjozOCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvcmUuaDogIEFkZCBzdXBwb3J0IGZvciBjb3JlIGZpbGVzIHdpdGggbXVsdGlwbGUgdGhyZWFkcy4KLQkoUHJpbWFyaWx5IGZvciBTb2xhcmlzLikKLQotVHVlIEFwciAxNiAxMzo0NDowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykpOiBEb24ndCBkbyBhbnl0aGluZyBpZgotCXNlY3Rpb24tPm9yZWxvY2F0aW9uIGlzIE5VTEwuCi0KLQkqIGNvZmZnZW4uYyAoYmZkX2NvZmZfZ2V0X3N5bWVudCk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2NvZmZfZ2V0X2F1eGVudCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfY29mZl9nZXRfc3ltZW50KTogRGVjbGFyZS4KLQkoYmZkX2NvZmZfZ2V0X2F1eGVudCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBBcHIgMTUgMTk6MDY6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2hpMTYpOiBEZWZpbmUuCi0JKG1pcHNfaGkxNl9hZGRyLCBtaXBzX2hpMTZfYWRkZW5kKTogUmVtb3ZlLgotCShtaXBzX2hpMTZfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHNfZWxmX2hpMTZfcmVsb2MpOiBNYWludGFpbiBhIGxpc3Qgb2YgdW5tYXRjaGVkIEhJMTYgcmVsb2NzLgotCShtaXBzX2VsZl9sbzE2X3JlbG9jKTogUHJvY2VzcyBtaXBzX2hpMTZfbGlzdC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYKLQlyZWxvY3MgYmVmb3JlIHRoZSBhc3NvY2lhdGVkIExPMTYgcmVsb2MuCi0KLVdlZCBBcHIgMTAgMDA6MjM6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB2ZXJzYWRvcy5jICh2ZXJzYWRvc19zY2FuKTogQ2hlY2sgYmZkX2FsbG9jIHJldHVybiB2YWx1ZS4KLQkodmVyc2Fkb3Nfb2JqZWN0X3ApOiBDaGVjayBhbGwgYmZkX3JlYWQgcmV0dXJuIHZhbHVlcy4gIFJlcXVpcmUKLQl0aGF0IGxhbmcgZmllbGQgYmUgbGVzcyB0aGFuIDEwLCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBJbnRlbCBIZXgKLQlmaWxlcy4KLQotCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogV3JpdGUgb3V0IHRoZSByZWxvY3MgZXZlbiBpZiB0aGVyZQotCWFyZW4ndCBhbnkgc3ltYm9scy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogU2V0IHJfaW5kZXggdG8gTl9BQlMsCi0Jbm90IDAsIGZvciBhbiBhYnNvbHV0ZSBzeW1ib2wuCi0JKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogTGlrZXdpc2UuCi0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWNjZXB0IGEgbGVuZ3RoIG9mIDQgZm9yIHJlY29yZCB0eXBlIDUuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRm9yIGEgbGFyZ2Ugc3RhcnQgYWRkcmVzcywgb3V0cHV0Ci0JdGhlIGZ1bGwgMzIgYml0IGFkZHJlc3MgaW4gcmVjb3JkIHR5cGUgNS4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2J5dGUpOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBmcm9tIGJmZF9ieXRlCi0JdG8gaW50IHRvIGF2b2lkIHByb21vdGlvbiBwcm9ibGVtcyBpbiBwcm90b3R5cGUuCi0KLVR1ZSBBcHIgIDkgMTE6NDQ6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlICR7c3JjZGlyfSB3aGVuIGxvb2tpbmcgZm9yIHBpY2ZyYWcuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTd2l0Y2ggb24gJHtsaWJkaXJ9LCBub3QgJChsaWJkaXIpLiAgRnJvbQotCWFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1IChBbGFuIE1vZHJhKS4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogQWx3YXlzIGNhbGwgYWRkX2R5bmFtaWNfc3ltYm9scwotCWVudHJ5IHBvaW50LCBub3QganVzdCBmb3IgRFlOQU1JQyBvYmplY3RzLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IEFsd2F5cyBjYWxsCi0Jc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICBJZiBjYWxsZWQgd2l0aCBhIG5vbiBEWU5BTUlDCi0Jb2JqZWN0LCBkb24ndCBkbyBhbnl0aGluZyBlbHNlLgotCShzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0KLU1vbiBBcHIgIDggMTI6MDk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBITERGTEFHUyBhbmQgU0hMSUJfQ0ZMQUdTIGZvciAqLWRlYy1vc2YqCi0JaG9zdCB3aGVuIGNvbmZpZ3VyaW5nIHdpdGggLS1lbmFibGUtc2hhcmQuCi0KLUZyaSBBcHIgIDUgMTI6MjQ6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgaVszNDVdODYtKi1mcmVlYnNkZWxmKiB0YXJnZXQ7IGZyb20gSm9obiBQb2xzdHJhCi0JPGpkcEBwb2xzdHJhLmNvbT4uCi0KLQkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IEZvciBXQVJOX1JPVy93YXJuLCB1c2UgTVdBUk4sIG5vdCBDWUNMRSwKLQl0byBhdm9pZCBjcmFzaGluZyBpbiBiZmRfaGFzaF9yZXBsYWNlLgotCi0JKiBzeXNkZXAuaDogVXNlICNpZmRlZiwgbm90ICNpZi4KLQotVGh1IEFwciAgNCAyMzozMjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQotVGh1IEFwciAgNCAxODo0OTowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLXNvbnktYnNkKik6IEZpeCB0eXBvIGluIEFDX0RFRklORS4KLQkoQUNfQ0hFQ0tfSEVBREVSUyk6IENoZWNrIGZvciBzeXMvdGltZS5oCi0JKEFDX0hFQURFUl9USU1FKTogQWRkIG1hY3JvLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogc3lzZGVwLmg6IFVzZSBUSU1FX1dJVEhfU1lTX1RJTUUgYW5kIEhBVkVfU1lTX1RJTUVfSAotCXRvIGNvbnRyb2wgd2hhdCBjb21iaW5hdGlvbiBvZiA8dGltZT4gYW5kIDxzeXMvdGltZS5oPgotCWdldCBpbmNsdWRlZC4KLQotVHVlIEFwciAgMiAxMzoxMTo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoc3Vub3NfMzJfc2V0X2FyY2hfbWFjaCk6IEhhbmRsZSBNX1NQQVJDTEVULgotCShhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogSGFuZGxlCi0JYmZkX21hY2hfc3BhcmNfe3NwYXJjbGV0LHNwYXJjbGl0ZX0uCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY197c3BhcmNsZXQsc3BhcmNsaXRlfSk6IERlZmluZS4KLQkoYmZkX21hY2hfc3BhcmNfdjlfcCk6IFVwZGF0ZS4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIGVudHJpZXMgZm9yIHNwYXJjbGV0LHNwYXJjbGl0ZS4KLQkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBBZGQgTV9TUEFSQ0xFVC4KLQkqIHN1bm9zLmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotVHVlIEFwciAgMiAwMDozMzoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgaGdvdCBmaWVsZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgaGdvdCBmaWVsZC4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogU3RvcmUgdGhlCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGhhc2ggdGFibGUgZW50cnkgaW4gdGhlIGhnb3QgZmllbGQuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBJZiB0aGUgc2l6ZSBvZiB0aGUKLQlnbG9iYWwgb2Zmc2V0IHRhYmxlIGdvZXMgb3ZlciAweDEwMDAsIHNldCB0aGUgdmFsdWUgb2YKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gdG8gMHgxMDAwIGludG8gdGhlIHNlY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBTdWJ0cmFjdCB0aGUgb2Zmc2V0IG9mCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHdoZW4gaGFuZGxpbmcgR09UIHJlbG9jYXRpb25zLgotCi0JKiBlbGZjb2RlLmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4KLQotTW9uIEFwciAgMSAxMDozOToyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBSZW5hbWVkIGZyb20KLQlnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jLiAgQWxsIHJlZmVyZW5jZXMgY2hhbmdlZC4KLQkqIGdlbmxpbmsuaCAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyYXRpb24KLQltb3ZlZCBoZXJlIGZyb20gbGliYmZkLWluLmguCi0JKiBsaWJiZmQtaW4uaDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gQXByICAxIDEyOjM1OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogV2hlbiByZXBvcnRpbmcgYW4KLQlvdmVyZmxvdyBlcnJvciwgdXNlIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUgaWYKLQlhdmFpbGFibGUuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIGNvbW1vbiBzeW1ib2wgZ290Ci0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgc2V0IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIuCi0KLVN1biBNYXIgMzEgMDE6NTg6NDEgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBEZWxldGUgdGVzdCBmb3IgLmp1bmsuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDI5IDEyOjQ0OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChTRUNfTElOS19PTkNFKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIENPRkZfV0lUSF9QRSwgdHVybgotCVNFQ19MSU5LX09OQ0UgaW50byBJTUFHRV9TQ05fTE5LX0NPTURBVC4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBJZiBDT0ZGX1dJVEhfUEUsIHR1cm4gSU1BR0VfU0NOX0xOS19SRU1PVkUKLQlpbnRvIFNFQ19FWENMVURFLiAgSWYgSU1BR0VfU0NOX0xOS19DT01EQVQgaXMgc2V0LCBzZXQKLQlTRUNfTElOS19PTkNFLCBhbmQgbG9vayB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgZm9yIHRoZSBzZXR0aW5nCi0JZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9XSVRIX1BFLCBpZiBTRUNfTElOS19PTkNFIGlzCi0Jc2V0IGZvciBhIHNlY3Rpb24sIGZpbmQgdGhlIHNlY3Rpb24gc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUsCi0JYW5kIHNldCB0aGUgYXV4IGVudHJ5IGJhc2VkIG9uIFNFQ19MSU5LX0RVUExJQ0FURVMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQWRkIGEgc3BhY2UgYmVmb3JlICJjaGVja3N1bSIuCi0JKiBjb2ZmLWFybS5jIChhcm1jb2ZmX2JpZ192ZWMpOiBJZiBDT0ZGX1dJVEhfUEUgaXMgZGVmaW5lZCwgYWRkCi0JU0VDX0xJTktfT05DRSBhbmQgU0VDX0xJTktfRFVQTElDQVRFUyB0byBzZWN0aW9uX2ZsYWdzLgotCSogY29mZi1pMzg2LmMgKGkzODZjb2ZmX3ZlYyk6IExpa2V3aXNlLgotCSogY29mZi1wcGMuYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogTGlrZXdpc2UuCi0KLQkqIFZFUlNJT046IEJ1bXAgdG8gMi42LjEuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIFZFUlNJT04uCi0KLVRodSBNYXIgMjggMjM6NDg6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IEFkZCBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBObyBsb25nZXIgc3RhdGljLgotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfbGlua19oYXNoX2NyZWF0ZSk6IEFsbG93IHNwZWNpZmljIHRhcmdldHMKLQl0byBvdmVycmlkZS4KLQkqIGNvZmYtaDgzMDAuYzogQWRkIHR3byBkZXJpdmVkIGhhc2ggdGFibGVzIGFuZCB0aGVpciBhc3NvY2lhdGVkCi0JZnVudGlvbnMgYW5kICNkZWZpbmVzIGZvciB1c2UgYnkgdGhlIGg4MzAwIGxpbmtlci4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcywgY2FzZSBSX01FTV9JTkRJUkVDVCk6IENyZWF0ZSBlbnRyaWVzIGluCi0JdGhlIGZ1bmN0aW9uIHZlY3RvciBhcyBuZWVkZWQuICBQbGFjZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24KLQl2ZWN0b3IgZW50cnkgaW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgUl9NRU1fSU5ESVJFQ1QgcmVsb2MuCi0JUmV3cml0ZSB0aGUgdmVjdG9ycyBzZWN0aW9uIGNvbnRlbnRzIGFzIG5lY2Vzc2FyeS4KLQkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24gZm9yIHRoZSBoODMwMCBsaW5rZXIuCi0JKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWZpbmUgdG8gdXNlIGg4MzAwIHNwZWNpZmljIHZlcnNpb24uCi0JKGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQotVGh1IE1hciAyOCAxNzo0NDowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmhwcGEuaDogSWYgZ2NjIDIuNyBvciBoaWdoZXIsIGRlY2xhcmUgYWxsIHRoZSBmdW5jdGlvbnMgd2l0aAotCV9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkgc28gdGhhdCAtV2FsbCBkb2Vzbid0IHdhcm4gYWJvdXQKLQl0aGVtLgotCShocHBhX3JlYnVpbGRfaW5zbik6IFBhc3MgcG9pbnRlciB0byBjb3JyZWN0IHR5cGUgdG8KLQlsb3dfc2lnbl91bmV4dCBhbmQgZGlzX2Fzc2VtYmxlXzIxLgotCi1UaHUgTWFyIDI4IDExOjAwOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQte3N5c3Y0Kixzb2xhcmlzMip9KTogRGVsZXRlLgotCVN0aWNrIHdpdGggc3BhcmMtKi17c3lzdjQqLHNvbGFyaXMyKn0uCi0KLVdlZCBNYXIgMjcgMTA6NDM6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBTd2FwIGluIGV4dHJhIFBFIHhfc2NuIGZpZWxkcy4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBTd2FwIG91dCBleHRyYSBQRSB4X3NjbiBmaWVsZHMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogWmVybyBvdXQgZXh0cmEgUEUgeF9zY24gZmllbGRzLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IElmIGFueSBvZiB0aGUgZXh0cmEgUEUgeF9zY24KLQlmaWVsZHMgaXMgbm9uLXplcm8sIHByaW50IHRoZW0uCi0KLQkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogUHV0IGluc2lkZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLQlpZmRlZi4gIFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCShwcGNfcmVjb3JkX2RhdGFfaW5fdG9jX2VudHJ5KTogSWZkZWYgb3V0LiAgUmVtb3ZlZCB1bnVzZWQKLQl2YXJpYWJsZXMuCi0JKHBwY19tYXJrX3N5bWJvbF9hc19nbHVlKTogUHV0IGluc2lkZSBDT0ZGX0lNQUdFX1dJVEhfUEUgaWZkZWYuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBJZmRlZiBvdXQuCi0JKHBlX3BwY19yZWxvYyk6IElmZGVmIG91dC4gIFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBNYWtlCi0JZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLiAgUHV0IGJlZm9yZV9hZGRyIGluCi0JREVCVUdfUkVMT0MgaWZkZWYuCi0JKGR1bXBfdG9jKTogTWFrZSBmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzIGNvcnJlc3BvbmQuCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBBbHdheXMKLQlyZXR1cm4gYSB2YWx1ZS4KLQkocHBjX3JlZmxvX3JlbG9jKTogSWZkZWYgb3V0LgotCShwcGNfYWRkcjMybmJfcmVsb2MpOiBJZmRlZiBvdXQuCi0JKHBwY19jb2ZmX3J0eXBlMmhvd3RvKTogTWFrZSBmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzCi0JY29ycmVzcG9uZC4KLQkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiBMaWtld2lzZS4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogTW92ZSBvdGhlcndpc2UgdW51c2VkIHZhcmlhYmxlcyBpbnRvCi0JdGhlICNpZmRlZiB3aGVyZSB0aGV5IGFyZSB1c2VkLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShwZV9wcmludF9lZGF0YSk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcwotCWNvcnJlc3BvbmQuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKHBlX3ByaW50X3BkYXRhKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgYWRkcl92YWx1ZS4gIEFsd2F5cwotCXJldHVybiBhIHZhbHVlLgotCShwZV9wcmludF9yZWxvYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgb25hbGluZS4gIE1ha2UgZnByaW50ZgotCXN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzIGNvcnJlc3BvbmQuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZXR1cm4gdHJ1ZS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBNb3ZlIGRlZmluaXRpb24gb2YgdW51c2VkCi0JdmFyaWFibGUgcmVsYSBpbnNpZGUgI2lmIDAgc2VjdGlvbiB3aGVyZSBpdCBpcyB1c2VkLgotCi0JKiBuczMyay5oOiBOZXcgZmlsZS4KLQkqIGNwdS1uczMyay5oOiBJbmNsdWRlIG5zMzJrLmguICBSZW5hbWUgZXh0ZXJuYWxseSB2aXNpYmxlCi0JZnVuY3Rpb25zIHRvIHN0YXJ0IHdpdGggX2JmZF8uCi0JKiBhb3V0LW5zMzJrLmM6IEluY2x1ZGUgbnMzMmsuaC4gIENoYW5nZSByZWZlcmVuY2VzIHRvIHJlbmFtZWQKLQlmdW5jdGlvbnMgaW4gY3B1LW5zMzJrLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEhGSUxFUyk6IEFkZCBuczMyay5oLgotCi0JKiBzZWN0aW9uLmMgKHN0cnVjdCBzZWMpOiBBZGQgbGlua2VyX21hcmsgZmllbGQuICBDaGFuZ2UKLQl1c2VyX3NldF92bWEgYW5kIHJlbG9jX2RvbmUgdG8gYmUgc2luZ2xlIGJpdCBmaWVsZHMuCi0JKFNURF9TRUNUSU9OKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGUKLQlsaW5rLgotCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGUKLQlsaW5rLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluCi0JdGhlIGxpbmsuCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZAotCWluIHRoZSBsaW5rLgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogSW5jbHVkZSBzZWN0aW9uIG5hbWUgaW4KLQlvdmVyZmxvdyBlcnJvciBtZXNzYWdlcy4KLQotVHVlIE1hciAyNiAxNTo0NjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlcik6IElmIF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lCi0JaXMgbm90IHNldCwgcHJpbnQgIkJGRDogIiBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFDX0NIRUNLX1RPT0wgdG8gZmluZCBhciBhbmQgcmFubGliLiAgRnJvbQotCU1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjIgMTI6MTc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBGaXggc2NhbiBmb3IgQ19CSU5DTC9DX0VJTkNMCi0Jc3ltYm9scy4KLQotCSogY29uZmlnLmJmZDogQWRkIGllZWVfdmVjIHRvIHRhcmdfc2VsdmVjcyBmb3IgaTk2MCB0YXJnZXRzIGFuZAotCW02OGstYW91dCwgbTY4ay1jb2ZmLCBhbmQgbTY4ay1lbGYgdGFyZ2V0cy4KLQotRnJpIE1hciAyMiAxMTozMzo0NCAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQGdvb2Z5LmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogaWVlZS5jOiBDaGFuZ2VkICNpZmRlZiBLRUVQTUlOVVNQQ0lOSU5TVCB0byAjaWYgS0VFUE1JTlVTUENJTklOU1QuCi0JKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogUmVzdHJ1Y3R1cmVkIHRvIHByZXZlbnQKLQlpZWVlX29iamVjdF9wIGZyb20gYmVpbmcgY2FsbGVkIHJlcGVhdGVkbHkuCi0KLVRodSBNYXIgMjEgMTE6MDA6NDcgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgQWxsb2NhdGUKLQlidWZmZXJzIGxhcmdlIGVub3VnaCBmb3IgYW55IEZJTEVIRFIgb3IgQU9VVEhEUi4KLQotVGh1IE1hciAyMSAxNjoyODoxNyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBlY29mZmxpbmsuYyAobG9va3VwX2xpbmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCByZW5hbWVkIGFuZAotCXNsaWdobHkgY2hhbmdlZCBmcm9tIG9sZCBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lLgotCShfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogQ2FjaGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICBVc2UKLQlsb29rdXBfbGluZSBmb3IgYWN0dWFsIGxvb2t1cC4KLQotVGh1IE1hciAyMSAxNDo1OToxMSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcGRhdGEpOiBXYXJuIGlmIHRoZSAucGRhdGEgc2VjdGlvbiBpcyBub3QgYQotCW11bHRpcGxlIG9mIDIwIGJ5dGVzLgotCi1UaHUgTWFyIDIxIDEzOjU0OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBiZmRfemFsbG9jIHRvCi0JYWxsb2NhdGUgZWNvZmZfZmluZF9saW5lLCBhbmQgZG9uJ3QgaW5pdGlhbGl6ZSBieSBoYW5kLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBiZmRfemFsbG9jIGZvcgotCW1pcHNfZWxmX2ZpbmRfbGluZSwgYW5kIGRvbid0IGNhbGwgbWVtc2V0LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIG5vdAotCXByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUsIGRvbid0IGNvbnNpZGVyIHNvZmFyIHdoZW4gYWxpZ25pbmcKLQl0aGUgc2VjdGlvbiB0byB0aGUgY29ycmVjdCBzaXplLgotCi1XZWQgTWFyIDIwIDE2OjUzOjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogSWZkZWYgb3V0LgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNhbGwgY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzLgotCSogY29mZmdlbi5jIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogSWZkZWYgb3V0LgotCi1Nb24gTWFyIDE4IDEyOjU0OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogSW5pdGlhbGl6ZSBncCBpZgotCW91dHB1dF9iZmQgaXMgbm90IE5VTEwuCi0KLVRodSBNYXIgMTQgMTc6MTI6MDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBDYWxsIGJmZF96YWxsb2MgaW5zdGVhZAotCW9mIGJmZF9hbGxvYyAoZml4ZXMgZml4X2xpbmUgbm90IGJlaW5nIGluaXRpYWxpemVkKS4KLQlEZWxldGUgemVyb2luZyBvZiBmaXhfe3ZhbHVlLHRhZyxlbmQsc2NubGVufSBmaWVsZHMuCi0KLVRodSBNYXIgMTQgMTY6MDY6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBBbGxvdyBzcGVjaWZpYyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUKLQliZmRfbGlua19hZGRfc3ltYm9scyByb3V0aW5lLgotCi0JKiBjb2ZmLWg4MzAwLmM6IEluY2x1ZGUgZ2VubGluay5oLgotCShob3d0b190YWJsZSk6IEFkZCBSX01FTV9JTkRJUkVDVC4KLQkocnR5cGUyaG93dG8pOiBTdXBwb3J0IFJfTUVNX0lORElSRUNULgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogSGFuZGxlIFJfTUVNX0lORElSRUNUIGxpa2UgUl9SRUxCWVRFCi0JZm9yIG5vdy4KLQotVHVlIE1hciAxMiAxMjo0MToxNyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBrb2FsYS5henN0YXJuZXQuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UKLQlpbmZvLT5jYWxsYmFja3Nfd2FybmluZywgcmF0aGVyIHRoYW4gX2JmZF9lcnJvcl9oYW5kbGVyLCBmb3IKLQkibXVsdGlwbGUgZ3AiIHdhcm5pbmcuCi0KLVR1ZSBNYXIgMTIgMTI6MTA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgQkZEX0FTU0VSVCBvbiBoYXNoCi0JdGFibGUgc3RyaW5nLiAgVXNlIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAuCi0JKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBSZW1vdmUgQkZEX0FTU0VSVCBvbiBoYXNoCi0JdGFibGUgc3RyaW5nLgotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2UgdGhlIG5hbWUgZnJvbSB0aGUgaGFzaAotCXRhYmxlLCBpZiBhbnksIHdoZW4gd3JpdGluZyBvdXQgc3ltYm9scy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogVXNlIHRoZSBuYW1lIGZyb20gdGhlIGhhc2ggdGFibGUsCi0JaWYgYW55LCB3aGVuIHJlcG9ydGluZyB1bmRlZmluZWQgc3ltYm9scy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogVXNlIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAuCi0JKiBib3V0LmMgKGdldF92YWx1ZSk6IExpa2V3aXNlLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBMaWtld2lzZS4KLQkoeGNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9mZHJfaW4pOiBJZiBFQ09GRl82NCwgdHVybiAweGZmZmZmZmZmCi0JaW50byAtMSBmb3IgaW50ZXJuLT5yc3MuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotTW9uIE1hciAxMSAxMjoyODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWItc3ltcy5jIChfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSk6IERlZmluZS4KLQkoYmZkX2dldF9zdGFiX25hbWUpOiBSZW5hbWUgZnJvbSBhb3V0X3N0YWJfbmFtZS4gIFJld3JpdGUgdG8gdXNlIGEKLQlzd2l0Y2guCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9zdGFiX25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IEFkZCBzdGFiLXN5bXMuby4KLQkoQkZEX0xJQlNfQ0ZJTEVTKTogQWRkIHN0YWItc3ltcy5jLgotCShCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBzdGFiLXN5bXMuby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogUmVtb3ZlIHN0YWItc3ltcy5jLgotCSogY29uZmlndXJlLmluOiBEb24ndCBsaXN0IHN0YWItc3ltcy5vIGluIGJmZF9iYWNrZW5kcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGxpYmFvdXQuaCAoYW91dF9zdGFiX25hbWUpOiBEb24ndCBkZWNsYXJlLgotCSogYW91dHguaCAoTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykpOiBDYWxsIGJmZF9nZXRfc3RhYl9uYW1lLAotCW5vdCBhb3V0X3N0YWJfbmFtZS4KLQotRnJpIE1hciAgOCAxMToyNjoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWRqdXN0IGZpbGUgb2Zmc2V0Ci0JZm9yIHNlY3Rpb24gYWxpZ25tZW50IGV2ZW4gaWYgU0VDX0xPQUQgaXMgbm90IHNldC4KLQotVHVlIE1hciAgNSAxMjowMjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFNITElCIG9yIFNITElOSyB0byBhbiBlbXB0eSBzdHJpbmcsCi0Jc2luY2UgdGhleSBhcHBlYXIgYXMgdGFyZ2V0cyBpbiBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogSWYgbm90IG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LAotCWRvbid0IGZpZGRsZSB3aXRoIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLgotCi1Nb24gTWFyICA0IDEyOjQ5OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmspOiBUcmVhdCB1bmRlZmluZWQgaW1wb3J0ZWQgc3ltYm9scyBhcwotCXRob3VnaCB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IExpa2V3aXNlLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCBsb29rIGF0IHRoZSBsaW5lCi0JbnVtYmVycyBmb3IgdGhlIHNlY3Rpb24gaWYgc2VjdGlvbi0+bGluZW5vIGlzIE5VTEwuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogUHJpbnQgYSB1c2VmdWwgZXJyb3IKLQltZXNzYWdlIHJhdGhlciB0aGFuIGNhbGxpbmcgQkZEX0FTU0VSVC4KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbC4KLQotRnJpIE1hciAgMSAwOTo0Mjo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvbid0IHNldCBTRUNfTE9BRCBmbGFnCi0JZm9yIC5zYnNzIHNlY3Rpb24uCi0KLVdlZCBGZWIgMjggMTE6MjU6NDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSk6IEFkZCBSX0hQUEFfTkxTRUwKLQlhbmQgUl9IUFBBX05MUlNFTC4KLQkoZV9uc2VsLCBlX25sc2VsLCBlX25scnNlbCk6IFVuZGVmaW5lLiAgQWRkIHRvCi0JaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdC4KLQkoaHBwYV9maWVsZF9hZGp1c3QpOiBIYW5kbGUgZV9ubHNlbCwgZV9ubHJzZWwuICBGaXggZV9uc2VsIGhhbmRsaW5nLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIE4nLCBOTCcgTkxSJyBmaWVsZAotCXNlbGVjdG9ycy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEZpbmlzaCBoYW5kbGluZyBvZiBSX04wU0VMIGFuZCBSX04xU0VMLgotCi1XZWQgRmViIDI4IDExOjAwOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBBZGp1c3QgdGhlIHNlZ21lbnQKLQltZW1vcnkgc2l6ZSBmb3IgdGhlIGFsaWdubWVudCBvZiBhIFNFQ19BTExPQyBzZWN0aW9uLCBub3QganVzdCBhCi0JU0VDX0xPQUQgc2VjdGlvbi4KLQotVHVlIEZlYiAyNyAxNDoxNzozMSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4a2xpbnV4LmM6IE5ldyBmaWxlLgotCSogaG9zdHMvbTY4a2xpbnV4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAobTY4Ki0qLWxpbnV4YW91dCosIG02OCotKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki0qLWxpbnV4Kik6IE5ldyBuYXRpdmUgaG9zdC4KLQkobTY4a2xpbnV4X3ZlYyk6IE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKG02OGtsaW51eF92ZWMpOiBEZWNsYXJlLgotCSogaTM4NmxpbnV4LmMgKGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogUmVuYW1lZCBmcm9tCi0JYmZkX2xpbnV4X3NpemVfZHlubWljX3NlY3Rpb25zIHRvIGF2b2lkIGNsYXNoIHdpdGggbTY4a2xpbnV4LmMuCi0JKiBiZmQtaW4uaCAoYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBSZW5hbWUKLQlkZWNsYXJhdGlvbiBmcm9tIGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgbTY4a2xpbnV4Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBtNjhrbGludXguYy4KLQotVHVlIEZlYiAyNyAxMTozMTozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAocGFfYXJjaCk6IEFkZCBwYTIwLgotCShocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBBZGQgUl9IUFBBX05TRUwuCi0JKGVfbnNlbCk6IFVuZGVmaW5lLiAgQWRkIHRvIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQuCi0JKGhwcGFfZmllbGRfYWRqdXN0KTogSGFuZGxlIGVfbnNlbC4KLQkqIHNvbS5jOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIG1hbnkgbmV3IHJlbG9jcyBmb3VuZCBvbmx5Ci0JaW4gaHB1eDEwIGluY2x1ZGUgZmlsZXMuCi0JKHNvbV9maXh1cF9mb3JtYXRzKTogQWRkIHNldmVyYWwgbmV3IHJlbG9jcyBmcm9tIGhwdXgxMC4KLQkoc29tX2hwcGFfaG93dG9fdGFibGUpOiBBZGQgaHB1eDEwIHJlbG9jcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX04wU0VMIGFuZCBSX04xU0VMIGhwdXgxMCByZWxvY3MuCi0KLU1vbiBGZWIgMjYgMTI6NTI6NDggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IHJlY2VudCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LCBhbmQKLQlydWxlcyB0byByZWJ1aWxkIC5oIGZpbGVzIHVzaW5nIGRvYy9jaGV3LgotCi1Nb24gRmViIDI2IDE0OjQ4OjM5IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQEFaU3Rhck5ldC5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkanVzdCB0aGUgZmlsZQotCXNpemUgZXZlbiBvZiBzZWN0aW9ucyB3aXRoIG5vIGNvbnRlbnRzLgotCi1Nb24gRmViIDI2IDE0OjAxOjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogV2hlbiBtZXJnaW5nLCBza2lwIG5hbWVzCi0Jc3RhcnRpbmcgd2l0aCAnJCcgdGhlIHdheSB3ZSBza2lwIG5hbWVzIHN0YXJ0aW5nIHdpdGggJy4nLiAgV2hlbgotCXVwZGF0aW5nIHhfZW5kbmR4LCBkb24ndCBiZSBmb29sZWQgYnkgYW4gaW5kZXggd2hpY2ggaGFzIGJlZW4KLQltZXJnZWQuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHRyeSB0byBvcHRpbWl6ZSBhCi0Jc3RydWN0L3VuaW9uL2VudW0gdHlwZSB3aXRoIG5vIGVsZW1lbnRzLgotCi1TYXQgRmViIDI0IDExOjM4OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9lcnJtc2cpOiBIYW5kbGUgYSBOVUxMIHJldHVybiBmcm9tIHN0cmVycm9yLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IElmIHRoZSBmaXJzdCBmaWxlIGluIHRoZQotCWFyY2hpdmUgY2FuIG5vdCBiZSByZWNvZ25pemVkIGFzIGFuIG9iamVjdCwgZG9uJ3QgYXNzdW1lIHRoYXQgdGhpcwotCWlzIHRoZSB3cm9uZyBmb3JtYXQuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZQotCWZvcm1hdCBpcyBub3QgYmZkX29iamVjdC4KLQkoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMjEgMTM6NTg6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IENvcnJlY3QgcmFuZ2Ugb2YgUl9TSF9VU0VTCi0JcmVsb2MuCi0KLVR1ZSBGZWIgMjAgMTY6MjI6NDQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAodGRhdGEpOiBBZGQgbmV0YnNkX2NvcmVfZGF0YS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBGZWIgMjAgMTY6NTA6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChTVU5PU19DT05TVFJVQ1RPUik6IERlZmluZS4KLQkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBsZXQgYSBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0Ci0Jb3ZlcnJpZGUgYSBjb25zdHJ1Y3RvciBzeW1ib2wuICBTZXQgU1VOT1NfQ09OU1RSVUNUT1Igd2hlbgotCWFwcHJvcHJpYXRlLgotCi0JKiBib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogVXNlIHVkYXRhLmkgcmF0aGVyIHRoYW4gZmxhZ3MKLQl0byBnZXQgdGhlIHN5bWJvbCBpbmRleCwgbWF0Y2hpbmcgMTQgSnVsIDk1IGNoYW5nZS4KLQotVHVlIEZlYiAyMCAwODoyNjoyNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCVJlbW92ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiBncC4KLQotTW9uIEZlYiAxOSAxMjozNzo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QKLQlhc3N1bWUgdGhhdCB3ZSBjYW4gc2V0IHRoZSBHUCB2YWx1ZSBhbmQgdGhlbiBnZXQgdGhlIHNhbWUgdmFsdWUsCi0Jc2luY2UgaXQgd29uJ3QgYmUgdHJ1ZSBpZiB0aGUgb3V0cHV0IGZpbGUgaXMgbmVpdGhlciBFTEYgbm9yCi0JRUNPRkYuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBEb24ndCBib3RoZXIgdG8gdXNlCi0JX2JmZF9nZXRfZ3BfdmFsdWUgaGVyZS4KLQkobWlwc19ncHJlbF9yZWxvYyk6IERvbid0IGFzc3VtZSB3ZSBjYW4gc2V0IGFuZCBnZXQgdGhlIEdQIHZhbHVlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9oaTE2X3JlbG9jKTogR2V0IGdwIHZhbHVlIGZyb20KLQltaXBzX2VsZl9maW5hbF9ncC4KLQkobWlwc19lbGZfbG8xNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9maW5hbF9ncCk6IEFkZCBwZ3AgcGFyYW1ldGVyLiAgU2V0IGl0IHRvIHRoZSBHUCB2YWx1ZS4KLQlEb24ndCByZXF1aXJlIHRoYXQgdGhlIEJGRCBiZSBFTEYuCi0JKG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBHZXQgZ3AgdmFsdWUgZnJvbSBtaXBzX2VsZl9maW5hbF9ncC4KLQkobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYXNzdW1lIHdlIGNhbiBzZXQgYW5kIGdldCB0aGUKLQlHUCB2YWx1ZS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgYm90aGVyIHRvIHVzZQotCV9iZmRfZ2V0X2dwX3ZhbHVlIGhlcmUuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSk6IEluaXRpYWxpemUgc3YuCi0JRG9uJ3QgY2hhbmdlIGVwZHIgYmV0d2VlbiBtYWxsb2MgYW5kIGZyZWUuICBCZSBjYXJlZnVsIG5vdCB0byBmcmVlCi0JTlVMTCBwb2ludGVycy4gIFplcm8gb3V0IHRoZSBmaXJzdCBSUERSLgotCi0JKiBjb25maWd1cmUuaG9zdDogT24gTGludXgsIG9ubHkgcGFzcyAtcnBhdGggb3B0aW9uIGlmICQobGliZGlyKQotCWlzIG5laXRoZXIgL2xpYiBub3IgL3Vzci9saWIuICBGcm9tIEFsYW4gTW9kcmEKLQk8YWxhbkBtdWxsZXQuTGV2ZWxzLlVuaVNBLkVkdS5BdT4uCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW5hbWUgZHRfbmVlZGVkX25hbWUgdG8KLQlkdF9uYW1lLgotCShlbGZfZHRfbmFtZSk6IFJlbmFtZSBmcm9tIGVsZl9kdF9uZWVkZWRfbmFtZS4KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IFVzZSBlbGZfZHRfbmFtZSwgbm90Ci0JZWxmX2R0X25lZWRlZF9uYW1lLgotCShiZmRfZWxmX2dldF9kdF9zb25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBlbGZfZHRfbmFtZSwgbm90Ci0JZWxmX2R0X25lZWRlZF9uYW1lLiAgU2F2ZSB0aGUgU09OQU1FIGJhY2sgaW4gZWxmX2R0X25hbWUuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIEZlYiAxOSAwMjo1MDoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWVkIGZyb20KLQlfYmZkX3NwYXJjX2VsZl9yZWxvY190eXBlX2xvb2t1cC4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFVwZGF0ZS4KLQkqIGVsZjY0LXNwYXJjLmMgKFNQQVJDNjRfT0xEX1JFTE9DUyk6IERlZmluZS4KLQkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBEZWZpbmUuCi0JKHNwYXJjX3JlbG9jX21hcCk6IERlZmluZS4KLQkoc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaW5mb190b19ob3d0byk6IFVzZSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZS4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVXBkYXRlLgotCi1TdW4gRmViIDE4IDE1OjAyOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IENoZWNrIGZvciAnZG8gbm90IG1peCcgZnJvbSBuYXRpdmUgbGlua2VyIGJlZm9yZQotCXRyeWluZyB0byB1c2UgLXJwYXRoLgotCi1GcmkgRmViIDE2IDEyOjQ2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKF9iZmRfZ2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX3NldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKF9iZmRfc2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBVc2UKLQlfYmZkX2dldF9ncF92YWx1ZSBhbmQgX2JmZF9zZXRfZ3BfdmFsdWUgcmF0aGVyIHRoYW4gcmVmZXJyaW5nCi0JZGlyZWN0bHkgdG8gdGhlIGZpZWxkcyBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24uCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2FkanVzdF9yZWxvY19pbik6IExpa2V3aXNlLgotCShtaXBzX2dwcmVsX3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9oaTE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZmluYWxfZ3ApOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGJvdXQuYyAoYl9vdXRfc2V0X2FyY2hfbWFjaCk6IFJlY29nbml6ZSBiZmRfbWFjaF9pOTYwX2p4LgotCi1UaHUgRmViIDE1IDExOjI5OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlIGNvbmZpZ3VyZS5ob3N0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBpbmZvcm1hdGlvbiB3aGljaCBhdXRvY29uZiBzaG91bGQKLQlmaWd1cmUgb3V0LCBuYW1lbHkgQ0MsIENGTEFHUywgTERGTEFHUywgQVIsIGFuZCBSQU5MSUIuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZW1vdmUgZ28zMiBhbmQgd2luMzIgaG9zdCBpbmZvcm1hdGlvbiwgc2luY2UgaXQKLQlzaG91bGQgbm8gbG9uZ2VyIGJlIG5lZWRlZC4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IElmIHdlIGhhdmUgYSAuZHluYW1pYyBzZWN0aW9uLAotCXRoZW4gc3RhcnQgYSBuZXcgc2VnbWVudCByYXRoZXIgdGhhbiBwdXQgYSB3cml0YWJsZSBzZWN0aW9uIGluIGEKLQlyZWFkb25seSBzZWdtZW50LgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IFJQQVRIX0VOVlZBUi4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQKLQl6ZXJvX3NlY3Rpb24gdmFyaWFibGUuCi0KLVRodSBGZWIgMTUgMTA6Mzk6MTcgMTk5NiAgSC5KLiBMdSAgPGhqbEB6b29tLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBSZW5hbWUgdGFyZ2V0IGZyb20gYmZkLWluMi5oLgotCSgkKHNyY2RpcikvbGliYmZkLmgpOiBSZW5hbWUgZnJvbSBsaWJiZmQuaC4KLQkoJChzcmNkaXIpL2xpYmNvZmYuaCk6IFJlbmFtZSBmcm9tIGxpYmNvZmYuaC4KLQotV2VkIEZlYiAxNCAxNjoyOTowNyAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfZXhwcmVzc2lvbik6IE9ubHkgdXNlIGFuIFIgdmFyaWFibGUgZm9yIGEKLQlsb2NhbCBzeW1ib2wuICBEb24ndCBvdXRwdXQgYSB6ZXJvIG9mZnNldC4gIEhhbmRsZSBhIHplcm8gYWRkcmVzcy4KLQkoU1JDX01BU0ssIFBDUkVMX09GRlNFVCk6IERlZmluZSBiYXNlZCBvbiBLRUVQTUlOVVNQQ0lOSU5TVC4KLQkocmVsMzJfaG93dG8sIHJlbDE2X2hvd3RvLCByZWw4X2hvd3RvKTogVXNlIFNSQ19NQVNLIGFuZAotCVBDUkVMX09GRlNFVC4KLQkocGFyc2VfZXhwcmVzc2lvbik6IERvbid0IHRyeSB0byBoYW5kbGUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgYQotCVAgdmFyaWFibGUuICBIYW5kbGUgSSB2YXJpYWJsZXMgZGlmZmVyZW50bHkgZnJvbSBYIHZhcmlhYmxlcy4gIEZpeAotCXRoZSBvcmRlciBvZiBtaW51cyBleHByZXNzaW9ucy4KLQkoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogR2VuZXJhdGUgYW4gSSB2YXJpYWJsZSBmb3IgYW4gTk4KLQlyZWNvcmQuICBGaXggaGFuZGxpbmcgb2YgQVRJIGFuZCBBVFggcmVjb3Jkcy4KLQkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IE9ubHkgc2V0IG1pbmltYWwgc2VjdGlvbiBhdHRyaWJ1dGVzLgotCUFkanVzdCB0aGVtIGxhdGVyLCBiYXNlZCBvbiB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQkoaWVlZV9vYmplY3RfcCk6IFJlYWQgaW4gdGhlIGZpbGUgdW50aWwganVzdCBhZnRlciB0aGUgTUUgcmVjb3JkLgotCUNhbGwgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgdG8gc2V0IHRoZSBzZWN0aW9uIGZsYWdzLgotCShkb19vbmUpOiBBZGQgaXRlcmF0aW9ucyBwYXJhbWV0ZXIuICBPbmx5IHJlcGVhdCB0aGUgZmlyc3QgbG9hZAotCWl0ZW0uICBTZXQgdGhlIHNlY3Rpb24gYW5kIGZpbGUgcmVsb2MgZmxhZ3MuCi0JKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogU2V0IHNlY3Rpb24gZmxhZ3MuICBQYXNzIGl0ZXJhdGlvbnMgdG8KLQlkb19vbmUuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogSGFuZGxlIEkgdmFyaWFibGVzLgotCShkb193aXRoX3JlbG9jcyk6IE9ubHkgZW1pdCByZWxvY2F0aW9uIHNpemUgd2hlbiBuZWNlc3NhcnkuCi0JSW5jcmVhc2UgTUFYUlVOIHRvIDEyNy4gIENoYW5nZSBvdiB0byBiZSBhc3NpZ25lZCwgYW5kIHRha2UKLQlzcmNfbWFzayBhbmQgcGNyZWxfb2Zmc2V0IGludG8gYWNjb3VudC4KLQkoaWVlZV93cml0ZV9kYXRhX3BhcnQpOiBTa2lwIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCBsb2FkZWQuCi0JKGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCk6IERvbid0IG91dHB1dCBvcHRpb25hbCBsYXN0IGVudHJ5IG9mIFdYCi0JcmVjb3Jkcy4KLQkoaWVlZV93cml0ZV9tZV9wYXJ0KTogTWFrZSBzZXR0aW5nIG9mIG1lX3JlY29yZCBuZWF0ZXIuCi0JKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogR2V0IHRoZSBzaXplIG9mIGFuIGFyY2hpdmUgZWxlbWVudC4KLQotCSogc3ltcy5jIChzdHQpOiBBZGQgZW50cmllcyBmb3IgemVyb3ZhcnMsIHZhcnMsIGFuZCBjb2RlLgotCi0JKiBlbGZjb2RlLmggKHZhbGlkYXRlX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkod3JpdGVfcmVsb2NzKTogQ2FsbCB2YWxpZGF0ZV9yZWxvYyBmb3Igbm9uIEVMRiByZWxvY3MuCi0KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoVEFSR0VUX0JJR19TWU0pOiBVc2UgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIuCi0JKFRBUkdFVF9MSVRUTEVfU1lNKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1wc29zKik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBGZWIgMTMgMTU6NTY6MjIgMTk5NiAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBzbmFrZS5jcy51dGFoLmVkdT4KLQotCSogaTM4Nm1zZG9zLmM6IFJlbW92ZSBzb21lICNpZiAwIGNvZGUuCi0JKG1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGluY2x1ZGUgZW1wdHkgc2VjdGlvbnMgaW4gdGhlCi0Jc2l6ZSBjb21wdXRhdGlvbiwgcmVnYXJkbGVzcyBvZiB0aGVpciBhZGRyZXNzLgotCi1UdWUgRmViIDEzIDE1OjM2OjM3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHNlZ2ZhdWx0IGlmIGR5bmJvagotCWlzIE5VTEwsIGllLCB0aGUgLXIgc3dpdGNoIGlzIHVzZWQuCi0KLVR1ZSBGZWIgMTMgMTQ6MzU6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik6IERlZmluZS4KLQkoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpOiBEZWZpbmUuCi0JKEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBNYXAgbmV3IHJlbG9jcy4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0KLQkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBDaGVjayB0cyBhZ2FpbnN0ICQoU0hMSUIpLCBub3QKLQkkKFNITElOSykuCi0KLQkqIGllZWUuYyAoZ2V0X3N5bWJvbCk6IFNldCB0aGUgc2VjdGlvbiB0byBiZmRfYWJzX3NlY3Rpb24uCi0JKGRvX3dpdGhfcmVsb2NzKTogSWYgRVhFQ19QIGlzIHNldCBhbmQgdGhlcmUgYXJlIG5vIHJlbG9jcywgdXNlIGEKLQlzaW1wbGUgbnVtYmVyIGZvciB0aGUgc2VjdGlvbiBhZGRyZXNzLCByYXRoZXIgdGhhbiBhbiBleHByZXNzaW9uLgotCUxpbWl0IHRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiByZWxvY3MgdG8gTUFYUlVOLgotCShpZWVlX3dyaXRlX21lX3BhcnQpOiBTZXQgbWVfcmVjb3JkIHRvIHRoZSBmaWxlIG9mZnNldCBhZnRlciB0aGUKLQlzdGFydCBhZGRyZXNzLgotCShpZWVlX3dyaXRlX3Byb2Nlc3Nvcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIGllZWVfd3JpdGVfcHJvY2Vzc29yLgotCi1GcmkgRmViICA5IDEwOjUzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSAke0NDLWdjY30gd2hlbiB0ZXN0aW5nIGZvciAtcnBhdGggb24gU3VuT1MuCi0KLQkqIGNvZmYtYXV4LmM6IENoYW5nZSBpbmNsdWRlIG9mIGF1eC5oIHRvIGF1eC1jb2ZmLmguCi0KLVRodSBGZWIgIDggMTQ6MDE6MDMgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBhIFJfNjhLX1JFTEFUSVZFCi0JcmVsb2NhdGlvbiBwdXQgdGhlIGFkZGVuZCBib3RoIGluIHRoZSByZWxvYyBlbnRyeSBhbmQgdGhlIGRhdGEuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLiAgTWFzayBvdXQgbWFya2VyIGluCi0JR09UIG9mZnNldCB2YWx1ZS4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgcmVzb2x2ZQotCWEgUl82OEtfUEN4eCByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBnbG9iYWwgc3ltYm9sIGRpcmVjdGx5LgotCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBEb24ndCBjb3VudCBzdWNoIGEgcmVsb2MuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogRG9uJ3QgcmVjb3JkIGEgc3ltYm9sIHdpdGgKLQlhIFBMVHh4IHJlbG9jIGFzIGR5bmFtaWMuICBEaXNhbGxvdyBQTFR4eE8gcmVsb2MgYWdhaW5zdCBhIGxvY2FsCi0Jc3ltYm9sIGZvciBub3csIG90aGVyd2lzZSBhbHdheXMgcmVjb3JkIHRoZSBzeW1ib2wgYXMgZHluYW1pYy4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgd2l0aCBhIFBMVHh4IHJlbG9jCi0JaXMgbm90IHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEKLQlzaGFyZWQgb2JqZWN0LCB0aGVuIGRvbid0IG1ha2UgYSBQTFQgZW50cnkuICBJZiB3ZSBkbyBtYWtlIGEgUExUCi0JZW50cnksIG1ha2Ugc3VyZSB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlY29yZGVkIGFzIGR5bmFtaWMuCi0KLVdlZCBGZWIgIDcgMTM6NTY6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSwgc2V0IEhMREZMQUdTIHRvCi0JcGFzcyBhbiBhcHByb3ByaWF0ZSAtcnBhdGggb3B0aW9uLiAgVXNlIHRoZSBtYWtlIHZhcmlhYmxlIFNPTkFNRQotCWFzIHRoZSBzaGFyZWQgbGlicmFyeSBzb25hbWUsIHJhdGhlciB0aGFuIGNvbXB1dGluZyBpdCBoZXJlLiAgT24KLQlTdW5PUywgYnVpbGQgc3RhbXAtdHNobGluayBpbiBwbGFjZSBvZiAkKFNITElOSykuCi0JKiBNYWtlZmlsZS5pbiAoU09OQU1FKTogTmV3IHZhcmlhYmxlLgotCSgkKFNITElOSykpOiBNYWtlIGEgbGluayB0byB0aGUgdHJhbnNmb3JtZWQgbmFtZSwgYXMgd2VsbC4KLQkoc3RhbXAtdHNobGluayk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBTa2lwIHN0YW1wLXRzaGxpbmsgZHVyaW5nIGluc3RhbGwuCi0KLVdlZCBGZWIgIDcgMTM6Mzc6MzkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEbyBub3QgYXNzdW1lIHRoYXQgdGhlCi0JbGlua2VyIHNlY3Rpb25zIGhhdmUgYmVlbiBzZXQgdXAgeWV0LgotCi0JKiBlbGYuYyAobWFrZV9tYXBwaW5nKTogQWRkIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gc3VwcHJlc3MKLQltYWtpbmcgdGhlIGZpcnN0IHNlY3Rpb24gaW5jbHVkZSB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiB0aGUgdXNlciB1c2VkIC1UdGV4dCBzdWNoIHRoYXQgdGhlCi0JcHJvZ3JhbSBoZWFkZXJzIGFyZSBvbiBhIGRpZmZlcmVudCBwYWdlLCBkbyBub3Qgc2V0IHRoZSBmbGFncwotCXNheWluZyB0aGF0IHRoaXMgc2VjdGlvbiBpbmNsdWRlcyB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotCi1UdWUgRmViICA2IDE0OjA0OjQ5IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotbmV0YnNkKik6IFNldCBDT1JFRklMRSB0byBuZXRic2QtY29yZS5jLgotCWRvbid0IGRlZmluZSBUUkFEX0hFQURFUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbmV0YnNkLWNvcmUuYzogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIE5ldEJTRCBjb3JlIGZpbGVzLgotCSogaG9zdHMvKm5ic2QuaDogUmVtb3ZlZC4KLQotVHVlIEZlYiAgNiAxMTo0Nzo0OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1NQQVJDX1s1NjddKTogTmV3IHJlbG9jIHR5cGVzLgotCShCRkRfUkVMT0NfU1BBUkNfTE83IHJlbG9jIHR5cGUpOiBEZWxldGVkLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZWQgZnJvbQotCWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAuCi0JKHJlbG9jX3R5cGV7LF9uYW1lc30pOiBEZWxldGVkLgotCShfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfc3BhcmNfaG93dG9fdGFibGUuCi0JQWRkIHNwYXJjNjQgcmVsb2NzLgotCShzcGFyY19yZWxvY19tYXApOiBBZGQgc3BhcmM2NCByZWxvY3MuCi0JKHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSBSX1NQQVJDX1dESVNQezE2LDE5fS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfd2Rpc3AxNl9yZWxvYyk6IERlbGV0ZWQuCi0JKHJlbG9jX3R5cGV7LF9uYW1lc30pOiBEZWxldGVkLgotCShlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEZWxldGVkLgotCShzcGFyY19yZWxvY19tYXApOiBEZWxldGVkLgotCShfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfc3BhcmNfaG93dG9fdGFibGUuCi0JKGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBDaGFuZ2UgZnJvbSBmdW5jdGlvbiB0byAjZGVmaW5lLgotCi1UdWUgRmViICA2IDEyOjEyOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IE1ha2UgU0hMSUJfQ0ZMQUdTIGluY2x1ZGUgJChQSUNGTEFHKSBvbiBhCi0JKi0qLWhwdXgqIGhvc3QuCi0KLQkqIE1ha2VmaWxlLmluIChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogTmV3IHZhcmlhYmxlLgotCShpbnN0YWxsKTogVHJhbnNmb3JtIGxpYnJhcnkgbmFtZSBiZWZvcmUgaW5zdGFsbGluZyBpdC4KLQotTW9uIEZlYiAgNSAxMDozODoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2k5NjBfaHgpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjcHUtaTk2MC5jIChzY2FuXzk2MF9tYWNoKTogQWNjZXB0IG1hY2hpbmUgImh4Ii4KLQkoTUFUUklYKTogRXhwYW5kIGVudHJpZXMgZm9yIEhYLgotCShhcmNoX2luZm9fc3RydWN0KTogQWRkIGk5NjA6aHggZW50cnkuCi0JKiBib3V0LmMgKGJfb3V0X3NldF9hcmNoX21hY2gpOiBIYW5kbGUgYmZkX21hY2hfaTk2MF9oeC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogSGFuZGxlIEZfSTk2MEhYLgotCShjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfbWFjaF9pOTYwX2h4LgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYXMgYSBzaGFyZWQgbGlicmFyeSwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tCi0JQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3Igc2hhcmVkIGFuZCBjb21tb25iZmRsaWIuCi0JTmV3IHN1YnN0aXR1dGlvbnM6IEFMTExJQlMsIFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywKLQlTSExJQl9DRkxBR1MsIENPTU1PTl9TSExJQiwgUElDTElTVCwgU0hMSU5LLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IElmIC0tZW5hYmxlLXNoYXJlZCwgYWRqdXN0IHNoYXJlZCBsaWJyYXJ5IHN0dWZmCi0JYmFzZWQgb24gdGhlIGhvc3QuICBJZiB0aGUgaG9zdCBpcyBTdW5PUywgYW5kIHRoZSBsaW5rZXIgc3VwcG9ydHMKLQktcnBhdGgsIHNldCBITERGTEFHUyB0byB1c2UgaXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoUElDRkxBRywgU0hMSUIsIFNITElCX0NDLCBTSExJQl9DRkxBR1MpOiBOZXcgdmFyaWFibGVzLgotCShDT01NT05fU0hMSUIsIFNITElOSyk6IE5ldyB2YXJpYWJsZXMuCi0JKC5jLm8pOiBJZiBQSUNGTEFHIGlzIHNldCwgY29tcGlsZSB0d2ljZSwgb25jZSBQSUMsIG9uY2Ugbm9ybWFsLgotCShTVEFHRVNUVUZGKTogUmVtb3ZlIHZhcmlhYmxlLgotCShhbGwpOiBEZXBlbmQgdXBvbiAkKEFMTExJQlMpIGFuZCBAUElDTElTVEAgcmF0aGVyIHRoYW4KLQkkKFRBUkdFVExJQikuCi0JKHN0YW1wLW9maWxlcyk6IE5ldyB0YXJnZXQsIGxpa2Ugb2xkIG9maWxlcyB0YXJnZXQsIGJ1dCBidWlsZAotCXVzaW5nIGEgdGVtcG9yYXJ5IGZpbGUgYW5kIG1vdmUtaWYtY2hhbmdlLCBhbmQgdG91Y2ggc3RhbXAtb2ZpbGVzCi0Jd2hlbiBkb25lLgotCShvZmlsZXMpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLW9maWxlcy4KLQkoc3RhbXAtcGljbGlzdCwgcGljbGlzdCk6IE5ldyB0YXJnZXRzLgotCSgkKFNITElCKSwgJChTSExJTkspKTogTmV3IHRhcmdldHMuCi0JKHRhcmdldHMubywgYXJjaHVyZXMubyk6IEJ1aWxkIHR3aWNlIGlmIFBJQ0ZMQUcgaXMgc2V0LgotCShkb19tb3N0bHljbGVhbik6IFJlbW92ZSBwaWMvKi5vLgotCShkb19jbGVhbik6IFJlbW92ZSBzdGFtcC1vZmlsZXMsICQoU0hMSUIpLCAkKFNITElOSyksIHBpY2xpc3QsIGFuZAotCXN0YW1wLXBpY2xpc3QuCi0JKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBwaWMgYW5kIHN0YW1wLXBpY2Rpci4KLQkoaW5zdGFsbCk6IEluc3RhbGwgc2hhcmVkIGxpYnJhcmllcy4KLQkoJChPRklMRVMpKTogRGVwZW5kIHVwb24gc3RhbXAtcGljZGlyLgotCShzdGFtcC1waWNkaXIpOiBOZXcgdGFyZ2V0LgotCi0JKiBsaWJjb2ZmLWluLmg6IEFkZCBjb21tZW50IHJlbWluZGluZyBwZW9wbGUgdGhhdCBsaWJjb2ZmLmggaXMgYQotCWdlbmVyYXRlZCBmaWxlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCB0cnkgdG8gZ2V0IHRoZQotCWZsYXZvdXIgb2YgYSBzZWN0aW9uIHdpdGggbm8gb3duZXIuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDbGVhcgotCUVMRl9MSU5LX05PTl9FTEYgZmxhZy4KLQkobWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGVsZi5jOiBSZXZlcnQgbGFzdCBjaGFuZ2UsIHNpbmNlIGl0IGJyZWFrcyBkeW5hbWljIGxpbmtpbmcuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIHdhbnRfaGRyX2luX3NlZwotCWZpZWxkLgotCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF93YW50X2hkcl9pbl9zZWcpOiBEb24ndCBkZWZpbmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRG9uJ3QgZGVmaW5lLgotCShlbGZOTl9iZWQpOiBEb24ndCBpbml0aWFsaXplIHdhbnRfaGRyX2luX3NlZyBmaWVsZC4KLQotU3VuIEZlYiAgNCAyMDo0NToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgdGhlIGJhY2tlbmQgZG9lcwotCW5vdCB3YW50IHRoZSBlbGYgaGVhZGVyIG9yIHRoZSBwcm9ncmFtIGhlYWRlcnMgaW4gdGhlIGFkZHJlc3MKLQlzcGFjZSwgZG8gbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FsY3VsYXRpb25zLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IE5ldyBob29rCi0JZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgYWRkaXRpb25hbCBwcm9ncmFtIGhlYWRlcnMuCi0JKHBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwKTogRGVmaW5lIGFzIGEgTk9QIGZ1bmN0aW9uIGZvciBub3cuCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogLnNkYXRhMiBpcyBhIHJlYWQtb25seSBzZWN0aW9uLgotCi1TYXQgRmViICAzIDIzOjAwOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaDogTW92ZSB0b2RheSdzIGxpYmNvZmYuaCBjaGFuZ2UgaW50byBjb2ZmY29kZS5oLgotCi1TYXQgRmViICAzIDE1OjQzOjQ0IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLmggKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBDb21iaW5lIG1hY3JvIGFyZ3MKLQliYWNrIGludG8gb25lIGxpbmUuICBTb21lIGNvbXBpbGVycyAoc3Vub3MgNC4xLjMgZm9yIGV4YW1wbGUpCi0Jd29uJ3QgYWNjZXB0IGFyZ3Mgc3BsaXQgYWNyb3NzIG1vcmUgdGhhbiBvbmUgbGluZS4KLQotRnJpIEZlYiAgMiAxMTo0MjoxNSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChCRkRfQklOQVJZX0ZPUEVOKTogVW5kZXJzdGFuZCBjeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotRnJpIEZlYiAgMiAxMjoxMjoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogRG9uJ3QKLQl0cnkgdG8gZG8gYXJpdGhtZXRpYyBvbiBhIHZvaWQgKiwgY2FzdCBpdCB0byBhIHVuc2lnbmVkIGNoYXIgKiBmaXJzdC4KLQotVGh1IEZlYiAgMSAxNjowNDowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoRUxGX0xJTktfTk9OX0VMRik6IERlZmluZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFNldCBlbGZfbGlua19oYXNoX2ZsYWdzIHRvCi0JRUxGX0xJTktfTk9OX0VMRi4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogUmVzZXQgRUxGX0xJTktfTk9OX0VMRgotCWZsYWcgZm9yIGEgbmV3bHkgZGVmaW5lZCBzeW1ib2wuCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IExpa2V3aXNlLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgRUxGX0xJTktfTk9OX0VMRiBpcyBzZXQsIHRyeSB0bwotCXNldCB0aGUgREVGIG9yIFJFRl9SRUdVTEFSIGZsYWdzIGNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW4gKGJmZC1pbjIuaCk6IE1ha2UgYmZkLmgsIG5vdCBwcm90b3MsIGluIGRvY2Rpci4KLQkobGliYmZkLmgsIGxpYmNvZmYuaCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IHJlY29yZCBhIHN5bWJvbCB3aXRoCi0JYSBQTFQzMiByZWxvYyBhcyBkeW5hbWljLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCB3aXRoIGEgUExUMzIgcmVsb2MKLQlpcyBub3QgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgYXJlIG5vdCBtYWtpbmcgYQotCXNoYXJlZCBvYmplY3QsIHRoZW4gZG9uJ3QgbWFrZSBhIFBMVCBlbnRyeS4gIElmIHdlIGRvIG1ha2UgYSBQTFQKLQllbnRyeSwgbWFrZSBzdXJlIHRoZSBzeW1ib2wgaGFzIGJlZW4gcmVjb3JkZWQgYXMgZHluYW1pYy4KLQotV2VkIEphbiAzMSAxNzoyMzozMiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIEJGRF9SRUxPQ18zMl9QQ1JFTC4KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotd2luMzIpOiBCZWNvbWVzIGlbMzQ1XTg2LSotY3lnd2luMzIuCi0JKHBvd2VycGNsZS0qLWN5Z3dpbjMyKTogTmV3LgotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IEdldCBhZGRyZXNzIGZyb20gdm1hLgotCi1XZWQgSmFuIDMxIDE2OjIzOjU3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBJZiB0aGUgc3ltYm9sCi0JYXR0YWNoZWQgdG8gdGhlIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGFuIHVuZGVmaW5lZAotCXN5bWJvbCwgdHJlYXQgaXQgYXMgaWYgaXQgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQuCi0KLVdlZCBKYW4gMzEgMTY6MTY6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IG91dHB1dCBpbml0aWFsIGR1bW15Ci0Jc3ltYm9sIG9yIHNlY3Rpb24gc3ltYm9scyBpZiBzdHJpcHBpbmcgYWxsIHN5bWJvbHMgYW5kIHRoaXMgaXMgbm90Ci0JYSByZWxvY2F0ZWFibGUgbGluay4gIERvbid0IG91dHB1dCB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZSBpZgotCXRoZXJlIGFyZSBubyBzeW1ib2xzLgotCShlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZXJlIGFyZSBubwotCXN5bWJvbHMgdG8gZmx1c2guCi0KLVdlZCBKYW4gMzEgMTI6NTU6NDkgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvZmYtYXV4LmM6IE5ldyBmaWxlLgotCSogaG9zdHMvbTY4a2F1eC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKG02OCotYXBwbGUtYXV4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKG02OCotYXBwbGUtYXV4Kik6IE5ldyBuYXRpdmUgaG9zdC4KLQkobTY4a2F1eF9jb2ZmX3ZlYyk6IE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKG02OGthdXhfY29mZl92ZWMpOiBEZWNsYXJlLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkCi0JX2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBEZWZpbmUuCi0JKGNvbXBhcmVfYXJlbGVudF9wdHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmIFRBUkdfQVVYLgotCShjb2ZmX3dyaXRlX3JlbG9jcyk6IElmIFRBUkdfQVVYLCBzb3J0IHRoZSByZWxvY3MuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IEEvVVggYW91dGhkciBtYWdpYyBudW1iZXIuCi0JKGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENhbGwKLQliZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIHJhdGhlciB0aGFuCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKiBjb2ZmLW02OGsuYyAoQ09GRl9QQUdFX1NJWkUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWF1eC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgY29mZi1hdXguYy4KLQotV2VkIEphbiAzMSAxMTozNzo0NiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogRml4IFJfNjhLX0dPVCoKLQlyZWxvY2F0aW9uOyBpZ25vcmUgYWRkZW5kIHdpdGggUl82OEtfe0dPVCxQTFR9Kk8gcmVsb2NhdGlvbi4KLQotVHVlIEphbiAzMCAxMjowOTowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkb19tYWludGFpbmVyX2NsZWFuKTogUmVtb3ZlICQoc3JjZGlyKS9iZmQtaW4yLmgsCi0JJChzcmNkaXIpL2xpYmJmZC5oIGFuZCAkKHNyY2RpcikvbGliY29mZi5oLgotCShtYWludGFpbmVyLWNsZWFuKTogV2FybiBhYm91dCBkZWxldGluZyBzcGVjaWFsIGZpbGVzLgotCShiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBOZXcgdGFyZ2V0cy4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgaW5kaXJlY3QgYW5kCi0Jd2FybmluZyBzeW1ib2xzIGNvcnJlY3RseS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IEFkZCBjYXN0cyB0byBhdm9pZAotCXdhcm5pbmdzLgotCi1Nb24gSmFuIDI5IDE0OjI3OjI0IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmg6IGFsaWduZWQgbmV3bHkgZXhwb3J0ZWQgbmFtZXMgd2l0aCBiZmQgbmFtaW5nCi0JY29udmVudGlvbnMuIFJlbW92ZWQgYW4gZXJyb25lb3VzIGRlZmluZSBvZiBQT1dFUlBDX0xFX1BFLgotIAkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMsIGNvZmYtcHBjLmM6IHRoZSBhYm92ZSBmdW5jdGlvbiBuYW1lIGNoYW5nZXMKLQotTW9uIEphbiAyOSAxMzowNjoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEJhc2ltIEthZGhpbSA8a2FkaGltQHNwb2NrLmNzLmNvbG9yYWRvLmVkdT46Ci0JKiBlY29mZi5jIChzdHJ1Y3QgZXh0c3ltX2luZm8pOiBEZWZpbmUuCi0JKF9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBQYXNzIGEgcG9pbnRlciB0byBzdHJ1Y3QgZXh0c3ltX2luZm8KLQl0byBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogQWNjZXB0IGEgc3RydWN0IGV4dHN5bV9pbmZvIHBvaW50ZXIuCi0JU3RyaXAgc3ltYm9scyB3aGVuIGFwcHJvcHJpYXRlLgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBzeW1zLmMgKEJTRl9PQkpFQ1QpOiBEZWZpbmUuCi0JKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBQcmludCAnTycgZm9yIEJTRl9PQkpFQ1QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQlNGX09CSkVDVCBmb3IgYW4KLQlTVFRfT0JKRUNUIHN5bWJvbC4KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogT25seSBzZXQgdHlwZSB0byBTVFRfT0JKRUNUIGlmIEJTRl9PQkpFQ1QKLQlpcyBzZXQuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIHdoZW4KLQljb3B5aW5nIHJlbG9jcyBpbnRvIGEgc2hhcmVkIG9iamVjdCwgdHJlYXQgYSBkZWZpbmVkIGdsb2JhbCBzeW1ib2wKLQlhcyBhIGxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBzZXQgd2Vha2RlZiB0byBhCi0JcmVhbCBkZWZpbmVkIHN5bWJvbCwgbm90IHRvIGEgd2VhayBkZWZpbmVkIHN5bWJvbC4KLQotTW9uIEphbiAyOSAxMTozNDozNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYzogcmVtb3ZlZCB0aGUgUE9XRVJQQ19MRV9QRSBoYWNrLCBwcm9tb3RlZCBzb21lIHR5cGVzCi0JYW5kIG1hZGUgYSBmZXcgc3RhdGljIGZ1bmN0aW9ucyBleHRlcm5zLgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IG5ldyBmdW5jdGlvbiwgcmVwbGFjZXMgdGhlCi0JUE9XRVJQQ19MRV9QRSBoYWNrIGluIGNvZmZsaW5rLgotCi0JKiBsaWJjb2ZmLWluLmg6IHByb21vdGVkIHRoZSBmb2xsb3dpbmcgZnJvbSBjb2ZmbGluay5jIHRvIGFsbG93Ci0JX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgdG8gYmUgb3ZlcnJpZGRlbiAtICBTVFJJTkdfU0laRV9TSVpFLAotCWNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCwgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSwKLQljb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnksIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZSwKLQljb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCwgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlLAotCWNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAsIGNvZmZfbGlua19zZWN0aW9uX2luZm8sCi0JY29mZl9maW5hbF9saW5rX2luZm8sIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jLAotCWNvZmZfd3JpdGVfZ2xvYmFsX3N5bSwgY29mZl9saW5rX2lucHV0X2JmZCwgY29mZl9yZWxvY19saW5rX29yZGVyLgotCi0JKiBsaWJjb2ZmLmg6IHJlLWdlbidkCi0KLUZyaSBKYW4gMjYgMTg6MzM6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmM6IEluY2x1ZGUgImJmZGxpbmsuaCIuCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IERlZmluZS4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxpbmVfaW5mbyBmaWVsZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFRyeSBjYWxsaW5nCi0JX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgYmVmb3JlIHNlYXJjaGluZyB0aGUgRUxGCi0Jc3ltYm9sIHRhYmxlLiAgRmluZCB0aGUgY2xvc2VzdCBTVFRfRlVOQyBzeW1ib2wsIG5vdCB0aGUgbGFzdCBvbmUuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZGF0YV90eXBlKTogQWRkIGxpbmVfaW5mbyBmaWVsZC4KLSAJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBUcnkgY2FsbGluZwotCV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIGJlZm9yZSBzZWFyY2hpbmcgdGhlIENPRkYKLQlzeW1ib2wgdGFibGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLUZyaSBKYW4gMjYgMTY6MTE6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAoUl9QUENfRU1CX1NEQTIxIHJlbG9jYXRpb25zKTogTWFrZSByZWxvY2F0aW9uIHNpemUKLQk0IGJ5dGVzLCBzbyB3ZSBnZXQgdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiB1cGRhdGluZyB0aGUgcmVnaXN0ZXIKLQlmaWVsZCBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLVRodSBKYW4gMjUgMTI6MTQ6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IFJlbW92ZSB0b2Nfc2VjdGlvbiBhbmQKLQllbnRyeV9zZWN0aW9uIGZpZWxkcy4gIEFkZCBzbnRvYyBhbmQgc25lbnRyeSBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIHNudG9jIGFuZCBzbmVudHJ5LAotCW5vdCB0b2Nfc2VjdGlvbiBhbmQgZW50cnlfc2VjdGlvbiAodGhlIENPRkYgZmlsZSBkb2VzIG5vdCBoYXZlIGFueQotCXNlY3Rpb25zIGF0IHRoaXMgcG9pbnQpLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBvX3NuZW50cnkgYW5kIG9fc250b2MgZnJvbQotCXNuZW50cnkgYW5kIHNudG9jIHJhdGhlciB0aGFuIGVudHJ5X3NlY3Rpb24gYW5kIHRvY19zZWN0aW9uLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBzbnRvYyBhbmQKLQlzbmVudHJ5LCBub3QgdG9jX3NlY3Rpb24gYW5kIGVudHJ5X3NlY3Rpb24uCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldAotCWVudHJ5X3NlY3Rpb24gZnJvbSBoZW50cnkuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgYSBkZWZpbmVkIHN5bWJvbCBoYXMgWENPRkZfRU5UUlkgc2V0LAotCXNldCBzbmVudHkuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2V0IHNudG9jLCBub3QgdG9jX3NlY3Rpb24uCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBHZXQgdG9jX3NlY3Rpb24gZnJvbSBzbnRvYywgcmF0aGVyCi0JdGhhbiB1c2luZyB0b2Nfc2VjdGlvbiBkaXJlY3RseS4KLQotCSogYXJjaHVyZXMuYzogQWRkIG1pc3NpbmcgYC4nIGluIGVudW0gYmZkX2FyY2hpdGVjdHVyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1zY28qZWxmKik6IFVzZSBiZmRfZWxmMzJfaTM4Nl92ZWMuICBGcm9tCi0JUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotVGh1IEphbiAyNSAxMjowODo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCAucmVsYS5zZGF0YXssMn0KLQl0byBzZWN0aW9ucyB3ZSBhbGxvY2F0ZS4gIFVzZSBiZmRfemFsbG9jIHRvIGFsbG9jYXRlIGluaXRpYWxpYWwKLQlzZWN0aW9ucywgbm90IGJmZF9hbGxvYy4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgQkZEX0FTU0VSVHMgZm9yICFzaGFyZWQgZnJvbQotCVNEQXssMn1JMTYgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogVXNlIHRoZSB2YWx1ZSBvZiAtRyBubiB0byBkZXRlcm1pbmUKLQl3aGV0aGVyIHRvIHB1dCBzb21ldGhpbmcgaW4gLnNic3Mgb3Igbm90LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgc3VwcG9ydCBmb3IgbW9yZSByZWxvY2F0aW9ucy4gIEFkZAotCWluIHNlYy0+b3V0cHV0X29mZnNldCB3aGVyZSBhcHByb3ByaWF0ZS4gIE1ha2UgZXJyb3IgbWVzc2FnZXMKLQlpbmNsdWRlIHRoZSBzeW1ib2wgbmFtZS4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBMb29rdXAgc3ltYm9sIGJlZm9yZQotCXRyeWluZyB0byBhZGQgaXQgdG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gX0dMT0JBTF9PRkZTRVRfVEFCTEVfCi0JZG9lc24ndCBnZXQgcmVkZWZpbmVkIG1lc3NhZ2VzIGlmIC1zaGFyZWQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKSBPbmx5IGJ1bXAgUkVMQQotCXNlY3Rpb24gaWYgdGhlIHJlbF9zZWN0aW9uIGZpZWxkIGhhcyBiZWVuIHNldCB1cC4KLQotV2VkIEphbiAyNCAyMDo0MDoyNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwbyBpbiBlYWJpCi0JcmVsb2NhdGlvbnMuCi0KLVdlZCBKYW4gMjQgMTA6Mzg6MzQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWxldGUgY2hlY2tpbmcKLQlvZiBmbGFncywgb25seSBmbGFncyB1c2VkIGFyZSBjb250cm9sbGVkIGJ5IG1hY2ggbnVtYmVyLiAgQnVtcCB1cAotCW91dHB1dCBmaWxlIG1hY2ggbnVtYmVyIHRvIGhpZ2hlc3Qgb2YgaW5wdXQgZmlsZSBtYWNoIG51bWJlcnMuCi0JKGVsZjMyX3NwYXJjX29iamVjdF9wKTogV2F0Y2ggZm9yIEVGX1NQQVJDX1NVTl9VUzEuCi0JKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBTZXQgRUZfU1BBUkNfU1VOX1VTMSBpZiB2OHBsdXNhLgotCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LSote3N5c3Y0Kixzb2xhcmlzMip9KTogQ29tbWVudCBvdXQKLQliZmRfZWxmNjRfc3BhcmNfdmVjIHN1cHBvcnQuCi0KLVR1ZSBKYW4gMjMgMTQ6MzM6MDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCBjb21wbGFpbiBpZgotCXRoZSBlbWJlZGRlZCBiaXQgaXMgc2V0IG9uIHNvbWUgb2JqZWN0cyBhbmQgbm90IG9uIG90aGVycy4gIEp1c3QKLQlvciBpdCB0b2dldGhlci4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSW1wbGVtZW50IFJfUFBDX0VNQl97U0RBMjEsUkVMU0RBfQotCXJlbG9jYXRpb25zLgotCi1UdWUgSmFuIDIzIDE0OjIyOjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRG9uJ3QgdHJ5IHRvIGFsaWduIHRoZQotCS5zdGFic3RyIHNlY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBGaXggdGhlIGhhbmRsaW5nIG9mIHRoZQotCS5saWIgc2VjdGlvbiB0byB3b3JrIGV2ZW4gaWYgdGhlIGVudGlyZSBzZWN0aW9uIGNvbnRlbnRzIGFyZQotCXdyaXR0ZW4gYXQgb25jZS4gIEZyb20gR3ZyYW4gVWRkZWJvcmcgPGd2cmFuQHVkZGVib3JnLnBwLnNlPiBhbmQKLQlSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgotCi1Nb24gSmFuIDIyIDE4OjQ1OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEb24ndCBhbGxvY2F0ZQotCW1lbW9yeSBoZXJlIGZvciBjb250ZW50cy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEJ1bXAgdXAgX1NEQV9CQVNFXyBhbmQKLQlfU0RBMl9CQVNFXyBieSAzMjc2OC4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiAjaWYgb3V0IFBMVCBjb2RlIHdoaWNoIHdlIGhhdmVuJ3QKLQlzdGFydGVkIHVzaW5nLiAgQWxsb2NhdGUgY29udGVudHMgZm9yIC5zZGF0YSBhbmQgLnNkYXRhMiBzZWN0aW9ucwotCWFsc28uCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVXNlIGJmZF9nZXRfc2VjdGlvbl9uYW1lIGluIGRlYnVnIG1lc3NhZ2UsCi0JcmF0aGVyIHRoYW4gX25hbWUuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogUmVtb3ZlIGNvZGUgdGhhdCBhdHRlbXB0ZWQgdG8KLQlzaXplIF9TREF7LDJ9X0JBU0VfLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGFuZ2UgaG93IHNkYXRheywyfSByZWxvY2F0aW9ucyBhcmUKLQlkb25lLgotCi1Nb24gSmFuIDIyIDA4OjUyOjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IEZpeCB0eXBvLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY192OSk6IFJlbmFtZWQgZnJvbSBiZmRfbWFjaF9zcGFyYzY0LgotCShiZmRfbWFjaF9zcGFyY197djhwbHVzLHY4cGx1c2F9KTogRGVmaW5lLgotCShiZmRfbWFjaF9zcGFyY192OWEpOiBEZWZpbmUuCi0JKGJmZF9tYWNoX3NwYXJjX3Y5X3ApOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogYW91dHguaCAoYW91dCxtYWNoaW5lX3R5cGUpOiBiZmRfbWFjaF9zcGFyYzY0IHJlbmFtZWQgdG8KLQliZmRfbWFjaF9zcGFyY192OS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX29iamVjdF9wKTogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LSotc3lzdjQqLHNwYXJjNjQtKi1zb2xhcmlzMiopOiBTZXQgdGFyZ19kZWZ2ZWMKLQl0byBiZmRfZWxmMzJfc3BhcmNfdmVjLgotCSogY3B1LXNwYXJjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBSZW5hbWVkIGZyb20gc3BhcmNfYXJjaF9pbmZvLgotCUFkZCB2OHBsdXN7LGF9IHN1cHBvcnQuCi0JQWRkIHY5YSBzdXBwb3J0LgotCShzcGFyY19jb21wYXRpYmxlKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItc3BhcmMuaDogI2luY2x1ZGUgImVsZi9zcGFyYy5oIi4KLQkoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgZWxmMzJfc3BhcmNfb2JqZWN0X3AsCi0JZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCi0JZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQotTW9uIEphbiAyMiAxMToyMTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQKLQlsaW5rZXJfc2VjdGlvbl9wb2ludGVyIGZpZWxkLgotCShlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtKTogRW51bWVyYXRpb24gZm9yIG5ldyB3YXkgb2YKLQljcmVhdGluZyBsaW5rZXIgZHluYW1pYyBzZWN0aW9ucyBhbmQgc3ltYm9scy4KLQkoZWxmX2xpbmtlcl9zZWN0aW9ueyxfcG9pbnRlcnN9KTogTmV3IHN0cnVjdHVyZXMgZm9yIGNyZWF0aW5nCi0JZHluYW1pYyBzZWN0aW9ucyBhbmQgc3ltYm9scy4KLQkoZWxmX29ial90ZGF0YSk6IEFkZCBsaW5rZXJfc2VjdGlvbl9wb2ludGVycyBhbmQgbGlua2VyX3NlY3Rpb24KLQlmaWVsZHMuCi0JKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyxlbGZfbGlua2VyX3NlY3Rpb24pOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCShfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBOZXcgZGVjbGFyYXRpb25zLgotCShfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEaXR0by4KLQkoYmZkX2VsZnszMiw2NH1fe2NyZWF0ZSxmaW5pc2h9X3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEaXR0by4KLQkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogRGl0dG8uCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWxldGUuCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUKLQlzZWN0aW9ucyAuZ290LCAuc2RhdGEsIGFuZCAuc2RhdGEyLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFphcCAucmVsYS57c2RhdGEsc2RhdGEyfSBpZgotCW5lZWRlZC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBTdXBwb3J0IG1vcmUgb2YgdGhlIGVhYmkgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbHMpOiBBZGp1c3QgX1NEQXssMn1fQkFTRV8gYnkgMzI3NjgKLQlpZiB0aGUgLnNkYXRheywyfSArIC5zYnNzeywyfSBzZWN0aW9uIHNpemUgaXMgPiAzMmsuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIGluaXRpYWxpemVkIHBvaW50ZXJzIGluIGR5bmFtaWMgbGlua2VyIHNlY3Rpb25zLgotCShlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBBY3R1YWxseSBpbnRpYWxpemUgdGhlCi0JcG9pbnRlcnMgY3JlYXRlZCBhYm92ZS4KLQotCSogZWxmY29kZS5oIChiZmRfZWxmezMyLDY0fV9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IE5ldwotCW1hY3JvcyB0byBwcm92aWRlIGJvdGggMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucyBvZgotCWVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbi4KLQkoYmZkX2VsZnszMiw2NH1fZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBOZXcgbWFjcm9zIHRvCi0JcHJvdmlkZSBib3RoIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMgb2YKLQllbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24uCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIGEgbGlua2VyIHNlY3Rpb24uCi0JKF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IEZpbmQgYSB1bmlxdWUgcG9pbnRlciB0byBhCi0JZ2l2ZW4gYWRkcmVzcyBpbiB0aGUgbGlua2VyIHBvaW50ZXIgb2Zmc2V0cyBjcmVhdGVkIGZvciBhIGdpdmVuCi0Jc3ltYm9sLgotCShfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEpOiBNYWtlIGEgUkVMQSBzZWN0aW9uCi0JY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLgotCi1TYXQgSmFuIDIwIDA4OjM2OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKEVMRl9NQUNISU5FX0FMVDEpOiBEZWZpbmUuCi0KLVRodSBKYW4gMTggMTg6MjU6MzQgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBjaGFuZ2VkIFRPQ0RFRk4gcmVsb2NzLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHNwZWNpYWwgdmFsdWVzIGZvciBnY2MgYnVpbHQgZGxscy4KLQkoZHVtcF90b2MpOiBmaXggZGlhZ25vc2luZyBjb2RlIHRvIGlkZW50aWZ5IG91dC1vZi10b2MtYm91bmRzIGVudHJpZXMuCi0JQWxzbyBiZWdpbiB0aGUgdG9jIGF0IDQgYXMgYW4gZXllIGNhdGNoZXIgKCczMTMxMzEzMScgbWFya3MgdGhlIGZpcnN0Ci0JdG9jIGVudHJ5IGluIGFuIG9iamR1bXApIGZvciBub3cuCi0JKHBwY19kb19sYXN0LCBwcGNfZ2V0X2xhc3QpOiBOZXcgZnVuY3Rpb24gLSBuZWVkZWQgdG8gc2F2ZSBwcm9jZXNzaW5nCi0JdGhlIHRvYyBvd25lciB0byB0aGUgZW5kLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogUmVtb3ZlZCBhbiBpbmNvcnJlY3QgaGFjayBmb3IgZG9pbmcgdGhlCi0JdG9jIG93bmVyIGxhc3QuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQWRkZWQgYSBuZXcgaGFjayB0byBrZWVwIHRoZQotCXRvYyBvd25lciBmcm9tIGJlaW5nIGRvbmUgdGlsbCBsYXN0LiBNdXN0IGRlZmluZSBQT1dFUlBDX0xFX1BDCi0JdG8gZW5hYmxlIGl0LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IGFsaWdubWVudCBzZXR0aW5nIGZvciAuc3RhYgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogc2V0IHNlY3Rpb24gZmxhZ3MgZm9yIHN0YWIvc3RyCi0JdG8gSU5GTy4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogUmVtb3ZlZCBhIG5vbi13b3JraW5nIGhhY2sgZm9yIGNvbXB1dGluZyB0aGUKLQlTaXplT2ZJbWFnZSBmb3IgUG93ZXJQQy4gSWdub3JlIHRoZSBzaXplIG9mIHRoZSAuanVuayBzZWN0aW9uLgotCi1UaHUgSmFuIDE4IDE3OjQyOjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29yZS5oOiBJbmNsdWRlIDxzaWduYWwuaD4gYmVmb3JlIDxzeXMvcHJvY2ZzLmg+LgotCi1XZWQgSmFuIDE3IDEyOjQwOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LXBvd2VycGMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBsYXN0IGVudHJ5IHRvIG5vdCBwb2ludAotCWJhY2sgdG8gZmlyc3QuCi0JKGJmZF9wb3dlcnBjX2FyY2gpOiBQb2ludCBhdCBmaXJzdCBlbnRyeSBpbiBhcmNoX2luZm9fc3RydWN0LgotCi1UdWUgSmFuIDE2IDE1OjEwOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBEb24ndCBpbmNyZW1lbnQgZmlsZQotCW9mZnNldCBmb3IgYSBzZWdtZW50IHdoaWNoIGNvbnRhaW5zIG5vIGxvYWRhYmxlIHNlY3Rpb25zLgotCi1Nb24gSmFuIDE1IDE3OjQ2OjI3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIG5ldyBQb3dlclBDIHJlbG9jYXRpb25zLgotCSoge2JmZC1pbjIsbGliYmZkfS5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgbW9yZSBQUEMgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBMb29rdXAgbmV3IHJlbG9jYXRpb25zLgotCi1Nb24gSmFuIDE1IDE0OjI5OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogRml4IFJFTE9DX0JBU0UxMCBhbmQgUkVMT0NfQkFTRTIyCi0JZW50cmllcy4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogRG9uJ3QgZmFpbCBhc3NlcnQgaWYKLSAgICAgICAgaW5mby0+c2hhcmVkLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCB0cnkgdG8gY2FjaGUKLQlpbmZvcm1hdGlvbiBpbiBzZWN0aW9ucyB0aGF0IGFyZSBub3Qgb3duZWQgYnkgYSBCRkQuICBGcm9tIFJpY2hhcmQKLQlIZW5kZXJzb24gPHJpY2hhcmRAYXRoZWlzdC50YW11LmVkdT4uCi0KLQkqIGVsZjMyLW1pcHMuYzogTnVtZXJvdXMgY2hhbmdlcyB0byBkeW5hbWljIGxpbmtpbmcgY29kZSwgbW9zdGx5Ci0JZnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPi4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFJlbW92ZSBzcGVjaWFsIGNoZWNrIGZvcgotCV9ybGRfbmV3X2ludGVyZmFjZS4KLQotCSogZWNvZmZzd2FwLmg6IEFkZCBwcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLgotCi1TdW4gSmFuIDE0IDIxOjM2OjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfe3Vuc3VwcG9ydGVkLHN0ZH1fcmVsb2MpOiBSZW1vdmUgZnVuY3Rpb25zLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IFJlbW92ZSBwcGNfZWxmX3t1bnN1cHBvcnRlZCxzdGR9X3JlbG9jCi0JcmVmZXJlbmNlcy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIE5vIGxvbmdlciBhbGxvdyAuc2RhdGEvLnNic3Mgc2VjdGlvbnMKLQl0byBzYXRpc2Z5IGEgVE9DMTYgcmVsb2NhdGlvbi4gCVJld3JpdGUgdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbgotCXN1cHBvcnQuICBCZWdpbiBzdXBwb3J0IGZvciBSX1BQQ19TREF7Mix9UkVMLgotCi1TYXQgSmFuIDEzIDA5OjM2OjUyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24gdG8KLQljcmVhdGUgdGhlIC5nb3QgYW5kIC5nb3QubmVnIHNlY3Rpb25zLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgaXQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQ2FsbCBpdC4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTdXBwb3J0IC5nb3QubmVnLCBqdXN0IGxpa2UgLmdvdC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgZXJyb3IgbWVzc2FnZXMgZm9yIHJlbG9jYXRpb25zIHdlCi0JZG9uJ3QgeWV0IHN1cHBvcnQuICBEbyBub3QgaW5jbHVkZSBSX1BQQ19TREFSRUwxNiBsaWtlIGEgR09UCi0JcmVsb2NhdGlvbi4KLQotRnJpIEphbiAxMiAxNToyNzo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBEZWZpbmUsIGFuZCBoYW5kbGUgdGhlIG5ldwotCXNlY3Rpb24gZmxhZ3MgZm9yIFYuNCBhbmQgZWFiaS4KLQotRnJpIEphbiAxMiAxMzo1OToxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgYSBzZWdtZW50Ci0JY29udGFpbnMgbm8gc2VjdGlvbnMsIGRvbid0IG1hcmsgaXQgYXMgcmVhZGFibGUuCi0KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEdW1wIGNvbnRlbnRzIG9mCi0JZHluYW1pYyBzZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogQWRkIHN3YXBfZHluX2luIGZpZWxkLgotCShiZmRfZWxmMzJfc3dhcF9keW5faW4pOiBDaGFuZ2UgdHlwZSBvZiBzZWNvbmQgcGFyYW1ldGVyIHRvIFBUUi4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX2luKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX2R5bl9pbik6IENoYW5nZSB0eXBlIG9mIHNlY29uZCBwYXJhbWV0ZXIgdG8KLQlQVFIuCi0JKE5BTUUoX2JmZF9lbGYsc2l6ZV9pbmZvKSk6IEluaXRpYWxpemUgc3dhcF9keW5faW4gZmllbGQuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgY3JlYXRlIGEKLQlEVF9URVhUUkVMIGVudHJ5IGJlY2F1c2Ugb2YgLnJlbC5wbHQuICBGcm9tIE1hcnRpbiBQaXJrZXIKLQk8cGlya2VyQGVpdW5peC50dXdpZW4uYWMuYXQ+LgotCi1UaHUgSmFuIDExIDE3OjA2OjE0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChTRUNfe0VYQ0xVREUsU09SVF9FTlRSSUVTfSk6IE5ldyBzZWN0aW9uIGZsYWdzIGZvcgotCVBvd2VyUEMgVi40IGFuZCBlYWJpLgotIAkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZnh4LXRhcmdldC5oIChUQVJHRVRfe0JJRyxMSVRUTEV9X1NZTSk6IEFkZCBuZXcgZmxhZ3MuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogU3VwcG9ydCBTSFRfT1JERVJFRAotCXNlY3Rpb24gdHlwZSBhbmQgU0hGX0VYQ0xVREUgc2VjdGlvbiBmbGFnLCB0dXJuaW5nIHRoZW0gaW50byB0aGUKLQlhcHByb3ByaWF0ZSBiZmQgc2VjdGlvbiBmbGFnLgotCi1UaHUgSmFuIDExIDExOjIzOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDcmVhdGUgdGhlIHNwZWNpYWwKLQlzZWN0aW9ucyBpZiB3ZSBzZWUgYSBEWU5BTUlDIG9iamVjdCwgaW4gY2FzZSB0aGF0IGlzIHRoZSBvbmx5Ci0JWENPRkYgaW5wdXQgb2JqZWN0IHdlIHNlZS4KLQotCSogZWxmMzItbWlwcy5jOiBFeHRlbnNpdmUgY2hhbmdlcyBmb3IgYSBzdGFydCBhdCBkeW5hbWljIGxpbmtpbmcKLQlzdXBwb3J0LCBmcm9tIEthenVtb3RvIEtvamltYSA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+LgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIHR5cGVfY2hhbmdlX29rIGZpZWxkLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZQotCWVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgZmllbGQuICBBZGQKLQllbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBhbmQKLQllbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAgZmllbGRzLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rKTogRGVmaW5lIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9jcmVhdGVfcHJvZ3JhbV9oZWFkZXJzKTogRG9uJ3QgZGVmaW5lLgotCShlbGZOTl9iZWQpOiBDaGFuZ2UgdG8gYWNjb3VudCBmb3IgZmllbGQgY2hhbmdlcy4KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQ2FsbCBuZXcKLQltb2RpZnlfc2VnbWVudF9tYXAgYmFja2VuZCBmdW5jdGlvbi4gIERvbid0IGNhbGwgb2xkCi0JY3JlYXRlX3Byb2dyYW1faGVhZGVycyBiYWNrZW5kIGZ1bmN0aW9uLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENhbGwgYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgcmF0aGVyCi0JdGhhbiBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJbml0aWFsaXplCi0JdHlwZV9jaGFuZ2Vfb2sgZnJvbSBuZXcgYmFja2VuZCBmaWVsZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IHdhcm4gaWYgX3JsZF9uZXdfaW50ZXJmYWNlIGlzCi0JZGVmaW5lZC4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbCBhcwotCWEgcmVsb2MgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgdGRhdGEgZmllbGQuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVuYW1lIHBwY19mbGFnc19pbml0IGZpZWxkIHRvIGZsYWdzX2luaXQuCi0JKGVsZl9mbGFnc19pbml0KTogUmVuYW1lIGZyb20gZWxmX3BwY19mbGFnc19pbml0LgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBVc2UgZWxmX2ZsYWdzX2luaXQsIG5vdAotCWVsZl9wcGNfZmxhZ3NfaW5pdC4KLQkocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW02OGsuYyAoaG93dG9fdGFibGUpOiBDaGFuZ2Ugc3JjX21hc2sgdG8gMCBmb3IgYWxsCi0JcmVsb2NhdGlvbiBlbnRyaWVzLgotCi1UdWUgSmFuICA5IDE1OjIyOjUzIDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IER1cmluZyBmaW5hbCBsaW5rLCBhbGxvdwotIAlvdXRwdXQgLmxpdGEgc2VjdGlvbiB0byBiZSBiaWdnZXIgdGhhbiA2NGsgYnkgYWRqdXN0aW5nIGdwIHZhbHVlCi0gCW9uIGEgcGVyLWlucHV0IHNlY3Rpb24gYmFzaXMuCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfdGRhdGEpOiBBZGQgaXNzdWVkX211bHRpcGxlX2dwX3dhcm5pbmcKLQlmaWVsZC4KLQkoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgZ3AgZmllbGQuCi0KLVR1ZSBKYW4gIDkgMTI6MDA6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JSGFuZGxlIEFscGhhIEVDT0ZGIGNoYW5nZXMgaW4gT1NGLzEgMy4yLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBnZXRfZWx0X2F0X2ZpbGVwb3MKLQlmaWVsZC4KLQkqIGNvZmYtYWxwaGEuYzogSW5jbHVkZSAiYW91dC9hci5oIi4KLQkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgcmVxdWlyZSBhbgotCUFMUEhBX1JfSUdOT1JFIHJlbG9jIGFmdGVyIGFuIEFMUEhBX1JfR1BESVNQIHJlbG9jLCBzaW5jZSBPU0YvMQotCTMuMiBkb2Vzbid0IGdlbmVyYXRlIG9uZS4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShhbHBoYV9lY29mZl9zbHVycF9hcm1hcCk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfd3JpdGVfYXJtYXApOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkoQVJGWk1BRyk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfcmVhZF9hcl9oZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBnZXRfZWx0X2F0X2ZpbGVwb3MgZmllbGQuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IENoYW5nZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIGZyb20KLQlfYmZkX2Vjb2ZmIHRvIGFscGhhX2Vjb2ZmLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogVXNlIGdldF9lbHRfYXRfZmlsZXBvcwotCWZpZWxkIGZyb20gYmFja2VuZCBzdHJ1Y3R1cmUsIHJhdGhlciB0aGFuIGFsd2F5cyBjYWxsaW5nCi0JX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplCi0JZ2V0X2VsdF9hdF9maWxlcG9zIGZpZWxkLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogTmV3IGZ1bmN0aW9uLCBjb3BpZWQKLQlmcm9tIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciB3aXRoIG1pbm9yIGNoYW5nZXMuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IFVzZSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGJmZC1pbi5oIChCRkRfSU5fTUVNT1JZKTogRGVmaW5lLgotCSogbGliYmZkLWluLmggKHN0cnVjdCBiZmRfaW5fbWVtb3J5KTogRGVmaW5lLgotCSogbGliYmZkLmMgKGJmZF9yZWFkKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KLQkoYmZkX2dldF9maWxlX3dpbmRvdyk6IERvbid0IHRyeSB0byBtYXAgYSBCRkRfSU5fTUVNT1JZIGZpbGUuCi0JKGJmZF93cml0ZSwgYmZkX3N0YXQpOiBBYm9ydCBpZiBCRkRfSU5fTUVNT1JZIGlzIHNldC4KLQkoYmZkX3RlbGwsIGJmZF9mbHVzaCwgYmZkX3NlZWspOiBIYW5kbGUgQkZEX0lOX01FTU9SWSBmbGFnLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQ2hhbmdlIGlvc3RyZWFtIGZpZWxkIGZyb20gY2hhciAqIHRvIFBUUi4KLQkoYmZkX2dldF9zaXplKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KLQkqIGNhY2hlLmMgKGJmZF9jYWNoZV9jbG9zZSk6IElnbm9yZSBCRkRfSU5fTUVNT1JZIGZpbGVzLgotCShiZmRfb3Blbl9maWxlKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gc2V0dGluZyBpb3N0cmVhbS4KLQkoYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIpOiBBYm9ydCBpZiBCRkRfSU5fTUVNT1JZIGlzIHNldC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENhc3QgdG8gUFRSLCBub3QgY2hhciAqLCB3aGVuIHNldHRpbmcKLQlpb3N0cmVhbS4KLQkoYmZkX29wZW5zdHJlYW1yKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IE9ubHkgZnN0YXQgaW9zdHJlYW0gaWYKLQlCRkRfSU5fTUVNT1JZIGlzIG5vdCBzZXQuCi0JKiByaXNjaXguYyAocmlzY2l4X3NvbWVfYW91dF9vYmplY3RfcCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfZ2V0X2VsdF9hdF9pbmRleCBmaWVsZC4KLQkoQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IEFkZCBfZ2V0X2VsdF9hdF9pbmRleC4KLQkoYmZkX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KTogUmVuYW1lIGZyb20KLQliZmRfZ2V0X2VsdF9hdF9pbmRleC4gIENoYW5nZSBpbmRleCBwYXJhbWV0ZXIgZnJvbSBpbnQgdG8KLQlzeW1pbmRleC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCk6IERlY2xhcmUuCi0JKF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGllZWUuYyAoaWVlZV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IHJlc3RyaWN0IGxpbmUKLQludW1iZXJzIHRvIHRoZSAudGV4dCBzZWN0aW9uLgotCi1Nb24gSmFuICA4IDE3OjAwOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2RlYnVnX3BhcnQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQlJZiB0aGVyZSBpcyBhIFNFQ19ERUJVR0dJTkcgc2VjdGlvbiwgZ2V0IHRoZSBjb250ZW50cyBvZiB0aGUgZGVidWcKLQlpbmZvcm1hdGlvbiBwYXJ0IGZyb20gaXQuCi0JKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTdG9yZSB0aGUgY29udGVudHMgb2YgYSBTRUNfREVCVUdHSU5HCi0Jc2VjdGlvbiBpbiBtZW1vcnkuCi0JKGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IHJldHVybi4KLQotVGh1IEphbiAgNCAxNzoxMjozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1mcmVlYnNkKik6IEFkZCB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGkzODZmcmVlYnNkX3ZlYyk6IEFkZCB2ZWMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgaTM4NmZyZWVic2Quby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGkzODZmcmVlYnNkLmMuCi0JUmVidWlsZCBkZXBlbmRlbmNpZXMuLgotCSogZnJlZWJzZC5oOiBOZXcgZmlsZS4KLQkqIGkzODZmcmVlYnNkLmM6IE5ldyBmaWxlLgotCSogdGFyZ2V0cy5jIChpMzg2ZnJlZWJzZF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpMzg2ZnJlZWJzZF92ZWMuCi0JKiBpMzg2bGludXguYyAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIGFzIFRBUkdFVF9QQUdFX1NJWkUKLQkqIGkzODZuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogIERlZmluZSBhcyBUQVJHRVRfUEFHRV9TSVpFCi0KLVRodSBKYW4gIDQgMTY6Mjc6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZGVidWcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX29iamVjdF9wKTogQ2FsbCBpdC4KLQkoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBTa2lwIGRlYnVnZ2luZyBzZWN0aW9ucy4KLQkoaWVlZV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCk6IExpa2V3aXNlLgotCShpZWVlX3dyaXRlX2RlYnVnX3BhcnQpOiBMaWtld2lzZS4KLQkoaWVlZV93cml0ZV9kYXRhX3BhcnQpOiBMaWtld2lzZS4KLQkoaW5pdF9mb3Jfb3V0cHV0KTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gIDMgMTk6NDI6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UgQEdPVCByZWxvY2F0aW9ucwotCXdvcmsuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogSnVzdCB1c2UgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGZvciBhbGwgaG93dG8KLQlyZWxvY3MsIHNpbmNlIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBoYW5kbGVzIHRoZSBsaW5rZXIgY2FzZS4KLQkocHBjX2VsZl97YWRkcjE2X2hhLGdvdDE2LHRvYzE2LGJydGFrZW59X3JlbG9jKTogRGVsZXRlLCBubyBsb25nZXIKLQl1c2VkLgotCShwcGNfZWxmX3thZGRyMTZfaGEsZ290MTYsdG9jMTYsYnJ0YWtlbn1faW5uZXIpOiBNZXJnZSB0aGVzZSBpbnRvCi0JcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIHNpbmNlIHRoYXQgaXMgbm93IHRoZSBvbmx5IGNhbGxlci4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLVdlZCBKYW4gIDMgMTU6MTE6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIHdlIGRvbid0IGtub3cgdGhlCi0Jc2VjdGlvbiBvZiB0aGUgZW50cnkgcG9pbnQgZm9yIGFuIFhDT0ZGIGV4ZWN1dGFibGUsIGFsd2F5cyBzZXQgdGhlCi0JZW50cnkgYWRkcmVzcyB0byAtMS4KLQotVHVlIEphbiAgMiAxNDoxNzoxNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGQgc3VwcG9ydCBmb3Igbm90ZSBzZWN0aW9ucy4KLQotVHVlIEphbiAgMiAxMzoxMDoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChzdHJ1Y3QgX3N5bWJvbF9pbmZvKTogQWRkIHN0YWJfdHlwZSBmaWVsZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pKTogU2V0IHN0YWJfdHlwZS4KLQotCSogZWxmMzItcHBjLmM6IFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lIGZyb20gY2FsbHMgdG8KLSAgICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBPbmx5IHdhcm4gYWJvdXQgZW5kaWFubmVzcwotCWRpZmZlcmVuY2UgaWYgdGFyZ2V0IGVuZGlhbm5lc3MgaXMga25vd24uCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTQ5NQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL01ha2VmaWxlLmFtIGIvYmZkL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTlmMzFhLi4wMDAwMDAwCi0tLSBhL2JmZC9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDEwODUgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLUlOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCi1DU0VBUkNIID0gLUkuIC1JJChzcmNkaXIpIC1JJChJTkNESVIpCi1ERVAgPSBta2RlcAotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKLUJGRF9IID0gYmZkLmgKLQotIyBKaW0gS2luZ2RvbiBub3RlczoKLSMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKLSMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCi0jIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKLSMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQotIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKLSMgZGVidWdnZXIpLgotQkZEX0xJQlMgPSBcCi0JYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCi0JZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCi0Jc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAotCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotCi1CRkRfTElCU19DRklMRVMgPSBcCi0JYXJjaGl2ZS5jIGFyY2h1cmVzLmMgYmZkLmMgY2FjaGUuYyBjb2ZmZ2VuLmMgY29yZWZpbGUuYyBcCi0JZm9ybWF0LmMgaW5pdC5jIGxpYmJmZC5jIG9wbmNscy5jIHJlbG9jLmMgXAotCXNlY3Rpb24uYyBzeW1zLmMgdGFyZ2V0cy5jIGhhc2guYyBsaW5rZXIuYyBcCi0Jc3JlYy5jIGJpbmFyeS5jIHRla2hleC5jIGloZXguYyBzdGFicy5jIHN0YWItc3ltcy5jCi0KLSMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc2llciB0byBrZWVwIGluIHN5bmMKLSMgd2l0aCB0aGUgZGVjbHMgYW5kIGluaXRpYWxpemVyIGluIGFyY2h1cmVzLmMuCi1BTExfTUFDSElORVMgPSBcCi0JY3B1LWEyOWsubG8gXAotCWNwdS1hbHBoYS5sbyBcCi0JY3B1LWFyYy5sbyBcCi0JY3B1LWFybS5sbyBcCi0JY3B1LWQxMHYubG8gXAotCWNwdS1kMzB2LmxvIFwKLQljcHUtZnIzMC5sbyBcCi0JY3B1LWg4MzAwLmxvIFwKLQljcHUtaDg1MDAubG8gXAotCWNwdS1ocHBhLmxvIFwKLQljcHUtaTM4Ni5sbyBcCi0JY3B1LWk4NjAubG8gXAotCWNwdS1pOTYwLmxvIFwKLQljcHUtbTMyci5sbyBcCi0JY3B1LW02OGsubG8gXAotCWNwdS1tODhrLmxvIFwKLQljcHUtbTEwMjAwLmxvIFwKLQljcHUtbTEwMzAwLmxvIFwKLQljcHUtbWNvcmUubG8gXAotCWNwdS1taXBzLmxvIFwKLQljcHUtbnMzMmsubG8gXAotCWNwdS1wb3dlcnBjLmxvIFwKLQljcHUtcnM2MDAwLmxvIFwKLQljcHUtc2gubG8gXAotCWNwdS1zcGFyYy5sbyBcCi0JY3B1LXRpYzMwLmxvIFwKLQljcHUtdGljODAubG8gXAotCWNwdS12ODUwLmxvIFwKLQljcHUtdmF4LmxvIFwKLQljcHUtd2UzMmsubG8gXAotCWNwdS13NjUubG8gXAotCWNwdS16OGsubG8KLQotQUxMX01BQ0hJTkVTX0NGSUxFUyA9IFwKLQljcHUtYTI5ay5jIFwKLQljcHUtYWxwaGEuYyBcCi0JY3B1LWFyYy5jIFwKLQljcHUtYXJtLmMgXAotCWNwdS1kMTB2LmMgXAotCWNwdS1kMzB2LmMgXAotCWNwdS1mcjMwLmMgXAotCWNwdS1oODMwMC5jIFwKLQljcHUtaDg1MDAuYyBcCi0JY3B1LWhwcGEuYyBcCi0JY3B1LWkzODYuYyBcCi0JY3B1LWk4NjAuYyBcCi0JY3B1LWk5NjAuYyBcCi0JY3B1LW0zMnIuYyBcCi0JY3B1LW02OGsuYyBcCi0JY3B1LW04OGsuYyBcCi0JY3B1LW0xMDIwMC5jIFwKLQljcHUtbTEwMzAwLmMgXAotCWNwdS1tY29yZS5jIFwKLQljcHUtbWlwcy5jIFwKLQljcHUtbnMzMmsuYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljODAuYyBcCi0JY3B1LXY4NTAuYyBcCi0JY3B1LXZheC5jIFwKLQljcHUtd2UzMmsuYyBcCi0JY3B1LXc2NS5jIFwKLQljcHUtejhrLmMKLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgMzIgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbC4KLUJGRDMyX0JBQ0tFTkRTID0gXAotCWFvdXQtYWRvYmUubG8gXAotCWFvdXQtYXJtLmxvIFwKLQlhb3V0LW5zMzJrLmxvIFwKLQlhb3V0LXNwYXJjbGUubG8gXAotCWFvdXQtdGljMzAubG8gXAotCWFvdXQwLmxvIFwKLQlhb3V0MzIubG8gXAotCWJvdXQubG8gXAotCWNmLWkzODZseW54LmxvIFwKLQljZi1tNjhrbHlueC5sbyBcCi0JY2Ytc3BhcmNseW54LmxvIFwKLQljb2ZmLWEyOWsubG8gXAotCWNvZmYtYXBvbGxvLmxvIFwKLQljb2ZmLWFybS5sbyBcCi0JY29mZi1hdXgubG8gXAotCWNvZmYtaDgzMDAubG8gXAotCWNvZmYtaDg1MDAubG8gXAotCWNvZmYtaTM4Ni5sbyBcCi0JY29mZi1nbzMyLmxvIFwKLQljb2ZmLWk4NjAubG8gXAotCWNvZmYtaTk2MC5sbyBcCi0JY29mZi1tNjhrLmxvIFwKLQljb2ZmLW04OGsubG8gXAotCWNvZmYtbWlwcy5sbyBcCi0JY29mZi1wbWFjLmxvIFwKLQljb2ZmLXJzNjAwMC5sbyBcCi0JY29mZi1zaC5sbyBcCi0JY29mZi1zcGFyYy5sbyBcCi0JY29mZi1zdGdvMzIubG8gXAotCWNvZmYtc3ZtNjhrLmxvIFwKLQljb2ZmLXRpYzMwLmxvIFwKLQljb2ZmLXRpYzgwLmxvIFwKLQljb2ZmLXU2OGsubG8gXAotCWNvZmYtd2UzMmsubG8gXAotCWNvZmYtdzY1LmxvIFwKLQljb2ZmLXo4ay5sbyBcCi0JY29mZmxpbmsubG8gXAotCWR3YXJmMS5sbyBcCi0JZHdhcmYyLmxvIFwKLQllY29mZi5sbyBcCi0JZWNvZmZsaW5rLmxvIFwKLQllbGYubG8gXAotCWVsZjMyLWFyYy5sbyBcCi0JZWxmYXJtLW9hYmkubG8gXAotCWVsZmFybS1uYWJpLmxvIFwKLQllbGYzMi1kMTB2LmxvIFwKLQllbGYzMi1kMzB2LmxvIFwKLQllbGYzMi1mcjMwLmxvIFwKLQllbGYzMi1nZW4ubG8gXAotCWVsZjMyLWhwcGEubG8gXAotCWVsZjMyLWkzODYubG8gXAotCWVsZjMyLWk4NjAubG8gXAotCWVsZjMyLWk5NjAubG8gXAotCWVsZjMyLW0zMnIubG8gXAotCWVsZjMyLW02OGsubG8gXAotCWVsZjMyLW04OGsubG8gXAotCWVsZi1tMTAyMDAubG8gXAotCWVsZi1tMTAzMDAubG8gXAotCWVsZjMyLW1jb3JlLmxvIFwKLQllbGYzMi1taXBzLmxvIFwKLQllbGYzMi1wcGMubG8gXAotCWVsZjMyLXNoLmxvIFwKLQllbGYzMi1zcGFyYy5sbyBcCi0JZWxmMzItdjg1MC5sbyBcCi0JZWxmMzIubG8gXAotCWVsZmxpbmsubG8gXAotCWVwb2MtcGUtYXJtLmxvIFwKLQllcG9jLXBlaS1hcm0ubG8gXAotCWhwMzAwYnNkLmxvIFwKLQlocDMwMGhwdXgubG8gXAotCXNvbS5sbyBcCi0JaTM4NmFvdXQubG8gXAotCWkzODZic2QubG8gXAotCWkzODZkeW5peC5sbyBcCi0JaTM4NmZyZWVic2QubG8gXAotCWkzODZsaW51eC5sbyBcCi0JaTM4Nmx5bngubG8gXAotCWkzODZtc2Rvcy5sbyBcCi0JaTM4Nm5ldGJzZC5sbyBcCi0JaTM4Nm1hY2gzLmxvIFwKLQlpMzg2b3M5ay5sbyBcCi0JaWVlZS5sbyBcCi0JbTY4azRrbmV0YnNkLmxvIFwKLQltNjhrbGludXgubG8gXAotCW02OGtseW54LmxvIFwKLQltNjhrbmV0YnNkLmxvIFwKLQltODhrbWFjaDMubG8gXAotCW1pcHNic2QubG8gXAotCW5ld3NvczMubG8gXAotCW5sbS5sbyBcCi0JbmxtMzItaTM4Ni5sbyBcCi0JbmxtMzItc3BhcmMubG8gXAotCW5sbTMyLXBwYy5sbyBcCi0JbmxtMzIubG8gXAotCW5zMzJrbmV0YnNkLmxvIFwKLQlvYXN5cy5sbyBcCi0JcGM1MzItbWFjaC5sbyBcCi0JcGUtYXJtLmxvIFwKLQlwZWktYXJtLmxvIFwKLQlwZS1pMzg2LmxvIFwKLQlwZWktaTM4Ni5sbyBcCi0JcGUtbWNvcmUubG8gXAotCXBlaS1tY29yZS5sbyBcCi0JcGUtcHBjLmxvIFwKLQlwZWktcHBjLmxvIFwKLQlwcGNib290LmxvIFwKLQlyZWxvYzE2LmxvIFwKLQlyaXNjaXgubG8gXAotCXNwYXJjbGludXgubG8gXAotCXNwYXJjbHlueC5sbyBcCi0Jc3BhcmNuZXRic2QubG8gXAotCXN1bm9zLmxvIFwKLQl2YXhuZXRic2QubG8gXAotCXZlcnNhZG9zLmxvIFwKLQl2bXMubG8gXAotCXZtcy1nc2QubG8gXAotCXZtcy1oZHIubG8gXAotCXZtcy1taXNjLmxvIFwKLQl2bXMtdGlyLmxvIFwKLQl4Y29mZmxpbmsubG8KLQotQkZEMzJfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQtYWRvYmUuYyBcCi0JYW91dC1hcm0uYyBcCi0JYW91dC1uczMyay5jIFwKLQlhb3V0LXNwYXJjbGUuYyBcCi0JYW91dC10aWMzMC5jIFwKLQlhb3V0MC5jIFwKLQlhb3V0MzIuYyBcCi0JYm91dC5jIFwKLQljZi1pMzg2bHlueC5jIFwKLQljZi1tNjhrbHlueC5jIFwKLQljZi1zcGFyY2x5bnguYyBcCi0JY29mZi1hMjlrLmMgXAotCWNvZmYtYXBvbGxvLmMgXAotCWNvZmYtYXJtLmMgXAotCWNvZmYtYXV4LmMgXAotCWNvZmYtaDgzMDAuYyBcCi0JY29mZi1oODUwMC5jIFwKLQljb2ZmLWkzODYuYyBcCi0JY29mZi1pODYwLmMgXAotCWNvZmYtZ28zMi5jIFwKLQljb2ZmLWk5NjAuYyBcCi0JY29mZi1tNjhrLmMgXAotCWNvZmYtbTg4ay5jIFwKLQljb2ZmLW1pcHMuYyBcCi0JY29mZi1wbWFjLmMgXAotCWNvZmYtcnM2MDAwLmMgXAotCWNvZmYtc2guYyBcCi0JY29mZi1zcGFyYy5jIFwKLQljb2ZmLXN0Z28zMi5jIFwKLQljb2ZmLXN2bTY4ay5jIFwKLQljb2ZmLXRpYzMwLmMgXAotCWNvZmYtdGljODAuYyBcCi0JY29mZi11NjhrLmMgXAotCWNvZmYtd2UzMmsuYyBcCi0JY29mZi13NjUuYyBcCi0JY29mZi16OGsuYyBcCi0JY29mZmxpbmsuYyBcCi0JZHdhcmYxLmMgXAotCWR3YXJmMi5jIFwKLQllY29mZi5jIFwKLQllY29mZmxpbmsuYyBcCi0JZWxmLmMgXAotCWVsZjMyLWFyYy5jIFwKLQllbGZhcm0tb2FiaS5jIFwKLQllbGZhcm0tbmFiaS5jIFwKLQllbGYzMi1kMTB2LmMgXAotCWVsZjMyLWQzMHYuYyBcCi0JZWxmMzItZnIzMC5jIFwKLQllbGYzMi1nZW4uYyBcCi0JZWxmMzItaHBwYS5jIFwKLQllbGYzMi1pMzg2LmMgXAotCWVsZjMyLWk4NjAuYyBcCi0JZWxmMzItaTk2MC5jIFwKLQllbGYzMi1tMzJyLmMgXAotCWVsZjMyLW02OGsuYyBcCi0JZWxmMzItbTg4ay5jIFwKLQllbGYtbTEwMjAwLmMgXAotCWVsZi1tMTAzMDAuYyBcCi0JZWxmMzItbWNvcmUuYyBcCi0JZWxmMzItbWlwcy5jIFwKLQllbGYzMi1wcGMuYyBcCi0JZWxmMzItc2guYyBcCi0JZWxmMzItc3BhcmMuYyBcCi0JZWxmMzItdjg1MC5jIFwKLQllbGYzMi5jIFwKLQllbGZsaW5rLmMgXAotCWVwb2MtcGUtYXJtLmMgXAotCWVwb2MtcGVpLWFybS5jIFwKLQlocDMwMGJzZC5jIFwKLQlocDMwMGhwdXguYyBcCi0Jc29tLmMgXAotCWkzODZhb3V0LmMgXAotCWkzODZic2QuYyBcCi0JaTM4NmR5bml4LmMgXAotCWkzODZmcmVlYnNkLmMgXAotCWkzODZsaW51eC5jIFwKLQlpMzg2bHlueC5jIFwKLQlpMzg2bXNkb3MuYyBcCi0JaTM4Nm5ldGJzZC5jIFwKLQlpMzg2bWFjaDMuYyBcCi0JaTM4Nm9zOWsuYyBcCi0JaWVlZS5jIFwKLQltNjhrNGtuZXRic2QuYyBcCi0JbTY4a2xpbnV4LmMgXAotCW02OGtseW54LmMgXAotCW02OGtuZXRic2QuYyBcCi0JbTg4a21hY2gzLmMgXAotCW1pcHNic2QuYyBcCi0JbmV3c29zMy5jIFwKLQlubG0uYyBcCi0JbmxtMzItaTM4Ni5jIFwKLQlubG0zMi1zcGFyYy5jIFwKLQlubG0zMi1wcGMuYyBcCi0JbmxtMzIuYyBcCi0JbnMzMmtuZXRic2QuYyBcCi0Jb2FzeXMuYyBcCi0JcGM1MzItbWFjaC5jIFwKLQlwZS1hcm0uYyBcCi0JcGVpLWFybS5jIFwKLQlwZS1pMzg2LmMgXAotCXBlaS1pMzg2LmMgXAotCXBlLW1jb3JlLmMgXAotCXBlaS1tY29yZS5jIFwKLQlwZS1wcGMuYyBcCi0JcGVpLXBwYy5jIFwKLQlwcGNib290LmMgXAotCXJlbG9jMTYuYyBcCi0JcmlzY2l4LmMgXAotCXNwYXJjbGludXguYyBcCi0Jc3BhcmNseW54LmMgXAotCXNwYXJjbmV0YnNkLmMgXAotCXN1bm9zLmMgXAotCXZheG5ldGJzZC5jIFwKLQl2ZXJzYWRvcy5jIFwKLQl2bXMuYyBcCi0Jdm1zLWdzZC5jIFwKLQl2bXMtaGRyLmMgXAotCXZtcy1taXNjLmMgXAotCXZtcy10aXIuYyBcCi0JeGNvZmZsaW5rLmMKLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgNjQgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbAotIyBhbmQgLS1lbmFibGUtNjQtYml0LWJmZC4KLUJGRDY0X0JBQ0tFTkRTID0gXAotCWFvdXQ2NC5sbyBcCi0JY29mZi1hbHBoYS5sbyBcCi0JZGVtbzY0LmxvIFwKLQllbGY2NC1hbHBoYS5sbyBcCi0JZWxmNjQtZ2VuLmxvIFwKLQllbGY2NC1taXBzLmxvIFwKLQllbGY2NC1zcGFyYy5sbyBcCi0JZWxmNjQubG8gXAotCW5sbTMyLWFscGhhLmxvIFwKLQlubG02NC5sbwotCi1CRkQ2NF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dDY0LmMgXAotCWNvZmYtYWxwaGEuYyBcCi0JZGVtbzY0LmMgXAotCWVsZjY0LWFscGhhLmMgXAotCWVsZjY0LWdlbi5jIFwKLQllbGY2NC1taXBzLmMgXAotCWVsZjY0LXNwYXJjLmMgXAotCWVsZjY0LmMgXAotCW5sbTMyLWFscGhhLmMgXAotCW5sbTY0LmMKLQotT1BUSU9OQUxfQkFDS0VORFMgPSBcCi0JYWl4Mzg2LWNvcmUubG8gXAotCWhwdXgtY29yZS5sbyBcCi0JaXJpeC1jb3JlLmxvIFwKLQlseW54LWNvcmUubG8gXAotCW9zZi1jb3JlLmxvIFwKLQlzY281LWNvcmUubG8gXAotCXRyYWQtY29yZS5sbyBcCi0JY2lzY28tY29yZS5sbwotCi1PUFRJT05BTF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYWl4Mzg2LWNvcmUuYyBcCi0JaHB1eC1jb3JlLmMgXAotCWlyaXgtY29yZS5jIFwKLQlseW54LWNvcmUuYyBcCi0Jb3NmLWNvcmUuYyBcCi0Jc2NvNS1jb3JlLmMgXAotCXRyYWQtY29yZS5jIFwKLQljaXNjby1jb3JlLmMKLQotIyBUaGVzZSBhcmUgZGVmaW5lZCBieSBjb25maWd1cmUuaW46Ci1XT1JEU0laRSA9IEB3b3Jkc2l6ZUAKLUFMTF9CQUNLRU5EUyA9IEBhbGxfYmFja2VuZHNACi1CRkRfQkFDS0VORFMgPSBAYmZkX2JhY2tlbmRzQAotQkZEX01BQ0hJTkVTID0gQGJmZF9tYWNoaW5lc0AKLVRERUZBVUxUUyA9IEB0ZGVmYXVsdHNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSBASERFRklORVNAIEBDT1JFRkxBR0AgQFRERUZJTkVTQCAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCSQoQkZEX0xJQlNfQ0ZJTEVTKSBcCi0JJChBTExfTUFDSElORVNfQ0ZJTEVTKSBcCi0JJChCRkQzMl9CQUNLRU5EU19DRklMRVMpIFwKLQkkKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKQotCi0jIyBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgLmggZmlsZXMgd2hpY2ggYXJlIGluIHRoZSBzb3VyY2UgdHJlZS4KLVNPVVJDRV9IRklMRVMgPSBcCi0JYW91dC10YXJnZXQuaCBhb3V0ZjEuaCBhb3V0eC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0JZWNvZmZzd2FwLmggZWxmMzItYXJtLmggZWxmMzItaHBwYS5oIGVsZmNvZGUuaCBlbGZjb3JlLmggXAotCWVsZmxpbmsuaCBmcmVlYnNkLmggZ2VubGluay5oIGdvMzJzdHViLmggaHBwYV9zdHVicy5oIGxpYmFvdXQuaCBcCi0JbGliYmZkLmggbGliY29mZi5oIGxpYmVjb2ZmLmggZWxmLWJmZC5oIGxpYmhwcGEuaCBsaWJpZWVlLmggXAotCWxpYm5sbS5oIGxpYm9hc3lzLmggbmV0YnNkLmggbmxtLXRhcmdldC5oIG5sbWNvZGUuaCBubG1zd2FwLmggXAotCW5zMzJrLmggcGVpY29kZS5oIHNvbS5oIHZtcy5oCi0KLUhGSUxFUyA9IFwKLQllbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCB0YXJnbWF0Y2guaCBcCi0JJChTT1VSQ0VfSEZJTEVTKQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKFNPVVJDRV9IRklMRVMpCi0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWRpc3RzdHVmZjogaW5mbwotCi0jIFZhcmlvdXMga2luZHMgb2YgLm8gZmlsZXMgdG8gcHV0IGluIGxpYmJmZC5hOgotIyBCRkRfQkFDS0VORFMJUm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBCRkRfTUFDSElORVMJQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQ09SRUZJTEUJQ29yZSBmaWxlIHJvdXRpbmVzIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uCi1PRklMRVMgPSAkKEJGRF9CQUNLRU5EUykgJChCRkRfTUFDSElORVMpIEBDT1JFRklMRUAKLQotc3RhbXAtb2ZpbGVzOiBNYWtlZmlsZQotCXJtIC1mIHRvZmlsZXMKLQlmPSIiOyBcCi0JZm9yIGkgaW4gJChPRklMRVMpIDsgZG8gXAotCSAgY2FzZSAiICQkZiAiIGluIFwKLQkgICAgKiIgJCRpICIqKSA7OyBcCi0JICAgICopIGY9IiQkZiAkJGkiIDs7IFwKLQkgIGVzYWMgOyBcCi0JZG9uZSA7IFwKLQllY2hvICQkZiA+IHRvZmlsZXMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG9maWxlcyBvZmlsZXMKLQl0b3VjaCBzdGFtcC1vZmlsZXMKLQotb2ZpbGVzOiBzdGFtcC1vZmlsZXMgOyBAdHJ1ZQotCi1saWJiZmRfbGFfU09VUkNFUyA9ICQoQkZEX0xJQlNfQ0ZJTEVTKQotbGliYmZkX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKSBvZmlsZXMKLWxpYmJmZF9sYV9MSUJBREQgPSBgY2F0IG9maWxlc2AgQFdJTjMyTElCQUREQAotbGliYmZkX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYmJmZC5hLiAgV2UgY3JlYXRlIGxpYmJmZC5hIGluIHRoZSBidWlsZAotIyBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZSBwcm9ncmFtcyB0aGF0IHVzZQotIyBsaWJiZmQuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIGlmCi0jIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGliYmZkLmEKLWxpYmJmZF9hX1NPVVJDRVMgPQotCi1zdGFtcC1saWI6IGxpYmJmZC5sYQotCWlmIFsgLWYgLmxpYnMvbGliYmZkLmEgXTsgdGhlbiBcCi0JICBjcCAubGlicy9saWJiZmQuYSBsaWJiZmQudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGliYmZkLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLSMgVGhpcyBmaWxlIGhvbGRzIGFuIGFycmF5IGFzc29jaWF0aW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYW5kCi0jIHZlY3RvciBuYW1lcy4gIEl0IGlzIGJ1aWx0IGZyb20gY29uZmlnLmJmZC4gIEl0IGlzIG5vdCBjb21waWxlZCBieQotIyBpdHNlbGYsIGJ1dCBpcyBpbmNsdWRlZCBieSB0YXJnZXRzLmMuCi10YXJnbWF0Y2guaDogY29uZmlnLmJmZCB0YXJnbWF0Y2guc2VkCi0Jcm0gLWYgdGFyZ21hdGNoLmgKLQlzZWQgLWYgJChzcmNkaXIpL3RhcmdtYXRjaC5zZWQgPCAkKHNyY2RpcikvY29uZmlnLmJmZCA+IHRhcmdtYXRjaC5uZXcKLQltdiAtZiB0YXJnbWF0Y2gubmV3IHRhcmdtYXRjaC5oCi0KLSMgV2hlbiBjb21waWxpbmcgYXJjaHVyZXMuYyBhbmQgdGFyZ2V0cy5jLCBzdXBwbHkgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0jIGluZm8gZnJvbSBjb25maWd1cmUuCi0KLXRhcmdldHMubG86IHRhcmdldHMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvdGFyZ2V0cy5jCi0KLWFyY2h1cmVzLmxvOiBhcmNodXJlcy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS9hcmNodXJlcy5jCi0KLWVsZjMyLXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGYzMi10YXJnZXQuaAotCXNlZCAtZSBzL05OLzMyL2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGYzMi10YXJnZXQubmV3Ci0JbXYgLWYgZWxmMzItdGFyZ2V0Lm5ldyBlbGYzMi10YXJnZXQuaAotCi1lbGY2NC10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmNjQtdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi82NC9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmNjQtdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjY0LXRhcmdldC5uZXcgZWxmNjQtdGFyZ2V0LmgKLQotQkZEX0hfREVQUz0gJChJTkNESVIpL2Fuc2lkZWNsLmgKLUxPQ0FMX0hfREVQUz0gbGliYmZkLmggc3lzZGVwLmggY29uZmlnLmgKLSQoQkZEX0xJQlMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfTUFDSElORVMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChPUFRJT05BTF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0KLSMgSW5zdGFsbCBCRkQgaW5jbHVkZSBmaWxlLCBhbmQgb3RoZXJzIHRoYXQgaXQgbmVlZHMuCi1pbnN0YWxsLWRhdGEtbG9jYWw6ICQoQkZEX0gpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpCi0JJChJTlNUQUxMX0RBVEEpICQoQkZEX0gpICQoaW5jbHVkZWRpcikvYmZkLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2Fuc2lkZWNsLmggJChpbmNsdWRlZGlyKS9hbnNpZGVjbC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9iZmRsaW5rLmggJChpbmNsdWRlZGlyKS9iZmRsaW5rLmgKLQotIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBiZmQuaAotCXJtIC1mIC5kZXAxCi0JJChNQUtFKSBERVA9JChERVApIC5kZXAxCi0Jc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi0jIFRoZSBOZXRCU0QgbWtkZXAgb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgZmlsZSBjb250ZW50cywgYW5kIGRvZXNuJ3QgaW5zZXJ0Ci0jIHRoZSAiRE8gTk9UIERFTEVURSIgbGluZS4KLSMgT3RoZXIgbWtkZXAgdmVyc2lvbnMgcmVxdWlyZSBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cywgYW5kIGRvIGluc2VydCBpdC4KLSMgSGVuY2UgdGhlIHdlaXJkbmVzcy4uLi4KLS5kZXAxOiAkKENGSUxFUykKLQlybSAtZiAuZGVwMiAuZGVwMmEKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JZWNobyA+IC5kZXAyYQotCSQoREVQKSAtZiAuZGVwMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/Ci0Jc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IC5kZXAyYSA+PiAuZGVwMgotCXJtIC1mIC5kZXAyYQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotaG9zdC1hb3V0LmxvOiBNYWtlZmlsZQotCi0jIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHNpbXBsZSBjb25maWcgZmlsZQotIyB3aGljaCBjYW4gYmUgZm9sZGVkIGludG8gYW4gaC1YWFggZmlsZSBmb3IgYSBuZXcgaG9zdCwgd2l0aCBzb21lIGVkaXRpbmcuCi1hb3V0LXBhcmFtcy5oOiBnZW4tYW91dAotCS4vZ2VuLWFvdXQgaG9zdCA+IGFvdXQtcGFyYW1zLmgKLWdlbi1hb3V0OiAkKHNyY2RpcikvZ2VuLWFvdXQuYyBNYWtlZmlsZQotCSQoQ0MpIC1vIGdlbi1hb3V0ICQoQ0ZMQUdTKSAkKExGTEFHUykgJChzcmNkaXIpL2dlbi1hb3V0LmMKLQotJChCRkRfSCk6IHN0bXAtYmZkLWggOyBAdHJ1ZQotCi1zdG1wLWJmZC1oOiBiZmQtaW4zLmgKLQlybSAtZiBiZmQtdG1wLmgKLQljcCBiZmQtaW4zLmggYmZkLXRtcC5oCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC10bXAuaCAkKEJGRF9IKQotCXJtIC1mIGJmZC10bXAuaAotCXRvdWNoIHN0bXAtYmZkLWgKLQotQkZEX0hfRklMRVMgPSBiZmQtaW4uaCBpbml0LmMgb3BuY2xzLmMgbGliYmZkLmMgc2VjdGlvbi5jIGFyY2h1cmVzLmMgXAotCXJlbG9jLmMgc3ltcy5jIGJmZC5jIGFyY2hpdmUuYyBjb3JlZmlsZS5jIHRhcmdldHMuYyBmb3JtYXQuYwotTElCQkZEX0hfRklMRVMgPSBsaWJiZmQtaW4uaCBpbml0LmMgbGliYmZkLmMgY2FjaGUuYyByZWxvYy5jIGFyY2h1cmVzLmMgZWxmLmMKLUxJQkNPRkZfSF9GSUxFUyA9IGxpYmNvZmYtaW4uaCBjb2ZmY29kZS5oCi0KLSMgQ291bGQgcmVhbGx5IHVzZSBhICJjb3B5LWlmLWNoYW5nZSIuLi4KLWhlYWRlcnM6Ci0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSBwcm90b3MgJChGTEFHU19UT19QQVNTKSkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0KLSMgV2Ugb25seSByZWJ1aWxkIHRoZSBoZWFkZXIgZmlsZXMgYXV0b21hdGljYWxseSBpZiB3ZSBoYXZlIGJlZW4KLSMgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLW1haW50YWluZXItbW9kZS4KLQotJChzcmNkaXIpL2JmZC1pbjIuaDogQE1BSU5UQCBzdG1wLWJpbjItaCA7IEB0cnVlCi1zdG1wLWJpbjItaDogJChCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYmZkLmgpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCi0JdG91Y2ggc3RtcC1iaW4yLWgKLQotJChzcmNkaXIpL2xpYmJmZC5oOiBATUFJTlRAIHN0bXAtbGJmZC1oIDsgQHRydWUKLXN0bXAtbGJmZC1oOiAkKExJQkJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJiZmQuaCkKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKLQl0b3VjaCBzdG1wLWxiZmQtaAotCi0kKHNyY2RpcikvbGliY29mZi5oOiBATUFJTlRAIHN0bXAtbGNvZmYtaCA7IEB0cnVlCi1zdG1wLWxjb2ZmLWg6ICQoTElCQ09GRl9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJjb2ZmLmgpCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAotCXRvdWNoIHN0bXAtbGNvZmYtaAotCi1NT1NUTFlDTEVBTkZJTEVTID0gZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0Lmggb2ZpbGVzIHN0YW1wLW9maWxlcyBcCi0JdGFyZ21hdGNoLmgKLQotQ0xFQU5GSUxFUyA9IGJmZC5oIGRlcC5zZWQgc3RtcC1iZmQtaCAuZGVwIC5kZXAxIGxpYmJmZC5hIHN0YW1wLWxpYiBcCi0Jc3RtcC1iaW4yLWggc3RtcC1sYmZkLWggc3RtcC1sY29mZi1oCi0KLSMgV2Ugd2FudCB0byByZXJ1biBjb25maWd1cmUgaWYgY29uZmlnLmJmZCBvciBjb25maWd1cmUuaG9zdCBjaGFuZ2UuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcuYmZkICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotCi1lbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyBlbGYzMi1hcm0uaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi1hcmNoaXZlLmxvOiBhcmNoaXZlLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYW91dC9yYW5saWIuaAotYXJjaHVyZXMubG86IGFyY2h1cmVzLmMKLWJmZC5sbzogYmZkLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWNhY2hlLmxvOiBjYWNoZS5jCi1jb2ZmZ2VuLmxvOiBjb2ZmZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1jb3JlZmlsZS5sbzogY29yZWZpbGUuYwotZm9ybWF0LmxvOiBmb3JtYXQuYwotaW5pdC5sbzogaW5pdC5jCi1saWJiZmQubG86IGxpYmJmZC5jCi1vcG5jbHMubG86IG9wbmNscy5jICQoSU5DRElSKS9vYmphbGxvYy5oCi1yZWxvYy5sbzogcmVsb2MuYyAkKElOQ0RJUikvYmZkbGluay5oCi1zZWN0aW9uLmxvOiBzZWN0aW9uLmMgJChJTkNESVIpL2JmZGxpbmsuaAotc3ltcy5sbzogc3ltcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgJChJTkNESVIpL2ZubWF0Y2guaCB0YXJnbWF0Y2guaAotaGFzaC5sbzogaGFzaC5jICQoSU5DRElSKS9vYmphbGxvYy5oCi1saW5rZXIubG86IGxpbmtlci5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oCi1zcmVjLmxvOiBzcmVjLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1iaW5hcnkubG86IGJpbmFyeS5jCi10ZWtoZXgubG86IHRla2hleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAotaWhleC5sbzogaWhleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAotc3RhYnMubG86IHN0YWJzLmMgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RhYi1zeW1zLmxvOiBzdGFiLXN5bXMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1jcHUtYTI5ay5sbzogY3B1LWEyOWsuYwotY3B1LWFscGhhLmxvOiBjcHUtYWxwaGEuYwotY3B1LWFyYy5sbzogY3B1LWFyYy5jCi1jcHUtYXJtLmxvOiBjcHUtYXJtLmMKLWNwdS1kMTB2LmxvOiBjcHUtZDEwdi5jCi1jcHUtZDMwdi5sbzogY3B1LWQzMHYuYwotY3B1LWZyMzAubG86IGNwdS1mcjMwLmMKLWNwdS1oODMwMC5sbzogY3B1LWg4MzAwLmMKLWNwdS1oODUwMC5sbzogY3B1LWg4NTAwLmMKLWNwdS1ocHBhLmxvOiBjcHUtaHBwYS5jCi1jcHUtaTM4Ni5sbzogY3B1LWkzODYuYwotY3B1LWk4NjAubG86IGNwdS1pODYwLmMKLWNwdS1pOTYwLmxvOiBjcHUtaTk2MC5jCi1jcHUtbTMyci5sbzogY3B1LW0zMnIuYwotY3B1LW02OGsubG86IGNwdS1tNjhrLmMKLWNwdS1tODhrLmxvOiBjcHUtbTg4ay5jCi1jcHUtbTEwMjAwLmxvOiBjcHUtbTEwMjAwLmMKLWNwdS1tMTAzMDAubG86IGNwdS1tMTAzMDAuYwotY3B1LW1jb3JlLmxvOiBjcHUtbWNvcmUuYwotY3B1LW1pcHMubG86IGNwdS1taXBzLmMKLWNwdS1uczMyay5sbzogY3B1LW5zMzJrLmMgbnMzMmsuaAotY3B1LXBvd2VycGMubG86IGNwdS1wb3dlcnBjLmMKLWNwdS1yczYwMDAubG86IGNwdS1yczYwMDAuYwotY3B1LXNoLmxvOiBjcHUtc2guYwotY3B1LXNwYXJjLmxvOiBjcHUtc3BhcmMuYwotY3B1LXRpYzMwLmxvOiBjcHUtdGljMzAuYwotY3B1LXRpYzgwLmxvOiBjcHUtdGljODAuYwotY3B1LXY4NTAubG86IGNwdS12ODUwLmMKLWNwdS12YXgubG86IGNwdS12YXguYwotY3B1LXdlMzJrLmxvOiBjcHUtd2UzMmsuYwotY3B1LXc2NS5sbzogY3B1LXc2NS5jCi1jcHUtejhrLmxvOiBjcHUtejhrLmMKLWFvdXQtYWRvYmUubG86IGFvdXQtYWRvYmUuYyAkKElOQ0RJUikvYW91dC9hZG9iZS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LWFybS5sbzogYW91dC1hcm0uYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXR4LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dC1uczMyay5sbzogYW91dC1uczMyay5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgbnMzMmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotYW91dC1zcGFyY2xlLmxvOiBhb3V0LXNwYXJjbGUuYyAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGliYW91dC5oIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAubG86IGFvdXQtdGljMzAuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oIGFvdXR4LmgKLWFvdXQwLmxvOiBhb3V0MC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWFvdXQzMi5sbzogYW91dDMyLmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1ib3V0LmxvOiBib3V0LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggJChJTkNESVIpL2JvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oCi1jZi1pMzg2bHlueC5sbzogY2YtaTM4Nmx5bnguYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1tNjhrbHlueC5sbzogY2YtbTY4a2x5bnguYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1zcGFyY2x5bngubG86IGNmLXNwYXJjbHlueC5jIGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hMjlrLmxvOiBjb2ZmLWEyOWsuYyAkKElOQ0RJUikvY29mZi9hMjlrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcG9sbG8ubG86IGNvZmYtYXBvbGxvLmMgJChJTkNESVIpL2NvZmYvYXBvbGxvLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWFybS5sbzogY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWF1eC5sbzogY29mZi1hdXguYyAkKElOQ0RJUikvY29mZi9hdXgtY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9tNjhrLmggY29mZi1tNjhrLmMgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDgzMDAubG86IGNvZmYtaDgzMDAuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDg1MDAubG86IGNvZmYtaDg1MDAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTM4Ni5sbzogY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTg2MC5sbzogY29mZi1pODYwLmMgJChJTkNESVIpL2NvZmYvaTg2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtZ28zMi5sbzogY29mZi1nbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pOTYwLmxvOiBjb2ZmLWk5NjAuYyAkKElOQ0RJUikvY29mZi9pOTYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1tNjhrLmxvOiBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1tODhrLmxvOiBjb2ZmLW04OGsuYyAkKElOQ0RJUikvY29mZi9tODhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1taXBzLmxvOiBjb2ZmLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9taXBzLmggbGliY29mZi5oIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBcCi0gIGVjb2Zmc3dhcC5oCi1jb2ZmLXBtYWMubG86IGNvZmYtcG1hYy5jIGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXJzNjAwMC5sbzogY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc2gubG86IGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3BhcmMubG86IGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zdGdvMzIubG86IGNvZmYtc3RnbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9nbzMyZXhlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAotICBnbzMyc3R1Yi5oCi1jb2ZmLXN2bTY4ay5sbzogY29mZi1zdm02OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzMwLmxvOiBjb2ZmLXRpYzMwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzgwLmxvOiBjb2ZmLXRpYzgwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXU2OGsubG86IGNvZmYtdTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtd2UzMmsubG86IGNvZmYtd2UzMmsuYyAkKElOQ0RJUikvY29mZi93ZTMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13NjUubG86IGNvZmYtdzY1LmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi93NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi16OGsubG86IGNvZmYtejhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi96OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZmxpbmsubG86IGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oCi1kd2FyZjEubG86IGR3YXJmMS5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYuaAotZHdhcmYyLmxvOiBkd2FyZjIuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5sbzogZWNvZmYuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FyLmggXAotICAkKElOQ0RJUikvYW91dC9yYW5saWIuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWNvZmZsaW5rLmxvOiBlY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYmphbGxvYy5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVsZi5sbzogZWxmLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVsZjMyLWFyYy5sbzogZWxmMzItYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jICQoSU5DRElSKS9lbGYvYXJtLW9hYmkuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi1hcm0uaCBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItYXJtLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZDEwdi5sbzogZWxmMzItZDEwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQzMHYubG86IGVsZjMyLWQzMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1mcjMwLmxvOiBlbGYzMi1mcjMwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2ZyMzAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1nZW4ubG86IGVsZjMyLWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWhwcGEubG86IGVsZjMyLWhwcGEuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZjMyLWhwcGEuaCBsaWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGhwcGFfc3R1YnMuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTM4Ni5sbzogZWxmMzItaTM4Ni5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9pMzg2LmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTg2MC5sbzogZWxmMzItaTg2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWk5NjAubG86IGVsZjMyLWk5NjAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvaTk2MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW0zMnIubG86IGVsZjMyLW0zMnIuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW02OGsubG86IGVsZjMyLW02OGsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW04OGsubG86IGVsZjMyLW04OGsuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMjAwLmxvOiBlbGYtbTEwMjAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmLW0xMDMwMC5sbzogZWxmLW0xMDMwMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tY29yZS5sbzogZWxmMzItbWNvcmUuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1pcHMubG86IGVsZjMyLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9taXBzLmggZWNvZmZzd2FwLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItcHBjLmxvOiBlbGYzMi1wcGMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItc2gubG86IGVsZjMyLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItc3BhcmMubG86IGVsZjMyLXNwYXJjLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi12ODUwLmxvOiBlbGYzMi12ODUwLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi5sbzogZWxmMzIuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1lbGZsaW5rLmxvOiBlbGZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVwb2MtcGUtYXJtLmxvOiBlcG9jLWVwLWFybS5jIHBlLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotZXBvYy1wZWktYXJtLmxvOiBlcG9jLXBlaS1hcm0uYyBwZWktYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1ocDMwMGJzZC5sbzogaHAzMDBic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWhwMzAwaHB1eC5sbzogaHAzMDBocHV4LmMgJChJTkNESVIpL2FvdXQvaHAzMDBocHV4LmggXAotICBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotc29tLmxvOiBzb20uYwotaTM4NmFvdXQubG86IGkzODZhb3V0LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2YnNkLmxvOiBpMzg2YnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2ZHluaXgubG86IGkzODZkeW5peC5jICQoSU5DRElSKS9hb3V0L2R5bml4My5oIGFvdXR4LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWkzODZmcmVlYnNkLmxvOiBpMzg2ZnJlZWJzZC5jIGZyZWVic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZsaW51eC5sbzogaTM4NmxpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1pMzg2bHlueC5sbzogaTM4Nmx5bnguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZtc2Rvcy5sbzogaTM4Nm1zZG9zLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWkzODZuZXRic2QubG86IGkzODZuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZtYWNoMy5sbzogaTM4Nm1hY2gzLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1pMzg2b3M5ay5sbzogaTM4Nm9zOWsuYyAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9vczlrLmgKLWllZWUubG86IGllZWUuYyAkKElOQ0RJUikvaWVlZS5oIGxpYmllZWUuaAotbTY4azRrbmV0YnNkLmxvOiBtNjhrNGtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW02OGtsaW51eC5sbzogbTY4a2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1tNjhrbHlueC5sbzogbTY4a2x5bnguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW02OGtuZXRic2QubG86IG02OGtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW04OGttYWNoMy5sbzogbTg4a21hY2gzLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1taXBzYnNkLmxvOiBtaXBzYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1uZXdzb3MzLmxvOiBuZXdzb3MzLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1ubG0ubG86IG5sbS5jIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1ubG0zMi1pMzg2LmxvOiBubG0zMi1pMzg2LmMgJChJTkNESVIpL25sbS9pMzg2LWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzItc3BhcmMubG86IG5sbTMyLXNwYXJjLmMgJChJTkNESVIpL25sbS9zcGFyYzMyLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzItcHBjLmxvOiBubG0zMi1wcGMuYyAkKElOQ0RJUikvbmxtL3BwYy1leHQuaCBsaWJubG0uaCBcCi0gICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBcCi0gIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLmxvOiBubG0zMi5jIG5sbWNvZGUuaCBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotbnMzMmtuZXRic2QubG86IG5zMzJrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1vYXN5cy5sbzogb2FzeXMuYyAkKElOQ0RJUikvb2FzeXMuaCBsaWJvYXN5cy5oCi1wYzUzMi1tYWNoLmxvOiBwYzUzMi1tYWNoLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1wZS1hcm0ubG86IHBlLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpLWFybS5sbzogcGVpLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGUtaTM4Ni5sbzogcGUtaTM4Ni5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktaTM4Ni5sbzogcGVpLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGUtbWNvcmUubG86IHBlLW1jb3JlLmMgY29mZi1tY29yZS5jICQoSU5DRElSKS9jb2ZmL21jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpLW1jb3JlLmxvOiBwZWktbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1wcGMubG86IHBlLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaS1wcGMubG86IHBlaS1wcGMuYyBjb2ZmLXBwYy5jICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wcGNib290LmxvOiBwcGNib290LmMKLXJlbG9jMTYubG86IHJlbG9jMTYuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oCi1yaXNjaXgubG86IHJpc2NpeC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotc3BhcmNsaW51eC5sbzogc3BhcmNsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotc3BhcmNseW54LmxvOiBzcGFyY2x5bnguYyAkKElOQ0RJUikvYW91dC9zdW40LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1zcGFyY25ldGJzZC5sbzogc3BhcmNuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXN1bm9zLmxvOiBzdW5vcy5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIGFvdXRmMS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXZheG5ldGJzZC5sbzogdmF4bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi12ZXJzYWRvcy5sbzogdmVyc2Fkb3MuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXZtcy5sbzogdm1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWdzZC5sbzogdm1zLWdzZC5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1oZHIubG86IHZtcy1oZHIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtbWlzYy5sbzogdm1zLW1pc2MuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtdGlyLmxvOiB2bXMtdGlyLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAoteGNvZmZsaW5rLmxvOiB4Y29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWFvdXQ2NC5sbzogYW91dDY0LmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1jb2ZmLWFscGhhLmxvOiBjb2ZmLWFscGhhLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBlY29mZnN3YXAuaAotZGVtbzY0LmxvOiBkZW1vNjQuYyBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWVsZjY0LWFscGhhLmxvOiBlbGY2NC1hbHBoYS5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVjb2Zmc3dhcC5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1nZW4ubG86IGVsZjY0LWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LW1pcHMubG86IGVsZjY0LW1pcHMuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBnZW5saW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggZWNvZmZzd2FwLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtc3BhcmMubG86IGVsZjY0LXNwYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC5sbzogZWxmNjQuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1ubG0zMi1hbHBoYS5sbzogbmxtMzItYWxwaGEuYyAkKElOQ0RJUikvbmxtL2FscGhhLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtNjQubG86IG5sbTY0LmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1haXgzODYtY29yZS5sbzogYWl4Mzg2LWNvcmUuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ocHV4LWNvcmUubG86IGhwdXgtY29yZS5jCi1pcml4LWNvcmUubG86IGlyaXgtY29yZS5jCi1seW54LWNvcmUubG86IGx5bngtY29yZS5jCi1vc2YtY29yZS5sbzogb3NmLWNvcmUuYwotc2NvNS1jb3JlLmxvOiBzY281LWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotdHJhZC1jb3JlLmxvOiB0cmFkLWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGhvc3RzL2kzODZsaW51eC5oCi1jaXNjby1jb3JlLmxvOiBjaXNjby1jb3JlLmMKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvYmZkL01ha2VmaWxlLmluIGIvYmZkL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2M4NGFhLi4wMDAwMDAwCi0tLSBhL2JmZC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE2MTkgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9IT1NUXzY0QklUX0xPTkcgPSBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLUJGRF9IT1NUXzY0X0JJVCA9IEBCRkRfSE9TVF82NF9CSVRACi1CRkRfSE9TVF82NF9CSVRfREVGSU5FRCA9IEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLUJGRF9IT1NUX1VfNjRfQklUID0gQEJGRF9IT1NUX1VfNjRfQklUQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotQ09SRUZJTEUgPSBAQ09SRUZJTEVACi1DT1JFRkxBRyA9IEBDT1JFRkxBR0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUVYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSERFRklORVMgPSBASERFRklORVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTk0gPSBATk1ACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1UREVGSU5FUyA9IEBUREVGSU5FU0AKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACi1XSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKLWFsbF9iYWNrZW5kcyA9IEBhbGxfYmFja2VuZHNACi1iZmRfYmFja2VuZHMgPSBAYmZkX2JhY2tlbmRzQAotYmZkX21hY2hpbmVzID0gQGJmZF9tYWNoaW5lc0AKLWwgPSBAbEAKLXRkZWZhdWx0cyA9IEB0ZGVmYXVsdHNACi13b3Jkc2l6ZSA9IEB3b3Jkc2l6ZUAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQotREVQID0gbWtkZXAKLQotU1VCRElSUyA9IGRvYyBwbwotCi1kb2NkaXIgPSBkb2MKLQotbGliX0xUTElCUkFSSUVTID0gbGliYmZkLmxhCi0KLSMgYmZkLmggZ29lcyBoZXJlLCBmb3Igbm93Ci1CRkRfSCA9IGJmZC5oCi0KLSMgSmltIEtpbmdkb24gbm90ZXM6Ci0jIFdyaXRpbmcgUy1yZWNvcmRzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbGwgKG9yIGF0IGxlYXN0IG1vc3QpCi0jICotKi1jb2ZmLCAqLSotYW91dCwgZXRjLiwgY29uZmlndXJhdGlvbnMsIGJlY2F1c2UgcGVvcGxlIHdpbGwgd2FudCB0bwotIyBiZSBhYmxlIHRvIHVzZSBvYmpjb3B5IHRvIGNyZWF0ZSBTLXJlY29yZHMuICAoUy1yZWNvcmRzIGFyZSBub3QgdXNlZnVsCi0jIGZvciB0aGUgZGVidWdnZXIsIHNvIGlmIHlvdSBhcmUgZG93bmxvYWRpbmcgdGhpbmdzIGFzIFMtcmVjb3JkcyB5b3UKLSMgbmVlZCB0d28gY29waWVzIG9mIHRoZSBleGVjdXRhYmxlLCBvbmUgdG8gZG93bmxvYWQgYW5kIG9uZSBmb3IgdGhlCi0jIGRlYnVnZ2VyKS4KLUJGRF9MSUJTID0gXAotCWFyY2hpdmUubG8gYXJjaHVyZXMubG8gYmZkLmxvIGNhY2hlLmxvIGNvZmZnZW4ubG8gY29yZWZpbGUubG8gXAotCWZvcm1hdC5sbyBpbml0LmxvIGxpYmJmZC5sbyBvcG5jbHMubG8gcmVsb2MubG8gXAotCXNlY3Rpb24ubG8gc3ltcy5sbyB0YXJnZXRzLmxvIGhhc2gubG8gbGlua2VyLmxvIFwKLQlzcmVjLmxvIGJpbmFyeS5sbyB0ZWtoZXgubG8gaWhleC5sbyBzdGFicy5sbyBzdGFiLXN5bXMubG8KLQotCi1CRkRfTElCU19DRklMRVMgPSBcCi0JYXJjaGl2ZS5jIGFyY2h1cmVzLmMgYmZkLmMgY2FjaGUuYyBjb2ZmZ2VuLmMgY29yZWZpbGUuYyBcCi0JZm9ybWF0LmMgaW5pdC5jIGxpYmJmZC5jIG9wbmNscy5jIHJlbG9jLmMgXAotCXNlY3Rpb24uYyBzeW1zLmMgdGFyZ2V0cy5jIGhhc2guYyBsaW5rZXIuYyBcCi0Jc3JlYy5jIGJpbmFyeS5jIHRla2hleC5jIGloZXguYyBzdGFicy5jIHN0YWItc3ltcy5jCi0KLQotIyBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGtlZXAgaW4gc3luYwotIyB3aXRoIHRoZSBkZWNscyBhbmQgaW5pdGlhbGl6ZXIgaW4gYXJjaHVyZXMuYy4KLUFMTF9NQUNISU5FUyA9IFwKLQljcHUtYTI5ay5sbyBcCi0JY3B1LWFscGhhLmxvIFwKLQljcHUtYXJjLmxvIFwKLQljcHUtYXJtLmxvIFwKLQljcHUtZDEwdi5sbyBcCi0JY3B1LWQzMHYubG8gXAotCWNwdS1mcjMwLmxvIFwKLQljcHUtaDgzMDAubG8gXAotCWNwdS1oODUwMC5sbyBcCi0JY3B1LWhwcGEubG8gXAotCWNwdS1pMzg2LmxvIFwKLQljcHUtaTg2MC5sbyBcCi0JY3B1LWk5NjAubG8gXAotCWNwdS1tMzJyLmxvIFwKLQljcHUtbTY4ay5sbyBcCi0JY3B1LW04OGsubG8gXAotCWNwdS1tMTAyMDAubG8gXAotCWNwdS1tMTAzMDAubG8gXAotCWNwdS1tY29yZS5sbyBcCi0JY3B1LW1pcHMubG8gXAotCWNwdS1uczMyay5sbyBcCi0JY3B1LXBvd2VycGMubG8gXAotCWNwdS1yczYwMDAubG8gXAotCWNwdS1zaC5sbyBcCi0JY3B1LXNwYXJjLmxvIFwKLQljcHUtdGljMzAubG8gXAotCWNwdS10aWM4MC5sbyBcCi0JY3B1LXY4NTAubG8gXAotCWNwdS12YXgubG8gXAotCWNwdS13ZTMyay5sbyBcCi0JY3B1LXc2NS5sbyBcCi0JY3B1LXo4ay5sbwotCi0KLUFMTF9NQUNISU5FU19DRklMRVMgPSBcCi0JY3B1LWEyOWsuYyBcCi0JY3B1LWFscGhhLmMgXAotCWNwdS1hcmMuYyBcCi0JY3B1LWFybS5jIFwKLQljcHUtZDEwdi5jIFwKLQljcHUtZDMwdi5jIFwKLQljcHUtZnIzMC5jIFwKLQljcHUtaDgzMDAuYyBcCi0JY3B1LWg4NTAwLmMgXAotCWNwdS1ocHBhLmMgXAotCWNwdS1pMzg2LmMgXAotCWNwdS1pODYwLmMgXAotCWNwdS1pOTYwLmMgXAotCWNwdS1tMzJyLmMgXAotCWNwdS1tNjhrLmMgXAotCWNwdS1tODhrLmMgXAotCWNwdS1tMTAyMDAuYyBcCi0JY3B1LW0xMDMwMC5jIFwKLQljcHUtbWNvcmUuYyBcCi0JY3B1LW1pcHMuYyBcCi0JY3B1LW5zMzJrLmMgXAotCWNwdS1wb3dlcnBjLmMgXAotCWNwdS1yczYwMDAuYyBcCi0JY3B1LXNoLmMgXAotCWNwdS1zcGFyYy5jIFwKLQljcHUtdGljMzAuYyBcCi0JY3B1LXRpYzgwLmMgXAotCWNwdS12ODUwLmMgXAotCWNwdS12YXguYyBcCi0JY3B1LXdlMzJrLmMgXAotCWNwdS13NjUuYyBcCi0JY3B1LXo4ay5jCi0KLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgMzIgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbC4KLUJGRDMyX0JBQ0tFTkRTID0gXAotCWFvdXQtYWRvYmUubG8gXAotCWFvdXQtYXJtLmxvIFwKLQlhb3V0LW5zMzJrLmxvIFwKLQlhb3V0LXNwYXJjbGUubG8gXAotCWFvdXQtdGljMzAubG8gXAotCWFvdXQwLmxvIFwKLQlhb3V0MzIubG8gXAotCWJvdXQubG8gXAotCWNmLWkzODZseW54LmxvIFwKLQljZi1tNjhrbHlueC5sbyBcCi0JY2Ytc3BhcmNseW54LmxvIFwKLQljb2ZmLWEyOWsubG8gXAotCWNvZmYtYXBvbGxvLmxvIFwKLQljb2ZmLWFybS5sbyBcCi0JY29mZi1hdXgubG8gXAotCWNvZmYtaDgzMDAubG8gXAotCWNvZmYtaDg1MDAubG8gXAotCWNvZmYtaTM4Ni5sbyBcCi0JY29mZi1nbzMyLmxvIFwKLQljb2ZmLWk4NjAubG8gXAotCWNvZmYtaTk2MC5sbyBcCi0JY29mZi1tNjhrLmxvIFwKLQljb2ZmLW04OGsubG8gXAotCWNvZmYtbWlwcy5sbyBcCi0JY29mZi1wbWFjLmxvIFwKLQljb2ZmLXJzNjAwMC5sbyBcCi0JY29mZi1zaC5sbyBcCi0JY29mZi1zcGFyYy5sbyBcCi0JY29mZi1zdGdvMzIubG8gXAotCWNvZmYtc3ZtNjhrLmxvIFwKLQljb2ZmLXRpYzMwLmxvIFwKLQljb2ZmLXRpYzgwLmxvIFwKLQljb2ZmLXU2OGsubG8gXAotCWNvZmYtd2UzMmsubG8gXAotCWNvZmYtdzY1LmxvIFwKLQljb2ZmLXo4ay5sbyBcCi0JY29mZmxpbmsubG8gXAotCWR3YXJmMS5sbyBcCi0JZHdhcmYyLmxvIFwKLQllY29mZi5sbyBcCi0JZWNvZmZsaW5rLmxvIFwKLQllbGYubG8gXAotCWVsZjMyLWFyYy5sbyBcCi0JZWxmYXJtLW9hYmkubG8gXAotCWVsZmFybS1uYWJpLmxvIFwKLQllbGYzMi1kMTB2LmxvIFwKLQllbGYzMi1kMzB2LmxvIFwKLQllbGYzMi1mcjMwLmxvIFwKLQllbGYzMi1nZW4ubG8gXAotCWVsZjMyLWhwcGEubG8gXAotCWVsZjMyLWkzODYubG8gXAotCWVsZjMyLWk4NjAubG8gXAotCWVsZjMyLWk5NjAubG8gXAotCWVsZjMyLW0zMnIubG8gXAotCWVsZjMyLW02OGsubG8gXAotCWVsZjMyLW04OGsubG8gXAotCWVsZi1tMTAyMDAubG8gXAotCWVsZi1tMTAzMDAubG8gXAotCWVsZjMyLW1jb3JlLmxvIFwKLQllbGYzMi1taXBzLmxvIFwKLQllbGYzMi1wcGMubG8gXAotCWVsZjMyLXNoLmxvIFwKLQllbGYzMi1zcGFyYy5sbyBcCi0JZWxmMzItdjg1MC5sbyBcCi0JZWxmMzIubG8gXAotCWVsZmxpbmsubG8gXAotCWVwb2MtcGUtYXJtLmxvIFwKLQllcG9jLXBlaS1hcm0ubG8gXAotCWhwMzAwYnNkLmxvIFwKLQlocDMwMGhwdXgubG8gXAotCXNvbS5sbyBcCi0JaTM4NmFvdXQubG8gXAotCWkzODZic2QubG8gXAotCWkzODZkeW5peC5sbyBcCi0JaTM4NmZyZWVic2QubG8gXAotCWkzODZsaW51eC5sbyBcCi0JaTM4Nmx5bngubG8gXAotCWkzODZtc2Rvcy5sbyBcCi0JaTM4Nm5ldGJzZC5sbyBcCi0JaTM4Nm1hY2gzLmxvIFwKLQlpMzg2b3M5ay5sbyBcCi0JaWVlZS5sbyBcCi0JbTY4azRrbmV0YnNkLmxvIFwKLQltNjhrbGludXgubG8gXAotCW02OGtseW54LmxvIFwKLQltNjhrbmV0YnNkLmxvIFwKLQltODhrbWFjaDMubG8gXAotCW1pcHNic2QubG8gXAotCW5ld3NvczMubG8gXAotCW5sbS5sbyBcCi0JbmxtMzItaTM4Ni5sbyBcCi0JbmxtMzItc3BhcmMubG8gXAotCW5sbTMyLXBwYy5sbyBcCi0JbmxtMzIubG8gXAotCW5zMzJrbmV0YnNkLmxvIFwKLQlvYXN5cy5sbyBcCi0JcGM1MzItbWFjaC5sbyBcCi0JcGUtYXJtLmxvIFwKLQlwZWktYXJtLmxvIFwKLQlwZS1pMzg2LmxvIFwKLQlwZWktaTM4Ni5sbyBcCi0JcGUtbWNvcmUubG8gXAotCXBlaS1tY29yZS5sbyBcCi0JcGUtcHBjLmxvIFwKLQlwZWktcHBjLmxvIFwKLQlwcGNib290LmxvIFwKLQlyZWxvYzE2LmxvIFwKLQlyaXNjaXgubG8gXAotCXNwYXJjbGludXgubG8gXAotCXNwYXJjbHlueC5sbyBcCi0Jc3BhcmNuZXRic2QubG8gXAotCXN1bm9zLmxvIFwKLQl2YXhuZXRic2QubG8gXAotCXZlcnNhZG9zLmxvIFwKLQl2bXMubG8gXAotCXZtcy1nc2QubG8gXAotCXZtcy1oZHIubG8gXAotCXZtcy1taXNjLmxvIFwKLQl2bXMtdGlyLmxvIFwKLQl4Y29mZmxpbmsubG8KLQotCi1CRkQzMl9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dC1hZG9iZS5jIFwKLQlhb3V0LWFybS5jIFwKLQlhb3V0LW5zMzJrLmMgXAotCWFvdXQtc3BhcmNsZS5jIFwKLQlhb3V0LXRpYzMwLmMgXAotCWFvdXQwLmMgXAotCWFvdXQzMi5jIFwKLQlib3V0LmMgXAotCWNmLWkzODZseW54LmMgXAotCWNmLW02OGtseW54LmMgXAotCWNmLXNwYXJjbHlueC5jIFwKLQljb2ZmLWEyOWsuYyBcCi0JY29mZi1hcG9sbG8uYyBcCi0JY29mZi1hcm0uYyBcCi0JY29mZi1hdXguYyBcCi0JY29mZi1oODMwMC5jIFwKLQljb2ZmLWg4NTAwLmMgXAotCWNvZmYtaTM4Ni5jIFwKLQljb2ZmLWk4NjAuYyBcCi0JY29mZi1nbzMyLmMgXAotCWNvZmYtaTk2MC5jIFwKLQljb2ZmLW02OGsuYyBcCi0JY29mZi1tODhrLmMgXAotCWNvZmYtbWlwcy5jIFwKLQljb2ZmLXBtYWMuYyBcCi0JY29mZi1yczYwMDAuYyBcCi0JY29mZi1zaC5jIFwKLQljb2ZmLXNwYXJjLmMgXAotCWNvZmYtc3RnbzMyLmMgXAotCWNvZmYtc3ZtNjhrLmMgXAotCWNvZmYtdGljMzAuYyBcCi0JY29mZi10aWM4MC5jIFwKLQljb2ZmLXU2OGsuYyBcCi0JY29mZi13ZTMyay5jIFwKLQljb2ZmLXc2NS5jIFwKLQljb2ZmLXo4ay5jIFwKLQljb2ZmbGluay5jIFwKLQlkd2FyZjEuYyBcCi0JZHdhcmYyLmMgXAotCWVjb2ZmLmMgXAotCWVjb2ZmbGluay5jIFwKLQllbGYuYyBcCi0JZWxmMzItYXJjLmMgXAotCWVsZmFybS1vYWJpLmMgXAotCWVsZmFybS1uYWJpLmMgXAotCWVsZjMyLWQxMHYuYyBcCi0JZWxmMzItZDMwdi5jIFwKLQllbGYzMi1mcjMwLmMgXAotCWVsZjMyLWdlbi5jIFwKLQllbGYzMi1ocHBhLmMgXAotCWVsZjMyLWkzODYuYyBcCi0JZWxmMzItaTg2MC5jIFwKLQllbGYzMi1pOTYwLmMgXAotCWVsZjMyLW0zMnIuYyBcCi0JZWxmMzItbTY4ay5jIFwKLQllbGYzMi1tODhrLmMgXAotCWVsZi1tMTAyMDAuYyBcCi0JZWxmLW0xMDMwMC5jIFwKLQllbGYzMi1tY29yZS5jIFwKLQllbGYzMi1taXBzLmMgXAotCWVsZjMyLXBwYy5jIFwKLQllbGYzMi1zaC5jIFwKLQllbGYzMi1zcGFyYy5jIFwKLQllbGYzMi12ODUwLmMgXAotCWVsZjMyLmMgXAotCWVsZmxpbmsuYyBcCi0JZXBvYy1wZS1hcm0uYyBcCi0JZXBvYy1wZWktYXJtLmMgXAotCWhwMzAwYnNkLmMgXAotCWhwMzAwaHB1eC5jIFwKLQlzb20uYyBcCi0JaTM4NmFvdXQuYyBcCi0JaTM4NmJzZC5jIFwKLQlpMzg2ZHluaXguYyBcCi0JaTM4NmZyZWVic2QuYyBcCi0JaTM4NmxpbnV4LmMgXAotCWkzODZseW54LmMgXAotCWkzODZtc2Rvcy5jIFwKLQlpMzg2bmV0YnNkLmMgXAotCWkzODZtYWNoMy5jIFwKLQlpMzg2b3M5ay5jIFwKLQlpZWVlLmMgXAotCW02OGs0a25ldGJzZC5jIFwKLQltNjhrbGludXguYyBcCi0JbTY4a2x5bnguYyBcCi0JbTY4a25ldGJzZC5jIFwKLQltODhrbWFjaDMuYyBcCi0JbWlwc2JzZC5jIFwKLQluZXdzb3MzLmMgXAotCW5sbS5jIFwKLQlubG0zMi1pMzg2LmMgXAotCW5sbTMyLXNwYXJjLmMgXAotCW5sbTMyLXBwYy5jIFwKLQlubG0zMi5jIFwKLQluczMya25ldGJzZC5jIFwKLQlvYXN5cy5jIFwKLQlwYzUzMi1tYWNoLmMgXAotCXBlLWFybS5jIFwKLQlwZWktYXJtLmMgXAotCXBlLWkzODYuYyBcCi0JcGVpLWkzODYuYyBcCi0JcGUtbWNvcmUuYyBcCi0JcGVpLW1jb3JlLmMgXAotCXBlLXBwYy5jIFwKLQlwZWktcHBjLmMgXAotCXBwY2Jvb3QuYyBcCi0JcmVsb2MxNi5jIFwKLQlyaXNjaXguYyBcCi0Jc3BhcmNsaW51eC5jIFwKLQlzcGFyY2x5bnguYyBcCi0Jc3BhcmNuZXRic2QuYyBcCi0Jc3Vub3MuYyBcCi0JdmF4bmV0YnNkLmMgXAotCXZlcnNhZG9zLmMgXAotCXZtcy5jIFwKLQl2bXMtZ3NkLmMgXAotCXZtcy1oZHIuYyBcCi0Jdm1zLW1pc2MuYyBcCi0Jdm1zLXRpci5jIFwKLQl4Y29mZmxpbmsuYwotCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDY0IGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwKLSMgYW5kIC0tZW5hYmxlLTY0LWJpdC1iZmQuCi1CRkQ2NF9CQUNLRU5EUyA9IFwKLQlhb3V0NjQubG8gXAotCWNvZmYtYWxwaGEubG8gXAotCWRlbW82NC5sbyBcCi0JZWxmNjQtYWxwaGEubG8gXAotCWVsZjY0LWdlbi5sbyBcCi0JZWxmNjQtbWlwcy5sbyBcCi0JZWxmNjQtc3BhcmMubG8gXAotCWVsZjY0LmxvIFwKLQlubG0zMi1hbHBoYS5sbyBcCi0JbmxtNjQubG8KLQotCi1CRkQ2NF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dDY0LmMgXAotCWNvZmYtYWxwaGEuYyBcCi0JZGVtbzY0LmMgXAotCWVsZjY0LWFscGhhLmMgXAotCWVsZjY0LWdlbi5jIFwKLQllbGY2NC1taXBzLmMgXAotCWVsZjY0LXNwYXJjLmMgXAotCWVsZjY0LmMgXAotCW5sbTMyLWFscGhhLmMgXAotCW5sbTY0LmMKLQotCi1PUFRJT05BTF9CQUNLRU5EUyA9IFwKLQlhaXgzODYtY29yZS5sbyBcCi0JaHB1eC1jb3JlLmxvIFwKLQlpcml4LWNvcmUubG8gXAotCWx5bngtY29yZS5sbyBcCi0Jb3NmLWNvcmUubG8gXAotCXNjbzUtY29yZS5sbyBcCi0JdHJhZC1jb3JlLmxvIFwKLQljaXNjby1jb3JlLmxvCi0KLQotT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFpeDM4Ni1jb3JlLmMgXAotCWhwdXgtY29yZS5jIFwKLQlpcml4LWNvcmUuYyBcCi0JbHlueC1jb3JlLmMgXAotCW9zZi1jb3JlLmMgXAotCXNjbzUtY29yZS5jIFwKLQl0cmFkLWNvcmUuYyBcCi0JY2lzY28tY29yZS5jCi0KLQotIyBUaGVzZSBhcmUgZGVmaW5lZCBieSBjb25maWd1cmUuaW46Ci1XT1JEU0laRSA9IEB3b3Jkc2l6ZUAKLUFMTF9CQUNLRU5EUyA9IEBhbGxfYmFja2VuZHNACi1CRkRfQkFDS0VORFMgPSBAYmZkX2JhY2tlbmRzQAotQkZEX01BQ0hJTkVTID0gQGJmZF9tYWNoaW5lc0AKLVRERUZBVUxUUyA9IEB0ZGVmYXVsdHNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSBASERFRklORVNAIEBDT1JFRkxBR0AgQFRERUZJTkVTQCAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCSQoQkZEX0xJQlNfQ0ZJTEVTKSBcCi0JJChBTExfTUFDSElORVNfQ0ZJTEVTKSBcCi0JJChCRkQzMl9CQUNLRU5EU19DRklMRVMpIFwKLQkkKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKQotCi0KLVNPVVJDRV9IRklMRVMgPSBcCi0JYW91dC10YXJnZXQuaCBhb3V0ZjEuaCBhb3V0eC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0JZWNvZmZzd2FwLmggZWxmMzItYXJtLmggZWxmMzItaHBwYS5oIGVsZmNvZGUuaCBlbGZjb3JlLmggXAotCWVsZmxpbmsuaCBmcmVlYnNkLmggZ2VubGluay5oIGdvMzJzdHViLmggaHBwYV9zdHVicy5oIGxpYmFvdXQuaCBcCi0JbGliYmZkLmggbGliY29mZi5oIGxpYmVjb2ZmLmggZWxmLWJmZC5oIGxpYmhwcGEuaCBsaWJpZWVlLmggXAotCWxpYm5sbS5oIGxpYm9hc3lzLmggbmV0YnNkLmggbmxtLXRhcmdldC5oIG5sbWNvZGUuaCBubG1zd2FwLmggXAotCW5zMzJrLmggcGVpY29kZS5oIHNvbS5oIHZtcy5oCi0KLQotSEZJTEVTID0gXAotCWVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIHRhcmdtYXRjaC5oIFwKLQkkKFNPVVJDRV9IRklMRVMpCi0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQotCi0jIFZhcmlvdXMga2luZHMgb2YgLm8gZmlsZXMgdG8gcHV0IGluIGxpYmJmZC5hOgotIyBCRkRfQkFDS0VORFMJUm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBCRkRfTUFDSElORVMJQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQ09SRUZJTEUJQ29yZSBmaWxlIHJvdXRpbmVzIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uCi1PRklMRVMgPSAkKEJGRF9CQUNLRU5EUykgJChCRkRfTUFDSElORVMpIEBDT1JFRklMRUAKLQotbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKLWxpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCi1saWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKLWxpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKLSMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKLSMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgotIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCi1saWJiZmRfYV9TT1VSQ0VTID0gCi0KLUJGRF9IX0RFUFMgPSAkKElOQ0RJUikvYW5zaWRlY2wuaAotTE9DQUxfSF9ERVBTID0gbGliYmZkLmggc3lzZGVwLmggY29uZmlnLmgKLQotQkZEX0hfRklMRVMgPSBiZmQtaW4uaCBpbml0LmMgb3BuY2xzLmMgbGliYmZkLmMgc2VjdGlvbi5jIGFyY2h1cmVzLmMgXAotCXJlbG9jLmMgc3ltcy5jIGJmZC5jIGFyY2hpdmUuYyBjb3JlZmlsZS5jIHRhcmdldHMuYyBmb3JtYXQuYwotCi1MSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYwotTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKLQotTU9TVExZQ0xFQU5GSUxFUyA9IGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIG9maWxlcyBzdGFtcC1vZmlsZXMgXAotCXRhcmdtYXRjaC5oCi0KLQotQ0xFQU5GSUxFUyA9IGJmZC5oIGRlcC5zZWQgc3RtcC1iZmQtaCAuZGVwIC5kZXAxIGxpYmJmZC5hIHN0YW1wLWxpYiBcCi0Jc3RtcC1iaW4yLWggc3RtcC1sYmZkLWggc3RtcC1sY29mZi1oCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gIGJmZC1pbjMuaAotTElCUkFSSUVTID0gICQobm9pbnN0X0xJQlJBUklFUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotbGliYmZkX2FfTElCQUREID0gCi1saWJiZmRfYV9PQkpFQ1RTID0gCi1MVExJQlJBUklFUyA9ICAkKGxpYl9MVExJQlJBUklFUykKLQotbGliYmZkX2xhX09CSkVDVFMgPSAgYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBcCi1jb3JlZmlsZS5sbyBmb3JtYXQubG8gaW5pdC5sbyBsaWJiZmQubG8gb3BuY2xzLmxvIHJlbG9jLmxvIHNlY3Rpb24ubG8gXAotc3ltcy5sbyB0YXJnZXRzLmxvIGhhc2gubG8gbGlua2VyLmxvIHNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBcCi1paGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENPUFlJTkcgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIFwKLU1ha2VmaWxlLmluIFRPRE8gYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgYmZkLWluMi5oIGNvbmZpZy5pbiBjb25maWd1cmUgXAotY29uZmlndXJlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGxpYmJmZF9hX1NPVVJDRVMpICQobGliYmZkX2xhX1NPVVJDRVMpCi1PQkpFQ1RTID0gJChsaWJiZmRfYV9PQkpFQ1RTKSAkKGxpYmJmZF9sYV9PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubG8gLm8gLnMKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci1iZmQtaW4zLmg6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIGJmZC1pbjIuaAotCWNkICQodG9wX2J1aWxkZGlyKSAmJiBDT05GSUdfRklMRVM9JEA6YmZkLWluMi5oIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKLQotZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1jbGVhbi1saWJMVExJQlJBUklFUzoKLQktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKLQotZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICAkKExJQlRPT0wpICAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCi0JZG9uZQotCi1saWJiZmQubGE6ICQobGliYmZkX2xhX09CSkVDVFMpICQobGliYmZkX2xhX0RFUEVOREVOQ0lFUykKLQkkKExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJiZmRfbGFfTERGTEFHUykgJChsaWJiZmRfbGFfT0JKRUNUUykgJChsaWJiZmRfbGFfTElCQUREKSAkKExJQlMpCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotaW5mby1hbToKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06Ci1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWRhdGEtbG9jYWwKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpICQoTFRMSUJSQVJJRVMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGxpYmRpcikKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLQkJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIFwKLQkJbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVMgbW9zdGx5Y2xlYW4tdGFncyBcCi0JCW1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIFwKLQkJY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIFwKLQkJbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgZGlzdGNsZWFuLWNvbXBpbGUgXAotCQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgXAotCQlkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCi0JCW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVMgbWFpbnRhaW5lci1jbGVhbi10YWdzIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLWNsZWFuLW5vaW5zdExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVMgXAotZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVMgdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKLWluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgaW5mby1hbSBpbmZvIFwKLWR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBpbnN0YWxsLWluZm8tYW0gXAotaW5zdGFsbC1pbmZvIGFsbC1yZWN1cnNpdmUtYW0gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtbG9jYWwgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgXAotdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBhbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBcCi1pbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgXAotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIG1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotZGlzdHN0dWZmOiBpbmZvCi0KLXN0YW1wLW9maWxlczogTWFrZWZpbGUKLQlybSAtZiB0b2ZpbGVzCi0JZj0iIjsgXAotCWZvciBpIGluICQoT0ZJTEVTKSA7IGRvIFwKLQkgIGNhc2UgIiAkJGYgIiBpbiBcCi0JICAgICoiICQkaSAiKikgOzsgXAotCSAgICAqKSBmPSIkJGYgJCRpIiA7OyBcCi0JICBlc2FjIDsgXAotCWRvbmUgOyBcCi0JZWNobyAkJGYgPiB0b2ZpbGVzCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRvZmlsZXMgb2ZpbGVzCi0JdG91Y2ggc3RhbXAtb2ZpbGVzCi0KLW9maWxlczogc3RhbXAtb2ZpbGVzIDsgQHRydWUKLQotc3RhbXAtbGliOiBsaWJiZmQubGEKLQlpZiBbIC1mIC5saWJzL2xpYmJmZC5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGliYmZkLmEgbGliYmZkLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLmE7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtbGliCi0KLWxpYmJmZC5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotCi0jIFRoaXMgZmlsZSBob2xkcyBhbiBhcnJheSBhc3NvY2lhdGluZyBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFuZAotIyB2ZWN0b3IgbmFtZXMuICBJdCBpcyBidWlsdCBmcm9tIGNvbmZpZy5iZmQuICBJdCBpcyBub3QgY29tcGlsZWQgYnkKLSMgaXRzZWxmLCBidXQgaXMgaW5jbHVkZWQgYnkgdGFyZ2V0cy5jLgotdGFyZ21hdGNoLmg6IGNvbmZpZy5iZmQgdGFyZ21hdGNoLnNlZAotCXJtIC1mIHRhcmdtYXRjaC5oCi0Jc2VkIC1mICQoc3JjZGlyKS90YXJnbWF0Y2guc2VkIDwgJChzcmNkaXIpL2NvbmZpZy5iZmQgPiB0YXJnbWF0Y2gubmV3Ci0JbXYgLWYgdGFyZ21hdGNoLm5ldyB0YXJnbWF0Y2guaAotCi0jIFdoZW4gY29tcGlsaW5nIGFyY2h1cmVzLmMgYW5kIHRhcmdldHMuYywgc3VwcGx5IHRoZSBkZWZhdWx0IHRhcmdldAotIyBpbmZvIGZyb20gY29uZmlndXJlLgotCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgY29uZmlnLnN0YXR1cwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkKFRERUZBVUxUUykgJChzcmNkaXIpL3RhcmdldHMuYwotCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvYXJjaHVyZXMuYwotCi1lbGYzMi10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmMzItdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi8zMi9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmMzItdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjMyLXRhcmdldC5uZXcgZWxmMzItdGFyZ2V0LmgKLQotZWxmNjQtdGFyZ2V0LmggOiBlbGZ4eC10YXJnZXQuaAotCXJtIC1mIGVsZjY0LXRhcmdldC5oCi0Jc2VkIC1lIHMvTk4vNjQvZyA8ICQoc3JjZGlyKS9lbGZ4eC10YXJnZXQuaCA+IGVsZjY0LXRhcmdldC5uZXcKLQltdiAtZiBlbGY2NC10YXJnZXQubmV3IGVsZjY0LXRhcmdldC5oCi0kKEJGRF9MSUJTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX01BQ0hJTkVTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX0JBQ0tFTkRTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoT1BUSU9OQUxfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotCi0jIEluc3RhbGwgQkZEIGluY2x1ZGUgZmlsZSwgYW5kIG90aGVycyB0aGF0IGl0IG5lZWRzLgotaW5zdGFsbC1kYXRhLWxvY2FsOiAkKEJGRF9IKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChpbmNsdWRlZGlyKQotCSQoSU5TVEFMTF9EQVRBKSAkKEJGRF9IKSAkKGluY2x1ZGVkaXIpL2JmZC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9hbnNpZGVjbC5oICQoaW5jbHVkZWRpcikvYW5zaWRlY2wuaAotCSQoSU5TVEFMTF9EQVRBKSAkKElOQ0RJUikvYmZkbGluay5oICQoaW5jbHVkZWRpcikvYmZkbGluay5oCi0KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIC5kZXAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi0uZGVwOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgYmZkLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwuZGVwMSA+LmRlcAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotIyBUaGUgTmV0QlNEIG1rZGVwIG92ZXJ3cml0ZXMgYW55IGV4aXN0aW5nIGZpbGUgY29udGVudHMsIGFuZCBkb2Vzbid0IGluc2VydAotIyB0aGUgIkRPIE5PVCBERUxFVEUiIGxpbmUuCi0jIE90aGVyIG1rZGVwIHZlcnNpb25zIHJlcXVpcmUgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMsIGFuZCBkbyBpbnNlcnQgaXQuCi0jIEhlbmNlIHRoZSB3ZWlyZG5lc3MuLi4uCi0uZGVwMTogJChDRklMRVMpCi0Jcm0gLWYgLmRlcDIgLmRlcDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgotCWVjaG8gPiAuZGVwMmEKLQkkKERFUCkgLWYgLmRlcDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCAuZGVwMmEgPj4gLmRlcDIKLQlybSAtZiAuZGVwMmEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLWhvc3QtYW91dC5sbzogTWFrZWZpbGUKLQotIyBUaGUgZm9sbG93aW5nIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBzaW1wbGUgY29uZmlnIGZpbGUKLSMgd2hpY2ggY2FuIGJlIGZvbGRlZCBpbnRvIGFuIGgtWFhYIGZpbGUgZm9yIGEgbmV3IGhvc3QsIHdpdGggc29tZSBlZGl0aW5nLgotYW91dC1wYXJhbXMuaDogZ2VuLWFvdXQKLQkuL2dlbi1hb3V0IGhvc3QgPiBhb3V0LXBhcmFtcy5oCi1nZW4tYW91dDogJChzcmNkaXIpL2dlbi1hb3V0LmMgTWFrZWZpbGUKLQkkKENDKSAtbyBnZW4tYW91dCAkKENGTEFHUykgJChMRkxBR1MpICQoc3JjZGlyKS9nZW4tYW91dC5jCi0KLSQoQkZEX0gpOiBzdG1wLWJmZC1oIDsgQHRydWUKLQotc3RtcC1iZmQtaDogYmZkLWluMy5oCi0Jcm0gLWYgYmZkLXRtcC5oCi0JY3AgYmZkLWluMy5oIGJmZC10bXAuaAotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtdG1wLmggJChCRkRfSCkKLQlybSAtZiBiZmQtdG1wLmgKLQl0b3VjaCBzdG1wLWJmZC1oCi0KLSMgQ291bGQgcmVhbGx5IHVzZSBhICJjb3B5LWlmLWNoYW5nZSIuLi4KLWhlYWRlcnM6Ci0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSBwcm90b3MgJChGTEFHU19UT19QQVNTKSkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0KLSMgV2Ugb25seSByZWJ1aWxkIHRoZSBoZWFkZXIgZmlsZXMgYXV0b21hdGljYWxseSBpZiB3ZSBoYXZlIGJlZW4KLSMgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLW1haW50YWluZXItbW9kZS4KLQotJChzcmNkaXIpL2JmZC1pbjIuaDogQE1BSU5UQCBzdG1wLWJpbjItaCA7IEB0cnVlCi1zdG1wLWJpbjItaDogJChCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYmZkLmgpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCi0JdG91Y2ggc3RtcC1iaW4yLWgKLQotJChzcmNkaXIpL2xpYmJmZC5oOiBATUFJTlRAIHN0bXAtbGJmZC1oIDsgQHRydWUKLXN0bXAtbGJmZC1oOiAkKExJQkJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJiZmQuaCkKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKLQl0b3VjaCBzdG1wLWxiZmQtaAotCi0kKHNyY2RpcikvbGliY29mZi5oOiBATUFJTlRAIHN0bXAtbGNvZmYtaCA7IEB0cnVlCi1zdG1wLWxjb2ZmLWg6ICQoTElCQ09GRl9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJjb2ZmLmgpCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAotCXRvdWNoIHN0bXAtbGNvZmYtaAotCi0jIFdlIHdhbnQgdG8gcmVydW4gY29uZmlndXJlIGlmIGNvbmZpZy5iZmQgb3IgY29uZmlndXJlLmhvc3QgY2hhbmdlLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlnLmJmZCAkKHNyY2RpcikvY29uZmlndXJlLmhvc3QKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgZWxmMzItYXJtLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWFyY2hpdmUubG86IGFyY2hpdmUuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYwotYmZkLmxvOiBiZmQuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotY2FjaGUubG86IGNhY2hlLmMKLWNvZmZnZW4ubG86IGNvZmZnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWNvcmVmaWxlLmxvOiBjb3JlZmlsZS5jCi1mb3JtYXQubG86IGZvcm1hdC5jCi1pbml0LmxvOiBpbml0LmMKLWxpYmJmZC5sbzogbGliYmZkLmMKLW9wbmNscy5sbzogb3BuY2xzLmMgJChJTkNESVIpL29iamFsbG9jLmgKLXJlbG9jLmxvOiByZWxvYy5jICQoSU5DRElSKS9iZmRsaW5rLmgKLXNlY3Rpb24ubG86IHNlY3Rpb24uYyAkKElOQ0RJUikvYmZkbGluay5oCi1zeW1zLmxvOiBzeW1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXRhcmdldHMubG86IHRhcmdldHMuYyAkKElOQ0RJUikvZm5tYXRjaC5oIHRhcmdtYXRjaC5oCi1oYXNoLmxvOiBoYXNoLmMgJChJTkNESVIpL29iamFsbG9jLmgKLWxpbmtlci5sbzogbGlua2VyLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmgKLXNyZWMubG86IHNyZWMuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJpbmFyeS5sbzogYmluYXJ5LmMKLXRla2hleC5sbzogdGVraGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1paGV4LmxvOiBpaGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdGFicy5sbzogc3RhYnMuYyAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdGFiLXN5bXMubG86IHN0YWItc3ltcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLWNwdS1hMjlrLmxvOiBjcHUtYTI5ay5jCi1jcHUtYWxwaGEubG86IGNwdS1hbHBoYS5jCi1jcHUtYXJjLmxvOiBjcHUtYXJjLmMKLWNwdS1hcm0ubG86IGNwdS1hcm0uYwotY3B1LWQxMHYubG86IGNwdS1kMTB2LmMKLWNwdS1kMzB2LmxvOiBjcHUtZDMwdi5jCi1jcHUtZnIzMC5sbzogY3B1LWZyMzAuYwotY3B1LWg4MzAwLmxvOiBjcHUtaDgzMDAuYwotY3B1LWg4NTAwLmxvOiBjcHUtaDg1MDAuYwotY3B1LWhwcGEubG86IGNwdS1ocHBhLmMKLWNwdS1pMzg2LmxvOiBjcHUtaTM4Ni5jCi1jcHUtaTg2MC5sbzogY3B1LWk4NjAuYwotY3B1LWk5NjAubG86IGNwdS1pOTYwLmMKLWNwdS1tMzJyLmxvOiBjcHUtbTMyci5jCi1jcHUtbTY4ay5sbzogY3B1LW02OGsuYwotY3B1LW04OGsubG86IGNwdS1tODhrLmMKLWNwdS1tMTAyMDAubG86IGNwdS1tMTAyMDAuYwotY3B1LW0xMDMwMC5sbzogY3B1LW0xMDMwMC5jCi1jcHUtbWNvcmUubG86IGNwdS1tY29yZS5jCi1jcHUtbWlwcy5sbzogY3B1LW1pcHMuYwotY3B1LW5zMzJrLmxvOiBjcHUtbnMzMmsuYyBuczMyay5oCi1jcHUtcG93ZXJwYy5sbzogY3B1LXBvd2VycGMuYwotY3B1LXJzNjAwMC5sbzogY3B1LXJzNjAwMC5jCi1jcHUtc2gubG86IGNwdS1zaC5jCi1jcHUtc3BhcmMubG86IGNwdS1zcGFyYy5jCi1jcHUtdGljMzAubG86IGNwdS10aWMzMC5jCi1jcHUtdGljODAubG86IGNwdS10aWM4MC5jCi1jcHUtdjg1MC5sbzogY3B1LXY4NTAuYwotY3B1LXZheC5sbzogY3B1LXZheC5jCi1jcHUtd2UzMmsubG86IGNwdS13ZTMyay5jCi1jcHUtdzY1LmxvOiBjcHUtdzY1LmMKLWNwdS16OGsubG86IGNwdS16OGsuYwotYW91dC1hZG9iZS5sbzogYW91dC1hZG9iZS5jICQoSU5DRElSKS9hb3V0L2Fkb2JlLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtYXJtLmxvOiBhb3V0LWFybS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dHguaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0LW5zMzJrLmxvOiBhb3V0LW5zMzJrLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBuczMyay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LXNwYXJjbGUubG86IGFvdXQtc3BhcmNsZS5jICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotYW91dC10aWMzMC5sbzogYW91dC10aWMzMC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dHguaAotYW91dDAubG86IGFvdXQwLmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dDMyLmxvOiBhb3V0MzIuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWJvdXQubG86IGJvdXQuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCAkKElOQ0RJUikvYm91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmgKLWNmLWkzODZseW54LmxvOiBjZi1pMzg2bHlueC5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLW02OGtseW54LmxvOiBjZi1tNjhrbHlueC5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLXNwYXJjbHlueC5sbzogY2Ytc3BhcmNseW54LmMgY29mZi1zcGFyYy5jICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWEyOWsubG86IGNvZmYtYTI5ay5jICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWFwb2xsby5sbzogY29mZi1hcG9sbG8uYyAkKElOQ0RJUikvY29mZi9hcG9sbG8uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXJtLmxvOiBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXV4LmxvOiBjb2ZmLWF1eC5jICQoSU5DRElSKS9jb2ZmL2F1eC1jb2ZmLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL202OGsuaCBjb2ZmLW02OGsuYyBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODMwMC5sbzogY29mZi1oODMwMC5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODUwMC5sbzogY29mZi1oODUwMC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pMzg2LmxvOiBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pODYwLmxvOiBjb2ZmLWk4NjAuYyAkKElOQ0RJUikvY29mZi9pODYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1nbzMyLmxvOiBjb2ZmLWdvMzIuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk5NjAubG86IGNvZmYtaTk2MC5jICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW02OGsubG86IGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW04OGsubG86IGNvZmYtbTg4ay5jICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW1pcHMubG86IGNvZmYtbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL21pcHMuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBjb2Zmc3dhcC5oIFwKLSAgZWNvZmZzd2FwLmgKLWNvZmYtcG1hYy5sbzogY29mZi1wbWFjLmMgY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtcnM2MDAwLmxvOiBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zaC5sbzogY29mZi1zaC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zcGFyYy5sbzogY29mZi1zcGFyYy5jICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXN0Z28zMi5sbzogY29mZi1zdGdvMzIuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2dvMzJleGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0gIGdvMzJzdHViLmgKLWNvZmYtc3ZtNjhrLmxvOiBjb2ZmLXN2bTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljMzAubG86IGNvZmYtdGljMzAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljODAubG86IGNvZmYtdGljODAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdTY4ay5sbzogY29mZi11NjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13ZTMyay5sbzogY29mZi13ZTMyay5jICQoSU5DRElSKS9jb2ZmL3dlMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXc2NS5sbzogY29mZi13NjUuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3c2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXo4ay5sbzogY29mZi16OGsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3o4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmbGluay5sbzogY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWR3YXJmMS5sbzogZHdhcmYxLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZi5oCi1kd2FyZjIubG86IGR3YXJmMi5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKLWVjb2ZmLmxvOiBlY29mZi5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oCi1lY29mZmxpbmsubG86IGVjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29iamFsbG9jLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWxmLmxvOiBlbGYuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZWxmMzItYXJjLmxvOiBlbGYzMi1hcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW9hYmkubG86IGVsZmFybS1vYWJpLmMgJChJTkNESVIpL2VsZi9hcm0tb2FiaS5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLWFybS5oIGVsZjMyLXRhcmdldC5oCi1lbGZhcm0tbmFiaS5sbzogZWxmYXJtLW5hYmkuYyAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi1hcm0uaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMTB2LmxvOiBlbGYzMi1kMTB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZDMwdi5sbzogZWxmMzItZDMwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWZyMzAubG86IGVsZjMyLWZyMzAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWdlbi5sbzogZWxmMzItZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItaHBwYS5sbzogZWxmMzItaHBwYS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgZWxmMzItaHBwYS5oIGxpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgaHBwYV9zdHVicy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pMzg2LmxvOiBlbGYzMi1pMzg2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pODYwLmxvOiBlbGYzMi1pODYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItaTk2MC5sbzogZWxmMzItaTk2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9pOTYwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTMyci5sbzogZWxmMzItbTMyci5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTY4ay5sbzogZWxmMzItbTY4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTg4ay5sbzogZWxmMzItbTg4ay5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAyMDAubG86IGVsZi1tMTAyMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMzAwLmxvOiBlbGYtbTEwMzAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1jb3JlLmxvOiBlbGYzMi1tY29yZS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbWlwcy5sbzogZWxmMzItbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wcGMubG86IGVsZjMyLXBwYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zaC5sbzogZWxmMzItc2guYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLmxvOiBlbGYzMi5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLWVsZmxpbmsubG86IGVsZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZXBvYy1wZS1hcm0ubG86IGVwb2MtcGUtYXJtLmMgcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1lcG9jLXBlaS1hcm0ubG86IGVwb2MtcGVpLWFybS5jIHBlaS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLWhwMzAwYnNkLmxvOiBocDMwMGJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaHAzMDBocHV4LmxvOiBocDMwMGhwdXguYyAkKElOQ0RJUikvYW91dC9ocDMwMGhwdXguaCBcCi0gIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1zb20ubG86IHNvbS5jCi1pMzg2YW91dC5sbzogaTM4NmFvdXQuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZic2QubG86IGkzODZic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZkeW5peC5sbzogaTM4NmR5bml4LmMgJChJTkNESVIpL2FvdXQvZHluaXgzLmggYW91dHguaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotaTM4NmZyZWVic2QubG86IGkzODZmcmVlYnNkLmMgZnJlZWJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmxpbnV4LmxvOiBpMzg2bGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZseW54LmxvOiBpMzg2bHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1zZG9zLmxvOiBpMzg2bXNkb3MuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotaTM4Nm5ldGJzZC5sbzogaTM4Nm5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1hY2gzLmxvOiBpMzg2bWFjaDMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZvczlrLmxvOiBpMzg2b3M5ay5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL29zOWsuaAotaWVlZS5sbzogaWVlZS5jICQoSU5DRElSKS9pZWVlLmggbGliaWVlZS5oCi1tNjhrNGtuZXRic2QubG86IG02OGs0a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a2xpbnV4LmxvOiBtNjhrbGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW02OGtseW54LmxvOiBtNjhrbHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a25ldGJzZC5sbzogbTY4a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTg4a21hY2gzLmxvOiBtODhrbWFjaDMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW1pcHNic2QubG86IG1pcHNic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW5ld3NvczMubG86IG5ld3NvczMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW5sbS5sbzogbmxtLmMgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5sbTMyLWkzODYubG86IG5sbTMyLWkzODYuYyAkKElOQ0RJUikvbmxtL2kzODYtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1zcGFyYy5sbzogbmxtMzItc3BhcmMuYyAkKElOQ0RJUikvbmxtL3NwYXJjMzItZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1wcGMubG86IG5sbTMyLXBwYy5jICQoSU5DRElSKS9ubG0vcHBjLWV4dC5oIGxpYm5sbS5oIFwKLSAgJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oIFwKLSAgbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzIubG86IG5sbTMyLmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1uczMya25ldGJzZC5sbzogbnMzMmtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW9hc3lzLmxvOiBvYXN5cy5jICQoSU5DRElSKS9vYXN5cy5oIGxpYm9hc3lzLmgKLXBjNTMyLW1hY2gubG86IHBjNTMyLW1hY2guYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXBlLWFybS5sbzogcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktYXJtLmxvOiBwZWktYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1pMzg2LmxvOiBwZS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaS1pMzg2LmxvOiBwZWktaTM4Ni5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1tY29yZS5sbzogcGUtbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktbWNvcmUubG86IHBlaS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlLXBwYy5sbzogcGUtcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpLXBwYy5sbzogcGVpLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBwY2Jvb3QubG86IHBwY2Jvb3QuYwotcmVsb2MxNi5sbzogcmVsb2MxNi5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmgKLXJpc2NpeC5sbzogcmlzY2l4LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1zcGFyY2xpbnV4LmxvOiBzcGFyY2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1zcGFyY2x5bngubG86IHNwYXJjbHlueC5jICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXNwYXJjbmV0YnNkLmxvOiBzcGFyY25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotc3Vub3MubG86IHN1bm9zLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggYW91dGYxLmggXAotICAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotdmF4bmV0YnNkLmxvOiB2YXhuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXZlcnNhZG9zLmxvOiB2ZXJzYWRvcy5jICQoSU5DRElSKS9saWJpYmVydHkuaAotdm1zLmxvOiB2bXMuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtZ3NkLmxvOiB2bXMtZ3NkLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWhkci5sbzogdm1zLWhkci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1taXNjLmxvOiB2bXMtbWlzYy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy10aXIubG86IHZtcy10aXIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi14Y29mZmxpbmsubG86IHhjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotYW91dDY0LmxvOiBhb3V0NjQuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWNvZmYtYWxwaGEubG86IGNvZmYtYWxwaGEuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCBjb2Zmc3dhcC5oIGVjb2Zmc3dhcC5oCi1kZW1vNjQubG86IGRlbW82NC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotZWxmNjQtYWxwaGEubG86IGVsZjY0LWFscGhhLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmggZWNvZmZzd2FwLmggZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LWdlbi5sbzogZWxmNjQtZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtbWlwcy5sbzogZWxmNjQtbWlwcy5jICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1zcGFyYy5sbzogZWxmNjQtc3BhcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LmxvOiBlbGY2NC5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLW5sbTMyLWFscGhhLmxvOiBubG0zMi1hbHBoYS5jICQoSU5DRElSKS9ubG0vYWxwaGEtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG02NC5sbzogbmxtNjQuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLWFpeDM4Ni1jb3JlLmxvOiBhaXgzODYtY29yZS5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWhwdXgtY29yZS5sbzogaHB1eC1jb3JlLmMKLWlyaXgtY29yZS5sbzogaXJpeC1jb3JlLmMKLWx5bngtY29yZS5sbzogbHlueC1jb3JlLmMKLW9zZi1jb3JlLmxvOiBvc2YtY29yZS5jCi1zY281LWNvcmUubG86IHNjbzUtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi10cmFkLWNvcmUubG86IHRyYWQtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgaG9zdHMvaTM4NmxpbnV4LmgKLWNpc2NvLWNvcmUubG86IGNpc2NvLWNvcmUuYwotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JmZC9QT1JUSU5HIGIvYmZkL1BPUlRJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmZkNzcuLjAwMDAwMDAKLS0tIGEvYmZkL1BPUlRJTkcKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0JUHJlbGltaW5hcnkgTm90ZXMgb24gUG9ydGluZyBCRkQKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgJ2hvc3QnIGlzIHRoZSBzeXN0ZW0gYSB0b29sIHJ1bnMgKm9uKi4KLVRoZSAndGFyZ2V0JyBpcyB0aGUgc3lzdGVtIGEgdG9vbCBydW5zICpmb3IqLCBpLmUuCi1hIHRvb2wgY2FuIHJlYWQvd3JpdGUgdGhlIGJpbmFyaWVzIG9mIHRoZSB0YXJnZXQuCi0KLVBvcnRpbmcgdG8gYSBuZXcgaG9zdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QaWNrIGEgbmFtZSBmb3IgeW91ciBob3N0LiBDYWxsIHRoYXQgPGhvc3Q+LgotKDxob3N0PiBtaWdodCBiZSBzdW40LCAuLi4pCi1DcmVhdGUgYSBmaWxlIGhvc3RzLzxob3N0Pi5taC4KLQotUG9ydGluZyB0byBhIG5ldyB0YXJnZXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QaWNrIGEgbmFtZSBmb3IgeW91ciB0YXJnZXQuIENhbGwgdGhhdCA8dGFyZ2V0Pi4KLUNhbGwgdGhlIG5hbWUgZm9yIHlvdXIgQ1BVIGFyY2hpdGVjdHVyZSA8Y3B1Pi4KLVlvdSBuZWVkIHRvIGNyZWF0ZSA8dGFyZ2V0Pi5jIGFuZCBjb25maWcvPHRhcmdldD4ubXQsCi1hbmQgYWRkIGEgY2FzZSBmb3IgaXQgdG8gYSBjYXNlIHN0YXRlbWVudHMgaW4gYmZkL2NvbmZpZ3VyZS5ob3N0IGFuZAotYmZkL2NvbmZpZy5iZmQsIHdoaWNoIGFzc29jaWF0ZXMgZWFjaCBjYW5vbmljYWwgaG9zdCB0eXBlIHdpdGggYSBCRkQKLWhvc3QgdHlwZSAodXNlZCBhcyB0aGUgYmFzZSBvZiB0aGUgbWFrZWZpbGUgZnJhZ21lbnQgbmFtZXMpLCBhbmQgdG8gdGhlCi10YWJsZSBpbiBiZmQvY29uZmlndXJlLmluIHdoaWNoIGFzc29jaWF0ZXMgZWFjaCB0YXJnZXQgdmVjdG9yIHdpdGgKLXRoZSAubyBmaWxlcyBpdCB1c2VzLgotCi1jb25maWcvPHRhcmdldD4ubXQgaXMgYSBNYWtlZmlsZSBmcmFnbWVudC4KLVRoZSBmb2xsb3dpbmcgaXMgdXN1YWxseSBlbm91Z2g6Ci1ERUZBVUxUX1ZFQ1RPUj08dGFyZ2V0Pl92ZWMKLVNFTEVDVF9BUkNISVRFQ1RVUkVTPWJmZF88Y3B1Pl9hcmNoCi0KLVNlZSB0aGUgbGlzdCBvZiBjcHUgdHlwZXMgaW4gYXJjaHVyZXMuYywgb3IgImxzIGNwdS0qLmMiLgotSWYgeW91ciBhcmNoaXRlY3R1cmUgaXMgbmV3LCB5b3UgbmVlZCB0byBhZGQgaXQgdG8gdGhlIHRhYmxlcwotaW4gYmZkL2FyY2h1cmVzLmMsIG9wY29kZXMvY29uZmlndXJlLmluLCBhbmQgYmludXRpbHMvb2JqZHVtcC5jLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCAubXQgYW5kIC5taCBmaWxlcywgc2VlIGNvbmZpZy9SRUFETUUuCi0KLVRoZSBmaWxlIDx0YXJnZXQ+LmMgaXMgdGhlIGhhcmQgcGFydC4gIEl0IGltcGxlbWVudHMgdGhlCi1iZmRfdGFyZ2V0IDx0YXJnZXQ+X3ZlYywgd2hpY2ggaW5jbHVkZXMgcG9pbnRlcnMgdG8KLWZ1bmN0aW9ucyB0aGF0IGRvIHRoZSBhY3R1YWwgPHRhcmdldD4tc3BlY2lmaWMgbWV0aG9kcy4KLQotUG9ydGluZyB0byBhIDx0YXJnZXQ+IHRoYXQgdXNlcyB0aGUgYS5vdXQgYmluYXJ5IGZvcm1hdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JbiB0aGlzIGNhc2UsIHRoZSBpbmNsdWRlIGZpbGUgYW91dC10YXJnZXQuaCBwcm9iYWJ5IGRvZXMgbW9zdAotb2Ygd2hhdCB5b3UgbmVlZC4gVGhlIHByb2dyYW0gZ2VuLWFvdXQgZ2VuZXJhdGVzIDx0YXJnZXQ+LmMgZm9yCi15b3UgYXV0b21hdGljYWxseSBmb3IgbWFueSBhLm91dCBzeXN0ZW1zLiAgRG86Ci0JbWFrZSBnZW4tYW91dAotCS4vZ2VuLWFvdXQgPHRhcmdldD4gPiA8dGFyZ2V0Pi5jCi0oVGhpcyBvbmx5IHdvcmtzIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gdGhlIHRhcmdldCAoIm5hdGl2ZSIpLgotSWYgeW91IG11c3QgbWFrZSBhIGNyb3NzLXBvcnQgZnJvbSBzY3JhdGNoLCBjb3B5IHRoZSBtb3N0Ci1zaW1pbGFyIGV4aXN0aW5nIGZpbGUgdGhhdCBpbmNsdWRlcyBhb3V0LXRhcmdldC5oLCBhbmQgZml4IHdoYXQgaXMgd3JvbmcuKQotCi1DaGVjayB0aGUgcGFyYW1ldGVycyBpbiA8dGFyZ2V0Pi5jLCBhbmQgZml4IGFueXRoaW5nIHRoYXQgaXMgd3JvbmcuCi0oQWxzbyBsZXQgdXMga25vdyBhYm91dCBpdDsgcGVyaGFwcyB3ZSBjYW4gaW1wcm92ZSBnZW4tYW91dC5jLikKLQotVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCVNob3VsZCBiZSBkZWZpbmVkIGlmIDx0YXJnZXQ+IGlzIGJpZy1lbmRpYW4uCi0KLU5fSEVBREVSX0lOX1RFWFQoeCkKLQlTZWUgZGlzY3Vzc2lvbiBpbiAuLi9pbmNsdWRlL2FvdXQvYW91dDY0LmguCi0KLUJZVEVTX0lOX1dPUkQKLQlOdW1iZXIgb2YgYnl0ZXMgcGVyIHdvcmQuIChVc3VhbGx5IDQgYnV0IGNhbiBiZSA4LikKLQotQVJDSAotCU51bWJlciBvZiBiaXRzIHBlciB3b3JkLiAgKFVzdWFsbHkgMzIsIGJ1dCBjYW4gYmUgNjQuKQotCi1FTlRSWV9DQU5fQkVfWkVSTwotCURlZmluZSBpZiB0aGUgZXh0cnkgcG9pbnQgKHN0YXJ0IGFkZHJlc3Mgb2YgYW4KLQlleGVjdXRhYmxlIHByb2dyYW0pIGNhbiBiZSAweDAuCi0KLVRFWFRfU1RBUlRfQUREUgotCVRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWdlbW50IGluCi0JdmlydHVhbCBtZW1vcnkuICBOb3JtYWxseSwgdGhlIHNhbWUgYXMgdGhlIGVudHJ5IHBvaW50LgotCi1UQVJHRVRfUEFHRV9TSVpFCi0KLVNFR01FTlRfU0laRQotICAgICAgICBVc3VhbGx5LCB0aGUgc2FtZSBhcyB0aGUgVEFSR0VUX1BBR0VfU0laRS4KLSAgICAgICAgQWxpZ25tZW50IG5lZWRlZCBmb3IgdGhlIGRhdGEgc2VnbWVudC4KLQotVEFSR0VUTkFNRQotCVRoZSBuYW1lIG9mIHRoZSB0YXJnZXQsIGZvciBydW4tdGltZSBsb29rdXBzLgotCVVzdWFsbHkgImEub3V0LTx0YXJnZXQ+IgpkaWZmIC0tZ2l0IGEvYmZkL1JFQURNRSBiL2JmZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2UxMzMuLjAwMDAwMDAKLS0tIGEvYmZkL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLUJGRCBpcyBhIGFuIG9iamVjdCBmaWxlIGxpYnJhcnkuICBJdCBwZXJtaXRzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCi1zYW1lIHJvdXRpbmVzIHRvIHByb2Nlc3Mgb2JqZWN0IGZpbGVzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgZm9ybWF0LgotCi1CRkQgaXMgdXNlZCBieSB0aGUgR05VIGRlYnVnZ2VyLCBhc3NlbWJsZXIsIGxpbmtlciwgYW5kIHRoZSBiaW5hcnkKLXV0aWxpdGllcy4KLQotVGhlIGRvY3VtZW50YXRpb24gb24gdXNpbmcgQkZEIGlzIHNjYW50eSBhbmQgbWF5IGJlIG9jY2FzaW9uYWxseQotaW5jb3JyZWN0LiAgUG9pbnRlcnMgdG8gZG9jdW1lbnRhdGlvbiBwcm9ibGVtcywgb3IgYW4gZW50aXJlbHkKLXJld3JpdHRlbiBtYW51YWwsIHdvdWxkIGJlIGFwcHJlY2lhdGVkLgotCi1UaGVyZSBpcyBzb21lIEJGRCBpbnRlcm5hbHMgZG9jdW1lbnRhdGlvbiBpbiBkb2MvYmZkaW50LnRleGkgd2hpY2ggbWF5Ci1oZWxwIHByb2dyYW1tZXJzIHdobyB3YW50IHRvIG1vZGlmeSBCRkQuCi0KLUJGRCBpcyBub3JtYWxseSBidWlsdCBhcyBwYXJ0IG9mIGFub3RoZXIgcGFja2FnZS4gIFNlZSB0aGUgYnVpbGQKLWluc3RydWN0aW9ucyBmb3IgdGhhdCBwYWNrYWdlLCBwcm9iYWJseSBpbiBhIFJFQURNRSBmaWxlIGluIHRoZQotYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1CRkQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb25maWd1cmUgb3B0aW9uczoKLQotICAtLXRhcmdldD1UQVJHRVQKLQlUaGUgZGVmYXVsdCB0YXJnZXQgZm9yIHdoaWNoIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiAgVEFSR0VUIGlzCi0JYSBjb25maWd1cmF0aW9uIHRhcmdldCB0cmlwbGV0LCBzdWNoIGFzIHNwYXJjLXN1bi1zb2xhcmlzLgotICAtLWVuYWJsZS10YXJnZXRzPVRBUkdFVCxUQVJHRVQsVEFSR0VULi4uCi0JQWRkaXRpb25hbCB0YXJnZXRzIHRoZSBsaWJyYXJ5IHNob3VsZCBzdXBwb3J0LiAgVG8gaW5jbHVkZQotCXN1cHBvcnQgZm9yIGFsbCBrbm93biB0YXJnZXRzLCB1c2UgLS1lbmFibGUtdGFyZ2V0cz1hbGwuCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQKLQlJbmNsdWRlIHN1cHBvcnQgZm9yIDY0IGJpdCB0YXJnZXRzLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5Ci0JdHVybmVkIG9uIGlmIHlvdSBleHBsaWNpdGx5IHJlcXVlc3QgYSA2NCBiaXQgdGFyZ2V0LCBidXQgbm90Ci0JZm9yIC0tZW5hYmxlLXRhcmdldHM9YWxsLiAgVGhpcyByZXF1aXJlcyBhIGNvbXBpbGVyIHdpdGggYSA2NAotCWJpdCBpbnRlZ2VyIHR5cGUsIHN1Y2ggYXMgZ2NjLgotICAtLWVuYWJsZS1zaGFyZWQKLQlCdWlsZCBCRkQgYXMgYSBzaGFyZWQgbGlicmFyeS4KLSAgLS13aXRoLW1tYXAKLQlVc2UgbW1hcCB3aGVuIGFjY2Vzc2luZyBmaWxlcy4gIFRoaXMgaXMgZmFzdGVyIG9uIHNvbWUgaG9zdHMsCi0JYnV0IHNsb3dlciBvbiBvdGhlcnMuICBJdCBtYXkgbm90IHdvcmsgb24gYWxsIGhvc3RzLgotCi1SZXBvcnQgYnVncyB3aXRoIEJGRCB0byBidWctZ251LXV0aWxzQGdudS5vcmcuCi0KLVBhdGNoZXMgYXJlIGVuY291cmFnZWQuICBXaGVuIHNlbmRpbmcgcGF0Y2hlcywgYWx3YXlzIHNlbmQgdGhlIG91dHB1dAotb2YgZGlmZiAtdSBvciBkaWZmIC1jIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgRG8gbm90Ci1zZW5kIGRlZmF1bHQgZGlmZiBvdXRwdXQuICBEbyBub3QgbWFrZSB0aGUgZGlmZiBmcm9tIHRoZSBuZXcgZmlsZSB0bwotdGhlIG9yaWdpbmFsIGZpbGUuICBSZW1lbWJlciB0aGF0IGFueSBwYXRjaCBtdXN0IG5vdCBicmVhayBvdGhlcgotc3lzdGVtcy4gIFJlbWVtYmVyIHRoYXQgQkZEIG11c3Qgc3VwcG9ydCBjcm9zcyBjb21waWxhdGlvbiBmcm9tIGFueQotaG9zdCB0byBhbnkgdGFyZ2V0LCBzbyBwYXRjaGVzIHdoaWNoIHVzZSBgYCNpZmRlZiBIT1NUJycgYXJlIG5vdAotYWNjZXB0YWJsZS4gIFBsZWFzZSBhbHNvIHJlYWQgdGhlIGBgUmVwb3J0aW5nIEJ1Z3MnJyBzZWN0aW9uIG9mIHRoZQotZ2NjIG1hbnVhbC4KLQotQnVnIHJlcG9ydHMgd2l0aG91dCBwYXRjaGVzIHdpbGwgYmUgcmVtZW1iZXJlZCwgYnV0IHRoZXkgbWF5IG5ldmVyIGdldAotZml4ZWQgdW50aWwgc29tZWJvZHkgdm9sdW50ZWVycyB0byBmaXggdGhlbS4KZGlmZiAtLWdpdCBhL2JmZC9UT0RPIGIvYmZkL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTI3MzUuLjAwMDAwMDAKLS0tIGEvYmZkL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1UaGluZ3MgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGRvbmU6IC0qLSBUZXh0IC0qLQotCi0gbyAtIEEgc291cmNlIG9mIHNwYWNlIGxvc3NhZ2UgaXMgdGhhdCBhbGwgdGhlIHRhcmdldC1kZXBlbmRlbnQgY29kZQotICAgICBpcyBpbiBhIHNpbmdsZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gIEhlbmNlIGFsbCB0aGUgY29kZSBmb3IKLSAgICAgKndyaXRpbmcqIG9iamVjdCBmaWxlcyBpcyBzdGlsbCBwdWxsZWQgaW50byBhbGwgdGhlIGFwcGxpY2F0aW9ucwotICAgICB0aGF0IG9ubHkgY2FyZSBhYm91dCAqcmVhZGluZyogKGdkYiwgbm0sIG9iamR1bXApLCB3aGlsZSBnYXMgaGFzCi0gICAgIHRvIGNhcnJ5IGFsb25nIGFsbCB0aGUgdW5uZWVkZWQgYmFnZ2FnZSBmb3IgcmVhZGluZyBvYmplY3RzLiAgQW5kCi0gICAgIHNvIG9uLiAgVGhpcyB3b3VsZCBiZSBhIHN1YnN0YW50aWFsIGNoYW5nZSwgYW5kIHRoZSBwYXlvZmYgd291bGQKLSAgICAgbm90IGFsbCB0aGF0IGdyZWF0IChlc3NlbnRpYWxseSBub25lIGlmIGJmZCBpcyB1c2VkIGFzIGEgc2hhcmVkCi0gICAgIGxpYnJhcnkpLgotCi0gbyAtIFRoZSBzdG9yYWdlIG5lZWRlZCBieSBCRkQgZGF0YSBzdHJ1Y3R1cmVzIGlzIGFsc28gbGFyZ2VyIHRoYW4gc3RyaWN0bHkKLSAgICAgbmVlZGVkLiAgVGhpcyBtYXkgYmUgZGlmZmljdWx0IHRvIGRvIG11Y2ggYWJvdXQuCi0KLSBvIC0gaW1wbGVtZW50IGJmZF9hYm9ydCwgd2hpY2ggc2hvdWxkIGNsb3NlIHRoZSBiZmQgYnV0IG5vdCBhbHRlciB0aGUKLSAgICAgZmlsZXN5c3RlbS4KLQotIG8gLSB1cGRhdGUgdGhlIGJmZCBkb2M7IHdyaXRlIGEgaG93LXRvLXdyaXRlLWEtYmFja2VuZCBkb2MsIHRha2Ugb3V0Ci0gICAgIHRoZSBzdHVwaWQgcXVpcHMgYW5kIGZpbGwgaW4gYWxsIHRoZSBibGFua3MuCi0KLSBvIC0gdXBncmFkZSB0aGUgcmVsb2MgaGFuZGxpbmcgYXMgcGVyIFN0ZXZlJ3Mgc3VnZ2VzdGlvbi4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL2FjaW5jbHVkZS5tNCBiL2JmZC9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTFjMzAuLjAwMDAwMDAKLS0tIGEvYmZkL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgotQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIEFDX0RFRklORShVU0VfQklOQVJZX0ZPUEVOLCAxLCBbVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz9dKSA7OwotZXNhY10pZG5sCi0KLWRubCBHZXQgYSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgdG8gcHV0IGludG8gTWFrZWZpbGUuCi1BQ19ERUZVTihCRkRfQ0NfRk9SX0JVSUxELAotWyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi1BQ19TVUJTVChDQ19GT1JfQlVJTEQpCi0jIEFsc28gc2V0IEVYRUVYVF9GT1JfQlVJTEQuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBFWEVFWFRfRk9SX0JVSUxEPSckKEVYRUVYVCknCi1lbHNlCi0gIEFDX0NBQ0hFX0NIRUNLKFtmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4XSwgYmZkX2N2X2J1aWxkX2V4ZWV4dCwKLSAgICBbY2F0ID4gYWNfY190ZXN0LmMgPDwgJ0VPRicKLWludCBtYWluKCkgewotLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLwotfQotRU9GCi0gICAgJHtDQ19GT1JfQlVJTER9IC1vIGFjX2NfdGVzdCBhbV9jX3Rlc3QuYyAxPiY1IDI+JjUKLSAgICBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvIGFjX2NfdGVzdC4qIHwgZ3JlcCAtdiBhY19jX3Rlc3QuYyB8IHNlZCAtZSBzL2FjX2NfdGVzdC8vYAotICAgIHJtIC1mIGFjX2NfdGVzdCoKLSAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm9dKQotICBFWEVFWFRfRk9SX0JVSUxEPSIiCi0gIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9Ci1maQotQUNfU1VCU1QoRVhFRVhUX0ZPUl9CVUlMRCldKWRubAotCi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCBhIGRlY2xhcmF0aW9uIGZvciBhIGZ1bmN0aW9uLgotQUNfREVGVU4oQkZEX05FRURfREVDTEFSQVRJT04sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICQxIG11c3QgYmUgZGVjbGFyZWRdKQotQUNfQ0FDSEVfVkFMKGJmZF9jdl9kZWNsX25lZWRlZF8kMSwKLVtBQ19UUllfQ09NUElMRShbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWZdLAotW2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpICQxXSwKLWJmZF9jdl9kZWNsX25lZWRlZF8kMT1ubywgYmZkX2N2X2RlY2xfbmVlZGVkXyQxPXllcyldKQotQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2RlY2xfbmVlZGVkXyQxKQotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkXyQxID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgIFtEZWZpbmUgaWYgJDEgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuXSkKLWZpCi1dKWRubAotCi1kbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMSBpbiBzeXMvcHJvY2ZzLmhdKQotIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEsCi0gICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKLSAgICAgIFskMSBhdmFyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT15ZXMsCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9bm8KLSAgICldKQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLl0pCi0gZmkKLSBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEpCi1dKQotCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG1lbWJlciAkMiBpbiB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAotCi1BQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxLiQyIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIsCi0gICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKLSAgICAgIFskMSBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci4kMl0sCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9bm8KLSAgICldKQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIgPSB5ZXM7IHRoZW4KLSAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSlbX110cmFuc2xpdCgkMiwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLiQyLl0pCi0gZmkKLSBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyKQotXSkKLQotCmRpZmYgLS1naXQgYS9iZmQvYWNsb2NhbC5tNCBiL2JmZC9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRmMTBlLi4wMDAwMDAwCi0tLSBhL2JmZC9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTIxNCArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gdXNlIGZvcGVuLWJpbi5oIHJhdGhlciB0aGFuIGZvcGVuLXNhbWUuaC4KLUFDX0RFRlVOKEJGRF9CSU5BUllfRk9QRU4sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX1NZU1RFTV0pCi1jYXNlICIke2hvc3R9IiBpbgotY2hhbmdlcXVvdGUoLClkbmwKLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW2NhdCA+IGFjX2NfdGVzdC5jIDw8ICdFT0YnCi1pbnQgbWFpbigpIHsKLS8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KLX0KLUVPRgotICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBhY19jX3Rlc3QgYW1fY190ZXN0LmMgMT4mNSAyPiY1Ci0gICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyBhY19jX3Rlc3QuKiB8IGdyZXAgLXYgYWNfY190ZXN0LmMgfCBzZWQgLWUgcy9hY19jX3Rlc3QvL2AKLSAgICBybSAtZiBhY19jX3Rlc3QqCi0gICAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iID0geCAmJiBiZmRfY3ZfYnVpbGRfZXhlZXh0PW5vXSkKLSAgRVhFRVhUX0ZPUl9CVUlMRD0iIgotICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVF9GT1JfQlVJTEQ9JHtiZmRfY3ZfYnVpbGRfZXhlZXh0fQotZmkKLUFDX1NVQlNUKEVYRUVYVF9GT1JfQlVJTEQpXSlkbmwKLQotZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgYSBkZWNsYXJhdGlvbiBmb3IgYSBmdW5jdGlvbi4KLUFDX0RFRlVOKEJGRF9ORUVEX0RFQ0xBUkFUSU9OLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciAkMSBtdXN0IGJlIGRlY2xhcmVkXSkKLUFDX0NBQ0hFX1ZBTChiZmRfY3ZfZGVjbF9uZWVkZWRfJDEsCi1bQUNfVFJZX0NPTVBJTEUoWwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmXSwKLVtjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSAkMV0sCi1iZmRfY3ZfZGVjbF9uZWVkZWRfJDE9bm8sIGJmZF9jdl9kZWNsX25lZWRlZF8kMT15ZXMpXSkKLUFDX01TR19SRVNVTFQoJGJmZF9jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW05FRURfREVDTEFSQVRJT05fXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICBbRGVmaW5lIGlmICQxIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLl0pCi1maQotXSlkbmwKLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgYSB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAotCi1BQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxLAotICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPl0sCi0gICAgICBbJDEgYXZhcl0sCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPW5vCi0gICApXSkKLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEgPSB5ZXM7IHRoZW4KLSAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgICBbRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyAkMS5dKQotIGZpCi0gQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxKQotXSkKLQotCi1kbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBtZW1iZXIgJDIgaW4gdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMS4kMiBpbiBzeXMvcHJvY2ZzLmhdKQotIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyLAotICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPl0sCi0gICAgICBbJDEgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIuJDJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj15ZXMsCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPW5vCi0gICApXSkKLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pW19ddHJhbnNsaXQoJDIsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgICBbRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyAkMS4kMi5dKQotIGZpCi0gQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMikKLV0pCi0KLQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCi1bQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCi1bQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCi1bQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19TVUJTVChMRCkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1BQ19TVUJTVChOTSkKLV0pCi0KLSMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCi0jIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KLUFDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKLVsjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLWNoYW5nZXF1b3RlKCwpZG5sCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWNoYW5nZXF1b3RlKCwpZG5sCi1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLWNoYW5nZXF1b3RlKFssXSlkbmwKLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0JICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLUFDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKLV0pCi0KLSMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCi1BQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCi1bQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLUFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLV0pCi0KLSMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KLUFDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCi1bYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi1dKQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWwotQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKLUFDX0NIRUNLX0xJQihtLCBjb3MpCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKLSAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KLSAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7Ci0gICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OwotICAgIGVzYWMKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KZGlmZiAtLWdpdCBhL2JmZC9haXgzODYtY29yZS5jIGIvYmZkL2FpeDM4Ni1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NWZhOTQuLjAwMDAwMDAKLS0tIGEvYmZkL2FpeDM4Ni1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBSVggb24gUFMvMiBjb3JlIGZpbGVzLgotICAgVGhpcyB3YXMgYmFzZWQgb24gdHJhZC1jb3JlLmMsIHdoaWNoIHdhcyB3cml0dGVuIGJ5IEpvaG4gR2lsbW9yZSBvZgotICAgICAgICBDeWdudXMgU3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNaW5oIFRyYW4tTGUgPFRSQU5MRUBJTlRFTExJQ09SUC5DT00+LgotICAgQ29udmVydGVkIHRvIGJhY2sgZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2kzODYuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZiBkZWZpbmVkIChfQUlYKSAmJiBkZWZpbmVkIChfSTM4NikKLSNkZWZpbmUgTk9DSEVDS1MJCS8qIHRoaXMgaXMgZm9yIGNvcmVkdW1wLmggKi8KLSNkZWZpbmUgX2hfVVNFUgkJCS8qIGF2b2lkIGluY2x1ZGluZyB1c2VyLmggZnJvbSBjb3JlZHVtcC5oICovCi0jaW5jbHVkZSA8dWluZm8uaD4KLSNpbmNsdWRlIDxzeXMvaTM4Ni9jb3JlZHVtcC5oPgotI2VuZGlmIC8qIF9BSVggJiYgX0kzODYgKi8KLQotLyogbWF5YmUgdGhpcyBjb3VsZCB3b3JrIG9uIHNvbWUgb3RoZXIgaTM4NiBidXQgSSBoYXZlIG5vdCB0cmllZCBpdAotICogbXRyYW5sZUBwYXJpcyAtIFR1ZSBTZXAgMjQgMTI6NDk6MzUgMTk5MQotICovCi0KLSNpZm5kZWYgQ09SX01BR0lDCi0jIGRlZmluZSBDT1JfTUFHSUMgImNvcmUiCi0jZW5kaWYKLQotLyogbmVlZCB0aGlzIGNhc3QgYmVjYXVzZSBwdHIgaXMgcmVhbGx5IHZvaWQgKiAqLwotI2RlZmluZSBjb3JlX2hkcihiZmQpIFwKLSAgICAoKChiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhKSktPmhkcikKLSNkZWZpbmUgY29yZV9zZWN0aW9uKGJmZCxuKSBcCi0gICAgKCgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEpLT5zZWN0aW9uc1tuXSkKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSBcCi0gICAgKCgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEpLT5yZWdfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWcyc2VjKGJmZCkgXAotICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+cmVnMl9zZWN0aW9uKQotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgewotICBzdHJ1Y3QgY29yZWhkciAqaGRyOwkJLyogY29yZSBmaWxlIGhlYWRlciAqLwotICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpyZWcyX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpzZWN0aW9uc1tNQVhfQ09SRV9TRUdTXTsKLX07Ci0KLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1haXgzODZfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGksbjsKLSAgdW5zaWduZWQgY2hhciBsb25nYnVmWzRdOwkvKiBSYXcgYnl0ZXMgb2YgdmFyaW91cyBoZWFkZXIgZmllbGRzICovCi0gIGludCBjb3JlX3NpemUgPSBzaXplb2YgKHN0cnVjdCBjb3JlaGRyKTsKLSAgc3RydWN0IGNvcmVoZHIgKmNvcmU7Ci0gIHN0cnVjdCBtZXJnZW0gewotICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IGNvcmVkYXRhOwotICAgIHN0cnVjdCBjb3JlaGRyIGludGVybmFsX2NvcmU7Ci0gIH0gKm1lcmdlbTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpbG9uZ2J1ZiwgMSwgc2l6ZW9mIChsb25nYnVmKSwgYWJmZCkgIT0gc2l6ZW9mIChsb25nYnVmKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jbXAobG9uZ2J1ZixDT1JfTUFHSUMsNCkpIHJldHVybiAwOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMEwsIGZhbHNlKSA8IDApIHJldHVybiAwOwotCi0gIG1lcmdlbSA9IChzdHJ1Y3QgbWVyZ2VtICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWVyZ2VtKSk7Ci0gIGlmIChtZXJnZW0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBjb3JlID0gJm1lcmdlbS0+aW50ZXJuYWxfY29yZTsKLQotICBpZiAoKGJmZF9yZWFkICgoUFRSKSBjb3JlLCAxLCBjb3JlX3NpemUsIGFiZmQpKSAhPSBjb3JlX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzZXRfdGRhdGEgKGFiZmQsICZtZXJnZW0tPmNvcmVkYXRhKTsKLSAgY29yZV9oZHIgKGFiZmQpID0gY29yZTsKLQotICAvKiBjcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIHJlY2xhaW0KLSAgICAgdGhlbSAqLwotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgY29yZV9yZWcyc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZzJzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyMToKLSAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfcmVnc2VjIChhYmZkKSk7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBmb3IgKGk9MCwgbj0wIDsgKGkgPCBNQVhfQ09SRV9TRUdTKSAmJiAoY29yZS0+Y2Rfc2Vnc1tpXS5jc190eXBlKSA7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoY29yZS0+Y2Rfc2Vnc1tpXS5jc19vZmZzZXQgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCxuKSA9Ci0JKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgICAgIGlmIChjb3JlX3NlY3Rpb24gKGFiZmQsbikgPT0gTlVMTCkKLQl7Ci0JICBpbnQgajsKLQkgIGlmIChuID4gMCkKLQkgICAgewotCSAgICAgIGZvciAoaj0wOyBqIDwgbjsgaisrKQotCQliZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9zZWN0aW9uKGFiZmQsIGopKTsKLQkgICAgfQotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKLQkgIGdvdG8gbG9zZXIxOwotCX0KLQotICAgICAgc3dpdGNoIChjb3JlLT5jZF9zZWdzW2ldLmNzX3R5cGUpCi0JewotCWNhc2UgQ09SX1RZUEVfREFUQToKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLmRhdGEiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0xPQUQgKwotCQkJCQkgICBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfU1RBQ0s6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5zdGFjayI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfTE9BRCArCi0JCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9MSUJEQVRBOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIubGliZGF0YSI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfV1JJVEU6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi53cml0ZWFibGUiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX01TQzoKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLm1pc2MiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIudW5rbm93biI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPl9yYXdfc2l6ZSA9IGNvcmUtPmNkX3NlZ3NbaV0uY3NfbGVuOwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+dm1hICAgICAgID0gY29yZS0+Y2Rfc2Vnc1tpXS5jc19hZGRyZXNzOwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmlsZXBvcyAgID0gY29yZS0+Y2Rfc2Vnc1tpXS5jc19vZmZzZXQ7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmV4dCAgICAgID0gTlVMTDsKLSAgICAgIGlmIChuID4gMCkKLQljb3JlX3NlY3Rpb24gKGFiZmQsIChuLTEpKS0+bmV4dCA9IGNvcmVfc2VjdGlvbiAoYWJmZCwgbik7Ci0KLSAgICAgIGFiZmQtPnNlY3Rpb25fY291bnQgPSArK247Ci0gICAgfQotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnMiI7Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZihjb3JlLT5jZF9yZWdzKTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+X3Jhd19zaXplID0gc2l6ZW9mKGNvcmUtPmNkX2ZwcmVncyk7Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAtMTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+dm1hID0gLTE7Ci0KLSAgLyogV2UnbGwgYWNjZXNzIHRoZSByZWdzIGFmcmVzaCBpbiB0aGUgY29yZSBmaWxlLCBsaWtlIGFueSBzZWN0aW9uOiAqLwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpb2Zmc2V0b2Yoc3RydWN0IGNvcmVoZHIsY2RfcmVnc1swXSk7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpb2Zmc2V0b2Yoc3RydWN0IGNvcmVoZHIsCi0JCQkJCQkgICAgY2RfZnByZWdzKTsKLQotICAvKiBhZGQgdGhlIDIgcmVnIGZha2Ugc2VjdGlvbnMgdG8gYWJmZCAqLwotICBhYmZkLT5zZWN0aW9uX2NvdW50ICs9IDI7Ci0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZzJzZWMgKGFiZmQpOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9zZWN0aW9uIChhYmZkLCAwKTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotYWl4Mzg2X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+Y2RfY29tbTsKLX0KLQotc3RhdGljIGludAotYWl4Mzg2X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5jZF9jdXJzaWc7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1haXgzODZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMKLQkJCQkgICBwb2ludCAqLwotfQotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChQUk9UTyhiZmRfdm1hLCAoKiksICggICAgICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUgTk9fR0VUUyAoKFBST1RPKGJmZF9zaWduZWRfdm1hLCAoKiksIChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKChQUk9UTyh2b2lkLCAgICAgICAgKCopLCAoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBhaXgzODZfY29yZV92ZWMgPQotICB7Ci0gICAgImFpeDM4Ni1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTkdfQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICAgJyAnLAkJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULCAvKiBkYXRhICovCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsIC8qIGhkcnMgKi8KLQotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LCBhaXgzODZfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX2NyZWF0ZV9vYmplY3QgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChhaXgzODYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LWFkb2JlLmMgYi9iZmQvYW91dC1hZG9iZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzExZmZlLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFkb2JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhLm91dC5hZG9iZSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIEJhc2VkIG9uIGJvdXQuYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJhb3V0L2Fkb2JlLmgiCi0KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhX291dF9hZG9iZV92ZWM7CQkvKiBGb3J3YXJkIGRlY2wgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmFvdXRfYWRvYmVfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYW91dF8zMl9zbHVycF9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gYm9vbGVhbiBhb3V0XzMyX3dyaXRlX3N5bXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGFvdXRfYWRvYmVfd3JpdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgc2VjdCkpOwotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdyBieXRlCi0gICBzdHJlYW0gbWVtb3J5IGltYWdlLCBpbnRvIHRoZSBpbnRlcm5hbCBleGVjX2hlYWRlciBzdHJ1Y3R1cmUuICAqLwotCi12b2lkIGFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9pbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMsCi0JICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKSk7Ci0JIAotdm9pZAotYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfaW5mbyk7Ci0gIGV4ZWNwLT5hX3RleHQgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90ZXh0KTsKLSAgZXhlY3AtPmFfZGF0YSAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpOwotICBleGVjcC0+YV9lbnRyeSAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci19Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcm5hbCBleGVjIGhlYWRlciBzdHJ1Y3R1cmUgaW50byB0aGUKLSAgIHN1cHBsaWVkIGJ1ZmZlciByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLiAgKi8KLQotUFJPVE8odm9pZCwgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX291dCwKLQkgIChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCSAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpKTsKLXZvaWQKLWFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNwLCByYXdfYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvICAsIGJ5dGVzLT5lX2luZm8pOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGV4dCAgLCBieXRlcy0+ZV90ZXh0KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2RhdGEgICwgYnl0ZXMtPmVfZGF0YSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9ic3MgICAsIGJ5dGVzLT5lX2Jzcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9zeW1zICAsIGJ5dGVzLT5lX3N5bXMpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZW50cnkgLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYW91dF9hZG9iZV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBhbmV4ZWM7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIGNoYXIgKnRhcmc7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotICAgICAgIT0gRVhFQ19CWVRFU19TSVpFKSB7Ci0gICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBhbmV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleGVjX2J5dGVzLmVfaW5mbyk7Ci0KLSAgLyogTm9ybWFsbHkgd2UganVzdCBjb21wYXJlIGZvciB0aGUgbWFnaWMgbnVtYmVyLgotICAgICBIb3dldmVyLCBhIGJ1bmNoIG9mIEFkb2JlIHRvb2xzIGFyZW4ndCBmaXhlZCB1cCB5ZXQ7IHRoZXkgZ2VuZXJhdGUKLSAgICAgZmlsZXMgdXNpbmcgWk1BR0lDKCEpLgotICAgICBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR05VVEFSR0VUIGlzIHNldCB0byAiYS5vdXQuYWRvYmUiLCB3ZSB3aWxsCi0gICAgIHRha2UganVzdCBhYm91dCBhbnkgYS5vdXQgZmlsZSBhcyBhbiBBZG9iZSBhLm91dCBmaWxlLiAgRklYTUUhICAqLwotCi0gIGlmIChOX0JBRE1BRyAoYW5leGVjKSkgewotICAgIHRhcmcgPSBnZXRlbnYgKCJHTlVUQVJHRVQiKTsKLSAgICBpZiAodGFyZyAmJiAhc3RyY21wICh0YXJnLCBhX291dF9hZG9iZV92ZWMubmFtZSkpCi0gICAgICA7CQkvKiBKdXN0IGNvbnRpbnVlIGFueXdheSwgaWYgc3BlY2lmaWNhbGx5IHNldCB0byB0aGlzIGZvcm1hdCAqLwotICAgIGVsc2UKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgfQotCi0gIGFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgJmV4ZWNfYnl0ZXMsICZhbmV4ZWMpOwotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZhbmV4ZWMsIGFvdXRfYWRvYmVfY2FsbGJhY2spOwotfQotCi0KLS8qIEZpbmlzaCB1cCB0aGUgb3BlbmluZyBvZiBhIGIub3V0IGZpbGUgZm9yIHJlYWRpbmcuICBGaWxsIGluIGFsbCB0aGUKLSAgIGZpZWxkcyB0aGF0IGFyZSBub3QgaGFuZGxlZCBieSBjb21tb24gY29kZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWFvdXRfYWRvYmVfY2FsbGJhY2sgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICBhc2VjdGlvbiAqc2VjdDsKLSAgc3RydWN0IGV4dGVybmFsX3NlZ2Rlc2MgZXh0WzFdOwotICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGNoYXIgdHJ5X2FnYWluWzMwXTsJLyogbmFtZSBhbmQgbnVtYmVyICovCi0gIGNoYXIgKm5ld25hbWU7Ci0gIGludCB0cnludW07Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIC8qIEFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIC0tIHVua25vd24gaW4gdGhpcyBmb3JtYXQuICAqLwotICBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBiZmRfYXJjaF91bmtub3duLCAwKTsKLQotICAvKiBUaGUgcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fU1lNT0ZGICgqZXhlY3ApOwotCi0gIC8qIFN1Y2sgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZSwgb25lIHNlY3Rpb24gYXQgYSB0aW1lLiAgKi8KLQotICBmb3IgKDs7KSB7Ci0gICAgaWYgKGJmZF9yZWFkICgoUFRSKSBleHQsIDEsIHNpemVvZiAoKmV4dCksIGFiZmQpICE9IHNpemVvZiAoKmV4dCkpIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzd2l0Y2ggKGV4dC0+ZV90eXBlWzBdKSB7Ci0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICBzZWN0aW9uX25hbWUgPSAiLnRleHQiOwotICAgICAgZmxhZ3MgPSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX0hBU19DT05URU5UUzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0RBVEE6Ci0gICAgICBzZWN0aW9uX25hbWUgPSAiLmRhdGEiOwotICAgICAgZmxhZ3MgPSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX0hBU19DT05URU5UUzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0JTUzoKLSAgICAgIHNlY3Rpb25fbmFtZSA9ICIuYnNzIjsKLSAgICAgIGZsYWdzID0gU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDA6Ci0gICAgICBnb3RvIG5vX21vcmVfc2VjdGlvbnM7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBVbmtub3duIHNlY3Rpb24gdHlwZSBpbiBhLm91dC5hZG9iZSBmaWxlOiAleFxuIiksIAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZXh0LT5lX3R5cGVbMF0pOwotICAgICAgZ290byBub19tb3JlX3NlY3Rpb25zOwotICAgIH0KLQotICAgIC8qIEZpcnN0IG9uZSBpcyBjYWxsZWQgIi50ZXh0IiBvciB3aGF0ZXZlcjsgc3Vic2VxdWVudCBvbmVzIGFyZQotICAgICAgICIudGV4dDEiLCAiLnRleHQyIiwgLi4uICovCi0KLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotICAgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBzZWN0aW9uX25hbWUpOwotICAgIHRyeW51bSA9IDA7Ci0gICAgd2hpbGUgKCFzZWN0KSB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fZXJyb3IpCi0JcmV0dXJuIDA7CS8qIFNvbWUgb3RoZXIgZXJyb3IgLS0gc2xpZGUgaW50byB0aGUgc3Vuc2V0ICovCi0gICAgICBzcHJpbnRmICh0cnlfYWdhaW4sICIlcyVkIiwgc2VjdGlvbl9uYW1lLCArK3RyeW51bSk7Ci0gICAgICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgdHJ5X2FnYWluKTsKLSAgICB9Ci0KLSAgICAvKiBGaXggdGhlIG5hbWUsIGlmIGl0IGlzIGEgc3ByaW50ZidkIG5hbWUuICAqLwotICAgIGlmIChzZWN0LT5uYW1lID09IHRyeV9hZ2FpbikgewotICAgICAgbmV3bmFtZSA9IChjaGFyICopIGJmZF96YWxsb2MoYWJmZCwgc3RybGVuIChzZWN0LT5uYW1lKSk7Ci0gICAgICBpZiAobmV3bmFtZSA9PSBOVUxMKQotCXJldHVybiAwOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBzZWN0LT5uYW1lKTsKLSAgICAgIHNlY3QtPm5hbWUgPSBuZXduYW1lOwotICAgIH0KLQotICAgIC8qIE5vdyBzZXQgdGhlIHNlY3Rpb24ncyBhdHRyaWJ1dGVzLiAgKi8KLSAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3QsIGZsYWdzKTsKLSAgICBzZWN0LT5fcmF3X3NpemUgPSAoKGV4dC0+ZV9zaXplWzBdIDw8IDgpCS8qIEFzc3VtZWQgYmlnLWVuZGlhbiAqLwotCQkgICAgICB8IGV4dC0+ZV9zaXplWzFdIDw8IDgpCi0JCSAgICAgIHwgZXh0LT5lX3NpemVbMl07Ci0gICAgc2VjdC0+X2Nvb2tlZF9zaXplID0gc2VjdC0+X3Jhd19zaXplOwotICAgIHNlY3QtPnZtYSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LT5lX3ZpcnRiYXNlKTsKLSAgICBzZWN0LT5maWxlcG9zID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPmVfZmlsZWJhc2UpOwotICAgIC8qIEZJWE1FIFhYWCBhbGlnbm1lbnQ/ICovCi0KLSAgICAvKiBTZXQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgZmlyc3Qgc2VjdGlvbiBvZiBlYWNoIHR5cGUuICAqLwotICAgIGlmICh0cnludW0gPT0gMCkgc3dpdGNoIChleHQtPmVfdHlwZVswXSkgewotICAgIGNhc2UgTl9URVhUOgotICAgICAgc2VjdC0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYgKCpleGVjcCk7Ci0gICAgICBzZWN0LT5yZWxvY19jb3VudCA9IGV4ZWNwLT5hX3Ryc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0RBVEE6Ci0gICAgICBzZWN0LT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLSAgICAgIHNlY3QtPnJlbG9jX2NvdW50ID0gZXhlY3AtPmFfZHJzaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci1ub19tb3JlX3NlY3Rpb25zOiAgCi0KLSAgYWRhdGEoYWJmZCkucmVsb2NfZW50cnlfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCk7Ci0gIGFkYXRhKGFiZmQpLnN5bWJvbF9lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gMTsgLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgewotICAgIHN0cnVjdCBhb3V0ZGF0YSBhOwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9hZG9iZV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOwotCi0gIHJhd3B0ciA9IChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0KSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5ib3V0X2RhdGEgPSByYXdwdHI7Ci0gIGV4ZWNfaGRyIChhYmZkKSA9ICZyYXdwdHItPmU7Ci0KLSAgYWRhdGEoYWJmZCkucmVsb2NfZW50cnlfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCk7Ci0gIGFkYXRhKGFiZmQpLnN5bWJvbF9lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gMTsgLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9hZG9iZV93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgc3dhcHBlZF9oZHI7Ci0gIHN0YXRpYyBzdHJ1Y3QgZXh0ZXJuYWxfc2VnZGVzYyBzZW50aW5lbFsxXTsJLyogSW5pdGlhbGl6ZWQgdG8gemVybyAqLwotICBhc2VjdGlvbiAqc2VjdDsKLQotICBleGVjX2hkciAoYWJmZCktPmFfaW5mbyA9IFpNQUdJQzsKLQotICAvKiBDYWxjdWxhdGUgdGV4dCBzaXplIGFzIHRvdGFsIG9mIHRleHQgc2VjdGlvbnMsIGV0Yy4gKi8KLQotICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCA9IDA7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhID0gMDsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2JzcyAgPSAwOwotICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplID0gMDsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZSA9IDA7Ci0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0NPREUpCXsKLSAgICAgIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICAgIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgKz0gc2VjdC0+cmVsb2NfY291bnQgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwpOwotICAgIH0gZWxzZSBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX2RhdGEgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZSArPSBzZWN0LT5yZWxvY19jb3VudCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCk7Ci0gICAgfSBlbHNlIGlmIChzZWN0LT5mbGFncyAmIFNFQ19BTExPQyAmJiAhKHNlY3QtPmZsYWdzICYgU0VDX0xPQUQpKSB7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfYnNzICArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgfQotICB9Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKQotICAgIAkJCQkqIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICBhb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjX2hkciAoYWJmZCksICZzd2FwcGVkX2hkcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmc3dhcHBlZF9oZHIsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLQkgICE9IEVYRUNfQllURVNfU0laRSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBUZXh0IGZpcnN0LCBkYXRhIG5leHQsIHJlc3QKLSAgICAgYWZ0ZXJ3YXJkLiAgKi8KLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJewotICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKLSAgICB9Ci0gIH0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0RBVEEpCXsKLSAgICAgIGFvdXRfYWRvYmVfd3JpdGVfc2VjdGlvbiAoYWJmZCwgc2VjdCk7Ci0gICAgfQotICB9Ci0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgIGlmICghKHNlY3QtPmZsYWdzICYgKFNFQ19DT0RFfFNFQ19EQVRBKSkpIHsKLSAgICAgIGFvdXRfYWRvYmVfd3JpdGVfc2VjdGlvbiAoYWJmZCwgc2VjdCk7Ci0gICAgfQotICB9Ci0KLSAgLyogV3JpdGUgZmluYWwgYHNlbnRpbmVsYCBzZWN0aW9uIGhlYWRlciAod2l0aCB0eXBlIG9mIDApLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc2VudGluZWwsIDEsIHNpemVvZiAoKnNlbnRpbmVsKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoKnNlbnRpbmVsKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKSAKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGFvdXRfMzJfd3JpdGVfc3ltcyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0NPREUpCXsKLSAgICAgICAgICBpZiAoIWFvdXRfMzJfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3QpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgICAgIGlmICghYW91dF8zMl9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgc2VjdCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdDsKLXsKLSAgLyogRklYTUUgWFhYICovCi19Ci0MCi1zdGF0aWMgYm9vbGVhbgotYW91dF9hZG9iZV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBmaWxlX3B0ciBzZWN0aW9uX3N0YXJ0OwotICBzZWNfcHRyIHNlY3Q7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpIHsgLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLQotICAgIC8qIEFzc2lnbiBmaWxlIG9mZnNldHMgdG8gc2VjdGlvbnMuICBUZXh0IHNlY3Rpb25zIGFyZSBmaXJzdCwgYW5kCi0gICAgICAgYXJlIGNvbnRpZ3VvdXMuICBUaGVuIGRhdGEgc2VjdGlvbnMuICBFdmVyeXRoaW5nIGVsc2UgYXQgdGhlIGVuZC4gICovCi0KLSAgICBzZWN0aW9uX3N0YXJ0ID0gTl9UWFRPRkYgKGlnbm9yZTwtLT5tZSk7Ci0KLSAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgICBzZWN0LT5maWxlcG9zID0gc2VjdGlvbl9zdGFydDsKLQkvKiBGSVhNRTogIFJvdW5kIHRvIGFsaWdubWVudCAqLwotCXNlY3Rpb25fc3RhcnQgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUyAmJgotCSAgIShzZWN0LT5mbGFncyAmIChTRUNfQ09ERXxTRUNfREFUQSkpKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogcmVnYXJkbGVzcywgb25jZSB3ZSBrbm93IHdoYXQgd2UncmUgZG9pbmcsIHdlIG1pZ2h0IGFzIHdlbGwgZ2V0IGdvaW5nICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgP3RydWU6ZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24KLSAgICAgIHx8IGFyY2ggPT0gYmZkX2FyY2hfbTY4aykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgCi1hb3V0X2Fkb2JlX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBib29sZWFuIGlnbm9yZTsKLXsKLSAgcmV0dXJuIHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci19Ci0KLQotCi0KLS8qIEJ1aWxkIHRoZSB0cmFuc2ZlciB2ZWN0b3IgZm9yIEFkb2JlIEEuT3V0IGZpbGVzLiAgKi8KLQotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCB2b2lkICosIHVuc2lnbmVkIGxvbmcpKSkgYmZkX251bGx2b2lkcHRyKQotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKLSAgKChyZWxvY19ob3d0b190eXBlICooKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKSkgYmZkX251bGx2b2lkcHRyKQotCi0jZGVmaW5lCWFvdXRfMzJfc2V0X2FyY2hfbWFjaAkJYW91dF9hZG9iZV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lCWFvdXRfMzJfc2V0X3NlY3Rpb25fY29udGVudHMJYW91dF9hZG9iZV9zZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lCWFvdXRfMzJfc2l6ZW9mX2hlYWRlcnMJCWFvdXRfYWRvYmVfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgYW91dF8zMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgYW91dF8zMl9iZmRfcmVsYXhfc2VjdGlvbiAgICAgICBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2djX3NlY3Rpb25zICAgICAgICAgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgYW91dF8zMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2xpbmtfYWRkX3N5bWJvbHMJX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYW91dF8zMl9iZmRfZmluYWxfbGluawkJX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYW91dF8zMl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCV9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBhX291dF9hZG9iZV92ZWMgPQotewotICAiYS5vdXQuYWRvYmUiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgdW5rbm93biAoYmlnIGFzc3VtZWQpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGRyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgKSwKLSAgLyogc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19SRUxPQyksCi0gICdfJywJCQkJLyogIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSB7X2JmZF9kdW1teV90YXJnZXQsIGFvdXRfYWRvYmVfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGFvdXRfYWRvYmVfbWtvYmplY3QsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGFvdXRfYWRvYmVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtYXJtLmMgYi9iZmQvYW91dC1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViOTAwYi4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIHJhdyBBUk0gYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAoKE5fTUFHSUMoeCkgPT0gTk1BR0lDKSA/IDB4ODAwMCA6IFwKLSAgIChOX01BR0lDKHgpICE9IFpNQUdJQykgPyAwIDogXAotICAgKE5fU0hBUkVEX0xJQih4KSkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgOiBcCi0gICBURVhUX1NUQVJUX0FERFIpCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDB4ODAwMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4ODAwMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfYXJtCi0KLSNkZWZpbmUgTVkoT1ApIENBVChhb3V0YXJtXyxPUCkKLSNkZWZpbmUgTl9CQURNQUcoeCkgKCgoKHgpLmFfaW5mbyAmIH4wMDcyMDApICE9IFpNQUdJQykgJiYgXAotICAgICAgICAgICAgICAgICAgICAgKCgoeCkuYV9pbmZvICYgfjAwNjAwMCkgIT0gT01BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKHgpLmFfaW5mbyAhPSBOTUFHSUMpKQotI2RlZmluZSBOX01BR0lDKHgpICgoeCkuYV9pbmZvICYgfjA3MjAwKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgTVlBUk0oT1ApIENBVChhb3V0YXJtXyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgCSpNWUFSTShiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0JCQkJUEFSQU1TKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiAJCU1ZQVJNKHdyaXRlX29iamVjdF9jb250ZW50cykJUEFSQU1TKChiZmQgKikpOwotCi0vKiBBdm9pZCBtdWx0aXBsZSBkZWZpbmluaXRpb25zIGZyb20gYW91dHggaWYgc3VwcG9ydGluZyBzdGFuZGFyYWQgYS5vdXQgCi0gICBhcyB3ZWxsIGFzIG91ciBvd24uICAqLwotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhhb3V0YXJtLF8zMl8seSkKLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dGFybV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1NWShmaXhfcGNyZWxfMjZfZG9uZSkJUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLU1ZKGZpeF9wY3JlbF8yNikJIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIE1ZKHN3YXBfc3RkX3JlbG9jX2luKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLAotCQkJCQkgICBhcmVsZW50ICosIGFzeW1ib2wgKiosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQgTVkoc3dhcF9zdGRfcmVsb2Nfb3V0KSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCAKLQkJCQkgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOwotCi1yZWxvY19ob3d0b190eXBlIE1ZKGhvd3RvX3RhYmxlKVtdID0KLXsKLSAgLyogdHlwZSBycyBzaXplIGJzeiBwY3JlbCBiaXRwb3Mgb3ZyZiBzZiBuYW1lIHBhcnRfaW5wbCByZWFkbWFzayBzZXRtYXNrCi0gICAgIHBjZG9uZSAqLwotICBIT1dUTyAoMCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsIHRydWUsCi0JIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDIsIDIsIDI2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIE1ZKGZpeF9wY3JlbF8yNiksCi0JICJBUk0yNiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoNCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCB0cnVlLAotCSAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8gKDUsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCB0cnVlLAotCSAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKDYsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKDcsIDIsIDIsIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSBNWShmaXhfcGNyZWxfMjZfZG9uZSksICJBUk0yNkQiLCB0cnVlLCAweDAsIDB4MCwKLQkgZmFsc2UpLAotICB7LTF9LAotICBIT1dUTyAoOSwgMCwgLTEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJORUcxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDEwLCAwLCAtMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIk5FRzMyIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpCi19OwotCi0jZGVmaW5lIFJFTE9DX0FSTV9CSVRTX05FR19CSUcgICAgICAoKHVuc2lnbmVkIGludCkgMHgwOCkKLSNkZWZpbmUgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSAgICgodW5zaWduZWQgaW50KSAweDEwKQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvKShhYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbDsKLSAgICAgaW50ICpyX2luZGV4OwotICAgICBpbnQgKnJfZXh0ZXJuOwotICAgICBpbnQgKnJfcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJfcGNyZWxfZG9uZTsKLSAgdW5zaWduZWQgaW50IHJfbmVnOwotICBpbnQgaW5kZXg7Ci0KLSAgKnJfcGNyZWwgPSAwOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICAqcl9pbmRleCAgICAgPSAgKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLSAgICAgICpyX2V4dGVybiAgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgICAgcl9uZWcgCSAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRykpOwotICAgICAgcl9sZW5ndGggICAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0JCSAgICAgID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyX2luZGV4ICAgICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgfCByZWwtPnJfaW5kZXhbMF0pOwotICAgICAgKnJfZXh0ZXJuICAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0gICAgICByX25lZyAJICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFKSk7Ci0gICAgICByX2xlbmd0aCAgICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLQkJICAgICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotICBpbmRleCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWxfZG9uZSArIDggKiByX25lZzsKLSAgaWYgKGluZGV4ID09IDMpCi0gICAgKnJfcGNyZWwgPSAxOwotCi0gIHJldHVybiBNWShob3d0b190YWJsZSkgKyBpbmRleDsKLX0KLSAKLSNkZWZpbmUgTVlfcmVsb2NfaG93dG8oQkZELCBSRUwsIElOLCBFWCwgUEMpIFwKLQlNWShyZWxvY19ob3d0bykgKEJGRCwgUkVMLCAmSU4sICZFWCwgJlBDKQotCi12b2lkCi1NWShwdXRfcmVsb2MpKGFiZmQsIHJfZXh0ZXJuLCByX2luZGV4LCB2YWx1ZSwgaG93dG8sIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByX2V4dGVybjsKLSAgICAgaW50IHJfaW5kZXg7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnOwotCi0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0KLSAgLyogU3BlY2lhbCBjYXNlIGZvciBicmFuY2ggcmVsb2NhdGlvbnMuICovCi0gIGlmIChob3d0by0+dHlwZSA9PSAzIHx8IGhvd3RvLT50eXBlID09IDcpCi0gICAgcl9sZW5ndGggPSAzOwotCi0gIHJfcGNyZWwgID0gaG93dG8tPnR5cGUgJiA0OyAJLyogUEMgUmVsYXRpdmUgZG9uZT8gKi8KLSAgcl9uZWcgPSBob3d0by0+dHlwZSAmIDg7CS8qIE5lZ2F0aXZlIHJlbG9jYXRpb24gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICByZWxvYy0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICByZWxvYy0+cl90eXBlWzBdID0KLQkoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCSB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHIDogMCkKLQkgfCAocl9uZWcgPwkgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRyA6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICByZWxvYy0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICByZWxvYy0+cl90eXBlWzBdID0KLQkoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQkgfCAocl9uZWcgPwkgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSA6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0gICAgfQotfQotIAotI2RlZmluZSBNWV9wdXRfcmVsb2MoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpIFwKLSAgTVkocHV0X3JlbG9jKShCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykKLQotdm9pZAotTVkocmVsb2NhdGFibGVfcmVsb2MpKGhvd3RvLCBhYmZkLCByZWxvYywgYW1vdW50LCByX2FkZHIpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jOwotICAgICBiZmRfdm1hICphbW91bnQ7Ci0gICAgIGJmZF92bWEgcl9hZGRyOwotewotICBpZiAoaG93dG8tPnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBpZiAocmVsb2MtPnJfdHlwZVswXSAKLQkgICYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkKLQkgICAgID8gUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKQotCXsKLQkgIC8qIFRoZSByZWxvYyBpcyBzdGlsbCBleHRlcm5hbCwgc28gZG9uJ3QgbW9kaWZ5IGFueXRoaW5nLiAqLwotCSAgKmFtb3VudCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICphbW91bnQgLT0gcl9hZGRyOwotCSAgLyogQ2hhbmdlIHRoZSByX3BjcmVsIHZhbHVlIC0tIG9uIHRoZSBBUk0sIHRoaXMgYml0IGlzIHNldCBvbmNlIHRoZQotCSAgICAgcmVsb2NhdGlvbiBpcyBkb25lLiAgKi8KLQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCSAgICByZWxvYy0+cl90eXBlWzBdIHw9IFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzsKLQkgIGVsc2UKLQkgICAgcmVsb2MtPnJfdHlwZVswXSB8PSBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoaG93dG8tPnR5cGUgPT0gNykKLSAgICAqYW1vdW50ID0gMDsKLX0KLQotI2RlZmluZSBNWV9yZWxvY2F0YWJsZV9yZWxvYyhIT1csIEJGRCwgUkVMLCBBTU9VTlQsIEFERFIpIFwKLSAgTVkocmVsb2NhdGFibGVfcmVsb2MpKEhPVywgQkZELCBSRUwsICYoQU1PVU5UKSwgQUREUikKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2X2RvbmUpIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIFRoaXMgaXMgZGVhZCBzaW1wbGUgYXQgcHJlc2VudC4gICovCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLU1ZKGZpeF9wY3JlbF8yNikgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgdGFyZ2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIAotICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2Nfb2sgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZSBzZWN0aW9ucyBhcmUgZGlmZmVyZW50LCBhbmQgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLAotICAgICBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSAhPSBpbnB1dF9zZWN0aW9uLT5uYW1lCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgcmVsb2NhdGlvbiA9ICh0YXJnZXQgJiAweDAwZmZmZmZmKSA8PCAyOwotICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gXiAweDAyMDAwMDAwKSAtIDB4MDIwMDAwMDA7IC8qIFNpZ24gZXh0ZW5kICovCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT52YWx1ZTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uIC09IGFkZHI7Ci0gIGlmIChyZWxvY2F0aW9uICYgMykKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICBpZiAocmVsb2NhdGlvbiAmIDB4MDIwMDAwMDApCi0gICAgewotICAgICAgaWYgKChyZWxvY2F0aW9uICYgfiAoYmZkX3ZtYSkgMHgwM2ZmZmZmZikgIT0gfiAoYmZkX3ZtYSkgMHgwM2ZmZmZmZikKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgZWxzZSBpZiAocmVsb2NhdGlvbiAmIH4weDAzZmZmZmZmKQotICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgdGFyZ2V0ICY9IH4weDAwZmZmZmZmOwotICB0YXJnZXQgfD0gKHJlbG9jYXRpb24gPj4gMikgJiAweDAwZmZmZmZmOwotICBiZmRfcHV0XzMyIChhYmZkLCB0YXJnZXQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgLyogTm93IHRoZSBBUk0gbWFnaWMuLi4gQ2hhbmdlIHRoZSByZWxvYyB0eXBlIHNvIHRoYXQgaXQgaXMgbWFya2VkIGFzIGRvbmUuCi0gICAgIFN0cmljdGx5IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLiAgKi8KLSAgcmVsb2NfZW50cnktPmhvd3RvID0gJk1ZKGhvd3RvX3RhYmxlKVs3XTsKLSAgCi0gIHJldHVybiBmbGFnOwotfQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKGJmZF9yZWxvY190eXBlX2xvb2t1cCkoYWJmZCxjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotI2RlZmluZSBBU1REKGksaikgICAgICAgY2FzZSBpOiByZXR1cm4gJk1ZKGhvd3RvX3RhYmxlKVtqXQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNiwgMSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzIsIDIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsIDMpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzhfUENSRUwsIDQpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCA1KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgNik7Ci0gICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgfQotfQotCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX2luIE1ZKHN3YXBfc3RkX3JlbG9jX2luKQotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19vdXQgTVkoc3dhcF9zdGRfcmVsb2Nfb3V0KQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLS8qICNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKi8KLS8qICNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKi8KLS8qICNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsgKi8KLQotI2luY2x1ZGUgImFvdXR4LmgiCi0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19pbiAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX3BjcmVsOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IE1ZX3JlbG9jX2hvd3RvIChhYmZkLCBieXRlcywgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotCi0gIE1PVkVfQUREUkVTUyAoMCk7Ci19Ci0KLXZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25lZyA9IDA7CS8qIE5lZ2F0aXZlIHJlbG9jcyB1c2UgdGhlIEJBU0VSRUwgYml0LiAgKi8KLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZSA7ICAgLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLwotICBpZiAocl9sZW5ndGggPCAwKQotICAgIHsKLSAgICAgIHJfbGVuZ3RoID0gLXJfbGVuZ3RoOwotICAgICAgcl9uZWcgPSAxOwotICAgIH0KLQotICByX3BjcmVsICA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsgLyogUmVsYXRpdmUgdG8gUEM/ICovCi0KLSAgLyogRm9yIFJJU0MgaVgsIGluIHBjLXJlbGF0aXZlIHJlbG9jcyB0aGUgcl9wY3JlbCBiaXQgbWVhbnMgdGhhdCB0aGUKLSAgICAgcmVsb2NhdGlvbiBoYXMgYmVlbiBkb25lIGFscmVhZHkgKE9ubHkgZm9yIHRoZSAyNi1iaXQgb25lIEkgdGhpbmspPz8/ISEhCi0gICAgICovCi0KLSAgaWYgKGctPmhvd3RvLT50eXBlID09IDMpCi0gICAgewotICAgICAgcl9sZW5ndGggPSAzOwotICAgICAgcl9wY3JlbCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChnLT5ob3d0by0+dHlwZSA9PSA3KQotICAgIHsgCi0gICAgICByX2xlbmd0aCA9IDM7Ci0gICAgICByX3BjcmVsID0gMTsKLSAgICB9Ci0gIAotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRzogMCkKLQkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzogMCkKLQkgfCAocl9uZWcgICAgPyAgIFJFTE9DX0FSTV9CSVRTX05FR19CSUc6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRTogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgTVlfQkZEX1RBUkdFVAotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9saXR0bGVfdmVjID0KLXsKLSAgImEub3V0LWFybS1saXR0bGUiLCAgICAgICAgICAgLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgICAgLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYyA9Ci17Ci0gICJhLm91dC1hcm0tYmlnIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLCAgICAgICAgICAgICAgIC8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLCAgICAgICAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8ICAgICAgICAgLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsICAgICAgICAgICAgICAgICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LCAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtZW5jYXAuYyBiL2JmZC9hb3V0LWVuY2FwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWY5MDM3Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWVuY2FwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhLm91dCBmaWxlcyBlbmNhcHN1bGF0ZWQgd2l0aCBDT0ZGIGhlYWRlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVEhJUyBNT0RVTEUgSVMgTk9UIEZJTklTSEVELiAgSVQgUFJPQkFCTFkgRE9FU04nVCBFVkVOIENPTVBJTEUuICAqLwotCi0jaWYgMAotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPHN5c2RlcC5oPgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgPGFvdXQvYW91dDY0Lmg+Ci0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKmVuY2FwX3JlYWxfY2FsbGJhY2sgKCk7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKgotZW5jYXBfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY2J1Zls0XTsgLyogUmF3IGJ5dGVzIG9mIG1hZ2ljIG51bWJlciBmcm9tIGZpbGUgKi8KLSAgdW5zaWduZWQgbG9uZyBtYWdpYzsJCS8qIFN3YXBwZWQgbWFnaWMgbnVtYmVyICovCi0gIHNob3J0IGNvZmZfbWFnaWM7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKW1hZ2ljYnVmLCAxLCBzaXplb2YgKG1hZ2ljYnVmKSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobWFnaWNidWYpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIGNvZmZfbWFnaWMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIG1hZ2ljYnVmKTsKLSAgaWYgKGNvZmZfbWFnaWMgIT0gQ09GRl9NQUdJQykKLSAgICByZXR1cm4gMDsJCQkvKiBOb3QgYW4gZW5jYXAgY29mZiBmaWxlICovCi0KLSAgX19oZWFkZXJfb2Zmc2V0X3RlbXA9PUNPRkZfTUFHSUMgPyBzaXplb2Yoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKLSAgKGZzZWVrICgoZiksIEhFQURFUl9PRkZTRVQoKGYpKSwgMSkpCi0KLSAgbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIG1hZ2ljYnVmKTsKLQotICBpZiAoTl9CQURNQUcgKCooKHN0cnVjdCBpbnRlcm5hbF9leGVjICopICZtYWdpYykpKSByZXR1cm4gMDsKLQotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZleGVjLCBlbmNhcF9yZWFsY2FsbGJhY2spOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYSBlbmNhcHN1bGF0ZWQtY29mZiBhLm91dCBmaWxlIGhlYWRlciAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1lbmNhcF9yZWFsX2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgCi0gIE1ZKGNhbGxiYWNrKShhYmZkLCBleGVjcCk7Ci0gIAotICAvKiBJZiB3ZSBoYXZlIGEgY29mZiBoZWFkZXIsIGl0IGNhbiBnaXZlIHVzIGJldHRlciB2YWx1ZXMgZm9yCi0gICAgIHRleHRfc3RhcnQgYW5kIGV4ZWNfZGF0YV9zdGFydC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bAotICAgICBmb3IgcmVtb3RlIGRlYnVnZ2luZyBvZiBlbWJlZGRlZCBzeXN0ZW1zLiAgKi8KLSAgaWYgKE5fRkxBR1MoZXhlY19hb3V0aGRyKSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkKLSAgewotCSAgc3RydWN0IGNvZmZoZWFkZXIgY2g7Ci0JICBpbnQgdmFsOwotCSAgdmFsID0gbHNlZWsgKGV4ZWNjaGFuLCAtKHNpemVvZiAoQU9VVEhEUikgKyBzaXplb2YgKGNoKSksIDEpOwotCSAgaWYgKHZhbCA9PSAtMSkKLQkJICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7Ci0JICB2YWwgPSBteXJlYWQgKGV4ZWNjaGFuLCAmY2gsIHNpemVvZiAoY2gpKTsKLQkgIGlmICh2YWwgPCAwKQotCQkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKLQkgIHRleHRfc3RhcnQgPSBjaC50ZXh0X3N0YXJ0OwotCSAgZXhlY19kYXRhX3N0YXJ0ID0gY2guZGF0YV9zdGFydDsKLSAgfSBlbHNlCi0JIHsKLQkgIHRleHRfc3RhcnQgPQotCSAgICBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKSA/IDAgOiBOX1RYVEFERFIgKGV4ZWNfYW91dGhkcik7Ci0JICBleGVjX2RhdGFfc3RhcnQgPSBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKQotCSAgICA/IGV4ZWNfYW91dGhkci5hX3RleHQgOiBOX0RBVEFERFIgKGV4ZWNfYW91dGhkcik7Ci0gIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7IC8qIEZJWE1FICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEVuY2Fwc3VsYXRlZCBDT0ZGIGZvcm1hdC4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotYm9vbGVhbgotZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9wYWQgPSAwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLS8qKioqKiogRklYTUU6ICBGcmFnbWVudHMgZnJvbSB0aGUgb2xkIEdOVSBMRCBwcm9ncmFtIGZvciBkZWFsaW5nIHdpdGgKLSAgICAgICAgZW5jYXAgY29mZi4gICovCi1zdHJ1Y3QgY29mZmhlYWRlciBjb2ZmaGVhZGVyOwotaW50IG5lZWRfY29mZl9oZWFkZXI7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gY291bnQgdGhlIGhlYWRlciBhcyBwYXJ0IG9mCi0gICAgIHRoZSB0ZXh0IHNpemUsIGFuZCBpbml0aWFsaXplIHRoZSB0ZXh0IHNpemUgYWNjb3JkaW5nbHkuCi0gICAgIFRoaXMgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBzeXN0ZW0gYW5kIG9uIHRoZSBvdXRwdXQgZm9ybWF0IHNlbGVjdGVkLiAgKi8KLQotICBOX1NFVF9NQUdJQyAob3V0aGVhZGVyLCBtYWdpYyk7Ci0jaWZkZWYgSU5JVElBTElaRV9IRUFERVIKLSAgSU5JVElBTElaRV9IRUFERVI7Ci0jZW5kaWYKLQotICB0ZXh0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleGVjKTsKLSNpZmRlZiBDT0ZGX0VOQ0FQU1VMQVRFCi0gIGlmIChyZWxvY2F0YWJsZV9vdXRwdXQgPT0gMCAmJiBmaWxlX3RhYmxlWzBdLmp1c3Rfc3ltc19mbGFnID09IDApCi0gICAgewotICAgICAgbmVlZF9jb2ZmX2hlYWRlciA9IDE7Ci0gICAgICAvKiBzZXQgdGhpcyBmbGFnIG5vdywgc2luY2UgaXQgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBOX1RYVE9GRiwgZXRjICovCi0gICAgICBOX1NFVF9GTEFHUyAob3V0aGVhZGVyLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLSAgICAgIHRleHRfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCi0gICAgewotICAgICAgLyogV2UgYXJlIGVuY2Fwc3VsYXRpbmcgQlNEIGZvcm1hdCB3aXRoaW4gQ09GRiBmb3JtYXQuICAqLwotICAgICAgc3RydWN0IGNvZmZzY24gKnRwLCAqZHAsICpicDsKLQotICAgICAgdHAgPSAmY29mZmhlYWRlci5zY25zWzBdOwotICAgICAgZHAgPSAmY29mZmhlYWRlci5zY25zWzFdOwotICAgICAgYnAgPSAmY29mZmhlYWRlci5zY25zWzJdOwotCi0gICAgICBzdHJjcHkgKHRwLT5zX25hbWUsICIudGV4dCIpOwotICAgICAgdHAtPnNfcGFkZHIgPSB0ZXh0X3N0YXJ0OwotICAgICAgdHAtPnNfdmFkZHIgPSB0ZXh0X3N0YXJ0OwotICAgICAgdHAtPnNfc2l6ZSA9IHRleHRfc2l6ZTsKLSAgICAgIHRwLT5zX3NjbnB0ciA9IHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYyk7Ci0gICAgICB0cC0+c19yZWxwdHIgPSAwOwotICAgICAgdHAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICB0cC0+c19ucmVsb2MgPSAwOwotICAgICAgdHAtPnNfbmxubm8gPSAwOwotICAgICAgdHAtPnNfZmxhZ3MgPSAweDIwOwotICAgICAgc3RyY3B5IChkcC0+c19uYW1lLCAiLmRhdGEiKTsKLSAgICAgIGRwLT5zX3BhZGRyID0gZGF0YV9zdGFydDsKLSAgICAgIGRwLT5zX3ZhZGRyID0gZGF0YV9zdGFydDsKLSAgICAgIGRwLT5zX3NpemUgPSBkYXRhX3NpemU7Ci0gICAgICBkcC0+c19zY25wdHIgPSB0cC0+c19zY25wdHIgKyB0cC0+c19zaXplOwotICAgICAgZHAtPnNfcmVscHRyID0gMDsKLSAgICAgIGRwLT5zX2xubm9wdHIgPSAwOwotICAgICAgZHAtPnNfbnJlbG9jID0gMDsKLSAgICAgIGRwLT5zX25sbm5vID0gMDsKLSAgICAgIGRwLT5zX2ZsYWdzID0gMHg0MDsKLSAgICAgIHN0cmNweSAoYnAtPnNfbmFtZSwgIi5ic3MiKTsKLSAgICAgIGJwLT5zX3BhZGRyID0gZHAtPnNfdmFkZHIgKyBkcC0+c19zaXplOwotICAgICAgYnAtPnNfdmFkZHIgPSBicC0+c19wYWRkcjsKLSAgICAgIGJwLT5zX3NpemUgPSBic3Nfc2l6ZTsKLSAgICAgIGJwLT5zX3NjbnB0ciA9IDA7Ci0gICAgICBicC0+c19yZWxwdHIgPSAwOwotICAgICAgYnAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICBicC0+c19ucmVsb2MgPSAwOwotICAgICAgYnAtPnNfbmxubm8gPSAwOwotICAgICAgYnAtPnNfZmxhZ3MgPSAweDgwOwotCi0gICAgICBjb2ZmaGVhZGVyLmZfbWFnaWMgPSBDT0ZGX01BR0lDOwotICAgICAgY29mZmhlYWRlci5mX25zY25zID0gMzsKLSAgICAgIC8qIHN0b3JlIGFuIHVubGlrZWx5IHRpbWUgc28gcHJvZ3JhbXMgY2FuCi0gICAgICAgKiB0ZWxsIHRoYXQgdGhlcmUgaXMgYSBic2QgaGVhZGVyCi0gICAgICAgKi8KLSAgICAgIGNvZmZoZWFkZXIuZl90aW1kYXQgPSAxOwotICAgICAgY29mZmhlYWRlci5mX3N5bXB0ciA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLmZfbnN5bXMgPSAwOwotICAgICAgY29mZmhlYWRlci5mX29wdGhkciA9IDI4OwotICAgICAgY29mZmhlYWRlci5mX2ZsYWdzID0gMHgxMDM7Ci0gICAgICAvKiBhb3V0aGRyICovCi0gICAgICBjb2ZmaGVhZGVyLm1hZ2ljID0gWk1BR0lDOwotICAgICAgY29mZmhlYWRlci52c3RhbXAgPSAwOwotICAgICAgY29mZmhlYWRlci50c2l6ZSA9IHRwLT5zX3NpemU7Ci0gICAgICBjb2ZmaGVhZGVyLmRzaXplID0gZHAtPnNfc2l6ZTsKLSAgICAgIGNvZmZoZWFkZXIuYnNpemUgPSBicC0+c19zaXplOwotICAgICAgY29mZmhlYWRlci5lbnRyeSA9IG91dGhlYWRlci5hX2VudHJ5OwotICAgICAgY29mZmhlYWRlci50ZXh0X3N0YXJ0ID0gdHAtPnNfdmFkZHI7Ci0gICAgICBjb2ZmaGVhZGVyLmRhdGFfc3RhcnQgPSBkcC0+c192YWRkcjsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCi0gICAgbXl3cml0ZSAoJmNvZmZoZWFkZXIsIHNpemVvZiBjb2ZmaGVhZGVyLCAxLCBvdXRkZXNjKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgcGFkZmlsZSAoTl9UWFRPRkYgKG91dGhlYWRlcikgLSBzaXplb2Ygb3V0aGVhZGVyLCBvdXRkZXNjKTsKLSNlbmRpZgotCi0gIHRleHRfc2l6ZSAtPSBOX1RYVE9GRiAob3V0aGVhZGVyKTsKLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50IGVuY2FwX3dyaXRlX29iamVjdF9jb250ZW50cwotI2RlZmluZSBNWV9vYmplY3RfcCBlbmNhcF9vYmplY3RfcAotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC1uczMyay5jIGIvYmZkL2FvdXQtbnMzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzMzVhYS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC1uczMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgbnMzMmsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gRGFsbCAoaWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgIm5zMzJrLmgiCi0KLSNkZWZpbmUgTVlOUyhPUCkgQ0FUKG5zMzJrYW91dF8sT1ApCi1yZWxvY19ob3d0b190eXBlICoKLU1ZTlMoYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWJvb2xlYW4KLU1ZTlMod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICBQQVJBTVMoKGJmZCAqYWJmZCkpOwotCi0vKiBBdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9ucyBmcm9tIGFvdXR4IGlmIHN1cHBvcnRpbmcgc3RhbmRhcmQgYS5vdXQgZm9ybWF0KHMpCi0gKiBhcyB3ZWxsIGFzIHRoaXMgb25lCi0gKi8KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotdm9pZCBiZmRfbnMzMmtfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgTVkoT1ApIE1ZTlMoT1ApCi0KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTVkoc3dhcF9zdGRfcmVsb2NfaW4pCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpCi0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzLAotCQkJICAgICAgYXJlbGVudCAqY2FjaGVfcHRyLCBhc3ltYm9sICoqc3ltYm9scywKLQkJCSAgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQpKTsKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmcsCi0JCQkgICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyKSk7Ci0KLS8qIFRoZSBuczMyayBzZXJpZXMgaXMgYWgsIHVudXN1YWwsIHdoZW4gaXQgY29tZXMgdG8gcmVsb2NhdGlvbi4KLSAqIFRoZXJlIGFyZSB0aHJlZSBzdG9yYWdlIG1ldGhvZHMgZm9yIHJlbG9jYXRlYWJsZSBvYmplY3RzLiAgVGhlcmUKLSAqIGFyZSBkaXNwbGFjZW1lbnRzLCBpbW1lZGlhdGUgb3BlcmFuZHMgYW5kIG9yZGluYXJ5IHR3b3MgY29tcGxlbWVudAotICogZGF0YS4gT2YgdGhlc2UsIG9ubHkgdGhlIGxhc3QgZml0cyBpbnRvIHRoZSBzdGFuZGFyZCByZWxvY2F0aW9uCi0gKiBzY2hlbWUuICBJbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHN0b3JlZCBodWZmbWFuIGVuY29kZWQgYW5kCi0gKiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHN0b3JlZCBiaWcgZW5kaWFuICh3aGVyZSBhcyB0aGUgbmF0dXJhbCBieXRlCi0gKiBvcmRlciBpcyBsaXR0bGUgZW5kaWFuIGZvciB0aGlzIGFjaGl0ZWN0dXJlKS4KLQotICogTm90ZSB0aGF0IHRoZSBuczMyayBkaXNwbGFjZW1lbnQgc3RvcmFnZSBtZXRob2QgaXMgb3J0aG9nb25hbCB0bwotICogd2hldGhlciB0aGUgcmVsb2NhdGlvbiBpcyBwYyByZWxhdGl2ZSBvciBub3QuIFRoZSAiZGlzcGxhY2VtZW50IgotICogc3RvcmFnZSBzY2hlbWUgaXMgdXNlZCBmb3IgZXNzZW50aWFsbHkgYWxsIGFkZHJlc3MgY29uc3RhbnRzLiBUaGUKLSAqIGRpc3BsYWNlbWVudCBjYW4gYmUgcmVsYXRpdmUgdG8gemVybyAoYWJzb2x1dGUgZGlzcGxhY2VtZW50KSwKLSAqIHJlbGF0aXZlIHRvIHRoZSBwYyAocGMgcmVsYXRpdmUpLCB0aGUgc3RhY2sgcG9pbnRlciwgdGhlIGZyYW1lCi0gKiBwb2ludGVyLCB0aGUgc3RhdGljIGJhc2UgcmVnaXN0ZXIgYW5kIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBldGMuCi0KLSAqIEZvciBleGFtcGxlOgotICoKLSAqICBzeW0xOiAubG9uZyAuCSMgcGMgcmVsYXRpdmUgMidzIGNvbXBsZW1lbnQKLSAqICBzeW0xOiAubG9uZyBmb28JIyAyJ3MgY29tcGxlbWVudCBub3QgcGMgcmVsYXRpdmUKLSAqCi0gKiAgc2VsZjogIG1vdmQgQHNlbGYsIHIwICMgcGMgcmVsYXRpdmUgZGlzcGxhY2VtZW50Ci0gKgkgICBtb3ZkIGZvbywgcjAgIyBub24gcGMgcmVsYXRpdmUgZGlzcGxhY2VtZW50Ci0gKgotICogIHNlbGY6ICBtb3ZkIHNlbGYsIHIwICMgcGMgcmVsYXRpdmUgaW1tZWRpYXRlCi0gKiAgICAgICAgIG1vdmQgZm9vLCByMCAjIG5vbiBwYyByZWxhdGl2ZSBpbW1lZGlhdGUKLSAqCi0gKiBJbiBhZGRpdGlvbiwgZm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHJlbG9jYXRpb24gdHlwZXMKLSAqIGluIHRoZSBhLm91dCBmb3JtYXQgcmVsb2NhdGlvbiBlbnRyaWVzIGlzIHN1Y2ggdGhhdCBldmVuIHRoZSByZWxvY2F0aW9uCi0gKiBtZXRob2RzIHdoaWNoIGFyZSBzdGFuZGFyZCBhcmUgbm90IGVuY29kZWQgdGhlIHN0YW5kYXJkIHdheS4KLSAqCi0gKi8KLQotcmVsb2NfaG93dG9fdHlwZSBNWShob3d0b190YWJsZSlbXSA9IAotewotICAvKiBuczMyayBpbW1lZGlhdGUgb3BlcmFuZHMgKi8KLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fOCwgMCwgMCwgOCwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiTlMzMktfSU1NXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICAiTlMzMktfSU1NXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiTlMzMktfSU1NXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsIDAsIDAsIDgsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV84IiwKLQkgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV8zMiIsCi0JIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIC8qIG5zMzJrIGRpc3BsYWNlbWVudHMgKi8KLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsIDAsIDAsIDgsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJOUzMyS19ESVNQXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfMTYiLAotCSB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJOUzMyS19ESVNQXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIlBDUkVMX05TMzJLX0RJU1BfOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsIDAsIDEsIDE2LCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsIDAsIDIsIDMyLCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF8zMiIsCi0JIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIC8qIE5vcm1hbCAyJ3MgY29tcGxlbWVudCAqLwotICBIT1dUTyAoQkZEX1JFTE9DXzgsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLAotCSAiOCIsIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICIxNiIsIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICIzMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzhfUENSRUwsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzgiLCB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ18xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMzJfUENSRUwsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCi0JICJQQ1JFTF8zMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSE9XVE8oQkZEKSAoTVkoaG93dG9fdGFibGUpICsgMTQpCi0KLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9CSUcgMHgwNgotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0xJVFRMRSAweDYwCi0jZGVmaW5lIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfU0hfQklHIDEKLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9MSVRUTEUgNQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvKShhYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbDsKLSAgICAgaW50ICpyX2luZGV4OwotICAgICBpbnQgKnJfZXh0ZXJuOwotICAgICBpbnQgKnJfcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfbnMzMmtfdHlwZTsKLS8qICBCRkRfQVNTRVJUKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOyAqLwotICAqcl9pbmRleCA9ICAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkgICAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JICAgICAgIHwgIHJlbC0+cl9pbmRleFswXSApOwotICAqcl9leHRlcm4gID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotICAqcl9wY3JlbCAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0gIHJfbGVuZ3RoICA9ICAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLQkJPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gIHJfbnMzMmtfdHlwZSAgPSAgKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9MSVRUTEUpOwotICByZXR1cm4gKE1ZKGhvd3RvX3RhYmxlKSArIHJfbGVuZ3RoICsgMyAqICgqcl9wY3JlbCkgKyA2ICogcl9uczMya190eXBlKTsKLX0KLQotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsUkVMLElOLEVYLFBDKSBNWShyZWxvY19ob3d0bykoQkZELCBSRUwsICZJTiwgJkVYLCAmUEMpCi0KLXZvaWQKLU1ZKHB1dF9yZWxvYykoYWJmZCwgcl9leHRlcm4sIHJfaW5kZXgsIHZhbHVlLCBob3d0bywgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHJfZXh0ZXJuOwotICAgICBpbnQgcl9pbmRleDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jOwotewotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9uczMya190eXBlOwotICBQVVRfV09SRCAoYWJmZCwgdmFsdWUsIHJlbG9jLT5yX2FkZHJlc3MpOwotICByX2xlbmd0aCA9IGhvd3RvLT5zaXplIDsJLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLwotICByX3BjcmVsICA9IChpbnQpIGhvd3RvLT5wY19yZWxhdGl2ZTsgLyogUmVsYXRpdmUgdG8gUEM/ICovCi0gIHJfbnMzMmtfdHlwZSA9IChob3d0byAtIE1ZKGhvd3RvX3RhYmxlKSApLzY7Ci0vKiAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7ICovCi0gIHJlbG9jLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gIHJlbG9jLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgcmVsb2MtPnJfdHlwZVswXSA9Ci0gICAgKHJfZXh0ZXJuPyAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotICAgICAgfCAocl9wY3JlbD8gICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTogMCkKLQl8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkKLQkgIHwgKHJfbnMzMmtfdHlwZSA8PCAgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9MSVRUTEUpOwotfQotCi0jZGVmaW5lIE1ZX3B1dF9yZWxvYyhCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykgXAotICBNWShwdXRfcmVsb2MpKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKQotCi0jZGVmaW5lIFNUQVRfRk9SX0VYRUMKLQotI2RlZmluZSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIF9iZmRfbnMzMmtfZmluYWxfbGlua19yZWxvY2F0ZQotI2RlZmluZSBNWV9yZWxvY2F0ZV9jb250ZW50cyBfYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzCi0KLSNpbmNsdWRlIDxhb3V0eC5oPgotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKGJmZF9yZWxvY190eXBlX2xvb2t1cCkoYWJmZCxjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotCi0jZGVmaW5lIEVOVFJZKGksaikJY2FzZSBpOiByZXR1cm4gJk1ZKGhvd3RvX3RhYmxlKVtqXQotCi0gIGludCBleHQgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPT0gUkVMT0NfRVhUX1NJWkU7Ci0KLSAgQkZEX0FTU0VSVChleHQgPT0gMCk7Ci0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLQljb2RlID0gQkZEX1JFTE9DXzMyOwotCWJyZWFrOwotICAgICAgfQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV84LCAwKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsIDEpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8zMiwgMik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsIDMpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwgNCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMLCA1KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsIDYpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsIDcpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfMzIsIDgpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwgOSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwgMTApOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsIDExKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ184LCAxMik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfMTYsIDEzKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ18zMiwgMTQpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzhfUENSRUwsIDE1KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ18xNl9QQ1JFTCwgMTYpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzMyX1BDUkVMLCAxNyk7Ci0gICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotI3VuZGVmIEVOVFJZCi19Ci0KLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX2luIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfcGNyZWw7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLQotICBjYWNoZV9wdHItPmhvd3RvID0gTVlfcmVsb2NfaG93dG8oYWJmZCwgYnl0ZXMsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKTsKLQotICBNT1ZFX0FERFJFU1MoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19vdXQgKGFiZmQsIGcsIG5hdHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpnOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHI7Ci17Ci0gIGludCByX2luZGV4OwotICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgIAotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUgCi0gICAgIHJfaW5kZXggdG8gdGhlIHN5bWJvbHMgaW5kZXgsIGFuZCB0aGUgcl9leHRlcm4gYml0LgotCi0gICAgIEFic29sdXRlIHN5bWJvbHMgY2FuIGNvbWUgaW4gaW4gdHdvIHdheXMsIGVpdGhlciBhcyBhbiBvZmZzZXQKLSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24sIG9yIGFzIGEgc3ltYm9sIHdoaWNoIGhhcyBhbiBhYnMgdmFsdWUuCi0gICAgIENoZWNrIGZvciB0aGF0IGhlcmUuICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikgCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbi5zeW1ib2wgPT0gc3ltKQotCXsKLQkgIC8qIFdob29wcywgbG9va2VkIGxpa2UgYW4gYWJzIHN5bWJvbCwgYnV0IGlzIHJlYWxseSBhbiBvZmZzZXQKLQkgICAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0JICByX2luZGV4ID0gMDsKLQkgIHJfZXh0ZXJuID0gMDsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIC8qIEZpbGwgaW4gc3ltYm9sICovCi0JICByX2V4dGVybiA9IDE7Ci0jdW5kZWYgS0VFUElUCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0JICByX2luZGV4ID0gICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLSN1bmRlZiBLRUVQSVQgICAgIAotCX0KLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7ICAgICAgCi0gICAgfQotCi0gIE1ZX3B1dF9yZWxvYyAoYWJmZCwgcl9leHRlcm4sIHJfaW5kZXgsIGctPmFkZHJlc3MsIGctPmhvd3RvLCBuYXRwdHIpOwotfQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgYmZkX2J5dGUgKmxvY2F0aW9uOwotewotICBpbnQgcl9uczMya190eXBlID0gKGhvd3RvIC0gTVkoaG93dG9fdGFibGUpKSAvIDY7Ci0gIGxvbmcgKCpnZXRfZGF0YSkgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotICBpbnQgKCpwdXRfZGF0YSkgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotCi0gIHN3aXRjaCAocl9uczMya190eXBlKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBnZXRfZGF0YSA9IF9iZmRfbnMzMmtfZ2V0X2ltbWVkaWF0ZTsKLSAgICAgIHB1dF9kYXRhID0gX2JmZF9uczMya19wdXRfaW1tZWRpYXRlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgZ2V0X2RhdGEgPSBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQ7Ci0gICAgICBwdXRfZGF0YSA9IF9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICBsb2NhdGlvbik7Ci0gICAgICAvKiBOT1QgUkVBQ0hFRCAqLwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLSAgcmV0dXJuIF9iZmRfZG9fbnMzMmtfcmVsb2NfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGxvY2F0aW9uLCBnZXRfZGF0YSwgcHV0X2RhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtc3BhcmNsZS5jIGIvYmZkL2FvdXQtc3BhcmNsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNiMTM2Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LXNwYXJjbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBzcGFyYyBsaXR0bGUtZW5kaWFuIGFvdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtc3BhcmMtbGl0dGxlIgotI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbGVfYW91dF8sT1ApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNX1NQQVJDIHx8IChtdHlwZSkgPT0gTV9TUEFSQ0xFVCkKLQotLyogSW5jbHVkZSB0aGUgdXN1YWwgYS5vdXQgc3VwcG9ydC4gICovCi0jZGVmaW5lIFRBUkdFVF9JU19MSVRUTEVfRU5ESUFOX1AKLSNpbmNsdWRlICJhb3V0ZjEuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LXRhcmdldC5oIGIvYmZkL2FvdXQtdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZWUwN2EuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLyogRGVmaW5lIGEgdGFyZ2V0IHZlY3RvciBhbmQgc29tZSBzbWFsbCByb3V0aW5lcyBmb3IgYSB2YXJpYW50IG9mIGEub3V0LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotLyojaW5jbHVkZSAibGliYW91dC5oIiovCi0KLSNpZm5kZWYgU0VHTUVOVF9TSVpFCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLQotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKiBOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotLyogU2V0IHBhcmFtZXRlcnMgYWJvdXQgdGhpcyBhLm91dCBmaWxlIHRoYXQgYXJlIG1hY2hpbmUtZGVwZW5kZW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNvbWVfYW91dF9vYmplY3RfcCBqdXN0IGJlZm9yZSBpdCByZXR1cm5zLiAgKi8KLSNpZm5kZWYgTVlfY2FsbGJhY2sKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKk1ZKGNhbGxiYWNrKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShjYWxsYmFjaykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgYXJjaF9hbGlnbl9wb3dlcjsKLSAgdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduOwotCi0gIC8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHBhcnRzIG9mIGEgbmV3bHkgcmVhZCBhb3V0IGhlYWRlciAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSKCpleGVjcCk7Ci0gIG9ial9ic3NzZWMgIChhYmZkKS0+dm1hID0gTl9CU1NBRERSKCpleGVjcCk7Ci0KLSAgLyogRm9yIHNvbWUgdGFyZ2V0cywgaWYgdGhlIGVudHJ5IHBvaW50IGlzIG5vdCBpbiB0aGUgc2FtZSBwYWdlCi0gICAgIGFzIHRoZSBzdGFydCBvZiB0aGUgdGV4dCwgdGhlbiBhZGp1c3QgdGhlIFZNQSBzbyB0aGF0IGl0IGlzLgotICAgICBGSVhNRTogRG8gdGhpcyB3aXRoIGEgbWFjcm8gbGlrZSBTRVRfQVJDSF9NQUNIIGluc3RlYWQ/ICAqLwotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSAgICAgICYmIGV4ZWNwLT5hX2VudHJ5ID4gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGp1c3Q7Ci0KLSAgICAgIGFkanVzdCA9IGV4ZWNwLT5hX2VudHJ5IC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gICAgICAvKiBBZGp1c3Qgb25seSBieSB3aG9sZSBwYWdlcy4gKi8KLSAgICAgIGFkanVzdCAmPSB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKTsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OwotICAgIH0KLQotICAvKiBTZXQgdGhlIGxvYWQgYWRkcmVzc2VzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0goYWJmZCwgKmV4ZWNwKTsKLSNlbHNlCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKLSNlbmRpZgotCi0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlcgotICAgICBTRVRfQVJDSF9NQUNILiAgSXQgYXNzdW1lcyB0aGF0IFNFVF9BUkNIX01BQ0ggd2lsbCBzZXQKLSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgY29ycmVjdGx5LCBpZiB0aGUgcmVsb2Mgc2l6ZSBpcyBub3QKLSAgICAgUkVMT0NfU1REX1NJWkUuICAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID0KLSAgICBleGVjcC0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNwLT5hX2Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBhcmNoaXRlY3R1cmUsIHNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUKLSAgICAgc2VjdGlvbnMuICBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spLAotICAgICBidXQgd2hlbiB0aGUgaW5pdGlhbCBzZWN0aW9ucyB3ZXJlIGNyZWF0ZWQgdGhlIGFyY2hpdGVjdHVyZSBoYWQKLSAgICAgbm90IHlldCBiZWVuIHNldC4gIEhvd2V2ZXIsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZSBkb24ndAotICAgICBzZXQgdGhlIGFsaWdubWVudCBwb3dlciBhbnkgaGlnaGVyIHRoYW4gYXMgcmVxdWlyZWQgYnkgdGhlIHNpemUKLSAgICAgb2YgdGhlIHNlY3Rpb24uICAqLwotICBhcmNoX2FsaWduX3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOwotICBhcmNoX2FsaWduID0gMSA8PCBhcmNoX2FsaWduX3Bvd2VyOwotICBpZiAoKEJGRF9BTElHTiAob2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0gICAgICAgPT0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgICAmJiAoQkZEX0FMSUdOIChvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLQkgID09IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplKQotICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLQkgID09IG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIHsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgIH0KLQotICAvKiBEb24ndCBzZXQgc2l6ZXMgbm93IC0tIGNhbid0IGJlIHN1cmUgdW50aWwgd2Uga25vdyBhcmNoICYgbWFjaC4KLSAgICAgU2l6ZXMgZ2V0IHNldCBpbiBzZXRfc2l6ZXMgY2FsbGJhY2ssIGxhdGVyLiAgKi8KLSNpZiAwCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotI2VuZGlmCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBNWV9vYmplY3RfcAotLyogRmluaXNoIHVwIHRoZSByZWFkaW5nIG9mIGFuIGEub3V0IGZpbGUgaGVhZGVyICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpNWShvYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotTVkob2JqZWN0X3ApIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJCS8qIENsZWFuZWQtdXAgZXhlYyBoZWFkZXIgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkgcmV0dXJuIDA7Ci0jaWZkZWYgTUFDSFRZUEVfT0sKLSAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpIHJldHVybiAwOwotI2VuZGlmCi0KLSAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pKGFiZmQsICZleGVjX2J5dGVzLCAmZXhlYyk7Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIC8qIHN3YXBfZXhlY19oZWFkZXJfaW4gcmVhZCBpbiBhX2luZm8gd2l0aCB0aGUgd3JvbmcgYnl0ZSBvcmRlciAqLwotICBleGVjLmFfaW5mbyA9IFNXQVBfTUFHSUMgKGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgdGFyZ2V0ID0gTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCBNWShjYWxsYmFjaykpOwotCi0jaWZkZWYgRU5UUllfQ0FOX0JFX1pFUk8KLSAgLyogVGhlIE5FV1NPUzMgZW50cnktcG9pbnQgaXMvd2FzIDAsIHdoaWNoIChhbW9uZ3N0IG90aGVyIGxvc3NhZ2UpCi0gICAqIG1lYW5zIHRoYXQgaXQgaXNuJ3Qgb2J2aW91cyBpZiBFWEVDX1Agc2hvdWxkIGJlIHNldC4KLSAgICogQWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlIGZvciBhbiBleGVjdXRhYmxlOgotICAgKiBUaGVyZSBtdXN0IGJlIG5vIHJlbG9jYXRpb25zLCB0aGUgYmZkIGNhbiBiZSBuZWl0aGVyIGFuCi0gICAqIGFyY2hpdmUgbm9yIGFuIGFyY2hpdmUgZWxlbWVudCwgYW5kIHRoZSBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZS4gKi8KLQotICBpZiAoZXhlYy5hX3Ryc2l6ZSArIGV4ZWMuYV9kcnNpemUgPT0gMAotICAgICAgJiYgYmZkX2dldF9mb3JtYXQoYWJmZCkgPT0gYmZkX29iamVjdCAmJiBhYmZkLT5teV9hcmNoaXZlID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDAgJiYgKGJ1Zi5zdF9tb2RlICYgU19JWFVTUikpCi0JYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLSNlbmRpZiAvKiBFTlRSWV9DQU5fQkVfWkVSTyAqLwotCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0jZGVmaW5lIE1ZX29iamVjdF9wIE1ZKG9iamVjdF9wKQotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9ta29iamVjdAotCi1zdGF0aWMgYm9vbGVhbiBNWShta29iamVjdCkgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKG1rb2JqZWN0KSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoTkFNRShhb3V0LG1rb2JqZWN0KShhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0jaWYgMCAvKiBTaXplcyBnZXQgc2V0IGluIHNldF9zaXplcyBjYWxsYmFjaywgbGF0ZXIsIGFmdGVyIHdlIGtub3cKLQkgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4gICovCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBNWV9ta29iamVjdCBNWShta29iamVjdCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0KLS8qIENvcHkgcHJpdmF0ZSBzZWN0aW9uIGRhdGEuICBUaGlzIGFjdHVhbGx5IGRvZXMgbm90aGluZyB3aXRoIHRoZQotICAgc2VjdGlvbnMuICBJdCBjb3BpZXMgdGhlIHN1YmZvcm1hdCBmaWVsZC4gIFdlIGNvcHkgaXQgaGVyZSwgYmVjYXVzZQotICAgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhpcyBpcyBhIFFNQUdJQyBmaWxlIGJlZm9yZSB3ZSBzZXQgdGhlCi0gICBzZWN0aW9uIGNvbnRlbnRzLCBhbmQgY29weV9wcml2YXRlX2JmZF9kYXRhIGlzIG5vdCBjYWxsZWQgdW50aWwKLSAgIGFmdGVyIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0gICAgICAmJiBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotICAgIG9ial9hb3V0X3N1YmZvcm1hdCAob2JmZCkgPSBvYmpfYW91dF9zdWJmb3JtYXQgKGliZmQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi0jaWZuZGVmIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cwotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc2V0X3NpemVzCi0KLXN0YXRpYyBib29sZWFuIE1ZKHNldF9zaXplcykgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKHNldF9zaXplcykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotCi0jaWZkZWYgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRQotICBhZGF0YShhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRTsKLSNlbHNlCi0gIGFkYXRhKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotI2VuZGlmCi0KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICByZXR1cm4gdHJ1ZTsKLX0KLSNkZWZpbmUgTVlfc2V0X3NpemVzIE1ZKHNldF9zaXplcykKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2V4ZWNfaGRyX2ZsYWdzCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDAKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JhY2tlbmRfZGF0YQotCi0jaWZuZGVmIE1ZX3ptYWdpY19jb250aWd1b3VzCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcgotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzCi0jZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLSNkZWZpbmUgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2xpbmtfZHluYW1pY19vYmplY3QKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluaXNoX2R5bmFtaWNfbGluawotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIDAKLSNlbmRpZgotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIE1ZKGJhY2tlbmRfZGF0YSkgPSB7Ci0gIE1ZX3ptYWdpY19jb250aWd1b3VzLAotICBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciwKLSAgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzLAotICBNWV9leGVjX2hkcl9mbGFncywKLSAgMCwJCQkJLyogdGV4dCB2bWE/ICovCi0gIE1ZX3NldF9zaXplcywKLSAgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQsCi0gIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMsCi0gIE1ZX2FkZF9vbmVfc3ltYm9sLAotICBNWV9saW5rX2R5bmFtaWNfb2JqZWN0LAotICBNWV93cml0ZV9keW5hbWljX3N5bWJvbCwKLSAgTVlfY2hlY2tfZHluYW1pY19yZWxvYywKLSAgTVlfZmluaXNoX2R5bmFtaWNfbGluawotfTsKLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0KLS8qIENhbGxiYWNrIGZvciB0aGUgZmluYWxfbGluayByb3V0aW5lIHRvIHNldCB0aGUgc2VjdGlvbiBvZmZzZXRzLiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotCi1zdGF0aWMgdm9pZAotTVlfZmluYWxfbGlua19jYWxsYmFjayAoYWJmZCwgcHRyZWxvZmYsIHBkcmVsb2ZmLCBwc3ltb2ZmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyICpwdHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBkcmVsb2ZmOwotICAgICBmaWxlX3B0ciAqcHN5bW9mZjsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gICpwdHJlbG9mZiA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgKnBkcmVsb2ZmID0gTl9EUkVMT0ZGICgqZXhlY3ApOwotICAqcHN5bW9mZiA9IE5fU1lNT0ZGICgqZXhlY3ApOwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZmluYWxfbGluawotCi0vKiBGaW5hbCBsaW5rIHJvdXRpbmUuICBXZSBuZWVkIHRvIHVzZSBhIGNhbGwgYmFjayB0byBnZXQgdGhlIGNvcnJlY3QKLSAgIG9mZnNldHMgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gTVlfYmZkX2ZpbmFsX2xpbmsgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2VuZGlmCi0KLS8qIFdlIGFzc3VtZSBCRkQgZ2VuZXJpYyBhcmNoaXZlIGZpbGVzLiAgKi8KLSNpZm5kZWYJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lCU1ZX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIE1ZX2dldF9lbHRfYXRfaW5kZXgJCV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZW5kaWYKLSNpZm5kZWYJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lCU1ZX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZW5kaWYKLSNpZm5kZWYJTVlfc2x1cnBfYXJtYXAKLSNkZWZpbmUJTVlfc2x1cnBfYXJtYXAJCQliZmRfc2x1cnBfYnNkX2FybWFwCi0jZW5kaWYKLSNpZm5kZWYJTVlfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZQlNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2VuZGlmCi0jaWZuZGVmCU1ZX3dyaXRlX2FybWFwCi0jZGVmaW5lCU1ZX3dyaXRlX2FybWFwCQlic2Rfd3JpdGVfYXJtYXAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX2FyX2hkcgotI2RlZmluZSBNWV9yZWFkX2FyX2hkcgkJX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZW5kaWYKLSNpZm5kZWYJTVlfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lCU1ZX3RydW5jYXRlX2FybmFtZQkJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNlbmRpZgotI2lmbmRlZiBNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0jZGVmaW5lIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0jZW5kaWYKLQotLyogTm8gY29yZSBmaWxlIGRlZmluZWQgaGVyZSAtLSBjb25maWd1cmUgaW4gdHJhZC1jb3JlLmMgc2VwYXJhdGVseS4gICovCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAlfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCVwKLQkJCQlfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcAkJX2JmZF9kdW1teV90YXJnZXQKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0Ci0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBOQU1FKGFvdXQsY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUgTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBOQU1FKGFvdXQsY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3NldF9zZWN0aW9uX2NvbnRlbnRzIE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBOQU1FKGFvdXQsZ2V0X3NlY3Rpb25fY29udGVudHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZW5kaWYKLSNpZm5kZWYgTVlfbmV3X3NlY3Rpb25faG9vawotI2RlZmluZSBNWV9uZXdfc2VjdGlvbl9ob29rIE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltdGFiCi0jZGVmaW5lIE1ZX2dldF9zeW10YWIgTkFNRShhb3V0LGdldF9zeW10YWIpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9yZWxvY191cHBlcl9ib3VuZCBOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBNWV9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBNWV9tYWtlX2VtcHR5X3N5bWJvbCBOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIE1ZX3ByaW50X3N5bWJvbCBOQU1FKGFvdXQscHJpbnRfc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBNWV9nZXRfc3ltYm9sX2luZm8gTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfbGluZW5vCi0jZGVmaW5lIE1ZX2dldF9saW5lbm8gTkFNRShhb3V0LGdldF9saW5lbm8pCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X2FyY2hfbWFjaAotI2RlZmluZSBNWV9zZXRfYXJjaF9tYWNoIE5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIE1ZX2ZpbmRfbmVhcmVzdF9saW5lIE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkKLSNlbmRpZgotI2lmbmRlZiBNWV9zaXplb2ZfaGVhZGVycwotI2RlZmluZSBNWV9zaXplb2ZfaGVhZGVycyBOQU1FKGFvdXQsc2l6ZW9mX2hlYWRlcnMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIE1ZX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgTVlfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBNWV9yZWFkX21pbmlzeW1ib2xzIE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sIE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNlbmRpZgotCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNkZWZpbmUgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgTVlfYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIE1ZX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvIE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIE1ZX2Nsb3NlX2FuZF9jbGVhbnVwIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFwKLSAgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZW5kaWYKLQotLyogQW91dCBzeW1ib2xzIG5vcm1hbGx5IGhhdmUgbGVhZGluZyB1bmRlcnNjb3JlcyAqLwotI2lmbmRlZiBNWV9zeW1ib2xfbGVhZGluZ19jaGFyIAotI2RlZmluZSBNWV9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotI2VuZGlmCi0KLS8qIEFvdXQgYXJjaGl2ZXMgbm9ybWFsbHkgdXNlIHNwYWNlcyBmb3IgcGFkZGluZyAqLwotI2lmbmRlZiBBUl9QQURfQ0hBUgotI2RlZmluZSBBUl9QQURfQ0hBUiAnICcKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX0JGRF9UQVJHRVQKLWNvbnN0IGJmZF90YXJnZXQgTVkodmVjKSA9Ci17Ci0gIFRBUkdFVE5BTUUsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotI2lmZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAoYmlnKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSNlbHNlCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChsaXR0bGUpICovCi0jZW5kaWYKLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSNpZmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotI2Vsc2UKLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0jZW5kaWYKLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07Ci0jZW5kaWYgLyogTVlfQkZEX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtdGljMzAuYyBiL2JmZC9hb3V0LXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTZjYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtdGljMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBUTVMzMjBDMzAgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMTAyNAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDEyOAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfdGljMzAKLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNkZWZpbmUgTVkoT1ApIENBVCh0aWMzMF9hb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtdGljMzAiCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKHRpYzMwX2FvdXQsXzMyXyx5KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZml4XzE2Ci0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpeF8zMgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9maXhfcGNyZWxfMTYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqdGljMzBfYW91dF9yZWxvY19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLCBpbnQgKiwgaW50ICosIGludCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwKLQkgICBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqdGljMzBfYW91dF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHRpYzMwX2FvdXRfc2V0X3NpemVzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSNkZWZpbmUgTVlfcmVsb2NfaG93dG8oQkZELFJFTCxJTixFWCxQQykgdGljMzBfYW91dF9yZWxvY19ob3d0byhCRkQsUkVMLCZJTiwmRVgsJlBDKQotI2RlZmluZSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZQotI2RlZmluZSBNWV9vYmplY3RfcCB0aWMzMF9hb3V0X29iamVjdF9wCi0jZGVmaW5lIE1ZX21rb2JqZWN0IE5BTUUoYW91dCxta29iamVjdCkKLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRpYzMwX2FvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3NldF9zaXplcyB0aWMzMF9hb3V0X3NldF9zaXplcwotCi0jaWZuZGVmIE1ZX2V4ZWNfaGRyX2ZsYWdzCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JhY2tlbmRfZGF0YQotCi0jaWZuZGVmIE1ZX3ptYWdpY19jb250aWd1b3VzCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcgotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzCi0jZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLSNkZWZpbmUgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQgMQotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2xpbmtfZHluYW1pY19vYmplY3QKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluaXNoX2R5bmFtaWNfbGluawotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIDAKLSNlbmRpZgotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIHRpYzMwX2FvdXRfYmFja2VuZF9kYXRhID0KLXsKLSAgTVlfem1hZ2ljX2NvbnRpZ3VvdXMsCi0gIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLAotICBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MsCi0gIE1ZX2V4ZWNfaGRyX2ZsYWdzLAotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVlfc2V0X3NpemVzLAotICBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCwKLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJnRpYzMwX2FvdXRfYmFja2VuZF9kYXRhCi0jZW5kaWYKLQotLyogRklYTUU6IFRoaXMgaXMgd3JvbmcuICBhb3V0eC5oIHNob3VsZCByZWFsbHkgb25seSBiZSBpbmNsdWRlZCBieQotICAgYW91dDMyLmMuICAqLwotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotLyogVGhpcyB0YWJsZSBsaXN0cyB0aGUgcmVsb2NhdGlvbiB0eXBlcyBmb3IgdGhlIFRNUzMyMEMzMC4gIFRoZXJlIGFyZQotICAgb25seSBhIGZldyByZWxvY2F0aW9ucyByZXF1aXJlZCwgYW5kIGFsbCBtdXN0IGJlIGRpdmlkZWQgYnkgNCAoPj4KLSAgIDIpIHRvIGdldCB0aGUgMzItYml0IGFkZHJlc3NlcyBpbiB0aGUgZm9ybWF0IHRoZSBUTVMzMjBDMzAgbGlrZXMKLSAgIGl0LiAqLwotcmVsb2NfaG93dG9fdHlwZSB0aWMzMF9hb3V0X2hvd3RvX3RhYmxlW10gPQotewotICB7LTF9LAotICBIT1dUTyAoMSwgMiwgMSwgMTYsIGZhbHNlLCAwLCAwLCB0aWMzMF9hb3V0X2ZpeF8xNiwKLQkgIjE2IiwgZmFsc2UsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDIsIDIsIDIsIDI0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCi0JICIyNCIsIGZhbHNlLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCBmYWxzZSksCi0gIEhPV1RPICgzLCAxOCwgMywgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIkxEUCIsIGZhbHNlLCAweDAwRkYwMDAwLCAweDAwMDAwMEZGLCBmYWxzZSksCi0gIEhPV1RPICg0LCAyLCA0LCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCB0aWMzMF9hb3V0X2ZpeF8zMiwKLQkgIjMyIiwgZmFsc2UsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDUsIDIsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIHRpYzMwX2FvdXRfZml4X3BjcmVsXzE2LCAiUENSRUwiLCB0cnVlLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGLCB0cnVlKSwKLSAgey0xfSwKLSAgey0xfSwKLSAgey0xfSwKLSAgey0xfSwKLSAgey0xfQotfTsKLQotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKk5BTUUgKGFvdXQsIHJlbG9jX3R5cGVfbG9va3VwKSAoKTsKLQotcmVsb2NfaG93dG9fdHlwZSAqCi10aWMzMF9hb3V0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVElDMzBfTERQOgotICAgICAgcmV0dXJuICZ0aWMzMF9hb3V0X2hvd3RvX3RhYmxlWzNdOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgcmV0dXJuICZ0aWMzMF9hb3V0X2hvd3RvX3RhYmxlWzFdOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0OgotICAgICAgcmV0dXJuICZ0aWMzMF9hb3V0X2hvd3RvX3RhYmxlWzJdOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotICAgICAgcmV0dXJuICZ0aWMzMF9hb3V0X2hvd3RvX3RhYmxlWzVdOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgcmV0dXJuICZ0aWMzMF9hb3V0X2hvd3RvX3RhYmxlWzRdOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2FvdXRfcmVsb2NfaG93dG8gKGFiZmQsIHJlbG9jcywgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbF9kb25lOwotICBpbnQgaW5kZXg7Ci0KLSAgKnJfcGNyZWwgPSAwOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICAqcl9pbmRleCA9ICgocmVsb2NzLT5yX2luZGV4WzBdIDw8IDE2KSB8IChyZWxvY3MtPnJfaW5kZXhbMV0gPDwgOCkgfCByZWxvY3MtPnJfaW5kZXhbMl0pOwotICAgICAgKnJfZXh0ZXJuID0gKDAgIT0gKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gICAgICByX2xlbmd0aCA9ICgocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKSA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqcl9pbmRleCA9ICgocmVsb2NzLT5yX2luZGV4WzJdIDw8IDE2KSB8IChyZWxvY3MtPnJfaW5kZXhbMV0gPDwgOCkgfCByZWxvY3MtPnJfaW5kZXhbMF0pOwotICAgICAgKnJfZXh0ZXJuID0gKDAgIT0gKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0gICAgICByX2xlbmd0aCA9ICgocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKSA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgICB9Ci0gIGluZGV4ID0gcl9sZW5ndGggKyA0ICogcl9wY3JlbF9kb25lOwotICByZXR1cm4gdGljMzBfYW91dF9ob3d0b190YWJsZSArIGluZGV4OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBjYWxsYmFjayBmb3IgMTYtYml0IHJlbG9jcy4gIFRoaXMgaXMKLSAgIHJlcXVpcmVkIGZvciByZWxvY2F0aW9ucyBiZXR3ZWVuIHNlZ21lbnRzLiAgQSBsaW5lIGluIGFvdXR4LmgKLSAgIHJlcXVpcmVzIHRoYXQgYW55IHJlbG9jYXRpb25zIGZvciB0aGUgZGF0YSBzZWN0aW9uIHNob3VsZCBwb2ludCB0bwotICAgdGhlIGVuZCBvZiB0aGUgYWxpZ25lZCB0ZXh0IHNlY3Rpb24sIHBsdXMgYW4gb2Zmc2V0LiAgQnkgZGVmYXVsdCwKLSAgIHRoaXMgZG9lcyBub3QgaGFwcGVuLCB0aGVyZWZvcmUgdGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mCi0gICB0aGF0LiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpeF8xNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sJ3Mgc2VjdGlvbiBpcyBkZWZpbmVkLiAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24gJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19vayA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0gIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbiBhbmQgdHVybiBpdCBpbnRvIHRoZSBUTVMzMjBDMzAKLSAgICAgMzItYml0IGFkZHJlc3MgZm9ybWF0LiAqLwotICByZWxvY2F0aW9uID0gKHN5bWJvbC0+c2VjdGlvbi0+dm1hID4+IDIpOwotICByZWxvY2F0aW9uICs9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBiZmRfcHV0XzE2IChhYmZkLCByZWxvY2F0aW9uLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIHRpYzMwX2FvdXRfZml4XzE2IGV4Y2VwdCBmb3IgMzIKLSAgIGJpdCByZWxvY2F0aW9ucy4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfMzIgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbCdzIHNlY3Rpb24gaXMgZGVmaW5lZC4gKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2Nfb2sgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb24gYW5kIHR1cm4gaXQgaW50byB0aGUgVE1TMzIwQzMwCi0gICAgIDMyLWJpdCBhZGRyZXNzIGZvcm1hdC4gKi8KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnNlY3Rpb24tPnZtYSA+PiAyKTsKLSAgcmVsb2NhdGlvbiArPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3b3JrIG91dCBwYy1yZWxhdGl2ZSBvZmZzZXRzIGZvciB0aGUKLSAgIFRNUzMyMEMzMC4gIFRoZSBkYXRhIGFscmVhZHkgcGxhY2VkIGJ5IG1kX3BjcmVsX2Zyb20gd2l0aGluIGdhcyBpcwotICAgdXNlbGVzcyBmb3IgYSByZWxvY2F0aW9uLCBzbyB3ZSBqdXN0IGdldCB0aGUgb2Zmc2V0IHZhbHVlIGFuZCBwbGFjZQotICAgYSB2ZXJzaW9uIG9mIHRoaXMgd2l0aGluIHRoZSBvYmplY3QgY29kZS4KLSAgIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZSB3aWxsIHRoZW4gY2FsY3VsYXRlIHRoZSByZXF1aXJlZAotICAgcmVsb2NhdGlvbiB0byBhZGQgb24gdG8gdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgY29kZS4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfcGNyZWxfMTYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbiA9IDE7Ci0gIGJmZF9ieXRlIG9mZnNldF9kYXRhID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzIC0gMSk7Ci0KLSAgLyogVGhlIGJ5dGUgYmVmb3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZml4IGNvbnRhaW5zIGJpdHMgMjMtMTYgb2YKLSAgICAgdGhlIHBjcmVsIGluc3RydWN0aW9uLiAgQml0IDIxIGlzIHNldCBmb3IgYSBkZWxheWVkIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIHJlcXVpcmVzIG9uIG9mZnNldCBvZiAzIGluc3RlYWQgb2YgMS4gKi8KLSAgaWYgKG9mZnNldF9kYXRhICYgMHgyMCkKLSAgICByZWxvY2F0aW9uIC09IDM7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uIC09IDE7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGVzZSBtYWNyb3Mgd2lsbCBnZXQgMjQtYml0IHZhbHVlcyBmcm9tIHRoZSBiZmQgZGVmaW5pdGlvbi4KLSAgIEJpZy1lbmRpYW4gb25seS4gKi8KLSNkZWZpbmUgYmZkX2dldGJfMjQoQkZELEFERFIpIChiZmRfZ2V0XzgoQkZELEFERFIpIDw8IDE2KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfZ2V0XzgoQkZELEFERFIrMSkgPDwgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmZkX2dldF84KEJGRCxBRERSKzIpKQotCi0jZGVmaW5lIGJmZF9wdXRiXzI0KEJGRCxEQVRBLEFERFIpIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKSgoREFUQSA+PiAxNikgJiAweEZGKSxBRERSKTsgXAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHV0XzgoQkZELChiZmRfYnl0ZSkoKERBVEEgPj4gOCkgJiAweEZGKSxBRERSKzEpOyBcCi0JCSAgICAgICAgIAkJCQkgICBiZmRfcHV0XzgoQkZELChiZmRfYnl0ZSkoREFUQSAmIDB4RkYpLEFERFIrMikKLQotLyogU2V0IHBhcmFtZXRlcnMgYWJvdXQgdGhpcyBhLm91dCBmaWxlIHRoYXQgYXJlIG1hY2hpbmUtZGVwZW5kZW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNvbWVfYW91dF9vYmplY3RfcCBqdXN0IGJlZm9yZSBpdCByZXR1cm5zLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotdGljMzBfYW91dF9jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBhcmNoX2FsaWduX3Bvd2VyOwotICB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ247Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcGFydHMgb2YgYSBuZXdseSByZWFkIGFvdXQgaGVhZGVyICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gTl9UWFRTSVpFICgqZXhlY3ApOwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IE5fREFUQUREUiAoKmV4ZWNwKTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IE5fQlNTQUREUiAoKmV4ZWNwKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmxtYSA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmxtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotICBvYmpfYnNzc2VjIChhYmZkKS0+bG1hID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0jaWZkZWYgU0VUX0FSQ0hfTUFDSAotICBTRVRfQVJDSF9NQUNIIChhYmZkLCAqZXhlY3ApOwotI2Vsc2UKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKLSNlbmRpZgotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIGFyY2hpdGVjdHVyZSwgc2V0IHRoZSBhbGlnbm1lbnRzIG9mIHRoZQotICAgICBzZWN0aW9ucy4gIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSBOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vayksCi0gICAgIGJ1dCB3aGVuIHRoZSBpbml0aWFsIHNlY3Rpb25zIHdlcmUgY3JlYXRlZCB0aGUgYXJjaGl0ZWN0dXJlIGhhZAotICAgICBub3QgeWV0IGJlZW4gc2V0LiAgSG93ZXZlciwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlIGRvbid0Ci0gICAgIHNldCB0aGUgYWxpZ25tZW50IHBvd2VyIGFueSBoaWdoZXIgdGhhbiBhcyByZXF1aXJlZCBieSB0aGUgc2l6ZQotICAgICBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGFyY2hfYWxpZ25fcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0gIGFyY2hfYWxpZ24gPSAxIDw8IGFyY2hfYWxpZ25fcG93ZXI7Ci0gIGlmICgoQkZEX0FMSUdOIChvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLSAgICAgICA9PSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICAgICYmIChCRkRfQUxJR04gKG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotCSAgPT0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgICAmJiAoQkZEX0FMSUdOIChvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotCSAgPT0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSkpCi0gICAgewotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgICAgb2JqX2Jzc3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgfQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQlhZGRyZXNzLCB2YWx1ZSwgYWRkZW5kKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IHZhbHVlICsgYWRkZW5kOwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0gIHJldHVybiB0aWMzMF9hb3V0X3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICAgICBjb250ZW50cyArIGFkZHJlc3MpOwotfQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXRpYzMwX2FvdXRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgYmZkX2J5dGUgKmxvY2F0aW9uOwotewotICBiZmRfdm1hIHg7Ci0gIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgaWYgKGhvd3RvLT5zaXplIDwgMCkKLSAgICByZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHggPSBiZmRfZ2V0Yl8yNCAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICB4ID0gYmZkX2dldF84IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgb3ZlcmZsb3cgPSBmYWxzZTsKLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIHsKLSAgICAgIGJmZF92bWEgY2hlY2s7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBzaWduZWRfY2hlY2s7Ci0gICAgICBiZmRfdm1hIGFkZDsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9hZGQ7Ci0KLSAgICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA9PSAwKQotCXsKLQkgIGNoZWNrID0gcmVsb2NhdGlvbjsKLQkgIHNpZ25lZF9jaGVjayA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCSAgICBzaWduZWRfY2hlY2sgPSBjaGVjazsKLQkgIGVsc2UKLQkgICAgc2lnbmVkX2NoZWNrID0gKGNoZWNrIHwgKChiZmRfdm1hKSAtIDEgJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPnJpZ2h0c2hpZnQpKSk7Ci0JfQotICAgICAgYWRkID0geCAmIGhvd3RvLT5zcmNfbWFzazsKLSAgICAgIHNpZ25lZF9hZGQgPSBhZGQ7Ci0gICAgICBpZiAoKGFkZCAmICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSkgIT0gMCkKLQlzaWduZWRfYWRkIC09ICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSA8PCAxOwotICAgICAgaWYgKGhvd3RvLT5iaXRwb3MgPT0gMCkKLQl7Ci0JICBjaGVjayArPSBhZGQ7Ci0JICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7Ci0JICBpZiAoc2lnbmVkX2FkZCA+PSAwKQotCSAgICBzaWduZWRfY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7Ci0JICBlbHNlCi0JICAgIHNpZ25lZF9jaGVjayArPSAoKGFkZCA+PiBob3d0by0+Yml0cG9zKSB8ICgoYmZkX3ZtYSkgLSAxICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5iaXRwb3MpKSk7Ci0JfQotICAgICAgc3dpdGNoIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cpCi0JewotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotCSAgewotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH5yZWxvY19zaWduZWRfbWF4OwotCSAgICBpZiAoc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heCB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgcmVsb2NfdW5zaWduZWRfbWF4ID0gKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0JICAgIGlmIChjaGVjayA+IHJlbG9jX3Vuc2lnbmVkX21heCkKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgewotCSAgICBiZmRfdm1hIHJlbG9jX2JpdHMgPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQkgICAgaWYgKChjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAwICYmICgoKGJmZF92bWEpIHNpZ25lZF9jaGVjayAmIH5yZWxvY19iaXRzKSAhPSAoLTEgJiB+cmVsb2NfYml0cykpKQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSk7Ci0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGJmZF9wdXRiXzI0IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYW4gYS5vdXQgZmlsZSBoZWFkZXIgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotdGljMzBfYW91dF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwkvKiBSYXcgZXhlYyBoZWFkZXIgZnJvbSBmaWxlICovCi0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7CS8qIENsZWFuZWQtdXAgZXhlYyBoZWFkZXIgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgU1dBUF9NQUdJQwotICBleGVjLmFfaW5mbyA9IFNXQVBfTUFHSUMgKGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbHNlCi0gIGV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIGlmIChOX0JBRE1BRyAoZXhlYykpCi0gICAgcmV0dXJuIDA7Ci0jaWZkZWYgTUFDSFRZUEVfT0sKLSAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICBOQU1FIChhb3V0LCBzd2FwX2V4ZWNfaGVhZGVyX2luKSAoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotI2lmZGVmIFNXQVBfTUFHSUMKLSAgLyogc3dhcF9leGVjX2hlYWRlcl9pbiByZWFkIGluIGFfaW5mbyB3aXRoIHRoZSB3cm9uZyBieXRlIG9yZGVyICovCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2VuZGlmIC8qIFNXQVBfTUFHSUMgKi8KLQotICB0YXJnZXQgPSBOQU1FIChhb3V0LCBzb21lX2FvdXRfb2JqZWN0X3ApIChhYmZkLCAmZXhlYywgdGljMzBfYW91dF9jYWxsYmFjayk7Ci0KLSNpZmRlZiBFTlRSWV9DQU5fQkVfWkVSTwotICAvKiBUaGUgTkVXU09TMyBlbnRyeS1wb2ludCBpcy93YXMgMCwgd2hpY2ggKGFtb25nc3Qgb3RoZXIgbG9zc2FnZSkKLSAgICogbWVhbnMgdGhhdCBpdCBpc24ndCBvYnZpb3VzIGlmIEVYRUNfUCBzaG91bGQgYmUgc2V0LgotICAgKiBBbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWUgZm9yIGFuIGV4ZWN1dGFibGU6Ci0gICAqIFRoZXJlIG11c3QgYmUgbm8gcmVsb2NhdGlvbnMsIHRoZSBiZmQgY2FuIGJlIG5laXRoZXIgYW4KLSAgICogYXJjaGl2ZSBub3IgYW4gYXJjaGl2ZSBlbGVtZW50LCBhbmQgdGhlIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlLiAqLwotCi0gIGlmIChleGVjLmFfdHJzaXplICsgZXhlYy5hX2Ryc2l6ZSA9PSAwCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCAmJiBhYmZkLT5teV9hcmNoaXZlID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAkJLyogRXhlY3V0ZSBieSBvd25lci4gICovCi0jZW5kaWYKLSAgICAgIGlmIChzdGF0IChhYmZkLT5maWxlbmFtZSwgJmJ1ZikgPT0gMCAmJiAoYnVmLnN0X21vZGUgJiBTX0lYVVNSKSkKLQlhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gICAgfQotI2VuZGlmIC8qIEVOVFJZX0NBTl9CRV9aRVJPICovCi0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gIFRoaXMgYWN0dWFsbHkgZG9lcyBub3RoaW5nIHdpdGggdGhlCi0gICBzZWN0aW9ucy4gIEl0IGNvcGllcyB0aGUgc3ViZm9ybWF0IGZpZWxkLiAgV2UgY29weSBpdCBoZXJlLCBiZWNhdXNlCi0gICB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGlzIGlzIGEgUU1BR0lDIGZpbGUgYmVmb3JlIHdlIHNldCB0aGUKLSAgIHNlY3Rpb24gY29udGVudHMsIGFuZCBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgaXMgbm90IGNhbGxlZCB1bnRpbAotICAgYWZ0ZXIgdGhlIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIHNldC4gICovCi0KLS8qQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYywgb2JmZCwgb3NlYykKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYzsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgb2JqX2FvdXRfc3ViZm9ybWF0IChvYmZkKSA9IG9ial9hb3V0X3N1YmZvcm1hdCAoaWJmZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRpYzMwX2FvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFIChhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0gIHsKLSAgICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsJLyogZHVtbXkgdmFycyAqLwotICAgIGZpbGVfcHRyIHRleHRfZW5kOwotICAgIGlmIChhZGF0YSAoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQotICAgICAgTkFNRSAoYW91dCwgYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsKLQotICAgIGV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gICAgZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gICAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgTkFNRSAoYW91dCwgc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwotCi0gICAgaWYgKGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPiAwKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoYmZkX3dyaXRlICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUsIGFiZmQpICE9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCi0KLSAgICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSAhPSAoYXN5bWJvbCAqKikgTlVMTAotCSYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1NZTU9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JaWYgKCFOQU1FIChhb3V0LCB3cml0ZV9zeW1zKSAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fVFJFTE9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghTkFNRSAoYW91dCwgc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX0RSRUxPRkYgKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIU5BTUUgKGFvdXQsIHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGljMzBfYW91dF9zZXRfc2l6ZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0KLSNpZmRlZiBTRUdNRU5UX1NJWkUKLSAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSNlbHNlCi0gIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotI2VuZGlmCi0KLSNpZmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0gIGFkYXRhIChhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRTsKLSNlbHNlCi0gIGFkYXRhIChhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSNlbmRpZgotCi0gIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19jYWxsYmFjawotCi0vKiBDYWxsYmFjayBmb3IgdGhlIGZpbmFsX2xpbmsgcm91dGluZSB0byBzZXQgdGhlIHNlY3Rpb24gb2Zmc2V0cy4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLQotc3RhdGljIHZvaWQKLU1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgKGFiZmQsIHB0cmVsb2ZmLCBwZHJlbG9mZiwgcHN5bW9mZikKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciAqcHRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwZHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBzeW1vZmY7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAqcHRyZWxvZmYgPSBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgKyBleGVjcC0+YV9kYXRhOwotICAqcGRyZWxvZmYgPSAqcHRyZWxvZmYgKyBleGVjcC0+YV90cnNpemU7Ci0gICpwc3ltb2ZmID0gKnBkcmVsb2ZmICsgZXhlY3AtPmFfZHJzaXplOzsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZpbmFsX2xpbmsKLQotLyogRmluYWwgbGluayByb3V0aW5lLiAgV2UgbmVlZCB0byB1c2UgYSBjYWxsIGJhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0gICBvZmZzZXRzIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICBmaWxlX3B0ciBwb3M7Ci0gIGJmZF92bWEgdm1hID0gMDsKLSAgaW50IHBhZDsKLQotICAvKiBTZXQgdGhlIGV4ZWN1dGFibGUgaGVhZGVyIHNpemUgdG8gMCwgYXMgd2UgZG9uJ3Qgd2FudCBvbmUgZm9yIGFuCi0gICAgIG91dHB1dC4gKi8KLSAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IDA7Ci0gIHBvcyA9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIC8qIFRleHQuICAqLwotICB2bWEgPSBpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbi0+dm1hOwotICBwb3MgKz0gdm1hOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gdm1hOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnVzZXJfc2V0X3ZtYSA9IDE7Ci0gIHBvcyArPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIERhdGEuICAqLwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbi0+bmV4dC0+dm1hID4gMCkKLQlvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT5uZXh0LT52bWE7Ci0gICAgICBlbHNlCi0Jb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgNCk7Ci0gICAgfQotICBpZiAob2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPCB2bWEpCi0gICAgewotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgNCk7Ci0gICAgfQotICBvYmpfZGF0YXNlYyAoYWJmZCktPnVzZXJfc2V0X3ZtYSA9IDE7Ci0gIHZtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSB2bWEgKyBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBleGVjcC0+YV90ZXh0ID0gdm1hIC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfdGV4dDsKLQotICAvKiBTaW5jZSBCU1MgZm9sbG93cyBkYXRhIGltbWVkaWF0ZWx5LCBzZWUgaWYgaXQgbmVlZHMgYWxpZ25tZW50LiAgKi8KLSAgdm1hICs9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICBwb3MgKz0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gdm1hOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLQotICAvKiBXZSBhcmUgZnVsbHkgcmVzaXplZCwgc28gZG9uJ3QgcmVhZGp1c3QgaW4gZmluYWxfbGluay4gKi8KLSAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLQotICByZXR1cm4gTkFNRSAoYW91dCwgZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZW5kaWYKLQotZW51bSBtYWNoaW5lX3R5cGUKLXRpYzMwX2FvdXRfbWFjaGluZV90eXBlIChhcmNoLCBtYWNoaW5lLCB1bmtub3duKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotICAgICBib29sZWFuICp1bmtub3duOwotewotICBlbnVtIG1hY2hpbmVfdHlwZSBhcmNoX2ZsYWdzOwotCi0gIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICp1bmtub3duID0gdHJ1ZTsKLQotICBzd2l0Y2ggKGFyY2gpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfdGljMzA6Ci0gICAgICAqdW5rbm93biA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICAgfQotICBpZiAoYXJjaF9mbGFncyAhPSBNX1VOS05PV04pCi0gICAgKnVua25vd24gPSBmYWxzZTsKLSAgcmV0dXJuIGFyY2hfZmxhZ3M7Ci19Ci0KLWJvb2xlYW4KLXRpYzMwX2FvdXRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoIWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBib29sZWFuIHVua25vd247Ci0gICAgICB0aWMzMF9hb3V0X21hY2hpbmVfdHlwZSAoYXJjaCwgbWFjaGluZSwgJnVua25vd24pOwotICAgICAgaWYgKHVua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gIHJldHVybiAoKmFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+c2V0X3NpemVzKSAoYWJmZCk7Ci19Ci0KLS8qIFdlIGFzc3VtZSBCRkQgZ2VuZXJpYyBhcmNoaXZlIGZpbGVzLiAgKi8KLSNpZm5kZWYJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lCU1ZX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIE1ZX2dldF9lbHRfYXRfaW5kZXgJCV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZW5kaWYKLSNpZm5kZWYJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lCU1ZX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZW5kaWYKLSNpZm5kZWYJTVlfc2x1cnBfYXJtYXAKLSNkZWZpbmUJTVlfc2x1cnBfYXJtYXAJCQliZmRfc2x1cnBfYnNkX2FybWFwCi0jZW5kaWYKLSNpZm5kZWYJTVlfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZQlNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2VuZGlmCi0jaWZuZGVmCU1ZX3dyaXRlX2FybWFwCi0jZGVmaW5lCU1ZX3dyaXRlX2FybWFwCQlic2Rfd3JpdGVfYXJtYXAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX2FyX2hkcgotI2RlZmluZSBNWV9yZWFkX2FyX2hkcgkJX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZW5kaWYKLSNpZm5kZWYJTVlfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lCU1ZX3RydW5jYXRlX2FybmFtZQkJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNlbmRpZgotI2lmbmRlZiBNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0jZGVmaW5lIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0jZW5kaWYKLQotLyogTm8gY29yZSBmaWxlIGRlZmluZWQgaGVyZSAtLSBjb25maWd1cmUgaW4gdHJhZC1jb3JlLmMgc2VwYXJhdGVseS4gICovCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAlfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCVwKLQkJCQlfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcAkJX2JmZF9kdW1teV90YXJnZXQKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0Ci0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBOQU1FKGFvdXQsY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUgTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBOQU1FKGFvdXQsY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3NldF9zZWN0aW9uX2NvbnRlbnRzIE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZW5kaWYKLSNpZm5kZWYgTVlfbmV3X3NlY3Rpb25faG9vawotI2RlZmluZSBNWV9uZXdfc2VjdGlvbl9ob29rIE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltdGFiCi0jZGVmaW5lIE1ZX2dldF9zeW10YWIgTkFNRShhb3V0LGdldF9zeW10YWIpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9yZWxvY191cHBlcl9ib3VuZCBOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBNWV9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBNWV9tYWtlX2VtcHR5X3N5bWJvbCBOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIE1ZX3ByaW50X3N5bWJvbCBOQU1FKGFvdXQscHJpbnRfc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBNWV9nZXRfc3ltYm9sX2luZm8gTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfbGluZW5vCi0jZGVmaW5lIE1ZX2dldF9saW5lbm8gTkFNRShhb3V0LGdldF9saW5lbm8pCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X2FyY2hfbWFjaAotI2RlZmluZSBNWV9zZXRfYXJjaF9tYWNoIHRpYzMwX2FvdXRfc2V0X2FyY2hfbWFjaAotI2VuZGlmCi0jaWZuZGVmIE1ZX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIE1ZX2ZpbmRfbmVhcmVzdF9saW5lIE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkKLSNlbmRpZgotI2lmbmRlZiBNWV9zaXplb2ZfaGVhZGVycwotI2RlZmluZSBNWV9zaXplb2ZfaGVhZGVycyBOQU1FKGFvdXQsc2l6ZW9mX2hlYWRlcnMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIE1ZX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgTVlfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCB0aWMzMF9hb3V0X3JlbG9jX3R5cGVfbG9va3VwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBNWV9yZWFkX21pbmlzeW1ib2xzIE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sIE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNlbmRpZgotCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNkZWZpbmUgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgTVlfYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIE1ZX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvIE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIE1ZX2Nsb3NlX2FuZF9jbGVhbnVwIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFwKLSAgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZW5kaWYKLQotLyogQW91dCBzeW1ib2xzIG5vcm1hbGx5IGhhdmUgbGVhZGluZyB1bmRlcnNjb3JlcyAqLwotI2lmbmRlZiBNWV9zeW1ib2xfbGVhZGluZ19jaGFyCi0jZGVmaW5lIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0jZW5kaWYKLQotLyogQW91dCBhcmNoaXZlcyBub3JtYWxseSB1c2Ugc3BhY2VzIGZvciBwYWRkaW5nICovCi0jaWZuZGVmIEFSX1BBRF9DSEFSCi0jZGVmaW5lIEFSX1BBRF9DSEFSICcgJwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfQkZEX1RBUkdFVAotY29uc3QgYmZkX3RhcmdldCB0aWMzMF9hb3V0X3ZlYyA9Ci17Ci0gIFRBUkdFVE5BTUUsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAoYmlnKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8CQkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gIEFSX1BBRF9DSEFSLAkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCi19OwotI2VuZGlmIC8qIE1ZX0JGRF9UQVJHRVQgKi8KZGlmZiAtLWdpdCBhL2JmZC9hb3V0MC5jIGIvYmZkL2FvdXQwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzdhZTAuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgU3VuT1Mgc3R5bGUgYS5vdXQgd2l0aCBmbGFncyBzZXQgdG8gMAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXplcm8tYmlnIgotI2RlZmluZSBNWShPUCkgQ0FUKGFvdXQwX2JpZ18sT1ApCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAwCi0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpIFwKLSAgKChtdHlwZSkgPT0gTV9VTktOT1dOIHx8IChtdHlwZSkgPT0gTV82ODAxMCB8fCAobXR5cGUpID09IE1fNjgwMjApCi0KLS8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLwotI2luY2x1ZGUgImFvdXRmMS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQzMi5jIGIvYmZkL2FvdXQzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmM0MGI0Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0MzIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgMzItYml0IGEub3V0IGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgImFvdXR4LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dDY0LmMgYi9iZmQvYW91dDY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDM2YzguLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQ2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciA2NC1iaXQgYS5vdXQgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDY0Ci0KLS8qIGFvdXR4LmggcmVxdWlyZXMgZGVmaW5pdGlvbnMgZm9yIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KLSNpZm5kZWYgQk1BR0lDCi0jZGVmaW5lIEJNQUdJQyAwCi0jZW5kaWYKLSNpZm5kZWYgUU1BR0lDCi0jZGVmaW5lIFFNQUdJQyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgImFvdXR4LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dGYxLmggYi9iZmQvYW91dGYxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjk1YjUuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXRmMS5oCisrKyAvZGV2L251bGwKQEAgLTEsODU5ICswLDAgQEAKLS8qIEEub3V0ICJmb3JtYXQgMSIgZmlsZSBoYW5kbGluZyBjb2RlIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJhb3V0L3N1bjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLS8qIFRoaXMgaXMgbmVlZGVkIHRvIHJlamVjdCBhIE5ld3NPUyBmaWxlLCBlLmcuIGluCi0gICBnZGIvdGVzdHN1aXRlL2dkYi50MTAvY3Jvc3Nsb2FkLmV4cC4gPGtpbmdkb25AY3lnbnVzLmNvbT4KLSAgIEkgbmVlZGVkIHRvIGFkZCBNX1VOS05PV04gdG8gcmVjb2duaXplIGEgNjgwMDAgb2JqZWN0LCBzbyB0aGlzIHdpbGwKLSAgIHByb2JhYmx5IG5vIGxvbmdlciByZWplY3QgYSBOZXdzT1Mgb2JqZWN0LiAgPGlhbkBjeWdudXMuY29tPi4gKi8KLSNpZm5kZWYgTUFDSFRZUEVfT0sKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpIFwKLSAgKCgobXR5cGUpID09IE1fU1BBUkMgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgMCkgIT0gTlVMTCkgXAotICAgfHwgKCgobXR5cGUpID09IE1fVU5LTk9XTiB8fCAobXR5cGUpID09IE1fNjgwMTAgfHwgKG10eXBlKSA9PSBNXzY4MDIwKSBcCi0gICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9tNjhrLCAwKSAhPSBOVUxMKSkKLSNlbmRpZgotCi0vKgotVGhlIGZpbGUgQGNvZGV7YW91dGYxLmh9IGNvbnRhaW5zIHRoZSBjb2RlIGZvciBCRkQncwotYS5vdXQgYmFjayBlbmQuIENvbnRyb2wgb3ZlciB0aGUgZ2VuZXJhdGVkIGJhY2sgZW5kIGlzIGdpdmVuIGJ5IHRoZXNlCi10d28gcHJlcHJvY2Vzc29yIG5hbWVzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBBUkNIX1NJWkUKLVRoaXMgdmFsdWUgc2hvdWxkIGJlIGVpdGhlciAzMiBvciA2NCwgZGVwZW5kaW5nIHVwb24gdGhlIHNpemUgb2YgYW4KLWludCBpbiB0aGUgdGFyZ2V0IGZvcm1hdC4gSXQgY2hhbmdlcyB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHMgd2hpY2gKLXBlcmZvcm0gdGhlIG1lbW9yeS9kaXNrIG1hcHBpbmcgb2Ygc3RydWN0dXJlcy4KLQotVGhlIDY0IGJpdCBiYWNrZW5kIG1heSBvbmx5IGJlIHVzZWQgaWYgdGhlIGhvc3QgY29tcGlsZXIgc3VwcG9ydHMgNjQKLWludHMgKGVnIGxvbmcgbG9uZyB3aXRoIGdjYyksIGJ5IGRlZmluaW5nIHRoZSBuYW1lIEBjb2Rle0JGRF9IT1NUXzY0X0JJVH0gaW4gQGNvZGV7YmZkLmh9LgotV2l0aCB0aGlzIG5hbWUgZGVmaW5lZCwgQGVtcGh7YWxsfSBiZmQgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHdpdGggNjRiaXQKLWFyaXRobWV0aWMsIG5vdCBqdXN0IHRob3NlIHRvIGEgNjRiaXQgdGFyZ2V0LgotCi1AaXRlbSBUQVJHRVROQU1FCi1UaGUgbmFtZSBwdXQgaW50byB0aGUgdGFyZ2V0IHZlY3Rvci4KLUBpdGVtCi1AZW5kIHRhYmxlCi0KLSovCi0KLS8qU1VQUFJFU1M1NTgqLwotLypTVVBQUkVTUzUyOSovCi0KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgc3Vub3Nfc2V0X2FyY2hfbWFjaCBzdW5vc182NF9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyBhb3V0XzY0X3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMKLSNlbHNlCi0jZGVmaW5lIHN1bm9zX3NldF9hcmNoX21hY2ggc3Vub3NfMzJfc2V0X2FyY2hfbWFjaAotI2RlZmluZSBzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMgYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHN1bm9zX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIHZvaWQgY2hvb3NlX3JlbG9jX3NpemUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnN1bm9zNF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKnN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vczRfc2V0X3NpemVzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIE1lcmdlIGJhY2tlbmQgZGF0YSBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHNwYXJjbGV0LWFvdXQgd2hlcmUgd2Ugd2FudCB0aGUgcmVzdWx0YW50IG1hY2hpbmUKLSAgIG51bWJlciB0byBiZSBNX1NQQVJDTEVUIGlmIGFueSBpbnB1dCBmaWxlIGlzIE1fU1BBUkNMRVQuICAqLwotCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIHN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9hcmNoX3NwYXJjKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKLQliZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBlaXRoZXIgc3Vub3NfMzJfc2V0X2FyY2hfbWFjaCBvciBzdW5vc182NF9zZXRfYXJjaF9tYWNoLAotICAgZGVwZW5kaW5nIHVwb24gQVJDSF9TSVpFLiAgKi8KLQotc3RhdGljIHZvaWQKLXN1bm9zX3NldF9hcmNoX21hY2ggKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgbG9uZyBtYWNoaW5lOwotICBzd2l0Y2ggKG1hY2h0eXBlKQotICAgIHsKLQotICAgIGNhc2UgTV9VTktOT1dOOgotICAgICAgLyogU29tZSBTdW4zcyBtYWtlIG1hZ2ljIG51bWJlcnMgd2l0aG91dCBjcHUgdHlwZXMgaW4gdGhlbSwgc28KLQkgd2UnbGwgZGVmYXVsdCB0byB0aGUgNjgwMDAuICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAxMDoKLSAgICBjYXNlIE1fSFAyMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAyMDoKLSAgICBjYXNlIE1fSFAzMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1BBUkNMRVQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQ0xJVEVfTEU6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMzg2OgotICAgIGNhc2UgTV8zODZfRFlOSVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMjlLOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2EyOWs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0hQVVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAotICBOQU1FKHN1bm9zLHNldF9hcmNoX21hY2gpKEFCRkQsIE5fTUFDSFRZUEUgKEVYRUMpKTsgXAotICBjaG9vc2VfcmVsb2Nfc2l6ZShBQkZEKTsKLQotLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSwgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSAqLwotc3RhdGljIHZvaWQKLWNob29zZV9yZWxvY19zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19FWFRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gU3VuT1MgZm9ybWF0LiAgU2VjdGlvbiBjb250ZW50cyBoYXZlCi0gICBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZSBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kCi0gICByZWxvY2F0aW9uLiAgVGhlIHJlYWwgbmFtZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVpdGhlcgotICAgYW91dF82NF9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIG9yCi0gICBhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMsIGRlcGVuZGluZyB1cG9uIEFSQ0hfU0laRS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfbTY4MDAwOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9VTktOT1dOKTsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfbTY4MDEwOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAxMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX21hY2hfbTY4MDIwOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAyMCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0OgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQ0xFVCk7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZToKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkNMSVRFX0xFKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMjlLKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIH0KLQotICBjaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCk7Ci0KLSAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7Ci0KLSAgTl9TRVRfRFlOQU1JQyAoKmV4ZWNwLCBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQyk7Ci0KLSAgV1JJVEVfSEVBREVSUyAoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogY29yZSBmaWxlcyAqLwotCi0jZGVmaW5lIENPUkVfTUFHSUMgMHgwODA0NTYKLSNkZWZpbmUgQ09SRV9OQU1FTEVOIDE2Ci0KLS8qIFRoZSBjb3JlIHN0cnVjdHVyZSBpcyB0YWtlbiBmcm9tIHRoZSBTdW4gZG9jdW1lbnRhdGlvbi4KLSAgVW5mb3J0dW5hdGVseSwgdGhleSBkb24ndCBkb2N1bWVudCB0aGUgRlBBIHN0cnVjdHVyZSwgb3IgYXQgbGVhc3QgSQotICBjYW4ndCBmaW5kIGl0IGVhc2lseS4gIEZvcnR1bmF0ZWx5IHRoZSBjb3JlIGhlYWRlciBjb250YWlucyBpdHMgb3duCi0gIGxlbmd0aC4gIFNvIHRoaXMgc2hvdWxkbid0IGNhdXNlIHByb2JsZW1zLCBleGNlcHQgZm9yIGNfdWNvZGUsIHdoaWNoCi0gIHNvIGZhciB3ZSBkb24ndCB1c2UgYnV0IGlzIGVhc3kgdG8gZmluZCB3aXRoIGEgbGl0dGxlIGFyaXRobWV0aWMuICovCi0KLS8qIEJ1dCB0aGUgcmVnIHN0cnVjdHVyZSBjYW4gYmUgZ290dGVuIGZyb20gdGhlIFNQQVJDIHByb2Nlc3NvciBoYW5kYm9vay4KLSAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGluIGEgR05VIGluY2x1ZGUgZmlsZSB0aG91Z2ggc28gdGhhdCBnZGIgY2FuIHVzZQotICB0aGUgc2FtZSBpbmZvLiAqLwotc3RydWN0IHJlZ3MKLXsKLSAgaW50IHJfcHNyOwotICBpbnQgcl9wYzsKLSAgaW50IHJfbnBjOwotICBpbnQgcl95OwotICBpbnQgcl9nMTsKLSAgaW50IHJfZzI7Ci0gIGludCByX2czOwotICBpbnQgcl9nNDsKLSAgaW50IHJfZzU7Ci0gIGludCByX2c2OwotICBpbnQgcl9nNzsKLSAgaW50IHJfbzA7Ci0gIGludCByX28xOwotICBpbnQgcl9vMjsKLSAgaW50IHJfbzM7Ci0gIGludCByX280OwotICBpbnQgcl9vNTsKLSAgaW50IHJfbzY7Ci0gIGludCByX283OwotfTsKLQotLyogVGFrZW4gZnJvbSBTdW4gZG9jdW1lbnRhdGlvbjogKi8KLQotLyogRklYTUU6ICBJdCdzIHdvcnNlIHRoYW4gd2UgZXhwZWN0LiAgVGhpcyBzdHJ1Y3QgY29udGFpbnMgVFdPIHN1YnN0cnVjdHMKLSAgbmVpdGhlciBvZiB3aG9zZSBzaXplIHdlIGtub3csIFdJVEggU1RVRkYgSU4gQkVUV0VFTiBUSEVNISAgV2UgY2FuJ3QKLSAgZXZlbiBwb3J0YWJseSBhY2Nlc3MgdGhlIHN0dWZmIGluIGJldHdlZW4hICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZQotICB7Ci0gICAgaW50IGNfbWFnaWM7CQkvKiBDb3JlZmlsZSBtYWdpYyBudW1iZXIgKi8KLSAgICBpbnQgY19sZW47CQkJLyogU2l6ZW9mIChzdHJ1Y3QgY29yZSkgKi8KLSNkZWZpbmUJU1BBUkNfQ09SRV9MRU4JNDMyCi0gICAgaW50IGNfcmVnc1sxOV07CQkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIC0tIE1BQ0hERVAgU0laRSAqLwotICAgIHN0cnVjdCBleHRlcm5hbF9leGVjIGNfYW91dGhkcjsJLyogQS5vdXQgaGVhZGVyICovCi0gICAgaW50IGNfc2lnbm87CQkvKiBLaWxsaW5nIHNpZ25hbCwgaWYgYW55ICovCi0gICAgaW50IGNfdHNpemU7CQkvKiBUZXh0IHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX2RzaXplOwkJLyogRGF0YSBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19zc2l6ZTsJCS8qIFN0YWNrIHNpemUgKGJ5dGVzKSAqLwotICAgIGNoYXIgY19jbWRuYW1lW0NPUkVfTkFNRUxFTiArIDFdOwkvKiBDb21tYW5kIG5hbWUgKi8KLSAgICBkb3VibGUgZnBfc3R1ZmZbMV07CQkvKiBleHRlcm5hbCBGUFUgc3RhdGUgKHNpemUgdW5rbm93biBieSB1cykgKi8KLSAgICAvKiBUaGUgdHlwZSAiZG91YmxlIiBpcyBjcml0aWNhbCBoZXJlLCBmb3IgYWxpZ25tZW50LgotICAgIFN1bk9TIGRlY2xhcmVzIGEgc3RydWN0IGhlcmUsIGJ1dCB0aGUgc3RydWN0J3MgYWxpZ25tZW50Ci0gICAgICBpcyBkb3VibGUgc2luY2UgaXQgY29udGFpbnMgZG91Ymxlcy4gICovCi0gICAgaW50IGNfdWNvZGU7CQkvKiBFeGNlcHRpb24gbm8uIGZyb20gdV9jb2RlICovCi0gICAgLyogKHRoaXMgbWVtYmVyIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IG5hbWUgc2luY2Ugd2UgZG9uJ3QKLSAgICBwb3J0YWJseSBrbm93IHRoZSBzaXplIG9mIGZwX3N0dWZmLikgKi8KLSAgfTsKLQotLyogQ29yZSBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIEJDUCAodGhlIHBhcnQgb2YgU29sYXJpcyB3aGljaCBhbGxvd3MKLSAgIGl0IHRvIHJ1biBTdW5PUzQgYS5vdXQgZmlsZXMpLiAgKi8KLXN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlCi0gIHsKLSAgICBpbnQgY19tYWdpYzsJCS8qIENvcmVmaWxlIG1hZ2ljIG51bWJlciAqLwotICAgIGludCBjX2xlbjsJCQkvKiBTaXplb2YgKHN0cnVjdCBjb3JlKSAqLwotI2RlZmluZQlTT0xBUklTX0JDUF9DT1JFX0xFTgk0NTYKLSAgICBpbnQgY19yZWdzWzE5XTsJCS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgLS0gTUFDSERFUCBTSVpFICovCi0gICAgaW50IGNfZXhkYXRhX3ZwOwkJLyogZXhkYXRhIHN0cnVjdHVyZSAqLwotICAgIGludCBjX2V4ZGF0YV90c2l6ZTsKLSAgICBpbnQgY19leGRhdGFfZHNpemU7Ci0gICAgaW50IGNfZXhkYXRhX2JzaXplOwotICAgIGludCBjX2V4ZGF0YV9sc2l6ZTsKLSAgICBpbnQgY19leGRhdGFfbnNobGliczsKLSAgICBzaG9ydCBjX2V4ZGF0YV9tYWNoOwotICAgIHNob3J0IGNfZXhkYXRhX21hZzsKLSAgICBpbnQgY19leGRhdGFfdG9mZnNldDsKLSAgICBpbnQgY19leGRhdGFfZG9mZnNldDsKLSAgICBpbnQgY19leGRhdGFfbG9mZnNldDsKLSAgICBpbnQgY19leGRhdGFfdHh0b3JnOwotICAgIGludCBjX2V4ZGF0YV9kYXRvcmc7Ci0gICAgaW50IGNfZXhkYXRhX2VudGxvYzsKLSAgICBpbnQgY19zaWdubzsJCS8qIEtpbGxpbmcgc2lnbmFsLCBpZiBhbnkgKi8KLSAgICBpbnQgY190c2l6ZTsJCS8qIFRleHQgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfZHNpemU7CQkvKiBEYXRhIHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX3NzaXplOwkJLyogU3RhY2sgc2l6ZSAoYnl0ZXMpICovCi0gICAgY2hhciBjX2NtZG5hbWVbQ09SRV9OQU1FTEVOICsgMV07CS8qIENvbW1hbmQgbmFtZSAqLwotICAgIGRvdWJsZSBmcF9zdHVmZlsxXTsJCS8qIGV4dGVybmFsIEZQVSBzdGF0ZSAoc2l6ZSB1bmtub3duIGJ5IHVzKSAqLwotICAgIC8qIFRoZSB0eXBlICJkb3VibGUiIGlzIGNyaXRpY2FsIGhlcmUsIGZvciBhbGlnbm1lbnQuCi0gICAgU3VuT1MgZGVjbGFyZXMgYSBzdHJ1Y3QgaGVyZSwgYnV0IHRoZSBzdHJ1Y3QncyBhbGlnbm1lbnQKLSAgICAgIGlzIGRvdWJsZSBzaW5jZSBpdCBjb250YWlucyBkb3VibGVzLiAgKi8KLSAgICBpbnQgY191Y29kZTsJCS8qIEV4Y2VwdGlvbiBuby4gZnJvbSB1X2NvZGUgKi8KLSAgICAvKiAodGhpcyBtZW1iZXIgaXMgbm90IGFjY2Vzc2libGUgYnkgbmFtZSBzaW5jZSB3ZSBkb24ndAotICAgIHBvcnRhYmx5IGtub3cgdGhlIHNpemUgb2YgZnBfc3R1ZmYuKSAqLwotICB9OwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlCi0gIHsKLSAgICBpbnQgY19tYWdpYzsJCS8qIENvcmVmaWxlIG1hZ2ljIG51bWJlciAqLwotICAgIGludCBjX2xlbjsJCQkvKiBTaXplb2YgKHN0cnVjdCBjb3JlKSAqLwotI2RlZmluZQlTVU4zX0NPUkVfTEVOCTgyNgkvKiBBcyBvZiBTdW5PUyA0LjEuMSAqLwotICAgIGludCBjX3JlZ3NbMThdOwkJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAtLSBNQUNIREVQIFNJWkUgKi8KLSAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBjX2FvdXRoZHI7CS8qIEEub3V0IGhlYWRlciAqLwotICAgIGludCBjX3NpZ25vOwkJLyogS2lsbGluZyBzaWduYWwsIGlmIGFueSAqLwotICAgIGludCBjX3RzaXplOwkJLyogVGV4dCBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19kc2l6ZTsJCS8qIERhdGEgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfc3NpemU7CQkvKiBTdGFjayBzaXplIChieXRlcykgKi8KLSAgICBjaGFyIGNfY21kbmFtZVtDT1JFX05BTUVMRU4gKyAxXTsJLyogQ29tbWFuZCBuYW1lICovCi0gICAgZG91YmxlIGZwX3N0dWZmWzFdOwkJLyogZXh0ZXJuYWwgRlBVIHN0YXRlIChzaXplIHVua25vd24gYnkgdXMpICovCi0gICAgLyogVGhlIHR5cGUgImRvdWJsZSIgaXMgY3JpdGljYWwgaGVyZSwgZm9yIGFsaWdubWVudC4KLSAgICBTdW5PUyBkZWNsYXJlcyBhIHN0cnVjdCBoZXJlLCBidXQgdGhlIHN0cnVjdCdzIGFsaWdubWVudAotICAgICAgaXMgZG91YmxlIHNpbmNlIGl0IGNvbnRhaW5zIGRvdWJsZXMuICAqLwotICAgIGludCBjX3Vjb2RlOwkJLyogRXhjZXB0aW9uIG5vLiBmcm9tIHVfY29kZSAqLwotICAgIC8qICh0aGlzIG1lbWJlciBpcyBub3QgYWNjZXNzaWJsZSBieSBuYW1lIHNpbmNlIHdlIGRvbid0Ci0gICAgcG9ydGFibHkga25vdyB0aGUgc2l6ZSBvZiBmcF9zdHVmZi4pICovCi0gIH07Ci0KLXN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlCi0gIHsKLSAgICBpbnQgY19tYWdpYzsJCS8qIENvcmVmaWxlIG1hZ2ljIG51bWJlciAqLwotICAgIGludCBjX2xlbjsJCQkvKiBTaXplb2YgKHN0cnVjdCBjb3JlKSAqLwotICAgIGxvbmcgY19yZWdzX3BvczsJCS8qIGZpbGUgb2Zmc2V0IG9mIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KLSAgICBpbnQgY19yZWdzX3NpemU7CQkvKiBzaXplIG9mIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KLSAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBjX2FvdXRoZHI7CS8qIEEub3V0IGhlYWRlciAqLwotICAgIGludCBjX3NpZ25vOwkJLyogS2lsbGluZyBzaWduYWwsIGlmIGFueSAqLwotICAgIGludCBjX3RzaXplOwkJLyogVGV4dCBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19kc2l6ZTsJCS8qIERhdGEgc2l6ZSAoYnl0ZXMpICovCi0gICAgYmZkX3ZtYSBjX2RhdGFfYWRkcjsJLyogRGF0YSBzdGFydCAoYWRkcmVzcykgKi8KLSAgICBpbnQgY19zc2l6ZTsJCS8qIFN0YWNrIHNpemUgKGJ5dGVzKSAqLwotICAgIGJmZF92bWEgY19zdGFja3RvcDsJCS8qIFN0YWNrIHRvcCAoYWRkcmVzcykgKi8KLSAgICBjaGFyIGNfY21kbmFtZVtDT1JFX05BTUVMRU4gKyAxXTsJLyogQ29tbWFuZCBuYW1lICovCi0gICAgbG9uZyBmcF9zdHVmZl9wb3M7CQkvKiBmaWxlIG9mZnNldCBvZiBleHRlcm5hbCBGUFUgc3RhdGUgKHJlZ3MpICovCi0gICAgaW50IGZwX3N0dWZmX3NpemU7CQkvKiBTaXplIG9mIGl0ICovCi0gICAgaW50IGNfdWNvZGU7CQkvKiBFeGNlcHRpb24gbm8uIGZyb20gdV9jb2RlICovCi0gIH07Ci0KLXN0YXRpYyB2b2lkIHN3YXBjb3JlX3N1bjMKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKikpOwotc3RhdGljIHZvaWQgc3dhcGNvcmVfc3BhcmMKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKikpOwotc3RhdGljIHZvaWQgc3dhcGNvcmVfc29sYXJpc19iY3AKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKikpOwotCi0vKiBieXRlLXN3YXAgaW4gdGhlIFN1bi0zIGNvcmUgc3RydWN0dXJlICovCi1zdGF0aWMgdm9pZAotc3dhcGNvcmVfc3VuMyAoYWJmZCwgZXh0LCBpbnRjb3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmV4dDsKLSAgICAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmludGNvcmU7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKmV4dGNvcmUgPSAoc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqKSBleHQ7Ci0KLSAgaW50Y29yZS0+Y19tYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbWFnaWMpOwotICBpbnRjb3JlLT5jX2xlbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbGVuKTsKLSAgaW50Y29yZS0+Y19yZWdzX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICopIDApLT5jX3JlZ3MpOwotICBpbnRjb3JlLT5jX3JlZ3Nfc2l6ZSA9IHNpemVvZiAoZXh0Y29yZS0+Y19yZWdzKTsKLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSAgYW91dF82NF9zd2FwX2V4ZWNfaGVhZGVyX2luCi0jZWxzZQotICBhb3V0XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4KLSNlbmRpZgotICAgIChhYmZkLCAmZXh0Y29yZS0+Y19hb3V0aGRyLCAmaW50Y29yZS0+Y19hb3V0aGRyKTsKLSAgaW50Y29yZS0+Y19zaWdubyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc2lnbm8pOwotICBpbnRjb3JlLT5jX3RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y190c2l6ZSk7Ci0gIGludGNvcmUtPmNfZHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2RzaXplKTsKLSAgaW50Y29yZS0+Y19kYXRhX2FkZHIgPSBOX0RBVEFERFIgKGludGNvcmUtPmNfYW91dGhkcik7Ci0gIGludGNvcmUtPmNfc3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NzaXplKTsKLSAgbWVtY3B5IChpbnRjb3JlLT5jX2NtZG5hbWUsIGV4dGNvcmUtPmNfY21kbmFtZSwgc2l6ZW9mIChpbnRjb3JlLT5jX2NtZG5hbWUpKTsKLSAgaW50Y29yZS0+ZnBfc3R1ZmZfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogRlAgc3R1ZmYgdGFrZXMgdXAgd2hvbGUgcmVzdCBvZiBzdHJ1Y3QsIGV4Y2VwdCBjX3Vjb2RlLiAqLwotICBpbnRjb3JlLT5mcF9zdHVmZl9zaXplID0gaW50Y29yZS0+Y19sZW4gLSAoc2l6ZW9mIGV4dGNvcmUtPmNfdWNvZGUpIC0KLSAgICAoZmlsZV9wdHIpICgoKHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogVWNvZGUgaXMgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIHN0cnVjdCAtLSBqdXN0IGJlZm9yZSB0aGUgZW5kICovCi0gIGludGNvcmUtPmNfdWNvZGUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwKLSAgICBpbnRjb3JlLT5jX2xlbiAtIHNpemVvZiAoZXh0Y29yZS0+Y191Y29kZSkgKyAodW5zaWduZWQgY2hhciAqKSBleHRjb3JlKTsKLSAgaW50Y29yZS0+Y19zdGFja3RvcCA9IDB4MEUwMDAwMDA7CS8qIEJ5IGV4cGVyaW1lbnRhdGlvbiAqLwotfQotCi0KLS8qIGJ5dGUtc3dhcCBpbiB0aGUgU3BhcmMgY29yZSBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1zd2FwY29yZV9zcGFyYyAoYWJmZCwgZXh0LCBpbnRjb3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmV4dDsKLSAgICAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmludGNvcmU7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICpleHRjb3JlID0gKHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICopIGV4dDsKLQotICBpbnRjb3JlLT5jX21hZ2ljID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19tYWdpYyk7Ci0gIGludGNvcmUtPmNfbGVuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19sZW4pOwotICBpbnRjb3JlLT5jX3JlZ3NfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICopIDApLT5jX3JlZ3MpOwotICBpbnRjb3JlLT5jX3JlZ3Nfc2l6ZSA9IHNpemVvZiAoZXh0Y29yZS0+Y19yZWdzKTsKLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSAgYW91dF82NF9zd2FwX2V4ZWNfaGVhZGVyX2luCi0jZWxzZQotICBhb3V0XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4KLSNlbmRpZgotICAgIChhYmZkLCAmZXh0Y29yZS0+Y19hb3V0aGRyLCAmaW50Y29yZS0+Y19hb3V0aGRyKTsKLSAgaW50Y29yZS0+Y19zaWdubyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc2lnbm8pOwotICBpbnRjb3JlLT5jX3RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y190c2l6ZSk7Ci0gIGludGNvcmUtPmNfZHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2RzaXplKTsKLSAgaW50Y29yZS0+Y19kYXRhX2FkZHIgPSBOX0RBVEFERFIgKGludGNvcmUtPmNfYW91dGhkcik7Ci0gIGludGNvcmUtPmNfc3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NzaXplKTsKLSAgbWVtY3B5IChpbnRjb3JlLT5jX2NtZG5hbWUsIGV4dGNvcmUtPmNfY21kbmFtZSwgc2l6ZW9mIChpbnRjb3JlLT5jX2NtZG5hbWUpKTsKLSAgaW50Y29yZS0+ZnBfc3R1ZmZfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIEZQIHN0dWZmIHRha2VzIHVwIHdob2xlIHJlc3Qgb2Ygc3RydWN0LCBleGNlcHQgY191Y29kZS4gKi8KLSAgaW50Y29yZS0+ZnBfc3R1ZmZfc2l6ZSA9IGludGNvcmUtPmNfbGVuIC0gKHNpemVvZiBleHRjb3JlLT5jX3Vjb2RlKSAtCi0gICAgKGZpbGVfcHRyKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBVY29kZSBpcyB0aGUgbGFzdCB0aGluZyBpbiB0aGUgc3RydWN0IC0tIGp1c3QgYmVmb3JlIHRoZSBlbmQgKi8KLSAgaW50Y29yZS0+Y191Y29kZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLAotICAgIGludGNvcmUtPmNfbGVuIC0gc2l6ZW9mIChleHRjb3JlLT5jX3Vjb2RlKSArICh1bnNpZ25lZCBjaGFyICopIGV4dGNvcmUpOwotCi0gIC8qIFN1cHBvc2VkbHkgdGhlIHVzZXIgc3RhY2sgZ3Jvd3MgZG93bndhcmQgZnJvbSB0aGUgYm90dG9tIG9mIGtlcm5lbCBtZW1vcnkuCi0gICAgIFByZXN1bWluZyB0aGF0IHRoaXMgcmVtYWlucyB0cnVlLCB0aGlzIGRlZmluaXRpb24gd2lsbCB3b3JrLiAgKi8KLSAgLyogTm93IHN1biBoYXMgcHJvdmlkZWQgdXMgd2l0aCBhbm90aGVyIGNoYWxsZW5nZS4gIFRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQKLSAgICAgZm9yIHNwYXJjMiBhbmQgc3BhcmMxMCAoYm90aCBydW5uaW5nIFN1bk9TIDQuMS4zKS4gIFdlIHBpY2sgb25lIG9yCi0gICAgIHRoZSBvdGhlciBiYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RhY2sgcG9pbnRlci4gIFRoaXMKLSAgICAgbG9zZXMgKGEpIGlmIHRoZSBzdGFjayBwb2ludGVyIGhhcyBiZWVuIGNsb2JiZXJlZCwgb3IgKGIpIGlmIHRoZSBzdGFjawotICAgICBpcyBsYXJnZXIgdGhhbiAxMjggbWVnYWJ5dGVzLgotCi0gICAgIEl0J3MgdGltZXMgbGlrZSB0aGVzZSB5b3UncmUgZ2xhZCB0aGV5J3JlIHN3aXRjaGluZyB0byBFTEYuCi0KLSAgICAgTm90ZSB0aGF0IHVzaW5nIGluY2x1ZGUgZmlsZXMgb3Igbmxpc3Qgb24gL3ZtdW5peCB3b3VsZCBiZSB3cm9uZywKLSAgICAgYmVjYXVzZSB3ZSB3YW50IHRoZSB2YWx1ZSBmb3IgdGhpcyBjb3JlIGZpbGUsIG5vIG1hdHRlciB3aGF0IGtpbmQgb2YKLSAgICAgbWFjaGluZSB3ZSB3ZXJlIGNvbXBpbGVkIG9uIG9yIGFyZSBydW5uaW5nIG9uLiAgKi8KLSNkZWZpbmUgU1BBUkNfVVNSU1RBQ0tfU1BBUkMyICgoYmZkX3ZtYSkweGY4MDAwMDAwKQotI2RlZmluZSBTUEFSQ19VU1JTVEFDS19TUEFSQzEwICgoYmZkX3ZtYSkweGYwMDAwMDAwKQotICB7Ci0gICAgYmZkX3ZtYSBzcCA9IGJmZF9oX2dldF8zMgotICAgIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmKChzdHJ1Y3QgcmVncyAqKSAmZXh0Y29yZS0+Y19yZWdzWzBdKS0+cl9vNik7Ci0gICAgaWYgKHNwIDwgU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMCkKLSAgICAgIGludGNvcmUtPmNfc3RhY2t0b3AgPSBTUEFSQ19VU1JTVEFDS19TUEFSQzEwOwotICAgIGVsc2UKLSAgICAgIGludGNvcmUtPmNfc3RhY2t0b3AgPSBTUEFSQ19VU1JTVEFDS19TUEFSQzI7Ci0gIH0KLX0KLQotLyogYnl0ZS1zd2FwIGluIHRoZSBTb2xhcmlzIEJDUCBjb3JlIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQKLXN3YXBjb3JlX3NvbGFyaXNfYmNwIChhYmZkLCBleHQsIGludGNvcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqZXh0OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqaW50Y29yZTsKLXsKLSAgc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKmV4dGNvcmUgPQotICAgIChzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqKSBleHQ7Ci0KLSAgaW50Y29yZS0+Y19tYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbWFnaWMpOwotICBpbnRjb3JlLT5jX2xlbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbGVuKTsKLSAgaW50Y29yZS0+Y19yZWdzX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqKSAwKS0+Y19yZWdzKTsKLSAgaW50Y29yZS0+Y19yZWdzX3NpemUgPSBzaXplb2YgKGV4dGNvcmUtPmNfcmVncyk7Ci0KLSAgLyogVGhlIFNvbGFyaXMgQkNQIGV4ZGF0YSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbiBhX3N5bXMgZmllbGQsCi0gICAgIHNvIHdlIGFyZSB1bmFibGUgdG8gc3ludGhlc2l6ZSBhbiBpbnRlcm5hbCBleGVjIGhlYWRlci4KLSAgICAgTHVja2lseSB3ZSBhcmUgYWJsZSB0byBmaWd1cmUgb3V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlY3Rpb24sCi0gICAgIHdoaWNoIGlzIHRoZSBvbmx5IHRoaW5nIG5lZWRlZCBmcm9tIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlciwKLSAgICAgZnJvbSB0aGUgZXhkYXRhIHN0cnVjdHVyZS4KLQotICAgICBBcyBvZiBTb2xhcmlzIDIuMywgQkNQIGNvcmUgZmlsZXMgZm9yIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzCi0gICAgIGFyZSBidWdneS4gVGhlIGV4ZGF0YSBzdHJ1Y3R1cmUgaXMgbm90IHByb3Blcmx5IGZpbGxlZCBpbiwgYW5kCi0gICAgIHRoZSBkYXRhIHNlY3Rpb24gaXMgd3JpdHRlbiBmcm9tIGFkZHJlc3MgemVybyBpbnN0ZWFkIG9mIHRoZSBkYXRhCi0gICAgIHN0YXJ0IGFkZHJlc3MuICAqLwotICBtZW1zZXQgKChQVFIpICZpbnRjb3JlLT5jX2FvdXRoZHIsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgaW50Y29yZS0+Y19kYXRhX2FkZHIgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfZXhkYXRhX2RhdG9yZyk7Ci0gIGludGNvcmUtPmNfc2lnbm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NpZ25vKTsKLSAgaW50Y29yZS0+Y190c2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfdHNpemUpOwotICBpbnRjb3JlLT5jX2RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19kc2l6ZSk7Ci0gIGludGNvcmUtPmNfc3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NzaXplKTsKLSAgbWVtY3B5IChpbnRjb3JlLT5jX2NtZG5hbWUsIGV4dGNvcmUtPmNfY21kbmFtZSwgc2l6ZW9mIChpbnRjb3JlLT5jX2NtZG5hbWUpKTsKLSAgaW50Y29yZS0+ZnBfc3R1ZmZfcG9zID0KLSAgICAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogRlAgc3R1ZmYgdGFrZXMgdXAgd2hvbGUgcmVzdCBvZiBzdHJ1Y3QsIGV4Y2VwdCBjX3Vjb2RlLiAqLwotICBpbnRjb3JlLT5mcF9zdHVmZl9zaXplID0gaW50Y29yZS0+Y19sZW4gLSAoc2l6ZW9mIGV4dGNvcmUtPmNfdWNvZGUpIC0KLSAgICAoZmlsZV9wdHIpICgoKHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIFVjb2RlIGlzIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBzdHJ1Y3QgLS0ganVzdCBiZWZvcmUgdGhlIGVuZCAqLwotICBpbnRjb3JlLT5jX3Vjb2RlID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsCi0gICAgaW50Y29yZS0+Y19sZW4gLSBzaXplb2YgKGV4dGNvcmUtPmNfdWNvZGUpICsgKHVuc2lnbmVkIGNoYXIgKikgZXh0Y29yZSk7Ci0KLSAgLyogU3VwcG9zZWRseSB0aGUgdXNlciBzdGFjayBncm93cyBkb3dud2FyZCBmcm9tIHRoZSBib3R0b20gb2Yga2VybmVsIG1lbW9yeS4KLSAgICAgUHJlc3VtaW5nIHRoYXQgdGhpcyByZW1haW5zIHRydWUsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIHdvcmsuICAqLwotICAvKiBOb3cgc3VuIGhhcyBwcm92aWRlZCB1cyB3aXRoIGFub3RoZXIgY2hhbGxlbmdlLiAgVGhlIHZhbHVlIGlzIGRpZmZlcmVudAotICAgICBmb3Igc3BhcmMyIGFuZCBzcGFyYzEwIChib3RoIHJ1bm5pbmcgU3VuT1MgNC4xLjMpLiAgV2UgcGljayBvbmUgb3IKLSAgICAgdGhlIG90aGVyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdGFjayBwb2ludGVyLiAgVGhpcwotICAgICBsb3NlcyAoYSkgaWYgdGhlIHN0YWNrIHBvaW50ZXIgaGFzIGJlZW4gY2xvYmJlcmVkLCBvciAoYikgaWYgdGhlIHN0YWNrCi0gICAgIGlzIGxhcmdlciB0aGFuIDEyOCBtZWdhYnl0ZXMuCi0KLSAgICAgSXQncyB0aW1lcyBsaWtlIHRoZXNlIHlvdSdyZSBnbGFkIHRoZXkncmUgc3dpdGNoaW5nIHRvIEVMRi4KLQotICAgICBOb3RlIHRoYXQgdXNpbmcgaW5jbHVkZSBmaWxlcyBvciBubGlzdCBvbiAvdm11bml4IHdvdWxkIGJlIHdyb25nLAotICAgICBiZWNhdXNlIHdlIHdhbnQgdGhlIHZhbHVlIGZvciB0aGlzIGNvcmUgZmlsZSwgbm8gbWF0dGVyIHdoYXQga2luZCBvZgotICAgICBtYWNoaW5lIHdlIHdlcmUgY29tcGlsZWQgb24gb3IgYXJlIHJ1bm5pbmcgb24uICAqLwotI2RlZmluZSBTUEFSQ19VU1JTVEFDS19TUEFSQzIgKChiZmRfdm1hKTB4ZjgwMDAwMDApCi0jZGVmaW5lIFNQQVJDX1VTUlNUQUNLX1NQQVJDMTAgKChiZmRfdm1hKTB4ZjAwMDAwMDApCi0gIHsKLSAgICBiZmRfdm1hIHNwID0gYmZkX2hfZ2V0XzMyCi0gICAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICYoKHN0cnVjdCByZWdzICopICZleHRjb3JlLT5jX3JlZ3NbMF0pLT5yX282KTsKLSAgICBpZiAoc3AgPCBTUEFSQ19VU1JTVEFDS19TUEFSQzEwKQotICAgICAgaW50Y29yZS0+Y19zdGFja3RvcCA9IFNQQVJDX1VTUlNUQUNLX1NQQVJDMTA7Ci0gICAgZWxzZQotICAgICAgaW50Y29yZS0+Y19zdGFja3RvcCA9IFNQQVJDX1VTUlNUQUNLX1NQQVJDMjsKLSAgfQotfQotCi0vKiBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlIHB0ciBpcyByZWFsbHkgdm9pZCAqICovCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5zdW5fY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX2RhdGFzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPnN0YWNrX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPnJlZ19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZzJzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+cmVnMl9zZWN0aW9uKQotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotc3RydWN0IHN1bl9jb3JlX3N0cnVjdAotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqaGRyOwkvKiBjb3JlIGZpbGUgaGVhZGVyICovCi0gIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpyZWcyX3NlY3Rpb247Ci19OwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zdW5vczRfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciBsb25nYnVmWzRdOwkvKiBSYXcgYnl0ZXMgb2YgdmFyaW91cyBoZWFkZXIgZmllbGRzICovCi0gIGJmZF9zaXplX3R5cGUgY29yZV9zaXplOwotICB1bnNpZ25lZCBsb25nIGNvcmVfbWFnOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqY29yZTsKLSAgY2hhciAqZXh0Y29yZTsKLSAgc3RydWN0IG1lcmdlbQotICAgIHsKLSAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3Qgc3VuY29yZWRhdGE7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSBpbnRlcm5hbF9zdW5vc19jb3JlOwotICAgICAgY2hhciBleHRlcm5hbF9jb3JlWzFdOwotICAgIH0KLSAgICptZXJnZW07Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBsb25nYnVmLCAxLCBzaXplb2YgKGxvbmdidWYpLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChsb25nYnVmKSkKLSAgICByZXR1cm4gMDsKLSAgY29yZV9tYWcgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGxvbmdidWYpOwotCi0gIGlmIChjb3JlX21hZyAhPSBDT1JFX01BR0lDKQotICAgIHJldHVybiAwOwotCi0gIC8qIFN1bk9TIGNvcmUgaGVhZGVycyBjYW4gdmFyeSBpbiBsZW5ndGg7IHNlY29uZCB3b3JkIGlzIHNpemU7ICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgbG9uZ2J1ZiwgMSwgc2l6ZW9mIChsb25nYnVmKSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobG9uZ2J1ZikpCi0gICAgcmV0dXJuIDA7Ci0gIGNvcmVfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgbG9uZ2J1Zik7Ci0gIC8qIFNhbml0eSBjaGVjayAqLwotICBpZiAoY29yZV9zaXplID4gMjAwMDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgbWVyZ2VtID0gKHN0cnVjdCBtZXJnZW0gKikgYmZkX3phbGxvYyAoYWJmZCwgY29yZV9zaXplICsgc2l6ZW9mIChzdHJ1Y3QgbWVyZ2VtKSk7Ci0gIGlmIChtZXJnZW0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBleHRjb3JlID0gbWVyZ2VtLT5leHRlcm5hbF9jb3JlOwotCi0gIGlmICgoYmZkX3JlYWQgKChQVFIpIGV4dGNvcmUsIDEsIGNvcmVfc2l6ZSwgYWJmZCkpICE9IGNvcmVfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKikgbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBWYWxpZGF0ZSB0aGF0IGl0J3MgYSBjb3JlIGZpbGUgd2Uga25vdyBob3cgdG8gaGFuZGxlLCBkdWUgdG8gc3VuCi0gICAgIGJvdGNoaW5nIHRoZSBwb3NpdGlvbmluZyBvZiByZWdpc3RlcnMgYW5kIG90aGVyIGZpZWxkcyBpbiBhIG1hY2hpbmUKLSAgICAgZGVwZW5kZW50IHdheS4gICovCi0gIGNvcmUgPSAmbWVyZ2VtLT5pbnRlcm5hbF9zdW5vc19jb3JlOwotICBzd2l0Y2ggKGNvcmVfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSBTUEFSQ19DT1JFX0xFTjoKLSAgICAgIHN3YXBjb3JlX3NwYXJjIChhYmZkLCBleHRjb3JlLCBjb3JlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VOM19DT1JFX0xFTjoKLSAgICAgIHN3YXBjb3JlX3N1bjMgKGFiZmQsIGV4dGNvcmUsIGNvcmUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTT0xBUklTX0JDUF9DT1JFX0xFTjoKLSAgICAgIHN3YXBjb3JlX3NvbGFyaXNfYmNwIChhYmZkLCBleHRjb3JlLCBjb3JlKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwkvKiBGSVhNRSAqLwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopIG1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWJmZC0+dGRhdGEuc3VuX2NvcmVfZGF0YSA9ICZtZXJnZW0tPnN1bmNvcmVkYXRhOwotICBhYmZkLT50ZGF0YS5zdW5fY29yZV9kYXRhLT5oZHIgPSBjb3JlOwotCi0gIC8qIGNyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gcmVjbGFpbQotICAgICB0aGVtICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfc3RhY2tzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopIG1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9kYXRhc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjE6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9zdGFja3NlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXIyOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfZGF0YXNlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjE7Ci0gICAgfQotICBjb3JlX3JlZzJzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnMnNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9yZWdzZWMgKGFiZmQpKTsKLSAgICAgIGdvdG8gbG9zZXIyOwotICAgIH0KLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmFtZSA9ICIuc3RhY2siOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uYW1lID0gIi5kYXRhIjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWcyIjsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBjb3JlLT5jX3NzaXplOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBjb3JlLT5jX2RzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGNvcmUtPmNfcmVnc19zaXplOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBjb3JlLT5mcF9zdHVmZl9zaXplOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSAoY29yZS0+Y19zdGFja3RvcCAtIGNvcmUtPmNfc3NpemUpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBjb3JlLT5jX2RhdGFfYWRkcjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT52bWEgPSAwOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5maWxlcG9zID0gY29yZS0+Y19sZW4gKyBjb3JlLT5jX2RzaXplOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gY29yZS0+Y19sZW47Ci0gIC8qIFdlJ2xsIGFjY2VzcyB0aGUgcmVncyBhZnJlc2ggaW4gdGhlIGNvcmUgZmlsZSwgbGlrZSBhbnkgc2VjdGlvbjogKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKSBjb3JlLT5jX3JlZ3NfcG9zOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKSBjb3JlLT5mcF9zdHVmZl9wb3M7Ci0KLSAgLyogQWxpZ24gdG8gd29yZCBhdCBsZWFzdCAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9zdGFja3NlYyAoYWJmZCk7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9kYXRhc2VjIChhYmZkKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWcyc2VjIChhYmZkKTsKLQotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gNDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+aGRyLT5jX2NtZG5hbWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+aGRyLT5jX3NpZ25vOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICBpZiAoY29yZV9iZmQtPnh2ZWMgIT0gZXhlY19iZmQtPnh2ZWMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU29sYXJpcyBjb3JlIGZpbGVzIGRvIG5vdCBpbmNsdWRlIGFuIGFvdXRoZHIuICovCi0gIGlmICgoY29yZV9oZHIgKGNvcmVfYmZkKS0+aGRyKS0+Y19sZW4gPT0gU09MQVJJU19CQ1BfQ09SRV9MRU4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIChtZW1jbXAgKChjaGFyICopICYoKGNvcmVfaGRyIChjb3JlX2JmZCktPmhkciktPmNfYW91dGhkciksCi0JCSAgKGNoYXIgKikgZXhlY19oZHIgKGV4ZWNfYmZkKSwKLQkJICBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSkgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLSNkZWZpbmUgTVlfc2V0X3NpemVzIHN1bm9zNF9zZXRfc2l6ZXMKLXN0YXRpYyBib29sZWFuCi1zdW5vczRfc2V0X3NpemVzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAweDIwMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQotLyogV2UgZGVmYXVsdCB0byBzZXR0aW5nIHRoZSB0b29sdmVyc2lvbiBmaWVsZCB0byAxLCBhcyBpcyByZXF1aXJlZCBieQotICAgU3VuT1MuICAqLwotI2lmbmRlZiBNWV9leGVjX2hkcl9mbGFncwotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAxCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfZHluYW1pY19zeW1ib2xzCi0jZGVmaW5lIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9saW5rX2R5bmFtaWNfb2JqZWN0Ci0jZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3QgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9jaGVja19keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayAwCi0jZW5kaWYKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBzdW5vczRfYW91dF9iYWNrZW5kID0KLXsKLSAgMCwJCQkJLyogem1hZ2ljIGZpbGVzIGFyZSBub3QgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2x1ZGVzIGhlYWRlciAqLwotICBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MsCi0gIE1ZX2V4ZWNfaGRyX2ZsYWdzLAotICAwLAkJCQkvKiBkZWZhdWx0IHRleHQgdm1hICovCi0gIHN1bm9zNF9zZXRfc2l6ZXMsCi0gIDAsCQkJCS8qIGhlYWRlciBpcyBjb3VudGVkIGluIHptYWdpYyB0ZXh0ICovCi0gIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMsCi0gIE1ZX2FkZF9vbmVfc3ltYm9sLAotICBNWV9saW5rX2R5bmFtaWNfb2JqZWN0LAotICBNWV93cml0ZV9keW5hbWljX3N5bWJvbCwKLSAgTVlfY2hlY2tfZHluYW1pY19yZWxvYywKLSAgTVlfZmluaXNoX2R5bmFtaWNfbGluawotfTsKLQwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAJc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCXN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9wCQkJc3Vub3M0X2NvcmVfZmlsZV9wCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cwlOQU1FKGFvdXQsc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykKLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhCQkJJnN1bm9zNF9hb3V0X2JhY2tlbmQKLQotI2lmbmRlZiBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0eC5oIGIvYmZkL2FvdXR4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MDRlZWMuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXR4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NzA2ICswLDAgQEAKLS8qIEJGRCBzZW1pLWdlbmVyaWMgYmFjay1lbmQgZm9yIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlhLm91dCBiYWNrZW5kcwotCi0KLURFU0NSSVBUSU9OCi0KLQlCRkQgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZsYXZvdXJzIG9mIGEub3V0IGZvcm1hdCwKLQl0aG91Z2ggdGhlIG1ham9yIGRpZmZlcmVuY2VzIGFyZSBvbmx5IHRoZSBzaXplcyBvZiB0aGUKLQlzdHJ1Y3R1cmVzIG9uIGRpc2ssIGFuZCB0aGUgc2hhcGUgb2YgdGhlIHJlbG9jYXRpb24KLQlpbmZvcm1hdGlvbi4KLQotCVRoZSBzdXBwb3J0IGlzIHNwbGl0IGludG8gYSBiYXNpYyBzdXBwb3J0IGZpbGUgQGZpbGV7YW91dHguaH0KLQlhbmQgb3RoZXIgZmlsZXMgd2hpY2ggZGVyaXZlIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlLiBPbmUKLQlkZXJpdmF0aW9uIGZpbGUgaXMgQGZpbGV7YW91dGYxLmh9IChmb3IgYS5vdXQgZmxhdm91ciAxKSwgYW5kCi0JYWRkcyB0byB0aGUgYmFzaWMgYS5vdXQgZnVuY3Rpb25zIHN1cHBvcnQgZm9yIHN1bjMsIHN1bjQsIDM4NgotCWFuZCAyOWsgYS5vdXQgZmlsZXMsIHRvIGNyZWF0ZSBhIHRhcmdldCBqdW1wIHZlY3RvciBmb3IgYQotCXNwZWNpZmljIHRhcmdldC4KLQotCVRoaXMgaW5mb3JtYXRpb24gaXMgZnVydGhlciBzcGxpdCBvdXQgaW50byBtb3JlIHNwZWNpZmljIGZpbGVzCi0JZm9yIGVhY2ggbWFjaGluZSwgaW5jbHVkaW5nIEBmaWxle3N1bm9zLmN9IGZvciBzdW4zIGFuZCBzdW40LAotCUBmaWxle25ld3NvczMuY30gZm9yIHRoZSBTb255IE5FV1MsIGFuZCBAZmlsZXtkZW1vNjQuY30gZm9yIGEKLQlkZW1vbnN0cmF0aW9uIG9mIGEgNjQgYml0IGEub3V0IGZvcm1hdC4KLQotCVRoZSBiYXNlIGZpbGUgQGZpbGV7YW91dHguaH0gZGVmaW5lcyBnZW5lcmFsIG1lY2hhbmlzbXMgZm9yCi0JcmVhZGluZyBhbmQgd3JpdGluZyByZWNvcmRzIHRvIGFuZCBmcm9tIGRpc2sgYW5kIHZhcmlvdXMKLQlvdGhlciBtZXRob2RzIHdoaWNoIEJGRCByZXF1aXJlcy4gSXQgaXMgaW5jbHVkZWQgYnkKLQlAZmlsZXthb3V0MzIuY30gYW5kIEBmaWxle2FvdXQ2NC5jfSB0byBmb3JtIHRoZSBuYW1lcwotCTw8YW91dF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luPj4sIDw8YW91dF82NF9zd2FwX2V4ZWNfaGVhZGVyX2luPj4sIGV0Yy4KLQotCUFzIGFuIGV4YW1wbGUsIHRoaXMgaXMgd2hhdCBnb2VzIG9uIHRvIG1ha2UgdGhlIGJhY2sgZW5kIGZvciBhCi0Jc3VuNCwgZnJvbSBAZmlsZXthb3V0MzIuY306Ci0KLXwJI2RlZmluZSBBUkNIX1NJWkUgMzIKLXwJI2luY2x1ZGUgImFvdXR4LmgiCi0KLQlXaGljaCBleHBvcnRzIG5hbWVzOgotCi18CS4uLgotfAlhb3V0XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYwotfAlhb3V0XzMyX2ZpbmRfbmVhcmVzdF9saW5lCi18CWFvdXRfMzJfZ2V0X2xpbmVubwotfAlhb3V0XzMyX2dldF9yZWxvY191cHBlcl9ib3VuZAotfAkuLi4KLQotCWZyb20gQGZpbGV7c3Vub3MuY306Ci0KLXwJI2RlZmluZSBUQVJHRVRfTkFNRSAiYS5vdXQtc3Vub3MtYmlnIgotfAkjZGVmaW5lIFZFQ05BTUUgICAgc3Vub3NfYmlnX3ZlYwotfAkjaW5jbHVkZSAiYW91dGYxLmgiCi0KLQlyZXF1aXJlcyBhbGwgdGhlIG5hbWVzIGZyb20gQGZpbGV7YW91dDMyLmN9LCBhbmQgcHJvZHVjZXMgdGhlIGp1bXAgdmVjdG9yCi0KLXwJc3Vub3NfYmlnX3ZlYwotCi0JVGhlIGZpbGUgQGZpbGV7aG9zdC1hb3V0LmN9IGlzIGEgc3BlY2lhbCBjYXNlLiAgSXQgaXMgZm9yIGEgbGFyZ2Ugc2V0Ci0Jb2YgaG9zdHMgdGhhdCB1c2UgYGBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQnJyBhLm91dCBmaWxlcywgYW5kCi0JZm9yIHdoaWNoIGNyb3NzLWRlYnVnZ2luZyBpcyBub3QgaW50ZXJlc3RpbmcuICBJdCB1c2VzIHRoZQotCXN0YW5kYXJkIDMyLWJpdCBhLm91dCBzdXBwb3J0IHJvdXRpbmVzLCBidXQgZGV0ZXJtaW5lcyB0aGUKLQlmaWxlIG9mZnNldHMgYW5kIGFkZHJlc3NlcyBvZiB0aGUgdGV4dCwgZGF0YSwgYW5kIEJTUwotCXNlY3Rpb25zLCB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSwgYW5kIHRoZQotCWVudHJ5IHBvaW50IGFkZHJlc3MsIGluIGEgaG9zdC1kZXBlbmRlbnQgbWFubmVyLiAgT25jZSB0aGVzZQotCXZhbHVlcyBoYXZlIGJlZW4gZGV0ZXJtaW5lZCwgZ2VuZXJpYyBjb2RlIGlzIHVzZWQgdG8gaGFuZGxlCi0JdGhlICBvYmplY3QgZmlsZS4KLQotCVdoZW4gcG9ydGluZyBpdCB0byBydW4gb24gYSBuZXcgc3lzdGVtLCB5b3UgbXVzdCBzdXBwbHk6Ci0KLXwgICAgICAgIEhPU1RfUEFHRV9TSVpFCi18ICAgICAgICBIT1NUX1NFR01FTlRfU0laRQotfCAgICAgICAgSE9TVF9NQUNISU5FX0FSQ0ggICAgICAgKG9wdGlvbmFsKQotfCAgICAgICAgSE9TVF9NQUNISU5FX01BQ0hJTkUgICAgKG9wdGlvbmFsKQotfCAgICAgICAgSE9TVF9URVhUX1NUQVJUX0FERFIKLXwgICAgICAgIEhPU1RfU1RBQ0tfRU5EX0FERFIKLQotCWluIHRoZSBmaWxlIEBmaWxley4uL2luY2x1ZGUvc3lzL2gtQHZhcntYWFh9Lmh9IChmb3IgeW91ciBob3N0KS4gIFRoZXNlCi0JdmFsdWVzLCBwbHVzIHRoZSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgZGVmaW5lZCBpbiBAZmlsZXthLm91dC5ofSBvbgotCXlvdXIgaG9zdCBzeXN0ZW0sIHdpbGwgcHJvZHVjZSBhIEJGRCB0YXJnZXQgdGhhdCB3aWxsIGFjY2VzcwotCW9yZGluYXJ5IGEub3V0IGZpbGVzIG9uIHlvdXIgaG9zdC4gVG8gY29uZmlndXJlIGEgbmV3IG1hY2hpbmUKLQl0byB1c2UgQGZpbGV7aG9zdC1hb3V0LmN9LCBzcGVjaWZ5OgotCi18CVRERUZBVUxUUyA9IC1EREVGQVVMVF9WRUNUT1I9aG9zdF9hb3V0X2JpZ192ZWMKLXwJVERFUEZJTEVTPSBob3N0LWFvdXQubyB0cmFkLWNvcmUubwotCi0JaW4gdGhlIEBmaWxle2NvbmZpZy9AdmFye1hYWH0ubXR9IGZpbGUsIGFuZCBtb2RpZnkgQGZpbGV7Y29uZmlndXJlLmlufQotCXRvIHVzZSB0aGUKLQlAZmlsZXtAdmFye1hYWH0ubXR9IGZpbGUgKGJ5IHNldHRpbmcgIjw8YmZkX3RhcmdldD1YWFg+PiIpIHdoZW4geW91cgotCWNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQuCi0KLSovCi0KLS8qIFNvbWUgYXNzdW1wdGlvbnM6Ci0gICAqIEFueSBCRkQgd2l0aCBEX1BBR0VEIHNldCBpcyBaTUFHSUMsIGFuZCB2aWNlIHZlcnNhLgotICAgICBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBzZXR0aW5nIG9mIFdQX1RFWFQgaXMgb24gb3V0cHV0LCBidXQgaXQnbGwKLSAgICAgZ2V0IHNldCBvbiBpbnB1dC4KLSAgICogQW55IEJGRCB3aXRoIERfUEFHRUQgY2xlYXIgYW5kIFdQX1RFWFQgc2V0IGlzIE5NQUdJQy4KLSAgICogQW55IEJGRCB3aXRoIGJvdGggZmxhZ3MgY2xlYXIgaXMgT01BR0lDLgotICAgKEp1c3Qgd2FudCB0byBtYWtlIHRoZXNlIGV4cGxpY2l0LCBzbyB0aGUgY29uZGl0aW9ucyB0ZXN0ZWQgaW4gdGhpcwotICAgZmlsZSBtYWtlIHNlbnNlIGlmIHlvdSdyZSBtb3JlIGZhbWlsaWFyIHdpdGggYS5vdXQgdGhhbiB3aXRoIEJGRC4pICAqLwotCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLXN0YXRpYyBib29sZWFuIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3RydWN0IGV4dGVybmFsX25saXN0ICopKTsKLXN0YXRpYyB2b2lkIGFkanVzdF9vX21hZ2ljIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3Rfel9tYWdpYyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4ZWMgKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X25fbWFnaWMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leGVjICopKTsKLQotLyoKLVNVQlNFQ1RJT04KLQlSZWxvY2F0aW9ucwotCi1ERVNDUklQVElPTgotCVRoZSBmaWxlIEBmaWxle2FvdXR4Lmh9IHByb3ZpZGVzIGZvciBib3RoIHRoZSBAZW1waHtzdGFuZGFyZH0KLQlhbmQgQGVtcGh7ZXh0ZW5kZWR9IGZvcm1zIG9mIGEub3V0IHJlbG9jYXRpb24gcmVjb3Jkcy4KLQotCVRoZSBzdGFuZGFyZCByZWNvcmRzIGNvbnRhaW4gb25seSBhbgotCWFkZHJlc3MsIGEgc3ltYm9sIGluZGV4LCBhbmQgYSB0eXBlIGZpZWxkLiBUaGUgZXh0ZW5kZWQgcmVjb3JkcwotCSh1c2VkIG9uIDI5a3MgYW5kIHNwYXJjcykgYWxzbyBoYXZlIGEgZnVsbCBpbnRlZ2VyIGZvciBhbgotCWFkZGVuZC4KLQotKi8KLSNpZm5kZWYgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTwotI2RlZmluZSBDVE9SX1RBQkxFX1JFTE9DX0lEWCAyCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSE9XVE8oQkZEKSAoKG9ial9yZWxvY19lbnRyeV9zaXplKEJGRCkgPT0gUkVMT0NfRVhUX1NJWkUgXAotCSAgICAgPyBob3d0b190YWJsZV9leHQgOiBob3d0b190YWJsZV9zdGQpIFwKLQkgICAgKyBDVE9SX1RBQkxFX1JFTE9DX0lEWCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3N3YXBfc3RkX3JlbG9jX2luCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX2luIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3N3YXBfc3RkX3JlbG9jX291dAotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19vdXQgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSNkZWZpbmUgTVlfZmluYWxfbGlua19yZWxvY2F0ZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3JlbG9jYXRlX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfcmVsb2NhdGVfY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGhvd3RvX3RhYmxlX2V4dCBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKQotI2RlZmluZSBob3d0b190YWJsZV9zdGQgTkFNRShhb3V0LHN0ZF9ob3d0b190YWJsZSkKLQotcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZV9leHRbXSA9Ci17Ci0gIC8qIHR5cGUgICAgICAgICAgIHJzICAgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgc2V0bWFzayBwY2RvbmUgKi8KLSAgSE9XVE8oUkVMT0NfOCwgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLCAgICAgICAgZmFsc2UsIDAsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18xNiwgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsICAgICAgIGZhbHNlLCAwLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfMzIsICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLCAgICAgICBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1A4LCAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQOCIsIAlmYWxzZSwgMCwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1AxNiwgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQMTYiLCAJZmFsc2UsIDAsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19ESVNQMzIsIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiRElTUDMyIiwgCWZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfV0RJU1AzMCwyLCAgMiwgCTMwLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIldESVNQMzAiLCAJZmFsc2UsIDAsMHgzZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19XRElTUDIyLDIsICAyLCAJMjIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiV0RJU1AyMiIsIAlmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0hJMjIsICAgMTAsIDIsIAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkhJMjIiLAlmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzIyLCAgICAgMCwgIDIsIAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjIyIiwgICAgICAgZmFsc2UsIDAsMHgwMDNmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18xMywgICAgIDAsICAyLCAJMTMsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxMyIsICAgICAgIGZhbHNlLCAwLDB4MDAwMDFmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfTE8xMCwgICAwLCAgMiwgCTEwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwwLCJMTzEwIiwgICAgIGZhbHNlLCAwLDB4MDAwMDAzZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfU0ZBX0JBU0UsMCwgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0ZBX0JBU0UiLCBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1NGQV9PRkYxMywwLDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlNGQV9PRkYxMyIsZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMTAsIDAsICAyLCAJMTAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIkJBU0UxMCIsICAgZmFsc2UsIDAsMHgwMDAwMDNmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMTMsIDAsICAyLAkxMywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJCQVNFMTMiLCAgIGZhbHNlLCAwLDB4MDAwMDFmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfQkFTRTIyLCAxMCwgMiwJMjIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMjIiLCAgIGZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfUEMxMCwgICAwLCAgMiwJMTAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIlBDMTAiLAlmYWxzZSwgMCwweDAwMDAwM2ZmLCB0cnVlKSwKLSAgSE9XVE8oUkVMT0NfUEMyMiwgICAxMCwgIDIsCTIyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIlBDMjIiLCBmYWxzZSwgMCwweDAwM2ZmZmZmLCB0cnVlKSwKLSAgSE9XVE8oUkVMT0NfSk1QX1RCTCwyLCAgMiwgCTMwLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkpNUF9UQkwiLCAJZmFsc2UsIDAsMHgzZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19TRUdPRkYxNiwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlNFR09GRjE2IiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19HTE9CX0RBVCwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkdMT0JfREFUIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19KTVBfU0xPVCwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkpNUF9TTE9UIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19SRUxBVElWRSwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJFTEFUSVZFIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTygwLCAgMCwgMCwgICAgMCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTygwLCAgMCwgMCwgICAgMCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2RlZmluZSBSRUxPQ19TUEFSQ19SRVYzMiBSRUxPQ19XRElTUDE5Ci0gIEhPV1RPKFJFTE9DX1NQQVJDX1JFVjMyLCAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwwLCJSX1NQQVJDX1JFVjMyIiwgICAgICAgZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotLyogQ29udmVydCBzdGFuZGFyZCByZWxvYyByZWNvcmRzIHRvICJhcmVsZW50IiBmb3JtYXQgKGluY2wgYnl0ZSBzd2FwKS4gICovCi0KLXJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVfc3RkW10gPSB7Ci0gIC8qIHR5cGUgICAgICAgICAgICAgIHJzIHNpemUgYnN6ICBwY3JlbCBiaXRwb3Mgb3ZyZiAgICAgICAgICAgICAgICAgICAgIHNmIG5hbWUgICAgIHBhcnRfaW5wbCByZWFkbWFzayAgc2V0bWFzayAgICBwY2RvbmUgKi8KLUhPV1RPKCAwLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwJCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotSE9XVE8oIDEsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLUhPV1RPKCAyLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTyggMywJICAgICAgIDAsICA0LCAJNjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI2NCIsCXRydWUsIDB4ZGVhZGRlYWQsMHhkZWFkZGVhZCwgZmFsc2UpLAotSE9XVE8oIDQsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLUhPV1RPKCA1LAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotSE9XVE8oIDYsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTyggNywJICAgICAgIDAsICA0LCAJNjQsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQNjQiLAl0cnVlLCAweGZlZWRmYWNlLDB4ZmVlZGZhY2UsIGZhbHNlKSwKLUhPV1RPKCA4LAkgICAgICAgMCwgIDIsICAgIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJHT1RfUkVMIiwJZmFsc2UsICAgICAgICAgMCwweDAwMDAwMDAwLCBmYWxzZSksCi1IT1dUTyggOSwJICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRTE2IiwJZmFsc2UsMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTygxMCwJICAgICAgIDAsICAyLCAgIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRTMyIiwJZmFsc2UsMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sCi0gIEhPV1RPKDE2LAkgICAgICAgMCwgIDIsCSAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSk1QX1RBQkxFIiwgZmFsc2UsICAgICAgICAgMCwweDAwMDAwMDAwLCBmYWxzZSksCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sCi17IC0xIH0sIHsgLTEgfSwgeyAtMSB9LCB7IC0xIH0sIHsgLTEgfSwgeyAtMSB9LCB7IC0xIH0sIHsgLTEgfSwKLSAgSE9XVE8oMzIsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSRUxBVElWRSIsICBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLSAgSE9XVE8oNDAsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFUkVMIiwgICBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLX07Ci0KLSNkZWZpbmUgVEFCTEVfU0laRShUQUJMRSkJKHNpemVvZihUQUJMRSkvc2l6ZW9mKFRBQkxFWzBdKSkKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1OQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIChhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0jZGVmaW5lIEVYVChpLGopCWNhc2UgaTogcmV0dXJuICZob3d0b190YWJsZV9leHRbal0KLSNkZWZpbmUgU1REKGksaikJY2FzZSBpOiByZXR1cm4gJmhvd3RvX3RhYmxlX3N0ZFtqXQotICBpbnQgZXh0ID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX0VYVF9TSVpFOwotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0JY29kZSA9IEJGRF9SRUxPQ18zMjsKLQlicmVhazsKLSAgICAgIGNhc2UgNjQ6Ci0JY29kZSA9IEJGRF9SRUxPQ182NDsKLQlicmVhazsKLSAgICAgIH0KLSAgaWYgKGV4dCkKLSAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICB7Ci0JRVhUIChCRkRfUkVMT0NfMzIsIDIpOwotCUVYVCAoQkZEX1JFTE9DX0hJMjIsIDgpOwotCUVYVCAoQkZEX1JFTE9DX0xPMTAsIDExKTsKLQlFWFQgKEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgNik7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgNyk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkMxMywgMTApOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCAxNCk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLCAxNSk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfR09UMTMsIDE1KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgMTYpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1BDMTAsIDE3KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19QQzIyLCAxOCk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCAxOSk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfUkVWMzIsIDI2KTsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgICAgfQotICBlbHNlCi0gICAgLyogc3RkIHJlbG9jcyAqLwotICAgIHN3aXRjaCAoY29kZSkKLSAgICAgIHsKLQlTVEQgKEJGRF9SRUxPQ18xNiwgMSk7Ci0JU1REIChCRkRfUkVMT0NfMzIsIDIpOwotCVNURCAoQkZEX1JFTE9DXzhfUENSRUwsIDQpOwotCVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCA1KTsKLQlTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgNik7Ci0JU1REIChCRkRfUkVMT0NfMTZfQkFTRVJFTCwgOSk7Ci0JU1REIChCRkRfUkVMT0NfMzJfQkFTRVJFTCwgMTApOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgICB9Ci19Ci0KLS8qCi1TVUJTRUNUSU9OCi0JSW50ZXJuYWwgZW50cnkgcG9pbnRzCi0KLURFU0NSSVBUSU9OCi0JQGZpbGV7YW91dHguaH0gZXhwb3J0cyBzZXZlcmFsIHJvdXRpbmVzIGZvciBhY2Nlc3NpbmcgdGhlCi0JY29udGVudHMgb2YgYW4gYS5vdXQgZmlsZSwgd2hpY2ggYXJlIGdhdGhlcmVkIGFuZCBleHBvcnRlZCBpbgotCXR1cm4gYnkgdmFyaW91cyBmb3JtYXQgc3BlY2lmaWMgZmlsZXMgKGVnIHN1bm9zLmMpLgotCi0qLwotCi0vKgotRlVOQ1RJT04KLQkgYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfaW4KLQotU1lOT1BTSVMKLQl2b2lkIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX2luLAotICAgICAgICAgICAoYmZkICphYmZkLAotICAgICAgICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKLSAgICAgICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCk7Ci0KLURFU0NSSVBUSU9OCi0JU3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgQHZhcntyYXdfYnl0ZXN9IHRha2VuCi0JZnJvbSBhIHJhdyBieXRlIHN0cmVhbSBtZW1vcnkgaW1hZ2UgaW50byB0aGUgaW50ZXJuYWwgZXhlYyBoZWFkZXIKLQlzdHJ1Y3R1cmUgQHZhcntleGVjcH0uCi0qLwotCi0jaWZuZGVmIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbgotdm9pZAotTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKLSAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCi0gICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKLSAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLwotICBtZW1zZXQgKChQVFIpIGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7Ci0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfaW5mbyk7Ci0gIGV4ZWNwLT5hX3RleHQgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90ZXh0KTsKLSAgZXhlY3AtPmFfZGF0YSAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpOwotICBleGVjcC0+YV9lbnRyeSAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci19Ci0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikKLSNlbmRpZgotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9vdXQKLQotU1lOT1BTSVMKLQl2b2lkIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX291dAotCSAgKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsCi0JICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcyk7Ci0KLURFU0NSSVBUSU9OCi0JU3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlCi0JQHZhcntleGVjcH0gaW50byB0aGUgYnVmZmVyIEB2YXJ7cmF3X2J5dGVzfSByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLgotKi8KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCByYXdfYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvICAsIGJ5dGVzLT5lX2luZm8pOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGV4dCAgLCBieXRlcy0+ZV90ZXh0KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2RhdGEgICwgYnl0ZXMtPmVfZGF0YSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9ic3MgICAsIGJ5dGVzLT5lX2Jzcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9zeW1zICAsIGJ5dGVzLT5lX3N5bXMpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZW50cnkgLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci19Ci0KLS8qIE1ha2UgYWxsIHRoZSBzZWN0aW9uIGZvciBhbiBhLm91dCBmaWxlLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfdGV4dHNlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIudGV4dCIpID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG9ial9kYXRhc2VjIChhYmZkKSA9PSAoYXNlY3Rpb24gKikgTlVMTAotICAgICAgJiYgYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIikgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAob2JqX2Jzc3NlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuYnNzIikgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X3NvbWVfYW91dF9vYmplY3RfcAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF90YXJnZXQgKmFvdXRfQHZhcntzaXplfV9zb21lX2FvdXRfb2JqZWN0X3AKLQkgKGJmZCAqYWJmZCwKLQkgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkoKSk7Ci0KLURFU0NSSVBUSU9OCi0JU29tZSBhLm91dCB2YXJpYW50IHRoaW5rcyB0aGF0IHRoZSBmaWxlIG9wZW4gaW4gQHZhcnthYmZkfQotCWNoZWNraW5nIGlzIGFuIGEub3V0IGZpbGUuICBEbyBzb21lIG1vcmUgY2hlY2tpbmcsIGFuZCBzZXQgdXAKLQlmb3IgYWNjZXNzIGlmIGl0IHJlYWxseSBpcy4gIENhbGwgYmFjayB0byB0aGUgY2FsbGluZwotCWVudmlyb25tZW50J3MgImZpbmlzaCB1cCIgZnVuY3Rpb24ganVzdCBiZWZvcmUgcmV0dXJuaW5nLCB0bwotCWhhbmRsZSBhbnkgbGFzdC1taW51dGUgc2V0dXAuCi0qLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLU5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIChhYmZkLCBleGVjcCwgY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLXsKLSAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0ciwgKm9sZHJhd3B0cjsKLSAgY29uc3QgYmZkX3RhcmdldCAqcmVzdWx0OwotCi0gIHJhd3B0ciA9IChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCApKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIG9sZHJhd3B0ciA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YTsKLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotCi0gIC8qIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbGQgdGRhdGEgc3RydWN0LgotICAgICBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRoZSBzdWJmb3JtYXQsIHNpbmNlIGZvciBocHV4IGl0IHdhcyBzZXQgaW4KLSAgICAgaHAzMDBocHV4LmM6c3dhcF9leGVjX2hlYWRlcl9pbiBhbmQgd2lsbCBiZSB1c2VkIGluCi0gICAgIGhwMzAwaHB1eC5jOmNhbGxiYWNrLiAgKi8KLSAgaWYgKG9sZHJhd3B0ciAhPSBOVUxMKQotICAgICphYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSAqb2xkcmF3cHRyOwotCi0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIgPSAmcmF3cHRyLT5lOwotICAqKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIpID0gKmV4ZWNwOwkvKiBDb3B5IGluIHRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdCAqLwotICBleGVjcCA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHI7Ci0KLSAgLyogU2V0IHRoZSBmaWxlIGZsYWdzICovCi0gIGFiZmQtPmZsYWdzID0gQkZEX05PX0ZMQUdTOwotICBpZiAoZXhlY3AtPmFfZHJzaXplIHx8IGV4ZWNwLT5hX3Ryc2l6ZSkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gIC8qIFNldHRpbmcgb2YgRVhFQ19QIGhhcyBiZWVuIGRlZmVycmVkIHRvIHRoZSBib3R0b20gb2YgdGhpcyBmdW5jdGlvbiAqLwotICBpZiAoZXhlY3AtPmFfc3ltcykKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotICBpZiAoTl9EWU5BTUlDKCpleGVjcCkpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQotICBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBaTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRCB8IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBRTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRCB8IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICAgICAgYWRhdGEgKGFiZmQpLnN1YmZvcm1hdCA9IHFfbWFnaWNfZm9ybWF0OwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBOTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG5fbWFnaWM7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE9NQUdJQwotCSAgIHx8IE5fTUFHSUMgKCpleGVjcCkgPT0gQk1BR0lDKQotICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG9fbWFnaWM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaG91bGQgaGF2ZSBiZWVuIGNoZWNrZWQgd2l0aCBOX0JBRE1BRyBiZWZvcmUgdGhpcyByb3V0aW5lCi0JIHdhcyBjYWxsZWQuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBleGVjcC0+YV9lbnRyeTsKLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IChhb3V0X3N5bWJvbF90eXBlICopTlVMTDsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotCi0gIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gZW50cnkgc2l6ZSBpcyB0aGF0IG9mIHRyYWRpdGlvbmFsIFY3IFVuaXguICAqLwotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICAvKiBUaGUgZGVmYXVsdCBzeW1ib2wgZW50cnkgc2l6ZSBpcyB0aGF0IG9mIHRyYWRpdGlvbmFsIFVuaXguICovCi0gIG9ial9zeW1ib2xfZW50cnlfc2l6ZSAoYWJmZCkgPSBFWFRFUk5BTF9OTElTVF9TSVpFOwotCi0jaWZkZWYgVVNFX01NQVAKLSAgYmZkX2luaXRfd2luZG93ICgmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkpOwotICBiZmRfaW5pdF93aW5kb3cgKCZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSk7Ci0jZW5kaWYKLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpID0gTlVMTDsKLQotICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfZGF0YTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2JzczsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZsYWdzID0KLSAgICAoZXhlY3AtPmFfdHJzaXplICE9IDAKLSAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCi0gICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPQotICAgIChleGVjcC0+YV9kcnNpemUgIT0gMAotICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKLSAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DOwotCi0jaWZkZWYgVEhJU19JU19PTkxZX0RPQ1VNRU5UQVRJT04KLSAgLyogVGhlIGNvbW1vbiBjb2RlIGNhbid0IGZpbGwgaW4gdGhlc2UgdGhpbmdzIGJlY2F1c2UgdGhleSBkZXBlbmQKLSAgICAgb24gZWl0aGVyIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSB0ZXh0IHNlZ21lbnQsIHRoZSByb3VuZGluZwotICAgICB1cCBvZiB2aXJ0dWFsIGFkZHJlc3NlcyBiZXR3ZWVuIHNlZ21lbnRzLCBvciB0aGUgc3RhcnRpbmcgZmlsZQotICAgICBwb3NpdGlvbiBvZiB0aGUgdGV4dCBzZWdtZW50IC0tIGFsbCBvZiB3aGljaCB2YXJpZXMgYW1vbmcgZGlmZmVyZW50Ci0gICAgIHZlcnNpb25zIG9mIGEub3V0LiAgKi8KLQotICAvKiBDYWxsIGJhY2sgdG8gdGhlIGZvcm1hdC1kZXBlbmRlbnQgY29kZSB0byBmaWxsIGluIHRoZSByZXN0IG9mIHRoZQotICAgICBmaWVsZHMgYW5kIGRvIGFueSBmdXJ0aGVyIGNsZWFudXAuICBUaGluZ3MgdGhhdCBzaG91bGQgYmUgZmlsbGVkCi0gICAgIGluIGJ5IHRoZSBjYWxsYmFjazogICovCi0KLSAgc3RydWN0IGV4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+c2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJhd19zaXplID0gTl9UWFRTSVpFKCpleGVjcCk7Ci0gIC8qIGRhdGEgYW5kIGJzcyBhcmUgYWxyZWFkeSBmaWxsZWQgaW4gc2luY2UgdGhleSdyZSBzbyBzdGFuZGFyZCAqLwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSKCpleGVjcCk7Ci0gIG9ial9ic3NzZWMgIChhYmZkKS0+dm1hID0gTl9CU1NBRERSKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9UWFRPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gTl9TVFJPRkYgKCpleGVjcCk7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHN3aXRjaCAoTl9NQUNIVFlQRSAoKmV4ZWNfaGRyIChhYmZkKSkpIHsKLSAgZGVmYXVsdDoKLSAgICBhYmZkLT5vYmpfYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBhZGF0YShhYmZkKS0+cGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSAgYWRhdGEoYWJmZCktPnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCktPmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotICAvKiBUaGUgYXJjaGl0ZWN0dXJlIGlzIGVuY29kZWQgaW4gdmFyaW91cyB3YXlzIGluIHZhcmlvdXMgYS5vdXQgdmFyaWFudHMsCi0gICAgIG9yIGlzIG5vdCBlbmNvZGVkIGF0IGFsbCBpbiBzb21lIG9mIHRoZW0uICBUaGUgcmVsb2NhdGlvbiBzaXplIGRlcGVuZHMKLSAgICAgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlIGEub3V0IHZhcmlhbnQuICBGaW5hbGx5LCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgIGlzIHRoZSBiZmRfdGFyZ2V0IHZlY3RvciBpbiB1c2UuICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiB6ZXJvIGFuZAotICAgICBzZXQgYmZkX2Vycm9yIHRvIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgotCi0gICAgIEZvcm1hdHMgc3VjaCBhcyBiLm91dCwgd2hpY2ggaGF2ZSBhZGRpdGlvbmFsIGZpZWxkcyBpbiB0aGUgYS5vdXQKLSAgICAgaGVhZGVyLCBzaG91bGQgY29wZSB3aXRoIHRoZW0gaW4gdGhpcyBjYWxsYmFjayBhcyB3ZWxsLiAgKi8KLSNlbmRpZgkJCQkvKiBET0NVTUVOVEFUSU9OICovCi0KLSAgcmVzdWx0ID0gKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKShhYmZkKTsKLQotICAvKiBOb3cgdGhhdCB0aGUgc2VnbWVudCBhZGRyZXNzZXMgaGF2ZSBiZWVuIHdvcmtlZCBvdXQsIHRha2UgYSBiZXR0ZXIKLSAgICAgZ3Vlc3MgYXQgd2hldGhlciB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLiAgSWYgdGhlIGVudHJ5IHBvaW50Ci0gICAgIGlzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhc3N1bWUgaXQgaXMuICAoVGhpcyBtYWtlcyBmaWxlcwotICAgICBleGVjdXRhYmxlIGV2ZW4gaWYgdGhlaXIgZW50cnkgcG9pbnQgYWRkcmVzcyBpcyAwLCBhcyBsb25nIGFzCi0gICAgIHRoZWlyIHRleHQgc3RhcnRzIGF0IHplcm8uKS4KLQotICAgICBUaGlzIHRlc3QgaGFkIHRvIGJlIGNoYW5nZWQgdG8gZGVhbCB3aXRoIHN5c3RlbXMgd2hlcmUgdGhlIHRleHQgc2VnbWVudAotICAgICBydW5zIGF0IGEgZGlmZmVyZW50IGxvY2F0aW9uIHRoYW4gdGhlIGRlZmF1bHQuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZQotICAgICBlbnRyeSBhZGRyZXNzIGNhbiBhcHBlYXIgdG8gYmUgb3V0c2lkZSB0aGUgdGV4dCBzZWdtZW50LCB0aHVzIGNhdXNpbmcgYW4KLSAgICAgZXJyb25lb3VzIGNvbmNsdXNpb24gdGhhdCB0aGUgZmlsZSBpc24ndCBleGVjdXRhYmxlLgotCi0gICAgIFRvIGZpeCB0aGlzLCB3ZSBub3cgYWNjZXB0IGFueSBub24temVybyBlbnRyeSBwb2ludCBhcyBhbiBpbmRpY2F0aW9uIG9mCi0gICAgIGV4ZWN1dGFiaWxpdHkuICBUaGlzIHdpbGwgd29yayBtb3N0IG9mIHRoZSB0aW1lLCBzaW5jZSBvbmx5IHRoZSBsaW5rZXIKLSAgICAgc2V0cyB0aGUgZW50cnkgcG9pbnQsIGFuZCB0aGF0IGlzIGxpa2VseSB0byBiZSBub24temVybyBmb3IgbW9zdCBzeXN0ZW1zLiAqLwotCi0gIGlmIChleGVjcC0+YV9lbnRyeSAhPSAwCi0gICAgICB8fCAoZXhlY3AtPmFfZW50cnkgPj0gb2JqX3RleHRzZWMoYWJmZCktPnZtYQotCSAgJiYgZXhlY3AtPmFfZW50cnkgPCBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hICsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSkpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotI2lmZGVmIFNUQVRfRk9SX0VYRUMKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOwotCi0gICAgICAvKiBUaGUgb3JpZ2luYWwgaGV1cmlzdGljIGRvZXNuJ3Qgd29yayBpbiBzb21lIGltcG9ydGFudCBjYXNlcy4KLSAgICAgICAgVGhlIGEub3V0IGZpbGUgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXh0IHN0YXJ0Ci0gICAgICAgIGFkZHJlc3MuICBGb3IgZmlsZXMgKGxpa2Uga2VybmVscykgbGlua2VkIHRvIG5vbi1zdGFuZGFyZAotICAgICAgICBhZGRyZXNzZXMgKGxkIC1UdGV4dCBubm4pIHRoZSBlbnRyeSBwb2ludCBtYXkgbm90IGJlIGJldHdlZW4KLSAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBzdGFydCAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgYW5kCi0gICAgICAgIChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSArIHRleHQgc2l6ZS4gIFRoaXMgaXMgbm90IGp1c3QgYSBtYWNoCi0gICAgICAgIGlzc3VlLiAgTWFueSBrZXJuZWxzIGFyZSBsb2FkZWQgYXQgbm9uIHN0YW5kYXJkIGFkZHJlc3Nlcy4gICovCi0gICAgICBpZiAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTAotCSAgJiYgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgPT0gMAotCSAgJiYgKGZzdGF0KGZpbGVubygoRklMRSAqKSAoYWJmZC0+aW9zdHJlYW0pKSwgJnN0YXRfYnVmKSA9PSAwKQotCSAgJiYgKChzdGF0X2J1Zi5zdF9tb2RlICYgMDExMSkgIT0gMCkpCi0JYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLSNlbmRpZiAvKiBTVEFUX0ZPUl9FWEVDICovCi0KLSAgaWYgKHJlc3VsdCkKLSAgICB7Ci0jaWYgMCAvKiBUaGVzZSBzaG91bGQgYmUgc2V0IGNvcnJlY3RseSBhbnl3YXlzLiAgKi8KLSAgICAgIGFiZmQtPnNlY3Rpb25zID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5uZXh0ID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcmVlIChyYXdwdHIpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gb2xkcmF3cHRyOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X21rb2JqZWN0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBhb3V0X0B2YXJ7c2l6ZX1fbWtvYmplY3QsIChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCUluaXRpYWxpemUgQkZEIEB2YXJ7YWJmZH0gZm9yIHVzZSB3aXRoIGEub3V0IGZpbGVzLgotKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LG1rb2JqZWN0KSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAgKnJhd3B0cjsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCi0gIC8qIFVzZSBhbiBpbnRlcm1lZGlhdGUgdmFyaWFibGUgZm9yIGNsYXJpdHkgKi8KLSAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCApKTsKLQotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJihyYXdwdHItPmUpOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0gIG9ial9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0gIG9ial9ic3NzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fbWFjaGluZV90eXBlCi0KLVNZTk9QU0lTCi0JZW51bSBtYWNoaW5lX3R5cGUgIGFvdXRfQHZhcntzaXplfV9tYWNoaW5lX3R5cGUKLQkgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLURFU0NSSVBUSU9OCi0JS2VlcCB0cmFjayBvZiBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGZvcgotCWEub3V0J3MuIFJldHVybiB0aGUgPDxtYWNoaW5lX3R5cGU+PiBmb3IgYSBwYXJ0aWN1bGFyCi0JYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLCBvciA8PE1fVU5LTk9XTj4+IGlmIHRoYXQgZXhhY3QgYXJjaGl0ZWN0dXJlCi0JYW5kIG1hY2hpbmUgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gYS5vdXQgZm9ybWF0LgotCi0JSWYgdGhlIGFyY2hpdGVjdHVyZSBpcyB1bmRlcnN0b29kLCBtYWNoaW5lIHR5cGUgMCAoZGVmYXVsdCkKLQlpcyBhbHdheXMgdW5kZXJzdG9vZC4KLSovCi0KLWVudW0gbWFjaGluZV90eXBlCi1OQU1FKGFvdXQsbWFjaGluZV90eXBlKSAoYXJjaCwgbWFjaGluZSwgdW5rbm93bikKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLSAgICAgYm9vbGVhbiAqdW5rbm93bjsKLXsKLSAgZW51bSBtYWNoaW5lX3R5cGUgYXJjaF9mbGFnczsKLQotICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICAqdW5rbm93biA9IHRydWU7Ci0KLSAgc3dpdGNoIChhcmNoKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgaWYgKG1hY2hpbmUgPT0gMAotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmMKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZQotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY192OSkKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1NQQVJDOwotICAgIGVsc2UgaWYgKG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpCi0gICAgICBhcmNoX2ZsYWdzID0gTV9TUEFSQ0xFVDsKLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgc3dpdGNoIChtYWNoaW5lKSB7Ci0gICAgY2FzZSAwOgkJICBhcmNoX2ZsYWdzID0gTV82ODAxMDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMDA6IGFyY2hfZmxhZ3MgPSBNX1VOS05PV047ICp1bmtub3duID0gZmFsc2U7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDEwOiBhcmNoX2ZsYWdzID0gTV82ODAxMDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6IGFyY2hfZmxhZ3MgPSBNXzY4MDIwOyBicmVhazsKLSAgICBkZWZhdWx0OgkJICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNXzM4NjsKLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgaWYgKG1hY2hpbmUgPT0gMCkJYXJjaF9mbGFncyA9IE1fMjlLOwotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNX0FSTTsKLSAgICBicmVhazsKLSAgICAKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIHN3aXRjaCAobWFjaGluZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzMDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczM5MDA6Ci0gICAgICBhcmNoX2ZsYWdzID0gTV9NSVBTMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6Ci0gICAgICBhcmNoX2ZsYWdzID0gTV9NSVBTMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDAxMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDQwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2NTA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMxMDAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMxNjoKLSAgICAgIC8qIEZJWE1FOiBUaGVzZSBzaG91bGQgYmUgTUlQUzMgb3IgTUlQUzQuICAqLwotICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX25zMzJrOgotICAgIHN3aXRjaCAobWFjaGluZSkgewotICAgIGNhc2UgMDogICAgCQlhcmNoX2ZsYWdzID0gTV9OUzMyNTMyOyBicmVhazsKLSAgICBjYXNlIDMyMDMyOgkJYXJjaF9mbGFncyA9IE1fTlMzMjAzMjsgYnJlYWs7Ci0gICAgY2FzZSAzMjUzMjoJCWFyY2hfZmxhZ3MgPSBNX05TMzI1MzI7IGJyZWFrOwotICAgIGRlZmF1bHQ6CQlhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgKnVua25vd24gPSBmYWxzZTsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gIH0KLQotICBpZiAoYXJjaF9mbGFncyAhPSBNX1VOS05PV04pCi0gICAgKnVua25vd24gPSBmYWxzZTsKLQotICByZXR1cm4gYXJjaF9mbGFnczsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fc2V0X2FyY2hfbWFjaAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYW91dF9AdmFye3NpemV9X3NldF9hcmNoX21hY2gsCi0JIChiZmQgKiwKLQkgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIHRoZSBtYWNoaW5lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSB0byB0aGUKLQl2YWx1ZXMgQHZhcnthcmNofSBhbmQgQHZhcnttYWNoaW5lfS4gIFZlcmlmeSB0aGF0IEB2YXJ7YWJmZH0ncyBmb3JtYXQKLQljYW4gc3VwcG9ydCB0aGUgYXJjaGl0ZWN0dXJlIHJlcXVpcmVkLgotKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5rbm93bjsKLQotICAgICAgTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkgKGFyY2gsIG1hY2hpbmUsICZ1bmtub3duKTsKLSAgICAgIGlmICh1bmtub3duKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSAqLwotICBzd2l0Y2ggKGFyY2gpIHsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gKCphb3V0X2JhY2tlbmRfaW5mbyhhYmZkKS0+c2V0X3NpemVzKSAoYWJmZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfb19tYWdpYyAoYWJmZCwgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBmaWxlX3B0ciBwb3MgPSBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBiZmRfdm1hIHZtYSA9IDA7Ci0gIGludCBwYWQgPSAwOwotCi0gIC8qIFRleHQuICAqLwotICBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgaWYgKCFvYmpfdGV4dHNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOwotCi0gIHBvcyArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBEYXRhLiAgKi8KLSAgaWYgKCFvYmpfZGF0YXNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSNpZiAwCSAgICAvKiA/PyBEb2VzIGFsaWdubWVudCBpbiB0aGUgZmlsZSBpbWFnZSByZWFsbHkgbWF0dGVyPyAqLwotICAgICAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7Ci0jZW5kaWYKLSAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICAgICAgcG9zICs9IHBhZDsKLSAgICAgIHZtYSArPSBwYWQ7Ci0gICAgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hID0gdm1hOwotICAgIH0KLSAgZWxzZQotICAgIHZtYSA9IG9ial9kYXRhc2VjKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBwb3MgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogQlNTLiAgKi8KLSAgaWYgKCFvYmpfYnNzc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotI2lmIDAKLSAgICAgIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7Ci0jZW5kaWYKLSAgICAgIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICAgICAgcG9zICs9IHBhZDsKLSAgICAgIHZtYSArPSBwYWQ7Ci0gICAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIFZNQSBvZiB0aGUgLmJzcyBzZWN0aW9uIGlzIHNldCBieSB0aGUgdGhlIFZNQSBvZiB0aGUKLSAgICAgICAgIC5kYXRhIHNlY3Rpb24gcGx1cyB0aGUgc2l6ZSBvZiB0aGUgLmRhdGEgc2VjdGlvbi4gIFdlIG1heQotICAgICAgICAgbmVlZCB0byBhZGQgcGFkZGluZyBieXRlcyB0byBtYWtlIHRoaXMgdHJ1ZS4gICovCi0gICAgICBwYWQgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hIC0gdm1hOwotICAgICAgaWYgKHBhZCA+IDApCi0JewotCSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotCSAgcG9zICs9IHBhZDsKLQl9Ci0gICAgfQotICBvYmpfYnNzc2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotCi0gIC8qIEZpeCB1cCB0aGUgZXhlYyBoZWFkZXIuICAqLwotICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgTl9TRVRfTUFHSUMgKCpleGVjcCwgT01BR0lDKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF96X21hZ2ljIChhYmZkLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9wYWQsIHRleHRfcGFkOwotICBmaWxlX3B0ciB0ZXh0X2VuZDsKLSAgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICphYmRwOwotICBpbnQgenRpaDsJCQkvKiBOb256ZXJvIGlmIHRleHQgaW5jbHVkZXMgZXhlYyBoZWFkZXIuICAqLwotICAKLSAgYWJkcCA9IGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKTsKLQotICAvKiBUZXh0LiAgKi8KLSAgenRpaCA9IChhYmRwICE9IE5VTEwKLQkgICYmIChhYmRwLT50ZXh0X2luY2x1ZGVzX2hlYWRlcgotCSAgICAgIHx8IG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gcV9tYWdpY19mb3JtYXQpKTsKLSAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSAoenRpaAotCQkJCT8gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplCi0JCQkJOiBhZGF0YShhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplKTsKLSAgaWYgKCEgb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0gICAgICAvKiA/PyBEbyB3ZSByZWFsbHkgbmVlZCB0byBjaGVjayBmb3IgcmVsb2NzIGhlcmU/ICAqLwotICAgICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSA9ICgoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpCi0JCQkJPyAwCi0JCQkJOiAoenRpaAotCQkJCSAgID8gKGFiZHAtPmRlZmF1bHRfdGV4dF92bWEKLQkJCQkgICAgICArIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSkKLQkJCQkgICA6IGFiZHAtPmRlZmF1bHRfdGV4dF92bWEpKTsKLSAgICAgIHRleHRfcGFkID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgLnRleHQgc2VjdGlvbiBpcyBiZWluZyBsb2FkZWQgYXQgYW4gdW51c3VhbCBhZGRyZXNzLiAgV2UKLSAgICAgICAgIG1heSBuZWVkIHRvIHBhZCBpdCBzdWNoIHRoYXQgdGhlIC5kYXRhIHNlY3Rpb24gc3RhcnRzIGF0IGEgcGFnZQotICAgICAgICAgYm91bmRhcnkuICAqLwotICAgICAgaWYgKHp0aWgpCi0JdGV4dF9wYWQgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyAtIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hKQotCQkgICAgJiAoYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSAtIDEpKTsKLSAgICAgIGVsc2UKLQl0ZXh0X3BhZCA9ICgoLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSkKLQkJICAgICYgKGFkYXRhIChhYmZkKS5wYWdlX3NpemUgLSAxKSk7Ci0gICAgfQotCi0gIC8qIEZpbmQgc3RhcnQgb2YgZGF0YS4gICovCi0gIGlmICh6dGloKQotICAgIHsKLSAgICAgIHRleHRfZW5kID0gb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zICsgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gICAgICB0ZXh0X3BhZCArPSBCRkRfQUxJR04gKHRleHRfZW5kLCBhZGF0YSAoYWJmZCkucGFnZV9zaXplKSAtIHRleHRfZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBpZiBwYWdlX3NpemUgPT0gem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSwgdGhlbgotCSBmaWxlcG9zID09IHBhZ2Vfc2l6ZSwgYW5kIHRoaXMgY2FzZSBpcyB0aGUgc2FtZSBhcyB0aGUgenRpaAotCSBjYXNlLiAgKi8KLSAgICAgIHRleHRfZW5kID0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gICAgICB0ZXh0X3BhZCArPSBCRkRfQUxJR04gKHRleHRfZW5kLCBhZGF0YSAoYWJmZCkucGFnZV9zaXplKSAtIHRleHRfZW5kOwotICAgICAgdGV4dF9lbmQgKz0gb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zOwotICAgIH0KLSAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSB0ZXh0X3BhZDsKLSAgdGV4dF9lbmQgKz0gdGV4dF9wYWQ7Ci0KLSAgLyogRGF0YS4gICovCi0gIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHZtYTsKLSAgICAgIHZtYSA9IG9ial90ZXh0c2VjKGFiZmQpLT52bWEgKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICAgICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUpOwotICAgIH0KLSAgaWYgKGFiZHAgJiYgYWJkcC0+em1hZ2ljX21hcHBlZF9jb250aWd1b3VzKQotICAgIHsKLSAgICAgIHRleHRfcGFkID0gKG9ial9kYXRhc2VjKGFiZmQpLT52bWEKLQkJICAtIG9ial90ZXh0c2VjKGFiZmQpLT52bWEKLQkJICAtIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpOwotICAgICAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSB0ZXh0X3BhZDsKLSAgICB9Ci0gIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gKG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zCi0JCQkJKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSAgCi0gIC8qIEZpeCB1cCBleGVjIGhlYWRlciB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCi0gIGV4ZWNwLT5hX3RleHQgPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBpZiAoenRpaCAmJiAoIWFiZHAgfHwgKGFiZHAgJiYgIWFiZHAtPmV4ZWNfaGVhZGVyX25vdF9jb3VudGVkKSkpCi0gICAgZXhlY3AtPmFfdGV4dCArPSBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IHFfbWFnaWNfZm9ybWF0KQotICAgIE5fU0VUX01BR0lDICgqZXhlY3AsIFFNQUdJQyk7Ci0gIGVsc2UKLSAgICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBaTUFHSUMpOwotCi0gIC8qIFNwZWMgc2F5cyBkYXRhIHNlY3Rpb24gc2hvdWxkIGJlIHJvdW5kZWQgdXAgdG8gcGFnZSBib3VuZGFyeS4gICovCi0gIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUKLSAgICA9IGFsaWduX3Bvd2VyIChvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplLAotCQkgICBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOwotICBleGVjcC0+YV9kYXRhID0gQkZEX0FMSUdOIChvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplLAotCQkJICAgICBhZGF0YShhYmZkKS5wYWdlX3NpemUpOwotICBkYXRhX3BhZCA9IGV4ZWNwLT5hX2RhdGEgLSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSA9IChvYmpfZGF0YXNlYyhhYmZkKS0+dm1hCi0JCQkgICAgICsgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSk7Ci0gIC8qIElmIHRoZSBCU1MgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZGF0YSBzZWN0aW9uIGFuZCBleHRyYSBzcGFjZQotICAgICBpbiB0aGUgcGFnZSBpcyBsZWZ0IGFmdGVyIHRoZSBkYXRhIHNlY3Rpb24sIGZ1ZGdlIGRhdGEKLSAgICAgaW4gdGhlIGhlYWRlciBzbyB0aGF0IHRoZSBic3Mgc2VjdGlvbiBsb29rcyBzbWFsbGVyIGJ5IHRoYXQKLSAgICAgYW1vdW50LiAgV2UnbGwgc3RhcnQgdGhlIGJzcyBzZWN0aW9uIHRoZXJlLCBhbmQgbGllIHRvIHRoZSBPUy4KLSAgICAgKE5vdGUgdGhhdCBhIGxpbmtlciBzY3JpcHQsIGFzIHdlbGwgYXMgdGhlIGFib3ZlIGFzc2lnbm1lbnQsCi0gICAgIGNvdWxkIGhhdmUgZXhwbGljaXRseSBzZXQgdGhlIEJTUyB2bWEgdG8gaW1tZWRpYXRlbHkgZm9sbG93Ci0gICAgIHRoZSBkYXRhIHNlY3Rpb24uKSAgKi8KLSAgaWYgKGFsaWduX3Bvd2VyIChvYmpfYnNzc2VjKGFiZmQpLT52bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikKLSAgICAgID09IG9ial9kYXRhc2VjKGFiZmQpLT52bWEgKyBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplKQotICAgIGV4ZWNwLT5hX2JzcyA9IChkYXRhX3BhZCA+IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSkgPyAwIDoKLSAgICAgIG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSAtIGRhdGFfcGFkOwotICBlbHNlCi0gICAgZXhlY3AtPmFfYnNzID0gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X25fbWFnaWMgKGFiZmQsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgZmlsZV9wdHIgcG9zID0gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBiZmRfdm1hIHZtYSA9IDA7Ci0gIGludCBwYWQ7Ci0gIAotICAvKiBUZXh0LiAgKi8KLSAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIGlmICghb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hID0gdm1hOwotICBlbHNlCi0gICAgdm1hID0gb2JqX3RleHRzZWMoYWJmZCktPnZtYTsKLSAgcG9zICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHZtYSArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIERhdGEuICAqLwotICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgaWYgKCFvYmpfZGF0YXNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplKTsKLSAgdm1hID0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKLSAgCi0gIC8qIFNpbmNlIEJTUyBmb2xsb3dzIGRhdGEgaW1tZWRpYXRlbHksIHNlZSBpZiBpdCBuZWVkcyBhbGlnbm1lbnQuICAqLwotICB2bWEgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSAgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gIHBvcyArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgZWxzZQotICAgIHZtYSA9IG9ial9ic3NzZWMoYWJmZCktPnZtYTsKLQotICAvKiBGaXggdXAgZXhlYyBoZWFkZXIuICAqLwotICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgTl9TRVRfTUFHSUMgKCpleGVjcCwgTk1BR0lDKTsKLX0KLQotYm9vbGVhbgotTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsIHRleHRfc2l6ZSwgdGV4dF9lbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGV4dF9zaXplOwotICAgICBmaWxlX3B0ciAqdGV4dF9lbmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYWRhdGEoYWJmZCkubWFnaWMgIT0gdW5kZWNpZGVkX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgPQotICAgIGFsaWduX3Bvd2VyKG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0gICp0ZXh0X3NpemUgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgLyogUnVsZSAoaGV1cmlzdGljKSBmb3Igd2hlbiB0byBwYWQgdG8gYSBuZXcgcGFnZS4gIE5vdGUgdGhhdCB0aGVyZQotICAgICBhcmUgKGF0IGxlYXN0KSB0d28gd2F5cyBkZW1hbmQtcGFnZWQgKFpNQUdJQykgZmlsZXMgaGF2ZSBiZWVuCi0gICAgIGhhbmRsZWQuICBNb3N0IEJlcmtlbGV5LWJhc2VkIHN5c3RlbXMgc3RhcnQgdGhlIHRleHQgc2VnbWVudCBhdAotICAgICAoVEFSR0VUX1BBR0VfU0laRSkuICBIb3dldmVyLCBuZXdlciB2ZXJzaW9ucyBvZiBTVU5PUyBzdGFydCB0aGUgdGV4dAotICAgICBzZWdtZW50IHJpZ2h0IGFmdGVyIHRoZSBleGVjIGhlYWRlcjsgdGhlIGxhdHRlciBpcyBjb3VudGVkIGluIHRoZQotICAgICB0ZXh0IHNlZ21lbnQgc2l6ZSwgYW5kIGlzIHBhZ2VkIGluIGJ5IHRoZSBrZXJuZWwgd2l0aCB0aGUgcmVzdCBvZgotICAgICB0aGUgdGV4dC4gKi8KLQotICAvKiBUaGlzIHBlcmhhcHMgaXNuJ3QgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzLCBidXQgbWFkZSBpdCBzaW1wbGVyIGZvciBtZQotICAgICB0byB1bmRlcnN0YW5kIGVub3VnaCB0byBpbXBsZW1lbnQgaXQuICBCZXR0ZXIgd291bGQgcHJvYmFibHkgYmUgdG8gZ28KLSAgICAgcmlnaHQgZnJvbSBCRkQgZmxhZ3MgdG8gYWxpZ25tZW50L3Bvc2l0aW9uaW5nIGNoYXJhY3RlcmlzdGljcy4gIEJ1dCB0aGUKLSAgICAgb2xkIGNvZGUgd2FzIHNsb3BweSBlbm91Z2ggYWJvdXQgaGFuZGxpbmcgdGhlIGZsYWdzLCBhbmQgaGFkIGVub3VnaAotICAgICBvdGhlciBtYWdpYywgdGhhdCBpdCB3YXMgYSBsaXR0bGUgaGFyZCBmb3IgbWUgdG8gdW5kZXJzdGFuZC4gIEkgdGhpbmsKLSAgICAgSSB1bmRlcnN0YW5kIGl0IGJldHRlciBub3csIGJ1dCBJIGhhdmVuJ3QgdGltZSB0byBkbyB0aGUgY2xlYW51cCB0aGlzCi0gICAgIG1pbnV0ZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkKLSAgICAvKiBXaGV0aGVyIG9yIG5vdCBXUF9URVhUIGlzIHNldCAtLSBsZXQgRF9QQUdFRCBvdmVycmlkZS4gICovCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSBuX21hZ2ljOwotICBlbHNlCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotCi0jaWZkZWYgQkZEX0FPVVRfREVCVUcgLyogcmVxdWlyZXMgZ2NjMiAqLwotI2lmIF9fR05VQ19fID49IDIKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXMgdGV4dD08JXgsJXgsJXg+IGRhdGE9PCV4LCV4LCV4PiBic3M9PCV4LCV4LCV4PlxuIiwKLQkgICAoeyBjaGFyICpzdHI7Ci0JICAgICAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykgewotCSAgICAgIGNhc2Ugbl9tYWdpYzogc3RyID0gIk5NQUdJQyI7IGJyZWFrOwotCSAgICAgIGNhc2Ugb19tYWdpYzogc3RyID0gIk9NQUdJQyI7IGJyZWFrOwotCSAgICAgIGNhc2Ugel9tYWdpYzogc3RyID0gIlpNQUdJQyI7IGJyZWFrOwotCSAgICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotCSAgICAgIH0KLQkgICAgICBzdHI7Ci0JICAgIH0pLAotCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIsCi0JICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2RhdGFzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlciwKLQkgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEsIG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBvX21hZ2ljOgotICAgICAgYWRqdXN0X29fbWFnaWMgKGFiZmQsIGV4ZWNwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugel9tYWdpYzoKLSAgICAgIGFkanVzdF96X21hZ2ljIChhYmZkLCBleGVjcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG5fbWFnaWM6Ci0gICAgICBhZGp1c3Rfbl9tYWdpYyAoYWJmZCwgZXhlY3ApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotI2lmZGVmIEJGRF9BT1VUX0RFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgICAgICB0ZXh0PTwleCwleCwleD4gZGF0YT08JXgsJXgsJXg+IGJzcz08JXgsJXg+XG4iLAotCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zLAotCSAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEsIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zLAotCSAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fbmV3X3NlY3Rpb25faG9vawotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGFvdXRfQHZhcntzaXplfV9uZXdfc2VjdGlvbl9ob29rLAotCSAgIChiZmQgKmFiZmQsCi0JICAgIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbGVkIGJ5IHRoZSBCRkQgaW4gcmVzcG9uc2UgdG8gYSBAY29kZXtiZmRfbWFrZV9zZWN0aW9ufQotCXJlcXVlc3QuCi0qLwotYm9vbGVhbgotTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICAvKiBhbGlnbiB0byBkb3VibGUgYXQgbGVhc3QgKi8KLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8oYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0KLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gIHsKLSAgICBpZiAob2JqX3RleHRzZWMoYWJmZCkgPT0gTlVMTCAmJiAhc3RyY21wKG5ld3NlY3QtPm5hbWUsICIudGV4dCIpKSB7Ci0Jb2JqX3RleHRzZWMoYWJmZCk9IG5ld3NlY3Q7Ci0JbmV3c2VjdC0+dGFyZ2V0X2luZGV4ID0gTl9URVhUOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgaWYgKG9ial9kYXRhc2VjKGFiZmQpID09IE5VTEwgJiYgIXN0cmNtcChuZXdzZWN0LT5uYW1lLCAiLmRhdGEiKSkgewotCW9ial9kYXRhc2VjKGFiZmQpID0gbmV3c2VjdDsKLQluZXdzZWN0LT50YXJnZXRfaW5kZXggPSBOX0RBVEE7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICBpZiAob2JqX2Jzc3NlYyhhYmZkKSA9PSBOVUxMICYmICFzdHJjbXAobmV3c2VjdC0+bmFtZSwgIi5ic3MiKSkgewotCW9ial9ic3NzZWMoYWJmZCkgPSBuZXdzZWN0OwotCW5ld3NlY3QtPnRhcmdldF9pbmRleCA9IE5fQlNTOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gIH0KLQotICAvKiBXZSBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgc2VjdGlvbnMgaW50ZXJuYWxseSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fY29udGVudHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiAhPSBvYmpfdGV4dHNlYyAoYWJmZCkKLSAgICAgICYmIHNlY3Rpb24gIT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlYWQgdGhlIGV4dGVybmFsIHN5bWJvbHMgZnJvbSBhbiBhLm91dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotCi0gICAgICBjb3VudCA9IGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zIC8gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBpZiAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwKLQkJCSAgICAgICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywKLQkJCSAgICAgICAmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCksIHRydWUpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bXMgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIG9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpLmRhdGE7Ci0jZWxzZQotICAgICAgLyogV2UgYWxsb2NhdGUgdXNpbmcgbWFsbG9jIHRvIG1ha2UgdGhlIHZhbHVlcyBlYXN5IHRvIGZyZWUKLQkgbGF0ZXIgb24uICBJZiB3ZSBwdXQgdGhlbSBvbiB0aGUgb2JqYWxsb2MgaXQgbWlnaHQgbm90IGJlCi0JIHBvc3NpYmxlIHRvIGZyZWUgdGhlbS4gICovCi0gICAgICBzeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkgICAgICBiZmRfbWFsbG9jICgoc2l6ZV90KSBjb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKTsKLSAgICAgIGlmIChzeW1zID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCAmJiBjb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzeW1zLCAxLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywgYWJmZCkKLQkgICAgICAhPSBleGVjX2hkciAoYWJmZCktPmFfc3ltcykpCi0JewotCSAgZnJlZSAoc3ltcyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotI2VuZGlmCi0KLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPSBjb3VudDsKLSAgICB9Ci0gICAgICAKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID09IE5VTEwKLSAgICAgICYmIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBzdHJpbmdfY2hhcnNbQllURVNfSU5fV09SRF07Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cmluZ3NpemU7Ci0gICAgICBjaGFyICpzdHJpbmdzOwotCi0gICAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBzdHJpbmdfY2hhcnMsIEJZVEVTX0lOX1dPUkQsIDEsIGFiZmQpCi0JICAgICAgIT0gQllURVNfSU5fV09SRCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyaW5nc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBzdHJpbmdfY2hhcnMpOwotCi0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGlmIChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBzdHJpbmdzaXplLAotCQkJICAgICAgICZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSwgdHJ1ZSkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyaW5ncyA9IChjaGFyICopIG9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpLmRhdGE7Ci0jZWxzZQotICAgICAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN0cmluZ3NpemUgKyAxKTsKLSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTa2lwIHNwYWNlIGZvciB0aGUgc3RyaW5nIGNvdW50IGluIHRoZSBidWZmZXIgZm9yIGNvbnZlbmllbmNlCi0JIHdoZW4gdXNpbmcgaW5kZXhlcy4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKHN0cmluZ3MgKyBCWVRFU19JTl9XT1JELCAxLCBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCwKLQkJICAgIGFiZmQpCi0JICAhPSBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCkKLQl7Ci0JICBmcmVlIChzdHJpbmdzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogRW5zdXJlIHRoYXQgYSB6ZXJvIGluZGV4IHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcuICAqLwotICAgICAgc3RyaW5nc1swXSA9ICdcMCc7Ci0KLSAgICAgIHN0cmluZ3Nbc3RyaW5nc2l6ZSAtIDFdID0gMDsKLQotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBzdHJpbmdzOwotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUgKGFiZmQpID0gc3RyaW5nc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBhLm91dCBzeW1ib2wgaW50byBhIEJGRCBzeW1ib2wuICBUaGUgZGVzYywgb3RoZXIsIHR5cGUKLSAgIGFuZCBzeW1ib2wtPnZhbHVlIGZpZWxkcyBvZiBDQUNIRV9QVFIgd2lsbCBiZSBzZXQgZnJvbSB0aGUgYS5vdXQKLSAgIG5saXN0IHN0cnVjdHVyZS4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKLSAgIHN5bWJvbC0+ZmxhZ3MgYW5kIHN5bWJvbC0+c2VjdGlvbiwgYW5kIGFkanVzdGluZyBzeW1ib2wtPnZhbHVlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZV9wdHI7Ci17Ci0gIGZsYWd3b3JkIHZpc2libGU7Ci0KLSAgaWYgKChjYWNoZV9wdHItPnR5cGUgJiBOX1NUQUIpICE9IDAKLSAgICAgIHx8IGNhY2hlX3B0ci0+dHlwZSA9PSBOX0ZOKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLQotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0gICAgICAvKiBXb3JrIG91dCB0aGUgc3ltYm9sIHNlY3Rpb24uICAqLwotICAgICAgc3dpdGNoIChjYWNoZV9wdHItPnR5cGUgJiBOX1RZUEUpCi0JewotCWNhc2UgTl9URVhUOgotCWNhc2UgTl9GTjoKLQkgIHNlYyA9IG9ial90ZXh0c2VjIChhYmZkKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9EQVRBOgotCSAgc2VjID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0JTUzoKLQkgIHNlYyA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIE5fQUJTOgotCSAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IHNlYzsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IHNlYy0+dm1hOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBkZWZhdWx0IHZpc2liaWxpdHkuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFsbCB0eXBlcywgc28KLSAgICAgd2UganVzdCBob2xkIGl0IGluIGEgbG9jYWwgdmFyaWFibGUgdG8gdXNlIGlmIHdhbnRlZC4gICovCi0gIGlmICgoY2FjaGVfcHRyLT50eXBlICYgTl9FWFQpID09IDApCi0gICAgdmlzaWJsZSA9IEJTRl9MT0NBTDsKLSAgZWxzZQotICAgIHZpc2libGUgPSBCU0ZfR0xPQkFMOwotCi0gIHN3aXRjaCAoY2FjaGVfcHRyLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgTl9BQlM6IGNhc2UgTl9BQlMgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgICAgaWYgKGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlICE9IDApCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gMDsKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1RFWFQ6IGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE5fU0VUViBzeW1ib2xzIHVzZWQgdG8gcmVwcmVzZW50IHNldCB2ZWN0b3JzIHBsYWNlZCBpbiB0aGUKLQkgZGF0YSBzZWN0aW9uLiAgVGhleSBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZC4gIFRoZW9yZXRpY2FsbHksCi0JIGl0IHdhcyBwb3NzaWJsZSB0byBleHRyYWN0IHRoZSBlbnRyaWVzIGFuZCBjb21iaW5lIHRoZW0gd2l0aAotCSBuZXcgb25lcywgYWx0aG91Z2ggSSBkb24ndCBrbm93IGlmIHRoYXQgd2FzIGV2ZXIgYWN0dWFsbHkKLQkgZG9uZS4gIFVubGVzcyB0aGF0IGZlYXR1cmUgaXMgcmVzdG9yZWQsIHRyZWF0IHRoZW0gYXMgZGF0YQotCSBzeW1ib2xzLiAgKi8KLSAgICBjYXNlIE5fU0VUVjogY2FzZSBOX1NFVFYgfCBOX0VYVDoKLSAgICBjYXNlIE5fREFUQTogY2FzZSBOX0RBVEEgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9CU1M6IGNhc2UgTl9CU1MgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gdmlzaWJsZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NFVEE6IGNhc2UgTl9TRVRBIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVFQ6IGNhc2UgTl9TRVRUIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVEQ6IGNhc2UgTl9TRVREIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6Ci0gICAgICB7Ci0JLyogVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCB1c2VkIHRvIGJlIHVzZWQgdG8gbWFrZQotICAgICAgICAgICB0aGUgbGlua2VyIGhhbmRsZSBzZXQgc3ltYm9scywgYnV0IHRoZXkgYXJlIG5vdyBoYW5kbGVkIGluCi0gICAgICAgICAgIHRoZSBhZGRfc3ltYm9scyByb3V0aW5lIGluc3RlYWQuICAqLwotI2lmIDAKLQlhc2VjdGlvbiAqc2VjdGlvbjsKLQlhcmVsZW50X2NoYWluICpyZWxvYzsKLQlhc2VjdGlvbiAqaW50b19zZWN0aW9uOwotCi0JLyogVGhpcyBpcyBhIHNldCBzeW1ib2wuICBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIHRoZSBuYW1lCi0JICAgb2YgdGhlIHNldCAoZS5nLiwgX19DVE9SX0xJU1RfXykuICBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbAotCSAgIGlzIHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNldC4gIFdlIGNyZWF0ZSBhIHNlY3Rpb24gd2l0aAotCSAgIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN5bWJvbCwgYW5kIGFkZCBhIHJlbG9jIHRvIGluc2VydCB0aGUKLQkgICBhcHByb3ByaWF0ZSB2YWx1ZSBpbnRvIHRoZSBzZWN0aW9uLgotCi0JICAgVGhpcyBhY3Rpb24gaXMgYWN0dWFsbHkgb2Jzb2xldGU7IGl0IHVzZWQgdG8gbWFrZSB0aGUKLQkgICBsaW5rZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLCBidXQgdGhlIGxpbmtlciBubyBsb25nZXIgdXNlcwotCSAgIHRoaXMgZnVuY3Rpb24uICAqLwotCi0Jc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKLQlpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgewotCSAgICBjaGFyICpjb3B5OwotCi0JICAgIGNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoY2FjaGVfcHRyLT5zeW1ib2wubmFtZSkgKyAxKTsKLQkgICAgaWYgKGNvcHkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgc3RyY3B5IChjb3B5LCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKLQkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGNvcHkpOwotCSAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCXJlbG9jID0gKGFyZWxlbnRfY2hhaW4gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnRfY2hhaW4pKTsKLQlpZiAocmVsb2MgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIEJ1aWxkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgdGhlIGNvbnN0cnVjdG9yLiAgKi8KLQlzd2l0Y2ggKGNhY2hlX3B0ci0+dHlwZSAmIE5fVFlQRSkKLQkgIHsKLQkgIGNhc2UgTl9TRVRBOgotCSAgICBpbnRvX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0FCUzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0VUVDoKLQkgICAgaW50b19zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX1RFWFQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEQ6Ci0JICAgIGludG9fc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9EQVRBOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRCOgotCSAgICBpbnRvX3NlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9CU1M7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIHBvaW50aW5nIGludG8gdGhlIGNvbnN0cnVjdG9yIHNlY3Rpb24KLQkgICBwb2ludGluZyBhdCB0aGUgc3ltYm9sIGluIHRoZSBzZXQgdmVjdG9yIHNwZWNpZmllZC4gICovCi0JcmVsb2MtPnJlbGVudC5hZGRlbmQgPSBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZTsKLQljYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gaW50b19zZWN0aW9uOwotCXJlbG9jLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBpbnRvX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCi0JLyogV2UgbW9kaWZ5IHRoZSBzeW1ib2wgdG8gYmVsb25nIHRvIGEgc2VjdGlvbiBkZXBlbmRpbmcgdXBvbgotCSAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGFuZCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24KLQkgICB0byBjb250YWluIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sLiBCdWlsZCBhIHJlbG9jIGVudHJ5IHRvCi0JICAgcmVsb2NhdGUgdG8gdGhpcyBzeW1ib2wgYXR0YWNoZWQgdG8gdGhpcyBzZWN0aW9uLiAgKi8KLQlzZWN0aW9uLT5mbGFncyA9IFNFQ19DT05TVFJVQ1RPUiB8IFNFQ19SRUxPQzsKLQotCXNlY3Rpb24tPnJlbG9jX2NvdW50Kys7Ci0Jc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotCXJlbG9jLT5uZXh0ID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0Jc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW4gPSByZWxvYzsKLQlyZWxvYy0+cmVsZW50LmFkZHJlc3MgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0Jc2VjdGlvbi0+X3Jhd19zaXplICs9IEJZVEVTX0lOX1dPUkQ7Ci0KLQlyZWxvYy0+cmVsZW50Lmhvd3RvID0gQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhhYmZkKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotCXN3aXRjaCAoY2FjaGVfcHRyLT50eXBlICYgTl9UWVBFKQotCSAgewotCSAgY2FzZSBOX1NFVEE6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRUOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVREOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRCOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0FSTklORzoKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIHRoZSB0ZXh0IG9mIGEgd2FybmluZyBtZXNzYWdlLiAgVGhlIG5leHQKLQkgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdG8gYXNzb2NpYXRlIHRoZSB3YXJuaW5nIHdpdGguICBJZiBhCi0JIHJlZmVyZW5jZSBpcyBtYWRlIHRvIHRoYXQgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiAgKi8KLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORyB8IEJTRl9XQVJOSU5HOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9JTkRSOiBjYXNlIE5fSU5EUiB8IE5fRVhUOgotICAgICAgLyogQW4gaW5kaXJlY3Qgc3ltYm9sLiAgVGhpcyBjb25zaXN0cyBvZiB0d28gc3ltYm9scyBpbiBhIHJvdy4KLQkgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgaW5kaXJlY3Rpb24uICBUaGUgc2Vjb25kCi0JIHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LiAgQSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0Ci0JIHN5bWJvbCBiZWNvbWVzIGEgcmVmZXJlbmNlIHRvIHRoZSBzZWNvbmQuICAqLwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HIHwgQlNGX0lORElSRUNUIHwgdmlzaWJsZTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS1U6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLQToKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1dFQUtUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLRDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS0I6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGZpZWxkcyBvZiBTWU1fUE9JTlRFUiBhY2NvcmRpbmcgdG8gQ0FDSEVfUFRSLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBjYWNoZV9wdHIsIHN5bV9wb2ludGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fcG9pbnRlcjsKLXsKLSAgYmZkX3ZtYSB2YWx1ZSA9IGNhY2hlX3B0ci0+dmFsdWU7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgb2ZmOwotCi0gIC8qIE1hc2sgb3V0IGFueSBleGlzdGluZyB0eXBlIGJpdHMgaW4gY2FzZSBjb3B5aW5nIGZyb20gb25lIHNlY3Rpb24KLSAgICAgdG8gYW5vdGhlci4gICovCi0gIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJj0gfk5fVFlQRTsKLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKGNhY2hlX3B0cik7Ci0gIG9mZiA9IDA7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBvY2N1cnMsIGUuZy4sIGZvciB0aGUgKkRFQlVHKiBzZWN0aW9uIG9mIGEgQ09GRgotCSBmaWxlLiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBmb3Igc3ltYm9sIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAKLQkgY2FjaGVfcHRyLT5uYW1lICE9IE5VTEwgPyBjYWNoZV9wdHItPm5hbWUgOiBfKCIqdW5rbm93bioiKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBvZmYgPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9BQlM7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX1RFWFQ7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0RBVEE7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fQlNTOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fVU5ERiB8IE5fRVhUOwotICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fSU5EUjsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSBOX1VOREYgfCBOX0VYVDsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFR1cm4gdGhlIHN5bWJvbCBmcm9tIHNlY3Rpb24gcmVsYXRpdmUgdG8gYWJzb2x1dGUgYWdhaW4gKi8KLSAgdmFsdWUgKz0gc2VjLT52bWEgKyBvZmY7Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fV0FSTklORzsKLQotICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikgY2FjaGVfcHRyKS0+dHlwZTsKLSAgZWxzZSBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9FWFQ7Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIGludCB0eXBlID0gKChhb3V0X3N5bWJvbF90eXBlICopIGNhY2hlX3B0ciktPnR5cGU7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgTl9BQlM6CXR5cGUgPSBOX1NFVEE7IGJyZWFrOwotCWNhc2UgTl9URVhUOgl0eXBlID0gTl9TRVRUOyBicmVhazsKLQljYXNlIE5fREFUQToJdHlwZSA9IE5fU0VURDsgYnJlYWs7Ci0JY2FzZSBOX0JTUzoJdHlwZSA9IE5fU0VUQjsgYnJlYWs7Ci0JfQotICAgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IHR5cGU7Ci0gICAgfQotCi0gIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICBzd2l0Y2ggKHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJiBOX1RZUEUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBOX0FCUzoJdHlwZSA9IE5fV0VBS0E7IGJyZWFrOwotCWNhc2UgTl9URVhUOgl0eXBlID0gTl9XRUFLVDsgYnJlYWs7Ci0JY2FzZSBOX0RBVEE6CXR5cGUgPSBOX1dFQUtEOyBicmVhazsKLQljYXNlIE5fQlNTOgl0eXBlID0gTl9XRUFLQjsgYnJlYWs7Ci0JY2FzZSBOX1VOREY6CXR5cGUgPSBOX1dFQUtVOyBicmVhazsKLQl9Ci0gICAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gdHlwZTsKLSAgICB9Ci0KLSAgUFVUX1dPUkQoYWJmZCwgdmFsdWUsIHN5bV9wb2ludGVyLT5lX3ZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIE5hdGl2ZS1sZXZlbCBpbnRlcmZhY2UgdG8gc3ltYm9scy4gKi8KLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFvdXRfc3ltYm9sX3R5cGUgICpuZXcgPQotICAgIChhb3V0X3N5bWJvbF90eXBlICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBUcmFuc2xhdGUgYSBzZXQgb2YgaW50ZXJuYWwgc3ltYm9scyBpbnRvIGV4dGVybmFsIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgKGFiZmQsIGluLCBleHQsIGNvdW50LCBzdHIsIHN0cnNpemUsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYW91dF9zeW1ib2xfdHlwZSAqaW47Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBjaGFyICpzdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3Ryc2l6ZTsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmV4dF9lbmQ7Ci0KLSAgZXh0X2VuZCA9IGV4dCArIGNvdW50OwotICBmb3IgKDsgZXh0IDwgZXh0X2VuZDsgZXh0KyssIGluKyspCi0gICAgewotICAgICAgYmZkX3ZtYSB4OwotCi0gICAgICB4ID0gR0VUX1dPUkQgKGFiZmQsIGV4dC0+ZV9zdHJ4KTsKLSAgICAgIGluLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLSAgICAgIC8qIEZvciB0aGUgbm9ybWFsIHN5bWJvbHMsIHRoZSB6ZXJvIGluZGV4IHBvaW50cyBhdCB0aGUgbnVtYmVyCi0JIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcgdGFibGUgYnV0IGlzIHRvIGJlIGludGVycHJldGVkIGFzIHRoZQotCSBudWxsIHN0cmluZy4gIEZvciB0aGUgZHluYW1pYyBzeW1ib2xzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCi0JIHRoZSBzdHJpbmcgdGFibGUgaXMgc3RvcmVkIGluIHRoZSBfX0RZTkFNSUMgc3RydWN0dXJlIGFuZCB0aGUKLQkgemVybyBpbmRleCBwb2ludHMgYXQgYW4gYWN0dWFsIHN0cmluZy4gICovCi0gICAgICBpZiAoeCA9PSAwICYmICEgZHluYW1pYykKLQlpbi0+c3ltYm9sLm5hbWUgPSAiIjsKLSAgICAgIGVsc2UgaWYgKHggPCBzdHJzaXplKQotCWluLT5zeW1ib2wubmFtZSA9IHN0ciArIHg7Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpbi0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCAgZXh0LT5lX3ZhbHVlKTsKLSAgICAgIGluLT5kZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPmVfZGVzYyk7Ci0gICAgICBpbi0+b3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXh0LT5lX290aGVyKTsKLSAgICAgIGluLT50eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsICBleHQtPmVfdHlwZSk7Ci0gICAgICBpbi0+c3ltYm9sLnVkYXRhLnAgPSBOVUxMOwotCi0gICAgICBpZiAoISB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBpbikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoZHluYW1pYykKLQlpbi0+c3ltYm9sLmZsYWdzIHw9IEJTRl9EWU5BTUlDOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgcmVhZCB0aGUgc3ltYm9scyBpbnRvIGEgYnVmZmVyLCB3aGljaCBpcyBkaXNjYXJkZWQgd2hlbiB0aGlzCi0gICBmdW5jdGlvbiBleGl0cy4gIFdlIHJlYWQgdGhlIHN0cmluZ3MgaW50byBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8KLSAgIGhvbGQgdGhlbSBhbGwgcGx1cyBhbGwgdGhlIGNhY2hlZCBzeW1ib2wgZW50cmllcy4gKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvbGRfZXh0ZXJuYWxfc3ltczsKLSAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOwotICBzaXplX3QgY2FjaGVkX3NpemU7Ci0KLSAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLwotICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBvbGRfZXh0ZXJuYWxfc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjYWNoZWRfc2l6ZSA9IChvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpCi0JCSAqIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpOwotICBjYWNoZWQgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBiZmRfbWFsbG9jIChjYWNoZWRfc2l6ZSk7Ci0gIGlmIChjYWNoZWQgPT0gTlVMTCAmJiBjYWNoZWRfc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGNhY2hlZF9zaXplICE9IDApCi0gICAgbWVtc2V0IChjYWNoZWQsIDAsIGNhY2hlZF9zaXplKTsKLQotICAvKiBDb252ZXJ0IGZyb20gZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHRvIGludGVybmFsLiAgKi8KLSAgaWYgKCEgKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKQotCSAoYWJmZCwgY2FjaGVkLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCksCi0JICBmYWxzZSkpKQotICAgIHsKLSAgICAgIGZyZWUgKGNhY2hlZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IGNhY2hlZDsKLQotICAvKiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFueWJvZHkgd2hvIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgICAgd2FudCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLCBzbyBpZiBpdCB3YXMgYWxsb2NhdGVkCi0gICAgIGJlY2F1c2Ugb2Ygb3VyIGNhbGwgdG8gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scywgd2UgZnJlZSBpdCB1cAotICAgICByaWdodCBhd2F5IHRvIHNhdmUgc3BhY2UuICAqLwotICBpZiAob2xkX2V4dGVybmFsX3N5bXMgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMCi0gICAgICAmJiBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IHN5bWJvbHMgc28gdGhhdCB3ZSBvbmx5IHdyaXRlCi0gICBvdXQgYSBwYXJ0aWN1bGFyIHN0cmluZyBvbmNlLiAgVGhpcyBoZWxwcyBwYXJ0aWN1bGFybHkgd2hlbiB0aGUKLSAgIGxpbmtlciB3cml0ZXMgb3V0IHN0YWJzIGRlYnVnZ2luZyBlbnRyaWVzLCBiZWNhdXNlIGVhY2ggZGlmZmVyZW50Ci0gICBjb250cmlidXRpbmcgb2JqZWN0IGZpbGUgdGVuZHMgdG8gaGF2ZSBtYW55IGR1cGxpY2F0ZSBzdGFicwotICAgc3RyaW5ncy4KLQotICAgVGhpcyBoYXNoIHRhYmxlIGNvZGUgYnJlYWtzIGRieCBvbiBTdW5PUyA0LjEuMywgc28gd2UgZG9uJ3QgZG8gaXQKLSAgIGlmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUgYWRkX3RvX3N0cmluZ3RhYgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGVtaXRfc3RyaW5ndGFiIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBpbmRleCBvZiBhIHN0cmluZyBpbiBhIHN0cnRhYiwgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdAotICAgYWxyZWFkeSBwcmVzZW50LiAgKi8KLQotc3RhdGljIElOTElORSBiZmRfc2l6ZV90eXBlCi1hZGRfdG9fc3RyaW5ndGFiIChhYmZkLCB0YWIsIHN0ciwgY29weSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgYm9vbGVhbiBjb3B5OwotewotICBib29sZWFuIGhhc2g7Ci0gIGJmZF9zaXplX3R5cGUgaW5kZXg7Ci0KLSAgLyogQW4gaW5kZXggb2YgMCBhbHdheXMgbWVhbnMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gIGlmIChzdHIgPT0gMCB8fCAqc3RyID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRG9uJ3QgaGFzaCBpZiBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgYmVjYXVzZSBTdW5PUyBkYngKLSAgICAgZG9lc24ndCB1bmRlcnN0YW5kIGEgaGFzaGVkIHN0cmluZyB0YWJsZS4gICovCi0gIGhhc2ggPSB0cnVlOwotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICBoYXNoID0gZmFsc2U7Ci0KLSAgaW5kZXggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHRhYiwgc3RyLCBoYXNoLCBjb3B5KTsKLQotICBpZiAoaW5kZXggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotICAgIHsKLSAgICAgIC8qIEFkZCBCWVRFU19JTl9XT1JEIHRvIHRoZSByZXR1cm4gdmFsdWUgdG8gYWNjb3VudCBmb3IgdGhlCi0JIHNwYWNlIHRha2VuIHVwIGJ5IHRoZSBzdHJpbmcgdGFibGUgc2l6ZS4gICovCi0gICAgICBpbmRleCArPSBCWVRFU19JTl9XT1JEOwotICAgIH0KLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cnRhYi4gIEFCRkQgaXMgYWxyZWFkeSBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlCi0gICBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVtaXRfc3RyaW5ndGFiIChhYmZkLCB0YWIpCi0gICAgIHJlZ2lzdGVyIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotewotICBiZmRfYnl0ZSBidWZmZXJbQllURVNfSU5fV09SRF07Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBzdGFydHMgd2l0aCB0aGUgc2l6ZS4gICovCi0gIFBVVF9XT1JEIChhYmZkLCBfYmZkX3N0cmluZ3RhYl9zaXplICh0YWIpICsgQllURVNfSU5fV09SRCwgYnVmZmVyKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBCWVRFU19JTl9XT1JELCBhYmZkKSAhPSBCWVRFU19JTl9XT1JEKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgdGFiKTsKLX0KLQwKLWJvb2xlYW4KLU5BTUUoYW91dCx3cml0ZV9zeW1zKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgY291bnQgOwotICBhc3ltYm9sICoqZ2VuZXJpYyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLQotICBzdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoc3RydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOyBjb3VudCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKmcgPSBnZW5lcmljW2NvdW50XTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBuc3A7Ci0KLSAgICAgIGluZHggPSBhZGRfdG9fc3RyaW5ndGFiIChhYmZkLCBzdHJ0YWIsIGctPm5hbWUsIGZhbHNlKTsKLSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIFBVVF9XT1JEIChhYmZkLCBpbmR4LCAoYmZkX2J5dGUgKikgbnNwLmVfc3RyeCk7Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyKGcpID09IGFiZmQtPnh2ZWMtPmZsYXZvdXIpCi0JewotCSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT5kZXNjLCAgbnNwLmVfZGVzYyk7Ci0JICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+b3RoZXIsICBuc3AuZV9vdGhlcik7Ci0JICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+dHlwZSwgIG5zcC5lX3R5cGUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfaF9wdXRfMTYoYWJmZCwwLCBuc3AuZV9kZXNjKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX290aGVyKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX3R5cGUpOwotCX0KLQotICAgICAgaWYgKCEgdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGcsICZuc3ApKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3dyaXRlKChQVFIpJm5zcCwxLEVYVEVSTkFMX05MSVNUX1NJWkUsIGFiZmQpCi0JICAhPSBFWFRFUk5BTF9OTElTVF9TSVpFKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBOQjogYEtFRVBJVCcgY3VycmVudGx5IG92ZXJsYXlzIGB1ZGF0YS5wJywgc28gc2V0IHRoaXMgb25seQotCSBoZXJlLCBhdCB0aGUgZW5kLiAgKi8KLSAgICAgIGctPktFRVBJVCA9IGNvdW50OwotICAgIH0KLQotICBpZiAoISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgc3RydGFiKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzdHJ0YWIpOwotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotDAotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgZm9yIChzeW1iYXNlID0gb2JqX2FvdXRfc3ltYm9scyhhYmZkKTsgY291bnRlcisrIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7KQotICAgICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopKCBzeW1iYXNlKyspOwotICAgICpsb2NhdGlvbisrID0wOwotICAgIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotDAotLyogU3RhbmRhcmQgcmVsb2Mgc3R1ZmYgKi8KLS8qIE91dHB1dCBzdGFuZGFyZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotZXh0ZXJuIHZvaWQgIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgLyogWFhYIFRoaXMgcmVsaWVzIG9uIHJlbG9jcyBjb21pbmcgZnJvbSBhLm91dCBmaWxlcy4gICovCi0gIHJfYmFzZXJlbCA9IChnLT5ob3d0by0+dHlwZSAmIDgpICE9IDA7Ci0gIHJfam1wdGFibGUgPSAoZy0+aG93dG8tPnR5cGUgJiAxNikgIT0gMDsKLSAgcl9yZWxhdGl2ZSA9IChnLT5ob3d0by0+dHlwZSAmIDMyKSAhPSAwOwotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0gICAgICB7Ci0JLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0Jcl9pbmRleCA9IE5fQUJTOwotCXJfZXh0ZXJuID0gMDsKLSAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JLyogRmlsbCBpbiBzeW1ib2wgKi8KLQlyX2V4dGVybiA9IDE7Ci0Jcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLQotICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0gICAgICAgKHJfZXh0ZXJuPyAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCXwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUc6IDApCi0JIHwgKHJfYmFzZXJlbD8gICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRzogMCkKLQkgIHwgKHJfam1wdGFibGU/ICBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUc6IDApCi0JICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRzogMCkKLQkgICAgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0gZWxzZSB7Ci0JbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQluYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLQluYXRwdHItPnJfdHlwZVswXSA9Ci0JIChyX2V4dGVybj8gICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLQkgIHwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JICAgfCAocl9iYXNlcmVsPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFOiAwKQotCSAgICB8IChyX2ptcHRhYmxlPyAgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFOiAwKQotCSAgICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRTogMCkKLQkgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgICB9Ci19Ci0KLQotLyogRXh0ZW5kZWQgc3R1ZmYgKi8KLS8qIE91dHB1dCBleHRlbmRlZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotZXh0ZXJuIHZvaWQgTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQ7Ci0gIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICByX2FkZGVuZCArPSAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCi0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gTl9BQlM7Ci0gICAgfQotICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCi0Jcl9leHRlcm4gPSAxOwotICAgICAgZWxzZQotCXJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLSAgICAgICgocl9leHRlcm4/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUc6IDApCi0gICAgICAgfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0gICAgIChyX2V4dGVybj8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLSAgICAgIHwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0gIH0KLQotICBQVVRfV09SRCAoYWJmZCwgcl9hZGRlbmQsIG5hdHB0ci0+cl9hZGRlbmQpOwotfQotCi0vKiBCRkQgZGVhbHMgaW50ZXJuYWxseSB3aXRoIGFsbCB0aGluZ3MgYmFzZWQgZnJvbSB0aGUgc2VjdGlvbiB0aGV5J3JlCi0gICBpbi4gc28sIHNvbWV0aGluZyBpbiAxMCBieXRlcyBpbnRvIGEgdGV4dCBzZWN0aW9uICB3aXRoIGEgYmFzZSBvZgotICAgNTAgd291bGQgaGF2ZSBhIHN5bWJvbCAoLnRleHQrMTApIGFuZCBrbm93IC50ZXh0IHZtYSB3YXMgNTAuCi0KLSAgIEFvdXQga2VlcHMgYWxsIGl0J3Mgc3ltYm9scyBiYXNlZCBmcm9tIHplcm8sIHNvIHRoZSBzeW1ib2wgd291bGQKLSAgIGNvbnRhaW4gNjAuIFRoaXMgbWFjcm8gc3VicyB0aGUgYmFzZSBvZiBlYWNoIHNlY3Rpb24gZnJvbSB0aGUgdmFsdWUKLSAgIHRvIGdpdmUgdGhlIHRydWUgb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24gKi8KLQotCi0jZGVmaW5lIE1PVkVfQUREUkVTUyhhZCkgICAgICAgCQkJCQkJXAotICBpZiAocl9leHRlcm4pIHsJCQkJCQkJXAotICAgLyogdW5kZWZpbmVkIHN5bWJvbCAqLwkJCQkJCVwKLSAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyByX2luZGV4OwkJCVwKLSAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgIH0gZWxzZSB7CQkJCQkJCQlcCi0gICAgLyogZGVmaW5lZCwgc2VjdGlvbiByZWxhdGl2ZS4gcmVwbGFjZSBzeW1ib2wgd2l0aCBwb2ludGVyIHRvICAgIAlcCi0gICAgICAgc3ltYm9sIHdoaWNoIHBvaW50cyB0byBzZWN0aW9uICAqLwkJCQlcCi0gICAgc3dpdGNoIChyX2luZGV4KSB7CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVDoJCQkJCQkJXAotICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfdGV4dHNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgIC0gc3UtPnRleHRzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQToJCQkJCQkJXAotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfZGF0YXNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+ZGF0YXNlYy0+dm1hOwkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1M6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0JTUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmJzc3NlYy0+dm1hOwkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBkZWZhdWx0OgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlM6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0FCUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB9ICAgICAJCQkJCQkJCVwKLQotdm9pZAotTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gKEdFVF9TV09SRCAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcykpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMF0gPDwgMTYpCi0JICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMl07Ci0gICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCi0JCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMl0gPDwgMTYpCi0JICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMF07Ci0gICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCi0JCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEU7Ci0gIH0KLQotICBjYWNoZV9wdHItPmhvd3RvID0gIGhvd3RvX3RhYmxlX2V4dCArIHJfdHlwZTsKLQotICAvKiBCYXNlIHJlbGF0aXZlIHJlbG9jcyBhcmUgYWx3YXlzIGFnYWluc3QgdGhlIHN5bWJvbCB0YWJsZSwKLSAgICAgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4gIHJfZXh0ZXJuIGp1c3QgcmVmbGVjdHMKLSAgICAgd2hldGhlciB0aGUgc3ltYm9sIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGlzIGxvY2FsIG9yIGdsb2JhbC4gICovCi0gIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0gICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0gICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotICAgIHJfZXh0ZXJuID0gMTsKLQotICBpZiAocl9leHRlcm4gJiYgcl9pbmRleCA+IHN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGFycmFuZ2UgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgbWlnaHQgYmUgdXNlZnVsCi0gICAgICAgICB0byBzZWUgdGhlIGZpbGUgZXZlbiBpZiBpdCBpcyBiYWQuICAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IE5fQUJTOwotICAgIH0KLQotICBNT1ZFX0FERFJFU1MoR0VUX1NXT1JEKGFiZmQsIGJ5dGVzLT5yX2FkZGVuZCkpOwotfQotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKLSAgc3RydWN0IGFvdXRkYXRhICAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0gIHVuc2lnbmVkIGludCBob3d0b19pZHg7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIHJfaW5kZXggPSAgKGJ5dGVzLT5yX2luZGV4WzBdIDw8IDE2KQotICAgICAgfCAoYnl0ZXMtPnJfaW5kZXhbMV0gPDwgOCkKLQl8ICBieXRlcy0+cl9pbmRleFsyXTsKLSAgICByX2V4dGVybiAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICByX3BjcmVsICAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLSAgICByX2ptcHRhYmxlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotICAgIHJfcmVsYXRpdmU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHKSk7Ci0gICAgcl9sZW5ndGggID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQotICAgICAgCQkJPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFsyXSA8PCAxNikKLSAgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCi0JfCAgYnl0ZXMtPnJfaW5kZXhbMF07Ci0gICAgcl9leHRlcm4gID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgcl9wY3JlbCAgID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICByX2Jhc2VyZWwgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7Ci0gICAgcl9qbXB0YWJsZT0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKLSAgICByX3JlbGF0aXZlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSkpOwotICAgIHJfbGVuZ3RoICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLSAgICAgIAkJCT4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEU7Ci0gIH0KLQotICBob3d0b19pZHggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsICsgOCAqIHJfYmFzZXJlbAotCSAgICAgICsgMTYgKiByX2ptcHRhYmxlICsgMzIgKiByX3JlbGF0aXZlOwotICBCRkRfQVNTRVJUIChob3d0b19pZHggPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9zdGQpKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICBob3d0b190YWJsZV9zdGQgKyBob3d0b19pZHg7Ci0gIEJGRF9BU1NFUlQgKGNhY2hlX3B0ci0+aG93dG8tPnR5cGUgIT0gKHVuc2lnbmVkIGludCkgLTEpOwotCi0gIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgc3ltYm9sIHRhYmxlLAotICAgICByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLiAgcl9leHRlcm4ganVzdCByZWZsZWN0cwotICAgICB3aGV0aGVyIHRoZSBzeW1ib2wgdGhlIHJlbG9jIGlzIGFnYWluc3QgaXMgbG9jYWwgb3IgZ2xvYmFsLiAgKi8KLSAgaWYgKHJfYmFzZXJlbCkKLSAgICByX2V4dGVybiA9IDE7Ci0KLSAgaWYgKHJfZXh0ZXJuICYmIHJfaW5kZXggPiBzeW1jb3VudCkKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBhcnJhbmdlIHRvIHJldHVybiBhbiBlcnJvciwgYnV0IGl0IG1pZ2h0IGJlIHVzZWZ1bAotICAgICAgICAgdG8gc2VlIHRoZSBmaWxlIGV2ZW4gaWYgaXQgaXMgYmFkLiAgKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBOX0FCUzsKLSAgICB9Ci0KLSAgTU9WRV9BRERSRVNTKDApOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgZWxzZSBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHJlbG9jX3NpemUgPSBleGVjX2hkcihhYmZkKS0+YV90cnNpemU7Ci0gIGVsc2UgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJlbG9jX3NpemUgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAocmVsb2NfY2FjaGUgPT0gTlVMTCAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtc2V0IChyZWxvY19jYWNoZSwgMCwgY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jcyA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPQotCShzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jczsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcnB0ciA9Ci0JKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLSAgICB9Ci0KLSAgZnJlZSAocmVsb2NzKTsKLQotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjYWNoZV9wdHIgLSByZWxvY19jYWNoZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgcmVsb2NhdGlvbiBzZWN0aW9uIGludG8gYW4gb2JqZWN0IGZpbGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgdW5zaWduZWQgY2hhciAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgZWFjaF9zaXplOwotCi0gIHVuc2lnbmVkIGludCBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBzaXplX3QgbmF0c2l6ZTsKLQotICBpZiAoY291bnQgPT0gMCB8fCBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OwotICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKLSAgaWYgKCFuYXRpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiluYXRwdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU1ZX3N3YXBfc3RkX3JlbG9jX291dChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiluYXRwdHIpOwotICAgIH0KLQotICBpZiAoIGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKSB7Ci0gICAgYmZkX3JlbGVhc2UoYWJmZCwgbmF0aXZlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotbG9uZwotTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb24gPT0gb2JqX2Jzc3NlYyAoYWJmZCkpCi0gICAgewotICAgICAgKnJlbHB0ciA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCEodGJscHRyIHx8IE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCArKykgewotICAgICAgKnJlbHB0ciArKyA9ICZjaGFpbi0+cmVsZW50OwotICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotICAgICAgewotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICAgfQotICB9Ci0gICpyZWxwdHIgPSAwOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotbG9uZwotTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqIChhc2VjdC0+cmVsb2NfY291bnQrMSkpOwotICB9Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKQotCSAgICAqICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKQotCSAgICAgICArIDEpKTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHJldHVybiAoc2l6ZW9mIChhcmVsZW50ICopCi0JICAgICogKChleGVjX2hkcihhYmZkKS0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpCi0JICAgICAgICsgMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICByZXR1cm4gc2l6ZW9mIChhcmVsZW50ICopOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICByZXR1cm4gMDsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gLTE7Ci19Ci0KLQwKLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKzEpICogKHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotIGFsZW50ICoKLU5BTUUoYW91dCxnZXRfbGluZW5vKSAoaWdub3JlX2FiZmQsIGlnbm9yZV9zeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKmlnbm9yZV9zeW1ib2w7Ci17Ci1yZXR1cm4gKGFsZW50ICopTlVMTDsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1OQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotCi0gIGlmIChyZXQtPnR5cGUgPT0gJz8nKQotICAgIHsKLSAgICAgIGludCB0eXBlX2NvZGUgPSBhb3V0X3N5bWJvbChzeW1ib2wpLT50eXBlICYgMHhmZjsKLSAgICAgIGNvbnN0IGNoYXIgKnN0YWJfbmFtZSA9IGJmZF9nZXRfc3RhYl9uYW1lICh0eXBlX2NvZGUpOwotICAgICAgc3RhdGljIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKHN0YWJfbmFtZSA9PSBOVUxMKQotCXsKLQkgIHNwcmludGYoYnVmLCAiKCVkKSIsIHR5cGVfY29kZSk7Ci0JICBzdGFiX25hbWUgPSBidWY7Ci0JfQotICAgICAgcmV0LT50eXBlID0gJy0nOwotICAgICAgcmV0LT5zdGFiX3R5cGUgPSB0eXBlX2NvZGU7Ci0gICAgICByZXQtPnN0YWJfb3RoZXIgPSAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPm90aGVyICYgMHhmZik7Ci0gICAgICByZXQtPnN0YWJfZGVzYyA9ICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZik7Ci0gICAgICByZXQtPnN0YWJfbmFtZSA9IHN0YWJfbmFtZTsKLSAgICB9Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZAotTkFNRShhb3V0LHByaW50X3N5bWJvbCkgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKilhZmlsZTsKLQotICBzd2l0Y2ggKGhvdykgewotICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICBpZiAoc3ltYm9sLT5uYW1lKQotICAgICAgZnByaW50ZihmaWxlLCIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgIGZwcmludGYoZmlsZSwiJTR4ICUyeCAlMngiLCh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZiksCi0JICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKSwKLQkgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT50eXBlKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgewotICAgQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0KLSAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoKFBUUilmaWxlLHN5bWJvbCk7Ci0KLSAgICAgIGZwcmludGYoZmlsZSwiICUtNXMgJTA0eCAlMDJ4ICUwMngiLAotCSAgICAgIHNlY3Rpb25fbmFtZSwKLQkgICAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPmRlc2MgJiAweGZmZmYpLAotCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKSwKLQkgICAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUgICYgMHhmZikpOwotICAgICAgaWYgKHN5bWJvbC0+bmFtZSkKLSAgICAgICAgZnByaW50ZihmaWxlLCIgJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotfQotCi0vKiBJZiB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiAxTUIgdG8gaG9sZCB0aGUgZ2VuZXJpYwotICAgc3ltYm9scywgd2UgdXNlIHRoZSBnZW5lcmljIG1pbmlzeW1ib2wgbWV0aG9yZDogaXQncyBmYXN0ZXIsIHNpbmNlCi0gICBpdCBvbmx5IHRyYW5zbGF0ZXMgdGhlIHN5bWJvbHMgb25jZSwgbm90IG11bHRpcGxlIHRpbWVzLiAgKi8KLSNkZWZpbmUgTUlOSVNZTV9USFJFU0hPTEQgKDEwMDAwMDAgLyBzaXplb2YgKGFzeW1ib2wpKQotCi0vKiBSZWFkIG1pbmlzeW1ib2xzLiAgRm9yIG1pbmlzeW1ib2xzLCB3ZSB1c2UgdGhlIHVubW9kaWZpZWQgYS5vdXQKLSAgIHN5bWJvbHMuICBUaGUgbWluaXN5bWJvbF90b19zeW1ib2wgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGVzZSBpbnRvCi0gICBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KLQotbG9uZwotTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSICptaW5pc3ltc3A7Ci0gICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Ci17Ci0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGhhbmRsZSB0aGUgZHluYW1pYyBzeW1ib2xzIGhlcmUgYXMgd2VsbCwgYnV0IGl0J3MKLSAgICAgICAgIGVhc2llciB0byBoYW5kIHRoZW0gb2ZmLiAgKi8KLSAgICAgIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7Ci0gICAgfQotCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA8IE1JTklTWU1fVEhSRVNIT0xEKQotICAgIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7Ci0KLSAgKm1pbmlzeW1zcCA9IChQVFIpIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCi0gIC8qIEJ5IHBhc3NpbmcgdGhlIGV4dGVybmFsIHN5bWJvbHMgYmFjayBmcm9tIHRoaXMgcm91dGluZSwgd2UgYXJlCi0gICAgIGdpdmluZyB1cCBjb250cm9sIG92ZXIgdGhlIG1lbW9yeSBibG9jay4gIENsZWFyCi0gICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMsIHNvIHRoYXQgd2UgZG8gbm90IHRyeSB0byBmcmVlIGl0Ci0gICAgIG91cnNlbHZlcy4gICovCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLQotICAqc2l6ZXAgPSBFWFRFUk5BTF9OTElTVF9TSVpFOwotICByZXR1cm4gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLX0KLQotLyogQ29udmVydCBhIG1pbmlzeW1ib2wgdG8gYSBCRkQgYXN5bWJvbC4gIEEgbWluaXN5bWJvbCBpcyBqdXN0IGFuCi0gICB1bm1vZGlmaWVkIGEub3V0IHN5bWJvbC4gIFRoZSBTWU0gYXJndW1lbnQgaXMgYSBzdHJ1Y3R1cmUgcmV0dXJuZWQKLSAgIGJ5IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCwgd2hpY2ggd2UgZmlsbCBpbiBoZXJlLiAgKi8KLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBjb25zdCBQVFIgbWluaXN5bTsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpZiAoZHluYW1pYwotICAgICAgfHwgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA8IE1JTklTWU1fVEhSRVNIT0xEKQotICAgIHJldHVybiBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSk7Ci0KLSAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpOwotCi0gIC8qIFdlIGNhbGwgdHJhbnNsYXRlX3N5bWJvbF90YWJsZSB0byB0cmFuc2xhdGUgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLSAgaWYgKCEgKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKQotCSAoYWJmZCwKLQkgIChhb3V0X3N5bWJvbF90eXBlICopIHN5bSwKLQkgIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgbWluaXN5bSwKLQkgIChiZmRfc2l6ZV90eXBlKSAxLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCksCi0JICBmYWxzZSkpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBzeW07Ci19Ci0KLS8qCi0gcHJvdmlkZWQgYSBCRkQsIGEgc2VjdGlvbiBhbmQgYW4gb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24sIGNhbGN1bGF0ZQotIGFuZCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgbGluZSBuZWFyZXN0IHRvIHRoZQotIHdhbnRlZCBsb2NhdGlvbi4KLSovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkKLSAgICAgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgLyogUnVuIGRvd24gdGhlIGZpbGUgbG9va2luZyBmb3IgdGhlIGZpbGVuYW1lLCBmdW5jdGlvbiBhbmQgbGluZW51bWJlciAqLwotICBhc3ltYm9sICoqcDsKLSAgQ09OU1QgY2hhciAqZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotICBDT05TVCBjaGFyICptYWluX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gIENPTlNUIGNoYXIgKmN1cnJlbnRfZmlsZV9uYW1lID0gTlVMTDsKLSAgQ09OU1QgY2hhciAqbGluZV9maWxlX25hbWUgPSBOVUxMOyAvKiBWYWx1ZSBvZiBjdXJyZW50X2ZpbGVfbmFtZSBhdCBsaW5lIG51bWJlci4gKi8KLSAgQ09OU1QgY2hhciAqbGluZV9kaXJlY3RvcnlfbmFtZSA9IE5VTEw7IC8qIFZhbHVlIG9mIGRpcmVjdG9yeV9uYW1lIGF0IGxpbmUgbnVtYmVyLiAqLwotICBiZmRfdm1hIGxvd19saW5lX3ZtYSA9IDA7Ci0gIGJmZF92bWEgbG93X2Z1bmNfdm1hID0gMDsKLSAgYXN5bWJvbCAqZnVuYyA9IDA7Ci0gIHNpemVfdCBmaWxlbGVuLCBmdW5jbGVuOwotICBjaGFyICpidWY7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGFiZmQtPmZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IDA7Ci0gICpsaW5lX3B0ciA9IDA7Ci0gIGlmIChzeW1ib2xzICE9IChhc3ltYm9sICoqKU5VTEwpIHsKLSAgICBmb3IgKHAgPSBzeW1ib2xzOyAqcDsgcCsrKSB7Ci0gICAgICBhb3V0X3N5bWJvbF90eXBlICAqcSA9IChhb3V0X3N5bWJvbF90eXBlICopKCpwKTsKLSAgICBuZXh0OgotICAgICAgc3dpdGNoIChxLT50eXBlKXsKLSAgICAgIGNhc2UgTl9URVhUOgotCS8qIElmIHRoaXMgbG9va3MgbGlrZSBhIGZpbGUgbmFtZSBzeW1ib2wsIGFuZCBpdCBjb21lcyBhZnRlcgotICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2UgaGF2ZSBmb3VuZCBzbyBmYXIsIGJ1dCBiZWZvcmUgdGhlCi0gICAgICAgICAgIG9mZnNldCwgdGhlbiB3ZSBoYXZlIHByb2JhYmx5IG5vdCBmb3VuZCB0aGUgcmlnaHQgbGluZQotICAgICAgICAgICBudW1iZXIuICAqLwotCWlmIChxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0Ci0JICAgICYmICgocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hCi0JCSAmJiAobGluZV9maWxlX25hbWUgIT0gTlVMTAotCQkgICAgIHx8ICpsaW5lX3B0ciAhPSAwKSkKLQkJfHwgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19mdW5jX3ZtYQotCQkgICAgJiYgZnVuYyAhPSBOVUxMKSkpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0KLQkgICAgc3ltbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCSAgICBpZiAoc3RyY21wIChzeW1uYW1lICsgc3RybGVuIChzeW1uYW1lKSAtIDIsICIubyIpID09IDApCi0JICAgICAgewotCQlpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hKQotCQkgIHsKLQkJICAgICpsaW5lX3B0ciA9IDA7Ci0JCSAgICBsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7Ci0JCSAgfQotCQlpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hKQotCQkgIGZ1bmMgPSBOVUxMOwotCSAgICAgIH0KLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSBOX1NPOgotCS8qIElmIHRoaXMgc3ltYm9sIGlzIGxlc3MgdGhhbiB0aGUgb2Zmc2V0LCBidXQgZ3JlYXRlciB0aGFuCi0gICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3ZSBoYXZlIGZvdW5kIHNvIGZhciwgdGhlbiB3ZSBoYXZlIG5vdAotICAgICAgICAgICBmb3VuZCB0aGUgcmlnaHQgbGluZSBudW1iZXIuICAqLwotCWlmIChxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgewotCSAgICBpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hKQotCSAgICAgIHsKLQkJKmxpbmVfcHRyID0gMDsKLQkJbGluZV9maWxlX25hbWUgPSBOVUxMOwotCSAgICAgIH0KLQkgICAgaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19mdW5jX3ZtYSkKLQkgICAgICBmdW5jID0gTlVMTDsKLQkgIH0KLQotCW1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKLQkvKiBMb29rIGFoZWFkIHRvIG5leHQgc3ltYm9sIHRvIGNoZWNrIGlmIHRoYXQgdG9vIGlzIGFuIE5fU08uICovCi0JcCsrOwotCWlmICgqcCA9PSBOVUxMKQotCSAgYnJlYWs7Ci0JcSA9IChhb3V0X3N5bWJvbF90eXBlICopKCpwKTsKLQlpZiAocS0+dHlwZSAhPSAoaW50KU5fU08pCi0JICBnb3RvIG5leHQ7Ci0KLQkvKiBGb3VuZCBhIHNlY29uZCBOX1NPICBGaXJzdCBpcyBkaXJlY3Rvcnk7IHNlY29uZCBpcyBmaWxlbmFtZS4gKi8KLQlkaXJlY3RvcnlfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCW1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKLQlpZiAob2JqX3RleHRzZWMoYWJmZCkgIT0gc2VjdGlvbikKLQkgIGdvdG8gZG9uZTsKLQlicmVhazsKLSAgICAgIGNhc2UgTl9TT0w6Ci0JY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBOX1NMSU5FOgotCi0gICAgICBjYXNlIE5fRFNMSU5FOgotICAgICAgY2FzZSBOX0JTTElORToKLQkvKiBXZSdsbCBrZWVwIHRoaXMgaWYgaXQgcmVzb2x2ZXMgbmVhcmVyIHRoYW4gdGhlIG9uZSB3ZSBoYXZlCi0gICAgICAgICAgIGFscmVhZHkuICAqLwotCWlmIChxLT5zeW1ib2wudmFsdWUgPj0gbG93X2xpbmVfdm1hCi0JICAgICYmIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCi0JICB7Ci0JICAgICpsaW5lX3B0ciA9IHEtPmRlc2M7Ci0JICAgIGxvd19saW5lX3ZtYSA9IHEtPnN5bWJvbC52YWx1ZTsKLQkgICAgbGluZV9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQkgICAgbGluZV9kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgfQotCWJyZWFrOwotICAgICAgY2FzZSBOX0ZVTjoKLQl7Ci0JICAvKiBXZSdsbCBrZWVwIHRoaXMgaWYgaXQgaXMgbmVhcmVyIHRoYW4gdGhlIG9uZSB3ZSBoYXZlIGFscmVhZHkgKi8KLQkgIGlmIChxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmNfdm1hICYmCi0JICAgICAgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkgewotCSAgICBsb3dfZnVuY192bWEgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIGZ1bmMgPSAoYXN5bWJvbCAqKXE7Ci0JICB9Ci0JICBlbHNlIGlmIChxLT5zeW1ib2wudmFsdWUgPiBvZmZzZXQpCi0JICAgIGdvdG8gZG9uZTsKLQl9Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSBkb25lOgotICBpZiAoKmxpbmVfcHRyICE9IDApCi0gICAgewotICAgICAgbWFpbl9maWxlX25hbWUgPSBsaW5lX2ZpbGVfbmFtZTsKLSAgICAgIGRpcmVjdG9yeV9uYW1lID0gbGluZV9kaXJlY3RvcnlfbmFtZTsKLSAgICB9Ci0KLSAgaWYgKG1haW5fZmlsZV9uYW1lID09IE5VTEwKLSAgICAgIHx8IG1haW5fZmlsZV9uYW1lWzBdID09ICcvJwotICAgICAgfHwgZGlyZWN0b3J5X25hbWUgPT0gTlVMTCkKLSAgICBmaWxlbGVuID0gMDsKLSAgZWxzZQotICAgIGZpbGVsZW4gPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKSArIHN0cmxlbiAobWFpbl9maWxlX25hbWUpOwotICBpZiAoZnVuYyA9PSBOVUxMKQotICAgIGZ1bmNsZW4gPSAwOwotICBlbHNlCi0gICAgZnVuY2xlbiA9IHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoZnVuYykpOwotCi0gIGlmIChhZGF0YSAoYWJmZCkubGluZV9idWYgIT0gTlVMTCkKLSAgICBmcmVlIChhZGF0YSAoYWJmZCkubGluZV9idWYpOwotICBpZiAoZmlsZWxlbiArIGZ1bmNsZW4gPT0gMCkKLSAgICBhZGF0YSAoYWJmZCkubGluZV9idWYgPSBidWYgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoZmlsZWxlbiArIGZ1bmNsZW4gKyAzKTsKLSAgICAgIGFkYXRhIChhYmZkKS5saW5lX2J1ZiA9IGJ1ZjsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChtYWluX2ZpbGVfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChtYWluX2ZpbGVfbmFtZVswXSA9PSAnLycgfHwgZGlyZWN0b3J5X25hbWUgPT0gTlVMTCkKLQkqZmlsZW5hbWVfcHRyID0gbWFpbl9maWxlX25hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgc3ByaW50ZiAoYnVmLCAiJXMlcyIsIGRpcmVjdG9yeV9uYW1lLCBtYWluX2ZpbGVfbmFtZSk7Ci0JICAqZmlsZW5hbWVfcHRyID0gYnVmOwotCSAgYnVmICs9IGZpbGVsZW4gKyAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb24gPSBmdW5jLT5uYW1lOwotICAgICAgY2hhciAqcDsKLQotICAgICAgLyogVGhlIGNhbGxlciBleHBlY3RzIGEgc3ltYm9sIG5hbWUuICBXZSBhY3R1YWxseSBoYXZlIGEKLQkgZnVuY3Rpb24gbmFtZSwgd2l0aG91dCB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLiAgUHV0IHRoZQotCSB1bmRlcnNjb3JlIGJhY2sgaW4sIHNvIHRoYXQgdGhlIGNhbGxlciBnZXRzIGEgc3ltYm9sIG5hbWUuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gJ1wwJykKLQlzdHJjcHkgKGJ1ZiwgZnVuY3Rpb24pOwotICAgICAgZWxzZQotCXsKLQkgIGJ1ZlswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0JICBzdHJjcHkgKGJ1ZiArIDEsIGZ1bmN0aW9uKTsKLQl9Ci0gICAgICAvKiBIYXZlIHRvIHJlbW92ZSA6IHN0dWZmICovCi0gICAgICBwID0gc3RyY2hyIChidWYsICc6Jyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotCSpwID0gJ1wwJzsKLSAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gYnVmOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTVVNFRCovCi1pbnQKLU5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgKGFiZmQsIGV4ZWNhYmxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZXhlY2FibGU7Ci17Ci0gIHJldHVybiBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci19Ci0KLS8qIEZyZWUgYWxsIGluZm9ybWF0aW9uIHdlIGhhdmUgY2FjaGVkIGZvciB0aGlzIEJGRC4gIFdlIGNhbiBhbHdheXMKLSAgIHJlYWQgaXQgYWdhaW4gbGF0ZXIgaWYgd2UgbmVlZCBpdC4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0jZGVmaW5lIEJGQ0lfRlJFRSh4KSBpZiAoeCAhPSBOVUxMKSB7IGZyZWUgKHgpOyB4ID0gTlVMTDsgfQotICBCRkNJX0ZSRUUgKG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpKTsKLSNpZmRlZiBVU0VfTU1BUAotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IDA7Ci0gIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IDA7Ci0jZWxzZQotICBCRkNJX0ZSRUUgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKLSAgQkZDSV9GUkVFIChvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSk7Ci0jZW5kaWYKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIEJGQ0lfRlJFRSAoby0+cmVsb2NhdGlvbik7Ci0jdW5kZWYgQkZDSV9GUkVFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBhLm91dCBsaW5rIGNvZGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLU5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT53cml0dGVuID0gZmFsc2U7Ci0gICAgICByZXQtPmluZHggPSAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGFuIGEub3V0IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKHJldCwgYWJmZCwKLQkJCQkJIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogR2l2ZW4gYW4gYS5vdXQgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCShhYmZkLCBpbmZvLCBhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIGEub3V0IG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayBhIHNpbmdsZSBhcmNoaXZlIGVsZW1lbnQgdG8gc2VlIGlmIHdlIG5lZWQgdG8gaW5jbHVkZSBpdCBpbgotICAgdGhlIGxpbmsuICAqUE5FRURFRCBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzCi0gICBuZWVkZWQgaW4gdGhlIGxpbmsgb3Igbm90LiAgVGhpcyBpcyBjYWxsZWQgZnJvbQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBpZiAoISBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnJlZSB1cCB0aGUgaW50ZXJuYWwgc3ltYm9scyByZWFkIGZyb20gYW4gYS5vdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAoKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTDsKLSAgICB9Ci0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSNpZmRlZiBVU0VfTU1BUAotICAgICAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotI2Vsc2UKLSAgICAgIGZyZWUgKChQVFIpIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpKTsKLSNlbmRpZgotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSAoY2hhciAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgaW50ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBvYmplY3QgZmlsZSBzaG91bGQKLSAgIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgV2Ugc2hvdWxkIGluY2x1ZGUgdGhpcyBvYmplY3QgZmlsZSBpZiBpdAotICAgZGVmaW5lcyBhbnkgc3ltYm9scyB3aGljaCBhcmUgY3VycmVudGx5IHVuZGVmaW5lZC4gIElmIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGRlZmluZXMgYSBjb21tb24gc3ltYm9sLCB0aGVuIHdlIG1heSBhZGp1c3QgdGhlIHNpemUgb2YgdGhlCi0gICBrbm93biBzeW1ib2wgYnV0IHdlIGRvIG5vdCBpbmNsdWRlIHRoZSBvYmplY3QgZmlsZSBpbiB0aGUgbGluawotICAgKHVubGVzcyB0aGVyZSBpcyBzb21lIG90aGVyIHJlYXNvbiB0byBpbmNsdWRlIGl0KS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnBlbmQ7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgcCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBwZW5kID0gcCArIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKTsKLSAgZm9yICg7IHAgPCBwZW5kOyBwKyspCi0gICAgewotICAgICAgaW50IHR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgcC0+ZV90eXBlKTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogSWdub3JlIHN5bWJvbHMgdGhhdCBhcmUgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4gIFRoaXMgaXMgYW4KLQkgb3B0aW1pemF0aW9uIG9ubHksIGFzIHdlIGNoZWNrIHRoZSB0eXBlIG1vcmUgdGhvcm91Z2hseQotCSBiZWxvdy4gICovCi0gICAgICBpZiAoKCh0eXBlICYgTl9FWFQpID09IDAKLQkgICB8fCAodHlwZSAmIE5fU1RBQikgIT0gMAotCSAgIHx8IHR5cGUgPT0gTl9GTikKLQkgICYmIHR5cGUgIT0gTl9XRUFLQQotCSAgJiYgdHlwZSAhPSBOX1dFQUtUCi0JICAmJiB0eXBlICE9IE5fV0VBS0QKLQkgICYmIHR5cGUgIT0gTl9XRUFLQikKLQl7Ci0JICBpZiAodHlwZSA9PSBOX1dBUk5JTkcKLQkgICAgICB8fCB0eXBlID09IE5fSU5EUikKLQkgICAgKytwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JIHVuZGVmaW5lZCBvciBjb21tb24uICAqLwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikpCi0JewotCSAgaWYgKHR5cGUgPT0gKE5fSU5EUiB8IE5fRVhUKSkKLQkgICAgKytwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAodHlwZSA9PSAoTl9URVhUIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0RBVEEgfCBOX0VYVCkKLQkgIHx8IHR5cGUgPT0gKE5fQlNTIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0FCUyB8IE5fRVhUKQotCSAgfHwgdHlwZSA9PSAoTl9JTkRSIHwgTl9FWFQpKQotCXsKLQkgIC8qIFRoaXMgb2JqZWN0IGZpbGUgZGVmaW5lcyB0aGlzIHN5bWJvbC4gIFdlIG11c3QgbGluayBpdAotCSAgICAgaW4uICBUaGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjdXJyZW50Ci0JICAgICBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGNvbW1vbi4gIElmIHRoZQotCSAgICAgY3VycmVudCBkZWZpbml0aW9uIGlzIGNvbW1vbiwgd2UgaGF2ZSBhIGNhc2UgaW4gd2hpY2ggd2UKLQkgICAgIGhhdmUgYWxyZWFkeSBzZWVuIGFuIG9iamVjdCBmaWxlIGluY2x1ZGluZwotCSAgICAgICAgIGludCBhOwotCSAgICAgYW5kIHRoaXMgb2JqZWN0IGZpbGUgZnJvbSB0aGUgYXJjaGl2ZSBpbmNsdWRlcwotCSAgICAgICAgIGludCBhID0gNTsKLQkgICAgIEluIHN1Y2ggYSBjYXNlIHdlIG11c3QgaW5jbHVkZSB0aGlzIG9iamVjdCBmaWxlLgotCi0JICAgICBGSVhNRTogVGhlIFN1bk9TIDQuMS4zIGxpbmtlciB3aWxsIHB1bGwgaW4gdGhlIGFyY2hpdmUKLQkgICAgIGVsZW1lbnQgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSAuZGF0YSBzZWN0aW9uLAotCSAgICAgYnV0IG5vdCBpZiBpdCBpcyBkZWZpbmVkIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhhdAotCSAgICAgc2VlbXMgYSBiaXQgY3JhenkgdG8gbWUsIGFuZCBJIGhhdmVuJ3QgaW1wbGVtZW50ZWQgaXQuCi0JICAgICBIb3dldmVyLCBpdCBtaWdodCBiZSBjb3JyZWN0LiAgKi8KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICpwbmVlZGVkID0gdHJ1ZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gKE5fVU5ERiB8IE5fRVhUKSkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlOwotCi0JICB2YWx1ZSA9IEdFVF9XT1JEIChhYmZkLCBwLT5lX3ZhbHVlKTsKLQkgIGlmICh2YWx1ZSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgaXMgY29tbW9uIGluIHRoZSBvYmplY3QgZnJvbSB0aGUgYXJjaGl2ZQotCQkgZmlsZS4gICovCi0JICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JCXsKLQkJICBiZmQgKnN5bWJmZDsKLQkJICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkJICBzeW1iZmQgPSBoLT51LnVuZGVmLmFiZmQ7Ci0JCSAgaWYgKHN5bWJmZCA9PSAoYmZkICopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIGFzIHVuZGVmaW5lZCBmcm9tCi0JCQkgb3V0c2lkZSBCRkQuICBXZSBhc3N1bWUgdGhhdCB3ZSBzaG91bGQgbGluawotCQkJIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgZG9uZSBmb3IgdGhlIC11Ci0JCQkgb3B0aW9uIGluIHRoZSBsaW5rZXIuICAqLwotCQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sCi0JCQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCQkJICAgICBuYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCQkgICAgICByZXR1cm4gdHJ1ZTsKLQkJICAgIH0KLQkJICAvKiBUdXJuIHRoZSBjdXJyZW50IGxpbmsgc3ltYm9sIGludG8gYSBjb21tb24KLQkJICAgICBzeW1ib2wuICBJdCBpcyBhbHJlYWR5IG9uIHRoZSB1bmRlZnMgbGlzdC4gICovCi0JCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOwotCQkgIGgtPnUuYy5wID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKLQkJCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJICBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKLQkJICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0KLQkJICAvKiBGSVhNRTogVGhpcyBpc24ndCBxdWl0ZSByaWdodC4gIFRoZSBtYXhpbXVtCi0JCSAgICAgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCBzaG91bGQgYmUgc2V0IGJ5IHRoZQotCQkgICAgIGFyY2hpdGVjdHVyZSBvZiB0aGUgb3V0cHV0IGZpbGUsIG5vdCBvZiB0aGUgaW5wdXQKLQkJICAgICBmaWxlLiAgKi8KLQkJICBwb3dlciA9IGJmZF9sb2cyICh2YWx1ZSk7Ci0JCSAgaWYgKHBvd2VyID4gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyKQotCQkgICAgcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0JCSAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwKLQkJCQkJCQkJIkNPTU1PTiIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sIGlmCi0JCSAgICAgbmVjZXNzYXJ5LiAgKi8KLQkJICBpZiAodmFsdWUgPiBoLT51LmMuc2l6ZSkKLQkJICAgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gTl9XRUFLQQotCSAgfHwgdHlwZSA9PSBOX1dFQUtUCi0JICB8fCB0eXBlID09IE5fV0VBS0QKLQkgIHx8IHR5cGUgPT0gTl9XRUFLQikKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyB3ZWFrIGJ1dCBkZWZpbmVkLiAgV2UgbXVzdCBwdWxsIGl0IGluIGlmCi0JICAgICB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpcyB1bmRlZmluZWQsIGJ1dCB3ZSBkb24ndCB3YW50Ci0JICAgICBpdCBpZiB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpcyBjb21tb24uICAqLwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbGwgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCi0JCQkJICAgICBib29sZWFuLAotCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLSAgY2hhciAqc3RyaW5nczsKLSAgYm9vbGVhbiBjb3B5OwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnBlbmQ7Ci0KLSAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBzeW1fY291bnQgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCk7Ci0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBjb3B5ID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBjb3B5ID0gdHJ1ZTsKLQotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfZHluYW1pY19zeW1ib2xzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfZHluYW1pY19zeW1ib2xzKQotCSAgICAgKGFiZmQsIGluZm8sICZzeW1zLCAmc3ltX2NvdW50LCAmc3RyaW5ncykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIHBhcnRpY3VsYXIgc3ltYm9scy4gIFdlIGNvdWxkIGp1c3QgbG9vayB0aGVtIHVwIGluIHRoZSBoYXNoCi0gICAgIHRhYmxlLCBidXQga2VlcGluZyB0aGUgbGlzdCBpcyBtb3JlIGVmZmljaWVudC4gIFBlcmhhcHMgdGhpcwotICAgICBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gaW5mby0+a2VlcF9tZW1vcnkuICAqLwotICBzeW1faGFzaCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoKHNpemVfdCkgc3ltX2NvdW50Ci0JCQkgICogc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bV9jb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKLQotICBhZGRfb25lX3N5bWJvbCA9IGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+YWRkX29uZV9zeW1ib2w7Ci0gIGlmIChhZGRfb25lX3N5bWJvbCA9PSBOVUxMKQotICAgIGFkZF9vbmVfc3ltYm9sID0gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w7Ci0KLSAgcCA9IHN5bXM7Ci0gIHBlbmQgPSBwICsgc3ltX2NvdW50OwotICBmb3IgKDsgcCA8IHBlbmQ7IHArKywgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotICAgICAgKnN5bV9oYXNoID0gTlVMTDsKLQotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBwLT5lX3R5cGUpOwotCi0gICAgICAvKiBJZ25vcmUgZGVidWdnaW5nIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotICAgICAgdmFsdWUgPSBHRVRfV09SRCAoYWJmZCwgcC0+ZV92YWx1ZSk7Ci0gICAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBzdHJpbmcgPSBOVUxMOwotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIE5fVU5ERjoKLQljYXNlIE5fQUJTOgotCWNhc2UgTl9URVhUOgotCWNhc2UgTl9EQVRBOgotCWNhc2UgTl9CU1M6Ci0JY2FzZSBOX0ZOX1NFUToKLQljYXNlIE5fQ09NTToKLQljYXNlIE5fU0VUVjoKLQljYXNlIE5fRk46Ci0JICAvKiBJZ25vcmUgc3ltYm9scyB0aGF0IGFyZSBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLiAgKi8KLQkgIGNvbnRpbnVlOwotCWNhc2UgTl9JTkRSOgotCSAgLyogSWdub3JlIGxvY2FsIGluZGlyZWN0IHN5bWJvbC4gICovCi0JICArK3A7Ci0JICArK3N5bV9oYXNoOwotCSAgY29udGludWU7Ci0KLQljYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgaWYgKHZhbHVlID09IDApCi0JICAgIHsKLQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgICAgICBmbGFncyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fREFUQSB8IE5fRVhUOgotCWNhc2UgTl9TRVRWIHwgTl9FWFQ6Ci0JICAvKiBUcmVhdCBOX1NFVFYgc3ltYm9scyBhcyBOX0RBVEEgc3ltYm9sOyBzZWUgY29tbWVudCBpbgotCSAgICAgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4gICovCi0JICBzZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fQlNTIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9JTkRSIHwgTl9FWFQ6Ci0JICAvKiBBbiBpbmRpcmVjdCBzeW1ib2wuICBUaGUgbmV4dCBzeW1ib2wgaXMgdGhlIHN5bWJvbAotCSAgICAgd2hpY2ggdGhpcyBvbmUgcmVhbGx5IGlzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKHAgKyAxIDwgcGVuZCk7Ci0JICArK3A7Ci0JICBzdHJpbmcgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7Ci0JICBzZWN0aW9uID0gYmZkX2luZF9zZWN0aW9uX3B0cjsKLQkgIGZsYWdzIHw9IEJTRl9JTkRJUkVDVDsKLQkgIGJyZWFrOwotCWNhc2UgTl9DT01NIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVRBOiBjYXNlIE5fU0VUQSB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICBicmVhazsKLQljYXNlIE5fU0VUVDogY2FzZSBOX1NFVFQgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVREOiBjYXNlIE5fU0VURCB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9XQVJOSU5HOgotCSAgLyogQSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4KLQkgICAgIGFib3V0LiAgKi8KLQkgIEJGRF9BU1NFUlQgKHAgKyAxIDwgcGVuZCk7Ci0JICArK3A7Ci0JICBzdHJpbmcgPSBuYW1lOwotCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoYWJmZCwgcC0+ZV9zdHJ4KTsKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgfD0gQlNGX1dBUk5JTkc7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS1U6Ci0JICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS0E6Ci0JICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS1Q6Ci0JICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dFQUtEOgotCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLQjoKLQkgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCEgKCgqYWRkX29uZV9zeW1ib2wpCi0JICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNvcHksIGZhbHNlLAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgc3ltX2hhc2gpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFJlc3RyaWN0IHRoZSBtYXhpbXVtIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wgYmFzZWQgb24KLQkgdGhlIGFyY2hpdGVjdHVyZSwgc2luY2UgYS5vdXQgaGFzIG5vIHdheSB0byByZXByZXNlbnQKLQkgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIHNlY3Rpb24gaW4gYSAubyBmaWxlLiAgRklYTUU6Ci0JIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQ6IGl0IHNob3VsZCB1c2UgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUKLQkgb3V0cHV0IGZpbGUsIG5vdCB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgaWYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyID4KLQkgICAgICBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXIpKQotCSgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPQotCSAgYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgc2V0IHN5bWJvbCwgYW5kIHdlIGFyZSBub3QgYnVpbGRpbmcgc2V0cywgdGhlbgotCSBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGhhc2ggZW50cnkgdG8gbm90IGhhdmUgYmVlbiBzZXQuICBJbgotCSBzdWNoIGEgY2FzZSwgdHJlYXQgdGhlIHN5bWJvbCBhcyBub3QgZ2xvYmFsbHkgZGVmaW5lZC4gICovCi0gICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQl7Ci0JICBCRkRfQVNTRVJUICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApOwotCSAgKnN5bV9oYXNoID0gTlVMTDsKLQl9Ci0KLSAgICAgIGlmICh0eXBlID09IChOX0lORFIgfCBOX0VYVCkgfHwgdHlwZSA9PSBOX1dBUk5JTkcpCi0JKytzeW1faGFzaDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBIGhhc2ggdGFibGUgdXNlZCBmb3IgaGVhZGVyIGZpbGVzIHdpdGggTl9CSU5DTCBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgdG90YWxzIHRoYXQgd2UgaGF2ZSBmb3VuZCBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlcgotICAgZmlsZS4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzICpuZXh0OwotICBiZmRfdm1hIHRvdGFsOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBMaXN0IG9mIHRvdGFscyB3ZSBoYXZlIGZvdW5kIGZvciB0aGlzIGZpbGUuICAqLwotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqdG90YWxzOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogRHVyaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAgd2UgbmVlZCB0byBwYXNzIGFyb3VuZCBhIGJ1bmNoIG9mCi0gICBpbmZvcm1hdGlvbiwgc28gd2UgZG8gaXQgaW4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBiZmQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFJlbG9jIGZpbGUgcG9zaXRpb25zLiAgKi8KLSAgZmlsZV9wdHIgdHJlbG9mZiwgZHJlbG9mZjsKLSAgLyogRmlsZSBwb3NpdGlvbiBvZiBzeW1ib2xzLiAgKi8KLSAgZmlsZV9wdHIgc3ltb2ZmOwotICAvKiBTdHJpbmcgdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7Ci0gIC8qIEhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlIGluY2x1ZGVzOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYW55IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLwotICBQVFIgcmVsb2NzOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc3ltYm9sIG1hcCBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgaW50ICpzeW1ib2xfbWFwOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRwdXRfc3ltczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX3dyaXRlX3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgZmlsZV9wdHIgKnJlbG9mZl9wdHIsCi0JICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZSkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLAotCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUsIGJmZF9ieXRlICpjb250ZW50cykpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0Ci0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqLAotCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUsIGJmZF9ieXRlICpjb250ZW50cykpOwotc3RhdGljIElOTElORSBhc2VjdGlvbiAqYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnRvdGFscyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gIFRoaXMgaXMgY2FsbGVkIG9uIHRoZSBvdXRwdXQgQkZELiAgVGhlCi0gICBJTkZPIHN0cnVjdHVyZSBzaG91bGQgcG9pbnQgdG8gYSBsaXN0IG9mIEJGRHMgbGlua2VkIHRocm91Z2ggdGhlCi0gICBsaW5rX25leHQgZmllbGQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBlYWNoIEJGRCB3aGljaCB0YWtlcyBwYXJ0Ci0gICBpbiB0aGUgb3V0cHV0LiAgQWxzbywgZWFjaCBzZWN0aW9uIGluIEFCRkQgc2hvdWxkIHBvaW50IHRvIGEgbGlzdAotICAgb2YgYmZkX2xpbmtfb3JkZXIgc3RydWN0dXJlcyB3aGljaCBsaXN0IGFsbCB0aGUgaW5wdXQgc2VjdGlvbnMgZm9yCi0gICB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIGNhbGxiYWNrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICB2b2lkICgqY2FsbGJhY2spIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci17Ci0gIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyBhb3V0X2luZm87Ci0gIGJvb2xlYW4gaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCA9IGZhbHNlOwotICByZWdpc3RlciBiZmQgKnN1YjsKLSAgYmZkX3NpemVfdHlwZSB0cnNpemUsIGRyc2l6ZTsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBzaXplX3QgbWF4X3JlbG9jc19zaXplOwotICBzaXplX3QgbWF4X3N5bV9jb3VudDsKLSAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0gIGZpbGVfcHRyIHRleHRfZW5kOwotICByZWdpc3RlciBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIGFzZWN0aW9uICpvOwotICBib29sZWFuIGhhdmVfbGlua19vcmRlcl9yZWxvY3M7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGFvdXRfaW5mby5pbmZvID0gaW5mbzsKLSAgYW91dF9pbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBhb3V0X2luZm8uY29udGVudHMgPSBOVUxMOwotICBhb3V0X2luZm8ucmVsb2NzID0gTlVMTDsKLSAgYW91dF9pbmZvLnN5bWJvbF9tYXAgPSBOVUxMOwotICBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPSBOVUxMOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAoJmFvdXRfaW5mby5pbmNsdWRlcy5yb290LAotCQkJICAgICAgIGFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jLAotCQkJICAgICAgIDI1MSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3Qgc2VjdGlvbiBzaXplLiAgQWxzbywgaWYgZ2VuZXJhdGluZwotICAgICByZWxvY2F0ZWFibGUgb3V0cHV0LCBjb3VudCB0aGUgcmVsb2NzLiAgKi8KLSAgdHJzaXplID0gMDsKLSAgZHJzaXplID0gMDsKLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfcmVsb2NzX3NpemUgPSAwOwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHN1YikgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0JICAgIHsKLQkgICAgICB0cnNpemUgKz0gZXhlY19oZHIgKHN1YiktPmFfdHJzaXplOwotCSAgICAgIGRyc2l6ZSArPSBleGVjX2hkciAoc3ViKS0+YV9kcnNpemU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBXZSBuZWVkIHRvIGlkZW50aWZ5IHRoZSAudGV4dCBhbmQgLmRhdGEgc2VjdGlvbnMKLQkJIGFuZCBjYWxsIGdldF9yZWxvY191cHBlcl9ib3VuZCBhbmQgY2Fub25pY2FsaXplX3JlbG9jIHRvCi0JCSB3b3JrIG91dCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBuZWVkZWQsIGFuZCB0aGVuIG11bHRpcGx5Ci0JCSBieSB0aGUgcmVsb2Mgc2l6ZS4gICovCi0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogcmVsb2NhdGVhYmxlIGxpbmsgZnJvbSAlcyB0byAlcyBub3Qgc3VwcG9ydGVkIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJIHN1Yi0+eHZlYy0+bmFtZSwgYWJmZC0+eHZlYy0+bmFtZSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc3ViKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLQl7Ci0JICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKHN1Yiwgb2JqX3RleHRzZWMgKHN1YikpOwotCSAgaWYgKHN6ID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JICAgIG1heF9jb250ZW50c19zaXplID0gc3o7Ci0JICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKHN1Yiwgb2JqX2RhdGFzZWMgKHN1YikpOwotCSAgaWYgKHN6ID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JICAgIG1heF9jb250ZW50c19zaXplID0gc3o7Ci0KLQkgIHN6ID0gZXhlY19oZHIgKHN1YiktPmFfdHJzaXplOwotCSAgaWYgKHN6ID4gbWF4X3JlbG9jc19zaXplKQotCSAgICBtYXhfcmVsb2NzX3NpemUgPSBzejsKLQkgIHN6ID0gZXhlY19oZHIgKHN1YiktPmFfZHJzaXplOwotCSAgaWYgKHN6ID4gbWF4X3JlbG9jc19zaXplKQotCSAgICBtYXhfcmVsb2NzX3NpemUgPSBzejsKLQotCSAgc3ogPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKHN1Yik7Ci0JICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCSAgICBtYXhfc3ltX2NvdW50ID0gc3o7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGlmIChvYmpfdGV4dHNlYyAoYWJmZCkgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JdHJzaXplICs9IChfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzIChvYmpfdGV4dHNlYyAoYWJmZCkKLQkJCQkJCSAtPmxpbmtfb3JkZXJfaGVhZCkKLQkJICAgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICAgICAgaWYgKG9ial9kYXRhc2VjIChhYmZkKSAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQlkcnNpemUgKz0gKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKG9ial9kYXRhc2VjIChhYmZkKQotCQkJCQkJIC0+bGlua19vcmRlcl9oZWFkKQotCQkgICAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgfQotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSB0cnNpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSBkcnNpemU7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICAvKiBBZGp1c3QgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIHZtYXMgYWNjb3JkaW5nIHRvIHRoZSBtYWdpYyBudW1iZXIuCi0gICAgIFRoaXMgc2V0cyBhX3RleHQsIGFfZGF0YSBhbmQgYV9ic3MgaW4gdGhlIGV4ZWNfaGRyIGFuZCBzZXRzIHRoZQotICAgICBmaWxlcG9zIGZvciBlYWNoIHNlY3Rpb24uICAqLwotICBpZiAoISBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgcmVsb2NhdGlvbiBhbmQgc3ltYm9sIGZpbGUgcG9zaXRpb25zIGRpZmZlciBhbW9uZyBhLm91dAotICAgICB0YXJnZXRzLiAgV2UgYXJlIHBhc3NlZCBhIGNhbGxiYWNrIHJvdXRpbmUgZnJvbSB0aGUgYmFja2VuZAotICAgICBzcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSB0aGlzLgotICAgICBGSVhNRTogQXQgdGhpcyBwb2ludCB3ZSBkbyBub3Qga25vdyBob3cgbXVjaCBzcGFjZSB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHdpbGwgcmVxdWlyZS4gIFRoaXMgd2lsbCBub3Qgd29yayBmb3IgYW55IChub25zdGFuZGFyZCkKLSAgICAgYS5vdXQgdGFyZ2V0IHRoYXQgbmVlZHMgdG8ga25vdyB0aGUgc3ltYm9sIHRhYmxlIHNpemUgYmVmb3JlIGl0Ci0gICAgIGNhbiBjb21wdXRlIHRoZSByZWxvY2F0aW9uIGZpbGUgcG9zaXRpb25zLiAgVGhpcyBtYXkgb3IgbWF5IG5vdAotICAgICBiZSB0aGUgY2FzZSBmb3IgdGhlIGhwMzAwaHB1eCB0YXJnZXQsIGZvciBleGFtcGxlLiAgKi8KLSAgKCpjYWxsYmFjaykgKGFiZmQsICZhb3V0X2luZm8udHJlbG9mZiwgJmFvdXRfaW5mby5kcmVsb2ZmLAotCSAgICAgICAmYW91dF9pbmZvLnN5bW9mZik7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBhb3V0X2luZm8udHJlbG9mZjsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IGFvdXRfaW5mby5kcmVsb2ZmOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gYW91dF9pbmZvLnN5bW9mZjsKLQotICAvKiBXZSBrZWVwIGEgY291bnQgb2YgdGhlIHN5bWJvbHMgYXMgd2Ugb3V0cHV0IHRoZW0uICAqLwotICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpID0gMDsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBzdHJpbmcgdGFibGUgYXMgd2Ugd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYW91dF9pbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChhb3V0X2luZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQWxsb2NhdGUgYnVmZmVycyB0byBob2xkIHNlY3Rpb24gY29udGVudHMgYW5kIHJlbG9jcy4gICovCi0gIGFvdXRfaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGFvdXRfaW5mby5yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NzX3NpemUpOwotICBhb3V0X2luZm8uc3ltYm9sX21hcCA9IChpbnQgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAoaW50ICopKTsKLSAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkJCSAgIGJmZF9tYWxsb2MgKChtYXhfc3ltX2NvdW50ICsgMSkKLQkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCkpKTsKLSAgaWYgKChhb3V0X2luZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSAhPSAwKQotICAgICAgfHwgKGFvdXRfaW5mby5yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NzX3NpemUgIT0gMCkKLSAgICAgIHx8IChhb3V0X2luZm8uc3ltYm9sX21hcCA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IGFvdXRfaW5mby5vdXRwdXRfc3ltcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGhhdmUgYSBzeW1ib2wgbmFtZWQgX19EWU5BTUlDLCBmb3JjZSBpdCBvdXQgbm93LiAgVGhpcyBpcwotICAgICByZXF1aXJlZCBieSBTdW5PUy4gIERvaW5nIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiBzdW5vcy5jIGlzIGEKLSAgICAgaGFjaywgYnV0IGl0J3MgZWFzaWVyIHRoYW4gZXhwb3J0aW5nIGV2ZXJ5dGhpbmcgd2hpY2ggd291bGQgYmUKLSAgICAgbmVlZGVkLiAgKi8KLSAgewotICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgIGggPSBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKGFvdXRfaGFzaF90YWJsZSAoaW5mbyksICJfX0RZTkFNSUMiLAotCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgIGlmIChoICE9IE5VTEwpCi0gICAgICBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCAmYW91dF9pbmZvKTsKLSAgfQotCi0gIC8qIFRoZSBtb3N0IHRpbWUgZWZmaWNpZW50IHdheSB0byBkbyB0aGUgbGluayB3b3VsZCBiZSB0byByZWFkIGFsbAotICAgICB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGludG8gbWVtb3J5IGFuZCB0aGVuIHNvcnQgb3V0IHRoZQotICAgICBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFVuZm9ydHVuYXRlbHksIHRoYXQgd2lsbAotICAgICBwcm9iYWJseSB1c2UgdG9vIG11Y2ggbWVtb3J5LiAgQW5vdGhlciBtZXRob2Qgd291bGQgYmUgdG8gc3RlcAotICAgICB0aHJvdWdoIGV2ZXJ5dGhpbmcgdGhhdCBjb21wb3NlcyB0aGUgdGV4dCBzZWN0aW9uIGFuZCB3cml0ZSBpdAotICAgICBvdXQsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgdGhhdCBjb21wb3NlcyB0aGUgZGF0YSBzZWN0aW9uIGFuZCB3cml0ZQotICAgICBpdCBvdXQsIGFuZCB0aGVuIHdyaXRlIG91dCB0aGUgcmVsb2NzLCBhbmQgdGhlbiB3cml0ZSBvdXQgdGhlCi0gICAgIHN5bWJvbHMuICBVbmZvcnR1bmF0ZWx5LCB0aGF0IHJlcXVpcmVzIHJlYWRpbmcgc3R1ZmYgZnJvbSBlYWNoCi0gICAgIGlucHV0IGZpbGUgc2V2ZXJhbCB0aW1lcywgYW5kIHdlIHdpbGwgbm90IGJlIGFibGUgdG8ga2VlcCBhbGwgdGhlCi0gICAgIGlucHV0IGZpbGVzIG9wZW4gc2ltdWx0YW5lb3VzbHksIGFuZCByZW9wZW5pbmcgdGhlbSB3aWxsIGJlIHNsb3cuCi0KLSAgICAgV2hhdCB3ZSBkbyBpcyBiYXNpY2FsbHkgcHJvY2VzcyBvbmUgaW5wdXQgZmlsZSBhdCBhIHRpbWUuICBXZSBkbwotICAgICBldmVyeXRoaW5nIHdlIG5lZWQgdG8gZG8gd2l0aCBhbiBpbnB1dCBmaWxlIG9uY2UtLWNvcHkgb3ZlciB0aGUKLSAgICAgc2VjdGlvbiBjb250ZW50cywgaGFuZGxlIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBhbmQgd3JpdGUKLSAgICAgb3V0IHRoZSBzeW1ib2xzLS1hbmQgdGhlbiB3ZSB0aHJvdyBhd2F5IHRoZSBpbmZvcm1hdGlvbiB3ZSByZWFkCi0gICAgIGZyb20gaXQuICBUaGlzIGFwcHJvYWNoIHJlcXVpcmVzIGEgbG90IG9mIGxzZWVrcyBvZiB0aGUgb3V0cHV0Ci0gICAgIGZpbGUsIHdoaWNoIGlzIHVuZm9ydHVuYXRlIGJ1dCBzdGlsbCBmYXN0ZXIgdGhhbiByZW9wZW5pbmcgYSBsb3QKLSAgICAgb2YgZmlsZXMuCi0KLSAgICAgV2UgdXNlIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkIG9mIHRoZSBpbnB1dCBCRkRzIHRvIHNlZQotICAgICB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIGl0LiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gKGJmZCAqKSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLQotICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBUaGlzCi0gICAgIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB0aGF0IHdlCi0gICAgIGNhbiBpZGVudGlmeSBhbnkgc2VjdGlvbnMgd2hpY2ggdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QKLSAgICAgaW5jbHVkZS4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5saW5rZXJfbWFyayA9IHRydWU7Ci0JfQotICAgIH0KLQotICBoYXZlX2xpbmtfb3JkZXJfcmVsb2NzID0gZmFsc2U7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCi0JICAgICAgaW5wdXRfYmZkID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBpbnB1dF9iZmQtPm91dHB1dF9oYXNfYmVndW4pCi0JCXsKLQkJICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfYmZkICgmYW91dF9pbmZvLCBpbnB1dF9iZmQpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgaW5wdXRfYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICAvKiBUaGVzZSBhcmUgaGFuZGxlZCBiZWxvdy4gICovCi0JICAgICAgaGF2ZV9saW5rX29yZGVyX3JlbG9jcyA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCBhbnkgc3ltYm9scyB0aGF0IHdlIGhhdmUgbm90IGFscmVhZHkgd3JpdHRlbiBvdXQuICAqLwotICBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSAoYW91dF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wsCi0JCQkgICAoUFRSKSAmYW91dF9pbmZvKTsKLQotICAvKiBOb3cgaGFuZGxlIGFueSByZWxvY3Mgd2Ugd2VyZSBhc2tlZCB0byBjcmVhdGUgYnkgdGhlIGxpbmtlci4KLSAgICAgVGhlc2UgZGlkIG5vdCBjb21lIGZyb20gYW55IGlucHV0IGZpbGUuICBXZSBtdXN0IGRvIHRoZXNlIGFmdGVyCi0gICAgIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBzeW1ib2xzLCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbAotICAgICBpbmRpY2VzIHRvIHVzZS4gICovCi0gIGlmIChoYXZlX2xpbmtfb3JkZXJfcmVsb2NzKQotICAgIHsKLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkJewotCQkgIGlmICghIGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyICgmYW91dF9pbmZvLCBvLCBwKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChhb3V0X2luZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8uY29udGVudHMpOwotICAgICAgYW91dF9pbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8ucmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYW91dF9pbmZvLnJlbG9jcyk7Ci0gICAgICBhb3V0X2luZm8ucmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8uc3ltYm9sX21hcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGFvdXRfaW5mby5zeW1ib2xfbWFwKTsKLSAgICAgIGFvdXRfaW5mby5zeW1ib2xfbWFwID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8ub3V0cHV0X3N5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8ub3V0cHV0X3N5bXMpOwotICAgICAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhb3V0X2luZm8uaW5jbHVkZXMucm9vdCk7Ci0gICAgICBpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEZpbmlzaCB1cCBhbnkgZHluYW1pYyBsaW5raW5nIHdlIG1heSBiZSBkb2luZy4gICovCi0gIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmZpbmlzaF9keW5hbWljX2xpbmsgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZmluaXNoX2R5bmFtaWNfbGluaykgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIGFiZmQtPnN5bWNvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBhYmZkLT5zeW1jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpICsgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUsIHVubGVzcyB0aGVyZSBhcmUgbm8gc3ltYm9scy4gICovCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgYW91dF9pbmZvLnN0cnRhYikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBlbHNlIGlmIChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID09IDAKLQkgICAmJiBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYiA9IDA7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zCi0JCSAgICAgKyBleGVjX2hkciAoYWJmZCktPmFfZGF0YQotCQkgICAgIC0gMSksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhb3V0X2luZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8uY29udGVudHMpOwotICBpZiAoYW91dF9pbmZvLnJlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5yZWxvY3MpOwotICBpZiAoYW91dF9pbmZvLnN5bWJvbF9tYXAgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8uc3ltYm9sX21hcCk7Ci0gIGlmIChhb3V0X2luZm8ub3V0cHV0X3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8ub3V0cHV0X3N5bXMpOwotICBpZiAoaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCkKLSAgICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYW91dF9pbmZvLmluY2x1ZGVzLnJvb3QpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIExpbmsgYW4gYS5vdXQgaW5wdXQgQkZEIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLQotICBCRkRfQVNTRVJUIChiZmRfZ2V0X2Zvcm1hdCAoaW5wdXRfYmZkKSA9PSBiZmRfb2JqZWN0KTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIGl0IG1heSBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiBhb3V0X2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+bGlua19keW5hbWljX29iamVjdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiAoKCphb3V0X2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+bGlua19keW5hbWljX29iamVjdCkKLQkgICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCkpOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHN5bWJvbHMuICBXZSBwcm9iYWJseSBoYXZlIHRoZW0gYWxyZWFkeSwgdW5sZXNzCi0gICAgIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZS4gICovCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoaW5wdXRfYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHN5bWJvbHMgYW5kIGdldCBhIG1hcCBvZiB0aGUgbmV3IGluZGljZXMuICBUaGUgbWFwCi0gICAgIGlzIHBsYWNlZCBpbnRvIGZpbmZvLT5zeW1ib2xfbWFwLiAgKi8KLSAgaWYgKCEgYW91dF9saW5rX3dyaXRlX3N5bWJvbHMgKGZpbmZvLCBpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWxvY2F0ZSBhbmQgd3JpdGUgb3V0IHRoZSBzZWN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyB1c2UgdGhlCi0gICAgIHN5bWJvbCBtYXAgY3JlYXRlZCBieSBhb3V0X2xpbmtfd3JpdGVfc3ltYm9scy4gIFRoZSBsaW5rZXJfbWFyawotICAgICBmaWVsZCB3aWxsIGJlIHNldCBpZiB0aGVzZSBzZWN0aW9ucyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgIGxpbmssIHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgdGhlIGNhc2UuICAqLwotICBpZiAob2JqX3RleHRzZWMgKGlucHV0X2JmZCktPmxpbmtlcl9tYXJrKQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uIChmaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgb2JqX3RleHRzZWMgKGlucHV0X2JmZCksCi0JCQkJICAgICAmZmluZm8tPnRyZWxvZmYsCi0JCQkJICAgICBleGVjX2hkciAoaW5wdXRfYmZkKS0+YV90cnNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKS0+bGlua2VyX21hcmspCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb24gKGZpbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICZmaW5mby0+ZHJlbG9mZiwKLQkJCQkgICAgIGV4ZWNfaGRyIChpbnB1dF9iZmQpLT5hX2Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IGtlZXBpbmcgbWVtb3J5LCB3ZSBkb24ndCBuZWVkIHRoZSBzeW1ib2xzIGFueQotICAgICBsb25nZXIuICBXZSBzdGlsbCBuZWVkIHRoZW0gaWYgd2UgYXJlIGtlZXBpbmcgbWVtb3J5LCBiZWNhdXNlIHRoZQotICAgICBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIHBvaW50IGludG8gdGhlbS4gICovCi0gIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhbmQgd3JpdGUgb3V0IHRoZSBzeW1ib2xzIGZvciBhbiBhLm91dCBmaWxlLiAgU2V0IHRoZSBuZXcKLSAgIHN5bWJvbCBpbmRpY2VzIGludG8gYSBzeW1ib2xfbWFwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua193cml0ZV9zeW1ib2xzIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLSAgY2hhciAqc3RyaW5nczsKLSAgZW51bSBiZmRfbGlua19zdHJpcCBzdHJpcDsKLSAgZW51bSBiZmRfbGlua19kaXNjYXJkIGRpc2NhcmQ7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqb3V0c3ltOwotICBiZmRfc2l6ZV90eXBlIHN0cnRhYl9pbmRleDsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW07Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGludCAqc3ltYm9sX21hcDsKLSAgYm9vbGVhbiBwYXNzOwotICBib29sZWFuIHNraXBfbmV4dDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoaW5wdXRfYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7Ci0gIHN0cmlwID0gZmluZm8tPmluZm8tPnN0cmlwOwotICBkaXNjYXJkID0gZmluZm8tPmluZm8tPmRpc2NhcmQ7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRwdXRfc3ltczsKLQotICAvKiBGaXJzdCB3cml0ZSBvdXQgYSBzeW1ib2wgZm9yIHRoaXMgb2JqZWN0IGZpbGUsIHVubGVzcyB3ZSBhcmUKLSAgICAgZGlzY2FyZGluZyBzdWNoIHN5bWJvbHMuICAqLwotICBpZiAoc3RyaXAgIT0gc3RyaXBfYWxsCi0gICAgICAmJiAoc3RyaXAgIT0gc3RyaXBfc29tZQotCSAgfHwgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBpbnB1dF9iZmQtPmZpbGVuYW1lLAotCQkJICAgICAgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotICAgICAgJiYgZGlzY2FyZCAhPSBkaXNjYXJkX2FsbCkKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgTl9URVhULCBvdXRzeW0tPmVfdHlwZSk7Ci0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX290aGVyKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG91dHN5bS0+ZV9kZXNjKTsKLSAgICAgIHN0cnRhYl9pbmRleCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsCi0JCQkJICAgICAgIGlucHV0X2JmZC0+ZmlsZW5hbWUsIGZhbHNlKTsKLSAgICAgIGlmIChzdHJ0YWJfaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBzdHJ0YWJfaW5kZXgsIG91dHN5bS0+ZV9zdHJ4KTsKLSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAotCQkoYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkgICAgICBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKS0+b3V0cHV0X3NlY3Rpb24pCi0JCSArIG9ial90ZXh0c2VjIChpbnB1dF9iZmQpLT5vdXRwdXRfb2Zmc2V0KSwKLQkJb3V0c3ltLT5lX3ZhbHVlKTsKLSAgICAgICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb3V0c3ltOwotICAgIH0KLQotICBwYXNzID0gZmFsc2U7Ci0gIHNraXBfbmV4dCA9IGZhbHNlOwotICBzeW0gPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBzeW1fZW5kID0gc3ltICsgc3ltX2NvdW50OwotICBzeW1faGFzaCA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKLSAgbWVtc2V0IChzeW1ib2xfbWFwLCAwLCBzeW1fY291bnQgKiBzaXplb2YgKnN5bWJvbF9tYXApOwotICBmb3IgKDsgc3ltIDwgc3ltX2VuZDsgc3ltKyssIHN5bV9oYXNoKyssIHN5bWJvbF9tYXArKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgaW50IHR5cGU7Ci0gICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBhc2VjdGlvbiAqc3ltc2VjOwotICAgICAgYmZkX3ZtYSB2YWwgPSAwOwotICAgICAgYm9vbGVhbiBjb3B5OwotCi0gICAgICAvKiBXZSBzZXQgKnN5bWJvbF9tYXAgdG8gMCBhYm92ZSBmb3IgYWxsIHN5bWJvbHMuICBJZiBpdCBoYXMKLSAgICAgICAgIGFscmVhZHkgYmVlbiBzZXQgdG8gLTEgZm9yIHRoaXMgc3ltYm9sLCBpdCBtZWFucyB0aGF0IHdlIGFyZQotICAgICAgICAgZGlzY2FyZGluZyBpdCBiZWNhdXNlIGl0IGFwcGVhcnMgaW4gYSBkdXBsaWNhdGUgaGVhZGVyIGZpbGUuCi0gICAgICAgICBTZWUgdGhlIE5fQklOQ0wgY29kZSBiZWxvdy4gICovCi0gICAgICBpZiAoKnN5bWJvbF9tYXAgPT0gLTEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgKnN5bWJvbF9tYXAgdG8gLTEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN5bWJvbCB3YXMKLSAgICAgICAgIG5vdCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSB3aWxsIGNoYW5nZSBpdCBsYXRlciBpZgotICAgICAgICAgd2UgZG8gY29weSB0aGUgc3ltYm9sIG92ZXIuICAqLwotICAgICAgKnN5bWJvbF9tYXAgPSAtMTsKLQotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV90eXBlKTsKLSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3N0cngpOwotCi0gICAgICBoID0gTlVMTDsKLQotICAgICAgaWYgKHBhc3MpCi0JewotCSAgLyogUGFzcyB0aGlzIHN5bWJvbCB0aHJvdWdoLiAgSXQgaXMgdGhlIHRhcmdldCBvZiBhbgotCSAgICAgaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuICAqLwotCSAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKLQkgIHBhc3MgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChza2lwX25leHQpCi0JewotCSAgLyogU2tpcCB0aGlzIHN5bWJvbCwgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdAotCSAgICAgc3ltYm9sIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkIHRvIG5vIGxvbmdlciBiZSBhbiBpbmRpcmVjdAotCSAgICAgc3ltYm9sLiAgKi8KLQkgIHNraXBfbmV4dCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaHJlc29sdmU7Ci0KLQkgIC8qIFdlIGhhdmUgc2F2ZWQgdGhlIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sLCBpZgotCSAgICAgdGhlcmUgaXMgb25lLiAgTm90ZSB0aGF0IHdlIGNvdWxkIGp1c3QgbG9vayBpdCB1cCBhZ2FpbgotCSAgICAgaW4gdGhlIGhhc2ggdGFibGUsIHByb3ZpZGVkIHdlIGZpcnN0IGNoZWNrIHRoYXQgaXQgaXMgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbC4gKi8KLQkgIGggPSAqc3ltX2hhc2g7Ci0KLQkgIC8qIFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoIHRhYmxlLCBpbiBjYXNlIHRoZSBzeW1ib2wgd2FzCi0gICAgICAgICAgICAgd3JhcHBlZC4gICovCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQotCSAgLyogSWYgdGhpcyBpcyBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbCwgdGhlbiBjaGFuZ2UKLQkgICAgIGhyZXNvbHZlIHRvIHRoZSBiYXNlIHN5bWJvbC4gIFdlIGFsc28gY2hhbmdlICpzeW1faGFzaCBzbwotCSAgICAgdGhhdCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lcyByZWxvY2F0ZSBhZ2FpbnN0IHRoZSByZWFsCi0JICAgICBzeW1ib2wuICAqLwotCSAgaHJlc29sdmUgPSBoOwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykpCi0JICAgIHsKLQkgICAgICBocmVzb2x2ZSA9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgICAgICB3aGlsZSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgICAgfHwgaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCWhyZXNvbHZlID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkJCSAgICBocmVzb2x2ZS0+cm9vdC51LmkubGluayk7Ci0JICAgICAgKnN5bV9oYXNoID0gaHJlc29sdmU7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LCBza2lwIGl0LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3dhcm5pbmcKLQkgICAgICAmJiBoLT53cml0dGVuKQotCSAgICB7Ci0JICAgICAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0lORFIKLQkJICB8fCB0eXBlID09IE5fV0FSTklORykKLQkJc2tpcF9uZXh0ID0gdHJ1ZTsKLQkgICAgICAqc3ltYm9sX21hcCA9IGgtPmluZHg7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogU2VlIGlmIHdlIGFyZSBzdHJpcHBpbmcgdGhpcyBzeW1ib2wuICAqLwotCSAgc2tpcCA9IGZhbHNlOwotCSAgc3dpdGNoIChzdHJpcCkKLQkgICAgewotCSAgICBjYXNlIHN0cmlwX25vbmU6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2Ugc3RyaXBfZGVidWdnZXI6Ci0JICAgICAgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzdHJpcF9zb21lOgotCSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkJICA9PSBOVUxMKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzdHJpcF9hbGw6Ci0JICAgICAgc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChza2lwKQotCSAgICB7Ci0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQloLT53cml0dGVuID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotCSAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX1RFWFQKLQkgICAgICB8fCB0eXBlID09IE5fV0VBS1QpCi0JICAgIHN5bXNlYyA9IG9ial90ZXh0c2VjIChpbnB1dF9iZmQpOwotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fREFUQQotCQkgICB8fCB0eXBlID09IE5fV0VBS0QpCi0JICAgIHN5bXNlYyA9IG9ial9kYXRhc2VjIChpbnB1dF9iZmQpOwotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQlNTCi0JCSAgIHx8IHR5cGUgPT0gTl9XRUFLQikKLQkgICAgc3ltc2VjID0gb2JqX2Jzc3NlYyAoaW5wdXRfYmZkKTsKLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0FCUwotCQkgICB8fCB0eXBlID09IE5fV0VBS0EpCi0JICAgIHN5bXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmICgoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUgotCQkgICAgJiYgKGhyZXNvbHZlID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkJfHwgKGhyZXNvbHZlLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgJiYgaHJlc29sdmUtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJCSAgICAmJiBocmVzb2x2ZS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKSkpCi0JCSAgIHx8IHR5cGUgPT0gTl9XQVJOSU5HKQotCSAgICB7Ci0JICAgICAgLyogUGFzcyB0aGUgbmV4dCBzeW1ib2wgdGhyb3VnaCB1bmNoYW5nZWQuICBUaGUKLQkJIGNvbmRpdGlvbiBhYm92ZSBmb3IgaW5kaXJlY3Qgc3ltYm9scyBpcyBzbyB0aGF0IGlmCi0JCSB0aGUgaW5kaXJlY3Qgc3ltYm9sIHdhcyBkZWZpbmVkLCB3ZSBvdXRwdXQgaXQgd2l0aAotCQkgdGhlIGNvcnJlY3QgZGVmaW5pdGlvbiBzbyB0aGUgZGVidWdnZXIgd2lsbAotCQkgdW5kZXJzdGFuZCBpdC4gICovCi0JICAgICAgcGFzcyA9IHRydWU7Ci0JICAgICAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKLQkgICAgICBzeW1zZWMgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fU1RBQikgIT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSk7Ci0JICAgICAgc3ltc2VjID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2l0aCBhbiBpbmRpcmVjdCBzeW1ib2wsIGl0IG1lYW5zIHRoYXQKLQkJIHdlIGFyZSBvdXRwdXR0aW5nIGl0IHdpdGggYSByZWFsIGRlZmluaXRpb24uICBJbiBzdWNoCi0JCSBhIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gb3V0cHV0IHRoZSBuZXh0IHN5bWJvbCwKLQkJIHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGluZGlyZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUikKLQkJc2tpcF9uZXh0ID0gdHJ1ZTsKLQotCSAgICAgIHN5bXNlYyA9IE5VTEw7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgaGFzaCB0YWJsZS4gIFdlIHVzZQotCQkgaHJlc29sdmUgc28gdGhhdCBpZiB3ZSBoYXZlIGRlZmluZWQgYW4gaW5kaXJlY3QKLQkJIHN5bWJvbCB3ZSBvdXRwdXQgdGhlIGZpbmFsIGRlZmluaXRpb24uICAqLwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJewotCQkgIHN3aXRjaCAodHlwZSAmIE5fVFlQRSkKLQkJICAgIHsKLQkJICAgIGNhc2UgTl9TRVRUOgotCQkgICAgICBzeW1zZWMgPSBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIE5fU0VURDoKLQkJICAgICAgc3ltc2VjID0gb2JqX2RhdGFzZWMgKGlucHV0X2JmZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBOX1NFVEI6Ci0JCSAgICAgIHN5bXNlYyA9IG9ial9ic3NzZWMgKGlucHV0X2JmZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBOX1NFVEE6Ci0JCSAgICAgIHN5bXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgdmFsID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAgfHwgaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBUaGlzIGNhc2UgdXN1YWxseSBtZWFucyBhIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2FzCi0JCSAgICAgdHVybmVkIGludG8gYSBkZWZpbmVkIHN5bWJvbC4gICovCi0JCSAgaW5wdXRfc2VjdGlvbiA9IGhyZXNvbHZlLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgb3V0cHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICBCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCQkJICAgICAgfHwgb3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCQkgIHZhbCA9IChocmVzb2x2ZS0+cm9vdC51LmRlZi52YWx1ZQotCQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pCi0JCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkgIC8qIEdldCB0aGUgY29ycmVjdCB0eXBlIGJhc2VkIG9uIHRoZSBzZWN0aW9uLiAgSWYKLQkJICAgICB0aGlzIGlzIGEgY29uc3RydWN0ZWQgc2V0LCBmb3JjZSBpdCB0byBiZQotCQkgICAgIGdsb2JhbGx5IHZpc2libGUuICAqLwotCQkgIGlmICh0eXBlID09IE5fU0VUVAotCQkgICAgICB8fCB0eXBlID09IE5fU0VURAotCQkgICAgICB8fCB0eXBlID09IE5fU0VUQgotCQkgICAgICB8fCB0eXBlID09IE5fU0VUQSkKLQkJICAgIHR5cGUgfD0gTl9FWFQ7Ci0KLQkJICB0eXBlICY9fiBOX1RZUEU7Ci0KLQkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX1RFWFQKLQkJCSAgICAgOiBOX1dFQUtUKTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICA/IE5fREFUQQotCQkJICAgICA6IE5fV0VBS0QpOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX0JTUwotCQkJICAgICA6IE5fV0VBS0IpOwotCQkgIGVsc2UKLQkJICAgIHR5cGUgfD0gKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgID8gTl9BQlMKLQkJCSAgICAgOiBOX1dFQUtBKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JCXZhbCA9IGhyZXNvbHZlLT5yb290LnUuYy5zaXplOwotCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXsKLQkJICB2YWwgPSAwOwotCQkgIHR5cGUgPSBOX1dFQUtVOwotCQl9Ci0JICAgICAgZWxzZQotCQl2YWwgPSAwOwotCSAgICB9Ci0JICBpZiAoc3ltc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICB2YWwgPSAoc3ltc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3ltc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSkKLQkJICAgICAgLSBzeW1zZWMtPnZtYSkpOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCBzZXQgdGhlIHdyaXR0ZW4gZmxhZywgYW5kIGlmCi0JICAgICBpdCBpcyBhIGxvY2FsIHN5bWJvbCBzZWUgaWYgd2Ugc2hvdWxkIGRpc2NhcmQgaXQuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgaC0+d3JpdHRlbiA9IHRydWU7Ci0JICAgICAgaC0+aW5keCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVFQKLQkJICAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VURAotCQkgICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRCCi0JCSAgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEEpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGRpc2NhcmQpCi0JCXsKLQkJY2FzZSBkaXNjYXJkX25vbmU6Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9sOgotCQkgIGlmICgodHlwZSAmIE5fU1RBQikgPT0gMAotCQkgICAgICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlIGRpc2NhcmRfYWxsOgotCQkgIHNraXAgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaWYgKHNraXApCi0JCXsKLQkJICBwYXNzID0gZmFsc2U7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBBbiBOX0JJTkNMIHN5bWJvbCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBzdGFicwotCSAgICAgZW50cmllcyBmb3IgYSBoZWFkZXIgZmlsZS4gIFdlIG5lZWQgdG8gc2NhbiBhaGVhZCB0byB0aGUKLQkgICAgIG5leHQgTl9FSU5DTCBzeW1ib2wsIGlnbm9yaW5nIG5lc3RpbmcsIGFkZGluZyB1cCBhbGwgdGhlCi0JICAgICBjaGFyYWN0ZXJzIGluIHRoZSBzeW1ib2wgbmFtZXMsIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUKLQkgICAgIG51bWJlcnMgaW4gdHlwZXMgKHRoZSBmaXJzdCBudW1iZXIgYWZ0ZXIgYW4gb3BlbgotCSAgICAgcGFyZW50aGVzaXMpLiAgKi8KLQkgIGlmICh0eXBlID09IE5fQklOQ0wpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmluY2xfc3ltOwotCSAgICAgIGludCBuZXN0OwotCSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKmluY2xfZW50cnk7Ci0JICAgICAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKnQ7Ci0KLQkgICAgICB2YWwgPSAwOwotCSAgICAgIG5lc3QgPSAwOwotCSAgICAgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyAxOyBpbmNsX3N5bSA8IHN5bV9lbmQ7IGluY2xfc3ltKyspCi0JCXsKLQkJICBpbnQgaW5jbF90eXBlOwotCi0JCSAgaW5jbF90eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfdHlwZSk7Ci0JCSAgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQkgICAgewotCQkgICAgICBpZiAobmVzdCA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICAgIC0tbmVzdDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJICAgICsrbmVzdDsKLQkJICBlbHNlIGlmIChuZXN0ID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLQkJICAgICAgcyA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBpbmNsX3N5bS0+ZV9zdHJ4KTsKLQkJICAgICAgZm9yICg7ICpzICE9ICdcMCc7IHMrKykKLQkJCXsKLQkJCSAgdmFsICs9ICpzOwotCQkJICBpZiAoKnMgPT0gJygnKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLQkJCSAgICAgICsrczsKLQkJCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkJCSsrczsKLQkJCSAgICAgIC0tczsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIGhlYWRlciBmaWxlIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgIHNhbWUgdmFsdWUsIHRoZW4gcmVwbGFjZSB0aGlzIG9uZSB3aXRoIGFuIE5fRVhDTAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGNvcHkgPSAhIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeTsKLQkgICAgICBpbmNsX2VudHJ5ID0gYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCAoJmZpbmZvLT5pbmNsdWRlcywKLQkJCQkJCSAgICAgIG5hbWUsIHRydWUsIGNvcHkpOwotCSAgICAgIGlmIChpbmNsX2VudHJ5ID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBmb3IgKHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JCWlmICh0LT50b3RhbCA9PSB2YWwpCi0JCSAgYnJlYWs7Ci0JICAgICAgaWYgKHQgPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBzZWVuIHRoaXMgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICBmaWxlIHdpdGggdGhpcyBzZXQgb2Ygc3RhYnMgc3RyaW5ncy4gICovCi0JCSAgdCA9ICgoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKikKLQkJICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmZmluZm8tPmluY2x1ZGVzLnJvb3QsCi0JCQkJCSAgc2l6ZW9mICp0KSk7Ci0JCSAgaWYgKHQgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB0LT50b3RhbCA9IHZhbDsKLQkJICB0LT5uZXh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOwotCQkgIGluY2xfZW50cnktPnRvdGFscyA9IHQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgKmluY2xfbWFwOwotCi0JCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBoZWFkZXIgZmlsZS4gIFdlIG11c3QgY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgICBpdCB0byBiZSBhbiBOX0VYQ0wgZW50cnksIGFuZCBtYXJrIGFsbCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIHN5bWJvbHMgdG8gcHJldmVudCBvdXRwdXR0aW5nIHRoZW0uICAqLwotCQkgIHR5cGUgPSBOX0VYQ0w7Ci0KLQkJICBuZXN0ID0gMDsKLQkJICBmb3IgKGluY2xfc3ltID0gc3ltICsgMSwgaW5jbF9tYXAgPSBzeW1ib2xfbWFwICsgMTsKLQkJICAgICAgIGluY2xfc3ltIDwgc3ltX2VuZDsKLQkJICAgICAgIGluY2xfc3ltKyssIGluY2xfbWFwKyspCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbmNsX3R5cGU7Ci0KLQkJICAgICAgaW5jbF90eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfdHlwZSk7Ci0JCSAgICAgIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKLQkJCXsKLQkJCSAgaWYgKG5lc3QgPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICAqaW5jbF9tYXAgPSAtMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgLS1uZXN0OwotCQkJfQotCQkgICAgICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJCSsrbmVzdDsKLQkJICAgICAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQkJKmluY2xfbWFwID0gLTE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogQ29weSB0aGlzIHN5bWJvbCBpbnRvIHRoZSBsaXN0IG9mIHN5bWJvbHMgd2UgYXJlIGdvaW5nIHRvCi0JIHdyaXRlIG91dC4gICovCi0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgdHlwZSwgb3V0c3ltLT5lX3R5cGUpOwotICAgICAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV9vdGhlciksCi0JCSAgIG91dHN5bS0+ZV9vdGhlcik7Ci0gICAgICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIGJmZF9oX2dldF8xNiAoaW5wdXRfYmZkLCBzeW0tPmVfZGVzYyksCi0JCSAgICBvdXRzeW0tPmVfZGVzYyk7Ci0gICAgICBjb3B5ID0gZmFsc2U7Ci0gICAgICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0JewotCSAgLyogbmFtZSBwb2ludHMgaW50byBhIHN0cmluZyB0YWJsZSB3aGljaCB3ZSBhcmUgZ29pbmcgdG8KLQkgICAgIGZyZWUuICBJZiB0aGVyZSBpcyBhIGhhc2ggdGFibGUgZW50cnksIHVzZSB0aGF0IHN0cmluZy4KLQkgICAgIE90aGVyd2lzZSwgY29weSBuYW1lIGludG8gbWVtb3J5LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIGNvcHkgPSB0cnVlOwotCX0KLSAgICAgIHN0cnRhYl9pbmRleCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsCi0JCQkJICAgICAgIG5hbWUsIGNvcHkpOwotICAgICAgaWYgKHN0cnRhYl9pbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHN0cnRhYl9pbmRleCwgb3V0c3ltLT5lX3N0cngpOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLT5lX3ZhbHVlKTsKLSAgICAgICpzeW1ib2xfbWFwID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb3V0c3ltOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIG91dHB1dCBzeW1ib2xzIHdlIGhhdmUganVzdCBjb25zdHJ1Y3RlZC4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0cHV0X3N5bXMpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBvdXRzeW1fY291bnQ7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgZmluZm8tPnN5bW9mZiwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb3V0c3ltX2NvdW50ID0gb3V0c3ltIC0gZmluZm8tPm91dHB1dF9zeW1zOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZmluZm8tPm91dHB1dF9zeW1zLAotCQkgICAgIChiZmRfc2l6ZV90eXBlKSBFWFRFUk5BTF9OTElTVF9TSVpFLAotCQkgICAgIChiZmRfc2l6ZV90eXBlKSBvdXRzeW1fY291bnQsIG91dHB1dF9iZmQpCi0JICAhPSBvdXRzeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZpbmZvLT5zeW1vZmYgKz0gb3V0c3ltX2NvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN5bWJvbCB0aGF0IHdhcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGEub3V0IGlucHV0Ci0gICBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBpbnQgdHlwZTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBvdXRzeW07Ci0gIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0KLSAgaWYgKGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+d3JpdGVfZHluYW1pY19zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCphb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPndyaXRlX2R5bmFtaWNfc3ltYm9sKQotCSAgICAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBoKSkpCi0JewotCSAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPndyaXR0ZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+d3JpdHRlbiA9IHRydWU7Ci0KLSAgLyogQW4gaW5keCBvZiAtMiBtZWFucyB0aGUgc3ltYm9sIG11c3QgYmUgd3JpdHRlbi4gICovCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIC8qIEF2b2lkIHZhcmlhYmxlIG5vdCBpbml0aWFsaXplZCB3YXJuaW5ncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBzZXQgc3ltYm9scyB3aGVuIHNldHMgYXJlIG5vdCBiZWluZwotICAgICAgICAgYnVpbHQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2VjOwotCi0Jc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQlCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLQkJICAgIHx8IHNlYy0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0JaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fVEVYVCA6IE5fV0VBS1Q7Ci0JZWxzZSBpZiAoc2VjID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9EQVRBIDogTl9XRUFLRDsKLQllbHNlIGlmIChzZWMgPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fQlNTIDogTl9XRUFLQjsKLQllbHNlCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fQUJTIDogTl9XRUFLQTsKLQl0eXBlIHw9IE5fRVhUOwotCXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JICAgICAgICsgc2VjLT52bWEKLQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IGgtPnJvb3QudS5jLnNpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgdHlwZSA9IE5fV0VBS1U7Ci0gICAgICB2YWwgPSAwOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCB0eXBlLCBvdXRzeW0uZV90eXBlKTsKLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIDAsIG91dHN5bS5lX290aGVyKTsKLSAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0uZV9kZXNjKTsKLSAgaW5keCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgICBmYWxzZSk7Ci0gIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIGhhbmRsZSBlcnJvcnMuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBQVVRfV09SRCAob3V0cHV0X2JmZCwgaW5keCwgb3V0c3ltLmVfc3RyeCk7Ci0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWwsIG91dHN5bS5lX3ZhbHVlKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIGZpbmZvLT5zeW1vZmYsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZvdXRzeW0sIChiZmRfc2l6ZV90eXBlKSBFWFRFUk5BTF9OTElTVF9TSVpFLAotCQkgICAgKGJmZF9zaXplX3R5cGUpIDEsIG91dHB1dF9iZmQpICE9IEVYVEVSTkFMX05MSVNUX1NJWkUpCi0gICAgewotICAgICAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBmaW5mby0+c3ltb2ZmICs9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIGgtPmluZHggPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICArK29ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExpbmsgYW4gYS5vdXQgc2VjdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfc2VjdGlvbiAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2ZmX3B0ciwKLQkJCSByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBmaWxlX3B0ciAqcmVsb2ZmX3B0cjsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgYmZkX3NpemVfdHlwZSBpbnB1dF9zaXplOwotICBQVFIgcmVsb2NzOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlucHV0X3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIChQVFIpIGZpbmZvLT5jb250ZW50cywKLQkJCQkgIChmaWxlX3B0cikgMCwgaW5wdXRfc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlYWQgaW4gdGhlIHJlbG9jcyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBpdC4gICovCi0gIGlmIChhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbikgIT0gTlVMTAotICAgICAgJiYgYW91dF9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MgIT0gTlVMTCkKLSAgICByZWxvY3MgPSBhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jczsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jcyA9IGZpbmZvLT5yZWxvY3M7Ci0gICAgICBpZiAocmVsX3NpemUgPiAwKQotCXsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxfc2l6ZSwgaW5wdXRfYmZkKSAhPSByZWxfc2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzLAotCQkJCQkgcmVsX3NpemUsIGZpbmZvLT5jb250ZW50cykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkJIHJlbF9zaXplLCBmaW5mby0+Y29udGVudHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgZmluZm8tPmNvbnRlbnRzLAotCQkJCSAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJCQkgIGlucHV0X3NpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZSByZWxvY3Mgd2VyZQotICAgICBtb2RpZmllZCwgYW5kIHdlIG5vdyB3cml0ZSB0aGVtIG91dC4gICovCi0gIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlICYmIHJlbF9zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGZpbmZvLT5vdXRwdXRfYmZkLCAqcmVsb2ZmX3B0ciwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF93cml0ZSAocmVsb2NzLCAoYmZkX3NpemVfdHlwZSkgMSwgcmVsX3NpemUsIGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgIT0gcmVsX3NpemUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgKnJlbG9mZl9wdHIgKz0gcmVsX3NpemU7Ci0KLSAgICAgIC8qIEFzc2VydCB0aGF0IHRoZSByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIHN5bWJvbHMsIGFuZAotCSB0aGF0IGlmIHRoZXNlIGFyZSB0aGUgdGV4dCByZWxvY3MgdGhleSBoYXZlIG5vdCBydW4gaW50byB0aGUKLQkgZGF0YSByZWxvY3MuICAqLwotICAgICAgQkZEX0FTU0VSVCAoKnJlbG9mZl9wdHIgPD0gb2JqX3N5bV9maWxlcG9zIChmaW5mby0+b3V0cHV0X2JmZCkKLQkJICAmJiAocmVsb2ZmX3B0ciAhPSAmZmluZm8tPnRyZWxvZmYKLQkJICAgICAgfHwgKCpyZWxvZmZfcHRyCi0JCQkgIDw9IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCktPnJlbF9maWxlcG9zKSkpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWxvYyBpbmRleC4gICovCi0KLXN0YXRpYyBJTkxJTkUgYXNlY3Rpb24gKgotYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChhYmZkLCBpbmR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpbmR4OwotewotICBzd2l0Y2ggKGluZHggJiBOX1RZUEUpCi0gICAgewotICAgIGNhc2UgTl9URVhUOgotICAgICAgcmV0dXJuIG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHJldHVybiBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgY2FzZSBOX0JTUzoKLSAgICAgIHJldHVybiBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICBjYXNlIE5fQUJTOgotICAgIGNhc2UgTl9VTkRGOgotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogUmVsb2NhdGUgYW4gYS5vdXQgc2VjdGlvbiB1c2luZyBzdGFuZGFyZCBhLm91dCByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY3MsCi0JCQkgICAgIHJlbF9zaXplLCBjb250ZW50cykKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgYm9vbGVhbiAoKmNoZWNrX2R5bmFtaWNfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCSAgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCi0JCQkJCSAgYmZkX3ZtYSAqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltczsKLSAgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgaW50ICpzeW1ib2xfbWFwOwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OwotICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWw7Ci0gIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbF9lbmQ7Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICBjaGVja19keW5hbWljX3JlbG9jID0gYW91dF9iYWNrZW5kX2luZm8gKG91dHB1dF9iZmQpLT5jaGVja19keW5hbWljX3JlbG9jOwotCi0gIEJGRF9BU1NFUlQgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcik7Ci0KLSAgcmVsb2NhdGVhYmxlID0gZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZTsKLSAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChpbnB1dF9iZmQpOwotICBzeW1faGFzaGVzID0gb2JqX2FvdXRfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgc3ltYm9sX21hcCA9IGZpbmZvLT5zeW1ib2xfbWFwOwotCi0gIHJlbG9jX2NvdW50ID0gcmVsX3NpemUgLyBSRUxPQ19TVERfU0laRTsKLSAgcmVsID0gcmVsb2NzOwotICByZWxfZW5kID0gcmVsICsgcmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHJfYWRkcjsKLSAgICAgIGludCByX2luZGV4OwotICAgICAgaW50IHJfZXh0ZXJuOwotICAgICAgaW50IHJfcGNyZWw7Ci0gICAgICBpbnQgcl9iYXNlcmVsID0gMDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX2FkZHIgPSBHRVRfU1dPUkQgKGlucHV0X2JmZCwgcmVsLT5yX2FkZHJlc3MpOwotCi0jaWZkZWYgTVlfcmVsb2NfaG93dG8KLSAgICAgIGhvd3RvID0gTVlfcmVsb2NfaG93dG8oaW5wdXRfYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKTsKLSNlbHNlICAgICAgCi0gICAgICB7Ci0JaW50IHJfam1wdGFibGU7Ci0JaW50IHJfcmVsYXRpdmU7Ci0JaW50IHJfbGVuZ3RoOwotCXVuc2lnbmVkIGludCBob3d0b19pZHg7Ci0KLQlpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCSAgewotCSAgICByX2luZGV4ICAgPSAgKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCQkgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0JICAgIHJfZXh0ZXJuICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLQkgICAgcl9wY3JlbCAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0JICAgIHJfYmFzZXJlbCA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7Ci0JICAgIHJfam1wdGFibGU9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotCSAgICByX3JlbGF0aXZlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcpKTsKLQkgICAgcl9sZW5ndGggID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0JCQkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICByX2luZGV4ICAgPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJCSB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSB8IHJlbC0+cl9pbmRleFswXSk7Ci0JICAgIHJfZXh0ZXJuICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLQkgICAgcl9wY3JlbCAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0JICAgIHJfYmFzZXJlbCA9ICgwICE9IChyZWwtPnJfdHlwZVswXQotCQkJICAgICAgICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpKTsKLQkgICAgcl9qbXB0YWJsZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCi0JCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKLQkgICAgcl9yZWxhdGl2ZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCi0JCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUpKTsKLQkgICAgcl9sZW5ndGggID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpCi0JCQkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0JICB9Ci0KLQlob3d0b19pZHggPSAocl9sZW5ndGggKyA0ICogcl9wY3JlbCArIDggKiByX2Jhc2VyZWwKLQkJICAgICArIDE2ICogcl9qbXB0YWJsZSArIDMyICogcl9yZWxhdGl2ZSk7Ci0JQkZEX0FTU0VSVCAoaG93dG9faWR4IDwgVEFCTEVfU0laRSAoaG93dG9fdGFibGVfc3RkKSk7Ci0JaG93dG8gPSBob3d0b190YWJsZV9zdGQgKyBob3d0b19pZHg7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSwgYW5kIG11c3QKLQkgICAgIG1vZGlmeSB0aGUgcmVsb2MgYWNjb3JkaW5nbHkuICAqLwotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2Uga25vdyB0aGUgc3ltYm9sIHRoaXMgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0LAotCQkgY29udmVydCBpdCBpbnRvIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoaXMKLQkJIGlzIHdoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgZG9lcy4gICovCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBDaGFuZ2UgdGhlIHJfZXh0ZXJuIHZhbHVlLiAgKi8KLQkJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOwotCQkgIGVsc2UKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX2luZGV4LiAgKi8KLQkJICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fREFUQTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0JTUzsKLQkJICBlbHNlCi0JCSAgICByX2luZGV4ID0gTl9BQlM7Ci0KLQkJICAvKiBBZGQgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZQotCQkgICAgIGFkZGVuZCBzdG9yZWQgaW4gdGhlIGNvbnRlbnRzLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIG91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNoYW5nZSByX2luZGV4IGFjY29yZGluZyB0byB0aGUgc3ltYm9sCi0JCSAgICAgbWFwLiAgKi8KLQkJICByX2luZGV4ID0gc3ltYm9sX21hcFtyX2luZGV4XTsKLQotCQkgIGlmIChyX2luZGV4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQkJewotCQkJICAvKiBXZSBkZWNpZGVkIHRvIHN0cmlwIHRoaXMgc3ltYm9sLCBidXQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QuICBOb3RlIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24gaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBkb24ndCB0aGluayB0aGF0IHdpbGwgZXZlciBtYXR0ZXIgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbC4gICovCi0JCQkgIGlmIChoLT5pbmR4IDwgMCkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5pbmR4ID0gLTI7Ci0JCQkgICAgICBoLT53cml0dGVuID0gZmFsc2U7Ci0JCQkgICAgICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLAotCQkJCQkJCQkgIChQVFIpIGZpbmZvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJICByX2luZGV4ID0gaC0+aW5keDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHJfYWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgcl9pbmRleCA9IDA7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9pbmRleCB2YWx1ZS4gICovCi0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgV2UgbXVzdAotCQkgYWRqdXN0IGJ5IHRoZSBhbW91bnQgdGhhdCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCi0JICAgICAgc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkgICAgICByZWxvY2F0aW9uID0gKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHNlY3Rpb24tPnZtYSk7Ci0JICAgIH0KLQotCSAgLyogQ2hhbmdlIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLQkgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAotCQkgICAgcl9hZGRyICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHJlbC0+cl9hZGRyZXNzKTsKLQotCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlCi0JICAgICB0byB0aGUgb3JpZ2luYWwgYWRkcmVzcyBpbiB0aGUgc2VjdGlvbiBhbmQgaW5jbHVkaW5nIHRoZQotCSAgICAgcmVmZXJlbmNlIHRvIHRoZSBuZXcgYWRkcmVzcy4gICovCi0JICBpZiAocl9wY3JlbCkKLQkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSNpZmRlZiBNWV9yZWxvY2F0YWJsZV9yZWxvYwotCSAgTVlfcmVsb2NhdGFibGVfcmVsb2MgKGhvd3RvLCBvdXRwdXRfYmZkLCByZWwsIHJlbG9jYXRpb24sIHJfYWRkcik7Ci0jZW5kaWYKLQotCSAgaWYgKHJlbG9jYXRpb24gPT0gMCkKLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UKLQkgICAgciA9IE1ZX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQljb250ZW50cyArIHJfYWRkcik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJvb2xlYW4gaHVuZGVmOwotCi0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhbiBleGVjdXRhYmxlLCBhbmQgbXVzdCBkbyBhIGZ1bGwKLQkgICAgIHJlbG9jYXRpb24uICAqLwotCSAgaHVuZGVmID0gZmFsc2U7Ci0KLQkgIGlmIChyX2V4dGVybikKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCi0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGh1bmRlZiA9IHRydWU7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgICAgICBzZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gc2VjdGlvbi0+dm1hKTsKLQkgICAgICBpZiAocl9wY3JlbCkKLQkJcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIH0KLQotCSAgaWYgKGNoZWNrX2R5bmFtaWNfcmVsb2MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAgIGlmICghICgoKmNoZWNrX2R5bmFtaWNfcmVsb2MpCi0JCSAgICAgKGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGgsCi0JCSAgICAgIChQVFIpIHJlbCwgY29udGVudHMsICZza2lwLCAmcmVsb2NhdGlvbikpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKHNraXApCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE5vdyB3YXJuIGlmIGEgZ2xvYmFsIHN5bWJvbCBpcyB1bmRlZmluZWQuICBXZSBjb3VsZCBub3QKLSAgICAgICAgICAgICBkbyB0aGlzIGVhcmxpZXIsIGJlY2F1c2UgY2hlY2tfZHluYW1pY19yZWxvYyBtaWdodCB3YW50Ci0gICAgICAgICAgICAgdG8gc2tpcCB0aGlzIHJlbG9jLiAgKi8KLQkgIGlmIChodW5kZWYgJiYgISBmaW5mby0+aW5mby0+c2hhcmVkICYmICEgcl9iYXNlcmVsKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIGVsc2UKLQkJbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICByID0gTVlfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCi0JCQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGNvbnRlbnRzLCByX2FkZHIsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgKGJmZF92bWEpIDApOwotCX0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZSBpZiAocl9leHRlcm4pCi0JCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAotCQkJCQkgICAgIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpzOwotCi0JCSAgICBzID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCQkgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgcyk7Ci0JCSAgfQotCQlpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChmaW5mby0+aW5mbywgbmFtZSwgaG93dG8tPm5hbWUsCi0JCQkoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYW4gYS5vdXQgc2VjdGlvbiB1c2luZyBleHRlbmRlZCBhLm91dCByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0IChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY3MsCi0JCQkgICAgIHJlbF9zaXplLCBjb250ZW50cykKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgYm9vbGVhbiAoKmNoZWNrX2R5bmFtaWNfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCSAgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCi0JCQkJCSAgYmZkX3ZtYSAqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltczsKLSAgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgaW50ICpzeW1ib2xfbWFwOwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OwotICByZWdpc3RlciBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWw7Ci0gIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbF9lbmQ7Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICBjaGVja19keW5hbWljX3JlbG9jID0gYW91dF9iYWNrZW5kX2luZm8gKG91dHB1dF9iZmQpLT5jaGVja19keW5hbWljX3JlbG9jOwotCi0gIEJGRF9BU1NFUlQgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX0VYVF9TSVpFKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcik7Ci0KLSAgcmVsb2NhdGVhYmxlID0gZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZTsKLSAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChpbnB1dF9iZmQpOwotICBzeW1faGFzaGVzID0gb2JqX2FvdXRfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgc3ltYm9sX21hcCA9IGZpbmZvLT5zeW1ib2xfbWFwOwotCi0gIHJlbG9jX2NvdW50ID0gcmVsX3NpemUgLyBSRUxPQ19FWFRfU0laRTsKLSAgcmVsID0gcmVsb2NzOwotICByZWxfZW5kID0gcmVsICsgcmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHJfYWRkcjsKLSAgICAgIGludCByX2luZGV4OwotICAgICAgaW50IHJfZXh0ZXJuOwotICAgICAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgICAgIGJmZF92bWEgcl9hZGRlbmQ7Ci0gICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYXNlY3Rpb24gKnJfc2VjdGlvbiA9IE5VTEw7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgICAgIHJfYWRkciA9IEdFVF9TV09SRCAoaW5wdXRfYmZkLCByZWwtPnJfYWRkcmVzcyk7Ci0KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JewotCSAgcl9pbmRleCAgPSAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJICAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgICAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLQkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotCSAgcl90eXBlICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCi0JCSAgICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcl9pbmRleCAgPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJICAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgICAgIHwgcmVsLT5yX2luZGV4WzBdKTsKLQkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotCSAgcl90eXBlICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCi0JCSAgICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLQl9Ci0KLSAgICAgIHJfYWRkZW5kID0gR0VUX1NXT1JEIChpbnB1dF9iZmQsIHJlbC0+cl9hZGRlbmQpOwotCi0gICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9leHQpKTsKLQotICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSwgYW5kIG11c3QKLQkgICAgIG1vZGlmeSB0aGUgcmVsb2MgYWNjb3JkaW5nbHkuICAqLwotCSAgaWYgKHJfZXh0ZXJuCi0JICAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMAotCSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2Uga25vdyB0aGUgc3ltYm9sIHRoaXMgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0LAotCQkgY29udmVydCBpdCBpbnRvIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoaXMKLQkJIGlzIHdoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgZG9lcy4gICovCi0JICAgICAgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JCSAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQkJaCA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQloID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCQkgIC8qIENoYW5nZSB0aGUgcl9leHRlcm4gdmFsdWUuICAqLwotCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUc7Ci0JCSAgZWxzZQotCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEU7Ci0KLQkJICAvKiBDb21wdXRlIGEgbmV3IHJfaW5kZXguICAqLwotCQkgIG91dHB1dF9zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fVEVYVDsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9EQVRBOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fQlNTOwotCQkgIGVsc2UKLQkJICAgIHJfaW5kZXggPSBOX0FCUzsKLQotCQkgIC8qIEFkZCB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlCi0JCSAgICAgYWRkZW5kLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIG91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAvKiBOb3cgUkVMT0NBVElPTiBpcyB0aGUgVk1BIG9mIHRoZSBmaW5hbAotCQkgICAgIGRlc3RpbmF0aW9uLiAgSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLAotCQkgICAgIHRoZW4gQURERU5EIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgc291cmNlIFZNQS4KLQkJICAgICBXZSB3YW50IHRvIHNldCBBRERFTkQgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkgICAgIHRoZSBkZXN0aW5hdGlvbiBWTUEgYW5kIHRoZSBzb3VyY2UgVk1BLCB3aGljaAotCQkgICAgIG1lYW5zIHdlIG11c3QgYWRqdXN0IFJFTE9DQVRJT04gYnkgdGhlIGNoYW5nZSBpbgotCQkgICAgIHRoZSBzb3VyY2UgVk1BLiAgVGhpcyBpcyBkb25lIGJlbG93LiAgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIG11c3QgY2hhbmdlIHJfaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBzeW1ib2wKLQkJICAgICBtYXAuICAqLwotCQkgIHJfaW5kZXggPSBzeW1ib2xfbWFwW3JfaW5kZXhdOwotCi0JCSAgaWYgKHJfaW5kZXggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCQl7Ci0JCQkgIC8qIFdlIGRlY2lkZWQgdG8gc3RyaXAgdGhpcyBzeW1ib2wsIGJ1dCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvdXQgdGhhdCB3ZSBjYW4ndC4gIE5vdGUgdGhhdCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NlIHRoZSBvdGhlciBhbmQgZGVzYyBpbmZvcm1hdGlvbiBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGRvbid0IHRoaW5rIHRoYXQgd2lsbCBldmVyIG1hdHRlciBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLiAgKi8KLQkJCSAgaWYgKGgtPmluZHggPCAwKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmluZHggPSAtMjsKLQkJCSAgICAgIGgtPndyaXR0ZW4gPSBmYWxzZTsKLQkJCSAgICAgIGlmICghIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsCi0JCQkJCQkJCSAgKFBUUikgZmluZm8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0JCQkgIHJfaW5kZXggPSBoLT5pbmR4OwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAotCQkJCQkJICAgICBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgcl9hZGRyKSkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICByX2luZGV4ID0gMDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIHJlbG9jYXRpb24gPSAwOwotCi0JCSAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCB0aGVuIHRoZSBhZGRlbmQKLQkJICAgICBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIHNvdXJjZSBWTUEuICBXZSBtdXN0Ci0JCSAgICAgYWRqdXN0IGl0IGJ5IHRoZSBjaGFuZ2UgaW4gdGhlIHNvdXJjZSBWTUEuICBUaGlzCi0JCSAgICAgaXMgZG9uZSBiZWxvdy4gICovCi0JCX0KLQotCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbmV3IHJfaW5kZXggdmFsdWUuICAqLwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQl7Ci0JCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLQkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBXZSBtdXN0Ci0JCSBhZGp1c3QgYnkgdGhlIGFtb3VudCB0aGF0IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICByX3NlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChyX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcl9zZWN0aW9uLT52bWEpOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCB0aGVuIHRoZSBhZGRlbmQgaXMKLQkJIHRoZSBkaWZmZXJlbmNlIGluIFZNQSBiZXR3ZWVuIHRoZSBkZXN0aW5hdGlvbiBhbmQgdGhlCi0JCSBzb3VyY2UuICBXZSBoYXZlIGp1c3QgYWRqdXN0ZWQgZm9yIHRoZSBjaGFuZ2UgaW4gVk1BCi0JCSBvZiB0aGUgZGVzdGluYXRpb24sIHNvIHdlIG11c3QgYWxzbyBhZGp1c3QgYnkgdGhlCi0JCSBjaGFuZ2UgaW4gVk1BIG9mIHRoZSBzb3VyY2UuICBUaGlzIGlzIGRvbmUgYmVsb3cuICAqLwotCSAgICB9Ci0KLQkgIC8qIEFzIGRlc2NyaWJlZCBhYm92ZSwgd2UgbXVzdCBhbHdheXMgYWRqdXN0IGEgUEMgcmVsYXRpdmUKLQkgICAgIHJlbG9jIGJ5IHRoZSBjaGFuZ2UgaW4gVk1BIG9mIHRoZSBzb3VyY2UuICBIb3dldmVyLCBpZgotCSAgICAgcGNyZWxfb2Zmc2V0IGlzIHNldCwgdGhlbiB0aGUgYWRkZW5kIGRvZXMgbm90IGluY2x1ZGUgdGhlCi0JICAgICBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgbmVlZAotCSAgICAgdG8gYWRqdXN0IGFueXRoaW5nLiAgKi8KLQkgIGlmIChob3d0b190YWJsZV9leHRbcl90eXBlXS5wY19yZWxhdGl2ZQotCSAgICAgICYmICEgaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ucGNyZWxfb2Zmc2V0KQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgLyogQ2hhbmdlIHRoZSBhZGRlbmQgaWYgbmVjZXNzYXJ5LiAgKi8KLQkgIGlmIChyZWxvY2F0aW9uICE9IDApCi0JICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCByX2FkZGVuZCArIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotCi0JICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsCi0JCSAgICByX2FkZHIgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgcmVsLT5yX2FkZHJlc3MpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBib29sZWFuIGh1bmRlZjsKLQkgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhbiBleGVjdXRhYmxlLCBhbmQgbXVzdCBkbyBhIGZ1bGwKLQkgICAgIHJlbG9jYXRpb24uICAqLwotCSAgaHVuZGVmID0gZmFsc2U7Ci0KLQkgIGlmIChyX2V4dGVybikKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCi0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGh1bmRlZiA9IHRydWU7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocl90eXBlID09IFJFTE9DX0JBU0UxMAotCQkgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JCSAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bTsKLQkgICAgICBpbnQgdHlwZTsKLQotCSAgICAgIC8qIEZvciBiYXNlIHJlbGF0aXZlIHJlbG9jcywgcl9pbmRleCBpcyBhbHdheXMgYW4gaW5kZXgKLSAgICAgICAgICAgICAgICAgaW50byB0aGUgc3ltYm9sIHRhYmxlLCBldmVuIGlmIHJfZXh0ZXJuIGlzIDAuICAqLwotCSAgICAgIHN5bSA9IHN5bXMgKyByX2luZGV4OwotCSAgICAgIHR5cGUgPSBiZmRfaF9nZXRfOCAoaW5wdXRfYmZkLCBzeW0tPmVfdHlwZSk7Ci0JICAgICAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX1RFWFQKLQkJICB8fCB0eXBlID09IE5fV0VBS1QpCi0JCXJfc2VjdGlvbiA9IG9ial90ZXh0c2VjIChpbnB1dF9iZmQpOwotCSAgICAgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0RBVEEKLQkJICAgICAgIHx8IHR5cGUgPT0gTl9XRUFLRCkKLQkJcl9zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGlucHV0X2JmZCk7Ci0JICAgICAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQlNTCi0JCSAgICAgICB8fCB0eXBlID09IE5fV0VBS0IpCi0JCXJfc2VjdGlvbiA9IG9ial9ic3NzZWMgKGlucHV0X2JmZCk7Ci0JICAgICAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQUJTCi0JCSAgICAgICB8fCB0eXBlID09IE5fV0VBS0EpCi0JCXJfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgZWxzZQotCQlhYm9ydCAoKTsKLQkgICAgICByZWxvY2F0aW9uID0gKHJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcl9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyAoR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKQotCQkJICAgICAgIC0gcl9zZWN0aW9uLT52bWEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcl9zZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCB0aGVuIFJfQURERU5EIGlzIHRoZQotCQkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gdm1hcywgb3IKLQkJICAgb2xkX2Rlc3Rfc2VjICsgb2xkX2Rlc3Rfb2ZmIC0gKG9sZF9zcmNfc2VjICsgb2xkX3NyY19vZmYpCi0JCSB3aGVyZQotCQkgICBvbGRfZGVzdF9zZWMgPT0gc2VjdGlvbi0+dm1hCi0JCSBhbmQKLQkJICAgb2xkX3NyY19zZWMgPT0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCSBhbmQKLQkJICAgb2xkX3NyY19vZmYgPT0gcl9hZGRyCi0KLQkJIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSBleHBlY3RzIFJFTE9DQVRJT04gKwotCQkgUl9BRERFTkQgdG8gYmUgdGhlIFZNQSBvZiB0aGUgZGVzdGluYXRpb24gbWludXMKLQkJIHJfYWRkciAodGhlIG1pbnVzIHJfYWRkciBpcyBiZWNhdXNlIHRoaXMgcmVsb2NhdGlvbgotCQkgaXMgbm90IHBjcmVsX29mZnNldCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nIGFuZAotCQkgc2hvdWxkLCBwZXJoYXBzLCBiZSBjaGFuZ2VkKSwgb3IKLQkJICAgbmV3X2Rlc3Rfc2VjCi0JCSB3aGVyZQotCQkgICBuZXdfZGVzdF9zZWMgPT0gb3V0cHV0X3NlY3Rpb24tPnZtYSArIG91dHB1dF9vZmZzZXQKLQkJIFdlIGFycmFuZ2UgZm9yIHRoaXMgdG8gaGFwcGVuIGJ5IHNldHRpbmcgUkVMT0NBVElPTiB0bwotCQkgICBuZXdfZGVzdF9zZWMgKyBvbGRfc3JjX3NlYyAtIG9sZF9kZXN0X3NlYwotCi0JCSBJZiB0aGlzIGlzIG5vdCBhIFBDIHJlbGF0aXZlIHJlbG9jLCB0aGVuIFJfQURERU5EIGlzCi0JCSBzaW1wbHkgdGhlIFZNQSBvZiB0aGUgZGVzdGluYXRpb24sIHNvIHdlIHNldAotCQkgUkVMT0NBVElPTiB0byB0aGUgY2hhbmdlIGluIHRoZSBkZXN0aW5hdGlvbiBWTUEsIG9yCi0JCSAgIG5ld19kZXN0X3NlYyAtIG9sZF9kZXN0X3NlYwotCQkgKi8KLQkgICAgICByZWxvY2F0aW9uID0gKHJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcl9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSByX3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgaWYgKGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLnBjX3JlbGF0aXZlKQotCQlyZWxvY2F0aW9uICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgfQotCi0JICBpZiAoY2hlY2tfZHluYW1pY19yZWxvYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0JICAgICAgaWYgKCEgKCgqY2hlY2tfZHluYW1pY19yZWxvYykKLQkJICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaCwKLQkJICAgICAgKFBUUikgcmVsLCBjb250ZW50cywgJnNraXAsICZyZWxvY2F0aW9uKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoc2tpcCkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogTm93IHdhcm4gaWYgYSBnbG9iYWwgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIFdlIGNvdWxkIG5vdAotICAgICAgICAgICAgIGRvIHRoaXMgZWFybGllciwgYmVjYXVzZSBjaGVja19keW5hbWljX3JlbG9jIG1pZ2h0IHdhbnQKLSAgICAgICAgICAgICB0byBza2lwIHRoaXMgcmVsb2MuICAqLwotCSAgaWYgKGh1bmRlZgotCSAgICAgICYmICEgZmluZm8tPmluZm8tPnNoYXJlZAotCSAgICAgICYmIHJfdHlwZSAhPSBSRUxPQ19CQVNFMTAKLQkgICAgICAmJiByX3R5cGUgIT0gUkVMT0NfQkFTRTEzCi0JICAgICAgJiYgcl90eXBlICE9IFJFTE9DX0JBU0UyMikKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQluYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICBlbHNlCi0JCW5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCSAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHJfdHlwZSAhPSBSRUxPQ19TUEFSQ19SRVYzMikKLQkgICAgciA9IE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvX3RhYmxlX2V4dCArIHJfdHlwZSwKLQkJCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcl9hZGRyLCByZWxvY2F0aW9uLAotCQkJCQlyX2FkZGVuZCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHg7Ci0KLQkgICAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJfYWRkcik7Ci0JICAgICAgeCA9IHggKyByZWxvY2F0aW9uICsgcl9hZGRlbmQ7Ci0JICAgICAgYmZkX3B1dGwzMiAoLyppbnB1dF9iZmQsKi8geCwgY29udGVudHMgKyByX2FkZHIpOwotCSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JICAgIH0KLQotCSAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICAgIGlmIChoICE9IE5VTEwpCi0JCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQkgICAgZWxzZSBpZiAocl9leHRlcm4KLQkJCSAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMAotCQkJICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JCQkgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JCSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJCSBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWFzZWN0aW9uICpzOwotCi0JCQlzID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCQkJbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgcyk7Ci0JCSAgICAgIH0KLQkJICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBob3d0b190YWJsZV9leHRbcl90eXBlXS5uYW1lLAotCQkJICAgIHJfYWRkZW5kLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYSBsaW5rIG9yZGVyIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGdlbmVyYXRlIGEgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIgKGZpbmZvLCBvLCBwKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBhc2VjdGlvbiAqbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKnByOwotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgZmlsZV9wdHIgKnJlbG9mZl9wdHI7Ci0gIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgc3JlbDsKLSAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCBlcmVsOwotICBQVFIgcmVsX3B0cjsKLQotICBwciA9IHAtPnUucmVsb2MucDsKLQotICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHsKLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHByLT51LnNlY3Rpb24pKQotCXJfaW5kZXggPSBOX0FCUyB8IE5fRVhUOwotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKHByLT51LnNlY3Rpb24tPm93bmVyID09IGZpbmZvLT5vdXRwdXRfYmZkKTsKLQkgIHJfaW5kZXggPSBwci0+dS5zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgQkZEX0FTU0VSVCAocC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpOwotICAgICAgcl9leHRlcm4gPSAxOwotICAgICAgaCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoZmluZm8tPm91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCQkgcHItPnUubmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPmluZHggPj0gMCkKLQlyX2luZGV4ID0gaC0+aW5keDsKLSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBkZWNpZGVkIHRvIHN0cmlwIHRoaXMgc3ltYm9sLCBidXQgaXQgdHVybnMgb3V0IHRoYXQgd2UKLQkgICAgIGNhbid0LiAgTm90ZSB0aGF0IHdlIGxvc2UgdGhlIG90aGVyIGFuZCBkZXNjIGluZm9ybWF0aW9uCi0JICAgICBoZXJlLiAgSSBkb24ndCB0aGluayB0aGF0IHdpbGwgZXZlciBtYXR0ZXIgZm9yIGEgZ2xvYmFsCi0JICAgICBzeW1ib2wuICAqLwotCSAgaC0+aW5keCA9IC0yOwotCSAgaC0+d3JpdHRlbiA9IGZhbHNlOwotCSAgaWYgKCEgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwgKFBUUikgZmluZm8pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICByX2luZGV4ID0gaC0+aW5keDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJIChmaW5mby0+aW5mbywgcHItPnUubmFtZSwgKGJmZCAqKSBOVUxMLAotCQkgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICByX2luZGV4ID0gMDsKLQl9Ci0gICAgfQotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChmaW5mby0+b3V0cHV0X2JmZCwgcHItPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChvID09IG9ial90ZXh0c2VjIChmaW5mby0+b3V0cHV0X2JmZCkpCi0gICAgcmVsb2ZmX3B0ciA9ICZmaW5mby0+dHJlbG9mZjsKLSAgZWxzZSBpZiAobyA9PSBvYmpfZGF0YXNlYyAoZmluZm8tPm91dHB1dF9iZmQpKQotICAgIHJlbG9mZl9wdHIgPSAmZmluZm8tPmRyZWxvZmY7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGZpbmZvLT5vdXRwdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0jaWZkZWYgTVlfcHV0X3JlbG9jCi0gICAgICBNWV9wdXRfcmVsb2MoZmluZm8tPm91dHB1dF9iZmQsIHJfZXh0ZXJuLCByX2luZGV4LCBwLT5vZmZzZXQsIGhvd3RvLAotCQkgICAmc3JlbCk7Ci0jZWxzZQotICAgICAgewotCWludCByX3BjcmVsOwotCWludCByX2Jhc2VyZWw7Ci0JaW50IHJfam1wdGFibGU7Ci0JaW50IHJfcmVsYXRpdmU7Ci0JaW50IHJfbGVuZ3RoOwotCi0Jcl9wY3JlbCA9IGhvd3RvLT5wY19yZWxhdGl2ZTsKLQlyX2Jhc2VyZWwgPSAoaG93dG8tPnR5cGUgJiA4KSAhPSAwOwotCXJfam1wdGFibGUgPSAoaG93dG8tPnR5cGUgJiAxNikgIT0gMDsKLQlyX3JlbGF0aXZlID0gKGhvd3RvLT50eXBlICYgMzIpICE9IDA7Ci0Jcl9sZW5ndGggPSBob3d0by0+c2l6ZTsKLQotCVBVVF9XT1JEIChmaW5mby0+b3V0cHV0X2JmZCwgcC0+b2Zmc2V0LCBzcmVsLnJfYWRkcmVzcyk7Ci0JaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZmluZm8tPm91dHB1dF9iZmQpKQotCSAgewotCSAgICBzcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotCSAgICBzcmVsLnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JICAgIHNyZWwucl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JICAgIHNyZWwucl90eXBlWzBdID0KLQkgICAgICAoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCSAgICAgICB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHIDogMCkKLQkgICAgICAgfCAocl9iYXNlcmVsID8gIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHIDogMCkKLQkgICAgICAgfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRyA6IDApCi0JICAgICAgIHwgKHJfcmVsYXRpdmUgPyBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcgOiAwKQotCSAgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRykpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgc3JlbC5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQkgICAgc3JlbC5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCSAgICBzcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4OwotCSAgICBzcmVsLnJfdHlwZVswXSA9Ci0JICAgICAgKChyX2V4dGVybiA/ICAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFIDogMCkKLQkgICAgICAgfCAocl9wY3JlbCA/ICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSA6IDApCi0JICAgICAgIHwgKHJfYmFzZXJlbCA/ICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSA6IDApCi0JICAgICAgIHwgKHJfam1wdGFibGUgPyBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFIDogMCkKLQkgICAgICAgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgICAgcmVsX3B0ciA9IChQVFIpICZzcmVsOwotCi0gICAgICAvKiBXZSBoYXZlIHRvIHdyaXRlIHRoZSBhZGRlbmQgaW50byB0aGUgb2JqZWN0IGZpbGUsIHNpbmNlCi0JIHN0YW5kYXJkIGEub3V0IHJlbG9jcyBhcmUgaW4gcGxhY2UuICBJdCB3b3VsZCBiZSBtb3JlCi0JIHJlbGlhYmxlIGlmIHdlIGhhZCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZmlsZSBoZXJlLAotCSByYXRoZXIgdGhhbiBhc3N1bWluZyB6ZXJvZXMsIGJ1dCB3ZSBjYW4ndCByZWFkIHRoZSBmaWxlIHNpbmNlCi0JIGl0IHdhcyBvcGVuZWQgdXNpbmcgYmZkX29wZW53LiAgKi8KLSAgICAgIGlmIChwci0+YWRkZW5kICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0JICBiZmRfYnl0ZSAqYnVmOwotCSAgYm9vbGVhbiBvazsKLQotCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLQkgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHIgPSBNWV9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCSAgICAgIHByLT5hZGRlbmQsIGJ1Zik7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChmaW5mby0+aW5mbywKLQkJICAgICAgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICAgICAgPyBiZmRfc2VjdGlvbl9uYW1lIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkJICAgcHItPnUuc2VjdGlvbikKLQkJICAgICAgIDogcHItPnUubmFtZSksCi0JCSAgICAgIGhvd3RvLT5uYW1lLCBwci0+YWRkZW5kLCAoYmZkICopIE5VTEwsCi0JCSAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCQl7Ci0JCSAgZnJlZSAoYnVmKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGZpbmZvLT5vdXRwdXRfYmZkLCBvLAotCQkJCQkgKFBUUikgYnVmLAotCQkJCQkgKGZpbGVfcHRyKSBwLT5vZmZzZXQsCi0JCQkJCSBzaXplKTsKLQkgIGZyZWUgKGJ1Zik7Ci0JICBpZiAoISBvaykKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQVVRfV09SRCAoZmluZm8tPm91dHB1dF9iZmQsIHAtPm9mZnNldCwgZXJlbC5yX2FkZHJlc3MpOwotCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JewotCSAgZXJlbC5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLQkgIGVyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgIGVyZWwucl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JICBlcmVsLnJfdHlwZVswXSA9Ci0JICAgICgocl9leHRlcm4gPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHIDogMCkKLQkgICAgIHwgKGhvd3RvLT50eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVyZWwucl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0JICBlcmVsLnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JICBlcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4OwotCSAgZXJlbC5yX3R5cGVbMF0gPQotCSAgICAocl9leHRlcm4gPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFIDogMCkKLQkgICAgICB8IChob3d0by0+dHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0JfQotCi0gICAgICBQVVRfV09SRCAoZmluZm8tPm91dHB1dF9iZmQsIHByLT5hZGRlbmQsIGVyZWwucl9hZGRlbmQpOwotCi0gICAgICByZWxfcHRyID0gKFBUUikgJmVyZWw7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoZmluZm8tPm91dHB1dF9iZmQsICpyZWxvZmZfcHRyLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAocmVsX3B0ciwgKGJmZF9zaXplX3R5cGUpIDEsCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGZpbmZvLT5vdXRwdXRfYmZkKSwKLQkJICAgICBmaW5mby0+b3V0cHV0X2JmZCkKLQkgICE9IG9ial9yZWxvY19lbnRyeV9zaXplIChmaW5mby0+b3V0cHV0X2JmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqcmVsb2ZmX3B0ciArPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpOwotCi0gIC8qIEFzc2VydCB0aGF0IHRoZSByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIHN5bWJvbHMsIGFuZCB0aGF0IG4KLSAgICAgdGhlIHRleHQgcmVsb2NzIGhhdmUgbm90IHJ1biBpbnRvIHRoZSBkYXRhIHJlbG9jcy4gICovCi0gIEJGRF9BU1NFUlQgKCpyZWxvZmZfcHRyIDw9IG9ial9zeW1fZmlsZXBvcyAoZmluZm8tPm91dHB1dF9iZmQpCi0JICAgICAgJiYgKHJlbG9mZl9wdHIgIT0gJmZpbmZvLT50cmVsb2ZmCi0JCSAgfHwgKCpyZWxvZmZfcHRyCi0JCSAgICAgIDw9IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCktPnJlbF9maWxlcG9zKSkpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2FyY2hpdmUuYyBiL2JmZC9hcmNoaXZlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWFlYWYuLjAwMDAwMDAKLS0tIGEvYmZkL2FyY2hpdmUuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhcmNoaXZlIGZpbGVzIChsaWJyYXJpZXMpLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgTW9zdGx5IEd1bWJ5IEhlbmtlbC1XYWxsYWNlJ3MgZmF1bHQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLUBzZXRmaWxlbmFtZSBhcmNoaXZlLWluZm8KLVNFQ1RJT04KLQlBcmNoaXZlcwotCi1ERVNDUklQVElPTgotCUFuIGFyY2hpdmUgKG9yIGxpYnJhcnkpIGlzIGp1c3QgYW5vdGhlciBCRkQuICBJdCBoYXMgYSBzeW1ib2wKLQl0YWJsZSwgYWx0aG91Z2ggdGhlcmUncyBub3QgbXVjaCBhIHVzZXIgcHJvZ3JhbSB3aWxsIGRvIHdpdGggaXQuCi0KLQlUaGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlbiBhbiBhcmNoaXZlIEJGRCBhbmQgYW4gb3JkaW5hcnkgQkZECi0JaXMgdGhhdCB0aGUgYXJjaGl2ZSBkb2Vzbid0IGhhdmUgc2VjdGlvbnMuICBJbnN0ZWFkIGl0IGhhcyBhCi0JY2hhaW4gb2YgQkZEcyB0aGF0IGFyZSBjb25zaWRlcmVkIGl0cyBjb250ZW50cy4gIFRoZXNlIEJGRHMgY2FuCi0JYmUgbWFuaXB1bGF0ZWQgbGlrZSBhbnkgb3RoZXIuICBUaGUgQkZEcyBjb250YWluZWQgaW4gYW4KLQlhcmNoaXZlIG9wZW5lZCBmb3IgcmVhZGluZyB3aWxsIGFsbCBiZSBvcGVuZWQgZm9yIHJlYWRpbmcuICBZb3UKLQltYXkgcHV0IGVpdGhlciBpbnB1dCBvciBvdXRwdXQgQkZEcyBpbnRvIGFuIGFyY2hpdmUgb3BlbmVkIGZvcgotCW91dHB1dDsgdGhleSB3aWxsIGJlIGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gdGhlIGFyY2hpdmUgaXMgY2xvc2VkLgotCi0JVXNlIDw8YmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZT4+IHRvIHN0ZXAgdGhyb3VnaAotCXRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlIG9wZW5lZCBmb3IgaW5wdXQuICBZb3UgZG9uJ3QKLQloYXZlIHRvIHJlYWQgdGhlIGVudGlyZSBhcmNoaXZlIGlmIHlvdSBkb24ndCB3YW50Ci0JdG8hICBSZWFkIGl0IHVudGlsIHlvdSBmaW5kIHdoYXQgeW91IHdhbnQuCi0KLQlBcmNoaXZlIGNvbnRlbnRzIG9mIG91dHB1dCBCRkRzIGFyZSBjaGFpbmVkIHRocm91Z2ggdGhlCi0JPDxuZXh0Pj4gcG9pbnRlciBpbiBhIEJGRC4gIFRoZSBmaXJzdCBvbmUgaXMgZmluZGFibGUgdGhyb3VnaAotCXRoZSA8PGFyY2hpdmVfaGVhZD4+IHNsb3Qgb2YgdGhlIGFyY2hpdmUuICBTZXQgaXQgd2l0aAotCTw8YmZkX3NldF9hcmNoaXZlX2hlYWQ+PiAocS52LikuICBBIGdpdmVuIEJGRCBtYXkgYmUgaW4gb25seSBvbmUKLQlvcGVuIG91dHB1dCBhcmNoaXZlIGF0IGEgdGltZS4KLQotCUFzIGV4cGVjdGVkLCB0aGUgQkZEIGFyY2hpdmUgY29kZSBpcyBtb3JlIGdlbmVyYWwgdGhhbiB0aGUKLQlhcmNoaXZlIGNvZGUgb2YgYW55IGdpdmVuIGVudmlyb25tZW50LiAgQkZEIGFyY2hpdmVzIG1heQotCWNvbnRhaW4gZmlsZXMgb2YgZGlmZmVyZW50IGZvcm1hdHMgKGUuZy4sIGEub3V0IGFuZCBjb2ZmKSBhbmQKLQlldmVuIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLiAgWW91IG1heSBldmVuIHBsYWNlIGFyY2hpdmVzCi0JcmVjdXJzaXZlbHkgaW50byBhcmNoaXZlcyEKLQotCVRoaXMgY2FuIGNhdXNlIHVuZXhwZWN0ZWQgY29uZnVzaW9uLCBzaW5jZSBzb21lIGFyY2hpdmUKLQlmb3JtYXRzIGFyZSBtb3JlIGV4cHJlc3NpdmUgdGhhbiBvdGhlcnMuICBGb3IgaW5zdGFuY2UsIEludGVsCi0JQ09GRiBhcmNoaXZlcyBjYW4gcHJlc2VydmUgbG9uZyBmaWxlbmFtZXM7IFN1bk9TIGEub3V0IGFyY2hpdmVzCi0JY2Fubm90LiAgSWYgeW91IG1vdmUgYSBmaWxlIGZyb20gdGhlIGZpcnN0IHRvIHRoZSBzZWNvbmQKLQlmb3JtYXQgYW5kIGJhY2sgYWdhaW4sIHRoZSBmaWxlbmFtZSBtYXkgYmUgdHJ1bmNhdGVkLgotCUxpa2V3aXNlLCBkaWZmZXJlbnQgYS5vdXQgZW52aXJvbm1lbnRzIGhhdmUgZGlmZmVyZW50Ci0JY29udmVudGlvbnMgYXMgdG8gaG93IHRoZXkgdHJ1bmNhdGUgZmlsZW5hbWVzLCB3aGV0aGVyIHRoZXkKLQlwcmVzZXJ2ZSBkaXJlY3RvcnkgbmFtZXMgaW4gZmlsZW5hbWVzLCBldGMuICBXaGVuCi0JaW50ZXJvcGVyYXRpbmcgd2l0aCBuYXRpdmUgdG9vbHMsIGJlIHN1cmUgeW91ciBmaWxlcyBhcmUKLQlob21vZ2VuZW91cy4KLQotCUJld2FyZTogbW9zdCBvZiB0aGVzZSBmb3JtYXRzIGRvIG5vdCByZWFjdCB3ZWxsIHRvIHRoZQotCXByZXNlbmNlIG9mIHNwYWNlcyBpbiBmaWxlbmFtZXMuICBXZSBkbyB0aGUgYmVzdCB3ZSBjYW4sIGJ1dAotCWNhbid0IGFsd2F5cyBoYW5kbGUgdGhpcyBjYXNlIGR1ZSB0byByZXN0cmljdGlvbnMgaW4gdGhlIGZvcm1hdCBvZgotCWFyY2hpdmVzLiAgTWFueSBVbml4IHV0aWxpdGllcyBhcmUgYnJhaW5kZWFkIGluIHJlZ2FyZHMgdG8KLQlzcGFjZXMgYW5kIHN1Y2ggaW4gZmlsZW5hbWVzIGFueXdheSwgc28gdGhpcyBzaG91bGRuJ3QgYmUgbXVjaAotCW9mIGEgcmVzdHJpY3Rpb24uCi0KLQlBcmNoaXZlcyBhcmUgc3VwcG9ydGVkIGluIEJGRCBpbiA8PGFyY2hpdmUuYz4+LgotCi0qLwotCi0vKiBBc3N1bWVzOgotICAgbyAtIGFsbCBhcmNoaXZlIGVsZW1lbnRzIHN0YXJ0IG9uIGFuIGV2ZW4gYm91bmRhcnksIG5ld2xpbmUgcGFkZGVkOwotICAgbyAtIGFsbCBhcmNoIGhlYWRlcnMgYXJlIGNoYXIgKjsKLSAgIG8gLSBhbGwgYXJjaCBoZWFkZXJzIGFyZSB0aGUgc2FtZSBzaXplIChhY3Jvc3MgYXJjaGl0ZWN0dXJlcykuCi0qLwotCi0vKiBTb21lIGZvcm1hdHMgcHJvdmlkZSBhIHdheSB0byBjcmFtIGEgbG9uZyBmaWxlbmFtZSBpbnRvIHRoZSBzaG9ydAotICAgKDE2IGNoYXJzKSBzcGFjZSBwcm92aWRlZCBieSBhIEJTRCBhcmNoaXZlLiAgVGhlIHRyaWNrIGlzOiBtYWtlIGEKLSAgIHNwZWNpYWwgImZpbGUiIGluIHRoZSBmcm9udCBvZiB0aGUgYXJjaGl2ZSwgc29ydCBvZiBsaWtlIHRoZSBTWU1ERUYKLSAgIGVudHJ5LiAgSWYgdGhlIGZpbGVuYW1lIGlzIHRvbyBsb25nIHRvIGZpdCwgcHV0IGl0IGluIHRoZSBleHRlbmRlZAotICAgbmFtZSB0YWJsZSwgYW5kIHVzZSBpdHMgaW5kZXggYXMgdGhlIGZpbGVuYW1lLiAgVG8gcHJldmVudAotICAgY29uZnVzaW9uIHByZXBlbmQgdGhlIGluZGV4IHdpdGggYSBzcGFjZS4gIFRoaXMgbWVhbnMgeW91IGNhbid0Ci0gICBoYXZlIGZpbGVuYW1lcyB0aGF0IHN0YXJ0IHdpdGggYSBzcGFjZSwgYnV0IHRoZW4gYWdhaW4sIG1hbnkgVW5peAotICAgdXRpbGl0aWVzIGNhbid0IGhhbmRsZSB0aGF0IGFueXdheS4KLQotICAgVGhpcyBzY2hlbWUgdW5mb3J0dW5hdGVseSByZXF1aXJlcyB0aGF0IHlvdSBzdGFuZCBvbiB5b3VyIGhlYWQgaW4KLSAgIG9yZGVyIHRvIHdyaXRlIGFuIGFyY2hpdmUgc2luY2UgeW91IG5lZWQgdG8gcHV0IGEgbWFnaWMgZmlsZSBhdCB0aGUKLSAgIGZyb250LCBhbmQgbmVlZCB0byB0b3VjaCBldmVyeSBlbnRyeSB0byBkbyBzby4gIEMnZXN0IGxhIHZpZS4KLQotICAgV2Ugc3VwcG9ydCB0d28gdmFyaWFudHMgb2YgdGhpcyBpZGVhOgotICAgVGhlIFNWUjQgZm9ybWF0IChleHRlbmRlZCBuYW1lIHRhYmxlIGlzIG5hbWVkICIvLyIpLAotICAgYW5kIGFuIGV4dGVuZGVkIHBzZXVkby1CU0QgdmFyaWFudCAoZXh0ZW5kZWQgbmFtZSB0YWJsZSBpcyBuYW1lZAotICAgIkFSRklMRU5BTUVTLyIpLiAgVGhlIG9yaWdpbiBvZiB0aGUgbGF0dGVyIGZvcm1hdCBpcyB1bmNlcnRhaW4uCi0KLSAgIEJTRCA0LjQgdXNlcyBhIHRoaXJkIHNjaGVtZTogIEl0IHdyaXRlcyBhIGxvbmcgZmlsZW5hbWUKLSAgIGRpcmVjdGx5IGFmdGVyIHRoZSBoZWFkZXIuICBUaGlzIGFsbG93cyAnYXIgcScgdG8gd29yay4KLSAgIFdlIGN1cnJlbnRseSBjYW4gcmVhZCBCU0QgNC40IGFyY2hpdmVzLCBidXQgbm90IHdyaXRlIHRoZW0uCi0qLwotCi0vKiBTdW1tYXJ5IG9mIGFyY2hpdmUgbWVtYmVyIG5hbWVzOgotCi0gU3ltYm9sIHRhYmxlIChtdXN0IGJlIGZpcnN0KToKLSAiX18uU1lNREVGICAgICAgICIgLSBTeW1ib2wgdGFibGUsIEJlcmtlbGV5IHN0eWxlLCBwcm9kdWNlZCBieSByYW5saWIuCi0gIi8gICAgICAgICAgICAgICAiIC0gU3ltYm9sIHRhYmxlLCBzeXN0ZW0gNSBzdHlsZS4KLQotIExvbmcgbmFtZSB0YWJsZSAobXVzdCBiZSBiZWZvcmUgcmVndWxhciBmaWxlIG1lbWJlcnMpOgotICIvLyAgICAgICAgICAgICAgIiAtIExvbmcgbmFtZSB0YWJsZSwgU3lzdGVtIDUgUjQgc3R5bGUuCi0gIkFSRklMRU5BTUVTLyAgICAiIC0gTG9uZyBuYW1lIHRhYmxlLCBub24tc3RhbmRhcmQgZXh0ZW5kZWQgQlNEIChub3QgQlNEIDQuNCkuCi0KLSBSZWd1bGFyIGZpbGUgbWVtYmVycyB3aXRoIHNob3J0IG5hbWVzOgotICJmaWxlbmFtZS5vLyAgICAgIiAtIFJlZ3VsYXIgZmlsZSwgU3lzdGVtIDUgc3R5bGUgKGVtYmVkZGVkIHNwYWNlcyBvaykuCi0gImZpbGVuYW1lLm8gICAgICAiIC0gUmVndWxhciBmaWxlLCBCZXJrZWxleSBzdHlsZSAobm8gZW1iZWRkZWQgc3BhY2VzKS4KLQotIFJlZ3VsYXIgZmlsZXMgd2l0aCBsb25nIG5hbWVzIChvciBlbWJlZGRlZCBzcGFjZXMsIGZvciBCU0QgdmFyaWFudHMpOgotICIvMTggICAgICAgICAgICAgIiAtIFNWUjQgc3R5bGUsIG5hbWUgYXQgb2Zmc2V0IDE4IGluIG5hbWUgdGFibGUuCi0gIiMxLzIzICAgICAgICAgICAiIC0gTG9uZyBuYW1lIChvciBlbWJlZGRlZCBwYWNlcykgMjMgY2hhcmFjdGVycyBsb25nLAotCQkgICAgICBCU0QgNC40IHN0eWxlLCBmdWxsIG5hbWUgZm9sbG93cyBoZWFkZXIuCi0JCSAgICAgIEltcGxlbWVudGVkIGZvciByZWFkaW5nLCBub3Qgd3JpdGluZy4KLSAiIDE4ICAgICAgICAgICAgICIgLSBMb25nIG5hbWUgMTggY2hhcmFjdGVycyBsb25nLCBleHRlbmRlZCBwc2V1ZG8tQlNELgotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLSNpZmRlZiBHTlU5NjAKLSNkZWZpbmUgQkZEX0dOVTk2MF9BUk1BRyhhYmZkKQkoQkZEX0NPRkZfRklMRV9QKChhYmZkKSkgPyBBUk1BRyA6IEFSTUFHQikKLSNlbmRpZgotCi0vKiBEZWZpbmUgb2Zmc2V0b2YgZm9yIHRob3NlIHN5c3RlbXMgd2hpY2ggbGFjayBpdCAqLwotCi0jaWZuZGVmIG9mZnNldG9mCi0jZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKLSNlbmRpZgotCi0vKiBXZSBrZWVwIGEgY2FjaGUgb2YgYXJjaGl2ZSBmaWxlcG9pbnRlcnMgdG8gYXJjaGl2ZSBlbGVtZW50cyB0bwotICAgc3BlZWQgdXAgc2VhcmNoaW5nIHRoZSBhcmNoaXZlIGJ5IGZpbGVwb3MuICBXZSBvbmx5IGFkZCBhbiBlbnRyeSB0bwotICAgdGhlIGNhY2hlIHdoZW4gd2UgYWN0dWFsbHkgcmVhZCBvbmUuICBXZSBhbHNvIGRvbid0IHNvcnQgdGhlIGNhY2hlOwotICAgaXQncyBnZW5lcmFsbHkgc2hvcnQgZW5vdWdoIHRvIHNlYXJjaCBsaW5lYXJseS4KLSAgIE5vdGUgdGhhdCB0aGUgcG9pbnRlcnMgaGVyZSBwb2ludCB0byB0aGUgZnJvbnQgb2YgdGhlIGFyX2hkciwgbm90Ci0gICB0byB0aGUgZnJvbnQgb2YgdGhlIGNvbnRlbnRzIQotKi8KLXN0cnVjdCBhcl9jYWNoZQotewotICBmaWxlX3B0ciBwdHI7Ci0gIGJmZCAqYXJlbHQ7Ci0gIHN0cnVjdCBhcl9jYWNoZSAqbmV4dDsKLX07Ci0KLSNkZWZpbmUgYXJfcGFkY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5hcl9wYWRfY2hhcikKLSNkZWZpbmUgYXJfbWF4bmFtZWxlbihhYmZkKSAoKGFiZmQpLT54dmVjLT5hcl9tYXhfbmFtZWxlbikKLQotI2RlZmluZSBhcmNoX2VsdGRhdGEoYmZkKSAoKHN0cnVjdCBhcmVsdGRhdGEgKikoKGJmZCktPmFyZWx0X2RhdGEpKQotI2RlZmluZSBhcmNoX2hkcihiZmQpICgoc3RydWN0IGFyX2hkciAqKWFyY2hfZWx0ZGF0YShiZmQpLT5hcmNoX2hlYWRlcikKLQotc3RhdGljIGNoYXIgKmdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSBQQVJBTVMgKChiZmQgKmFyY2gsCi0JCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBib29sZWFuIGRvX3NsdXJwX2JzZF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIGRvX3NsdXJwX2NvZmZfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbm9ybWFsaXplIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICpmaWxlKSk7Ci1zdGF0aWMgc3RydWN0IGFyZWx0ZGF0YSAqYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJCSAgICAgY29uc3QgY2hhciAqLAotCQkJCQkJCSAgICAgYmZkICptZW1iZXIpKTsKLQwKLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gKChzdHJ1Y3QgYXJ0ZGF0YSAqKQotCQkJICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpKTsKLQotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPmNhY2hlID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmFyY2hpdmVfaGVhZCA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9uZXh0X21hcGVudAotCi1TWU5PUFNJUwotCXN5bWluZGV4IGJmZF9nZXRfbmV4dF9tYXBlbnQoYmZkICphYmZkLCBzeW1pbmRleCBwcmV2aW91cywgY2Fyc3ltICoqc3ltKTsKLQotREVTQ1JJUFRJT04KLQlTdGVwIHRocm91Z2ggYXJjaGl2ZSBAdmFye2FiZmR9J3Mgc3ltYm9sIHRhYmxlIChpZiBpdAotCWhhcyBvbmUpLiAgU3VjY2Vzc2l2ZWx5IHVwZGF0ZSBAdmFye3N5bX0gd2l0aCB0aGUgbmV4dCBzeW1ib2wncwotCWluZm9ybWF0aW9uLCByZXR1cm5pbmcgdGhhdCBzeW1ib2wncyAoaW50ZXJuYWwpIGluZGV4IGludG8gdGhlCi0Jc3ltYm9sIHRhYmxlLgotCi0JU3VwcGx5IDw8QkZEX05PX01PUkVfU1lNQk9MUz4+IGFzIHRoZSBAdmFye3ByZXZpb3VzfSBlbnRyeSB0byBnZXQKLQl0aGUgZmlyc3Qgb25lOyByZXR1cm5zIDw8QkZEX05PX01PUkVfU1lNQk9MUz4+IHdoZW4geW91J3ZlIGFscmVhZHkKLQlnb3QgdGhlIGxhc3Qgb25lLgotCi0JQSA8PGNhcnN5bT4+IGlzIGEgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9sLiAgVGhlIG9ubHkKLQl1c2VyLXZpc2libGUgZWxlbWVudCBpcyBpdHMgbmFtZSwgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgotKi8KLQotc3ltaW5kZXgKLWJmZF9nZXRfbmV4dF9tYXBlbnQgKGFiZmQsIHByZXYsIGVudHJ5KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN5bWluZGV4IHByZXY7Ci0gICAgIGNhcnN5bSAqKmVudHJ5OwotewotICBpZiAoIWJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIEJGRF9OT19NT1JFX1NZTUJPTFM7Ci0gICAgfQotCi0gIGlmIChwcmV2ID09IEJGRF9OT19NT1JFX1NZTUJPTFMpCi0gICAgcHJldiA9IDA7Ci0gIGVsc2UKLSAgICArK3ByZXY7Ci0gIGlmIChwcmV2ID49IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZfY291bnQpCi0gICAgcmV0dXJuIEJGRF9OT19NT1JFX1NZTUJPTFM7Ci0KLSAgKmVudHJ5ID0gKGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgcHJldik7Ci0gIHJldHVybiBwcmV2OwotfQotCi0vKiBUbyBiZSBjYWxsZWQgYnkgYmFja2VuZHMgb25seSAqLwotCi1iZmQgKgotX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIChvYmZkKQotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIHJldHVybiBfYmZkX25ld19iZmRfY29udGFpbmVkX2luIChvYmZkKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9hcmNoaXZlX2hlYWQKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfYXJjaGl2ZV9oZWFkKGJmZCAqb3V0cHV0LCBiZmQgKm5ld19oZWFkKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGhlYWQgb2YgdGhlIGNoYWluIG9mCi0JQkZEcyBjb250YWluZWQgaW4gdGhlIGFyY2hpdmUgQHZhcntvdXRwdXR9IHRvIEB2YXJ7bmV3X2hlYWR9LgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9hcmNoaXZlX2hlYWQgKG91dHB1dF9hcmNoaXZlLCBuZXdfaGVhZCkKLSAgICAgYmZkICpvdXRwdXRfYXJjaGl2ZTsKLSAgICAgYmZkICpuZXdfaGVhZDsKLXsKLQotICBvdXRwdXRfYXJjaGl2ZS0+YXJjaGl2ZV9oZWFkID0gbmV3X2hlYWQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi1iZmQgKgotX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUgKGFyY2hfYmZkLCBmaWxlcG9zKQotICAgICBiZmQgKmFyY2hfYmZkOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBzdHJ1Y3QgYXJfY2FjaGUgKmN1cnJlbnQ7Ci0KLSAgZm9yIChjdXJyZW50ID0gYmZkX2FyZGF0YSAoYXJjaF9iZmQpLT5jYWNoZTsgY3VycmVudCAhPSBOVUxMOwotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIGlmIChjdXJyZW50LT5wdHIgPT0gZmlsZXBvcykKLSAgICAgIHJldHVybiBjdXJyZW50LT5hcmVsdDsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogS2luZCBvZiBzdHVwaWQgdG8gY2FsbCBjb25zIGZvciBlYWNoIG9uZSwgYnV0IHdlIGRvbid0IGRvIHRvbyBtYW55ICovCi1ib29sZWFuCi1fYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSAoYXJjaF9iZmQsIGZpbGVwb3MsIG5ld19lbHQpCi0gICAgIGJmZCAqYXJjaF9iZmQsICpuZXdfZWx0OwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBzdHJ1Y3QgYXJfY2FjaGUgKm5ld19jYWNoZSA9ICgoc3RydWN0IGFyX2NhY2hlICopCi0JCQkJYmZkX3phbGxvYyAoYXJjaF9iZmQsCi0JCQkJCSAgICBzaXplb2YgKHN0cnVjdCBhcl9jYWNoZSkpKTsKLQotICBpZiAobmV3X2NhY2hlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5ld19jYWNoZS0+cHRyID0gZmlsZXBvczsKLSAgbmV3X2NhY2hlLT5hcmVsdCA9IG5ld19lbHQ7Ci0gIG5ld19jYWNoZS0+bmV4dCA9IChzdHJ1Y3QgYXJfY2FjaGUgKikgTlVMTDsKLSAgaWYgKGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGUgPT0gTlVMTCkKLSAgICBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlID0gbmV3X2NhY2hlOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFyX2NhY2hlICpjdXJyZW50ID0gYmZkX2FyZGF0YSAoYXJjaF9iZmQpLT5jYWNoZTsKLQotICAgICAgd2hpbGUgKGN1cnJlbnQtPm5leHQgIT0gTlVMTCkKLQljdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLSAgICAgIGN1cnJlbnQtPm5leHQgPSBuZXdfY2FjaGU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhlIG5hbWUgYmVnaW5zIHdpdGggc3BhY2UuICBIZW5jZSB0aGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBhbiBpbmRleCBpbnRvCi0gICB0aGUgc3RyaW5nIHRhYmxlLiAqLwotCi1zdGF0aWMgY2hhciAqCi1nZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUgKGFyY2gsIG5hbWUpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbmRleCA9IDA7Ci0KLSAgLyogU2hvdWxkIGV4dHJhY3Qgc3RyaW5nIHNvIHRoYXQgSSBjYW4gZ3VhcmFudGVlIG5vdCB0byBvdmVyZmxvdyBpbnRvCi0gICAgIHRoZSBuZXh0IHJlZ2lvbiwgYnV0IEknbSB0b28gbGF6eS4gKi8KLSAgZXJybm8gPSAwOwotICAvKiBTa2lwIGZpcnN0IGNoYXIsIHdoaWNoIGlzICcvJyBpbiBTVlI0IG9yICcgJyBpbiBzb21lIG90aGVyIHZhcmlhbnRzLiAqLwotICBpbmRleCA9IHN0cnRvbCAobmFtZSArIDEsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gYmZkX2FyZGF0YSAoYXJjaCktPmV4dGVuZGVkX25hbWVzICsgaW5kZXg7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb25zIHJlYWRzIGFuIGFyY2ggaGVhZGVyIGFuZCByZXR1cm5zIGFuIGFyZWx0ZGF0YSBwb2ludGVyLCBvcgotICAgTlVMTCBvbiBlcnJvci4KLQotICAgUHJlc3VtZXMgdGhlIGZpbGUgcG9pbnRlciBpcyBhbHJlYWR5IGluIHRoZSByaWdodCBwbGFjZSAoaWUgcG9pbnRpbmcKLSAgIHRvIHRoZSBhcl9oZHIgaW4gdGhlIGZpbGUpLiAgIE1vdmVzIHRoZSBmaWxlIHBvaW50ZXI7IG9uIHN1Y2Nlc3MgaXQKLSAgIHNob3VsZCBiZSBwb2ludGluZyB0byB0aGUgZnJvbnQgb2YgdGhlIGZpbGUgY29udGVudHM7IG9uIGZhaWx1cmUgaXQKLSAgIGNvdWxkIGhhdmUgYmVlbiBtb3ZlZCBhcmJpdHJhcmlseS4KLSovCi0KLVBUUgotX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIChhYmZkLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLX0KLQotLyogQWxwaGEgRUNPRkYgdXNlcyBhbiBvcHRpb25hbCBkaWZmZXJlbnQgQVJGTUFHIHZhbHVlLCBzbyB3ZSBoYXZlIGEKLSAgIHZhcmlhbnQgb2YgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIHdoaWNoIGFjY2VwdHMgYSBtYWdpYyBzdHJpbmcuICAqLwotCi1QVFIKLV9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgKGFiZmQsIG1hZykKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICptYWc7Ci17Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICBjaGFyICpoZHJwID0gKGNoYXIgKikgJmhkcjsKLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOwotICBzdHJ1Y3QgYXJlbHRkYXRhICphcmVkOwotICBjaGFyICpmaWxlbmFtZSA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBuYW1lbGVuID0gMDsKLSAgdW5zaWduZWQgaW50IGFsbG9jc2l6ZSA9IHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotICBjaGFyICphbGxvY3B0ciA9IDA7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBoZHJwLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMikgIT0gMAotICAgICAgJiYgKG1hZyA9PSBOVUxMCi0JICB8fCBzdHJuY21wIChoZHIuYXJfZm1hZywgbWFnLCAyKSAhPSAwKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGVycm5vID0gMDsKLSAgcGFyc2VkX3NpemUgPSBzdHJ0b2wgKGhkci5hcl9zaXplLCBOVUxMLCAxMCk7Ci0gIGlmIChlcnJubyAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRXh0cmFjdCB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgYXJjaGl2ZSAtIHRoZXJlIGFyZSB0d28gd2F5cyB0bwotICAgICBzcGVjaWZ5IGFuIGV4dGVuZGVkIG5hbWUgdGFibGUsIGVpdGhlciB0aGUgZmlyc3QgY2hhciBvZiB0aGUKLSAgICAgbmFtZSBpcyBhIHNwYWNlLCBvciBpdCdzIGEgc2xhc2guICAqLwotICBpZiAoKGhkci5hcl9uYW1lWzBdID09ICcvJwotICAgICAgIHx8IChoZHIuYXJfbmFtZVswXSA9PSAnICcKLQkgICAmJiBtZW1jaHIgKGhkci5hcl9uYW1lLCAnLycsIGFyX21heG5hbWVsZW4gKGFiZmQpKSA9PSBOVUxMKSkKLSAgICAgICYmIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZpbGVuYW1lID0gZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lIChhYmZkLCBoZHIuYXJfbmFtZSk7Ci0gICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLSAgLyogQlNENC40LXN0eWxlIGxvbmcgZmlsZW5hbWUuCi0gICAgIE9ubHkgaW1wbGVtZW50ZWQgZm9yIHJlYWRpbmcsIHNvIGZhciEgKi8KLSAgZWxzZSBpZiAoaGRyLmFyX25hbWVbMF0gPT0gJyMnCi0JICAgJiYgaGRyLmFyX25hbWVbMV0gPT0gJzEnCi0JICAgJiYgaGRyLmFyX25hbWVbMl0gPT0gJy8nCi0JICAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGhkci5hcl9uYW1lWzNdKSkKLSAgICB7Ci0gICAgICAvKiBCU0QtNC40IGV4dGVuZGVkIG5hbWUgKi8KLSAgICAgIG5hbWVsZW4gPSBhdG9pICgmaGRyLmFyX25hbWVbM10pOwotICAgICAgYWxsb2NzaXplICs9IG5hbWVsZW4gKyAxOwotICAgICAgcGFyc2VkX3NpemUgLT0gbmFtZWxlbjsKLQotICAgICAgYWxsb2NwdHIgPSBiZmRfemFsbG9jIChhYmZkLCBhbGxvY3NpemUpOwotICAgICAgaWYgKGFsbG9jcHRyID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBmaWxlbmFtZSA9IChhbGxvY3B0cgotCQkgICsgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKQotCQkgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gICAgICBpZiAoYmZkX3JlYWQgKGZpbGVuYW1lLCAxLCBuYW1lbGVuLCBhYmZkKSAhPSBuYW1lbGVuKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgZmlsZW5hbWVbbmFtZWxlbl0gPSAnXDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGp1ZGdlIHRoZSBlbmQgb2YgdGhlIG5hbWUgYnkgbG9va2luZyBmb3IgJy8nIG9yICcgJy4KLQkgTm90ZTogIFRoZSBTWVNWIGZvcm1hdCAodGVybWluYXRlZCBieSAnLycpIGFsbG93cyBlbWJlZGRlZAotCSBzcGFjZXMsIHNvIG9ubHkgbG9vayBmb3IgJyAnIGlmIHdlIGRvbid0IGZpbmQgJy8nLiAqLwotCi0gICAgICBjaGFyICplOwotICAgICAgZSA9IG1lbWNociAoaGRyLmFyX25hbWUsICdcMCcsIGFyX21heG5hbWVsZW4gKGFiZmQpKTsKLSAgICAgIGlmIChlID09IE5VTEwpCi0JewotICAgICAgICAgIGUgPSBtZW1jaHIgKGhkci5hcl9uYW1lLCAnLycsIGFyX21heG5hbWVsZW4gKGFiZmQpKTsKLQkgIGlmIChlID09IE5VTEwpCi0gICAgICAgICAgICBlID0gbWVtY2hyIChoZHIuYXJfbmFtZSwgJyAnLCBhcl9tYXhuYW1lbGVuIChhYmZkKSk7Ci0JfQotCi0gICAgICBpZiAoZSAhPSBOVUxMKQotCW5hbWVsZW4gPSBlIC0gaGRyLmFyX25hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgLyogSWYgd2UgZGlkbid0IGZpbmQgYSB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIsIHRoZW4gdGhlIG5hbWUKLQkgICAgIG11c3QgYmUgdGhlIGVudGlyZSBmaWVsZC4gICovCi0JICBuYW1lbGVuID0gYXJfbWF4bmFtZWxlbiAoYWJmZCk7Ci0JfQotCi0gICAgICBhbGxvY3NpemUgKz0gbmFtZWxlbiArIDE7Ci0gICAgfQotCi0gIGlmICghYWxsb2NwdHIpCi0gICAgewotICAgICAgYWxsb2NwdHIgPSBiZmRfemFsbG9jIChhYmZkLCBhbGxvY3NpemUpOwotICAgICAgaWYgKGFsbG9jcHRyID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFyZWQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBhbGxvY3B0cjsKLQotICBhcmVkLT5hcmNoX2hlYWRlciA9IGFsbG9jcHRyICsgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKTsKLSAgbWVtY3B5ICgoY2hhciAqKSBhcmVkLT5hcmNoX2hlYWRlciwgKGNoYXIgKikgJmhkciwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIGFyZWQtPnBhcnNlZF9zaXplID0gcGFyc2VkX3NpemU7Ci0KLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwpCi0gICAgYXJlZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFyZWQtPmZpbGVuYW1lID0gYWxsb2NwdHIgKyAoc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSArCi0JCQkJICAgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gICAgICBpZiAobmFtZWxlbikKLQltZW1jcHkgKGFyZWQtPmZpbGVuYW1lLCBoZHIuYXJfbmFtZSwgbmFtZWxlbik7Ci0gICAgICBhcmVkLT5maWxlbmFtZVtuYW1lbGVuXSA9ICdcMCc7Ci0gICAgfQotCi0gIHJldHVybiAoUFRSKSBhcmVkOwotfQotDAotLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbjsgaXQncyBtYWlubHkgdXNlZCB3aGVuIGluZGV4aW5nCi0gICB0aHJvdWdoIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSwgYnV0IGFsc28gdXNlZCB0byBnZXQgdGhlIG5leHQKLSAgIGVsZW1lbnQsIHNpbmNlIGl0IGhhbmRsZXMgdGhlIGJvb2trZWVwaW5nIHNvIG5pY2VseSBmb3IgdXMuICAqLwotCi1iZmQgKgotX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVwb3MpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbmV3X2FyZWxkYXRhOwotICBiZmQgKm5fbmZkOwotCi0gIG5fbmZkID0gX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUgKGFyY2hpdmUsIGZpbGVwb3MpOwotICBpZiAobl9uZmQpCi0gICAgcmV0dXJuIG5fbmZkOwotCi0gIGlmICgwID4gYmZkX3NlZWsgKGFyY2hpdmUsIGZpbGVwb3MsIFNFRUtfU0VUKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoKG5ld19hcmVsZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFyY2hpdmUpKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5fbmZkID0gX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIChhcmNoaXZlKTsKLSAgaWYgKG5fbmZkID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFyY2hpdmUsIChQVFIpIG5ld19hcmVsZGF0YSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbl9uZmQtPm9yaWdpbiA9IGJmZF90ZWxsIChhcmNoaXZlKTsKLSAgbl9uZmQtPmFyZWx0X2RhdGEgPSAoUFRSKSBuZXdfYXJlbGRhdGE7Ci0gIG5fbmZkLT5maWxlbmFtZSA9IG5ld19hcmVsZGF0YS0+ZmlsZW5hbWU7Ci0KLSAgaWYgKF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIChhcmNoaXZlLCBmaWxlcG9zLCBuX25mZCkpCi0gICAgcmV0dXJuIG5fbmZkOwotCi0gIC8qIGh1aD8gKi8KLSAgYmZkX3JlbGVhc2UgKGFyY2hpdmUsIChQVFIpIG5fbmZkKTsKLSAgYmZkX3JlbGVhc2UgKGFyY2hpdmUsIChQVFIpIG5ld19hcmVsZGF0YSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXR1cm4gdGhlIEJGRCB3aGljaCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBzeW1ib2wgaW4gQUJGRCBpbmRleGVkIGJ5Ci0gICBJTkRFWC4gIElOREVYIHNob3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgYmZkX2dldF9uZXh0X21hcGVudC4gICovCi0KLWJmZCAqCi1fYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCAoYWJmZCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3ltaW5kZXggaW5kZXg7Ci17Ci0gIGNhcnN5bSAqZW50cnk7Ci0KLSAgZW50cnkgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyArIGluZGV4OwotICByZXR1cm4gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIGVudHJ5LT5maWxlX29mZnNldCk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUoYmZkICphcmNoaXZlLCBiZmQgKnByZXZpb3VzKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlZCBhIEJGRCwgQHZhcnthcmNoaXZlfSwgY29udGFpbmluZyBhbiBhcmNoaXZlIGFuZCBOVUxMLCBvcGVuCi0JYW4gaW5wdXQgQkZEIG9uIHRoZSBmaXJzdCBjb250YWluZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGF0LgotCVN1YnNlcXVlbnQgY2FsbHMgc2hvdWxkIHBhc3MKLQl0aGUgYXJjaGl2ZSBhbmQgdGhlIHByZXZpb3VzIHJldHVybiB2YWx1ZSB0byByZXR1cm4gYSBjcmVhdGVkCi0JQkZEIHRvIHRoZSBuZXh0IGNvbnRhaW5lZCBlbGVtZW50LiBOVUxMIGlzIHJldHVybmVkIHdoZW4gdGhlcmUKLQlhcmUgbm8gbW9yZS4KLQotKi8KLQotYmZkICoKLWJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2hpdmUsIGxhc3RfZmlsZSkKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBiZmQgKmxhc3RfZmlsZTsKLXsKLSAgaWYgKChiZmRfZ2V0X2Zvcm1hdCAoYXJjaGl2ZSkgIT0gYmZkX2FyY2hpdmUpIHx8Ci0gICAgICAoYXJjaGl2ZS0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gQkZEX1NFTkQgKGFyY2hpdmUsCi0JCSAgIG9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSwKLQkJICAgKGFyY2hpdmUsCi0JCSAgICBsYXN0X2ZpbGUpKTsKLX0KLQotYmZkICoKLWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBmaWxlX3B0ciBmaWxlc3RhcnQ7Ci0KLSAgaWYgKCFsYXN0X2ZpbGUpCi0gICAgZmlsZXN0YXJ0ID0gYmZkX2FyZGF0YSAoYXJjaGl2ZSktPmZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplID0gYXJlbHRfc2l6ZSAobGFzdF9maWxlKTsKLSAgICAgIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5Li4uCi0JIE5vdGUgdGhhdCBsYXN0X2ZpbGUtPm9yaWdpbiBjYW4gYmUgb2RkIGluIHRoZSBjYXNlIG9mCi0JIEJTRC00LjQtc3R5bGUgZWxlbWVudCB3aXRoIGEgbG9uZyBvZGQgc2l6ZS4gKi8KLSAgICAgIGZpbGVzdGFydCA9IGxhc3RfZmlsZS0+b3JpZ2luICsgc2l6ZTsKLSAgICAgIGZpbGVzdGFydCArPSBmaWxlc3RhcnQgJSAyOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVzdGFydCk7Ci19Ci0KLQotY29uc3QgYmZkX3RhcmdldCAqCi1iZmRfZ2VuZXJpY19hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFydGRhdGEgKnRkYXRhX2hvbGQ7Ci0gIGNoYXIgYXJtYWdbU0FSTUFHICsgMV07Ci0KLSAgdGRhdGFfaG9sZCA9IGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGFybWFnLCAxLCBTQVJNQUcsIGFiZmQpICE9IFNBUk1BRykKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSNpZmRlZiBHTlU5NjAKLSAgaWYgKHN0cm5jbXAgKGFybWFnLCBCRkRfR05VOTYwX0FSTUFHIChhYmZkKSwgU0FSTUFHKSAhPSAwKQotICAgIHJldHVybiAwOwotI2Vsc2UKLSAgaWYgKHN0cm5jbXAgKGFybWFnLCBBUk1BRywgU0FSTUFHKSAhPSAwICYmCi0gICAgICBzdHJuY21wIChhcm1hZywgQVJNQUdCLCBTQVJNQUcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICAvKiBXZSBhcmUgc2V0dGluZyBiZmRfYXJkYXRhKGFiZmQpIGhlcmUsIGJ1dCBzaW5jZSBiZmRfYXJkYXRhCi0gICAgIGludm9sdmVzIGEgY2FzdCwgd2UgY2FuJ3QgZG8gaXQgYXMgdGhlIGxlZnQgb3BlcmFuZCBvZiBhc3NpZ25tZW50LiAqLwotICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSAoKHN0cnVjdCBhcnRkYXRhICopCi0JCQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcnRkYXRhKSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBTQVJNQUc7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IE5VTEw7Ci0KLSAgaWYgKCFCRkRfU0VORCAoYWJmZCwgX2JmZF9zbHVycF9hcm1hcCwgKGFiZmQpKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoIUJGRF9TRU5EIChhYmZkLCBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUsIChhYmZkKSkpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmQgKmZpcnN0OwotCi0gICAgICAvKiBUaGlzIGFyY2hpdmUgaGFzIGEgbWFwLCBzbyB3ZSBtYXkgcHJlc3VtZSB0aGF0IHRoZSBjb250ZW50cwotCSBhcmUgb2JqZWN0IGZpbGVzLiAgTWFrZSBzdXJlIHRoYXQgaWYgdGhlIGZpcnN0IGZpbGUgaW4gdGhlCi0JIGFyY2hpdmUgY2FuIGJlIHJlY29nbml6ZWQgYXMgYW4gb2JqZWN0IGZpbGUsIGl0IGlzIGZvciB0aGlzCi0JIHRhcmdldC4gIElmIG5vdCwgYXNzdW1lIHRoYXQgdGhpcyBpcyB0aGUgd3JvbmcgZm9ybWF0LiAgSWYKLQkgdGhlIGZpcnN0IGZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlLCBzb21lYm9keSBpcyBkb2luZwotCSBzb21ldGhpbmcgd2VpcmQsIGFuZCB3ZSBwZXJtaXQgaXQgc28gdGhhdCBhciAtdCB3aWxsIHdvcmsuCi0KLQkgVGhpcyBpcyBkb25lIGJlY2F1c2UgYW55IG5vcm1hbCBmb3JtYXQgd2lsbCByZWNvZ25pemUgYW55Ci0JIG5vcm1hbCBhcmNoaXZlLCByZWdhcmRsZXNzIG9mIHRoZSBmb3JtYXQgb2YgdGhlIG9iamVjdCBmaWxlcy4KLQkgV2UgZG8gYWNjZXB0IGFuIGVtcHR5IGFyY2hpdmUuICAqLwotCi0gICAgICBmaXJzdCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgICBpZiAoZmlyc3QgIT0gTlVMTCkKLQl7Ci0JICBib29sZWFuIGZhaWw7Ci0KLQkgIGZpcnN0LT50YXJnZXRfZGVmYXVsdGVkID0gZmFsc2U7Ci0JICBmYWlsID0gZmFsc2U7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlyc3QsIGJmZF9vYmplY3QpCi0JICAgICAgJiYgZmlyc3QtPnh2ZWMgIT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGZpcnN0KTsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotCSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgLyogV2Ugb3VnaHQgdG8gY2xvc2UgZmlyc3QgaGVyZSwgYnV0IHdlIGNhbid0LCBiZWNhdXNlIHdlCi0gICAgICAgICAgICAgaGF2ZSBubyB3YXkgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFyY2hpdmUgY2FjaGUuICBGSVhNRS4gICovCi0JfQotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogU29tZSBjb25zdGFudHMgZm9yIGEgMzIgYml0IEJTRCBhcmNoaXZlIHN0cnVjdHVyZS4gIFdlIGRvIG5vdAotICAgc3VwcG9ydCA2NCBiaXQgYXJjaGl2ZXMgcHJlc2VudGx5OyBzbyBmYXIgYXMgSSBrbm93LCBub25lIGFjdHVhbGx5Ci0gICBleGlzdC4gIFN1cHBvcnRpbmcgdGhlbSB3b3VsZCByZXF1aXJlIGNoYW5naW5nIHRoZXNlIGNvbnN0YW50cywgYW5kCi0gICBjaGFuZ2luZyBzb21lIGJmZF9oX2dldF8zMiB0byBiZmRfaF9nZXRfNjQuICAqLwotCi0vKiBUaGUgc2l6ZSBvZiBhbiBleHRlcm5hbCBzeW1kZWYgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgQlNEX1NZTURFRl9TSVpFIDgKLQotLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBhIHN5bWRlZiBzdHJ1Y3R1cmUgdG8gdGhlIGZpbGUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgQlNEX1NZTURFRl9PRkZTRVRfU0laRSA0Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzeW1kZWYgY291bnQuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX0NPVU5UX1NJWkUgNAotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc3RyaW5nIGNvdW50LiAgKi8KLSNkZWZpbmUgQlNEX1NUUklOR19DT1VOVF9TSVpFIDQKLQotLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRvX3NsdXJwX2JzZF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICptYXBkYXRhOwotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgYmZkX2J5dGUgKnJhd19hcm1hcCwgKnJiYXNlOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsKLSAgY2Fyc3ltICpzZXQ7Ci0KLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwkvKiBEb24ndCBuZWVkIGl0IGFueSBtb3JlLiAqLwotCi0gIHJhd19hcm1hcCA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBwYXJzZWRfc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBwYXJzZWRfc2l6ZSwgYWJmZCkgIT0gcGFyc2VkX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgYnllYnllOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFyZGF0YS0+c3ltZGVmX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXdfYXJtYXApIC8gQlNEX1NZTURFRl9TSVpFOwotCi0gIGlmIChhcmRhdGEtPnN5bWRlZl9jb3VudCAqIEJTRF9TWU1ERUZfU0laRSA+Ci0gICAgICBwYXJzZWRfc2l6ZSAtIEJTRF9TWU1ERUZfQ09VTlRfU0laRSkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSB3ZSdyZSB1c2luZyB0aGUgd3JvbmcgYnl0ZSBvcmRlcmluZy4gICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIGdvdG8gYnllYnllOwotICAgIH0KLQotICBhcmRhdGEtPmNhY2hlID0gMDsKLSAgcmJhc2UgPSByYXdfYXJtYXAgKyBCU0RfU1lNREVGX0NPVU5UX1NJWkU7Ci0gIHN0cmluZ2Jhc2UgPSAoKGNoYXIgKikgcmJhc2UKLQkJKyBhcmRhdGEtPnN5bWRlZl9jb3VudCAqIEJTRF9TWU1ERUZfU0laRQotCQkrIEJTRF9TVFJJTkdfQ09VTlRfU0laRSk7Ci0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgIChhcmRhdGEtPnN5bWRlZl9jb3VudAotCQkJCQkgICAqIHNpemVvZiAoY2Fyc3ltKSkpOwotICBpZiAoIWFyZGF0YS0+c3ltZGVmcykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChjb3VudGVyID0gMCwgc2V0ID0gYXJkYXRhLT5zeW1kZWZzOwotICAgICAgIGNvdW50ZXIgPCBhcmRhdGEtPnN5bWRlZl9jb3VudDsKLSAgICAgICBjb3VudGVyKyssIHNldCsrLCByYmFzZSArPSBCU0RfU1lNREVGX1NJWkUpCi0gICAgewotICAgICAgc2V0LT5uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSkgKyBzdHJpbmdiYXNlOwotICAgICAgc2V0LT5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmJhc2UgKyBCU0RfU1lNREVGX09GRlNFVF9TSVpFKTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5IGlmIHlvdSBoYXZlIHRvICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9IChhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcykgJSAyOwotICAvKiBGSVhNRSwgd2Ugc2hvdWxkIHByb3ZpZGUgc29tZSB3YXkgdG8gZnJlZSByYXdfYXJkYXRhIHdoZW4KLSAgICAgd2UgYXJlIGRvbmUgdXNpbmcgdGhlIHN0cmluZ3MgZnJvbSBpdC4gIEZvciBub3csIGl0IHNlZW1zCi0gICAgIHRvIGJlIGFsbG9jYXRlZCBvbiBhbiBvYmphbGxvYyBhbnl3YXkuLi4gKi8KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi1zdGF0aWMgYm9vbGVhbgotZG9fc2x1cnBfY29mZl9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICptYXBkYXRhOwotICBpbnQgKnJhd19hcm1hcCwgKnJhd3B0cjsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyICpzdHJpbmdiYXNlOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZTsKLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOwotICBjYXJzeW0gKmNhcnN5bXM7Ci0gIHVuc2lnbmVkIGludCBuc3ltejsJCS8qIE51bWJlciBvZiBzeW1ib2xzIGluIGFybWFwLiAqLwotICBiZmRfdm1hICgqc3dhcCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBjaGFyIGludF9idWZbc2l6ZW9mIChsb25nKV07Ci0gIHVuc2lnbmVkIGludCBjYXJzeW1fc2l6ZSwgcHRyc2l6ZSwgaTsKLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBwYXJzZWRfc2l6ZSA9IG1hcGRhdGEtPnBhcnNlZF9zaXplOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7CS8qIERvbid0IG5lZWQgaXQgYW55IG1vcmUuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBpbnRfYnVmLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLyogSXQgc2VlbXMgdGhhdCBhbGwgbnVtZXJpYyBpbmZvcm1hdGlvbiBpbiBhIGNvZmYgYXJjaGl2ZSBpcyBhbHdheXMKLSAgICAgaW4gYmlnIGVuZGlhbiBmb3JtYXQsIG5vbWF0dGVyIHRoZSBob3N0IG9yIHRhcmdldC4gKi8KLSAgc3dhcCA9IGJmZF9nZXRiMzI7Ci0gIG5zeW16ID0gYmZkX2dldGIzMiAoKFBUUikgaW50X2J1Zik7Ci0gIHN0cmluZ3NpemUgPSBwYXJzZWRfc2l6ZSAtICg0ICogbnN5bXopIC0gNDsKLQotI2lmIDEKLSAgLyogLi4uIGV4Y2VwdCB0aGF0IHNvbWUgYXJjaGl2ZSBmb3JtYXRzIGFyZSBicm9rZW4sIGFuZCBpdCBtYXkgYmUgb3VyCi0gICAgIGZhdWx0IC0gdGhlIGk5NjAgbGl0dGxlIGVuZGlhbiBjb2ZmIHNvbWV0aW1lcyBoYXMgYmlnIGFuZCBzb21ldGltZXMKLSAgICAgbGl0dGxlLCBiZWNhdXNlIG91ciB0b29scyBjaGFuZ2VkLiAgSGVyZSdzIGEgaG9ycmlibGUgaGFjayB0byBjbGVhbgotICAgICB1cCB0aGUgY3JhcC4gICovCi0KLSAgaWYgKHN0cmluZ3NpemUgPiAweGZmZmZmCi0gICAgICAmJiBiZmRfZ2V0X2FyY2ggKGFiZmQpID09IGJmZF9hcmNoX2k5NjAKLSAgICAgICYmIGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgewotICAgICAgLyogVGhpcyBsb29rcyBkYW5nZXJvdXMsIGxldCdzIGRvIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kICovCi0gICAgICBuc3lteiA9IGJmZF9nZXRsMzIgKChQVFIpIGludF9idWYpOwotICAgICAgc3RyaW5nc2l6ZSA9IHBhcnNlZF9zaXplIC0gKDQgKiBuc3lteikgLSA0OwotICAgICAgc3dhcCA9IGJmZF9nZXRsMzI7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogVGhlIGNvZmYgYXJtYXAgbXVzdCBiZSByZWFkIHNlcXVlbnRpYWxseS4gIFNvIHdlIGNvbnN0cnVjdCBhCi0gICAgIGJzZC1zdHlsZSBvbmUgaW4gY29yZSBhbGwgYXQgb25jZSwgZm9yIHNpbXBsaWNpdHkuICovCi0KLSAgY2Fyc3ltX3NpemUgPSAobnN5bXogKiBzaXplb2YgKGNhcnN5bSkpOwotICBwdHJzaXplID0gKDQgKiBuc3lteik7Ci0KLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfemFsbG9jIChhYmZkLCBjYXJzeW1fc2l6ZSArIHN0cmluZ3NpemUgKyAxKTsKLSAgaWYgKGFyZGF0YS0+c3ltZGVmcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgY2Fyc3ltcyA9IGFyZGF0YS0+c3ltZGVmczsKLSAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSBhcmRhdGEtPnN5bWRlZnMpICsgY2Fyc3ltX3NpemU7Ci0KLSAgLyogQWxsb2NhdGUgYW5kIHJlYWQgaW4gdGhlIHJhdyBvZmZzZXRzLiAqLwotICByYXdfYXJtYXAgPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgcHRyc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gTlVMTCkKLSAgICBnb3RvIHJlbGVhc2Vfc3ltZGVmczsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHB0cnNpemUsIGFiZmQpICE9IHB0cnNpemUKLSAgICAgIHx8IGJmZF9yZWFkICgoUFRSKSBzdHJpbmdiYXNlLCAxLCBzdHJpbmdzaXplLCBhYmZkKSAhPSBzdHJpbmdzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgZ290byByZWxlYXNlX3Jhd19hcm1hcDsKLSAgICB9Ci0KLSAgLyogT0ssIGJ1aWxkIHRoZSBjYXJzeW1zICovCi0gIGZvciAoaSA9IDA7IGkgPCBuc3ltejsgaSsrKQotICAgIHsKLSAgICAgIHJhd3B0ciA9IHJhd19hcm1hcCArIGk7Ci0gICAgICBjYXJzeW1zLT5maWxlX29mZnNldCA9IHN3YXAgKChQVFIpIHJhd3B0cik7Ci0gICAgICBjYXJzeW1zLT5uYW1lID0gc3RyaW5nYmFzZTsKLSAgICAgIHN0cmluZ2Jhc2UgKz0gc3RybGVuIChzdHJpbmdiYXNlKSArIDE7Ci0gICAgICBjYXJzeW1zKys7Ci0gICAgfQotICAqc3RyaW5nYmFzZSA9IDA7Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBuc3ltejsKLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5IGlmIHlvdSBoYXZlIHRvICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9IChhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcykgJSAyOwotCi0KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0KLQotICAvKiBDaGVjayBmb3IgYSBzZWNvbmQgYXJjaGl2ZSBoZWFkZXIgKGFzIHVzZWQgYnkgUEUpICovCi0gIHsKLSAgICBzdHJ1Y3QgYXJlbHRkYXRhICp0bXA7Ci0KLSAgICBiZmRfc2VlayAoYWJmZCwgICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcywgU0VFS19TRVQpOwotICAgIHRtcCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICAgIGlmICh0bXAgIT0gTlVMTCkgCi0gICAgICB7Ci0JaWYgKHRtcC0+YXJjaF9oZWFkZXJbMF0gPT0gJy8nCi0JICAgICYmIHRtcC0+YXJjaF9oZWFkZXJbMV0gPT0gJyAnKSAKLQkgIHsKLQkgICAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0KLQkgICAgICAodG1wLT5wYXJzZWRfc2l6ZSArIHNpemVvZihzdHJ1Y3QgYXJfaGRyKSArIDEpICYgfjE7Ci0JICB9Ci0JYmZkX3JlbGVhc2UgKGFiZmQsIHRtcCk7Ci0gICAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotcmVsZWFzZV9yYXdfYXJtYXA6Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotcmVsZWFzZV9zeW1kZWZzOgotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgKGFyZGF0YSktPnN5bWRlZnMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gaGFuZGxlIGVpdGhlciBjb2ZmLXN0eWxlIG9yIGJzZC1zdHlsZSBhcm1hcHMuCi0gICBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotCi1ib29sZWFuCi1iZmRfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtIDE2LCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIl9fLlNZTURFRiAgICAgICAiLCAxNikKLSAgICAgIHx8ICFzdHJuY21wIChuZXh0bmFtZSwgIl9fLlNZTURFRi8gICAgICAiLCAxNikpIC8qIG9sZCBMaW51eCBhcmNoaXZlcyAqLwotICAgIHJldHVybiBkb19zbHVycF9ic2RfYXJtYXAgKGFiZmQpOwotICBlbHNlIGlmICghc3RybmNtcCAobmV4dG5hbWUsICIvICAgICAgICAgICAgICAgIiwgMTYpKQotICAgIHJldHVybiBkb19zbHVycF9jb2ZmX2FybWFwIChhYmZkKTsKLSAgZWxzZSBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiL1NZTTY0LyAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICAvKiBJcml4IDYgYXJjaGl2ZS0tbXVzdCBiZSByZWNvZ25pemVkIGJ5IGNvZGUgaW4gZWxmNjQtbWlwcy5jLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotLyogZmxhdm9yIDIgb2YgYSBic2QgYXJtYXAsIHNpbWlsYXIgdG8gYmZkX3NsdXJwX2JzZF9hcm1hcCBleGNlcHQgdGhlCi0gICBoZWFkZXIgaXMgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgb3JkZXIgYW5kIHRoZSBtYXAgbmFtZSBpcyAnLycuCi0gICBUaGlzIGZsYXZvdXIgaXMgdXNlZCBieSBocDMwMGhwdXguICovCi0KLSNkZWZpbmUgSFBVWF9TWU1ERUZfQ09VTlRfU0laRSAyCi0KLWJvb2xlYW4KLWJmZF9zbHVycF9ic2RfYXJtYXBfZjIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBiZmRfYnl0ZSAqcmF3X2FybWFwLCAqcmJhc2U7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemU7Ci0gIGNhcnN5bSAqc2V0OwotICBpbnQgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotCi0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgYXJjaGl2ZSBoYXMgYXQgbGVhc3QgMTYgYnl0ZXMgaW4gaXQgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAtMTZMLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIl9fLlNZTURFRiAgICAgICAiLCAxNikKLSAgICAgIHx8ICFzdHJuY21wIChuZXh0bmFtZSwgIl9fLlNZTURFRi8gICAgICAiLCAxNikpIC8qIG9sZCBMaW51eCBhcmNoaXZlcyAqLwotICAgIHJldHVybiBkb19zbHVycF9ic2RfYXJtYXAgKGFiZmQpOwotCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikpCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByYXdfYXJtYXAgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgbWFwZGF0YS0+cGFyc2VkX3NpemUpOwotICBpZiAocmF3X2FybWFwID09IE5VTEwpCi0gICAgewotICAgIGJ5ZWJ5ZToKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIG1hcGRhdGEtPnBhcnNlZF9zaXplLCBhYmZkKSAhPQotICAgICAgbWFwZGF0YS0+cGFyc2VkX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgYnllYnllYnllOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0gICAgICBnb3RvIGJ5ZWJ5ZTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0KLSAgaWYgKGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFCi0gICAgICA+IG1hcGRhdGEtPnBhcnNlZF9zaXplIC0gSFBVWF9TWU1ERUZfQ09VTlRfU0laRSkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSB3ZSdyZSB1c2luZyB0aGUgd3JvbmcgYnl0ZSBvcmRlcmluZy4gICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIGdvdG8gYnllYnllYnllOwotICAgIH0KLQotICBhcmRhdGEtPmNhY2hlID0gMDsKLQotICBzdHJpbmdzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXdfYXJtYXAgKyBIUFVYX1NZTURFRl9DT1VOVF9TSVpFKTsKLSAgLyogc2tpcCBzeW0gY291bnQgYW5kIHN0cmluZyBzeiAqLwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIHJhd19hcm1hcAotCQkrIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUKLQkJKyBCU0RfU1RSSU5HX0NPVU5UX1NJWkUpOwotICByYmFzZSA9IChiZmRfYnl0ZSAqKSBzdHJpbmdiYXNlICsgc3RyaW5nc2l6ZTsKLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgKGFyZGF0YS0+c3ltZGVmX2NvdW50Ci0JCQkJCSAgICogQlNEX1NZTURFRl9TSVpFKSk7Ci0gIGlmICghYXJkYXRhLT5zeW1kZWZzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ZXIgPSAwLCBzZXQgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gICAgICAgY291bnRlciA8IGFyZGF0YS0+c3ltZGVmX2NvdW50OwotICAgICAgIGNvdW50ZXIrKywgc2V0KyssIHJiYXNlICs9IEJTRF9TWU1ERUZfU0laRSkKLSAgICB7Ci0gICAgICBzZXQtPm5hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlKSArIHN0cmluZ2Jhc2U7Ci0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSArIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUpOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0gIC8qIEZJWE1FLCB3ZSBzaG91bGQgcHJvdmlkZSBzb21lIHdheSB0byBmcmVlIHJhd19hcmRhdGEgd2hlbgotICAgICB3ZSBhcmUgZG9uZSB1c2luZyB0aGUgc3RyaW5ncyBmcm9tIGl0LiAgRm9yIG5vdywgaXQgc2VlbXMKLSAgICAgdG8gYmUgYWxsb2NhdGVkIG9uIGFuIG9iamFsbG9jIGFueXdheS4uLiAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBFeHRlbmRlZCBuYW1lIHRhYmxlLgotCi0gIE5vcm1hbGx5IGFyY2hpdmVzIHN1cHBvcnQgb25seSAxNC1jaGFyYWN0ZXIgZmlsZW5hbWVzLgotCi0gIEludGVsIGhhcyBleHRlbmRlZCB0aGUgZm9ybWF0OiBsb25nZXIgbmFtZXMgYXJlIHN0b3JlZCBpbiBhIHNwZWNpYWwKLSAgZWxlbWVudCAodGhlIGZpcnN0IGluIHRoZSBhcmNoaXZlLCBvciBzZWNvbmQgaWYgdGhlcmUgaXMgYW4gYXJtYXApOwotICB0aGUgbmFtZSBpbiB0aGUgYXJfaGRyIGlzIHJlcGxhY2VkIGJ5IDxzcGFjZT48aW5kZXggaW50byBmaWxlbmFtZQotICBlbGVtZW50Pi4gIEluZGV4IGlzIHRoZSBQLlIuIG9mIGFuIGludCAoZGVjaW1hbCkuICBEYXRhIEdlbmVyYWwgaGF2ZQotICBleHRlbmRlZCB0aGUgZm9ybWF0IGJ5IHVzaW5nIHRoZSBwcmVmaXggLy8gZm9yIHRoZSBzcGVjaWFsIGVsZW1lbnQgKi8KLQotLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLWJvb2xlYW4KLV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbmFtZWRhdGE7Ci0KLSAgLyogRklYTUU6ICBGb3JtYXR0aW5nIHN1Y2tzIGhlcmUsIGFuZCBpbiBjYXNlIG9mIGZhaWx1cmUgb2YgQkZEX1JFQUQsCi0gICAgIHdlIHByb2JhYmx5IGRvbid0IHdhbnQgdG8gcmV0dXJuIHRydWUuICAqLwotICBiZmRfc2VlayAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcywgU0VFS19TRVQpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCkgPT0gMTYpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiQVJGSUxFTkFNRVMvICAgICIsIDE2KSAhPSAwICYmCi0JICBzdHJuY21wIChuZXh0bmFtZSwgIi8vICAgICAgICAgICAgICAiLCAxNikgIT0gMCkKLQl7Ci0JICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBuYW1lZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICAgICAgaWYgKG5hbWVkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPQotCWJmZF96YWxsb2MgKGFiZmQsIG5hbWVkYXRhLT5wYXJzZWRfc2l6ZSk7Ci0gICAgICBpZiAoYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID09IE5VTEwpCi0JewotCWJ5ZWJ5ZToKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBuYW1lZGF0YSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcywgMSwKLQkJICAgIG5hbWVkYXRhLT5wYXJzZWRfc2l6ZSwgYWJmZCkgIT0gbmFtZWRhdGEtPnBhcnNlZF9zaXplKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSAoYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzKSk7Ci0JICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotCSAgZ290byBieWVieWU7Ci0JfQotCi0gICAgICAvKiBTaW5jZSB0aGUgYXJjaGl2ZSBpcyBzdXBwb3NlZCB0byBiZSBwcmludGFibGUgaWYgaXQgY29udGFpbnMKLQkgdGV4dCwgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYXJlIG5ld2xpbmUtcGFkZGVkLCBub3QgbnVsbAotCSBwYWRkZWQuIEluIFNWUjQtc3R5bGUgYXJjaGl2ZXMsIHRoZSBuYW1lcyBhbHNvIGhhdmUgYQotCSB0cmFpbGluZyAnLycuICBET1MvTlQgY3JlYXRlZCBhcmNoaXZlIG9mdGVuIGhhdmUgXCBpbiB0aGVtCi0JIFdlJ2xsIGZpeCBhbGwgcHJvYmxlbXMgaGVyZS4uICAqLwotICAgICAgewotCWNoYXIgKnRlbXAgPSBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXM7Ci0JY2hhciAqbGltaXQgPSB0ZW1wICsgbmFtZWRhdGEtPnBhcnNlZF9zaXplOwotCWZvciAoOyB0ZW1wIDwgbGltaXQ7ICsrdGVtcCkgewotCSAgaWYgKCp0ZW1wID09ICdcMDEyJykKLQkgICAgdGVtcFt0ZW1wWy0xXSA9PSAnLycgPyAtMSA6IDBdID0gJ1wwJzsKLQkgIGlmICgqdGVtcCA9PSAnXFwnKQotCSAgICAqdGVtcCA9ICcvJzsKLQl9Ci0gICAgICB9Ci0KLSAgICAgIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5IGlmIHlvdSBoYXZlIHRvICovCi0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyArPQotCShiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0KLSAgICAgIC8qIEZJWE1FLCB3ZSBjYW4ndCByZWxlYXNlIG5hbWVkYXRhIGhlcmUgYmVjYXVzZSBpdCB3YXMgYWxsb2NhdGVkCi0JIGJlbG93IGV4dGVuZGVkX25hbWVzIG9uIHRoZSBvYmphbGxvYy4uLiAqLwotICAgICAgLyogYmZkX3JlbGVhc2UgKGFiZmQsIG5hbWVkYXRhKTsgKi8KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgVk1TCi0KLS8qIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0dWZmIGluIHRoZSBmaWxlbmFtZSBiZXR3ZWVuIGFueSA6XT4gYW5kIGEKLSAgIHNlbWljb2xvbiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ybWFsaXplIChhYmZkLCBmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIENPTlNUIGNoYXIgKmZpcnN0OwotICBDT05TVCBjaGFyICpsYXN0OwotICBjaGFyICpjb3B5OwotCi0gIGZpcnN0ID0gZmlsZSArIHN0cmxlbiAoZmlsZSkgLSAxOwotICBsYXN0ID0gZmlyc3QgKyAxOwotCi0gIHdoaWxlIChmaXJzdCAhPSBmaWxlKQotICAgIHsKLSAgICAgIGlmICgqZmlyc3QgPT0gJzsnKQotCWxhc3QgPSBmaXJzdDsKLSAgICAgIGlmICgqZmlyc3QgPT0gJzonIHx8ICpmaXJzdCA9PSAnXScgfHwgKmZpcnN0ID09ICc+JykKLQl7Ci0JICBmaXJzdCsrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZmlyc3QtLTsKLSAgICB9Ci0KLSAgY29weSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgbGFzdCAtIGZpcnN0ICsgMSk7Ci0gIGlmIChjb3B5ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbWVtY3B5IChjb3B5LCBmaXJzdCwgbGFzdCAtIGZpcnN0KTsKLSAgY29weVtsYXN0IC0gZmlyc3RdID0gMDsKLQotICByZXR1cm4gY29weTsKLX0KLQotI2Vsc2UKLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZSAoYWJmZCwgZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotewotICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7Ci0KLSAgaWYgKGZpbGVuYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgZmlsZW5hbWUrKzsKLSAgZWxzZQotICAgIGZpbGVuYW1lID0gZmlsZTsKLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotI2VuZGlmCi0KLS8qIEJ1aWxkIGEgQkZEIHN0eWxlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICoqdGFibG9jOwotICAgICBiZmRfc2l6ZV90eXBlICp0YWJsZW47Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lOwotewotICAqbmFtZSA9ICJBUkZJTEVOQU1FUy8iOwotICByZXR1cm4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgZmFsc2UsIHRhYmxvYywgdGFibGVuKTsKLX0KLQotLyogQnVpbGQgYW4gU1ZSNCBzdHlsZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIHRhYmxvYywgdGFibGVuLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKip0YWJsb2M7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRhYmxlbjsKLSAgICAgY29uc3QgY2hhciAqKm5hbWU7Ci17Ci0gICpuYW1lID0gIi8vIjsKLSAgcmV0dXJuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIHRydWUsIHRhYmxvYywgdGFibGVuKTsKLX0KLQotLyogRm9sbG93cyBhcmNoaXZlX2hlYWQgYW5kIHByb2R1Y2VzIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUgaWYKLSAgIG5lY2Vzc2FyeS4gIFJldHVybnMgKGluIHRhYmxvYykgYSBwb2ludGVyIHRvIGFuIGV4dGVuZGVkIG5hbWUKLSAgIHRhYmxlLCBhbmQgaW4gdGFibGVuIHRoZSBsZW5ndGggb2YgdGhlIHRhYmxlLiAgSWYgaXQgbWFrZXMgYW4gZW50cnkKLSAgIGl0IGNsb2JiZXJzIHRoZSBmaWxlbmFtZSBzbyB0aGF0IHRoZSBlbGVtZW50IG1heSBiZSB3cml0dGVuIHdpdGhvdXQKLSAgIGZ1cnRoZXIgbWFzc2FnZS4gIFJldHVybnMgdHJ1ZSBpZiBpdCByYW4gc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZgotICAgc29tZXRoaW5nIHdlbnQgd3JvbmcuICBBIHN1Y2Nlc3NmdWwgcmV0dXJuIG1heSBzdGlsbCBpbnZvbHZlIGEKLSAgIHplcm8tbGVuZ3RoIHRhYmxlbiEgICovCi0KLWJvb2xlYW4KLV9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIHRyYWlsaW5nX3NsYXNoLCB0YWJsb2MsIHRhYmxlbikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHRyYWlsaW5nX3NsYXNoOwotICAgICBjaGFyICoqdGFibG9jOwotICAgICBiZmRfc2l6ZV90eXBlICp0YWJsZW47Ci17Ci0gIHVuc2lnbmVkIGludCBtYXhuYW1lID0gYWJmZC0+eHZlYy0+YXJfbWF4X25hbWVsZW47Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9uYW1lbGVuID0gMDsKLSAgYmZkICpjdXJyZW50OwotICBjaGFyICpzdHJwdHI7Ci0KLSAgKnRhYmxlbiA9IDA7Ci0KLSAgLyogRmlndXJlIG91dCBob3cgbG9uZyB0aGUgdGFibGUgc2hvdWxkIGJlICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpub3JtYWw7Ci0gICAgICB1bnNpZ25lZCBpbnQgdGhpc2xlbjsKLQotICAgICAgbm9ybWFsID0gbm9ybWFsaXplIChjdXJyZW50LCBjdXJyZW50LT5maWxlbmFtZSk7Ci0gICAgICBpZiAobm9ybWFsID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICB0aGlzbGVuID0gc3RybGVuIChub3JtYWwpOwotCi0gICAgICBpZiAodGhpc2xlbiA+IG1heG5hbWUKLQkgICYmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLQl0aGlzbGVuID0gbWF4bmFtZTsKLQotICAgICAgaWYgKHRoaXNsZW4gPiBtYXhuYW1lKQotCXsKLQkgIC8qIEFkZCBvbmUgdG8gbGVhdmUgcm9vbSBmb3IgXG4uICAqLwotCSAgdG90YWxfbmFtZWxlbiArPSB0aGlzbGVuICsgMTsKLQkgIGlmICh0cmFpbGluZ19zbGFzaCkKLQkgICAgewotCSAgICAgIC8qIExlYXZlIHJvb20gZm9yIHRyYWlsaW5nIHNsYXNoLiAgKi8KLQkgICAgICArK3RvdGFsX25hbWVsZW47Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGFyX2hkciAqaGRyID0gYXJjaF9oZHIgKGN1cnJlbnQpOwotCSAgaWYgKHN0cm5jbXAgKG5vcm1hbCwgaGRyLT5hcl9uYW1lLCB0aGlzbGVuKSAhPSAwCi0JICAgICAgfHwgKHRoaXNsZW4gPCBzaXplb2YgaGRyLT5hcl9uYW1lCi0JCSAgJiYgaGRyLT5hcl9uYW1lW3RoaXNsZW5dICE9IGFyX3BhZGNoYXIgKGN1cnJlbnQpKSkKLQkgICAgewotCSAgICAgIC8qIE11c3QgaGF2ZSBiZWVuIHVzaW5nIGV4dGVuZGVkIGZvcm1hdCBldmVuIHRob3VnaCBpdAotCSAgICAgICAgIGRpZG4ndCBuZWVkIHRvLiAgRml4IGl0IHRvIHVzZSBub3JtYWwgZm9ybWF0LiAgKi8KLQkgICAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgbm9ybWFsLCB0aGlzbGVuKTsKLQkgICAgICBpZiAodGhpc2xlbiA8IG1heG5hbWUKLQkJICB8fCAodGhpc2xlbiA9PSBtYXhuYW1lICYmIHRoaXNsZW4gPCBzaXplb2YgaGRyLT5hcl9uYW1lKSkKLQkJaGRyLT5hcl9uYW1lW3RoaXNsZW5dID0gYXJfcGFkY2hhciAoY3VycmVudCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICh0b3RhbF9uYW1lbGVuID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgKnRhYmxvYyA9IGJmZF96YWxsb2MgKGFiZmQsIHRvdGFsX25hbWVsZW4pOwotICBpZiAoKnRhYmxvYyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqdGFibGVuID0gdG90YWxfbmFtZWxlbjsKLSAgc3RycHRyID0gKnRhYmxvYzsKLQotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9Ci0gICAgICAgY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpub3JtYWw7Ci0gICAgICB1bnNpZ25lZCBpbnQgdGhpc2xlbjsKLQotICAgICAgbm9ybWFsID0gbm9ybWFsaXplIChjdXJyZW50LCBjdXJyZW50LT5maWxlbmFtZSk7Ci0gICAgICBpZiAobm9ybWFsID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICB0aGlzbGVuID0gc3RybGVuIChub3JtYWwpOwotICAgICAgaWYgKHRoaXNsZW4gPiBtYXhuYW1lKQotCXsKLQkgIC8qIFdvcmtzIGZvciBub3c7IG1heSBuZWVkIHRvIGJlIHJlLWVuZ2luZWVyZWQgaWYgd2UKLQkgICAgIGVuY291bnRlciBhbiBvZGRiYWxsIGFyY2hpdmUgZm9ybWF0IGFuZCB3YW50IHRvCi0JICAgICBnZW5lcmFsaXNlIHRoaXMgaGFjay4gKi8KLQkgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQkgIHN0cmNweSAoc3RycHRyLCBub3JtYWwpOwotCSAgaWYgKCEgdHJhaWxpbmdfc2xhc2gpCi0JICAgIHN0cnB0clt0aGlzbGVuXSA9ICdcMDEyJzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnB0clt0aGlzbGVuXSA9ICcvJzsKLQkgICAgICBzdHJwdHJbdGhpc2xlbiArIDFdID0gJ1wwMTInOwotCSAgICB9Ci0JICBoZHItPmFyX25hbWVbMF0gPSBhcl9wYWRjaGFyIChjdXJyZW50KTsKLQkgIC8qIFdlIGtub3cgdGhlcmUgd2lsbCBhbHdheXMgYmUgZW5vdWdoIHJvb20gKG9uZSBvZiB0aGUgZmV3Ci0JICAgICBjYXNlcyB3aGVyZSB5b3UgbWF5IHNhZmVseSB1c2Ugc3ByaW50ZikuICovCi0JICBzcHJpbnRmICgoaGRyLT5hcl9uYW1lKSArIDEsICIlLWQiLCAodW5zaWduZWQpIChzdHJwdHIgLSAqdGFibG9jKSk7Ci0JICAvKiBLaW5kYSBLbHVkZ3kuICBXZSBzaG91bGQganVzdCB1c2UgdGhlIHJldHVybmVkIHZhbHVlIG9mCi0JICAgICBzcHJpbnRmIGJ1dCBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBnZXQgdGhpcyByaWdodCAqLwotCSAgewotCSAgICBjaGFyICp0ZW1wID0gaGRyLT5hcl9uYW1lICsgMjsKLQkgICAgZm9yICg7IHRlbXAgPCBoZHItPmFyX25hbWUgKyBtYXhuYW1lOyB0ZW1wKyspCi0JICAgICAgaWYgKCp0ZW1wID09ICdcMCcpCi0JCSp0ZW1wID0gJyAnOwotCSAgfQotCSAgc3RycHRyICs9IHRoaXNsZW4gKyAxOwotCSAgaWYgKHRyYWlsaW5nX3NsYXNoKQotCSAgICArK3N0cnB0cjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIEEgY291cGxlIG9mIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYXJfaGRycyAqLwotCi0jaWZuZGVmIEhBVkVfR0VUVUlECi0jZGVmaW5lIGdldHVpZCgpIDAKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR0VUR0lECi0jZGVmaW5lIGdldGdpZCgpIDAKLSNlbmRpZgotCi0vKiBUYWtlcyBhIGZpbGVuYW1lLCByZXR1cm5zIGFuIGFyZWx0X2RhdGEgZm9yIGl0LCBvciBOVUxMIGlmIGl0IGNhbid0Ci0gICBtYWtlIG9uZS4gIFRoZSBmaWxlbmFtZSBtdXN0IHJlZmVyIHRvIGEgZmlsZW5hbWUgaW4gdGhlIGZpbGVzeXN0ZW0uCi0gICBUaGUgZmlsZW5hbWUgZmllbGQgb2YgdGhlIGFyX2hkciB3aWxsIE5PVCBiZSBpbml0aWFsaXplZC4gIElmIG1lbWJlcgotICAgaXMgc2V0LCBhbmQgaXQncyBhbiBpbi1tZW1vcnkgYmZkLCB3ZSBmYWtlIGl0LiAqLwotCi1zdGF0aWMgc3RydWN0IGFyZWx0ZGF0YSAqCi1iZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSAoYWJmZCwgZmlsZW5hbWUsIG1lbWJlcikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgYmZkICptZW1iZXI7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0YXR1czsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqYXJlZDsKLSAgc3RydWN0IGFyX2hkciAqaGRyOwotICBjaGFyICp0ZW1wLCAqdGVtcDE7Ci0KLSAgaWYgKG1lbWJlciAmJiAobWVtYmVyLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgLyogQXNzdW1lIHdlIGp1c3QgIm1hZGUiIHRoZSBtZW1iZXIsIGFuZCBmYWtlIGl0ICovCi0gICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIG1lbWJlci0+aW9zdHJlYW07Ci0gICAgICB0aW1lKCZzdGF0dXMuc3RfbXRpbWUpOwotICAgICAgc3RhdHVzLnN0X3VpZCA9IGdldHVpZCgpOwotICAgICAgc3RhdHVzLnN0X2dpZCA9IGdldGdpZCgpOwotICAgICAgc3RhdHVzLnN0X21vZGUgPSAwNjQ0OwotICAgICAgc3RhdHVzLnN0X3NpemUgPSBiaW0tPnNpemU7Ci0gICAgfQotICBlbHNlIGlmIChzdGF0IChmaWxlbmFtZSwgJnN0YXR1cykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFyZWQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLSAgaWYgKGFyZWQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgKCgoY2hhciAqKSBhcmVkKSArIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOwotCi0gIC8qIGFyIGhlYWRlcnMgYXJlIHNwYWNlIHBhZGRlZCwgbm90IG51bGwgcGFkZGVkISAqLwotICBtZW1zZXQgKChQVFIpIGhkciwgJyAnLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLQotICBzdHJuY3B5IChoZHItPmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0KLSAgLyogR29kZGFtbmVkIHNwcmludGYgZG9lc24ndCBwZXJtaXQgTUFYSU1VTSBmaWVsZCBsZW5ndGhzICovCi0gIHNwcmludGYgKChoZHItPmFyX2RhdGUpLCAiJS0xMmxkIiwgKGxvbmcpIHN0YXR1cy5zdF9tdGltZSk7Ci0gIHNwcmludGYgKChoZHItPmFyX3VpZCksICIlbGQiLCAobG9uZykgc3RhdHVzLnN0X3VpZCk7Ci0gIHNwcmludGYgKChoZHItPmFyX2dpZCksICIlbGQiLCAobG9uZykgc3RhdHVzLnN0X2dpZCk7Ci0gIHNwcmludGYgKChoZHItPmFyX21vZGUpLCAiJS04byIsICh1bnNpZ25lZCBpbnQpIHN0YXR1cy5zdF9tb2RlKTsKLSAgc3ByaW50ZiAoKGhkci0+YXJfc2l6ZSksICIlLTEwbGQiLCAobG9uZykgc3RhdHVzLnN0X3NpemUpOwotICAvKiBDb3JyZWN0IGZvciBhIGxvc3NhZ2UgaW4gc3ByaW50ZiB3aGVyZWJ5IGl0IG51bGwtdGVybWluYXRlcy4gIEkgY2Fubm90Ci0gICAgIHVuZGVyc3RhbmQgaG93IHRoZXNlIEMgbG9zZXJzIGNvdWxkIGRlc2lnbiBzdWNoIGEgcmFtc2hhY2tsZSBidW5jaCBvZgotICAgICBJTyBvcGVyYXRpb25zICovCi0gIHRlbXAgPSAoY2hhciAqKSBoZHI7Ci0gIHRlbXAxID0gdGVtcCArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgLSAyOwotICBmb3IgKDsgdGVtcCA8IHRlbXAxOyB0ZW1wKyspCi0gICAgewotICAgICAgaWYgKCp0ZW1wID09ICdcMCcpCi0JKnRlbXAgPSAnICc7Ci0gICAgfQotICBzdHJuY3B5IChoZHItPmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0gIGFyZWQtPnBhcnNlZF9zaXplID0gc3RhdHVzLnN0X3NpemU7Ci0gIGFyZWQtPmFyY2hfaGVhZGVyID0gKGNoYXIgKikgaGRyOwotCi0gIHJldHVybiBhcmVkOwotfQotCi0vKiBUaGlzIGlzIG1hZ2ljIHJlcXVpcmVkIGJ5IHRoZSAiYXIiIHByb2dyYW0uICBTaW5jZSBpdCdzCi0gICAgdW5kb2N1bWVudGVkLCBpdCdzIHVuZG9jdW1lbnRlZC4gIFlvdSBtYXkgdGhpbmsgdGhhdCBpdCB3b3VsZCB0YWtlCi0gICAgYSBzdHJvbmcgc3RvbWFjaCB0byB3cml0ZSB0aGlzLCBhbmQgaXQgZG9lcywgYnV0IGl0IHRha2VzIGV2ZW4gYQotICAgIHN0cm9uZ2VyIHN0b21hY2ggdG8gdHJ5IHRvIGNvZGUgYXJvdW5kIHN1Y2ggYSB0aGluZyEgICovCi0KLXN0cnVjdCBhcl9oZHIgKmJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotc3RydWN0IGFyX2hkciAqCi1iZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSAoYWJmZCwgZmlsZW5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyX2VsdCA9IGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIChhYmZkLCBmaWxlbmFtZSwgMCk7Ci0gIGlmIChhcl9lbHQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIChzdHJ1Y3QgYXJfaGRyICopIGFyX2VsdC0+YXJjaF9oZWFkZXI7Ci19Ci0KLQotLyogQW5hbG9nb3VzIHRvIHN0YXQgY2FsbCAqLwotaW50Ci1iZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKmJ1ZjsKLXsKLSAgc3RydWN0IGFyX2hkciAqaGRyOwotICBjaGFyICphbG9zZXI7Ci0KLSAgaWYgKGFiZmQtPmFyZWx0X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBoZHIgPSBhcmNoX2hkciAoYWJmZCk7Ci0KLSNkZWZpbmUgZm9vKGFyZWx0LCBzdGVsdCwgc2l6ZSkgIFwKLSAgYnVmLT5zdGVsdCA9IHN0cnRvbCAoaGRyLT5hcmVsdCwgJmFsb3Nlciwgc2l6ZSk7IFwKLSAgaWYgKGFsb3NlciA9PSBoZHItPmFyZWx0KSByZXR1cm4gLTE7Ci0KLSAgZm9vIChhcl9kYXRlLCBzdF9tdGltZSwgMTApOwotICBmb28gKGFyX3VpZCwgc3RfdWlkLCAxMCk7Ci0gIGZvbyAoYXJfZ2lkLCBzdF9naWQsIDEwKTsKLSAgZm9vIChhcl9tb2RlLCBzdF9tb2RlLCA4KTsKLQotICBidWYtPnN0X3NpemUgPSBhcmNoX2VsdGRhdGEgKGFiZmQpLT5wYXJzZWRfc2l6ZTsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotICAvKiBGSVhNRTogVGhpcyBpbnRlcmFjdHMgdW5wbGVhc2FudGx5IHdpdGggYXIncyBxdWljay1hcHBlbmQgb3B0aW9uLgotICAgICBGb3J0dW5hdGVseSBpYzk2MCB1c2VycyB3aWxsIG5ldmVyIHVzZSB0aGF0IG9wdGlvbi4gIEZpeGluZyB0aGlzCi0gICAgIGlzIHZlcnkgaGFyZDsgZm9ydHVuYXRlbHkgSSBrbm93IGhvdyB0byBkbyBpdCBhbmQgd2lsbCBkbyBzbyBvbmNlCi0gICAgIGludGVsJ3MgcmVsZWFzZSBpcyBvdXQgdGhlIGRvb3IuICovCi0KLSAgc3RydWN0IGFyX2hkciAqaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgYXJoZHI7Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBzaXplX3QgbWF4bGVuID0gYXJfbWF4bmFtZWxlbiAoYWJmZCk7Ci0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnNkX3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZmlsZW5hbWUgPSBub3JtYWxpemUgKGFiZmQsIHBhdGhuYW1lKTsKLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBsZW5ndGggPSBzdHJsZW4gKGZpbGVuYW1lKTsKLQotICBpZiAobGVuZ3RoIDw9IG1heGxlbikKLSAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIGxlbmd0aCk7Ci0KLSAgLyogQWRkIHRoZSBwYWRkaW5nIGNoYXJhY3RlciBpZiB0aGVyZSBpcyByb29tIGZvciBpdC4gICovCi0gIGlmIChsZW5ndGggPCBtYXhsZW4KLSAgICAgIHx8IChsZW5ndGggPT0gbWF4bGVuICYmIGxlbmd0aCA8IHNpemVvZiBoZHItPmFyX25hbWUpKQotICAgIChoZHItPmFyX25hbWUpW2xlbmd0aF0gPSBhcl9wYWRjaGFyIChhYmZkKTsKLX0KLQotdm9pZAotYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpwYXRobmFtZTsKLSAgICAgY2hhciAqYXJoZHI7Ci17Ci0gIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOwotICBpbnQgbGVuZ3RoOwotICBDT05TVCBjaGFyICpmaWxlbmFtZSA9IHN0cnJjaHIgKHBhdGhuYW1lLCAnLycpOwotICBpbnQgbWF4bGVuID0gYXJfbWF4bmFtZWxlbiAoYWJmZCk7Ci0KLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZmlsZW5hbWUgPSBwYXRobmFtZTsKLSAgZWxzZQotICAgICsrZmlsZW5hbWU7Ci0KLSAgbGVuZ3RoID0gc3RybGVuIChmaWxlbmFtZSk7Ci0KLSAgaWYgKGxlbmd0aCA8PSBtYXhsZW4pCi0gICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBsZW5ndGgpOwotICBlbHNlCi0gICAgewotICAgICAgLyogcGF0aG5hbWU6IG1lZXQgcHJvY3J1c3RlcyAqLwotICAgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBtYXhsZW4pOwotICAgICAgbGVuZ3RoID0gbWF4bGVuOwotICAgIH0KLQotICBpZiAobGVuZ3RoIDwgbWF4bGVuKQotICAgIChoZHItPmFyX25hbWUpW2xlbmd0aF0gPSBhcl9wYWRjaGFyIChhYmZkKTsKLX0KLQotLyogU3RvcmUgbmFtZSBpbnRvIGFyIGhlYWRlci4gIFRydW5jYXRlcyB0aGUgbmFtZSB0byBmaXQuCi0gICAxPiBzdHJpcCBwYXRobmFtZSB0byBiZSBqdXN0IHRoZSBiYXNlbmFtZS4KLSAgIDI+IGlmIGl0J3Mgc2hvcnQgZW51ZiB0byBmaXQsIHN0dWZmIGl0IGluLgotICAgMz4gSWYgaXQgZG9lc24ndCBlbmQgd2l0aCAubywgdHJ1bmNhdGUgaXQgdG8gZml0Ci0gICA0PiB0cnVuY2F0ZSBpdCBiZWZvcmUgdGhlIC5vLCBhcHBlbmQgLm8sIHN0dWZmIFRIQVQgaW4uICAqLwotCi0vKiBUaGlzIGlzIHdoYXQgZ251IGFyIGRvZXMuICBJdCdzIGJldHRlciBidXQgaW5jb21wYXRpYmxlIHdpdGggdGhlCi0gICBic2QgYXIuICovCi0KLXZvaWQKLWJmZF9nbnVfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSAoc3RydWN0IGFyX2hkciAqKSBhcmhkcjsKLSAgaW50IGxlbmd0aDsKLSAgQ09OU1QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChwYXRobmFtZSwgJy8nKTsKLSAgaW50IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gcGF0aG5hbWU7Ci0gIGVsc2UKLSAgICArK2ZpbGVuYW1lOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoZmlsZW5hbWUpOwotCi0gIGlmIChsZW5ndGggPD0gbWF4bGVuKQotICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbGVuZ3RoKTsKLSAgZWxzZQotICAgIHsJCQkJLyogcGF0aG5hbWU6IG1lZXQgcHJvY3J1c3RlcyAqLwotICAgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBtYXhsZW4pOwotICAgICAgaWYgKChmaWxlbmFtZVtsZW5ndGggLSAyXSA9PSAnLicpICYmIChmaWxlbmFtZVtsZW5ndGggLSAxXSA9PSAnbycpKQotCXsKLQkgIGhkci0+YXJfbmFtZVttYXhsZW4gLSAyXSA9ICcuJzsKLQkgIGhkci0+YXJfbmFtZVttYXhsZW4gLSAxXSA9ICdvJzsKLQl9Ci0gICAgICBsZW5ndGggPSBtYXhsZW47Ci0gICAgfQotCi0gIGlmIChsZW5ndGggPCAxNikKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0MCi0vKiBUaGUgQkZEIGlzIG9wZW4gZm9yIHdyaXRlIGFuZCBoYXMgaXRzIGZvcm1hdCBzZXQgdG8gYmZkX2FyY2hpdmUgKi8KLQotYm9vbGVhbgotX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIChhcmNoKQotICAgICBiZmQgKmFyY2g7Ci17Ci0gIGJmZCAqY3VycmVudDsKLSAgY2hhciAqZXRhYmxlID0gTlVMTDsKLSAgYmZkX3NpemVfdHlwZSBlbGVuZ3RoID0gMDsKLSAgY29uc3QgY2hhciAqZW5hbWUgPSBOVUxMOwotICBib29sZWFuIG1ha2VtYXAgPSBiZmRfaGFzX21hcCAoYXJjaCk7Ci0gIGJvb2xlYW4gaGFzb2JqZWN0cyA9IGZhbHNlOwkvKiBpZiBubyAubydzLCBkb24ndCBib3RoZXIgdG8gbWFrZSBhIG1hcCAqLwotICBiZmRfc2l6ZV90eXBlIHdyb3RlOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IHRyaWVzOwotCi0gIC8qIFZlcmlmeSB0aGUgdmlhYmlsaXR5IG9mIGFsbCBlbnRyaWVzOyBpZiBhbnkgb2YgdGhlbSBsaXZlIGluIHRoZQotICAgICBmaWxlc3lzdGVtIChhcyBvcHBvc2VkIHRvIGxpdmluZyBpbiBhbiBhcmNoaXZlIG9wZW4gZm9yIGlucHV0KQotICAgICB0aGVuIGNvbnN0cnVjdCBhIGZyZXNoIGFyX2hkciBmb3IgdGhlbS4gICovCi0gIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZV9wIChjdXJyZW50KSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICghY3VycmVudC0+YXJlbHRfZGF0YSkKLQl7Ci0JICBjdXJyZW50LT5hcmVsdF9kYXRhID0KLQkgICAgKFBUUikgYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gKGFyY2gsIGN1cnJlbnQtPmZpbGVuYW1lLCBjdXJyZW50KTsKLQkgIGlmICghY3VycmVudC0+YXJlbHRfZGF0YSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBQdXQgaW4gdGhlIGZpbGUgbmFtZSAqLwotCSAgQkZEX1NFTkQgKGFyY2gsIF9iZmRfdHJ1bmNhdGVfYXJuYW1lLCAoYXJjaCwKLQkJCQkJCSBjdXJyZW50LT5maWxlbmFtZSwKLQkJCQkJICAgICAgKGNoYXIgKikgYXJjaF9oZHIgKGN1cnJlbnQpKSk7Ci0JfQotCi0gICAgICBpZiAobWFrZW1hcCAmJiAhIGhhc29iamVjdHMpCi0JewkJCS8qIGRvbid0IGJvdGhlciBpZiB3ZSB3b24ndCBtYWtlIGEgbWFwISAqLwotCSAgaWYgKChiZmRfY2hlY2tfZm9ybWF0IChjdXJyZW50LCBiZmRfb2JqZWN0KSkKLSNpZiAwCQkJCS8qIEZJWE1FIC0tIHRoZXNlIGFyZSBub3Qgc2V0IGNvcnJlY3RseSAqLwotCSAgICAgICYmICgoYmZkX2dldF9maWxlX2ZsYWdzIChjdXJyZW50KSAmIEhBU19TWU1TKSkKLSNlbmRpZgotCSAgICApCi0JICAgIGhhc29iamVjdHMgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFCRkRfU0VORCAoYXJjaCwgX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSwKLQkJIChhcmNoLCAmZXRhYmxlLCAmZWxlbmd0aCwgJmVuYW1lKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYXJjaCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0jaWZkZWYgR05VOTYwCi0gIHdyb3RlID0gYmZkX3dyaXRlIChCRkRfR05VOTYwX0FSTUFHIChhcmNoKSwgMSwgU0FSTUFHLCBhcmNoKTsKLSNlbHNlCi0gIHdyb3RlID0gYmZkX3dyaXRlIChBUk1BRywgMSwgU0FSTUFHLCBhcmNoKTsKLSNlbmRpZgotICBpZiAod3JvdGUgIT0gU0FSTUFHKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHsKLSAgICAgIGlmIChfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoKSAhPSB0cnVlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZW5ndGggIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLQotICAgICAgbWVtc2V0ICgoY2hhciAqKSAoJmhkciksIDAsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgc3RyY3B5IChoZHIuYXJfbmFtZSwgZW5hbWUpOwotICAgICAgLyogUm91bmQgc2l6ZSB1cCB0byBldmVuIG51bWJlciBpbiBhcmNoaXZlIGhlYWRlci4gICovCi0gICAgICBzcHJpbnRmICgmKGhkci5hcl9zaXplWzBdKSwgIiUtMTBkIiwKLQkgICAgICAgKGludCkgKChlbGVuZ3RoICsgMSkgJiB+MSkpOwotICAgICAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotCWlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotCSAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLSAgICAgIGlmICgoYmZkX3dyaXRlICgoY2hhciAqKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotCSAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0JICB8fCBiZmRfd3JpdGUgKGV0YWJsZSwgMSwgZWxlbmd0aCwgYXJjaCkgIT0gZWxlbmd0aCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoKGVsZW5ndGggJSAyKSA9PSAxKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKCJcMDEyIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZm9yIChjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZmZlcltERUZBVUxUX0JVRkZFUlNJWkVdOwotICAgICAgdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IGFyZWx0X3NpemUgKGN1cnJlbnQpOwotICAgICAgc3RydWN0IGFyX2hkciAqaGRyID0gYXJjaF9oZHIgKGN1cnJlbnQpOwotCi0gICAgICAvKiB3cml0ZSBhciBoZWFkZXIgKi8KLSAgICAgIGlmIChiZmRfd3JpdGUgKChjaGFyICopIGhkciwgMSwgc2l6ZW9mICgqaGRyKSwgYXJjaCkgIT0gc2l6ZW9mICgqaGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGN1cnJlbnQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgd2hpbGUgKHJlbWFpbmluZykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgYW10ID0gREVGQVVMVF9CVUZGRVJTSVpFOwotCSAgaWYgKGFtdCA+IHJlbWFpbmluZykKLQkgICAgYW10ID0gcmVtYWluaW5nOwotCSAgZXJybm8gPSAwOwotCSAgaWYgKGJmZF9yZWFkIChidWZmZXIsIGFtdCwgMSwgY3VycmVudCkgIT0gYW10KQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBhbXQsIDEsIGFyY2gpICE9IGFtdCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcmVtYWluaW5nIC09IGFtdDsKLQl9Ci0gICAgICBpZiAoKGFyZWx0X3NpemUgKGN1cnJlbnQpICUgMikgPT0gMSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgiXDAxMiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChtYWtlbWFwICYmIGhhc29iamVjdHMpCi0gICAgewotICAgICAgLyogVmVyaWZ5IHRoZSB0aW1lc3RhbXAgaW4gdGhlIGFyY2hpdmUgZmlsZS4gIElmIGl0IHdvdWxkIG5vdCBiZQotCSBhY2NlcHRlZCBieSB0aGUgbGlua2VyLCByZXdyaXRlIGl0IHVudGlsIGl0IHdvdWxkIGJlLiAgSWYKLQkgYW55dGhpbmcgb2RkIGhhcHBlbnMsIGJyZWFrIG91dCBhbmQganVzdCByZXR1cm4uICAoVGhlCi0JIEJlcmtlbGV5IGxpbmtlciBjaGVja3MgdGhlIHRpbWVzdGFtcCBhbmQgcmVmdXNlcyB0byByZWFkIHRoZQotCSB0YWJsZS1vZi1jb250ZW50cyBpZiBpdCBpcyA+NjAgc2Vjb25kcyBsZXNzIHRoYW4gdGhlIGZpbGUncwotCSBtb2RpZmllZC10aW1lLiAgVGhhdCBwYWluZnVsIGhhY2sgcmVxdWlyZXMgdGhpcyBwYWluZnVsIGhhY2suICAqLwotICAgICAgdHJpZXMgPSAxOwotICAgICAgZG8KLQl7Ci0JICBpZiAoYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpKQotCSAgICBicmVhazsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiV2FybmluZzogd3JpdGluZyBhcmNoaXZlIHdhcyBzbG93OiByZXdyaXRpbmcgdGltZXN0YW1wXG4iKSk7Ci0JfQotICAgICAgd2hpbGUgKCsrdHJpZXMgPCA2KTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBOb3RlIHRoYXQgdGhlIG5hbWlkeCBmb3IgdGhlIGZpcnN0IHN5bWJvbCBpcyAwICovCi0KLWJvb2xlYW4KLV9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci17Ci0gIGNoYXIgKmZpcnN0X25hbWUgPSBOVUxMOwotICBiZmQgKmN1cnJlbnQ7Ci0gIGZpbGVfcHRyIGVsdF9ubyA9IDA7Ci0gIHN0cnVjdCBvcmwgKm1hcCA9IE5VTEw7Ci0gIGludCBvcmxfbWF4ID0gMTAyNDsJCS8qIGZpbmUgaW5pdGlhbCBkZWZhdWx0ICovCi0gIGludCBvcmxfY291bnQgPSAwOwotICBpbnQgc3RyaWR4ID0gMDsJCS8qIHN0cmluZyBpbmRleCAqLwotICBhc3ltYm9sICoqc3ltcyA9IE5VTEw7Ci0gIGxvbmcgc3ltc19tYXggPSAwOwotICBib29sZWFuIHJldDsKLQotICAvKiBEdW5ubyBpZiB0aGlzIGlzIHRoZSBiZXN0IHBsYWNlIGZvciB0aGlzIGluZm8uLi4gKi8KLSAgaWYgKGVsZW5ndGggIT0gMCkKLSAgICBlbGVuZ3RoICs9IHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0gIGVsZW5ndGggKz0gZWxlbmd0aCAlIDI7Ci0KLSAgbWFwID0gKHN0cnVjdCBvcmwgKikgYmZkX21hbGxvYyAob3JsX21heCAqIHNpemVvZiAoc3RydWN0IG9ybCkpOwotICBpZiAobWFwID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2UgcHV0IHRoZSBzeW1ib2wgbmFtZXMgb24gdGhlIGFyY2ggb2JqYWxsb2MsIGFuZCB0aGVuIGRpc2NhcmQKLSAgICAgdGhlbSB3aGVuIGRvbmUuICAqLwotICBmaXJzdF9uYW1lID0gYmZkX2FsbG9jIChhcmNoLCAxKTsKLSAgaWYgKGZpcnN0X25hbWUgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBEcm9wIGFsbCB0aGUgZmlsZXMgY2FsbGVkIF9fLlNZTURFRiwgd2UncmUgZ29pbmcgdG8gbWFrZSBvdXIKLSAgICAgb3duICovCi0gIHdoaWxlIChhcmNoLT5hcmNoaXZlX2hlYWQgJiYKLQkgc3RyY21wIChhcmNoLT5hcmNoaXZlX2hlYWQtPmZpbGVuYW1lLCAiX18uU1lNREVGIikgPT0gMCkKLSAgICBhcmNoLT5hcmNoaXZlX2hlYWQgPSBhcmNoLT5hcmNoaXZlX2hlYWQtPm5leHQ7Ci0KLSAgLyogTWFwIG92ZXIgZWFjaCBlbGVtZW50ICovCi0gIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgICAgICBjdXJyZW50ICE9IChiZmQgKikgTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCwgZWx0X25vKyspCi0gICAgewotICAgICAgaWYgKChiZmRfY2hlY2tfZm9ybWF0IChjdXJyZW50LCBiZmRfb2JqZWN0KSA9PSB0cnVlKQotCSAgJiYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGN1cnJlbnQpICYgSEFTX1NZTVMpKSkKLQl7Ci0JICBsb25nIHN0b3JhZ2U7Ci0JICBsb25nIHN5bWNvdW50OwotCSAgbG9uZyBzcmNfY291bnQ7Ci0KLQkgIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoY3VycmVudCk7Ci0JICBpZiAoc3RvcmFnZSA8IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoc3RvcmFnZSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHN0b3JhZ2UgPiBzeW1zX21heCkKLQkJewotCQkgIGlmIChzeW1zX21heCA+IDApCi0JCSAgICBmcmVlIChzeW1zKTsKLQkJICBzeW1zX21heCA9IHN0b3JhZ2U7Ci0JCSAgc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzeW1zX21heCk7Ci0JCSAgaWYgKHN5bXMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoY3VycmVudCwgc3ltcyk7Ci0JICAgICAgaWYgKHN5bWNvdW50IDwgMCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBOb3cgbWFwIG92ZXIgYWxsIHRoZSBzeW1ib2xzLCBwaWNraW5nIG91dCB0aGUgb25lcyB3ZSB3YW50ICovCi0JICAgICAgZm9yIChzcmNfY291bnQgPSAwOyBzcmNfY291bnQgPCBzeW1jb3VudDsgc3JjX2NvdW50KyspCi0JCXsKLQkJICBmbGFnd29yZCBmbGFncyA9IChzeW1zW3NyY19jb3VudF0pLT5mbGFnczsKLQkJICBhc2VjdGlvbiAqc2VjID0gc3ltc1tzcmNfY291bnRdLT5zZWN0aW9uOwotCi0JCSAgaWYgKChmbGFncyAmIEJTRl9HTE9CQUwgfHwKLQkJICAgICAgIGZsYWdzICYgQlNGX1dFQUsgfHwKLQkJICAgICAgIGZsYWdzICYgQlNGX0lORElSRUNUIHx8Ci0JCSAgICAgICBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0JCSAgICAgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotCQkgICAgewotCQkgICAgICBzaXplX3QgbmFtZWxlbjsKLQkJICAgICAgc3RydWN0IG9ybCAqbmV3X21hcDsKLQotCQkgICAgICAvKiBUaGlzIHN5bWJvbCB3aWxsIGdvIGludG8gdGhlIGFyY2hpdmUgaGVhZGVyICovCi0JCSAgICAgIGlmIChvcmxfY291bnQgPT0gb3JsX21heCkKLQkJCXsKLQkJCSAgb3JsX21heCAqPSAyOwotCQkJICBuZXdfbWFwID0KLQkJCSAgICAoKHN0cnVjdCBvcmwgKikKLQkJCSAgICAgYmZkX3JlYWxsb2MgKG1hcCwgb3JsX21heCAqIHNpemVvZiAoc3RydWN0IG9ybCkpKTsKLQkJCSAgaWYgKG5ld19tYXAgPT0gKHN0cnVjdCBvcmwgKikgTlVMTCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICBtYXAgPSBuZXdfbWFwOwotCQkJfQotCi0JCSAgICAgIG5hbWVsZW4gPSBzdHJsZW4gKHN5bXNbc3JjX2NvdW50XS0+bmFtZSk7Ci0JCSAgICAgIG1hcFtvcmxfY291bnRdLm5hbWUgPSAoKGNoYXIgKiopCi0JCQkJCSAgICAgYmZkX2FsbG9jIChhcmNoLAotCQkJCQkJCXNpemVvZiAoY2hhciAqKSkpOwotCQkgICAgICBpZiAobWFwW29ybF9jb3VudF0ubmFtZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgICoobWFwW29ybF9jb3VudF0ubmFtZSkgPSBiZmRfYWxsb2MgKGFyY2gsIG5hbWVsZW4gKyAxKTsKLQkJICAgICAgaWYgKCoobWFwW29ybF9jb3VudF0ubmFtZSkgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBzdHJjcHkgKCoobWFwW29ybF9jb3VudF0ubmFtZSksIHN5bXNbc3JjX2NvdW50XS0+bmFtZSk7Ci0JCSAgICAgIChtYXBbb3JsX2NvdW50XSkucG9zID0gKGZpbGVfcHRyKSBjdXJyZW50OwotCQkgICAgICAobWFwW29ybF9jb3VudF0pLm5hbWlkeCA9IHN0cmlkeDsKLQotCQkgICAgICBzdHJpZHggKz0gbmFtZWxlbiArIDE7Ci0JCSAgICAgICsrb3JsX2NvdW50OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogTm93IGFzayB0aGUgQkZEIHRvIGZyZWUgdXAgYW55IGNhY2hlZCBpbmZvcm1hdGlvbiwgc28gd2UKLQkgICAgIGRvbid0IGZpbGwgYWxsIG9mIG1lbW9yeSB3aXRoIHN5bWJvbCB0YWJsZXMuICAqLwotCSAgaWYgKCEgYmZkX2ZyZWVfY2FjaGVkX2luZm8gKGN1cnJlbnQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIE9LLCBub3cgd2UgaGF2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBkYXRhLCBsZXQncyB3cml0ZSB0aGVtIG91dCAqLwotICByZXQgPSBCRkRfU0VORCAoYXJjaCwgd3JpdGVfYXJtYXAsCi0JCSAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpKTsKLQotICBpZiAoc3ltc19tYXggPiAwKQotICAgIGZyZWUgKHN5bXMpOwotICBpZiAobWFwICE9IE5VTEwpCi0gICAgZnJlZSAobWFwKTsKLSAgaWYgKGZpcnN0X25hbWUgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYXJjaCwgZmlyc3RfbmFtZSk7Ci0KLSAgcmV0dXJuIHJldDsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN5bXNfbWF4ID4gMCkKLSAgICBmcmVlIChzeW1zKTsKLSAgaWYgKG1hcCAhPSBOVUxMKQotICAgIGZyZWUgKG1hcCk7Ci0gIGlmIChmaXJzdF9uYW1lICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFyY2gsIGZpcnN0X25hbWUpOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbGVhbgotYnNkX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIGludCBwYWRpdCA9IHN0cmlkeCAmIDE7Ci0gIHVuc2lnbmVkIGludCByYW5saWJzaXplID0gb3JsX2NvdW50ICogQlNEX1NZTURFRl9TSVpFOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZSA9IHN0cmlkeCArIHBhZGl0OwotICAvKiBJbmNsdWRlIDggYnl0ZXMgdG8gc3RvcmUgcmFubGlic2l6ZSBhbmQgc3RyaW5nc2l6ZSBpbiBvdXRwdXQuICovCi0gIHVuc2lnbmVkIGludCBtYXBzaXplID0gcmFubGlic2l6ZSArIHN0cmluZ3NpemUgKyA4OwotICBmaWxlX3B0ciBmaXJzdHJlYWw7Ci0gIGJmZCAqY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgYmZkICpsYXN0X2VsdCA9IGN1cnJlbnQ7CS8qIGxhc3QgZWxlbWVudCBhcmNoIHNlZW4gKi8KLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZmlyc3RyZWFsID0gbWFwc2l6ZSArIGVsZW5ndGggKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgU0FSTUFHOwotCi0gIHN0YXQgKGFyY2gtPmZpbGVuYW1lLCAmc3RhdGJ1Zik7Ci0gIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX25hbWUsIFJBTkxJQk1BRyk7Ci0gIC8qIFJlbWVtYmVyIHRoZSB0aW1lc3RhbXAsIHRvIGtlZXAgaXQgaG9seS4gIEJ1dCBmdWRnZSBpdCBhIGxpdHRsZS4gICovCi0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXAgPSBzdGF0YnVmLnN0X210aW1lICsgQVJNQVBfVElNRV9PRkZTRVQ7Ci0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF9kYXRlcG9zID0gKFNBUk1BRwotCQkJCSAgICAgICsgb2Zmc2V0b2YgKHN0cnVjdCBhcl9oZHIsIGFyX2RhdGVbMF0pKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wKTsKLSAgc3ByaW50ZiAoaGRyLmFyX3VpZCwgIiVsZCIsIChsb25nKSBnZXR1aWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfZ2lkLCAiJWxkIiwgKGxvbmcpIGdldGdpZCAoKSk7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBtYXBzaXplKTsKLSAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0gICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9oX3B1dF8zMiAoYXJjaCwgKGJmZF92bWEpIHJhbmxpYnNpemUsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCAxLCBzaXplb2YgKHRlbXApLCBhcmNoKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBvcmxfY291bnQ7IGNvdW50KyspCi0gICAgewotICAgICAgYmZkX2J5dGUgYnVmW0JTRF9TWU1ERUZfU0laRV07Ci0KLSAgICAgIGlmICgoKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKSAhPSBsYXN0X2VsdCkKLQl7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgZmlyc3RyZWFsICs9IGFyZWx0X3NpemUgKGN1cnJlbnQpICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLQkgICAgICBmaXJzdHJlYWwgKz0gZmlyc3RyZWFsICUgMjsKLQkgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLQkgICAgfQotCSAgd2hpbGUgKGN1cnJlbnQgIT0gKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKTsKLQl9CQkJLyogaWYgbmV3IGFyY2hpdmUgZWxlbWVudCAqLwotCi0gICAgICBsYXN0X2VsdCA9IGN1cnJlbnQ7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFyY2gsIG1hcFtjb3VudF0ubmFtaWR4LCBidWYpOwotICAgICAgYmZkX2hfcHV0XzMyIChhcmNoLCBmaXJzdHJlYWwsIGJ1ZiArIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmLCBCU0RfU1lNREVGX1NJWkUsIDEsIGFyY2gpICE9IEJTRF9TWU1ERUZfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIG5vdyB3cml0ZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzICovCi0gIGJmZF9oX3B1dF8zMiAoYXJjaCwgc3RyaW5nc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIDEsIHNpemVvZiAodGVtcCksIGFyY2gpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBvcmxfY291bnQ7IGNvdW50KyspCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoKm1hcFtjb3VudF0ubmFtZSkgKyAxOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgqbWFwW2NvdW50XS5uYW1lLCAxLCBsZW4sIGFyY2gpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNleiB0aGlzIHNob3VsZCBiZSBhIG5ld2xpbmUuICBCdXQgaW4gb3JkZXIgdG8gYmUKLSAgICAgYnVnLWNvbXBhdGlibGUgZm9yIHN1bidzIGFyIHdlIHVzZSBhIG51bGwuICovCi0gIGlmIChwYWRpdCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBdCB0aGUgZW5kIG9mIGFyY2hpdmUgZmlsZSBoYW5kbGluZywgdXBkYXRlIHRoZSB0aW1lc3RhbXAgaW4gdGhlCi0gICBmaWxlLCBzbyB0aGUgbGlua2VyIHdpbGwgYWNjZXB0IGl0LgotCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGltZXN0YW1wIHdhcyBPSywgb3IgYW4gdW51c3VhbCBwcm9ibGVtIGhhcHBlbmVkLgotICAgUmV0dXJuIGZhbHNlIGlmIHdlIHVwZGF0ZWQgdGhlIHRpbWVzdGFtcC4gICovCi0KLWJvb2xlYW4KLV9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCAoYXJjaCkKLSAgICAgYmZkICphcmNoOwotewotICBzdHJ1Y3Qgc3RhdCBhcmNoc3RhdDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEZsdXNoIHdyaXRlcywgZ2V0IGxhc3Qtd3JpdGUgdGltZXN0YW1wIGZyb20gZmlsZSwgYW5kIGNvbXBhcmUgaXQKLSAgICAgdG8gdGhlIHRpbWVzdGFtcCBJTiB0aGUgZmlsZS4gICovCi0gIGJmZF9mbHVzaCAoYXJjaCk7Ci0gIGlmIChiZmRfc3RhdCAoYXJjaCwgJmFyY2hzdGF0KSA9PSAtMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKF8oIlJlYWRpbmcgYXJjaGl2ZSBmaWxlIG1vZCB0aW1lc3RhbXAiKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsJCS8qIENhbid0IHJlYWQgbW9kIHRpbWUgZm9yIHNvbWUgcmVhc29uICovCi0gICAgfQotICBpZiAoYXJjaHN0YXQuc3RfbXRpbWUgPD0gYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCkKLSAgICByZXR1cm4gdHJ1ZTsJCS8qIE9LIGJ5IHRoZSBsaW5rZXIncyBydWxlcyAqLwotCi0gIC8qIFVwZGF0ZSB0aGUgdGltZXN0YW1wLiAgKi8KLSAgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCA9IGFyY2hzdGF0LnN0X210aW1lICsgQVJNQVBfVElNRV9PRkZTRVQ7Ci0KLSAgLyogUHJlcGFyZSBhbiBBU0NJSSB2ZXJzaW9uIHN1aXRhYmxlIGZvciB3cml0aW5nLiAgKi8KLSAgbWVtc2V0IChoZHIuYXJfZGF0ZSwgMCwgc2l6ZW9mIChoZHIuYXJfZGF0ZSkpOwotICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXApOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChoZHIuYXJfZGF0ZSk7IGkrKykKLSAgICBpZiAoaGRyLmFyX2RhdGVbaV0gPT0gJ1wwJykKLSAgICAgIChoZHIuYXJfZGF0ZSlbaV0gPSAnICc7Ci0KLSAgLyogV3JpdGUgaXQgaW50byB0aGUgZmlsZS4gICovCi0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF9kYXRlcG9zID0gKFNBUk1BRwotCQkJCSAgICAgICsgb2Zmc2V0b2YgKHN0cnVjdCBhcl9oZHIsIGFyX2RhdGVbMF0pKTsKLSAgaWYgKGJmZF9zZWVrIChhcmNoLCBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKGhkci5hcl9kYXRlLCBzaXplb2YgKGhkci5hcl9kYXRlKSwgMSwgYXJjaCkKLQkgICE9IHNpemVvZiAoaGRyLmFyX2RhdGUpKSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogYmZkIGNhbid0IGNhbGwgcGVycm9yLiAgKi8KLSAgICAgIHBlcnJvciAoXygiV3JpdGluZyB1cGRhdGVkIGFybWFwIHRpbWVzdGFtcCIpKTsKLSAgICAgIHJldHVybiB0cnVlOwkJLyogU29tZSBlcnJvciB3aGlsZSB3cml0aW5nICovCi0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJCQkvKiBXZSB1cGRhdGVkIHRoZSB0aW1lc3RhbXAgc3VjY2Vzc2Z1bGx5LiAgKi8KLX0KLQwKLS8qIEEgY29mZiBhcm1hcCBsb29rcyBsaWtlIDoKLSAgIGxBUk1BRwotICAgc3RydWN0IGFyX2hkciB3aXRoIG5hbWUgPSAnLycKLSAgIG51bWJlciBvZiBzeW1ib2xzCi0gICBvZmZzZXQgb2YgZmlsZSBmb3Igc3ltYm9sIDAKLSAgIG9mZnNldCBvZiBmaWxlIGZvciBzeW1ib2wgMQotCi0gICBvZmZzZXQgb2YgZmlsZSBmb3Igc3ltYm9sIG4tMQotICAgc3ltYm9sIG5hbWUgMAotICAgc3ltYm9sIG5hbWUgMQotCi0gICBzeW1ib2wgbmFtZSBuLTEKLSovCi0KLWJvb2xlYW4KLWNvZmZfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgc3ltYm9sX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgLyogVGhlIHNpemUgb2YgdGhlIHJhbmxpYiBpcyB0aGUgbnVtYmVyIG9mIGV4cG9ydGVkIHN5bWJvbHMgaW4gdGhlCi0gICAgIGFyY2hpdmUgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgaW50LCArIGFuIGludCBmb3IgdGhlIGNvdW50ICovCi0gIHVuc2lnbmVkIGludCByYW5saWJzaXplID0gKHN5bWJvbF9jb3VudCAqIDQpICsgNDsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHg7Ci0gIHVuc2lnbmVkIGludCBtYXBzaXplID0gc3RyaW5nc2l6ZSArIHJhbmxpYnNpemU7Ci0gIGZpbGVfcHRyIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyOwotICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgcGFkaXQgPSBtYXBzaXplICYgMTsKLQotICBpZiAocGFkaXQpCi0gICAgbWFwc2l6ZSsrOwotCi0gIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBmaXJzdCBvYmplY3QgZmlsZSB3aWxsIGdvIGluIHRoZSBhcmNoaXZlICovCi0gIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyID0gKG1hcHNpemUKLQkJCSAgICAgKyBlbGVuZ3RoCi0JCQkgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKQotCQkJICAgICArIFNBUk1BRyk7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJmhkciksIDAsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICBoZHIuYXJfbmFtZVswXSA9ICcvJzsKLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIChsb25nKSB0aW1lIChOVUxMKSk7Ci0gIC8qIFRoaXMsIGF0IGxlYXN0LCBpcyB3aGF0IEludGVsIGNvZmYgc2V0cyB0aGUgdmFsdWVzIHRvLjogKi8KLSAgc3ByaW50ZiAoKGhkci5hcl91aWQpLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoKGhkci5hcl9naWQpLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoKGhkci5hcl9tb2RlKSwgIiUtN28iLCAodW5zaWduZWQpIDApOwotICBzdHJuY3B5IChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLQotICAvKiBXcml0ZSB0aGUgYXIgaGVhZGVyIGZvciB0aGlzIGl0ZW0gYW5kIHRoZSBudW1iZXIgb2Ygc3ltYm9scyAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFyY2gpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCAoYXJjaCwgc3ltYm9sX2NvdW50KTsKLQotICAvKiBUd28gcGFzc2VzLCBmaXJzdCB3cml0ZSB0aGUgZmlsZSBvZmZzZXRzIGZvciBlYWNoIHN5bWJvbCAtCi0gICAgIHJlbWVtYmVyaW5nIHRoYXQgZWFjaCBvZmZzZXQgaXMgb24gYSB0d28gYnl0ZSBib3VuZGFyeS4gICovCi0KLSAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGVhY2gKLSAgICAgc3ltYm9sLCBhbmQgcmVtZW1iZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyBwYWRkZWQgb3V0LiAgKi8KLQotICBjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICBjb3VudCA9IDA7Ci0gIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgTlVMTCAmJiBjb3VudCA8IHN5bWJvbF9jb3VudCkKLSAgICB7Ci0gICAgICAvKiBGb3IgZWFjaCBzeW1ib2wgd2hpY2ggaXMgdXNlZCBkZWZpbmVkIGluIHRoaXMgb2JqZWN0LCB3cml0ZSBvdXQKLQkgdGhlIG9iamVjdCBmaWxlJ3MgYWRkcmVzcyBpbiB0aGUgYXJjaGl2ZSAqLwotCi0gICAgICB3aGlsZSAoKChiZmQgKikgKG1hcFtjb3VudF0pLnBvcykgPT0gY3VycmVudCkKLQl7Ci0JICBiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCAoYXJjaCwgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIpOwotCSAgY291bnQrKzsKLQl9Ci0gICAgICAvKiBBZGQgc2l6ZSBvZiB0aGlzIGFyY2hpdmUgZW50cnkgKi8KLSAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IChhcmVsdF9zaXplIChjdXJyZW50KQotCQkJCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIC8qIHJlbWVtYmVyIGFib291dCB0aGUgZXZlbiBhbGlnbm1lbnQgKi8KLSAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICUgMjsKLSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotICAgIH0KLQotICAvKiBub3cgd3JpdGUgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcyAqLwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzeW1ib2xfY291bnQ7IGNvdW50KyspCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoKm1hcFtjb3VudF0ubmFtZSkgKyAxOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgqbWFwW2NvdW50XS5uYW1lLCAxLCBsZW4sIGFyY2gpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNleiB0aGlzIHNob3VsZCBiZSBhIG5ld2xpbmUuICBCdXQgaW4gb3JkZXIgdG8gYmUKLSAgICAgYnVnLWNvbXBhdGlibGUgZm9yIGFyYzk2MCB3ZSB1c2UgYSBudWxsLiAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9hcmNodXJlcy5jIGIvYmZkL2FyY2h1cmVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmM1ZjcuLjAwMDAwMDAKLS0tIGEvYmZkL2FyY2h1cmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTggKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgYXJjaGl0ZWN0dXJlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEtOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgSm9obiBHaWxtb3JlIGFuZCBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyoKLQotU0VDVElPTgotCUFyY2hpdGVjdHVyZXMKLQotCUJGRCBrZWVwcyBvbmUgYXRvbSBpbiBhIEJGRCBkZXNjcmliaW5nIHRoZQotCWFyY2hpdGVjdHVyZSBvZiB0aGUgZGF0YSBhdHRhY2hlZCB0byB0aGUgQkZEOiBhIHBvaW50ZXIgdG8gYQotCTw8YmZkX2FyY2hfaW5mb190eXBlPj4uICAKLQotCVBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgY2FuIGJlIHJlcXVlc3RlZCBpbmRlcGVuZGVudGx5IG9mIGEgQkZECi0Jc28gdGhhdCBhbiBhcmNoaXRlY3R1cmUncyBpbmZvcm1hdGlvbiBjYW4gYmUgaW50ZXJyb2dhdGVkCi0Jd2l0aG91dCBhY2Nlc3MgdG8gYW4gb3BlbiBCRkQuCi0KLQlUaGUgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGJ5IGVhY2ggYXJjaGl0ZWN0dXJlIHBhY2thZ2UuCi0JVGhlIHNldCBvZiBkZWZhdWx0IGFyY2hpdGVjdHVyZXMgaXMgc2VsZWN0ZWQgYnkgdGhlIG1hY3JvCi0JPDxTRUxFQ1RfQVJDSElURUNUVVJFUz4+LiAgVGhpcyBpcyBub3JtYWxseSBzZXQgdXAgaW4gdGhlCi0JQGZpbGV7Y29uZmlnL0B2YXJ7dGFyZ2V0fS5tdH0gZmlsZSBvZiB5b3VyIGNob2ljZS4gIElmIHRoZSBuYW1lIGlzIG5vdAotCWRlZmluZWQsIHRoZW4gYWxsIHRoZSBhcmNoaXRlY3R1cmVzIHN1cHBvcnRlZCBhcmUgaW5jbHVkZWQuIAotCi0JV2hlbiBCRkQgc3RhcnRzIHVwLCBhbGwgdGhlIGFyY2hpdGVjdHVyZXMgYXJlIGNhbGxlZCB3aXRoIGFuCi0JaW5pdGlhbGl6ZSBtZXRob2QuICBJdCBpcyB1cCB0byB0aGUgYXJjaGl0ZWN0dXJlIGJhY2sgZW5kIHRvCi0JaW5zZXJ0IGFzIG1hbnkgaXRlbXMgaW50byB0aGUgbGlzdCBvZiBhcmNoaXRlY3R1cmVzIGFzIGl0IHdhbnRzIHRvOwotCWdlbmVyYWxseSB0aGlzIHdvdWxkIGJlIG9uZSBmb3IgZWFjaCBtYWNoaW5lIGFuZCBvbmUgZm9yIHRoZQotCWRlZmF1bHQgY2FzZSAoYW4gaXRlbSB3aXRoIGEgbWFjaGluZSBmaWVsZCBvZiAwKS4gCi0KLQlCRkQncyBpZGVhIG9mIGFuIGFyY2hpdGVjdHVyZSBpcyBpbXBsZW1lbnRlZCBpbglAZmlsZXthcmNodXJlcy5jfS4KLSovCi0KLS8qCi0KLVNVQlNFQ1RJT04KLQliZmRfYXJjaGl0ZWN0dXJlCi0KLURFU0NSSVBUSU9OCi0JVGhpcyBlbnVtIGdpdmVzIHRoZSBvYmplY3QgZmlsZSdzIENQVSBhcmNoaXRlY3R1cmUsIGluIGEKLQlnbG9iYWwgc2Vuc2UtLS1pLmUuLCB3aGF0IHByb2Nlc3NvciBmYW1pbHkgZG9lcyBpdCBiZWxvbmcgdG8/Ci0JQW5vdGhlciBmaWVsZCBpbmRpY2F0ZXMgd2hpY2ggcHJvY2Vzc29yIHdpdGhpbgotCXRoZSBmYW1pbHkgaXMgaW4gdXNlLiAgVGhlIG1hY2hpbmUgZ2l2ZXMgYSBudW1iZXIgd2hpY2gKLQlkaXN0aW5ndWlzaGVzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgYXJjaGl0ZWN0dXJlLAotCWNvbnRhaW5pbmcsIGZvciBleGFtcGxlLCAyIGFuZCAzIGZvciBJbnRlbCBpOTYwIEtBIGFuZCBpOTYwIEtCLAotCWFuZCA2ODAyMCBhbmQgNjgwMzAgZm9yIE1vdG9yb2xhIDY4MDIwIGFuZCA2ODAzMC4gCi0KLS5lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi0uewotLiAgYmZkX2FyY2hfdW5rbm93biwgICB7KiBGaWxlIGFyY2ggbm90IGtub3duICp9Ci0uICBiZmRfYXJjaF9vYnNjdXJlLCAgIHsqIEFyY2gga25vd24sIG5vdCBvbmUgb2YgdGhlc2UgKn0KLS4gIGJmZF9hcmNoX202OGssICAgICAgeyogTW90b3JvbGEgNjh4eHggKn0KLS4jZGVmaW5lIGJmZF9tYWNoX202ODAwMCAxCi0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDEwIDMKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAyMCA0Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDQwIDYKLS4jZGVmaW5lIGJmZF9tYWNoX202ODA2MCA3Ci0uI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAotLiAgYmZkX2FyY2hfdmF4LCAgICAgICB7KiBERUMgVmF4ICp9ICAgCi0uICBiZmRfYXJjaF9pOTYwLCAgICAgIHsqIEludGVsIDk2MCAqfQotLiAgICB7KiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCi0uICAgICAgIGxvd2VyIG51bWJlciBpbmRpY2F0ZXMgYSBtYWNoaW5lIHR5cGUgdGhhdCAKLS4gICAgICAgb25seSBhY2NlcHRzIGEgc3Vic2V0IG9mIHRoZSBpbnN0cnVjdGlvbnMKLS4gICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCi0uICAgICAgIFRoZSBleGNlcHRpb24gaXMgdGhlICJjYSIsIHdoaWNoIGlzCi0uICAgICAgIGluY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlciBtYWNoaW5lcyBleGNlcHQgCi0uICAgICAgICJjb3JlIi4gKn0KLS4KLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfY29yZSAgICAgIDEKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Jfc2IgICAgIDMKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfbWMgICAgICAgIDQKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfY2EgICAgICAgIDYKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfangJIDcKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKLS4KLS4gIGJmZF9hcmNoX2EyOWssICAgICAgeyogQU1EIDI5MDAwICp9Ci0uICBiZmRfYXJjaF9zcGFyYywgICAgIHsqIFNQQVJDICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyYwkJCTEKLS57KiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldAkyCi0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUJMwotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjhwbHVzCQk0Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OHBsdXNhCQk1IHsqIHdpdGggdWx0cmFzcGFyYyBhZGQnbnMgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQk2Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OQkJNwotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlhCQk4IHsqIHdpdGggdWx0cmFzcGFyYyBhZGQnbnMgKn0KLS57KiBOb256ZXJvIGlmIE1BQ0ggaGFzIHRoZSB2OSBpbnN0cnVjdGlvbiBzZXQuICAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCi0uICAoKG1hY2gpID49IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAmJiAobWFjaCkgPD0gYmZkX21hY2hfc3BhcmNfdjlhKQotLiAgYmZkX2FyY2hfbWlwcywgICAgICB7KiBNSVBTIFJ4eHh4ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9taXBzMzAwMAkJMzAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAJCTM5MDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MDAwCQk0MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDAxMAkJNDAxMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAJCTQxMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MTExCQk0MTExCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDMwMAkJNDMwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAJCTQ0MDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0NjAwCQk0NjAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDY1MAkJNDY1MAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAJCTUwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM2MDAwCQk2MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzODAwMAkJODAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwCQkxMDAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczE2CQkxNgotLiAgYmZkX2FyY2hfaTM4NiwgICAgICB7KiBJbnRlbCAzODYgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4NiAwCi0uI2RlZmluZSBiZmRfbWFjaF9pMzg2X2k4MDg2IDEKLS4jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgotLiAgYmZkX2FyY2hfd2UzMmssICAgICB7KiBBVCZUIFdFMzJ4eHggKn0KLS4gIGJmZF9hcmNoX3RhaG9lLCAgICAgeyogQ0NJL0hhcnJpcyBUYWhvZSAqfQotLiAgYmZkX2FyY2hfaTg2MCwgICAgICB7KiBJbnRlbCA4NjAgKn0KLS4gIGJmZF9hcmNoX3JvbXAsICAgICAgeyogSUJNIFJPTVAgUEMvUlQgKn0KLS4gIGJmZF9hcmNoX2FsbGlhbnQsICAgeyogQWxsaWFudCAqfQotLiAgYmZkX2FyY2hfY29udmV4LCAgICB7KiBDb252ZXggKn0KLS4gIGJmZF9hcmNoX204OGssICAgICAgeyogTW90b3JvbGEgODh4eHggKn0KLS4gIGJmZF9hcmNoX3B5cmFtaWQsICAgeyogUHlyYW1pZCBUZWNobm9sb2d5ICp9Ci0uICBiZmRfYXJjaF9oODMwMCwgICAgIHsqIEhpdGFjaGkgSDgvMzAwICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9oODMwMCAgIDEKLS4jZGVmaW5lIGJmZF9tYWNoX2g4MzAwaCAgMgotLiNkZWZpbmUgYmZkX21hY2hfaDgzMDBzICAzCi0uICBiZmRfYXJjaF9wb3dlcnBjLCAgIHsqIFBvd2VyUEMgKn0KLS4gIGJmZF9hcmNoX3JzNjAwMCwgICAgeyogSUJNIFJTLzYwMDAgKn0KLS4gIGJmZF9hcmNoX2hwcGEsICAgICAgeyogSFAgUEEgUklTQyAqfQotLiAgYmZkX2FyY2hfZDEwdiwgICAgICB7KiBNaXRzdWJpc2hpIEQxMFYgKn0KLS4gIGJmZF9hcmNoX2QzMHYsICAgICAgeyogTWl0c3ViaXNoaSBEMzBWICp9Ci0uICBiZmRfYXJjaF96OGssICAgICAgIHsqIFppbG9nIFo4MDAwICp9Ci0uI2RlZmluZSBiZmRfbWFjaF96ODAwMQkJMQotLiNkZWZpbmUgYmZkX21hY2hfejgwMDIJCTIKLS4gIGJmZF9hcmNoX2g4NTAwLCAgICAgeyogSGl0YWNoaSBIOC81MDAgKn0KLS4gIGJmZF9hcmNoX3NoLCAgICAgICAgeyogSGl0YWNoaSBTSCAqfQotLiNkZWZpbmUgYmZkX21hY2hfc2ggICAgICAgICAgICAwCi0uI2RlZmluZSBiZmRfbWFjaF9zaDMgICAgICAgIDB4MzAKLS4jZGVmaW5lIGJmZF9tYWNoX3NoM2UgICAgICAgMHgzZQotLiAgYmZkX2FyY2hfYWxwaGEsICAgICB7KiBEZWMgQWxwaGEgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NCAgMHgxMAotLiNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY1ICAweDIwCi0uI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKLS4gIGJmZF9hcmNoX2FybSwgICAgICAgeyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8yCQkxCi0uI2RlZmluZSBiZmRfbWFjaF9hcm1fMmEJMgotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzMJCTMKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8zTSAJNAotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzQgCTUKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV80VCAJNgotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzUgCTcKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV81VAk4Ci0uICBiZmRfYXJjaF9uczMyaywgICAgIHsqIE5hdGlvbmFsIFNlbWljb25kdWN0b3JzIG5zMzIwMDAgKn0KLS4gIGJmZF9hcmNoX3c2NSwgICAgICAgeyogV0RDIDY1ODE2ICp9Ci0uICBiZmRfYXJjaF90aWMzMCwgICAgIHsqIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCAqfQotLiAgYmZkX2FyY2hfdGljODAsICAgICB7KiBUSSBUTVMzMjBjODAgKE1WUCkgKn0KLS4gIGJmZF9hcmNoX3Y4NTAsICAgICAgeyogTkVDIFY4NTAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3Y4NTAgICAgICAgICAgMAotLiNkZWZpbmUgYmZkX21hY2hfdjg1MGUgCSdFJwotLiNkZWZpbmUgYmZkX21hY2hfdjg1MGVhCSdBJwotLiAgYmZkX2FyY2hfYXJjLCAgICAgICB7KiBBcmdvbmF1dCBSSVNDIENvcmUgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2FyY19iYXNlIDAKLS4gIGJmZF9hcmNoX20zMnIsICAgICAgeyogTWl0c3ViaXNoaSBNMzJSL0QgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX20zMnIJCTAgeyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKn0KLS4gIGJmZF9hcmNoX21uMTAyMDAsICAgeyogTWF0c3VzaGl0YSBNTjEwMjAwICp9Ci0uICBiZmRfYXJjaF9tbjEwMzAwLCAgIHsqIE1hdHN1c2hpdGEgTU4xMDMwMCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbW4xMDMwMAkJMzAwCi0uICBiZmRfYXJjaF9mcjMwLAotLiNkZWZpbmUgYmZkX21hY2hfZnIzMAkJMHg0NjUyMzMzMAotLiAgYmZkX2FyY2hfbWNvcmUsCi0uICBiZmRfYXJjaF9sYXN0Ci0uICB9OwotCi0KLSovCi0KLS8qCi0KLVNVQlNFQ1RJT04KLQliZmRfYXJjaF9pbmZvCi0KLURFU0NSSVBUSU9OCi0JVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gb24gYXJjaGl0ZWN0dXJlcyBmb3IgdXNlCi0Jd2l0aGluIEJGRC4KLQotLgotLnR5cGVkZWYgc3RydWN0IGJmZF9hcmNoX2luZm8gCi0uewotLiAgaW50IGJpdHNfcGVyX3dvcmQ7Ci0uICBpbnQgYml0c19wZXJfYWRkcmVzczsKLS4gIGludCBiaXRzX3Blcl9ieXRlOwotLiAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0uICB1bnNpZ25lZCBsb25nIG1hY2g7Ci0uICBjb25zdCBjaGFyICphcmNoX25hbWU7Ci0uICBjb25zdCBjaGFyICpwcmludGFibGVfbmFtZTsKLS4gIHVuc2lnbmVkIGludCBzZWN0aW9uX2FsaWduX3Bvd2VyOwotLiB7KiB0cnVlIGlmIHRoaXMgaXMgdGhlIGRlZmF1bHQgbWFjaGluZSBmb3IgdGhlIGFyY2hpdGVjdHVyZSAqfQotLiAgYm9vbGVhbiB0aGVfZGVmYXVsdDsJCi0uICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqICgqY29tcGF0aWJsZSkKLS4JUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmEsCi0uCSAgICAgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpiKSk7Ci0uCi0uICBib29sZWFuICgqc2NhbikgUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci0uCi0uICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqbmV4dDsKLS59IGJmZF9hcmNoX2luZm9fdHlwZTsKLSovCi0KLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2EyOWtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FscGhhX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcmNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FybV9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZDEwdl9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZDMwdl9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDgzMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2g4NTAwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9ocHBhX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pMzg2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pODYwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pOTYwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tMzJyX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tNjhrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tODhrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9taXBzX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMjAwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMzAwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9wb3dlcnBjX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9yczYwMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NoX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zcGFyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzgwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92YXhfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3dlMzJrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF96OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX25zMzJrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF93NjVfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Y4NTBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2ZyMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21jb3JlX2FyY2g7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCBiZmRfYXJjaHVyZXNfbGlzdFtdID0KLXsKLSNpZmRlZiBTRUxFQ1RfQVJDSElURUNUVVJFUwotICBTRUxFQ1RfQVJDSElURUNUVVJFUywKLSNlbHNlCi0gICZiZmRfYTI5a19hcmNoLAotICAmYmZkX2FscGhhX2FyY2gsCi0gICZiZmRfYXJjX2FyY2gsCi0gICZiZmRfYXJtX2FyY2gsCi0gICZiZmRfZDEwdl9hcmNoLAotICAmYmZkX2QzMHZfYXJjaCwKLSAgJmJmZF9oODMwMF9hcmNoLAotICAmYmZkX2g4NTAwX2FyY2gsCi0gICZiZmRfaHBwYV9hcmNoLAotICAmYmZkX2kzODZfYXJjaCwKLSAgJmJmZF9pODYwX2FyY2gsCi0gICZiZmRfaTk2MF9hcmNoLAotICAmYmZkX20zMnJfYXJjaCwKLSAgJmJmZF9tNjhrX2FyY2gsCi0gICZiZmRfbTg4a19hcmNoLAotICAmYmZkX21pcHNfYXJjaCwKLSAgJmJmZF9tbjEwMjAwX2FyY2gsCi0gICZiZmRfbW4xMDMwMF9hcmNoLAotICAmYmZkX3Bvd2VycGNfYXJjaCwKLSAgJmJmZF9yczYwMDBfYXJjaCwKLSAgJmJmZF9zaF9hcmNoLAotICAmYmZkX3NwYXJjX2FyY2gsCi0gICZiZmRfdGljMzBfYXJjaCwKLSAgJmJmZF90aWM4MF9hcmNoLAotICAmYmZkX3ZheF9hcmNoLAotICAmYmZkX3dlMzJrX2FyY2gsCi0gICZiZmRfejhrX2FyY2gsCi0gICZiZmRfbnMzMmtfYXJjaCwKLSAgJmJmZF93NjVfYXJjaCwKLSAgJmJmZF92ODUwX2FyY2gsCi0gICZiZmRfZnIzMF9hcmNoLAotICAmIGJmZF9tY29yZV9hcmNoLAotI2VuZGlmCi0gIDAKLX07Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludGFibGVfbmFtZQotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKmJmZF9wcmludGFibGVfbmFtZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHByaW50YWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUKLQlmcm9tIHRoZSBwb2ludGVyIHRvIHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBzdHJ1Y3R1cmUuCi0KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9uYW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPnByaW50YWJsZV9uYW1lOwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NjYW5fYXJjaAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX3NjYW5fYXJjaChjb25zdCBjaGFyICpzdHJpbmcpOwotCi1ERVNDUklQVElPTgotCUZpZ3VyZSBvdXQgaWYgQkZEIHN1cHBvcnRzIGFueSBjcHUgd2hpY2ggY291bGQgYmUgZGVzY3JpYmVkIHdpdGgKLQl0aGUgbmFtZSBAdmFye3N0cmluZ30uICBSZXR1cm4gYSBwb2ludGVyIHRvIGFuIDw8YXJjaF9pbmZvPj4KLQlzdHJ1Y3R1cmUgaWYgYSBtYWNoaW5lIGlzIGZvdW5kLCBvdGhlcndpc2UgTlVMTC4KLQotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9zY2FuX2FyY2ggKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwLCAqYXA7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgaW5zdGFsbGVkIGFyY2hpdGVjdHVyZXMgKi8KLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICBpZiAoYXAtPnNjYW4gKGFwLCBzdHJpbmcpKQotCSAgICByZXR1cm4gYXA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2xpc3QKLQotU1lOT1BTSVMKLQljb25zdCBjaGFyICoqYmZkX2FyY2hfbGlzdCh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBmcmVzaGx5IG1hbGxvY2VkIE5VTEwtdGVybWluYXRlZCB2ZWN0b3Igb2YgdGhlIG5hbWVzCi0Jb2YgYWxsIHRoZSB2YWxpZCBCRkQgYXJjaGl0ZWN0dXJlcy4gIERvIG5vdCBtb2RpZnkgdGhlIG5hbWVzLgotCi0qLwotCi1jb25zdCBjaGFyICoqCi1iZmRfYXJjaF9saXN0ICgpCi17Ci0gIGludCB2ZWNfbGVuZ3RoID0gMDsKLSAgY29uc3QgY2hhciAqKm5hbWVfcHRyOwotICBjb25zdCBjaGFyICoqbmFtZV9saXN0OwotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwOwotCi0gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGFyY2hpdGVjdHVyZXMgKi8KLSAgdmVjX2xlbmd0aCA9IDA7Ci0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcDsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIHZlY19sZW5ndGgrKzsKLQl9Ci0gICAgfQotCi0gIG5hbWVfbGlzdCA9IChDT05TVCBjaGFyICoqKQotICAgIGJmZF9tYWxsb2MgKCh2ZWNfbGVuZ3RoICsgMSkgKiBzaXplb2YgKGNoYXIgKiopKTsKLSAgaWYgKG5hbWVfbGlzdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFBvaW50IHRoZSBsaXN0IGF0IGVhY2ggb2YgdGhlIG5hbWVzICovCi0gIG5hbWVfcHRyID0gbmFtZV9saXN0OwotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICAqbmFtZV9wdHIgPSBhcC0+cHJpbnRhYmxlX25hbWU7Ci0JICBuYW1lX3B0cisrOwotCX0KLSAgICB9Ci0gICpuYW1lX3B0ciA9IE5VTEw7Ci0KLSAgcmV0dXJuIG5hbWVfbGlzdDsKLX0KLQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2dldF9jb21wYXRpYmxlCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSgKLQkJY29uc3QgYmZkICphYmZkLAotCSAgICAgICAgY29uc3QgYmZkICpiYmZkKTsKLQotREVTQ1JJUFRJT04KLQlEZXRlcm1pbmUgd2hldGhlciB0d28gQkZEcycKLQlhcmNoaXRlY3R1cmVzIGFuZCBtYWNoaW5lIHR5cGVzIGFyZSBjb21wYXRpYmxlLiAgQ2FsY3VsYXRlcwotCXRoZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yIGJldHdlZW4gdGhlIHR3byBhcmNoaXRlY3R1cmVzCi0JYW5kIG1hY2hpbmUgdHlwZXMgaW1wbGllZCBieSB0aGUgQkZEcyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KLQlhbiA8PGFyY2hfaW5mbz4+IHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjb21wYXRpYmxlIG1hY2hpbmUuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgKGFiZmQsIGJiZmQpCi0gICAgIGNvbnN0IGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkICpiYmZkOwotewotICAvKiBJZiBlaXRoZXIgYXJjaGl0ZWN0dXJlIGlzIHVua25vd24sIHRoZW4gYWxsIHdlIGNhbiBkbyBpcyBhc3N1bWUKLSAgICAgdGhlIHVzZXIga25vd3Mgd2hhdCBoZSdzIGRvaW5nLiAgKi8KLSAgaWYgKGFiZmQtPmFyY2hfaW5mby0+YXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAJcmV0dXJuIGJiZmQtPmFyY2hfaW5mbzsKLSAgaWYgKGJiZmQtPmFyY2hfaW5mby0+YXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAJcmV0dXJuIGFiZmQtPmFyY2hfaW5mbzsKLQotICAvKiBPdGhlcndpc2UgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUgaGFzIHRvIGRlY2lkZS4gICovCi0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmNvbXBhdGlibGUgKGFiZmQtPmFyY2hfaW5mbywgYmJmZC0+YXJjaF9pbmZvKTsKLX0KLQotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWJmZF9kZWZhdWx0X2FyY2hfc3RydWN0Ci0KLURFU0NSSVBUSU9OCi0JVGhlIDw8YmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q+PiBpcyBhbiBpdGVtIG9mCi0JPDxiZmRfYXJjaF9pbmZvX3R5cGU+PiB3aGljaCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBhIGZhaXJseQotCWdlbmVyaWMgc3RhdGUuICBBIEJGRCBzdGFydHMgbGlmZSBieSBwb2ludGluZyB0byB0aGlzCi0Jc3RydWN0dXJlLCB1bnRpbCB0aGUgY29ycmVjdCBiYWNrIGVuZCBoYXMgZGV0ZXJtaW5lZCB0aGUgcmVhbAotCWFyY2hpdGVjdHVyZSBvZiB0aGUgZmlsZS4KLQotLmV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCA9Ci17Ci0gICAgMzIsMzIsOCxiZmRfYXJjaF91bmtub3duLDAsInVua25vd24iLCJ1bmtub3duIiwyLHRydWUsCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLCAKLSAgICAwLAotfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9hcmNoX2luZm8KLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9zZXRfYXJjaF9pbmZvKGJmZCAqYWJmZCwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmcpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGluZm8gb2YgQHZhcnthYmZkfSB0byBAdmFye2FyZ30uCi0qLwotCi12b2lkCi1iZmRfc2V0X2FyY2hfaW5mbyAoYWJmZCwgYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJnOwotewotICBhYmZkLT5hcmNoX2luZm8gPSBhcmc7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYmZkICphYmZkLAotCQllbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkJdW5zaWduZWQgbG9uZyBtYWNoKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGluIEJGRCBAdmFye2FiZmR9Ci0JdG8gQHZhcnthcmNofSBhbmQgQHZhcnttYWNofS4gIEZpbmQgdGhlIGNvcnJlY3QKLQlwb2ludGVyIHRvIGEgc3RydWN0dXJlIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgPDxhcmNoX2luZm8+PgotCXBvaW50ZXIuIAotKi8KLQotYm9vbGVhbgotYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwLCAqYXA7Ci0KLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICBpZiAoYXAtPmFyY2ggPT0gYXJjaAotCSAgICAgICYmIChhcC0+bWFjaCA9PSBtYWNoCi0JCSAgfHwgKG1hY2ggPT0gMCAmJiBhcC0+dGhlX2RlZmF1bHQpKSkKLQkgICAgewotCSAgICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFwOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9hcmNoCi0KLVNZTk9QU0lTCi0JZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGJmZF9nZXRfYXJjaChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgZW51bWVyYXRlZCB0eXBlIHdoaWNoIGRlc2NyaWJlcyB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCWFyY2hpdGVjdHVyZS4KLQotKi8KLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi1iZmRfZ2V0X2FyY2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5hcmNoOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X21hY2gKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBsb25nIGJmZF9nZXRfbWFjaChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbG9uZyB0eXBlIHdoaWNoIGRlc2NyaWJlcyB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCW1hY2hpbmUuCi0qLwotCi11bnNpZ25lZCBsb25nICAKLWJmZF9nZXRfbWFjaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAgIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPm1hY2g7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2JpdHNfcGVyX2J5dGUKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2FyY2hfYml0c19wZXJfYnl0ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gb25lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlJ3MgYnl0ZXMuCi0KLSovCi0KLXVuc2lnbmVkIGludAotYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5iaXRzX3Blcl9ieXRlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzCi0KLVNZTk9QU0lTCi0JdW5zaWduZWQgaW50IGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIG9uZSBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCWFyY2hpdGVjdHVyZSdzIGFkZHJlc3Nlcy4KLSovCi0KLXVuc2lnbmVkIGludAotYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5iaXRzX3Blcl9hZGRyZXNzOwotfQotCi0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTiAKLQliZmRfZGVmYXVsdF9jb21wYXRpYmxlCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfZGVmYXVsdF9jb21wYXRpYmxlCi0JKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYSwKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmIpOwotCi1ERVNDUklQVElPTgotCVRoZSBkZWZhdWx0IGZ1bmN0aW9uIGZvciB0ZXN0aW5nIGZvciBjb21wYXRpYmlsaXR5LgotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGEtPm1hY2ggPiBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIGlmIChiLT5tYWNoID4gYS0+bWFjaCkKLSAgICByZXR1cm4gYjsKLQotICByZXR1cm4gYTsKLX0KLQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZGVmYXVsdF9zY2FuCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZGVmYXVsdF9zY2FuKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvLCBjb25zdCBjaGFyICpzdHJpbmcpOwotCi1ERVNDUklQVElPTgotCVRoZSBkZWZhdWx0IGZ1bmN0aW9uIGZvciB3b3JraW5nIG91dCB3aGV0aGVyIHRoaXMgaXMgYW4KLQlhcmNoaXRlY3R1cmUgaGl0IGFuZCBhIG1hY2hpbmUgaGl0LgotKi8KLQotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NjYW4gKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgY29uc3QgY2hhciAqcHRyX3NyYzsKLSAgY29uc3QgY2hhciAqcHRyX3RzdDsKLSAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBjb25zdCBjaGFyICpwcmludGFibGVfbmFtZV9jb2xvbjsKLQotICAvKiBFeGFjdCBtYXRjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIG5hbWUgKEFSQ0hfTkFNRSkgYW5kIGFsc28gdGhlCi0gICAgIGRlZmF1bHQgYXJjaGl0ZWN0dXJlPyAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5hcmNoX25hbWUpID09IDAKLSAgICAgICYmIGluZm8tPnRoZV9kZWZhdWx0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEV4YWN0IG1hdGNoIG9mIHRoZSBtYWNoaW5lIG5hbWUgKFBSSU5UQUJMRV9OQU1FKT8gKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gICAgIAotICAvKiBHaXZlbiB0aGF0IHByaW50YWJsZV9uYW1lIGNvbnRhaW5zIG5vIGNvbG9uLCBhdHRlbXB0IHRvIG1hdGNoOgotICAgICBBUkNIX05BTUUgWyAiOiIgXSBQUklOVEFCTEVfTkFNRT8gKi8KLSAgcHJpbnRhYmxlX25hbWVfY29sb24gPSBzdHJjaHIgKGluZm8tPnByaW50YWJsZV9uYW1lLCAnOicpOwotICBpZiAocHJpbnRhYmxlX25hbWVfY29sb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgc3RybGVuX2FyY2hfbmFtZSA9IHN0cmxlbiAoaW5mby0+YXJjaF9uYW1lKTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5hcmNoX25hbWUsIHN0cmxlbl9hcmNoX25hbWUpID09IDApCi0JewotCSAgaWYgKHN0cmluZ1tzdHJsZW5fYXJjaF9uYW1lXSA9PSAnOicpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nICsgc3RybGVuX2FyY2hfbmFtZSArIDEsCi0JCQkgICAgICBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcgKyBzdHJsZW5fYXJjaF9uYW1lLAotCQkJICAgICAgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0JCXJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBHaXZlbiB0aGF0IFBSSU5UQUJMRV9OQU1FIGhhcyB0aGUgZm9ybTogPGFyY2g+ICI6IiA8bWFjaD47Ci0gICAgIEF0dGVtcHQgdG8gbWF0Y2g6IDxhcmNoPiA8bWFjaD4/ICovCi0gIGlmIChwcmludGFibGVfbmFtZV9jb2xvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBjb2xvbl9pbmRleCA9IHByaW50YWJsZV9uYW1lX2NvbG9uIC0gaW5mby0+cHJpbnRhYmxlX25hbWU7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUsIGNvbG9uX2luZGV4KSA9PSAwCi0JICAmJiBzdHJjYXNlY21wIChzdHJpbmcgKyBjb2xvbl9pbmRleCwKLQkJCSBpbmZvLT5wcmludGFibGVfbmFtZSArIGNvbG9uX2luZGV4ICsgMSkgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogR2l2ZW4gdGhhdCBQUklOVEFCTEVfTkFNRSBoYXMgdGhlIGZvcm06IDxhcmNoPiAiOiIgPG1hY2g+OyBEbyBub3QKLSAgICAgYXR0ZW1wdCB0byBtYXRjaCBqdXN0IDxtYWNoPiwgaXQgY291bGQgYmUgYW1iaWdpb3VzLiAgVGhpcyB0ZXN0Ci0gICAgIGlzIGxlZnQgdW50aWwgbGF0ZXIuICovCi0KLSAgLyogTk9URTogVGhlIGJlbG93IGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuIFBsZWFzZSBkbyBub3QKLSAgICAgYWRkIHRvIHRoaXMgY29kZSAqLwotCi0gIC8qIFNlZSBob3cgbXVjaCBvZiB0aGUgc3VwcGxpZWQgc3RyaW5nIG1hdGNoZXMgd2l0aCB0aGUKLSAgICAgYXJjaGl0ZWN0dXJlLCBlZyB0aGUgc3RyaW5nIG02OGs6NjgwMjAgd291bGQgbWF0Y2ggdGhlIDY4ayBlbnRyeQotICAgICB1cCB0byB0aGUgOiwgdGhlbiB3ZSBnZXQgbGVmdCB3aXRoIHRoZSBtYWNoaW5lIG51bWJlciAqLwotCi0gIGZvciAocHRyX3NyYyA9IHN0cmluZywgcHRyX3RzdCA9IGluZm8tPmFyY2hfbmFtZTsgCi0gICAgICAgKnB0cl9zcmMgJiYgKnB0cl90c3Q7Ci0gICAgICAgcHRyX3NyYysrLCBwdHJfdHN0KyspIAotICAgIHsKLSAgICAgIGlmICgqcHRyX3NyYyAhPSAqcHRyX3RzdCkgYnJlYWs7Ci0gICAgfQotCi0gIC8qIENoZXdlZCB1cCBhcyBtdWNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgYXMgd2lsbCBtYXRjaCwgc2tpcCBhbnkKLSAgICAgY29sb25zICovCi0gIGlmICgqcHRyX3NyYyA9PSAnOicpCi0gICAgcHRyX3NyYysrOwotICAKLSAgaWYgKCpwdHJfc3JjID09IDApCi0gICAgewotICAgICAgLyogbm90aGluZyBtb3JlLCB0aGVuIG9ubHkga2VlcCB0aGlzIG9uZSBpZiBpdCBpcyB0aGUgZGVmYXVsdAotCSBtYWNoaW5lIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLwotICAgICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OwotICAgIH0KLQotICBudW1iZXIgPSAwOwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwdHJfc3JjKSkKLSAgICB7Ci0gICAgICBudW1iZXIgPSBudW1iZXIgKiAxMCArICpwdHJfc3JjICAtICcwJzsKLSAgICAgIHB0cl9zcmMrKzsKLSAgICB9Ci0KLSAgLyogTk9URTogVGhlIGJlbG93IGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuCi0gICAgIFBMRUFTRSBETyBOT1QgQUREIFRPIFRISVMgQ09ERS4gKi8KLQotICBzd2l0Y2ggKG51bWJlcikgCi0gICAgewotICAgICAgLyogRklYTUU6IFRoZXNlIGFyZSBuZWVkZWQgdG8gcGFyc2UgSUVFRSBvYmplY3RzLiAgKi8KLSAgICBjYXNlIDY4MDAwOiAKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAxMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAyMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAzMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDMwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODA0MDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDQwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODA2MDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODMzMjoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfY3B1MzI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzIwMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfd2UzMms7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbWlwczMwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbWlwczQwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNjAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9yczYwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6ICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGFyY2ggIT0gaW5mby0+YXJjaCkgCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChudW1iZXIgIT0gaW5mby0+bWFjaCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9hcmNoX2luZm8KLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBiZmRfZ2V0X2FyY2hfaW5mbyhiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgYXJjaGl0ZWN0dXJlIGluZm8gc3RydWN0IGluIEB2YXJ7YWJmZH0uCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mbzsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfbG9va3VwX2FyY2gKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9sb29rdXBfYXJjaAotCQkoZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi0JCWFyY2gsCi0JCXVuc2lnbmVkIGxvbmcgbWFjaGluZSk7Ci0KLURFU0NSSVBUSU9OCi0JTG9vayBmb3IgdGhlIGFyY2hpdGVjdXJlIGluZm8gc3RydWN0dXJlIHdoaWNoIG1hdGNoZXMgdGhlCi0JYXJndW1lbnRzIEB2YXJ7YXJjaH0gYW5kIEB2YXJ7bWFjaGluZX0uIEEgbWFjaGluZSBvZiAwIG1hdGNoZXMgdGhlCi0JbWFjaGluZS9hcmNoaXRlY3R1cmUgc3RydWN0dXJlIHdoaWNoIG1hcmtzIGl0c2VsZiBhcyB0aGUKLQlkZWZhdWx0LgotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogCi1iZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2hpbmUpCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+YXJjaCA9PSBhcmNoCi0JICAgICAgJiYgKGFwLT5tYWNoID09IG1hY2hpbmUKLQkJICB8fCAobWFjaGluZSA9PSAwICYmIGFwLT50aGVfZGVmYXVsdCkpKQotCSAgICByZXR1cm4gYXA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfcHJpbnRhYmxlX2FyY2hfbWFjaAotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKmJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0JCShlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwcmludGFibGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYXJjaGl0ZWN0dXJlIGFuZAotCW1hY2hpbmUgdHlwZS4gCi0KLQlUaGlzIHJvdXRpbmUgaXMgZGVwcmVjaWF0ZWQuCi0qLwotCi1jb25zdCBjaGFyICoKLWJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhcmNoLCBtYWNoaW5lKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXAgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2hpbmUpOwotCi0gICAgaWYgKGFwKQotICAgICAgcmV0dXJuIGFwLT5wcmludGFibGVfbmFtZTsKLSAgICByZXR1cm4gIlVOS05PV04hIjsKLX0KZGlmZiAtLWdpdCBhL2JmZC9iZmQtaW4uaCBiL2JmZC9iZmQtaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5ODNiYS4uMDAwMDAwMAotLS0gYS9iZmQvYmZkLWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotLyogTWFpbiBoZWFkZXIgZmlsZSBmb3IgdGhlIGJmZCBsaWJyYXJ5IC0tIHBvcnRhYmxlIGFjY2VzcyB0byBvYmplY3QgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBiZmQuaCBhbmQgYmZkLWluMi5oIGFyZSBHRU5FUkFURUQgZmlsZXMuICBEb24ndCBjaGFuZ2UgdGhlbTsKLSoqIGluc3RlYWQsIGNoYW5nZSBiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoZXNlIGZpbGVzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIGJmZC5oIC0tIFRoZSBvbmx5IGhlYWRlciBmaWxlIHJlcXVpcmVkIGJ5IHVzZXJzIG9mIHRoZSBiZmQgbGlicmFyeSAKLQotVGhlIGJmZC5oIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gYmZkLWluLmggYW5kIHZhcmlvdXMgLmMgZmlsZXM7IGlmIHlvdQotY2hhbmdlIGl0LCB5b3VyIGNoYW5nZXMgd2lsbCBwcm9iYWJseSBiZSBsb3N0LgotCi1BbGwgdGhlIHByb3RvdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvbGxvd2luZyB0aGUgY29tbWVudCAiVEhFIEZPTExPV0lORwotSVMgRVhUUkFDVEVEIEZST00gVEhFIFNPVVJDRSIgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgZmlsZXMgZm9yCi1CRkQuICBJZiB5b3UgY2hhbmdlIGl0LCBzb21lb25lIG9uZWRheSB3aWxsIGV4dHJhY3QgaXQgZnJvbSB0aGUgc291cmNlCi1hZ2FpbiwgYW5kIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGxvc3QuICBUbyBzYXZlIHlvdXJzZWxmIGZyb20gdGhpcyBiaW5kLAotY2hhbmdlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgc291cmNlIGluIHRoZSBiZmQgZGlyZWN0b3J5LiAgVHlwZSAibWFrZQotZG9jcyIgYW5kIHRoZW4gIm1ha2UgaGVhZGVycyIgaW4gdGhhdCBkaXJlY3RvcnksIGFuZCBtYWdpY2FsbHkgdGhpcyBmaWxlCi13aWxsIGNoYW5nZSB0byByZWZsZWN0IHlvdXIgY2hhbmdlcy4KLQotSWYgeW91IGRvbid0IGhhdmUgdGhlIHRvb2xzIHRvIHBlcmZvcm0gdGhlIGV4dHJhY3Rpb24sIHRoZW4geW91IGFyZQotc2FmZSBmcm9tIHNvbWVvbmUgb24geW91ciBzeXN0ZW0gdHJhbXBsaW5nIG92ZXIgeW91ciBoZWFkZXIgZmlsZXMuCi1Zb3Ugc2hvdWxkIHN0aWxsIG1haW50YWluIHRoZSBlcXVpdmFsZW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRoaXMKLWZpbGUgdGhvdWdoOyBldmVyeSBjaGFuZ2UgeW91IG1ha2UgdG8gdGhlIC5jIGZpbGUgc2hvdWxkIGJlIHJlZmxlY3RlZAotaGVyZS4gICovCi0KLSNpZm5kZWYgX19CRkRfSF9TRUVOX18KLSNkZWZpbmUgX19CRkRfSF9TRUVOX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogVGhlc2UgdHdvIGxpbmVzIGdldCBzdWJzdGl0dXRpb25zIGRvbmUgYnkgY29tbWFuZHMgaW4gTWFrZWZpbGUuaW4uICAqLwotI2RlZmluZSBCRkRfVkVSU0lPTiAgIkBWRVJTSU9OQCIKLSNkZWZpbmUgQkZEX0FSQ0hfU0laRSBAd29yZHNpemVACi0jZGVmaW5lIEJGRF9IT1NUXzY0QklUX0xPTkcgQEJGRF9IT1NUXzY0QklUX0xPTkdACi0jaWYgQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotI2RlZmluZSBCRkRfSE9TVF82NF9CSVQgQEJGRF9IT1NUXzY0X0JJVEAKLSNkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgQEJGRF9IT1NUX1VfNjRfQklUQAotI2VuZGlmCi0KLSNpZiBCRkRfQVJDSF9TSVpFID49IDY0Ci0jZGVmaW5lIEJGRDY0Ci0jZW5kaWYKLQotI2lmbmRlZiBJTkxJTkUKLSNpZiBfX0dOVUNfXyA+PSAyCi0jZGVmaW5lIElOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZgotI2VuZGlmCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IF9iZmQgYmZkOwotCi0vKiBUbyBzcXVlbGNoIGVycm9uZW91cyBjb21waWxlciB3YXJuaW5ncyAoImlsbGVnYWwgcG9pbnRlcgotICAgY29tYmluYXRpb24iKSBmcm9tIHRoZSBTVlIzIGNvbXBpbGVyLCB3ZSB3b3VsZCBsaWtlIHRvIHR5cGVkZWYKLSAgIGJvb2xlYW4gdG8gaW50IChpdCBkb2Vzbid0IGxpa2UgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBib29sZWFuLgotICAgTWFraW5nIHN1cmUgdGhleSBhcmUgbmV2ZXIgaW1wbGljaXRseSBkZWNsYXJlZCB0byByZXR1cm4gaW50Ci0gICBkb2Vzbid0IHNlZW0gdG8gaGVscCkuICBCdXQgdGhpcyBmaWxlIGlzIG5vdCBjb25maWd1cmVkIGJhc2VkIG9uCi0gICB0aGUgaG9zdC4gICovCi0vKiBHZW5lcmFsIHJ1bGVzOiBmdW5jdGlvbnMgd2hpY2ggYXJlIGJvb2xlYW4gcmV0dXJuIHRydWUgb24gc3VjY2VzcwotICAgYW5kIGZhbHNlIG9uIGZhaWx1cmUgKHVubGVzcyB0aGV5J3JlIGEgcHJlZGljYXRlKS4gICAtLSBiZmQuZG9jICovCi0vKiBJJ20gc3VyZSB0aGlzIGlzIGdvaW5nIHRvIGJyZWFrIHNvbWV0aGluZyBhbmQgc29tZW9uZSBpcyBnb2luZyB0bwotICAgZm9yY2UgbWUgdG8gY2hhbmdlIGl0LiAqLwotLyogdHlwZWRlZiBlbnVtIGJvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOyAqLwotLyogWXVwLCBTVlI0IGhhcyBhICJ0eXBlZGVmIGVudW0gYm9vbGVhbiIgaW4gPHN5cy90eXBlcy5oPiAgLWZuZiAqLwotLyogSXQgZ2V0cyB3b3JzZSBpZiB0aGUgaG9zdCBhbHNvIGRlZmluZXMgYSB0cnVlL2ZhbHNlIGVudW0uLi4gLXN0cyAqLwotLyogQW5kIGV2ZW4gd29yc2UgaWYgeW91ciBjb21waWxlciBoYXMgYnVpbHQtaW4gYm9vbGVhbiB0eXBlcy4uLiAtbGF3ICovCi0jaWYgZGVmaW5lZCAoX19HTlVHX18pICYmIChfX0dOVUNfTUlOT1JfXyA+IDUpCi0jZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi0jZW5kaWYKLSNpZmRlZiBNUFcKLS8qIFByZS1lbXB0aXZlIHN0cmlrZSAtIGdldCB0aGUgZmlsZSB3aXRoIHRoZSBlbnVtLiAqLwotI2luY2x1ZGUgPFR5cGVzLmg+Ci0jZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi0jZW5kaWYgLyogTVBXICovCi0jaWZuZGVmIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOwotI2RlZmluZSBCRkRfVFJVRV9GQUxTRQotI2Vsc2UKLS8qIFVzZSBlbnVtIG5hbWVzIHRoYXQgd2lsbCBhcHBlYXIgbm93aGVyZSBlbHNlLiAgKi8KLXR5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7YmZkX2ZmZmFsc2UsIGJmZF90dHRydWV9IGJvb2xlYW47Ci0jZW5kaWYKLQotLyogQSBwb2ludGVyIHRvIGEgcG9zaXRpb24gaW4gYSBmaWxlLiAgKi8KLS8qIEZJWE1FOiAgVGhpcyBzaG91bGQgYmUgdXNpbmcgb2ZmX3QgZnJvbSA8c3lzL3R5cGVzLmg+LgotICAgRm9yIG5vdywgdHJ5IHRvIGF2b2lkIGJyZWFraW5nIHN0dWZmIGJ5IG5vdCBpbmNsdWRpbmcgPHN5cy90eXBlcy5oPiBoZXJlLgotICAgVGhpcyB3aWxsIGJyZWFrIG9uIHN5c3RlbXMgd2l0aCA2NC1iaXQgZmlsZSBvZmZzZXRzIChlLmcuIDQuNEJTRCkuCi0gICBQcm9iYWJseSB0aGUgYmVzdCBsb25nLXRlcm0gYW5zd2VyIGlzIHRvIGF2b2lkIHVzaW5nIGZpbGVfcHRyIEFORCBvZmZfdCAKLSAgIGluIHRoaXMgaGVhZGVyIGZpbGUsIGFuZCB0byBoYW5kbGUgdGhpcyBpbiB0aGUgQkZEIGltcGxlbWVudGF0aW9uCi0gICByYXRoZXIgdGhhbiBpbiBpdHMgaW50ZXJmYWNlLiAgKi8KLS8qIHR5cGVkZWYgb2ZmX3QJZmlsZV9wdHI7ICovCi10eXBlZGVmIGxvbmcgaW50IGZpbGVfcHRyOwotCi0vKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgc2l6ZXMgb2YgdGFyZ2V0IGZvcm1hdCBpbnRzIGFuZCBhZGRyZXNzZXMuCi0gICBJZiB0aGUgdHlwZSBgbG9uZycgaXMgYXQgbGVhc3QgNjQgYml0cywgQkZEX0hPU1RfNjRCSVRfTE9ORyB3aWxsIGJlCi0gICBzZXQgdG8gMSBhYm92ZS4gIE90aGVyd2lzZSwgaWYgZ2NjIGlzIGJlaW5nIHVzZWQsIHRoaXMgY29kZSB3aWxsCi0gICB1c2UgZ2NjJ3MgImxvbmcgbG9uZyIgdHlwZS4gIE90aGVyd2lzZSwgQkZEX0hPU1RfNjRfQklUIG11c3QgYmUKLSAgIGRlZmluZWQgYWJvdmUuICAqLwotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotIyBpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0jICBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGxvbmcKLSMgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nCi0jIGVsc2UKLSMgIGlmZGVmIF9fR05VQ19fCi0jICAgaWYgX19HTlVDX18gPj0gMgotIyAgICBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZyBsb25nCi0jICAgZW5kaWYgLyogX19HTlVDX18gPj0gMiAqLwotIyAgZW5kaWYgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KLSMgZW5kaWYgLyogISBCRkRfSE9TVF82NEJJVF9MT05HICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCi0KLSNpZmRlZiBCRkQ2NAotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotICNlcnJvciBObyA2NCBiaXQgaW50ZWdlciB0eXBlIGF2YWlsYWJsZQotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUXzY0X0JJVCBiZmRfc2lnbmVkX3ZtYTsKLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3NpemVfdHlwZTsKLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgc3ltdmFsdWU7Ci0KLSNpZm5kZWYgZnByaW50Zl92bWEKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZiAocywgIiUwMTZseCIsIHgpCi0jZGVmaW5lIGZwcmludGZfdm1hKGYseCkgZnByaW50ZiAoZiwgIiUwMTZseCIsIHgpCi0jZWxzZQotI2RlZmluZSBfYmZkX2ludDY0X2xvdyh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpICYgMHhmZmZmZmZmZikpKQotI2RlZmluZSBfYmZkX2ludDY0X2hpZ2goeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkKLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBcCi0gIGZwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgXAotICBzcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2VuZGlmCi0jZW5kaWYKLQotI2Vsc2UgLyogbm90IEJGRDY0ICAqLwotCi0vKiBSZXByZXNlbnQgYSB0YXJnZXQgYWRkcmVzcy4gIEFsc28gdXNlZCBhcyBhIGdlbmVyaWMgdW5zaWduZWQgdHlwZQotICAgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55IGFyaXRobWV0aWMgdHlwZXMKLSAgIHdlIG5lZWQgdG8gZGVhbCB3aXRoLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfdm1hOwotCi0vKiBBIGdlbmVyaWMgc2lnbmVkIHR5cGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55Ci0gICBhcml0aG1ldGljIHR5cGVzIHdlIG5lZWQgdG8gZGVhbCB3aXRoLiAgQ2FuIGJlIGFzc3VtZWQgdG8gYmUgY29tcGF0aWJsZQotICAgd2l0aCBiZmRfdm1hIGluIHRoZSBzYW1lIHdheSB0aGF0IHNpZ25lZCBhbmQgdW5zaWduZWQgaW50cyBhcmUgY29tcGF0aWJsZQotICAgKGFzIHBhcmFtZXRlcnMsIGluIGFzc2lnbm1lbnQsIGV0YykuICAqLwotdHlwZWRlZiBsb25nIGJmZF9zaWduZWRfdm1hOwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltdmFsdWU7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3NpemVfdHlwZTsKLQotLyogUHJpbnQgYSBiZmRfdm1hIHggb24gc3RyZWFtIHMuICAqLwotI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIGZwcmludGYocywgIiUwOGx4IiwgeCkKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmKHMsICIlMDhseCIsIHgpCi0KLSNlbmRpZiAvKiBub3QgQkZENjQgICovCi0KLSNkZWZpbmUgcHJpbnRmX3ZtYSh4KSBmcHJpbnRmX3ZtYShzdGRvdXQseCkKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxhZ3dvcmQ7CS8qIDMyIGJpdHMgb2YgZmxhZ3MgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBiZmRfYnl0ZTsKLQwKLS8qKiBGaWxlIGZvcm1hdHMgKi8KLQotdHlwZWRlZiBlbnVtIGJmZF9mb3JtYXQgewotCSAgICAgIGJmZF91bmtub3duID0gMCwJLyogZmlsZSBmb3JtYXQgaXMgdW5rbm93biAqLwotCSAgICAgIGJmZF9vYmplY3QsCS8qIGxpbmtlci9hc3NlbWJlci9jb21waWxlciBvdXRwdXQgKi8KLQkgICAgICBiZmRfYXJjaGl2ZSwJLyogb2JqZWN0IGFyY2hpdmUgZmlsZSAqLwotCSAgICAgIGJmZF9jb3JlLAkJLyogY29yZSBkdW1wICovCi0JICAgICAgYmZkX3R5cGVfZW5kfQkvKiBtYXJrcyB0aGUgZW5kOyBkb24ndCB1c2UgaXQhICovCi0gICAgICAgICBiZmRfZm9ybWF0OwotCi0vKiBWYWx1ZXMgdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhIEJGRC4gIFRoZXNlIGFsc28KLSAgIGFwcGVhciBpbiB0aGUgb2JqZWN0X2ZsYWdzIGZpZWxkIG9mIHRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZSwgd2hlcmUKLSAgIHRoZXkgaW5kaWNhdGUgdGhlIHNldCBvZiBmbGFncyB1c2VkIGJ5IHRoYXQgYmFja2VuZCAobm90IGFsbCBmbGFncwotICAgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzKSAoRklYTUU6IGF0IHRoZSBtb21lbnQsCi0gICB0aGUgb2JqZWN0X2ZsYWdzIHZhbHVlcyBoYXZlIG1vc3RseSBqdXN0IGJlZW4gY29waWVkIGZyb20gYmFja2VuZAotICAgdG8gYW5vdGhlciwgYW5kIGFyZSBub3QgbmVjZXNzYXJpbHkgY29ycmVjdCkuICAqLwotCi0vKiBObyBmbGFncy4gICovCi0jZGVmaW5lIEJGRF9OT19GTEFHUyAgIAkweDAwCi0KLS8qIEJGRCBjb250YWlucyByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotI2RlZmluZSBIQVNfUkVMT0MgICAJMHgwMQotCi0vKiBCRkQgaXMgZGlyZWN0bHkgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIEVYRUNfUCAgICAgIAkweDAyCi0KLS8qIEJGRCBoYXMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKGJhc2ljYWxseSB1c2VkIGZvciBGX0xOTk8gaW4gYQotICAgQ09GRiBoZWFkZXIpLiAgKi8KLSNkZWZpbmUgSEFTX0xJTkVOTyAgCTB4MDQKLQotLyogQkZEIGhhcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBIQVNfREVCVUcgICAJMHgwOAotCi0vKiBCRkQgaGFzIHN5bWJvbHMuICAqLwotI2RlZmluZSBIQVNfU1lNUyAgICAJMHgxMAotCi0vKiBCRkQgaGFzIGxvY2FsIHN5bWJvbHMgKGJhc2ljYWxseSB1c2VkIGZvciBGX0xTWU1TIGluIGEgQ09GRgotICAgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MT0NBTFMgIAkweDIwCi0KLS8qIEJGRCBpcyBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRFlOQU1JQyAgICAgCTB4NDAKLQotLyogVGV4dCBzZWN0aW9uIGlzIHdyaXRlIHByb3RlY3RlZCAoaWYgRF9QQUdFRCBpcyBub3Qgc2V0LCB0aGlzIGlzCi0gICBsaWtlIGFuIGEub3V0IE5NQUdJQyBmaWxlKSAodGhlIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0Ci0gICBjbGVhcnMgaXQgZm9yIC1yIG9yIC1OKS4gICovCi0jZGVmaW5lIFdQX1RFWFQgICAgIAkweDgwCi0KLS8qIEJGRCBpcyBkeW5hbWljYWxseSBwYWdlZCAodGhpcyBpcyBsaWtlIGFuIGEub3V0IFpNQUdJQyBmaWxlKSAodGhlCi0gICBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dCBjbGVhcnMgaXQgZm9yIC1yIG9yIC1uIG9yIC1OKS4gICovCi0jZGVmaW5lIERfUEFHRUQgICAgIAkweDEwMAotCi0vKiBCRkQgaXMgcmVsYXhhYmxlICh0aGlzIG1lYW5zIHRoYXQgYmZkX3JlbGF4X3NlY3Rpb24gbWF5IGJlIGFibGUgdG8KLSAgIGRvIHNvbWV0aGluZykgKHNvbWV0aW1lcyBiZmRfcmVsYXhfc2VjdGlvbiBjYW4gZG8gc29tZXRoaW5nIGV2ZW4gaWYKLSAgIHRoaXMgaXMgbm90IHNldCkuICAqLwotI2RlZmluZSBCRkRfSVNfUkVMQVhBQkxFIDB4MjAwCi0KLS8qIFRoaXMgbWF5IGJlIHNldCBiZWZvcmUgd3JpdGluZyBvdXQgYSBCRkQgdG8gcmVxdWVzdCB1c2luZyBhCi0gICB0cmFkaXRpb25hbCBmb3JtYXQuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyB1c2VkIHRvIHJlcXVlc3QgdGhhdCB3aGVuCi0gICB3cml0aW5nIG91dCBhbiBhLm91dCBvYmplY3QgdGhlIHN5bWJvbHMgbm90IGJlIGhhc2hlZCB0byBlbGltaW5hdGUKLSAgIGR1cGxpY2F0ZXMuICAqLwotI2RlZmluZSBCRkRfVFJBRElUSU9OQUxfRk9STUFUIDB4NDAwCi0KLS8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgQkZEIGNvbnRlbnRzIGFyZSBhY3R1YWxseSBjYWNoZWQgaW4KLSAgIG1lbW9yeS4gIElmIHRoaXMgaXMgc2V0LCBpb3N0cmVhbSBwb2ludHMgdG8gYSBiZmRfaW5fbWVtb3J5IHN0cnVjdC4gICovCi0jZGVmaW5lIEJGRF9JTl9NRU1PUlkgMHg4MDAKLQwKLS8qIHN5bWJvbHMgYW5kIHJlbG9jYXRpb24gKi8KLQotLyogQSBjb3VudCBvZiBjYXJzeW1zIChjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzKS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltaW5kZXg7Ci0KLS8qIEhvdyB0byBwZXJmb3JtIGEgcmVsb2NhdGlvbi4gICovCi10eXBlZGVmIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgcmVsb2NfaG93dG9fdHlwZTsKLQotI2RlZmluZSBCRkRfTk9fTU9SRV9TWU1CT0xTICgoc3ltaW5kZXgpIH4wKQotCi0vKiBHZW5lcmFsIHB1cnBvc2UgcGFydCBvZiBhIHN5bWJvbCBYOwotICAgdGFyZ2V0IHNwZWNpZmljIHBhcnRzIGFyZSBpbiBsaWJjb2ZmLmgsIGxpYmFvdXQuaCwgZXRjLiAgKi8KLQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbikKLSNkZWZpbmUgYmZkX2dldF9vdXRwdXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uKHgseSkgKCh4KS0+c2VjdGlvbikgPSAoeSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfYmFzZSh4KSAoKHgpLT5zZWN0aW9uLT52bWEpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX3ZhbHVlKHgpIChiZmRfYXN5bWJvbF9iYXNlKHgpICsgKHgpLT52YWx1ZSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfbmFtZSh4KSAoKHgpLT5uYW1lKQotLypQZXJoYXBzIGZ1dHVyZTogI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+c2VjdGlvbi0+b3duZXIpKi8KLSNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnRoZV9iZmQpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2ZsYXZvdXIoeCkgKGJmZF9hc3ltYm9sX2JmZCh4KS0+eHZlYy0+Zmxhdm91cikKLQotLyogQSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2wuICAqLwotLyogVGhpcyBpcyBhIHR5cGUgcHVuIHdpdGggc3RydWN0IHJhbmxpYiBvbiBwdXJwb3NlISAqLwotdHlwZWRlZiBzdHJ1Y3QgY2Fyc3ltIHsKLSAgY2hhciAqbmFtZTsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7CQkvKiBsb29rIGhlcmUgdG8gZmluZCB0aGUgZmlsZSAqLwotfSBjYXJzeW07CQkJLyogdG8gbWFrZSB0aGVzZSB5b3UgY2FsbCBhIGNhcnN5bW9nZW4gKi8KLQotICAKLS8qIFVzZWQgaW4gZ2VuZXJhdGluZyBhcm1hcHMgKGFyY2hpdmUgdGFibGVzIG9mIGNvbnRlbnRzKS4KLSAgIFBlcmhhcHMganVzdCBhIGZvcndhcmQgZGVmaW5pdGlvbiB3b3VsZCBkbz8gKi8KLXN0cnVjdCBvcmwgewkJCS8qIG91dHB1dCByYW5saWIgKi8KLSAgY2hhciAqKm5hbWU7CQkJLyogc3ltYm9sIG5hbWUgKi8gCi0gIGZpbGVfcHRyIHBvczsJCQkvKiBiZmQqIG9yIGZpbGUgcG9zaXRpb24gKi8KLSAgaW50IG5hbWlkeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSAqLwotfTsKLQwKLQotLyogTGluZW51bWJlciBzdHVmZiAqLwotdHlwZWRlZiBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5IHsKLSAgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyOwkvKiBMaW5lbnVtYmVyIGZyb20gc3RhcnQgb2YgZnVuY3Rpb24qLyAgCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW07IC8qIEZ1bmN0aW9uIG5hbWUgKi8KLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsJLyogT2Zmc2V0IGludG8gc2VjdGlvbiAqLwotICB9IHU7Ci19IGFsZW50OwotDAotLyogb2JqZWN0IGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KLQotI2RlZmluZQlhbGlnbl9wb3dlcihhZGRyLCBhbGlnbikJXAotCSggKChhZGRyKSArICgoMTw8KGFsaWduKSktMSkpICYgKC0xIDw8IChhbGlnbikpKQotCi10eXBlZGVmIHN0cnVjdCBzZWMgKnNlY19wdHI7Ci0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgKyAwKQotI2RlZmluZSBiZmRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3NpemUoYmZkLCBwdHIpIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MocHRyKSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbG1hKGJmZCwgcHRyKSAoKHB0ciktPmxtYSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlcikKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGJmZCwgcHRyKSAoKHB0ciktPmZsYWdzICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyKSAoKHB0ciktPnVzZXJkYXRhKQotCi0jZGVmaW5lIGJmZF9pc19jb21fc2VjdGlvbihwdHIpICgoKHB0ciktPmZsYWdzICYgU0VDX0lTX0NPTU1PTikgIT0gMCkKLQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPnZtYSA9IChwdHIpLT5sbWE9ICh2YWwpKSwgKChwdHIpLT51c2VyX3NldF92bWEgPSAoYm9vbGVhbil0cnVlKSwgdHJ1ZSkKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgPSAodmFsKSksdHJ1ZSkKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPnVzZXJkYXRhID0gKHZhbCkpLHRydWUpCi0KLXR5cGVkZWYgc3RydWN0IHN0YXQgc3RhdF90eXBlOyAKLQwKLXR5cGVkZWYgZW51bSBiZmRfcHJpbnRfc3ltYm9sCi17IAotICBiZmRfcHJpbnRfc3ltYm9sX25hbWUsCi0gIGJmZF9wcmludF9zeW1ib2xfbW9yZSwKLSAgYmZkX3ByaW50X3N5bWJvbF9hbGwKLX0gYmZkX3ByaW50X3N5bWJvbF90eXBlOwotICAgIAotLyogSW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wgdGhhdCBubSBuZWVkcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IF9zeW1ib2xfaW5mbwotewotICBzeW12YWx1ZSB2YWx1ZTsKLSAgY2hhciB0eXBlOwotICBDT05TVCBjaGFyICpuYW1lOyAgICAgICAgICAgIC8qIFN5bWJvbCBuYW1lLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzdGFiX3R5cGU7ICAgICAvKiBTdGFiIHR5cGUuICAqLwotICBjaGFyIHN0YWJfb3RoZXI7ICAgICAgICAgICAgIC8qIFN0YWIgb3RoZXIuICovCi0gIHNob3J0IHN0YWJfZGVzYzsgICAgICAgICAgICAgLyogU3RhYiBkZXNjLiAgKi8KLSAgQ09OU1QgY2hhciAqc3RhYl9uYW1lOyAgICAgICAvKiBTdHJpbmcgZm9yIHN0YWIgdHlwZS4gICovCi19IHN5bWJvbF9pbmZvOwotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBzdGFicyB0eXBlIGNvZGUuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqYmZkX2dldF9zdGFiX25hbWUgUEFSQU1TICgoaW50KSk7Ci0MCi0vKiBIYXNoIHRhYmxlIHJvdXRpbmVzLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KLQotLyogQW4gZWxlbWVudCBpbiB0aGUgaGFzaCB0YWJsZS4gIE1vc3QgdXNlcyB3aWxsIGFjdHVhbGx5IHVzZSBhIGxhcmdlcgotICAgc3RydWN0dXJlLCBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBmaWVsZC4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeQotewotICAvKiBOZXh0IGVudHJ5IGZvciB0aGlzIGhhc2ggY29kZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogU3RyaW5nIGJlaW5nIGhhc2hlZC4gICovCi0gIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgLyogSGFzaCBjb2RlLiAgVGhpcyBpcyB0aGUgZnVsbCBoYXNoIGNvZGUsIG5vdCB0aGUgaW5kZXggaW50byB0aGUKLSAgICAgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci19OwotCi0vKiBBIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggYXJyYXkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKip0YWJsZTsKLSAgLyogVGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBBIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIG5ldyBlbGVtZW50cyBpbiB0aGUgaGFzaCB0YWJsZS4gIFRoZQotICAgICBmaXJzdCBlbnRyeSBpcyBpdHNlbGYgYSBwb2ludGVyIHRvIGFuIGVsZW1lbnQuICBXaGVuIHRoaXMKLSAgICAgZnVuY3Rpb24gaXMgZmlyc3QgaW52b2tlZCwgdGhpcyBwb2ludGVyIHdpbGwgYmUgTlVMTC4gIEhvd2V2ZXIsCi0gICAgIGhhdmluZyB0aGUgcG9pbnRlciBwZXJtaXRzIGEgaGllcmFyY2h5IG9mIG1ldGhvZCBmdW5jdGlvbnMgdG8gYmUKLSAgICAgYnVpbHQgZWFjaCBvZiB3aGljaCBjYWxscyB0aGUgZnVuY3Rpb24gaW4gdGhlIHN1cGVyY2xhc3MuICBUaHVzCi0gICAgIGVhY2ggZnVuY3Rpb24gc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgb2YgbWVtb3J5Ci0gICAgIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIE5VTEwuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgICAgY29uc3QgY2hhciAqKSk7Ci0gICAvKiBBbiBvYmphbGxvYyBmb3IgdGhpcyBoYXNoIHRhYmxlLiAgVGhpcyBpcyBhIHN0cnVjdCBvYmphbGxvYyAqLAotICAgICBidXQgd2UgdXNlIFBUUiB0byBhdm9pZCByZXF1aXJpbmcgdGhlIGluY2x1c2lvbiBvZiBvYmphbGxvYy5oLiAgKi8KLSAgUFRSIG1lbW9yeTsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZSBzcGVjaWZ5aW5nIGEgc2l6ZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0X24KLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSwKLQkgICB1bnNpZ25lZCBpbnQgc2l6ZSkpOwotCi0vKiBGcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF90YWJsZV9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSk7Ci0KLS8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgSWYgQ1JFQVRFIGlzIHRydWUsIGEgbmV3IGVudHJ5Ci0gICB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgc3RyaW5nIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiAgVGhlCi0gICBDT1BZIGFyZ3VtZW50IG11c3QgYmUgdHJ1ZSBpZiB0aGlzIHJvdXRpbmUgc2hvdWxkIGNvcHkgdGhlIHN0cmluZwotICAgaW50byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IHdoZW4gYWRkaW5nIGFuIGVudHJ5LiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmJmZF9oYXNoX2xvb2t1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGNyZWF0ZSwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogUmVwbGFjZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfcmVwbGFjZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpvbGQsCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpudykpOwotCi0vKiBCYXNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmJmZF9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIGNvbnN0IGNoYXIgKikpOwotCi0vKiBHcmFiIHNvbWUgc3BhY2UgZm9yIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gUFRSIGJmZF9oYXNoX2FsbG9jYXRlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCkpOwotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUgaW4gYSByYW5kb20gb3JkZXIsIGNhbGxpbmcgYSBmdW5jdGlvbiBvbiBlYWNoCi0gICBlbGVtZW50LiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZSB0cmF2ZXJzYWwgc3RvcHMuICBUaGUKLSAgIElORk8gYXJndW1lbnQgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF90cmF2ZXJzZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgYm9vbGVhbiAoKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJICAgIFBUUiksCi0JCQkJICAgICAgIFBUUiBpbmZvKSk7Ci0MCi0vKiBTZW1pLXBvcnRhYmxlIHN0cmluZyBjb25jYXRlbmF0aW9uIGluIGNwcC4KLSAgIFRoZSBDQVQ0IGhhY2sgaXMgdG8gYXZvaWQgYSBwcm9ibGVtIHdpdGggc29tZSBzdHJpY3QgQU5TSSBDIHByZXByb2Nlc3NvcnMuCi0gICBUaGUgcHJvYmxlbSBpcywgIjMyXyIgaXMgbm90IGEgdmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbiwgYW5kIHdlIGRvbid0Ci0gICB3YW50IGV4dHJhIHVuZGVyc2NvcmVzIChlLmcuLCAibmxtXzMyXyIpLiAgVGhlIFhDQVQyIG1hY3JvIHdpbGwgY2F1c2UgdGhlCi0gICBpbm5lciBDQVQgbWFjcm9zIHRvIGJlIGV2YWx1YXRlZCBmaXJzdCwgcHJvZHVjaW5nIHN0aWxsLXZhbGlkIHBwLXRva2Vucy4KLSAgIFRoZW4gdGhlIGZpbmFsIGNvbmNhdGVuYXRpb24gY2FuIGJlIGRvbmUuICAoU2lnaC4pICAqLwotI2lmbmRlZiBDQVQKLSNpZmRlZiBTQUJFUgotI2RlZmluZSBDQVQoYSxiKQlhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpCWEjI2IjI2MKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlhIyNiIyNjIyNkCi0jZWxzZQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi0jZGVmaW5lIENBVChhLGIpIGEjI2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykgYSMjYiMjYwotI2RlZmluZSBYQ0FUMihhLGIpCUNBVChhLGIpCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJWENBVDIoQ0FUKGEsYiksQ0FUKGMsZCkpCi0jZWxzZQotI2RlZmluZSBDQVQoYSxiKSBhLyoqL2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykgYS8qKi9iLyoqL2MKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlhLyoqL2IvKiovYy8qKi9kCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9TV0FQX1RBQkxFIChQVFIpICZiZmRfY29mZl9zdGRfc3dhcF90YWJsZQotDAotLyogVXNlciBwcm9ncmFtIGFjY2VzcyB0byBCRkQgZmFjaWxpdGllcyAqLwotCi0vKiBEaXJlY3QgSS9PIHJvdXRpbmVzLCBmb3IgcHJvZ3JhbXMgd2hpY2gga25vdyBtb3JlIGFib3V0IHRoZSBvYmplY3QKLSAgIGZpbGUgdGhhbiBCRkQgZG9lcy4gIFVzZSBoaWdoZXIgbGV2ZWwgcm91dGluZXMgaWYgcG9zc2libGUuICAqLwotCi1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfcmVhZAotICBQQVJBTVMgKChQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3dyaXRlCi0gIFBBUkFNUyAoKGNvbnN0IFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9zZWVrIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmlsZV9wdHIgZnAsIGludCBkaXJlY3Rpb24pKTsKLWV4dGVybiBsb25nIGJmZF90ZWxsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfZmx1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9zdGF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHN0YXQgKikpOwotCi0KLS8qIENhc3QgZnJvbSBjb25zdCBjaGFyICogdG8gY2hhciAqIHNvIHRoYXQgY2FsbGVyIGNhbiBhc3NpZ24gdG8KLSAgIGEgY2hhciAqIHdpdGhvdXQgYSB3YXJuaW5nLiAgKi8KLSNkZWZpbmUgYmZkX2dldF9maWxlbmFtZShhYmZkKSAoKGNoYXIgKikgKGFiZmQpLT5maWxlbmFtZSkKLSNkZWZpbmUgYmZkX2dldF9jYWNoZWFibGUoYWJmZCkgKChhYmZkKS0+Y2FjaGVhYmxlKQotI2RlZmluZSBiZmRfZ2V0X2Zvcm1hdChhYmZkKSAoKGFiZmQpLT5mb3JtYXQpCi0jZGVmaW5lIGJmZF9nZXRfdGFyZ2V0KGFiZmQpICgoYWJmZCktPnh2ZWMtPm5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfZmxhdm91cihhYmZkKSAoKGFiZmQpLT54dmVjLT5mbGF2b3VyKQotI2RlZmluZSBiZmRfYmlnX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9saXR0bGVfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSNkZWZpbmUgYmZkX2hlYWRlcl9iaWdfZW5kaWFuKGFiZmQpIFwKLSAgKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKLSNkZWZpbmUgYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuKGFiZmQpIFwKLSAgKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSNkZWZpbmUgYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPmZsYWdzKQotI2RlZmluZSBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPm9iamVjdF9mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5zZWN0aW9uX2ZsYWdzKQotI2RlZmluZSBiZmRfbXlfYXJjaGl2ZShhYmZkKSAoKGFiZmQpLT5teV9hcmNoaXZlKQotI2RlZmluZSBiZmRfaGFzX21hcChhYmZkKSAoKGFiZmQpLT5oYXNfYXJtYXApCi0KLSNkZWZpbmUgYmZkX3ZhbGlkX3JlbG9jX3R5cGVzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnZhbGlkX3JlbG9jX3R5cGVzKQotI2RlZmluZSBiZmRfdXNyZGF0YShhYmZkKSAoKGFiZmQpLT51c3JkYXRhKQotCi0jZGVmaW5lIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyhhYmZkKSAoKGFiZmQpLT5zdGFydF9hZGRyZXNzKQotI2RlZmluZSBiZmRfZ2V0X3N5bWNvdW50KGFiZmQpICgoYWJmZCktPnN5bWNvdW50KQotI2RlZmluZSBiZmRfZ2V0X291dHN5bWJvbHMoYWJmZCkgKChhYmZkKS0+b3V0c3ltYm9scykKLSNkZWZpbmUgYmZkX2NvdW50X3NlY3Rpb25zKGFiZmQpICgoYWJmZCktPnNlY3Rpb25fY291bnQpCi0KLSNkZWZpbmUgYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKGFiZmQpICgoYWJmZCktPnh2ZWMtPnN5bWJvbF9sZWFkaW5nX2NoYXIpCi0KLSNkZWZpbmUgYmZkX3NldF9jYWNoZWFibGUoYWJmZCxib29sKSAoKChhYmZkKS0+Y2FjaGVhYmxlID0gKGJvb2xlYW4pKGJvb2wpKSwgdHJ1ZSkKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3JlY29yZF9waGRyCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLCBmbGFnd29yZCwgYm9vbGVhbiwgYmZkX3ZtYSwKLQkgICBib29sZWFuLCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBzZWMgKiopKTsKLQotLyogQnl0ZSBzd2FwcGluZyByb3V0aW5lcy4gICovCi0KLWJmZF92bWEJCWJmZF9nZXRiNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hIAliZmRfZ2V0bDY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzY0IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzY0IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMzIgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMzIgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0YjE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGwxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8xNiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8xNiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGwxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLQwKLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBFQ09GRiByb3V0aW5lcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2RlYnVnX2luZm87Ci1zdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcDsKLXN0cnVjdCBlY29mZl9leHRyOwotc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeTsKLXN0cnVjdCBiZmRfbGlua19pbmZvOwotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnk7Ci1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWU7Ci0jZW5kaWYKLWV4dGVybiBiZmRfdm1hIGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICogYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF92bWEgZ3BfdmFsdWUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfcmVnbWFza3MKLSAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBsb25nIGdwcm1hc2ssIHVuc2lnbmVkIGxvbmcgZnBybWFzaywKLQkgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrKSk7Ci1leHRlcm4gUFRSIGJmZF9lY29mZl9kZWJ1Z19pbml0Ci0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLQkgICBib29sZWFuICgqZ2V0X2V4dHIpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkJc3RydWN0IGVjb2ZmX2V4dHIgKiksCi0JICAgdm9pZCAoKnNldF9pbmRleCkgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLQkJCSAgICAgIGJmZF9zaXplX3R5cGUpKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBlY29mZl9leHRyICplc3ltKSk7Ci1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfZWNvZmZfZGVidWdfc2l6ZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLCBmaWxlX3B0ciB3aGVyZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBmaWxlX3B0ciB3aGVyZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqLCBzdHJ1Y3Qgc2VjICosCi0JICAgY2hhciAqKikpOwotCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUxGIHJvdXRpbmVzLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmV4dDsKLSAgYmZkICpieTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9lbGZfZ2V0X25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwKLQkgICBjb25zdCBjaGFyICogY29uc3QgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwKLQkgICBjb25zdCBjaGFyICogY29uc3QgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9lbGZfZ2V0X2R0X3NvbmFtZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIExpbnV4IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX202OGtsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zcGFyY2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBtbWFwIGhhY2tzICovCi0KLXN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbDsKLXR5cGVkZWYgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsIGJmZF93aW5kb3dfaW50ZXJuYWw7Ci0KLXR5cGVkZWYgc3RydWN0IF9iZmRfd2luZG93IHsKLSAgLyogV2hhdCB0aGUgdXNlciBhc2tlZCBmb3IuICAqLwotICBQVFIgZGF0YTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBUaGUgYWN0dWFsIHdpbmRvdyB1c2VkIGJ5IEJGRC4gIFNtYWxsIHVzZXItcmVxdWVzdGVkIHJlYWQtb25seQotICAgICByZWdpb25zIHNoYXJpbmcgYSBwYWdlIG1heSBzaGFyZSBhIHNpbmdsZSB3aW5kb3cgaW50byB0aGUgb2JqZWN0Ci0gICAgIGZpbGUuICBSZWFkLXdyaXRlIHZlcnNpb25zIHNob3VsZG4ndCB1bnRpbCBJJ3ZlIGZpeGVkIHRoaW5ncyB0bwotICAgICBrZWVwIHRyYWNrIG9mIHdoaWNoIHBvcnRpb25zIGhhdmUgYmVlbiBjbGFpbWVkIGJ5IHRoZQotICAgICBhcHBsaWNhdGlvbjsgZG9uJ3Qgd2FudCB0byBnaXZlIHRoZSBzYW1lIHJlZ2lvbiBiYWNrIHdoZW4gdGhlCi0gICAgIGFwcGxpY2F0aW9uIHdhbnRzIHR3byB3cml0YWJsZSBjb3BpZXMhICAqLwotICBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgKmk7Ci19IGJmZF93aW5kb3c7Ci0KLWV4dGVybiB2b2lkIGJmZF9pbml0X3dpbmRvdyBQQVJBTVMgKChiZmRfd2luZG93ICopKTsKLWV4dGVybiB2b2lkIGJmZF9mcmVlX3dpbmRvdyBQQVJBTVMgKChiZmRfd2luZG93ICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9nZXRfZmlsZV93aW5kb3cKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBiZmRfd2luZG93ICosIGJvb2xlYW4pKTsKLQotLyogWENPRkYgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3NpemVfdHlwZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwKLQkgICBpbnQsIGJvb2xlYW4sIGJvb2xlYW4sIHN0cnVjdCBzZWMgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIENPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQ7Ci11bmlvbiBpbnRlcm5hbF9hdXhlbnQ7Ci0jZW5kaWYKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfZ2V0X3N5bWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfZ2V0X2F1eGVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBpbnQsIHVuaW9uIGludGVybmFsX2F1eGVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljCi0jZW5kaWYKLWV4dGVybiBib29sZWFuIGJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEVMRiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICAgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLSAKLSAgZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotIAotICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZyb20gdGhlIHNvdXJjZS4gICovCmRpZmYgLS1naXQgYS9iZmQvYmZkLWluMi5oIGIvYmZkL2JmZC1pbjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjYWRhYi4uMDAwMDAwMAotLS0gYS9iZmQvYmZkLWluMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAyNCArMCwwIEBACi0vKiBNYWluIGhlYWRlciBmaWxlIGZvciB0aGUgYmZkIGxpYnJhcnkgLS0gcG9ydGFibGUgYWNjZXNzIHRvIG9iamVjdCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGJmZC5oIGFuZCBiZmQtaW4yLmggYXJlIEdFTkVSQVRFRCBmaWxlcy4gIERvbid0IGNoYW5nZSB0aGVtOwotKiogaW5zdGVhZCwgY2hhbmdlIGJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bwotKiogZ2VuZXJhdGUgdGhlc2UgZmlsZXMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogYmZkLmggLS0gVGhlIG9ubHkgaGVhZGVyIGZpbGUgcmVxdWlyZWQgYnkgdXNlcnMgb2YgdGhlIGJmZCBsaWJyYXJ5IAotCi1UaGUgYmZkLmggZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBiZmQtaW4uaCBhbmQgdmFyaW91cyAuYyBmaWxlczsgaWYgeW91Ci1jaGFuZ2UgaXQsIHlvdXIgY2hhbmdlcyB3aWxsIHByb2JhYmx5IGJlIGxvc3QuCi0KLUFsbCB0aGUgcHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9sbG93aW5nIHRoZSBjb21tZW50ICJUSEUgRk9MTE9XSU5HCi1JUyBFWFRSQUNURUQgRlJPTSBUSEUgU09VUkNFIiBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIHNvdXJjZSBmaWxlcyBmb3IKLUJGRC4gIElmIHlvdSBjaGFuZ2UgaXQsIHNvbWVvbmUgb25lZGF5IHdpbGwgZXh0cmFjdCBpdCBmcm9tIHRoZSBzb3VyY2UKLWFnYWluLCBhbmQgeW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4gIFRvIHNhdmUgeW91cnNlbGYgZnJvbSB0aGlzIGJpbmQsCi1jaGFuZ2UgdGhlIGRlZmluaXRpb25zIGluIHRoZSBzb3VyY2UgaW4gdGhlIGJmZCBkaXJlY3RvcnkuICBUeXBlICJtYWtlCi1kb2NzIiBhbmQgdGhlbiAibWFrZSBoZWFkZXJzIiBpbiB0aGF0IGRpcmVjdG9yeSwgYW5kIG1hZ2ljYWxseSB0aGlzIGZpbGUKLXdpbGwgY2hhbmdlIHRvIHJlZmxlY3QgeW91ciBjaGFuZ2VzLgotCi1JZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgdG9vbHMgdG8gcGVyZm9ybSB0aGUgZXh0cmFjdGlvbiwgdGhlbiB5b3UgYXJlCi1zYWZlIGZyb20gc29tZW9uZSBvbiB5b3VyIHN5c3RlbSB0cmFtcGxpbmcgb3ZlciB5b3VyIGhlYWRlciBmaWxlcy4KLVlvdSBzaG91bGQgc3RpbGwgbWFpbnRhaW4gdGhlIGVxdWl2YWxlbmNlIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGhpcwotZmlsZSB0aG91Z2g7IGV2ZXJ5IGNoYW5nZSB5b3UgbWFrZSB0byB0aGUgLmMgZmlsZSBzaG91bGQgYmUgcmVmbGVjdGVkCi1oZXJlLiAgKi8KLQotI2lmbmRlZiBfX0JGRF9IX1NFRU5fXwotI2RlZmluZSBfX0JGRF9IX1NFRU5fXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBUaGVzZSB0d28gbGluZXMgZ2V0IHN1YnN0aXR1dGlvbnMgZG9uZSBieSBjb21tYW5kcyBpbiBNYWtlZmlsZS5pbi4gICovCi0jZGVmaW5lIEJGRF9WRVJTSU9OICAiQFZFUlNJT05AIgotI2RlZmluZSBCRkRfQVJDSF9TSVpFIEB3b3Jkc2l6ZUAKLSNkZWZpbmUgQkZEX0hPU1RfNjRCSVRfTE9ORyBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLSNpZiBAQkZEX0hPU1RfNjRfQklUX0RFRklORURACi0jZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBAQkZEX0hPU1RfNjRfQklUQAotI2RlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCBAQkZEX0hPU1RfVV82NF9CSVRACi0jZW5kaWYKLQotI2lmIEJGRF9BUkNIX1NJWkUgPj0gNjQKLSNkZWZpbmUgQkZENjQKLSNlbmRpZgotCi0jaWZuZGVmIElOTElORQotI2lmIF9fR05VQ19fID49IDIKLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmCi0jZW5kaWYKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2JmZCBiZmQ7Ci0KLS8qIFRvIHNxdWVsY2ggZXJyb25lb3VzIGNvbXBpbGVyIHdhcm5pbmdzICgiaWxsZWdhbCBwb2ludGVyCi0gICBjb21iaW5hdGlvbiIpIGZyb20gdGhlIFNWUjMgY29tcGlsZXIsIHdlIHdvdWxkIGxpa2UgdG8gdHlwZWRlZgotICAgYm9vbGVhbiB0byBpbnQgKGl0IGRvZXNuJ3QgbGlrZSBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGJvb2xlYW4uCi0gICBNYWtpbmcgc3VyZSB0aGV5IGFyZSBuZXZlciBpbXBsaWNpdGx5IGRlY2xhcmVkIHRvIHJldHVybiBpbnQKLSAgIGRvZXNuJ3Qgc2VlbSB0byBoZWxwKS4gIEJ1dCB0aGlzIGZpbGUgaXMgbm90IGNvbmZpZ3VyZWQgYmFzZWQgb24KLSAgIHRoZSBob3N0LiAgKi8KLS8qIEdlbmVyYWwgcnVsZXM6IGZ1bmN0aW9ucyB3aGljaCBhcmUgYm9vbGVhbiByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCi0gICBhbmQgZmFsc2Ugb24gZmFpbHVyZSAodW5sZXNzIHRoZXkncmUgYSBwcmVkaWNhdGUpLiAgIC0tIGJmZC5kb2MgKi8KLS8qIEknbSBzdXJlIHRoaXMgaXMgZ29pbmcgdG8gYnJlYWsgc29tZXRoaW5nIGFuZCBzb21lb25lIGlzIGdvaW5nIHRvCi0gICBmb3JjZSBtZSB0byBjaGFuZ2UgaXQuICovCi0vKiB0eXBlZGVmIGVudW0gYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47ICovCi0vKiBZdXAsIFNWUjQgaGFzIGEgInR5cGVkZWYgZW51bSBib29sZWFuIiBpbiA8c3lzL3R5cGVzLmg+ICAtZm5mICovCi0vKiBJdCBnZXRzIHdvcnNlIGlmIHRoZSBob3N0IGFsc28gZGVmaW5lcyBhIHRydWUvZmFsc2UgZW51bS4uLiAtc3RzICovCi0vKiBBbmQgZXZlbiB3b3JzZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBidWlsdC1pbiBib29sZWFuIHR5cGVzLi4uIC1sYXcgKi8KLSNpZiBkZWZpbmVkIChfX0dOVUdfXykgJiYgKF9fR05VQ19NSU5PUl9fID4gNSkKLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZgotI2lmZGVmIE1QVwotLyogUHJlLWVtcHRpdmUgc3RyaWtlIC0gZ2V0IHRoZSBmaWxlIHdpdGggdGhlIGVudW0uICovCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZiAvKiBNUFcgKi8KLSNpZm5kZWYgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLXR5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47Ci0jZGVmaW5lIEJGRF9UUlVFX0ZBTFNFCi0jZWxzZQotLyogVXNlIGVudW0gbmFtZXMgdGhhdCB3aWxsIGFwcGVhciBub3doZXJlIGVsc2UuICAqLwotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtiZmRfZmZmYWxzZSwgYmZkX3R0dHJ1ZX0gYm9vbGVhbjsKLSNlbmRpZgotCi0vKiBBIHBvaW50ZXIgdG8gYSBwb3NpdGlvbiBpbiBhIGZpbGUuICAqLwotLyogRklYTUU6ICBUaGlzIHNob3VsZCBiZSB1c2luZyBvZmZfdCBmcm9tIDxzeXMvdHlwZXMuaD4uCi0gICBGb3Igbm93LCB0cnkgdG8gYXZvaWQgYnJlYWtpbmcgc3R1ZmYgYnkgbm90IGluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IGhlcmUuCi0gICBUaGlzIHdpbGwgYnJlYWsgb24gc3lzdGVtcyB3aXRoIDY0LWJpdCBmaWxlIG9mZnNldHMgKGUuZy4gNC40QlNEKS4KLSAgIFByb2JhYmx5IHRoZSBiZXN0IGxvbmctdGVybSBhbnN3ZXIgaXMgdG8gYXZvaWQgdXNpbmcgZmlsZV9wdHIgQU5EIG9mZl90IAotICAgaW4gdGhpcyBoZWFkZXIgZmlsZSwgYW5kIHRvIGhhbmRsZSB0aGlzIGluIHRoZSBCRkQgaW1wbGVtZW50YXRpb24KLSAgIHJhdGhlciB0aGFuIGluIGl0cyBpbnRlcmZhY2UuICAqLwotLyogdHlwZWRlZiBvZmZfdAlmaWxlX3B0cjsgKi8KLXR5cGVkZWYgbG9uZyBpbnQgZmlsZV9wdHI7Ci0KLS8qIFN1cHBvcnQgZm9yIGRpZmZlcmVudCBzaXplcyBvZiB0YXJnZXQgZm9ybWF0IGludHMgYW5kIGFkZHJlc3Nlcy4KLSAgIElmIHRoZSB0eXBlIGBsb25nJyBpcyBhdCBsZWFzdCA2NCBiaXRzLCBCRkRfSE9TVF82NEJJVF9MT05HIHdpbGwgYmUKLSAgIHNldCB0byAxIGFib3ZlLiAgT3RoZXJ3aXNlLCBpZiBnY2MgaXMgYmVpbmcgdXNlZCwgdGhpcyBjb2RlIHdpbGwKLSAgIHVzZSBnY2MncyAibG9uZyBsb25nIiB0eXBlLiAgT3RoZXJ3aXNlLCBCRkRfSE9TVF82NF9CSVQgbXVzdCBiZQotICAgZGVmaW5lZCBhYm92ZS4gICovCi0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0jIGlmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSMgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZwotIyAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcKLSMgZWxzZQotIyAgaWZkZWYgX19HTlVDX18KLSMgICBpZiBfX0dOVUNfXyA+PSAyCi0jICAgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZyBsb25nCi0jICAgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nIGxvbmcKLSMgICBlbmRpZiAvKiBfX0dOVUNfXyA+PSAyICovCi0jICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwotIyBlbmRpZiAvKiAhIEJGRF9IT1NUXzY0QklUX0xPTkcgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotI2lmZGVmIEJGRDY0Ci0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0gI2Vycm9yIE5vIDY0IGJpdCBpbnRlZ2VyIHR5cGUgYXZhaWxhYmxlCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCi0KLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3ZtYTsKLXR5cGVkZWYgQkZEX0hPU1RfNjRfQklUIGJmZF9zaWduZWRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfc2l6ZV90eXBlOwotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBzeW12YWx1ZTsKLQotI2lmbmRlZiBmcHJpbnRmX3ZtYQotI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkKLSNkZWZpbmUgZnByaW50Zl92bWEoZix4KSBmcHJpbnRmIChmLCAiJTAxNmx4IiwgeCkKLSNlbHNlCi0jZGVmaW5lIF9iZmRfaW50NjRfbG93KHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpCi0jZGVmaW5lIF9iZmRfaW50NjRfaGlnaCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKQotI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIFwKLSAgZnByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBcCi0gIHNwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCi0jZW5kaWYKLSNlbmRpZgotCi0jZWxzZSAvKiBub3QgQkZENjQgICovCi0KLS8qIFJlcHJlc2VudCBhIHRhcmdldCBhZGRyZXNzLiAgQWxzbyB1c2VkIGFzIGEgZ2VuZXJpYyB1bnNpZ25lZCB0eXBlCi0gICB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkgYXJpdGhtZXRpYyB0eXBlcwotICAgd2UgbmVlZCB0byBkZWFsIHdpdGguICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF92bWE7Ci0KLS8qIEEgZ2VuZXJpYyBzaWduZWQgdHlwZSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkKLSAgIGFyaXRobWV0aWMgdHlwZXMgd2UgbmVlZCB0byBkZWFsIHdpdGguICBDYW4gYmUgYXNzdW1lZCB0byBiZSBjb21wYXRpYmxlCi0gICB3aXRoIGJmZF92bWEgaW4gdGhlIHNhbWUgd2F5IHRoYXQgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRzIGFyZSBjb21wYXRpYmxlCi0gICAoYXMgcGFyYW1ldGVycywgaW4gYXNzaWdubWVudCwgZXRjKS4gICovCi10eXBlZGVmIGxvbmcgYmZkX3NpZ25lZF92bWE7Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW12YWx1ZTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfc2l6ZV90eXBlOwotCi0vKiBQcmludCBhIGJmZF92bWEgeCBvbiBzdHJlYW0gcy4gICovCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgZnByaW50ZihzLCAiJTA4bHgiLCB4KQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYocywgIiUwOGx4IiwgeCkKLQotI2VuZGlmIC8qIG5vdCBCRkQ2NCAgKi8KLQotI2RlZmluZSBwcmludGZfdm1hKHgpIGZwcmludGZfdm1hKHN0ZG91dCx4KQotCi10eXBlZGVmIHVuc2lnbmVkIGludCBmbGFnd29yZDsJLyogMzIgYml0cyBvZiBmbGFncyAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJmZF9ieXRlOwotDAotLyoqIEZpbGUgZm9ybWF0cyAqLwotCi10eXBlZGVmIGVudW0gYmZkX2Zvcm1hdCB7Ci0JICAgICAgYmZkX3Vua25vd24gPSAwLAkvKiBmaWxlIGZvcm1hdCBpcyB1bmtub3duICovCi0JICAgICAgYmZkX29iamVjdCwJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLwotCSAgICAgIGJmZF9hcmNoaXZlLAkvKiBvYmplY3QgYXJjaGl2ZSBmaWxlICovCi0JICAgICAgYmZkX2NvcmUsCQkvKiBjb3JlIGR1bXAgKi8KLQkgICAgICBiZmRfdHlwZV9lbmR9CS8qIG1hcmtzIHRoZSBlbmQ7IGRvbid0IHVzZSBpdCEgKi8KLSAgICAgICAgIGJmZF9mb3JtYXQ7Ci0KLS8qIFZhbHVlcyB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgQkZELiAgVGhlc2UgYWxzbwotICAgYXBwZWFyIGluIHRoZSBvYmplY3RfZmxhZ3MgZmllbGQgb2YgdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlLCB3aGVyZQotICAgdGhleSBpbmRpY2F0ZSB0aGUgc2V0IG9mIGZsYWdzIHVzZWQgYnkgdGhhdCBiYWNrZW5kIChub3QgYWxsIGZsYWdzCi0gICBhcmUgbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMpIChGSVhNRTogYXQgdGhlIG1vbWVudCwKLSAgIHRoZSBvYmplY3RfZmxhZ3MgdmFsdWVzIGhhdmUgbW9zdGx5IGp1c3QgYmVlbiBjb3BpZWQgZnJvbSBiYWNrZW5kCi0gICB0byBhbm90aGVyLCBhbmQgYXJlIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0KS4gICovCi0KLS8qIE5vIGZsYWdzLiAgKi8KLSNkZWZpbmUgQkZEX05PX0ZMQUdTICAgCTB4MDAKLQotLyogQkZEIGNvbnRhaW5zIHJlbG9jYXRpb24gZW50cmllcy4gICovCi0jZGVmaW5lIEhBU19SRUxPQyAgIAkweDAxCi0KLS8qIEJGRCBpcyBkaXJlY3RseSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgRVhFQ19QICAgICAgCTB4MDIKLQotLyogQkZEIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTE5OTyBpbiBhCi0gICBDT0ZGIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTElORU5PICAJMHgwNAotCi0vKiBCRkQgaGFzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEhBU19ERUJVRyAgIAkweDA4Ci0KLS8qIEJGRCBoYXMgc3ltYm9scy4gICovCi0jZGVmaW5lIEhBU19TWU1TICAgIAkweDEwCi0KLS8qIEJGRCBoYXMgbG9jYWwgc3ltYm9scyAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTFNZTVMgaW4gYSBDT0ZGCi0gICBoZWFkZXIpLiAgKi8KLSNkZWZpbmUgSEFTX0xPQ0FMUyAgCTB4MjAKLQotLyogQkZEIGlzIGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBEWU5BTUlDICAgICAJMHg0MAotCi0vKiBUZXh0IHNlY3Rpb24gaXMgd3JpdGUgcHJvdGVjdGVkIChpZiBEX1BBR0VEIGlzIG5vdCBzZXQsIHRoaXMgaXMKLSAgIGxpa2UgYW4gYS5vdXQgTk1BR0lDIGZpbGUpICh0aGUgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQKLSAgIGNsZWFycyBpdCBmb3IgLXIgb3IgLU4pLiAgKi8KLSNkZWZpbmUgV1BfVEVYVCAgICAgCTB4ODAKLQotLyogQkZEIGlzIGR5bmFtaWNhbGx5IHBhZ2VkICh0aGlzIGlzIGxpa2UgYW4gYS5vdXQgWk1BR0lDIGZpbGUpICh0aGUKLSAgIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0IGNsZWFycyBpdCBmb3IgLXIgb3IgLW4gb3IgLU4pLiAgKi8KLSNkZWZpbmUgRF9QQUdFRCAgICAgCTB4MTAwCi0KLS8qIEJGRCBpcyByZWxheGFibGUgKHRoaXMgbWVhbnMgdGhhdCBiZmRfcmVsYXhfc2VjdGlvbiBtYXkgYmUgYWJsZSB0bwotICAgZG8gc29tZXRoaW5nKSAoc29tZXRpbWVzIGJmZF9yZWxheF9zZWN0aW9uIGNhbiBkbyBzb21ldGhpbmcgZXZlbiBpZgotICAgdGhpcyBpcyBub3Qgc2V0KS4gICovCi0jZGVmaW5lIEJGRF9JU19SRUxBWEFCTEUgMHgyMDAKLQotLyogVGhpcyBtYXkgYmUgc2V0IGJlZm9yZSB3cml0aW5nIG91dCBhIEJGRCB0byByZXF1ZXN0IHVzaW5nIGEKLSAgIHRyYWRpdGlvbmFsIGZvcm1hdC4gIEZvciBleGFtcGxlLCB0aGlzIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGF0IHdoZW4KLSAgIHdyaXRpbmcgb3V0IGFuIGEub3V0IG9iamVjdCB0aGUgc3ltYm9scyBub3QgYmUgaGFzaGVkIHRvIGVsaW1pbmF0ZQotICAgZHVwbGljYXRlcy4gICovCi0jZGVmaW5lIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgMHg0MDAKLQotLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBCRkQgY29udGVudHMgYXJlIGFjdHVhbGx5IGNhY2hlZCBpbgotICAgbWVtb3J5LiAgSWYgdGhpcyBpcyBzZXQsIGlvc3RyZWFtIHBvaW50cyB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKi8KLSNkZWZpbmUgQkZEX0lOX01FTU9SWSAweDgwMAotDAotLyogc3ltYm9scyBhbmQgcmVsb2NhdGlvbiAqLwotCi0vKiBBIGNvdW50IG9mIGNhcnN5bXMgKGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbHMpLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbmRleDsKLQotLyogSG93IHRvIHBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KLXR5cGVkZWYgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCByZWxvY19ob3d0b190eXBlOwotCi0jZGVmaW5lIEJGRF9OT19NT1JFX1NZTUJPTFMgKChzeW1pbmRleCkgfjApCi0KLS8qIEdlbmVyYWwgcHVycG9zZSBwYXJ0IG9mIGEgc3ltYm9sIFg7Ci0gICB0YXJnZXQgc3BlY2lmaWMgcGFydHMgYXJlIGluIGxpYmNvZmYuaCwgbGliYW91dC5oLCBldGMuICAqLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uKQotI2RlZmluZSBiZmRfZ2V0X291dHB1dF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb24oeCx5KSAoKHgpLT5zZWN0aW9uKSA9ICh5KQotI2RlZmluZSBiZmRfYXN5bWJvbF9iYXNlKHgpICgoeCktPnNlY3Rpb24tPnZtYSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfdmFsdWUoeCkgKGJmZF9hc3ltYm9sX2Jhc2UoeCkgKyAoeCktPnZhbHVlKQotI2RlZmluZSBiZmRfYXN5bWJvbF9uYW1lKHgpICgoeCktPm5hbWUpCi0vKlBlcmhhcHMgZnV0dXJlOiAjZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT5zZWN0aW9uLT5vd25lcikqLwotI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+dGhlX2JmZCkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfZmxhdm91cih4KSAoYmZkX2FzeW1ib2xfYmZkKHgpLT54dmVjLT5mbGF2b3VyKQotCi0vKiBBIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbC4gICovCi0vKiBUaGlzIGlzIGEgdHlwZSBwdW4gd2l0aCBzdHJ1Y3QgcmFubGliIG9uIHB1cnBvc2UhICovCi10eXBlZGVmIHN0cnVjdCBjYXJzeW0gewotICBjaGFyICpuYW1lOwotICBmaWxlX3B0ciBmaWxlX29mZnNldDsJCS8qIGxvb2sgaGVyZSB0byBmaW5kIHRoZSBmaWxlICovCi19IGNhcnN5bTsJCQkvKiB0byBtYWtlIHRoZXNlIHlvdSBjYWxsIGEgY2Fyc3ltb2dlbiAqLwotCi0gIAotLyogVXNlZCBpbiBnZW5lcmF0aW5nIGFybWFwcyAoYXJjaGl2ZSB0YWJsZXMgb2YgY29udGVudHMpLgotICAgUGVyaGFwcyBqdXN0IGEgZm9yd2FyZCBkZWZpbml0aW9uIHdvdWxkIGRvPyAqLwotc3RydWN0IG9ybCB7CQkJLyogb3V0cHV0IHJhbmxpYiAqLwotICBjaGFyICoqbmFtZTsJCQkvKiBzeW1ib2wgbmFtZSAqLyAKLSAgZmlsZV9wdHIgcG9zOwkJCS8qIGJmZCogb3IgZmlsZSBwb3NpdGlvbiAqLwotICBpbnQgbmFtaWR4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlICovCi19OwotDAotCi0vKiBMaW5lbnVtYmVyIHN0dWZmICovCi10eXBlZGVmIHN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgewotICB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXI7CS8qIExpbmVudW1iZXIgZnJvbSBzdGFydCBvZiBmdW5jdGlvbiovICAKLSAgdW5pb24gewotICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bTsgLyogRnVuY3Rpb24gbmFtZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBPZmZzZXQgaW50byBzZWN0aW9uICovCi0gIH0gdTsKLX0gYWxlbnQ7Ci0MCi0vKiBvYmplY3QgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0jZGVmaW5lCWFsaWduX3Bvd2VyKGFkZHIsIGFsaWduKQlcCi0JKCAoKGFkZHIpICsgKCgxPDwoYWxpZ24pKS0xKSkgJiAoLTEgPDwgKGFsaWduKSkpCi0KLXR5cGVkZWYgc3RydWN0IHNlYyAqc2VjX3B0cjsKLQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlciArIDApCi0jZGVmaW5lIGJmZF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fc2l6ZShiZmQsIHB0cikgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhwdHIpKQotI2RlZmluZSBiZmRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hKQotI2RlZmluZSBiZmRfc2VjdGlvbl9sbWEoYmZkLCBwdHIpICgocHRyKS0+bG1hKQotI2RlZmluZSBiZmRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYmZkLCBwdHIpICgocHRyKS0+ZmxhZ3MgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIpICgocHRyKS0+dXNlcmRhdGEpCi0KLSNkZWZpbmUgYmZkX2lzX2NvbV9zZWN0aW9uKHB0cikgKCgocHRyKS0+ZmxhZ3MgJiBTRUNfSVNfQ09NTU9OKSAhPSAwKQotCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dm1hID0gKHB0ciktPmxtYT0gKHZhbCkpLCAoKHB0ciktPnVzZXJfc2V0X3ZtYSA9IChib29sZWFuKXRydWUpLCB0cnVlKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPmFsaWdubWVudF9wb3dlciA9ICh2YWwpKSx0cnVlKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dXNlcmRhdGEgPSAodmFsKSksdHJ1ZSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc3RhdCBzdGF0X3R5cGU7IAotDAotdHlwZWRlZiBlbnVtIGJmZF9wcmludF9zeW1ib2wKLXsgCi0gIGJmZF9wcmludF9zeW1ib2xfbmFtZSwKLSAgYmZkX3ByaW50X3N5bWJvbF9tb3JlLAotICBiZmRfcHJpbnRfc3ltYm9sX2FsbAotfSBiZmRfcHJpbnRfc3ltYm9sX3R5cGU7Ci0gICAgCi0vKiBJbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbCB0aGF0IG5tIG5lZWRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3N5bWJvbF9pbmZvCi17Ci0gIHN5bXZhbHVlIHZhbHVlOwotICBjaGFyIHR5cGU7Ci0gIENPTlNUIGNoYXIgKm5hbWU7ICAgICAgICAgICAgLyogU3ltYm9sIG5hbWUuICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YWJfdHlwZTsgICAgIC8qIFN0YWIgdHlwZS4gICovCi0gIGNoYXIgc3RhYl9vdGhlcjsgICAgICAgICAgICAgLyogU3RhYiBvdGhlci4gKi8KLSAgc2hvcnQgc3RhYl9kZXNjOyAgICAgICAgICAgICAvKiBTdGFiIGRlc2MuICAqLwotICBDT05TVCBjaGFyICpzdGFiX25hbWU7ICAgICAgIC8qIFN0cmluZyBmb3Igc3RhYiB0eXBlLiAgKi8KLX0gc3ltYm9sX2luZm87Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIHN0YWJzIHR5cGUgY29kZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZ2V0X3N0YWJfbmFtZSBQQVJBTVMgKChpbnQpKTsKLQwKLS8qIEhhc2ggdGFibGUgcm91dGluZXMuICBUaGVyZSBpcyBubyB3YXkgdG8gZnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotCi0vKiBBbiBlbGVtZW50IGluIHRoZSBoYXNoIHRhYmxlLiAgTW9zdCB1c2VzIHdpbGwgYWN0dWFsbHkgdXNlIGEgbGFyZ2VyCi0gICBzdHJ1Y3R1cmUsIGFuZCBhbiBpbnN0YW5jZSBvZiB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5Ci17Ci0gIC8qIE5leHQgZW50cnkgZm9yIHRoaXMgaGFzaCBjb2RlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpuZXh0OwotICAvKiBTdHJpbmcgYmVpbmcgaGFzaGVkLiAgKi8KLSAgY29uc3QgY2hhciAqc3RyaW5nOwotICAvKiBIYXNoIGNvZGUuICBUaGlzIGlzIHRoZSBmdWxsIGhhc2ggY29kZSwgbm90IHRoZSBpbmRleCBpbnRvIHRoZQotICAgICB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLX07Ci0KLS8qIEEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF90YWJsZQotewotICAvKiBUaGUgaGFzaCBhcnJheS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKnRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgbmV3IGVsZW1lbnRzIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlCi0gICAgIGZpcnN0IGVudHJ5IGlzIGl0c2VsZiBhIHBvaW50ZXIgdG8gYW4gZWxlbWVudC4gIFdoZW4gdGhpcwotICAgICBmdW5jdGlvbiBpcyBmaXJzdCBpbnZva2VkLCB0aGlzIHBvaW50ZXIgd2lsbCBiZSBOVUxMLiAgSG93ZXZlciwKLSAgICAgaGF2aW5nIHRoZSBwb2ludGVyIHBlcm1pdHMgYSBoaWVyYXJjaHkgb2YgbWV0aG9kIGZ1bmN0aW9ucyB0byBiZQotICAgICBidWlsdCBlYWNoIG9mIHdoaWNoIGNhbGxzIHRoZSBmdW5jdGlvbiBpbiB0aGUgc3VwZXJjbGFzcy4gIFRodXMKLSAgICAgZWFjaCBmdW5jdGlvbiBzaG91bGQgYmUgd3JpdHRlbiB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBvZiBtZW1vcnkKLSAgICAgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgTlVMTC4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJICAgICBjb25zdCBjaGFyICopKTsKLSAgIC8qIEFuIG9iamFsbG9jIGZvciB0aGlzIGhhc2ggdGFibGUuICBUaGlzIGlzIGEgc3RydWN0IG9iamFsbG9jICosCi0gICAgIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mIG9iamFsbG9jLmguICAqLwotICBQVFIgbWVtb3J5OwotfTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIHNwZWNpZnlpbmcgYSBzaXplLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXRfbgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopLAotCSAgIHVuc2lnbmVkIGludCBzaXplKSk7Ci0KLS8qIEZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3RhYmxlX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopKTsKLQotLyogTG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUuICBJZiBDUkVBVEUgaXMgdHJ1ZSwgYSBuZXcgZW50cnkKLSAgIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBzdHJpbmcgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuICBUaGUKLSAgIENPUFkgYXJndW1lbnQgbXVzdCBiZSB0cnVlIGlmIHRoaXMgcm91dGluZSBzaG91bGQgY29weSB0aGUgc3RyaW5nCi0gICBpbnRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgd2hlbiBhZGRpbmcgYW4gZW50cnkuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY3JlYXRlLAotCSAgIGJvb2xlYW4gY29weSkpOwotCi0vKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF9yZXBsYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm9sZCwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm53KSk7Ci0KLS8qIEJhc2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdyYWIgc29tZSBzcGFjZSBmb3IgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLWV4dGVybiBQVFIgYmZkX2hhc2hfYWxsb2NhdGUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgdW5zaWduZWQgaW50KSk7Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZSBpbiBhIHJhbmRvbSBvcmRlciwgY2FsbGluZyBhIGZ1bmN0aW9uIG9uIGVhY2gKLSAgIGVsZW1lbnQuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHRyYXZlcnNhbCBzdG9wcy4gIFRoZQotICAgSU5GTyBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3RyYXZlcnNlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBib29sZWFuICgqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQkgICAgUFRSKSwKLQkJCQkgICAgICAgUFRSIGluZm8pKTsKLQwKLS8qIFNlbWktcG9ydGFibGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gaW4gY3BwLgotICAgVGhlIENBVDQgaGFjayBpcyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBzb21lIHN0cmljdCBBTlNJIEMgcHJlcHJvY2Vzc29ycy4KLSAgIFRoZSBwcm9ibGVtIGlzLCAiMzJfIiBpcyBub3QgYSB2YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuLCBhbmQgd2UgZG9uJ3QKLSAgIHdhbnQgZXh0cmEgdW5kZXJzY29yZXMgKGUuZy4sICJubG1fMzJfIikuICBUaGUgWENBVDIgbWFjcm8gd2lsbCBjYXVzZSB0aGUKLSAgIGlubmVyIENBVCBtYWNyb3MgdG8gYmUgZXZhbHVhdGVkIGZpcnN0LCBwcm9kdWNpbmcgc3RpbGwtdmFsaWQgcHAtdG9rZW5zLgotICAgVGhlbiB0aGUgZmluYWwgY29uY2F0ZW5hdGlvbiBjYW4gYmUgZG9uZS4gIChTaWdoLikgICovCi0jaWZuZGVmIENBVAotI2lmZGVmIFNBQkVSCi0jZGVmaW5lIENBVChhLGIpCWEjI2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykJYSMjYiMjYwotI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEjI2IjI2MjI2QKLSNlbHNlCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLSNkZWZpbmUgQ0FUKGEsYikgYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKSBhIyNiIyNjCi0jZGVmaW5lIFhDQVQyKGEsYikJQ0FUKGEsYikKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlYQ0FUMihDQVQoYSxiKSxDQVQoYyxkKSkKLSNlbHNlCi0jZGVmaW5lIENBVChhLGIpIGEvKiovYgotI2RlZmluZSBDQVQzKGEsYixjKSBhLyoqL2IvKiovYwotI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEvKiovYi8qKi9jLyoqL2QKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1NXQVBfVEFCTEUgKFBUUikgJmJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlCi0MCi0vKiBVc2VyIHByb2dyYW0gYWNjZXNzIHRvIEJGRCBmYWNpbGl0aWVzICovCi0KLS8qIERpcmVjdCBJL08gcm91dGluZXMsIGZvciBwcm9ncmFtcyB3aGljaCBrbm93IG1vcmUgYWJvdXQgdGhlIG9iamVjdAotICAgZmlsZSB0aGFuIEJGRCBkb2VzLiAgVXNlIGhpZ2hlciBsZXZlbCByb3V0aW5lcyBpZiBwb3NzaWJsZS4gICovCi0KLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9yZWFkCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7Ci1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfd3JpdGUKLSAgUEFSQU1TICgoY29uc3QgUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX3NlZWsgUEFSQU1TICgoYmZkICphYmZkLCBmaWxlX3B0ciBmcCwgaW50IGRpcmVjdGlvbikpOwotZXh0ZXJuIGxvbmcgYmZkX3RlbGwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9mbHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX3N0YXQgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLQotLyogQ2FzdCBmcm9tIGNvbnN0IGNoYXIgKiB0byBjaGFyICogc28gdGhhdCBjYWxsZXIgY2FuIGFzc2lnbiB0bwotICAgYSBjaGFyICogd2l0aG91dCBhIHdhcm5pbmcuICAqLwotI2RlZmluZSBiZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpICgoY2hhciAqKSAoYWJmZCktPmZpbGVuYW1lKQotI2RlZmluZSBiZmRfZ2V0X2NhY2hlYWJsZShhYmZkKSAoKGFiZmQpLT5jYWNoZWFibGUpCi0jZGVmaW5lIGJmZF9nZXRfZm9ybWF0KGFiZmQpICgoYWJmZCktPmZvcm1hdCkKLSNkZWZpbmUgYmZkX2dldF90YXJnZXQoYWJmZCkgKChhYmZkKS0+eHZlYy0+bmFtZSkKLSNkZWZpbmUgYmZkX2dldF9mbGF2b3VyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmZsYXZvdXIpCi0jZGVmaW5lIGJmZF9iaWdfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKLSNkZWZpbmUgYmZkX2xpdHRsZV9lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQotI2RlZmluZSBiZmRfaGVhZGVyX2JpZ19lbmRpYW4oYWJmZCkgXAotICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4oYWJmZCkgXAotICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQotI2RlZmluZSBiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+ZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+b2JqZWN0X2ZsYWdzKQotI2RlZmluZSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnNlY3Rpb25fZmxhZ3MpCi0jZGVmaW5lIGJmZF9teV9hcmNoaXZlKGFiZmQpICgoYWJmZCktPm15X2FyY2hpdmUpCi0jZGVmaW5lIGJmZF9oYXNfbWFwKGFiZmQpICgoYWJmZCktPmhhc19hcm1hcCkKLQotI2RlZmluZSBiZmRfdmFsaWRfcmVsb2NfdHlwZXMoYWJmZCkgKChhYmZkKS0+eHZlYy0+dmFsaWRfcmVsb2NfdHlwZXMpCi0jZGVmaW5lIGJmZF91c3JkYXRhKGFiZmQpICgoYWJmZCktPnVzcmRhdGEpCi0KLSNkZWZpbmUgYmZkX2dldF9zdGFydF9hZGRyZXNzKGFiZmQpICgoYWJmZCktPnN0YXJ0X2FkZHJlc3MpCi0jZGVmaW5lIGJmZF9nZXRfc3ltY291bnQoYWJmZCkgKChhYmZkKS0+c3ltY291bnQpCi0jZGVmaW5lIGJmZF9nZXRfb3V0c3ltYm9scyhhYmZkKSAoKGFiZmQpLT5vdXRzeW1ib2xzKQotI2RlZmluZSBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCkgKChhYmZkKS0+c2VjdGlvbl9jb3VudCkKLQotI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+c3ltYm9sX2xlYWRpbmdfY2hhcikKLQotI2RlZmluZSBiZmRfc2V0X2NhY2hlYWJsZShhYmZkLGJvb2wpICgoKGFiZmQpLT5jYWNoZWFibGUgPSAoYm9vbGVhbikoYm9vbCkpLCB0cnVlKQotCi1leHRlcm4gYm9vbGVhbiBiZmRfcmVjb3JkX3BoZHIKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sIGZsYWd3b3JkLCBib29sZWFuLCBiZmRfdm1hLAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBCeXRlIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLQotYmZkX3ZtYQkJYmZkX2dldGI2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEgCWJmZF9nZXRsNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0YjMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGwzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGI2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGwzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotDAotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbzsKLXN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwOwotc3RydWN0IGVjb2ZmX2V4dHI7Ci1zdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Owotc3RydWN0IGJmZF9saW5rX2luZm87Ci1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeTsKLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZTsKLSNlbmRpZgotZXh0ZXJuIGJmZF92bWEgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSBncF92YWx1ZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgZ3BybWFzaywgdW5zaWduZWQgbG9uZyBmcHJtYXNrLAotCSAgIHVuc2lnbmVkIGxvbmcgKmNwcm1hc2spKTsKLWV4dGVybiBQVFIgYmZkX2Vjb2ZmX2RlYnVnX2luaXQKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWNvZmZfZGVidWdfZnJlZQotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgYmZkICppbnB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcgotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLCBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotCSAgIGJvb2xlYW4gKCpnZXRfZXh0cikgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLQkJCQlzdHJ1Y3QgZWNvZmZfZXh0ciAqKSwKLQkgICB2b2lkICgqc2V0X2luZGV4KSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJICAgICAgYmZkX3NpemVfdHlwZSkpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGVjb2ZmX2V4dHIgKmVzeW0pKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9lY29mZl9kZWJ1Z19zaXplCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfZGVidWcKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsIGZpbGVfcHRyIHdoZXJlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGZpbGVfcHRyIHdoZXJlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICosIHN0cnVjdCBzZWMgKiwKLQkgICBjaGFyICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBFTEYgcm91dGluZXMuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZXh0OwotICBiZmQgKmJ5OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqYmZkX2VsZl9nZXRfZHRfc29uYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBzZWMgKiopKTsKLQotLyogTGludXggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBib29sZWFuIGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIG1tYXAgaGFja3MgKi8KLQotc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsOwotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgYmZkX3dpbmRvd19pbnRlcm5hbDsKLQotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3cgewotICAvKiBXaGF0IHRoZSB1c2VyIGFza2VkIGZvci4gICovCi0gIFBUUiBkYXRhOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIFRoZSBhY3R1YWwgd2luZG93IHVzZWQgYnkgQkZELiAgU21hbGwgdXNlci1yZXF1ZXN0ZWQgcmVhZC1vbmx5Ci0gICAgIHJlZ2lvbnMgc2hhcmluZyBhIHBhZ2UgbWF5IHNoYXJlIGEgc2luZ2xlIHdpbmRvdyBpbnRvIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFJlYWQtd3JpdGUgdmVyc2lvbnMgc2hvdWxkbid0IHVudGlsIEkndmUgZml4ZWQgdGhpbmdzIHRvCi0gICAgIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydGlvbnMgaGF2ZSBiZWVuIGNsYWltZWQgYnkgdGhlCi0gICAgIGFwcGxpY2F0aW9uOyBkb24ndCB3YW50IHRvIGdpdmUgdGhlIHNhbWUgcmVnaW9uIGJhY2sgd2hlbiB0aGUKLSAgICAgYXBwbGljYXRpb24gd2FudHMgdHdvIHdyaXRhYmxlIGNvcGllcyEgICovCi0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqaTsKLX0gYmZkX3dpbmRvdzsKLQotZXh0ZXJuIHZvaWQgYmZkX2luaXRfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2ZyZWVfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dldF9maWxlX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJmZF93aW5kb3cgKiwgYm9vbGVhbikpOwotCi0vKiBYQ09GRiBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLAotCSAgIGludCwgYm9vbGVhbiwgYm9vbGVhbiwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgQ09GRiByb3V0aW5lcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGludGVybmFsX3N5bWVudDsKLXVuaW9uIGludGVybmFsX2F1eGVudDsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfc3ltZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfYXV4ZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIGludCwgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogRUxGIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi0gIGV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotIAotICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7Ci0gCi0gIGV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgZnJvbSB0aGUgc291cmNlLiAgKi8KLXZvaWQgCi1iZmRfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCkpOwotCi1iZmQgKgotYmZkX2Zkb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCwgaW50IGZkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnN0cmVhbXIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFBUUikpOwotCi1iZmQgKgotYmZkX29wZW53IFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZV9hbGxfZG9uZSBQQVJBTVMgKChiZmQgKikpOwotCi1iZmQgKgotYmZkX2NyZWF0ZSBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgYmZkICp0ZW1wbCkpOwotCi1ib29sZWFuIAotYmZkX21ha2Vfd3JpdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfbWFrZV9yZWFkYWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKi8KLQotI2RlZmluZSBiZmRfcHV0XzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICAoKigodW5zaWduZWQgY2hhciAqKShwdHIpKSA9ICh1bnNpZ25lZCBjaGFyKSh2YWwpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF84IFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOAotI2RlZmluZSBiZmRfZ2V0XzgoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgKCgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSBeIDB4ODApIC0gMHg4MCkKLQotI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgxNiwgKCh2YWwpLChwdHIpKSkKLSNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMTYgXAotICAgICAgICAgICAgICAgIGJmZF9wdXRfMTYKLSNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDE2LCAocHRyKSkKLSNkZWZpbmUgYmZkX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQgKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MzIsICgodmFsKSwocHRyKSkpCi0jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzMyIFwKLSAgICAgICAgICAgICAgICBiZmRfcHV0XzMyCi0jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgzMiwgKHB0cikpCi0jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzMyKGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4NjQsICgodmFsKSwgKHB0cikpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0gICAgICAgICAgICAgICAgYmZkX3B1dF82NAotI2RlZmluZSBiZmRfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4NjQsIChwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotCi0KLSAvKiBCeXRlIHN3YXBwaW5nIG1hY3JvcyBmb3IgZmlsZSBoZWFkZXIgZGF0YS4gICovCi0KLSNkZWZpbmUgYmZkX2hfcHV0XzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCi0jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfOChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLSNkZWZpbmUgYmZkX2hfZ2V0XzgoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICBiZmRfZ2V0XzggKGFiZmQsIHB0cikKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgYmZkX2dldF9zaWduZWRfOCAoYWJmZCwgcHRyKQotCi0jZGVmaW5lIGJmZF9oX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHgxNiwodmFsLHB0cikpCi0jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfMTYgXAotICAgICAgICAgICAgICAgIGJmZF9oX3B1dF8xNgotI2RlZmluZSBiZmRfaF9nZXRfMTYoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDE2LChwdHIpKQotI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzE2LCAocHRyKSkKLQotI2RlZmluZSBiZmRfaF9wdXRfMzIoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MzIsKHZhbCxwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzMyIFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgYmZkX2hfZ2V0XzMyKGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgzMiwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX2hfcHV0XzY0KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDY0LCh2YWwsIHB0cikpCi0jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfNjQgXAotICAgICAgICAgICAgICAgIGJmZF9oX3B1dF82NAotI2RlZmluZSBiZmRfaF9nZXRfNjQoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDY0LChwdHIpKQotI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzY0LCAocHRyKSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VjCi17Ci0gICAgICAgICAvKiBUaGUgbmFtZSBvZiB0aGUgc2VjdGlvbjsgdGhlIG5hbWUgaXNuJ3QgYSBjb3B5LCB0aGUgcG9pbnRlciBpcwotICAgICAgICB0aGUgc2FtZSBhcyB0aGF0IHBhc3NlZCB0byBiZmRfbWFrZV9zZWN0aW9uLiAqLwotCi0gICAgQ09OU1QgY2hhciAqbmFtZTsKLQotICAgICAgICAgLyogV2hpY2ggc2VjdGlvbiBpcyBpdDsgMC4ubnRoLiAgICAgICovCi0KLSAgIGludCBpbmRleDsKLQotICAgICAgICAgLyogVGhlIG5leHQgc2VjdGlvbiBpbiB0aGUgbGlzdCBiZWxvbmdpbmcgdG8gdGhlIEJGRCwgb3IgTlVMTC4gKi8KLQotICAgIHN0cnVjdCBzZWMgKm5leHQ7Ci0KLSAgICAgICAgIC8qIFRoZSBmaWVsZCBmbGFncyBjb250YWlucyBhdHRyaWJ1dGVzIG9mIHRoZSBzZWN0aW9uLiBTb21lCi0gICAgICAgICAgIGZsYWdzIGFyZSByZWFkIGluIGZyb20gdGhlIG9iamVjdCBmaWxlLCBhbmQgc29tZSBhcmUKLSAgICAgICAgICAgc3ludGhlc2l6ZWQgZnJvbSBvdGhlciBpbmZvcm1hdGlvbi4gICovCi0KLSAgICBmbGFnd29yZCBmbGFnczsKLQotI2RlZmluZSBTRUNfTk9fRkxBR1MgICAweDAwMAotCi0gICAgICAgICAvKiBUZWxscyB0aGUgT1MgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgc2VjdGlvbiB3aGVuIGxvYWRpbmcuCi0gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgc2VjdGlvbiBjb250YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uCi0gICAgICAgICAgIG9ubHkuICovCi0jZGVmaW5lIFNFQ19BTExPQyAgICAgIDB4MDAxCi0KLSAgICAgICAgIC8qIFRlbGxzIHRoZSBPUyB0byBsb2FkIHRoZSBzZWN0aW9uIGZyb20gdGhlIGZpbGUgd2hlbiBsb2FkaW5nLgotICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIC5ic3Mgc2VjdGlvbi4gKi8KLSNkZWZpbmUgU0VDX0xPQUQgICAgICAgMHgwMDIKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBzdGlsbCB0byBiZSByZWxvY2F0ZWQsIHNvIHRoZXJlIGlzCi0gICAgICAgICAgIHNvbWUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0b28uICovCi0jZGVmaW5lIFNFQ19SRUxPQyAgICAgIDB4MDA0Ci0KLSNpZiAwICAgIC8qIE9ic29sZXRlID8gKi8KLSNkZWZpbmUgU0VDX0JBTElHTiAgICAgMHgwMDgKLSNlbmRpZgotCi0gICAgICAgICAvKiBBIHNpZ25hbCB0byB0aGUgT1MgdGhhdCB0aGUgc2VjdGlvbiBjb250YWlucyByZWFkIG9ubHkKLSAgICAgICAgICBkYXRhLiAqLwotI2RlZmluZSBTRUNfUkVBRE9OTFkgICAweDAxMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBjb2RlIG9ubHkuICovCi0jZGVmaW5lIFNFQ19DT0RFICAgICAgIDB4MDIwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgb25seS4gKi8KLSNkZWZpbmUgU0VDX0RBVEEgICAgICAgMHgwNDAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gd2lsbCByZXNpZGUgaW4gUk9NLiAqLwotI2RlZmluZSBTRUNfUk9NICAgICAgICAweDA4MAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBjb25zdHJ1Y3RvciBpbmZvcm1hdGlvbi4gVGhpcyBzZWN0aW9uCi0gICAgICAgICAgIHR5cGUgaXMgdXNlZCBieSB0aGUgbGlua2VyIHRvIGNyZWF0ZSBsaXN0cyBvZiBjb25zdHJ1Y3RvcnMgYW5kCi0gICAgICAgICAgIGRlc3RydWN0b3JzIHVzZWQgYnkgPDxnKys+Pi4gV2hlbiBhIGJhY2sgZW5kIHNlZXMgYSBzeW1ib2wKLSAgICAgICAgICAgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gYSBjb25zdHJ1Y3RvciBsaXN0LCBpdCBjcmVhdGVzIGEgbmV3Ci0gICAgICAgICAgIHNlY3Rpb24gZm9yIHRoZSB0eXBlIG9mIG5hbWUgKGUuZy4sIDw8X19DVE9SX0xJU1RfXz4+KSwgYXR0YWNoZXMKLSAgICAgICAgICAgdGhlIHN5bWJvbCB0byBpdCwgYW5kIGJ1aWxkcyBhIHJlbG9jYXRpb24uIFRvIGJ1aWxkIHRoZSBsaXN0cwotICAgICAgICAgICBvZiBjb25zdHJ1Y3RvcnMsIGFsbCB0aGUgbGlua2VyIGhhcyB0byBkbyBpcyBjYXRlbmF0ZSBhbGwgdGhlCi0gICAgICAgICAgIHNlY3Rpb25zIGNhbGxlZCA8PF9fQ1RPUl9MSVNUX18+PiBhbmQgcmVsb2NhdGUgdGhlIGRhdGEKLSAgICAgICAgICAgY29udGFpbmVkIHdpdGhpbiAtIGV4YWN0bHkgdGhlIG9wZXJhdGlvbnMgaXQgd291bGQgcGVmb3JtIG9uCi0gICAgICAgICAgIHN0YW5kYXJkIGRhdGEuICovCi0jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUiAweDEwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBpcyBhIGNvbnN0cnVjdG9yLCBhbmQgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUKLSAgICAgICAgICBlbmQgb2YgdGhlIHRleHQsIGRhdGEsIG9yIGJzcyBzZWN0aW9uKD8pLiAqLwotI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfVEVYVCAweDExMDAKLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0RBVEEgMHgyMTAwCi0jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9CU1MgIDB4MzEwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBoYXMgY29udGVudHMgLSBhIGRhdGEgc2VjdGlvbiBjb3VsZCBiZQotICAgICAgICAgICA8PFNFQ19BTExPQz4+IHwgPDxTRUNfSEFTX0NPTlRFTlRTPj47IGEgZGVidWcgc2VjdGlvbiBjb3VsZCBiZQotICAgICAgICAgICA8PFNFQ19IQVNfQ09OVEVOVFM+PiAqLwotI2RlZmluZSBTRUNfSEFTX0NPTlRFTlRTIDB4MjAwCi0KLSAgICAgICAgIC8qIEFuIGluc3RydWN0aW9uIHRvIHRoZSBsaW5rZXIgdG8gbm90IG91dHB1dCB0aGUgc2VjdGlvbgotICAgICAgICAgICBldmVuIGlmIGl0IGhhcyBpbmZvcm1hdGlvbiB3aGljaCB3b3VsZCBub3JtYWxseSBiZSB3cml0dGVuLiAqLwotI2RlZmluZSBTRUNfTkVWRVJfTE9BRCAweDQwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBpcyBhIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gIFRoaXMgZmxhZyBpcwotICAgICAgICAgICBvbmx5IGZvciB0aGUgbGlua2VyLiAgSWYgdGhpcyB0eXBlIG9mIHNlY3Rpb24gYXBwZWFycyBpbgotICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSwgdGhlIGxpbmtlciBtdXN0IGNvcHkgaXQgdG8gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZtYSBvciBzaXplLiAgRklYTUU6IEFsdGhvdWdoIHRoaXMKLSAgICAgICAgICAgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gYmUgZ2VuZXJhbCwgaXQgcmVhbGx5IGlzIENPRkYKLSAgICAgICAgICAgc3BlY2lmaWMgKGFuZCB0aGUgZmxhZyB3YXMgcmVuYW1lZCB0byBpbmRpY2F0ZSB0aGlzKS4gIEl0Ci0gICAgICAgICAgIG1pZ2h0IGJlIGNsZWFuZXIgdG8gaGF2ZSBzb21lIG1vcmUgZ2VuZXJhbCBtZWNoYW5pc20gdG8KLSAgICAgICAgICAgYWxsb3cgdGhlIGJhY2sgZW5kIHRvIGNvbnRyb2wgd2hhdCB0aGUgbGlua2VyIGRvZXMgd2l0aAotICAgICAgICAgICBzZWN0aW9ucy4gKi8KLSNkZWZpbmUgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgMHg4MDAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29tbW9uIHN5bWJvbHMgKHN5bWJvbHMgbWF5IGJlIGRlZmluZWQKLSAgICAgICAgICAgbXVsdGlwbGUgdGltZXMsIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBpcyB0aGUgYW1vdW50IG9mCi0gICAgICAgICAgIHNwYWNlIGl0IHJlcXVpcmVzLCBhbmQgdGhlIGxhcmdlc3Qgc3ltYm9sIHZhbHVlIGlzIHRoZSBvbmUKLSAgICAgICAgICAgdXNlZCkuICBNb3N0IHRhcmdldHMgaGF2ZSBleGFjdGx5IG9uZSBvZiB0aGVzZSAod2hpY2ggd2UKLSAgICAgICAgICAgdHJhbnNsYXRlIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIpLCBidXQgRUNPRkYgaGFzIHR3by4gKi8KLSNkZWZpbmUgU0VDX0lTX0NPTU1PTiAweDgwMDAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgb25seSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBGb3IKLSAgICAgICAgICAgZXhhbXBsZSwgdGhpcyBpcyBzZXQgZm9yIEVMRiAuZGVidWcgYW5kIC5zdGFiIHNlY3Rpb25zLgotICAgICAgICAgICBzdHJpcCB0ZXN0cyB0aGlzIGZsYWcgdG8gc2VlIGlmIGEgc2VjdGlvbiBjYW4gYmUKLSAgICAgICAgICAgZGlzY2FyZGVkLiAqLwotI2RlZmluZSBTRUNfREVCVUdHSU5HIDB4MTAwMDAKLQotICAgICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgaGVsZCBpbiBtZW1vcnkgcG9pbnRlZCB0bwotICAgICAgICAgICBieSB0aGUgY29udGVudHMgZmllbGQuICBUaGlzIGlzIGNoZWNrZWQgYnkKLSAgICAgICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzLCBhbmQgdGhlIGRhdGEgaXMgcmV0cmlldmVkIGZyb20KLSAgICAgICAgICAgbWVtb3J5IGlmIGFwcHJvcHJpYXRlLiAgKi8KLSNkZWZpbmUgU0VDX0lOX01FTU9SWSAweDIwMDAwCi0KLSAgICAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIGV4Y2x1ZGVkIGJ5IHRoZQotICAgICAgICAgICBsaW5rZXIgZm9yIGV4ZWN1dGFibGUgYW5kIHNoYXJlZCBvYmplY3RzIHVubGVzcyB0aG9zZQotICAgICAgICAgICBvYmplY3RzIGFyZSB0byBiZSBmdXJ0aGVyIHJlbG9jYXRlZC4gICovCi0jZGVmaW5lIFNFQ19FWENMVURFIDB4NDAwMDAKLQotICAgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBzb3J0ZWQgYnkgdGhlCi0gICAgICAgICAgYmFzZWQgb24gdGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGluIHRoZSBhc3NvY2lhdGVkIHN5bWJvbAotICAgICAgICAgIHRhYmxlLiAgKi8KLSNkZWZpbmUgU0VDX1NPUlRfRU5UUklFUyAweDgwMDAwCi0KLSAgICAgICAgLyogV2hlbiBsaW5raW5nLCBkdXBsaWNhdGUgc2VjdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBzaG91bGQgYmUKLSAgICAgICAgICBkaXNjYXJkZWQsIHJhdGhlciB0aGFuIGJlaW5nIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc2VjdGlvbiBhcwotICAgICAgICAgIGlzIHVzdWFsbHkgZG9uZS4gIFRoaXMgaXMgc2ltaWxhciB0byBob3cgY29tbW9uIHN5bWJvbHMgYXJlCi0gICAgICAgICAgaGFuZGxlZC4gIFNlZSBTRUNfTElOS19EVVBMSUNBVEVTIGJlbG93LiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfT05DRSAweDEwMDAwMAotCi0gICAgICAgIC8qIElmIFNFQ19MSU5LX09OQ0UgaXMgc2V0LCB0aGlzIGJpdGZpZWxkIGRlc2NyaWJlcyBob3cgdGhlIGxpbmtlcgotICAgICAgICAgIHNob3VsZCBoYW5kbGUgZHVwbGljYXRlIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFUyAweDYwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCBkdXBsaWNhdGUKLSAgICAgICAgICBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgc2hvdWxkIHNpbXBseSBiZSBkaXNjYXJkZWQuICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRCAweDAKLQotICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotICAgICAgICAgIHNob3VsZCB3YXJuIGlmIHRoZXJlIGFyZSBhbnkgZHVwbGljYXRlIHNlY3Rpb25zLCBhbHRob3VnaAotICAgICAgICAgIGl0IHNob3VsZCBzdGlsbCBvbmx5IGxpbmsgb25lIGNvcHkuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZIDB4MjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLSAgICAgICAgICBzaG91bGQgd2FybiBpZiBhbnkgZHVwbGljYXRlIHNlY3Rpb25zIGFyZSBhIGRpZmZlcmVudCBzaXplLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUgMHg0MDAwMDAKLQotICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotICAgICAgICAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgY29udGFpbiBkaWZmZXJlbnQKLSAgICAgICAgICBjb250ZW50cy4gICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUyAweDYwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgc2VjdGlvbiB3YXMgY3JlYXRlZCBieSB0aGUgbGlua2VyIGFzIHBhcnQgb2YgZHluYW1pYwotICAgICAgICAgIHJlbG9jYXRpb24gb3Igb3RoZXIgYXJjYW5lIHByb2Nlc3NpbmcuICBJdCBpcyBza2lwcGVkIHdoZW4KLSAgICAgICAgICBnb2luZyB0aHJvdWdoIHRoZSBmaXJzdC1wYXNzIG91dHB1dCwgdHJ1c3RpbmcgdGhhdCBzb21lb25lCi0gICAgICAgICAgZWxzZSB1cCB0aGUgbGluZSB3aWxsIHRha2UgY2FyZSBvZiBpdCBsYXRlci4gICovCi0jZGVmaW5lIFNFQ19MSU5LRVJfQ1JFQVRFRCAweDgwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgc2VjdGlvbiBzaG91bGQgbm90IGJlIHN1YmplY3QgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VDX0tFRVAgMHgxMDAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zICJzaG9ydCIgZGF0YSwgYW5kIHNob3VsZCBiZSBwbGFjZWQKLSAgICAgICAgICAibmVhciIgdGhlIEdQLiAgKi8KLSNkZWZpbmUgU0VDX1NIT1JUIDB4MjAwMDAwMAotCi0gICAgICAgIC8qICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICovCi0KLSAgICAgICAgLyogU29tZSBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqLwotCi0gICAgICAgIC8qIFNlZSB0aGUgdm1hIGZpZWxkLiAgKi8KLSAgICAgICB1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKLQotICAgICAgICAvKiBXaGV0aGVyIHJlbG9jYXRpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqLwotICAgICAgIHVuc2lnbmVkIGludCByZWxvY19kb25lIDogMTsKLQotICAgICAgICAvKiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICovCi0gICAgICAgdW5zaWduZWQgaW50IGxpbmtlcl9tYXJrIDogMTsKLQotICAgICAgICAvKiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgbGlua2VyIGJhY2tlbmRzIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICAgICAgIHVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKLQotICAgICAgICAvKiBFbmQgb2YgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKi8KLQotICAgICAgICAvKiAgVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3aWxsIGJlCi0gICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKLSAgICAgICAgICAgdXNlcl9zZXRfdm1hIGZsYWcgaXMgbWFpbnRhaW5lZCBieSBiZmQ7IGlmIGl0J3Mgbm90IHNldCwgdGhlCi0gICAgICAgICAgIGJhY2tlbmQgY2FuIGFzc2lnbiBhZGRyZXNzZXMgKGZvciBleGFtcGxlLCBpbiA8PGEub3V0Pj4sIHdoZXJlCi0gICAgICAgICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCi0gICAgICAgICAgIHRhcmdldCBhbmQgdmFyaW91cyBmbGFncykuICAqLwotCi0gICBiZmRfdm1hIHZtYTsKLQotICAgICAgICAvKiAgVGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdvdWxkIGJlIGluIGEKLSAgICAgICAgICAgcm9tIGltYWdlOyByZWFsbHkgb25seSB1c2VkIGZvciB3cml0aW5nIHNlY3Rpb24gaGVhZGVyCi0gICAgICAgICAgIGluZm9ybWF0aW9uLiAqLwotCi0gICBiZmRfdm1hIGxtYTsKLQotICAgICAgICAgLyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gYnl0ZXMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgotICAgICAgICAgICBjb250YWlucyBhIHZhbHVlIGV2ZW4gaWYgdGhlIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIChlLmcuLCB0aGUKLSAgICAgICAgICAgc2l6ZSBvZiA8PC5ic3M+PikuIFRoaXMgd2lsbCBiZSBmaWxsZWQgaW4gYWZ0ZXIgcmVsb2NhdGlvbiAqLwotCi0gICBiZmRfc2l6ZV90eXBlIF9jb29rZWRfc2l6ZTsKLQotICAgICAgICAgLyogVGhlIG9yaWdpbmFsIHNpemUgb24gZGlzayBvZiB0aGUgc2VjdGlvbiwgaW4gYnl0ZXMuICBOb3JtYWxseSB0aGlzCi0gICAgICAgICAgIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplLCBidXQgaWYgc29tZSByZWxheGluZyBoYXMKLSAgICAgICAgICAgYmVlbiBkb25lLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBiaWdnZXIuICAqLwotCi0gICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLQotICAgICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlbiB0aGlzIHZhbHVlIGlzIHRoZQotICAgICAgICAgICBvZmZzZXQgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgIHNlY3Rpb24uIEUuZy4sIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZSAxMDB0aCBieXRlIGluCi0gICAgICAgICAgIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhpcyB2YWx1ZSB3b3VsZCBiZSAxMDAuICovCi0KLSAgIGJmZF92bWEgb3V0cHV0X29mZnNldDsKLQotICAgICAgICAgLyogVGhlIG91dHB1dCBzZWN0aW9uIHRocm91Z2ggd2hpY2ggdG8gbWFwIG9uIG91dHB1dC4gKi8KLQotICAgc3RydWN0IHNlYyAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgICAgICAgIC8qIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlIHNlY3Rpb24sIGFzIGFuIGV4cG9uZW50IG9mIDIgLQotICAgICAgICAgICBlLmcuLCAzIGFsaWducyB0byAyXjMgKG9yIDgpLiAqLwotCi0gICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotCi0gICAgICAgICAvKiBJZiBhbiBpbnB1dCBzZWN0aW9uLCBhIHBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgcmVsb2NhdGlvbgotICAgICAgICAgICByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICovCi0KLSAgIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeSAqcmVsb2NhdGlvbjsKLQotICAgICAgICAgLyogSWYgYW4gb3V0cHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0bwotICAgICAgICAgICByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKi8KLQotICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICoqb3JlbG9jYXRpb247Ci0KLSAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGluIG9uZSBvZiB0aGUgYWJvdmUgICovCi0KLSAgIHVuc2lnbmVkIHJlbG9jX2NvdW50OwotCi0gICAgICAgICAvKiBJbmZvcm1hdGlvbiBiZWxvdyBpcyBiYWNrIGVuZCBzcGVjaWZpYyAtIGFuZCBub3QgYWx3YXlzIHVzZWQKLSAgICAgICAgICAgb3IgdXBkYXRlZC4gICovCi0KLSAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2Ygc2VjdGlvbiBkYXRhICAgICovCi0KLSAgIGZpbGVfcHRyIGZpbGVwb3M7Ci0KLSAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvICovCi0KLSAgIGZpbGVfcHRyIHJlbF9maWxlcG9zOwotCi0gICAgICAgICAvKiBGaWxlIHBvc2l0aW9uIG9mIGxpbmUgZGF0YSAgICAgICAqLwotCi0gICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0KLSAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGF0YSBmb3IgYXBwbGljYXRpb25zICovCi0KLSAgIFBUUiB1c2VyZGF0YTsKLQotICAgICAgICAgLyogSWYgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoaXMgcG9pbnRzIHRvIHRoZSBhY3R1YWwKLSAgICAgICAgICAgY29udGVudHMuICAqLwotICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7Ci0KLSAgICAgICAgIC8qIEF0dGFjaGVkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uICovCi0KLSAgIGFsZW50ICpsaW5lbm87Ci0KLSAgICAgICAgIC8qIE51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzICAgKi8KLQotICAgdW5zaWduZWQgaW50IGxpbmVub19jb3VudDsKLQotICAgICAgICAgLyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotICAgICAgICAgICBsaW5lbnVtYmVycyBhcmUgd3JpdHRlbiBvdXQgKi8KLQotICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLQotICAgICAgICAgLyogV2hhdCB0aGUgc2VjdGlvbiBudW1iZXIgaXMgaW4gdGhlIHRhcmdldCB3b3JsZCAgKi8KLQotICAgaW50IHRhcmdldF9pbmRleDsKLQotICAgUFRSIHVzZWRfYnlfYmZkOwotCi0gICAgICAgICAvKiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotICAgICAgICAgICByZWxvY2F0aW9ucyBjcmVhdGVkIHRvIHJlbG9jYXRlIGl0ZW1zIHdpdGhpbiBpdC4gKi8KLQotICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICAgICAgIC8qIFRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc2VjdGlvbi4gKi8KLQotICAgYmZkICpvd25lcjsKLQotICAgICAgICAgLyogQSBzeW1ib2wgd2hpY2ggcG9pbnRzIGF0IHRoaXMgc2VjdGlvbiBvbmx5ICovCi0gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0KLSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcl9oZWFkOwotICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci19IGFzZWN0aW9uIDsKLQotICAgICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2xvYmFsLCBhbmQgYXJlIG1hbmFnZWQgYnkgQkZELiAgVGhlIGFwcGxpY2F0aW9uCi0gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotICAgICAgIHRoZXNlIHNlY3Rpb25zLiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgc2VjdGlvbl9wdHIgbWFjcm9zIHJhdGhlcgotICAgICAgIHRoYW4gcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBjb25zdCBzZWN0aW9ucy4gIFRoZSBjb25zdCBzZWN0aW9ucwotICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICovCi0jZGVmaW5lIEJGRF9BQlNfU0VDVElPTl9OQU1FICIqQUJTKiIKLSNkZWZpbmUgQkZEX1VORF9TRUNUSU9OX05BTUUgIipVTkQqIgotI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0jZGVmaW5lIEJGRF9JTkRfU0VDVElPTl9OQU1FICIqSU5EKiIKLQotICAgICAvKiB0aGUgYWJzb2x1dGUgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2Fic19zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfYWJzX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc19hYnNfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotICAgICAvKiBQb2ludGVyIHRvIHRoZSB1bmRlZmluZWQgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX3VuZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfdW5kX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc191bmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotICAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2NvbV9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfY29tX3NlY3Rpb24pCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IHNlY3Rpb24gKi8KLWV4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfaW5kX3NlY3Rpb247Ci0jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotI2RlZmluZSBiZmRfaXNfaW5kX3NlY3Rpb24oc2VjKSAoKHNlYykgPT0gYmZkX2luZF9zZWN0aW9uX3B0cikKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX2NvbV9zeW1ib2w7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF91bmRfc3ltYm9sOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKHNlY3Rpb24tPnJlbG9jX2RvbmUgPyAoYWJvcnQoKSwxKTogKHNlY3Rpb24pLT5fcmF3X3NpemUpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKChzZWN0aW9uLT5yZWxvY19kb25lKSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplOiAoYWJvcnQoKSwxKSkKLWFzZWN0aW9uICoKLWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X3NlY3Rpb25fZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBmbGFnd29yZCBmbGFncykpOwotCi12b2lkIAotYmZkX21hcF9vdmVyX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICB2b2lkICgqZnVuYykoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0LAotICAgIFBUUiBvYmopLAotICAgIFBUUiBvYmopKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3NpemVfdHlwZSB2YWwpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICBQVFIgZGF0YSwKLSAgICBmaWxlX3B0ciBvZmZzZXQsCi0gICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotCi1ib29sZWFuIAotYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLAotICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYykpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSkKLXZvaWQgCi1fYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLSBQQVJBTVMgKChhc2VjdGlvbiAqc2VjdGlvbikpOwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi17Ci0gIGJmZF9hcmNoX3Vua25vd24sICAgIC8qIEZpbGUgYXJjaCBub3Qga25vd24gKi8KLSAgYmZkX2FyY2hfb2JzY3VyZSwgICAgLyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqLwotICBiZmRfYXJjaF9tNjhrLCAgICAgICAvKiBNb3Rvcm9sYSA2OHh4eCAqLwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgotI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAotI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQotI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNwotI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAotICBiZmRfYXJjaF92YXgsICAgICAgICAvKiBERUMgVmF4ICovICAgCi0gIGJmZF9hcmNoX2k5NjAsICAgICAgIC8qIEludGVsIDk2MCAqLwotICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCi0gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0gICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCi0gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLSAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAotICAgICAgICJjb3JlIi4gKi8KLQotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4ICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKLQotICBiZmRfYXJjaF9hMjlrLCAgICAgICAvKiBBTUQgMjkwMDAgKi8KLSAgYmZkX2FyY2hfc3BhcmMsICAgICAgLyogU1BBUkMgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmMgICAgICAgICAgICAgICAgIDEKLSAvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0ICAgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSAgICAgICAzCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAgICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgICAgICAgICA1ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSAgICA2Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5ICAgICAgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YSAgICAgICAgICAgICA4ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0gLyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCi0gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0gIGJmZF9hcmNoX21pcHMsICAgICAgIC8qIE1JUFMgUnh4eHggKi8KLSNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAgICAgICAgICAgICAgIDMwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAgICAgICAgICAgICAgIDM5MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAgICAgICAgICAgICAgIDQwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAgICAgICAgICAgICAgIDQwMTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAgICAgICAgICAgICAgIDQxMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEgICAgICAgICAgICAgIDQxMTEKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAgICAgICAgICAgICAgIDQzMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAgICAgICAgICAgICAgIDQ0MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAgICAgICAgICAgICAgIDQ2MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAgICAgICAgICAgICAgIDQ2NTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAgICAgICAgICAgICAgIDUwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAgICAgICAgICAgICAgIDYwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwICAgICAgICAgICAgIDEwMDAwCi0jZGVmaW5lIGJmZF9tYWNoX21pcHMxNiAgICAgICAgICAgICAgICAxNgotICBiZmRfYXJjaF9pMzg2LCAgICAgICAvKiBJbnRlbCAzODYgKi8KLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCi0jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgotICBiZmRfYXJjaF93ZTMyaywgICAgICAvKiBBVCZUIFdFMzJ4eHggKi8KLSAgYmZkX2FyY2hfdGFob2UsICAgICAgLyogQ0NJL0hhcnJpcyBUYWhvZSAqLwotICBiZmRfYXJjaF9pODYwLCAgICAgICAvKiBJbnRlbCA4NjAgKi8KLSAgYmZkX2FyY2hfcm9tcCwgICAgICAgLyogSUJNIFJPTVAgUEMvUlQgKi8KLSAgYmZkX2FyY2hfYWxsaWFudCwgICAgLyogQWxsaWFudCAqLwotICBiZmRfYXJjaF9jb252ZXgsICAgICAvKiBDb252ZXggKi8KLSAgYmZkX2FyY2hfbTg4aywgICAgICAgLyogTW90b3JvbGEgODh4eHggKi8KLSAgYmZkX2FyY2hfcHlyYW1pZCwgICAgLyogUHlyYW1pZCBUZWNobm9sb2d5ICovCi0gIGJmZF9hcmNoX2g4MzAwLCAgICAgIC8qIEhpdGFjaGkgSDgvMzAwICovCi0jZGVmaW5lIGJmZF9tYWNoX2g4MzAwICAgMQotI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKLSNkZWZpbmUgYmZkX21hY2hfaDgzMDBzICAzCi0gIGJmZF9hcmNoX3Bvd2VycGMsICAgIC8qIFBvd2VyUEMgKi8KLSAgYmZkX2FyY2hfcnM2MDAwLCAgICAgLyogSUJNIFJTLzYwMDAgKi8KLSAgYmZkX2FyY2hfaHBwYSwgICAgICAgLyogSFAgUEEgUklTQyAqLwotICBiZmRfYXJjaF9kMTB2LCAgICAgICAvKiBNaXRzdWJpc2hpIEQxMFYgKi8KLSAgYmZkX2FyY2hfZDMwdiwgICAgICAgLyogTWl0c3ViaXNoaSBEMzBWICovCi0gIGJmZF9hcmNoX3o4aywgICAgICAgIC8qIFppbG9nIFo4MDAwICovCi0jZGVmaW5lIGJmZF9tYWNoX3o4MDAxICAgICAgICAgMQotI2RlZmluZSBiZmRfbWFjaF96ODAwMiAgICAgICAgIDIKLSAgYmZkX2FyY2hfaDg1MDAsICAgICAgLyogSGl0YWNoaSBIOC81MDAgKi8KLSAgYmZkX2FyY2hfc2gsICAgICAgICAgLyogSGl0YWNoaSBTSCAqLwotI2RlZmluZSBiZmRfbWFjaF9zaCAgICAgICAgICAgIDAKLSNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCi0jZGVmaW5lIGJmZF9tYWNoX3NoM2UgICAgICAgMHgzZQotICBiZmRfYXJjaF9hbHBoYSwgICAgICAvKiBEZWMgQWxwaGEgKi8KLSNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCi0jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKLSAgYmZkX2FyY2hfYXJtLCAgICAgICAgLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJtXzIgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2FybV8yYSAgICAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9hcm1fMyAgICAgICAgIDMKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzNNICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV80ICAgICAgICAgNQotI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgICAgICAgIDYKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzUgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV81VCAgICAgICAgOAotICBiZmRfYXJjaF9uczMyaywgICAgICAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICovCi0gIGJmZF9hcmNoX3c2NSwgICAgICAgIC8qIFdEQyA2NTgxNiAqLwotICBiZmRfYXJjaF90aWMzMCwgICAgICAvKiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKi8KLSAgYmZkX2FyY2hfdGljODAsICAgICAgLyogVEkgVE1TMzIwYzgwIChNVlApICovCi0gIGJmZF9hcmNoX3Y4NTAsICAgICAgIC8qIE5FQyBWODUwICovCi0jZGVmaW5lIGJmZF9tYWNoX3Y4NTAgICAgICAgICAgMAotI2RlZmluZSBiZmRfbWFjaF92ODUwZSAgICAgICAgICdFJwotI2RlZmluZSBiZmRfbWFjaF92ODUwZWEgICAgICAgICdBJwotICBiZmRfYXJjaF9hcmMsICAgICAgICAvKiBBcmdvbmF1dCBSSVNDIENvcmUgKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJjX2Jhc2UgMAotICBiZmRfYXJjaF9tMzJyLCAgICAgICAvKiBNaXRzdWJpc2hpIE0zMlIvRCAqLwotI2RlZmluZSBiZmRfbWFjaF9tMzJyICAgICAgICAgIDAgIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCi0gIGJmZF9hcmNoX21uMTAyMDAsICAgIC8qIE1hdHN1c2hpdGEgTU4xMDIwMCAqLwotICBiZmRfYXJjaF9tbjEwMzAwLCAgICAvKiBNYXRzdXNoaXRhIE1OMTAzMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfbW4xMDMwMCAgICAgICAgICAgICAgIDMwMAotICBiZmRfYXJjaF9mcjMwLAotI2RlZmluZSBiZmRfbWFjaF9mcjMwICAgICAgICAgIDB4NDY1MjMzMzAKLSAgYmZkX2FyY2hfbWNvcmUsCi0gIGJmZF9hcmNoX2xhc3QKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLXsKLSAgaW50IGJpdHNfcGVyX3dvcmQ7Ci0gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotICBpbnQgYml0c19wZXJfYnl0ZTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgY29uc3QgY2hhciAqYXJjaF9uYW1lOwotICBjb25zdCBjaGFyICpwcmludGFibGVfbmFtZTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0gIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICovCi0gIGJvb2xlYW4gdGhlX2RlZmF1bHQ7IAotICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqICgqY29tcGF0aWJsZSkKLSAgICAgICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYikpOwotCi0gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLQotICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqbmV4dDsKLX0gYmZkX2FyY2hfaW5mb190eXBlOwotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX25hbWUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfc2Nhbl9hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1jb25zdCBjaGFyICoqCi1iZmRfYXJjaF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9hcmNoX2dldF9jb21wYXRpYmxlIFBBUkFNUyAoKAotICAgIGNvbnN0IGJmZCAqYWJmZCwKLSAgICBjb25zdCBiZmQgKmJiZmQpKTsKLQotdm9pZCAKLWJmZF9zZXRfYXJjaF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmcpKTsKLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlIAotYmZkX2dldF9hcmNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBsb25nIAotYmZkX2dldF9tYWNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9iaXRzX3Blcl9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiAKLWJmZF9nZXRfYXJjaF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2xvb2t1cF9hcmNoCi0gUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi0gICAgYXJjaCwKLSAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX2FyY2hfbWFjaAotIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotdHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMKLXsKLSAgICAgICAgLyogTm8gZXJyb3JzIGRldGVjdGVkICovCi0gIGJmZF9yZWxvY19vaywKLQotICAgICAgICAvKiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgdGhlcmUgd2FzIGFuIG92ZXJmbG93LiAqLwotICBiZmRfcmVsb2Nfb3ZlcmZsb3csCi0KLSAgICAgICAgLyogVGhlIGFkZHJlc3MgdG8gcmVsb2NhdGUgd2FzIG5vdCB3aXRoaW4gdGhlIHNlY3Rpb24gc3VwcGxpZWQuICovCi0gIGJmZF9yZWxvY19vdXRvZnJhbmdlLAotCi0gICAgICAgIC8qIFVzZWQgYnkgc3BlY2lhbCBmdW5jdGlvbnMgKi8KLSAgYmZkX3JlbG9jX2NvbnRpbnVlLAotCi0gICAgICAgIC8qIFVuc3VwcG9ydGVkIHJlbG9jYXRpb24gc2l6ZSByZXF1ZXN0ZWQuICovCi0gIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQsCi0KLSAgICAgICAgLyogVW51c2VkICovCi0gIGJmZF9yZWxvY19vdGhlciwKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIHRvIHJlbG9jYXRlIGFnYWluc3Qgd2FzIHVuZGVmaW5lZC4gKi8KLSAgYmZkX3JlbG9jX3VuZGVmaW5lZCwKLQotICAgICAgICAvKiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgbWF5IG5vdCBiZSBvayAtIHByZXNlbnRseQotICAgICAgICAgIGdlbmVyYXRlZCBvbmx5IHdoZW4gbGlua2luZyBpOTYwIGNvZmYgZmlsZXMgd2l0aCBpOTYwIGIub3V0Ci0gICAgICAgICAgc3ltYm9scy4gIElmIHRoaXMgdHlwZSBpcyByZXR1cm5lZCwgdGhlIGVycm9yX21lc3NhZ2UgYXJndW1lbnQKLSAgICAgICAgICB0byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHdpbGwgYmUgc2V0LiAgKi8KLSAgYmZkX3JlbG9jX2Rhbmdlcm91cwotIH0KLSBiZmRfcmVsb2Nfc3RhdHVzX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkKLXsKLSAgICAgICAgLyogQSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCB0YWJsZSBvZiBwb2ludGVycyAgKi8KLSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bV9wdHJfcHRyOwotCi0gICAgICAgIC8qIG9mZnNldCBpbiBzZWN0aW9uICovCi0gIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKLQotICAgICAgICAvKiBhZGRlbmQgZm9yIHJlbG9jYXRpb24gdmFsdWUgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgICAgLyogUG9pbnRlciB0byBob3cgdG8gcGVyZm9ybSB0aGUgcmVxdWlyZWQgcmVsb2NhdGlvbiAqLwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotfSBhcmVsZW50OwotZW51bSBjb21wbGFpbl9vdmVyZmxvdwotewotICAgICAgICAvKiBEbyBub3QgY29tcGxhaW4gb24gb3ZlcmZsb3cuICovCi0gIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0KLSAgICAgICAgLyogQ29tcGxhaW4gaWYgdGhlIGJpdGZpZWxkIG92ZXJmbG93cywgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkCi0gICAgICAgICAgYXMgc2lnbmVkIG9yIHVuc2lnbmVkLiAqLwotICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBzaWduZWQKLSAgICAgICAgICBudW1iZXIuICovCi0gIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBhbgotICAgICAgICAgIHVuc2lnbmVkIG51bWJlci4gKi8KLSAgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQKLX07Ci0KLXN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLXsKLSAgICAgICAgLyogIFRoZSB0eXBlIGZpZWxkIGhhcyBtYWlubHkgYSBkb2N1bWVudGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCi0gICAgICAgICAgIGRvIHdoYXQgaXQgd2FudHMgd2l0aCBpdCwgdGhvdWdoIG5vcm1hbGx5IHRoZSBiYWNrIGVuZCdzCi0gICAgICAgICAgIGV4dGVybmFsIGlkZWEgb2Ygd2hhdCBhIHJlbG9jIG51bWJlciBpcyBzdG9yZWQKLSAgICAgICAgICAgaW4gdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgUEMgcmVsYXRpdmUgd29yZCByZWxvY2F0aW9uCi0gICAgICAgICAgIGluIGEgY29mZiBlbnZpcm9ubWVudCBoYXMgdGhlIHR5cGUgMDIzIC0gYmVjYXVzZSB0aGF0J3MKLSAgICAgICAgICAgd2hhdCB0aGUgb3V0c2lkZSB3b3JsZCBjYWxscyBhIFJfUENSV09SRCByZWxvYy4gKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgICAgICAgLyogIFRoZSB2YWx1ZSB0aGUgZmluYWwgcmVsb2NhdGlvbiBpcyBzaGlmdGVkIHJpZ2h0IGJ5LiBUaGlzIGRyb3BzCi0gICAgICAgICAgIHVud2FudGVkIGRhdGEgZnJvbSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotCi0gICAgICAgIC8qICBUaGUgc2l6ZSBvZiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzICpub3QqIGEKLSAgICAgICAgICAgcG93ZXItb2YtdHdvIG1lYXN1cmUuICBUbyBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZAotICAgICAgICAgICBvbiBieSBhIHR5cGUgb2YgcmVsb2NhdGlvbiwgdXNlIGJmZF9nZXRfcmVsb2Nfc2l6ZS4gICovCi0gIGludCBzaXplOwotCi0gICAgICAgIC8qICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyB1c2VkCi0gICAgICAgICAgIHdoZW4gZG9pbmcgb3ZlcmZsb3cgY2hlY2tpbmcuICAqLwotICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQotICAgICAgICAvKiAgTm90ZXMgdGhhdCB0aGUgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlCi0gICAgICAgICAgIGRhdGEgc2VjdGlvbiBvZiB0aGUgYWRkZW5kLiBUaGUgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aWxsCi0gICAgICAgICAgIHN1YnRyYWN0IGZyb20gdGhlIHJlbG9jYXRpb24gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uCi0gICAgICAgICAgIGJlaW5nIHJlbG9jYXRlZC4gKi8KLSAgYm9vbGVhbiBwY19yZWxhdGl2ZTsKLQotICAgICAgICAvKiAgVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgcmVsb2MgdmFsdWUgaW4gdGhlIGRlc3RpbmF0aW9uLgotICAgICAgICAgICBUaGUgcmVsb2NhdGVkIHZhbHVlIGlzIGxlZnQgc2hpZnRlZCBieSB0aGlzIGFtb3VudC4gKi8KLSAgdW5zaWduZWQgaW50IGJpdHBvczsKLQotICAgICAgICAvKiBXaGF0IHR5cGUgb2Ygb3ZlcmZsb3cgZXJyb3Igc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHdoZW4KLSAgICAgICAgICByZWxvY2F0aW5nLiAqLwotICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGNvbXBsYWluX29uX292ZXJmbG93OwotCi0gICAgICAgIC8qIElmIHRoaXMgZmllbGQgaXMgbm9uIG51bGwsIHRoZW4gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGlzCi0gICAgICAgICAgY2FsbGVkIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHJlYWxseQotICAgICAgICAgIHN0cmFuZ2UgcmVsb2NhdGlvbiBtZXRob2RzIHRvIGJlIGFjY29tb2RhdGVkIChlLmcuLCBpOTYwIGNhbGxqCi0gICAgICAgICAgaW5zdHJ1Y3Rpb25zKS4gKi8KLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlICgqc3BlY2lhbF9mdW5jdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotICAgICAgICAvKiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgLyogV2hlbiBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rLCBzb21lIGZvcm1hdHMgbXVzdCBtb2RpZnkgdGhlCi0gICAgICAgICAgcmVsb2NhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRhdGEgLSB0aGlzIGZsYWcgc2lnbmFscyB0aGlzLiovCi0gIGJvb2xlYW4gcGFydGlhbF9pbnBsYWNlOwotCi0gICAgICAgIC8qIFRoZSBzcmNfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSByZWFkIGluIGRhdGEKLSAgICAgICAgICBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbiBzdW0uICBFLmcuLCBpZiB0aGlzIHdhcyBhbiA4IGJpdAotICAgICAgICAgIGJpdCBvZiBkYXRhIHdoaWNoIHdlIHJlYWQgYW5kIHJlbG9jYXRlZCwgdGhpcyB3b3VsZCBiZQotICAgICAgICAgIDB4MDAwMDAwZmYuIFdoZW4gd2UgaGF2ZSByZWxvY3Mgd2hpY2ggaGF2ZSBhbiBhZGRlbmQsIHN1Y2ggYXMKLSAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCi0gICAgICAgICAgcmVsb2NhdGluZyBmaWVsZCBpcyBnYXJiYWdlIHNvIHdlIG5ldmVyIHVzZSBpdC4gSW4gdGhpcyBjYXNlCi0gICAgICAgICAgdGhlIG1hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gKi8KLSAgYmZkX3ZtYSBzcmNfbWFzazsKLQotICAgICAgICAvKiBUaGUgZHN0X21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHJlcGxhY2VkCi0gICAgICAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24uIEluIG1vc3QgY2FzZXMgc3JjX21hc2sgPT0gZHN0X21hc2ssCi0gICAgICAgICAgZXhjZXB0IGluIHRoZSBhYm92ZSBzcGVjaWFsIGNhc2UsIHdoZXJlIGRzdF9tYXNrIHdvdWxkIGJlCi0gICAgICAgICAgMHgwMDAwMDBmZiwgYW5kIHNyY19tYXNrIHdvdWxkIGJlIDB4MDAwMDAwMDAuICAgKi8KLSAgYmZkX3ZtYSBkc3RfbWFzazsKLQotICAgICAgICAvKiBXaGVuIHNvbWUgZm9ybWF0cyBjcmVhdGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zLCB0aGV5IGxlYXZlCi0gICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwYyBvZiB0aGUgcGxhY2UgYmVpbmcgcmVsb2NhdGVkIGluIHRoZSBvZmZzZXQKLSAgICAgICAgICBzbG90IG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gdGhhdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gY2FuCi0gICAgICAgICAgYmUgbWFkZSBqdXN0IGJ5IGFkZGluZyBpbiBhbiBvcmRpbmFyeSBvZmZzZXQgKGUuZy4sIHN1bjMgYS5vdXQpLgotICAgICAgICAgIFNvbWUgZm9ybWF0cyBsZWF2ZSB0aGUgZGlzcGxhY2VtZW50IHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgICAgICAgICBlbXB0eSAoZS5nLiwgbTg4ayBiY3MpOyB0aGlzIGZsYWcgc2lnbmFscyB0aGUgZmFjdC4qLwotICBib29sZWFuIHBjcmVsX29mZnNldDsKLQotfTsKLSNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBPLCBTRiwgTkFNRSwgSU5QTEFDRSwgTUFTS1NSQywgTUFTS0RTVCwgUEMpIFwKLSAgeyh1bnNpZ25lZClDLFIsUyxCLCBQLCBCSSwgTyxTRixOQU1FLElOUExBQ0UsTUFTS1NSQyxNQVNLRFNULFBDfQotI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCxGVU5DVElPTiwgTkFNRSxmYWxzZSwwLDAsSU4pCi0KLSNkZWZpbmUgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2wpICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChzeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKSB7ICAgICAgICAgICAgIFwKLSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSB7IFwKLSAgICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOyAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLXVuc2lnbmVkIGludCAKLWJmZF9nZXRfcmVsb2Nfc2l6ZSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0KLXR5cGVkZWYgc3RydWN0IHJlbGVudF9jaGFpbiB7Ci0gIGFyZWxlbnQgcmVsZW50OwotICBzdHJ1Y3QgICByZWxlbnRfY2hhaW4gKm5leHQ7Ci19IGFyZWxlbnRfY2hhaW47Ci1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX2NoZWNrX292ZXJmbG93Ci0gUEFSQU1TICgoZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3csCi0gICAgdW5zaWduZWQgaW50IGJpdHNpemUsCi0gICAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQsCi0gICAgdW5zaWduZWQgaW50IGFkZHJzaXplLAotICAgIGJmZF92bWEgcmVsb2NhdGlvbikpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICBQVFIgZGF0YSwKLSAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi0KLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgUFRSIGRhdGEsIGJmZF92bWEgZGF0YV9zdGFydCwKLSAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1lbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgewotICBfZHVtbXlfZmlyc3RfYmZkX3JlbG9jX2NvZGVfcmVhbCwKLQotCi0vKiBCYXNpYyBhYnNvbHV0ZSByZWxvY2F0aW9ucyBvZiBOIGJpdHMuICovCi0gIEJGRF9SRUxPQ182NCwKLSAgQkZEX1JFTE9DXzMyLAotICBCRkRfUkVMT0NfMjYsCi0gIEJGRF9SRUxPQ18yNCwKLSAgQkZEX1JFTE9DXzE2LAotICBCRkRfUkVMT0NfMTQsCi0gIEJGRF9SRUxPQ184LAotCi0vKiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuICovCi0gIEJGRF9SRUxPQ182NF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzMyX1BDUkVMLAotICBCRkRfUkVMT0NfMjRfUENSRUwsCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DXzEyX1BDUkVMLAotICBCRkRfUkVMT0NfOF9QQ1JFTCwKLQotLyogRm9yIEVMRi4gKi8KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMLAotICBCRkRfUkVMT0NfMzJfR09UT0ZGLAotICBCRkRfUkVMT0NfMTZfR09UT0ZGLAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYsCi0gIEJGRF9SRUxPQ184X0dPVE9GRiwKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfMzJfUExUT0ZGLAotICBCRkRfUkVMT0NfMTZfUExUT0ZGLAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYsCi0gIEJGRF9SRUxPQ184X1BMVE9GRiwKLQotLyogUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLiAqLwotICBCRkRfUkVMT0NfNjhLX0dMT0JfREFULAotICBCRkRfUkVMT0NfNjhLX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFLAotCi0vKiBMaW5rYWdlLXRhYmxlIHJlbGF0aXZlLiAqLwotICBCRkRfUkVMT0NfMzJfQkFTRVJFTCwKLSAgQkZEX1JFTE9DXzE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCwKLSAgQkZEX1JFTE9DXzhfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX1JWQSwKLQotLyogQWJzb2x1dGUgOC1iaXQgcmVsb2NhdGlvbiwgYnV0IHVzZWQgdG8gZm9ybSBhbiBhZGRyZXNzIGxpa2UgMHhGRm5uLiAqLwotICBCRkRfUkVMT0NfOF9GRm5uLAotCi0vKiBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4gKi8KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIsCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMiwKLQotLyogSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4gKi8KLSAgQkZEX1JFTE9DX0hJMjIsCi0gIEJGRF9SRUxPQ19MTzEwLAotCi0vKiBGb3Igc3lzdGVtcyB0aGF0IGFsbG9jYXRlIGEgR2xvYmFsIFBvaW50ZXIgcmVnaXN0ZXIsIHRoZXNlIGFyZQotZGlzcGxhY2VtZW50cyBvZmYgdGhhdCByZWdpc3Rlci4gIFRoZXNlIHJlbG9jYXRpb24gdHlwZXMgYXJlCi1oYW5kbGVkIHNwZWNpYWxseSwgYmVjYXVzZSB0aGUgdmFsdWUgdGhlIHJlZ2lzdGVyIHdpbGwgaGF2ZSBpcwotZGVjaWRlZCByZWxhdGl2ZWx5IGxhdGUuICovCi0gIEJGRF9SRUxPQ19HUFJFTDE2LAotICBCRkRfUkVMT0NfR1BSRUwzMiwKLQotLyogUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4gKi8KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEosCi0KLS8qIFNQQVJDIEVMRiByZWxvY2F0aW9ucy4gIFRoZXJlIGlzIHByb2JhYmx5IHNvbWUgb3ZlcmxhcCB3aXRoIG90aGVyCi1yZWxvY2F0aW9uIHR5cGVzIGFscmVhZHkgZGVmaW5lZC4gKi8KLSAgQkZEX1JFTE9DX05PTkUsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLAotICBCRkRfUkVMT0NfU1BBUkMyMiwKLSAgQkZEX1JFTE9DX1NQQVJDMTMsCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLAotICBCRkRfUkVMT0NfU1BBUkNfR09UMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzEwLAotICBCRkRfUkVMT0NfU1BBUkNfUEMyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0NPUFksCi0gIEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19TUEFSQ19VQTMyLAotCi0vKiBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLiAqLwotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLAotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyLAotCi0vKiBTUEFSQzY0IHJlbG9jYXRpb25zICovCi0jZGVmaW5lIEJGRF9SRUxPQ19TUEFSQ182NCBCRkRfUkVMT0NfNjQKLSAgQkZEX1JFTE9DX1NQQVJDXzEwLAotICBCRkRfUkVMT0NfU1BBUkNfMTEsCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwLAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5LAotICBCRkRfUkVMT0NfU1BBUkNfNywKLSAgQkZEX1JFTE9DX1NQQVJDXzYsCi0gIEJGRF9SRUxPQ19TUEFSQ181LAotI2RlZmluZSBCRkRfUkVMT0NfU1BBUkNfRElTUDY0IEJGRF9SRUxPQ182NF9QQ1JFTAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQsCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwLAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0LAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0LAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0LAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIsCi0KLS8qIFNQQVJDIGxpdHRsZSBlbmRpYW4gcmVsb2NhdGlvbiAqLwotICBCRkRfUkVMT0NfU1BBUkNfUkVWMzIsCi0KLS8qIEFscGhhIEVDT0ZGIGFuZCBFTEYgcmVsb2NhdGlvbnMuICBTb21lIG9mIHRoZXNlIHRyZWF0IHRoZSBzeW1ib2wgb3IKLSJhZGRlbmQiIGluIHNvbWUgc3BlY2lhbCB3YXkuCi1Gb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLXdyaXRpbmc7IHdoZW4gcmVhZGluZywgaXQgd2lsbCBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICBUaGUKLWFkZGVuZCBpcyB0aGUgZGlzcGxhY2VtZW50IGluIGJ5dGVzIG9mIHRoZSAibGRhIiBpbnN0cnVjdGlvbiBmcm9tCi10aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2LAotCi0vKiBGb3IgR1BESVNQX0xPMTYgKCJpZ25vcmUiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBoYW5kbGVkIGFzCi13aXRoIEdQRElTUF9ISTE2IHJlbG9jcy4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcgdGhlCi1yZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi1yZWFkaW5nLCBmb3IgY29udmVuaWVuY2UuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNiwKLQotLyogVGhlIEVMRiBHUERJU1AgcmVsb2NhdGlvbiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBHUERJU1BfSEkxNgotcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLXJlbG9jYXRpb24uICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1AsCi0KLS8qIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLXRoZSBhc3NlbWJsZXIgdHVybnMgaXQgaW50byBhIExEUSBpbnN0cnVjdGlvbiB0byBsb2FkIHRoZSBhZGRyZXNzIG9mCi10aGUgc3ltYm9sLCBhbmQgdGhlbiBmaWxscyBpbiBhIHJlZ2lzdGVyIGluIHRoZSByZWFsIGluc3RydWN0aW9uLgotCi1UaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotc2VjdGlvbiBzeW1ib2wuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nLCBidXQgaXMgZmlsbGVkCi1pbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24gcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLCBhcyB3aXRoIHRoZQotR1BESVNQX0xPMTYgcmVsb2MuCi0KLVRoZSBFTEZfTElURVJBTCByZWxvYyBpcyBzb21ld2hlcmUgYmV0d2VlbiAxNl9HT1RPRkYgYW5kIEdQRElTUF9MTzE2LgotSXQgc2hvdWxkIHJlZmVyIHRvIHRoZSBzeW1ib2wgdG8gYmUgcmVmZXJlbmNlZCwgYXMgd2l0aCAxNl9HT1RPRkYsCi1idXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotc2VjdGlvbiwgYnV0IHJlbGF0aXZlIHRvIHRoZSBHUCB2YWx1ZSBjaG9zZW4gZm9yIHRoZSBmaWxlIGR1cmluZyB0aGUKLWZpbmFsIGxpbmsgc3RhZ2UuCi0KLVRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi1pbmZvcm1hdGlvbiB0byB0aGUgbGlua2VyIHRoYXQgaXQgbWlnaHQgYmUgYWJsZSB0byB1c2UgdG8gb3B0aW1pemUKLWF3YXkgc29tZSBsaXRlcmFsIHNlY3Rpb24gcmVmZXJlbmNlcy4gIFRoZSBzeW1ib2wgaXMgaWdub3JlZCAocmVhZAotYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLW9mIGluc3RydWN0aW9uIHVzaW5nIHRoZSByZWdpc3RlcjoKLTEgLSAibWVtb3J5IiBmbXQgaW5zbgotMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0zIC0ganNyICh0YXJnZXQgb2YgYnJhbmNoKQotCi1UaGUgR05VIGxpbmtlciBjdXJyZW50bHkgZG9lc24ndCBkbyBhbnkgb2YgdGhpcyBvcHRpbWl6aW5nLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTCwKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFLAotCi0vKiBUaGUgSElOVCByZWxvY2F0aW9uIGluZGljYXRlcyBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCBpbnRvIHRoZQotImhpbnQiIGZpZWxkIG9mIGEgam1wL2pzci9yZXQgaW5zdHJ1Y3Rpb24sIGZvciBwb3NzaWJsZSBicmFuY2gtCi1wcmVkaWN0aW9uIGxvZ2ljIHdoaWNoIG1heSBiZSBwcm92aWRlZCBvbiBzb21lIHByb2Nlc3NvcnMuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9ISU5ULAotCi0vKiBUaGUgTElOS0FHRSByZWxvY2F0aW9uIG91dHB1dHMgYSBsaW5rYWdlIHBhaXIgaW4gdGhlIG9iamVjdCBmaWxlLAotd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFLAotCi0vKiBUaGUgQ09ERUFERFIgcmVsb2NhdGlvbiBvdXRwdXRzIGEgU1RPX0NBIGluIHRoZSBvYmplY3QgZmlsZSwKLXdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIsCi0KLS8qIEJpdHMgMjcuLjIgb2YgdGhlIHJlbG9jYXRpb24gYWRkcmVzcyBzaGlmdGVkIHJpZ2h0IDIgYml0czsKLXNpbXBsZSByZWxvYyBvdGhlcndpc2UuICovCi0gIEJGRF9SRUxPQ19NSVBTX0pNUCwKLQotLyogVGhlIE1JUFMxNiBqdW1wIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTUlQUzE2X0pNUCwKLQotLyogTUlQUzE2IEdQIHJlbGF0aXZlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMLAotCi0vKiBIaWdoIDE2IGJpdHMgb2YgMzItYml0IHZhbHVlOyBzaW1wbGUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19ISTE2LAotCi0vKiBIaWdoIDE2IGJpdHMgb2YgMzItYml0IHZhbHVlIGJ1dCB0aGUgbG93IDE2IGJpdHMgd2lsbCBiZSBzaWduCi1leHRlbmRlZCBhbmQgYWRkZWQgdG8gZm9ybSB0aGUgZmluYWwgcmVzdWx0LiAgSWYgdGhlIGxvdyAxNgotYml0cyBmb3JtIGEgbmVnYXRpdmUgbnVtYmVyLCB3ZSBuZWVkIHRvIGFkZCBvbmUgdG8gdGhlIGhpZ2ggdmFsdWUKLXRvIGNvbXBlbnNhdGUgZm9yIHRoZSBib3Jyb3cgd2hlbiB0aGUgbG93IGJpdHMgYXJlIGFkZGVkLiAqLwotICBCRkRfUkVMT0NfSEkxNl9TLAotCi0vKiBMb3cgMTYgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0xPMTYsCi0KLS8qIExpa2UgQkZEX1JFTE9DX0hJMTZfUywgYnV0IFBDIHJlbGF0aXZlLiAqLwotICBCRkRfUkVMT0NfUENSRUxfSEkxNl9TLAotCi0vKiBMaWtlIEJGRF9SRUxPQ19MTzE2LCBidXQgUEMgcmVsYXRpdmUuICovCi0gIEJGRF9SRUxPQ19QQ1JFTF9MTzE2LAotCi0vKiBSZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBnbG9iYWwgcG9pbnRlci4gKi8KLSNkZWZpbmUgQkZEX1JFTE9DX01JUFNfR1BSRUwgQkZEX1JFTE9DX0dQUkVMMTYKLQotLyogUmVsb2NhdGlvbiBhZ2FpbnN0IGEgTUlQUyBsaXRlcmFsIHNlY3Rpb24uICovCi0gIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsCi0KLS8qIE1JUFMgRUxGIHJlbG9jYXRpb25zLiAqLwotICBCRkRfUkVMT0NfTUlQU19HT1QxNiwKLSAgQkZEX1JFTE9DX01JUFNfQ0FMTDE2LAotI2RlZmluZSBCRkRfUkVMT0NfTUlQU19HUFJFTDMyIEJGRF9SRUxPQ19HUFJFTDMyCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LAotICBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwKLSAgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYsCi0gIEJGRF9SRUxPQ19NSVBTX1NVQiwKLSAgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNULAotICBCRkRfUkVMT0NfTUlQU19HT1RfRElTUCwKLQotCi0vKiBpMzg2L2VsZiByZWxvY2F0aW9ucyAqLwotICBCRkRfUkVMT0NfMzg2X0dPVDMyLAotICBCRkRfUkVMT0NfMzg2X1BMVDMyLAotICBCRkRfUkVMT0NfMzg2X0NPUFksCi0gIEJGRF9SRUxPQ18zODZfR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ18zODZfSlVNUF9TTE9ULAotICBCRkRfUkVMT0NfMzg2X1JFTEFUSVZFLAotICBCRkRfUkVMT0NfMzg2X0dPVE9GRiwKLSAgQkZEX1JFTE9DXzM4Nl9HT1RQQywKLQotLyogbnMzMmsgcmVsb2NhdGlvbnMgKi8KLSAgQkZEX1JFTE9DX05TMzJLX0lNTV84LAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2LAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyLAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMLAotCi0vKiBQb3dlcihyczYwMDApIGFuZCBQb3dlclBDIHJlbG9jYXRpb25zLiAqLwotICBCRkRfUkVMT0NfUFBDX0IyNiwKLSAgQkZEX1JFTE9DX1BQQ19CQTI2LAotICBCRkRfUkVMT0NfUFBDX1RPQzE2LAotICBCRkRfUkVMT0NfUFBDX0IxNiwKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4sCi0gIEJGRF9SRUxPQ19QUENfQkExNiwKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4sCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19DT1BZLAotICBCRkRfUkVMT0NfUFBDX0dMT0JfREFULAotICBCRkRfUkVMT0NfUFBDX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfUFBDX1JFTEFUSVZFLAotICBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQywKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTywKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMLAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGLAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8sCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJLAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRCwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBLAotCi0vKiBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIHRvIGJ1aWxkIGEgY29udHJ1Y3RvciB0YWJsZSAtIGF0IHRoZSBtb21lbnQKLXByb2JhYmx5IGEgMzIgYml0IHdpZGUgYWJzb2x1dGUgcmVsb2NhdGlvbiwgYnV0IHRoZSB0YXJnZXQgY2FuIGNob29zZS4KLUl0IGdlbmVyYWxseSBkb2VzIG1hcCB0byBvbmUgb2YgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuICovCi0gIEJGRF9SRUxPQ19DVE9SLAotCi0vKiBBUk0gMjYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLW5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwKLQotLyogVGhlc2UgcmVsb2NzIGFyZSBvbmx5IHVzZWQgd2l0aGluIHRoZSBBUk0gYXNzZW1ibGVyLiAgVGhleSBhcmUgbm90Ci0oYXQgcHJlc2VudCkgd3JpdHRlbiB0byBhbnkgb2JqZWN0IGZpbGVzLiAqLwotICBCRkRfUkVMT0NfQVJNX0lNTUVESUFURSwKLSAgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURSwKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLAotICBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9TV0ksCi0gIEJGRF9SRUxPQ19BUk1fTVVMVEksCi0gIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9BRFJfSU1NLAotICBCRkRfUkVMT0NfQVJNX0xEUl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fTElURVJBTCwKLSAgQkZEX1JFTE9DX0FSTV9JTl9QT09MLAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04LAotICBCRkRfUkVMT0NfQVJNX0hXTElURVJBTCwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQsCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NLAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZULAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwKLSAgQkZEX1JFTE9DX0FSTV9HT1QxMiwKLSAgQkZEX1JFTE9DX0FSTV9HT1QzMiwKLSAgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsCi0gIEJGRF9SRUxPQ19BUk1fQ09QWSwKLSAgQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX0FSTV9QTFQzMiwKLSAgQkZEX1JFTE9DX0FSTV9SRUxBVElWRSwKLSAgQkZEX1JFTE9DX0FSTV9HT1RPRkYsCi0gIEJGRF9SRUxPQ19BUk1fR09UUEMsCi0KLS8qIEhpdGFjaGkgU0ggcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLiAqLwotICBCRkRfUkVMT0NfU0hfUENESVNQOEJZMiwKLSAgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyLAotICBCRkRfUkVMT0NfU0hfSU1NNCwKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTIsCi0gIEJGRF9SRUxPQ19TSF9JTU00Qlk0LAotICBCRkRfUkVMT0NfU0hfSU1NOCwKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTIsCi0gIEJGRF9SRUxPQ19TSF9JTU04Qlk0LAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LAotICBCRkRfUkVMT0NfU0hfU1dJVENIMTYsCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gzMiwKLSAgQkZEX1JFTE9DX1NIX1VTRVMsCi0gIEJGRF9SRUxPQ19TSF9DT1VOVCwKLSAgQkZEX1JFTE9DX1NIX0FMSUdOLAotICBCRkRfUkVMT0NfU0hfQ09ERSwKLSAgQkZEX1JFTE9DX1NIX0RBVEEsCi0gIEJGRF9SRUxPQ19TSF9MQUJFTCwKLQotLyogVGh1bWIgMjMtLCAxMi0gYW5kIDktYml0IHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgVGhlIGxvd2VzdCBiaXQgbXVzdAotYmUgemVybyBhbmQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywKLQotLyogQXJnb25hdXQgUklTQyBDb3JlIChBUkMpIHJlbG9jcy4KLUFSQyAyMiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQotbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyMCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyNgotdGhyb3VnaCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsCi0KLS8qIEFSQyAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZSBub3QKLXN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyNCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyMwotdGhyb3VnaCAwLiAqLwotICBCRkRfUkVMT0NfQVJDX0IyNiwKLQotLyogTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLVRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsCi0KLS8qIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi1UaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgcmVsb2MKLWV4Y2VwdCBpdCBpcyBpbiB0aGUgbGVmdCBjb250YWluZXIsIGkuZS4sCi1zaGlmdGVkIGxlZnQgMTUgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMTBWXzE4LAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwsCi0KLS8qIE1pdHN1YmlzaGkgRDMwViByZWxvY3MuCi1UaGlzIGlzIGEgNi1iaXQgYWJzb2x1dGUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19EMzBWXzYsCi0KLS8qIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLWFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLW9mIHRoZSBjb250YWluZXIuICovCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUiwKLQotLyogVGhpcyBpcyBhIDEyLWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoIHRoZSAKLXJpZ2h0IDMgYml0c2Fzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMTUsCi0KLS8qIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLWFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLW9mIHRoZSBjb250YWluZXIuICovCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IGFic29sdXRlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMjEsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUwsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiwKLQotLyogVGhpcyBpcyBhIDMyLWJpdCBhYnNvbHV0ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMzIsCi0KLS8qIFRoaXMgaXMgYSAzMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMLAotCi0vKiBNaXRzdWJpc2hpIE0zMlIgcmVsb2NzLgotVGhpcyBpcyBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAqLwotICBCRkRfUkVMT0NfTTMyUl8yNCwKLQotLyogVGhpcyBpcyBhIDEwLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfMThfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAyNi1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKLXVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyB1bnNpZ25lZC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8sCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKLXVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyBzaWduZWQuICovCi0gIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPLAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGxvd2VyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4gKi8KLSAgQkZEX1JFTE9DX00zMlJfTE8xNiwKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBzbWFsbCBkYXRhIGFyZWEgb2Zmc2V0IGZvciB1c2UgaW4KLWFkZDMsIGxvYWQsIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NMzJSX1NEQTE2LAotCi0vKiBUaGlzIGlzIGEgOS1iaXQgcmVsb2MgKi8KLSAgQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDIyLWJpdCByZWxvYyAqLwotICBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi1zaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLXplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYW4gOCBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDYgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLXRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGFuIDhiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDcgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgNyBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgNSBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDQgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLWJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi1iaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULAotCi0KLS8qIFRoaXMgaXMgYSAzMmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi1pbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi1pbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01OMTAzMDBfMTZfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSA4Yml0IERQIHJlbG9jIGZvciB0aGUgdG1zMzIwYzMwLCB3aGVyZSB0aGUgbW9zdAotc2lnbmlmaWNhbnQgOCBiaXRzIG9mIGEgMjQgYml0IHdvcmQgYXJlIHBsYWNlZCBpbnRvIHRoZSBsZWFzdAotc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSBvcGNvZGUuICovCi0gIEJGRF9SRUxPQ19USUMzMF9MRFAsCi0KLS8qIFRoaXMgaXMgYSA0OCBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDMyIGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzQ4LAotCi0vKiBUaGlzIGlzIGEgMzIgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAyMCBiaXRzIHNwbGl0IHVwIGludG8KLXR3byBzZWN0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfMjAsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgNiBiaXQgd29yZCBvZmZzZXQgaW4KLTQgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfNl9JTl80LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhbiA4IGJpdCBieXRlIG9mZnNldAotaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzhfSU5fOCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBzaG9ydCBvZmZzZXQKLWludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF85X0lOXzgsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTAgYml0IHdvcmQgb2Zmc2V0Ci1pbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBwYyByZWxhdGl2ZQotc2hvcnQgb2Zmc2V0IGludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF85X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEyIGJpdCBwYyByZWxhdGl2ZQotc2hvcnQgb2Zmc2V0IGludG8gMTEgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwsCi0KLS8qIE1vdG9yb2xhIE1jb3JlIHJlbG9jYXRpb25zLiAqLwotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCwKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyLAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMiwKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyLAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLAotICBCRkRfUkVMT0NfTUNPUkVfUlZBLAotCi0vKiBUaGVzZSB0d28gcmVsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGxpbmtlciB0byBkZXRlcm1pbmUgd2hpY2ggb2YgCi10aGUgZW50cmllcyBpbiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGFyZSBhY3R1YWxseSB1c2VkLiAgV2hlbgotdGhlIC0tZ2Mtc2VjdGlvbnMgb3B0aW9uIGlzIGdpdmVuLCB0aGUgbGlua2VyIHdpbGwgemVybyBvdXQgdGhlIGVudHJpZXMKLXRoYXQgYXJlIG5vdCB1c2VkLCBzbyB0aGF0IHRoZSBjb2RlIGZvciB0aG9zZSBmdW5jdGlvbnMgbmVlZCBub3QgYmUKLWluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLVZUQUJMRV9JTkhFUklUIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdG8gdGhlCi1saW5rZXIgdGhlIGluaGVyaXRlbmNlIHRyZWUgb2YgYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gIFRoZQotcmVsb2NhdGlvbidzIHN5bWJvbCBzaG91bGQgYmUgdGhlIHBhcmVudCBjbGFzcycgdnRhYmxlLCBhbmQgdGhlCi1yZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhdGVkIGF0IHRoZSBjaGlsZCB2dGFibGUuCi0KLVZUQUJMRV9FTlRSWSBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgdXNlIG9mIGEKLXZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkuICBUaGUgcmVsb2MncyBzeW1ib2wgc2hvdWxkIHJlZmVyIHRvIHRoZQotdGFibGUgb2YgdGhlIGNsYXNzIG1lbnRpb25lZCBpbiB0aGUgY29kZS4gIE9mZiBvZiB0aGF0IGJhc2UsIGFuIG9mZnNldAotZGVzY3JpYmVzIHRoZSBlbnRyeSB0aGF0IGlzIGJlaW5nIHVzZWQuICBGb3IgUmVsYSBob3N0cywgdGhpcyBvZmZzZXQgCi1pcyBzdG9yZWQgaW4gdGhlIHJlbG9jJ3MgYWRkZW5kLiAgRm9yIFJlbCBob3N0cywgd2UgYXJlIGZvcmNlZCB0byBwdXQKLXRoaXMgb2Zmc2V0IGluIHRoZSByZWxvYydzIHNlY3Rpb24gb2Zmc2V0LiAqLwotICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsCi0gIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksCi0gIEJGRF9SRUxPQ19VTlVTRUQgfTsKLXR5cGVkZWYgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZTsKLXJlbG9jX2hvd3RvX3R5cGUgKgotCi1iZmRfcmVsb2NfdHlwZV9sb29rdXAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAgUEFSQU1TICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotCi10eXBlZGVmIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkKLXsKLSAgICAgICAgLyogQSBwb2ludGVyIHRvIHRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc3ltYm9sLiBUaGlzIGluZm9ybWF0aW9uCi0gICAgICAgICAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgYSBiYWNrIGVuZCBjYW4gd29yayBvdXQgd2hhdCBhZGRpdGlvbmFsCi0gICAgICAgICAgaW5mb3JtYXRpb24gKGludmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24gd3JpdGVyKSBpcyBjYXJyaWVkCi0gICAgICAgICAgd2l0aCB0aGUgc3ltYm9sLgotCi0gICAgICAgICAgVGhpcyBmaWVsZCBpcyAqYWxtb3N0KiByZWR1bmRhbnQsIHNpbmNlIHlvdSBjYW4gdXNlIHNlY3Rpb24tPm93bmVyCi0gICAgICAgICAgaW5zdGVhZCwgZXhjZXB0IHRoYXQgc29tZSBzeW1ib2xzIHBvaW50IHRvIHRoZSBnbG9iYWwgc2VjdGlvbnMKLSAgICAgICAgICBiZmRfe2Ficyxjb20sdW5kfV9zZWN0aW9uLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBtYWtpbmcKLSAgICAgICAgICB0aGVzZSBnbG9iYWxzIGJlIHBlci1iZmQgKG9yIHBlci10YXJnZXQtZmxhdm9yKS4gIEZJWE1FLiAqLwotCi0gIHN0cnVjdCBfYmZkICp0aGVfYmZkOyAgLyogVXNlIGJmZF9hc3ltYm9sX2JmZChzeW0pIHRvIGFjY2VzcyB0aGlzIGZpZWxkLiAqLwotCi0gICAgICAgIC8qIFRoZSB0ZXh0IG9mIHRoZSBzeW1ib2wuIFRoZSBuYW1lIGlzIGxlZnQgYWxvbmUsIGFuZCBub3QgY29waWVkOyB0aGUKLSAgICAgICAgICBhcHBsaWNhdGlvbiBtYXkgbm90IGFsdGVyIGl0LiAqLwotICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgdW5pb24gb2YgYQotICAgICAgICAgIG51bWVyaWMgdmFsdWUgd2l0aCBhIHBvaW50ZXIsIHNpbmNlIHNvbWUgZmxhZ3MgaW5kaWNhdGUgdGhhdAotICAgICAgICAgIGEgcG9pbnRlciB0byBhbm90aGVyIHN5bWJvbCBpcyBzdG9yZWQgaGVyZS4gICovCi0gIHN5bXZhbHVlIHZhbHVlOwotCi0gICAgICAgIC8qIEF0dHJpYnV0ZXMgb2YgYSBzeW1ib2w6ICovCi0KLSNkZWZpbmUgQlNGX05PX0ZMQUdTICAgIDB4MDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBsb2NhbCBzY29wZTsgPDxzdGF0aWM+PiBpbiA8PEM+Pi4gVGhlIHZhbHVlCi0gICAgICAgICAgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLwotI2RlZmluZSBCU0ZfTE9DQUwgICAgICAweDAxCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlOyBpbml0aWFsaXplZCBkYXRhIGluIDw8Qz4+LiBUaGUKLSAgICAgICAgICB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCi0jZGVmaW5lIEJTRl9HTE9CQUwgICAgIDB4MDIKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGUgYW5kIGlzIGV4cG9ydGVkLiBUaGUgdmFsdWUgaXMKLSAgICAgICAgICB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCi0jZGVmaW5lIEJTRl9FWFBPUlQgICAgIEJTRl9HTE9CQUwgIC8qIG5vIHJlYWwgZGlmZmVyZW5jZSAqLwotCi0gICAgICAgIC8qIEEgbm9ybWFsIEMgc3ltYm9sIHdvdWxkIGJlIG9uZSBvZjoKLSAgICAgICAgICA8PEJTRl9MT0NBTD4+LCA8PEJTRl9GT1JUX0NPTU0+PiwgIDw8QlNGX1VOREVGSU5FRD4+IG9yCi0gICAgICAgICAgPDxCU0ZfR0xPQkFMPj4gKi8KLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHJlY29yZC4gVGhlIHZhbHVlIGhhcyBhbiBhcmJpdGFyeQotICAgICAgICAgIG1lYW5pbmcuICovCi0jZGVmaW5lIEJTRl9ERUJVR0dJTkcgIDB4MDgKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gIFVzZWQgaW4gRUxGLAotICAgICAgICAgIHBlcmhhcHMgb3RoZXJzIHNvbWVkYXkuICAqLwotI2RlZmluZSBCU0ZfRlVOQ1RJT04gICAgMHgxMAotCi0gICAgICAgIC8qIFVzZWQgYnkgdGhlIGxpbmtlci4gKi8KLSNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MjAKLSNkZWZpbmUgQlNGX0tFRVBfRyAgICAgIDB4NDAKLQotICAgICAgICAvKiBBIHdlYWsgZ2xvYmFsIHN5bWJvbCwgb3ZlcnJpZGFibGUgd2l0aG91dCB3YXJuaW5ncyBieQotICAgICAgICAgIGEgcmVndWxhciBnbG9iYWwgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICAqLwotI2RlZmluZSBCU0ZfV0VBSyAgICAgICAgMHg4MAotCi0gICAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIHRvIHBvaW50IHRvIGEgc2VjdGlvbiwgZS5nLiBFTEYncwotICAgICAgICAgIFNUVF9TRUNUSU9OIHN5bWJvbHMuICAqLwotI2RlZmluZSBCU0ZfU0VDVElPTl9TWU0gMHgxMDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIHVzZWQgdG8gYmUgYSBjb21tb24gc3ltYm9sLCBidXQgbm93IGl0IGlzCi0gICAgICAgICAgYWxsb2NhdGVkLiAqLwotI2RlZmluZSBCU0ZfT0xEX0NPTU1PTiAgMHgyMDAKLQotICAgICAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgY29tbW9uIGRhdGEuICovCi0jZGVmaW5lIEJGRF9GT1JUX0NPTU1fREVGQVVMVF9WQUxVRSAwCi0KLSAgICAgICAgLyogSW4gc29tZSBmaWxlcyB0aGUgdHlwZSBvZiBhIHN5bWJvbCBzb21ldGltZXMgYWx0ZXJzIGl0cwotICAgICAgICAgIGxvY2F0aW9uIGluIGFuIG91dHB1dCBmaWxlIC0gaWUgaW4gY29mZiBhIDw8SVNGQ04+PiBzeW1ib2wKLSAgICAgICAgICB3aGljaCBpcyBhbHNvIDw8Q19FWFQ+PiBzeW1ib2wgYXBwZWFycyB3aGVyZSBpdCB3YXMKLSAgICAgICAgICBkZWNsYXJlZCBhbmQgbm90IGF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgVGhpcyBiaXQgaXMgc2V0Ci0gICAgICAgICAgYnkgdGhlIHRhcmdldCBCRkQgcGFydCB0byBjb252ZXkgdGhpcyBpbmZvcm1hdGlvbi4gKi8KLQotI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgdGhlIGxhYmVsIG9mIGNvbnN0cnVjdG9yIHNlY3Rpb24uICovCi0jZGVmaW5lIEJTRl9DT05TVFJVQ1RPUiAgIDB4ODAwCi0KLSAgICAgICAgLyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5hbWUgaXMgYQotICAgICAgICAgIHdhcm5pbmcuICBUaGUgbmFtZSBvZiB0aGUgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuIGFib3V0OwotICAgICAgICAgIGlmIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0Ci0gICAgICAgICAgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkIGJ5IHRoZSBsaW5rZXIuICovCi0jZGVmaW5lIEJTRl9XQVJOSU5HICAgICAgIDB4MTAwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgaW5kaXJlY3QuICBUaGlzIHN5bWJvbCBpcyBhbiBpbmRpcmVjdAotICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQgc3ltYm9sLiAqLwotI2RlZmluZSBCU0ZfSU5ESVJFQ1QgICAgICAweDIwMDAKLQotICAgICAgICAvKiBCU0ZfRklMRSBtYXJrcyBzeW1ib2xzIHRoYXQgY29udGFpbiBhIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZAotICAgICAgICAgIGZvciBFTEYgU1RUX0ZJTEUgc3ltYm9scy4gICovCi0jZGVmaW5lIEJTRl9GSUxFICAgICAgICAgIDB4NDAwMAotCi0gICAgICAgIC8qIFN5bWJvbCBpcyBmcm9tIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEJTRl9EWU5BTUlDICAgICAgIDB4ODAwMAotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgZGVub3RlcyBhIGRhdGEgb2JqZWN0LiAgVXNlZCBpbiBFTEYsIGFuZCBwZXJoYXBzCi0gICAgICAgICAgb3RoZXJzIHNvbWVkYXkuICAqLwotI2RlZmluZSBCU0ZfT0JKRUNUICAgICAgICAweDEwMDAwCi0KLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgICAgLyogQSBwb2ludGVyIHRvIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoaXMgc3ltYm9sIGlzCi0gICAgICAgICAgcmVsYXRpdmUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIG5vbiBOVUxMLCB0aGVyZSBhcmUgc3BlY2lhbAotICAgICAgICAgIHNlY3Rpb25zIGZvciB1bmRlZmluZWQgYW5kIGFic29sdXRlIHN5bWJvbHMuICAqLwotICBzdHJ1Y3Qgc2VjICpzZWN0aW9uOwotCi0gICAgICAgIC8qIEJhY2sgZW5kIHNwZWNpYWwgZGF0YS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgUFRSIHA7Ci0gICAgICBiZmRfdm1hIGk7Ci0gICAgfSB1ZGF0YTsKLQotfSBhc3ltYm9sOwotI2RlZmluZSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIChhYmZkKSkKLWJvb2xlYW4gCi1iZmRfaXNfbG9jYWxfbGFiZWwgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICpzeW0pKTsKLQotYm9vbGVhbiAKLWJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqbmFtZSkpOwotCi0jZGVmaW5lIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lKGFiZmQsIG5hbWUpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSwgKGFiZmQsIG5hbWUpKQotI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYihhYmZkLCBsb2NhdGlvbikgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiLFwKLSAgICAgICAgICAgICAgICAgIChhYmZkLCBsb2NhdGlvbikpCi1ib29sZWFuIAotYmZkX3NldF9zeW10YWIgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uLCB1bnNpZ25lZCBpbnQgY291bnQpKTsKLQotdm9pZCAKLWJmZF9wcmludF9zeW1ib2xfdmFuZGYgUEFSQU1TICgoUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCkpOwotCi0jZGVmaW5lIGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZW1wdHlfc3ltYm9sLCAoYWJmZCkpCi0jZGVmaW5lIGJmZF9tYWtlX2RlYnVnX3N5bWJvbChhYmZkLHB0cixzaXplKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoYWJmZCwgcHRyLCBzaXplKSkKLWludCAKLWJmZF9kZWNvZGVfc3ltY2xhc3MgUEFSQU1TICgoYXN5bWJvbCAqc3ltYm9sKSk7Ci0KLXZvaWQgCi1iZmRfc3ltYm9sX2luZm8gUEFSQU1TICgoYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYXN5bWJvbCAqaXN5bSwgYmZkICpvYmZkLCBhc3ltYm9sICpvc3ltKSk7Ci0KLSNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSwgXAotICAgICAgICAgICAgICAgKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpKQotc3RydWN0IF9iZmQgCi17Ci0gICAgIC8qIFRoZSBmaWxlbmFtZSB0aGUgYXBwbGljYXRpb24gb3BlbmVkIHRoZSBCRkQgd2l0aC4gICovCi0gICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAotCi0gICAgIC8qIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGp1bXAgdGFibGUuICAgICAgICAgICAgICovCi0gICAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnh2ZWM7Ci0KLSAgICAgLyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0Ci0gICAgICAgaW5jbHVkZXMgYDw8YmZkLmg+PicsIElPU1RSRUFNIGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgImNoYXIKLSAgICAgICAqIiwgYW5kIE1USU1FIGFzIGEgImxvbmciLiAgVGhlaXIgY29ycmVjdCB0eXBlcywgdG8gd2hpY2ggdGhleQotICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCi0gICAgICAgaXMgdGhlIHJlc3VsdCBvZiBhbiBmb3BlbiBvbiB0aGUgZmlsZW5hbWUuICBIb3dldmVyLCBpZiB0aGUKLSAgICAgICBCRkRfSU5fTUVNT1JZIGZsYWcgaXMgc2V0LCB0aGVuIGlvc3RyZWFtIGlzIGFjdHVhbGx5IGEgcG9pbnRlcgotICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotICAgIFBUUiBpb3N0cmVhbTsKLQotICAgICAvKiBJcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIGNhY2hlZD8gIFRoYXQgaXMsIGNhbiBpdCBiZSBjbG9zZWQgYXMKLSAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICovCi0KLSAgICBib29sZWFuIGNhY2hlYWJsZTsKLQotICAgICAvKiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQotICAgICAgIEJGRCB3YXMgb3BlbmVkLiBUaGlzIGlzIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1hdGNoaW5nIGFsZ29yaXRobQotICAgICAgIHRvIHVzZSB0byBjaG9vc2UgdGhlIGJhY2sgZW5kLiAqLwotCi0gICAgYm9vbGVhbiB0YXJnZXRfZGVmYXVsdGVkOwotCi0gICAgIC8qIFRoZSBjYWNoaW5nIHJvdXRpbmVzIHVzZSB0aGVzZSB0byBtYWludGFpbiBhCi0gICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKi8KLQotICAgIHN0cnVjdCBfYmZkICpscnVfcHJldiwgKmxydV9uZXh0OwotCi0gICAgIC8qIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKLSAgICAgICBzdGF0ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmlsZSBoZXJlOiAqLwotCi0gICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKLQotICAgICAvKiBhbmQgaGVyZTogKGBgb25jZScnIG1lYW5zIGF0IGxlYXN0IG9uY2UpICovCi0KLSAgICBib29sZWFuIG9wZW5lZF9vbmNlOwotCi0gICAgIC8qIFNldCBpZiB3ZSBoYXZlIGEgbG9jYWxseSBtYWludGFpbmVkIG10aW1lIHZhbHVlLCByYXRoZXIgdGhhbgotICAgICAgIGdldHRpbmcgaXQgZnJvbSB0aGUgZmlsZSBlYWNoIHRpbWU6ICovCi0KLSAgICBib29sZWFuIG10aW1lX3NldDsKLQotICAgICAvKiBGaWxlIG1vZGlmaWVkIHRpbWUsIGlmIG10aW1lX3NldCBpcyB0cnVlOiAqLwotCi0gICAgbG9uZyBtdGltZTsgICAgICAgICAgCi0KLSAgICAgLyogUmVzZXJ2ZWQgZm9yIGFuIHVuaW1wbGVtZW50ZWQgZmlsZSBsb2NraW5nIGV4dGVuc2lvbi4qLwotCi0gICAgaW50IGlmZDsKLQotICAgICAvKiBUaGUgZm9ybWF0IHdoaWNoIGJlbG9uZ3MgdG8gdGhlIEJGRC4gKG9iamVjdCwgY29yZSwgZXRjLikgKi8KLQotICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotCi0gICAgIC8qIFRoZSBkaXJlY3Rpb24gdGhlIEJGRCB3YXMgb3BlbmVkIHdpdGgqLwotCi0gICAgZW51bSBiZmRfZGlyZWN0aW9uIHtub19kaXJlY3Rpb24gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9kaXJlY3Rpb24gPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhfZGlyZWN0aW9uID0gM30gZGlyZWN0aW9uOwotCi0gICAgIC8qIEZvcm1hdF9zcGVjaWZpYyBmbGFncyovCi0KLSAgICBmbGFnd29yZCBmbGFnczsgICAgICAgICAgICAgIAotCi0gICAgIC8qIEN1cnJlbnRseSBteV9hcmNoaXZlIGlzIHRlc3RlZCBiZWZvcmUgYWRkaW5nIG9yaWdpbiB0bwotICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgotICAgICAgIG9yaWdpbiwgd2l0aCBvcmlnaW4gc2V0IHRvIDAgZm9yIG5vbiBhcmNoaXZlIGZpbGVzLiAgICovCi0KLSAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAotCi0gICAgIC8qIFJlbWVtYmVyIHdoZW4gb3V0cHV0IGhhcyBiZWd1biwgdG8gc3RvcCBzdHJhbmdlIHRoaW5ncwotICAgICAgIGZyb20gaGFwcGVuaW5nLiAqLwotICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKLQotICAgICAvKiBQb2ludGVyIHRvIGxpbmtlZCBsaXN0IG9mIHNlY3Rpb25zKi8KLSAgICBzdHJ1Y3Qgc2VjICAqc2VjdGlvbnM7Ci0KLSAgICAgLyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqLwotICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OwotCi0gICAgIC8qIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBvYmplY3QgZmlsZXM6IAotICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqLwotICAgIGJmZF92bWEgc3RhcnRfYWRkcmVzczsKLQotICAgICAvKiBVc2VkIGZvciBpbnB1dCBhbmQgb3V0cHV0Ki8KLSAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci0KLSAgICAgLyogU3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgQkZEICh3aXRoIHN5bWNvdW50IGVudHJpZXMpICovCi0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKipvdXRzeW1ib2xzOyAgICAgICAgICAgICAKLQotICAgICAvKiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qLwotICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoX2luZm87Ci0KLSAgICAgLyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIGFyY2hpdmVzOiovCi0gICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKLSAgICBzdHJ1Y3QgX2JmZCAqbXlfYXJjaGl2ZTsgICAgICAvKiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICovCi0gICAgc3RydWN0IF9iZmQgKm5leHQ7ICAgICAgICAgICAgLyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKi8KLSAgICBzdHJ1Y3QgX2JmZCAqYXJjaGl2ZV9oZWFkOyAgICAvKiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKi8KLSAgICBib29sZWFuIGhhc19hcm1hcDsgICAgICAgICAgIAotCi0gICAgIC8qIEEgY2hhaW4gb2YgQkZEIHN0cnVjdHVyZXMgaW52b2x2ZWQgaW4gYSBsaW5rLiAgKi8KLSAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OwotCi0gICAgIC8qIEEgZmllbGQgdXNlZCBieSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgVGhpcyB3aWxsCi0gICAgICAgYmUgdXNlZCBvbmx5IGZvciBhcmNoaXZlIGVsZW1lbnRzLiAgKi8KLSAgICBpbnQgYXJjaGl2ZV9wYXNzOwotCi0gICAgIC8qIFVzZWQgYnkgdGhlIGJhY2sgZW5kIHRvIGhvbGQgcHJpdmF0ZSBkYXRhLiAqLwotCi0gICAgdW5pb24gCi0gICAgICB7Ci0gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqYW91dF9kYXRhOwotICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKLSAgICAgIHN0cnVjdCBfb2FzeXNfZGF0YSAqb2FzeXNfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgKm9hc3lzX2FyX2RhdGE7Ci0gICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBwZV90ZGF0YSAqcGVfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmX29ial9kYXRhOwotICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBpZWVlX2RhdGFfc3RydWN0ICppZWVlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAqaWVlZV9hcl9kYXRhOwotICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKLSAgICAgIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICppaGV4X2RhdGE7Ci0gICAgICBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0ICp0ZWtoZXhfZGF0YTsKLSAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbmxtX29ial90ZGF0YSAqbmxtX29ial9kYXRhOwotICAgICAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKmJvdXRfZGF0YTsKLSAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqc2NvNV9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqdHJhZF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKLSAgICAgIHN0cnVjdCBocHV4X2NvcmVfc3RydWN0ICpocHV4X2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICpocHBhYnNkX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqbHlueF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICpvc2ZfY29yZV9kYXRhOwotICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgdmVyc2Fkb3NfZGF0YV9zdHJ1Y3QgKnZlcnNhZG9zX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICpuZXRic2RfY29yZV9kYXRhOwotICAgICAgUFRSIGFueTsKLSAgICAgIH0gdGRhdGE7Ci0gIAotICAgICAvKiBVc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBob2xkIHByaXZhdGUgZGF0YSovCi0gICAgUFRSIHVzcmRhdGE7Ci0KLSAgIC8qIFdoZXJlIGFsbCB0aGUgYWxsb2NhdGVkIHN0dWZmIHVuZGVyIHRoaXMgQkZEIGdvZXMuICBUaGlzIGlzIGEKLSAgICAgc3RydWN0IG9iamFsbG9jICosIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mCi0gICAgIG9iamFsbG9jLmguICAqLwotICAgIFBUUiBtZW1vcnk7Ci19OwotCi10eXBlZGVmIGVudW0gYmZkX2Vycm9yCi17Ci0gIGJmZF9lcnJvcl9ub19lcnJvciA9IDAsCi0gIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKLSAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotICBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LAotICBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24sCi0gIGJmZF9lcnJvcl9ub19tZW1vcnksCi0gIGJmZF9lcnJvcl9ub19zeW1ib2xzLAotICBiZmRfZXJyb3Jfbm9fYXJtYXAsCi0gIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAotICBiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUsCi0gIGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkLAotICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAotICBiZmRfZXJyb3Jfbm9fY29udGVudHMsCi0gIGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sCi0gIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAotICBiZmRfZXJyb3JfYmFkX3ZhbHVlLAotICBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsCi0gIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCi0gIGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGUKLX0gYmZkX2Vycm9yX3R5cGU7Ci0KLWJmZF9lcnJvcl90eXBlIAotYmZkX2dldF9lcnJvciAgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIAotYmZkX3NldF9lcnJvciAgUEFSQU1TICgoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2Vycm1zZyAgUEFSQU1TICgoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKSk7Ci0KLXZvaWQgCi1iZmRfcGVycm9yICBQQVJBTVMgKChDT05TVCBjaGFyICptZXNzYWdlKSk7Ci0KLXR5cGVkZWYgdm9pZCAoKmJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgCi1iZmRfc2V0X2Vycm9yX2hhbmRsZXIgIFBBUkFNUyAoKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpKTsKLQotdm9pZCAKLWJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lICBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSAKLWJmZF9nZXRfZXJyb3JfaGFuZGxlciAgUEFSQU1TICgodm9pZCkpOwotCi1sb25nIAotYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KSk7Ci0KLWxvbmcgCi1iZmRfY2Fub25pY2FsaXplX3JlbG9jCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWMsCi0gICAgYXJlbGVudCAqKmxvYywKLSAgICBhc3ltYm9sICoqc3ltcykpOwotCi12b2lkIAotYmZkX3NldF9yZWxvYwotIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYXJlbGVudCAqKnJlbCwgdW5zaWduZWQgaW50IGNvdW50KQotICAgIAotICAgICk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X2ZpbGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi1ib29sZWFuIAotYmZkX3NldF9zdGFydF9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSB2bWEpKTsKLQotbG9uZyAKLWJmZF9nZXRfbXRpbWUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcgCi1iZmRfZ2V0X3NpemUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWludCAKLWJmZF9nZXRfZ3Bfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZCAKLWJmZF9zZXRfZ3Bfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpKSk7Ci0KLWJmZF92bWEgCi1iZmRfc2Nhbl92bWEgUEFSQU1TICgoQ09OU1QgY2hhciAqc3RyaW5nLCBDT05TVCBjaGFyICoqZW5kLCBpbnQgYmFzZSkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBvYmZkKSkKLWJvb2xlYW4gCi1iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOwotCi0jZGVmaW5lIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLSAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgXAotICAgICAgICAgICAgICAgKGliZmQsIG9iZmQpKQotYm9vbGVhbiAKLWJmZF9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLSNkZWZpbmUgYmZkX3NldF9wcml2YXRlX2ZsYWdzKGFiZmQsIGZsYWdzKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9wcml2YXRlX2ZsYWdzLCBcCi0gICAgICAgICAgICAgICAoYWJmZCwgZmxhZ3MpKQotI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2l6ZW9mX2hlYWRlcnMsIChhYmZkLCByZWxvYykpCi0KLSNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmRfbmVhcmVzdF9saW5lLCAgKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSkKLQotICAgICAgICAvKiBEbyB0aGVzZSB0aHJlZSBkbyBhbnl0aGluZyB1c2VmdWwgYXQgYWxsLCBmb3IgYW55IGJhY2sgZW5kPyAgKi8KLSNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19lbmQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCAoYWJmZCwgc2VjdGlvbikpCi0KLQotI2RlZmluZSBiZmRfc3RhdF9hcmNoX2VsdChhYmZkLCBzdGF0KSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3N0YXRfYXJjaF9lbHQsKGFiZmQsIHN0YXQpKQotCi0jZGVmaW5lIGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKGFiZmQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2gpXAotICAgICAgICBCRkRfU0VORCAoIGFiZmQsIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGFiZmQsIGFyY2gsIG1hY2gpKQotCi0jZGVmaW5lIGJmZF9yZWxheF9zZWN0aW9uKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWxheF9zZWN0aW9uLCAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikpCi0KLSNkZWZpbmUgYmZkX2djX3NlY3Rpb25zKGFiZmQsIGxpbmtfaW5mbykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2djX3NlY3Rpb25zLCAoYWJmZCwgbGlua19pbmZvKSkKLQotI2RlZmluZSBiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZShhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2FkZF9zeW1ib2xzLCAoYWJmZCwgaW5mbykpCi0KLSNkZWZpbmUgYmZkX2ZpbmFsX2xpbmsoYWJmZCwgaW5mbykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmFsX2xpbmssIChhYmZkLCBpbmZvKSkKLQotI2RlZmluZSBiZmRfZnJlZV9jYWNoZWRfaW5mbyhhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZnJlZV9jYWNoZWRfaW5mbywgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKGFiZmQsIGZpbGUpXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsIChhYmZkLCBmaWxlKSkKLQotI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKGFiZmQsIGFzeW1ib2xzKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLCAoYWJmZCwgYXN5bWJvbHMpKQotCi0jZGVmaW5lIGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZChhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MoYWJmZCwgYXJlbHMsIGFzeW1zKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIChhYmZkLCBhcmVscywgYXN5bXMpKQotCi1leHRlcm4gYmZkX2J5dGUgKmJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgICAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJmZF9ieXRlICosCi0gICAgICAgICAgICAgICAgIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotc3ltaW5kZXggCi1iZmRfZ2V0X25leHRfbWFwZW50IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3ltaW5kZXggcHJldmlvdXMsIGNhcnN5bSAqKnN5bSkpOwotCi1ib29sZWFuIAotYmZkX3NldF9hcmNoaXZlX2hlYWQgUEFSQU1TICgoYmZkICpvdXRwdXQsIGJmZCAqbmV3X2hlYWQpKTsKLQotYmZkICoKLWJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoaXZlLCBiZmQgKnByZXZpb3VzKSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWludCAKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci0KLSNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICAgICAgICAgICAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KQotCi0jaWZkZWYgREVCVUdfQkZEX1NFTkQKLSN1bmRlZiBCRkRfU0VORAotI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgKCgoYmZkKSAmJiAoYmZkKS0+eHZlYyAmJiAoYmZkKS0+eHZlYy0+bWVzc2FnZSkgPyBcCi0gICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkgOiBcCi0gICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0jZW5kaWYKLSNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAgICAgICAgICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpCi0KLSNpZmRlZiBERUJVR19CRkRfU0VORAotI3VuZGVmIEJGRF9TRU5EX0ZNVAotI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpIDogXAotICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0jZW5kaWYKLWVudW0gYmZkX2ZsYXZvdXIgewotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9zb21fZmxhdm91ciwKLSAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfdmVyc2Fkb3NfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKLX07Ci0KLWVudW0gYmZkX2VuZGlhbiB7IEJGRF9FTkRJQU5fQklHLCBCRkRfRU5ESUFOX0xJVFRMRSwgQkZEX0VORElBTl9VTktOT1dOIH07Ci0KLSAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87Ci0KLXR5cGVkZWYgc3RydWN0IGJmZF90YXJnZXQKLXsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOwotICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKLSAgZmxhZ3dvcmQgb2JqZWN0X2ZsYWdzOyAgICAgICAKLSAgZmxhZ3dvcmQgc2VjdGlvbl9mbGFnczsKLSAgY2hhciBzeW1ib2xfbGVhZGluZ19jaGFyOwotICBjaGFyIGFyX3BhZF9jaGFyOyAgICAgICAgICAgIAotICB1bnNpZ25lZCBzaG9ydCBhcl9tYXhfbmFtZWxlbjsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfNjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8xNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKigqX2JmZF9jaGVja19mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfc2V0X2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF93cml0ZV9jb250ZW50c1tiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi0gICAvKiBHZW5lcmljIGVudHJ5IHBvaW50cy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMoTkFNRSlcCi1DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKLUNBVChOQU1FLF9iZmRfZnJlZV9jYWNoZWRfaW5mbyksXAotQ0FUKE5BTUUsX25ld19zZWN0aW9uX2hvb2spLFwKLUNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAotQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKLQotICAgLyogQ2FsbGVkIHdoZW4gdGhlIEJGRCBpcyBiZWluZyBjbG9zZWQgdG8gZG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBDYWxsZWQgd2hlbiBhIG5ldyBzZWN0aW9uIGlzIGNyZWF0ZWQuICAqLwotICBib29sZWFuICAgICAgICgqX25ld19zZWN0aW9uX2hvb2spIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci0gICAvKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotICAgLyogRW50cnkgcG9pbnRzIHRvIGNvcHkgcHJpdmF0ZSBkYXRhLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKLUNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpLFwKLUNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCi0gICAvKiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgICAgdG8gYW5vdGhlci4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0gICAvKiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICAgIHRvIGEgY29tbW9uIG91dHB1dCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICAgIHRvIGFub3RoZXIuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOwotICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAotICAgICB0byBhbm90aGVyLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqLCBhc3ltYm9sICopKTsKLSAgIC8qIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9wcml2YXRlX2ZsYWdzKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLQotICAgLyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0gICAvKiBDb3JlIGZpbGUgZW50cnkgcG9pbnRzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKLUNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSxcCi1DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSxcCi1DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotICBjaGFyICogICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSBQQVJBTVMgKChiZmQgKikpOwotICBpbnQgICAgICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLSAgIC8qIEFyY2hpdmUgZW50cnkgcG9pbnRzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQVJDSElWRShOQU1FKVwKLUNBVChOQU1FLF9zbHVycF9hcm1hcCksXAotQ0FUKE5BTUUsX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpLFwKLUNBVChOQU1FLF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSksXAotQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAotQ0FUKE5BTUUsX3dyaXRlX2FybWFwKSxcCi1DQVQoTkFNRSxfcmVhZF9hcl9oZHIpLFwKLUNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKLUNBVChOQU1FLF9nZXRfZWx0X2F0X2luZGV4KSxcCi1DQVQoTkFNRSxfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KSxcCi1DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKLSAgYm9vbGVhbiAgKCpfYmZkX3NsdXJwX2FybWFwKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAoKl9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQotICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSAgdm9pZCAgICAgKCpfYmZkX3RydW5jYXRlX2FybmFtZSkgUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgY2hhciAqKSk7Ci0gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcmwgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkeCkpOwotICBQVFIgKCpfYmZkX3JlYWRfYXJfaGRyX2ZuKSBQQVJBTVMgKChiZmQgKikpOwotICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLSNkZWZpbmUgYmZkX2dldF9lbHRfYXRfaW5kZXgoYixpKSBCRkRfU0VORChiLCBfYmZkX2dldF9lbHRfYXRfaW5kZXgsIChiLGkpKQotICBiZmQgKiAgICAoKl9iZmRfZ2V0X2VsdF9hdF9pbmRleCkgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci0gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotICBib29sZWFuICAoKl9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkgUEFSQU1TICgoYmZkICopKTsKLQotICAgLyogRW50cnkgcG9pbnRzIHVzZWQgZm9yIHN5bWJvbHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9zeW10YWJfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9nZXRfc3ltdGFiKSxcCi1DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKLUNBVChOQU1FLF9wcmludF9zeW1ib2wpLFwKLUNBVChOQU1FLF9nZXRfc3ltYm9sX2luZm8pLFwKLUNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAotQ0FUKE5BTUUsX2dldF9saW5lbm8pLFwKLUNBVChOQU1FLF9maW5kX25lYXJlc3RfbGluZSksXAotQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAotQ0FUKE5BTUUsX3JlYWRfbWluaXN5bWJvbHMpLFwKLUNBVChOQU1FLF9taW5pc3ltYm9sX3RvX3N5bWJvbCkKLSAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiKSBQQVJBTVMgKChiZmQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgotICAgICAgICAgICAgICAgICgqX2JmZF9tYWtlX2VtcHR5X3N5bWJvbCkgUEFSQU1TICgoYmZkICopKTsKLSAgdm9pZCAgICAgICAgICAoKl9iZmRfcHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgUFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotI2RlZmluZSBiZmRfcHJpbnRfc3ltYm9sKGIscCxzLGUpIEJGRF9TRU5EKGIsIF9iZmRfcHJpbnRfc3ltYm9sLCAoYixwLHMsZSkpCi0gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2luZm8gKikpOwotI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSkgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0gIGFsZW50ICogICAgKCpfZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKikpOwotICBib29sZWFuICAgICgqX2JmZF9maW5kX25lYXJlc3RfbGluZSkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKLSAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlLCBDT05TVCBjaGFyICoqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsaW5lKSk7Ci0gIC8qIEJhY2stZG9vciB0byBhbGxvdyBmb3JtYXQtYXdhcmUgYXBwbGljYXRpb25zIHRvIGNyZWF0ZSBkZWJ1ZyBzeW1ib2xzCi0gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0gICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKi8KLSAgYXN5bWJvbCAqICAoKl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICB2b2lkICpwdHIsCi0gICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSk7Ci0jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKLSAgQkZEX1NFTkQgKGIsIF9yZWFkX21pbmlzeW1ib2xzLCAoYiwgZCwgbSwgcykpCi0gIGxvbmcgICgqX3JlYWRfbWluaXN5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKLSNkZWZpbmUgYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKGIsIGQsIG0sIGYpIFwKLSAgQkZEX1NFTkQgKGIsIF9taW5pc3ltYm9sX3RvX3N5bWJvbCwgKGIsIGQsIG0sIGYpKQotICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKikpOwotCi0gICAvKiBSb3V0aW5lcyBmb3IgcmVsb2NzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9yZWxvY191cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9yZWxvYyksXAotQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKLSAgbG9uZyAgKCpfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgYXJlbGVudCAqKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotICAgLyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqLwotICByZWxvY19ob3d0b190eXBlICoKLSAgICAgICAoKnJlbG9jX3R5cGVfbG9va3VwKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotICAgLyogUm91dGluZXMgdXNlZCB3aGVuIHdyaXRpbmcgYW4gb2JqZWN0IGZpbGUuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9XUklURShOQU1FKVwKLUNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCi1DQVQoTkFNRSxfc2V0X3NlY3Rpb25fY29udGVudHMpCi0gIGJvb2xlYW4gICAgKCpfYmZkX3NldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0xJTksoTkFNRSlcCi1DQVQoTkFNRSxfc2l6ZW9mX2hlYWRlcnMpLFwKLUNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCi1DQVQoTkFNRSxfYmZkX3JlbGF4X3NlY3Rpb24pLFwKLUNBVChOQU1FLF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSksXAotQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCi1DQVQoTkFNRSxfYmZkX2ZpbmFsX2xpbmspLFwKLUNBVChOQU1FLF9iZmRfbGlua19zcGxpdF9zZWN0aW9uKSxcCi1DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQotICBpbnQgICAgICAgICgqX2JmZF9zaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLSAgYmZkX2J5dGUgKiAoKl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0gICAgICAgICAgICAgICAgICAgIGJmZF9ieXRlICpkYXRhLCBib29sZWFuIHJlbG9jYXRlYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotCi0gIGJvb2xlYW4gICAgKCpfYmZkX3JlbGF4X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICosCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKmFnYWluKSk7Ci0KLSAgIC8qIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLSAgICAgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoaXMgdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCpfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgIC8qIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfbGlua19hZGRfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAgLyogRG8gYSBsaW5rIGJhc2VkIG9uIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaAotICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqLwotICBib29sZWFuICgqX2JmZF9maW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gICAvKiBTaG91bGQgdGhpcyBzZWN0aW9uIGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBwaWVjZXMgZHVyaW5nIGxpbmtpbmcuICAqLwotICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotICAgLyogUmVtb3ZlIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGZyb20gdGhlIG91dHB1dC4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2djX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gICAvKiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAotQ0FUKE5BTUUsX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCi0gICAvKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAqLwotICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYikKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotICAgLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCi0gICAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLQotIFBUUiBiYWNrZW5kX2RhdGE7Ci19IGJmZF90YXJnZXQ7Ci1ib29sZWFuIAotYmZkX3NldF9kZWZhdWx0X3RhcmdldCAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9maW5kX3RhcmdldCBQQVJBTVMgKChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKSk7Ci0KLWNvbnN0IGNoYXIgKioKLWJmZF90YXJnZXRfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2hlY2tfZm9ybWF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0LCBjaGFyICoqKm1hdGNoaW5nKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X2Zvcm1hdCBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2Zvcm1hdF9zdHJpbmcgUEFSQU1TICgoYmZkX2Zvcm1hdCBmb3JtYXQpKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2JmZC5jIGIvYmZkL2JmZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTdlOGYwLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDExNTkgKzAsMCBAQAotLyogR2VuZXJpYyBCRkQgbGlicmFyeSBpbnRlcmZhY2UgYW5kIHN1cHBvcnQgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQk8PHR5cGVkZWYgYmZkPj4KLQotCUEgQkZEIGhhcyB0eXBlIDw8YmZkPj47IG9iamVjdHMgb2YgdGhpcyB0eXBlIGFyZSB0aGUKLQljb3JuZXJzdG9uZSBvZiBhbnkgYXBwbGljYXRpb24gdXNpbmcgQkZELiBVc2luZyBCRkQKLQljb25zaXN0cyBvZiBtYWtpbmcgcmVmZXJlbmNlcyB0aG91Z2ggdGhlIEJGRCBhbmQgdG8gZGF0YSBpbiB0aGUgQkZELgotCi0JSGVyZSBpcyB0aGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyB0aGUgdHlwZSA8PGJmZD4+LiAgSXQKLQljb250YWlucyB0aGUgbWFqb3IgZGF0YSBhYm91dCB0aGUgZmlsZSBhbmQgcG9pbnRlcnMKLQl0byB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLgotLnN0cnVjdCBfYmZkIAotLnsKLS4gICAgeyogVGhlIGZpbGVuYW1lIHRoZSBhcHBsaWNhdGlvbiBvcGVuZWQgdGhlIEJGRCB3aXRoLiAgKn0KLS4gICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAotLgotLiAgICB7KiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBqdW1wIHRhYmxlLiAgICAgICAgICAgICAqfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLS4KLS4gICAgeyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0Ci0uICAgICAgIGluY2x1ZGVzIGA8PGJmZC5oPj4nLCBJT1NUUkVBTSBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhICJjaGFyCi0uICAgICAgICoiLCBhbmQgTVRJTUUgYXMgYSAibG9uZyIuICBUaGVpciBjb3JyZWN0IHR5cGVzLCB0byB3aGljaCB0aGV5Ci0uICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCi0uICAgICAgIGlzIHRoZSByZXN1bHQgb2YgYW4gZm9wZW4gb24gdGhlIGZpbGVuYW1lLiAgSG93ZXZlciwgaWYgdGhlCi0uICAgICAgIEJGRF9JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoZW4gaW9zdHJlYW0gaXMgYWN0dWFsbHkgYSBwb2ludGVyCi0uICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqfQotLiAgICBQVFIgaW9zdHJlYW07Ci0uCi0uICAgIHsqIElzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgY2FjaGVkPyAgVGhhdCBpcywgY2FuIGl0IGJlIGNsb3NlZCBhcwotLiAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICp9Ci0uCi0uICAgIGJvb2xlYW4gY2FjaGVhYmxlOwotLgotLiAgICB7KiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQotLiAgICAgICBCRkQgd2FzIG9wZW5lZC4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB3aGljaCBtYXRjaGluZyBhbGdvcml0aG0KLS4gICAgICAgdG8gdXNlIHRvIGNob29zZSB0aGUgYmFjayBlbmQuICp9Ci0uCi0uICAgIGJvb2xlYW4gdGFyZ2V0X2RlZmF1bHRlZDsKLS4KLS4gICAgeyogVGhlIGNhY2hpbmcgcm91dGluZXMgdXNlIHRoZXNlIHRvIG1haW50YWluIGEKLS4gICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKn0KLS4KLS4gICAgc3RydWN0IF9iZmQgKmxydV9wcmV2LCAqbHJ1X25leHQ7Ci0uCi0uICAgIHsqIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKLS4gICAgICAgc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGZpbGUgaGVyZTogKn0KLS4KLS4gICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogYW5kIGhlcmU6IChgYG9uY2UnJyBtZWFucyBhdCBsZWFzdCBvbmNlKSAqfQotLgotLiAgICBib29sZWFuIG9wZW5lZF9vbmNlOwotLgotLiAgICB7KiBTZXQgaWYgd2UgaGF2ZSBhIGxvY2FsbHkgbWFpbnRhaW5lZCBtdGltZSB2YWx1ZSwgcmF0aGVyIHRoYW4KLS4gICAgICAgZ2V0dGluZyBpdCBmcm9tIHRoZSBmaWxlIGVhY2ggdGltZTogKn0KLS4KLS4gICAgYm9vbGVhbiBtdGltZV9zZXQ7Ci0uCi0uICAgIHsqIEZpbGUgbW9kaWZpZWQgdGltZSwgaWYgbXRpbWVfc2V0IGlzIHRydWU6ICp9Ci0uCi0uICAgIGxvbmcgbXRpbWU7ICAgICAgICAgIAotLgotLiAgICB7KiBSZXNlcnZlZCBmb3IgYW4gdW5pbXBsZW1lbnRlZCBmaWxlIGxvY2tpbmcgZXh0ZW5zaW9uLip9Ci0uCi0uICAgIGludCBpZmQ7Ci0uCi0uICAgIHsqIFRoZSBmb3JtYXQgd2hpY2ggYmVsb25ncyB0byB0aGUgQkZELiAob2JqZWN0LCBjb3JlLCBldGMuKSAqfQotLgotLiAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLS4KLS4gICAgeyogVGhlIGRpcmVjdGlvbiB0aGUgQkZEIHdhcyBvcGVuZWQgd2l0aCp9Ci0uCi0uICAgIGVudW0gYmZkX2RpcmVjdGlvbiB7bm9fZGlyZWN0aW9uID0gMCwKLS4gICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RpcmVjdGlvbiA9IDEsCi0uICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKLS4gICAgICAgICAgICAgICAgICAgICAgICBib3RoX2RpcmVjdGlvbiA9IDN9IGRpcmVjdGlvbjsKLS4KLS4gICAgeyogRm9ybWF0X3NwZWNpZmljIGZsYWdzKn0KLS4KLS4gICAgZmxhZ3dvcmQgZmxhZ3M7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogQ3VycmVudGx5IG15X2FyY2hpdmUgaXMgdGVzdGVkIGJlZm9yZSBhZGRpbmcgb3JpZ2luIHRvCi0uICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgotLiAgICAgICBvcmlnaW4sIHdpdGggb3JpZ2luIHNldCB0byAwIGZvciBub24gYXJjaGl2ZSBmaWxlcy4gICAqfQotLgotLiAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAotLgotLiAgICB7KiBSZW1lbWJlciB3aGVuIG91dHB1dCBoYXMgYmVndW4sIHRvIHN0b3Agc3RyYW5nZSB0aGluZ3MKLS4gICAgICAgZnJvbSBoYXBwZW5pbmcuICp9Ci0uICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKLS4KLS4gICAgeyogUG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyp9Ci0uICAgIHN0cnVjdCBzZWMgICpzZWN0aW9uczsKLS4KLS4gICAgeyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqfQotLiAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLS4KLS4gICAgeyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIG9iamVjdCBmaWxlczogCi0uICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqfQotLiAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0uCi0uICAgIHsqIFVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQqfQotLiAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci0uCi0uICAgIHsqIFN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IEJGRCAod2l0aCBzeW1jb3VudCBlbnRyaWVzKSAqfQotLiAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqKm91dHN5bWJvbHM7ICAgICAgICAgICAgIAotLgotLiAgICB7KiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaF9pbmZvOwotLgotLiAgICB7KiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3IgYXJjaGl2ZXM6Kn0KLS4gICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKLS4gICAgc3RydWN0IF9iZmQgKm15X2FyY2hpdmU7ICAgICB7KiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICp9Ci0uICAgIHN0cnVjdCBfYmZkICpuZXh0OyAgICAgICAgICAgeyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgc3RydWN0IF9iZmQgKmFyY2hpdmVfaGVhZDsgICB7KiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgYm9vbGVhbiBoYXNfYXJtYXA7ICAgICAgICAgICAKLS4KLS4gICAgeyogQSBjaGFpbiBvZiBCRkQgc3RydWN0dXJlcyBpbnZvbHZlZCBpbiBhIGxpbmsuICAqfQotLiAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OwotLgotLiAgICB7KiBBIGZpZWxkIHVzZWQgYnkgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gIFRoaXMgd2lsbAotLiAgICAgICBiZSB1c2VkIG9ubHkgZm9yIGFyY2hpdmUgZWxlbWVudHMuICAqfQotLiAgICBpbnQgYXJjaGl2ZV9wYXNzOwotLgotLiAgICB7KiBVc2VkIGJ5IHRoZSBiYWNrIGVuZCB0byBob2xkIHByaXZhdGUgZGF0YS4gKn0KLS4KLS4gICAgdW5pb24gCi0uICAgICAgewotLiAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICphb3V0X2RhdGE7Ci0uICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgX29hc3lzX2RhdGEgKm9hc3lzX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSAqb2FzeXNfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgcGVfdGRhdGEgKnBlX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdCAqaWVlZV9kYXRhOwotLiAgICAgIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0ICppZWVlX2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqaWhleF9kYXRhOwotLiAgICAgIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QgKnRla2hleF9kYXRhOwotLiAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKm5sbV9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqYm91dF9kYXRhOwotLiAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKnNjbzVfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICp0cmFkX2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKLS4gICAgICBzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAqaHB1eF9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmhwcGFic2RfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKmx5bnhfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKm9zZl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0ICp2ZXJzYWRvc19kYXRhOwotLiAgICAgIHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgKm5ldGJzZF9jb3JlX2RhdGE7Ci0uICAgICAgUFRSIGFueTsKLS4gICAgICB9IHRkYXRhOwotLiAgCi0uICAgIHsqIFVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGhvbGQgcHJpdmF0ZSBkYXRhKn0KLS4gICAgUFRSIHVzcmRhdGE7Ci0uCi0uICB7KiBXaGVyZSBhbGwgdGhlIGFsbG9jYXRlZCBzdHVmZiB1bmRlciB0aGlzIEJGRCBnb2VzLiAgVGhpcyBpcyBhCi0uICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKiwgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2YKLS4gICAgIG9iamFsbG9jLmguICAqfQotLiAgICBQVFIgbWVtb3J5OwotLn07Ci0uCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jdW5kZWYgb2JqX3N5bWJvbHMKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotDAotLyogcHJvdmlkZSBzdG9yYWdlIGZvciBzdWJzeXN0ZW0sIHN0YWNrIGFuZCBoZWFwIGRhdGEgd2hpY2ggbWF5IGhhdmUgYmVlbgotICAgcGFzc2VkIGluIG9uIHRoZSBjb21tYW5kIGxpbmUuICBMZCBwdXRzIHRoaXMgZGF0YSBpbnRvIGEgYmZkX2xpbmtfaW5mbwotICAgc3RydWN0IHdoaWNoIHVsdGltYXRlbHkgZ2V0cyBwYXNzZWQgaW4gdG8gdGhlIGJmZC4gIFdoZW4gaXQgYXJyaXZlcywgY29weQotICAgaXQgdG8gdGhlIGZvbGxvd2luZyBzdHJ1Y3Qgc28gdGhhdCB0aGUgZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSBpbiBjb2ZmY29kZS5oCi0gICB3aGVyZSBpdCBpcyBuZWVkZWQuICBUaGUgdHlwZWRlZidzIHVzZWQgYXJlIGRlZmluZWQgaW4gYmZkLmggKi8KLQotCi0MCi0vKgotU0VDVElPTgotCUVycm9yIHJlcG9ydGluZwotCi0JTW9zdCBCRkQgZnVuY3Rpb25zIHJldHVybiBub256ZXJvIG9uIHN1Y2Nlc3MgKGNoZWNrIHRoZWlyCi0JaW5kaXZpZHVhbCBkb2N1bWVudGF0aW9uIGZvciBwcmVjaXNlIHNlbWFudGljcykuICBPbiBhbiBlcnJvciwKLQl0aGV5IGNhbGwgPDxiZmRfc2V0X2Vycm9yPj4gdG8gc2V0IGFuIGVycm9yIGNvbmRpdGlvbiB0aGF0IGNhbGxlcnMKLQljYW4gY2hlY2sgYnkgY2FsbGluZyA8PGJmZF9nZXRfZXJyb3I+Pi4KLSAgICAgICAgSWYgdGhhdCByZXR1cm5zIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4sIHRoZW4gY2hlY2sKLQk8PGVycm5vPj4uCi0KLQlUaGUgZWFzaWVzdCB3YXkgdG8gcmVwb3J0IGEgQkZEIGVycm9yIHRvIHRoZSB1c2VyIGlzIHRvCi0JdXNlIDw8YmZkX3BlcnJvcj4+LgotCi1TVUJTRUNUSU9OCi0JVHlwZSA8PGJmZF9lcnJvcl90eXBlPj4KLQotCVRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgPDxiZmRfZ2V0X2Vycm9yPj4gYXJlIGRlZmluZWQgYnkgdGhlCi0JZW51bWVyYXRlZCB0eXBlIDw8YmZkX2Vycm9yX3R5cGU+Pi4KLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfZXJyb3IKLS57Ci0uICBiZmRfZXJyb3Jfbm9fZXJyb3IgPSAwLAotLiAgYmZkX2Vycm9yX3N5c3RlbV9jYWxsLAotLiAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotLiAgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCwKLS4gIGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19tZW1vcnksCi0uICBiZmRfZXJyb3Jfbm9fc3ltYm9scywKLS4gIGJmZF9lcnJvcl9ub19hcm1hcCwKLS4gIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAotLiAgYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlLAotLiAgYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQsCi0uICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAotLiAgYmZkX2Vycm9yX25vX2NvbnRlbnRzLAotLiAgYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAotLiAgYmZkX2Vycm9yX2JhZF92YWx1ZSwKLS4gIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwKLS4gIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCi0uICBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlCi0ufSBiZmRfZXJyb3JfdHlwZTsKLS4KLSovCi0KLXN0YXRpYyBiZmRfZXJyb3JfdHlwZSBiZmRfZXJyb3IgPSBiZmRfZXJyb3Jfbm9fZXJyb3I7Ci0KLUNPTlNUIGNoYXIgKkNPTlNUIGJmZF9lcnJtc2dzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gZXJyb3IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJTeXN0ZW0gY2FsbCBlcnJvciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkludmFsaWQgYmZkIHRhcmdldCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgaW4gd3JvbmcgZm9ybWF0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiSW52YWxpZCBvcGVyYXRpb24iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJNZW1vcnkgZXhoYXVzdGVkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gc3ltYm9scyIpLAotCQkJTl8oIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJObyBtb3JlIGFyY2hpdmVkIGZpbGVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTWFsZm9ybWVkIGFyY2hpdmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIlNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIpLAotCQkJTl8oIlN5bWJvbCBuZWVkcyBkZWJ1ZyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGV4aXN0IiksCi0JCQlOXygiQmFkIHZhbHVlIiksCi0JCQlOXygiRmlsZSB0cnVuY2F0ZWQiKSwKLQkJCU5fKCJGaWxlIHRvbyBiaWciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCIjPEludmFsaWQgZXJyb3IgY29kZT4iKQotICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0JYmZkX2Vycm9yX3R5cGUgYmZkX2dldF9lcnJvciAodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBjdXJyZW50IEJGRCBlcnJvciBjb25kaXRpb24uCi0qLwotCi1iZmRfZXJyb3JfdHlwZQotYmZkX2dldF9lcnJvciAoKQotewotICByZXR1cm4gYmZkX2Vycm9yOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgQkZEIGVycm9yIGNvbmRpdGlvbiB0byBiZSBAdmFye2Vycm9yX3RhZ30uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yIChlcnJvcl90YWcpCi0gICAgIGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZzsKLXsKLSAgYmZkX2Vycm9yID0gZXJyb3JfdGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZXJybXNnCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2Vycm1zZyAoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgQHZhcntlcnJvcl90YWd9LCBvcgotCXRoZSBzeXN0ZW0gZXJyb3IgaWYgQHZhcntlcnJvcl90YWd9IGlzIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4uCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9lcnJtc2cgKGVycm9yX3RhZykKLSAgICAgYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnOwotewotI2lmbmRlZiBlcnJubwotICBleHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0gIGlmIChlcnJvcl90YWcgPT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgIHJldHVybiB4c3RyZXJyb3IgKGVycm5vKTsKLQotICBpZiAoKCgoaW50KWVycm9yX3RhZyA8KGludCkgYmZkX2Vycm9yX25vX2Vycm9yKSB8fAotICAgICAgICgoaW50KWVycm9yX3RhZyA+IChpbnQpYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZSkpKQotICAgIGVycm9yX3RhZyA9IGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGU7Lyogc2FuaXR5IGNoZWNrICovCi0KLSAgcmV0dXJuIF8oYmZkX2Vycm1zZ3MgWyhpbnQpZXJyb3JfdGFnXSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wZXJyb3IKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wZXJyb3IgKENPTlNUIGNoYXIgKm1lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUKLQlsYXN0IEJGRCBlcnJvciB0aGF0IG9jY3VycmVkLCBvciB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaWYKLQl0aGUgbGFzdCBCRkQgZXJyb3Igd2FzIGEgc3lzdGVtIGNhbGwgZmFpbHVyZS4gIElmIEB2YXJ7bWVzc2FnZX0KLQlpcyBub24tTlVMTCBhbmQgbm9uLWVtcHR5LCB0aGUgZXJyb3Igc3RyaW5nIHByaW50ZWQgaXMgcHJlY2VkZWQKLQlieSBAdmFye21lc3NhZ2V9LCBhIGNvbG9uLCBhbmQgYSBzcGFjZS4gIEl0IGlzIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KLSovCi0KLXZvaWQKLWJmZF9wZXJyb3IgKG1lc3NhZ2UpCi0gICAgIENPTlNUIGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICBwZXJyb3IoKGNoYXIgKiltZXNzYWdlKTsgICAgICAgICAgICAvKiBtdXN0IGJlIHN5c3RlbSBlcnJvciB0aGVuLi4uICovCi0gIGVsc2UgewotICAgIGlmIChtZXNzYWdlID09IE5VTEwgfHwgKm1lc3NhZ2UgPT0gJ1wwJykKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLX0KLQotLyoKLVNVQlNFQ1RJT04KLQlCRkQgZXJyb3IgaGFuZGxlcgotCi0JU29tZSBCRkQgZnVuY3Rpb25zIHdhbnQgdG8gcHJpbnQgbWVzc2FnZXMgZGVzY3JpYmluZyB0aGUKLQlwcm9ibGVtLiAgVGhleSBjYWxsIGEgQkZEIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uICBUaGlzCi0JZnVuY3Rpb24gbWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgcHJvZ3JhbS4KLQotCVRoZSBCRkQgZXJyb3IgaGFuZGxlciBhY3RzIGxpa2UgcHJpbnRmLgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiB2b2lkICgqYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLS4KLSovCi0KLS8qIFRoZSBwcm9ncmFtIG5hbWUgdXNlZCB3aGVuIHByaW50aW5nIEJGRCBlcnJvciBtZXNzYWdlcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZTsKLQotLyogVGhpcyBpcyB0aGUgZGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBCRkQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0KLXN0YXRpYyB2b2lkIF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnMsIC4uLikpOwotCi1zdGF0aWMgdm9pZAotX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgKGNvbnN0IGNoYXIgKnMsIC4uLikKLXsKLSAgdmFfbGlzdCBwOwotCi0gIGlmIChfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCRkQ6ICIpOwotCi0gIHZhX3N0YXJ0IChwLCBzKTsKLQotICB2ZnByaW50ZiAoc3RkZXJyLCBzLCBwKTsKLQotICB2YV9lbmQgKHApOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSAqLwotCi1zdGF0aWMgdm9pZCBfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciAoKTsKLQotc3RhdGljIHZvaWQKLV9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgcDsKLSAgY29uc3QgY2hhciAqczsKLQotICBpZiAoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiQkZEOiAiKTsKLQotICB2YV9zdGFydCAocCk7Ci0KLSAgcyA9IHZhX2FyZyAocCwgY29uc3QgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgcywgcCk7Ci0KLSAgdmFfZW5kIChwKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChBTlNJX1BST1RPVFlQRVMpICovCi0KLS8qIFRoaXMgaXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSByb3V0aW5lIHdoaWNoIHNob3VsZCBoYW5kbGUgQkZECi0gICBlcnJvciBtZXNzYWdlcy4gIEl0IGlzIGNhbGxlZCB3aGVuIGEgQkZEIHJvdXRpbmUgZW5jb3VudGVycyBhbgotICAgZXJyb3IgZm9yIHdoaWNoIGl0IHdhbnRzIHRvIHByaW50IGEgbWVzc2FnZS4gIEdvaW5nIHRocm91Z2ggYQotICAgZnVuY3Rpb24gcG9pbnRlciBwZXJtaXRzIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBCRkQgdG8gaW50ZXJjZXB0Ci0gICB0aGUgbWVzc2FnZXMgYW5kIGRlYWwgd2l0aCB0aGVtIGl0c2VsZi4gICovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyID0gX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXI7Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX3NldF9lcnJvcl9oYW5kbGVyIChiZmRfZXJyb3JfaGFuZGxlcl90eXBlKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLiAgUmV0dXJucyB0aGUgcHJldmlvdXMKLQlmdW5jdGlvbi4KLSovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUKLWJmZF9zZXRfZXJyb3JfaGFuZGxlciAocG5ldykKLSAgICAgYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBwbmV3OwotewotICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBvbGQ7Ci0KLSAgcG9sZCA9IF9iZmRfZXJyb3JfaGFuZGxlcjsKLSAgX2JmZF9lcnJvcl9oYW5kbGVyID0gcG5ldzsKLSAgcmV0dXJuIHBvbGQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAoY29uc3QgY2hhciAqKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIHByb2dyYW0gbmFtZSB0byB1c2Ugd2hlbiBwcmludGluZyBhIEJGRCBlcnJvci4gIFRoaXMKLQlpcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IgbWVzc2FnZSBmb2xsb3dlZCBieSBhIGNvbG9uIGFuZAotCXNwYWNlLiAgVGhlIHN0cmluZyBtdXN0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGlzIHBhc3NlZCB0bwotCXRoaXMgZnVuY3Rpb24uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgPSBuYW1lOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX2dldF9lcnJvcl9oYW5kbGVyICh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLgotKi8KLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZQotYmZkX2dldF9lcnJvcl9oYW5kbGVyICgpCi17Ci0gIHJldHVybiBfYmZkX2Vycm9yX2hhbmRsZXI7Ci19Ci0MCi0vKgotU0VDVElPTgotCVN5bWJvbHMKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlCi0JcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBAdmFye3NlY3R9Ci0JYXR0YWNoZWQgdG8gYmZkIEB2YXJ7YWJmZH0uICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4KLQotKi8KLQotCi1sb25nCi1iZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2dldF9yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQsIGFzZWN0KSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9jYW5vbmljYWxpemVfcmVsb2MKLSAgICAgICAgCShiZmQgKmFiZmQsCi0JCWFzZWN0aW9uICpzZWMsCi0JCWFyZWxlbnQgKipsb2MsCi0JCWFzeW1ib2wJKipzeW1zKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZECi0JQHZhcnthYmZkfSBhbmQgdHJhbnNsYXRlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSByZWxvY2F0aW9uCi0JaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gQHZhcntzZWN9IGludG8gdGhlIGludGVybmFsIGNhbm9uaWNhbAotCWZvcm0uICBQbGFjZSB0aGUgdGFibGUgaW50byBtZW1vcnkgYXQgQHZhcntsb2N9LCB3aGljaCBoYXMKLQliZWVuIHByZWFsbG9jYXRlZCwgdXN1YWxseSBieSBhIGNhbGwgdG8KLQk8PGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQ+Pi4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZWxvY3MsIG9yCi0JLTEgb24gZXJyb3IuCi0KLQlUaGUgQHZhcntzeW1zfSB0YWJsZSBpcyBhbHNvIG5lZWRlZCBmb3IgaG9ycmlibGUgaW50ZXJuYWwgbWFnaWMKLQlyZWFzb25zLgotCi0KLSovCi1sb25nCi1iZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBhc2VjdCwgbG9jYXRpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLQkJICAgKGFiZmQsIGFzZWN0LCBsb2NhdGlvbiwgc3ltYm9scykpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3JlbG9jCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X3JlbG9jCi0JICAoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBhcmVsZW50ICoqcmVsLCB1bnNpZ25lZCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSByZWxvY2F0aW9uIHBvaW50ZXIgYW5kIGNvdW50IHdpdGhpbgotCXNlY3Rpb24gQHZhcntzZWN9IHRvIHRoZSB2YWx1ZXMgQHZhcntyZWx9IGFuZCBAdmFye2NvdW50fS4KLQlUaGUgYXJndW1lbnQgQHZhcnthYmZkfSBpcyBpZ25vcmVkLgotCi0qLwotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfc2V0X3JlbG9jIChpZ25vcmVfYWJmZCwgYXNlY3QsIGxvY2F0aW9uLCBjb3VudCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci17Ci0gIGFzZWN0LT5vcmVsb2NhdGlvbiA9IGxvY2F0aW9uOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjb3VudDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9maWxlX2ZsYWdzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X2ZpbGVfZmxhZ3MoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncyk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBmbGFnIHdvcmQgaW4gdGhlIEJGRCBAdmFye2FiZmR9IHRvIHRoZSB2YWx1ZSBAdmFye2ZsYWdzfS4KLQotCVBvc3NpYmxlIGVycm9ycyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl93cm9uZ19mb3JtYXQ+PiAtIFRoZSB0YXJnZXQgYmZkIHdhcyBub3Qgb2Ygb2JqZWN0IGZvcm1hdC4KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLSBUaGUgdGFyZ2V0IGJmZCB3YXMgb3BlbiBmb3IgcmVhZGluZy4KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCVRoZSBmbGFnIHdvcmQgY29udGFpbmVkIGEgYml0IHdoaWNoIHdhcyBub3QgYXBwbGljYWJsZSB0byB0aGUKLQl0eXBlIG9mIGZpbGUuICBFLmcuLCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHNldCB0aGUgPDxEX1BBR0VEPj4gYml0Ci0Jb24gYSBCRkQgZm9ybWF0IHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgZGVtYW5kIHBhZ2luZy4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9maWxlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJmZF9yZWFkX3AgKGFiZmQpKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpID0gZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgJiBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzIChhYmZkKSkgIT0gZmxhZ3MpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi1yZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZAotYmZkX2Fzc2VydCAoZmlsZSwgbGluZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgaW50IGxpbmU7Ci17Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiYmZkIGFzc2VydGlvbiBmYWlsICVzOiVkIiksIGZpbGUsIGxpbmUpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc3RhcnRfYWRkcmVzcwotCi1TWU5PUFNJUwotIAlib29sZWFuIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyhiZmQgKmFiZmQsIGJmZF92bWEgdm1hKTsKLQotREVTQ1JJUFRJT04KLQlNYWtlIEB2YXJ7dm1hfSB0aGUgZW50cnkgcG9pbnQgb2Ygb3V0cHV0IEJGRCBAdmFye2FiZmR9LgotCi1SRVRVUk5TCi0JUmV0dXJucyA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb3RoZXJ3aXNlLgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9zdGFydF9hZGRyZXNzKGFiZmQsIHZtYSkKLWJmZCAqYWJmZDsKLWJmZF92bWEgdm1hOwotewotICBhYmZkLT5zdGFydF9hZGRyZXNzID0gdm1hOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X210aW1lCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfZ2V0X210aW1lKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lIChhcyByZWFkIGZyb20gdGhlIGZpbGUgc3lzdGVtLCBvcgotCWZyb20gdGhlIGFyY2hpdmUgaGVhZGVyIGZvciBhcmNoaXZlIG1lbWJlcnMpLgotCi0qLwotCi1sb25nCi1iZmRfZ2V0X210aW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKmZwOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgaWYgKGFiZmQtPm10aW1lX3NldCkKLSAgICByZXR1cm4gYWJmZC0+bXRpbWU7Ci0KLSAgZnAgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgaWYgKDAgIT0gZnN0YXQgKGZpbGVubyAoZnApLCAmYnVmKSkKLSAgICByZXR1cm4gMDsKLQotICBhYmZkLT5tdGltZSA9IGJ1Zi5zdF9tdGltZTsJCS8qIFNhdmUgdmFsdWUgaW4gY2FzZSBhbnlvbmUgd2FudHMgaXQgKi8KLSAgcmV0dXJuIGJ1Zi5zdF9tdGltZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zaXplCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfZ2V0X3NpemUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIGZpbGUgc2l6ZSAoYXMgcmVhZCBmcm9tIGZpbGUgc3lzdGVtKSBmb3IgdGhlIGZpbGUKLQlhc3NvY2lhdGVkIHdpdGggQkZEIEB2YXJ7YWJmZH0uCi0KLQlUaGUgaW5pdGlhbCBtb3RpdmF0aW9uIGZvciwgYW5kIHVzZSBvZiwgdGhpcyByb3V0aW5lIGlzIG5vdAotCXNvIHdlIGNhbiBnZXQgdGhlIGV4YWN0IHNpemUgb2YgdGhlIG9iamVjdCB0aGUgQkZEIGFwcGxpZXMgdG8sIHNpbmNlCi0JdGhhdCBtaWdodCBub3QgYmUgZ2VuZXJhbGx5IHBvc3NpYmxlIChhcmNoaXZlIG1lbWJlcnMgZm9yIGV4YW1wbGUpLgotCUl0IHdvdWxkIGJlIGlkZWFsIGlmIHNvbWVvbmUgY291bGQgZXZlbnR1YWxseSBtb2RpZnkKLQlpdCBzbyB0aGF0IHN1Y2ggcmVzdWx0cyB3ZXJlIGd1YXJhbnRlZWQuCi0KLQlJbnN0ZWFkLCB3ZSB3YW50IHRvIGFzayBxdWVzdGlvbnMgbGlrZSAiaXMgdGhpcyBOTk4gYnl0ZSBzaXplZAotCW9iamVjdCBJJ20gYWJvdXQgdG8gdHJ5IHJlYWQgZnJvbSBmaWxlIG9mZnNldCBZWVkgcmVhc29uYWJsZT8iCi0JQXMgYXMgZXhhbXBsZSBvZiB3aGVyZSB3ZSBtaWdodCBkbyB0aGlzLCBzb21lIG9iamVjdCBmb3JtYXRzCi0JdXNlIHN0cmluZyB0YWJsZXMgZm9yIHdoaWNoIHRoZSBmaXJzdCA8PHNpemVvZihsb25nKT4+IGJ5dGVzIG9mIHRoZQotCXRhYmxlIGNvbnRhaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlIGl0c2VsZiwgaW5jbHVkaW5nIHRoZSBzaXplIGJ5dGVzLgotCUlmIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIHJlYWQgd2hhdCBpdCB0aGlua3MgaXMgb25lIG9mIHRoZXNlCi0Jc3RyaW5nIHRhYmxlcywgd2l0aG91dCBzb21lIHdheSB0byB2YWxpZGF0ZSB0aGUgc2l6ZSwgYW5kIGZvcgotCXNvbWUgcmVhc29uIHRoZSBzaXplIGlzIHdyb25nIChieXRlIHN3YXBwaW5nIGVycm9yLCB3cm9uZyBsb2NhdGlvbgotCWZvciB0aGUgc3RyaW5nIHRhYmxlLCBldGMuKSwgdGhlIG9ubHkgY2x1ZSBpcyBsaWtlbHkgdG8gYmUgYSByZWFkCi0JZXJyb3Igd2hlbiBpdCB0cmllcyB0byByZWFkIHRoZSB0YWJsZSwgb3IgYSAidmlydHVhbCBtZW1vcnkKLQlleGhhdXN0ZWQiIGVycm9yIHdoZW4gaXQgdHJpZXMgdG8gYWxsb2NhdGUgMTUgYmF6aWxsb24gYnl0ZXMKLQlvZiBzcGFjZSBmb3IgdGhlIDE1IGJhemlsbG9uIGJ5dGUgdGFibGUgaXQgaXMgYWJvdXQgdG8gcmVhZC4KLQlUaGlzIGZ1bmN0aW9uIGF0IGxlYXN0IGFsbG93cyB1cyB0byBhbnN3ZXIgdGhlIHF1ZXNpb24sICJpcyB0aGUKLQlzaXplIHJlYXNvbmFibGU/Ii4KLSovCi0KLWxvbmcKLWJmZF9nZXRfc2l6ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBGSUxFICpmcDsKLSAgc3RydWN0IHN0YXQgYnVmOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHJldHVybiAoKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIGFiZmQtPmlvc3RyZWFtKS0+c2l6ZTsKLQotICBmcCA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICBpZiAoMCAhPSBmc3RhdCAoZmlsZW5vIChmcCksICZidWYpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBidWYuc3Rfc2l6ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9ncF9zaXplCi0KLVNZTk9QU0lTCi0JaW50IGJmZF9nZXRfZ3Bfc2l6ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUAotCXJlZ2lzdGVyIHVuZGVyIE1JUFMgRUNPRkYuICBUaGlzIGlzIHR5cGljYWxseSBzZXQgYnkgdGhlIDw8LUc+PgotCWFyZ3VtZW50IHRvIHRoZSBjb21waWxlciwgYXNzZW1ibGVyIG9yIGxpbmtlci4KLSovCi0KLWludAotYmZkX2dldF9ncF9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JcmV0dXJuIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplOwotICAgICAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXJldHVybiBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9ncF9zaXplCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2dwX3NpemUoYmZkICphYmZkLCBpbnQgaSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQCi0JcmVnaXN0ZXIgdW5kZXIgRUNPRkYgb3IgTUlQUyBFTEYuICBUaGlzIGlzIHR5cGljYWxseSBzZXQgYnkKLQl0aGUgPDwtRz4+IGFyZ3VtZW50IHRvIHRoZSBjb21waWxlciwgYXNzZW1ibGVyIG9yIGxpbmtlci4KLSovCi0KLXZvaWQKLWJmZF9zZXRfZ3Bfc2l6ZSAoYWJmZCwgaSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaTsKLXsKLSAgLyogRG9uJ3QgdHJ5IHRvIHNldCBHUCBzaXplIG9uIGFuIGFyY2hpdmUgb3IgY29yZSBmaWxlISAqLwotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuOwotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0gICAgZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemUgPSBpOwotICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgZWxmX2dwX3NpemUgKGFiZmQpID0gaTsKLX0KLQotLyogR2V0IHRoZSBHUCB2YWx1ZS4gIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSBzb21lIG9mIHRoZQotICAgcmVsb2NhdGlvbiBzcGVjaWFsX2Z1bmN0aW9uIHJvdXRpbmVzIG9uIHRhcmdldHMgd2hpY2ggc3VwcG9ydCBhIEdQCi0gICByZWdpc3Rlci4gICovCi0KLWJmZF92bWEKLV9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JcmV0dXJuIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQlyZXR1cm4gZWxmX2dwIChhYmZkKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBTZXQgdGhlIEdQIHZhbHVlLiAgKi8KLQotdm9pZAotX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIHYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2OwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuOwotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0gICAgZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gdjsKLSAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIGVsZl9ncCAoYWJmZCkgPSB2OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2Nhbl92bWEKLQotU1lOT1BTSVMKLQliZmRfdm1hIGJmZF9zY2FuX3ZtYShDT05TVCBjaGFyICpzdHJpbmcsIENPTlNUIGNoYXIgKiplbmQsIGludCBiYXNlKTsKLQotREVTQ1JJUFRJT04KLQlDb252ZXJ0LCBsaWtlIDw8c3RydG91bD4+LCBhIG51bWVyaWNhbCBleHByZXNzaW9uCi0JQHZhcntzdHJpbmd9IGludG8gYSA8PGJmZF92bWE+PiBpbnRlZ2VyLCBhbmQgcmV0dXJuIHRoYXQgaW50ZWdlci4KLQkoVGhvdWdoIHdpdGhvdXQgYXMgbWFueSBiZWxscyBhbmQgd2hpc3RsZXMgYXMgPDxzdHJ0b3VsPj4uKQotCVRoZSBleHByZXNzaW9uIGlzIGFzc3VtZWQgdG8gYmUgdW5zaWduZWQgKGkuZS4sIHBvc2l0aXZlKS4KLQlJZiBnaXZlbiBhIEB2YXJ7YmFzZX0sIGl0IGlzIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGNvbnZlcnNpb24uCi0JQSBiYXNlIG9mIDAgY2F1c2VzIHRoZSBmdW5jdGlvbiB0byBpbnRlcnByZXQgdGhlIHN0cmluZwotCWluIGhleCBpZiBhIGxlYWRpbmcgIjB4IiBvciAiMFgiIGlzIGZvdW5kLCBvdGhlcndpc2UKLQlpbiBvY3RhbCBpZiBhIGxlYWRpbmcgemVybyBpcyBmb3VuZCwgb3RoZXJ3aXNlIGluIGRlY2ltYWwuCi0KLQlPdmVyZmxvdyBpcyBub3QgZGV0ZWN0ZWQuCi0qLwotCi1iZmRfdm1hCi1iZmRfc2Nhbl92bWEgKHN0cmluZywgZW5kLCBiYXNlKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci0gICAgIENPTlNUIGNoYXIgKiplbmQ7Ci0gICAgIGludCBiYXNlOwotewotICBiZmRfdm1hIHZhbHVlOwotICBpbnQgZGlnaXQ7Ci0KLSAgLyogTGV0IHRoZSBob3N0IGRvIGl0IGlmIHBvc3NpYmxlLiAgKi8KLSAgaWYgKHNpemVvZihiZmRfdm1hKSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0gICAgcmV0dXJuIChiZmRfdm1hKSBzdHJ0b3VsIChzdHJpbmcsIChjaGFyICoqKSBlbmQsIGJhc2UpOwotCi0gIC8qIEEgbmVnYXRpdmUgYmFzZSBtYWtlcyBubyBzZW5zZSwgYW5kIHdlIG9ubHkgbmVlZCB0byBnbyBhcyBoaWdoIGFzIGhleC4gICovCi0gIGlmICgoYmFzZSA8IDApIHx8IChiYXNlID4gMTYpKQotICAgIHJldHVybiAoYmZkX3ZtYSkgMDsKLQotICBpZiAoYmFzZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdbMF0gPT0gJzAnKQotCXsKLQkgIGlmICgoc3RyaW5nWzFdID09ICd4JykgfHwgKHN0cmluZ1sxXSA9PSAnWCcpKQotCSAgICBiYXNlID0gMTY7Ci0JICAvKiBYWFggc2hvdWxkIHdlIGFsc28gYWxsb3cgIjBiIiBvciAiMEIiIHRvIHNldCBiYXNlIHRvIDI/ICovCi0JICBlbHNlCi0JICAgIGJhc2UgPSA4OwotCX0KLSAgICAgIGVsc2UKLQliYXNlID0gMTA7Ci0gICAgfQotICBpZiAoKGJhc2UgPT0gMTYpICYmCi0gICAgICAoc3RyaW5nWzBdID09ICcwJykgJiYgKChzdHJpbmdbMV0gPT0gJ3gnKSB8fCAoc3RyaW5nWzFdID09ICdYJykpKQotICAgIHN0cmluZyArPSAyOwotICAvKiBYWFggc2hvdWxkIHdlIGFsc28gc2tpcCBvdmVyICIwYiIgb3IgIjBCIiBpZiBiYXNlIGlzIDI/ICovCi0gICAgCi0vKiBTcGVlZCBjb3VsZCBiZSBpbXByb3ZlZCB3aXRoIGEgdGFibGUgbGlrZSBoZXhfdmFsdWVbXSBpbiBnYXMuICAqLwotI2RlZmluZSBIRVhfVkFMVUUoYykgXAotICAoaXN4ZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKQkJCQkJXAotICAgPyAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpCQkJCVwKLSAgICAgID8gKGMgLSAnMCcpCQkJCQkJXAotICAgICAgOiAoMTAgKyBjIC0gKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpKQlcCi0gICA6IDQyKQotCi0gIGZvciAodmFsdWUgPSAwOyAoZGlnaXQgPSBIRVhfVkFMVUUoKnN0cmluZykpIDwgYmFzZTsgc3RyaW5nKyspCi0gICAgewotICAgICAgdmFsdWUgPSB2YWx1ZSAqIGJhc2UgKyBkaWdpdDsKLSAgICB9Ci0KLSAgaWYgKGVuZCkKLSAgICAqZW5kID0gc3RyaW5nOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YShiZmQgKmliZmQsIGJmZCAqb2JmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIEJGRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgQHZhcntpYmZkfSB0byB0aGUgCi0JdGhlIEJGRCBAdmFye29iZmR9LiAgUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4KLQlQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLS4gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwgXAotLgkJKGliZmQsIG9iZmQpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoYmZkICppYmZkLCBiZmQgKm9iZmQpOwotCi1ERVNDUklQVElPTgotCU1lcmdlIHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZSAKLQl0aGUgb3V0cHV0IGZpbGUgQkZEIEB2YXJ7b2JmZH0gd2hlbiBsaW5raW5nLiAgUmV0dXJuIDw8dHJ1ZT4+Ci0Jb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4KLQotLiNkZWZpbmUgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgXAotLgkJKGliZmQsIG9iZmQpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyhiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgcHJpdmF0ZSBCRkQgZmxhZyBpbmZvcm1hdGlvbiBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0uCi0JUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4KLQotLiNkZWZpbmUgYmZkX3NldF9wcml2YXRlX2ZsYWdzKGFiZmQsIGZsYWdzKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zZXRfcHJpdmF0ZV9mbGFncywgXAotLgkJKGFiZmQsIGZsYWdzKSkKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0Jc3R1ZmYKLQotREVTQ1JJUFRJT04KLQlTdHVmZiB3aGljaCBzaG91bGQgYmUgZG9jdW1lbnRlZDoKLQotLiNkZWZpbmUgYmZkX3NpemVvZl9oZWFkZXJzKGFiZmQsIHJlbG9jKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zaXplb2ZfaGVhZGVycywgKGFiZmQsIHJlbG9jKSkKLS4KLS4jZGVmaW5lIGJmZF9maW5kX25lYXJlc3RfbGluZShhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluZF9uZWFyZXN0X2xpbmUsICAoYWJmZCwgc2VjLCBzeW1zLCBvZmYsIGZpbGUsIGZ1bmMsIGxpbmUpKQotLgotLiAgICAgICB7KiBEbyB0aGVzZSB0aHJlZSBkbyBhbnl0aGluZyB1c2VmdWwgYXQgYWxsLCBmb3IgYW55IGJhY2sgZW5kPyAgKn0KLS4jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX3N0YXJ0KGFiZmQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX2VuZChhYmZkKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZShhYmZkLCBzZWN0aW9uKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIChhYmZkLCBzZWN0aW9uKSkKLS4KLS4KLS4jZGVmaW5lIGJmZF9zdGF0X2FyY2hfZWx0KGFiZmQsIHN0YXQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3N0YXRfYXJjaF9lbHQsKGFiZmQsIHN0YXQpKQotLgotLiNkZWZpbmUgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAoYWJmZCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX3NldF9hcmNoX21hY2goYWJmZCwgYXJjaCwgbWFjaClcCi0uICAgICAgICBCRkRfU0VORCAoIGFiZmQsIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGFiZmQsIGFyY2gsIG1hY2gpKQotLgotLiNkZWZpbmUgYmZkX3JlbGF4X3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWxheF9zZWN0aW9uLCAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikpCi0uCi0uI2RlZmluZSBiZmRfZ2Nfc2VjdGlvbnMoYWJmZCwgbGlua19pbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2djX3NlY3Rpb25zLCAoYWJmZCwgbGlua19pbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2xpbmtfYWRkX3N5bWJvbHMoYWJmZCwgaW5mbykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2FkZF9zeW1ib2xzLCAoYWJmZCwgaW5mbykpCi0uCi0uI2RlZmluZSBiZmRfZmluYWxfbGluayhhYmZkLCBpbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmFsX2xpbmssIChhYmZkLCBpbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9mcmVlX2NhY2hlZF9pbmZvKGFiZmQpIFwKLS4gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZnJlZV9jYWNoZWRfaW5mbywgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoYWJmZCwgZmlsZSlcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsIChhYmZkLCBmaWxlKSkKLS4KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoYWJmZCwgYXN5bWJvbHMpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLCAoYWJmZCwgYXN5bWJvbHMpKQotLgotLiNkZWZpbmUgYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyhhYmZkLCBhcmVscywgYXN5bXMpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIChhYmZkLCBhcmVscywgYXN5bXMpKQotLgotLmV4dGVybiBiZmRfYnl0ZSAqYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotLglQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLS4JCSAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJmZF9ieXRlICosCi0uCQkgIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLS4KLQotKi8KLQotYmZkX2J5dGUgKgotYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAotCQkJCSAgICByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBiZmQgKmFiZmQyOwotICBiZmRfYnl0ZSAqKCpmbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkJCSAgIGFzeW1ib2wgKiopKTsKLQotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBhYmZkMiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gICAgICBpZiAoYWJmZDIgPT0gMCkKLQlhYmZkMiA9IGFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgYWJmZDIgPSBhYmZkOwotICBmbiA9IGFiZmQyLT54dmVjLT5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50czsKLQotICByZXR1cm4gKCpmbikgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKTsKLX0KLQotLyogUmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IGFuIEVMRiBwcm9ncmFtIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9yZWNvcmRfcGhkciAoYWJmZCwgdHlwZSwgZmxhZ3NfdmFsaWQsIGZsYWdzLCBhdF92YWxpZCwgYXQsCi0JCSBpbmNsdWRlc19maWxlaGRyLCBpbmNsdWRlc19waGRycywgY291bnQsIHNlY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyB0eXBlOwotICAgICBib29sZWFuIGZsYWdzX3ZhbGlkOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYm9vbGVhbiBhdF92YWxpZDsKLSAgICAgYmZkX3ZtYSBhdDsKLSAgICAgYm9vbGVhbiBpbmNsdWRlc19maWxlaGRyOwotICAgICBib29sZWFuIGluY2x1ZGVzX3BoZHJzOwotICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjczsKLXsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbSwgKipwbTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCSAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgKyAoKHNpemVfdCkgY291bnQgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG0tPm5leHQgPSBOVUxMOwotICBtLT5wX3R5cGUgPSB0eXBlOwotICBtLT5wX2ZsYWdzID0gZmxhZ3M7Ci0gIG0tPnBfcGFkZHIgPSBhdDsKLSAgbS0+cF9mbGFnc192YWxpZCA9IGZsYWdzX3ZhbGlkOwotICBtLT5wX3BhZGRyX3ZhbGlkID0gYXRfdmFsaWQ7Ci0gIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSBpbmNsdWRlc19maWxlaGRyOwotICBtLT5pbmNsdWRlc19waGRycyA9IGluY2x1ZGVzX3BoZHJzOwotICBtLT5jb3VudCA9IGNvdW50OwotICBpZiAoY291bnQgPiAwKQotICAgIG1lbWNweSAobS0+c2VjdGlvbnMsIHNlY3MsIGNvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0KLSAgZm9yIChwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgKnBtICE9IE5VTEw7IHBtID0gJigqcG0pLT5uZXh0KQotICAgIDsKLSAgKnBtID0gbTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9iaW5hcnkuYyBiL2JmZC9iaW5hcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2M2ZmZi4uMDAwMDAwMAotLS0gYS9iZmQvYmluYXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBiaW5hcnkgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgQkZEIGJhY2tlbmQgd2hpY2ggbWF5IGJlIHVzZWQgdG8gd3JpdGUgYmluYXJ5IG9iamVjdHMuCi0gICBJdCBtYXkgb25seSBiZSB1c2VkIGZvciBvdXRwdXQsIG5vdCBpbnB1dC4gIFRoZSBpbnRlbnRpb24gaXMgdGhhdAotICAgdGhpcyBtYXkgYmUgdXNlZCBhcyBhbiBvdXRwdXQgZm9ybWF0IGZvciBvYmpjb3B5IGluIG9yZGVyIHRvCi0gICBnZW5lcmF0ZSByYXcgYmluYXJ5IGRhdGEuCi0KLSAgIFRoaXMgaXMgdmVyeSBzaW1wbGUuICBUaGUgb25seSBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgcmVhbCBkYXRhCi0gICB3aWxsIHN0YXJ0IGF0IHNvbWUgYWRkcmVzcyBYLCBhbmQgaW4gc29tZSBjYXNlcyB3ZSB3aWxsIG5vdCB3YW50IHRvCi0gICBpbmNsdWRlIFggemVyb2VzIGp1c3QgdG8gZ2V0IHRvIHRoYXQgcG9pbnQuICBTaW5jZSB0aGUgc3RhcnQKLSAgIGFkZHJlc3MgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0LCB3ZSB1c2UgaXQKLSAgIGluc3RlYWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgb2YKLSAgIHRoZSBmaWxlLiAgb2JqY29weSBjb29wZXJhdGVzIGJ5IHNwZWNpYWxseSBzZXR0aW5nIHRoZSBzdGFydAotICAgYWRkcmVzcyB0byB6ZXJvIGJ5IGRlZmF1bHQuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBBbnkgYmZkIHdlIGNyZWF0ZSBieSByZWFkaW5nIGEgYmluYXJ5IGZpbGUgaGFzIHRocmVlIHN5bWJvbHM6Ci0gICBhIHN0YXJ0IHN5bWJvbCwgYW4gZW5kIHN5bWJvbCwgYW5kIGFuIGFic29sdXRlIGxlbmd0aCBzeW1ib2wuICAqLwotI2RlZmluZSBCSU5fU1lNUyAzCi0KLXN0YXRpYyBib29sZWFuIGJpbmFyeV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmJpbmFyeV9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgbG9uZyBiaW5hcnlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKm1hbmdsZV9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLXN0YXRpYyBsb25nIGJpbmFyeV9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqYmluYXJ5X21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBiaW5hcnlfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGludCBiaW5hcnlfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogQ3JlYXRlIGEgYmluYXJ5IG9iamVjdC4gIEludm9rZWQgdmlhIGJmZF9zZXRfZm9ybWF0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJpbmFyeV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQW55IGZpbGUgbWF5IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBiaW5hcnkgZmlsZSwgcHJvdmlkZWQgdGhlIHRhcmdldAotICAgd2FzIG5vdCBkZWZhdWx0ZWQuICBUaGF0IGlzLCBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFzCi0gICBiZWluZyBiaW5hcnkuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1iaW5hcnlfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhYmZkLT5zeW1jb3VudCA9IEJJTl9TWU1TOwotCi0gIC8qIEZpbmQgdGhlIGZpbGUgc2l6ZS4gICovCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJnN0YXRidWYpIDwgMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9uZSBkYXRhIHNlY3Rpb24uICAqLwotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRhdGEiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzZWMtPmZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlYy0+dm1hID0gMDsKLSAgc2VjLT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIHNlYy0+ZmlsZXBvcyA9IDA7Ci0KLSAgYWJmZC0+dGRhdGEuYW55ID0gKFBUUikgc2VjOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0jZGVmaW5lIGJpbmFyeV9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgYmluYXJ5X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBiaW5hcnlfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotCi0vKiBHZXQgY29udGVudHMgb2YgdGhlIG9ubHkgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iaW5hcnlfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1iaW5hcnlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKEJJTl9TWU1TICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIENyZWF0ZSBhIHN5bWJvbCBuYW1lIGJhc2VkIG9uIHRoZSBiZmQncyBmaWxlbmFtZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLW1hbmdsZV9uYW1lIChhYmZkLCBzdWZmaXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqc3VmZml4OwotewotICBpbnQgc2l6ZTsKLSAgY2hhciAqYnVmOwotICBjaGFyICpwOwotCi0gIHNpemUgPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkKLQkgICsgc3RybGVuIChzdWZmaXgpCi0JICArIHNpemVvZiAiX2JpbmFyeV9fIik7Ci0KLSAgYnVmID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAiIjsKLQotICBzcHJpbnRmIChidWYsICJfYmluYXJ5XyVzXyVzIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN1ZmZpeCk7Ci0KLSAgLyogQ2hhbmdlIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gdW5kZXJzY29yZXMuICAqLwotICBmb3IgKHAgPSBidWY7ICpwOyBwKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwKSkKLSAgICAgICpwID0gJ18nOwotCi0gIHJldHVybiBidWY7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLWJpbmFyeV9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IChhc2VjdGlvbiAqKSBhYmZkLT50ZGF0YS5hbnk7Ci0gIGFzeW1ib2wgKnN5bXM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIEJJTl9TWU1TICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN0YXJ0IHN5bWJvbC4gICovCi0gIHN5bXNbMF0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMF0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic3RhcnQiKTsKLSAgc3ltc1swXS52YWx1ZSA9IDA7Ci0gIHN5bXNbMF0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzBdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMF0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogRW5kIHN5bWJvbC4gICovCi0gIHN5bXNbMV0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMV0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAiZW5kIik7Ci0gIHN5bXNbMV0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1sxXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMV0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1sxXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBTaXplIHN5bWJvbC4gICovCi0gIHN5bXNbMl0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMl0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic2l6ZSIpOwotICBzeW1zWzJdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMl0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzJdLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBzeW1zWzJdLnVkYXRhLnAgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCSU5fU1lNUzsgaSsrKQotICAgICphbG9jYXRpb24rKyA9IHN5bXMrKzsKLSAgKmFsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIEJJTl9TWU1TOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLWJpbmFyeV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLX0KLQotI2RlZmluZSBiaW5hcnlfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotCi0vKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotYmluYXJ5X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0jZGVmaW5lIGJpbmFyeV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGJpbmFyeV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgYmluYXJ5X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGJpbmFyeV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGJpbmFyeV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGJpbmFyeV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBiaW5hcnlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfMGwpCi0jZGVmaW5lIGJpbmFyeV9jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgYmluYXJ5X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBvZiBhIGJpbmFyeSBmaWxlLiAgKi8KLSNkZWZpbmUgYmluYXJ5X3NldF9hcmNoX21hY2ggX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2gKLQotLyogV3JpdGUgc2VjdGlvbiBjb250ZW50cyBvZiBhIGJpbmFyeSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotewotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZm91bmRfbG93OwotICAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogVGhlIGxvd2VzdCBzZWN0aW9uIExNQSBzZXRzIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0Ci0gICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIHVzZSB0aGlzIHRvIHNldCB0aGUgZmlsZSBwb3NpdGlvbiBvZiBhbGwgdGhlCi0gICAgICAgICBzZWN0aW9ucy4gICovCi0gICAgICBmb3VuZF9sb3cgPSBmYWxzZTsKLSAgICAgIGxvdyA9IDA7Ci0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlpZiAoKChzLT5mbGFncwotCSAgICAgICYgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19ORVZFUl9MT0FEKSkKLQkgICAgID09IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotCSAgICAmJiAoISBmb3VuZF9sb3cgfHwgcy0+bG1hIDwgbG93KSkKLQkgIHsKLQkgICAgbG93ID0gcy0+bG1hOwotCSAgICBmb3VuZF9sb3cgPSB0cnVlOwotCSAgfQotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBzLT5maWxlcG9zID0gcy0+bG1hIC0gbG93OwotCi0JICAvKiBTa2lwIGZvbGxvd2luZyB3YXJuaW5nIGNoZWNrIGZvciBzZWN0aW9ucyB0aGF0IHdpbGwgbm90Ci0JICAgICBvY2N1cHkgZmlsZSBzcGFjZS4gICovIAotCSAgaWYgKChzLT5mbGFncwotCSAgICAgICAmIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX05FVkVSX0xPQUQpKQotCSAgICAgICE9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgYSBiaW5hcnkgZmlsZSBmcm9tIGEgYmZkIHdpdGgKLQkgICAgIExNQSdzIGFsbCBvdmVyIHRoZSBwbGFjZSwgaHVnZSAoc3BhcnNlPykgYmluYXJ5IGZpbGVzIG1heQotCSAgICAgcmVzdWx0LiAgVGhpcyBjb25kaXRpb24gYXR0ZW1wdHMgdG8gZGV0ZWN0IHRoaXMgc2l0dWF0aW9uCi0JICAgICBhbmQgcHJpbnQgYSB3YXJuaW5nLiAgQmV0dGVyIGhldXJpc3RpY3Mgd291bGQgYmUgbmljZSB0bwotCSAgICAgaGF2ZS4gKi8KLQotCSAgaWYgKHMtPmZpbGVwb3MgPCAwKQotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAoXygiV2FybmluZzogV3JpdGluZyBzZWN0aW9uIGAlcycgdG8gaHVnZSAoaWUgbmVnYXRpdmUpIGZpbGUgb2Zmc2V0IDB4JWx4LiIpLAotCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgcyksCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzLT5maWxlcG9zKTsKLQl9Ci0KLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLQotICAvKiBXZSBkb24ndCB3YW50IHRvIG91dHB1dCBhbnl0aGluZyBmb3IgYSBzZWN0aW9uIHRoYXQgaXMgbmVpdGhlcgotICAgICBsb2FkZWQgbm9yIGFsbG9jYXRlZC4gIFRoZSBjb250ZW50cyBvZiBzdWNoIGEgc2VjdGlvbiBhcmUgbm90Ci0gICAgIG1lYW5pbmdmdWwgaW4gdGhlIGJpbmFyeSBmb3JtYXQuICAqLwotICBpZiAoKHNlYy0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLS8qIE5vIHNwYWNlIGlzIHJlcXVpcmVkIGZvciBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1iaW5hcnlfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSBiaW5hcnlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiaW5hcnlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBiaW5hcnlfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiaW5hcnlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYmluYXJ5X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCBiaW5hcnlfdmVjID0KLXsKLSAgImJpbmFyeSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwJLyogZmxhdm91ciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiBieXRlb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogaGVhZGVyX2J5dGVvcmRlciAqLwotICBFWEVDX1AsCQkJLyogb2JqZWN0X2ZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMpLCAvKiBzZWN0aW9uX2ZsYWdzICovCi0gIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0gIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIGJpbmFyeV9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiaW5hcnlfbWtvYmplY3QsCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX3RydWUsCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9iZmQvYm91dC5jIGIvYmZkL2JvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmMTBmNS4uMDAwMDAwMAotLS0gYS9iZmQvYm91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBiLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiYm91dC5oIgotCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotCi1zdGF0aWMgaW50IGFsaWduY29kZSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJICAgICAgYXJlbGVudCAqciwgdW5zaWduZWQgaW50IHNocmluaykpOwotc3RhdGljIHZvaWQgcGVyZm9ybV9zbGlwIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHNsaXAsCi0JCQkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgYmZkX3ZtYSB2YWx1ZSkpOwotc3RhdGljIGJvb2xlYW4gYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmJfb3V0X2NhbGxiYWNrIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNhbGxqeF9jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXJlbGVudCAqLCBQVFIgc3JjLCBQVFIgZHN0LAotCSAgIGFzZWN0aW9uICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY2FsbGpfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFyZWxlbnQgKiwgUFRSIGRhdGEsCi0JICAgdW5zaWduZWQgaW50IHNyY2lkeCwgdW5zaWduZWQgaW50IGRzdGlkeCwgYXNlY3Rpb24gKiwgYm9vbGVhbikpOwotc3RhdGljIGJmZF92bWEgZ2V0X3ZhbHVlIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgIGFzZWN0aW9uICopKTsKLXN0YXRpYyBpbnQgYWJzMzJjb2RlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICosCi0JCQkgICAgICB1bnNpZ25lZCBpbnQsIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGJfb3V0X2JmZF9yZWxheF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCWJvb2xlYW4gKikpOwotc3RhdGljIGJmZF9ieXRlICpiX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKLSAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLWJvdXRfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotICBleGVjcC0+YV90bG9hZCAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGxvYWQpOwotICBleGVjcC0+YV9kbG9hZCAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGxvYWQpOwotICBleGVjcC0+YV90YWxpZ24gPSBieXRlcy0+ZV90YWxpZ25bMF07Ci0gIGV4ZWNwLT5hX2RhbGlnbiA9IGJ5dGVzLT5lX2RhbGlnblswXTsKLSAgZXhlY3AtPmFfYmFsaWduID0gYnl0ZXMtPmVfYmFsaWduWzBdOwotICBleGVjcC0+YV9yZWxheGFibGUgPSBieXRlcy0+ZV9yZWxheGFibGVbMF07Ci19Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcm5hbCBleGVjIGhlYWRlciBzdHJ1Y3R1cmUgaW50byB0aGUKLSAgIHN1cHBsaWVkIGJ1ZmZlciByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLiAgKi8KLQotUFJPVE8odm9pZCwgYm91dF9zd2FwX2V4ZWNfaGVhZGVyX291dCwKLQkgIChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCSAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpKTsKLXZvaWQKLWJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNwLCByYXdfYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvICAsIGJ5dGVzLT5lX2luZm8pOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGV4dCAgLCBieXRlcy0+ZV90ZXh0KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2RhdGEgICwgYnl0ZXMtPmVfZGF0YSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9ic3MgICAsIGJ5dGVzLT5lX2Jzcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9zeW1zICAsIGJ5dGVzLT5lX3N5bXMpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZW50cnkgLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90bG9hZCAsIGJ5dGVzLT5lX3Rsb2FkKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Rsb2FkICwgYnl0ZXMtPmVfZGxvYWQpOwotICBieXRlcy0+ZV90YWxpZ25bMF0gPSBleGVjcC0+YV90YWxpZ247Ci0gIGJ5dGVzLT5lX2RhbGlnblswXSA9IGV4ZWNwLT5hX2RhbGlnbjsKLSAgYnl0ZXMtPmVfYmFsaWduWzBdID0gZXhlY3AtPmFfYmFsaWduOwotICBieXRlcy0+ZV9yZWxheGFibGVbMF0gPSBleGVjcC0+YV9yZWxheGFibGU7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYl9vdXRfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgYW5leGVjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgYW5leGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOwotCi0gIGlmIChOX0JBRE1BRyAoYW5leGVjKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgYm91dF9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCAmZXhlY19ieXRlcywgJmFuZXhlYyk7Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgYl9vdXRfY2FsbGJhY2spOwotfQotCi0KLS8qIEZpbmlzaCB1cCB0aGUgb3BlbmluZyBvZiBhIGIub3V0IGZpbGUgZm9yIHJlYWRpbmcuICBGaWxsIGluIGFsbCB0aGUKLSAgIGZpZWxkcyB0aGF0IGFyZSBub3QgaGFuZGxlZCBieSBjb21tb24gY29kZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWJfb3V0X2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgdW5zaWduZWQgbG9uZyBic3Nfc3RhcnQ7Ci0KLSAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgKi8KLSAgYmZkX3NldF9hcmNoX21hY2goYWJmZCwKLQkJICAgIGJmZF9hcmNoX2k5NjAsIC8qIEIub3V0IG9ubHkgdXNlZCBvbiBpOTYwICovCi0JCSAgICBiZmRfbWFjaF9pOTYwX2NvcmUgLyogRGVmYXVsdCAqLwotCQkgICAgKTsKLQotICAvKiBUaGUgcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fU1lNT0ZGICgqZXhlY3ApOwotCi0gIC8qIFRoZSBhbGlnbm1lbnRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX3RhbGlnbjsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV9kYWxpZ247Ci0gIG9ial9ic3NzZWMgIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfYmFsaWduOwotCi0gIC8qIFRoZSBzdGFydGluZyBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV90bG9hZDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV9kbG9hZDsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmxtYSA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmxtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIEFuZCByZWxvYWQgdGhlIHNpemVzLCBzaW5jZSB0aGUgYW91dCBtb2R1bGUgemFwcyB0aGVtICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfdGV4dDsKLQotICBic3Nfc3RhcnQgPSBleGVjcC0+YV9kbG9hZCArIGV4ZWNwLT5hX2RhdGE7IC8qIEJTUyA9IGVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IGFsaWduX3Bvd2VyIChic3Nfc3RhcnQsIGV4ZWNwLT5hX2JhbGlnbik7Ci0KLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmxtYSA9IG9ial9ic3NzZWMgKGFiZmQpLT52bWE7Ci0KLSAgLyogVGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RST0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSAgTl9EUk9GRigqZXhlY3ApOwotCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7CS8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIGlmIChleGVjcC0+YV9yZWxheGFibGUpCi0gICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgewotICAgIHN0cnVjdCBhb3V0ZGF0YSBhOwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKLQotICByYXdwdHIgPSAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfYnNzc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWJfb3V0X3N5bWJvbF9jbXAgKGEsIGIpCi0gICAgIHN0cnVjdCBhb3V0X3N5bWJvbCAqKmEsICoqYjsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSBhdiwgYnY7Ci0KLSAgLyogUHJpbWFyeSBrZXkgaXMgYWRkcmVzcyAqLwotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKCYoKmEpLT5zeW1ib2wpOwotICBhdiA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCArICgqYSktPnN5bWJvbC52YWx1ZTsKLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uICgmKCpiKS0+c3ltYm9sKTsKLSAgYnYgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQgKyAoKmIpLT5zeW1ib2wudmFsdWU7Ci0KLSAgaWYgKGF2IDwgYnYpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoYXYgPiBidikKLSAgICByZXR1cm4gMTsKLQotICAvKiBTZWNvbmRhcnkga2V5IHB1dHMgQ0FMTE5BTUUgc3ltcyBsYXN0IGFuZCBCQUxOQU1FIHN5bXMgZmlyc3QsIHNvCi0gICAgIHRoYXQgdGhleSBoYXZlIHRoZSBiZXN0IGNoYW5jZSBvZiBiZWluZyBjb250aWd1b3VzLiAgKi8KLSAgaWYgKElTX0JBTE5BTUUgKCgqYSktPm90aGVyKSB8fCBJU19DQUxMTkFNRSAoKCpiKS0+b3RoZXIpKQotICAgIHJldHVybiAtMTsKLSAgaWYgKElTX0NBTExOQU1FICgoKmEpLT5vdGhlcikgfHwgSVNfQkFMTkFNRSAoKCpiKS0+b3RoZXIpKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIHN3YXBwZWRfaGRyOwotCi0gIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gQk1BR0lDOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgPSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChzdHJ1Y3Qgbmxpc3QpOwotICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGFsaWduID0gb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kYWxpZ24gPSBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2JhbGlnbiA9IG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Rsb2FkID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kbG9hZCA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotCi0gIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZzd2FwcGVkX2hkciwgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB7Q0FMTCxCQUx9TkFNRSBzeW1ib2xzIHJlbWFpbiBhZGphY2VudCBvbiBvdXRwdXQKLQkgYnkgc29ydGluZy4gIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBzdGFicyBhcmUKLQkgYWxzbyBvcmRlcmVkLiAgU29sdmUgdGhpcyBieSBzaGlmdGluZyBhbGwgc3RhYnMgdG8gdGhlIGVuZAotCSBpbiBvcmRlciwgdGhlbiBzb3J0aW5nIHRoZSByZXN0LiAgKi8KLQotICAgICAgYXN5bWJvbCAqKm91dHN5bXMsICoqcCwgKipxOwotCi0gICAgICBvdXRzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgICAgIHAgPSBvdXRzeW1zICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0KLSAgICAgIGZvciAocSA9IHAtLTsgcCA+PSBvdXRzeW1zOyBwLS0pCi0JewotCSAgaWYgKCgqcCktPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKnQgPSAqLS1xOwotCSAgICAgICpxID0gKnA7Ci0JICAgICAgKnAgPSB0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocSA+IG91dHN5bXMpCi0JcXNvcnQgKG91dHN5bXMsIHEgLSBvdXRzeW1zLCBzaXplb2YoYXN5bWJvbCopLCBiX291dF9zeW1ib2xfY21wKTsKLQotICAgICAgLyogQmFjayB0byB5b3VyIHJlZ3VsYXJseSBzY2hlZHVsZWQgcHJvZ3JhbS4gICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RST0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RST0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBTb21lIHJlbG9jIGhhY2tlcnkgKi8KLQotI2RlZmluZSBDQUxMUwkgIDB4NjYwMDM4MDAJLyogVGVtcGxhdGUgZm9yICdjYWxscycgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMCSAgMHgwYjAwMDAwMAkvKiBUZW1wbGF0ZSBmb3IgJ2JhbCcgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgQkFMX01BU0sgIDB4MDBmZmZmZmYKLSNkZWZpbmUgQkFMWAkgIDB4ODVmMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWx4JyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUxYX01BU0sgMHgwMDA3ZmZmZgotI2RlZmluZSBDQUxMICAgICAgMHgwOTAwMDAwMAotI2RlZmluZSBQQ1JFTDEzX01BU0sgMHgxZmZmCi0KLQotI2RlZmluZSBvdXRwdXRfYWRkcihzZWMpICgoc2VjKS0+b3V0cHV0X29mZnNldCsoc2VjKS0+b3V0cHV0X3NlY3Rpb24tPnZtYSkKLQotLyogTWFnaWMgdG8gdHVybiBjYWxseCBpbnRvIGNhbGxqeCAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY2FsbGp4X2NhbGxiYWNrIChhYmZkLCBsaW5rX2luZm8sIHJlbG9jX2VudHJ5LCBzcmMsIGRzdCwgaW5wdXRfc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGludCB3b3JkID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjKTsKLSAgYXN5bWJvbCAqc3ltYm9sX2luID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBhb3V0X3N5bWJvbF90eXBlICpzeW1ib2wgPSBhb3V0X3N5bWJvbCAoc3ltYm9sX2luKTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2NfZW50cnksIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgaWYgKElTX0NBTExOQU1FIChzeW1ib2wtPm90aGVyKSkKLSAgICB7Ci0gICAgICBhb3V0X3N5bWJvbF90eXBlICpiYWxzeW0gPSBzeW1ib2wrMTsKLSAgICAgIGludCBpbnN0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy00KTsKLSAgICAgIC8qIFRoZSBuZXh0IHN5bWJvbCBzaG91bGQgYmUgYW4gTl9CQUxOQU1FICovCi0gICAgICBCRkRfQVNTRVJUIChJU19CQUxOQU1FIChiYWxzeW0tPm90aGVyKSk7Ci0gICAgICBpbnN0ICY9IEJBTFhfTUFTSzsKLSAgICAgIGluc3QgfD0gQkFMWDsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc3QsIChiZmRfYnl0ZSAqKSBkc3QtNCk7Ci0gICAgICBzeW1ib2wgPSBiYWxzeW07Ci0gICAgICB2YWx1ZSA9IChzeW1ib2wtPnN5bWJvbC52YWx1ZQotCSAgICAgICArIG91dHB1dF9hZGRyIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uKSk7Ci0gICAgfQotCi0gIHdvcmQgKz0gdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGJmZF9wdXRfMzIoYWJmZCwgd29yZCwgZHN0KTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0vKiBNYWdpYyB0byB0dXJuIGNhbGwgaW50byBjYWxsaiAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY2FsbGpfY2FsbGJhY2sgKGFiZmQsIGxpbmtfaW5mbywgcmVsb2NfZW50cnksICBkYXRhLCBzcmNpZHgsIGRzdGlkeCwKLQkJaW5wdXRfc2VjdGlvbiwgc2hyaW5raW5nKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBQVFIgZGF0YTsKLSAgICAgdW5zaWduZWQgaW50IHNyY2lkeDsKLSAgICAgdW5zaWduZWQgaW50IGRzdGlkeDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJvb2xlYW4gc2hyaW5raW5nOwotewotICBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgc3JjaWR4KTsKLSAgYXN5bWJvbCAqc3ltYm9sX2luID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBhb3V0X3N5bWJvbF90eXBlICpzeW1ib2wgPSBhb3V0X3N5bWJvbCAoc3ltYm9sX2luKTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2NfZW50cnksIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgaWYgKElTX09USEVSKHN5bWJvbC0+b3RoZXIpKQotICAgIHsKLSAgICAgIC8qIENhbGwgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlIC0gcmVwbGFjZSBjb2RlIHdpdGggc3lzdGVtCi0JIHByb2NlZHVyZSBudW1iZXIuICAqLwotICAgICAgd29yZCA9IENBTExTIHwgKHN5bWJvbC0+b3RoZXIgLSAxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKElTX0NBTExOQU1FKHN5bWJvbC0+b3RoZXIpKQotICAgIHsKLSAgICAgIGFvdXRfc3ltYm9sX3R5cGUgKmJhbHN5bSA9IHN5bWJvbCsxOwotCi0gICAgICAvKiBUaGUgbmV4dCBzeW1ib2wgc2hvdWxkIGJlIGFuIE5fQkFMTkFNRS4gICovCi0gICAgICBCRkRfQVNTRVJUKElTX0JBTE5BTUUoYmFsc3ltLT5vdGhlcikpOwotICAgICAgCi0gICAgICAvKiBXZSBhcmUgY2FsbGluZyBhIGxlYWYsIHNvIHJlcGxhY2UgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gd2l0aCBhCi0JIGJhbC4gICovCi0gICAgICB3b3JkID0gQkFMIHwgKCh3b3JkCi0JCSAgICAgKyBvdXRwdXRfYWRkciAoYmFsc3ltLT5zeW1ib2wuc2VjdGlvbikKLQkJICAgICArIGJhbHN5bS0+c3ltYm9sLnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZAotCQkgICAgIC0gZHN0aWR4Ci0JCSAgICAgLSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikpCi0JCSAgICAmIEJBTF9NQVNLKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeW1ib2wtPnN5bWJvbC5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBBIGNhbGxqIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiBpcyBhIGZ1bGx5Ci0gICAgICAgICByZXNvbHZlZCByZWxhdGl2ZSBjYWxsLiAgV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLgotICAgICAgICAgSWYgdGhlIHN5bWJvbCBpcyBub3QgaW4gdGhlIHNhbWUgc2VjdGlvbiwgSSdtIG5vdCBzdXJlIHdoYXQKLSAgICAgICAgIHRvIGRvOyBmb3J0dW5hdGVseSwgdGhpcyBjYXNlIHdpbGwgcHJvYmFibHkgbmV2ZXIgYXJpc2UuICAqLwotICAgICAgQkZEX0FTU0VSVCAoISBzaHJpbmtpbmcpOwotICAgICAgQkZEX0FTU0VSVCAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3b3JkID0gQ0FMTCB8ICgoKHdvcmQgJiBCQUxfTUFTSykKLQkJICAgICAgKyB2YWx1ZQotCQkgICAgICArIHJlbG9jX2VudHJ5LT5hZGRlbmQKLQkJICAgICAgLSAoc2hyaW5raW5nID8gZHN0aWR4IDogMCkKLQkJICAgICAgLSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikpCi0JCSAgICAgJiBCQUxfTUFTSyk7Ci0gICAgfQotICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgZHN0aWR4KTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogdHlwZSByc2hpZnQgc2l6ZSAgYml0c2l6ZSAgCXBjcmVsCWJpdHBvcyAgYWJzb2x1dGUgb3ZlcmZsb3cgY2hlY2sqLwotCi0jZGVmaW5lIEFCUzMyQ09ERSAwCi0jZGVmaW5lIEFCUzMyQ09ERV9TSFJVTksgMQotI2RlZmluZSBQQ1JFTDI0IDIKLSNkZWZpbmUgQ0FMTEogMwotI2RlZmluZSBBQlMzMiA0Ci0jZGVmaW5lIFBDUkVMMTMgNQotI2RlZmluZSBBQlMzMl9NQVlCRV9SRUxBWEFCTEUgMQotI2RlZmluZSBBQlMzMl9XQVNfUkVMQVhBQkxFIDIKLQotI2RlZmluZSBBTElHTkVSIDEwCi0jZGVmaW5lIEFMSUdORE9ORSAxMQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfY2FsbGogPQotSE9XVE8oQ0FMTEosIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsImNhbGxqIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZixmYWxzZSk7Ci1zdGF0aWMgIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzIgPQotSE9XVE8oQUJTMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiYWJzMzIiLCB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfcGNyZWwyNCA9Ci1IT1dUTyhQQ1JFTDI0LCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsInBjcmVsMjQiLCB0cnVlLCAweDAwZmZmZmZmLDB4MDBmZmZmZmYsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxvY19wY3JlbDEzID0KLUhPV1RPKFBDUkVMMTMsIDAsIDIsIDEzLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwicGNyZWwxMyIsIHRydWUsIDB4MDAwMDFmZmYsMHgwMDAwMWZmZixmYWxzZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzJjb2Rlc2hydW5rID0KLUhPV1RPKEFCUzMyQ09ERV9TSFJVTkssIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsImNhbGx4LT5jYWxsaiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsZmFsc2UpOwotCi1zdGF0aWMgIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzJjb2RlID0KLUhPV1RPKEFCUzMyQ09ERSwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJjYWxseCIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2FsaWduX3RhYmxlW10gPSB7Ci0gIEhPV1RPIChBTElHTkVSLCAwLCAweDEsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24xNiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkVSLCAwLCAweDMsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24zMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkVSLCAwLCAweDcsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ242NCIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkVSLCAwLCAweGYsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24xMjgiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fZG9uZV9hbGlnbl90YWJsZVtdID0gewotICBIT1dUTyAoQUxJR05ET05FLCAweDEsIDB4MSwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24xNiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkRPTkUsIDB4MywgMHgzLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjMyIiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHg3LCAweDcsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05ET05FLCAweGYsIDB4ZiwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24xMjgiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYl9vdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19jYWxsajsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19hYnMzMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfcGNyZWwyNDsKLSAgICB9Ci19Ci0KLS8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHJlbG9jIGVudHJpZXMsIHBsdXMgcG9pbnRlcnMgdG8gdGhlbSBhbGwgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgOwotICBhcmVsZW50ICpjYWNoZV9wdHIgOwotICBpbnQgZXh0ZXJuX21hc2ssIHBjcmVsX21hc2ssIGNhbGxqX21hc2ssIGxlbmd0aF9zaGlmdDsKLSAgaW50IGluY29kZV9tYXNrOwotICBpbnQgc2l6ZV9tYXNrOwotICBiZmRfdm1hIHByZXZfYWRkciA9IDA7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc2l6ZV90ICByZWxvY19zaXplOwotICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCFhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfZHJzaXplOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfdHJzaXplOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkgewotICAgIHJlbG9jX3NpemUgPSAwOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotIGRvaXQ6Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShhc2VjdC0+cmVsX2ZpbGVwb3MpLCAgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb3VudCA9IHJlbG9jX3NpemUgLyBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotCi0gIHJlbG9jcyA9IChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jcyAmJiByZWxvY19zaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopIGJmZF9tYWxsb2MgKChjb3VudCsxKSAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAoIXJlbG9jX2NhY2hlKSB7Ci0gICAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgICAgZnJlZSAoKGNoYXIqKXJlbG9jcyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpIHsKLSAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICAvKiBiaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDgwOwotICAgIGV4dGVybl9tYXNrID0gMHgxMDsKLSAgICBpbmNvZGVfbWFzayA9IDB4MDg7Ci0gICAgY2FsbGpfbWFzayAgPSAweDAyOwotICAgIHNpemVfbWFzayA9ICAgMHgyMDsKLSAgICBsZW5ndGhfc2hpZnQgPSA1OwotICB9IGVsc2UgewotICAgIC8qIGxpdHRsZS1lbmRpYW4gYml0IGZpZWxkIGFsbG9jYXRpb24gb3JkZXIgKi8KLSAgICBwY3JlbF9tYXNrICA9IDB4MDE7Ci0gICAgZXh0ZXJuX21hc2sgPSAweDA4OwotICAgIGluY29kZV9tYXNrID0gMHgxMDsKLSAgICBjYWxsal9tYXNrICA9IDB4NDA7Ci0gICAgc2l6ZV9tYXNrICAgPSAweDAyOwotICAgIGxlbmd0aF9zaGlmdCA9IDE7Ci0gIH0KLQotICBmb3IgKHJwdHIgPSByZWxvY3MsIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlLCBjb3VudGVyID0gMDsKLSAgICAgICBjb3VudGVyIDwgY291bnQ7Ci0gICAgICAgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqcmF3ID0gKHVuc2lnbmVkIGNoYXIgKilycHRyOwotICAgIHVuc2lnbmVkIGludCBzeW1udW07Ci0gICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXcgKyAwKTsKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gMDsKLSAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBzeW1udW0gPSAocmF3WzRdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNl07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzeW1udW0gPSAocmF3WzZdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNF07Ci0gICAgfQotCi0gICAgaWYgKHJhd1s3XSAmIGV4dGVybl9tYXNrKQotICAgIHsKLSAgICAgIC8qIGlmIHRoaXMgaXMgc2V0IHRoZW4gdGhlIHJfaW5kZXggaXMgYSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGU7Ci0gICAgICAgKiBpZiB0aGUgYml0IGlzIG5vdCBzZXQgdGhlbiByX2luZGV4IGNvbnRhaW5zIGEgc2VjdGlvbiBtYXAuCi0gICAgICAgKiB3ZSBlaXRoZXIgZmlsbCBpbiB0aGUgc3ltIGVudHJ5IHdpdGggYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wsCi0gICAgICAgKiBvciBwb2ludCB0byB0aGUgY29ycmVjdCBzZWN0aW9uCi0gICAgICAgKi8KLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgc3ltbnVtOwotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIC8qIGluIGEub3V0IHN5bWJvbHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgKiBmaWxlIHJhdGhlciB0aGFuIHNlY3Rpb25zID8KLSAgICAgICAqIChsb29rIGluIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpCi0gICAgICAgKiB0aGUgcmVsb2MgZW50cnkgYWRkZW5kIGhhcyBhZGRlZCB0byBpdCB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgICAgKiBmaWxlIG9mIHRoZSBkYXRhLCBzbyBzdWJ0cmFjdCB0aGUgYmFzZSB0byBtYWtlIHRoZSByZWxvYwotICAgICAgICogc2VjdGlvbiByZWxhdGl2ZSAqLwotICAgICAgaW50IHM7Ci0gICAgICB7Ci0JLyogc2lnbi1leHRlbmQgc3ltbnVtIGZyb20gMjQgYml0cyB0byB3aGF0ZXZlciBob3N0IHVzZXMgKi8KLQlzID0gc3ltbnVtOwotCWlmIChzICYgKDEgPDwgMjMpKQotCSAgcyB8PSAofjApIDw8IDI0OwotICAgICAgfQotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKU5VTEw7Ci0gICAgICBzd2l0Y2ggKHMpCi0gICAgICB7Ci0gICAgICAgY2FzZSBOX1RFWFQ6Ci0gICAgICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gLSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOwotCWJyZWFrOwotICAgICAgIGNhc2UgTl9EQVRBOgotICAgICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9kYXRhc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKLQljYWNoZV9wdHItPmFkZGVuZCA9IC0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKLQlicmVhazsKLSAgICAgICBjYXNlIE5fQlNTOgotICAgICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKLQljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX2Jzc3NlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7Ci0JY2FjaGVfcHRyLT5hZGRlbmQgPSAgLSBvYmpfYnNzc2VjKGFiZmQpLT52bWE7Ci0JYnJlYWs7Ci0gICAgICAgY2FzZSBOX0FCUzoKLSAgICAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gMDsKLQlicmVhazsKLSAgICAgIGNhc2UgLTI6IC8qIC5hbGlnbiAqLwotCWlmIChyYXdbN10gJiBwY3JlbF9tYXNrKQotCSAgewotCSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX2FsaWduX3RhYmxlWyhyYXdbN10gPj4gbGVuZ3RoX3NoaWZ0KSAmIDNdOwotCSAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiAub3JnPyAqLwotCSAgICBhYm9ydCAoKTsKLQkgIH0KLQljYWNoZV9wdHItPmFkZGVuZCA9IDA7Ci0JYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLQlCRkRfQVNTRVJUKDApOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgfQotCi0gICAgLyogdGhlIGk5NjAgb25seSBoYXMgYSBmZXcgcmVsb2NhdGlvbiB0eXBlczoKLSAgICAgICBhYnMgMzItYml0IGFuZCBwY3JlbCAyNGJpdC4gICBleGNlcHQgZm9yIGNhbGxqJ3MhICAqLwotICAgIGlmIChjYWNoZV9wdHItPmhvd3RvICE9IDApCi0gICAgICA7Ci0gICAgZWxzZSBpZiAocmF3WzddICYgY2FsbGpfbWFzaykKLSAgICB7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX2NhbGxqOwotICAgIH0KLSAgICBlbHNlIGlmICggcmF3WzddICYgcGNyZWxfbWFzaykKLSAgICB7Ci0gICAgICBpZiAocmF3WzddICYgc2l6ZV9tYXNrKQotICAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfcGNyZWwxMzsKLSAgICAgIGVsc2UKLSAgICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX3BjcmVsMjQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocmF3WzddICYgaW5jb2RlX21hc2spCi0gICAgICB7Ci0JY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNhY2hlX3B0ci0+YWRkcmVzcyA8IHByZXZfYWRkcikKLSAgICB7Ci0gICAgICAvKiBPdWNoISB0aGlzIHJlbG9jIGlzIG91dCBvZiBvcmRlciwgaW5zZXJ0IGludG8gdGhlIHJpZ2h0IHBsYWNlCi0gICAgICAgKi8KLSAgICAgIGFyZWxlbnQgdG1wOwotICAgICAgYXJlbGVudCAqY3Vyc29yID0gY2FjaGVfcHRyLTE7Ci0gICAgICBiZmRfdm1hIHN0b3AgPSBjYWNoZV9wdHItPmFkZHJlc3M7Ci0gICAgICB0bXAgID0gKmNhY2hlX3B0cjsKLSAgICAgIHdoaWxlIChjdXJzb3ItPmFkZHJlc3MgPiBzdG9wICYmIGN1cnNvciA+PSByZWxvY19jYWNoZSkKLSAgICAgIHsKLQljdXJzb3JbMV0gPSBjdXJzb3JbMF07Ci0JY3Vyc29yLS07Ci0gICAgICB9Ci0gICAgICBjdXJzb3JbMV0gPSB0bXA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwcmV2X2FkZHIgPSBjYWNoZV9wdHItPmFkZHJlc3M7Ci0gICAgfQotICB9Ci0KLQotICBpZiAocmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NzKTsKLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gY291bnQ7Ci0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICBpbnQgcl9leHRlcm4gPSAwOwotICBpbnQgcl9pZHg7Ci0gIGludCBpbmNvZGVfbWFzazsKLSAgaW50IGxlbl8xOwotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgbmF0c2l6ZSA9IGNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLSAgaW50IGV4dGVybl9tYXNrLCBwY3JlbF9tYXNrLCAgbGVuXzIsIGNhbGxqX21hc2s7Ci0gIGlmIChjb3VudCA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgZ2VuZXJpYyAgID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0gIG5hdGl2ZSA9ICgoc3RydWN0IHJlbG9jYXRpb25faW5mbyAqKSBiZmRfbWFsbG9jIChuYXRzaXplKSk7Ci0gIGlmICghbmF0aXZlICYmIG5hdHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gIHsKLSAgICAvKiBCaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDgwOwotICAgIGV4dGVybl9tYXNrID0gMHgxMDsKLSAgICBsZW5fMiAgICAgICA9IDB4NDA7Ci0gICAgbGVuXzEgICAgICAgPSAweDIwOwotICAgIGNhbGxqX21hc2sgID0gMHgwMjsKLSAgICBpbmNvZGVfbWFzayA9IDB4MDg7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLyogTGl0dGxlLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLwotICAgIHBjcmVsX21hc2sgID0gMHgwMTsKLSAgICBleHRlcm5fbWFzayA9IDB4MDg7Ci0gICAgbGVuXzIgICAgICAgPSAweDA0OwotICAgIGxlbl8xICAgICAgID0gMHgwMjsKLSAgICBjYWxsal9tYXNrICA9IDB4NDA7Ci0gICAgaW5jb2RlX21hc2sgPSAweDEwOwotICB9Ci0KLSAgZm9yIChuYXRwdHIgPSBuYXRpdmU7IGNvdW50ID4gMDsgLS1jb3VudCwgKytuYXRwdHIsICsrZ2VuZXJpYykKLSAgewotICAgIGFyZWxlbnQgKmcgPSAqZ2VuZXJpYzsKLSAgICB1bnNpZ25lZCBjaGFyICpyYXcgPSAodW5zaWduZWQgY2hhciAqKW5hdHB0cjsKLSAgICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLQotICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZy0+YWRkcmVzcywgcmF3KTsKLSAgICAvKiBGaW5kIGEgdHlwZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB3aGljaCBtYXRjaGVzIHRoZSBpbnB1dCBob3d0byAtCi0gICAgICogYXQgdGhlIG1vbWVudCB3ZSBhc3N1bWUgaW5wdXQgZm9ybWF0ID09IG91dHB1dCBmb3JtYXQgRklYTUUhIQotICAgICAqLwotICAgIHJfaWR4ID0gMDsKLSAgICAvKiBGSVhNRTogIE5lZWQgY2FsbGogc3R1ZmYgaGVyZSwgYW5kIHRvIGNoZWNrIHRoZSBob3d0byBlbnRyaWVzIHRvCi0gICAgICAgYmUgc3VyZSB0aGV5IGFyZSByZWFsIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gICovCi0gICAgaWYgKGctPmhvd3RvPT0gJmhvd3RvX3JlbG9jX2NhbGxqKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IGNhbGxqX21hc2sgKyBwY3JlbF9tYXNrICsgbGVuXzI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID09ICZob3d0b19yZWxvY19wY3JlbDI0KQotICAgIHsKLSAgICAgIHJhd1s3XSA9IHBjcmVsX21hc2sgKyBsZW5fMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZy0+aG93dG8gPT0gJmhvd3RvX3JlbG9jX3BjcmVsMTMpCi0gICAgewotICAgICAgcmF3WzddID0gcGNyZWxfbWFzayArIGxlbl8xOwotICAgIH0KLSAgICBlbHNlIGlmIChnLT5ob3d0byA9PSAmaG93dG9fcmVsb2NfYWJzMzJjb2RlKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IGxlbl8yICsgaW5jb2RlX21hc2s7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID49IGhvd3RvX2FsaWduX3RhYmxlCi0JICAgICAmJiBnLT5ob3d0byA8PSAoaG93dG9fYWxpZ25fdGFibGUKLQkJCSAgICArIHNpemVvZiAoaG93dG9fYWxpZ25fdGFibGUpIC8gc2l6ZW9mIChob3d0b19hbGlnbl90YWJsZVswXSkKLQkJCSAgICAtIDEpKQotICAgICAgewotCS8qIHN5bW51bSA9PSAtMjsgZXh0ZXJuX21hc2sgbm90IHNldCwgcGNyZWxfbWFzayBzZXQgKi8KLQlyX2lkeCA9IC0yOwotCXJfZXh0ZXJuID0gMDsKLQlyYXdbN10gPSAocGNyZWxfbWFzawotCQkgIHwgKChnLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKSA8PCAxKSk7Ci0gICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByYXdbN10gPSBsZW5fMjsKLSAgICB9Ci0KLSAgICBpZiAocl9pZHggIT0gMCkKLSAgICAgIC8qIGFscmVhZHkgbXVja2VkIHdpdGggcl9leHRlcm4sIHJfaWR4ICovOwotICAgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCSAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotCi0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLSAgICAgIHsKLQkvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQlyX2lkeCA9IDA7Ci0Jcl9leHRlcm4gPSAwOwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkvKiBGaWxsIGluIHN5bWJvbCAqLwotCi0Jcl9leHRlcm4gPSAxOwotCXJfaWR4ID0gKCpnLT5zeW1fcHRyX3B0ciktPnVkYXRhLmk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaWR4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICAgIHJhd1s0XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHggPj4gMTYpOwotICAgICAgcmF3WzVdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCA+PiAgOCk7Ci0gICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOwotICAgIH0gZWxzZSB7Ci0gICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ID4+IDE2KTsKLSAgICAgIHJhd1s1XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHg+PiAgOCk7Ci0gICAgICByYXdbNF0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOwotICAgIH0KLSAgICBpZiAocl9leHRlcm4pCi0gICAgIHJhd1s3XSB8PSBleHRlcm5fbWFzazsKLSAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkgewotICAgIGZyZWUoKFBUUiluYXRpdmUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmcmVlICgoUFRSKW5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotc3RhdGljIGxvbmcKLWJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgewotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gPT0gTlVMTAotCSAgJiYgISBiX291dF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0JKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgfQotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotc3RhdGljIGxvbmcKLWJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiBzaXplb2YgKGFyZWxlbnQgKikgKiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCi0JICAgICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKLQkgICAgICsxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCi0JICAgICgoZXhlY19oZHIoYWJmZCktPmFfdHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKLQkgICAgICsxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAtMTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1iX291dF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKSB7IC8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgaWYgKCEgYW91dF8zMl9tYWtlX3NlY3Rpb25zIChhYmZkKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci0gICAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApIHsKLSAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLQotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQkvKiBVbmtub3duIG1hY2hpbmUgYXJjaCBpcyBPSyAqLwotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF9pOTYwKQkvKiBpOTYwIGRlZmF1bHQgaXMgT0sgKi8KLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1iX291dF9zaXplb2ZfaGVhZGVycyAoaWdub3JlX2FiZmQsIGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYm9vbGVhbiBpZ25vcmU7Ci17Ci0gIHJldHVybiBzaXplb2Yoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBiZmRfdm1hCi1nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOwotCi0gIC8qIEEgc3ltYm9sIGhvbGRzIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQgZnJvbSB0aGUKLSAgICAgYmFzZSBvZiB0aGUgc2VjdGlvbi4gIFRvIHJlbG9jYXRlLCB3ZSBmaW5kIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwKLSAgICAgbGl2ZSBpbiB0aGUgb3V0cHV0IGFuZCBhZGQgdGhhdCBpbiAqLwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgQkZELiAgTG9vayBpdCB1cCBpbiB0aGUKLQkgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgd2hlbgotCSB3ZSBjb252ZXJ0IGIub3V0IHRvIHVzZSBhIHNwZWNpZmljIGZpbmFsX2xpbmsgZnVuY3Rpb24gYW5kCi0JIGNoYW5nZSB0aGUgaW50ZXJmYWNlIHRvIGJmZF9yZWxheF9zZWN0aW9uIHRvIG5vdCByZXF1aXJlIHRoZQotCSBnZW5lcmljIHN5bWJvbHMuICAqLwotICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGlucHV0X3NlY3Rpb24tPm93bmVyLCBsaW5rX2luZm8sCi0JCQkJCWJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCQkJCWZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXZhbHVlID0gaC0+dS5kZWYudmFsdWUgKyBvdXRwdXRfYWRkciAoaC0+dS5kZWYuc2VjdGlvbik7Ci0gICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JdmFsdWUgPSBoLT51LmMuc2l6ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCSAgaW5wdXRfc2VjdGlvbi0+b3duZXIsIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCSAgdmFsdWUgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBvdXRwdXRfYWRkciAoc3ltYm9sLT5zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlbG9jYXRpb24gKi8KLSAgdmFsdWUgKz0gcmVsb2MtPmFkZGVuZDsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wZXJmb3JtX3NsaXAgKGFiZmQsIHNsaXAsIGlucHV0X3NlY3Rpb24sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzbGlwOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogRmluZCBhbGwgc3ltYm9scyBwYXN0IHRoaXMgcG9pbnQsIGFuZCBtYWtlIHRoZW0ga25vdwotICAgICB3aGF0J3MgaGFwcGVuZWQgKi8KLSAgd2hpbGUgKCpzKQotICB7Ci0gICAgYXN5bWJvbCAqcCA9ICpzOwotICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24pCi0gICAgewotICAgICAgLyogVGhpcyB3YXMgcG9pbnRpbmcgaW50byB0aGlzIHNlY3Rpb24sIHNvIG1hbmdsZSBpdCAqLwotICAgICAgaWYgKHAtPnZhbHVlID4gdmFsdWUpCi0gICAgICB7Ci0JcC0+dmFsdWUgLT1zbGlwOwotCWlmIChwLT51ZGF0YS5wICE9IE5VTEwpCi0JICB7Ci0JICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBwLT51ZGF0YS5wOwotCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKTsKLQkgICAgaC0+cm9vdC51LmRlZi52YWx1ZSAtPSBzbGlwOwotCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnUuZGVmLnZhbHVlID09IHAtPnZhbHVlKTsKLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcysrOwotCi0gIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIHdvcmtzIG91dCBpZiB0aGUgdGhpbmcgd2Ugd2FudCB0byBnZXQgdG8gY2FuIGJlCi0gICByZWFjaGVkIHdpdGggYSAyNGJpdCBvZmZzZXQgaW5zdGVhZCBvZiBhIDMyIGJpdCBvbmUuCi0gICBJZiBpdCBjYW4sIHRoZW4gaXQgY2hhbmdlcyB0aGUgYW1vZGUgKi8KLQotc3RhdGljIGludAotYWJzMzJjb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcjsKLSAgICAgdW5zaWduZWQgaW50IHNocmluazsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkX3ZtYSB2YWx1ZSA9IGdldF92YWx1ZSAociwgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLSAgYmZkX3ZtYSBkb3QgPSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikgKyByLT5hZGRyZXNzOwotICBiZmRfdm1hIGdhcDsKLQotICAvKiBTZWUgaWYgdGhlIGFkZHJlc3Mgd2UncmUgbG9va2luZyBhdCB3aXRoaW4gMl4yMyBieXRlcyBvZiB3aGVyZQotICAgICB3ZSBhcmUsIGlmIHNvIHRoZW4gd2UgY2FuIHVzZSBhIHNtYWxsIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUKLSAgICAganVtcCB3ZSB3ZXJlIGdvaW5nIHRvICovCi0KLSAgZ2FwID0gdmFsdWUgLSAoZG90IC0gc2hyaW5rKTsKLQotCi0gIGlmICgtMTw8MjMgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTw8MjMgKQotICB7Ci0gICAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMzJiaXRjb2RlIHBvc3NpYmxlIDI0LCB0byAyNGJpdAotICAgICAgIHBvc3NpYmxlIDMyICovCi0KLSAgICByLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGVzaHJ1bms7Ci0gICAgLyogVGhlIHBsYWNlIHRvIHJlbGMgbW92ZXMgYmFjayBieSBmb3VyIGJ5dGVzICovCi0gICAgci0+YWRkcmVzcyAtPTQ7Ci0KLSAgICAvKiBUaGlzIHdpbGwgYmUgZm91ciBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotICAgIHNocmluayArPSA0IDsKLSAgICBwZXJmb3JtX3NsaXAgKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIHItPmFkZHJlc3Mtc2hyaW5rICsgNCk7Ci0gIH0KLSAgcmV0dXJuIHNocmluazsKLX0KLQotc3RhdGljIGludAotYWxpZ25jb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmspCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnI7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci17Ci0gIGJmZF92bWEgZG90ID0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pICsgci0+YWRkcmVzczsKLSAgYmZkX3ZtYSBnYXA7Ci0gIGJmZF92bWEgb2xkX2VuZDsKLSAgYmZkX3ZtYSBuZXdfZW5kOwotICBpbnQgc2hyaW5rX2RlbHRhOwotICBpbnQgc2l6ZSA9IHItPmhvd3RvLT5zaXplOwotCi0gIC8qIFJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgYWxpZ25tZW50IHNvIHRoYXQgaXQncyBzdGlsbCBhbGlnbmVkIGJ1dAotICAgICBzbWFsbGVyICAtIHRoZSBjdXJyZW50IHNpemUgaXMgYWxyZWFkeSB0aGUgc2FtZSBzaXplIGFzIG9yIGJpZ2dlcgotICAgICB0aGFuIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAqLwotCi0gIC8qIGNhbGN1bGF0ZSB0aGUgZmlyc3QgYnl0ZSBmb2xsb3dpbmcgdGhlIHBhZGRpbmcgYmVmb3JlIHdlIG9wdGltaXplICovCi0gIG9sZF9lbmQgPSAoKGRvdCArIHNpemUgKSAmIH5zaXplKSArIHNpemUrMTsKLSAgLyogd29yayBvdXQgd2hlcmUgdGhlIG5ldyBlbmQgd2lsbCBiZSAtIHJlbWVtYmVyIHRoYXQgd2UncmUgc21hbGxlcgotICAgICB0aGFuIHdlIHVzZWQgdG8gYmUgKi8KLSAgbmV3X2VuZCA9ICgoZG90IC0gc2hyaW5rICsgc2l6ZSkgJiB+c2l6ZSk7Ci0KLSAgLyogVGhpcyBpcyB0aGUgbmV3IGVuZCAqLwotICBnYXAgPSBvbGRfZW5kIC0gKChkb3QgKyBzaXplKSAmIH5zaXplKTsKLQotICBzaHJpbmtfZGVsdGEgPSAob2xkX2VuZCAtIG5ld19lbmQpIC0gc2hyaW5rOwotCi0gIGlmIChzaHJpbmtfZGVsdGEpCi0gIHsKLSAgICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHNvIHRoYXQgaXQga25vd3MgaG93IGZhciB0byBhbGlnbiB0byAqLwotICAgIHItPmhvd3RvID0gaG93dG9fZG9uZV9hbGlnbl90YWJsZSArIChyLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKTsKLQotICAgIC8qIEVuY29kZSB0aGUgc3R1ZmYgaW50byB0aGUgYWRkZW5kIC0gZm9yIGZ1dHVyZSB1c2Ugd2UgbmVlZCB0bwotICAgICAgIGtub3cgaG93IGJpZyB0aGUgcmVsb2MgdXNlZCB0byBiZSAqLwotICAgIHItPmFkZGVuZCA9IG9sZF9lbmQgLSBkb3QgKyByLT5hZGRyZXNzOwotCi0gICAgLyogVGhpcyB3aWxsIGJlIE4gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4sIGFkanVzdCBhbGwgdGhlIHN5bWJvbHMgKi8KLSAgICBwZXJmb3JtX3NsaXAgKGFiZmQsIHNocmlua19kZWx0YSwgaW5wdXRfc2VjdGlvbiwgci0+YWRkcmVzcyAtIHNocmluayk7Ci0gICAgc2hyaW5rICs9IHNocmlua19kZWx0YTsKLSAgfQotICByZXR1cm4gc2hyaW5rOwotfQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfYmZkX3JlbGF4X3NlY3Rpb24gKGFiZmQsIGksIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmk7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGktPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGk7Ci0gIGludCBzaHJpbmsgPSAwIDsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoaW5wdXRfYmZkLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uKTsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG9ubHkgcnVuIHRoaXMgcmVsYXhhdGlvbiBvbmNlLiAgSXQgbWlnaHQgd29yayB0byBydW4gaXQKLSAgICAgbXVsdGlwbGUgdGltZXMsIGJ1dCBpdCBoYXNuJ3QgYmVlbiB0ZXN0ZWQuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAocmVsb2Nfc2l6ZSkKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX2NvdW50OwotCi0gICAgICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gICAgICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBHZXQgdGhlIHJlbG9jcyBhbmQgdGhpbmsgYWJvdXQgdGhlbSAqLwotICAgICAgcmVsb2NfY291bnQgPQotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NfdmVjdG9yLAotCQkJCV9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKTsKLSAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAocmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFyZWxlbnQgKipwYXJlbnQ7Ci0JICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudDsgcGFyZW50KyspCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICpyID0gKnBhcmVudDsKLQkgICAgICBzd2l0Y2ggKHItPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgQUxJR05FUjoKLQkJICAvKiBBbiBhbGlnbm1lbnQgcmVsb2MgKi8KLQkJICBzaHJpbmsgPSBhbGlnbmNvZGUgKGFiZmQsIGlucHV0X3NlY3Rpb24sIHIsIHNocmluayk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzJDT0RFOgotCQkgIC8qIEEgMzJiaXQgcmVsb2MgaW4gYW4gYWRkcmVzc2luZyBtb2RlICovCi0JCSAgc2hyaW5rID0gYWJzMzJjb2RlIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHIsIHNocmluaywKLQkJCQkgICAgICBsaW5rX2luZm8pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERV9TSFJVTks6Ci0JCSAgc2hyaW5rKz00OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLSBzaHJpbms7Ci0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJmZF9ieXRlICoKLWJfb3V0X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBkb24ndCBib3RoZXIgdG8gcmVsYXguICAqLwotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLAotCQkJCQkJICAgICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IDE7Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBCRkRfQVNTRVJUICh0cnVlID09IGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLAotCQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJCWRhdGEsCi0JCQkJCQkwLAotCQkJCQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudCA9IHJlbG9jX3ZlY3RvcjsKLSAgICAgIGFyZWxlbnQgKnJlbG9jIDsKLQotICAgICAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgcnVuOwotICAgICAgdW5zaWduZWQgaW50IGlkeDsKLQotICAgICAgLyogRmluZCBob3cgbG9uZyBhIHJ1biB3ZSBjYW4gZG8gKi8KLSAgICAgIHdoaWxlIChkc3RfYWRkcmVzcyA8IGxpbmtfb3JkZXItPnNpemUpCi0JewotCSAgcmVsb2MgPSAqcGFyZW50OwotCSAgaWYgKHJlbG9jKQotCSAgICB7Ci0JICAgICAgLyogTm90ZSB0aGF0IHRoZSByZWxheGluZyBkaWRuJ3QgdGllIHVwIHRoZSBhZGRyZXNzZXMgaW4gdGhlCi0JCSByZWxvY2F0aW9uLCBzbyB3ZSB1c2UgdGhlIG9yaWdpbmFsIGFkZHJlc3MgdG8gd29yayBvdXQgdGhlCi0JCSBydW4gb2Ygbm9uLXJlbG9jYXRlZCBkYXRhICovCi0JICAgICAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZHJlc3MgPj0gc3JjX2FkZHJlc3MpOwotCSAgICAgIHJ1biA9IHJlbG9jLT5hZGRyZXNzIC0gc3JjX2FkZHJlc3M7Ci0JICAgICAgcGFyZW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJ1biA9IGxpbmtfb3JkZXItPnNpemUgLSBkc3RfYWRkcmVzczsKLQkgICAgfQotCSAgLyogQ29weSB0aGUgYnl0ZXMgKi8KLQkgIGZvciAoaWR4ID0gMDsgaWR4IDwgcnVuOyBpZHgrKykKLQkgICAgewotCSAgICAgIGRhdGFbZHN0X2FkZHJlc3MrK10gPSBkYXRhW3NyY19hZGRyZXNzKytdOwotCSAgICB9Ci0KLQkgIC8qIE5vdyBkbyB0aGUgcmVsb2NhdGlvbiAqLwotCi0JICBpZiAocmVsb2MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIEFCUzMyQ09ERToKLQkJICBjYWxsanhfY2FsbGJhY2sgKGlucHV0X2JmZCwgbGlua19pbmZvLCByZWxvYywKLQkJCQkgICBzcmNfYWRkcmVzcyArIGRhdGEsIGRzdF9hZGRyZXNzICsgZGF0YSwKLQkJCQkgICBpbnB1dF9zZWN0aW9uKTsKLQkJICBzcmNfYWRkcmVzcys9NDsKLQkJICBkc3RfYWRkcmVzcys9NDsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMzMjoKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgICAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgc3JjX2FkZHJlc3MpCi0JCQkgICAgICAgKyBnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pKSwKLQkJCSAgICAgIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0FMTEo6Ci0JCSAgY2FsbGpfY2FsbGJhY2sgKGlucHV0X2JmZCwgbGlua19pbmZvLCByZWxvYywgZGF0YSwKLQkJCQkgIHNyY19hZGRyZXNzLCBkc3RfYWRkcmVzcywgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIGZhbHNlKTsKLQkJICBzcmNfYWRkcmVzcys9NDsKLQkJICBkc3RfYWRkcmVzcys9NDsKLQkJICBicmVhazsKLQkJY2FzZSBBTElHTkRPTkU6Ci0JCSAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZGVuZCA+PSBzcmNfYWRkcmVzcyk7Ci0JCSAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZGVuZCA8PSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgIHNyY19hZGRyZXNzID0gcmVsb2MtPmFkZGVuZDsKLQkJICBkc3RfYWRkcmVzcyA9ICgoZHN0X2FkZHJlc3MgKyByZWxvYy0+aG93dG8tPnNpemUpCi0JCQkJICYgfnJlbG9jLT5ob3d0by0+c2l6ZSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzJDT0RFX1NIUlVOSzoKLQkJICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjYWxseCwgYnV0IHdlJ3ZlIGZvdW5kIG91dCB0aGF0IGEKLQkJICAgICBjYWxsaiB3aWxsIHJlYWNoLCBzbyBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLwotCQkgIGNhbGxqX2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsIGRhdGEsCi0JCQkJICBzcmNfYWRkcmVzcyArIDQsIGRzdF9hZGRyZXNzLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgdHJ1ZSk7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgc3JjX2FkZHJlc3MrPTg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUwyNDoKLQkJICB7Ci0JCSAgICBsb25nIGludCB3b3JkID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCQkJZGF0YSArIHNyY19hZGRyZXNzKTsKLQkJICAgIGJmZF92bWEgdmFsdWU7Ci0KLQkJICAgIHZhbHVlID0gZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkJICAgIHdvcmQgPSAoKHdvcmQgJiB+QkFMX01BU0spCi0JCQkgICAgfCAoKCh3b3JkICYgQkFMX01BU0spCi0JCQkJKyB2YWx1ZQotCQkJCS0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pCi0JCQkJKyByZWxvYy0+YWRkZW5kKQotCQkJICAgICAgICYgQkFMX01BU0spKTsKLQotCQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB3b3JkLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQkgICAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgICBzcmNfYWRkcmVzcys9NDsKLQotCQkgIH0KLQkJICBicmVhazsKLQotCQljYXNlIFBDUkVMMTM6Ci0JCSAgewotCQkgICAgbG9uZyBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJCWRhdGEgKyBzcmNfYWRkcmVzcyk7Ci0JCSAgICBiZmRfdm1hIHZhbHVlOwotCi0JCSAgICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCSAgICB3b3JkID0gKCh3b3JkICYgflBDUkVMMTNfTUFTSykKLQkJCSAgICB8ICgoKHdvcmQgJiBQQ1JFTDEzX01BU0spCi0JCQkJKyB2YWx1ZQotCQkJCSsgcmVsb2MtPmFkZGVuZAotCQkJCS0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkJICAgICAgICYgUENSRUwxM19NQVNLKSk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgd29yZCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkJICAgIGRzdF9hZGRyZXNzKz00OwotCQkgICAgc3JjX2FkZHJlc3MrPTQ7Ci0KLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhYm9ydCgpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEJ1aWxkIHRoZSB0cmFuc2ZlciB2ZWN0b3JzIGZvciBCaWcgYW5kIExpdHRsZS1FbmRpYW4gQi5PVVQgZmlsZXMuICAqLwotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBiX291dF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiX291dF9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiX291dF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBiX291dF9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIGJfb3V0X2JmZF9nY19zZWN0aW9ucyAgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfYmlnX2hvc3QgPQotewotICAiYi5vdXQuYmlnIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwLAotfTsKLQotCi1jb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19saXR0bGVfaG9zdCA9Ci17Ci0gICJiLm91dC5saXR0bGUiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFICksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgJ18nLAkJCQkvKiBzeW1ib2wgbGVhZGluZyBjaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBiX291dF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgYl9vdXRfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NhY2hlLmMgYi9iZmQvY2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4ZGU0Yi4uMDAwMDAwMAotLS0gYS9iZmQvY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSAtLSBjYWNoaW5nIG9mIGZpbGUgZGVzY3JpcHRvcnMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzdGV2ZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCUZpbGUgY2FjaGluZwotCi0JVGhlIGZpbGUgY2FjaGluZyBtZWNoYW5pc20gaXMgZW1iZWRkZWQgd2l0aGluIEJGRCBhbmQgYWxsb3dzCi0JdGhlIGFwcGxpY2F0aW9uIHRvIG9wZW4gYXMgbWFueSBCRkRzIGFzIGl0IHdhbnRzIHdpdGhvdXQKLQlyZWdhcmQgdG8gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSdzIGZpbGUgZGVzY3JpcHRvcgotCWxpbWl0IChvZnRlbiBhcyBsb3cgYXMgMjAgb3BlbiBmaWxlcykuICBUaGUgbW9kdWxlIGluCi0JPDxjYWNoZS5jPj4gbWFpbnRhaW5zIGEgbGVhc3QgcmVjZW50bHkgdXNlZCBsaXN0IG9mCi0JPDxCRkRfQ0FDSEVfTUFYX09QRU4+PiBmaWxlcywgYW5kIGV4cG9ydHMgdGhlIG5hbWUKLQk8PGJmZF9jYWNoZV9sb29rdXA+Piwgd2hpY2ggcnVucyBhcm91bmQgYW5kIG1ha2VzIHN1cmUgdGhhdAotCXRoZSByZXF1aXJlZCBCRkQgaXMgb3Blbi4gSWYgbm90LCB0aGVuIGl0IGNob29zZXMgYSBmaWxlIHRvCi0JY2xvc2UsIGNsb3NlcyBpdCBhbmQgb3BlbnMgdGhlIG9uZSB3YW50ZWQsIHJldHVybmluZyBpdHMgZmlsZQotCWhhbmRsZS4gCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIHZvaWQgaW5zZXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzbmlwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjbG9zZV9vbmUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gYmZkX2NhY2hlX2RlbGV0ZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQlCRkRfQ0FDSEVfTUFYX09QRU4gbWFjcm8KLQotREVTQ1JJUFRJT04KLQlUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgd2hpY2ggdGhlIGNhY2hlIHdpbGwga2VlcCBvcGVuIGF0Ci0Jb25lIHRpbWUuCi0KLS4jZGVmaW5lIEJGRF9DQUNIRV9NQVhfT1BFTiAxMAotCi0qLwotCi0vKiBUaGUgbnVtYmVyIG9mIEJGRCBmaWxlcyB3ZSBoYXZlIG9wZW4uICAqLwotCi1zdGF0aWMgaW50IG9wZW5fZmlsZXM7Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9sYXN0X2NhY2hlCi0KLVNZTk9QU0lTCi0JZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLURFU0NSSVBUSU9OCi0JWmVybywgb3IgYSBwb2ludGVyIHRvIHRoZSB0b3Btb3N0IEJGRCBvbiB0aGUgY2hhaW4uICBUaGlzIGlzCi0JdXNlZCBieSB0aGUgPDxiZmRfY2FjaGVfbG9va3VwPj4gbWFjcm8gaW4gQGZpbGV7bGliYmZkLmh9IHRvCi0JZGV0ZXJtaW5lIHdoZW4gaXQgY2FuIGF2b2lkIGEgZnVuY3Rpb24gY2FsbC4KLSovCi0KLWJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLS8qCi0gIElOVEVSTkFMX0ZVTkNUSU9OCi0gIAliZmRfY2FjaGVfbG9va3VwCi0gCi0gIERFU0NSSVBUSU9OCi0gCUNoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWlyZWQgQkZEIGlzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG9uZQotIAlsb29rZWQgdXAuIElmIHNvLCB0aGVuIGl0IGNhbiB1c2UgdGhlIHN0cmVhbSBpbiB0aGUgQkZEIHdpdGgKLSAJaW1wdW5pdHksIHNpbmNlIGl0IGNhbid0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBsb29rdXA7Ci0gCW90aGVyd2lzZSwgaXQgaGFzIHRvIHBlcmZvcm0gdGhlIGNvbXBsaWNhdGVkIGxvb2t1cCBmdW5jdGlvbi4KLSAKLSAgLiNkZWZpbmUgYmZkX2NhY2hlX2xvb2t1cCh4KSBcCi0gIC4gICAgKCh4KT09YmZkX2xhc3RfY2FjaGU/IFwKLSAgLiAgICAgIChGSUxFKikoYmZkX2xhc3RfY2FjaGUtPmlvc3RyZWFtKTogXAotICAuICAgICAgIGJmZF9jYWNoZV9sb29rdXBfd29ya2VyKHgpKQotIAotIAotICovCi0KLS8qIEluc2VydCBhIEJGRCBpbnRvIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotaW5zZXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfbGFzdF9jYWNoZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFiZmQtPmxydV9uZXh0ID0gYWJmZDsKLSAgICAgIGFiZmQtPmxydV9wcmV2ID0gYWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhYmZkLT5scnVfbmV4dCA9IGJmZF9sYXN0X2NhY2hlOwotICAgICAgYWJmZC0+bHJ1X3ByZXYgPSBiZmRfbGFzdF9jYWNoZS0+bHJ1X3ByZXY7Ci0gICAgICBhYmZkLT5scnVfcHJldi0+bHJ1X25leHQgPSBhYmZkOwotICAgICAgYWJmZC0+bHJ1X25leHQtPmxydV9wcmV2ID0gYWJmZDsKLSAgICB9Ci0gIGJmZF9sYXN0X2NhY2hlID0gYWJmZDsKLX0KLQotLyogUmVtb3ZlIGEgQkZEIGZyb20gdGhlIGNhY2hlLiAgKi8KLQotc3RhdGljIElOTElORSB2b2lkCi1zbmlwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPmxydV9wcmV2LT5scnVfbmV4dCA9IGFiZmQtPmxydV9uZXh0OwotICBhYmZkLT5scnVfbmV4dC0+bHJ1X3ByZXYgPSBhYmZkLT5scnVfcHJldjsKLSAgaWYgKGFiZmQgPT0gYmZkX2xhc3RfY2FjaGUpCi0gICAgewotICAgICAgYmZkX2xhc3RfY2FjaGUgPSBhYmZkLT5scnVfbmV4dDsKLSAgICAgIGlmIChhYmZkID09IGJmZF9sYXN0X2NhY2hlKQotCWJmZF9sYXN0X2NhY2hlID0gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFdlIG5lZWQgdG8gb3BlbiBhIG5ldyBmaWxlLCBhbmQgdGhlIGNhY2hlIGlzIGZ1bGwuICBGaW5kIHRoZSBsZWFzdAotICAgcmVjZW50bHkgdXNlZCBjYWNoZWFibGUgQkZEIGFuZCBjbG9zZSBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jbG9zZV9vbmUgKCkKLXsKLSAgcmVnaXN0ZXIgYmZkICpraWxsOwotCi0gIGlmIChiZmRfbGFzdF9jYWNoZSA9PSBOVUxMKQotICAgIGtpbGwgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChraWxsID0gYmZkX2xhc3RfY2FjaGUtPmxydV9wcmV2OwotCSAgICEga2lsbC0+Y2FjaGVhYmxlOwotCSAgIGtpbGwgPSBraWxsLT5scnVfcHJldikKLQl7Ci0JICBpZiAoa2lsbCA9PSBiZmRfbGFzdF9jYWNoZSkKLQkgICAgewotCSAgICAgIGtpbGwgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoa2lsbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBubyBvcGVuIGNhY2hlYWJsZSBCRkQncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAga2lsbC0+d2hlcmUgPSBmdGVsbCAoKEZJTEUgKikga2lsbC0+aW9zdHJlYW0pOwotCi0gIHJldHVybiBiZmRfY2FjaGVfZGVsZXRlIChraWxsKTsKLX0KLQotLyogQ2xvc2UgYSBCRkQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iZmRfY2FjaGVfZGVsZXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmIChmY2xvc2UgKChGSUxFICopIGFiZmQtPmlvc3RyZWFtKSA9PSAwKQotICAgIHJldCA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXQgPSBmYWxzZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgfQotCi0gIHNuaXAgKGFiZmQpOwotCi0gIGFiZmQtPmlvc3RyZWFtID0gTlVMTDsKLSAgLS1vcGVuX2ZpbGVzOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9pbml0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2FjaGVfaW5pdCAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlBZGQgYSBuZXdseSBvcGVuZWQgQkZEIHRvIHRoZSBjYWNoZS4KLSovCi0KLWJvb2xlYW4KLWJmZF9jYWNoZV9pbml0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEJGRF9BU1NFUlQgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpOwotICBpZiAob3Blbl9maWxlcyA+PSBCRkRfQ0FDSEVfTUFYX09QRU4pCi0gICAgewotICAgICAgaWYgKCEgY2xvc2Vfb25lICgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGluc2VydCAoYWJmZCk7Ci0gICsrb3Blbl9maWxlczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9jbG9zZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NhY2hlX2Nsb3NlIChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJlbW92ZSB0aGUgQkZEIEB2YXJ7YWJmZH0gZnJvbSB0aGUgY2FjaGUuIElmIHRoZSBhdHRhY2hlZCBmaWxlIGlzIG9wZW4sCi0JdGhlbiBjbG9zZSBpdCB0b28uCi0KLVJFVFVSTlMKLQk8PGZhbHNlPj4gaXMgcmV0dXJuZWQgaWYgY2xvc2luZyB0aGUgZmlsZSBmYWlscywgPDx0cnVlPj4gaXMKLQlyZXR1cm5lZCBpZiBhbGwgaXMgd2VsbC4KLSovCi0KLWJvb2xlYW4KLWJmZF9jYWNoZV9jbG9zZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+aW9zdHJlYW0gPT0gTlVMTAotICAgICAgfHwgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSAoYWJmZCk7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9vcGVuX2ZpbGUKLQotU1lOT1BTSVMKLQlGSUxFKiBiZmRfb3Blbl9maWxlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbCB0aGUgT1MgdG8gb3BlbiBhIGZpbGUgZm9yIEB2YXJ7YWJmZH0uICBSZXR1cm4gdGhlIDw8RklMRSAqPj4KLQkocG9zc2libHkgPDxOVUxMPj4pIHRoYXQgcmVzdWx0cyBmcm9tIHRoaXMgb3BlcmF0aW9uLiAgU2V0IHVwIHRoZQotCUJGRCBzbyB0aGF0IGZ1dHVyZSBhY2Nlc3NlcyBrbm93IHRoZSBmaWxlIGlzIG9wZW4uIElmIHRoZSA8PEZJTEUgKj4+Ci0JcmV0dXJuZWQgaXMgPDxOVUxMPj4sIHRoZW4gaXQgd29uJ3QgaGF2ZSBiZWVuIHB1dCBpbiB0aGUKLQljYWNoZSwgc28gaXQgd29uJ3QgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gaXQuCi0qLwotCi1GSUxFICoKLWJmZF9vcGVuX2ZpbGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+Y2FjaGVhYmxlID0gdHJ1ZTsJLyogQWxsb3cgaXQgdG8gYmUgY2xvc2VkIGxhdGVyLiAqLwotCi0gIGlmIChvcGVuX2ZpbGVzID49IEJGRF9DQUNIRV9NQVhfT1BFTikKLSAgICB7Ci0gICAgICBpZiAoISBjbG9zZV9vbmUgKCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN3aXRjaCAoYWJmZC0+ZGlyZWN0aW9uKQotICAgIHsKLSAgICBjYXNlIHJlYWRfZGlyZWN0aW9uOgotICAgIGNhc2Ugbm9fZGlyZWN0aW9uOgotICAgICAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1JCKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYm90aF9kaXJlY3Rpb246Ci0gICAgY2FzZSB3cml0ZV9kaXJlY3Rpb246Ci0gICAgICBpZiAoYWJmZC0+b3BlbmVkX29uY2UgPT0gdHJ1ZSkKLQl7Ci0JICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fUlVCKTsKLQkgIGlmIChhYmZkLT5pb3N0cmVhbSA9PSBOVUxMKQotCSAgICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fV1VCKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ3JlYXRlIHRoZSBmaWxlLiAgVW5saW5rIGl0IGZpcnN0LCBmb3IgdGhlIGNvbnZlbmllbmNlIG9mCi0gICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbXMgd2hpY2ggd29ycnkgYWJvdXQgb3ZlcndyaXRpbmcgcnVubmluZwotICAgICAgICAgICAgIGJpbmFyaWVzLiAgKi8KLQkgIHVubGluayAoYWJmZC0+ZmlsZW5hbWUpOwotCSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1dCKTsKLQkgIGFiZmQtPm9wZW5lZF9vbmNlID0gdHJ1ZTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NhY2hlX2luaXQgKGFiZmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKEZJTEUgKikgYWJmZC0+aW9zdHJlYW07Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyCi0KLVNZTk9QU0lTCi0JRklMRSAqYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsZWQgd2hlbiB0aGUgbWFjcm8gPDxiZmRfY2FjaGVfbG9va3VwPj4gZmFpbHMgdG8gZmluZCBhCi0JcXVpY2sgYW5zd2VyLiAgRmluZCBhIGZpbGUgZGVzY3JpcHRvciBmb3IgQHZhcnthYmZkfS4gIElmCi0JbmVjZXNzYXJ5LCBpdCBvcGVuIGl0LiAgSWYgdGhlcmUgYXJlIGFscmVhZHkgbW9yZSB0aGFuCi0JPDxCRkRfQ0FDSEVfTUFYX09QRU4+PiBmaWxlcyBvcGVuLCBpdCB0cmllcyB0byBjbG9zZSBvbmUgZmlyc3QsIHRvCi0JYXZvaWQgcnVubmluZyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4gIAotKi8KLQotRklMRSAqCi1iZmRfY2FjaGVfbG9va3VwX3dvcmtlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkgCi0gICAgYWJmZCA9IGFiZmQtPm15X2FyY2hpdmU7Ci0KLSAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpCi0gICAgewotICAgICAgLyogTW92ZSB0aGUgZmlsZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNhY2hlLiAgKi8KLSAgICAgIGlmIChhYmZkICE9IGJmZF9sYXN0X2NhY2hlKQotCXsKLQkgIHNuaXAgKGFiZmQpOwotCSAgaW5zZXJ0IChhYmZkKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJmZF9vcGVuX2ZpbGUgKGFiZmQpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBpZiAoZnNlZWsgKChGSUxFICopIGFiZmQtPmlvc3RyZWFtLCBhYmZkLT53aGVyZSwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoRklMRSAqKSBhYmZkLT5pb3N0cmVhbTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jZi1pMzg2bHlueC5jIGIvYmZkL2NmLWkzODZseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTRiZGUuLjAwMDAwMDAKLS0tIGEvYmZkL2NmLWkzODZseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQlpMzg2bHlueF9jb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1pMzg2LWx5bngiCi0KLSNkZWZpbmUgTFlOWE9TCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvY2YtbTY4a2x5bnguYyBiL2JmZC9jZi1tNjhrbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc0ZjFiLi4wMDAwMDAwCi0tLSBhL2JmZC9jZi1tNjhrbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSBNNjhLIENPRkYgTHlueE9TIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQltNjhrbHlueF9jb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLWx5bngiCi0jZGVmaW5lIExZTlhPUwotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0jZGVmaW5lIFNUQVRJQ19SRUxPQ1MKLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jZi1zcGFyY2x5bnguYyBiL2JmZC9jZi1zcGFyY2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0YTA5OS4uMDAwMDAwMAotLS0gYS9iZmQvY2Ytc3BhcmNseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFNwYXJjIENPRkYgTHlueE9TIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQlzcGFyY2x5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtc3BhcmMtbHlueCIKLQotI2RlZmluZSBMWU5YT1MKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLSNpbmNsdWRlICJjb2ZmLXNwYXJjLmMiCmRpZmYgLS1naXQgYS9iZmQvY2lzY28tY29yZS5jIGIvYmZkL2Npc2NvLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjOWJiZC4uMDAwMDAwMAotLS0gYS9iZmQvY2lzY28tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQ0lTQ08gY3Jhc2ggZHVtcHMuCi0KLUNvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLS8qIGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCByZXR1cm5zIGEgaG9zdCBzaWduYWwgKHRoaXMgcHJvYmFibHkgc2hvdWxkCi0gICBiZSBmaXhlZCkuICAqLwotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBmb3IgTVNWQyBidWlsZHMgKi8KLSNpZm5kZWYgU0lHVFJBUAotIyBkZWZpbmUgU0lHVFJBUCA1Ci0jZW5kaWYKLSNpZm5kZWYgU0lHRU1UCi0jIGRlZmluZSBTSUdFTVQgNgotI2VuZGlmCi0jaWZuZGVmIFNJR0JVUwotIyBkZWZpbmUgU0lHQlVTIDEwCi0jZW5kaWYKLQwKLSNkZWZpbmUgQ1JBU0hfSU5GTyAoMHhmZmMpCi0jZGVmaW5lIENSQVNIX01BR0lDIDB4ZGVhZDEyMzQKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBDUkFTSF9SRUFTT05fTk9UQ1JBU0hFRCA9IDAsCi0gICAgQ1JBU0hfUkVBU09OX0VYQ0VQVElPTiA9IDEsCi0gICAgQ1JBU0hfUkVBU09OX0NPUlJVUFQgPSAyLAotICB9IGNyYXNocmVhc29uOwotCi1zdHJ1Y3QgY3Jhc2hpbmZvX2V4dGVybmFsCi17Ci0gIGNoYXIgbWFnaWNbNF07CQkJLyogTWFnaWMgbnVtYmVyICovCi0gIGNoYXIgdmVyc2lvbls0XTsJCS8qIFZlcnNpb24gbnVtYmVyICovCi0gIGNoYXIgcmVhc29uWzRdOwkJLyogQ3Jhc2ggcmVhc29uICovCi0gIGNoYXIgY3B1X3ZlY3Rvcls0XTsJCS8qIENQVSB2ZWN0b3IgZm9yIGV4Y2VwdGlvbnMgKi8KLSAgY2hhciByZWdpc3RlcnNbNF07CQkvKiBQb2ludGVyIHRvIHNhdmVkIHJlZ2lzdGVycyAqLwotICBjaGFyIHJhbWJhc2VbNF07CQkvKiBCYXNlIG9mIFJBTSAobm90IGluIFYxIGNyYXNoIGluZm8pICovCi19OwotDAotc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0Ci17Ci0gIGludCBzaWc7Ci19OwotDAotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY2lzY29fY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBidWZbNF07Ci0gIHVuc2lnbmVkIGludCBjcmFzaGluZm9fb2Zmc2V0OwotICBzdHJ1Y3QgY3Jhc2hpbmZvX2V4dGVybmFsIGNyYXNoaW5mbzsKLSAgaW50IG5yZWFkOwotICB1bnNpZ25lZCBpbnQgcmFtYmFzZTsKLSAgc2VjX3B0ciBhc2VjdDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIENSQVNIX0lORk8sIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5yZWFkID0gYmZkX3JlYWQgKGJ1ZiwgMSwgNCwgYWJmZCk7Ci0gIGlmIChucmVhZCAhPSA0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgY3Jhc2hpbmZvX29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIGJ1Zik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjcmFzaGluZm9fb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkICgmY3Jhc2hpbmZvLCAxLCBzaXplb2YgKGNyYXNoaW5mbyksIGFiZmQpOwotICBpZiAobnJlYWQgIT0gc2l6ZW9mIChjcmFzaGluZm8pKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLm1hZ2ljKSAhPSBDUkFTSF9NQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzd2l0Y2ggKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby52ZXJzaW9uKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIDE6Ci0gICAgICByYW1iYXNlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAyOgotICAgICAgcmFtYmFzZSA9IGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yYW1iYXNlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUuICAqLwotCi0gIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSA9Ci0gICAgKChzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QgKikKLSAgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0KSkpOwotICBpZiAoYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3dpdGNoICgoY3Jhc2hyZWFzb24pIGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yZWFzb24pKQotICAgIHsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9OT1RDUkFTSEVEOgotICAgICAgLyogQ3Jhc2ggZmlsZSBwcm9iYWJseSBjYW1lIGZyb20gd3JpdGUgY29yZS4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9DT1JSVVBUOgotICAgICAgLyogVGhlIGNyYXNoIGNvbnRleHQgYXJlYSB3YXMgY29ycnVwdCAtLSBwcm9jZWVkIHdpdGggY2F1dGlvbi4KLQkgV2UgaGF2ZSBubyB3YXkgb2YgcGFzc2luZyB0aGlzIGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlIGNhbGxlci4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9FWENFUFRJT046Ci0gICAgICAvKiBDcmFzaCBvY2N1cmVkIGR1ZSB0byBDUFUgZXhjZXB0aW9uLiAgKi8KLQotICAgICAgLyogVGhpcyBpcyA2OGstc3BlY2lmaWM7IGZvciBNSVBTIHdlJ2xsIG5lZWQgdG8gaW50ZXJwcmV0Ci0JIGNwdV92ZWN0b3IgZGlmZmVyZW50bHkgYmFzZWQgb24gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uCi0JIChzaW5jZSBDSVNDTyBjb3JlIGZpbGVzIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgcHJvY2Vzc29yCi0JIGVuY29kZWQgaW4gdGhlbSkuICAqLwotCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5jcHVfdmVjdG9yKSkKLQl7Ci0JICAgLyogYnVzIGVycm9yICAgICAgICAgICAqLwotCWNhc2UgMiA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyBicmVhazsKLQkgICAvKiBhZGRyZXNzIGVycm9yICAgICAgICovCi0JY2FzZSAzIDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7IGJyZWFrOwotCSAgIC8qIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KLQljYXNlIDQgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOwotCSAgIC8qIHplcm8gZGl2aWRlICAgICAgICAgKi8KLQljYXNlIDUgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgIC8qIGNoayBpbnN0cnVjdGlvbiAgICAgKi8KLQljYXNlIDYgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgYnJlYWs7Ci0JICAgLyogdHJhcHYgaW5zdHJ1Y3Rpb24gICAqLwotCWNhc2UgNyA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyBicmVhazsKLQkgICAvKiBwcml2aWxlZ2UgdmlvbGF0aW9uICovCi0JY2FzZSA4IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdTRUdWOyBicmVhazsKLQkgICAvKiB0cmFjZSB0cmFwICAgICAgICAgICovCi0JY2FzZSA5IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMDEwIGVtdWxhdG9yICAqLwotCWNhc2UgMTA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMTExIGVtdWxhdG9yICAqLwotCWNhc2UgMTE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0KLQkgIC8qIENvcHJvY2Vzc29yIHByb3RvY29sIHZpb2xhdGlvbi4gIFVzaW5nIGEgc3RhbmRhcmQgTU1VIG9yIEZQVQotCSAgICAgdGhpcyBjYW5ub3QgYmUgdHJpZ2dlcmVkIGJ5IHNvZnR3YXJlLiAgQ2FsbCBpdCBhIFNJR0JVUy4gICovCi0JY2FzZSAxMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7ICBicmVhazsKLQotCSAgLyogaW50ZXJydXB0ICAgICAgICAgICAqLwotCWNhc2UgMzE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSU5UOyAgYnJlYWs7Ci0JICAvKiBicmVha3BvaW50ICAgICAgICAgICovCi0JY2FzZSAzMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0KLQkgIC8qIGZsb2F0aW5nIHBvaW50IGVyciAgKi8KLQljYXNlIDQ4OiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogZmxvYXRpbmcgcG9pbnQgZXJyICAqLwotCWNhc2UgNDk6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiB6ZXJvIGRpdmlkZSAgICAgICAgICovCi0JY2FzZSA1MDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIHVuZGVyZmxvdyAgICAgICAgICAgKi8KLQljYXNlIDUxOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogb3BlcmFuZCBlcnJvciAgICAgICAqLwotCWNhc2UgNTI6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAgLyogb3ZlcmZsb3cgICAgICAgICAgICAqLwotCWNhc2UgNTM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiBOQU4gICAgICAgICAgICAgICAgICovCi0JY2FzZSA1NDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQlkZWZhdWx0OgotI2lmbmRlZiBTSUdFTVQKLSNkZWZpbmUgU0lHRU1UIFNJR1RSQVAKLSNlbmRpZgotCSAgLyogInNvZnR3YXJlIGdlbmVyYXRlZCIqLwotCSAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdFTVQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFVua25vd24gY3Jhc2ggcmVhc29uLiAgKi8KLSAgICAgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIucmVnIjsKLSAgYXNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgLyogVGhpcyBjYW4gYmUgYmlnZ2VyIHRoYW4gdGhlIHJlYWwgc2l6ZS4gIFNldCBpdCB0byB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUKLSAgICAgY29yZSBmaWxlLiAgKi8KLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IDA7Ci0gIGFzZWN0LT5maWxlcG9zID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJlZ2lzdGVycykgLSByYW1iYXNlOwotICBhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotICBhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotICArK2FiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLSAgLyogVGhlcmUgaXMgb25seSBvbmUgc2VjdGlvbiBjb250YWluaW5nIGRhdGEgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSdzIFJBTS4KLSAgICAgV2UgY2FsbCBpdCAuZGF0YS4gICovCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIuZGF0YSI7Ci0gIGFzZWN0LT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLSAgLyogVGhlIHNpemUgb2YgbWVtb3J5IGlzIHRoZSBzaXplIG9mIHRoZSBjb3JlIGZpbGUgaXRzZWxmLiAgKi8KLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHJhbWJhc2U7Ci0gIGFzZWN0LT5maWxlcG9zID0gMDsKLSAgYXNlY3QtPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKLSAgYWJmZC0+c2VjdGlvbnMgPSBhc2VjdDsKLSAgKythYmZkLT5zZWN0aW9uX2NvdW50OwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gZXJyb3JfcmV0dXJuOgotICB7Ci0gICAgc2VjX3B0ciBuZXh0c2VjdDsKLSAgICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0ICE9IE5VTEw7KQotICAgICAgewotCW5leHRzZWN0ID0gYXNlY3QtPm5leHQ7Ci0JZnJlZSAoYXNlY3QpOwotCWFzZWN0ID0gbmV4dHNlY3Q7Ci0gICAgICB9Ci0gICAgZnJlZSAoYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1jaGFyICoKLWNpc2NvX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludAotY2lzY29fY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZzsKLX0KLQotYm9vbGVhbgotY2lzY29fY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICAgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBjaXNjb19jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGNpc2NvKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hMjlrLmMgYi9iZmQvY29mZi1hMjlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjIzZWUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtYTI5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQU1EIDI5MDAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBhdCBOZXcgWW9yayBVbml2ZXJzaXR5IDcvOC85MS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEEyOUsgMQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9hMjlrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGxvbmcgZ2V0X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChhc3ltYm9sICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYTI5a19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hMjlrX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBib29sZWFuICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0KLSNkZWZpbmUgSU5TRVJUX0hXT1JEKFdPUkQsSFdPUkQpCVwKLSAgICAoKChXT1JEKSAmIDB4ZmYwMGZmMDApIHwgKCgoSFdPUkQpICYgMHhmZjAwKSA8PCA4KSB8ICgoSFdPUkQpJiAweGZmKSkKLSNkZWZpbmUgRVhUUkFDVF9IV09SRChXT1JEKSBcCi0gICAgKCgoKFdPUkQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKFdPUkQpJiAweGZmKSkKLSNkZWZpbmUgU0lHTl9FWFRFTkRfSFdPUkQoSFdPUkQpIFwKLSAgICAoKEhXT1JEKSAmIDB4ODAwMCA/IChIV09SRCl8KH4weGZmZmZMKSA6IChIV09SRCkpCi0KLS8qIFByb3ZpZGVkIHRoZSBzeW1ib2wsIHJldHVybnMgdGhlIHZhbHVlIHJlZmZlZCAqLwotc3RhdGljIGxvbmcKLWdldF9zeW1ib2xfdmFsdWUgKHN5bWJvbCkgICAgICAgCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICB7Ci0gICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLSAgZWxzZSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWUgKwotICAgICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotICAgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHJldHVybihyZWxvY2F0aW9uKTsKLX0KLQotLyogdGhpcyBmdW5jdGlvbiBpcyBpbiBjaGFyZ2Ugb2YgcGVyZm9ybWluZyBhbGwgdGhlIDI5ayByZWxvY2F0aW9ucyAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hMjlrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogdGhlIGNvbnN0aCByZWxvY2F0aW9uIGNvbWVzIGluIHR3byBwYXJ0cywgd2UgaGF2ZSB0byByZW1lbWJlcgotICAgICB0aGUgc3RhdGUgYmV0d2VlbiBjYWxscywgaW4gdGhlc2UgdmFyaWFibGVzICovCi0gIHN0YXRpYyBib29sZWFuIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydDFfY29uc3RoX3ZhbHVlOwotCi0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7Ci0gIHVuc2lnbmVkIGxvbmcgdW5zaWduZWRfdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKLSAgbG9uZyBzaWduZWRfdmFsdWU7Ci0KLSAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KLSAgYmZkX2J5dGUgICpoaXRfZGF0YSA9YWRkciArIChiZmRfYnl0ZSAqKShkYXRhKTsKLQkKLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkKSB7Ci0gICAgLyogUGFydGlhbCBsaW5raW5nIC0gZG8gbm90aGluZyAqLwotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICB9Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gIHsKLSAgICAvKiBLZWVwIHRoZSBzdGF0ZSBtYWNoaW5lIGhhcHB5IGluIGNhc2Ugd2UncmUgY2FsbGVkIGFnYWluICovCi0gICAgaWYgKHJfdHlwZSA9PSBSX0lISUhBTEYpIAotICAgIHsKLSAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOwotICAgICAgcGFydDFfY29uc3RoX3ZhbHVlICA9IDA7Ci0gICAgfQotICAgIHJldHVybihiZmRfcmVsb2NfdW5kZWZpbmVkKTsKLSAgfQotCi0gIGlmICgocGFydDFfY29uc3RoX2FjdGl2ZSkgJiYgKHJfdHlwZSAhPSBSX0lIQ09OU1QpKSAKLSAgewotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgSUhDT05TVCIpOwotICAgIHJldHVybihiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKLSAgfQotCi0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOwotCi0gIHN3aXRjaCAocl90eXBlKSAKLSAgewotICAgY2FzZSBSX0lSRUw6IAkKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIFRha2UgdGhlIHZhbHVlIGluIHRoZSBmaWVsZCBhbmQgc2lnbiBleHRlbmQgaXQgKi8KLSAgICBzaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEKGluc24pOwotICAgIHNpZ25lZF92YWx1ZSA9IFNJR05fRVhURU5EX0hXT1JEKHNpZ25lZF92YWx1ZSk7Ci0gICAgc2lnbmVkX3ZhbHVlIDw8PSAyOwotCi0gICAgLyogU2VlIHRoZSBub3RlIG9uIHRoZSBSX0lSRUwgcmVsb2MgaW4gY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotICAgIGlmIChzaWduZWRfdmFsdWUgPT0gLSAobG9uZykgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0gICAgICBzaWduZWRfdmFsdWUgPSAwOwotCi0gICAgc2lnbmVkX3ZhbHVlICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgaWYgKChzaWduZWRfdmFsdWUgJiB+MHgzZmZmZikgPT0gMCkKLSAgICB7CQkJCS8qIEFic29sdXRlIGptcC9jYWxsICovCi0gICAgICBpbnNuIHw9ICgxPDwyNCk7CQkvKiBNYWtlIGl0IGFic29sdXRlICovCi0gICAgICAvKiBGSVhNRTogU2hvdWxkIHdlIGNoYW5nZSByX3R5cGUgdG8gUl9JQUJTICovCi0gICAgfSAKLSAgICBlbHNlIAotICAgIHsKLSAgICAgIC8qIFJlbGF0aXZlIGptcC9jYWxsLCBzbyBzdWJ0cmFjdCBmcm9tIHRoZSB2YWx1ZSB0aGUKLQkgYWRkcmVzcyBvZiB0aGUgcGxhY2Ugd2UncmUgY29taW5nIGZyb20gKi8KLSAgICAgIHNpZ25lZF92YWx1ZSAtPSAocmVsb2NfZW50cnktPmFkZHJlc3MKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChzaWduZWRfdmFsdWU+MHgxZmZmZiB8fCBzaWduZWRfdmFsdWU8LTB4MjAwMDApIAotICAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIH0KLSAgICBzaWduZWRfdmFsdWUgPj49IDI7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCBzaWduZWRfdmFsdWUpOwotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiAsaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9JTE9IQUxGOiAKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIHVuc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRChpbnNuKTsKLSAgICB1bnNpZ25lZF92YWx1ZSArPSAgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICBpbnNuID0gSU5TRVJUX0hXT1JEKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUhJSEFMRjoKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIGNvbnN0aCwgcGFydCAxIAotICAgICAgIEp1c3QgZ2V0IHRoZSBzeW1ib2wgdmFsdWUgdGhhdCBpcyByZWZlcmVuY2VkICovCi0gICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7Ci0gICAgcGFydDFfY29uc3RoX3ZhbHVlID0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAvKiBEb24ndCBtb2RpZnkgaW5zbiB1bnRpbCBSX0lIQ09OU1QgKi8KLSAgICBicmVhazsKLSAgIGNhc2UgUl9JSENPTlNUOgkKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIGNvbnN0aCwgcGFydCAyIAotICAgICAgIE5vdyByZWxvY2F0ZSB0aGUgcmVmZXJlbmNlICovCi0gICAgaWYgKHBhcnQxX2NvbnN0aF9hY3RpdmUgPT0gZmFsc2UpIHsKLSAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBJSElIQUxGIik7Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gICAgfQotICAgIC8qIHN5bV9wdHJfcHRyID0gcl9zeW1uZHgsIGluIGNvZmZfc2x1cnBfcmVsb2NfdGFibGUoKSAqLwotICAgIHVuc2lnbmVkX3ZhbHVlID0gMDsJCS8qRVhUUkFDVF9IV09SRChpbnNuKSA8PCAxNjsqLwotICAgIHVuc2lnbmVkX3ZhbHVlICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7IC8qIHJfc3ltbmR4ICovCi0gICAgdW5zaWduZWRfdmFsdWUgKz0gcGFydDFfY29uc3RoX3ZhbHVlOwotICAgIHVuc2lnbmVkX3ZhbHVlID0gdW5zaWduZWRfdmFsdWUgPj4gMTY7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0gICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9CWVRFOgotICAgIGluc24gPSBiZmRfZ2V0XzgoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICB1bnNpZ25lZF92YWx1ZSA9IGluc24gKyBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwkKLSAgICBpZiAodW5zaWduZWRfdmFsdWUgJiAweGZmZmZmZjAwKQotICAgICAgcmV0dXJuKGJmZF9yZWxvY19vdmVyZmxvdyk7Ci0gICAgYmZkX3B1dF84KGFiZmQsIHVuc2lnbmVkX3ZhbHVlLCBoaXRfZGF0YSk7IAotICAgIGJyZWFrOwotICAgY2FzZSBSX0hXT1JEOgotICAgIGluc24gPSBiZmRfZ2V0XzE2KGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgdW5zaWduZWRfdmFsdWUgPSBpbnNuICsgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsJCi0gICAgaWYgKHVuc2lnbmVkX3ZhbHVlICYgMHhmZmZmMDAwMCkKLSAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIGJmZF9wdXRfMTYoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9XT1JEOgotICAgIGluc24gPSBiZmRfZ2V0XzMyKGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOyAgCi0gICAgYmZkX3B1dF8zMihhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICplcnJvcl9tZXNzYWdlID0gXygiVW5yZWNvZ25pemVkIHJlbG9jIik7Ci0gICAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKLSAgfQotCi0KLSAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQotfQotCi0vKiAgICAgIHR5cGUJICAgcmlnaHRzaGlmdAotCQkgICAgICAgc2l6ZQotCQkJICBiaXRzaXplCi0JCQkgICAgICAgcGMtcmVsYXRpdmUKLQkJCQkgICAgIGJpdHBvcwotCQkJCQkgYWJzb2x1dGUKLQkJCQkJICAgICBjb21wbGFpbl9vbl9vdmVyZmxvdwotCQkJCQkJICBzcGVjaWFsX2Z1bmN0aW9uCi0JCQkJCQkgICAgcmVsb2NhdGlvbiBuYW1lCi0JCQkJCQkJICAgICAgIHBhcnRpYWxfaW5wbGFjZSAKLQkJCQkJCQkJICAgICAgc3JjX21hc2sKLSovCi0KLS8qRklYTUU6IEknbSBub3QgcmVhbCBzdXJlIGFib3V0IHRoaXMgdGFibGUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAge1JfQUJTLCAgICAgMCwgMywgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxhMjlrX3JlbG9jLCJBQlMiLCAgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHsxfSwgIHsyfSwgIHszfSwgICB7NH0sICB7NX0sICB7Nn0sICB7N30sICB7OH0sICB7OX0sIHsxMH0sCi0gIHsxMX0sIHsxMn0sIHsxM30sIHsxNH0sIHsxNX0sIHsxNn0sIHsxN30sIHsxOH0sIHsxOX0sIHsyMH0sCi0gIHsyMX0sIHsyMn0sIHsyM30sCi0gIHtSX0lSRUwsICAgIDAsIDMsIDMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLGEyOWtfcmVsb2MsIklSRUwiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfSUFCUywgICAgMCwgMywgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiSUFCUyIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotICB7Ul9JTE9IQUxGLCAwLCAzLCAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgYTI5a19yZWxvYywiSUxPSEFMRiIsIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7Ul9JSElIQUxGLCAwLCAzLCAxNiwgdHJ1ZSwgIDE2LCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklISUhBTEYiLCB0cnVlLCAweGZmZmYwMDAwLDB4ZmZmZjAwMDAsIGZhbHNlfSwKLSAge1JfSUhDT05TVCwgMCwgMywgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklIQ09OU1QiLCB0cnVlLCAweGZmZmYwMDAwLDB4ZmZmZjAwMDAsIGZhbHNlfSwKLSAge1JfQllURSwgICAgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBhMjlrX3JlbG9jLCJCWVRFIiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZX0sCi0gIHtSX0hXT1JELCAgIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIkhXT1JEIiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge1JfV09SRCwgICAgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiV09SRCIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotfTsKLQotI2RlZmluZSBCQURNQUcoeCkgQTI5S0JBRE1BRyh4KQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCxyZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgICBzdGF0aWMgYmZkX3ZtYSBpaGloYWxmX3ZhZGRyID0gKGJmZF92bWEpIC0xOwotCi0gICAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7CQkKLSAgICByZWxlbnQtPmhvd3RvID0gaG93dG9fdGFibGUgKyByZWxvYy0+cl90eXBlOwotICAgIGlmIChyZWxvYy0+cl90eXBlID09IFJfSUhDT05TVCkgCi0gICAgewkJCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBSX0lIQ09OU1Qgc2hvdWxkIGFsd2F5cyBiZSB0aGUgYWRkcmVzcyBvZgotCSB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIFJfSUhJSEFMRi4gIHJlbG9jcyBnZW5lcmF0ZWQgYnkgZ2FzCi0JIGFyZSBjb3JyZWN0LCBidXQgcmVsb2NzIGdlbmVyYXRlZCBieSBIaWdoIEMgYXJlIGRpZmZlcmVudCAoSQotCSBjYW4ndCBmaWd1cmUgb3V0IHdoYXQgdGhlIGFkZHJlc3MgbWVhbnMgZm9yIEhpZ2ggQykuICBXZSBjYW4KLQkgaGFuZGxlIGJvdGggZ2FzIGFuZCBIaWdoIEMgYnkgaWdub3JpbmcgdGhlIGFkZHJlc3MgaGVyZSwgYW5kCi0JIHNpbXBseSByZXVzaW5nIHRoZSBhZGRyZXNzIHNhdmVkIGZvciBSX0lISUhBTEYuICAqLwotICAgICAgICBpZiAoaWhpaGFsZl92YWRkciA9PSAoYmZkX3ZtYSkgLTEpCi0JICBhYm9ydCAoKTsKLQlyZWxlbnQtPmFkZHJlc3MgPSBpaGloYWxmX3ZhZGRyOwotCWloaWhhbGZfdmFkZHIgPSAoYmZkX3ZtYSkgLTE7Ci0JcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9zeW1uZHg7CQkKLQlyZWxlbnQtPnN5bV9wdHJfcHRyPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwdHI7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0KGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0KLSAgICAgIHB0ciA9ICoocmVsZW50LT5zeW1fcHRyX3B0cik7Ci0KLSAgICAgIGlmIChwdHIgCi0JICAmJiBiZmRfYXN5bWJvbF9iZmQocHRyKSA9PSBhYmZkCQkKLQotCSAgJiYgKChwdHItPmZsYWdzICYgQlNGX09MRF9DT01NT04pPT0gMCkpCQotICAgICAgewkJCQkJCQotCSAgcmVsZW50LT5hZGRlbmQgPSAwOwotICAgICAgfQkJCQkJCQotICAgICAgZWxzZQotICAgICAgewkJCQkJCi0JICByZWxlbnQtPmFkZGVuZCA9IDA7CQkJCi0gICAgICB9CQkJCi0gICAgICByZWxlbnQtPmFkZHJlc3MtPSBzZWN0aW9uLT52bWE7Ci0gICAgICBpZiAocmVsb2MtPnJfdHlwZSA9PSBSX0lISUhBTEYpCi0JaWhpaGFsZl92YWRkciA9IHJlbGVudC0+YWRkcmVzczsKLSAgICAgIGVsc2UgaWYgKGloaWhhbGZfdmFkZHIgIT0gKGJmZF92bWEpIC0xKQotCWFib3J0ICgpOwotICB9Ci19Ci0KLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0gIGJvb2xlYW4gaGloYWxmOwotICBiZmRfdm1hIGhpaGFsZl92YWw7Ci0KLSAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhCi0gICAgIHRoaW5nLiAgVGhlIGNhbGxlciB3aWxsIHRha2UgY2FyZSBvZiBhZGp1c3RpbmcgdGhlIHJlbG9jCi0gICAgIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIGJmZF9ieXRlICpsb2M7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgbG9uZyBzaWduZWRfdmFsdWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEgfHwgcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0KLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogQW4gUl9JSENPTlNUIHJlbG9jIGRvZXMgbm90IGhhdmUgYSBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKLSAgICAgICAgIHN5bWJvbCBpbmRleCBpcyBhbiBhZGRlbmQuICBSX0lIQ09OU1QgaXMgYWx3YXlzIHVzZWQgaW4KLSAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggUl9JSEhBTEYuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfSUhDT05TVCkKLQl7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkJc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCQkgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JCSAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBzeW0tPm5fdmFsdWUKLQkJCSAtIHNlYy0+dm1hKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSENPTlNUIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGYgPSBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JY2FzZSBSX0lSRUw6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCi0JICAvKiBFeHRyYWN0IHRoZSBhZGRlbmQuICAqLwotCSAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRCAoaW5zbik7Ci0JICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRCAoc2lnbmVkX3ZhbHVlKTsKLQkgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotCSAgLyogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQ09GRgotCSAgICAgYTI5ay4gIEluIHRoZSBvcmlnaW5hbCBBTUQgdmVyc2lvbiwgdGhlIHZhbHVlIHN0b3JlZCBpbgotCSAgICAgdGhlIGZpZWxkIGZvciB0aGUgUl9JUkVMIHJlbG9jIGlzIGEgc2ltcGxlIGFkZGVuZC4gIEluCi0JICAgICB0aGUgR05VIHZlcnNpb24sIHRoZSB2YWx1ZSBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3MKLQkgICAgIG9mIHRoZSByZWxvYyB3aXRoaW4gc2VjdGlvbi4gIFdlIHRyeSB0byBjb3BlIGhlcmUgYnkKLQkgICAgIGFzc3VtaW5nIHRoZSBBTUQgdmVyc2lvbiwgdW5sZXNzIHRoZSBhZGRlbmQgaXMgZXhhY3RseQotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzOyBpbiB0aGUgbGF0dGVyIGNhc2Ugd2UgYXNzdW1lCi0JICAgICB0aGUgR05VIHZlcnNpb24uICBUaGlzIG1lYW5zIHRoYXQgc29tZXRoaW5nIGxpa2UKLQkgICAgICAgICAudGV4dAotCQkgbm9wCi0JCSBqbXAgaS00Ci0JICAgICB3aWxsIGZhaWwsIGJlY2F1c2UgdGhlIGFkZGVuZCBvZiAtNCB3aWxsIGhhcHBlbiB0byBlcXVhbAotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFRoZQotCSAgICAgY29tcGlsZXIgd2lsbCBuZXZlciBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpcy4KLQotCSAgICAgQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIHdlIG1heSB3YW50IHRvIHRha2Ugb3V0IHRoaXMKLQkgICAgIGNoZWNrLiAgKi8KLQotCSAgaWYgKHNpZ25lZF92YWx1ZSA9PSAtIChsb25nKSAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkKLQkgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotCSAgLyogRGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUganVtcC4gICovCi0JICBzaWduZWRfdmFsdWUgKz0gdmFsOwotCi0JICBpZiAoKHNpZ25lZF92YWx1ZSAmIH4weDNmZmZmKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHVzZSBhbiBhYnNvbHV0ZSBqdW1wLiAgKi8KLQkgICAgICBpbnNuIHw9ICgxIDw8IDI0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTWFrZSB0aGUgZGVzdGluYXRpb24gUEMgcmVsYXRpdmUuICAqLwotCSAgICAgIHNpZ25lZF92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIGlmIChzaWduZWRfdmFsdWUgPiAweDFmZmZmIHx8IHNpZ25lZF92YWx1ZSA8IC0gMHgyMDAwMCkKLQkJewotCQkgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBzaWduZWRfdmFsdWUgPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUHV0IHRoZSBhZGp1c3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIHNpZ25lZF92YWx1ZSA+Pj0gMjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHNpZ25lZF92YWx1ZSk7Ci0KLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lMT0hBTEY6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEIChpbnNuKTsKLQkgIHVuc2lnbmVkX3ZhbHVlICs9IHZhbDsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgbG9jKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lISUhBTEY6Ci0JICAvKiBTYXZlIHRoZSB2YWx1ZSBmb3IgdGhlIFJfSUhDT05TVCByZWxvYy4gICovCi0JICBoaWhhbGYgPSB0cnVlOwotCSAgaGloYWxmX3ZhbCA9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lIQ09OU1Q6Ci0JICBpZiAoISBoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSElIQUxGIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGZfdmFsID0gMDsKLQkgICAgfQotCi0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSByZWwtPnJfc3ltbmR4ICsgaGloYWxmX3ZhbDsKLQkgIHVuc2lnbmVkX3ZhbHVlID4+PSAxNjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGhpaGFsZiA9IGZhbHNlOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9CWVRFOgotCWNhc2UgUl9IV09SRDoKLQljYXNlIFJfV09SRDoKLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZSwKLQkJCQkJICBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGlmIChyc3RhdCA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIGVsc2UgaWYgKHJzdGF0ICE9IGJmZF9yZWxvY19vaykKLQkgICAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChvdmVyZmxvdykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICAgICAgbmFtZSA9IGJ1ZjsKLQkgICAgfQotCi0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sIG5hbWUsIGhvd3RvX3RhYmxlW3JlbC0+cl90eXBlXS5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzeW1uZHggb2YgYSBSX0lIQ09OU1QgcmVsb2MsIHNpbmNlIGl0Ci0gICBpcyBhY3R1YWxseSBhbiBhZGRlbmQsIG5vdCBhIHN5bWJvbCBpbmRleCBhdCBhbGwuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCi0gICAgIGJmZCAqb2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICBib29sZWFuICphZGp1c3RlZHA7Ci17Ci0gIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQotICAgICphZGp1c3RlZHAgPSB0cnVlOwotICBlbHNlCi0gICAgKmFkanVzdGVkcCA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggY29mZl9hMjlrX2FkanVzdF9zeW1uZHgKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgYTI5a2NvZmZfYmlnX3ZlYyA9Ci17Ci0gICJjb2ZmLWEyOWstYmlnIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgIAotICAgfCBTRUNfUkVBRE9OTFkgKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgICBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0gIC8qIGhkcnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsICAgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gewotCSAgICAKLSAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgY29mZl9vYmplY3RfcCwKLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwKLSAgIF9iZmRfZHVtbXlfdGFyZ2V0Ci0gIH0sCi0gewotICAgYmZkX2ZhbHNlLAotICAgY29mZl9ta29iamVjdCwKLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICBiZmRfZmFsc2UKLSAgfSwKLSB7Ci0gICBiZmRfZmFsc2UsCi0gICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgIGJmZF9mYWxzZQotICB9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFCi0gfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWFscGhhLmMgYi9iZmQvY29mZi1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQxNjYzLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQUxQSEEgRXh0ZW5kZWQtQ29mZiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgTW9kaWZpZWQgZnJvbSBjb2ZmLW1pcHMuYyBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+IGFuZAotICAgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL2FscGhhLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICphbHBoYV9lY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGVoZHIpKTsKLXN0YXRpYyBQVFIgYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICAgICAgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9hZGp1c3RfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICBhcmVsZW50ICopKTsKLXN0YXRpYyB2b2lkIGFscGhhX2FkanVzdF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJmZF9ieXRlICphbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYmZkX3ZtYSBhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgc3RydWN0IGV4dGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBiZmRfYnl0ZSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFscGhhX2FkanVzdF9oZWFkZXJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLCBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSk7Ci1zdGF0aWMgUFRSIGFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotDAotLyogRUNPRkYgaGFzIENPRkYgc2VjdGlvbnMsIGJ1dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbgotICAgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmb3JtYXQuICBFQ09GRiB0YXJnZXRzIHVzZSBzb21lIG9mIHRoZQotICAgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBjb2Zmc3dhcC5oLCBhbmQgc29tZSBvZiB0aGUgZ2VuZXJpYyBDT0ZGCi0gICByb3V0aW5lcyBpbiBjb2ZmZ2VuLmMsIGJ1dCwgdW5saWtlIHRoZSByZWFsIENPRkYgdGFyZ2V0cywgZG8gbm90Ci0gICB1c2UgY29mZmNvZGUuaCBpdHNlbGYuCi0KLSAgIEdldCB0aGUgZ2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBleGNlcHQgZm9yIHRoZSByZWxvYywKLSAgIHN5bWJvbCwgYW5kIGxpbmVubyBvbmVzLiAgR2l2ZSB0aGVtIGVjb2ZmIG5hbWVzLiAgRGVmaW5lIHNvbWUKLSAgIGFjY2Vzc29yIG1hY3JvcyBmb3IgdGhlIGxhcmdlIHNpemVzIHVzZWQgZm9yIEFscGhhIEVDT0ZGLiAgKi8KLQotI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVFNJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRFNJWkUgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRU5UUlkgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1BBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1ZBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1JFTFBUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF82NAotCi0jZGVmaW5lIEFMUEhBRUNPRkYKLQotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX2luIGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfb3V0IGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQKLSNpbmNsdWRlICJjb2Zmc3dhcC5oIgotCi0vKiBHZXQgdGhlIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmVsb2NfbmlsIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkgICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFscGhhX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBSZWxvYyB0eXBlIDAgaXMgaWdub3JlZCBieSBpdHNlbGYuICBIb3dldmVyLCBpdCBhcHBlYXJzIGFmdGVyIGEKLSAgICAgR1BESVNQIHJlbG9jIHRvIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbG93IG9yZGVyIDE2IGJpdHMKLSAgICAgb2YgdGhlIGdwIHJlZ2lzdGVyIGFyZSBsb2FkZWQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQCi0gICAgIHJlZ2lzdGVyLiAgVGhlIG9mZnNldCBpcyAxNiBiaXRzIG9mIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICBUaGlzCi0gICAgIHJlbG9jIGFsd2F5cyBzZWVtcyB0byBiZSBhZ2FpbnN0IHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElURVJBTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIExJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBJdCBzZWVtcyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0gICAgIHVzZSB0aGlzIHRvIGVsaW1pbmF0ZSBhIHBvcnRpb24gb2YgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc3ltYm9sCi0gICAgIGluZGV4IGlzIHNwZWNpYWw6IDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZQotICAgICByZWdpc3RlciBvZiBhIG1lbW9yeSBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwKLSAgICAgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZSBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbgotICAgICBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQKLSAgICAgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueQotICAgICByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElUVVNFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIG5leHQgcmVsb2MKLSAgICAgd2lsbCBiZSBhbiBJR05PUkUgcmVsb2Mgd2hpY2ggaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSBzeW1ib2wgaW5kZXggb2YKLSAgICAgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBhcHBlYXJzIHRvIGFjdHVhbGx5IGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgYmV0d2VlbiB0aGUgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucy4gIFRoaXMgZ2l2ZXMgdHdvIGRpZmZlcmVudAotICAgICB3YXlzIHRvIGRldGVybWluZSB3aGVyZSB0aGUgbGRhIGluc3RydWN0aW9uIGlzOyBJIGRvbid0IGtub3cgd2h5Ci0gICAgIGJvdGggYXJlIHVzZWQuICBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbiBpcyB0aGUKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlIGN1cnJlbnQgbG9jYXRpb247IHRoZQotICAgICBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGN1cnJlbnQKLSAgICAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUERJU1AiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChBTFBIQV9SX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QU1VCLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKLSAgICAgZ2l2ZW4gdmFsdWUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBZGp1c3QgdGhlIEdQIHZhbHVlIGZvciBhIG5ldyByYW5nZSBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFZBTFVFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0MCi0vKiBSZWNvZ25pemUgYW4gQWxwaGEgRUNPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWFscGhhX2Vjb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpyZXQ7Ci0KLSAgcmV0ID0gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci0KLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIC8qIEFscGhhIEVDT0ZGIGhhcyBhIC5wZGF0YSBzZWN0aW9uLiAgVGhlIGxubm9wdHIgZmllbGQgb2YgdGhlCi0JIC5wZGF0YSBzZWN0aW9uIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpdCBjb250YWlucy4gIEVhY2gKLQkgZW50cnkgdGFrZXMgdXAgOCBieXRlcy4gIFRoZSBudW1iZXIgb2YgZW50cmllcyBpcyByZXF1aXJlZAotCSBzaW5jZSB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkIHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4gIFdoZW4gd2UKLQkgbGluayAucGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhlCi0JIGFsaWdubWVudCBieXRlcy4gIFdlIGhhbmRsZSB0aGlzIG9uIGlucHV0IGJ5IGZha2luZyB0aGUgc2l6ZQotCSBvZiB0aGUgLnBkYXRhIHNlY3Rpb24gdG8gcmVtb3ZlIHRoZSB1bndhbnRlZCBhbGlnbm1lbnQgYnl0ZXMuCi0JIE9uIG91dHB1dCB3ZSB3aWxsIHNldCB0aGUgbG5ub3B0ciBmaWVsZCBhbmQgZm9yY2UgdGhlCi0JIGFsaWdubWVudC4gICovCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgX1BEQVRBKTsKLSAgICAgIGlmIChzZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0JICBzaXplID0gc2VjLT5saW5lX2ZpbGVwb3MgKiA4OwotCSAgQkZEX0FTU0VSVCAoc2l6ZSA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgICAgIHx8IHNpemUgKyA4ID09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYywgc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFscGhhX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBpZiAoQUxQSEFfRUNPRkZfQkFETUFHICgqaW50ZXJuYWxfZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgUFRSCi1hbHBoYV9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkcjsKLXsKLSAgUFRSIGVjb2ZmOwotCi0gIGVjb2ZmID0gX2JmZF9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKTsKLQotICBpZiAoZWNvZmYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gICAgICAvKiBTZXQgYWRkaXRpb25hbCBCRkQgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZSBvYmplY3QgdHlwZSBmcm9tIHRoZQotCSBtYWNoaW5lIHNwZWNpZmljIGZpbGUgaGVhZGVyIGZsYWdzLiAgKi8KLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfQUxQSEFfT0JKRUNUX1RZUEVfTUFTSykKLQl7Ci0JY2FzZSBGX0FMUEhBX1NIQVJBQkxFOgotCSAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQkgIGJyZWFrOwotCWNhc2UgRl9BTFBIQV9DQUxMX1NIQVJFRDoKLQkgIC8qIEFsd2F5cyBleGVjdXRhYmxlIGlmIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMgYXMgdGhlIHJ1biB0aW1lCi0JICAgICBsb2FkZXIgbWlnaHQgcmVzb2x2ZSB1bmRlZmluZWQgcmVmZXJlbmNlcy4gICovCi0JICBhYmZkLT5mbGFncyB8PSAoRFlOQU1JQyB8IEVYRUNfUCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gZWNvZmY7Ci19Ci0MCi0vKiBSZWxvYyBoYW5kbGluZy4gICovCi0KLS8qIFN3YXAgYSByZWxvYyBpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBleHRfcHRyLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBjb25zdCBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGV4dF9wdHI7Ci0KLSAgaW50ZXJuLT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgaW50ZXJuLT5yX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOwotCi0gIGludGVybi0+cl90eXBlID0gKChleHQtPnJfYml0c1swXSAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgaW50ZXJuLT5yX29mZnNldCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKTsKLSAgLyogSWdub3JlZCB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gIGludGVybi0+cl9zaXplID0gKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpOwotCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0xJVFVTRQotICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9HUERJU1ApCi0gICAgewotICAgICAgLyogSGFuZGxlIHRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3Mgc3BlY2lhbGx5LiAgSXRzIHN5bW5keAotCSB2YWx1ZSBpcyBub3QgYWN0dWFsbHkgYSBzeW1ib2wgaW5kZXgsIGJ1dCBpcyBpbnN0ZWFkIGEKLQkgc3BlY2lhbCBjb2RlLiAgV2UgcHV0IHRoZSBjb2RlIGluIHRoZSByX3NpemUgZmllbGQsIGFuZAotCSBjbG9iYmVyIHRoZSBzeW1uZHguICAqLwotICAgICAgaWYgKGludGVybi0+cl9zaXplICE9IDApCi0JYWJvcnQgKCk7Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IGludGVybi0+cl9zeW1uZHg7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9OT05FOwotICAgIH0KLSAgZWxzZSBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUpCi0gICAgewotICAgICAgLyogVGhlIElHTk9SRSByZWxvYyBnZW5lcmFsbHkgZm9sbG93cyBhIEdQRElTUCByZWxvYywgYW5kIGlzCi0JIGFnYWluc3QgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc2VjdGlvbiBpcyBpcnJlbGV2YW50LiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4gJiYKLQkgIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JYWJvcnQgKCk7Ci0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuICYmIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9MSVRBKQotCWludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLSAgICB9Ci19Ci0KLS8qIFN3YXAgYSByZWxvYyBvdXQuICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIGludGVybiwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGRzdDsKLSAgbG9uZyBzeW1uZHg7Ci0gIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLQotICAvKiBVbmRvIHRoZSBoYWNrZXJ5IGRvbmUgaW4gc3dhcF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0xJVFVTRQotICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9HUERJU1ApCi0gICAgewotICAgICAgc3ltbmR4ID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfSUdOT1JFCi0JICAgJiYgISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAgJiYgaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0FCUykKLSAgICB7Ci0gICAgICBzeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0gICAgICBzaXplID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltbmR4ID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgICAgIHNpemUgPSBpbnRlcm4tPnJfc2l6ZTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaW50ZXJuLT5yX2V4dGVybgotCSAgICAgIHx8IChpbnRlcm4tPnJfc3ltbmR4ID49IDAgJiYgaW50ZXJuLT5yX3N5bW5keCA8PSAxNCkpOwotCi0gIGJmZF9oX3B1dF82NCAoYWJmZCwgaW50ZXJuLT5yX3ZhZGRyLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzeW1uZHgsIChiZmRfYnl0ZSAqKSBleHQtPnJfc3ltbmR4KTsKLQotICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKLQotICBleHQtPnJfYml0c1swXSA9ICgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpCi0JCSAgICAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKTsKLSAgZXh0LT5yX2JpdHNbMV0gPSAoKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFIDogMCkKLQkJICAgIHwgKChpbnRlcm4tPnJfb2Zmc2V0IDw8IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpKTsKLSAgZXh0LT5yX2JpdHNbMl0gPSAwOwotICBleHQtPnJfYml0c1szXSA9ICgoc2l6ZSA8PCBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSkKLQkJICAgICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpOwotfQotCi0vKiBGaW5pc2ggY2Fub25pY2FsaXppbmcgYSByZWxvYy4gIFBhcnQgb2YgdGhpcyBpcyBnZW5lcmljIHRvIGFsbAotICAgRUNPRkYgdGFyZ2V0cywgYW5kIHRoYXQgcGFydCBpcyBpbiBlY29mZi5jLiAgVGhlIHJlc3QgaXMgZG9uZSBpbgotICAgdGhpcyBiYWNrZW5kIHJvdXRpbmUuICBJdCBtdXN0IGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX2FkanVzdF9yZWxvY19pbiAoYWJmZCwgaW50ZXJuLCBycHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBhcmVsZW50ICpycHRyOwotewotICBpZiAoaW50ZXJuLT5yX3R5cGUgPiBBTFBIQV9SX0dQVkFMVUUpCi0gICAgYWJvcnQgKCk7Ci0KLSAgc3dpdGNoIChpbnRlcm4tPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBBTFBIQV9SX0JSQUREUjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDE2OgotICAgIGNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUw2NDoKLSAgICAgIC8qIFRoaXMgcmVsb2NzIGFwcGVhciB0byBiZSBmdWxseSByZXNvbHZlZCB3aGVuIHRoZXkgYXJlIGFnYWluc3QKLSAgICAgICAgIGludGVybmFsIHN5bWJvbHMuICBBZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMsIEJSQUREUiBhdCBsZWFzdAotICAgICAgICAgYXBwZWFycyB0byBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4pCi0JcnB0ci0+YWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQlycHRyLT5hZGRlbmQgPSAtIChpbnRlcm4tPnJfdmFkZHIgKyA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX0xJVEVSQUw6Ci0gICAgICAvKiBDb3B5IHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBhZGRlbmQsIHRvCi0JIGVuc3VyZSB0aGF0IHdlIGFyZSBub3QgY29uZnVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuKQotCXJwdHItPmFkZGVuZCArPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0gICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKLSAgICAgIC8qIFRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3MgZG8gbm90IHVzZSBhIHN5bWJvbCwgb3IgYW4KLQkgYWRkZW5kLCBidXQgdGhleSBkbyB1c2UgYSBzcGVjaWFsIGNvZGUuICBQdXQgdGhpcyBjb2RlIGluIHRoZQotCSBhZGRlbmQgZmllbGQuICAqLwotICAgICAgcnB0ci0+YWRkZW5kID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLSAgICAgIC8qIFRoZSBTVE9SRSByZWxvYyBuZWVkcyB0aGUgc2l6ZSBhbmQgb2Zmc2V0IGZpZWxkcy4gIFdlIHN0b3JlCi0JIHRoZW0gaW4gdGhlIGFkZGVuZC4gICovCi0gICAgICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfb2Zmc2V0IDw9IDI1NiAmJiBpbnRlcm4tPnJfc2l6ZSA8PSAyNTYpOwotICAgICAgcnB0ci0+YWRkZW5kID0gKGludGVybi0+cl9vZmZzZXQgPDwgOCkgKyBpbnRlcm4tPnJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0gICAgICAvKiBUaGUgUFVTSCwgUFNVQiBhbmQgUFJTSElGVCByZWxvY3MgZG8gbm90IGFjdHVhbGx5IHVzZSBhbgotCSBhZGRyZXNzLiAgSSBiZWxpZXZlIHRoYXQgdGhlIGFkZHJlc3Mgc3VwcGxpZWQgaXMgcmVhbGx5IGFuCi0JIGFkZGVuZC4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfdmFkZHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFZBTFVFOgotICAgICAgLyogU2V0IHRoZSBhZGRlbmQgZmllbGQgdG8gdGhlIG5ldyBHUCB2YWx1ZS4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfc3ltbmR4ICsgZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgLyogSWYgdGhlIHR5cGUgaXMgQUxQSEFfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlCi0JIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICBGb3IKLQkgc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYyB0eXBlIGlzIG5vdCBhZGp1c3RlZCBieQotCSB0aGUgc2VjdGlvbiB2bWEuICBXZSByZWNvcmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlCi0JIGhlcmUsIGZvciBjb252ZW5pZW5jZSB3aGVuIGRvaW5nIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCi0gICAgICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgcnB0ci0+YWRkcmVzcyA9IGludGVybi0+cl92YWRkcjsKLSAgICAgIHJwdHItPmFkZGVuZCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBycHRyLT5ob3d0byA9ICZhbHBoYV9ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIFdoZW4gd3JpdGluZyBvdXQgYSByZWxvYyB3ZSBuZWVkIHRvIHB1bGwgc29tZSB2YWx1ZXMgYmFjayBvdXQgb2YKLSAgIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgcmVsb2MuICBUaGlzIGlzIHJvdWdobHkgdGhlIHJldmVyc2Ugb2YKLSAgIGFscGhhX2FkanVzdF9yZWxvY19pbiwgZXhjZXB0IHRoYXQgdGhlcmUgYXJlIHNldmVyYWwgY2hhbmdlcyB3ZSBkbwotICAgbm90IG5lZWQgdG8gdW5kby4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBhcmVsZW50ICpyZWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBzd2l0Y2ggKGludGVybi0+cl90eXBlKQotICAgIHsKLSAgICBjYXNlIEFMUEhBX1JfTElUVVNFOgotICAgIGNhc2UgQUxQSEFfUl9HUERJU1A6Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IHJlbC0+YWRkZW5kOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IHJlbC0+YWRkZW5kICYgMHhmZjsKLSAgICAgIGludGVybi0+cl9vZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfUFVTSDoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFNVQjoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLSAgICAgIGludGVybi0+cl92YWRkciA9IHJlbC0+YWRkZW5kOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgaW50ZXJuLT5yX3ZhZGRyID0gcmVsLT5hZGRyZXNzOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc3RhY2sgZm9yIHRoZSByZWxvY2F0aW9uIGV2YWx1YXRvci4gICovCi0jZGVmaW5lIFJFTE9DX1NUQUNLU0laRSAoMTApCi0KLS8qIEFscGhhIEVDT0ZGIHJlbG9jcyBoYXZlIGEgYnVpbHQgaW4gZXhwcmVzc2lvbiBldmFsdWF0b3IgYXMgd2VsbCBhcwotICAgb3RoZXIgaW50ZXJkZXBlbmRlbmNpZXMuICBSYXRoZXIgdGhhbiB1c2UgYSBidW5jaCBvZiBzcGVjaWFsCi0gICBmdW5jdGlvbnMgYW5kIGdsb2JhbCB2YXJpYWJsZXMsIHdlIHVzZSBhIHNpbmdsZSByb3V0aW5lIHRvIGRvIGFsbAotICAgdGhlIHJlbG9jYXRpb24gZm9yIGEgc2VjdGlvbi4gIEkgaGF2ZW4ndCB5ZXQgd29ya2VkIG91dCBob3cgdGhlCi0gICBhc3NlbWJsZXIgaXMgZ29pbmcgdG8gaGFuZGxlIHRoaXMuICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLSAgYmZkICpvdXRwdXRfYmZkID0gcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTDsKLSAgYmZkX3ZtYSBncDsKLSAgYm9vbGVhbiBncF91bmRlZmluZWQ7Ci0gIGJmZF92bWEgc3RhY2tbUkVMT0NfU1RBQ0tTSVpFXTsKLSAgaW50IHRvcyA9IDA7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGRhdGEsCi0JCQkJICAoZmlsZV9wdHIpIDAsIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIHNlY3Rpb24gc2l6ZSBpcyBub3QgZ29pbmcgdG8gY2hhbmdlLiAgKi8KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplOwotICBpbnB1dF9zZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLCBzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKHJlbG9jX2NvdW50ID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICAvKiBHZXQgdGhlIEdQIHZhbHVlIGZvciB0aGUgb3V0cHV0IEJGRC4gICovCi0gIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLSAgaWYgKGdwID09IDApCi0gICAgewotICAgICAgaWYgKHJlbG9jYXRlYWJsZSAhPSBmYWxzZSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgYmZkX3ZtYSBsbzsKLQotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGxvID0gKGJmZF92bWEpIC0xOwotCSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzZWMtPnZtYSA8IGxvCi0JCSAgJiYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLnNic3MiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXQ0IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXQ4IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXRhIikgPT0gMCkpCi0JCWxvID0gc2VjLT52bWE7Ci0JICAgIH0KLQkgIGdwID0gbG8gKyAweDgwMDA7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3ApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIHRydWUpOwotCSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgICAgZ3BfdW5kZWZpbmVkID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGdwID0gKGgtPnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yICg7ICpyZWxvY192ZWN0b3IgIT0gKGFyZWxlbnQgKikgTlVMTDsgcmVsb2NfdmVjdG9yKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjaGFyICplcnI7Ci0KLSAgICAgIHJlbCA9ICpyZWxvY192ZWN0b3I7Ci0gICAgICByID0gYmZkX3JlbG9jX29rOwotICAgICAgc3dpdGNoIChyZWwtPmhvd3RvLT50eXBlKQotCXsKLQljYXNlIEFMUEhBX1JfSUdOT1JFOgotCSAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9SRUZMT05HOgotCWNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCWNhc2UgQUxQSEFfUl9CUkFERFI6Ci0JY2FzZSBBTFBIQV9SX0hJTlQ6Ci0JY2FzZSBBTFBIQV9SX1NSRUwxNjoKLQljYXNlIEFMUEhBX1JfU1JFTDMyOgotCWNhc2UgQUxQSEFfUl9TUkVMNjQ6Ci0JICBpZiAocmVsb2NhdGVhYmxlCi0JICAgICAgJiYgKCgqcmVsLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICB7Ci0JICAgICAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBvdXRwdXRfYmZkLCAmZXJyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0JICAvKiBUaGlzIHJlbG9jYXRpb24gaXMgdXNlZCBpbiBhIHN3aXRjaCB0YWJsZS4gIEl0IGlzIGEgMzIKLQkgICAgIGJpdCBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBHUCB2YWx1ZS4gIFdlIG11c3QgYWRqdXN0IGl0Ci0JICAgICBieSB0aGUgZGlmZmVyZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIEdQIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgR1AgdmFsdWUuICBUaGUgb3JpZ2luYWwgR1AgdmFsdWUgaXMgc3RvcmVkIGluIHRoZQotCSAgICAgYWRkZW5kLiAgV2UgYWRqdXN0IHRoZSBhZGRlbmQgYW5kIGxldAotCSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggdGhlIGpvYi4gICovCi0JICByZWwtPmFkZGVuZCAtPSBncDsKLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBvdXRwdXRfYmZkLCAmZXJyKTsKLQkgIGlmIChyID09IGJmZF9yZWxvY19vayAmJiBncF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICByID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkgICAgICBlcnIgPSAoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHVzZWQgd2hlbiBHUCBub3QgZGVmaW5lZCIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9MSVRFUkFMOgotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdmFsdWUsIGdlbmVyYWxseQotCSAgICAgKGFsd2F5cz8pIGluIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCBHUAotCSAgICAgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFNvbWV0aW1lcyB0aGUgc3Vic2VxdWVudCByZWxvYyBpcyBhCi0JICAgICBMSVRVU0UgcmVsb2MsIHdoaWNoIGluZGljYXRlcyBob3cgdGhpcyByZWxvYyBpcyB1c2VkLgotCSAgICAgVGhpcyBzb21ldGltZXMgcGVybWl0cyByZXdyaXRpbmcgdGhlIHR3byBpbnN0cnVjdGlvbnMKLQkgICAgIHJlZmVycmVkIHRvIGJ5IHRoZSBMSVRFUkFMIGFuZCB0aGUgTElUVVNFIGludG8gZGlmZmVyZW50Ci0JICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90IHJlZmVyIHRvIC5saXRhLiAgVGhpcyBjYW4gc2F2ZQotCSAgICAgYSBtZW1vcnkgcmVmZXJlbmNlLCBhbmQgcGVybWl0cyByZW1vdmluZyBhIHZhbHVlIGZyb20KLQkgICAgIC5saXRhIHRodXMgc2F2aW5nIEdQIHJlbGF0aXZlIHNwYWNlLgotCi0JICAgICBXZSBkbyBub3QgdGhlc2Ugb3B0aW1pemF0aW9ucy4gIFRvIGRvIHRoZW0gd2Ugd291bGQgbmVlZAotCSAgICAgdG8gYXJyYW5nZSB0byBsaW5rIHRoZSAubGl0YSBzZWN0aW9uIGZpcnN0LCBzbyB0aGF0IGJ5Ci0JICAgICB0aGUgdGltZSB3ZSBnb3QgaGVyZSB3ZSB3b3VsZCBrbm93IHRoZSBmaW5hbCB2YWx1ZXMgdG8KLQkgICAgIHVzZS4gIFRoaXMgd291bGQgbm90IGJlIHBhcnRpY3VsYXJseSBkaWZmaWN1bHQsIGJ1dCBpdCBpcwotCSAgICAgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCi0KLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0JICAgIC8qIEkgYmVsaWV2ZSB0aGF0IHRoZSBMSVRFUkFMIHJlbG9jIHdpbGwgb25seSBhcHBseSB0byBhCi0JICAgICAgIGxkcSBvciBsZGwgaW5zdHJ1Y3Rpb24sIHNvIGNoZWNrIG15IGFzc3VtcHRpb24uICAqLwotCSAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjkKLQkJCXx8ICgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI4KTsKLQotCSAgICByZWwtPmFkZGVuZCAtPSBncDsKLQkgICAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcmVsLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJCQlvdXRwdXRfYmZkLCAmZXJyKTsKLQkgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rICYmIGdwX3VuZGVmaW5lZCkKLQkgICAgICB7Ci0JCXIgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCQllcnIgPQotCQkgIChjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIik7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCSAgLyogU2VlIEFMUEhBX1JfTElURVJBTCBhYm92ZSBmb3IgdGhlIHVzZXMgb2YgdGhpcyByZWxvYy4gIEl0Ci0JICAgICBkb2VzIG5vdCBjYXVzZSBhbnl0aGluZyB0byBoYXBwZW4sIGl0c2VsZi4gICovCi0JICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIGJyZWFrOwotCSAgICAKLQljYXNlIEFMUEhBX1JfR1BESVNQOgotCSAgLyogVGhpcyBtYXJrcyB0aGUgbGRhaCBvZiBhbiBsZGFoL2xkYSBwYWlyIHdoaWNoIGxvYWRzIHRoZQotCSAgICAgZ3AgcmVnaXN0ZXIgd2l0aCB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgZ3AgdmFsdWUgYW5kIHRoZQotCSAgICAgY3VycmVudCBsb2NhdGlvbi4gIFRoZSBzZWNvbmQgb2YgdGhlIHBhaXIgaXMgcl9zaXplIGJ5dGVzCi0JICAgICBhaGVhZDsgaXQgdXNlZCB0byBiZSBtYXJrZWQgd2l0aCBhbiBBTFBIQV9SX0lHTk9SRSByZWxvYywKLQkgICAgIGJ1dCB0aGF0IG5vIGxvbmdlciBoYXBwZW5zIGluIE9TRi8xIDMuMi4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotCSAgICBiZmRfdm1hIGFkZGVuZDsKLQotCSAgICAvKiBHZXQgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBpbnNuMSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIGluc24yID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzICsgcmVsLT5hZGRlbmQpOwotCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjEgPj4gMjYpICYgMHgzZikgPT0gMHgwOSk7IC8qIGxkYWggKi8KLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuMiA+PiAyNikgJiAweDNmKSA9PSAweDA4KTsgLyogbGRhICovCi0KLQkgICAgLyogR2V0IHRoZSBleGlzdGluZyBhZGRlbmQuICBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiBkb25lIGJ5IGxkYSBhbmQgbGRhaC4gICovCi0JICAgIGFkZGVuZCA9ICgoaW5zbjEgJiAweGZmZmYpIDw8IDE2KSArIChpbnNuMiAmIDB4ZmZmZik7Ci0JICAgIGlmIChpbnNuMSAmIDB4ODAwMCkKLQkgICAgICB7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCQlhZGRlbmQgLT0gMHg4MDAwMDAwMDsKLQkgICAgICB9Ci0JICAgIGlmIChpbnNuMiAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgLT0gMHgxMDAwMDsKLQotCSAgICAvKiBUaGUgZXhpc3RpbmcgYWRkZW5kIGluY2x1ZGVzIHRoZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUKLQkgICAgICAgZ3Agb2YgdGhlIGlucHV0IEJGRCBhbmQgdGhlIGFkZHJlc3MgaW4gdGhlIGlucHV0IEJGRC4KLQkgICAgICAgU3VidHJhY3QgdGhpcyBvdXQuICAqLwotCSAgICBhZGRlbmQgLT0gKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwCi0JCSAgICAgICAtIChpbnB1dF9zZWN0aW9uLT52bWEgKyByZWwtPmFkZHJlc3MpKTsKLQotCSAgICAvKiBOb3cgYWRkIGluIHRoZSBmaW5hbCBncCB2YWx1ZSwgYW5kIHN1YnRyYWN0IG91dCB0aGUKLQkgICAgICAgZmluYWwgYWRkcmVzcy4gICovCi0JICAgIGFkZGVuZCArPSAoZ3AKLQkJICAgICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgcmVsLT5hZGRyZXNzKSk7Ci0KLQkgICAgLyogQ2hhbmdlIHRoZSBpbnN0cnVjdGlvbnMsIGFjY291bnRpbmcgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiwgYW5kIHdyaXRlIHRoZW0gb3V0LiAgKi8KLQkgICAgaWYgKGFkZGVuZCAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQkgICAgaW5zbjEgPSAoaW5zbjEgJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZik7Ci0JICAgIGluc24yID0gKGluc24yICYgMHhmZmZmMDAwMCkgfCAoYWRkZW5kICYgMHhmZmZmKTsKLQotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuMSwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24yLAotCQkJZGF0YSArIHJlbC0+YWRkcmVzcyArIHJlbC0+YWRkZW5kKTsKLQotCSAgICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0JICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotCSAgewotCSAgICBhc3ltYm9sICpzeW1ib2w7Ci0JICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotCSAgICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICAgIHsKLQkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBGaWd1cmUgb3V0IHRoZSByZWxvY2F0aW9uIG9mIHRoaXMgc3ltYm9sLiAgKi8KLQkgICAgc3ltYm9sID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICBlbHNlCi0JICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPmFkZGVuZDsKLQotCSAgICBpZiAodG9zID49IFJFTE9DX1NUQUNLU0laRSkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdGFja1t0b3MrK10gPSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0JICAvKiBTdG9yZSBhIHZhbHVlIGZyb20gdGhlIHJlbG9jIHN0YWNrIGludG8gYSBiaXRmaWVsZC4gICovCi0JICB7Ci0JICAgIGJmZF92bWEgdmFsOwotCSAgICBpbnQgb2Zmc2V0LCBzaXplOwotCi0JICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgICAgewotCQlyZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmICh0b3MgPT0gMCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICAvKiBUaGUgb2Zmc2V0IGFuZCBzaXplIGZvciB0aGlzIHJlbG9jIGFyZSBlbmNvZGVkIGludG8gdGhlCi0JICAgICAgIGFkZGVuZCBmaWVsZCBieSBhbHBoYV9hZGp1c3RfcmVsb2NfaW4uICAqLwotCSAgICBvZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotCSAgICBzaXplID0gcmVsLT5hZGRlbmQgJiAweGZmOwotCi0JICAgIHZhbCA9IGJmZF9nZXRfNjQgKGFiZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MpOwotCSAgICB2YWwgJj1+ICgoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQpOwotCSAgICB2YWwgfD0gKHN0YWNrWy0tdG9zXSAmICgoMSA8PCBzaXplKSAtIDEpKSA8PCBvZmZzZXQ7Ci0JICAgIGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCSAgLyogU3VidHJhY3QgYSB2YWx1ZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcyAtIDFdIC09IHJlbG9jYXRpb247Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotCSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcyAtIDFdID4+PSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0JICAgIAotCWNhc2UgQUxQSEFfUl9HUFZBTFVFOgotCSAgLyogSSByZWFsbHkgZG9uJ3Qga25vdyBpZiB0aGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgIGdwID0gcmVsLT5hZGRlbmQ7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQl7Ci0JICBhc2VjdGlvbiAqb3MgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcy4gICovCi0JICBvcy0+b3JlbG9jYXRpb25bb3MtPnJlbG9jX2NvdW50XSA9IHJlbDsKLQkgIG9zLT5yZWxvY19jb3VudCsrOwotCX0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKSAKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWwtPnN5bV9wdHJfcHRyKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPmFkZHJlc3MpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czogCi0JICAgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAobGlua19pbmZvLCBlcnIsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5hZGRyZXNzKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbC0+c3ltX3B0cl9wdHIpLAotCQkgICAgICByZWwtPmhvd3RvLT5uYW1lLCByZWwtPmFkZGVuZCwgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPmFkZHJlc3MpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICh0b3MgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpbnQgYWxwaGFfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGTE9ORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQUkVMMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0xJVFVTRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfR1BESVNQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9JR05PUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0JSQUREUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9ISU5UOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDY0OwotICAgICAgYnJlYWs7Ci0jaWYgMAotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfUFVTSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfU1RPUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BTVUI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BSU0hJRlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQVkFMVUU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXTsKLX0KLQwKLS8qIEEgaGVscGVyIHJvdXRpbmUgZm9yIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24gd2hpY2ggY29udmVydHMgYW4KLSAgIGV4dGVybmFsIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgUmV0dXJucyB0aGUKLSAgIHJlbG9jYXRpb24gYW1vdW50LiAgKi8KLQotc3RhdGljIGJmZF92bWEKLWFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MgKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgZXh0X3JlbCwgaCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIEJGRF9BU1NFUlQgKGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBvdXRwdXQuICBDb252ZXJ0IHRoZSByZWxvYyBmcm9tCi0JIGJlaW5nIGFnYWluc3QgdGhlIHN5bWJvbCB0byBiZWluZyBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotICAgICAgLyogQ2xlYXIgdGhlIHJfZXh0ZXJuIGJpdC4gICovCi0gICAgICBleHRfcmVsLT5yX2JpdHNbMV0gJj1+IFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEU7Ci0KLSAgICAgIC8qIENvbXB1dGUgYSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgaHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCi0gICAgICByX3N5bW5keCA9IC0xOwotICAgICAgc3dpdGNoIChuYW1lWzFdKQotCXsKLQljYXNlICdBJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5wZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9QREFUQTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkNPTlNUOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0JTUzsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIueGRhdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fWERBVEE7Ci0JICBicmVhazsKLQl9Ci0JCSAgICAgIAotICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBBZGQgdGhlIHNlY3Rpb24gVk1BIGFuZCB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoYW5nZSB0aGUgc3ltbmR4IHZhbHVlIHRvIHRoZSByaWdodCBvbmUgZm9yCi0JIHRoZSBvdXRwdXQgQkZELiAgKi8KLSAgICAgIHJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGlmIChyX3N5bW5keCA9PSAtMSkKLQl7Ci0JICAvKiBDYWxsZXIgbXVzdCBnaXZlIGFuIGVycm9yLiAgKi8KLQkgIHJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICByZWxvY2F0aW9uID0gMDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotICBiZmRfaF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIHJfc3ltbmR4LAotCQkoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl9zeW1uZHgpOwotCi0gIHJldHVybiByZWxvY2F0aW9uOwotfQotCi0vKiBSZWxvY2F0ZSBhIHNlY3Rpb24gd2hpbGUgbGlua2luZyBhbiBBbHBoYSBFQ09GRiBmaWxlLiAgVGhpcyBpcwotICAgcXVpdGUgc2ltaWxhciB0byBnZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBQZXJoYXBzIHRoZXkKLSAgIGNvdWxkIGJlIGNvbWJpbmVkIHNvbWVob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb24sICpsaXRhX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgZ3A7Ci0gIGJvb2xlYW4gZ3BfdW5kZWZpbmVkOwotICBiZmRfdm1hIHN0YWNrW1JFTE9DX1NUQUNLU0laRV07Ci0gIGludCB0b3MgPSAwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWw7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbF9lbmQ7Ci0KLSAgLyogV2Uga2VlcCBhIHRhYmxlIG1hcHBpbmcgdGhlIHN5bW5keCBmb3VuZCBpbiBhbiBpbnRlcm5hbCByZWxvYyB0bwotICAgICB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbG9va2luZyB1cCB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lIGVhY2ggdGltZS4gICovCi0gIHN5bW5keF90b19zZWN0aW9uID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb247Ci0gIGlmIChzeW1uZHhfdG9fc2VjdGlvbiA9PSAoYXNlY3Rpb24gKiopIE5VTEwpCi0gICAgewotICAgICAgc3ltbmR4X3RvX3NlY3Rpb24gPSAoKGFzZWN0aW9uICoqKQotCQkJICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKE5VTV9SRUxPQ19TRUNUSU9OUwotCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gICAgICBpZiAoIXN5bW5keF90b19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9OT05FXSA9IE5VTEw7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1RFWFRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnRleHQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkRBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnJkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1NCU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQlNTXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5ic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fSU5JVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuaW5pdCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVQ4XSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXQ4Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fWERBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnhkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1BEQVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5wZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1JDT05TVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmNvbnN0Iik7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIC8qIE9uIHRoZSBBbHBoYSwgdGhlIC5saXRhIHNlY3Rpb24gbXVzdCBiZSBhZGRyZXNzYWJsZSBieSB0aGUgZ2xvYmFsCi0gICAgIHBvaW50ZXIuICBUbyBzdXBwb3J0IGxhcmdlIHByb2dyYW1zLCB3ZSBuZWVkIHRvIGFsbG93IG11bHRpcGxlCi0gICAgIGdsb2JhbCBwb2ludGVycy4gIFRoaXMgd29ya3MgYXMgbG9uZyBhcyBlYWNoIGlucHV0IC5saXRhIHNlY3Rpb24KLSAgICAgaXMgPDY0S0IgYmlnLiAgVGhpcyBpbXBsaWVzIHRoYXQgd2hlbiBwcm9kdWNpbmcgcmVsb2NhdGFibGUKLSAgICAgb3V0cHV0LCB0aGUgLmxpdGEgc2VjdGlvbiBpcyBsaW1pdGVkIHRvIDY0S0IuIC4gKi8KLQotICBsaXRhX3NlYyA9IHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUQV07Ci0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUgJiYgbGl0YV9zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqbGl0YV9zZWNfZGF0YTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzZWN0aW9uIGRhdGEgc3RydWN0dXJlIHRvIHdoaWNoIHdlIGNhbgotCSBoYW5nIG9uIHRvIHRoZSBncCB2YWx1ZSB3ZSBwaWNrIGZvciB0aGUgc2VjdGlvbi4gICovCi0gICAgICBsaXRhX3NlY19kYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGxpdGFfc2VjKTsKLSAgICAgIGlmIChsaXRhX3NlY19kYXRhID09IE5VTEwpCi0JewotCSAgbGl0YV9zZWNfZGF0YSA9ICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikKLQkJCSAgIGJmZF96YWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBsaXRhX3NlYykgPSBsaXRhX3NlY19kYXRhOwotCX0KLQotICAgICAgaWYgKGxpdGFfc2VjX2RhdGEtPmdwICE9IDApCi0JewotCSAgLyogSWYgd2UgYWxyZWFkeSBhc3NpZ25lZCBhIGdwIHRvIHRoaXMgc2VjdGlvbiwgd2UgYmV0dGVyCi0JICAgICBzdGljayB3aXRoIHRoYXQgdmFsdWUuICAqLwotCSAgZ3AgPSBsaXRhX3NlY19kYXRhLT5ncDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBsaXRhX3ZtYTsKLQkgIGJmZF9zaXplX3R5cGUgbGl0YV9zaXplOwotCi0JICBsaXRhX3ZtYSA9IGxpdGFfc2VjLT5vdXRwdXRfb2Zmc2V0ICsgbGl0YV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBsaXRhX3NpemUgPSBsaXRhX3NlYy0+X2Nvb2tlZF9zaXplOwotCSAgaWYgKGxpdGFfc2l6ZSA9PSAwKQotCSAgICBsaXRhX3NpemUgPSBsaXRhX3NlYy0+X3Jhd19zaXplOwotCi0JICBpZiAoZ3AgPT0gMAotCSAgICAgIHx8IGxpdGFfdm1hIDwgIGdwIC0gMHg4MDAwCi0JICAgICAgfHwgbGl0YV92bWEgKyBsaXRhX3NpemUgPj0gZ3AgKyAweDgwMDApCi0JICAgIHsKLQkgICAgICAvKiBFaXRoZXIgZ3AgaGFzbid0IGJlZW4gc2V0IGF0IGFsbCBvciB0aGUgY3VycmVudCBncAotCQkgY2Fubm90IGFkZHJlc3MgdGhpcyAubGl0YSBzZWN0aW9uLiAgSW4gYm90aCBjYXNlcyB3ZQotCQkgcmVzZXQgdGhlIGdwIHRvIHBvaW50IGludG8gdGhlICJtaWRkbGUiIG9mIHRoZQotCQkgY3VycmVudCBpbnB1dCAubGl0YSBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZ3AgJiYgIWVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5pc3N1ZWRfbXVsdGlwbGVfZ3Bfd2FybmluZykKLQkJewotCQkgICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywKLQkJCQkJICAgICAgIF8oInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIpLAotCQkJCQkgICAgICAgKGNoYXIgKikgTlVMTCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCk7Ci0JCSAgZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nID0gdHJ1ZTsKLQkJfQotCSAgICAgIGlmIChsaXRhX3ZtYSA8IGdwIC0gMHg4MDAwKQotCQlncCA9IGxpdGFfdm1hICsgbGl0YV9zaXplIC0gMHg4MDAwOwotCSAgICAgIGVsc2UKLQkJZ3AgPSBsaXRhX3ZtYSArIDB4ODAwMDsKLQotCSAgICB9Ci0KLQkgIGxpdGFfc2VjX2RhdGEtPmdwID0gZ3A7Ci0JfQotCi0gICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotICAgIH0KLQotICBncF91bmRlZmluZWQgPSAoZ3AgPT0gMCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChvdXRwdXRfYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSk7Ci0KLSAgZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgZXh0ZXJuYWxfcmVsb2NzOwotICBleHRfcmVsX2VuZCA9IGV4dF9yZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl92YWRkcjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgaW50IHJfZXh0ZXJuOwotICAgICAgaW50IHJfb2Zmc2V0OwotICAgICAgaW50IHJfc2l6ZTsKLSAgICAgIGJvb2xlYW4gcmVsb2NhdGVwOwotICAgICAgYm9vbGVhbiBhZGp1c3RfYWRkcnA7Ci0gICAgICBib29sZWFuIGdwX3VzZWRwOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJfdmFkZHIgPSBiZmRfaF9nZXRfNjQgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotICAgICAgcl9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfc3ltbmR4KTsKLQotICAgICAgcl90eXBlID0gKChleHRfcmVsLT5yX2JpdHNbMF0gJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSkKLQkJPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICAgICAgcl9leHRlcm4gPSAoZXh0X3JlbC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgICAgIHJfb2Zmc2V0ID0gKChleHRfcmVsLT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCQkgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOwotICAgICAgLyogSWdub3JlZCB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gICAgICByX3NpemUgPSAoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCQk+PiBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSk7Ci0KLSAgICAgIHJlbG9jYXRlcCA9IGZhbHNlOwotICAgICAgYWRqdXN0X2FkZHJwID0gdHJ1ZTsKLSAgICAgIGdwX3VzZWRwID0gZmFsc2U7Ci0gICAgICBhZGRlbmQgPSAwOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBBTFBIQV9SX0lHTk9SRToKLQkgIC8qIFRoaXMgcmVsb2MgYXBwZWFycyBhZnRlciBhIEdQRElTUCByZWxvYy4gIE9uIGVhcmxpZXIKLQkgICAgIHZlcnNpb25zIG9mIE9TRi8xLCBJdCBtYXJrZWQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQKLQkgICAgIGluc3RydWN0aW9uIHRvIGJlIGFsdGVyZWQgYnkgdGhlIEdQRElTUCByZWxvYywgYnV0IGl0IGlzCi0JICAgICBub3Qgb3RoZXJ3aXNlIHVzZWQgZm9yIGFueXRoaW5nLiAgRm9yIHNvbWUgcmVhc29uLCB0aGUKLQkgICAgIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gZG9lcyBub3QgYXBwZWFyIHRvIGluY2x1ZGUgdGhlCi0JICAgICBzZWN0aW9uIFZNQSwgdW5saWtlIHRoZSBvdGhlciByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIGJmZF9oX3B1dF82NCAoaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgcl92YWRkciwKLQkJCSAgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotCSAgYWRqdXN0X2FkZHJwID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9SRUZMT05HOgotCWNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCWNhc2UgQUxQSEFfUl9ISU5UOgotCSAgcmVsb2NhdGVwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0JSQUREUjoKLQljYXNlIEFMUEhBX1JfU1JFTDE2OgotCWNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0JY2FzZSBBTFBIQV9SX1NSRUw2NDoKLQkgIGlmIChyX2V4dGVybikKLQkgICAgYWRkZW5kICs9IC0gKHJfdmFkZHIgKyA0KTsKLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9HUFJFTDMyOgotCSAgLyogVGhpcyByZWxvY2F0aW9uIGlzIHVzZWQgaW4gYSBzd2l0Y2ggdGFibGUuICBJdCBpcyBhIDMyCi0JICAgICBiaXQgb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgR1AgdmFsdWUuICBXZSBtdXN0IGFkanVzdCBpdAotCSAgICAgYnkgdGhlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBHUCB2YWx1ZSBhbmQgdGhlCi0JICAgICBjdXJyZW50IEdQIHZhbHVlLiAgKi8KLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBhZGRlbmQgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCAtIGdwOwotCSAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElURVJBTDoKLQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBsaXRlcmFsIHZhbHVlLCBnZW5lcmFsbHkKLQkgICAgIChhbHdheXM/KSBpbiB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgR1AKLQkgICAgIHJlbGF0aXZlIHJlbG9jYXRpb24uICBTb21ldGltZXMgdGhlIHN1YnNlcXVlbnQgcmVsb2MgaXMgYQotCSAgICAgTElUVVNFIHJlbG9jLCB3aGljaCBpbmRpY2F0ZXMgaG93IHRoaXMgcmVsb2MgaXMgdXNlZC4KLQkgICAgIFRoaXMgc29tZXRpbWVzIHBlcm1pdHMgcmV3cml0aW5nIHRoZSB0d28gaW5zdHJ1Y3Rpb25zCi0JICAgICByZWZlcnJlZCB0byBieSB0aGUgTElURVJBTCBhbmQgdGhlIExJVFVTRSBpbnRvIGRpZmZlcmVudAotCSAgICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdCByZWZlciB0byAubGl0YS4gIFRoaXMgY2FuIHNhdmUKLQkgICAgIGEgbWVtb3J5IHJlZmVyZW5jZSwgYW5kIHBlcm1pdHMgcmVtb3ZpbmcgYSB2YWx1ZSBmcm9tCi0JICAgICAubGl0YSB0aHVzIHNhdmluZyBHUCByZWxhdGl2ZSBzcGFjZS4KLQotCSAgICAgV2UgZG8gbm90IHRoZXNlIG9wdGltaXphdGlvbnMuICBUbyBkbyB0aGVtIHdlIHdvdWxkIG5lZWQKLQkgICAgIHRvIGFycmFuZ2UgdG8gbGluayB0aGUgLmxpdGEgc2VjdGlvbiBmaXJzdCwgc28gdGhhdCBieQotCSAgICAgdGhlIHRpbWUgd2UgZ290IGhlcmUgd2Ugd291bGQga25vdyB0aGUgZmluYWwgdmFsdWVzIHRvCi0JICAgICB1c2UuICBUaGlzIHdvdWxkIG5vdCBiZSBwYXJ0aWN1bGFybHkgZGlmZmljdWx0LCBidXQgaXQgaXMKLQkgICAgIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuICAqLwotCi0JICAvKiBJIGJlbGlldmUgdGhhdCB0aGUgTElURVJBTCByZWxvYyB3aWxsIG9ubHkgYXBwbHkgdG8gYSBsZHEKLQkgICAgIG9yIGxkbCBpbnN0cnVjdGlvbiwgc28gY2hlY2sgbXkgYXNzdW1wdGlvbi4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotCSAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgICAgIGNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI5Ci0JCQl8fCAoKGluc24gPj4gMjYpICYgMHgzZikgPT0gMHgyOCk7Ci0JICB9Ci0KLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBhZGRlbmQgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCAtIGdwOwotCSAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCSAgLyogU2VlIEFMUEhBX1JfTElURVJBTCBhYm92ZSBmb3IgdGhlIHVzZXMgb2YgdGhpcyByZWxvYy4gIEl0Ci0JICAgICBkb2VzIG5vdCBjYXVzZSBhbnl0aGluZyB0byBoYXBwZW4sIGl0c2VsZi4gICovCi0JICBicmVhazsKLQkgICAgCi0JY2FzZSBBTFBIQV9SX0dQRElTUDoKLQkgIC8qIFRoaXMgbWFya3MgdGhlIGxkYWggb2YgYW4gbGRhaC9sZGEgcGFpciB3aGljaCBsb2FkcyB0aGUKLQkgICAgIGdwIHJlZ2lzdGVyIHdpdGggdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIGdwIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICBUaGUgc2Vjb25kIG9mIHRoZSBwYWlyIGlzIHJfc3ltbmR4Ci0JICAgICBieXRlcyBhaGVhZC4gIEl0IHVzZWQgdG8gYmUgbWFya2VkIHdpdGggYW4gQUxQSEFfUl9JR05PUkUKLQkgICAgIHJlbG9jLCBidXQgT1NGLzEgMy4yIG5vIGxvbmdlciBkb2VzIHRoYXQuICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLQotCSAgICAvKiBHZXQgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBpbnNuMSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICBpbnNuMiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkoY29udGVudHMKLQkJCQkgKyByX3ZhZGRyCi0JCQkJIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJICsgcl9zeW1uZHgpKTsKLQotCSAgICBCRkRfQVNTRVJUICgoKGluc24xID4+IDI2KSAmIDB4M2YpID09IDB4MDkpOyAvKiBsZGFoICovCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjIgPj4gMjYpICYgMHgzZikgPT0gMHgwOCk7IC8qIGxkYSAqLwotCi0JICAgIC8qIEdldCB0aGUgZXhpc3RpbmcgYWRkZW5kLiAgV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgc2lnbgotCSAgICAgICBleHRlbnNpb24gZG9uZSBieSBsZGEgYW5kIGxkYWguICAqLwotCSAgICBhZGRlbmQgPSAoKGluc24xICYgMHhmZmZmKSA8PCAxNikgKyAoaW5zbjIgJiAweGZmZmYpOwotCSAgICBpZiAoaW5zbjEgJiAweDgwMDApCi0JICAgICAgewotCQkvKiBUaGlzIGlzIGFkZGVuZCAtPSAweDEwMDAwMDAwMCB3aXRob3V0IGNhdXNpbmcgYW4KLQkJICAgaW50ZWdlciBvdmVyZmxvdyBvbiBhIDMyIGJpdCBob3N0LiAgKi8KLQkJYWRkZW5kIC09IDB4ODAwMDAwMDA7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCSAgICAgIH0KLQkgICAgaWYgKGluc24yICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCAtPSAweDEwMDAwOwotCi0JICAgIC8qIFRoZSBleGlzdGluZyBhZGRlbmQgaW5jbHVkZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkgICAgICAgZ3Agb2YgdGhlIGlucHV0IEJGRCBhbmQgdGhlIGFkZHJlc3MgaW4gdGhlIGlucHV0IEJGRC4KLQkgICAgICAgV2Ugd2FudCB0byBjaGFuZ2UgdGhpcyB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQotCSAgICAgICBmaW5hbCBHUCBhbmQgdGhlIGZpbmFsIGFkZHJlc3MuICAqLwotCSAgICBhZGRlbmQgKz0gKGdwCi0JCSAgICAgICAtIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpKTsKLQotCSAgICAvKiBDaGFuZ2UgdGhlIGluc3RydWN0aW9ucywgYWNjb3VudGluZyBmb3IgdGhlIHNpZ24KLQkgICAgICAgZXh0ZW5zaW9uLCBhbmQgd3JpdGUgdGhlbSBvdXQuICAqLwotCSAgICBpZiAoYWRkZW5kICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCArPSAweDEwMDAwOwotCSAgICBpbnNuMSA9IChpbnNuMSAmIDB4ZmZmZjAwMDApIHwgKChhZGRlbmQgPj4gMTYpICYgMHhmZmZmKTsKLQkgICAgaW5zbjIgPSAoaW5zbjIgJiAweGZmZmYwMDAwKSB8IChhZGRlbmQgJiAweGZmZmYpOwotCi0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24xLAotCQkJY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjIsCi0JCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyByX3N5bW5keCk7Ci0KLQkgICAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEFMUEhBX1JfT1BfUFVTSDoKLQljYXNlIEFMUEhBX1JfT1BfUFNVQjoKLQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkgIC8qIE1hbmlwdWxhdGUgdmFsdWVzIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgVGhlCi0JICAgICByX3ZhZGRyIGZpZWxkIGlzIG5vdCBhbiBhZGRyZXNzIGluIGlucHV0X3NlY3Rpb24sIGl0IGlzCi0JICAgICB0aGUgY3VycmVudCB2YWx1ZSAoaW5jbHVkaW5nIGFueSBhZGRlbmQpIG9mIHRoZSBvYmplY3QKLQkgICAgIGJlaW5nIHVzZWQuICAqLwotCSAgaWYgKCEgcl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF07Ci0JICAgICAgaWYgKHMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICAgIGFkZGVuZCA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0IC0gcy0+dm1hOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdOwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWFib3J0ICgpOwotCi0JICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgIGFkZGVuZCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogTm90ZSB0aGF0IHdlIHBhc3MgdGhlIGFkZHJlc3MgYXMgMCwgc2luY2Ugd2UKLQkJCSBkbyBub3QgaGF2ZSBhIG1lYW5pbmdmdWwgbnVtYmVyIGZvciB0aGUKLQkJCSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24gdGhhdCBpcyBiZWluZwotCQkJIHJlbG9jYXRlZC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIChiZmRfdm1hKSAwKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGFkZGVuZCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgICAgICYmIGgtPmluZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gIFBhc3MKLQkJCSB0aGUgYWRkcmVzcyBhcyAwLCBhcyB3aXRoIHVuZGVmaW5lZF9zeW1ib2wsCi0JCQkgYWJvdmUuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCAoYmZkX3ZtYSkgMCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgYWRkZW5kID0gYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJCQkgaW5wdXRfYmZkLAotCQkJCQkJCSBleHRfcmVsLCBoKTsKLQkJfQotCSAgICB9Ci0KLQkgIGFkZGVuZCArPSByX3ZhZGRyOwotCi0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgLyogQWRqdXN0IHJfdmFkZHIgYnkgdGhlIGFkZGVuZC4gICovCi0JICAgICAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsIGFkZGVuZCwKLQkJCSAgICAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgotCQkgIGlmICh0b3MgPj0gUkVMT0NfU1RBQ0tTSVpFKQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgc3RhY2tbdG9zKytdID0gYWRkZW5kOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCQkgIGlmICh0b3MgPT0gMCkKLQkJICAgIGFib3J0ICgpOwotCQkgIHN0YWNrW3RvcyAtIDFdIC09IGFkZGVuZDsKLQkJICBicmVhazsKLQotCQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkJICBpZiAodG9zID09IDApCi0JCSAgICBhYm9ydCAoKTsKLQkJICBzdGFja1t0b3MgLSAxXSA+Pj0gYWRkZW5kOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgYWRqdXN0X2FkZHJwID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLQkgIC8qIFN0b3JlIGEgdmFsdWUgZnJvbSB0aGUgcmVsb2Mgc3RhY2sgaW50byBhIGJpdGZpZWxkLiAgSWYKLQkgICAgIHdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFsbCB3ZSBkbyBpcwotCSAgICAgYWRqdXN0IHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvYy4gICovCi0JICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG1hc2s7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAodG9zID09IDApCi0JCWFib3J0ICgpOwotCi0JICAgICAgLyogR2V0IHRoZSByZWxvY2F0aW9uIG1hc2suICBUaGUgc2VwYXJhdGUgc3RlcHMgYW5kIHRoZQotCQkgY2FzdHMgdG8gYmZkX3ZtYSBhcmUgYXR0ZW1wdHMgdG8gYXZvaWQgYSBidWcgaW4gdGhlCi0JCSBBbHBoYSBPU0YgMS4zIEMgY29tcGlsZXIuICBTZWUgcmVsb2MuYyBmb3IgbW9yZQotCQkgZGV0YWlscy4gICovCi0JICAgICAgbWFzayA9IDE7Ci0JICAgICAgbWFzayA8PD0gKGJmZF92bWEpIHJfc2l6ZTsKLQkgICAgICBtYXNrIC09IDE7Ci0KLQkgICAgICAvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBvdmVyZmxvdyBjaGVja2luZywKLQkJIGlmIGFueSwgc2hvdWxkIGJlIGRvbmUgaGVyZS4gICovCi0JICAgICAgdmFsID0gYmZkX2dldF82NCAoaW5wdXRfYmZkLAotCQkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgdmFsICY9fiBtYXNrIDw8IChiZmRfdm1hKSByX29mZnNldDsKLQkgICAgICB2YWwgfD0gKHN0YWNrWy0tdG9zXSAmIG1hc2spIDw8IChiZmRfdm1hKSByX29mZnNldDsKLQkgICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHZhbCwKLQkJCSAgY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfR1BWQUxVRToKLQkgIC8qIEkgcmVhbGx5IGRvbid0IGtub3cgaWYgdGhpcyBkb2VzIHRoZSByaWdodCB0aGluZy4gICovCi0JICBncCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwICsgcl9zeW1uZHg7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJlbG9jYXRlcCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotCSAgYXNlY3Rpb24gKnMgPSBOVUxMOwotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLQkgIC8qIFBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KLQotCSAgaG93dG8gPSAmYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdOwotCSAgICAgIC8qIElmIGggaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmVsb2MKLQkJIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoaWNoIHdlIHRob3VnaHQgd2FzIGp1c3QKLQkJIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCQlzID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXMgPSBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF07Ci0KLQkgICAgICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0Ci0JCSBjb252ZXJ0IHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICAgICAgaWYgKHJfZXh0ZXJuKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICAmJiBoLT5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgIGluZm8sCi0JCQkJCQkJICAgICBpbnB1dF9iZmQsCi0JCQkJCQkJICAgICBleHRfcmVsLAotCQkJCQkJCSAgICAgaCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIEFkanVzdAotCQkgICAgIHRoZSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHMtPm91dHB1dF9vZmZzZXQKLQkJCQktIHMtPnZtYSk7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoaXMgaXMgUEMgcmVsYXRpdmUsIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZQotCQkgYXBwZWFycyB0byBhbHJlYWR5IGhhdmUgdGhlIHJlbG9jIHdvcmtlZCBvdXQuICBXZQotCQkgbXVzdCBzdWJ0cmFjdCBvdXQgdGhlIG9sZCB2YWx1ZSBhbmQgYWRkIGluIHRoZSBuZXcKLQkJIG9uZS4gICovCi0JICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgICAgIC8qIFB1dCBpbiBhbnkgYWRkZW5kLiAgKi8KLQkgICAgICByZWxvY2F0aW9uICs9IGFkZGVuZDsKLQotCSAgICAgIC8qIEFkanVzdCB0aGUgY29udGVudHMuICAqLwotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIHJfdmFkZHIKLQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIHByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCSAgICAgIGlmIChyX2V4dGVybikKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbi4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJLSBzLT52bWEpOwotCi0JCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUKLQkJICAgICByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBzZWN0aW9uLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JCX0KLQotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCQkgICAgaW5wdXRfYmZkLAotCQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLAotCQkJCQkgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJICAgIHJlbG9jYXRpb24sCi0JCQkJCSAgICBhZGRlbmQpOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICBpZiAocl9leHRlcm4pCi0JCSAgICAgIG5hbWUgPSBzeW1faGFzaGVzW3Jfc3ltbmR4XS0+cm9vdC5yb290LnN0cmluZzsKLQkJICAgIGVsc2UKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgIHN5bW5keF90b19zZWN0aW9uW3Jfc3ltbmR4XSk7Ci0JCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJICAgKGluZm8sIG5hbWUsIGFscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkJCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlICYmIGFkanVzdF9hZGRycCkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsCi0JCQkoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyByX3ZhZGRyKSwKLQkJCShiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3ZhZGRyKTsKLQl9Ci0KLSAgICAgIGlmIChncF91c2VkcCAmJiBncF91bmRlZmluZWQpCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAoaW5mbywgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIEdQIG5vdCBkZWZpbmVkIiksCi0JCSAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCi0JICBncCA9IDQ7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAodG9zICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBEbyBmaW5hbCBhZGp1c3RtZW50cyB0byB0aGUgZmlsZWhkciBhbmQgdGhlIGFvdXRoZHIuICBUaGlzIHJvdXRpbmUKLSAgIHNldHMgdGhlIGR5bmFtaWMgYml0cyBpbiB0aGUgZmlsZSBoZWFkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1hbHBoYV9hZGp1c3RfaGVhZGVycyAoYWJmZCwgZmhkciwgYWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmhkcjsKLSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFoZHI7Ci17Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRFlOQU1JQyB8IEVYRUNfUCkpID09IChEWU5BTUlDIHwgRVhFQ19QKSkKLSAgICBmaGRyLT5mX2ZsYWdzIHw9IEZfQUxQSEFfQ0FMTF9TSEFSRUQ7Ci0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgZmhkci0+Zl9mbGFncyB8PSBGX0FMUEhBX1NIQVJBQkxFOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEFyY2hpdmUgaGFuZGxpbmcuICBJbiBPU0YvMSAob3IgRGlnaXRhbCBVbml4KSB2My4yLCBEaWdpdGFsCi0gICBpbnRyb2R1Y2VkIGFyY2hpdmUgcGFja2luZywgaW4gd2hpY2ggdGhlIGVsZW1lbnRzIGluIGFuIGFyY2hpdmUgYXJlCi0gICBvcHRpb25hbGx5IGNvbXByZXNzZWQgdXNpbmcgYSBzaW1wbGUgZGljdGlvbmFyeSBzY2hlbWUuICBXZSBrbm93Ci0gICBob3cgdG8gcmVhZCBzdWNoIGFyY2hpdmVzLCBidXQgd2UgZG9uJ3Qgd3JpdGUgdGhlbS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWNvZmZfc2x1cnBfYXJtYXAgX2JmZF9lY29mZl9zbHVycF9hcm1hcAotI2RlZmluZSBhbHBoYV9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBhbHBoYV9lY29mZl90cnVuY2F0ZV9hcm5hbWUgX2JmZF9lY29mZl90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgYWxwaGFfZWNvZmZfd3JpdGVfYXJtYXAgX2JmZF9lY29mZl93cml0ZV9hcm1hcAotI2RlZmluZSBhbHBoYV9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgYWxwaGFfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLQotLyogQSBjb21wcmVzc2VkIGZpbGUgdXNlcyB0aGlzIGluc3RlYWQgb2YgQVJGTUFHLiAgKi8KLQotI2RlZmluZSBBUkZaTUFHICJaXDAxMiIKLQotLyogUmVhZCBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaXMgbGlrZSB0aGUgc3RhbmRhcmQgcm91dGluZSwgYnV0IGl0Ci0gICBhbHNvIGFjY2VwdHMgQVJGWk1BRy4gICovCi0KLXN0YXRpYyBQVFIKLWFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnJldDsKLSAgc3RydWN0IGFyX2hkciAqaDsKLQotICByZXQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIChhYmZkLCBBUkZaTUFHKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGggPSAoc3RydWN0IGFyX2hkciAqKSByZXQtPmFyY2hfaGVhZGVyOwotICBpZiAoc3RybmNtcCAoaC0+YXJfZm1hZywgQVJGWk1BRywgMikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBhYls4XTsKLQotICAgICAgLyogVGhpcyBpcyBhIGNvbXByZXNzZWQgZmlsZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplIGNvcnJlY3RseS4KLSAgICAgICAgIFRoZSBzaXplIGlzIHRoZSBlaWdodCBieXRlcyBhZnRlciB0aGUgZHVtbXkgZmlsZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBGSUxIU1osIFNFRUtfQ1VSKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoYWIsIDEsIDgsIGFiZmQpICE9IDgKLQkgIHx8IGJmZF9zZWVrIChhYmZkLCAtIChGSUxIU1ogKyA4KSwgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHJldC0+cGFyc2VkX3NpemUgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIGFiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogR2V0IGFuIGFyY2hpdmUgZWxlbWVudCBhdCBhIHNwZWNpZmllZCBmaWxlIHBvc2l0aW9uLiAgVGhpcyBpcyB3aGVyZQotICAgd2UgdW5jb21wcmVzcyB0aGUgYXJjaGl2ZSBlbGVtZW50IGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBiZmQgKgotYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlcG9zKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGJmZCAqbmJmZCA9IE5VTEw7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnRkYXRhOwotICBzdHJ1Y3QgYXJfaGRyICpoZHI7Ci0gIGJmZF9ieXRlIGFiWzhdOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpidWYsICpwOwotICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gIG5iZmQgPSBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcyk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKChuYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IGV4cGFuZGVkIHRoaXMgQkZELiAgKi8KLSAgICAgIHJldHVybiBuYmZkOwotICAgIH0KLQotICB0ZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIG5iZmQtPmFyZWx0X2RhdGE7Ci0gIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopIHRkYXRhLT5hcmNoX2hlYWRlcjsKLSAgaWYgKHN0cm5jbXAgKGhkci0+YXJfZm1hZywgQVJGWk1BRywgMikgIT0gMCkKLSAgICByZXR1cm4gbmJmZDsKLQotICAvKiBXZSBtdXN0IHVuY29tcHJlc3MgdGhpcyBlbGVtZW50LiAgV2UgZG8gdGhpcyBieSBjb3B5aW5nIGl0IGludG8gYQotICAgICBtZW1vcnkgYnVmZmVyLCBhbmQgbWFraW5nIGJmZF9yZWFkIGFuZCBiZmRfc2VlayB1c2UgdGhhdCBidWZmZXIuCi0gICAgIFRoaXMgY2FuIHVzZSBhIGxvdCBvZiBtZW1vcnksIGJ1dCBpdCdzIHNpbXBsZXIgdGhhbiBnZXR0aW5nIGEKLSAgICAgdGVtcG9yYXJ5IGZpbGUsIG1ha2luZyB0aGF0IHdvcmsgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGNhY2hpbmcKLSAgICAgY29kZSwgYW5kIG1ha2luZyBzdXJlIHRoYXQgaXQgaXMgZGVsZXRlZCBhdCBhbGwgYXBwcm9wcmlhdGUKLSAgICAgdGltZXMuICBJdCBjYW4gYmUgY2hhbmdlZCBpZiBpdCBldmVyIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotICAvKiBUaGUgY29tcHJlc3NlZCBmaWxlIHN0YXJ0cyB3aXRoIGEgZHVtbXkgRUNPRkYgZmlsZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3NlZWsgKG5iZmQsIEZJTEhTWiwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIG5leHQgZWlnaHQgYnl0ZXMgYXJlIHRoZSByZWFsIGZpbGUgc2l6ZS4gICovCi0gIGlmIChiZmRfcmVhZCAoYWIsIDEsIDgsIG5iZmQpICE9IDgpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHNpemUgPSBiZmRfaF9nZXRfNjQgKG5iZmQsIGFiKTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIGJ1ZiA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlZnQ7Ci0gICAgICBiZmRfYnl0ZSBkaWN0WzQwOTZdOwotICAgICAgdW5zaWduZWQgaW50IGg7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChuYmZkLCBzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHAgPSBidWY7Ci0KLSAgICAgIGxlZnQgPSBzaXplOwotCi0gICAgICAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGUgbmV4dCBlaWdodCBieXRlcyBhcmUgZm9yLiAqLwotICAgICAgaWYgKGJmZF9yZWFkIChhYiwgMSwgOCwgbmJmZCkgIT0gOCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgdW5jb21wcmVzc2lvbiBhbGdvcml0aG0uICBJdCdzIGEgc2ltcGxlCi0JIGRpY3Rpb25hcnkgYmFzZWQgc2NoZW1lIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGlzIHByZWRpY3RlZAotCSBieSBhIGhhc2ggb2YgdGhlIHByZXZpb3VzIHRocmVlIGNoYXJhY3RlcnMuICBBIGNvbnRyb2wgYnl0ZQotCSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIHByZWRpY3RlZCBvciB3aGV0aGVyIGl0Ci0JIGFwcGVhcnMgaW4gdGhlIGlucHV0IHN0cmVhbTsgZWFjaCBjb250cm9sIGJ5dGUgbWFuYWdlcyB0aGUKLQkgbmV4dCBlaWdodCBieXRlcyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4gICovCi0gICAgICBtZW1zZXQgKGRpY3QsIDAsIHNpemVvZiBkaWN0KTsKLSAgICAgIGggPSAwOwotICAgICAgd2hpbGUgKGJmZF9yZWFkICgmYiwgMSwgMSwgbmJmZCkgPT0gMSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYiA+Pj0gMSkKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIG47Ci0KLQkgICAgICBpZiAoKGIgJiAxKSA9PSAwKQotCQluID0gZGljdFtoXTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBiZmRfcmVhZCAoJm4sIDEsIDEsIG5iZmQpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZGljdFtoXSA9IG47Ci0JCX0KLQotCSAgICAgICpwKysgPSBuOwotCi0JICAgICAgLS1sZWZ0OwotCSAgICAgIGlmIChsZWZ0ID09IDApCi0JCWJyZWFrOwotCi0JICAgICAgaCA8PD0gNDsKLQkgICAgICBoIF49IG47Ci0JICAgICAgaCAmPSBzaXplb2YgZGljdCAtIDE7Ci0JICAgIH0KLQotCSAgaWYgKGxlZnQgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhlIHVuY29tcHJlc3NlZCBmaWxlIGNvbnRlbnRzIGFyZSBpbiBidWYuICAqLwotICBiaW0gPSAoKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopCi0JIGJmZF9hbGxvYyAobmJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2luX21lbW9yeSkpKTsKLSAgaWYgKGJpbSA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBiaW0tPnNpemUgPSBzaXplOwotICBiaW0tPmJ1ZmZlciA9IGJ1ZjsKLQotICBuYmZkLT5tdGltZV9zZXQgPSB0cnVlOwotICBuYmZkLT5tdGltZSA9IHN0cnRvbCAoaGRyLT5hcl9kYXRlLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gIG5iZmQtPmZsYWdzIHw9IEJGRF9JTl9NRU1PUlk7Ci0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgYmltOwotICBCRkRfQVNTRVJUICghIG5iZmQtPmNhY2hlYWJsZSk7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChuYmZkICE9IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChuYmZkKTsKLSAgcmV0dXJuIE5VTEw7ICAKLX0KLQotLyogT3BlbiB0aGUgbmV4dCBhcmNoaXZlZCBmaWxlLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2hpdmUsIGxhc3RfZmlsZSkKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBiZmQgKmxhc3RfZmlsZTsKLXsKLSAgZmlsZV9wdHIgZmlsZXN0YXJ0OwotCi0gIGlmIChsYXN0X2ZpbGUgPT0gTlVMTCkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFyZWx0ZGF0YSAqdDsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIC8qIFdlIGNhbid0IHVzZSBhcmVsdF9zaXplIGhlcmUsIGJlY2F1c2UgdGhhdCB1c2VzIHBhcnNlZF9zaXplLAotICAgICAgICAgd2hpY2ggaXMgdGhlIHVuY29tcHJlc3NlZCBzaXplLiAgV2UgbmVlZCB0aGUgY29tcHJlc3NlZCBzaXplLiAgKi8KLSAgICAgIHQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBsYXN0X2ZpbGUtPmFyZWx0X2RhdGE7Ci0gICAgICBoID0gKHN0cnVjdCBhcl9oZHIgKikgdC0+YXJjaF9oZWFkZXI7Ci0gICAgICBzaXplID0gc3RydG9sIChoLT5hcl9zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4uLgotCSBOb3RlIHRoYXQgbGFzdF9maWxlLT5vcmlnaW4gY2FuIGJlIG9kZCBpbiB0aGUgY2FzZSBvZgotCSBCU0QtNC40LXN0eWxlIGVsZW1lbnQgd2l0aCBhIGxvbmcgb2RkIHNpemUuICovCi0gICAgICBmaWxlc3RhcnQgPSBsYXN0X2ZpbGUtPm9yaWdpbiArIHNpemU7Ci0gICAgICBmaWxlc3RhcnQgKz0gZmlsZXN0YXJ0ICUgMjsKLSAgICB9Ci0KLSAgcmV0dXJuIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotLyogT3BlbiB0aGUgYXJjaGl2ZSBmaWxlIGdpdmVuIGFuIGluZGV4IGludG8gdGhlIGFybWFwLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIGVudHJ5LT5maWxlX29mZnNldCk7Ci19Ci0MCi0vKiBUaGlzIGlzIHRoZSBFQ09GRiBiYWNrZW5kIHN0cnVjdHVyZS4gIFRoZSBiYWNrZW5kIGZpZWxkIG9mIHRoZQotICAgdGFyZ2V0IHZlY3RvciBwb2ludHMgdG8gdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhIGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSA9Ci17Ci0gIC8qIENPRkYgYmFja2VuZCBzdHJ1Y3R1cmUuICAqLwotICB7Ci0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpIGJmZF92b2lkLCAvKiBhdXhfaW4gKi8KLSAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19pbiAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLGludCxpbnQsaW50LGludCxQVFIpKSliZmRfdm9pZCwvKmF1eF9vdXQqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogbGluZW5vX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogcmVsb2Nfb3V0ICovCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX291dCwKLSAgICBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gICAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgMCwgMCwgMCwgMCwgdHJ1ZSwgZmFsc2UsIDQsCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX2luLCBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfaW4sCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9zY25oZHJfaW4sIE5VTEwsCi0gICAgYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rLCBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgICBhbHBoYV9lY29mZl9ta29iamVjdF9ob29rLCBfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzLAotICAgIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rLCBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gIH0sCi0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBiZmRfYXJjaF9hbHBoYSwKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gICJfX19fX19fXzY0IiwKLSAgLyogVGhlIHBhZ2UgYm91bmRhcnkgdXNlZCB0byBhbGlnbiBzZWN0aW9ucyBpbiBhIGRlbWFuZC1wYWdlZAotICAgICBleGVjdXRhYmxlIGZpbGUuICBFLmcuLCAweDEwMDAuICAqLwotICAweDIwMDAsCi0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICB0cnVlLAotICAvKiBCaXRzaXplIG9mIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICA2NCwKLSAgLyogUmVsb2MgdG8gdXNlIGZvciBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgJmFscGhhX2hvd3RvX3RhYmxlW0FMUEhBX1JfUkVGUVVBRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bTIsCi0gICAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICAgIDgsCi0gICAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICAgIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX2luLAotICAgIGVjb2ZmX3N3YXBfZG5yX2luLAotICAgIGVjb2ZmX3N3YXBfcGRyX2luLAotICAgIGVjb2ZmX3N3YXBfc3ltX2luLAotICAgIGVjb2ZmX3N3YXBfb3B0X2luLAotICAgIGVjb2ZmX3N3YXBfZmRyX2luLAotICAgIGVjb2ZmX3N3YXBfcmZkX2luLAotICAgIGVjb2ZmX3N3YXBfZXh0X2luLAotICAgIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gICAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgICBlY29mZl9zd2FwX29wdF9vdXQsCi0gICAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAgIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gICAgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIH0sCi0gIC8qIEV4dGVybmFsIHJlbG9jIHNpemUuICAqLwotICBSRUxTWiwKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbiwKLSAgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBhbHBoYV9hZGp1c3RfcmVsb2NfaW4sCi0gIGFscGhhX2FkanVzdF9yZWxvY19vdXQsCi0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBhbHBoYV9hZGp1c3RfaGVhZGVycywKLSAgLyogUmVhZCBhbiBlbGVtZW50IGZyb20gYW4gYXJjaGl2ZSBhdCBhIGdpdmVuIGZpbGUgcG9zaXRpb24uICAqLwotICBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MKLX07Ci0KLS8qIExvb2tpbmcgdXAgYSByZWxvYyB0eXBlIGlzIEFscGhhIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLS8qIFNvIGlzIGdldHRpbmcgcmVsb2NhdGVkIHNlY3Rpb24gY29udGVudHMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotLyogSGFuZGxpbmcgZmlsZSB3aW5kb3dzIGlzIGdlbmVyaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotLyogUmVsYXhpbmcgc2VjdGlvbnMgaXMgZ2VuZXJpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVhbHBoYSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGFscGhhX2Vjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYWxwaGFfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpICZhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hcG9sbG8uYyBiL2JmZC9jb2ZmLWFwb2xsby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNlYzg5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFwb2xsby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBvbGxvIDY4MDAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuZWR1LmF1KQotICAgQmFzZWQgb24gbTY4ayBzdGFuZGFyZCBDT0ZGIHZlcnNpb24gV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9hcG9sbG8uaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiByZWxvY19ob3d0b190eXBlIGFwb2xsb2NvZmZfaG93dG9fdGFibGVbXTsKLSNlbHNlCi1yZWxvY19ob3d0b190eXBlIGFwb2xsb2NvZmZfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1JFTEJZVEUsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTFdPUkQsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkcsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkJZVEUsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSTE9ORywJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkdfTkVHLAkgICAgICAgMCwgIC0yLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIi0zMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jaWZuZGVmIEJBRE1BRwotI2RlZmluZSBCQURNQUcoeCkgTTY4S0JBRE1BRyh4KQotI2VuZGlmCi0jZGVmaW5lIEFQT0xMT19NNjggMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiB2b2lkIGFwb2xsb19ydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICppbnRlcm5hbCwgaW50IHJlbG9jZW50cnkpKTsKLWV4dGVybiBpbnQgYXBvbGxvX2hvd3RvMnJ0eXBlIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKikpOwotI2Vsc2UKLXZvaWQKLWFwb2xsb19ydHlwZTJob3d0byhpbnRlcm5hbCwgcmVsb2NlbnRyeSkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIGludCByZWxvY2VudHJ5OwotewotICBzd2l0Y2ggKHJlbG9jZW50cnkpIAotICB7Ci0gICBjYXNlIFJfUkVMQllURToJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDA7IGJyZWFrOwotICAgY2FzZSBSX1JFTFdPUkQ6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAxOyBicmVhazsKLSAgIGNhc2UgUl9SRUxMT05HOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMjsgYnJlYWs7Ci0gICBjYXNlIFJfUENSQllURToJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDM7IGJyZWFrOwotICAgY2FzZSBSX1BDUldPUkQ6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyA0OyBicmVhazsKLSAgIGNhc2UgUl9QQ1JMT05HOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9OR19ORUc6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyA2OyBicmVhazsKLSAgfQotfQotCi1pbnQgCi1hcG9sbG9faG93dG8ycnR5cGUgKGludGVybmFsKQotICAgICByZWxvY19ob3d0b190eXBlICppbnRlcm5hbDsKLXsKLSAgaWYgKGludGVybmFsLT5wY19yZWxhdGl2ZSkgCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKLSAgICB7Ci0gICAgIGNhc2UgMzI6IHJldHVybiBSX1BDUkxPTkc7Ci0gICAgIGNhc2UgMTY6IHJldHVybiBSX1BDUldPUkQ7Ci0gICAgIGNhc2UgODogcmV0dXJuIFJfUENSQllURTsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkKLSAgICAgewotICAgICAgY2FzZSAzMjogcmV0dXJuIFJfUkVMTE9ORzsKLSAgICAgIGNhc2UgMTY6IHJldHVybiBSX1JFTFdPUkQ7Ci0gICAgICBjYXNlIDg6IHJldHVybiBSX1JFTEJZVEU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gUl9SRUxMT05HOyAgICAKLX0KLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBcCi0gIGFwb2xsb19ydHlwZTJob3d0byhpbnRlcm5hbCwgKHJlbG9jZW50cnkpLT5yX3R5cGUpCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGV4dGVybmFsLCBpbnRlcm5hbCkgXAotICBleHRlcm5hbC5yX3R5cGUgPSBhcG9sbG9faG93dG8ycnR5cGUoaW50ZXJuYWwpOwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldCAKLSNpZmRlZiBUQVJHRVRfU1lNCi0gIFRBUkdFVF9TWU0gPQotI2Vsc2UKLSAgYXBvbGxvY29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiYXBvbGxvLW02OGsiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKLSAgJ18nLAotI2Vsc2UKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZW5kaWYKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRQotIH07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hcm0uYyBiL2JmZC9jb2ZmLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM1N2ZkLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvYXJtLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogTWFjcm9zIGZvciBtYW5pcHVsYXRpb24gdGhlIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIHRoZSBjb2ZmIGRhdGEKLSAgIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEFQQ1NfMjZfRkxBRyggICAgICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfQVBDU18yNikKLSNkZWZpbmUgQVBDU19GTE9BVF9GTEFHKCAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX0ZMT0FUKQotI2RlZmluZSBQSUNfRkxBRyggICAgICAgICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX1BJQykKLSNkZWZpbmUgQVBDU19TRVQoICAgICAgICAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX1NFVCkKLSNkZWZpbmUgU0VUX0FQQ1NfRkxBR1MoICAgICBhYmZkLCBmbGdzKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgPSBcCi0JCQkJCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIH4gKEZfQVBDU18yNiB8IEZfQVBDU19GTE9BVCB8IEZfUElDKSkgXAotCQkJCQkgfCAoZmxncyB8IEZfQVBDU19TRVQpKQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggICAgIGFiZmQgKSAJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9JTlRFUldPUkspCi0jZGVmaW5lIElOVEVSV09SS19TRVQoICAgICAgYWJmZCApIAkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0lOVEVSV09SS19TRVQpCi0jZGVmaW5lIFNFVF9JTlRFUldPUktfRkxBRyggYWJmZCwgZmxnICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzID0gXAotCQkJCQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiB+IEZfSU5URVJXT1JLKSBcCi0JCQkJCSB8IChmbGcgfCBGX0lOVEVSV09SS19TRVQpKQotICAgICAKLXR5cGVkZWYgZW51bSB7YnVua25vd24sIGI5LCBiMTIsIGIyM30gdGh1bWJfcGNyZWxfYnJhbmNodHlwZTsKLS8qIHNvbWUgdHlwZWRlZnMgZm9yIGhvbGRpbmcgaW5zdHJ1Y3Rpb25zICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGluc24zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGluc24xNjsKLQotCi0gICAgIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBzdHVwaWQgY29tcGlsZXJzLiAgKi8KLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotICAgICAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8yMwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8xMgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF85Ci0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2FybV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCSAgIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAlib29sZWFuICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogY29mZl9hcm1fcnR5cGVfdG9faG93dG8gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF9jb21tb24KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqLAotCSAgIHRodW1iX3BjcmVsX2JyYW5jaHR5cGUpKTsKLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICogY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGluc24zMiBpbnNlcnRfdGh1bWJfYnJhbmNoCi0gIFBBUkFNUyAoKGluc24zMiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogZmluZF90aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBmaW5kX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFRoZSBsaW5rZXIgc2NyaXB0IGtub3dzIHRoZSBzZWN0aW9uIG5hbWVzIGZvciBwbGFjZW1lbnQuCi0gICBUaGUgZW50cnlfbmFtZXMgYXJlIHVzZWQgdG8gZG8gc2ltcGxlIG5hbWUgbWFuZ2xpbmcgb24gdGhlIHN0dWJzLgotICAgR2l2ZW4gYSBmdW5jdGlvbiBuYW1lLCBhbmQgaXRzIHR5cGUsIHRoZSBzdHViIGNhbiBiZSBmb3VuZC4gVGhlCi0gICBuYW1lIGNhbiBiZSBjaGFuZ2VkLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGUgJXMgYmUgcHJlc2VudC4KLSAgICovCi0gICAKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83dCIKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fdGh1bWIiCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83IgotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV9hcm0iCi0KLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfYXJtX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIElmIFVTRVJfTEFCRUxfUFJFRklYIGlzIGRlZmluZWQgYXMgIl8iIChzZWUgY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSgpCi0gICBpbiB0aGlzIGZpbGUpLCB0aGVuIFRBUkdFVF9VTkRFUlNDT1JFIHNob3VsZCBiZSBkZWZpbmVkLCBvdGhlcndpc2UgaXQKLSAgIHNob3VsZCBub3QuICAqLwotI2lmbmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNlbmRpZgotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNlbmRpZgotCi0vKiBUaGVzZSBtb3N0IGNlcnRhaW5seSBiZWxvbmcgc29tZXdoZXJlIGVsc2UuIEp1c3QgaGFkIHRvIGdldCByaWQgb2YKLSAgIHRoZSBtYW5pZmVzdCBjb25zdGFudHMgaW4gdGhlIGNvZGUuICovCi0KLSNkZWZpbmUgQVJNXzggICAgICAgIDAKLSNkZWZpbmUgQVJNXzE2ICAgICAgIDEKLSNkZWZpbmUgQVJNXzMyICAgICAgIDIKLSNkZWZpbmUgQVJNXzI2ICAgICAgIDMKLSNkZWZpbmUgQVJNX0RJU1A4ICAgIDQKLSNkZWZpbmUgQVJNX0RJU1AxNiAgIDUKLSNkZWZpbmUgQVJNX0RJU1AzMiAgIDYKLSNkZWZpbmUgQVJNXzI2RCAgICAgIDcKLS8qIDggaXMgdW51c2VkICovCi0jZGVmaW5lIEFSTV9ORUcxNiAgICA5Ci0jZGVmaW5lIEFSTV9ORUczMiAgIDEwCi0jZGVmaW5lIEFSTV9SVkEzMiAgIDExCi0jZGVmaW5lIEFSTV9USFVNQjkgIDEyCi0jZGVmaW5lIEFSTV9USFVNQjEyIDEzCi0jZGVmaW5lIEFSTV9USFVNQjIzIDE0Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW10gPSAKLXsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotICBIT1dUTyhBUk1fOCwJCQkvKiB0eXBlICovCi0JMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JMCwJCQkvKiBzaXplICovCi0JOCwJCQkvKiBiaXRzaXplICovCi0JZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkwLAkJCS8qIGJpdHBvcyAqLwotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCWNvZmZfYXJtX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSJBUk1fOCIsCQkvKiBuYW1lICovCi0gICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JUENSRUxPRkZTRVQJCS8qIHBjcmVsX29mZnNldCAqLyksCi0gIEhPV1RPKEFSTV8xNiwgIAotCTAsIAotCTEsIAotCTE2LCAKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fMTYiLCAKLQl0cnVlLAotCTB4MDAwMGZmZmYsCi0JMHgwMDAwZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fMzIsIAotCTAsCi0JMiwgCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNXzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fMjYsCi0JMiwKLQkyLAotCTI0LAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JYW91dGFybV9maXhfcGNyZWxfMjYgLAotCSJBUk1fMjYiLAotCWZhbHNlLAotCTB4MDBmZmZmZmYsCi0JMHgwMGZmZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fRElTUDgsICAgICAgICAKLQkwLAotCTAsCi0JOCwgCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQOCIsICAKLQl0cnVlLAotCTB4MDAwMDAwZmYsCi0JMHgwMDAwMDBmZiwKLQl0cnVlKSwKLSAgSE9XVE8oIEFSTV9ESVNQMTYsIAotCTAsCi0JMSwKLQkxNiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX0RJU1AxNiIsCi0JdHJ1ZSwKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsCi0JdHJ1ZSksCi0gIEhPV1RPKCBBUk1fRElTUDMyLAotCTAsCi0JMiwKLQkzMiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLSAJY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQMzIiLAotCXRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCXRydWUpLAotICBIT1dUTyggQVJNXzI2RCwgIAotCTIsIAotCTIsCi0JMjQsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19kb250LAotCWFvdXRhcm1fZml4X3BjcmVsXzI2X2RvbmUsIAotCSJBUk1fMjZEIiwKLQl0cnVlLAotCTB4MDBmZmZmZmYsCi0JMHgwLAotCWZhbHNlKSwKLSAgLyogOCBpcyB1bnVzZWQgKi8KLSAgey0xfSwKLSAgSE9XVE8oIEFSTV9ORUcxNiwKLQkwLAotCS0xLAotCTE2LAotCWZhbHNlLAotCTAsIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fTkVHMTYiLAotICAgICAgICB0cnVlLCAKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsIAotCWZhbHNlKSwKLSAgSE9XVE8oIEFSTV9ORUczMiwgCi0JMCwgCi0JLTIsCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX05FRzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JZmFsc2UpLAotICBIT1dUTyggQVJNX1JWQTMyLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9SVkEzMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjksCi0JMSwKLQkxLAotCTgsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzkgLAotCSJBUk1fVEhVTUI5IiwKLQlmYWxzZSwKLQkweDAwMDAwMGZmLAotCTB4MDAwMDAwZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjEyLAotCTEsCi0JMSwKLQkxMSwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWNvZmZfdGh1bWJfcGNyZWxfMTIgLAotCSJBUk1fVEhVTUIxMiIsCi0JZmFsc2UsCi0JMHgwMDAwMDdmZiwKLQkweDAwMDAwN2ZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKCBBUk1fVEhVTUIyMywKLQkxLAotCTIsCi0JMjIsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzIzICwKLQkiQVJNX1RIVU1CMjMiLAotCWZhbHNlLAotCTB4MDdmZjA3ZmYsCi0JMHgwN2ZmMDdmZiwgCi0JUENSRUxPRkZTRVQpLAotfTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuCi1pbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqIGhvd3RvOwotewotICByZXR1cm4gIWhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBBUk1fUlZBMzI7Ci19ICAgICAKLSNlbmRpZgotCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gYW91dGFybV9zdGRfcmVsb2NfaG93dG8gKyAoZHN0KS0+cl90eXBlOwotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9hcm1fcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9hcm1fcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBob3d0byA9IGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvICsgcmVsLT5yX3R5cGU7Ci0KLSAgaWYgKHJlbC0+cl90eXBlID09IEFSTV9SVkEzMikKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSBwZV9kYXRhKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGhvd3RvOwotCi19Ci0vKiBVc2VkIGJ5IHRoZSBhc3NlbWJsZXIuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWFvdXRhcm1fZml4X3BjcmVsXzI2X2RvbmUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBVc2VkIGJ5IHRoZSBhc3NlbWJsZXIuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWFvdXRhcm1fZml4X3BjcmVsXzI2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICAKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmYW91dGFybV9zdGRfcmVsb2NfaG93dG9bQVJNXzI2RF07Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGJ0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLSAgICAgdGh1bWJfcGNyZWxfYnJhbmNodHlwZSBidHlwZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgdGFyZ2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgZHN0bXNrOwotICBiZmRfdm1hIG9mZm1zazsKLSAgYmZkX3ZtYSBzaWduYml0OwotCi0gIC8qIE5PVEU6IFRoaXMgcm91dGluZSBpcyBjdXJyZW50bHkgdXNlZCBieSBHQVMsIGJ1dCBub3QgYnkgdGhlIGxpbmsKLSAgICAgcGhhc2UuICAqLwotCi0gIHN3aXRjaCAoYnR5cGUpCi0gICAgewotICAgIGNhc2UgYjk6Ci0gICAgICBkc3Rtc2sgID0gMHgwMDAwMDBmZjsKLSAgICAgIG9mZm1zayAgPSAweDAwMDAwMWZlOwotICAgICAgc2lnbmJpdCA9IDB4MDAwMDAxMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYjEyOgotICAgICAgZHN0bXNrICA9IDB4MDAwMDA3ZmY7Ci0gICAgICBvZmZtc2sgID0gMHgwMDAwMGZmZTsKLSAgICAgIHNpZ25iaXQgPSAweDAwMDAwODAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGIyMzoKLSAgICAgIGRzdG1zayAgPSAweDA3ZmYwN2ZmOwotICAgICAgb2ZmbXNrICA9IDB4MDA3ZmZmZmY7Ci0gICAgICBzaWduYml0ID0gMHgwMDQwMDAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19jb250aW51ZSA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb25zIGFyZSBkaWZmZXJlbnQsIGFuZCB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24sCi0gICAgIGp1c3QgaWdub3JlIGl0IGZvciBub3cuICAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lICE9IGlucHV0X3NlY3Rpb24tPm5hbWUKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBzd2l0Y2ggKGJ0eXBlKQotICAgIHsKLSAgICBjYXNlIGI5OgotICAgIGNhc2UgYjEyOgotICAgICAgcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgZHN0bXNrKSA8PCAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiMjM6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCXJlbG9jYXRpb24gPSAoKHRhcmdldCAmIDB4N2ZmKSA8PCAxKSAgfCAoKHRhcmdldCAmIDB4MDdmZjAwMDApID4+IDQpOwotICAgICAgZWxzZQotCXJlbG9jYXRpb24gPSAoKHRhcmdldCAmIDB4N2ZmKSA8PCAxMikgfCAoKHRhcmdldCAmIDB4MDdmZjAwMDApID4+IDE1KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gXiBzaWduYml0KSAtIHNpZ25iaXQ7IC8qIFNpZ24gZXh0ZW5kICovCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT52YWx1ZTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uIC09IGFkZHI7Ci0KLSAgaWYgKHJlbG9jYXRpb24gJiAxKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgc2lnbmJpdCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+b2ZmbXNrKSAhPSB+b2ZmbXNrKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfm9mZm1zaykKLSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHRhcmdldCAmPSB+ZHN0bXNrOwotICBzd2l0Y2ggKGJ0eXBlKQotICAgewotICAgY2FzZSBiOToKLSAgIGNhc2UgYjEyOgotICAgICB0YXJnZXQgfD0gKHJlbG9jYXRpb24gPj4gMSk7Ci0gICAgIGJyZWFrOwotCi0gICBjYXNlIGIyMzoKLSAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICAgICB0YXJnZXQgfD0gKChyZWxvY2F0aW9uICYgMHhmZmYpID4+IDEpICB8ICgocmVsb2NhdGlvbiA8PCA0KSAgJiAweDA3ZmYwMDAwKTsKLSAgICAgZWxzZQotICAgICAgIHRhcmdldCB8PSAoKHJlbG9jYXRpb24gJiAweGZmZSkgPDwgMTUpIHwgKChyZWxvY2F0aW9uID4+IDEyKSAmIDB4N2ZmKTsKLSAgICAgYnJlYWs7Ci0KLSAgIGRlZmF1bHQ6Ci0gICAgIGFib3J0ICgpOwotICAgfQotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmIGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvIFtBUk1fMjZEXTsKLSAgCi0gIC8qIFRPRE86IFdlIHNob3VsZCBwb3NzaWJseSBoYXZlIERPTkUgZW50cmllcyBmb3IgdGhlIFRIVU1CIFBDUkVMIHJlbG9jYXRpb25zICovCi0gIHJldHVybiBmbGFnOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX3RodW1iX3BjcmVsXzIzIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjIzKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl90aHVtYl9wY3JlbF8xMiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGIxMik7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfOSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGI5KTsKLX0KLQotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCi1jb2ZmX2FybV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgIGJmZCAqIGFiZmQ7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSNkZWZpbmUgQVNURChpLGopICAgICAgIGNhc2UgaTogcmV0dXJuICZhb3V0YXJtX3N0ZF9yZWxvY19ob3d0b1tqXQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgQVJNXzgpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2LCAgICAgICAgICAgICAgICAgICBBUk1fMTYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBBUk1fMzIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsICAgICBBUk1fMjYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzhfUENSRUwsICAgICAgICAgICAgICBBUk1fRElTUDgpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCAgICAgICAgICAgICBBUk1fRElTUDE2KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgQVJNX0RJU1AzMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfUlZBLCAgICAgICAgICAgICAgICAgIEFSTV9SVkEzMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOSwgIEFSTV9USFVNQjkpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLCBBUk1fVEhVTUIxMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIEFSTV9USFVNQjIzKTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAKLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBBUk1CQURNQUcoeCkKLSNkZWZpbmUgQVJNIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0vKiBFeHRlbmQgdGhlIGNvZmZfbGlua19oYXNoX3RhYmxlIHN0cnVjdHVyZSB3aXRoIGEgZmV3IEFSTSBzcGVjaWZpYyBmaWVsZHMuCi0gICBUaGlzIGFsbG93cyB1cyB0byBzdG9yZSBnbG9iYWwgZGF0YSBoZXJlIHdpdGhvdXQgYWN0dWFsbHkgY3JlYXRpbmcgYW55Ci0gICBnbG9iYWwgdmFyaWFibGVzLCB3aGljaCBpcyBhIG5vLW5vIGluIHRoZSBCRkQgd29ybGQuICAqLwotc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgb3JpZ2luYWwgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlLiAgTVVTVCBiZSBmaXJzdCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQlyb290OwotICAKLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIFRodW1iLXRvLUFSTSBnbHVlLiAgKi8KLSAgbG9uZyBpbnQgCQkJdGh1bWJfZ2x1ZV9zaXplOwotICAKLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIEFSTS10by1UaHVtYiBnbHVlLiAgKi8KLSAgbG9uZyBpbnQgCQkJYXJtX2dsdWVfc2l6ZTsKLQotICAvKiBBbiBhcmJpdGFyeSBpbnB1dCBCRkQgY2hvc2VuIHRvIGhvbGQgdGhlIGdsdWUgc2VjdGlvbnMuICAqLwotICBiZmQgKgkJCQliZmRfb2ZfZ2x1ZV9vd25lcjsKLQotICAvKiBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCwgbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4gKi8KLSAgaW50IAkJCQlzdXBwb3J0X29sZF9jb2RlOwotfTsKLQotLyogR2V0IHRoZSBBUk0gY29mZiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfYXJtX2hhc2hfdGFibGUoaW5mbykgXAotICAoKHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBBUk0gY29mZiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1jb2ZmX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICAgICAgKCYgcmV0LT5yb290LCBhYmZkLCBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPnRodW1iX2dsdWVfc2l6ZSAgID0gMDsKLSAgcmV0LT5hcm1fZ2x1ZV9zaXplICAgICA9IDA7Ci0gIHJldC0+YmZkX29mX2dsdWVfb3duZXIgPSBOVUxMOwotCi0gIHJldHVybiAmIHJldC0+cm9vdC5yb290OwotfQotCi1zdGF0aWMgdm9pZAotYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY19vZmZzZXQpCi0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICAgYmZkX3ZtYSByZWxvY19vZmZzZXQ7Ci17Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX29mZnNldAotICAgICAgICAgICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgaWYgKGNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpCi0gICAgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgZndyaXRlICgmYWRkciwgMSwgc2l6ZW9mIChhZGRyKSwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKLQotfQotDAotLyogVGhlIHRodW1iIGZvcm0gb2YgYSBsb25nIGJyYW5jaCBpcyBhIGJpdCBmaW5pY2t5LCBiZWNhdXNlIHRoZSBvZmZzZXQKLSAgIGVuY29kaW5nIGlzIHNwbGl0IG92ZXIgdHdvIGZpZWxkcywgZWFjaCBpbiBpdCdzIG93biBpbnN0cnVjdGlvbi4gVGhleQotICAgY2FuIG9jY3VyIGluIGFueSBvcmRlci4gU28gZ2l2ZW4gYSB0aHVtYiBmb3JtIG9mIGxvbmcgYnJhbmNoLCBhbmQgYW4gCi0gICBvZmZzZXQsIGluc2VydCB0aGUgb2Zmc2V0IGludG8gdGhlIHRodW1iIGJyYW5jaCBhbmQgcmV0dXJuIGZpbmlzaGVkCi0gICBpbnN0cnVjdGlvbi4gCi0KLSAgIEl0IHRha2VzIHR3byB0aHVtYiBpbnN0cnVjdGlvbnMgdG8gZW5jb2RlIHRoZSB0YXJnZXQgYWRkcmVzcy4gRWFjaCBoYXMgCi0gICAxMSBiaXRzIHRvIGludmVzdC4gVGhlIHVwcGVyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiBvbmUgKGlkZW50aWZlZCBieQotICAgSC0wLi4gc2VlIGJlbG93KSwgdGhlIGxvd2VyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgb3RoZXIgKGlkZW50aWZpZWQgCi0gICBieSBILTEpLiAKLQotICAgQ29tYmluZSB0b2dldGhlciBhbmQgc2hpZnRlZCBsZWZ0IGJ5IDEgKGl0J3MgYSBoYWxmIHdvcmQgYWRkcmVzcykgYW5kIAotICAgdGhlcmUgeW91IGhhdmUgaXQuCi0KLSAgICAgT3A6IDExMTEgPSBGLAotICAgICBILTAsIHVwcGVyIGFkZHJlc3MtMCA9IDAwMAotICAgICBPcDogMTExMSA9IEYsCi0gICAgIEgtMSwgbG93ZXIgYWRkcmVzcy0wID0gODAwCi0KLSAgIFRoZXkgY2FuIGJlIG9yZGVyZWQgZWl0aGVyIHdheSwgYnV0IHRoZSBhcm0gdG9vbHMgSSd2ZSBzZWVuIGFsd2F5cyBwdXQgCi0gICB0aGUgbG93ZXIgb25lIGZpcnN0LiBJdCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlci4ga3JrQGN5Z251cy5jb20KLQotICAgWFhYOiAgQWN0dWFsbHkgdGhlIG9yZGVyIGRvZXMgbWF0dGVyLiAgVGhlIHNlY29uZCBpbnN0cnVjdGlvbiAoSC0xKQotICAgbW92ZXMgdGhlIGNvbXB1dGVkIGFkZHJlc3MgaW50byB0aGUgUEMsIHNvIGl0IG11c3QgYmUgdGhlIHNlY29uZCBvbmUKLSAgIGluIHRoZSBzZXF1ZW5jZS4gIFRoZSBwcm9ibGVtLCBob3dldmVyIGlzIHRoYXQgd2hpbHN0IGxpdHRsZSBlbmRpYW4gY29kZQotICAgc3RvcmVzIHRoZSBpbnN0cnVjdGlvbnMgaW4gSEkgdGhlbiBMT1cgb3JkZXIsIGJpZyBlbmRpYW4gY29kZSBkb2VzIHRoZQotICAgcmV2ZXJzZS4gIG5pY2tjQGN5Z251cy5jb20gICovCi0KLSNkZWZpbmUgTE9XX0hJX09SREVSIDB4RjgwMEYwMDAKLSNkZWZpbmUgSElfTE9XX09SREVSIDB4RjAwMEY4MDAKLQotc3RhdGljIGluc24zMgotaW5zZXJ0X3RodW1iX2JyYW5jaCAoYnJfaW5zbiwgcmVsX29mZikKLSAgICAgaW5zbjMyIGJyX2luc247Ci0gICAgIGludCByZWxfb2ZmOwotewotICB1bnNpZ25lZCBpbnQgbG93X2JpdHM7Ci0gIHVuc2lnbmVkIGludCBoaWdoX2JpdHM7Ci0KLQotICBCRkRfQVNTRVJUKChyZWxfb2ZmICYgMSkgIT0gMSk7Ci0KLSAgcmVsX29mZiA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYWxmIHdvcmQgYWxpZ25lZCBhZGRyZXNzICovCi0gIGxvd19iaXRzID0gcmVsX29mZiAmIDB4MDAwMDA3RkY7ICAgICAgICAgICAgLyogdGhlIGJvdHRvbSAxMSBiaXRzICovCi0gIGhpZ2hfYml0cyA9IChyZWxfb2ZmID4+IDExKSAmIDB4MDAwMDA3RkY7ICAgLyogdGhlIHRvcCAxMSBiaXRzICovCi0KLSAgaWYgKChicl9pbnNuICYgTE9XX0hJX09SREVSKSA9PSBMT1dfSElfT1JERVIpCi0gICAgYnJfaW5zbiA9IExPV19ISV9PUkRFUiB8IChsb3dfYml0cyA8PCAxNikgfCBoaWdoX2JpdHM7Ci0gIGVsc2UgaWYgKChicl9pbnNuICYgSElfTE9XX09SREVSKSA9PSBISV9MT1dfT1JERVIpCi0gICAgYnJfaW5zbiA9IEhJX0xPV19PUkRFUiB8IChoaWdoX2JpdHMgPDwgMTYpIHwgbG93X2JpdHM7Ci0gIGVsc2UKLSAgICBhYm9ydCgpOyAvKiBlcnJvciAtIG5vdCBhIHZhbGlkIGJyYW5jaCBpbnN0cnVjdGlvbiBmb3JtICovCi0KLSAgLyogRklYTUU6IGFib3J0IGlzIHByb2JhYmx5IG5vdCB0aGUgcmlnaHQgY2FsbC4ga3JrQGN5Z251cy5jb20gKi8KLQotICByZXR1cm4gYnJfaW5zbjsKLX0KLQotDAotc3RhdGljIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX3RodW1iX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBDT05TVCBjaGFyICogICAgICAgICAgIG5hbWU7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotewotICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogbXloOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0JIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0gIAotICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIAotICBpZiAobXloID09IE5VTEwpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bmFibGUgdG8gZmluZCBUSFVNQiBnbHVlICclcycgZm9yIGAlcyciKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKLSAgCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICByZXR1cm4gbXloOwotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoKLWZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBDT05TVCBjaGFyICogICAgICAgICAgIG5hbWU7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotewotICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogbXloOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0JICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLSAgCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAobXloID09IE5VTEwpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bmFibGUgdG8gZmluZCBBUk0gZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0gIAotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgcmV0dXJuIG15aDsKLX0KLQotLyoKLSAgQVJNLT5UaHVtYiBnbHVlOgotCi0gICAgICAgLmFybQotICAgICAgIF9fZnVuY19mcm9tX2FybToKLQkgICAgIGxkciByMTIsIF9fZnVuY19hZGRyCi0JICAgICBieCAgcjEyCi0gICAgICAgX19mdW5jX2FkZHI6Ci0gICAgICAgICAgICAud29yZCBmdW5jICAgIEAgYmVoYXZlIGFzIGlmIHlvdSBzYXcgYSBBUk1fMzIgcmVsb2MKLSovCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0laRSAxMgotc3RhdGljIGNvbnN0IGluc24zMiBhMnQxX2xkcl9pbnNuICAgICAgID0gMHhlNTlmYzAwMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0Ml9ieF9yMTJfaW5zbiAgICA9IDB4ZTEyZmZmMWM7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDNfZnVuY19hZGRyX2luc24gPSAweDAwMDAwMDAxOwotCi0vKgotICAgVGh1bWItPkFSTToJCQkJVGh1bWItPihub24taW50ZXJ3b3JraW5nIGF3YXJlKSBBUk0KLQotICAgLnRodW1iCQkJCS50aHVtYgotICAgLmFsaWduIDIJCQkJLmFsaWduIDIKLSAgICAgIF9fZnVuY19mcm9tX3RodW1iOgkJICAgX19mdW5jX2Zyb21fdGh1bWI6Ci0JICAgYnggcGMJCQkJcHVzaCB7cjYsIGxyfQotCSAgIG5vcAkJCQkJbGRyICByNiwgX19mdW5jX2FkZHIKLSAgIC5hcm0JCQkJCQltb3YgIGxyLCBwYwotICAgICAgX19mdW5jX2NoYW5nZV90b19hcm06CQkJYnggICByNgotCSAgIGIgZnVuYyAgIAkJCS5hcm0KLQkJCQkJICAgX19mdW5jX2JhY2tfdG9fdGh1bWI6Ci0gICAJCSAgCQkJCWxkbWlhIHIxMyEge3I2LCBscn0KLSAgIAkJCQkJICAgICAgICBieCAgICBscgotICAgCQkJCQkgICBfX2Z1bmNfYWRkcjoKLQkJCQkJICAgICAgICAud29yZAlmdW5jIAotKi8KLQotI2RlZmluZSBUSFVNQjJBUk1fR0xVRV9TSVpFIChnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlID8gMjAgOiA4KQotc3RhdGljIGNvbnN0IGluc24xNiB0MmExX2J4X3BjX2luc24gPSAweDQ3Nzg7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTJfbm9vcF9pbnNuICA9IDB4NDZjMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhM19iX2luc24gICAgID0gMHhlYTAwMDAwMDsKLQotc3RhdGljIGNvbnN0IGluc24xNiB0MmExX3B1c2hfaW5zbiAgPSAweGI1NDA7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTJfbGRyX2luc24gICA9IDB4NGUwMzsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhM19tb3ZfaW5zbiAgID0gMHg0NmZlOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmE0X2J4X2luc24gICAgPSAweDQ3MzA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTVfcG9wX2luc24gICA9IDB4ZThiZDQwNDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTZfYnhfaW5zbiAgICA9IDB4ZTEyZmZmMWU7Ci0KLS8qIFRPRE86Ci0gICAgIFdlIHNob3VsZCByZWFsbHkgY3JlYXRlIG5ldyBsb2NhbCAoc3RhdGljKSBzeW1ib2xzIGluIGRlc3RpbmF0aW9uCi0gICAgIG9iamVjdCBmb3IgZWFjaCBzdHViIHdlIGNyZWF0ZS4gIFdlIHNob3VsZCBhbHNvIGNyZWF0ZSBsb2NhbAotICAgICAoc3RhdGljKSBzeW1ib2xzIHdpdGhpbiB0aGUgc3R1YnMgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBBUk0gYW5kCi0gICAgIFRodW1iIGNvZGUuICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGRlYnVnZ2VyIGFuZCBkaXNhc3NlbWJsZXIKLSAgICAgY2FuIHByZXNlbnQgYSBiZXR0ZXIgdmlldyBvZiBzdHVicy4KLQotICAgICBXZSBjYW4gdHJlYXQgc3R1YnMgbGlrZSBsaXRlcmFsIHNlY3Rpb25zLCBhbmQgZm9yIHRoZSBUSFVNQjkgb25lcwotICAgICAoc2hvcnQgYWRkcmVzc2luZyByYW5nZSkgd2Ugc2hvdWxkIGJlIGFibGUgdG8gaW5zZXJ0IHRoZSBzdHVicwotICAgICBiZXR3ZWVuIHNlY3Rpb25zLiBpLmUuIHRoZSBzaW1wbGVzdCBhcHByb2FjaCAoc2luY2UgcmVsb2NhdGlvbnMKLSAgICAgYXJlIGRvbmUgb24gYSBzZWN0aW9uIGJhc2lzKSBpcyB0byBkdW1wIHRoZSBzdHVicyBhdCB0aGUgZW5kIG9mCi0gICAgIHByb2Nlc3NpbmcgYSBzZWN0aW9uLiBUaGF0IHdheSB3ZSBjYW4gYWx3YXlzIHRyeSBhbmQgbWluaW1pc2UgdGhlCi0gICAgIG9mZnNldCB0byBhbmQgZnJvbSBhIHN0dWIuIEhvd2V2ZXIsIHRoaXMgZG9lcyBub3QgbWFwIHdlbGwgb250bwotICAgICB0aGUgd2F5IHRoYXQgdGhlIGxpbmtlci9CRkQgZG9lcyBpdHMgd29yazogbWFwcGluZyBhbGwgaW5wdXQKLSAgICAgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zIHZpYSB0aGUgbGlua2VyIHNjcmlwdCBiZWZvcmUgZG9pbmcKLSAgICAgYWxsIHRoZSBwcm9jZXNzaW5nLgotCi0gICAgIFVuZm9ydHVuYXRlbHkgaXQgbWF5IGJlIGVhc2llciB0byBqdXN0IHRvIGRpc2FsbG93IHNob3J0IHJhbmdlCi0gICAgIFRodW1iLT5BUk0gc3R1YnMgKGkuZS4gbm8gY29uZGl0aW9uYWwgaW50ZXItd29ya2luZyBicmFuY2hlcywKLSAgICAgb25seSBicmFuY2gtYW5kLWxpbmsgKEJMKSBjYWxscy4gIFRoaXMgd2lsbCBzaW1wbGlmeSB0aGUgcHJvY2Vzc2luZwotICAgICBzaW5jZSB3ZSBjYW4gdGhlbiBwdXQgYWxsIG9mIHRoZSBzdHVicyBpbnRvIHRoZWlyIG93biBzZWN0aW9uLgotCi0gIFRPRE86Ci0gICAgIE9uIGEgZGlmZmVyZW50IHN1YmplY3QsIHJhdGhlciB0aGFuIGNvbXBsYWluaW5nIHdoZW4gYQotICAgICBicmFuY2ggY2Fubm90IGZpdCBpbiB0aGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIGZvciB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGdlbmVyYXRlIGEgdHJhbXBvbGluZSBzdHViIChuZWVkZWQgdG8KLSAgICAgYWRkcmVzcyB0aGUgY29tcGxldGUgMzJiaXQgYWRkcmVzcyBzcGFjZSkuICAqLwotCi0vKiBUaGUgc3RhbmRhcmQgQ09GRiBiYWNrZW5kIGxpbmtlciBkb2VzIG5vdCBjb3BlIHdpdGggdGhlIHNwZWNpYWwgCi0gICBUaHVtYiBCUkFOQ0gyMyByZWxvY2F0aW9uLiAgVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHNwbGl0IHRoZQotICAgQlJBTkNIMjMgaW50byBzZXBlcmF0ZSBISTIzIGFuZCBMTzIzIHJlbG9jYXRpb25zLiBIb3dldmVyLCBpdCBpcyBhCi0gICBiaXQgc2ltcGxlciBzaW1wbHkgcHJvdmlkaW5nIG91ciBvd24gcmVsb2NhdGlvbiBkcml2ZXIuICovCi0KLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBBUk0vVGh1bWIgQ09GRiBsaW5rZXIuICBOT1RFOgotICAgVGhpcyBjb2RlIGlzIGEgdmVyeSBzbGlnaHRseSBtb2RpZmllZCBjb3B5IG9mCi0gICBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLiAgSXQgd291bGQgYmUgYSBtdWNoIG1vcmUKLSAgIG1haW50YWluYWJsZSBzb2x1dGlvbiB0byBoYXZlIGEgTUFDUk8gdGhhdCBjb3VsZCBiZSBleHBhbmRlZCB3aXRoaW4KLSAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24gdGhhdCB3b3VsZCBvbmx5IGJlIHByb3ZpZGVkIGZvcgotICAgQVJNL1RodW1iIGJ1aWxkcy4gIEl0IGlzIG9ubHkgdGhlIGNvZGUgbWFya2VkIFRIVU1CRVhURU5TSU9OIHRoYXQKLSAgIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gMDsKLSAgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiAgICAgICBzeW07Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgYWRkZW5kOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgICBob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgICByc3RhdDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICBoX3ZhbDsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIENPRkYgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGluIG9uZSBvZiB0d28gd2F5cy4gIEVpdGhlciB0aGUKLSAgICAgICAgIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgb3IgaXQKLSAgICAgICAgIGlzIG5vdC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzaXplIGlzIG5vdCBpbmNsdWRlZCwgYW5kIGZvcmNlCi0gICAgICAgICB0aGUgcnR5cGVfdG9faG93dG8gZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBhZGRlbmQgYXMgbmVlZGVkLiAgKi8KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLQotICAgICAgaG93dG8gPSBjb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmYWRkZW5kKTsKLSAgICAgIGlmIChob3d0byA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIHJlbG9jYXRpb25fc2VjdGlvbiBmdW5jdGlvbiB3aWxsIHNraXAgcGNyZWxfb2Zmc2V0IHJlbG9jcwotICAgICAgICAgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgSG93ZXZlciwgd2Ugd2FudCB0byBjb252ZXJ0Ci0gICAgICAgICBBUk0yNiB0byBBUk0yNkQgcmVsb2NzIGlmIHBvc3NpYmxlLiAgV2UgcmV0dXJuIGEgZmFrZSBob3d0byBpbgotICAgICAgICAgdGhpcyBjYXNlIHdpdGhvdXQgcGNyZWxfb2Zmc2V0IHNldCwgYW5kIGFkanVzdCB0aGUgYWRkZW5kIHRvCi0gICAgICAgICBjb21wZW5zYXRlLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSA9PSBBUk1fMjYKLSAgICAgICAgICAmJiBoICE9IE5VTEwKLSAgICAgICAgICAmJiBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgICAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHN0YXRpYyByZWxvY19ob3d0b190eXBlIGZha2VfYXJtMjZfcmVsb2MgPSAKLQkgICAgSE9XVE8gKEFSTV8yNiwKLSAgICAJICAgICAgIDIsCi0gICAgCSAgICAgICAyLAotICAgIAkgICAgICAgMjQsCi0gICAgCSAgICAgICB0cnVlLAotICAgIAkgICAgICAgMCwKLSAgICAJICAgICAgIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLSAgICAJICAgICAgIGFvdXRhcm1fZml4X3BjcmVsXzI2ICwKLSAgICAJICAgICAgICJBUk1fMjYiLAotICAgIAkgICAgICAgZmFsc2UsCi0gICAgCSAgICAgICAweDAwZmZmZmZmLAotICAgIAkgICAgICAgMHgwMGZmZmZmZiwgCi0gICAgCSAgICAgICBmYWxzZSk7Ci0KLSAgICAgICAgICBhZGRlbmQgLT0gcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotICAgICAgICAgIGhvd3RvID0gJmZha2VfYXJtMjZfcmVsb2M7Ci0gICAgICAgIH0KLQotICAgICAgLyogSWYgd2UgYXJlIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZW4gd2UgY2FuIGp1c3QgaWdub3JlCi0gICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIHRoYXQgaXMgcGNyZWxfb2Zmc2V0LiAgSXQgd2lsbCBhbHJlYWR5Ci0gICAgICAgICBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlLiAgSWYgdGhpcyBpcyBub3QgYSByZWxvY2F0ZWFibGUgbGluaywKLSAgICAgICAgIHRoZW4gd2Ugc2hvdWxkIGlnbm9yZSB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnBjcmVsX29mZnNldCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0gICAgICAgICAgICBhZGRlbmQgKz0gc3ltLT5uX3ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUKLQkJICAgICAtIHNlYy0+dm1hKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0jaWYgMSAvKiBUSFVNQkVYVEVOU0lPTiAqLwotICAgICAgICAgIC8qIFdlIGRvbid0IG91dHB1dCB0aGUgc3R1YnMgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYQotICAgICAgICAgICAgIHJlbG9jYXRhYmxlIG91dHB1dCBmaWxlLCBzaW5jZSB3ZSBtYXkgYXMgd2VsbCBsZWF2ZSB0aGUKLSAgICAgICAgICAgICBzdHViIGdlbmVyYXRpb24gdG8gdGhlIGZpbmFsIGxpbmtlciBwYXNzLiBJZiB3ZSBmYWlsIHRvCi0JICAgICB2ZXJpZnkgdGhhdCB0aGUgbmFtZSBpcyBkZWZpbmVkLCB3ZSdsbCB0cnkgdG8gYnVpbGQgc3R1YnMKLQkgICAgIGZvciBhbiB1bmRlZmluZWQgbmFtZS4uLiAqLwotICAgICAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgICAgICYmICggICBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgICAgICAgICB7Ci0JICAgICAgYXNlY3Rpb24gKiAgIGhfc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lICA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgCi0JICAgICAgLyogaCBsb2NhdGVzIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBpbiB0aGUgcmVsb2MuICAqLwotCSAgICAgIGhfdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgaF9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaF9zZWMtPm91dHB1dF9vZmZzZXQpOwotCi0gICAgICAgICAgICAgIGlmIChob3d0by0+dHlwZSA9PSBBUk1fMjYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCAgIGgtPmNsYXNzID09IENfVEhVTUJTVEFURlVOQwotCQkgICAgICB8fCBoLT5jbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKLQkJICAgIHsKLQkJICAgICAgLyogQXJtIGNvZGUgY2FsbGluZyBhIFRodW1iIGZ1bmN0aW9uICovCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgICAgICAgICAgICB0bXA7Ci0JCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vZmZzZXQ7Ci0JCSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgICAgICBzOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X29mZnNldDsKLQkJICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgIG15aDsgCi0JCSAgICAgIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCQkgICAgICAKLQkJICAgICAgbXloID0gZmluZF9hcm1fZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLQkJICAgICAgaWYgKG15aCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCSAgICAgIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotCQkgICAgICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQkJCQotCQkgICAgICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIAotCQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCAKLQkJCQkJCSAgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCi0JCSAgICAgIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKLQkJCXsKLQkJCSAgaWYgKGhfc2VjLT5vd25lciAhPSBOVUxMCi0JCQkgICAgICAmJiBJTlRFUldPUktfU0VUIChoX3NlYy0+b3duZXIpCi0JCQkgICAgICAmJiAhIElOVEVSV09SS19GTEFHIChoX3NlYy0+b3duZXIpKQotCQkJICAgIHsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChoX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IGFybSBjYWxsIHRvIHRodW1iIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJICAgIH0KLQotCQkJICAtLW15X29mZnNldDsKLQkJCSAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0JCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDFfbGRyX2luc24sCi0JCQkJICAgICAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCQkJICAKLQkJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0Ml9ieF9yMTJfaW5zbiwKLQkJCQkgICAgICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDQpOwotCQkJICAKLQkJCSAgLyogSXQncyBhIHRodW1iIGFkZHJlc3MuICBBZGQgdGhlIGxvdyBvcmRlciBiaXQuICAqLwotCQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBoX3ZhbCB8IGEydDNfZnVuY19hZGRyX2luc24sCi0JCQkJICAgICAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vZmZzZXQgKyA4KTsKLQotCQkJfQotCi0JCSAgICAgIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLQotCQkgICAgICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJCS0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkJICAgICAgCi0JCSAgICAgIHRtcCA9IHRtcCAmIDB4RkYwMDAwMDA7Ci0KLQkJICAgICAgLyogU29tZWhvdyB0aGVzZSBhcmUgYm90aCA0IHRvbyBmYXIsIHNvIHN1YnRyYWN0IDguICovCi0JCSAgICAgIHJldF9vZmZzZXQgPQotCQkJcy0+b3V0cHV0X29mZnNldAotCQkJKyBteV9vZmZzZXQgCi0JCQkrIHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCS0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSAKLQkJCSAgICsgcmVsLT5yX3ZhZGRyKQotCQkJLSA4OwotCi0JCSAgICAgIHRtcCA9IHRtcCB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpOwotCQkgICAgICAKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdG1wLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCSAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgICBkb25lID0gMTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgCi0JICAgICAgLyogTm90ZTogV2UgdXNlZCB0byBjaGVjayBmb3IgQVJNX1RIVU1COSBhbmQgQVJNX1RIVU1CMTIgKi8KLSAgICAgICAgICAgICAgZWxzZSBpZiAoaG93dG8tPnR5cGUgPT0gQVJNX1RIVU1CMjMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCAgIGgtPmNsYXNzID09IENfRVhUIAotCQkgICAgICB8fCBoLT5jbGFzcyA9PSBDX1NUQVQKLQkJICAgICAgfHwgaC0+Y2xhc3MgPT0gQ19MQUJFTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGh1bWIgY29kZSBjYWxsaW5nIGFuIEFSTSBmdW5jdGlvbiAqLwotCQkgICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAwOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29mZnNldDsKLQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnQgICAgICAgICAgICAgICAgICB0bXA7Ci0JCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X29mZnNldDsKLQkJICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgICBteWg7Ci0JCSAgICAgIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiAgZ2xvYmFsczsKLQotCQkgICAgICBteWggPSBmaW5kX3RodW1iX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0JCSAgICAgIGlmIChteWggPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkgICAgICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0JCSAgICAgIAotCQkgICAgICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQkJICAgICAgCi0JCSAgICAgIG15X29mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgICAgCi0JCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIAotCQkJCQkJICAgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQkJICAgICAgCi0JCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPmNvbnRlbnRzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKTsKLQkJICAgICAgCi0JCSAgICAgIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKLQkJCXsKLQkJCSAgaWYgKGhfc2VjLT5vd25lciAhPSBOVUxMCi0JCQkgICAgICAmJiBJTlRFUldPUktfU0VUIChoX3NlYy0+b3duZXIpCi0JCQkgICAgICAmJiAhIElOVEVSV09SS19GTEFHIChoX3NlYy0+b3duZXIpCi0JCQkgICAgICAmJiAhIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUpCi0JCQkgICAgewotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCQkoXygiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGhfc2VjLT5vd25lciksIG5hbWUpOwotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCQkoXygiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogdGh1bWIgY2FsbCB0byBhcm0iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkoXygiICBjb25zaWRlciByZWxpbmtpbmcgd2l0aCAtLXN1cHBvcnQtb2xkLWNvZGUgZW5hYmxlZCIpKTsKLQkJCSAgICB9Ci0JCQkgIAotCQkJICAtLSBteV9vZmZzZXQ7Ci0JCQkgIG15aC0+cm9vdC51LmRlZi52YWx1ZSA9IG15X29mZnNldDsKLQotCQkJICBpZiAoZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSkKLQkJCSAgICB7Ci0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmExX3B1c2hfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0JCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTJfbGRyX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAyKTsKLQotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhM19tb3ZfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDQpOwotCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmE0X2J4X2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA2KTsKLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdDJhNV9wb3BfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDgpOwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0MmE2X2J4X2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAxMik7Ci0JCQkgICAgICAKLQkJCSAgICAgIC8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgbGFzdCB3b3JkIG9mIHRoZSBzdHViLiAgKi8KLQkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGhfdmFsLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIHMsIG15X29mZnNldCArIDE2KTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmExX2J4X3BjX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTJfbm9vcF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMik7Ci0JCSAgICAgIAotCQkJICAgICAgcmV0X29mZnNldCA9Ci0JCQkJKChiZmRfc2lnbmVkX3ZtYSkgaF92YWwpCS8qIEFkZHJlc3Mgb2YgZGVzdGluYXRpb24gb2YgdGhlIHN0dWIgKi8KLQkJCQktICgoYmZkX3NpZ25lZF92bWEpCi0JCQkJICAgKHMtPm91dHB1dF9vZmZzZXQgCQkvKiBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkJCQkgICAgKyBteV9vZmZzZXQJCQkvKiBPZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgc3R1YiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc3R1YnMuICAqLwotCQkJCSAgICArIHMtPm91dHB1dF9zZWN0aW9uLT52bWEpIAkvKiBBZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLQkJCQkgICArIDQJCQkJLyogVGhlIGJyYW5jaCBpbnN0cnVjdGlvbiBpcyA0IGJ5dGVzIGludG8gdGhlIHN0dWIuICAqLwotCQkJCSAgICsgOCk7CQkJLyogQVJNIGJyYW5jaGVzIHdvcmsgZnJvbSB0aGUgcGMgb2YgdGhlIGluc3RydWN0aW9uICsgOC4gICovCi0JCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkJCSAgdDJhM19iX2luc24gfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKSwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDQpOwotCi0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotCi0JCSAgICAgIC8qIE5vdyBnbyBiYWNrIGFuZCBmaXggdXAgdGhlIG9yaWdpbmFsIEJMIGluc24gdG8gcG9pbnQKLQkJCSB0byBoZXJlLiAgKi8KLQkJICAgICAgcmV0X29mZnNldCA9Ci0JCQlzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIG15X29mZnNldAotCQkJLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgKyByZWwtPnJfdmFkZHIpCi0JCQktNDsKLQkJICAgICAgCi0JCSAgICAgIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfdmFkZHIKLQkJCQkJLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkJICBpbnNlcnRfdGh1bWJfYnJhbmNoICh0bXAsIHJldF9vZmZzZXQpLAotCQkJCSAgY29udGVudHMgKyByZWwtPnJfdmFkZHIKLQkJCQkgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkJICAgICAgCi0JCSAgICAgIGRvbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCSAgCi0gICAgICAgICAgLyogSWYgdGhlIHJlbG9jYXRpb24gdHlwZSBhbmQgZGVzdGluYXRpb24gc3ltYm9sIGRvZXMgbm90Ci0gICAgICAgICAgICAgZmFsbCBpbnRvIG9uZSBvZiB0aGUgYWJvdmUgY2F0ZWdvcmllcywgdGhlbiB3ZSBjYW4ganVzdAotICAgICAgICAgICAgIHBlcmZvcm0gYSBkaXJlY3QgbGluay4gKi8KLQotCSAgaWYgKGRvbmUpCi0JICAgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZSAKLSNlbmRpZiAvKiBUSFVNQkVYVEVOU0lPTiAqLwotCSAgICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLQl7Ci0JICAvKiBFbWl0IGEgcmVsb2MgaWYgdGhlIGJhY2tlbmQgdGhpbmtzIGl0IG5lZWRzIGl0LiAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhKG91dHB1dF9iZmQpLT5pbl9yZWxvY19wKG91dHB1dF9iZmQsIGhvd3RvKSkKLSAgICAgICAgICAgIGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyKTsKLQl9Ci0gIAotI2lmIDEgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgIGlmIChkb25lKQotCXJzdGF0ID0gYmZkX3JlbG9jX29rOwotICAgICAgLyogT25seSBwZXJmb3JtIHRoaXMgZml4IGR1cmluZyB0aGUgZmluYWwgbGluaywgbm90IGEgcmVsb2NhdGFibGUgbGluay4gIG5pY2tjQGN5Z251cy5jb20gICovCi0gICAgICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgICAgICAmJiBob3d0by0+dHlwZSA9PSBBUk1fVEhVTUIyMykKLSAgICAgICAgewotICAgICAgICAgIC8qIFRoaXMgaXMgcHJldHR5IG11Y2ggYSBjb3B5IG9mIHdoYXQgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgYW5kIF9iZmRfcmVsb2NhdGVfY29udGVudHMKLSAgICAgICAgICAgICByb3V0aW5lcyBkbyB0byBwZXJmb3JtIGEgcmVsb2NhdGlvbiwgd2l0aCBzcGVjaWFsCi0gICAgICAgICAgICAgcHJvY2Vzc2luZyBmb3IgdGhlIHNwbGl0IGFkZHJlc3Npbmcgb2YgdGhlIFRodW1iIEJMCi0gICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uICBBZ2FpbiwgaXQgd291bGQgcHJvYmFibHkgYmUgc2ltcGxlciBhZGRpbmcgYQotICAgICAgICAgICAgIFRodW1iQlJBTkNIMjMgc3BlY2lmaWMgbWFjcm8gZXhwYW5zaW9uIGludG8gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICBjb2RlLiAgKi8KLQkgIAotICAgICAgICAgIGJmZF92bWEgYWRkcmVzcyA9IHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgIAotICAgICAgICAgIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICByc3RhdCA9IGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmZkX3ZtYSAgICAgICAgIHJlbG9jYXRpb24gICAgICAgPSB2YWwgKyBhZGRlbmQ7Ci0JICAgICAgaW50ICAgICAgICAgICAgIHNpemUgICAgICAgICAgICAgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLQkgICAgICBib29sZWFuICAgICAgICAgb3ZlcmZsb3cgICAgICAgICA9IGZhbHNlOwotCSAgICAgIGJmZF9ieXRlICogICAgICBsb2NhdGlvbiAgICAgICAgID0gY29udGVudHMgKyBhZGRyZXNzOwotCSAgICAgIGJmZF92bWEgICAgICAgICB4ICAgICAgICAgICAgICAgID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIHNyY19tYXNrICAgICAgICAgPSAweDAwN0ZGRkZFOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSAgcmVsb2Nfc2lnbmVkX21pbiA9IH5yZWxvY19zaWduZWRfbWF4OwotCSAgICAgIGJmZF92bWEgICAgICAgICBjaGVjazsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSAgc2lnbmVkX2NoZWNrOwotCSAgICAgIGJmZF92bWEgICAgICAgICBhZGQ7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHNpZ25lZF9hZGQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzaXplID09IDQpOwotCSAgICAgIAotICAgICAgICAgICAgICAvKiBob3d0by0+cGNfcmVsYXRpdmUgc2hvdWxkIGJlIFRSVUUgZm9yIHR5cGUgMTQgQlJBTkNIMjMgKi8KLSAgICAgICAgICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIAotICAgICAgICAgICAgICAvKiBob3d0by0+cGNyZWxfb2Zmc2V0IHNob3VsZCBiZSBUUlVFIGZvciB0eXBlIDE0IEJSQU5DSDIzICovCi0gICAgICAgICAgICAgIHJlbG9jYXRpb24gLT0gYWRkcmVzczsKLQkgICAgICAKLQkgICAgICAvKiBObyBuZWVkIHRvIG5lZ2F0ZSB0aGUgcmVsb2NhdGlvbiB3aXRoIEJSQU5DSDIzLiAqLwotCSAgICAgIC8qIGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQgZm9yIEJSQU5DSDIzLiAgKi8KLQkgICAgICAvKiBob3d0by0+cmlnaHRzaGlmdCA9PSAxICovCi0JICAgICAgLyogRHJvcCB1bndhbnRlZCBiaXRzIGZyb20gdGhlIHZhbHVlIHdlIGFyZSByZWxvY2F0aW5nIHRvLiAgKi8KLQkgICAgICAKLQkgICAgICBjaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0JCQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzaWduZWQgdmFsdWUsIHRoZSByaWdodHNoaWZ0IGp1c3QgZHJvcHBlZAotCQkgbGVhZGluZyAxIGJpdHMgKGFzc3VtaW5nIHR3b3MgY29tcGxlbWVudCkuICAqLwotCSAgICAgIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj0gMCkKLQkJc2lnbmVkX2NoZWNrID0gY2hlY2s7Ci0JICAgICAgZWxzZQotCQlzaWduZWRfY2hlY2sgPSAoY2hlY2sKLQkJCQl8ICgoYmZkX3ZtYSkgLSAxCi0JCQkJICAgJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPnJpZ2h0c2hpZnQpKSk7Ci0JICAgICAgCi0JICAgICAgLyogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gICovCi0JICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCQl7Ci0JCSAgYWRkID0gKCgoeCkgJiAweDA3ZmYwMDAwKSA+PiA0KSB8ICgoKHgpICYgMHg3ZmYpIDw8IDEpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYWRkID0gKCgoKHgpICYgMHg3ZmYpIDw8IDEyKSB8ICgoKHgpICYgMHgwN2ZmMDAwMCkgPj4gMTUpKTsKLQkJfQotCi0JICAgICAgLyogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSB3aXRoIGFuIGFwcHJvcHJpYXRlIHNpZ24uCi0JCSBUaGUgZXhwcmVzc2lvbiBpbnZvbHZpbmcgaG93dG8tPnNyY19tYXNrIGlzb2xhdGVzIHRoZSB1cHBlcgotCQkgYml0IG9mIHNyY19tYXNrLiAgSWYgdGhhdCBiaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSB3ZSBhcmUKLQkJIGFkZGluZywgaXQgaXMgbmVnYXRpdmUsIGFuZCB3ZSBzdWJ0cmFjdCBvdXQgdGhhdCBudW1iZXIgdGltZXMKLQkJIHR3by4gIElmIHNyY19tYXNrIGluY2x1ZGVzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIGJpdCwgdGhlbiB3ZQotCQkgY2FuIG5vdCBnZXQgdGhlIHVwcGVyIGJpdCwgYnV0IHRoYXQgZG9lcyBub3QgbWF0dGVyIHNpbmNlCi0JCSBzaWduZWRfYWRkIG5lZWRzIG5vIGFkanVzdG1lbnQgdG8gYmVjb21lIG5lZ2F0aXZlIGluIHRoYXQKLQkJIGNhc2UuICAqLwotCSAgICAgIAotCSAgICAgIHNpZ25lZF9hZGQgPSBhZGQ7Ci0JICAgICAgCi0JICAgICAgaWYgKChhZGQgJiAoKCh+IHNyY19tYXNrKSA+PiAxKSAmIHNyY19tYXNrKSkgIT0gMCkKLQkJc2lnbmVkX2FkZCAtPSAoKCh+IHNyY19tYXNrKSA+PiAxKSAmIHNyY19tYXNrKSA8PCAxOwotCSAgICAgIAotCSAgICAgIC8qIEFkZCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUsIHNoaWZ0ZWQgc28gdGhhdCBpdCBpcyBhCi0JCSBzdHJhaWdodCBudW1iZXIuICAqLwotCSAgICAgIC8qIGhvd3RvLT5iaXRwb3MgPT0gMCAqLwotCSAgICAgIAotCSAgICAgIHNpZ25lZF9jaGVjayArPSBzaWduZWRfYWRkOwotCSAgICAgIHJlbG9jYXRpb24gKz0gc2lnbmVkX2FkZDsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpOwotCi0JICAgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQkgICAgICBpZiAoICAgc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heAotCQkgIHx8IHNpZ25lZF9jaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICAKLQkgICAgICAvKiBQdXQgUkVMT0NBVElPTiBpbnRvIHRoZSBjb3JyZWN0IGJpdHM6ICAqLwotCSAgICAgIAotCSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoKChyZWxvY2F0aW9uICYgMHhmZmUpID4+IDEpICB8ICgocmVsb2NhdGlvbiA8PCA0KSAmIDB4MDdmZjAwMDApKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoKChyZWxvY2F0aW9uICYgMHhmZmUpIDw8IDE1KSB8ICgocmVsb2NhdGlvbiA+PiAxMikgJiAweDdmZikpOwotCQl9Ci0JICAgICAgCi0JICAgICAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIGNvcnJlY3QgYml0cyBvZiBYOiAgKi8KLQkgICAgICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCByZWxvY2F0aW9uKTsKLQotCSAgICAgIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlOiAgKi8KLQkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLQotCSAgICAgIHJzdGF0ID0gb3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBUSFVNQkVYVEVOU0lPTiAqLwotICAgICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCBhZGRlbmQpOwotI2lmIDEgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgIC8qIEZJWE1FOiAKLQkgSXMgdGhpcyB0aGUgYmVzdCB3YXkgdG8gZml4IHVwIHRodW1iIGFkZHJlc3Nlcz8ga3JrQGN5Z251cy5jb20KLQkgUHJvYmFibHkgbm90LCBidXQgaXQgd29ya3MsIGFuZCBpZiBpdCB3b3JrcyBpdCBkb24ndCBuZWVkIGZpeGluZyEgIG5pY2tjQGN5Z251cy5jb20gKi8KLSAgICAgIC8qIE9ubHkgcGVyZm9ybSB0aGlzIGZpeCBkdXJpbmcgdGhlIGZpbmFsIGxpbmssIG5vdCBhIHJlbG9jYXRhYmxlIGxpbmsuICBuaWNrY0BjeWdudXMuY29tICAqLwotICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAmJiAocmVsLT5yX3R5cGUgPT0gQVJNXzMyIHx8IHJlbC0+cl90eXBlID09IEFSTV9SVkEzMikpCi0JewotCSAgLyogRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gc2V0IHRoZSBib3R0b20gYml0IG9mIGEgcmVsb2NhdGVkIGFkZHJlc3MKLQkgICAgIGJlY2F1c2UgdGhlIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgYSBUaHVtYiBjb2RlIHN5bWJvbC4gICovCi0JICAgICAKLQkgIGludCBwYXRjaGl0ID0gZmFsc2U7Ci0JICAKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiAoICAgaC0+Y2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCi0JCSAgfHwgaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpKQotCSAgICB7Ci0JICAgICAgcGF0Y2hpdCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN5bSAhPSBOVUxMCi0JCSAgICYmIHN5bS0+bl9zY251bSA+IE5fVU5ERUYpCi0JICAgIHsKLQkgICAgICAvKiBObyBoYXNoIGVudHJ5IC0gdXNlIHRoZSBzeW1ib2wgaW5zdGVhZC4gICovCi0KLQkgICAgICBpZiAoICAgc3ltLT5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMKLQkJICB8fCBzeW0tPm5fc2NsYXNzID09IENfVEhVTUJFWFRGVU5DKQotCQlwYXRjaGl0ID0gdHJ1ZTsKLQkgICAgfQotCi0JICBpZiAocGF0Y2hpdCkKLQkgICAgewotCSAgICAgIGJmZF9ieXRlICogbG9jYXRpb24gPSBjb250ZW50cyArIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgICBiZmRfdm1hICAgIHggICAgICAgID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0KLQkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHggfCAxLCBsb2NhdGlvbik7Ci0JICAgIH0KLQl9Ci0jZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8gICAgICAKLSAgICAgIAotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIsCi0JICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotYm9vbGVhbgotYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKGluZm8pIAotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgICAgICBzOwotICBiZmRfYnl0ZSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9vOwotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLSNpZiAwCi0gIHN0YXRpYyBjaGFyICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NoYXIgPSAnMSc7Ci0jZW5kaWYKLQotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIAotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0jaWYgMAotICAgICAgbWVtc2V0IChmb28sIHRlc3RfY2hhciwgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICBpZiAoZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIAotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLSNpZiAwCi0gICAgICBtZW1zZXQgKGZvbywgdGVzdF9jaGFyLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotI2VuZGlmCi0gICAgICAKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICAgaW5mbzsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICByZWdpc3RlciBhc2VjdGlvbiAqICAgICAgICAgICAgICAgczsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgbXloOwotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLQkgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotICAKLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsgLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIC8qIFRoZSBvbmx5IHRyaWNrIGhlcmUgaXMgdXNpbmcgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSBhcyB0aGUgdmFsdWUuIEV2ZW4KLSAgICAgdGhvdWdoIHRoZSBzZWN0aW9uIGlzbid0IGFsbG9jYXRlZCB5ZXQsIHRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBiZSBwdXR0aW5nCi0gICAgIGl0LiAgKi8KLQotICBiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkJQlNGX0dMT0JBTCwgCi0JCQkJcywgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArIDEsCi0JCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAotCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOwotICAKLSAgZnJlZSAodG1wX25hbWUpOwotICAKLSAgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArPSBBUk0yVEhVTUJfR0xVRV9TSVpFOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICAgaW5mbzsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzOwotICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgIG15aDsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqICBnbG9iYWxzOwotCi0gIAotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLSAgICAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIAotICBpZiAobXloICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAodG1wX25hbWUpOwotICAgICAgcmV0dXJuOyAvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KLSAgICB9Ci0KLSAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCUJTRl9HTE9CQUwsIHMsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSArIDEsCi0JCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAotCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOwotICAKLSAgLyogSWYgd2UgbWFyayBpdCAndGh1bWInLCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgZG8gYSBiZXR0ZXIgam9iLiAgKi8KLSAgbXloLT5jbGFzcyA9IENfVEhVTUJFWFRGVU5DOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICAvKiBBbGxvY2F0ZSBhbm90aGVyIHN5bWJvbCB0byBtYXJrIHdoZXJlIHdlIHN3aXRjaCB0byBhcm0gbW9kZS4gICovCi0gICAgICAKLSNkZWZpbmUgQ0hBTkdFX1RPX0FSTSAiX18lc19jaGFuZ2VfdG9fYXJtIgotI2RlZmluZSBCQUNLX0ZST01fQVJNICJfXyVzX2JhY2tfZnJvbV9hcm0iCi0gIAotICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKENIQU5HRV9UT19BUk0pICsgMSk7Ci0gIAotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0gIAotICBzcHJpbnRmICh0bXBfbmFtZSwgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA/IEJBQ0tfRlJPTV9BUk0gOiBDSEFOR0VfVE9fQVJNLCBuYW1lKTsKLQotICBteWggPSBOVUxMOwotICAKLSAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCUJTRl9MT0NBTCwgcywgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplCi0JCQkJKyAoZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA/IDggOiA0KSwKLQkJCQlOVUxMLCB0cnVlLCBmYWxzZSwgCi0JCQkJKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmIG15aCk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOyAgCi0gIAotICBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgKz0gVEhVTUIyQVJNX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLS8qIFNlbGVjdCBhIEJGRCB0byBiZSB1c2VkIHRvIGhvbGQgdGhlIHNlY3Rpb25zIHVzZWQgYnkgdGhlIGdsdWUgY29kZS4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGxpbmtlciBzY3JpcHRzIGluIGxkL2VtdWx0ZW1wbC8KLSAgIHthcm1jb2ZmL3BlfS5lbSAgKi8KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1ib29sZWFuCi1iZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICogCQkgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLSAgZmxhZ3dvcmQgICAJCQkgICAgZmxhZ3M7Ci0gIGFzZWN0aW9uICogCQkJICAgIHNlYzsKLSAgICAKLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIGdldHRpbmcgYSBiZmQgdG8gaG9sZCB0aGUgZ2x1ZS4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gIAotICBpZiAoc2VjID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLSAgICAgIAotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgICAgIAotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzZWMgPT0gTlVMTCkgCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotICAgICAgCi0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotICAgICAgCi0gICAgICBpZiAoc2VjID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIAotICAvKiBTYXZlIHRoZSBiZmQgZm9yIGxhdGVyIHVzZS4gICovCi0gIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotYm9vbGVhbgotYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChhYmZkLCBpbmZvLCBzdXBwb3J0X29sZF9jb2RlKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICBpbmZvOwotICAgICBpbnQJCSAgICAgc3VwcG9ydF9vbGRfY29kZTsKLXsKLSAgYXNlY3Rpb24gKiBzZWM7Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIC8qIElmIHdlIGFyZSBvbmx5IHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsgZG8gbm90IGJvdGhlcgotICAgICB0byBjb25zdHJ1Y3QgYW55IGdsdWUuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgLyogSGVyZSB3ZSBoYXZlIGEgYmZkIHRoYXQgaXMgdG8gYmUgaW5jbHVkZWQgb24gdGhlIGxpbmsuICBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gICovCi0KLSAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKTsKLQotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlID0gc3VwcG9ydF9vbGRfY29kZTsKLSAgCi0gIC8qIFJ1bW1hZ2UgYXJvdW5kIGFsbCB0aGUgcmVsb2NzIGFuZCBtYXAgdGhlIGdsdWUgdmVjdG9ycy4gICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKDsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiBpOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsOwotCi0gICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKSAKLQljb250aW51ZTsKLQotICAgICAgLyogTG9hZCB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIC8qIEZJWE1FOiB0aGVyZSBtYXkgYmUgYSBzdG9yYWdlIGxlYWsgaGVyZS4gKi8KLSAgICAgIAotICAgICAgaSA9IF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgc2VjLCAxLCAwLCAwLCAwKTsKLSAgICAKLSAgICAgIEJGRF9BU1NFUlQgKGkgIT0gMCk7Ci0KLSAgICAgIGZvciAocmVsID0gaTsgcmVsIDwgaSArIHNlYy0+cmVsb2NfY291bnQ7ICsrcmVsKSAKLQl7Ci0JICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgcl90eXBlICA9IHJlbC0+cl90eXBlOwotCSAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICBoOwotCi0JICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBub3QgYWdhaW5zdCBhIHN5bWJvbCBpdCBjYW5ub3QgY29uY2VybiB1cy4gKi8KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIGNvbnRpbnVlOwotCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltbmR4XTsKLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBhIHN0YXRpYyBzeW1ib2wgaXQgbXVzdCBiZSB3aXRoaW4KLQkgICAgIHRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHNvIGNhbm5vdCBiZSBhIGNyb3NzIEFSTS9UaHVtYiByZWxvY2F0aW9uLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIEFSTV8yNjoKLQkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSBhcm0gY29kZS4gIFdlIG5lZWQgdG8gbG9vayB1cAotCQkgdGhlIHRhcmdldCBvZiB0aGUgY2FsbC4gSWYgaXQgaXMgYSB0aHVtYiB0YXJnZXQsIHdlCi0JCSBpbnNlcnQgZ2x1ZS4gICovCi0JICAgICAgCi0JICAgICAgaWYgKGgtPmNsYXNzID09IENfVEhVTUJFWFRGVU5DKQotCQlyZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGluZm8sIGgpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSTV9USFVNQjIzOgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIHRodW1iIGNvZGUuICBXZSB1c2VkIHRvIGxvb2sKLQkJIGZvciBBUk1fVEhVTUI5IGFuZCBBUk1fVEhVTUIxMiBhcyB3ZWxsLiAgV2UgbmVlZCB0byBsb29rCi0JCSB1cCB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBhbiBhcm0gdGFyZ2V0LCB3ZQotCQkgaW5zZXJ0IGdsdWUuICBJZiB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0IGl0IHdpbGwgYmUKLQkJIGdpdmVuIGEgY2xhc3Mgb2YgQ19FWFQgYW5kIHNvIHdlIHdpbGwgZ2VuZXJhdGUgYSBzdHViCi0JCSBmb3IgaXQuICBUaGlzIGlzIG5vdCByZWFsbHkgYSBwcm9ibGVtLCBzaW5jZSB0aGUgbGluawotCQkgaXMgZG9vbWVkIGFueXdheS4gICovCi0KLQkgICAgICBzd2l0Y2ggKGgtPmNsYXNzKQotCQl7Ci0JCWNhc2UgQ19FWFQ6Ci0JCWNhc2UgQ19TVEFUOgotCQljYXNlIENfTEFCRUw6Ci0JCSAgcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChpbmZvLCBoKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgCQljb2ZmX2FybV9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gCQkJY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIAkJY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHgJCQljb2ZmX2FybV9hZGp1c3Rfc3ltbmR4Ci0jZGVmaW5lIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIAkJY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuCi0jZGVmaW5lIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0CQljb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQkJY29mZl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCQljb2ZmX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzICAgICAgICAgICAgICBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAgICAgICAgICBjb2ZmX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQkJY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0KLS8qIFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2Ugd2FudCB0byBjb252ZXJ0IEFSTTI2IHJlbG9jcwotICAgaW50byBBUk0yNkQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX2FkanVzdF9zeW1uZHggKG9iZmQsIGluZm8sIGliZmQsIHNlYywgaXJlbCwgYWRqdXN0ZWRwKQotICAgICBiZmQgKm9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwOwotewotICBpZiAoaXJlbC0+cl90eXBlID09IDMpCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaWJmZClbaXJlbC0+cl9zeW1uZHhdOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBzZWMtPm91dHB1dF9zZWN0aW9uKQotCWlyZWwtPnJfdHlwZSA9IDc7Ci0gICAgfQotICAqYWRqdXN0ZWRwID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsZWQgd2hlbiBtZXJnaW5nIHRoZSBwcml2YXRlIGRhdGEgYXJlYXMgb2YgdHdvIEJGRHMuCi0gICBUaGlzIGlzIGltcG9ydGFudCBhcyBpdCBhbGxvd3MgdXMgdG8gZGV0ZWN0IGlmIHdlIGFyZQotICAgYXR0ZW1wdGluZyB0byBtZXJnZSBiaW5hcmllcyBjb21waWxlZCBmb3IgZGlmZmVyZW50IEFSTQotICAgdGFyZ2V0cywgZWcgZGlmZmVyZW50IENQVXMgb3IgZGlmZmVyZW50cyBBUENTJ3MuICAgICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogICBpYmZkOwotICAgICBiZmQgKiAgIG9iZmQ7Ci17Ci0gIEJGRF9BU1NFUlQgKGliZmQgIT0gTlVMTCAmJiBvYmZkICE9IE5VTEwpOwotCi0gIGlmIChpYmZkID09IG9iZmQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhlIHR3byBmb3JtYXRzIGFyZSBkaWZmZXJlbnQgd2UgY2Fubm90IG1lcmdlIGFueXRoaW5nLgotICAgICBUaGlzIGlzIG5vdCBhbiBlcnJvciwgc2luY2UgaXQgaXMgcGVybWlzc2FibGUgdG8gY2hhbmdlIHRoZQotICAgICBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMuICAqLwotICBpZiAoICAgaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBWZXJpZnkgdGhhdCB0aGUgQVBDUyBpcyB0aGUgc2FtZSBmb3IgdGhlIHR3byBCRkRzICovCi0gIGlmIChBUENTX1NFVCAoaWJmZCkpCi0gICAgewotICAgICAgaWYgKEFQQ1NfU0VUIChvYmZkKSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IEFQQ1MgZmxhZyBiaXRzIHNldCwgZmFpbC4gICovCi0JICBpZiAoQVBDU18yNl9GTEFHIChvYmZkKSAhPSBBUENTXzI2X0ZMQUcgKGliZmQpKQotCSAgICB7Ci0JICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQkoXygiJXM6IEVSUk9SOiBjb21waWxlZCBmb3IgQVBDUy0lZCB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIEFQQ1MtJWQiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCBBUENTXzI2X0ZMQUcgKGliZmQpID8gMjYgOiAzMiwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBBUENTXzI2X0ZMQUcgKG9iZmQpID8gMjYgOiAzMgotCQkgKTsKLQotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBpZiAoQVBDU19GTE9BVF9GTEFHIChvYmZkKSAhPSBBUENTX0ZMT0FUX0ZMQUcgKGliZmQpKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbXNnOwotCi0JICAgICAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAoaWJmZCkpCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCIlczogRVJST1I6IHBhc3NlcyBmbG9hdHMgaW4gZmxvYXQgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgaW50ZWdlciByZWdpc3RlcnMiKTsKLQkgICAgICBlbHNlCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCIlczogRVJST1I6IHBhc3NlcyBmbG9hdHMgaW4gaW50ZWdlciByZWdpc3RlcnMgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBmbG9hdCByZWdpc3RlcnMiKTsKLQkgICAgICAKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIAotCSAgaWYgKFBJQ19GTEFHIChvYmZkKSAhPSBQSUNfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICogbXNnOwotCi0JICAgICAgaWYgKFBJQ19GTEFHIChpYmZkKSkKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgYWJzb2x1dGUgcG9zaXRpb24iKTsKLQkgICAgICBlbHNlCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCIlczogRVJST1I6IGNvbXBpbGVkIGFzIGFic29sdXRlIHBvc2l0aW9uIGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzIHBvc2l0aW9uIGluZGVwZW5kZW50Iik7Ci0JICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFNFVF9BUENTX0ZMQUdTIChvYmZkLCBBUENTXzI2X0ZMQUcgKGliZmQpIHwgQVBDU19GTE9BVF9GTEFHIChpYmZkKSB8IFBJQ19GTEFHIChpYmZkKSk7Ci0JICAKLQkgIC8qIFNldCB1cCB0aGUgYXJjaCBhbmQgZmllbGRzIGFzIHdlbGwgYXMgdGhlc2UgYXJlIHByb2JhYmx5IHdyb25nLiAgKi8KLQkgIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLCBiZmRfZ2V0X21hY2ggKGliZmQpKTsKLQl9Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoZSBpbnRlcndvcmtpbmcgc3VwcG9ydC4gICovCi0gIGlmIChJTlRFUldPUktfU0VUIChpYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoSU5URVJXT1JLX1NFVCAob2JmZCkpCi0JewotCSAgLyogSWYgdGhlIHNyYyBhbmQgZGVzdCBkaWZmZXIgaW4gdGhlaXIgaW50ZXJ3b3JraW5nIGlzc3VlIGEgd2FybmluZy4gICovCi0JICBpZiAoSU5URVJXT1JLX0ZMQUcgKG9iZmQpICE9IElOVEVSV09SS19GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKiBtc2c7Ci0KLQkgICAgICBpZiAoSU5URVJXT1JLX0ZMQUcgKGliZmQpKQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiV2FybmluZzogaW5wdXQgZmlsZSAlcyBzdXBwb3J0cyBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcyBub3QuIik7Ci0JICAgICAgZWxzZQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiV2FybmluZzogaW5wdXQgZmlsZSAlcyBkb2VzIG5vdCBzdXBwb3J0IGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzLiIpOwotCSAgICAgIAotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTRVRfSU5URVJXT1JLX0ZMQUcgKG9iZmQsIElOVEVSV09SS19GTEFHIChpYmZkKSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgUFRSICAgICBwdHI7Ci17Ci0gIEZJTEUgKiBmaWxlID0gKEZJTEUgKikgcHRyOwotICAKLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLSAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oInByaXZhdGUgZmxhZ3MgPSAleDoiKSwgY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MpOwotICAKLSAgaWYgKEFQQ1NfU0VUIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDogQVBDUyBpcyBBUk0gUHJvZGVjdXJlIENhbGwgU3RhbmRhcmQsIGl0IHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gICovCi0gICAgICBmcHJpbnRmIChmaWxlLCAiIFtBUENTLSVkXSIsIEFQQ1NfMjZfRkxBRyAoYWJmZCkgPyAyNiA6IDMyKTsKLQotICAgICAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAoYWJmZCkpCi0JZnByaW50ZiAoZmlsZSwgXygiIFtmbG9hdHMgcGFzc2VkIGluIGZsb2F0IHJlZ2lzdGVyc10iKSk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZmlsZSwgXygiIFtmbG9hdHMgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzXSIpKTsKLQotICAgICAgaWYgKFBJQ19GTEFHIChhYmZkKSkKLQlmcHJpbnRmIChmaWxlLCBfKCIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIpKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChmaWxlLCBfKCIgW2Fic29sdXRlIHBvc2l0aW9uXSIpKTsKLSAgICB9Ci0gIAotICBpZiAoISBJTlRFUldPUktfU0VUIChhYmZkKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfKCIgW2ludGVyd29ya2luZyBmbGFnIG5vdCBpbml0aWFsaXNlZF0iKSk7Ci0gIGVsc2UgaWYgKElOVEVSV09SS19GTEFHIChhYmZkKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfKCIgW2ludGVyd29ya2luZyBzdXBwb3J0ZWRdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXygiIFtpbnRlcndvcmtpbmcgbm90IHN1cHBvcnRlZF0iKSk7Ci0gIAotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDb3BpZXMgdGhlIGdpdmVuIGZsYWdzIGludG8gdGhlIGNvZmZfdGRhdGEuZmxhZ3MgZmllbGQuCi0gICBUeXBpY2FsbHkgdGhlc2UgZmxhZ3MgY29tZSBmcm9tIHRoZSBmX2ZsYWdzW10gZmllbGQgb2YKLSAgIHRoZSBDT0ZGIGZpbGVoZHIgc3RydWN0dXJlLCB3aGljaCBjb250YWlucyBpbXBvcnRhbnQsCi0gICB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0gICBOb3RlOiBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIHN0YXRpYywgaXQgaXMgZXhwbGljaXRseQotICAgY2FsbGVkIGZyb20gYm90aCBjb2ZmY29kZS5oIGFuZCBwZWljb2RlLmguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0JYmZkICoJICAgYWJmZDsKLQlmbGFnd29yZCAgIGZsYWdzOwotewotICBmbGFnd29yZCBmbGFnOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCk7Ci0KLSAgZmxhZyA9IChmbGFncyAmIEZfQVBDUzI2KSA/IEZfQVBDU18yNiA6IDA7Ci0gIAotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgQVBDUyBmaWVsZCBoYXMgbm90IGJlZW4gaW5pdGlhbGlzZWQgdG8gdGhlIG9wcG9zaXRlCi0gICAgIHZhbHVlLiAgKi8KLSAgaWYgKEFQQ1NfU0VUIChhYmZkKQotICAgICAgJiYgKCAgIChBUENTXzI2X0ZMQUcgICAgKGFiZmQpICE9IGZsYWcpCi0JICB8fCAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSAhPSAoZmxhZ3MgJiBGX0FQQ1NfRkxPQVQpKQotCSAgfHwgKFBJQ19GTEFHICAgICAgICAoYWJmZCkgIT0gKGZsYWdzICYgRl9QSUMpKQotCSAgKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZyB8PSAoZmxhZ3MgJiAoRl9BUENTX0ZMT0FUIHwgRl9QSUMpKTsKLSAgCi0gIFNFVF9BUENTX0ZMQUdTIChhYmZkLCBmbGFnKTsKLQotICBmbGFnID0gKGZsYWdzICYgRl9JTlRFUldPUkspOwotICAKLSAgLyogSWYgdGhlIEJGRCBoYXMgYWxyZWFkeSBoYWQgaXRzIGludGVyd29ya2luZyBmbGFnIHNldCwgYnV0IGl0Ci0gICAgIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSB0aGF0IHdlIGhhdmUgYmVlbiBhc2tlZCB0byBzZXQsCi0gICAgIHRoZW4gYXNzdW1lIHRoYXQgdGhhdCBtZXJnZWQgY29kZSB3aWxsIG5vdCBzdXBwb3J0IGludGVyd29ya2luZwotICAgICBhbmQgc2V0IHRoZSBmbGFnIGFjY29yZGluZ2x5LiAgKi8KLSAgaWYgKElOVEVSV09SS19TRVQgKGFiZmQpICYmIChJTlRFUldPUktfRkxBRyAoYWJmZCkgIT0gZmxhZykpCi0gICAgewotICAgICAgaWYgKGZsYWcpCi0JLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfKCJXYXJuaW5nOiBOb3Qgc2V0dGluZyBpbnRlcndvcmtpbmcgZmxhZyBvZiAlcywgc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGVsc2UKLQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIldhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmtpbmcgZmxhZyBvZiAlcyBkdWUgdG8gb3V0c2lkZSByZXF1ZXN0IiksCi0JCQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZmxhZyA9IDA7Ci0gICAgfQotCi0gIFNFVF9JTlRFUldPUktfRkxBRyAoYWJmZCwgZmxhZyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ29weSB0aGUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSB0YXJnZXQgc3BlY2lmaWMgZGF0YQotICAgZnJvbSBvbmUgaW5zdGFuY2Ugb2YgYSBCRkQgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKHNyYywgZGVzdCkKLSAgICAgYmZkICogIHNyYzsKLSAgICAgYmZkICogIGRlc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKHNyYyAhPSBOVUxMICYmIGRlc3QgIT0gTlVMTCk7Ci0gCi0gIGlmIChzcmMgPT0gZGVzdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGUgZGVzdGluYXRpb24gaXMgbm90IGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgc291cmNlLCBkbyBub3QgZG8KLSAgICAgdGhlIGNvcHkuICAqLwotICBpZiAoc3JjLT54dmVjICE9IGRlc3QtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogY29weSB0aGUgZmxhZ3MgZmllbGQgKi8KLSAgaWYgKEFQQ1NfU0VUIChzcmMpKQotICAgIHsKLSAgICAgIGlmIChBUENTX1NFVCAoZGVzdCkpCi0JewotCSAgLyogSWYgdGhlIHNyYyBhbmQgZGVzdCBoYXZlIGRpZmZlcmVudCBBUENTIGZsYWcgYml0cyBzZXQsIGZhaWwuICAqLwotCSAgaWYgKEFQQ1NfMjZfRkxBRyAoZGVzdCkgIT0gQVBDU18yNl9GTEFHIChzcmMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAKLQkgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGRlc3QpICE9IEFQQ1NfRkxPQVRfRkxBRyAoc3JjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgCi0JICBpZiAoUElDX0ZMQUcgKGRlc3QpICE9IFBJQ19GTEFHIChzcmMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCVNFVF9BUENTX0ZMQUdTIChkZXN0LCBBUENTXzI2X0ZMQUcgKHNyYykgfCBBUENTX0ZMT0FUX0ZMQUcgKHNyYykKLQkJCXwgUElDX0ZMQUcgKHNyYykpOwotICAgIH0KLQotICBpZiAoSU5URVJXT1JLX1NFVCAoc3JjKSkKLSAgICB7Ci0gICAgICBpZiAoSU5URVJXT1JLX1NFVCAoZGVzdCkpCi0JewotCSAgLyogSWYgdGhlIHNyYyBhbmQgZGVzdCBoYXZlIGRpZmZlcmVudCBpbnRlcndvcmtpbmcgZmxhZ3MgdGhlbiB0dXJuCi0JICAgICBvZmYgdGhlIGludGVyd29ya2luZyBiaXQuICAqLwotCSAgaWYgKElOVEVSV09SS19GTEFHIChkZXN0KSAhPSBJTlRFUldPUktfRkxBRyAoc3JjKSkKLQkgICAgewotCSAgICAgIGlmIChJTlRFUldPUktfRkxBRyAoZGVzdCkpCi0JCXsKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoKCJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JraW5nIGJpdCBvZiAlcywgYmVjYXVzZSB0aGUgbm9uLWludGVyd29ya2luZyBjb2RlIGluICVzIGhhcyBiZWVuIGNvcGllZCBpbnRvIGl0IiksCi0JCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoZGVzdCksCi0JCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoc3JjKSk7Ci0JCX0KLQkgICAgICAKLQkgICAgICBTRVRfSU5URVJXT1JLX0ZMQUcgKGRlc3QsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFNFVF9JTlRFUldPUktfRkxBRyAoZGVzdCwgSU5URVJXT1JLX0ZMQUcgKHNyYykpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE5vdGU6ICB0aGUgZGVmaW5pdGlvbnMgaGVyZSBvZiBMT0NBTF9MQUJFTF9QUkVGSVggYW5kIFVTRVJfTEFCRUxfUFJFSUZYCi0gKm11c3QqIG1hdGNoIHRoZSBkZWZpbml0aW9ucyBpbiBnY2MvY29uZmlnL2FybS9jb2ZmLmggYW5kIHNlbWkuaCAqLwotI2RlZmluZSBMT0NBTF9MQUJFTF9QUkVGSVggIi4iCi0jaWZuZGVmIFVTRVJfTEFCRUxfUFJFRklYCi0jZGVmaW5lIFVTRVJfTEFCRUxfUFJFRklYICJfIgotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiAgICAgICAgYWJmZDsKLSAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci17Ci0jaWZkZWYgTE9DQUxfTEFCRUxfUFJFRklYCi0gIC8qIElmIHRoZXJlIGlzIGEgcHJlZml4IGZvciBsb2NhbCBsYWJlbHMgdGhlbiBsb29rIGZvciB0aGlzLgotICAgICBJZiB0aGUgcHJlZml4IGV4aXN0cywgYnV0IGl0IGlzIGVtcHR5LCB0aGVuIGlnbm9yZSB0aGUgdGVzdC4gKi8KLSAgCi0gIGlmIChMT0NBTF9MQUJFTF9QUkVGSVhbMF0gIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgTE9DQUxfTEFCRUxfUFJFRklYLCBzdHJsZW4gKExPQ0FMX0xBQkVMX1BSRUZJWCkpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgVVNFUl9MQUJFTF9QUkVGSVgKLSAgaWYgKFVTRVJfTEFCRUxfUFJFRklYWzBdICE9IDApCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIFVTRVJfTEFCRUxfUFJFRklYLCBzdHJsZW4gKFVTRVJfTEFCRUxfUFJFRklYKSkgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0gIAotICAvKiBkZXZvL2djYy9jb25maWcvZGJ4Y29mZi5oIGRlZmluZXMgQVNNX09VVFBVVF9TT1VSQ0VfTElORSB0byBnZW5lcmF0ZQotICAgICBsb2NhbCBsaW5lIG51bWJlcnMgYXMgLkxNPG51bWJlcj4sIHNvIHRyZWF0IHRoZXNlIGFzIGxvY2FsLiAgKi8KLSAgCi0gIHN3aXRjaCAobmFtZVswXSkKLSAgICB7Ci0gICAgY2FzZSAnTCc6IHJldHVybiB0cnVlOwotICAgIGNhc2UgJy4nOiByZXR1cm4gKG5hbWVbMV0gPT0gJ0wnICYmIG5hbWVbMl0gPT0gJ00nKSA/IHRydWUgOiBmYWxzZTsKLSAgICBkZWZhdWx0OiAgcmV0dXJuIGZhbHNlOyAgICAgLyogQ2Fubm90IG1ha2Ugb3VyIG1pbmRzIHVwIC0gZGVmYXVsdCB0bwotCQkJCSAgIGZhbHNlIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgc3RyaXBwZWQKLQkJCQkgICBieSBhY2NpZGVudC4gICovIAotICAgIH0KLX0KLQotLyogVGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCi0gICB0aGUgZ2x1ZSBzZWN0aW9uIGlzIHdyaXR0ZW4gbGFzdC4gCi0KLSAgIFRoaXMgZG9lcyBkZXBlbmQgb24gYmZkX21ha2Vfc2VjdGlvbiBhdHRhY2hpbmcgYSBuZXcgc2VjdGlvbiB0byB0aGUKLSAgIGVuZCBvZiB0aGUgc2VjdGlvbiBsaXN0IGZvciB0aGUgYmZkLiAKLQotICAga3JrQGN5Z251cy5jb20gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4gKHN1YiwgaW5mbykKLSAgICAgYmZkICogc3ViOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBpbmZvOwotewotICByZXR1cm4gKHN1Yi0+b3V0cHV0X2hhc19iZWd1bgotCSAgfHwgc3ViID09IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8tPmluZm8pLT5iZmRfb2ZfZ2x1ZV9vd25lcik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvOwotewotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAocGZpbmZvLT5pbmZvKTsKLSAgCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIAotICBpZiAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKHBmaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXItPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWYgMAotI2RlZmluZSBjb2ZmX1NXQVBfc3ltX2luICBhcm1fYmZkX2NvZmZfc3dhcF9zeW1faW4KLQotc3RhdGljIHZvaWQgY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLQotLyogU2VwY2lhbCB2ZXJzaW9uIG9mIHN5bWJvbCBzd2FwcGVyLCB1c2VkIHRvIGdyYWIgYSBiZmQKLSAgIG9udG8gd2hpY2ggdGhlIGdsdWUgc2VjdGlvbnMgY2FuIGJlIGF0dGFjaGVkLiAgKi8KLXN0YXRpYyB2b2lkCi1hcm1fYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSICAgZXh0MTsKLSAgICAgUFRSICAgaW4xOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiBzOwotCi0gIC8qIERvIHRoZSBub3JtYWwgc3dhcCBpbi4gICovCi0gIGNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dDEsIGluMSk7Ci0KLSAgaWYgKGJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpIC8qIHdlIGFscmVhZHkgaGF2ZSBhIHRvYywgc28gZ28gaG9tZSAqLwotICAgIHJldHVybjsKLQotICAvKiBTYXZlIHRoZSBiZmQgZm9yIGxhdGVyIGFsbG9jYXRpb24uICAqLwotICBiZmRfb2ZfZ2x1ZV9vd25lciA9IGFiZmQ7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiZmRfb2ZfZ2x1ZV9vd25lciAsIAotCQkJICAgICAgIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHMgPT0gTlVMTCkgCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIDsKLSAgICAgIAotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChiZmRfb2ZfZ2x1ZV9vd25lciwgcywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYmZkX29mX2dsdWVfb3duZXIsIHMsIDIpKQotCXsKLQkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yICovCi0JICBhYm9ydCgpOwotCX0KLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgOwotICAgICAgCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gICAgICAKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGJmZF9vZl9nbHVlX293bmVyLCBzLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChiZmRfb2ZfZ2x1ZV9vd25lciwgcywgMikpCi0JewotCSAgLyogRklYTUU6IHNldCBhcHByb3ByaWF0ZSBiZmQgZXJyb3Iga3JrQGN5Z251cy5jb20gKi8KLQkgIGFib3J0KCk7Ci0JfQotICAgIH0KLSAgCi0gIHJldHVybjsKLX0KLSNlbmRpZgotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1UQVJHRVRfTElUVExFX1NZTSA9Ci0jZWxzZQotYXJtY29mZl9saXR0bGVfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9MSVRUTEVfTkFNRQotICBUQVJHRVRfTElUVExFX05BTUUsCi0jZWxzZQotICAiY29mZi1hcm0tbGl0dGxlIiwKLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotI2Vsc2UKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1VOREVSU0NPUkUKLSAgVEFSR0VUX1VOREVSU0NPUkUsCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbHNlCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2VuZGlmCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLS8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBjb2ZmX29iamVjdF9wfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpICYgYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUsCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLVRBUkdFVF9CSUdfU1lNID0KLSNlbHNlCi1hcm1jb2ZmX2JpZ192ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX0JJR19OQU1FCi0gIFRBUkdFVF9CSUdfTkFNRSwKLSNlbHNlCi0gICJjb2ZmLWFybS1iaWciLAotI2VuZGlmCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0jZWxzZQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotICBUQVJHRVRfVU5ERVJTQ09SRSwJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2Vsc2UKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZW5kaWYKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIGNvZmZfb2JqZWN0X3B9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgJiBiZmRfY29mZl9zdGRfc3dhcF90YWJsZSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hdXguYyBiL2JmZC9jb2ZmLWF1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY2MzkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWF1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBwbGUgTTY4SyBDT0ZGIEEvVVggMy54IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQltNjhrYXV4X2NvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstYXV4IgotCi0jaWZuZGVmIFRBUkdfQVVYCi0jZGVmaW5lIFRBUkdfQVVYCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLS8qIDRrIHBhZ2VzICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBPbiBBVVgsIGEgU1RZUF9OT0xPQUR8U1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkIGxpYnJhcnkuICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0KLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotc3RhdGljIGJvb2xlYW4gY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCAKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLCAKLSAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotI2RlZmluZSBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCi0KLSNpbmNsdWRlICJjb2ZmL2F1eC1jb2ZmLmgiICAvKiBvdmVycmlkZSBjb2ZmL2ludGVybmFsLmggYW5kIGNvZmYvbTY4ay5oICovCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCi0KLS8qIFdlIG5lZWQgbm9uLWFic29sdXRlIHN5bWJvbHMgdG8gb3ZlcnJpZGUgYWJzb2x1dGUgc3ltYm9scy4gIFRoaXMKLSAgIG1pcnJvcnMgQXBwbGUncyAic29sdXRpb24iIHRvIGxldCBhIHN0YXRpYyBsaWJyYXJ5IHN5bWJvbCBvdmVycmlkZQotICAgYSBzaGFyZWQgbGlicmFyeSBzeW1ib2wuICBPbiB0aGUgd2hvbGUgbm90IGEgZ29vZCB0aGluZywgZ2l2ZW4gaG93Ci0gICBzaGFyZWQgbGlicmFyaWVzIHdvcmsgaGVyZSwgYnV0IGNhbiB3b3JrIGlmIHlvdSBhcmUgY2FyZWZ1bCB3aXRoCi0gICB3aGF0IHlvdSBpbmNsdWRlIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCQkJICAgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoKGZsYWdzICYgKEJTRl9XQVJOSU5HIHwgQlNGX0NPTlNUUlVDVE9SIHwgQlNGX1dFQUspKSA9PSAwICYmCi0gICAgICAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSAmJgotICAgICAgIWJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgewotICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgYSBkZWZpbml0aW9uIG9yIGFuIGluZGlyZWN0IGRlZmluaXRpb24gKi8KLQotICAgICAgLyogVGhpcyBiaXQgY29waWVkIGZyb20gbGlua2VyLmMgKi8KLSAgICAgIGlmIChoYXNocCAhPSBOVUxMICYmICpoYXNocCAhPSBOVUxMKQotCXsKLQkgIGggPSAqaGFzaHA7Ci0JICBCRkRfQVNTRVJUIChzdHJjbXAgKGgtPnJvb3Quc3RyaW5nLCBuYW1lKSA9PSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGhhc2hwICE9IE5VTEwpCi0JCSpoYXNocCA9IE5VTEw7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+bm90aWNlX2hhc2ggIT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMCi0JICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpCi0JewotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPm5vdGljZSkgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGhhc2hwICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkKLQkqaGFzaHAgPSBoOwotICAgICAgLyogZW5kIGR1cGxpY2F0aW9uIGZyb20gbGlua2VyLmMgKi8KLQotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JewotCSAgYXNlY3Rpb24gKm1zZWM7Ci0KLQkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgICAgbXNlYyA9IGgtPnUuZGVmLnNlY3Rpb247Ci0JICBlbHNlCi0JICAgIG1zZWMgPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotCi0JICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChtc2VjKSAmJiAhYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKSkKLQkgICAgewotCSAgICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotCSAgICAgIGgtPnUuZGVmLnZhbHVlID0gdmFsdWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikgJiYgIWJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykpCi0JICAgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGV4aXQgZWFybHksIGZpbmlzaCBwcm9jZXNzaW5nIGluIHRoZSBnZW5lcmljIHJvdXRpbmUgKi8KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLQkJCQkJICAgaGFzaHApOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtZ28zMi5jIGIvYmZkL2NvZmYtZ28zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRhZGIyLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWdvMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IENPRkYgZmlsZXMgKGdvMzIgdmFyaWFudCkuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgREogRGVsb3JpZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JCWdvMzJjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkJImNvZmYtZ28zMiIKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUJJ18nCi0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWg4MzAwLmMgYi9iZmQvY29mZi1oODMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGE0ZWMzLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWg4MzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSGl0YWNoaSBIOC8zMDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL2g4MzAwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCi0KLS8qIFdlIGRlcml2ZSBhIGhhc2ggdGFibGUgZnJvbSB0aGUgYmFzaWMgQkZEIGhhc2ggdGFibGUgdG8KLSAgIGhvbGQgZW50cmllcyBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yLiAgQXNpZGUgZnJvbSB0aGUgCi0gICBpbmZvIHN0b3JlZCBieSB0aGUgYmFzaWMgaGFzaCB0YWJsZSwgd2UgbmVlZCB0aGUgb2Zmc2V0Ci0gICBvZiBhIHBhcnRpY3VsYXIgZW50cnkgd2l0aGluIHRoZSBoYXNoIHRhYmxlIGFzIHdlbGwgYXMKLSAgIHRoZSBvZmZzZXQgd2hlcmUgd2UnbGwgYWRkIHRoZSBuZXh0IGVudHJ5LiAgKi8KLQotc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeQotewotICAvKiBUaGUgYmFzaWMgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSB2ZWN0b3JzIHNlY3Rpb24gd2hlcmUKLSAgICAgdGhpcyBlbnRyeSBsaXZlcy4gICovCi0gIGJmZF92bWEgb2Zmc2V0OwotfTsKLQotc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZQotewotICAvKiBUaGUgYmFzaWMgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotCi0gIGJmZCAqYWJmZDsKLQotICAvKiBPZmZzZXQgYXQgd2hpY2ggd2UnbGwgYWRkIHRoZSBuZXh0IGVudHJ5LiAgKi8KLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZnVuY3ZlY19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWZ1bmN2ZWNfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKiwgYmZkICosCi0gICAgICAgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKSkpKTsKLQotLyogVG8gbG9va3VwIGEgdmFsdWUgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgZnVuY3ZlY19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVGhlIGRlcml2ZWQgaDgzMDAgQ09GRiBsaW5rZXIgdGFibGUuICBOb3RlIGl0J3MgZGVyaXZlZCBmcm9tCi0gICB0aGUgZ2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZSwgbm90IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIGhhc2gKLSAgIHRhYmxlISAgV2UgdXNlIHRoaXMgdG8gYXR0YWNoIGFkZGl0aW9uYWwgZGF0YSBzdHJ1Y3R1cmVzIHdlCi0gICBuZWVkIHdoaWxlIGxpbmtpbmcgb24gdGhlIGg4MzAwLiAgKi8KLXN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogU2VjdGlvbiBmb3IgdGhlIHZlY3RvcnMgdGFibGUuICBUaGlzIGdldHMgYXR0YWNoZWQgdG8gYQotICAgICByYW5kb20gaW5wdXQgYmZkLCB3ZSBrZWVwIGl0IGhlcmUgZm9yIGVhc3kgYWNjZXNzLiAgKi8KLSAgYXNlY3Rpb24gKnZlY3RvcnNfc2VjOwotCi0gIC8qIEhhc2ggdGFibGUgb2YgdGhlIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIGVudGVyIGludG8gdGhlIGZ1bmN0aW9uCi0gICAgIHZlY3Rvci4gICovCi0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKmZ1bmN2ZWNfaGFzaF90YWJsZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdldCB0aGUgSDgvMzAwIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGg4MzAwX2NvZmZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICopICgoY29mZl9oYXNoX3RhYmxlIChwKSkpKQotCi0vKiBJbml0aWFsaXplIGZpZWxkcyB3aXRoaW4gYSBmdW5jdmVjIGhhc2ggdGFibGUgZW50cnkuICBDYWxsZWQgd2hlbmV2ZXIKLSAgIGEgbmV3IGVudHJ5IGlzIGFkZGVkIHRvIHRoZSBmdW5jdmVjIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWZ1bmN2ZWNfaGFzaF9uZXdmdW5jIChlbnRyeSwgZ2VuX3RhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqZ2VuX3RhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKnJldDsKLSAgc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqdGFibGU7Ci0KLSAgcmV0ID0gKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikgZW50cnk7Ci0gIHRhYmxlID0gKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKikgZ2VuX3RhYmxlOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopCi0gICAgICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlIChnZW5fdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKQotICAgICAgICAgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIGdlbl90YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE5vdGUgd2hlcmUgdGhpcyBlbnRyeSB3aWxsIHJlc2lkZSBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIHRhYmxlLiAgKi8KLSAgcmV0LT5vZmZzZXQgPSB0YWJsZS0+b2Zmc2V0OwotCi0gIC8qIEJ1bXAgdGhlIG9mZnNldCBhdCB3aGljaCB3ZSBzdG9yZSBlbnRyaWVzIGluIHRoZSBmdW5jdGlvbgotICAgICB2ZWN0b3IuICBXZSdkIGxpa2UgdG8gYnVtcCB1cCB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9ycyBzZWN0aW9uLAotICAgICBidXQgaXQncyBub3QgZWFzaWx5IGF2YWlsYWJsZSBoZXJlLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwKQotICAgIHRhYmxlLT5vZmZzZXQgKz0gMjsKLSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoICh0YWJsZS0+YWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JICAgfHwgYmZkX2dldF9tYWNoICh0YWJsZS0+YWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotICAgIHRhYmxlLT5vZmZzZXQgKz0gNDsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEV2ZXJ5dGhpbmcgd2VudCBPSy4gICovCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZnVuY3ZlY19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKikpOwotewotICAvKiBJbml0aWFsaXplIG91ciBsb2NhbCBmaWVsZHMsIHRoZW4gY2FsbCB0aGUgZ2VuZXJpYyBpbml0aWFsaXphdGlvbgotICAgICByb3V0aW5lLiAgKi8KLSAgdGFibGUtPm9mZnNldCA9IDA7Ci0gIHRhYmxlLT5hYmZkID0gYWJmZDsKLSAgcmV0dXJuIChiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIG5ld2Z1bmMpKTsKLX0KLQotLyogQ3JlYXRlIHRoZSBkZXJpdmVkIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UgdXNlIGEgZGVyaXZlZCBoYXNoIHRhYmxlCi0gICBiYXNpY2FsbHkgdG8gaG9sZCAic3RhdGljIiBpbmZvcm1hdGlvbiBkdXJpbmcgYW4gaDgvMzAwIGNvZmYgbGluawotICAgd2l0aG91dCB1c2luZyBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLSAgcmV0ID0gKChzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCFfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LnJvb3QsIGFiZmQsIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBvdXIgZGF0YS4gICovCi0gIHJldC0+dmVjdG9yc19zZWMgPSBOVUxMOwotICByZXQtPmZ1bmN2ZWNfaGFzaF90YWJsZSA9IE5VTEw7Ci0KLSAgLyogT0suICBFdmVyeXRoaW5nJ3MgaW50aWFsaXplZCwgcmV0dXJuIHRoZSBiYXNlIHBvaW50ZXIuICAqLwotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBIOC8zMDAgcmVsb2NzLgotICAgV2Ugb25seSBjb21lIGhlcmUgZm9yIHBjcmVsIHN0dWZmIGFuZCByZXR1cm4gbm9ybWFsbHkgaWYgbm90IGFuIC1yIGxpbmsuCi0gICBXaGVuIGRvaW5nIC1yLCB3ZSBjYW4ndCBkbyBhbnkgYXJpdGhtZXRpYyBmb3IgdGhlIHBjcmVsIHN0dWZmLCBiZWNhdXNlCi0gICB0aGUgY29kZSBpbiByZWxvYy5jIGFzc3VtZXMgdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgdGFyZ2V0cyBvZgotICAgdGhlIHBjcmVsIGJyYW5jaGVzLiAgVGhpcyBpc24ndCBzbywgc2luY2UgdGhlIEg4LzMwMCBjYW4gZG8gcmVsYXhpbmcsIAotICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZ2FwIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGVub3VnaCB0bwotICAgY29udGFpbiB0aGUgb2Zmc2V0IHJlcXVpcmVkIGZvciB0aGUgYnJhbmNoLCBzbyB3ZSBoYXZlIHRvIHVzZSB0aGUgb25seQotICAgdGhlIGFkZGVuZCB1bnRpbCB0aGUgZmluYWwgbGluayAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGVjaWFsIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9SRUxCWVRFLCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICI4IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMV09SRCwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMTE9ORywgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUENSQllURSwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDgiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1BDUldPUkQsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQMTYiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1BDUkxPTkcsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQMzIiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX01PVjE2QjEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGFibGUgbW92LmI6MTYiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9NT1YxNkIyLCAwLCAxLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGVkIG1vdi5iOjE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QMSwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjE2L3BjcmVsIiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QMiwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicGNyZWNsLzE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QTDEsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIyNC9wY3JlbGwiLCBmYWxzZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9KTVBMMiwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicGM4LzI0IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfTU9WMjRCMSwgMCwgMSwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4YWJsZSBtb3YuYjoyNCIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX01PVjI0QjIsIDAsIDEsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4ZWQgbW92LmI6MjQiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotCi0gIC8qIEFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLiAgVGhpcyBjYXVzZXMgdGhlIGZ1bmN0aW9uJ3MgYWRkcmVzcwotICAgICB0byBiZSBhZGRlZCB0byB0aGUgZnVuY3Rpb24gdmVjdG9yIGluIGxvLW1lbSBhbmQgcHV0cyB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgZnVuY3Rpb24gdmVjdG9yJ3MgZW50cnkgaW4gdGhlIGpzciBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChSX01FTV9JTkRJUkVDVCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiOC9pbmRpcmVjdCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0KLSAgLyogSW50ZXJuYWwgcmVsb2MgZm9yIHJlbGF4aW5nLiAgVGhpcyBpcyBjcmVhdGVkIHdoZW4gYSAxNmJpdCBwYy1yZWxhdGl2ZQotICAgICBicmFuY2ggaXMgdHVybmVkIGludG8gYW4gOGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoUl9QQ1JXT1JEX0IsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhlZCBiQ0M6MTYiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX01PVkwxLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwZWNpYWwsICIzMi8yNCByZWxheGFibGUgbW92ZSIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgSE9XVE8gKFJfTU9WTDIsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIzMi8yNCByZWxheGVkIG1vdmUiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX0JDQ19JTlYsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1A4IGludmVydGVkIiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotCi0gIEhPV1RPIChSX0pNUF9ERUwsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRlbGV0ZWQganVtcCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLX07Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgXAotICB7IHgucl90eXBlID0gc2VsZWN0X3JlbG9jKGhvd3RvKTsgfQotCi0jZGVmaW5lIEJBRE1BRyh4KSAoSDgzMDBCQURNQUcoeCkgJiYgSDgzMDBIQkFETUFHKHgpICYmIEg4MzAwU0JBRE1BRyh4KSkKLSNkZWZpbmUgSDgzMDAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLQotc3RhdGljIGludAotc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlCi0gICAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1JFTEJZVEU6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUkVMV09SRDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9SRUxMT05HOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUkJZVEU6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JMT05HOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVjE2QjE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVAxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUDI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QTDE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUEwyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YyNEIxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YyNEIyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NRU1fSU5ESVJFQ1Q6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUldPUkRfQjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WTDE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVkwyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9CQ0NfSU5WOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVBfREVMOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxOTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0KLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLSAgLyogIHJlbGVudC0+c2VjdGlvbiA9IDA7Ki8KLX0KLQotc3RhdGljIGJvb2xlYW4KLWg4MzAwX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogU2VhcmNoIGFsbCB0aGUgc3ltYm9scyBmb3Igb25lIGluIElOUFVUX1NFQ1RJT04gd2l0aAotICAgICBhZGRyZXNzIEFERFJFU1MuICAqLwotICB3aGlsZSAoKnMpIAotICAgIHsKLSAgICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24KLQkgICYmIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgKyBwLT52YWx1ZSkgPT0gYWRkcmVzcykKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIHMrKzsKLSAgICB9ICAgIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogSWYgUkVMT0MgcmVwcmVzZW50cyBhIHJlbGF4YWJsZSBpbnN0cnVjdGlvbi9yZWxvYywgY2hhbmdlIGl0IGludG8KLSAgIHRoZSByZWxheGVkIHJlbG9jLCBub3RpZnkgdGhlIGxpbmtlciB0aGF0IHN5bWJvbCBhZGRyZXNzZXMKLSAgIGhhdmUgY2hhbmdlZCAoYmZkX3BlcmZvcm1fc2xpcCkgYW5kIHJldHVybiBob3cgbXVjaCB0aGUgY3VycmVudAotICAgc2VjdGlvbiBoYXMgc2hydW5rIGJ5LgotCi0gICBGSVhNRTogTXVjaCBvZiB0aGlzIGNvZGUgaGFzIGtub3dsZWRnZSBvZiB0aGUgb3JkZXJpbmcgb2YgZW50cmllcwotICAgaW4gdGhlIGhvd3RvIHRhYmxlLiAgVGhpcyBuZWVkcyB0byBiZSBmaXhlZC4gICovCi0KLXN0YXRpYyBpbnQKLWg4MzAwX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgdW5zaWduZWQgaW50IHNocmluazsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsgIAotICBiZmRfdm1hIGRvdDsKLSAgYmZkX3ZtYSBnYXA7Ci0gIHN0YXRpYyBhc2VjdGlvbiAqbGFzdF9pbnB1dF9zZWN0aW9uID0gTlVMTDsKLSAgc3RhdGljIGFyZWxlbnQgKmxhc3RfcmVsb2MgPSBOVUxMOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyB0byBiZSByZWxvY2F0ZWQgd2lsbCBoYXZlIG1vdmVkIGJhY2sgYnkgCi0gICAgIHRoZSBzaXplIG9mIHRoZSBzaHJpbmsgLSBidXQgd2UgZG9uJ3QgY2hhbmdlIHJlbG9jLT5hZGRyZXNzIGhlcmUsCi0gICAgIHNpbmNlIHdlIG5lZWQgaXQgdG8ga25vdyB3aGVyZSB0aGUgcmVsb2NhdGlvbiBsaXZlcyBpbiB0aGUgc291cmNlCi0gICAgIHVuY29va2VkIHNlY3Rpb24uICAqLwotICBiZmRfdm1hIGFkZHJlc3MgPSByZWxvYy0+YWRkcmVzcyAtIHNocmluazsKLQotICBpZiAoaW5wdXRfc2VjdGlvbiAhPSBsYXN0X2lucHV0X3NlY3Rpb24pCi0gICAgbGFzdF9yZWxvYyA9IE5VTEw7Ci0KLSAgLyogT25seSBleGFtaW5lIHRoZSByZWxvY3Mgd2hpY2ggbWlnaHQgYmUgcmVsYXhhYmxlLiAgKi8KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgeyAgICAgCi0KLSAgICAvKiBUaGlzIGlzIHRoZSAxNi8yNCBiaXQgYWJzb2x1dGUgYnJhbmNoIHdoaWNoIGNvdWxkIGJlY29tZSBhbiA4IGJpdAotICAgICAgIHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCi0gICAgY2FzZSBSX0pNUDE6Ci0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgYWRkcmVzcyk7Ci0KLSAgICAgIC8qIEFkanVzdCBmb3IgUl9KTVAxIHZzIFJfSk1QTDEuICAqLwotICAgICAgZG90ICs9IChyZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9KTVAxID8gMSA6IDIpOwotCi0gICAgICAvKiBDb21wdXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgaW5zbiB0byB0aGUgYnJhbmNoIHRhcmdldC4gICovCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLSAgCi0gICAgICAvKiBJZiB0aGUgZGlzdGFuY2UgaXMgd2l0aGluIC0xMjguLisxMjggaW5jbHVzaXZlLCB0aGVuIHdlIGNhbiByZWxheAotCSB0aGlzIGp1bXAuICArMTI4IGlzIHZhbGlkIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBtb3ZlIHR3byBieXRlcwotCSBjbG9zZXIgaWYgd2UgZG8gcmVsYXggdGhpcyBicmFuY2guICAqLwotICAgICAgaWYgKChpbnQpZ2FwID49IC0xMjggJiYgKGludClnYXAgPD0gMTI4ICkKLQl7IAotCi0JICAvKiBJdCdzIHBvc3NpYmxlIHdlIG1heSBiZSBhYmxlIHRvIGVsaW1pbmF0ZSB0aGlzIGJyYW5jaCBlbnRpcmVseTsKLQkgICAgIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGJyYW5jaCBhcm91bmQgdGhpcyBpbnN0cnVjdGlvbiwKLQkgICAgIGFuZCB0aGVyZSdzIG5vIGxhYmVsIGF0IHRoaXMgaW5zdHJ1Y3Rpb24sIHRoZW4gd2UgY2FuIHJldmVyc2UKLQkgICAgIHRoZSBjb25kaXRpb24gb24gdGhlIHByZXZpb3VzIGJyYW5jaCBhbmQgZWxpbWluYXRlIHRoaXMganVtcC4KLQotCSAgICAgICBvcmlnaW5hbDoJCQluZXc6Ci0JCSBiQ0MgbGFiMQkJCWJDQycgbGFiMgotCQkgam1wIGxhYjIKLQkJbGFiMToJCQkJbGFiMToKLQkKLQkgICAgIFRoaXMgc2F2ZXMgNCBieXRlcyBpbnN0ZWFkIG9mIHR3bywgYW5kIHNob3VsZCBiZSByZWxhdGl2ZWx5Ci0JICAgICBjb21tb24uICAqLwotCi0JICBpZiAoZ2FwIDw9IDEyNgotCSAgICAgICYmIGxhc3RfcmVsb2MKLQkgICAgICAmJiBsYXN0X3JlbG9jLT5ob3d0by0+dHlwZSA9PSBSX1BDUkJZVEUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIGxhc3RfdmFsdWU7Ci0JICAgICAgbGFzdF92YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChsYXN0X3JlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbikgKyAxOwotCi0JICAgICAgaWYgKGxhc3RfdmFsdWUgPT0gZG90ICsgMgotCQkgICYmIGxhc3RfcmVsb2MtPmFkZHJlc3MgKyAxID09IHJlbG9jLT5hZGRyZXNzCi0JCSAgJiYgISBoODMwMF9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBpbnB1dF9zZWN0aW9uLCBkb3QgLSAyKSkKLQkJewotCQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTk7Ci0JCSAgbGFzdF9yZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE4OwotCQkgIGxhc3RfcmVsb2MtPnN5bV9wdHJfcHRyID0gcmVsb2MtPnN5bV9wdHJfcHRyOwotCQkgIGxhc3RfcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRlbmQ7Ci0JCSAgc2hyaW5rICs9IDQ7Ci0JCSAgYmZkX3BlcmZvcm1fc2xpcCAoYWJmZCwgNCwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogVGhpcyBpcyB0aGUgMTYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaCB3aGljaCBjb3VsZCBiZWNvbWUgYW4gOCBiaXQKLSAgICAgICBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9QQ1JXT1JEOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2gsIGFkZCBvbmUgdG8gdGhlIHZhbHVlCi0gICAgICAgICBiZWNhdXNlIHRoZSBhZGRlbmQgZmllbGQgaW4gUENyZWwganVtcHMgaXMgb2ZmIGJ5IC0xLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikgKyAxOwotCQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIGlmIHdlIHdlcmUgdG8gcmVsYXguICAqLwotICAgICAgZG90ID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3M7Ci0gIAotICAgICAgLyogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluc24gdG8gdGhlIGJyYW5jaCB0YXJnZXQuICAqLwotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIElmIHRoZSBkaXN0YW5jZSBpcyB3aXRoaW4gLTEyOC4uKzEyOCBpbmNsdXNpdmUsIHRoZW4gd2UgY2FuIHJlbGF4Ci0JIHRoaXMganVtcC4gICsxMjggaXMgdmFsaWQgc2luY2UgdGhlIHRhcmdldCB3aWxsIG1vdmUgdHdvIGJ5dGVzCi0JIGNsb3NlciBpZiB3ZSBkbyByZWxheCB0aGlzIGJyYW5jaC4gICovCi0gICAgICBpZiAoKGludClnYXAgPj0gLTEyOCAmJiAoaW50KWdhcCA8PSAxMjggKQotCXsgCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNTsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogVGhpcyBpcyBhIDE2IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92LmIgaW5zbiwgd2hpY2ggY2FuCi0gICAgICAgYmVjb21lIGFuIDggYml0IGFic29sdXRlIGFkZHJlc3MgaWYgaXQncyBpbiB0aGUgcmlnaHQgcmFuZ2UuICAqLwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhpcyBtb3YuYiBpbnNuLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFRoZSBhZGRyZXNzIGlzIGluIDB4ZmYwMC4uMHhmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDAgb3IKLQkgMHhmZmZmMDAuLjB4ZmZmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDBoLCB0aGVuIHdlIGNhbgotCSByZWxheCB0aGlzIG1vdi5iICAqLwotICAgICAgaWYgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwCi0JICAgJiYgdmFsdWUgPj0gMHhmZjAwCi0JICAgJiYgdmFsdWUgPD0gMHhmZmZmKQotCSAgfHwgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgICAgICB8fCBiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQkgICAgICAmJiB2YWx1ZSA+PSAweGZmZmYwMAotCSAgICAgICYmIHZhbHVlIDw9IDB4ZmZmZmZmKSkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2ltaWxhcmx5IGZvciBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92LmIuICBOb3RlIHRoYXQKLSAgICAgICBpZiB3ZSBjYW4ndCByZWxheCB0aGlzIGludG8gYW4gOCBiaXQgYWJzb2x1dGUsIHdlJ2xsIGZhbGwgdGhyb3VnaAotICAgICAgIGFuZCB0cnkgdG8gcmVsYXggaXQgaW50byBhIDE2Yml0IGFic29sdXRlLiAgKi8KLSAgICBjYXNlIFJfTU9WMjRCMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoaXMgbW92LmIgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBpcyBpbiAweGZmZmYwMC4uMHhmZmZmZmYgaW5jbHVzaXZlIG9uIHRoZSBoODMwMGgsCi0JIHRoZW4gd2UgY2FuIHJlbGF4IHRoaXMgbW92LmIgICovCi0gICAgICBpZiAoKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JICAgfHwgYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICAmJiB2YWx1ZSA+PSAweGZmZmYwMAotCSAgJiYgdmFsdWUgPD0gMHhmZmZmZmYpCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgZm91ciBieXRlcy4gICovCi0JICBzaHJpbmsgKz0gNDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgNCwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0KLQkgIC8qIERvbmUgd2l0aCB0aGlzIHJlbG9jLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogRkFMTFRIUk9VR0ggYW5kIHRyeSB0byB0dXJuIHRoZSAzMi8yNCBiaXQgcmVsb2MgaW50byBhIDE2IGJpdAotCSByZWxvYy4gICovCi0KLSAgICAvKiBUaGlzIGlzIGEgMjQvMzIgYml0IGFic29sdXRlIGFkZHJlc3MgaW4gYSBtb3YgaW5zbiwgd2hpY2ggY2FuCi0gICAgICAgYmVjb21lIGFuIDE2IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGlmIGl0J3MgaW4gdGhlIHJpZ2h0IHJhbmdlLiAgKi8KLSAgICBjYXNlIFJfTU9WTDE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGlzIG1vdiBpbnNuLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIElmIHRoaXMgYWRkcmVzcyBpcyBpbiAweDAwMDAuLjB4N2ZmZiBpbmNsdXNpdmUgb3IKLSAgICAgICAgIDB4ZmY4MDAwLi4weGZmZmZmZiBpbmNsdXNpdmUsIHRoZW4gaXQgY2FuIGJlIHJlbGF4ZWQuICAqLwotICAgICAgaWYgKHZhbHVlIDw9IDB4N2ZmZiB8fCB2YWx1ZSA+PSAweGZmODAwMCkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNzsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBObyBvdGhlciByZWxvYyB0eXBlcyByZXByZXNlbnQgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgIH0KLQotICBsYXN0X3JlbG9jID0gcmVsb2M7Ci0gIGxhc3RfaW5wdXRfc2VjdGlvbiA9IGlucHV0X3NlY3Rpb247Ci0gIHJldHVybiBzaHJpbms7Ci19Ci0KLQotLyogSGFuZGxlIHJlbG9jYXRpb25zIGZvciB0aGUgSDgvMzAwLCBpbmNsdWRpbmcgcmVsb2NzIGZvciByZWxheGVkCi0gICBpbnN0cnVjdGlvbnMuCi0KLSAgIEZJWE1FOiBOb3QgYWxsIHJlbG9jYXRpb25zIGNoZWNrIGZvciBvdmVyZmxvdyEgICovCi0KLXN0YXRpYyB2b2lkCi1oODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9ICpzcmNfcHRyOwotICB1bnNpZ25lZCBpbnQgZHN0X2FkZHJlc3MgPSAqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGJmZF92bWEgZG90OwotICBpbnQgZ2FwLHRtcDsKLQotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7Ci0KLSAgICAvKiBHZW5lcmljIDhiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1BDUkJZVEU6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0IAotCSAgICAgKyBkc3RfYWRkcmVzcyAKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBBcHBseSB0aGUgcmVsb2NhdGlvbiBhbmQgdXBkYXRlIHRoZQotCSBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MrKzsKLSAgICAgIHNyY19hZGRyZXNzKys7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgLyogR2VuZXJpYyAxNmJpdCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQgCi0JICAgICArIGRzdF9hZGRyZXNzIAotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwID4gMzI3NjYgfHwgZ2FwIDwgLTMyNzY4KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIE9LLiAgQXBwbHkgdGhlIHJlbG9jYXRpb24gYW5kIHVwZGF0ZSB0aGUKLQkgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSAyOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMjsKLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBHZW5lcmljIDhiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1JFTEJZVEU6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8PSAweGZmCi0JICB8fCAodmFsdWUgPj0gMHgwMDAwZmYwMCAmJiB2YWx1ZSA8PSAweDAwMDBmZmZmKQotICAJICB8fCAodmFsdWUgPj0gMHgwMGZmZmYwMCAmJiB2YWx1ZSA8PSAweDAwZmZmZmZmKQotCSAgfHwgKHZhbHVlID49IDB4ZmZmZmZmMDAgJiYgdmFsdWUgPD0gMHhmZmZmZmZmZikpCi0JewotCSAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEFwcGx5IHRoZSByZWxvY2F0aW9uIGFuZCB1cGRhdGUgdGhlCi0JICAgICBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLQkgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCSAgZHN0X2FkZHJlc3MgKz0gMTsKLQkgIHNyY19hZGRyZXNzICs9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBBbGwgZG9uZS4gICovCi0gICAgICBicmVhazsKLQotICAgIC8qIFZhcmlvdXMgc2ltcGxlIDE2Yml0IGFic29sdXRlIHJlbG9jYXRpb25zLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICBjYXNlIFJfSk1QMToKLSAgICBjYXNlIFJfUkVMV09SRDoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDI7Ci0gICAgICBzcmNfYWRkcmVzcyArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBWYXJpb3VzIHNpbXBsZSAyNC8zMmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBSX01PVjI0QjE6Ci0gICAgY2FzZSBSX01PVkwxOgotICAgIGNhc2UgUl9SRUxMT05HOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDQ7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBbm90aGVyIDI0LzMyYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICB2YWx1ZSA9ICgodmFsdWUgJiAweDAwZmZmZmZmKQotCSAgICAgICB8IChiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgc3JjX2FkZHJlc3MpICYgMHhmZjAwMDAwMCkpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSA0OwotICAgICAgc3JjX2FkZHJlc3MgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYm9sdXRlIHJlbG9jYXRpb24gdGhhdCB3YXMgZm9ybWVybGx5IGEgMjQvMzJiaXQKLSAgICAgICBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfTU9WTDI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8IDB4ODAwMCB8fCB2YWx1ZSA+IDB4ZmY4MDAwKQotCXsKLQkgIC8qIEluc2VydCB0aGUgMTZiaXQgdmFsdWUgaW50byB0aGUgcHJvcGVyIGxvY2F0aW9uLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0JICAvKiBGaXggdGhlIG9wY29kZS4gIEZvciBhbGwgdGhlIG1vdmUgaW5zbnMsIHdlIHNpbXBseQotCSAgICAgbmVlZCB0byB0dXJuIG9mZiBiaXQgMHgyMCBpbiB0aGUgcHJldmlvdXMgYnl0ZS4gICovCi0gICAgICAgICAgZGF0YVtkc3RfYWRkcmVzcyAtIDFdICY9IH4weDIwOwotCSAgZHN0X2FkZHJlc3MgKz0gMjsKLQkgIHNyY19hZGRyZXNzICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYnNvbHV0ZSBicmFuY2ggdGhhdCBpcyBub3cgYW4gOC1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfSk1QMjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCSAgICAgKyBkc3RfYWRkcmVzcwotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIE5vdyBmaXggdGhlIGluc3RydWN0aW9uIGl0c2VsZi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbZHN0X2FkZHJlc3MgLSAxXSkKLQl7Ci0JY2FzZSAweDVlOgotCSAgLyoganNyIC0+IGJzciAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDU1LCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg1YToKLQkgIC8qIGptcCAtPmJyYSAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDQwLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSA4Yml0IHZhbHVlLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0gICAgICBkc3RfYWRkcmVzcyArPSAxOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMzsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0aGF0IGlzIG5vdyBhbiA4LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9QQ1JXT1JEX0I6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCSAgICAgKyBkc3RfYWRkcmVzcwotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgLSAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIE5vdyBmaXggdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoZGF0YVtkc3RfYWRkcmVzcyAtIDJdKQotCXsKLQljYXNlIDB4NTg6Ci0JICAvKiBiQ0M6MTYgLT4gYkNDOjggKi8KLQkgIC8qIEdldCB0aGUgY29uZGl0aW9uIGNvZGUgZnJvbSB0aGUgb3JpZ2luYWwgaW5zbi4gICovCi0JICB0bXAgPSBkYXRhW2RzdF9hZGRyZXNzIC0gMV07Ci0JICB0bXAgJj0gMHhmMDsKLQkgIHRtcCA+Pj0gNDsKLQotCSAgLyogTm93IG9yIGluIHRoZSBoaWdoIG5pYmJsZSBvZiB0aGUgb3Bjb2RlLiAgKi8KLQkgIHRtcCB8PSAweDQwOwotCi0JICAvKiBXcml0ZSBpdC4gICovCi0JICBiZmRfcHV0XzggKGFiZmQsIHRtcCwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMik7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLQkvKiBPdXRwdXQgdGhlIHRhcmdldC4gICovCi0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpOwotCi0JLyogV2UgZG9uJ3QgYWR2YW5jZSBkc3RfYWRkcmVzcyAtLSB0aGUgOGJpdCByZWxvYyBpcyBhcHBsaWVkIGF0Ci0JICAgZHN0X2FkZHJlc3MgLSAxLCBzbyB0aGUgbmV4dCBpbnNuIHNob3VsZCBiZWdpbiBhdCBkc3RfYWRkcmVzcy4gICovCi0Jc3JjX2FkZHJlc3MgKz0gMjsKLQotCWJyZWFrOwotICAgICAgCi0gICAgLyogU2ltaWxhcmx5IGZvciBhIDI0Yml0IGFic29sdXRlIHRoYXQgaXMgbm93IDggYml0cy4gICovCi0gICAgY2FzZSBSX0pNUEwyOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMik7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBGaXggdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoZGF0YVtzcmNfYWRkcmVzc10pCi0JewotCWNhc2UgMHg1ZToKLQkgIC8qIGpzciAtPiBic3IgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg1YToKLQkgIC8qIGptcCAtPmJyYSAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDQwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyArIDEpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYnNvbHV0ZSBtb3YuYiB0aGF0IGlzIG5vdyBhbiA4Yml0IGFic29sdXRlIG1vdi5iLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSAhPSAweDZhKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGaXggdXAgdGhlIG9wY29kZS4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYwKQotCXsKLQljYXNlIDB4MDA6Ci0JICBkYXRhW2RzdF9hZGRyZXNzIC0gMl0gPSAoZGF0YVtzcmNfYWRkcmVzcy0xXSAmIDB4ZikgfCAweDIwOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgzMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNGJpdCBtb3YuYiAgKi8KLSAgICBjYXNlIFJfTU9WMjRCMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSAhPSAweDZhKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGaXggdXAgdGhlIG9wY29kZS4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYwKQotCXsKLQljYXNlIDB4MjA6Ci0JICBkYXRhW2RzdF9hZGRyZXNzIC0gMl0gPSAoZGF0YVtzcmNfYWRkcmVzcy0xXSAmIDB4ZikgfCAweDIwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGEwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgzMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9CQ0NfSU5WOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICAgICsgZHN0X2FkZHJlc3MgCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkgKyAxOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChnYXAgPCAtMTI4IHx8IGdhcCA+IDEyNikKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEZpeCB0aGUgY29uZGl0aW9uIGluIHRoZSBpbnN0cnVjdGlvbiwgYXBwbHkKLQkgdGhlIHJlbG9jYXRpb24sIGFuZCB1cGRhdGUgdGhlIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfZ2V0XzggKGFiZmQsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpIF4gMSwKLQkJIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcysrOwotICAgICAgc3JjX2FkZHJlc3MrKzsKLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSk1QX0RFTDoKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFuIDhiaXQgbWVtb3J5IGluZGlyZWN0IGluc3RydWN0aW9uIChqbXAvanNyKS4KLQotICAgICAgIFRoZXJlJ3Mgc2V2ZXJhbCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUgdG8gaGFuZGxlCi0gICAgICAgdGhpcyByZWxvY2F0aW9uLgotCi0gICAgICAgSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGFic29sdXRlIHN5bWJvbCwgdGhlbgotICAgICAgIHdlIHNob3VsZCBoYW5kbGUgaXQganVzdCBSX1JFTEJZVEUuICBMaWtld2lzZSBpZiBpdCdzCi0gICAgICAgZm9yIGEgc3ltYm9sIHdpdGggYSB2YWx1ZSBnZSAwIGFuZCBsZSAweGZmLgotCi0gICAgICAgT3RoZXJ3aXNlIGl0J3MgYSBqdW1wL2NhbGwgdGhyb3VnaCB0aGUgZnVuY3Rpb24gdmVjdG9yLAotICAgICAgIGFuZCB0aGUgbGlua2VyIGlzIGV4cGVjdGVkIHRvIHNldCB1cCB0aGUgZnVuY3Rpb24gdmVjdG9yCi0gICAgICAgYW5kIHB1dCB0aGUgcmlnaHQgdmFsdWUgaW50byB0aGUganVtcC9jYWxsIGluc3RydWN0aW9uLiAgKi8KLSAgICBjYXNlIFJfTUVNX0lORElSRUNUOgotICAgICAgewotCS8qIFdlIG5lZWQgdG8gZmluZCB0aGUgc3ltYm9sIHNvIHdlIGNhbiBkZXRlcm1pbmUgaXQncwotCSAgIGFkZHJlc3MgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICovCi0JYXN5bWJvbCAqc3ltYm9sOwotCWJmZF92bWEgdmFsdWU7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICpoOwotCWFzZWN0aW9uICp2ZWN0b3JzX3NlYyA9IGg4MzAwX2NvZmZfaGFzaF90YWJsZSAobGlua19pbmZvKS0+dmVjdG9yc19zZWM7Ci0KLQkvKiBGaXJzdCBzZWUgaWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGFic29sdXRlIHN5bWJvbAotCSAgIG9yIGFnYWluc3QgYSBzeW1ib2wgd2l0aCBhIG5vbm5lZ2F0aXZlIHZhbHVlIDw9IDB4ZmYuICAqLwotCXN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQl2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQlpZiAoc3ltYm9sID09IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbAotCSAgICB8fCAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAweGZmKSkKLQkgIHsKLQkgICAgLyogVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBpbiBhIG1hbm5lciB2ZXJ5IHNpbWlsYXIgdG8KLQkgICAgICAgUl9SRUxCWVRFUy4gICBJZiB0aGUgdmFsdWUgaXMgaW4gcmFuZ2UsIHRoZW4ganVzdCBzbGFtCi0JICAgICAgIHRoZSB2YWx1ZSBpbnRvIHRoZSByaWdodCBsb2NhdGlvbi4gIEVsc2UgdHJpZ2dlciBhCi0JICAgICAgIHJlbG9jIG92ZXJmbG93IGNhbGxiYWNrLiAgKi8KLQkgICAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMHhmZikKLQkgICAgICB7Ci0JCWJmZF9wdXRfOCAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCWRzdF9hZGRyZXNzICs9IDE7Ci0JCXNyY19hZGRyZXNzICs9IDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJCXJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCQlpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCQkgIGFib3J0ICgpOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBUaGlzIGlzIGEganVtcC9jYWxsIHRocm91Z2ggYSBmdW5jdGlvbiB2ZWN0b3IsIGFuZCB3ZSdyZQotCSAgIGV4cGVjdGVkIHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24gdmVjdG9yIG91cnNlbHZlcy4gCi0KLQkgICBGaXJzdCBsb29rIHVwIHRoaXMgc3ltYm9sIGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSAtLSB3ZSBuZWVkCi0JICAgdGhlIGRlcml2ZWQgbGlua2VyIHN5bWJvbCB3aGljaCBob2xkcyB0aGlzIHN5bWJvbCdzIGluZGV4Ci0JICAgaW4gdGhlIGZ1bmN0aW9uIHZlY3Rvci4gICovCi0JbmFtZSA9IHN5bWJvbC0+bmFtZTsKLQlpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkKLQkgIHsKLQkgICAgY2hhciAqbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgOSk7Ci0JICAgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0cmNweSAobmV3X25hbWUsIG5hbWUpOwotCSAgICBzcHJpbnRmIChuZXdfbmFtZSArIHN0cmxlbiAobmFtZSksICJfJTA4eCIsCi0JCSAgICAgKGludClzeW1ib2wtPnNlY3Rpb24pOwotCSAgICBuYW1lID0gbmV3X25hbWU7Ci0JICB9Ci0KLQloID0gZnVuY3ZlY19oYXNoX2xvb2t1cCAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChsaW5rX2luZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLQkvKiBUaGlzIHNob3VsZG4ndCBldmVyIGhhcHBlbi4gIElmIGl0IGRvZXMgdGhhdCBtZWFucyB3ZSd2ZSBnb3QKLQkgICBkYXRhIGNvcnJ1cHRpb24gb2Ygc29tZSBraW5kLiAgQWJvcnRpbmcgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUKLQkgICB0aGluayB0byBkbyBoZXJlLiAgKi8KLQlpZiAoaCA9PSBOVUxMIHx8IHZlY3RvcnNfc2VjID09IE5VTEwpCi0JICBhYm9ydCAoKTsKLQotCS8qIFBsYWNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiB2ZWN0b3IgZW50cnkgaW50byB0aGUKLQkgICByZWxvYydzIGFkZHJlc3MuICAqLwotCWJmZF9wdXRfOCAoYWJmZCwKLQkJICAgdmVjdG9yc19zZWMtPm91dHB1dF9vZmZzZXQgKyBoLT5vZmZzZXQsCi0JCSAgIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0KLQlkc3RfYWRkcmVzcysrOwotCXNyY19hZGRyZXNzKys7Ci0KLQkvKiBOb3cgY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaXRzZWxmLiAgKi8KLQlpZiAoYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDApCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsCi0JCQkJCQkgIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgIHZlY3RvcnNfc2VjLT5jb250ZW50cyArIGgtPm9mZnNldCk7Ci0JZWxzZSBpZiAoYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDBoCi0JCSB8fCBiZmRfZ2V0X21hY2ggKGlucHV0X3NlY3Rpb24tPm93bmVyKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICBiZmRfcHV0XzMyIChhYmZkLAotCQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsCi0JCQkJCQkgIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgIHZlY3RvcnNfc2VjLT5jb250ZW50cyArIGgtPm9mZnNldCk7Ci0JZWxzZQotCSAgYWJvcnQgKCk7Ci0KLQkvKiBHcm9zcy4gIFdlJ3ZlIGFscmVhZHkgd3JpdHRlbiB0aGUgY29udGVudHMgb2YgdGhlIHZlY3RvciBzZWN0aW9uCi0JICAgYmVmb3JlIHdlIGdldCBoZXJlLi4uICBTbyB3ZSB3cml0ZSBpdCBhZ2FpbiB3aXRoIHRoZSBuZXcgZGF0YS4gICovCi0JYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzICh2ZWN0b3JzX3NlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCSAgdmVjdG9yc19zZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgdmVjdG9yc19zZWMtPmNvbnRlbnRzLAotCQkJCSAgdmVjdG9yc19zZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICB2ZWN0b3JzX3NlYy0+X3Jhd19zaXplKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gICpzcmNfcHRyID0gc3JjX2FkZHJlc3M7Ci0gICpkc3RfcHRyID0gZHN0X2FkZHJlc3M7Ci19Ci0KLQotLyogUm91dGluZSBmb3IgdGhlIGg4MzAwIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgdGhlIHNwZWNpYWwgUl9NRU1fSU5ESVJFQ1QKLSAgIHJlbG9jcyBvbiB0aGUgaDgzMDAuICBJdCdzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGEgdmVjdG9ycwotICAgc2VjdGlvbiBhbmQgYXR0YWNoaW5nIGl0IHRvIGFuIGlucHV0IGJmZCBhcyB3ZWxsIGFzIHNpemluZwotICAgdGhlIHZlY3RvcnMgc2VjdGlvbi4gIEl0IGFsc28gY3JlYXRlcyBvdXIgdmVjdG9ycyBoYXNoIHRhYmxlLgotCi0gICBJdCB1c2VzIHRoZSBnZW5lcmljIGxpbmtlciByb3V0aW5lcyB0byBhY3R1YWxseSBhZGQgdGhlIHN5bWJvbHMuCi0gICBmcm9tIHRoaXMgQkZEIHRvIHRoZSBiZmQgbGlua2VyIGhhc2ggdGFibGUuICBJdCBtYXkgYWRkIGEgZmV3Ci0gICBzZWxlY3RlZCBzdGF0aWMgc3ltYm9scyB0byB0aGUgYmZkIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKmZ1bmN2ZWNfaGFzaF90YWJsZTsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGNyZWF0ZWQgYSB2ZWN0b3JzIHNlY3Rpb24sIGRvIHNvIG5vdy4gICovCi0gIGlmICghaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYXJlIHNldCwgaW5jbHVkaW5nIFNFQ19JTl9NRU1PUlkuICAqLwotICAgICAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19SRUFET05MWSk7Ci0gICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsCi0JCQkJCQkJCSAgICAiLnZlY3RvcnMiKTsKLQotICAgICAgLyogSWYgdGhlIHNlY3Rpb24gd2Fzbid0IGNyZWF0ZWQsIG9yIHdlIGNvdWxkbid0IHNldCB0aGUgZmxhZ3MsCi0JIHF1aXQgcXVpY2tseSBub3csIHJhdGhlciB0aGFuIGRpZWluZyBhIHBhaW5mdWwgZGVhdGggbGF0ZXIuICAqLwotICAgICAgaWYgKCEgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZShpbmZvKS0+dmVjdG9yc19zZWMsCi0JCQkJICAgICAgZmxhZ3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWxzbyBjcmVhdGUgdGhlIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGZ1bmN2ZWNfaGFzaF90YWJsZSA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqKQotCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlKSkpOwotCi0gICAgICBpZiAoIWZ1bmN2ZWNfaGFzaF90YWJsZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFuZCBpbml0aWFsaXplIHRoZSBmdW5jdmVjIGhhc2ggdGFibGUuICAqLwotICAgICAgaWYgKCFmdW5jdmVjX2hhc2hfdGFibGVfaW5pdCAoZnVuY3ZlY19oYXNoX3RhYmxlLCBhYmZkLAotCQkJCSAgICBmdW5jdmVjX2hhc2hfbmV3ZnVuYykpCi0JewotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIGZ1bmN2ZWNfaGFzaF90YWJsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdG9yZSBhd2F5IGEgcG9pbnRlciB0byB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZ1bmN2ZWNfaGFzaF90YWJsZSA9IGZ1bmN2ZWNfaGFzaF90YWJsZTsKLSAgICB9Ci0KLSAgLyogTG9hZCB1cCB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotICBmdW5jdmVjX2hhc2hfdGFibGUgPSBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGU7Ci0KLSAgLyogQWRkIHRoZSBzeW1ib2xzIHVzaW5nIHRoZSBnZW5lcmljIGNvZGUuICAqLwotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0KLSAgLyogTm93IHNjYW4gdGhlIHJlbG9jcyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGlzIGJmZDsgY3JlYXRlCi0gICAgIGFkZGl0aW9uYWwgc3BhY2UgaW4gdGhlIC52ZWN0b3JzIHNlY3Rpb24gYXMgbmVlZGVkLiAgKi8KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgbG9uZyByZWxvY19zaXplLCByZWxvY19jb3VudCwgaTsKLSAgICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICAgYXJlbGVudCAqKnJlbG9jczsKLQotICAgICAgLyogU3VjayBpbiB0aGUgcmVsb2NzLCBzeW1ib2xzICYgY2Fub25pY2FsaXplIHRoZW0uICAqLwotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAocmVsb2Nfc2l6ZSA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxvY3MgPSAoYXJlbGVudCAqKiliZmRfbWFsbG9jICgoc2l6ZV90KXJlbG9jX3NpemUpOwotICAgICAgaWYgKCFyZWxvY3MpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgc3ltYm9scyBzaG91bGQgaGF2ZSBiZWVuIHJlYWQgaW4gYnkgX2JmZF9nZW5lcmljIGxpbmtfYWRkX3N5bWJvbHMKLQkgY2FsbCBhYm92ZWMsIHNvIHdlIGNhbiBjaGVhdCBhbmQgdXNlIHRoZSBwb2ludGVyIHRvIHRoZW0gdGhhdCB3YXMKLQkgc2F2ZWQgaW4gdGhlIGFib3ZlIGNhbGwuICAqLwotICAgICAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKGFiZmQpOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbG9jcywgc3ltYm9scyk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPD0gMCkKLQl7Ci0JICBmcmVlIChyZWxvY3MpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOb3cgd2FsayB0aHJvdWdoIGFsbCB0aGUgcmVsb2NhdGlvbnMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnJlbG9jID0gcmVsb2NzW2ldOwotCSAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgLyogV2UndmUgZ290IGFuIGluZGlyZWN0IHJlbG9jLiAgU2VlIGlmIHdlIG5lZWQgdG8gYWRkIGl0Ci0JICAgICB0byB0aGUgZnVuY3Rpb24gdmVjdG9yIHRhYmxlLiAgIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUKLQkgICAgIHRvIGFkZCBhIG5ldyBlbnRyeSBmb3IgZWFjaCB1bmlxdWUgc3ltYm9sIHJlZmVyZW5jZWQKLQkgICAgIGJ5IGFuIFJfTUVNX0lORElSRUNUIHJlbG9jYXRpb24gZXhjZXB0IGZvciBhIHJlbG9jCi0JICAgICBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gICovCi0JICBpZiAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfTUVNX0lORElSRUNUCi0JICAgICAgJiYgc3ltYm9sICE9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCkKLQotCSAgICB7Ci0JICAgICAgc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIG5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JCXsKLQkJICBjaGFyICpuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyA5KTsKLQotCQkgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICBzdHJjcHkgKG5ld19uYW1lLCBuYW1lKTsKLQkJICBzcHJpbnRmIChuZXdfbmFtZSArIHN0cmxlbiAobmFtZSksICJfJTA4eCIsCi0JCQkgICAoaW50KXN5bWJvbC0+c2VjdGlvbik7Ci0JCSAgbmFtZSA9IG5ld19uYW1lOwotCQl9Ci0KLQkgICAgICAvKiBMb29rIHRoaXMgc3ltYm9sIHVwIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0JICAgICAgaCA9IGZ1bmN2ZWNfaGFzaF9sb29rdXAgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZ1bmN2ZWNfaGFzaF90YWJsZSwKLQkJCQkgICAgICAgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCi0JICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZSwgYWRkCi0JCSBpdCBhbmQgYnVtcCB1cCB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZS4gICovCi0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIGggPSBmdW5jdmVjX2hhc2hfbG9va3VwIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJCSAgIG5hbWUsIHRydWUsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIEJ1bXAgdGhlIHNpemUgb2YgdGhlIHZlY3RvcnMgc2VjdGlvbi4gIEVhY2ggdmVjdG9yCi0JCSAgICAgdGFrZXMgMiBieXRlcyBvbiB0aGUgaDgzMDAgYW5kIDQgYnl0ZXMgb24gdGhlIGg4MzAwaC4gICovCi0JCSAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDApCi0JCSAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplICs9IDI7Ci0JCSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkJCSAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCQkgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSArPSA0OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgcmVsb2NhdGlvbnMsIHJlbGVhc2UgdGhlbS4gICovCi0gICAgICBmcmVlIChyZWxvY3MpOwotICAgIH0KLQotICAvKiBOb3cgYWN0dWFsbHkgYWxsb2NhdGUgc29tZSBzcGFjZSBmb3IgdGhlIGZ1bmN0aW9uIHZlY3Rvci4gIEl0J3MKLSAgICAgd2FzdGVmdWwgdG8gZG8gdGhpcyBtb3JlIHRoYW4gb25jZSwgYnV0IHRoaXMgaXMgZWFzaWVyLiAgKi8KLSAgaWYgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5fcmF3X3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBGcmVlIHRoZSBvbGQgY29udGVudHMuICAqLwotICAgICAgaWYgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5jb250ZW50cykKLQlmcmVlIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+Y29udGVudHMpOwotCi0gICAgICAvKiBBbGxvY2F0ZSBuZXcgY29udGVudHMuICAqLwotICAgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPmNvbnRlbnRzCi0JPSBiZmRfbWFsbG9jIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMKLSNkZWZpbmUgY29mZl9yZWxvYzE2X2VzdGltYXRlIGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLQotCi1jb25zdCBiZmRfdGFyZ2V0IGg4MzAwY29mZl92ZWMgPQotewotICAiY29mZi1oODMwMCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1oODUwMC5jIGIvYmZkL2NvZmYtaDg1MDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExMDllYS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1oODUwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSGl0YWNoaSBIOC81MDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL2g4NTAwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tOCA9Ci1IT1dUTyAoUl9IODUwMF9JTU04LCAwLCAxLCA4LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0xNiA9Ci1IT1dUTyAoUl9IODUwMF9JTU0xNiwgMCwgMSwgMTYsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0xNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0yNCA9Ci1IT1dUTyAoUl9IODUwMF9JTU0yNCwgMCwgMSwgMjQsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0yNCIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0zMiA9Ci1IT1dUTyAoUl9IODUwMF9JTU0zMiwgMCwgMSwgMzIsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0zMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKTsKLQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2hpZ2g4ID0KLUhPV1RPIChSX0g4NTAwX0hJR0g4LCAwLCAxLCA4LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9oaWdoOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9sb3cxNiA9Ci1IT1dUTyAoUl9IODUwMF9MT1cxNiwgMCwgMSwgMTYsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJyX2xvdzE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX3BjcmVsOCA9Ci1IT1dUTyAoUl9IODUwMF9QQ1JFTDgsIDAsIDEsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInJfcGNyZWw4IiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9wY3JlbDE2ID0KLUhPV1RPIChSX0g4NTAwX1BDUkVMMTYsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJyX3BjcmVsMTYiLCB0cnVlLCAwLCAwLCB0cnVlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9oaWdoMTYgPQotSE9XVE8gKFJfSDg1MDBfSElHSDE2LCAwLCAxLCA4LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9oaWdoMTYiLCB0cnVlLCAweDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKLQotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi1zdGF0aWMgaW50IAotY29mZl9oODUwMF9zZWxlY3RfcmVsb2MgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuIGhvd3RvLT50eXBlOwotfQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB4LnJfdHlwZSA9IGNvZmZfaDg1MDBfc2VsZWN0X3JlbG9jKGhvd3RvKQotCi0KLSNkZWZpbmUgQkFETUFHKHgpIEg4NTAwQkFETUFHKHgpCi0jZGVmaW5lIEg4NTAwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICAgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpIFwKLSAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCi0gIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlCi0gICAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8oaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqIGludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW04OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMjQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0yNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0zMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX1BDUkVMODoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX3BjcmVsODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfcGNyZWwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIODoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2hpZ2g4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0hJR0gxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2hpZ2gxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9MT1cxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2xvdzE2OwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0KLS8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KLQotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKLSBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQgcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKHJlbG9jLT5yX3N5bW5keCA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1leHRyYV9jYXNlIChpbl9hYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKQotICAgICBiZmQgKmluX2FiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjsKLXsKLSAgYmZkX2J5dGUgKmQgPSBkYXRhKypkc3RfcHRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9IODUwMF9JTU04OgotICAgICAgYmZkX3B1dF84IChpbl9hYmZkLAotCQkgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgZCk7Ci0gICAgICAoKmRzdF9wdHIpICs9IDE7Ci0gICAgICAoKnNyY19wdHIpICs9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IODUwMF9ISUdIODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikKLQkJICA+PiAxNiksCi0JCSBkICk7Ci0gICAgICAoKmRzdF9wdHIpICs9IDE7Ci0gICAgICAoKnNyY19wdHIpICs9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKLSAgICAgIGJmZF9wdXRfMTYgKGluX2FiZmQsCi0JCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgIGQgICk7Ci0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IODUwMF9MT1cxNjoKLSAgICAgIGJmZF9wdXRfMTYgKGluX2FiZmQsCi0JCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgIGQpOwotCi0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikKLQkJICAgPj4xNiksCi0JCSAgZCk7Ci0KLSAgICAgICgqZHN0X3B0cikgKz0gMjsKLSAgICAgICgqc3JjX3B0cikgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0g4NTAwX0lNTTI0OgotICAgICAgewotCWludCB2ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JaW50IG8gPSBiZmRfZ2V0XzMyKGluX2FiZmQsIGRhdGErICpkc3RfcHRyIC0xKTsKLQl2ID0gKHYgJiAweDAwZmZmZmZmKSB8IChvICYgMHhmZjAwMDAwKTsKLQliZmRfcHV0XzMyIChpbl9hYmZkLCB2LCBkYXRhICArICpkc3RfcHRyIC0xKTsKLQkoKmRzdF9wdHIpICs9MzsKLQkoKnNyY19wdHIpKz0zOzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0zMjoKLSAgICAgIHsKLQlpbnQgdiA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCWJmZF9wdXRfMzIgKGluX2FiZmQsIHYsIGRhdGEgICsgKmRzdF9wdHIpOwotCSgqZHN0X3B0cikgKz00OwotCSgqc3JjX3B0cikrPTQ7OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6Ci0gICAgICB7Ci0JYmZkX3ZtYSBkc3QgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQKLQkgICsgKmRzdF9wdHIKLQkgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JaW50IGdhcCA9IGRzdCAtIGRvdCAtIDE7IC8qIC0xIHNpbmNlIHdlcmUgaW4gdGhlIG9kZCBieXRlIG9mIHRoZQotCQkJCSAgICB3b3JkIGFuZCB0aGUgcGMncyBiZWVuIGluY3JlbWVudGVkICovCi0KLQlpZiAoZ2FwID4gMTI4IHx8IGdhcCA8IC0xMjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzggKGluX2FiZmQsIGdhcCwgZGF0YSArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpKys7Ci0JKCpzcmNfcHRyKSsrOwotCWJyZWFrOwotICAgICAgfQotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDE2OgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0Ci0JICArICpkc3RfcHRyCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOyAvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCA+IDMyNzY3IHx8IGdhcCA8IC0zMjc2OCkKLQkgIHsKLQkgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICAgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICAgIGFib3J0ICgpOwotCSAgfQotCWJmZF9wdXRfMTYgKGluX2FiZmQsIGdhcCwgZGF0YSArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpKz0yOwotCSgqc3JjX3B0cikrPTI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBleHRyYV9jYXNlCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IGg4NTAwY29mZl92ZWMgPQotewotICAiY29mZi1oODUwMCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTM4Ni5jIGIvYmZkL2NvZmYtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk4Y2MxLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDYzNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotI2lmZGVmIENPRkZfR08zMl9FWEUKLSNpbmNsdWRlICJjb2ZmL2dvMzJleGUuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTM4Nl9yZWxvYyAKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCi0JICAgYmZkX3ZtYSAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLS8qIEZvciBzb21lIHJlYXNvbiB3aGVuIHVzaW5nIGkzODYgQ09GRiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24gc3ltYm9sIGlzIHRoZSB2YWx1ZSBpdHNlbGYgcGx1cwotICAgYW55IGRlc2lyZWQgb2Zmc2V0LiAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl9pMzg2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgLyogV2UgYXJlIHJlbG9jYXRpbmcgYSBjb21tb24gc3ltYm9sLiAgVGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlCi0JIG9iamVjdCBmaWxlIGlzIE9SSUcgKyBPRkZTRVQsIHdoZXJlIE9SSUcgaXMgdGhlIHZhbHVlIG9mIHRoZQotCSBjb21tb24gc3ltYm9sIGFzIHNlZW4gYnkgdGhlIG9iamVjdCBmaWxlIHdoZW4gaXQgd2FzIGNvbXBpbGVkCi0JICh0aGlzIG1heSBiZSB6ZXJvIGlmIHRoZSBzeW1ib2wgd2FzIHVuZGVmaW5lZCkgYW5kIE9GRlNFVCBpcwotCSB0aGUgb2Zmc2V0IGludG8gdGhlIGNvbW1vbiBzeW1ib2wgKG5vcm1hbGx5IHplcm8sIGJ1dCBtYXkgYmUKLQkgbm9uLXplcm8gd2hlbiByZWZlcnJpbmcgdG8gYSBmaWVsZCBpbiBhIGNvbW1vbiBzdHJ1Y3R1cmUpLgotCSBPUklHIGlzIHRoZSBuZWdhdGl2ZSBvZiByZWxvY19lbnRyeS0+YWRkZW5kLCB3aGljaCBpcyBzZXQgYnkKLQkgdGhlIENBTENfQURERU5EIG1hY3JvIGJlbG93LiAgV2Ugd2FudCB0byByZXBsYWNlIHRoZSB2YWx1ZSBpbgotCSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBORVcgKyBPRkZTRVQsIHdoZXJlIE5FVyBpcyB0aGUgdmFsdWUgb2YKLQkgdGhlIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHB1dCBpbiB0aGUgZmluYWwKLQkgb2JqZWN0IGZpbGUuICBORVcgaXMgc3ltYm9sLT52YWx1ZS4gICovCi0gICAgICBkaWZmID0gc3ltYm9sLT52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZWxzZQotICAgICAgLyogSW4gUEUgbW9kZSwgd2UgZG8gbm90IG9mZnNldCB0aGUgY29tbW9uIHN5bWJvbC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGFsd2F5cyBlZmZlY3RpdmVseQotCSBpZ25vcmVzIHRoZSBhZGRlbmQgZm9yIGEgQ09GRiB0YXJnZXQgd2hlbiBwcm9kdWNpbmcKLQkgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoaXMgc2VlbXMgdG8gYmUgYWx3YXlzIHdyb25nIGZvciAzODYKLQkgQ09GRiwgc28gd2UgaGFuZGxlIHRoZSBhZGRlbmQgaGVyZSBpbnN0ZWFkLiAgKi8KLSAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICAvKiBGSVhNRTogSG93IHNob3VsZCB0aGlzIGNhc2UgYmUgaGFuZGxlZD8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnR5cGUgPT0gUl9JTUFHRUJBU0UgJiYgZGlmZiAhPSAwKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgZGlmZikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gICAgaWYgKGRpZmYgIT0gMCkKLSAgICAgIHsKLQlyZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQl1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0Jc3dpdGNoIChob3d0by0+c2l6ZSkKLQkgIHsKLQkgIGNhc2UgMDoKLQkgICAgewotCSAgICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICB7Ci0JICAgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHsKLQkgICAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gISBob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnR5cGUgIT0gUl9JTUFHRUJBU0U7Ci19ICAgICAKLSNlbmRpZgotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAotewotICB7MH0sCi0gIHsxfSwKLSAgezJ9LAotICB7M30sCi0gIHs0fSwKLSAgezV9LAotICBIT1dUTyAoUl9ESVIzMiwgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgImRpcjMyIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAvKiB7N30sICovCi0gIEhPV1RPIChSX0lNQUdFQkFTRSwgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgInJ2YTMyIiwJICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgezAxMH0sCi0gIHswMTF9LAotICB7MDEyfSwKLSAgezAxM30sCi0gIHswMTR9LAotICB7MDE1fSwKLSAgezAxNn0sCi0gIEhPV1RPIChSX1JFTEJZVEUsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgOCwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICI4IiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUkVMV09SRCwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICIxNiIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1JFTExPTkcsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiMzIiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDgiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1BDUldPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDE2IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1AzMiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEkzODZCQURNQUcoeCkKLSNkZWZpbmUgSTM4NiAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLS8qIEZvciAzODYgQ09GRiBhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkCi0gICBsaWJyYXJ5LiAgT24gc29tZSBvdGhlciBDT0ZGIHRhcmdldHMgU1RZUF9CU1MgaXMgbm9ybWFsbHkKLSAgIFNUWVBfTk9MT0FELiAgKi8KLSNkZWZpbmUgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQotCi0vKiBDb21wdXRlIHRoZSBhZGRlbmQgb2YgYSByZWxvYy4gIElmIHRoZSByZWxvYyBpcyB0byBhIGNvbW1vbiBzeW1ib2wsCi0gICB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgQnkgdGhlCi0gICB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgbGlua2VyIG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBzeW1ib2wKLSAgIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gIFRoZXJlZm9yZSwgd2UKLSAgIGhhY2sgd2lsZGx5IHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGZyb20gdGhpcyBmaWxlIHNvIHRoYXQgd2UKLSAgIGNhbiBtYWtlIHRoZSBjb3JyZWN0IGFkanVzdG1lbnQuICBUaGlzIG1hY3JvIHNldHMgY29mZnN5bSB0byB0aGUKLSAgIHN5bWJvbCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCBhbmQgdXNlcyBpdCB0byBzZXQgdGhlIGFkZGVuZCB2YWx1ZQotICAgY29ycmVjdGx5LiAgSWYgdGhpcyBpcyBub3QgYSBjb21tb24gc3ltYm9sLCB0aGUgdXN1YWwgYWRkZW5kCi0gICBjYWxjdWxhdGlvbiBpcyBkb25lLCBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIHR3ZWFrIGlzIG5lZWRlZCBmb3IKLSAgIFBDIHJlbGF0aXZlIHJlbG9jcy4KLSAgIEZJWE1FOiBUaGlzIG1hY3JvIHJlZmVycyB0byBzeW1ib2xzIGFuZCBhc2VjdDsgdGhlc2UgYXJlIGZyb20gdGhlCi0gICBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgdGhlIG1hY3JvIGFyZ3VtZW50cy4gICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKQkJXAotICB7CQkJCQkJCQlcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CVwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKQkJCVwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpCQkJCVwKLQkgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOwkJXAotICAgIGVsc2UgaWYgKHB0cikJCQkJCQlcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsJCQlcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAkJCVwKLQkmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7CVwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQJCVwKLQkgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwkJCQkJXAotICAgIGlmIChwdHIgJiYgaG93dG9fdGFibGVbcmVsb2Mucl90eXBlXS5wY19yZWxhdGl2ZSkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotCi0vKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gIEZvciBub3JtYWwgaTM4NiBDT0ZGLCB3ZQotICAgY2FuIHVzZSB0aGUgZ2VuZXJpYyByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICBGb3IgUEUsIHdlIG5lZWQgb3VyCi0gICBvd24gcm91dGluZS4gICovCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLQotI2Vsc2UgLyogQ09GRl9XSVRIX1BFICovCi0KLS8qIFRoZSBQRSByZWxvY2F0ZSBzZWN0aW9uIHJvdXRpbmUuICBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcwotICAgYW5kIHRoZSByZWd1bGFyIHJvdXRpbmUgaXMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nIGZvciBhCi0gICByZWxvY2F0ZWFibGUgbGluay4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJICAgICAgIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCQkJICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJICAgICByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKTsKLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBDb252ZXJ0IGFuIHJ0eXBlIHRvIGhvd3RvIGZvciB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICphZGRlbmRwID0gMDsKLSNlbmRpZgotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgLyogSSB0aGluayB3ZSAqZG8qIHdhbnQgdG8gYnlwYXNzIHRoaXMuICBJZiB3ZSBkb24ndCwgSSBoYXZlCi0JIHNlZW4gc29tZSBkYXRhIHBhcmFtZXRlcnMgZ2V0IHRoZSB3cm9uZyByZWxvY2F0aW9uIGFkZHJlc3MuCi0JIElmIEkgbGluayB0d28gdmVyc2lvbnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIHNlY3Rpb24gYnlwYXNzZWQKLQkgYW5kIHRoZW4gZG8gYSBiaW5hcnkgY29tcGFyaXNvbiwgdGhlIGFkZHJlc3NlcyB3aGljaCBhcmUKLQkgZGlmZmVyZW50IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG1hcC4gIFRoZSBjYXNlIGluIHdoaWNoCi0JIHRoaXMgc2VjdGlvbiBoYXMgYmVlbiBieXBhc3NlZCBoYXMgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQKLQkgdG8gdmFsdWVzIEkgY2FuIGZpbmQgaW4gdGhlIG1hcC4gICovCi0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pIAotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IDQ7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIGlmIChyZWwtPnJfdHlwZSA9PSBSX0lNQUdFQkFTRSkKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSBwZV9kYXRhKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gaG93dG87Ci19Ci0KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBjb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAKLQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICtSX0lNQUdFQkFTRTsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfRElSMzI7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX1BDUkxPTkc7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9GQUlMICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotCi0vKiBJZiBpMzg2IGdjYyB1c2VzIHVuZGVyc2NvcmVzIGZvciBzeW1ib2wgbmFtZXMsIHRoZW4gaXQgZG9lcyBub3QgdXNlCi0gICBhIGxlYWRpbmcgZG90IGZvciBsb2NhbCBsYWJlbHMsIHNvIGlmIFRBUkdFVF9VTkRFUlNDT1JFIGlzIGRlZmluZWQKLSAgIHdlIHRyZWF0IGFsbCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggTCBhcyBsb2NhbC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICdMJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2VuZGlmIC8qIFRBUkdFVF9VTkRFUlNDT1JFICovCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pM2NvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgLyogV2UgbmVlZCB0byBoYWNrIGJhZGx5IHRvIGhhbmRsZSBhIFBFIGltYWdlIGNvcnJlY3RseS4gIEluIFBFCi0gICAgIGltYWdlcyBjcmVhdGVkIGJ5IHRoZSBHTlUgbGlua2VyLCB0aGUgb2Zmc2V0IHRvIHRoZSBDT0ZGIGhlYWRlcgotICAgICBpcyBhbHdheXMgdGhlIHNpemUuICBIb3dldmVyLCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiBpbWFnZXMKLSAgICAgZ2VuZXJhdGVkIGJ5IG90aGVyIFBFIGxpbmtlcnMuICBUaGUgUEUgZm9ybWF0IHN0b3JlcyBhIGZvdXIgYnl0ZQotICAgICBvZmZzZXQgdG8gdGhlIFBFIHNpZ25hdHVyZSBqdXN0IGJlZm9yZSB0aGUgQ09GRiBoZWFkZXIgYXQKLSAgICAgbG9jYXRpb24gMHgzYyBvZiB0aGUgZmlsZS4gIFdlIHBpY2sgdXAgdGhhdCBvZmZzZXQsIHZlcmlmeSB0aGF0Ci0gICAgIHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlcmUsIGFuZCB0aGVuIHNldCBvdXJzZWx2ZXMgdXAgdG8gcmVhZCBpbgotICAgICB0aGUgQ09GRiBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX2J5dGUgZXh0X29mZnNldFs0XTsKLSAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgYmZkX2J5dGUgZXh0X3NpZ25hdHVyZVs0XTsKLSAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZTsKLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgMHgzYywgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoZXh0X29mZnNldCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBvZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9vZmZzZXQpOwotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkIChleHRfc2lnbmF0dXJlLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIHNpZ25hdHVyZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X3NpZ25hdHVyZSk7Ci0KLSAgICBpZiAoc2lnbmF0dXJlICE9IDB4NDU1MCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgIC8qIEhlcmUgaXMgdGhlIGhhY2suICBjb2ZmX29iamVjdF9wIHdhbnRzIHRvIHJlYWQgZmlsaHN6IGJ5dGVzIHRvCi0gICAgICAgcGljayB1cCB0aGUgQ09GRiBoZWFkZXIuICBXZSBhZGp1c3Qgc28gdGhhdCB0aGF0IHdpbGwgd29yay4gIDIwCi0gICAgICAgaXMgdGhlIHNpemUgb2YgdGhlIGkzODYgQ09GRiBmaWxlaGRyLiAgKi8KLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAoYmZkX3RlbGwgKGFiZmQpCi0JCSAgIC0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKQotCQkgICArIDIwKSwKLQkJICBTRUVLX1NFVCkKLQkhPSAwKQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci19Ci0KLWNvbnN0IGJmZF90YXJnZXQKLSNpZmRlZiBUQVJHRVRfU1lNCi0gIFRBUkdFVF9TWU0gPQotI2Vsc2UKLSAgaTM4NmNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImNvZmYtaTM4NiIsCQkJLyogbmFtZSAqLwotI2VuZGlmCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1VOREVSU0NPUkUKLSAgVEFSR0VUX1VOREVSU0NPUkUsCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbHNlCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2VuZGlmCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLS8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBpM2NvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIGkzY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTg2MC5jIGIvYmZkL2NvZmYtaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjlmYTQyLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDg2MCBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENyZWF0ZWQgbW9zdGx5IGJ5IHN1YnN0aXR1dGluZyAiODYwIiBmb3IgIjM4NiIgaW4gY29mZi1pMzg2LmMKLSAgIEhhcnJ5IERvbGFuIDxkb2xhbkBzc2QuaW50ZWwuY29tPiwgT2N0b2JlciAxOTk1Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiY29mZi9pODYwLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9pODYwX3JlbG9jIAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2k4NjBfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLS8qIEZvciBzb21lIHJlYXNvbiB3aGVuIHVzaW5nIGk4NjAgQ09GRiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24gc3ltYm9sIGlzIHRoZSB2YWx1ZSBpdHNlbGYgcGx1cwotICAgYW55IGRlc2lyZWQgb2Zmc2V0LiAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl9pODYwX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGFsd2F5cyBlZmZlY3RpdmVseQotCSBpZ25vcmVzIHRoZSBhZGRlbmQgZm9yIGEgQ09GRiB0YXJnZXQgd2hlbiBwcm9kdWNpbmcKLQkgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoaXMgc2VlbXMgdG8gYmUgYWx3YXlzIHdyb25nIGZvciA4NjAKLQkgQ09GRiwgc28gd2UgaGFuZGxlIHRoZSBhZGRlbmQgaGVyZSBpbnN0ZWFkLiAgKi8KLSAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLQotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLSNpZm5kZWYgUENSRUxPRkZTRVQKLSNkZWZpbmUgUENSRUxPRkZTRVQgZmFsc2UKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIHswfSwKLSAgezF9LAotICB7Mn0sCi0gIHszfSwKLSAgezR9LAotICB7NX0sCi0gIEhPV1RPIChSX0RJUjMyLCAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiZGlyMzIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIHs3fSwgKi8KLSAgSE9XVE8gKFJfSU1BR0VCQVNFLCAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAicnZhMzIiLAkgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICB7MDEwfSwKLSAgezAxMX0sCi0gIHswMTJ9LAotICB7MDEzfSwKLSAgezAxNH0sCi0gIHswMTV9LAotICB7MDE2fSwKLSAgSE9XVE8gKFJfUkVMQllURSwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSA4LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIjgiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9SRUxXT1JELAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIjE2IiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUkVMTE9ORywJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICIzMiIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1BDUkJZVEUsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgOCwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJESVNQOCIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSV09SRCwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJESVNQMTYiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1BDUkxPTkcsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jICBudW5tYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHsgeC5yX3R5cGUgPSBob3d0by0+dHlwZTsgfQotI2RlZmluZSBCQURNQUcoeCkgSTg2MEJBRE1BRyh4KQotI2RlZmluZSBJODYwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0JICAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgKGRzdCktPnJfdHlwZTsKLQotLyogRm9yIDg2MCBDT0ZGIGEgU1RZUF9OT0xPQUQgfCBTVFlQX0JTUyBzZWN0aW9uIGlzIHBhcnQgb2YgYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBPbiBzb21lIG90aGVyIENPRkYgdGFyZ2V0cyBTVFlQX0JTUyBpcyBub3JtYWxseQotICAgU1RZUF9OT0xPQUQuICAqLwotI2RlZmluZSBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0KLS8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKLSAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKLSAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAotICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQotICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQotICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQotICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCi0gICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKLSAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgotICAgUEMgcmVsYXRpdmUgcmVsb2NzLgotICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKLSAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAotCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCi0gICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAotCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAotCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCi0gICAgaWYgKHB0ciAmJiBob3d0b190YWJsZVtyZWxvYy5yX3R5cGVdLnBjX3JlbGF0aXZlKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLQotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBob3d0byA9IGhvd3RvX3RhYmxlICsgcmVsLT5yX3R5cGU7Ci0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICAqYWRkZW5kcCArPSBzZWMtPnZtYTsKLQotICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtID09IDAgJiYgc3ltLT5uX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgc2VjdGlvbiBjb250ZW50cyBpbmNsdWRlIHRoZQotCSBzaXplIChzeW0tPm5fdmFsdWUpIGFzIGFuIGFkZGVuZC4gIFRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JIGZ1bmN0aW9uIHdpbGwgYmUgYWRkaW5nIGluIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgV2UKLQkgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBvcmRlciB0byBnZXQgdGhlCi0JIGNvcnJlY3QgcmVzdWx0LiAgKi8KLSAKLSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQotICAgICAgLyogSSB0aGluayB3ZSAqZG8qIHdhbnQgdG8gYnlwYXNzIHRoaXMuICBJZiB3ZSBkb24ndCwgSSBoYXZlIHNlZW4gc29tZSBkYXRhCi0JIHBhcmFtZXRlcnMgZ2V0IHRoZSB3cm9uZyByZWxjYXRpb24gYWRkcmVzcy4gIElmIEkgbGluayB0d28gdmVyc2lvbnMKLQkgd2l0aCBhbmQgd2l0aG91dCB0aGlzIHNlY3Rpb24gYnlwYXNzZWQgYW5kIHRoZW4gZG8gYSBiaW5hcnkgY29tcGFyaXNvbiwKLQkgdGhlIGFkZHJlc3NlcyB3aGljaCBhcmUgZGlmZmVyZW50IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG1hcC4gIFRoZSAKLQkgY2FzZSBpbiB3aGljaCB0aGlzIHNlY3Rpb24gaGFzIGJlZW4gYnlwYXNzZWQgaGFzIGFkZHJlc3NlcyB3aGljaCBjb3JyZXNwb25kCi0JIHRvIHZhbHVlcyBJIGNhbiBmaW5kIGluIHRoZSBtYXAgKi8KLSAgICAgICphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG91dHB1dCBzeW1ib2wgaXMgY29tbW9uIChpbiB3aGljaCBjYXNlIHRoaXMgbXVzdCBiZSBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rKSwgd2UgbmVlZCB0byBhZGQgaW4gdGhlIGZpbmFsIHNpemUgb2YgdGhlCi0gICAgIGNvbW1vbiBzeW1ib2wuICAqLwotICBpZiAoaCAhPSBOVUxMICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikgCi0gICAgKmFkZGVuZHAgKz0gaC0+cm9vdC51LmMuc2l6ZTsKLQotICByZXR1cm4gaG93dG87Ci19Ci0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX2k4NjBfcnR5cGVfdG9faG93dG8KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWkzY29mZl9vYmplY3RfcChhKQotICAgICBiZmQgKmE7Ci17Ci0gIHJldHVybiBjb2ZmX29iamVjdF9wKGEpOwotfQotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIGk4NjBjb2ZmX3ZlYyA9Ci0jZW5kaWYKLXsKLSNpZmRlZiBUQVJHRVRfTkFNRQotICBUQVJHRVRfTkFNRSwKLSNlbHNlCi0gICJjb2ZmLWk4NjAiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLS8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBpM2NvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIGkzY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTk2MC5jIGIvYmZkL2NvZmYtaTk2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ1NWQ5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWk5NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDcwMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgSTk2MCAxCi0jZGVmaW5lIEJBRE1BRyh4KSBJOTYwQkFETUFHKHgpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2k5NjAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgkJLyogdG8gYWxsb3cgZWFzaWVyIGFic3RyYWN0aW9uLWJyZWFraW5nICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgb3B0Y2FsbF9jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9pOTYwX3JlbG9jYXRlCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJvb2xlYW4gKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAxCi0KLSNkZWZpbmUgR0VUX1NDTkhEUl9BTElHTiBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgUFVUX1NDTkhEUl9BTElHTiBiZmRfaF9wdXRfMzIKLQotLyogVGhlIGk5NjAgZG9lcyBub3Qgc3VwcG9ydCBhbiBNTVUsIHNvIENPRkZfUEFHRV9TSVpFIGNhbiBiZQotICAgYXJiaXRyYXJpbHkgc21hbGwuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAxCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0vKiBUaGlzIHNldCBvZiBsb2NhbCBsYWJlbCBuYW1lcyBpcyB0YWtlbiBmcm9tIGdhcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnCi0JICB8fCAobmFtZVswXSA9PSAnLicKLQkgICAgICAmJiAobmFtZVsxXSA9PSAnQycKLQkJICB8fCBuYW1lWzFdID09ICdJJwotCQkgIHx8IG5hbWVbMV0gPT0gJy4nKSkpOwotfQotCi0vKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgdXN1YWwgQ0FMQ19BRERFTkQsIGJ1dCBpdCBpbmNsdWRlcyB0aGUKLSAgIHNlY3Rpb24gVk1BIGZvciBQQyByZWxhdGl2ZSByZWxvY3MuICAqLwotI2lmbmRlZiBDQUxDX0FEREVORAotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocHRyICYmIChyZWxvYy5yX3R5cGUgPT0gMjUgfHwgcmVsb2Mucl90eXBlID09IDI3KSkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0jZW5kaWYKLQotI2RlZmluZSBDQUxMUwkgMHg2NjAwMzgwMAkvKiBUZW1wbGF0ZSBmb3IgJ2NhbGxzJyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUwJIDB4MGIwMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWwnIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIEJBTF9NQVNLIDB4MDBmZmZmZmYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLW9wdGNhbGxfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIFRoaXMgaXRlbSBoYXMgYWxyZWFkeSBiZWVuIHJlbG9jYXRlZCBjb3JyZWN0bHksIGJ1dCB3ZSBtYXkgYmUKLSAgICogYWJsZSB0byBwYXRjaCBpbiB5ZXQgYmV0dGVyIGNvZGUgLSBkb25lIGJ5IGRpZ2dpbmcgb3V0IHRoZQotICAgKiBjb3JyZWN0IGluZm8gb24gdGhpcyBzeW1ib2wgKi8KLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJlc3VsdDsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY3MgPSBjb2Zmc3ltYm9sKHN5bWJvbF9pbik7Ci0KLSAgLyogRG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBzeW1ib2xzIHdoaWNoIGFyZW4ndCB0aWVkIHVwIHlldCwKLSAgICAgZXhjZXB0IG1vdmUgdGhlIHJlbG9jLiAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChjcy0+c3ltYm9sLnNlY3Rpb24pKSB7Ci0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICB9Ci0gICAgCi0gIC8qIFNvIHRoZSB0YXJnZXQgc3ltYm9sIGhhcyB0byBiZSBvZiBjb2ZmIHR5cGUsIGFuZCB0aGUgc3ltYm9sIAotICAgICBoYXMgdG8gaGF2ZSB0aGUgY29ycmVjdCBuYXRpdmUgaW5mb3JtYXRpb24gd2l0aGluIGl0ICovCi0gIGlmICgoYmZkX2FzeW1ib2xfZmxhdm91cigmY3MtPnN5bWJvbCkgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgICB8fCAoY3MtPm5hdGl2ZSA9PSAoY29tYmluZWRfZW50cnlfdHlwZSAqKU5VTEwpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgaW50ZXJlc3RpbmcsIGNvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIHdlJ3JlIG91dHB1dHRpbmcgY29mZgotCSBmcm9tIGEgbWl4IG4gbWF0Y2ggaW5wdXQsIGxpbmtpbmcgZnJvbSBjb2ZmIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCSBib3V0IGZpbGUgd2lsbCBjYXVzZSB0aGlzIG1hdGNoIHRvIGJlIHRydWUuIFNob3VsZCBJIGNvbXBsYWluPyAgVGhpcwotCSB3aWxsIG9ubHkgd29yayBpZiB0aGUgYm91dCBzeW1ib2wgaXMgbm9uIGxlYWYuICAqLwotICAgICAgKmVycm9yX21lc3NhZ2UgPQotCShjaGFyICopIF8oInVuY2VydGFpbiBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIG5vbi1DT0ZGIHN5bWJvbCIpOwotICAgICAgcmVzdWx0ID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgc3dpdGNoIChjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcykgCi0gICAgICB7Ci0gICAgICBjYXNlIENfTEVBRlNUQVQ6Ci0gICAgICBjYXNlIENfTEVBRkVYVDoKLSAgCS8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgbGVhZiBwcm9jZWR1cmUsIHJlcGxhY2UgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhbAotCSAgIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiAgKi8KLQl7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eCA9ICYoKGNzLT5uYXRpdmUrMiktPnUuYXV4ZW50KTsKLQkgIGludCB3b3JkID0gYmZkX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCSAgaW50IG9sZiA9IChhdXgtPnhfYmFsLnhfYmFsbnRyeSAtIGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUpOwotCSAgQkZEX0FTU0VSVChjcy0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eD09Mik7Ci0KLQkgIC8qIFdlIHJlcGxhY2UgdGhlIG9yaWdpbmFsIGNhbGwgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhbCB0bwotCSAgICAgdGhlIGJhbCBlbnRyeSBwb2ludCAtIHRoZSBvZmZzZXQgb2Ygd2hpY2ggaXMgZGVzY3JpYmVkIGluCi0JICAgICB0aGUgMm5kIGF1eGVudCBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sLiBXZSBrZWVwIHRoZSBuYXRpdmUKLQkgICAgIHN5bSBhbmQgYXV4ZW50cyB1bnRvdWNoZWQsIHNvIHRoZSBkZWx0YSBiZXR3ZWVuIHRoZSB0d28KLQkgICAgIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGJhbCBlbnRyeSBwb2ludC4gICovCi0JICB3b3JkID0gKCh3b3JkICsgIG9sZikgICYgQkFMX01BU0spIHwgQkFMOwotICAJICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICAJfQotCXJlc3VsdCA9IGJmZF9yZWxvY19vazsKLQlicmVhazsKLSAgICAgIGNhc2UgQ19TQ0FMTDoKLQkvKiBUaGlzIGlzIGEgY2FsbCB0byBhIHN5c3RlbSBjYWxsLCByZXBsYWNlIHdpdGggYSBjYWxscyB0byAjICovCi0JQkZEX0FTU0VSVCgwKTsKLQlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJlc3VsdCA9IGJmZF9yZWxvY19vazsKLQlicmVhazsKLSAgICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBpOTYwIENPRkYgaXMgdXNlZCBieSBWeFdvcmtzIDUuMS4gIEhvd2V2ZXIsIFZ4V29ya3MgNS4xIGRvZXMgbm90Ci0gICBhcHBlYXIgdG8gY29ycmVjdGx5IGhhbmRsZSBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUKLSAgIHNhbWUgb2JqZWN0IGZpbGUuICBJdCBhcHBlYXJzIHRvIHNpbXBseSBkaXNjYXJkIHN1Y2ggcmVsb2NzLCByYXRoZXIKLSAgIHRoYW4gYWRkaW5nIHRoZWlyIHZhbHVlcyBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFdlIGhhbmRsZSB0aGlzIGhlcmUKLSAgIGJ5IGNvbnZlcnRpbmcgYWxsIHJlbG9jcyBhZ2FpbnN0IGRlZmluZWQgc3ltYm9scyBpbnRvIHJlbG9jcwotICAgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wsIHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQKLSAgIGZpbGUuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSBub3QgdXNpbmcgdGhlIENPRkYKLSAgIHNwZWNpZmljIGJhY2tlbmQgbGlua2VyLiAgSXQgb25seSBkb2VzIHNvbWV0aGluZyB3aGVuIGRvaW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgZmFpbCB3aGVuIG5vdAotICAgZ2VuZXJhdGluZyBDT0ZGIGk5NjAgb3V0cHV0LCBzbyB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IG5vIGxvbmdlcgotICAgdXNlZnVsLiAgSXQgd2FzIHVzZWQgYmVmb3JlIHRoaXMgdGFyZ2V0IHdhcyBjb252ZXJ0ZWQgdG8gdXNlIHRoZQotICAgQ09GRiBzcGVjaWZpYyBiYWNrZW5kIGxpbmtlci4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1jb2ZmX2k5NjBfcmVsb2NhdGUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYXNlY3Rpb24gKm9zZWM7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOb3QgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKSkKLSAgICB7Ci0gICAgICAvKiBTeW1ib2wgaXMgbm90IGRlZmluZWQsIHNvIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgaXQuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKSkKLSAgICB7Ci0gICAgICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhlIHJpZ2h0IGFjdGlvbiBpcyBmb3IgYSBjb21tb24KLSAgICAgICAgIHN5bWJvbC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICAvKiBDb252ZXJ0IHRoZSByZWxvYyB0byB1c2UgdGhlIHNlY3Rpb24gc3ltYm9sLiAgRklYTUU6IFRoaXMgbWV0aG9kCi0gICAgIGlzIHJpZGljdWxvdXMuICAqLwotICBvc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpLT5vdXRwdXRfc2VjdGlvbjsKLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKSAhPSBOVUxMCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhICE9IE5VTEwpCi0gICAgcmVsb2NfZW50cnktPnN5bV9wdHJfcHRyID0KLSAgICAgIChhc3ltYm9sICoqKSBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjX25hbWU7Ci0gICAgICBhc3ltYm9sICoqc3ltcywgKipzeW1fZW5kOwotCi0gICAgICBzZWNfbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBvc2VjKTsKLSAgICAgIHN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpOwotICAgICAgc3ltX2VuZCA9IHN5bXMgKyBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgIGZvciAoOyBzeW1zIDwgc3ltX2VuZDsgc3ltcysrKQotCXsKLQkgIGlmIChiZmRfYXN5bWJvbF9uYW1lICgqc3ltcykgIT0gTlVMTAotCSAgICAgICYmICgqc3ltcyktPnZhbHVlID09IDAKLQkgICAgICAmJiBzdHJjbXAgKCgqc3ltcyktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5uYW1lLAotCQkJIHNlY19uYW1lKSA9PSAwKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzeW1zID49IHN5bV9lbmQpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0ciA9IHN5bXM7Ci0KLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYykgPT0gTlVMTCkKLQl7Ci0JICBvc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgICgoUFRSKSBiZmRfemFsbG9jIChhYmZkLAotCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGlmIChvc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCX0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKS0+dGRhdGEgPSAoUFRSKSBzeW1zOwotICAgIH0KLQotICAvKiBMZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBkbyBpdHMgdGhpbmcsIHdoaWNoIHdpbGwgaW5jbHVkZQotICAgICBzdHVmZmluZyB0aGUgc3ltYm9sIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbGxvbmcgPQotICBIT1dUTyAoKHVuc2lnbmVkIGludCkgUl9SRUxMT05HLCAwLCAyLCAzMixmYWxzZSwgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGNvZmZfaTk2MF9yZWxvY2F0ZSwicmVsbG9uZyIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDApOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9faXBybWVkID0KLSAgSE9XVE8gKFJfSVBSTUVELCAwLCAyLCAyNCx0cnVlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgY29mZl9pOTYwX3JlbG9jYXRlLCAiaXBybWVkICIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDApOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fb3B0Y2FsbCA9Ci0gIEhPV1RPIChSX09QVENBTEwsIDAsMiwyNCx0cnVlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgb3B0Y2FsbF9jYWxsYmFjaywgIm9wdGNhbGwiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCAwKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuICZob3d0b19vcHRjYWxsOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICByZXR1cm4gJmhvd3RvX3JlbGxvbmc7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUENSRUw6Ci0gICAgICByZXR1cm4gJmhvd3RvX2lwcm1lZDsKLSAgICB9Ci19Ci0KLS8qIFRoZSByZWFsIGNvZGUgaXMgaW4gY29mZmNvZGUuaCAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi17CQkJCQkJCVwKLSAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvX3B0cjsJCQkJXAotICAgc3dpdGNoICgoZHN0KS0+cl90eXBlKSB7CQkJCVwKLSAgICAgY2FzZSAxNzogaG93dG9fcHRyID0gJmhvd3RvX3JlbGxvbmc7IGJyZWFrOwlcCi0gICAgIGNhc2UgMjU6IGhvd3RvX3B0ciA9ICZob3d0b19pcHJtZWQ7IGJyZWFrOwkJXAotICAgICBjYXNlIDI3OiBob3d0b19wdHIgPSAmaG93dG9fb3B0Y2FsbDsgYnJlYWs7CVwKLSAgICAgZGVmYXVsdDogaG93dG9fcHRyID0gMDsgYnJlYWs7CQkJXAotICAgICB9CQkJCQkJCVwKLSAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGhvd3RvX3B0cjsJCQlcCi0gfQotCi0vKiBpOTYwIENPRkYgaXMgdXNlZCBieSBWeFdvcmtzIDUuMS4gIEhvd2V2ZXIsIFZ4V29ya3MgNS4xIGRvZXMgbm90Ci0gICBhcHBlYXIgdG8gY29ycmVjdGx5IGhhbmRsZSBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUKLSAgIHNhbWUgb2JqZWN0IGZpbGUuICBJdCBhcHBlYXJzIHRvIHNpbXBseSBkaXNjYXJkIHN1Y2ggcmVsb2NzLCByYXRoZXIKLSAgIHRoYW4gYWRkaW5nIHRoZWlyIHZhbHVlcyBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFdlIGhhbmRsZSB0aGlzIGJ5Ci0gICBjb252ZXJ0aW5nIGFsbCByZWxvY3MgYWdhaW5zdCBnbG9iYWwgc3ltYm9scyBpbnRvIHJlbG9jcyBhZ2FpbnN0Ci0gICBpbnRlcm5hbCBzeW1ib2xzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgcm91dGluZSBpcwotICAgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlua2luZyBwcm9jZXNzLCBhbmQgaXQgY3JlYXRlcyB0aGUKLSAgIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGFzZWN0aW9uICpvOwotICBiZmRfYnl0ZSAqZXN5bTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzeW1lc3opOwotICBpZiAoZXN5bSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0KLSAgICAgIHN0cm5jcHkgKGlzeW0uX24uX25fbmFtZSwgby0+bmFtZSwgU1lNTk1MRU4pOwotICAgICAgaXN5bS5uX3ZhbHVlID0gMDsKLSAgICAgIGlzeW0ubl9zY251bSA9IG8tPnRhcmdldF9pbmRleDsKLSAgICAgIGlzeW0ubl90eXBlID0gVF9OVUxMOwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfU1RBVDsKLSAgICAgIGlzeW0ubl9udW1hdXggPSAwOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZpc3ltLCAoUFRSKSBlc3ltKTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoZXN5bSwgc3ltZXN6LCAxLCBhYmZkKSAhPSBzeW1lc3opCi0JewotCSAgZnJlZSAoZXN5bSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKz0gMTsKLSAgICB9Ci0KLSAgZnJlZSAoZXN5bSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICBib29sZWFuIGRvbmU7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JY2FzZSAxNzogaG93dG8gPSAmaG93dG9fcmVsbG9uZzsgYnJlYWs7Ci0JY2FzZSAyNTogaG93dG8gPSAmaG93dG9faXBybWVkOyBicmVhazsKLQljYXNlIDI3OiBob3d0byA9ICZob3d0b19vcHRjYWxsOyBicmVhazsKLQlkZWZhdWx0OgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBkb25lID0gZmFsc2U7Ci0KLSAgICAgIGlmIChob3d0by0+dHlwZSA9PSBSX09QVENBTEwgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUgJiYgc3ltbmR4ICE9IC0xKQotCXsKLQkgIGludCBjbGFzczsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgY2xhc3MgPSBoLT5jbGFzczsKLQkgIGVsc2UKLQkgICAgY2xhc3MgPSBzeW0tPm5fc2NsYXNzOwotCi0JICBzd2l0Y2ggKGNsYXNzKQotCSAgICB7Ci0JICAgIGNhc2UgQ19OVUxMOgotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGFwcGFyZW50bHkgbm90IGZyb20gYSBDT0ZGIGlucHV0IGZpbGUuCi0gICAgICAgICAgICAgICAgIFdlIHdhcm4sIGFuZCB0aGVuIGFzc3VtZSB0aGF0IGl0IGlzIG5vdCBhIGxlYWYKLSAgICAgICAgICAgICAgICAgZnVuY3Rpb24uICAqLwotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgICAgIChpbmZvLAotCQkgICAgICBfKCJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENfTEVBRlNUQVQ6Ci0JICAgIGNhc2UgQ19MRUFGRVhUOgotCSAgICAgIC8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgbGVhZiBwcm9jZWR1cmU7IHVzZSB0aGUgYmFsCi0gICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICB7Ci0JCWxvbmcgb2xmOwotCQl1bnNpZ25lZCBsb25nIHdvcmQ7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICB7Ci0JCSAgICBCRkRfQVNTRVJUIChoLT5udW1hdXggPT0gMik7Ci0JCSAgICBvbGYgPSBoLT5hdXhbMV0ueF9iYWwueF9iYWxudHJ5OwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGJmZF9ieXRlICplc3ltczsKLQkJICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkJICAgIEJGRF9BU1NFUlQgKHN5bS0+bl9udW1hdXggPT0gMik7Ci0JCSAgICBlc3ltcyA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotCQkgICAgZXN5bXMgKz0gKHN5bW5keCArIDIpICogYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotCQkgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bXMsIHN5bS0+bl90eXBlLAotCQkJCQkgIHN5bS0+bl9zY2xhc3MsIDEsIHN5bS0+bl9udW1hdXgsCi0JCQkJCSAgKFBUUikgJmF1eCk7Ci0JCSAgICBvbGYgPSBhdXgueF9iYWwueF9iYWxudHJ5OwotCQkgIH0KLQotCQl3b3JkID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCSAgIChjb250ZW50cwotCQkJCSAgICArIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSk7Ci0JCXdvcmQgPSAoKHdvcmQgKyBvbGYgLSB2YWwpICYgQkFMX01BU0spIHwgQkFMOwotCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgd29yZCwKLQkJCSAgICAoY29udGVudHMKLQkJCSAgICAgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpOwotCQlkb25lID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ19TQ0FMTDoKLQkgICAgICBCRkRfQVNTRVJUICgwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgZG9uZSkKLQl7Ci0JICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCSAgICBhZGRlbmQgKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywKLQkJCQkJICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJICAgIHZhbCwgYWRkZW5kKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2wgaW5kZXggb2YgYW55IHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHRvCi0gICBpbnN0ZWFkIGJlIGEgcmVsb2MgYWdhaW5zdCB0aGUgaW50ZXJuYWwgc3ltYm9sIHdlIGNyZWF0ZWQgc3BlY2lhbGx5Ci0gICBmb3IgdGhlIHNlY3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCi0gICAgIGJmZCAqb2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICBib29sZWFuICphZGp1c3RlZHA7Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAqYWRqdXN0ZWRwID0gZmFsc2U7Ci0KLSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGliZmQpW2lyZWwtPnJfc3ltbmR4XTsKLSAgaWYgKGggPT0gTlVMTAotICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlyZWwtPnJfc3ltbmR4ID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4IC0gMTsKLSAgKmFkanVzdGVkcCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZQotCi0jZGVmaW5lIGNvZmZfc3RhcnRfZmluYWxfbGluayBjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluawotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbgotCi0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keAotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldCBpY29mZl9saXR0bGVfdmVjID0KLXsKLSAgImNvZmYtSW50ZWwtbGl0dGxlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0KLQotY29uc3QgYmZkX3RhcmdldCBpY29mZl9iaWdfdmVjID0KLXsKLSAgImNvZmYtSW50ZWwtYmlnIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLWJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLWJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW02OGsuYyBiL2JmZC9jb2ZmLW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNmIxNy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA2ODAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL202OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBUaGlzIHNvdXJjZSBmaWxlIGlzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGZvciB2YXJpb3VzIG02OGsgQ09GRgotICAgdmFyaWFudHMuICBUaGUgZm9sbG93aW5nIG1hY3JvcyBjb250cm9sIGl0cyBiZWhhdmlvdXI6Ci0KLSAgIFRBUkdFVF9TWU0KLSAgICAgVGhlIEMgbmFtZSBvZiB0aGUgQkZEIHRhcmdldCB2ZWN0b3IuICBUaGUgZGVmYXVsdCBpcyBtNjhrY29mZl92ZWMuCi0gICBUQVJHRVRfTkFNRQotICAgICBUaGUgdXNlciB2aXNpYmxlIHRhcmdldCBuYW1lLiAgVGhlIGRlZmF1bHQgaXMgImNvZmYtbTY4ayIuCi0gICBOQU1FU19IQVZFX1VOREVSU0NPUkUKLSAgICAgV2hldGhlciBzeW1ib2wgbmFtZXMgaGF2ZSBhbiB1bmRlcnNjb3JlLgotICAgT05MWV9ERUNMQVJFX1JFTE9DUwotICAgICBPbmx5IGRlY2xhcmUgdGhlIHJlbG9jYXRpb24gaG93dG8gYXJyYXkuICBEb24ndCBhY3R1YWxseSBjb21waWxlCi0gICAgIGl0LiAgVGhlIGFjdHVhbCBhcnJheSB3aWxsIGJlIHBpY2tlZCB1cCBpbiBhbm90aGVyIHZlcnNpb24gb2YgdGhlCi0gICAgIGZpbGUuCi0gICBTVEFUSUNfUkVMT0NTCi0gICAgIE1ha2UgdGhlIHJlbG9jYXRpb24gaG93dG8gYXJyYXksIGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9ucywgc3RhdGljLgotICAgQ09GRl9DT01NT05fQURERU5ECi0gICAgIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlbiwgZm9yIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgY29tbW9uCi0gICAgIHN5bWJvbCwgdGhlIG9iamVjdCBmaWxlIGhvbGRzIHRoZSB2YWx1ZSAodGhlIHNpemUpIG9mIHRoZSBjb21tb24KLSAgICAgc3ltYm9sLiAgSWYgdGhpcyBpcyBub3QgZGVmaW5lZCwgdGhlbiwgZm9yIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEKLSAgICAgY29tbW9uIHN5bWJvbCwgdGhlIG9iamVjdCBmaWxlIGhvbGRzIHplcm8uICAqLwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLQotI2lmbmRlZiBDT0ZGX1BBR0VfU0laRQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MjAwMAotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9DT01NT05fQURERU5ECi0jZGVmaW5lIFJFTE9DX1NQRUNJQUxfRk4gMAotI2Vsc2UKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0jZGVmaW5lIFJFTE9DX1NQRUNJQUxfRk4gbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBPbiB0aGUgZGVsdGEsIGEgc3ltYm9sIHN0YXJ0aW5nIHdpdGggTCUgaXMgbG9jYWwuICBXZSB3b24ndCBzZWUKLSAgIHN1Y2ggYSBzeW1ib2wgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyBpdCBzaG91bGQgYmUgc2FmZSB0byBhbHdheXMKLSAgIGNvbnNpZGVyIGl0IGxvY2FsIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyUnKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0KLSNpZm5kZWYgU1RBVElDX1JFTE9DUwotLyogQ2xlYW4gdXAgbmFtZXNwYWNlLiAgKi8KLSNkZWZpbmUgbTY4a2NvZmZfaG93dG9fdGFibGUJX2JmZF9tNjhrY29mZl9ob3d0b190YWJsZQotI2RlZmluZSBtNjhrX3J0eXBlMmhvd3RvCV9iZmRfbTY4a2NvZmZfcnR5cGUyaG93dG8KLSNkZWZpbmUgbTY4a19ob3d0bzJydHlwZQlfYmZkX202OGtjb2ZmX2hvd3RvMnJ0eXBlCi0jZGVmaW5lIG02OGtfcmVsb2NfdHlwZV9sb29rdXAJX2JmZF9tNjhrY29mZl9yZWxvY190eXBlX2xvb2t1cAotI2VuZGlmCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBtNjhrY29mZl9ob3d0b190YWJsZVtdOwotI2Vsc2UKLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotcmVsb2NfaG93dG9fdHlwZSBtNjhrY29mZl9ob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPKFJfUkVMQllURSwJICAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICI4IiwJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMV09SRCwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9ORywJICAgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSQllURSwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIFJFTE9DX1NQRUNJQUxfRk4sICJESVNQOCIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUldPUkQsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiRElTUDE2IiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIkRJU1AzMiIsICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9OR19ORUcsCSAgICAgICAwLCAgLTIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiLTMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotI2VuZGlmIC8qIG5vdCBPTkxZX0RFQ0xBUkVfUkVMT0NTICovCi0KLSNpZm5kZWYgQkFETUFHCi0jZGVmaW5lIEJBRE1BRyh4KSBNNjhLQkFETUFHKHgpCi0jZW5kaWYKLSNkZWZpbmUgTTY4IDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gdm9pZCBtNjhrX3J0eXBlMmhvd3RvIFBBUkFNUyAoKGFyZWxlbnQgKmludGVybmFsLCBpbnQgcmVsb2NlbnRyeSkpOwotZXh0ZXJuIGludCBtNjhrX2hvd3RvMnJ0eXBlIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKikpOwotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotI2Vsc2UKLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotdm9pZAotbTY4a19ydHlwZTJob3d0byhpbnRlcm5hbCwgcmVsb2NlbnRyeSkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIGludCByZWxvY2VudHJ5OwotewotICBzd2l0Y2ggKHJlbG9jZW50cnkpIAotICB7Ci0gICBjYXNlIFJfUkVMQllURToJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAwOyBicmVhazsKLSAgIGNhc2UgUl9SRUxXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDE7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMjsgYnJlYWs7Ci0gICBjYXNlIFJfUENSQllURToJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAzOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDQ7IGJyZWFrOwotICAgY2FzZSBSX1BDUkxPTkc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9OR19ORUc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNjsgYnJlYWs7Ci0gIH0KLX0KLQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi1pbnQgCi1tNjhrX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaW50ZXJuYWw7Ci17Ci0gIGlmIChpbnRlcm5hbC0+cGNfcmVsYXRpdmUpIAotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCi0gICAgewotICAgICBjYXNlIDMyOiByZXR1cm4gUl9QQ1JMT05HOwotICAgICBjYXNlIDE2OiByZXR1cm4gUl9QQ1JXT1JEOwotICAgICBjYXNlIDg6IHJldHVybiBSX1BDUkJZVEU7Ci0gICAgfQotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKLSAgICAgewotICAgICAgY2FzZSAzMjogcmV0dXJuIFJfUkVMTE9ORzsKLSAgICAgIGNhc2UgMTY6IHJldHVybiBSX1JFTFdPUkQ7Ci0gICAgICBjYXNlIDg6IHJldHVybiBSX1JFTEJZVEU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gUl9SRUxMT05HOyAgICAKLX0KLQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi1yZWxvY19ob3d0b190eXBlICoKLW02OGtfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoJCQlyZXR1cm4gTlVMTDsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgkJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMDsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoJCXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDE7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDI7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMzsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNTsKLSAgICAgIC8qIEZJWE1FOiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBjb2RlIGZvciBSX1JFTExPTkdfTkVHLiAgKi8KLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBcCi0gIG02OGtfcnR5cGUyaG93dG8oaW50ZXJuYWwsIChyZWxvY2VudHJ5KS0+cl90eXBlKQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhleHRlcm5hbCwgaW50ZXJuYWwpIFwKLSAgZXh0ZXJuYWwucl90eXBlID0gbTY4a19ob3d0bzJydHlwZSAoaW50ZXJuYWwpCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbTY4a19yZWxvY190eXBlX2xvb2t1cAotCi0jaWZuZGVmIENPRkZfQ09NTU9OX0FEREVORAotI2lmbmRlZiBjb2ZmX3J0eXBlX3RvX2hvd3RvCi0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBtNjhrY29mZl9ydHlwZV90b19ob3d0bwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbTY4a2NvZmZfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbTY4a2NvZmZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICBhcmVsZW50IHJlbGVudDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgUlRZUEUySE9XVE8gKCZyZWxlbnQsIHJlbCk7Ci0KLSAgaG93dG8gPSByZWxlbnQuaG93dG87Ci0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICAqYWRkZW5kcCArPSBzZWMtPnZtYTsKLQotICByZXR1cm4gaG93dG87Ci19Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKGNvZmZfcnR5cGVfdG9faG93dG8pICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChDT0ZGX0NPTU1PTl9BRERFTkQpICovCi0MCi0jaWZkZWYgQ09GRl9DT01NT05fQURERU5ECi0KLS8qIElmIENPRkZfQ09NTU9OX0FEREVORCBpcyBkZWZpbmVkLCB0aGVuIHdoZW4gdXNpbmcgbTY4ayBDT0ZGIHRoZQotICAgdmFsdWUgc3RvcmVkIGluIHRoZSAudGV4dCBzZWN0aW9uIGZvciBhIHJlZmVyZW5jZSB0byBhIGNvbW1vbgotICAgc3ltYm9sIGlzIHRoZSB2YWx1ZSBpdHNlbGYgcGx1cyBhbnkgZGVzaXJlZCBvZmZzZXQuICAodGFrZW4gZnJvbQotICAgd29yayBkb25lIGJ5IElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBmb3IgSTM4NiBDT0ZGKS4gICovCi0KLS8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgbmVlZCB0byBkbyBzb21lCi0gICBhZGp1c3RtZW50cyB0byB0aGUgb2JqZWN0IGZpbGUgdGhhdCBhcmUgbm90IGRvbmUgYnkgdGhlCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZXZlcnkKLSAgIHJlbG9jIHR5cGUgdG8gbWFrZSBhbnkgcmVxdWlyZWQgYWRqdXN0bWVudHMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tNjhrY29mZl9jb21tb25fYWRkZW5kX3NwZWNpYWxfZm4gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkJICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKLQkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCi0JIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKLQkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCi0JIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQotCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCi0JIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQotCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCi0JIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgotCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAotCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KLSAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgZGlmZikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIGlmIChkaWZmICE9IDApCi0gICAgewotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gICAgICB1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotCXsKLQljYXNlIDA6Ci0JICB7Ci0JICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgIERPSVQgKHgpOwotCSAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDE6Ci0JICB7Ci0JICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgRE9JVCAoeCk7Ci0JICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDI6Ci0JICB7Ci0JICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICBET0lUICh4KTsKLQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKLSAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKLSAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAotICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQotICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQotICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQotICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCi0gICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKLSAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgotICAgUEMgcmVsYXRpdmUgcmVsb2NzLgotICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKLSAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAotCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCi0gICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAotCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAotCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCi0gICAgaWYgKHB0ciAmJiAocmVsb2Mucl90eXBlID09IFJfUENSQllURQkJCVwKLQkJfHwgcmVsb2Mucl90eXBlID09IFJfUENSV09SRAkJCVwKLQkJfHwgcmVsb2Mucl90eXBlID09IFJfUENSTE9ORykpCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0KLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotCi0vKiBjb2ZmLW02OGsuYyB1c2VzIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICBXZSBuZWVkIHRvCi0gICBhZGp1c3QgY29tbW9uIHN5bWJvbHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICBhcmVsZW50IHJlbGVudDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgUlRZUEUySE9XVE8gKCZyZWxlbnQsIHJlbCk7Ci0KLSAgaG93dG8gPSByZWxlbnQuaG93dG87Ci0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICAqYWRkZW5kcCArPSBzZWMtPnZtYTsKLQotICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtID09IDAgJiYgc3ltLT5uX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgc2VjdGlvbiBjb250ZW50cyBpbmNsdWRlIHRoZQotCSBzaXplIChzeW0tPm5fdmFsdWUpIGFzIGFuIGFkZGVuZC4gIFRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JIGZ1bmN0aW9uIHdpbGwgYmUgYWRkaW5nIGluIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgV2UKLQkgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBvcmRlciB0byBnZXQgdGhlCi0JIGNvcnJlY3QgcmVzdWx0LiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgKmFkZGVuZHAgKz0gaC0+cm9vdC51LmMuc2l6ZTsKLQotICByZXR1cm4gaG93dG87Ci19Ci0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBtNjhrY29mZl9jb21tb25fYWRkZW5kX3J0eXBlX3RvX2hvd3RvCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKGNvZmZfcnR5cGVfdG9faG93dG8pICovCi0KLSNlbmRpZiAvKiBDT0ZGX0NPTU1PTl9BRERFTkQgKi8KLQwKLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBtNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZQotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jaWZuZGVmIFRBUkdFVF9TWU0KLSNkZWZpbmUgVEFSR0VUX1NZTSBtNjhrY29mZl92ZWMKLSNlbmRpZgotCi0jaWZuZGVmIFRBUkdFVF9OQU1FCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJjb2ZmLW02OGsiCi0jZW5kaWYKLQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfU1lNID0KLXsKLSAgVEFSR0VUX05BTUUsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKLSAgJ18nLAotI2Vsc2UKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZW5kaWYKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW04OGsuYyBiL2JmZC9jb2ZmLW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhMGIwNS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA4ODAwMCBDT0ZGICJCaW5hcnkgQ29tcGF0YWJpbGl0eSBTdGFuZGFyZCIgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBNODggMQkJLyogQ3VzdG9taXplIHZhcmlvdXMgaW5jbHVkZSBmaWxlcyAqLwotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvbTg4ay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBib29sZWFuIG04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG04OGtfc3BlY2lhbF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHJ0eXBlMmhvd3RvIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyB2b2lkIHJlbG9jX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYXJlbGVudCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYXN5bWJvbCAqKiwgYmZkICosIGFzZWN0aW9uICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLSNkZWZpbmUgR0VUX1NDTkhEUl9OUkVMT0MgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIEdFVF9TQ05IRFJfTkxOTk8gYmZkX2hfZ2V0XzMyCi0KLS8qIE9uIGNvZmYtbTg4aywgbG9jYWwgbGFiZWxzIHN0YXJ0IHdpdGggJ0AnLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIG04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZQotCi1zdGF0aWMgYm9vbGVhbgotbTg4a19pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICdAJzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLW04OGtfc3BlY2lhbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQotICBzd2l0Y2ggKGhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSFZSVDE2OgotICAgIGNhc2UgUl9MVlJUMTY6Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlCi0JICAgICByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuCi0JICAgICBNb2RpZnkgdGhlIHJlbG9jIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0JICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQkgIGJmZF92bWEgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotCSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLQotCSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotCSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0JICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0JICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLQkgIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotCSAgaWYgKG91dHB1dF9iZmQpCi0JICAgIG91dHB1dF9iYXNlID0gMDsKLQkgIGVsc2UKLQkgICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0JICByZWxvY2F0aW9uICs9ICgocmVsb2NfZW50cnktPmFkZGVuZCA8PCBob3d0by0+Yml0c2l6ZSkgKyB4KTsKLQotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0KLQkgIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotCSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotCSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLQkgIGlmIChyZWxvY2F0aW9uKQotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyBhZGRyKTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotCSB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZQotCSAgICAgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLgotCSAgICAgTW9kaWZ5IHRoZSByZWxvYyBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0KLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICByZXR1cm4gYmZkX3JlbG9jX29rOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPIChSX1BDUjE2TCwJCQkvKiB0eXBlICovCi0JIDAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1IxNkwiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BDUjI2TCwJCQkvKiB0eXBlICovCi0JIDAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1IyNkwiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAzZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDNmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1ZSVDE2LAkJCS8qIHR5cGUgKi8KLQkgMDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlZSVDE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9IVlJUMTYsCQkJLyogdHlwZSAqLwotCSAxNiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJIVlJUMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0xWUlQxNiwJCQkvKiB0eXBlICovCi0JIDAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxWUlQxNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfVlJUMzIsCQkJLyogdHlwZSAqLwotCSAwMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVlJUMzIiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogQ29kZSB0byB0dXJuIGFuIGV4dGVybmFsIHJfdHlwZSBpbnRvIGEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUKLSAgIGFib3ZlIGhvd3RvIHRhYmxlLiAgKi8KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIGlmIChkc3QtPnJfdHlwZSA+PSBSX1BDUjE2TCAmJiBkc3QtPnJfdHlwZSA8PSBSX1ZSVDMyKQotICAgIHsKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSBob3d0b190YWJsZSArIGRzdC0+cl90eXBlIC0gUl9QQ1IxNkw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyBvZmZzZXQgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8xNgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzE2Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikJXAotICByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmICgoKGludCkgcmVsb2MtPnJfc3ltbmR4KSA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi0jZGVmaW5lIEJBRE1BRyh4KSBNQzg4QkFETUFHKHgpCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI3VuZGVmIGNvZmZfd3JpdGVfYXJtYXAKLQotY29uc3QgYmZkX3RhcmdldCBtODhrYmNzX3ZlYyA9Ci17Ci0gICJjb2ZmLW04OGtiY3MiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1tY29yZS5jIGIvYmZkL2NvZmYtbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlZmViZi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGxhIE1Db3JlIENPRkYvUEUKLSAgIENvcHlyaWdodCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvbWNvcmUuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2lmZGVmIEJBRE1BRwotI3VuZGVmIEJBRE1BRwotI2VuZGlmCi0jZGVmaW5lIEJBRE1BRyh4KSBNQ09SRUJBRE1BRyh4KQotCi0jaWZuZGVmIE5VTV9FTEVNCi0jZGVmaW5lIE5VTV9FTEVNKEEpIChzaXplb2YgKEEpIC8gc2l6ZW9mIChBKVswXSkKLSNlbmRpZgotCi0vKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgbW9yZSB0aGFuIG9uY2UsIGJ1dCB3ZSBvbmx5IGNvbXBpbGUgdGhlCi0gICBmaW5hbF9saW5rIHJvdXRpbmUgb25jZS4gICovCi1leHRlcm4gYm9vbGVhbiBtY29yZV9iZmRfY29mZl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqIGNvZmZfbWNvcmVfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYyAKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICBjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBtY29yZV9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGNvZmZfbWNvcmVfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGJmZF92bWEgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKiAgICAgICAgICAgcGVfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLQotCi0MCi0vKiBUaGUgTlQgbG9hZGVyIHBvaW50cyB0aGUgdG9jIHJlZ2lzdGVyIHRvICZ0b2MgKyAzMjc2OCwgaW4gb3JkZXIgdG8KLSAgIHVzZSB0aGUgY29tcGxldGUgcmFuZ2Ugb2YgYSAxNi1iaXQgZGlzcGxhY2VtZW50LiBXZSBoYXZlIHRvIGFkanVzdAotICAgZm9yIHRoaXMgd2hlbiB3ZSBmaXggdXAgbG9hZHMgZGlzcGxhY2VkIG9mZiB0aGUgdG9jIHJlZy4gICovCi0jZGVmaW5lIFRPQ19MT0FEX0FESlVTVE1FTlQgKC0zMjc2OCkKLSNkZWZpbmUgVE9DX1NFQ1RJT05fTkFNRSAiLnByaXZhdGUudG9jIgotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLQwKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1jb3JlX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURSwvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBkb250IGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBQlNPTFVURSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwLAkgCSAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwgICAgICAgIAkJIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBIT1dUTyAoSU1BR0VfUkVMX01DT1JFX0FERFIzMiwvKiB0eXBlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBRERSMzIiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiA4IGJpdHMgKyAyIHplcm8gYml0czsgam1waS9qc3JpL2xydyBpbnN0cnVjdGlvbnMuCi0gICAgIFNob3VsZCBub3QgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4gKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU04Qlk0LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NOEJZNCIsICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBic3IvYnQvYmYvYnIgaW5zdHJ1Y3Rpb25zOyAxMSBiaXRzICsgMSB6ZXJvIGJpdCAKLSAgICAgU3BhbiAyayBpbnN0cnVjdGlvbnMgPT0gNGsgYnl0ZXMuCi0gICAgIE9ubHkgdXNlZnVsIHBpZWNlcyBhdCB0aGUgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIHRoZSBvcGNvZGUgKDUgYml0cykgKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NMTFCWTIiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA0IGJpdHMgKyAxIHplcm8gYml0OyAnbG9vcHQnIGluc3RydWN0aW9uIG9ubHk7IHVuc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTRCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtY29yZV9jb2ZmX3Vuc3VwcG9ydGVkX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU00QlkyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgcGMtcmVsYXRpdmUuIEV2ZW50dWFsbHkgdGhpcyB3aWxsIGhlbHAgc3VwcG9ydCBQSUMgY29kZS4gKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMiwvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1JFTF8zMiIsCSAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFBDUkVMX0lNTTExQlkyLCB0aGlzIHJlbG9jYXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYQotICAgICAnanNyaScgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiBUaGVyZSBpcyBhIHNlcGFyYXRlIHJlbG9jYXRpb24KLSAgICAgZW50cnkgZm9yIHRoZSBsaXRlcmFsIHBvb2wgZW50cnkgdGhhdCBpdCByZWZlcmVuY2VzLCBidXQgd2UgCi0gICAgIG1pZ2h0IGJlIGFibGUgdG8gY2hhbmdlIHRoZSBqc3JpIHRvIGEgYnNyIGlmIHRoZSB0YXJnZXQgdHVybnMgb3V0Ci0gICAgIHRvIGJlIGNsb3NlIGVub3VnaCBbZXZlbiB0aG91Z2ggd2Ugd29uJ3QgcmVjbGFpbSB0aGUgbGl0ZXJhbCBwb29sCi0gICAgIGVudHJ5LCB3ZSdsbCBnZXQgc29tZSBydW50aW1lIGVmZmljaWVuY3kgYmFja10uIE5vdGUgdGhhdCB0aGlzCi0gICAgIGlzIGEgcmVsb2NhdGlvbiB0aGF0IHdlIGFyZSBhbGxvd2VkIHRvIHNhZmVseSBpZ25vcmUuICAqLyAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkpTUl9JTU0xMUJZMiIsICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBIT1dUTyAoSU1BR0VfUkVMX01DT1JFX1JWQSwgICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJNQ09SRV9SVkEiLCAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotDAotLyogRXh0ZW5kIHRoZSBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUgd2l0aCBhIGZldyBNKkNvcmUgc3BlY2lmaWMgZmllbGRzLgotICAgVGhpcyBhbGxvd3MgdXMgdG8gc3RvcmUgZ2xvYmFsIGRhdGEgaGVyZSB3aXRob3V0IGFjdHVhbGx5IGNyZWF0aW5nIGFueQotICAgZ2xvYmFsIHZhcmlhYmxlcywgd2hpY2ggaXMgYSBuby1ubyBpbiB0aGUgQkZEIHdvcmxkLiAgKi8KLXR5cGVkZWYgc3RydWN0IGNvZmZfbWNvcmVfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBvcmlnaW5hbCBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUuICBNVVNUIGJlIGZpcnN0IGZpZWxkLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCXJvb3Q7Ci0KLSAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICAgYmZkX29mX3RvY19vd25lcjsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RvY19zaXplOwotICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfdGFibGVfc2l6ZTsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdGh1bmtfYWRkcmVzczsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgdGh1bmtfc2l6ZTsKLX0KLW1jb3JlX2hhc2hfdGFibGU7Ci0KLS8qIEdldCB0aGUgTUNvcmUgY29mZiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfbWNvcmVfaGFzaF90YWJsZShpbmZvKSBcCi0gICgobWNvcmVfaGFzaF90YWJsZSAqKSAoKGluZm8pLT5oYXNoKSkKLQotLyogQ3JlYXRlIGFuIE1Db3JlIGNvZmYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWNvZmZfbWNvcmVfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgbWNvcmVfaGFzaF90YWJsZSAqIHJldDsKLQotICByZXQgPSAoKG1jb3JlX2hhc2hfdGFibGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCogcmV0KSkpOwotICBpZiAocmV0ID09IChtY29yZV9oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gICAgICAoJiByZXQtPnJvb3QsIGFiZmQsIF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+YmZkX29mX3RvY19vd25lciA9IE5VTEw7Ci0gIHJldC0+Z2xvYmFsX3RvY19zaXplICA9IDA7Ci0gIHJldC0+aW1wb3J0X3RhYmxlX3NpemUgPSAwOwotICByZXQtPmZpcnN0X3RodW5rX2FkZHJlc3MgPSAwOwotICByZXQtPnRodW5rX3NpemUgPSAwOwotCi0gIHJldHVybiAmIHJldC0+cm9vdC5yb290OwotfQotDAotLypBUkdTVVNFRCovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tY29yZV9jb2ZmX3Vuc3VwcG9ydGVkX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXJlbGVudCAqIHJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICogc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqIGVycm9yX21lc3NhZ2U7Ci17Ci0gIEJGRF9BU1NFUlQgKHJlbG9jX2VudHJ5LT5ob3d0byAhPSAocmVsb2NfaG93dG9fdHlwZSAqKTApOwotICAKLSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPm5hbWUsCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSk7Ci0gIAotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotDAotLyogQSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZS4gKi8KLSNkZWZpbmUgSE9XMk1BUChiZmRfcnR5cGUsIG1jb3JlX3J0eXBlKSAgXAotIGNhc2UgYmZkX3J0eXBlOiByZXR1cm4gJiBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlIFttY29yZV9ydHlwZV0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7IAotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICAgICAgSU1BR0VfUkVMX01DT1JFX0FERFIzMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCwgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNCk7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIsICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIsICAgICAgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTRCWTIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICAgICAgSU1BR0VfUkVMX01DT1JFX1BDUkVMXzMyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIsIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX1JWQSwgICAgICAgICAgICAgICAgICAgICAgSU1BR0VfUkVMX01DT1JFX1JWQSk7Ci0gICBkZWZhdWx0OiAKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotI3VuZGVmIEhPVzJNQVAKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotICAoY2FjaGVfcHRyKS0+aG93dG8gPSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlICsgKGRzdCktPnJfdHlwZTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9tY29yZV9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bTsKLSAgICAgYmZkX3ZtYSAqIGFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLQotCi0gIGlmIChyZWwtPnJfdHlwZSA+PSBOVU1fRUxFTSAobWNvcmVfY29mZl9ob3d0b190YWJsZSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotICBpZiAocmVsLT5yX3R5cGUgPT0gSU1BR0VfUkVMX01DT1JFX1JWQSkKLSAgICAqIGFkZGVuZHAgLT0gcGVfZGF0YSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAKLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICAqIGFkZGVuZHAgPSBzZWMtPnZtYSAtIDI7IC8qIFhYWCBndWVzcyAtIGlzIHRoaXMgcmlnaHQgPyAqLwotICAgICAgCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHRoZW4gdGhlIGdlbmVyaWMgY29kZSBpcyBnb2luZyB0bwotICAgICAgICAgYWRkIGJhY2sgdGhlIHN5bWJvbCB2YWx1ZSBpbiBvcmRlciB0byBjYW5jZWwgb3V0IGFuCi0gICAgICAgICBhZGp1c3RtZW50IGl0IG1hZGUgdG8gdGhlIGFkZGVuZC4gIEhvd2V2ZXIsIHdlIHNldCB0aGUgYWRkZW5kCi0gICAgICAgICB0byAwIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLiAgV2UgbmVlZCB0byBhZGp1c3QgaGVyZSwKLSAgICAgICAgIHRvIGF2b2lkIHRoZSBhZGp1c3RtZW50IHRoZSBnZW5lcmljIGNvZGUgd2lsbCBtYWtlLiAgRklYTUU6Ci0gICAgICAgICBUaGlzIGlzIGdldHRpbmcgYSBiaXQgaGFja2lzaC4gICovCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JKiBhZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICAqIGFkZGVuZHAgPSAwOwotICAKLSAgcmV0dXJuIGhvd3RvOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gc2hvdWxkIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYyBzZWN0aW9uLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZWZlcmVuY2VkIGluIHBlX21rb2JqZWN0IGluIHBlaWNvZGUuaC4gICovCi1zdGF0aWMgYm9vbGVhbgotaW5fcmVsb2NfcCAoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLXsKLSAgcmV0dXJuICEgaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9NQ09SRV9SVkE7Ci19ICAgICAKLQotDAotLyogVGhlIHJlbG9jIHByb2Nlc3Npbmcgcm91dGluZSBmb3IgdGhlIG9wdGltaXplZCBDT0ZGIGxpbmtlci4gICovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiBjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICogc3ltczsKLSAgICAgYXNlY3Rpb24gKiogc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsZW5kOwotICBib29sZWFuIGhpaGFsZjsKLSAgYmZkX3ZtYSBoaWhhbGZfdmFsOwotICAKLSAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhCi0gICAgIHRoaW5nLiAgVGhlIGNhbGxlciB3aWxsIHRha2UgY2FyZSBvZiBhZGp1c3RpbmcgdGhlIHJlbG9jCi0gICAgIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgc2FtZSBlbmRpYW5lc3MgKi8KLSAgaWYgKCAgIGlucHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb3V0cHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4uXG4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLSAgICAgICAgIGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpID8gImJpZyIgOiAibGl0dGxlIiwKLSAgICAgICAgIGJmZF9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSA/ICJiaWciIDogImxpdHRsZSIpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaGloYWxmID0gZmFsc2U7Ci0gIGhpaGFsZl92YWwgPSAwOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIAotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgdG9jX3NlY3Rpb24gPSBOVUxMOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbmR4OwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqICAgICAgIHN5bTsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICB2YWw7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgYWRkZW5kOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICAgIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgIGxvYzsKLSAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICByX3R5cGUgPSByZWwtPnJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgICBob3d0byA9IE5VTEw7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgaDsKLSAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICBteV9uYW1lOwotICAKLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0gICAgICBsb2MgPSBjb250ZW50cyArIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogR2V0IHRoZSBob3d0byBhbmQgaW5pdGlhbGlzZSB0aGUgYWRkZW5kLiAgKi8KLSAgICAgIGhvd3RvID0gYmZkX2NvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICYgYWRkZW5kKTsKLSAgICAgIGlmIChob3d0byA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdmFsID0gMDsKLSAgICAgIAotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICBteV9uYW1lID0gIipBQlMqIjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICogc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLQkgICAgICAKLQkgICAgICB2YWwgPSAoc3ltLT5uX3ZhbHVlIAotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCi0JICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCQlteV9uYW1lID0gIip1bmtub3duKiI7Ci0JICAgICAgZWxzZSBpZiAoICAgc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JCSAgICAgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JCW15X25hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgICBlbHNlIAotCQl7Ci0JCSAgc3RhdGljIGNoYXIgYnVmIFtTWU1OTUxFTiArIDFdOwotCQkgIAotCQkgIHN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JCSAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JCSAgbXlfbmFtZSA9IGJ1ZjsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICggICBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICogc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIAotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAKLQkgIG15X25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCX0JCi0KLSAgICAgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotICAgICAgCi0gICAgICAvKiBFYWNoIGNhc2UgbXVzdCBkbyBpdHMgb3duIHJlbG9jYXRpb24sIHNldHRpbmcgcnN0YXQgYXBwcm9wcmlhdGVseS4gICovCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKLQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQkgIAotCWNhc2UgSU1BR0VfUkVMX01DT1JFX0FCU09MVVRFOgotCSAgZnByaW50ZiAoc3RkZXJyLCAKLQkJICAgXygiV2FybmluZzogdW5zdXBwb3J0ZWQgcmVsb2MgJXMgPGZpbGUgJXMsIHNlY3Rpb24gJXM+XG4iKSwgCi0JCSAgIGhvd3RvLT5uYW1lLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkgICBpbnB1dF9zZWN0aW9uLT5uYW1lKTsKLQkgIAotCSAgZnByaW50ZiAoc3RkZXJyLCJzeW0gJWxkICglcyksIHJfdmFkZHIgJWxkICglbHgpXG4iLCAKLQkJICAgcmVsLT5yX3N5bW5keCwgbXlfbmFtZSwgKGxvbmcpIHJlbC0+cl92YWRkciwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkcik7ICAKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNDoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyOgotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMXzMyOgotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9BRERSMzI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUlZBOgotCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCB2YWwsIGxvYyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIAotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JICAKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywgbXlfbmFtZSwgaG93dG8tPm5hbWUsIAotCQkgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykge2ludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlO30KLQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAgICAgICAgICAgICAgIDB4MTAwMAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQwKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXBlX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAvKiBXZSBuZWVkIHRvIGhhY2sgYmFkbHkgdG8gaGFuZGxlIGEgUEUgaW1hZ2UgY29ycmVjdGx5LiAgSW4gUEUKLSAgICAgaW1hZ2VzIGNyZWF0ZWQgYnkgdGhlIEdOVSBsaW5rZXIsIHRoZSBvZmZzZXQgdG8gdGhlIENPRkYgaGVhZGVyCi0gICAgIGlzIGFsd2F5cyB0aGUgc2l6ZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlIGluIGltYWdlcwotICAgICBnZW5lcmF0ZWQgYnkgb3RoZXIgUEUgbGlua2Vycy4gIFRoZSBQRSBmb3JtYXQgc3RvcmVzIGEgZm91ciBieXRlCi0gICAgIG9mZnNldCB0byB0aGUgUEUgc2lnbmF0dXJlIGp1c3QgYmVmb3JlIHRoZSBDT0ZGIGhlYWRlciBhdAotICAgICBsb2NhdGlvbiAweDNjIG9mIHRoZSBmaWxlLiAgV2UgcGljayB1cCB0aGF0IG9mZnNldCwgdmVyaWZ5IHRoYXQKLSAgICAgdGhlIFBFIHNpZ25hdHVyZSBpcyB0aGVyZSwgYW5kIHRoZW4gc2V0IG91cnNlbHZlcyB1cCB0byByZWFkIGluCi0gICAgIHRoZSBDT0ZGIGhlYWRlci4gICovCi0gIHsKLSAgICBiZmRfYnl0ZSBleHRfb2Zmc2V0WzRdOwotICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICBiZmRfYnl0ZSBleHRfc2lnbmF0dXJlWzRdOwotICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlOwotCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAweDNjLCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkIChleHRfb2Zmc2V0LCAxLCA0LCBhYmZkKSAhPSA0KQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIAotICAgIG9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X29mZnNldCk7Ci0gICAgCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JfHwgYmZkX3JlYWQgKGV4dF9zaWduYXR1cmUsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCi0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgCi0gICAgc2lnbmF0dXJlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHRfc2lnbmF0dXJlKTsKLQotICAgIGlmIChzaWduYXR1cmUgIT0gMHg0NTUwKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotCi0gICAgLyogSGVyZSBpcyB0aGUgaGFjay4gIGNvZmZfb2JqZWN0X3Agd2FudHMgdG8gcmVhZCBmaWxoc3ogYnl0ZXMgdG8KLSAgICAgICBwaWNrIHVwIHRoZSBDT0ZGIGhlYWRlci4gIFdlIGFkanVzdCBzbyB0aGF0IHRoYXQgd2lsbCB3b3JrLiAgMjAKLSAgICAgICBpcyB0aGUgc2l6ZSBvZiB0aGUgbWlwcyBDT0ZGIGZpbGVoZHIuICAqLwotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGJmZF90ZWxsIChhYmZkKSAtIGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkgKyAyMCksCi0JCSAgU0VFS19TRVQpICE9IDApCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCi0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQwKLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3JzIHRoYXQgbGVhZCB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotCi1jb25zdCBiZmRfdGFyZ2V0Ci1UQVJHRVRfQklHX1NZTSA9Ci17Ci0gIFRBUkdFVF9CSUdfTkFNRSwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCQotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgcGVfb2JqZWN0X3AsIAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgCS8qIF9iZmRfZHVtbXlfdGFyZ2V0ICovCi0gICAgcGVfb2JqZWN0X3AKLSAgfSwKLSAgeyBiZmRfZmFsc2UsCi0gICAgY29mZl9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UKLSAgfSwKLSAgeyBiZmRfZmFsc2UsCi0gICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQKLVRBUkdFVF9MSVRUTEVfU1lNID0KLXsKLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0gIAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLS8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBwZV9vYmplY3RfcCwgCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAotICAgIHBlX29iamVjdF9wCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgY29mZl9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbWlwcy5jIGIvYmZkL2NvZmYtbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTFlYjg2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MjYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNSVBTIEV4dGVuZGVkLUNvZmYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgT3JpZ2luYWwgdmVyc2lvbiBieSBQZXIgQm90aG5lci4KLSAgIEZ1bGwgc3VwcG9ydCBhZGRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBpYW5AY3lnbnVzLmNvbS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9taXBzLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gbWlwc19lY29mZl9iYWRfZm9ybWF0X2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOwotc3RhdGljIHZvaWQgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgICAgICBQVFIpKTsKLXN0YXRpYyB2b2lkIG1pcHNfYWRqdXN0X3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgIGFyZWxlbnQgKikpOwotc3RhdGljIHZvaWQgbWlwc19hZGp1c3RfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZ2VuZXJpY19yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJCSBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJIFBUUiBkYXRhLAotCQkJCQkJCSBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCQkgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCSBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19yZWZoaV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19yZWZsb19yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19ncHJlbF9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19yZWxoaV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19yZWxsb19yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19zd2l0Y2hfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJCWFyZWxlbnQgKnJlbG9jLAotCQkJCQkJCWFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQlQVFIgZGF0YSwKLQkJCQkJCQlhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCQliZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX3JlbG9jYXRlX2hpIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmaGksCi0JCQkJICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWZsbywKLQkJCQkgICAgICBiZmQgKmlucHV0X2JmZCwKLQkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0JCQkJICAgICAgc2l6ZV90IGFkanVzdCwKLQkJCQkgICAgICBiZmRfdm1hIHJlbG9jYXRpb24sCi0JCQkJICAgICAgYm9vbGVhbiBwY3JlbCkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYmZkX2J5dGUgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlYWRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlbGF4X3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19yZWxheF9wY3JlbDE2IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCQkgICBhc2VjdGlvbiAqLAotCQkJCQkgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCSAgIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0KLQwKLS8qIEVDT0ZGIGhhcyBDT0ZGIHNlY3Rpb25zLCBidXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4KLSAgIGEgY29tcGxldGVseSBkaWZmZXJlbnQgZm9ybWF0LiAgRUNPRkYgdGFyZ2V0cyB1c2Ugc29tZSBvZiB0aGUKLSAgIHN3YXBwaW5nIHJvdXRpbmVzIGZyb20gY29mZnN3YXAuaCwgYW5kIHNvbWUgb2YgdGhlIGdlbmVyaWMgQ09GRgotICAgcm91dGluZXMgaW4gY29mZmdlbi5jLCBidXQsIHVubGlrZSB0aGUgcmVhbCBDT0ZGIHRhcmdldHMsIGRvIG5vdAotICAgdXNlIGNvZmZjb2RlLmggaXRzZWxmLgotCi0gICBHZXQgdGhlIGdlbmVyaWMgQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZXhjZXB0IGZvciB0aGUgcmVsb2MsCi0gICBzeW1ib2wsIGFuZCBsaW5lbm8gb25lcy4gIEdpdmUgdGhlbSBFQ09GRiBuYW1lcy4gICovCi0jZGVmaW5lIE1JUFNFQ09GRgotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX2luIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX291dCBtaXBzX2Vjb2ZmX3N3YXBfZmlsZWhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfaW4gbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfb3V0IG1pcHNfZWNvZmZfc3dhcF9hb3V0aGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX2luIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9vdXQgbWlwc19lY29mZl9zd2FwX3Njbmhkcl9vdXQKLSNpbmNsdWRlICJjb2Zmc3dhcC5oIgotCi0vKiBHZXQgdGhlIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLSNkZWZpbmUgRUNPRkZfMzIKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jcyB0eXBlcy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFJlbG9jIHR5cGUgMCBpcyBpZ25vcmVkLiAgVGhlIHJlbG9jIHJlYWRpbmcgY29kZSBlbnN1cmVzIHRoYXQKLSAgICAgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgLmFicyBzZWN0aW9uLCB3aGljaCB3aWxsIGNhdXNlCi0gICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gdG8gZG8gbm90aGluZy4gICovCi0gIEhPV1RPIChNSVBTX1JfSUdOT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJR05PUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbCwgbm9ybWFsbHkgZnJvbSBhIGRhdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGSEFMRiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZIQUxGIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLCBub3JtYWxseSBmcm9tIGEgZGF0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZXT1JELAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRldPUkQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjYgYml0IGFic29sdXRlIGp1bXAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChNSVBTX1JfSk1QQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJKTVBBRERSIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggMTYgYml0cyBvZiBhIHN5bWJvbCB2YWx1ZS4gIEhhbmRsZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgIG1pcHNfcmVmaGlfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkhJLAkJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVmaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkhJIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIGEgc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZMTywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19yZWZsb19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE8iLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZmVyZW5jZSB0byBhbiBvZmZzZXQgZnJvbSB0aGUgZ3AgcmVnaXN0ZXIuICBIYW5kbGVkIGJ5IHRoZQotICAgICBmdW5jdGlvbiBtaXBzX2dwcmVsX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9HUFJFTCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dwcmVsX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVmZXJlbmNlIHRvIGEgbGl0ZXJhbCB1c2luZyBhbiBvZmZzZXQgZnJvbSB0aGUgZ3AgcmVnaXN0ZXIuCi0gICAgIEhhbmRsZWQgYnkgdGhlIGZ1bmN0aW9uIG1pcHNfZ3ByZWxfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dwcmVsX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgeyA4IH0sCi0gIHsgOSB9LAotICB7IDEwIH0sCi0gIHsgMTEgfSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhIDE2IGJpdCBQQwotICAgICByZWxhdGl2ZSByZWxvYyByaWdodHNoaWZ0ZWQgdHdpY2UgYXMgdXNlZCBpbiB0aGUgTUlQUyBicmFuY2gKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9QQ1JFTDE2LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBDUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyB0aGUgaGlnaCAxNgotICAgICBiaXRzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MuICBUaGUgbmV4dCByZWxvYyBtdXN0IGJlCi0gICAgIE1JUFNfUl9SRUxMTywgYW5kIHRoZSBhZGRlbmQgaXMgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgdGhlCi0gICAgIHR3byBpbnN0cnVjdGlvbnMsIGp1c3QgYXMgaW4gTUlQU19SX1JFRkhJIGFuZCBNSVBTX1JfUkVGTE8uICBUaGUKLSAgICAgZmluYWwgdmFsdWUgaXMgYWN0dWFsbHkgUEMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIG5vdCB0aGUgTUlQU19SX1JFTEhJIHJlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUxISSwJCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVsaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTEhJIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgdGhlIGxvdyAxNgotICAgICBiaXRzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX1JFTExPLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVsbG9fcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTExPIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgeyAxNSB9LAotICB7IDE2IH0sCi0gIHsgMTcgfSwKLSAgeyAxOCB9LAotICB7IDE5IH0sCi0gIHsgMjAgfSwKLSAgeyAyMSB9LAotCi0gIC8qIFRoaXMgcmVsb2MgaXMgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uCi0gICAgIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBJdCByZXByZXNlbnRzIGFuIGVudHJ5IGluCi0gICAgIGEgc3dpdGNoIHRhYmxlLCB3aGljaCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBzeW1ib2xzIGluCi0gICAgIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhlIHN5bW5keCBpcyBhY3R1YWxseSB0aGUgb2Zmc2V0IGZyb20gdGhlCi0gICAgIHJlbG9jIGFkZHJlc3MgdG8gdGhlIHN1YnRyYWhlbmQuICBTZWUgaW5jbHVkZS9jb2ZmL21pcHMuaCBmb3IKLSAgICAgbW9yZSBkZXRhaWxzLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9TV0lUQ0gsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19zd2l0Y2hfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNXSVRDSCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLSNkZWZpbmUgTUlQU19IT1dUT19DT1VOVCBcCi0gIChzaXplb2YgbWlwc19ob3d0b190YWJsZSAvIHNpemVvZiBtaXBzX2hvd3RvX3RhYmxlWzBdKQotCi0vKiBXaGVuIHRoZSBsaW5rZXIgaXMgZG9pbmcgcmVsYXhpbmcsIGl0IG1heSBjaGFuZ2UgYSBleHRlcm5hbCBQQ1JFTDE2Ci0gICByZWxvYy4gIFRoaXMgdHlwaWNhbGx5IHJlcHJlc2VudHMgYW4gaW5zdHJ1Y3Rpb24gbGlrZQotICAgICAgIGJhbCBmb28KLSAgIFdlIGNoYW5nZSBpdCB0bwotICAgICAgIC5zZXQgIG5vcmVvcmRlcgotICAgICAgIGJhbCAgICRMMQotICAgICAgIGx1aSAgICRhdCwlaGkoZm9vIC0gJEwxKQotICAgICAkTDE6Ci0gICAgICAgYWRkaXUgJGF0LCVsbyhmb28gLSAkTDEpCi0gICAgICAgYWRkdSAgJGF0LCRhdCwkMzEKLSAgICAgICBqYWxyICAkYXQKLSAgIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGlzIGNoYW5nZXMgdGhlCi0gICBpbnN0cnVjdGlvbiBieS4gICovCi0KLSNkZWZpbmUgUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVCAoNCAqIDQpCi0MCi0vKiBTZWUgd2hldGhlciB0aGUgbWFnaWMgbnVtYmVyIG1hdGNoZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lY29mZl9iYWRfZm9ybWF0X2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX21hZ2ljKQotICAgIHsKLSAgICBjYXNlIE1JUFNfTUFHSUNfMToKLSAgICAgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IGVuZGlhbm5lc3MgdGhpcyBpbXBsaWVzLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzoKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHMjoKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHMzoKLSAgICAgIHJldHVybiBiZmRfYmlnX2VuZGlhbiAoYWJmZCk7Ci0KLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFOgotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEUyOgotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEUzOgotICAgICAgcmV0dXJuIGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotDAotLyogUmVsb2MgaGFuZGxpbmcuICBNSVBTIEVDT0ZGIHJlbG9jcyBhcmUgcGFja2VkIGludG8gOCBieXRlcyBpbgotICAgZXh0ZXJuYWwgZm9ybS4gIFRoZXkgdXNlIGEgYml0IHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzeW1ib2wKLSAgIGlzIGV4dGVybmFsLiAgKi8KLQotLyogU3dhcCBhIHJlbG9jIGluLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXh0X3B0ciwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybjsKLXsKLSAgY29uc3QgUkVMT0MgKmV4dCA9IChSRUxPQyAqKSBleHRfcHRyOwotCi0gIGludGVybi0+cl92YWRkciA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cl92YWRkcik7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGludGVybi0+cl9zeW1uZHggPSAoKChpbnQpIGV4dC0+cl9iaXRzWzBdCi0JCQkgICA8PCBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9CSUcpCi0JCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzFdCi0JCQkgICAgIDw8IFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0JJRykKLQkJCSAgfCAoKGludCkgZXh0LT5yX2JpdHNbMl0KLQkJCSAgICAgPDwgUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfQklHKSk7Ci0gICAgICBpbnRlcm4tPnJfdHlwZSA9ICgoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19UWVBFX0JJRykKLQkJCT4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHKTsKLSAgICAgIGludGVybi0+cl9leHRlcm4gPSAoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fQklHKSAhPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybi0+cl9zeW1uZHggPSAoKChpbnQpIGV4dC0+cl9iaXRzWzBdCi0JCQkgICA8PCBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9MSVRUTEUpCi0JCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzFdCi0JCQkgICAgIDw8IFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0xJVFRMRSkKLQkJCSAgfCAoKGludCkgZXh0LT5yX2JpdHNbMl0KLQkJCSAgICAgPDwgUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfTElUVExFKSk7Ci0gICAgICBpbnRlcm4tPnJfdHlwZSA9ICgoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9MSVRUTEUpCi0JCQkgPj4gUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUpCi0JCQl8ICgoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19UWVBFSElfTElUVExFKQotCQkJICAgPDwgUkVMT0NfQklUUzNfVFlQRUhJX1NIX0xJVFRMRSkpOwotICAgICAgaW50ZXJuLT5yX2V4dGVybiA9IChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX0VYVEVSTl9MSVRUTEUpICE9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCByX3N5bW5keCBpcyBhY3R1YWxseSB0aGUgb2Zmc2V0IGZyb20gdGhlCi0gICAgIHJlbG9jIGFkZHJlc3MgdG8gdGhlIGJhc2Ugb2YgdGhlIGRpZmZlcmVuY2UgKHNlZQotICAgICBpbmNsdWRlL2NvZmYvbWlwcy5oIGZvciBtb3JlIGRldGFpbHMpLiAgV2UgY29weSBzeW1uZHggaW50byB0aGUKLSAgICAgcl9vZmZzZXQgZmllbGQgc28gYXMgbm90IHRvIGNvbmZ1c2UgZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgaW4KLSAgICAgZWNvZmYuYy4gIEluIGFkanVzdF9yZWxvY19pbiB3ZSB0aGVuIGNvcHkgcl9vZmZzZXQgaW50byB0aGUgcmVsb2MKLSAgICAgYWRkZW5kLiAgKi8KLSAgaWYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9TV0lUQ0gKLSAgICAgIHx8ICghIGludGVybi0+cl9leHRlcm4KLQkgICYmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfUkVMTE8KLQkgICAgICB8fCBpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpKSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICghIGludGVybi0+cl9leHRlcm4pOwotICAgICAgaW50ZXJuLT5yX29mZnNldCA9IGludGVybi0+cl9zeW1uZHg7Ci0gICAgICBpZiAoaW50ZXJuLT5yX29mZnNldCAmIDB4ODAwMDAwKQotCWludGVybi0+cl9vZmZzZXQgLT0gMHgxMDAwMDAwOwotICAgICAgaW50ZXJuLT5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKLSAgICB9Ci19Ci0KLS8qIFN3YXAgYSByZWxvYyBvdXQuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgaW50ZXJuLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIFJFTE9DICpleHQgPSAoUkVMT0MgKikgZHN0OwotICBsb25nIHJfc3ltbmR4OwotCi0gIEJGRF9BU1NFUlQgKGludGVybi0+cl9leHRlcm4KLQkgICAgICB8fCAoaW50ZXJuLT5yX3N5bW5keCA+PSAwICYmIGludGVybi0+cl9zeW1uZHggPD0gMTIpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgTUlQU19SX1NXSVRDSCByZWxvYywgb3IgYW4gaW50ZXJuYWwgTUlQU19SX1JFTExPIG9yCi0gICAgIE1JUFNfUl9SRUxISSByZWxvYywgd2UgYWN0dWFsbHkgd2FudCB0byB3cml0ZSB0aGUgY29udGVudHMgb2YKLSAgICAgcl9vZmZzZXQgb3V0IGFzIHRoZSBzeW1ib2wgaW5kZXguICBUaGlzIHVuZG9lcyB0aGUgY2hhbmdlIG1hZGUgYnkKLSAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLSAgaWYgKGludGVybi0+cl90eXBlICE9IE1JUFNfUl9TV0lUQ0gKLSAgICAgICYmIChpbnRlcm4tPnJfZXh0ZXJuCi0JICB8fCAoaW50ZXJuLT5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCi0JICAgICAgJiYgaW50ZXJuLT5yX3R5cGUgIT0gTUlQU19SX1JFTExPKSkpCi0gICAgcl9zeW1uZHggPSBpbnRlcm4tPnJfc3ltbmR4OwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX1RFWFQpOwotICAgICAgcl9zeW1uZHggPSBpbnRlcm4tPnJfb2Zmc2V0ICYgMHhmZmZmZmY7Ci0gICAgfQotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yX3ZhZGRyLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0LT5yX2JpdHNbMF0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPnJfYml0c1sxXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+cl9iaXRzWzJdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5yX2JpdHNbM10gPSAoKChpbnRlcm4tPnJfdHlwZSA8PCBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRykKLQkJCSAmIFJFTE9DX0JJVFMzX1RZUEVfQklHKQotCQkJfCAoaW50ZXJuLT5yX2V4dGVybiA/IFJFTE9DX0JJVFMzX0VYVEVSTl9CSUcgOiAwKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0LT5yX2JpdHNbMF0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPnJfYml0c1sxXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+cl9iaXRzWzJdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5yX2JpdHNbM10gPSAoKChpbnRlcm4tPnJfdHlwZSA8PCBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRSkKLQkJCSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkJfCAoKGludGVybi0+cl90eXBlID4+IFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUKLQkJCSAgICAmIFJFTE9DX0JJVFMzX1RZUEVISV9MSVRUTEUpKQotCQkJfCAoaW50ZXJuLT5yX2V4dGVybiA/IFJFTE9DX0JJVFMzX0VYVEVSTl9MSVRUTEUgOiAwKSk7Ci0gICAgfQotfQotCi0vKiBGaW5pc2ggY2Fub25pY2FsaXppbmcgYSByZWxvYy4gIFBhcnQgb2YgdGhpcyBpcyBnZW5lcmljIHRvIGFsbAotICAgRUNPRkYgdGFyZ2V0cywgYW5kIHRoYXQgcGFydCBpcyBpbiBlY29mZi5jLiAgVGhlIHJlc3QgaXMgZG9uZSBpbgotICAgdGhpcyBiYWNrZW5kIHJvdXRpbmUuICBJdCBtdXN0IGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfYWRqdXN0X3JlbG9jX2luIChhYmZkLCBpbnRlcm4sIHJwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci0gICAgIGFyZWxlbnQgKnJwdHI7Ci17Ci0gIGlmIChpbnRlcm4tPnJfdHlwZSA+IE1JUFNfUl9TV0lUQ0gpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKCEgaW50ZXJuLT5yX2V4dGVybgotICAgICAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9HUFJFTAotCSAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX0xJVEVSQUwpKQotICAgIHJwdHItPmFkZGVuZCArPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0KLSAgLyogSWYgdGhlIHR5cGUgaXMgTUlQU19SX0lHTk9SRSwgbWFrZSBzdXJlIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLSAgICAgdGhlIGFic29sdXRlIHNlY3Rpb24gc28gdGhhdCB0aGUgcmVsb2MgaXMgaWdub3JlZC4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfSUdOT1JFKQotICAgIHJwdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxISSBvcgotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIHdlIHdhbnQgdGhlIGFkZGVuZCBmaWVsZCBvZiB0aGUgQkZEIHJlbG9jdG8KLSAgICAgaG9sZCB0aGUgdmFsdWUgd2hpY2ggd2FzIG9yaWdpbmFsbHkgaW4gdGhlIHN5bW5keCBmaWVsZCBvZiB0aGUKLSAgICAgaW50ZXJuYWwgTUlQUyBFQ09GRiByZWxvYy4gIFRoaXMgdmFsdWUgd2FzIGNvcGllZCBpbnRvCi0gICAgIGludGVybi0+cl9vZmZzZXQgYnkgbWlwc19zd2FwX3JlbG9jX2luLCBhbmQgaGVyZSB3ZSBjb3B5IGl0IGludG8KLSAgICAgdGhlIGFkZGVuZCBmaWVsZC4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICi0gICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJCi0JICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPKSkpCi0gICAgcnB0ci0+YWRkZW5kID0gaW50ZXJuLT5yX29mZnNldDsKLQotICBycHRyLT5ob3d0byA9ICZtaXBzX2hvd3RvX3RhYmxlW2ludGVybi0+cl90eXBlXTsKLX0KLQotLyogTWFrZSBhbnkgYWRqdXN0bWVudHMgbmVlZGVkIHRvIGEgcmVsb2MgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgTm9uZQotICAgYXJlIG5lZWRlZCBmb3IgTUlQUy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2FkanVzdF9yZWxvY19vdXQgKGFiZmQsIHJlbCwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGFyZWxlbnQgKnJlbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIC8qIEZvciBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxISSBvcgotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIHdlIG11c3QgY29weSByZWwtPmFkZGVuZCBpbnRvCi0gICAgIGludGVybi0+cl9vZmZzZXQuICBUaGlzIHdpbGwgdGhlbiBiZSB3cml0dGVuIG91dCBhcyB0aGUgc3ltYm9sCi0gICAgIGluZGV4IGJ5IG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQuICBUaGlzIG9wZXJhdGlvbiBwYXJhbGxlbHMgdGhlCi0gICAgIGFjdGlvbiBvZiBtaXBzX2FkanVzdF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICi0gICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJCi0JICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPKSkpCi0gICAgaW50ZXJuLT5yX29mZnNldCA9IHJlbC0+YWRkZW5kOwotfQotCi0vKiBFQ09GRiByZWxvY3MgYXJlIGVpdGhlciBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMsIG9yIGFnYWluc3QKLSAgIHNlY3Rpb25zLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgdGhlIHJlbG9jCi0gICBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcgaGFzIGdpdmVuIHVzIGFueQotICAgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvIGJlIGFnYWluc3QgdGhlCi0gICBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZwotICAgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbCBhbGwgYmUgZG9uZSBhdAotICAgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlIGludG8KLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLAotCQkgICAgcmVsb2NfZW50cnksCi0JCSAgICBzeW1ib2wsCi0JCSAgICBkYXRhLAotCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsCi0JCSAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBEbyBhIFJFRkhJIHJlbG9jYXRpb24uICBUaGlzIGhhcyB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYQotICAgUkVGTE8gcmVsb2MsIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBSRUZMTyB0byB0aGUgUkVGSEkuCi0gICBIZXJlIHdlIGp1c3Qgc2F2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZDsgd2UgZG8gdGhlIGFjdHVhbAotICAgcmVsb2NhdGlvbiB3aGVuIHdlIHNlZSB0aGUgUkVGTE8uICBNSVBTIEVDT0ZGIHJlcXVpcmVzIHRoYXQgdGhlCi0gICBSRUZMTyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIFJFRkhJLiAgQXMgYSBHTlUgZXh0ZW5zaW9uLCB3ZSBwZXJtaXQKLSAgIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkgcmVsb2NzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBMTwotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpCi17Ci0gIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotICBiZmRfYnl0ZSAqYWRkcjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGEgc3RhdGljIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX2hpICptaXBzX3JlZmhpX2xpc3Q7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtaXBzX2hpICpuOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIHJldCA9IGJmZF9yZWxvY19vazsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBSRUZMTyBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLwotICBuID0gKHN0cnVjdCBtaXBzX2hpICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG1pcHNfcmVmaGlfbGlzdDsKLSAgbWlwc19yZWZoaV9saXN0ID0gbjsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBEbyBhIFJFRkxPIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIDE2IGJpdCBpbnBsYWNlCi0gICByZWxvY2F0aW9uOyB0aGlzIGZ1bmN0aW9uIGV4aXN0cyBpbiBvcmRlciB0byBkbyB0aGUgUkVGSEkKLSAgIHJlbG9jYXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19yZWZsb19yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChtaXBzX3JlZmhpX2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbWlwc19oaSAqbDsKLQotICAgICAgbCA9IG1pcHNfcmVmaGlfbGlzdDsKLSAgICAgIHdoaWxlIChsICE9IE5VTEwpCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICB1bnNpZ25lZCBsb25nIHZhbGxvOwotCSAgc3RydWN0IG1pcHNfaGkgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBSRUZISSByZWxvY2F0aW9uLiAgTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGRvbid0Ci0JICAgICBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIFJFRkxPIGl0c2VsZiwgZXhjZXB0Ci0JICAgICB3aGVyZSB0byBmaW5kIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG5lZWRlZCBieSB0aGUKLQkgICAgIFJFRkhJLiAgKi8KLQkgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBsLT5hZGRyKTsKLQkgIHZhbGxvID0gKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKTsKLQkgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0JICB2YWwgKz0gbC0+YWRkZW5kOwotCi0JICAvKiBUaGUgbG93IG9yZGVyIDE2IGJpdHMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgc2lnbmVkCi0JICAgICB2YWx1ZS4gIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMKLQkgICAgIHJlcXVpcmVzIGFuIGFkanVzdG1lbnQgaW4gdGhlIGhpZ2ggb3JkZXIgYml0cy4gIFdlIG5lZWQKLQkgICAgIHRvIG1ha2UgdGhpcyBhZGp1c3RtZW50IGluIHR3byB3YXlzOiBvbmNlIGZvciB0aGUgYml0cyB3ZQotCSAgICAgdG9vayBmcm9tIHRoZSBkYXRhLCBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcKLQkgICAgIGJhY2sgaW4gdG8gdGhlIGRhdGEuICAqLwotCSAgaWYgKCh2YWxsbyAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsIC09IDB4MTAwMDA7Ci0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtaXBzX3JlZmhpX2xpc3QgPSBOVUxMOwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIFJFRkxPIHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0KLS8qIERvIGEgR1BSRUwgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgdmFsdWUgd2hpY2ggbXVzdCBiZWNvbWUKLSAgIHRoZSBvZmZzZXQgZnJvbSB0aGUgZ3AgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2dwcmVsX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIGJmZF92bWEgZ3A7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aCBubwotICAgICBhZGRlbmQsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGFueXRoaW5nLiAgV2Ugd2lsbCBvbmx5IGhhdmUgYW4KLSAgICAgYWRkZW5kIGlmIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIHJlbG9jLCBub3QgcmVhZCBmcm9tIGFuIEVDT0ZGCi0gICAgIGZpbGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY2F0ZWFibGUgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gICAgICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIHJlbG9jYXRlYWJsZSA9PSBmYWxzZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBXZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIGdwIHZhbHVlLCBzbyB0aGF0IHdlIGNhbiBhZGp1c3QgdGhlCi0gICAgIHN5bWJvbCB2YWx1ZSBjb3JyZWN0bHkuICBXZSBsb29rIHVwIHRoZSBzeW1ib2wgX2dwIGluIHRoZSBvdXRwdXQKLSAgICAgQkZELiAgSWYgd2UgY2FuJ3QgZmluZCBpdCwgd2UncmUgc3R1Y2suICBXZSBjYWNoZSBpdCBpbiB0aGUgRUNPRkYKLSAgICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgotICAgICBleHRlcm5hbCBzeW1ib2wgaWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgKi8KLSAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gIGlmIChncCA9PSAwCi0gICAgICAmJiAocmVsb2NhdGVhYmxlID09IGZhbHNlCi0JICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkpCi0gICAgewotICAgICAgaWYgKHJlbG9jYXRlYWJsZSAhPSBmYWxzZSkKLQl7Ci0JICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLwotCSAgZ3AgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAweDQwMDA7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JICBhc3ltYm9sICoqc3ltOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0JICBzeW0gPSBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpOwotCi0JICBpZiAoc3ltID09IChhc3ltYm9sICoqKSBOVUxMKQotCSAgICBpID0gY291bnQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltKyspCi0JCXsKLQkJICByZWdpc3RlciBDT05TVCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpzeW0pOwotCQkgIGlmICgqbmFtZSA9PSAnXycgJiYgc3RyY21wIChuYW1lLCAiX2dwIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZ3AgPSBiZmRfYXN5bWJvbF92YWx1ZSAoKnN5bSk7Ci0JCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGkgPj0gY291bnQpCi0JICAgIHsKLQkgICAgICAvKiBPbmx5IGdldCB0aGUgZXJyb3Igb25jZS4gICovCi0JICAgICAgZ3AgPSA0OwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7Ci0JICAgICAgKmVycm9yX21lc3NhZ2UgPQotCQkoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gX2dwIG5vdCBkZWZpbmVkIik7Ci0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgLyogU2V0IHZhbCB0byB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb3Igc3ltYm9sLiAgKi8KLSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSArIHJlbG9jX2VudHJ5LT5hZGRlbmQpICYgMHhmZmZmOwotICBpZiAodmFsICYgMHg4MDAwKQotICAgIHZhbCAtPSAweDEwMDAwOwotCi0gIC8qIEFkanVzdCB2YWwgZm9yIHRoZSBmaW5hbCBzZWN0aW9uIGxvY2F0aW9uIGFuZCBHUCB2YWx1ZS4gIElmIHdlCi0gICAgIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvcgotICAgICBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotICBpZiAocmVsb2NhdGVhYmxlID09IGZhbHNlCi0gICAgICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB2YWwgKz0gcmVsb2NhdGlvbiAtIGdwOwotCi0gIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKHZhbCAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmIChyZWxvY2F0ZWFibGUgIT0gZmFsc2UpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBNYWtlIHN1cmUgaXQgZml0IGluIDE2IGJpdHMuICAqLwotICBpZiAodmFsID49IDB4ODAwMCAmJiB2YWwgPCAweGZmZmY4MDAwKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogRG8gYSBSRUxISSByZWxvY2F0aW9uLiAgV2UgZG8gdGhpcyBpbiBjb25qdW5jdGlvbiB3aXRoIGEgUkVMTE8KLSAgIHJlbG9jLCBqdXN0IGFzIFJFRkhJIGFuZCBSRUZMTyBhcmUgZG9uZSB0b2dldGhlci4gIFJFTEhJIGFuZCBSRUxMTwotICAgYXJlIEN5Z251cyBleHRlbnNpb25zIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uIGluZGVwZW5kZW50Ci0gICBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgKi8KLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaSAqbWlwc19yZWxoaV9saXN0OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlbGhpX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbWlwc19oaSAqbjsKLQotICAvKiBJZiB0aGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLCB0aGVuIGl0IGlzIGNvcnJlY3QKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlLiAgVGhlIG9ubHkgdGltZSB3ZSB3YW50IHRvIGNoYW5nZSB0aGlzIGNhc2UgaXMKLSAgICAgd2hlbiB3ZSBhcmUgcmVsYXhpbmcsIGFuZCB0aGF0IGlzIGhhbmRsZWQgZW50aXJlbHkgYnkKLSAgICAgbWlwc19yZWxvY2F0ZV9zZWN0aW9uIGFuZCBuZXZlciBjYWxscyB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgaWYgKChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLQlyZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wuICBJZiB3ZSdyZSByZWxvY2F0aW5nLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0ID0gYmZkX3JlbG9jX29rOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXQgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IFJFTExPIGRvIHRoZSBhY3R1YWwgcmVsb2NhdGlvbi4gICovCi0gIG4gPSAoc3RydWN0IG1pcHNfaGkgKikgYmZkX21hbGxvYyAoc2l6ZW9mICpuKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gIG4tPmFkZHIgPSAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBuLT5hZGRlbmQgPSByZWxvY2F0aW9uOwotICBuLT5uZXh0ID0gbWlwc19yZWxoaV9saXN0OwotICBtaXBzX3JlbGhpX2xpc3QgPSBuOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIERvIGEgUkVMTE8gcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0IFBDCi0gICByZWxhdGl2ZSByZWxvY2F0aW9uOyB0aGlzIGZ1bmN0aW9uIGV4aXN0cyBpbiBvcmRlciB0byBkbyB0aGUgUkVMSEkKLSAgIHJlbG9jYXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19yZWxsb19yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChtaXBzX3JlbGhpX2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbWlwc19oaSAqbDsKLQotICAgICAgbCA9IG1pcHNfcmVsaGlfbGlzdDsKLSAgICAgIHdoaWxlIChsICE9IE5VTEwpCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICB1bnNpZ25lZCBsb25nIHZhbGxvOwotCSAgc3RydWN0IG1pcHNfaGkgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBSRUxISSByZWxvY2F0aW9uLiAgTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGRvbid0Ci0JICAgICBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIFJFTExPIGl0c2VsZiwgZXhjZXB0Ci0JICAgICB3aGVyZSB0byBmaW5kIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG5lZWRlZCBieSB0aGUKLQkgICAgIFJFTEhJLiAgKi8KLQkgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBsLT5hZGRyKTsKLQkgIHZhbGxvID0gKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKTsKLQkgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0JICB2YWwgKz0gbC0+YWRkZW5kOwotCi0JICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIG1ha2UgdmFsIFBDIHJlbGF0aXZlLiAgSWYgdGhlCi0JICAgICBzeW1ib2wgaXMgbm90IGRlZmluZWQgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzLCBiZWNhdXNlCi0JICAgICB3ZSBkb24ndCB3YW50IHRoZSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGZpbGUgdG8gaW5jb3Jwb3JhdGUKLQkgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvYy4gICovCi0JICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkKLQkgICAgICAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKSkKLQkgICAgdmFsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0JICAvKiBUaGUgbG93IG9yZGVyIDE2IGJpdHMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgc2lnbmVkCi0JICAgICB2YWx1ZS4gIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMKLQkgICAgIHJlcXVpcmVzIGFuIGFkanVzdG1lbnQgaW4gdGhlIGhpZ2ggb3JkZXIgYml0cy4gIFdlIG5lZWQKLQkgICAgIHRvIG1ha2UgdGhpcyBhZGp1c3RtZW50IGluIHR3byB3YXlzOiBvbmNlIGZvciB0aGUgYml0cyB3ZQotCSAgICAgdG9vayBmcm9tIHRoZSBkYXRhLCBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcKLQkgICAgIGJhY2sgaW4gdG8gdGhlIGRhdGEuICAqLwotCSAgaWYgKCh2YWxsbyAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsIC09IDB4MTAwMDA7Ci0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtaXBzX3JlbGhpX2xpc3QgPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLCB0aGVuIGl0IGlzIGNvcnJlY3QKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlLiAgVGhlIG9ubHkgdGltZSB3ZSB3YW50IHRvIGNoYW5nZSB0aGlzIGNhc2UgaXMKLSAgICAgd2hlbiB3ZSBhcmUgcmVsYXhpbmcsIGFuZCB0aGF0IGlzIGhhbmRsZWQgZW50aXJlbHkgYnkKLSAgICAgbWlwc19yZWxvY2F0ZV9zZWN0aW9uIGFuZCBuZXZlciBjYWxscyB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgaWYgKChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLQlyZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBkb2VzIG5vdCBoYW5kbGUgcGNyZWxfb2Zmc2V0IHJlbG9jYXRpb25zCi0gICAgIGNvcnJlY3RseSB3aGVuIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgZmlsZSwgc28gaGFuZGxlIHRoZW0KLSAgICAgZGlyZWN0bHkgaGVyZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBSRUxMTyByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIG1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBUaGlzIGlzIHRoZSBzcGVjaWFsIGZ1bmN0aW9uIGZvciB0aGUgTUlQU19SX1NXSVRDSCByZWxvYy4gIFRoaXMKLSAgIHNwZWNpYWwgcmVsb2MgaXMgbm9ybWFsbHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsIGFuZCBvbmx5Ci0gICByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nIHdoZW4gcmVsYXhpbmcuICBXZSBkb24ndCB3YW50Ci0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHRvIHRhbXBlciB3aXRoIGl0IGF0IGFsbC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19zd2l0Y2hfcmVsb2MgKGFiZmQsCi0JCSAgIHJlbG9jX2VudHJ5LAotCQkgICBzeW1ib2wsCi0JCSAgIGRhdGEsCi0JCSAgIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsCi0JCSAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSBnZW5lcmljIHJlbG9jIHR5cGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1taXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IG1pcHNfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhBTEY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRldPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9KTVBBRERSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfR1BSRUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1BDUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVMSEk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFTExPOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9TV0lUQ0g7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmbWlwc19ob3d0b190YWJsZVttaXBzX3R5cGVdOwotfQotDAotLyogQSBoZWxwZXIgcm91dGluZSBmb3IgbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIFJFRkhJCi0gICBhbmQgUkVMSEkgcmVsb2NhdGlvbnMuICBUaGUgUkVGSEkgcmVsb2NhdGlvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEKLSAgIFJFRkxPIHJlbG9jYXRpb24gKGFuZCBSRUxISSBieSBhIFJFTExPKSwgYW5kIHRoZSBhZGRlbmQgdXNlZCBpcwotICAgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgYm90aCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19yZWxvY2F0ZV9oaSAocmVmaGksIHJlZmxvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGp1c3QsCi0JCSAgcmVsb2NhdGlvbiwgcGNyZWwpCi0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmaGk7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmbG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzaXplX3QgYWRqdXN0OwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJvb2xlYW4gcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0KLSAgaWYgKHJlZmhpID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJICAgICBjb250ZW50cyArIGFkanVzdCArIHJlZmhpLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLSAgaWYgKHJlZmxvID09IE5VTEwpCi0gICAgdmFsbG8gPSAwOwotICBlbHNlCi0gICAgdmFsbG8gPSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJIGNvbnRlbnRzICsgYWRqdXN0ICsgcmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpCi0JICAgICAmIDB4ZmZmZik7Ci0gCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0gIHZhbCArPSByZWxvY2F0aW9uOwotCi0gIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQgdmFsdWUuCi0gICAgIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMgcmVxdWlyZXMgYW4KLSAgICAgYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZCB0byBtYWtlIHRoaXMKLSAgICAgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UgdG9vayBmcm9tIHRoZSBkYXRhLAotICAgICBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0gIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0gICAgdmFsIC09IDB4MTAwMDA7Ci0KLSAgaWYgKHBjcmVsKQotICAgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgKyAocmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyBhZGp1c3QpKTsKLQotICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLSAgICB2YWwgKz0gMHgxMDAwMDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sCi0JICAgICAgY29udGVudHMgKyBhZGp1c3QgKyByZWZoaS0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgc2VjdGlvbiB3aGlsZSBsaW5raW5nIGEgTUlQUyBFQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb247Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgc2l6ZV90IGFkanVzdDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYm9vbGVhbiBnb3RfbG87Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBsb19pbnRfcmVsOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyKTsKLQotICAvKiBXZSBrZWVwIGEgdGFibGUgbWFwcGluZyB0aGUgc3ltbmR4IGZvdW5kIGluIGFuIGludGVybmFsIHJlbG9jIHRvCi0gICAgIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIHVwIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUgZWFjaCB0aW1lLiAgKi8KLSAgc3ltbmR4X3RvX3NlY3Rpb24gPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbjsKLSAgaWYgKHN5bW5keF90b19zZWN0aW9uID09IChhc2VjdGlvbiAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbiA9ICgoYXNlY3Rpb24gKiopCi0JCQkgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAoTlVNX1JFTE9DX1NFQ1RJT05TCi0JCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgICAgIGlmICghc3ltbmR4X3RvX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX05PTkVdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fVEVYVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIudGV4dCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9SREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9TREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2RhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0JTU10gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2JzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9CU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmJzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9JTklUXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5pbml0Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDhdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDgiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUNF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0NCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9YREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9QREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IE5VTEw7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMCkKLSAgICBncF91bmRlZmluZWQgPSB0cnVlOwotICBlbHNlCi0gICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0KLSAgZ290X2xvID0gZmFsc2U7Ci0KLSAgYWRqdXN0ID0gMDsKLQotICBpZiAoZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pID09IE5VTEwpCi0gICAgb2Zmc2V0cyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBvZmZzZXRzID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5vZmZzZXRzOwotCi0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIGV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBib29sZWFuIHVzZV9sbyA9IGZhbHNlOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYXNlY3Rpb24gKnMgPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIGlmICghIGdvdF9sbykKLQltaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGlucHV0X2JmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOwotICAgICAgZWxzZQotCXsKLQkgIGludF9yZWwgPSBsb19pbnRfcmVsOwotCSAgZ290X2xvID0gZmFsc2U7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZQotCQkgIDwgc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSk7Ci0KLSAgICAgIC8qIFRoZSBSRUZISSBhbmQgUkVMSEkgcmVsb2NzIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcuICB0aGV5Ci0JIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBSRUZMTyBvciBSRUxMTyByZWxvYywgcmVzcGVjdGl2ZWx5LCBhbmQKLQkgdGhlIGFkZGVuZCBpcyBmb3JtZWQgZnJvbSBib3RoIHJlbG9jcy4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JewotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpsb19leHRfcmVsOwotCi0JICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIHBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFJFRkhJCi0gICAgICAgICAgICAgb3IgUkVMSEkgcmVsb2NzIGJlZm9yZSB0aGUgUkVGTE8gb3IgUkVMTE8gcmVsb2MuICBUaGlzCi0gICAgICAgICAgICAgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcyBpdHNlbGYuICAqLwotCSAgZm9yIChsb19leHRfcmVsID0gZXh0X3JlbCArIDE7Ci0JICAgICAgIGxvX2V4dF9yZWwgPCBleHRfcmVsX2VuZDsKLQkgICAgICAgbG9fZXh0X3JlbCsrKQotCSAgICB7Ci0JICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChpbnB1dF9iZmQsIChQVFIpIGxvX2V4dF9yZWwsCi0JCQkJCSZsb19pbnRfcmVsKTsKLQkgICAgICBpZiAobG9faW50X3JlbC5yX3R5cGUgIT0gaW50X3JlbC5yX3R5cGUpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChsb19leHRfcmVsIDwgZXh0X3JlbF9lbmQKLQkgICAgICAmJiAobG9faW50X3JlbC5yX3R5cGUKLQkJICA9PSAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JCSAgICAgID8gTUlQU19SX1JFRkxPCi0JCSAgICAgIDogTUlQU19SX1JFTExPKSkKLQkgICAgICAmJiBpbnRfcmVsLnJfZXh0ZXJuID09IGxvX2ludF9yZWwucl9leHRlcm4KLQkgICAgICAmJiBpbnRfcmVsLnJfc3ltbmR4ID09IGxvX2ludF9yZWwucl9zeW1uZHgpCi0JICAgIHsKLQkgICAgICB1c2VfbG8gPSB0cnVlOwotCSAgICAgIGlmIChsb19leHRfcmVsID09IGV4dF9yZWwgKyAxKQotCQlnb3RfbG8gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBob3d0byA9ICZtaXBzX2hvd3RvX3RhYmxlW2ludF9yZWwucl90eXBlXTsKLQotICAgICAgLyogVGhlIFNXSVRDSCByZWxvYyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgVGhpcyByZWxvYyBpcwotCSBtYXJrcyB0aGUgbG9jYXRpb24gb2YgYSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvcnRpb25zIG9mIGFuCi0JIG9iamVjdCBmaWxlLiAgVGhlIHN5bWJvbCBpbmRleCBkb2VzIG5vdCByZWZlcmVuY2UgYSBzeW1ib2wsCi0JIGJ1dCBpcyBhY3R1YWxseSB0aGUgb2Zmc2V0IGZyb20gdGhlIHJlbG9jIHRvIHRoZSBzdWJ0cmFoZW5kCi0JIG9mIHRoZSBkaWZmZXJlbmNlLiAgVGhpcyByZWxvYyBpcyBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwKLQkgYW5kIG5lZWRzIG5vIGZ1cnRoZXIgYWRqdXN0bWVudCwgdW5sZXNzIHdlIGFyZSByZWxheGluZy4gIElmCi0JIHdlIGFyZSByZWxheGluZywgd2UgbWF5IGhhdmUgdG8gYWRkIGluIGFuIG9mZnNldC4gIFNpbmNlIG5vCi0JIHN5bWJvbHMgYXJlIGludm9sdmVkIGluIHRoaXMgcmVsb2MsIHdlIGhhbmRsZSBpdCBjb21wbGV0ZWx5Ci0JIGhlcmUuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9TV0lUQ0gpCi0JewotCSAgaWYgKG9mZnNldHMgIT0gTlVMTAotCSAgICAgICYmIG9mZnNldHNbaV0gIT0gMCkKLQkgICAgewotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkgIChiZmRfdm1hKSBvZmZzZXRzW2ldLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIGFkanVzdAotCQkJCQkgICArIGludF9yZWwucl92YWRkcgotCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIEJGRF9BU1NFUlQgKHIgPT0gYmZkX3JlbG9jX29rKTsKLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChpbnRfcmVsLnJfZXh0ZXJuKQotCXsKLQkgIGggPSBzeW1faGFzaGVzW2ludF9yZWwucl9zeW1uZHhdOwotCSAgLyogSWYgaCBpcyBOVUxMLCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wgd2hpY2ggd2UgdGhvdWdodCB3YXMganVzdCBhIGRlYnVnZ2luZwotCSAgICAgc3ltYm9sLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gICovCi0JICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludF9yZWwucl9zeW1uZHggPCAwIHx8IGludF9yZWwucl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCSAgICBzID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgcyA9IHN5bW5keF90b19zZWN0aW9uW2ludF9yZWwucl9zeW1uZHhdOwotCi0JICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBUaGUgR1BSRUwgcmVsb2MgdXNlcyBhbiBhZGRlbmQ6IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBHUAotCSB2YWx1ZXMuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9HUFJFTAotCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX0xJVEVSQUwpCi0JYWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZ3BfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGluZm8sIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBHUCBub3QgZGVmaW5lZCIpLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KLQkgICAgICBncCA9IDQ7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgICAgICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhlIGN1cnJlbnQKLQkJIGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkgSU5QVVRfU0VDVElPTi0+dm1hIGFuZCB0aGUgR1AgdmFsdWUgb2YgSU5QVVRfQkZELiAgV2UKLQkJIG11c3QgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkJIGZpbmFsIGRlZmluaXRpb24gKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pCi0JCSBhbmQgdGhlIEdQIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCi0JICAgICAgYWRkZW5kID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgLSBncDsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sLiAgVGhlCi0JCSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgc2ltcGx5IHRoZQotCQkgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseSB6ZXJvKS4gIFdlCi0JCSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoaXMgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0JCSBkZWZpbmVkIHN5bWJvbCwgc28gd2Ugd2FudCB0aGUgaW5zdHJ1Y3Rpb24gdG8gaG9sZAotCQkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmluYWwgZGVmaW5pdGlvbiBvZiB0aGUKLQkJIHN5bWJvbCAod2hpY2ggd2lsbCBlbmQgdXAgaW4gUkVMT0NBVElPTikgYW5kIHRoZSBHUAotCQkgdmFsdWUgb2YgT1VUUFVUX0JGRCAod2hpY2ggaXMgaW4gR1ApLiAgKi8KLQkgICAgICBhZGRlbmQgPSAtIGdwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBvciBjb21tb24KLQkJIHN5bWJvbC4gIFRoZSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLQkJIHNpbXBseSB0aGUgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseQotCQkgemVybykuICBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2UKLQkJIGFyZW4ndCBnb2luZyB0byBkZWZpbmUgdGhpcyBzeW1ib2wsIHNvIHdlIGp1c3QgbGVhdmUKLQkJIHRoZSBpbnN0cnVjdGlvbiBhbG9uZS4gICovCi0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBtaXBzX3JlbGF4X3NlY3Rpb24gbWF5IGhhdmUgc2V0Ci0JIG9mZnNldHNbaV0gdG8gc29tZSB2YWx1ZS4gIEEgdmFsdWUgb2YgMSBtZWFucyB3ZSBtdXN0IGV4cGFuZAotCSBhIFBDIHJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gb2Ygc2VxdWVuY2UsCi0JIGFuZCBhbnkgb3RoZXIgdmFsdWUgaXMgYW4gYWRkZW5kLiAgKi8KLSAgICAgIGlmIChvZmZzZXRzICE9IE5VTEwKLQkgICYmIG9mZnNldHNbaV0gIT0gMCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0JICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUENSRUwxNgotCQkgICAgICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkKLQkJICAgICAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgIGlmIChvZmZzZXRzW2ldICE9IDEpCi0JICAgIGFkZGVuZCArPSBvZmZzZXRzW2ldOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgKmhlcmU7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfZXh0ZXJuCi0JCQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIE1vdmUgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB1cC4gICovCi0JICAgICAgaGVyZSA9IChjb250ZW50cwotCQkgICAgICArIGFkanVzdAotCQkgICAgICArIGludF9yZWwucl92YWRkcgotCQkgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgbWVtbW92ZSAoaGVyZSArIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQsIGhlcmUsCi0JCSAgICAgICAoc2l6ZV90KSAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplCi0JCQkJIC0gKGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJICAgICAgIAotCSAgICAgIC8qIEdlbmVyYXRlIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgICBpZiAoISBtaXBzX3JlbGF4X3BjcmVsMTYgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJaCwgaGVyZSwKLQkJCQkJKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJCQkgKyAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkKLQkJCQkJICsgYWRqdXN0KSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIFdlIG11c3QgYWRqdXN0IGV2ZXJ5dGhpbmcgZWxzZSB1cCBhIG5vdGNoLiAgKi8KLQkgICAgICBhZGp1c3QgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotCSAgICAgIC8qIG1pcHNfcmVsYXhfcGNyZWwxNiBoYW5kbGVzIGFsbCB0aGUgZGV0YWlscyBvZiB0aGlzCi0JCSByZWxvY2F0aW9uLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIC50ZXh0Ci0JIHNlZ21lbnQsIHdlIG1heSBuZWVkIHRvIGFkanVzdCBpdCBpZiBzb21lIGJyYW5jaGVzIGhhdmUgYmVlbgotCSBleHBhbmRlZC4gIFRoZSByZWxvYyB0eXBlcyB3aGljaCBhcmUgbGlrZWx5IHRvIG9jY3VyIGluIHRoZQotCSAudGV4dCBzZWN0aW9uIGFyZSBoYW5kbGVkIGVmZmljaWVudGx5IGJ5IG1pcHNfcmVsYXhfc2VjdGlvbiwKLQkgYW5kIHRodXMgZG8gbm90IG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLiAgKi8KLSAgICAgIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdCAhPSBOVUxMCi0JICAmJiAhIGludF9yZWwucl9leHRlcm4KLQkgICYmIGludF9yZWwucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUCi0JICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJICAgICAgIi50ZXh0IikgIT0gMAotCSAgICAgIHx8IChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUENSRUwxNgotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9TV0lUQ0gKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKLQl7Ci0JICBiZmRfdm1hIGFkcjsKLQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmE7Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBhZGRlbmQgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgd2UgbmVlZAotCSAgICAgdG8gYWRqdXN0IHRoZSBhZGRyZXNzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZXT1JEKTsKLQotCSAgYWRyID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgIChjb250ZW50cwotCQkJICAgICArIGFkanVzdAotCQkJICAgICArIGludF9yZWwucl92YWRkcgotCQkJICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCi0JICBmb3IgKGEgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdDsKLQkgICAgICAgYSAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMOwotCSAgICAgICBhID0gYS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChhZHIgPj0gYS0+c3RhcnQgJiYgYWRyIDwgYS0+ZW5kKQotCQlhZGRlbmQgKz0gYS0+YWRqdXN0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0IGNvbnZlcnQKLQkgICAgIHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIG91dHB1dC4gIENvbnZlcnQKLQkJICAgICB0aGUgcmVsb2MgZnJvbSBiZWluZyBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gYmVpbmcKLQkJICAgICBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotCQkgIC8qIENsZWFyIHRoZSByX2V4dGVybiBiaXQuICAqLwotCQkgIGludF9yZWwucl9leHRlcm4gPSAwOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCi0JCSAgcyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0KLQkJICBpbnRfcmVsLnJfc3ltbmR4ID0gLTE7Ci0JCSAgc3dpdGNoIChuYW1lWzFdKQotCQkgICAgewotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2knOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncyc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAgICAgCi0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIC8qIEFkZCB0aGUgc2VjdGlvbiBWTUEgYW5kIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgcy0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAvKiBGb3IgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLCB0aGUgb2JqZWN0IGZpbGUKLQkJICAgICBjdXJyZW50bHkgaG9sZHMganVzdCB0aGUgYWRkZW5kLiAgV2UgbXVzdCBhZGp1c3QKLQkJICAgICBieSB0aGUgYWRkcmVzcyB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgewotCQkgICAgICByZWxvY2F0aW9uIC09IGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotCQkgICAgICAvKiBJZiB3ZSBhcmUgY29udmVydGluZyBhIFJFTEhJIG9yIFJFTExPIHJlbG9jCi0JCQkgZnJvbSBiZWluZyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0bwotCQkJIGJlaW5nIGFnYWluc3QgYSBzZWN0aW9uLCB3ZSBtdXN0IHB1dCBhCi0JCQkgc3BlY2lhbCB2YWx1ZSBpbnRvIHRoZSByX29mZnNldCBmaWVsZC4gIFRoaXMKLQkJCSB2YWx1ZSBpcyB0aGUgb2xkIGFkZGVuZC4gIFRoZSByX29mZnNldCBmb3IKLQkJCSBib3RoIHRoZSBSRUxISSBhbmQgUkVMTE8gcmVsb2NzIGFyZSB0aGUgc2FtZSwKLQkJCSBhbmQgd2Ugc2V0IGJvdGggd2hlbiB3ZSBzZWUgUkVMSEkuICAqLwotCQkgICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCQkJewotCQkJICBsb25nIGFkZGhpLCBhZGRsbzsKLQotCQkJICBhZGRoaSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgKGNvbnRlbnRzCi0JCQkJCSAgICAgICArIGFkanVzdAotCQkJCQkgICAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JCQkgIGFkZGhpICY9IDB4ZmZmZjsKLQkJCSAgaWYgKGFkZGhpICYgMHg4MDAwKQotCQkJICAgIGFkZGhpIC09IDB4MTAwMDA7Ci0JCQkgIGFkZGhpIDw8PSAxNjsKLQotCQkJICBpZiAoISB1c2VfbG8pCi0JCQkgICAgYWRkbG8gPSAwOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQkgIChjb250ZW50cwotCQkJCQkJICAgKyBhZGp1c3QKLQkJCQkJCSAgICsgbG9faW50X3JlbC5yX3ZhZGRyCi0JCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCQkJICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCQkJICAgICAgaWYgKGFkZGxvICYgMHg4MDAwKQotCQkJCWFkZGxvIC09IDB4MTAwMDA7Ci0KLQkJCSAgICAgIGxvX2ludF9yZWwucl9vZmZzZXQgPSBhZGRoaSArIGFkZGxvOwotCQkJICAgIH0KLQotCQkJICBpbnRfcmVsLnJfb2Zmc2V0ID0gYWRkaGkgKyBhZGRsbzsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGggPSBOVUxMOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2hhbmdlIHRoZSBzeW1uZHggdmFsdWUgdG8gdGhlIHJpZ2h0IG9uZSBmb3IgdGhlCi0JCSAgICAgb3V0cHV0IEJGRC4gICovCi0JCSAgaW50X3JlbC5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaW50X3JlbC5yX3N5bW5keCA9IDA7Ci0JCSAgICB9Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBBZGp1c3QgdGhlCi0JCSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHMtPnZtYSk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiArPSBhZGRlbmQ7Ci0JICBhZGRlbmQgPSAwOwotCi0JICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UKLQkgICAgIHRvIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBzZWN0aW9uIGFuZCBpbmNsdWRpbmcgdGhlCi0JICAgICByZWZlcmVuY2UgdG8gdGhlIG5ldyBhZGRyZXNzLiAgSG93ZXZlciwgZXh0ZXJuYWwgUkVMSEkKLQkgICAgIGFuZCBSRUxMTyByZWxvY3MgYXJlIFBDIHJlbGF0aXZlLCBidXQgZG9uJ3QgaW5jbHVkZSBhbnkKLQkgICAgIHJlZmVyZW5jZSB0byB0aGUgYWRkcmVzcy4gIFRoZSBhZGRlbmQgaXMgbWVyZWx5IGFuCi0JICAgICBhZGRlbmQuICAqLwotCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZQotCSAgICAgICYmICghIGludF9yZWwucl9leHRlcm4KLQkJICB8fCAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCi0JCSAgICAgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgLyogQWRqdXN0IHRoZSBjb250ZW50cy4gICovCi0JICBpZiAocmVsb2NhdGlvbiA9PSAwKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUZISQotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSkKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSAgICAoY29udGVudHMKLQkJCQkJICAgICArIGFkanVzdAotCQkJCQkgICAgICsgaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQkgICAgdXNlX2xvID8gJmxvX2ludF9yZWwgOiBOVUxMLAotCQkJCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICBhZGp1c3QsIHJlbG9jYXRpb24sCi0JCQkJICAgIGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzcy4gICovCi0JICBpbnRfcmVsLnJfdmFkZHIgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBTYXZlIHRoZSBjaGFuZ2VkIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGlucHV0X2JmZCwgJmludF9yZWwsIChQVFIpIGV4dF9yZWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhcmUgcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uICAqLwotCSAgICAgIHJlbG9jYXRpb24gPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcy0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcy0+dm1hKTsKLQotCSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaXMgYWxyZWFkeSBjb3JyZWN0IGluIHRoZSBvYmplY3QKLQkJIGZpbGUuICBNYWtlIGl0IGxvb2sgbGlrZSBhIHBjcmVsX29mZnNldCByZWxvY2F0aW9uIGJ5Ci0JCSBhZGRpbmcgaW4gdGhlIHN0YXJ0IGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0JCXsKLQkJICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJIHx8ICEgdXNlX2xvKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCSAgZWxzZQotCQkgICAgcmVsb2NhdGlvbiArPSBsb19pbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRkhJCi0JICAgICAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJKQotCSAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsCi0JCQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywKLQkJCQkJICAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSAgICsgYWRqdXN0KSwKLQkJCQkJICByZWxvY2F0aW9uLAotCQkJCQkgIGFkZGVuZCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQl1c2VfbG8gPyAmbG9faW50X3JlbCA6IE5VTEwsCi0JCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRqdXN0LAotCQkJCXJlbG9jYXRpb24sCi0JCQkJaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBNSVBTX1JfSk1QQUREUiByZXF1aXJlcyBwZWN1bGlhciBvdmVyZmxvdyBkZXRlY3Rpb24uICBUaGUKLQkgaW5zdHJ1Y3Rpb24gcHJvdmlkZXMgYSAyOCBiaXQgYWRkcmVzcyAodGhlIHR3byBsb3dlciBiaXRzIGFyZQotCSBpbXBsaWNpdCB6ZXJvZXMpIHdoaWNoIGlzIGNvbWJpbmVkIHdpdGggdGhlIHVwcGVyIGZvdXIgYml0cwotCSBvZiB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2sKLQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9KTVBBRERSCi0JICAmJiAoKChyZWxvY2F0aW9uCi0JCSsgYWRkZW5kCi0JCSsgKGludF9yZWwucl9leHRlcm4gPyAwIDogcy0+dm1hKSkKLQkgICAgICAgJiAweGYwMDAwMDAwKQotCSAgICAgICE9ICgoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKQotCQkgICArIGFkanVzdCkKLQkJICAmIDB4ZjAwMDAwMDApKSkKLQlyID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaW50X3JlbC5yX2V4dGVybikKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCWludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCBpbiB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICpzZWN0aW9uX3RkYXRhOwotCi0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gIGlmIChzZWN0aW9uX3RkYXRhID09IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgICBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+b2Zmc2V0cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotCi0gICAgICBleHRlcm5hbF9yZWxvY3Nfc2l6ZSA9IChlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZQotCQkJICAgICAgKiBzZWMtPnJlbG9jX2NvdW50KTsKLQotICAgICAgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID0KLQkoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgICAgIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBleHRlcm5hbF9yZWxvY3Nfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MsIDEsCi0JCQlleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgYWJmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsYXggYSBzZWN0aW9uIHdoZW4gbGlua2luZyBhIE1JUFMgRUNPRkYgZmlsZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGVtYmVkZGVkIFBJQyBjb2RlLCB3aGljaCBhbHdheXMgdXNlcyBQQyByZWxhdGl2ZSBicmFuY2hlcyB3aGljaAotICAgb25seSBoYXZlIGFuIDE4IGJpdCByYW5nZSBvbiBNSVBTLiAgSWYgYSBicmFuY2ggaXMgbm90IGluIHJhbmdlLCB3ZQotICAgZ2VuZXJhdGUgYSBsb25nIGluc3RydWN0aW9uIHNlcXVlbmNlIHRvIGNvbXBlbnNhdGUuICBFYWNoIHRpbWUgd2UKLSAgIGZpbmQgYSBicmFuY2ggdG8gZXhwYW5kLCB3ZSBoYXZlIHRvIGNoZWNrIGFsbCB0aGUgb3RoZXJzIGFnYWluIHRvCi0gICBtYWtlIHN1cmUgdGhleSBhcmUgc3RpbGwgaW4gcmFuZ2UuICBUaGlzIGlzIHNsb3csIGJ1dCBpdCBvbmx5IGhhcwotICAgdG8gYmUgZG9uZSB3aGVuIC1yZWxheCBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGZpZ3VyZXMgb3V0IHdoaWNoIGJyYW5jaGVzIG5lZWQgdG8gZXhwYW5kOyB0aGUgYWN0dWFsCi0gICBleHBhbnNpb24gaXMgZG9uZSBpbiBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gd2hlbiB0aGUgc2VjdGlvbgotICAgY29udGVudHMgYXJlIHJlbG9jYXRlZC4gIFRoZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIG9mZnNldHMKLSAgIGZpZWxkIG9mIHRoZSBlY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gIEFuIG9mZnNldCBvZiAxIG1lYW5zCi0gICB0aGF0IHRoZSBicmFuY2ggbXVzdCBiZSBleHBhbmRlZCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCAoc3VjaCBhbiBvZmZzZXQgd2lsbCBvbmx5IG9jY3VyIGZvciBhIFBDIHJlbGF0aXZlCi0gICBicmFuY2ggdG8gYW4gZXh0ZXJuYWwgc3ltYm9sKS4gIEFueSBvdGhlciBvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlCi0gICBvZiBmb3VyLCBhbmQgaXMgdGhlIGFtb3VudCB0byBjaGFuZ2UgdGhlIGJyYW5jaCBieSAoc3VjaCBhbiBvZmZzZXQKLSAgIHdpbGwgb25seSBvY2N1ciBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2ggd2l0aGluIHRoZSBzYW1lIHNlY3Rpb24pLgotCi0gICBXZSBkbyBub3QgbW9kaWZ5IHRoZSBzZWN0aW9uIHJlbG9jcyBvciBjb250ZW50cyB0aGVtc2VsdmVzIHNvIHRoYXQKLSAgIGlmIG1lbW9yeSB1c2FnZSBiZWNvbWVzIGFuIGlzc3VlIHdlIGNhbiBkaXNjYXJkIHRoZW0gYW5kIHJlYWQgdGhlbQotICAgYWdhaW4uICBUaGUgb25seSBpbmZvcm1hdGlvbiB3ZSBtdXN0IHNhdmUgaW4gbWVtb3J5IGJldHdlZW4gdGhpcwotICAgcm91dGluZSBhbmQgdGhlIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lIGlzIHRoZSB0YWJsZSBvZgotICAgb2Zmc2V0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBBc3N1bWUgd2UgYXJlIG5vdCBnb2luZyB0byBuZWVkIGFub3RoZXIgcGFzcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBhbiBFQ09GRiBmaWxlLCB0aGlzIGlzIG11Y2ggdG9vCi0gICAgIGNvbmZ1c2luZyB0byBkZWFsIHdpdGguICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWxvY3MsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gUEMgcmVsYXRpdmUgcmVsb2NzLCBhbmQgd2h5IHdvdWxkIHRoZXJlCi0gICAgIGV2ZXIgYmUgb25lIGZyb20gYW55dGhpbmcgYnV0IHRoZSAudGV4dCBzZWN0aW9uPyAgKi8KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIudGV4dCIpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZ290IHRoZW0uICAqLwotICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICBpZiAoc2VjdGlvbl90ZGF0YSA9PSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgfQotCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIG11c3QgaW5pdGlhbGl6ZSBfY29va2VkX3NpemUgb25seSB0aGUgZmlyc3QgdGltZSB3ZSBhcmUKLQkgY2FsbGVkLiAgKi8KLSAgICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotCi0gIGNvbnRlbnRzID0gc2VjdGlvbl90ZGF0YS0+Y29udGVudHM7Ci0gIG9mZnNldHMgPSBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzOwotCi0gIC8qIExvb2sgZm9yIGFueSBleHRlcm5hbCBQQyByZWxhdGl2ZSByZWxvY3MuICBJbnRlcm5hbCBQQyByZWxhdGl2ZQotICAgICByZWxvY3MgYXJlIGFscmVhZHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsIHNvIHRoZXkgY2VydGFpbmx5Ci0gICAgIGNhbiBub3Qgb3ZlcmZsb3cuICAqLwotICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jICphZGpfZXh0X3JlbDsKLSAgICAgIHVuc2lnbmVkIGludCBhZGpfaTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXh0X2NvdW50OwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKmFkal9oX3B0cjsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiphZGpfaF9wdHJfZW5kOwotICAgICAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZXhwYW5kZWQgdGhpcyByZWxvYywgd2UgY2VydGFpbmx5IGRvbid0Ci0JIG5lZWQgdG8gZG8gaXQgYWdhaW4uICAqLwotICAgICAgaWYgKG9mZnNldHMgIT0gKGxvbmcgKikgTlVMTCAmJiBvZmZzZXRzW2ldID09IDEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFF1aWNrbHkgY2hlY2sgdGhhdCB0aGlzIHJlbG9jIGlzIGV4dGVybmFsIFBDUkVMMTYuICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgaWYgKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fQklHKSA9PSAwCi0JICAgICAgfHwgKCgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCSAgID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHKQotCQkgICE9IE1JUFNfUl9QQ1JFTDE2KSkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRSkgPT0gMAotCSAgICAgIHx8ICgoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkgICA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRSkKLQkJICAhPSBNSVBTX1JfUENSRUwxNikpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoUFRSKSBleHRfcmVsLCAmaW50X3JlbCk7Ci0KLSAgICAgIGggPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIC8qIEp1c3QgaWdub3JlIHVuZGVmaW5lZCBzeW1ib2xzLiAgVGhlc2Ugd2lsbCBwcmVzdW1hYmx5Ci0JICAgICBnZW5lcmF0ZSBhbiBlcnJvciBsYXRlciBpbiB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0KLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBhZGRyZXNzLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpKTsKLQotICAgICAgLyogVGhlIGFkZGVuZCBpcyBzdG9yZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gdGhlIG5vcm1hbCBjYXNlCi0JIG9mIGBgYmFsIHN5bWJvbCcnLCB0aGUgYWRkZW5kIHdpbGwgYmUgLTQuICBJdCB3aWxsIG9ubHkgYmUKLQkgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mIGBgYmFsIHN5bWJvbCtjb25zdGFudCcnLiAgVG8gYXZvaWQKLQkgYWx3YXlzIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIHdlIGRvbid0IGNoZWNrIHRoZQotCSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlICh3ZSBjb3VsZCBlYXNpbHkgY2hlY2sgdGhlIGNvbnRlbnRzCi0JIGlmIHdlIGhhcHBlbiB0byBoYXZlIGFscmVhZHkgcmVhZCB0aGVtIGluLCBidXQgSSBmZWFyIHRoYXQKLQkgdGhpcyBjb3VsZCBiZSBjb25mdXNpbmcpLiAgVGhpcyBtZWFucyB3ZSB3aWxsIHNjcmV3IHVwIGlmCi0JIHRoZXJlIGlzIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgaW4gcmFuZ2UsIGJ1dCBhZGRlZCB0bwotCSBhIGNvbnN0YW50IHdoaWNoIHB1dHMgaXQgb3V0IG9mIHJhbmdlOyBpbiBzdWNoIGEgY2FzZSB0aGUKLQkgbGluayB3aWxsIGZhaWwgd2l0aCBhIHJlbG9jIG92ZXJmbG93IGVycm9yLiAgU2luY2UgdGhlCi0JIGNvbXBpbGVyIHdpbGwgbmV2ZXIgZ2VuZXJhdGUgc3VjaCBjb2RlLCBpdCBzaG91bGQgYmUgZWFzeQotCSBlbm91Z2ggdG8gd29yayBhcm91bmQgaXQgYnkgY2hhbmdpbmcgdGhlIGFzc2VtYmx5IGNvZGUgaW4gdGhlCi0JIHNvdXJjZSBmaWxlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gNDsKLQotICAgICAgLyogTm93IFJFTE9DQVRJT04gaXMgdGhlIG51bWJlciB3ZSB3YW50IHRvIHB1dCBpbiB0aGUgb2JqZWN0Ci0JIGZpbGUuICBTZWUgd2hldGhlciBpdCBmaXRzLiAgKi8KLSAgICAgIGlmIChyZWxvY2F0aW9uID49IC0weDIwMDAwICYmIHJlbG9jYXRpb24gPCAweDIwMDAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgcmVsb2MgbmVlZHMgd29yaywgd2hpY2ggd2lsbCByYXJlbHkKLQkgaGFwcGVuLCBnbyBhaGVhZCBhbmQgZ3JhYiB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JewotCSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNlYy0+X3Jhd19zaXplKTsKLQkgIGVsc2UKLQkgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKGNvbnRlbnRzID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCAoUFRSKSBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0JICAgIHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotCi0gICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgY2hhbmdpbmcgdGhlIGJhbCBpbnN0cnVjdGlvbi4gIEl0IHdvdWxkIGJlCi0JIHBvc3NpYmxlIHRvIGhhbmRsZSBvdGhlciBQQyByZWxhdGl2ZSBicmFuY2hlcywgYnV0IHNvbWUgb2YKLQkgdGhlbSAodGhlIGNvbmRpdGlvbmFsIGJyYW5jaGVzKSB3b3VsZCByZXF1aXJlIGEgZGlmZmVyZW50Ci0JIGxlbmd0aCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB3aGljaCB3b3VsZCBjb21wbGljYXRlIGJvdGggdGhpcwotCSByb3V0aW5lIGFuZCBtaXBzX3JlbGF4X3BjcmVsMTYuICBJdCBjb3VsZCBiZSB3cml0dGVuIGlmCi0JIHNvbWVib2R5IGZlbHQgaXQgd2VyZSBpbXBvcnRhbnQuICBJZ25vcmluZyB0aGlzIHJlbG9jIHdpbGwKLQkgcHJlc3VtYWJseSBjYXVzZSBhIHJlbG9jIG92ZXJmbG93IGVycm9yIGxhdGVyIG9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIGludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKQotCSAgIT0gMHgwNDExZmZmZikgLyogYmdlemFsICQwLC4gPT0gYmFsIC4gKi8KLQljb250aW51ZTsKLQotICAgICAgLyogQm90aGVyLiAgV2UgbmVlZCB0byBleHBhbmQgdGhpcyByZWxvYywgYW5kIHdlIHdpbGwgbmVlZCB0bwotCSBtYWtlIGFub3RoZXIgcmVsYXhhdGlvbiBwYXNzIHNpbmNlIHRoaXMgY2hhbmdlIG1heSBwdXQgb3RoZXIKLQkgcmVsb2NzIG91dCBvZiByYW5nZS4gIFdlIG5lZWQgdG8gZXhhbWluZSB0aGUgbG9jYWwgYnJhbmNoZXMKLQkgYW5kIHdlIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG9mZnNldHMgd2UgbXVzdAotCSBhZGQgdG8gdGhlbS4gIFdlIGFsc28gbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlcyBvZiBhbGwKLQkgc3ltYm9scyBpbiB0aGUgb2JqZWN0IGZpbGUgZm9sbG93aW5nIHRoaXMgbG9jYXRpb24uICAqLwotCi0gICAgICBzZWMtPl9jb29rZWRfc2l6ZSArPSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UOwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgaWYgKG9mZnNldHMgPT0gKGxvbmcgKikgTlVMTCkKLQl7Ci0JICBzaXplX3Qgc2l6ZTsKLQotCSAgc2l6ZSA9IHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGxvbmcpOwotCSAgb2Zmc2V0cyA9IChsb25nICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JICBpZiAob2Zmc2V0cyA9PSAobG9uZyAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG1lbXNldCAob2Zmc2V0cywgMCwgc2l6ZSk7Ci0JICBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzID0gb2Zmc2V0czsKLQl9Ci0KLSAgICAgIG9mZnNldHNbaV0gPSAxOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIFBDIHJlbGF0aXZlIHJlZmVyZW5jZXMgdGhhdCBjcm9zcyB0aGlzIHJlbG9jCi0JIGFuZCBhZGp1c3QgdGhlaXIgb2Zmc2V0cy4gICovCi0gICAgICBhZGpfZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yIChhZGpfaSA9IDA7IGFkal9leHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGFkal9leHRfcmVsKyssIGFkal9pKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIGFkal9pbnRfcmVsOwotCSAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQkgIGludCBjaGFuZ2U7Ci0KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgYWRqX2V4dF9yZWwsICZhZGpfaW50X3JlbCk7Ci0KLQkgIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1BDUkVMMTYpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgbG9jYWwgcmVmZXJlbmNlcy4gIEV4dGVybmFsIG9uZXMKLQkJIHdpbGwgYmUgcmVsb2NhdGVkIGNvcnJlY3RseSBhbnlob3cuICAqLwotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2l0aGluCi0JCSB0aGlzIHNlY3Rpb24uICBGSVhNRTogQ3Jvc3Mgc2VjdGlvbiBQQyByZWxhdGl2ZQotCQkgcmVsb2NzIG1heSBub3QgYmUgaGFuZGxlZCBjb3JyZWN0bHk7IGRvZXMgYW55Ym9keQotCQkgY2FyZT8gICovCi0JICAgICAgaWYgKGFkal9pbnRfcmVsLnJfc3ltbmR4ICE9IFJFTE9DX1NFQ1RJT05fVEVYVCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHI7Ci0KLQkgICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwKLQkJCQkgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCi0JICAgICAgc3RvcCA9IChpbnNuICYgMHhmZmZmKSA8PCAyOwotCSAgICAgIGlmICgoc3RvcCAmIDB4MjAwMDApICE9IDApCi0JCXN0b3AgLT0gMHg0MDAwMDsKLQkgICAgICBzdG9wICs9IGFkal9pbnRfcmVsLnJfdmFkZHIgKyA0OwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIHJlbGxvOwotCSAgICAgIGxvbmcgYWRkaGksIGFkZGxvOwotCi0JICAgICAgLyogVGhlIG5leHQgcmVsb2MgbXVzdCBiZSBNSVBTX1JfUkVMTE8sIGFuZCB3ZSBoYW5kbGUKLQkJIHRoZW0gdG9nZXRoZXIuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKGFkal9leHRfcmVsICsgMSA8IGV4dF9yZWxfZW5kKTsKLQotCSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgKGFkal9leHRfcmVsICsgMSksICZyZWxsbyk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChyZWxsby5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgICAgICAKLQkgICAgICBhZGRoaSA9IGJmZF9nZXRfMzIgKGFiZmQsCi0JCQkJICAgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCSAgICAgIGFkZGhpICY9IDB4ZmZmZjsKLQkgICAgICBpZiAoYWRkaGkgJiAweDgwMDApCi0JCWFkZGhpIC09IDB4MTAwMDA7Ci0JICAgICAgYWRkaGkgPDw9IDE2OwotCi0JICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHJlbGxvLnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCSAgICAgIGlmIChhZGRsbyAmIDB4ODAwMCkKLQkJYWRkbG8gLT0gMHgxMDAwMDsKLQotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJewotCQkgIC8qIFRoZSB2YWx1ZSB3ZSB3YW50IGhlcmUgaXMKLQkJICAgICAgIHN5bSAtIFJFTExPYWRkciArIGFkZGVuZAotCQkgICAgIHdoaWNoIHdlIGNhbiBleHByZXNzIGFzCi0JCSAgICAgICBzeW0gLSAoUkVMTE9hZGRyIC0gYWRkZW5kKQotCQkgICAgIFRoZXJlZm9yZSBpZiB3ZSBhcmUgZXhwYW5kaW5nIHRoZSBhcmVhIGJldHdlZW4KLQkJICAgICBSRUxMT2FkZHIgYW5kIFJFTExPYWRkciAtIGFkZGVuZCB3ZSBtdXN0IGFkanVzdAotCQkgICAgIHRoZSBhZGRlbmQuICBUaGlzIGlzIGFkbWl0dGVkbHkgYW1iaWd1b3VzLCBzaW5jZQotCQkgICAgIHdlIG1pZ2h0IG1lYW4gKHN5bSArIGFkZGVuZCkgLSBSRUxMT2FkZHIsIGJ1dCBpbgotCQkgICAgIHByYWN0aWNlIHdlIGRvbid0LCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZQotCQkgICAgIHRoYXQgY2FzZSBjb3JyZWN0bHkgc2luY2UgYXQgdGhpcyBwb2ludCB3ZSBoYXZlCi0JCSAgICAgbm8gaWRlYSB3aGV0aGVyIGFueSByZWxvYyBpcyBiZWluZyBleHBhbmRlZAotCQkgICAgIGJldHdlZW4gc3ltIGFuZCBzeW0gKyBhZGRlbmQuICAqLwotCQkgIHN0YXJ0ID0gcmVsbG8ucl92YWRkciAtIChhZGRoaSArIGFkZGxvKTsKLQkJICBzdG9wID0gcmVsbG8ucl92YWRkcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEFuIGludGVybmFsIFJFTEhJL1JFTExPIHBhaXIgcmVwcmVzZW50cyB0aGUKLQkJICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkZHJlc3NlcywgJExDMCAtIGZvby4KLQkJICAgICBUaGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IHRoZSBkaWZmZXJlbmNlCi0JCSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgJExDMC4gIFRoaXMgbGV0cyB1cwotCQkgICAgIGNvbXB1dGUgJExDMCwgYW5kLCBieSBjb25zaWRlcmluZyB0aGUgYWRkZW5kLAotCQkgICAgIGZvby4gIElmIHRoZSByZWxvYyB3ZSBhcmUgZXhwYW5kaW5nIGZhbGxzIGJldHdlZW4KLQkJICAgICB0aG9zZSB0d28gcmVsb2NzLCB3ZSBtdXN0IGFkanVzdCB0aGUgYWRkZW5kLiAgQXQKLQkJICAgICB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGluIHRoZQotCQkgICAgIHJfb2Zmc2V0IGZpZWxkLCB3aGVyZSBpdCB3YXMgcHV0IGJ5Ci0JCSAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkJICBzdGFydCA9IHJlbGxvLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkJICBzdG9wID0gc3RhcnQgKyBhZGRoaSArIGFkZGxvOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfU1dJVENIKQotCSAgICB7Ci0JICAgICAgLyogQSBNSVBTX1JfU1dJVENIIHJlbG9jIHJlcHJlc2VudHMgYSB3b3JkIG9mIHRoZSBmb3JtCi0JCSAgIC53b3JkICRMMy0kTFMxMgotCQkgVGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSBpcyBjb3JyZWN0LCBhc3N1bWluZyB0aGUKLQkJIG9yaWdpbmFsIHZhbHVlIG9mICRMMy4gIFRoZSBzeW1uZHggdmFsdWUgaXMgYWN0dWFsbHkKLQkJIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kICRMUzEyLgotCQkgVGhpcyBsZXRzIHVzIGNvbXB1dGUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMUzEyIGFzCi0JCSAgIHZhZGRyIC0gc3ltbmR4Ci0JCSBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMyBhcwotCQkgICB2YWRkciAtIHN5bW5keCArIGFkZGVuZAotCQkgd2hlcmUgYWRkZW5kIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gIEF0Ci0JCSB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGZvdW5kIGluIHRoZQotCQkgcl9vZmZzZXQgZmllbGQsIHNpbmNlIGl0IHdhcyBtb3ZlZCBieQotCQkgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkgICAgICBzdG9wID0gc3RhcnQgKyBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCQkgKGNvbnRlbnRzCi0JCQkJCSAgKyBhZGpfaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgLSBzZWMtPnZtYSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGUgcmFuZ2UgZXhwcmVzc2VkIGJ5IHRoaXMgcmVsb2MsIHdoaWNoIGlzIHRoZQotCSAgICAgZGlzdGFuY2UgYmV0d2VlbiBTVEFSVCBhbmQgU1RPUCBjcm9zc2VzIHRoZSByZWxvYyB3ZSBhcmUKLQkgICAgIGV4cGFuZGluZywgd2UgbXVzdCBhZGp1c3QgdGhlIG9mZnNldC4gIFRoZSBzaWduIG9mIHRoZQotCSAgICAgYWRqdXN0bWVudCBkZXBlbmRzIHVwb24gdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgcmFuZ2UKLQkgICAgIGNyb3NzZXMgdGhlIHJlbG9jIGJlaW5nIGV4cGFuZGVkLiAgKi8KLQkgIGlmIChzdGFydCA8PSBpbnRfcmVsLnJfdmFkZHIgJiYgc3RvcCA+IGludF9yZWwucl92YWRkcikKLQkgICAgY2hhbmdlID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQkgIGVsc2UgaWYgKHN0YXJ0ID4gaW50X3JlbC5yX3ZhZGRyICYmIHN0b3AgPD0gaW50X3JlbC5yX3ZhZGRyKQotCSAgICBjaGFuZ2UgPSAtIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JICBlbHNlCi0JICAgIGNoYW5nZSA9IDA7Ci0KLQkgIG9mZnNldHNbYWRqX2ldICs9IGNoYW5nZTsKLQotCSAgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JICAgIHsKLQkgICAgICBhZGpfZXh0X3JlbCsrOwotCSAgICAgIGFkal9pKys7Ci0JICAgICAgb2Zmc2V0c1thZGpfaV0gKz0gY2hhbmdlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIGluIHRoaXMgc2VjdGlvbiBkZWZpbmVkIGJ5IHRoaXMgb2JqZWN0IGZpbGUKLQkgYW5kIGFkanVzdCB0aGVpciB2YWx1ZXMuICBOb3RlIHRoYXQgd2UgZGVjaWRlIHdoZXRoZXIgdG8KLQkgYWRqdXN0IHRoZSB2YWx1ZSBiYXNlZCBvbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBFQ09GRiBFWFRSCi0JIHN0cnVjdHVyZSwgYmVjYXVzZSB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlIG1heQotCSBoYXZlIGJlZW4gY2hhbmdlZCBieSBhbiBlYXJsaWVyIGV4cGFuZGVkIHJlbG9jIGFuZCB0aHVzIG1heQotCSBubyBsb25nZXIgY29ycmVjdGx5IGluZGljYXRlIHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBiZWZvcmUgb3IKLQkgYWZ0ZXIgdGhlIGV4cGFuZGVkIHJlbG9jLiAgKi8KLSAgICAgIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotICAgICAgYWRqX2hfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXM7Ci0gICAgICBhZGpfaF9wdHJfZW5kID0gYWRqX2hfcHRyICsgZXh0X2NvdW50OwotICAgICAgZm9yICg7IGFkal9oX3B0ciA8IGFkal9oX3B0cl9lbmQ7IGFkal9oX3B0cisrKQotCXsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmFkal9oOwotCi0JICBhZGpfaCA9ICphZGpfaF9wdHI7Ci0JICBpZiAoYWRqX2ggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIChhZGpfaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGFkal9oLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICYmIGFkal9oLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAgICAgJiYgYWRqX2gtPmVzeW0uYXN5bS52YWx1ZSA+IGludF9yZWwucl92YWRkcikKLQkgICAgYWRqX2gtPnJvb3QudS5kZWYudmFsdWUgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQl9Ci0KLSAgICAgIC8qIEFkZCBhbiBlbnRyeSB0byB0aGUgc3ltYm9sIHZhbHVlIGFkanVzdCBsaXN0LiAgVGhpcyBpcyB1c2VkCi0JIGJ5IGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIHRvIGFkanVzdCB0aGUgdmFsdWVzIG9mCi0JIGludGVybmFsIHN5bWJvbHMgYW5kIEZEUidzLiAgKi8KLSAgICAgIGFkanVzdCA9ICgoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCkpKTsKLSAgICAgIGlmIChhZGp1c3QgPT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRqdXN0LT5zdGFydCA9IGludF9yZWwucl92YWRkcjsKLSAgICAgIGFkanVzdC0+ZW5kID0gc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGFkanVzdC0+YWRqdXN0ID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotICAgICAgYWRqdXN0LT5uZXh0ID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0OwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0ID0gYWRqdXN0OwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwgJiYgISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyAhPSAoYmZkX2J5dGUgKikgTlVMTCAmJiAhIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoZW4gYSBQQwotICAgcmVsYXRpdmUgcmVsb2MgbXVzdCBiZSBleHBhbmRlZCBpbnRvIHRoZSBmaXZlIGluc3RydWN0aW9uIHNlcXVlbmNlLgotICAgSXQgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIGV4cGFuc2lvbiwgaW5jbHVkaW5nIHJlc29sdmluZwotICAgdGhlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsYXhfcGNyZWwxNiAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLCBsb2NhdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX2J5dGUgKmxvY2F0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiAweDA0MTFmZmZmIGlzIGJnZXphbCAkMCwuID09IGJhbCAuICAqLwotICBCRkRfQVNTRVJUIChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKSA9PSAweDA0MTFmZmZmKTsKLQotICAvKiBXZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN5bWJvbCBhbmQgdGhlCi0gICAgIGN1cnJlbnQgYWRkcmVzcyBwbHVzIGVpZ2h0LiAgKi8KLSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyZXNzICsgODsKLQotICAvKiBJZiB0aGUgbG93ZXIgaGFsZiBpcyBuZWdhdGl2ZSwgaW5jcmVtZW50IHRoZSB1cHBlciAxNiBoYWxmLiAgKi8KLSAgaWYgKChyZWxvY2F0aW9uICYgMHg4MDAwKSAhPSAwKQotICAgIHJlbG9jYXRpb24gKz0gMHgxMDAwMDsKLQotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDQxMTAwMDEsIGxvY2F0aW9uKTsgLyogYmFsIC4rOCAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgMHgzYzAxMDAwMCB8ICgocmVsb2NhdGlvbiA+PiAxNikgJiAweGZmZmYpLCAvKiBsdWkgJGF0LFhYICovCi0JICAgICAgbG9jYXRpb24gKyA0KTsKLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIDB4MjQyMTAwMDAgfCAocmVsb2NhdGlvbiAmIDB4ZmZmZiksIC8qIGFkZGl1ICRhdCwkYXQsWFggKi8KLQkgICAgICBsb2NhdGlvbiArIDgpOwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDAzZjA4MjEsIGxvY2F0aW9uICsgMTIpOyAvKiBhZGR1ICRhdCwkYXQsJHJhICovCi0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHgwMDIwZjgwOSwgbG9jYXRpb24gKyAxNik7IC8qIGphbHIgJGF0ICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdpdmVuIGEgLnNkYXRhIHNlY3Rpb24gYW5kIGEgLnJlbC5zZGF0YSBpbi1tZW1vcnkgc2VjdGlvbiwgc3RvcmUKLSAgIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW50byB0aGUgLnJlbC5zZGF0YSBzZWN0aW9uIHdoaWNoIGNhbiBiZQotICAgdXNlZCBhdCBydW50aW1lIHRvIHJlbG9jYXRlIHRoZSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlCi0gICBsaW5rZXIgd2hlbiB0aGUgLS1lbWJlZGRlZC1yZWxvY3Mgc3dpdGNoIGlzIHVzZWQuICBUaGlzIGlzIGNhbGxlZAotICAgYWZ0ZXIgdGhlIGFkZF9zeW1ib2xzIGVudHJ5IHBvaW50IGhhcyBiZWVuIGNhbGxlZCBmb3IgYWxsIHRoZQotICAgb2JqZWN0cywgYW5kIGJlZm9yZSB0aGUgZmluYWxfbGluayBlbnRyeSBwb2ludCBpcyBjYWxsZWQuICBUaGlzCi0gICBmdW5jdGlvbiBwcmVzdW1lcyB0aGF0IHRoZSBvYmplY3Qgd2FzIGNvbXBpbGVkIHVzaW5nCi0gICAtbWVtYmVkZGVkLXBpYy4gICovCi0KLWJvb2xlYW4KLWJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MgKGFiZmQsIGluZm8sIGRhdGFzZWMsIHJlbHNlYywgZXJybXNnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqZGF0YXNlYzsKLSAgICAgYXNlY3Rpb24gKnJlbHNlYzsKLSAgICAgY2hhciAqKmVycm1zZzsKLXsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICpzZWN0aW9uX3RkYXRhOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWw7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbF9lbmQ7Ci0gIGJmZF9ieXRlICpwOwotCi0gIEJGRF9BU1NFUlQgKCEgaW5mby0+cmVsb2NhdGVhYmxlKTsKLQotICAqZXJybXNnID0gTlVMTDsKLQotICBpZiAoZGF0YXNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW1faGFzaGVzID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXM7Ci0KLSAgaWYgKCEgbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgZGF0YXNlYykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJlbHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBkYXRhc2VjLT5yZWxvY19jb3VudCAqIDQpOwotICBpZiAocmVsc2VjLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwID0gcmVsc2VjLT5jb250ZW50czsKLQotICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBkYXRhc2VjKTsKLSAgZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOwotICBleHRfcmVsX2VuZCA9IGV4dF9yZWwgKyBkYXRhc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBwICs9IDQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBib29sZWFuIHRleHRfcmVsYXRpdmU7Ci0KLSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOwotCi0gICAgICAvKiBXZSBhcmUgZ29pbmcgdG8gd3JpdGUgYSBmb3VyIGJ5dGUgd29yZCBpbnRvIHRoZSBydW50aW1lIHJlbG9jCi0JIHNlY3Rpb24uICBUaGUgd29yZCB3aWxsIGJlIHRoZSBhZGRyZXNzIGluIHRoZSBkYXRhIHNlY3Rpb24KLQkgd2hpY2ggbXVzdCBiZSByZWxvY2F0ZWQuICBUaGlzIG11c3QgYmUgb24gYSB3b3JkIGJvdW5kYXJ5LAotCSB3aGljaCBtZWFucyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLiAgV2UgdXNlIHRoZQotCSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gaW5kaWNhdGUgaG93IHRoZSB2YWx1ZSBpbiB0aGUgZGF0YQotCSBzZWN0aW9uIG11c3QgYmUgcmVsb2NhdGVkLiAgQSAwIG1lYW5zIHRoYXQgdGhlIHZhbHVlIGlzCi0JIHJlbGF0aXZlIHRvIHRoZSB0ZXh0IHNlY3Rpb24sIHdoaWxlIGEgMSBpbmRpY2F0ZXMgdGhhdCB0aGUKLQkgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIGRhdGEgc2VjdGlvbi4gIEdpdmVuIHRoYXQgd2UgYXJlCi0JIGFzc3VtaW5nIHRoZSBjb2RlIHdhcyBjb21waWxlZCB1c2luZyAtbWVtYmVkZGVkLXBpYywgdGhlcmUKLQkgc2hvdWxkIG5vdCBiZSBhbnkgb3RoZXIgcG9zc2liaWxpdGllcy4gICovCi0KLSAgICAgIC8qIFdlIGNhbiBvbmx5IHJlbG9jYXRlIFJFRldPUkQgcmVsb2NzIGF0IHJ1biB0aW1lLiAgKi8KLSAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVGV09SRCkKLQl7Ci0JICAqZXJybXNnID0gXygidW5zdXBwb3J0ZWQgcmVsb2MgdHlwZSIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQl7Ci0JICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gc3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKLQkgIC8qIElmIGggaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCBhbgotCSAgICAgZXh0ZXJuYWwgc3ltYm9sIHdoaWNoIHdlIHRob3VnaHQgd2FzIGp1c3QgYSBkZWJ1Z2dpbmcKLQkgICAgIHN5bWJvbC4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgaWYgKGggPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCSAgICB0ZXh0X3JlbGF0aXZlID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgdGV4dF9yZWxhdGl2ZSA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGludF9yZWwucl9zeW1uZHgpCi0JICAgIHsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1RFWFQ6Ci0JICAgICAgdGV4dF9yZWxhdGl2ZSA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TREFUQToKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1NCU1M6Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVQ4OgotCSAgICAgIHRleHRfcmVsYXRpdmUgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBObyBvdGhlciBzZWN0aW9ucyBzaG91bGQgYXBwZWFyIGluIC1tZW1iZWRkZWQtcGljCi0gICAgICAgICAgICAgICAgIGNvZGUuICAqLwotCSAgICAgICplcnJtc2cgPSBfKCJyZWxvYyBhZ2FpbnN0IHVuc3VwcG9ydGVkIHNlY3Rpb24iKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICgoaW50X3JlbC5yX29mZnNldCAmIDMpICE9IDApCi0JewotCSAgKmVycm1zZyA9IF8oInJlbG9jIG5vdCBwcm9wZXJseSBhbGlnbmVkIik7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsCi0JCSAgKGludF9yZWwucl92YWRkciAtIGRhdGFzZWMtPnZtYSArIGRhdGFzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyAodGV4dF9yZWxhdGl2ZSA/IDAgOiAxKSksCi0JCSAgcCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyBpcyB0aGUgRUNPRkYgYmFja2VuZCBzdHJ1Y3R1cmUuICBUaGUgYmFja2VuZCBmaWVsZCBvZiB0aGUKLSAgIHRhcmdldCB2ZWN0b3IgcG9pbnRzIHRvIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSBtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSA9Ci17Ci0gIC8qIENPRkYgYmFja2VuZCBzdHJ1Y3R1cmUuICAqLwotICB7Ci0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpIGJmZF92b2lkLCAvKiBhdXhfaW4gKi8KLSAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19pbiAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLGludCxpbnQsaW50LGludCxQVFIpKSliZmRfdm9pZCwvKmF1eF9vdXQqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogbGluZW5vX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogcmVsb2Nfb3V0ICovCi0gICAgbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfb3V0LCBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQsCi0gICAgbWlwc19lY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gICAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgMCwgMCwgMCwgMCwgdHJ1ZSwgZmFsc2UsIDQsCi0gICAgbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfaW4sIG1pcHNfZWNvZmZfc3dhcF9hb3V0aGRyX2luLAotICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfaW4sIE5VTEwsCi0gICAgbWlwc19lY29mZl9iYWRfZm9ybWF0X2hvb2ssIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICAgIF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vaywgX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncywKLSAgICBfYmZkX2Vjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICB9LAotICAvKiBTdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgYmZkX2FyY2hfbWlwcywKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gICJfX19fX19fX19fIiwKLSAgLyogVGhlIHBhZ2UgYm91bmRhcnkgdXNlZCB0byBhbGlnbiBzZWN0aW9ucyBpbiBhIGRlbWFuZC1wYWdlZAotICAgICBleGVjdXRhYmxlIGZpbGUuICBFLmcuLCAweDEwMDAuICAqLwotICAweDEwMDAsCi0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICBmYWxzZSwKLSAgLyogQml0c2l6ZSBvZiBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgMzIsCi0gIC8qIFJlbG9jIHRvIHVzZSBmb3IgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gICZtaXBzX2hvd3RvX3RhYmxlW01JUFNfUl9SRUZXT1JEXSwKLSAgewotICAgIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICAgIG1hZ2ljU3ltLAotICAgIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgICA0LAotICAgIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgICBlY29mZl9zd2FwX29wdF9pbiwKLSAgICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICAgIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gICAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gICAgZWNvZmZfc3dhcF9leHRfb3V0LAotICAgIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICAgIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbwotICB9LAotICAvKiBFeHRlcm5hbCByZWxvYyBzaXplLiAgKi8KLSAgUkVMU1osCi0gIC8qIFJlbG9jIHN3YXBwaW5nIGZ1bmN0aW9ucy4gICovCi0gIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiwKLSAgbWlwc19lY29mZl9zd2FwX3JlbG9jX291dCwKLSAgLyogQmFja2VuZCByZWxvYyB0d2Vha2luZy4gICovCi0gIG1pcHNfYWRqdXN0X3JlbG9jX2luLAotICBtaXBzX2FkanVzdF9yZWxvY19vdXQsCi0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiwKLSAgLyogRG8gZmluYWwgYWRqdXN0bWVudHMgdG8gZmlsZWhkciBhbmQgYW91dGhkci4gICovCi0gIE5VTEwsCi0gIC8qIFJlYWQgYW4gZWxlbWVudCBmcm9tIGFuIGFyY2hpdmUgYXQgYSBnaXZlbiBmaWxlIHBvc2l0aW9uLiAgKi8KLSAgX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MKLX07Ci0KLS8qIExvb2tpbmcgdXAgYSByZWxvYyB0eXBlIGlzIE1JUFMgc3BlY2lmaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBHZXR0aW5nIHJlbG9jYXRlZCBzZWN0aW9uIGNvbnRlbnRzIGlzIGdlbmVyaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotLyogSGFuZGxpbmcgZmlsZSB3aW5kb3dzIGlzIGdlbmVyaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotLyogUmVsYXhpbmcgc2VjdGlvbnMgaXMgTUlQUyBzcGVjaWZpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gbWlwc19yZWxheF9zZWN0aW9uCi0KLS8qIEdDIG9mIHNlY3Rpb25zIGlzIG5vdCBkb25lLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotY29uc3QgYmZkX3RhcmdldCBlY29mZl9saXR0bGVfdmVjID0KLXsKLSAgImVjb2ZmLWxpdHRsZW1pcHMiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl9ta29iamVjdCwgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAmbWlwc19lY29mZl9iYWNrZW5kX2RhdGEKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgZWNvZmZfYmlnX3ZlYyA9Ci17Ci0gICJlY29mZi1iaWdtaXBzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLSB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAmbWlwc19lY29mZl9iYWNrZW5kX2RhdGEKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgZWNvZmZfYmlnbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1iaWdsaXR0bGVtaXBzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcG1hYy5jIGIvYmZkL2NvZmYtcG1hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzMzMmQ5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXBtYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBwbGUgZXQgYWwgUG93ZXJQQyBNYWMgIlhDT0ZGIiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQlwbWFjX3hjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkieGNvZmYtcG93ZXJtYWMiCi0KLS8qIFR3ZWFrIGNvZmZjb2RlLmggYmFzZWQgb24gdGhpcyBiZWluZyBhIFBvd2VyTWFjIGluc3RlYWQgb2YgUlMvNjAwMC4gKi8KLQotI2RlZmluZSBQT1dFUk1BQwotCi0jaW5jbHVkZSAiY29mZi1yczYwMDAuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXBwYy5jIGIvYmZkL2NvZmYtcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDUwNDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTM0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUG93ZXJQQyBNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE9yaWdpbmFsIHZlcnNpb24gcGllY2VkIHRvZ2V0aGVyIGJ5IEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0KLSAgIFRoZXJlIGlzIG5vdGhpbmcgbmV3IHVuZGVyIHRoZSBzdW4uIFRoaXMgZmlsZSBkcmF3cyBhIGxvdCBvbiBvdGhlcgotICAgY29mZiBmaWxlcywgaW4gcGFydGljdWxhciwgdGhvc2UgZm9yIHRoZSBycy82MDAwLCBhbHBoYSwgbWlwcywgYW5kIAotICAgaW50ZWwgYmFja2VuZHMsIGFuZCB0aGUgUEUgd29yayBmb3IgdGhlIGFybS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ3VycmVudCBTdGF0ZToKLSAgIC0gb2JqZHVtcCB3b3JrcwotICAgLSByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotICAgLSBsZCB3aWxsIGxpbmsgZmlsZXMsIGJ1dCB0aGV5IGRvIG5vdCBydW4uCi0gICAtIGRsbHRvb2wgd2lsbCBub3QgcHJvZHVjZSBjb3JyZWN0IG91dHB1dCBpbiBzb21lIC5yZWxvYyBjYXNlcywgYW5kIHdpbGwgCi0gICAgIG5vdCBwcm9kdWNlIHRoZSByaWdodCBnbHVlIGNvZGUgZm9yIGRsbCBmdW5jdGlvbiBjYWxscy4KLSovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3Bvd2VycGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotCi0jZGVmaW5lIEJBRE1BRyh4KSBQUENCQURNQUcoeCkKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGR1bXBfdG9jIFBBUkFNUyAoKFBUUikpOwotCi0vKiBUaGUgdG9jIGlzIGEgc2V0IG9mIGJmZF92bWEgZmllbGRzLiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB2YWxpZCAgICAgICAgICovCi0vKiBhZGRyZXNzZXMgYXJlIGV2ZW4gKGkuZS4gdGhlIGJpdCByZXByZXNlbnRpbmcgIjEiIGlzIG9mZikgdG8gYWxsb3cgICAgICovCi0vKiB1cyB0byBlbmNvZGUgYSBsaXR0bGUgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhlIGZpZWxkICAgICAgICAgICAgICAgICAgICovCi0vKiAtIFVuYWxsb2NhdGVkIGFkZHJlc3NlcyBhcmUgaW50aWFsaXplZCB0byAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtIEFsbG9jYXRlZCBhZGRyZXNzZXMgYXJlIGV2ZW4gbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZmlyc3QgdGltZSB3ZSBhY3R1YWxseSB3cml0ZSBhIHJlZmVyZW5jZSB0byB0aGUgdG9jIGluIHRoZSBiZmQsICAgICovCi0vKiB3ZSB3YW50IHRvIHJlY29yZCB0aGF0IGZhY3QgaW4gYSBmaXh1cCBmaWxlIChpZiBpdCBpcyBhc2tlZCBmb3IpLCBzbyAgICovCi0vKiB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IGFuIGFkZHJlc3MgaGFzIGJlZW4gd3JpdHRlbiBieSBtYXJraW5nICovCi0vKiB0aGUgbG93IG9yZGVyIGJpdCB3aXRoIGEgIjEiIHVwb24gd3JpdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgU0VUX1VOQUxMT0NBVEVEKHgpICAoKHgpID0gMSkKLSNkZWZpbmUgSVNfVU5BTExPQ0FURUQoeCkgICAoKHgpID09IDEpCi0KLSNkZWZpbmUgSVNfV1JJVFRFTih4KSAgICAgICAoKHgpICYgMSkKLSNkZWZpbmUgTUFSS19BU19XUklUVEVOKHgpICAoKHgpIHw9IDEpCi0jZGVmaW5lIE1BS0VfQUREUl9BR0FJTih4KSAgKCh4KSAmPSB+MSkKLQotCi0vKiBUdXJuIG9uIHRoaXMgY2hlY2sgaWYgeW91IHN1c3BlY3Qgc29tZXRoaW5nIGFtaXNzIGluIHRoZSBoYXNoIHRhYmxlcyAqLwotI2lmZGVmIERFQlVHX0hBU0gKLQotLyogTmVlZCBhIDcgY2hhciBzdHJpbmcgZm9yIGFuIGV5ZSBjYXRjaGVyICovCi0jZGVmaW5lIEVZRSAia3JranVuayIKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTCBjaGFyIGV5ZV9jYXRjaGVyWzhdOwotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KSAgICAgIHN0cmNweShyZXQtPmV5ZV9jYXRjaGVyLCBFWUUpCi0jZGVmaW5lIEhBU0hfQ0hFQ0soYWRkcikgXAotIGlmIChzdHJjbXAoYWRkci0+ZXllX2NhdGNoZXIsIEVZRSkgIT0gMCkgXAotICB7IFwKLSAgICBmcHJpbnRmKHN0ZGVycixcCi0gICAgXygiRmlsZSAlcywgbGluZSAlZCwgSGFzaCBjaGVjayBmYWlsdXJlLCBiYWQgZXllICU4c1xuIiksIFwKLSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGFkZHItPmV5ZV9jYXRjaGVyKTsgXAotICAgIGFib3J0KCk7IFwKLSB9Ci0KLQotI2Vsc2UKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTAotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KQotI2RlZmluZSBIQVNIX0NIRUNLKGFkZHIpCi0KLSNlbmRpZgotCi0vKiBJbiBvcmRlciBub3QgdG8gYWRkIGFuIGludCB0byBldmVyeSBoYXNoIHRhYmxlIGl0ZW0gZm9yIGV2ZXJ5IGNvZmYKLSAgIGxpbmtlciwgd2UgZGVmaW5lIG91ciBvd24gaGFzaCB0YWJsZSwgZGVyaXZlZCBmcm9tIHRoZSBjb2ZmIG9uZSAqLwotCi0vKiBQRSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgICovCi0KLSAgLyogQXMgd2Ugd29uZGVyIGFyb3VuZCB0aGUgcmVsb2NzLCB3ZSdsbCBrZWVwIHRoZSBhc3NpZ25lZCB0b2Nfb2Zmc2V0Ci0gICAgIGhlcmUgKi8KLSAgYmZkX3ZtYSB0b2Nfb2Zmc2V0OyAgICAgICAgICAgICAgIC8qIE91ciBhZGRpdGlvbiwgYXMgcmVxdWlyZWQgKi8KLSAgaW50IHN5bWJvbF9pc19nbHVlOwotICB1bnNpZ25lZCBsb25nIGludCBnbHVlX2luc247Ci0KLSAgSEFTSF9DSEVDS19EQ0wKLX07Ci0KLQotLyogUEUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1wcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gCi0gICAgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCAKLQkJCSBzaXplb2YgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpKTsKLQotICBpZiAocmV0ID09IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgCi0JCQkJICAgICAgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIFNFVF9VTkFMTE9DQVRFRChyZXQtPnRvY19vZmZzZXQpOwotICAgICAgcmV0LT5zeW1ib2xfaXNfZ2x1ZSA9IDA7Ci0gICAgICByZXQtPmdsdWVfaW5zbiA9IDA7Ci0KLSAgICAgIEhBU0hfQ0hFQ0tfSU5JVChyZXQpOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBQRSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIFBFIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoISBwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBOb3csIHRhaWxvciBjb2ZmY29kZS5oIHRvIHVzZSBvdXIgaGFzaCBzdHVmZiAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0MCi0vKiBUaGUgbnQgbG9hZGVyIHBvaW50cyB0aGUgdG9jIHJlZ2lzdGVyIHRvICZ0b2MgKyAzMjc2OCwgaW4gb3JkZXIgdG8gKi8KLS8qIHVzZSB0aGUgY29tcGxldGUgcmFuZ2Ugb2YgYSAxNi1iaXQgZGlzcGxhY2VtZW50LiBXZSBoYXZlIHRvIGFkanVzdCAqLwotLyogZm9yIHRoaXMgd2hlbiB3ZSBmaXggdXAgbG9hZHMgZGlzcGxhY2VkIG9mZiB0aGUgdG9jIHJlZy4gICAgICAgICAgICovCi0jZGVmaW5lIFRPQ19MT0FEX0FESlVTVE1FTlQgKC0zMjc2OCkKLSNkZWZpbmUgVE9DX1NFQ1RJT05fTkFNRSAiLnByaXZhdGUudG9jIgotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotLyogdGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZ28gaW4gYSBoZWFkZXIgZmlsZSBzb21ld2hlcmUuLi4gKi8KLQotLyogTk9QICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgICAgICAgICAgMHgwMDAwCi0KLS8qIDY0LWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjY0ICAgICAgICAgICAgMHgwMDAxCi0KLS8qIDMyLWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyICAgICAgICAgICAgMHgwMDAyCi0KLS8qIDI2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIGFic29sdXRlKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIyNCAgICAgICAgICAgIDB4MDAwMwotCi0vKiAxNi1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNiAgICAgICAgICAgIDB4MDAwNAotCi0vKiAxNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTQgICAgICAgICAgICAweDAwMDUKLQotLyogMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUwyNCAgICAgICAgICAgICAweDAwMDYKLQotLyogMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMTQgICAgICAgICAgICAgMHgwMDA3Ci0KLS8qIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2ICAgICAgICAgIDB4MDAwOAotCi0vKiAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgICAgICAgICAgMHgwMDA5Ci0KLS8qIDMyLWJpdCBhZGRyIHcvbyBpbWFnZSBiYXNlICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyTkIgICAgICAgICAgMHgwMDBBCi0KLS8qIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwgICAgICAgICAgICAweDAwMEIKLQotLyogc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNUSU9OICAgICAgICAgICAweDAwMEMKLQotLyogc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lGR0xVRSAgICAgICAgICAgIDB4MDAwRAotCi0vKiBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19JTUdMVUUgICAgICAgICAgICAweDAwMEUKLQotLyogdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChsaW1pdGVkIHRvIDE2IGJpdHMpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMMTYgICAgICAgICAgMHgwMDBGCi0KLS8qIHN0dWZmIHRvIGhhbmRsZSBpbW1lZGlhdGUgZGF0YSB3aGVuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgKi8KLS8qIGRhdGEgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaW1tZWRpYXRlIGZpZWxkICovCi0vKiBXZSBuZWVkIHRvIGRvICh1c3VhbGx5KSAzMiBiaXQgYXJpdGhtZXRpYyBvbiAxNiBiaXQgY2h1bmtzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGSEkgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGTE8gICAgICAgICAgICAgMHgwMDExCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUEFJUiAgICAgICAgICAgICAgMHgwMDEyCi0KLS8qIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdG9jcmVsMTYsIHdpdGggVE9DREVGTiBhc3N1bWVkICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAgICAgMHgwMDEzCi0KLS8qICBGbGFnIGJpdHMgaW4gSU1BR0VfUkVMT0NBVElPTi5UWVBFICovCi0KLS8qIHN1YnRyYWN0IHJlbG9jIHZhbHVlIHJhdGhlciB0aGFuIGFkZGluZyBpdCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX05FRyAgICAgICAgICAgICAgIDB4MDEwMAotCi0vKiBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJUQUtFTiAgICAgICAgICAgMHgwMjAwCi0KLS8qIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggbm90IHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gICAgICAgICAgMHgwNDAwCi0KLS8qIHRvYyBzbG90IGRlZmluZWQgaW4gZmlsZSAob3IsIGRhdGEgaW4gdG9jKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gICAgICAgICAgIDB4MDgwMAotCi0vKiBtYXNrcyB0byBpc29sYXRlIGFib3ZlIHZhbHVlcyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlR5cGUgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyAgICAgICAgICAweDAwRkYKLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19GTEFHTUFTSyAgICAgICAgICAweDBGMDAKLQotI2RlZmluZSBFWFRSQUNUX1RZUEUoeCkgICAgICAgICAgICAgICAgICgoeCkgJiBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLKQotI2RlZmluZSBFWFRSQUNUX0ZMQUdTKHgpICgoeCkgJiBJTUFHRV9SRUxfUFBDX0ZMQUdNQVNLKQotI2RlZmluZSBFWFRSQUNUX0pVTksoeCkgIFwKLSAgICAgICAgICAgKCh4KSAmIH4oSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyB8IElNQUdFX1JFTF9QUENfRkxBR01BU0spKQotCi0MCi0vKiBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlIHJlbG9jYXRpb24gd29yayAqLwotLyogKFdvcmsgSW4gUHJvZ3Jlc3MpICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19wYWlyX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgIGNoYXIgKiplcnJvcikpOwotCi0MCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY190b2MxNl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLQotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2FkZHIzMm5iX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQkgUFRSIGRhdGEsCi0JCQkJCQkJIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCSBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWN0aW9uX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQlhcmVsZW50ICpyZWxvYywKLQkJCQkJCQlhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJUFRSIGRhdGEsCi0JCQkJCQkJYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCWNoYXIgKiplcnJvcikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWNyZWxfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2ltZ2x1ZV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLQotCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgUEFSQU1TKChiZmQgKmFiZmQsIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvKSk7Ci0KLQwKLS8qIEZJWE1FOiBJdCdsbCB0YWtlIGEgd2hpbGUgdG8gZ2V0IHRocm91Z2ggYWxsIG9mIHRoZXNlLiBJIG9ubHkgbmVlZCBhIGZldyB0bwotICAgZ2V0IHVzIHN0YXJ0ZWQsIHNvIHRob3NlIEknbGwgbWFrZSBzdXJlIHdvcmsuIFRob3NlIG1hcmtlZCBGSVhNRSBhcmUgZWl0aGVyCi0gICBjb21wbGV0ZWx5IHVudmVyaWZpZWQgb3IgaGF2ZSBhIHNwZWNpZmljIHVua25vd24gbWFya2VkIGluIHRoZSBjb21tZW50ICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJlbG9jYXRpb24gZW50cmllcyBmb3IgV2luZG93cy9OVCBvbiBQb3dlclBDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZyb20gdGhlIGRvY3VtZW50ICIiIHdlIGZpbmQgdGhlIGZvbGxvd2luZyBsaXN0ZWQgYXMgdXNlZCByZWxvY3M6ICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUJTT0xVVEUgICAgICAgOiBUaGUgbm9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUREUls2NHwzMnwxNl0gOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBkYXRhIGZpZWxkcyBvciB0aGUgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIG9uIGEgbG9hZC9zdG9yZS4gICAgICAgICAgICAgKi8KLS8qICAgQUREUlsyNHwxNF0gICAgOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBicmFuY2ggYW5kIGNvbmQgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBicmFuY2hlcy4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3Nlcy4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBUaGUgbG93IG9yZGVyIDIgYml0cyBhcmUgcHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgUkVMWzI0fDE0XSAgICAgOiBicmFuY2hlcyByZWxhdGl2ZSB0byB0aGUgSW5zdHJ1Y3Rpb24gQWRkcmVzcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3NlcywgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBhcyBiZWZvcmUuIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB3aWxsIGJlIHplcm8sIGFuZCAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgU1lNIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgbGluayB0aW1lLiAgKi8KLS8qICAgVE9DUkVMMTYgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIHJlZmVycmluZyB0byBhIHNsb3QgaW4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0b2MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVE9DUkVMMTQgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkLCBzaW1pbGFyIHRvIFJFTDE0IG9yIEFERFIxNC4gKi8KLS8qICAgQUREUjMyTkIgICAgICAgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAoT24gdGhlIGFscGhhLCB0aGlzIGlzIGFsd2F5cyBhIGxpbmtlciBnZW5lcmF0ZWQgdGh1bmspKi8KLS8qICAgICAgICAgICAgICAgICAgICAoaS5lLiAzMmJpdCBhZGRyIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBiYXNlKSAgICAgICAgICAgKi8KLS8qICAgU0VDUkVMICAgICAgICAgOiBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBzeW1ib2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgU0VDVElPTiAgICAgICAgOiBhY2Nlc3MgdG8gdGhlIGhlYWRlciBjb250YWluaW5nIHRoZSBpdGVtLiBTdXBwb3J0cyB0aGUgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb2RldmlldyBkZWJ1Z2dlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEluIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgICAgICAgICAgKi8KLS8qIHJlbG9jYXRpb25zIGxpc3RlZCBpbiB0aGUgaGVhZGVyIGZpbGUgYXJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgMHgwMDAwICAgTk9QICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUJTT0xVVEUsIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGRvbnQgY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFCU09MVVRFIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsCSAJICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwLCAgICAgICAgCQkgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjY0IDB4MDAwMSAgNjQtYml0IGFkZHJlc3MgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyhJTUFHRV9SRUxfUFBDX0FERFI2NCwgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTMsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCTY0LAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAJIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkiQUREUjY0IiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JdHJ1ZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JTUlOVVNfT05FLAkgCSAvKiBzcmNfbWFzayAqLwotCU1JTlVTX09ORSwgICAgICAgIAkgLyogZHN0X21hc2sgKi8KLQlmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMiAweDAwMDIgIDMyLWJpdCBhZGRyZXNzICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMjQgMHgwMDAzICAyNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCBhYnNvbHV0ZSkgKi8KLSAgLyogdGhlIExJIGZpZWxkIGlzIGluIGJpdCA2IHRocm91Z2ggYml0IDI5IGlzIDI0IGJpdHMsICsgMiBmb3IgdGhlIHNoaWZ0ICovCi0gIC8qIE9mIGNvdXJzZSwgVGhhdCdzIHRoZSBJQk0gYXBwcm92ZWQgYml0IG51bWJlcmluZywgd2hpY2ggaXMgbm90IHdoYXQgKi8KLSAgLyogYW55b25lIGVsc2UgdXNlcy4uLi4gVGhlIGxpIGZpZWxkIGlzIGluIGJpdCAyIHRocnUgMjUgKi8gCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIyNCwgIC8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjI0IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwN2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDdmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMTYgMHgwMDA0ICAxNi1iaXQgYWRkcmVzcyAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMTYsICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIxNiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIxNCAweDAwMDUgKi8KLSAgLyogIDE2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBGSVhNRTogdGhlIG1hc2sgaXMgbGlrZWx5IHdyb25nLCBhbmQgdGhlIGJpdCBwb3NpdGlvbiBtYXkgYmUgYXMgd2VsbCAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIxNCwgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjE2IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMjQgMHgwMDA2ICovCi0gIC8qICAgMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUkVMMjQsICAgLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVMMjQiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMTQgMHgwMDA3ICovCi0gIC8qICAgMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0gIC8qIEZJWE1FOiB0aGUgbWFzayBpcyBsaWtlbHkgd3JvbmcsIGFuZCB0aGUgYml0IHBvc2l0aW9uIG1heSBiZSBhcyB3ZWxsICovCi0gIC8qIEZJWE1FOiBob3cgZG9lcyBpdCBrbm93IGhvdyBmYXIgdG8gc2hpZnQ/ICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjE0LCAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBRERSMTYiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAweDAwMDggKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfVE9DUkVMMTYsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3RvYzE2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJUT0NSRUwxNiIsICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgMHgwMDA5ICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0LC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTQiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMk5CIDB4MDAwQSAqLwotICAvKiAgIDMyLWJpdCBhZGRyIHcvIGltYWdlIGJhc2UgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMzJOQiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyTkIiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfU0VDUkVMIDB4MDAwQiAqLwotICAvKiAgIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfc2VjcmVsX3JlbG9jLCAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1NFQ1RJT04gMHgwMDBDICovCi0gIC8qICAgc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNUSU9OLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3NlY3Rpb25fcmVsb2MsICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNUSU9OIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JRkdMVUUgMHgwMDBEICovCi0gIC8qICAgc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19JRkdMVUUsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJJRkdMVUUiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JTUdMVUUgMHgwMDBFICovCi0gIC8qICAgc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfSU1HTFVFLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19pbWdsdWVfcmVsb2MsICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiSU1HTFVFIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiAweDAwMEYgKi8KLSAgLyogICB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGxpbWl0ZWQgdG8gMTYgYml0cykgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTDE2IiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19SRUZISSAgICAgICAgICAgICAweDAwMTAgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19SRUZISSwgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVGSEkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1JFRkxPICAgICAgICAgICAgIDB4MDAxMSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1JFRkxPLCAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSRUZMTyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19QQUlSICAgICAgICAgICAgICAweDAwMTIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19QQUlSLCAgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19wYWlyX3JlbG9jLCAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUEFJUiIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAweDAwMTMgKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHdpdGhvdXQgY2F1c2luZyBhIGRlZmluaXRpb24gKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKCAoSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiB8IElNQUdFX1JFTF9QUENfVE9DREVGTiksIC8qIHR5cGUgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTYsIFRPQ0RFRk4iLCAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLQotDAotCi0vKiBTb21lIHJlYWxseSBjaGVlenkgbWFjcm9zIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiB0byB0ZXN0IHN0ZGVyciA6LSkgKi8KLQotI2lmZGVmIERFQlVHX1JFTE9DCi0jZGVmaW5lIFVOX0lNUEwoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHN0YXRpYyBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBpZiAoaSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgZnByaW50ZihzdGRlcnIsXygiVW5pbXBsZW1lbnRlZCBSZWxvY2F0aW9uIC0tICVzXG4iKSx4KTsgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEVU1QX1JFTE9DKG4scikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIGFkZHIgJWQsIGFkZGVuZCAlZFxuIiwgXAotCSAgIG4sICgqKHItPnN5bV9wdHJfcHRyKSktPm5hbWUsICAgICAgICAgICAgIFwKLQkgICByLT5hZGRyZXNzLCByLT5hZGRlbmQpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIEdpdmVuIGEgcmVsb2MgbmFtZSwgbiwgYW5kIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbF9yZWxvYywgCi0gICBkdW1wIG91dCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBvbiB0aGUgY29udGVudHMgCi0KLSNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCi0jZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCi0jZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0Ci0KLSovCi0KLSNkZWZpbmUgRFVNUF9SRUxPQzIobixyKSAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIHJfdmFkZHIgJWQgJXNcbiIsIFwKLQkgICBuLCByLT5yX3N5bW5keCwgci0+cl92YWRkcixcCi0JICAgKCgoci0+cl90eXBlKSAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgPT0gMCkgXAotCSAgID8iICI6IiBUT0NERUZOIiAgKTsgICAgICBcCi19Ci0KLSNlbHNlCi0jZGVmaW5lIFVOX0lNUEwoeCkKLSNkZWZpbmUgRFVNUF9SRUxPQyhuLHIpCi0jZGVmaW5lIERVTVBfUkVMT0MyKG4scikKLSNlbmRpZgotCi0KLQwKLS8qIHRvYyBjb25zdHJ1Y3Rpb24gYW5kIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBhbmQgdGhlc2UgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIG9uZQotICAgb2YgdGhlIGNvbXBpbGF0aW9ucy4gIEZJWE1FOiBUaGlzIGlzIGNvbmZ1c2luZyBhbmQgd2VpcmQuICBBbHNvLAotICAgQkZEIHNob3VsZCBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuICAqLwotZXh0ZXJuIGJmZCogYmZkX29mX3RvY19vd25lcjsKLWV4dGVybiBsb25nIGludCBnbG9iYWxfdG9jX3NpemU7Ci0KLWV4dGVybiBsb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWV4dGVybiBsb25nIGludCBmaXJzdF90aHVua19hZGRyZXNzOwotZXh0ZXJuIGxvbmcgaW50IHRodW5rX3NpemU7Ci0KLWVudW0gdG9jX3R5cGUKLXsKLSAgZGVmYXVsdF90b2MsCi0gIHRvY18zMiwKLSAgdG9jXzY0Ci19OwotCi1lbnVtIHJlZl9jYXRlZ29yeQotewotICBwcml2LAotICBwdWIsCi0gIGRhdGEKLX07Ci0KLXN0cnVjdCBsaXN0X2VsZQotewotICBzdHJ1Y3QgbGlzdF9lbGUgKm5leHQ7Ci0gIGJmZF92bWEgYWRkcjsKLSAgZW51bSByZWZfY2F0ZWdvcnkgY2F0OwotICBpbnQgb2Zmc2V0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2VsZSAqaGVhZDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyB2b2lkIHJlY29yZF90b2MKLSAgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBlbnVtIHJlZl9jYXRlZ29yeSwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdG9jICh0b2Nfc2VjdGlvbiwgb3VyX3RvY19vZmZzZXQsIGNhdCwgbmFtZSkKLSAgICAgYXNlY3Rpb24gKnRvY19zZWN0aW9uOwotICAgICBpbnQgb3VyX3RvY19vZmZzZXQ7Ci0gICAgIGVudW0gcmVmX2NhdGVnb3J5IGNhdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogYWRkIHRoaXMgZW50cnkgdG8gb3VyIHRvYyBhZGRyLW9mZnNldC1uYW1lIGxpc3QgKi8KLSAgc3RydWN0IGxpc3RfZWxlICp0OwotICB0ID0gKHN0cnVjdCBsaXN0X2VsZSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaXN0X2VsZSkpOwotICBpZiAodCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotICB0LT5uZXh0ID0gMDsKLSAgdC0+b2Zmc2V0ID0gb3VyX3RvY19vZmZzZXQ7Ci0gIHQtPm5hbWUgPSBuYW1lOwotICB0LT5jYXQgPSBjYXQ7Ci0gIHQtPmFkZHIgPSB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCi0gIGlmIChoZWFkID09IDApCi0gICAgewotICAgICAgaGVhZCA9IHQ7Ci0gICAgICB0YWlsID0gdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YWlsLT5uZXh0ID0gdDsKLSAgICAgIHRhaWwgPSB0OwotICAgIH0KLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi1zdGF0aWMgYm9vbGVhbiBwcGNfcmVjb3JkX3RvY19lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgaW50LCBlbnVtIHRvY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotCi0vKiByZWNvcmQgYSB0b2Mgb2Zmc2V0IGFnYWluc3QgYSBzeW1ib2wgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfcmVjb3JkX3RvY19lbnRyeShhYmZkLCBpbmZvLCBzZWMsIHN5bSwgdG9jX2tpbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCBzeW07Ci0gICAgIGVudW0gdG9jX3R5cGUgdG9jX2tpbmQ7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaW50ICpsb2NhbF9zeW1zOwotCi0gIGggPSAwOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0gIGlmIChoICE9IDApCi0gICAgewotICAgICAgSEFTSF9DSEVDSyhoKTsKLSAgICB9Ci0KLSAgaWYgKGggPT0gMCkgCi0gICAgeyAKLSAgICAgIGxvY2FsX3N5bXMgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoYWJmZCk7Ci0gICAgICBpZiAobG9jYWxfc3ltcyA9PSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgLyogYWxsb2NhdGUgYSB0YWJsZSAqLwotCSAgbG9jYWxfc3ltcyA9IAotCSAgICAoaW50ICopIGJmZF96YWxsb2MgKGFiZmQsIAotCQkJCW9ial9yYXdfc3ltZW50X2NvdW50KGFiZmQpICogc2l6ZW9mKGludCkpOwotCSAgaWYgKGxvY2FsX3N5bXMgPT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGFiZmQpID0gbG9jYWxfc3ltczsKLQkgIGZvciAoaSA9IDA7IGkgPCBvYmpfcmF3X3N5bWVudF9jb3VudChhYmZkKTsgKytpKQotCSAgICB7Ci0JICAgICAgU0VUX1VOQUxMT0NBVEVEKGxvY2FsX3N5bXNbaV0pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoSVNfVU5BTExPQ0FURUQobG9jYWxfc3ltc1tzeW1dKSkgCi0JewotCSAgbG9jYWxfc3ltc1tzeW1dID0gZ2xvYmFsX3RvY19zaXplOwotCSAgZ2xvYmFsX3RvY19zaXplICs9IDQ7Ci0KLQkgIC8qIFRoZSBzaXplIG11c3QgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkgIGlmIChnbG9iYWxfdG9jX3NpemUgPiA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIHRvYyBzbG90IGFsbG9jYXRlZC4gSWYgbm90LCBkbyBpdAotCSBoZXJlLiBJdCB3aWxsIGJlIHVzZWQgaW4gcmVsb2NhdGVfc2VjdGlvbiAqLwotICAgICAgaWYgKElTX1VOQUxMT0NBVEVEKGgtPnRvY19vZmZzZXQpKQotCXsKLQkgIGgtPnRvY19vZmZzZXQgPSBnbG9iYWxfdG9jX3NpemU7Ci0JICBnbG9iYWxfdG9jX3NpemUgKz0gNDsKLQotCSAgLyogVGhlIHNpemUgbXVzdCBmaXQgaW4gYSAxNmJpdCBkaXNwbGFjbWVudCAqLwotCSAgaWYgKGdsb2JhbF90b2Nfc2l6ZSA+PSA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIHJlY29yZCBhIHRvYyBvZmZzZXQgYWdhaW5zdCBhIHN5bWJvbCAqLwotc3RhdGljIHZvaWQKLXBwY19tYXJrX3N5bWJvbF9hc19nbHVlKGFiZmQsIHN5bSwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzeW07Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotewotICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0KLSAgSEFTSF9DSEVDSyhoKTsKLQotICBoLT5zeW1ib2xfaXNfZ2x1ZSA9IDE7Ci0gIGgtPmdsdWVfaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSAmcmVsLT5yX3ZhZGRyKTsKLQotICByZXR1cm47Ci19Ci0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQwKLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gCi0gICAgKCEgaG93dG8tPnBjX3JlbGF0aXZlKSAKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0FERFIzMk5CKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfVE9DUkVMMTYpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19JTUdMVUUpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19JRkdMVUUpIAotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfU0VDUkVMKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfU0VDVElPTikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1NFQ1JFTDE2KQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfUkVGSEkpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19SRUZMTykKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1BBSVIpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19UT0NSRUwxNl9ERUZOKSA7Ci19ICAgICAKLQotI2lmIDAKLQotLyogdGhpcyBmdW5jdGlvbiBpcyBpbiBjaGFyZ2Ugb2YgcGVyZm9ybWluZyBhbGwgdGhlIHBwYyBQRSByZWxvY2F0aW9ucyAqLwotLyogRG9uJ3QgeWV0IGtub3cgaWYgd2Ugd2FudCB0byBkbyB0aGlzIHRoaXMgcGFydGljdWxhciB3YXkgLi4uIChrcmspICAqLwotLyogRklYTUU6IChpdCBpcyBub3QgeWV0IGVuYWJsZWQpICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBlX3BwY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogdGhlIGNvbnN0aCByZWxvY2F0aW9uIGNvbWVzIGluIHR3byBwYXJ0cywgd2UgaGF2ZSB0byByZW1lbWJlcgotICAgICB0aGUgc3RhdGUgYmV0d2VlbiBjYWxscywgaW4gdGhlc2UgdmFyaWFibGVzICovCi0gIHN0YXRpYyBib29sZWFuIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydDFfY29uc3RoX3ZhbHVlOwotCi0gIHVuc2lnbmVkIGxvbmcgc3ltX3ZhbHVlOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzIDsgLyorIGlucHV0X3NlY3Rpb24tPnZtYSovCi0JCi0gIHJfdHlwZSA9IHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCkgCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nIC0gZG8gbm90aGluZyAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7IAotICAgIH0KLQotICBpZiAoc3ltYm9sX2luICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBLZWVwIHRoZSBzdGF0ZSBtYWNoaW5lIGhhcHB5IGluIGNhc2Ugd2UncmUgY2FsbGVkIGFnYWluICovCi0gICAgICBpZiAocl90eXBlID09IElNQUdFX1JFTF9QUENfUkVGSEkpIAotCXsKLQkgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOwotCSAgcGFydDFfY29uc3RoX3ZhbHVlICA9IDA7Ci0JfQotICAgICAgcmV0dXJuKGJmZF9yZWxvY191bmRlZmluZWQpOwotICAgIH0KLSAgCi0gIGlmICgocGFydDFfY29uc3RoX2FjdGl2ZSkgJiYgKHJfdHlwZSAhPSBJTUFHRV9SRUxfUFBDX1BBSVIpKSAKLSAgICB7Ci0gICAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgUEFJUiIpOwotICAgICAgcmV0dXJuKGJmZF9yZWxvY19kYW5nZXJvdXMpOwotICAgIH0KLQotCi0gIHN5bV92YWx1ZSA9IGdldF9zeW1ib2xfdmFsdWUoc3ltYm9sX2luKTsKLSAgCi0gIHJldHVybihiZmRfcmVsb2Nfb2spOwkKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotLyogVGhlIHJlbG9jIHByb2Nlc3Npbmcgcm91dGluZSBmb3IgdGhlIG9wdGltaXplZCBDT0ZGIGxpbmtlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0gIGJvb2xlYW4gaGloYWxmOwotICBiZmRfdm1hIGhpaGFsZl92YWw7Ci0gIGFzZWN0aW9uICp0b2Nfc2VjdGlvbiA9IDA7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSAwOwotICAKLSAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhCi0gICAgIHRoaW5nLiAgVGhlIGNhbGxlciB3aWxsIHRha2UgY2FyZSBvZiBhZGp1c3RpbmcgdGhlIHJlbG9jCi0gICAgIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgaGloYWxmID0gZmFsc2U7Ci0gIGhpaGFsZl92YWwgPSAwOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgdmFsOwotCi0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKmxvYzsKLQotICAgICAgdW5zaWduZWQgc2hvcnQgcl90eXBlICA9IEVYVFJBQ1RfVFlQRSAocmVsLT5yX3R5cGUpOwotICAgICAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MocmVsLT5yX3R5cGUpOwotICAKLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0gICAgICBsb2MgPSBjb250ZW50cyArIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgLyogRklYTUU6IGNoZWNrIGJvdW5kcyBvbiByX3R5cGUgKi8KLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgCi0JICAgIChvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF0pOwotCSAgaWYgKGggIT0gMCkgCi0JICAgIHsKLQkgICAgICBIQVNIX0NIRUNLKGgpOwotCSAgICB9Ci0KLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAocl90eXBlID09IElNQUdFX1JFTF9QUENfSU1HTFVFICYmIGggPT0gMCkKLQl7Ci0JICAvKiBBbiBJTUdMVUUgcmVsb2MgbXVzdCBoYXZlIGEgbmFtZS4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0JICBhYm9ydCgpOwotCX0KLQotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIC8qIEZJWE1FOiBQQUlSIHVuc3VwcG9ydGVkIGluIHRoZSBmb2xsb3dpbmcgY29kZSAqLwotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLQkgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZSk7Ci0JICAgICAgaWYgKCEgb2JqX3BlIChvdXRwdXRfYmZkKSkKLQkJdmFsIC09IHNlYy0+dm1hOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEhBU0hfQ0hFQ0soaCk7Ci0KLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotICAgICAgCi0gICAgICAvKiBFYWNoIGNhc2UgbXVzdCBkbyBpdHMgb3duIHJlbG9jYXRpb24sIHNldHRpbmcgcnN0YXQgYXBwcm9wcmlhdGVseSAqLwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotCSAgewotCSAgICBiZmRfdm1hIG91cl90b2Nfb2Zmc2V0OwotCSAgICBpbnQgZml4aXQ7Ci0KLQkgICAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0KLQkgICAgaWYgKHRvY19zZWN0aW9uID09IDApIAotCSAgICAgIHsKLQkJdG9jX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYmZkX29mX3RvY19vd25lciwgCi0JCQkJCQkgICAgICAgVE9DX1NFQ1RJT05fTkFNRSk7Ci0KLQkJaWYgKCB0b2Nfc2VjdGlvbiA9PSBOVUxMICkgCi0JCSAgewotCQkgICAgLyogVGhlcmUgaXMgbm8gdG9jIHNlY3Rpb24uIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotCQkgICAgYWJvcnQoKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIC8qIAotCSAgICAgKiAgQW1hemluZyBiaXQgdHJpY2tzIHByZXNlbnQuIEFzIHdlIG1heSBoYXZlIHNlZW4gZWFybGllciwgd2UKLQkgICAgICogIHVzZSB0aGUgMSBiaXQgdG8gdGVsbCB1cyB3aGV0aGVyIG9yIG5vdCBhIHRvYyBvZmZzZXQgaGFzIGJlZW4KLQkgICAgICogIGFsbG9jYXRlZC4gTm93IHRoYXQgdGhleSd2ZSBhbGwgYmVlbiBhbGxvY2F0ZWQsIHdlIHdpbGwgdXNlCi0JICAgICAqICB0aGUgMSBiaXQgdG8gdGVsbCB1cyBpZiB3ZSd2ZSB3cml0dGVuIHRoaXMgcGFydGljdWxhciB0b2MKLQkgICAgICogIGVudHJ5IG91dC4KLQkgICAgICovCi0JICAgIGZpeGl0ID0gZmFsc2U7Ci0JICAgIGlmIChoID09IDApCi0JICAgICAgeyAvKiBpdCBpcyBhIGZpbGUgbG9jYWwgc3ltYm9sICovCi0JCWludCAqbG9jYWxfdG9jX3RhYmxlOwotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCXN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JCW5hbWUgPSBzeW0tPl9uLl9uX25hbWU7Ci0KLQkJbG9jYWxfdG9jX3RhYmxlID0gb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGlucHV0X2JmZCk7Ci0JCW91cl90b2Nfb2Zmc2V0ID0gbG9jYWxfdG9jX3RhYmxlW3N5bW5keF07Ci0KLQkJaWYgKElTX1dSSVRURU4ob3VyX3RvY19vZmZzZXQpKQotCQkgIHsKLQkJICAgIC8qIGlmIGl0IGhhcyBiZWVuIHdyaXR0ZW4gb3V0LCBpdCBpcyBtYXJrZWQgd2l0aCB0aGUgCi0JCSAgICAgICAxIGJpdC4gRml4IHVwIG91ciBvZmZzZXQsIGJ1dCBkbyBub3Qgd3JpdGUgaXQgb3V0Ci0JCSAgICAgICBhZ2Fpbi4KLQkJICAgICAqLwotCQkgICAgTUFLRV9BRERSX0FHQUlOKG91cl90b2Nfb2Zmc2V0KTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiB3cml0ZSBvdXQgdGhlIHRvYyBlbnRyeSAqLwotCQkgICAgcmVjb3JkX3RvYyh0b2Nfc2VjdGlvbiwgCi0JCQkgICAgICAgb3VyX3RvY19vZmZzZXQsIAotCQkJICAgICAgIHByaXYsIAotCQkJICAgICAgIHN0cmR1cChuYW1lKSk7Ci0KLQkJICAgIGJmZF9wdXRfMzIob3V0cHV0X2JmZCwKLQkJCSAgICAgICB2YWwsCi0JCQkgICAgICAgdG9jX3NlY3Rpb24tPmNvbnRlbnRzICsgb3VyX3RvY19vZmZzZXQpOwotCi0JCSAgICBNQVJLX0FTX1dSSVRURU4obG9jYWxfdG9jX3RhYmxlW3N5bW5keF0pOwotCQkgICAgZml4aXQgPSB0cnVlOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JCW91cl90b2Nfb2Zmc2V0ID0gaC0+dG9jX29mZnNldDsKLQotCQlpZiAoKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pIAotCQkgICAgPT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICkKLQkJICB7Ci0JCSAgICAvKiBUaGlzIGlzIHVuYmVsaWV2YWJsZSBjaGVlc2UuIFNvbWUga25vd2xlZGdhYmxlIGFzbSAKLQkJICAgICAgIGhhY2tlciBoYXMgZGVjaWRlZCB0byB1c2UgcjIgYXMgYSBiYXNlIGZvciBsb2FkaW5nIAotCQkgICAgICAgYSB2YWx1ZS4gSGUvU2hlIGRvZXMgdGhpcyBieSBzZXR0aW5nIHRoZSB0b2NkZWZuIGJpdCwgCi0JCSAgICAgICBhbmQgbm90IHN1cHBseWluZyBhIHRvYyBkZWZpbml0aW9uLiBUaGUgYmVoYXZpb3VyIGlzIAotCQkgICAgICAgdGhlbiB0byB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWUgb2YgdGhlIAotCQkgICAgICAgc3ltYm9sIGFuZCB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mIHRoZSB0b2MgYXMgdGhlIHRvYyAKLQkJICAgICAgIGluZGV4LiAKLQotCQkgICAgICAgSW4gZmFjdCwgd2hhdCBpcyB1c3VhbGx5IGhhcHBlbmluZyBpcywgYmVjYXVzZSB0aGUKLQkJICAgICAgIEltcG9ydCBBZGRyZXNzIFRhYmxlIGlzIG1hcHBlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKLQkJICAgICAgIHRoZSB0b2MsIHNvbWUgdHJpcHB5IGxpYnJhcnkgY29kZSB0cnlpbmcgZm9yIHNwZWVkIG9uCi0JCSAgICAgICBkbGwgbGlua2FnZSwgdGFrZXMgYWR2YW50YWdlIG9mIHRoYXQgYW5kIGNvbnNpZGVycyAKLQkJICAgICAgIHRoZSBJQVQgdG8gYmUgcGFydCBvZiB0aGUgdG9jLCB0aHVzIHNhdmluZyBhIGxvYWQuCi0JCSAgICAqLwotCi0JCSAgICBvdXJfdG9jX29mZnNldCA9IHZhbCAtIAotCQkgICAgICAodG9jX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAKLQkJICAgICAgIHRvY19zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkgICAgLyogVGhlIHNpemUgbXVzdCBzdGlsbCBmaXQgaW4gYSAxNmJpdCBkaXNwbGFjbWVudCAqLwotCQkgICAgaWYgKG91cl90b2Nfb2Zmc2V0ID49IDY1NTM1KQotCQkgICAgICB7Ci0JCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgKF8oIiVzOiBSZWxvY2F0aW9uIGZvciAlcyBvZiAleCBleGNlZWRzIFRvYyBzaXplIGxpbWl0IiksIAotCQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgbmFtZSwgb3VyX3RvY19vZmZzZXQpOwotCQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIH0KLQotCQkgICAgcmVjb3JkX3RvYyh0b2Nfc2VjdGlvbiwgb3VyX3RvY19vZmZzZXQsIHB1Yiwgc3RyZHVwKG5hbWUpKTsKLQkJICB9Ci0JCWVsc2UgaWYgKElTX1dSSVRURU4ob3VyX3RvY19vZmZzZXQpKQotCQkgIHsKLQkJICAgIC8qIGlmIGl0IGhhcyBiZWVuIHdyaXR0ZW4gb3V0LCBpdCBpcyBtYXJrZWQgd2l0aCB0aGUgCi0JCSAgICAgICAxIGJpdC4gRml4IHVwIG91ciBvZmZzZXQsIGJ1dCBkbyBub3Qgd3JpdGUgaXQgb3V0Ci0JCSAgICAgICBhZ2Fpbi4KLQkJICAgICAqLwotCQkgICAgTUFLRV9BRERSX0FHQUlOKG91cl90b2Nfb2Zmc2V0KTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCBvdXJfdG9jX29mZnNldCwgcHViLCBzdHJkdXAobmFtZSkpOwotCi0JCSAgICAvKiB3cml0ZSBvdXQgdGhlIHRvYyBlbnRyeSAqLwotCQkgICAgYmZkX3B1dF8zMihvdXRwdXRfYmZkLAotCQkJICAgICAgIHZhbCwKLQkJCSAgICAgICB0b2Nfc2VjdGlvbi0+Y29udGVudHMgKyBvdXJfdG9jX29mZnNldCk7Ci0KLQkJICAgIE1BUktfQVNfV1JJVFRFTihoLT50b2Nfb2Zmc2V0KTsKLQkJICAgIC8qIFRoZSB0cmlja3kgcGFydCBpcyB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3MgdGhhdCAqLwotCQkgICAgLyogbmVlZHMgYSAucmVsb2MgZW50cnkgZm9yIGl0ICovCi0JCSAgICBmaXhpdCA9IHRydWU7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoZml4aXQgJiYgaW5mby0+YmFzZV9maWxlKSAKLQkgICAgICB7Ci0JCS8qIFNvIGlmIHRoaXMgaXMgbm9uIHBjcmVsYXRpdmUsIGFuZCBpcyByZWZlcmVuY2VkCi0JCSAgIHRvIGEgc2VjdGlvbiBvciBhIGNvbW1vbiBzeW1ib2wsIHRoZW4gaXQgbmVlZHMgYSByZWxvYyAqLwotCi0JCS8qIHJlbG9jYXRpb24gdG8gYSBzeW1ib2wgaW4gYSBzZWN0aW9uIHdoaWNoCi0JCSAgIGlzbid0IGFic29sdXRlIC0gd2Ugb3V0cHV0IHRoZSBhZGRyZXNzIGhlcmUgCi0JCSAgIHRvIGEgZmlsZSAqLwotCi0JCWJmZF92bWEgYWRkciA9ICB0b2Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgdG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBvdXJfdG9jX29mZnNldDsKLQkJICAgIAotCQlpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLQkJICBhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0KLQkJZndyaXRlICgmYWRkciwgMSw0LCAoRklMRSAqKSBpbmZvLT5iYXNlX2ZpbGUpOwotCSAgICAgIH0KLQotCi0JICAgIC8qIEZJWE1FOiB0aGlzIHRlc3QgaXMgY29uc2VydmF0aXZlICovCi0JICAgIGlmICggKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pICE9IElNQUdFX1JFTF9QUENfVE9DREVGTiAmJgotCQlvdXJfdG9jX29mZnNldCA+IHRvY19zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IFJlbG9jYXRpb24gZXhjZWVkcyBhbGxvY2F0ZWQgVE9DICgleCkiKSwgCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCSAgIHRvY19zZWN0aW9uLT5fcmF3X3NpemUpOwotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICAvKiBOb3cgd2Uga25vdyB0aGUgcmVsb2NhdGlvbiBmb3IgdGhpcyB0b2MgcmVmZXJlbmNlICovCi0JICAgIHJlbG9jYXRpb24gPSAgb3VyX3RvY19vZmZzZXQgKyBUT0NfTE9BRF9BREpVU1RNRU5UOwotCSAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkJCQkgICAgaW5wdXRfYmZkLCAKLQkJCQkJICAgIHJlbG9jYXRpb24sIAotCQkJCQkgICAgbG9jKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19JRkdMVUU6Ci0JICB7Ci0JICAgIC8qIFRvIHNvbHZlIHRoaXMsIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIG9yIG5vdCB0aGUgc3ltYm9sICovCi0JICAgIC8qIGFwcGVhcmluZyBvbiB0aGUgY2FsbCBpbnN0cnVjdGlvbiBpcyBhIGdsdWUgZnVuY3Rpb24gb3Igbm90LiAqLwotCSAgICAvKiBBIGdsdWUgZnVuY3Rpb24gbXVzdCBhbm5vdW5jZSBpdHNlbGYgdmlhIGEgSU1HTFVFIHJlbG9jLCBhbmQgKi8KLQkgICAgLyogdGhlIHJlbG9jIGNvbnRhaW5zIHRoZSByZXF1aXJlZCB0b2MgcmVzdG9yZSBpbnN0cnVjdGlvbiAqLwotCSAgCi0JICAgIGJmZF92bWEgeDsKLQkgICAgY29uc3QgY2hhciAqbXlfbmFtZTsKLQkgICAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0KLQkgICAgaWYgKGggIT0gMCkKLQkgICAgICB7Ci0JCW15X25hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWlmIChoLT5zeW1ib2xfaXNfZ2x1ZSA9PSAxKSAKLQkJICB7Ci0JCSAgICB4ID0gYmZkX2dldF8zMihpbnB1dF9iZmQsIGxvYyk7Ci0JCSAgICBiZmRfcHV0XzMyKGlucHV0X2JmZCwgaC0+Z2x1ZV9pbnNuLCBsb2MpOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfU0VDUkVMOgotCSAgLyogVW5pbXBsZW1lbnRlZDogY29kZXZpZXcgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCi0JICAvKiBGb3IgZmFzdCBhY2Nlc3MgdG8gdGhlIGhlYWRlciBvZiB0aGUgc2VjdGlvbiAKLQkgICAgIGNvbnRhaW5pbmcgdGhlIGl0ZW0uICovCi0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfU0VDVElPTjoKLQkgIC8qIFVuaW1wbGVtZW50ZWQ6IGNvZGV2aWV3IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLwotCSAgLyogSXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUgcmVsYXRpdmUKLQkgICAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gdGhhdCBjb250YWlucyB0aGUKLQkgICAgIHN5bWJvbCAqLwotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0FCU09MVVRFOgotCSAgewotCSAgICBjb25zdCBjaGFyICpteV9uYW1lOwotCSAgICBpZiAoaCA9PSAwKQotCQlteV9uYW1lID0gKHN5bXMrc3ltbmR4KS0+X24uX25fbmFtZTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkgICAgICB9Ci0KLQkgICAgZnByaW50ZihzdGRlcnIsIAotCQkgICAgXygiV2FybmluZzogdW5zdXBwb3J0ZWQgcmVsb2MgJXMgPGZpbGUgJXMsIHNlY3Rpb24gJXM+XG4iKSwgCi0JCSAgICBob3d0by0+bmFtZSwKLQkJICAgIGJmZF9nZXRfZmlsZW5hbWUoaW5wdXRfYmZkKSwKLQkJICAgIGlucHV0X3NlY3Rpb24tPm5hbWUpOwotCi0JICAgIGZwcmludGYoc3RkZXJyLCJzeW0gJWxkICglcyksIHJfdmFkZHIgJWxkICglbHgpXG4iLCAKLQkJICAgIHJlbC0+cl9zeW1uZHgsIG15X25hbWUsIChsb25nKSByZWwtPnJfdmFkZHIsCi0JCSAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyKTsgIAotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLQkgIHsKLQkgICAgLyogVGhlcmUgaXMgbm90aGluZyB0byBkbyBub3cuIFRoaXMgcmVsb2Mgd2FzIG5vdGVkIGluIHRoZSBmaXJzdAotCSAgICAgICBwYXNzIG92ZXIgdGhlIHJlbG9jcywgYW5kIHRoZSBnbHVlIGluc3RydWN0aW9uIGV4dHJhY3RlZCAqLwotCSAgICBjb25zdCBjaGFyICpteV9uYW1lOwotCSAgICBpZiAoaC0+c3ltYm9sX2lzX2dsdWUgPT0gMSkgCi0JICAgICAgYnJlYWs7Ci0JICAgIG15X25hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0KLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgKF8oIiVzOiBPdXQgb2Ygb3JkZXIgSU1HTFVFIHJlbG9jIGZvciAlcyIpLCAKLQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgbXlfbmFtZSk7Ci0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0KLQljYXNlIElNQUdFX1JFTF9QUENfQUREUjMyTkI6Ci0JICB7Ci0JICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqbXloID0gMDsKLQkgICAgY29uc3QgY2hhciAqbmFtZSA9IDA7Ci0JICAgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCi0JICAgIGlmIChzdHJuY21wKCIuaWRhdGEkMiIsaW5wdXRfc2VjdGlvbi0+bmFtZSw4KSA9PSAwICYmIGZpcnN0X3RodW5rX2FkZHJlc3MgPT0gMCkKLQkgICAgICB7Ci0JCS8qIHNldCBtYWdpYyB2YWx1ZXMgKi8KLQkJaW50IGlkYXRhNW9mZnNldDsKLQkJc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpteWggPSAwOwotCQlteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCSAgICAgIl9faWRhdGE1X21hZ2ljX18iLAotCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWZpcnN0X3RodW5rX2FkZHJlc3MgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgKyAKLQkJICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAKLQkJICAgIHNlYy0+b3V0cHV0X29mZnNldCAtIAotCQkgICAgICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCQkKLQkJaWRhdGE1b2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQlteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCSAgICAgIl9faWRhdGE2X21hZ2ljX18iLAotCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQotCQl0aHVua19zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlIC0gaWRhdGE1b2Zmc2V0OwotCQlteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCSAgICAgIl9faWRhdGE0X21hZ2ljX18iLAotCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWltcG9ydF90YWJsZV9zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCSAgICAgIH0KLQotCSAgICBpZiAoaCA9PSAwKQotCSAgICAgIHsgLyogaXQgaXMgYSBmaWxlIGxvY2FsIHN5bWJvbCAqLwotCQlzeW0gPSBzeW1zICsgc3ltbmR4OwotCQluYW1lID0gc3ltLT5fbi5fbl9uYW1lOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY2hhciAqdGFyZ2V0ID0gMDsKLQotCQluYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCQlpZiAoc3RyY21wKCIuaWRhdGEkMiIsIG5hbWUpID09IDApCi0JCSAgdGFyZ2V0ID0gIl9faWRhdGEyX21hZ2ljX18iOwotCQllbHNlIGlmIChzdHJjbXAoIi5pZGF0YSQ0IiwgbmFtZSkgPT0gMCkKLQkJICB0YXJnZXQgPSAiX19pZGF0YTRfbWFnaWNfXyI7Ci0JCWVsc2UgaWYgKHN0cmNtcCgiLmlkYXRhJDUiLCBuYW1lKSA9PSAwKQotCQkgIHRhcmdldCA9ICJfX2lkYXRhNV9tYWdpY19fIjsKLQotCQlpZiAodGFyZ2V0ICE9IDApCi0JCSAgewotCQkgICAgbXloID0gMDsKLQotCQkgICAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJIHRhcmdldCwKLQkJCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkgICAgaWYgKG15aCA9PSAwKSAKLQkJICAgICAgewotCQkJLyogTWlzc2luZyBtYWdpYyBjb29raWVzLiBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KLQkJCWFib3J0KCk7Ci0JCSAgICAgIH0KLQkJICAgIAotCQkgICAgdmFsID0gbXloLT5yb290LnUuZGVmLnZhbHVlICsgCi0JCSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldDsKLQkJICAgIGlmIChmaXJzdF90aHVua19hZGRyZXNzID09IDApCi0JCSAgICAgIHsKLQkJCWludCBpZGF0YTVvZmZzZXQ7Ci0JCQlteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgICAgICJfX2lkYXRhNV9tYWdpY19fIiwKLQkJCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCWZpcnN0X3RodW5rX2FkZHJlc3MgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgKyAKLQkJCSAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgCi0JCQkgICAgc2VjLT5vdXRwdXRfb2Zmc2V0IC0gCi0JCQkgICAgICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCQkJCi0JCQlpZGF0YTVvZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCQlteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgICAgICJfX2lkYXRhNl9tYWdpY19fIiwKLQkJCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCQotCQkJdGh1bmtfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSAtIGlkYXRhNW9mZnNldDsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE0X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJaW1wb3J0X3RhYmxlX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCSAgICAgIAkgICAgICBpbnB1dF9iZmQsIAotCQkJICAgICAgdmFsIC0gCi0JCQkgICAgICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlLAotCQkJICAgICAgbG9jKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotCSAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0JICB2YWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkJCQkgIGlucHV0X2JmZCwgCi0JCQkJCSAgdmFsLCAKLQkJCQkJICBsb2MpOwotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIxNjoKLQljYXNlIElNQUdFX1JFTF9QUENfQUREUjI0OgotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzI6Ci0JICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgaW5wdXRfYmZkLCAKLQkJCQkJICB2YWwsIAotCQkJCQkgIGxvYyk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICggaW5mby0+YmFzZV9maWxlICkKLQl7Ci0JICAvKiBTbyBpZiB0aGlzIGlzIG5vbiBwY3JlbGF0aXZlLCBhbmQgaXMgcmVmZXJlbmNlZAotCSAgICAgdG8gYSBzZWN0aW9uIG9yIGEgY29tbW9uIHN5bWJvbCwgdGhlbiBpdCBuZWVkcyBhIHJlbG9jICovCi0JICBpZiAoc3ltICYmIHBlX2RhdGEob3V0cHV0X2JmZCktPmluX3JlbG9jX3Aob3V0cHV0X2JmZCwgaG93dG8pKQotCSAgICB7Ci0JICAgICAgLyogcmVsb2NhdGlvbiB0byBhIHN5bWJvbCBpbiBhIHNlY3Rpb24gd2hpY2gKLQkJIGlzbid0IGFic29sdXRlIC0gd2Ugb3V0cHV0IHRoZSBhZGRyZXNzIGhlcmUgCi0JCSB0byBhIGZpbGUgKi8KLQkgICAgICBiZmRfdm1hIGFkZHIgPSByZWwtPnJfdmFkZHIgCi0JCS0gaW5wdXRfc2VjdGlvbi0+dm1hIAotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgCi0JCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JICAgICAgaWYgKGNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpCi0JCXsKLQkJICBhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCX0KLQkgICAgICBmd3JpdGUgKCZhZGRyLCAxLDQsIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlIGlmIChzeW0gPT0gTlVMTCkKLQkgICAgICBuYW1lID0gIip1bmtub3duKiI7Ci0JICAgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICYmIHN5bS0+X24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgICBuYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JCWJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQluYW1lID0gYnVmOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIAotCQkgICAgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0KLSAgICB9ICAgICAKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi0vKiBGSVhNRTogQkZEIHNob3VsZCBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuICBUaGlzIGZpbGUgaXMgY29tcGlsZWQKLSAgIHR3aWNlLCBhbmQgdGhlc2UgdmFyaWFibGVzIGFyZSBzaGFyZWQuICBUaGlzIGlzIGNvbmZ1c2luZyBhbmQKLSAgIHdlaXJkLiAgKi8KLQotbG9uZyBpbnQgZ2xvYmFsX3RvY19zaXplID0gNDsKLQotYmZkKiBiZmRfb2ZfdG9jX293bmVyID0gMDsKLQotbG9uZyBpbnQgaW1wb3J0X3RhYmxlX3NpemU7Ci1sb25nIGludCBmaXJzdF90aHVua19hZGRyZXNzOwotbG9uZyBpbnQgdGh1bmtfc2l6ZTsKLQotc3RydWN0IGxpc3RfZWxlICpoZWFkOwotc3RydWN0IGxpc3RfZWxlICp0YWlsOwotCi1zdGF0aWMgY2hhciAqCi1oMSA9IE5fKCJcblx0XHRcdFRPQyBNQVBQSU5HXG5cbiIpOwotc3RhdGljIGNoYXIgKgotaDIgPSBOXygiIFRPQyAgICBkaXNhc3NlbWJseSAgQ29tbWVudHMgICAgICAgTmFtZVxuIik7Ci1zdGF0aWMgY2hhciAqCi1oMyA9IE5fKCIgT2Zmc2V0ICBzcGVsbGluZyAgICAgICAgICAgICAgICAgICAoaWYgcHJlc2VudClcbiIpOwotCi12b2lkCi1kdW1wX3RvYyAodmZpbGUpCi0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBzdHJ1Y3QgbGlzdF9lbGUgKnQ7Ci0KLSAgZnByaW50ZihmaWxlLCBfKGgxKSk7Ci0gIGZwcmludGYoZmlsZSwgXyhoMikpOwotICBmcHJpbnRmKGZpbGUsIF8oaDMpKTsKLQotICBmb3IodCA9IGhlYWQ7IHQgIT0gMDsgdD10LT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmNhdCA9ICIiOwotCi0gICAgICBpZiAodC0+Y2F0ID09IHByaXYpCi0JY2F0ID0gXygicHJpdmF0ZSAgICAgICAiKTsKLSAgICAgIGVsc2UgaWYgKHQtPmNhdCA9PSBwdWIpCi0JY2F0ID0gXygicHVibGljICAgICAgICAiKTsKLSAgICAgIGVsc2UgaWYgKHQtPmNhdCA9PSBkYXRhKQotCWNhdCA9IF8oImRhdGEtaW4tdG9jICAgIik7Ci0KLSAgICAgIGlmICh0LT5vZmZzZXQgPiBnbG9iYWxfdG9jX3NpemUpCi0JewotCSAgaWYgKHQtPm9mZnNldCA8PSBnbG9iYWxfdG9jX3NpemUgKyB0aHVua19zaXplKQotCSAgICBjYXQgPSBfKCJJQVQgcmVmZXJlbmNlICIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZihmaWxlLAotCQkgICAgICBfKCIqKioqIGdsb2JhbF90b2Nfc2l6ZSAlbGQoJWx4KSwgdGh1bmtfc2l6ZSAlbGQoJWx4KVxuIiksCi0JCSAgICAgIGdsb2JhbF90b2Nfc2l6ZSwgZ2xvYmFsX3RvY19zaXplLCB0aHVua19zaXplLCB0aHVua19zaXplKTsKLQkgICAgICBjYXQgPSBfKCJPdXQgb2YgYm91bmRzISIpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgIiAlMDRseCAgICAoJWQpIiwgKHVuc2lnbmVkIGxvbmcpIHQtPm9mZnNldCwgdC0+b2Zmc2V0IC0gMzI3NjgpOwotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgICIgICAgJXMgJXNcbiIsCi0JICAgICAgY2F0LCB0LT5uYW1lKTsKLQotICAgIH0KLQotICBmcHJpbnRmKGZpbGUsICJcbiIpOwotfQotCi1ib29sZWFuCi1wcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gKGluZm8pIAotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9ieXRlICpmb287Ci0gIHN0YXRpYyBjaGFyIHRlc3RfY2hhciA9ICcxJzsKLQotICBpZiAoIGdsb2JhbF90b2Nfc2l6ZSA9PSAwICkgLyogRklYTUU6IGRvZXMgdGhpcyBnZXQgbWUgaW4gdHJvdWJsZT8gKi8KLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX29mX3RvY19vd25lciA9PSAwKQotICAgIHsKLSAgICAgIC8qIE5vIHRvYyBvd25lcj8gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0gICAgICBhYm9ydCgpOwotICAgIH0KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKCBiZmRfb2ZfdG9jX293bmVyICwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0gIGlmIChzID09IE5VTEwpIAotICAgIHsKLSAgICAgIC8qIE5vIHRvYyBzZWN0aW9uPyBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KLSAgICAgIGFib3J0KCk7Ci0gICAgfQotCi0gIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MoYmZkX29mX3RvY19vd25lciwgZ2xvYmFsX3RvY19zaXplKTsKLSAgbWVtc2V0KGZvbywgdGVzdF9jaGFyLCBnbG9iYWxfdG9jX3NpemUpOwotCi0gIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbF90b2Nfc2l6ZTsKLSAgcy0+Y29udGVudHMgPSBmb287Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLXBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmksICpyZWw7Ci0KLSAgLyogaGVyZSB3ZSBoYXZlIGEgYmZkIHRoYXQgaXMgdG8gYmUgaW5jbHVkZWQgb24gdGhlIGxpbmsuIFdlIGhhdmUgYSBob29rCi0gICAgIHRvIGRvIHJlbG9jIHJ1bW1hZ2luZywgYmVmb3JlIHNlY3Rpb24gc2l6ZXMgYXJlIG5haWxlZCBkb3duLiAqLwotCi0gIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyhhYmZkKTsKLQotICAvKiBydW1tYWdlIGFyb3VuZCBhbGwgdGhlIHJlbG9jcyBhbmQgbWFwIHRoZSB0b2MgKi8KLSAgc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHNlYyA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBmb3IgKDsgc2VjICE9IDA7IHNlYyA9IHNlYy0+bmV4dCkKLSAgewotICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApIAotICAgICAgY29udGludWU7Ci0KLSAgICAvKiBsb2FkIHRoZSByZWxvY3MgKi8KLSAgICAvKiBGSVhNRTogdGhlcmUgbWF5IGJlIGEgc3RvcmFnZSBsZWFrIGhlcmUgKi8KLSAgICBpPV9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyhhYmZkLHNlYywxLDAsMCwwKTsKLSAgICAKLSAgICBpZiAoaSA9PSAwKQotICAgICAgYWJvcnQoKTsKLQotICAgIGZvciAocmVsPWk7cmVsPGkrc2VjLT5yZWxvY19jb3VudDsrK3JlbCkgCi0gICAgICB7Ci0JdW5zaWduZWQgc2hvcnQgcl90eXBlICA9IEVYVFJBQ1RfVFlQRSAocmVsLT5yX3R5cGUpOwotCXVuc2lnbmVkIHNob3J0IHJfZmxhZ3MgPSBFWFRSQUNUX0ZMQUdTKHJlbC0+cl90eXBlKTsKLQlib29sZWFuIG9rID0gdHJ1ZTsKLQotCURVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKLQotCXN3aXRjaChyX3R5cGUpIAotCSAgewotCSAgY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotCSAgICAvKiBpZiBUT0NERUZOIGlzIG9uLCBpZ25vcmUgYXMgc29tZW9uZSBlbHNlIGhhcyBhbGxvY2F0ZWQgdGhlCi0JICAgICAgIHRvYyBlbnRyeSAqLwotCSAgICBpZiAoIChyX2ZsYWdzICYgSU1BR0VfUkVMX1BQQ19UT0NERUZOKSAhPSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gKQotCSAgICAgIG9rID0gcHBjX3JlY29yZF90b2NfZW50cnkoYWJmZCwgaW5mbywgc2VjLCAKLQkJCQkJcmVsLT5yX3N5bW5keCwgZGVmYXVsdF90b2MpOwotCSAgICBpZiAoIW9rKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIElNQUdFX1JFTF9QUENfSU1HTFVFOgotCSAgICBwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZShhYmZkLCByZWwtPnJfc3ltbmR4LCByZWwpOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZgotCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19yZWZoaV9yZWxvYyAoYWJmZCwKLQkJIHJlbG9jX2VudHJ5LAotCQkgc3ltYm9sLAotCQkgZGF0YSwKLQkJIGlucHV0X3NlY3Rpb24sCi0JCSBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIlJFRkhJIik7Ci0gIERVTVBfUkVMT0MoIlJFRkhJIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci19Ci0KLSNpZiAwCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19yZWZsb19yZWxvYyAoYWJmZCwKLQkJIHJlbG9jX2VudHJ5LAotCQkgc3ltYm9sLAotCQkgZGF0YSwKLQkJIGlucHV0X3NlY3Rpb24sCi0JCSBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIlJFRkxPIik7Ci0gIERVTVBfUkVMT0MoIlJFRkxPIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcGFpcl9yZWxvYyAoYWJmZCwKLQkJcmVsb2NfZW50cnksCi0JCXN5bWJvbCwKLQkJZGF0YSwKLQkJaW5wdXRfc2VjdGlvbiwKLQkJb3V0cHV0X2JmZCwKLQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIlBBSVIiKTsKLSAgRFVNUF9SRUxPQygiUEFJUiIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0MCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfdG9jMTZfcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJUT0NSRUwxNiIpOwotICBEVU1QX1JFTE9DKCJUT0NSRUwxNiIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0jaWYgMAotCi0vKiBBRERSMzJOQiA6IDMyIGJpdCBhZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSB2aXJ0dWFsIG9yaWdpbi4gICAgICAgICAqLwotLyogICAgICAgICAgICAoT24gdGhlIGFscGhhLCB0aGlzIGlzIGFsd2F5cyBhIGxpbmtlciBnZW5lcmF0ZWQgdGh1bmspKi8KLS8qICAgICAgICAgICAgKGkuZS4gMzJiaXQgYWRkciByZWxhdGl2ZSB0byB0aGUgaW1hZ2UgYmFzZSkgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX2FkZHIzMm5iX3JlbG9jIChhYmZkLAotCQkgICAgcmVsb2NfZW50cnksCi0JCSAgICBzeW1ib2wsCi0JCSAgICBkYXRhLAotCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsCi0JCSAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgVU5fSU1QTCgiQUREUjMyTkIiKTsKLSAgRFVNUF9SRUxPQygiQUREUjMyTkIiLHJlbG9jX2VudHJ5KTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3NlY3JlbF9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIlNFQ1JFTCIpOwotICBEVU1QX1JFTE9DKCJTRUNSRUwiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfc2VjdGlvbl9yZWxvYyAoYWJmZCwKLQkJICAgcmVsb2NfZW50cnksCi0JCSAgIHN5bWJvbCwKLQkJICAgZGF0YSwKLQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwKLQkJICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIlNFQ1RJT04iKTsKLSAgRFVNUF9SRUxPQygiU0VDVElPTiIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19pbWdsdWVfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJJTUdMVUUiKTsKLSAgRFVNUF9SRUxPQygiSU1HTFVFIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotDAotCi0jZGVmaW5lIE1BWF9SRUxPQ19JTkRFWCAgXAotICAgICAgKHNpemVvZihwcGNfY29mZl9ob3d0b190YWJsZSkgLyBzaXplb2YocHBjX2NvZmZfaG93dG9fdGFibGVbMF0pIC0gMSkKLQotCi0vKiBGSVhNRTogVGhlcmUgaXMgYSBwb3NzaWJsaXR5IHRoYXQgd2hlbiB3ZSByZWFkIGluIGEgcmVsb2MgZnJvbSBhIGZpbGUsCi0gICAgICAgICAgdGhhdCB0aGVyZSBhcmUgc29tZSBiaXRzIGVuY29kZWQgaW4gdGhlIHVwcGVyIHBvcnRpb24gb2YgdGhlIAotCSAgdHlwZSBmaWVsZC4gTm90IHlldCBpbXBsZW1lbnRlZC4KLSovCi1zdGF0aWMgdm9pZCBwcGNfY29mZl9ydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICpyZWxlbnQsCi0JCQkJCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbCkpOwotCi1zdGF0aWMgdm9pZAotcHBjX2NvZmZfcnR5cGUyaG93dG8gKHJlbGVudCwgaW50ZXJuYWwpCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbDsKLXsgIAotCi0gIC8qIFdlIGNhbiBlbmNvZGUgb25lIG9mIHRocmVlIHRoaW5ncyBpbiB0aGUgdHlwZSBmaWVsZCwgYXNpZGUgZnJvbSB0aGUKLSAgICAgdHlwZToKLSAgICAgMS4gSU1BR0VfUkVMX1BQQ19ORUcgLSBpbmRpY2F0ZXMgdGhlIHZhbHVlIGZpZWxkIGlzIGEgc3VidHJhY3Rpb24KLSAgICAgICAgdmFsdWUsIHJhdGhlciB0aGFuIGFuIGFkZGl0aW9uIHZhbHVlCi0gICAgIDIuIElNQUdFX1JFTF9QUENfQlJUQUtFTiwgSU1BR0VfUkVMX1BQQ19CUk5UQUtFTiAtIGluZGljYXRlcyB0aGF0Ci0gICAgICAgIHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4gb3Igbm90LgotICAgICAzLiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gLSB0b2Mgc2xvdCBkZWZpbml0aW9uIGluIHRoZSBmaWxlCi0gICAgIEZvciBub3csIHdlIGp1c3Qgc3RyaXAgdGhpcyBzdHVmZiB0byBmaW5kIHRoZSB0eXBlLCBhbmQgaWdub3JlIGl0IG90aGVyCi0gICAgIHRoYW4gdGhhdC4KLSAgKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKGludGVybmFsLT5yX3R5cGUpOwotICB1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhpbnRlcm5hbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQganVuayAgICA9IEVYVFJBQ1RfSlVOSyAoaW50ZXJuYWwtPnJfdHlwZSk7Ci0KLSAgLyogdGhlIG1hc2tpbmcgcHJvY2VzcyBvbmx5IHNsaWNlcyBvZmYgdGhlIGJvdHRvbSBieXRlIGZvciByX3R5cGUuICovCi0gIGlmICggcl90eXBlID4gTUFYX1JFTE9DX0lOREVYICkgCi0gICAgYWJvcnQoKTsKLQotICAvKiBjaGVjayBmb3IgYWJzb2x1dGUgY3JhcCAqLwotICBpZiAoIGp1bmsgIT0gMCApCi0gICAgYWJvcnQoKTsKLQotICBzd2l0Y2gocl90eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIxNjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfUkVMMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIyNDoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfQUREUjMyOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19JRkdMVUU6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIGludGVybmFsKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSU1HTFVFOgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCBpbnRlcm5hbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCBpbnRlcm5hbCk7Ci0gICAgICBpZiAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNl9ERUZOOwotICAgICAgZWxzZQotCWhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYoc3RkZXJyLCAKLQkgICAgICBfKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCByZWxvYyAlcyBbJWRdIHVzZWQgLS0gaXQgbWF5IG5vdCB3b3JrLlxuIiksCi0JICAgICAgcHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLAotCSAgICAgIHJfdHlwZSk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOyAgICAgIAotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgcmVsZW50LT5ob3d0byA9IGhvd3RvOwotICAKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9wcGNfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICAvKiBXZSBjYW4gZW5jb2RlIG9uZSBvZiB0aHJlZSB0aGluZ3MgaW4gdGhlIHR5cGUgZmllbGQsIGFzaWRlIGZyb20gdGhlCi0gICAgIHR5cGU6Ci0gICAgIDEuIElNQUdFX1JFTF9QUENfTkVHIC0gaW5kaWNhdGVzIHRoZSB2YWx1ZSBmaWVsZCBpcyBhIHN1YnRyYWN0aW9uCi0gICAgICAgIHZhbHVlLCByYXRoZXIgdGhhbiBhbiBhZGRpdGlvbiB2YWx1ZQotICAgICAyLiBJTUFHRV9SRUxfUFBDX0JSVEFLRU4sIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gLSBpbmRpY2F0ZXMgdGhhdAotICAgICAgICB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuIG9yIG5vdC4KLSAgICAgMy4gSU1BR0VfUkVMX1BQQ19UT0NERUZOIC0gdG9jIHNsb3QgZGVmaW5pdGlvbiBpbiB0aGUgZmlsZQotICAgICBGb3Igbm93LCB3ZSBqdXN0IHN0cmlwIHRoaXMgc3R1ZmYgdG8gZmluZCB0aGUgdHlwZSwgYW5kIGlnbm9yZSBpdCBvdGhlcgotICAgICB0aGFuIHRoYXQuCi0gICovCi0KLSAgdW5zaWduZWQgc2hvcnQgcl90eXBlICA9IEVYVFJBQ1RfVFlQRSAocmVsLT5yX3R5cGUpOwotICB1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0gIHVuc2lnbmVkIHNob3J0IGp1bmsgICAgPSBFWFRSQUNUX0pVTksgKHJlbC0+cl90eXBlKTsKLQotICAvKiB0aGUgbWFza2luZyBwcm9jZXNzIG9ubHkgc2xpY2VzIG9mZiB0aGUgYm90dG9tIGJ5dGUgZm9yIHJfdHlwZS4gKi8KLSAgaWYgKCByX3R5cGUgPiBNQVhfUkVMT0NfSU5ERVggKSAKLSAgICBhYm9ydCgpOwotICAKLSAgLyogY2hlY2sgZm9yIGFic29sdXRlIGNyYXAgKi8KLSAgaWYgKCBqdW5rICE9IDAgKQotICAgIGFib3J0KCk7Ci0gICAgCi0gIHN3aXRjaChyX3R5cGUpIAotICAgIHsKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfQUREUjMyTkI6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0gICAgICAqYWRkZW5kcCAtPSBwZV9kYXRhKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfVE9DUkVMMTY6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0gICAgICBpZiAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNl9ERUZOOwotICAgICAgZWxzZQotCWhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIxNjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfUkVMMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIyNDoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfQUREUjMyOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19JRkdMVUU6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1NFQ1RJT046Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1NFQ1JFTDoKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSU1HTFVFOgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgCi0JICAgICAgXygiV2FybmluZzogVW5zdXBwb3J0ZWQgcmVsb2MgJXMgWyVkXSB1c2VkIC0tIGl0IG1heSBub3Qgd29yay5cbiIpLAotCSAgICAgIHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkgICAgICByX3R5cGUpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJldHVybiBob3d0bzsKLX0KLQotCi0vKiBhIGNoZWVzeSBsaXR0bGUgbWFjcm8gdG8gbWFrZSB0aGUgY29kZSBhIGxpdHRsZSBtb3JlIHJlYWRhYmxlICovCi0jZGVmaW5lIEhPVzJNQVAoYmZkX3J0eXBlLHBwY19ydHlwZSkgIFwKLSBjYXNlIGJmZF9ydHlwZTogcmV0dXJuICZwcGNfY29mZl9ob3d0b190YWJsZVtwcGNfcnR5cGVdCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpwcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cAotUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1wcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzMyX0dPVE9GRiwgICAgSU1BR0VfUkVMX1BQQ19JTUdMVUUpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTZfR09UX1BDUkVMLCBJTUFHRV9SRUxfUFBDX0lGR0xVRSk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjE2KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19CMjYsICAgICAgSU1BR0VfUkVMX1BQQ19SRUwyNCk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfQkEyNiwgICAgIElNQUdFX1JFTF9QUENfQUREUjI0KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19UT0MxNiwgICAgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNl9HT1RPRkYsICAgIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18zMiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1JWQSwgICAgICAgICAgSU1BR0VfUkVMX1BQQ19BRERSMzJOQik7Ci0gICAgZGVmYXVsdDogCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLSN1bmRlZiBIT1cyTUFQCi0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgIHBwY19jb2ZmX3J0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYyB2b2lkIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZW5kaWYKLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gICAgICAgICAgY29mZl9wcGNfcnR5cGVfdG9faG93dG8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgICAgICAgICAgcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIGNvZmZfc3dhcF9zeW1faW5faG9vayAgICAgICAgcHBjX2NvZmZfc3dhcF9zeW1faW5faG9vawotI2VuZGlmCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykge2ludGVybmFsLnJfdHlwZT1ob3d0by0+dHlwZTt9Ci0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAotCi0jZGVmaW5lIFBPV0VSUENfTEVfUEUKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQwKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLS8qIEZJWE1FOgotICAgV2hhdCB3ZSdyZSB0cnlpbmcgdG8gZG8gaGVyZSBpcyBhbGxvY2F0ZSBhIHRvYyBzZWN0aW9uIChlYXJseSksIGFuZCBhdHRhY2ggCi0gICBpdCB0byB0aGUgbGFzdCBiZmQgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGF2b2lkcyB0aGUgcHJvYmxlbSBvZiBoYXZpbmcgYSB0b2MKLSAgIHdyaXR0ZW4gb3V0IGJlZm9yZSBhbGwgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcwotICAgYSB0b2Mgc2VjdGlvbiBmb3IgZXZlcnkgZmlsZSwgYW5kIHJlY29yZHMgdGhlIGxhc3Qgb25lIHNlZW4uIFRoZXJlIGFyZQotICAgYXQgbGVhc3QgdHdvIHByb2JsZW1zIHdpdGggdGhpcyBhcHByb2FjaDoKLSAgIDEuIFdlIGFsbG9jYXRlIHdob2xlIGJ1bmNoZXMgb2YgdG9jIHNlY3Rpb25zIHRoYXQgYXJlIGlnbm9yZWQsIGJ1dCBhdAotICAgICAgYXQgbGVhc3Qgd2Ugd2lsbCBub3QgYWxsb2NhdGUgYSB0b2MgaWYgbm8gLnRvYyBpcyBwcmVzZW50LgotICAgMi4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCBiZWluZyB0aGUgbGFzdCBiZmQgcmVhZCBuZWNlc3NhcmlseSBtZWFucwotICAgICAgdGhhdCB5b3UgYXJlIHRoZSBsYXN0IGJmZCBjbG9zZWQuCi0gICAzLiBEb2luZyBpdCBvbiBhICJzd2FwIGluIiBob29rIGRlcGVuZHMgb24gd2hlbiB0aGUgInN3YXAgaW4iIGlzIGNhbGxlZCwKLSAgICAgIGFuZCBob3cgb2Z0ZW4sIGV0Yy4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCB0aGVyZSBpc24ndCBhIGhvbGUgaGVyZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW4xOwotCi0gIGlmIChiZmRfb2ZfdG9jX293bmVyICE9IDApIC8qIHdlIGFscmVhZHkgaGF2ZSBhIHRvYywgc28gZ28gaG9tZSAqLwotICAgIHJldHVybjsKLQotICBpZiAoc3RyY21wKGluLT5fbi5fbl9uYW1lLCAiLnRvYyIpID09IDApCi0gICAgewotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lICggYWJmZCAsIFRPQ19TRUNUSU9OX05BTUUpOwotICAgICAgaWYgKHMgIT0gTlVMTCkgCi0JewotCSAgcmV0dXJuOwotCX0KLQotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIDsKLQotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIFRPQ19TRUNUSU9OX05BTUUpOwotCi0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQl7Ci0JICAvKiBGSVhNRTogc2V0IGFwcHJvcHJpYXRlIGJmZCBlcnJvciAqLwotCSAgYWJvcnQoKTsKLQl9Ci0KLSAgICAgIC8qIHNhdmUgdGhlIGJmZCBmb3IgbGF0ZXIgYWxsb2NhdGlvbiAqLwotICAgICAgYmZkX29mX3RvY19vd25lciA9IGFiZmQ7Ci0gICAgfQotCi0gIHJldHVybjsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi1zdGF0aWMgYm9vbGVhbiBwcGNfZG9fbGFzdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZCAqcHBjX2dldF9sYXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGJvb2xlYW4KLXBwY19kb19sYXN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkID09IGJmZF9vZl90b2Nfb3duZXIpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBiZmQgKgotcHBjX2dldF9sYXN0KCkKLXsKLSAgcmV0dXJuIGJmZF9vZl90b2Nfb3duZXI7Ci19Ci0KLS8qIHRoaXMgcGllY2Ugb2YgbWFjaGluZXJ5IGV4aXN0cyBvbmx5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBiZmQgdGhhdCBob2xkcwotICAgdGhlIHRvYyBzZWN0aW9uIGlzIHdyaXR0ZW4gbGFzdC4gCi0KLSAgIFRoaXMgZG9lcyBkZXBlbmQgb24gYmZkX21ha2Vfc2VjdGlvbiBhdHRhY2hpbmcgYSBuZXcgc2VjdGlvbiB0byB0aGUKLSAgIGVuZCBvZiB0aGUgc2VjdGlvbiBsaXN0IGZvciB0aGUgYmZkLiAKLQotICAgVGhpcyBpcyBvdGhlcndpc2UgaW50ZW5kZWQgdG8gYmUgZnVuY3Rpb25hbGx5IHRoZSBzYW1lIGFzIAotICAgY29mZmxpbmsuYzpfYmZkX2NvZmZfZmluYWxfbGluaygpLiBJdCBpcyBzcGVjaWZpY2FsbHkgZGlmZmVyZW50IG9ubHkgCi0gICB3aGVyZSB0aGUgUE9XRVJQQ19MRV9QRSBtYWNybyBtb2RpZmllcyB0aGUgY29kZS4gSXQgaXMgbGVmdCBpbiBhcyBhIAotICAgcHJlY2lzZSBmb3JtIG9mIGNvbW1lbnQuIGtya0BjeWdudXMuY29tCi0qLwotI2RlZmluZSBQT1dFUlBDX0xFX1BFCi0KLQotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLXBwY19iZmRfY29mZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBib29sZWFuIGRlYnVnX21lcmdlX2FsbG9jYXRlZDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby5sYXN0X2JmX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbyA9IGluZm87Ci0KLSAgZmluZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0ICgmZmluZm8uZGVidWdfbWVyZ2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSB0cnVlOwotCi0gIC8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVycyBhbmQgcmVsb2NhdGlvbiBlbnRyaWVzIHJlcXVpcmVkIGZvciB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBTZXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgcmVsX2ZpbGVwb3MgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X2xpbmVub19jb3VudCA9IDA7Ci0gIG1heF9yZWxvY19jb3VudCA9IDA7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0KLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JfQotICAgIH0KLQotICAvKiBJZiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlCi0gICAgIG5lZWQgdG8ga2VlcC4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQotICAgICAgICAgdGhlIHRhcmdldF9pbmRleCBmaWVsZHMgYXJlIDEgYmFzZWQuICAqLwotICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLQkoKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0JIGJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7Ci0gICAgICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzID0gTlVMTDsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKLQlvLT5saW5lX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLQkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgIT0gMCkKLQl7Ci0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LAotCSAgICAgYnV0IG9ubHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCBpcyBub3QgdGhlCi0JICAgICBjb21tb24gY2FzZS4gICovCi0JICBCRkRfQVNTRVJUIChpbmZvLT5yZWxvY2F0ZWFibGUpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KLQkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KLQkgICAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSByZWxvYyBhbmQgbGluZW5vIGNvdW50cywgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8KLQkgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgIH0KLQotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gbGluZV9maWxlcG9zOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYW4gaW5wdXQgQkZELiAgVGFrZQotICAgICB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYXIgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGRzIG9mIGFsbCB0aGUKLSAgICAgaW5wdXQgQkZEJ3MuICAqLwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgICAgIHN6ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCW1heF9zeW1fY291bnQgPSBzejsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBidWZmZXJzIHVzZWQgd2hpbGUgbGlua2luZy4gICovCi0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgZmluZm8uc2VjX3B0cnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkJICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCSAgICAgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCQkJICAgICBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnNlY19wdHJzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAotICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKQotICAgICAgfHwgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAmJiBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIGV4Y2VwdCB0aGF0Ci0gICAgIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlcmVmb3JlIHdlIGRvbid0Ci0gICAgIGtub3cgd2hlcmUgdGhlIHN0cmluZyB0YWJsZSBzdGFydHMuICBXZSBqdXN0IGJ1aWxkIHRoZSBzdHJpbmcKLSAgICAgdGFibGUgaW4gbWVtb3J5IGFzIHdlIGdvIGFsb25nLiAgV2UgcHJvY2VzcyBhbGwgdGhlIHJlbG9jYXRpb25zCi0gICAgIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOwotCi0gIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0jaWZkZWYgUE9XRVJQQ19MRV9QRQotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1biAmJiAhcHBjX2RvX2xhc3Qoc3ViKSkKLSNlbHNlCi0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotI2VuZGlmCi0JCXsKLQkJICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgewotICAgIGJmZCogbGFzdF9vbmUgPSBwcGNfZ2V0X2xhc3QoKTsKLSAgICBpZiAobGFzdF9vbmUpCi0gICAgICB7Ci0JaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIGxhc3Rfb25lKSkKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgfQotICAgIGxhc3Rfb25lLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgfQotI2VuZGlmCi0KLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IF9iZmRfY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgICAgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiAgV3JpdGUgaXQgb3V0IGFnYWluIGlmCi0gICAgIG5lY2Vzc2FyeS4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmICh1bnNpZ25lZCBpbnQpIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlICE9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0sCi0JCQkgICAoUFRSKSAmZmluZm8pOwotICBpZiAoZmluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBvdXRzeW1zIGJ1ZmZlciBpcyB1c2VkIGJ5IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLiAgKi8KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdwotCSB0aGUgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuCi0JIGZpbmFsbHkgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKChiZmRfYnl0ZSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeikpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGJmZF9ieXRlICplcmVsOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotCSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoKCpyZWxfaGFzaCktPmluZHggPj0gMCk7Ci0JCSAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkJfQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQkgICAgYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCSAgICBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zdHJ0YWIpICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzdHJidWYpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLSAgICAgIGlmIChiZmRfd3JpdGUgKHN0cmJ1ZiwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkgIT0gU1RSSU5HX1NJWkVfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZGVidWdfbWVyZ2VfYWxsb2NhdGVkKQotICAgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnNlY19wdHJzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjX3B0cnMpOwotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0MCi0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3JzIHRoYXQgbGVhZCB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWNvbnN0IGJmZF90YXJnZXQKLVRBUkdFVF9MSVRUTEVfU1lNID0KLXsKLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAkJLyogbmFtZSBvciBjb2ZmLWFybS1saXR0bGUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogRklYTUU6IG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIAotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAKLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIC8qIF9iZmRfZHVtbXlfdGFyZ2V0ICovIGNvZmZfb2JqZWN0X3AgfSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0gIAotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotICAKLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQKLVRBUkdFVF9CSUdfU1lNID0KLXsKLSAgVEFSR0VUX0JJR19OQU1FLAotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogRklYTUU6IG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0jZWxzZQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAotI2VuZGlmCi0KLSAgMCwJCQkJLyogbGVhZGluZyBjaGFyICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuPz8/IEZJWE1FbWdvICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgLyogX2JmZF9kdW1teV90YXJnZXQgKi8gY29mZl9vYmplY3RfcCB9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcnM2MDAwLmMgYi9iZmQvY29mZi1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0Y2Q0NC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1yczYwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MTggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJQk0gUlMvNjAwMCAiWENPRkYiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSwgCi0gICAgIGFuZCBKb2huIEdpbG1vcmUuCi0gICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLSAgIENvbnRyaWJ1dGVkIGJ5IElCTSBDb3Jwb3JhdGlvbiBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW50ZXJuYWxjb2ZmLmggYW5kIGNvZmZjb2RlLmggbW9kaWZ5IHRoZW1zZWx2ZXMgYmFzZWQgb24gdGhpcyBmbGFnLiAgKi8KLSNkZWZpbmUgUlM2MDAwQ09GRl9DIDEKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotCi1zdGF0aWMgYm9vbGVhbiB4Y29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9ydHlwZTJob3d0bwotICBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp4Y29mZl9hcmNoaXZlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBQVFIgeGNvZmZfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmQgKnhjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBpbnQgeGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbm9ybWFsaXplX2ZpbGVuYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl93cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQwKLS8qIFdlIHVzZSBvdXIgb3duIHRkYXRhIHR5cGUuICBJdHMgZmlyc3QgZmllbGQgaXMgdGhlIENPRkYgdGRhdGEgdHlwZSwKLSAgIHNvIHRoZSBDT0ZGIHJvdXRpbmVzIGFyZSBjb21wYXRpYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID0KLSAgICAoKHN0cnVjdCB4Y29mZl90ZGF0YSAqKQotICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl90ZGF0YSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLSAgY29mZi0+c3ltYm9scyA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIGNvZmYtPmNvbnZlcnNpb25fdGFibGUgPSAodW5zaWduZWQgaW50ICopIE5VTEw7Ci0gIGNvZmYtPnJhd19zeW1lbnRzID0gKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikgTlVMTDsKLSAgY29mZi0+cmVsb2NiYXNlID0gMDsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7Ci0KLSAgLyogV2Ugc2V0IGNwdXR5cGUgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgbm90IGJlZW4KLSAgICAgaW5pdGlhbGl6ZWQuICAqLwotICB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSA9IC0xOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHMgPSBOVUxMOwotICB4Y29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5kaWNlcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgWENPRkYgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKml4LCAqb3g7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGliZmQtPnh2ZWMgIT0gb2JmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaXggPSB4Y29mZl9kYXRhIChpYmZkKTsKLSAgb3ggPSB4Y29mZl9kYXRhIChvYmZkKTsKLSAgb3gtPmZ1bGxfYW91dGhkciA9IGl4LT5mdWxsX2FvdXRoZHI7Ci0gIG94LT50b2MgPSBpeC0+dG9jOwotICBpZiAoaXgtPnNudG9jID09IDApCi0gICAgb3gtPnNudG9jID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaWJmZCwgaXgtPnNudG9jKTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQlveC0+c250b2MgPSAwOwotICAgICAgZWxzZQotCW94LT5zbnRvYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0gIGlmIChpeC0+c25lbnRyeSA9PSAwKQotICAgIG94LT5zbmVudHJ5ID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaWJmZCwgaXgtPnNuZW50cnkpOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCW94LT5zbmVudHJ5ID0gMDsKLSAgICAgIGVsc2UKLQlveC0+c25lbnRyeSA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0gIG94LT50ZXh0X2FsaWduX3Bvd2VyID0gaXgtPnRleHRfYWxpZ25fcG93ZXI7Ci0gIG94LT5kYXRhX2FsaWduX3Bvd2VyID0gaXgtPmRhdGFfYWxpZ25fcG93ZXI7Ci0gIG94LT5tb2R0eXBlID0gaXgtPm1vZHR5cGU7Ci0gIG94LT5jcHV0eXBlID0gaXgtPmNwdXR5cGU7Ci0gIG94LT5tYXhkYXRhID0gaXgtPm1heGRhdGE7Ci0gIG94LT5tYXhzdGFjayA9IGl4LT5tYXhzdGFjazsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEkgZG9uJ3QgdGhpbmsgWENPRkYgcmVhbGx5IGhhcyBhIG5vdGlvbiBvZiBsb2NhbCBsYWJlbHMgYmFzZWQgb24KLSAgIG5hbWUuICBUaGlzIHdpbGwgbWVhbiB0aGF0IGxkIC1YIGRvZXNuJ3QgYWN0dWFsbHkgc3RyaXAgYW55dGhpbmcuCi0gICBUaGUgQUlYIG5hdGl2ZSBsaW5rZXIgZG9lcyBub3QgaGF2ZSBhIC1YIG9wdGlvbiwgYW5kIGl0IGlnbm9yZXMgdGhlCi0gICAteCBvcHRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBUaGUgWENPRkYgcmVsb2MgdGFibGUuICBBY3R1YWxseSwgWENPRkYgcmVsb2NhdGlvbnMgc3BlY2lmeSB0aGUKLSAgIGJpdHNpemUgYW5kIHdoZXRoZXIgdGhleSBhcmUgc2lnbmVkIG9yIG5vdCwgYWxvbmcgd2l0aCBhCi0gICBjb252ZW50aW9uYWwgdHlwZS4gIFRoaXMgdGFibGUgaXMgZm9yIHRoZSB0eXBlcywgd2hpY2ggYXJlIHVzZWQgZm9yCi0gICBkaWZmZXJlbnQgYWxnb3JpdGhtcyBmb3IgcHV0dGluZyBpbiB0aGUgcmVsb2MuICBNYW55IG9mIHRoZXNlCi0gICByZWxvY3MgbmVlZCBzcGVjaWFsX2Z1bmN0aW9uIGVudHJpZXMsIHdoaWNoIEkgaGF2ZSBub3Qgd3JpdHRlbi4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHhjb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBTdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgwLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9QT1MiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCByZWxvY2F0aW9uLCBidXQgc3RvcmUgbmVnYXRpdmUgdmFsdWUuICAqLwotICBIT1dUTyAoMSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgLTIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX05FRyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIDE2IGJpdCBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgzLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UT0MiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGlzIGlzLiAgKi8KLSAgSE9XVE8gKDQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JUQiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBFeHRlcm5hbCBUT0MgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKDUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0dMIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTG9jYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UQ0wiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgNyB9LAotICAKLSAgLyogTm9uIG1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0JBIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyA5IH0sCi0KLSAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4YiB9LAotCi0gIC8qIEluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHhjLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvYWQgYWRkcmVzcy4gICovCi0gIEhPV1RPICgweGQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JMQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweGUgfSwKLSAgCi0gIC8qIE5vbi1yZWxvY2F0aW5nIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPICgweGYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFRiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLCAgICAgCSAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4MTAgfSwKLSAgeyAweDExIH0sCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgaW5kaXJlY3QgbG9hZC4gICovCi0gIEhPV1RPICgweDEyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UUkwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIFRPQyByZWxhdGl2ZSBsb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHgxMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMQSIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweDE0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SUlRCSSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkEiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgY2FsbCBhYnNvbHV0ZSBpbmRpcmVjdC4gICovCi0gIEhPV1RPICgweDE2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9DQUkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgY2FsbCByZWxhdGl2ZS4gICovCi0gIEhPV1RPICgweDE3LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9DUkVMIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxOSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJBQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCByZWxhdGl2ZS4gICovCi0gIEhPV1RPICgweDFhLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJSIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDFiLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQlJDIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLXN0YXRpYyB2b2lkCi14Y29mZl9ydHlwZTJob3d0byAocmVsZW50LCBpbnRlcm5hbCkKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsOwotewotICByZWxlbnQtPmhvd3RvID0geGNvZmZfaG93dG9fdGFibGUgKyBpbnRlcm5hbC0+cl90eXBlOwotCi0gIC8qIFRoZSByX3NpemUgZmllbGQgb2YgYW4gWENPRkYgcmVsb2MgZW5jb2RlcyB0aGUgYml0c2l6ZSBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbiwgYXMgd2VsbCBhcyBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgaXMgc2lnbmVkIG9yIG5vdC4KLSAgICAgRG91YmxlY2hlY2sgdGhhdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBnYXRoZXJlZCBmcm9tIHRoZQotICAgICB0eXBlIG1hdGNoZXMgdGhpcyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChyZWxlbnQtPmhvd3RvLT5iaXRzaXplICE9ICgodW5zaWduZWQgaW50KSBpbnRlcm5hbC0+cl9zaXplICYgMHgxZikgKyAxKQotICAgIGFib3J0ICgpOwotI2lmIDAKLSAgaWYgKChpbnRlcm5hbC0+cl9zaXplICYgMHg4MCkgIT0gMAotICAgICAgPyAocmVsZW50LT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotICAgICAgOiAocmVsZW50LT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQpKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CMjY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzB4YV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMjY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzhdOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoKLSAgICAgIHJldHVybiAmeGNvZmZfaG93dG9fdGFibGVbM107Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiAmeGNvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoaW50ZXJuYWwsIGhvd3RvKQkJCQkJXAotICB7CQkJCQkJCQkJXAotICAgIGludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlOwkJCQkJXAotICAgIGludGVybmFsLnJfc2l6ZSA9CQkJCQkJCVwKLSAgICAgICgoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZAkJXAotCT8gMHg4MAkJCQkJCQkJXAotCTogMCkJCQkJCQkJCVwKLSAgICAgICB8IChob3d0by0+Yml0c2l6ZSAtIDEpKTsJCQkJCQlcCi0gIH0KLQwKLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgeGNvZmZfcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotCi0jZGVmaW5lIGNvZmZfbWtvYmplY3QgeGNvZmZfbWtvYmplY3QKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0MCi0vKiBYQ09GRiBhcmNoaXZlIHN1cHBvcnQuICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIGNvZGUgd2FzIGJ5Ci0gICBEYW1vbiBBLiBQZXJtZXplbC4gIEl0IHdhcyBlbmhhbmNlZCB0byBwZXJtaXQgY3Jvc3Mgc3VwcG9ydCwgYW5kCi0gICB3cml0aW5nIGFyY2hpdmUgZmlsZXMsIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBYQ09GRiB1c2VzIGl0cyBvd24gYXJjaGl2ZSBmb3JtYXQuICBFdmVyeXRoaW5nIGlzIGhvb2tlZCB0b2dldGhlcgotICAgd2l0aCBmaWxlIG9mZnNldCBsaW5rcywgc28gaXQgaXMgcG9zc2libGUgdG8gcmFwaWRseSB1cGRhdGUgYW4KLSAgIGFyY2hpdmUgaW4gcGxhY2UuICBPZiBjb3Vyc2UsIHdlIGRvbid0IGRvIHRoYXQuICBBbiBYQ09GRiBhcmNoaXZlCi0gICBoYXMgYSByZWFsIGZpbGUgaGVhZGVyLCBub3QganVzdCBhbiBBUk1BRyBzdHJpbmcuICBUaGUgc3RydWN0dXJlIG9mCi0gICB0aGUgZmlsZSBoZWFkZXIgYW5kIG9mIGVhY2ggYXJjaGl2ZSBoZWFkZXIgYXBwZWFyIGJlbG93LgotCi0gICBBbiBYQ09GRiBhcmNoaXZlIGFsc28gaGFzIGEgbWVtYmVyIHRhYmxlLCB3aGljaCBpcyBhIGxpc3Qgb2YKLSAgIGVsZW1lbnRzIGluIHRoZSBhcmNoaXZlICh5b3UgY2FuIGdldCB0aGF0IGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUKLSAgIGxpbmtlZCBsaXN0LCBidXQgeW91IGhhdmUgdG8gcmVhZCBhIGxvdCBtb3JlIG9mIHRoZSBmaWxlKS4gIFRoZQotICAgbWVtYmVyIHRhYmxlIGhhcyBhIG5vcm1hbCBhcmNoaXZlIGhlYWRlciB3aXRoIGFuIGVtcHR5IG5hbWUuICBJdCBpcwotICAgbm9ybWFsbHkgKGFuZCBwZXJoYXBzIG11c3QgYmUpIHRoZSBzZWNvbmQgdG8gbGFzdCBlbnRyeSBpbiB0aGUKLSAgIGFyY2hpdmUuICBUaGUgbWVtYmVyIHRhYmxlIGRhdGEgaXMgYWxtb3N0IHByaW50YWJsZSBBU0NJSS4gIEl0Ci0gICBzdGFydHMgd2l0aCBhIDEyIGNoYXJhY3RlciBkZWNpbWFsIHN0cmluZyB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCi0gICBlbnRyaWVzIGluIHRoZSB0YWJsZS4gIEZvciBlYWNoIGVudHJ5IGl0IGhhcyBhIDEyIGNoYXJhY3RlciBkZWNpbWFsCi0gICBzdHJpbmcgd2hpY2ggaXMgdGhlIG9mZnNldCBpbiB0aGUgYXJjaGl2ZSBvZiB0aGF0IG1lbWJlci4gIFRoZXNlCi0gICBlbnRyaWVzIGFyZSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyB3aGljaAotICAgYXJlIHRoZSBtZW1iZXIgbmFtZXMgZm9yIGVhY2ggZW50cnkuCi0KLSAgIEZpbmFsbHksIGFuIFhDT0ZGIGFyY2hpdmUgaGFzIGEgZ2xvYmFsIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMgd2hhdAotICAgd2UgY2FsbCB0aGUgYXJtYXAuICBUaGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSBoYXMgYSBub3JtYWwgYXJjaGl2ZQotICAgaGVhZGVyIHdpdGggYW4gZW1wdHkgbmFtZS4gIEl0IGlzIG5vcm1hbGx5IChhbmQgcGVyaGFwcyBtdXN0IGJlKQotICAgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFyY2hpdmUuICBUaGUgY29udGVudHMgc3RhcnQgd2l0aCBhIGZvdXIgYnl0ZQotICAgYmluYXJ5IG51bWJlciB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICBUaGlzIGlzIGZvbGxvd2VkIGJ5Ci0gICBhIHRoYXQgbWFueSBmb3VyIGJ5dGUgYmluYXJ5IG51bWJlcnM7IGVhY2ggaXMgdGhlIGZpbGUgb2Zmc2V0IG9mIGFuCi0gICBlbnRyeSBpbiB0aGUgYXJjaGl2ZS4gIFRoZXNlIG51bWJlcnMgYXJlIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mCi0gICBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgd2hpY2ggYXJlIHN5bWJvbCBuYW1lcy4gICovCi0KLS8qIFhDT0ZGIGFyY2hpdmVzIHVzZSB0aGlzIGFzIGEgbWFnaWMgc3RyaW5nLiAgKi8KLQotI2RlZmluZSBYQ09GRkFSTUFHICI8YWlhZmY+XDAxMiIKLSNkZWZpbmUgU1hDT0ZGQVJNQUcgOAotCi0vKiBUaGlzIHRlcm1pbmF0ZXMgYW4gWENPRkYgYXJjaGl2ZSBtZW1iZXIgbmFtZS4gICovCi0KLSNkZWZpbmUgWENPRkZBUkZNQUcgImBcMDEyIgotI2RlZmluZSBTWENPRkZBUkZNQUcgMgotCi0vKiBYQ09GRiBhcmNoaXZlcyBzdGFydCB3aXRoIHRoaXMgKHByaW50YWJsZSkgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyCi17Ci0gIC8qIE1hZ2ljIHN0cmluZy4gICovCi0gIGNoYXIgbWFnaWNbU1hDT0ZGQVJNQUddOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbWVtYmVyIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHN5bW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZmlyc3RtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbGFzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbGFzdG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgb24gdGhlIGZyZWUgbGlzdCAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBmcmVlb2ZmWzEyXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0ZJTEVfSERSICg1ICogMTIgKyBTWENPRkZBUk1BRykKLQotLyogRWFjaCBYQ09GRiBhcmNoaXZlIG1lbWJlciBzdGFydHMgd2l0aCB0aGlzIChwcmludGFibGUpIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9oZHIKLXsKLSAgLyogRmlsZSBzaXplIG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBzaXplWzEyXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBuZXh0IGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG5leHRvZmZbMTJdOwotCi0gIC8qIEZpbGUgb2Zmc2V0IG9mIHByZXZpb3VzIGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHByZXZvZmZbMTJdOwotCi0gIC8qIEZpbGUgbXRpbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZGF0ZVsxMl07Ci0KLSAgLyogRmlsZSBVSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgdWlkWzEyXTsKLQotICAvKiBGaWxlIEdJRCAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBnaWRbMTJdOwotCi0gIC8qIEZpbGUgbW9kZSAob2N0YWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbW9kZVsxMl07Ci0KLSAgLyogTGVuZ3RoIG9mIGZpbGUgbmFtZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuYW1sZW5bNF07Ci0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgZm9sbG93ZWQgYnkgdGhlIGZpbGUgbmFtZS4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICAgIG5hbWUgaXMgZ2l2ZW4gaW4gdGhlIG5hbWxlbiBmaWVsZC4gIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMKLSAgICAgb2RkLCB0aGUgbmFtZSBpcyBmb2xsb3dlZCBieSBhIG51bGwgYnl0ZS4gIFRoZSBuYW1lIGFuZCBvcHRpb25hbAotICAgICBudWxsIGJ5dGUgYXJlIGZvbGxvd2VkIGJ5IFhDT0ZGQVJGTUFHLCB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW4KLSAgICAgbmFtbGVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlIG1lbWJlciBmb2xsb3c7IHRoZSBudW1iZXIgb2YKLSAgICAgYnl0ZXMgaXMgZ2l2ZW4gaW4gdGhlIHNpemUgZmllbGQuICAqLwotfTsKLQotI2RlZmluZSBTSVpFT0ZfQVJfSERSICg3ICogMTIgKyA0KQotCi0vKiBXZSBzdG9yZSBhIGNvcHkgb2YgdGhlIHhjb2ZmX2FyX2ZpbGVfaGRyIGluIHRoZSB0ZGF0YSBmaWVsZCBvZiB0aGUKLSAgIGFydGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfYXJkYXRhKGFiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhKQotCi0vKiBXZSBzdG9yZSBhIGNvcHkgb2YgdGhlIHhjb2ZmX2FyX2hkciBpbiB0aGUgYXJlbHRfZGF0YSBmaWVsZCBvZiBhbgotICAgYXJjaGl2ZSBlbGVtZW50LiAgKi8KLSNkZWZpbmUgYXJjaF9lbHRkYXRhKGJmZCkgKChzdHJ1Y3QgYXJlbHRkYXRhICopICgoYmZkKS0+YXJlbHRfZGF0YSkpCi0jZGVmaW5lIGFyY2hfeGhkcihiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfaGRyICopIGFyY2hfZWx0ZGF0YSAoYmZkKS0+YXJjaF9oZWFkZXIpCi0KLS8qIFhDT0ZGIGFyY2hpdmVzIGRvIG5vdCBoYXZlIGFueXRoaW5nIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuCi0gICBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotI2RlZmluZSB4Y29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSB4Y29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIHhjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLQotLyogV2UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgZ2V0X2VsdF9hdF9pbmRleCByb3V0aW5lLiAgKi8KLQotI2RlZmluZSB4Y29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0KLS8qIFhDT0ZGIGFyY2hpdmVzIGRvIG5vdCBoYXZlIGEgdGltZXN0YW1wLiAgKi8KLQotI2RlZmluZSB4Y29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLS8qIFJlYWQgaW4gdGhlIGFybWFwIG9mIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgb2ZmOwotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgc2l6ZV90IG5hbWxlbjsKLSAgYmZkX3NpemVfdHlwZSBzejsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqY2VuZDsKLSAgdW5zaWduZWQgaW50IGMsIGk7Ci0gIGNhcnN5bSAqYXJzeW07Ci0gIGJmZF9ieXRlICpwOwotCi0gIGlmICh4Y29mZl9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgb2ZmID0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFiZmQpLT5zeW1vZmYsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGlmIChvZmYgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBzeW1ib2wgdGFibGUgc3RhcnRzIHdpdGggYSBub3JtYWwgYXJjaGl2ZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNraXAgdGhlIG5hbWUgKG5vcm1hbGx5IGVtcHR5KS4gICovCi0gIG5hbWxlbiA9IHN0cnRvbCAoaGRyLm5hbWxlbiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoKG5hbWxlbiArIDEpICYgfjEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN6ID0gc3RydG9sIChoZHIuc2l6ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzeik7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBjb250ZW50cywgMSwgc3osIGFiZmQpICE9IHN6KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3ltYm9sIHRhYmxlIHN0YXJ0cyB3aXRoIGEgZm91ciBieXRlIGNvdW50LiAgKi8KLSAgYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgY29udGVudHMpOwotCi0gIGlmIChjICogNCA+PSBzeikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSAoKGNhcnN5bSAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwgYyAqIHNpemVvZiAoY2Fyc3ltKSkpOwotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWZ0ZXIgdGhlIGNvdW50IGNvbWVzIGEgbGlzdCBvZiBmb3VyIGJ5dGUgZmlsZSBvZmZzZXRzLiAgKi8KLSAgZm9yIChpID0gMCwgYXJzeW0gPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcywgcCA9IGNvbnRlbnRzICsgNDsKLSAgICAgICBpIDwgYzsKLSAgICAgICArK2ksICsrYXJzeW0sIHAgKz0gNCkKLSAgICBhcnN5bS0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCi0gIC8qIEFmdGVyIHRoZSBmaWxlIG9mZnNldHMgY29tZSBudWxsIHRlcm1pbmF0ZWQgc3ltYm9sIG5hbWVzLiAgKi8KLSAgY2VuZCA9IGNvbnRlbnRzICsgc3o7Ci0gIGZvciAoaSA9IDAsIGFyc3ltID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0gICAgICAgaSA8IGM7Ci0gICAgICAgKytpLCArK2Fyc3ltLCBwICs9IHN0cmxlbiAoKGNoYXIgKikgcCkgKyAxKQotICAgIHsKLSAgICAgIGlmIChwID49IGNlbmQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYXJzeW0tPm5hbWUgPSAoY2hhciAqKSBwOwotICAgIH0KLQotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50ID0gYzsKLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIHRoaXMgaXMgYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXhjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgaGRyOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkciwgU0laRU9GX0FSX0ZJTEVfSERSLCAxLCBhYmZkKQotICAgICAgIT0gU0laRU9GX0FSX0ZJTEVfSERSKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoaGRyLm1hZ2ljLCBYQ09GRkFSTUFHLCBTWENPRkZBUk1BRykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBhcmUgc2V0dGluZyBiZmRfYXJkYXRhKGFiZmQpIGhlcmUsIGJ1dCBzaW5jZSBiZmRfYXJkYXRhCi0gICAgIGludm9sdmVzIGEgY2FzdCwgd2UgY2FuJ3QgZG8gaXQgYXMgdGhlIGxlZnQgb3BlcmFuZCBvZgotICAgICBhc3NpZ25tZW50LiAgKi8KLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0KLSAgICAoc3RydWN0IGFydGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSAoc3RydWN0IGFydGRhdGEgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gc3RydG9sIChoZHIuZmlyc3RtZW1vZmYsCi0JCQkJCQkgIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gYmZkX3phbGxvYyAoYWJmZCwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG1lbWNweSAoYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhLCAmaGRyLCBTSVpFT0ZfQVJfRklMRV9IRFIpOwotCi0gIGlmICghIHhjb2ZmX3NsdXJwX2FybWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEw7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgdGhlIGFyY2hpdmUgaGVhZGVyIGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgUFRSCi14Y29mZl9yZWFkX2FyX2hkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgc2l6ZV90IG5hbWxlbjsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciAqaGRycDsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqcmV0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUiwgMSwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUikKLSAgICByZXR1cm4gTlVMTDsKLQotICBuYW1sZW4gPSBzdHJ0b2wgKGhkci5uYW1sZW4sIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGhkcnAgPSAoc3RydWN0IHhjb2ZmX2FyX2hkciAqKSBiZmRfYWxsb2MgKGFiZmQsIFNJWkVPRl9BUl9IRFIgKyBuYW1sZW4gKyAxKTsKLSAgaWYgKGhkcnAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbWVtY3B5IChoZHJwLCAmaGRyLCBTSVpFT0ZfQVJfSERSKTsKLSAgaWYgKGJmZF9yZWFkICgoY2hhciAqKSBoZHJwICsgU0laRU9GX0FSX0hEUiwgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4pCi0gICAgcmV0dXJuIE5VTEw7Ci0gICgoY2hhciAqKSBoZHJwKVtTSVpFT0ZfQVJfSERSICsgbmFtbGVuXSA9ICdcMCc7Ci0KLSAgcmV0ID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXQtPmFyY2hfaGVhZGVyID0gKGNoYXIgKikgaGRycDsKLSAgcmV0LT5wYXJzZWRfc2l6ZSA9IHN0cnRvbCAoaGRyLnNpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIHJldC0+ZmlsZW5hbWUgPSAoY2hhciAqKSBoZHJwICsgU0laRU9GX0FSX0hEUjsKLQotICAvKiBTa2lwIG92ZXIgdGhlIFhDT0ZGQVJGTUFHIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgbmFtZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKG5hbWxlbiAmIDEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBPcGVuIHRoZSBuZXh0IGVsZW1lbnQgaW4gYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBiZmQgKgoteGNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGZpbGVfcHRyIGZpbGVzdGFydDsKLQotICBpZiAoeGNvZmZfYXJkYXRhIChhcmNoaXZlKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMKQotICAgIGZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7Ci0gIGVsc2UKLSAgICBmaWxlc3RhcnQgPSBzdHJ0b2wgKGFyY2hfeGhkciAobGFzdF9maWxlKS0+bmV4dG9mZiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLQotICBpZiAoZmlsZXN0YXJ0ID09IDAKLSAgICAgIHx8IGZpbGVzdGFydCA9PSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSktPm1lbW9mZiwKLQkJCSAgICAgIChjaGFyICoqKSBOVUxMLCAxMCkKLSAgICAgIHx8IGZpbGVzdGFydCA9PSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSktPnN5bW9mZiwKLQkJCSAgICAgIChjaGFyICoqKSBOVUxMLCAxMCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotLyogU3RhdCBhbiBlbGVtZW50IGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgaW50Ci14Y29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnM7Ci17Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmhkcnA7Ci0KLSAgaWYgKGFiZmQtPmFyZWx0X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBoZHJwID0gYXJjaF94aGRyIChhYmZkKTsKLQotICBzLT5zdF9tdGltZSA9IHN0cnRvbCAoaGRycC0+ZGF0ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgcy0+c3RfdWlkID0gc3RydG9sIChoZHJwLT51aWQsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIHMtPnN0X2dpZCA9IHN0cnRvbCAoaGRycC0+Z2lkLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBzLT5zdF9tb2RlID0gc3RydG9sIChoZHJwLT5tb2RlLCAoY2hhciAqKikgTlVMTCwgOCk7Ci0gIHMtPnN0X3NpemUgPSBhcmNoX2VsdGRhdGEgKGFiZmQpLT5wYXJzZWRfc2l6ZTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogTm9ybWFsaXplIGEgZmlsZSBuYW1lIGZvciBpbmNsdXNpb24gaW4gYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZV9maWxlbmFtZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICpmaWxlOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotICBmaWxlID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gIGZpbGVuYW1lID0gc3RycmNociAoZmlsZSwgJy8nKTsKLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwpCi0gICAgZmlsZW5hbWUrKzsKLSAgZWxzZQotICAgIGZpbGVuYW1lID0gZmlsZTsKLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gWENPRkYgYXJtYXAuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgY2hhciBidWZbNF07Ci0gIGJmZCAqc3ViOwotICBmaWxlX3B0ciBmaWxlb2ZmOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBtZW1zZXQgKCZoZHIsIDAsIHNpemVvZiBoZHIpOwotICBzcHJpbnRmIChoZHIuc2l6ZSwgIiVsZCIsIChsb25nKSAoNCArIG9ybF9jb3VudCAqIDQgKyBzdHJpZHgpKTsKLSAgc3ByaW50ZiAoaGRyLm5leHRvZmYsICIlZCIsIDApOwotICBtZW1jcHkgKGhkci5wcmV2b2ZmLCB4Y29mZl9hcmRhdGEgKGFiZmQpLT5tZW1vZmYsIDEyKTsKLSAgc3ByaW50ZiAoaGRyLmRhdGUsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIudWlkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLmdpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5tb2RlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLm5hbWxlbiwgIiVkIiwgMCk7Ci0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmhkcjsgcCA8IChjaGFyICopICZoZHIgKyBTSVpFT0ZfQVJfSERSOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCBTSVpFT0ZfQVJfSERSLCAxLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCi0gICAgICB8fCBiZmRfd3JpdGUgKFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpICE9IFNYQ09GRkFSRk1BRykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBiZmRfaF9wdXRfMzIgKGFiZmQsIG9ybF9jb3VudCwgYnVmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIGZpbGVvZmYgPSBTSVpFT0ZfQVJfRklMRV9IRFI7Ci0gIGkgPSAwOwotICB3aGlsZSAoc3ViICE9IE5VTEwgJiYgaSA8IG9ybF9jb3VudCkKLSAgICB7Ci0gICAgICBzaXplX3QgbmFtbGVuOwotCi0gICAgICB3aGlsZSAoKChiZmQgKikgKG1hcFtpXSkucG9zKSA9PSBzdWIpCi0JewotCSAgYmZkX2hfcHV0XzMyIChhYmZkLCBmaWxlb2ZmLCBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA0LCBhYmZkKSAhPSA0KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICArK2k7Ci0JfQotICAgICAgbmFtbGVuID0gc3RybGVuIChub3JtYWxpemVfZmlsZW5hbWUgKHN1YikpOwotICAgICAgbmFtbGVuID0gKG5hbWxlbiArIDEpICZ+IDE7Ci0gICAgICBmaWxlb2ZmICs9IChTSVpFT0ZfQVJfSERSCi0JCSAgKyBuYW1sZW4KLQkJICArIFNYQ09GRkFSRk1BRwotCQkgICsgYXJlbHRfc2l6ZSAoc3ViKSk7Ci0gICAgICBmaWxlb2ZmID0gKGZpbGVvZmYgKyAxKSAmfiAxOwotICAgICAgc3ViID0gc3ViLT5uZXh0OwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIG5hbWUgPSAqbWFwW2ldLm5hbWU7Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKGJmZF93cml0ZSAobmFtZSwgMSwgbmFtbGVuICsgMSwgYWJmZCkgIT0gbmFtbGVuICsgMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICgoc3RyaWR4ICYgMSkgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGI7Ci0KLSAgICAgIGIgPSAnXDAnOwotICAgICAgaWYgKGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIFhDT0ZGIGFyY2hpdmUuICBXZSBhbHdheXMgd3JpdGUgYW4gZW50aXJlIGFyY2hpdmUsCi0gICByYXRoZXIgdGhhbiBmdXNzaW5nIHdpdGggdGhlIGZyZWVsaXN0IGFuZCBzbyBmb3J0aC4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCB4Y29mZl9hcl9maWxlX2hkciBmaGRyOwotICBzaXplX3QgY291bnQ7Ci0gIHNpemVfdCB0b3RhbF9uYW1sZW47Ci0gIGZpbGVfcHRyICpvZmZzZXRzOwotICBib29sZWFuIG1ha2VtYXA7Ci0gIGJvb2xlYW4gaGFzb2JqZWN0czsKLSAgZmlsZV9wdHIgcHJldm9mZiwgbmV4dG9mZjsKLSAgYmZkICpzdWI7Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGFoZHI7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgY2hhciAqcDsKLSAgY2hhciBkZWNidWZbMTNdOwotCi0gIG1lbXNldCAoJmZoZHIsIDAsIHNpemVvZiBmaGRyKTsKLSAgc3RybmNweSAoZmhkci5tYWdpYywgWENPRkZBUk1BRywgU1hDT0ZGQVJNQUcpOwotICBzcHJpbnRmIChmaGRyLmZpcnN0bWVtb2ZmLCAiJWQiLCBTSVpFT0ZfQVJfRklMRV9IRFIpOwotICBzcHJpbnRmIChmaGRyLmZyZWVvZmYsICIlZCIsIDApOwotCi0gIGNvdW50ID0gMDsKLSAgdG90YWxfbmFtbGVuID0gMDsKLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQpCi0gICAgewotICAgICAgKytjb3VudDsKLSAgICAgIHRvdGFsX25hbWxlbiArPSBzdHJsZW4gKG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKSkgKyAxOwotICAgIH0KLSAgb2Zmc2V0cyA9IChmaWxlX3B0ciAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChmaWxlX3B0cikpOwotICBpZiAob2Zmc2V0cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIFNJWkVPRl9BUl9GSUxFX0hEUiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1ha2VtYXAgPSBiZmRfaGFzX21hcCAoYWJmZCk7Ci0gIGhhc29iamVjdHMgPSBmYWxzZTsKLSAgcHJldm9mZiA9IDA7Ci0gIG5leHRvZmYgPSBTSVpFT0ZfQVJfRklMRV9IRFI7Ci0gIGZvciAoc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkLCBpID0gMDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCwgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzaXplX3QgbmFtbGVuOwotICAgICAgc3RydWN0IHhjb2ZmX2FyX2hkciAqYWhkcnA7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHJlbWFpbmluZzsKLQotICAgICAgaWYgKG1ha2VtYXAgJiYgISBoYXNvYmplY3RzKQotCXsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChzdWIsIGJmZF9vYmplY3QpKQotCSAgICBoYXNvYmplY3RzID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBub3JtYWxpemVfZmlsZW5hbWUgKHN1Yik7Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5hbWUpOwotCi0gICAgICBpZiAoc3ViLT5hcmVsdF9kYXRhICE9IE5VTEwpCi0JYWhkcnAgPSBhcmNoX3hoZHIgKHN1Yik7Ci0gICAgICBlbHNlCi0JYWhkcnAgPSBOVUxMOwotCi0gICAgICBpZiAoYWhkcnAgPT0gTlVMTCkKLQl7Ci0JICBzdHJ1Y3Qgc3RhdCBzOwotCi0JICBtZW1zZXQgKCZhaGRyLCAwLCBzaXplb2YgYWhkcik7Ci0JICBhaGRycCA9ICZhaGRyOwotCSAgaWYgKHN0YXQgKGJmZF9nZXRfZmlsZW5hbWUgKHN1YiksICZzKSAhPSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgc3ByaW50ZiAoYWhkcnAtPnNpemUsICIlbGQiLCAobG9uZykgcy5zdF9zaXplKTsKLQkgIHNwcmludGYgKGFoZHJwLT5kYXRlLCAiJWxkIiwgKGxvbmcpIHMuc3RfbXRpbWUpOwotCSAgc3ByaW50ZiAoYWhkcnAtPnVpZCwgIiVsZCIsIChsb25nKSBzLnN0X3VpZCk7Ci0JICBzcHJpbnRmIChhaGRycC0+Z2lkLCAiJWxkIiwgKGxvbmcpIHMuc3RfZ2lkKTsKLQkgIHNwcmludGYgKGFoZHJwLT5tb2RlLCAiJW8iLCAodW5zaWduZWQgaW50KSBzLnN0X21vZGUpOwotCi0JICBpZiAoc3ViLT5hcmVsdF9kYXRhID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdWItPmFyZWx0X2RhdGEgPSBiZmRfYWxsb2MgKHN1Yiwgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7Ci0JICAgICAgaWYgKHN1Yi0+YXJlbHRfZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgYXJjaF9lbHRkYXRhIChzdWIpLT5wYXJzZWRfc2l6ZSA9IHMuc3Rfc2l6ZTsKLQl9Ci0KLSAgICAgIHNwcmludGYgKGFoZHJwLT5wcmV2b2ZmLCAiJWxkIiwgKGxvbmcpIHByZXZvZmYpOwotICAgICAgc3ByaW50ZiAoYWhkcnAtPm5hbWxlbiwgIiVsZCIsIChsb25nKSBuYW1sZW4pOwotCi0gICAgICAvKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGlzIG9kZCwgd2Ugd3JpdGUgb3V0IHRoZSBudWxsIGJ5dGUKLSAgICAgICAgIGFmdGVyIHRoZSBuYW1lIGFzIHdlbGwuICAqLwotICAgICAgbmFtbGVuID0gKG5hbWxlbiArIDEpICZ+IDE7Ci0KLSAgICAgIHJlbWFpbmluZyA9IGFyZWx0X3NpemUgKHN1Yik7Ci0gICAgICBzaXplID0gKFNJWkVPRl9BUl9IRFIKLQkgICAgICArIG5hbWxlbgotCSAgICAgICsgU1hDT0ZGQVJGTUFHCi0JICAgICAgKyByZW1haW5pbmcpOwotCi0gICAgICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7Ci0KLSAgICAgIG9mZnNldHNbaV0gPSBuZXh0b2ZmOwotCi0gICAgICBwcmV2b2ZmID0gbmV4dG9mZjsKLSAgICAgIG5leHRvZmYgKz0gc2l6ZSArIChzaXplICYgMSk7Ci0KLSAgICAgIHNwcmludGYgKGFoZHJwLT5uZXh0b2ZmLCAiJWxkIiwgKGxvbmcpIG5leHRvZmYpOwotCi0gICAgICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICAgICAgZm9yIChwID0gKGNoYXIgKikgYWhkcnA7IHAgPCAoY2hhciAqKSBhaGRycCArIFNJWkVPRl9BUl9IRFI7IHArKykKLQlpZiAoKnAgPT0gJ1wwJykKLQkgICpwID0gJyAnOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBhaGRycCwgMSwgU0laRU9GX0FSX0hEUiwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUgotCSAgfHwgYmZkX3dyaXRlICgoUFRSKSBuYW1lLCAxLCBuYW1sZW4sIGFiZmQpICE9IG5hbWxlbgotCSAgfHwgKGJmZF93cml0ZSAoKFBUUikgWENPRkZBUkZNQUcsIDEsIFNYQ09GRkFSRk1BRywgYWJmZCkKLQkgICAgICAhPSBTWENPRkZBUkZNQUcpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChzdWIsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgYW10OwotCSAgYmZkX2J5dGUgYnVmZmVyW0RFRkFVTFRfQlVGRkVSU0laRV07Ci0KLQkgIGFtdCA9IHNpemVvZiBidWZmZXI7Ci0JICBpZiAoYW10ID4gcmVtYWluaW5nKQotCSAgICBhbXQgPSByZW1haW5pbmc7Ci0JICBpZiAoYmZkX3JlYWQgKGJ1ZmZlciwgMSwgYW10LCBzdWIpICE9IGFtdAotCSAgICAgIHx8IGJmZF93cml0ZSAoYnVmZmVyLCAxLCBhbXQsIGFiZmQpICE9IGFtdCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcmVtYWluaW5nIC09IGFtdDsKLQl9Ci0KLSAgICAgIGlmICgoc2l6ZSAmIDEpICE9IDApCi0JewotCSAgYmZkX2J5dGUgYjsKLQotCSAgYiA9ICdcMCc7Ci0JICBpZiAoYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgc3ByaW50ZiAoZmhkci5sYXN0bWVtb2ZmLCAiJWxkIiwgKGxvbmcpIHByZXZvZmYpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgbWVtYmVyIHRhYmxlLiAgKi8KLQotICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7Ci0gIHNwcmludGYgKGZoZHIubWVtb2ZmLCAiJWxkIiwgKGxvbmcpIG5leHRvZmYpOwotCi0gIG1lbXNldCAoJmFoZHIsIDAsIHNpemVvZiBhaGRyKTsKLSAgc3ByaW50ZiAoYWhkci5zaXplLCAiJWxkIiwgKGxvbmcpICgxMiArIGNvdW50ICogMTIgKyB0b3RhbF9uYW1sZW4pKTsKLSAgc3ByaW50ZiAoYWhkci5wcmV2b2ZmLCAiJWxkIiwgKGxvbmcpIHByZXZvZmYpOwotICBzcHJpbnRmIChhaGRyLmRhdGUsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLnVpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIuZ2lkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci5tb2RlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci5uYW1sZW4sICIlZCIsIDApOwotCi0gIHNpemUgPSAoU0laRU9GX0FSX0hEUgotCSAgKyAxMgotCSAgKyBjb3VudCAqIDEyCi0JICArIHRvdGFsX25hbWxlbgotCSAgKyBTWENPRkZBUkZNQUcpOwotCi0gIHByZXZvZmYgPSBuZXh0b2ZmOwotICBuZXh0b2ZmICs9IHNpemUgKyAoc2l6ZSAmIDEpOwotCi0gIGlmIChtYWtlbWFwICYmIGhhc29iamVjdHMpCi0gICAgc3ByaW50ZiAoYWhkci5uZXh0b2ZmLCAiJWxkIiwgKGxvbmcpIG5leHRvZmYpOwotICBlbHNlCi0gICAgc3ByaW50ZiAoYWhkci5uZXh0b2ZmLCAiJWQiLCAwKTsKLQotICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICBmb3IgKHAgPSAoY2hhciAqKSAmYWhkcjsgcCA8IChjaGFyICopICZhaGRyICsgU0laRU9GX0FSX0hEUjsgcCsrKQotICAgIGlmICgqcCA9PSAnXDAnKQotICAgICAgKnAgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmFoZHIsIDEsIFNJWkVPRl9BUl9IRFIsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpIFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpCi0JICAhPSBTWENPRkZBUkZNQUcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzcHJpbnRmIChkZWNidWYsICIlLTEybGQiLCAobG9uZykgY291bnQpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWNidWYsIDEsIDEyLCBhYmZkKSAhPSAxMikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHNwcmludGYgKGRlY2J1ZiwgIiUtMTJsZCIsIChsb25nKSBvZmZzZXRzW2ldKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGRlY2J1ZiwgMSwgMTIsIGFiZmQpICE9IDEyKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGZvciAoc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzaXplX3QgbmFtbGVuOwotCi0gICAgICBuYW1lID0gbm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpOwotICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG5hbWUsIDEsIG5hbWxlbiArIDEsIGFiZmQpICE9IG5hbWxlbiArIDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKChzaXplICYgMSkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBiID0gJ1wwJzsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBhcm1hcCwgaWYgYXBwcm9wcmlhdGUuICAqLwotCi0gIGlmICghIG1ha2VtYXAgfHwgISBoYXNvYmplY3RzKQotICAgIHNwcmludGYgKGZoZHIuc3ltb2ZmLCAiJWQiLCAwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKG5leHRvZmYgPT0gYmZkX3RlbGwgKGFiZmQpKTsKLSAgICAgIHNwcmludGYgKGZoZHIuc3ltb2ZmLCAiJWxkIiwgKGxvbmcpIG5leHRvZmYpOwotICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gKFBUUikgJmZoZHI7Ci0gICAgICBpZiAoISBfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgYXJjaGl2ZSBmaWxlIGhlYWRlci4gICovCi0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmZoZHI7IHAgPCAoY2hhciAqKSAmZmhkciArIFNJWkVPRl9BUl9GSUxFX0hEUjsgcCsrKQotICAgIGlmICgqcCA9PSAnXDAnKQotICAgICAgKnAgPSAnICc7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmZmhkciwgU0laRU9GX0FSX0ZJTEVfSERSLCAxLCBhYmZkKSAhPQotCSAgU0laRU9GX0FSX0ZJTEVfSERSKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBXZSBjYW4ndCB1c2UgdGhlIHVzdWFsIGNvZmZfc2l6ZW9mX2hlYWRlcnMgcm91dGluZSwgYmVjYXVzZSBBSVgKLSAgIGFsd2F5cyB1c2VzIGFuIGEub3V0IGhlYWRlci4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotX2JmZF94Y29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgaW50IHNpemU7Ci0KLSAgc2l6ZSA9IEZJTEhTWjsKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0gICAgc2l6ZSArPSBBT1VUU1o7Ci0gIGVsc2UKLSAgICBzaXplICs9IFNNQUxMX0FPVVRTWjsKLSAgc2l6ZSArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogU0NOSFNaOwotICByZXR1cm4gc2l6ZTsKLX0KLQwKLSNkZWZpbmUgQ09SRV9GSUxFX1AgX2JmZF9kdW1teV90YXJnZXQKLQotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgXAotICBfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotI2lmZGVmIEFJWF9DT1JFCi0jdW5kZWYgQ09SRV9GSUxFX1AKLSNkZWZpbmUgQ09SRV9GSUxFX1AgcnM2MDAwY29mZl9jb3JlX3AKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICogcnM2MDAwY29mZl9jb3JlX3AgKCk7Ci1leHRlcm4gYm9vbGVhbiByczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzICgpOwotZXh0ZXJuIGJvb2xlYW4gcnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKCk7Ci0KLSN1bmRlZgljb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgXAotCQkJCSAgICAgcnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotZXh0ZXJuIGNoYXIgKnJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIHJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotCi1leHRlcm4gaW50IHJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI3VuZGVmIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIHJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0KLSN1bmRlZgljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lCWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMJcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmIC8qIEFJWF9DT1JFICovCi0KLSNpZmRlZiBMWU5YX0NPUkUKLQotI3VuZGVmIENPUkVfRklMRV9QCi0jZGVmaW5lIENPUkVfRklMRV9QIGx5bnhfY29yZV9maWxlX3AKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1leHRlcm4gYm9vbGVhbiBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLAotCQkJCQkJCSAgICBiZmQgKmV4ZWNfYmZkKSk7Ci0jdW5kZWYJY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotZXh0ZXJuIGNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotCi1leHRlcm4gaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI3VuZGVmIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0KLSNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KLQotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgX2JmZF94Y29mZl9iZmRfcmVsYXhfc2VjdGlvbiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX2djX3NlY3Rpb25zIGNvZmZfYmZkX2djX3NlY3Rpb25zCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLQotLyogVGhlIHRyYW5zZmVyIHZlY3RvciB0aGF0IGxlYWRzIHRoZSBvdXRzaWRlIHdvcmxkIHRvIGFsbCBvZiB0aGUgYWJvdmUuICovCi0KLWNvbnN0IGJmZF90YXJnZXQKLSNpZmRlZiBUQVJHRVRfU1lNCi0gIFRBUkdFVF9TWU0gPQotI2Vsc2UKLSAgcnM2MDAwY29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiYWl4Y29mZi1yczYwMDAiLAkJLyogbmFtZSAqLwotI2VuZGlmCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBEWU5BTUlDIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgY2hhciAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbj8/PyBGSVhNRW1nbyAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgeGNvZmZfYXJjaGl2ZV9wLCBDT1JFX0ZJTEVfUH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoeGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX3hjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF94Y29mZiksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXNoLmMgYi9iZmQvY29mZi1zaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzYwMjhkLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTM0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSGl0YWNoaSBTdXBlci1IIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0gICBSZWxheGluZyBjb2RlIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImNvZmYvc2guaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGdldF9zeW1ib2xfdmFsdWUgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqc2hfaW5zbl9pbmZvIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfYWxpZ25fbG9hZHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfYnl0ZSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX3N3YXBfaW5zbnMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc2hfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBiZmRfYnl0ZSAqc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotLyogRGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCB0byAyKio0LiAgKi8KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICg0KQotCi0vKiBHZW5lcmF0ZSBsb25nIGZpbGUgbmFtZXMuICAqLwotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLS8qIFRoZSBzdXBwb3J0ZWQgcmVsb2NhdGlvbnMuICBUaGVyZSBhcmUgYSBsb3Qgb2YgcmVsb2NhdGlvbnMgZGVmaW5lZAotICAgaW4gY29mZi9pbnRlcm5hbC5oIHdoaWNoIHdlIGRvIG5vdCBleHBlY3QgdG8gZXZlciBzZWUuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc2hfY29mZl9ob3d0b3NbXSA9Ci17Ci0gIHsgMCB9LAotICB7IDEgfSwKLSAgeyAyIH0sCi0gIHsgMyB9LCAvKiBSX1NIX1BDUkVMOCAqLwotICB7IDQgfSwgLyogUl9TSF9QQ1JFTDE2ICovCi0gIHsgNSB9LCAvKiBSX1NIX0hJR0g4ICovCi0gIHsgNiB9LCAvKiBSX1NIX0lNTTI0ICovCi0gIHsgNyB9LCAvKiBSX1NIX0xPVzE2ICovCi0gIHsgOCB9LAotICB7IDkgfSwgLyogUl9TSF9QQ0RJU1A4Qlk0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENESVNQOEJZMiwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNkaXNwOGJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgMTEgfSwgLyogUl9TSF9QQ0RJU1A4ICovCi0KLSAgSE9XVE8gKFJfU0hfUENESVNQLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjZGlzcDEyYnkyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICB7IDEzIH0sCi0KLSAgSE9XVE8gKFJfU0hfSU1NMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfaW1tMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgMTUgfSwKLSAgeyAxNiB9LCAvKiBSX1NIX0lNTTggKi8KLSAgeyAxNyB9LCAvKiBSX1NIX0lNTThCWTIgKi8KLSAgeyAxOCB9LCAvKiBSX1NIX0lNTThCWTQgKi8KLSAgeyAxOSB9LCAvKiBSX1NIX0lNTTQgKi8KLSAgeyAyMCB9LCAvKiBSX1NIX0lNTTRCWTIgKi8KLSAgeyAyMSB9LCAvKiBSX1NIX0lNTTRCWTQgKi8KLQotICBIT1dUTyAoUl9TSF9QQ1JFTElNTThCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNyZWxpbW04YnkyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENSRUxJTU04Qlk0LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjcmVsaW1tOGJ5NCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0lNTTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2ltbTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfU1dJVENIMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfc3dpdGNoMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2gzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfVVNFUywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl91c2VzIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfY291bnQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0FMSUdOLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2FsaWduIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2NvZGUiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfZGF0YSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfbGFiZWwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1NXSVRDSDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2g4IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2RlZmluZSBTSF9DT0ZGX0hPV1RPX0NPVU5UIChzaXplb2Ygc2hfY29mZl9ob3d0b3MgLyBzaXplb2Ygc2hfY29mZl9ob3d0b3NbMF0pCi0KLS8qIENoZWNrIGZvciBhIGJhZCBtYWdpYyBudW1iZXIuICAqLwotI2RlZmluZSBCQURNQUcoeCkgU0hCQURNQUcoeCkKLQotLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKHRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkKS4gICovCi0jZGVmaW5lIFNIIDEKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaGVyZS4gICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBTd2FwIHRoZSByX29mZnNldCBmaWVsZCBpbiBhbmQgb3V0LiAgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0KLS8qIFN3YXAgb3V0IGV4dHJhIGluZm9ybWF0aW9uIGluIHRoZSByZWxvYyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkJXAotICBkbwkJCQkJCVwKLSAgICB7CQkJCQkJXAotICAgICAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOwkJCVwKLSAgICAgIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsJCQlcCi0gICAgfQkJCQkJCVwKLSAgd2hpbGUgKDApCi0KLS8qIEdldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgbG9uZwotZ2V0X3N5bWJvbF92YWx1ZSAoc3ltYm9sKSAgICAgICAKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAKLSAgICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUgKwotCQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotICByZXR1cm4gcmVsb2NhdGlvbjsKLX0KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIGluIGNvZmZjb2RlLmggdG8gZ2V0IHRoZSBob3d0byBjb3JyZXNwb25kaW5nIHRvCi0gICBhbiBpbnRlcm5hbCByZWxvYy4gICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8ocmVsZW50LCBpbnRlcm5hbCkJCVwKLSAgKChyZWxlbnQpLT5ob3d0byA9CQkJCVwKLSAgICgoaW50ZXJuYWwpLT5yX3R5cGUgPCBTSF9DT0ZGX0hPV1RPX0NPVU5UCVwKLSAgICA/ICZzaF9jb2ZmX2hvd3Rvc1soaW50ZXJuYWwpLT5yX3R5cGVdCVwKLSAgICA6IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpKQotCi0vKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBtYWNybyBpbiBjb2ZmY29kZS5oLCBleGNlcHQgdGhhdCBpdCBjb3BpZXMKLSAgIHJfb2Zmc2V0IGludG8gcmVsb2NfZW50cnktPmFkZGVuZCBmb3Igc29tZSByZWxvY3MuICAqLwotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9TV0lUQ0g4CQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1NXSVRDSDE2CQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfU1dJVENIMzIJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9VU0VTCQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0NPVU5UCQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0FMSUdOKQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gKHJlbG9jKS5yX29mZnNldDsJCQlcCi0gIH0KLQotLyogVGhpcyBpcyB0aGUgaG93dG8gZnVuY3Rpb24gZm9yIHRoZSBTSCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNoX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBzeW1fdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGFkZHIgKyAoYmZkX2J5dGUgKikgZGF0YTsKLQotICByX3R5cGUgPSByZWxvY19lbnRyeS0+aG93dG8tPnR5cGU7Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQYXJ0aWFsIGxpbmtpbmctLWRvIG5vdGhpbmcuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIEFsbW9zdCBhbGwgcmVsb2NzIGhhdmUgdG8gZG8gd2l0aCByZWxheGluZy4gIElmIGFueSB3b3JrIG11c3QgYmUKLSAgICAgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KLSAgaWYgKHJfdHlwZSAhPSBSX1NIX0lNTTMyCi0gICAgICAmJiAocl90eXBlICE9IFJfU0hfUENESVNQCi0JICB8fCAoc3ltYm9sX2luLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICBpZiAoc3ltYm9sX2luICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBzeW1fdmFsdWUgPSBnZXRfc3ltYm9sX3ZhbHVlIChzeW1ib2xfaW4pOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfU0hfSU1NMzI6Ci0gICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1NIX1BDRElTUDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBzeW1fdmFsdWUgKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIHN5bV92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIGFkZHIKLQkJICAgICsgNCk7Ci0gICAgICBzeW1fdmFsdWUgKz0gKGluc24gJiAweGZmZikgPDwgMTsKLSAgICAgIGlmIChpbnNuICYgMHg4MDApCi0Jc3ltX3ZhbHVlIC09IDB4MTAwMDsKLSAgICAgIGluc24gPSAoaW5zbiAmIDB4ZjAwMCkgfCAoc3ltX3ZhbHVlICYgMHhmZmYpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgICAgaWYgKHN5bV92YWx1ZSA8IChiZmRfdm1hKSAtMHgxMDAwIHx8IHN5bV92YWx1ZSA+PSAweDEwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gKLQotLyogV2UgY2FuIGRvIHJlbGF4aW5nLiAgKi8KLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBzaF9yZWxheF9zZWN0aW9uCi0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIHNoX3JlbG9jYXRlX3NlY3Rpb24KLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byB1c2Ugc3BlY2lhbCBjb2RlIHRvIGdldCB0aGUgcmVsb2NhdGVkCi0gICBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0MCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgb24gdGhlIFNILgotCi0gICBGdW5jdGlvbiBjYWxscyBvbiB0aGUgU0ggbG9vayBsaWtlIHRoaXM6Ci0KLSAgICAgICBtb3ZsICBMMSxyMAotICAgICAgIC4uLgotICAgICAgIGpzciAgIEByMAotICAgICAgIC4uLgotICAgICBMMToKLSAgICAgICAubG9uZyBmdW5jdGlvbgotCi0gICBUaGUgY29tcGlsZXIgYW5kIGFzc2VtYmxlciB3aWxsIGNvb3BlcmF0ZSB0byBjcmVhdGUgUl9TSF9VU0VTCi0gICByZWxvY3Mgb24gdGhlIGpzciBpbnN0cnVjdGlvbnMuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlCi0gICBSX1NIX1VTRVMgcmVsb2MgaXMgdGhlIFBDIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2gKLSAgIGxvYWRzIHRoZSByZWdpc3RlciAodGhlIHJfb2Zmc2V0IGZpZWxkIGlzIGNvbXB1dGVkIGFzIHRob3VnaCBpdAotICAgd2VyZSBhIGp1bXAgaW5zdHJ1Y3Rpb24sIHNvIHRoZSBvZmZzZXQgdmFsdWUgaXMgYWN0dWFsbHkgZnJvbSBmb3VyCi0gICBieXRlcyBwYXN0IHRoZSBpbnN0cnVjdGlvbikuICBUaGUgbGlua2VyIGNhbiB1c2UgdGhpcyByZWxvYyB0bwotICAgZGV0ZXJtaW5lIGp1c3Qgd2hpY2ggZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkLCBhbmQgdGh1cyBkZWNpZGUKLSAgIHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuCi0KLSAgIElmIG11bHRpcGxlIGZ1bmN0aW9uIGNhbGxzIGFyZSBhbGwgYmFzZWQgb24gYSBzaW5nbGUgcmVnaXN0ZXIgbG9hZAotICAgKGkuZS4sIHRoZSBzYW1lIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyksIHRoZSBjb21waWxlcgotICAgZ3VhcmFudGVlcyB0aGF0IGVhY2ggZnVuY3Rpb24gY2FsbCB3aWxsIGhhdmUgYW4gUl9TSF9VU0VTIHJlbG9jLgotICAgVGhlcmVmb3JlLCBpZiB0aGUgbGlua2VyIGlzIGFibGUgdG8gY29udmVydCBlYWNoIFJfU0hfVVNFUyByZWxvYwotICAgd2hpY2ggcmVmZXJzIHRvIHRoYXQgYWRkcmVzcywgaXQgY2FuIHNhZmVseSBlbGltaW5hdGUgdGhlIHJlZ2lzdGVyCi0gICBsb2FkLgotCi0gICBXaGVuIHRoZSBhc3NlbWJsZXIgY3JlYXRlcyBhbiBSX1NIX1VTRVMgcmVsb2MsIGl0IGV4YW1pbmVzIGl0IHRvCi0gICBkZXRlcm1pbmUgd2hpY2ggYWRkcmVzcyBpcyBiZWluZyBsb2FkZWQgKEwxIGluIHRoZSBhYm92ZSBleGFtcGxlKS4KLSAgIEl0IHRoZW4gY291bnRzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byB0aGF0IGFkZHJlc3MsIGFuZAotICAgY3JlYXRlcyBhbiBSX1NIX0NPVU5UIHJlbG9jIGF0IHRoYXQgYWRkcmVzcy4gIFRoZSByX29mZnNldCBmaWVsZCBvZgotICAgdGhlIFJfU0hfQ09VTlQgcmVsb2Mgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMuICBJZiB0aGUKLSAgIGxpbmtlciBpcyBhYmxlIHRvIGVsaW1pbmF0ZSBhIHJlZ2lzdGVyIGxvYWQsIGl0IGNhbiB1c2UgdGhlCi0gICBSX1NIX0NPVU5UIHJlbG9jIHRvIHNlZSB3aGV0aGVyIGl0IGNhbiBhbHNvIGVsaW1pbmF0ZSB0aGUgZnVuY3Rpb24KLSAgIGFkZHJlc3MuCi0KLSAgIFNIIHJlbGF4aW5nIGFsc28gaGFuZGxlcyBhbm90aGVyLCB1bnJlbGF0ZWQsIG1hdHRlci4gIE9uIHRoZSBTSCwgaWYKLSAgIGEgbG9hZCBvciBzdG9yZSBpbnN0cnVjdGlvbiBpcyBub3QgYWxpZ25lZCBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeSwKLSAgIHRoZSBtZW1vcnkgY3ljbGUgaW50ZXJmZXJlcyB3aXRoIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gZmV0Y2gsCi0gICBjYXVzaW5nIGEgb25lIGN5Y2xlIGJ1YmJsZSBpbiB0aGUgcGlwZWxpbmUuICBUaGVyZWZvcmUsIHdlIHRyeSB0bwotICAgYWxpZ24gbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIG9uIGZvdXIgYnl0ZSBib3VuZGFyaWVzIGlmIHdlCi0gICBjYW4sIGJ5IHN3YXBwaW5nIHRoZW0gd2l0aCBvbmUgb2YgdGhlIGFkamFjZW50IGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuIAotc2hfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIGJvb2xlYW4gaGF2ZV9jb2RlOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIGxpbmtfaW5mby0+a2VlcF9tZW1vcnksCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKLQkJICAgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBoYXZlX2NvZGUgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbGFkZHIsIHBhZGRyLCBzeW12YWw7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBpbnNuOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZm4sICppcmVsc2NhbiwgKmlyZWxjb3VudDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgYmZkX3NpZ25lZF92bWEgZm9mZjsKLQotICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0NPREUpCi0JaGF2ZV9jb2RlID0gdHJ1ZTsKLQotICAgICAgaWYgKGlyZWwtPnJfdHlwZSAhPSBSX1NIX1VTRVMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTAotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUgUl9TSF9VU0VTIHJlbG9jIHdpbGwgcG9pbnQgdXMgdG8KLSAgICAgICAgIHRoZSByZWdpc3RlciBsb2FkLiAgVGhlIDQgaXMgYmVjYXVzZSB0aGUgcl9vZmZzZXQgZmllbGQgaXMKLSAgICAgICAgIGNvbXB1dGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEganVtcCBvZmZzZXQsIHdoaWNoIGFyZSBiYXNlZAotICAgICAgICAgZnJvbSA0IGJ5dGVzIGFmdGVyIHRoZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGxhZGRyID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hICsgNDsKLSAgICAgIC8qIENhcmVmdWwgdG8gc2lnbiBleHRlbmQgdGhlIDMyLWJpdCBvZmZzZXQuICAqLwotICAgICAgbGFkZHIgKz0gKChpcmVsLT5yX29mZnNldCAmIDB4ZmZmZmZmZmYpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwOwotICAgICAgaWYgKGxhZGRyID49IHNlYy0+X3Jhd19zaXplKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBvZmZzZXQiLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbGFkZHIpOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IG1vdi5sIE5OLHJOLCB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZG8uICAqLwotICAgICAgaWYgKChpbnNuICYgMHhmMDAwKSAhPSAweGQwMDApCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBSX1NIX1VTRVMgcG9pbnRzIHRvIHVucmVjb2duaXplZCBpbnNuIDB4JXgiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIsIGluc24pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzIGJlaW5nIGxvYWRlZC4gIFRoZQotICAgICAgCSBkaXNwbGFjZW1lbnQgaW4gdGhlIG1vdi5sIGluc3RydWN0aW9uIGlzIHF1YWRydXBsZWQuICBJdCBpcyBhCi0gICAgICAJIGRpc3BsYWNlbWVudCBmcm9tIGZvdXIgYnl0ZXMgYWZ0ZXIgdGhlIG1vdmwgaW5zdHJ1Y3Rpb24sIGJ1dCwKLSAgICAgIAkgYmVmb3JlIGFkZGluZyBpbiB0aGUgUEMgYWRkcmVzcywgdHdvIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLSAgICAgIAkgb2YgdGhlIFBDIGFyZSBjbGVhcmVkLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlY3Rpb24gaXMgYWxpZ25lZAotICAgICAgCSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0gICAgICBwYWRkciA9IGluc24gJiAweGZmOwotICAgICAgcGFkZHIgKj0gNDsKLSAgICAgIHBhZGRyICs9IChsYWRkciArIDQpICZ+IDM7Ci0gICAgICBpZiAocGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIGxvYWQgb2Zmc2V0IiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgcmVsb2MgZm9yIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzCi0gICAgICAgICBiZWluZyBsb2FkZWQuICBUaGlzIHJlbG9jIHdpbGwgdGVsbCB1cyB3aGljaCBmdW5jdGlvbiBpcwotICAgICAgICAgYWN0dWFsbHkgYmVpbmcgY2FsbGVkLiAgKi8KLSAgICAgIHBhZGRyICs9IHNlYy0+dm1hOwotICAgICAgZm9yIChpcmVsZm4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxmbiA8IGlyZWxlbmQ7IGlyZWxmbisrKQotCWlmIChpcmVsZm4tPnJfdmFkZHIgPT0gcGFkZHIKLQkgICAgJiYgaXJlbGZuLT5yX3R5cGUgPT0gUl9TSF9JTU0zMikKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxmbiA+PSBpcmVsZW5kKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgcmVsb2MiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJICAgICgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCSAgICAgKyAoaXJlbGZuLT5yX3N5bW5keAotCQkJCSogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAotCQkJICAgICZzeW0pOwotICAgICAgaWYgKHN5bS5uX3NjbnVtICE9IDAgJiYgc3ltLm5fc2NudW0gIT0gc2VjLT50YXJnZXRfaW5kZXgpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBzeW1ib2wgaW4gdW5leHBlY3RlZCBzZWN0aW9uIiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUKQotCXsKLQkgIHN5bXZhbCA9IChzeW0ubl92YWx1ZQotCQkgICAgLSBzZWMtPnZtYQotCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbaXJlbGZuLT5yX3N5bW5keF07Ci0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICBzeW1ib2wuICBKdXN0IGlnbm9yZSBpdC0taXQgd2lsbCBiZSBjYXVnaHQgYnkgdGhlCi0gICAgICAgICAgICAgICAgIHJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotCi0gICAgICBzeW12YWwgKz0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBwYWRkciAtIHNlYy0+dm1hKTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgZnVuY3Rpb24gY2FsbCBjYW4gYmUgc2hvcnRlbmVkLiAgKi8KLSAgICAgIGZvZmYgPSAoc3ltdmFsCi0JICAgICAgLSAoaXJlbC0+cl92YWRkcgotCQkgLSBzZWMtPnZtYQotCQkgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIDQpKTsKLSAgICAgIGlmIChmb2ZmIDwgLTB4MTAwMCB8fCBmb2ZmID49IDB4MTAwMCkKLQl7Ci0JICAvKiBBZnRlciBhbGwgdGhhdCB3b3JrLCB3ZSBjYW4ndCBzaG9ydGVuIHRoaXMgZnVuY3Rpb24gY2FsbC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFNob3J0ZW4gdGhlIGZ1bmN0aW9uIGNhbGwuICAqLwotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQotCXsKLQkgIHNlYy0+dXNlZF9ieV9iZmQgPQotCSAgICAoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotCSAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfcmVsb2NzID0gdHJ1ZTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gY29udGVudHM7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9jb250ZW50cyA9IHRydWU7Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotICAgICAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7Ci0KLSAgICAgIC8qIFJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLQotICAgICAgLyogQ2hhbmdlIHRoZSBSX1NIX1VTRVMgcmVsb2MgaW50byBhbiBSX1NIX1BDRElTUCByZWxvYywgYW5kCi0gICAgICAgICByZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCi0gICAgICBpcmVsLT5yX3R5cGUgPSBSX1NIX1BDRElTUDsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gaXJlbGZuLT5yX3N5bW5keDsKLSAgICAgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQpCi0JewotCSAgLyogSWYgdGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkIGJlY2F1c2Ugb2YgZnV0dXJlIHJlbGF4aW5nLAotICAgICAgICAgICAgIGl0IHdpbGwgYmUgaGFuZGxlZCBoZXJlIGxpa2Ugb3RoZXIgaW50ZXJuYWwgUENESVNQCi0gICAgICAgICAgICAgcmVsb2NzLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsCi0JCSAgICAgIDB4YjAwMCB8ICgoZm9mZiA+PiAxKSAmIDB4ZmZmKSwKLQkJICAgICAgY29udGVudHMgKyBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBjYW4ndCBmdWxseSByZXNvbHZlIHRoaXMgeWV0LCBiZWNhdXNlIHRoZSBleHRlcm5hbAotICAgICAgICAgICAgIHN5bWJvbCB2YWx1ZSBtYXkgYmUgY2hhbmdlZCBieSBmdXR1cmUgcmVsYXhpbmcuICBXZSBsZXQKLSAgICAgICAgICAgICB0aGUgZmluYWwgbGluayBwaGFzZSBoYW5kbGUgaXQuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgMHhiMDAwLCBjb250ZW50cyArIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JfQotCi0gICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBSX1NIX1VTRVMgcmVsb2MgcmVmZXJyaW5nIHRvIHRoZSBzYW1lCi0gICAgICAgICByZWdpc3RlciBsb2FkLiAgKi8KLSAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbGVuZDsgaXJlbHNjYW4rKykKLQlpZiAoaXJlbHNjYW4tPnJfdHlwZSA9PSBSX1NIX1VTRVMKLQkgICAgJiYgbGFkZHIgPT0gaXJlbHNjYW4tPnJfdmFkZHIgLSBzZWMtPnZtYSArIDQgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsc2NhbiA8IGlyZWxlbmQpCi0JewotCSAgLyogU29tZSBvdGhlciBmdW5jdGlvbiBjYWxsIGRlcGVuZHMgdXBvbiB0aGlzIHJlZ2lzdGVyIGxvYWQsCi0JICAgICBhbmQgd2UgaGF2ZSBub3QgeWV0IGNvbnZlcnRlZCB0aGF0IGZ1bmN0aW9uIGNhbGwuCi0JICAgICBJbmRlZWQsIHdlIG1heSBuZXZlciBiZSBhYmxlIHRvIGNvbnZlcnQgaXQuICBUaGVyZSBpcwotCSAgICAgbm90aGluZyBlbHNlIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50LiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgYSBSX1NIX0NPVU5UIHJlbG9jIG9uIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUKLSAgICAgICAgIGZ1bmN0aW9uIGFkZHJlc3MgaXMgc3RvcmVkLiAgRG8gdGhpcyBiZWZvcmUgZGVsZXRpbmcgYW55Ci0gICAgICAgICBieXRlcywgdG8gYXZvaWQgY29uZnVzaW9uIGFib3V0IHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIGZvciAoaXJlbGNvdW50ID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsY291bnQgPCBpcmVsZW5kOyBpcmVsY291bnQrKykKLQlpZiAoaXJlbGNvdW50LT5yX3ZhZGRyID09IHBhZGRyCi0JICAgICYmIGlyZWxjb3VudC0+cl90eXBlID09IFJfU0hfQ09VTlQpCi0JICBicmVhazsKLQotICAgICAgLyogRGVsZXRlIHRoZSByZWdpc3RlciBsb2FkLiAgKi8KLSAgICAgIGlmICghIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBsYWRkciwgMikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywganVzdCBpbiBjYXNlIGl0IHBlcm1pdHMgc29tZQotICAgICAgICAgb3RoZXIgZnVuY3Rpb24gY2FsbCB0byBjb21lIHdpdGhpbiByYW5nZSwgd2Ugc2hvdWxkIHJlbGF4Ci0gICAgICAgICBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLSAgICAgICphZ2FpbiA9IHRydWU7Ci0KLSAgICAgIC8qIE5vdyBjaGVjayB3aGV0aGVyIHdlIGdvdCBhIENPVU5UIHJlbG9jLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQgPj0gaXJlbGVuZCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIENPVU5UIHJlbG9jIiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIHVzZXMgaXMgc3RvcmVkIGluIHRoZSByX29mZnNldCBmaWVsZC4gIFdlJ3ZlCi0gICAgICAgICBqdXN0IGRlbGV0ZWQgb25lLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfb2Zmc2V0ID09IDApCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiAweCVseDogd2FybmluZzogYmFkIGNvdW50IiwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC0taXJlbGNvdW50LT5yX29mZnNldDsKLQotICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlcywgd2UgY2FuIGRlbGV0ZSB0aGUgYWRkcmVzcy4gIFJlbG9hZAotICAgICAgICAgdGhlIGFkZHJlc3MgZnJvbSBpcmVsZm4sIGluIGNhc2UgaXQgd2FzIGNoYW5nZWQgYnkgdGhlCi0gICAgICAgICBwcmV2aW91cyBjYWxsIHRvIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcy4gICovCi0gICAgICBpZiAoaXJlbGNvdW50LT5yX29mZnNldCA9PSAwKQotCXsKLQkgIGlmICghIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCSAgICAgICBpcmVsZm4tPnJfdmFkZHIgLSBzZWMtPnZtYSwgNCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogV2UndmUgZG9uZSBhbGwgd2UgY2FuIHdpdGggdGhhdCBmdW5jdGlvbiBjYWxsLiAgKi8KLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UgY2FuIGFsaWduIG9uIGZvdXIKLSAgICAgYnl0ZSBib3VuZGFyaWVzLiAgKi8KLSAgaWYgKGhhdmVfY29kZSkKLSAgICB7Ci0gICAgICBib29sZWFuIHN3YXBwZWQ7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTAotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIHNoX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsICZzd2FwcGVkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHN3YXBwZWQpCi0JewotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZWMtPnVzZWRfYnlfYmZkID0KLQkJKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgICAgICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfcmVsb2NzID0gdHJ1ZTsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9jb250ZW50cyA9IHRydWU7Ci0JICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7Ci0JfQotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCQkoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotCSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBOVUxMOwotCSAgICB9Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgYmZkX2J5dGUgKmVzeW0sICplc3ltZW5kOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGFzZWN0aW9uICpvOwotCi0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfQUxJR04KLQkgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA+IGFkZHIKLQkgICYmIGNvdW50IDwgKDEgPDwgaXJlbC0+cl9vZmZzZXQpKQotCXsKLQkgIGlyZWxhbGlnbiA9IGlyZWw7Ci0JICB0b2FkZHIgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBpZiAoaXJlbGFsaWduID09IE5VTEwpCi0gICAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotI2RlZmluZSBOT1BfT1BDT0RFICgweDAwMDkpCi0KLSAgICAgIEJGRF9BU1NFUlQgKChjb3VudCAmIDEpID09IDApOwotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDIpCi0JYmZkX3B1dF8xNiAoYWJmZCwgTk9QX09QQ09ERSwgY29udGVudHMgKyB0b2FkZHIgLSBjb3VudCArIGkpOwotICAgIH0KLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbnJhZGRyLCBzdG9wOwotICAgICAgYmZkX3ZtYSBzdGFydCA9IDA7Ci0gICAgICBpbnQgaW5zbiA9IDA7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIGludCBvZmYsIGFkanVzdCwgb2luc247Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSB2b2ZmID0gMDsKLSAgICAgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgbnJhZGRyID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotICAgICAgaWYgKChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hIDwgdG9hZGRyKQotCSAgfHwgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0FMSUdOCi0JICAgICAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID09IHRvYWRkcikpCi0JbnJhZGRyIC09IGNvdW50OwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyByZWxvYyB3YXMgZm9yIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQsIGluIHdoaWNoCi0JIGNhc2Ugd2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgaXQuICBEb24ndCBkZWxldGUgcmVsb2NzIHdoaWNoCi0JIHJlcHJlc2VudCBhZGRyZXNzZXMsIHRob3VnaC4gICovCi0gICAgICBpZiAoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID49IGFkZHIKLQkgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA8IGFkZHIgKyBjb3VudAotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfQUxJR04KLQkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0NPREUKLQkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0RBVEEKLQkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0xBQkVMKQotCWlyZWwtPnJfdHlwZSA9IFJfU0hfVU5VU0VEOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHNlZSBpZiB0aGUgcmFuZ2UgaXQgY292ZXJzCi0gICAgICAgICBpbmNsdWRlcyB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLiAgKi8KLSAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENESVNQOEJZMjoKLQljYXNlIFJfU0hfUENESVNQOgotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTI6Ci0JY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKLQkgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfSU1NMzI6Ci0JICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGlzCi0gICAgICAgICAgICAgc2VjdGlvbiwgYW5kIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUgYWRqdXN0ZWQgYmVsb3csIHdlCi0gICAgICAgICAgICAgbXVzdCBjaGVjayB0aGUgYWRkZW5kIHRvIHNlZSBpdCB3aWxsIHB1dCB0aGUgdmFsdWUgaW4KLSAgICAgICAgICAgICByYW5nZSB0byBiZSBhZGp1c3RlZCwgYW5kIGhlbmNlIG11c3QgYmUgY2hhbmdlZC4gICovCi0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkJICsgKGlyZWwtPnJfc3ltbmR4Ci0JCQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAotCQkJCSZzeW0pOwotCSAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgICAgICYmIHN5bS5uX3NjbnVtID09IHNlYy0+dGFyZ2V0X2luZGV4Ci0JICAgICAgJiYgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSA8PSBhZGRyCi0JCSAgfHwgKGJmZF92bWEpIHN5bS5uX3ZhbHVlID49IHRvYWRkcikpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICB2YWwgKz0gc3ltLm5fdmFsdWU7Ci0JICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICB9Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENESVNQOEJZMjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgaWYgKG9mZiAmIDB4ODApCi0JICAgIG9mZiAtPSAweDEwMDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ0RJU1A6Ci0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkJICsgKGlyZWwtPnJfc3ltbmR4Ci0JCQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAotCQkJCSZzeW0pOwotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9mZiA9IGluc24gJiAweGZmZjsKLQkgICAgICBpZiAob2ZmICYgMHg4MDApCi0JCW9mZiAtPSAweDEwMDA7Ci0JICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gc3RhcnQgKyA0ICsgb2ZmICogMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IChzdGFydCAmfiAoYmZkX3ZtYSkgMykgKyA0ICsgb2ZmICogNDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1NXSVRDSDg6Ci0JY2FzZSBSX1NIX1NXSVRDSDE2OgotCWNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgIC8qIFRoZXNlIHJlbG9jcyB0eXBlcyByZXByZXNlbnQKLQkgICAgICAgLndvcmQgTDItTDEKLQkgICAgIFRoZSByX29mZnNldCBmaWVsZCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYwotCSAgICAgYWRkcmVzcyBhbmQgTDEuICBUaGF0IGlzIHRoZSBzdGFydCBvZiB0aGUgcmVsb2MsIGFuZAotCSAgICAgYWRkaW5nIGluIHRoZSBjb250ZW50cyBnaXZlcyB1cyB0aGUgdG9wLiAgV2UgbXVzdCBhZGp1c3QKLQkgICAgIGJvdGggdGhlIHJfb2Zmc2V0IGZpZWxkIGFuZCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0KLQkgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCAtIChsb25nKSBpcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmIChzdGFydCA+IGFkZHIKLQkgICAgICAmJiBzdGFydCA8IHRvYWRkcgotCSAgICAgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCSAgICBpcmVsLT5yX29mZnNldCArPSBjb3VudDsKLQkgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JCSAgICYmIHN0b3AgPCB0b2FkZHIKLQkJICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7Ci0KLQkgIHN0YXJ0ID0gc3RvcDsKLQotCSAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX1NXSVRDSDE2KQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIGVsc2UgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX1NXSVRDSDgpCi0JICAgIHZvZmYgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIGVsc2UKLQkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgdm9mZik7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1VTRVM6Ci0JICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQKLQkJCSAgICArIChsb25nKSBpcmVsLT5yX29mZnNldAotCQkJICAgICsgNCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzdGFydCA+IGFkZHIKLQkgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSBjb3VudDsKLSAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JICAgICAgICYmIHN0b3AgPCB0b2FkZHIKLQkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSAtIGNvdW50OwotICAgICAgZWxzZQotCWFkanVzdCA9IDA7Ci0KLSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQl7Ci0JICBvaW5zbiA9IGluc247Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOEJZMjoKLQkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A6Ci0JICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgICAgIEJGRF9BU1NFUlQgKGFkanVzdCA9PSBjb3VudCB8fCBjb3VudCA+PSA0KTsKLQkgICAgICBpZiAoY291bnQgPj0gNCkKLQkJaW5zbiArPSBhZGp1c3QgLyA0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoaXJlbC0+cl92YWRkciAmIDMpID09IDApCi0JCSAgICArK2luc247Ci0JCX0KLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDg6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgaWYgKHZvZmYgPCAwIHx8IHZvZmYgPj0gMHhmZikKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gxNjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IC0gMHg4MDAwIHx8IHZvZmYgPj0gMHg4MDAwKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMTYgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMzI6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfVVNFUzoKLQkgICAgICBpcmVsLT5yX29mZnNldCArPSBhZGp1c3Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpcmVsLT5yX3ZhZGRyID0gbnJhZGRyICsgc2VjLT52bWE7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIG90aGVyIHNlY3Rpb25zLiAgSWYgdGhlcmUgY29udGFpbiBhbnkgSU1NMzIKLSAgICAgcmVsb2NzIGFnYWluc3QgaW50ZXJuYWwgc3ltYm9scyB3aGljaCB3ZSBhcmUgbm90IGdvaW5nIHRvIGFkanVzdAotICAgICBiZWxvdywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBhZGRlbmRzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxzY2FuLCAqaXJlbHNjYW5lbmQ7Ci0gICAgICBiZmRfYnl0ZSAqb2NvbnRlbnRzOwotCi0gICAgICBpZiAobyA9PSBzZWMKLQkgIHx8IChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgby0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSByZWxvY3MuICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcwotICAgICAgICAgZmFsc2UsIHdlIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sIHdoZW4gd2UKLSAgICAgICAgIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCQkgKGFiZmQsIG8sIHRydWUsIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKLQkJCSAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBvY29udGVudHMgPSBOVUxMOwotICAgICAgaXJlbHNjYW5lbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbHNjYW5lbmQ7IGlyZWxzY2FuKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLQkgIGlmIChpcmVsc2Nhbi0+cl90eXBlICE9IFJfU0hfSU1NMzIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkJICsgKGlyZWxzY2FuLT5yX3N5bW5keAotCQkJCSAgICAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCQkmc3ltKTsKLQkgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICAgICAmJiBzeW0ubl9zY251bSA9PSBzZWMtPnRhcmdldF9pbmRleAotCSAgICAgICYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPD0gYWRkcgotCQkgIHx8IChiZmRfdm1hKSBzeW0ubl92YWx1ZSA+PSB0b2FkZHIpKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCXsKLQkJICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50cyAhPSBOVUxMKQotCQkgICAgb2NvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50czsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd2UgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLQkJICAgICAgb2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG8tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLCBvY29udGVudHMsCi0JCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmNvbnRlbnRzID0gb2NvbnRlbnRzOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl92YWRkciAtIG8tPnZtYSk7Ci0JICAgICAgdmFsICs9IHN5bS5uX3ZhbHVlOwotCSAgICAgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsCi0JCQkgICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfdmFkZHIgLSBvLT52bWEpOwotCi0JICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0aW5nIHRoZSBpbnRlcm5hbCBzeW1ib2xzIHdpbGwgbm90IHdvcmsgaWYgc29tZXRoaW5nIGhhcwotICAgICBhbHJlYWR5IHJldHJpZXZlZCB0aGUgZ2VuZXJpYyBzeW1ib2xzLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8KLSAgICAgbWFrZSB0aGlzIHdvcmsgYnkgYWRqdXN0aW5nIHRoZSBnZW5lcmljIHN5bWJvbHMgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgSG93ZXZlciwgdGhpcyBjYXNlIHNob3VsZCBub3QgYXJpc2UgaW4gbm9ybWFsIHVzYWdlLiAgKi8KLSAgaWYgKG9ial9zeW1ib2xzIChhYmZkKSAhPSBOVUxMCi0gICAgICB8fCBvYmpfcmF3X3N5bWVudHMgKGFiZmQpICE9IE5VTEwpCi0gICAgewotICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICgiJXM6IGZhdGFsOiBnZW5lcmljIHN5bWJvbHMgcmV0cmlldmVkIGJlZm9yZSByZWxheGluZyIsCi0JYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBzeW1faGFzaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0ubl9zY251bSA9PSBzZWMtPnRhcmdldF9pbmRleAotCSAgJiYgKGJmZF92bWEpIGlzeW0ubl92YWx1ZSA+IGFkZHIKLQkgICYmIChiZmRfdm1hKSBpc3ltLm5fdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5uX3ZhbHVlIC09IGNvdW50OwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZpc3ltLCAoUFRSKSBlc3ltKTsKLQotCSAgaWYgKCpzeW1faGFzaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotCSAgICAgIEJGRF9BU1NFUlQgKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID49IGFkZHIKLQkJCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpOwotCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICBlc3ltICs9IChpc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgICBzeW1faGFzaCArPSBpc3ltLm5fbnVtYXV4ICsgMTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIHdlIGNhbiBtb3ZlIHRoZSBBTElHTiByZWxvYyBmb3J3YXJkLiAgV2UgaGF2ZSBhZGp1c3RlZAotICAgICByX3ZhZGRyIGZvciBpdCBhbHJlYWR5LiAgKi8KLSAgaWYgKGlyZWxhbGlnbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWxpZ250bywgYWxpZ25hZGRyOwotCi0gICAgICBhbGlnbnRvID0gQkZEX0FMSUdOICh0b2FkZHIsIDEgPDwgaXJlbGFsaWduLT5yX29mZnNldCk7Ci0gICAgICBhbGlnbmFkZHIgPSBCRkRfQUxJR04gKGlyZWxhbGlnbi0+cl92YWRkciAtIHNlYy0+dm1hLAotCQkJICAgICAxIDw8IGlyZWxhbGlnbi0+cl9vZmZzZXQpOwotICAgICAgaWYgKGFsaWdudG8gIT0gYWxpZ25hZGRyKQotCXsKLQkgIC8qIFRhaWwgcmVjdXJzaW9uLiAgKi8KLQkgIHJldHVybiBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWxpZ25hZGRyLAotCQkJCQlhbGlnbnRvIC0gYWxpZ25hZGRyKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyBpcyB5ZXQgYW5vdGhlciB2ZXJzaW9uIG9mIHRoZSBTSCBvcGNvZGUgdGFibGUsIHVzZWQgdG8gcmFwaWRseQotICAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBpbnN0cnVjdGlvbi4gICovCi0KLS8qIFRoZSBvcGNvZGUgbWFwIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMuICBUaGUKLSAgIGFycmF5IGlzIGluZGV4ZWQgYnkgdGhlIGhpZ2ggb3JkZXIgZm91ciBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLXN0cnVjdCBzaF9tYWpvcl9vcGNvZGUKLXsKLSAgLyogQSBwb2ludGVyIHRvIHRoZSBpbnN0cnVjdGlvbiBsaXN0LiAgVGhpcyBpcyBhbiBhcnJheSB3aGljaAotICAgICBjb250YWlucyBhbGwgdGhlIGluc3RydWN0aW9ucyB3aXRoIHRoaXMgbWFqb3Igb3Bjb2RlLiAgKi8KLSAgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSAqbWlub3Jfb3Bjb2RlczsKLSAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBtaW5vcl9vcGNvZGVzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY291bnQ7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBzZXQgb2YgU0ggb3Bjb2Rlcy4gIFRoZQotICAgaW5zdHJ1Y3Rpb24gY29kZSBpcyBhbmRlZCB3aXRoIHRoZSBtYXNrIHZhbHVlLCBhbmQgdGhlIHJlc3VsdGluZwotICAgdmFsdWUgaXMgdXNlZCB0byBzZWFyY2ggdGhlIG9yZGVyIG9wY29kZSBsaXN0LiAgKi8KLQotc3RydWN0IHNoX21pbm9yX29wY29kZQotewotICAvKiBUaGUgc29ydGVkIG9wY29kZSBsaXN0LiAgKi8KLSAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3Bjb2RlczsKLSAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBvcGNvZGVzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY291bnQ7Ci0gIC8qIFRoZSBtYXNrIHZhbHVlIHRvIHVzZSB3aGVuIHNlYXJjaGluZyB0aGUgb3Bjb2RlIGxpc3QuICAqLwotICB1bnNpZ25lZCBzaG9ydCBtYXNrOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGFuIFNIIGluc3RydWN0aW9uLiAgQW4gYXJyYXkKLSAgIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgc29ydGVkIGluIG9yZGVyIGJ5IG9wY29kZS4gICovCi0KLXN0cnVjdCBzaF9vcGNvZGUKLXsKLSAgLyogVGhlIGNvZGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24sIGFmdGVyIGl0IGhhcyBiZWVuIGFuZGVkIHdpdGggdGhlCi0gICAgIG1hc2sgdmFsdWUgaW4gdGhlIHNoX21ham9yX29wY29kZSBzdHJ1Y3R1cmUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7Ci0gIC8qIEZsYWdzIGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZmxhZ3M7Ci19OwotCi0vKiBGbGFnIHdoaWNoIGFwcGVhciBpbiB0aGUgc2hfb3Bjb2RlIHN0cnVjdHVyZS4gICovCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gbG9hZHMgYSB2YWx1ZSBmcm9tIG1lbW9yeS4gICovCi0jZGVmaW5lIExPQUQgKDB4MSkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzdG9yZXMgYSB2YWx1ZSB0byBtZW1vcnkuICAqLwotI2RlZmluZSBTVE9SRSAoMHgyKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoLiAgKi8KLSNkZWZpbmUgQlJBTkNIICgweDQpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGEgZGVsYXkgc2xvdC4gICovCi0jZGVmaW5lIERFTEFZICgweDgpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFUzEgKDB4MTApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDAwZjAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFUzIgKDB4MjApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gcmVnaXN0ZXIgMC4gICovCi0jZGVmaW5lIFVTRVNSMCAoMHg0MCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTRVRTMSAoMHg4MCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTRVRTMiAoMHgxMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyByZWdpc3RlciAwLiAgKi8KLSNkZWZpbmUgU0VUU1IwICgweDIwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIGEgc3BlY2lhbCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFNFVFNTUCAoMHg0MDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyBhIHNwZWNpYWwgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBVU0VTU1AgKDB4ODAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFU0YxICgweDEwMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTRjIgKDB4MjAwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIDAuICAqLwotI2RlZmluZSBVU0VTRjAgKDB4NDAwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNFVFNGMSAoMHg4MDAwKQotCi1zdGF0aWMgYm9vbGVhbiBzaF9pbnNuX3VzZXNfcmVnCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2luc25fdXNlc19mcmVnCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2luc25zX2NvbmZsaWN0Ci0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQsCi0JICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9sb2FkX3VzZQotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50LAotCSAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKikpOwotCi0vKiBUaGUgb3Bjb2RlIG1hcHMuICAqLwotCi0jZGVmaW5lIE1BUChhKSBhLCBzaXplb2YgYSAvIHNpemVvZiBhWzBdCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTAwW10gPQotewotICB7IDB4MDAwOCwgU0VUU1NQIH0sCQkJLyogY2xydCAqLwotICB7IDB4MDAwOSwgMCB9LAkJCS8qIG5vcCAqLwotICB7IDB4MDAwYiwgQlJBTkNIIHwgREVMQVkgfCBVU0VTU1AgfSwJLyogcnRzICovCi0gIHsgMHgwMDE4LCBTRVRTU1AgfSwJCQkvKiBzZXR0ICovCi0gIHsgMHgwMDE5LCBTRVRTU1AgfSwJCQkvKiBkaXYwdSAqLwotICB7IDB4MDAxYiwgMCB9LAkJCS8qIHNsZWVwICovCi0gIHsgMHgwMDI4LCBTRVRTU1AgfSwJCQkvKiBjbHJtYWMgKi8KLSAgeyAweDAwMmIsIEJSQU5DSCB8IERFTEFZIHwgU0VUU1NQIH0sCS8qIHJ0ZSAqLwotICB7IDB4MDAzOCwgVVNFU1NQIHwgU0VUU1NQIH0sCQkvKiBsZHRsYiAqLwotICB7IDB4MDA0OCwgU0VUU1NQIH0sCQkJLyogY2xycyAqLwotICB7IDB4MDA1OCwgU0VUU1NQIH0JCQkvKiBzZXRzICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUwMVtdID0KLXsKLSAgeyAweDAwMDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHNyLHJuICovCi0gIHsgMHgwMDAzLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIHwgU0VUU1NQIH0sCS8qIGJzcmYgcm4gKi8KLSAgeyAweDAwMGEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIG1hY2gscm4gKi8KLSAgeyAweDAwMTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIGdicixybiAqLwotICB7IDB4MDAxYSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgbWFjbCxybiAqLwotICB7IDB4MDAyMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgdmJyLHJuICovCi0gIHsgMHgwMDIzLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIH0sCQkvKiBicmFmIHJuICovCi0gIHsgMHgwMDI5LCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIG1vdnQgcm4gKi8KLSAgeyAweDAwMmEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIHByLHJuICovCi0gIHsgMHgwMDMyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBzc3Iscm4gKi8KLSAgeyAweDAwNDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHNwYyxybiAqLwotICB7IDB4MDA1YSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgZnB1bCxybiAqLwotICB7IDB4MDA2YSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgZnBzY3Iscm4gKi8KLSAgeyAweDAwODIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIwX2Jhbmsscm4gKi8KLSAgeyAweDAwODMsIExPQUQgfCBVU0VTMSB9LAkJCS8qIHByZWYgQHJuICovCi0gIHsgMHgwMDkyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMV9iYW5rLHJuICovCi0gIHsgMHgwMGEyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMl9iYW5rLHJuICovCi0gIHsgMHgwMGIyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByM19iYW5rLHJuICovCi0gIHsgMHgwMGMyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNF9iYW5rLHJuICovCi0gIHsgMHgwMGQyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNV9iYW5rLHJuICovCi0gIHsgMHgwMGUyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNl9iYW5rLHJuICovCi0gIHsgMHgwMGYyLCBTRVRTMSB8IFVTRVNTUCB9CQkJLyogc3RjIHI3X2Jhbmsscm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTAyW10gPQotewotICB7IDB4MDAwNCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIHJtLEAocjAscm4pICovCi0gIHsgMHgwMDA1LCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92Lncgcm0sQChyMCxybikgKi8KLSAgeyAweDAwMDYsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YubCBybSxAKHIwLHJuKSAqLwotICB7IDB4MDAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbXVsLmwgcm0scm4gKi8KLSAgeyAweDAwMGMsIExPQUQgfCBTRVRTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIEAocjAscm0pLHJuICovCi0gIHsgMHgwMDBkLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YudyBAKHIwLHJtKSxybiAqLwotICB7IDB4MDAwZSwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmwgQChyMCxybSkscm4gKi8KLSAgeyAweDAwMGYsIExPQUR8U0VUUzF8U0VUUzJ8U0VUU1NQfFVTRVMxfFVTRVMyfFVTRVNTUCB9LCAvKiBtYWMubCBAcm0rLEBybisgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTBbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUwMCksIDB4ZmZmZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMDEpLCAweGYwZmYgfSwKLSAgeyBNQVAgKHNoX29wY29kZTAyKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTEwW10gPQotewotICB7IDB4MTAwMCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0JLyogbW92Lmwgcm0sQChkaXNwLHJuKSAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlMVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTEwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTIwW10gPQotewotICB7IDB4MjAwMCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtb3YuYiBybSxAcm4gKi8KLSAgeyAweDIwMDEsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbW92Lncgcm0sQHJuICovCi0gIHsgMHgyMDAyLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG1vdi5sIHJtLEBybiAqLwotICB7IDB4MjAwNCwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92LmIgcm0sQC1ybiAqLwotICB7IDB4MjAwNSwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92Lncgcm0sQC1ybiAqLwotICB7IDB4MjAwNiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92Lmwgcm0sQC1ybiAqLwotICB7IDB4MjAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNTUCB9LAkvKiBkaXYwcyAqLwotICB7IDB4MjAwOCwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogdHN0IHJtLHJuICovCi0gIHsgMHgyMDA5LCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGFuZCBybSxybiAqLwotICB7IDB4MjAwYSwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiB4b3Igcm0scm4gKi8KLSAgeyAweDIwMGIsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogb3Igcm0scm4gKi8KLSAgeyAweDIwMGMsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9zdHIgcm0scm4gKi8KLSAgeyAweDIwMGQsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogeHRyY3Qgcm0scm4gKi8KLSAgeyAweDIwMGUsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG11bHUudyBybSxybiAqLwotICB7IDB4MjAwZiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9CQkvKiBtdWxzLncgcm0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTJbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUyMCksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUzMFtdID0KLXsKLSAgeyAweDMwMDAsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9lcSBybSxybiAqLwotICB7IDB4MzAwMiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2hzIHJtLHJuICovCi0gIHsgMHgzMDAzLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZ2Ugcm0scm4gKi8KLSAgeyAweDMwMDQsIFNFVFNTUCB8IFVTRVNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJLyogZGl2MSBybSxybiAqLwotICB7IDB4MzAwNSwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogZG11bHUubCBybSxybiAqLwotICB7IDB4MzAwNiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2hpIHJtLHJuICovCi0gIHsgMHgzMDA3LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZ3Qgcm0scm4gKi8KLSAgeyAweDMwMDgsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogc3ViIHJtLHJuICovCi0gIHsgMHgzMDBhLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwgLyogc3ViYyBybSxybiAqLwotICB7IDB4MzAwYiwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIHN1YnYgcm0scm4gKi8KLSAgeyAweDMwMGMsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogYWRkIHJtLHJuICovCi0gIHsgMHgzMDBkLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBkbXVscy5sIHJtLHJuICovCi0gIHsgMHgzMDBlLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwgLyogYWRkYyBybSxybiAqLwotICB7IDB4MzAwZiwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0JLyogYWRkdiBybSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlM1tdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTMwKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTQwW10gPQotewotICB7IDB4NDAwMCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hsbCBybiAqLwotICB7IDB4NDAwMSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hsciBybiAqLwotICB7IDB4NDAwMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIG1hY2gsQC1ybiAqLwotICB7IDB4NDAwMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHNyLEAtcm4gKi8KLSAgeyAweDQwMDQsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHJvdGwgcm4gKi8KLSAgeyAweDQwMDUsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHJvdHIgcm4gKi8KLSAgeyAweDQwMDYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssbWFjaCAqLwotICB7IDB4NDAwNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxzciAqLwotICB7IDB4NDAwOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGwyIHJuICovCi0gIHsgMHg0MDA5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjIgcm4gKi8KLSAgeyAweDQwMGEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzIHJtLG1hY2ggKi8KLSAgeyAweDQwMGIsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGpzciBAcm4gKi8KLSAgeyAweDQwMGUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHNyICovCi0gIHsgMHg0MDEwLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBkdCBybiAqLwotICB7IDB4NDAxMSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBjbXAvcHogcm4gKi8KLSAgeyAweDQwMTIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBtYWNsLEAtcm4gKi8KLSAgeyAweDQwMTMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBnYnIsQC1ybiAqLwotICB7IDB4NDAxNSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBjbXAvcGwgcm4gKi8KLSAgeyAweDQwMTYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssbWFjbCAqLwotICB7IDB4NDAxNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxnYnIgKi8KLSAgeyAweDQwMTgsIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxsOCBybiAqLwotICB7IDB4NDAxOSwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobHI4IHJuICovCi0gIHsgMHg0MDFhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcyBybSxtYWNsICovCi0gIHsgMHg0MDFiLCBMT0FEIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHRhcy5iIEBybiAqLwotICB7IDB4NDAxZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sZ2JyICovCi0gIHsgMHg0MDIwLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGFsIHJuICovCi0gIHsgMHg0MDIxLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGFyIHJuICovCi0gIHsgMHg0MDIyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgcHIsQC1ybiAqLwotICB7IDB4NDAyMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHZicixALXJuICovCi0gIHsgMHg0MDI0LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHJvdGNsIHJuICovCi0gIHsgMHg0MDI1LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHJvdGNyIHJuICovCi0gIHsgMHg0MDI2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLHByICovCi0gIHsgMHg0MDI3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHZiciAqLwotICB7IDB4NDAyOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGwxNiBybiAqLwotICB7IDB4NDAyOSwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobHIxNiBybiAqLwotICB7IDB4NDAyYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0scHIgKi8KLSAgeyAweDQwMmIsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGptcCBAcm4gKi8KLSAgeyAweDQwMmUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHZiciAqLwotICB7IDB4NDAzMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHNzcixALXJuICovCi0gIHsgMHg0MDM3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNzciAqLwotICB7IDB4NDAzZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sc3NyICovCi0gIHsgMHg0MDQzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgc3BjLEAtcm4gKi8KLSAgeyAweDQwNDcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssc3BjICovCi0gIHsgMHg0MDRlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxzcGMgKi8KLSAgeyAweDQwNTIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBmcHVsLEAtcm4gKi8KLSAgeyAweDQwNTYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssZnB1bCAqLwotICB7IDB4NDA1YSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMubCBybSxmcHVsICovCi0gIHsgMHg0MDYyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgZnBzY3IsQC1ybiAqLwotICB7IDB4NDA2NiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxmcHNjciAqLwotICB7IDB4NDA2YSwgU0VUU1NQIHwgVVNFUzEgfQkJCS8qIGxkcyBybSxmcHNjciAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNDFbXSA9Ci17Ci0gIHsgMHg0MDgzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgcnhfYmFuayxALXJuICovCi0gIHsgMHg0MDg3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHJ4X2JhbmsgKi8KLSAgeyAweDQwOGUsIFNFVFNTUCB8IFVTRVMxIH0JCQkvKiBsZGMgcm0scnhfYmFuayAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNDJbXSA9Ci17Ci0gIHsgMHg0MDBjLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCQkvKiBzaGFkIHJtLHJuICovCi0gIHsgMHg0MDBkLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCQkvKiBzaGxkIHJtLHJuICovCi0gIHsgMHg0MDBmLCBMT0FEfFNFVFMxfFNFVFMyfFNFVFNTUHxVU0VTMXxVU0VTMnxVU0VTU1AgfSwgLyogbWFjLncgQHJtKyxAcm4rICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU0W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNDApLCAweGYwZmYgfSwKLSAgeyBNQVAgKHNoX29wY29kZTQxKSwgMHhmMDhmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU0MiksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU1MFtdID0KLXsKLSAgeyAweDUwMDAsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0JLyogbW92LmwgQChkaXNwLHJtKSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlNVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTUwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTYwW10gPQotewotICB7IDB4NjAwMCwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi5iIEBybSxybiAqLwotICB7IDB4NjAwMSwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi53IEBybSxybiAqLwotICB7IDB4NjAwMiwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi5sIEBybSxybiAqLwotICB7IDB4NjAwMywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG1vdiBybSxybiAqLwotICB7IDB4NjAwNCwgTE9BRCB8IFNFVFMxIHwgU0VUUzIgfCBVU0VTMiB9LAkvKiBtb3YuYiBAcm0rLHJuICovCi0gIHsgMHg2MDA1LCBMT0FEIHwgU0VUUzEgfCBTRVRTMiB8IFVTRVMyIH0sCS8qIG1vdi53IEBybSsscm4gKi8KLSAgeyAweDYwMDYsIExPQUQgfCBTRVRTMSB8IFNFVFMyIHwgVVNFUzIgfSwJLyogbW92LmwgQHJtKyxybiAqLwotICB7IDB4NjAwNywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG5vdCBybSxybiAqLwotICB7IDB4NjAwOCwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIHN3YXAuYiBybSxybiAqLwotICB7IDB4NjAwOSwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIHN3YXAudyBybSxybiAqLwotICB7IDB4NjAwYSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMiB8IFVTRVNTUCB9LAkvKiBuZWdjIHJtLHJuICovCi0gIHsgMHg2MDBiLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogbmVnIHJtLHJuICovCi0gIHsgMHg2MDBjLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0dS5iIHJtLHJuICovCi0gIHsgMHg2MDBkLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0dS53IHJtLHJuICovCi0gIHsgMHg2MDBlLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0cy5iIHJtLHJuICovCi0gIHsgMHg2MDBmLCBTRVRTMSB8IFVTRVMyIH0JCQkvKiBleHRzLncgcm0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTZbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU2MCksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU3MFtdID0KLXsKLSAgeyAweDcwMDAsIFNFVFMxIHwgVVNFUzEgfQkJLyogYWRkICNpbW0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTdbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU3MCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU4MFtdID0KLXsKLSAgeyAweDgwMDAsIFNUT1JFIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmIgcjAsQChkaXNwLHJuKSAqLwotICB7IDB4ODEwMCwgU1RPUkUgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YudyByMCxAKGRpc3Ascm4pICovCi0gIHsgMHg4NDAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFUzIgfSwJLyogbW92LmIgQChkaXNwLHJtKSxyMCAqLwotICB7IDB4ODUwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVMyIH0sCS8qIG1vdi53IEAoZGlzcCxybikscjAgKi8KLSAgeyAweDg4MDAsIFNFVFNTUCB8IFVTRVNSMCB9LAkJLyogY21wL2VxICNpbW0scjAgKi8KLSAgeyAweDg5MDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJLyogYnQgbGFiZWwgKi8KLSAgeyAweDhiMDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJLyogYmYgbGFiZWwgKi8KLSAgeyAweDhkMDAsIEJSQU5DSCB8IERFTEFZIHwgVVNFU1NQIH0sCS8qIGJ0L3MgbGFiZWwgKi8KLSAgeyAweDhmMDAsIEJSQU5DSCB8IERFTEFZIHwgVVNFU1NQIH0JLyogYmYvcyBsYWJlbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlOFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTgwKSwgMHhmZjAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTkwW10gPQotewotICB7IDB4OTAwMCwgTE9BRCB8IFNFVFMxIH0JLyogbW92LncgQChkaXNwLHBjKSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlOVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTkwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWEwW10gPQotewotICB7IDB4YTAwMCwgQlJBTkNIIHwgREVMQVkgfQkvKiBicmEgbGFiZWwgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWFbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVhMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGViMFtdID0KLXsKLSAgeyAweGIwMDAsIEJSQU5DSCB8IERFTEFZIH0JLyogYnNyIGxhYmVsICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGViW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlYjApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlYzBbXSA9Ci17Ci0gIHsgMHhjMDAwLCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmIgcjAsQChkaXNwLGdicikgKi8KLSAgeyAweGMxMDAsIFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YudyByMCxAKGRpc3AsZ2JyKSAqLwotICB7IDB4YzIwMCwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5sIHIwLEAoZGlzcCxnYnIpICovCi0gIHsgMHhjMzAwLCBCUkFOQ0ggfCBVU0VTU1AgfSwJCQkvKiB0cmFwYSAjaW1tICovCi0gIHsgMHhjNDAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YuYiBAKGRpc3AsZ2JyKSxyMCAqLwotICB7IDB4YzUwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVNTUCB9LAkJLyogbW92LncgQChkaXNwLGdicikscjAgKi8KLSAgeyAweGM2MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5sIEAoZGlzcCxnYnIpLHIwICovCi0gIHsgMHhjNzAwLCBTRVRTUjAgfSwJCQkJLyogbW92YSBAKGRpc3AscGMpLHIwICovCi0gIHsgMHhjODAwLCBTRVRTU1AgfCBVU0VTUjAgfSwJCQkvKiB0c3QgI2ltbSxyMCAqLwotICB7IDB4YzkwMCwgU0VUU1IwIHwgVVNFU1IwIH0sCQkJLyogYW5kICNpbW0scjAgKi8KLSAgeyAweGNhMDAsIFNFVFNSMCB8IFVTRVNSMCB9LAkJCS8qIHhvciAjaW1tLHIwICovCi0gIHsgMHhjYjAwLCBTRVRTUjAgfCBVU0VTUjAgfSwJCQkvKiBvciAjaW1tLHIwICovCi0gIHsgMHhjYzAwLCBMT0FEIHwgU0VUU1NQIHwgVVNFU1IwIHwgVVNFU1NQIH0sCS8qIHRzdC5iICNpbW0sQChyMCxnYnIpICovCi0gIHsgMHhjZDAwLCBMT0FEIHwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJLyogYW5kLmIgI2ltbSxAKHIwLGdicikgKi8KLSAgeyAweGNlMDAsIExPQUQgfCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkvKiB4b3IuYiAjaW1tLEAocjAsZ2JyKSAqLwotICB7IDB4Y2YwMCwgTE9BRCB8IFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0JLyogb3IuYiAjaW1tLEAocjAsZ2JyKSAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlY1tdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWMwKSwgMHhmZjAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWQwW10gPQotewotICB7IDB4ZDAwMCwgTE9BRCB8IFNFVFMxIH0JCS8qIG1vdi5sIEAoZGlzcCxwYykscm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWRbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVkMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVlMFtdID0KLXsKLSAgeyAweGUwMDAsIFNFVFMxIH0JCS8qIG1vdiAjaW1tLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVlW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlZTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZjBbXSA9Ci17Ci0gIHsgMHhmMDAwLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZhZGQgZm0sZm4gKi8KLSAgeyAweGYwMDEsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZnN1YiBmbSxmbiAqLwotICB7IDB4ZjAwMiwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmbXVsIGZtLGZuICovCi0gIHsgMHhmMDAzLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZkaXYgZm0sZm4gKi8KLSAgeyAweGYwMDQsIFNFVFNTUCB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmNtcC9lcSBmbSxmbiAqLwotICB7IDB4ZjAwNSwgU0VUU1NQIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmY21wL2d0IGZtLGZuICovCi0gIHsgMHhmMDA2LCBMT0FEIHwgU0VUU0YxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogZm1vdi5zIEAocjAscm0pLGZuICovCi0gIHsgMHhmMDA3LCBTVE9SRSB8IFVTRVMxIHwgVVNFU0YyIHwgVVNFU1IwIH0sCS8qIGZtb3YucyBmbSxAKHIwLHJuKSAqLwotICB7IDB4ZjAwOCwgTE9BRCB8IFNFVFNGMSB8IFVTRVMyIH0sCQkvKiBmbW92LnMgQHJtLGZuICovCi0gIHsgMHhmMDA5LCBMT0FEIHwgU0VUUzIgfCBTRVRTRjEgfCBVU0VTMiB9LAkvKiBmbW92LnMgQHJtKyxmbiAqLwotICB7IDB4ZjAwYSwgU1RPUkUgfCBVU0VTMSB8IFVTRVNGMiB9LAkJLyogZm1vdi5zIGZtLEBybiAqLwotICB7IDB4ZjAwYiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU0YyIH0sCS8qIGZtb3YucyBmbSxALXJuICovCi0gIHsgMHhmMDBjLCBTRVRTRjEgfCBVU0VTRjIgfSwJCQkvKiBmbW92IGZtLGZuICovCi0gIHsgMHhmMDBlLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfCBVU0VTRjAgfQkvKiBmbWFjIGYwLGZtLGZuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVmMVtdID0KLXsKLSAgeyAweGYwMGQsIFNFVFNGMSB8IFVTRVNTUCB9LAkvKiBmc3RzIGZwdWwsZm4gKi8KLSAgeyAweGYwMWQsIFNFVFNTUCB8IFVTRVNGMSB9LAkvKiBmbGRzIGZuLGZwdWwgKi8KLSAgeyAweGYwMmQsIFNFVFNGMSB8IFVTRVNTUCB9LAkvKiBmbG9hdCBmcHVsLGZuICovCi0gIHsgMHhmMDNkLCBTRVRTU1AgfCBVU0VTRjEgfSwJLyogZnRyYyBmbixmcHVsICovCi0gIHsgMHhmMDRkLCBTRVRTRjEgfCBVU0VTRjEgfSwJLyogZm5lZyBmbiAqLwotICB7IDB4ZjA1ZCwgU0VUU0YxIHwgVVNFU0YxIH0sCS8qIGZhYnMgZm4gKi8KLSAgeyAweGYwNmQsIFNFVFNGMSB8IFVTRVNGMSB9LAkvKiBmc3FydCBmbiAqLwotICB7IDB4ZjA3ZCwgU0VUU1NQIHwgVVNFU0YxIH0sCS8qIGZ0c3QvbmFuIGZuICovCi0gIHsgMHhmMDhkLCBTRVRTRjEgfSwJCS8qIGZsZGkwIGZuICovCi0gIHsgMHhmMDlkLCBTRVRTRjEgfQkJLyogZmxkaTEgZm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWZbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVmMCksIDB4ZjAwZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlZjEpLCAweGYwZmYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9tYWpvcl9vcGNvZGUgc2hfb3Bjb2Rlc1tdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTApIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUxKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMikgfSwKLSAgeyBNQVAgKHNoX29wY29kZTMpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU0KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTYpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU3KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlOCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTkpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVhKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlYikgfSwKLSAgeyBNQVAgKHNoX29wY29kZWMpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVkKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlZSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWYpIH0KLX07Ci0KLS8qIEdpdmVuIGFuIGluc3RydWN0aW9uLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nCi0gICBzaF9vcGNvZGUgc3RydWN0dXJlLiAgUmV0dXJuIE5VTEwgaWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdAotICAgcmVjb2duaXplZC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICoKLXNoX2luc25faW5mbyAoaW5zbikKLSAgICAgdW5zaWduZWQgaW50IGluc247Ci17Ci0gIGNvbnN0IHN0cnVjdCBzaF9tYWpvcl9vcGNvZGUgKm1hajsKLSAgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSAqbWluLCAqbWluZW5kOwotCi0gIG1haiA9ICZzaF9vcGNvZGVzWyhpbnNuICYgMHhmMDAwKSA+PiAxMl07Ci0gIG1pbiA9IG1hai0+bWlub3Jfb3Bjb2RlczsKLSAgbWluZW5kID0gbWluICsgbWFqLT5jb3VudDsKLSAgZm9yICg7IG1pbiA8IG1pbmVuZDsgbWluKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGw7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcCwgKm9wZW5kOwotCi0gICAgICBsID0gaW5zbiAmIG1pbi0+bWFzazsKLSAgICAgIG9wID0gbWluLT5vcGNvZGVzOwotICAgICAgb3BlbmQgPSBvcCArIG1pbi0+Y291bnQ7Ci0KLSAgICAgIC8qIFNpbmNlIHRoZSBvcGNvZGVzIHRhYmxlcyBhcmUgc29ydGVkLCB3ZSBjb3VsZCB1c2UgYSBiaW5hcnkKLSAgICAgICAgIHNlYXJjaCBoZXJlIGlmIHRoZSBjb3VudCB3ZXJlIGFib3ZlIHNvbWUgY3V0b2ZmIHZhbHVlLiAgKi8KLSAgICAgIGZvciAoOyBvcCA8IG9wZW5kOyBvcCsrKQotCWlmIChvcC0+b3Bjb2RlID09IGwpCi0JICByZXR1cm4gb3A7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOyAgCi19Ci0KLS8qIFNlZSB3aGV0aGVyIGFuIGluc3RydWN0aW9uIHVzZXMgYSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfaW5zbl91c2VzX3JlZyAoaW5zbiwgb3AsIHJlZykKLSAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOwotICAgICB1bnNpZ25lZCBpbnQgcmVnOwotewotICB1bnNpZ25lZCBpbnQgZjsKLQotICBmID0gb3AtPmZsYWdzOwotCi0gIGlmICgoZiAmIFVTRVMxKSAhPSAwCi0gICAgICAmJiAoKGluc24gJiAweDBmMDApID4+IDgpID09IHJlZykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgVVNFUzIpICE9IDAKLSAgICAgICYmICgoaW5zbiAmIDB4MDBmMCkgPj4gNCkgPT0gcmVnKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTUjApICE9IDAKLSAgICAgICYmIHJlZyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25fdXNlc19mcmVnIChpbnNuLCBvcCwgZnJlZykKLSAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOwotICAgICB1bnNpZ25lZCBpbnQgZnJlZzsKLXsKLSAgdW5zaWduZWQgaW50IGY7Ci0KLSAgZiA9IG9wLT5mbGFnczsKLQotICAvKiBXZSBjYW4ndCB0ZWxsIGlmIHRoaXMgaXMgYSBkb3VibGUtcHJlY2lzaW9uIGluc24sIHNvIGp1c3QgcGxheSBzYWZlCi0gICAgIGFuZCBhc3N1bWUgdGhhdCBpdCBtaWdodCBiZS4gIFNvIG5vdCBvbmx5IGhhdmUgd2UgdGVzdCBGUkVHIGFnYWluc3QKLSAgICAgaXRzZWxmLCBidXQgYWxzbyBldmVuIEZSRUcgYWdhaW5zdCBGUkVHKzEgLSBpZiB0aGUgdXNpbmcgaW5zbiB1c2VzCi0gICAgIGp1c3QgdGhlIGxvdyBwYXJ0IG9mIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSAtIGJ1dCBhbHNvIGFuIG9kZAotICAgICBGUkVHIGFnYWluc3QgRlJFRy0xIC0gIGlmIHRoZSBzZXR0aW5nIGluc24gc2V0cyBqdXN0IHRoZSBsb3cgcGFydAotICAgICBvZiBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUuCi0gICAgIFNvIHdoYXQgdGhpcyBhbGwgYm9pbHMgZG93biB0byBpcyB0aGF0IHdlIGhhdmUgdG8gaWdub3JlIHRoZSBsb3dlc3QKLSAgICAgYml0IG9mIHRoZSByZWdpc3RlciBudW1iZXIuICAqLwotICAgICAKLSAgaWYgKChmICYgVVNFU0YxKSAhPSAwCi0gICAgICAmJiAoKGluc24gJiAweDBlMDApID4+IDgpID09IChmcmVnICYgMHhlKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgVVNFU0YyKSAhPSAwCi0gICAgICAmJiAoKGluc24gJiAweDAwZTApID4+IDQpID09IChmcmVnICYgMHhlKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgVVNFU0YwKSAhPSAwCi0gICAgICAmJiBmcmVnID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTZWUgd2hldGhlciBpbnN0cnVjdGlvbnMgSTEgYW5kIEkyIGNvbmZsaWN0LCBhc3N1bWluZyBJMSBjb21lcwotICAgYmVmb3JlIEkyLiAgT1AxIGFuZCBPUDIgYXJlIHRoZSBjb3JyZXNwb25kaW5nIHNoX29wY29kZSBzdHJ1Y3R1cmVzLgotICAgVGhpcyBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBjb25mbGljdCwgb3IgZmFsc2UgaWYgdGhlCi0gICBpbnN0cnVjdGlvbnMgY2FuIGJlIHN3YXBwZWQgc2FmZWx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25zX2NvbmZsaWN0IChpMSwgb3AxLCBpMiwgb3AyKQotICAgICB1bnNpZ25lZCBpbnQgaTE7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMTsKLSAgICAgdW5zaWduZWQgaW50IGkyOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDI7Ci17Ci0gIHVuc2lnbmVkIGludCBmMSwgZjI7Ci0KLSAgZjEgPSBvcDEtPmZsYWdzOwotICBmMiA9IG9wMi0+ZmxhZ3M7Ci0KLSAgLyogTG9hZCBvZiBmcHNjciBjb25mbGljdHMgd2l0aCBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLgotICAgICBGSVhNRTogc2hvdWxkbid0IHRlc3QgcmF3IG9wY29kZXMgaGVyZS4gICovCi0gIGlmICgoKGkxICYgMHhmMGZmKSA9PSAweDQwNjYgJiYgKGkyICYgMHhmMDAwKSA9PSAweGYwMDApCi0gICAgICB8fCAoKGkyICYgMHhmMGZmKSA9PSAweDQwNjYgJiYgKGkxICYgMHhmMDAwKSA9PSAweGYwMDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiAoQlJBTkNIIHwgREVMQVkpKSAhPSAwCi0gICAgICB8fCAoZjIgJiAoQlJBTkNIIHwgREVMQVkpKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiBTRVRTU1ApICE9IDAgJiYgKGYyICYgVVNFU1NQKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUU1NQKSAhPSAwICYmIChmMSAmIFVTRVNTUCkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUUzEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIChpMSAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjEgJiBTRVRTMikgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgKGkxICYgMHgwMGYwKSA+PiA0KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFNSMCkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjEgJiBTRVRTRjEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19mcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjIgJiBTRVRTMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTEsIG9wMSwgKGkyICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMiAmIFNFVFMyKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMSwgb3AxLCAoaTIgJiAweDAwZjApID4+IDQpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMSwgb3AxLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMiAmIFNFVFNGMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX2ZyZWcgKGkxLCBvcDEsIChpMiAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBkbyBub3QgY29uZmxpY3QuICAqLwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEkxIGlzIGEgbG9hZCBpbnN0cnVjdGlvbiwgYW5kIEkyIGlzIHNvbWUgb3RoZXIgaW5zdHJ1Y3Rpb24uICBSZXR1cm4KLSAgIHRydWUgaWYgSTEgbG9hZHMgYSByZWdpc3RlciB3aGljaCBJMiB1c2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2xvYWRfdXNlIChpMSwgb3AxLCBpMiwgb3AyKQotICAgICB1bnNpZ25lZCBpbnQgaTE7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMTsKLSAgICAgdW5zaWduZWQgaW50IGkyOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDI7Ci17Ci0gIHVuc2lnbmVkIGludCBmMTsKLQotICBmMSA9IG9wMS0+ZmxhZ3M7Ci0KLSAgaWYgKChmMSAmIExPQUQpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIGJvdGggU0VUUzEgYW5kIFNFVFNTUCBhcmUgc2V0LCB0aGF0IG1lYW5zIGEgbG9hZCB0byBhIHNwZWNpYWwKLSAgICAgcmVnaXN0ZXIgdXNpbmcgcG9zdGluY3JlbWVudCBhZGRyZXNzaW5nIG1vZGUsIHdoaWNoIHdlIGRvbid0IGNhcmUKLSAgICAgYWJvdXQgaGVyZS4gICovCi0gIGlmICgoZjEgJiBTRVRTMSkgIT0gMAotICAgICAgJiYgKGYxICYgU0VUU1NQKSA9PSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiBTRVRTUjApICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiBTRVRTRjEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19mcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVHJ5IHRvIGFsaWduIGxvYWRzIGFuZCBzdG9yZXMgd2l0aGluIGEgc3BhbiBvZiBtZW1vcnkuICBUaGlzIGlzCi0gICBjYWxsZWQgYnkgYm90aCB0aGUgRUxGIGFuZCB0aGUgQ09GRiBzaCB0YXJnZXRzLiAgQUJGRCBhbmQgU0VDIGFyZQotICAgdGhlIEJGRCBhbmQgc2VjdGlvbiB3ZSBhcmUgZXhhbWluaW5nLiAgQ09OVEVOVFMgaXMgdGhlIGNvbnRlbnRzIG9mCi0gICB0aGUgc2VjdGlvbi4gIFNXQVAgaXMgdGhlIHJvdXRpbmUgdG8gY2FsbCB0byBzd2FwIHR3byBpbnN0cnVjdGlvbnMuCi0gICBSRUxPQ1MgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCB0byBiZQotICAgcGFzc2VkIHRvIFNXQVAuICBQTEFCRUwgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxhYmVsIGluIGEKLSAgIHNvcnRlZCBsaXN0IG9mIGxhYmVsczsgTEFCRUxfRU5EIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBTVEFSVCBhbmQKLSAgIFNUT1AgYXJlIHRoZSByYW5nZSBvZiBtZW1vcnkgdG8gZXhhbWluZS4gIElmIGEgc3dhcCBpcyBtYWRlLAotICAgKlBTV0FQUEVEIGlzIHNldCB0byB0cnVlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHN3YXAsIHJlbG9jcywKLQkJCSBwbGFiZWwsIGxhYmVsX2VuZCwgc3RhcnQsIHN0b3AsIHBzd2FwcGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYm9vbGVhbiAoKnN3YXApIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLSAgICAgUFRSIHJlbG9jczsKLSAgICAgYmZkX3ZtYSAqKnBsYWJlbDsKLSAgICAgYmZkX3ZtYSAqbGFiZWxfZW5kOwotICAgICBiZmRfdm1hIHN0YXJ0OwotICAgICBiZmRfdm1hIHN0b3A7Ci0gICAgIGJvb2xlYW4gKnBzd2FwcGVkOwotewotICBiZmRfdm1hIGk7Ci0KLSAgLyogSW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBhbGlnbmVkIG9uIDIgYnl0ZSBib3VuZGFyaWVzLiAgKi8KLSAgaWYgKChzdGFydCAmIDEpID09IDEpCi0gICAgKytzdGFydDsKLQotICAvKiBOb3cgbG9vayB0aHJvdWdoIHRoZSB1bmFsaWduZWQgYWRkcmVzc2VzLiAgKi8KLSAgaSA9IHN0YXJ0OwotICBpZiAoKGkgJiAyKSA9PSAwKQotICAgIGkgKz0gMjsKLSAgZm9yICg7IGkgPCBzdG9wOyBpICs9IDQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgIHVuc2lnbmVkIGludCBwcmV2X2luc24gPSAwOwotICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqcHJldl9vcCA9IE5VTEw7Ci0KLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkpOwotICAgICAgb3AgPSBzaF9pbnNuX2luZm8gKGluc24pOwotICAgICAgaWYgKG9wID09IE5VTEwKLQkgIHx8IChvcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogVGhpcyBpcyBhIGxvYWQgb3Igc3RvcmUgd2hpY2ggaXMgbm90IG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLQotICAgICAgd2hpbGUgKCpwbGFiZWwgPCBsYWJlbF9lbmQgJiYgKipwbGFiZWwgPCBpKQotCSsrKnBsYWJlbDsKLQotICAgICAgaWYgKGkgPiBzdGFydCkKLQl7Ci0JICBwcmV2X2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgLSAyKTsKLQkgIHByZXZfb3AgPSBzaF9pbnNuX2luZm8gKHByZXZfaW5zbik7Ci0KLQkgIC8qIElmIHRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIGlzIGluIGEgZGVsYXkgc2xvdCwgd2UKLQkgICAgIGNhbid0IHN3YXAuICAqLwotCSAgaWYgKHByZXZfb3AgPT0gTlVMTAotCSAgICAgIHx8IChwcmV2X29wLT5mbGFncyAmIERFTEFZKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoaSA+IHN0YXJ0Ci0JICAmJiAoKnBsYWJlbCA+PSBsYWJlbF9lbmQgfHwgKipwbGFiZWwgIT0gaSkKLQkgICYmIHByZXZfb3AgIT0gTlVMTAotCSAgJiYgKHByZXZfb3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDAKLQkgICYmICEgc2hfaW5zbnNfY29uZmxpY3QgKHByZXZfaW5zbiwgcHJldl9vcCwgaW5zbiwgb3ApKQotCXsKLQkgIGJvb2xlYW4gb2s7Ci0KLQkgIC8qIFRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIGRvZXMgbm90IGhhdmUgYSBsYWJlbCwgYW5kCi0JICAgICB0aGVyZSBpcyBhIHByZXZpb3VzIGluc3RydWN0aW9uOyBQUkVWX0lOU04gaXMgbm90Ci0JICAgICBpdHNlbGYgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLCBhbmQgUFJFVl9JTlNOIGFuZAotCSAgICAgSU5TTiBkbyBub3QgY29uZmxpY3QuICAqLwotCi0JICBvayA9IHRydWU7Ci0KLQkgIGlmIChpID49IHN0YXJ0ICsgNCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBwcmV2Ml9pbnNuOwotCSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKnByZXYyX29wOwotCi0JICAgICAgcHJldjJfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSAtIDQpOwotCSAgICAgIHByZXYyX29wID0gc2hfaW5zbl9pbmZvIChwcmV2Ml9pbnNuKTsKLQotCSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgUFJFVl9JTlNOIGhhcyBhIGRlbGF5Ci0JCSBzbG90LS10aGF0IGlzLCBQUkVWX0lOU04gaXMgaW4gYSBkZWxheSBzbG90LS13ZQotCQkgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICBpZiAocHJldjJfb3AgPT0gTlVMTAotCQkgIHx8IChwcmV2Ml9vcC0+ZmxhZ3MgJiBERUxBWSkgIT0gMCkKLQkJb2sgPSBmYWxzZTsKLQotCSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgUFJFVl9JTlNOIGlzIGEgbG9hZCwKLQkJIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIgd2hpY2ggSU5TTiB1c2VzLCB0aGVuCi0JCSBwdXR0aW5nIElOU04gaW1tZWRpYXRlbHkgYWZ0ZXIgUFJFVl9JTlNOIHdpbGwKLQkJIGNhdXNlIGEgcGlwZWxpbmUgYnViYmxlLCBzbyB0aGVyZSBpcyBubyBwb2ludCB0bwotCQkgbWFraW5nIHRoZSBzd2FwLiAgKi8KLQkgICAgICBpZiAob2sKLQkJICAmJiAocHJldjJfb3AtPmZsYWdzICYgTE9BRCkgIT0gMAotCQkgICYmIHNoX2xvYWRfdXNlIChwcmV2Ml9pbnNuLCBwcmV2Ml9vcCwgaW5zbiwgb3ApKQotCQlvayA9IGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChvaykKLQkgICAgewotCSAgICAgIGlmICghICgqc3dhcCkgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgaSAtIDIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBzd2FwcGVkID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgd2hpbGUgKCpwbGFiZWwgPCBsYWJlbF9lbmQgJiYgKipwbGFiZWwgPCBpICsgMikKLQkrKypwbGFiZWw7Ci0KLSAgICAgIGlmIChpICsgMiA8IHN0b3AKLQkgICYmICgqcGxhYmVsID49IGxhYmVsX2VuZCB8fCAqKnBsYWJlbCAhPSBpICsgMikpCi0JewotCSAgdW5zaWduZWQgaW50IG5leHRfaW5zbjsKLQkgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm5leHRfb3A7Ci0KLQkgIC8qIFRoZXJlIGlzIGFuIGluc3RydWN0aW9uIGFmdGVyIHRoZSBsb2FkL3N0b3JlCi0JICAgICBpbnN0cnVjdGlvbiwgYW5kIGl0IGRvZXMgbm90IGhhdmUgYSBsYWJlbC4gICovCi0JICBuZXh0X2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgKyAyKTsKLQkgIG5leHRfb3AgPSBzaF9pbnNuX2luZm8gKG5leHRfaW5zbik7Ci0JICBpZiAobmV4dF9vcCAhPSBOVUxMCi0JICAgICAgJiYgKG5leHRfb3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDAKLQkgICAgICAmJiAhIHNoX2luc25zX2NvbmZsaWN0IChpbnNuLCBvcCwgbmV4dF9pbnNuLCBuZXh0X29wKSkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gb2s7Ci0KLQkgICAgICAvKiBORVhUX0lOU04gaXMgbm90IGl0c2VsZiBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24sCi0JCSBhbmQgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBJTlNOLiAgKi8KLQotCSAgICAgIG9rID0gdHJ1ZTsKLQotCSAgICAgIC8qIElmIFBSRVZfSU5TTiBpcyBhIGxvYWQsIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIKLQkJIHdoaWNoIE5FWFRfSU5TTiB1c2VzLCB0aGVuIHB1dHRpbmcgTkVYVF9JTlNOCi0JCSBpbW1lZGlhdGVseSBhZnRlciBQUkVWX0lOU04gd2lsbCBjYXVzZSBhIHBpcGVsaW5lCi0JCSBidWJibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYWtlIHRoaXMgc3dhcC4gICovCi0JICAgICAgaWYgKHByZXZfb3AgIT0gTlVMTAotCQkgICYmIChwcmV2X29wLT5mbGFncyAmIExPQUQpICE9IDAKLQkJICAmJiBzaF9sb2FkX3VzZSAocHJldl9pbnNuLCBwcmV2X29wLCBuZXh0X2luc24sIG5leHRfb3ApKQotCQlvayA9IGZhbHNlOwotCi0JICAgICAgLyogSWYgSU5TTiBpcyBhIGxvYWQsIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIgd2hpY2gKLQkJIHRoZSBpbnNuIGFmdGVyIE5FWFRfSU5TTiB1c2VzLCB0aGVuIGRvaW5nIHRoZQotCQkgc3dhcCB3aWxsIGNhdXNlIGEgcGlwZWxpbmUgYnViYmxlLCBzbyB0aGVyZSBpcyBubwotCQkgcmVhc29uIHRvIG1ha2UgdGhlIHN3YXAuICBIb3dldmVyLCBpZiB0aGUgaW5zbgotCQkgYWZ0ZXIgTkVYVF9JTlNOIGlzIGl0c2VsZiBhIGxvYWQgb3Igc3RvcmUKLQkJIGluc3RydWN0aW9uLCB0aGVuIGl0IGlzIG1pc2FsaWduZWQsIHNvCi0JCSBvcHRpbWlzdGljYWxseSBob3BlIHRoYXQgaXQgd2lsbCBiZSBzd2FwcGVkCi0JCSBpdHNlbGYsIGFuZCBqdXN0IGxpdmUgd2l0aCB0aGUgcGlwZWxpbmUgYnViYmxlIGlmCi0JCSBpdCBpc24ndC4gICovCi0JICAgICAgaWYgKG9rCi0JCSAgJiYgaSArIDQgPCBzdG9wCi0JCSAgJiYgKG9wLT5mbGFncyAmIExPQUQpICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgbmV4dDJfaW5zbjsKLQkJICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpuZXh0Ml9vcDsKLQotCQkgIG5leHQyX2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgKyA0KTsKLQkJICBuZXh0Ml9vcCA9IHNoX2luc25faW5mbyAobmV4dDJfaW5zbik7Ci0JCSAgaWYgKChuZXh0Ml9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAotCQkgICAgICAmJiBzaF9sb2FkX3VzZSAoaW5zbiwgb3AsIG5leHQyX2luc24sIG5leHQyX29wKSkKLQkJICAgIG9rID0gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmIChvaykKLQkJewotCQkgIGlmICghICgqc3dhcCkgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgaSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgKnBzd2FwcGVkID0gdHJ1ZTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayBmb3IgbG9hZHMgYW5kIHN0b3JlcyB3aGljaCB3ZSBjYW4gYWxpZ24gdG8gZm91ciBieXRlCi0gICBib3VuZGFyaWVzLiAgU2VlIHRoZSBsb25nZXIgY29tbWVudCBhYm92ZSBzaF9yZWxheF9zZWN0aW9uIGZvciB3aHkKLSAgIHRoaXMgaXMgZGVzaXJhYmxlLiAgVGhpcyBzZXRzICpQU1dBUFBFRCBpZiBzb21lIGluc3RydWN0aW9uIHdhcwotICAgc3dhcHBlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLCBwc3dhcHBlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICpwc3dhcHBlZDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX3ZtYSAqbGFiZWxzID0gTlVMTDsKLSAgYmZkX3ZtYSAqbGFiZWwsICpsYWJlbF9lbmQ7Ci0KLSAgKnBzd2FwcGVkID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogR2V0IGFsbCB0aGUgYWRkcmVzc2VzIHdpdGggbGFiZWxzIG9uIHRoZW0uICAqLwotICBsYWJlbHMgPSAoYmZkX3ZtYSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChiZmRfdm1hKSk7Ci0gIGlmIChsYWJlbHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbGFiZWxfZW5kID0gbGFiZWxzOwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0xBQkVMKQotCXsKLQkgICpsYWJlbF9lbmQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICArK2xhYmVsX2VuZDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIGN1cnJlbnRseSBhbHdheXMgb3V0cHV0cyByZWxvY3MgaW4KLSAgICAgYWRkcmVzcyBvcmRlci4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbCBuZWVkIHRvIHNvcnQKLSAgICAgdGhlIGxhYmVsIHZhbHVlcyBhbmQgdGhlIHJlbG9jcy4gICovCi0KLSAgbGFiZWwgPSBsYWJlbHM7Ci0KLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3RhcnQsIHN0b3A7Ci0KLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgIT0gUl9TSF9DT0RFKQotCWNvbnRpbnVlOwotCi0gICAgICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQotICAgICAgZm9yIChpcmVsKys7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0RBVEEpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsIDwgaXJlbGVuZCkKLQlzdG9wID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotICAgICAgZWxzZQotCXN0b3AgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICAgICAgaWYgKCEgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHNoX3N3YXBfaW5zbnMsCi0JCQkJICAgICAoUFRSKSBpbnRlcm5hbF9yZWxvY3MsICZsYWJlbCwKLQkJCQkgICAgIGxhYmVsX2VuZCwgc3RhcnQsIHN0b3AsIHBzd2FwcGVkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZnJlZSAobGFiZWxzKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGxhYmVscyAhPSBOVUxMKQotICAgIGZyZWUgKGxhYmVscyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU3dhcCB0d28gU0ggaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX3N3YXBfaW5zbnMgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgYWRkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgcmVsb2NzOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3MgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIHJlbG9jczsKLSAgdW5zaWduZWQgc2hvcnQgaTEsIGkyOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotCi0gIC8qIFN3YXAgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgKi8KLSAgaTEgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIpOwotICBpMiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMiwgY29udGVudHMgKyBhZGRyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTEsIGNvbnRlbnRzICsgYWRkciArIDIpOwotCi0gIC8qIEFkanVzdCBhbGwgcmVsb2MgYWRkcmVzc2VzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpbnQgdHlwZSwgYWRkOwotCi0gICAgICAvKiBUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCB0eXBlcyBvZiByZWxvY3MgdGhhdCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICBhZGp1c3QuICBUaGVzZSByZWxvY3MgZG8gbm90IGFwcGx5IHRvIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsCi0gICAgICAgICBidXQgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIHR5cGUgPSBpcmVsLT5yX3R5cGU7Ci0gICAgICBpZiAodHlwZSA9PSBSX1NIX0FMSUdOCi0JICB8fCB0eXBlID09IFJfU0hfQ09ERQotCSAgfHwgdHlwZSA9PSBSX1NIX0RBVEEKLQkgIHx8IHR5cGUgPT0gUl9TSF9MQUJFTCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgYW4gUl9TSF9VU0VTIHJlbG9jIHBvaW50cyB0byBvbmUgb2YgdGhlIGFkZHJlc3NlcyBiZWluZwotICAgICAgICAgc3dhcHBlZCwgd2UgbXVzdCBhZGp1c3QgaXQuICBJdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZG8gdGhpcwotICAgICAgICAgZm9yIGEganVtcCwgdGhvdWdoLCBzaW5jZSB3ZSB3YW50IHRvIGV4ZWN1dGUgYm90aAotICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBqdW1wLiAgKFdlIGhhdmUgYXZvaWRlZCBzd2FwcGluZwotICAgICAgICAgYXJvdW5kIGEgbGFiZWwsIHNvIHRoZSBqdW1wIHdpbGwgbm90IHdpbmQgdXAgZXhlY3V0aW5nIGFuCi0gICAgICAgICBpbnN0cnVjdGlvbiBpdCBzaG91bGRuJ3QpLiAgKi8KLSAgICAgIGlmICh0eXBlID09IFJfU0hfVVNFUykKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQotCSAgb2ZmID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hICsgNCArIGlyZWwtPnJfb2Zmc2V0OwotCSAgaWYgKG9mZiA9PSBhZGRyKQotCSAgICBpcmVsLT5yX29mZnNldCArPSAyOwotCSAgZWxzZSBpZiAob2ZmID09IGFkZHIgKyAyKQotCSAgICBpcmVsLT5yX29mZnNldCAtPSAyOwotCX0KLQotICAgICAgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSBhZGRyKQotCXsKLQkgIGlyZWwtPnJfdmFkZHIgKz0gMjsKLQkgIGFkZCA9IC0yOwotCX0KLSAgICAgIGVsc2UgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSBhZGRyICsgMikKLQl7Ci0JICBpcmVsLT5yX3ZhZGRyIC09IDI7Ci0JICBhZGQgPSAyOwotCX0KLSAgICAgIGVsc2UKLQlhZGQgPSAwOwotCi0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgYmZkX2J5dGUgKmxvYzsKLQkgIHVuc2lnbmVkIHNob3J0IGluc24sIG9pbnNuOwotCSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotCSAgbG9jID0gY29udGVudHMgKyBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoICh0eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTI6Ci0JICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JICAgICAgb2luc24gPSBpbnNuOwotCSAgICAgIGluc24gKz0gYWRkIC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A6Ci0JICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JICAgICAgb2luc24gPSBpbnNuOwotCSAgICAgIGluc24gKz0gYWRkIC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmMDAwKSAhPSAoaW5zbiAmIDB4ZjAwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICAgICAgLyogVGhpcyByZWxvYyBpZ25vcmVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCAzIGJpdHMgb2YKLSAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gY291bnRlciBiZWZvcmUgYWRkaW5nIGluIHRoZSBvZmZzZXQuCi0gICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBpZiBBRERSIGlzIGF0IGFuIGV2ZW4gYWRkcmVzcywgdGhlCi0gICAgICAgICAgICAgICAgIHN3YXAgd2lsbCBub3QgYWZmZWN0IHRoZSBvZmZzZXQuICBJZiBBRERSIGlzIGFuIGF0IGFuCi0gICAgICAgICAgICAgICAgIG9kZCBhZGRyZXNzLCB0aGVuIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyb3NzaW5nIGEKLSAgICAgICAgICAgICAgICAgZm91ciBieXRlIGJvdW5kYXJ5LCBhbmQgbXVzdCBiZSBhZGp1c3RlZC4gICovCi0JICAgICAgaWYgKChhZGRyICYgMykgIT0gMCkKLQkJewotCQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCQkgIG9pbnNuID0gaW5zbjsKLQkJICBpbnNuICs9IGFkZCAvIDI7Ci0JCSAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCQkgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIsCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIGlzIGEgbW9kaWZpY2F0aW9uIG9mIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24sIHdoaWNoCi0gICB3aWxsIGhhbmRsZSBTSCByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkgICAgIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0Ci0gICAgICAgICBiZSBkb25lIGZvciB0aGVtLCBpdCBoYXMgYmVlbiBkb25lIGluIHNoX3JlbGF4X3NlY3Rpb24uICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfU0hfSU1NMzIKLQkgICYmIHJlbC0+cl90eXBlICE9IFJfU0hfUENESVNQKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGlmIChzeW1uZHggPCAwCi0JICAgICAgfHwgKHVuc2lnbmVkIGxvbmcpIHN5bW5keCA+PSBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoIiVzOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIiwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHN5bW5keCk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPT0gUl9TSF9QQ0RJU1ApCi0JYWRkZW5kIC09IDQ7Ci0KLSAgICAgIGlmIChyZWwtPnJfdHlwZSA+PSBTSF9DT0ZGX0hPV1RPX0NPVU5UKQotCWhvd3RvID0gTlVMTDsKLSAgICAgIGVsc2UKLQlob3d0byA9ICZzaF9jb2ZmX2hvd3Rvc1tyZWwtPnJfdHlwZV07Ci0KLSAgICAgIGlmIChob3d0byA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGZvciBhbiBpbnRlcm5hbCBQQ0RJU1AgcmVsb2MuICAqLwotCSAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfUENESVNQKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUKLQkJICAgICAtIHNlYy0+dm1hKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywKLQkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQl2YWwsIGFkZGVuZCk7Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JCSAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgZWxzZQotCSAgICAgIHsKLSAJCXN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JCWJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQluYW1lID0gYnVmOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICB3aGljaCB1c2VzIHNoX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pID09IE5VTEwKLSAgICAgIHx8IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBtZW1jcHkgKGRhdGEsIGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotICAgICAgYmZkX2J5dGUgKmVzeW0sICplc3ltZW5kOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotCi0gICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBmYWxzZSwgKGJmZF9ieXRlICopIE5VTEwsCi0JCQkgIGZhbHNlLCAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQotCQkgICAgICAgYmZkX21hbGxvYyAob2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkKLQkJCQkgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKQotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogc3ltZXN6OwotICAgICAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQotCXsKLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIChQVFIpIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5uX3NjbnVtICE9IDApCi0JICAgICpzZWNwcCA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+bl9zY251bSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaXN5bXAtPm5fdmFsdWUgPT0gMCkKLQkJKnNlY3BwID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCSpzZWNwcCA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgIH0KLQotCSAgZXN5bSArPSAoaXN5bXAtPm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0JICBzZWNwcCArPSBpc3ltcC0+bl9udW1hdXggKyAxOwotCSAgaXN5bXAgKz0gaXN5bXAtPm5fbnVtYXV4ICsgMTsKLQl9Ci0KLSAgICAgIGlmICghIHNoX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFRoZSB0YXJnZXQgdmVjdG9ycy4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3ZlYyA9Ci17Ci0gICJjb2ZmLXNoIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKLQotY29uc3QgYmZkX3RhcmdldCBzaGxjb2ZmX3ZlYyA9Ci17Ci0gICJjb2ZmLXNobCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbiB0b28qLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwgICAKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwotCi0vKiBTb21lIHBlb3BsZSB3YW50IHZlcnNpb25zIG9mIHRoZSBTSCBDT0ZGIHRhcmdldCB3aGljaCBkbyBub3QgYWxpZ24KLSAgIHRvIDE2IGJ5dGUgYm91bmRhcmllcy4gIFdlIGltcGxlbWVudCB0aGF0IGJ5IGFkZGluZyBhIGNvdXBsZSBvZiBuZXcKLSAgIHRhcmdldCB2ZWN0b3JzLiAgVGhlc2UgYXJlIGp1c3QgbGlrZSB0aGUgb25lcyBhYm92ZSwgYnV0IHRoZXkKLSAgIGNoYW5nZSB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudC4gIFRvIGdlbmVyYXRlIHRoZW0gaW4gdGhlCi0gICBhc3NlbWJsZXIsIHVzZSAtc21hbGwuICBUbyB1c2UgdGhlbSBpbiB0aGUgbGlua2VyLCB1c2UgLWIKLSAgIGNvZmYtc2h7bH0tc21hbGwgYW5kIC1vZm9ybWF0IGNvZmYtc2h7bH0tc21hbGwuCi0KLSAgIFllcywgdGhpcyBpcyBhIGhvcnJpYmxlIGhhY2suICBBIGdlbmVyYWwgc29sdXRpb24gZm9yIHNldHRpbmcKLSAgIHNlY3Rpb24gYWxpZ25tZW50IGluIENPRkYgaXMgcmF0aGVyIGNvbXBsZXguICBFTEYgaGFuZGxlcyB0aGlzCi0gICBjb3JyZWN0bHkuICAqLwotCi0vKiBPbmx5IHJlY29nbml6ZSB0aGUgc21hbGwgdmVyc2lvbnMgaWYgdGhlIHRhcmdldCB3YXMgbm90IGRlZmF1bHRlZC4KLSAgIE90aGVyd2lzZSB3ZSB3b24ndCByZWNvZ25pemUgdGhlIG5vbiBkZWZhdWx0IGVuZGlhbm5lc3MuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1jb2ZmX3NtYWxsX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT50YXJnZXRfZGVmYXVsdGVkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci19Ci0KLS8qIFNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoZSBzbWFsbCB2ZXJzaW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NtYWxsX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGlmICghIGNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG11c3QgYWxpZ24gdG8gYXQgbGVhc3QgYSBmb3VyIGJ5dGUgYm91bmRhcnksIGJlY2F1c2UgbG9uZ3dvcmQKLSAgICAgYWNjZXNzZXMgbXVzdCBiZSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0gIGlmIChzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPT0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY29waWVkIGZyb20gYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUgc28gdGhhdCB3ZSBjYW4gY2hhbmdlCi0gICB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBwb3dlci4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfY29mZl9iYWNrZW5kX2RhdGEgYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSA9Ci17Ci0gIGNvZmZfc3dhcF9hdXhfaW4sIGNvZmZfc3dhcF9zeW1faW4sIGNvZmZfc3dhcF9saW5lbm9faW4sCi0gIGNvZmZfc3dhcF9hdXhfb3V0LCBjb2ZmX3N3YXBfc3ltX291dCwKLSAgY29mZl9zd2FwX2xpbmVub19vdXQsIGNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIGNvZmZfc3dhcF9maWxlaGRyX291dCwgY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICBjb2ZmX3N3YXBfc2NuaGRyX291dCwKLSAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgU1lNRVNaLCBBVVhFU1osIFJFTFNaLCBMSU5FU1osCi0jaWZkZWYgQ09GRl9MT05HX0ZJTEVOQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSAgMiwKLSAgY29mZl9zd2FwX2ZpbGVoZHJfaW4sIGNvZmZfc3dhcF9hb3V0aGRyX2luLCBjb2ZmX3N3YXBfc2NuaGRyX2luLAotICBjb2ZmX3N3YXBfcmVsb2NfaW4sIGNvZmZfYmFkX2Zvcm1hdF9ob29rLCBjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgY29mZl9ta29iamVjdF9ob29rLCBzdHlwX3RvX3NlY19mbGFncywgY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssCi0gIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLCBzeW1uYW1lX2luX2RlYnVnX2hvb2ssIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaywKLSAgY29mZl9wcmludF9hdXgsIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcywgY29mZl9yZWxvYzE2X2VzdGltYXRlLAotICBjb2ZmX3N5bV9pc19nbG9iYWwsIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAotICBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmssIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiwgY29mZl9ydHlwZV90b19ob3d0bywKLSAgY29mZl9hZGp1c3Rfc3ltbmR4LCBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wsCi0gIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuLCBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAotfTsKLQotI2RlZmluZSBjb2ZmX3NtYWxsX2Nsb3NlX2FuZF9jbGVhbnVwIFwKLSAgY29mZl9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBjb2ZmX3NtYWxsX2JmZF9mcmVlX2NhY2hlZF9pbmZvIFwKLSAgY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBjb2ZmX3NtYWxsX2dldF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX3NtYWxsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3NtYWxsX3ZlYyA9Ci17Ci0gICJjb2ZmLXNoLXNtYWxsIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAmYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZQotfTsKLQotY29uc3QgYmZkX3RhcmdldCBzaGxjb2ZmX3NtYWxsX3ZlYyA9Ci17Ci0gICJjb2ZmLXNobC1zbWFsbCIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgZW5kaWFuIHRvbyovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX3NtYWxsX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LCAgIAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmX3NtYWxsKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpICZiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3BhcmMuYyBiL2JmZC9jb2ZmLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMmNmMTUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFNwYXJjIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvc3BhcmMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2RlZmluZSBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFNQQVJDTUFHSUMgJiYgKHgpLmZfbWFnaWMgIT0gTFlOWENPRkZNQUdJQykKLQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMDAKLQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSX1NQQVJDX05PTkUgPSAwLAotICAgIFJfU1BBUkNfOCwJCVJfU1BBUkNfMTYsCQlSX1NQQVJDXzMyLCAKLSAgICBSX1NQQVJDX0RJU1A4LAlSX1NQQVJDX0RJU1AxNiwJCVJfU1BBUkNfRElTUDMyLCAKLSAgICBSX1NQQVJDX1dESVNQMzAsCVJfU1BBUkNfV0RJU1AyMiwKLSAgICBSX1NQQVJDX0hJMjIsCVJfU1BBUkNfMjIsCi0gICAgUl9TUEFSQ18xMywJCVJfU1BBUkNfTE8xMCwKLSAgICBSX1NQQVJDX0dPVDEwLAlSX1NQQVJDX0dPVDEzLAkJUl9TUEFSQ19HT1QyMiwKLSAgICBSX1NQQVJDX1BDMTAsCVJfU1BBUkNfUEMyMiwKLSAgICBSX1NQQVJDX1dQTFQzMCwKLSAgICBSX1NQQVJDX0NPUFksCi0gICAgUl9TUEFSQ19HTE9CX0RBVCwJUl9TUEFSQ19KTVBfU0xPVCwKLSAgICBSX1NQQVJDX1JFTEFUSVZFLAotICAgIFJfU1BBUkNfVUEzMiwKLSAgICBSX1NQQVJDX21heAotICB9OwotCi0jaWYgMAotc3RhdGljIENPTlNUIGNoYXIgKkNPTlNUIHJlbG9jX3R5cGVfbmFtZXNbXSA9Ci17Ci0gICJSX1NQQVJDX05PTkUiLAotICAiUl9TUEFSQ184IiwJCSJSX1NQQVJDXzE2IiwJCSJSX1NQQVJDXzMyIiwKLSAgIlJfU1BBUkNfRElTUDgiLAkiUl9TUEFSQ19ESVNQMTYiLAkiUl9TUEFSQ19ESVNQMzIiLAotICAiUl9TUEFSQ19XRElTUDMwIiwJIlJfU1BBUkNfV0RJU1AyMiIsCi0gICJSX1NQQVJDX0hJMjIiLAkiUl9TUEFSQ18yMiIsCi0gICJSX1NQQVJDXzEzIiwJCSJSX1NQQVJDX0xPMTAiLAotICAiUl9TUEFSQ19HT1QxMCIsCSJSX1NQQVJDX0dPVDEzIiwJIlJfU1BBUkNfR09UMjIiLAotICAiUl9TUEFSQ19QQzEwIiwJIlJfU1BBUkNfUEMyMiIsCi0gICJSX1NQQVJDX1dQTFQzMCIsCi0gICJSX1NQQVJDX0NPUFkiLAotICAiUl9TUEFSQ19HTE9CX0RBVCIsCSJSX1NQQVJDX0pNUF9TTE9UIiwKLSAgIlJfU1BBUkNfUkVMQVRJVkUiLAotICAiUl9TUEFSQ19VQTMyIiwKLX07Ci0jZW5kaWYKLQotLyogVGhpcyBpcyBzdG9sZW4gcHJldHR5IGRpcmVjdGx5IGZyb20gZWxmLmMuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCQlhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfY29mZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGNvZmZfc3BhcmNfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ184LCAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzgiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTYsICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18xNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQOCwgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0RJU1A4IiwgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDE2LCAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ESVNQMTYiLCAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AzMiwgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfRElTUDMyIiwgIGZhbHNlLDAsMHgwMGZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDMwLCAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1dESVNQMzAiLCBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AyMiwgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19XRElTUDIyIiwgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hJMjIsICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfSEkyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18yMiwgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzIyIiwgICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTMsICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18xMyIsICAgICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfTE8xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMCwgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dPVDEwIiwgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTMsICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HT1QxMyIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDIyLCAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR09UMjIiLCAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1BDMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMyMiwgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19QQzIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dQTFQzMCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfV1BMVDMwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19DT1BZLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0NPUFkiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR0xPQl9EQVQsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HTE9CX0RBVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0pNUF9TTE9ULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfSk1QX1NMT1QiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUxBVElWRSwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1JFTEFUSVZFIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUEzMiwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19VQTMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotfTsKLQotc3RydWN0IGNvZmZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgY29mZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGNvZmZfcmVsb2NfbWFwIHNwYXJjX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9TUEFSQ19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9TUEFSQ18xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9TUEFSQ184IH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfU1BBUkNfRElTUDggfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9TUEFSQ18zMiB9LCAvKiBAQCBBc3N1bWVzIDMyIGJpdHMuICAqLwotICB7IEJGRF9SRUxPQ18zMiwgUl9TUEFSQ18zMiB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9TUEFSQ19ESVNQMzIgfSwKLSAgeyBCRkRfUkVMT0NfSEkyMiwgUl9TUEFSQ19ISTIyIH0sCi0gIHsgQkZEX1JFTE9DX0xPMTAsIFJfU1BBUkNfTE8xMCwgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUxfUzIsIFJfU1BBUkNfV0RJU1AzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzIyLCBSX1NQQVJDXzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMTMsIFJfU1BBUkNfMTMgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMTAsIFJfU1BBUkNfR09UMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMTMsIFJfU1BBUkNfR09UMTMgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMjIsIFJfU1BBUkNfR09UMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMxMCwgUl9TUEFSQ19QQzEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMjIsIFJfU1BBUkNfUEMyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19XUExUMzAsIFJfU1BBUkNfV1BMVDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0NPUFksIFJfU1BBUkNfQ09QWSB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCwgUl9TUEFSQ19HTE9CX0RBVCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVCwgUl9TUEFSQ19KTVBfU0xPVCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSwgUl9TUEFSQ19SRUxBVElWRSB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLCBSX1NQQVJDX1dESVNQMjIgfSwKLSAgLyogIHsgQkZEX1JFTE9DX1NQQVJDX1VBMzIsIFJfU1BBUkNfVUEzMiB9LCBub3QgdXNlZD8/ICovCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3BhcmNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGNvZmZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmY29mZl9zcGFyY19ob3d0b190YWJsZVsoaW50KSBzcGFyY19yZWxvY19tYXBbaV0uY29mZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWNvZmZfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgQkZEX0FTU0VSVCAoZHN0LT5yX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmY29mZl9zcGFyY19ob3d0b190YWJsZVtkc3QtPnJfdHlwZV07Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQJYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSBcCi0gIGNhY2hlX3B0ci0+YWRkZW5kID0gcmVsb2Mucl9vZmZzZXQ7Ci0KLS8qIENsZWFyIHRoZSByX3NwYXJlIGZpZWxkIGluIHJlbG9jcy4gICovCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsc3JjLGRzdCkgXAotICBkbyB7IFwKLSAgICAgICBkc3QtPnJfc3BhcmVbMF0gPSAwOyBcCi0gICAgICAgZHN0LT5yX3NwYXJlWzFdID0gMDsgXAotICAgICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBFbmFibGUgU3BhcmMtc3BlY2lmaWMgaGFja3MgaW4gY29mZmNvZGUuaC4gKi8KLQotI2RlZmluZSBDT0ZGX1NQQVJDCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIHNwYXJjY29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiY29mZi1zcGFyYyIsCQkJLyogbmFtZSAqLwotI2VuZGlmCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLS8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBjb2ZmX29iamVjdF9wfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1zdGdvMzIuYyBiL2JmZC9jb2ZmLXN0Z28zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTcyNGZlLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXN0Z28zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IENPRkYgZmlsZXMgKGdvMzIgdmFyaWFudCB3aXRoIGEgc3R1YikuCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUm9iZXJ0IEhvZWhuZS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaGFuZGxlcyBub3cgYWxzbyBzdHViYmVkIGNvZmYgaW1hZ2VzLiBUaGUgc3R1YiBpcyBhIHNtYWxsCi0gICBET1MgZXhlY3V0YWJsZSBwcm9ncmFtIGJlZm9yZSB0aGUgY29mZiBpbWFnZSB0byBsb2FkIGl0IGluIG1lbW9yeQotICAgYW5kIGV4ZWN1dGUgaXQuIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIERPUyBjYW5ub3QgcnVuIGNvZmYgZmlsZXMuCi0KLSAgIEFsbCB0aGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zCi0gICBmcm9tIGNvZmZzd2FwLmguCi0gICBUaGUgb25seSB0aGluZyB3aGF0IHRoZXkgZG8gaXMgdG8gYWRqdXN0IHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4KLSAgIHRoZSBDT0ZGIGZpbGUgd2hpY2ggYXJlIG9mZnNldCBpbnRvIHRoZSBmaWxlLgotICAgVGhpcyBpcyBuZWVkZWQsIGJlY2F1c2UgREpHUFAgdXNlcyBhIHZlcnkgc3BlY2lhbCB3YXkgdG8gbG9hZCBhbmQgcnVuCi0gICB0aGUgY29mZiBpbWFnZS4gSXQgbG9hZHMgdGhlIGltYWdlIGluIG1lbW9yeSBhbmQgYXNzdW1lcyB0aGVuLCB0aGF0IHRoZQotICAgaW1hZ2UgaGFkIG5vIHN0dWIgYnkgdXNpbmcgdGhlIGZpbGVwb2ludGVycyBhcyBwb2ludGVycyBpbiB0aGUgY29mZgotICAgaW1hZ2UgYW5kIE5PVCBpbiB0aGUgZmlsZS4KLQotICAgVG8gYmUgY29tcGF0aWJsZSB3aXRoIGFueSBleGlzdGluZyBleGVjdXRhYmxlcyBJIGhhdmUgZml4ZWQgdGhpcwotICAgaGVyZSBhbmQgTk9UIGluIHRoZSBESkdQUCBzdGFydHVwIGNvZGUuCi0gKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCQlnbzMyc3R1YmJlZGNvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCQkiY29mZi1nbzMyLWV4ZSIKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUJJ18nCi0jZGVmaW5lIENPRkZfR08zMl9FWEUKLQotI2luY2x1ZGUgImJmZC5oIgotCi0vKiBBdCBmaXJzdCB0aGUgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfaW5fcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgc3JjLCBQVFIgZHN0KSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3ByZSBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW4sIFBUUiBvdXQpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW4sIFBUUiBvdXQpKTsKLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfaW5fcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgZXh0LCBQVFIgaW4pKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW4sIFBUUiBvdXQpKTsKLQotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfaW5fcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgZXh0MSwgaW50IHR5cGUsIGludCBjbGFzcywgaW50IGluZHgsCi0JCQkgICAgaW50IG51bWF1eCwgUFRSIGluMSkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfb3V0X3ByZSBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW5wLCBpbnQgdHlwZSwgaW50IGNsYXNzLCBpbnQgaW5keCwKLQkJCSAgICBpbnQgbnVtYXV4LCBQVFIgZXh0cCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGlucCwgaW50IHR5cGUsIGludCBjbGFzcywgaW50IGluZHgsCi0JCQkgICAgIGludCBudW1hdXgsIFBUUiBleHRwKSk7Ci0KLXN0YXRpYyB2b2lkCi1jcmVhdGVfZ28zMl9zdHViIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotLyoKLSAgIEFsbCB0aGF0IC4uLl9QUkUgYW5kIC4uLlBPU1QgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZwotICAgY29mZl9zd2FwLi4uIGZ1bmN0aW9ucy4gVGhlIC4uLlBSRSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nCi0gICBvZiB0aGUgZnVuY3Rpb24gYW5kIHRoZSAuLi5QT1NUIGZ1bmN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzd2FwIHJvdXRpbmVzLgotICovCi0KLSNkZWZpbmUgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUIGFkanVzdF9maWxlaGRyX2luX3Bvc3QKLSNkZWZpbmUgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFIGFkanVzdF9maWxlaGRyX291dF9wcmUKLSNkZWZpbmUgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVCBhZGp1c3RfZmlsZWhkcl9vdXRfcG9zdAotCi0jZGVmaW5lIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QT1NUIGFkanVzdF9zY25oZHJfaW5fcG9zdAotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSBhZGp1c3Rfc2NuaGRyX291dF9wcmUKLSNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUIGFkanVzdF9zY25oZHJfb3V0X3Bvc3QKLQotI2RlZmluZSBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVCBhZGp1c3RfYXV4X2luX3Bvc3QKLSNkZWZpbmUgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUgYWRqdXN0X2F1eF9vdXRfcHJlCi0jZGVmaW5lIENPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCBhZGp1c3RfYXV4X291dF9wb3N0Ci0KLXN0YXRpYyBib29sZWFuCi0gIGdvMzJfc3R1YmJlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICogaWJmZCwgYmZkICogb2JmZCkpOwotCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBnbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKLQotLyogSSBob2xkIGluIHRoZSB1c3JkYXRhIHRoZSBzdHViICovCi0jZGVmaW5lIGJmZF9jb2ZmX2dvMzJzdHViIGJmZF91c3JkYXRhCi0KLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCwgYmVjYXVzZSBJIGNhbm5vdCBhc3N1bWUgdGhlIGVuZGlhbmVzcyBvZiB0aGUKLSAgIGhvc3Qgc3lzdGVtICovCi0jZGVmaW5lIF9IKGluZGV4KSAoYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKShoZWFkZXIraW5kZXgqMikpKQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgYmZkIGlzIGEgc3R1YmJlZCBjb2ZmIGltYWdlICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1nbzMyX3N0dWJiZWRfY29mZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBjaGFyIGhlYWRlclsxMF07Ci0gIGNoYXIgbWFnaWNbOF07Ci0gIHVuc2lnbmVkIGxvbmcgY29mZl9zdGFydCwgZXhlX3N0YXJ0OwotCi0gIGlmIChiZmRfcmVhZCAoJmhlYWRlciwgMSwgc2l6ZW9mIChoZWFkZXIpLCBhYmZkKSAhPSBzaXplb2YgKGhlYWRlcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoX0ggKDApICE9IDB4NWE0ZCkJCS8qIGl0IGlzIG5vdCBhbiBleGUgZmlsZS4gbWF5YmUgYSBjb2ZmLWltYWdlICovCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBjb2ZmX3N0YXJ0ID0gKGxvbmcpIF9IICgyKSAqIDUxMkw7Ci0gIGlmIChfSCAoMSkpCi0gICAgY29mZl9zdGFydCArPSAobG9uZykgX0ggKDEpIC0gNTEyTDsKLQotICAvKiBXZSBjYW4gaGFuZGxlIG9ubHkgYSBzdHViIHdpdGggYSBsZW5ndGggb2YgU1RVQlNJWkUgKi8KLSAgaWYgKGNvZmZfc3RhcnQgIT0gU1RVQlNJWkUpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGV4ZV9zdGFydCA9IF9IICg0KSAqIDE2OwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGV4ZV9zdGFydCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChiZmRfcmVhZCAoJm1hZ2ljLCAxLCA4LCBhYmZkKSAhPSA4KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKG1lbWNtcCAobWFnaWMsICJnbzMyc3R1YiIsIDgpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogQ2FsbCB0aGUgbm9ybWFsIENPRkYgZGV0ZWN0aW9uIHJvdXRpbmUgKi8KLSAgcmV0dXJuIGNvZmZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi0vKiBUaGVzZSBieXRlcyBhcmUgYSAyMDQ4LWJ5dGUgRE9TIGV4ZWN1dGFibGUsIHdoaWNoIGxvYWRzIHRoZSBDT0ZGCi0gICBpbWFnZSBpbnRvIG1lbW9yeSBhbmQgdGhlbiBydW5zIGl0LiBJdCBpcyBjYWxsZWQgJ3N0dWInICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN0dWJfYnl0ZXNbU1RVQlNJWkVdID0KLXsKLSNpbmNsdWRlICJnbzMyc3R1Yi5oIgotfTsKLQotLyoKLSAgIEkgaGF2ZSBub3QgY29tbWVudGVkIGVhY2ggc3dhcCBmdW5jdGlvbiBiZWxvdywgYmVjYXVzZSB0aGUKLSAgIHRlY2huaXF1ZSBpcyBpbiBhbnkgZnVuY3Rpb24gdGhlIHNhbWUuIEZvciB0aGUgLi4uaW4gZnVuY3Rpb24sCi0gICBhbGwgdGhlIHBvaW50ZXJzIGFyZSBhZGp1c3RlZCBieSBhZGRpbmcgU1RVQlNJWkUgYW5kIGZvciB0aGUKLSAgIC4uLm91dCBmdW5jdGlvbiwgaXQgaXMgc3VidHJhY3RlZCBmaXJzdCBhbmQgYWZ0ZXIgY2FsbGluZyB0aGUKLSAgIHN0YW5kYXJkIHN3YXAgZnVuY3Rpb24gaXQgaXMgcmVzZXQgdG8gdGhlIG9sZCB2YWx1ZSAqLwotCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGFkanVzdGluZyB0aGUgZmlsZXBvaW50ZXJzLCB3aGljaAotICAgaXMgZG9uZSBvbmx5LCBpZiB0aGUgcG9pbnRlciBpcyBub256ZXJvICovCi0KLSNkZWZpbmUgQURKVVNUX1ZBTCh2YWwsZGlmZikgXAotICBpZiAodmFsICE9IDApIHZhbCArPSBkaWZmCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9pbl9wb3N0ICAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgRklMSERSICpmaWxlaGRyX3NyYyA9IChGSUxIRFIgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9kc3QgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZHN0OwotCi0gIEFESlVTVF9WQUwgKGZpbGVoZHJfZHN0LT5mX3N5bXB0ciwgU1RVQlNJWkUpOwotCi0gIC8qIFNhdmUgbm93IHRoZSBzdHViIHRvIGJlIHVzZWQgbGF0ZXIgKi8KLSAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBTVFVCU0laRSk7Ci0KLSAgLyogU2luY2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vIHN0YXR1cywgSSBkbyBub3Qgc2V0IGhlcmUKLSAgICAgYW55IGJmZF9lcnJvcl8uLi4KLSAgICAgVGhhdCBtZWFucywgYmVmb3JlIHRoZSB1c2Ugb2YgYmZkX2NvZmZfZ28zMnN0dWIgKCksIHRoaXMgdmFsdWUKLSAgICAgc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgIT0gTlVMTCAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBtZW1jcHkgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgZmlsZWhkcl9zcmMtPnN0dWIsIFNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wcmUgIChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopIG91dDsKLQotICAvKiBHZW5lcmF0ZSB0aGUgc3R1YiAqLwotICBjcmVhdGVfZ28zMl9zdHViIChhYmZkKTsKLQotICAvKiBDb3B5IHRoZSBzdHViIHRvIHRoZSBmaWxlIGhlYWRlciAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpICE9IE5VTEwpCi0gICAgbWVtY3B5IChmaWxlaGRyX291dC0+c3R1YiwgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpLCBTVFVCU0laRSk7Ci0gIGVsc2UKLSAgICAvKiB1c2UgdGhlIGRlZmF1bHQgKi8KLSAgICBtZW1jcHkgKGZpbGVoZHJfb3V0LT5zdHViLCBzdHViX2J5dGVzLCBTVFVCU0laRSk7Ci0KLSAgQURKVVNUX1ZBTCAoZmlsZWhkcl9pbi0+Zl9zeW1wdHIsIC1TVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcG9zdCAgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBpbjsKLSAgLyogdW5kbyB0aGUgYWJvdmUgY2hhbmdlICovCi0gIEFESlVTVF9WQUwgKGZpbGVoZHJfaW4tPmZfc3ltcHRyLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX2luX3Bvc3QgIChhYmZkLCBleHQsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHQ7Ci0gICAgIFBUUiBpbjsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfc2NucHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcHJlICAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgaW47Ci0gICAgIFBUUiBvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3NjbnB0ciwgLVNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19yZWxwdHIsIC1TVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwgLVNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3Bvc3QgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19zY25wdHIsIFNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19yZWxwdHIsIFNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19sbm5vcHRyLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X2luX3Bvc3QgIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgY2xhc3M7Ci0gICAgIGludCBpbmR4OwotICAgICBpbnQgbnVtYXV4OwotICAgICBQVFIgaW4xOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbjE7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgU1RVQlNJWkUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfb3V0X3ByZSAgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgaW5wOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keDsKLSAgICAgaW50IG51bWF1eDsKLSAgICAgUFRSIGV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopIGlucDsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBBREpVU1RfVkFMIChpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCAtU1RVQlNJWkUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfb3V0X3Bvc3QgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgaW5wOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keDsKLSAgICAgaW50IG51bWF1eDsKLSAgICAgUFRSIGV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopIGlucDsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBBREpVU1RfVkFMIChpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBTVFVCU0laRSk7Ci0gICAgfQotfQotCi0vKgotICAgVGhhdCdzIHRoZSBmdW5jdGlvbiwgd2hpY2ggY3JlYXRlcyB0aGUgc3R1Yi4gVGhlcmUgYXJlCi0gICBkaWZmZXJlbnQgY2FzZXMgZnJvbSB3aGVyZSB0aGUgc3R1YiBpcyB0YWtlbi4KLSAgIEF0IGZpcnN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkKEdPMzJTVFVCKSBpcyBjaGVja2VkIGFuZCB0aGVuCi0gICAkKFNUVUIpIGlmIGl0IHdhcyBub3Qgc2V0LgotICAgSWYgaXQgZXhpc3RzIGFuZCBwb2ludHMgdG8gYSB2YWxpZCBzdHViIHRoZSBzdHViIGlzIHRha2VuIGZyb20KLSAgIHRoYXQgZmlsZS4gVGhpcyBmaWxlIGNhbiBiZSBhbHNvIGEgd2hvbGUgZXhlY3V0YWJsZSBmaWxlLCBiZWNhdXNlCi0gICB0aGUgc3R1YiBpcyBjb21wdXRlZCBmcm9tIHRoZSBleGUgaW5mb3JtYXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoYXQKLSAgIGZpbGUuCi0KLSAgIElmIHRoZXJlIHdhcyBhbnkgZXJyb3IsIHRoZSBzdGFuZGFyZCBzdHViIChjb21waWxlZCBpbiB0aGlzIGZpbGUpCi0gICBpcyB0YWtlbi4KLSAqLwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2dvMzJfc3R1YiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBEbyBpdCBvbmx5IG9uY2UgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnN0dWI7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgIGludCBmOwotICAgICAgdW5zaWduZWQgY2hhciBoZWFkZXJbMTBdOwotICAgICAgY2hhciBtYWdpY1s4XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgY29mZl9zdGFydCwgZXhlX3N0YXJ0OwotCi0gICAgICAvKiBDaGVjayBhdCBmaXJzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChHTzMyU1RVQikgKi8KLSAgICAgIHN0dWIgPSBnZXRlbnYgKCJHTzMyU1RVQiIpOwotICAgICAgLyogTm93IGNoZWNrIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkKFNUVUIpICovCi0gICAgICBpZiAoc3R1YiA9PSBOVUxMKQotCXN0dWIgPSBnZXRlbnYgKCJTVFVCIik7Ci0gICAgICBpZiAoc3R1YiA9PSBOVUxMKQotCWdvdG8gc3R1Yl9lbmQ7Ci0gICAgICBpZiAoc3RhdCAoc3R1YiwgJnN0KSAhPSAwKQotCWdvdG8gc3R1Yl9lbmQ7Ci0jaWZkZWYgT19CSU5BUlkKLSAgICAgIGYgPSBvcGVuIChzdHViLCBPX1JET05MWSB8IE9fQklOQVJZKTsKLSNlbHNlCi0gICAgICBmID0gb3BlbiAoc3R1YiwgT19SRE9OTFkpOwotI2VuZGlmCi0gICAgICBpZiAoZiA8IDApCi0JZ290byBzdHViX2VuZDsKLSAgICAgIGlmIChyZWFkIChmLCAmaGVhZGVyLCBzaXplb2YgKGhlYWRlcikpIDwgMCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIGlmIChfSCAoMCkgIT0gMHg1YTRkKQkvKiBpdCBpcyBub3QgYW4gZXhlIGZpbGUgKi8KLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHN0dWIgKGl0IGlzIGV2ZXJ5IHRoaW5nIHVwCi0gICAgICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb2ZmIGltYWdlKSAqLwotICAgICAgY29mZl9zdGFydCA9IChsb25nKSBfSCAoMikgKiA1MTJMOwotICAgICAgaWYgKF9IICgxKSkKLQljb2ZmX3N0YXJ0ICs9IChsb25nKSBfSCAoMSkgLSA1MTJMOwotCi0gICAgICAvKiBDdXJyZW50bHkgdGhlcmUgaXMgb25seSBhIGZpeGVkIHN0dWIgc2l6ZSBvZiAyMDQ4IGJ5dGVzCi0gICAgICAgICBzdXBwb3J0ZWQgKi8KLSAgICAgIGlmIChjb2ZmX3N0YXJ0ICE9IDIwNDgpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBleGVfc3RhcnQgPSBfSCAoNCkgKiAxNjsKLSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgbHNlZWsgKGYsIGV4ZV9zdGFydCwgU0VFS19TRVQpICE9IGV4ZV9zdGFydCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIGlmIChyZWFkIChmLCAmbWFnaWMsIDgpICE9IDgpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAobWVtY21wIChtYWdpYywgImdvMzJzdHViIiwgOCkgIT0gMCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIC8qIE5vdyB3ZSBmb3VuZCBhIGNvcnJlY3Qgc3R1YiAoaG9wZWZ1bGx5KSAqLwotICAgICAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBjb2ZmX3N0YXJ0KTsKLSAgICAgIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbHNlZWsgKGYsIDBMLCBTRUVLX1NFVCk7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHJlYWQgKGYsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgY29mZl9zdGFydCkKLQkgICE9IGNvZmZfc3RhcnQpCi0JewotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSk7Ci0JICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSBOVUxMOwotCX0KLSAgICAgIGNsb3NlIChmKTsKLSAgICB9Ci1zdHViX2VuZDoKLSAgLyogVGhlcmUgd2FzIHNvbWV0aGluZyB3cm9uZyBhYm92ZSwgc28gdXNlIG5vdyB0aGUgc3RhbmRhcmQgYnVpbHRpbgotICAgICBzdHViICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIFNUVUJTSVpFKTsKLSAgICAgIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLQl7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBtZW1jcHkgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgc3R1Yl9ieXRlcywgU1RVQlNJWkUpOwotICAgIH0KLX0KLQotLyogSWYgaWJmZCB3YXMgYSBzdHViYmVkIGNvZmYgaW1hZ2UsIGNvcHkgdGhlIHN0dWIgZnJvbSB0aGF0IGJmZAotICAgdG8gdGhlIG5ldyBvYmZkLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1nbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhICAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIC8qIGNoZWNrIGlmIGJvdGggYXJlIHRoZSBzYW1lIHRhcmdldHMgKi8KLSAgaWYgKGliZmQtPnh2ZWMgIT0gb2JmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBjaGVjayBpZiBib3RoIGhhdmUgYSB2YWxpZCBzdHViICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoaWJmZCkgPT0gTlVMTAotICAgICAgfHwgYmZkX2NvZmZfZ28zMnN0dWIgKG9iZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTm93IGNvcHkgdGhlIHN0dWIgKi8KLSAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAob2JmZCksIGJmZF9jb2ZmX2dvMzJzdHViIChpYmZkKSwgU1RVQlNJWkUpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3ZtNjhrLmMgYi9iZmQvY29mZi1zdm02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyYTVhNy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zdm02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgc3lzdjY4Ci0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a3N5c3Zjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLXN5c3YiCi0jZGVmaW5lIFNUQVRJQ19SRUxPQ1MKLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXRpYzMwLmMgYi9iZmQvY29mZi10aWMzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmY4YzU5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXRpYzMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBUTVMzMjBDMzAgY29mZiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi90aWMzMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1yZWxvY19ob3d0b190eXBlIHRpYzMwX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1RJQzMwX0FCUzE2LCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIE5VTEwsCi0JICIxNiIsIGZhbHNlLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX0FCUzI0LCAyLCAyLCAyNCwgZmFsc2UsIDgsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiMjQiLCBmYWxzZSwgMHhGRkZGRkYwMCwgMHhGRkZGRkYwMCwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9MRFAsIDE4LCAwLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVElDMzBfQUJTMzIsIDIsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCi0JICIzMiIsIGZhbHNlLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX1BDMTYsIDIsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIE5VTEwsCi0JICJQQ1JFTCIsIGZhbHNlLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGLCBmYWxzZSksCi0gIHstMX0KLX07Ci0KLSNpZm5kZWYgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgdGljMzBfY29mZl9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBGb3IgdGhlIGNhc2Ugc3RhdGVtZW50IHVzZSB0aGUgY29kZSB2YWx1ZXMgdXNlZCBpbiB0Y19nZW5fcmVsb2MgdG8KLSAgIG1hcCB0byB0aGUgaG93dG8gdGFibGUgZW50cmllcyB0aGF0IG1hdGNoIHRob3NlIGluIGJvdGggdGhlIGFvdXQKLSAgIGFuZCBjb2ZmIGltcGxlbWVudGF0aW9ucy4gKi8KLXJlbG9jX2hvd3RvX3R5cGUgKgotdGljMzBfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgIGNhc2UgQkZEX1JFTE9DX1RJQzMwX0xEUDoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVsyXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVswXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNDoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVsxXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVs0XTsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVszXTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotCi0jZW5kaWYKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludAotY29mZl90aWMzMF9zZWxlY3RfcmVsb2MgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuIGhvd3RvLT50eXBlOwotfQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB4LnJfdHlwZSA9IGNvZmZfdGljMzBfc2VsZWN0X3JlbG9jKGhvd3RvKQotCi0KLSNkZWZpbmUgQkFETUFHKHgpIFRJQzMwQkFETUFHKHgpCi0jZGVmaW5lIFRJQzMwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUuICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBzd2l0Y2ggKGRzdC0+cl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVElDMzBfQUJTMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVswXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9BQlMyNDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX0FCUzMyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbM107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfTERQOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMl07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfUEMxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzRdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAocmVsb2MtPnJfc3ltbmR4ID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldCB0aWMzMF9jb2ZmX3ZlYyA9Ci17Ci0gICJjb2ZmLXRpYzMwIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXRpYzgwLmMgYi9iZmQvY29mZi10aWM4MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDNjOGEwLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXRpYzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDODAgTXVsdGltZWRpYSBWaWRlbyBQcm9jZXNzb3IgKE1WUCkuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggKGZuZkBjeWdudXMuY29tKQotCi0gICBUaGVyZSBpcyBub3RoaW5nIG5ldyB1bmRlciB0aGUgc3VuLiBUaGlzIGZpbGUgZHJhd3MgYSBsb3Qgb24gb3RoZXIKLSAgIGNvZmYgZmlsZXMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi90aWM4MC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotI2RlZmluZSBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSIDEKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRkxBR1MgMQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfRkxBR1MgYmZkX2hfZ2V0XzE2Ci0jZGVmaW5lIFBVVF9TQ05IRFJfRkxBR1MgYmZkX2hfcHV0XzE2Ci0KLXN0YXRpYyB2b2lkIHJ0eXBlMmhvd3RvCi0gIFBBUkFNUyAoKGFyZWxlbnQgKmNhY2hlX3B0ciwgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3QpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBiYXNlX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBnbG9iMTVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdsb2IxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbG9jYWwxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgdGljODBfaG93dG9fdGFibGVbXSA9Ci17Ci0KLSAgSE9XVE8gKFJfUkVMTE9ORywJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTExPTkciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTVBQQ1IsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJNUFBDUiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BQlMsCQkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQUJTIiwJCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBCQVNFLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGJhc2VfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBCQVNFIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTEJBU0UsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwYmFzZV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExCQVNFIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE1IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNVciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFAxNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQMTZCIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUEwxNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUEwxNVciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTVIIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGxvY2FsMTZfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTZCIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNVcsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTjE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTZCLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTjE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExOMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTE4xNVcsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExOMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTVILAkJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGxvY2FsMTZfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotDAotLyogU3BlY2lhbCByZWxvY2F0aW9uIGZ1bmN0aW9ucywgdXNlZCB3aGVuIHRoZSBvdXRwdXQgZmlsZSBpcyBub3QKLSAgIGl0c2VsZiBhIENPRkYgVEljODAgZmlsZS4gICovCi0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgYmFzZSBhZGRyZXNzIHR5cGUKLSAgIHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBiYXNlX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGdsb2JhbCAxNSBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1nbG9iMTVfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZ2xvYmFsIDE2IGJpdCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWdsb2IxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBsb2NhbCAxNiBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1sb2NhbDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotDAotLyogQ29kZSB0byB0dXJuIGFuIGV4dGVybmFsIHJfdHlwZSBpbnRvIGEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgaG93dG9fdGFibGUuCi0gICBJZiBwYXNzZWQgYW4gcl90eXBlIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgYWJvcnQgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmFpbGluZwotICAgdG8gZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUuICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdGljODBfaG93dG9fdGFibGUgLyBzaXplb2YgdGljODBfaG93dG9fdGFibGVbMF07IGkrKykKLSAgICB7Ci0gICAgICBpZiAodGljODBfaG93dG9fdGFibGVbaV0udHlwZSA9PSBkc3QtPnJfdHlwZSkKLQl7Ci0JICBjYWNoZV9wdHItPmhvd3RvID0gdGljODBfaG93dG9fdGFibGUgKyBpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbnJlY29nbml6ZWQgcmVsb2MgdHlwZSAweCV4IiksCi0JCQkgKHVuc2lnbmVkIGludCkgZHN0LT5yX3R5cGUpOwotICBjYWNoZV9wdHItPmhvd3RvID0gdGljODBfaG93dG9fdGFibGUgKyAwOwotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl90aWM4MF9ydHlwZV90b19ob3d0bwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX3RpYzgwX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCBnZW5yZWw7Ci0KLSAgaWYgKHJlbCAtPiByX3N5bW5keCA9PSAtMSAmJiBhZGRlbmRwICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFRJICJpbnRlcm5hbCByZWxvY2F0aW9uIiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVsb2NhdGlvbgotCSBhbW91bnQgaXMgdGhlIGFtb3VudCBieSB3aGljaCB0aGUgY3VycmVudCBzZWN0aW9uIGlzIGJlaW5nIHJlbG9jYXRlZAotCSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICovCi0gICAgICAqYWRkZW5kcCA9IChzZWMgLT4gb3V0cHV0X3NlY3Rpb24gLT4gdm1hICsgc2VjIC0+IG91dHB1dF9vZmZzZXQpIC0gc2VjIC0+IHZtYTsKLSAgICB9Ci0gIFJUWVBFMkhPV1RPICgmZ2VucmVsLCByZWwpOwotICByZXR1cm4gZ2VucmVsLmhvd3RvOwotfQotCi0jaWZuZGVmIEJBRE1BRwotI2RlZmluZSBCQURNQUcoeCkgVElDODBCQURNQUcoeCkKLSNlbmRpZgotDAotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdlIG5lZWQgYSBzcGVjaWFsIHJlbG9jYXRpb24gcm91dGluZSB0byBoYW5kbGUgdGhlIFBQIHJlbG9jcy4gIE1vc3QKLSAgIG9mIHRoaXMgaXMgYSBjb3B5IG9mIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCi0JCQkgICAgIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF92bWEgYWRkcjsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIENPRkYgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGluIG9uZSBvZiB0d28gd2F5cy4gIEVpdGhlciB0aGUKLSAgICAgICAgIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgb3IgaXQKLSAgICAgICAgIGlzIG5vdC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzaXplIGlzIG5vdCBpbmNsdWRlZCwgYW5kIGZvcmNlCi0gICAgICAgICB0aGUgcnR5cGVfdG9faG93dG8gZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBhZGRlbmQgYXMgbmVlZGVkLiAgKi8KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLSAgICAgIGhvd3RvID0gYmZkX2NvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOwotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKG91dHB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgYWRkciA9IHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgLyogRklYTUU6IFRoaXMgY29kZSBhc3N1bWVzIGxpdHRsZSBlbmRpYW4sIGJ1dCB0aGUgUFAgY2FuCi0gICAgICAgICBhcHBhcmVudGx5IGJlIGJpLWVuZGlhbi4gIEkgZG9uJ3Qga25vdyBpZiB0aGUgYmktZW5kaWFubmVzcwotICAgICAgICAgYXBwbGllcyB0byB0aGUgaW5zdHJ1Y3Rpb24gc2V0IG9yIGp1c3QgdG8gdGhlIGRhdGEuICAqLwotICAgICAgc3dpdGNoIChob3d0by0+dHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIFJfQUJTOgotCWNhc2UgUl9SRUxMT05HWDoKLQljYXNlIFJfUFBMMTU6Ci0JY2FzZSBSX1BQTDE1VzoKLQljYXNlIFJfUFBMMTVIOgotCWNhc2UgUl9QUExOMTU6Ci0JY2FzZSBSX1BQTE4xNVc6Ci0JY2FzZSBSX1BQTE4xNUg6Ci0JICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLCBhZGRyLCB2YWwsIGFkZGVuZCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUDE1OgotCWNhc2UgUl9QUDE1VzoKLQljYXNlIFJfUFAxNUg6Ci0JY2FzZSBSX1BQTjE1OgotCWNhc2UgUl9QUE4xNVc6Ci0JY2FzZSBSX1BQTjE1SDoKLQkgIC8qIE9mZnNldCB0aGUgYWRkcmVzcyBzbyB0aGF0IHdlIGNhbiB1c2UgNCBieXRlIHJlbG9jYXRpb25zLiAgKi8KLQkgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMgKyAyLCBhZGRyLCB2YWwsIGFkZGVuZCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUDE2QjoKLQljYXNlIFJfUFBOMTZCOgotCSAgewotCSAgICAvKiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgc3RvcmVkIGluIGJpdCA2LiAgKi8KLQkgICAgYmZkX2J5dGUgaG9sZDsKLQotCSAgICBob2xkID0gY29udGVudHNbYWRkciArIDRdOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gJj1+IDB4MjA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSB8PSAoY29udGVudHNbYWRkcl0gPj4gMSkgJiAweDIwOwotCSAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMgKyAyLCBhZGRyLAotCQkJCQkgICAgICB2YWwsIGFkZGVuZCk7Ci0JICAgIGNvbnRlbnRzW2FkZHJdICY9fiAweDQwOwotCSAgICBjb250ZW50c1thZGRyXSB8PSAoY29udGVudHNbYWRkciArIDRdIDw8IDEpICYgMHg0MDsKLQkgICAgY29udGVudHNbYWRkciArIDRdICY9fiAweDIwOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gfD0gaG9sZCAmIDB4MjA7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBSX1BQTDE2QjoKLQljYXNlIFJfUFBMTjE2QjoKLQkgIHsKLQkgICAgLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHN0b3JlZCBpbiBiaXQgMjguICAqLwotCSAgICBiZmRfYnl0ZSBob2xkOwotCi0JICAgIGhvbGQgPSBjb250ZW50c1thZGRyICsgMV07Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSAmPX4gMHg4MDsKLQkgICAgY29udGVudHNbYWRkciArIDFdIHw9IChjb250ZW50c1thZGRyICsgM10gPDwgMykgJiAweDgwOwotCSAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMsIGFkZHIsCi0JCQkJCSAgICAgIHZhbCwgYWRkZW5kKTsKLQkgICAgY29udGVudHNbYWRkciArIDNdICY9IH4weDEwOwotCSAgICBjb250ZW50c1thZGRyICsgM10gfD0gKGNvbnRlbnRzW2FkZHIgKyAxXSA+PiAzKSAmIDB4MTA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSAmPX4gMHg4MDsKLQkgICAgY29udGVudHNbYWRkciArIDFdIHw9IGhvbGQgJiAweDgwOwotCSAgICBicmVhazsKLQkgIH0KLQkKLQljYXNlIFJfUFBCQVNFOgotCSAgLyogUGFyYW1ldGVyIFJBTSBpcyBmcm9tIDB4MTAwMDAwMCB0byAweDEwMDA4MDAuICAqLwotCSAgY29udGVudHNbYWRkcl0gJj1+IDB4MzsKLQkgIGlmICh2YWwgPj0gMHgxMDAwMDAwICYmIHZhbCA8IDB4MTAwMDgwMCkKLQkgICAgY29udGVudHNbYWRkcl0gfD0gMHgzOwotCSAgZWxzZQotCSAgICBjb250ZW50c1thZGRyXSB8PSAweDI7Ci0JICByc3RhdCA9IGJmZF9yZWxvY19vazsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQTEJBU0U6Ci0JICAvKiBQYXJhbWV0ZXIgUkFNIGlzIGZyb20gMHgxMDAwMDAwIHRvIDB4MTAwMDgwMC4gICovCi0JICBjb250ZW50c1thZGRyICsgMl0gJj0gfjB4YzA7Ci0JICBpZiAodmFsID49IDB4MTAwMDAwMCAmJiB2YWwgPCAweDEwMDA4MDApCi0JICAgIGNvbnRlbnRzW2FkZHIgKyAyXSB8PSAweGMwOwotCSAgZWxzZQotCSAgICBjb250ZW50c1thZGRyICsgMl0gfD0gMHg4MDsKLQkgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKLQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotI2RlZmluZSBUSUM4MENPRkYgMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSN1bmRlZiBDX0FVVE9BUkcJCS8qIENsYXNoZXMgd2l0aCBUSWM4MCdzIENfVUVYVCAqLwotI3VuZGVmIENfTEFTVEVOVAkJLyogQ2xhc2hlcyB3aXRoIFRJYzgwJ3MgQ19TVEFUTEFCICovCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldCAKLSAgdGljODBjb2ZmX3ZlYyA9Ci17Ci0gICJjb2ZmLXRpYzgwIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKGFyY2ggc3VwcG9ydHMgYm90aCkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRQotIH07CmRpZmYgLS1naXQgYS9iZmQvY29mZi11NjhrLmMgYi9iZmQvY29mZi11NjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZWE3M2YuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtdTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA2ODAwMCBDT0ZGIGJpbmFyaWVzIGhhdmluZyB1bmRlcnNjb3JlIHdpdGggbmFtZS4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2NvZmZ1bl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay11biIKLQotI2RlZmluZSBOQU1FU19IQVZFX1VOREVSU0NPUkUKLQotLyogZGVmaW5lIHRoaXMgdG8gbm90IGhhdmUgbXVsdGlwbGUgY29weSBvZiBtNjhrX3J0eXBlMmhvd3RvCi0gICBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlICovCi0jZGVmaW5lIE9OTFlfREVDTEFSRV9SRUxPQ1MKLQotLyogVGhpcyBtYWdpYyBudW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWVzIGhhdmUgdW5kZXJzY29yZXMuCi0gICBPdGhlciA2OGsgbWFnaWMgbnVtYmVycyBpbmRpY2F0ZSB0aGF0IHRoZSBuYW1lcyBkbyBub3QgaGF2ZQotICAgdW5kZXJzY29yZXMuICAqLwotI2RlZmluZSBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IE1DNjhLQkNTTUFHSUMpCi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXc2NS5jIGIvYmZkL2NvZmYtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDY4YzMuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtdzY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBXREMgNjU4MTYgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3c2NS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1c2NV9BQlM4LCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzE2LCAgIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMyNCwgICAwLCAgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczI0IiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTOFM4LCAgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIj5hYnM4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTOFMxNiwgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIl5hYnM4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMTZTOCwgMSwgIDAsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI+YWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMxNlMxNiwxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIl5hYnMxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X1BDUjgsICAgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJwY3JlbDgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfVzY1X1BDUjE2LCAgIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicGNyZWwxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9XNjVfRFAsICAgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJkcCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLQotfTsKLQotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSBcCi0gIHsgeC5yX3R5cGUgPSBzZWxlY3RfcmVsb2MoaG93dG8pOyB9Ci0KLSNkZWZpbmUgQkFETUFHKHgpIChXNjVCQURNQUcoeCkpCi0jZGVmaW5lIFc2NSAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLQotc3RhdGljIGludAotc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZSA7Ci19Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIGRzdC0+cl90eXBlIC0gMTsKLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSYoYmZkX2Fic19zeW1ib2wpOwotICAgIH0KLQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0KLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLSAgLyogIHJlbGVudC0+c2VjdGlvbiA9IDA7Ki8KLX0KLQotCi1zdGF0aWMgaW50Ci1oODMwMF9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWU7ICAKLSAgYmZkX3ZtYSBkb3Q7Ci0gIGJmZF92bWEgZ2FwOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyB0byBiZSByZWxvY2F0ZWQgd2lsbCBoYXZlIG1vdmVkIGJhY2sgYnkgCi0gICB0aGUgc2l6ZSBvZiB0aGUgc2hyaW5rICAtIGJ1dCB3ZSBkb24ndCBjaGFuZ2UgcmVsb2MtPmFkZHJlc3MgaGVyZSwKLSAgIHNpbmNlIHdlIG5lZWQgaXQgdG8ga25vdyB3aGVyZSB0aGUgcmVsb2NhdGlvbiBsaXZlcyBpbiB0aGUgc291cmNlCi0gICB1bmNvb2tlZCBzZWN0aW9uICovCi0KLSAgLyogIHJlbG9jLT5hZGRyZXNzIC09IHNocmluazsgICBjb25jZXB0dWFsICovCi0KLSAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsb2MtPmFkZHJlc3MgLSBzaHJpbms7Ci0gIAotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsgICAgIAotICAgIGNhc2UgUl9NT1YxNkIyOgotICAgIGNhc2UgUl9KTVAyOgotICAgICAgc2hyaW5rKz0yOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoaW5nIGlzIGEgbW92ZSBvbmUgYnl0ZSAqLwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgaWYgKHZhbHVlID49IDB4ZmYwMCkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAxNmJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAxNiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgb25lICovCi0JICAvKiBUaGlzIHdpbGwgYmUgdHdvIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuICovCi0JICBzaHJpbmsgKz0yIDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfSAgICAgIAotCi0gICAgICBicmVhazsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIDI0IGJpdCBicmFuY2ggd2hpY2ggY291bGQgYmVjb21lIGFuIDggYml0dGVyLCAKLSAgICAgICB0aGUgcmVsb2NhdGlvbiBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluc24sIG5vdCB0aGUKLSAgICAgICBhY3R1YWwgZGF0YSAqLwotCi0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkKLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIFNlZSBpZiB0aGUgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGF0IHdpdGhpbiAxMjcgYnl0ZXMgb2Ygd2hlcmUKLQkgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0JIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdCA7Ci0gIAotICAgICAgaWYgKC0xMjAgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTIwICkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAyNGJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAzMiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoaXMgd2lsbCBiZSB0d28gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLQkgIHNocmluayArPTIgOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9KTVAxOgotCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCQotICAgICAgZG90ID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3M7Ci0gIAotICAgICAgLyogU2VlIGlmIHRoZSBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgYXQgd2l0aGluIDEyNyBieXRlcyBvZiB3aGVyZQotCSB3ZSBhcmUsIGlmIHNvIHRoZW4gd2UgY2FuIHVzZSBhIHNtYWxsIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUKLQkganVtcCB3ZSB3ZXJlIGdvaW5nIHRvICovCi0KLSAgICAgIGdhcCA9IHZhbHVlIC0gKGRvdCAtIHNocmluayk7Ci0gIAotCi0gICAgICBpZiAoLTEyMCA8IChsb25nKWdhcCAmJiAobG9uZylnYXAgPCAxMjAgKQotCXsgCi0KLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDE2Yml0LCBwb3NzaWJsZSA4IHRvIDhiaXQKLQkgICAgIHBvc3NpYmxlIDE2ICovCi0JICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwkgIAotCSAgLyogVGhlIHBsYWNlIHRvIHJlbGMgbW92ZXMgYmFjayBieSBvbmUgKi8KLQotCSAgLyogVGhpcyB3aWxsIGJlIHR3byBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotCSAgc2hyaW5rICs9MiA7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAKLSAgcmV0dXJuIHNocmluazsKLX0KLQotCi0vKiBGaXJzdCBwaGFzZSBvZiBhIHJlbGF4aW5nIGxpbmsgKi8KLQotLyogUmVsb2MgdHlwZXMKLSAgIGxhcmdlCQlzbWFsbAotICAgUl9NT1YxNkIxCQlSX01PVjE2QjIJbW92LmIgd2l0aCAxNmJpdCBvciA4IGJpdCBhZGRyZXNzCi0gICBSX0pNUDEJCVJfSk1QMgkJam1wIG9yIHBjcmVsIGJyYW5jaAotICAgUl9KTVBMMQkJUl9KTVBMX0I4CTI0am1wIG9yIHBjcmVsIGJyYW5jaAotICAgUl9NT1YyNEIxCQlSX01PVjI0QjIJMjQgb3IgOCBiaXQgcmVsb2MgZm9yIG1vdi5iCi0KLSovCi0KLXN0YXRpYyB2b2lkCi1oODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9ICpzcmNfcHRyOwotICB1bnNpZ25lZCBpbnQgZHN0X2FkZHJlc3MgPSAqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9XNjVfQUJTODoKLSAgICBjYXNlIFJfVzY1X0RQOgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTOFM4OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49IDg7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzhTMTY6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWdhcCA+Pj0xNjsKLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTMTY6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCi0JYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDI7Ci0Jc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfQUJTMTZTODoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSA4OwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0FCUzE2UzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49IDE2OwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTMjQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQliZmRfcHV0XzggKGFiZmQsIGdhcD4+MTYsIGRhdGErZHN0X2FkZHJlc3MrMik7Ci0JZHN0X2FkZHJlc3MgKz0gMzsKLQlzcmNfYWRkcmVzcyArPSAzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X1BDUjg6Ci0gICAgICB7Ci0JaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICsgZHN0X2FkZHJlc3MgCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JZ2FwIC09IGRvdCArIDE7Ci0JaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI3KSB7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0KCk7Ci0JfQotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDE7Ci0Jc3JjX2FkZHJlc3MgKz0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9QQ1IxNjoKLSAgICAgIHsKLQliZmRfdm1hIGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICsgZHN0X2FkZHJlc3MgCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0KLQkvKiBUaGlzIHdyYXBzIHdpdGhpbiB0aGUgcGFnZSwgc28gaWdub3JlIHRoZSByZWxhdGl2ZW5lc3MsIGxvb2sgYXQgdGhlCi0JICAgaGlnaCBwYXJ0ICovCi0JaWYgKChnYXAgJiAweGYwMDAwKSAhPSAoZG90ICYgMHhmMDAwMCkpIHsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQoKTsKLQl9Ci0KLQlnYXAgLT0gZG90ICsgMjsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZihfKCJpZ25vcmluZyByZWxvYyAlc1xuIiksIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgKnNyY19wdHIgPSBzcmNfYWRkcmVzczsKLSAgKmRzdF9wdHIgPSBkc3RfYWRkcmVzczsKLQotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBoODMwMF9yZWxvYzE2X2VzdGltYXRlCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLQotCi1iZmRfdGFyZ2V0IHc2NV92ZWMgPQotewotICAiY29mZi13NjUiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFICksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBjaGFyICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtd2UzMmsuYyBiL2JmZC9jb2ZmLXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNmJiZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtd2UzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIHdlMzJrIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi93ZTMyay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gICAgezB9LAotICAgIHsxfSwKLSAgICB7Mn0sCi0gICAgezN9LAotICAgIHs0fSwKLSAgICB7NX0sCi0gIEhPV1RPKFJfRElSMzIsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImRpcjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gICAgezd9LAotICAgIHswMTB9LAotICAgIHswMTF9LAotICAgIHswMTJ9LAotICAgIHswMTN9LAotICAgIHswMTR9LAotICAgIHswMTV9LAotICAgIHswMTZ9LAotICBIT1dUTyhSX1JFTEJZVEUsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTFdPUkQsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkcsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkJZVEUsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSTE9ORywJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIFdFMzJLQkFETUFHKHgpCi0jZGVmaW5lIFdFMzJLCTEKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jZGVmaW5lIGNvZmZfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0KLWNvbnN0IGJmZF90YXJnZXQgd2UzMmtjb2ZmX3ZlYyA9Ci17Ci0gICJjb2ZmLXdlMzJrIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0ge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXo4ay5jIGIvYmZkL2NvZmYtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDQ5ZTg5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXo4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgWmlsb2cgWjgwMG4gQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi96OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0zMiA9Ci1IT1dUTyAoUl9JTU0zMiwgMCwgMSwgMzIsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0zMiIsIHRydWUsIDB4ZmZmZmZmZmYsCi0gICAgICAgMHhmZmZmZmZmZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTRsID0KLUhPV1RPIChSX0lNTTRMLCAwLCAxLCA0LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tNGwiLCB0cnVlLCAweGYsIDB4ZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2RhID0KLUhPV1RPIChSX0lNTTE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2RhIiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwKLSAgICAgICBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tOCA9Ci1IT1dUTyAoUl9JTU04LCAwLCAxLCA4LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCi0gICAgICAgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2pyID0KLUhPV1RPIChSX0pSLCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCi0gICAgICAgInJfanIiLCB0cnVlLCAwLCAwLCB0cnVlKTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludCAKLWNvZmZfejhrX3NlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHgucl90eXBlID0gY29mZl96OGtfc2VsZWN0X3JlbG9jKGhvd3RvKQotCi0KLSNkZWZpbmUgQkFETUFHKHgpIFo4S0JBRE1BRyh4KQotI2RlZmluZSBaOEsgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICogaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBzd2l0Y2ggKGRzdC0+cl90eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NODoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTg7Ci0gICAgICBicmVhazsKLSAgICAgY2FzZSBSX0lNTTE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfZGE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSlI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9qcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU0zMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTRMOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tNGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZCAKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi1zdGF0aWMgdm9pZAotZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSU1NODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDE7Ci0gICAgICAoKnNyY19wdHIpICs9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU0zMjoKLSAgICAgIGJmZF9wdXRfMzIgKGluX2FiZmQsCi0JCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDQ7Ci0gICAgICAoKnNyY19wdHIpICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU00TDoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJICgoYmZkX2dldF84IChpbl9hYmZkLCBkYXRhICsgKmRzdF9wdHIpICYgMHhmMCkgCi0JCSAgfCAoMHgwZgotCQkgICAgICYgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICBpbnB1dF9zZWN0aW9uKSkpLAotCQkgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMTsKLSAgICAgICgqc3JjX3B0cikgKz0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSAgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMjsKLSAgICAgICgqc3JjX3B0cikgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0pSOgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCQkgICAgICAgKyAqZHN0X3B0cgotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCAmIDEpCi0JICBhYm9ydCAoKTsKLQlnYXAgLz0gMjsKLQlpZiAoZ2FwID4gMTI4IHx8IGdhcCA8IC0xMjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzggKGluX2FiZmQsIGdhcCwgZGF0YSArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpKys7Ci0JKCpzcmNfcHRyKSsrOwotCWJyZWFrOwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGV4dHJhX2Nhc2UKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQotI3VuZGVmICBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgejhrY29mZl92ZWMgPQotewotICAiY29mZi16OGsiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmY29kZS5oIGIvYmZkL2NvZmZjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODQyNWUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzU0ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIG1vc3QgQ09GRiB2YXJpYW50cywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1Nb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKLQkJCXNhY0BjeWdudXMuY29tCi0qLwotLyoKLQotU0VDVElPTgotCWNvZmYgYmFja2VuZHMKLQotCUJGRCBzdXBwb3J0cyBhIG51bWJlciBvZiBkaWZmZXJlbnQgZmxhdm91cnMgb2YgY29mZiBmb3JtYXQuCi0JVGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gZm9ybWF0cyBhcmUgdGhlIHNpemVzIGFuZAotCWFsaWdubWVudHMgb2YgZmllbGRzIGluIHN0cnVjdHVyZXMgb24gZGlzaywgYW5kIHRoZSBvY2Nhc2lvbmFsCi0JZXh0cmEgZmllbGQuCi0KLQlDb2ZmIGluIGFsbCBpdHMgdmFyaWV0aWVzIGlzIGltcGxlbWVudGVkIHdpdGggYSBmZXcgY29tbW9uCi0JZmlsZXMgYW5kIGEgbnVtYmVyIG9mIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGZpbGVzLiBGb3IKLQlleGFtcGxlLCBUaGUgODhrIGJjcyBjb2ZmIGZvcm1hdCBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgZmlsZQotCUBmaWxle2NvZmYtbTg4ay5jfS4gVGhpcyBmaWxlIEBjb2RleyNpbmNsdWRlfXMKLQlAZmlsZXtjb2ZmL204OGsuaH0gd2hpY2ggZGVmaW5lcyB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlIG9mIHRoZQotCWNvZmYgZm9ybWF0IGZvciB0aGUgODhrLCBhbmQgQGZpbGV7Y29mZi9pbnRlcm5hbC5ofSB3aGljaAotCWRlZmluZXMgdGhlIGludGVybmFsIHN0cnVjdHVyZS4gQGZpbGV7Y29mZi1tODhrLmN9IGFsc28KLQlkZWZpbmVzIHRoZSByZWxvY2F0aW9ucyB1c2VkIGJ5IHRoZSA4OGsgZm9ybWF0Ci0JQHhyZWZ7UmVsb2NhdGlvbnN9LgotCi0JVGhlIEludGVsIGk5NjAgcHJvY2Vzc29yIHZlcnNpb24gb2YgY29mZiBpcyBpbXBsZW1lbnRlZCBpbgotCUBmaWxle2NvZmYtaTk2MC5jfS4gVGhpcyBmaWxlIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMKLQlAZmlsZXtjb2ZmLW04OGsuY30sIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIEBmaWxle2NvZmYvaTk2MC5ofQotCXJhdGhlciB0aGFuIEBmaWxle2NvZmYtbTg4ay5ofS4KLQotU1VCU0VDVElPTgotCVBvcnRpbmcgdG8gYSBuZXcgdmVyc2lvbiBvZiBjb2ZmCi0KLQlUaGUgcmVjb21tZW5kZWQgbWV0aG9kIGlzIHRvIHNlbGVjdCBmcm9tIHRoZSBleGlzdGluZwotCWltcGxlbWVudGF0aW9ucyB0aGUgdmVyc2lvbiBvZiBjb2ZmIHdoaWNoIGlzIG1vc3QgbGlrZSB0aGUgb25lCi0JeW91IHdhbnQgdG8gdXNlLiAgRm9yIGV4YW1wbGUsIHdlJ2xsIHNheSB0aGF0IGkzODYgY29mZiBpcwotCXRoZSBvbmUgeW91IHNlbGVjdCwgYW5kIHRoYXQgeW91ciBjb2ZmIGZsYXZvdXIgaXMgY2FsbGVkIGZvby4KLQlDb3B5IEBmaWxle2kzODZjb2ZmLmN9IHRvIEBmaWxle2Zvb2NvZmYuY30sIGNvcHkKLQlAZmlsZXsuLi9pbmNsdWRlL2NvZmYvaTM4Ni5ofSB0byBAZmlsZXsuLi9pbmNsdWRlL2NvZmYvZm9vLmh9LAotCWFuZCBhZGQgdGhlIGxpbmVzIHRvIEBmaWxle3RhcmdldHMuY30gYW5kIEBmaWxle01ha2VmaWxlLmlufQotCXNvIHRoYXQgeW91ciBuZXcgYmFjayBlbmQgaXMgdXNlZC4gQWx0ZXIgdGhlIHNoYXBlcyBvZiB0aGUKLQlzdHJ1Y3R1cmVzIGluIEBmaWxley4uL2luY2x1ZGUvY29mZi9mb28uaH0gc28gdGhhdCB0aGV5IG1hdGNoCi0Jd2hhdCB5b3UgbmVlZC4gWW91IHdpbGwgcHJvYmFibHkgYWxzbyBoYXZlIHRvIGFkZAotCUBjb2RleyNpZmRlZn1zIHRvIHRoZSBjb2RlIGluIEBmaWxle2NvZmYvaW50ZXJuYWwuaH0gYW5kCi0JQGZpbGV7Y29mZmNvZGUuaH0gaWYgeW91ciB2ZXJzaW9uIG9mIGNvZmYgaXMgdG9vIHdpbGQuCi0KLQlZb3UgY2FuIHZlcmlmeSB0aGF0IHlvdXIgbmV3IEJGRCBiYWNrZW5kIHdvcmtzIHF1aXRlIHNpbXBseSBieQotCWJ1aWxkaW5nIEBmaWxle29iamR1bXB9IGZyb20gdGhlIEBmaWxle2JpbnV0aWxzfSBkaXJlY3RvcnksCi0JYW5kIG1ha2luZyBzdXJlIHRoYXQgaXRzIHZlcnNpb24gb2Ygd2hhdCdzIGdvaW5nIG9uIGFuZCB5b3VyCi0JaG9zdCBzeXN0ZW0ncyBpZGVhIChhc3N1bWluZyBpdCBoYXMgdGhlIHByZXR0eSBzdGFuZGFyZCBjb2ZmCi0JZHVtcCB1dGlsaXR5LCB1c3VhbGx5IGNhbGxlZCBAY29kZXthdHQtZHVtcH0gb3IganVzdAotCUBjb2Rle2R1bXB9KSBhcmUgdGhlIHNhbWUuICBUaGVuIGNsZWFuIHVwIHlvdXIgY29kZSwgYW5kIHNlbmQKLQl3aGF0IHlvdSd2ZSBkb25lIHRvIEN5Z251cy4gVGhlbiB5b3VyIHN0dWZmIHdpbGwgYmUgaW4gdGhlCi0JbmV4dCByZWxlYXNlLCBhbmQgeW91IHdvbid0IGhhdmUgdG8ga2VlcCBpbnRlZ3JhdGluZyBpdC4KLQotU1VCU0VDVElPTgotCUhvdyB0aGUgY29mZiBiYWNrZW5kIHdvcmtzCi0KLVNVQlNVQlNFQ1RJT04KLQlGaWxlIGxheW91dAotCi0JVGhlIENvZmYgYmFja2VuZCBpcyBzcGxpdCBpbnRvIGdlbmVyaWMgcm91dGluZXMgdGhhdCBhcmUKLQlhcHBsaWNhYmxlIHRvIGFueSBDb2ZmIHRhcmdldCBhbmQgcm91dGluZXMgdGhhdCBhcmUgc3BlY2lmaWMKLQl0byBhIHBhcnRpY3VsYXIgdGFyZ2V0LiAgVGhlIHRhcmdldC1zcGVjaWZpYyByb3V0aW5lcyBhcmUKLQlmdXJ0aGVyIHNwbGl0IGludG8gb25lcyB3aGljaCBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGZvciBhbGwKLQlDb2ZmIHRhcmdldHMgZXhjZXB0IHRoYXQgdGhleSB1c2UgdGhlIGV4dGVybmFsIHN5bWJvbCBmb3JtYXQKLQlvciB1c2UgZGlmZmVyZW50IHZhbHVlcyBmb3IgY2VydGFpbiBjb25zdGFudHMuCi0KLQlUaGUgZ2VuZXJpYyByb3V0aW5lcyBhcmUgaW4gQGZpbGV7Y29mZmdlbi5jfS4gIFRoZXNlIHJvdXRpbmVzCi0Jd29yayBmb3IgYW55IENvZmYgdGFyZ2V0LiAgVGhleSB1c2Ugc29tZSBob29rcyBpbnRvIHRoZSB0YXJnZXQKLQlzcGVjaWZpYyBjb2RlOyB0aGUgaG9va3MgYXJlIGluIGEgQGNvZGV7YmZkX2NvZmZfYmFja2VuZF9kYXRhfQotCXN0cnVjdHVyZSwgb25lIG9mIHdoaWNoIGV4aXN0cyBmb3IgZWFjaCB0YXJnZXQuCi0KLQlUaGUgZXNzZW50aWFsbHkgc2ltaWxhciB0YXJnZXQtc3BlY2lmaWMgcm91dGluZXMgYXJlIGluCi0JQGZpbGV7Y29mZmNvZGUuaH0uICBUaGlzIGhlYWRlciBmaWxlIGluY2x1ZGVzIGV4ZWN1dGFibGUgQyBjb2RlLgotCVRoZSB2YXJpb3VzIENvZmYgdGFyZ2V0cyBmaXJzdCBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBDb2ZmCi0JaGVhZGVyIGZpbGUsIG1ha2UgYW55IHNwZWNpYWwgZGVmaW5lcyB0aGF0IGFyZSBuZWVkZWQsIGFuZAotCXRoZW4gaW5jbHVkZSBAZmlsZXtjb2ZmY29kZS5ofS4KLQotCVNvbWUgb2YgdGhlIENvZmYgdGFyZ2V0cyB0aGVuIGFsc28gaGF2ZSBhZGRpdGlvbmFsIHJvdXRpbmVzIGluCi0JdGhlIHRhcmdldCBzb3VyY2UgZmlsZSBpdHNlbGYuCi0KLQlGb3IgZXhhbXBsZSwgQGZpbGV7Y29mZi1pOTYwLmN9IGluY2x1ZGVzCi0JQGZpbGV7Y29mZi9pbnRlcm5hbC5ofSBhbmQgQGZpbGV7Y29mZi9pOTYwLmh9LiAgSXQgdGhlbgotCWRlZmluZXMgYSBmZXcgY29uc3RhbnRzLCBzdWNoIGFzIEBjb2Rle0k5NjB9LCBhbmQgaW5jbHVkZXMKLQlAZmlsZXtjb2ZmY29kZS5ofS4gIFNpbmNlIHRoZSBpOTYwIGhhcyBjb21wbGV4IHJlbG9jYXRpb24KLQl0eXBlcywgQGZpbGV7Y29mZi1pOTYwLmN9IGFsc28gaW5jbHVkZXMgc29tZSBjb2RlIHRvCi0JbWFuaXB1bGF0ZSB0aGUgaTk2MCByZWxvY3MuICBUaGlzIGNvZGUgaXMgbm90IGluCi0JQGZpbGV7Y29mZmNvZGUuaH0gYmVjYXVzZSBpdCB3b3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIKLQl0YXJnZXQuCi0KLVNVQlNVQlNFQ1RJT04KLQlCaXQgdHdpZGRsaW5nCi0KLQlFYWNoIGZsYXZvdXIgb2YgY29mZiBzdXBwb3J0ZWQgaW4gQkZEIGhhcyBpdHMgb3duIGhlYWRlciBmaWxlCi0JZGVzY3JpYmluZyB0aGUgZXh0ZXJuYWwgbGF5b3V0IG9mIHRoZSBzdHJ1Y3R1cmVzLiBUaGVyZSBpcyBhbHNvCi0JYW4gaW50ZXJuYWwgZGVzY3JpcHRpb24gb2YgdGhlIGNvZmYgbGF5b3V0LCBpbgotCUBmaWxle2NvZmYvaW50ZXJuYWwuaH0uIEEgbWFqb3IgZnVuY3Rpb24gb2YgdGhlCi0JY29mZiBiYWNrZW5kIGlzIHN3YXBwaW5nIHRoZSBieXRlcyBhbmQgdHdpZGRsaW5nIHRoZSBiaXRzIHRvCi0JdHJhbnNsYXRlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSBzdHJ1Y3R1cmVzIGludG8gdGhlIG5vcm1hbAotCWludGVybmFsIGZvcm0uIFRoaXMgaXMgYWxsIHBlcmZvcm1lZCBpbiB0aGUKLQlAY29kZXtiZmRfc3dhcH1fQGl7dGhpbmd9X0Bpe2RpcmVjdGlvbn0gcm91dGluZXMuIFNvbWUKLQllbGVtZW50cyBhcmUgZGlmZmVyZW50IHNpemVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mCi0JY29mZjsgaXQgaXMgdGhlIGR1dHkgb2YgdGhlIGNvZmYgdmVyc2lvbiBzcGVjaWZpYyBpbmNsdWRlIGZpbGUKLQl0byBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbnMgb2YgdmFyaW91cyBwYWNraW5nIHJvdXRpbmVzIGluCi0JQGZpbGV7Y29mZmNvZGUuaH0uIEUuZy4sIHRoZSBzaXplIG9mIGxpbmUgbnVtYmVyIGVudHJ5IGluIGNvZmYgaXMKLQlzb21ldGltZXMgMTYgYml0cywgYW5kIHNvbWV0aW1lcyAzMiBiaXRzLiBAY29kZXsjZGVmaW5lfWluZwotCUBjb2Rle1BVVF9MTlNaX0xOTk99IGFuZCBAY29kZXtHRVRfTE5TWl9MTk5PfSB3aWxsIHNlbGVjdCB0aGUKLQljb3JyZWN0IG9uZS4gTm8gZG91YnQsIHNvbWUgZGF5IHNvbWVvbmUgd2lsbCBmaW5kIGEgdmVyc2lvbiBvZgotCWNvZmYgd2hpY2ggaGFzIGEgdmFyeWluZyBmaWVsZCBzaXplIG5vdCBjYXRlcmVkIHRvIGF0IHRoZQotCW1vbWVudC4gVG8gcG9ydCBCRkQsIHRoYXQgcGVyc29uIHdpbGwgaGF2ZSB0byBhZGQgbW9yZSBAY29kZXsjZGVmaW5lc30uCi0JVGhyZWUgb2YgdGhlIGJpdCB0d2lkZGxpbmcgcm91dGluZXMgYXJlIGV4cG9ydGVkIHRvCi0JQGNvZGV7Z2RifTsgQGNvZGV7Y29mZl9zd2FwX2F1eF9pbn0sIEBjb2Rle2NvZmZfc3dhcF9zeW1faW59Ci0JYW5kIEBjb2Rle2NvZmZfc3dhcF9saW5ub19pbn0uIEBjb2Rle0dEQn0gcmVhZHMgdGhlIHN5bWJvbAotCXRhYmxlIG9uIGl0cyBvd24sIGJ1dCB1c2VzIEJGRCB0byBmaXggdGhpbmdzIHVwLiAgTW9yZSBvZiB0aGUKLQliaXQgdHdpZGRsZXJzIGFyZSBleHBvcnRlZCBmb3IgQGNvZGV7Z2FzfTsKLQlAY29kZXtjb2ZmX3N3YXBfYXV4X291dH0sIEBjb2Rle2NvZmZfc3dhcF9zeW1fb3V0fSwKLQlAY29kZXtjb2ZmX3N3YXBfbGluZW5vX291dH0sIEBjb2Rle2NvZmZfc3dhcF9yZWxvY19vdXR9LAotCUBjb2Rle2NvZmZfc3dhcF9maWxlaGRyX291dH0sIEBjb2Rle2NvZmZfc3dhcF9hb3V0aGRyX291dH0sCi0JQGNvZGV7Y29mZl9zd2FwX3Njbmhkcl9vdXR9LiBAY29kZXtHYXN9IGN1cnJlbnRseSBrZWVwcyB0cmFjawotCW9mIGFsbCB0aGUgc3ltYm9sIHRhYmxlIGFuZCByZWxvYyBkcnVkZ2VyeSBpdHNlbGYsIHRoZXJlYnkKLQlzYXZpbmcgdGhlIGludGVybmFsIEJGRCBvdmVyaGVhZCwgYnV0IHVzZXMgQkZEIHRvIHN3YXAgdGhpbmdzCi0Jb24gdGhlIHdheSBvdXQsIG1ha2luZyBjcm9zcyBwb3J0cyBtdWNoIHNhZmVyLiAgRG9pbmcgc28gYWxzbwotCWFsbG93cyBCRkQgKGFuZCB0aHVzIHRoZSBsaW5rZXIpIHRvIHVzZSB0aGUgc2FtZSBoZWFkZXIgZmlsZXMKLQlhcyBAY29kZXtnYXN9LCB3aGljaCBtYWtlcyBvbmUgYXZlbnVlIHRvIGRpc2FzdGVyIGRpc2FwcGVhci4KLQotU1VCU1VCU0VDVElPTgotCVN5bWJvbCByZWFkaW5nCi0KLQlUaGUgc2ltcGxlIGNhbm9uaWNhbCBmb3JtIGZvciBzeW1ib2xzIHVzZWQgYnkgQkZEIGlzIG5vdCByaWNoCi0JZW5vdWdoIHRvIGtlZXAgYWxsIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gYSBjb2ZmIHN5bWJvbAotCXRhYmxlLiBUaGUgYmFjayBlbmQgZ2V0cyBhcm91bmQgdGhpcyBwcm9ibGVtIGJ5IGtlZXBpbmcgdGhlIG9yaWdpbmFsCi0Jc3ltYm9sIHRhYmxlIGFyb3VuZCwgImJlaGluZCB0aGUgc2NlbmVzIi4KLQotCVdoZW4gYSBzeW1ib2wgdGFibGUgaXMgcmVxdWVzdGVkICh0aHJvdWdoIGEgY2FsbCB0bwotCUBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifSksIGEgcmVxdWVzdCBnZXRzIHRocm91Z2ggdG8KLQlAY29kZXtjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYn0uIFRoaXMgcmVhZHMgdGhlIHN5bWJvbCB0YWJsZSBmcm9tCi0JdGhlIGNvZmYgZmlsZSBhbmQgc3dhcHMgYWxsIHRoZSBzdHJ1Y3R1cmVzIGluc2lkZSBpbnRvIHRoZQotCWludGVybmFsIGZvcm0uIEl0IGFsc28gZml4ZXMgdXAgYWxsIHRoZSBwb2ludGVycyBpbiB0aGUgdGFibGUKLQkocmVwcmVzZW50ZWQgaW4gdGhlIGZpbGUgYnkgb2Zmc2V0cyBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgaW4KLQl0aGUgdGFibGUpIGludG8gcGh5c2ljYWwgcG9pbnRlcnMgdG8gZWxlbWVudHMgaW4gdGhlIG5ldwotCWludGVybmFsIHRhYmxlLiBUaGlzIGludm9sdmVzIHNvbWUgd29yayBzaW5jZSB0aGUgbWVhbmluZ3Mgb2YKLQlmaWVsZHMgY2hhbmdlIGRlcGVuZGluZyB1cG9uIGNvbnRleHQ6IGEgZmllbGQgdGhhdCBpcyBhCi0JcG9pbnRlciB0byBhbm90aGVyIHN0cnVjdHVyZSBpbiB0aGUgc3ltYm9sIHRhYmxlIGF0IG9uZSBtb21lbnQKLQltYXkgYmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBzdHJ1Y3R1cmUgYXQgdGhlIG5leHQuICBBbm90aGVyCi0JcGFzcyBpcyBtYWRlIG92ZXIgdGhlIHRhYmxlLiBBbGwgc3ltYm9scyB3aGljaCBtYXJrIGZpbGUgbmFtZXMKLQkoPDxDX0ZJTEU+PiBzeW1ib2xzKSBhcmUgbW9kaWZpZWQgc28gdGhhdCB0aGUgaW50ZXJuYWwKLQlzdHJpbmcgcG9pbnRzIHRvIHRoZSB2YWx1ZSBpbiB0aGUgYXV4ZW50ICh0aGUgcmVhbCBmaWxlbmFtZSkKLQlyYXRoZXIgdGhhbiB0aGUgbm9ybWFsIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wKLQkoQGNvZGV7Ii5maWxlIn0pLgotCi0JQXQgdGhpcyB0aW1lIHRoZSBzeW1ib2wgbmFtZXMgYXJlIG1vdmVkIGFyb3VuZC4gQ29mZiBzdG9yZXMKLQlhbGwgc3ltYm9scyBsZXNzIHRoYW4gbmluZSBjaGFyYWN0ZXJzIGxvbmcgcGh5c2ljYWxseQotCXdpdGhpbiB0aGUgc3ltYm9sIHRhYmxlOyBsb25nZXIgc3RyaW5ncyBhcmUga2VwdCBhdCB0aGUgZW5kIG9mCi0JdGhlIGZpbGUgaW4gdGhlIHN0cmluZyAJdGFibGUuIFRoaXMgcGFzcyBtb3ZlcyBhbGwgc3RyaW5ncwotCWludG8gbWVtb3J5IGFuZCByZXBsYWNlcyB0aGVtIHdpdGggcG9pbnRlcnMgdG8gdGhlIHN0cmluZ3MuCi0KLQotCVRoZSBzeW1ib2wgdGFibGUgaXMgbWFzc2FnZWQgb25jZSBhZ2FpbiwgdGhpcyB0aW1lIHRvIGNyZWF0ZQotCXRoZSBjYW5vbmljYWwgdGFibGUgdXNlZCBieSB0aGUgQkZEIGFwcGxpY2F0aW9uLiBFYWNoIHN5bWJvbAotCWlzIGluc3BlY3RlZCBpbiB0dXJuLCBhbmQgYSBkZWNpc2lvbiBtYWRlICh1c2luZyB0aGUKLQlAY29kZXtzY2xhc3N9IGZpZWxkKSBhYm91dCB0aGUgdmFyaW91cyBmbGFncyB0byBzZXQgaW4gdGhlCi0JQGNvZGV7YXN5bWJvbH0uICBAeHJlZntTeW1ib2xzfS4gVGhlIGdlbmVyYXRlZCBjYW5vbmljYWwgdGFibGUKLQlzaGFyZXMgc3RyaW5ncyB3aXRoIHRoZSBoaWRkZW4gaW50ZXJuYWwgc3ltYm9sIHRhYmxlLgotCi0JQW55IGxpbmVudW1iZXJzIGFyZSByZWFkIGZyb20gdGhlIGNvZmYgZmlsZSB0b28sIGFuZCBhdHRhY2hlZAotCXRvIHRoZSBzeW1ib2xzIHdoaWNoIG93biB0aGUgZnVuY3Rpb25zIHRoZSBsaW5lbnVtYmVycyBiZWxvbmcgdG8uCi0KLVNVQlNVQlNFQ1RJT04KLQlTeW1ib2wgd3JpdGluZwotCi0JV3JpdGluZyBhIHN5bWJvbCB0byBhIGNvZmYgZmlsZSB3aGljaCBkaWRuJ3QgY29tZSBmcm9tIGEgY29mZgotCWZpbGUgd2lsbCBsb3NlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoZSBAY29kZXthc3ltYm9sfQotCXN0cnVjdHVyZSByZW1lbWJlcnMgdGhlIEJGRCBmcm9tIHdoaWNoIHRoZSBzeW1ib2wgd2FzIHRha2VuLCBhbmQgb24KLQlvdXRwdXQgdGhlIGJhY2sgZW5kIG1ha2VzIHN1cmUgdGhhdCB0aGUgc2FtZSBkZXN0aW5hdGlvbiB0YXJnZXQgYXMKLQlzb3VyY2UgdGFyZ2V0IGlzIHByZXNlbnQuCi0KLQlXaGVuIHRoZSBzeW1ib2xzIGhhdmUgY29tZSBmcm9tIGEgY29mZiBmaWxlIHRoZW4gYWxsIHRoZQotCWRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcmVzZXJ2ZWQuCi0KLQlTeW1ib2wgdGFibGVzIGFyZSBwcm92aWRlZCBmb3Igd3JpdGluZyB0byB0aGUgYmFjayBlbmQgaW4gYQotCXZlY3RvciBvZiBwb2ludGVycyB0byBwb2ludGVycy4gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIGxpa2UKLQl0aGUgbGlua2VyIHRvIGFjY3VtdWxhdGUgYW5kIG91dHB1dCBsYXJnZSBzeW1ib2wgdGFibGVzCi0Jd2l0aG91dCBoYXZpbmcgdG8gZG8gdG9vIG11Y2ggYnl0ZSBjb3B5aW5nLgotCi0JVGhpcyBmdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIHByb3ZpZGVkIHN5bWJvbCB0YWJsZSBhbmQKLQlwYXRjaGVzIGVhY2ggc3ltYm9sIG1hcmtlZCBhcyBhIGZpbGUgcGxhY2UgaG9sZGVyCi0JKEBjb2Rle0NfRklMRX0pIHRvIHBvaW50IHRvIHRoZSBuZXh0IGZpbGUgcGxhY2UgaG9sZGVyIGluIHRoZQotCWxpc3QuIEl0IGFsc28gbWFya3MgZWFjaCBAY29kZXtvZmZzZXR9IGZpZWxkIGluIHRoZSBsaXN0IHdpdGgKLQl0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IHN5bWJvbCBvZiB0aGUgY3VycmVudCBzeW1ib2wuCi0KLQlBbm90aGVyIGZ1bmN0aW9uIG9mIHRoaXMgcHJvY2VkdXJlIGlzIHRvIHR1cm4gdGhlIGNhbm9uaWNhbAotCXZhbHVlIGZvcm0gb2YgQkZEIGludG8gdGhlIGZvcm0gdXNlZCBieSBjb2ZmLiBJbnRlcm5hbGx5LCBCRkQKLQlleHBlY3RzIHN5bWJvbCB2YWx1ZXMgdG8gYmUgb2Zmc2V0cyBmcm9tIGEgc2VjdGlvbiBiYXNlOyBzbyBhCi0Jc3ltYm9sIHBoeXNpY2FsbHkgYXQgMHgxMjAsIGJ1dCBpbiBhIHNlY3Rpb24gc3RhcnRpbmcgYXQKLQkweDEwMCwgd291bGQgaGF2ZSB0aGUgdmFsdWUgMHgyMC4gQ29mZiBleHBlY3RzIHN5bWJvbHMgdG8KLQljb250YWluIHRoZWlyIGZpbmFsIHZhbHVlLCBzbyBzeW1ib2xzIGhhdmUgdGhlaXIgdmFsdWVzCi0JY2hhbmdlZCBhdCB0aGlzIHBvaW50IHRvIHJlZmxlY3QgdGhlaXIgc3VtIHdpdGggdGhlaXIgb3duaW5nCi0Jc2VjdGlvbi4gIFRoaXMgdHJhbnNmb3JtYXRpb24gdXNlcyB0aGUKLQk8PG91dHB1dF9zZWN0aW9uPj4gZmllbGQgb2YgdGhlIEBjb2Rle2FzeW1ib2x9J3MKLQlAY29kZXthc2VjdGlvbn0gQHhyZWZ7U2VjdGlvbnN9LgotCi0JbyA8PGNvZmZfbWFuZ2xlX3N5bWJvbHM+PgotCi0JVGhpcyByb3V0aW5lIHJ1bnMgdGhvdWdoIHRoZSBwcm92aWRlZCBzeW1ib2wgdGFibGUgYW5kIHVzZXMKLQl0aGUgb2Zmc2V0cyBnZW5lcmF0ZWQgYnkgdGhlIHByZXZpb3VzIHBhc3MgYW5kIHRoZSBwb2ludGVycwotCWdlbmVyYXRlZCB3aGVuIHRoZSBzeW1ib2wgdGFibGUgd2FzIHJlYWQgaW4gdG8gY3JlYXRlIHRoZQotCXN0cnVjdHVyZWQgaGllcmFjaHkgcmVxdWlyZWQgYnkgY29mZi4gSXQgY2hhbmdlcyBlYWNoIHBvaW50ZXIKLQl0byBhIHN5bWJvbCBpbnRvIHRoZSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIGFzeW1ib2wuCi0KLQlvIDw8Y29mZl93cml0ZV9zeW1ib2xzPj4KLQotCVRoaXMgcm91dGluZSBydW5zIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhbmQgcGF0Y2hlcyB1cCB0aGUKLQlzeW1ib2xzIGZyb20gdGhlaXIgaW50ZXJuYWwgZm9ybSBpbnRvIHRoZSBjb2ZmIHdheSwgY2FsbHMgdGhlCi0JYml0IHR3aWRkbGVycywgYW5kIHdyaXRlcyBvdXQgdGhlIHRhYmxlIHRvIHRoZSBmaWxlLgotCi0qLwotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWNvZmZfc3ltYm9sX3R5cGUKLQotREVTQ1JJUFRJT04KLQlUaGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciBhbiA8PGFzeW1ib2w+PiBpcyBkZXNjcmliZWQgaW4gYQotCTw8Y29tYmluZWRfZW50cnlfdHlwZT4+OgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0Ci0uewotLgotLiAgICAgICB7KiBSZW1lbWJlcnMgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIGZpbGUgZm9yCi0uICAgICAgICAgIHRoaXMgc3ltYm9sLiBHZW5lcmF0ZWQgYnkgY29mZl9yZW51bWJlcl9zeW1ib2xzLiAqfQotLnVuc2lnbmVkIGludCBvZmZzZXQ7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4gIFVzZWQgZm9yCi0uICAgICAgICAgIFhDT0ZGIENfQlNUQVQgc3ltYm9scy4gIFNldCBieSBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICp9Ci0udW5zaWduZWQgaW50IGZpeF92YWx1ZSA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgdGFnIGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0uICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKn0KLS51bnNpZ25lZCBpbnQgZml4X3RhZyA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgZW5kaWR4IGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0uICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKn0KLS51bnNpZ25lZCBpbnQgZml4X2VuZCA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgeF9jc2VjdC54X3NjbmxlbiBmaWVsZCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF9zY25sZW4gOiAxOwotLgotLiAgICAgICB7KiBGaXggdXAgYW4gWENPRkYgQ19CSU5DTC9DX0VJTkNMIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUKLS4gICAgICAgICAgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIFNldCBieQotLiAgICAgICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICp9Ci0udW5zaWduZWQgaW50IGZpeF9saW5lIDogMTsKLS4KLS4gICAgICAgeyogVGhlIGNvbnRhaW5lciBmb3IgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgcmVhZCBhbmQgdHJhbnNsYXRlZAotLiAgICAgICAgICAgZnJvbSB0aGUgZmlsZS4gKn0KLS4KLS51bmlvbiB7Ci0uICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eGVudDsKLS4gICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLS4gfSB1OwotLn0gY29tYmluZWRfZW50cnlfdHlwZTsKLS4KLS4KLS57KiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXM6ICp9Ci0uCi0udHlwZWRlZiBzdHJ1Y3QgY29mZl9zeW1ib2xfc3RydWN0Ci0uewotLiAgIHsqIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICp9Ci0uYXN5bWJvbCBzeW1ib2w7Ci0uCi0uICAgeyogQSBwb2ludGVyIHRvIHRoZSBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICp9Ci0uY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotLgotLiAgIHsqIEEgcG9pbnRlciB0byB0aGUgbGluZW51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKn0KLS5zdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsaW5lbm87Ci0uCi0uICAgeyogSGF2ZSB0aGUgbGluZSBudW1iZXJzIGJlZW4gcmVsb2NhdGVkIHlldCA/ICp9Ci0uYm9vbGVhbiBkb25lX2xpbmVubzsKLS59IGNvZmZfc3ltYm9sX3R5cGU7Ci0KLQotKi8KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2luY2x1ZGUgInBlaWNvZGUuaCIKLSNlbHNlCi0jaW5jbHVkZSAiY29mZnN3YXAuaCIKLSNlbmRpZgotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLXN0YXRpYyBsb25nIHNlY190b19zdHlwX2ZsYWdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBmbGFnd29yZCBzdHlwX3RvX3NlY19mbGFncyBQQVJBTVMgKChiZmQgKiwgUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBzaG9ydCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgUFRSIGJ1eV9hbmRfcmVhZCBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGludCwgc2l6ZV90KSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX2xpbmVfdGFibGUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgbG9uZyBjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotI2lmbmRlZiBjb2ZmX21rb2JqZWN0X2hvb2sKLXN0YXRpYyBQVFIgY29mZl9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIsICBQVFIpKTsKLSNlbmRpZgotDAotLyogdm9pZCB3YXJuaW5nKCk7ICovCi0KLS8qCi0gKiBSZXR1cm4gYSB3b3JkIHdpdGggU1RZUF8qIChzY25oZHIuc19mbGFncykgZmxhZ3Mgc2V0IHRvIHJlcHJlc2VudCB0aGUKLSAqIGluY29taW5nIFNFQ18qIGZsYWdzLiAgVGhlIGludmVyc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBzdHlwX3RvX3NlY19mbGFncygpLgotICogTk9URTogSWYgeW91IGFkZCB0by9jaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3Ugc2hvdWxkIG1pcnJvciB0aGUgY2hhbmdlcwotICogCWluIHN0eXBfdG9fc2VjX2ZsYWdzKCkuCi0gKi8KLXN0YXRpYyBsb25nCi1zZWNfdG9fc3R5cF9mbGFncyAoc2VjX25hbWUsIHNlY19mbGFncykKLSAgICAgQ09OU1QgY2hhciAqc2VjX25hbWU7Ci0gICAgIGZsYWd3b3JkIHNlY19mbGFnczsKLXsKLSAgbG9uZyBzdHlwX2ZsYWdzID0gMDsKLQotICBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9URVhUKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9URVhUOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9EQVRBKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9CU1MpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0JTUzsKLSNpZmRlZiBfQ09NTUVOVAotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9DT01NRU5UKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotI2VuZGlmIC8qIF9DT01NRU5UICovCi0jaWZkZWYgX0xJQgotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MSUIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xJQjsKLSNlbmRpZiAvKiBfTElCICovCi0jaWZkZWYgX0xJVAotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MSVQpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xJVDsKLSNlbmRpZiAvKiBfTElUICovCi0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgIi5kZWJ1ZyIpKQotICAgIHsKLSNpZmRlZiBTVFlQX0RFQlVHCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9ERUJVRzsKLSNlbHNlCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmICghc3RybmNtcCAoc2VjX25hbWUsICIuc3RhYiIsIDUpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0lORk87Ci0gICAgfQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgIi5lZGF0YSIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0RBVEE7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfUEFEKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9QQUQ7Ci0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0xPQURFUikpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTE9BREVSOwotICAgIH0KLSNlbmRpZgotICAvKiBUcnkgYW5kIGZpZ3VyZSBvdXQgd2hhdCBpdCBzaG91bGQgYmUgKi8KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX0NPREUpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19EQVRBKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0RBVEE7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfUkVBRE9OTFkpCi0gICAgewotI2lmZGVmIFNUWVBfTElUCQkJLyogMjlrIHJlYWRvbmx5IHRleHQvZGF0YSBzZWN0aW9uICovCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MSVQ7Ci0jZWxzZQotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSNlbmRpZiAvKiBTVFlQX0xJVCAqLwotICAgIH0KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX0xPQUQpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19BTExPQykKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9CU1M7Ci0gICAgfQotCi0jaWZkZWYgU1RZUF9OT0xPQUQKLSAgaWYgKChzZWNfZmxhZ3MgJiAoU0VDX05FVkVSX0xPQUQgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBTVFlQX05PTE9BRDsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIGlmIChzZWNfZmxhZ3MgJiBTRUNfTElOS19PTkNFKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19DT01EQVQ7Ci0jZW5kaWYKLQotICByZXR1cm4gKHN0eXBfZmxhZ3MpOwotfQotLyoKLSAqIFJldHVybiBhIHdvcmQgd2l0aCBTRUNfKiBmbGFncyBzZXQgdG8gcmVwcmVzZW50IHRoZSBpbmNvbWluZwotICogU1RZUF8qIGZsYWdzIChmcm9tIHNjbmhkci5zX2ZsYWdzKS4gICBUaGUgaW52ZXJzZSBvZiB0aGlzCi0gKiBmdW5jdGlvbiBpcyBzZWNfdG9fc3R5cF9mbGFncygpLgotICogTk9URTogSWYgeW91IGFkZCB0by9jaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3Ugc2hvdWxkIG1pcnJvciB0aGUgY2hhbmdlcwotICogICAgICBpbiBzZWNfdG9fc3R5cF9mbGFncygpLgotICovCi1zdGF0aWMgZmxhZ3dvcmQKLXN0eXBfdG9fc2VjX2ZsYWdzIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGhkcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaW50ZXJuYWxfcyA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGhkcjsKLSAgbG9uZyBzdHlwX2ZsYWdzID0gaW50ZXJuYWxfcy0+c19mbGFnczsKLSAgZmxhZ3dvcmQgc2VjX2ZsYWdzID0gMDsKLQotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9OT0xPQUQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX05PTE9BRCAqLwotCi0gIC8qIEZvciAzODYgQ09GRiwgYXQgbGVhc3QsIGFuIHVubG9hZGFibGUgdGV4dCBvciBkYXRhIHNlY3Rpb24gaXMKLSAgICAgYWN0dWFsbHkgYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX1RFWFQpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9CU1MpCi0gICAgewotI2lmZGVmIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfSU5GTykKLSAgICB7Ci0gICAgICAvKiBXZSBtYXJrIHRoZXNlIGFzIFNFQ19ERUJVR0dJTkcsIGJ1dCBvbmx5IGlmIENPRkZfUEFHRV9TSVpFIGlzCi0JIGRlZmluZWQuICBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyB1c2VzCi0JIENPRkZfUEFHRV9TSVpFIHRvIGVuc3VyZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUKLQkgc2VjdGlvbiBWTUEgYW5kIHRoZSBmaWxlIG9mZnNldCBtYXRjaC4gIElmIHdlIGRvbid0IGtub3cKLQkgQ09GRl9QQUdFX1NJWkUsIHdlIGNhbid0IGVuc3VyZSB0aGUgY29ycmVjdCBjb3JyZXNwb25kZW5jZSwKLQkgYW5kIGRlbWFuZCBwYWdlIGxvYWRpbmcgb2YgdGhlIGZpbGUgd2lsbCBmYWlsLiAgKi8KLSNpZiBkZWZpbmVkIChDT0ZGX1BBR0VfU0laRSkgJiYgIWRlZmluZWQgKENPRkZfQUxJR05fSU5fU19GTEFHUykKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9QQUQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfREFUQSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0gICAgewotI2lmZGVmIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRlYnVnIikgPT0gMAotI2lmZGVmIF9DT01NRU5UCi0JICAgfHwgc3RyY21wIChuYW1lLCBfQ09NTUVOVCkgPT0gMAotI2VuZGlmCi0JICAgfHwgc3RybmNtcCAobmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICB7Ci0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotI2VuZGlmCi0gICAgfQotI2lmZGVmIF9MSUIKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElCKSA9PSAwKQotICAgIDsKLSNlbmRpZgotI2lmZGVmIF9MSVQKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUKSA9PSAwKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZOwotICAgIH0KLSNlbmRpZgotICBlbHNlCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgIH0KLQotI2lmZGVmIFNUWVBfTElUCQkJLyogQTI5ayByZWFkb25seSB0ZXh0L2RhdGEgc2VjdGlvbiB0eXBlICovCi0gIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfTElUKSA9PSBTVFlQX0xJVCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSAoU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFkpOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX0xJVCAqLwotI2lmZGVmIFNUWVBfT1RIRVJfTE9BRAkJLyogT3RoZXIgbG9hZGVkIHNlY3Rpb25zICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9PVEhFUl9MT0FEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IChTRUNfTE9BRCB8IFNFQ19BTExPQyk7Ci0gICAgfQotI2VuZGlmIC8qIFNUWVBfU0RBVEEgKi8KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9MTktfUkVNT1ZFKQotICAgIHNlY19mbGFncyB8PSBTRUNfRVhDTFVERTsKLQotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9MTktfQ09NREFUKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19PTkNFOwotCi0gICAgICAvKiBVbmZvcnR1bmF0ZWx5LCB0aGUgUEUgZm9ybWF0IHN0b3JlcyBlc3NlbnRpYWwgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgIHRoZSBzeW1ib2wgdGFibGUsIG9mIGFsbCBwbGFjZXMuICBXZSBuZWVkIHRvIGV4dHJhY3QgdGhhdAotICAgICAgICAgaW5mb3JtYXRpb24gbm93LCBzbyB0aGF0IG9iamR1bXAgYW5kIHRoZSBsaW5rZXIgd2lsbCBrbm93IGhvdwotICAgICAgICAgdG8gaGFuZGxlIHRoZSBzZWN0aW9uIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdGhlIHN5bWJvbHMuICBXZQotICAgICAgICAgY2FuJ3QgY2FsbCBzbHVycF9zeW10YWIsIGJlY2F1c2UgdGhlIGxpbmtlciBkb2Vzbid0IHdhbnQgdGhlCi0gICAgICAgICBzd2FwcGVkIHN5bWJvbHMuICAqLwotCi0gICAgICAvKiBDT01EQVQgc2VjdGlvbnMgYXJlIHNwZWNpYWwuICBUaGUgZmlyc3Qgc3ltYm9sIGlzIHRoZSBzZWN0aW9uCi0JIHN5bWJvbCwgd2hpY2ggdGVsbHMgd2hhdCBraW5kIG9mIENPTURBVCBzZWN0aW9uIGl0IGlzLiAgVGhlCi0JICpzZWNvbmQqIHN5bWJvbCBpcyB0aGUgImNvbWRhdCBzeW1ib2wiIC0gdGhlIG9uZSB3aXRoIHRoZQotCSB1bmlxdWUgbmFtZS4gIEdOVSB1c2VzIHRoZSBzZWN0aW9uIHN5bWJvbCBmb3IgdGhlIHVuaXF1ZQotCSBuYW1lOyBNUyB1c2VzICIudGV4dCIgZm9yIGV2ZXJ5IGNvbWRhdCBzZWN0aW9uLiAgU2lnaC4gIC0gREogKi8KLQotICAgICAgaWYgKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0JewotCSAgYmZkX2J5dGUgKmVzeW0sICplc3ltZW5kOwotCi0JICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCSAgZXN5bWVuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBTWU1FU1o7Ci0KLQkgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmaXN5bSk7Ci0KLQkgICAgICBpZiAoc2l6ZW9mIChpbnRlcm5hbF9zLT5zX25hbWUpID4gU1lNTk1MRU4pCi0JCXsKLQkJICAvKiBUaGlzIGNhc2UgaW1wbGllcyB0aGF0IHRoZSBtYXRjaGluZyBzeW1ib2wgbmFtZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19TVEFUCi0JCSAgJiYgaXN5bS5uX3R5cGUgPT0gVF9OVUxMCi0JCSAgJiYgaXN5bS5uX251bWF1eCA9PSAxKQotCQl7Ci0JCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkJICBjb25zdCBjaGFyICpzeW1uYW1lOwotCi0JCSAgc3ltbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJmlzeW0sIGJ1Zik7Ci0JCSAgaWYgKHN5bW5hbWUgPT0gTlVMTCkKLQkJICAgIGFib3J0ICgpOwotCi0JCSAgaWYgKHN0cmNtcCAobmFtZSwgc3ltbmFtZSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCQkgICAgICAvKiBUaGlzIGlzIHRoZSBzZWN0aW9uIHN5bWJvbC4gICovCi0KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIChQVFIpIChlc3ltICsgU1lNRVNaKSwKLQkJCQkJICAgIGlzeW0ubl90eXBlLCBpc3ltLm5fc2NsYXNzLAotCQkJCQkgICAgMCwgaXN5bS5uX251bWF1eCwgKFBUUikgJmF1eCk7Ci0KLQkJICAgICAgLyogRklYTUU6IE1pY3Jvc29mdCB1c2VzIE5PRFVQTElDQVRFUyBhbmQKLQkJCSBBU1NPQ0lBVElWRSwgYnV0IGdudSB1c2VzIEFOWSBhbmQgU0FNRV9TSVpFLgotCQkJIFVuZm9ydHVuYXRlbHksIGdudSBkb2Vzbid0IGRvIHRoZSBjb21kYXQKLQkJCSBzeW1ib2xzIHJpZ2h0LiAgU28sIHVudGlsIHdlIGNhbiBmaXggaXQgdG8gZG8KLQkJCSB0aGUgcmlnaHQgdGhpbmcsIHdlIGFyZSB0ZW1wb3JhcmlseSBkaXNhYmxpbmcKLQkJCSBjb21kYXRzIGZvciB0aGUgTVMgdHlwZXMgKHRoZXkncmUgdXNlZCBpbgotCQkJIERMTHMgYW5kIEMrKywgYnV0IHdlIGRvbid0IHN1cHBvcnQgKnRoZWlyKgotCQkJIEMrKyBsaWJyYXJpZXMgYW55d2F5IC0gREogKi8KLQotCQkgICAgICBzd2l0Y2ggKGF1eC54X3Njbi54X2NvbWRhdCkKLQkJCXsKLQkJCWNhc2UgSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVM6Ci0jaWYgMAotCQkJICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWTsKLSNlbHNlCi0JCQkgIHNlY19mbGFncyAmPSB+U0VDX0xJTktfT05DRTsKLSNlbmRpZgotCQkJICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCWNhc2UgSU1BR0VfQ09NREFUX1NFTEVDVF9BTlk6Ci0JCQkgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0JCQkgIGJyZWFrOwotCi0JCQljYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFOgotCQkJICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU7Ci0JCQkgIGJyZWFrOwotCi0JCQljYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g6Ci0JCQkgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFM7Ci0JCQkgIGJyZWFrOwotCi0JCQljYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkU6Ci0jaWYgMAotCQkJICAvKiBGSVhNRTogVGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAgKi8KLQkJCSAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLSNlbHNlCi0JCQkgIHNlY19mbGFncyAmPSB+U0VDX0xJTktfT05DRTsKLSNlbmRpZgotCQkJICBicmVhazsKLQkJCX0KLQotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZXN5bSArPSAoaXN5bS5uX251bWF1eCArIDEpICogU1lNRVNaOwotCSAgICB9Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiAoc2VjX2ZsYWdzKTsKLX0KLQotI2RlZmluZQlnZXRfaW5kZXgoc3ltYm9sKQkoKHN5bWJvbCktPnVkYXRhLmkpCi0KLS8qCi1JTlRFUk5BTF9ERUZJTklUSU9OCi0JYmZkX2NvZmZfYmFja2VuZF9kYXRhCi0KLUNPREVfRlJBR01FTlQKLQotU3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIGdkYiB0byBzd2FwIGluIGNvZmYgc3ltYm9sIHRhYmxlIHBhcnRzOgotLnR5cGVkZWYgc3RydWN0Ci0uewotLiAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX2F1eF9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotLiAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKLS4gICAgICAgaW50ICAgICAgICAgICAgIGNsYXNzLAotLiAgICAgICBpbnQgICAgICAgICAgICAgaW5kYXV4LAotLiAgICAgICBpbnQgICAgICAgICAgICAgbnVtYXV4LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zeW1faW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCAsCi0uICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotLgotLiAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgICAgICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotLgotCi1TcGVjaWFsIGVudHJ5IHBvaW50cyBmb3IgZ2FzIHRvIHN3YXAgb3V0IGNvZmYgcGFydHM6Ci0KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgIAkqYWJmZCwKLS4gICAgICAgUFRSCWluLAotLiAgICAgICBpbnQgICAgCXR5cGUsCi0uICAgICAgIGludCAgICAJY2xhc3MsCi0uICAgICAgIGludCAgICAgaW5kYXV4LAotLiAgICAgICBpbnQgICAgIG51bWF1eCwKLS4gICAgICAgUFRSICAgIAlleHQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgUEFSQU1TICgoCi0uICAgICAgYmZkICAgICAgKmFiZmQsCi0uICAgICAgUFRSCWluLAotLiAgICAgIFBUUglleHQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgUEFSQU1TICgoCi0uICAgICAgCWJmZCAgIAkqYWJmZCwKLS4gICAgICAJUFRSCWluLAotLglQVFIJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgUEFSQU1TICgoCi0uICAgICAgCWJmZCAgICAgKmFiZmQsCi0uICAgICAJUFRSCXNyYywKLS4JUFRSCWRzdCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgUEFSQU1TICgoCi0uICAgICAgCWJmZCAgCSphYmZkLAotLglQVFIgCWluLAotLglQVFIgCW91dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgUEFSQU1TICgoCi0uICAgICAgCWJmZCAJKmFiZmQsCi0uCVBUUiAJaW4sCi0uCVBUUglvdXQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgUEFSQU1TICgoCi0uICAgICAgCWJmZCAgCSphYmZkLAotLiAgICAgIAlQVFIJaW4sCi0uCVBUUglvdXQpKTsKLS4KLQotU3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIGdlbmVyaWMgQ09GRiByb3V0aW5lcyB0byBjYWxsIHRhcmdldAotZGVwZW5kZW50IENPRkYgcm91dGluZXM6Ci0KLS4gdW5zaWduZWQgaW50IF9iZmRfZmlsaHN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9hb3V0c3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX3NjbmhzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfc3ltZXN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9hdXhlc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX3JlbHN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9saW5lc3o7Ci0uIGJvb2xlYW4gX2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzOwotLiBib29sZWFuIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXM7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcjsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotLiBQVFIgKCpfYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkciwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9hb3V0aGRyKSk7Ci0uIGZsYWd3b3JkICgqX2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIsCi0uICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpKTsKLS4gdm9pZCAoKl9iZmRfc2V0X2FsaWdubWVudF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgYXNlY3Rpb24gKnNlYywKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIpKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCwKLS4gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4KSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfcHJpbnRfYXV4KSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBGSUxFICpmaWxlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCwKLS4gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCkpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0uICAgICAgIGFyZWxlbnQgKnJlbG9jLAotLiAgICAgICBiZmRfYnl0ZSAqZGF0YSwKLS4gICAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyLAotLiAgICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIpKTsKLS4gaW50ICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICBhcmVsZW50ICpyLAotLiAgICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3ltX2lzX2dsb2JhbCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICpvdXRwdXRfYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLS4gICAgICAgYmZkICppbnB1dF9iZmQsCi0uICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zLAotLiAgICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zKSk7Ci0uIHJlbG9jX2hvd3RvX3R5cGUgKigqX2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBhc2VjdGlvbiAqc2VjLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwKLS4gICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0sCi0uICAgICAgIGJmZF92bWEgKmFkZGVuZHApKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICpvYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLS4gICAgICAgYmZkICppYmZkLAotLiAgICAgICBhc2VjdGlvbiAqc2VjLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jLAotLiAgICAgICBib29sZWFuICphZGp1c3RlZHApKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKCgKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLS4gICAgICAgZmxhZ3dvcmQgZmxhZ3MsIAotLiAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLS4gICAgICAgYmZkX3ZtYSB2YWx1ZSwKLS4gICAgICAgY29uc3QgY2hhciAqc3RyaW5nLAotLiAgICAgICBib29sZWFuIGNvcHksCi0uICAgICAgIGJvb2xlYW4gY29sbGVjdCwgCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHApKTsKLS4KLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIFBBUkFNUyAoKAotLgliZmQgKiBhYmZkLAotLiAgICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIFBBUkFNUyAoKAotLgliZmQgKiBhYmZkLAotLglzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8pKTsKLS4KLS59IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YTsKLS4KLS4jZGVmaW5lIGNvZmZfYmFja2VuZF9pbmZvKGFiZmQpICgoYmZkX2NvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfaW4oYSxlLHQsYyxpbmQsbnVtLGkpIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfaW4pIChhLGUsdCxjLGluZCxudW0saSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9pbihhLGUsaSkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX3N5bV9pbikgKGEsZSxpKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luKGEsZSxpKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvICggYSktPl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgKGEsZSxpKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KGFiZmQsIGksIG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dChhYmZkLCBpLCBvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfb3V0KGEsaSx0LGMsaW5kLG51bSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgKGEsaSx0LGMsaW5kLG51bSxvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfZmlsaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfZmlsaHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfYW91dHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYW91dHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfc2NuaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2NuaHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfc3ltZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc3ltZXN6KQotLiNkZWZpbmUgYmZkX2NvZmZfYXV4ZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYXV4ZXN6KQotLiNkZWZpbmUgYmZkX2NvZmZfcmVsc3ooYWJmZCkgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfcmVsc3opCi0uI2RlZmluZSBiZmRfY29mZl9saW5lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9saW5lc3opCi0uI2RlZmluZSBiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyhhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMpCi0uI2RlZmluZSBiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMoYWJmZCkgXAotLiAgICAgICAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcykKLS4jZGVmaW5lIGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIoYWJmZCkgXAotLgkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4oYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19pbihhYmZkLCBpLCBvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vayhhYmZkLCBmaWxlaGRyKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKGFiZmQsIGZpbGVoZHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX21rb2JqZWN0X2hvb2soYWJmZCwgZmlsZWhkciwgYW91dGhkcilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2soYWJmZCwgc2NuaGRyLCBuYW1lKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spIChhYmZkLCBzY25oZHIsIG5hbWUpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc2V0X2FsaWdubWVudF9ob29rKGFiZmQsIHNlYywgc2NuaGRyKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgKGFiZmQsIHNlYywgc2NuaGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZShhYmZkKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKGFiZmQsIHN5bSlcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIChhYmZkLCBzeW0pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfcHJpbnRfYXV4KGFiZmQsIGZpbGUsIGJhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wcmludF9hdXgpXAotLiAgICAgICAgIChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpXAotLiAgICAgICAgIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSlcCi0uICAgICAgICAgKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zeW1faXNfZ2xvYmFsKGFiZmQsIHN5bSlcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwpXAotLiAgICAgICAgIChhYmZkLCBzeW0pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKGFiZmQpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpXAotLiAgICAgICAgIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsob2JmZCwgaW5mbylcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChvYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspXAotLiAgICAgICAgIChvYmZkLCBpbmZvKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24ob2JmZCxpbmZvLGliZmQsbyxjb24scmVsLGlzeW1zLHNlY3MpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoaWJmZCktPl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKVwKLS4gICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgbywgY29uLCByZWwsIGlzeW1zLCBzZWNzKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ydHlwZV90b19ob3d0bylcCi0uICAgICAgICAgKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApKQotLiNkZWZpbmUgYmZkX2NvZmZfYWRqdXN0X3N5bW5keChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfYWRqdXN0X3N5bW5keClcCi0uICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIHNlYywgcmVsLCBhZGp1c3RlZHApKQotLiNkZWZpbmUgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbChpbmZvLGFiZmQsbmFtZSxmbGFncyxzZWN0aW9uLHZhbHVlLHN0cmluZyxjcCxjb2xsLGhhc2hwKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbClcCi0uICAgICAgICAgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLCBjcCwgY29sbCwgaGFzaHApKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKGEscCkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIChhLHApKQotLiNkZWZpbmUgYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KGEscCkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIChhLHApKQotLgotKi8KLQotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKiBhYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBpZiAoQkFETUFHICgqaW50ZXJuYWxfZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGlmIHRoZSBvcHRpb25hbCBoZWFkZXIgaXMgTlVMTCBvciBub3QgdGhlIGNvcnJlY3Qgc2l6ZSB0aGVuCi0gICAgIHF1aXQ7IHRoZSBvbmx5IGRpZmZlcmVuY2UgSSBjYW4gc2VlIGJldHdlZW4gbTg4ayBkZ3V4IGhlYWRlcnMgKE1DODhETUFHSUMpCi0gICAgIGFuZCBJbnRlbCA5NjAgcmVhZHdyaXRlIGhlYWRlcnMgKEk5NjBXUk1BR0lDKSBpcyB0aGF0IHRoZQotICAgICBvcHRpb25hbCBoZWFkZXIgaXMgb2YgYSBkaWZmZXJlbnQgc2l6ZS4KLQotICAgICBCdXQgdGhlIG1pcHMga2VlcHMgZXh0cmEgc3R1ZmYgaW4gaXQncyBvcHRoZHIsIHNvIGRvbnQgY2hlY2sKLSAgICAgd2hlbiBkb2luZyB0aGF0Ci0gICAgICovCi0KLSNpZiBkZWZpbmVkKE04OCkgfHwgZGVmaW5lZChJOTYwKQotICBpZiAoaW50ZXJuYWxfZi0+Zl9vcHRoZHIgIT0gMCAmJiBBT1VUU1ogIT0gaW50ZXJuYWxfZi0+Zl9vcHRoZHIpCi0gICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gICBpbml0aWFsaXplIGEgc2VjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBwZWN1bGlhciB0byB0aGlzCi0gICBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGNvZmYKLSovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotCi0gIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUjsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPnRleHRfYWxpZ25fcG93ZXIgIT0gMAotICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbiksICIudGV4dCIpID09IDApCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geGNvZmZfZGF0YSAoYWJmZCktPnRleHRfYWxpZ25fcG93ZXI7Ci0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZGF0YV9hbGlnbl9wb3dlciAhPSAwCi0gICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKSwgIi5kYXRhIikgPT0gMCkKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB4Y29mZl9kYXRhIChhYmZkKS0+ZGF0YV9hbGlnbl9wb3dlcjsKLSNlbmRpZgotCi0gIC8qIEFsbG9jYXRlIGF1eCByZWNvcmRzIGZvciBzZWN0aW9uIHN5bWJvbHMsIHRvIHN0b3JlIHNpemUgYW5kCi0gICAgIHJlbGF0ZWQgaW5mby4KLQotICAgICBAQCBUaGUgMTAgaXMgYSBndWVzcyBhdCBhIHBsYXVzaWJsZSBtYXhpbXVtIG51bWJlciBvZiBhdXggZW50cmllcwotICAgICAoYnV0IHNob3VsZG4ndCBiZSBhIGNvbnN0YW50KS4gICovCi0gIG5hdGl2ZSA9ICgoY29tYmluZWRfZW50cnlfdHlwZSAqKQotCSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGNvbWJpbmVkX2VudHJ5X3R5cGUpICogMTApKTsKLSAgaWYgKG5hdGl2ZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBkb24ndCBuZWVkIHRvIHNldCB1cCBuX25hbWUsIG5fdmFsdWUsIG9yIG5fc2NudW0gaW4gdGhlIG5hdGl2ZQotICAgICBzeW1ib2wgaW5mb3JtYXRpb24sIHNpbmNlIHRoZXknbGwgYmUgb3ZlcnJpZGVuIGJ5IHRoZSBCRkQgc3ltYm9sCi0gICAgIGFueWhvdy4gIEhvd2V2ZXIsIHdlIGRvIG5lZWQgdG8gc2V0IHRoZSB0eXBlIGFuZCBzdG9yYWdlIGNsYXNzLAotICAgICBpbiBjYXNlIHRoaXMgc3ltYm9sIHdpbmRzIHVwIGdldHRpbmcgd3JpdHRlbiBvdXQuICBUaGUgdmFsdWUgMAotICAgICBmb3Igbl9udW1hdXggaXMgYWxyZWFkeSBjb3JyZWN0LiAgKi8KLQotICBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSA9IFRfTlVMTDsKLSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IENfU1RBVDsKLQotICBjb2Zmc3ltYm9sIChzZWN0aW9uLT5zeW1ib2wpLT5uYXRpdmUgPSBuYXRpdmU7Ci0KLSAgLyogVGhlIC5zdGFiIHNlY3Rpb24gbXVzdCBiZSBhbGlnbmVkIHRvIDIqKjIgYXQgbW9zdCwgYmVjYXVzZQotICAgICBvdGhlcndpc2UgdGhlcmUgbWF5IGJlIGdhcHMgaW4gdGhlIHNlY3Rpb24gd2hpY2ggZ2RiIHdpbGwgbm90Ci0gICAgIGtub3cgaG93IHRvIGludGVycHJldC4gIEV4YW1pbmluZyB0aGUgc2VjdGlvbiBuYW1lIGlzIGEgaGFjaywgYnV0Ci0gICAgIHRoYXQgaXMgYWxzbyBob3cgZ2RiIGxvY2F0ZXMgdGhlIHNlY3Rpb24uCi0gICAgIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9ucyBzaW1pbGFybHksIHRvCi0gICAgIGF2b2lkIGludHJvZHVjaW5nIG51bGwgd29yZHMgaW4gdGhlIHRhYmxlcy4gICovCi0gIGlmIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgPiAyCi0gICAgICAmJiAoc3RybmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMAotCSAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmN0b3JzIikgPT0gMAotCSAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmR0b3JzIikgPT0gMCkpCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICAvKiBTaW1pbGFybHksIHRoZSAuc3RhYnN0ciBzZWN0aW9uIG11c3QgYmUgYWxpZ25lZCB0byAyKiowIGF0IG1vc3QuICAqLwotICBpZiAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSID4gMAotICAgICAgJiYgc3RybmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5zdGFic3RyIiwgOCkgPT0gMCkKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUgotCi0vKiBTZXQgdGhlIGFsaWdubWVudCBvZiBhIEJGRCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZkZWYgSTk2MAotICAvKiBFeHRyYWN0IEFMSUdOIGZyb20gMioqQUxJR04gc3RvcmVkIGluIHNlY3Rpb24gaGVhZGVyICovCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIGlmICgoMSA8PCBpKSA+PSBoZHItPnNfYWxpZ24pCi0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFRJQzgwQ09GRgotICAvKiBUSSB0b29scyBoaWphY2sgYml0cyA4LTExIGZvciB0aGUgYWxpZ25tZW50ICovCi0gIGkgPSAoaGRyLT5zX2ZsYWdzID4+IDgpICYgMHhGIDsKLSNlbmRpZgotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBpOwotfQotCi0jZWxzZSAvKiAhIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgKi8KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQotLyogYSBjb3VwbGUgb2YgbWFjcm9zIHRvIGhlbHAgc2V0dGluZyB0aGUgYWxpZ25tZW50IHBvd2VyIGZpZWxkICovCi0jZGVmaW5lIEFMSUdOX1NFVChmaWVsZCx4LHkpIFwKLSAgaWYgKCgoZmllbGQpICYgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMpID09IHggKVwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotI2RlZmluZSBFTElGQUxJR05fU0VUKGZpZWxkLHgseSkgXAotICBlbHNlIGlmICgoIChmaWVsZCkgJiBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUykgPT0geCApIFwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0KLSAgQUxJR05fU0VUICAgICAoaGRyLT5zX2ZsYWdzLCBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUywgNikKLSAgRUxJRkFMSUdOX1NFVCAoaGRyLT5zX2ZsYWdzLCBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUywgNSkKLSAgRUxJRkFMSUdOX1NFVCAoaGRyLT5zX2ZsYWdzLCBJTUFHRV9TQ05fQUxJR05fMTZCWVRFUywgNCkKLSAgRUxJRkFMSUdOX1NFVCAoaGRyLT5zX2ZsYWdzLCBJTUFHRV9TQ05fQUxJR05fOEJZVEVTLCAgMykKLSAgRUxJRkFMSUdOX1NFVCAoaGRyLT5zX2ZsYWdzLCBJTUFHRV9TQ05fQUxJR05fNEJZVEVTLCAgMikKLSAgRUxJRkFMSUdOX1NFVCAoaGRyLT5zX2ZsYWdzLCBJTUFHRV9TQ05fQUxJR05fMkJZVEVTLCAgMSkKLSAgRUxJRkFMSUdOX1NFVCAoaGRyLT5zX2ZsYWdzLCBJTUFHRV9TQ05fQUxJR05fMUJZVEVTLCAgMCkKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQyIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmlkYXRhJDMiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuaWRhdGEkNCIpID09IDApCi0gICAgewotICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQ1IikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmlkYXRhJDYiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIucmVsb2MiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChzZWN0aW9uLT5uYW1lLCAiLnN0YWIiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgLyogSW4gYSBQRSBpbWFnZSBmaWxlLCB0aGUgc19wYWRkciBmaWVsZCBob2xkcyB0aGUgdmlydHVhbCBzaXplIG9mIGEKLSAgICAgc2VjdGlvbiwgd2hpbGUgdGhlIHNfc2l6ZSBmaWVsZCBob2xkcyB0aGUgcmF3IHNpemUuICAqLwotICBpZiAoaGRyLT5zX3BhZGRyICE9IDApCi0gICAgewotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBSZXR1cm4gZXJyb3IuICAqLwotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pID09IE5VTEwpCi0JewotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT50ZGF0YSA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT50ZGF0YSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFJldHVybiBlcnJvci4gICovCi0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dmlydF9zaXplID0gaGRyLT5zX3BhZGRyOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIHNlY3Rpb24tPmxtYSA9IGhkci0+c192YWRkcjsKLSNlbmRpZgotfQotI3VuZGVmIEFMSUdOX1NFVAotI3VuZGVmIEVMSUZBTElHTl9TRVQKLQotI2Vsc2UgLyogISBDT0ZGX1dJVEhfUEUgKi8KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQotLyogV2UgZ3Jvc3NseSBhYnVzZSB0aGlzIGZ1bmN0aW9uIHRvIGhhbmRsZSBYQ09GRiBvdmVyZmxvdyBoZWFkZXJzLgotICAgV2hlbiB3ZSBzZWUgb25lLCB3ZSBjb3JyZWN0IHRoZSByZWxvYyBhbmQgbGluZSBudW1iZXIgY291bnRzIGluIHRoZQotICAgcmVhbCBoZWFkZXIsIGFuZCByZW1vdmUgdGhlIHNlY3Rpb24gd2UganVzdCBjcmVhdGVkLiAgKi8KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIHNjbmhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgc2NuaGRyOwotICBhc2VjdGlvbiAqcmVhbF9zZWM7Ci0gIGFzZWN0aW9uICoqcHM7Ci0KLSAgaWYgKChoZHItPnNfZmxhZ3MgJiBTVFlQX09WUkZMTykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcmVhbF9zZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIGhkci0+c19ucmVsb2MpOwotICBpZiAocmVhbF9zZWMgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgcmVhbF9zZWMtPnJlbG9jX2NvdW50ID0gaGRyLT5zX3BhZGRyOwotICByZWFsX3NlYy0+bGluZW5vX2NvdW50ID0gaGRyLT5zX3ZhZGRyOwotCi0gIGZvciAocHMgPSAmYWJmZC0+c2VjdGlvbnM7ICpwcyAhPSBOVUxMOyBwcyA9ICYoKnBzKS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKnBzID09IHNlY3Rpb24pCi0JewotCSAgKnBzID0gKCpwcyktPm5leHQ7Ci0JICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0jZWxzZSAvKiAhIFJTNjAwMENPRkZfQyAqLwotCi0jZGVmaW5lIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSkpIGJmZF92b2lkKQotCi0jZW5kaWYgLyogISBSUzYwMDBDT0ZGX0MgKi8KLSNlbmRpZiAvKiAhIENPRkZfV0lUSF9QRSAqLwotI2VuZGlmIC8qICEgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAqLwotCi0jaWZuZGVmIGNvZmZfbWtvYmplY3QKLQotc3RhdGljIGJvb2xlYW4gY29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgY29mZl9kYXRhX3R5cGUgKmNvZmY7Ci0KLSAgYWJmZC0+dGRhdGEuY29mZl9vYmpfZGF0YSA9IChzdHJ1Y3QgY29mZl90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGNvZmZfZGF0YV90eXBlKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5jb2ZmX29ial9kYXRhID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLSAgY29mZi0+c3ltYm9scyA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIGNvZmYtPmNvbnZlcnNpb25fdGFibGUgPSAodW5zaWduZWQgaW50ICopIE5VTEw7Ci0gIGNvZmYtPnJhd19zeW1lbnRzID0gKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikgTlVMTDsKLSAgY29mZi0+cmVsb2NiYXNlID0gMDsKLSAgY29mZi0+bG9jYWxfdG9jX3N5bV9tYXAgPSAwOwotCi0vKiAgbWFrZV9hYnNfc2VjdGlvbihhYmZkKTsqLwotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmCi0KLS8qIENyZWF0ZSB0aGUgQ09GRiBiYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLSNpZm5kZWYgY29mZl9ta29iamVjdF9ob29rCi1zdGF0aWMgUFRSCi1jb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLSAgY29mZl9kYXRhX3R5cGUgKmNvZmY7Ci0KLSAgaWYgKGNvZmZfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvZmYgPSBjb2ZmX2RhdGEgKGFiZmQpOwotCi0gIGNvZmYtPnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0KLSAgLyogVGhlc2UgbWVtYmVycyBjb21tdW5pY2F0ZSBpbXBvcnRhbnQgY29uc3RhbnRzIGFib3V0IHRoZSBzeW1ib2wKLSAgICAgdGFibGUgdG8gR0RCJ3Mgc3ltYm9sLXJlYWRpbmcgY29kZS4gIFRoZXNlIGBjb25zdGFudHMnCi0gICAgIHVuZm9ydHVuYXRlbHkgdmFyeSBhbW9uZyBjb2ZmIGltcGxlbWVudGF0aW9ucy4uLiAgKi8KLSAgY29mZi0+bG9jYWxfbl9idG1hc2sgPSBOX0JUTUFTSzsKLSAgY29mZi0+bG9jYWxfbl9idHNoZnQgPSBOX0JUU0hGVDsKLSAgY29mZi0+bG9jYWxfbl90bWFzayA9IE5fVE1BU0s7Ci0gIGNvZmYtPmxvY2FsX25fdHNoaWZ0ID0gTl9UU0hJRlQ7Ci0gIGNvZmYtPmxvY2FsX3N5bWVzeiA9IFNZTUVTWjsKLSAgY29mZi0+bG9jYWxfYXV4ZXN6ID0gQVVYRVNaOwotICBjb2ZmLT5sb2NhbF9saW5lc3ogPSBMSU5FU1o7Ci0KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0KLSAgICBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSA9Ci0gICAgICBpbnRlcm5hbF9mLT5mX25zeW1zOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfU0hST0JKKSAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0gIGlmIChhb3V0aGRyICE9IE5VTEwgJiYgaW50ZXJuYWxfZi0+Zl9vcHRoZHIgPj0gQU9VVFNaKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hID0KLQkoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgYW91dGhkcjsKLSAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmY7Ci0KLSAgICAgIHhjb2ZmID0geGNvZmZfZGF0YSAoYWJmZCk7Ci0gICAgICB4Y29mZi0+ZnVsbF9hb3V0aGRyID0gdHJ1ZTsKLSAgICAgIHhjb2ZmLT50b2MgPSBpbnRlcm5hbF9hLT5vX3RvYzsKLSAgICAgIHhjb2ZmLT5zbnRvYyA9IGludGVybmFsX2EtPm9fc250b2M7Ci0gICAgICB4Y29mZi0+c25lbnRyeSA9IGludGVybmFsX2EtPm9fc25lbnRyeTsKLSAgICAgIHhjb2ZmLT50ZXh0X2FsaWduX3Bvd2VyID0gaW50ZXJuYWxfYS0+b19hbGdudGV4dDsKLSAgICAgIHhjb2ZmLT5kYXRhX2FsaWduX3Bvd2VyID0gaW50ZXJuYWxfYS0+b19hbGduZGF0YTsKLSAgICAgIHhjb2ZmLT5tb2R0eXBlID0gaW50ZXJuYWxfYS0+b19tb2R0eXBlOwotICAgICAgeGNvZmYtPmNwdXR5cGUgPSBpbnRlcm5hbF9hLT5vX2NwdXR5cGU7Ci0gICAgICB4Y29mZi0+bWF4ZGF0YSA9IGludGVybmFsX2EtPm9fbWF4ZGF0YTsKLSAgICAgIHhjb2ZmLT5tYXhzdGFjayA9IGludGVybmFsX2EtPm9fbWF4c3RhY2s7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBBUk0gCi0gIC8qIFNldCB0aGUgZmxhZ3MgZmllbGQgZnJvbSB0aGUgQ09GRiBoZWFkZXIgcmVhZCBpbiAqLwotICBpZiAoISBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBpbnRlcm5hbF9mLT5mX2ZsYWdzKSkKLSAgICBjb2ZmLT5mbGFncyA9IDA7Ci0jZW5kaWYKLSAgCi0gIHJldHVybiAoUFRSKSBjb2ZmOwotfQotI2VuZGlmCi0KLS8qIERldGVybWluZSB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIHR5cGUuICBGSVhNRTogVGhpcyBpcyB0YXJnZXQKLSAgIGRlcGVuZGVudCBiZWNhdXNlIHRoZSBtYWdpYyBudW1iZXJzIGFyZSBkZWZpbmVkIGluIHRoZSB0YXJnZXQKLSAgIGRlcGVuZGVudCBoZWFkZXIgZmlsZXMuICBCdXQgdGhlcmUgaXMgbm8gcGFydGljdWxhciBuZWVkIGZvciB0aGlzLgotICAgSWYgdGhlIG1hZ2ljIG51bWJlcnMgd2VyZSBtb3ZlZCB0byBhIHNlcGFyYXRlIGZpbGUsIHRoaXMgZnVuY3Rpb24KLSAgIHdvdWxkIGJlIHRhcmdldCBpbmRlcGVuZGVudCBhbmQgd291bGQgYWxzbyBiZSBtdWNoIG1vcmUgc3VjY2Vzc2Z1bAotICAgYXQgbGlua2luZyB0b2dldGhlciBDT0ZGIGZpbGVzIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NldF9hcmNoX21hY2hfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgbG9uZyBtYWNoaW5lOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBtYWNoaW5lID0gMDsKLSAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX21hZ2ljKQotICAgIHsKLSNpZmRlZiBQUENNQUdJQwotICAgIGNhc2UgUFBDTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLSAgICAgIG1hY2hpbmUgPSAwOyAvKiB3aGF0IGRvZXMgdGhpcyBtZWFuPyAoa3JrKSAqLwotICAgICAgYnJlYWs7IAotI2VuZGlmCi0jaWZkZWYgSTM4Nk1BR0lDCi0gICAgY2FzZSBJMzg2TUFHSUM6Ci0gICAgY2FzZSBJMzg2UFRYTUFHSUM6Ci0gICAgY2FzZSBJMzg2QUlYTUFHSUM6CQkvKiBEYW5idXJ5IFBTLzIgQUlYIEMgQ29tcGlsZXIgKi8KLSAgICBjYXNlIExZTlhDT0ZGTUFHSUM6CS8qIHNoYWRvd3MgdGhlIG02OGsgTHlueCBudW1iZXIgYmVsb3csIHNpZ2ggKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pMzg2OwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEEyOUtfTUFHSUNfQklHCi0gICAgY2FzZSBBMjlLX01BR0lDX0JJRzoKLSAgICBjYXNlIEEyOUtfTUFHSUNfTElUVExFOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2EyOWs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJNTUFHSUMKLSAgICBjYXNlIEFSTU1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2FybTsKLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfQVJNX0FSQ0hJVEVDVFVSRV9NQVNLKQotCXsKLSAgICAgICAgY2FzZSBGX0FSTV8yOiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV8yOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fMmE6IG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fMmE7IGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzM6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzM7ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBGX0FSTV8zTTogbWFjaGluZSA9IGJmZF9tYWNoX2FybV8zTTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fNDogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fNDsgIGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzRUOiBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzRUOyBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV81OiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV81OyAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNQzY4TUFHSUMKLSAgICBjYXNlIE1DNjhNQUdJQzoKLSAgICBjYXNlIE02OE1BR0lDOgotI2lmZGVmIE1DNjhLQkNTTUFHSUMKLSAgICBjYXNlIE1DNjhLQkNTTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBBUE9MTE9NNjhLTUFHSUMKLSAgICBjYXNlIEFQT0xMT002OEtNQUdJQzoKLSNlbmRpZgotI2lmZGVmIExZTlhDT0ZGTUFHSUMKLSAgICBjYXNlIExZTlhDT0ZGTUFHSUM6Ci0jZW5kaWYKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAyMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM4OE1BR0lDCi0gICAgY2FzZSBNQzg4TUFHSUM6Ci0gICAgY2FzZSBNQzg4RE1BR0lDOgotICAgIGNhc2UgTUM4OE9NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tODhrOwotICAgICAgbWFjaGluZSA9IDg4MTAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBaOEtNQUdJQwotICAgIGNhc2UgWjhLTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfejhrOwotICAgICAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9NQUNITUFTSykKLQl7Ci0JY2FzZSBGX1o4MDAxOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAxOwotCSAgYnJlYWs7Ci0JY2FzZSBGX1o4MDAyOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEk4NjAKLSAgICBjYXNlIEk4NjBNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pODYwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJOTYwCi0jaWZkZWYgSTk2MFJPTUFHSUMKLSAgICBjYXNlIEk5NjBST01BR0lDOgotICAgIGNhc2UgSTk2MFJXTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTk2MDsKLSAgICAgIHN3aXRjaCAoRl9JOTYwVFlQRSAmIGludGVybmFsX2YtPmZfZmxhZ3MpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBGX0k5NjBDT1JFOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwS0I6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwTUM6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9tYzsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwWEE6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF94YTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwQ0E6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jYTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwS0E6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwSlg6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9qeDsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwSFg6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9oeDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgIGNhc2UgVTgwMlJPTUFHSUM6Ci0gICAgY2FzZSBVODAyV1JNQUdJQzoKLSAgICBjYXNlIFU4MDJUT0NNQUdJQzoKLSAgICAgIHsKLQlpbnQgY3B1dHlwZTsKLQotCWlmICh4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAhPSAtMSkKLQkgIGNwdXR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAmIDB4ZmY7Ci0JZWxzZQotCSAgewotCSAgICAvKiBXZSBkaWQgbm90IGdldCBhIHZhbHVlIGZyb20gdGhlIGEub3V0IGhlYWRlci4gIElmIHRoZQotCSAgICAgICBmaWxlIGhhcyBub3QgYmVlbiBzdHJpcHBlZCwgd2UgbWF5IGJlIGFibGUgdG8gZ2V0IHRoZQotCSAgICAgICBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlyc3Qgc3ltYm9sLCBpZiBpdAotCSAgICAgICBpcyBhIC5maWxlIHN5bWJvbC4gICovCi0JICAgIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPT0gMCkKLQkgICAgICBjcHV0eXBlID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYmZkX2J5dGUgYnVmW1NZTUVTWl07Ci0JCXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotCi0JCWlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLQkJICAgIHx8IGJmZF9yZWFkIChidWYsIDEsIFNZTUVTWiwgYWJmZCkgIT0gU1lNRVNaKQotCQkgIHJldHVybiBmYWxzZTsKLQkJY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgYnVmLCAoUFRSKSAmc3ltKTsKLQkJaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCSAgY3B1dHlwZSA9IHN5bS5uX3R5cGUgJiAweGZmOwotCQllbHNlCi0JCSAgY3B1dHlwZSA9IDA7Ci0JICAgICAgfQotCSAgfQotCi0JLyogRklYTUU6IFdlIGRvbid0IGhhbmRsZSBhbGwgY2FzZXMgaGVyZS4gICovCi0Jc3dpdGNoIChjcHV0eXBlKQotCSAgewotCSAgZGVmYXVsdDoKLQkgIGNhc2UgMDoKLSNpZmRlZiBQT1dFUk1BQwotCSAgICAvKiBQb3dlclBDIE1hY3MgdXNlIHRoZSBzYW1lIG1hZ2ljIG51bWJlcnMgYXMgUlMvNjAwMAotCSAgICAgICAoYmVjYXVzZSB0aGF0J3MgaG93IHRoZXkgd2VyZSBib290c3RyYXBwZWQgb3JpZ2luYWxseSksCi0JICAgICAgIGJ1dCB0aGV5IGFyZSBhbHdheXMgUG93ZXJQQyBhcmNoaXRlY3R1cmUuICAqLwotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDA7Ci0jZWxzZQotCSAgICBhcmNoID0gYmZkX2FyY2hfcnM2MDAwOwotCSAgICBtYWNoaW5lID0gNjAwMDsKLSNlbmRpZiAvKiBQT1dFUk1BQyAqLwotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDYwMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6IC8qIDY0IGJpdCBQb3dlclBDICovCi0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gNjIwOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSAwOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLQkgICAgbWFjaGluZSA9IDYwMDA7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFdFMzJLTUFHSUMKLSAgICBjYXNlIFdFMzJLTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfd2UzMms7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODMwME1BR0lDCi0gICAgY2FzZSBIODMwME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwOwotICAgICAgLyogISEgRklYTUUgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgKi8KLSAgICAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDgzMDBITUFHSUMKLSAgICBjYXNlIEg4MzAwSE1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwaDsKLSAgICAgIC8qICEhIEZJWE1FIHRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4MzAwU01BR0lDCi0gICAgY2FzZSBIODMwMFNNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODMwMDsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9oODMwMHM7Ci0gICAgICAvKiAhISBGSVhNRSB0aGlzIHByb2JhYmx5IGlzbid0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTSF9BUkNIX01BR0lDX0JJRwotICAgIGNhc2UgU0hfQVJDSF9NQUdJQ19CSUc6Ci0gICAgY2FzZSBTSF9BUkNIX01BR0lDX0xJVFRMRToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zaDsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4NTAwTUFHSUMKLSAgICBjYXNlIEg4NTAwTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaDg1MDA7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTUEFSQ01BR0lDCi0gICAgY2FzZSBTUEFSQ01BR0lDOgotI2lmZGVmIExZTlhDT0ZGTUFHSUMKLSAgICBjYXNlIExZTlhDT0ZGTUFHSUM6Ci0jZW5kaWYKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFRJQzMwTUFHSUMKLSAgICBjYXNlIFRJQzMwTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfdGljMzA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgVElDODBfQVJDSF9NQUdJQwotICAgIGNhc2UgVElDODBfQVJDSF9NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF90aWM4MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBNQ09SRU1BR0lDCi0gICAgY2FzZSBNQ09SRU1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21jb3JlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgkJCS8qIFVucmVhZGFibGUgaW5wdXQgZmlsZSB0eXBlICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBTWU1OQU1FX0lOX0RFQlVHCi0KLXN0YXRpYyBib29sZWFuIHN5bW5hbWVfaW5fZGVidWdfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1zeW1uYW1lX2luX2RlYnVnX2hvb2sgKGFiZmQsIHN5bSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotewotICByZXR1cm4gU1lNTkFNRV9JTl9ERUJVRyAoc3ltKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2Vsc2UKLQotI2RlZmluZSBzeW1uYW1lX2luX2RlYnVnX2hvb2sgXAotICAoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpKSBiZmRfZmFsc2UKLQotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQotLyogSGFuZGxlIHRoZSBjc2VjdCBhdXhlbnQgb2YgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXg7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eDsKLXsKLSAgaW50IGNsYXNzID0gc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzczsKLQotICBpZiAoKGNsYXNzID09IENfRVhUIHx8IGNsYXNzID09IENfSElERVhUKQotICAgICAgJiYgaW5kYXV4ICsgMSA9PSBzeW1ib2wtPnUuc3ltZW50Lm5fbnVtYXV4KQotICAgIHsKLSAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApID09IFhUWV9MRCkKLQl7Ci0JICBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ucCA9Ci0JICAgIHRhYmxlX2Jhc2UgKyBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubDsKLQkgIGF1eC0+Zml4X3NjbmxlbiA9IDE7Ci0JfQotCi0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBkbyBhbnkKLSAgICAgICAgIGZ1cnRoZXIgd29yayBvbiB0aGlzIGF1eGVudC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhpcyBhdXhlbnQgc2hvdWxkIGJlIGhhbmRsZWQgYnkKLSAgICAgdGhlIGNhbGxlci4gICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotI2Vsc2UKLSNpZmRlZiBJOTYwCi0KLS8qIFdlIGRvbid0IHdhbnQgdG8gcG9pbnRlcml6ZSBiYWwgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vawotICBQQVJBTVMgKChiZmQgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosCi0JICAgdW5zaWduZWQgaW50LCBjb21iaW5lZF9lbnRyeV90eXBlICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wb2ludGVyaXplX2F1eF9ob29rIChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotewotICAvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBkb24ndCB3YW50IHRvIHBvaW50ZXJpemUgdGhpcyBhdXggZW50cnksIHdoaWNoCi0gICAgIGlzIHRoZSBjYXNlIGZvciB0aGUgbGFzdGZpcnN0IGF1eCBlbnRyeSBmb3IgYSBDX0xFQUZQUk9DIHN5bWJvbC4gICovCi0gIHJldHVybiAoaW5kYXV4ID09IDEKLQkgICYmIChzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTEVBRlBST0MKLQkgICAgICB8fCBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTEVBRlNUQVQKLQkgICAgICB8fCBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTEVBRkVYVCkpOwotfQotCi0jZWxzZSAvKiAhIEk5NjAgKi8KLQotI2RlZmluZSBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgMAotCi0jZW5kaWYgLyogISBJOTYwICovCi0jZW5kaWYgLyogISBSUzYwMDBDT0ZGX0MgKi8KLQotLyogUHJpbnQgYW4gYXV4IGVudHJ5LiAgVGhpcyByZXR1cm5zIHRydWUgaWYgaXQgaGFzIHByaW50ZWQgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3ByaW50X2F1eAotICBQQVJBTVMgKChiZmQgKiwgRklMRSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICBjb21iaW5lZF9lbnRyeV90eXBlICosIHVuc2lnbmVkIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wcmludF9hdXggKGFiZmQsIGZpbGUsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZTsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXg7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXg7Ci17Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICgoc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0VYVAotICAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19ISURFWFQpCi0gICAgICAmJiBpbmRhdXggKyAxID09IHN5bWJvbC0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGNzZWN0IGVudHJ5LiAgKi8KLSAgICAgIGZwcmludGYgKGZpbGUsICJBVVggIik7Ci0gICAgICBpZiAoU01UWVBfU01UWVAgKGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtdHlwKSAhPSBYVFlfTEQpCi0JewotCSAgQkZEX0FTU0VSVCAoISBhdXgtPmZpeF9zY25sZW4pOwotCSAgZnByaW50ZiAoZmlsZSwgInZhbCAlNWxkIiwgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLmwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCAiaW5keCAiKTsKLQkgIGlmICghIGF1eC0+Zml4X3NjbmxlbikKLQkgICAgZnByaW50ZiAoZmlsZSwgIiU0bGQiLCBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKGZpbGUsICIlNGxkIiwKLQkJICAgICAobG9uZykgKGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wIC0gdGFibGVfYmFzZSkpOwotCX0KLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgICIgcHJtaHNoICVsZCBzbmhzaCAldSB0eXAgJWQgYWxnbiAlZCBjbHNzICV1IHN0YiAlbGQgc25zdGIgJXUiLAotCSAgICAgICBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9wYXJtaGFzaCwKLQkgICAgICAgKHVuc2lnbmVkIGludCkgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc25oYXNoLAotCSAgICAgICBTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApLAotCSAgICAgICBTTVRZUF9BTElHTiAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApLAotCSAgICAgICAodW5zaWduZWQgaW50KSBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbWNsYXMsCi0JICAgICAgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3N0YWIsCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Nuc3RhYik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCBubyBzcGVjaWFsIGFjdGlvbiB3YXMgdGFrZW4uICAqLwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JV3JpdGluZyByZWxvY2F0aW9ucwotCi0JVG8gd3JpdGUgcmVsb2NhdGlvbnMsIHRoZSBiYWNrIGVuZCBzdGVwcyB0aG91Z2ggdGhlCi0JY2Fub25pY2FsIHJlbG9jYXRpb24gdGFibGUgYW5kIGNyZWF0ZSBhbgotCUBjb2Rle2ludGVybmFsX3JlbG9jfS4gVGhlIHN5bWJvbCBpbmRleCB0byB1c2UgaXMgcmVtb3ZlZCBmcm9tCi0JdGhlIEBjb2Rle29mZnNldH0gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBzdXBwbGllZC4gIFRoZQotCWFkZHJlc3MgY29tZXMgZGlyZWN0bHkgZnJvbSB0aGUgc3VtIG9mIHRoZSBzZWN0aW9uIGJhc2UKLQlhZGRyZXNzIGFuZCB0aGUgcmVsb2NhdGlvbiBvZmZzZXQ7IHRoZSB0eXBlIGlzIGR1ZyBkaXJlY3RseQotCWZyb20gdGhlIGhvd3RvIGZpZWxkLiAgVGhlbiB0aGUgQGNvZGV7aW50ZXJuYWxfcmVsb2N9IGlzCi0Jc3dhcHBlZCBpbnRvIHRoZSBzaGFwZSBvZiBhbiBAY29kZXtleHRlcm5hbF9yZWxvY30gYW5kIHdyaXR0ZW4KLQlvdXQgdG8gZGlzay4KLQotKi8KLQotI2lmZGVmIFRBUkdfQVVYCi0KLXN0YXRpYyBpbnQgY29tcGFyZV9hcmVsZW50X3B0ciBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi0vKiBBVVgncyBsZCB3YW50cyByZWxvY2F0aW9ucyB0byBiZSBzb3J0ZWQgKi8KLXN0YXRpYyBpbnQKLWNvbXBhcmVfYXJlbGVudF9wdHIgKHgsIHkpCi0gICAgIGNvbnN0IFBUUiB4OwotICAgICBjb25zdCBQVFIgeTsKLXsKLSAgY29uc3QgYXJlbGVudCAqKmEgPSAoY29uc3QgYXJlbGVudCAqKikgeDsKLSAgY29uc3QgYXJlbGVudCAqKmIgPSAoY29uc3QgYXJlbGVudCAqKikgeTsKLSAgYmZkX3NpemVfdHlwZSBhYWRyID0gKCphKS0+YWRkcmVzczsKLSAgYmZkX3NpemVfdHlwZSBiYWRyID0gKCpiKS0+YWRkcmVzczsKLQotICByZXR1cm4gKGFhZHIgPCBiYWRyID8gLTEgOiBiYWRyIDwgYWFkciA/IDEgOiAwKTsKLX0KLQotI2VuZGlmIC8qIFRBUkdfQVVYICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX3JlbG9jcyAoYWJmZCwgZmlyc3RfdW5kZWYpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGludCBmaXJzdF91bmRlZjsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jIGRzdDsKLSAgICAgIGFyZWxlbnQgKipwOwotCi0jaWZuZGVmIFRBUkdfQVVYCi0gICAgICBwID0gcy0+b3JlbG9jYXRpb247Ci0jZWxzZQotICAgICAgLyogc29ydCByZWxvY2F0aW9ucyBiZWZvcmUgd2Ugd3JpdGUgdGhlbSBvdXQgKi8KLSAgICAgIHAgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICAgICAgaWYgKHAgPT0gTlVMTCAmJiBzLT5yZWxvY19jb3VudCA+IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtY3B5IChwLCBzLT5vcmVsb2NhdGlvbiwgcy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICAgICAgcXNvcnQgKHAsIHMtPnJlbG9jX2NvdW50LCBzaXplb2YgKGFyZWxlbnQgKiksIGNvbXBhcmVfYXJlbGVudF9wdHIpOwotI2VuZGlmCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5yZWxvY19jb3VudDsgaSsrKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBuOwotCSAgYXJlbGVudCAqcSA9IHBbaV07Ci0JICBtZW1zZXQgKChQVFIpICYgbiwgMCwgc2l6ZW9mIChuKSk7Ci0KLQkgIC8qIE5vdyB3ZSd2ZSByZW51bWJlcmVkIHRoZSBzeW1ib2xzIHdlIGtub3cgd2hlcmUgdGhlCi0JICAgICB1bmRlZmluZWQgc3ltYm9scyBsaXZlIGluIHRoZSB0YWJsZS4gIENoZWNrIHRoZSByZWxvYwotCSAgICAgZW50cmllcyBmb3Igc3ltYm9scyB3aG8ncyBvdXRwdXQgYmZkIGlzbid0IHRoZSByaWdodCBvbmUuCi0JICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkICh3aGljaCBtZWFucwotCSAgICAgdGhhdCBhbGwgdGhlIHBvaW50ZXJzIGFyZSBuZXZlciBtYWRlIHRvIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBwbGFjZSkuIFRoaXMgaXMgYSBiYWQgdGhpbmcsJ2NhdXNlIHRoZSBzeW1ib2xzIGF0dGFjaGVkCi0JICAgICB0byB0aGUgb3V0cHV0IGJmZCBhcmUgaW5kZXhlZCwgc28gdGhhdCB0aGUgcmVsb2NhdGlvbgotCSAgICAgZW50cmllcyBrbm93IHdoaWNoIHN5bWJvbCBpbmRleCB0aGV5IHBvaW50IHRvLiAgU28gd2UKLQkgICAgIGhhdmUgdG8gbG9vayB1cCB0aGUgb3V0cHV0IHN5bWJvbCBoZXJlLiAqLwotCi0JICBpZiAocS0+c3ltX3B0cl9wdHJbMF0tPnRoZV9iZmQgIT0gYWJmZCkKLQkgICAgewotCSAgICAgIGludCBpOwotCSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lID0gcS0+c3ltX3B0cl9wdHJbMF0tPm5hbWU7Ci0JICAgICAgYXN5bWJvbCAqKm91dHN5bXMgPSBhYmZkLT5vdXRzeW1ib2xzOwotCSAgICAgIGZvciAoaSA9IGZpcnN0X3VuZGVmOyBvdXRzeW1zW2ldOyBpKyspCi0JCXsKLQkJICBjb25zdCBjaGFyICppbnRhYmxlID0gb3V0c3ltc1tpXS0+bmFtZTsKLQkJICBpZiAoc3RyY21wIChpbnRhYmxlLCBzbmFtZSkgPT0gMCkgewotCQkgICAgLyogZ290IGEgaGl0LCBzbyByZXBvaW50IHRoZSByZWxvYyAqLwotCQkgICAgcS0+c3ltX3B0cl9wdHIgPSBvdXRzeW1zICsgaTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJfQotCSAgICB9Ci0KLQkgIG4ucl92YWRkciA9IHEtPmFkZHJlc3MgKyBzLT52bWE7Ci0KLSNpZmRlZiBSX0lIQ09OU1QKLQkgIC8qIFRoZSAyOWsgY29uc3QvY29uc3RoIHJlbG9jIHBhaXIgaXMgYSByZWFsIGtsdWRnZS4gIFRoZSBjb25zdGgKLQkgICAgIHBhcnQgZG9lc24ndCBoYXZlIGEgc3ltYm9sOyBpdCBoYXMgYW4gb2Zmc2V0LiAgU28gcmVidWlsdAotCSAgICAgdGhhdCBoZXJlLiAgKi8KLQkgIGlmIChxLT5ob3d0by0+dHlwZSA9PSBSX0lIQ09OU1QpCi0JICAgIG4ucl9zeW1uZHggPSBxLT5hZGRlbmQ7Ci0JICBlbHNlCi0jZW5kaWYKLQkgICAgaWYgKHEtPnN5bV9wdHJfcHRyKQotCSAgICAgIHsKLQkJaWYgKHEtPnN5bV9wdHJfcHRyID09IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyKQotCQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBhYnNvbHV0ZSBzeW1ib2wuICAqLwotCQkgIG4ucl9zeW1uZHggPSAtMTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG4ucl9zeW1uZHggPSBnZXRfaW5kZXggKCgqKHEtPnN5bV9wdHJfcHRyKSkpOwotCQkgICAgLyogVGFrZSBub3RpY2UgaWYgdGhlIHN5bWJvbCByZWxvYyBwb2ludHMgdG8gYSBzeW1ib2wKLQkJICAgICAgIHdlIGRvbid0IGhhdmUgaW4gb3VyIHN5bWJvbCB0YWJsZS4gIFdoYXQgc2hvdWxkIHdlCi0JCSAgICAgICBkbyBmb3IgdGhpcz8/ICAqLwotCQkgICAgaWYgKG4ucl9zeW1uZHggPiBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSkKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgfQotCSAgICAgIH0KLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotCSAgbi5yX29mZnNldCA9IHEtPmFkZGVuZDsKLSNlbmRpZgotCi0jaWZkZWYgU0VMRUNUX1JFTE9DCi0JICAvKiBXb3JrIG91dCByZWxvYyB0eXBlIGZyb20gd2hhdCBpcyByZXF1aXJlZCAqLwotCSAgU0VMRUNUX1JFTE9DIChuLCBxLT5ob3d0byk7Ci0jZWxzZQotCSAgbi5yX3R5cGUgPSBxLT5ob3d0by0+dHlwZTsKLSNlbmRpZgotCSAgY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJm4sICZkc3QpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBkc3QsIDEsIFJFTFNaLCBhYmZkKSAhPSBSRUxTWikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotI2lmZGVmIFRBUkdfQVVYCi0gICAgICBpZiAocCAhPSBOVUxMKQotCWZyZWUgKHApOwotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgZmxhZ3MgYW5kIG1hZ2ljIG51bWJlciBvZiBhIGNvZmYgZmlsZSBmcm9tIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotICAgdHlwZS4gIFJlc3VsdCBpcyB0cnVlIGlmIHdlIGNhbiByZXByZXNlbnQgdGhlIGFyY2gmdHlwZSwgZmFsc2UgaWYgbm90LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X2ZsYWdzIChhYmZkLCBtYWdpY3AsIGZsYWdzcCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50ICptYWdpY3A7Ci0gICAgIHVuc2lnbmVkIHNob3J0ICpmbGFnc3A7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0jaWZkZWYgWjhLTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3o4azoKLSAgICAgICptYWdpY3AgPSBaOEtNQUdJQzsKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF96ODAwMToKLQkgICpmbGFnc3AgPSBGX1o4MDAxOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF96ODAwMjoKLQkgICpmbGFnc3AgPSBGX1o4MDAyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIEk5NjBST01BR0lDCi0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0KLSAgICAgIHsKLQl1bnNpZ25lZCBmbGFnczsKLQkqbWFnaWNwID0gSTk2MFJPTUFHSUM7Ci0JLyoKLQkgICgoYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICYgV1BfVEVYVCkgPyBJOTYwUk9NQUdJQyA6Ci0JICBJOTYwUldNQUdJQyk7ICAgRklYTUU/Pz8KLQkgICovCi0Jc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCSAgewotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0JICAgIGZsYWdzID0gRl9JOTYwQ09SRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0JICAgIGZsYWdzID0gRl9JOTYwS0I7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotCSAgICBmbGFncyA9IEZfSTk2ME1DOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLQkgICAgZmxhZ3MgPSBGX0k5NjBYQTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0JICAgIGZsYWdzID0gRl9JOTYwQ0E7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotCSAgICBmbGFncyA9IEZfSTk2MEtBOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLQkgICAgZmxhZ3MgPSBGX0k5NjBKWDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0JICAgIGZsYWdzID0gRl9JOTYwSFg7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSpmbGFnc3AgPSBmbGFnczsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUMzME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgICptYWdpY3AgPSBUSUMzME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBUSUM4MF9BUkNIX01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF90aWM4MDoKLSAgICAgICptYWdpY3AgPSBUSUM4MF9BUkNIX01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBBUk1NQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgICAgKiBtYWdpY3AgPSBBUk1NQUdJQzsKLSAgICAgICogZmxhZ3NwID0gMDsKLSAgICAgIGlmIChBUENTX1NFVCAoYWJmZCkpCi0JewotCSAgaWYgKEFQQ1NfMjZfRkxBRyAoYWJmZCkpCi0JICAgICogZmxhZ3NwIHw9IEZfQVBDUzI2OwotCSAgCi0JICBpZiAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSkKLQkgICAgKiBmbGFnc3AgfD0gRl9BUENTX0ZMT0FUOwotCSAgCi0JICBpZiAoUElDX0ZMQUcgKGFiZmQpKQotCSAgICAqIGZsYWdzcCB8PSBGX1BJQzsKLQl9Ci0gICAgICBpZiAoSU5URVJXT1JLX1NFVCAoYWJmZCkgJiYgSU5URVJXT1JLX0ZMQUcgKGFiZmQpKQotCSogZmxhZ3NwIHw9IEZfSU5URVJXT1JLOwotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2FybV8yOiAgKiBmbGFnc3AgfD0gRl9BUk1fMjsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzJhOiAqIGZsYWdzcCB8PSBGX0FSTV8yYTsgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fMzogICogZmxhZ3NwIHw9IEZfQVJNXzM7ICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV8zTTogKiBmbGFnc3AgfD0gRl9BUk1fM007IGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzQ6ICAqIGZsYWdzcCB8PSBGX0FSTV80OyAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fNFQ6ICogZmxhZ3NwIHw9IEZfQVJNXzRUOyBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV81OiAgKiBmbGFnc3AgfD0gRl9BUk1fNTsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzVUOiAqIGZsYWdzcCB8PSBGX0FSTV81OyAgYnJlYWs7IC8qIFhYWCAtIHdlIGRvIG5vdCBoYXZlIGFuIEZfQVJNXzVUICovCi0JfQotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBQUENNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgICptYWdpY3AgPSBQUENNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJMzg2TUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICAqbWFnaWNwID0gSTM4Nk1BR0lDOwotI2lmZGVmIExZTlhPUwotICAgICAgLyogSnVzdCBvdmVyd3JpdGUgdGhlIHVzdWFsIHZhbHVlIGlmIHdlJ3JlIGRvaW5nIEx5bnguICovCi0gICAgICAqbWFnaWNwID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEk4NjBNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaTg2MDoKLSAgICAgICptYWdpY3AgPSBJODYwTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM2OE1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotI2lmZGVmIEFQT0xMT002OEtNQUdJQwotICAgICAgKm1hZ2ljcCA9IEFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSOwotI2Vsc2UKLSAgICAgIC8qIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSBtYXkgYmUgZGVmaW5lZCBieSBjb2ZmLXU2OGsuYy4gICovCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICAgICAqbWFnaWNwID0gTUM2OEtCQ1NNQUdJQzsKLSNlbHNlCi0gICAgICAqbWFnaWNwID0gTUM2OE1BR0lDOwotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBMWU5YT1MKLSAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLwotICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DODhNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgICptYWdpY3AgPSBNQzg4T01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEg4MzAwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2g4MzAwOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2g4MzAwOgotCSAgKm1hZ2ljcCA9IEg4MzAwTUFHSUM7Ci0JICByZXR1cm4gdHJ1ZTsKLQljYXNlIGJmZF9tYWNoX2g4MzAwaDoKLQkgICptYWdpY3AgPSBIODMwMEhNQUdJQzsKLQkgIHJldHVybiB0cnVlOwotCWNhc2UgYmZkX21hY2hfaDgzMDBzOgotCSAgKm1hZ2ljcCA9IEg4MzAwU01BR0lDOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNIX0FSQ0hfTUFHSUNfQklHCi0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JKm1hZ2ljcCA9IFNIX0FSQ0hfTUFHSUNfQklHOwotICAgICAgZWxzZQotCSptYWdpY3AgPSBTSF9BUkNIX01BR0lDX0xJVFRMRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNQQVJDTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgKm1hZ2ljcCA9IFNQQVJDTUFHSUM7Ci0jaWZkZWYgTFlOWE9TCi0gICAgICAvKiBKdXN0IG92ZXJ3cml0ZSB0aGUgdXN1YWwgdmFsdWUgaWYgd2UncmUgZG9pbmcgTHlueC4gKi8KLSAgICAgICptYWdpY3AgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODUwME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9oODUwMDoKLSAgICAgICptYWdpY3AgPSBIODUwME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEEyOUtfTUFHSUNfQklHCi0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQkqbWFnaWNwID0gQTI5S19NQUdJQ19CSUc7Ci0gICAgICBlbHNlCi0JKm1hZ2ljcCA9IEEyOUtfTUFHSUNfTElUVExFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgV0UzMktNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfd2UzMms6Ci0gICAgICAqbWFnaWNwID0gV0UzMktNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFU4MDJUT0NNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotI2lmbmRlZiBQUENNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSNlbmRpZgotICAgICAgKm1hZ2ljcCA9IFU4MDJUT0NNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DT1JFTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX21jb3JlOgotICAgICAgKiBtYWdpY3AgPSBNQ09SRU1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSAgICAgIAotICAgIGRlZmF1bHQ6CQkJLyogVW5rbm93biBhcmNoaXRlY3R1cmUgKi8KLSAgICAgIC8qIHJldHVybiBmYWxzZTsgIC0tIGZhbGwgdGhyb3VnaCB0byAicmV0dXJuIGZhbHNlIiBiZWxvdywgdG8gYXZvaWQKLSAgICAgICAic3RhdGVtZW50IG5ldmVyIHJlYWNoZWQiIGVycm9ycyBvbiB0aGUgb25lIGJlbG93LiAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICB1bnNpZ25lZCBkdW1teTE7Ci0gIHVuc2lnbmVkIHNob3J0IGR1bW15MjsKLQotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93biAmJgotICAgICAgY29mZl9zZXRfZmxhZ3MgKGFiZmQsICZkdW1teTEsICZkdW1teTIpICE9IHRydWUpCi0gICAgcmV0dXJuIGZhbHNlOwkJLyogV2UgY2FuJ3QgcmVwcmVzZW50IHRoaXMgdHlwZSAqLwotCi0gIHJldHVybiB0cnVlOwkJCS8qIFdlJ3JlIGVhc3kgLi4uICovCi19Ci0KLQotLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9uIGZvciBlYWNoIHNlY3Rpb24uICovCi0KLSNpZm5kZWYgSTk2MAotI2RlZmluZSBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0jZW5kaWYKLSNpZmRlZiBUSUM4MENPRkYKLSN1bmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgYXNlY3Rpb24gKnByZXZpb3VzID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGZpbGVfcHRyIHNvZmFyID0gRklMSFNaOwotICBib29sZWFuIGFsaWduX2FkanVzdDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotI2lmZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSAgZmlsZV9wdHIgb2xkX3NvZmFyOwotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogT24gWENPRkYsIGlmIHdlIGhhdmUgc3ltYm9scywgc2V0IHVwIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzejsKLSAgICAgIGJmZF9zaXplX3R5cGUgaSwgc3ltY291bnQ7Ci0gICAgICBhc3ltYm9sICoqc3ltcDsKLQotICAgICAgc3ogPSAwOwotICAgICAgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgICAgIGZvciAoc3ltcCA9IGFiZmQtPm91dHN5bWJvbHMsIGkgPSAwOyBpIDwgc3ltY291bnQ7IHN5bXArKywgaSsrKQotCXsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKmNmOwotCi0JICBjZiA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsICpzeW1wKTsKLQkgIGlmIChjZiAhPSBOVUxMCi0JICAgICAgJiYgY2YtPm5hdGl2ZSAhPSBOVUxMCi0JICAgICAgJiYgU1lNTkFNRV9JTl9ERUJVRyAoJmNmLT5uYXRpdmUtPnUuc3ltZW50KSkKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW47Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKCpzeW1wKSk7Ci0JICAgICAgaWYgKGxlbiA+IFNZTU5NTEVOKQotCQlzeiArPSBsZW4gKyAzOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHN6ID4gMCkKLQl7Ci0JICBhc2VjdGlvbiAqZHNlYzsKLQotCSAgZHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5kZWJ1ZyIpOwotCSAgaWYgKGRzZWMgPT0gTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JICBkc2VjLT5fcmF3X3NpemUgPSBzejsKLQkgIGRzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIGludCBwYWdlX3NpemU7Ci0gIGlmIChjb2ZmX2RhdGEgKGFiZmQpLT5saW5rX2luZm8pIAotICAgIHsKLSAgICAgIHBhZ2Vfc2l6ZSA9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuRmlsZUFsaWdubWVudDsKLSAgICB9Ci0gIGVsc2UKLSAgICBwYWdlX3NpemUgPSBQRV9ERUZfRklMRV9BTElHTk1FTlQ7Ci0jZWxzZQotI2lmZGVmIENPRkZfUEFHRV9TSVpFCi0gIGludCBwYWdlX3NpemUgPSBDT0ZGX1BBR0VfU0laRTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgaWYgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpCi0gICAgewotICAgICAgLyogIEEgc3RhcnQgYWRkcmVzcyBtYXkgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBvcmlnaW5hbCBmaWxlLiBJbiB0aGlzCi0JICBjYXNlIGl0IHdpbGwgbmVlZCBhbiBvcHRpb25hbCBoZWFkZXIgdG8gcmVjb3JkIGl0LiAgKi8KLSAgICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHNvZmFyICs9IEFPVVRTWjsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgZWxzZSBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKLSAgICBzb2ZhciArPSBBT1VUU1o7Ci0gIGVsc2UKLSAgICBzb2ZhciArPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLQotICBzb2ZhciArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogU0NOSFNaOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIC8qIFhDT0ZGIGhhbmRsZXMgb3ZlcmZsb3dzIGluIHRoZSByZWxvYyBhbmQgbGluZSBudW1iZXIgY291bnQgZmllbGRzCi0gICAgIGJ5IGFsbG9jYXRpbmcgYSBuZXcgc2VjdGlvbiBoZWFkZXIgdG8gaG9sZCB0aGUgY29ycmVjdCBjb3VudHMuICAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IGN1cnJlbnQtPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0gICAgICBzb2ZhciArPSBTQ05IU1o7Ci0jZW5kaWYKLQotICBhbGlnbl9hZGp1c3QgPSBmYWxzZTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnMsIGNvdW50ID0gMTsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0LCArK2NvdW50KQotICAgIHsKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFRoZSBOVCBsb2FkZXIgZG9lcyBub3Qgd2FudCBlbXB0eSBzZWN0aW9uIGhlYWRlcnMsIHNvIHdlIG9taXQKLSAgICAgICAgIHRoZW0uICBXZSBkb24ndCBhY3R1YWxseSByZW1vdmUgdGhlIHNlY3Rpb24gZnJvbSB0aGUgQkZELAotICAgICAgICAgYWx0aG91Z2ggd2UgcHJvYmFibHkgc2hvdWxkLiAgVGhpcyBtYXRjaGVzIGNvZGUgaW4KLSAgICAgICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjdXJyZW50LT5fcmF3X3NpemUgPT0gMCkKLQl7Ci0JICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSAtMTsKLQkgIC0tY291bnQ7Ci0JICBjb250aW51ZTsKLQl9Ci0jZW5kaWYKLQotICAgICAgY3VycmVudC0+dGFyZ2V0X2luZGV4ID0gY291bnQ7Ci0KLSAgICAgIC8qIE9ubHkgZGVhbCB3aXRoIHNlY3Rpb25zIHdoaWNoIGhhdmUgY29udGVudHMgKi8KLSAgICAgIGlmICghKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEFsaWduIHRoZSBzZWN0aW9ucyBpbiB0aGUgZmlsZSB0byB0aGUgc2FtZSBib3VuZGFyeSBvbgotCSB3aGljaCB0aGV5IGFyZSBhbGlnbmVkIGluIHZpcnR1YWwgbWVtb3J5LiAgSTk2MCBkb2Vzbid0Ci0JIGRvIHRoaXMgKEZJWE1FKSBzbyB3ZSBjYW4gc3RheSBpbiBzeW5jIHdpdGggSW50ZWwuICA5NjAKLQkgZG9lc24ndCB5ZXQgcGFnZSBmcm9tIGZpbGVzLi4uICovCi0jaWZkZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLQl7Ci0JICAvKiBtYWtlIHN1cmUgdGhpcyBzZWN0aW9uIGlzIGFsaWduZWQgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5IC0gYnkKLQkgICAgIHBhZGRpbmcgdGhlIHByZXZpb3VzIHNlY3Rpb24gdXAgaWYgbmVjZXNzYXJ5ICovCi0KLQkgIG9sZF9zb2ZhciA9IHNvZmFyOwotCSAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7Ci0JICBpZiAocHJldmlvdXMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmV2aW91cy0+X3Jhd19zaXplICs9IHNvZmFyIC0gb2xkX3NvZmFyOwotCSAgICB9Ci0JfQotCi0jZW5kaWYKLQotICAgICAgLyogSW4gZGVtYW5kIHBhZ2VkIGZpbGVzIHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUgZmlsZSBvZmZzZXQKLQkgbXVzdCBtYXRjaCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlIHZpcnR1YWwgYWRkcmVzcy4gICovCi0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0Jc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIHNvZmFyKSAlIHBhZ2Vfc2l6ZTsKLSNlbmRpZgotICAgICAgY3VycmVudC0+ZmlsZXBvcyA9IHNvZmFyOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBXaXRoIFBFIHdlIGhhdmUgdG8gcGFkIGVhY2ggc2VjdGlvbiB0byBiZSBhIG11bHRpcGxlIG9mIGl0cwotCSBwYWdlIHNpemUgdG9vLCBhbmQgcmVtZW1iZXIgYm90aCBzaXplcy4gICovCi0KLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCkgPT0gTlVMTCkKLQl7Ci0JICBjdXJyZW50LT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGN1cnJlbnQtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCkgPT0gTlVMTCkKLQl7Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnRkYXRhID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnRkYXRhID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA9PSAwKQotCXBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemUgPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSAgICAgIGN1cnJlbnQtPl9yYXdfc2l6ZSA9IChjdXJyZW50LT5fcmF3X3NpemUgKyBwYWdlX3NpemUgLTEpICYgLXBhZ2Vfc2l6ZTsKLSNlbmRpZgotCi0gICAgICBzb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0gICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGlzIHNlY3Rpb24gaXMgb2YgdGhlIHJpZ2h0IHNpemUgdG9vICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSA9PSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgb2xkX3NpemU7Ci0KLQkgIG9sZF9zaXplID0gY3VycmVudC0+X3Jhd19zaXplOwotCSAgY3VycmVudC0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChjdXJyZW50LT5fcmF3X3NpemUsCi0JCQkJCSAgMSA8PCBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgYWxpZ25fYWRqdXN0ID0gY3VycmVudC0+X3Jhd19zaXplICE9IG9sZF9zaXplOwotCSAgc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplIC0gb2xkX3NpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9sZF9zb2ZhciA9IHNvZmFyOwotCSAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7Ci0JICBhbGlnbl9hZGp1c3QgPSBzb2ZhciAhPSBvbGRfc29mYXI7Ci0JICBjdXJyZW50LT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0JfQotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIEZvciBQRSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBwYWQgb3V0IHRvIHRoZSBhbGlnbmVkCi0gICAgICAgICBfcmF3X3NpemUsIGluIGNhc2UgdGhlIGNhbGxlciBvbmx5IHdyaXRlcyBvdXQgZGF0YSB0byB0aGUKLSAgICAgICAgIHVuYWxpZ25lZCBfcmF3X3NpemUuICAqLwotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemUgPCBjdXJyZW50LT5fcmF3X3NpemUpCi0JYWxpZ25fYWRqdXN0ID0gdHJ1ZTsKLSNlbmRpZgotCi0jaWZkZWYgX0xJQgotICAgICAgLyogRm9yY2UgLmxpYiBzZWN0aW9ucyB0byBzdGFydCBhdCB6ZXJvLiAgVGhlIHZtYSBpcyB0aGVuCi0JIGluY3JlbWVudGVkIGluIGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMuICBUaGlzIGlzIHJpZ2h0IGZvcgotCSBTVlIzLjIuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQliZmRfc2V0X3NlY3Rpb25fdm1hIChhYmZkLCBjdXJyZW50LCAwKTsKLSNlbmRpZgotCi0gICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0gICAgfQotCi0gIC8qIEl0IGlzIG5vdyBzYWZlIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4gIElmIHdlIG5lZWRlZCBhbgotICAgICBhbGlnbm1lbnQgYWRqdXN0bWVudCBmb3IgdGhlIGxhc3Qgc2VjdGlvbiwgdGhlbiBtYWtlIHN1cmUgdGhhdAotICAgICB0aGVyZSBpcyBhIGJ5dGUgYXQgb2Zmc2V0IHNvZmFyLiAgSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMgYW5kIG5vCi0gICAgIHJlbG9jcywgdGhlbiBub3RoaW5nIGZvbGxvd3MgdGhlIGxhc3Qgc2VjdGlvbi4gIElmIHdlIGRvbid0IGZvcmNlCi0gICAgIHRoZSBsYXN0IGJ5dGUgb3V0LCB0aGVuIHRoZSBmaWxlIG1heSBhcHBlYXIgdG8gYmUgdHJ1bmNhdGVkLiAgKi8KLSAgaWYgKGFsaWduX2FkanVzdCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBiID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc29mYXIgLSAxLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgcmVsb2NhdGlvbnMgYXJlIGFsaWduZWQuICBXZSBkb24ndCBuZWVkIHRvIG1ha2UKLSAgICAgc3VyZSB0aGF0IHRoaXMgYnl0ZSBleGlzdHMsIGJlY2F1c2UgaXQgd2lsbCBvbmx5IG1hdHRlciBpZiB0aGVyZQotICAgICByZWFsbHkgYXJlIHJlbG9jcy4gICovCi0gIHNvZmFyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOwotCi0gIG9ial9yZWxvY2Jhc2UgKGFiZmQpID0gc29mYXI7Ci0gIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGNhbiBuZXZlciB3b3JrLCBiZWNhdXNlIGl0IGlzIGNhbGxlZCB0b28gbGF0ZS0tYWZ0ZXIgdGhlCi0gICBzZWN0aW9uIHBvc2l0aW9ucyBoYXZlIGJlZW4gc2V0LiAgSSBjYW4ndCBmaWd1cmUgb3V0IHdoYXQgaXQgaXMKLSAgIGZvciwgc28gSSBhbSBnb2luZyB0byBkaXNhYmxlIGl0LS1JYW4gVGF5bG9yIDIwIE1hcmNoIDE5OTYuICAqLwotCi0vKiBJZiAuZmlsZSwgLnRleHQsIC5kYXRhLCAuYnNzIHN5bWJvbHMgYXJlIG1pc3NpbmcsIGFkZCB0aGVtLiAgKi8KLS8qIEBAIFNob3VsZCB3ZSBvbmx5IGJlIGFkZGluZyBtaXNzaW5nIHN5bWJvbHMsIG9yIG92ZXJyaWRpbmcgdGhlIGF1eAotICAgdmFsdWVzIGZvciBleGlzdGluZyBzZWN0aW9uIHN5bWJvbHM/ICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgbnN5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgYXN5bWJvbCAqKnN5bXBwID0gYWJmZC0+b3V0c3ltYm9sczsKLSAgYXN5bWJvbCAqKnN5bXBwMjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBuZWVkX3RleHQgPSAxLCBuZWVkX2RhdGEgPSAxLCBuZWVkX2JzcyA9IDEsIG5lZWRfZmlsZSA9IDE7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5zeW1zOyBpKyspCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bXBwW2ldKTsKLSAgICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgICBpZiAoY3N5bSkKLQl7Ci0JICAvKiBvbmx5IGRvIHRoaXMgaWYgdGhlcmUgaXMgYSBjb2ZmIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dAotCSAgIHN5bWJvbCAqLwotCSAgaWYgKGNzeW0tPm5hdGl2ZSAmJiBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKLQkgICAgewotCSAgICAgIG5lZWRfZmlsZSA9IDA7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIG5hbWUgPSBjc3ltLT5zeW1ib2wubmFtZTsKLQkgIGlmICghbmFtZSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoIXN0cmNtcCAobmFtZSwgX1RFWFQpKQotCSAgICBuZWVkX3RleHQgPSAwOwotI2lmZGVmIEFQT0xMT19NNjgKLQkgIGVsc2UgaWYgKCFzdHJjbXAgKG5hbWUsICIud3RleHQiKSkKLQkgICAgbmVlZF90ZXh0ID0gMDsKLSNlbmRpZgotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgX0RBVEEpKQotCSAgICBuZWVkX2RhdGEgPSAwOwotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgX0JTUykpCi0JICAgIG5lZWRfYnNzID0gMDsKLQl9Ci0gICAgfQotICAvKiBOb3cgaSA9PSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKS4gICovCi0gIC8qIEBAIEZvciBub3csIGRvbid0IGRlYWwgd2l0aCAuZmlsZSBzeW1ib2wuICAqLwotICBuZWVkX2ZpbGUgPSAwOwotCi0gIGlmICghbmVlZF90ZXh0ICYmICFuZWVkX2RhdGEgJiYgIW5lZWRfYnNzICYmICFuZWVkX2ZpbGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIG5zeW1zICs9IG5lZWRfdGV4dCArIG5lZWRfZGF0YSArIG5lZWRfYnNzICsgbmVlZF9maWxlOwotICBzeW1wcDIgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChhYmZkLCBuc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIGlmICghc3ltcHAyKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtY3B5IChzeW1wcDIsIHN5bXBwLCBpICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWYgKG5lZWRfZmlsZSkKLSAgICB7Ci0gICAgICAvKiBAQCBHZW5lcmF0ZSBmYWtlIC5maWxlIHN5bWJvbCwgaW4gc3ltcHAyW2ldLCBhbmQgaW5jcmVtZW50IGkuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBpZiAobmVlZF90ZXh0KQotICAgIHN5bXBwMltpKytdID0gY29mZl9zZWN0aW9uX3N5bWJvbCAoYWJmZCwgX1RFWFQpOwotICBpZiAobmVlZF9kYXRhKQotICAgIHN5bXBwMltpKytdID0gY29mZl9zZWN0aW9uX3N5bWJvbCAoYWJmZCwgX0RBVEEpOwotICBpZiAobmVlZF9ic3MpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfQlNTKTsKLSAgQkZEX0FTU0VSVCAoaSA9PSBuc3ltcyk7Ci0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW1wcDIsIG5zeW1zKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFNVUFBSRVNTIDU1OCAqLwotLyogU1VQUFJFU1MgNTI5ICovCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICBib29sZWFuIGhhc3JlbG9jcyA9IGZhbHNlOwotICBib29sZWFuIGhhc2xpbm5vID0gZmFsc2U7Ci0gIGZpbGVfcHRyIHNjbl9iYXNlOwotICBmaWxlX3B0ciByZWxvY19iYXNlOwotICBmaWxlX3B0ciBsaW5lbm9fYmFzZTsKLSAgZmlsZV9wdHIgc3ltX2Jhc2U7Ci0gIHVuc2lnbmVkIGxvbmcgcmVsb2Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgbG5ub19zaXplID0gMDsKLSAgYm9vbGVhbiBsb25nX3NlY3Rpb25fbmFtZXM7Ci0gIGFzZWN0aW9uICp0ZXh0X3NlYyA9IE5VTEw7Ci0gIGFzZWN0aW9uICpkYXRhX3NlYyA9IE5VTEw7Ci0gIGFzZWN0aW9uICpic3Nfc2VjID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgaW50ZXJuYWxfZjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgaW50ZXJuYWxfYTsKLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICBzaXplX3Qgc3RyaW5nX3NpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotI2VuZGlmCi0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQotICAvKiBNYWtlIGEgcGFzcyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgdG8gY291bnQgbGluZSBudW1iZXIgZW50cmllcyBhbmQKLSAgICAgcHV0IHRoZW0gaW50byB0aGUgY29ycmVjdCBhc2VjdGlvbnMgKi8KLQotICBsbm5vX3NpemUgPSBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIChhYmZkKSAqIExJTkVTWjsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWxvY19iYXNlID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0KLSAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIHJlbG9jIGFuZCBsaW5ubyBhcmVhcyAqLwotCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgcmVsb2Nfc2l6ZSArPSBjdXJyZW50LT5yZWxvY19jb3VudCAqIFJFTFNaOwotCi0gIGxpbmVub19iYXNlID0gcmVsb2NfYmFzZSArIHJlbG9jX3NpemU7Ci0gIHN5bV9iYXNlID0gbGluZW5vX2Jhc2UgKyBsbm5vX3NpemU7Ci0KLSAgLyogSW5kaWNhdGUgaW4gZWFjaCBzZWN0aW9uLT5saW5lX2ZpbGVwb3MgaXRzIGFjdHVhbCBmaWxlIGFkZHJlc3MgKi8KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9Ci0gICAgICAgY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+bGluZW5vX2NvdW50KQotCXsKLQkgIGN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IGxpbmVub19iYXNlOwotCSAgY3VycmVudC0+bW92aW5nX2xpbmVfZmlsZXBvcyA9IGxpbmVub19iYXNlOwotCSAgbGluZW5vX2Jhc2UgKz0gY3VycmVudC0+bGluZW5vX2NvdW50ICogTElORVNaOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjdXJyZW50LT5saW5lX2ZpbGVwb3MgPSAwOwotCX0KLSAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCkKLQl7Ci0JICBjdXJyZW50LT5yZWxfZmlsZXBvcyA9IHJlbG9jX2Jhc2U7Ci0JICByZWxvY19iYXNlICs9IGN1cnJlbnQtPnJlbG9jX2NvdW50ICogUkVMU1o7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1cnJlbnQtPnJlbF9maWxlcG9zID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIHNlY3Rpb24gaGVhZGVycyB0byB0aGUgZmlsZS4gICovCi0gIGludGVybmFsX2YuZl9uc2NucyA9IDA7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLSAgICBzY25fYmFzZSA9IEZJTEhTWiArIEFPVVRTWjsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNjbl9iYXNlID0gRklMSFNaOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0Jc2NuX2Jhc2UgKz0gQU9VVFNaOwotICAgICAgZWxzZQotCXNjbl9iYXNlICs9IFNNQUxMX0FPVVRTWjsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNjbl9iYXNlLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbG9uZ19zZWN0aW9uX25hbWVzID0gZmFsc2U7Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIGN1cnJlbnQgIT0gTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIHNlY3Rpb247Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIElmIHdlJ3ZlIGdvdCBhIC5yZWxvYyBzZWN0aW9uLCByZW1lbWJlci4gKi8KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgIi5yZWxvYyIpID09IDApCi0JewotCSAgcGVfZGF0YSAoYWJmZCktPmhhc19yZWxvY19zZWN0aW9uID0gMTsKLQl9Ci0jZW5kaWYKLQotI2VuZGlmCi0gICAgICBpbnRlcm5hbF9mLmZfbnNjbnMrKzsKLQotICAgICAgc3RybmNweSAoc2VjdGlvbi5zX25hbWUsIGN1cnJlbnQtPm5hbWUsIFNDTk5NTEVOKTsKLQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gICAgICAvKiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGluIFBFLiAgVGhpcyBtdXN0IGJlIGNvbXBhdGlibGUKLSAgICAgICAgIHdpdGggdGhlIGNvZGUgaW4gY29mZl93cml0ZV9zeW1ib2xzLiAgKi8KLSAgICAgIHsKLQlzaXplX3QgbGVuOwotCi0JbGVuID0gc3RybGVuIChjdXJyZW50LT5uYW1lKTsKLQlpZiAobGVuID4gU0NOTk1MRU4pCi0JICB7Ci0JICAgIG1lbXNldCAoc2VjdGlvbi5zX25hbWUsIDAsIFNDTk5NTEVOKTsKLQkgICAgc3ByaW50ZiAoc2VjdGlvbi5zX25hbWUsICIvJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHN0cmluZ19zaXplKTsKLQkgICAgc3RyaW5nX3NpemUgKz0gbGVuICsgMTsKLQkgICAgbG9uZ19zZWN0aW9uX25hbWVzID0gdHJ1ZTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgX0xJQgotICAgICAgLyogQWx3YXlzIHNldCBzX3ZhZGRyIG9mIC5saWIgdG8gMC4gIFRoaXMgaXMgcmlnaHQgZm9yIFNWUjMuMgotCSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQlzZWN0aW9uLnNfdmFkZHIgPSAwOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICBzZWN0aW9uLnNfdmFkZHIgPSBjdXJyZW50LT52bWE7Ci0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSBjdXJyZW50LT5sbWE7Ci0gICAgICBzZWN0aW9uLnNfc2l6ZSA9ICBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFJlbWluZGVyOiBzX3BhZGRyIGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMCi0JICAmJiBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMKQotCXNlY3Rpb24uc19wYWRkciA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemU7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3BhZGRyID0gMDsKLSNlbmRpZgotCi0gICAgICAvKgotCSBJZiB0aGlzIHNlY3Rpb24gaGFzIG5vIHNpemUgb3IgaXMgdW5sb2FkYWJsZSB0aGVuIHRoZSBzY25wdHIKLQkgd2lsbCBiZSAwIHRvbwotCSAqLwotICAgICAgaWYgKGN1cnJlbnQtPl9yYXdfc2l6ZSA9PSAwIHx8Ci0JICAoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKSkgPT0gMCkKLQl7Ci0JICBzZWN0aW9uLnNfc2NucHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7Ci0JfQotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0gICAgICBzZWN0aW9uLnNfbmxubm8gPSBjdXJyZW50LT5saW5lbm9fY291bnQ7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgIT0gMCkKLQloYXNyZWxvY3MgPSB0cnVlOwotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCAhPSAwKQotCWhhc2xpbm5vID0gdHJ1ZTsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgLyogSW5kaWNhdGUgdGhlIHVzZSBvZiBhbiBYQ09GRiBvdmVyZmxvdyBzZWN0aW9uIGhlYWRlci4gICovCi0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IGN1cnJlbnQtPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JewotCSAgc2VjdGlvbi5zX25yZWxvYyA9IDB4ZmZmZjsKLQkgIHNlY3Rpb24uc19ubG5ubyA9IDB4ZmZmZjsKLQl9Ci0jZW5kaWYKLQotICAgICAgc2VjdGlvbi5zX2ZsYWdzID0gc2VjX3RvX3N0eXBfZmxhZ3MgKGN1cnJlbnQtPm5hbWUsIGN1cnJlbnQtPmZsYWdzKTsKLQotICAgICAgaWYgKCFzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9URVhUKSkKLQl7Ci0JICB0ZXh0X3NlYyA9IGN1cnJlbnQ7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0RBVEEpKQotCXsKLQkgIGRhdGFfc2VjID0gY3VycmVudDsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChjdXJyZW50LT5uYW1lLCBfQlNTKSkKLQl7Ci0JICBic3Nfc2VjID0gY3VycmVudDsKLQl9Ci0KLSNpZmRlZiBJOTYwCi0gICAgICBzZWN0aW9uLnNfYWxpZ24gPSAoY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyCi0JCQkgPyAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcgotCQkJIDogMCk7Ci0jZWxzZQotI2lmZGVmIFRJQzgwQ09GRgotICAgICAgc2VjdGlvbi5zX2ZsYWdzIHw9IChjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIgJiAweEYpIDw8IDg7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBzdXBwcmVzcyBvdXRwdXQgb2YgdGhlIHNlY3Rpb25zIGlmIHRoZXkgYXJlIG51bGwuICBsZCBpbmNsdWRlcwotCSB0aGUgYnNzIGFuZCBkYXRhIHNlY3Rpb25zIGV2ZW4gaWYgdGhlcmUgaXMgbm8gc2l6ZSBhc3NpZ25lZAotCSB0byB0aGVtLiAgTlQgbG9hZGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiB0aGVzZSBzZWN0aW9uIGhlYWRlcnMgYXJlCi0JIGluY2x1ZGVkIGlmIHRoZSBzZWN0aW9ucyB0aGVtc2VsdmVzIGFyZSBub3QgbmVlZGVkICovCi0gICAgICBpZiAoc2VjdGlvbi5zX3NpemUgPT0gMCkKLQlpbnRlcm5hbF9mLmZfbnNjbnMtLTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCXsKLQkgIFNDTkhEUiBidWZmOwotCSAgaWYgKGNvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAmc2VjdGlvbiwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICgmYnVmZiksIDEsIFNDTkhTWiwgYWJmZCkgIT0gU0NOSFNaKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICAvKiBQRSBzdG9yZXMgQ09NREFUIHNlY3Rpb24gaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIElmCi0gICAgICAgICB0aGlzIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gaGF2ZSBzb21lIENPTURBVCBpbmZvLCB0cmFjayBkb3duCi0gICAgICAgICB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIG1vZGlmeSBpdC4gICovCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaSwgY291bnQ7Ci0JICBhc3ltYm9sICoqcHN5bTsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW0gPSBOVUxMOwotCSAgYXN5bWJvbCAqKnBzeW1zZWM7Ci0KLQkgIHBzeW1zZWMgPSBOVUxMOwotCSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGZvciAoaSA9IDAsIHBzeW0gPSBhYmZkLT5vdXRzeW1ib2xzOyBpIDwgY291bnQ7IGkrKywgcHN5bSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCgqcHN5bSktPnNlY3Rpb24gIT0gY3VycmVudCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChwc3ltc2VjID09IE5VTEwpCi0JCXBzeW1zZWMgPSBwc3ltOwotCi0JICAgICAgLyogU2VlIGlmIHRoaXMgaXMgdGhlIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoc3RyY21wICgoKnBzeW0pLT5uYW1lLCBjdXJyZW50LT5uYW1lKSA9PSAwKQotCQl7Ci0JCSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsICpwc3ltKTsKLQkJICBpZiAoY3N5bSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPCAxCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgIT0gQ19TVEFUCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlICE9IFRfTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogSGVyZSAqUFNZTSBpcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yIENVUlJFTlQuICAqLwotCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBEaWQgd2UgZmluZCBpdD8KLQkgICAgIE5vdGUgdGhhdCB3ZSBtaWdodCBub3QgaWYgd2UncmUgY29udmVydGluZyB0aGUgZmlsZSBmcm9tCi0JICAgICBzb21lIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCi0JICBpZiAoaSA8IGNvdW50KQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotCi0JICAgICAgLyogV2UgZG9uJ3QgdG91Y2ggdGhlIHhfY2hlY2tzdW0gZmllbGQuICBUaGUKLQkJIHhfYXNzb2NpYXRlZCBmaWVsZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gICovCi0KLQkgICAgICBhdXggPSBjc3ltLT5uYXRpdmUgKyAxOwotCSAgICAgIHN3aXRjaCAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfTElOS19EVVBMSUNBVEVTKQotCQl7Ci0JCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWTsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPQotCQkgICAgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFM6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBUaGUgQ09NREFUIHN5bWJvbCBtdXN0IGJlIHRoZSBmaXJzdCBzeW1ib2wgZnJvbSB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEluIG9yZGVyIHRvIG1ha2UgdGhpcwotICAgICAgICAgICAgICAgICB3b3JrLCB3ZSBtb3ZlIHRoZSBDT01EQVQgc3ltYm9sIGJlZm9yZSB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgc3ltYm9sIHdlIGZvdW5kIGluIHRoZSBzZWFyY2ggYWJvdmUuICBJdCdzIE9LIHRvCi0gICAgICAgICAgICAgICAgIHJlYXJyYW5nZSB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgY29mZl9yZW51bWJlcl9zeW1ib2xzIGlzIGdvaW5nIHRvIHJlYXJyYW5nZSBpdAotICAgICAgICAgICAgICAgICBmdXJ0aGVyIGFuZCBmaXggdXAgYWxsIHRoZSBhdXggZW50cmllcy4gICovCi0JICAgICAgaWYgKHBzeW0gIT0gcHN5bXNlYykKLQkJewotCQkgIGFzeW1ib2wgKmhvbGQ7Ci0JCSAgYXN5bWJvbCAqKnBjb3B5OwotCi0JCSAgaG9sZCA9ICpwc3ltOwotCQkgIGZvciAocGNvcHkgPSBwc3ltOyBwY29weSA+IHBzeW1zZWM7IHBjb3B5LS0pCi0JCSAgICBwY29weVswXSA9IHBjb3B5Wy0xXTsKLQkJICAqcHN5bXNlYyA9IGhvbGQ7Ci0JCX0KLQkgICAgfQotCX0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLSAgICB9Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiBoZWFkZXIgdG8gaG9sZCB0aGUgY29ycmVjdCB2YWx1ZXMuICAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IGN1cnJlbnQtPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciBzY25oZHI7Ci0JICBTQ05IRFIgYnVmZjsKLQotCSAgaW50ZXJuYWxfZi5mX25zY25zKys7Ci0JICBzdHJuY3B5ICgmKHNjbmhkci5zX25hbWVbMF0pLCBjdXJyZW50LT5uYW1lLCA4KTsKLQkgIHNjbmhkci5zX3BhZGRyID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBzY25oZHIuc192YWRkciA9IGN1cnJlbnQtPmxpbmVub19jb3VudDsKLQkgIHNjbmhkci5zX3NpemUgPSAwOwotCSAgc2NuaGRyLnNfc2NucHRyID0gMDsKLQkgIHNjbmhkci5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCSAgc2NuaGRyLnNfbG5ub3B0ciA9IGN1cnJlbnQtPmxpbmVfZmlsZXBvczsKLQkgIHNjbmhkci5zX25yZWxvYyA9IGN1cnJlbnQtPnRhcmdldF9pbmRleDsKLQkgIHNjbmhkci5zX25sbm5vID0gY3VycmVudC0+dGFyZ2V0X2luZGV4OwotCSAgc2NuaGRyLnNfZmxhZ3MgPSBTVFlQX09WUkZMTzsKLQkgIGlmIChjb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgJnNjbmhkciwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBTQ05IU1osIGFiZmQpICE9IFNDTkhTWikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAvKiBPSywgbm93IHNldCB1cCB0aGUgZmlsZWhkci4uLiAqLwotCi0gIC8qIERvbid0IGluY2x1ZGUgdGhlIGludGVybmFsIGFicyBzZWN0aW9uIGluIHRoZSBzZWN0aW9uIGNvdW50ICovCi0KLSAgLyoKLSAgICAgV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeSB0aW1lIHlvdQotICAgICBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtIHNvcnJ5LiAgVGhpcwotICAgICBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28gaXQgY29tcGFyZXMgdGhlCi0gICAgIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0gZ251QGN5Z251cy5jb20KLSAgICAgKi8KLSAgaW50ZXJuYWxfZi5mX3RpbWRhdCA9IDA7Ci0KLSAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gMDsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX29wdGhkciA9IEFPVVRTWjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybmFsX2YuZl9vcHRoZHIgPSAwOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0JaW50ZXJuYWxfZi5mX29wdGhkciA9IEFPVVRTWjsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9mLmZfb3B0aGRyID0gU01BTExfQU9VVFNaOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICghaGFzcmVsb2NzKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX1JFTEZMRzsKLSAgaWYgKCFoYXNsaW5ubykKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9MTk5POwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRVhFQzsKLQotICAvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyBmb3IgUFBDX1BFISAqLwotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXUjsKLSAgZWxzZQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXOwotCi0jaWZkZWYgVElDODBfVEFSR0VUX0lECi0gIGludGVybmFsX2YuZl90YXJnZXRfaWQgPSBUSUM4MF9UQVJHRVRfSUQ7Ci0jZW5kaWYKLQotICAvKgotICAgICBGSVhNRSwgc2hvdWxkIGRvIHNvbWV0aGluZyBhYm91dCB0aGUgb3RoZXIgYnl0ZSBvcmRlcnMgYW5kCi0gICAgIGFyY2hpdGVjdHVyZXMuCi0gICAgICovCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfU0hST0JKOwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIF9MT0FERVIpICE9IE5VTEwpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRFlOTE9BRDsKLSNlbmRpZgotCi0gIG1lbXNldCAoJmludGVybmFsX2EsIDAsIHNpemVvZiBpbnRlcm5hbF9hKTsKLQotICAvKiBTZXQgdXAgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBzdHVmZiAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbWFnaWMgPSAwOwotICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzID0gMDsKLSAgICBjb2ZmX3NldF9mbGFncyAoYWJmZCwgJm1hZ2ljLCAmZmxhZ3MpOwotICAgIGludGVybmFsX2YuZl9tYWdpYyA9IG1hZ2ljOwotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBmbGFnczsKLSAgICAvKiAuLi5hbmQgdGhlICJvcHQiaGRyLi4uICovCi0KLSNpZmRlZiBBMjlLCi0jaWZkZWYgVUxUUkEzCQkJLyogTllVJ3MgbWFjaGluZSAqLwotICAgIC8qIEZJWE1FOiBUaGlzIGlzIGEgYm9ndXMgY2hlY2suICBJIHJlYWxseSB3YW50IHRvIHNlZSBpZiB0aGVyZQotICAgICAqIGlzIGEgLnNoYnNzIG9yIGEgLnNoZGF0YSBzZWN0aW9uLCBpZiBzbyB0aGVuIHNldCB0aGUgbWFnaWMKLSAgICAgKiBudW1iZXIgdG8gaW5kaWNhdGUgYSBzaGFyZWQgZGF0YSBleGVjdXRhYmxlLgotICAgICAqLwotICAgIGlmIChpbnRlcm5hbF9mLmZfbnNjbnMgPj0gNykKLSAgICAgIGludGVybmFsX2EubWFnaWMgPSBTSE1BR0lDOyAvKiBTaGFyZWQgbWFnaWMgKi8KLSAgICBlbHNlCi0jZW5kaWYgLyogVUxUUkEzICovCi0gICAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTk1BR0lDOyAvKiBBc3N1bWUgc2VwYXJhdGUgaS9kICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEEyOUsgKi8KLSNpZmRlZiBUSUM4MENPRkYKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gVElDODBfQVJDSF9NQUdJQzsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogVElDODAgKi8KLSNpZmRlZiBJODYwCi0gICAgLyogRklYTUU6IFdoYXQgYXJlIHRoZSBhLm91dCBtYWdpYyBudW1iZXJzIGZvciB0aGUgaTg2MD8gICovCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IDA7Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEk4NjAgKi8KLSNpZmRlZiBJOTYwCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IChtYWdpYyA9PSBJOTYwUk9NQUdJQyA/IE5NQUdJQyA6IE9NQUdJQyk7Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEk5NjAgKi8KLSNpZiBNODgKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFBBR0VNQUdJQ0JDUzsKLSNlbmRpZiAvKiBNODggKi8KLQotI2lmIEFQT0xMT19NNjgKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE02OCkgfHwgZGVmaW5lZChXRTMySykgfHwgZGVmaW5lZChNNjhLKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbHNlCi0jaWYgZGVmaW5lZChUQVJHX0FVWCkKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gKGFiZmQtPmZsYWdzICYgRF9QQUdFRCA/IFBBR0VNQUdJQ1BFWEVDUEFHRUQgOgotCQkJYWJmZC0+ZmxhZ3MgJiBXUF9URVhUID8gUEFHRU1BR0lDUEVYRUNTV0FQUEVEIDoKLQkJCVBBR0VNQUdJQ0VYRUNTV0FQUEVEKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoUEFHRU1BR0lDUEVYRUNQQUdFRCkKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gUEFHRU1BR0lDUEVYRUNQQUdFRDsKLSNlbmRpZgotI2VuZGlmIC8qIFRBUkdfQVVYICovCi0jZW5kaWYgLyogTFlOWE9TICovCi0jZW5kaWYgLyogTTY4IHx8IFdFMzJLIHx8IE02OEsgKi8KLQotI2lmIGRlZmluZWQoQVJNKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gWk1BR0lDOwotI2VuZGlmIAotCi0jaWYgZGVmaW5lZChQUENfUEUpCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUM7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgTUNPUkVfUEUKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQzsKLSNlbmRpZiAKLQotI2lmIGRlZmluZWQoSTM4NikKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jaWYgZGVmaW5lZChMWU5YT1MpCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IExZTlhDT0ZGTUFHSUM7Ci0jZWxzZSAgLyogTFlOWE9TICovCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFpNQUdJQzsKLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBJMzg2ICovCi0KLSNpZiBkZWZpbmVkKFNQQVJDKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBTUEFSQyAqLwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA/IFJTNktfQU9VVEhEUl9aTUFHSUMgOgotICAgIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpID8gUlM2S19BT1VUSERSX05NQUdJQyA6Ci0gICAgUlM2S19BT1VUSERSX09NQUdJQzsKLSNlbmRpZgotCi0jaWZuZGVmIF9fQV9NQUdJQ19TRVRfXwotI2luY2x1ZGUgIllvdXIgYW91dGhkciBtYWdpYyBudW1iZXIgaXMgbm90IGJlaW5nIHNldCEiCi0jZWxzZQotI3VuZGVmIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmCi0gIH0KLQotICAvKiBGSVhNRTogRG9lcyBhbnlib2R5IGV2ZXIgc2V0IHRoaXMgdG8gYW5vdGhlciB2YWx1ZT8gICovCi0gIGludGVybmFsX2EudnN0YW1wID0gMDsKLQotICAvKiBOb3cgc2hvdWxkIHdyaXRlIHJlbG9jcywgc3RyaW5ncywgc3ltcyAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gc3ltX2Jhc2U7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaW50IGZpcnN0dW5kZWY7Ci0jaWYgMAotICAgICAgaWYgKCFjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgICAgaWYgKCFjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgKGFiZmQsICZmaXJzdHVuZGVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBjb2ZmX21hbmdsZV9zeW1ib2xzIChhYmZkKTsKLSAgICAgIGlmICghIGNvZmZfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9saW5lbnVtYmVycyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9yZWxvY3MgKGFiZmQsIGZpcnN0dW5kZWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgZWxzZSBpZiAobG9uZ19zZWN0aW9uX25hbWVzKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGhhdmUgbG9uZyBzZWN0aW9uIG5hbWVzIHdlIGhhdmUgdG8gd3JpdGUgb3V0IHRoZSBzdHJpbmcKLSAgICAgICAgIHRhYmxlIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0jaWZkZWYgUFBDX1BFCi0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICAvKiBQb3dlclBDIFBFIGFwcGVhcnMgdG8gcmVxdWlyZSB0aGF0IGFsbCBleGVjdXRhYmxlIGZpbGVzIGJlCi0gICAgICAgICByb3VuZGVkIHVwIHRvIHRoZSBwYWdlIHNpemUuICAqLwotICAgICAgYiA9IDA7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBCRkRfQUxJR04gKHN5bV9iYXNlLCBDT0ZGX1BBR0VfU0laRSkgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotI2VuZGlmCi0KLSAgLyogSWYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCwgdGhlbiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBDT0ZGCi0gICAgIGJhY2tlbmQgbGlua2VyLCBhbmQgb2JqX3Jhd19zeW1lbnRfY291bnQgaXMgbm90IHZhbGlkIHVudGlsIGFmdGVyCi0gICAgIGNvZmZfd3JpdGVfc3ltYm9scyBpcyBjYWxsZWQuICAqLwotICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IHN5bV9iYXNlOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgLyogQUlYIGFwcGVhcnMgdG8gcmVxdWlyZSB0aGF0IEZfUkVMRkxHIG5vdCBiZSBzZXQgaWYgdGhlcmUgYXJlCi0gICAgICAgICBsb2NhbCBzeW1ib2xzIGJ1dCBubyByZWxvY2F0aW9ucy4gICovCi0gICAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgJj1+IEZfUkVMRkxHOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxvbmdfc2VjdGlvbl9uYW1lcykKLQlpbnRlcm5hbF9mLmZfc3ltcHRyID0gc3ltX2Jhc2U7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfZi5mX3N5bXB0ciA9IDA7Ci0gICAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9MU1lNUzsKLSAgICB9Ci0KLSAgaWYgKHRleHRfc2VjKQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHRleHRfc2VjKTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IGludGVybmFsX2EudHNpemUgPyB0ZXh0X3NlYy0+dm1hIDogMDsKLSAgICB9Ci0gIGlmIChkYXRhX3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChkYXRhX3NlYyk7Ci0gICAgICBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBpbnRlcm5hbF9hLmRzaXplID8gZGF0YV9zZWMtPnZtYSA6IDA7Ci0gICAgfQotICBpZiAoYnNzX3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLmJzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChic3Nfc2VjKTsKLSAgICAgIGlmIChpbnRlcm5hbF9hLmJzaXplICYmIGJzc19zZWMtPnZtYSA8IGludGVybmFsX2EuZGF0YV9zdGFydCkKLQlpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBic3Nfc2VjLT52bWE7Ci0gICAgfQotCi0gIGludGVybmFsX2EuZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBpbnRlcm5hbF9mLmZfbnN5bXMgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0gICAgewotICAgICAgYmZkX3ZtYSB0b2M7Ci0gICAgICBhc2VjdGlvbiAqbG9hZGVyX3NlYzsKLQotICAgICAgaW50ZXJuYWxfYS52c3RhbXAgPSAxOwotCi0gICAgICBpbnRlcm5hbF9hLm9fc25lbnRyeSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5zbmVudHJ5OwotICAgICAgaWYgKGludGVybmFsX2Eub19zbmVudHJ5ID09IDApCi0JaW50ZXJuYWxfYS5lbnRyeSA9IChiZmRfdm1hKSAtMTsKLQotICAgICAgaWYgKHRleHRfc2VjICE9IE5VTEwpCi0JewotCSAgaW50ZXJuYWxfYS5vX3NudGV4dCA9IHRleHRfc2VjLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbnRleHQgPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCB0ZXh0X3NlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludGVybmFsX2Eub19zbnRleHQgPSAwOwotCSAgaW50ZXJuYWxfYS5vX2FsZ250ZXh0ID0gMDsKLQl9Ci0gICAgICBpZiAoZGF0YV9zZWMgIT0gTlVMTCkKLQl7Ci0JICBpbnRlcm5hbF9hLm9fc25kYXRhID0gZGF0YV9zZWMtPnRhcmdldF9pbmRleDsKLQkgIGludGVybmFsX2Eub19hbGduZGF0YSA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIGRhdGFfc2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50ZXJuYWxfYS5vX3NuZGF0YSA9IDA7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbmRhdGEgPSAwOwotCX0KLSAgICAgIGxvYWRlcl9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgICAgIGlmIChsb2FkZXJfc2VjICE9IE5VTEwpCi0JaW50ZXJuYWxfYS5vX3NubG9hZGVyID0gbG9hZGVyX3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgZWxzZQotCWludGVybmFsX2Eub19zbmxvYWRlciA9IDA7Ci0gICAgICBpZiAoYnNzX3NlYyAhPSBOVUxMKQotCWludGVybmFsX2Eub19zbmJzcyA9IGJzc19zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9hLm9fc25ic3MgPSAwOwotCi0gICAgICB0b2MgPSB4Y29mZl9kYXRhIChhYmZkKS0+dG9jOwotICAgICAgaW50ZXJuYWxfYS5vX3RvYyA9IHRvYzsKLSAgICAgIGludGVybmFsX2Eub19zbnRvYyA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5zbnRvYzsKLQotICAgICAgaW50ZXJuYWxfYS5vX21vZHR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZTsKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAhPSAtMSkKLQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlOwotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLQkgICAgICBpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLQkgICAgICBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSAwKQotCQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDM7Ci0JICAgICAgZWxzZQotCQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBpbnRlcm5hbF9hLm9fbWF4c3RhY2sgPSB4Y29mZl9kYXRhIChhYmZkKS0+bWF4c3RhY2s7Ci0gICAgICBpbnRlcm5hbF9hLm9fbWF4ZGF0YSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5tYXhkYXRhOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIG5vdyB3cml0ZSB0aGVtICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHsKLSAgICBjaGFyIGJ1ZmZbRklMSFNaXTsKLSAgICBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIChQVFIpICYgaW50ZXJuYWxfZiwgKFBUUikgYnVmZik7Ci0gICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZiwgMSwgRklMSFNaLCBhYmZkKSAhPSBGSUxIU1opCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBwZWljb2RlLmggZmlsbHMgaW4gYSBQRUFPVVRIRFIsIG5vdCBhbiBBT1VUSERSLiAKLQkgaW5jbHVkZS9jb2ZmL3BlLmggc2V0cyBBT1VUU1ogPT0gc2l6ZW9mKFBFQU9VVEhEUikpICovCi0gICAgICBjaGFyIGJ1ZmZbQU9VVFNaXTsKLSAgICAgIGNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJiBpbnRlcm5hbF9hLCAoUFRSKSBidWZmKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmYsIDEsIEFPVVRTWiwgYWJmZCkgIT0gQU9VVFNaKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGVsc2UKLSAgICB7Ci0gICAgICBBT1VUSERSIGJ1ZmY7Ci0gICAgICBzaXplX3Qgc2l6ZTsKLQotICAgICAgLyogWENPRkYgc2VlbXMgdG8gYWx3YXlzIHdyaXRlIGF0IGxlYXN0IGEgc21hbGwgYS5vdXQgaGVhZGVyLiAgKi8KLSAgICAgIGNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2EsIChQVFIpICZidWZmKTsKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCXNpemUgPSBBT1VUU1o7Ci0gICAgICBlbHNlCi0Jc2l6ZSA9IFNNQUxMX0FPVVRTWjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkJLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIGRlZmluZWQoX0xJQikgJiYgIWRlZmluZWQoVEFSR19BVVgpCi0KLSAgIC8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIGZpZWxkIG9mIGEgLmxpYiBzZWN0aW9uIGlzIHVzZWQgdG8gaG9sZCB0aGUKLSAgICAgIG51bWJlciBvZiBzaGFyZWQgbGlicmFyaWVzIGluIHRoZSBzZWN0aW9uLiAgVGhpcyBjb2RlIGNvdW50cyB0aGUKLSAgICAgIG51bWJlciBvZiBzZWN0aW9ucyBiZWluZyB3cml0dGVuLCBhbmQgaW5jcmVtZW50cyB0aGUgbG1hIGZpZWxkCi0gICAgICB3aXRoIHRoZSBudW1iZXIuCi0KLSAgICAgIEkgaGF2ZSBmb3VuZCBubyBkb2N1bWVudGF0aW9uIG9uIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uCi0gICAgICBFeHBlcmltZW50YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgemVybyBvciBtb3JlCi0gICAgICByZWNvcmRzLCBlYWNoIG9mIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLQotICAgICAgLSBhIChmb3VyIGJ5dGUpIHdvcmQgaG9sZGluZyB0aGUgbGVuZ3RoIG9mIHRoaXMgcmVjb3JkLCBpbiB3b3JkcywKLSAgICAgIC0gYSB3b3JkIHRoYXQgYWx3YXlzIHNlZW1zIHRvIGJlIHNldCB0byAiMiIsCi0gICAgICAtIHRoZSBwYXRoIHRvIGEgc2hhcmVkIGxpYnJhcnksIG51bGwtdGVybWluYXRlZCBhbmQgdGhlbiBwYWRkZWQKLSAgICAgICAgdG8gYSB3aG9sZSB3b3JkIGJvdW5kYXJ5LgotCi0gICAgICBiZmRfYXNzZXJ0IGNhbGxzIGhhdmUgYmVlbiBhZGRlZCB0byBhbGVydCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUKLSAgICAgIHRvIHdyaXRlIGEgc2VjdGlvbiB3aGljaCBkb2Vzbid0IGZvbGxvdyB0aGVzZSBhc3N1bXB0aW9ucy4gIFRoZQotICAgICAgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgb24gSVNDIDQuMSBieSBtZSwgYW5kIG9uIFNDTyBieSBSb2JlcnQgTGlwZQotICAgICAgPHJvYmVydGxAYXJuZXQuY29tPiAoVGhhbmtzISkuCi0gIAotICAgICAgR3ZyYW4gVWRkZWJvcmcgPGd2cmFuQHVkZGVib3JnLnBwLnNlPiAqLwotCi0gICAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICAgIHsKLQliZmRfYnl0ZSAqcmVjLCAqcmVjZW5kOwotCi0JcmVjID0gKGJmZF9ieXRlICopIGxvY2F0aW9uOwotCXJlY2VuZCA9IHJlYyArIGNvdW50OwotCXdoaWxlIChyZWMgPCByZWNlbmQpCi0JICB7Ci0JICAgICsrc2VjdGlvbi0+bG1hOwotCSAgICByZWMgKz0gYmZkX2dldF8zMiAoYWJmZCwgcmVjKSAqIDQ7Ci0JICB9Ci0KLQlCRkRfQVNTRVJUIChyZWMgPT0gcmVjZW5kKTsKLSAgICAgIH0KLQotI2VuZGlmCi0KLSAgLyogRG9uJ3Qgd3JpdGUgb3V0IGJzcyBzZWN0aW9ucyAtIG9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0bwotICAgICAgIHNlZSBpZiB0aGUgZmlsZXBvcyBoYXMgbm90IGJlZW4gc2V0LiAqLwotICBpZiAoc2VjdGlvbi0+ZmlsZXBvcyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLSNpZiAwCi1zdGF0aWMgYm9vbGVhbgotY29mZl9jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpKQotICAgIHN3aXRjaCAoYWJmZC0+Zm9ybWF0KQotICAgICAgewotICAgICAgY2FzZSBiZmRfYXJjaGl2ZToKLQlpZiAoIV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9vYmplY3Q6Ci0JaWYgKCFjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gIC8qIFdlIGRlcGVuZCBvbiBiZmRfY2xvc2UgdG8gZnJlZSBhbGwgdGhlIG1lbW9yeSBvbiB0aGUgb2JqYWxsb2MuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBQVFIKLWJ1eV9hbmRfcmVhZCAoYWJmZCwgd2hlcmUsIHNlZWtfZGlyZWN0aW9uLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotICAgICBpbnQgc2Vla19kaXJlY3Rpb247Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgYXJlYSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmICghYXJlYSkKLSAgICByZXR1cm4gKE5VTEwpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBzZWVrX2RpcmVjdGlvbikgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGFyZWEsIDEsIHNpemUsIGFiZmQpICE9IHNpemUpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgcmV0dXJuIChhcmVhKTsKLX0JCQkJLyogYnV5X2FuZF9yZWFkKCkgKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlSZWFkaW5nIGxpbmVudW1iZXJzCi0KLQlDcmVhdGluZyB0aGUgbGluZW51bWJlciB0YWJsZSBpcyBkb25lIGJ5IHJlYWRpbmcgaW4gdGhlIGVudGlyZQotCWNvZmYgbGluZW51bWJlciB0YWJsZSwgYW5kIGNyZWF0aW5nIGFub3RoZXIgdGFibGUgZm9yIGludGVybmFsIHVzZS4KLQotCUEgY29mZiBsaW5lbnVtYmVyIHRhYmxlIGlzIHN0cnVjdHVyZWQgc28gdGhhdCBlYWNoIGZ1bmN0aW9uCi0JaXMgbWFya2VkIGFzIGhhdmluZyBhIGxpbmUgbnVtYmVyIG9mIDAuIEVhY2ggbGluZSB3aXRoaW4gdGhlCi0JZnVuY3Rpb24gaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGZpcnN0IGxpbmUgaW4gdGhlIGZ1bmN0aW9uLiBUaGUKLQliYXNlIG9mIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhYmxlIGlzIHN0b3JlZCBpbgotCXRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbi4KLQotCVRoZSBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgZnJvbSB0aGUgZXh0ZXJuYWwgdG8gdGhlIGludGVybmFsCi0JdGFibGUsIGFuZCBlYWNoIHN5bWJvbCB3aGljaCBtYXJrcyBhIGZ1bmN0aW9uIGlzIG1hcmtlZCBieQotCXBvaW50aW5nIGl0cy4uLgotCi0JSG93IGRvZXMgdGhpcyB3b3JrID8KLQotKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2x1cnBfbGluZV90YWJsZSAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotewotICBMSU5FTk8gKm5hdGl2ZV9saW5lbm87Ci0gIGFsZW50ICpsaW5lbm9fY2FjaGU7Ci0KLSAgQkZEX0FTU0VSVCAoYXNlY3QtPmxpbmVubyA9PSAoYWxlbnQgKikgTlVMTCk7Ci0KLSAgbmF0aXZlX2xpbmVubyA9IChMSU5FTk8gKikgYnV5X2FuZF9yZWFkIChhYmZkLAotCQkJCQkgICBhc2VjdC0+bGluZV9maWxlcG9zLAotCQkJCQkgICBTRUVLX1NFVCwKLQkJCQkJICAgKHNpemVfdCkgKExJTkVTWiAqCi0JCQkJCQkgICAgIGFzZWN0LT5saW5lbm9fY291bnQpKTsKLSAgbGluZW5vX2NhY2hlID0KLSAgICAoYWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCAoc2l6ZV90KSAoKGFzZWN0LT5saW5lbm9fY291bnQgKyAxKSAqIHNpemVvZiAoYWxlbnQpKSk7Ci0gIGlmIChsaW5lbm9fY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgICBhbGVudCAqY2FjaGVfcHRyID0gbGluZW5vX2NhY2hlOwotICAgICAgTElORU5PICpzcmMgPSBuYXRpdmVfbGluZW5vOwotCi0gICAgICB3aGlsZSAoY291bnRlciA8IGFzZWN0LT5saW5lbm9fY291bnQpCi0JewotCSAgc3RydWN0IGludGVybmFsX2xpbmVubyBkc3Q7Ci0JICBjb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCBzcmMsICZkc3QpOwotCSAgY2FjaGVfcHRyLT5saW5lX251bWJlciA9IGRzdC5sX2xubm87Ci0KLQkgIGlmIChjYWNoZV9wdHItPmxpbmVfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICBib29sZWFuIHdhcm5lZDsKLQkgICAgICBsb25nIHN5bW5keDsKLQkgICAgICBjb2ZmX3N5bWJvbF90eXBlICpzeW07Ci0KLQkgICAgICB3YXJuZWQgPSBmYWxzZTsKLQkgICAgICBzeW1uZHggPSBkc3QubF9hZGRyLmxfc3ltbmR4OwotCSAgICAgIGlmIChzeW1uZHggPCAwCi0JCSAgfHwgKHVuc2lnbmVkIGxvbmcpIHN5bW5keCA+PSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIGxpbmUgbnVtYmVycyIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBkc3QubF9hZGRyLmxfc3ltbmR4KTsKLQkJICBzeW1uZHggPSAwOwotCQkgIHdhcm5lZCA9IHRydWU7Ci0JCX0KLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIG5vdCBiZSBjYXN0aW5nIGJldHdlZW4gaW50cyBhbmQKLSAgICAgICAgICAgICAgICAgcG9pbnRlcnMgbGlrZSB0aGlzLiAgKi8KLQkgICAgICBzeW0gPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkJICAgICAoKHN5bW5keCArIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpCi0JCSAgICAgIC0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMpKTsKLQkgICAgICBjYWNoZV9wdHItPnUuc3ltID0gKGFzeW1ib2wgKikgc3ltOwotCSAgICAgIGlmIChzeW0tPmxpbmVubyAhPSBOVUxMICYmICEgd2FybmVkKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IHdhcm5pbmc6IGR1cGxpY2F0ZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgYCVzJyIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgIGJmZF9hc3ltYm9sX25hbWUgKCZzeW0tPnN5bWJvbCkpOwotCQl9Ci0JICAgICAgc3ltLT5saW5lbm8gPSBjYWNoZV9wdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNhY2hlX3B0ci0+dS5vZmZzZXQgPSBkc3QubF9hZGRyLmxfcGFkZHIKLQkJLSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIGFzZWN0KTsKLQkgICAgfQkJCS8qIElmIG5vIGxpbmVudW1iZXIgZXhwZWN0IGEgc3ltYm9sIGluZGV4ICovCi0KLQkgIGNhY2hlX3B0cisrOwotCSAgc3JjKys7Ci0JICBjb3VudGVyKys7Ci0JfQotICAgICAgY2FjaGVfcHRyLT5saW5lX251bWJlciA9IDA7Ci0KLSAgICB9Ci0gIGFzZWN0LT5saW5lbm8gPSBsaW5lbm9fY2FjaGU7Ci0gIC8qIEZJWE1FLCBmcmVlIG5hdGl2ZV9saW5lbm8gaGVyZSwgb3IgdXNlIGFsbG9jYSBvciBzb21ldGhpbmcuICovCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZV9zeW1ib2xzOwotICBjb2ZmX3N5bWJvbF90eXBlICpjYWNoZWRfYXJlYTsKLSAgdW5zaWduZWQgaW50ICp0YWJsZV9wdHI7Ci0KLSAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9zeW1ib2xzID0gMDsKLQotICBpZiAob2JqX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFJlYWQgaW4gdGhlIHN5bWJvbCB0YWJsZSAqLwotICBpZiAoKG5hdGl2ZV9zeW1ib2xzID0gY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIgKGFiZmQpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiAoZmFsc2UpOwotICAgIH0JCQkJLyogb24gZXJyb3IgKi8KLQotICAvKiBBbGxvY2F0ZSBlbm91Z2ggcm9vbSBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIGNhY2hlZCBmb3JtICovCi0gIGNhY2hlZF9hcmVhID0gKChjb2ZmX3N5bWJvbF90eXBlICopCi0JCSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgICAgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCQkJICAgICAqIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpKSk7Ci0KLSAgaWYgKGNhY2hlZF9hcmVhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICB0YWJsZV9wdHIgPSAoKHVuc2lnbmVkIGludCAqKQotCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkKLQkJCSAgICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSkpOwotCi0gIGlmICh0YWJsZV9wdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpkc3QgPSBjYWNoZWRfYXJlYTsKLSAgICAgIHVuc2lnbmVkIGludCBsYXN0X25hdGl2ZV9pbmRleCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIHVuc2lnbmVkIGludCB0aGlzX2luZGV4ID0gMDsKLSAgICAgIHdoaWxlICh0aGlzX2luZGV4IDwgbGFzdF9uYXRpdmVfaW5kZXgpCi0JewotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqc3JjID0gbmF0aXZlX3N5bWJvbHMgKyB0aGlzX2luZGV4OwotCSAgdGFibGVfcHRyW3RoaXNfaW5kZXhdID0gbnVtYmVyX29mX3N5bWJvbHM7Ci0JICBkc3QtPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotCSAgZHN0LT5zeW1ib2wubmFtZSA9IChjaGFyICopIChzcmMtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KTsKLQkgIC8qIFdlIHVzZSB0aGUgbmF0aXZlIG5hbWUgZmllbGQgdG8gcG9pbnQgdG8gdGhlIGNhY2hlZCBmaWVsZC4gICovCi0JICBzcmMtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gKGxvbmcpIGRzdDsKLQkgIGRzdC0+c3ltYm9sLnNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsCi0JCQkJCQkgICAgIHNyYy0+dS5zeW1lbnQubl9zY251bSk7Ci0JICBkc3QtPnN5bWJvbC5mbGFncyA9IDA7Ci0JICBkc3QtPmRvbmVfbGluZW5vID0gZmFsc2U7Ci0KLQkgIHN3aXRjaCAoc3JjLT51LnN5bWVudC5uX3NjbGFzcykKLQkgICAgewotI2lmZGVmIEk5NjAKLQkgICAgY2FzZSBDX0xFQUZFWFQ6Ci0jaWYgMAotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQgfCBCU0ZfRlVOQ1RJT047Ci0jZW5kaWYKLQkgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gbmV4dCBjYXNlICovCi0KLSNlbmRpZgotCi0JICAgIGNhc2UgQ19FWFQ6Ci0JICAgIGNhc2UgQ19XRUFLRVhUOgotI2lmIGRlZmluZWQgQVJNCi0gICAgICAgICAgICBjYXNlIENfVEhVTUJFWFQ6Ci0gICAgICAgICAgICBjYXNlIENfVEhVTUJFWFRGVU5DOgotI2VuZGlmCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0JICAgIGNhc2UgQ19ISURFWFQ6Ci0jZW5kaWYKLSNpZmRlZiBDX1NZU1RFTQotCSAgICBjYXNlIENfU1lTVEVNOgkvKiBTeXN0ZW0gV2lkZSB2YXJpYWJsZSAqLwotI2VuZGlmCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICAgICAgICAvKiBQRSB1c2VzIHN0b3JhZ2UgY2xhc3MgMHg2OCB0byBkZW5vdGUgYSBzZWN0aW9uIHN5bWJvbCAqLwotICAgICAgICAgICAgY2FzZSBDX1NFQ1RJT046Ci0JICAgIC8qIFBFIHVzZXMgc3RvcmFnZSBjbGFzcyAweDY5IGZvciBhIHdlYWsgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgICAgY2FzZSBDX05UX1dFQUs6Ci0jZW5kaWYKLQkgICAgICBpZiAoKHNyYy0+dS5zeW1lbnQubl9zY251bSkgPT0gMCkKLQkJewotCQkgIGlmICgoc3JjLT51LnN5bWVudC5uX3ZhbHVlKSA9PSAwKQotCQkgICAgewotCQkgICAgICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBCYXNlIHRoZSB2YWx1ZSBhcyBhbiBpbmRleCBmcm9tIHRoZSBiYXNlIG9mIHRoZQotCQkgICAgIHNlY3Rpb24gKi8KLQotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0KLSNpZiBkZWZpbmVkIENPRkZfV0lUSF9QRQotCQkgIC8qIFBFIHNldHMgdGhlIHN5bWJvbCB0byBhIHZhbHVlIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICAqLwotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlOwotI2Vsc2UKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkgICAgICAgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWEpOwotI2VuZGlmCi0KLQkJICBpZiAoSVNGQ04gKChzcmMtPnUuc3ltZW50Lm5fdHlwZSkpKQotCQkgICAgewotCQkgICAgICAvKiBBIGZ1bmN0aW9uIGV4dCBkb2VzIG5vdCBnbyBhdCB0aGUgZW5kIG9mIGEKLQkJCSBmaWxlLiAgKi8KLQkJICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQgfCBCU0ZfRlVOQ1RJT047Ci0JCSAgICB9Ci0JCX0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICAgIC8qIEEgQ19ISURFWFQgc3ltYm9sIGlzIG5vdCBnbG9iYWwuICAqLwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfSElERVhUKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkgICAgICAvKiBBIHN5bWJvbCB3aXRoIGEgY3NlY3QgZW50cnkgc2hvdWxkIG5vdCBnbyBhdCB0aGUgZW5kLiAgKi8KLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JCWRzdC0+c3ltYm9sLmZsYWdzIHw9IEJTRl9OT1RfQVRfRU5EOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX05UX1dFQUspCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19TRUNUSU9OCi0JCSAgJiYgc3JjLT51LnN5bWVudC5uX3NjbnVtID4gMCkKLQkJewotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCQl9Ci0jZW5kaWYKLQotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfV0VBS0VYVCkKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19TVEFUOgkvKiBzdGF0aWMJCQkgKi8KLSNpZmRlZiBJOTYwCi0JICAgIGNhc2UgQ19MRUFGU1RBVDoJLyogc3RhdGljIGxlYWYgcHJvY2VkdXJlICAgICAgICAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZCBBUk0gCi0gICAgICAgICAgICBjYXNlIENfVEhVTUJTVEFUOiAgIC8qIFRodW1iIHN0YXRpYyAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjYXNlIENfVEhVTUJMQUJFTDogIC8qIFRodW1iIGxhYmVsICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjYXNlIENfVEhVTUJTVEFURlVOQzovKiBUaHVtYiBzdGF0aWMgZnVuY3Rpb24gICAgICAgICovCi0jZW5kaWYKLQkgICAgY2FzZSBDX0xBQkVMOgkvKiBsYWJlbAkJCSAqLwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NudW0gPT0gLTIpCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkgICAgICBlbHNlCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCi0JICAgICAgLyogQmFzZSB0aGUgdmFsdWUgYXMgYW4gaW5kZXggZnJvbSB0aGUgYmFzZSBvZiB0aGUKLQkJIHNlY3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4gICovCi0JICAgICAgaWYgKGRzdC0+c3ltYm9sLnNlY3Rpb24pCi0JCXsKLSNpZiBkZWZpbmVkIENPRkZfV0lUSF9QRQotCQkgIC8qIFBFIHNldHMgdGhlIHN5bWJvbCB0byBhIHZhbHVlIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICAqLwotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlOwotI2Vsc2UKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkgICAgICAgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWEpOwotI2VuZGlmCi0JCX0KLQkgICAgICBlbHNlCi0JCWRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19NT1M6CS8qIG1lbWJlciBvZiBzdHJ1Y3R1cmUJICovCi0JICAgIGNhc2UgQ19FT1M6CS8qIGVuZCBvZiBzdHJ1Y3R1cmUJCSAqLwotI2lmZGVmIE5PVERFRgkJCS8qIENfQVVUT0FSRyBoYXMgdGhlIHNhbWUgdmFsdWUgKi8KLSNpZmRlZiBDX0dMQkxSRUcKLQkgICAgY2FzZSBDX0dMQkxSRUc6CS8qIEEyOWstc3BlY2lmaWMgc3RvcmFnZSBjbGFzcyAqLwotI2VuZGlmCi0jZW5kaWYKLQkgICAgY2FzZSBDX1JFR1BBUk06CS8qIHJlZ2lzdGVyIHBhcmFtZXRlcgkJICovCi0JICAgIGNhc2UgQ19SRUc6CS8qIHJlZ2lzdGVyIHZhcmlhYmxlCQkgKi8KLSNpZm5kZWYgVElDODBDT0ZGCi0jaWZkZWYgQ19BVVRPQVJHCi0JICAgIGNhc2UgQ19BVVRPQVJHOgkvKiA5NjAtc3BlY2lmaWMgc3RvcmFnZSBjbGFzcyAqLwotI2VuZGlmCi0jZW5kaWYKLQkgICAgY2FzZSBDX1RQREVGOgkvKiB0eXBlIGRlZmluaXRpb24JCSAqLwotCSAgICBjYXNlIENfQVJHOgotCSAgICBjYXNlIENfQVVUTzoJLyogYXV0b21hdGljIHZhcmlhYmxlICovCi0JICAgIGNhc2UgQ19GSUVMRDoJLyogYml0IGZpZWxkICovCi0JICAgIGNhc2UgQ19FTlRBRzoJLyogZW51bWVyYXRpb24gdGFnCQkgKi8KLQkgICAgY2FzZSBDX01PRToJLyogbWVtYmVyIG9mIGVudW1lcmF0aW9uCSAqLwotCSAgICBjYXNlIENfTU9VOgkvKiBtZW1iZXIgb2YgdW5pb24JCSAqLwotCSAgICBjYXNlIENfVU5UQUc6CS8qIHVuaW9uIHRhZwkJCSAqLwotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19GSUxFOgkvKiBmaWxlIG5hbWUJCQkgKi8KLQkgICAgY2FzZSBDX1NUUlRBRzoJLyogc3RydWN0dXJlIHRhZwkJICovCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0JICAgIGNhc2UgQ19HU1lNOgotCSAgICBjYXNlIENfTFNZTToKLQkgICAgY2FzZSBDX1BTWU06Ci0JICAgIGNhc2UgQ19SU1lNOgotCSAgICBjYXNlIENfUlBTWU06Ci0JICAgIGNhc2UgQ19TVFNZTToKLQkgICAgY2FzZSBDX0JDT01NOgotCSAgICBjYXNlIENfRUNPTU06Ci0JICAgIGNhc2UgQ19ERUNMOgotCSAgICBjYXNlIENfRU5UUlk6Ci0JICAgIGNhc2UgQ19GVU46Ci0JICAgIGNhc2UgQ19FU1RBVDoKLSNlbmRpZgotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0JICAgIGNhc2UgQ19CSU5DTDoJLyogYmVnaW5uaW5nIG9mIGluY2x1ZGUgZmlsZSAgICAgKi8KLQkgICAgY2FzZSBDX0VJTkNMOgkvKiBlbmRpbmcgb2YgaW5jbHVkZSBmaWxlICAgICAgICAqLwotCSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBhY3R1YWxseSBhIHBvaW50ZXIgaW50byB0aGUgbGluZSBudW1iZXJzCi0gICAgICAgICAgICAgICAgIG9mIHRoZSBmaWxlLiAgV2UgbG9jYXRlIHRoZSBsaW5lIG51bWJlciBlbnRyeSwgYW5kCi0gICAgICAgICAgICAgICAgIHNldCB0aGUgc2VjdGlvbiB0byB0aGUgc2VjdGlvbiB3aGljaCBjb250YWlucyBpdCwgYW5kCi0gICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0aGUgaW5kZXggaW4gdGhhdCBzZWN0aW9uLiAgKi8KLQkgICAgICB7Ci0JCWFzZWN0aW9uICpzZWM7Ci0KLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCQlmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotCQkgIGlmIChzZWMtPmxpbmVfZmlsZXBvcyA8PSAoZmlsZV9wdHIpIHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkgICAgICAmJiAoKGZpbGVfcHRyKSAoc2VjLT5saW5lX2ZpbGVwb3MKLQkJCQkgICAgICArIHNlYy0+bGluZW5vX2NvdW50ICogTElORVNaKQotCQkJICA+IChmaWxlX3B0cikgc3JjLT51LnN5bWVudC5uX3ZhbHVlKSkKLQkJICAgIGJyZWFrOwotCQlpZiAoc2VjID09IE5VTEwpCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAwOwotCQllbHNlCi0JCSAgewotCQkgICAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IHNlYzsKLQkJICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkJICAtIHNlYy0+bGluZV9maWxlcG9zKQotCQkJCQkgLyBMSU5FU1opOwotCQkgICAgc3JjLT5maXhfbGluZSA9IDE7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfQlNUQVQ6Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0JICAgICAgLyogVGhlIHZhbHVlIGlzIGFjdHVhbGx5IGEgc3ltYm9sIGluZGV4LiAgU2F2ZSBhIHBvaW50ZXIKLQkJIHRvIHRoZSBzeW1ib2wgaW5zdGVhZCBvZiB0aGUgaW5kZXguICBGSVhNRTogVGhpcwotCQkgc2hvdWxkIHVzZSBhIHVuaW9uLiAgKi8KLQkgICAgICBzcmMtPnUuc3ltZW50Lm5fdmFsdWUgPQotCQkobG9uZykgKG5hdGl2ZV9zeW1ib2xzICsgc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgICBzcmMtPmZpeF92YWx1ZSA9IDE7Ci0JICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotCSAgICBjYXNlIENfQkxPQ0s6CS8qICIuYmIiIG9yICIuZWIiCQkgKi8KLQkgICAgY2FzZSBDX0ZDTjoJCS8qICIuYmYiIG9yICIuZWYiCQkgKi8KLQkgICAgY2FzZSBDX0VGQ046CS8qIHBoeXNpY2FsIGVuZCBvZiBmdW5jdGlvbgkgKi8KLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLSNpZiBkZWZpbmVkIENPRkZfV0lUSF9QRQotCSAgICAgIC8qIFBFIHNldHMgdGhlIHN5bWJvbCB0byBhIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydAotCQkgb2YgdGhlIHNlY3Rpb24uICAqLwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlOwotI2Vsc2UKLQkgICAgICAvKiBCYXNlIHRoZSB2YWx1ZSBhcyBhbiBpbmRleCBmcm9tIHRoZSBiYXNlIG9mIHRoZQotCQkgc2VjdGlvbi4gICovCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWEpOwotI2VuZGlmCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX05VTEw6Ci0JICAgIGNhc2UgQ19FWFRERUY6CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSAqLwotCSAgICBjYXNlIENfVUxBQkVMOgkvKiB1bmRlZmluZWQgbGFiZWwJCSAqLwotCSAgICBjYXNlIENfVVNUQVRJQzoJLyogdW5kZWZpbmVkIHN0YXRpYwkJICovCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgICAgICAgLyogQ19MSU5FIGluIHJlZ3VsYXIgY29mZiBpcyAweDY4LiAgTlQgaGFzIHRha2VuIG92ZXIgdGhpcyBzdG9yYWdlCi0gICAgICAgICAgICAgICBjbGFzcyB0byByZXByZXNlbnQgYSBzZWN0aW9uIHN5bWJvbCAqLwotCSAgICBjYXNlIENfTElORToJLyogbGluZSAjIHJlZm9ybWF0dGVkIGFzIHN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCSAgICAgIC8qIE5UIHVzZXMgMHg2NyBmb3IgYSB3ZWFrIHN5bWJvbCwgbm90IENfQUxJQVMuICAqLwotCSAgICBjYXNlIENfQUxJQVM6CS8qIGR1cGxpY2F0ZSB0YWcJCSAqLwotI2VuZGlmCi0JICAgICAgLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgVEljODAgKi8KLSNpZmRlZiBUSUM4MENPRkYKLQkgICAgY2FzZSBDX1VFWFQ6CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZW5kaWYKLQkgICAgY2FzZSBDX1NUQVRMQUI6CS8qIFN0YXRpYyBsb2FkIHRpbWUgbGFiZWwgKi8KLQkgICAgY2FzZSBDX0VYVExBQjoJLyogRXh0ZXJuYWwgbG9hZCB0aW1lIGxhYmVsICovCi0JICAgIGNhc2UgQ19ISURERU46CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLwotCSAgICBkZWZhdWx0OgotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IFVucmVjb2duaXplZCBzdG9yYWdlIGNsYXNzICVkIGZvciAlcyBzeW1ib2wgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNyYy0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCSBkc3QtPnN5bWJvbC5zZWN0aW9uLT5uYW1lLCBkc3QtPnN5bWJvbC5uYW1lKTsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0vKiAgICAgIEJGRF9BU1NFUlQoZHN0LT5zeW1ib2wuZmxhZ3MgIT0gMCk7Ki8KLQotCSAgZHN0LT5uYXRpdmUgPSBzcmM7Ci0KLQkgIGRzdC0+c3ltYm9sLnVkYXRhLmkgPSAwOwotCSAgZHN0LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLQkgIHRoaXNfaW5kZXggKz0gKHNyYy0+dS5zeW1lbnQubl9udW1hdXgpICsgMTsKLQkgIGRzdCsrOwotCSAgbnVtYmVyX29mX3N5bWJvbHMrKzsKLQl9CQkJLyogd2FsayB0aGUgbmF0aXZlIHN5bXRhYiAqLwotICAgIH0JCQkJLyogYmZkaXplIHRoZSBuYXRpdmUgc3ltdGFiICovCi0KLSAgb2JqX3N5bWJvbHMgKGFiZmQpID0gY2FjaGVkX2FyZWE7Ci0gIG9ial9yYXdfc3ltZW50cyAoYWJmZCkgPSBuYXRpdmVfc3ltYm9sczsKLQotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IG51bWJlcl9vZl9zeW1ib2xzOwotICBvYmpfY29udmVydCAoYWJmZCkgPSB0YWJsZV9wdHI7Ci0gIC8qIFNsdXJwIHRoZSBsaW5lIHRhYmxlcyBmb3IgZWFjaCBzZWN0aW9uIHRvbyAqLwotICB7Ci0gICAgYXNlY3Rpb24gKnA7Ci0gICAgcCA9IGFiZmQtPnNlY3Rpb25zOwotICAgIHdoaWxlIChwKQotICAgICAgewotCWNvZmZfc2x1cnBfbGluZV90YWJsZSAoYWJmZCwgcCk7Ci0JcCA9IHAtPm5leHQ7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CQkJCS8qIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKCkgKi8KLQotLyogQ2hlY2sgd2hldGhlciBhIHN5bWJvbCBpcyBnbG9iYWxseSB2aXNpYmxlLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZQotICAgQ09GRiBiYWNrZW5kIGxpbmtlciBjb2RlIGluIGNvZmZsaW5rLmMsIHNpbmNlIGEgY291cGxlIG9mIHRhcmdldHMKLSAgIGhhdmUgZ2xvYmFsbHkgdmlzaWJsZSBzeW1ib2xzIHdoaWNoIGFyZSBub3QgY2xhc3MgQ19FWFQuICBUaGlzCi0gICBmdW5jdGlvbiBuZWVkIG5vdCBoYW5kbGUgdGhlIGNhc2Ugb2Ygbl9jbGFzcyA9PSBDX0VYVC4gICovCi0KLSN1bmRlZiBPVEhFUl9HTE9CQUxfQ0xBU1MKLQotI2lmZGVmIEk5NjAKLSNkZWZpbmUgT1RIRVJfR0xPQkFMX0NMQVNTIENfTEVBRkVYVAotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGQVJNCi0jZGVmaW5lIE9USEVSX0dMT0JBTF9DTEFTUyBDX1RIVU1CRVhUIHx8IHN5bWVudC0+bl9zY2xhc3MgPT0gQ19USFVNQkVYVEZVTkMKLSNlbHNlCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIE9USEVSX0dMT0JBTF9DTEFTUyBDX1NFQ1RJT04KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBPVEhFUl9HTE9CQUxfQ0xBU1MKLQotc3RhdGljIGJvb2xlYW4gY29mZl9zeW1faXNfZ2xvYmFsIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltZW50KQotICAgICBiZmQgKiBhYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICogc3ltZW50OwotewotICByZXR1cm4gKHN5bWVudC0+bl9zY2xhc3MgPT0gT1RIRVJfR0xPQkFMX0NMQVNTKTsKLX0KLQotI3VuZGVmIE9USEVSX0dMT0JBTF9DTEFTUwotCi0jZWxzZSAvKiAhIGRlZmluZWQgKE9USEVSX0dMT0JBTF9DTEFTUykgKi8KLQotLyogc3ltX2lzX2dsb2JhbCBzaG91bGQgbm90IGJlIGRlZmluZWQgaWYgaXQgaGFzIG5vdGhpbmcgdG8gZG8uICAqLwotCi0jZGVmaW5lIGNvZmZfc3ltX2lzX2dsb2JhbCAwCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE9USEVSX0dMT0JBTF9DTEFTUykgKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlSZWFkaW5nIHJlbG9jYXRpb25zCi0KLQlDb2ZmIHJlbG9jYXRpb25zIGFyZSBlYXNpbHkgdHJhbnNmb3JtZWQgaW50byB0aGUgaW50ZXJuYWwgQkZEIGZvcm0KLQkoQGNvZGV7YXJlbGVudH0pLgotCi0JUmVhZGluZyBhIGNvZmYgcmVsb2NhdGlvbiB0YWJsZSBpcyBkb25lIGluIHRoZSBmb2xsb3dpbmcgc3RhZ2VzOgotCi0JbyBSZWFkIHRoZSBlbnRpcmUgY29mZiByZWxvY2F0aW9uIHRhYmxlIGludG8gbWVtb3J5LgotCi0JbyBQcm9jZXNzIGVhY2ggcmVsb2NhdGlvbiBpbiB0dXJuOyBmaXJzdCBzd2FwIGl0IGZyb20gdGhlCi0JZXh0ZXJuYWwgdG8gdGhlIGludGVybmFsIGZvcm0uCi0KLQlvIFR1cm4gdGhlIHN5bWJvbCByZWZlcmVuY2VkIGluIHRoZSByZWxvY2F0aW9uJ3Mgc3ltYm9sIGluZGV4Ci0JaW50byBhIHBvaW50ZXIgaW50byB0aGUgY2Fub25pY2FsIHN5bWJvbCB0YWJsZS4KLQlUaGlzIHRhYmxlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgcmV0dXJuZWQgYnkgYSBjYWxsIHRvCi0JQGNvZGV7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9LiBUaGUgYmFjayBlbmQgd2lsbCBjYWxsIHRoYXQKLQlyb3V0aW5lIGFuZCBzYXZlIHRoZSByZXN1bHQgaWYgYSBjYW5vbmljYWxpemF0aW9uIGhhc24ndCBiZWVuIGRvbmUuCi0KLQlvIFRoZSByZWxvYyBpbmRleCBpcyB0dXJuZWQgaW50byBhIHBvaW50ZXIgdG8gYSBob3d0bwotCXN0cnVjdHVyZSwgaW4gYSBiYWNrIGVuZCBzcGVjaWZpYyB3YXkuIEZvciBpbnN0YW5jZSwgdGhlIDM4NgotCWFuZCA5NjAgdXNlIHRoZSBAY29kZXtyX3R5cGV9IHRvIGRpcmVjdGx5IHByb2R1Y2UgYW4gaW5kZXgKLQlpbnRvIGEgaG93dG8gdGFibGUgdmVjdG9yOyB0aGUgODhrIHN1YnRyYWN0cyBhIG51bWJlciBmcm9tIHRoZQotCUBjb2Rle3JfdHlwZX0gZmllbGQgYW5kIGNyZWF0ZXMgYW4gYWRkZW5kIGZpZWxkLgotCi0KLSovCi0KLSNpZm5kZWYgQ0FMQ19BRERFTkQKLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOyAgICAgIFwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOyAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7ICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLXsKLSAgUkVMT0MgKm5hdGl2ZV9yZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0KLSAgdW5zaWduZWQgaW50IGlkeDsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChhc2VjdC0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCFjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuYXRpdmVfcmVsb2NzID0KLSAgICAoUkVMT0MgKikgYnV5X2FuZF9yZWFkIChhYmZkLAotCQkJICAgIGFzZWN0LT5yZWxfZmlsZXBvcywKLQkJCSAgICBTRUVLX1NFVCwKLQkJCSAgICAoc2l6ZV90KSAoUkVMU1ogKgotCQkJCSAgICAgIGFzZWN0LT5yZWxvY19jb3VudCkpOwotICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCAoc2l6ZV90KSAoYXNlY3QtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChhcmVsZW50KSkpOwotCi0gIGlmIChyZWxvY19jYWNoZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgYXNlY3QtPnJlbG9jX2NvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgZHN0OwotICAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpzcmM7Ci0jaWZuZGVmIFJFTE9DX1BST0NFU1NJTkcKLSAgICAgIGFzeW1ib2wgKnB0cjsKLSNlbmRpZgotCi0gICAgICBjYWNoZV9wdHIgPSByZWxvY19jYWNoZSArIGlkeDsKLSAgICAgIHNyYyA9IG5hdGl2ZV9yZWxvY3MgKyBpZHg7Ci0KLSAgICAgIGNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCAmZHN0KTsKLQotI2lmZGVmIFJFTE9DX1BST0NFU1NJTkcKLSAgICAgIFJFTE9DX1BST0NFU1NJTkcgKGNhY2hlX3B0ciwgJmRzdCwgc3ltYm9scywgYWJmZCwgYXNlY3QpOwotI2Vsc2UKLSAgICAgIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGRzdC5yX3ZhZGRyOwotCi0gICAgICBpZiAoZHN0LnJfc3ltbmR4ICE9IC0xKQotCXsKLQkgIGlmIChkc3Qucl9zeW1uZHggPCAwIHx8IGRzdC5yX3N5bW5keCA+PSBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IHdhcm5pbmc6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiByZWxvY3MiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBkc3Qucl9zeW1uZHgpOwotCSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgICAgICBwdHIgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gKHN5bWJvbHMKLQkJCQkJKyBvYmpfY29udmVydCAoYWJmZClbZHN0LnJfc3ltbmR4XSk7Ci0JICAgICAgcHRyID0gKihjYWNoZV9wdHItPnN5bV9wdHJfcHRyKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICBwdHIgPSBOVUxMOwotCX0KLQotICAgICAgLyogVGhlIHN5bWJvbHMgZGVmaW5pdGlvbnMgdGhhdCB3ZSBoYXZlIHJlYWQgaW4gaGF2ZSBiZWVuCi0JIHJlbG9jYXRlZCBhcyBpZiB0aGVpciBzZWN0aW9ucyBzdGFydGVkIGF0IDAuIEJ1dCB0aGUgb2Zmc2V0cwotCSByZWZlcmluZyB0byB0aGUgc3ltYm9scyBpbiB0aGUgcmF3IGRhdGEgaGF2ZSBub3QgYmVlbgotCSBtb2RpZmllZCwgc28gd2UgaGF2ZSB0byBoYXZlIGEgbmVnYXRpdmUgYWRkZW5kIHRvIGNvbXBlbnNhdGUuCi0KLQkgTm90ZSB0aGF0IHN5bWJvbHMgd2hpY2ggdXNlZCB0byBiZSBjb21tb24gbXVzdCBiZSBsZWZ0IGFsb25lICovCi0KLSAgICAgIC8qIENhbGN1bGF0ZSBhbnkgcmVsb2MgYWRkZW5kIGJ5IGxvb2tpbmcgYXQgdGhlIHN5bWJvbCAqLwotICAgICAgQ0FMQ19BRERFTkQgKGFiZmQsIHB0ciwgZHN0LCBjYWNoZV9wdHIpOwotCi0gICAgICBjYWNoZV9wdHItPmFkZHJlc3MgLT0gYXNlY3QtPnZtYTsKLS8qICEhICAgICBjYWNoZV9wdHItPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsqLwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBjYWNoZV9wdHItPmhvd3RvIGZpZWxkIGZyb20gZHN0LnJfdHlwZSAqLwotICAgICAgUlRZUEUySE9XVE8gKGNhY2hlX3B0ciwgJmRzdCk7Ci0jZW5kaWYJLyogUkVMT0NfUFJPQ0VTU0lORyAqLwotCi0gICAgICBpZiAoY2FjaGVfcHRyLT5ob3d0byA9PSBOVUxMKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGlsbGVnYWwgcmVsb2NhdGlvbiB0eXBlICVkIGF0IGFkZHJlc3MgMHglbHgiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBkc3Qucl90eXBlLCAobG9uZykgZHN0LnJfdmFkZHIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmbmRlZiBjb2ZmX3J0eXBlX3RvX2hvd3RvCi0jaWZkZWYgUlRZUEUySE9XVE8KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgcmVsb2MuICBUaGlzIGlzIG9ubHkgdXNlZCBpZiB0aGUgZmlsZQotICAgaW5jbHVkaW5nIHRoaXMgb25lIGRlZmluZXMgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIHRvIGJlCi0gICBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLCBzbyBpdCBpcyBPSyBpZiBpdCBkb2VzIG5vdAotICAgYWx3YXlzIHdvcmsuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGluY2x1ZGluZyBmaWxlIHRvCi0gICBtYWtlIHN1cmUgaXQgaXMgcmVhc29uYWJsZSBpZiBpdCBpcyBuZWVkZWQuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCBnZW5yZWw7Ci0KLSAgUlRZUEUySE9XVE8gKCZnZW5yZWwsIHJlbCk7Ci0gIHJldHVybiBnZW5yZWwuaG93dG87Ci19Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoUlRZUEUySE9XVE8pICovCi0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBOVUxMCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFJUWVBFMkhPV1RPKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KLQotLyogVGhpcyBpcyBzdHVwaWQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhIGJvb2xlYW4gcHJlZGljYXRlLiAgKi8KLXN0YXRpYyBsb25nCi1jb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKiogcmVscHRyOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgewotICAgICAgLyogdGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgdGhleSBhcmUgbm90IGluIHRoZQotICAgICAgIGZpbGUsIHNvIHRha2UgdGhlbSBvdXQgb2YgdGhlaXIgY2hhaW4gYW5kIHBsYWNlIHRoZW0gaW50bwotICAgICAgIHRoZSBkYXRhIGFyZWEgcHJvdmlkZWQgKi8KLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgY29mZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQkqcmVscHRyKysgPSB0YmxwdHIrKzsKLQotCi0gICAgfQotICAqcmVscHRyID0gMDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi0jaWZkZWYgR05VOTYwCi1maWxlX3B0cgotY29mZl9zeW1fZmlsZXBvcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gb2JqX3N5bV9maWxlcG9zIChhYmZkKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUgZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZQotCi1zdGF0aWMgaW50IGR1bW15X3JlbG9jMTZfZXN0aW1hdGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiwgdW5zaWduZWQgaW50LAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGludAotZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgdW5zaWduZWQgaW50IHNocmluazsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcwotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0KLS8qIFRoaXMgd29ya3MgZXZlbiBpZiBhYm9ydCBpcyBub3QgZGVjbGFyZWQgaW4gYW55IGhlYWRlciBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQgZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGFyZWxlbnQgKiwKLQkgICBiZmRfYnl0ZSAqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopKTsKLQotc3RhdGljIHZvaWQKLWR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsCi0JCQkgICBkc3RfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0jZW5kaWYKLQotLyogSWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzIGRlZmluZWQsIHdlIGNhbiB1c2UgdGhlIG9wdGltaXplZCBDT0ZGCi0gICBiYWNrZW5kIGxpbmtlci4gIE90aGVyd2lzZSB3ZSBtdXN0IGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkIGxpbmtlci4gICovCi0jaWZkZWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgY29mZl9iZmRfZmluYWxfbGluayBfYmZkX2NvZmZfZmluYWxfbGluawotI2VuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbikgKi8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIE5VTEwKLSNpZm5kZWYgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZW5kaWYKLSNkZWZpbmUgY29mZl9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0jaWZuZGVmIGNvZmZfc3RhcnRfZmluYWxfbGluawotI2RlZmluZSBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9hZGp1c3Rfc3ltbmR4Ci0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBOVUxMCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIChhYmZkLCBpbmZvKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBpbmZvOwotewotICByZXR1cm4gYWJmZC0+b3V0cHV0X2hhc19iZWd1bjsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci0KLXN0YXRpYyBib29sZWFuIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfU1dBUF9hdXhfaW4KLSNkZWZpbmUgY29mZl9TV0FQX2F1eF9pbiBjb2ZmX3N3YXBfYXV4X2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3N5bV9pbgotI2RlZmluZSBjb2ZmX1NXQVBfc3ltX2luIGNvZmZfc3dhcF9zeW1faW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfbGluZW5vX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9saW5lbm9faW4gY29mZl9zd2FwX2xpbmVub19pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9hdXhfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9hdXhfb3V0IGNvZmZfc3dhcF9hdXhfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3N5bV9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9vdXQgY29mZl9zd2FwX3N5bV9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfbGluZW5vX291dAotI2RlZmluZSBjb2ZmX1NXQVBfbGluZW5vX291dCBjb2ZmX3N3YXBfbGluZW5vX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9yZWxvY19vdXQKLSNkZWZpbmUgY29mZl9TV0FQX3JlbG9jX291dCBjb2ZmX3N3YXBfcmVsb2Nfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2ZpbGVoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9maWxlaGRyX291dCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2FvdXRoZHJfb3V0IGNvZmZfc3dhcF9hb3V0aGRyX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zY25oZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9zY25oZHJfb3V0IGNvZmZfc3dhcF9zY25oZHJfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3JlbG9jX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9yZWxvY19pbiBjb2ZmX3N3YXBfcmVsb2NfaW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfZmlsZWhkcl9pbiBjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9hb3V0aGRyX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9hb3V0aGRyX2luIGNvZmZfc3dhcF9hb3V0aGRyX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfc2NuaGRyX2luIGNvZmZfc3dhcF9zY25oZHJfaW4KLSNlbmRpZgotCi0KLQotc3RhdGljIENPTlNUIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBiZmRfY29mZl9zdGRfc3dhcF90YWJsZSA9Ci17Ci0gIGNvZmZfU1dBUF9hdXhfaW4sIGNvZmZfU1dBUF9zeW1faW4sIGNvZmZfU1dBUF9saW5lbm9faW4sCi0gIGNvZmZfU1dBUF9hdXhfb3V0LCBjb2ZmX1NXQVBfc3ltX291dCwKLSAgY29mZl9TV0FQX2xpbmVub19vdXQsIGNvZmZfU1dBUF9yZWxvY19vdXQsCi0gIGNvZmZfU1dBUF9maWxlaGRyX291dCwgY29mZl9TV0FQX2FvdXRoZHJfb3V0LAotICBjb2ZmX1NXQVBfc2NuaGRyX291dCwKLSAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgU1lNRVNaLCBBVVhFU1osIFJFTFNaLCBMSU5FU1osCi0jaWZkZWYgQ09GRl9MT05HX0ZJTEVOQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSAgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLAotICBjb2ZmX1NXQVBfZmlsZWhkcl9pbiwgY29mZl9TV0FQX2FvdXRoZHJfaW4sIGNvZmZfU1dBUF9zY25oZHJfaW4sCi0gIGNvZmZfU1dBUF9yZWxvY19pbiwgY29mZl9iYWRfZm9ybWF0X2hvb2ssIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICBjb2ZmX21rb2JqZWN0X2hvb2ssIHN0eXBfdG9fc2VjX2ZsYWdzLCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywKLSAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUsIHN5bW5hbWVfaW5fZGVidWdfaG9vaywgY29mZl9wb2ludGVyaXplX2F1eF9ob29rLAotICBjb2ZmX3ByaW50X2F1eCwgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUsCi0gIGNvZmZfc3ltX2lzX2dsb2JhbCwgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0gIGNvZmZfc3RhcnRfZmluYWxfbGluaywgY29mZl9yZWxvY2F0ZV9zZWN0aW9uLCBjb2ZmX3J0eXBlX3RvX2hvd3RvLAotICBjb2ZmX2FkanVzdF9zeW1uZHgsIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCwKLSAgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4sIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci19OwotCi0jaWZuZGVmIGNvZmZfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUJY29mZl9jbG9zZV9hbmRfY2xlYW51cCAgICAgICAgICAgICAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8gICAgICAgICAgIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZQljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzICAgICAgICAgICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhICAgICAgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAgICAgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAgICAgICAgICBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIAotI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhICAgICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQkgICAgX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBjb2ZmX3JlYWRfbWluaXN5bWJvbHMJCSAgICBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sCSAgICBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSNlbmRpZgotCi0vKiBUaGUgcmVsb2MgbG9va3VwIHJvdXRpbmUgbXVzdCBiZSBzdXBwbGllZCBieSBlYWNoIGluZGl2aWR1YWwgQ09GRgotICAgYmFja2VuZC4gICovCi0jaWZuZGVmIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCSAgICBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCQkgICAgYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgY29mZl9iZmRfZ2Nfc2VjdGlvbnMJCSAgICBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvY29mZmdlbi5jIGIvYmZkL2NvZmZnZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2ZWQ2Ni4uMDAwMDAwMAotLS0gYS9iZmQvY29mZmdlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM4OCArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBDT0ZGLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sIHNhY0BjeWdudXMuY29tLgotICAgU3BsaXQgb3V0IG9mIGNvZmZjb2RlLmggYnkgSWFuIFRheWxvciwgaWFuQGN5Z251cy5jb20uICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgQ09GRiBjb2RlIHRoYXQgaXMgbm90IGRlcGVuZGVudCBvbiBhbnkKLSAgIHBhcnRpY3VsYXIgQ09GRiB0YXJnZXQuICBUaGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbgotICAgbGliYmZkLmEsIHNvIG5vIHRhcmdldCBzcGVjaWZpYyBjb2RlIG1heSBiZSBwdXQgaW4gaGVyZS4gIE9yLCB0bwotICAgcHV0IGl0IGFub3RoZXIgd2F5LAotCi0gICAqKioqKioqKioqIERPIE5PVCBQVVQgVEFSR0VUIFNQRUNJRklDIENPREUgSU4gVEhJUyBGSUxFICoqKioqKioqKioKLQotICAgSWYgeW91IG5lZWQgdG8gYWRkIHNvbWUgdGFyZ2V0IHNwZWNpZmljIGJlaGF2aW91ciwgYWRkIGEgbmV3IGhvb2sKLSAgIGZ1bmN0aW9uIHRvIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YS4KLQotICAgU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGFsc28gY2FsbGVkIGJ5IHRoZSBFQ09GRiByb3V0aW5lcy4KLSAgIFRob3NlIGZ1bmN0aW9ucyBtYXkgbm90IHVzZSBhbnkgQ09GRiBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgc3VjaCBhcwotICAgY29mZl9kYXRhIChhYmZkKS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgdm9pZCBjb2ZmX2ZpeF9zeW1ib2xfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIHVuc2lnbmVkIGludCAqLAotCSAgIGJmZF9zaXplX3R5cGUgKiwgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9hbGllbl9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgdW5zaWduZWQgaW50ICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGNvZmZfc3ltYm9sX3R5cGUgKiwgdW5zaWduZWQgaW50ICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3BvaW50ZXJpemVfYXV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICB1bnNpZ25lZCBpbnQsIGNvbWJpbmVkX2VudHJ5X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfcmVhbF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQsIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICosIAotCSAgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopKTsKLXN0YXRpYyB2b2lkIGZpeHVwX3N5bWJvbF92YWx1ZQotICBQQVJBTVMgKChiZmQgKiwgY29mZl9zeW1ib2xfdHlwZSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLXN0YXRpYyBjaGFyICpidWlsZF9kZWJ1Z19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqY29weV9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIGludCkpOwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFRha2UgYSBzZWN0aW9uIGhlYWRlciByZWFkIGZyb20gYSBjb2ZmIGZpbGUgKGluIEhPU1QgYnl0ZSBvcmRlciksCi0gICBhbmQgbWFrZSBhIEJGRCAic2VjdGlvbiIgb3V0IG9mIGl0LiAgVGhpcyBpcyB1c2VkIGJ5IEVDT0ZGLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgKGFiZmQsIGhkciwgdGFyZ2V0X2luZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkcjsKLSAgICAgdW5zaWduZWQgaW50IHRhcmdldF9pbmRleDsKLXsKLSAgYXNlY3Rpb24gKnJldHVybl9zZWN0aW9uOwotICBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBOVUxMOwotCi0gIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMgYXMgaW4gUEUuICAqLwotICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKQotICAgICAgJiYgaGRyLT5zX25hbWVbMF0gPT0gJy8nKQotICAgIHsKLSAgICAgIGNoYXIgYnVmW1NDTk5NTEVOXTsKLSAgICAgIGxvbmcgc3RyaW5kZXg7Ci0gICAgICBjaGFyICpwOwotICAgICAgY29uc3QgY2hhciAqc3RyaW5nczsKLQotICAgICAgbWVtY3B5IChidWYsIGhkci0+c19uYW1lICsgMSwgU0NOTk1MRU4gLSAxKTsKLSAgICAgIGJ1ZltTQ05OTUxFTiAtIDFdID0gJ1wwJzsKLSAgICAgIHN0cmluZGV4ID0gc3RydG9sIChidWYsICZwLCAxMCk7Ci0gICAgICBpZiAoKnAgPT0gJ1wwJyAmJiBzdHJpbmRleCA+PSAwKQotCXsKLQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRklYTUU6IEZvciBleHRyYSBzYWZldHksIHdlIHNob3VsZCBtYWtlIHN1cmUgdGhhdAotICAgICAgICAgICAgIHN0cmluZGV4IGRvZXMgbm90IHJ1biB1cyBwYXN0IHRoZSBlbmQsIGJ1dCByaWdodCBub3cgd2UKLSAgICAgICAgICAgICBkb24ndCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICBzdHJpbmdzICs9IHN0cmluZGV4OwotCSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzdHJpbmdzKSArIDEpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3RyY3B5IChuYW1lLCBzdHJpbmdzKTsKLQl9Ci0gICAgfQotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgLyogQXNzb3J0ZWQgd2FzdGFnZSB0byBudWxsLXRlcm1pbmF0ZSB0aGUgbmFtZSwgdGhhbmtzIEFUJlQhICovCi0gICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGhkci0+c19uYW1lKSArIDEpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJuY3B5IChuYW1lLCAoY2hhciAqKSAmaGRyLT5zX25hbWVbMF0sIHNpemVvZiAoaGRyLT5zX25hbWUpKTsKLSAgICAgIG5hbWVbc2l6ZW9mIChoZHItPnNfbmFtZSldID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmIChyZXR1cm5fc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm5fc2VjdGlvbi0+dm1hID0gaGRyLT5zX3ZhZGRyOwotICByZXR1cm5fc2VjdGlvbi0+bG1hID0gaGRyLT5zX3BhZGRyOwotICByZXR1cm5fc2VjdGlvbi0+X3Jhd19zaXplID0gaGRyLT5zX3NpemU7Ci0gIHJldHVybl9zZWN0aW9uLT5maWxlcG9zID0gaGRyLT5zX3NjbnB0cjsKLSAgcmV0dXJuX3NlY3Rpb24tPnJlbF9maWxlcG9zID0gaGRyLT5zX3JlbHB0cjsKLSAgcmV0dXJuX3NlY3Rpb24tPnJlbG9jX2NvdW50ID0gaGRyLT5zX25yZWxvYzsKLQotICBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHJldHVybl9zZWN0aW9uLCBoZHIpOwotCi0gIHJldHVybl9zZWN0aW9uLT5saW5lX2ZpbGVwb3MgPSBoZHItPnNfbG5ub3B0cjsKLQotICByZXR1cm5fc2VjdGlvbi0+bGluZW5vX2NvdW50ID0gaGRyLT5zX25sbm5vOwotICByZXR1cm5fc2VjdGlvbi0+dXNlcmRhdGEgPSBOVUxMOwotICByZXR1cm5fc2VjdGlvbi0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICByZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgPSBiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rIChhYmZkLCBoZHIsIG5hbWUpOwotCi0gIHJldHVybl9zZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0YXJnZXRfaW5kZXg7Ci0KLSAgLyogQXQgbGVhc3Qgb24gaTM4Ni1jb2ZmLCB0aGUgbGluZSBudW1iZXIgY291bnQgZm9yIGEgc2hhcmVkIGxpYnJhcnkKLSAgICAgc2VjdGlvbiBtdXN0IGJlIGlnbm9yZWQuICAqLwotICBpZiAoKHJldHVybl9zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5saW5lbm9fY291bnQgPSAwOwotCi0gIGlmIChoZHItPnNfbnJlbG9jICE9IDApCi0gICAgcmV0dXJuX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGNoZWNrICdoZHItPnNfc2l6ZSA+IDAnICovCi0gIGlmIChoZHItPnNfc2NucHRyICE9IDApCi0gICAgcmV0dXJuX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGluIGEgQ09GRiBvYmplY3QgYW5kIG1ha2UgaXQgaW50byBhIEJGRC4gIFRoaXMgaXMgdXNlZCBieQotICAgRUNPRkYgYXMgd2VsbC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNvZmZfcmVhbF9vYmplY3RfcCAoYWJmZCwgbnNjbnMsIGludGVybmFsX2YsIGludGVybmFsX2EpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbnNjbnM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqaW50ZXJuYWxfYTsKLXsKLSAgZmxhZ3dvcmQgb2ZsYWdzID0gYWJmZC0+ZmxhZ3M7Ci0gIGJmZF92bWEgb3N0YXJ0ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgUFRSIHRkYXRhOwotICBzaXplX3QgcmVhZHNpemU7CQkvKiBsZW5ndGggb2YgZmlsZV9pbmZvICovCi0gIHVuc2lnbmVkIGludCBzY25oc3o7Ci0gIGNoYXIgKmV4dGVybmFsX3NlY3Rpb25zOwotCi0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1JFTEZMRykpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0VYRUMpKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgaWYgKCEoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfTE5OTykpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTzsKLSAgaWYgKCEoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfTFNZTVMpKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MT0NBTFM7Ci0KLSAgLyogRklYTUU6IEhvdyBjYW4gd2Ugc2V0IERfUEFHRUQgY29ycmVjdGx5PyAgKi8KLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9FWEVDKSAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQ7Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBpbnRlcm5hbF9mLT5mX25zeW1zOwotICBpZiAoaW50ZXJuYWxfZi0+Zl9uc3ltcykKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICBpZiAoaW50ZXJuYWxfYSAhPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgTlVMTCkKLSAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gaW50ZXJuYWxfYS0+ZW50cnk7Ci0gIGVsc2UKLSAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gMDsKLQotICAvKiBTZXQgdXAgdGhlIHRkYXRhIGFyZWEuICBFQ09GRiB1c2VzIGl0cyBvd24gcm91dGluZSwgYW5kIG92ZXJyaWRlcwotICAgICBhYmZkLT5mbGFncy4gICovCi0gIHRkYXRhID0gYmZkX2NvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgKFBUUikgaW50ZXJuYWxfZiwgKFBUUikgaW50ZXJuYWxfYSk7Ci0gIGlmICh0ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIHNjbmhzeiA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0gIHJlYWRzaXplID0gbnNjbnMgKiBzY25oc3o7Ci0gIGV4dGVybmFsX3NlY3Rpb25zID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCByZWFkc2l6ZSk7Ci0gIGlmICghZXh0ZXJuYWxfc2VjdGlvbnMpCi0gICAgZ290byBmYWlsOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgZXh0ZXJuYWxfc2VjdGlvbnMsIDEsIHJlYWRzaXplLCBhYmZkKSAhPSByZWFkc2l6ZSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgLyogTm93IGNvcHkgZGF0YSBhcyByZXF1aXJlZDsgY29uc3RydWN0IGFsbCBhc2VjdGlvbnMgZXRjICovCi0gIGlmIChuc2NucyAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5zY25zOyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciB0bXA7Ci0JICBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwKLQkJCQkgICAoUFRSKSAoZXh0ZXJuYWxfc2VjdGlvbnMgKyBpICogc2NuaHN6KSwKLQkJCQkgICAoUFRSKSAmIHRtcCk7Ci0JICBpZiAoISBtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgKGFiZmQsICZ0bXAsIGkgKyAxKSkKLQkgICAgZ290byBmYWlsOwotCX0KLSAgICB9Ci0KLSAgLyogIG1ha2VfYWJzX3NlY3Rpb24gKGFiZmQpOyAqLwotCi0gIGlmIChiZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIChQVFIpIGludGVybmFsX2YpID09IGZhbHNlKQotICAgIGdvdG8gZmFpbDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotIGZhaWw6Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCB0ZGF0YSk7Ci0gIGFiZmQtPmZsYWdzID0gb2ZsYWdzOwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gb3N0YXJ0OwotICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLX0KLQotLyogVHVybiBhIENPRkYgZmlsZSBpbnRvIGEgQkZELCBidXQgZmFpbCB3aXRoIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQgaWYgaXQgaXMKLSAgIG5vdCBhIENPRkYgZmlsZS4gIFRoaXMgaXMgYWxzbyB1c2VkIGJ5IEVDT0ZGLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1jb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBmaWxoc3o7Ci0gIHVuc2lnbmVkIGludCBhb3V0c3o7Ci0gIGludCBuc2NuczsKLSAgUFRSIGZpbGVoZHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyIGludGVybmFsX2Y7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGludGVybmFsX2E7Ci0KLSAgLyogZmlndXJlIG91dCBob3cgbXVjaCB0byByZWFkICovCi0gIGZpbGhzeiA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0gIGFvdXRzeiA9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0KLSAgZmlsZWhkciA9IGJmZF9hbGxvYyAoYWJmZCwgZmlsaHN6KTsKLSAgaWYgKGZpbGVoZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGJmZF9yZWFkIChmaWxlaGRyLCAxLCBmaWxoc3osIGFiZmQpICE9IGZpbGhzeikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbiAoYWJmZCwgZmlsZWhkciwgJmludGVybmFsX2YpOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgZmlsZWhkcik7Ci0KLSAgaWYgKGJmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgJmludGVybmFsX2YpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBuc2NucyA9IGludGVybmFsX2YuZl9uc2NuczsKLQotICBpZiAoaW50ZXJuYWxfZi5mX29wdGhkcikKLSAgICB7Ci0gICAgICBQVFIgb3B0aGRyOwotCi0gICAgICBvcHRoZHIgPSBiZmRfYWxsb2MgKGFiZmQsIGFvdXRzeik7Ci0gICAgICBpZiAob3B0aGRyID09IE5VTEwpCi0JcmV0dXJuIDA7OwotICAgICAgaWYgKGJmZF9yZWFkIChvcHRoZHIsIDEsIGludGVybmFsX2YuZl9vcHRoZHIsIGFiZmQpCi0JICAhPSBpbnRlcm5hbF9mLmZfb3B0aGRyKQotCXsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgb3B0aGRyLCAoUFRSKSAmaW50ZXJuYWxfYSk7Ci0gICAgfQotCi0gIHJldHVybiBjb2ZmX3JlYWxfb2JqZWN0X3AgKGFiZmQsIG5zY25zLCAmaW50ZXJuYWxfZiwKLQkJCSAgICAgKGludGVybmFsX2YuZl9vcHRoZHIgIT0gMAotCQkJICAgICAgPyAmaW50ZXJuYWxfYQotCQkJICAgICAgOiAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgTlVMTCkpOwotfQotCi0vKiBHZXQgdGhlIEJGRCBzZWN0aW9uIGZyb20gYSBDT0ZGIHN5bWJvbCBzZWN0aW9uIG51bWJlci4gICovCi0KLWFzZWN0aW9uICoKLWNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGluZGV4OwotewotICBzdHJ1Y3Qgc2VjICphbnN3ZXIgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoaW5kZXggPT0gTl9BQlMpCi0gICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIGlmIChpbmRleCA9PSBOX1VOREVGKQotICAgIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICBpZiAoaW5kZXggPT0gTl9ERUJVRykKLSAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICB3aGlsZSAoYW5zd2VyKQotICAgIHsKLSAgICAgIGlmIChhbnN3ZXItPnRhcmdldF9pbmRleCA9PSBpbmRleCkKLQlyZXR1cm4gYW5zd2VyOwotICAgICAgYW5zd2VyID0gYW5zd2VyLT5uZXh0OwotICAgIH0KLQotICAvKiBXZSBzaG91bGQgbm90IHJlYWNoIHRoaXMgcG9pbnQsIGJ1dCB0aGUgU0NPIDMuMnY0IC9saWIvbGliY19zLmEKLSAgICAgaGFzIGEgYmFkIHN5bWJvbCB0YWJsZSBpbiBiaWdsaXRwb3cuby4gICovCi0gIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotfQotCi0vKiBHZXQgdGhlIHVwcGVyIGJvdW5kIG9mIGEgQ09GRiBzeW1ib2wgdGFibGUuICAqLwotCi1sb25nCi1jb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlICopKTsKLX0KLQotCi0vKiBDYW5vbmljYWxpemUgYSBDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0KLWxvbmcKLWNvZmZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBjb2ZmX3N5bWJvbF90eXBlICpzeW1iYXNlOwotICBjb2ZmX3N5bWJvbF90eXBlICoqbG9jYXRpb24gPSAoY29mZl9zeW1ib2xfdHlwZSAqKikgYWxvY2F0aW9uOwotCi0gIGlmICghYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3ltYmFzZSA9IG9ial9zeW1ib2xzIChhYmZkKTsKLSAgY291bnRlciA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICB3aGlsZSAoY291bnRlci0tID4gMCkKLSAgICAqbG9jYXRpb24rKyA9IHN5bWJhc2UrKzsKLQotICAqbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3ltYm9sLiAgVGhlIGNhbGxlciBtdXN0IHBhc3MgaW4gYSBidWZmZXIgb2Ygc2l6ZQotICAgPj0gU1lNTk1MRU4gKyAxLiAgKi8KLQotY29uc3QgY2hhciAqCi1fYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsIHN5bSwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgY2hhciAqYnVmOwotewotICAvKiBGSVhNRTogSXQncyBub3QgY2xlYXIgdGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGlmIHNpemVvZgotICAgICAoX25femVyb2VzKSAhPSA0LiAgKi8KLSAgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgIT0gMAotICAgICAgfHwgc3ltLT5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIG1lbWNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSAgICAgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmdzOwotCi0gICAgICBCRkRfQVNTRVJUIChzeW0tPl9uLl9uX24uX25fb2Zmc2V0ID49IFNUUklOR19TSVpFX1NJWkUpOwotICAgICAgc3RyaW5ncyA9IG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpOwotICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQl7Ci0JICBzdHJpbmdzID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKTsKLQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHJldHVybiBzdHJpbmdzICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLSAgICB9Ci19Ci0KLS8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIHJlbG9jcy4gIFRoaXMgcmV0dXJucyBhIGJ1ZmZlciBob2xkaW5nIHRoZQotICAgcmVsb2NzIGZvciBzZWN0aW9uIFNFQyBpbiBmaWxlIEFCRkQuICBJZiBDQUNIRSBpcyB0cnVlIGFuZAotICAgSU5URVJOQUxfUkVMT0NTIGlzIE5VTEwsIHRoZSByZWxvY3MgcmVhZCBpbiB3aWxsIGJlIHNhdmVkIGluIGNhc2UKLSAgIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYWdhaW4uICBJZiBFWFRFUk5BTF9SRUxPQ1MgaXMgbm90IE5VTEwsIGl0Ci0gICBpcyBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgdW5zd2FwcGVkIHJlbG9jcy4gIElmCi0gICBJTlRFUk5BTF9SRUxPQ1MgaXMgbm90IE5VTEwsIGl0IGlzIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkCi0gICB0aGUgc3dhcHBlZCByZWxvY3MuICBJZiBSRVFVSVJFX0lOVEVSTkFMIGlzIHRydWUsIHRoZW4gdGhlIHJldHVybgotICAgdmFsdWUgbXVzdCBiZSBJTlRFUk5BTF9SRUxPQ1MuICBUaGUgZnVuY3Rpb24gcmV0dXJucyBOVUxMIG9uIGVycm9yLiAgKi8KLQotc3RydWN0IGludGVybmFsX3JlbG9jICoKLV9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgc2VjLCBjYWNoZSwgZXh0ZXJuYWxfcmVsb2NzLAotCQkJCXJlcXVpcmVfaW50ZXJuYWwsIGludGVybmFsX3JlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBib29sZWFuIGNhY2hlOwotICAgICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzOwotICAgICBib29sZWFuIHJlcXVpcmVfaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotewotICBiZmRfc2l6ZV90eXBlIHJlbHN6OwotICBiZmRfYnl0ZSAqZnJlZV9leHRlcm5hbCA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZnJlZV9pbnRlcm5hbCA9IE5VTEw7Ci0gIGJmZF9ieXRlICplcmVsOwotICBiZmRfYnl0ZSAqZXJlbF9lbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTAotICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHJlcXVpcmVfaW50ZXJuYWwpCi0JcmV0dXJuIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7Ci0gICAgICBtZW1jcHkgKGludGVybmFsX3JlbG9jcywgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcywKLQkgICAgICBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLSAgICAgIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgfQotCi0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotCi0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlX2V4dGVybmFsID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQgKiByZWxzeik7Ci0gICAgICBpZiAoZnJlZV9leHRlcm5hbCA9PSBOVUxMICYmIHNlYy0+cmVsb2NfY291bnQgPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gZnJlZV9leHRlcm5hbDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIHJlbHN6LCBzZWMtPnJlbG9jX2NvdW50LCBhYmZkKQotCSAgIT0gcmVsc3ogKiBzZWMtPnJlbG9jX2NvdW50KSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZV9pbnRlcm5hbCA9ICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50Ci0JCQkJICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLSAgICAgIGlmIChmcmVlX2ludGVybmFsID09IE5VTEwgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBmcmVlX2ludGVybmFsOwotICAgIH0KLQotICAvKiBTd2FwIGluIHRoZSByZWxvY3MuICAqLwotICBlcmVsID0gZXh0ZXJuYWxfcmVsb2NzOwotICBlcmVsX2VuZCA9IGVyZWwgKyByZWxzeiAqIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIGZvciAoOyBlcmVsIDwgZXJlbF9lbmQ7IGVyZWwgKz0gcmVsc3osIGlyZWwrKykKLSAgICBiZmRfY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoUFRSKSBlcmVsLCAoUFRSKSBpcmVsKTsKLQotICBpZiAoZnJlZV9leHRlcm5hbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfZXh0ZXJuYWwpOwotICAgICAgZnJlZV9leHRlcm5hbCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChjYWNoZSAmJiBmcmVlX2ludGVybmFsICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JewotCSAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gTlVMTDsKLQl9Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gZnJlZV9pbnRlcm5hbDsKLSAgICB9Ci0KLSAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfZXh0ZXJuYWwgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dGVybmFsKTsKLSAgaWYgKGZyZWVfaW50ZXJuYWwgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2ludGVybmFsKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCBsaW5lbm9fY291bnQgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMgb2YgYSBDT0ZGIGZpbGUuICAqLwotCi1pbnQKLWNvZmZfY291bnRfbGluZW51bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGxpbWl0ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgdG90YWwgPSAwOwotICBhc3ltYm9sICoqcDsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGxpbWl0ID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBtYXkgYmUgZnJvbSB0aGUgYmFja2VuZCBsaW5rZXIsIGluIHdoaWNoIGNhc2UgdGhlCi0gICAgICAgICBsaW5lbm9fY291bnQgaW4gdGhlIHNlY3Rpb25zIGlzIGNvcnJlY3QuICAqLwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JdG90YWwgKz0gcy0+bGluZW5vX2NvdW50OwotICAgICAgcmV0dXJuIHRvdGFsOwotICAgIH0KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICBCRkRfQVNTRVJUIChzLT5saW5lbm9fY291bnQgPT0gMCk7Ci0KLSAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqcV9tYXliZSA9ICpwOwotCi0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAocV9tYXliZSkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSAqcSA9IGNvZmZzeW1ib2wgKHFfbWF5YmUpOwotCi0JICAvKiBUaGUgQUlYIDQuMSBjb21waWxlciBjYW4gc29tZXRpbWVzIGdlbmVyYXRlIGxpbmUgbnVtYmVycwotICAgICAgICAgICAgIGF0dGFjaGVkIHRvIGRlYnVnZ2luZyBzeW1ib2xzLiAgV2UgdHJ5IHRvIHNpbXBseSBpZ25vcmUKLSAgICAgICAgICAgICB0aG9zZSBoZXJlLiAgKi8KLQkgIGlmIChxLT5saW5lbm8gIT0gTlVMTAotCSAgICAgICYmIHEtPnN5bWJvbC5zZWN0aW9uLT5vd25lciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGxpbmUgbnVtYmVycy4gIEluY3JlbWVudCB0aGUgb3duaW5nCi0JICAgICAgICAgc2VjdGlvbidzIGxpbmVudW1iZXIgY291bnQuICAqLwotCSAgICAgIGFsZW50ICpsID0gcS0+bGluZW5vOwotCi0JICAgICAgKytxLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudDsKLQkgICAgICArK3RvdGFsOwotCSAgICAgICsrbDsKLQkgICAgICB3aGlsZSAobC0+bGluZV9udW1iZXIgIT0gMCkKLQkJewotCQkgICsrdG90YWw7Ci0JCSAgKytxLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudDsKLQkJICArK2w7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRvdGFsOwotfQotCi0vKiBUYWtlcyBhIGJmZCBhbmQgYSBzeW1ib2wsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb2ZmIHNwZWNpZmljCi0gICBhcmVhIG9mIHRoZSBzeW1ib2wgaWYgdGhlcmUgaXMgb25lLiAgKi8KLQotLypBUkdTVVNFRCovCi1jb2ZmX3N5bWJvbF90eXBlICoKLWNvZmZfc3ltYm9sX2Zyb20gKGlnbm9yZV9hYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKHN5bWJvbCkgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0KLSAgaWYgKGJmZF9hc3ltYm9sX2JmZCAoc3ltYm9sKS0+dGRhdGEuY29mZl9vYmpfZGF0YSA9PSAoY29mZl9kYXRhX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQotICByZXR1cm4gKGNvZmZfc3ltYm9sX3R5cGUgKikgc3ltYm9sOwotfQotCi1zdGF0aWMgdm9pZAotZml4dXBfc3ltYm9sX3ZhbHVlIChhYmZkLCBjb2ZmX3N5bWJvbF9wdHIsIHN5bWVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2ZmX3N5bWJvbF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bWVudDsKLXsKLQotICAvKiBOb3JtYWxpemUgdGhlIHN5bWJvbCBmbGFncyAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBhIGNvbW1vbiBzeW1ib2wgaXMgdW5kZWZpbmVkIHdpdGggYSB2YWx1ZSAqLwotICAgICAgc3ltZW50LT5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHsKLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBzeW1lbnQtPm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgc3ltZW50LT5uX3ZhbHVlID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikKLQl7Ci0JICBzeW1lbnQtPm5fc2NudW0gPQotCSAgICBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCi0JICBzeW1lbnQtPm5fdmFsdWUgPSAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWUKLQkJCSAgICAgKyBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIGlmICghIG9ial9wZSAoYWJmZCkpCi0JICAgIHN5bWVudC0+bl92YWx1ZSArPQotCSAgICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKDApOwotCSAgLyogVGhpcyBjYW4gaGFwcGVuLCBidXQgSSBkb24ndCBrbm93IHdoeSB5ZXQgKHN0ZXZlQGN5Z251cy5jb20pICovCi0JICBzeW1lbnQtPm5fc2NudW0gPSBOX0FCUzsKLQkgIHN5bWVudC0+bl92YWx1ZSA9IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB3b3JrIG91dCB3aGF0Ci0gICB0aGVpciBpbmRleGVzIGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aWxsIGJlIHdoZW4gb3V0cHV0LgotCi0gICBDb2ZmIHJlcXVpcmVzIHRoYXQgZWFjaCBDX0ZJTEUgc3ltYm9sIHBvaW50cyB0byB0aGUgbmV4dCBvbmUgaW4gdGhlCi0gICBjaGFpbiwgYW5kIHRoYXQgdGhlIGxhc3Qgb25lIHBvaW50cyB0byB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiBXZQotICAgZG8gdGhhdCBoZXJlIHRvby4gICovCi0KLWJvb2xlYW4KLWNvZmZfcmVudW1iZXJfc3ltYm9scyAoYmZkX3B0ciwgZmlyc3RfdW5kZWYpCi0gICAgIGJmZCAqYmZkX3B0cjsKLSAgICAgaW50ICpmaXJzdF91bmRlZjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGJmZF9wdHIpOwotICBhc3ltYm9sICoqc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgbmF0aXZlX2luZGV4ID0gMDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqbGFzdF9maWxlID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikgTlVMTDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmRleDsKLQotICAvKiBDT0ZGIGRlbWFuZHMgdGhhdCB1bmRlZmluZWQgc3ltYm9scyBjb21lIGFmdGVyIGFsbCBvdGhlciBzeW1ib2xzLgotICAgICBTaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGltcG9zZSB0aGlzIGV4dHJhIGtub3dsZWRnZSBvbiBhbGwgb3VyCi0gICAgIGNsaWVudCBwcm9ncmFtcywgZGVhbCB3aXRoIHRoYXQgaGVyZS4gIFNvcnQgdGhlIHN5bWJvbCB0YWJsZTsKLSAgICAganVzdCBtb3ZlIHRoZSB1bmRlZmluZWQgc3ltYm9scyB0byB0aGUgZW5kLCBsZWF2aW5nIHRoZSByZXN0Ci0gICAgIGFsb25lLiAgVGhlIE8nUmVpbGx5IGJvb2sgc2F5cyB0aGF0IGRlZmluZWQgZ2xvYmFsIHN5bWJvbHMgY29tZQotICAgICBhdCB0aGUgZW5kIGJlZm9yZSB0aGUgdW5kZWZpbmVkIHN5bWJvbHMsIHNvIHdlIGRvIHRoYXQgaGVyZSBhcwotICAgICB3ZWxsLiAgKi8KLSAgLyogQEAgRG8gd2UgaGF2ZSBzb21lIGNvbmRpdGlvbiB3ZSBjb3VsZCB0ZXN0IGZvciwgc28gd2UgZG9uJ3QgYWx3YXlzCi0gICAgIGhhdmUgdG8gZG8gdGhpcz8gIEkgZG9uJ3QgdGhpbmsgcmVsb2NhdGFiaWxpdHkgaXMgcXVpdGUgcmlnaHQsIGJ1dAotICAgICBJJ20gbm90IGNlcnRhaW4uICBbcmFlYnVybjoxOTkyMDUwOC4xNzExRVNUXSAgKi8KLSAgewotICAgIGFzeW1ib2wgKipuZXdzeW1zOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGJmZF9wdHIsCi0JCQkJICAgICAgc2l6ZW9mIChhc3ltYm9sICopICogKHN5bWJvbF9jb3VudCArIDEpKTsKLSAgICBpZiAoIW5ld3N5bXMpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgYmZkX3B0ci0+b3V0c3ltYm9scyA9IG5ld3N5bXM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKQotICAgICAgaWYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMAotCSAgfHwgKCFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgICYmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwCi0JCSAgfHwgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkJICAgICAgPT0gMCkpKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9sX2NvdW50OyBpKyspCi0gICAgICBpZiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSA9PSAwCi0JICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKLQkgICYmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgIHx8ICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwCi0JCSAgJiYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkJICAgICAgIT0gMCkpKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0KLSAgICAqZmlyc3RfdW5kZWYgPSBuZXdzeW1zIC0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xfY291bnQ7IGkrKykKLSAgICAgIGlmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpID09IDAKLQkgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pKQotCSpuZXdzeW1zKysgPSBzeW1ib2xfcHRyX3B0cltpXTsKLSAgICAqbmV3c3ltcyA9IChhc3ltYm9sICopIE5VTEw7Ci0gICAgc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB9Ci0KLSAgZm9yIChzeW1ib2xfaW5kZXggPSAwOyBzeW1ib2xfaW5kZXggPCBzeW1ib2xfY291bnQ7IHN5bWJvbF9pbmRleCsrKQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0ciA9IGNvZmZfc3ltYm9sX2Zyb20gKGJmZF9wdHIsIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0pOwotICAgICAgc3ltYm9sX3B0cl9wdHJbc3ltYm9sX2luZGV4XS0+dWRhdGEuaSA9IHN5bWJvbF9pbmRleDsgCi0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyICYmIGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlKQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnMgPSBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZTsKLQkgIGludCBpOwotCi0JICBpZiAocy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgaWYgKGxhc3RfZmlsZSAhPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKSBOVUxMKQotCQlsYXN0X2ZpbGUtPm5fdmFsdWUgPSBuYXRpdmVfaW5kZXg7Ci0JICAgICAgbGFzdF9maWxlID0gJihzLT51LnN5bWVudCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCi0JICAgICAgLyogTW9kaWZ5IHRoZSBzeW1ib2wgdmFsdWVzIGFjY29yZGluZyB0byB0aGVpciBzZWN0aW9uIGFuZAotCSAgICAgICAgIHR5cGUgKi8KLQotCSAgICAgIGZpeHVwX3N5bWJvbF92YWx1ZSAoYmZkX3B0ciwgY29mZl9zeW1ib2xfcHRyLCAmKHMtPnUuc3ltZW50KSk7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBzLT51LnN5bWVudC5uX251bWF1eCArIDE7IGkrKykKLQkgICAgc1tpXS5vZmZzZXQgPSBuYXRpdmVfaW5kZXgrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmF0aXZlX2luZGV4Kys7Ci0JfQotICAgIH0KLSAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYmZkX3B0cikgPSBuYXRpdmVfaW5kZXg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJ1biB0aG9yb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFnYWluLCBhbmQgZml4IGl0IHNvIHRoYXQgYWxsCi0gICBwb2ludGVycyB0byBlbnRyaWVzIGFyZSBjaGFuZ2VkIHRvIHRoZSBlbnRyaWVzJyBpbmRleCBpbiB0aGUgb3V0cHV0Ci0gICBzeW1ib2wgdGFibGUuICAqLwotCi12b2lkCi1jb2ZmX21hbmdsZV9zeW1ib2xzIChiZmRfcHRyKQotICAgICBiZmQgKmJmZF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChiZmRfcHRyKTsKLSAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfcHRyID0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmRleDsKLQotICBmb3IgKHN5bWJvbF9pbmRleCA9IDA7IHN5bWJvbF9pbmRleCA8IHN5bWJvbF9jb3VudDsgc3ltYm9sX2luZGV4KyspCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyID0KLSAgICAgIGNvZmZfc3ltYm9sX2Zyb20gKGJmZF9wdHIsIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0pOwotCi0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyICYmIGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlKQotCXsKLQkgIGludCBpOwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlOwotCi0JICBpZiAocy0+Zml4X3ZhbHVlKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCB1c2UgYSB1bmlvbiBoZXJlLiAgKi8KLQkgICAgICBzLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKChjb21iaW5lZF9lbnRyeV90eXBlICopIHMtPnUuc3ltZW50Lm5fdmFsdWUpLT5vZmZzZXQ7Ci0JICAgICAgcy0+Zml4X3ZhbHVlID0gMDsKLQkgICAgfQotCSAgaWYgKHMtPmZpeF9saW5lKQotCSAgICB7Ci0JICAgICAgLyogVGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcwotICAgICAgICAgICAgICAgICBmb3IgdGhlIHN5bWJvbCdzIHNlY3Rpb24uICBPbiBvdXRwdXQsIHRoZSBzeW1ib2wncwotICAgICAgICAgICAgICAgICBzZWN0aW9uIHNob3VsZCBiZSBOX0RFQlVHLiAgKi8KLQkgICAgICBzLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJICsgcy0+dS5zeW1lbnQubl92YWx1ZSAqIGJmZF9jb2ZmX2xpbmVzeiAoYmZkX3B0cikpOwotCSAgICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24gPQotCQljb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGJmZF9wdHIsIE5fREVCVUcpOwotCSAgICAgIEJGRF9BU1NFUlQgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLmZsYWdzICYgQlNGX0RFQlVHR0lORyk7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBzLT51LnN5bWVudC5uX251bWF1eDsgaSsrKQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYSA9IHMgKyBpICsgMTsKLQkgICAgICBpZiAoYS0+Zml4X3RhZykKLQkJewotCQkgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LmwgPQotCQkgICAgYS0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF90YWcgPSAwOwotCQl9Ci0JICAgICAgaWYgKGEtPmZpeF9lbmQpCi0JCXsKLQkJICBhLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLQkJICAgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAtPm9mZnNldDsKLQkJICBhLT5maXhfZW5kID0gMDsKLQkJfQotCSAgICAgIGlmIChhLT5maXhfc2NubGVuKQotCQl7Ci0JCSAgYS0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sID0KLQkJICAgIGEtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF9zY25sZW4gPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY29mZl9maXhfc3ltYm9sX25hbWUgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCBzdHJpbmdfc2l6ZV9wLAotCQkgICAgICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhlbnQ7Ci0gIGNoYXIgKm5hbWUgPSAoY2hhciAqKSAoc3ltYm9sLT5uYW1lKTsKLQotICBpZiAobmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIGNvZmYgc3ltYm9scyBhbHdheXMgaGF2ZSBuYW1lcywgc28gd2UnbGwgbWFrZSBvbmUgdXAgKi8KLSAgICAgIHN5bWJvbC0+bmFtZSA9ICJzdHJhbmdlIjsKLSAgICAgIG5hbWUgPSAoY2hhciAqKSBzeW1ib2wtPm5hbWU7Ci0gICAgfQotICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFCi0gICAgICAmJiBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLSAgICB7Ci0gICAgICBzdHJuY3B5IChuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX25hbWUsICIuZmlsZSIsIFNZTU5NTEVOKTsKLSAgICAgIGF1eGVudCA9ICYobmF0aXZlICsgMSktPnUuYXV4ZW50OwotCi0gICAgICBpZiAoYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMgKGFiZmQpKQotCXsKLQkgIGlmIChuYW1lX2xlbmd0aCA8PSBGSUxOTUxFTikKLQkgICAgewotCSAgICAgIHN0cm5jcHkgKGF1eGVudC0+eF9maWxlLnhfZm5hbWUsIG5hbWUsIEZJTE5NTEVOKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXV4ZW50LT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gKnN0cmluZ19zaXplX3AgKyBTVFJJTkdfU0laRV9TSVpFOwotCSAgICAgIGF1eGVudC0+eF9maWxlLnhfbi54X3plcm9lcyA9IDA7Ci0JICAgICAgKnN0cmluZ19zaXplX3AgKz0gbmFtZV9sZW5ndGggKyAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cm5jcHkgKGF1eGVudC0+eF9maWxlLnhfZm5hbWUsIG5hbWUsIEZJTE5NTEVOKTsKLQkgIGlmIChuYW1lX2xlbmd0aCA+IEZJTE5NTEVOKQotCSAgICB7Ci0JICAgICAgbmFtZVtGSUxOTUxFTl0gPSAnXDAnOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChuYW1lX2xlbmd0aCA8PSBTWU1OTUxFTikKLQl7Ci0JICAvKiBUaGlzIG5hbWUgd2lsbCBmaXQgaW50byB0aGUgc3ltYm9sIG5lYXRseSAqLwotCSAgc3RybmNweSAobmF0aXZlLT51LnN5bWVudC5fbi5fbl9uYW1lLCBzeW1ib2wtPm5hbWUsIFNZTU5NTEVOKTsKLQl9Ci0gICAgICBlbHNlIGlmICghYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwgJm5hdGl2ZS0+dS5zeW1lbnQpKQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAoKnN0cmluZ19zaXplX3AKLQkJCQkJCSsgU1RSSU5HX1NJWkVfU0laRSk7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICpzdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBmaWxlcG9zOwotCSAgYmZkX2J5dGUgYnVmWzJdOwotCi0JICAvKiBUaGlzIG5hbWUgc2hvdWxkIGJlIHdyaXR0ZW4gaW50byB0aGUgLmRlYnVnIHNlY3Rpb24uICBGb3IKLQkgICAgIHNvbWUgcmVhc29uIGVhY2ggbmFtZSBpcyBwcmVjZWRlZCBieSBhIHR3byBieXRlIGxlbmd0aAotCSAgICAgYW5kIGFsc28gZm9sbG93ZWQgYnkgYSBudWxsIGJ5dGUuICBGSVhNRTogV2UgYXNzdW1lIHRoYXQKLQkgICAgIHRoZSAuZGVidWcgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGFuZCB0aGF0IGl0Ci0JICAgICBpcyBsYXJnZSBlbm91Z2guICAqLwotCSAgaWYgKCpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wID09IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0JICBmaWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgbmFtZV9sZW5ndGggKyAxLCBidWYpOwotCSAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJCSAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCQkJIChQVFIpIGJ1ZiwKLQkJCQkJIChmaWxlX3B0cikgKmRlYnVnX3N0cmluZ19zaXplX3AsCi0JCQkJCSAoYmZkX3NpemVfdHlwZSkgMikKLQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJCQkgICAgKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JCQkJCSAgICAoUFRSKSBzeW1ib2wtPm5hbWUsCi0JCQkJCSAgICAoKGZpbGVfcHRyKSAqZGVidWdfc3RyaW5nX3NpemVfcAotCQkJCQkgICAgICsgMiksCi0JCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgbmFtZV9sZW5ndGggKyAxKSkKLQkgICAgYWJvcnQgKCk7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBhYm9ydCAoKTsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAqZGVidWdfc3RyaW5nX3NpemVfcCArIDI7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICpkZWJ1Z19zdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMzsKLQl9Ci0gICAgfQotfQotCi0vKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHN5bWJvbCBpbmRleCBzbyB0aGF0IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICB0aGUgcmVsb2NzIHdlIGNhbiBnZXQgdGhlIGluZGV4IGZvciBhIHN5bWJvbC4gIFRoaXMgbWV0aG9kIGlzIGEKLSAgIGhhY2suICBGSVhNRS4gICovCi0KLSNkZWZpbmUgc2V0X2luZGV4KHN5bWJvbCwgaWR4KQkoKHN5bWJvbCktPnVkYXRhLmkgPSAoaWR4KSkKLQotLyogV3JpdGUgYSBzeW1ib2wgb3V0IHRvIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfc3ltYm9sIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJICAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLSAgICAgdW5zaWduZWQgaW50ICp3cml0dGVuOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1hdXggPSBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4OwotICBpbnQgdHlwZSA9IG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlOwotICBpbnQgY2xhc3MgPSBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzOwotICBQVFIgYnVmOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLQotICBpZiAobmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0gICAgc3ltYm9sLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lORwotICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fREVCVUc7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9BQlM7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPQotCXN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgY29mZl9maXhfc3ltYm9sX25hbWUgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCBzdHJpbmdfc2l6ZV9wLAotCQkJZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgYnVmID0gYmZkX2FsbG9jIChhYmZkLCBzeW1lc3opOwotICBpZiAoIWJ1ZikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgJm5hdGl2ZS0+dS5zeW1lbnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgc3ltZXN6LCBhYmZkKSAhPSBzeW1lc3opCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgYnVmKTsKLQotICBpZiAobmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBhdXhlc3o7Ci0gICAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgICAgYXV4ZXN6ID0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKTsKLSAgICAgIGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgYXV4ZXN6KTsKLSAgICAgIGlmICghYnVmKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4OyBqKyspCi0JewotCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChhYmZkLAotCQkJCSAmKChuYXRpdmUgKyBqICsgMSktPnUuYXV4ZW50KSwKLQkJCQkgdHlwZSwKLQkJCQkgY2xhc3MsCi0JCQkJIGosCi0JCQkJIG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgsCi0JCQkJIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIGF1eGVzeiwgYWJmZCkgIT0gYXV4ZXN6KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1Zik7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSBpbmRleCBmb3IgdXNlIHdoZW4gd2Ugd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICBzZXRfaW5kZXggKHN5bWJvbCwgKndyaXR0ZW4pOwotCi0gICp3cml0dGVuICs9IG51bWF1eCArIDE7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzeW1ib2wgdG8gYSBDT0ZGIGZpbGUgdGhhdCBkb2VzIG5vdCBjb21lIGZyb20gYSBDT0ZGCi0gICBmaWxlIG9yaWdpbmFsbHkuICBUaGlzIHN5bWJvbCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIGxpbmtlciwKLSAgIG9yIHdlIG1heSBiZSBsaW5raW5nIGEgbm9uIENPRkYgZmlsZSB0byBhIENPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkJIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgKndyaXR0ZW47Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICBjb21iaW5lZF9lbnRyeV90eXBlIGR1bW15OwotCi0gIG5hdGl2ZSA9ICZkdW1teTsKLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSBUX05VTEw7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IDA7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBpc24ndCBtdWNoIHBvaW50IHRvIHdyaXRpbmcgb3V0IGEgZGVidWdnaW5nIHN5bWJvbAotICAgICAgICAgdW5sZXNzIHdlIGFyZSBwcmVwYXJlZCB0byBjb252ZXJ0IGl0IGludG8gQ09GRiBkZWJ1Z2dpbmcKLSAgICAgICAgIGZvcm1hdC4gIFNvLCB3ZSBqdXN0IGlnbm9yZSB0aGVtLiAgV2UgbXVzdCBjbG9iYmVyIHRoZSBzeW1ib2wKLSAgICAgICAgIG5hbWUgdG8ga2VlcCBpdCBmcm9tIGJlaW5nIHB1dCBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgICAgIHN5bWJvbC0+bmFtZSA9ICIiOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0KLQlzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSAoc3ltYm9sLT52YWx1ZQotCQkJCSAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQluYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBDb3B5IHRoZSBhbnkgZmxhZ3MgZnJvbSB0aGUgdGhlIGZpbGUgaGVhZGVyIGludG8gdGhlIHN5bWJvbC4KLSAgICAgICAgIEZJWE1FOiBXaHk/ICAqLwotICAgICAgewotCWNvZmZfc3ltYm9sX3R5cGUgKmMgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCWlmIChjICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwpCi0JICBuYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSBiZmRfYXN5bWJvbF9iZmQgKCZjLT5zeW1ib2wpLT5mbGFnczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSAwOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkKLSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0gICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IG9ial9wZSAoYWJmZCkgPyBDX05UX1dFQUsgOiBDX1dFQUtFWFQ7Ci0gIGVsc2UKLSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19FWFQ7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPSAwOwotCi0gIHJldHVybiBjb2ZmX3dyaXRlX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCQkgICAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCk7Ci19Ci0KLS8qIFdyaXRlIGEgbmF0aXZlIHN5bWJvbCB0byBhIENPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJCSAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb2ZmX3N5bWJvbF90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCAqd3JpdHRlbjsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKLSAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOwotICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmUgPSBzeW1ib2wtPm5hdGl2ZTsKLSAgYWxlbnQgKmxpbmVubyA9IHN5bWJvbC0+bGluZW5vOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBhc3NvY2lhdGVkIGxpbmUgbnVtYmVyLCB3ZSBtdXN0IHN0b3JlIHRoZQotICAgICBzeW1ib2wgaW5kZXggaW4gdGhlIGxpbmUgbnVtYmVyIGZpZWxkLiAgV2UgYWxzbyB0YWcgdGhlIGF1eGVudCB0bwotICAgICBwb2ludCB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIGxpbmVubyB0YWJsZS4gICovCi0gIGlmIChsaW5lbm8gJiYgIXN5bWJvbC0+ZG9uZV9saW5lbm8gJiYgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotICAgICAgbGluZW5vW2NvdW50XS51Lm9mZnNldCA9ICp3cml0dGVuOwotICAgICAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgpCi0JewotCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphID0gJigobmF0aXZlICsgMSktPnUuYXV4ZW50KTsKLQotCSAgYS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0KLQkgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm1vdmluZ19saW5lX2ZpbGVwb3M7Ci0JfQotCi0gICAgICAvKiBDb3VudCBhbmQgcmVsb2NhdGUgYWxsIG90aGVyIGxpbmVudW1iZXJzLiAgKi8KLSAgICAgIGNvdW50Kys7Ci0gICAgICB3aGlsZSAobGluZW5vW2NvdW50XS5saW5lX251bWJlciAhPSAwKQotCXsKLSNpZiAwCi0JICAvKiAxMyBhcHJpbCA5Mi4gc2FjIAotCSAgICAgSSd2ZSBiZWVuIHRvbGQgdGhpcywgYnV0IHN0aWxsIG5lZWQgcHJvb2Y6Ci0JICAgICA+IFRoZSBzZWNvbmQgYnVnIGlzIGFsc28gaW4gYGJmZC9jb2ZmY29kZS5oJy4gIFRoaXMgYnVnCi0JICAgICA+IGNhdXNlcyB0aGUgbGlua2VyIHRvIHNjcmV3IHVwIHRoZSBwYy1yZWxvY2F0aW9ucyBmb3IKLQkgICAgID4gYWxsIHRoZSBsaW5lIG51bWJlcnMgaW4gQ09GRiBjb2RlLiAgVGhpcyBidWcgaXNuJ3Qgb25seQotCSAgICAgPiBzcGVjaWZpYyB0byBBMjlLIGltcGxlbWVudGF0aW9ucywgYnV0IGFmZmVjdHMgYWxsCi0JICAgICA+IHN5c3RlbXMgdXNpbmcgQ09GRiBmb3JtYXQgYmluYXJpZXMuICBOb3RlIHRoYXQgaW4gQ09GRgotCSAgICAgPiBvYmplY3QgZmlsZXMsIHRoZSBsaW5lIG51bWJlciBjb3JlIG9mZnNldHMgb3V0cHV0IGJ5Ci0JICAgICA+IHRoZSBhc3NlbWJsZXIgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiBlYWNoCi0JICAgICA+IHByb2NlZHVyZSwgbm90IHRvIHRoZSBzdGFydCBvZiB0aGUgLnRleHQgc2VjdGlvbi4gIFRoaXMKLQkgICAgID4gcGF0Y2ggcmVsb2NhdGVzIHRoZSBsaW5lIG51bWJlcnMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICA+IGBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUnIGluc3RlYWQgb2YgdGhlIHNlY3Rpb24KLQkgICAgID4gdmlydHVhbCBhZGRyZXNzLgotCSAgICAgPiBtb2R1bGFyIW9sc29uQGNzLmFyaXpvbmEuZWR1IChKb24gT2xzb24pCi0JICAgKi8KLQkgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgKz0gbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwotI2Vsc2UKLQkgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgKz0KLQkgICAgKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICsgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgc3ltYm9sLT5kb25lX2xpbmVubyA9IHRydWU7Ci0KLSAgICAgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5tb3ZpbmdfbGluZV9maWxlcG9zICs9Ci0JY291bnQgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICAgIH0KLQotICByZXR1cm4gY29mZl93cml0ZV9zeW1ib2wgKGFiZmQsICYoc3ltYm9sLT5zeW1ib2wpLCBuYXRpdmUsIHdyaXR0ZW4sCi0JCQkgICAgc3RyaW5nX3NpemVfcCwgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCSAgICBkZWJ1Z19zdHJpbmdfc2l6ZV9wKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBDT0ZGIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1jb2ZmX3dyaXRlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzdHJpbmdfc2l6ZTsKLSAgYXNlY3Rpb24gKmRlYnVnX3N0cmluZ19zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGRlYnVnX3N0cmluZ19zaXplOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGxpbWl0ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCB3cml0dGVuID0gMDsKLSAgYXN5bWJvbCAqKnA7Ci0KLSAgc3RyaW5nX3NpemUgPSAwOwotICBkZWJ1Z19zdHJpbmdfc2VjdGlvbiA9IE5VTEw7Ci0gIGRlYnVnX3N0cmluZ19zaXplID0gMDsKLQotICAvKiBJZiB0aGlzIHRhcmdldCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMsIHRoZXkgbXVzdCBiZSBwdXQgaW50bwotICAgICB0aGUgc3RyaW5nIHRhYmxlLiAgVGhpcyBpcyBzdXBwb3J0ZWQgYnkgUEUuICBUaGlzIGNvZGUgbXVzdAotICAgICBoYW5kbGUgc2VjdGlvbiBuYW1lcyBqdXN0IGFzIHRoZXkgYXJlIGhhbmRsZWQgaW4KLSAgICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuICAqLwotICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgbGVuID0gc3RybGVuIChvLT5uYW1lKTsKLQkgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkgICAgc3RyaW5nX3NpemUgKz0gbGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIFNlZWsgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE91dHB1dCBhbGwgdGhlIHN5bWJvbHMgd2UgaGF2ZSAqLwotCi0gIHdyaXR0ZW4gPSAwOwotICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsgaSA8IGxpbWl0OyBpKyssIHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW1ib2wgPSAqcDsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNfc3ltYm9sID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLQotICAgICAgaWYgKGNfc3ltYm9sID09IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwKLQkgIHx8IGNfc3ltYm9sLT5uYXRpdmUgPT0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgTlVMTCkKLQl7Ci0JICBpZiAoIWNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sIChhYmZkLCBzeW1ib2wsICZ3cml0dGVuLCAmc3RyaW5nX3NpemUsCi0JCQkJCSZkZWJ1Z19zdHJpbmdfc2VjdGlvbiwKLQkJCQkJJmRlYnVnX3N0cmluZ19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIWNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCAoYWJmZCwgY19zeW1ib2wsICZ3cml0dGVuLAotCQkJCQkgJnN0cmluZ19zaXplLCAmZGVidWdfc3RyaW5nX3NlY3Rpb24sCi0JCQkJCSAmZGVidWdfc3RyaW5nX3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSB3cml0dGVuOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgc3RyaW5ncyAqLwotCi0gIGlmIChzdHJpbmdfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplID0gc3RyaW5nX3NpemUgKyBTVFJJTkdfU0laRV9TSVpFOwotICAgICAgYmZkX2J5dGUgYnVmZmVyW1NUUklOR19TSVpFX1NJWkVdOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNpemUsIGJ1ZmZlcik7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKSAhPSBzaXplb2YgKGJ1ZmZlcikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLiAgVGhpcyBjb2RlIG11c3QgaGFuZGxlIHNlY3Rpb24KLQkgbmFtZXMganVzdCBhcyB0aGV5IGFyZSBoYW5kbGVkIGluIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpKQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW47Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKG8tPm5hbWUpOwotCSAgICAgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkJewotCQkgIGlmIChiZmRfd3JpdGUgKG8tPm5hbWUsIDEsIGxlbiArIDEsIGFiZmQpICE9IGxlbiArIDEpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7Ci0JICAgaSA8IGxpbWl0OwotCSAgIGkrKywgcCsrKQotCXsKLQkgIGFzeW1ib2wgKnEgPSAqcDsKLQkgIHNpemVfdCBuYW1lX2xlbmd0aCA9IHN0cmxlbiAocS0+bmFtZSk7Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpjX3N5bWJvbCA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHEpOwotCSAgc2l6ZV90IG1heGxlbjsKLQotCSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSBzeW1ib2wgbmFtZSBzaG91bGQgZ28gaW4gdGhlIHN0cmluZwotCSAgICAgdGFibGUuICBTeW1ib2wgbmFtZXMgdGhhdCBhcmUgc2hvcnQgZW5vdWdoIGFyZSBzdG9yZWQKLQkgICAgIGRpcmVjdGx5IGluIHRoZSBzeW1lbnQgc3RydWN0dXJlLiAgRmlsZSBuYW1lcyBwZXJtaXQgYQotCSAgICAgZGlmZmVyZW50LCBsb25nZXIsIGxlbmd0aCBpbiB0aGUgc3ltZW50IHN0cnVjdHVyZS4gIE9uCi0JICAgICBYQ09GRiwgc29tZSBzeW1ib2wgbmFtZXMgYXJlIHN0b3JlZCBpbiB0aGUgLmRlYnVnIHNlY3Rpb24KLQkgICAgIHJhdGhlciB0aGFuIGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCi0JICBpZiAoY19zeW1ib2wgPT0gTlVMTAotCSAgICAgIHx8IGNfc3ltYm9sLT5uYXRpdmUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgbm90IGEgQ09GRiBzeW1ib2wsIHNvIGl0IGNlcnRhaW5seSBpcyBub3QgYQotCSAgICAgICAgIGZpbGUgbmFtZSwgbm9yIGRvZXMgaXQgZ28gaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgICAgICBtYXhsZW4gPSBTWU1OTUxFTjsKLQkgICAgfQotCSAgZWxzZSBpZiAoYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwKLQkJCQkJICAgICAgJmNfc3ltYm9sLT5uYXRpdmUtPnUuc3ltZW50KSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIG5hbWUgaXMgaW4gdGhlIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uLgotCSAgICAgICAgIERvbid0IHdyaXRlIGl0IGludG8gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICAgICAgbWF4bGVuID0gbmFtZV9sZW5ndGg7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGNfc3ltYm9sLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQotCQkgICAmJiBjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JICAgIG1heGxlbiA9IEZJTE5NTEVOOwotCSAgZWxzZQotCSAgICBtYXhsZW4gPSBTWU1OTUxFTjsKLQotCSAgaWYgKG5hbWVfbGVuZ3RoID4gbWF4bGVuKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgKHEtPm5hbWUpLCAxLCBuYW1lX2xlbmd0aCArIDEsIGFiZmQpCi0JCSAgIT0gbmFtZV9sZW5ndGggKyAxKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2Ugd291bGQgbm9ybWFsbHkgbm90IHdyaXRlIGFueXRoaW5nIGhlcmUsIGJ1dCB3ZSdsbCB3cml0ZQotICAgICAgICAgb3V0IDQgc28gdGhhdCBhbnkgc3R1cGlkIGNvZmYgcmVhZGVyIHdoaWNoIHRyaWVzIHRvIHJlYWQgdGhlCi0gICAgICAgICBzdHJpbmcgdGFibGUgZXZlbiB3aGVuIHRoZXJlIGlzbid0IG9uZSB3b24ndCBjcm9hay4gICovCi0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IFNUUklOR19TSVpFX1NJWkU7Ci0gICAgICBiZmRfYnl0ZSBidWZmZXJbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgc2l6ZSwgYnVmZmVyKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKQotCSAgIT0gU1RSSU5HX1NJWkVfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgLmRlYnVnIHNlY3Rpb24gd2FzIGNyZWF0ZWQgdG8gYmUgdGhlIGNvcnJlY3Qgc2l6ZS4KLSAgICAgV2Ugc2hvdWxkIGNyZWF0ZSBpdCBvdXJzZWx2ZXMgb24gdGhlIGZseSwgYnV0IHdlIGRvbid0IGJlY2F1c2UKLSAgICAgQkZEIHdvbid0IGxldCB1cyB3cml0ZSB0byBhbnkgc2VjdGlvbiB1bnRpbCB3ZSBrbm93IGhvdyBsYXJnZSBhbGwKLSAgICAgdGhlIHNlY3Rpb25zIGFyZS4gIFdlIGNvdWxkIHN0aWxsIGRvIGl0IGJ5IG1ha2luZyBhbm90aGVyIHBhc3MKLSAgICAgb3ZlciB0aGUgc3ltYm9scy4gIEZJWE1FLiAgKi8KLSAgQkZEX0FTU0VSVCAoZGVidWdfc3RyaW5nX3NpemUgPT0gMAotCSAgICAgIHx8IChkZWJ1Z19zdHJpbmdfc2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTAotCQkgICYmIChCRkRfQUxJR04gKGRlYnVnX3N0cmluZ19zaXplLAotCQkJCSAxIDw8IGRlYnVnX3N0cmluZ19zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCi0JCSAgICAgID09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRlYnVnX3N0cmluZ19zZWN0aW9uKSkpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotY29mZl93cml0ZV9saW5lbnVtYmVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIFBUUiBidWZmOwotCi0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIGJ1ZmYgPSBiZmRfYWxsb2MgKGFiZmQsIGxpbmVzeik7Ci0gIGlmICghYnVmZikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAocy0+bGluZW5vX2NvdW50KQotCXsKLQkgIGFzeW1ib2wgKipxID0gYWJmZC0+b3V0c3ltYm9sczsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgcy0+bGluZV9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmluZCBhbGwgdGhlIGxpbmVudW1iZXJzIGluIHRoaXMgc2VjdGlvbiAqLwotCSAgd2hpbGUgKCpxKQotCSAgICB7Ci0JICAgICAgYXN5bWJvbCAqcCA9ICpxOwotCSAgICAgIGlmIChwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBzKQotCQl7Ci0JCSAgYWxlbnQgKmwgPQotCQkgIEJGRF9TRU5EIChiZmRfYXN5bWJvbF9iZmQgKHApLCBfZ2V0X2xpbmVubywKLQkJCSAgICAoYmZkX2FzeW1ib2xfYmZkIChwKSwgcCkpOwotCQkgIGlmIChsKQotCQkgICAgewotCQkgICAgICAvKiBGb3VuZCBhIGxpbmVudW1iZXIgZW50cnksIG91dHB1dCAqLwotCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIG91dDsKLQkJICAgICAgbWVtc2V0ICgoUFRSKSAmIG91dCwgMCwgc2l6ZW9mIChvdXQpKTsKLQkJICAgICAgb3V0LmxfbG5ubyA9IDA7Ci0JCSAgICAgIG91dC5sX2FkZHIubF9zeW1uZHggPSBsLT51Lm9mZnNldDsKLQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChhYmZkLCAmb3V0LCBidWZmKTsKLQkJICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgbGluZXN6LCBhYmZkKSAhPSBsaW5lc3opCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGwrKzsKLQkJICAgICAgd2hpbGUgKGwtPmxpbmVfbnVtYmVyKQotCQkJewotCQkJICBvdXQubF9sbm5vID0gbC0+bGluZV9udW1iZXI7Ci0JCQkgIG91dC5sX2FkZHIubF9zeW1uZHggPSBsLT51Lm9mZnNldDsKLQkJCSAgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChhYmZkLCAmb3V0LCBidWZmKTsKLQkJCSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgbGluZXN6LCBhYmZkKSAhPSBsaW5lc3opCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICBsKys7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBxKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBiZmRfcmVsZWFzZSAoYWJmZCwgYnVmZik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKkFSR1NVU0VEICovCi1hbGVudCAqCi1jb2ZmX2dldF9saW5lbm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgcmV0dXJuIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubzsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scywgd2hpY2ggaGFzIGJlZW4KLSAgIGRpc2FibGVkLiAgKi8KLQotYXN5bWJvbCAqCi1jb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIG5hbWUpOwotICBhc3ltYm9sICpzeW07Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmNzeW07Ci0KLSAgc3ltID0gc2VjLT5zeW1ib2w7Ci0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW0pLT5uYXRpdmU7Ci0gIC8qIE1ha2Ugc3VyZSBiYWNrLWVuZCBDT0ZGIHN0dWZmIGlzIHRoZXJlLiAgKi8KLSAgaWYgKGNzeW0gPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZm9vCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSBzeW07Ci0JICAvKiBAQEZJWE1FIFRoaXMgc2hvdWxkbid0IHVzZSBhIGZpeGVkIHNpemUhISAgKi8KLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgZVsxMF07Ci0JfTsKLSAgICAgIHN0cnVjdCBmb28gKmY7Ci0gICAgICBmID0gKHN0cnVjdCBmb28gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCpmKSk7Ci0gICAgICBpZiAoIWYpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgZiwgMCwgc2l6ZW9mICgqZikpOwotICAgICAgY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltKS0+bmF0aXZlID0gY3N5bSA9IGYtPmU7Ci0gICAgfQotICBjc3ltWzBdLnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotICBjc3ltWzBdLnUuc3ltZW50Lm5fbnVtYXV4ID0gMTsKLS8qICBTRl9TRVRfU1RBVElDUyAoc3ltKTsgICAgICAgQEAgPz8/ICovCi0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9zY25sZW4gPSBzZWMtPl9yYXdfc2l6ZTsKLSAgY3N5bVsxXS51LmF1eGVudC54X3Njbi54X25yZWxvYyA9IHNlYy0+cmVsb2NfY291bnQ7Ci0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9ubGlubm8gPSBzZWMtPmxpbmVub19jb3VudDsKLQotICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0gICAgICBzZWMtPm91dHB1dF9vZmZzZXQgPSAwOwotICAgIH0KLQotICByZXR1cm4gc3ltOwotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIG9mZnNldHMgaW50byB0aGUgc3ltYm9sIHRhYmxlIGludG8KLSAgIHBvaW50ZXJzIHRvIHN5bWVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9wb2ludGVyaXplX2F1eCAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eGVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXg7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eGVudDsKLXsKLSAgdW5zaWduZWQgaW50IHR5cGUgPSBzeW1ib2wtPnUuc3ltZW50Lm5fdHlwZTsKLSAgdW5zaWduZWQgaW50IGNsYXNzID0gc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzczsKLQotICBpZiAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykKLSAgICB7Ci0gICAgICBpZiAoKCpjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKQotCSAgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXhlbnQpKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgYm90aGVyIGlmIHRoaXMgaXMgYSBmaWxlIG9yIGEgc2VjdGlvbiAqLwotICBpZiAoY2xhc3MgPT0gQ19TVEFUICYmIHR5cGUgPT0gVF9OVUxMKQotICAgIHJldHVybjsKLSAgaWYgKGNsYXNzID09IENfRklMRSkKLSAgICByZXR1cm47Ci0KLSAgLyogT3RoZXJ3aXNlIHBhdGNoIHVwICovCi0jZGVmaW5lIE5fVE1BU0sgY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0c2hmdAotICBpZiAoKElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpIHx8IGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04pCi0gICAgICAmJiBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPiAwKQotICAgIHsKLSAgICAgIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucCA9Ci0JdGFibGVfYmFzZSArIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLSAgICAgIGF1eGVudC0+Zml4X2VuZCA9IDE7Ci0gICAgfQotICAvKiBBIG5lZ2F0aXZlIHRhZ25keCBpcyBtZWFuaW5nbGVzcywgYnV0IHRoZSBTQ08gMy4ydjQgY2MgY2FuCi0gICAgIGdlbmVyYXRlIG9uZSwgc28gd2UgbXVzdCBiZSBjYXJlZnVsIHRvIGlnbm9yZSBpdC4gICovCi0gIGlmIChhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LmwgPiAwKQotICAgIHsKLSAgICAgIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucCA9Ci0JdGFibGVfYmFzZSArIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubDsKLSAgICAgIGF1eGVudC0+Zml4X3RhZyA9IDE7Ci0gICAgfQotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlICIuZGVidWciIHNlY3Rpb24sIGFuZCByZWFkIGl0LgotICAgV2UgZGlkIG5vdCByZWFkIHRoZSBkZWJ1ZyBzZWN0aW9uIHVudGlsIG5vdywgYmVjYXVzZQotICAgd2UgZGlkbid0IHdhbnQgdG8gZ28gdG8gdGhlIHRyb3VibGUgdW50aWwgc29tZW9uZSBuZWVkZWQgaXQuICovCi0KLXN0YXRpYyBjaGFyICoKLWJ1aWxkX2RlYnVnX3NlY3Rpb24gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqZGVidWdfc2VjdGlvbjsKLSAgbG9uZyBwb3NpdGlvbjsKLQotICBhc2VjdGlvbiAqc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0KLSAgaWYgKCFzZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBkZWJ1Z19zZWN0aW9uID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCkpOwotICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYC5kZWJ1Zycgc2VjdGlvbiBhbmQgcmVhZCBpdC4gCi0gICAgIFNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gZmlyc3Q7IGl0IGlzIG5lZWRlZCBieSBvdXIgY2FsbGVyLgotICAgICBUaGVuIHJlYWQgZGVidWcgc2VjdGlvbiBhbmQgcmVzZXQgdGhlIGZpbGUgcG9pbnRlci4gICovCi0KLSAgcG9zaXRpb24gPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdC0+ZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoZGVidWdfc2VjdGlvbiwKLQkJICAgIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCksIDEsIGFiZmQpCi0JICAhPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpKQotICAgICAgfHwgYmZkX3NlZWsgKGFiZmQsIHBvc2l0aW9uLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGRlYnVnX3NlY3Rpb247Ci19Ci0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIG1hbGxvYydkIGNvcHkgb2YgJ25hbWUnLiAgJ25hbWUnIG1heSBub3QgYmUKLSAgIFwwLXRlcm1pbmF0ZWQsIGJ1dCB3aWxsIG5vdCBleGNlZWQgJ21heGxlbicgY2hhcmFjdGVycy4gIFRoZSBjb3B5ICp3aWxsKgotICAgYmUgXDAtdGVybWluYXRlZC4gICovCi1zdGF0aWMgY2hhciAqCi1jb3B5X25hbWUgKGFiZmQsIG5hbWUsIG1heGxlbikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgbWF4bGVuOwotewotICBpbnQgbGVuOwotICBjaGFyICpuZXduYW1lOwotCi0gIGZvciAobGVuID0gMDsgbGVuIDwgbWF4bGVuOyArK2xlbikKLSAgICB7Ci0gICAgICBpZiAobmFtZVtsZW5dID09ICdcMCcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoKG5ld25hbWUgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpKSA9PSBOVUxMKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIHN0cm5jcHkgKG5ld25hbWUsIG5hbWUsIGxlbik7Ci0gIG5ld25hbWVbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiBuZXduYW1lOwotfQotCi0vKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzaXplX3Qgc2l6ZTsKLSAgUFRSIHN5bXM7Ci0KLSAgaWYgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBzaXplID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotCi0gIHN5bXMgPSAoUFRSKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChzeW1zLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICAgIGlmIChzeW1zICE9IE5VTEwpCi0JZnJlZSAoc3ltcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3RyaW5ncy4gIFRoZSBzdHJpbmdzIGFyZSBub3QgbG9hZGVkIHVudGlsCi0gICB0aGV5IGFyZSBuZWVkZWQuICBUaGlzIGlzIGJlY2F1c2Ugd2UgaGF2ZSBubyBzaW1wbGUgd2F5IG9mCi0gICBkZXRlY3RpbmcgYSBtaXNzaW5nIHN0cmluZyB0YWJsZSBpbiBhbiBhcmNoaXZlLiAgKi8KLQotY29uc3QgY2hhciAqCi1fYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBleHRzdHJzaXplW1NUUklOR19TSVpFX1NJWkVdOwotICBzaXplX3Qgc3Ryc2l6ZTsKLSAgY2hhciAqc3RyaW5nczsKLQotICBpZiAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCk7Ci0KLSAgaWYgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gIGlmIChiZmRfcmVhZCAoZXh0c3Ryc2l6ZSwgc2l6ZW9mIGV4dHN0cnNpemUsIDEsIGFiZmQpICE9IHNpemVvZiBleHRzdHJzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlcmUgaXMgbm8gc3RyaW5nIHRhYmxlLiAgKi8KLSAgICAgIHN0cnNpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIHN0cnNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHRzdHJzaXplKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotICAgIH0KLQotICBpZiAoc3Ryc2l6ZSA8IFNUUklOR19TSVpFX1NJWkUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBiYWQgc3RyaW5nIHRhYmxlIHNpemUgJWx1IiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAodW5zaWduZWQgbG9uZykgc3Ryc2l6ZSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdHJpbmdzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3Ryc2l6ZSk7Ci0gIGlmIChzdHJpbmdzID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9yZWFkIChzdHJpbmdzICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJc3Ryc2l6ZSAtIFNUUklOR19TSVpFX1NJWkUsIDEsIGFiZmQpCi0gICAgICAhPSBzdHJzaXplIC0gU1RSSU5HX1NJWkVfU0laRSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmdzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBvYmpfY29mZl9zdHJpbmdzIChhYmZkKSA9IHN0cmluZ3M7Ci0KLSAgcmV0dXJuIHN0cmluZ3M7Ci19Ci0KLS8qIEZyZWUgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHN0cmluZ3MgcmVhZCBmcm9tIGEgQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgIT0gTlVMTAotICAgICAgJiYgISBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpKQotICAgIHsKLSAgICAgIGZyZWUgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKLSAgICAgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgICB9Ci0gIGlmIChvYmpfY29mZl9zdHJpbmdzIChhYmZkKSAhPSBOVUxMCi0gICAgICAmJiAhIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyAoYWJmZCkpCi0gICAgewotICAgICAgZnJlZSAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkpOwotICAgICAgb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBzeW1ib2wgdGFibGUgaW50byBmcmVzaGx5IGJmZF9hbGxvY2F0ZWQgbWVtb3J5LCBzd2FwIGl0LCBhbmQKLSAgIGtuaXQgdGhlIHN5bWJvbCBuYW1lcyBpbnRvIGEgbm9ybWFsaXplZCBmb3JtLiAgQnkgbm9ybWFsaXplZCBoZXJlIEkKLSAgIG1lYW4gdGhhdCBhbGwgc3ltYm9scyBoYXZlIGFuIG5fb2Zmc2V0IHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBudWxsLQotICAgdGVybWluYXRlZCBzdHJpbmcuICAqLwotCi1jb21iaW5lZF9lbnRyeV90eXBlICoKLWNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsOwotICBjb21iaW5lZF9lbnRyeV90eXBlICppbnRlcm5hbF9wdHI7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbF9wdHI7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsX2VuZDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGNoYXIgKnJhd19zcmM7Ci0gIGNoYXIgKnJhd19lbmQ7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ190YWJsZSA9IE5VTEw7Ci0gIGNoYXIgKmRlYnVnX3NlY3Rpb24gPSBOVUxMOwotICB1bnNpZ25lZCBsb25nIHNpemU7Ci0KLSAgaWYgKG9ial9yYXdfc3ltZW50cyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLQotICBzaXplID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKTsKLSAgaW50ZXJuYWwgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGludGVybmFsID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICBpbnRlcm5hbF9lbmQgPSBpbnRlcm5hbCArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLQotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJhd19zcmMgPSAoY2hhciAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLQotICAvKiBtYXJrIHRoZSBlbmQgb2YgdGhlIHN5bWJvbHMgKi8KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgcmF3X2VuZCA9IChjaGFyICopIHJhd19zcmMgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0KLSAgLyogRklYTUUgU09NRURBWS4gIEEgc3RyaW5nIHRhYmxlIHNpemUgb2YgemVybyBpcyB2ZXJ5IHdlaXJkLCBidXQKLSAgICAgcHJvYmFibHkgcG9zc2libGUuICBJZiBvbmUgc2hvd3MgdXAsIGl0IHdpbGwgcHJvYmFibHkga2lsbCB1cy4gICovCi0KLSAgLyogU3dhcCBhbGwgdGhlIHJhdyBlbnRyaWVzICovCi0gIGZvciAoaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7Ci0gICAgICAgcmF3X3NyYyA8IHJhd19lbmQ7Ci0gICAgICAgcmF3X3NyYyArPSBzeW1lc3osIGludGVybmFsX3B0cisrKQotICAgIHsKLQotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgcmF3X3NyYywKLQkJCSAgICAoUFRSKSAmIGludGVybmFsX3B0ci0+dS5zeW1lbnQpOwotICAgICAgc3ltYm9sX3B0ciA9IGludGVybmFsX3B0cjsKLQotICAgICAgZm9yIChpID0gMDsKLQkgICBpIDwgc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9udW1hdXg7Ci0JICAgaSsrKQotCXsKLQkgIGludGVybmFsX3B0cisrOwotCSAgcmF3X3NyYyArPSBzeW1lc3o7Ci0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgcmF3X3NyYywKLQkJCQlzeW1ib2xfcHRyLT51LnN5bWVudC5uX3R5cGUsCi0JCQkJc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCQkJaSwgc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9udW1hdXgsCi0JCQkJJihpbnRlcm5hbF9wdHItPnUuYXV4ZW50KSk7Ci0JICBjb2ZmX3BvaW50ZXJpemVfYXV4IChhYmZkLCBpbnRlcm5hbCwgc3ltYm9sX3B0ciwgaSwKLQkJCSAgICAgICBpbnRlcm5hbF9wdHIpOwotCX0KLSAgICB9Ci0KLSAgLyogRnJlZSB0aGUgcmF3IHN5bWJvbHMsIGJ1dCBub3QgdGhlIHN0cmluZ3MgKGlmIHdlIGhhdmUgdGhlbSkuICAqLwotICBvYmpfY29mZl9rZWVwX3N0cmluZ3MgKGFiZmQpID0gdHJ1ZTsKLSAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsgaW50ZXJuYWxfcHRyIDwgaW50ZXJuYWxfZW5kOwotICAgICAgIGludGVybmFsX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQotCSAgJiYgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JewotCSAgLyogbWFrZSBhIGZpbGUgc3ltYm9sIHBvaW50IHRvIHRoZSBuYW1lIGluIHRoZSBhdXhlbnQsIHNpbmNlCi0JICAgICB0aGUgdGV4dCAiLmZpbGUiIGlzIHJlZHVuZGFudCAqLwotCSAgaWYgKChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfbi54X3plcm9lcyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogdGhlIGZpbGVuYW1lIGlzIGEgbG9uZyBvbmUsIHBvaW50IGludG8gdGhlIHN0cmluZyB0YWJsZSAqLwotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ190YWJsZSA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JCSAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkoKGxvbmcpCi0JCSAoc3RyaW5nX3RhYmxlCi0JCSAgKyAoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X24ueF9vZmZzZXQpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogb3JkaW5hcnkgc2hvcnQgZmlsZW5hbWUsIHB1dCBpbnRvIG1lbW9yeSBhbnl3YXkgKi8KLQkgICAgICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCA+IDEKLQkJICAmJiBjb2ZmX2RhdGEgKGFiZmQpLT5wZSkKLQkJewotCQkgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZykKLQkJICAgIGNvcHlfbmFtZSAoYWJmZCwgKGludGVybmFsX3B0ciArIDEpLT51LmF1eGVudC54X2ZpbGUueF9mbmFtZSwKLQkJCSAgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4ICogc3ltZXN6KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZykKLQkJICAgIGNvcHlfbmFtZSAoYWJmZCwgKGludGVybmFsX3B0ciArIDEpLT51LmF1eGVudC54X2ZpbGUueF9mbmFtZSwKLQkJCSAgICAgICBGSUxOTUxFTik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhICJzaG9ydCIgbmFtZS4gIE1ha2UgaXQgbG9uZy4gICovCi0JICAgICAgdW5zaWduZWQgbG9uZyBpID0gMDsKLQkgICAgICBjaGFyICpuZXdzdHJpbmcgPSBOVUxMOwotCi0JICAgICAgLyogZmluZCB0aGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nIHdpdGhvdXQgd2Fsa2luZyBpbnRvIG1lbW9yeQotCSAgICAgICAgIHRoYXQgaXNuJ3Qgb3Vycy4gICovCi0JICAgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKLQkJewotCQkgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX25hbWVbaV0gPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9CQkvKiBpZiBlbmQgb2Ygc3RyaW5nICovCi0JCX0JCS8qIHBvc3NpYmxlIGxlbmd0aHMgb2YgdGhpcyBzdHJpbmcuICovCi0KLQkgICAgICBpZiAoKG5ld3N0cmluZyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgKytpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQkgICAgICBtZW1zZXQgKG5ld3N0cmluZywgMCwgaSk7Ci0JICAgICAgc3RybmNweSAobmV3c3RyaW5nLCBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX25hbWUsIGkgLSAxKTsKLQkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcgaW50KSBuZXdzdHJpbmc7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkgIiI7Ci0JICBlbHNlIGlmICghYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwgJmludGVybmFsX3B0ci0+dS5zeW1lbnQpKQotCSAgICB7Ci0JICAgICAgLyogTG9uZyBuYW1lIGFscmVhZHkuICBQb2ludCBzeW1ib2wgYXQgdGhlIHN0cmluZyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgdGFibGUuICAqLwotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ190YWJsZSA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JCSAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0KLQkJKChsb25nIGludCkKLQkJIChzdHJpbmdfdGFibGUKLQkJICArIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTG9uZyBuYW1lIGluIGRlYnVnIHNlY3Rpb24uICBWZXJ5IHNpbWlsYXIuICAqLwotCSAgICAgIGlmIChkZWJ1Z19zZWN0aW9uID09IE5VTEwpCi0JCWRlYnVnX3NlY3Rpb24gPSBidWlsZF9kZWJ1Z19zZWN0aW9uIChhYmZkKTsKLQkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcgaW50KQotCQkoZGVidWdfc2VjdGlvbiArIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpOwotCSAgICB9Ci0JfQotICAgICAgaW50ZXJuYWxfcHRyICs9IGludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXg7Ci0gICAgfQotCi0gIG9ial9yYXdfc3ltZW50cyAoYWJmZCkgPSBpbnRlcm5hbDsKLSAgQkZEX0FTU0VSVCAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpCi0JICAgICAgPT0gKHVuc2lnbmVkIGludCkgKGludGVybmFsX3B0ciAtIGludGVybmFsKSk7Ci0KLSAgcmV0dXJuIChpbnRlcm5hbCk7Ci19CQkJCS8qIGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKCkgKi8KLQotbG9uZwotY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotYXN5bWJvbCAqCi1jb2ZmX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKm5ldyA9IChjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcgPT0gTlVMTCkKLSAgICByZXR1cm4gKE5VTEwpOwotICBtZW1zZXQgKG5ldywgMCwgc2l6ZW9mICpuZXcpOwotICBuZXctPnN5bWJvbC5zZWN0aW9uID0gMDsKLSAgbmV3LT5uYXRpdmUgPSAwOwotICBuZXctPmxpbmVubyA9IChhbGVudCAqKSBOVUxMOwotICBuZXctPmRvbmVfbGluZW5vID0gZmFsc2U7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBNYWtlIGEgZGVidWdnaW5nIHN5bWJvbC4gICovCi0KLWFzeW1ib2wgKgotY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgKGFiZmQsIHB0ciwgc3opCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHB0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBzejsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqbmV3ID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKG5ldyA9PSBOVUxMKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIC8qIEBAIFRoZSAxMCBpcyBhIGd1ZXNzIGF0IGEgcGxhdXNpYmxlIG1heGltdW0gbnVtYmVyIG9mIGF1eCBlbnRyaWVzCi0gICAgIChidXQgc2hvdWxkbid0IGJlIGEgY29uc3RhbnQpLiAgKi8KLSAgbmV3LT5uYXRpdmUgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGNvbWJpbmVkX2VudHJ5X3R5cGUpICogMTApOwotICBpZiAoIW5ldy0+bmF0aXZlKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIG5ldy0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBuZXctPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gIG5ldy0+bGluZW5vID0gKGFsZW50ICopIE5VTEw7Ci0gIG5ldy0+ZG9uZV9saW5lbm8gPSBmYWxzZTsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qQVJHU1VTRUQgKi8KLXZvaWQKLWNvZmZfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlICE9IE5VTEwKLSAgICAgICYmIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZS0+Zml4X3ZhbHVlKQotICAgIHsKLSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnBzeW07Ci0KLSAgICAgIHBzeW0gPSAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikKLQkgICAgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUpOwotICAgICAgcmV0LT52YWx1ZSA9IChiZmRfdm1hKSAocHN5bSAtIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBDT0ZGIHN5bWVudCBmb3IgYSBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1iZmRfY29mZl9nZXRfc3ltZW50IChhYmZkLCBzeW1ib2wsIHBzeW1lbnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpwc3ltZW50OwotewotICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltOwotCi0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotICBpZiAoY3N5bSA9PSBOVUxMIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICpwc3ltZW50ID0gY3N5bS0+bmF0aXZlLT51LnN5bWVudDsKLQotICBpZiAoY3N5bS0+bmF0aXZlLT5maXhfdmFsdWUpCi0gICAgcHN5bWVudC0+bl92YWx1ZSA9ICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwc3ltZW50LT5uX3ZhbHVlCi0JCQktIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOwotCi0gIC8qIEZJWE1FOiBXZSBzaG91bGQgaGFuZGxlIGZpeF9saW5lIGhlcmUuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIENPRkYgYXV4ZW50IGZvciBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF9jb2ZmX2dldF9hdXhlbnQgKGFiZmQsIHN5bWJvbCwgaW5keCwgcGF1eGVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGludCBpbmR4OwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW07Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmVudDsKLQotICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLQotICBpZiAoY3N5bSA9PSBOVUxMCi0gICAgICB8fCBjc3ltLT5uYXRpdmUgPT0gTlVMTAotICAgICAgfHwgaW5keCA+PSBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudCA9IGNzeW0tPm5hdGl2ZSArIGluZHggKyAxOwotCi0gICpwYXV4ZW50ID0gZW50LT51LmF1eGVudDsKLQotICBpZiAoZW50LT5maXhfdGFnKQotICAgIHBhdXhlbnQtPnhfc3ltLnhfdGFnbmR4LmwgPQotICAgICAgKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBhdXhlbnQtPnhfc3ltLnhfdGFnbmR4LnAKLSAgICAgICAtIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOwotCi0gIGlmIChlbnQtPmZpeF9lbmQpCi0gICAgcGF1eGVudC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucAotICAgICAgIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgaWYgKGVudC0+Zml4X3NjbmxlbikKLSAgICBwYXV4ZW50LT54X2NzZWN0Lnhfc2NubGVuLmwgPQotICAgICAgKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBhdXhlbnQtPnhfY3NlY3QueF9zY25sZW4ucAotICAgICAgIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFByaW50IG91dCBpbmZvcm1hdGlvbiBhYm91dCBDT0ZGIHN5bWJvbC4gICovCi0KLXZvaWQKLWNvZmZfcHJpbnRfc3ltYm9sIChhYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGZwcmludGYgKGZpbGUsICJjb2ZmICVzICVzIiwKLQkgICAgICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlID8gIm4iIDogImciLAotCSAgICAgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5saW5lbm8gPyAibCIgOiAiICIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgaWYgKGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGludCBhdXg7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpjb21iaW5lZCA9IGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZTsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnJvb3QgPSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpOwotCSAgc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSAqbCA9IGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubzsKLQotCSAgZnByaW50ZiAoZmlsZSwgIlslM2xkXSIsIChsb25nKSAoY29tYmluZWQgLSByb290KSk7Ci0KLQkgIGlmICghIGNvbWJpbmVkLT5maXhfdmFsdWUpCi0JICAgIHZhbCA9ICh1bnNpZ25lZCBsb25nKSBjb21iaW5lZC0+dS5zeW1lbnQubl92YWx1ZTsKLQkgIGVsc2UKLQkgICAgdmFsID0gKCh1bnNpZ25lZCBsb25nKQotCQkgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgY29tYmluZWQtPnUuc3ltZW50Lm5fdmFsdWUKLQkJICAgIC0gcm9vdCkpOwotCi0JICBmcHJpbnRmIChmaWxlLAotCQkgICAiKHNlYyAlMmQpKGZsIDB4JTAyeCkodHkgJTN4KShzY2wgJTNkKSAobnggJWQpIDB4JTA4bHggJXMiLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9zY251bSwKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fZmxhZ3MsCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX3R5cGUsCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX3NjbGFzcywKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fbnVtYXV4LAotCQkgICB2YWwsCi0JCSAgIHN5bWJvbC0+bmFtZSk7Ci0KLQkgIGZvciAoYXV4ID0gMDsgYXV4IDwgY29tYmluZWQtPnUuc3ltZW50Lm5fbnVtYXV4OyBhdXgrKykKLQkgICAgewotCSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eHAgPSBjb21iaW5lZCArIGF1eCArIDE7Ci0JICAgICAgbG9uZyB0YWduZHg7Ci0KLQkgICAgICBpZiAoYXV4cC0+Zml4X3RhZykKLQkJdGFnbmR4ID0gYXV4cC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucCAtIHJvb3Q7Ci0JICAgICAgZWxzZQotCQl0YWduZHggPSBhdXhwLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5sOwotCi0JICAgICAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLQkgICAgICBpZiAoYmZkX2NvZmZfcHJpbnRfYXV4IChhYmZkLCBmaWxlLCByb290LCBjb21iaW5lZCwgYXV4cCwgYXV4KSkKLQkJY29udGludWU7Ci0KLQkgICAgICBzd2l0Y2ggKGNvbWJpbmVkLT51LnN5bWVudC5uX3NjbGFzcykKLQkJewotCQljYXNlIENfRklMRToKLQkJICBmcHJpbnRmIChmaWxlLCAiRmlsZSAiKTsKLQkJICBicmVhazsKLQotCQljYXNlIENfU1RBVDoKLQkJICBpZiAoY29tYmluZWQtPnUuc3ltZW50Lm5fdHlwZSA9PSBUX05VTEwpCi0JCSAgICAvKiBwcm9iYWJseSBhIHNlY3Rpb24gc3ltYm9sPyAqLwotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmaWxlLCAiQVVYIHNjbmxlbiAweCVseCBucmVsb2MgJWQgbmxubm8gJWQiLAotCQkJICAgICAgIChsb25nKSBhdXhwLT51LmF1eGVudC54X3Njbi54X3NjbmxlbiwKLQkJCSAgICAgICBhdXhwLT51LmF1eGVudC54X3Njbi54X25yZWxvYywKLQkJCSAgICAgICBhdXhwLT51LmF1eGVudC54X3Njbi54X25saW5ubyk7Ci0JCSAgICAgIGlmIChhdXhwLT51LmF1eGVudC54X3Njbi54X2NoZWNrc3VtICE9IDAKLQkJCSAgfHwgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9hc3NvY2lhdGVkICE9IDAKLQkJCSAgfHwgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgIT0gMCkKLQkJCWZwcmludGYgKGZpbGUsICIgY2hlY2tzdW0gMHglbHggYXNzb2MgJWQgY29tZGF0ICVkIiwKLQkJCQkgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9jaGVja3N1bSwKLQkJCQkgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9hc3NvY2lhdGVkLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2NvbWRhdCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qIGVsc2UgZmFsbCB0aHJvdWdoICovCi0KLQkJZGVmYXVsdDoKLQkJICBmcHJpbnRmIChmaWxlLCAiQVVYIGxubm8gJWQgc2l6ZSAweCV4IHRhZ25keCAlbGQiLAotCQkJICAgYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8sCi0JCQkgICBhdXhwLT51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSwKLQkJCSAgIHRhZ25keCk7Ci0JCSAgaWYgKGF1eHAtPmZpeF9lbmQpCi0JCSAgICBmcHJpbnRmIChmaWxlLCAiIGVuZG5keCAlbGQiLAotCQkJICAgICAoKGxvbmcpCi0JCQkgICAgICAoYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucAotCQkJICAgICAgIC0gcm9vdCkpKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIlxuJXMgOiIsIGwtPnUuc3ltLT5uYW1lKTsKLQkgICAgICBsKys7Ci0JICAgICAgd2hpbGUgKGwtPmxpbmVfbnVtYmVyKQotCQl7Ci0JCSAgZnByaW50ZiAoZmlsZSwgIlxuJTRkIDogMHglbHgiLAotCQkJICAgbC0+bGluZV9udW1iZXIsCi0JCQkgICAoKHVuc2lnbmVkIGxvbmcpCi0JCQkgICAgKGwtPnUub2Zmc2V0ICsgc3ltYm9sLT5zZWN0aW9uLT52bWEpKSk7Ci0JCSAgbCsrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQkgIGZwcmludGYgKGZpbGUsICIgJS01cyAlcyAlcyAlcyIsCi0JCSAgIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwKLQkJICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlID8gIm4iIDogImciLAotCQkgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5saW5lbm8gPyAibCIgOiAiICIsCi0JCSAgIHN5bWJvbC0+bmFtZSk7Ci0JfQotICAgIH0KLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgbmFtZSBpbXBsaWVzIGEgbG9jYWwgc3ltYm9sLiAgSW4gQ09GRiwKLSAgIGxvY2FsIHN5bWJvbHMgZ2VuZXJhbGx5IHN0YXJ0IHdpdGggYGAuTCcnLiAgTW9zdCB0YXJnZXRzIHVzZSB0aGlzCi0gICBmdW5jdGlvbiBmb3IgdGhlIGlzX2xvY2FsX2xhYmVsX25hbWUgZW50cnkgcG9pbnQsIGJ1dCBzb21lIG1heQotICAgb3ZlcnJpZGUgaXQuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnTCc7Ci19Ci0KLS8qIFByb3ZpZGVkIGEgQkZELCBhIHNlY3Rpb24gYW5kIGFuIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLCBjYWxjdWxhdGUKLSAgIGFuZCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgbGluZSBuZWFyZXN0IHRvIHRoZQotICAgd2FudGVkIGxvY2F0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1jb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwKLQkJCWZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBib29sZWFuIGZvdW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGxpbmVfYmFzZTsKLSAgY29mZl9kYXRhX3R5cGUgKmNvZiA9IGNvZmZfZGF0YSAoYWJmZCk7Ci0gIC8qIFJ1biB0aHJvdWdoIHRoZSByYXcgc3ltZW50cyBpZiBhdmFpbGFibGUgKi8KLSAgY29tYmluZWRfZW50cnlfdHlwZSAqcDsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqcGVuZDsKLSAgYWxlbnQgKmw7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY19kYXRhOwotCi0gIC8qIEJlZm9yZSBsb29raW5nIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSwgdHJ5IHRvIHVzZSBhIC5zdGFiCi0gICAgIHNlY3Rpb24gdG8gZmluZCB0aGUgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc3ltYm9scywgc2VjdGlvbiwgb2Zmc2V0LAotCQkJCQkgICAgICZmb3VuZCwgZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyLAotCQkJCQkgICAgICZjb2ZmX2RhdGEgKGFiZmQpLT5saW5lX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0cnVlOwotCi0gICpmaWxlbmFtZV9wdHIgPSAwOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IDA7Ci0gICpsaW5lX3B0ciA9IDA7Ci0KLSAgLyogRG9uJ3QgdHJ5IGFuZCBmaW5kIGxpbmUgbnVtYmVycyBpbiBhIG5vbiBjb2ZmIGZpbGUgKi8KLSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb2YgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHAgPSBjb2YtPnJhd19zeW1lbnRzOwotICBpZiAoIXApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBlbmQgPSBwICsgY29mLT5yYXdfc3ltZW50X2NvdW50OwotICB3aGlsZSAocCA8IHBlbmQpCi0gICAgewotICAgICAgaWYgKHAtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKLQlicmVhazsKLSAgICAgIHAgKz0gMSArIHAtPnUuc3ltZW50Lm5fbnVtYXV4OwotICAgIH0KLQotICBpZiAocCA8IHBlbmQpCi0gICAgewotICAgICAgYmZkX3ZtYSBzZWNfdm1hOwotICAgICAgYmZkX3ZtYSBtYXhkaWZmOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIENfRklMRSBzeW1ib2xzIHRvIGZpbmQgdGhlIGJlc3Qgb25lLiAgKi8KLSAgICAgIHNlY192bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgICpmaWxlbmFtZV9wdHIgPSAoY2hhciAqKSBwLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldDsKLSAgICAgIG1heGRpZmYgPSAoYmZkX3ZtYSkgMCAtIChiZmRfdm1hKSAxOwotICAgICAgd2hpbGUgKDEpCi0JewotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcDI7Ci0KLQkgIGZvciAocDIgPSBwICsgMSArIHAtPnUuc3ltZW50Lm5fbnVtYXV4OwotCSAgICAgICBwMiA8IHBlbmQ7Ci0JICAgICAgIHAyICs9IDEgKyBwMi0+dS5zeW1lbnQubl9udW1hdXgpCi0JICAgIHsKLQkgICAgICBpZiAocDItPnUuc3ltZW50Lm5fc2NudW0gPiAwCi0JCSAgJiYgKHNlY3Rpb24KLQkJICAgICAgPT0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLAotCQkJCQkJICAgICAgcDItPnUuc3ltZW50Lm5fc2NudW0pKSkKLQkJYnJlYWs7Ci0JICAgICAgaWYgKHAyLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCXsKLQkJICBwMiA9IHBlbmQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAocDIgPCBwZW5kCi0JICAgICAgJiYgb2Zmc2V0ICsgc2VjX3ZtYSA+PSAoYmZkX3ZtYSkgcDItPnUuc3ltZW50Lm5fdmFsdWUKLQkgICAgICAmJiBvZmZzZXQgKyBzZWNfdm1hIC0gKGJmZF92bWEpIHAyLT51LnN5bWVudC5uX3ZhbHVlIDwgbWF4ZGlmZikKLQkgICAgewotCSAgICAgICpmaWxlbmFtZV9wdHIgPSAoY2hhciAqKSBwLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgICBtYXhkaWZmID0gb2Zmc2V0ICsgc2VjX3ZtYSAtIHAyLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgICB9Ci0KLQkgIC8qIEF2b2lkIGVuZGxlc3MgbG9vcHMgb24gZXJyb25lb3VzIGZpbGVzIGJ5IGVuc3VyaW5nIHRoYXQKLQkgICAgIHdlIGFsd2F5cyBtb3ZlIGZvcndhcmQgaW4gdGhlIGZpbGUuICAqLwotCSAgaWYgKHAgLSBjb2YtPnJhd19zeW1lbnRzID49IHAtPnUuc3ltZW50Lm5fdmFsdWUpCi0JICAgIGJyZWFrOwotCi0JICBwID0gY29mLT5yYXdfc3ltZW50cyArIHAtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICBpZiAocCA+IHBlbmQgfHwgcC0+dS5zeW1lbnQubl9zY2xhc3MgIT0gQ19GSUxFKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB3YW5kZXIgdGhvdWdoIHRoZSByYXcgbGluZW51bWJlcnMgb2YgdGhlIHNlY3Rpb24gKi8KLSAgLyogSWYgd2UgaGF2ZSBiZWVuIGNhbGxlZCBvbiB0aGlzIHNlY3Rpb24gYmVmb3JlLCBhbmQgdGhlIG9mZnNldCB3ZQotICAgICB3YW50IGlzIGZ1cnRoZXIgZG93biB0aGVuIHdlIGNhbiBwcmltZSB0aGUgbG9va3VwIGxvb3AuICAqLwotICBzZWNfZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKHNlY19kYXRhICE9IE5VTEwKLSAgICAgICYmIHNlY19kYXRhLT5pID4gMAotICAgICAgJiYgb2Zmc2V0ID49IHNlY19kYXRhLT5vZmZzZXQpCi0gICAgewotICAgICAgaSA9IHNlY19kYXRhLT5pOwotICAgICAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBzZWNfZGF0YS0+ZnVuY3Rpb247Ci0gICAgICBsaW5lX2Jhc2UgPSBzZWNfZGF0YS0+bGluZV9iYXNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGkgPSAwOwotICAgICAgbGluZV9iYXNlID0gMDsKLSAgICB9Ci0KLSAgaWYgKHNlY3Rpb24tPmxpbmVubyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGwgPSAmc2VjdGlvbi0+bGluZW5vW2ldOwotCi0gICAgICBmb3IgKDsgaSA8IHNlY3Rpb24tPmxpbmVub19jb3VudDsgaSsrKQotCXsKLQkgIGlmIChsLT5saW5lX251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogR2V0IHRoZSBzeW1ib2wgdGhpcyBsaW5lIG51bWJlciBwb2ludHMgYXQgKi8KLQkgICAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2ZmID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgKGwtPnUuc3ltKTsKLQkgICAgICBpZiAoY29mZi0+c3ltYm9sLnZhbHVlID4gb2Zmc2V0KQotCQlicmVhazsKLQkgICAgICAqZnVuY3Rpb25uYW1lX3B0ciA9IGNvZmYtPnN5bWJvbC5uYW1lOwotCSAgICAgIGlmIChjb2ZmLT5uYXRpdmUpCi0JCXsKLQkJICBjb21iaW5lZF9lbnRyeV90eXBlICpzID0gY29mZi0+bmF0aXZlOwotCQkgIHMgPSBzICsgMSArIHMtPnUuc3ltZW50Lm5fbnVtYXV4OwotCi0JCSAgLyogSW4gWENPRkYgYSBkZWJ1Z2dpbmcgc3ltYm9sIGNhbiBmb2xsb3cgdGhlCi0JCSAgICAgZnVuY3Rpb24gc3ltYm9sLiAgKi8KLQkJICBpZiAocy0+dS5zeW1lbnQubl9zY251bSA9PSBOX0RFQlVHKQotCQkgICAgcyA9IHMgKyAxICsgcy0+dS5zeW1lbnQubl9udW1hdXg7Ci0KLQkJICAvKiBTIHNob3VsZCBub3cgcG9pbnQgdG8gdGhlIC5iZiBvZiB0aGUgZnVuY3Rpb24uICAqLwotCQkgIGlmIChzLT51LnN5bWVudC5uX251bWF1eCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGxpbmVudW1iZXIgaXMgc3RvcmVkIGluIHRoZSBhdXhlbnQuICAqLwotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmEgPSAmKChzICsgMSktPnUuYXV4ZW50KTsKLQkJICAgICAgbGluZV9iYXNlID0gYS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm87Ci0JCSAgICAgICpsaW5lX3B0ciA9IGxpbmVfYmFzZTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobC0+dS5vZmZzZXQgPiBvZmZzZXQpCi0JCWJyZWFrOwotCSAgICAgICpsaW5lX3B0ciA9IGwtPmxpbmVfbnVtYmVyICsgbGluZV9iYXNlIC0gMTsKLQkgICAgfQotCSAgbCsrOwotCX0KLSAgICB9Ci0KLSAgLyogQ2FjaGUgdGhlIHJlc3VsdHMgZm9yIHRoZSBuZXh0IGNhbGwuICAqLwotICBpZiAoc2VjX2RhdGEgPT0gTlVMTCAmJiBzZWN0aW9uLT5vd25lciA9PSBhYmZkKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCSAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLSAgICAgIHNlY19kYXRhID0gKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7Ci0gICAgfQotICBpZiAoc2VjX2RhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWNfZGF0YS0+b2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgc2VjX2RhdGEtPmkgPSBpOwotICAgICAgc2VjX2RhdGEtPmZ1bmN0aW9uID0gKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgICBzZWNfZGF0YS0+bGluZV9iYXNlID0gbGluZV9iYXNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50Ci1jb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jOwotewotICBzaXplX3Qgc2l6ZTsKLQotICBpZiAocmVsb2MgPT0gZmFsc2UpCi0gICAgewotICAgICAgc2l6ZSA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkgKyBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemUgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpOwotICAgIH0KLQotICBzaXplICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogQ2hhbmdlIHRoZSBjbGFzcyBvZiBhIGNvZmYgc3ltYm9sIGhlbGQgYnkgQkZELiAgKi8KLWJvb2xlYW4KLWJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MgKGFiZmQsIHN5bWJvbCwgY2xhc3MpCi0gICAgIGJmZCAqICAgICAgICAgYWJmZDsKLSAgICAgYXN5bWJvbCAqICAgICBzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCAgY2xhc3M7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKiBjc3ltOwotCi0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotICBpZiAoY3N5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChjc3ltLT5uYXRpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIGFsaWVuIHN5bWJvbCB3aGljaCBubyBuYXRpdmUgY29mZiBiYWNrZW5kIGRhdGEuCi0JIFdlIGNoZWF0IGhlcmUgYnkgY3JlYXRpbmcgYSBmYWtlIG5hdGl2ZSBlbnRyeSBmb3IgaXQgYW5kCi0JIHRoZW4gZmlsbGluZyBpbiB0aGUgY2xhc3MuICBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhhdCBpbgotCSBjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCgpLiAgKi8KLSAgICAgIAotICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqIG5hdGl2ZTsKLQotICAgICAgbmF0aXZlID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCogbmF0aXZlKSk7Ci0gICAgICBpZiAobmF0aXZlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBtZW1zZXQgKG5hdGl2ZSwgMCwgc2l6ZW9mICgqIG5hdGl2ZSkpOwotICAgICAgCi0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSAgID0gVF9OVUxMOwotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IGNsYXNzOwotICAgICAgCi0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQl7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0KLQkgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gKHN5bWJvbC0+dmFsdWUKLQkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgCi0JICAvKiBDb3B5IHRoZSBhbnkgZmxhZ3MgZnJvbSB0aGUgdGhlIGZpbGUgaGVhZGVyIGludG8gdGhlIHN5bWJvbC4KLQkgICAgIEZJWE1FOiBXaHk/ICAqLwotCSAgbmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gYmZkX2FzeW1ib2xfYmZkICgmIGNzeW0tPnN5bWJvbCktPmZsYWdzOwotCX0KLSAgICAgIAotICAgICAgY3N5bS0+bmF0aXZlID0gbmF0aXZlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBjbGFzczsKLSAgICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmZsaW5rLmMgYi9iZmQvY29mZmxpbmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1Njg2OS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NTIgKzAsMCBAQAotLyogQ09GRiBzcGVjaWZpYyBsaW5rZXIgY29kZS4KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIgY29kZS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBjaGFyICpkb3Jlc19jb20gUEFSQU1TICgoY2hhciAqLCBiZmQgKiwgaW50KSk7Ci1zdGF0aWMgY2hhciAqZ2V0X25hbWUgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBtYXJrX3JlbG9jcyBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT50eXBlID0gVF9OVUxMOwotICAgICAgcmV0LT5jbGFzcyA9IENfTlVMTDsKLSAgICAgIHJldC0+bnVtYXV4ID0gMDsKLSAgICAgIHJldC0+YXV4YmZkID0gTlVMTDsKLSAgICAgIHJldC0+YXV4ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPnN0YWJfaW5mbyA9IE5VTEw7Ci0gIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoISBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKHJldCwgYWJmZCwKLQkJCQkJX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnR5cGVzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBHaXZlbiBhIENPRkYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCSAgICAgIChhYmZkLCBpbmZvLCBjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhIENPRkYgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayBhIHNpbmdsZSBhcmNoaXZlIGVsZW1lbnQgdG8gc2VlIGlmIHdlIG5lZWQgdG8gaW5jbHVkZSBpdCBpbgotICAgdGhlIGxpbmsuICAqUE5FRURFRCBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzCi0gICBuZWVkZWQgaW4gdGhlIGxpbmsgb3Igbm90LiAgVGhpcyBpcyBjYWxsZWQgdmlhCi0gICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCpwbmVlZGVkKQotICAgIHsKLSAgICAgIGlmICghIGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSB8fCAhICpwbmVlZGVkKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBvYmplY3QgZmlsZSBzaG91bGQgYmUKLSAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBib29sZWFuICgqc3ltX2lzX2dsb2JhbCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIHN5bV9pc19nbG9iYWwgPSBjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBpZiAoKHN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgIHx8IHN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKLQkgICB8fCAob2JqX3BlIChhYmZkKSAmJiBzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKQotI2lmZGVmIENfU1lTVEVNCi0JICAgfHwgc3ltLm5fc2NsYXNzID09IENfU1lTVEVNCi0jZW5kaWYKLQkgICB8fCAoc3ltX2lzX2dsb2JhbCAmJiAoKnN5bV9pc19nbG9iYWwpIChhYmZkLCAmc3ltKSkpCi0JICAmJiAoc3ltLm5fc2NudW0gIT0gMCB8fCBzeW0ubl92YWx1ZSAhPSAwKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUsIGFuZCBpcyBkZWZpbmVkIGJ5IHRoaXMKLSAgICAgICAgICAgICBvYmplY3QgZmlsZS4gICovCi0KLQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLQkgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkKLQkgICAgIHVuZGVmaW5lZC4gIElmIGEgc3ltYm9sIGlzIGN1cnJlbnRseSBrbm93biB0byBiZSBjb21tb24sCi0JICAgICBDT0ZGIGxpbmtlcnMgZG8gbm90IGJyaW5nIGluIGFuIG9iamVjdCBmaWxlIHdoaWNoIGRlZmluZXMKLQkgICAgIGl0LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gKCpzeW1faXNfZ2xvYmFsKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0gIGJvb2xlYW4ga2VlcF9zeW1zOwotICBib29sZWFuIGRlZmF1bHRfY29weTsKLSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotCi0gIC8qIEtlZXAgdGhlIHN5bWJvbHMgZHVyaW5nIHRoaXMgZnVuY3Rpb24sIGluIGNhc2UgdGhlIGxpbmtlciBuZWVkcwotICAgICB0byByZWFkIHRoZSBnZW5lcmljIHN5bWJvbHMgaW4gb3JkZXIgdG8gcmVwb3J0IGFuIGVycm9yIG1lc3NhZ2UuICAqLwotICBrZWVwX3N5bXMgPSBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpOwotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKLQotICBzeW1faXNfZ2xvYmFsID0gY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3ltX2lzX2dsb2JhbDsKLQotICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZGVmYXVsdF9jb3B5ID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBkZWZhdWx0X2NvcHkgPSB0cnVlOwotCi0gIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotCi0gIC8qIFdlIGtlZXAgYSBsaXN0IG9mIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZAotICAgICB0byBwYXJ0aWN1bGFyIHN5bWJvbHMuICAqLwotICBzeW1faGFzaCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoKHNpemVfdCkgc3ltY291bnQKLQkJCSAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpKTsKLSAgaWYgKHN5bV9oYXNoID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgb2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKLSAgbWVtc2V0IChzeW1faGFzaCwgMCwKLQkgIChzaXplX3QpIHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHN5bWVzeiA9PSBiZmRfY29mZl9hdXhlc3ogKGFiZmQpKTsKLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgc3ltY291bnQgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0gICAgICBib29sZWFuIGNvcHk7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgIHx8IHN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKLQkgICB8fCAob2JqX3BlIChhYmZkKSAmJiBzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKQotI2lmZGVmIENfU1lTVEVNCi0JICB8fCBzeW0ubl9zY2xhc3MgPT0gQ19TWVNURU0KLSNlbmRpZgotCSAgfHwgKHN5bV9pc19nbG9iYWwgJiYgKCpzeW1faXNfZ2xvYmFsKSAoYWJmZCwgJnN5bSkpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkgIGJmZF92bWEgdmFsdWU7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGV4dGVybmFsbHkgdmlzaWJsZS4gICovCi0KLQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogV2UgbXVzdCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5IGlmIHdlIGdvdCBpdCBmcm9tIHRoZQotICAgICAgICAgICAgIHN5bWVudCBpdHNlbGYsIHJhdGhlciB0aGFuIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgY29weSA9IGRlZmF1bHRfY29weTsKLQkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgIT0gMAotCSAgICAgIHx8IHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotCSAgICBjb3B5ID0gdHJ1ZTsKLQotCSAgdmFsdWUgPSBzeW0ubl92YWx1ZTsKLQotCSAgaWYgKHN5bS5uX3NjbnVtID09IDApCi0JICAgIHsKLQkgICAgICBpZiAodmFsdWUgPT0gMCkKLQkJewotCQkgIGZsYWdzID0gMDsKLQkJICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZsYWdzID0gQlNGX0dMT0JBTDsKLQkJICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCSAgICAgIHNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCQl2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICAgIH0KLQotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKLQkgICAgICB8fCAob2JqX3BlIChhYmZkKSAmJiBzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKSkKLQkgICAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQotCSAgaWYgKCEgKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgY29weSwgZmFsc2UsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKHNlY3Rpb24gPT0gYmZkX2NvbV9zZWN0aW9uX3B0cgotCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiAoKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCQkgID4gYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlciAoYWJmZCkpKQotCSAgICAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyCi0JICAgICAgPSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyIChhYmZkKTsKLQotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKLQkgICAgewotCSAgICAgIGlmICgoKCpzeW1faGFzaCktPmNsYXNzID09IENfTlVMTAotCQkgICAmJiAoKnN5bV9oYXNoKS0+dHlwZSA9PSBUX05VTEwpCi0JCSAgfHwgc3ltLm5fc2NudW0gIT0gMAotCQkgIHx8IChzeW0ubl92YWx1ZSAhPSAwCi0JCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgICgqc3ltX2hhc2gpLT5jbGFzcyA9IHN5bS5uX3NjbGFzczsKLQkJICBpZiAoc3ltLm5fdHlwZSAhPSBUX05VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+dHlwZSAhPSBUX05VTEwKLQkJCSAgJiYgKCpzeW1faGFzaCktPnR5cGUgIT0gc3ltLm5fdHlwZSkKLQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAoXygiV2FybmluZzogdHlwZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgaW4gJXMiKSwKLQkJCSAgIG5hbWUsICgqc3ltX2hhc2gpLT50eXBlLCBzeW0ubl90eXBlLAotCQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQkgICAgICAoKnN5bV9oYXNoKS0+dHlwZSA9IHN5bS5uX3R5cGU7Ci0JCSAgICB9Ci0JCSAgKCpzeW1faGFzaCktPmF1eGJmZCA9IGFiZmQ7Ci0JCSAgaWYgKHN5bS5uX251bWF1eCAhPSAwKQotCQkgICAgewotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmFsbG9jOwotCQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkJICAgICAgYmZkX2J5dGUgKmVhdXg7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqaWF1eDsKLQotCQkgICAgICAoKnN5bV9oYXNoKS0+bnVtYXV4ID0gc3ltLm5fbnVtYXV4OwotCQkgICAgICBhbGxvYyA9ICgodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopCi0JCQkgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJCSAgKHN5bS5uX251bWF1eAotCQkJCQkJICAgKiBzaXplb2YgKCphbGxvYykpKSk7Ci0JCSAgICAgIGlmIChhbGxvYyA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgIGZvciAoaSA9IDAsIGVhdXggPSBlc3ltICsgc3ltZXN6LCBpYXV4ID0gYWxsb2M7Ci0JCQkgICBpIDwgc3ltLm5fbnVtYXV4OwotCQkJICAgaSsrLCBlYXV4ICs9IHN5bWVzeiwgaWF1eCsrKQotCQkJYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIChQVFIpIGVhdXgsIHN5bS5uX3R5cGUsCi0JCQkJCSAgICAgIHN5bS5uX3NjbGFzcywgaSwgc3ltLm5fbnVtYXV4LAotCQkJCQkgICAgICAoUFRSKSBpYXV4KTsKLQkJICAgICAgKCpzeW1faGFzaCktPmF1eCA9IGFsbG9jOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgICAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIG5vbi10cmFkaXRpb25hbCwgbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCB0cnkgdG8KLSAgICAgb3B0aW1pemUgdGhlIGhhbmRsaW5nIG9mIGFueSAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISBpbmZvLT50cmFkaXRpb25hbF9mb3JtYXQKLSAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKQotICAgICAgJiYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCAmJiBpbmZvLT5zdHJpcCAhPSBzdHJpcF9kZWJ1Z2dlcikpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN0YWIsICpzdGFic3RyOwotCi0gICAgICBzdGFiID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc3RhYiIpOwotICAgICAgaWYgKHN0YWIgIT0gTlVMTCkKLQl7Ci0JICBzdGFic3RyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc3RhYnN0ciIpOwotCi0JICBpZiAoc3RhYnN0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLQkgICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICpzZWNkYXRhOwotCi0JICAgICAgc2VjZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzdGFiKTsKLQkgICAgICBpZiAoc2VjZGF0YSA9PSBOVUxMKQotCQl7Ci0JCSAgc3RhYi0+dXNlZF9ieV9iZmQgPQotCQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkJICBpZiAoc3RhYi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHNlY2RhdGEgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc3RhYik7Ci0JCX0KLQotCSAgICAgIHRhYmxlID0gY29mZl9oYXNoX3RhYmxlIChpbmZvKTsKLQotCSAgICAgIGlmICghIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzIChhYmZkLCAmdGFibGUtPnN0YWJfaW5mbywKLQkJCQkJICAgICBzdGFiLCBzdGFic3RyLAotCQkJCQkgICAgICZzZWNkYXRhLT5zdGFiX2luZm8pKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBib29sZWFuIGRlYnVnX21lcmdlX2FsbG9jYXRlZDsKLSAgYm9vbGVhbiBsb25nX3NlY3Rpb25fbmFtZXM7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBzaXplX3QgbWF4X2xpbmVub19jb3VudDsKLSAgc2l6ZV90IG1heF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9vdXRwdXRfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKLSAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCByZWxzejsKLSAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgbGluZXN6OwotICBiZmQgKnN1YjsKLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGNoYXIgc3RyYnVmW1NUUklOR19TSVpFX1NJWkVdOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLSAgZmluZm8uaW5mbyA9IGluZm87Ci0gIGZpbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBmaW5mby5zdHJ0YWIgPSBOVUxMOwotICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICBmaW5mby5sYXN0X2ZpbGVfaW5kZXggPSAtMTsKLSAgZmluZm8ubGFzdF9iZl9pbmRleCA9IC0xOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uc2VjX3B0cnMgPSBOVUxMOwotICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmaW5mby5nbG9iYWxfdG9fc3RhdGljID0gZmFsc2U7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbyA9IGluZm87Ci0KLSAgZmluZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0ICgmZmluZm8uZGVidWdfbWVyZ2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSB0cnVlOwotCi0gIC8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBDb3VudCB0aGUgbGluZSBudW1iZXJzIGFuZCByZWxvY2F0aW9uIGVudHJpZXMgcmVxdWlyZWQgZm9yIHRoZQotICAgICBvdXRwdXQgZmlsZS4gIFNldCB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSByZWxvY3MuICAqLwotICByZWxfZmlsZXBvcyA9IG9ial9yZWxvY2Jhc2UgKGFiZmQpOwotICByZWxzeiA9IGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfbGluZW5vX2NvdW50ID0gMDsKLSAgbWF4X3JlbG9jX2NvdW50ID0gMDsKLQotICBsb25nX3NlY3Rpb25fbmFtZXMgPSBmYWxzZTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCi0JCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAotCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCi0JICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLQkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0JCW8tPmxpbmVub19jb3VudCArPSBzZWMtPmxpbmVub19jb3VudDsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCW8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5saW5lbm9fY291bnQgPiBtYXhfbGluZW5vX2NvdW50KQotCQltYXhfbGluZW5vX2NvdW50ID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiBtYXhfcmVsb2NfY291bnQpCi0JCW1heF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotCQkgICAmJiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JfQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0Jby0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgIG8tPnJlbF9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0JICByZWxfZmlsZXBvcyArPSBvLT5yZWxvY19jb3VudCAqIHJlbHN6OwotCX0KLQotICAgICAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkKLQkgICYmIHN0cmxlbiAoby0+bmFtZSkgPiBTQ05OTUxFTikKLQl7Ci0JICAvKiBUaGlzIHNlY3Rpb24gaGFzIGEgbG9uZyBuYW1lIHdoaWNoIG11c3QgZ28gaW4gdGhlIHN0cmluZwotICAgICAgICAgICAgIHRhYmxlLiAgVGhpcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGNvZGUgaW4KLSAgICAgICAgICAgICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyB3aGljaCBwdXRzIHRoZSBzdHJpbmcgaW5kZXgKLSAgICAgICAgICAgICBpbnRvIHRoZSBzX25hbWUgZmllbGQgb2YgdGhlIHNlY3Rpb24gaGVhZGVyLiAgVGhhdCBpcyB3aHkKLSAgICAgICAgICAgICB3ZSBwYXNzIGhhc2ggYXMgZmFsc2UuICAqLwotCSAgaWYgKF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8uc3RydGFiLCBvLT5uYW1lLCBmYWxzZSwgZmFsc2UpCi0JICAgICAgPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGxvbmdfc2VjdGlvbl9uYW1lcyA9IHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBJZiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlCi0gICAgIG5lZWQgdG8ga2VlcC4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQotICAgICAgICAgdGhlIHRhcmdldF9pbmRleCBmaWVsZHMgYXJlIDEgYmFzZWQuICAqLwotICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLQkoKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0JIGJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7Ci0gICAgICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzID0gTlVMTDsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKLQlvLT5saW5lX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLQkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgIT0gMCkKLQl7Ci0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LAotCSAgICAgYnV0IG9ubHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCBpcyBub3QgdGhlCi0JICAgICBjb21tb24gY2FzZS4gICovCi0JICBCRkRfQVNTRVJUIChpbmZvLT5yZWxvY2F0ZWFibGUpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KLQkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KLQkgICAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSByZWxvYyBhbmQgbGluZW5vIGNvdW50cywgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8KLQkgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgIH0KLQotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gbGluZV9maWxlcG9zOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYW4gaW5wdXQgQkZELiAgVGFrZQotICAgICB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYXIgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGRzIG9mIGFsbCB0aGUKLSAgICAgaW5wdXQgQkZEJ3MuICAqLwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgICAgIHN6ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCW1heF9zeW1fY291bnQgPSBzejsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBidWZmZXJzIHVzZWQgd2hpbGUgbGlua2luZy4gICovCi0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgZmluZm8uc2VjX3B0cnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkJICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCSAgICAgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCQkJICAgICBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnNlY19wdHJzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAotICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKQotICAgICAgfHwgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAmJiBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIGV4Y2VwdCB0aGF0Ci0gICAgIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlcmVmb3JlIHdlIGRvbid0Ci0gICAgIGtub3cgd2hlcmUgdGhlIHN0cmluZyB0YWJsZSBzdGFydHMuICBXZSBqdXN0IGJ1aWxkIHRoZSBzdHJpbmcKLSAgICAgdGFibGUgaW4gbWVtb3J5IGFzIHdlIGdvIGFsb25nLiAgV2UgcHJvY2VzcyBhbGwgdGhlIHJlbG9jYXRpb25zCi0gICAgIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOwotCi0gIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaWYgKCEgYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIChzdWIsICYgZmluZm8pKQotCQl7Ci0JCSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIHN1YikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCAmZmluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0IChhYmZkLCAmIGZpbmZvKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgCi0gIC8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgdXNlZCBieSBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCi0gIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSBmYWxzZTsKLQotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICAgICAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uc2VjX3B0cnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5zZWNfcHRycyk7Ci0gICAgICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gICAgICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICAgICAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gICAgICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzeW1ib2wKLSAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbC4gIFdyaXRlIGl0IG91dCBhZ2FpbiBpZgotICAgICBuZWNlc3NhcnkuICAqLwotICBpZiAoZmluZm8ubGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAodW5zaWduZWQgaW50KSBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSAhPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkpCi0gICAgewotICAgICAgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZmaW5mby5sYXN0X2ZpbGUsCi0JCQkgICAgIChQVFIpIGZpbmZvLm91dHN5bXMpOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKLQkJICAgICArIGZpbmZvLmxhc3RfZmlsZV9pbmRleCAqIHN5bWVzeiksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlIChmaW5mby5vdXRzeW1zLCBzeW1lc3osIDEsIGFiZmQpICE9IHN5bWVzeikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIGRvaW5nIHRhc2sgbGlua2luZyAobGQgLS10YXNrLWxpbmspIHRoZW4gbWFrZSBhIHBhc3MgdGhyb3VnaCB0aGUKLSAgICAgZ2xvYmFsIHN5bWJvbHMsIHdyaXRpbmcgb3V0IGFueSB0aGF0IGFyZSBkZWZpbmVkLCBhbmQgbWFraW5nIHRoZW0KLSAgICAgc3RhdGljLiAqLwotICBpZiAoaW5mby0+dGFza19saW5rKQotICAgIHsKLSAgICAgIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICAgICAgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMsCi0JCQkgICAgICAgKFBUUikgJmZpbmZvKTsKLSAgICAgIGlmIChmaW5mby5mYWlsZWQpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLwotICBmaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLAotCQkJICAgKFBUUikgJmZpbmZvKTsKLSAgaWYgKGZpbmZvLmZhaWxlZCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgb3V0c3ltcyBidWZmZXIgaXMgdXNlZCBieSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bS4gICovCi0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gICAgICBmaW5mby5vdXRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSAmJiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMsIHdlIGtub3cKLQkgdGhlIHN5bWJvbCBpbmRpY2VzIHRvIHVzZSBmb3IgcmVsb2NzIGFnYWluc3QgdGhlbSwgYW5kIHdlIGNhbgotCSBmaW5hbGx5IHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9ICgoYmZkX2J5dGUgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICogcmVsc3opKTsKLSAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0JICBiZmRfYnl0ZSAqZXJlbDsKLQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpcmVsID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzOwotCSAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLQkgIHJlbF9oYXNoID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlczsKLQkgIGVyZWwgPSBleHRlcm5hbF9yZWxvY3M7Ci0JICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKLQkgICAgewotCSAgICAgIGlmICgqcmVsX2hhc2ggIT0gTlVMTCkKLQkJewotCQkgIEJGRF9BU1NFUlQgKCgqcmVsX2hhc2gpLT5pbmR4ID49IDApOwotCQkgIGlyZWwtPnJfc3ltbmR4ID0gKCpyZWxfaGFzaCktPmluZHg7Ci0JCX0KLQkgICAgICBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgKFBUUikgaXJlbCwgKFBUUikgZXJlbCk7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpIGV4dGVybmFsX3JlbG9jcywgcmVsc3osIG8tPnJlbG9jX2NvdW50LAotCQkJICAgIGFiZmQpICE9IHJlbHN6ICogby0+cmVsb2NfY291bnQpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIG9wdGltaXplZCBzdGFicyBzdHJpbmdzLCBvdXRwdXQgdGhlbS4gICovCi0gIGlmIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAoYWJmZCwgJmNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgIT0gMCB8fCBsb25nX3NlY3Rpb25fbmFtZXMpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKLQkJICAgICArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzeiksCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwKLQkJICAgIF9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN0cnRhYikgKyBTVFJJTkdfU0laRV9TSVpFLAotCQkgICAgKGJmZF9ieXRlICopIHN0cmJ1Zik7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotICAgICAgaWYgKGJmZF93cml0ZSAoc3RyYnVmLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKSAhPSBTVFJJTkdfU0laRV9TSVpFKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZmluZm8uc3RydGFiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0KLSAgLyogU2V0dGluZyBiZmRfZ2V0X3N5bWNvdW50IHRvIDAgd2lsbCBjYXVzZSB3cml0ZV9vYmplY3RfY29udGVudHMgdG8KLSAgICAgbm90IHRyeSB0byB3cml0ZSBvdXQgdGhlIHN5bWJvbHMuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQpCi0gICAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGlmIChmaW5mby5zdHJ0YWIgIT0gTlVMTCkKLSAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgfQotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uc2VjX3B0cnMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zZWNfcHRycyk7Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIHBhcnNlIG91dCBhIC1oZWFwIDxyZXNlcnZlZD4sPGNvbW1pdD4gbGluZSAqLwotCi1zdGF0aWMgY2hhciAqCi1kb3Jlc19jb20gKHB0ciwgb3V0cHV0X2JmZCwgaGVhcCkKLSAgICAgY2hhciAqcHRyOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGludCBoZWFwOwotewotICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkgCi0gICAgewotICAgICAgaW50IHZhbCA9IHN0cnRvdWwgKHB0ciwgJnB0ciwgMCk7Ci0gICAgICBpZiAoaGVhcCkKLQlwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuU2l6ZU9mSGVhcFJlc2VydmUgPXZhbDsKLSAgICAgIGVsc2UKLQlwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuU2l6ZU9mU3RhY2tSZXNlcnZlID12YWw7Ci0KLSAgICAgIGlmIChwdHJbMF0gPT0gJywnKSAKLQl7Ci0JICBpbnQgdmFsID0gc3RydG91bCAocHRyKzEsICZwdHIsIDApOwotCSAgaWYgKGhlYXApCi0JICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZIZWFwQ29tbWl0ID12YWw7Ci0JICBlbHNlCi0JICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZTdGFja0NvbW1pdCA9dmFsOwotCX0KLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLXN0YXRpYyBjaGFyICpnZXRfbmFtZShwdHIsIGRzdCkKLWNoYXIgKnB0cjsKLWNoYXIgKipkc3Q7Ci17Ci0gIHdoaWxlICgqcHRyID09ICcgJykKLSAgICBwdHIrKzsKLSAgKmRzdCA9IHB0cjsKLSAgd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnICcpCi0gICAgcHRyKys7Ci0gICpwdHIgPSAwOwotICByZXR1cm4gcHRyKzE7Ci19Ci0KLS8qIFByb2Nlc3MgYW55IG1hZ2ljIGVtYmVkZGVkIGNvbW1hbmRzIGluIGEgc2VjdGlvbiBjYWxsZWQgLmRyZWN0dmUgKi8KLQkJCQotc3RhdGljIGludAotcHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyAob3V0cHV0X2JmZCwgaW5mbywgIGFiZmQpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRyZWN0dmUiKTsKLSAgY2hhciAqczsKLSAgY2hhciAqZTsKLSAgY2hhciAqY29weTsKLSAgaWYgKCFzZWMpIAotICAgIHJldHVybiAxOwotICAKLSAgY29weSA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHNlYy0+X3Jhd19zaXplKTsKLSAgaWYgKCFjb3B5KSAKLSAgICByZXR1cm4gMDsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGFiZmQsIHNlYywgY29weSwgMCwgc2VjLT5fcmF3X3NpemUpKSAKLSAgICB7Ci0gICAgICBmcmVlIChjb3B5KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZSA9IGNvcHkgKyBzZWMtPl9yYXdfc2l6ZTsKLSAgZm9yIChzID0gY29weTsgIHMgPCBlIDsgKSAKLSAgICB7Ci0gICAgICBpZiAoc1swXSE9ICctJykgewotCXMrKzsKLQljb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChzdHJuY21wIChzLCItYXR0ciIsIDUpID09IDApCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIGNoYXIgKmF0dHJpYnM7Ci0JICBhc2VjdGlvbiAqYXNlYzsKLQotCSAgaW50IGxvb3AgPSAxOwotCSAgaW50IGhhZF93cml0ZSA9IDA7Ci0JICBpbnQgaGFkX3JlYWQgPSAwOwotCSAgaW50IGhhZF9leGVjPSAwOwotCSAgaW50IGhhZF9zaGFyZWQ9IDA7Ci0JICBzICs9IDU7Ci0JICBzID0gZ2V0X25hbWUocywgJm5hbWUpOwotCSAgcyA9IGdldF9uYW1lKHMsICZhdHRyaWJzKTsKLQkgIHdoaWxlIChsb29wKSB7Ci0JICAgIHN3aXRjaCAoKmF0dHJpYnMrKykgCi0JICAgICAgewotCSAgICAgIGNhc2UgJ1cnOgotCQloYWRfd3JpdGUgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICdSJzoKLQkJaGFkX3JlYWQgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICdTJzoKLQkJaGFkX3NoYXJlZCA9IDE7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJ1gnOgotCQloYWRfZXhlYyA9IDE7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWxvb3AgPSAwOwotCSAgICAgIH0KLQkgIH0KLQkgIGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoYXNlYykgewotCSAgICBpZiAoaGFkX2V4ZWMpCi0JICAgICAgYXNlYy0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JICAgIGlmICghaGFkX3dyaXRlKQotCSAgICAgIGFzZWMtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQkgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChzLCItaGVhcCIsIDUpID09IDApCi0JewotCSAgcyA9IGRvcmVzX2NvbSAocys1LCBvdXRwdXRfYmZkLCAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChzLCItc3RhY2siLCA2KSA9PSAwKQotCXsKLQkgIHMgPSBkb3Jlc19jb20gKHMrNiwgb3V0cHV0X2JmZCwgMCk7Ci0JfQotICAgICAgZWxzZSAKLQlzKys7Ci0gICAgfQotICBmcmVlIChjb3B5KTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFBsYWNlIGEgbWFya2VyIGFnYWluc3QgYWxsIHN5bWJvbHMgd2hpY2ggYXJlIHVzZWQgYnkgcmVsb2NhdGlvbnMuCi0gICBUaGlzIG1hcmtlciBjYW4gYmUgcGlja2VkIHVwIGJ5IHRoZSAnZG8gd2Ugc2tpcCB0aGlzIHN5bWJvbCA/JwotICAgbG9vcCBpbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQoKSBhbmQgdXNlZCB0byBwcmV2ZW50IHNraXBwaW5nCi0gICB0aGF0IHN5bWJvbC4gCi0gICAqLwotCi1zdGF0aWMgdm9pZAotbWFya19yZWxvY3MgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqCWZpbmZvOwotICAgICBiZmQgKiAJCQkJaW5wdXRfYmZkOwotewotICBhc2VjdGlvbiAqIGE7Ci0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGlucHV0X2JmZCkgJiBIQVNfU1lNUykgPT0gMCkKLSAgICByZXR1cm47Ci0gIAotICBmb3IgKGEgPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBhICE9IChhc2VjdGlvbiAqKSBOVUxMOyBhID0gYS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKglpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKglpcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaXJlbGVuZDsKLQotICAgICAgCi0gICAgICBpZiAoKGEtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwIHx8IGEtPnJlbG9jX2NvdW50ICA8IDEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcy4gICovCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkoaW5wdXRfYmZkLCBhLCBmYWxzZSwKLQkgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSwKLQkgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKLQkgID8gKGZpbmZvLT5zZWN0aW9uX2luZm9bIGEtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXggXS5yZWxvY3MgKyBhLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpCi0JICA6IGZpbmZvLT5pbnRlcm5hbF9yZWxvY3MpCi0JKTsKLSAgICAgIAotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBpcmVsICAgICA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGlyZWxlbmQgID0gaXJlbCArIGEtPnJlbG9jX2NvdW50OwotCi0gICAgICAvKiBQbGFjZSBhIG1hcmsgaW4gdGhlIHN5bV9pbmRpY2VzIGFycmF5ICh3aG9zZSBlbnRyaWVzIGhhdmUKLQkgYmVlbiBpbml0aWFsaXNlZCB0byAwKSBmb3IgYWxsIG9mIHRoZSBzeW1ib2xzIHRoYXQgYXJlIHVzZWQKLQkgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUuICBUaGlzIHdpbGwgdGhlbiBiZSBwaWNrZWQgdXAgaW4gdGhlCi0JIHNraXAvZG9uJ3QgcGFzcyAqLwotICAgICAgCi0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQl7Ci0JICBmaW5mby0+c3ltX2luZGljZXNbIGlyZWwtPnJfc3ltbmR4IF0gPSAtMTsKLQl9Ci0gICAgfQotfQotCi0vKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgotICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYm9vbGVhbiAoKnN5bV9pc19nbG9iYWwpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLSAgYm9vbGVhbiAoKmFkanVzdF9zeW1uZHgpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJICAgIGJvb2xlYW4gKikpOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZW50X2Jhc2U7Ci0gIHVuc2lnbmVkIGludCBuX3RtYXNrOwotICB1bnNpZ25lZCBpbnQgbl9idHNoZnQ7Ci0gIGJvb2xlYW4gY29weSwgaGFzaDsKLSAgYmZkX3NpemVfdHlwZSBpc3ltZXN6OwotICBiZmRfc2l6ZV90eXBlIG9zeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgbGluZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc3ltcDsKLSAgYXNlY3Rpb24gKipzZWNwcDsKLSAgbG9uZyAqaW5kZXhwOwotICB1bnNpZ25lZCBsb25nIG91dHB1dF9pbmRleDsKLSAgYmZkX2J5dGUgKm91dHN5bTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGFzZWN0aW9uICpvOwotCi0gIC8qIE1vdmUgYWxsIHRoZSBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICBzeW1faXNfZ2xvYmFsID0gY29mZl9iYWNrZW5kX2luZm8gKGlucHV0X2JmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsOwotICBzdHJpbmdzID0gTlVMTDsKLSAgc3ltZW50X2Jhc2UgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0gIGlzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGlucHV0X2JmZCk7Ci0gIG9zeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGlucHV0X2JmZCk7Ci0gIEJGRF9BU1NFUlQgKGxpbmVzeiA9PSBiZmRfY29mZl9saW5lc3ogKG91dHB1dF9iZmQpKTsKLQotICBuX3RtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX3RtYXNrOwotICBuX2J0c2hmdCA9IGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfbl9idHNoZnQ7Ci0KLSAgLyogRGVmaW5lIG1hY3JvcyBzbyB0aGF0IElTRkNOLCBldC4gYWwuLCBtYWNyb3Mgd29yayBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBOX1RNQVNLIG5fdG1hc2sKLSNkZWZpbmUgTl9CVFNIRlQgbl9idHNoZnQKLQotICBjb3B5ID0gZmFsc2U7Ci0gIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBjb3B5ID0gdHJ1ZTsKLSAgaGFzaCA9IHRydWU7Ci0gIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotICAgIGhhc2ggPSBmYWxzZTsKLQotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBpc3ltZXN6OwotICBpc3ltcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBzZWNwcCA9IGZpbmZvLT5zZWNfcHRyczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBvdXRwdXRfaW5kZXggPSBzeW1lbnRfYmFzZTsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0KLSAgaWYgKGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnBlKQotICAgIHsKLSAgICAgIGlmICghIHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIHBlcmZvcm0gcmVsb2NhdGlvbnMgYW5kIGFsc28gc3RyaXAvZGlzY2FyZCBzb21lIHN5bWJvbHMKLSAgICAgdGhlbiB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzdHJpcC9kaXNjYXJkIHRob3NlIHN5bWJvbHMgdGhhdCBhcmUKLSAgICAgZ29pbmcgdG8gYmUgaW52b2x2ZWQgaW4gdGhlIHJlbG9jYXRpb25zICovCi0gIGlmICgoICAgZmluZm8tPmluZm8tPnN0cmlwICAgIT0gc3RyaXBfbm9uZQotICAgICAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkICE9IGRpc2NhcmRfbm9uZSkKLSAgICAgICYmIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgLyogbWFyayB0aGUgc3ltYm9sIGFycmF5IGFzICdub3QtdXNlZCcgKi8KLSAgICAgIG1lbXNldCAoaW5kZXhwLCAwLCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIHNpemVvZiAqIGluZGV4cCk7IAotICAgICAgIAotICAgICAgbWFya19yZWxvY3MgKGZpbmZvLCBpbnB1dF9iZmQpOwotICAgIH0KLQotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICAgYm9vbGVhbiBkb250X3NraXBfc3ltYm9sOwotICAgICAgaW50IGFkZDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgKFBUUikgaXN5bXApOwotCi0gICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgotCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KLQkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCi0JIHRoZSBzeW1ib2wuICAqLwotICAgICAgaXN5bSA9ICppc3ltcDsKLQotICAgICAgaWYgKGlzeW0ubl9zY251bSAhPSAwKQotCSpzZWNwcCA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaW5wdXRfYmZkLCBpc3ltLm5fc2NudW0pOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChpc3ltLm5fdmFsdWUgPT0gMCkKLQkgICAgKnNlY3BwID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgKnNlY3BwID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQl9Ci0KLSAgICAgIC8qIEV4dHJhY3QgdGhlIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN5bWJvbCBpcyB1c2VkIGJ5IGEKLSAgICAgICAgIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQotCSAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkICE9IGRpc2NhcmRfbm9uZSkKLQkgICYmIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JZG9udF9za2lwX3N5bWJvbCA9ICppbmRleHA7Ci0gICAgICBlbHNlCi0JZG9udF9za2lwX3N5bWJvbCA9IGZhbHNlOwotICAgICAgCi0gICAgICAqaW5kZXhwID0gLTE7Ci0KLSAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgIGdsb2JhbCA9IGZhbHNlOwotICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcgYWxsIHN5bWJvbHMsIHdlIHdhbnQgdG8gc2tpcCB0aGlzIG9uZS4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCAmJiAhIGRvbnRfc2tpcF9zeW1ib2wpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIGlmICghIHNraXApCi0JewotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCSAgICAgIHx8IChvYmpfcGUgKGlucHV0X2JmZCkgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspCi0jaWZkZWYgQ19TWVNURU0KLQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfU1lTVEVNCi0jZW5kaWYKLQkgICAgICB8fCAoc3ltX2lzX2dsb2JhbCAmJiAoKnN5bV9pc19nbG9iYWwpIChpbnB1dF9iZmQsICZpc3ltKSkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gIEdsb2JhbCBzeW1ib2xzIGNvbWUgYXQgdGhlCi0JCSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSwgc28gc2tpcCB0aGVtIGZvciBub3cuCi0JCSBMb2NhbGx5IGRlZmluZWQgZnVuY3Rpb24gc3ltYm9scywgaG93ZXZlciwgYXJlIGFuCi0JCSBleGNlcHRpb24sIGFuZCBhcmUgbm90IG1vdmVkIHRvIHRoZSBlbmQuICAqLwotCSAgICAgIGdsb2JhbCA9IHRydWU7Ci0JICAgICAgaWYgKCEgSVNGQ04gKGlzeW0ubl90eXBlKSB8fCBpc3ltLm5fc2NudW0gPT0gMCkKLQkJc2tpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBsb2NhbCBzeW1ib2wuICBTa2lwIGl0IGlmIHdlIGFyZSBkaXNjYXJkaW5nCi0gICAgICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuICAqLwotCSAgICAgIGlmIChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbCAmJiAhIGRvbnRfc2tpcF9zeW1ib2wpCi0JCXNraXAgPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBzdHJpcHBpbmcgZGVidWdnaW5nIHN5bWJvbHMsIGFuZCB0aGlzIGlzIGEgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2wsIHRoZW4gc2tpcCBpdC4gIEZJWE1FOiBnYXMgc2V0cyB0aGUgc2VjdGlvbiB0byBOX0FCUwotICAgICAgICAgZm9yIHNvbWUgdHlwZXMgb2YgZGVidWdnaW5nIHN5bWJvbHM7IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0gICAgICAgICBhIGJ1ZyBvciBub3QuICBJbiBhbnkgY2FzZSwgd2UgaGFuZGxlIGl0IGhlcmUuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyCi0JICAmJiAhIGRvbnRfc2tpcF9zeW1ib2wKLQkgICYmIChpc3ltLm5fc2NudW0gPT0gTl9ERUJVRwotCSAgICAgIHx8IChpc3ltLm5fc2NudW0gPT0gTl9BQlMKLQkJICAmJiAoaXN5bS5uX3NjbGFzcyA9PSBDX0FVVE8KLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1JFRwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfTU9TCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19NT0UKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX01PVQotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfQVJHCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19SRUdQQVJNCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19GSUVMRAotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRU9TKSkpKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBJZiBzb21lIHN5bWJvbHMgYXJlIHN0cmlwcGVkIGJhc2VkIG9uIHRoZSBuYW1lLCB3b3JrIG91dCB0aGUKLQkgbmFtZSBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gc2tpcCB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoISBkb250X3NraXBfc3ltYm9sCi0JICAgICAgJiYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCQkgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwKLQkJCQkgICAgZmFsc2UpID09IE5VTEwpKQotCQkgICB8fCAoISBnbG9iYWwKLQkJICAgICAgICYmIGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbAotCQkgICAgICAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpKSkKLQkgICAgc2tpcCA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIGVudW0sIHN0cnVjdCwgb3IgdW5pb24gdGFnLCBzZWUgaWYgd2UgaGF2ZQotICAgICAgICAgYWxyZWFkeSBvdXRwdXQgYW4gaWRlbnRpY2FsIHR5cGUuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgKGZpbmZvLT5vdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpID09IDAKLQkgICYmIChpc3ltLm5fc2NsYXNzID09IENfRU5UQUcKLQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfU1RSVEFHCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1VOVEFHKQotCSAgJiYgaXN5bS5uX251bWF1eCA9PSAxKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqbWg7Ci0JICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICptdDsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0JICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICoqZXBwOwotCSAgYmZkX2J5dGUgKmVzbCwgKmVzbGVuZDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzbHA7Ci0KLQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgJmlzeW0sIGJ1Zik7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIElnbm9yZSBmYWtlIG5hbWVzIGludmVudGVkIGJ5IGNvbXBpbGVyOyB0cmVhdCB0aGVtIGFsbCBhcwotICAgICAgICAgICAgIHRoZSBzYW1lIG5hbWUuICAqLwotCSAgaWYgKCpuYW1lID09ICd+JyB8fCAqbmFtZSA9PSAnLicgfHwgKm5hbWUgPT0gJyQnCi0JICAgICAgfHwgKCpuYW1lID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoaW5wdXRfYmZkKQotCQkgICYmIChuYW1lWzFdID09ICd+JyB8fCBuYW1lWzFdID09ICcuJyB8fCBuYW1lWzFdID09ICckJykpKQotCSAgICBuYW1lID0gIiI7Ci0KLQkgIG1oID0gY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCAoJmZpbmZvLT5kZWJ1Z19tZXJnZSwgbmFtZSwKLQkJCQkJICAgICB0cnVlLCB0cnVlKTsKLQkgIGlmIChtaCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHR5cGUgaW5mb3JtYXRpb24uICBJZiB0aGlzIHR1cm5zCi0gICAgICAgICAgICAgb3V0IHRvIGJlIGEgZHVwbGljYXRlLCB3ZSBwYXNzIHRoaXMgYWRkcmVzcyB0bwotICAgICAgICAgICAgIGJmZF9yZWxlYXNlLiAgKi8KLQkgIG10ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICopCi0JCWJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlKSkpOwotCSAgaWYgKG10ID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG10LT5jbGFzcyA9IGlzeW0ubl9zY2xhc3M7Ci0KLQkgIC8qIFBpY2sgdXAgdGhlIGF1eCBlbnRyeSwgd2hpY2ggcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIHRhZwotICAgICAgICAgICAgIGVudHJpZXMuICAqLwotCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgKGVzeW0gKyBpc3ltZXN6KSwKLQkJCQlpc3ltLm5fdHlwZSwgaXN5bS5uX3NjbGFzcywgMCwgaXN5bS5uX251bWF1eCwKLQkJCQkoUFRSKSAmYXV4KTsKLQotCSAgLyogR2F0aGVyIHRoZSBlbGVtZW50cy4gICovCi0JICBlcHAgPSAmbXQtPmVsZW1lbnRzOwotCSAgbXQtPmVsZW1lbnRzID0gTlVMTDsKLQkgIGlzbHAgPSBpc3ltcCArIDI7Ci0JICBlc2wgPSBlc3ltICsgMiAqIGlzeW1lc3o7Ci0JICBlc2xlbmQgPSAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkKLQkJICAgICsgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgKiBpc3ltZXN6KTsKLQkgIHdoaWxlIChlc2wgPCBlc2xlbmQpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICplbGVuYW1lOwotCSAgICAgIGNoYXIgZWxlYnVmW1NZTU5NTEVOICsgMV07Ci0JICAgICAgY2hhciAqY29weTsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzbCwgKFBUUikgaXNscCk7Ci0KLQkgICAgICAqZXBwID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICopCi0JCSAgICAgIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJCSBzaXplb2YgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQpKSk7Ci0JICAgICAgaWYgKCplcHAgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZWxlbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBpc2xwLAotCQkJCQkJCWVsZWJ1Zik7Ci0JICAgICAgaWYgKGVsZW5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgY29weSA9IChjaGFyICopIGJmZF9hbGxvYyAoaW5wdXRfYmZkLCBzdHJsZW4gKGVsZW5hbWUpICsgMSk7Ci0JICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHN0cmNweSAoY29weSwgZWxlbmFtZSk7Ci0KLQkgICAgICAoKmVwcCktPm5hbWUgPSBjb3B5OwotCSAgICAgICgqZXBwKS0+dHlwZSA9IGlzbHAtPm5fdHlwZTsKLQkgICAgICAoKmVwcCktPnRhZ25keCA9IDA7Ci0JICAgICAgaWYgKGlzbHAtPm5fbnVtYXV4ID49IDEKLQkJICAmJiBpc2xwLT5uX3R5cGUgIT0gVF9OVUxMCi0JCSAgJiYgaXNscC0+bl9zY2xhc3MgIT0gQ19FT1MpCi0JCXsKLQkJICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgZWxlYXV4OwotCQkgIGxvbmcgaW5keDsKLQotCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIChlc2wgKyBpc3ltZXN6KSwKLQkJCQkJaXNscC0+bl90eXBlLCBpc2xwLT5uX3NjbGFzcywgMCwKLQkJCQkJaXNscC0+bl9udW1hdXgsIChQVFIpICZlbGVhdXgpOwotCQkgIGluZHggPSBlbGVhdXgueF9zeW0ueF90YWduZHgubDsKLQotCQkgIC8qIEZJWE1FOiBJZiB0aGlzIHRhZ25keCBlbnRyeSByZWZlcnMgdG8gYSBzeW1ib2wKLQkJICAgICBkZWZpbmVkIGxhdGVyIGluIHRoaXMgZmlsZSwgd2UganVzdCBpZ25vcmUgaXQuCi0JCSAgICAgSGFuZGxpbmcgdGhpcyBjb3JyZWN0bHkgd291bGQgYmUgdGVkaW91cywgYW5kIG1heQotCQkgICAgIG5vdCBiZSByZXF1aXJlZC4gICovCi0KLQkJICBpZiAoaW5keCA+IDAKLQkJICAgICAgJiYgKGluZHgKLQkJCSAgPCAoKGVzeW0gLQotCQkJICAgICAgKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCi0JCQkgICAgIC8gKGxvbmcpIGlzeW1lc3opKSkKLQkJICAgIHsKLQkJICAgICAgKCplcHApLT50YWduZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCSAgICAgIGlmICgoKmVwcCktPnRhZ25keCA8IDApCi0JCQkoKmVwcCktPnRhZ25keCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlcHAgPSAmKCplcHApLT5uZXh0OwotCSAgICAgICplcHAgPSBOVUxMOwotCi0JICAgICAgZXNsICs9IChpc2xwLT5uX251bWF1eCArIDEpICogaXN5bWVzejsKLQkgICAgICBpc2xwICs9IGlzbHAtPm5fbnVtYXV4ICsgMTsKLQkgICAgfQotCi0JICAvKiBTZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZGVmaW5pdGlvbiB3aGljaCBtYXRjaGVzIHRoaXMKLSAgICAgICAgICAgICB0eXBlLiAgV2UgYWx3YXlzIG91dHB1dCB0aGUgdHlwZSBpZiBpdCBoYXMgbm8gZWxlbWVudHMsCi0gICAgICAgICAgICAgZm9yIHNpbXBsaWNpdHkuICAqLwotCSAgaWYgKG10LT5lbGVtZW50cyA9PSBOVUxMKQotCSAgICBiZmRfcmVsZWFzZSAoaW5wdXRfYmZkLCAoUFRSKSBtdCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICptdGw7Ci0KLQkgICAgICBmb3IgKG10bCA9IG1oLT50eXBlczsgbXRsICE9IE5VTEw7IG10bCA9IG10bC0+bmV4dCkKLQkJewotCQkgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKm1lLCAqbWVsOwotCi0JCSAgaWYgKG10bC0+Y2xhc3MgIT0gbXQtPmNsYXNzKQotCQkgICAgY29udGludWU7Ci0KLQkJICBmb3IgKG1lID0gbXQtPmVsZW1lbnRzLCBtZWwgPSBtdGwtPmVsZW1lbnRzOwotCQkgICAgICAgbWUgIT0gTlVMTCAmJiBtZWwgIT0gTlVMTDsKLQkJICAgICAgIG1lID0gbWUtPm5leHQsIG1lbCA9IG1lbC0+bmV4dCkKLQkJICAgIHsKLQkJICAgICAgaWYgKHN0cmNtcCAobWUtPm5hbWUsIG1lbC0+bmFtZSkgIT0gMAotCQkJICB8fCBtZS0+dHlwZSAhPSBtZWwtPnR5cGUKLQkJCSAgfHwgbWUtPnRhZ25keCAhPSBtZWwtPnRhZ25keCkKLQkJCWJyZWFrOwotCQkgICAgfQotCi0JCSAgaWYgKG1lID09IE5VTEwgJiYgbWVsID09IE5VTEwpCi0JCSAgICBicmVhazsKLQkJfQotCi0JICAgICAgaWYgKG10bCA9PSBOVUxMIHx8IChiZmRfc2l6ZV90eXBlKSBtdGwtPmluZHggPj0gc3ltZW50X2Jhc2UpCi0JCXsKLQkJICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBkZWZpbml0aW9uIG9mIHRoaXMgdHlwZS4gICovCi0JCSAgbXQtPmluZHggPSBvdXRwdXRfaW5kZXg7Ci0JCSAgbXQtPm5leHQgPSBtaC0+dHlwZXM7Ci0JCSAgbWgtPnR5cGVzID0gbXQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGlzIGEgcmVkZWZpbml0aW9uIHdoaWNoIGNhbiBiZSBtZXJnZWQuICAqLwotCQkgIGJmZF9yZWxlYXNlIChpbnB1dF9iZmQsIChQVFIpIG10KTsKLQkJICAqaW5kZXhwID0gbXRsLT5pbmR4OwotCQkgIGFkZCA9IChlc2xlbmQgLSBlc3ltKSAvIGlzeW1lc3o7Ci0JCSAgc2tpcCA9IHRydWU7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogV2Ugbm93IGtub3cgd2hldGhlciB3ZSBhcmUgdG8gc2tpcCB0aGlzIHN5bWJvbCBvciBub3QuICAqLwotICAgICAgaWYgKCEgc2tpcCkKLQl7Ci0JICAvKiBBZGp1c3QgdGhlIHN5bWJvbCBpbiBvcmRlciB0byBvdXRwdXQgaXQuICAqLwotCi0JICBpZiAoaXN5bS5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JICAgICAgJiYgaXN5bS5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYSBsb25nIG5hbWUuICBFbnRlciBpdCBpbiB0aGUgc3RyaW5nCi0JCSB0YWJsZSB3ZSBhcmUgYnVpbGRpbmcuICBOb3RlIHRoYXQgd2UgZG8gbm90IGNoZWNrCi0JCSBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnLiAgVGhhdCBpcyBvbmx5IHRydWUgZm9yCi0JCSBYQ09GRiwgYW5kIFhDT0ZGIHJlcXVpcmVzIGRpZmZlcmVudCBsaW5raW5nIGNvZGUKLQkJIGFueWhvdy4gICovCi0JICAgICAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwKLQkJCQkJCSAgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIG5hbWUsIGhhc2gsIGNvcHkpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLQkgICAgfQotCi0JICBpZiAoaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgewotCSAgICAgIGlzeW0ubl9zY251bSA9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgICAgIGlzeW0ubl92YWx1ZSArPSAoKnNlY3BwKS0+b3V0cHV0X29mZnNldDsKLQkgICAgICBpZiAoISBvYmpfcGUgKGlucHV0X2JmZCkpCi0JCWlzeW0ubl92YWx1ZSAtPSAoKnNlY3BwKS0+dm1hOwotCSAgICAgIGlmICghIG9ial9wZSAoZmluZm8tPm91dHB1dF9iZmQpKQotCQlpc3ltLm5fdmFsdWUgKz0gKCpzZWNwcCktPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIH0KLQotCSAgLyogVGhlIHZhbHVlIG9mIGEgQ19GSUxFIHN5bWJvbCBpcyB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZQotCSAgICAgbmV4dCBDX0ZJTEUgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wKLQkgICAgIGlzIHRoZSBzeW1ib2wgaW5kZXggdG8gdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbAotCSAgICAgKGFjdHVhbGx5LCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgZG9lcyBub3QgZ2V0IHRoaXMKLQkgICAgIHJpZ2h0LS1pdCBqdXN0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wKLQkgICAgIHRvIHplcm8tLWFuZCBub2JvZHkgaGFzIGV2ZXIgY29tcGxhaW5lZCBhYm91dCBpdCkuICBXZQotCSAgICAgdHJ5IHRvIGdldCB0aGlzIHJpZ2h0LCBiZWxvdywganVzdCBiZWZvcmUgd2Ugd3JpdGUgdGhlCi0JICAgICBzeW1ib2xzIG91dCwgYnV0IGluIHRoZSBnZW5lcmFsIGNhc2Ugd2UgbWF5IGhhdmUgdG8gd3JpdGUKLQkgICAgIHRoZSBzeW1ib2wgb3V0IHR3aWNlLiAgKi8KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRklMRSkKLQkgICAgewotCSAgICAgIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0JCSAgJiYgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlICE9IChsb25nKSBvdXRwdXRfaW5kZXgpCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNvcnJlY3QgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBlbnRyeS4gICovCi0JCSAgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlID0gb3V0cHV0X2luZGV4OwotCQkgIGlmICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBpbiB0aGlzIGlucHV0IGZpbGUuICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkJCSAgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCQkgICAgKyAoKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXgKLQkJCQkJCQktIHN5bWVudF9iYXNlKQotCQkJCQkJICAgICAgICogb3N5bWVzeikpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUgbGFzdCBDX0ZJTEUKLQkJCSBzeW1ib2wuICBXZSBuZWVkIHRvIHdyaXRlIGl0IG91dCBhZ2Fpbi4gIFdlCi0JCQkgYm9ycm93ICpvdXRzeW0gdGVtcG9yYXJpbHkuICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLQkJICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJCSAgICAgKyBmaW5mby0+bGFzdF9maWxlX2luZGV4ICogb3N5bWVzeiksCi0JCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCQkgIHx8IChiZmRfd3JpdGUgKG91dHN5bSwgb3N5bWVzeiwgMSwgb3V0cHV0X2JmZCkKLQkJCSAgICAgICE9IG9zeW1lc3opKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmaW5mby0+bGFzdF9maWxlX2luZGV4ID0gb3V0cHV0X2luZGV4OwotCSAgICAgIGZpbmZvLT5sYXN0X2ZpbGUgPSBpc3ltOwotCSAgICB9Ci0KLQkgIC8qIElmIGRvaW5nIHRhc2sgbGlua2luZywgY29udmVydCBub3JtYWwgZ2xvYmFsIGZ1bmN0aW9uIHN5bWJvbHMgdG8KLQkgICAgIHN0YXRpYyBmdW5jdGlvbnMuICovCi0KLQkgIGlmIChmaW5mby0+aW5mby0+dGFza19saW5rCi0JICAgICAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkJICB8fCBpc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCQkgIHx8IChvYmpfcGUgKGlucHV0X2JmZCkgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspKSkKLQkgICAgaXN5bS5uX3NjbGFzcyA9IENfU1RBVDsKLQotCSAgLyogT3V0cHV0IHRoZSBzeW1ib2wuICAqLwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOwotCi0JICAqaW5kZXhwID0gb3V0cHV0X2luZGV4OwotCi0JICBpZiAoZ2xvYmFsKQotCSAgICB7Ci0JICAgICAgbG9uZyBpbmR4OwotCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGluZHggPSAoKGVzeW0gLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJICAgICAgLyBpc3ltZXN6KTsKLQkgICAgICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQl7Ci0JCSAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIHdlcmUgZXJyb3JzIGVhcmxpZXIgaW4KLSAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rLiAgKi8KLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBoLT5pbmR4ID0gb3V0cHV0X2luZGV4OwotCSAgICB9Ci0KLQkgIG91dHB1dF9pbmRleCArPSBhZGQ7Ci0JICBvdXRzeW0gKz0gYWRkICogb3N5bWVzejsKLQl9Ci0KLSAgICAgIGVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGlzeW1wICs9IGFkZDsKLSAgICAgICsrc2VjcHA7Ci0gICAgICArK2luZGV4cDsKLSAgICAgIGZvciAoLS1hZGQ7IGFkZCA+IDA7IC0tYWRkKQotCXsKLQkgICpzZWNwcCsrID0gTlVMTDsKLQkgICppbmRleHArKyA9IC0xOwotCX0KLSAgICB9Ci0KLSAgLyogRml4IHVwIHRoZSBhdXggZW50cmllcy4gIFRoaXMgbXVzdCBiZSBkb25lIGluIGEgc2VwYXJhdGUgcGFzcywKLSAgICAgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBjb3JyZWN0IHN5bWJvbCBpbmRpY2VzIHVudGlsIHdlIGhhdmUKLSAgICAgYWxyZWFkeSBkZWNpZGVkIHdoaWNoIHN5bWJvbHMgd2UgYXJlIGdvaW5nIHRvIGtlZXAuICAqLwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBpc3ltZXN6OwotICBpc3ltcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIHN5bV9oYXNoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgaW50IGFkZDsKLQotICAgICAgYWRkID0gMSArIGlzeW1wLT5uX251bWF1eDsKLQotICAgICAgaWYgKCgqaW5kZXhwIDwgMAotCSAgIHx8IChiZmRfc2l6ZV90eXBlKSAqaW5kZXhwIDwgc3ltZW50X2Jhc2UpCi0JICAmJiAoKnN5bV9oYXNoID09IE5VTEwKLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+YXV4YmZkICE9IGlucHV0X2JmZCkpCi0JZXN5bSArPSBhZGQgKiBpc3ltZXN6OwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIGludCBpOwotCi0JICBoID0gTlVMTDsKLQkgIGlmICgqaW5kZXhwIDwgMCkKLQkgICAgewotCSAgICAgIGggPSAqc3ltX2hhc2g7Ci0KLQkgICAgICAvKiBUaGUgbTY4ay1tb3Rvcm9sYS1zeXN2IGFzc2VtYmxlciB3aWxsIHNvbWV0aW1lcwotICAgICAgICAgICAgICAgICBnZW5lcmF0ZSB0d28gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUsIGJ1dCBvbmx5IG9uZQotICAgICAgICAgICAgICAgICB3aWxsIGhhdmUgYXV4IGVudHJpZXMuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKGlzeW1wLT5uX251bWF1eCA9PSAwCi0JCQkgIHx8IGgtPm51bWF1eCA9PSBpc3ltcC0+bl9udW1hdXgpOwotCSAgICB9Ci0KLQkgIGVzeW0gKz0gaXN5bWVzejsKLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgb3V0c3ltICs9IG9zeW1lc3o7Ci0KLQkgIC8qIEhhbmRsZSB0aGUgYXV4IGVudHJpZXMuICBUaGlzIGhhbmRsaW5nIGlzIGJhc2VkIG9uCi0JICAgICBjb2ZmX3BvaW50ZXJpemVfYXV4LiAgSSBkb24ndCBrbm93IGlmIGl0IGFsd2F5cyBjb3JyZWN0LiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBpc3ltcC0+bl9udW1hdXggJiYgZXN5bSA8IGVzeW1fZW5kOyBpKyspCi0JICAgIHsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4cDsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCWF1eHAgPSBoLT5hdXggKyBpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIGlzeW1wLT5uX3R5cGUsCi0JCQkJCWlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkoUFRSKSAmYXV4KTsKLQkJICBhdXhwID0gJmF1eDsKLQkJfQotCi0JICAgICAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCXsKLQkJICAvKiBJZiB0aGlzIGlzIGEgbG9uZyBmaWxlbmFtZSwgd2UgbXVzdCBwdXQgaXQgaW4gdGhlCi0JCSAgICAgc3RyaW5nIHRhYmxlLiAgKi8KLQkJICBpZiAoYXV4cC0+eF9maWxlLnhfbi54X3plcm9lcyA9PSAwCi0JCSAgICAgICYmIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCQkgICAgICBCRkRfQVNTRVJUIChhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0Ci0JCQkJICA+PSBTVFJJTkdfU0laRV9TSVpFKTsKLQkJICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkJCXsKLQkJCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoaW5wdXRfYmZkKTsKLQkJCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGZpbGVuYW1lID0gc3RyaW5ncyArIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQ7Ci0JCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGZpbGVuYW1lLAotCQkJCQkJIGhhc2gsIGNvcHkpOwotCQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGlzeW1wLT5uX3NjbGFzcyAhPSBDX1NUQVQgfHwgaXN5bXAtPm5fdHlwZSAhPSBUX05VTEwpCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGluZHg7Ci0KLQkJICBpZiAoSVNGQ04gKGlzeW1wLT5uX3R5cGUpCi0JCSAgICAgIHx8IElTVEFHIChpc3ltcC0+bl9zY2xhc3MpCi0JCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JMT0NLCi0JCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZDTikKLQkJICAgIHsKLQkJICAgICAgaW5keCA9IGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7Ci0JCSAgICAgIGlmIChpbmR4ID4gMAotCQkJICAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQl7Ci0JCQkgIC8qIFdlIGxvb2sgZm9yd2FyZCB0aHJvdWdoIHRoZSBzeW1ib2wgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzeW1ib2wgd2UgYXJlIGdvaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluY2x1ZGUuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmVseSByaWdodC4gICovCi0JCQkgIHdoaWxlICgoZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdIDwgMAotCQkJCSAgfHwgKChiZmRfc2l6ZV90eXBlKSBmaW5mby0+c3ltX2luZGljZXNbaW5keF0KLQkJCQkgICAgICA8IHN5bWVudF9iYXNlKSkKLQkJCQkgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgICsraW5keDsKLQkJCSAgaWYgKGluZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQkgICAgaW5keCA9IG91dHB1dF9pbmRleDsKLQkJCSAgZWxzZQotCQkJICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCQkgIGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBpbmR4OwotCQkJfQotCQkgICAgfQotCi0JCSAgaW5keCA9IGF1eHAtPnhfc3ltLnhfdGFnbmR4Lmw7Ci0JCSAgaWYgKGluZHggPiAwICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJICAgIHsKLQkJICAgICAgbG9uZyBzeW1pbmR4OwotCi0JCSAgICAgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCSAgICAgIGlmIChzeW1pbmR4IDwgMCkKLQkJCWF1eHAtPnhfc3ltLnhfdGFnbmR4LmwgPSAwOwotCQkgICAgICBlbHNlCi0JCQlhdXhwLT54X3N5bS54X3RhZ25keC5sID0gc3ltaW5keDsKLQkJICAgIH0KLQotCQkgIC8qIFRoZSAuYmYgc3ltYm9scyBhcmUgc3VwcG9zZWQgdG8gYmUgbGlua2VkIHRocm91Z2gKLQkJICAgICB0aGUgZW5kbmR4IGZpZWxkLiAgV2UgbmVlZCB0byBjYXJyeSB0aGlzIGxpc3QKLQkJICAgICBhY3Jvc3Mgb2JqZWN0IGZpbGVzLiAgKi8KLQkJICBpZiAoaSA9PSAwCi0JCSAgICAgICYmIGggPT0gTlVMTAotCQkgICAgICAmJiBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04KLQkJICAgICAgJiYgKGlzeW1wLT5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0JCQkgIHx8IGlzeW1wLT5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVswXSA9PSAnLicKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbMV0gPT0gJ2InCi0JCSAgICAgICYmIGlzeW1wLT5fbi5fbl9uYW1lWzJdID09ICdmJwotCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVszXSA9PSAnXDAnKQotCQkgICAgewotCQkgICAgICBpZiAoZmluZm8tPmxhc3RfYmZfaW5kZXggIT0gLTEpCi0JCQl7Ci0JCQkgIGZpbmZvLT5sYXN0X2JmLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPQotCQkJICAgICppbmRleHA7Ci0KLQkJCSAgaWYgKChiZmRfc2l6ZV90eXBlKSBmaW5mby0+bGFzdF9iZl9pbmRleAotCQkJICAgICAgPj0gc3ltZW50X2Jhc2UpCi0JCQkgICAgewotCQkJICAgICAgUFRSIGF1eG91dDsKLQotCQkJICAgICAgLyogVGhlIGxhc3QgLmJmIHN5bWJvbCBpcyBpbiB0aGlzIGlucHV0Ci0JCQkJIGZpbGUuICBUaGlzIHdpbGwgb25seSBoYXBwZW4gaWYgdGhlCi0JCQkJIGFzc2VtYmxlciBkaWQgbm90IHNldCB1cCB0aGUgLmJmCi0JCQkJIGVuZG5keCBzeW1ib2xzIGNvcnJlY3RseS4gICovCi0JCQkgICAgICBhdXhvdXQgPSAoUFRSKSAoZmluZm8tPm91dHN5bXMKLQkJCQkJICAgICAgKyAoKGZpbmZvLT5sYXN0X2JmX2luZGV4Ci0JCQkJCQkgIC0gc3ltZW50X2Jhc2UpCi0JCQkJCQkgKiBvc3ltZXN6KSk7Ci0JCQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9iZiwKLQkJCQkJCSAgICAgaXN5bXAtPm5fdHlwZSwKLQkJCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLAotCQkJCQkJICAgICAwLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJCQkgICAgIGF1eG91dCk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmYgYXV4IGVudHJ5LiAgV2UgbmVlZCB0byB3cml0ZSBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IGFnYWluLiAgV2UgYm9ycm93ICpvdXRzeW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyaWx5LiAgRklYTUU6IFRoaXMgY2FzZSBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG1hZGUgZmFzdGVyLiAgKi8KLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2JmLAotCQkJCQkJICAgICBpc3ltcC0+bl90eXBlLAotCQkJCQkJICAgICBpc3ltcC0+bl9zY2xhc3MsCi0JCQkJCQkgICAgIDAsIGlzeW1wLT5uX251bWF1eCwKLQkJCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLQkJCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCQkJCSAgICAgKyBmaW5mby0+bGFzdF9iZl9pbmRleCAqIG9zeW1lc3opLAotCQkJCQkgICAgU0VFS19TRVQpICE9IDAKLQkJCQkgIHx8IGJmZF93cml0ZSAob3V0c3ltLCBvc3ltZXN6LCAxLAotCQkJCQkJb3V0cHV0X2JmZCkgIT0gb3N5bWVzeikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIGlmIChhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sICE9IDApCi0JCQlmaW5mby0+bGFzdF9iZl9pbmRleCA9IC0xOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIFRoZSBlbmRuZHggZmllbGQgb2YgdGhpcyBhdXggZW50cnkgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1cGRhdGVkIHdpdGggdGhlIHN5bWJvbCBudW1iZXIgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLmJmIHN5bWJvbC4gICovCi0JCQkgIGZpbmZvLT5sYXN0X2JmID0gKmF1eHA7Ci0JCQkgIGZpbmZvLT5sYXN0X2JmX2luZGV4ID0gKCgob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpCi0JCQkJCQkgICAvIG9zeW1lc3opCi0JCQkJCQkgICsgc3ltZW50X2Jhc2UpOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQl7Ci0JCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSBhdXhwLCBpc3ltcC0+bl90eXBlLAotCQkJCQkgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJCSAoUFRSKSBvdXRzeW0pOwotCQkgIG91dHN5bSArPSBvc3ltZXN6OwotCQl9Ci0KLQkgICAgICBlc3ltICs9IGlzeW1lc3o7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluZGV4cCArPSBhZGQ7Ci0gICAgICBpc3ltcCArPSBhZGQ7Ci0gICAgICBzeW1faGFzaCArPSBhZGQ7Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBsaW5lIG51bWJlcnMsIHVubGVzcyB3ZSBhcmUgc3RyaXBwaW5nIHRoZW0uICAqLwotICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKLSAgICAgIHx8IGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotICAgIHsKLSAgICAgIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICBiZmRfYnl0ZSAqZWxpbmU7Ci0JICBiZmRfYnl0ZSAqZWxpbmVlbmQ7Ci0KLQkgIC8qIEZJWE1FOiBJZiBTRUNfSEFTX0NPTlRFTlRTIGlzIG5vdCBmb3IgdGhlIHNlY3Rpb24sIHRoZW4KLQkgICAgIGJ1aWxkX2xpbmtfb3JkZXIgaW4gbGR3cml0ZS5jIHdpbGwgbm90IGhhdmUgY3JlYXRlZCBhCi0JICAgICBsaW5rIG9yZGVyLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgbm90IGhhdmUgc2VlbiB0aGlzCi0JICAgICBpbnB1dCBzZWN0aW9uIGluIF9iZmRfY29mZl9maW5hbF9saW5rLCB3aGljaCBtZWFucyB0aGF0Ci0JICAgICB3ZSB3aWxsIG5vdCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIGxpbmUgbnVtYmVycyBvZgotCSAgICAgdGhpcyBzZWN0aW9uLiAgSSBkb24ndCB0aGluayBsaW5lIG51bWJlcnMgY2FuIGJlCi0JICAgICBtZWFuaW5nZnVsIGZvciBhIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgaGF2ZQotCSAgICAgU0VDX0hBU19DT05URU5UUyBzZXQsIGJ1dCwgaWYgdGhleSBkbywgdGhpcyBtdXN0IGJlCi0JICAgICBjaGFuZ2VkLiAgKi8KLQkgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMAotCSAgICAgIHx8IChvLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LAotCQkJICAgaW5wdXRfYmZkKSAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7Ci0JICBlbGluZSA9IGZpbmZvLT5saW5lbm9zOwotCSAgZWxpbmVlbmQgPSBlbGluZSArIGxpbmVzeiAqIG8tPmxpbmVub19jb3VudDsKLQkgIGZvciAoOyBlbGluZSA8IGVsaW5lZW5kOyBlbGluZSArPSBsaW5lc3opCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGlsaW5lOwotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwgKFBUUikgZWxpbmUsIChQVFIpICZpbGluZSk7Ci0KLQkgICAgICBpZiAoaWxpbmUubF9sbm5vICE9IDApCi0JCWlsaW5lLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKLQkgICAgICBlbHNlIGlmIChpbGluZS5sX2FkZHIubF9zeW1uZHggPj0gMAotCQkgICAgICAgJiYgKCh1bnNpZ25lZCBsb25nKSBpbGluZS5sX2FkZHIubF9zeW1uZHgKLQkJCSAgIDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpKQotCQl7Ci0JCSAgbG9uZyBpbmR4OwotCi0JCSAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbGluZS5sX2FkZHIubF9zeW1uZHhdOwotCi0JCSAgaWYgKGluZHggPCAwKQotCQkgICAgewotCQkgICAgICAvKiBUaGVzZSBsaW5lIG51bWJlcnMgYXJlIGF0dGFjaGVkIHRvIGEgc3ltYm9sCi0JCQkgd2hpY2ggd2UgYXJlIHN0cmlwcGluZy4gIFdlIHNob3VsZCByZWFsbHkKLQkJCSBqdXN0IGRpc2NhcmQgdGhlIGxpbmUgbnVtYmVycywgYnV0IHRoYXQgd291bGQKLQkJCSBiZSBhIHBhaW4gYmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgY291bnRlZAotCQkJIHRoZW0uICAqLwotCQkgICAgICBpbmR4ID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXM7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBpYTsKLQotCQkgICAgICAvKiBGaXggdXAgdGhlIGxubm9wdHIgZmllbGQgaW4gdGhlIGF1eCBlbnRyeSBvZgotCQkJIHRoZSBzeW1ib2wuICBJdCB0dXJucyBvdXQgdGhhdCB3ZSBjYW4ndCBkbwotCQkJIHRoaXMgd2hlbiB3ZSBtb2RpZnkgdGhlIHN5bWJvbCBhdXggZW50cmllcywKLQkJCSBiZWNhdXNlIGdhcyBzb21ldGltZXMgc2NyZXdzIHVwIHRoZSBsbm5vcHRyCi0JCQkgZmllbGQgYW5kIG1ha2VzIGl0IGFuIG9mZnNldCBmcm9tIHRoZSBzdGFydAotCQkJIG9mIHRoZSBsaW5lIG51bWJlcnMgcmF0aGVyIHRoYW4gYW4gYWJzb2x1dGUKLQkJCSBmaWxlIGluZGV4LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKG91dHB1dF9iZmQsCi0JCQkJCSAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLQkJCQkJCSAgICsgKChpbmR4IC0gc3ltZW50X2Jhc2UpCi0JCQkJCQkgICAgICAqIG9zeW1lc3opKSwKLQkJCQkJICAgIChQVFIpICZpcyk7Ci0JCSAgICAgIGlmICgoSVNGQ04gKGlzLm5fdHlwZSkKLQkJCSAgIHx8IGlzLm5fc2NsYXNzID09IENfQkxPQ0spCi0JCQkgICYmIGlzLm5fbnVtYXV4ID49IDEpCi0JCQl7Ci0JCQkgIFBUUiBhdXhwdHI7Ci0KLQkJCSAgYXV4cHRyID0gKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCSAgKyAoKGluZHggLSBzeW1lbnRfYmFzZSArIDEpCi0JCQkJCSAgICAgKiBvc3ltZXN6KSk7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChvdXRwdXRfYmZkLCBhdXhwdHIsCi0JCQkJCQlpcy5uX3R5cGUsIGlzLm5fc2NsYXNzLAotCQkJCQkJMCwgaXMubl9udW1hdXgsIChQVFIpICZpYSk7Ci0JCQkgIGlhLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9Ci0JCQkgICAgKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJCSAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6Ci0JCQkgICAgICsgZWxpbmUgLSBmaW5mby0+bGluZW5vcyk7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlhLAotCQkJCQkJIGlzLm5fdHlwZSwgaXMubl9zY2xhc3MsIDAsCi0JCQkJCQkgaXMubl9udW1hdXgsIGF1eHB0cik7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBpbGluZS5sX2FkZHIubF9zeW1uZHggPSBpbmR4OwotCQl9Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpbGluZSwgKFBUUikgZWxpbmUpOwotCSAgICB9Ci0KLQkgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCShvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KSwKLQkJCVNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3dyaXRlIChmaW5mby0+bGluZW5vcywgbGluZXN6LCBvLT5saW5lbm9fY291bnQsCi0JCQkgICAgb3V0cHV0X2JmZCkgIT0gbGluZXN6ICogby0+bGluZW5vX2NvdW50KQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKz0gby0+bGluZW5vX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2Ugc3dhcHBlZCBvdXQgYSBDX0ZJTEUgc3ltYm9sLCBndWVzcyB0aGF0IHRoZSBuZXh0IENfRklMRQotICAgICBzeW1ib2wgd2lsbCBiZSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBuZXh0IGlucHV0IGZpbGUuICBJbiB0aGUKLSAgICAgbm9ybWFsIGNhc2UsIHRoaXMgd2lsbCBzYXZlIHVzIGZyb20gd3JpdGluZyBvdXQgdGhlIENfRklMRSBzeW1ib2wKLSAgICAgYWdhaW4uICAqLwotICBpZiAoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAhPSAtMQotICAgICAgJiYgKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0gICAgewotICAgICAgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlID0gb3V0cHV0X2luZGV4OwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmZmluZm8tPmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0gCQkJCSAgICArICgoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAtIHN5bWVudF9iYXNlKQotIAkJCQkgICAgICAgKiBvc3ltZXN6KSkpOwotICAgIH0KLQotICAvKiBXcml0ZSB0aGUgbW9kaWZpZWQgc3ltYm9scyB0byB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAob3V0c3ltID4gZmluZm8tPm91dHN5bXMpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgICAgb2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKSArIHN5bWVudF9iYXNlICogb3N5bWVzeiwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgb3V0c3ltIC0gZmluZm8tPm91dHN5bXMsIDEsCi0JCQlvdXRwdXRfYmZkKQotCSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKLQkJICAgKyAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpIC8gb3N5bWVzeikKLQkJICA9PSBvdXRwdXRfaW5kZXgpOwotCi0gICAgICBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgPSBvdXRwdXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLwotICBhZGp1c3Rfc3ltbmR4ID0gY29mZl9iYWNrZW5kX2luZm8gKGlucHV0X2JmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4OwotICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY2RhdGE7Ci0KLSAgICAgIGlmICghIG8tPmxpbmtlcl9tYXJrKQotCXsKLQkgIC8qIFRoaXMgc2VjdGlvbiB3YXMgb21pdHRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgIHx8IChvLT5fcmF3X3NpemUgPT0gMCAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApKQotCXsKLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLQkgICAgICAmJiBvLT5yZWxvY19jb3VudCAhPSAwKQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IHJlbG9jcyBpbiBzZWN0aW9uIGAlcycsIGJ1dCBpdCBoYXMgbm8gY29udGVudHMiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgbykpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fY29udGVudHMpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHNlY2RhdGEgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKTsKLSAgICAgIGlmIChzZWNkYXRhICE9IE5VTEwgJiYgc2VjZGF0YS0+Y29udGVudHMgIT0gTlVMTCkKLQljb250ZW50cyA9IHNlY2RhdGEtPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBvLCBmaW5mby0+Y29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBvLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBjb250ZW50cyA9IGZpbmZvLT5jb250ZW50czsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgaW50IHRhcmdldF9pbmRleDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCi0JICAvKiBSZWFkIGluIHRoZSByZWxvY3MuICAqLwotCSAgdGFyZ2V0X2luZGV4ID0gby0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAgICAgKGlucHV0X2JmZCwgbywgZmFsc2UsIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgICBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlLAotCQkJICAgICAgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKLQkJCSAgICAgICA/IChmaW5mby0+c2VjdGlvbl9pbmZvW3RhcmdldF9pbmRleF0ucmVsb2NzCi0JCQkJICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCkKLQkJCSAgICAgICA6IGZpbmZvLT5pbnRlcm5hbF9yZWxvY3MpKSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogQ2FsbCBwcm9jZXNzb3Igc3BlY2lmaWMgY29kZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbgotICAgICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLQkgIGlmICghIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCQkgICBpbnB1dF9iZmQsIG8sCi0JCQkJCSAgIGNvbnRlbnRzLAotCQkJCQkgICBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJCSAgIGZpbmZvLT5pbnRlcm5hbF9zeW1zLAotCQkJCQkgICBmaW5mby0+c2VjX3B0cnMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotCi0JICAgICAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7Ci0JICAgICAgaXJlbCA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgICAgIHJlbF9oYXNoID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCi0JCQkgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkgICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKykKLQkJewotCQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkJICBib29sZWFuIGFkanVzdGVkOwotCi0JCSAgKnJlbF9oYXNoID0gTlVMTDsKLQotCQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgc3ltYm9sIGluZGV4LiAgKi8KLQotCQkgIGlyZWwtPnJfdmFkZHIgKz0gb2Zmc2V0OwotCi0JCSAgaWYgKGlyZWwtPnJfc3ltbmR4ID09IC0xKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoYWRqdXN0X3N5bW5keCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKCphZGp1c3Rfc3ltbmR4KSAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSAgICAgIGlucHV0X2JmZCwgbywgaXJlbCwKLQkJCQkJICAgICAgJmFkanVzdGVkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKGFkanVzdGVkKQotCQkJY29udGludWU7Ci0JCSAgICB9Ci0KLQkJICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpcmVsLT5yX3N5bW5keF07Ci0JCSAgaWYgKGggIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wuICAqLwotCQkgICAgICBpZiAoaC0+aW5keCA+PSAwKQotCQkJaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGJlaW5nIHdyaXR0ZW4gYXQgdGhlIGVuZAotCQkJICAgICBvZiB0aGUgZmlsZSwgYW5kIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUKLQkJCSAgICAgc3ltYm9sIGluZGV4LiAgV2Ugc2F2ZSB0aGUgcG9pbnRlciB0byB0aGUKLQkJCSAgICAgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUgcmVsX2hhc2ggbGlzdC4KLQkJCSAgICAgV2Ugc2V0IHRoZSBpbmR4IGZpZWxkIHRvIC0yIHRvIGluZGljYXRlCi0JCQkgICAgIHRoYXQgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgc3RyaXBwZWQuICAqLwotCQkJICAqcmVsX2hhc2ggPSBoOwotCQkJICBoLT5pbmR4ID0gLTI7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpcmVsLT5yX3N5bW5keF07Ci0JCSAgICAgIGlmIChpbmR4ICE9IC0xKQotCQkJaXJlbC0+cl9zeW1uZHggPSBpbmR4OwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzOwotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkJICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JCQkgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCB3ZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBwaW5nLiAgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQKLQkJCSAgICAgYnkgdGhlICdkb250X3NraXBfc3ltYm9sJyBjb2RlIGluIHRoZSB3aGlsZQotCQkJICAgICBsb29wIGF0IHRoZSB0b3Agb2YgdGhpcyBmdW5jdGlvbi4gKi8KLQkJCSAgCi0JCQkgIGlzID0gZmluZm8tPmludGVybmFsX3N5bXMgKyBpcmVsLT5yX3N5bW5keDsKLQotCQkJICBuYW1lID0gKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQotCQkJCSAgKGlucHV0X2JmZCwgaXMsIGJ1ZikpOwotCQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgbywKLQkJCQkgIGlyZWwtPnJfdmFkZHIpKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCArPSBvLT5yZWxvY19jb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChzZWNkYXRhID09IE5VTEwgfHwgc2VjZGF0YS0+c3RhYl9pbmZvID09IE5VTEwpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICAoby0+X2Nvb2tlZF9zaXplICE9IDAKLQkJCQkJICAgPyBvLT5fY29va2VkX3NpemUKLQkJCQkJICAgOiBvLT5fcmF3X3NpemUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0JCSAob3V0cHV0X2JmZCwgJmNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5zdGFiX2luZm8sCi0JCSAgbywgJnNlY2RhdGEtPnN0YWJfaW5mbywgY29udGVudHMpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgZ2xvYmFsIHN5bWJvbC4gIENhbGxlZCB2aWEgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0KLSAgaWYgKGgtPmluZHggPj0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKQotCQkgID09IE5VTEwpKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWFzZWN0aW9uICpzZWM7Ci0KLQlzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JICBpc3ltLm5fc2NudW0gPSBOX0FCUzsKLQllbHNlCi0JICBpc3ltLm5fc2NudW0gPSBzZWMtPnRhcmdldF9pbmRleDsKLQlpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCWlmICghIG9ial9wZSAoZmluZm8tPm91dHB1dF9iZmQpKQotCSAgaXN5bS5uX3ZhbHVlICs9IHNlYy0+dm1hOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IGgtPnJvb3QudS5jLnNpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEp1c3QgaWdub3JlIHRoZXNlLiAgVGhleSBjYW4ndCBiZSBoYW5kbGVkIGFueWhvdy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgPD0gU1lNTk1MRU4pCi0gICAgc3RybmNweSAoaXN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIGhhc2g7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIGhhc2ggPSB0cnVlOwotICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JaGFzaCA9IGZhbHNlOwotICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgaC0+cm9vdC5yb290LnN0cmluZywgaGFzaCwKLQkJCQkgZmFsc2UpOwotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXsKLQkgIGZpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPSAwOwotICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotICAgIH0KLQotICBpc3ltLm5fc2NsYXNzID0gaC0+Y2xhc3M7Ci0gIGlzeW0ubl90eXBlID0gaC0+dHlwZTsKLQotICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX05VTEwpCi0gICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotCi0gIC8qIElmIGRvaW5nIHRhc2sgbGlua2luZyBhbmQgdGhpcyBpcyB0aGUgcGFzcyB3aGVyZSB3ZSBjb252ZXJ0Ci0gICAgIGRlZmluZWQgZ2xvYmFscyB0byBzdGF0aWNzLCB0aGVuIGRvIHRoYXQgY29udmVyc2lvbiBub3cuICBJZiB0aGUKLSAgICAgc3ltYm9sIGlzIG5vdCBiZWluZyBjb252ZXJ0ZWQsIGp1c3QgaWdub3JlIGl0IGFuZCBpdCB3aWxsIGJlCi0gICAgIG91dHB1dCBkdXJpbmcgYSBsYXRlciBwYXNzLiAqLwotICBpZiAoZmluZm8tPmdsb2JhbF90b19zdGF0aWMpCi0gICAgewotICAgICAgaWYgKGlzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19XRUFLRVhUCi0JICAmJiAoISBvYmpfcGUgKG91dHB1dF9iZmQpIHx8IGlzeW0ubl9zY2xhc3MgIT0gQ19OVF9XRUFLKSkKLQl7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19TVEFUOwotICAgIH0KLQotICBpc3ltLm5fbnVtYXV4ID0gaC0+bnVtYXV4OwotICAKLSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZmluZm8tPm91dHN5bXMpOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgKiBzeW1lc3opLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgc3ltZXN6LCAxLCBvdXRwdXRfYmZkKSAhPSBzeW1lc3opCi0gICAgewotICAgICAgZmluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGgtPmluZHggPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgKytvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgLyogV3JpdGUgb3V0IGFueSBhc3NvY2lhdGVkIGF1eCBlbnRyaWVzLiAgVGhlcmUgbm9ybWFsbHkgd2lsbCBiZQotICAgICBub25lLiAgSWYgdGhlcmUgYXJlIGFueSwgSSBoYXZlIG5vIGlkZWEgaG93IHRvIG1vZGlmeSB0aGVtLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGlzeW0ubl9udW1hdXg7IGkrKykKLSAgICB7Ci0gICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpIChoLT5hdXggKyBpKSwgaXN5bS5uX3R5cGUsCi0JCQkgICAgIGlzeW0ubl9zY2xhc3MsIGksIGlzeW0ubl9udW1hdXgsCi0JCQkgICAgIChQVFIpIGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBzeW1lc3osIDEsIG91dHB1dF9iZmQpICE9IHN5bWVzeikKLQl7Ci0JICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0YXNrIGdsb2JhbCBzeW1ib2xzLCBjb252ZXJ0aW5nIHRoZW0gdG8gc3RhdGljcy4gIENhbGxlZAotICAgdmlhIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlLiAgQ2FsbHMgYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSB0byBkbwotICAgdGhlIGRpcnR5IHdvcmssIGlmIHRoZSBzeW1ib2wgd2UgYXJlIHByb2Nlc3NpbmcgbmVlZHMgY29udmVyc2lvbi4gKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYm9vbGVhbiBydG52YWwgPSB0cnVlOwotICBib29sZWFuIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKLQotICBpZiAoaC0+aW5keCA8IDApCi0gICAgewotICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JewotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgc2F2ZV9nbG9iYWxfdG9fc3RhdGljID0gZmluZm8tPmdsb2JhbF90b19zdGF0aWM7Ci0JICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHRydWU7Ci0JICBydG52YWwgPSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSAoaCwgZGF0YSk7Ci0JICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsCi0JCQkJICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoZmluZm8tPmluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICBob3d0by0+bmFtZSwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsCi0JCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuICBJdCB3aWxsIGdldAotICAgICBzd2FwcGVkIGFuZCB3cml0dGVuIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUuICAqLwotCi0gIGlyZWwgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLSAgcmVsX2hhc2hfcHRyID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcwotCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQotICBtZW1zZXQgKGlyZWwsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7Ci0gICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCi0gIGlyZWwtPnJfdmFkZHIgPSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBzb21laG93IGxvY2F0ZSBhIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbi4gIFRoZQotICAgICAgICAgc3ltYm9sIG11c3QgZWl0aGVyIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvLCBvciB3ZSBtdXN0IGFkanVzdAotICAgICAgICAgdGhlIGFkZGVuZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEZJWE1FOiBXcml0ZSB0aGlzCi0gICAgICAgICB3aGVuIHdlIG5lZWQgaXQuICBUaGUgb2xkIGxpbmtlciBjb3VsZG4ndCBoYW5kbGUgdGhpcyBhbnlob3cuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IE5VTEwpCi0JewotCSAgaWYgKGgtPmluZHggPj0gMCkKLQkgICAgaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2V0IHRoZSBpbmRleCB0byAtMiB0byBmb3JjZSB0aGlzIHN5bWJvbCB0byBnZXQKLQkJIHdyaXR0ZW4gb3V0LiAgKi8KLQkgICAgICBoLT5pbmR4ID0gLTI7Ci0JICAgICAgKnJlbF9oYXNoX3B0ciA9IGg7Ci0JICAgICAgaXJlbC0+cl9zeW1uZHggPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBJcyB0aGlzIGFsd2F5cyByaWdodD8gICovCi0gIGlyZWwtPnJfdHlwZSA9IGhvd3RvLT50eXBlOwotCi0gIC8qIHJfc2l6ZSBpcyBvbmx5IHVzZWQgb24gdGhlIFJTLzYwMDAsIHdoaWNoIG5lZWRzIGl0cyBvd24gbGlua2VyCi0gICAgIHJvdXRpbmVzIGFueWhvdy4gIHJfZXh0ZXJuIGlzIG9ubHkgdXNlZCBmb3IgRUNPRkYuICAqLwotCi0gIC8qIEZJWE1FOiBXaGF0IGlzIHRoZSByaWdodCB2YWx1ZSBmb3Igcl9vZmZzZXQ/ICBJcyB6ZXJvIE9LPyAgKi8KLQotICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQSBiYXNpYyByZWxvYyBoYW5kbGluZyByb3V0aW5lIHdoaWNoIG1heSBiZSB1c2VkIGJ5IHByb2Nlc3NvcnMgd2l0aAotICAgc2ltcGxlIHJlbG9jcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCQkgICAgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQotICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAotICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKLSAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLwotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmYWRkZW5kKTsKLSAgICAgIGlmIChob3d0byA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSWYgd2UgYXJlIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZW4gd2UgY2FuIGp1c3QgaWdub3JlCi0gICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIHRoYXQgaXMgcGNyZWxfb2Zmc2V0LiAgSXQgd2lsbCBhbHJlYWR5Ci0gICAgICAgICBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlLiAgSWYgdGhpcyBpcyBub3QgYSByZWxvY2F0ZWFibGUgbGluaywKLSAgICAgICAgIHRoZW4gd2Ugc2hvdWxkIGlnbm9yZSB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnBjcmVsX29mZnNldCkKLQl7Ci0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkgICAgYWRkZW5kICs9IHN5bS0+bl92YWx1ZTsKLQl9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUpOwotCSAgICAgIGlmICghIG9ial9wZSAoaW5wdXRfYmZkKSkKLQkJdmFsIC09IHNlYy0+dm1hOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0JewotCSAgLyogRW1pdCBhIHJlbG9jIGlmIHRoZSBiYWNrZW5kIHRoaW5rcyBpdCBuZWVkcyBpdC4gKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YSAob3V0cHV0X2JmZCktPmluX3JlbG9jX3AgKG91dHB1dF9iZmQsIGhvd3RvKSkKLQkgICAgewotCSAgICAgIC8qIFJlbG9jYXRpb24gdG8gYSBzeW1ib2wgaW4gYSBzZWN0aW9uIHdoaWNoIGlzbid0Ci0JCSBhYnNvbHV0ZS4gIFdlIG91dHB1dCB0aGUgYWRkcmVzcyBoZXJlIHRvIGEgZmlsZS4KLQkJIFRoaXMgZmlsZSBpcyB0aGVuIHJlYWQgYnkgZGxsdG9vbCB3aGVuIGdlbmVyYXRpbmcgdGhlCi0JCSByZWxvYyBzZWN0aW9uLiAgTm90ZSB0aGF0IHRoZSBiYXNlIGZpbGUgaXMgbm90Ci0JCSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuICBXZSB3cml0ZSBvdXQgYSBsb25nIGhlcmUsCi0JCSBhbmQgZGxsdG9vbCByZWFkcyBpbiBhIGxvbmcuICAqLwotCSAgICAgIGxvbmcgYWRkciA9IChyZWwtPnJfdmFkZHIgCi0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSAKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgaWYgKGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnBlKQotCQlhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JICAgICAgaWYgKGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAobG9uZyksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSkKLQkJICAhPSBzaXplb2YgKGxvbmcpKQotCQl7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLSAgCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsCi0JCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJdmFsLCBhZGRlbmQpOwotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKLQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCmRpZmYgLS1naXQgYS9iZmQvY29mZnN3YXAuaCBiL2JmZC9jb2Zmc3dhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmMxODBmLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2Zmc3dhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTE3ICswLDAgQEAKLS8qIEdlbmVyaWMgQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdXNlZCB0byBzd2FwIENPRkYgZGF0YS4gIEl0IGlzIGEgaGVhZGVyCi0gICBmaWxlIGJlY2F1c2UgdGhlIGRldGFpbHMgb2Ygc3dhcHBpbmcgZGVwZW5kIG9uIHRoZSBkZXRhaWxzIG9mIHRoZQotICAgc3RydWN0dXJlcyB1c2VkIGJ5IGVhY2ggQ09GRiBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMgaW5jbHVkZWQgYnkKLSAgIGNvZmZjb2RlLmgsIGFzIHdlbGwgYXMgYnkgdGhlIEVDT0ZGIGJhY2tlbmQuCi0KLSAgIEFueSBmaWxlIHdoaWNoIHVzZXMgdGhpcyBtdXN0IGZpcnN0IGluY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIgYW5kCi0gICAiY29mZi9DUFUuaCIuICBUaGUgZnVuY3Rpb25zIHdpbGwgdGhlbiBiZSBjb3JyZWN0IGZvciB0aGF0IENQVS4gICovCi0KLSNpZm5kZWYgSU1BR0VfQkFTRQotI2RlZmluZSBJTUFHRV9CQVNFIDAKLSNlbmRpZgotCi0jZGVmaW5lIFBVVFdPUkQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFBVVEhBTEYgYmZkX2hfcHV0XzE2Ci0jZGVmaW5lCVBVVEJZVEUgYmZkX2hfcHV0XzgKLQotI2lmbmRlZiBHRVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgR0VUX0ZDTl9MTk5PUFRSKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLQotI2lmbmRlZiBHRVRfRkNOX0VORE5EWAotI2RlZmluZSBHRVRfRkNOX0VORE5EWChhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLQotI2lmbmRlZiBQVVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBQVVRXT1JEKGFiZmQsICBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9GQ05fRU5ETkRYCi0jZGVmaW5lIFBVVF9GQ05fRU5ETkRYKGFiZmQsIGluLCBleHQpIFBVVFdPUkQoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MTlNaX0xOTk8KLSNkZWZpbmUgR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9TSVpFCi0jZGVmaW5lIEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfTE5OTwotI2RlZmluZSBQVVRfTE5TWl9MTk5PKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNlbmRpZgotI2lmbmRlZiBQVVRfTE5TWl9TSVpFCi0jZGVmaW5lIFBVVF9MTlNaX1NJWkUoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fU0NOTEVOCi0jZGVmaW5lIEdFVF9TQ05fU0NOTEVOKGFiZmQsICBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX05SRUxPQwotI2RlZmluZSBHRVRfU0NOX05SRUxPQyhhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX05MSU5OTwotI2RlZmluZSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpICBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25saW5ubykKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX1NDTkxFTgotI2RlZmluZSBQVVRfU0NOX1NDTkxFTihhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9OUkVMT0MKLSNkZWZpbmUgUFVUX1NDTl9OUkVMT0MoYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9OTElOTk8KLSNkZWZpbmUgUFVUX1NDTl9OTElOTk8oYWJmZCxpbiwgZXh0KSAgYmZkX2hfcHV0XzE2KGFiZmQsaW4sIChiZmRfYnl0ZSAgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNlbmRpZgotI2lmbmRlZiBHRVRfTElORU5PX0xOTk8KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNlbmRpZgotI2lmbmRlZiBQVVRfTElORU5PX0xOTk8KLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNlbmRpZgotCi0vKiBUaGUgZl9zeW1wdHIgZmllbGQgaW4gdGhlIGZpbGVoZHIgaXMgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgR0VUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9GSUxFSERSX1NZTVBUUgotI2RlZmluZSBQVVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotLyogU29tZSBmaWVsZHMgaW4gdGhlIGFvdXRoZHIgYXJlIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0FPVVRIRFJfVFNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVFNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfVFNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVFNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfRFNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRFNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfRFNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRFNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfQlNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfQlNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfQlNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfQlNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfRU5UUlkKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRU5UUlkgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfRU5UUlkKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRU5UUlkgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBzY25oZHIgYXJlIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX1NDTkhEUl9QQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1BBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9QQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1ZBRERSCi0jZGVmaW5lIEdFVF9TQ05IRFJfVkFERFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9WQUREUgotI2RlZmluZSBQVVRfU0NOSERSX1ZBRERSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfU0laRQotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TSVpFCi0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NDTlBUUgotI2RlZmluZSBHRVRfU0NOSERSX1NDTlBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1NDTlBUUgotI2RlZmluZSBQVVRfU0NOSERSX1NDTlBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1JFTFBUUgotI2RlZmluZSBHRVRfU0NOSERSX1JFTFBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1JFTFBUUgotI2RlZmluZSBQVVRfU0NOSERSX1JFTFBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfTE5OT1BUUgotI2RlZmluZSBQVVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTkhEUl9OUkVMT0MgYmZkX2hfZ2V0XzE2Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9OUkVMT0MKLSNkZWZpbmUgUFVUX1NDTkhEUl9OUkVMT0MgYmZkX2hfcHV0XzE2Ci0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9OTE5OTwotI2RlZmluZSBHRVRfU0NOSERSX05MTk5PIGJmZF9oX2dldF8xNgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfTkxOTk8KLSNkZWZpbmUgUFVUX1NDTkhEUl9OTE5OTyBiZmRfaF9wdXRfMTYKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX0ZMQUdTCi0jZGVmaW5lIEdFVF9TQ05IRFJfRkxBR1MgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9GTEFHUwotI2RlZmluZSBQVVRfU0NOSERSX0ZMQUdTIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQgY29mZl9zd2FwX2FvdXRoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9hb3V0aGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zY25oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9zY25oZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2ZpbGVoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9maWxlaGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNpZm5kZWYgTk9fQ09GRl9SRUxPQ1MKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNlbmRpZiAvKiBOT19DT0ZGX1JFTE9DUyAqLwotI2lmbmRlZiBOT19DT0ZGX1NZTUJPTFMKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9zeW1fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2F1eF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfYXV4X291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotI2VuZGlmIC8qIE5PX0NPRkZfU1lNQk9MUyAqLwotI2lmbmRlZiBOT19DT0ZGX0xJTkVOT1MKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9saW5lbm9faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9saW5lbm9fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2VuZGlmIC8qIE5PX0NPRkZfTElORU5PUyAqLwotCi0jaWZuZGVmIE5PX0NPRkZfUkVMT0NTCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIFJFTE9DICpyZWxvY19zcmMgPSAoUkVMT0MgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgZHN0OwotCi0gIHJlbG9jX2RzdC0+cl92YWRkciA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilyZWxvY19zcmMtPnJfdmFkZHIpOwotICByZWxvY19kc3QtPnJfc3ltbmR4ID0gYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3N5bW5keCk7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgcmVsb2NfZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfOChhYmZkLCByZWxvY19zcmMtPnJfdHlwZSk7Ci0gIHJlbG9jX2RzdC0+cl9zaXplID0gYmZkX2hfZ2V0XzgoYWJmZCwgcmVsb2Nfc3JjLT5yX3NpemUpOwotI2Vsc2UKLSAgcmVsb2NfZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl90eXBlKTsKLSNlbmRpZgotCi0jaWZkZWYgU1dBUF9JTl9SRUxPQ19PRkZTRVQKLSAgcmVsb2NfZHN0LT5yX29mZnNldCA9IFNXQVBfSU5fUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQkJCSAgICAgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9vZmZzZXQpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglzcmM7Ci0gICAgIFBUUglkc3Q7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2Nfc3JjID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKXNyYzsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpyZWxvY19kc3QgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopZHN0OwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3ZhZGRyLCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3ZhZGRyKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIHJlbG9jX3NyYy0+cl9zeW1uZHgsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfc3ltbmR4KTsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBiZmRfaF9wdXRfOCAoYWJmZCwgcmVsb2Nfc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdHlwZSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCByZWxvY19zcmMtPnJfc2l6ZSwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zaXplKTsKLSNlbHNlCi0gIGJmZF9oX3B1dF8xNihhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopCi0JICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLSNlbmRpZgotCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCi0gIFNXQVBfT1VUX1JFTE9DX09GRlNFVChhYmZkLAotCQkJcmVsb2Nfc3JjLT5yX29mZnNldCwKLQkJCShiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfb2Zmc2V0KTsKLSNlbmRpZgotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX0VYVFJBCi0gIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQscmVsb2Nfc3JjLCByZWxvY19kc3QpOwotI2VuZGlmCi0KLSAgcmV0dXJuIFJFTFNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9SRUxPQ1MgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIHNyYzsKLSAgICAgUFRSCSAgICAgZHN0OwotewotICBGSUxIRFIgKmZpbGVoZHJfc3JjID0gKEZJTEhEUiAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBkc3Q7Ci0jaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QUkUKLSAgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QUkUgKGFiZmQsIHNyYywgZHN0KTsKLSNlbmRpZgotICBmaWxlaGRyX2RzdC0+Zl9tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfbWFnaWMpOwotICBmaWxlaGRyX2RzdC0+Zl9uc2NucyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnNjbnMpOwotICBmaWxlaGRyX2RzdC0+Zl90aW1kYXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX3RpbWRhdCk7Ci0gIGZpbGVoZHJfZHN0LT5mX3N5bXB0ciA9Ci0gICAgR0VUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfc3ltcHRyKTsKLSAgZmlsZWhkcl9kc3QtPmZfbnN5bXMgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX25zeW1zKTsKLSAgZmlsZWhkcl9kc3QtPmZfb3B0aGRyID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9vcHRoZHIpOwotICBmaWxlaGRyX2RzdC0+Zl9mbGFncyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfZmxhZ3MpOwotI2lmZGVmIFRJQzgwX1RBUkdFVF9JRAotICBmaWxlaGRyX2RzdC0+Zl90YXJnZXRfaWQgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX3RhcmdldF9pZCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QgKGFiZmQsIHNyYywgZHN0KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2ZpbGVoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKilpbjsKLSAgRklMSERSICpmaWxlaGRyX291dCA9IChGSUxIRFIgKilvdXQ7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUKLSAgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX21hZ2ljKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbnNjbnMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc2Nucyk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX3RpbWRhdCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3RpbWRhdCk7Ci0gIFBVVF9GSUxFSERSX1NZTVBUUiAoYWJmZCwgKGJmZF92bWEpIGZpbGVoZHJfaW4tPmZfc3ltcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfc3ltcHRyKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfbnN5bXMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc3ltcyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX29wdGhkciwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX29wdGhkcik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX2ZsYWdzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfZmxhZ3MpOwotI2lmZGVmIFRJQzgwX1RBUkdFVF9JRAotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl90YXJnZXRfaWQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl90YXJnZXRfaWQpOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUCi0gIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIHJldHVybiBGSUxIU1o7Ci19Ci0KLQotI2lmbmRlZiBOT19DT0ZGX1NZTUJPTFMKLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBTWU1FTlQgKmV4dCA9IChTWU1FTlQgKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYoIGV4dC0+ZS5lX25hbWVbMF0gPT0gMCkgewotICAgIGluLT5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgaW4tPl9uLl9uX24uX25fb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX29mZnNldCk7Ci0gIH0KLSAgZWxzZSB7Ci0jaWYgU1lNTk1MRU4gIT0gRV9TWU1OTUxFTgotICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIFNZTU5NTEVOITsKLSNlbHNlCi0gICAgbWVtY3B5KGluLT5fbi5fbl9uYW1lLCBleHQtPmUuZV9uYW1lLCBTWU1OTUxFTik7Ci0jZW5kaWYKLSAgfQotICBpbi0+bl92YWx1ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsgCi0gIGluLT5uX3NjbnVtID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKXsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGluLT5uX3NjbGFzcyA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9zY2xhc3MpOwotICBpbi0+bl9udW1hdXggPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfbnVtYXV4KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIGlucCwgZXh0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJZXh0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWlucDsKLSAgU1lNRU5UICpleHQgPShTWU1FTlQgKilleHRwOwotICBpZihpbi0+X24uX25fbmFtZVswXSA9PSAwKSB7Ci0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX3plcm9lcyk7Ci0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT5fbi5fbl9uLl9uX29mZnNldCwgKGJmZF9ieXRlICopICBleHQtPmUuZS5lX29mZnNldCk7Ci0gIH0KLSAgZWxzZSB7Ci0jaWYgU1lNTk1MRU4gIT0gRV9TWU1OTUxFTgotICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBTWU1OTUxFTiE7Ci0jZWxzZQotICAgIG1lbWNweShleHQtPmUuZV9uYW1lLCBpbi0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotI2VuZGlmCi0gIH0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl92YWx1ZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3NjbnVtICwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpCi0gICAgICB7Ci0JYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICAgIH0KLSAgZWxzZQotICAgICAgewotCWJmZF9oX3B1dF8zMihhYmZkLCAgaW4tPm5fdHlwZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gICAgICB9Ci0gIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9zY2xhc3MgLCBleHQtPmVfc2NsYXNzKTsKLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX251bWF1eCAsIGV4dC0+ZV9udW1hdXgpOwotICByZXR1cm4gU1lNRVNaOwotfQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIAkgICAgICBleHQxOwotICAgICBpbnQgICAgICAgICAgICAgdHlwZTsKLSAgICAgaW50ICAgICAgICAgICAgIGNsYXNzOwotICAgICBpbnQJICAgICAgaW5keDsKLSAgICAgaW50CSAgICAgIG51bWF1eDsKLSAgICAgUFRSIAkgICAgICBpbjE7Ci17Ci0gIEFVWEVOVCAgICAqZXh0ID0gKEFVWEVOVCAqKWV4dDE7Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW4xOwotCi0jaWZkZWYgQ09GRl9BREpVU1RfQVVYX0lOX1BSRQotICBDT0ZGX0FESlVTVF9BVVhfSU5fUFJFIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpOwotI2VuZGlmCi0gIHN3aXRjaCAoY2xhc3MpIHsKLSAgICBjYXNlIENfRklMRToKLSAgICAgIGlmIChleHQtPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLQkgIGluLT54X2ZpbGUueF9uLnhfemVyb2VzID0gMDsKLQkgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gCi0JICAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotCX0gZWxzZSB7Ci0jaWYgRklMTk1MRU4gIT0gRV9GSUxOTUxFTgotCSAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRklMTk1MRU4hOwotI2Vsc2UKLQkgICAgaWYgKG51bWF1eCA+IDEpCi0JICAgICAgewotCQlpZiAoaW5keCA9PSAwKQotCQkgIG1lbWNweSAoaW4tPnhfZmlsZS54X2ZuYW1lLCBleHQtPnhfZmlsZS54X2ZuYW1lLAotCQkJICBudW1hdXggKiBzaXplb2YgKEFVWEVOVCkpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsIEZJTE5NTEVOKTsKLQkgICAgICB9Ci0jZW5kaWYKLQkgIH0KLSAgICAgIGdvdG8gZW5kOwotCi0gICAgICAvKiBSUy82MDAwICJjc2VjdCIgYXV4ZW50cyAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgIGNhc2UgQ19FWFQ6Ci0gICAgY2FzZSBDX0hJREVYVDoKLSAgICAgIGlmIChpbmR4ICsgMSA9PSBudW1hdXgpCi0JewotCSAgaW4tPnhfY3NlY3QueF9zY25sZW4ubCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc2NubGVuKTsKLQkgIGluLT54X2NzZWN0LnhfcGFybWhhc2ggPSBiZmRfaF9nZXRfMzIgKGFiZmQsCi0JCQkJCQkgZXh0LT54X2NzZWN0LnhfcGFybWhhc2gpOwotCSAgaW4tPnhfY3NlY3QueF9zbmhhc2ggICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc25oYXNoKTsKLQkgIC8qIFdlIGRvbid0IGhhdmUgdG8gaGFjayBiaXRmaWVsZHMgaW4geF9zbXR5cCBiZWNhdXNlIGl0J3MKLQkgICAgIGRlZmluZWQgYnkgc2hpZnRzLWFuZC1hbmRzLCB3aGljaCBhcmUgZXF1aXZhbGVudCBvbiBhbGwKLQkgICAgIGJ5dGUgb3JkZXJzLiAgKi8KLQkgIGluLT54X2NzZWN0Lnhfc210eXAgICAgPSBiZmRfaF9nZXRfOCAgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3NtdHlwKTsKLQkgIGluLT54X2NzZWN0Lnhfc21jbGFzICAgPSBiZmRfaF9nZXRfOCAgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3NtY2xhcyk7Ci0JICBpbi0+eF9jc2VjdC54X3N0YWIgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPnhfY3NlY3QueF9zdGFiKTsKLQkgIGluLT54X2NzZWN0Lnhfc25zdGFiICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3Nuc3RhYik7Ci0JICBnb3RvIGVuZDsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBDX1NUQVQ6Ci0jaWZkZWYgQ19MRUFGU1RBVAotICAgIGNhc2UgQ19MRUFGU1RBVDoKLSNlbmRpZgotICAgIGNhc2UgQ19ISURERU46Ci0gICAgICBpZiAodHlwZSA9PSBUX05VTEwpIHsKLQkgIGluLT54X3Njbi54X3NjbmxlbiA9IEdFVF9TQ05fU0NOTEVOKGFiZmQsIGV4dCk7Ci0JICBpbi0+eF9zY24ueF9ucmVsb2MgPSBHRVRfU0NOX05SRUxPQyhhYmZkLCBleHQpOwotCSAgaW4tPnhfc2NuLnhfbmxpbm5vID0gR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KTsKLQotCSAgLyogUEUgZGVmaW5lcyBzb21lIGV4dHJhIGZpZWxkczsgd2UgemVybyB0aGVtIG91dCBmb3IKLSAgICAgICAgICAgICBzYWZldHkuICAqLwotCSAgaW4tPnhfc2NuLnhfY2hlY2tzdW0gPSAwOwotCSAgaW4tPnhfc2NuLnhfYXNzb2NpYXRlZCA9IDA7Ci0JICBpbi0+eF9zY24ueF9jb21kYXQgPSAwOwotCi0JICBnb3RvIGVuZDsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaW4tPnhfc3ltLnhfdGFnbmR4LmwgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90YWduZHgpOwotI2lmbmRlZiBOT19UVk5EWAotICBpbi0+eF9zeW0ueF90dm5keCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3R2bmR4KTsKLSNlbmRpZgotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSBHRVRfRkNOX0xOTk9QVFIgKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA9IEdFVF9GQ05fRU5ETkRYIChhYmZkLCBleHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBESU1OVU0gIT0gRV9ESU1OVU0KLSAjZXJyb3Igd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRElNTlVNCi0jZW5kaWYKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04odHlwZSkpIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfZnNpemUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfZnNpemUpOwotICB9Ci0gIGVsc2UgewotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubyA9IEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KTsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUgPSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCk7Ci0gIH0KLQotZW5kOiA7Ci0gIC8qIHRoZSBzZW1pY29sb24gaXMgYmVjYXVzZSBNU1ZDIGRvZXNuJ3QgbGlrZSBsYWJlbHMgYXQKLSAgICAgZW5kIG9mIGJsb2NrLiAqLwotCi0jaWZkZWYgQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QKLSAgQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QgKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2F1eF9vdXQgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCkKLSAgICAgYmZkICAgKmFiZmQ7Ci0gICAgIFBUUiAJaW5wOwotICAgICBpbnQgICB0eXBlOwotICAgICBpbnQgICBjbGFzczsKLSAgICAgaW50ICAgaW5keDsKLSAgICAgaW50ICAgbnVtYXV4OwotICAgICBQVFIJZXh0cDsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbnA7Ci0gIEFVWEVOVCAqZXh0ID0gKEFVWEVOVCAqKWV4dHA7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRSAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKTsKLSNlbmRpZgotICBtZW1zZXQoKFBUUilleHQsIDAsIEFVWEVTWik7Ci0gIHN3aXRjaCAoY2xhc3MpIHsKLSAgY2FzZSBDX0ZJTEU6Ci0gICAgaWYgKGluLT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0gICAgICBQVVRXT1JEKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF96ZXJvZXMpOwotICAgICAgUFVUV09SRChhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0gICAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRklMTk1MRU4hOwotI2Vsc2UKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZ290byBlbmQ7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogUlMvNjAwMCAiY3NlY3QiIGF1eGVudHMgKi8KLSAgY2FzZSBDX0VYVDoKLSAgY2FzZSBDX0hJREVYVDoKLSAgICBpZiAoaW5keCArIDEgPT0gbnVtYXV4KQotICAgICAgewotCVBVVFdPUkQgKGFiZmQsIGluLT54X2NzZWN0Lnhfc2NubGVuLmwsCWV4dC0+eF9jc2VjdC54X3Njbmxlbik7Ci0JUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9wYXJtaGFzaCwJZXh0LT54X2NzZWN0LnhfcGFybWhhc2gpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25oYXNoLAlleHQtPnhfY3NlY3QueF9zbmhhc2gpOwotCS8qIFdlIGRvbid0IGhhdmUgdG8gaGFjayBiaXRmaWVsZHMgaW4geF9zbXR5cCBiZWNhdXNlIGl0J3MKLQkgICBkZWZpbmVkIGJ5IHNoaWZ0cy1hbmQtYW5kcywgd2hpY2ggYXJlIGVxdWl2YWxlbnQgb24gYWxsCi0JICAgYnl0ZSBvcmRlcnMuICAqLwotCVBVVEJZVEUgKGFiZmQsIGluLT54X2NzZWN0Lnhfc210eXAsCWV4dC0+eF9jc2VjdC54X3NtdHlwKTsKLQlQVVRCWVRFIChhYmZkLCBpbi0+eF9jc2VjdC54X3NtY2xhcywJZXh0LT54X2NzZWN0Lnhfc21jbGFzKTsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3N0YWIsCWV4dC0+eF9jc2VjdC54X3N0YWIpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25zdGFiLAlleHQtPnhfY3NlY3QueF9zbnN0YWIpOwotCWdvdG8gZW5kOwotICAgICAgfQotICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgY2FzZSBDX1NUQVQ6Ci0jaWZkZWYgQ19MRUFGU1RBVAotICBjYXNlIENfTEVBRlNUQVQ6Ci0jZW5kaWYKLSAgY2FzZSBDX0hJRERFTjoKLSAgICBpZiAodHlwZSA9PSBUX05VTEwpIHsKLSAgICAgIFBVVF9TQ05fU0NOTEVOKGFiZmQsIGluLT54X3Njbi54X3NjbmxlbiwgZXh0KTsKLSAgICAgIFBVVF9TQ05fTlJFTE9DKGFiZmQsIGluLT54X3Njbi54X25yZWxvYywgZXh0KTsKLSAgICAgIFBVVF9TQ05fTkxJTk5PKGFiZmQsIGluLT54X3Njbi54X25saW5ubywgZXh0KTsKLSAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIFBVVFdPUkQoYWJmZCwgaW4tPnhfc3ltLnhfdGFnbmR4LmwsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X3R2bmR4ICwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIGV4dCk7Ci0gICAgICBQVVRfRkNOX0VORE5EWChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04gKHR5cGUpKQotICAgIFBVVFdPUkQgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSwKLQkgICAgIChiZmRfYnl0ZSAqKSAgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQVVRfTE5TWl9MTk5PIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8sIGV4dCk7Ci0gICAgICBQVVRfTE5TWl9TSVpFIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsIGV4dCk7Ci0gICAgfQotCi1lbmQ6Ci0jaWZkZWYgQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUCi0gIENPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKTsKLSNlbmRpZgotICByZXR1cm4gQVVYRVNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9TWU1CT0xTICovCi0KLSNpZm5kZWYgTk9fQ09GRl9MSU5FTk9TCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgTElORU5PICpleHQgPSAoTElORU5PICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW4xOwotCi0gIGluLT5sX2FkZHIubF9zeW1uZHggPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLSAgaW4tPmxfbG5ubyA9IEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgaW5wLCBvdXRwKQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbnA7Ci0gICAgIFBUUglvdXRwOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW5wOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpleHQgPSAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKW91dHA7Ci0gIFBVVFdPUkQoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopCi0JICBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0KLSAgUFVUX0xJTkVOT19MTk5PIChhYmZkLCBpbi0+bF9sbm5vLCBleHQpOwotICByZXR1cm4gTElORVNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9MSU5FTk9TICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgYW91dGhkcl9leHQxLCBhb3V0aGRyX2ludDEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgYW91dGhkcl9leHQxOwotICAgICBQVFIgYW91dGhkcl9pbnQxOwotewotICBBT1VUSERSICAgICAgICAqYW91dGhkcl9leHQgPSAoQU9VVEhEUiAqKSBhb3V0aGRyX2V4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICphb3V0aGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHJfaW50MTsKLQotICBhb3V0aGRyX2ludC0+bWFnaWMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5tYWdpYyk7Ci0gIGFvdXRoZHJfaW50LT52c3RhbXAgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52c3RhbXApOwotICBhb3V0aGRyX2ludC0+dHNpemUgPQotICAgIEdFVF9BT1VUSERSX1RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kc2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5ic2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+YnNpemUpOwotICBhb3V0aGRyX2ludC0+ZW50cnkgPQotICAgIEdFVF9BT1VUSERSX0VOVFJZIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgPQotICAgIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dGV4dF9zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRhdGFfc3RhcnQpOwotCi0jaWZkZWYgSTk2MAotICBhb3V0aGRyX2ludC0+dGFnZW50cmllcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRhZ2VudHJpZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBBUE9MTE9fTTY4Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+b19pbmxpYiwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5vX2lubGliKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT5vX3NyaSwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5vX3NyaSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+dmlkWzBdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZpZCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+dmlkWzFdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZpZCArIDQpOwotI2VuZGlmCi0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBhb3V0aGRyX2ludC0+b190b2MgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fdG9jKTsKLSAgYW91dGhkcl9pbnQtPm9fc25lbnRyeSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPm9fc250ZXh0ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NudGV4dCk7Ci0gIGFvdXRoZHJfaW50LT5vX3NuZGF0YSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmRhdGEpOwotICBhb3V0aGRyX2ludC0+b19zbnRvYyA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbnRvYyk7Ci0gIGFvdXRoZHJfaW50LT5vX3NubG9hZGVyID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NubG9hZGVyKTsKLSAgYW91dGhkcl9pbnQtPm9fc25ic3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25ic3MpOwotICBhb3V0aGRyX2ludC0+b19hbGdudGV4dCA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19hbGdudGV4dCk7Ci0gIGFvdXRoZHJfaW50LT5vX2FsZ25kYXRhID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX2FsZ25kYXRhKTsKLSAgYW91dGhkcl9pbnQtPm9fbW9kdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19tb2R0eXBlKTsKLSAgYW91dGhkcl9pbnQtPm9fY3B1dHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19jcHV0eXBlKTsKLSAgYW91dGhkcl9pbnQtPm9fbWF4c3RhY2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fbWF4c3RhY2spOwotICBhb3V0aGRyX2ludC0+b19tYXhkYXRhID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5vX21heGRhdGEpOwotI2VuZGlmCi0KLSNpZmRlZiBNSVBTRUNPRkYKLSAgYW91dGhkcl9pbnQtPmJzc19zdGFydCA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+YnNzX3N0YXJ0KTsKLSAgYW91dGhkcl9pbnQtPmdwX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncF92YWx1ZSk7Ci0gIGFvdXRoZHJfaW50LT5ncHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncHJtYXNrKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbMF0pOwotICBhb3V0aGRyX2ludC0+Y3BybWFza1sxXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1sxXSk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzJdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzJdKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbM10pOwotI2VuZGlmCi0KLSNpZmRlZiBBTFBIQUVDT0ZGCi0gIGFvdXRoZHJfaW50LT5ic3Nfc3RhcnQgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPmJzc19zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5ncF92YWx1ZSA9IGJmZF9oX2dldF82NChhYmZkLCBhb3V0aGRyX2V4dC0+Z3BfdmFsdWUpOwotICBhb3V0aGRyX2ludC0+Z3BybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BybWFzayk7Ci0gIGFvdXRoZHJfaW50LT5mcHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5mcHJtYXNrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWluOwotICBBT1VUSERSICphb3V0aGRyX291dCA9IChBT1VUSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT5tYWdpYywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT52c3RhbXAsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dnN0YW1wKTsKLSAgUFVUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPnRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnRzaXplKTsKLSAgUFVUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmRzaXplKTsKLSAgUFVUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmJzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzaXplKTsKLSAgUFVUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIGFvdXRoZHJfaW4tPmVudHJ5LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmVudHJ5KTsKLSAgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+dGV4dF9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT50ZXh0X3N0YXJ0KTsKLSAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5kYXRhX3N0YXJ0KTsKLQotI2lmZGVmIEk5NjAKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPnRhZ2VudHJpZXMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dGFnZW50cmllcyk7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fdG9jLCBhb3V0aGRyX291dC0+b190b2MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25lbnRyeSwgYW91dGhkcl9vdXQtPm9fc25lbnRyeSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbnRleHQsIGFvdXRoZHJfb3V0LT5vX3NudGV4dCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmRhdGEsIGFvdXRoZHJfb3V0LT5vX3NuZGF0YSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbnRvYywgYW91dGhkcl9vdXQtPm9fc250b2MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25sb2FkZXIsIGFvdXRoZHJfb3V0LT5vX3NubG9hZGVyKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NuYnNzLCBhb3V0aGRyX291dC0+b19zbmJzcyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19hbGdudGV4dCwgYW91dGhkcl9vdXQtPm9fYWxnbnRleHQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fYWxnbmRhdGEsIGFvdXRoZHJfb3V0LT5vX2FsZ25kYXRhKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX21vZHR5cGUsIGFvdXRoZHJfb3V0LT5vX21vZHR5cGUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fY3B1dHlwZSwgYW91dGhkcl9vdXQtPm9fY3B1dHlwZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYW91dGhkcl9pbi0+b19tYXhzdGFjaywgYW91dGhkcl9vdXQtPm9fbWF4c3RhY2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbWF4ZGF0YSwgYW91dGhkcl9vdXQtPm9fbWF4ZGF0YSk7Ci0gIG1lbXNldCAoYW91dGhkcl9vdXQtPm9fcmVzdjIsIDAsIHNpemVvZiBhb3V0aGRyX291dC0+b19yZXN2Mik7Ci0jZW5kaWYKLQotI2lmZGVmIE1JUFNFQ09GRgotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+YnNzX3N0YXJ0LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzc19zdGFydCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncF92YWx1ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncHJtYXNrLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwcm1hc2spOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1swXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbMV0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzJdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1szXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzNdKTsKLSNlbmRpZgotCi0jaWZkZWYgQUxQSEFFQ09GRgotICAvKiBGSVhNRTogV2hhdCBkb2VzIGJsZHJldiBtZWFuPyAgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIChiZmRfdm1hKSAyLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJsZHJldik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAoYmZkX3ZtYSkgMCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5wYWRkaW5nKTsKLSAgYmZkX2hfcHV0XzY0KGFiZmQsIGFvdXRoZHJfaW4tPmJzc19zdGFydCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic3Nfc3RhcnQpOwotICBiZmRfaF9wdXRfNjQoYWJmZCwgYW91dGhkcl9pbi0+Z3BfdmFsdWUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BybWFzaywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmZwcm1hc2ssIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZnBybWFzayk7Ci0jZW5kaWYKLQotICByZXR1cm4gQU9VVFNaOwotfQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIGV4dDsKLSAgICAgUFRSCSAgICAgaW47Ci17Ci0gIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKikgZXh0OwotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFCi0gIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUgKGFiZmQsIGV4dCwgaW4pOwotI2VuZGlmCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0gIHNjbmhkcl9pbnQtPnNfc2NucHRyID0KLSAgICBHRVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgc2NuaGRyX2ludC0+c19yZWxwdHIgPQotICAgIEdFVF9TQ05IRFJfUkVMUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOwotICBzY25oZHJfaW50LT5zX2xubm9wdHIgPQotICAgIEdFVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7Ci0gIHNjbmhkcl9pbnQtPnNfZmxhZ3MgPQotICAgIEdFVF9TQ05IRFJfRkxBR1MgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPQotICAgIEdFVF9TQ05IRFJfTlJFTE9DIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0KLSAgICBHRVRfU0NOSERSX05MTk5PIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0jaWZkZWYgSTk2MAotICBzY25oZHJfaW50LT5zX2FsaWduID0KLSAgICBHRVRfU0NOSERSX0FMSUdOIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19hbGlnbik7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCAoYWJmZCwgZXh0LCBpbik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKilpbjsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKW91dDsKLSAgdW5zaWduZWQgaW50IHJldCA9IFNDTkhTWjsKLQotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFCi0gIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICBtZW1jcHkoc2NuaGRyX2V4dC0+c19uYW1lLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKLQotICBQVVRfU0NOSERSX1ZBRERSIChhYmZkLCBzY25oZHJfaW50LT5zX3ZhZGRyLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfdmFkZHIpOwotCi0KLSAgUFVUX1NDTkhEUl9QQUREUiAoYWJmZCwgc2NuaGRyX2ludC0+c19wYWRkciwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgUFVUX1NDTkhEUl9TSVpFIChhYmZkLCBzY25oZHJfaW50LT5zX3NpemUsCi0JCSAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0gIFBVVF9TQ05IRFJfU0NOUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX3NjbnB0ciwKLQkJICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zY25wdHIpOwotICBQVVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19yZWxwdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgUFVUX1NDTkhEUl9MTk5PUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX2xubm9wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBQVVRfU0NOSERSX0ZMQUdTIChhYmZkLCBzY25oZHJfaW50LT5zX2ZsYWdzLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfZmxhZ3MpOwotI2lmIGRlZmluZWQoTTg4KQotICBQVVRXT1JEKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgUFVUV09SRChhYmZkLCBzY25oZHJfaW50LT5zX25yZWxvYywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSNlbHNlCi0gIGlmIChzY25oZHJfaW50LT5zX25sbm5vIDw9IDB4ZmZmZikKLSAgICBQVVRIQUxGKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSArIDFdOwotCi0gICAgICBtZW1jcHkgKGJ1Ziwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICAgICAgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKV0gPSAnXDAnOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSBidWYsIHNjbmhkcl9pbnQtPnNfbmxubm8pOwotICAgICAgUFVUSEFMRiAoYWJmZCwgMHhmZmZmLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gICAgfQotICBpZiAoc2NuaGRyX2ludC0+c19ucmVsb2MgPD0gMHhmZmZmKQotICAgIFBVVEhBTEYoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkgKyAxXTsKLQotICAgICAgbWVtY3B5IChidWYsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpKTsKLSAgICAgIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSldID0gJ1wwJzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgIGJ1Ziwgc2NuaGRyX2ludC0+c19ucmVsb2MpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIFBVVEhBTEYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgICAgIHJldCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBJOTYwCi0gIFBVVF9TQ05IRFJfQUxJR04gKGFiZmQsIHNjbmhkcl9pbnQtPnNfYWxpZ24sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2FsaWduKTsKLSNlbmRpZgotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9iZmQvY29uZmlnLmJmZCBiL2JmZC9jb25maWcuYmZkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODUxNDJjLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWcuYmZkCisrKyAvZGV2L251bGwKQEAgLTEsNzQxICswLDAgQEAKLSMgY29uZmlnLmJmZAotIyBDb252ZXJ0IGEgY2Fub25pY2FsIGhvc3QgdHlwZSBpbnRvIGEgQkZEIGhvc3QgdHlwZS4KLSMgU2V0IHNoZWxsIHZhcmlhYmxlIHRhcmcgdG8gY2Fub25pY2FsIHRhcmdldCBuYW1lLCBhbmQgcnVuCi0jIHVzaW5nIGBgLiBjb25maWcuYmZkJycuCi0jIFNldHMgdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICB0YXJnX2RlZnZlYwkJRGVmYXVsdCB2ZWN0b3IgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX3NlbHZlY3MJCVZlY3RvcnMgdG8gYnVpbGQgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX2FyY2hzCQlBcmNoaXRlY3R1cmVzIGZvciB0aGlzIHRhcmdldAotIyAgdGFyZ19jZmxhZ3MJCSQoQ0ZMQUdTKSBmb3IgdGhpcyB0YXJnZXQgKEZJWE1FOiBwcmV0dHkgYm9ndXMpCi0jICB0YXJnX3VuZGVyc2NvcmUJV2hldGhlciB1bmRlcnNjb3JlcyBhcmUgdXNlZDogeWVzIG9yIG5vCi0KLSMgUGFydCBvZiB0aGlzIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRhcmdtYXRjaC5zZWQgdG8gZ2VuZXJhdGUgdGhlCi0jIHRhcmdtYXRjaC5oIGZpbGUuICBUaGUgI2lmZGVmIGFuZCAjZW5kaWYgbGluZXMgdGhhdCBhcHBlYXIgYmVsb3cgYXJlCi0jIGNvcGllZCBkaXJlY3RseSBpbnRvIHRhcmdtYXRjaC5oLgotCi0jIFRoZSBiaW51dGlscyBjKytmaWx0IHByb2dyYW0gd2FudHMgdG8ga25vdyB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZQotIyBzdHJpcHBlZCBvciBub3QuICBUaGF0IGlzIHdoeSB3ZSBzZXQgdGFyZ191bmRlcnNjb3JlLiAgYysrZmlsdCB1c2VzCi0jIHRoaXMgaW5mb3JtYXRpb24gdG8gY2hvb3NlIGEgZGVmYXVsdC4gIFRoaXMgaW5mb3JtYXRpb24gaXMKLSMgZHVwbGljYXRlZCBpbiB0aGUgc3ltYm9sX2xlYWRpbmdfY2hhciBmaWVsZCBvZiB0aGUgQkZEIHRhcmdldAotIyB2ZWN0b3IsIGJ1dCBjKytmaWx0IGRvZXMgbm90IGRlYWwgd2l0aCBvYmplY3QgZmlsZXMgYW5kIGlzIG5vdAotIyBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuYS4gIEl0IGlzIG5vdCB0ZXJyaWJseSBpbXBvcnRhbnQgdGhhdCBjKytmaWx0Ci0jIGdldCB0aGlzIHJpZ2h0OyBpdCBpcyBqdXN0IGNvbnZlbmllbnQuCi0KLXRhcmdfZGVmdmVjPQotdGFyZ19zZWx2ZWNzPQotdGFyZ19jZmxhZ3M9Ci10YXJnX3VuZGVyc2NvcmU9bm8KLQotdGFyZ19jcHU9YGVjaG8gJHRhcmcgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotY2FzZSAiJHt0YXJnX2NwdX0iIGluCi1hbHBoYSopIHRhcmdfYXJjaHM9YmZkX2FscGhhX2FyY2ggOzsKLWFybSopCXRhcmdfYXJjaHM9YmZkX2FybV9hcmNoIDs7Ci1zdHJvbmdhcm0qKSB0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwotdGh1bWIqKQl0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwotYzMwKikJdGFyZ19hcmNocz1iZmRfdGljMzBfYXJjaCA7OwotaHBwYSopCXRhcmdfYXJjaHM9YmZkX2hwcGFfYXJjaCA7OwotaVszNDU2XTg2KSB0YXJnX2FyY2hzPWJmZF9pMzg2X2FyY2ggOzsKLW02OCopCXRhcmdfYXJjaHM9YmZkX202OGtfYXJjaCA7OwotbTg4KikJdGFyZ19hcmNocz1iZmRfbTg4a19hcmNoIDs7Ci1taXBzKikJdGFyZ19hcmNocz1iZmRfbWlwc19hcmNoIDs7Ci1wb3dlcnBjKikgdGFyZ19hcmNocz0iYmZkX3JzNjAwMF9hcmNoIGJmZF9wb3dlcnBjX2FyY2giIDs7Ci1yczYwMDApCXRhcmdfYXJjaHM9ImJmZF9yczYwMDBfYXJjaCBiZmRfcG93ZXJwY19hcmNoIiA7Owotc3BhcmMqKSB0YXJnX2FyY2hzPWJmZF9zcGFyY19hcmNoIDs7Ci12ODUwKikJdGFyZ19hcmNocz1iZmRfdjg1MF9hcmNoIDs7Ci16OGsqKQl0YXJnX2FyY2hzPWJmZF96OGtfYXJjaCA7OwotKikJdGFyZ19hcmNocz1iZmRfJHt0YXJnX2NwdX1fYXJjaCA7OwotZXNhYwotCi0KLSMgV0hFTiBBRERJTkcgRU5UUklFUyBUTyBUSElTIE1BVFJJWDoKLSMgIE1ha2Ugc3VyZSB0aGF0IHRoZSBsZWZ0IHNpZGUgYWx3YXlzIGhhcyB0d28gZGFzaGVzLiAgT3RoZXJ3aXNlIHlvdQotIyAgY2FuIGdldCBzcHVyaW91cyBtYXRjaGVzLiAgRXZlbiBmb3IgdW5hbWJpZ3VvdXMgY2FzZXMsIGRvIHRoaXMgYXMgYQotIyAgY29udmVudGlvbiwgZWxzZSB0aGUgdGFibGUgYmVjb21lcyBhIHJlYWwgbWVzcyB0byB1bmRlcnN0YW5kIGFuZCBtYWludGFpbi4KLQotY2FzZSAiJHt0YXJnfSIgaW4KLSMgU1RBUlQgT0YgdGFyZ21hdGNoLmgKLSNpZmRlZiBCRkQ2NAotICBhbHBoYSotKi1uZXRic2QqIHwgYWxwaGEqLSotZnJlZWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X2FscGhhX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICA7OwotICBhbHBoYSotKi1uZXR3YXJlKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9bmxtMzJfYWxwaGFfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotbGludXhlY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGY2NF9hbHBoYV92ZWMKLSAgICA7OwotICBhbHBoYSotKi1saW51eC1nbnUqIHwgYWxwaGEqLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfYWxwaGFfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLSp2bXMqKQotICAgIHRhcmdfZGVmdmVjPXZtc19hbHBoYV92ZWMKLSAgICA7OwotICBhbHBoYSotKi0qKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIDs7Ci0jZW5kaWYgLyogQkZENjQgKi8KLQotICBhcmMtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcmNfdmVjCi0gICAgOzsKLQotICBhcm0tKi1yaXNjaXgqKQotICAgIHRhcmdfZGVmdmVjPXJpc2NpeF92ZWMKLSAgICA7OwotICBhcm0tZXBvYy1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZV9iaWdfdmVjIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjIGFybV9lcG9jX3BlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT1ubwotICAgIDs7Ci0gIGFybS0qLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1wZV9saXR0bGVfdmVjIGFybXBlX2JpZ192ZWMgYXJtcGVpX2xpdHRsZV92ZWMgYXJtcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGFybS0qLWFvdXQgfCBhcm1lbC0qLWFvdXQpCQotICAgIHRhcmdfZGVmdmVjPWFvdXRfYXJtX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YW91dF9hcm1fYmlnX3ZlYwotICAgIDs7Ci0gIGFybWViLSotYW91dCkKLSAgICB0YXJnX2RlZnZlYz1hb3V0X2FybV9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFvdXRfYXJtX2xpdHRsZV92ZWMKLSAgICA7OwotICBhcm0tKi1jb2ZmKQotICAgIHRhcmdfZGVmdmVjPWFybWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hcm1jb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYXJtLSotZWxmIHwgYXJtKi0qLWxpbnV4LWdudSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIGFybS0qLW9hYmkpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0gICAgOzsKLQotICB0aHVtYi0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICB0aHVtYi0qLW9hYmkpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0gICAgOzsKLSAgdGh1bWItKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV92ZWMKLSAgICA7OwotICB0aHVtYi1lcG9jLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1fZXBvY19wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1fZXBvY19wZV9saXR0bGVfdmVjIGFybV9lcG9jX3BlX2JpZ192ZWMgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPW5vCi0gICAgOzsKLSAgdGh1bWItKi1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtcGVfbGl0dGxlX3ZlYyBhcm1wZV9iaWdfdmVjIGFybXBlaV9saXR0bGVfdmVjIGFybXBlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzdHJvbmdhcm0tKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV92ZWMKLSAgICA7OwotICBzdHJvbmdhcm0tKi1jb2ZmKQotICAgIHRhcmdfZGVmdmVjPWFybWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hcm1jb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBhMjlrLSotZWJtb24qIHwgYTI5ay0qLXVkaSogfCBhMjlrLSotY29mZiogfCBhMjlrLSotc3ltMSogfCBcCi0gIGEyOWstKi12eHdvcmtzKiB8IGEyOWstKi1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1hMjlrY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYTI5ay0qLWFvdXQqIHwgYTI5ay0qLWJzZCogfCBhMjlrLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGMzMC0qLSphb3V0KiB8IHRpYzMwLSotKmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXRpYzMwX2FvdXRfdmVjCi0gICAgOzsKLSAgYzMwLSotKmNvZmYqIHwgdGljMzAtKi0qY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9dGljMzBfY29mZl92ZWMKLSAgICA7OwotCi0gIGQxMHYtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9kMTB2X3ZlYwotICAgIDs7Ci0KLSAgZDMwdi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2QzMHZfdmVjCi0gICAgOzsKLQotICBmcjMwLSotZWxmKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9mcjMwX3ZlYwotICAgIDs7Ci0KLQotICBoODMwMCotKi0qKQotICAgIHRhcmdfZGVmdmVjPWg4MzAwY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBoODUwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9aDg1MDBjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGhwcGEqLSotKmVsZiogfCBocHBhKi0qLWxpdGVzKiB8IGhwcGEqLSotc3lzdjQqIHwgaHBwYSotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0gIGhwcGEqLSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9ocHBhX3ZlYwotICAgIDs7Ci0gIGhwcGEqLSotaHB1eCogfCBocHBhKi0qLWhpdXgqIHwgaHBwYSotKi1tcGVpeCopCi0gICAgdGFyZ19kZWZ2ZWM9c29tX3ZlYwotICAgIDs7Ci0gIGhwcGEqLSotb3NmKikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9ocHBhX3ZlYwotICAgIDs7Ci0jZW5kaWYgLyogZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpICovCi0KLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqY29mZikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc3lzdjQqIHwgaVszNDU2XTg2LSotdW5peHdhcmUqIHwgaVszNDU2XTg2LSotc29sYXJpczIqIHwgXAotICBpWzM0NTZdODYtKi1lbGYgfCBpWzM0NTZdODYtKi1zY28zLjJ2NSogfCBcCi0gIGlbMzQ1Nl04Ni0qLWRndXgqIHwgaVszNDU2XTg2LSotc3lzdjUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1ydGVtc2VsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2Y29mZl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqIHwgaVszNDU2XSotKi1nbzMyKiB8IGlbMzQ1Nl04Ni1nbzMyLXJ0ZW1zKiApCi0gICAgdGFyZ19kZWZ2ZWM9Z28zMmNvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJnbzMyc3R1YmJlZGNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2KiB8IGlbMzQ1Nl04Ni0qLWlzYyogfCBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotY29mZiB8IFwKLSAgaVszNDU2XTg2LSotYWl4KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2kzODZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotIGlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmR5bml4X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWZyZWVic2Rhb3V0KiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdLiogfCBcCi0gIGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdKQotICAgIHRhcmdfZGVmdmVjPWkzODZmcmVlYnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1mcmVlYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4NmNvZmZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbmV0YnNkKiB8IGlbMzQ1Nl04Ni0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZuZXRic2RfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfaTM4Nl92ZWMgaTM4NmNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1saW51eCphb3V0KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2bGludXhfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bHlueF9jb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2bHlueF9hb3V0X3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbWFjaCogfCBpWzM0NTZdODYtKi1vc2YxbWsqKQotICAgIHRhcmdfZGVmdmVjPWkzODZtYWNoM192ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotb3M5aykKLSAgICB0YXJnX2RlZnZlYz1pMzg2b3M5a192ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2RvcyopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmFvdXRfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZtc2Rvc192ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tb3NzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZtc2Rvc192ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3NwZSopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NnBlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zZWxmKiB8IGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1taW5ndzMyKiB8IGlbMzQ1Nl04Ni0qLWN5Z3dpbiogfCBpWzM0NTZdODYtKi13aW5udCB8IGlbMzQ1Nl04Ni0qLXBlKQotICAgIHRhcmdfZGVmdmVjPWkzODZwZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZwZV92ZWMgaTM4NnBlaV92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LW5vbmUtKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1hb3V0KiB8IGlbMzQ1Nl04NiotKi12c3RhKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICA7OwotCi0gIGk4NjAtKi1tYWNoMyogfCBpODYwLSotb3NmMSogfCBpODYwLSotY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9aTg2MGNvZmZfdmVjCi0gICAgOzsKLSAgaTg2MC0qLXN5c3Y0KiB8IGk4NjAtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pODYwX3ZlYwotICAgIDs7Ci0KLSAgaTk2MC0qLXZ4d29ya3M0KiB8IGk5NjAtKi12eHdvcmtzNS4wKQotICAgIHRhcmdfZGVmdmVjPWJfb3V0X3ZlY19saXR0bGVfaG9zdAotICAgIHRhcmdfc2VsdmVjcz0iYl9vdXRfdmVjX2JpZ19ob3N0IGljb2ZmX2xpdHRsZV92ZWMgaWNvZmZfYmlnX3ZlYyBpZWVlX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaTk2MC0qLXZ4d29ya3M1LiogfCBpOTYwLSotY29mZiogfCBpOTYwLSotc3lzdiogfCBpOTYwLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWljb2ZmX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Imljb2ZmX2JpZ192ZWMgYl9vdXRfdmVjX2xpdHRsZV9ob3N0IGJfb3V0X3ZlY19iaWdfaG9zdCBpZWVlX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaTk2MC0qLXZ4d29ya3MqIHwgaTk2MC0qLWFvdXQqIHwgaTk2MC0qLWJvdXQqIHwgaTk2MC0qLW5pbmR5KikKLSAgICB0YXJnX2RlZnZlYz1iX291dF92ZWNfbGl0dGxlX2hvc3QKLSAgICB0YXJnX3NlbHZlY3M9ImJfb3V0X3ZlY19iaWdfaG9zdCBpY29mZl9saXR0bGVfdmVjIGljb2ZmX2JpZ192ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pOTYwX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaWNvZmZfbGl0dGxlX3ZlYyBpY29mZl9iaWdfdmVjIgotICAgIDs7Ci0KLSAgbTMyci0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX20zMnJfdmVjCi0gICAgOzsKLQotICBtNjgqLWFwb2xsby0qKQotICAgIHRhcmdfZGVmdmVjPWFwb2xsb2NvZmZfdmVjCi0gICAgOzsKLSAgbTY4Ki1idWxsLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmdW5fdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotbW90b3JvbGEtc3lzdiopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a3N5c3Zjb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotaHAtYnNkKikKLSAgICB0YXJnX2RlZnZlYz1ocDMwMGJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLWFvdXQqKQotICAgIHRhcmdfZGVmdmVjPWFvdXQwX2JpZ192ZWMKLSAgICAjIFdlIGluY2x1ZGUgY2lzY29fY29yZV92ZWMgaGVyZSwgcmF0aGVyIHRoYW4gbWFraW5nIGEgc2VwYXJhdGUgY2lzY28KLSAgICAjIGNvbmZpZ3VyYXRpb24sIHNvIHRoYXQgY2lzY28tY29yZS5jIGdldHMgcm91dGluZWx5IHRlc3RlZCBhdAotICAgICMgbGVhc3QgZm9yIGNvbXBpbGF0aW9uLgotICAgIHRhcmdfc2VsdmVjcz0iY2lzY29fY29yZV92ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1lbGYqIHwgbTY4Ki0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyBpZWVlX3ZlYyIKLSAgICA7OwotICBtNjgqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyBpZWVlX3ZlYyBhb3V0MF9iaWdfdmVjIgotICAgIDs7Ci0gIG02OCotKi1jb2ZmKiB8IG02OCotKi1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgaWVlZV92ZWMiCi0gICAgOzsKLSAgbTY4Ki0qLWhwdXgqKQotICAgIHRhcmdfZGVmdmVjPWhwMzAwaHB1eF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPW02OGtsaW51eF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrbGludXhfdmVjCi0gICAgOzsKLSAgbTY4Ki0qLWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgIyB0YXJnX3NlbHZlY3M9bTY4a21hY2gzX3ZlYwotICAgICMgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbTY4Ki0qLWx5bnhvcyopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2x5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTY4a2x5bnhfYW91dF92ZWMKLSAgICA7OwotICBtNjgqLWhwKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPW02OGs0a25ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtuZXRic2RfdmVjIGhwMzAwYnNkX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrbmV0YnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4azRrbmV0YnNkX3ZlYyBocDMwMGJzZF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLXN1bm9zKiB8IG02OCotKi1vczY4ayogfCBtNjgqLSotdnh3b3JrcyogfCBtNjgqLW5ldHgtKiB8IFwKLSAgbTY4Ki0qLWJzZCogfCBtNjgqLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLWVyaWNzc29uLSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyB0ZWtoZXhfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLWNibS0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrY29mZl92ZWMKLSAgICA7OwotICBtNjgqLWFwcGxlLWF1eCopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2F1eF9jb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotKi1wc29zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9aWVlZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtODgqLWhhcnJpcy1jeHV4KiB8IG04OCotKi1kZ3V4KiB8IG04OCotKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX204OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW04OGtiY3NfdmVjCi0gICAgOzsKLSAgbTg4Ki0qLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1tODhrbWFjaDNfdmVjCi0gICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbTg4Ki0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9bTg4a2Jjc192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtY29yZS0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWNvcmUtKi1wZSkKLSAgICB0YXJnX2RlZnZlYz1tY29yZV9wZV9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtY29yZV9wZV9iaWdfdmVjIG1jb3JlX3BlX2xpdHRsZV92ZWMgbWNvcmVfcGVpX2JpZ192ZWMgbWNvcmVfcGVpX2xpdHRsZV92ZWMiCi0gICAgOzsKLQotICBtaXBzKi1iaWctKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzLWRlYy1uZXRic2QqIHwgbWlwcyplbCotKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGVjb2ZmX2xpdHRsZV92ZWMgZWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotIG1pcHMqLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotZGVjLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbWlwcyotZGVjLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1hb3V0X21pcHNfbGl0dGxlX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG1pcHMqLWRlYy0qIHwgbWlwcyplbC0qLWVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2JpZ192ZWMKLSAgICA7OwotICBtaXBzKi0qLWVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKi0qLWlyaXg2KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotICBtaXBzKi1zZ2ktKiB8IG1pcHMqLSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKi0qLWxuZXdzKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdsaXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1tYWNoMyopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICA7OwotICBtaXBzKi0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2KiB8IG1pcHMqLSotcmlzY29zKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKmVsLSotZWxmKiB8IG1pcHMqZWwtKi1ydGVtcyogfCBtaXBzKmVsLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLWVsZiogfCBtaXBzKi0qLXJ0ZW1zKiB8IG1pcHMqLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLW5vbmUpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKmVsKi0qLWxpbnV4LWdudSogfCBtaXBzKmVsKi0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgZWNvZmZfbGl0dGxlX3ZlYyBlY29mZl9iaWdfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotbGludXgtZ251KiB8IG1pcHMqLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLQotICBtbjEwMjAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbW4xMDIwMF92ZWMKLSAgICA7OwotCi0gIG1uMTAzMDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tbjEwMzAwX3ZlYwotICAgIDs7Ci0KLSAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopCi0gICAgdGFyZ19kZWZ2ZWM9cGM1MzJtYWNoYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1saXRlcyogfCBuczMyay0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPXBjNTMybmV0YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIHBvd2VycGMtKi1haXgqIHwgcG93ZXJwYy0qLWJlb3MqKQotICAgIHRhcmdfZGVmdmVjPXJzNjAwMGNvZmZfdmVjCi0gICAgOzsKLSAgcG93ZXJwYy0qLSpic2QqIHwgcG93ZXJwYy0qLWVsZiogfCBwb3dlcnBjLSotc3lzdjQqIHwgcG93ZXJwYy0qLWVhYmkqIHwgXAotICBwb3dlcnBjLSotc29sYXJpczIqIHwgcG93ZXJwYy0qLWxpbnV4LWdudSogfCBwb3dlcnBjLSotcnRlbXMqIHwgXAotICBwb3dlcnBjLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Bvd2VycGNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJyczYwMDBjb2ZmX3ZlYyBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYyBwcGNib290X3ZlYyIKLSAgICA7OwotICBwb3dlcnBjLSotbWFjb3MqIHwgcG93ZXJwYy0qLW1wdyopCi0gICAgdGFyZ19kZWZ2ZWM9cG1hY194Y29mZl92ZWMKLSAgICA7OwotICBwb3dlcnBjLSotbmV0d2FyZSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Bvd2VycGNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJubG0zMl9wb3dlcnBjX3ZlYyByczYwMDBjb2ZmX3ZlYyIKLSAgICA7OwotICBwb3dlcnBjbGUtKi1lbGYqIHwgcG93ZXJwY2xlLSotc3lzdjQqIHwgcG93ZXJwY2xlLSotZWFiaSogfCBcCi0gIHBvd2VycGNsZS0qLXNvbGFyaXMyKiB8IHBvd2VycGNsZS0qLWxpbnV4LWdudSogfCBwb3dlcnBjbGUtKi12eHdvcmtzKiB8XAotICBwb3dlcnBjbGUtKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9InJzNjAwMGNvZmZfdmVjIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYyBwcGNib290X3ZlYyIKLSAgICA7OwotCi0gIHBvd2VycGNsZS0qLXBlIHwgcG93ZXJwY2xlLSotd2lubnQqIHwgcG93ZXJwY2xlLSotY3lnd2luKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfcG93ZXJwY2xlX3BlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX3Bvd2VycGNsZV9wZWlfdmVjIGJmZF9wb3dlcnBjX3BlaV92ZWMgYmZkX3Bvd2VycGNsZV9wZV92ZWMgYmZkX3Bvd2VycGNfcGVfdmVjIgotICAgIDs7Ci0KLSAgcnM2MDAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1yczYwMDBjb2ZmX3ZlYwotICAgIDs7Ci0KLSAgc2gtKi1lbGYqIHwgc2gtKi1ydGVtc2VsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NoX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NobF92ZWMgc2hjb2ZmX3ZlYyBzaGxjb2ZmX3ZlYyBzaGNvZmZfc21hbGxfdmVjIHNobGNvZmZfc21hbGxfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzaC0qLSogfCBzaC0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1zaGNvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJzaGNvZmZfdmVjIHNobGNvZmZfdmVjIHNoY29mZl9zbWFsbF92ZWMgc2hsY29mZl9zbWFsbF92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgc3BhcmNsZXQtKi1hb3V0KikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPXNwYXJjbGVfYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmM4NngtKi1hb3V0KikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjbGl0ZS0qLWVsZiogfCBzcGFyYzg2eC0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIDs7Ci0gIHNwYXJjLSotbGludXgqYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3BhcmNsaW51eF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9zcGFyY192ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmMtKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9InNwYXJjbGludXhfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSAgc3BhcmMtKi1seW54b3MqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbHlueF9jb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zcGFyY2x5bnhfYW91dF92ZWMKLSAgICA7OwotICBzcGFyYy0qLW5ldGJzZCogfCBzcGFyYy0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbmV0YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYy0qLWVsZiogfCBzcGFyYy0qLXNvbGFyaXMyKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPXN1bm9zX2JpZ192ZWMKLSAgICA7OwotICBzcGFyYy0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1uZXR3YXJlKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJubG0zMl9zcGFyY192ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICA7OwotI2lmZGVmIEJGRDY0Ci0gIHNwYXJjNjQtKi1hb3V0KikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjNjQtKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9zcGFyY192ZWMgc3BhcmNsaW51eF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICA7OwotICBzcGFyYzY0LSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICA7OyAgICAKLSNlbmRpZiAvKiBCRkQ2NCAqLwotICBzcGFyYyotKi1jb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY2NvZmZfdmVjCi0gICAgOzsKLSAgc3BhcmMqLSotKiB8IHNwYXJjKi0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSNpZiBIQVZFX2hvc3RfYW91dF92ZWMKLSAgdGFob2UtKi0qKQotICAgIHRhcmdfZGVmdmVjPWhvc3RfYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSNlbmRpZgotCi0gIHRpYzgwKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9dGljODBjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0KLSAgdjg1MC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Y4NTBfdmVjCi0gICAgOzsKLSAgdjg1MGUtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl92ODUwX3ZlYwotICAgIDs7Ci0gIHY4NTBlYS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Y4NTBfdmVjCi0gICAgOzsKLSNpZiBIQVZFX2hvc3RfYW91dF92ZWMKLSAgdmF4LSotYnNkKiB8IHZheC0qLXVsdHJpeCopCi0gICAgdGFyZ19kZWZ2ZWM9aG9zdF9hb3V0X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotI2VuZGlmCi0KLSAgdmF4Ki0qLSp2bXMqKQotICAgIHRhcmdfZGVmdmVjPXZtc192YXhfdmVjCi0gICAgOzsKLQotICB3ZTMyay0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9d2UzMmtjb2ZmX3ZlYwotICAgIDs7Ci0KLSAgdzY1LSotKikKLSAgICB0YXJnX2RlZnZlYz13NjVfdmVjCi0gICAgOzsKLQotICB6OGsqLSotKikKLSAgICB0YXJnX2RlZnZlYz16OGtjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gICotKi1pZWVlKikKLSAgICB0YXJnX2RlZnZlYz1pZWVlX3ZlYwotICAgIDs7Ci0KLSAgKi1hZG9iZS0qKQotICAgIHRhcmdfZGVmdmVjPWFfb3V0X2Fkb2JlX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gICotc29ueS0qKQotICAgIHRhcmdfZGVmdmVjPW5ld3NvczNfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgKi10YW5kZW0tKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aWVlZV92ZWMKLSAgICA7OwotIyBFTkQgT0YgdGFyZ21hdGNoLmgKLSAgKikKLSAgICBlY2hvIDE+JjIgIioqKiBCRkQgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgJHt0YXJnfS4iCi0gICAgZWNobyAxPiYyICIqKiogTG9vayBpbiBiZmQvY29uZmlnLmJmZCBmb3Igc3VwcG9ydGVkIHRhcmdldHMuIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLSMgSWYgd2Ugc3VwcG9ydCBhbnkgRUxGIHRhcmdldCwgdGhlbiBhdXRvbWF0aWNhbGx5IGFkZCBzdXBwb3J0IGZvciB0aGUKLSMgZ2VuZXJpYyBFTEYgdGFyZ2V0cy4gIFRoaXMgcGVybWl0cyBhbiBvYmpkdW1wIHdpdGggc29tZSBFTEYgc3VwcG9ydAotIyB0byBiZSB1c2VkIG9uIGFuIGFyYml0cmFyeSBFTEYgZmlsZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbgotIyByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotY2FzZSAiJHt0YXJnX2RlZnZlY30gJHt0YXJnX3NlbHZlY3N9IiBpbgotICAqYmZkX2VsZjY0KikKLSAgICB0YXJnX3NlbHZlY3M9IiR7dGFyZ19zZWx2ZWNzfSBiZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjIGJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYyBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjIgotICAgIDs7Ci0gICpiZmRfZWxmMzIqKQotICAgIHRhcmdfc2VsdmVjcz0iJHt0YXJnX3NlbHZlY3N9IGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYyIKLSAgICA7OwotZXNhYwpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZy5pbiBiL2JmZC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjJjNzguLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gICovCi0jdW5kZWYgVElNRV9XSVRIX1NZU19USU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmRvcGVuIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0ZET1BFTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRnaWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUR0lECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXR1aWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUVUlECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWFkdmlzZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NQURWSVNFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXByb3RlY3QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVBST1RFQ1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRpdGltZXIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUSVRJTUVSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzY29uZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TWVNDT05GCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ESVJFTlRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURERFRl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHJvY2ZzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gKi8KLSN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIG1hbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBEZWZpbmUgaWYgcmVhbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MKLQotLyogRGVmaW5lIGlmIGZyZWUgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi0KLS8qIERlZmluZSBpZiBnZXRlbnYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnN0YXR1c190LiAqLwotI3VuZGVmIEhBVkVfUFJTVEFUVVNfVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHByc3RhdHVzX3QucHJfd2hvLiAqLwotI3VuZGVmIEhBVkVfUFJTVEFUVVNfVF9QUl9XSE8KLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwc3RhdHVzX3QuICovCi0jdW5kZWYgSEFWRV9QU1RBVFVTX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnBzaW5mb190LiAqLwotI3VuZGVmIEhBVkVfUFJQU0lORk9fVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHBzaW5mb190LiAqLwotI3VuZGVmIEhBVkVfUFNJTkZPX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBsd3BzdGF0dXNfdC4gKi8KLSN1bmRlZiBIQVZFX0xXUFNUQVRVU19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QucHJfY29udGV4dC4gKi8KLSN1bmRlZiBIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBsd3BzdGF0dXNfdC5wcl9yZWcuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcKLQotLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICovCi0jdW5kZWYgVFJBRF9IRUFERVIKLQotLyogVXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICovCi0jdW5kZWYgVVNFX01NQVAKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZSBiL2JmZC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzZTkzZTYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDYzMzkgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcykiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtbW1hcCAgICAgICAgICAgICB0cnkgdXNpbmcgbW1hcCBmb3IgQkZEIGlucHV0IGZpbGVzIGlmIGF2YWlsYWJsZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9bGliYmZkLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTk4OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxOTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjM3OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc0MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzc1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSA3ODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODE3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODUwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODgyOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MTU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTY4OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjU6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWJmZAotCi1WRVJTSU9OPTIuOS40Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA3MTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFDTE9DQUw9YWNsb2NhbAotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDg0OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwOTc6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTEwOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMjM6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCi1maQotZmkKLUFSPSIkYWNfY3ZfcHJvZ19BUiIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTc4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjEwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBSQU5MSUI9IjoiCi1maQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzE2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNTU6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM3OTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzgyOiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQxODogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzNDogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NzI6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1Mzk6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1lY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYzNzogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY0NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjQ5OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2Ci1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NzU6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNzExICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzEyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MzM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc2ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgzNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjQtYml0LWJmZCBvciAtLWRpc2FibGUtNjQtYml0LWJmZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV82NF9iaXRfYmZkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV82NF9iaXRfYmZkIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgIHdhbnQ2ND10cnVlICA7OwotICBubykgICB3YW50NjQ9ZmFsc2UgOzsKLSAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1lbHNlCi0gIHdhbnQ2ND1mYWxzZQotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tbWFwIG9yIC0td2l0aG91dC1tbWFwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9tbWFwK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX21tYXAiCi0gIGNhc2UgIiR7d2l0aHZhbH0iIGluCi0gIHllcykgIHdhbnRfbW1hcD10cnVlIDs7Ci0gIG5vKSAgIHdhbnRfbW1hcD1mYWxzZSA7OwotICAqKSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciBCRkQgd2l0aC1tbWFwIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1lbHNlCi0gIHdhbnRfbW1hcD1mYWxzZQotZmkKLQotCi0KLQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNjg6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDkxOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTA3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTI0OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTM2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNTU6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLWhvc3Q2ND1mYWxzZQotdGFyZ2V0NjQ9ZmFsc2UKLQotIyBob3N0IHN0dWZmOgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxOTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMjQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjc1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzA3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMzE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzQ5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM1NDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzgyOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MTY6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ2NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ3MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ5NjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUwMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU2NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MDA6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjU0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NzU6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2ODk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzE1OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzIwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NDg6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc4MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3ODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4MTY6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjgyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg4MTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4ODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTExOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5Mzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk2NjogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk5MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDE4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDU3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDYyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMTA6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjg2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM4MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDExOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NDU6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDc4OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0OTg6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUxNzogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTI3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU0NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NzI6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYwNzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzYxOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2ODE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2ODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzcwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzczNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODc4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkxNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAwNDogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAzMjogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDQyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotIyBQZXJtaXQgaG9zdCBzcGVjaWZpYyBzZXR0aW5ncy4KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTIwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLUJGRF9IT1NUXzY0QklUX0xPTkc9MAotQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MAotQkZEX0hPU1RfNjRfQklUPQotQkZEX0hPU1RfVV82NF9CSVQ9Ci1pZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiA9ICJ4bG9uZyI7IHRoZW4KLSAgQkZEX0hPU1RfNjRCSVRfTE9ORz0xCi1lbGlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iICE9ICJ4IjsgdGhlbgotICBCRkRfSE9TVF82NF9CSVRfREVGSU5FRD0xCi0gIEJGRF9IT1NUXzY0X0JJVD0ke0hPU1RfNjRCSVRfVFlQRX0KLSAgQkZEX0hPU1RfVV82NF9CSVQ9JHtIT1NUX1VfNjRCSVRfVFlQRX0KLWZpCi0KLQotCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAteiAiJENDX0ZPUl9CVUlMRCI7IHRoZW4KLSAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotICBlbHNlCi0gICAgQ0NfRk9SX0JVSUxEPWdjYwotICBmaQotZmkKLQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjAzOiBjaGVja2luZyBmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfYnVpbGRfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gYWNfY190ZXN0LmMgPDwgJ0VPRicKLWludCBtYWluKCkgewotLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLwotfQotRU9GCi0gICAgJHtDQ19GT1JfQlVJTER9IC1vIGFjX2NfdGVzdCBhbV9jX3Rlc3QuYyAxPiY1IDI+JjUKLSAgICBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvIGFjX2NfdGVzdC4qIHwgZ3JlcCAtdiBhY19jX3Rlc3QuYyB8IHNlZCAtZSBzL2FjX2NfdGVzdC8vYAotICAgIHJtIC1mIGFjX2NfdGVzdCoKLSAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm8KLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2J1aWxkX2V4ZWV4dCIgMT4mNgotICBFWEVFWFRfRk9SX0JVSUxEPSIiCi0gIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9Ci1maQotCi0KLWZvciBhY19oZHIgaW4gc3RkZGVmLmggc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHRpbWUuaCB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyMjg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjM4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBmY250bC5oIHN5cy9maWxlLmggc3lzL3RpbWUuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyNjg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mjc4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzMDU6IGNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfdGltZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotaW50IG1haW4oKSB7Ci1zdHJ1Y3QgdG0gKnRwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfdGltZT15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3RpbWU9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3RpbWUiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotRU9GCi0KLWZpCi0KLWFjX2hlYWRlcl9kaXJlbnQ9bm8KLWZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzQ0OiBjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8JGFjX2hkcj4KLWludCBtYWluKCkgewotRElSICpkaXJwID0gMDsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzU3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyX2RpcmVudF8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gYWNfaGVhZGVyX2RpcmVudD0kYWNfaGRyOyBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0jIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCi1pZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzgyOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRpcidfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGlyICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzOTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBvcGVuZGlyKCk7Ci0KLWludCBtYWluKCkgewotb3BlbmRpcigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTElCUz0iJExJQlMgLWxkaXIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDIzOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiID4mNQotYWNfbGliX3Zhcj1gZWNobyB4J18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWx4ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBvcGVuZGlyKCk7Ci0KLWludCBtYWluKCkgewotb3BlbmRpcigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ0MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTElCUz0iJExJQlMgLWx4IgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIGZjbnRsIGdldHBhZ2VzaXplIHNldGl0aW1lciBzeXNjb25mIGZkb3BlbiBnZXR1aWQgZ2V0Z2lkCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDY3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0OTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi1jYXNlICIke2hvc3R9IiBpbgotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MzA6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTc3OiBjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBtYWxsb2MKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MjQ6IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2MjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgcmVhbGxvYwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjcxOiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Njc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZyZWUKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Njk3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzE4OiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDcyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzQ0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCi1FT0YKLQotZmkKLQotCi0jIElmIHdlIGFyZSBjb25maWd1cmVkIG5hdGl2ZSwgcGljayBhIGNvcmUgZmlsZSBzdXBwb3J0IGZpbGUuCi1DT1JFRklMRT0KLUNPUkVGTEFHPQotVFJBRF9IRUFERVI9Ci1pZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gIGFscGhhKi0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9hbHBoYWxpbnV4LmgiJwotCTs7Ci0gIGFscGhhKi0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIGFscGhhKi0qLSopCQlDT1JFRklMRT1vc2YtY29yZS5sbyA7OwotICBhcm0tKi1yaXNjaXgpCQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaHBwYSotKi1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaGl1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLW1wZWl4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotYnNkKikJCUNPUkVGSUxFPSJocHV4LWNvcmUubG8gaHBwYWJzZC1jb3JlLmxvIgotCQkJQ09SRUZMQUc9Ii1ESFBVWF9DT1JFIC1ESFBQQUJTRF9DT1JFIiA7OwotICBpWzM0NTZdODYtc2VxdWVudC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbzsKLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotICBpWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2YnNkLmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCi0JOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotCUNPUkVGSUxFPXNjbzUtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1pc2MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NnNjby5oIicKLQk7OwotICBpWzM0NTZdODYtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCi0JOzsKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZsaW51eC5oIicKLQk7OwotICBpWzM0NTZdODYtKi1pc2MqKQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaVszNDU2XTg2LSotYWl4KikJQ09SRUZJTEU9YWl4Mzg2LWNvcmUubG8gOzsKLSAgaTg2MC0qLW1hY2gzKiB8IGk4NjAtKi1vc2YxKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2k4NjBtYWNoMy5oIicKLQk7OwotICBtaXBzLWRlYy1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc2JzZC5oIicKLQk7OwotICBtaXBzLWRlYy1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLW5ldGJzZCogfCBtaXBzKi0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbWlwcy1kZWMtKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlY3N0YXRpb24uaCInCi0JOzsKLSAgbWlwcy1zZ2ktaXJpeDQqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDUqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDYqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotc3lzdjQqKQk7OwotICBtaXBzLSotc3lzdiogfCBtaXBzLSotcmlzY29zKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3Jpc2Nvcy5oIicKLQk7OwotICBtaXBzLXNvbnktYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MtbWlwcy5oIicKLQk7OwotICBtNjgqLWJ1bGwqLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZHB4Mi5oIicKLQk7OwotICBtNjgqLWhwLWhwdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgbTY4Ki1ocC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaHAzMDBic2QuaCInCi0JOzsKLSAgbTY4Ki0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrbGludXguaCInCi0JOzsKLSAgbTY4Ki1tb3Rvcm9sYS1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlbHRhNjguaCInCi0JOzsKLSAgbTY4Ki1zb255LSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLmgiJwotCTs7Ci0gIG02OCotKi1uZXRic2QqIHwgbTY4Ki0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbTY4Ki1hcHBsZS1hdXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2F1eC5oIicKLQk7OwotICBtODgqLSotc3lzdjQqKQk7OwotICBtODgqLW1vdG9yb2xhLXN5c3YqKQlDT1JFRklMRT1wdHJhY2UtY29yZS5sbyA7OwotICBtODgqLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTg4a21hY2gzLmgiJwotCTs7Ci0gIG5zMzJrLXBjNTMyLW1hY2gpCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9wYzUzMm1hY2guaCInCi0JOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHJzNjAwMC0qLWx5bngqKQlDT1JFRklMRT1seW54LWNvcmUubG8gOzsKLSAgcnM2MDAwLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLSopCQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotKmJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1iZW9zKikJOzsKLSAgcG93ZXJwYy0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHNwYXJjLSotbmV0YnNkKiB8IHNwYXJjLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICB0YWhvZS0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy90YWhvZS5oIicKLQk7OwotICB2YXgtKi11bHRyaXgyKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheGJzZC5oIicKLQk7OwotICBlc2FjCi0KLSAgY2FzZSAiJENPUkVGSUxFIiBpbgotICBhaXgzODYtY29yZS5sbykJQ09SRUZMQUc9LURBSVgzODZfQ09SRSA7OwotICBocHBhYnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ESFBQQUJTRF9DT1JFIDs7Ci0gIGhwdXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESFBVWF9DT1JFIDs7Ci0gIGlyaXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESVJJWF9DT1JFIDs7Ci0gIGx5bngtY29yZS5sbykJCUNPUkVGTEFHPS1ETFlOWF9DT1JFIDs7Ci0gIG5ldGJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tRE5FVEJTRF9DT1JFIDs7Ci0gIG9zZi1jb3JlLmxvKQkJQ09SRUZMQUc9LURPU0ZfQ09SRSA7OwotICBwdHJhY2UtY29yZS5sbykJQ09SRUZMQUc9LURQVFJBQ0VfQ09SRSA7OwotICByczYwMDAtY29yZS5sbykJQ09SRUZMQUc9IiRDT1JFRkxBRyAtREFJWF9DT1JFIiA7OwotICBzY281LWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EU0NPNV9DT1JFIiA7OwotICB0cmFkLWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EVFJBRF9DT1JFIiA7OwotICBlc2FjCi0KLSAgIyBFTEYgY29yZWZpbGUgc3VwcG9ydCBoYXMgc2V2ZXJhbCBmbGF2b3JzLCBidXQgYWxsIG9mCi0gICMgdGhlbSB1c2Ugc29tZXRoaW5nIGNhbGxlZCA8c3lzL3Byb2Nmcy5oPgotICBmb3IgYWNfaGRyIGluIHN5cy9wcm9jZnMuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5NDU6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTUwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTU1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5ODM6IGNoZWNraW5nIGZvciBwcnN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDk4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTk1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAxNzogY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXByc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfd2hvCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTAyOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8gPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BSU1RBVFVTX1RfUFJfV0hPIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8iIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDUxOiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDU2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXBzdGF0dXNfdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA2MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwODU6IGNoZWNraW5nIGZvciBwcnBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTA5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnBzaW5mb190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDk3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJQU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTExOTogY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUxMjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHNpbmZvX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxMzE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxNTM6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfY29udGV4dCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxODc6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9jb250ZXh0IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUxOTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotbHdwc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfY29udGV4dAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxOTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX3JlZyBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyMjE6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9yZWcgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX3JlZwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMzM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWc9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWciIDE+JjYKLQotICBmaQotZmkKLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUUkFEX0hFQURFUiAkVFJBRF9IRUFERVIKLUVPRgotCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIC1sa2VybmVsMzIiCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLQotCi0jIHRhcmdldCBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotZGVmdmVjPQotc2VsdmVjcz0KLXNlbGFyY2hzPQotVERFRklORVM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvY29uZmlnLmJmZAotCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCi0JICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKLQlmaQotCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0JVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCi0gICAgZmkKLWRvbmUKLQotCi0jIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCi0jIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCi0jIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0Ci0jIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAotIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS13aXRoLXRhcmdldHM9YWxsIiBpcwotIyB1c2VkLgotCi0jIHVuaXEgdGhlIGRlZmF1bHQgYW5kIHNlbGVjdGVkIHZlY3RvcnMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsdmVjcyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWx2ZWNzPSIkZiIKLQotCi0jIHVuaXEgdGhlIGFyY2hpdGVjdHVyZXMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsYXJjaHMgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsYXJjaHM9IiRmIgotCi0jIFRhcmdldCBiYWNrZW5kIC5vIGZpbGVzLgotdGI9Ci0KLWVsZj0iZWxmLmxvIGVsZmxpbmsubG8gZHdhcmYyLmxvIGR3YXJmMS5sbyIKLQotZm9yIHZlYyBpbiAkc2VsdmVjcwotZG8KLSAgICBjYXNlICIkdmVjIiBpbgotICAgICMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQotICAgICMgd2l0aCB0aGUgdHdvIHZlY3RvciBsaXN0cyBpbiB0YXJnZXRzLmMuCi0gICAgYTI5a2NvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hMjlrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGFfb3V0X2Fkb2JlX3ZlYykJCXRiPSIkdGIgYW91dC1hZG9iZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXJtY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZV9iaWdfdmVjKQkJdGI9IiR0YiBwZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKLSAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYWxwaGFfdmVjKQl0Yj0iJHRiIGVsZjY0LWFscGhhLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k5NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pOTYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9zaF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc2hsX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zcGFyY192ZWMpCXRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfdjg1MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXY4NTAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X3NwYXJjX3ZlYykJdGI9IiR0YiBlbGY2NC1zcGFyYy5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBjaXNjb19jb3JlX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OwotICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmxpbnV4X3ZlYykJCXRiPSIkdGIgaTM4NmxpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgaTM4Nmx5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtaTM4Nmx5bngubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIGkzODZtYWNoM192ZWMpCQl0Yj0iJHRiIGkzODZtYWNoMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm5ldGJzZF92ZWMpCQl0Yj0iJHRiIGkzODZuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZvczlrX3ZlYykJCXRiPSIkdGIgaTM4Nm9zOWsubG8gYW91dDMyLmxvIiA7OwotICAgIGk4NjBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pODYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWVlZV92ZWMpCQkJdGI9IiR0YiBpZWVlLmxvIiA7OwotICAgIG02OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtjb2ZmdW5fdmVjKQkJdGI9IiR0YiBjb2ZmLXU2OGsubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtsaW51eF92ZWMpCQl0Yj0iJHRiIG02OGtsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIG02OGtseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLW02OGtseW54LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgbTY4a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGs0a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGs0a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2F1eF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hdXgubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtzeXN2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3ZtNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG04OGtiY3NfdmVjKQkJdGI9IiR0YiBjb2ZmLW04OGsubG8iIDs7Ci0gICAgbWNvcmVfcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtbWNvcmUubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBuZXdzb3MzX3ZlYykJCXRiPSIkdGIgbmV3c29zMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbmxtMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIG5sbTMyLWkzODYubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX3NwYXJjX3ZlYykJCXRiPSIkdGIgbmxtMzItc3BhcmMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX2FscGhhX3ZlYykJCXRiPSIkdGIgbmxtMzItYWxwaGEubG8gbmxtMzIubG8gbmxtLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICByaXNjaXhfdmVjKQkJCXRiPSIkdGIgYW91dDMyLmxvIHJpc2NpeC5sbyIgOzsKLSAgICBubG0zMl9wb3dlcnBjX3ZlYykJCXRiPSIkdGIgbmxtMzItcHBjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBwYzUzMm5ldGJzZF92ZWMpCQl0Yj0iJHRiIG5zMzJrbmV0YnNkLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcGM1MzJtYWNoYW91dF92ZWMpCQl0Yj0iJHRiIHBjNTMyLW1hY2gubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwbWFjX3hjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1wbWFjLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICByczYwMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1yczYwMDAubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjX3BlX3ZlYykgICAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjKSAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNsZV9wZWlfdmVjKSAgICAgIHRiPSIkdGIgcGVpLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBwcGNib290X3ZlYykJCXRiPSIkdGIgcHBjYm9vdC5sbyIgOzsKLSAgICBzaGNvZmZfdmVjKQkJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNvbV92ZWMpCQkJdGI9IiR0YiBzb20ubG8iIDs7Ci0gICAgc3BhcmNsZV9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC1zcGFyY2xlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2xpbnV4X3ZlYykJCXRiPSIkdGIgc3BhcmNsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBzcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLXNwYXJjbHlueC5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgc3BhcmNuZXRic2RfdmVjKQkJdGI9IiR0YiBzcGFyY25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zcGFyYy5sbyIgOzsKLSAgICBzcmVjX3ZlYykJCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgc3Vub3NfYmlnX3ZlYykJCXRiPSIkdGIgc3Vub3MubG8gYW91dDMyLmxvIiA7OwotICAgIHN5bWJvbHNyZWNfdmVjKQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHRla2hleF92ZWMpCQkJdGI9IiR0YiB0ZWtoZXgubG8iIDs7Ci0gICAgdGljMzBfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtdGljMzAubG8iIDs7Ci0gICAgdGljMzBfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljMzAubG8iIDs7Ci0gICAgdGljODBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWM4MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICB2ZXJzYWRvc192ZWMpCQl0Yj0iJHRiIHZlcnNhZG9zLmxvIiA7OwotICAgIHZtc19hbHBoYV92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIKLSAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHZtc192YXhfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iIDs7Ci0gICAgdzY1X3ZlYykJCQl0Yj0iJHRiIGNvZmYtdzY1LmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgd2UzMmtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi13ZTMyay5sbyIgOzsKLSAgICB6OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi16OGsubG8gcmVsb2MxNi5sbyIgOzsKLQotICAgICIiKQkJCTs7Ci0gICAgKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAqKiogdW5rbm93biB0YXJnZXQgdmVjdG9yICR2ZWMiIDE+JjI7IGV4aXQgMTsgfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IFlvdSBoYXZlIHJlcXVlc3RlZCBhIDY0IGJpdCBCRkQgY29uZmlndXJhdGlvbiwgYnV0IiAxPiYyCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IHlvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGUiIDE+JjIKLSAgICBmaQotICAgIDs7Ci0gIGZhbHNlLWZhbHNlLWZhbHNlKQotICAgIHdvcmRzaXplPTMyCi0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDMyX0JBQ0tFTkRTKScKLSAgICA7OwotZXNhYwotCi0KLQotCi0KLQotdGRlZmF1bHRzPSIiCi10ZXN0IC1uICIke2RlZnZlY30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EREVGQVVMVF9WRUNUT1I9JHtkZWZ2ZWN9IgotdGVzdCAtbiAiJHtzZWx2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfVkVDUz0nJHtzZWx2ZWNzfSciCi10ZXN0IC1uICIke3NlbGFyY2hzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfQVJDSElURUNUVVJFUz0nJHtzZWxhcmNoc30nIgotdGVzdCAtbiAiJHtoYXZldmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9ICR7aGF2ZXZlY3N9IgotCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTgzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTU4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NTU5MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjIyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NjI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2NTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2NzU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU2ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi1mb3IgYWNfZnVuYyBpbiBtYWR2aXNlIG1wcm90ZWN0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1ODQ4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1ODUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4NzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWNhc2UgJHt3YW50X21tYXB9KyR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZH0gaW4KLSAgdHJ1ZSt5ZXMgKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9NTUFQIDEKLUVPRgotIDs7Ci1lc2FjCi0KLXJtIC1mIGRvYy9jb25maWcuc3RhdHVzCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEJGRF9IT1NUXzY0QklUX0xPTkdAJSRCRkRfSE9TVF82NEJJVF9MT05HJWcKLXMlQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCUkQkZEX0hPU1RfNjRfQklUX0RFRklORUQlZwotcyVAQkZEX0hPU1RfNjRfQklUQCUkQkZEX0hPU1RfNjRfQklUJWcKLXMlQEJGRF9IT1NUX1VfNjRfQklUQCUkQkZEX0hPU1RfVV82NF9CSVQlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKLXMlQENPUkVGSUxFQCUkQ09SRUZJTEUlZwotcyVAQ09SRUZMQUdAJSRDT1JFRkxBRyVnCi1zJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZwotcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCi1zJUBUREVGSU5FU0AlJFRERUZJTkVTJWcKLXMlQHdvcmRzaXplQCUkd29yZHNpemUlZwotcyVAYWxsX2JhY2tlbmRzQCUkYWxsX2JhY2tlbmRzJWcKLXMlQGJmZF9iYWNrZW5kc0AlJGJmZF9iYWNrZW5kcyVnCi1zJUBiZmRfbWFjaGluZXNAJSRiZmRfbWFjaGluZXMlZwotcyVAdGRlZmF1bHRzQCUkdGRlZmF1bHRzJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5iYXQgYi9iZmQvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmZTc5ZS4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLUBlY2hvIG9mZg0KLWlmICIlMSIgPT0gImg4LzMwMCIgZ290byBoODMwMA0KLQ0KLWVjaG8gQ29uZmlndXJpbmcgYmZkIGZvciBnbzMyDQotdXBkYXRlIGhvc3RzXGdvMzIuaCBzeXNkZXAuaA0KLXVwZGF0ZSBNYWtlZmlsZS5kb3MgTWFrZWZpbGUNCi1lY2hvIHMvQFdPUkRTSVpFQC8zMi9nPmNvbmZpZy5zZWQNCi1zZWQgLWUgcy9eL3NcL0BWRVJTSU9OQFwvLyAtZSBzLyQvXC9nL2cgdmVyc2lvbiA+PmNvbmZpZy5zZWQNCi1zZWQgLWYgY29uZmlnLnNlZCA8IGJmZC1pbjIuaCA+IGJmZC5oMg0KLXVwZGF0ZSBiZmQuaDIgYmZkLmgNCi1nb3RvIGV4aXQNCi0NCi06aDgzMDANCi1lY2hvIENvbmZpZ3VyaW5nIGJmZCBmb3IgSDgvMzAwDQotdXBkYXRlIGhvc3RzXGgtZ28zMi5oIHN5c2RlcC5oDQotdXBkYXRlIE1ha2VmaWxlLmRvcyBNYWtlZmlsZQ0KLQ0KLTpleGl0DQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5jb20gYi9iZmQvY29uZmlndXJlLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5OTc3Yy4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0kIQotJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotJCEKLSQhIFdlIGRvIG5vdCB1c2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNpbmNlIHdlIGRvIG5vdCBoYXZlIC9iaW4vc2gKLSQhIHRvIGV4ZWN1dGUgaXQuCi0kIQotJCEgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotJCEKLSRhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkgICAgICAhIHZheD09MSwgYWxwaGE9PTIKLSRhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQhCi0kaWYgYXJjaCAuZXFzLiAiQWxwaGEiCi0kdGhlbgotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBmb3IgQWxwaGEgdGFyZ2V0IgotJCB0YXJnZXQgPSAiYWxwaGEiCi0kIQotJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwotJCEKLSQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQotICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKLSRERUNLCi0hCi0hICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKLSEKLSEKLSAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgIkNPTkZJR1VSRS5JTiIpOwotICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0FNX0lOSVRfQVVUT01BS0UoYmZkLCAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKLSAgIEVMU0U7Ci0gICAgIHZlcnMgOj0gInVua25vd24iOwotICAgRU5ESUY7Ci0KLSAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKLQotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAVkVSU0lPTkAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCh2ZXJzKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzY0Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzAnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ19fREVDQycpOwotICAgICAgU1BMSVRfTElORTsKLSAgICAgIENPUFlfVEVYVCgnI2luY2x1ZGUgPGludHMuaD4nKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9VXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgndWludDY0Jyk7Ci0gICBFTkRJRjsKLSAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7Ci0gICBRVUlUCi0kICBFT0QKLSQKLSRlbHNlCi0kCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIGZvciBWYXggdGFyZ2V0IgotJCB0YXJnZXQgPSAidmF4IgotJCEKLSQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKLSQhCi0kIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KLSAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCi0kREVDSwotIQotISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCi0hCi0hCi0gICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0KLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQodmVycyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCczMicpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCcwJyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKLSAgICAgIFNQTElUX0xJTkU7Ci0gICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kZW5kaWYKLSQKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGBiZmQuaCcgZnJvbSBgYmZkLWluMi5oJy4iCi0kIQotJCEKLSQhIGNyZWF0ZSB0YXJnbWF0Y2guaAotJCEKLSQgb3Blbi93cml0ZSB0ZmlsZSBbXXRhcmdtYXRjaC5oCi0kIHdyaXRlIHRmaWxlICJ7ICIiIiArIHRhcmdldCArICItKi0qdm1zKiIiIiArICIsIgotJCB3cml0ZSB0ZmlsZSAiI2lmIGRlZmluZWQgKFNFTEVDVF9WRUNTKSIKLSQgd3JpdGUgdGZpbGUgIlNFTEVDVF9WRUNTIgotJCB3cml0ZSB0ZmlsZSAiI2Vsc2UiCi0kIHdyaXRlIHRmaWxlICJVTlNVUFBPUlRFRF9UQVJHRVQiCi0kIHdyaXRlIHRmaWxlICIjZW5kaWYiCi0kIHdyaXRlIHRmaWxlICJ9LCIKLSQgY2xvc2UgdGZpbGUKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGB0YXJnbWF0Y2guaCciCi0kIQotJCEKLSQhIGNyZWF0ZSBjb25maWcuaAotJCEKLSQgY3JlYXRlIFtdY29uZmlnLmgKLS8qIGNvbmZpZy5oLXZtcy4gIEdlbmVyYXRlZCBieSBoYW5kIGJ5IEtsYXVzIEvkbXBmLCBra2FlbXBmQGRpZHltdXMucm1pLmRlLiAgKi8KLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotLyogV2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwotLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DICovCi0vKiBXaGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwotLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRSAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotLyogI2RlZmluZSBIQVZFX01NQVAgMSAqLwotLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi0vKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwotLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICAqLwotLyogI3VuZGVmIFRSQURfSEVBREVSICovCi0vKiBEZWZpbmUgb25seSBpZiA8c3lzL3Byb2Nmcy5oPiBpcyBhdmFpbGFibGUgKmFuZCogaXQgZGVmaW5lcyBwcnN0YXR1c190LiAgKi8KLS8qICN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSCAqLwotLyogRG8gd2UgcmVhbGx5IHdhbnQgdG8gdXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICAqLwotLyogI3VuZGVmIFVTRV9NTUFQICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX01BRFZJU0UgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtcHJvdGVjdCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfTVBST1RFQ1QgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERERUZfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1RJTUVfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLSQhCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgY29uZmlnLmgnIgotCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmhvc3QgYi9iZmQvY29uZmlndXJlLmhvc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNGNkNjAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5ob3N0CisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBvdmVycmlkZXMgc29tZSBvZiB0aGUgdG9vbHMgYW5kCi0jIGZsYWdzIHVzZWQgb24gYSBob3N0IHNwZWNpZmljIGJhc2lzLgotCi0jIFNpbmNlIHRoZSAiYmZkL2hvc3RzIiBkaXJlY3RvcnkgaXMgc2hhcmVkIGJ5IHRoZSBiZmQsIG9wY29kZXMsIGFuZAotIyBiaW51dGlscyBkaXJlY3RvcmllcyAoYXQgbGVhc3QpLCB0aGUgaW5kZXggdG8gaXQgaXMgYWxzbyBzaGFyZWQuCi0jIFRoaXMgaXMgdGhhdCBpbmRleC4gIEVhY2ggY29uZmlndXJlLmluIGZpbGUgc2hvdWxkIHNvdXJjZSB0aGlzIGZpbGUKLSMgaW4gaXRzIHBlci1ob3N0IHBhcnQuCi0KLSMgVGhpcyBzZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgSERFRklORVMJCWhvc3Qgc3BlY2lmaWMgY29tcGlsZXIgb3B0aW9ucwotIyAgaG9zdDY0CQlzZXQgdG8gdHJ1ZSBpZiA2NCBiaXQgdHlwZXMgYXJlIGFzIGZhc3QgYXMgMzIgYml0Ci0jICBIT1NUXzY0QklUX1RZUEUJaG9zdCA2NCBiaXQgdHlwZQotIyAgSE9TVF9VXzY0QklUX1RZUEUJdW5zaWduZWQgNjQgYml0IHR5cGUgKG5vdCBuZWVkZWQgaWYgNjRCSVRfVFlQRSBpcyBsb25nKQotCi1IREVGSU5FUz0KLWhvc3Q2ND1mYWxzZQotSE9TVF82NEJJVF9UWVBFPQotSE9TVF9VXzY0QklUX1RZUEU9Ci0KLWNhc2UgIiR7aG9zdH0iIGluCi0KLWFscGhhKi0qLSopCQlob3N0NjQ9dHJ1ZTsgSE9TVF82NEJJVF9UWVBFPWxvbmcgOzsKLQotaHBwYSotKi1ocHV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OwotaHBwYSotKi1oaXV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OwotaHBwYSotKi1tcGVpeCopCQlIREVGSU5FUz0tREhPU1RfSFBQQU1QRUlYIDs7Ci1ocHBhKi0qLWJzZCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUJTRCA7OwotaHBwYSotKi1vc2YqKQkJSERFRklORVM9LURIT1NUX0hQUEFPU0YgOzsKLQotaVszNDU2XTg2LXNlcXVlbnQtYnNkKikJSERFRklORVM9LURzaGFyZWQ9Z2Vuc2hhcmVkIDs7Ci1pWzM0NTZdODYtc2VxdWVudC1zeXN2NCopIDs7Ci1pWzM0NTZdODYtc2VxdWVudC1zeXN2KikJSERFRklORVM9LURzaGFyZWQ9Z2Vuc2hhcmVkIDs7Ci0KLW1pcHMqLWRlYy1uZXRic2QqKQk7OwotbWlwcyotKi1vcGVuYnNkKikJOzsKLW1pcHMqLWRlYy0qKQkJSERFRklORVM9Ii1HIDQiCTs7Ci1taXBzKi1zZ2ktaXJpeDMqKQlIREVGSU5FUz0iLUcgNCIgOzsKLW1pcHMqLXNnaS1pcml4NCopCUhERUZJTkVTPSItRyA0IiA7OwotbWlwcyotc2dpLWlyaXg2KikJaG9zdDY0PXRydWUKLQkJCUhPU1RfNjRCSVRfVFlQRT0ibG9uZyBsb25nIjsKLQkJCUhPU1RfVV82NEJJVF9UWVBFPSJ1bnNpZ25lZCBsb25nIGxvbmciOwotCQkJOzsKLW1pcHMqLSotc3lzdjQqKQkJOzsKLW1pcHMqLSotc3lzdiopCQlIREVGSU5FUz0iLUcgNCIgOzsKLW1pcHMqLSotcmlzY29zKikJSERFRklORVM9Ii1HIDQiIDs7Ci0KLW02OCotaHAtaHB1eCopCQlIREVGSU5FUz0tREhPU1RfSFAzMDBIUFVYIDs7Ci0KLSotKi1zb2xhcmlzKikJCUhPU1RfNjRCSVRfVFlQRT0ibG9uZyBsb25nIgotCQkJSE9TVF9VXzY0QklUX1RZUEU9InVuc2lnbmVkIGxvbmcgbG9uZyIKLQkJCTs7Ci0KLSotKi13aW5kb3dzKikKLQkJCUhPU1RfNjRCSVRfVFlQRT1fX2ludDY0Ci0JCQlIT1NUX1VfNjRCSVRfVFlQRT0idW5zaWduZWQgX19pbnQ2NCIKLSMgVGhlIGZvbGxvd2luZyBrcm9jayBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBjYW4ndCBydW4gdGhlIGJ1aWxkIGNvbXBpbGVyCi0jIChNU1ZDKSBvbiB0aGUgY29uZmlndXJlIGhvc3QsIHNvIHdlIGhhdmUgdG8gZXhwbGljaXRseSBzZXQgdGhlIHZhbHVlcyBoZXJlLgotIyBOb3RlIHRoYXQgdGhpcyBmaWxlIGlzIG5ldmVyIHJ1biB0aHJvdWdoIGF1dG9jb25mLCBzbyB3ZSBjYW4ndCB1c2UgYW55Ci0jIGF1dG9jb25mIG1hY3JvcyBoZXJlLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBoYXZlIHRvIG11Y2sgd2l0aCBhdXRvY29uZgotIyB2YXJpYWJsZXMgZXhwbGljaXRseS4KLQkJCWFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLQkJCWFjX2N2X2hlYWRlcl90aW1lPW5vCi0JCQlhY19jdl9mdW5jX2dldHBhZ2VzaXplPW5vCi0JCQlhY19jdl9mdW5jX21hZHZpc2U9bm8KLQkJCWFjX2N2X2Z1bmNfbXByb3RlY3Q9bm8KLQkJCWFjX2N2X2Z1bmNfZ2V0dWlkPW5vCi0JCQlhY19jdl9mdW5jX2dldGdpZD1ubwotCQkJYWNfY3ZfaGVhZGVyX3N5c19maWxlX2g9bm8KLQkJCWFjX2N2X2hlYWRlcl9zeXNfdGltZV9oPW5vCi0JCQlhY19jdl9oZWFkZXJfdW5pc3RkX2g9bm8KLQkJCTs7Ci1lc2FjCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmluIGIvYmZkL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmM2VmNi4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChsaWJiZmQuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotQUNfSVNDX1BPU0lYCi0KLUFNX0lOSVRfQVVUT01BS0UoYmZkLCAyLjkuNCkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLUFNX0RJU0FCTEVfU0hBUkVECi0KLUFNX1BST0dfTElCVE9PTAotCi1BQ19BUkdfRU5BQkxFKDY0LWJpdC1iZmQsCi1bICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbikgOzsKLWVzYWNdLFt3YW50NjQ9ZmFsc2VdKWRubAotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi1BQ19BUkdfV0lUSChtbWFwLAotWyAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGVdLAotW2Nhc2UgIiR7d2l0aHZhbH0iIGluCi0gIHllcykgIHdhbnRfbW1hcD10cnVlIDs7Ci0gIG5vKSAgIHdhbnRfbW1hcD1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEJGRCB3aXRoLW1tYXAgb3B0aW9uKSA7OwotZXNhY10sW3dhbnRfbW1hcD1mYWxzZV0pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLUFDX0FSR19QUk9HUkFNCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLWhvc3Q2ND1mYWxzZQotdGFyZ2V0NjQ9ZmFsc2UKLQotIyBob3N0IHN0dWZmOgotCi1BQ19QUk9HX0NDCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotIyBQZXJtaXQgaG9zdCBzcGVjaWZpYyBzZXR0aW5ncy4KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQUNfUFJPR19JTlNUQUxMCi0KLUJGRF9IT1NUXzY0QklUX0xPTkc9MAotQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MAotQkZEX0hPU1RfNjRfQklUPQotQkZEX0hPU1RfVV82NF9CSVQ9Ci1pZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiA9ICJ4bG9uZyI7IHRoZW4KLSAgQkZEX0hPU1RfNjRCSVRfTE9ORz0xCi1lbGlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iICE9ICJ4IjsgdGhlbgotICBCRkRfSE9TVF82NF9CSVRfREVGSU5FRD0xCi0gIEJGRF9IT1NUXzY0X0JJVD0ke0hPU1RfNjRCSVRfVFlQRX0KLSAgQkZEX0hPU1RfVV82NF9CSVQ9JHtIT1NUX1VfNjRCSVRfVFlQRX0KLWZpCi1BQ19TVUJTVChCRkRfSE9TVF82NEJJVF9MT05HKQotQUNfU1VCU1QoQkZEX0hPU1RfNjRfQklUX0RFRklORUQpCi1BQ19TVUJTVChCRkRfSE9TVF82NF9CSVQpCi1BQ19TVUJTVChCRkRfSE9TVF9VXzY0X0JJVCkKLQotQkZEX0NDX0ZPUl9CVUlMRAotCi1BQ19DSEVDS19IRUFERVJTKHN0ZGRlZi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB0aW1lLmggdW5pc3RkLmgpCi1BQ19DSEVDS19IRUFERVJTKGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oKQotQUNfSEVBREVSX1RJTUUKLUFDX0hFQURFUl9ESVJFTlQKLUFDX0NIRUNLX0ZVTkNTKGZjbnRsIGdldHBhZ2VzaXplIHNldGl0aW1lciBzeXNjb25mIGZkb3BlbiBnZXR1aWQgZ2V0Z2lkKQotCi1CRkRfQklOQVJZX0ZPUEVOCi0KLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHN0cnN0cikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKG1hbGxvYykKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHJlYWxsb2MpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihmcmVlKQotQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KQotCi0jIElmIHdlIGFyZSBjb25maWd1cmVkIG5hdGl2ZSwgcGljayBhIGNvcmUgZmlsZSBzdXBwb3J0IGZpbGUuCi1DT1JFRklMRT0KLUNPUkVGTEFHPQotVFJBRF9IRUFERVI9Ci1pZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gIGFscGhhKi0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9hbHBoYWxpbnV4LmgiJwotCTs7Ci0gIGFscGhhKi0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIGFscGhhKi0qLSopCQlDT1JFRklMRT1vc2YtY29yZS5sbyA7OwotICBhcm0tKi1yaXNjaXgpCQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaHBwYSotKi1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaGl1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLW1wZWl4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotYnNkKikJCUNPUkVGSUxFPSJocHV4LWNvcmUubG8gaHBwYWJzZC1jb3JlLmxvIgotCQkJQ09SRUZMQUc9Ii1ESFBVWF9DT1JFIC1ESFBQQUJTRF9DT1JFIiA7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG87Ci0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdjQqKSA7OwotICBpWzM0NTZdODYtc2VxdWVudC1zeXN2KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2YnNkLmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1uZXRic2QqIHwgaVszNDU2XTg2LSotb3BlbmJzZCopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LWVzaXgtc3lzdjMqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZXNpeC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXNjbzUtY29yZS5sbwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZzY28uaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLW1hY2gzKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZtYWNoMy5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZsaW51eC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotaXNjKikJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFpeCopCUNPUkVGSUxFPWFpeDM4Ni1jb3JlLmxvIDs7Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIGk4NjAtKi1tYWNoMyogfCBpODYwLSotb3NmMSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pODYwbWFjaDMuaCInCi0JOzsKLSAgbWlwcy1kZWMtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNic2QuaCInCi0JOzsKLSAgbWlwcy1kZWMtbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJwotCTs7Ci0gIG1pcHMtKi1uZXRic2QqIHwgbWlwcyotKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIG1pcHMtZGVjLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kZWNzdGF0aW9uLmgiJwotCTs7Ci0gIG1pcHMtc2dpLWlyaXg0KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtc2dpLWlyaXg1KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtc2dpLWlyaXg2KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLXN5c3Y0KikJOzsKLSAgbWlwcy0qLXN5c3YqIHwgbWlwcy0qLXJpc2NvcyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9yaXNjb3MuaCInCi0JOzsKLSAgbWlwcy1zb255LWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLW1pcHMuaCInCi0JOzsKLSAgbTY4Ki1idWxsKi1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RweDIuaCInCi0JOzsKLSAgbTY4Ki1ocC1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIG02OCotaHAtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2hwMzAwYnNkLmgiJwotCTs7Ci0gIG02OCotKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2xpbnV4LmgiJwotCTs7Ci0gIG02OCotbW90b3JvbGEtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kZWx0YTY4LmgiJwotCTs7Ci0gIG02OCotc29ueS0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy5oIicKLQk7OwotICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIG02OCotYXBwbGUtYXV4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL202OGthdXguaCInCi0JOzsKLSAgbTg4Ki0qLXN5c3Y0KikJOzsKLSAgbTg4Ki1tb3Rvcm9sYS1zeXN2KikJQ09SRUZJTEU9cHRyYWNlLWNvcmUubG8gOzsKLSAgbTg4Ki0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL204OGttYWNoMy5oIicKLQk7OwotICBuczMyay1wYzUzMi1tYWNoKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvcGM1MzJtYWNoLmgiJwotCTs7Ci0gIG5zMzJrLSotbmV0YnNkKiB8IG5zMzJrLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICByczYwMDAtKi1seW54KikJQ09SRUZJTEU9bHlueC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICByczYwMDAtKi0qKQkJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLSpic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXgqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYmVvcyopCTs7Ci0gIHBvd2VycGMtKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBzcGFyYy0qLW5ldGJzZCogfCBzcGFyYy0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgdGFob2UtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdGFob2UuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4MiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXhic2QuaCInCi0JOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRDT1JFRklMRSIgaW4KLSAgYWl4Mzg2LWNvcmUubG8pCUNPUkVGTEFHPS1EQUlYMzg2X0NPUkUgOzsKLSAgaHBwYWJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tREhQUEFCU0RfQ09SRSA7OwotICBocHV4LWNvcmUubG8pCQlDT1JFRkxBRz0tREhQVVhfQ09SRSA7OwotICBpcml4LWNvcmUubG8pCQlDT1JFRkxBRz0tRElSSVhfQ09SRSA7OwotICBseW54LWNvcmUubG8pCQlDT1JFRkxBRz0tRExZTlhfQ09SRSA7OwotICBuZXRic2QtY29yZS5sbykJQ09SRUZMQUc9LURORVRCU0RfQ09SRSA7OwotICBvc2YtY29yZS5sbykJCUNPUkVGTEFHPS1ET1NGX0NPUkUgOzsKLSAgcHRyYWNlLWNvcmUubG8pCUNPUkVGTEFHPS1EUFRSQUNFX0NPUkUgOzsKLSAgcnM2MDAwLWNvcmUubG8pCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURBSVhfQ09SRSIgOzsKLSAgc2NvNS1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFNDTzVfQ09SRSIgOzsKLSAgdHJhZC1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFRSQURfQ09SRSIgOzsKLSAgZXNhYwotCi0gICMgRUxGIGNvcmVmaWxlIHN1cHBvcnQgaGFzIHNldmVyYWwgZmxhdm9ycywgYnV0IGFsbCBvZgotICAjIHRoZW0gdXNlIHNvbWV0aGluZyBjYWxsZWQgPHN5cy9wcm9jZnMuaD4KLSAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvcHJvY2ZzLmgpCi0gIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Byb2Nmc19oIiA9IHllczsgdGhlbgotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwcnN0YXR1c190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIocHJzdGF0dXNfdCwgcHJfd2hvKQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwc3RhdHVzX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBycHNpbmZvX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBzaW5mb190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShsd3BzdGF0dXNfdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKGx3cHN0YXR1c190LCBwcl9jb250ZXh0KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIobHdwc3RhdHVzX3QsIHByX3JlZykKLSAgZmkKLWZpCi1BQ19TVUJTVChDT1JFRklMRSkKLUFDX1NVQlNUKENPUkVGTEFHKQotQUNfREVGSU5FX1VOUVVPVEVEKFRSQURfSEVBREVSLCAkVFJBRF9IRUFERVIsCi0gIFtOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy5dKQotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiAtbGtlcm5lbDMyIgotICBmaQotICA7OwotZXNhYwotQUNfU1VCU1QoV0lOMzJMREZMQUdTKQotQUNfU1VCU1QoV0lOMzJMSUJBREQpCi0KLSMgdGFyZ2V0IHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1kZWZ2ZWM9Ci1zZWx2ZWNzPQotc2VsYXJjaHM9Ci1UREVGSU5FUz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0gICAgZWxzZQotCS4gJHNyY2Rpci9jb25maWcuYmZkCi0JaWYgdGVzdCAieCR0YXJnIiA9ICJ4JHRhcmdldCI7IHRoZW4KLQkgICAgZGVmdmVjPSR0YXJnX2RlZnZlYwotCWZpCi0Jc2VsdmVjcz0iJHNlbHZlY3MgJHRhcmdfZGVmdmVjICR0YXJnX3NlbHZlY3MiCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLQlUREVGSU5FUz0iJFRERUZJTkVTICR0YXJnX2NmbGFncyIKLSAgICBmaQotZG9uZQotQUNfU1VCU1QoVERFRklORVMpCi0KLSMgVGhpcyBwcm9jZXNzaW5nIHN0aWxsIG5lZWRzIHRvIGJlIGRvbmUgaWYgd2UncmUgdG8gZGVjaWRlIHByb3Blcmx5IHdoZXRoZXIKLSMgNjQtYml0IHN1cHBvcnQgbmVlZHMgdG8gYmUgY29tcGlsZWQgaW4uICBDdXJyZW50bHksIGl0IHdpbGwgYmUgaW5jbHVkZWQgaWYKLSMgdGhlIGRlZmF1bHQgb3IgYW55IG90aGVyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHRhcmdldCByZXF1aXJlcyBpdDsgaXQKLSMgd2lsbCBub3QgYmUgaW5jbHVkZWQgb24gYSAzMi1iaXQgaG9zdCBpZiBubyA2NC1iaXQgdGFyZ2V0IGlzIHJlcXVlc3RlZCwgYW5kCi0jIG5vICItLXdpdGgtNjQtYml0LWJmZCIgb3B0aW9uIGlzIGdpdmVuLCBldmVuIGlmICItLXdpdGgtdGFyZ2V0cz1hbGwiIGlzCi0jIHVzZWQuCi0KLSMgdW5pcSB0aGUgZGVmYXVsdCBhbmQgc2VsZWN0ZWQgdmVjdG9ycyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWx2ZWNzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbHZlY3M9IiRmIgotCi0KLSMgdW5pcSB0aGUgYXJjaGl0ZWN0dXJlcyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWxhcmNocyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWxhcmNocz0iJGYiCi0KLSMgVGFyZ2V0IGJhY2tlbmQgLm8gZmlsZXMuCi10Yj0KLQotZWxmPSJlbGYubG8gZWxmbGluay5sbyBkd2FyZjIubG8gZHdhcmYxLmxvIgotCi1mb3IgdmVjIGluICRzZWx2ZWNzCi1kbwotICAgIGNhc2UgIiR2ZWMiIGluCi0gICAgIyBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlCi0gICAgIyB3aXRoIHRoZSB0d28gdmVjdG9yIGxpc3RzIGluIHRhcmdldHMuYy4KLSAgICBhMjlrY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWEyOWsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYV9vdXRfYWRvYmVfdmVjKQkJdGI9IiR0YiBhb3V0LWFkb2JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhcm1jb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1jb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9iaWdfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYykJdGI9IiR0YiBlcG9jLXBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYW91dDBfYmlnX3ZlYykJCXRiPSIkdGIgYW91dDAubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfYXJtX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQtYXJtLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9saXR0bGVfdmVjKQl0Yj0iJHRiIGFvdXQtYXJtLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X21pcHNfYmlnX3ZlYykJCXRiPSIkdGIgbWlwc2JzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2xpdHRsZV92ZWMpCXRiPSIkdGIgbWlwc2JzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXBvbGxvY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXBvbGxvLmxvIiA7OwotICAgIGJfb3V0X3ZlY19iaWdfaG9zdCkJCXRiPSIkdGIgYm91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYl9vdXRfdmVjX2xpdHRsZV9ob3N0KQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJmZF9lbGY2NF9hbHBoYV92ZWMpCXRiPSIkdGIgZWxmNjQtYWxwaGEubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMpCXRiPSIkdGIgZWxmMzItYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMpCXRiPSIkdGIgZWxmYXJtLW5hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKSB0Yj0iJHRiIGVsZmFybS1vYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FyY192ZWMpCXRiPSIkdGIgZWxmMzItYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV92ZWMpCXRiPSIkdGIgZWxmYXJtLW5hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjKQl0Yj0iJHRiIGVsZmFybS1vYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmMzItZ2VuLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ21pcHNfdmVjKSAJdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmMzJfZDEwdl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWQxMHYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfZDMwdl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWQzMHYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfZnIzMF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWZyMzAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaHBwYV92ZWMpCQl0Yj0iJHRiIGVsZjMyLWhwcGEubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWkzODYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTg2MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWk4NjAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTk2MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWk5NjAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX20zMnJfdmVjKQkJdGI9IiR0YiBlbGYzMi1tMzJyLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX202OGtfdmVjKQkJdGI9IiR0YiBlbGYzMi1tNjhrLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX204OGtfdmVjKQkJdGI9IiR0YiBlbGYzMi1tODhrLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlbGYzMi1tY29yZS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMjAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMjAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21uMTAzMDBfdmVjKQl0Yj0iJHRiIGVsZi1tMTAzMDAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY192ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3NoX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zaGxfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NwYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1zcGFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl92ODUwX3ZlYykJCXRiPSIkdGIgZWxmMzItdjg1MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjY0LXNwYXJjLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGNpc2NvX2NvcmVfdmVjKQkJdGI9IiR0YiBjaXNjby1jb3JlLmxvIiA7OwotICAgIGRlbW9fNjRfdmVjKQkJdGI9IiR0YiBkZW1vNjQubG8gYW91dDY0LmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBlY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7Ci0gICAgZWNvZmZfYmlnbGl0dGxlX3ZlYykJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYykJdGI9IiR0YiBjb2ZmLWFscGhhLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZ28zMmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgZ28zMnN0dWJiZWRjb2ZmX3ZlYykJdGI9IiR0YiBjb2ZmLXN0Z28zMi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBoODMwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWg4MzAwLmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgaDg1MDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODUwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGhvc3RfYW91dF92ZWMpCQl0Yj0iJHRiIGhvc3QtYW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaHAzMDBic2RfdmVjKQkJdGI9IiR0YiBocDMwMGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaHAzMDBocHV4X3ZlYykJCXRiPSIkdGIgaHAzMDBocHV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2YW91dF92ZWMpCQl0Yj0iJHRiIGkzODZhb3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2YnNkX3ZlYykJCXRiPSIkdGIgaTM4NmJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWkzODYubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmR5bml4X3ZlYykJCXRiPSIkdGIgaTM4NmR5bml4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2ZnJlZWJzZF92ZWMpCQl0Yj0iJHRiIGkzODZmcmVlYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bXNkb3NfdmVjKQkJdGI9IiR0YiBpMzg2bXNkb3MubG8iIDs7Ci0gICAgaTM4NnBlX3ZlYykJCQl0Yj0iJHRiIHBlLWkzODYubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGkzODZwZWlfdmVjKQkJdGI9IiR0YiBwZWktaTM4Ni5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpMzg2bGludXhfdmVjKQkJdGI9IiR0YiBpMzg2bGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBpMzg2bHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1pMzg2bHlueC5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgaTM4Nm1hY2gzX3ZlYykJCXRiPSIkdGIgaTM4Nm1hY2gzLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bmV0YnNkX3ZlYykJCXRiPSIkdGIgaTM4Nm5ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm9zOWtfdmVjKQkJdGI9IiR0YiBpMzg2b3M5ay5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTg2MGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWk4NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1pOTYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpZWVlX3ZlYykJCQl0Yj0iJHRiIGllZWUubG8iIDs7Ci0gICAgbTY4a2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbTY4a2NvZmZ1bl92ZWMpCQl0Yj0iJHRiIGNvZmYtdTY4ay5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbTY4a2xpbnV4X3ZlYykJCXRiPSIkdGIgbTY4a2xpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrbHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgbTY4a2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrbHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtbTY4a2x5bngubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBtNjhrbmV0YnNkX3ZlYykJCXRiPSIkdGIgbTY4a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4azRrbmV0YnNkX3ZlYykJCXRiPSIkdGIgbTY4azRrbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrYXV4X2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWF1eC5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbTY4a3N5c3Zjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zdm02OGsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbTg4a2Jjc192ZWMpCQl0Yj0iJHRiIGNvZmYtbTg4ay5sbyIgOzsKLSAgICBtY29yZV9wZV9iaWdfdmVjKQkJdGI9IiR0YiBwZS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9iaWdfdmVjKQkJdGI9IiR0YiBwZWktbWNvcmUubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgcGVpLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG5ld3NvczNfdmVjKQkJdGI9IiR0YiBuZXdzb3MzLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBubG0zMl9pMzg2X3ZlYykJCXRiPSIkdGIgbmxtMzItaTM4Ni5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgbmxtMzJfc3BhcmNfdmVjKQkJdGI9IiR0YiBubG0zMi1zcGFyYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgbmxtMzJfYWxwaGFfdmVjKQkJdGI9IiR0YiBubG0zMi1hbHBoYS5sbyBubG0zMi5sbyBubG0ubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHJpc2NpeF92ZWMpCQkJdGI9IiR0YiBhb3V0MzIubG8gcmlzY2l4LmxvIiA7OwotICAgIG5sbTMyX3Bvd2VycGNfdmVjKQkJdGI9IiR0YiBubG0zMi1wcGMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIHBjNTMybmV0YnNkX3ZlYykJCXRiPSIkdGIgbnMzMmtuZXRic2QubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwYzUzMm1hY2hhb3V0X3ZlYykJCXRiPSIkdGIgcGM1MzItbWFjaC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBtYWNfeGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXBtYWMubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIHJzNjAwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXJzNjAwMC5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNfcGVfdmVjKSAgICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIGNvZmZsaW5rLmxvIiA7OyAgCi0gICAgYmZkX3Bvd2VycGNsZV9wZV92ZWMpICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIGNvZmZsaW5rLmxvIiA7OyAgCi0gICAgYmZkX3Bvd2VycGNfcGVpX3ZlYykgICAgICAgIHRiPSIkdGIgcGVpLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY2xlX3BlaV92ZWMpICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHBwY2Jvb3RfdmVjKQkJdGI9IiR0YiBwcGNib290LmxvIiA7OwotICAgIHNoY29mZl92ZWMpCQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNoY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hsY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc29tX3ZlYykJCQl0Yj0iJHRiIHNvbS5sbyIgOzsKLSAgICBzcGFyY2xlX2FvdXRfdmVjKQkJdGI9IiR0YiBhb3V0LXNwYXJjbGUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbGludXhfdmVjKQkJdGI9IiR0YiBzcGFyY2xpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIHNwYXJjbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2Ytc3BhcmNseW54LmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBzcGFyY25ldGJzZF92ZWMpCQl0Yj0iJHRiIHNwYXJjbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNwYXJjLmxvIiA7OwotICAgIHNyZWNfdmVjKQkJCXRiPSIkdGIgc3JlYy5sbyIgOzsKLSAgICBzdW5vc19iaWdfdmVjKQkJdGI9IiR0YiBzdW5vcy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3ltYm9sc3JlY192ZWMpCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgdGVraGV4X3ZlYykJCQl0Yj0iJHRiIHRla2hleC5sbyIgOzsKLSAgICB0aWMzMF9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC10aWMzMC5sbyIgOzsKLSAgICB0aWMzMF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWMzMC5sbyIgOzsKLSAgICB0aWM4MGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzgwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHZlcnNhZG9zX3ZlYykJCXRiPSIkdGIgdmVyc2Fkb3MubG8iIDs7Ci0gICAgdm1zX2FscGhhX3ZlYykJCXRiPSIkdGIgdm1zLmxvIHZtcy1oZHIubG8gdm1zLWdzZC5sbyB2bXMtdGlyLmxvIHZtcy1taXNjLmxvIgotIAkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgdm1zX3ZheF92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIgOzsKLSAgICB3NjVfdmVjKQkJCXRiPSIkdGIgY29mZi13NjUubG8gcmVsb2MxNi5sbyIgOzsKLSAgICB3ZTMya2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXdlMzJrLmxvIiA7OwotICAgIHo4a2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXo4ay5sbyByZWxvYzE2LmxvIiA7OwotCi0gICAgIiIpCQkJOzsKLSAgICAqKSBBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IHZlY3RvciAkdmVjKSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBBQ19NU0dfV0FSTihbWW91IGhhdmUgcmVxdWVzdGVkIGEgNjQgYml0IEJGRCBjb25maWd1cmF0aW9uLCBidXRdKQotICAgICAgQUNfTVNHX1dBUk4oW3lvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGVdKQotICAgIGZpCi0gICAgOzsKLSAgZmFsc2UtZmFsc2UtZmFsc2UpCi0gICAgd29yZHNpemU9MzIKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZEMzJfQkFDS0VORFMpJwotICAgIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKHdvcmRzaXplKQotQUNfU1VCU1QoYWxsX2JhY2tlbmRzKQotQUNfU1VCU1QoYmZkX2JhY2tlbmRzKQotQUNfU1VCU1QoYmZkX21hY2hpbmVzKQotCi10ZGVmYXVsdHM9IiIKLXRlc3QgLW4gIiR7ZGVmdmVjfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURERUZBVUxUX1ZFQ1RPUj0ke2RlZnZlY30iCi10ZXN0IC1uICIke3NlbHZlY3N9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9WRUNTPScke3NlbHZlY3N9JyIKLXRlc3QgLW4gIiR7c2VsYXJjaHN9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9BUkNISVRFQ1RVUkVTPScke3NlbGFyY2hzfSciCi10ZXN0IC1uICIke2hhdmV2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gJHtoYXZldmVjc30iCi1BQ19TVUJTVCh0ZGVmYXVsdHMpCi0KLWRubCBBQ19DSEVDS19IRUFERVJTKHN5cy9tbWFuLmgpCi1BQ19GVU5DX01NQVAKLUFDX0NIRUNLX0ZVTkNTKG1hZHZpc2UgbXByb3RlY3QpCi1jYXNlICR7d2FudF9tbWFwfSske2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWR9IGluCi0gIHRydWUreWVzICkgIEFDX0RFRklORShVU0VfTU1BUCwgMSwgW1VzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlP10pIDs7Ci1lc2FjCi0KLXJtIC1mIGRvYy9jb25maWcuc3RhdHVzCi1BQ19PVVRQVVQoTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvYmZkL2NvcmVmaWxlLmMgYi9iZmQvY29yZWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyZjUxOS4uMDAwMDAwMAotLS0gYS9iZmQvY29yZWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBDb3JlIGZpbGUgZ2VuZXJpYyBpbnRlcmZhY2Ugcm91dGluZXMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JQ29yZSBmaWxlcwotCi1ERVNDUklQVElPTgotCVRoZXNlIGFyZSBmdW5jdGlvbnMgcGVydGFpbmluZyB0byBjb3JlIGZpbGVzLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSByZWFkLW9ubHkgc3RyaW5nIGV4cGxhaW5pbmcgd2hpY2ggcHJvZ3JhbSB3YXMgcnVubmluZwotCXdoZW4gaXQgZmFpbGVkIGFuZCBwcm9kdWNlZCB0aGUgY29yZSBmaWxlIEB2YXJ7YWJmZH0uCi0KLSovCi0KLUNPTlNUIGNoYXIgKgotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwgKGFiZmQpKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi1TWU5PUFNJUwotCWludCBiZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBjYXVzZWQgdGhlIGNvcmUgZHVtcCB3aGljaAotCWdlbmVyYXRlZCB0aGUgZmlsZSB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgYXR0YWNoZWQgdG8uCi0qLwotCi1pbnQKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCAoYWJmZCkpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi1TWU5PUFNJUwotCWJvb2xlYW4gY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0JCShiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gPDx0cnVlPj4gaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBAdmFye2NvcmVfYmZkfQotCXdhcyBnZW5lcmF0ZWQgYnkgYSBydW4gb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhdHRhY2hlZCB0bwotCUB2YXJ7ZXhlY19iZmR9LCA8PGZhbHNlPj4gb3RoZXJ3aXNlLgotKi8KLWJvb2xlYW4KLWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gICAgaWYgKChjb3JlX2JmZC0+Zm9ybWF0ICE9IGJmZF9jb3JlKSB8fCAoZXhlY19iZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSkgewotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIHJldHVybiBCRkRfU0VORCAoY29yZV9iZmQsIF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AsCi0JCSAgICAgKGNvcmVfYmZkLCBleGVjX2JmZCkpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hMjlrLmMgYi9iZmQvY3B1LWEyOWsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMjVhNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQU1EIDI5MDAwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hMjlrX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9hMjlrLAotICAgIDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgImEyOWsiLAotICAgICJhMjlrIiwKLSAgICA0LAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hbHBoYS5jIGIvYmZkL2NwdS1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODk5MDBiLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQWxwaGEgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE4oQklUU19XT1JELCBCSVRTX0FERFIsIE5VTUJFUiwgUFJJTlQsIERFRkFVTFQsIE5FWFQpIFwKLSAgewkJCQkJCQlcCi0gICAgQklUU19XT1JELCAvKiBiaXRzIGluIGEgd29yZCAqLwkJCVwKLSAgICBCSVRTX0FERFIsIC8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkJCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkJCVwKLSAgICBiZmRfYXJjaF9hbHBoYSwJCQkJCVwKLSAgICBOVU1CRVIsCQkJCQkJXAotICAgICJhbHBoYSIsCQkJCQkJXAotICAgIFBSSU5ULAkJCQkJCVwKLSAgICAzLAkJCQkJCQlcCi0gICAgREVGQVVMVCwJCQkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCQkJXAotICAgIE5FWFQsCQkJCQkJXAotICB9Ci0KLSNkZWZpbmUgTk4oaW5kZXgpICgmYXJjaF9pbmZvX3N0cnVjdFtpbmRleF0pCi0KLS8qIFRoZXNlIGV4aXN0IG9ubHkgc28gdGhhdCB3ZSBjYW4gcmVzb25hYmx5IGRpc2Fzc2VtYmxlIFBBTGNvZGUuICAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9hbHBoYV9ldjQsICJhbHBoYTpldjQiLCBmYWxzZSwgTk4oMSkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX2FscGhhX2V2NSwgImFscGhhOmV2NSIsIGZhbHNlLCBOTigyKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfYWxwaGFfZXY2LCAiYWxwaGE6ZXY2IiwgZmFsc2UsIDApLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hbHBoYV9hcmNoID0KLSAgTiAoNjQsIDY0LCAwLCAiYWxwaGEiLCB0cnVlLCBOTigwKSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LWFyYy5jIGIvYmZkL2NwdS1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlNTlkNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBUkMgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgQVJDKG1hY2gsIHByaW50X25hbWUsIGRlZmF1bHRfcCwgbmV4dCkgXAotewkJCQkJXAotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwkJXAotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JXAotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCVwKLSAgICBiZmRfYXJjaF9hcmMsCQkJXAotICAgIG1hY2gsCQkJCVwKLSAgICAiYXJjIiwJCQkJXAotICAgIHByaW50X25hbWUsCQkJCVwKLSAgICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwlcCi0gICAgZGVmYXVsdF9wLAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQlcCi0gICAgbmV4dCwJCQkJXAotICB9Ci0KLSNpZiAwIC8qID8/PyBOb3QgY3VycmVudGx5IG5lZWRlZCwgYnV0IGtlZXAgaW4gZm9yIGZ1dHVyZSByZWZlcmVuY2UuICAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICBBUkMgKGJmZF9tYWNoX2FyY19mb28sICJhcmMtZm9vIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgQVJDIChiZmRfbWFjaF9hcmNfYmFyLCAiYXJjLWJhciIsIGZhbHNlLCAwKSwKLX07Ci0jZW5kaWYKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcmNfYXJjaCA9Ci0gIEFSQyAoYmZkX21hY2hfYXJjX2Jhc2UsICJhcmMtYmFzZSIsIHRydWUsIDAgLyomYXJjaF9pbmZvX3N0cnVjdFswXSovKTsKLQwKLS8qIFV0aWxpdHkgcm91dGluZXMuICAqLwotCi0vKiBHaXZlbiBjcHUgdHlwZSBOQU1FLCByZXR1cm4gaXRzIGJmZF9tYWNoX2FyY194eHggdmFsdWUuCi0gICBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotYXJjX2dldF9tYWNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnA7Ci0KLSAgZm9yIChwID0gJmJmZF9hcmNfYXJjaDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiArNDogc2tpcCBvdmVyICJhcmMtIiAqLwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+cHJpbnRhYmxlX25hbWUgKyA0KSA9PSAwKQotCXJldHVybiBwLT5tYWNoOwotICAgIH0KLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hcm0uYyBiL2JmZC9jcHUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTljNDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFSTSBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHNjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHdoaWNoIEFSTQotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYjsKLXsKLSAgLyogSWYgYSAmIGIgYXJlIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIHdlIGNhbiBkbyBub3RoaW5nICovCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBhICYgYiBhcmUgZm9yIHRoZSBzYW1lIG1hY2hpbmUgdGhlbiBhbGwgaXMgd2VsbCAqLwotICBpZiAoYS0+bWFjaCA9PSBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIC8qIE90aGVyd2lzZSBpZiBlaXRoZXIgYSBvciBiIGlzIHRoZSAnZGVmYXVsdCcgbWFjaGluZSB0aGVuCi0gICAgIGl0IGNhbiBiZSBwb2x5bW9ycGhlZCBpbnRvIHRoZSBvdGhlciAqLwotICBpZiAoYS0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGI7Ci0gIAotICBpZiAoYi0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGE7Ci0KLSAgLyogU28gZmFyIGFsbCBuZXdlciBBUk0gYXJjaGl0ZWN0dXJlIGNvcmVzIGFyZSBzdXBlcnNldHMgb2YgcHJldmlvdXMgY29yZXMgKi8KLSAgaWYgKGEtPm1hY2ggPCBiLT5tYWNoKQotICAgIHJldHVybiBiOwotICBlbHNlIGlmIChhLT5tYWNoID4gYi0+bWFjaCkKLSAgICByZXR1cm4gYTsKLQotICAvKiBOZXZlciByZWFjaGVkISAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdAotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgY2hhciAqICAgICAgICAgICAgICAgIG5hbWU7Ci19Ci1wcm9jZXNzb3JzW10gPQotewotICB7IGJmZF9tYWNoX2FybV8yLCAgImFybTIiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTI1MCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTMiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTciICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTcxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTc1MDAiICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkaSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbWkiICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTd0ZG1pIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTkiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTkyMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTkyMHQiICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTl0ZG1pIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInNhMSIgICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybSJ9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybTExMCIgfSwKLSAgeyBiZmRfbWFjaF9hcm1fNCwgICJzdHJvbmdhcm0xMTAwIiB9LAotfTsKLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqIHN0cmluZzsKLXsKLSAgaW50ICBpOwotCi0gIC8qIEZpcnN0IHRlc3QgZm9yIGFuIGV4YWN0IG1hdGNoICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE5leHQgY2hlY2sgZm9yIGEgcHJvY2Vzc29yIG5hbWUgaW5zdGVhZCBvZiBhbiBBcmNoaXRlY3R1cmUgbmFtZSAqLwotICBmb3IgKGkgPSBzaXplb2YgKHByb2Nlc3NvcnMpIC8gc2l6ZW9mIChwcm9jZXNzb3JzWzBdKTsgaS0tOykKLSAgICB7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBwcm9jZXNzb3JzWyBpIF0ubmFtZSkgPT0gMCkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKGkgIT0gLTEgJiYgaW5mby0+YXJjaCA9PSBwcm9jZXNzb3JzWyBpIF0uYXJjaCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaW5hbGx5IGNoZWNrIGZvciB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgImFybSIpID09IDApCi0gICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OwotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9hcm0sIG51bWJlciwgImFybSIsIHByaW50LCA0LCBkZWZhdWx0LCBjb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTiggYmZkX21hY2hfYXJtXzIsICAiYXJtdjIiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFsxXSApLAotICBOKCBiZmRfbWFjaF9hcm1fMmEsICJhcm12MmEiLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzJdICksCi0gIE4oIGJmZF9tYWNoX2FybV8zLCAgImFybXYzIiwgIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbM10gKSwKLSAgTiggYmZkX21hY2hfYXJtXzNNLCAiYXJtdjNtIiwgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs0XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNCwgICJhcm12NCIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzVdICksCi0gIE4oIGJmZF9tYWNoX2FybV80VCwgImFybXY0dCIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbNl0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzUsICAiYXJtdjUiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs3XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNVQsICJhcm12NXQiLCBmYWxzZSwgTlVMTCApCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FybV9hcmNoID0KLSAgTiggMCwgImFybSIsIHRydWUsICYgYXJjaF9pbmZvX3N0cnVjdFswXSApOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1kMTB2LmMgYi9iZmQvY3B1LWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmZjA4OC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgRDEwViBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2QxMHZfYXJjaCA9IAotewkJCQkJCi0gICAgMTYsCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCQkKLSAgICAxNiwJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCQotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCQotICAgIGJmZF9hcmNoX2QxMHYsCi0gICAgMCwJCQotICAgICJkMTB2IiwJCQkJCi0gICAgImQxMHYiLAkJCQkKLSAgICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwkKLSAgICB0cnVlLAkJCQkKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAJCQotICAgIGJmZF9kZWZhdWx0X3NjYW4sCQkJCi0gICAgMCwJCQkJCi19OwotCmRpZmYgLS1naXQgYS9iZmQvY3B1LWQzMHYuYyBiL2JmZC9jcHUtZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFkZmVlLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNaXRzdWJpc2hpIEQzMFYgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2ggPQotewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX2QzMHYsCi0gICAgMCwKLSAgICAiZDMwdiIsCi0gICAgImQzMHYiLAotICAgIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCi0gICAgdHJ1ZSwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWZyMzAuYyBiL2JmZC9jcHUtZnIzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzIwOGY4Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBGUjMwIHByb2Nlc3Nvci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZnIzMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIGJpdHMgcGVyIHdvcmQgKi8KLSAgMzIsCQkJCS8qIGJpdHMgcGVyIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogYml0cyBwZXIgYnl0ZSAqLwotICBiZmRfYXJjaF9mcjMwLAkJLyogYXJjaGl0ZWN0dXJlICovCi0gIGJmZF9tYWNoX2ZyMzAsCQkvKiBtYWNoaW5lICovCi0gICJmcjMwIiwJCQkvKiBhcmNoaXRlY3R1cmUgbmFtZSAqLwotICAiZnIzMCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgNCwJCQkJLyogc2VjdGlvbiBhbGlnbiBwb3dlciAqLwotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCA/ICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCS8qIGFyY2hpdGVjdHVyZSBjb21wYXJpc29uIGZuICovCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkvKiBzdHJpbmcgdG8gYXJjaGl0ZWN0dXJlIGNvbnZlcnQgZm4gKi8KLSAgTlVMTAkJCQkvKiBuZXh0IGluIGxpc3QgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWg4MzAwLmMgYi9iZmQvY3B1LWg4MzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2I3ZGYuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpIEg4LzMwMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2ggKCk7Ci0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmICgqc3RyaW5nICE9ICdoJyAmJiAqc3RyaW5nICE9ICdIJykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICc4JykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICcvJykKLSAgICBzdHJpbmcrKzsKLQotICBpZiAoKnN0cmluZyAhPSAnMycpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgIT0gJzAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICcwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyA9PSAnLScpCi0gICAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICdoJyB8fCAqc3RyaW5nID09ICdIJykKLSAgICB7Ci0gICAgICByZXR1cm4gKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaDgzMDBoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHJpbmcgPT0gJ3MnIHx8ICpzdHJpbmcgPT0gJ1MnKQotICAgIHsKLSAgICAgIHJldHVybiAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9oODMwMHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBpbmZvLT5tYWNoID09IGJmZF9tYWNoX2g4MzAwOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHdvcmtzIG91dCB0aGUgCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoaW4sIG91dCkKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogaW47Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIG91dDsKLXsKLSAgLyogSXQncyByZWFsbHkgbm90IGEgZ29vZCBpZGVhIHRvIG1peCBhbmQgbWF0Y2ggbW9kZXMuICAqLwotICBpZiAoaW4tPm1hY2ggIT0gb3V0LT5tYWNoKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGg4MzAwX2luZm9fc3RydWN0ID0KLXsKLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDAsCi0gICJoODMwMCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDgzMDAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgMCwKLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgaDgzMDBoX2luZm9fc3RydWN0ID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDBoLAotICAiaDgzMDBoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMGgiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIGZhbHNlLAkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgJmg4MzAwX2luZm9fc3RydWN0LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDBzLAotICAiaDgzMDBzIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMHMiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIGZhbHNlLAkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgJmg4MzAwaF9pbmZvX3N0cnVjdCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWg4NTAwLmMgYi9iZmQvY3B1LWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YWJmZDEuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1oODUwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIOC81MDAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmIDAKLQotLyogCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvMTZfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0KLSAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzE2KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84KGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLQotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9GRm5uX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgICAgICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIGFib3J0KCk7Ci0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIGFib3J0KCk7Ci0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Ci0gID0gTkVXSE9XVE8oaG93dG8xNl9jYWxsYmFjaywiYWJzMTYiLDEsZmFsc2UsZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAotICA9IE5FV0hPV1RPKGhvd3RvOF9jYWxsYmFjaywiYWJzOCIsMCxmYWxzZSxmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgotICA9IE5FV0hPV1RPKGhvd3RvOF9GRm5uX2NhbGxiYWNrLCJmZjAwK2FiczgiLDAsZmFsc2UsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCi0gID0gTkVXSE9XVE8oaG93dG84X3BjcmVsX2NhbGxiYWNrLCJwY3JlbDgiLDAsZmFsc2UsdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkgewotICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICByZXR1cm4gJmhvd3RvXzE2OwotICBjYXNlIEJGRF9SRUxPQ184X0ZGbm46Ci0gICAgcmV0dXJuICZob3d0b184X0ZGbm47Ci0gIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgcmV0dXJuICZob3d0b184OwotICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKLSAgfQotICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOwotfQotI2VuZGlmCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJoOC81MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgaWYgKHN0cmNtcChzdHJpbmcsIkg4LzUwMCIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywiaDg1MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgaWYgKHN0cmNtcChzdHJpbmcsIkg4NTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0jaWYgMCAvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCi0gICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotI2VuZGlmCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDg1MDBfYXJjaCA9Ci17Ci0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwotICAyNCwJCQkJLyogMjQgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaDg1MDAsCi0gIDAsCQkJCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICJoODUwMCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDg1MDAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgc2Nhbl9tYWNoLAotICAwLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaHBwYS5jIGIvYmZkL2NwdS1ocHBhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjZhOTIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1ocHBhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEhQIFByZWNpc2lvbiBBcmNoaXRlY3R1cmUgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9ocHBhMTBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaHBwYSwKLSAgMTAsCQkJCS8qIEJ5IGNvbnZlbnRpb24gUEExLjAgPSAxMCAqLwotICAiaHBwYSIsCi0gICJocHBhMS4wIiwKLSAgMywKLSAgdHJ1ZSwJCQkJLyogVW5sZXNzIHdlIHVzZSAxLjEgc3BlY2lmaWMgZmVhdHVyZXMgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAwLAotfTsKLQotLyogUEEyLjAgaW4gbmFycm93IG1vZGUgKi8KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGEyMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9ocHBhLAotICAyMCwJCQkJLyogQnkgY29udmVudGlvbiBQQTEuMCA9IDEwICovCi0gICJocHBhIiwKLSAgImhwcGEyLjAiLAotICAzLAotICBmYWxzZSwJCQkvKiBVbmxlc3Mgd2UgdXNlIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZiZmRfaHBwYTEwX2FyY2gsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaHBwYSwKLSAgMTEsCQkJCS8qIEJ5IGNvbnZlbnRpb24gUEExLjEgPSAxMSAqLwotICAiaHBwYSIsCi0gICJocHBhMS4xIiwKLSAgMywKLSAgZmFsc2UsCQkJLyogMS4xIHNwZWNpZmljIGZlYXR1cmVzIHVzZWQgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2hwcGEyMF9hcmNoLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTM4Ni5jIGIvYmZkL2NwdS1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjliMTguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEludGVsIDM4NiBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiwgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pMzg2X2FyY2hfaW50ZWxfc3ludGF4ID0KLXsKLSAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4LAotICAiaTM4NjppbnRlbCIsCi0gICJpMzg2OmludGVsIiwKLSAgMywKLSAgdHJ1ZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAwLAotfTsKLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgaTgwODZfYXJjaCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICh3ZWxsLCBub3QgcmVhbGx5KSAqLwotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2kzODYsCi0gIGJmZF9tYWNoX2kzODZfaTgwODYsCi0gICJpODA4NiIsCi0gICJpODA4NiIsCi0gIDMsCi0gIGZhbHNlLAotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTM4Nl9hcmNoID0KLXsKLSAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICBiZmRfbWFjaF9pMzg2X2kzODYsCi0gICJpMzg2IiwKLSAgImkzODYiLAotICAzLAotICB0cnVlLAotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZpODA4Nl9hcmNoLAotfTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1pODYwLmMgYi9iZmQvY3B1LWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjODY3Yy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgSW50ZWwgODYwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ3JlYXRlZCBtb3N0bHkgYnkgc3Vic3RpdHV0aW5nICI4NjAiIGZvciAiMzg2IiBpbiBjcHUtaTM4Ni5jCi0gICBIYXJyeSBEb2xhbiA8ZG9sYW5Ac3NkLmludGVsLmNvbT4sIE9jdG9iZXIgMTk5NQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pODYwX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9pODYwLAotICAgIDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgImk4NjAiLAotICAgICJpODYwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1pOTYwLmMgYi9iZmQvY3B1LWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiMmM3ZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWk5NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgaTk2MCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgYSBzdHJpbmcsIGFuZCB0cmllcyB0byB3b3JrIG91dCBpZiBpdAotICAgY291bGQgcG9zc2libHkgcmVmZXIgdG8gdGhlIGk5NjAgbWFjaGluZSBwb2ludGVkIGF0IGluIHRoZQotICAgaW5mb19zdHJ1Y3QgcG9pbnRlciAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2Nhbl85NjBfbWFjaCAoYXAsIHN0cmluZykKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci0KLSAgLyogTG9vayBmb3IgdGhlIHN0cmluZyBpOTYwLCBvciBzb21lc3VjaCBhdCB0aGUgZnJvbnQgb2YgdGhlIHN0cmluZyAgKi8KLQotICBpZiAoc3RybmNtcCgiaTk2MCIsc3RyaW5nLDQpID09IDApIHsKLSAgICBzdHJpbmcrPTQ7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogbm8gbWF0Y2gsIGNhbiBiZSB1cyAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoc3RyaW5nWzBdID09IDApIHsKLSAgICAvKiBpOTYwIG9uIGl0J3Mgb3duIG1lYW5zIGNvcmUgdG8gdXMqLwotICAgIGlmIChhcC0+bWFjaCA9PSBiZmRfbWFjaF9pOTYwX2NvcmUpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChzdHJpbmdbMF0gIT0gJzonKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN0cmluZysrOwotICBpZiAoc3RyaW5nWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoc3RyaW5nWzBdID09ICdjJyAmJiBzdHJpbmdbMV0gPT0gJ28nICYmIHN0cmluZ1syXSA9PSAncicgJiYKLSAgICAgIHN0cmluZ1szXSA9PSAnZScgJiYgc3RyaW5nWzRdID09ICdcMCcpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLSAgZWxzZSBpZiAoc3RyY21wIChzdHJpbmcsICJrYV9zYSIpID09IDApCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Ffc2E7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3RyaW5nLCAia2Jfc2IiKSA9PSAwKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOwotICBlbHNlIGlmIChzdHJpbmdbMV0gPT0gJ1wwJyB8fCBzdHJpbmdbMl0gIT0gJ1wwJykgLyogcmVzdCBhcmUgMi1jaGFyICovCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2snICYmIHN0cmluZ1sxXSA9PSAnYicpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAncycgJiYgc3RyaW5nWzFdID09ICdiJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdtJyAmJiBzdHJpbmdbMV0gPT0gJ2MnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX21jOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3gnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfeGE7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnYycgJiYgc3RyaW5nWzFdID09ICdhJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jYTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdrJyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3MnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Ffc2E7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaicgJiYgc3RyaW5nWzFdID09ICd4JykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9qeDsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdoJyAmJiBzdHJpbmdbMV0gPT0gJ3gnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2h4OwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobWFjaGluZSA9PSBhcC0+bWFjaCkgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCB3b3JrcyBvdXQgdGhlIGk5NjAKLSAgIG1hY2hpbmUgd2hpY2ggd291bGQgYmUgY29tcGF0aWJsZSB3aXRoIGJvdGggYW5kIHJldHVybnMgYSBwb2ludGVyCi0gICB0byBpdHMgaW5mbyBzdHJ1Y3R1cmUgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotCi0gIC8qIFRoZSBpOTYwIGhhcyBkaXN0aW5jdCBzdWJzcGVjaWVzIHdoaWNoIG1heSBub3QgaW50ZXJicmVlZDoKLQlDT1JFIENBICAgICAgICAgIAotCUNPUkUgS0EgS0IgTUMgWEEKLQlDT1JFIEhYIEpYCi0gICAgIEFueSBhcmNoaXRlY3R1cmUgb24gdGhlIHNhbWUgbGluZSBpcyBjb21wYXRpYmxlLCB0aGUgb25lIG9uCi0gICAgIHRoZSByaWdodCBpcyB0aGUgbGVhc3QgcmVzdHJpY3RpdmUuICAKLSAgICAgCi0gICAgIFdlIHJlcHJlc2VudCB0aGlzIGluZm9ybWF0aW9uIGluIGFuIGFycmF5LCBlYWNoIG1hY2hpbmUgdG8gYSBzaWRlICovCi0KLSNkZWZpbmUgRVJST1IJMAotI2RlZmluZSBDT1JFCWJmZF9tYWNoX2k5NjBfY29yZSAgLyoxKi8gIAotI2RlZmluZSBLQSAJYmZkX21hY2hfaTk2MF9rYV9zYSAvKjIqLyAKLSNkZWZpbmUgS0IgCWJmZF9tYWNoX2k5NjBfa2Jfc2IgLyozKi8KLSNkZWZpbmUgTUMgCWJmZF9tYWNoX2k5NjBfbWMgICAgLyo0Ki8KLSNkZWZpbmUgWEEgCWJmZF9tYWNoX2k5NjBfeGEgICAgLyo1Ki8KLSNkZWZpbmUgQ0EgCWJmZF9tYWNoX2k5NjBfY2EgICAgLyo2Ki8KLSNkZWZpbmUgSlgJYmZkX21hY2hfaTk2MF9qeCAgICAvKjcqLwotI2RlZmluZSBIWAliZmRfbWFjaF9pOTYwX2h4ICAgIC8qOCovCi0jZGVmaW5lIE1BWF9BUkNIICgoaW50KUhYKQotCi0gIHN0YXRpYyBDT05TVCB1bnNpZ25lZCBsb25nIG1hdHJpeFtNQVhfQVJDSCsxXVtNQVhfQVJDSCsxXSA9IAotICAgIHsKLSAgICAgIHsgRVJST1IsCUNPUkUsCUtBLAlLQiwJTUMsCVhBLAlDQSwJSlgsCUhYIH0sCi0gICAgICB7IENPUkUsCUNPUkUsCUtBLAlLQiwJTUMsCVhBLAlDQSwJSlgsCUhYIH0sCi0gICAgICB7IEtBLAlLQSwJS0EsCUtCLAlNQywJWEEsCUVSUk9SLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBLQiwJS0IsCUtCLAlLQiwJTUMsCVhBLAlFUlJPUiwgCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IE1DLAlNQywJTUMsCU1DLAlNQywJWEEsCUVSUk9SLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBYQSwJWEEsCVhBLAlYQSwJWEEsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgQ0EsCUNBLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJQ0EsCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IEpYLAlKWCwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLCAgSlgsCUhYIH0sCi0gICAgICB7IEhYLAlIWCwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlIWCwJSFggfSwKLSAgICB9OwotCi0KLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBtYXRyaXhbYS0+bWFjaF1bYi0+bWFjaF0gPT0gRVJST1IpIAotICAgIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgIHJldHVybiAoYS0+bWFjaCAgPT0gIG1hdHJpeFthLT5tYWNoXVtiLT5tYWNoXSkgPyAgYSA6IGI7Ci0gICAgfQotfQotCi0KLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2goKTsKLSNkZWZpbmUgTihhLGIsZCxuKSBcCi17IDMyLCAzMiwgOCxiZmRfYXJjaF9pOTYwLGEsImk5NjAiLGIsMyxkLGNvbXBhdGlibGUsc2Nhbl85NjBfbWFjaCxuLH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsgCi0gIE4oYmZkX21hY2hfaTk2MF9rYV9zYSwiaTk2MDprYV9zYSIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2tiX3NiLCJpOTYwOmtiX3NiIixmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMl0pLAotICBOKGJmZF9tYWNoX2k5NjBfbWMsICAgImk5NjA6bWMiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFszXSksCi0gIE4oYmZkX21hY2hfaTk2MF94YSwgICAiaTk2MDp4YSIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzRdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2NhLCAgICJpOTYwOmNhIiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbNV0pLAotICBOKGJmZF9tYWNoX2k5NjBfangsICAgImk5NjA6angiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs2XSksCi0gIE4oYmZkX21hY2hfaTk2MF9oeCwJImk5NjA6aHgiLCAgIGZhbHNlLCAwKSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTk2MF9hcmNoID0KLSAgTihiZmRfbWFjaF9pOTYwX2NvcmUsICJpOTYwOmNvcmUiLCB0cnVlLCAmYXJjaF9pbmZvX3N0cnVjdFswXSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0xMDIwMC5jIGIvYmZkL2NwdS1tMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4YTY3OC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMjAwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAyMDBfYXJjaCA9Ci0gIHsKLSAgICAxNiwgLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAyNCwgLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMjAwLAotICAgIDIwMCwKLSAgICAibW4xMDIwMCIsCi0gICAgIm1uMTAyMDAiLAotICAgIDIsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTEwMzAwLmMgYi9iZmQvY3B1LW0xMDMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWEwYmZlLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbTEwMzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIE1hdHN1c2hpdGEgMTAzMDAgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTkVYVCBOVUxMCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbW4xMDMwMF9hcmNoID0KLSAgewotICAgIDMyLCAvKiAxNiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLCAvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LCAgLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX21uMTAzMDAsCi0gICAgMzAwLAotICAgICJtbjEwMzAwIiwKLSAgICAibW4xMDMwMCIsCi0gICAgMiwKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICBORVhULAotICB9OwotCmRpZmYgLS1naXQgYS9iZmQvY3B1LW0zMnIuYyBiL2JmZC9jcHUtbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNjYzMxLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbTMyci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNMzJSIHByb2Nlc3Nvci4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9tMzJyLCBudW1iZXIsICJtMzJyIiwgcHJpbnQsIDQsIGRlZmF1bHQsIFwKLSAgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCB9Ci0KLSNkZWZpbmUgTkVYVCBOVUxMCi0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tMzJyX2FyY2ggPQotICBOIChiZmRfbWFjaF9tMzJyLCAibTMyciIsIHRydWUsIE5FWFQpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tNjhrLmMgYi9iZmQvY3B1LW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0MTgyZC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIGFyY2hpdGVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKG5hbWUsIHByaW50LGQsbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbTY4aywgbmFtZSwgIm02OGsiLHByaW50LDIsZCxiZmRfZGVmYXVsdF9jb21wYXRpYmxlLGJmZF9kZWZhdWx0X3NjYW4sIG5leHQsIH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTihiZmRfbWFjaF9tNjgwMDAsICJtNjhrOjY4MDAwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTihiZmRfbWFjaF9tNjgwMDgsICJtNjhrOjY4MDA4IiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9tNjgwMTAsICJtNjhrOjY4MDEwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzNdKSwKLSAgTihiZmRfbWFjaF9tNjgwMjAsICJtNjhrOjY4MDIwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzRdKSwKLSAgTihiZmRfbWFjaF9tNjgwMzAsICJtNjhrOjY4MDMwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9tNjgwNDAsICJtNjhrOjY4MDQwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzZdKSwKLSAgTihiZmRfbWFjaF9jcHUzMiwgICJtNjhrOmNwdTMyIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzddKSwKLSAgTihiZmRfbWFjaF9tNjgwNjAsICJtNjhrOjY4MDYwIiwgZmFsc2UsIDApLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tNjhrX2FyY2ggPQotICBOKDAsICJtNjhrIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tODhrLmMgYi9iZmQvY3B1LW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTZjNS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgbTg4ayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTg4a19hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbTg4aywKLSAgICA4ODEwMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAibTg4ayIsCi0gICAgIm04OGs6ODgxMDAiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW1jb3JlLmMgYi9iZmQvY3B1LW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmZlMWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUgYXJjaGl0ZWN0dXJlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tY29yZV9hcmNoID0KLXsKLSAgMzIsCQkgIAkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkgIAkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkgIAkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9tY29yZSwgCQkvKiBBcmNoaXRlY3R1cmUgKi8KLSAgMCwJCSAgCQkvKiBNYWNoaW5lIG51bWJlciAtIDAgZm9yIG5vdyAqLwotICAiTUNvcmUiLAkgIAkJLyogQXJjaGl0ZWN0dXJlIG5hbWUgKi8KLSAgIk1Db3JlIiwJICAJCS8qIFByaW50YWJsZSBuYW1lICovCi0gIDMsCQkgIAkJLyogU2VjdGlvbiBhbGlnbiBwb3dlciAqLwotICB0cnVlLAkJICAJCS8qIElzIHRoaXMgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlID8gKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwJLyogQXJjaGl0ZWN0dXJlIGNvbXBhcmlzb24gZnVuY3Rpb24gKi8KLSAgYmZkX2RlZmF1bHRfc2NhbiwJICAgCS8qIFN0cmluZyB0byBhcmNoaXRlY3R1cmUgY29udmVyc2lvbiAqLwotICBOVUxMCQkJICAgCS8qIE5leHQgaW4gbGlzdCAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbWlwcy5jIGIvYmZkL2NwdS1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MzNiOGMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIG1pcHMgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MS05NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE4oQklUU19XT1JELCBCSVRTX0FERFIsIE5VTUJFUiwgUFJJTlQsIERFRkFVTFQsIE5FWFQpCQlcCi0gIHsJCQkJCQkJXAotICAgIEJJVFNfV09SRCwgLyogIGJpdHMgaW4gYSB3b3JkICovCQkJXAotICAgIEJJVFNfQUREUiwgLyogYml0cyBpbiBhbiBhZGRyZXNzICovCQkJXAotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCQkJXAotICAgIGJmZF9hcmNoX21pcHMsCQkJCQlcCi0gICAgTlVNQkVSLAkJCQkJCVwKLSAgICAibWlwcyIsCQkJCQkJXAotICAgIFBSSU5ULAkJCQkJCVwKLSAgICAzLAkJCQkJCQlcCi0gICAgREVGQVVMVCwJCQkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCQkJXAotICAgIE5FWFQsCQkJCQkJXAotICB9Ci0KLWVudW0gewotSV9taXBzMzAwMCwgCi1JX21pcHMzOTAwLCAKLUlfbWlwczQwMDAsIAotSV9taXBzNDAxMCwgCi1JX21pcHM0MTAwLCAKLUlfbWlwczQxMTEsCi1JX21pcHM0MzAwLCAKLUlfbWlwczQ0MDAsIAotSV9taXBzNDYwMCwgCi1JX21pcHM0NjUwLCAKLUlfbWlwczUwMDAsIAotSV9taXBzNjAwMCwgCi1JX21pcHM4MDAwLCAKLUlfbWlwczEwMDAwLAotSV9taXBzMTYKLX07Ci0KLQotI2RlZmluZSBOTihpbmRleCkgKCZhcmNoX2luZm9fc3RydWN0WyhpbmRleCkrMV0pCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIE4gKDMyLCAzMiwgYmZkX21hY2hfbWlwczMwMDAsICJtaXBzOjMwMDAiLCBmYWxzZSwgTk4oSV9taXBzMzAwMCkpLAotICBOICgzMiwgMzIsIGJmZF9tYWNoX21pcHMzOTAwLCAibWlwczozOTAwIiwgZmFsc2UsIE5OKElfbWlwczM5MDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDAwMCwgIm1pcHM6NDAwMCIsIGZhbHNlLCBOTihJX21pcHM0MDAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQwMTAsICJtaXBzOjQwMTAiLCBmYWxzZSwgTk4oSV9taXBzNDAxMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MTAwLCAibWlwczo0MTAwIiwgZmFsc2UsIE5OKElfbWlwczQxMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDExMSwgIm1pcHM6NDExMSIsIGZhbHNlLCBOTihJX21pcHM0MTExKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQzMDAsICJtaXBzOjQzMDAiLCBmYWxzZSwgTk4oSV9taXBzNDMwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0NDAwLCAibWlwczo0NDAwIiwgZmFsc2UsIE5OKElfbWlwczQ0MDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDYwMCwgIm1pcHM6NDYwMCIsIGZhbHNlLCBOTihJX21pcHM0NjAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQ2NTAsICJtaXBzOjQ2NTAiLCBmYWxzZSwgTk4oSV9taXBzNDY1MCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM1MDAwLCAibWlwczo1MDAwIiwgZmFsc2UsIE5OKElfbWlwczUwMDApKSwKLSAgTiAoMzIsIDMyLCBiZmRfbWFjaF9taXBzNjAwMCwgIm1pcHM6NjAwMCIsIGZhbHNlLCBOTihJX21pcHM2MDAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczgwMDAsICJtaXBzOjgwMDAiLCBmYWxzZSwgTk4oSV9taXBzODAwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHMxMDAwMCwgIm1pcHM6MTAwMDAiLCBmYWxzZSwgTk4oSV9taXBzMTAwMDApKSwKLQotCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczE2LCAgICJtaXBzOjE2IiwgICBmYWxzZSwgMCksCi19OwotCi0vKiBUaGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgaXMgbWlwczozMDAwLCBidXQgd2l0aCBhIG1hY2hpbmUgbnVtYmVyIG9mCi0gICB6ZXJvLiAgVGhpcyBsZXRzIHRoZSBsaW5rZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGRlZmF1bHQgc2V0dGluZwotICAgb2YgbWlwcywgYW5kIGFuIGV4cGxpY2l0IHNldHRpbmcgb2YgbWlwczozMDAwLiAgKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9taXBzX2FyY2ggPQotTiAoMzIsIDMyLCAwLCAibWlwcyIsIHRydWUsICZhcmNoX2luZm9fc3RydWN0WzBdKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbnMzMmsuYyBiL2JmZC9jcHUtbnMzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwYTE4ZC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW5zMzJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NDYgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBuczMyayBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQWxtb3N0IHRvdGFsbHkgcmV3cml0dGVuIGJ5IElhbiBEYWxsIGZyb20gaW5pdGlhbCB3b3JrCi0gICBieSBBbmRyZXcgQ2FnbmV5LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJuczMyay5oIgotCi0jZGVmaW5lIE4obWFjaGluZSwgcHJpbnRhYmxlLCBkLCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9uczMyaywgbWFjaGluZSwgIm5zMzJrIixwcmludGFibGUsMyxkLGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCwgfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17IAotICBOKDMyNTMyLCJuczMyazozMjUzMiIsdHJ1ZSwgMCksIC8qIHRoZSB3b3JkIG5zMzJrIHdpbGwgbWF0Y2ggdGhpcyB0b28gKi8KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbnMzMmtfYXJjaCA9Ci0gIE4oMzIwMzIsIm5zMzJrOjMyMDMyIixmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwotCi1zdGF0aWMgbG9uZwotbnMzMmtfc2lnbl9leHRlbmQodmFsdWUsIGJpdHMpCi0gICAgIGludCB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci17Ci0gIHZhbHVlID0gdmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKTsKLSAgcmV0dXJuICh2YWx1ZSAmICgxIDw8IChiaXRzLTEpKQotCSAgPyB2YWx1ZSB8ICh+KCgxIDw8IGJpdHMpIC0gMSkpCi0JICA6IHZhbHVlKTsKLX0KLQotbG9uZwotX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50KGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBsb25nIHZhbHVlOwotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQgKCpidWZmZXIsIDcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIrKyk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcisrKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLV9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCh2YWx1ZSwgYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKHZhbHVlIDwgLTY0IHx8IHZhbHVlID4gNjMpCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWUmPTB4N2Y7Ci0gICAgICAqYnVmZmVyKys9dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAodmFsdWUgPCAtODE5MiB8fCB2YWx1ZSA+IDgxOTEpCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWUmPTB4M2ZmZjsKLSAgICAgIHZhbHVlfD0weDgwMDA7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGlmICh2YWx1ZSA8IC0weDFmMDAwMDAwIHx8IHZhbHVlID49IDB4MjAwMDAwMDApCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWV8PTB4YzAwMDAwMDA7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj4yNCk7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj4xNik7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWxvbmcKLV9iZmRfbnMzMmtfZ2V0X2ltbWVkaWF0ZSAoYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGxvbmcgdmFsdWUgPSAwOwotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMzoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMjoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMToKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLV9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSAodmFsdWUsIGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBsb25nIHZhbHVlOwotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBidWZmZXIgKz0gb2Zmc2V0ICsgc2l6ZSAtIDE7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIGNhc2UgMzoKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7Ci0gICAgY2FzZSAxOgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBwZXJmb3JtX3JlbG9jYXRpb24gZXhjZXB0IHdlCi0gKiB1c2UgZ2V0X2RhdGEgYW5kIHB1dF9kYXRhIHdoaWNoIGtub3cgYWJvdXQgdGhlIG5zMzJrCi0gKiBzdG9yYWdlIG1ldGhvZHMuCi0gKiBUaGlzIGlzIHByb2JhYmx5IGEgbG90IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCBuZWVkcyB0byBiZSEKLSAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UsIGdldF9kYXRhLCBwdXRfZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci0gICAgIGxvbmcgKCpnZXRfZGF0YSkoKTsKLSAgICAgaW50ICgqcHV0X2RhdGEpKCk7Ci17Ci0gIGludCBvdmVyZmxvdyA9IDA7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0KLSAgaWYgKChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCByZXR1cm4gYW4gZXJyb3IgaWYKLSAgICAgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZC4gIEFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbCBpcwotICAgICBjb25zaWRlcmVkIHRvIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvIChTVlI0IEFCSSwgcC4gNC0yNykuICAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGZsYWcgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLQotICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAmJiBob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIG91dHB1dF9iYXNlID0gMDsKLSAgZWxzZQotICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04KLQkgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgdGhlCi0JIGxvY2F0aW9uLiAgUkVMT0NBVElPTiBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuCi0KLQkgV2Ugc3RhcnQgYnkgc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZwotCSB0aGUgbG9jYXRpb24uCi0KLQkgSWYgcGNyZWxfb2Zmc2V0IGlzIHNldCwgd2UgbXVzdCBmdXJ0aGVyIHN1YnRyYWN0IHRoZSBwb3NpdGlvbgotCSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgU29tZSB0YXJnZXRzIGFycmFuZ2UgZm9yCi0JIHRoZSBhZGRlbmQgdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb24KLQkgd2l0aGluIHRoZSBzZWN0aW9uOyBmb3IgZXhhbXBsZSwgaTM4Ni1hb3V0IGRvZXMgdGhpcy4gIEZvcgotCSBpMzg2LWFvdXQsIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIFNvbWUgb3RoZXIgdGFyZ2V0cyBkbyBub3QKLQkgaW5jbHVkZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uOyBmb3IgZXhhbXBsZSwgbTg4a2JjcywKLQkgb3IgRUxGLiAgRm9yIHRob3NlIHRhcmdldHMsIHBjcmVsX29mZnNldCBpcyB0cnVlLgotCi0JIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlbiB3ZSBtdXN0IGVuc3VyZQotCSB0aGF0IHRoaXMgcmVsb2Mgd2lsbCBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiB0aGUgZmluYWwKLQkgcmVsb2NhdGlvbiBpcyBkb25lLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIHdhbnQgdG8gd2luZAotCSB1cCB3aXRoIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLAotCSB3aGljaCBtZWFucyB3ZSBtdXN0IGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGJ5IHRoZSBjaGFuZ2UKLQkgaW4gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIElmIHBjcmVsX29mZnNldCBpcyB0cnVlCi0JIHdlIGRvIG5vdCB3YW50IHRvIGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGF0IGFsbC4KLQotCSBGSVhNRTogVGhpcyBzZWVtcyBsb2dpY2FsIHRvIG1lLCBidXQgZm9yIHRoZSBjYXNlIG9mCi0JIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0IGl0IGlzIG5vdCB3aGF0IHRoZSBjb2RlCi0JIGFjdHVhbGx5IGRvZXMuICBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IHNlZW1zCi0JIGZhciB0b28gbGlrZWx5IHRoYXQgc29tZXRoaW5nIHdpbGwgYnJlYWsuICAqLwotCi0gICAgICByZWxvY2F0aW9uIC09Ci0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUpCi0JcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JICAgICB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLiBNb2RpZnkgdGhlIHJlbG9jCi0JICAgICBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0JICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICByZXR1cm4gZmxhZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYnV0IGlucGxhY2UsIHNvIG1vZGlmeSB0aGUKLQkgICAgIHJlbG9jIHJlY29yZCBhIGJpdC4KLQotCSAgICAgSWYgd2UndmUgcmVsb2NhdGVkIHdpdGggYSBzeW1ib2wgd2l0aCBhIHNlY3Rpb24sIGNoYW5nZQotCSAgICAgaW50byBhIHJlZiB0byB0aGUgc2VjdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHN5bWJvbC4gICovCi0KLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLQkgIC8qIFdURj8/ICovCi0JICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgIT0gMCkKLQkgICAgewotI2lmIDEKLQkgICAgICAvKiBGb3IgbTY4ay1jb2ZmLCB0aGUgYWRkZW5kIHdhcyBiZWluZyBzdWJ0cmFjdGVkIHR3aWNlIGR1cmluZwotCQkgcmVsb2NhdGlvbiB3aXRoIC1yLiAgUmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3cgdGhpcyBjb21tZW50Ci0JCSBmaXhlcyB0aGF0IHByb2JsZW07IHNlZSBQUiAyOTUzLgotCi1Ib3dldmVyLCBJYW4gd3JvdGUgdGhlIGZvbGxvd2luZywgcmVnYXJkaW5nIHJlbW92aW5nIHRoZSBsaW5lIGJlbG93LAotd2hpY2ggZXhwbGFpbnMgd2h5IGl0IGlzIHN0aWxsIGVuYWJsZWQ6ICAtLWRqbQotCi1JZiB5b3UgcHV0IGEgcGF0Y2ggbGlrZSB0aGF0IGludG8gQkZEIHlvdSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgQ09GRgotbGlua2Vycy4gIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCBwYXRjaCB3aWxsIGJyZWFrIGNvZmYtaTM4NiAoZS5nLiwKLVNDTyk7IHNlZSBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMgd2hlcmUgSSB3b3JrZWQgYXJvdW5kIHRoZQotcHJvYmxlbSBpbiBhIGRpZmZlcmVudCB3YXkuICBUaGVyZSBtYXkgdmVyeSB3ZWxsIGJlIGEgcmVhc29uIHRoYXQgdGhlCi1jb2RlIHdvcmtzIGFzIGl0IGRvZXMuCi0KLUhtbW0uICBUaGUgZmlyc3Qgb2J2aW91cyBwb2ludCBpcyB0aGF0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gc2hvdWxkCi1ub3QgaGF2ZSBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgZmxhdm91ci4gIEl0J3Mgc2VlbSBsaWtlCi1lbnRpcmVseSB0aGUgd3JvbmcgcGxhY2UgZm9yIHN1Y2ggYSB0aGluZy4gIFRoZSBzZWNvbmQgb2J2aW91cyBwb2ludAotaXMgdGhhdCB0aGUgY3VycmVudCBjb2RlIGlnbm9yZXMgdGhlIHJlbG9jIGFkZGVuZCB3aGVuIHByb2R1Y2luZwotcmVsb2NhdGVhYmxlIG91dHB1dCBmb3IgQ09GRi4gIFRoYXQncyBwZWN1bGlhci4gIEluIGZhY3QsIEkgcmVhbGx5Ci1oYXZlIG5vIGlkZWEgd2hhdCB0aGUgcG9pbnQgb2YgdGhlIGxpbmUgeW91IHdhbnQgdG8gcmVtb3ZlIGlzLgotCi1BIHR5cGljYWwgQ09GRiByZWxvYyBzdWJ0cmFjdHMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBhZGRzIGluCi10aGUgbmV3IHZhbHVlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUgKGlmIGl0J3MgYSBwYwotcmVsYXRpdmUgcmVsb2MgaXQgYWRkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZQotbG9jYXRpb24pLiAgV2hlbiByZWxvY2F0aW5nIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCBwcm9wZXJ0eS4KLQotQkZEIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBhZGRlbmQgdG8gdGhlIG5lZ2F0aXZlIG9mIHRoZSBvbGQKLXZhbHVlIG9mIHRoZSBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5IGl0IGhhbmRsZXMgY29tbW9uIHN5bWJvbHMgaW4gYQotbm9uLXN0YW5kYXJkIHdheSAoaXQgZG9lc24ndCBzdWJ0cmFjdCB0aGUgb2xkIHZhbHVlKSBidXQgdGhhdCdzIGEKLWRpZmZlcmVudCBzdG9yeSAod2UgY2FuJ3QgY2hhbmdlIGl0IHdpdGhvdXQgbG9zaW5nIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5IHdpdGggb2xkIG9iamVjdCBmaWxlcykgKGNvZmYtaTM4NiBkb2VzIHN1YnRyYWN0IHRoZSBvbGQKLXZhbHVlLCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgY29mZi1pMzg2IHRhcmdldHMsIGxpa2UgU0NPKS4KLQotU28gZXZlcnl0aGluZyB3b3JrcyBmaW5lIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgV2hlbgotd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBsb2dpY2FsbHkgd2Ugc2hvdWxkIGRvIGV4YWN0bHkKLXdoYXQgd2UgZG8gd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGVyZWZvcmUsIHlvdXIKLXBhdGNoIGlzIGNvcnJlY3QuICBJbiBmYWN0LCBpdCBzaG91bGQgcHJvYmFibHkgYWx3YXlzIGp1c3Qgc2V0Ci1yZWxvY19lbnRyeS0+YWRkZW5kIHRvIDAgZm9yIGFsbCBjYXNlcywgc2luY2UgaXQgaXMsIGluIGZhY3QsIGdvaW5nIHRvCi1hZGQgdGhlIHZhbHVlIGludG8gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyB3b24ndCBodXJ0IHRoZSBDT0ZGIGNvZGUsCi13aGljaCBkb2Vzbid0IHVzZSB0aGUgYWRkZW5kOyBJJ20gbm90IHN1cmUgd2hhdCBpdCB3aWxsIGRvIHRvIG90aGVyCi1mb3JtYXRzICh0aGUgdGhpbmcgdG8gY2hlY2sgZm9yIHdvdWxkIGJlIHdoZXRoZXIgYW55IGZvcm1hdHMgYm90aCB1c2UKLXRoZSBhZGRlbmQgYW5kIHNldCBwYXJ0aWFsX2lucGxhY2UpLgotCi1XaGVuIEkgd2FudGVkIHRvIG1ha2UgY29mZi1pMzg2IHByb2R1Y2UgcmVsb2NhdGVhYmxlIG91dHB1dCwgSSByYW4KLWludG8gdGhlIHByb2JsZW0gdGhhdCB5b3UgYXJlIHJ1bm5pbmcgaW50bzogSSB3YW50ZWQgdG8gcmVtb3ZlIHRoYXQKLWxpbmUuICBSYXRoZXIgdGhhbiByaXNrIGl0LCBJIG1hZGUgdGhlIGNvZmYtaTM4NiByZWxvY3MgdXNlIGEgc3BlY2lhbAotZnVuY3Rpb247IGl0J3MgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jLiAgVGhlIGZ1bmN0aW9uCi1zcGVjaWZpY2FsbHkgYWRkcyB0aGUgYWRkZW5kIGZpZWxkIGludG8gdGhlIG9iamVjdCBmaWxlLCBrbm93aW5nIHRoYXQKLWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgbm90IGdvaW5nIHRvLiAgSWYgeW91IHJlbW92ZSB0aGF0IGxpbmUsIHRoZW4KLWNvZmYtaTM4Ni5jIHdpbGwgd2luZCB1cCBhZGRpbmcgdGhlIGFkZGVuZCBmaWVsZCBpbiB0d2ljZS4gIEl0J3MKLXRyaXZpYWwgdG8gZml4OyBpdCBqdXN0IG5lZWRzIHRvIGJlIGRvbmUuCi0KLVRoZSBwcm9ibGVtIHdpdGggcmVtb3ZpbmcgdGhlIGxpbmUgaXMganVzdCB0aGF0IGl0IG1heSBicmVhayBzb21lCi13b3JraW5nIGNvZGUuICBXaXRoIEJGRCBpdCdzIGhhcmQgdG8gYmUgc3VyZSBvZiBhbnl0aGluZy4gIFRoZSByaWdodAotd2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzIHNpbXBseSB0byBidWlsZCBhbmQgdGVzdCBhdCBsZWFzdCBhbGwgdGhlCi1zdXBwb3J0ZWQgQ09GRiB0YXJnZXRzLiAgSXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBpZiB0aW1lIGFuZCBkaXNrCi1zcGFjZSBjb25zdW1pbmcuICBGb3IgZWFjaCB0YXJnZXQ6Ci0gICAgMSkgYnVpbGQgdGhlIGxpbmtlcgotICAgIDIpIGdlbmVyYXRlIHNvbWUgZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgdXNpbmcgLXIgKEkgd291bGQKLSAgICAgICBwcm9iYWJseSB1c2UgcGFyYW5vaWEubyBhbmQgbGluayBhZ2FpbnN0IG5ld2xpYi9saWJjLmEsIHdoaWNoCi0gICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHRhcmdldHMgd291bGQgYmUgYXZhaWxhYmxlIGluCi0gICAgICAgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvSC1ob3N0L3RhcmdldC9saWIvbGliYy5hKS4KLSAgICAzKSBtYWtlIHRoZSBjaGFuZ2UgdG8gcmVsb2MuYwotICAgIDQpIHJlYnVpbGQgdGhlIGxpbmtlcgotICAgIDUpIHJlcGVhdCBzdGVwIDIKLSAgICA2KSBpZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlcyBhcmUgdGhlIHNhbWUsIHlvdSBoYXZlIGF0IGxlYXN0Ci0gICAgICAgbWFkZSBpdCBubyB3b3JzZQotICAgIDcpIGlmIHRoZXkgYXJlIGRpZmZlcmVudCB5b3UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoaWNoIHZlcnNpb24gaXMKLSAgICAgICByaWdodAotKi8KLQkgICAgICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBUaGlzIG92ZXJmbG93IGNoZWNraW5nIGlzIGluY29tcGxldGUsIGJlY2F1c2UgdGhlIHZhbHVlCi0gICAgIG1pZ2h0IGhhdmUgb3ZlcmZsb3dlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuICBGb3IgYSBjb3JyZWN0IGNoZWNrIHdlCi0gICAgIG5lZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgaW4gYSBzaXplIGxhcmdlciB0aGFuIGJpdHNpemUsIGJ1dCB3ZQotICAgICBjYW4ndCByZWFzb25hYmx5IGRvIHRoYXQgZm9yIGEgcmVsb2MgdGhlIHNhbWUgc2l6ZSBhcyBhIGhvc3QKLSAgICAgbWFjaGluZSB3b3JkLgotICAgICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gZG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gdGhlIHJlc3VsdCBhZnRlcgotICAgICBhZGRpbmcgaW4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIHJlbG9jYXRpb24sIGJ1dAotCSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gemVyby4gICovCi0gICAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPiBob3d0by0+Yml0cG9zKQotCWNoZWNrID0gcmVsb2NhdGlvbiA+PiAoaG93dG8tPnJpZ2h0c2hpZnQgLSBob3d0by0+Yml0cG9zKTsKLSAgICAgIGVsc2UKLQljaGVjayA9IHJlbG9jYXRpb24gPDwgKGhvd3RvLT5iaXRwb3MgLSBob3d0by0+cmlnaHRzaGlmdCk7Ci0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCi0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0KLQkgICAgLyogVGhlIGFib3ZlIHJpZ2h0IHNoaWZ0IGlzIGluY29ycmVjdCBmb3IgYSBzaWduZWQgdmFsdWUuCi0JICAgICAgIEZpeCBpdCB1cCBieSBmb3JjaW5nIG9uIHRoZSB1cHBlciBiaXRzLiAgKi8KLQkgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID4gaG93dG8tPmJpdHBvcwotCQkmJiAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAwKQotCSAgICAgIGNoZWNrIHw9ICgoYmZkX3ZtYSkgLSAxCi0JCQkmIH4oKGJmZF92bWEpIC0gMQotCQkJICAgID4+IChob3d0by0+cmlnaHRzaGlmdCAtIGhvd3RvLT5iaXRwb3MpKSk7Ci0JICAgIGlmICgoYmZkX3NpZ25lZF92bWEpIGNoZWNrID4gcmVsb2Nfc2lnbmVkX21heAotCQl8fCAoYmZkX3NpZ25lZF92bWEpIGNoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKLQkgICAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgVGhpcyBleHByZXNzaW9uIGF2b2lkcwotCSAgICAgICBvdmVyZmxvdyBpZiBob3d0by0+Yml0c2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4KLQkgICAgICAgYmZkX3ZtYS4gICovCi0JICAgIGJmZF92bWEgcmVsb2NfdW5zaWduZWRfbWF4ID0KLQkgICAgKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLQkgICAgaWYgKChiZmRfdm1hKSBjaGVjayA+IHJlbG9jX3Vuc2lnbmVkX21heCkKLQkgICAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgVGhpcyBleHByZXNzaW9uIGF2b2lkcwotCSAgICAgICBvdmVyZmxvdyBpZiBob3d0by0+Yml0c2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4KLQkgICAgICAgYmZkX3ZtYS4gICovCi0JICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmICgoKGJmZF92bWEpIGNoZWNrICYgfnJlbG9jX2JpdHMpICE9IDAKLQkJJiYgKChiZmRfdm1hKSBjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAoLTEgJiB+cmVsb2NfYml0cykpCi0JICAgICAgewotCQkvKiBUaGUgYWJvdmUgcmlnaHQgc2hpZnQgaXMgaW5jb3JyZWN0IGZvciBhIHNpZ25lZAotCQkgICB2YWx1ZS4gIFNlZSBpZiB0dXJuaW5nIG9uIHRoZSB1cHBlciBiaXRzIGZpeGVzIHRoZQotCQkgICBvdmVyZmxvdy4gICovCi0JCWlmIChob3d0by0+cmlnaHRzaGlmdCA+IGhvd3RvLT5iaXRwb3MKLQkJICAgICYmIChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IDApCi0JCSAgewotCQkgICAgY2hlY2sgfD0gKChiZmRfdm1hKSAtIDEKLQkJCSAgICAgICYgfigoYmZkX3ZtYSkgLSAxCi0JCQkJICA+PiAoaG93dG8tPnJpZ2h0c2hpZnQgLSBob3d0by0+Yml0cG9zKSkpOwotCQkgICAgaWYgKCgoYmZkX3ZtYSkgY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gKC0xICYgfnJlbG9jX2JpdHMpKQotCQkgICAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCQkgIH0KLQkJZWxzZQotCQkgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKLSAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKLSAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKLSAgICAqLwotCi0gIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCi0gICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKLSAgICAgZm9sbG93aW5nIHByb2dyYW06Ci0KLSAgICAgc3RydWN0IHN0cgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgaW50IGkwOwotICAgICB9IHMgPSB7IDAgfTsKLQotICAgICBpbnQKLSAgICAgbWFpbiAoKQotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgeCA9IDB4MTAwMDAwMDAwOwotICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOwotICAgICAgIGlmICh4ID09IDApCi0JIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICAgZWxzZQotCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOwotICAgICB9Ci0gICAgICovCi0KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0gIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KLQotICAvKiBXaGF0IHdlIGRvOgotICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKLSAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCi0gICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKLSAgICAgUyBzcmMgbWFzawotICAgICBEIGRzdCBtYXNrCi0gICAgIE4gfmRzdCBtYXNrCi0gICAgIEEgcGFydCAxCi0gICAgIEIgcGFydCAyCi0gICAgIFIgcmVzdWx0Ci0KLSAgICAgRG8gdGhpczoKLSAgICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgICAgICAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgICAgICAgICAgUyBTIFMgUyBTICAgIHRvIGdldCB0aGUgc2l6ZSBvZmZzZXQgd2Ugd2FudAotICAgICArICAgciByIHIgciByIHIgciByIHIgciAgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZSB0byBwbGFjZQotICAgICBhbmQgICAgICAgICAgIEQgRCBEIEQgRCAgdG8gY2hvcCB0byByaWdodCBzaXplCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIEEgQSBBIEEgQQotICAgICBBbmQgdGhpczoKLSAgICAgLi4uICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgIE4gTiBOIE4gTiAgICAgICAgICAgIGdldCBpbnN0cnVjdGlvbgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAuLi4gICBCIEIgQiBCIEIKLQotICAgICBBbmQgdGhlbjoKLSAgICAgQiBCIEIgQiBCCi0gICAgIG9yICAgICAgICAgICAgICBBIEEgQSBBIEEKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgUiBSIFIgUiBSIFIgUiBSIFIgUiAgICAgICAgcHV0IGludG8gYmZkX3B1dDxzaXplPgotICAgICAqLwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyAgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHsKLQljaGFyIHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgMSk7Ci0JRE9JVCAoeCk7Ci0Jb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhLCBhZGRyLCAxKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgaWYgKHJlbG9jYXRpb24pCi0JewotCSAgc2hvcnQgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCAyKTsKLQkgIERPSVQgKHgpOwotCSAgb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhLCBhZGRyLCAyKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAocmVsb2NhdGlvbikKLQl7Ci0JICBsb25nIHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgNCk7Ci0JICBET0lUICh4KTsKLQkgIG92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSwgYWRkciwgNCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAtMjoKLSAgICAgIHsKLQlsb25nICB4ID0gZ2V0X2RhdGEoZGF0YSwgYWRkciwgNCk7Ci0JcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCURPSVQoeCk7Ci0Jb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhICwgYWRkciwgNCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIERvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgICBpZiAocmVsb2NhdGlvbikKLQl7Ci0JICBiZmRfdm1hIHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgOCk7Ci0JICBET0lUICh4KTsKLQkgIG92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSwgYWRkciwgOCk7Ci0JfQotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKLSAgICB9Ci0gIGlmICgoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpICYmIG92ZXJmbG93KQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgZ2l2ZW4gbG9jYXRpb24gdXNpbmcgYSBnaXZlbiB2YWx1ZSBhbmQgaG93dG8uICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfZG9fbnMzMmtfcmVsb2NfY29udGVudHMgKCBob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBsb2NhdGlvbiwKLQkJCSAgICAgIGdldF9kYXRhLCBwdXRfZGF0YSkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgICAgbG9uZyAoKmdldF9kYXRhKSgpOwotICAgICBpbnQgKCpwdXRfZGF0YSkoKTsKLXsKLSAgaW50IHNpemU7Ci0gIGJmZF92bWEgeDsKLSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICAvKiBJZiB0aGUgc2l6ZSBpcyBuZWdhdGl2ZSwgbmVnYXRlIFJFTE9DQVRJT04uICBUaGlzIGlzbid0IHZlcnkKLSAgICAgZ2VuZXJhbC4gICovCi0gIGlmIChob3d0by0+c2l6ZSA8IDApCi0gICAgcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCi0gIC8qIEdldCB0aGUgdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHJlbG9jYXRlLiAgKi8KLSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDQ6Ci0jaWZkZWYgQkZENjQKLSAgICBjYXNlIDg6Ci0jZW5kaWYKLSAgICAgIHggPSBnZXRfZGF0YSAobG9jYXRpb24sIDAsIHNpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdy4gIEZJWE1FOiBXZSBtYXkgZHJvcCBiaXRzIGR1cmluZyB0aGUgYWRkaXRpb24KLSAgICAgd2hpY2ggd2UgZG9uJ3QgY2hlY2sgZm9yLiAgV2UgbXVzdCBlaXRoZXIgY2hlY2sgYXQgZXZlcnkgc2luZ2xlCi0gICAgIG9wZXJhdGlvbiwgd2hpY2ggd291bGQgYmUgdGVkaW91cywgb3Igd2UgbXVzdCBkbyB0aGUgY29tcHV0YXRpb25zCi0gICAgIGluIGEgdHlwZSBsYXJnZXIgdGhhbiBiZmRfdm1hLCB3aGljaCB3b3VsZCBiZSBpbmVmZmljaWVudC4gICovCi0gIG92ZXJmbG93ID0gZmFsc2U7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGNoZWNrOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2NoZWNrOwotICAgICAgYmZkX3ZtYSBhZGQ7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBzaWduZWRfYWRkOwotCi0gICAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPT0gMCkKLQl7Ci0JICBjaGVjayA9IHJlbG9jYXRpb247Ci0JICBzaWduZWRfY2hlY2sgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERyb3AgdW53YW50ZWQgYml0cyBmcm9tIHRoZSB2YWx1ZSB3ZSBhcmUgcmVsb2NhdGluZyB0by4gICovCi0JICBjaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBzaWduZWQgdmFsdWUsIHRoZSByaWdodHNoaWZ0IGp1c3QgZHJvcHBlZAotCSAgICAgbGVhZGluZyAxIGJpdHMgKGFzc3VtaW5nIHR3b3MgY29tcGxlbWVudCkuICAqLwotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCSAgICBzaWduZWRfY2hlY2sgPSBjaGVjazsKLQkgIGVsc2UKLQkgICAgc2lnbmVkX2NoZWNrID0gKGNoZWNrCi0JCQkgICAgfCAoKGJmZF92bWEpIC0gMQotCQkJICAgICAgICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkpOwotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gICovCi0gICAgICBhZGQgPSB4ICYgaG93dG8tPnNyY19tYXNrOwotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlIHdpdGggYW4gYXBwcm9wcmlhdGUgc2lnbi4KLQkgVGhlIGV4cHJlc3Npb24gaW52b2x2aW5nIGhvd3RvLT5zcmNfbWFzayBpc29sYXRlcyB0aGUgdXBwZXIKLQkgYml0IG9mIHNyY19tYXNrLiAgSWYgdGhhdCBiaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSB3ZSBhcmUKLQkgYWRkaW5nLCBpdCBpcyBuZWdhdGl2ZSwgYW5kIHdlIHN1YnRyYWN0IG91dCB0aGF0IG51bWJlciB0aW1lcwotCSB0d28uICBJZiBzcmNfbWFzayBpbmNsdWRlcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBiaXQsIHRoZW4gd2UKLQkgY2FuIG5vdCBnZXQgdGhlIHVwcGVyIGJpdCwgYnV0IHRoYXQgZG9lcyBub3QgbWF0dGVyIHNpbmNlCi0JIHNpZ25lZF9hZGQgbmVlZHMgbm8gYWRqdXN0bWVudCB0byBiZWNvbWUgbmVnYXRpdmUgaW4gdGhhdAotCSBjYXNlLiAgKi8KLSAgICAgIHNpZ25lZF9hZGQgPSBhZGQ7Ci0gICAgICBpZiAoKGFkZCAmICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSkgIT0gMCkKLQlzaWduZWRfYWRkIC09ICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSA8PCAxOwotCi0gICAgICAvKiBBZGQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLCBzaGlmdGVkIHNvIHRoYXQgaXQgaXMgYQotCSBzdHJhaWdodCBudW1iZXIuICAqLwotICAgICAgaWYgKGhvd3RvLT5iaXRwb3MgPT0gMCkKLQl7Ci0JICBjaGVjayArPSBhZGQ7Ci0JICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7Ci0KLQkgIC8qIEZvciB0aGUgc2lnbmVkIGNhc2Ugd2UgdXNlIEFERCwgcmF0aGVyIHRoYW4gU0lHTkVEX0FERCwKLQkgICAgIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4gIFRoaXMgaXMgT0sgc2luY2Ugd2UKLQkgICAgIGV4cGxpY3RseSBoYW5kbGUgdGhlIHNpZ24gYml0cy4gICovCi0JICBpZiAoc2lnbmVkX2FkZCA+PSAwKQotCSAgICBzaWduZWRfY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7Ci0JICBlbHNlCi0JICAgIHNpZ25lZF9jaGVjayArPSAoKGFkZCA+PiBob3d0by0+Yml0cG9zKQotCQkJICAgICB8ICgoYmZkX3ZtYSkgLSAxCi0JCQkJJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPmJpdHBvcykpKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQotCXsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKLQotCSAgICBpZiAoc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heAotCQl8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKLQkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JICAgICAgIGJmZF92bWEuICAqLwotCSAgICBiZmRfdm1hIHJlbG9jX3Vuc2lnbmVkX21heCA9Ci0JICAgICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmIChjaGVjayA+IHJlbG9jX3Vuc2lnbmVkX21heCkKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY19iaXRzID0gKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLQkgICAgaWYgKChjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAwCi0JCSYmICgoKGJmZF92bWEpIHNpZ25lZF9jaGVjayAmIH5yZWxvY19iaXRzKQotCQkgICAgIT0gKC0xICYgfnJlbG9jX2JpdHMpKSkKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKiBQdXQgUkVMT0NBVElPTiBpbiB0aGUgcmlnaHQgYml0cy4gICovCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIHJpZ2h0IGJpdHMgb2YgWC4gICovCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKQotICAgICAgIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpOwotCi0gIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgY2FzZSA4OgotI2VuZGlmCi0gICAgICBwdXRfZGF0YSh4LCBsb2NhdGlvbiwgMCwgc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotfQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbnMzMmtfcmVsb2NfZGlzcCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwKLQkJCSBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQsCi0JCQkgX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50KTsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX3JlbG9jX2ltbSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBkb19uczMya19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGUsCi0JCQkgX2JmZF9uczMya19wdXRfaW1tZWRpYXRlKTsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCWFkZHJlc3MsIHZhbHVlLCBhZGRlbmQpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCi0gIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgYmFzaWMgcmVsb2NhdGlvbgotICAgICBhZ2FpbnN0IGEgc3ltYm9sLiAgV2Ugd2FudCB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHRvCi0gICAgIHJlbG9jYXRlIHRvLiAgVGhpcyBpcyBqdXN0IFZBTFVFLCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgcGx1cwotICAgICBBRERFTkQsIGFueSBhZGRlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxvYy4gICovCi0gIHJlbG9jYXRpb24gPSB2YWx1ZSArIGFkZGVuZDsKLQotICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBQQyByZWxhdGl2ZSwgd2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTiB0bwotICAgICB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIChjdXJyZW50bHkgaW4gUkVMT0NBVElPTikgYW5kIHRoZQotICAgICBsb2NhdGlvbiB3ZSBhcmUgcmVsb2NhdGluZy4gIFNvbWUgdGFyZ2V0cyAoZS5nLiwgaTM4Ni1hb3V0KQotICAgICBhcnJhbmdlIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZQotICAgICBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIHN1Y2ggdGFyZ2V0cwotICAgICBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBPdGhlciB0YXJnZXRzIChlLmcuLCBtODhrYmNzIG9yIEVMRikKLSAgICAgc2ltcGx5IGxlYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcyB6ZXJvOyBmb3Igc3VjaAotICAgICB0YXJnZXRzIHBjcmVsX29mZnNldCBpcyB0cnVlLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIGRvIG5vdAotICAgICBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlCi0gICAgIHNlY3Rpb24gKHdoaWNoIGlzIGp1c3QgQUREUkVTUykuICAqLwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgICAgICAgY29udGVudHMgKyBhZGRyZXNzKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtcG93ZXJwYy5jIGIvYmZkL2NwdS1wb3dlcnBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjBmODAuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1wb3dlcnBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyogQkZEIFBvd2VyUEMgQ1BVIGRlZmluaXRpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogVGhlIGNvbW1vbiBQb3dlclBDIGFyY2hpdGVjdHVyZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFJTLzYwMDAuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpwb3dlcnBjX2NvbXBhdGlibGUKLSAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotcG93ZXJwY19jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotICBCRkRfQVNTRVJUIChhLT5hcmNoID09IGJmZF9hcmNoX3Bvd2VycGMpOwotICBzd2l0Y2ggKGItPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICByZXR1cm4gYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSwgYik7Ci0gICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0gICAgICBpZiAoYS0+bWFjaCA9PSAwKQotCXJldHVybiBhOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgNjAzLCAvKiBmb3IgdGhlIG1wYzYwMyAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzo2MDMiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFsxXQotICB9LAotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDYwNCwgLyogZm9yIHRoZSBtcGM2MDQgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NjA0IiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMl0KLSAgfSwKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA0MDMsIC8qIGZvciB0aGUgNDAzICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjQwMyIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzNdCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgNjAxLCAvKiBmb3IgdGhlIG1wYzYwMSAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzo2MDEiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAwCi0gIH0KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfcG93ZXJwY19hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICAwLCAvKiBmb3IgdGhlIFBPV0VSL1Bvd2VyUEMgY29tbW9uIGFyY2hpdGVjdHVyZSAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzpjb21tb24iLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtcnM2MDAwLmMgYi9iZmQvY3B1LXJzNjAwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODUyYWU5Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtcnM2MDAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIHJzNjAwMCBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUgb2YgSUJNCi0gICBhbmQgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogVGhlIFJTLzYwMDAgYXJjaGl0ZWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgUG93ZXJQQyBjb21tb24KLSAgIGFyY2hpdGVjdHVyZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnJzNjAwMF9jb21wYXRpYmxlCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLXJzNjAwMF9jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotICBCRkRfQVNTRVJUIChhLT5hcmNoID09IGJmZF9hcmNoX3JzNjAwMCk7Ci0gIHN3aXRjaCAoYi0+YXJjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotICAgICAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIGlmIChiLT5tYWNoID09IDApCi0JcmV0dXJuIGI7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfcnM2MDAwX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9yczYwMDAsCi0gICAgNjAwMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAicnM2MDAwIiwKLSAgICAicnM2MDAwOjYwMDAiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIHJzNjAwMF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtc2guYyBiL2JmZC9jcHUtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhZGY5Mi4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIEhpdGFjaGktU0ggYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi1zdGF0aWMgYm9vbGVhbiAKLXNjYW5fbWFjaCAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBpZiAoc3RyY2FzZWNtcCAoaW5mby0+cHJpbnRhYmxlX25hbWUsIHN0cmluZykgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNpZiAwCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHJldHVybnMgd2hldGhlcgotICAgdGhleSdkIGJlIGNvbXBhdGlibGUgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoIHx8IGEtPm1hY2ggIT0gYi0+bWFjaCkKLSAgIHJldHVybiBOVUxMOwotICByZXR1cm4gYTsKLX0KLSNlbmRpZgotCi0jZGVmaW5lIFNIX05FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KLSNkZWZpbmUgU0gzX05FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMV0KLSNkZWZpbmUgU0gzRV9ORVhUIE5VTEwKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc2gsCi0gICAgYmZkX21hY2hfc2gzLAotICAgICJzaCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAgICJzaDMiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMSwKLSAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIHNjYW5fbWFjaCwKLSAgICBTSDNfTkVYVAotICB9LAotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zaCwKLSAgICBiZmRfbWFjaF9zaDNlLAotICAgICJzaCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAgICJzaDNlIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0gzRV9ORVhUCi0gIH0sCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NoX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3NoLAotICBiZmRfbWFjaF9zaCwKLSAgInNoIiwJCQkJLyogYXJjaF9uYW1lICAqLwotICAic2giLAkJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgU0hfTkVYVAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtc3BhcmMuYyBiL2JmZC9jcHUtc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0YmQ5Mi4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBTUEFSQyBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBEb24ndCBtaXggMzIgYml0IGFuZCA2NCBiaXQgZmlsZXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpzcGFyY19jb21wYXRpYmxlCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLXNwYXJjX2NvbXBhdGlibGUgKGEsIGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotICBpZiAoYS0+Yml0c19wZXJfd29yZCAhPSBiLT5iaXRzX3Blcl93b3JkKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6c3BhcmNsZXQiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFsxXSwKLSAgfSwKLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzpzcGFyY2xpdGUiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFsyXSwKLSAgfSwKLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cywKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OHBsdXMiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFszXSwKLSAgfSwKLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6djhwbHVzYSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzRdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnNwYXJjbGl0ZV9sZSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzVdLAotICB9LAotICB7Ci0gICAgNjQsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgNjQsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjksCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6djkiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFs2XSwKLSAgfSwKLSAgewotICAgIDY0LAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDY0LAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3Y5YSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OWEiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAwLAotICB9Ci19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NwYXJjX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmMsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmMiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIGRlZmF1bHQgKi8KLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzBdLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS10aWMzMC5jIGIvYmZkL2NwdS10aWMzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDcyM2Y3Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtdGljMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljMzBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfdGljMzAsCi0gIDAsCQkJCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICJ0aWMzMCIsCi0gICJ0bXMzMjBjMzAiLAotICAyLAotICB0cnVlLAkJCQkvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIGJmZF9kZWZhdWx0X3NjYW4sCi0gIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS10aWM4MC5jIGIvYmZkL2NwdS10aWM4MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDI4NjZlLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtdGljODAuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgVEkgVE1TMzIwQzgwIChNVlApIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBzdXBwb3J0IChmbmZAY3lnbnVzLmNvbSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljODBfYXJjaCA9Ci0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3RpYzgwLAkJLyogYmZkX2FyY2hpdGVjdHVyZSBlbnVtICovCi0gICAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAidGljODAiLAkJCS8qIGFyY2hpdGVjdHVyZSBuYW1lICovCi0gICAgInRpYzgwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDIsCQkJCS8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCi0gICAgdHJ1ZSwJCQkvKiBkZWZhdWx0IG1hY2hpbmUgZm9yIGFyY2hpdGVjdHVyZSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgTlVMTCwJCQkJLyogUG9pbnRlciB0byBuZXh0IGluIGNoYWluICovCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXY4NTAuYyBiL2JmZC9jcHUtdjg1MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mzk0MTNkLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtdjg1MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTkVDIFY4NTAgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgYm9vbGVhbiAKLXNjYW4gKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogc3RyaW5nOwotewotICBjb25zdCBjaGFyICpwdHJfc3JjOwotICBjb25zdCBjaGFyICpwdHJfdHN0OwotICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0KLSAgLyogRmlyc3QgdGVzdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlIGhvdyBtdWNoIG9mIHRoZSBzdXBwbGllZCBzdHJpbmcgbWF0Y2hlcyB3aXRoIHRoZQotICAgICBhcmNoaXRlY3R1cmUsIGVnIHRoZSBzdHJpbmcgbTY4azo2ODAyMCB3b3VsZCBtYXRjaCB0aGUgbTY4ayBlbnRyeQotICAgICB1cCB0byB0aGUgOiwgdGhlbiB3ZSBnZXQgbGVmdCB3aXRoIHRoZSBtYWNoaW5lIG51bWJlciAqLwotCi0gIGZvciAocHRyX3NyYyA9IHN0cmluZywgcHRyX3RzdCA9IGluZm8tPmFyY2hfbmFtZTsgCi0gICAgICAgKnB0cl9zcmMgJiYgKnB0cl90c3Q7Ci0gICAgICAgcHRyX3NyYysrLCBwdHJfdHN0KyspIAotICAgIHsKLSAgICAgIGlmICgqcHRyX3NyYyAhPSAqcHRyX3RzdCkgYnJlYWs7Ci0gICAgfQotCi0gIC8qIENoZXdlZCB1cCBhcyBtdWNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgYXMgd2lsbCBtYXRjaCwgc2tpcCBhbnkKLSAgICAgY29sb25zICovCi0gIGlmICgqcHRyX3NyYyA9PSAnOicpCi0gICAgcHRyX3NyYysrOwotICAKLSAgaWYgKCpwdHJfc3JjID09IDApCi0gICAgewotICAgICAgLyogbm90aGluZyBtb3JlLCB0aGVuIG9ubHkga2VlcCB0aGlzIG9uZSBpZiBpdCBpcyB0aGUgZGVmYXVsdAotCSBtYWNoaW5lIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLwotICAgICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OwotICAgIH0KLQotICBudW1iZXIgPSAwOwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwdHJfc3JjKSkKLSAgICB7Ci0gICAgICBudW1iZXIgPSBudW1iZXIgKiAxMCArICogcHRyX3NyYyAgLSAnMCc7Ci0gICAgICBwdHJfc3JjKys7Ci0gICAgfQotCi0gIHN3aXRjaCAobnVtYmVyKSAKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZTogIGFyY2ggPSBiZmRfYXJjaF92ODUwOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogYXJjaCA9IGJmZF9hcmNoX3Y4NTA7IGJyZWFrOwotICAgIGRlZmF1bHQ6ICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGFyY2ggIT0gaW5mby0+YXJjaCkgCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChudW1iZXIgIT0gaW5mby0+bWFjaCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF92ODUwLCBudW1iZXIsICJ2ODUwIiwgcHJpbnQsIDIsIGRlZmF1bHQsIFwKLSAgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgc2NhbiwgbmV4dCB9Ci0KLSNkZWZpbmUgTkVYVCBOVUxMCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIE4gKGJmZF9tYWNoX3Y4NTBlLCAgInY4NTBlIiwgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4gKGJmZF9tYWNoX3Y4NTBlYSwgInY4NTBlYSIsIGZhbHNlLCBOVUxMKQotfTsKLQotI3VuZGVmIE5FWFQKLSNkZWZpbmUgTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFswXQotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Y4NTBfYXJjaCA9Ci0gIE4gKGJmZF9tYWNoX3Y4NTAsICJ2ODUwIiwgdHJ1ZSwgTkVYVCk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LXZheC5jIGIvYmZkL2NwdS12YXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjNmQzOS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciB2YXggc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3ZheF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfdmF4LAotICAgIDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgInZheCIsCi0gICAgInZheCIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdzY1LmMgYi9iZmQvY3B1LXc2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJiZjA0Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtdzY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgV0RDIDY1ODE2IGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXc2NWVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHc2NW91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi1pbnQgYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCgpOwotCi1zdGF0aWMgYm9vbGVhbiAKLXNjYW5fbWFjaCAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBpZiAoc3RyY21wKHN0cmluZywidzY1IikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJ3NjU4MTYiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF93NjVfYXJjaCA9Ci17Ci0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwotICAyNCwJCQkJLyogMjQgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfdzY1LAotICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAidzY1IiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJ3NjUiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgc2Nhbl9tYWNoLAotICAwLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtd2UzMmsuYyBiL2JmZC9jcHUtd2UzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4Y2JjMS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXdlMzJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIHdlMzJrIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEJyZW5kYW4gS2Vob2UgKGJyZW5kYW5AY3Mud2lkZW5lci5lZHUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF93ZTMya19hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfd2UzMmssCi0gICAgMzIwMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgIndlMzJrIiwKLSAgICAid2UzMms6MzIwMDAiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXo4ay5jIGIvYmZkL2NwdS16OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjZThlYi4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXo4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBaODAwbiBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLSNpZiAwCQkJCS8qIG5vdCB1c2VkIGN1cnJlbnRseSAqLwotLyoKLVJlbG9jYXRpb25zIGZvciB0aGUgWjhLCi0KLSovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ob3d0bzE2X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgSE9XVE9fUFJFUEFSRSAocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ob3d0bzhfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgSE9XVE9fUFJFUEFSRSAocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhvd3RvOF9GRm5uX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgICAgICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIGxvbmcgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYWJvcnQgKCk7Ci0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG84X3BjcmVsX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBhYm9ydCAoKTsKLSAgSE9XVE9fUFJFUEFSRSAocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fMTYKLT0gTkVXSE9XVE8gKGhvd3RvMTZfY2FsbGJhY2ssICJhYnMxNiIsIDEsIGZhbHNlLCBmYWxzZSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184Ci09IE5FV0hPV1RPIChob3d0bzhfY2FsbGJhY2ssICJhYnM4IiwgMCwgZmFsc2UsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOF9GRm5uCi09IE5FV0hPV1RPIChob3d0bzhfRkZubl9jYWxsYmFjaywgImZmMDArYWJzOCIsIDAsIGZhbHNlLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfcGNyZWwKLT0gTkVXSE9XVE8gKGhvd3RvOF9wY3JlbF9jYWxsYmFjaywgInBjcmVsOCIsIDAsIGZhbHNlLCB0cnVlKTsKLQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1sb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFyY2gsIGNvZGUpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIHJldHVybiAmaG93dG9fMTY7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9GRm5uOgotICAgICAgcmV0dXJuICZob3d0b184X0ZGbm47Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIHJldHVybiAmaG93dG9fODsKLSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgICAgcmV0dXJuICZob3d0b184X3BjcmVsOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci19Ci0jZW5kaWYKLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2ggKCk7Ci0KLXN0YXRpYyBib29sZWFuCi1zY2FuX21hY2ggKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcCAoc3RyaW5nLCAiejgwMDEiKSA9PSAwIHx8IHN0cmNtcCAoc3RyaW5nLCAiejhrIikgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX21hY2hfejgwMDEgPT0gaW5mby0+bWFjaDsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKHN0cmluZywgIno4MDAyIikgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX21hY2hfejgwMDIgPT0gaW5mby0+bWFjaDsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHJldHVybnMgd2hldGhlcgotICAgdGhleSdkIGJlIGNvbXBhdGlibGUgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChhLCBiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBhLT5tYWNoICE9IGItPm1hY2gpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgezMyLCAzMiwgOCwgYmZkX2FyY2hfejhrLCBiZmRfbWFjaF96ODAwMSwgIno4ayIsICJ6ODAwMSIsIDEsIGZhbHNlLCBjb21wYXRpYmxlLCBzY2FuX21hY2gsIDAsfSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfejhrX2FyY2ggPQotewotICAzMiwgMTYsIDgsIGJmZF9hcmNoX3o4aywgYmZkX21hY2hfejgwMDIsICJ6OGsiLCAiejgwMDIiLCAxLCB0cnVlLCBjb21wYXRpYmxlLCBzY2FuX21hY2gsICZhcmNoX2luZm9fc3RydWN0WzBdLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9kZW1vNjQuYyBiL2JmZC9kZW1vNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxMzgxZC4uMDAwMDAwMAotLS0gYS9iZmQvZGVtbzY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgZGVtb25zdHJhdGlvbiA2NC1iaXQgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSA2NAotI2RlZmluZSBNWShPUCkgQ0FUKGRlbW9fNjRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICAiZGVtbzY0IgotI2luY2x1ZGUgImFvdXRmMS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2RlcC1pbi5zZWQgYi9iZmQvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0ZGRlMC4uMDAwMDAwMAotLS0gYS9iZmQvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTpsb29wCi0vXFwkL04KLXMvXFxcbiAqLyAvZwotdCBsb29wCi0KLXMhXC5vOiEubG86IQotcyEgQEJGRF9IQCEhZwotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAU1JDRElSQC8hIWcKLXMhaG9zdHMvW14gXSpcLmggISAhZwotcy8gc3lzZGVwLmgvL2cKLXMhIFwuXC4vYmZkL3N5c2RlcC5oISFnCi1zLyBsaWJiZmQuaC8vZwotcy8gY29uZmlnLmgvL2cKLXMhIFwkKElOQ0RJUikvZm9wZW4tW14gXSpcLmghIWcKLXMhIFwkKElOQ0RJUikvYW5zaWRlY2xcLmghIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotcy8gKjovOi9nCi0vOiQvZAotCi1zL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAotICAvZwpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9DaGFuZ2VMb2cgYi9iZmQvZG9jL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4MjA3YS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDM5MCArMCwwIEBACi1UaHUgRmViICA0IDIzOjIxOjM2IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBjdXJyZW50IGF1dG9jb25mL2F1dG9tYWtlLgotCi1UaHUgSnVsIDIzIDA5OjM2OjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJmZGludC50ZXhpIChCRkQgRUxGIHByb2Nlc3NvciByZXF1aXJlZCk6IEFkZCBwYXJhZ3JhcGgKLQlkZXNjcmliaW5nIHRoZSBuZWNlc3NpdHkgdG8gY3JlYXRlICJpbmNsdWRlL2VsZi9DUFUuaCIuCi0KLVRodSBNYXkgIDcgMTQ6NDU6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hldy5vKTogQWRkIC1JIG9wdGlvbnMgZm9yIGludGwgc3JjZGlyIGFuZAotCW9iamRpci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByIDI3IDIwOjE5OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkaW50LnRleGk6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9URVhJTkZPUyk6IE5ldyB2YXJpYWJsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByIDEzIDE2OjQ4OjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBcHIgIDYgMTQ6MDY6NTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoU1RBR0VTVFVGRik6IFJlbW92ZSB2YXJpYWJsZS4KLQkoQ0xFQU5GSUxFUyk6IERvbid0IHJlbW92ZSAkKFNUQUdFU1RVRkYpLgotCShESVNUQ0xFQU5GSUxFUywgTUFJTlRBSU5FUkNMRUFORklMRVMpOiBOZXcgdmFyaWFibGVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjcgMTY6MjU6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjaGV3LmMgKHNraXBfd2hpdGVfYW5kX3N0YXJ0cyk6IFJlbW92ZSB1bnVzZWQgZGVjbGFyYXRpb24uCi0JKHNraXBfd2hpdGVfYW5kX3N0YXJzKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShza2lwX3RyYWlsaW5nX25ld2xpbmVzLCBwYXJhbXN0dWZmLCBjb3VyaWVyaXplKTogTGlrZXdpc2UuCi0JKGJ1bGxldGl6ZSwgZG9fZmFuY3lfc3R1ZmYsIGlzY29tbWFuZCk6IExpa2V3aXNlLgotCShraWxsX2JvZ3VzX2xpbmVzLCBuZXh0d29yZCwgbWFpbik6IExpa2V3aXNlLgotCShtYW5nbGVjb21tZW50cyk6IENvbW1lbnQgb3V0LgotCShvdXRwdXRkb3RzLCBraWxsX2JvZ3VzX2xpbmVzKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKHBlcmZvcm0sIGNvbXBpbGUpOiBMaWtld2lzZS4KLQkoY291cmllcml6ZSk6IEZ1bGx5IHBhcmVudGhlc2l6ZSBleHByZXNzaW9uLgotCShjb3B5X3Bhc3RfbmV3bGluZSk6IERlY2xhcmUgcmV0dXJuIHZhbHVlLgotCShwcmludCk6IENoYW5nZSBwcmludGYgZm9ybWF0IHN0cmluZy4KLQkobWFpbik6IENhbGwgdXNhZ2UgZm9yIGFuIHVucmVjb2duaXplZCBvcHRpb24uCi0KLUZyaSBGZWIgMTMgMTQ6Mzc6MTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gSmFuIDI2IDE1OjM4OjM2IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBkb2Muc3RyIChib2R5dGV4dCk6IERvbid0IG91dHB1dCBAKiBhdCB0aGUgZW5kLgotCSogY2hldy5jIChraWxsX2JvZ3VzX2xpbmVzKTogTWFrZSBzdXJlIHRoYXQgYSBwZXJpb2QgYXQgdGhlCi0JYmVnaW5uaW5nIGlzIHJlY29nbml6ZWQuCi0JKGluZGVudCk6IERvbid0IHB1dCBpbmRlbnRhdGlvbiBhdCB0aGUgZW5kLgotCShjb3B5X3Bhc3RfbmV3bGluZSk6IEV4cGFuZCB0YWJzLgotCSogTWFrZWZpbGUuYW0gKHMtcmVsb2MsIHMtc3ltcyk6IERlcGVuZCBvbiBkb2Muc3RyLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBPY3QgIDEgMTQ6NDE6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliYmZkLmgpOiBEb24ndCB1c2UgY3B1LWg4MzAwLmMsIGNwdS1pOTYwLmMsIG9yCi0JZWxmY29kZS5oIGFzIGlucHV0IGZpbGVzOyB0aGV5IGRvbid0IGNvbnRyaWJ1dGUgYW55dGhpbmcuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAxNSAwNDo1NToxNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliYmZkLmgsIGxpYmNvZmYuaCk6IEludm9rZSAkKE1LRE9DKSBhcyAuLyQoTUtET0MpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDEgMTI6NTk6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0NfRk9SX0JVSUxEKTogRG9uJ3Qgc2V0IGV4cGxpY2l0bHkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEp1bCAzMSAyMDowMDoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCi1UdWUgSnVsIDIyIDE0OjQ0OjAwIDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBzdGFtcC0qIGZpbGVzIHRvIHMtKiBmaWxlcy4gIFVzZSBiZmR0LnRleGkKLQlyYXRoZXIgdGhhbiBiZmQudGV4aS4KLSAJKERPQ0ZJTEVTKTogQ2hhbmdlIGJmZC50ZXhpIHRvIGJmZHQudGV4aS4KLQkqIGJmZC50ZXhpbmZvOiBJbmNsdWRlIGJmZHQudGV4aSwgbm90IGJmZC50ZXhpLgotCi1Nb24gSnVuIDE2IDE1OjMzOjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDLCBDRkxBR1MpOiBTdWJzdGl0dXRlIGZyb20gY29uZmlndXJlIHNjcmlwdC4KLQlGcm9tIEplZmYgTWFrZXkgPGplZmZAY3RzLmNvbT4uCi0KLVR1ZSBBcHIgMTUgMTI6Mzc6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogVXNlIG1raW5zdGFsbGRpcnMgdG8gYnVpbGQKLQkkKGluZm9kaXIpLgotCi1UdWUgQXByICA4IDEyOjQ5OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFBlcm1pdCBpbmZvIGZpbGVzIHRvIGJlIGluIHNyY2Rpci4KLQkoc3RhbXAtKik6IEFkZCBhIHN0YW1wLVggdGFyZ2V0IGZvciBlYWNoIFgudGV4aSB0YXJnZXQuCi0JKCoudGV4aSk6IEp1c3QgZGVwZW5kIHVwb24gc3RhbXAtWC4KLQkoY2xlYW4pOiBSZW1vdmUgc3RhbXAtKi4KLQkoZGlzdGNsZWFuKTogRGVwZW5kIHVwb24gbW9zdGx5Y2xlYW4uICBSZW1vdmUgc3RhbXAtKi4gIERvbid0Ci0JcmVtb3ZlICQoRE9DRklMRVMpLgotCi1Nb24gQXByICA3IDE1OjIzOjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IHJlbW92ZSAqLmluZm8gZmlsZXMuCi0KLVRodSBGZWIgMTMgMjA6NTA6MDIgMTk5NyAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCi0KLQkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCi0KLVR1ZSBKdW4gMTggMTg6MzI6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjaGV3LmMgKGtpbGxfYm9ndXNfbGluZXMpOiBSZXNldCBzbCB3aGVuIG5vdCBhdCB0aGUgc3RhcnQgb2YgYQotCWxpbmUuICBGcm9tIFV3ZSBPaHNlIDx1d2VAdGlya2EuZ3VuLmRlPi4KLQotVHVlIEphbiAzMCAxNDoxMDo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBNYWtlZmlsZS5pbiAobGliYmZkLmgpOiBEZXBlbmQgdXBvbiBwcm90by5zdHIuCi0JKGxpYmNvZmYuaCwgYmZkLmgpOiBMaWtld2lzZS4KLQotRnJpIE5vdiAgMyAxNDo0Njo0OCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNSQ0RPQywgU1JDUFJPVCwgY29yZS50ZXhpLCBiZmQuaCk6ICBVc2UgY29yZWZpbGUuYywgCi0JcmVuYW1lZCBmcm9tIGNvcmUuYy4KLQotV2VkIE5vdiAgMSAxNDoyODoyMyAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY2hldy5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQotRnJpIE9jdCAgNiAxNjoyMzozNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IE9ubHkgcmVtYWtlIHRoaXMgTWFrZWZpbGUuCi0KLVdlZCBPY3QgIDQgMTU6NTE6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNoZXcuYzogSW5jbHVkZSA8c3RkaW8uaD4uCi0KLVR1ZSBTZXAgMTIgMTg6MTQ6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0KLVRodSBBdWcgMzEgMTI6MTg6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiBBZGQgYWRkaXRpb25hbCAjZW5kaWYgYXQgZW5kIG9mIGJmZC5oIGlmCi0JX19jcGx1c3BsdXMgaXMgZGVmaW5lZC4KLQotVHVlIE5vdiAyOSAxNjoxMzozNCAxOTk0ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjaGV3LmMgKHdyaXRlX2J1ZmZlcik6IE5ldyBhcmd1bWVudCBgZicsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKHN0ZG91dCwgc3RkZXJyLCBwcmludCwgZHJvcCwgaWRyb3ApOiBOZXcgZm9ydGggd29yZHMuCi0JKiBwcm90by5zdHIgKENPTU1FTlQpOiBOZXcgY29tbWFuZC4KLQkqIGRvYy5zdHIgKENPTU1FTlQpOiBMaWtld2lzZS4KLQotTW9uIFNlcCAxMiAxMTo0NDoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChET0NGSUxFUyk6IFJlbW92ZSBjdG9yLnRleGkuCi0JKElQUk9UT1MpOiBSZW1vdmUgY3Rvci5pcC4KLQkoU1JDSVBST1QpOiBSZW1vdmUgJChzcmNkaXIpLy4uL2N0b3IuYy4KLQkoY3Rvci50ZXhpKTogUmVtb3ZlIHRhcmdldC4KLQkobGliYmZkLmgpOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiAkKHNyY2RpcikvLi4vY3Rvci5jLiAgUmVtb3ZlCi0JJChNS0RPQykgcnVuIG9uICQoc3JjZGlyKS8uLi9jdG9yLmMuCi0JKiBiZmQudGV4aW5mbyAoQ29uc3RydWN0b3JzKTogUmVtb3ZlIHNlY3Rpb24uCi0KLUZyaSBTZXAgIDIgMTM6MzM6NDQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiBJbmNsdWRlIGFzc2VydC5oLiAgQWRkZWQgcHJvdG90eXBlcyBmb3IgbW9zdCBmdW5jdGlvbnMuCi0JQ2hhbmdlZCBtb3N0IHVzZXMgb2YgaW50IHRvIGxvbmcuICBEbyBib3VuZHMgY2hlY2tpbmcgb24gdGhlCi0Jc3RhY2tzLiAgQWRkZWQgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIGRvY3VtZW50aW5nIG1vc3Qgb2YgdGhlCi0JaW50cmluc2ljcy4gIExvdHMgb2Ygd2hpdGVzcGFjZSBjaGFuZ2VzLiAgUmUtb3JkZXJlZCBzb21lCi0JZnVuY3Rpb25zLgotCShkaWUsIGNoZWNrX3JhbmdlLCBpY2hlY2tfcmFuZ2UpOiBOZXcgZnVuY3Rpb25zLgotCShzdHJpcF90cmFpbGluZ19uZXdsaW5lcywgcHJpbnRfc3RhY2tfbGV2ZWwpOiBOZXcgZnVuY3Rpb25zLgotCSh0cmFuc2xhdGVjb21tZW50cyk6IERvbid0IGluc2VydCB0YWIgYmVmb3JlICIvKiIuCi0JKGlzY29tbWFuZCk6IE1pbmltdW0gY29tbWFuZCBsZW5ndGggaXMgbm93IDQuCi0JKG5leHR3b3JkKTogSGFuZGxlIHNvbWUgXC1zZXF1ZW5jZXMuCi0JKHB1c2hfYWRkcik6IERlbGV0ZWQuCi0JKG1haW4pOiBBZGQgbmV3IGludHJpbnNpY3Mgc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMgYW5kCi0JcHJpbnRfc3RhY2tfbGV2ZWwuICBDb21wbGFpbiBhdCBlbmQgaWYgc3RhY2sgY29udGFpbnMgbW9yZSB0aGFuCi0Jb25lIGVsZW1lbnQsIG9yIGxlc3MuCi0JKHJlbWNoYXIpOiBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBub3QgZW1wdHkgYmVmb3JlIGNob3BwaW5nIG9mZiBhCi0JY2hhcmFjdGVyLgotCi0JKiBkb2Muc3RyLCBwcm90by5zdHI6IEhhbmRsZSBuZXcgY29tbWFuZHMgU0VOVU0sIEVOVU0sIEVOVU1YLAotCUVOVU1FUSwgRU5VTUVRWCwgRU5VTURPQy4KLQotV2VkIEphbiAxMiAxODozNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvOiBBZGRlZCBMaW5rZXIgRnVuY3Rpb25zIG5vZGUuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKERPQ0ZJTEVTKTogQWRkZWQgbGlua2VyLnRleGkuCi0JKFNSQ0RPQyk6IEFkZGVkIGxpbmtlci5jLgotCShsaW5rZXIudGV4aSk6IE5ldyB0YXJnZXQuCi0KLVR1ZSBKYW4gIDQgMTA6NTI6NTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IERvbid0IHJlbHkgb24gYSBjb3JyZWN0IGRlY2xhcmF0aW9uIG9mIGV4aXQuCi0JKGNoZXdfZXhpdCk6IE5ldyBmdW5jdGlvbiB3aGljaCBqdXN0IGNhbGxzIGV4aXQuCi0JKG1haW4pOiBVc2UgaXQuCi0KLU1vbiBKYW4gIDMgMTE6NDA6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogQWRkZWQgSGFzaCBUYWJsZXMgbm9kZS4KLQkqIE1ha2VmaWxlLmluIChET0NGSUxFUyk6IEFkZGVkIGhhc2gudGV4aS4KLQkoU1JDRE9DKTogQWRkZWQgaGFzaC5jLgotCShoYXNoLnRleGkpOiBOZXcgdGFyZ2V0LgotCi1UaHUgRGVjIDMwIDE2OjU3OjA0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBEZWxldGUgYWxsIHJlZmVyZW5jZXMgdG8gc2VjbGV0LmMsIHNpbmNlIGl0J3MganVzdAotCWJlZW4gZGVsZXRlZC4gIERvbid0IG1lbnRpb24gaGFzaC5jLCBsaW5rZXIuYywgb3IgZ2VubGluay5oIHlldCwKLQlzaW5jZSB0aGV5IGRvbid0IGNvbnRhaW4gZG9jdW1lbnRhdGlvbiB5ZXQgKGhpbnQsIGhpbnQhKS4KLQotRnJpIE5vdiAgNSAxMDo1ODo1MyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvOiBTbWFsbCBjbGVhbnVwcy4KLQotRnJpIE5vdiAxOSAwMzo0NjoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcmNodXJlcy50ZXhpKTogRGVwZW5kcyBvbiAkKE1LRE9DKS4KLQotVHVlIEF1ZyAxMCAxNDoyMjozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvIChCRkQgYmFjayBlbmQpOiBEb24ndCBpbmNsdWRlIGVsZmNvZGUudGV4aSwgc2luY2UKLQlpdCdzIGVtcHR5IG5vdyBhbmQgdGhhdCB0cmlnZ2VycyBhIG1ha2VpbmZvIGJ1Zy4KLQotTW9uIEF1ZyAgOSAxNjoyNzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvIChCRkQgYmFjayBlbmQpOiBOZXcgc2VjdGlvbiBvbiBFTEYsIGluY2x1ZGVzCi0JZWxmLnRleGkgYW5kIGVsZmNvZGUudGV4aS4KLQkqIE1ha2VmaWxlLmluIChET0NGSUxFUyk6IEluY2x1ZGUgZWxmLnRleGksIGVsZmNvZGUudGV4aS4KLQkoU1JDRE9DKTogSW5jbHVkZSBlbGZjb2RlLmgsIGVsZi5jLgotCShlbGYudGV4aSwgZWxmY29kZS50ZXhpKTogTmV3IGludGVybWVkaWF0ZSB0YXJnZXRzLgotCi1UaHUgSnVuIDI0IDEzOjQ4OjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKC5jLm8sIGNoZXcubyk6IFB1dCBDRkxBR1MgbGFzdC4KLQkqIGJmZHN1bW0udGV4aTogTmV3IGZpbGUsIGJyb2tlbiBvdXQgb2YgYmZkLnRleGluZm8sIHRvIHNoYXJlCi0Jd2l0aCBsZC50ZXhpbmZvLgotCi1Nb24gSnVuIDE0IDEyOjA3OjA3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IHJlbW92ZSBwYXJlbnRkaXIgY3J1ZnQsIAotCi1XZWQgSnVuICA5IDE2OjAwOjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBSZW1vdmUgY2hldy5vLgotCi1UdWUgTWF5IDI1IDE0OjQ2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogVXNlIGVsZmNvZGUuaCwgbm90IGVsZjMyLmMuCi0KLU1vbiBNYXkgMjQgMTU6NTA6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNoZXcuYyAoY29tcGlsZSk6IEFkZCBhIGNvdXBsZSBvZiBtaXNzaW5nIGNhc3RzLgotCi1XZWQgTWF5IDEyIDE0OjQ1OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lIHRvIGJlICQoQ0MpLgotCShjaGV3Lm8sICQoTUtET0MpKTogQnVpbGQgdXNpbmcgQ0NfRk9SX0JVSUxEIHJhdGhlciB0aGFuIENDLCBzaW5jZQotCWl0IG11c3QgcnVuIG9uIHRoZSBidWlsZCBtYWNoaW5lLgotCi1UdWUgQXByICA2IDIyOjM4OjEwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hldyk6ICBEb24ndCBjb21waWxlIGZyb20gLmMgdG8gZXhlY3V0YWJsZSBpbiBhCi0Jc2luZ2xlIHN0ZXA7IGl0IHB1dHMgYSB0ZW1wb3JhcnkgLm8gZmlsZW5hbWUgaW50byB0aGUgZXhlY3V0YWJsZSwKLQl3aGljaCBtYWtlcyBtdWx0aS1zdGFnZSBjb21wYXJpc29ucyBmYWlsLiAgQ29tcGlsZSBjaGV3LmMgdG8KLQljaGV3Lm8sIGFuZCBsaW5rIHRoYXQsIHdoaWNoIG1ha2VzIGlkZW50aWNhbCBleGVjdXRhYmxlcyBldmVyeSB0aW1lLgotCi1XZWQgTWFyIDI0IDE3OjI2OjI5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IHR5cG8gKGJmZC50ZXhpbmZvIG5vdCBiZmQudGV4aW5vKQotCi1GcmkgTWFyIDE5IDAxOjEzOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogU2luY2UgQkZEIHZlcnNpb24gbnVtYmVyIGhhcyBiZWVuIGJ1bXBlZCwgZG8gc2FtZQotCXRvICJ2ZXJzaW9uIG51bWJlciIgb24gdGl0bGUgcGFnZSwgYW5kIGVsc2V3aGVyZS4gIFNob3VsZCBiZQotCWZpeGVkIHRvIGV4dHJhY3QgcmVhbCB2ZXJzaW9uIG51bWJlci4KLQotVHVlIE1hciAxNiAxMjoxNToxMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkICpjbGVhbiBydWxlcy4KLQotTW9uIEphbiAxMSAxODo0Mzo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsaWJiZmQuaCk6IFJlbW92ZWQgZHVwbGljYXRlIGluaXQuYyBhbmQgbGliYmZkLmMuCi0JQWRkZWQgc2VjbGV0LmMuCi0JKGJmZC5oKTogQWRkZWQgZGVwZW5kZW5jeSBvbiBiZmQuYyBhbmQgc2VjbGV0LmMuICBBZGRlZCBzZWNsZXQuYwotCXRvIGJ1aWxkLgotCi1UaHUgRGVjIDE3IDE5OjM1OjQzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGR2aSB0YXJnZXQsIGRlZmluZSBhbmQgdXNlICQoVEVYSTJEVkkpCi0KLVRodSBEZWMgIDMgMTc6NDI6NDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEVYSURJUik6IE5ldyB2YXJpYWJsZS4KLQkoYmZkLmR2aSk6IExvb2sgZm9yIGJmZC50ZXhpbmZvIGluICQoc3JjZGlyKS4gIEdlbmVyYXRlIGluZGV4LgotCi0JKiBiZmQudGV4aW5mbzogTWlub3IgZG9jIGZpeGVzLgotCi1UaHUgTm92ICA1IDAzOjEzOjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW51cDogIFJlcGxhY2UgYWxsIHVzZXMgb2YgRVhGVU4gaW4gdGhlIEJGRCBzb3VyY2VzLCB3aXRoIFBBUkFNUy4KLQotIAkqIGRvYy9jaGV3LmMgKGV4ZnVuc3R1ZmYpOiAgRWxpbWluYXRlLgotCShwYXJhbXN0dWZmKTogIFJlcGxhY2UgZXhmdW5zdHVmZiB3aXRoIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIFBBUkFNUy4KLQkqIGRvYy9wcm90by5zdHI6ICBVc2UgcGFyYW1zdHVmZiByYXRoZXIgdGhhbiBleGZ1bnN0dWZmLgotCi1Nb24gQXVnIDE3IDEyOjQwOjMyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IHZhcmlvdXMgcGF0Y2hlcyBwcm92aWRlZCBieSBIb3dhcmQgQ2h1LgotCi1GcmkgSnVuIDE5IDE4OjU5OjU0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGliYmZkLmgpOiAgQWRkIGVsZi5jIGFzIGEgc291cmNlIG9mIHByb3RvdHlwZXMuCi0KLU1vbiBNYXkgMTEgMTg6NTU6NTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogIGV4aXQoKSBzaG91bGQgYmUgZGVjbGFyZWQgYnkgY29uZmlnIGZpbGVzLCBub3QgYnkKLQlwb3J0YWJsZSBzb3VyY2UgY29kZS4gIEl0cyB0eXBlIGNvdWxkIGJlIGludCBvciB2b2lkIGZ1bmN0aW9uLgkKLQotTW9uIE1heSAgNCAxMzo0NTo1NyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbm90aGVyIENGTEFHUyBjb3JyZWN0aW9uLgotCi1UdWUgQXByIDI4IDEwOjIxOjMyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IERvIHRoZSBDRkxBR1MgdGhpbmcuCi0KLUZyaSBBcHIgMTAgMjI6MzQ6NTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNSU5VU19HKTogIEFkZCBtYWNybyBhbmQgZGVmYXVsdCB0byAtZy4KLQotRnJpIE1hciAgNiAxODo1MzoxOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiBub3cgaGFzIC13IHN3aXRjaCB0dXJuIG9uIHdhcm5pbmdzCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1UdWUgRGVjIDEwIDIyOjExOjA1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGJ1aWxkIGNoZXcgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBDb21wbGV0ZQotCSAgdGhlIE1LRE9DIG1hY3JvIHRyYW5zaXRpb24uCi0KLVR1ZSBEZWMgMTAgMDg6MjY6MjggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogZG9uJ3QgY29yZSBkdW1wIHdoZW4gY2FuJ3Qgb3BlbiBmaWxlCi0JKiBNYWtlZmlsZS5pbjogZ2V0IHByb3RvLnN0ciBmcm9tIHRoZSByaWdodCBwbGFjZSB3aGVuIGJ1aWx0IGluCi0Jb2RkIGRpcmVjdG9yaWVzCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLVNhdCBEZWMgIDcgMTc6MDE6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogTXVjaCBtb2RpZmllZAotCSogcHJvdG8uc3RyLCBkb2Muc3RyOiBOZXcgZmlsZXMgZm9yIGV4dHJhY3RpbmcgdG8gcHJvZHVjdAotCXByb3RvdHlwZXMgYW5kIGRvY3VtZW50cyByZXNwZWN0aXZlbHkuCi0KLQotRnJpIERlYyAgNiAyMjo1NzoxMiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdGFuZGFyZHMudGV4dCBzdXBwb3J0LCBob3N0L3NpdGUvdGFyZ2V0Ci0JICBpbmNsdXNpb24gaG9va3MsIGluc3RhbGwgdXNpbmcgSU5TVEFMTF9EQVRBIHJhdGhlciB0aGFuIGNwLAotCSAgZG9uJ3QgZWNobyBvbiBpbnN0YWxsLgotCi1UaHUgRGVjICA1IDIyOjQ2OjE3IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9NYWtlZmlsZS5hbSBiL2JmZC9kb2MvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTI2OGUuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotRE9DRklMRVMgPSBhb3V0eC50ZXhpICBhcmNoaXZlLnRleGkgYXJjaHVyZXMudGV4aSBcCi0JYmZkdC50ZXhpICBjYWNoZS50ZXhpIGNvZmZjb2RlLnRleGkgXAotCWNvcmUudGV4aSBlbGYudGV4aSBlbGZjb2RlLnRleGkgIGZvcm1hdC50ZXhpICBsaWJiZmQudGV4aSAgXAotCW9wbmNscy50ZXhpICByZWxvYy50ZXhpICBzZWN0aW9uLnRleGkgIFwKLQlzeW1zLnRleGkgIHRhcmdldHMudGV4aSBpbml0LnRleGkgaGFzaC50ZXhpIGxpbmtlci50ZXhpCi0KLVBST1RPUyA9IGFyY2hpdmUucCBhcmNodXJlcy5wIGJmZC5wIFwKLQkgY29yZS5wIGZvcm1hdC5wIFwKLQlsaWJiZmQucCBvcG5jbHMucCByZWxvYy5wIFwKLQlzZWN0aW9uLnAgc3ltcy5wIHRhcmdldHMucCAgXAotCWZvcm1hdC5wICBjb3JlLnAgaW5pdC5wCi0KLUlQUk9UT1MgPSBjYWNoZS5pcCBsaWJiZmQuaXAgcmVsb2MuaXAgaW5pdC5pcCBhcmNodXJlcy5pcCBjb2ZmY29kZS5pcAotCi0jIFNSQ0RPQywgU1JDUFJPVCwgU1JDSVBST1Qgb25seSB1c2VkIHRvIHNpZGVzdGVwIFN1biBNYWtlIGJ1ZyBpbiBpbnRlcmFjdGlvbiAKLSMgYmV0d2VlbiBWUEFUSCBhbmQgc3VmZml4IHJ1bGVzLiAgSWYgeW91IHVzZSBHTlUgTWFrZSwgcGVyaGFwcyBvdGhlciBNYWtlcywKLSMgeW91IGRvbid0IG5lZWQgdGhlc2UgdGhyZWU6Ci1TUkNET0MgPSAkKHNyY2RpcikvLi4vYW91dHguaCAgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyBcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpLy4uL2JmZC5jIFwKLQkkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCBcCi0JJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpLy4uL2VsZi5jIFwKLQkkKHNyY2RpcikvLi4vZWxmY29kZS5oICAkKHNyY2RpcikvLi4vZm9ybWF0LmMgXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvLi4vb3BuY2xzLmMgXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jICAkKHNyY2RpcikvLi4vc2VjdGlvbi5jIFwKLQkkKHNyY2RpcikvLi4vc3ltcy5jICAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jIFwKLQkkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS8uLi9saW5rZXIuYwotCi1TUkNQUk9UID0gJChzcmNkaXIpLy4uL2FyY2hpdmUuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCi0JJChzcmNkaXIpLy4uL2JmZC5jICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oICQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jIFwKLQkkKHNyY2RpcikvLi4vZm9ybWF0LmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKLQkkKHNyY2RpcikvLi4vb3BuY2xzLmMgJChzcmNkaXIpLy4uL3JlbG9jLmMgXAotCSQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgJChzcmNkaXIpLy4uL3N5bXMuYyBcCi0JJChzcmNkaXIpLy4uL3RhcmdldHMuYyAkKHNyY2RpcikvLi4vaW5pdC5jCi0KLVNSQ0lQUk9UID0gJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvLi4vY3B1LWg4MzAwLmMgXAotCSQoc3JjZGlyKS8uLi9jcHUtaTk2MC5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKLQkkKHNyY2RpcikvLi4vaW5pdC5jCi0KLVRFWElESVIgPSAkKHNyY2RpcikvLi4vLi4vdGV4aW5mby9mc2YKLQotaW5mb19URVhJTkZPUyA9IGJmZC50ZXhpbmZvCi0KLU1LRE9DID0gY2hldyQoRVhFRVhUX0ZPUl9CVUlMRCkKLQotJChNS0RPQyk6IGNoZXcubwotCSQoQ0NfRk9SX0JVSUxEKSAtbyAkKE1LRE9DKSBjaGV3Lm8gJChMT0FETElCRVMpICQoTERGTEFHUykKLQotY2hldy5vOiBjaGV3LmMKLQkkKENDX0ZPUl9CVUlMRCkgLWMgLUkuLiAtSSQoc3JjZGlyKS8uLiAtSSQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uLy4uL2ludGwgLUkuLi8uLi9pbnRsICQoSF9DRkxBR1MpICQoQ0ZMQUdTKSAkKHNyY2RpcikvY2hldy5jCi0KLXByb3RvczogbGliYmZkLmggbGliY29mZi5oIGJmZC5oCi0KLWJmZC5pbmZvIGJmZC5kdmk6ICQoRE9DRklMRVMpIGJmZHN1bW0udGV4aSBiZmQudGV4aW5mbwotCi0jIFdlIGNhbid0IHJlcGxhY2UgdGhlc2UgcnVsZXMgd2l0aCBhbiBpbXBsaWNpdCBydWxlLCBiZWNhdXNlCi0jIG1ha2VzIHdpdGhvdXQgVlBBVEggc3VwcG9ydCBjb3VsZG4ndCBmaW5kIHRoZSAuaCBmaWxlcyBpbiBgLi4nLgotCi0jIFdlIHVzZSBzLVhYWCB0YXJnZXRzIHNvIHRoYXQgd2UgY2FuIGRpc3RyaWJ1dGUgdGhlIGluZm8gZmlsZXMsCi0jIGFuZCBwZXJtaXQgcGVvcGxlIHRvIHJlYnVpbGQgdGhlbSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIG1ha2VpbmZvCi0jIHByb2dyYW0uICBJZiBzb21lYm9keSB0cmllcyB0byByZWJ1aWxkIGluZm8sIGJ1dCBub25lIG9mIHRoZSAudGV4aQotIyBmaWxlcyBoYXZlIGNoYW5nZWQsIHRoZW4gdGhpcyBNYWtlZmlsZSB3aWxsIGJ1aWxkIGNoZXcsIGFuZCB3aWxsCi0jIGJ1aWxkIGFsbCBvZiB0aGUgc3RhbXAgZmlsZXMsIGJ1dCB3aWxsIG5vdCBhY3R1YWxseSBoYXZlIHRvIHJlYnVpbGQKLSMgYmZkLmluZm8uCi0KLXMtYW91dHg6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hb3V0eC5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FvdXR4LmggPmFvdXR4LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhb3V0eC50bXAgYW91dHgudGV4aQotCXRvdWNoIHMtYW91dHgKLWFvdXR4LnRleGk6IHMtYW91dHgKLQotcy1hcmNoaXZlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+YXJjaGl2ZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaGl2ZS50bXAgYXJjaGl2ZS50ZXhpCi0JdG91Y2ggcy1hcmNoaXZlCi1hcmNoaXZlLnRleGk6IHMtYXJjaGl2ZQotCi1zLWFyY2h1cmVzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+YXJjaHVyZXMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFyY2h1cmVzLnRtcCBhcmNodXJlcy50ZXhpCi0JdG91Y2ggcy1hcmNodXJlcwotYXJjaHVyZXMudGV4aTogcy1hcmNodXJlcwotCi0jIFdlIHVzZSBiZmR0LnRleGksIHJhdGhlciB0aGFuIGJmZC50ZXhpLCB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoCi0jIGJmZC50ZXhpbmZvIG9uIGFuIDguMyBmaWxlc3lzdGVtLgotcy1iZmQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vYmZkLmMgPmJmZC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLnRtcCBiZmR0LnRleGkKLQl0b3VjaCBzLWJmZAotYmZkdC50ZXhpOiBzLWJmZAotCi1zLWNhY2hlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vY2FjaGUuYyA+Y2FjaGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNhY2hlLnRtcCBjYWNoZS50ZXhpCi0JdG91Y2ggcy1jYWNoZQotY2FjaGUudGV4aTogcy1jYWNoZQotCi1zLWNvZmZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oID5jb2ZmY29kZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY29mZmNvZGUudG1wIGNvZmZjb2RlLnRleGkKLQl0b3VjaCBzLWNvZmZjb2RlCi1jb2ZmY29kZS50ZXhpOiBzLWNvZmZjb2RlCi0KLXMtY29yZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vY29yZWZpbGUuYyA+Y29yZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY29yZS50bXAgY29yZS50ZXhpCi0JdG91Y2ggcy1jb3JlCi1jb3JlLnRleGk6IHMtY29yZQotCi1zLWVsZjogJChNS0RPQykgJChzcmNkaXIpLy4uL2VsZi5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZi5jID5lbGYudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGVsZi50bXAgZWxmLnRleGkKLQl0b3VjaCBzLWVsZgotZWxmLnRleGk6IHMtZWxmCi0KLXMtZWxmY29kZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2VsZmNvZGUuaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9lbGZjb2RlLmggPmVsZmNvZGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGVsZmNvZGUudG1wIGVsZmNvZGUudGV4aQotCXRvdWNoIHMtZWxmY29kZQotZWxmY29kZS50ZXhpOiBzLWVsZmNvZGUKLQotcy1mb3JtYXQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9mb3JtYXQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+Zm9ybWF0LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBmb3JtYXQudG1wIGZvcm1hdC50ZXhpCi0JdG91Y2ggcy1mb3JtYXQKLWZvcm1hdC50ZXhpOiBzLWZvcm1hdAotCi1zLWxpYmJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9saWJiZmQuYyA+bGliYmZkLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQudG1wIGxpYmJmZC50ZXhpCi0JdG91Y2ggcy1saWJiZmQKLWxpYmJmZC50ZXhpOiBzLWxpYmJmZAotCi1zLW9wbmNsczogJChNS0RPQykgJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciAgPCQoc3JjZGlyKS8uLi9vcG5jbHMuYyA+b3BuY2xzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBvcG5jbHMudG1wIG9wbmNscy50ZXhpCi0JdG91Y2ggcy1vcG5jbHMKLW9wbmNscy50ZXhpOiBzLW9wbmNscwotCi1zLXJlbG9jOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9yZWxvYy5jID5yZWxvYy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgcmVsb2MudG1wIHJlbG9jLnRleGkKLQl0b3VjaCBzLXJlbG9jCi1yZWxvYy50ZXhpOiBzLXJlbG9jCi0KLXMtc2VjdGlvbjogJChNS0RPQykgJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgPnNlY3Rpb24udG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHNlY3Rpb24udG1wIHNlY3Rpb24udGV4aQotCXRvdWNoIHMtc2VjdGlvbgotc2VjdGlvbi50ZXhpOiBzLXNlY3Rpb24KLQotcy1zeW1zOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc3ltcy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3N5bXMuYyA+c3ltcy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc3ltcy50bXAgc3ltcy50ZXhpCi0JdG91Y2ggcy1zeW1zCi1zeW1zLnRleGk6IHMtc3ltcwotCi1zLXRhcmdldHM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vdGFyZ2V0cy5jID50YXJnZXRzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0YXJnZXRzLnRtcCB0YXJnZXRzLnRleGkKLQl0b3VjaCBzLXRhcmdldHMKLXRhcmdldHMudGV4aTogcy10YXJnZXRzCi0KLXMtaW5pdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2luaXQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9pbml0LmMgPmluaXQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGluaXQudG1wIGluaXQudGV4aQotCXRvdWNoIHMtaW5pdAotaW5pdC50ZXhpOiBzLWluaXQKLQotcy1oYXNoOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2hhc2guYyA+aGFzaC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaGFzaC50bXAgaGFzaC50ZXhpCi0JdG91Y2ggcy1oYXNoCi1oYXNoLnRleGk6IHMtaGFzaAotCi1zLWxpbmtlcjogJChNS0RPQykgJChzcmNkaXIpLy4uL2xpbmtlci5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2xpbmtlci5jID5saW5rZXIudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpbmtlci50bXAgbGlua2VyLnRleGkKLQl0b3VjaCBzLWxpbmtlcgotbGlua2VyLnRleGk6IHMtbGlua2VyCi0KLWxpYmJmZC5oOiAkKHNyY2RpcikvLi4vbGliYmZkLWluLmgJXAotCSQoc3JjZGlyKS8uLi9pbml0LmMJCVwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMJCVwKLQkkKHNyY2RpcikvLi4vY2FjaGUuYwkJXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2xpYmJmZC1pbi5oID5saWJiZmQuaCAKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2luaXQuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9saWJiZmQuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL3JlbG9jLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9lbGYuYyA+PmxpYmJmZC5oCi0KLWxpYmNvZmYuaDogJChzcmNkaXIpLy4uL2xpYmNvZmYtaW4uaAlcCi0JJChzcmNkaXIpLy4uL2NvZmZjb2RlLmgJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2xpYmNvZmYtaW4uaCA+bGliY29mZi5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oID4+bGliY29mZi5oCi0KLWJmZC5oOiAkKHNyY2RpcikvLi4vYmZkLWluLmggCQlcCi0JJChzcmNkaXIpLy4uL2luaXQuYyAJCVwKLQkkKHNyY2RpcikvLi4vb3BuY2xzLmMgCQlcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jIAkJXAotCSQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgCQlcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMJCVwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYwkJXAotCSQoc3JjZGlyKS8uLi9zeW1zLmMJCVwKLQkkKHNyY2RpcikvLi4vYmZkLmMJCVwKLQkkKHNyY2RpcikvLi4vYXJjaGl2ZS5jCQlcCi0JJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMJCVwKLQkkKHNyY2RpcikvLi4vdGFyZ2V0cy5jCQlcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCA+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2luaXQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9vcG5jbHMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9saWJiZmQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9yZWxvYy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3N5bXMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9iZmQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vY29yZWZpbGUuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vZm9ybWF0LmMgPj5iZmQuaAkKLQllY2hvICIjaWZkZWYgX19jcGx1c3BsdXMiID4+YmZkLmgKLQllY2hvICJ9IiA+PmJmZC5oCi0JZWNobyAiI2VuZGlmIiA+PmJmZC5oCi0JZWNobyAiI2VuZGlmIiA+PmJmZC5oCi0KLW5vaW5zdF9URVhJTkZPUyA9IGJmZGludC50ZXhpCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKE1LRE9DKSAqLm8KLQotQ0xFQU5GSUxFUyA9IHMtKiAqLnAgKi5pcAotCi1ESVNUQ0xFQU5GSUxFUyA9IGJmZC4/PyBiZmQuPz8/IGJmZC5oIGxpYmJmZC5oIGxpYmNvZmYuaCB0ZXhwdXQubG9nCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gJChET0NGSUxFUykKZGlmZiAtLWdpdCBhL2JmZC9kb2MvTWFrZWZpbGUuaW4gYi9iZmQvZG9jL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjk1YzEwLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFSID0gQEFSQAotQVMgPSBAQVNACi1CRkRfSE9TVF82NEJJVF9MT05HID0gQEJGRF9IT1NUXzY0QklUX0xPTkdACi1CRkRfSE9TVF82NF9CSVQgPSBAQkZEX0hPU1RfNjRfQklUQAotQkZEX0hPU1RfNjRfQklUX0RFRklORUQgPSBAQkZEX0hPU1RfNjRfQklUX0RFRklORURACi1CRkRfSE9TVF9VXzY0X0JJVCA9IEBCRkRfSE9TVF9VXzY0X0JJVEAKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKLUNPUkVGSUxFID0gQENPUkVGSUxFQAotQ09SRUZMQUcgPSBAQ09SRUZMQUdACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUhERUZJTkVTID0gQEhERUZJTkVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVERFRklORVMgPSBAVERFRklORVNACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRSA9IEBVU0VfU1lNQk9MX1VOREVSU0NPUkVACi1WRVJTSU9OID0gQFZFUlNJT05ACi1XSU4zMkxERkxBR1MgPSBAV0lOMzJMREZMQUdTQAotV0lOMzJMSUJBREQgPSBAV0lOMzJMSUJBRERACi1hbGxfYmFja2VuZHMgPSBAYWxsX2JhY2tlbmRzQAotYmZkX2JhY2tlbmRzID0gQGJmZF9iYWNrZW5kc0AKLWJmZF9tYWNoaW5lcyA9IEBiZmRfbWFjaGluZXNACi1sID0gQGxACi10ZGVmYXVsdHMgPSBAdGRlZmF1bHRzQAotd29yZHNpemUgPSBAd29yZHNpemVACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotRE9DRklMRVMgPSBhb3V0eC50ZXhpICBhcmNoaXZlLnRleGkgYXJjaHVyZXMudGV4aSBcCi0JYmZkdC50ZXhpICBjYWNoZS50ZXhpIGNvZmZjb2RlLnRleGkgXAotCWNvcmUudGV4aSBlbGYudGV4aSBlbGZjb2RlLnRleGkgIGZvcm1hdC50ZXhpICBsaWJiZmQudGV4aSAgXAotCW9wbmNscy50ZXhpICByZWxvYy50ZXhpICBzZWN0aW9uLnRleGkgIFwKLQlzeW1zLnRleGkgIHRhcmdldHMudGV4aSBpbml0LnRleGkgaGFzaC50ZXhpIGxpbmtlci50ZXhpCi0KLQotUFJPVE9TID0gYXJjaGl2ZS5wIGFyY2h1cmVzLnAgYmZkLnAgXAotCSBjb3JlLnAgZm9ybWF0LnAgXAotCWxpYmJmZC5wIG9wbmNscy5wIHJlbG9jLnAgXAotCXNlY3Rpb24ucCBzeW1zLnAgdGFyZ2V0cy5wICBcCi0JZm9ybWF0LnAgIGNvcmUucCBpbml0LnAKLQotCi1JUFJPVE9TID0gY2FjaGUuaXAgbGliYmZkLmlwIHJlbG9jLmlwIGluaXQuaXAgYXJjaHVyZXMuaXAgY29mZmNvZGUuaXAKLQotIyBTUkNET0MsIFNSQ1BST1QsIFNSQ0lQUk9UIG9ubHkgdXNlZCB0byBzaWRlc3RlcCBTdW4gTWFrZSBidWcgaW4gaW50ZXJhY3Rpb24gCi0jIGJldHdlZW4gVlBBVEggYW5kIHN1ZmZpeCBydWxlcy4gIElmIHlvdSB1c2UgR05VIE1ha2UsIHBlcmhhcHMgb3RoZXIgTWFrZXMsCi0jIHlvdSBkb24ndCBuZWVkIHRoZXNlIHRocmVlOgotU1JDRE9DID0gJChzcmNkaXIpLy4uL2FvdXR4LmggICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS8uLi9iZmQuYyBcCi0JJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggXAotCSQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jICQoc3JjZGlyKS8uLi9lbGYuYyBcCi0JJChzcmNkaXIpLy4uL2VsZmNvZGUuaCAgJChzcmNkaXIpLy4uL2Zvcm1hdC5jIFwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpLy4uL29wbmNscy5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAgJChzcmNkaXIpLy4uL3NlY3Rpb24uYyBcCi0JJChzcmNkaXIpLy4uL3N5bXMuYyAgJChzcmNkaXIpLy4uL3RhcmdldHMuYyBcCi0JJChzcmNkaXIpLy4uL2hhc2guYyAkKHNyY2RpcikvLi4vbGlua2VyLmMKLQotCi1TUkNQUk9UID0gJChzcmNkaXIpLy4uL2FyY2hpdmUuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCi0JJChzcmNkaXIpLy4uL2JmZC5jICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oICQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jIFwKLQkkKHNyY2RpcikvLi4vZm9ybWF0LmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKLQkkKHNyY2RpcikvLi4vb3BuY2xzLmMgJChzcmNkaXIpLy4uL3JlbG9jLmMgXAotCSQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgJChzcmNkaXIpLy4uL3N5bXMuYyBcCi0JJChzcmNkaXIpLy4uL3RhcmdldHMuYyAkKHNyY2RpcikvLi4vaW5pdC5jCi0KLQotU1JDSVBST1QgPSAkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvLi4vbGliYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jICQoc3JjZGlyKS8uLi9jcHUtaDgzMDAuYyBcCi0JJChzcmNkaXIpLy4uL2NwdS1pOTYwLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9pbml0LmMKLQotCi1URVhJRElSID0gJChzcmNkaXIpLy4uLy4uL3RleGluZm8vZnNmCi0KLWluZm9fVEVYSU5GT1MgPSBiZmQudGV4aW5mbwotCi1NS0RPQyA9IGNoZXckKEVYRUVYVF9GT1JfQlVJTEQpCi0KLW5vaW5zdF9URVhJTkZPUyA9IGJmZGludC50ZXhpCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKE1LRE9DKSAqLm8KLQotQ0xFQU5GSUxFUyA9IHMtKiAqLnAgKi5pcAotCi1ESVNUQ0xFQU5GSUxFUyA9IGJmZC4/PyBiZmQuPz8/IGJmZC5oIGxpYmJmZC5oIGxpYmNvZmYuaCB0ZXhwdXQubG9nCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gJChET0NGSUxFUykKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSAuLi9jb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gYmZkLmluZm8KLURWSVMgPSBiZmQuZHZpCi1URVhJTkZPUyA9IGJmZC50ZXhpbmZvCi1ESVNUX0NPTU1PTiA9ICBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSB0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuZHZpIC5pbmZvIC5wcyAudGV4aSAudGV4aW5mbyAudHhpCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIGRvYy9NYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotCi1iZmQuaW5mbzogYmZkLnRleGluZm8KLWJmZC5kdmk6IGJmZC50ZXhpbmZvCi0KLQotRFZJUFMgPSBkdmlwcwotCi0udGV4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50ZXhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50eGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotLmR2aS5wczoKLQkkKERWSVBTKSAkPCAtbyAkQAotCi1pbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKLQlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKLQkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKLQkgICAgZWxzZSA6IDsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JQCQoUE9TVF9JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCi0JICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKLQkgIGRvbmU7IFwKLQllbHNlIDogOyBmaQotCi11bmluc3RhbGwtaW5mbzoKLQkkKFBSRV9VTklOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWk9eWVzOyBcCi0JZWxzZSBpaT07IGZpOyBcCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAteiAiJGlpIiBcCi0JICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAotCWRvbmUKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAotCWRvbmUKLQotZGlzdC1pbmZvOiAkKElORk9fREVQUykKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1hbWluZm86Ci0JLXJtIC1mIGJmZC5hdXggYmZkLmNwIGJmZC5jcHMgYmZkLmR2aSBiZmQuZm4gYmZkLmZucyBiZmQua3kgYmZkLmt5cyBcCi0JICBiZmQucHMgYmZkLmxvZyBiZmQucGcgYmZkLnRvYyBiZmQudHAgYmZkLnRwcyBiZmQudnIgYmZkLnZycyBcCi0JICBiZmQub3AgYmZkLnRyIGJmZC5jdiBiZmQuY24KLQotY2xlYW4tYW1pbmZvOgotCi1kaXN0Y2xlYW4tYW1pbmZvOgotCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKLQlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKLQkgIHJtIC1mICQkaTsgXAotCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCi0JICAgIHJtIC1mICQkaS1bMC05XSo7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCi10YWdzOiBUQUdTCi1UQUdTOgotCi0KLWRpc3RkaXIgPSAkKHRvcF9idWlsZGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotCi1zdWJkaXIgPSBkb2MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1hbQotZHZpLWFtOiAkKERWSVMpCi1kdmk6IGR2aS1hbQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stYW0KLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLWluc3RhbGwtZXhlYy1hbToKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi0KLWluc3RhbGwtZGF0YS1hbToKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLWFtCi11bmluc3RhbGwtYW06Ci11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotYWxsLWFtOiBNYWtlZmlsZQotYWxsLXJlZGlyZWN0OiBhbGwtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOgotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuLWFtOiAgY2xlYW4tYW1pbmZvIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLWFtCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKLQkJZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQotLlBIT05ZOiBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gbW9zdGx5Y2xlYW4tYW1pbmZvIFwKLWRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tYW1pbmZvIHRhZ3MgZGlzdGRpciBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIFwKLWFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi0kKE1LRE9DKTogY2hldy5vCi0JJChDQ19GT1JfQlVJTEQpIC1vICQoTUtET0MpIGNoZXcubyAkKExPQURMSUJFUykgJChMREZMQUdTKQotCi1jaGV3Lm86IGNoZXcuYwotCSQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4uIC1JJChzcmNkaXIpLy4uIC1JJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vLi4vaW50bCAtSS4uLy4uL2ludGwgJChIX0NGTEFHUykgJChDRkxBR1MpICQoc3JjZGlyKS9jaGV3LmMKLQotcHJvdG9zOiBsaWJiZmQuaCBsaWJjb2ZmLmggYmZkLmgKLQotYmZkLmluZm8gYmZkLmR2aTogJChET0NGSUxFUykgYmZkc3VtbS50ZXhpIGJmZC50ZXhpbmZvCi0KLSMgV2UgY2FuJ3QgcmVwbGFjZSB0aGVzZSBydWxlcyB3aXRoIGFuIGltcGxpY2l0IHJ1bGUsIGJlY2F1c2UKLSMgbWFrZXMgd2l0aG91dCBWUEFUSCBzdXBwb3J0IGNvdWxkbid0IGZpbmQgdGhlIC5oIGZpbGVzIGluIGAuLicuCi0KLSMgV2UgdXNlIHMtWFhYIHRhcmdldHMgc28gdGhhdCB3ZSBjYW4gZGlzdHJpYnV0ZSB0aGUgaW5mbyBmaWxlcywKLSMgYW5kIHBlcm1pdCBwZW9wbGUgdG8gcmVidWlsZCB0aGVtLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgbWFrZWluZm8KLSMgcHJvZ3JhbS4gIElmIHNvbWVib2R5IHRyaWVzIHRvIHJlYnVpbGQgaW5mbywgYnV0IG5vbmUgb2YgdGhlIC50ZXhpCi0jIGZpbGVzIGhhdmUgY2hhbmdlZCwgdGhlbiB0aGlzIE1ha2VmaWxlIHdpbGwgYnVpbGQgY2hldywgYW5kIHdpbGwKLSMgYnVpbGQgYWxsIG9mIHRoZSBzdGFtcCBmaWxlcywgYnV0IHdpbGwgbm90IGFjdHVhbGx5IGhhdmUgdG8gcmVidWlsZAotIyBiZmQuaW5mby4KLQotcy1hb3V0eDogJChNS0RPQykgJChzcmNkaXIpLy4uL2FvdXR4LmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYW91dHguaCA+YW91dHgudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFvdXR4LnRtcCBhb3V0eC50ZXhpCi0JdG91Y2ggcy1hb3V0eAotYW91dHgudGV4aTogcy1hb3V0eAotCi1zLWFyY2hpdmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID5hcmNoaXZlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNoaXZlLnRtcCBhcmNoaXZlLnRleGkKLQl0b3VjaCBzLWFyY2hpdmUKLWFyY2hpdmUudGV4aTogcy1hcmNoaXZlCi0KLXMtYXJjaHVyZXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID5hcmNodXJlcy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaHVyZXMudG1wIGFyY2h1cmVzLnRleGkKLQl0b3VjaCBzLWFyY2h1cmVzCi1hcmNodXJlcy50ZXhpOiBzLWFyY2h1cmVzCi0KLSMgV2UgdXNlIGJmZHQudGV4aSwgcmF0aGVyIHRoYW4gYmZkLnRleGksIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGgKLSMgYmZkLnRleGluZm8gb24gYW4gOC4zIGZpbGVzeXN0ZW0uCi1zLWJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2JmZC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9iZmQuYyA+YmZkLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQudG1wIGJmZHQudGV4aQotCXRvdWNoIHMtYmZkCi1iZmR0LnRleGk6IHMtYmZkCi0KLXMtY2FjaGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID5jYWNoZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY2FjaGUudG1wIGNhY2hlLnRleGkKLQl0b3VjaCBzLWNhY2hlCi1jYWNoZS50ZXhpOiBzLWNhY2hlCi0KLXMtY29mZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPmNvZmZjb2RlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb2ZmY29kZS50bXAgY29mZmNvZGUudGV4aQotCXRvdWNoIHMtY29mZmNvZGUKLWNvZmZjb2RlLnRleGk6IHMtY29mZmNvZGUKLQotcy1jb3JlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID5jb3JlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb3JlLnRtcCBjb3JlLnRleGkKLQl0b3VjaCBzLWNvcmUKLWNvcmUudGV4aTogcy1jb3JlCi0KLXMtZWxmOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmLmMgPmVsZi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmLnRtcCBlbGYudGV4aQotCXRvdWNoIHMtZWxmCi1lbGYudGV4aTogcy1lbGYKLQotcy1lbGZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZmNvZGUuaCA+ZWxmY29kZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmY29kZS50bXAgZWxmY29kZS50ZXhpCi0JdG91Y2ggcy1lbGZjb2RlCi1lbGZjb2RlLnRleGk6IHMtZWxmY29kZQotCi1zLWZvcm1hdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID5mb3JtYXQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGZvcm1hdC50bXAgZm9ybWF0LnRleGkKLQl0b3VjaCBzLWZvcm1hdAotZm9ybWF0LnRleGk6IHMtZm9ybWF0Ci0KLXMtbGliYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID5saWJiZmQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLnRleGkKLQl0b3VjaCBzLWxpYmJmZAotbGliYmZkLnRleGk6IHMtbGliYmZkCi0KLXMtb3BuY2xzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vb3BuY2xzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyICA8JChzcmNkaXIpLy4uL29wbmNscy5jID5vcG5jbHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIG9wbmNscy50bXAgb3BuY2xzLnRleGkKLQl0b3VjaCBzLW9wbmNscwotb3BuY2xzLnRleGk6IHMtb3BuY2xzCi0KLXMtcmVsb2M6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9yZWxvYy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3JlbG9jLmMgPnJlbG9jLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSByZWxvYy50bXAgcmVsb2MudGV4aQotCXRvdWNoIHMtcmVsb2MKLXJlbG9jLnRleGk6IHMtcmVsb2MKLQotcy1zZWN0aW9uOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+c2VjdGlvbi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc2VjdGlvbi50bXAgc2VjdGlvbi50ZXhpCi0JdG91Y2ggcy1zZWN0aW9uCi1zZWN0aW9uLnRleGk6IHMtc2VjdGlvbgotCi1zLXN5bXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zeW1zLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc3ltcy5jID5zeW1zLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzeW1zLnRtcCBzeW1zLnRleGkKLQl0b3VjaCBzLXN5bXMKLXN5bXMudGV4aTogcy1zeW1zCi0KLXMtdGFyZ2V0czogJChNS0RPQykgJChzcmNkaXIpLy4uL3RhcmdldHMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPnRhcmdldHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRhcmdldHMudG1wIHRhcmdldHMudGV4aQotCXRvdWNoIHMtdGFyZ2V0cwotdGFyZ2V0cy50ZXhpOiBzLXRhcmdldHMKLQotcy1pbml0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaW5pdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2luaXQuYyA+aW5pdC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaW5pdC50bXAgaW5pdC50ZXhpCi0JdG91Y2ggcy1pbml0Ci1pbml0LnRleGk6IHMtaW5pdAotCi1zLWhhc2g6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaGFzaC5jID5oYXNoLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBoYXNoLnRtcCBoYXNoLnRleGkKLQl0b3VjaCBzLWhhc2gKLWhhc2gudGV4aTogcy1oYXNoCi0KLXMtbGlua2VyOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGlua2VyLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vbGlua2VyLmMgPmxpbmtlci50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGlua2VyLnRtcCBsaW5rZXIudGV4aQotCXRvdWNoIHMtbGlua2VyCi1saW5rZXIudGV4aTogcy1saW5rZXIKLQotbGliYmZkLmg6ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaAlcCi0JJChzcmNkaXIpLy4uL2luaXQuYwkJXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jCQlcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliYmZkLWluLmggPmxpYmJmZC5oIAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vaW5pdC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2VsZi5jID4+bGliYmZkLmgKLQotbGliY29mZi5oOiAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oCVwKLQkkKHNyY2RpcikvLi4vY29mZmNvZGUuaAkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oID5saWJjb2ZmLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPj5saWJjb2ZmLmgKLQotYmZkLmg6ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCAJCVwKLQkkKHNyY2RpcikvLi4vaW5pdC5jIAkJXAotCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAJCVwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgCQlcCi0JJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCi0JJChzcmNkaXIpLy4uL3N5bXMuYwkJXAotCSQoc3JjZGlyKS8uLi9iZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9hcmNoaXZlLmMJCVwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYwkJXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMJCVwKLQkkKHNyY2RpcikvLi4vZm9ybWF0LmMJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2JmZC1pbi5oID5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vaW5pdC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL29wbmNscy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2xpYmJmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3JlbG9jLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc3ltcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2JmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+PmJmZC5oCQotCWVjaG8gIiNpZmRlZiBfX2NwbHVzcGx1cyIgPj5iZmQuaAotCWVjaG8gIn0iID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmQudGV4aW5mbyBiL2JmZC9kb2MvYmZkLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZGY4N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi1caW5wdXQgdGV4aW5mby50ZXgKLUBzZXRmaWxlbmFtZSBiZmQuaW5mbwotQGMgJElkJAotQHRleAotJSBOT1RFIExPQ0FMIEtMVUdFIFRPIEFWT0lEIFRPTyBNVUNIIFdISVRFU1BBQ0UKLVxnbG9iYWxcbG9uZ1xkZWZcZXhhbXBsZXslCi1cYmVnaW5ncm91cAotXGxldFxhYm92ZWVudmJyZWFrPVxwYXIKLVxsZXRcYWZ0ZXJlbnZicmVhaz1ccGFyCi1ccGFyc2tpcD0wcHQKLVxsaXNwfQotXGdsb2JhbFxsb25nXGRlZlxFZXhhbXBsZXslCi1cRWxpc3AKLVxlbmRncm91cAotXHZza2lwIC1ccGFyc2tpcCUgdG8gY2FuY2VsIG91dCBlZmZlY3Qgb2YgZm9sbG93aW5nIFxwYXIKLX0KLUBlbmQgdGV4Ci1Ac3luaW5kZXggZm4gY3AKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQmZkOiAoYmZkKS4gICAgICAgICAgICAgICAgICAgVGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEJGRCBsaWJyYXJ5LgotCi1Db3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgc3ViamVjdCB0byB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaW5jbHVkZXMgdGhlIHByb3Zpc2lvbiB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBjQGZpbmFsb3V0Ci1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb24KLUBjQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIExJQiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIExpYnJhcnkKLUB0aXRsZXBhZ2UKLUB0aXRsZXtsaWJiZmR9Ci1Ac3VidGl0bGV7VGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgTGlicmFyeX0KLUBzcCAxCi1Ac3VidGl0bGUgRmlyc3QgRWRpdGlvbi0tLUJGRCB2ZXJzaW9uIDwgMy4wCi1Ac3VidGl0bGUgQXByaWwgMTk5MQotQGF1dGhvciB7U3RldmUgQ2hhbWJlcmxhaW59Ci1AYXV0aG9yIHtDeWdudXMgU3VwcG9ydH0KLUBwYWdlCi0KLUB0ZXgKLVxkZWZcJCMxJHt7IzF9fSAgJSBLbHVnZTogY29sbGVjdCBSQ1MgcmV2aXNpb24gaW5mbyB3aXRob3V0ICQuLi4kCi1ceGRlZlxtYW52ZXJze1wkUmV2aXNpb24kfSAgJSBGb3IgdXNlIGluIGhlYWRlcnMsIGZvb3RlcnMgdG9vCi17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi1caGZpbGwgc2FjXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgQkZEfSwgXG1hbnZlcnNccGFyCi1caGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCi19Ci1cZ2xvYmFsXHBhcmluZGVudD0wcHQgJSBTdGV2ZSBsaWtlcyBpdCB0aGlzIHdheQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgc3ViamVjdCB0byB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaW5jbHVkZXMgdGhlIHByb3Zpc2lvbiB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi1AZW5kIGlmdGV4Ci0KLUBub2RlIFRvcCwgT3ZlcnZpZXcsIChkaXIpLCAoZGlyKQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgYmluYXJ5IGZpbGUgZGVzY3JpcHRvciBsaWJyYXJ5IGxpYmJmZC4KLUBlbmQgaWZpbmZvCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjoJCQlPdmVydmlldyBvZiBCRkQKLSogQkZEIGZyb250IGVuZDo6CQlCRkQgZnJvbnQgZW5kCi0qIEJGRCBiYWNrIGVuZHM6OgkJQkZEIGJhY2sgZW5kcwotKiBJbmRleDo6CQkJSW5kZXgKLUBlbmQgbWVudQotCi1Abm9kZSBPdmVydmlldywgQkZEIGZyb250IGVuZCwgVG9wLCBUb3AKLUBjaGFwdGVyIEludHJvZHVjdGlvbgotQGNpbmRleCBCRkQKLUBjaW5kZXggd2hhdCBpcyBpdD8KLUJGRCBpcyBhIHBhY2thZ2Ugd2hpY2ggYWxsb3dzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCi1zYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24gb2JqZWN0IGZpbGVzIHdoYXRldmVyIHRoZSBvYmplY3QgZmlsZQotZm9ybWF0LiAgQSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IGNhbiBiZSBzdXBwb3J0ZWQgc2ltcGx5IGJ5Ci1jcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZyBpdCB0byB0aGUgbGlicmFyeS4KLQotQkZEIGlzIHNwbGl0IGludG8gdHdvIHBhcnRzOiB0aGUgZnJvbnQgZW5kLCBhbmQgdGhlIGJhY2sgZW5kcyAob25lIGZvcgotZWFjaCBvYmplY3QgZmlsZSBmb3JtYXQpLgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gVGhlIGZyb250IGVuZCBvZiBCRkQgcHJvdmlkZXMgdGhlIGludGVyZmFjZSB0byB0aGUgdXNlci4gSXQgbWFuYWdlcwotbWVtb3J5IGFuZCB2YXJpb3VzIGNhbm9uaWNhbCBkYXRhIHN0cnVjdHVyZXMuIFRoZSBmcm9udCBlbmQgYWxzbwotZGVjaWRlcyB3aGljaCBiYWNrIGVuZCB0byB1c2UgYW5kIHdoZW4gdG8gY2FsbCBiYWNrIGVuZCByb3V0aW5lcy4KLUBpdGVtIFRoZSBiYWNrIGVuZHMgcHJvdmlkZSBCRkQgaXRzIHZpZXcgb2YgdGhlIHJlYWwgd29ybGQuIEVhY2ggYmFjawotZW5kIHByb3ZpZGVzIGEgc2V0IG9mIGNhbGxzIHdoaWNoIHRoZSBCRkQgZnJvbnQgZW5kIGNhbiB1c2UgdG8gbWFpbnRhaW4KLWl0cyBjYW5vbmljYWwgZm9ybS4gVGhlIGJhY2sgZW5kcyBhbHNvIG1heSBrZWVwIGFyb3VuZCBpbmZvcm1hdGlvbiBmb3IKLXRoZWlyIG93biB1c2UsIGZvciBncmVhdGVyIGVmZmljaWVuY3kuCi1AZW5kIGl0ZW1pemUKLUBtZW51Ci0qIEhpc3Rvcnk6OgkJCUhpc3RvcnkKLSogSG93IEl0IFdvcmtzOjoJCUhvdyBJdCBXb3JrcwotKiBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvOjoJV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbwotQGVuZCBtZW51Ci0KLUBub2RlIEhpc3RvcnksIEhvdyBJdCBXb3JrcywgT3ZlcnZpZXcsIE92ZXJ2aWV3Ci1Ac2VjdGlvbiBIaXN0b3J5Ci0KLU9uZSBzcHVyIGJlaGluZCBCRkQgd2FzIHRoZSBkZXNpcmUsIG9uIHRoZSBwYXJ0IG9mIHRoZSBHTlUgOTYwIHRlYW0gYXQKLUludGVsIE9yZWdvbiwgZm9yIGludGVyb3BlcmFiaWxpdHkgb2YgYXBwbGljYXRpb25zIG9uIHRoZWlyIENPRkYgYW5kCi1iLm91dCBmaWxlIGZvcm1hdHMuICBDeWdudXMgd2FzIHByb3ZpZGluZyBHTlUgc3VwcG9ydCBmb3IgdGhlIHRlYW0sIGFuZAotd2FzIGNvbnRyYWN0ZWQgdG8gcHJvdmlkZSB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4KLQotVGhlIG5hbWUgY2FtZSBmcm9tIGEgY29udmVyc2F0aW9uIERhdmlkIFdhbGxhY2Ugd2FzIGhhdmluZyB3aXRoIFJpY2hhcmQKLVN0YWxsbWFuIGFib3V0IHRoZSBsaWJyYXJ5OiBSTVMgc2FpZCB0aGF0IGl0IHdvdWxkIGJlIHF1aXRlIGhhcmQtLS1EYXZpZAotc2FpZCBgYEJGRCcnLiAgU3RhbGxtYW4gd2FzIHJpZ2h0LCBidXQgdGhlIG5hbWUgc3R1Y2suCi0KLUF0IHRoZSBzYW1lIHRpbWUsIFJlYWR5IFN5c3RlbXMgd2FudGVkIG11Y2ggdGhlIHNhbWUgdGhpbmcsIGJ1dCBmb3IKLWRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzOiBJRUVFLTY5NSwgT2FzeXMsIFNyZWNvcmRzLCBhLm91dCBhbmQgNjhrCi1jb2ZmLgotCi1CRkQgd2FzIGZpcnN0IGltcGxlbWVudGVkIGJ5IG1lbWJlcnMgb2YgQ3lnbnVzIFN1cHBvcnQ7IFN0ZXZlCi1DaGFtYmVybGFpbiAoQGNvZGV7c2FjQEBjeWdudXMuY29tfSksIEpvaG4gR2lsbW9yZQotKEBjb2Rle2dudUBAY3lnbnVzLmNvbX0pLCBLLiAgUmljaGFyZCBQaXhsZXkgKEBjb2Rle3JpY2hAQGN5Z251cy5jb219KQotYW5kIERhdmlkIEhlbmtlbC1XYWxsYWNlIChAY29kZXtndW1ieUBAY3lnbnVzLmNvbX0pLgotCi0KLQotQG5vZGUgSG93IEl0IFdvcmtzLCBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvLCBIaXN0b3J5LCBPdmVydmlldwotQHNlY3Rpb24gSG93IFRvIFVzZSBCRkQKLQotVG8gdXNlIHRoZSBsaWJyYXJ5LCBpbmNsdWRlIEBmaWxle2JmZC5ofSBhbmQgbGluayB3aXRoIEBmaWxle2xpYmJmZC5hfS4JCi0KLUJGRCBwcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgdG8gdGhlIHBhcnRzIG9mIGFuIG9iamVjdCBmaWxlCi1mb3IgYSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAKLQotV2hlbiBhbiBhcHBsaWNhdGlvbiBzdWNlc3NmdWxseSBvcGVucyBhIHRhcmdldCBmaWxlIChvYmplY3QsIGFyY2hpdmUsIG9yCi13aGF0ZXZlciksIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuIFRoaXMgcG9pbnRlcgotcG9pbnRzIHRvIGEgc3RydWN0dXJlIGNhbGxlZCBAY29kZXtiZmR9LCBkZXNjcmliZWQgaW4KLUBmaWxle2JmZC5ofS4gIE91ciBjb252ZW50aW9uIGlzIHRvIGNhbGwgdGhpcyBwb2ludGVyIGEgQkZELCBhbmQKLWluc3RhbmNlcyBvZiBpdCB3aXRoaW4gY29kZSBAY29kZXthYmZkfS4gIEFsbCBvcGVyYXRpb25zIG9uCi10aGUgdGFyZ2V0IG9iamVjdCBmaWxlIGFyZSBhcHBsaWVkIGFzIG1ldGhvZHMgdG8gdGhlIEJGRC4gIFRoZSBtYXBwaW5nIGlzCi1kZWZpbmVkIHdpdGhpbiBAY29kZXtiZmQuaH0gaW4gYSBzZXQgb2YgbWFjcm9zLCBhbGwgYmVnaW5uaW5nCi13aXRoIEBzYW1we2JmZF99IHRvIHJlZHVjZSBuYW1lc3BhY2UgcG9sbHV0aW9uLgotCi1Gb3IgZXhhbXBsZSwgdGhpcyBzZXF1ZW5jZSBkb2VzIHdoYXQgeW91IHdvdWxkIHByb2JhYmx5IGV4cGVjdDoKLXJldHVybiB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIGluIGFuIG9iamVjdCBmaWxlIGF0dGFjaGVkIHRvIGEgQkZECi1AY29kZXthYmZkfS4gCi0KLUBsaXNwCi1AYyBAY2FydG91Y2hlCi0jaW5jbHVkZSAiYmZkLmgiCi0KLXVuc2lnbmVkIGludCBudW1iZXJfb2Zfc2VjdGlvbnMoYWJmZCkKLWJmZCAqYWJmZDsKLUB7Ci0gIHJldHVybiBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCk7Ci1AfQotQGMgQGVuZCBjYXJ0b3VjaGUKLUBlbmQgbGlzcAotCi1UaGUgYWJzdHJhY3Rpb24gdXNlZCB3aXRoaW4gQkZEIGlzIHRoYXQgYW4gb2JqZWN0IGZpbGUgaGFzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotYSBoZWFkZXIsCi1AaXRlbQotYSBudW1iZXIgb2Ygc2VjdGlvbnMgY29udGFpbmluZyByYXcgZGF0YSAoQHB4cmVme1NlY3Rpb25zfSksCi1AaXRlbQotYSBzZXQgb2YgcmVsb2NhdGlvbnMgKEBweHJlZntSZWxvY2F0aW9uc30pLCBhbmQKLUBpdGVtCi1zb21lIHN5bWJvbCBpbmZvcm1hdGlvbiAoQHB4cmVme1N5bWJvbHN9KS4KLUBlbmQgaXRlbWl6ZQotQG5vaW5kZW50Ci1BbHNvLCBCRkRzIG9wZW5lZCBmb3IgYXJjaGl2ZXMgaGF2ZSB0aGUgYWRkaXRpb25hbCBhdHRyaWJ1dGUgb2YgYW4gaW5kZXgKLWFuZCBjb250YWluIHN1Ym9yZGluYXRlIEJGRHMuIFRoaXMgYXBwcm9hY2ggaXMgZmluZSBmb3IgYS5vdXQgYW5kIGNvZmYsCi1idXQgbG9zZXMgZWZmaWNpZW5jeSB3aGVuIGFwcGxpZWQgdG8gZm9ybWF0cyBzdWNoIGFzIFMtcmVjb3JkcyBhbmQKLUlFRUUtNjk1LgotCi1Abm9kZSBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvLCAgLCBIb3cgSXQgV29ya3MsIE92ZXJ2aWV3Ci1Ac2VjdGlvbiBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvCi1AaW5jbHVkZSBiZmRzdW1tLnRleGkKLQotQG5vZGUgQkZEIGZyb250IGVuZCwgQkZEIGJhY2sgZW5kcywgT3ZlcnZpZXcsIFRvcAotQGNoYXB0ZXIgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgYmZkdC50ZXhpCi0KLUBtZW51Ci0qIE1lbW9yeSBVc2FnZTo6Ci0qIEluaXRpYWxpemF0aW9uOjoKLSogU2VjdGlvbnM6OgotKiBTeW1ib2xzOjoKLSogQXJjaGl2ZXM6OgotKiBGb3JtYXRzOjoKLSogUmVsb2NhdGlvbnM6OgotKiBDb3JlIEZpbGVzOjoKLSogVGFyZ2V0czo6Ci0qIEFyY2hpdGVjdHVyZXM6OgotKiBPcGVuaW5nIGFuZCBDbG9zaW5nOjoKLSogSW50ZXJuYWw6OgotKiBGaWxlIENhY2hpbmc6OgotKiBMaW5rZXIgRnVuY3Rpb25zOjoKLSogSGFzaCBUYWJsZXM6OgotQGVuZCBtZW51Ci0KLUBub2RlIE1lbW9yeSBVc2FnZSwgSW5pdGlhbGl6YXRpb24sIEJGRCBmcm9udCBlbmQsIEJGRCBmcm9udCBlbmQKLUBzZWN0aW9uIE1lbW9yeSB1c2FnZQotQkZEIGtlZXBzIGFsbCBvZiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlcyBpbiBvYnN0YWNrcy4gVGhlcmUgaXMgb25lIG9ic3RhY2sKLXBlciBvcGVuIEJGRCBmaWxlLCBpbnRvIHdoaWNoIHRoZSBjdXJyZW50IHN0YXRlIGlzIHN0b3JlZC4gV2hlbiBhIEJGRCBpcwotY2xvc2VkLCB0aGUgb2JzdGFjayBpcyBkZWxldGVkLCBhbmQgc28gZXZlcnl0aGluZyB3aGljaCBoYXMgYmVlbgotYWxsb2NhdGVkIGJ5IEJGRCBmb3IgdGhlIGNsb3NpbmcgZmlsZSBpcyB0aHJvd24gYXdheS4KLQotQkZEIGRvZXMgbm90IGZyZWUgYW55dGhpbmcgY3JlYXRlZCBieSBhbiBhcHBsaWNhdGlvbiwgYnV0IHBvaW50ZXJzIGludG8KLUBjb2Rle2JmZH0gc3RydWN0dXJlcyBiZWNvbWUgaW52YWxpZCBvbiBhIEBjb2Rle2JmZF9jbG9zZX07IGZvciBleGFtcGxlLAotYWZ0ZXIgYSBAY29kZXtiZmRfY2xvc2V9IHRoZSB2ZWN0b3IgcGFzc2VkIHRvCi1AY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0gaXMgc3RpbGwgYXJvdW5kLCBzaW5jZSBpdCBoYXMgYmVlbgotYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYnV0IHRoZSBkYXRhIHRoYXQgaXQgcG9pbnRlZCB0byBhcmUKLWxvc3QuCi0KLVRoZSBnZW5lcmFsIHJ1bGUgaXMgdG8gbm90IGNsb3NlIGEgQkZEIHVudGlsIGFsbCBvcGVyYXRpb25zIGRlcGVuZGVudAotdXBvbiBkYXRhIGZyb20gdGhlIEJGRCBoYXZlIGJlZW4gY29tcGxldGVkLCBvciBhbGwgdGhlIGRhdGEgZnJvbSB3aXRoaW4KLXRoZSBmaWxlIGhhcyBiZWVuIGNvcGllZC4gVG8gaGVscCB3aXRoIHRoZSBtYW5hZ2VtZW50IG9mIG1lbW9yeSwgdGhlcmUKLWlzIGEgZnVuY3Rpb24gKEBjb2Rle2JmZF9hbGxvY19zaXplfSkgd2hpY2ggcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1pbiBvYnN0YWNrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cHBsaWVkIEJGRC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvCi1zZWxlY3QgdGhlIGdyZWVkaWVzdCBvcGVuIEJGRCwgY2xvc2UgaXQgdG8gcmVjbGFpbSB0aGUgbWVtb3J5LCBwZXJmb3JtCi1zb21lIG9wZXJhdGlvbiBhbmQgcmVvcGVuIHRoZSBCRkQgYWdhaW4sIHRvIGdldCBhIGZyZXNoIGNvcHkgb2YgdGhlIGRhdGEKLXN0cnVjdHVyZXMuCi0KLUBub2RlIEluaXRpYWxpemF0aW9uLCBTZWN0aW9ucywgTWVtb3J5IFVzYWdlLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgaW5pdC50ZXhpCi0KLUBub2RlIFNlY3Rpb25zLCBTeW1ib2xzLCBJbml0aWFsaXphdGlvbiwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIHNlY3Rpb24udGV4aQotCi1Abm9kZSBTeW1ib2xzLCBBcmNoaXZlcywgU2VjdGlvbnMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBzeW1zLnRleGkKLQotQG5vZGUgQXJjaGl2ZXMsIEZvcm1hdHMsIFN5bWJvbHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBhcmNoaXZlLnRleGkKLQotQG5vZGUgRm9ybWF0cywgUmVsb2NhdGlvbnMsIEFyY2hpdmVzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgZm9ybWF0LnRleGkKLQotQG5vZGUgUmVsb2NhdGlvbnMsIENvcmUgRmlsZXMsIEZvcm1hdHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICByZWxvYy50ZXhpCi0KLUBub2RlIENvcmUgRmlsZXMsIFRhcmdldHMsIFJlbG9jYXRpb25zLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgY29yZS50ZXhpCi0KLUBub2RlIFRhcmdldHMsIEFyY2hpdGVjdHVyZXMsIENvcmUgRmlsZXMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICB0YXJnZXRzLnRleGkKLQotQG5vZGUgQXJjaGl0ZWN0dXJlcywgT3BlbmluZyBhbmQgQ2xvc2luZywgVGFyZ2V0cywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGFyY2h1cmVzLnRleGkKLQotQG5vZGUgT3BlbmluZyBhbmQgQ2xvc2luZywgSW50ZXJuYWwsIEFyY2hpdGVjdHVyZXMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBvcG5jbHMudGV4aQotCi1Abm9kZSBJbnRlcm5hbCwgRmlsZSBDYWNoaW5nLCBPcGVuaW5nIGFuZCBDbG9zaW5nLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgbGliYmZkLnRleGkKLQotQG5vZGUgRmlsZSBDYWNoaW5nLCBMaW5rZXIgRnVuY3Rpb25zLCBJbnRlcm5hbCwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGNhY2hlLnRleGkKLQotQG5vZGUgTGlua2VyIEZ1bmN0aW9ucywgSGFzaCBUYWJsZXMsIEZpbGUgQ2FjaGluZywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGxpbmtlci50ZXhpCi0KLUBub2RlIEhhc2ggVGFibGVzLCAsIExpbmtlciBGdW5jdGlvbnMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBoYXNoLnRleGkKLQotQG5vZGUgQkZEIGJhY2sgZW5kcywgSW5kZXgsIEJGRCBmcm9udCBlbmQsIFRvcAotQGNoYXB0ZXIgQkZEIGJhY2sgZW5kcwotQG1lbnUKLSogV2hhdCB0byBQdXQgV2hlcmU6OgotKiBhb3V0IDo6CWEub3V0IGJhY2tlbmRzCi0qIGNvZmYgOjoJY29mZiBiYWNrZW5kcwotKiBlbGYgIDo6CWVsZiBiYWNrZW5kcwotQGlnbm9yZQotKiBvYXN5cyA6OglvYXN5cyBiYWNrZW5kcwotKiBpZWVlIDo6CWllZWUgYmFja2VuZAotKiBzcmVjb3JkIDo6CXMtcmVjb3JkIGJhY2tlbmQKLUBlbmQgaWdub3JlCi1AZW5kIG1lbnUKLUBub2RlIFdoYXQgdG8gUHV0IFdoZXJlLCBhb3V0LCBCRkQgYmFjayBlbmRzLCBCRkQgYmFjayBlbmRzCi1BbGwgb2YgQkZEIGxpdmVzIGluIG9uZSBkaXJlY3RvcnkuCi0KLUBub2RlIGFvdXQsIGNvZmYsIFdoYXQgdG8gUHV0IFdoZXJlLCBCRkQgYmFjayBlbmRzCi1AaW5jbHVkZSAgYW91dHgudGV4aQotCi1Abm9kZSBjb2ZmLCBlbGYsIGFvdXQsIEJGRCBiYWNrIGVuZHMKLUBpbmNsdWRlICBjb2ZmY29kZS50ZXhpCi0KLUBub2RlIGVsZiwgICwgY29mZiwgQkZEIGJhY2sgZW5kcwotQGluY2x1ZGUgIGVsZi50ZXhpCi1AYyBMZWF2ZSB0aGlzIG91dCB1bnRpbCB0aGUgZmlsZSBoYXMgc29tZSBhY3R1YWwgY29udGVudHMuLi4KLUBjIEBpbmNsdWRlICBlbGZjb2RlLnRleGkKLQotQG5vZGUgSW5kZXgsICAsIEJGRCBiYWNrIGVuZHMgLCBUb3AKLUB1bm51bWJlcmVkIEluZGV4Ci1AcHJpbnRpbmRleCBjcAotCi1AdGV4Ci0lIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCi0lIG1lYW50aW1lOgotXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKLVxjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KLVxjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9Ci1cY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQotXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KLVxjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQotXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KLVxjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQotXHBhZ2VcY29sb3Bob24KLSUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgotQGVuZCB0ZXgKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9iZmQvZG9jL2JmZGludC50ZXhpIGIvYmZkL2RvYy9iZmRpbnQudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwOWIzNC4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2JmZGludC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTg4NSArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGJmZGludC5pbmZvCi0KLUBzZXR0aXRsZSBCRkQgSW50ZXJuYWxzCi1AaWZ0ZXgKLUB0aXRsZXBhZ2UKLUB0aXRsZXtCRkQgSW50ZXJuYWxzfQotQGF1dGhvcntJYW4gTGFuY2UgVGF5bG9yfQotQGF1dGhvcntDeWdudXMgU29sdXRpb25zfQotQHBhZ2UKLUBlbmQgaWZ0ZXgKLQotQG5vZGUgVG9wCi1AdG9wIEJGRCBJbnRlcm5hbHMKLUByYWlzZXNlY3Rpb25zCi1AY2luZGV4IGJmZCBpbnRlcm5hbHMKLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgc29tZSBCRkQgaW50ZXJuYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlCi1oZWxwZnVsIHdoZW4gd29ya2luZyBvbiBCRkQuICBJdCBpcyB2ZXJ5IGluY29tcGxldGUuCi0KLVRoaXMgZG9jdW1lbnQgaXMgbm90IHVwZGF0ZWQgcmVndWxhcmx5LCBhbmQgbWF5IGJlIG91dCBvZiBkYXRlLiAgSXQgd2FzCi1sYXN0IG1vZGlmaWVkIG9uICREYXRlJC4KLQotVGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IHdhcyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IKLUBlbWFpbHtpYW5AQGN5Z251cy5jb219LgotCi1AbWVudQotKiBCRkQgb3ZlcnZpZXc6OgkJQkZEIG92ZXJ2aWV3Ci0qIEJGRCBndWlkZWxpbmVzOjoJCUJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi0qIEJGRCB0YXJnZXQgdmVjdG9yOjoJCUJGRCB0YXJnZXQgdmVjdG9yCi0qIEJGRCBnZW5lcmF0ZWQgZmlsZXM6OgkJQkZEIGdlbmVyYXRlZCBmaWxlcwotKiBCRkQgbXVsdGlwbGUgY29tcGlsYXRpb25zOjoJRmlsZXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgaW4gQkZECi0qIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nOjoJQkZEIHJlbG9jYXRpb24gaGFuZGxpbmcKLSogQkZEIEVMRiBzdXBwb3J0OjoJCUJGRCBFTEYgc3VwcG9ydAotKiBCRkQgZ2xvc3Nhcnk6OgkJR2xvc3NhcnkKLSogSW5kZXg6OgkJCUluZGV4Ci1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIG92ZXJ2aWV3Ci1Ac2VjdGlvbiBCRkQgb3ZlcnZpZXcKLQotQkZEIGlzIGEgbGlicmFyeSB3aGljaCBwcm92aWRlcyBhIHNpbmdsZSBpbnRlcmZhY2UgdG8gcmVhZCBhbmQgd3JpdGUKLW9iamVjdCBmaWxlcywgZXhlY3V0YWJsZXMsIGFyY2hpdmUgZmlsZXMsIGFuZCBjb3JlIGZpbGVzIGluIGFueSBmb3JtYXQuCi0KLUBtZW51Ci0qIEJGRCBsaWJyYXJ5IGludGVyZmFjZXM6OglCRkQgbGlicmFyeSBpbnRlcmZhY2VzCi0qIEJGRCBsaWJyYXJ5IHVzZXJzOjoJCUJGRCBsaWJyYXJ5IHVzZXJzCi0qIEJGRCB2aWV3OjoJCQlUaGUgQkZEIHZpZXcgb2YgYSBmaWxlCi0qIEJGRCBibGluZG5lc3M6OgkJQkZEIGxvc2VzIGluZm9ybWF0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotCi1PbmUgd2F5IHRvIGxvb2sgYXQgdGhlIEJGRCBsaWJyYXJ5IGlzIHRvIGRpdmlkZSBpdCBpbnRvIGZvdXIgcGFydHMgYnkKLXR5cGUgb2YgaW50ZXJmYWNlLgotCi1UaGUgZmlyc3QgaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgZ2VuZXJpYyBmdW5jdGlvbnMgd2hpY2ggcHJvZ3JhbXMgdXNpbmcKLXRoZSBCRkQgbGlicmFyeSB3aWxsIGNhbGwuICBUaGVzZSBnZW5lcmljIGZ1bmN0aW9uIG5vcm1hbGx5IHRyYW5zbGF0ZQotZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnRvIGNhbGxzIHRvIHJvdXRpbmVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBhCi1wYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIE1hbnkgb2YgdGhlc2UgZ2VuZXJpYyBmdW5jdGlvbnMgYXJlCi1hY3R1YWxseSBkZWZpbmVkIGFzIG1hY3JvcyBpbiBAZmlsZXtiZmQuaH0uICBUaGVzZSBmdW5jdGlvbnMgY29tcHJpc2UKLXRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLgotCi1UaGUgc2Vjb25kIGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIHRhcmdldAotdmVjdG9ycy4gIFRoaXMgaXMgdGhlIGJ1bGsgb2YgdGhlIGNvZGUgaW4gQkZELiAgQSB0YXJnZXQgdmVjdG9yIGlzIGEgc2V0Ci1vZiBmdW5jdGlvbiBwb2ludGVycyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlCi10YXJnZXQgdmVjdG9yIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBnZW5lcmljIEJGRCBmdW5jdGlvbnMuICBUaGVzZQotZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkIHRocm91Z2ggdGhlIHRhcmdldCB2ZWN0b3IsIGFuZCBhcmUgbmV2ZXIKLWNhbGxlZCBkaXJlY3RseS4gIFRoZSB0YXJnZXQgdmVjdG9yIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gQHJlZntCRkQKLXRhcmdldCB2ZWN0b3J9LiAgVGhlIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIGEgcGFydGljdWxhcgotdGFyZ2V0IHZlY3RvciBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhIEJGRCBiYWNrZW5kLgotCi1UaGUgdGhpcmQgaW50ZXJmYWNlIGlzIGEgc2V0IG9mIG9kZGJhbGwgZnVuY3Rpb25zIHdoaWNoIGFyZSB0eXBpY2FsbHkKLXNwZWNpZmljIHRvIGEgcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQsIGFyZSBub3QgZ2VuZXJpYyBmdW5jdGlvbnMsCi1hbmQgYXJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LiAgVGhlc2UgYXJlIHVzZWQgYXMgaG9va3MKLWJ5IHRoZSBsaW5rZXIgYW5kIHRoZSBhc3NlbWJsZXIgd2hlbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0Ci1yZXF1aXJlcyBzb21lIGFjdGlvbiB3aGljaCB0aGUgQkZEIGdlbmVyaWMgaW50ZXJmYWNlIGRvZXMgbm90IHByb3ZpZGUuCi1UaGVzZSBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBkZWNsYXJlZCBpbiBAZmlsZXtiZmQuaH0sIGJ1dCBpbiBtYW55Ci1jYXNlcyB0aGV5IGFyZSBvbmx5IHByb3ZpZGVkIHdoZW4gQkZEIGlzIGNvbmZpZ3VyZWQgd2l0aCBzdXBwb3J0IGZvciBhCi1wYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZXNlIGZ1bmN0aW9ucyBsaXZlIGluIGEgZ3JleSBhcmVhLCBhbmQKLWFyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UuCi0KLVRoZSBmb3VydGggaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgQkZEIHN1cHBvcnQgZnVuY3Rpb25zIHdoaWNoIGFyZQotY2FsbGVkIGJ5IHRoZSBvdGhlciBCRkQgZnVuY3Rpb25zLiAgVGhlc2UgbWFuYWdlIGlzc3VlcyBsaWtlIG1lbW9yeQotYWxsb2NhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGZpbGUgYWNjZXNzLCBoYXNoIHRhYmxlcywgc3dhcHBpbmcsIGFuZCB0aGUKLWxpa2UuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5ldmVyIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1Abm9kZSBCRkQgbGlicmFyeSB1c2VycwotQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgdXNlcnMKLQotQW5vdGhlciB3YXkgdG8gbG9vayBhdCB0aGUgQkZEIGxpYnJhcnkgaXMgdG8gZGl2aWRlIGl0IGludG8gdGhyZWUgcGFydHMKLWJ5IHRoZSBtYW5uZXIgaW4gd2hpY2ggaXQgaXMgdXNlZC4KLQotVGhlIGZpcnN0IHVzZSBpcyB0byByZWFkIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHJlYWRlcnMgYXJlCi1wcm9ncmFtcyBsaWtlIEBzYW1we2dkYn0sIEBzYW1we25tfSwgQHNhbXB7b2JqZHVtcH0sIGFuZCBAc2FtcHtvYmpjb3B5fS4KLVRoZXNlIHByb2dyYW1zIHVzZSBCRkQgdG8gdmlldyBhbiBvYmplY3QgZmlsZSBpbiBhIGdlbmVyaWMgZm9ybS4gIFRoZQotb2ZmaWNpYWwgQkZEIGludGVyZmFjZSBpcyBub3JtYWxseSBmdWxseSBhZGVxdWF0ZSBmb3IgdGhlc2UgcHJvZ3JhbXMuCi0KLVRoZSBzZWNvbmQgdXNlIGlzIHRvIHdyaXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHdyaXRlcnMgYXJlCi1wcm9ncmFtcyBsaWtlIEBzYW1we2dhc30gYW5kIEBzYW1we29iamNvcHl9LiAgVGhlc2UgcHJvZ3JhbXMgdXNlIEJGRCB0bwotY3JlYXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UgaXMgbm9ybWFsbHkgYWRlcXVhdGUKLWZvciB0aGVzZSBwcm9ncmFtcywgYnV0IGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgdGhlIGFzc2VtYmxlciBuZWVkcwotc29tZSBhZGRpdGlvbmFsIGhvb2tzIGluIG9yZGVyIHRvIHNldCBwYXJ0aWN1bGFyIGZsYWdzIG9yIG90aGVyCi1pbmZvcm1hdGlvbi4gIFRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlIGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBjb3B5Ci1wcml2YXRlIGluZm9ybWF0aW9uIGZyb20gb25lIG9iamVjdCBmaWxlIHRvIGFub3RoZXIsIGFuZCB0aGVzZSBmdW5jdGlvbnMKLWFyZSB1c2VkIGJ5IEBzYW1we29iamNvcHl9IHRvIGF2b2lkIGluZm9ybWF0aW9uIGxvc3MuCi0KLVRoZSB0aGlyZCB1c2UgaXMgdG8gbGluayBvYmplY3QgZmlsZXMuICBUaGVyZSBpcyBvbmx5IG9uZSBvYmplY3QgZmlsZQotbGlua2VyLCBAc2FtcHtsZH0uICBPcmlnaW5hbGx5LCBAc2FtcHtsZH0gd2FzIGFuIG9iamVjdCBmaWxlIHJlYWRlciBhbmQKLWFuIG9iamVjdCBmaWxlIHdyaXRlciwgYW5kIGl0IGRpZCB0aGUgbGluayBvcGVyYXRpb24gdXNpbmcgdGhlIGdlbmVyaWMKLUJGRCBzdHJ1Y3R1cmVzLiAgSG93ZXZlciwgdGhpcyB0dXJuZWQgb3V0IHRvIGJlIHRvbyBzbG93IGFuZCB0b28gbWVtb3J5Ci1pbnRlbnNpdmUuCi0KLVRoZSBvZmZpY2lhbCBCRkQgbGlua2VyIGZ1bmN0aW9ucyB3ZXJlIHdyaXR0ZW4gdG8gcGVybWl0IHNwZWNpZmljIEJGRAotYmFja2VuZHMgdG8gcGVyZm9ybSB0aGUgbGluayB3aXRob3V0IHRyYW5zbGF0aW5nIHRocm91Z2ggdGhlIGdlbmVyaWMKLXN0cnVjdHVyZXMsIGluIHRoZSBub3JtYWwgY2FzZSB3aGVyZSBhbGwgdGhlIGlucHV0IGZpbGVzIGFuZCBvdXRwdXQgZmlsZQotaGF2ZSB0aGUgc2FtZSBvYmplY3QgZmlsZSBmb3JtYXQuICBOb3QgYWxsIG9mIHRoZSBiYWNrZW5kcyBjdXJyZW50bHkKLWltcGxlbWVudCB0aGUgbmV3IGludGVyZmFjZSwgYW5kIHRoZXJlIGFyZSBkZWZhdWx0IGxpbmtpbmcgZnVuY3Rpb25zCi13aXRoaW4gQkZEIHdoaWNoIHVzZSB0aGUgZ2VuZXJpYyBzdHJ1Y3R1cmVzIGFuZCB3aGljaCB3b3JrIHdpdGggYWxsCi1iYWNrZW5kcy4KLQotRm9yIHNldmVyYWwgb2JqZWN0IGZpbGUgZm9ybWF0cyB0aGUgbGlua2VyIG5lZWRzIGFkZGl0aW9uYWwgaG9va3Mgd2hpY2gKLWFyZSBub3QgcHJvdmlkZWQgYnkgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UsIHBhcnRpY3VsYXJseSBmb3IgZHluYW1pYwotbGlua2luZyBzdXBwb3J0LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgY2FsbGVkIGZyb20gdGhlIGxpbmtlcgotZW11bGF0aW9uIHRlbXBsYXRlLgotCi1Abm9kZSBCRkQgdmlldwotQHN1YnNlY3Rpb24gVGhlIEJGRCB2aWV3IG9mIGEgZmlsZQotCi1CRkQgdXNlcyBnZW5lcmljIHN0cnVjdHVyZXMgdG8gbWFuYWdlIGluZm9ybWF0aW9uLiAgSXQgdHJhbnNsYXRlcyBkYXRhCi1pbnRvIHRoZSBnZW5lcmljIGZvcm0gd2hlbiByZWFkaW5nIGZpbGVzLCBhbmQgb3V0IG9mIHRoZSBnZW5lcmljIGZvcm0KLXdoZW4gd3JpdGluZyBmaWxlcy4KLQotQkZEIGRlc2NyaWJlcyBhIGZpbGUgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHtiZmR9IHR5cGUuICBBIEBzYW1we2JmZH0KLWlzIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMuICBUaGUgQkZEIGluZm9ybWF0aW9uIGNhbiBiZQotZGlzcGxheWVkIHVzaW5nIHRoZSBAc2FtcHtvYmpkdW1wfSBwcm9ncmFtIHdpdGggdmFyaW91cyBvcHRpb25zLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGdlbmVyYWwgaW5mb3JtYXRpb24KLVRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIGEgZmV3IGdlbmVyYWwgZmxhZ3MsIHRoZSBzdGFydCBhZGRyZXNzLgotQGl0ZW0gYXJjaGl0ZWN0dXJlCi1UaGUgYXJjaGl0ZWN0dXJlLCBpbmNsdWRpbmcgYm90aCBhIGdlbmVyYWwgcHJvY2Vzc29yIHR5cGUgKG02OGssIE1JUFMKLWV0Yy4pIGFuZCBhIHNwZWNpZmljIG1hY2hpbmUgbnVtYmVyIChtNjgwMDAsIFI0MDAwLCBldGMuKS4KLUBpdGVtIHNlY3Rpb25zCi1BIGxpc3Qgb2Ygc2VjdGlvbnMuCi1AaXRlbSBzeW1ib2xzCi1BIHN5bWJvbCB0YWJsZS4KLUBlbmQgdGFibGUKLQotQkZEIHJlcHJlc2VudHMgYSBzZWN0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXNlY3Rpb259IHR5cGUuICBFYWNoCi1zZWN0aW9uIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMgYWxzbyBoYXZlIGFuIGFzc29jaWF0ZWQKLWJsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgU2VjdGlvbnMgYWxzbyBoYXZlCi1hc3NvY2lhdGVkIGZsYWdzLCBhIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MsIGEgbG9hZCBtZW1vcnkgYWRkcmVzcywgYQotcmVxdWlyZWQgYWxpZ25tZW50LCBhIGxpc3Qgb2YgcmVsb2NhdGlvbnMsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzCi1pbmZvcm1hdGlvbi4KLQotQkZEIHJlcHJlc2VudHMgYSByZWxvY2F0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXJlbGVudH0gdHlwZS4gIEEKLXJlbG9jYXRpb24gZGVzY3JpYmVzIGFuIGFjdGlvbiB3aGljaCB0aGUgbGlua2VyIG11c3QgdGFrZSB0byBtb2RpZnkgdGhlCi1zZWN0aW9uIGNvbnRlbnRzLiAgUmVsb2NhdGlvbnMgaGF2ZSBhIHN5bWJvbCwgYW4gYWRkcmVzcywgYW4gYWRkZW5kLCBhbmQKLWEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgaG93IHRvIHBlcmZvcm0gdGhlCi1yZWxvY2F0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KLQotQkZEIHJlcHJlc2VudHMgYSBzeW1ib2wgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHthc3ltYm9sfSB0eXBlLiAgQQotc3ltYm9sIGhhcyBhIG5hbWUsIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuIG9mZnNldCB3aXRoaW4gdGhhdAotc2VjdGlvbiwgYW5kIHNvbWUgZmxhZ3MuCi0KLUFyY2hpdmUgZmlsZXMgZG8gbm90IGhhdmUgYW55IHNlY3Rpb25zIG9yIHN5bWJvbHMuICBJbnN0ZWFkLCBCRkQKLXJlcHJlc2VudHMgYW4gYXJjaGl2ZSBmaWxlIGFzIGEgZmlsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YKLUBzYW1we2JmZH1zLiAgQkZEIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhcmNoaXZlIHN5bWJvbCBtYXAsIGFzIGEKLWxpc3Qgb2Ygc3ltYm9sIG5hbWVzLiAgQkZEIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBAc2FtcHtiZmR9Ci13aXRoaW4gdGhlIGFyY2hpdmUgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGVudHJ5IGluIHRoZQotYXJjaGl2ZSBzeW1ib2wgbWFwLgotCi1Abm9kZSBCRkQgYmxpbmRuZXNzCi1Ac3Vic2VjdGlvbiBCRkQgbG9zZXMgaW5mb3JtYXRpb24KLQotTW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzIGhhdmUgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50IGluCi1pdHMgZ2VuZXJpYyBmb3JtLCBhdCBsZWFzdCBhcyBjdXJyZW50bHkgZGVmaW5lZC4KLQotVGhlcmUgaXMgb2Z0ZW4gZXhwbGljaXQgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50LiAgRm9yCi1leGFtcGxlLCB0aGUgQ09GRiB2ZXJzaW9uIHN0YW1wLCBvciB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMuICBCRkQKLXByb3ZpZGVzIHNwZWNpYWwgaG9va3MgdG8gaGFuZGxlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb3B5aW5nLAotcHJpbnRpbmcsIG9yIGxpbmtpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGUgQkZEIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhcgotb2JqZWN0IGZpbGUgZm9ybWF0IHdpbGwgbm9ybWFsbHkgc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBpbiBwcml2YXRlIGRhdGEKLWFuZCBoYW5kbGUgaXQgdXNpbmcgdGhlIHNwZWNpYWwgaG9va3MuCi0KLUluIHNvbWUgY2FzZXMgdGhlcmUgaXMgYWxzbyBpbXBsaWNpdCBpbmZvcm1hdGlvbiB3aGljaCBCRkQgY2FuIG5vdAotcmVwcmVzZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBNSVBTIHByb2Nlc3NvciBkaXN0aW5ndWlzaGVzIHNtYWxsIGFuZAotbGFyZ2Ugc3ltYm9scywgYW5kIHJlcXVpcmVzIHRoYXQgYWxsIHNtYWxsIHN5bWJscyBiZSB3aXRoaW4gMzJLIG9mIHRoZQotR1AgcmVnaXN0ZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIE1JUFMgYXNzZW1ibGVyIG11c3QgYmUgYWJsZSB0byBtYXJrCi12YXJpYWJsZXMgYXMgZWl0aGVyIHNtYWxsIG9yIGxhcmdlLCBhbmQgdGhlIE1JUFMgbGlua2VyIG11c3Qga25vdyB0byBwdXQKLXNtYWxsIHN5bWJvbHMgd2l0aGluIHJhbmdlIG9mIHRoZSBHUCByZWdpc3Rlci4gIFNpbmNlIEJGRCBjYW4gbm90Ci1yZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiwgdGhpcyBtZWFucyB0aGF0IHRoZSBhc3NlbWJsZXIgYW5kIGxpbmtlcgotbXVzdCBoYXZlIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCi1mb3JtYXQgd2hpY2ggaXMgb3V0c2lkZSBvZiB0aGUgQkZEIGxpYnJhcnkuCi0KLVRoaXMgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbmRpY2F0ZXMgYXJlYXMgd2hlcmUgdGhlIEJGRCBwYXJhZGlnbSBicmVha3MKLWRvd24uICBJdCBpcyBub3QgYWN0dWFsbHkgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSBteXJpYWQgZGlmZmVyZW5jZXMKLWFtb25nIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNpbmcgYSBzaW5nbGUgZ2VuZXJpYyBpbnRlcmZhY2UsIGF0IGxlYXN0IG5vdAotaW4gdGhlIG1hbm5lciB3aGljaCBCRkQgZG9lcyBpdCB0b2RheS4KLQotTmV2ZXJ0aGVsZXNzLCB0aGUgQkZEIGxpYnJhcnkgZG9lcyBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGRlYWxpbmcKLXdpdGggb2JqZWN0IGZpbGVzLCBhbmQgcGFydGljdWxhciBwcm9ibGVtcyBjYXVzZWQgYnkgaW5mb3JtYXRpb24gbG9zcwotY2FuIG5vcm1hbGx5IGJlIHNvbHZlZCB1c2luZyBzb21lIHNvcnQgb2YgcmVsYXRpdmVseSBjb25zdHJhaW5lZCBob29rCi1pbnRvIHRoZSBsaWJyYXJ5LgotCi0KLQotQG5vZGUgQkZEIGd1aWRlbGluZXMKLUBzZWN0aW9uIEJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi1AY2luZGV4IGJmZCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi1AY2luZGV4IHByb2dyYW1taW5nIGd1aWRlbGluZXMgZm9yIGJmZAotQGNpbmRleCBndWlkZWxpbmVzLCBiZmQgcHJvZ3JhbW1pbmcKLQotVGhlcmUgaXMgYSBsb3Qgb2YgcG9vcmx5IHdyaXR0ZW4gYW5kIGNvbmZ1c2luZyBjb2RlIGluIEJGRC4gIE5ldyBCRkQKLWNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYSBoaWdoZXIgc3RhbmRhcmQuICBNZXJlbHkgYmVjYXVzZSBzb21lIEJGRAotY29kZSBpcyB3cml0dGVuIGluIGEgcGFydGljdWxhciBtYW5uZXIgZG9lcyBub3QgbWVhbiB0aGF0IHlvdSBzaG91bGQKLWVtdWxhdGUgaXQuCi0KLUhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUZvbGxvdyB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBpdGVtCi1Bdm9pZCBnbG9iYWwgdmFyaWFibGVzLiAgV2UgaWRlYWxseSB3YW50IEJGRCB0byBiZSBmdWxseSByZWVudHJhbnQsIHNvCi10aGF0IGl0IGNhbiBiZSB1c2VkIGluIG11bHRpcGxlIHRocmVhZHMuICBBbGwgdXNlcyBvZiBnbG9iYWwgb3Igc3RhdGljCi12YXJpYWJsZXMgaW50ZXJmZXJlIHdpdGggdGhhdC4gIEluaXRpYWxpemVkIGNvbnN0YW50IHZhcmlhYmxlcyBhcmUgT0ssCi1hbmQgdGhleSBzaG91bGQgYmUgZXhwbGljaXRseSBtYXJrZWQgd2l0aCBjb25zdC4gIEluc3RlYWQgb2YgZ2xvYmFsCi12YXJpYWJsZXMsIHVzZSBkYXRhIGF0dGFjaGVkIHRvIGEgQkZEIG9yIHRvIGEgbGlua2VyIGhhc2ggdGFibGUuCi0KLUBpdGVtCi1BbGwgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZSBuYW1lcyB3aGljaCBzdGFydCB3aXRoCi1Ac2FtcHtiZmRffS4gIEFsbCBzdWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gc29tZSBoZWFkZXIgZmlsZSwKLXR5cGljYWxseSBAZmlsZXtiZmQuaH0uICBTZWUsIGZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBkZWNsYXJhdGlvbnMgbmVhcgotdGhlIGVuZCBvZiBAZmlsZXtiZmQtaW4uaH0sIHdoaWNoIG1vc3RseSBkZWNsYXJlIGZ1bmN0aW9ucyByZXF1aXJlZCBieQotc3BlY2lmaWMgbGlua2VyIGVtdWxhdGlvbnMuCi0KLUBpdGVtCi1BbGwgZnVuY3Rpb25zIHdoaWNoIG5lZWQgdG8gYmUgdmlzaWJsZSBmcm9tIG9uZSBmaWxlIHRvIGFub3RoZXIgd2l0aGluCi1CRkQsIGJ1dCBzaG91bGQgbm90IGJlIHZpc2libGUgb3V0c2lkZSBvZiBCRkQsIHNob3VsZCBzdGFydCB3aXRoCi1Ac2FtcHtfYmZkX30uICBBbHRob3VnaCBleHRlcm5hbCBuYW1lcyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtffSBhcmUKLXByb2hpYml0ZWQgYnkgdGhlIEFOU0kgc3RhbmRhcmQsIGluIHByYWN0aWNlIHRoaXMgdXNhZ2Ugd2lsbCBhbHdheXMKLXdvcmssIGFuZCBpdCBpcyByZXF1aXJlZCBieSB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBpdGVtCi1BbHdheXMgcmVtZW1iZXIgdGhhdCBwZW9wbGUgY2FuIGNvbXBpbGUgdXNpbmcgQHNhbXB7LS1lbmFibGUtdGFyZ2V0c30gdG8KLWJ1aWxkIHNldmVyYWwsIG9yIGFsbCwgdGFyZ2V0cyBhdCBvbmNlLiAgSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBsaW5rCi10b2dldGhlciB0aGUgZmlsZXMgZm9yIGFsbCB0YXJnZXRzLgotCi1AaXRlbQotQkZEIGNvZGUgc2hvdWxkIGNvbXBpbGUgd2l0aCBmZXcgb3Igbm8gd2FybmluZ3MgdXNpbmcgQHNhbXB7Z2NjIC1XYWxsfS4KLVNvbWUgd2FybmluZ3MgYXJlIE9LLCBsaWtlIHRoZSBhYnNlbmNlIG9mIGNlcnRhaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zCi13aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgV2FybmluZ3MgYWJvdXQKLWFtYmlndW91cyBleHByZXNzaW9ucyBhbmQgdGhlIGxpa2Ugc2hvdWxkIGFsd2F5cyBiZSBmaXhlZC4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvcgotQHNlY3Rpb24gQkZEIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggYmZkIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciBpbiBiZmQKLQotQkZEIHN1cHBvcnRzIG11bHRpcGxlIG9iamVjdCBmaWxlIGZvcm1hdHMgYnkgdXNpbmcgdGhlIEBkZm57dGFyZ2V0Ci12ZWN0b3J9LiAgVGhpcyBpcyBzaW1wbHkgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaW1wbGVtZW50Ci1iZWhhdmlvdXIgdGhhdCBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi1JbiB0aGlzIHNlY3Rpb24gSSBsaXN0IGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGUgdGFyZ2V0IHZlY3RvciBhbmQKLWRlc2NyaWJlIHdoYXQgdGhleSBkby4KLQotQG1lbnUKLSogQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91czo6CU1pc2NlbGxhbmVvdXMgY29uc3RhbnRzCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHN3YXA6OgkJU3dhcHBpbmcgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdDo6CQlGb3JtYXQgdHlwZSBkZXBlbmRlbnQgZnVuY3Rpb25zCi0qIEJGRF9KVU1QX1RBQkxFIG1hY3Jvczo6CQlCRkRfSlVNUF9UQUJMRSBtYWNyb3MKLSogQkZEIHRhcmdldCB2ZWN0b3IgZ2VuZXJpYzo6CQlHZW5lcmljIGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBjb3B5OjoJCUNvcHkgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGNvcmU6OgkJQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmU6OgkJQXJjaGl2ZSBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3Igc3ltYm9sczo6CQlTeW1ib2wgdGFibGUgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jczo6CQlSZWxvY2F0aW9uIHN1cHBvcnQKLSogQkZEIHRhcmdldCB2ZWN0b3Igd3JpdGU6OgkJT3V0cHV0IGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBsaW5rOjoJCUxpbmtlciBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYzo6CQlEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gZnVuY3Rpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91cwotQHN1YnNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb25zdGFudHMKLQotVGhlIHRhcmdldCB2ZWN0b3Igc3RhcnRzIHdpdGggYSBzZXQgb2YgY29uc3RhbnRzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIG5hbWUKLVRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyBhbiBhcmJpdHJhcnkgc3RyaW5nLiAgVGhpcyBpcwotaG93IHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIGluIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciB0b29scyB3aGljaAotdXNlIEJGRCwgc3VjaCBhcyB0aGUgQHNhbXB7LW9mb3JtYXR9IGxpbmtlciBvcHRpb24uCi0KLUBpdGVtIGZsYXZvdXIKLUEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiB0YXJnZXQuICBUaGUgZm9sbG93aW5nIGZsYXZvdXJzIGFyZQotY3VycmVudGx5IGRlZmluZWQ6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIKLVVuZGVmaW5lZCBvciB1bmtub3duLgotQGl0ZW0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLWEub3V0LgotQGl0ZW0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLUNPRkYuCi1AaXRlbSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLUVDT0ZGLgotQGl0ZW0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotRUxGLgotQGl0ZW0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIKLUlFRUUtNjk1LgotQGl0ZW0gYmZkX3RhcmdldF9ubG1fZmxhdm91cgotTkxNLgotQGl0ZW0gYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyCi1PQVNZUy4KLUBpdGVtIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIKLVRla3Ryb25peCBoZXggZm9ybWF0LgotQGl0ZW0gYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIKLU1vdG9yb2xhIFMtcmVjb3JkIGZvcm1hdC4KLUBpdGVtIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyCi1JbnRlbCBoZXggZm9ybWF0LgotQGl0ZW0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotU09NICh1c2VkIG9uIEhQL1VYKS4KLUBpdGVtIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyCi1vczkwMDAuCi1AaXRlbSBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIKLVZFUlNBZG9zLgotQGl0ZW0gYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyCi1NUy1ET1MuCi1AaXRlbSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotb3BlblZNUy4KLUBlbmQgdGFibGUKLQotQGl0ZW0gYnl0ZW9yZGVyCi1UaGUgYnl0ZSBvcmRlciBvZiBkYXRhIGluIHRoZSBvYmplY3QgZmlsZS4gIE9uZSBvZgotQHNhbXB7QkZEX0VORElBTl9CSUd9LCBAc2FtcHtCRkRfRU5ESUFOX0xJVFRMRX0sIG9yCi1Ac2FtcHtCRkRfRU5ESUFOX1VOS05PV059LiAgVGhlIGxhdHRlciB3b3VsZCBiZSB1c2VkIGZvciBhIGZvcm1hdCBzdWNoCi1hcyBTLXJlY29yZHMgd2hpY2ggZG8gbm90IHJlY29yZCB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBkYXRhLgotCi1AaXRlbSBoZWFkZXJfYnl0ZW9yZGVyCi1UaGUgYnl0ZSBvcmRlciBvZiBoZWFkZXIgaW5mb3JtYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLiAgTm9ybWFsbHkgdGhlCi1zYW1lIGFzIHRoZSBAc2FtcHtieXRlb3JkZXJ9IGZpZWxkLCBidXQgdGhlcmUgYXJlIGNlcnRhaW4gY2FzZXMgd2hlcmUgaXQKLW1heSBiZSBkaWZmZXJlbnQuCi0KLUBpdGVtIG9iamVjdF9mbGFncwotRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUgQHNhbXB7ZmxhZ3N9IGZpZWxkIG9mIGEgQkZEIHdpdGggdGhpcwotZm9ybWF0LgotCi1AaXRlbSBzZWN0aW9uX2ZsYWdzCi1GbGFncyB3aGljaCBtYXkgYXBwZWFyIGluIHRoZSBAc2FtcHtmbGFnc30gZmllbGQgb2YgYSBzZWN0aW9uIHdpdGhpbiBhCi1CRkQgd2l0aCB0aGlzIGZvcm1hdC4KLQotQGl0ZW0gc3ltYm9sX2xlYWRpbmdfY2hhcgotQSBjaGFyYWN0ZXIgd2hpY2ggdGhlIEMgY29tcGlsZXIgbm9ybWFsbHkgcHV0cyBiZWZvcmUgYSBzeW1ib2wuICBGb3IKLWV4YW1wbGUsIGFuIGEub3V0IGNvbXBpbGVyIHdpbGwgdHlwaWNhbGx5IGdlbmVyYXRlIHRoZSBzeW1ib2wKLUBzYW1we19mb299IGZvciBhIGZ1bmN0aW9uIG5hbWVkIEBzYW1we2Zvb30gaW4gdGhlIEMgc291cmNlLCBpbiB3aGljaAotY2FzZSB0aGlzIGZpZWxkIHdvdWxkIGJlIEBzYW1we199LiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBjaGFyYWN0ZXIsIHRoaXMKLWZpZWxkIHdpbGwgYmUgQHNhbXB7MH0uCi0KLUBpdGVtIGFyX3BhZF9jaGFyCi1UaGUgcGFkZGluZyBjaGFyYWN0ZXIgdG8gdXNlIGF0IHRoZSBlbmQgb2YgYW4gYXJjaGl2ZSBuYW1lLiAgTm9ybWFsbHkKLUBzYW1wey99LgotCi1AaXRlbSBhcl9tYXhfbmFtZWxlbgotVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2hvcnQgbmFtZSBpbiBhbiBhcmNoaXZlLiAgTm9ybWFsbHkgQHNhbXB7MTR9LgotCi1AaXRlbSBiYWNrZW5kX2RhdGEKLUEgcG9pbnRlciB0byBjb25zdGFudCBiYWNrZW5kIGRhdGEuICBUaGlzIGlzIHVzZWQgYnkgYmFja2VuZHMgdG8gc3RvcmUKLXdoYXRldmVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhleSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHNpbWlsYXIgdGFyZ2V0Ci12ZWN0b3JzIHdoaWNoIHVzZSB0aGUgc2FtZSBzZXRzIG9mIGZ1bmN0aW9ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3Igc3dhcAotQHN1YnNlY3Rpb24gU3dhcHBpbmcgZnVuY3Rpb25zCi0KLUV2ZXJ5IHRhcmdldCB2ZWN0b3IgaGFzIGZ1Y3Rpb24gcG9pbnRlcnMgdXNlZCBmb3Igc3dhcHBpbmcgaW5mb3JtYXRpb24KLWluIGFuZCBvdXQgb2YgdGhlIHRhcmdldCByZXByZXNlbnRhdGlvbi4gIFRoZXJlIGFyZSB0d28gc2V0cyBvZgotZnVuY3Rpb25zOiBvbmUgZm9yIGRhdGEgaW5mb3JtYXRpb24sIGFuZCBvbmUgZm9yIGhlYWRlciBpbmZvcm1hdGlvbi4KLUVhY2ggc2V0IGhhcyB0aHJlZSBzaXplczogNjQtYml0LCAzMi1iaXQsIGFuZCAxNi1iaXQuICBFYWNoIHNpemUgaGFzCi10aHJlZSBhY3R1YWwgZnVuY3Rpb25zOiBwdXQsIGdldCB1bnNpZ25lZCwgYW5kIGdldCBzaWduZWQuCi0KLVRoZXNlIDE4IGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb252ZXJ0IGRhdGEgYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0Ci1yZXByZXNlbnRhdGlvbnMuCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdAotQHN1YnNlY3Rpb24gRm9ybWF0IHR5cGUgZGVwZW5kZW50IGZ1bmN0aW9ucwotCi1FdmVyeSB0YXJnZXQgdmVjdG9yIGhhcyB0aHJlZSBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlCi1pbmRleGVkIGJ5IHRoZSBCRkQgZm9ybWF0IHR5cGUuICBUaGUgQkZEIGZvcm1hdCB0eXBlcyBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfdW5rbm93bgotVW5rbm93biBmb3JtYXQuICBOb3QgdXNlZCBmb3IgYW55dGhpbmcgdXNlZnVsLgotQGl0ZW0gYmZkX29iamVjdAotT2JqZWN0IGZpbGUuCi1AaXRlbSBiZmRfYXJjaGl2ZQotQXJjaGl2ZSBmaWxlLgotQGl0ZW0gYmZkX2NvcmUKLUNvcmUgZmlsZS4KLUBlbmQgdGFibGUKLQotVGhlIHRocmVlIGFycmF5cyBvZiBmdW5jdGlvbiBwb2ludGVycyBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfY2hlY2tfZm9ybWF0Ci1DaGVjayB3aGV0aGVyIHRoZSBCRkQgaXMgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCAob2JqZWN0IGZpbGUsIGFyY2hpdmUKLWZpbGUsIG9yIGNvcmUgZmlsZSkgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhcmdldCB2ZWN0b3IuICBUaGlzIGlzIGNhbGxlZAotYnkgdGhlIEBzYW1we2JmZF9jaGVja19mb3JtYXR9IGZ1bmN0aW9uIHdoZW4gZXhhbWluaW5nIGFuIGV4aXN0aW5nIEJGRC4KLUlmIHRoZSBCRkQgbWF0Y2hlcyB0aGUgZGVzaXJlZCBmb3JtYXQsIHRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGFueQotZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIEBzYW1we3RkYXRhfSBmaWVsZCBvZiB0aGUgQkZELgotVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIEJGRCB0YXJnZXQgdmVjdG9yIGZ1bmN0aW9uCi1vbiBhIGZpbGUgb3BlbmVkIGZvciByZWFkaW5nLgotCi1AaXRlbSBiZmRfc2V0X2Zvcm1hdAotU2V0IHRoZSBmb3JtYXQgb2YgYSBCRkQgd2hpY2ggd2FzIGNyZWF0ZWQgZm9yIG91dHB1dC4gIFRoaXMgaXMgY2FsbGVkIGJ5Ci10aGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGZ1bmN0aW9uIGFmdGVyIGNyZWF0aW5nIHRoZSBCRkQgd2l0aCBhCi1mdW5jdGlvbiBzdWNoIGFzIEBzYW1we2JmZF9vcGVud30uICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSBmb3JtYXQKLXNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHdyaXRlIG91dCBhbiBvYmplY3QgZmlsZSBvciB3aGF0ZXZlciBvZgotdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQKLXRhcmdldCB2ZWN0b3IgZnVuY3Rpb24gb24gYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KLQotQGl0ZW0gYmZkX3dyaXRlX2NvbnRlbnRzCi1Xcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBCRkQgaW4gdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgaXMgY2FsbGVkCi1ieSBAc2FtcHtiZmRfY2xvc2V9IGZ1bmN0aW9uIGZvciBhIEJGRCBvcGVuZWQgZm9yIHdyaXRpbmcuICBUaGlzIHJlYWxseQotc2hvdWxkIG5vdCBiZSBhbiBhcnJheSBzZWxlY3RlZCBieSBmb3JtYXQgdHlwZSwgYXMgdGhlCi1Ac2FtcHtiZmRfc2V0X2Zvcm1hdH0gZnVuY3Rpb24gcHJvdmlkZXMgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbi4KLUluIGZhY3QsIEJGRCB3aWxsIGZhaWwgaWYgYSBkaWZmZXJlbnQgZm9ybWF0IGlzIHVzZWQgd2hlbiBjYWxsaW5nCi10aHJvdWdoIHRoZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kIHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9Ci1hcnJheXM7IGZvcnR1bmF0ZWx5LCBzaW5jZSBAc2FtcHtiZmRfY2xvc2V9IGdldHMgaXQgcmlnaHQsIHRoaXMgaXMgYQotZGlmZmljdWx0IGVycm9yIHRvIG1ha2UuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRF9KVU1QX1RBQkxFIG1hY3JvcwotQHN1YnNlY3Rpb24gQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvcwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRX0KLQotTW9zdCB0YXJnZXQgdmVjdG9ycyBhcmUgZGVmaW5lZCB1c2luZyBAc2FtcHtCRkRfSlVNUF9UQUJMRX0gbWFjcm9zLgotVGhlc2UgbWFjcm9zIHRha2UgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIGEgcHJlZml4IGFwcGxpZWQgdG8gYSBzZXQKLW9mIGZ1bmN0aW9ucy4gIFRoZSBtYWNyb3MgYXJlIHRoZW4gdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhlCi10YXJnZXQgdmVjdG9yLgotCi1Gb3IgZXhhbXBsZSwgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gZGVmaW5lcyB0aHJlZQotZnVuY3Rpb25zOiBAc2FtcHtfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kfSwgQHNhbXB7X2Nhbm9uaWNhbGl6ZV9yZWxvY30sCi1hbmQgQHNhbXB7X2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBBIHJlZmVyZW5jZSBsaWtlCi1Ac2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGZvbyl9IHdpbGwgZXhwYW5kIGludG8gdGhyZWUgZnVuY3Rpb25zCi1wcmVmaXhlZCB3aXRoIEBzYW1we2Zvb306IEBzYW1we2Zvb19nZXRfcmVsb2NfdXBwZXJfZm91bmR9LCBldGMuICBUaGUKLUBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gd2lsbCBiZSBwbGFjZWQgc3VjaCB0aGF0IHRob3NlIHRocmVlCi1mdW5jdGlvbnMgaW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBCRkQgdGFyZ2V0IHZlY3Rvci4KLQotVGhpcyBpcyBkb25lIGJlY2F1c2UgaXQgdHVybnMgb3V0IHRoYXQgbWFueSBkaWZmZXJlbnQgdGFyZ2V0IHZlY3RvcnMgY2FuCi1zaGFyZSBjZXJ0YWluIGNsYXNzZXMgb2YgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGFyY2hpdmVzIGFyZSBzaW1pbGFyCi1vbiBtb3N0IHBsYXRmb3Jtcywgc28gbW9zdCB0YXJnZXQgdmVjdG9ycyBjYW4gdXNlIHRoZSBzYW1lIGFyY2hpdmUKLWZ1bmN0aW9ucy4gIFRob3NlIHRhcmdldCB2ZWN0b3JzIGFsbCB1c2UgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQVJDSElWRX0KLXdpdGggdGhlIHNhbWUgYXJndW1lbnQsIGNhbGxpbmcgYSBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGlzIGRlZmluZWQgaW4KLUBmaWxle2FyY2hpdmUuY30uCi0KLUVhY2ggb2YgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNyb3MgaXMgbWVudGlvbmVkIGJlbG93IGFsb25nIHdpdGgKLXRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaXQgZGVmaW5lcy4gIFRoZSBmdW5jdGlvbgotcG9pbnRlcnMgd2lsbCBiZSBkZXNjcmliZWQgdXNpbmcgdGhlIG5hbWUgd2l0aG91dCB0aGUgcHJlZml4IHdoaWNoIHRoZQotQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvIGRlZmluZXMuICBUaGlzIG5hbWUgaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMKLXRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUuICBBbnkgZGlmZmVyZW5jZXMKLXdpbGwgYmUgbm90ZWQuCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGdlbmVyaWMKLUBzdWJzZWN0aW9uIEdlbmVyaWMgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0dFTkVSSUN9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9HRU5FUklDfSBtYWNybyBpcyB1c2VkIGZvciBzb21lIGNhdGNoIGFsbAotZnVuY3Rpb25zIHdoaWNoIGRvbid0IGVhc2lseSBmaXQgaW50byBvdGhlciBjYXRlZ29yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9jbG9zZV9hbmRfY2xlYW51cAotRnJlZSBhbnkgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZELiAgVGhpcyBpcwotY2FsbGVkIHdoZW4gYW55IEJGRCBpcyBjbG9zZWQgKHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9IGZ1bmN0aW9uCi1tZW50aW9uZWQgZWFybGllciBpcyBvbmx5IGNhbGxlZCBmb3IgYSBCRkQgb3BlbmVkIGZvciB3cml0aW5nKS4gIE1vc3QKLXRhcmdldHMgdXNlIEBzYW1we2JmZF9hbGxvY30gdG8gYWxsb2NhdGUgYWxsIHRhcmdldCBzcGVjaWZpYwotaW5mb3JtYXRpb24sIGFuZCB0aGVyZWZvcmUgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotVGhpcyBmdW5jdGlvbiBwb2ludGVyIGlzIHR5cGljYWxseSBzZXQgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cH0sIHdoaWNoIHNpbXBseSByZXR1cm5zIHRydWUuCi0KLUBpdGVtIF9iZmRfZnJlZV9jYWNoZWRfaW5mbwotRnJlZSBhbnkgY2FjaGVkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZEIHdoaWNoIGNhbiBiZQotcmVjcmVhdGVkIGxhdGVyIGlmIG5lY2Vzc2FyeS4gIFRoaXMgaXMgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeQotY29uc3VtcHRpb24gcmVxdWlyZWQgYnkgcHJvZ3JhbXMgdXNpbmcgQkZELiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgdmlhCi10aGUgQHNhbXB7YmZkX2ZyZWVfY2FjaGVkX2luZm99IG1hY3JvLiAgSXQgaXMgdXNlZCBieSB0aGUgZGVmYXVsdAotYXJjaGl2ZSByb3V0aW5lcyB3aGVuIGNvbXB1dGluZyB0aGUgYXJjaGl2ZSBtYXAuICBNb3N0IHRhcmdldHMgZG8gbm90Ci1kbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzIGVudHJ5IHBvaW50LCBhbmQganVzdCBzZXQgaXQgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19mcmVlX2NhY2hlZF9pbmZvfSwgd2hpY2ggc2ltcGx5IHJldHVybnMgdHJ1ZS4KLQotQGl0ZW0gX25ld19zZWN0aW9uX2hvb2sKLVRoaXMgaXMgY2FsbGVkIGZyb20gQHNhbXB7YmZkX21ha2Vfc2VjdGlvbl9hbnl3YXl9IHdoZW5ldmVyIGEgbmV3Ci1zZWN0aW9uIGlzIGNyZWF0ZWQuICBNb3N0IHRhcmdldHMgdXNlIGl0IHRvIGluaXRpYWxpemUgc2VjdGlvbiBzcGVjaWZpYwotaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdGlvbgotY29ycmVzcG9uZHMgdG8gYW4gYWN0dWFsIHNlY3Rpb24gaW4gYW4gYWN0dWFsIEJGRC4KLQotQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzCi1HZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLUBzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30uICBNb3N0IHRhcmdldHMgc2V0IHRoaXMgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoIGRvZXMgYSBAc2FtcHtiZmRfc2Vla30KLWJhc2VkIG9uIHRoZSBzZWN0aW9uJ3MgQHNhbXB7ZmlsZXBvc30gZmllbGQgYW5kIGEgQHNhbXB7YmZkX3JlYWR9LiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfS4KLQotQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotU2V0IGEgQHNhbXB7YmZkX3dpbmRvd30gdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcwotY2FsbGVkIGZyb20gQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30uICBUaGUKLUBzYW1we2JmZF93aW5kb3d9IGlkZWEgbmV2ZXIgcmVhbGx5IGNhdWdodCBvbiwgYW5kIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcwotZXZlciBjYWxsZWQuICBQcmV0dHkgbXVjaCBhbGwgdGFyZ2V0cyBpbXBsZW1lbnQgdGhpcyBhcwotQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fSwgd2hpY2ggdXNlcwotQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfSB0byBkbyB0aGUgcmlnaHQgdGhpbmcuICBUaGUKLWNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29weQotQHN1YnNlY3Rpb24gQ29weSBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfQ09QWX0KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUFl9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBhcmUKLWNhbGxlZCB3aGVuIGNvcHlpbmcgQkZEcywgYW5kIGZvciBhIGNvdXBsZSBvZiBmdW5jdGlvbnMgd2hpY2ggZGVhbCB3aXRoCi1pbnRlcm5hbCBCRkQgaW5mb3JtYXRpb24uCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLVRoaXMgaXMgY2FsbGVkIHdoZW4gY29weWluZyBhIEJGRCwgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGF9LgotSWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgQkZEcyBoYXZlIHRoZSBzYW1lIGZvcm1hdCwgdGhpcyB3aWxsIGNvcHkgYW55Ci1wcml2YXRlIGluZm9ybWF0aW9uIG92ZXIuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIHNlY3Rpb24gY29udGVudHMKLWhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS4gIE9ubHkgYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbgotdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi1UaGlzIGlzIGNhbGxlZCB3aGVuIGxpbmtpbmcsIHZpYSBAc2FtcHtiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YX0uICBJdAotZ2l2ZXMgdGhlIGJhY2tlbmQgbGlua2VyIGNvZGUgYSBjaGFuY2UgdG8gc2V0IGFueSBzcGVjaWFsIGZsYWdzIGluIHRoZQotb3V0cHV0IGZpbGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBmaWxlLiAgT25seSBhIGZldyB0YXJnZXRzCi1kbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLVRoaXMgaXMgc2ltaWxhciB0byBAc2FtcHtfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YX0sIGJ1dCBpdCBpcyBjYWxsZWQKLWZvciBlYWNoIHNlY3Rpb24sIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YX0uICBUaGlzCi1mdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGFueSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuLiAgT25seQotYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGF9LCBidXQgSSBkb24ndAotdGhpbmsgYW55dGhpbmcgYWN0dWFsbHkgY2FsbHMgaXQuICBJZiBpdCB3ZXJlIGRlZmluZWQsIGl0IGNvdWxkIGJlIHVzZWQKLXRvIGNvcHkgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gIEhvd2V2ZXIsIG1vc3QgQkZEcwotc3RvcmUgZXh0cmEgc3ltYm9sIGluZm9ybWF0aW9uIGJ5IGFsbG9jYXRpbmcgc3BhY2Ugd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLXRoZSBAc2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmUgYW5kIHN0b3JpbmcgcHJpdmF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUKLWV4dHJhIHNwYWNlLiAgU2luY2UgQHNhbXB7b2JqY29weX0gYW5kIG90aGVyIHByb2dyYW1zIGNvcHkgc3ltYm9sCi1pbmZvcm1hdGlvbiBieSBjb3B5aW5nIHBvaW50ZXJzIHRvIEBzYW1we2FzeW1ib2x9IHN0cnVjdHVyZXMsIHRoZQotcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBjb3BpZWQgYXMgd2VsbC4gIE1vc3QKLXRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLVRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc2V0X3ByaXZhdGVfZmxhZ3N9LiAgSXQgaXMgYmFzaWNhbGx5IGEgaG9vawotZm9yIHRoZSBhc3NlbWJsZXIgdG8gc2V0IG1hZ2ljIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBQb3dlclBDCi1FTEYgYXNzZW1ibGVyIHVzZXMgaXQgdG8gc2V0IGZsYWdzIHdoaWNoIGFwcGVhciBpbiB0aGUgZV9mbGFncyBmaWVsZCBvZgotdGhlIEVMRiBoZWFkZXIuICBNb3N0IHRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotVGhpcyBpcyBjYWxsZWQgYnkgQHNhbXB7b2JqZHVtcH0gd2hlbiB0aGUgQHNhbXB7LXB9IG9wdGlvbiBpcyB1c2VkLiAgSXQKLWlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3ByaW50X3ByaXZhdGVfZGF0YX0uICBJdCBwcmludHMgYW55IGludGVyZXN0aW5nCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgQkZEIHdoaWNoIGNhbiBub3QgYmUgb3RoZXJ3aXNlIHJlcHJlc2VudGVkIGJ5IEJGRAotYW5kIHRodXMgY2FuIG5vdCBiZSBwcmludGVkIGJ5IEBzYW1we29iamR1bXB9LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBkbwotYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29yZQotQHN1YnNlY3Rpb24gQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUkV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1JFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBjb3JlIGZpbGVzLiAgT2J2aW91c2x5LCB0aGVzZSBmdW5jdGlvbnMgb25seSBkbyBzb21ldGhpbmcKLWludGVyZXN0aW5nIGZvciB0YXJnZXRzIHdoaWNoIGhhdmUgY29yZSBmaWxlIHN1cHBvcnQuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLUdpdmVuIGEgY29yZSBmaWxlLCB0aGlzIHJldHVybnMgdGhlIGNvbW1hbmQgd2hpY2ggd2FzIHJ1biB0byBwcm9kdWNlIHRoZQotY29yZSBmaWxlLgotCi1AaXRlbSBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi1HaXZlbiBhIGNvcmUgZmlsZSwgdGhpcyByZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIHdoaWNoIHByb2R1Y2VkIHRoZQotY29yZSBmaWxlLgotCi1AaXRlbSBfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi1HaXZlbiBhIGNvcmUgZmlsZSBhbmQgYSBCRkQgZm9yIGFuIGV4ZWN1dGFibGUsIHRoaXMgcmV0dXJucyB3aGV0aGVyIHRoZQotY29yZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dGFibGUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmUKLUBzdWJzZWN0aW9uIEFyY2hpdmUgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBhcmNoaXZlIGZpbGVzLiAgTW9zdCB0YXJnZXRzIHVzZSBDT0ZGIHN0eWxlIGFyY2hpdmUgZmlsZXMKLShpbmNsdWRpbmcgRUxGIHRhcmdldHMpLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9jb2ZmfSBhcyB0aGUKLWFyZ3VtZW50IHRvIEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9LiAgU29tZSB0YXJnZXRzIHVzZSBCU0QvYS5vdXQKLXN0eWxlIGFyY2hpdmVzLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9ic2R9LiAgKFRoZSBtYWluCi1kaWZmZXJlbmNlIGJldHdlZW4gQlNEIGFuZCBDT0ZGIGFyY2hpdmVzIGlzIHRoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUKLXN5bWJvbCB0YWJsZSkuICBUYXJnZXRzIHdpdGggbm8gYXJjaGl2ZSBzdXBwb3J0IHVzZQotQHNhbXB7X2JmZF9ub2FyY2hpdmV9LiAgRmluYWxseSwgYSBmZXcgdGFyZ2V0cyBoYXZlIHVudXN1YWwgYXJjaGl2ZQotaGFuZGxpbmcuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NsdXJwX2FybWFwCi1SZWFkIGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSwgc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcwotaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIGFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3NsdXJwX2FybWFwfS4KLQotQGl0ZW0gX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLVJlYWQgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgZnJvbSB0aGUgYXJjaGl2ZSwgaWYgdGhlcmUgaXMgb25lLAotc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUKLWFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZX0uCi0KLUBpdGVtIGNvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi1CdWlsZCBhbmQgcmV0dXJuIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUgaWYgb25lIGlzIG5lZWRlZCB0byB3cml0ZSBvdXQKLXRoZSBhcmNoaXZlLiAgVGhpcyBhbHNvIGFkanVzdHMgdGhlIGFyY2hpdmUgaGVhZGVycyB0byByZWZlciB0byB0aGUKLWV4dGVuZGVkIG5hbWUgdGFibGUgYXBwcm9wcmlhdGVseS4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlCi1hcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGV9LgotCi1AaXRlbSBfdHJ1bmNhdGVfYXJuYW1lCi1UaGlzIGNvcGllcyBhIGZpbGUgbmFtZSBpbnRvIGFuIGFyY2hpdmUgaGVhZGVyLCB0cnVuY2F0aW5nIGl0IGFzCi1yZXF1aXJlZC4gIEl0IGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfQotcm91dGluZS4gIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBpbnRlcmVzdGluZyBpbiB0YXJnZXRzIHdoaWNoIGRvIG5vdAotc3VwcG9ydCBleHRlbmRlZCBuYW1lIHRhYmxlcywgYnV0IEkgdGhpbmsgdGhlIEdOVSBAc2FtcHthcn0gcHJvZ3JhbQotYWx3YXlzIHVzZXMgZXh0ZW5kZWQgbmFtZSB0YWJsZXMgYW55aG93LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdHJ1bmNhdGVfYXJuYW1lfS4KLQotQGl0ZW0gX3dyaXRlX2FybWFwCi1Xcml0ZSBvdXQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIHVzaW5nIGNhbGxzIHRvIEBzYW1we2JmZF93cml0ZX0uCi1UaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLgotVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7d3JpdGVfYXJtYXB9Ci0obm8gbGVhZGluZyB1bmRlcnNjb3JlKS4KLQotQGl0ZW0gX3JlYWRfYXJfaGRyCi1SZWFkIGFuZCBwYXJzZSBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaGFuZGxlcyBleHBhbmRpbmcgdGhlIGFyY2hpdmUKLWhlYWRlciBuYW1lIGludG8gdGhlIHJlYWwgZmlsZSBuYW1lIHVzaW5nIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgVGhpcwotaXMgY2FsbGVkIGJ5IHJvdXRpbmVzIHdoaWNoIHJlYWQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIG9yIHRoZSBhcmNoaXZlCi1pdHNlbGYuICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9yZWFkX2FyX2hkcl9mbn0uCi0KLUBpdGVtIF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLUdpdmVuIGFuIGFyY2hpdmUgYW5kIGEgQkZEIHJlcHJlc2VudGluZyBhIGZpbGUgc3RvcmVkIHdpdGhpbiB0aGUKLWFyY2hpdmUsIHJldHVybiBhIEJGRCBmb3IgdGhlIG5leHQgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZX0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7b3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlfSAobm8gbGVhZGluZwotdW5kZXJzY29yZSkuCi0KLUBpdGVtIF9nZXRfZWx0X2F0X2luZGV4Ci1HaXZlbiBhbiBhcmNoaXZlIGFuZCBhbiBpbmRleCwgcmV0dXJuIGEgQkZEIGZvciB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZQotY29ycmVzcG9uZGluZyB0byB0aGF0IGVudHJ5IGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX2dldF9lbHRfYXRfaW5kZXh9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2VsdF9hdF9pbmRleH0uCi0KLUBpdGVtIF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLURvIGEgc3RhdCBvbiBhbiBlbGVtZW50IG9mIGFuIGFyY2hpdmUsIHJldHVybmluZyBpbmZvcm1hdGlvbiByZWFkIGZyb20KLXRoZSBhcmNoaXZlIGhlYWRlciAobW9kaWZpY2F0aW9uIHRpbWUsIHVpZCwgZ2lkLCBmaWxlIG1vZGUsIHNpemUpLiAgVGhpcwotaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc3RhdF9hcmNoX2VsdH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zdGF0X2FyY2hfZWx0fS4KLQotQGl0ZW0gX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLUFmdGVyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBoYXZlIGJlZW4gd3JpdHRlbiBvdXQsIHVwZGF0ZQotdGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdG8gYmUgbmV3ZXIgdGhhbiB0aGF0IG9mIHRoZQotZmlsZS4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGEub3V0IHN0eWxlIGFyY2hpdmVzLiAgVGhpcyBpcyBub3JtYWxseQotY2FsbGVkIGJ5IHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcKLWZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCB0YWJsZSBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfU1lNQk9MU30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1NZTUJPTFN9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZWFsCi13aXRoIHN5bWJvbHMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLVJldHVybiBhIHNlbnNpYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIHdpbGwgYmUKLXJlcXVpcmVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cyByZXR1cm4gdGhlCi1hbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yIGFsbCB0aGUKLXN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbCBzeW1ib2wKLWluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfZ2V0X3N5bXRhYgotUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4KLQotQGl0ZW0gX21ha2VfZW1wdHlfc3ltYm9sCi1DcmVhdGUgYW4gZW1wdHkgc3ltYm9sIGZvciB0aGUgQkZELiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBtb3N0IHRhcmdldHMKLXN0b3JlIGV4dHJhIGluZm9ybWF0aW9uIHdpdGggZWFjaCBzeW1ib2wgYnkgYWxsb2NhdGluZyBhIHN0cnVjdHVyZQotbGFyZ2VyIHRoYW4gYW4gQHNhbXB7YXN5bWJvbH0gYW5kIHN0b3JpbmcgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGF0IHRoZQotZW5kLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSByaWdodCBhbW91bnQgb2YgbWVtb3J5LCBhbmQgcmV0dXJuCi13aGF0IGxvb2tzIGxpa2UgYSBwb2ludGVyIHRvIGFuIGVtcHR5IEBzYW1we2FzeW1ib2x9LiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfbWFrZV9lbXB0eV9zeW1ib2x9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfbWFrZV9lbXB0eV9zeW1ib2x9LgotCi1AaXRlbSBfcHJpbnRfc3ltYm9sCi1QcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfcHJpbnRfc3ltYm9sfS4gIE9uZSBvZiB0aGUgYXJndW1lbnRzIGluZGljYXRlcyB3aGF0IHNvcnQgb2YKLWluZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGJmZF9wcmludF9zeW1ib2xfbmFtZQotSnVzdCBwcmludCB0aGUgc3ltYm9sIG5hbWUuCi1AaXRlbSBiZmRfcHJpbnRfc3ltYm9sX21vcmUKLVByaW50IHRoZSBzeW1ib2wgbmFtZSBhbmQgc29tZSBpbnRlcmVzdGluZyBmbGFncy4gIEkgZG9uJ3QgdGhpbmsKLWFueXRoaW5nIGFjdHVhbGx5IHVzZXMgdGhpcy4KLUBpdGVtIGJmZF9wcmludF9zeW1ib2xfYWxsCi1QcmludCBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgdXNlZCBieSBAc2FtcHtvYmpkdW1wfQotd2hlbiBydW4gd2l0aCB0aGUgQHNhbXB7LXR9IG9wdGlvbi4KLUBlbmQgdGFibGUKLVRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3ByaW50X3N5bWJvbH0uCi0KLUBpdGVtIF9nZXRfc3ltYm9sX2luZm8KLVJldHVybiBhIHN0YW5kYXJkIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfc3ltYm9sX2luZm99LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X3N5bWJvbF9pbmZvfS4KLQotQGl0ZW0gX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi1SZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIHdvdWxkIG5vcm1hbGx5IHJlcHJlc2VudCB0aGUgbmFtZSBvZiBhCi1sb2NhbCBsYWJlbC4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfaXNfbG9jYWxfbGFiZWx9IGFuZAotQHNhbXB7YmZkX2lzX2xvY2FsX2xhYmVsX25hbWV9LiAgTG9jYWwgbGFiZWxzIGFyZSBub3JtYWxseSBkaXNjYXJkZWQgYnkKLXRoZSBhc3NlbWJsZXIuICBJbiB0aGUgbGlua2VyLCB0aGlzIGRlZmluZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLUBzYW1wey14fSBhbmQgQHNhbXB7LVh9IG9wdGlvbnMuCi0KLUBpdGVtIF9nZXRfbGluZW5vCi1SZXR1cm4gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwKLWZvciBhIENPRkYgdGFyZ2V0LiAgVGhpcyBpcyBjYWxsZWQgd2hlbiB3cml0aW5nIG91dCBDT0ZGIGxpbmUgbnVtYmVycy4KLQotQGl0ZW0gX2ZpbmRfbmVhcmVzdF9saW5lCi1HaXZlbiBhbiBhZGRyZXNzIHdpdGhpbiBhIHNlY3Rpb24sIHVzZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGZpbmQKLXRoZSBtYXRjaGluZyBmaWxlIG5hbWUsIGZ1bmN0aW9uIG5hbWUsIGFuZCBsaW5lIG51bWJlciwgaWYgYW55LiAgVGhpcyBpcwotY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluZF9uZWFyZXN0X2xpbmV9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZmluZF9uZWFyZXN0X2xpbmV9LgotCi1AaXRlbSBfYmZkX21ha2VfZGVidWdfc3ltYm9sCi1NYWtlIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBhIENPRkYgdGFyZ2V0LAotd2hlcmUgaXQgc2ltcGx5IHJldHVybnMgYSBzeW1ib2wgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW4gdGhlCi1Ac2FtcHtOX0RFQlVHfSBzZWN0aW9uIHdoZW4gaXQgaXMgd3JpdHRlbiBvdXQuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9tYWtlX2RlYnVnX3N5bWJvbH0uCi0KLUBpdGVtIF9yZWFkX21pbmlzeW1ib2xzCi1NaW5pc3ltYm9scyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgcHJvZ3JhbXMgbGlrZQotQHNhbXB7bm19LiAgQSBtaW5pc3ltYm9sIGlzIGEgY29va2llIHBvaW50aW5nIHRvIGludGVybmFsIHN5bWJvbAotaW5mb3JtYXRpb24gd2hpY2ggdGhlIGNhbGxlciBjYW4gdXNlIHRvIGV4dHJhY3QgY29tcGxldGUgc3ltYm9sCi1pbmZvcm1hdGlvbi4gIFRoaXMgcGVybWl0cyBCRkQgdG8gbm90IGNvbnZlcnQgYWxsIHRoZSBzeW1ib2xzIGludG8KLWdlbmVyaWMgZm9ybSwgYnV0IHRvIGluc3RlYWQgY29udmVydCB0aGVtIG9uZSBhdCBhIHRpbWUuICBUaGlzIGlzIGNhbGxlZAotdmlhIEBzYW1we2JmZF9yZWFkX21pbmlzeW1ib2xzfS4gIE1vc3QgdGFyZ2V0cyBkbyBub3QgaW1wbGVtZW50IHRoaXMsCi1hbmQganVzdCB1c2UgZ2VuZXJpYyBzdXBwb3J0IHdoaWNoIGlzIGJhc2VkIG9uIHVzaW5nIHN0YW5kYXJkCi1Ac2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmVzLgotCi1AaXRlbSBfbWluaXN5bWJvbF90b19zeW1ib2wKLUNvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgc3RhbmRhcmQgQHNhbXB7YXN5bWJvbH0uICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9taW5pc3ltYm9sX3RvX3N5bWJvbH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jcwotQHN1YnNlY3Rpb24gUmVsb2NhdGlvbiBzdXBwb3J0Ci1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggcmVsb2NhdGlvbnMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9yZWxvY191cHBlcl9ib3VuZAotUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQotcmVxdWlyZWQgdG8gcmVhZCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4gIEluIHByYWN0aWNlIG1vc3QKLXRhcmdldHMgcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXJlbGVudH0KLXBvaW50ZXJzIGZvciBhbGwgdGhlIHJlbG9jYXRpb25zIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kCi1zdG9yZSB0aGUgYWN0dWFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gQkZEIHByaXZhdGUgZGF0YS4gIFRoaXMgaXMKLWNhbGxlZCB2aWEgQHNhbXB7YmZkX2dldF9yZWxvY191cHBlcl9ib3VuZH0uCi0KLUBpdGVtIF9jYW5vbmljYWxpemVfcmVsb2MKLVJldHVybiB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX3JlbG9jfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvY30uCi0KLUBpdGVtIF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLUdpdmVuIGEgcmVsb2NhdGlvbiBjb2RlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgaG93dG8gc3RydWN0dXJlCi0oQHB4cmVme0JGRCByZWxvY2F0aW9uIGNvZGVzfSkuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciB3cml0ZQotQHN1YnNlY3Rpb24gT3V0cHV0IGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9XUklURX0KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1dSSVRFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCB3cml0aW5nIG91dCBhIEJGRC4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfc2V0X2FyY2hfbWFjaAotU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgbnVtYmVyIGZvciBhIEJGRC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3NldF9hcmNoX21hY2h9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCB0aGlzIGJ5IGNhbGxpbmcKLUBzYW1we2JmZF9kZWZhdWx0X3NldF9hcmNoX21hY2h9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2V0X2FyY2hfbWFjaH0uCi0KLUBpdGVtIF9zZXRfc2VjdGlvbl9jb250ZW50cwotV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGxpbmsKLUBzdWJzZWN0aW9uIExpbmtlciBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfTElOS30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0xJTkt9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlCi1saW5rZXIuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NpemVvZl9oZWFkZXJzCi1SZXR1cm4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgYSBCRkQuICBUaGlzIGlzCi11c2VkIHRvIGltcGxlbWVudCB0aGUgQHNhbXB7U0laRU9GX0hFQURFUlN9IGxpbmtlciBzY3JpcHQgZnVuY3Rpb24uICBJdAotaXMgbm9ybWFsbHkgdXNlZCB0byBhbGlnbiB0aGUgZmlyc3Qgc2VjdGlvbiBhdCBhbiBlZmZpY2llbnQgcG9zaXRpb24gb24KLXRoZSBwYWdlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9zaXplb2ZfaGVhZGVyc30uICBUaGUKLWNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfc2l6ZW9mX2hlYWRlcnN9LgotCi1AaXRlbSBfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGFuZCBhcHBseSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLVRoaXMgaGFuZGxlcyBib3RoIGEgZmluYWwgbGluayBhbmQgYSByZWxvY2F0ZWFibGUgbGluazsgaW4gdGhlIGxhdHRlcgotY2FzZSwgaXQgYWRqdXN0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFzIHdlbGwuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCBpdCBieQotY2FsbGluZyBAc2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LgotCi1AaXRlbSBfYmZkX3JlbGF4X3NlY3Rpb24KLVRyeSB0byB1c2UgcmVsYXhhdGlvbiB0byBzaHJpbmsgdGhlIHNpemUgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQKLWJ5IHRoZSBsaW5rZXIgd2hlbiB0aGUgQHNhbXB7LXJlbGF4fSBvcHRpb24gaXMgdXNlZC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3JlbGF4X3NlY3Rpb259LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0IGFueSBzb3J0IG9mCi1yZWxheGF0aW9uLgotCi1AaXRlbSBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLUNyZWF0ZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgdG8gdXNlIGZvciB0aGUgbGlua2VyLiAgVGhpcyBsaW5rZXIgaG9vawotcGVybWl0cyB0aGUgYmFja2VuZCB0byBjb250cm9sIHRoZSBzaXplIGFuZCBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudHMKLWluIHRoZSBsaW5rZXIgc3ltYm9sIGhhc2ggdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlfS4KLQotQGl0ZW0gX2JmZF9saW5rX2FkZF9zeW1ib2xzCi1HaXZlbiBhbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlLCBhZGQgYWxsIHN5bWJvbHMgaW50byB0aGUgbGlua2VyCi1zeW1ib2wgaGFzaCB0YWJsZS4gIFVzZSBjYWxsYmFja3MgdG8gdGhlIGxpbmtlciB0byBpbmNsdWRlIGFyY2hpdmUKLWVsZW1lbnRzIGluIHRoZSBsaW5rLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9saW5rX2FkZF9zeW1ib2xzfS4KLQotQGl0ZW0gX2JmZF9maW5hbF9saW5rCi1GaW5pc2ggdGhlIGxpbmtpbmcgcHJvY2Vzcy4gIFRoZSBsaW5rZXIgY2FsbHMgdGhpcyBob29rIGFmdGVyIGFsbCBvZiB0aGUKLWlucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLCB3aGVuIGl0IGlzIHJlYWR5IHRvIGZpbmlzaCB0aGUgbGluayBhbmQKLWdlbmVyYXRlIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluYWxfbGlua30uCi0KLUBpdGVtIF9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi1JIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIE5vdGhpbmcgc2VlbXMgdG8gY2FsbCBpdC4gIFRoZSBvbmx5Ci1ub24tdHJpdmlhbCBkZWZpbml0aW9uIGlzIGluIEBmaWxle3NvbS5jfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYwotQHN1YnNlY3Rpb24gRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9EWU5BTUlDfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfRFlOQU1JQ30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIHJlYWQKLWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cwotcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yCi1hbGwgdGhlIHN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbAotc3ltYm9sIGluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KLXRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kfS4KLQotQGl0ZW0gX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotUmVhZCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWJ9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFifS4KLQotQGl0ZW0gX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLiAgSW4gcHJhY3RpY2UgbW9zdCB0YXJnZXRzCi1yZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCBAc2FtcHthcmVsZW50fSBwb2ludGVycyBmb3IKLWFsbCB0aGUgcmVsb2NhdGlvbnMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlCi1hY3R1YWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KLXRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLVJlYWQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCBnZW5lcmF0ZWQgZmlsZXMKLUBzZWN0aW9uIEJGRCBnZW5lcmF0ZWQgZmlsZXMKLUBjaW5kZXggZ2VuZXJhdGVkIGZpbGVzIGluIGJmZAotQGNpbmRleCBiZmQgZ2VuZXJhdGVkIGZpbGVzCi0KLUJGRCBjb250YWlucyBzZXZlcmFsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzLiAgVGhpcyBzZWN0aW9uCi1kZXNjcmliZXMgdGhlbS4gIFNvbWUgZmlsZXMgYXJlIGNyZWF0ZWQgYXQgY29uZmlndXJlIHRpbWUsIHdoZW4geW91Ci1jb25maWd1cmUgQkZELiAgU29tZSBmaWxlcyBhcmUgY3JlYXRlZCBhdCBtYWtlIHRpbWUsIHdoZW4geW91IGJ1aWxkCi10aW1lLiAgU29tZSBmaWxlcyBhcmUgYXV0b21hdGljYWxseSByZWJ1aWx0IGF0IG1ha2UgdGltZSwgYnV0IG9ubHkgaWYKLXlvdSBjb25maWd1cmUgd2l0aCB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24uICBTb21lCi1maWxlcyBsaXZlIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LS0tdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHlvdSBydW4KLWNvbmZpZ3VyZS0tLWFuZCBzb21lIGxpdmUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBBbGwgZmlsZXMgdGhhdCBsaXZlCi1pbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgY2hlY2tlZCBpbnRvIHRoZSBDVlMgcmVwb3NpdG9yeS4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBiZmQuaAotQGNpbmRleCBAZmlsZXtiZmQuaH0KLUBjaW5kZXggQGZpbGV7YmZkLWluMy5ofQotTGl2ZXMgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnkuICBDcmVhdGVkIGF0IG1ha2UgdGltZSBmcm9tCi1AZmlsZXtiZmQtaW4yLmh9IHZpYSBAZmlsZXtiZmQtaW4zLmh9LiAgQGZpbGV7YmZkLWluMy5ofSBpcyBjcmVhdGVkIGF0Ci1jb25maWd1cmUgdGltZSBmcm9tIEBmaWxle2JmZC1pbjIuaH0uICBUaGVyZSBhcmUgYXV0b21hdGljIGRlcGVuZGVuY2llcwotdG8gcmVidWlsZCBAZmlsZXtiZmQtaW4zLmh9IGFuZCBoZW5jZSBAZmlsZXtiZmQuaH0gaWYgQGZpbGV7YmZkLWluMi5ofQotY2hhbmdlcywgc28geW91IGNhbiBub3JtYWxseSBpZ25vcmUgQGZpbGV7YmZkLWluMy5ofSwgYW5kIGp1c3QgdGhpbmsKLWFib3V0IEBmaWxle2JmZC1pbjIuaH0gYW5kIEBmaWxle2JmZC5ofS4KLQotQGZpbGV7YmZkLmh9IGlzIGJ1aWx0IGJ5IHJlcGxhY2luZyBhIGZldyBzdHJpbmdzIGluIEBmaWxle2JmZC1pbjIuaH0uCi1UbyBzZWUgdGhlbSwgc2VhcmNoIGZvciBAc2FtcHtAQH0gaW4gQGZpbGV7YmZkLWluMi5ofS4gIFRoZXkgbWFpbmx5Ci1jb250cm9sIHdoZXRoZXIgQkZEIGlzIGJ1aWx0IGZvciBhIDMyIGJpdCB0YXJnZXQgb3IgYSA2NCBiaXQgdGFyZ2V0LgotCi1AaXRlbSBiZmQtaW4yLmgKLUBjaW5kZXggQGZpbGV7YmZkLWluMi5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7YmZkLWluLmh9IGFuZCBzZXZlcmFsCi1vdGhlciBCRkQgc291cmNlIGZpbGVzLiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2JmZC1pbjIuaH0gaXMgcmVidWlsdAotYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KLQotQGl0ZW0gZWxmMzItdGFyZ2V0LmgKLUBpdGVteCBlbGY2NC10YXJnZXQuaAotQGNpbmRleCBAZmlsZXtlbGYzMi10YXJnZXQuaH0KLUBjaW5kZXggQGZpbGV7ZWxmNjQtdGFyZ2V0Lmh9Ci1MaXZlIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2VsZnh4LXRhcmdldC5ofS4KLVRoZXNlIGZpbGVzIGFyZSB2ZXJzaW9ucyBvZiBAZmlsZXtlbGZ4eC10YXJnZXQuaH0gY3VzdG9taXplZCBmb3IgZWl0aGVyCi1hIDMyIGJpdCBFTEYgdGFyZ2V0IG9yIGEgNjQgYml0IEVMRiB0YXJnZXQuCi0KLUBpdGVtIGxpYmJmZC5oCi1AY2luZGV4IEBmaWxle2xpYmJmZC5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7bGliYmZkLWluLmh9IGFuZAotc2V2ZXJhbCBvdGhlciBCRkQgc291cmNlIGZpbGVzLiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2xpYmJmZC5ofSBpcyByZWJ1aWx0Ci1hdXRvbWF0aWNhbGx5IHdoZW4gYSBzb3VyY2UgZmlsZSBjaGFuZ2VzLgotCi1AaXRlbSBsaWJjb2ZmLmgKLUBjaW5kZXggQGZpbGV7bGliY29mZi5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7bGliY29mZi1pbi5ofSBhbmQKLUBmaWxle2NvZmZjb2RlLmh9LiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2xpYmNvZmYuaH0gaXMgcmVidWlsdAotYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KLQotQGl0ZW0gdGFyZ21hdGNoLmgKLUBjaW5kZXggQGZpbGV7dGFyZ21hdGNoLmh9Ci1MaXZlcyBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS4gIENyZWF0ZWQgYXQgbWFrZSB0aW1lIGZyb20KLUBmaWxle2NvbmZpZy5iZmR9LiAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gbWFwIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgaW50bwotQkZEIHRhcmdldCB2ZWN0b3IgdmFyaWFibGUgbmFtZXMgYXQgcnVuIHRpbWUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCBtdWx0aXBsZSBjb21waWxhdGlvbnMKLUBzZWN0aW9uIEZpbGVzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGluIEJGRAotU2V2ZXJhbCBmaWxlcyBpbiBCRkQgYXJlIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLiAgQnkgdGhpcyBJIG1lYW4gdGhhdAotdGhlcmUgYXJlIGhlYWRlciBmaWxlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgVGhlc2UgaGVhZGVyCi1maWxlcyBhcmUgaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMsIGFuZCB0aHVzIHRoZSBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkCi1vbmNlIHBlciBmaWxlIHdoaWNoIGluY2x1ZGVzIHRoZW0uCi0KLVByZXByb2Nlc3NvciBtYWNyb3MgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgY29tcGlsYXRpb24sIHNvIHRoYXQgZWFjaAotdGltZSB0aGUgZmlsZXMgYXJlIGNvbXBpbGVkIHRoZSByZXN1bHRpbmcgZnVuY3Rpb25zIGFyZSBzbGlnaHRseQotZGlmZmVyZW50LiAgTmF0dXJhbGx5LCBpZiB0aGV5IHdlcmVuJ3QgZGlmZmVyZW50LCB0aGVyZSB3b3VsZCBiZSBubwotcmVhc29uIHRvIGNvbXBpbGUgdGhlbSBtdWx0aXBsZSB0aW1lcy4KLQotVGhpcyBpcyBhIG5vdCBhIHBhcnRpY3VsYXJseSBnb29kIHByb2dyYW1taW5nIHRlY2huaXF1ZSwgYW5kIGZ1dHVyZSBCRkQKLXdvcmsgc2hvdWxkIGF2b2lkIGl0LgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotU2luY2UgdGhpcyB0ZWNobmlxdWUgaXMgcmFyZWx5IHVzZWQsIGV2ZW4gZXhwZXJpZW5jZWQgQyBwcm9ncmFtbWVycyBmaW5kCi1pdCBjb25mdXNpbmcuCi0KLUBpdGVtCi1JdCBpcyBkaWZmaWN1bHQgdG8gZGVidWcgcHJvZ3JhbXMgd2hpY2ggdXNlIEJGRCwgc2luY2UgdGhlcmUgaXMgbm8gd2F5Ci10byBkZXNjcmliZSB3aGljaCB2ZXJzaW9uIG9mIGEgcGFydGljdWxhciBmdW5jdGlvbiB5b3UgYXJlIGxvb2tpbmcgYXQuCi0KLUBpdGVtCi1Qcm9ncmFtcyB3aGljaCB1c2UgQkZEIHdpbmQgdXAgaW5jb3Jwb3JhdGluZyB0d28gb3IgbW9yZSBzbGlnaHRseQotZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLCB3aGljaCB3YXN0ZXMgc3BhY2UgaW4gdGhlCi1leGVjdXRhYmxlLgotCi1AaXRlbQotVGhpcyB0ZWNobmlxdWUgaXMgbmV2ZXIgcmVxdWlyZWQgbm9yIGlzIGl0IGVzcGVjaWFsbHkgZWZmaWNpZW50LiAgSXQgaXMKLWFsd2F5cyBwb3NzaWJsZSB0byB1c2Ugc3RhdGljYWxseSBpbml0aWFsaXplZCBzdHJ1Y3R1cmVzIGhvbGRpbmcKLWZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBtYWdpYyBjb25zdGFudHMgaW5zdGVhZC4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGFvdXQtdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7YW91dC10YXJnZXQuaH0KLURlc2NyaWJlcyBhIGZldyBmdW5jdGlvbnMgYW5kIHRoZSB0YXJnZXQgdmVjdG9yIGZvciBhLm91dCB0YXJnZXRzLiAgVGhpcwotaXMgdXNlZCBieSBpbmRpdmlkdWFsIGEub3V0IHRhcmdldHMgd2l0aCBkaWZmZXJlbnQgZGVmaW5pdGlvbnMgb2YKLUBzYW1we05fVFhUQUREUn0gYW5kIHNpbWlsYXIgYS5vdXQgbWFjcm9zLgotCi1AaXRlbSBhb3V0ZjEuaAotQGNpbmRleCBAZmlsZXthb3V0ZjEuaH0KLUltcGxlbWVudHMgc3RhbmRhcmQgU3VuT1MgYS5vdXQgZmlsZXMuICBJbiBwcmluY2lwbGUgaXQgc3VwcG9ydHMgNjQgYml0Ci1hLm91dCB0YXJnZXRzIGJhc2VkIG9uIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gQHNhbXB7QVJDSF9TSVpFfSwgYnV0Ci1zaW5jZSBhbGwga25vd24gYS5vdXQgdGFyZ2V0cyBhcmUgMzIgYml0cywgdGhpcyBjb2RlIG1heSBvciBtYXkgbm90Ci13b3JrLiAgVGhpcyBmaWxlIGlzIG9ubHkgaW5jbHVkZWQgYnkgYSBmZXcgb3RoZXIgZmlsZXMsIGFuZCBpdCBpcwotZGlmZmljdWx0IHRvIGp1c3RpZnkgaXRzIGV4aXN0ZW5jZS4KLQotQGl0ZW0gYW91dHguaAotQGNpbmRleCBAZmlsZXthb3V0eC5ofQotSW1wbGVtZW50cyBiYXNpYyBhLm91dCBzdXBwb3J0IHJvdXRpbmVzLiAgVGhpcyBmaWxlIGNhbiBiZSBjb21waWxlZCBmb3IKLWVpdGhlciAzMiBvciA2NCBiaXQgc3VwcG9ydC4gIFNpbmNlIGFsbCBrbm93biBhLm91dCB0YXJnZXRzIGFyZSAzMiBiaXRzLAotdGhlIDY0IGJpdCBzdXBwb3J0IG1heSBvciBtYXkgbm90IHdvcmsuICBJIGJlbGlldmUgdGhlIG9yaWdpbmFsCi1pbnRlbnRpb24gd2FzIHRoYXQgdGhpcyBmaWxlIHdvdWxkIG9ubHkgYmUgaW5jbHVkZWQgYnkgQHNhbXB7YW91dDMyLmN9Ci1hbmQgQHNhbXB7YW91dDY0LmN9LCBhbmQgdGhhdCBvdGhlciBhLm91dCB0YXJnZXRzIHdvdWxkIHNpbXBseSByZWZlciB0bwotdGhlIGZ1bmN0aW9ucyBpdCBkZWZpbmVkLiAgVW5mb3J0dW5hdGVseSwgc29tZSBvdGhlciBhLm91dCB0YXJnZXRzCi1zdGFydGVkIGluY2x1ZGluZyBpdCBkaXJlY3RseSwgbGVhZGluZyB0byBhIHNvbWV3aGF0IGNvbmZ1c2VkIHN0YXRlIG9mCi1hZmZhaXJzLgotCi1AaXRlbSBjb2ZmY29kZS5oCi1AY2luZGV4IEBmaWxle2NvZmZjb2RlLmh9Ci1JbXBsZW1lbnRzIGJhc2ljIENPRkYgc3VwcG9ydCByb3V0aW5lcy4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBldmVyeQotQ09GRiB0YXJnZXQuICBJdCBpbXBsZW1lbnRzIGNvZGUgd2hpY2ggaGFuZGxlcyBDT0ZGIG1hZ2ljIG51bWJlcnMgYXMKLXdlbGwgYXMgdmFyaW91cyBob29rIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIGdlbmVyaWMgQ09GRiBmdW5jdGlvbnMgaW4KLUBmaWxle2NvZmZnZW4uY30uICBUaGlzIGZpbGUgaXMgY29udHJvbGxlZCBieSBhIG51bWJlciBvZiBkaWZmZXJlbnQKLW1hY3JvcywgYW5kIG1vcmUgYXJlIGFkZGVkIHJlZ3VsYXJseS4KLQotQGl0ZW0gY29mZnN3YXAuaAotQGNpbmRleCBAZmlsZXtjb2Zmc3dhcC5ofQotSW1wbGVtZW50cyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5Ci1AZmlsZXtjb2ZmY29kZS5ofSwgYW5kIHRodXMgYnkgZXZlcnkgQ09GRiB0YXJnZXQuICBJdCBpbXBsZW1lbnRzIHRoZQotcm91dGluZXMgd2hpY2ggc3dhcCBDT0ZGIHN0cnVjdHVyZXMgYmV0d2VlbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwKLWZvcm1hdC4gIFRoZSBtYWluIGNvbnRyb2wgZm9yIHRoaXMgZmlsZSBpcyB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlCi1kZWZpbml0aW9ucyBpbiB0aGUgZmlsZXMgaW4gdGhlIEBmaWxle2luY2x1ZGUvY29mZn0gZGlyZWN0b3J5LiAgQSBDT0ZGCi10YXJnZXQgZmlsZSB3aWxsIGluY2x1ZGUgb25lIG9mIHRob3NlIGZpbGVzIGJlZm9yZSBpbmNsdWRpbmcKLUBmaWxle2NvZmZjb2RlLmh9IGFuZCB0aHVzIEBmaWxle2NvZmZzd2FwLmh9LiAgVGhlcmUgYXJlIGEgZmV3IG90aGVyCi1tYWNyb3Mgd2hpY2ggYWZmZWN0IEBmaWxle2NvZmZzd2FwLmh9IGFzIHdlbGwsIG1vc3RseSBkZXNjcmliaW5nIHdoZXRoZXIKLWNlcnRhaW4gZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmVzLgotCi1AaXRlbSBlY29mZnN3YXAuaAotQGNpbmRleCBAZmlsZXtlY29mZnN3YXAuaH0KLUltcGxlbWVudHMgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGlzIGlzIGxpa2UgQGZpbGV7Y29mZnN3YXAuaH0sIGJ1dAotZm9yIEVDT0ZGLiAgSXQgaXMgaW5jbHVkZWQgYnkgdGhlIEVDT0ZGIHRhcmdldCBmaWxlcyAob2Ygd2hpY2ggdGhlcmUgYXJlCi1vbmx5IHR3bykuICBUaGUgY29udHJvbCBpcyB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIEBzYW1we0VDT0ZGXzMyfSBvcgotQHNhbXB7RUNPRkZfNjR9LgotCi1AaXRlbSBlbGZjb2RlLmgKLUBjaW5kZXggQGZpbGV7ZWxmY29kZS5ofQotSW1wbGVtZW50cyBFTEYgZnVuY3Rpb25zIHRoYXQgdXNlIGV4dGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gIFRoaXMKLWZpbGUgaXMgaW5jbHVkZWQgYnkgdHdvIG90aGVyIGZpbGVzOiBAZmlsZXtlbGYzMi5jfSBhbmQgQGZpbGV7ZWxmNjQuY30uCi1JdCBpcyBjb250cm9sbGVkIGJ5IHRoZSBAc2FtcHtBUkNIX1NJWkV9IG1hY3JvIHdoaWNoIGlzIGRlZmluZWQgdG8gYmUKLUBzYW1wezMyfSBvciBAc2FtcHs2NH0gYmVmb3JlIGluY2x1ZGluZyBpdC4gIFRoZSBAc2FtcHtOQU1FfSBtYWNybyBpcwotdXNlZCBpbnRlcm5hbGx5IHRvIGdpdmUgdGhlIGZ1bmN0aW9ucyBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSB0d28gdGFyZ2V0Ci1zaXplcy4KLQotQGl0ZW0gZWxmY29yZS5oCi1AY2luZGV4IEBmaWxle2VsZmNvcmUuaH0KLUxpa2UgQGZpbGV7ZWxmY29kZS5ofSwgYnV0IGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gRUxGIGNvcmUKLWZpbGVzLiAgVGhpcyBpcyBpbmNsdWRlZCBvbmx5IGJ5IEBmaWxle2VsZmNvZGUuaH0uCi0KLUBpdGVtIGVsZmxpbmsuaAotQGNpbmRleCBAZmlsZXtlbGZsaW5rLmh9Ci1MaWtlIEBmaWxle2VsZmNvZGUuaH0sIGJ1dCBmb3IgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEVMRiBsaW5rZXIuICBUaGlzCi1pcyBpbmNsdWRlZCBvbmx5IGJ5IEBmaWxle2VsZmNvZGUuaH0uCi0KLUBpdGVtIGVsZnh4LXRhcmdldC5oCi1AY2luZGV4IEBmaWxle2VsZnh4LXRhcmdldC5ofQotVGhpcyBmaWxlIGlzIHRoZSBzb3VyY2UgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZXMgQGZpbGV7ZWxmMzItdGFyZ2V0Lmh9Ci1hbmQgQGZpbGV7ZWxmNjQtdGFyZ2V0Lmh9LCBvbmUgb2Ygd2hpY2ggaXMgaW5jbHVkZWQgYnkgZXZlcnkgRUxGIHRhcmdldC4KLUl0IGRlZmluZXMgdGhlIEVMRiB0YXJnZXQgdmVjdG9yLgotCi1AaXRlbSBmcmVlYnNkLmgKLUBjaW5kZXggQGZpbGV7ZnJlZWJzZC5ofQotUHJlc3VtYWJseSBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBhbGwgRnJlZUJTRCB0YXJnZXRzLCBidXQgaW4gZmFjdAotdGhlcmUgaXMgb25seSBvbmUgc3VjaCB0YXJnZXQsIEBzYW1we2kzODYtZnJlZWJzZH0uICBUaGlzIGRlZmluZXMgYQotZnVuY3Rpb24gdXNlZCB0byBzZXQgdGhlIHJpZ2h0IG1hZ2ljIG51bWJlciBmb3IgRnJlZUJTRCwgYXMgd2VsbCBhcwotdmFyaW91cyBtYWNyb3MsIGFuZCBpbmNsdWRlcyBAZmlsZXthb3V0LXRhcmdldC5ofS4KLQotQGl0ZW0gbmV0YnNkLmgKLUBjaW5kZXggQGZpbGV7bmV0YnNkLmh9Ci1MaWtlIEBmaWxle2ZyZWVic2QuaH0sIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsIGZpbGVzIHdoaWNoIGluY2x1ZGUKLWl0LgotCi1AaXRlbSBubG0tdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7bmxtLXRhcmdldC5ofQotRGVmaW5lcyB0aGUgdGFyZ2V0IHZlY3RvciBmb3IgYSBzdGFuZGFyZCBOTE0gdGFyZ2V0LgotCi1AaXRlbSBubG1jb2RlLmgKLUBjaW5kZXggQGZpbGV7bmxtY29kZS5ofQotTGlrZSBAZmlsZXtlbGZjb2RlLmh9LCBidXQgZm9yIE5MTSB0YXJnZXRzLiAgVGhpcyBpcyBvbmx5IGluY2x1ZGVkIGJ5Ci1AZmlsZXtubG0zMi5jfSBhbmQgQGZpbGV7bmxtNjQuY30sIGJvdGggb2Ygd2hpY2ggZGVmaW5lIHRoZSBtYWNybwotQHNhbXB7QVJDSF9TSVpFfSB0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gIFRoZXJlIGFyZSBubyA2NCBiaXQgTkxNCi10YXJnZXRzIGFueWhvdywgc28gdGhpcyBpcyBzb3J0IG9mIHVzZWxlc3MuCi0KLUBpdGVtIG5sbXN3YXAuaAotQGNpbmRleCBAZmlsZXtubG1zd2FwLmh9Ci1MaWtlIEBmaWxle2NvZmZzd2FwLmh9LCBidXQgZm9yIE5MTSB0YXJnZXRzLiAgVGhpcyBpcyBpbmNsdWRlZCBieSBlYWNoCi1OTE0gdGFyZ2V0LCBidXQgSSB0aGluayBpdCB3aW5kcyB1cCBjb21waWxpbmcgdG8gdGhlIGV4YWN0IHNhbWUgY29kZSBmb3IKLWV2ZXJ5IHRhcmdldCwgYW5kIGFzIHN1Y2ggaXMgZmFpcmx5IHVzZWxlc3MuCi0KLUBpdGVtIHBlaWNvZGUuaAotQGNpbmRleCBAZmlsZXtwZWljb2RlLmh9Ci1Qcm92aWRlcyBzd2FwcGluZyByb3V0aW5lcyBhbmQgb3RoZXIgaG9va3MgZm9yIFBFIHRhcmdldHMuCi1AZmlsZXtjb2ZmY29kZS5ofSB3aWxsIGluY2x1ZGUgdGhpcyByYXRoZXIgdGhhbiBAZmlsZXtjb2Zmc3dhcC5ofSBmb3IgYQotUEUgdGFyZ2V0LiAgVGhpcyBkZWZpbmVzIFBFIHNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBDT0ZGIHN3YXBwaW5nCi1yb3V0aW5lcywgYW5kIGFsc28gZGVmaW5lcyBzb21lIG1hY3JvcyB3aGljaCBjb250cm9sIEBmaWxle2NvZmZjb2RlLmh9Ci1pdHNlbGYuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nCi1Ac2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBoYW5kbGluZwotQGNpbmRleCBiZmQgcmVsb2NhdGlvbiBoYW5kbGluZwotQGNpbmRleCByZWxvY2F0aW9ucyBpbiBiZmQKLQotVGhlIGhhbmRsaW5nIG9mIHJlbG9jYXRpb25zIGlzIG9uZSBvZiB0aGUgbW9yZSBjb25mdXNpbmcgYXNwZWN0cyBvZiBCRkQuCi1SZWxvY2F0aW9uIGhhbmRsaW5nIGhhcyBiZWVuIGltcGxlbWVudGVkIGluIHZhcmlvdXMgZGlmZmVyZW50IHdheXMsIGFsbAotc29tZXdoYXQgaW5jb21wYXRpYmxlLCBub25lIHBlcmZlY3QuCi0KLUBtZW51Ci0qIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzOjoJQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKLSogQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zOjoJQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCi0qIEJGRCByZWxvY2F0aW9uIGNvZGVzOjoJQkZEIHJlbG9jYXRpb24gY29kZXMKLSogQkZEIHJlbG9jYXRpb24gZnV0dXJlOjoJQkZEIHJlbG9jYXRpb24gZnV0dXJlCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKLUBzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzCi0KLUEgcmVsb2NhdGlvbiBpcyBhbiBhY3Rpb24gd2hpY2ggdGhlIGxpbmtlciBtdXN0IHRha2Ugd2hlbiBsaW5raW5nLiAgSXQKLWRlc2NyaWJlcyBhIGNoYW5nZSB0byB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhlIGNoYW5nZSBpcyBub3JtYWxseQotYmFzZWQgb24gdGhlIGZpbmFsIHZhbHVlIG9mIG9uZSBvciBtb3JlIHN5bWJvbHMuICBSZWxvY2F0aW9ucyBhcmUKLWNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGNyZWF0ZXMgYW4gb2JqZWN0IGZpbGUuCi0KLU1vc3QgcmVsb2NhdGlvbnMgYXJlIHNpbXBsZS4gIEEgdHlwaWNhbCBzaW1wbGUgcmVsb2NhdGlvbiBpcyB0byBzZXQgMzIKLWJpdHMgYXQgYSBnaXZlbiBvZmZzZXQgaW4gYSBzZWN0aW9uIHRvIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gIFRoaXMgdHlwZQotb2YgcmVsb2NhdGlvbiB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIGNvZGUgbGlrZSBAY29kZXtpbnQgKnAgPSAmaTt9IHdoZXJlCi1Ac2FtcHtwfSBhbmQgQHNhbXB7aX0gYXJlIGdsb2JhbCB2YXJpYWJsZXMuICBBIHJlbG9jYXRpb24gZm9yIHRoZSBzeW1ib2wKLUBzYW1we2l9IHdvdWxkIGJlIGdlbmVyYXRlZCBzdWNoIHRoYXQgdGhlIGxpbmtlciB3b3VsZCBpbml0aWFsaXplIHRoZQotYXJlYSBvZiBtZW1vcnkgd2hpY2ggaG9sZHMgdGhlIHZhbHVlIG9mIEBzYW1we3B9IHRvIHRoZSB2YWx1ZSBvZiB0aGUKLXN5bWJvbCBAc2FtcHtpfS4KLQotU2xpZ2h0bHkgbW9yZSBjb21wbGV4IHJlbG9jYXRpb25zIG1heSBpbmNsdWRlIGFuIGFkZGVuZCwgd2hpY2ggaXMgYQotY29uc3RhbnQgdG8gYWRkIHRvIHRoZSBzeW1ib2wgdmFsdWUgYmVmb3JlIHVzaW5nIGl0LiAgSW4gc29tZSBjYXNlcyBhCi1yZWxvY2F0aW9uIHdpbGwgcmVxdWlyZSBhZGRpbmcgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUgZXhpc3RpbmcgY29udGVudHMKLW9mIHRoZSBzZWN0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4gIEluIG90aGVycyB0aGUgcmVsb2NhdGlvbiB3aWxsIHNpbXBseQotcmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgc3ltYm9sIHZhbHVlLiAgU29tZQotcmVsb2NhdGlvbnMgYXJlIFBDIHJlbGF0aXZlLCBzbyB0aGF0IHRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1zZWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGFuZCB0aGUgZmluYWwKLWFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGVudHMuCi0KLUluIGdlbmVyYWwsIHJlbG9jYXRpb25zIGNhbiBiZSBhcmJpdHJhcmlseSBjb21wbGV4LiAgRm9yIGV4YW1wbGUsCi1yZWxvY2F0aW9ucyB1c2VkIGluIGR5bmFtaWMgbGlua2luZyBzeXN0ZW1zIG9mdGVuIHJlcXVpcmUgdGhlIGxpbmtlciB0bwotYWxsb2NhdGUgc3BhY2UgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiBhbmQgdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoYXQKLXNlY3Rpb24gYXMgdGhlIHZhbHVlIHRvIHN0b3JlLiAgSW4gdGhlIElFRUUgb2JqZWN0IGZpbGUgZm9ybWF0LAotcmVsb2NhdGlvbnMgbWF5IGludm9sdmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zLgotCi1XaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZSBsaW5rZXIgbWF5IG9yIG1heSBub3QgaGF2ZSB0byBkbwotYW55dGhpbmcgd2l0aCBhIHJlbG9jYXRpb24sIGRlcGVuZGluZyB1cG9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotcmVsb2NhdGlvbi4gIFNpbXBsZSByZWxvY2F0aW9ucyBnZW5lcmFsbHkgZG8gbm90IHJlcXVpcmUgYW55IHNwZWNpYWwKLWFjdGlvbi4KLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCi1Ac3Vic2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBmdW5jdGlvbnMKLQotSW4gQkZELCBlYWNoIHNlY3Rpb24gaGFzIGFuIGFycmF5IG9mIEBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZXMuICBFYWNoCi1zdHJ1Y3R1cmUgaGFzIGEgcG9pbnRlciB0byBhIHN5bWJvbCwgYW4gYWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24sIGFuCi1hZGRlbmQsIGFuZCBhIHBvaW50ZXIgdG8gYSBAc2FtcHtyZWxvY19ob3d0b19zdHJ1Y3R9IHN0cnVjdHVyZS4gIFRoZQotaG93dG8gc3RydWN0dXJlIGhhcyBhIGJ1bmNoIG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSByZWxvYywgaW5jbHVkaW5nIGEKLXR5cGUgZmllbGQuICBUaGUgdHlwZSBmaWVsZCBpcyBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci1iYWNrZW5kOyBub25lIG9mIHRoZSBnZW5lcmljIGNvZGUgaW4gQkZEIGV4YW1pbmVzIGl0LgotCi1PcmlnaW5hbGx5LCB0aGUgZnVuY3Rpb24gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gd2FzIHN1cHBvc2VkIHRvCi1oYW5kbGUgYWxsIHJlbG9jYXRpb25zLiAgSW4gdGhlb3J5LCBtYW55IHJlbG9jYXRpb25zIHdvdWxkIGJlIHNpbXBsZQotZW5vdWdoIHRvIGJlIGRlc2NyaWJlZCBieSB0aGUgZmllbGRzIGluIHRoZSBob3d0byBzdHJ1Y3R1cmUuICBGb3IgdGhvc2UKLXRoYXQgd2VyZW4ndCwgdGhlIGhvd3RvIHN0cnVjdHVyZSBpbmNsdWRlZCBhIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259Ci1maWVsZCB0byB1c2UgYXMgYW4gZXNjYXBlLgotCi1XaGlsZSB0aGlzIHNlZW1zIHBsYXVzaWJsZSwgYSBsb29rIGF0IEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259Ci1zaG93cyB0aGF0IGl0IGZhaWxlZC4gIFRoZSBmdW5jdGlvbiBoYXMgb2RkIHNwZWNpYWwgY2FzZXMuICBTb21lIG9mIHRoZQotZmllbGRzIGluIHRoZSBob3d0byBzdHJ1Y3R1cmUsIHN1Y2ggYXMgQHNhbXB7cGNyZWxfb2Zmc2V0fSwgd2VyZSBub3QKLWFkZXF1YXRlbHkgZG9jdW1lbnRlZC4KLQotVGhlIGxpbmtlciB1c2VzIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHRvIGRvIGFsbCByZWxvY2F0aW9ucyB3aGVuCi10aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlIGhhdmUgZGlmZmVyZW50IGZvcm1hdHMgKGUuZy4sIHdoZW4gZ2VuZXJhdGluZwotUy1yZWNvcmRzKS4gIFRoZSBnZW5lcmljIGxpbmtlciBjb2RlLCB3aGljaCBpcyB1c2VkIGJ5IGFsbCB0YXJnZXRzIHdoaWNoCi1kbyBub3QgZGVmaW5lIHRoZWlyIG93biBzcGVjaWFsIHB1cnBvc2UgbGlua2VyLCB1c2VzCi1Ac2FtcHtiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSwgd2hpY2ggZm9yIG1vc3QgdGFyZ2V0cyB0dXJucwotaW50byBhIGNhbGwgdG8gQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSwgd2hpY2gKLWNhbGxzIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LiAgU28gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0KLWlzIHN0aWxsIHdpZGVseSB1c2VkLCB3aGljaCBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gY2hhbmdlLCBzaW5jZSBpdCBpcwotZGlmZmljdWx0IHRvIHRlc3QgYWxsIHBvc3NpYmxlIGNhc2VzLgotCi1UaGUgYXNzZW1ibGVyIHVzZWQgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gZm9yIGEgd2hpbGUuICBUaGlzCi10dXJuZWQgb3V0IHRvIGJlIHRoZSB3cm9uZyB0aGluZyB0byBkbywgc2luY2UKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHdhcyB3cml0dGVuIHRvIGhhbmRsZSByZWxvY2F0aW9ucyBvbiBhbgotZXhpc3Rpbmcgb2JqZWN0IGZpbGUsIHdoaWxlIHRoZSBhc3NlbWJsZXIgbmVlZGVkIHRvIGNyZWF0ZSByZWxvY2F0aW9ucwotaW4gYSBuZXcgb2JqZWN0IGZpbGUuICBUaGUgYXNzZW1ibGVyIHdhcyBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IGZ1bmN0aW9uCi1Ac2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSBpbnN0ZWFkLCBhbmQgQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0KLXdhcyBjcmVhdGVkIGFzIGEgY29weSBvZiBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufS4KLQotVW5mb3J0dW5hdGVseSwgdGhlIHdvcmsgZGlkIG5vdCBwcm9ncmVzcyBhbnkgZmFydGhlciwgc28KLUBzYW1we2JmZF9pbnN0YWxsX3JlbG9jYXRpb259IHJlbWFpbnMgYSBzaW1wbGUgY29weSBvZgotQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0sIHdpdGggYWxsIHRoZSBvZGQgc3BlY2lhbCBjYXNlcyBhbmQKLWNvbmZ1c2luZyBjb2RlLiAgVGhpcyBhZ2FpbiBpcyBkaWZmaWN1bHQgdG8gY2hhbmdlLCBiZWNhdXNlIGFnYWluIGFueQotY2hhbmdlIGNhbiBhZmZlY3QgYW55IGFzc2VtYmxlciB0YXJnZXQsIGFuZCBzbyBpcyBkaWZmaWN1bHQgdG8gdGVzdC4KLQotVGhlIG5ldyBsaW5rZXIsIHdoZW4gdXNpbmcgdGhlIHNhbWUgb2JqZWN0IGZpbGUgZm9ybWF0IGZvciBhbGwgaW5wdXQKLWZpbGVzIGFuZCB0aGUgb3V0cHV0IGZpbGUsIGRvZXMgbm90IGNvbnZlcnQgcmVsb2NhdGlvbnMgaW50bwotQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcywgc28gaXQgY2FuIG5vdCB1c2UKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IGF0IGFsbC4gIEluc3RlYWQsIHVzZXJzIG9mIHRoZSBuZXcgbGlua2VyCi1hcmUgZXhwZWN0ZWQgdG8gd3JpdGUgYSBAc2FtcHtyZWxvY2F0ZV9zZWN0aW9ufSBmdW5jdGlvbiB3aGljaCB3aWxsCi1oYW5kbGUgcmVsb2NhdGlvbnMgaW4gYSB0YXJnZXQgc3BlY2lmaWMgZmFzaGlvbi4KLQotVGhlcmUgYXJlIHR3byBoZWxwZXIgZnVuY3Rpb25zIGZvciB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbjoKLUBzYW1we19iZmRfZmluYWxfbGlua19yZWxvY2F0ZX0gYW5kIEBzYW1we19iZmRfcmVsb2NhdGVfY29udGVudHN9LgotVGhlc2UgZnVuY3Rpb25zIHVzZSBhIGhvd3RvIHN0cnVjdHVyZSwgYnV0IHRoZXkgQGVtcGh7ZG8gbm90fSB1c2UgdGhlCi1Ac2FtcHtzcGVjaWFsX2Z1bmN0aW9ufSBmaWVsZC4gIFNpbmNlIHRoZSBmdW5jdGlvbnMgYXJlIG5vcm1hbGx5IGNhbGxlZAotZnJvbSB0YXJnZXQgc3BlY2lmaWMgY29kZSwgdGhlIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkIGFkZHMKLWxpdHRsZTsgYW55IHJlbG9jYXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBjYW4gYmUgaGFuZGxlZAotd2l0aG91dCBjYWxsaW5nIHRob3NlIGZ1bmN0aW9ucy4KLQotU28sIGlmIHlvdSB3YW50IHRvIGFkZCBhIG5ldyB0YXJnZXQsIG9yIGFkZCBhIG5ldyByZWxvY2F0aW9uIHRvIGFuCi1leGlzdGluZyB0YXJnZXQsIHlvdSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1NYWtlIHN1cmUgeW91IGNsZWFybHkgdW5kZXJzdGFuZCB3aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBzaG91bGQKLWxvb2sgbGlrZSBhZnRlciBhc3NlbWJseSwgYWZ0ZXIgYSByZWxvY2F0ZWFibGUgbGluaywgYW5kIGFmdGVyIGEgZmluYWwKLWxpbmsuICBNYWtlIHN1cmUgeW91IGNsZWFybHkgdW5kZXJzdGFuZCB0aGUgb3BlcmF0aW9ucyB0aGUgbGlua2VyIG11c3QKLXBlcmZvcm0gZHVyaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsgYW5kIGR1cmluZyBhIGZpbmFsIGxpbmsuCi0KLUBpdGVtCi1Xcml0ZSBhIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlIHJlbG9jYXRpb24uICBUaGUgaG93dG8gc3RydWN0dXJlIGlzCi1mbGV4aWJsZSBlbm91Z2ggdG8gcmVwcmVzZW50IGFueSByZWxvY2F0aW9uIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGJ5Ci1zZXR0aW5nIGEgY29udGlndW91cyBiaXRmaWVsZCBpbiB0aGUgZGVzdGluYXRpb24gdG8gdGhlIHZhbHVlIG9mIGEKLXN5bWJvbCwgcG9zc2libHkgd2l0aCBhbiBhZGRlbmQsIHBvc3NpYmx5IGFkZGluZyB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotdmFsdWUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkZXN0aW5hdGlvbi4KLQotQGl0ZW0KLUNoYW5nZSB0aGUgYXNzZW1ibGVyIHRvIGdlbmVyYXRlIHlvdXIgcmVsb2NhdGlvbi4gIFRoZSBhc3NlbWJsZXIgd2lsbAotY2FsbCBAc2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSwgc28geW91ciBob3d0byBzdHJ1Y3R1cmUgaGFzIHRvIGJlCi1hYmxlIHRvIGhhbmRsZSB0aGF0LiAgWW91IG1heSBuZWVkIHRvIHNldCB0aGUgQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0KLWZpZWxkIHRvIGhhbmRsZSBhc3NlbWJseSBjb3JyZWN0bHkuICBCZSBjYXJlZnVsIHRvIGVuc3VyZSB0aGF0IGFueSBjb2RlCi15b3Ugd3JpdGUgdG8gaGFuZGxlIHRoZSBhc3NlbWJsZXIgd2lsbCBhbHNvIHdvcmsgY29ycmVjdGx5IHdoZW4gZG9pbmcgYQotcmVsb2NhdGVhYmxlIGxpbmsuICBGb3IgZXhhbXBsZSwgc2VlIEBzYW1we2JmZF9lbGZfZ2VuZXJpY19yZWxvY30uCi0KLUBpdGVtCi1UZXN0IHRoZSBhc3NlbWJsZXIuICBDb25zaWRlciB0aGUgY2FzZXMgb2YgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuCi11bmRlZmluZWQgc3ltYm9sLCBhIGNvbW1vbiBzeW1ib2wsIGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlIG9iamVjdCBmaWxlCi1pbiB0aGUgc2FtZSBzZWN0aW9uLCBhbmQgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUgaW4gYQotZGlmZmVyZW50IHNlY3Rpb24uICBUaGVzZSBjYXNlcyBtYXkgbm90IGFsbCBiZSBhcHBsaWNhYmxlIGZvciB5b3VyCi1yZWxvYy4KLQotQGl0ZW0KLUlmIHlvdXIgdGFyZ2V0IHVzZXMgdGhlIG5ldyBsaW5rZXIsIHdoaWNoIGlzIHJlY29tbWVuZGVkLCBhZGQgYW55Ci1yZXF1aXJlZCBoYW5kbGluZyB0byB0aGUgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb24gZnVuY3Rpb24uICBJbiBzaW1wbGUKLWNhc2VzIHRoaXMgd2lsbCBqdXN0IGludm9sdmUgYSBjYWxsIHRvIEBzYW1we19iZmRfZmluYWxfbGlua19yZWxvY2F0ZX0KLW9yIEBzYW1we19iZmRfcmVsb2NhdGVfY29udGVudHN9LCBkZXBlbmRpbmcgdXBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLXJlbG9jYXRpb24gYW5kIHdoZXRoZXIgdGhlIGxpbmsgaXMgcmVsb2NhdGVhYmxlIG9yIG5vdC4KLQotQGl0ZW0KLVRlc3QgdGhlIGxpbmtlci4gIFRlc3QgdGhlIGNhc2Ugb2YgYSBmaW5hbCBsaW5rLiAgSWYgdGhlIHJlbG9jYXRpb24gY2FuCi1vdmVyZmxvdywgdXNlIGEgbGlua2VyIHNjcmlwdCB0byBmb3JjZSBhbiBvdmVyZmxvdyBhbmQgbWFrZSBzdXJlIHRoZQotZXJyb3IgaXMgcmVwb3J0ZWQgY29ycmVjdGx5LiAgVGVzdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGV0aGVyIHRoZQotc3ltYm9sIGlzIGRlZmluZWQgb3IgdW5kZWZpbmVkIGluIHRoZSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgRm9yIGJvdGggdGhlCi1maW5hbCBhbmQgcmVsb2NhdGVhYmxlIGxpbmssIHRlc3QgdGhlIGNhc2Ugd2hlbiB0aGUgc3ltYm9sIGlzIGEgY29tbW9uCi1zeW1ib2wsIHdoZW4gdGhlIHN5bWJvbCBsb29rZWQgbGlrZSBhIGNvbW1vbiBzeW1ib2wgYnV0IGJlY2FtZSBhIGRlZmluZWQKLXN5bWJvbCwgd2hlbiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUsIGFuZCB3aGVuCi10aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuCi0KLUBpdGVtCi1JbiBvcmRlciBmb3IgbGlua2luZyB0byBhbm90aGVyIG9iamVjdCBmaWxlIGZvcm1hdCwgc3VjaCBhcyBTLXJlY29yZHMsCi10byB3b3JrIGNvcnJlY3RseSwgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gaGFzIHRvIGRvIHRoZSByaWdodAotdGhpbmcgZm9yIHRoZSByZWxvY2F0aW9uLiAgWW91IG1heSBuZWVkIHRvIHNldCB0aGUKLUBzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkIHRvIGhhbmRsZSB0aGlzIGNvcnJlY3RseS4gIFRlc3QgdGhpcyBieQotZG9pbmcgYSBsaW5rIGluIHdoaWNoIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzIFMtcmVjb3Jkcy4KLQotQGl0ZW0KLVVzaW5nIHRoZSBsaW5rZXIgdG8gZ2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCBpbiBhIGRpZmZlcmVudCBvYmplY3QKLWZpbGUgZm9ybWF0IGlzIGltcG9zc2libGUgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc28geW91IGdlbmVyYWxseSBkb24ndAotaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LiAgTGlua2luZyBpbnB1dCBmaWxlcyBvZiBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKLWZvcm1hdHMgdG9nZXRoZXIgaXMgcXVpdGUgdW51c3VhbCwgYnV0IGlmIHlvdSdyZSByZWFsbHkgZGVkaWNhdGVkIHlvdQotbWF5IHdhbnQgdG8gY29uc2lkZXIgdGVzdGluZyB0aGlzIGNhc2UsIGJvdGggd2hlbiB0aGUgb3V0cHV0IG9iamVjdCBmaWxlCi1mb3JtYXQgaXMgdGhlIHNhbWUgYXMgeW91ciBmb3JtYXQsIGFuZCB3aGVuIGl0IGlzIGRpZmZlcmVudC4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBjb2RlcwotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gY29kZXMKLQotQkZEIGhhcyBhbm90aGVyIHdheSBvZiBkZXNjcmliaW5nIHJlbG9jYXRpb25zIGJlc2lkZXMgdGhlIGhvd3RvCi1zdHJ1Y3R1cmVzIGRlc2NyaWJlZCBhYm92ZTogdGhlIGVudW0gQHNhbXB7YmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlfS4KLQotRXZlcnkga25vd24gcmVsb2NhdGlvbiB0eXBlIGNhbiBiZSBkZXNjcmliZWQgYXMgYSB2YWx1ZSBpbiB0aGlzCi1lbnVtZXJhdGlvbi4gIFRoZSBlbnVtZXJhdGlvbiBjb250YWlucyBtYW55IHRhcmdldCBzcGVjaWZpYyByZWxvY2F0aW9ucywKLWJ1dCB3aGVyZSB0d28gb3IgbW9yZSB0YXJnZXRzIGhhdmUgdGhlIHNhbWUgcmVsb2NhdGlvbiwgYSBzaW5nbGUgY29kZSBpcwotdXNlZC4gIEZvciBleGFtcGxlLCB0aGUgc2luZ2xlIHZhbHVlIEBzYW1we0JGRF9SRUxPQ18zMn0gaXMgdXNlZCBmb3IgYWxsCi1zaW1wbGUgMzIgYml0IHJlbG9jYXRpb24gdHlwZXMuCi0KLVRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyByZWxvY2F0aW9uIGNvZGUgaXMgdG8gZ2l2ZSB0aGUgYXNzZW1ibGVyIHNvbWUKLW1lY2hhbmlzbSB0byBjcmVhdGUgQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcy4gIEluIG9yZGVyIGZvciB0aGUKLWFzc2VtYmxlciB0byBjcmVhdGUgYW4gQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlLCBpdCBoYXMgdG8gYmUgYWJsZSB0bwotb2J0YWluIGEgaG93dG8gc3RydWN0dXJlLiAgVGhlIGZ1bmN0aW9uIEBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0sCi13aGljaCBzaW1wbHkgY2FsbHMgdGhlIHRhcmdldCB2ZWN0b3IgZW50cnkgcG9pbnQKLUBzYW1we3JlbG9jX3R5cGVfbG9va3VwfSwgdGFrZXMgYSByZWxvY2F0aW9uIGNvZGUgYW5kIHJldHVybnMgYSBob3d0bwotc3RydWN0dXJlLgotCi1UaGUgZnVuY3Rpb24gQHNhbXB7YmZkX2dldF9yZWxvY19jb2RlX25hbWV9IHJldHVybnMgdGhlIG5hbWUgb2YgYQotcmVsb2NhdGlvbiBjb2RlLiAgVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy4KLQotVXNpbmcgYm90aCBob3d0byBzdHJ1Y3R1cmVzIGFuZCByZWxvY2F0aW9uIGNvZGVzIGNhbiBiZSBzb21ld2hhdAotY29uZnVzaW5nLiAgVGhlcmUgYXJlIG1hbnkgcHJvY2Vzc29yIHNwZWNpZmljIHJlbG9jYXRpb24gY29kZXMuCi1Ib3dldmVyLCB0aGUgcmVsb2NhdGlvbiBpcyBvbmx5IGZ1bGx5IGRlZmluZWQgYnkgdGhlIGhvd3RvIHN0cnVjdHVyZS4KLVRoZSBzYW1lIHJlbG9jYXRpb24gY29kZSB3aWxsIG1hcCB0byBkaWZmZXJlbnQgaG93dG8gc3RydWN0dXJlcyBpbgotZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZXhhbXBsZSwgdGhlIGFkZGVuZCBoYW5kbGluZyBtYXkgYmUKLWRpZmZlcmVudC4KLQotTW9zdCBvZiB0aGUgcmVsb2NhdGlvbiBjb2RlcyBhcmUgbm90IHJlYWxseSBnZW5lcmFsLiAgVGhlIGFzc2VtYmxlciBjYW4KLW5vdCB1c2UgdGhlbSB3aXRob3V0IGFscmVhZHkgdW5kZXJzdGFuZGluZyB3aGF0IHNvcnRzIG9mIHJlbG9jYXRpb25zIGNhbgotYmUgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldC4gIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlCi1yZWxvY2F0aW9uIGNvZGVzIHdpdGggc29tZXRoaW5nIHNpbXBsZXIuCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGZ1dHVyZQotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gZnV0dXJlCi0KLUNsZWFybHkgdGhlIGN1cnJlbnQgQkZEIHJlbG9jYXRpb24gc3VwcG9ydCBpcyBpbiBiYWQgc2hhcGUuICBBCi13aG9sZXNjYWxlIHJld3JpdGUgd291bGQgYmUgdmVyeSBkaWZmaWN1bHQsIGJlY2F1c2UgaXQgd291bGQgcmVxdWlyZQotdGhvcm91Z2ggdGVzdGluZyBvZiBldmVyeSBCRkQgdGFyZ2V0LiAgU28gc29tZSBzb3J0IG9mIGluY3JlbWVudGFsCi1jaGFuZ2UgaXMgcmVxdWlyZWQuCi0KLU15IHZhZ3VlIHRob3VnaHRzIG9uIHRoaXMgd291bGQgaW52b2x2ZSBkZWZpbmluZyBhIG5ldywgY2xlYXJseSBkZWZpbmVkLAotaG93dG8gc3RydWN0dXJlLiAgU29tZSBtZWNoYW5pc20gd291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZQotb2YgaG93dG8gc3RydWN0dXJlIHdhcyBiZWluZyB1c2VkIGJ5IGEgcGFydGljdWxhciBmb3JtYXQuCi0KLVRoZSBuZXcgaG93dG8gc3RydWN0dXJlIHdvdWxkIGNsZWFybHkgZGVmaW5lIHRoZSByZWxvY2F0aW9uIGJlaGF2aW91ciBpbgotdGhlIGNhc2Ugb2YgYW4gYXNzZW1ibHksIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBhIGZpbmFsIGxpbmsuICBBdAotbGVhc3Qgb25lIHNwZWNpYWwgZnVuY3Rpb24gd291bGQgYmUgZGVmaW5lZCBhcyBhbiBlc2NhcGUsIGFuZCBpdCBtaWdodAotbWFrZSBzZW5zZSB0byBkZWZpbmUgbW9yZS4KLQotT25lIG9yIG1vcmUgZ2VuZXJpYyBmdW5jdGlvbnMgc2ltaWxhciB0byBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufQotd291bGQgYmUgd3JpdHRlbiB0byBoYW5kbGUgdGhlIG5ldyBob3d0byBzdHJ1Y3R1cmUuCi0KLVRoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gd3JpdGUgYSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIHJlbG9jYXRlCi1zZWN0aW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBuZXcgbGlua2VyLiAgVGhlIHRhcmdldCBzcGVjaWZpYyBjb2RlCi13b3VsZCBwcm92aWRlIHNvbWUgbWVjaGFuaXNtIChhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYW4gaW5pdGlhbAotY29udmVyc2lvbikgdG8gY29udmVydCB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbnMgaW50byBob3d0bwotc3RydWN0dXJlcy4KLQotSWRlYWxseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyBnZW5lcmljIHJlbG9jYXRlIHNlY3Rpb24KLWZ1bmN0aW9uIGZvciB0aGUgZ2VuZXJpYyBsaW5rZXIgYXMgd2VsbC4gIFRoYXQgaXMsIGl0IHdvdWxkIHJlcGxhY2UgdGhlCi1Ac2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9IGZ1bmN0aW9uIHdoaWNoIGlzCi1jdXJyZW50bHkgbm9ybWFsbHkgdXNlZC4KLQotRm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgRUxGIGR5bmFtaWMgbGlua2luZywgbW9yZSBjb25zaWRlcmF0aW9uIG5lZWRzIHRvCi1iZSBnaXZlbiB0byB3cml0aW5nIEVMRiBzcGVjaWZpYyBidXQgRUxGIHRhcmdldCBnZW5lcmljIGNvZGUgdG8gaGFuZGxlCi1zcGVjaWFsIHJlbG9jYXRpb24gdHlwZXMgc3VjaCBhcyBHT1QgYW5kIFBMVC4KLQotQG5vZGUgQkZEIEVMRiBzdXBwb3J0Ci1Ac2VjdGlvbiBCRkQgRUxGIHN1cHBvcnQKLUBjaW5kZXggZWxmIHN1cHBvcnQgaW4gYmZkCi1AY2luZGV4IGJmZCBlbGYgc3VwcG9ydAotCi1UaGUgRUxGIG9iamVjdCBmaWxlIGZvcm1hdCBpcyBkZWZpbmVkIGluIHR3byBwYXJ0czogYSBnZW5lcmljIEFCSSBhbmQgYQotcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBsZW1lbnQuICBUaGUgRUxGIHN1cHBvcnQgaW4gQkZEIGlzIHNwbGl0IGluIGEKLXNpbWlsYXIgZmFzaGlvbi4gIFRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBpcyBsYXJnZWx5IGtlcHQgd2l0aGluCi1hIHNpbmdsZSBmaWxlLiAgVGhlIGdlbmVyaWMgc3VwcG9ydCBpcyBwcm92aWRlZCBieSBzZXZlcmFsIG90aGVyIGZpbGVzLgotVGhlIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZAotY29uc3RhbnRzIHVzZWQgYnkgdGhlIGdlbmVyaWMgc3VwcG9ydC4KLQotQG1lbnUKLSogQkZEIEVMRiBzZWN0aW9ucyBhbmQgc2VnbWVudHM6OglFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi0qIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0OjoJCUJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQ6OglCRkQgRUxGIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0Ci0qIEJGRCBFTEYgY29yZSBmaWxlczo6CQkJQkZEIEVMRiBjb3JlIGZpbGVzCi0qIEJGRCBFTEYgZnV0dXJlOjoJCQlCRkQgRUxGIGZ1dHVyZQotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi1Ac3Vic2VjdGlvbiBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi0KLVRoZSBFTEYgQUJJIHBlcm1pdHMgYSBmaWxlIHRvIGhhdmUgZWl0aGVyIHNlY3Rpb25zIG9yIHNlZ21lbnRzIG9yIGJvdGguCi1SZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGVzIGNvbnZlbnRpb25hbGx5IGhhdmUgb25seSBzZWN0aW9ucy4KLUV4ZWN1dGFibGVzIGNvbnZlbnRpb25hbGx5IGhhdmUgYm90aC4gIENvcmUgZmlsZXMgY29udmVudGlvbmFsbHkgaGF2ZQotb25seSBwcm9ncmFtIHNlZ21lbnRzLgotCi1FTEYgc2VjdGlvbnMgYXJlIHNpbWlsYXIgdG8gc2VjdGlvbnMgaW4gb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0czogdGhleQotaGF2ZSBhIG5hbWUsIGEgVk1BLCBmaWxlIGNvbnRlbnRzLCBmbGFncywgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMKLWluZm9ybWF0aW9uLiAgRUxGIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgaW4gc2VjdGlvbnMgb2YgYSBwYXJ0aWN1bGFyCi10eXBlOyBCRkQgYXV0b21hdGljYWxseSBjb252ZXJ0cyB0aGVzZSBzZWN0aW9ucyBpbnRvIGludGVybmFsIHJlbG9jYXRpb24KLWluZm9ybWF0aW9uLgotCi1FTEYgcHJvZ3JhbSBzZWdtZW50cyBhcmUgaW50ZW5kZWQgZm9yIGZhc3QgaW50ZXJwcmV0YXRpb24gYnkgYSBzeXN0ZW0KLWxvYWRlci4gIFRoZXkgaGF2ZSBhIHR5cGUsIGEgVk1BLCBhbiBMTUEsIGZpbGUgY29udGVudHMsIGFuZCBhIGNvdXBsZSBvZgotb3RoZXIgZmllbGRzLiAgV2hlbiBhbiBFTEYgZXhlY3V0YWJsZSBpcyBydW4gb24gYSBVbml4IHN5c3RlbSwgdGhlCi1zeXN0ZW0gbG9hZGVyIHdpbGwgZXhhbWluZSB0aGUgcHJvZ3JhbSBzZWdtZW50cyB0byBkZWNpZGUgaG93IHRvIGxvYWQKLWl0LiAgVGhlIGxvYWRlciB3aWxsIGlnbm9yZSB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIExvYWRhYmxlIHByb2dyYW0KLXNlZ21lbnRzICh0eXBlIEBzYW1we1BUX0xPQUR9KSBhcmUgZGlyZWN0bHkgbG9hZGVkIGludG8gbWVtb3J5LiAgT3RoZXIKLXByb2dyYW0gc2VnbWVudHMgYXJlIGludGVycHJldGVkIGJ5IHRoZSBsb2FkZXIsIGFuZCBnZW5lcmFsbHkgcHJvdmlkZQotZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLgotCi1XaGVuIGFuIEVMRiBmaWxlIGhhcyBib3RoIHByb2dyYW0gc2VnbWVudHMgYW5kIHNlY3Rpb25zLCBhbiBFTEYgcHJvZ3JhbQotc2VnbWVudCBtYXkgZW5jb21wYXNzIG9uZSBvciBtb3JlIEVMRiBzZWN0aW9ucywgaW4gdGhlIHNlbnNlIHRoYXQgdGhlCi1wb3J0aW9uIG9mIHRoZSBmaWxlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9ncmFtIHNlZ21lbnQgbWF5IGluY2x1ZGUKLXRoZSBwb3J0aW9ucyBvZiB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBvciBtb3JlIHNlY3Rpb25zLiAgV2hlbgotdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIGEgbG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50LCB0aGUKLXJlbGF0aXZlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbiBjb250ZW50cyBpbiB0aGUgZmlsZSBtdXN0IGNvcnJlc3BvbmQKLXRvIHRoZSByZWxhdGl2ZSBwb3NpdGlvbnMgdGhleSBzaG91bGQgaG9sZCB3aGVuIHRoZSBwcm9ncmFtIHNlZ21lbnQgaXMKLWxvYWRlZC4gIFRoaXMgcmVxdWlyZW1lbnQgc2hvdWxkIGJlIG9idmlvdXMgaWYgeW91IGNvbnNpZGVyIHRoYXQgdGhlCi1zeXN0ZW0gbG9hZGVyIHdpbGwgbG9hZCBhbiBlbnRpcmUgcHJvZ3JhbSBzZWdtZW50IGF0IGEgdGltZS4KLQotT24gYSBzeXN0ZW0gd2hpY2ggc3VwcG9ydHMgZHluYW1pYyBwYWdpbmcsIHN1Y2ggYXMgYW55IG5hdGl2ZSBVbml4Ci1zeXN0ZW0sIHRoZSBjb250ZW50cyBvZiBhIGxvYWRhYmxlIHByb2dyYW0gc2VnbWVudCBtdXN0IGJlIGF0IHRoZSBzYW1lCi1vZmZzZXQgaW4gdGhlIGZpbGUgYXMgaW4gbWVtb3J5LCBtb2R1bG8gdGhlIG1lbW9yeSBwYWdlIHNpemUgdXNlZCBvbiB0aGUKLXN5c3RlbS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3lzdGVtIGxvYWRlciB3aWxsIG1hcCB0aGUgZmlsZSBpbnRvIG1lbW9yeQotc3RhcnRpbmcgYXQgdGhlIHN0YXJ0IG9mIGEgcGFnZS4gIFRoZSBzeXN0ZW0gbG9hZGVyIGNhbiBlYXNpbHkgcmVtYXAKLWVudGlyZSBwYWdlcyB0byB0aGUgY29ycmVjdCBsb2FkIGFkZHJlc3MuICBIb3dldmVyLCBpZiB0aGUgY29udGVudHMgb2YKLXRoZSBmaWxlIHdlcmUgbm90IGNvcnJlY3RseSBhbGlnbmVkIHdpdGhpbiB0aGUgcGFnZSwgdGhlIHN5c3RlbSBsb2FkZXIKLXdvdWxkIGhhdmUgdG8gc2hpZnQgdGhlIGNvbnRlbnRzIGFyb3VuZCB3aXRoaW4gdGhlIHBhZ2UsIHdoaWNoIGlzIHRvbwotZXhwZW5zaXZlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBMTUEgb2YgYSBsb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgaXMKLUBzYW1wezB4NDAwODB9IGFuZCB0aGUgcGFnZSBzaXplIGlzIEBzYW1wezB4MTAwMH0sIHRoZW4gdGhlIHBvc2l0aW9uIG9mCi10aGUgc2VnbWVudCBjb250ZW50cyB3aXRoaW4gdGhlIGZpbGUgbXVzdCBlcXVhbCBAc2FtcHsweDgwfSBtb2R1bG8KLUBzYW1wezB4MTAwMH0uCi0KLUJGRCBoYXMgb25seSBhIHNpbmdsZSBzZXQgb2Ygc2VjdGlvbnMuICBJdCBkb2VzIG5vdCBwcm92aWRlIGFueSBnZW5lcmljCi13YXkgdG8gZXhhbWluZSBib3RoIHNlY3Rpb25zIGFuZCBzZWdtZW50cy4gIFdoZW4gQkZEIGlzIHVzZWQgdG8gb3BlbiBhbgotb2JqZWN0IGZpbGUgb3IgZXhlY3V0YWJsZSwgdGhlIEJGRCBzZWN0aW9ucyB3aWxsIHJlcHJlc2VudCBFTEYgc2VjdGlvbnMuCi1XaGVuIEJGRCBpcyB1c2VkIHRvIG9wZW4gYSBjb3JlIGZpbGUsIHRoZSBCRkQgc2VjdGlvbnMgd2lsbCByZXByZXNlbnQKLUVMRiBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIGV4YW1pbmUgYW4gb2JqZWN0IGZpbGUgb3IgZXhlY3V0YWJsZSwgYW55IHByb2dyYW0KLXNlZ21lbnRzIHdpbGwgYmUgcmVhZCB0byBzZXQgdGhlIExNQSBvZiB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIGJlY2F1c2UKLUVMRiBzZWN0aW9ucyBvbmx5IGhhdmUgYSBWTUEsIHdoaWxlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGhhdmUgYm90aCBhIFZNQQotYW5kIGFuIExNQS4gIEFueSBwcm9ncmFtIHNlZ21lbnRzIHdpbGwgYmUgY29waWVkIGJ5IHRoZQotQHNhbXB7Y29weV9wcml2YXRlfSBlbnRyeSBwb2ludHMuICBUaGV5IHdpbGwgYmUgcHJpbnRlZCBieSB0aGUKLUBzYW1we3ByaW50X3ByaXZhdGV9IGVudHJ5IHBvaW50LiAgT3RoZXJ3aXNlLCB0aGUgcHJvZ3JhbSBzZWdtZW50cyBhcmUKLWlnbm9yZWQuICBJbiBwYXJ0aWN1bGFyLCBwcm9ncmFtcyB3aGljaCB1c2UgQkZEIGN1cnJlbnRseSBoYXZlIG5vIGRpcmVjdAotYWNjZXNzIHRvIHRoZSBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlLCB0aGUgcHJvZ3JhbSBzZWdtZW50cyB3aWxsIGJlCi1jcmVhdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGRvbmUgaW4KLXRoZSBmdW5jdGlvbiBAc2FtcHthc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzfSBpbiBAZmlsZXtlbGYuY30uCi1UaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHR3ZWFrZWQgbWFueSB0aW1lcywgYW5kIHByb2JhYmx5IHN0aWxsIGhhcwotcHJvYmxlbXMgdGhhdCBhcmlzZSBpbiBwYXJ0aWN1bGFyIGNhc2VzLgotCi1UaGVyZSBpcyBhIGhvb2sgd2hpY2ggbWF5IGJlIHVzZWQgdG8gZXhwbGljaXRseSBkZWZpbmUgdGhlIHByb2dyYW0KLXNlZ21lbnRzIHdoZW4gY3JlYXRpbmcgYW4gZXhlY3V0YWJsZTogdGhlIEBzYW1we2JmZF9yZWNvcmRfcGhkcn0KLWZ1bmN0aW9uIGluIEBmaWxle2JmZC5jfS4gIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBCRkQgd2lsbCBub3QKLWNyZWF0ZSBwcm9ncmFtIHNlZ21lbnRzIGl0c2VsZiwgYnV0IHdpbGwgb25seSBjcmVhdGUgdGhlIHByb2dyYW0KLXNlZ21lbnRzIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyLiAgVGhlIGxpbmtlciB1c2VzIHRoaXMgZnVuY3Rpb24gdG8KLWltcGxlbWVudCB0aGUgQHNhbXB7UEhEUlN9IGxpbmtlciBzY3JpcHQgY29tbWFuZC4KLQotQG5vZGUgQkZEIEVMRiBnZW5lcmljIHN1cHBvcnQKLUBzdWJzZWN0aW9uIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0Ci0KLUluIGdlbmVyYWwsIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgcmVhZCBleHRlcm5hbCBkYXRhIGZyb20gdGhlIEVMRiBmaWxlCi1hcmUgZm91bmQgaW4gQGZpbGV7ZWxmLmN9LiAgVGhleSBvcGVyYXRlIG9uIHRoZSBpbnRlcm5hbCBmb3JtcyBvZiB0aGUKLUVMRiBzdHJ1Y3R1cmVzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiBAZmlsZXtpbmNsdWRlL2VsZi9pbnRlcm5hbC5ofS4gIFRoZQotaW50ZXJuYWwgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBAc2FtcHtiZmRfdm1hfSwgYW5kIHNvIG1heQotYmUgdXNlZCBmb3IgYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBFTEYgdGFyZ2V0cy4KLQotVGhlIGZpbGUgQGZpbGV7ZWxmY29kZS5ofSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggb3BlcmF0ZSBvbiB0aGUKLWV4dGVybmFsIGRhdGEuICBAZmlsZXtlbGZjb2RlLmh9IGlzIGNvbXBpbGVkIHR3aWNlLCBvbmNlIHZpYQotQGZpbGV7ZWxmMzIuY30gd2l0aCBAc2FtcHtBUkNIX1NJWkV9IGRlZmluZWQgYXMgQHNhbXB7MzJ9LCBhbmQgb25jZSB2aWEKLUBmaWxle2VsZjY0LmN9IHdpdGggQHNhbXB7QVJDSF9TSVpFfSBkZWZpbmVkIGFzIEBzYW1wezY0fS4KLUBmaWxle2VsZmNvZGUuaH0gaW5jbHVkZXMgZnVuY3Rpb25zIHRvIHN3YXAgdGhlIEVMRiBzdHJ1Y3R1cmVzIGluIGFuZAotb3V0IG9mIGV4dGVybmFsIGZvcm0sIGFzIHdlbGwgYXMgYSBmZXcgbW9yZSBjb21wbGV4IGZ1bmN0aW9ucy4KLQotTGlua2VyIHN1cHBvcnQgaXMgZm91bmQgaW4gQGZpbGV7ZWxmbGluay5jfSBhbmQgQGZpbGV7ZWxmbGluay5ofS4gIFRoZQotbGF0dGVyIGZpbGUgaXMgY29tcGlsZWQgdHdpY2UsIGZvciBib3RoIDMyIGFuZCA2NCBiaXQgc3VwcG9ydC4gIFRoZQotbGlua2VyIHN1cHBvcnQgaXMgb25seSB1c2VkIGlmIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZSBkZWZpbmVzCi1Ac2FtcHtlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9ufSwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gcmVsb2NhdGUgdGhlCi1zZWN0aW9uIGNvbnRlbnRzLiAgSWYgdGhhdCBtYWNybyBpcyBub3QgZGVmaW5lZCwgdGhlIGdlbmVyaWMgbGlua2VyIGNvZGUKLWlzIHVzZWQsIGFuZCByZWxvY2F0aW9ucyBhcmUgaGFuZGxlZCB2aWEgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0uCi0KLVRoZSBjb3JlIGZpbGUgc3VwcG9ydCBpcyBpbiBAZmlsZXtlbGZjb3JlLmh9LCB3aGljaCBpcyBjb21waWxlZCB0d2ljZSwKLWZvciBib3RoIDMyIGFuZCA2NCBiaXQgc3VwcG9ydC4gIFRoZSBtb3JlIGludGVyZXN0aW5nIGNhc2VzIG9mIGNvcmUgZmlsZQotc3VwcG9ydCBvbmx5IHdvcmsgb24gYSBuYXRpdmUgc3lzdGVtIHdoaWNoIGhhcyB0aGUgQGZpbGV7c3lzL3Byb2Nmcy5ofQotaGVhZGVyIGZpbGUuICBXaXRob3V0IHRoYXQgZmlsZSwgdGhlIGNvcmUgZmlsZSBzdXBwb3J0IGRvZXMgbGl0dGxlIG1vcmUKLXRoYW4gcmVhZCB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMgYXMgQkZEIHNlY3Rpb25zLgotCi1UaGUgQkZEIGludGVybmFsIGhlYWRlciBmaWxlIEBmaWxle2VsZi1iZmQuaH0gaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgotYW1vbmcgdGhlc2UgZmlsZXMgYW5kIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZXMuCi0KLVRoZSBkZWZhdWx0IGVudHJpZXMgZm9yIHRoZSBCRkQgRUxGIHRhcmdldCB2ZWN0b3IgYXJlIGZvdW5kIG1haW5seSBpbgotQGZpbGV7ZWxmLmN9LiAgU29tZSBmdW5jdGlvbnMgYXJlIGZvdW5kIGluIEBmaWxle2VsZmNvZGUuaH0uCi0KLVRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZXMgbWF5IG92ZXJyaWRlIHBhcnRpY3VsYXIgZW50cmllcyBpbiB0aGUKLXRhcmdldCB2ZWN0b3IsIGJ1dCBtb3N0IGRvIG5vdCwgd2l0aCBvbmUgZXhjZXB0aW9uOiB0aGUKLUBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0gZW50cnkgcG9pbnQgaXMgYWx3YXlzIHByb2Nlc3NvciBzcGVjaWZpYy4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotQHN1YnNlY3Rpb24gQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotCi1CeSBjb252ZW50aW9uLCB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciBwcm9jZXNzb3IKLXdpbGwgYmUgZm91bmQgaW4gQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9LCB3aGVyZSBAdmFye25ufSBpcwotZWl0aGVyIDMyIG9yIDY0LCBhbmQgQHZhcntjcHV9IGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzb3IuCi0KLUBtZW51Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkOjoJUmVxdWlyZWQgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLSogQkZEIEVMRiBwcm9jZXNzb3IgbGlua2VyOjoJUHJvY2Vzc29yIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIG90aGVyOjoJT3RoZXIgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgb3B0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkCi1Ac3Vic3Vic2VjdGlvbiBSZXF1aXJlZCBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotCi1XaGVuIHdyaXRpbmcgYSBAZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30gZmlsZSwgeW91IG11c3QgZG8gdGhlCi1mb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1EZWZpbmUgZWl0aGVyIEBzYW1we1RBUkdFVF9CSUdfU1lNfSBvciBAc2FtcHtUQVJHRVRfTElUVExFX1NZTX0sIG9yCi1ib3RoLCB0byBhIHVuaXF1ZSBDIG5hbWUgdG8gdXNlIGZvciB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgbmFtZSBzaG91bGQKLWFwcGVhciBpbiB0aGUgbGlzdCBvZiB0YXJnZXQgdmVjdG9ycyBpbiBAZmlsZXt0YXJnZXRzLmN9LCBhbmQgd2lsbCBhbHNvCi1oYXZlIHRvIGFwcGVhciBpbiBAZmlsZXtjb25maWcuYmZkfSBhbmQgQGZpbGV7Y29uZmlndXJlLmlufS4gIERlZmluZQotQHNhbXB7VEFSR0VUX0JJR19TWU19IGZvciBhIGJpZy1lbmRpYW4gcHJvY2Vzc29yLAotQHNhbXB7VEFSR0VUX0xJVFRMRV9TWU19IGZvciBhIGxpdHRsZS1lbmRpYW4gcHJvY2Vzc29yLCBhbmQgZGVmaW5lIGJvdGgKLWZvciBhIGJpLWVuZGlhbiBwcm9jZXNzb3IuCi1AaXRlbQotRGVmaW5lIGVpdGhlciBAc2FtcHtUQVJHRVRfQklHX05BTUV9IG9yIEBzYW1we1RBUkdFVF9MSVRUTEVfTkFNRX0sIG9yCi1ib3RoLCB0byBhIHN0cmluZyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyB0aGUKLW5hbWUgd2hpY2ggYSB1c2VyIG9mIHRoZSBCRkQgdG9vbCB3b3VsZCB1c2UgdG8gc3BlY2lmeSB0aGUgb2JqZWN0IGZpbGUKLWZvcm1hdC4gIEl0IHdvdWxkIG5vcm1hbGx5IGFwcGVhciBpbiBhIGxpbmtlciBlbXVsYXRpb24gcGFyYW1ldGVycwotZmlsZS4KLUBpdGVtCi1EZWZpbmUgQHNhbXB7RUxGX0FSQ0h9IHRvIHRoZSBCRkQgYXJjaGl0ZWN0dXJlIChhbiBlbGVtZW50IG9mIHRoZQotQHNhbXB7YmZkX2FyY2hpdGVjdHVyZX0gZW51bSwgdHlwaWNhbGx5IEBzYW1we2JmZF9hcmNoX0B2YXJ7Y3B1fX0pLgotQGl0ZW0KLURlZmluZSBAc2FtcHtFTEZfTUFDSElORV9DT0RFfSB0byB0aGUgbWFnaWMgbnVtYmVyIHdoaWNoIHNob3VsZCBhcHBlYXIKLWluIHRoZSBAc2FtcHtlX21hY2hpbmV9IGZpZWxkIG9mIHRoZSBFTEYgaGVhZGVyLiAgQXMgb2YgdGhpcyB3cml0aW5nLAotdGhlc2UgbWFnaWMgbnVtYmVycyBhcmUgYXNzaWduZWQgYnkgU0NPOyBpZiB5b3Ugd2FudCB0byBnZXQgYSBtYWdpYwotbnVtYmVyIGZvciBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yLCB0cnkgc2VuZGluZyBhIG5vdGUgdG8KLUBlbWFpbHtyZWdpc3RyeUBAc2NvLmNvbX0uICBJbiB0aGUgQkZEIHNvdXJjZXMsIHRoZSBtYWdpYyBudW1iZXJzIGFyZQotZm91bmQgaW4gQGZpbGV7aW5jbHVkZS9lbGYvY29tbW9uLmh9OyB0aGV5IGhhdmUgbmFtZXMgYmVnaW5uaW5nIHdpdGgKLUBzYW1we0VNX30uCi1AaXRlbQotRGVmaW5lIEBzYW1we0VMRl9NQVhQQUdFU0laRX0gdG8gdGhlIG1heGltdW0gc2l6ZSBvZiBhIHZpcnR1YWwgcGFnZSBpbgotbWVtb3J5LiAgVGhpcyBjYW4gbm9ybWFsbHkgYmUgZm91bmQgYXQgdGhlIHN0YXJ0IG9mIGNoYXB0ZXIgNSBpbiB0aGUKLXByb2Nlc3NvciBzcGVjaWZpYyBzdXBwbGVtZW50LiAgRm9yIGEgcHJvY2Vzc29yIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkCi1pbiBhbiBlbWJlZGRlZCBzeXN0ZW0sIG9yIHdoaWNoIGhhcyBubyBtZW1vcnkgbWFuYWdlbWVudCBoYXJkd2FyZSwgdGhpcwotY2FuIHNpbXBseSBiZSBAc2FtcHsxfS4KLUBpdGVtCi1JZiB0aGUgZm9ybWF0IHNob3VsZCB1c2UgQHNhbXB7UmVsfSByYXRoZXIgdGhhbiBAc2FtcHtSZWxhfSByZWxvY2F0aW9ucywKLWRlZmluZSBAc2FtcHtVU0VfUkVMfS4gIFRoaXMgaXMgbm9ybWFsbHkgZGVmaW5lZCBpbiBjaGFwdGVyIDQgb2YgdGhlCi1wcm9jZXNzb3Igc3BlY2lmaWMgc3VwcGxlbWVudC4KLQotSW4gdGhlIGFic2VuY2Ugb2YgYSBzdXBwbGVtZW50LCBpdCdzIGVhc2llciB0byB3b3JrIHdpdGggQHNhbXB7UmVsYX0KLXJlbG9jYXRpb25zLiAgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMgd2lsbCByZXF1aXJlIG1vcmUgc3BhY2UgaW4gb2JqZWN0Ci1maWxlcyAoYnV0IG5vdCBpbiBleGVjdXRhYmxlcywgZXhjZXB0IHdoZW4gdXNpbmcgZHluYW1pYyBsaW5raW5nKS4KLUhvd2V2ZXIsIHRoaXMgaXMgb3V0d2VpZ2hlZCBieSB0aGUgc2ltcGxpY2l0eSBvZiBhZGRlbmQgaGFuZGxpbmcgd2hlbgotdXNpbmcgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMuICBXaXRoIEBzYW1we1JlbH0gcmVsb2NhdGlvbnMsIHRoZSBhZGRlbmQKLW11c3QgYmUgc3RvcmVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCB3aGljaCBtYWtlcyByZWxvY2F0ZWFibGUgbGlua3MKLW1vcmUgY29tcGxleC4KLQotRm9yIGV4YW1wbGUsIGNvbnNpZGVyIEMgY29kZSBsaWtlIEBjb2Rle2kgPSBhWzEwMDBdO30gd2hlcmUgQHNhbXB7YX0gaXMKLWEgZ2xvYmFsIGFycmF5LiAgVGhlIGluc3RydWN0aW9ucyB3aGljaCBsb2FkIHRoZSB2YWx1ZSBvZiBAc2FtcHthWzEwMDBdfQotd2lsbCBtb3N0IGxpa2VseSB1c2UgYSByZWxvY2F0aW9uIHdoaWNoIHJlZmVycyB0byB0aGUgc3ltYm9sCi1yZXByZXNlbnRpbmcgQHNhbXB7YX0sIHdpdGggYW4gYWRkZW5kIHRoYXQgZ2l2ZXMgdGhlIG9mZnNldCBmcm9tIHRoZQotc3RhcnQgb2YgQHNhbXB7YX0gdG8gZWxlbWVudCBAc2FtcHsxMDAwfS4gIFdoZW4gdXNpbmcgQHNhbXB7UmVsfQotcmVsb2NhdGlvbnMsIHRoYXQgYWRkZW5kIG11c3QgYmUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4KLUlmIHlvdSBhcmUgYWRkaW5nIHN1cHBvcnQgZm9yIGEgUklTQyBjaGlwIHdoaWNoIHVzZXMgdHdvIG9yIG1vcmUKLWluc3RydWN0aW9ucyB0byBsb2FkIGFuIGFkZHJlc3MsIHRoZW4gdGhlIGFkZGVuZCBtYXkgbm90IGZpdCBpbiBhIHNpbmdsZQotaW5zdHJ1Y3Rpb24sIGFuZCB3aWxsIGhhdmUgdG8gYmUgc29tZWhvdyBzcGxpdCBhbW9uZyB0aGUgaW5zdHJ1Y3Rpb25zLgotVGhpcyBtYWtlcyBsaW5raW5nIGF3a3dhcmQsIHBhcnRpY3VsYXJseSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsKLWluIHdoaWNoIHRoZSBhZGRlbmQgbWF5IGhhdmUgdG8gYmUgdXBkYXRlZC4gIEl0IGNhbiBiZSBkb25lLS0tdGhlIE1JUFMKLUVMRiBzdXBwb3J0IGRvZXMgaXQtLS1idXQgaXQgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbiBwb3NzaWJsZS4KLQotSXQgaXMgcG9zc2libGUsIHRob3VnaCBzb21ld2hhdCBhd2t3YXJkLCB0byBzdXBwb3J0IGJvdGggQHNhbXB7UmVsfSBhbmQKLUBzYW1we1JlbGF9IHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSB0YXJnZXQ7IEBmaWxle2VsZjY0LW1pcHMuY30gZG9lcyBpdAotYnkgb3ZlcnJpZGluZyB0aGUgcmVsb2NhdGlvbiByZWFkaW5nIGFuZCB3cml0aW5nIHJvdXRpbmVzLgotQGl0ZW0KLURlZmluZSBob3d0byBzdHJ1Y3R1cmVzIGZvciBhbGwgdGhlIHJlbG9jYXRpb24gdHlwZXMuCi1AaXRlbQotRGVmaW5lIGEgQHNhbXB7YmZkX3JlbG9jX3R5cGVfbG9va3VwfSByb3V0aW5lLiAgVGhpcyBtdXN0IGJlIG5hbWVkCi1Ac2FtcHtiZmRfZWxmQHZhcntubn1fYmZkX3JlbG9jX3R5cGVfbG9va3VwfSwgYW5kIG1heSBiZSBlaXRoZXIgYQotZnVuY3Rpb24gb3IgYSBtYWNyby4gIEl0IG11c3QgdHJhbnNsYXRlIGEgQkZEIHJlbG9jYXRpb24gY29kZSBpbnRvIGEKLWhvd3RvIHN0cnVjdHVyZS4gIFRoaXMgaXMgbm9ybWFsbHkgYSB0YWJsZSBsb29rdXAgb3IgYSBzaW1wbGUgc3dpdGNoLgotQGl0ZW0KLUlmIHVzaW5nIEBzYW1we1JlbH0gcmVsb2NhdGlvbnMsIGRlZmluZSBAc2FtcHtlbGZfaW5mb190b19ob3d0b19yZWx9LgotSWYgdXNpbmcgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMsIGRlZmluZSBAc2FtcHtlbGZfaW5mb190b19ob3d0b30uCi1FaXRoZXIgd2F5LCB0aGlzIGlzIGEgbWFjcm8gZGVmaW5lZCBhcyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHdoaWNoCi10YWtlcyBhbiBAc2FtcHthcmVsZW50fSBhbmQgYSBAc2FtcHtSZWx9IG9yIEBzYW1we1JlbGF9IHN0cnVjdHVyZSwgYW5kCi1zZXRzIHRoZSBAc2FtcHtob3d0b30gZmllbGQgb2YgdGhlIEBzYW1we2FyZWxlbnR9IGJhc2VkIG9uIHRoZQotQHNhbXB7UmVsfSBvciBAc2FtcHtSZWxhfSBzdHJ1Y3R1cmUuICBUaGlzIGlzIG5vcm1hbGx5IHVzZXMKLUBzYW1we0VMRkB2YXJ7bm59X1JfVFlQRX0gdG8gZ2V0IHRoZSBFTEYgcmVsb2NhdGlvbiB0eXBlIGFuZCB1c2VzIGl0IGFzCi1hbiBpbmRleCBpbnRvIGEgdGFibGUgb2YgaG93dG8gc3RydWN0dXJlcy4KLUBlbmQgaXRlbWl6ZQotCi1Zb3UgbXVzdCBhbHNvIGFkZCB0aGUgbWFnaWMgbnVtYmVyIGZvciB0aGlzIHByb2Nlc3NvciB0byB0aGUKLUBzYW1we3ByZXBfaGVhZGVyc30gZnVuY3Rpb24gaW4gQGZpbGV7ZWxmLmN9LgotCi1Zb3UgbXVzdCBhbHNvIGNyZWF0ZSBhIGhlYWRlciBmaWxlIGluIHRoZSBAZmlsZXtpbmNsdWRlL2VsZn0gZGlyZWN0b3J5Ci1jYWxsZWQgQGZpbGV7QHZhcntjcHV9Lmh9LiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgYW55IHRhcmdldCBzcGVjaWZpYyAKLWluZm9ybWF0aW9uIHdoaWNoIG1heSBiZSBuZWVkZWQgb3V0c2lkZSBvZiB0aGUgQkZEIGNvZGUuICBJbiBwYXJ0aWN1bGFyCi1pdCBzaG91bGQgdXNlIHRoZSBAc2FtcHtTVEFSVF9SRUxPQ19OVU1CRVJTfSwgQHNhbXB7UkVMT0NfTlVNQkVSfSwKLUBzYW1we0ZBS0VfUkVMT0N9LCBAc2FtcHtFTVBUWV9SRUxPQ30gYW5kIEBzYW1we0VORF9SRUxPQ19OVU1CRVJTfQotbWFjcm9zIHRvIGNyZWF0ZSBhIHRhYmxlIG1hcHBpbmcgdGhlIG51bWJlciB1c2VkIHRvIGluZGVudGlmeSBhCi1yZWxvY2F0aW9uIHRvIGEgbmFtZSBkZXNjcmliaW5nIHRoYXQgcmVsb2NhdGlvbi4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3IgbGlua2VyCi1Ac3Vic3Vic2VjdGlvbiBQcm9jZXNzb3Igc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQKLQotVGhlIGxpbmtlciB3aWxsIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgaWYgeW91IGRlZmluZSBhIHJlbG9jYXRlIHNlY3Rpb24KLWZ1bmN0aW9uLiAgVGhpcyB3aWxsIHBlcm1pdCBCRkQgdG8gdXNlIHRoZSBFTEYgc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQuCi0KLUlmIHlvdSBkbyBub3QgZGVmaW5lIGEgcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiwgQkZEIG11c3QgdXNlIHRoZQotZ2VuZXJpYyBsaW5rZXIgc3VwcG9ydCwgd2hpY2ggcmVxdWlyZXMgY29udmVydGluZyBhbGwgc3ltYm9scyBhbmQKLXJlbG9jYXRpb25zIGludG8gQkZEIEBzYW1we2FzeW1ib2x9IGFuZCBAc2FtcHthcmVsZW50fSBzdHJ1Y3R1cmVzLiAgSW4KLXRoaXMgY2FzZSwgcmVsb2NhdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IGNhbGxpbmcKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LCB3aGljaCB3aWxsIHVzZSB0aGUgaG93dG8gc3RydWN0dXJlcyB5b3UKLWhhdmUgZGVmaW5lZC4gIEB4cmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KLQotSW4gb3JkZXIgdG8gc3VwcG9ydCBsaW5raW5nIGludG8gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0LCBzdWNoIGFzCi1TLXJlY29yZHMsIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IG11c3Qgd29yayBjb3JyZWN0bHkgd2l0aCB5b3VyCi1ob3d0byBzdHJ1Y3R1cmVzLCBzbyB5b3UgY2FuJ3Qgc2tpcCB0aGF0IHN0ZXAuICBIb3dldmVyLCBpZiB5b3UgZGVmaW5lCi10aGUgcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiwgdGhlbiBpbiB0aGUgbm9ybWFsIGNhc2Ugb2YgbGlua2luZyBpbnRvCi1hbiBFTEYgZmlsZSB0aGUgbGlua2VyIHdpbGwgbm90IG5lZWQgdG8gY29udmVydCBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucywKLWFuZCB3aWxsIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQuCi0KLVRvIHVzZSBhIHJlbG9jYXRpb24gc2VjdGlvbiBmdW5jdGlvbiwgZGVmaW5lIHRoZSBtYWNybwotQHNhbXB7ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbn0gYXMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB3aGljaCB3aWxsCi10YWtlIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24sIGFzIHdlbGwgYXMgcmVsb2NhdGlvbiwgc3ltYm9sLCBhbmQgb3RoZXIKLWluZm9ybWF0aW9uLCBhbmQgbW9kaWZ5IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFjY29yZGluZyB0byB0aGUgcmVsb2NhdGlvbgotaW5mb3JtYXRpb24uICBJbiBzaW1wbGUgY2FzZXMsIHRoaXMgaXMgbGl0dGxlIG1vcmUgdGhhbiBhIGxvb3Agb3ZlciB0aGUKLXJlbG9jYXRpb25zIHdoaWNoIGNvbXB1dGVzIHRoZSB2YWx1ZSBvZiBlYWNoIHJlbG9jYXRpb24gYW5kIGNhbGxzCi1Ac2FtcHtfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGV9LiAgVGhlIGZ1bmN0aW9uIG11c3QgY2hlY2sgZm9yIGEKLXJlbG9jYXRlYWJsZSBsaW5rLCBhbmQgaW4gdGhhdCBjYXNlIG5vcm1hbGx5IG5lZWRzIHRvIGRvIG5vdGhpbmcgb3RoZXIKLXRoYW4gYWRqdXN0IHRoZSBhZGRlbmQgZm9yIHJlbG9jYXRpb25zIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbC4KLQotVGhlIGNvbXBsZXggY2FzZXMgZ2VuZXJhbGx5IGhhdmUgdG8gZG8gd2l0aCBkeW5hbWljIGxpbmtlciBzdXBwb3J0LiAgR09UCi1hbmQgUExUIHJlbG9jYXRpb25zIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHksIGFuZCB0aGUgbGlua2VyIG5vcm1hbGx5Ci1hcnJhbmdlcyB0byBzZXQgdXAgdGhlIEdPVCBhbmQgUExUIHNlY3Rpb25zIHdoaWxlIGhhbmRsaW5nIHJlbG9jYXRpb25zLgotV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHJhbmRvbSByZWxvY2F0aW9ucyBtdXN0IG5vcm1hbGx5IGJlCi1jb3BpZWQgaW50byB0aGUgc2hhcmVkIGxpYnJhcnksIG9yIGNvbnZlcnRlZCB0byBSRUxBVElWRSByZWxvY2F0aW9ucwotd2hlbiBwb3NzaWJsZS4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3Igb3RoZXIKLUBzdWJzdWJzZWN0aW9uIE90aGVyIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IG9wdGlvbnMKLQotVGhlcmUgYXJlIG1hbnkgb3RoZXIgbWFjcm9zIHdoaWNoIG1heSBiZSBkZWZpbmVkIGluCi1AZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30uICBUaGVzZSBtYWNyb3MgbWF5IGJlIGZvdW5kIGluCi1AZmlsZXtlbGZ4eC10YXJnZXQuaH0uCi0KLU1hY3JvcyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSBzb21lIG9mIHRoZSBnZW5lcmljIEVMRiB0YXJnZXQgdmVjdG9yCi1mdW5jdGlvbnMuCi0KLVNldmVyYWwgcHJvY2Vzc29yIHNwZWNpZmljIGhvb2sgZnVuY3Rpb25zIHdoaWNoIG1heSBiZSBkZWZpbmVkIGFzCi1tYWNyb3MuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGZvdW5kIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoZQotQHNhbXB7ZWxmX2JhY2tlbmRfZGF0YX0gc3RydWN0dXJlIGRlZmluZWQgaW4gQGZpbGV7ZWxmLWJmZC5ofS4gIEluCi1nZW5lcmFsLCBhIGhvb2sgZnVuY3Rpb24gaXMgc2V0IGJ5IGRlZmluaW5nIGEgbWFjcm8KLUBzYW1we2VsZl9iYWNrZW5kX0B2YXJ7bmFtZX19LgotCi1UaGVyZSBhcmUgYSBmZXcgcHJvY2Vzc29yIHNwZWNpZmljIGNvbnN0YW50cyB3aGljaCBtYXkgYWxzbyBiZSBkZWZpbmVkLgotVGhlc2UgYXJlIGFnYWluIGZvdW5kIGluIHRoZSBAc2FtcHtlbGZfYmFja2VuZF9kYXRhfSBzdHJ1Y3R1cmUuCi0KLUkgd2lsbCBub3QgZGVmaW5lIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGhlcmU7IHNlZSB0aGUKLWNvbW1lbnRzIGluIEBmaWxle2VsZi1iZmQuaH0uCi0KLU5vcm1hbGx5IGFueSBvZGQgY2hhcmFjdGVyaXN0aWMgb2YgYSBwYXJ0aWN1bGFyIEVMRiBwcm9jZXNzb3IgaXMgaGFuZGxlZAotdmlhIGEgaG9vayBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCB0aGUgc3BlY2lhbCBAc2FtcHtTSE5fTUlQU19TQ09NTU9OfQotc2VjdGlvbiBudW1iZXIgZm91bmQgaW4gTUlQUyBFTEYgaXMgaGFuZGxlZCB2aWEgdGhlIGhvb2tzCi1Ac2FtcHtzZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb259LCBAc2FtcHtzeW1ib2xfcHJvY2Vzc2luZ30sCi1Ac2FtcHthZGRfc3ltYm9sX2hvb2t9LCBhbmQgQHNhbXB7b3V0cHV0X3N5bWJvbF9ob29rfS4KLQotRHluYW1pYyBsaW5raW5nIHN1cHBvcnQsIHdoaWNoIGludm9sdmVzIHByb2Nlc3NvciBzcGVjaWZpYyByZWxvY2F0aW9ucwotcmVxdWlyaW5nIHNwZWNpYWwgaGFuZGxpbmcsIGlzIGFsc28gaW1wbGVtZW50ZWQgdmlhIGhvb2sgZnVuY3Rpb25zLgotCi1Abm9kZSBCRkQgRUxGIGNvcmUgZmlsZXMKLUBzdWJzZWN0aW9uIEJGRCBFTEYgY29yZSBmaWxlcwotQGNpbmRleCBlbGYgY29yZSBmaWxlcwotCi1PbiBuYXRpdmUgRUxGIFVuaXggc3lzdGVtcywgY29yZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIHdpdGhvdXQgYW55Ci1zZWN0aW9ucy4gIEluc3RlYWQsIHRoZXkgb25seSBoYXZlIHByb2dyYW0gc2VnbWVudHMuCi0KLVdoZW4gQkZEIGlzIHVzZWQgdG8gcmVhZCBhbiBFTEYgY29yZSBmaWxlLCB0aGUgQkZEIHNlY3Rpb25zIHdpbGwKLWFjdHVhbGx5IHJlcHJlc2VudCBwcm9ncmFtIHNlZ21lbnRzLiAgU2luY2UgRUxGIHByb2dyYW0gc2VnbWVudHMgZG8gbm90Ci1oYXZlIG5hbWVzLCBCRkQgd2lsbCBpbnZlbnQgbmFtZXMgbGlrZSBAc2FtcHtzZWdtZW50QHZhcntufX0gd2hlcmUKLUB2YXJ7bn0gaXMgYSBudW1iZXIuCi0KLUEgc2luZ2xlIEVMRiBwcm9ncmFtIHNlZ21lbnQgbWF5IGluY2x1ZGUgYm90aCBhbiBpbml0aWFsaXplZCBwYXJ0IGFuZCBhbgotdW5pbml0aWFsaXplZCBwYXJ0LiAgVGhlIHNpemUgb2YgdGhlIGluaXRpYWxpemVkIHBhcnQgaXMgZ2l2ZW4gYnkgdGhlCi1Ac2FtcHtwX2ZpbGVzen0gZmllbGQuICBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgc2VnbWVudCBpcyBnaXZlbiBieSB0aGUKLUBzYW1we3BfbWVtc3p9IGZpZWxkLiAgSWYgQHNhbXB7cF9tZW1zen0gaXMgbGFyZ2VyIHRoYW4gQHNhbXB7cF9maWxlc3p9LAotdGhlbiB0aGUgZXh0cmEgc3BhY2UgaXMgdW5pbml0aWFsaXplZCwgb3IsIG1vcmUgcHJlY2lzZWx5LCBpbml0aWFsaXplZAotdG8gemVyby4KLQotQkZEIHdpbGwgcmVwcmVzZW50IHN1Y2ggYSBwcm9ncmFtIHNlZ21lbnQgYXMgdHdvIGRpZmZlcmVudCBzZWN0aW9ucy4KLVRoZSBmaXJzdCwgbmFtZWQgQHNhbXB7c2VnbWVudEB2YXJ7bn1hfSwgd2lsbCByZXByZXNlbnQgdGhlIGluaXRpYWxpemVkCi1wYXJ0IG9mIHRoZSBwcm9ncmFtIHNlZ21lbnQuICBUaGUgc2Vjb25kLCBuYW1lZCBAc2FtcHtzZWdtZW50QHZhcntufWJ9LAotd2lsbCByZXByZXNlbnQgdGhlIHVuaW5pdGlhbGl6ZWQgcGFydC4KLQotRUxGIGNvcmUgZmlsZXMgc3RvcmUgc3BlY2lhbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlZ2lzdGVyIHZhbHVlcyBpbgotcHJvZ3JhbSBzZWdtZW50cyB3aXRoIHRoZSB0eXBlIEBzYW1we1BUX05PVEV9LiAgQkZEIHdpbGwgYXR0ZW1wdCB0bwotaW50ZXJwcmV0IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBzZWdtZW50cywgYW5kIHdpbGwgY3JlYXRlIGFkZGl0aW9uYWwKLXNlY3Rpb25zIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uLiAgU29tZSBvZiB0aGlzIGludGVycHJldGF0aW9uIHJlcXVpcmVzCi1pbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgaG9zdCBoZWFkZXIgZmlsZSBAZmlsZXtzeXMvcHJvY2ZzLmh9LCBhbmQgc28KLXdpbGwgb25seSB3b3JrIHdoZW4gQkZEIGlzIGJ1aWx0IG9uIGEgbmF0aXZlIHN5c3RlbS4KLQotQkZEIGRvZXMgbm90IGN1cnJlbnRseSBwcm92aWRlIGFueSB3YXkgdG8gY3JlYXRlIGFuIEVMRiBjb3JlIGZpbGUuICBJbgotZ2VuZXJhbCwgQkZEIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gY3JlYXRlIGNvcmUgZmlsZXMuICBUaGUgd2F5IHRvCi1pbXBsZW1lbnQgdGhpcyB3b3VsZCBiZSB0byB3cml0ZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kCi1Ac2FtcHtiZmRfd3JpdGVfY29udGVudHN9IHJvdXRpbmVzIGZvciB0aGUgQHNhbXB7YmZkX2NvcmV9IHR5cGU7IHNlZQotQHJlZntCRkQgdGFyZ2V0IHZlY3RvciBmb3JtYXR9LgotCi1Abm9kZSBCRkQgRUxGIGZ1dHVyZQotQHN1YnNlY3Rpb24gQkZEIEVMRiBmdXR1cmUKLQotVGhlIGN1cnJlbnQgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQgaGFzIHRvbyBtdWNoIGNvZGUgZHVwbGljYXRpb24uCi1XaGlsZSBlYWNoIHByb2Nlc3NvciBoYXMgcGFydGljdWxhciBkaWZmZXJlbmNlcywgbXVjaCBvZiB0aGUgZHluYW1pYwotbGlua2luZyBzdXBwb3J0IGlzIHF1aXRlIHNpbWlsYXIgZm9yIGVhY2ggcHJvY2Vzc29yLiAgVGhlIEdPVCBhbmQgUExUCi1hcmUgaGFuZGxlZCBpbiBmYWlybHkgc2ltaWxhciB3YXlzLCB0aGUgZGV0YWlscyBvZiAtQnN5bWJvbGljIGxpbmtpbmcKLWFyZSBnZW5lcmFsbHkgc2ltaWxhciwgZXRjLiAgVGhpcyBjb2RlIHNob3VsZCBiZSByZXdvcmtlZCB0byB1c2UgbW9yZQotZ2VuZXJpYyBmdW5jdGlvbnMsIGVsaW1pbmF0aW5nIHRoZSBkdXBsaWNhdGlvbi4KLQotU2ltaWxhcmx5LCB0aGUgcmVsb2NhdGlvbiBoYW5kbGluZyBoYXMgdG9vIG11Y2ggZHVwbGljYXRpb24uICBNYW55IG9mCi10aGUgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9IGFuZCBAc2FtcHtpbmZvX3RvX2hvd3RvfSBmdW5jdGlvbnMgYXJlCi1xdWl0ZSBzaW1pbGFyLiAgVGhlIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb25zIGFyZSBhbHNvIG9mdGVuIHF1aXRlCi1zaW1pbGFyLCBib3RoIGluIHRoZSBzdGFuZGFyZCBsaW5rZXIgaGFuZGxpbmcgYW5kIHRoZSBkeW5hbWljIGxpbmtlcgotaGFuZGxpbmcuICBNYW55IG9mIHRoZSBDT0ZGIHByb2Nlc3NvciBzcGVjaWZpYyBiYWNrZW5kcyBzaGFyZSBhIHNpbmdsZQotcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiAoQHNhbXB7X2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbn0pLAotYW5kIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzIGZvciB0aGUgRUxGIHRhcmdldHMKLWFzIHdlbGwuCi0KLVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgbWFnaWMgbnVtYmVyIGluCi1Ac2FtcHtwcmVwX2hlYWRlcnN9IGluIEBmaWxle2VsZi5jfSBpcyBzb21ld2hhdCBib2d1cy4gIEl0IHNob3VsZCBiZQotcG9zc2libGUgdG8gYWRkIHN1cHBvcnQgZm9yIGEgbmV3IHByb2Nlc3NvciB3aXRob3V0IGNoYW5naW5nIHRoZSBnZW5lcmljCi1zdXBwb3J0LgotCi1UaGUgcHJvY2Vzc29yIGZ1bmN0aW9uIGhvb2tzIGFuZCBjb25zdGFudHMgYXJlIGFkIGhvYyBhbmQgbmVlZCBiZXR0ZXIKLWRvY3VtZW50YXRpb24uCi0KLVdoZW4gYSBsaW5rZXIgc2NyaXB0IHVzZXMgQHNhbXB7U0laRU9GX0hFQURFUlN9LCB0aGUgRUxGIGJhY2tlbmQgbXVzdAotZ3Vlc3MgYXQgdGhlIG51bWJlciBvZiBwcm9ncmFtIHNlZ21lbnRzIHdoaWNoIHdpbGwgYmUgcmVxdWlyZWQsIGluCi1Ac2FtcHtnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZX0uICBUaGlzIGlzIGJlY2F1c2UgdGhlIGxpbmtlciBjYWxscwotQHNhbXB7YmZkX3NpemVvZl9oZWFkZXJzfSBiZWZvcmUgaXQga25vd3MgYWxsIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBhbmQKLXNpemVzLiAgVGhlIEVMRiBiYWNrZW5kIG1heSBsYXRlciBkaXNjb3Zlciwgd2hlbiBjcmVhdGluZyBwcm9ncmFtCi1zZWdtZW50cywgdGhhdCBtb3JlIHByb2dyYW0gc2VnbWVudHMgYXJlIHJlcXVpcmVkLiAgVGhpcyBpcyBjdXJyZW50bHkKLXJlcG9ydGVkIGFzIGFuIGVycm9yIGluIEBzYW1we2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHN9LgotCi1JbiBwcmFjdGljZSB0aGlzIG1ha2VzIGl0IGRpZmZpY3VsdCB0byB1c2UgQHNhbXB7U0laRU9GX0hFQURFUlN9IGV4Y2VwdAotd2l0aCBhIGNhcmVmdWxseSBkZWZpbmVkIGxpbmtlciBzY3JpcHQuICBVbmZvcnR1bmF0ZWx5LAotQHNhbXB7U0laRU9GX0hFQURFUlN9IGlzIHJlcXVpcmVkIGZvciBmYXN0IHByb2dyYW0gbG9hZGluZyBvbiBhIG5hdGl2ZQotc3lzdGVtLCBzaW5jZSBpdCBwZXJtaXRzIHRoZSBpbml0aWFsIGNvZGUgc2VjdGlvbiB0byBhcHBlYXIgb24gdGhlIHNhbWUKLXBhZ2UgYXMgdGhlIHByb2dyYW0gc2VnbWVudHMsIHNhdmluZyBhIHBhZ2UgcmVhZCB3aGVuIHRoZSBwcm9ncmFtIHN0YXJ0cwotcnVubmluZy4gIEZvcnR1bmF0ZWx5LCBuYXRpdmUgc3lzdGVtcyBwZXJtaXQgY2FyZWZ1bCBkZWZpbml0aW9uIG9mIHRoZQotbGlua2VyIHNjcmlwdC4gIFN0aWxsLCBpZGVhbGx5IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSByZWxheGF0aW9uIHRvCi1jb21wdXRlIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cy4KLQotQG5vZGUgQkZEIGdsb3NzYXJ5Ci1Ac2VjdGlvbiBCRkQgZ2xvc3NhcnkKLUBjaW5kZXggZ2xvc3NhcnkgZm9yIGJmZAotQGNpbmRleCBiZmQgZ2xvc3NhcnkKLQotVGhpcyBpcyBhIHNob3J0IGdsb3NzYXJ5IG9mIHNvbWUgQkZEIHRlcm1zLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGEub3V0Ci1UaGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIG9yaWdpbmFsIFVuaXggb2JqZWN0IGZpbGUgZm9ybWF0LgotU3RpbGwgdXNlZCBvbiBTdW5PUywgdGhvdWdoIG5vdCBTb2xhcmlzLiAgU3VwcG9ydHMgb25seSB0aHJlZSBzZWN0aW9ucy4KLQotQGl0ZW0gYXJjaGl2ZQotQSBjb2xsZWN0aW9uIG9mIG9iamVjdCBmaWxlcyBwcm9kdWNlZCBhbmQgbWFuaXB1bGF0ZWQgYnkgdGhlIEBzYW1we2FyfQotcHJvZ3JhbS4KLQotQGl0ZW0gYmFja2VuZAotVGhlIGltcGxlbWVudGF0aW9uIHdpdGhpbiBCRkQgb2YgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQotc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBwYXJ0aWN1bGFyIHRhcmdldCB2ZWN0b3IuCi0KLUBpdGVtIEJGRAotVGhlIEJGRCBsaWJyYXJ5IGl0c2VsZi4gIEFsc28sIGVhY2ggb2JqZWN0IGZpbGUsIGFyY2hpdmUsIG9yIGV4ZWN0YWJsZQotb3BlbmVkIGJ5IHRoZSBCRkQgbGlicmFyeSBoYXMgdGhlIHR5cGUgQHNhbXB7YmZkICp9LCBhbmQgaXMgc29tZXRpbWVzCi1yZWZlcnJlZCB0byBhcyBhIGJmZC4KLQotQGl0ZW0gQ09GRgotVGhlIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQuICBVc2VkIG9uIFVuaXggU1ZSMy4gIFVzZWQgYnkgc29tZQotZW1iZWRkZWQgdGFyZ2V0cywgYWx0aG91Z2ggRUxGIGlzIG5vcm1hbGx5IGJldHRlci4KLQotQGl0ZW0gRExMCi1BIHNoYXJlZCBsaWJyYXJ5IG9uIFdpbmRvd3MuCi0KLUBpdGVtIGR5bmFtaWMgbGlua2VyCi1XaGVuIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IGlzIHJ1biwgdGhlIGR5bmFtaWMKLWxpbmtlciB3aWxsIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgc2hhcmVkIGxpYnJhcnkgYW5kIGFycmFuZ2UgdG8gc29tZWhvdwotaW5jbHVkZSBpdCBpbiB0aGUgcnVubmluZyBpbWFnZS4KLQotQGl0ZW0gZHluYW1pYyBvYmplY3QKLUFub3RoZXIgbmFtZSBmb3IgYW4gRUxGIHNoYXJlZCBsaWJyYXJ5LgotCi1AaXRlbSBFQ09GRgotVGhlIEV4dGVuZGVkIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQuICBVc2VkIG9uIEFscGhhIERpZ2l0YWwgVW5peAotKGZvcm1lcmx5IE9TRi8xKSwgYXMgd2VsbCBhcyBVbHRyaXggYW5kIElyaXggNC4gIEEgdmFyaWFudCBvZiBDT0ZGLgotCi1AaXRlbSBFTEYKLVRoZSBFeGVjdXRhYmxlIGFuZCBMaW5raW5nIEZvcm1hdC4gIFRoZSBvYmplY3QgZmlsZSBmb3JtYXQgdXNlZCBvbiBtb3N0Ci1tb2Rlcm4gVW5peCBzeXN0ZW1zLCBpbmNsdWRpbmcgR05VL0xpbnV4LCBTb2xhcmlzLCBJcml4LCBhbmQgU1ZSNC4gIEFsc28KLXVzZWQgb24gbWFueSBlbWJlZGRlZCBzeXN0ZW1zLgotCi1AaXRlbSBleGVjdXRhYmxlCi1BIHByb2dyYW0sIHdpdGggaW5zdHJ1Y3Rpb25zIGFuZCBzeW1ib2xzLCBhbmQgcGVyaGFwcyBkeW5hbWljIGxpbmtpbmcKLWluZm9ybWF0aW9uLiAgTm9ybWFsbHkgcHJvZHVjZWQgYnkgYSBsaW5rZXIuCi0KLUBpdGVtIExNQQotTG9hZCBNZW1vcnkgQWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggYSBzZWN0aW9uIHdpbGwgYmUKLWxvYWRlZC4gIENvbXBhcmUgd2l0aCBWTUEsIGJlbG93LgotCi1AaXRlbSBOTE0KLU5ldFdhcmUgTG9hZGFibGUgTW9kdWxlLiAgVXNlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIGFuIG9iamVjdCB3aGljaAotYmUgbG9hZGVkIGludG8gTmV0V2FyZSwgd2hpY2ggaXMgc29tZSBraW5kIG9mIFBDIGJhc2VkIG5ldHdvcmsgc2VydmVyCi1wcm9ncmFtLgotCi1AaXRlbSBvYmplY3QgZmlsZQotQSBiaW5hcnkgZmlsZSBpbmNsdWRpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbi4gIE5vcm1hbGx5IHByb2R1Y2VkIGJ5IGFuIGFzc2VtYmxlci4KLQotQGl0ZW0gb2JqZWN0IGZpbGUgZm9ybWF0Ci1UaGUgZm9ybWF0IG9mIGFuIG9iamVjdCBmaWxlLiAgVHlwaWNhbGx5IG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMKLWZvciBhIHBhcnRpY3VsYXIgc3lzdGVtIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQsIGFsdGhvdWdoIGV4ZWN1dGFibGVzCi13aWxsIG5vdCBjb250YWluIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCi1AaXRlbSBQRQotVGhlIFBvcnRhYmxlIEV4ZWN1dGFibGUgZm9ybWF0LiAgVGhpcyBpcyB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZWQgZm9yCi1XaW5kb3dzIChzcGVjaWZpY2FsbHksIFdpbjMyKSBvYmplY3QgZmlsZXMuICBJdCBpcyBiYXNlZCBjbG9zZWx5IG9uCi1DT0ZGLCBidXQgaGFzIGEgZmV3IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLgotCi1AaXRlbSBQRUkKLVRoZSBQb3J0YWJsZSBFeGVjdXRhYmxlIEltYWdlIGZvcm1hdC4gIFRoaXMgaXMgdGhlIG9iamVjdCBmaWxlIGZvcm1hdAotdXNlZCBmb3IgV2luZG93cyAoc3BlY2lmaWNhbGx5LCBXaW4zMikgZXhlY3V0YWJsZXMuICBJdCBpcyB2ZXJ5IHNpbWlsYXIKLXRvIFBFLCBidXQgaW5jbHVkZXMgc29tZSBhZGRpdGlvbmFsIGhlYWRlciBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gcmVsb2NhdGlvbnMKLUluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIGxpbmtlciB0byBhZGp1c3Qgc2VjdGlvbiBjb250ZW50cy4gIEFsc28gY2FsbGVkCi1yZWxvY3MuCi0KLUBpdGVtIHNlY3Rpb24KLU9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZSBhcmUgY29tcG9zZWQgb2Ygc2VjdGlvbnMuICBTZWN0aW9ucyBoYXZlCi1vcHRpb25hbCBkYXRhIGFuZCBvcHRpb25hbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCi1AaXRlbSBzaGFyZWQgbGlicmFyeQotQSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB3aGljaCBtYXkgYmUgdXNlZCBieSBtYW55IGV4ZWN1dGFibGVzIHdpdGhvdXQKLWFjdHVhbGx5IGJlaW5nIGxpbmtlZCBpbnRvIGVhY2ggZXhlY3V0YWJsZS4gIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudAotaW1wbGVtZW50YXRpb25zIG9mIHNoYXJlZCBsaWJyYXJpZXMsIGVhY2ggaGF2aW5nIHNsaWdodGx5IGRpZmZlcmVudAotZmVhdHVyZXMuCi0KLUBpdGVtIHN5bWJvbAotRWFjaCBvYmplY3QgZmlsZSBhbmQgZXhlY3V0YWJsZSBtYXkgaGF2ZSBhIGxpc3Qgb2Ygc3ltYm9scywgb2Z0ZW4KLXJlZmVycmVkIHRvIGFzIHRoZSBzeW1ib2wgdGFibGUuICBBIHN5bWJvbCBpcyBiYXNpY2FsbHkgYSBuYW1lIGFuZCBhbgotYWRkcmVzcy4gIFRoZXJlIG1heSBhbHNvIGJlIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlIHRoZSB0eXBlIG9mCi1zeW1ib2wsIGFsdGhvdWdoIHRoZSB0eXBlIG9mIGEgc3ltYm9sIGlzIG5vcm1hbGx5IHNvbWV0aGluZyBzaW1wbGUgbGlrZQotZnVuY3Rpb24gb3Igb2JqZWN0LCBhbmQgc2hvdWxkIGJlIGNvbmZ1c2VkIHdpdGggdGhlIG1vcmUgY29tcGxleCBDCi1ub3Rpb24gb2YgdHlwZS4gIFR5cGljYWxseSBldmVyeSBnbG9iYWwgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGluIGEgQwotcHJvZ3JhbSB3aWxsIGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wuCi0KLUBpdGVtIHRhcmdldCB2ZWN0b3IKLUEgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCi1mb3JtYXQuICBUaGUgQHNhbXB7YmZkX3RhcmdldH0gc3RydWN0dXJlLgotCi1AaXRlbSBXaW4zMgotVGhlIGN1cnJlbnQgV2luZG93cyBBUEksIGltcGxlbWVudGVkIGJ5IFdpbmRvd3MgOTUgYW5kIGxhdGVyIGFuZCBXaW5kb3dzCi1OVCAzLjUxIGFuZCBsYXRlciwgYnV0IG5vdCBieSBXaW5kb3dzIDMuMS4KLQotQGl0ZW0gWENPRkYKLVRoZSBlWHRlbmRlZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBBSVguICBBIHZhcmlhbnQgb2YKLUNPRkYsIHdpdGggYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzeW1ib2wgdGFibGUgaW1wbGVtZW50YXRpb24uCi0KLUBpdGVtIFZNQQotVmlydHVhbCBNZW1vcnkgQWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYSBzZWN0aW9uIHdpbGwgaGF2ZSB3aGVuCi1hbiBleGVjdXRhYmxlIGlzIHJ1bi4gIENvbXBhcmUgd2l0aCBMTUEsIGFib3ZlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWRzZWMgSW5kZXgKLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmRzdW1tLnRleGkgYi9iZmQvZG9jL2JmZHN1bW0udGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0NTMxYS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2JmZHN1bW0udGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi1AYyBUaGlzIHN1bW1hcnkgb2YgQkZEIGlzIHNoYXJlZCBieSB0aGUgQkZEIGFuZCBMRCBkb2NzLgotV2hlbiBhbiBvYmplY3QgZmlsZSBpcyBvcGVuZWQsIEJGRCBzdWJyb3V0aW5lcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZQotdGhlIGZvcm1hdCBvZiB0aGUgaW5wdXQgb2JqZWN0IGZpbGUuICBUaGV5IHRoZW4gYnVpbGQgYSBkZXNjcmlwdG9yIGluCi1tZW1vcnkgd2l0aCBwb2ludGVycyB0byByb3V0aW5lcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhY2Nlc3MgZWxlbWVudHMgb2YKLXRoZSBvYmplY3QgZmlsZSdzIGRhdGEgc3RydWN0dXJlcy4KLQotQXMgZGlmZmVyZW50IGluZm9ybWF0aW9uIGZyb20gdGhlIHRoZSBvYmplY3QgZmlsZXMgaXMgcmVxdWlyZWQsCi1CRkQgcmVhZHMgZnJvbSBkaWZmZXJlbnQgc2VjdGlvbnMgb2YgdGhlIGZpbGUgYW5kIHByb2Nlc3NlcyB0aGVtLgotRm9yIGV4YW1wbGUsIGEgdmVyeSBjb21tb24gb3BlcmF0aW9uIGZvciB0aGUgbGlua2VyIGlzIHByb2Nlc3Npbmcgc3ltYm9sCi10YWJsZXMuICBFYWNoIEJGRCBiYWNrIGVuZCBwcm92aWRlcyBhIHJvdXRpbmUgZm9yIGNvbnZlcnRpbmcKLWJldHdlZW4gdGhlIG9iamVjdCBmaWxlJ3MgcmVwcmVzZW50YXRpb24gb2Ygc3ltYm9scyBhbmQgYW4gaW50ZXJuYWwKLWNhbm9uaWNhbCBmb3JtYXQuIFdoZW4gdGhlIGxpbmtlciBhc2tzIGZvciB0aGUgc3ltYm9sIHRhYmxlIG9mIGFuIG9iamVjdAotZmlsZSwgaXQgY2FsbHMgdGhyb3VnaCBhIG1lbW9yeSBwb2ludGVyIHRvIHRoZSByb3V0aW5lIGZyb20gdGhlCi1yZWxldmFudCBCRkQgYmFjayBlbmQgd2hpY2ggcmVhZHMgYW5kIGNvbnZlcnRzIHRoZSB0YWJsZSBpbnRvIGEgY2Fub25pY2FsCi1mb3JtLiAgVGhlIGxpbmtlciB0aGVuIG9wZXJhdGVzIHVwb24gdGhlIGNhbm9uaWNhbCBmb3JtLiBXaGVuIHRoZSBsaW5rIGlzCi1maW5pc2hlZCBhbmQgdGhlIGxpbmtlciB3cml0ZXMgdGhlIG91dHB1dCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLAotYW5vdGhlciBCRkQgYmFjayBlbmQgcm91dGluZSBpcyBjYWxsZWQgdG8gdGFrZSB0aGUgbmV3bHkKLWNyZWF0ZWQgc3ltYm9sIHRhYmxlIGFuZCBjb252ZXJ0IGl0IGludG8gdGhlIGNob3NlbiBvdXRwdXQgZm9ybWF0LgotCi1AbWVudQotKiBCRkQgaW5mb3JtYXRpb24gbG9zczo6CUluZm9ybWF0aW9uIExvc3MKLSogQ2Fub25pY2FsIGZvcm1hdDo6CQlUaGUgQkZECWNhbm9uaWNhbCBvYmplY3QtZmlsZSBmb3JtYXQgCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIGluZm9ybWF0aW9uIGxvc3MKLUBzdWJzZWN0aW9uIEluZm9ybWF0aW9uIExvc3MKLQotQGVtcGh7SW5mb3JtYXRpb24gY2FuIGJlIGxvc3QgZHVyaW5nIG91dHB1dC59IFRoZSBvdXRwdXQgZm9ybWF0cwotc3VwcG9ydGVkIGJ5IEJGRCBkbyBub3QgcHJvdmlkZSBpZGVudGljYWwgZmFjaWxpdGllcywgYW5kCi1pbmZvcm1hdGlvbiB3aGljaCBjYW4gYmUgZGVzY3JpYmVkIGluIG9uZSBmb3JtIGhhcyBub3doZXJlIHRvIGdvIGluCi1hbm90aGVyIGZvcm1hdC4gT25lIGV4YW1wbGUgb2YgdGhpcyBpcyBhbGlnbm1lbnQgaW5mb3JtYXRpb24gaW4KLUBjb2Rle2Iub3V0fS4gVGhlcmUgaXMgbm93aGVyZSBpbiBhbiBAY29kZXthLm91dH0gZm9ybWF0IGZpbGUgdG8gc3RvcmUKLWFsaWdubWVudCBpbmZvcm1hdGlvbiBvbiB0aGUgY29udGFpbmVkIGRhdGEsIHNvIHdoZW4gYSBmaWxlIGlzIGxpbmtlZAotZnJvbSBAY29kZXtiLm91dH0gYW5kIGFuIEBjb2Rle2Eub3V0fSBpbWFnZSBpcyBwcm9kdWNlZCwgYWxpZ25tZW50Ci1pbmZvcm1hdGlvbiB3aWxsIG5vdCBwcm9wYWdhdGUgdG8gdGhlIG91dHB1dCBmaWxlLiAoVGhlIGxpbmtlciB3aWxsCi1zdGlsbCB1c2UgdGhlIGFsaWdubWVudCBpbmZvcm1hdGlvbiBpbnRlcm5hbGx5LCBzbyB0aGUgbGluayBpcyBwZXJmb3JtZWQKLWNvcnJlY3RseSkuCi0KLUFub3RoZXIgZXhhbXBsZSBpcyBDT0ZGIHNlY3Rpb24gbmFtZXMuIENPRkYgZmlsZXMgbWF5IGNvbnRhaW4gYW4KLXVubGltaXRlZCBudW1iZXIgb2Ygc2VjdGlvbnMsIGVhY2ggb25lIHdpdGggYSB0ZXh0dWFsIHNlY3Rpb24gbmFtZS4gSWYKLXRoZSB0YXJnZXQgb2YgdGhlIGxpbmsgaXMgYSBmb3JtYXQgd2hpY2ggZG9lcyBub3QgaGF2ZSBtYW55IHNlY3Rpb25zIChlLmcuLAotQGNvZGV7YS5vdXR9KSBvciBoYXMgc2VjdGlvbnMgd2l0aG91dCBuYW1lcyAoZS5nLiwgdGhlIE9hc3lzIGZvcm1hdCksIHRoZQotbGluayBjYW5ub3QgYmUgZG9uZSBzaW1wbHkuIFlvdSBjYW4gY2lyY3VtdmVudCB0aGlzIHByb2JsZW0gYnkKLWRlc2NyaWJpbmcgdGhlIGRlc2lyZWQgaW5wdXQtdG8tb3V0cHV0IHNlY3Rpb24gbWFwcGluZyB3aXRoIHRoZSBsaW5rZXIgY29tbWFuZAotbGFuZ3VhZ2UuCi0KLUBlbXBoe0luZm9ybWF0aW9uIGNhbiBiZSBsb3N0IGR1cmluZyBjYW5vbmljYWxpemF0aW9uLn0gVGhlIEJGRAotaW50ZXJuYWwgY2Fub25pY2FsIGZvcm0gb2YgdGhlIGV4dGVybmFsIGZvcm1hdHMgaXMgbm90IGV4aGF1c3RpdmU7IHRoZXJlCi1hcmUgc3RydWN0dXJlcyBpbiBpbnB1dCBmb3JtYXRzIGZvciB3aGljaCB0aGVyZSBpcyBubyBkaXJlY3QKLXJlcHJlc2VudGF0aW9uIGludGVybmFsbHkuICBUaGlzIG1lYW5zIHRoYXQgdGhlIEJGRCBiYWNrIGVuZHMKLWNhbm5vdCBtYWludGFpbiBhbGwgcG9zc2libGUgZGF0YSByaWNobmVzcyB0aHJvdWdoIHRoZSB0cmFuc2Zvcm1hdGlvbgotYmV0d2VlbiBleHRlcm5hbCB0byBpbnRlcm5hbCBhbmQgYmFjayB0byBleHRlcm5hbCBmb3JtYXRzLgotCi1UaGlzIGxpbWl0YXRpb24gaXMgb25seSBhIHByb2JsZW0gd2hlbiBhbiBhcHBsaWNhdGlvbiByZWFkcyBvbmUKLWZvcm1hdCBhbmQgd3JpdGVzIGFub3RoZXIuICBFYWNoIEJGRCBiYWNrIGVuZCBpcyByZXNwb25zaWJsZSBmb3IKLW1haW50YWluaW5nIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHRoZSBpbnRlcm5hbCBCRkQKLWNhbm9uaWNhbCBmb3JtIGhhcyBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBvcGFxdWUgdG8gdGhlIEJGRCBjb3JlLAotYW5kIGV4cG9ydGVkIG9ubHkgdG8gdGhlIGJhY2sgZW5kcy4gV2hlbiBhIGZpbGUgaXMgcmVhZCBpbiBvbmUgZm9ybWF0LAotdGhlIGNhbm9uaWNhbCBmb3JtIGlzIGdlbmVyYXRlZCBmb3IgQkZEIGFuZCB0aGUgYXBwbGljYXRpb24uIEF0IHRoZQotc2FtZSB0aW1lLCB0aGUgYmFjayBlbmQgc2F2ZXMgYXdheSBhbnkgaW5mb3JtYXRpb24gd2hpY2ggbWF5IG90aGVyd2lzZQotYmUgbG9zdC4gSWYgdGhlIGRhdGEgaXMgdGhlbiB3cml0dGVuIGJhY2sgaW4gdGhlIHNhbWUgZm9ybWF0LCB0aGUgYmFjawotZW5kIHJvdXRpbmUgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgY2Fub25pY2FsIGZvcm0gcHJvdmlkZWQgYnkgdGhlCi1CRkQgY29yZSBhcyB3ZWxsIGFzIHRoZSBpbmZvcm1hdGlvbiBpdCBwcmVwYXJlZCBlYXJsaWVyLiAgU2luY2UKLXRoZXJlIGlzIGEgZ3JlYXQgZGVhbCBvZiBjb21tb25hbGl0eSBiZXR3ZWVuIGJhY2sgZW5kcywKLXRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIGxvc3Qgd2hlbgotbGlua2luZyBvciBjb3B5aW5nIGJpZyBlbmRpYW4gQ09GRiB0byBsaXR0bGUgZW5kaWFuIENPRkYsIG9yIEBjb2Rle2Eub3V0fSB0bwotQGNvZGV7Yi5vdXR9LiAgV2hlbiBhIG1peHR1cmUgb2YgZm9ybWF0cyBpcyBsaW5rZWQsIHRoZSBpbmZvcm1hdGlvbiBpcwotb25seSBsb3N0IGZyb20gdGhlIGZpbGVzIHdob3NlIGZvcm1hdCBkaWZmZXJzIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotCi1Abm9kZSBDYW5vbmljYWwgZm9ybWF0Ci1Ac3Vic2VjdGlvbiBUaGUgQkZEIGNhbm9uaWNhbCBvYmplY3QtZmlsZSBmb3JtYXQKLQotVGhlIGdyZWF0ZXN0IHBvdGVudGlhbCBmb3IgbG9zcyBvZiBpbmZvcm1hdGlvbiBvY2N1cnMgd2hlbiB0aGVyZSBpcyB0aGUgbGVhc3QKLW92ZXJsYXAgYmV0d2VlbiB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBmb3JtYXQsIHRoYXQKLXN0b3JlZCBieSB0aGUgY2Fub25pY2FsIGZvcm1hdCwgYW5kIHRoYXQgbmVlZGVkIGJ5IHRoZQotZGVzdGluYXRpb24gZm9ybWF0LiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBjYW5vbmljYWwgZm9ybSBtYXkgaGVscAoteW91IHVuZGVyc3RhbmQgd2hpY2gga2luZHMgb2YgZGF0YSB5b3UgY2FuIGNvdW50IG9uIHByZXNlcnZpbmcgYWNyb3NzCi1jb252ZXJzaW9ucy4KLUBjaW5kZXggQkZEIGNhbm9uaWNhbCBmb3JtYXQKLUBjaW5kZXggaW50ZXJuYWwgb2JqZWN0LWZpbGUgZm9ybWF0Ci0KLUB0YWJsZSBAZW1waAotQGl0ZW0gZmlsZXMKLUluZm9ybWF0aW9uIHN0b3JlZCBvbiBhIHBlci1maWxlIGJhc2lzIGluY2x1ZGVzIHRhcmdldCBtYWNoaW5lCi1hcmNoaXRlY3R1cmUsIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZm9ybWF0IHR5cGUsIGEgZGVtYW5kIHBhZ2VhYmxlCi1iaXQsIGFuZCBhIHdyaXRlIHByb3RlY3RlZCBiaXQuICBJbmZvcm1hdGlvbiBsaWtlIFVuaXggbWFnaWMgbnVtYmVycyBpcwotbm90IHN0b3JlZCBoZXJlLS0tb25seSB0aGUgbWFnaWMgbnVtYmVycycgbWVhbmluZywgc28gYSBAY29kZXtaTUFHSUN9Ci1maWxlIHdvdWxkIGhhdmUgYm90aCB0aGUgZGVtYW5kIHBhZ2VhYmxlIGJpdCBhbmQgdGhlIHdyaXRlIHByb3RlY3RlZAotdGV4dCBiaXQgc2V0LiAgVGhlIGJ5dGUgb3JkZXIgb2YgdGhlIHRhcmdldCBpcyBzdG9yZWQgb24gYSBwZXItZmlsZQotYmFzaXMsIHNvIHRoYXQgYmlnLSBhbmQgbGl0dGxlLWVuZGlhbiBvYmplY3QgZmlsZXMgbWF5IGJlIHVzZWQgd2l0aCBvbmUKLWFub3RoZXIuCi0KLUBpdGVtIHNlY3Rpb25zCi1FYWNoIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24sIHRoZQotc2VjdGlvbidzIG9yaWdpbmFsIGFkZHJlc3MgaW4gdGhlIG9iamVjdCBmaWxlLCBzaXplIGFuZCBhbGlnbm1lbnQKLWluZm9ybWF0aW9uLCB2YXJpb3VzIGZsYWdzLCBhbmQgcG9pbnRlcnMgaW50byBvdGhlciBCRkQgZGF0YQotc3RydWN0dXJlcy4KLQotQGl0ZW0gc3ltYm9scwotRWFjaCBzeW1ib2wgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG9iamVjdCBmaWxlCi13aGljaCBvcmlnaW5hbGx5IGRlZmluZWQgaXQsIGl0cyBuYW1lLCBpdHMgdmFsdWUsIGFuZCB2YXJpb3VzIGZsYWcKLWJpdHMuICBXaGVuIGEgQkZEIGJhY2sgZW5kIHJlYWRzIGluIGEgc3ltYm9sIHRhYmxlLCBpdCByZWxvY2F0ZXMgYWxsCi1zeW1ib2xzIHRvIG1ha2UgdGhlbSByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiB0aGUgc2VjdGlvbiB3aGVyZSB0aGV5IHdlcmUKLWRlZmluZWQuICBEb2luZyB0aGlzIGVuc3VyZXMgdGhhdCBlYWNoIHN5bWJvbCBwb2ludHMgdG8gaXRzIGNvbnRhaW5pbmcKLXNlY3Rpb24uICBFYWNoIHN5bWJvbCBhbHNvIGhhcyBhIHZhcnlpbmcgYW1vdW50IG9mIGhpZGRlbiBwcml2YXRlIGRhdGEKLWZvciB0aGUgQkZEIGJhY2sgZW5kLiAgU2luY2UgdGhlIHN5bWJvbCBwb2ludHMgdG8gdGhlIG9yaWdpbmFsIGZpbGUsIHRoZQotcHJpdmF0ZSBkYXRhIGZvcm1hdCBmb3IgdGhhdCBzeW1ib2wgaXMgYWNjZXNzaWJsZS4gIEBjb2Rle2xkfSBjYW4KLW9wZXJhdGUgb24gYSBjb2xsZWN0aW9uIG9mIHN5bWJvbHMgb2Ygd2lsZGx5IGRpZmZlcmVudCBmb3JtYXRzIHdpdGhvdXQKLXByb2JsZW1zLgotCi1Ob3JtYWwgZ2xvYmFsIGFuZCBzaW1wbGUgbG9jYWwgc3ltYm9scyBhcmUgbWFpbnRhaW5lZCBvbiBvdXRwdXQsIHNvIGFuCi1vdXRwdXQgZmlsZSAobm8gbWF0dGVyIGl0cyBmb3JtYXQpIHdpbGwgcmV0YWluIHN5bWJvbHMgcG9pbnRpbmcgdG8KLWZ1bmN0aW9ucyBhbmQgdG8gZ2xvYmFsLCBzdGF0aWMsIGFuZCBjb21tb24gdmFyaWFibGVzLiAgU29tZSBzeW1ib2wKLWluZm9ybWF0aW9uIGlzIG5vdCB3b3J0aCByZXRhaW5pbmc7IGluIEBjb2Rle2Eub3V0fSwgdHlwZSBpbmZvcm1hdGlvbiBpcwotc3RvcmVkIGluIHRoZSBzeW1ib2wgdGFibGUgYXMgbG9uZyBzeW1ib2wgbmFtZXMuICBUaGlzIGluZm9ybWF0aW9uIHdvdWxkCi1iZSB1c2VsZXNzIHRvIG1vc3QgQ09GRiBkZWJ1Z2dlcnM7IHRoZSBsaW5rZXIgaGFzIGNvbW1hbmQgbGluZSBzd2l0Y2hlcwotdG8gYWxsb3cgdXNlcnMgdG8gdGhyb3cgaXQgYXdheS4KLQotVGhlcmUgaXMgb25lIHdvcmQgb2YgdHlwZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIHN5bWJvbCwgc28gaWYgdGhlCi1mb3JtYXQgc3VwcG9ydHMgc3ltYm9sIHR5cGUgaW5mb3JtYXRpb24gd2l0aGluIHN5bWJvbHMgKGZvciBleGFtcGxlLCBDT0ZGLAotSUVFRSwgT2FzeXMpIGFuZCB0aGUgdHlwZSBpcyBzaW1wbGUgZW5vdWdoIHRvIGZpdCB3aXRoaW4gb25lIHdvcmQKLShuZWFybHkgZXZlcnl0aGluZyBidXQgYWdncmVnYXRlcyksIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHByZXNlcnZlZC4KLQotQGl0ZW0gcmVsb2NhdGlvbiBsZXZlbAotRWFjaCBjYW5vbmljYWwgQkZEIHJlbG9jYXRpb24gcmVjb3JkIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sIHRvCi1yZWxvY2F0ZSB0bywgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWxvY2F0ZSwgdGhlIHNlY3Rpb24gdGhlIGRhdGEKLWlzIGluLCBhbmQgYSBwb2ludGVyIHRvIGEgcmVsb2NhdGlvbiB0eXBlIGRlc2NyaXB0b3IuIFJlbG9jYXRpb24gaXMKLXBlcmZvcm1lZCBieSBwYXNzaW5nIG1lc3NhZ2VzIHRocm91Z2ggdGhlIHJlbG9jYXRpb24gdHlwZQotZGVzY3JpcHRvciBhbmQgdGhlIHN5bWJvbCBwb2ludGVyLiBUaGVyZWZvcmUsIHJlbG9jYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQKLW9uIG91dHB1dCBkYXRhIHVzaW5nIGEgcmVsb2NhdGlvbiBtZXRob2QgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBvbmUgb2YgdGhlCi1pbnB1dCBmb3JtYXRzLiBGb3IgaW5zdGFuY2UsIE9hc3lzIHByb3ZpZGVzIGEgYnl0ZSByZWxvY2F0aW9uIGZvcm1hdC4KLUEgcmVsb2NhdGlvbiByZWNvcmQgcmVxdWVzdGluZyB0aGlzIHJlbG9jYXRpb24gdHlwZSB3b3VsZCBwb2ludAotaW5kaXJlY3RseSB0byBhIHJvdXRpbmUgdG8gcGVyZm9ybSB0aGlzLCBzbyB0aGUgcmVsb2NhdGlvbiBtYXkgYmUKLXBlcmZvcm1lZCBvbiBhIGJ5dGUgYmVpbmcgd3JpdHRlbiB0byBhIDY4ayBDT0ZGIGZpbGUsIGV2ZW4gdGhvdWdoIDY4ayBDT0ZGCi1oYXMgbm8gc3VjaCByZWxvY2F0aW9uIHR5cGUuCi0KLUBpdGVtIGxpbmUgbnVtYmVycwotT2JqZWN0IGZvcm1hdHMgY2FuIGNvbnRhaW4sIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvbWUgZm9ybSBvZiBtYXBwaW5nCi1iZXR3ZWVuIHN5bWJvbHMsIHNvdXJjZSBsaW5lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMgaW4gdGhlIG91dHB1dCBmaWxlLgotVGhlc2UgYWRkcmVzc2VzIGhhdmUgdG8gYmUgcmVsb2NhdGVkIGFsb25nIHdpdGggdGhlIHN5bWJvbCBpbmZvcm1hdGlvbi4KLUVhY2ggc3ltYm9sIHdpdGggYW4gYXNzb2NpYXRlZCBsaXN0IG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgcG9pbnRzIHRvIHRoZQotZmlyc3QgcmVjb3JkIG9mIHRoZSBsaXN0LiAgVGhlIGhlYWQgb2YgYSBsaW5lIG51bWJlciBsaXN0IGNvbnNpc3RzIG9mIGEKLXBvaW50ZXIgdG8gdGhlIHN5bWJvbCwgd2hpY2ggYWxsb3dzIGZpbmRpbmcgb3V0IHRoZSBhZGRyZXNzIG9mIHRoZQotZnVuY3Rpb24gd2hvc2UgbGluZSBudW1iZXIgaXMgYmVpbmcgZGVzY3JpYmVkLiBUaGUgcmVzdCBvZiB0aGUgbGlzdCBpcwotbWFkZSB1cCBvZiBwYWlyczogb2Zmc2V0cyBpbnRvIHRoZSBzZWN0aW9uIGFuZCBsaW5lIG51bWJlcnMuIEFueSBmb3JtYXQKLXdoaWNoIGNhbiBzaW1wbHkgZGVyaXZlIHRoaXMgaW5mb3JtYXRpb24gY2FuIHBhc3MgaXQgc3VjY2Vzc2Z1bGx5Ci1iZXR3ZWVuIGZvcm1hdHMgKENPRkYsIElFRUUgYW5kIE9hc3lzKS4KLUBlbmQgdGFibGUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvY2hldy5jIGIvYmZkL2RvYy9jaGV3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYTY5YzIuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9jaGV3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc5ICswLDAgQEAKLS8qIGNoZXcKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBzdGV2ZSBjaGFtYmVybGFpbiBAY3lnbnVzCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogWWV0IGFub3RoZXIgd2F5IG9mIGV4dHJhY3RpbmcgZG9jdW1lbnRhdGlvbiBmcm9tIHNvdXJjZS4KLSAgIE5vLCBJIGhhdmVuJ3QgZmluaXNoZWQgaXQgeWV0LCBidXQgSSBob3BlIHlvdSBwZW9wbGUgbGlrZSBpdCBiZXR0ZXIKLSAgIHRoYW4gdGhlIG9sZCB3YXkKLSAgCi0gICBzYWMKLQotICAgQmFzaWNhbGx5LCB0aGlzIGlzIGEgc29ydCBvZiBzdHJpbmcgZm9ydGgsIG1heWJlIHdlIHNob3VsZCBjYWxsIGl0Ci0gICBzdHJ1dGg/Ci0KLSAgIFlvdSBkZWZpbmUgbmV3IHdvcmRzIHRodXM6Ci0gICA6IDxuZXd3b3JkPiA8b2xkd29yZHM+IDsKLQotKi8KLQotLyogUHJpbWl0aXZlcyBwcm92aWRlZCBieSB0aGUgcHJvZ3JhbToKLQotICAgVHdvIHN0YWNrcyBhcmUgcHJvdmlkZWQsIGEgc3RyaW5nIHN0YWNrIGFuZCBhbiBpbnRlZ2VyIHN0YWNrLgotCi0gICBJbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXM6Ci0JaW50ZXJuYWxfd2FudGVkIC0gaW5kaWNhdGVzIHdoZXRoZXIgYC1pJyB3YXMgcGFzc2VkCi0JaW50ZXJuYWxfbW9kZSAtIHVzZXItc2V0dGFibGUKLQotICAgQ29tbWFuZHM6Ci0JcHVzaF90ZXh0Ci0JISAtIHBvcCB0b3Agb2YgaW50ZWdlciBzdGFjayBmb3IgYWRkcmVzcywgcG9wIG5leHQgZm9yIHZhbHVlOyBzdG9yZQotCUAgLSB0cmVhdCB2YWx1ZSBvbiBpbnRlZ2VyIHN0YWNrIGFzIHRoZSBhZGRyZXNzIG9mIGFuIGludGVnZXI7IHB1c2gKLQkJdGhhdCBpbnRlZ2VyIG9uIHRoZSBpbnRlZ2VyIHN0YWNrIGFmdGVyIHBvcHBpbmcgdGhlICJhZGRyZXNzIgotCWhlbGxvIC0gcHJpbnQgImhlbGxvXG4iIHRvIHN0ZG91dAotCXN0ZG91dCAtIHB1dCBzdGRvdXQgbWFya2VyIG9uIFRPUwotCXN0ZGVyciAtIHB1dCBzdGRlcnIgbWFya2VyIG9uIFRPUwotCXByaW50IC0gcHJpbnQgVE9TLTEgb24gVE9TIChlZzogImhlbGxvXG4iIHN0ZG91dCBwcmludCkKLQlza2lwX3Bhc3RfbmV3bGluZQotCWNhdHN0ciAtIGZuIGljYXRzdHIKLQljb3B5X3Bhc3RfbmV3bGluZSAtIGFwcGVuZCBpbnB1dCwgdXAgdG8gYW5kIGluY2x1ZGluZyBuZXdsaW5lIGludG8gVE9TCi0JZHVwIC0gZm4gb3RoZXJfZHVwCi0JZHJvcCAtIGRpc2NhcmQgVE9TCi0JaWRyb3AgLSBkaXR0bwotCXJlbWNoYXIgLSBkZWxldGUgbGFzdCBjaGFyYWN0ZXIgZnJvbSBUT1MKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCWRvX2ZhbmN5X3N0dWZmIC0gdHJhbnNsYXRlIDw8Zm9vPj4gdG8gQGNvZGV7Zm9vfSBpbiBUT1MKLQlidWxsZXRpemUgLSBpZiAibyIgbGluZXMgZm91bmQsIHByZXBlbmQgQGl0ZW1pemUgQGJ1bGxldCB0byBUT1MKLQkJYW5kIEBpdGVtIHRvIGVhY2ggIm8iIGxpbmU7IGFwcGVuZCBAZW5kIGl0ZW1pemUKLQljb3VyaWVyaXplIC0gcHV0IEBleGFtcGxlIGFyb3VuZCAuIGFuZCB8IGxpbmVzLCB0cmFuc2xhdGUgeyogKn0geyB9Ci0JZXhpdCAtIGZuIGNoZXdfZXhpdAotCXN3YXAKLQlvdXRwdXRkb3RzIC0gc3RyaXAgb3V0IGxpbmVzIHdpdGhvdXQgbGVhZGluZyBkb3RzCi0JcGFyYW1zdHVmZiAtIGNvbnZlcnQgZnVsbCBkZWNsYXJhdGlvbiBpbnRvICJQQVJBTVMiIGZvcm0gaWYgbm90IGFscmVhZHkKLQltYXliZWNhdHN0ciAtIGRvIGNhdHN0ciBpZiBpbnRlcm5hbF9tb2RlID09IGludGVybmFsX3dhbnRlZCwgZGlzY2FyZAotCQl2YWx1ZSBpbiBhbnkgY2FzZQotCXRyYW5zbGF0ZWNvbW1lbnRzIC0gdHVybiB7KiBhbmQgKn0gaW50byBjb21tZW50IGRlbGltaXRlcnMKLQlraWxsX2JvZ3VzX2xpbmVzIC0gZ2V0IHJpZCBvZiBleHRyYSBuZXdsaW5lcwotCWluZGVudAotCWludGVybmFsbW9kZSAtIHBvcCBmcm9tIGludGVnZXIgc3RhY2ssIHNldCBgaW50ZXJuYWxtb2RlJyB0byB0aGF0IHZhbHVlCi0JcHJpbnRfc3RhY2tfbGV2ZWwgLSBwcmludCBjdXJyZW50IHN0YWNrIGRlcHRoIHRvIHN0ZGVycgotCXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIC0gZ28gYWhlYWQsIGd1ZXNzLi4uCi0JW3F1b3RlZCBzdHJpbmddIC0gcHVzaCBzdHJpbmcgb250byBzdHJpbmcgc3RhY2sKLQlbd29yZCBzdGFydGluZyB3aXRoIGRpZ2l0XSAtIHB1c2ggYXRvbChzdHIpIG9udG8gaW50ZWdlciBzdGFjawotCi0gICBBIGNvbW1hbmQgbXVzdCBiZSBhbGwgdXBwZXItY2FzZSwgYW5kIGFsb25lIG9uIGEgbGluZS4KLQotICAgRm9vLiAgKi8KLQotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNkZWZpbmUgREVGX1NJWkUgNTAwMAotI2RlZmluZSBTVEFDSyA1MAotCi1pbnQgaW50ZXJuYWxfd2FudGVkOwotaW50IGludGVybmFsX21vZGU7Ci0KLWludCB3YXJuaW5nOwotCi0vKiBIZXJlIGlzIGEgc3RyaW5nIHR5cGUgLi4uICovCi0KLXR5cGVkZWYgc3RydWN0IGJ1ZmZlciAKLXsKLSAgY2hhciAqcHRyOwotICB1bnNpZ25lZCBsb25nIHdyaXRlX2lkeDsKLSAgdW5zaWduZWQgbG9uZyBzaXplOwotfSBzdHJpbmdfdHlwZTsKLQotCi0jaWZkZWYgX19TVERDX18KLXN0YXRpYyB2b2lkIGluaXRfc3RyaW5nX3dpdGhfc2l6ZSAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGluaXRfc3RyaW5nIChzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyBpbnQgZmluZCAoc3RyaW5nX3R5cGUgKiwgY2hhciAqKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2J1ZmZlciAoc3RyaW5nX3R5cGUgKiwgRklMRSAqKTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV9zdHJpbmcgKHN0cmluZ190eXBlICopOwotc3RhdGljIGNoYXIgKmFkZHIgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgY2hhciBhdCAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGNhdGNoYXIgKHN0cmluZ190eXBlICosIGludCk7Ci1zdGF0aWMgdm9pZCBvdmVyd3JpdGVfc3RyaW5nIChzdHJpbmdfdHlwZSAqLCBzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIGNhdGJ1ZiAoc3RyaW5nX3R5cGUgKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIHZvaWQgY2F0dGV4dCAoc3RyaW5nX3R5cGUgKiwgY2hhciAqKTsKLXN0YXRpYyB2b2lkIGNhdHN0ciAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZCBERUZVTihpbml0X3N0cmluZ193aXRoX3NpemUsKGJ1ZmZlciwgc2l6ZSksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICB1bnNpZ25lZCBpbnQgc2l6ZSApCi17Ci0gICAgYnVmZmVyLT53cml0ZV9pZHggPSAwOwotICAgIGJ1ZmZlci0+c2l6ZSA9IHNpemU7Ci0gICAgYnVmZmVyLT5wdHIgPSBtYWxsb2Moc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGluaXRfc3RyaW5nLChidWZmZXIpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIpCi17Ci0gICAgaW5pdF9zdHJpbmdfd2l0aF9zaXplKGJ1ZmZlciwgREVGX1NJWkUpOwotCi19Ci0KLXN0YXRpYyBpbnQgREVGVU4oZmluZCwgKHN0ciwgd2hhdCksCi0JICBzdHJpbmdfdHlwZSAqc3RyIEFORAotCSAgY2hhciAqd2hhdCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBjaGFyICpwOwotICAgIHAgPSB3aGF0OwotICAgIGZvciAoaSA9IDA7IGkgPCBzdHItPndyaXRlX2lkeCAmJiAqcDsgaSsrKSAKLSAgICB7Ci0JaWYgKCpwID09IHN0ci0+cHRyW2ldKQotCSBwKys7Ci0JZWxzZQotCSBwID0gd2hhdDsKLSAgICB9Ci0gICAgcmV0dXJuICgqcCA9PSAwKTsKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgREVGVU4od3JpdGVfYnVmZmVyLChidWZmZXIsIGYpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgRklMRSAqZikKLXsKLSAgICBmd3JpdGUoYnVmZmVyLT5wdHIsIGJ1ZmZlci0+d3JpdGVfaWR4LCAxLCBmKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBERUZVTihkZWxldGVfc3RyaW5nLChidWZmZXIpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIpCi17Ci0gICAgZnJlZShidWZmZXItPnB0cik7Ci19Ci0KLQotc3RhdGljIGNoYXIgKkRFRlVOKGFkZHIsIChidWZmZXIsIGlkeCksCi0JICAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gICAgcmV0dXJuIGJ1ZmZlci0+cHRyICsgaWR4OwotfQotCi1zdGF0aWMgY2hhciBERUZVTihhdCwoYnVmZmVyLCBwb3MpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgdW5zaWduZWQgaW50IHBvcykgCi17Ci0gIGlmIChwb3MgPj0gYnVmZmVyLT53cml0ZV9pZHgpIAotICAgIHJldHVybiAwOwotICByZXR1cm4gYnVmZmVyLT5wdHJbcG9zXTsKLX0KLQotc3RhdGljIHZvaWQgREVGVU4oY2F0Y2hhciwoYnVmZmVyLCBjaCksIAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgaW50IGNoKQotewotICBpZiAoYnVmZmVyLT53cml0ZV9pZHggPT0gYnVmZmVyLT5zaXplKSAKLSAgICB7Ci0gICAgICBidWZmZXItPnNpemUgKj0yOwotICAgICAgYnVmZmVyLT5wdHIgPSByZWFsbG9jKGJ1ZmZlci0+cHRyLCBidWZmZXItPnNpemUpOwotICAgIH0KLQotICBidWZmZXItPnB0cltidWZmZXItPndyaXRlX2lkeCArKyBdID0gY2g7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4ob3ZlcndyaXRlX3N0cmluZywoZHN0LCAgIHNyYyksCi0JICAgc3RyaW5nX3R5cGUgKmRzdCBBTkQKLQkgICBzdHJpbmdfdHlwZSAqc3JjKQotewotICAgIGZyZWUoZHN0LT5wdHIpOwotICAgIGRzdC0+c2l6ZSA9IHNyYy0+c2l6ZTsKLSAgICBkc3QtPndyaXRlX2lkeCA9IHNyYy0+d3JpdGVfaWR4OwotICAgIGRzdC0+cHRyID0gc3JjLT5wdHI7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdGJ1ZiwoYnVmZmVyLCBidWYsIGxlbiksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICBjaGFyICpidWYgQU5ECi0JICAgdW5zaWduZWQgaW50IGxlbikKLXsKLSAgaWYgKGJ1ZmZlci0+d3JpdGVfaWR4ICsgbGVuID49IGJ1ZmZlci0+c2l6ZSkKLSAgICB7Ci0gICAgICB3aGlsZSAoYnVmZmVyLT53cml0ZV9pZHggKyBsZW4gPj0gYnVmZmVyLT5zaXplKQotCWJ1ZmZlci0+c2l6ZSAqPSAyOwotICAgICAgYnVmZmVyLT5wdHIgPSByZWFsbG9jIChidWZmZXItPnB0ciwgYnVmZmVyLT5zaXplKTsKLSAgICB9Ci0gIG1lbWNweSAoYnVmZmVyLT5wdHIgKyBidWZmZXItPndyaXRlX2lkeCwgYnVmLCBsZW4pOwotICBidWZmZXItPndyaXRlX2lkeCArPSBsZW47Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdHRleHQsKGJ1ZmZlciwgc3RyaW5nKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIGNoYXIgKnN0cmluZykKLXsKLSAgY2F0YnVmIChidWZmZXIsIHN0cmluZywgKHVuc2lnbmVkIGludCkgc3RybGVuIChzdHJpbmcpKTsKLX0KLQotc3RhdGljIHZvaWQgREVGVU4oY2F0c3RyLChkc3QsIHNyYyksCi0JICAgc3RyaW5nX3R5cGUgKmRzdCBBTkQKLQkgICBzdHJpbmdfdHlwZSAqc3JjKQotewotICBjYXRidWYgKGRzdCwgc3JjLT5wdHIsIHNyYy0+d3JpdGVfaWR4KTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IAotREVGVU4oc2tpcF93aGl0ZV9hbmRfc3RhcnMsKHNyYywgaWR4KSwKLSAgICAgIHN0cmluZ190eXBlICpzcmMgQU5ECi0gICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICBjaGFyIGM7Ci0gIHdoaWxlICgoYyA9IGF0KHNyYyxpZHgpKSwKLQkgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpCi0JIHx8IChjID09ICcqJwotCSAgICAgLyogRG9uJ3Qgc2tpcCBwYXN0IGVuZC1vZi1jb21tZW50IG9yIHN0YXIgYXMgZmlyc3QKLQkJY2hhcmFjdGVyIG9uIGl0cyBsaW5lLiAgKi8KLQkgICAgICYmIGF0KHNyYyxpZHggKzEpICE9ICcvJwotCSAgICAgJiYgYXQoc3JjLGlkeCAtMSkgIT0gJ1xuJykpIAotICAgIGlkeCsrOwotICByZXR1cm4gaWR4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RyaW5nX3R5cGUgc3RhY2tbU1RBQ0tdOwotc3RyaW5nX3R5cGUgKnRvczsKLQotdW5zaWduZWQgaW50IGlkeCA9IDA7IC8qIFBvcyBpbiBpbnB1dCBidWZmZXIgKi8KLXN0cmluZ190eXBlICpwdHI7IC8qIGFuZCB0aGUgYnVmZmVyICovCi10eXBlZGVmIHZvaWQgKCpzdGluc3RfdHlwZSkoKTsKLXN0aW5zdF90eXBlICpwYzsKLXN0aW5zdF90eXBlIHNzdGFja1tTVEFDS107Ci1zdGluc3RfdHlwZSAqc3NwID0gJnNzdGFja1swXTsKLWxvbmcgaXN0YWNrW1NUQUNLXTsKLWxvbmcgKmlzcCA9ICZpc3RhY2tbMF07Ci0KLXR5cGVkZWYgaW50ICp3b3JkX3R5cGU7Ci0KLQotCi1zdHJ1Y3QgZGljdF9zdHJ1Y3QKLXsKLSAgICBjaGFyICp3b3JkOwotICAgIHN0cnVjdCBkaWN0X3N0cnVjdCAqbmV4dDsKLSAgICBzdGluc3RfdHlwZSAqY29kZTsKLSAgICBpbnQgY29kZV9sZW5ndGg7Ci0gICAgaW50IGNvZGVfZW5kOwotICAgIGludCB2YXI7Ci0gICAgCi19OwotdHlwZWRlZiBzdHJ1Y3QgZGljdF9zdHJ1Y3QgZGljdF90eXBlOwotI2RlZmluZSBXT1JEKHgpIHN0YXRpYyB2b2lkIHgoKQotCi1zdGF0aWMgdm9pZAotZGllIChtc2cpCi0gICAgIGNoYXIgKm1zZzsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIG1zZyk7Ci0gIGV4aXQgKDEpOwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfcmFuZ2UgKCkKLXsKLSAgaWYgKHRvcyA8IHN0YWNrKQotICAgIGRpZSAoInVuZGVyZmxvdyBpbiBzdHJpbmcgc3RhY2siKTsKLSAgaWYgKHRvcyA+PSBzdGFjayArIFNUQUNLKQotICAgIGRpZSAoIm92ZXJmbG93IGluIHN0cmluZyBzdGFjayIpOwotfQotCi1zdGF0aWMgdm9pZAotaWNoZWNrX3JhbmdlICgpCi17Ci0gIGlmIChpc3AgPCBpc3RhY2spCi0gICAgZGllICgidW5kZXJmbG93IGluIGludGVnZXIgc3RhY2siKTsKLSAgaWYgKGlzcCA+PSBpc3RhY2sgKyBTVEFDSykKLSAgICBkaWUgKCJvdmVyZmxvdyBpbiBpbnRlZ2VyIHN0YWNrIik7Ci19Ci0KLSNpZmRlZiBfX1NURENfXwotc3RhdGljIHZvaWQgZXhlYyAoZGljdF90eXBlICopOwotc3RhdGljIHZvaWQgY2FsbCAodm9pZCk7Ci1zdGF0aWMgdm9pZCByZW1jaGFyICh2b2lkKSwgc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMgKHZvaWQpLCBwdXNoX251bWJlciAodm9pZCk7Ci1zdGF0aWMgdm9pZCBwdXNoX3RleHQgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVtb3ZlX25vbmNvbW1lbnRzIChzdHJpbmdfdHlwZSAqLCBzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YWNrX2xldmVsICh2b2lkKTsKLXN0YXRpYyB2b2lkIHBhcmFtc3R1ZmYgKHZvaWQpLCB0cmFuc2xhdGVjb21tZW50cyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRkb3RzICh2b2lkKSwgY291cmllcml6ZSAodm9pZCksIGJ1bGxldGl6ZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBkb19mYW5jeV9zdHVmZiAodm9pZCk7Ci1zdGF0aWMgaW50IGlzY29tbWFuZCAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBpbnQgY29weV9wYXN0X25ld2xpbmUgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBpY29weV9wYXN0X25ld2xpbmUgKHZvaWQpLCBraWxsX2JvZ3VzX2xpbmVzICh2b2lkKSwgaW5kZW50ICh2b2lkKTsKLXN0YXRpYyB2b2lkIGdldF9zdHVmZl9pbl9jb21tYW5kICh2b2lkKSwgc3dhcCAodm9pZCksIG90aGVyX2R1cCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBkcm9wICh2b2lkKSwgaWRyb3AgKHZvaWQpOwotc3RhdGljIHZvaWQgaWNhdHN0ciAodm9pZCksIHNraXBfcGFzdF9uZXdsaW5lICh2b2lkKSwgaW50ZXJuYWxtb2RlICh2b2lkKTsKLXN0YXRpYyB2b2lkIG1heWJlY2F0c3RyICh2b2lkKTsKLXN0YXRpYyBjaGFyICpuZXh0d29yZCAoY2hhciAqLCBjaGFyICoqKTsKLWRpY3RfdHlwZSAqbG9va3VwX3dvcmQgKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBwZXJmb3JtICh2b2lkKTsKLWRpY3RfdHlwZSAqbmV3ZW50cnkgKGNoYXIgKik7Ci11bnNpZ25lZCBpbnQgYWRkX3RvX2RlZmluaXRpb24gKGRpY3RfdHlwZSAqLCBzdGluc3RfdHlwZSk7Ci12b2lkIGFkZF9pbnRyaW5zaWMgKGNoYXIgKiwgdm9pZCAoKikoKSk7Ci12b2lkIGFkZF92YXIgKGNoYXIgKik7Ci12b2lkIGNvbXBpbGUgKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBiYW5nICh2b2lkKTsKLXN0YXRpYyB2b2lkIGF0c2lnbiAodm9pZCk7Ci1zdGF0aWMgdm9pZCBoZWxsbyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBzdGRvdXRfICh2b2lkKTsKLXN0YXRpYyB2b2lkIHN0ZGVycl8gKHZvaWQpOwotc3RhdGljIHZvaWQgcHJpbnQgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVhZF9pbiAoc3RyaW5nX3R5cGUgKiwgRklMRSAqKTsKLXN0YXRpYyB2b2lkIHVzYWdlICh2b2lkKTsKLXN0YXRpYyB2b2lkIGNoZXdfZXhpdCAodm9pZCk7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgREVGVU4oZXhlYywod29yZCksCi0JCSAgZGljdF90eXBlICp3b3JkKQotewotICBwYyA9IHdvcmQtPmNvZGU7Ci0gIHdoaWxlICgqcGMpIAotICAgICgqcGMpKCk7Ci19Ci1XT1JEKGNhbGwpCi17Ci0gICAgc3RpbnN0X3R5cGUgKm9sZHBjID0gcGM7Ci0gICAgZGljdF90eXBlICplOwotICAgIGUgPSAgKGRpY3RfdHlwZSAqKShwYyBbMV0pOwotICAgIGV4ZWMoZSk7Ci0gICAgcGMgPSBvbGRwYyArIDI7Ci0gICAgCi19Ci0KLVdPUkQocmVtY2hhcikKLXsKLSAgaWYgKHRvcy0+d3JpdGVfaWR4KQotICAgIHRvcy0+d3JpdGVfaWR4LS07ICAgIAotICBwYysrOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMgKCkKLXsKLSAgd2hpbGUgKChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYXQgKHRvcywgdG9zLT53cml0ZV9pZHggLSAxKSkKLQkgIHx8IGF0ICh0b3MsIHRvcy0+d3JpdGVfaWR4IC0gMSkgPT0gJ1xuJykKLQkgJiYgdG9zLT53cml0ZV9pZHggPiAwKQotICAgIHRvcy0+d3JpdGVfaWR4LS07Ci0gIHBjKys7Ci19Ci0KLVdPUkQocHVzaF9udW1iZXIpCi17Ci0gICAgaXNwKys7Ci0gICAgaWNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci0gICAgKmlzcCA9IChsb25nKSgqcGMpOwotICAgIHBjKys7Ci19Ci0KLVdPUkQocHVzaF90ZXh0KQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0gICAgcGMrKzsKLSAgICBjYXR0ZXh0KHRvcywqKChjaGFyICoqKXBjKSk7Ci0gICAgcGMrKzsKLSAgICAKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZXZlcnl0aGluZyBub3QgaW5zaWRlIGNvbW1lbnRzIHN0YXJ0aW5nIG9uCi0gICB0aGUgZmlyc3QgY2hhciBvZiB0aGUgbGluZSBmcm9tIHRoZSAgc3RyaW5nLCBhbHNvIHdoZW4gY29weWluZwotICAgY29tbWVudHMsIHJlbW92ZXMgYmxhbmsgc3BhY2UgYW5kIGxlYWRpbmcgKidzLgotICAgQmxhbmsgbGluZXMgYXJlIHR1cm5lZCBpbnRvIG9uZSBibGFuayBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQgCi1ERUZVTihyZW1vdmVfbm9uY29tbWVudHMsKHNyYyxkc3QpLAotCSAgIHN0cmluZ190eXBlICpzcmMgQU5ECi0JICAgc3RyaW5nX3R5cGUgKmRzdCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICAKLSAgICB3aGlsZSAoYXQoc3JjLGlkeCkpIAotICAgIHsKLQkvKiBOb3cgc2VlIGlmIHdlIGhhdmUgYSBjb21tZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSAqLwotCWlmIChhdChzcmMsaWR4KSA9PSAnXG4nIAotCSAgICAmJiBhdChzcmMsaWR4KzEpID09ICAnLycgCi0JICAgICYmIGF0KHNyYyxpZHgrMikgPT0gJyonKSAKLQl7Ci0JICAgIGlkeCs9MzsKLQkgICAgCi0JICAgIGlkeCA9IHNraXBfd2hpdGVfYW5kX3N0YXJzKHNyYyxpZHgpOwotCi0JICAgIC8qIFJlbW92ZSBsZWFkaW5nIGRvdCAqLwotCSAgICBpZiAoYXQoc3JjLCBpZHgpID09ICcuJykKLQkgICAgIGlkeCsrOwotCSAgICAKLQkgICAgLyogQ29weSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBvciB0aWxsIHRoZSBlbmQgb2YgdGhlCi0JICAgICAgIGNvbW1lbnQgKi8KLQkgICAgd2hpbGUgKGF0KHNyYywgaWR4KSkKLQkgICAgewotCQlpZiAoYXQoc3JjLCBpZHgpID09ICdcbicpIAotCQl7Ci0JCSAgICAvKiBlbmQgb2YgbGluZSwgZWNobyBhbmQgc2NyYXBlIG9mIGxlYWRpbmcgYmxhbmtzICAqLwotCQkgICAgaWYgKGF0KHNyYyxpZHggKzEpID09ICdcbicpCi0JCSAgICAgY2F0Y2hhcihkc3QsJ1xuJyk7Ci0JCSAgICBjYXRjaGFyKGRzdCwnXG4nKTsKLQkJICAgIGlkeCsrOwotCQkgICAgaWR4ID0gICBza2lwX3doaXRlX2FuZF9zdGFycyhzcmMsIGlkeCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXQoc3JjLCBpZHgpID09ICcqJyAmJiBhdChzcmMsaWR4KzEpID09ICcvJykgCi0JCXsKLQkJICAgIGlkeCArPTIgOwotCQkgICAgY2F0dGV4dChkc3QsIlxuRU5ERERcbiIpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJZWxzZSAKLQkJewotCQkgICAgY2F0Y2hhcihkc3QsIGF0KHNyYywgaWR4KSk7Ci0JCSAgICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgaWR4Kys7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhY2tfbGV2ZWwgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiY3VycmVudCBzdHJpbmcgc3RhY2sgZGVwdGggPSAlZCwgIiwgdG9zIC0gc3RhY2spOwotICBmcHJpbnRmIChzdGRlcnIsICJjdXJyZW50IGludGVnZXIgc3RhY2sgZGVwdGggPSAlZFxuIiwgaXNwIC0gaXN0YWNrKTsKLSAgcGMrKzsKLX0KLQotLyogdHVybjoKLSAgICAgZm9vYmFyIG5hbWUoc3R1ZmYpOwotICAgaW50bzoKLSAgICAgZm9vYmFyCi0gICAgIG5hbWUgUEFSQU1TICgoc3R1ZmYpKTsKLSAgIGFuZCBhIGJsYW5rIGxpbmUuCi0gKi8KLQotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQocGFyYW1zdHVmZikKLXsKLSAgICB1bnNpZ25lZCBpbnQgb3BlbnA7Ci0gICAgdW5zaWduZWQgaW50IGZuYW1lOwotICAgIHVuc2lnbmVkIGludCBpZHg7Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotCi0gICAgLyogbWFrZSBzdXJlIHRoYXQgaXQncyBub3QgYWxyZWFkeSBwYXJhbSdkIG9yIHByb3RvJ2QgKi8KLSAgICBpZihmaW5kKHRvcywiUEFSQU1TIikgfHwgZmluZCh0b3MsIlBST1RPIikgfHwgIWZpbmQodG9zLCIoIikpIHsKLQkgICAgY2F0c3RyKCZvdXQsdG9zKTsKLQl9Ci0gICAgZWxzZSAKLSAgICB7Ci0JLyogRmluZCB0aGUgb3BlbiBwYXJlbiAqLwotCWZvciAob3BlbnAgPSAwOyBhdCh0b3MsIG9wZW5wKSAhPSAnKCcgICYmIGF0KHRvcyxvcGVucCk7IG9wZW5wKyspCi0JIDsKLQotCWZuYW1lID0gb3BlbnA7Ci0JLyogU3RlcCBiYWNrIHRvIHRoZSBmbmFtZSAqLwotCWZuYW1lLS07Ci0Jd2hpbGUgKGZuYW1lICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcywgZm5hbWUpKSkKLQkgZm5hbWUgLS07Ci0Jd2hpbGUgKGZuYW1lCi0JICAgICAgICYmICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsZm5hbWUpKQotCSAgICAgICAmJiBhdCh0b3MsZm5hbWUpICE9ICcqJykKLQkgZm5hbWUtLTsKLQotCWZuYW1lKys7Ci0JCi0JZm9yIChpZHggPSAwOyBpZHggPCBmbmFtZTsgaWR4KyspIAkvKiBPdXRwdXQgdHlwZSAqLwotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsaWR4KSk7Ci0JfQotICAgIAotICAgICAgICBjYXR0ZXh0KCZvdXQsICJcbiIpOwkvKiBJbnNlcnQgYSBuZXdsaW5lIGJldHdlZW4gdHlwZSBhbmQgZm5uYW1lICovCi0KLQlmb3IgKGlkeCA9IGZuYW1lOyBpZHggPCBvcGVucDsgaWR4KyspIAkJLyogT3V0cHV0IGZubmFtZSAqLwotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsaWR4KSk7Ci0JfQotCi0JY2F0dGV4dCgmb3V0LCIgUEFSQU1TICgiKTsKLQotCXdoaWxlIChhdCh0b3MsaWR4KSAmJiBhdCh0b3MsaWR4KSAhPSc7JykgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLQljYXR0ZXh0KCZvdXQsIik7XG5cbiIpOwotICAgIH0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7ICAgIAotICAgIHBjKys7Ci0gICAgCi19Ci0KLQotCi0vKiB0dXJuIHsqCi0gICBhbmQgKn0gaW50byBjb21tZW50cyAqLwotCi1XT1JEKHRyYW5zbGF0ZWNvbW1lbnRzKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcyxpZHgpID09ICd7JyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiLyoiKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSAgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0KLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLS8qIHR1cm4gZXZlcnl0aGluZyBub3Qgc3RhcnRpbmcgd2l0aCBhIC4gaW50byBhIGNvbW1lbnQgKi8KLQotV09SRChtYW5nbGVjb21tZW50cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsaWR4KSA9PSAnXG4nICYmIGF0KHRvcyxpZHgrMSkgPT0nKicpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIJLyoiKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSAgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0KLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0jZW5kaWYKLQotLyogTW9kIHRvcyBzbyB0aGF0IG9ubHkgbGluZXMgd2l0aCBsZWFkaW5nIGRvdHMgcmVtYWluICovCi1zdGF0aWMgdm9pZAotREVGVU5fVk9JRChvdXRwdXRkb3RzKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nICYmIGF0KHRvcywgaWR4KzEpID09ICcuJykgCi0JewotCSAgY2hhciBjOwotCSAgaWR4ICs9IDI7Ci0JICAgIAotCSAgICB3aGlsZSAoKGMgPSBhdCh0b3MsIGlkeCkpICYmIGMgIT0gJ1xuJykKLQkgICAgewotCSAgICAgIGlmIChjID09ICd7JyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQkJewotCQkgICAgY2F0dGV4dCgmb3V0LCIgLyoiKTsKLQkJICAgIGlkeCs9MjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JCSAgICBpZHgrPTI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAgIGNhdGNoYXIoJm91dCwgYyk7Ci0JCSAgICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JICAgIGNhdGNoYXIoJm91dCwnXG4nKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9CQotCi0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOwotICAgIHBjKys7Ci0gICAgCi19Ci0KLS8qIEZpbmQgbGluZXMgc3RhcnRpbmcgd2l0aCAuIGFuZCB8IGFuZCBwdXQgZXhhbXBsZSBhcm91bmQgdGhlbSBvbiB0b3MgKi8KLVdPUkQoY291cmllcml6ZSkKLXsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgaW50IGNvbW1hbmQgPSAwOwotICAgIAotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotICAgIHdoaWxlIChhdCh0b3MsIGlkeCkpIAotICAgIHsKLQlpZiAoYXQodG9zLCBpZHgpID09ICdcbicgCi0JICAgICYmIChhdCh0b3MsIGlkeCArMSApID09ICcuJwotCQl8fCBhdCh0b3MsaWR4KzEpID09ICd8JykpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCJcbkBleGFtcGxlXG4iKTsKLQkgICAgZG8gCi0JICAgIHsKLQkJaWR4ICs9IDI7Ci0JCQotCQl3aGlsZSAoYXQodG9zLCBpZHgpICYmIGF0KHRvcywgaWR4KSE9J1xuJykKLQkJewotCQkgICAgaWYgKGF0KHRvcyxpZHgpPT0neycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIiAvKiIpOwotCQkJaWR4Kz0yOwotCQkgICAgfQotCQkgICAgZWxzZSBpZiAoYXQodG9zLGlkeCk9PScqJyAmJiBhdCh0b3MsaWR4KzEpID09J30nKSAKLQkJICAgIHsKLQkJCWNhdHRleHQoJm91dCwiKi8iKTsKLQkJCWlkeCs9MjsKLQkJICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAneycgJiYgIWNvbW1hbmQpCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIkB7Iik7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnfScgJiYgIWNvbW1hbmQpCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIkB9Iik7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkJICAgIGVsc2UgCi0JCSAgICB7Ci0JCQlpZiAoYXQodG9zLGlkeCkgPT0gJ0AnKQotCQkJICAgIGNvbW1hbmQgPSAxOwotCQkJZWxzZSBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCkpCi0JCQkJIHx8IGF0KHRvcyxpZHgpID09ICd9JykKLQkJCSAgICBjb21tYW5kID0gMDsKLQkJCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJCWlkeCsrOwotCQkgICAgfQotCQkgICAgCi0JCX0KLQkJY2F0Y2hhcigmb3V0LCdcbicpOwotCSAgICB9ICAKLQkgICAgd2hpbGUgKGF0KHRvcywgaWR4KSA9PSAnXG4nIAotCQkgICAmJiAoKGF0KHRvcywgaWR4KzEpID09ICcuJykKLQkJICAgICAgIHx8IChhdCh0b3MsaWR4KzEpID09ICd8JykpKQotCSAgICAgIDsKLQkgICAgY2F0dGV4dCgmb3V0LCJAZW5kIGV4YW1wbGUiKTsKLQl9Ci0JZWxzZSAKLQl7ICAgIAotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9ICAgIAotCi0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOwotICAgIHBjKys7Ci0KLSAgICAKLX0KLQotLyogRmluZHMgYW55IGxpbmVzIHN0YXJ0aW5nIHdpdGggIm8gIiwgaWYgdGhlcmUgYXJlIGFueSwgdGhlbiB0dXJucwotICAgb24gQGl0ZW1pemUgQGJ1bGxldCwgYW5kIEBpdGVtcyBlYWNoIG9mIHRoZW0uIFRoZW4gZW5kcyB3aXRoIEBlbmQKLSAgIGl0ZW1pemUsIGlucGxhY2UgYXQgVE9TKi8KLQotCi1XT1JEKGJ1bGxldGl6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBpbnQgb24gPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnQCcgJiYKLQkgICAgYXQodG9zLCBpZHgrMSkgPT0gJyonKSAKLQl7Ci0JICBjYXR0ZXh0KCZvdXQsIioiKTsKLQkgIGlkeCs9MjsKLQl9Ci0JCi0JZWxzZQotCSAgICBpZiAoYXQodG9zLCBpZHgpID09ICdcbicgJiYKLQkJYXQodG9zLCBpZHgrMSkgPT0gJ28nICYmCi0JCWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcywgaWR4ICsyKSkpCi0JICAgIHsKLQkJaWYgKCFvbikgCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiXG5AaXRlbWl6ZSBAYnVsbGV0XG4iKTsKLQkJICAgIG9uID0gMTsKLQkJICAgIAotCQl9Ci0JCWNhdHRleHQoJm91dCwiXG5AaXRlbVxuIik7Ci0JCWlkeCs9MzsKLQkgICAgfQotCSAgICBlbHNlIAotCSAgICB7Ci0JCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJaWYgKG9uICYmIGF0KHRvcywgaWR4KSA9PSAnXG4nICYmCi0JCSAgICBhdCh0b3MsIGlkeCsxKSA9PSAnXG4nICYmCi0JCSAgICBhdCh0b3MsIGlkeCsyKSAhPSAnbycpCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwgIkBlbmQgaXRlbWl6ZSIpOwotCQkgICAgb24gPSAwOwotCQl9Ci0JCWlkeCsrOwotCQkKLQkgICAgfQotCX0KLSAgICBpZiAob24pIAotICAgIHsKLQljYXR0ZXh0KCZvdXQsIkBlbmQgaXRlbWl6ZVxuIik7Ci0gICAgfQkKLQotICAgIGRlbGV0ZV9zdHJpbmcodG9zKTsKLSAgICAqdG9zID0gb3V0OwotICAgIHBjKys7Ci0gICAgCi19Ci0KLS8qIFR1cm4gPDxmb28+PiBpbnRvIEBjb2Rle2Zvb30gaW4gcGxhY2UgYXQgVE9TKi8KLSAgIAotCi1XT1JEKGRvX2ZhbmN5X3N0dWZmKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnPCcgCi0JICAgICYmIGF0KHRvcywgaWR4KzEpID09ICc8JwotCSAgICAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCArIDIpKSkgCi0JewotCSAgICAvKiBUaGlzIHF1YWxpZmllcyBhcyBhIDw8IHN0YXJ0dXAgKi8KLQkgICAgaWR4ICs9MjsKLQkgICAgY2F0dGV4dCgmb3V0LCJAY29kZXsiKTsKLQkgICAgd2hpbGUoYXQodG9zLGlkeCkgJiYKLQkJICBhdCh0b3MsaWR4KSAhPSAnPicgKQotCSAgICB7Ci0JCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJaWR4Kys7Ci0JCQotCSAgICB9Ci0JICAgIGNhdHRleHQoJm91dCwifSIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0gICAgcGMrKzsKLSAgICAKLX0KLS8qIEEgY29tbWFuZCBpcyBhbGwgdXBwZXIgY2FzZSxhbmQgYWxvbmUgb24gYSBsaW5lICovCi1zdGF0aWMgaW50IAotREVGVU4oIGlzY29tbWFuZCwocHRyLCBpZHgpLAotICAgICAgc3RyaW5nX3R5cGUgKnB0ciBBTkQKLSAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gICAgdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0gICAgd2hpbGUgKGF0KHB0cixpZHgpKSB7Ci0JICAgIGlmIChpc3VwcGVyKCh1bnNpZ25lZCBjaGFyKSBhdChwdHIsaWR4KSkgfHwgYXQocHRyLGlkeCkgPT0gJyAnIHx8Ci0JCWF0KHB0cixpZHgpID09ICdfJykgCi0JICAgIHsKLQkgICAgIGxlbisrOwotCSAgICAgaWR4Kys7Ci0JIH0KLQkgICAgZWxzZSBpZihhdChwdHIsaWR4KSA9PSAnXG4nKQotCSAgICB7Ci0JCWlmIChsZW4gPiAzKSByZXR1cm4gMTsKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgZWxzZSByZXR1cm4gMDsKLQl9Ci0gICAgcmV0dXJuIDA7Ci0KLX0KLQotCi1zdGF0aWMgaW50Ci1ERUZVTihjb3B5X3Bhc3RfbmV3bGluZSwocHRyLCBpZHgsIGRzdCksCi0gICAgICBzdHJpbmdfdHlwZSAqcHRyIEFORAotICAgICAgdW5zaWduZWQgaW50IGlkeCBBTkQKLSAgICAgIHN0cmluZ190eXBlICpkc3QpCi17Ci0gICAgaW50IGNvbHVtbiA9IDA7Ci0KLSAgICB3aGlsZSAoYXQocHRyLCBpZHgpICYmIGF0KHB0ciwgaWR4KSAhPSAnXG4nKSAKLSAgICB7Ci0JaWYgKGF0IChwdHIsIGlkeCkgPT0gJ1x0JykKLQkgIHsKLQkgICAgLyogRXhwYW5kIHRhYnMuICBOZWl0aGVyIG1ha2VpbmZvIG5vciBUZVggY2FuIGNvcGUgd2VsbCB3aXRoCi0JICAgICAgIHRoZW0uICAqLwotCSAgICBkbwotCSAgICAgIGNhdGNoYXIgKGRzdCwgJyAnKTsKLQkgICAgd2hpbGUgKCsrY29sdW1uICYgNyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBjYXRjaGFyKGRzdCwgYXQocHRyLCBpZHgpKTsKLQkgICAgY29sdW1uKys7Ci0JICB9Ci0JaWR4Kys7Ci0JCi0gICAgfSAgICAKLSAgICBjYXRjaGFyKGRzdCwgYXQocHRyLCBpZHgpKTsKLSAgICBpZHgrKzsKLSAgICByZXR1cm4gaWR4OwotCi19Ci0KLVdPUkQoaWNvcHlfcGFzdF9uZXdsaW5lKQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0gICAgaWR4ID0gY29weV9wYXN0X25ld2xpbmUocHRyLCBpZHgsIHRvcyk7Ci0gICAgcGMrKzsJCi19Ci0KLS8qIGluZGVudAotICAgVGFrZSB0aGUgc3RyaW5nIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBkbyBzb21lIHByZXR0eWluZyAqLwotCi0KLVdPUkQoa2lsbF9ib2d1c19saW5lcykKLXsKLSAgICBpbnQgc2wgOwotICAgIAotICAgIGludCBpZHggPSAwOwotICAgIGludCBjOwotICAgIGludCBkb3QgPSAwICAgIDsKLSAgICAKLSAgICBzdHJpbmdfdHlwZSBvdXQ7ICAgIAotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIC8qIERyb3AgbGVhZGluZyBubCAqLwotICAgIHdoaWxlIChhdCh0b3MsaWR4KSA9PSAnXG4nKQotICAgIHsKLQlpZHgrKzsKLSAgICB9Ci0gICAgYyA9IGlkeDsKLSAgICAKLSAgICAvKiBJZiB0aGUgZmlyc3QgY2hhciBpcyBhICcuJyBwcmVwZW5kIGEgbmV3bGluZSBzbyB0aGF0IGl0IGlzCi0gICAgICAgcmVjb2duaXplZCBwcm9wZXJseSBsYXRlci4gICovCi0gICAgaWYgKGF0ICh0b3MsIGlkeCkgPT0gJy4nKQotICAgICAgY2F0Y2hhciAoJm91dCwgJ1xuJyk7Ci0KLSAgICAvKiBGaW5kIHRoZSBsYXN0IGNoYXIgKi8KLSAgICB3aGlsZSAoYXQodG9zLGlkeCkpCi0gICAgewotCWlkeCsrOwotICAgIH0KLSAgICAKLSAgICAvKiBmaW5kIHRoZSBsYXN0IG5vbiB3aGl0ZSBiZWZvcmUgdGhlIG5sICovCi0gICAgaWR4LS07Ci0gICAgCi0gICAgd2hpbGUgKGlkeCAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsaWR4KSkpCi0gICAgIGlkeC0tOwotICAgIGlkeCsrOwotICAgIAotICAgIC8qIENvcHkgYnVmZmVyIHVwdG8gbGFzdCBjaGFyLCBidXQgYmxhbmsgbGluZXMgYmVmb3JlIGFuZCBhZnRlcgotICAgICAgIGRvdHMgZG9uJ3QgY291bnQgKi8KLSAgICBzbCA9IDE7Ci0KLSAgICB3aGlsZSAoYyA8IGlkeCkKLSAgICB7Ci0JaWYgKGF0KHRvcyxjKSA9PSAnXG4nIAotCSAgICAmJiBhdCh0b3MsYysxKSA9PSAnXG4nCi0JICAgICYmIGF0KHRvcyxjKzIpID09ICcuJykgCi0JewotCSAgICAvKiBJZ25vcmUgdHdvIG5ld2xpbmVzIGJlZm9yZSBhIGRvdCovCi0JICAgIGMrKzsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGMpID09ICcuJyAmJiBzbCkKLQl7Ci0JICAgIC8qIHJlbWVtYmVyIHRoYXQgdGhpcyBsaW5lIHN0YXJ0ZWQgd2l0aCBhIGRvdCAqLwotCSAgICBkb3Q9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGMpID09ICdcbicgCi0JCSAmJiBhdCh0b3MsYysxKSA9PSAnXG4nCi0JCSAmJiBkb3QpCi0JewotCSAgICBjKys7Ci0JICAgIC8qIElnbm9yZSB0d28gbmV3bGluZXMgd2hlbiBsYXN0IGxpbmUgd2FzIGRvdCAqLwotCX0KLQotCWNhdGNoYXIoJm91dCwgYXQodG9zLGMpKTsKLQlpZiAoYXQodG9zLGMpID09ICdcbicpCi0JewotCSAgICBzbCA9IDE7Ci0JICAgIAotCSAgICBpZiAoZG90ID09IDIpZG90PTE7ZWxzZSBkb3QgPSAwOwotCX0KLQllbHNlCi0JICBzbCA9IDA7Ci0JCi0JYysrOwkKLQotICAgIH0KLSAgICAKLSAgICAvKiBBcHBlbmQgbmwqLwotICAgIGNhdGNoYXIoJm91dCwgJ1xuJyk7Ci0gICAgcGMrKzsKLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLSAgICAKLSAgICAKLX0KLQotV09SRChpbmRlbnQpCi17Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGludCB0YWIgPSAwOwotICAgIGludCBpZHggPSAwOwotICAgIGludCBvbCA9MDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICB3aGlsZSAoYXQodG9zLGlkeCkpIHsKLQkgICAgc3dpdGNoIChhdCh0b3MsaWR4KSkgCi0JICAgIHsKLQkgICAgICBjYXNlICdcbic6Ci0JCWNhdHRleHQoJm91dCwiXG4iKTsKLQkJaWR4Kys7Ci0JCWlmICh0YWIgJiYgYXQodG9zLGlkeCkpCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiICAgICIpOwotCQl9Ci0JCW9sID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnKCc6Ci0JCXRhYisrOwotCQlpZiAob2wgPT0gMCkKLQkJICAgIGNhdHRleHQoJm91dCwiICAgIik7Ci0JCWlkeCsrOwotCQljYXR0ZXh0KCZvdXQsIigiKTsKLQkJb2wgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICcpJzoKLQkJdGFiLS07Ci0JCWNhdHRleHQoJm91dCwiKSIpOwotCQlpZHgrKzsKLQkJb2w9MTsKLQkJCi0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWNhdGNoYXIoJm91dCxhdCh0b3MsaWR4KSk7Ci0JCW9sPTE7Ci0JCQotCQlpZHgrKzsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9CQotCi0gICAgcGMrKzsKLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLQotfQotCi0KLVdPUkQoZ2V0X3N0dWZmX2luX2NvbW1hbmQpCi17Ci0gICAgdG9zKys7Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgaW5pdF9zdHJpbmcodG9zKTsKLQotICAgIHdoaWxlIChhdChwdHIsIGlkeCkpIHsKLQkgICAgaWYgKGlzY29tbWFuZChwdHIsIGlkeCkpICBicmVhazsKLQkgICAgaWR4ID0gICBjb3B5X3Bhc3RfbmV3bGluZShwdHIsIGlkeCwgdG9zKTsKLQl9Ci0gICAgcGMrKzsgICAgCi19Ci0KLVdPUkQoc3dhcCkKLXsKLSAgICBzdHJpbmdfdHlwZSB0OwotICAgIAotICAgIHQgPSB0b3NbMF07Ci0gICAgdG9zWzBdID0gdG9zWy0xXTsKLSAgICB0b3NbLTFdID10OyAKLSAgICBwYysrOwotICAgIAotfQotCi1XT1JEKG90aGVyX2R1cCkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIGNhdHN0cih0b3MsIHRvcy0xKTsKLSAgICBwYysrOwotfQotCi1XT1JEKGRyb3ApCi17Ci0gIHRvcy0tOwotICBjaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChpZHJvcCkKLXsKLSAgaXNwLS07Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChpY2F0c3RyKQotewotICAgIHRvcy0tOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGNhdHN0cih0b3MsIHRvcysxKTsKLSAgICBkZWxldGVfc3RyaW5nKHRvcysxKTsKLSAgICBwYysrOwotfQotCi1XT1JEKHNraXBfcGFzdF9uZXdsaW5lKQotewotICAgIHdoaWxlIChhdChwdHIsaWR4KSAKLQkgICAmJiBhdChwdHIsaWR4KSAhPSAnXG4nKQotICAgICBpZHgrKzsKLSAgICBpZHgrKzsKLSAgICBwYysrOwotfQotCi0KLVdPUkQoaW50ZXJuYWxtb2RlKQotewotICAgIGludGVybmFsX21vZGUgPSAqKGlzcCk7Ci0gICAgaXNwLS07Ci0gICAgaWNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci19Ci0KLVdPUkQobWF5YmVjYXRzdHIpCi17Ci0gICAgaWYgKGludGVybmFsX3dhbnRlZCA9PSBpbnRlcm5hbF9tb2RlKSAKLSAgICB7Ci0JY2F0c3RyKHRvcy0xLCB0b3MpOwotICAgIH0KLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgdG9zLS07Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgcGMrKzsKLX0KLQotY2hhciAqCi1ERUZVTihuZXh0d29yZCwoc3RyaW5nLCB3b3JkKSwKLSAgICAgIGNoYXIgKnN0cmluZyBBTkQKLSAgICAgIGNoYXIgKip3b3JkKQotewotICAgIGNoYXIgKndvcmRfc3RhcnQ7Ci0gICAgaW50IGlkeDsKLSAgICBjaGFyICpkc3Q7Ci0gICAgY2hhciAqc3JjOwotICAgIAotICAgIGludCBsZW5ndGggPSAwOwotICAgIAotICAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3RyaW5nKSB8fCAqc3RyaW5nID09ICctJykgewotCSAgICBpZiAoKnN0cmluZyA9PSAnLScpIAotCSAgICB7Ci0JCXdoaWxlICgqc3RyaW5nICYmICpzdHJpbmcgIT0gJ1xuJykgCi0JCSBzdHJpbmcrKzsKLQkJCi0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCSAgICBzdHJpbmcrKzsKLQkJfQotCX0KLSAgICBpZiAoISpzdHJpbmcpIHJldHVybiAwOwotICAgIAotICAgIHdvcmRfc3RhcnQgPSBzdHJpbmc7Ci0gICAgaWYgKCpzdHJpbmcgPT0gJyInKSAKLSAgICAgIHsKLQlkbwotCSAgewotCSAgICBzdHJpbmcrKzsKLQkgICAgbGVuZ3RoKys7Ci0JICAgIGlmICgqc3RyaW5nID09ICdcXCcpCi0JICAgICAgewotCQlzdHJpbmcgKz0gMjsKLQkJbGVuZ3RoICs9IDI7Ci0JICAgICAgfQotCSAgfQotCXdoaWxlICgqc3RyaW5nICE9ICciJyk7Ci0gICAgICB9Ci0gICAgZWxzZSAgICAgCi0gICAgICB7Ci0Jd2hpbGUgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3RyaW5nKSkgCi0JewotCSAgICBzdHJpbmcrKzsKLQkgICAgbGVuZ3RoKys7Ci0JCi0JfQotICAgIH0KLSAgICAKLSAgICAqd29yZCA9IG1hbGxvYyhsZW5ndGggKyAxKTsKLQotICAgIGRzdCA9ICp3b3JkOwotICAgIHNyYyA9IHdvcmRfc3RhcnQ7Ci0KLQotICAgIGZvciAoaWR4PSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSAKLSAgICAgIHsKLQlpZiAoc3JjW2lkeF0gPT0gJ1xcJykKLQkgIHN3aXRjaCAoc3JjW2lkeCsxXSkKLQkgICAgewotCSAgICBjYXNlICduJzoKLQkgICAgICAqZHN0KysgPSAnXG4nOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICciJzoKLQkgICAgY2FzZSAnXFwnOgotCSAgICAgICpkc3QrKyA9IHNyY1tpZHgrMV07Ci0JICAgICAgaWR4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKmRzdCsrID0gJ1xcJzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWVsc2UKLQkgICpkc3QrKyA9IHNyY1tpZHhdOwotICAgIH0KLSAgICAqZHN0KysgPSAwOwotCi0KLQotCi0KLSAgICBpZigqc3RyaW5nKSAgICAKLSAgICAgcmV0dXJuIHN0cmluZyArIDE7Ci0gICAgZWxzZSAKLSAgICAgcmV0dXJuIDA7Ci0gICAgCi19Ci1kaWN0X3R5cGUgKnJvb3Q7Ci1kaWN0X3R5cGUgKgotREVGVU4obG9va3VwX3dvcmQsKHdvcmQpLAotICAgICAgY2hhciAqd29yZCkKLXsKLSAgZGljdF90eXBlICpwdHIgPSByb290OwotICB3aGlsZSAocHRyKSB7Ci0gICAgICBpZiAoc3RyY21wKHB0ci0+d29yZCwgd29yZCkgPT0gMCkgcmV0dXJuIHB0cjsKLSAgICAgIHB0ciA9IHB0ci0+bmV4dDsKLQkgICAgCi0gICAgfQotICBpZiAod2FybmluZykKLSAgIGZwcmludGYoc3RkZXJyLCJDYW4ndCBmaW5kICVzXG4iLHdvcmQpOwotICByZXR1cm4gMDsKLSAgICAKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgREVGVU5fVk9JRChwZXJmb3JtKQotewotICB0b3MgPSBzdGFjazsKLSAgICAKLSAgd2hpbGUgKGF0KHB0ciwgaWR4KSkgewotICAgICAgLyogSXQncyB3b3J0aCBsb29raW5nIHRocm91Z2ggdGhlIGNvbW1hbmQgbGlzdCAqLwotICAgICAgaWYgKGlzY29tbWFuZChwdHIsIGlkeCkpCi0gICAgICB7Ci0JY2hhciAqbmV4dDsKLQlkaWN0X3R5cGUgKndvcmQgOwotCQkKLQkodm9pZCkJCW5leHR3b3JkKGFkZHIocHRyLCBpZHgpLCAmbmV4dCk7Ci0KLQotCXdvcmQgPSBsb29rdXBfd29yZChuZXh0KTsKLQotCi0JCQotCi0JaWYgKHdvcmQpIAotCXsKLQkgIGV4ZWMod29yZCk7Ci0JfQotCWVsc2UKLQl7Ci0JICBpZiAod2FybmluZykKLQkgICBmcHJpbnRmKHN0ZGVyciwid2FybmluZywgJXMgaXMgbm90IHJlY29nbmlzZWRcbiIsICBuZXh0KTsKLQkgIHNraXBfcGFzdF9uZXdsaW5lKCk7Ci0JfQotCQkKLSAgICAgIH0KLSAgICAgIGVsc2Ugc2tpcF9wYXN0X25ld2xpbmUoKTsKLQotICAgIH0KLX0KLQotZGljdF90eXBlICoKLURFRlVOKG5ld2VudHJ5LCh3b3JkKSwKLSAgICAgIGNoYXIgKndvcmQpCi17Ci0gICAgZGljdF90eXBlICpuZXcgPSAoZGljdF90eXBlICopbWFsbG9jKHNpemVvZihkaWN0X3R5cGUpKTsKLSAgICBuZXctPndvcmQgPSB3b3JkOwotICAgIG5ldy0+bmV4dCA9IHJvb3Q7Ci0gICAgcm9vdCA9IG5ldzsKLSAgICBuZXctPmNvZGUgPSAoc3RpbnN0X3R5cGUgKiltYWxsb2Moc2l6ZW9mKHN0aW5zdF90eXBlICkpOwotICAgIG5ldy0+Y29kZV9sZW5ndGggPSAxOwotICAgIG5ldy0+Y29kZV9lbmQgPSAwOwotICAgIHJldHVybiBuZXc7Ci0gICAgCi19Ci0KLQotdW5zaWduZWQgaW50Ci1ERUZVTihhZGRfdG9fZGVmaW5pdGlvbiwoZW50cnksIHdvcmQpLCAKLSAgICAgIGRpY3RfdHlwZSAqZW50cnkgQU5ECi0gICAgICBzdGluc3RfdHlwZSB3b3JkKQotewotICAgIGlmIChlbnRyeS0+Y29kZV9lbmQgPT0gZW50cnktPmNvZGVfbGVuZ3RoKSAKLSAgICB7Ci0JZW50cnktPmNvZGVfbGVuZ3RoICs9IDI7Ci0JZW50cnktPmNvZGUgPQotCSAoc3RpbnN0X3R5cGUgKikgcmVhbGxvYygoY2hhciAqKShlbnRyeS0+Y29kZSksCi0JCQkgICAgICAgZW50cnktPmNvZGVfbGVuZ3RoICpzaXplb2Yod29yZF90eXBlKSk7Ci0gICAgfQotICAgIGVudHJ5LT5jb2RlW2VudHJ5LT5jb2RlX2VuZF0gPSB3b3JkOwotICAgIAotcmV0dXJuICAgICBlbnRyeS0+Y29kZV9lbmQrKzsgIAotfQotCi0KLQotCi0KLQotCi12b2lkCi1ERUZVTihhZGRfaW50cmluc2ljLChuYW1lLCBmdW5jKSwKLSAgICAgIGNoYXIgKm5hbWUgQU5ECi0gICAgICB2b2lkICgqZnVuYykoKSkKLXsKLSAgICBkaWN0X3R5cGUgKm5ldyA9IG5ld2VudHJ5KG5hbWUpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgZnVuYyk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCAwKTsKLX0KLQotdm9pZAotREVGVU4oYWRkX3ZhciwobmFtZSksCi0gICAgICBjaGFyICpuYW1lKQotewotICAgIGRpY3RfdHlwZSAqbmV3ID0gbmV3ZW50cnkobmFtZSk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCBwdXNoX251bWJlcik7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCAoc3RpbnN0X3R5cGUpKCYobmV3LT52YXIpKSk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LDApOwotfQotCi0KLXZvaWQgCi1ERUZVTihjb21waWxlLCAoc3RyaW5nKSwgCi0gICAgICBjaGFyICpzdHJpbmcpCi17Ci0gICAgLyogYWRkIHdvcmRzIHRvIHRoZSBkaWN0aW9uYXJ5ICovCi0gICAgY2hhciAqd29yZDsKLSAgICBzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLSAgICB3aGlsZSAoc3RyaW5nICYmICpzdHJpbmcgJiYgd29yZFswXSkgCi0gICAgewotCWlmIChzdHJjbXAod29yZCwidmFyIik9PTApIAotCXsKLSBzdHJpbmc9bmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAKLQkgIGFkZF92YXIod29yZCk7Ci0gc3RyaW5nPW5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCX0KLWVsc2UJCi0JICAgIAotCWlmICh3b3JkWzBdID09ICc6JykKLQl7Ci0JICAgIGRpY3RfdHlwZSAqcHRyOwotCSAgICAvKiBDb21waWxlIGEgd29yZCBhbmQgYWRkIHRvIGRpY3Rpb25hcnkgKi8KLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAgIAotCSAgICBwdHIgPSBuZXdlbnRyeSh3b3JkKTsKLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAgIHdoaWxlICh3b3JkWzBdICE9ICc7JyApIAotCSAgICB7Ci0JCSBzd2l0Y2ggKHdvcmRbMF0pIAotCQkgewotCQkgICBjYXNlICciJzoKLQkJICAgICAvKiBnb3QgYSBzdHJpbmcsIGVtYmVkIG1hZ2ljIHB1c2ggc3RyaW5nCi0JCQlmdW5jdGlvbiAqLwotCQkgICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwgcHVzaF90ZXh0KTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSkod29yZCsxKSk7Ci0JCSAgICAgYnJlYWs7Ci0JCSAgIGNhc2UgJzAnOgotCQkgICBjYXNlICcxJzoKLQkJICAgY2FzZSAnMic6Ci0JCSAgIGNhc2UgJzMnOgotCQkgICBjYXNlICc0JzoKLQkJICAgY2FzZSAnNSc6Ci0JCSAgIGNhc2UgJzYnOgotCQkgICBjYXNlICc3JzoKLQkJICAgY2FzZSAnOCc6Ci0JCSAgIGNhc2UgJzknOgotCQkgICAgIC8qIEdvdCBhIG51bWJlciwgZW1iZWRkIHRoZSBtYWdpYyBwdXNoIG51bWJlcgotCQkJZnVuY3Rpb24gKi8KLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIHB1c2hfbnVtYmVyKTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSlhdG9sKHdvcmQpKTsKLQkJICAgICBicmVhazsKLQkJICAgZGVmYXVsdDoKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIGNhbGwpOwotCQkgICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwgKHN0aW5zdF90eXBlKWxvb2t1cF93b3JkKHdvcmQpKTsKLQkJIH0KLQotCQlzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsJCSAgICAgCi0JICAgIH0KLQkgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLDApOwotCSAgICBzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJzeW50YXggZXJyb3IgYXQgJXNcbiIsc3RyaW5nLTEpOwotCX0JICAgIAotICAgIH0KLQotfQotCi0gCi1zdGF0aWMgdm9pZCBERUZVTl9WT0lEKGJhbmcpCi17Ci0gICoobG9uZyAqKSgoaXNwWzBdKSkgPSBpc3BbLTFdOwotICBpc3AtPTI7Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChhdHNpZ24pCi17Ci0gICAgaXNwWzBdID0gKihsb25nICopKGlzcFswXSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChoZWxsbykKLXsKLSAgcHJpbnRmKCJoZWxsb1xuIik7Ci0gIHBjKys7ICAgIAotfQotCi1XT1JEKHN0ZG91dF8pCi17Ci0gIGlzcCsrOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gICppc3AgPSAxOwotICBwYysrOwotfQotCi1XT1JEKHN0ZGVycl8pCi17Ci0gIGlzcCsrOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gICppc3AgPSAyOwotICBwYysrOwotfQotCi1XT1JEKHByaW50KQotewotICBpZiAoKmlzcCA9PSAxKQotICAgIHdyaXRlX2J1ZmZlciAodG9zLCBzdGRvdXQpOwotICBlbHNlIGlmICgqaXNwID09IDIpCi0gICAgd3JpdGVfYnVmZmVyICh0b3MsIHN0ZGVycik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJwcmludDogaWxsZWdhbCBwcmludCBkZXN0aW5hdGlvbiBgJWxkJ1xuIiwgKmlzcCk7Ci0gIGlzcC0tOwotICB0b3MtLTsKLSAgaWNoZWNrX3JhbmdlICgpOwotICBjaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotCi1zdGF0aWMgdm9pZCBERUZVTihyZWFkX2luLCAoc3RyLCBmaWxlKSwgCi0JICAgc3RyaW5nX3R5cGUgKnN0ciBBTkQKLQkJICBGSUxFICpmaWxlKQotewotICAgIGNoYXIgYnVmZlsxMDAwMF07ICAgIAotICAgIHVuc2lnbmVkIGludCByOwotICAgIGRvIAotICAgIHsKLQlyID0gZnJlYWQoYnVmZiwgMSwgc2l6ZW9mKGJ1ZmYpLCBmaWxlKTsKLQljYXRidWYoc3RyLCBidWZmLCByKTsKLSAgICB9Ci0gICAgd2hpbGUgKHIpOwotICAgIGJ1ZmZbMF0gPSAwOwotICAgIAotICAgIGNhdGJ1ZihzdHIsIGJ1ZmYsMSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU5fVk9JRCh1c2FnZSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwidXNhZ2U6IC1bZHxpfGddIDxmaWxlID5maWxlXG4iKTsKLSAgICBleGl0KDMzKTsgICAgCi19Ci0KLS8qIFRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBkZWNsYXJlIGV4aXQuICBTb21ldGltZXMgaXQgcmV0dXJucwotICAgaW50LCBhbmQgc29tZXRpbWVzIGl0IHJldHVybnMgdm9pZC4gIFNvbWV0aW1lcyBpdCBjaGFuZ2VzIGJldHdlZW4KLSAgIE9TIHJlbGVhc2VzLiAgVHJ5aW5nIHRvIGdldCBpdCBkZWNsYXJlZCBjb3JyZWN0bHkgaW4gdGhlIGhvc3RzIGZpbGUKLSAgIGlzIGEgcG9pbnRsZXNzIHdhc3RlIG9mIHRpbWUuICAqLwotCi1zdGF0aWMgdm9pZAotY2hld19leGl0ICgpCi17Ci0gIGV4aXQgKDApOwotfQotCi1pbnQgREVGVU4obWFpbiwoYWMsYXYpLAotaW50IGFjIEFORAotY2hhciAqYXZbXSkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cmluZ190eXBlIGJ1ZmZlcjsKLSAgc3RyaW5nX3R5cGUgcHB0cjsKLQotICBpbml0X3N0cmluZygmYnVmZmVyKTsKLSAgaW5pdF9zdHJpbmcoJnBwdHIpOwotICBpbml0X3N0cmluZyhzdGFjayswKTsKLSAgdG9zPXN0YWNrKzE7Ci0gIHB0ciA9ICZwcHRyOwotICAgIAotICBhZGRfaW50cmluc2ljKCJwdXNoX3RleHQiLCBwdXNoX3RleHQpOwotICBhZGRfaW50cmluc2ljKCIhIiwgYmFuZyk7Ci0gIGFkZF9pbnRyaW5zaWMoIkAiLCBhdHNpZ24pOwotICBhZGRfaW50cmluc2ljKCJoZWxsbyIsaGVsbG8pOyAgICAKLSAgYWRkX2ludHJpbnNpYygic3Rkb3V0IixzdGRvdXRfKTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInN0ZGVyciIsc3RkZXJyXyk7ICAgIAotICBhZGRfaW50cmluc2ljKCJwcmludCIscHJpbnQpOyAgICAKLSAgYWRkX2ludHJpbnNpYygic2tpcF9wYXN0X25ld2xpbmUiLCBza2lwX3Bhc3RfbmV3bGluZSApOwotICBhZGRfaW50cmluc2ljKCJjYXRzdHIiLCBpY2F0c3RyICk7Ci0gIGFkZF9pbnRyaW5zaWMoImNvcHlfcGFzdF9uZXdsaW5lIiwgaWNvcHlfcGFzdF9uZXdsaW5lICk7Ci0gIGFkZF9pbnRyaW5zaWMoImR1cCIsIG90aGVyX2R1cCApOwotICBhZGRfaW50cmluc2ljKCJkcm9wIiwgZHJvcCk7Ci0gIGFkZF9pbnRyaW5zaWMoImlkcm9wIiwgaWRyb3ApOwotICBhZGRfaW50cmluc2ljKCJyZW1jaGFyIiwgcmVtY2hhciApOwotICBhZGRfaW50cmluc2ljKCJnZXRfc3R1ZmZfaW5fY29tbWFuZCIsIGdldF9zdHVmZl9pbl9jb21tYW5kICk7Ci0gIGFkZF9pbnRyaW5zaWMoImRvX2ZhbmN5X3N0dWZmIiwgZG9fZmFuY3lfc3R1ZmYgKTsKLSAgYWRkX2ludHJpbnNpYygiYnVsbGV0aXplIiwgYnVsbGV0aXplICk7Ci0gIGFkZF9pbnRyaW5zaWMoImNvdXJpZXJpemUiLCBjb3VyaWVyaXplICk7Ci0gIC8qIElmIHRoZSBmb2xsb3dpbmcgbGluZSBnaXZlcyBhbiBlcnJvciwgZXhpdCgpIGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUKLSAgICAgLi4vaG9zdHMvZm9vLmggZmlsZSBmb3IgdGhpcyBob3N0LiAgRml4IGl0IHRoZXJlLCBub3QgaGVyZSEgICovCi0gIC8qIE5vLCBkb24ndCBmaXggaXQgYW55d2hlcmU7IHNlZSBjb21tZW50IG9uIGNoZXdfZXhpdC0tSWFuIFRheWxvci4gICovCi0gIGFkZF9pbnRyaW5zaWMoImV4aXQiLCBjaGV3X2V4aXQgKTsKLSAgYWRkX2ludHJpbnNpYygic3dhcCIsIHN3YXAgKTsKLSAgYWRkX2ludHJpbnNpYygib3V0cHV0ZG90cyIsIG91dHB1dGRvdHMgKTsKLSAgYWRkX2ludHJpbnNpYygicGFyYW1zdHVmZiIsIHBhcmFtc3R1ZmYgKTsKLSAgYWRkX2ludHJpbnNpYygibWF5YmVjYXRzdHIiLCBtYXliZWNhdHN0ciApOwotICBhZGRfaW50cmluc2ljKCJ0cmFuc2xhdGVjb21tZW50cyIsIHRyYW5zbGF0ZWNvbW1lbnRzICk7Ci0gIGFkZF9pbnRyaW5zaWMoImtpbGxfYm9ndXNfbGluZXMiLCBraWxsX2JvZ3VzX2xpbmVzKTsKLSAgYWRkX2ludHJpbnNpYygiaW5kZW50IiwgaW5kZW50KTsKLSAgYWRkX2ludHJpbnNpYygiaW50ZXJuYWxtb2RlIiwgaW50ZXJuYWxtb2RlKTsKLSAgYWRkX2ludHJpbnNpYygicHJpbnRfc3RhY2tfbGV2ZWwiLCBwcmludF9zdGFja19sZXZlbCk7Ci0gIGFkZF9pbnRyaW5zaWMoInN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIiwgc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMpOwotICAgIAotICAvKiBQdXQgYSBubCBhdCB0aGUgc3RhcnQgKi8KLSAgY2F0Y2hhcigmYnVmZmVyLCdcbicpOwotCi0gIHJlYWRfaW4oJmJ1ZmZlciwgc3RkaW4pOyAKLSAgcmVtb3ZlX25vbmNvbW1lbnRzKCZidWZmZXIsIHB0cik7Ci0gIGZvciAoaT0gMTsgaSA8ICh1bnNpZ25lZCBpbnQpIGFjOyBpKyspIAotICB7Ci0gICAgaWYgKGF2W2ldWzBdID09ICctJykKLSAgICB7Ci0gICAgICBpZiAoYXZbaV1bMV0gPT0gJ2YnKQotICAgICAgewotCXN0cmluZ190eXBlIGI7Ci0JRklMRSAqZjsKLQlpbml0X3N0cmluZygmYik7Ci0KLQlmICA9IGZvcGVuKGF2W2krMV0sInIiKTsKLQlpZiAoIWYpIAotCXsKLQkgIGZwcmludGYoc3RkZXJyLCJDYW4ndCBvcGVuIHRoZSBpbnB1dCBmaWxlICVzXG4iLGF2W2krMV0pOwotCSAgcmV0dXJuIDMzOwotCX0KLQotCXJlYWRfaW4oJmIsIGYpOwotCWNvbXBpbGUoYi5wdHIpOwotCXBlcmZvcm0oKTsJCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdltpXVsxXSA9PSAnaScpIAotICAgICAgewotCWludGVybmFsX3dhbnRlZCA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdltpXVsxXSA9PSAndycpIAotICAgICAgewotCXdhcm5pbmcgPSAxOwotICAgICAgfQotICAgICAgZWxzZQotCXVzYWdlICgpOwotICAgIH0KLSAgfSAgICAgIAotICB3cml0ZV9idWZmZXIoc3RhY2srMCwgc3Rkb3V0KTsKLSAgaWYgKHRvcyAhPSBzdGFjaykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJmaW5pc2hpbmcgd2l0aCBjdXJyZW50IHN0YWNrIGxldmVsICVkXG4iLCB0b3MgLSBzdGFjayk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9kb2Muc3RyIGIvYmZkL2RvYy9kb2Muc3RyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI3NmZlLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvZG9jLnN0cgorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi06IERPQ0RECi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBraWxsX2JvZ3VzX2xpbmVzIGNhdHN0cgotCTsKLQotOiBFTkRERAotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotCi06IEVYQU1QTEUKLQlza2lwX3Bhc3RfbmV3bGluZQkKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBraWxsX2JvZ3VzX2xpbmVzIGRvX2ZhbmN5X3N0dWZmIHRyYW5zbGF0ZWNvbW1lbnRzIAotCWNvdXJpZXJpemUgY2F0c3RyCi0KLQk7Ci0KLTogSU5PREUgCi0JIkBub2RlICIgY2F0c3RyIHNraXBfcGFzdF9uZXdsaW5lIGNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciAKLQk7Ci0KLTogQ09ERV9GUkFHTUVOVAotCUVYQU1QTEUgCi0JOwotCi06IENPTU1FTlQKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0JZHJvcAotCTsKLQotOiBTWU5PUFNJUwotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBzdHJvbmd7U3lub3BzaXN9XG4iIGNhdHN0cgotCSJAZXhhbXBsZVxuIiBjYXRzdHIKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCAgCi0Ja2lsbF9ib2d1c19saW5lcwotCWluZGVudAotCWNhdHN0cgotCSJAZW5kIGV4YW1wbGVcbiIgY2F0c3RyCi0KLQk7Ci0KLTogZnVuYwotCSJAZmluZGV4ICIJLSBhCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCWR1cAkJLSBhIHggeCAKLQkiQHN1YnN1YnNlY3Rpb24gQGNvZGV7IiAtIGEgeCB4IGIgCi0Jc3dhcAotCXJlbWNoYXIKLQkifVxuIiAtIGEgeCBiIHggYwotCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAotCTsKLQotOiBGVU5DVElPTgotCSJAZmluZGV4ICIJLSBhCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCWR1cAkJLSBhIHggeCAKLQkiQHN1YnN1YnNlY3Rpb24gQGNvZGV7IiAtIGEgeCB4IGIgCi0Jc3dhcAotCXJlbWNoYXIKLQkifVxuIiAtIGEgeCBiIHggYwotCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAotCTsKLQotOiBib2R5dGV4dAotCWdldF9zdHVmZl9pbl9jb21tYW5kIAotCWJ1bGxldGl6ZQotCWtpbGxfYm9ndXNfbGluZXMKLQlkb19mYW5jeV9zdHVmZgotCWNvdXJpZXJpemUKLQljYXRzdHIKLQkiXG4iIGNhdHN0cgotCTsKLQotOiBhc2VjdGlvbgotCXNraXBfcGFzdF9uZXdsaW5lCi0JY2F0c3RyCi0JY29weV9wYXN0X25ld2xpbmUgCQotCWRvX2ZhbmN5X3N0dWZmIGNhdHN0ciAJCi0JYm9keXRleHQJCi0JOwotCi06IFNFQ1RJT04gCi0JIkBzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBTVUJTRUNUSU9OCi0JIkBzdWJzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBTVUJTVUJTRUNUSU9OCi0JIkBzdWJzdWJzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBzdWJoZWFkCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlib2R5dGV4dAotCTsKLQotCi0KLQkKLTogREVTQ1JJUFRJT04gCi0JIkBzdHJvbmd7RGVzY3JpcHRpb259QCpcbiIgY2F0c3RyIHN1YmhlYWQgOwotCi06IFJFVFVSTlMKLQkiQHN0cm9uZ3tSZXR1cm5zfUAqXG4iIGNhdHN0ciBzdWJoZWFkIDsKLQotOiBJTlRFUk5BTF9GVU5DVElPTgotCWZ1bmMgOwotCi0KLTogSU5URVJOQUxfREVGSU5JVElPTiAKLQlmdW5jIDsKLQotCi06IElOVEVSTkFMCi0JZnVuYyA7Ci0KLTogVFlQRURFRgotCUZVTkNUSU9OIDsKLQotOiBTRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkhlcmUgYXJlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIEBjb2Rle2VudW0gIgotCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIgY2F0c3RyCi0JIn06XG5cbiIgY2F0c3RyIGNhdHN0cgotCTsKLTogRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbiB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyIGNhdHN0cgotCTsKLTogRU5VTVgKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm54IHt9ICIKLQljb3B5X3Bhc3RfbmV3bGluZSBjYXRzdHIKLQljYXRzdHIKLQk7Ci06IEVOVU1FUQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbiB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyIGNhdHN0cgotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotOiBFTlVNRVFYCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiQGRlZmZueCB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyCi0JY2F0c3RyCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQk7Ci06IEVOVU1ET0MKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0Jc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKLQljYXRzdHIKLQkiXG5AZW5kIGRlZmZuXG4iIGNhdHN0cgotCTsKZGlmZiAtLWdpdCBhL2JmZC9kb2MvbWFrZWZpbGUudm1zIGIvYmZkL2RvYy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODU3YzAuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUNGTEFHUyA9IC9ub29wdC9pbmNsdWRlPShbXSxbLV0sWy0uLS5pbmNsdWRlXSkKLUxERkxBR1MgPSAvbm9tYXAKLUxETElCUyA9ICxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi0KLWFsbDogY2hldy5leGUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvcHJvdG8uc3RyIGIvYmZkL2RvYy9wcm90by5zdHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MzFjMTYuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9wcm90by5zdHIKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotCi06IFNZTk9QU0lTCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAkKLQlwYXJhbXN0dWZmCi0JaW5kZW50Ci0JbWF5YmVjYXRzdHIKLTsKLQotOiBpZ25vcmUKLQlza2lwX3Bhc3RfbmV3bGluZSAKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCW91dHB1dGRvdHMKLQltYXliZWNhdHN0cgotCTsKLQotOiBDT0RFX0ZSQUdNRU5UCi0JaWdub3JlIDsKLQotOiBleHRlcm5hbAotCTAgaW50ZXJuYWxtb2RlIGlnbm9yZSA7Ci0KLTogaW50ZXJuYWwgCi0JMSBpbnRlcm5hbG1vZGUgaWdub3JlIDsKLQotLSBpbnB1dCBzdGFjayB7IGEgYiB9IG91dHB1dCBiIGlmIGludGVybmFsLCBhIGlmIGV4dGVybmFsCi06IGlmaW50ZXJuYWwKLQkiIiBzd2FwIDEgaW50ZXJuYWxtb2RlIG1heWJlY2F0c3RyCi0Jc3dhcAotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQljYXRzdHIKLQk7Ci0KLS0gUHV0IG5vdGUgaW4gb3V0cHV0IHN0cmluZywgcmVnYXJkbGVzcyBvZiBpbnRlcm5hbCBtb2RlLgotOiBDT01NRU5UCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCXRyYW5zbGF0ZWNvbW1lbnRzCi0JY2F0c3RyCi0JOwotCi0tIFNFTlVNICAgIGVudW0tdHlwZS1uYW1lCi0tIEVOVU0gICAgIGVudW0tbmFtZQotLSBFTlVNWCAgICBhZGRsLWVudW0tbmFtZQotLSBFTlVNRE9DICBkb2MgZm9yIHByZWNlZGluZyBlbnVtcwotLSBFTkRTRU5VTSBtYXgtZW51bS1uYW1lCi0KLTogbWFrZV9lbnVtX2hlYWRlcgotCWR1cAotCSJlbnVtICIgc3dhcCBjYXRzdHIKLQkiIHtcbiIgY2F0c3RyCi0Jc3dhcCAiICBfZHVtbXlfZmlyc3RfIiBzd2FwIGNhdHN0ciBjYXRzdHIKLQkiLFxuIiBjYXRzdHIKLQk7Ci06IG1ha2Vfc3RyaW5nX3RhYmxlX2hlYWRlcgotCWR1cAotCSIjaWZkZWYgX0JGRF9NQUtFX1RBQkxFXyIgc3dhcCBjYXRzdHIgc3dhcAotCSJcblxuc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0ICIgc3dhcCBjYXRzdHIgY2F0c3RyCi0JIl9uYW1lc1tdID0geyBcIkBAdW5pbml0aWFsaXplZEBAXCIsXG4iIGNhdHN0cgotCTsKLTogU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNvcHlfcGFzdF9uZXdsaW5lCi0JcmVtY2hhcgotCWR1cAotCW1ha2VfZW51bV9oZWFkZXIKLQlzd2FwCi0JbWFrZV9zdHJpbmdfdGFibGVfaGVhZGVyCi0JaWZpbnRlcm5hbAotCWNhdHN0cgotCWdldF9zdHVmZl9pbl9jb21tYW5kIGNhdHN0cgotCXRyYW5zbGF0ZWNvbW1lbnRzIDsKLTogRU5EU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNvcHlfcGFzdF9uZXdsaW5lIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzCi0JZHVwCi0JIiAgIiBzd2FwIGNhdHN0ciAiIH07XG4iIGNhdHN0cglzd2FwCi0JIiBcIkBAb3ZlcmZsb3c6ICIgc3dhcCBjYXRzdHIgIkBAXCIsXG59O1xuI2VuZGlmXG5cbiIgY2F0c3RyCi0JaWZpbnRlcm5hbAotCWNhdHN0cgotCTsKLTogbWFrZV9lbnVtZXJhdG9yCi0JIiAgIiBzd2FwIGNhdHN0cgotCSIsXG4iIGNhdHN0cgotCTsKLTogbWFrZV9lbnVtZXJhdG9yX3N0cmluZwotCSIgIFwiIiBzd2FwIGNhdHN0cgotCSJcIixcbiIgY2F0c3RyCi0JOwotOiBFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCXJlbWNoYXIKLQlkdXAKLQltYWtlX2VudW1lcmF0b3IKLQlzd2FwCi0JbWFrZV9lbnVtZXJhdG9yX3N0cmluZwotCWlmaW50ZXJuYWwKLQk7Ci06IEVOVU1YIEVOVU0gY2F0c3RyIDsKLTogRU5VTUVRCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiI2RlZmluZSAiCi0JY29weV9wYXN0X25ld2xpbmUgcmVtY2hhcgotCWNhdHN0cgotCSIgIgotCWNhdHN0cgotCWNvcHlfcGFzdF9uZXdsaW5lCi0JY2F0c3RyCi0JIiIgc3dhcCAwIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCTsKLTogRU5VTUVRWCBFTlVNRVEgY2F0c3RyIDsKLTogRU5VTURPQwotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlzdHJpcF90cmFpbGluZ19uZXdsaW5lcwotCSJcbnsqICIgc3dhcCBjYXRzdHIgIiAqfVxuIiBjYXRzdHIKLQl0cmFuc2xhdGVjb21tZW50cwotCS0gZGlzY2FyZCBpdCBpZiB3ZSdyZSBkb2luZyBpbnRlcm5hbCBtb2RlCi0JIiIgc3dhcCAwIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCXN3YXAKLQljYXRzdHIgY2F0c3RyCi0JOwotOiBFTkRERCBleHRlcm5hbCA7Ci06IFNFQ1RJT04gaWdub3JlIDsKLTogU1VCU0VDVElPTiBpZ25vcmUgOwotOiBTVUJTVUJTRUNUSU9OIGlnbm9yZSA7Ci06IElOVEVSTkFMX0RFRklOSVRJT04gaW50ZXJuYWwgOwotOiBERVNDUklQVElPTiBpZ25vcmUgOwotOiBGVU5DVElPTiBleHRlcm5hbCA7Ci06IFJFVFVSTlMgaWdub3JlIDsKLTogVFlQRURFRiBleHRlcm5hbCA7Ci06IElOVEVSTkFMX0ZVTkNUSU9OIGludGVybmFsIDsKLTogSU5URVJOQUwgaW50ZXJuYWwgOwotOiBJTk9ERSBpZ25vcmUgOwpkaWZmIC0tZ2l0IGEvYmZkL2R3YXJmMS5jIGIvYmZkL2R3YXJmMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODdkZjkyLi4wMDAwMDAwCi0tLSBhL2JmZC9kd2FyZjEuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NiArMCwwIEBACi0vKiBEV0FSRiAxIGZpbmQgbmVhcmVzdCBsaW5lIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSkuCi0gICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotV3JpdHRlbiBieSBHYXZpbiBSb21pZy1Lb2NoIG9mIEN5Z251cyBTb2x1dGlvbnMgKGdhdmluQGN5Z251cy5jb20pLiAgCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZHdhcmYuaCIKLQotLyogZHdhcmYxX2RlYnVnIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgYWxsIGR3YXJmMSBpbmZvLiAqLwotCi1zdHJ1Y3QgZHdhcmYxX2RlYnVnIHsKLQotICAvKiBUaGUgYmZkIHdlIGFyZSB3b3JraW5nIHdpdGguICovCi0gIGJmZCogYWJmZDsKLQotICAvKiBMaXN0IG9mIGFscmVhZHkgcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXRzLiAqLwotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGxhc3RVbml0OwotCi0gIC8qIFRoZSBidWZmZXIgZm9yIHRoZSAuZGVidWcgc2VjdGlvbi4gCi0gICAgIFplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIC5kZWJ1ZyBzZWN0aW9uIGZhaWxlZCB0byBsb2FkLiAqLwotICBjaGFyKiBkZWJ1Z19zZWN0aW9uOwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBtZW1vcnkgYnVmZmVyLiAqLwotICBjaGFyKiBkZWJ1Z19zZWN0aW9uX2VuZDsKLQotICAvKiBUaGUgYnVmZmVyIGZvciB0aGUgLmxpbmUgc2VjdGlvbi4gKi8KLSAgY2hhciogbGluZV9zZWN0aW9uOwotCi0gIC8qIEVuZCBvZiB0aGF0IGJ1ZmZlci4gKi8KLSAgY2hhciogbGluZV9zZWN0aW9uX2VuZDsKLQotICAvKiBUaGUgY3VycmVudCBvciBuZXh0IHVucmVhZCBkaWUgd2l0aGluIHRoZSAuZGVidWcgc2VjdGlvbi4gKi8KLSAgY2hhciogY3VycmVudERpZTsKLX07Ci0KLS8qIE9uZSBkd2FyZjFfdW5pdCBmb3IgZWFjaCBwYXJzZWQgY29tcGlsYXRpb24gdW5pdCBkaWUuICovCi0KLXN0cnVjdCBkd2FyZjFfdW5pdCB7Ci0gIC8qIExpbmtlZCBzdGFydGluZyBmcm9tIHN0YXNoLT5sYXN0VW5pdC4gKi8KLSAgc3RydWN0IGR3YXJmMV91bml0KiBwcmV2OwotCi0gIC8qIE5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIGNoYXIqIG5hbWU7Ci0KLSAgLyogVGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBhZGRyZXNzIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci0KLSAgLyogRG9lcyB0aGlzIHVuaXQgaGF2ZSBhIHN0YXRlbWVudCBsaXN0PyAqLwotICBpbnQgaGFzX3N0bXRfbGlzdDsKLQotICAvKiBJZiBhbnksIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmUgbnVtYmVyIHRhYmxlIGluIHRoZSAubGluZSBzZWN0aW9uLiAqLwotICB1bnNpZ25lZCBsb25nIHN0bXRfbGlzdF9vZmZzZXQ7Ci0KLSAgLyogSWYgbm9uLXplcm8sIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyB1bml0LiAqLwotICBjaGFyKiBmaXJzdF9jaGlsZDsKLQotICAvKiBIb3cgbWFueSBsaW5lIGVudHJpZXM/ICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZV9jb3VudDsKLQotICAvKiBUaGUgZGVjb2RlZCBsaW5lIG51bWJlciB0YWJsZSAobGluZV9jb3VudCBlbnRyaWVzKS4gKi8KLSAgc3RydWN0IGxpbmVudW1iZXIqIGxpbmVudW1iZXJfdGFibGU7Ci0KLSAgLyogVGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGluIHRoaXMgdW5pdC4gKi8KLSAgc3RydWN0IGR3YXJmMV9mdW5jKiBmdW5jX2xpc3Q7Ci19OwotCi0KLQotLyogT25lIGR3YXJmMV9mdW5jIGZvciBlYWNoIHBhcnNlZCBmdW5jdGlvbiBkaWUuICAqLwotCi1zdHJ1Y3QgZHdhcmYxX2Z1bmMgewotICAvKiBMaW5rZWQgc3RhcnRpbmcgZnJvbSBhVW5pdC0+ZnVuY19saXN0LiAqLwotICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIHByZXY7Ci0gIAotICAvKiBOYW1lIG9mIGZ1bmN0aW9uLiAqLwotICBjaGFyKiBuYW1lOwotICAKLSAgLyogVGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBhZGRyZXNzIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci19OwotCi0KLS8qIFVzZWQgdG8gcmV0dXJuIGluZm8gYWJvdXQgYSBwYXJzZWQgZGllLiAqLwotc3RydWN0IGRpZV9pbmZvIHsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIHVuc2lnbmVkIGxvbmcgc2libGluZzsKLSAgdW5zaWduZWQgbG9uZyBsb3dfcGM7Ci0gIHVuc2lnbmVkIGxvbmcgaGlnaF9wYzsKLSAgdW5zaWduZWQgbG9uZyBzdG10X2xpc3Rfb2Zmc2V0OwotICAKLSAgY2hhciogbmFtZTsgCi0gIAotICBpbnQgaGFzX3N0bXRfbGlzdDsKLQotICB1bnNpZ25lZCBzaG9ydCB0YWc7Ci19OwotCi0KLS8qIFBhcnNlZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gKi8KLXN0cnVjdCBsaW5lbnVtYmVyIHsKLSAgLyogRmlyc3QgYWRkcmVzcyBpbiB0aGUgbGluZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBhZGRyOwotCi0gIC8qIFRoZSBsaW5lIG51bWJlci4gKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lbnVtYmVyOwotfTsKLQotCi0vKiBGaW5kIHRoZSBmb3JtIG9mIGFuIGF0dHIsIGZyb20gdGhlIGF0dHIgZmllbGQuICovCi0jZGVmaW5lIEZPUk1fRlJPTV9BVFRSKGF0dHIpCSgoYXR0cikgJiAweEYpCS8qIEltcGxpY2l0bHkgc3BlY2lmaWVkICovCi0KLQotLyogUmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGR3YXJmMV91bml0LiAgSXQgc2hvdWxkIGJlIGNsZWFyZWQgYW5kCi0gICB0aGVuIGF0dGFjaGVkIGludG8gdGhlICdzdGFzaCcgYXQgJ3N0YXNoLT5sYXN0VW5pdCcuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZHdhcmYxX3VuaXQqCi1hbGxvY19kd2FyZjFfdW5pdCAoc3Rhc2gpCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotewotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIHggPSAKLSAgICAoc3RydWN0IGR3YXJmMV91bml0KikgYmZkX3phbGxvYyAoc3Rhc2gtPmFiZmQsIAotCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGR3YXJmMV91bml0KSk7Ci0gIHgtPnByZXYgPSBzdGFzaC0+bGFzdFVuaXQ7Ci0gIHN0YXNoLT5sYXN0VW5pdCA9IHg7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkd2FyZjFfZnVuYy4gIEl0IG11c3QgYmUgY2xlYXJlZCBhbmQKLSAgIGF0dGFjaGVkIGludG8gJ2FVbml0JyBhdCAnYVVuaXQtPmZ1bmNfbGlzdCcuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZHdhcmYxX2Z1bmMqCi1hbGxvY19kd2FyZjFfZnVuYyAoc3Rhc2gsIGFVbml0KQotICAgICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgICAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgc3RydWN0IGR3YXJmMV9mdW5jKiB4ID0gCi0gICAgKHN0cnVjdCBkd2FyZjFfZnVuYyopIGJmZF96YWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBkd2FyZjFfZnVuYykpOwotICB4LT5wcmV2ID0gYVVuaXQtPmZ1bmNfbGlzdDsKLSAgYVVuaXQtPmZ1bmNfbGlzdCA9IHg7Ci0gIAotICByZXR1cm4geDsKLX0KLQotLyogcGFyc2VfZGllIC0gcGFyc2UgYSBEd2FyZjEgZGllLgotICAgUGFyc2UgdGhlIGRpZSBzdGFydGluZyBhdCAnYURpZVB0cicgaW50byAnYURpZUluZm8nLgotICAgJ2FiZmQnIG11c3QgYmUgdGhlIGJmZCBmcm9tIHdoaWNoIHRoZSBzZWN0aW9uIHRoYXQgJ2FEaWVQdHInCi0gICBwb2ludHMgdG8gd2FzIHB1bGxlZCBmcm9tLiAKLQotICAgUmV0dXJuIGZhbHNlIGlmIHRoZSBkaWUgaXMgaW52YWxpZGx5IGZvcm1hdHRlZDsgdHJ1ZSBvdGhlcndpc2UuICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9kaWUgKGFiZmQsIGFEaWVJbmZvLCBhRGllUHRyKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIHN0cnVjdCBkaWVfaW5mbyogYURpZUluZm87Ci0gICAgIGNoYXIqICAgICAgICAgICAgYURpZVB0cjsKLXsKLSAgY2hhciogdGhpc19kaWUgPSBhRGllUHRyOwotICBjaGFyKiB4cHRyID0gdGhpc19kaWU7Ci0KLSAgbWVtc2V0IChhRGllSW5mbywwLHNpemVvZigqYURpZUluZm8pKTsKLQotICAvKiBGaXJzdCBjb21lcyB0aGUgbGVuZ3RoLiAqLwotICBhRGllSW5mby0+bGVuZ3RoID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0gIHhwdHIgKz0gNDsKLSAgaWYgKGFEaWVJbmZvLT5sZW5ndGggPCA2KQotICAgIHsKLSAgICAgIC8qIEp1c3QgcGFkZGluZyBieXRlcy4gKi8KLSAgICAgIGFEaWVJbmZvLT50YWcgPSBUQUdfcGFkZGluZzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGVuIHRoZSB0YWcuICovCi0gIGFEaWVJbmZvLT50YWcgPSBiZmRfZ2V0XzE2IChhYmZkLCB4cHRyKTsKLSAgeHB0ciArPSAyOwotICAgICAgCi0gIC8qIFRoZW4gdGhlIGF0dHJpYnV0ZXMuICovCi0gIHdoaWxlICh4cHRyIDwgKHRoaXNfZGllICsgYURpZUluZm8tPmxlbmd0aCkpCi0gICAgewotICAgICAgdW5zaWduZWQgc2hvcnQgYXR0cjsKLSAgICAgIAotICAgICAgLyogUGFyc2UgdGhlIGF0dHJpYnV0ZSBiYXNlZCBvbiBpdHMgZm9ybS4gIFRoaXMgc2VjdGlvbiAKLSAgICAgICAgIG11c3QgaGFuZGxlIGFsbCBkd2FyZjEgZm9ybXMsIGJ1dCBuZWVkIG9ubHkgaGFuZGxlIHRoZQotCSBhY3R1YWwgYXR0cmlidXRlcyB0aGF0IHdlIGNhcmUgYWJvdXQuICovCi0KLSAgICAgIGF0dHIgPSBiZmRfZ2V0XzE2IChhYmZkLCB4cHRyKTsKLSAgICAgIHhwdHIgKz0gMjsKLSAgICAgIAotICAgICAgc3dpdGNoIChGT1JNX0ZST01fQVRUUiAoYXR0cikpCi0JewotCWNhc2UgRk9STV9EQVRBMjoKLQkgIHhwdHIgKz0gMjsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9EQVRBNDoKLQljYXNlIEZPUk1fUkVGOgotCSAgaWYgKGF0dHIgPT0gQVRfc2libGluZykKLQkgICAgYURpZUluZm8tPnNpYmxpbmcgPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIGVsc2UgaWYgKGF0dHIgPT0gQVRfc3RtdF9saXN0KQotCSAgICB7Ci0JICAgICAgYURpZUluZm8tPnN0bXRfbGlzdF9vZmZzZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgICAgICBhRGllSW5mby0+aGFzX3N0bXRfbGlzdCA9IDE7Ci0JICAgIH0KLQkgIHhwdHIgKz0gNDsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9EQVRBODoKLQkgIHhwdHIgKz0gODsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9BRERSOgotCSAgaWYgKGF0dHIgPT0gQVRfbG93X3BjKQotCSAgICBhRGllSW5mby0+bG93X3BjID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICBlbHNlIGlmIChhdHRyID09IEFUX2hpZ2hfcGMpCi0JICAgIGFEaWVJbmZvLT5oaWdoX3BjID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICB4cHRyICs9IDQ7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fQkxPQ0syOgotCSAgeHB0ciArPSAyICsgYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fQkxPQ0s0OgotCSAgeHB0ciArPSA0ICsgYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fU1RSSU5HOgotCSAgaWYgKGF0dHIgPT0gQVRfbmFtZSkKLQkgICAgYURpZUluZm8tPm5hbWUgPSB4cHRyOwotCSAgeHB0ciArPSBzdHJsZW4gKHhwdHIpICsgMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgZHdhcmYxIGxpbmUgbnVtYmVyIHRhYmxlIGZvciAnYVVuaXQtPnN0bXRfbGlzdF9vZmZzZXQnCi0gICBpbnRvICdhVW5pdC0+bGluZW51bWJlcl90YWJsZScuICBSZXR1cm4gZmFsc2UgaWYgYW4gZXJyb3IgCi0gICBvY2N1cnM7IHRydWUgb3RoZXJ3aXNlLiAqLwotICAKLXN0YXRpYyBib29sZWFuCi1wYXJzZV9saW5lX3RhYmxlIChzdGFzaCwgYVVuaXQpCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0OwotewotICBjaGFyKiB4cHRyOwotCi0gIC8qIExvYWQgdGhlICIubGluZSIgc2VjdGlvbiBmcm9tIHRoZSBiZmQgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LiAqLyAKLSAgaWYgKHN0YXNoLT5saW5lX3NlY3Rpb24gPT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbXNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICAgIAotICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGFzaC0+YWJmZCwgIi5saW5lIik7Ci0gICAgICBpZiAoISBtc2VjKQotCXJldHVybiBmYWxzZTsKLQkgIAotICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBzdGFzaC0+bGluZV9zZWN0aW9uID0gKHVuc2lnbmVkIGNoYXIqKSBiZmRfYWxsb2MgKHN0YXNoLT5hYmZkLCBzaXplKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gtPmxpbmVfc2VjdGlvbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rhc2gtPmFiZmQsIG1zZWMsIHN0YXNoLT5saW5lX3NlY3Rpb24sIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5saW5lX3NlY3Rpb24gPSAwOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc3Rhc2gtPmxpbmVfc2VjdGlvbl9lbmQgPSBzdGFzaC0+bGluZV9zZWN0aW9uICsgc2l6ZTsKLSAgICB9Ci0KLSAgeHB0ciA9IHN0YXNoLT5saW5lX3NlY3Rpb24gKyBhVW5pdC0+c3RtdF9saXN0X29mZnNldDsKLSAgaWYgKHhwdHIgPCBzdGFzaC0+bGluZV9zZWN0aW9uX2VuZCkKLSAgICB7Ci0gICAgICBpbnQgZWFjaExpbmU7Ci0KLSAgICAgIGNoYXIqIHRibGVuZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZTsKLQotICAgICAgLyogRmlyc3QgY29tZXMgdGhlIGxlbmd0aC4gKi8KLSAgICAgIHRibGVuZCA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKSArIHhwdHI7Ci0gICAgICB4cHRyICs9IDQ7Ci0KLSAgICAgIC8qIFRoZW4gdGhlIGJhc2UgYWRkcmVzcyBmb3IgZWFjaCBhZGRyZXNzIGluIHRoZSB0YWJsZS4gKi8KLSAgICAgIGJhc2UgPSBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0gICAgICB4cHRyICs9IDQ7Ci0KLSAgICAgIC8qIEhvdyBtYW55IGxpbmUgZW50cnlzPwotCSAxMCA9IDQgKGxpbmUgbnVtYmVyKSArIDIgKHBvcyBpbiBsaW5lKSArIDQgKGFkZHJlc3MgaW4gbGluZSkgKi8KLSAgICAgIGFVbml0LT5saW5lX2NvdW50ID0gKHRibGVuZCAtIHhwdHIpIC8gMTA7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIGFuIGFycmF5IGZvciB0aGUgZW50cmllcy4gKi8KLSAgICAgIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlID0gKHN0cnVjdCBsaW5lbnVtYmVyKikKLQliZmRfYWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJICAgc2l6ZW9mIChzdHJ1Y3QgbGluZW51bWJlcikgKiBhVW5pdC0+bGluZV9jb3VudCk7Ci0JCi0gICAgICBmb3IgKGVhY2hMaW5lID0gMDsgZWFjaExpbmUgPCBhVW5pdC0+bGluZV9jb3VudDsgZWFjaExpbmUrKykKLQl7Ci0JICAvKiBBIGxpbmUgbnVtYmVyLiAqLwotCSAgYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbZWFjaExpbmVdLmxpbmVudW1iZXIKLQkgICAgPSBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0JICB4cHRyICs9IDQ7Ci0KLQkgIC8qIFNraXAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgbGluZS4gKi8KLQkgIHhwdHIgKz0gMjsKLQotCSAgLyogQW5kIGZpbmFsbHkgdGhlIGFkZHJlc3MuICovCi0JICBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtlYWNoTGluZV0uYWRkciAKLQkgICAgPSBiYXNlICsgYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpOwotCSAgeHB0ciArPSA0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGVhY2ggZnVuY3Rpb24gZGllIGluIGEgY29tcGlsYXRpb24gdW5pdCAnYVVuaXQnLgotICAgVGhlIGZpcnN0IGNoaWxkIGRpZSBvZiAnYVVuaXQnIHNob3VsZCBiZSBpbiAnYVVuaXQtPmZpcnN0X2NoaWxkJywKLSAgIHRoZSByZXN1bHQgaXMgcGxhY2VkIGluICdhVW5pdC0+ZnVuY19saXN0Jy4KLSAgIFJldHVybiBmYWxzZSBpZiBlcnJvcjsgdHJ1ZSBvdGhlcndpc2UuICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9mdW5jdGlvbnNfaW5fdW5pdCAoc3Rhc2gsIGFVbml0KQotICAgICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgICAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgY2hhciogZWFjaERpZTsKLQotICBpZiAoYVVuaXQtPmZpcnN0X2NoaWxkKQotICAgIGZvciAoZWFjaERpZSA9IGFVbml0LT5maXJzdF9jaGlsZDsKLQkgZWFjaERpZSA8IHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZDsKLQkgKQotICAgICAgewotCXN0cnVjdCBkaWVfaW5mbyBlYWNoRGllSW5mbzsKLQkKLQlpZiAoISBwYXJzZV9kaWUgKHN0YXNoLT5hYmZkLCAmZWFjaERpZUluZm8sIGVhY2hEaWUpKQotCSAgcmV0dXJuIGZhbHNlOwotCQotCWlmIChlYWNoRGllSW5mby50YWcgPT0gVEFHX2dsb2JhbF9zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfc3Vicm91dGluZQotCSAgICB8fCBlYWNoRGllSW5mby50YWcgPT0gVEFHX2lubGluZWRfc3Vicm91dGluZQotCSAgICB8fCBlYWNoRGllSW5mby50YWcgPT0gVEFHX2VudHJ5X3BvaW50KQotCSAgewotCSAgICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIGFGdW5jID0gYWxsb2NfZHdhcmYxX2Z1bmMgKHN0YXNoLGFVbml0KTsKLQkgICAgCi0JICAgIGFGdW5jLT5uYW1lID0gZWFjaERpZUluZm8ubmFtZTsKLQkgICAgYUZ1bmMtPmxvd19wYyA9IGVhY2hEaWVJbmZvLmxvd19wYzsKLQkgICAgYUZ1bmMtPmhpZ2hfcGMgPSBlYWNoRGllSW5mby5oaWdoX3BjOwotCSAgfQotCQotCS8qIE1vdmUgdG8gbmV4dCBzaWJsaW5nLCBpZiBub25lLCBlbmQgbG9vcCAqLwotCWlmIChlYWNoRGllSW5mby5zaWJsaW5nKQotCSAgZWFjaERpZSA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgZWFjaERpZUluZm8uc2libGluZzsKLQllbHNlCi0JICBicmVhazsKLSAgICAgIH0KLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdG8gJ2FkZHInIGluICdhVW5pdCcuCi0gICBSZXR1cm4gd2hldGhlciB3ZSBmb3VuZCB0aGUgbGluZSAob3IgYSBmdW5jdGlvbikgd2l0aG91dCBlcnJvci4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgYVVuaXQsIGFkZHIsIAotCQkgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkgICAgICAgbGluZW51bWJlcl9wdHIpCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0OwotICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0gIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBpbnQgbGluZV9wID0gZmFsc2U7Ci0gIGludCBmdW5jX3AgPSBmYWxzZTsKLQotICBpZiAoYVVuaXQtPmxvd19wYyA8PSBhZGRyICYmIGFkZHIgPCBhVW5pdC0+aGlnaF9wYykKLSAgICB7Ci0gICAgICBpZiAoYVVuaXQtPmhhc19zdG10X2xpc3QpCi0JewotCSAgaW50IGk7Ci0JICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIGVhY2hGdW5jOwotCi0JICBpZiAoISBhVW5pdC0+bGluZW51bWJlcl90YWJsZSkKLQkgICAgewotCSAgICAgIGlmICghIHBhcnNlX2xpbmVfdGFibGUgKHN0YXNoLCBhVW5pdCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoISBhVW5pdC0+ZnVuY19saXN0KQotCSAgICB7Ci0JICAgICAgaWYgKCEgcGFyc2VfZnVuY3Rpb25zX2luX3VuaXQgKHN0YXNoLCBhVW5pdCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYVVuaXQtPmxpbmVfY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChhVW5pdC0+bGluZW51bWJlcl90YWJsZVtpXS5hZGRyIDw9IGFkZHIKLQkJICAmJiBhZGRyIDwgYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbaSsxXS5hZGRyKQotCQl7Ci0JCSAgKmZpbGVuYW1lX3B0ciA9IGFVbml0LT5uYW1lOwotCQkgICpsaW5lbnVtYmVyX3B0ciA9IGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2ldLmxpbmVudW1iZXI7Ci0JCSAgbGluZV9wID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGZvciAoZWFjaEZ1bmMgPSBhVW5pdC0+ZnVuY19saXN0OyAKLQkgICAgICAgZWFjaEZ1bmM7IAotCSAgICAgICBlYWNoRnVuYyA9IGVhY2hGdW5jLT5wcmV2KQotCSAgICB7Ci0JICAgICAgaWYgKGVhY2hGdW5jLT5sb3dfcGMgPD0gYWRkcgotCQkgICYmIGFkZHIgPCBlYWNoRnVuYy0+aGlnaF9wYykKLQkJewotCQkgICpmdW5jdGlvbm5hbWVfcHRyID0gZWFjaEZ1bmMtPm5hbWU7Ci0JCSAgZnVuY19wID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gbGluZV9wIHx8IGZ1bmNfcDsKLX0KLQotCi0KLQotLyogVGhlIERXQVJGIDEgdmVyc2lvbiBvZiBmaW5kX25lYXJlc3QgbGluZS4KLSAgIFJldHVybiB0cnVlIGlmIHRoZSBsaW5lIGlzIGZvdW5kIHdpdGhvdXQgZXJyb3IuICovCi0KLWJvb2xlYW4KLV9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnICpzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMV9maW5kX2xpbmVfaW5mbzsKLQotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGVhY2hVbml0OwotCi0gIC8qIFdoYXQgYWRkcmVzcyBhcmUgd2UgbG9va2luZyBmb3I/ICovCi0gIGJmZF92bWEgYWRkciA9IG9mZnNldCArIHNlY3Rpb24tPnZtYTsKLQotICAqZmlsZW5hbWVfcHRyID0gTlVMTDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotICAqbGluZW51bWJlcl9wdHIgPSAwOwotICAKLQotICBpZiAoISBzdGFzaCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbXNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICAgIAotICAgICAgc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjFfZmluZF9saW5lX2luZm8gPQotCShzdHJ1Y3QgZHdhcmYxX2RlYnVnKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYxX2RlYnVnKSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0gICAgICBpZiAoISBtc2VjKQotCXsKLQkgIC8qIE5vIGR3YXJmMSBpbmZvLiAgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHN0YXNoCi0JICAgICBoYXMgYmVlbiBhbGxvY2F0ZWQsIGJ1dCBjb250YWlucyB6ZXJvcywgdGhpcyBsZXRzCi0JICAgICBmdXR1cmUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBmYWlsIHF1aWNrZXIuICovCi0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKLSAgICAgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uID0gKHVuc2lnbmVkIGNoYXIqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaC0+ZGVidWdfc2VjdGlvbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgc3Rhc2gtPmRlYnVnX3NlY3Rpb24sIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uID0gMDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZCA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgc2l6ZTsKLSAgICAgIHN0YXNoLT5jdXJyZW50RGllID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb247Ci0gICAgICBzdGFzaC0+YWJmZCA9IGFiZmQ7Ci0gICAgfQotCi0gIC8qIEEgbnVsbCBkZWJ1Z19zZWN0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBubyBkd2FyZjEgaW5mbwotICAgICBvciB0aGF0IGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgc2V0dGluZyB1cCB0aGUgc3Rhc2guICovCi0KLSAgaWYgKCEgc3Rhc2gtPmRlYnVnX3NlY3Rpb24pCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLQotICAvKiBMb29rIGF0IHRoZSBwcmV2aW91c2x5IHBhcnNlZCB1bml0cyB0byBzZWUgaWYgYW55IGNvbnRhaW4KLSAgICAgdGhlIGFkZHIuICovCi0gIGZvciAoZWFjaFVuaXQgPSBzdGFzaC0+bGFzdFVuaXQ7IGVhY2hVbml0OyBlYWNoVW5pdCA9IGVhY2hVbml0LT5wcmV2KQotICAgIHsKLSAgICAgIGlmIChlYWNoVW5pdC0+bG93X3BjIDw9IGFkZHIgJiYgYWRkciA8IGVhY2hVbml0LT5oaWdoX3BjKQotCXJldHVybiBkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoc3Rhc2gsIGVhY2hVbml0LCBhZGRyLAotCQkJCQkgICAgICBmaWxlbmFtZV9wdHIsIAotCQkJCQkgICAgICBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkJICAgICAgbGluZW51bWJlcl9wdHIpOwotICAgIH0KLQotICB3aGlsZSAoc3Rhc2gtPmN1cnJlbnREaWUgPCBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGRpZV9pbmZvIGFEaWVJbmZvOwotCi0gICAgICBpZiAoISBwYXJzZV9kaWUgKHN0YXNoLT5hYmZkLCAmYURpZUluZm8sIHN0YXNoLT5jdXJyZW50RGllKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIGlmIChhRGllSW5mby50YWcgPT0gVEFHX2NvbXBpbGVfdW5pdCkKLQl7Ci0JICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0Ci0JICAgID0gYWxsb2NfZHdhcmYxX3VuaXQgKHN0YXNoKTsKLQkgIAotCSAgYVVuaXQtPm5hbWUgPSBhRGllSW5mby5uYW1lOwotCSAgYVVuaXQtPmxvd19wYyA9IGFEaWVJbmZvLmxvd19wYzsKLQkgIGFVbml0LT5oaWdoX3BjID0gYURpZUluZm8uaGlnaF9wYzsKLQkgIGFVbml0LT5oYXNfc3RtdF9saXN0ID0gYURpZUluZm8uaGFzX3N0bXRfbGlzdDsKLQkgIGFVbml0LT5zdG10X2xpc3Rfb2Zmc2V0ID0gYURpZUluZm8uc3RtdF9saXN0X29mZnNldDsKLQkgIAotCSAgLyogQSBkaWUgaGFzIGEgY2hpbGQgaWYgaXQncyBmb2xsb3dlZCBieSBhIGRpZSB0aGF0IGlzCi0JICAgICBub3QgaXQncyBzaWJsaW5nLiAqLwotCSAgaWYgKGFEaWVJbmZvLnNpYmxpbmcgCi0JICAgICAgJiYgc3Rhc2gtPmN1cnJlbnREaWUgKyBhRGllSW5mby5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgIDwgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kCi0JICAgICAgJiYgc3Rhc2gtPmN1cnJlbnREaWUgKyBhRGllSW5mby5sZW5ndGggCi0JICAgICAgICAgICAgIT0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBhRGllSW5mby5zaWJsaW5nKQotCSAgICBhVW5pdC0+Zmlyc3RfY2hpbGQgPSBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aDsKLQkgIGVsc2UKLQkgICAgYVVuaXQtPmZpcnN0X2NoaWxkID0gMDsKLQotCSAgaWYgKGFVbml0LT5sb3dfcGMgPD0gYWRkciAmJiBhZGRyIDwgYVVuaXQtPmhpZ2hfcGMpCi0JICAgIHJldHVybiBkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoc3Rhc2gsIGFVbml0LCBhZGRyLCAKLQkJCQkJCSAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJCSAgZnVuY3Rpb25uYW1lX3B0ciwgCi0JCQkJCQkgIGxpbmVudW1iZXJfcHRyKTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChhRGllSW5mby5zaWJsaW5nICE9IDApCi0Jc3Rhc2gtPmN1cnJlbnREaWUgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIGFEaWVJbmZvLnNpYmxpbmc7Ci0gICAgICBlbHNlCi0Jc3Rhc2gtPmN1cnJlbnREaWUgKz0gYURpZUluZm8ubGVuZ3RoOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogRU9GICovCmRpZmYgLS1naXQgYS9iZmQvZHdhcmYyLmMgYi9iZmQvZHdhcmYyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTg2YWQuLjAwMDAwMDAKLS0tIGEvYmZkL2R3YXJmMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxNSArMCwwIEBACi0vKiBEV0FSRiAyIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQWRhcHRlZCBmcm9tIGdkYi9kd2FyZjJyZWFkLmMgYnkgR2F2aW4gS29jaCBvZiBDeWdudXMgU29sdXRpb25zCi0gICAoZ2F2aW5AY3lnbnVzLmNvbSkuCi0KLSAgIEZyb20gdGhlIGR3YXJmMnJlYWQuYyBoZWFkZXI6Ci0gICBBZGFwdGVkIGJ5IEdhcnkgRnVuY2sgKGdhcnlAaW50cmVwaWQuY29tKSwgSW50cmVwaWQgVGVjaG5vbG9neSwKLSAgIEluYy4gIHdpdGggc3VwcG9ydCBmcm9tIEZsb3JpZGEgU3RhdGUgVW5pdmVyc2l0eSAodW5kZXIgY29udHJhY3QKLSAgIHdpdGggdGhlIEFkYSBKb2ludCBQcm9ncmFtIE9mZmljZSksIGFuZCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gICBJbml0aWFsIGNvbnRyaWJ1dGlvbiBieSBCcmVudCBCZW5zb24sIEhhcnJpcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuLAotICAgYmFzZWQgb24gRnJlZCBGaXNoJ3MgKEN5Z251cyBTdXBwb3J0KSBpbXBsZW1lbnRhdGlvbiBvZiBEV0FSRiAxCi0gICBzdXBwb3J0IGluIGR3YXJmcmVhZC5jCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCi0KLS8qIFRoZSBkYXRhIGluIHRoZSAuZGVidWdfbGluZSBzdGF0ZW1lbnQgcHJvbG9ndWUgbG9va3MgbGlrZSB0aGlzLiAgKi8KLXN0cnVjdCBsaW5lX2hlYWQKLSAgewotICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGg7Ci0gICAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLSAgICB1bnNpZ25lZCBpbnQgcHJvbG9ndWVfbGVuZ3RoOwotICAgIHVuc2lnbmVkIGNoYXIgbWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7Ci0gICAgdW5zaWduZWQgY2hhciBkZWZhdWx0X2lzX3N0bXQ7Ci0gICAgaW50IGxpbmVfYmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyIGxpbmVfcmFuZ2U7Ci0gICAgdW5zaWduZWQgY2hhciBvcGNvZGVfYmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyICpzdGFuZGFyZF9vcGNvZGVfbGVuZ3RoczsKLSAgfTsKLQotLyogQXR0cmlidXRlcyBoYXZlIGEgbmFtZSBhbmQgYSB2YWx1ZSAqLwotc3RydWN0IGF0dHJpYnV0ZQotICB7Ci0gICAgZW51bSBkd2FyZl9hdHRyaWJ1dGUgbmFtZTsKLSAgICBlbnVtIGR3YXJmX2Zvcm0gZm9ybTsKLSAgICB1bmlvbgotICAgICAgewotCWNoYXIgKnN0cjsKLQlzdHJ1Y3QgZHdhcmZfYmxvY2sgKmJsazsKLQl1bnNpZ25lZCBpbnQgdW5zbmQ7Ci0JaW50IHNuZDsKLQliZmRfdm1hIGFkZHI7Ci0gICAgICB9Ci0gICAgdTsKLSAgfTsKLQotLyogR2V0IGF0IHBhcnRzIG9mIGFuIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgKi8KLQotI2RlZmluZSBEV19TVFJJTkcoYXR0cikgICAgKChhdHRyKS0+dS5zdHIpCi0jZGVmaW5lIERXX1VOU05EKGF0dHIpICAgICAoKGF0dHIpLT51LnVuc25kKQotI2RlZmluZSBEV19CTE9DSyhhdHRyKSAgICAgKChhdHRyKS0+dS5ibGspCi0jZGVmaW5lIERXX1NORChhdHRyKSAgICAgICAoKGF0dHIpLT51LnNuZCkKLSNkZWZpbmUgRFdfQUREUihhdHRyKQkgICAoKGF0dHIpLT51LmFkZHIpCi0KLS8qIEJsb2NrcyBhcmUgYSBidW5jaCBvZiB1bnR5cGVkIGJ5dGVzLiAqLwotc3RydWN0IGR3YXJmX2Jsb2NrCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICBjaGFyICpkYXRhOwotICB9OwotCi0KLXN0cnVjdCBkd2FyZjJfZGVidWcgewotCi0gIC8qIEEgbGlzdCBvZiBhbGwgcHJldmlvdXNseSByZWFkIGNvbXBfdW5pdHMuICovCi0gIHN0cnVjdCBjb21wX3VuaXQqIGFsbF9jb21wX3VuaXRzOwotCi0gIC8qIFRoZSBuZXh0IHVucmVhZCBjb21waWxhdGlvbiB1bml0IHdpdGhpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4KLSAgICAgWmVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBoYXMgbm90IGJlZW4gbG9hZGVkCi0gICAgIGludG8gYSBidWZmZXIgeWV0LiovCi0gIGNoYXIqIGluZm9fcHRyOwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBtZW1vcnkgYnVmZmVyLiAqLwotICBjaGFyKiBpbmZvX3B0cl9lbmQ7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIGxvYWRlZCBpbnRvIG1lbW9yeS4gKi8KLSAgY2hhciogZHdhcmZfYWJicmV2X2J1ZmZlcjsKLQotICAvKiBMZW5ndGggb2YgdGhlIGxvYWRlZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uICovCi0gIHVuc2lnbmVkIGxvbmcgZHdhcmZfYWJicmV2X3NpemU7Ci0KLSAgLyogQnVmZmVyIGZvciBkZWNvZGVfbGluZV9pbmZvLiAgKi8KLSAgY2hhciAqZHdhcmZfbGluZV9idWZmZXI7Ci19OwotCi1zdHJ1Y3QgYXJhbmdlIHsKLSAgc3RydWN0IGFyYW5nZSAqbmV4dDsKLSAgYmZkX3ZtYSBsb3c7Ci0gIGJmZF92bWEgaGlnaDsKLX07Ci0KLQotLyogQSBtaW5pbWFsIGRlY29kaW5nIG9mIERXQVJGMiBjb21waWxhdGlvbiB1bml0cy4gIFdlIG9ubHkgZGVjb2RlCi0gICB3aGF0J3MgbmVlZGVkIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCi0KLXN0cnVjdCBjb21wX3VuaXQgewotCi0gIC8qIENoYWluIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcGlsYXRpb24gdW5pdHMuICovCi0gIHN0cnVjdCBjb21wX3VuaXQqIG5leHRfdW5pdDsKLQotICAvKiBLZWVwIHRoZSBiZGYgY29udmVuaWVudCAoZm9yIG1lbW9yeSBhbGxvY2F0aW9uKS4gKi8KLSAgYmZkKiBhYmZkOwotCi0gIC8qIFRoZSBsb3dlc3QgYW5kIGhpZ2VzdCBhZGRyZXNzZXMgY29udGFpbmVkIGluIHRoaXMgY29tcGlsYXRpb24KLSAgICAgdW5pdCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyLiAqLwotICBzdHJ1Y3QgYXJhbmdlIGFyYW5nZTsKLQotICAvKiBUaGUgRFdfQVRfbmFtZSBhdHRyaWJ1dGUgKGZvciBlcnJvciBtZXNzYWdlcykuICovCi0gIGNoYXIqIG5hbWU7Ci0KLSAgLyogVGhlIGFiYnJldiBoYXNoIHRhYmxlLiAqLwotICBzdHJ1Y3QgYWJicmV2X2luZm8qKiBhYmJyZXZzOwotCi0gIC8qIE5vdGUgdGhhdCBhbiBlcnJvciB3YXMgZm91bmQgYnkgY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lLiAqLwotICBpbnQgZXJyb3I7Ci0KLSAgLyogVGhlIERXX0FUX2NvbXBfZGlyIGF0dHJpYnV0ZSAqLwotICBjaGFyKiBjb21wX2RpcjsKLQotICAvKiBUcnVlIGlmIHRoZXJlIGlzIGEgbGluZSBudW1iZXIgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcC4gdW5pdC4gKi8KLSAgaW50IHN0bXRsaXN0OwotICAKLSAgLyogVGhlIG9mZnNldCBpbnRvIC5kZWJ1Z19saW5lIG9mIHRoZSBsaW5lIG51bWJlciB0YWJsZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lX29mZnNldDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBjaGlsZCBkaWUgZm9yIHRoZSBjb21wIHVuaXQuICovCi0gIGNoYXIgKmZpcnN0X2NoaWxkX2RpZV9wdHI7Ci0KLSAgLyogVGhlIGVuZCBvZiB0aGUgY29tcCB1bml0LiAqLwotICBjaGFyICplbmRfcHRyOwotCi0gIC8qIFRoZSBkZWNvZGVkIGxpbmUgbnVtYmVyLCBOVUxMIGlmIG5vdCB5ZXQgZGVjb2RlZC4gKi8KLSAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogbGluZV90YWJsZTsKLQotICAvKiBBIGxpc3Qgb2YgdGhlIGZ1bmN0aW9ucyBmb3VuZCBpbiB0aGlzIGNvbXAuIHVuaXQuICovCi0gIHN0cnVjdCBmdW5jaW5mbyogZnVuY3Rpb25fdGFibGU7IAotCi0gIC8qIEFkZHJlc3Mgc2l6ZSBmb3IgdGhpcyB1bml0IC0gZnJvbSB1bml0IGhlYWRlciAqLwotICB1bnNpZ25lZCBjaGFyIGFkZHJfc2l6ZTsKLX07Ci0KLQotCi0vKiBWRVJCQVRJTSAKLSAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdXAgdG8gdGhlIEVORCBWRVJCQVRJTSBtYXJrIGFyZSAKLSAgIGNvcGllZCBkaXJlY3RseSBmcm9tIGR3YXJmMnJlYWQuYy4gKi8KLQotLyogcmVhZCBkd2FyZiBpbmZvcm1hdGlvbiBmcm9tIGEgYnVmZmVyICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfMV9ieXRlIChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqYnVmOwotewotICByZXR1cm4gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotc3RhdGljIGludAotcmVhZF8xX3NpZ25lZF9ieXRlIChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqYnVmOwotewotICByZXR1cm4gYmZkX2dldF9zaWduZWRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfMl9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkLiAgKi8KLQotc3RhdGljIGludAotcmVhZF8yX3NpZ25lZF9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfNF9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkLiAgKi8KLQotc3RhdGljIGludAotcmVhZF80X3NpZ25lZF9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfOF9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX25fYnl0ZXMgKGFiZmQsIGJ1Ziwgc2l6ZSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2hhciAqYnVmOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgLyogSWYgdGhlIHNpemUgb2YgYSBob3N0IGNoYXIgaXMgOCBiaXRzLCB3ZSBjYW4gcmV0dXJuIGEgcG9pbnRlcgotICAgICB0byB0aGUgYnVmZmVyLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIHRvIGEgYnVmZmVyCi0gICAgIGFsbG9jYXRlZCBvbiB0aGUgdGVtcG9yYXJ5IG9ic3RhY2suICAqLwotICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX3N0cmluZyAoYWJmZCwgYnVmLCBieXRlc19yZWFkX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIHN0cmluZywgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgc3RyaW5nIHRvIGEgYnVmZmVyCi0gICAgIGFsbG9jYXRlZCBvbiB0aGUgdGVtcG9yYXJ5IG9ic3RhY2suICAqLwotICBpZiAoKmJ1ZiA9PSAnXDAnKQotICAgIHsKLSAgICAgICpieXRlc19yZWFkX3B0ciA9IDE7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICpieXRlc19yZWFkX3B0ciA9IHN0cmxlbiAoYnVmKSArIDE7Ci0gIHJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBidWYsIGJ5dGVzX3JlYWRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdW5zaWduZWQgaW50ICpieXRlc19yZWFkX3B0cjsKLXsKLSAgdW5zaWduZWQgaW50ICByZXN1bHQ7Ci0gIHVuc2lnbmVkIGludCAgbnVtX3JlYWQ7Ci0gIGludCAgICAgICAgICAgc2hpZnQ7Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZTsKLQotICByZXN1bHQgICA9IDA7Ci0gIHNoaWZ0ICAgID0gMDsKLSAgbnVtX3JlYWQgPSAwOwotICAKLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICAgIGJ1ZiArKzsKLSAgICAgIG51bV9yZWFkICsrOwotICAgICAgcmVzdWx0IHw9ICgoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0KTsKLSAgICAgIHNoaWZ0ICs9IDc7Ci0gICAgfQotICB3aGlsZSAoYnl0ZSAmIDB4ODApOwotICAKLSAgKiBieXRlc19yZWFkX3B0ciA9IG51bV9yZWFkOwotICAKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludAotcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBidWYsIGJ5dGVzX3JlYWRfcHRyKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICogYnVmOwotICAgICB1bnNpZ25lZCBpbnQgKiBieXRlc19yZWFkX3B0cjsKLXsKLSAgaW50ICAgICAgICAgICByZXN1bHQ7Ci0gIGludCAgICAgICAgICAgc2hpZnQ7Ci0gIGludCAgICAgICAgICAgbnVtX3JlYWQ7Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZTsKLQotICByZXN1bHQgPSAwOwotICBzaGlmdCA9IDA7Ci0gIG51bV9yZWFkID0gMDsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgICAgYnVmICsrOwotICAgICAgbnVtX3JlYWQgKys7Ci0gICAgICByZXN1bHQgfD0gKChieXRlICYgMHg3ZikgPDwgc2hpZnQpOwotICAgICAgc2hpZnQgKz0gNzsKLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0gIAotICBpZiAoKHNoaWZ0IDwgMzIpICYmIChieXRlICYgMHg0MCkpCi0gICAgcmVzdWx0IHw9IC0oMSA8PCBzaGlmdCk7Ci0KLSAgKiBieXRlc19yZWFkX3B0ciA9IG51bV9yZWFkOwotICAKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogRU5EIFZFUkJBVElNICovCi0KLXN0YXRpYyBiZmRfdm1hCi1yZWFkX2FkZHJlc3MgKHVuaXQsIGJ1ZikKLSAgICAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKLSAgICAgY2hhciAqYnVmOwotewotICBiZmRfdm1hIHJldHZhbCA9IDA7Ci0KLSAgaWYgKHVuaXQtPmFkZHJfc2l6ZSA9PSA0KQotICAgIHsKLSAgICAgIHJldHZhbCA9IGJmZF9nZXRfMzIgKHVuaXQtPmFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR2YWwgPSBiZmRfZ2V0XzY0ICh1bml0LT5hYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLQotCi0KLQotLyogVGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgYW4gYWJicmV2LiAqLwotc3RydWN0IGFiYnJldl9pbmZvCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOwkvKiBudW1iZXIgaWRlbnRpZnlpbmcgYWJicmV2ICovCi0gICAgZW51bSBkd2FyZl90YWcgdGFnOwkJLyogZHdhcmYgdGFnICovCi0gICAgaW50IGhhc19jaGlsZHJlbjsJCS8qIGJvb2xlYW4gKi8KLSAgICB1bnNpZ25lZCBpbnQgbnVtX2F0dHJzOwkvKiBudW1iZXIgb2YgYXR0cmlidXRlcyAqLwotICAgIHN0cnVjdCBhdHRyX2FiYnJldiAqYXR0cnM7CS8qIGFuIGFycmF5IG9mIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbnMgKi8KLSAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKm5leHQ7CS8qIG5leHQgaW4gY2hhaW4gKi8KLSAgfTsKLQotc3RydWN0IGF0dHJfYWJicmV2Ci0gIHsKLSAgICBlbnVtIGR3YXJmX2F0dHJpYnV0ZSBuYW1lOwotICAgIGVudW0gZHdhcmZfZm9ybSBmb3JtOwotICB9OwotCi0jaWZuZGVmIEFCQlJFVl9IQVNIX1NJWkUKLSNkZWZpbmUgQUJCUkVWX0hBU0hfU0laRSAxMjEKLSNlbmRpZgotI2lmbmRlZiBBVFRSX0FMTE9DX0NIVU5LCi0jZGVmaW5lIEFUVFJfQUxMT0NfQ0hVTksgNAotI2VuZGlmCi0KLS8qIExvb2t1cCBhbiBhYmJyZXZfaW5mbyBzdHJ1Y3R1cmUgaW4gdGhlIGFiYnJldiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBhYmJyZXZfaW5mbyAqCi1sb29rdXBfYWJicmV2IChudW1iZXIsYWJicmV2cykKLSAgICAgdW5zaWduZWQgaW50IG51bWJlcjsKLSAgICAgc3RydWN0IGFiYnJldl9pbmZvICoqYWJicmV2czsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2hfbnVtYmVyOwotICBzdHJ1Y3QgYWJicmV2X2luZm8gKmFiYnJldjsKLQotICBoYXNoX251bWJlciA9IG51bWJlciAlIEFCQlJFVl9IQVNIX1NJWkU7Ci0gIGFiYnJldiA9IGFiYnJldnNbaGFzaF9udW1iZXJdOwotCi0gIHdoaWxlIChhYmJyZXYpCi0gICAgewotICAgICAgaWYgKGFiYnJldi0+bnVtYmVyID09IG51bWJlcikKLQlyZXR1cm4gYWJicmV2OwotICAgICAgZWxzZQotCWFiYnJldiA9IGFiYnJldi0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBJbiBEV0FSRiB2ZXJzaW9uIDIsIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzCi0gICBzdG9yZWQgaW4gYSBzZXBhcmF0ZSAuZGVidWdfYWJicmV2IHNlY3Rpb24uICBCZWZvcmUgd2UgcmVhZCBhbnkKLSAgIGRpZXMgZnJvbSBhIHNlY3Rpb24gd2UgcmVhZCBpbiBhbGwgYWJicmV2aWF0aW9ucyBhbmQgaW5zdGFsbCB0aGVtCi0gICBpbiBhIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGFiYnJldl9pbmZvKioKLXJlYWRfYWJicmV2cyAoYWJmZCwgb2Zmc2V0KQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotewotICBzdHJ1Y3QgYWJicmV2X2luZm8gKiphYmJyZXZzOwotICBjaGFyICphYmJyZXZfcHRyOwotICBzdHJ1Y3QgYWJicmV2X2luZm8gKmN1cl9hYmJyZXY7Ci0gIHVuc2lnbmVkIGludCBhYmJyZXZfbnVtYmVyLCBieXRlc19yZWFkLCBhYmJyZXZfbmFtZTsKLSAgdW5zaWduZWQgaW50IGFiYnJldl9mb3JtLCBoYXNoX251bWJlcjsKLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqc3Rhc2g7Ci0KLSAgc3Rhc2ggPSBlbGZfdGRhdGEoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICBpZiAoISBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlcikKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbXNlYzsKLQotICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnX2FiYnJldiIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4iKSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIAotICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKLSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyID0gKGNoYXIqKSBiZmRfYWxsb2MgKGFiZmQsIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSk7Ci0gICAgICBpZiAoISBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlcikKLQkgIHJldHVybiAwOwotICAgICAgCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG1zZWMsIAotCQkJCSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyLCAwLAotCQkJCSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSkpCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChvZmZzZXQgPiBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQWJicmV2IG9mZnNldCAoJXUpIGJpZ2dlciB0aGFuIGFiYnJldiBzaXplICgldSkuIiksIAotCQkJICAgICBvZmZzZXQsIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSApOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWJicmV2cyA9IChzdHJ1Y3QgYWJicmV2X2luZm8qKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mKHN0cnVjdCBhYmJyZXZfaW5mbyopICogQUJCUkVWX0hBU0hfU0laRSk7Ci0KLSAgYWJicmV2X3B0ciA9IHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyICsgb2Zmc2V0OwotICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotCi0gIC8qIGxvb3AgdW50aWwgd2UgcmVhY2ggYW4gYWJicmV2IG51bWJlciBvZiAwICovCi0gIHdoaWxlIChhYmJyZXZfbnVtYmVyKQotICAgIHsKLSAgICAgIGN1cl9hYmJyZXYgPSAoc3RydWN0IGFiYnJldl9pbmZvKiliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhYmJyZXZfaW5mbykpOwotCi0gICAgICAvKiByZWFkIGluIGFiYnJldiBoZWFkZXIgKi8KLSAgICAgIGN1cl9hYmJyZXYtPm51bWJlciA9IGFiYnJldl9udW1iZXI7Ci0gICAgICBjdXJfYWJicmV2LT50YWcgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgY3VyX2FiYnJldi0+aGFzX2NoaWxkcmVuID0gcmVhZF8xX2J5dGUgKGFiZmQsIGFiYnJldl9wdHIpOwotICAgICAgYWJicmV2X3B0ciArPSAxOwotCi0gICAgICAvKiBub3cgcmVhZCBpbiBkZWNsYXJhdGlvbnMgKi8KLSAgICAgIGFiYnJldl9uYW1lID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGFiYnJldl9mb3JtID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHdoaWxlIChhYmJyZXZfbmFtZSkKLQl7Ci0JICBpZiAoKGN1cl9hYmJyZXYtPm51bV9hdHRycyAlIEFUVFJfQUxMT0NfQ0hVTkspID09IDApCi0JICAgIHsKLQkgICAgICBjdXJfYWJicmV2LT5hdHRycyA9IChzdHJ1Y3QgYXR0cl9hYmJyZXYgKikKLQkJYmZkX3JlYWxsb2MgKGN1cl9hYmJyZXYtPmF0dHJzLAotCQkJICAgICAoY3VyX2FiYnJldi0+bnVtX2F0dHJzICsgQVRUUl9BTExPQ19DSFVOSykKLQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBhdHRyX2FiYnJldikpOwotCSAgICAgIGlmICghIGN1cl9hYmJyZXYtPmF0dHJzKQotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgY3VyX2FiYnJldi0+YXR0cnNbY3VyX2FiYnJldi0+bnVtX2F0dHJzXS5uYW1lID0gYWJicmV2X25hbWU7Ci0JICBjdXJfYWJicmV2LT5hdHRyc1tjdXJfYWJicmV2LT5udW1fYXR0cnMrK10uZm9ybSA9IGFiYnJldl9mb3JtOwotCSAgYWJicmV2X25hbWUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotCSAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotCSAgYWJicmV2X2Zvcm0gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotCSAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotCX0KLQotICAgICAgaGFzaF9udW1iZXIgPSBhYmJyZXZfbnVtYmVyICUgQUJCUkVWX0hBU0hfU0laRTsKLSAgICAgIGN1cl9hYmJyZXYtPm5leHQgPSBhYmJyZXZzW2hhc2hfbnVtYmVyXTsKLSAgICAgIGFiYnJldnNbaGFzaF9udW1iZXJdID0gY3VyX2FiYnJldjsKLQotICAgICAgLyogR2V0IG5leHQgYWJicmV2aWF0aW9uLgotICAgICAgICAgVW5kZXIgSXJpeDYgdGhlIGFiYnJldmlhdGlvbnMgZm9yIGEgY29tcGlsYXRpb24gdW5pdCBhcmUgbm90Ci0JIGFsd2F5cyBwcm9wZXJseSB0ZXJtaW5hdGVkIHdpdGggYW4gYWJicmV2IG51bWJlciBvZiAwLgotCSBFeGl0IGxvb3AgaWYgd2UgZW5jb3VudGVyIGFuIGFiYnJldmlhdGlvbiB3aGljaCB3ZSBoYXZlCi0JIGFscmVhZHkgcmVhZCAod2hpY2ggbWVhbnMgd2UgYXJlIGFib3V0IHRvIHJlYWQgdGhlIGFiYnJldmlhdGlvbnMKLQkgZm9yIHRoZSBuZXh0IGNvbXBpbGUgdW5pdCkgb3IgaWYgdGhlIGVuZCBvZiB0aGUgYWJicmV2aWF0aW9uCi0JIHRhYmxlIGlzIHJlYWNoZWQuICAqLwotICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIChhYmJyZXZfcHRyIC0gc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIpCi0JICAgID49IHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSkKLQlicmVhazsKLSAgICAgIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgaWYgKGxvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIsYWJicmV2cykgIT0gTlVMTCkKLQlicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiYnJldnM7Ci19Ci0KLS8qIFJlYWQgYW4gYXR0cmlidXRlIGRlc2NyaWJlZCBieSBhbiBhYmJyZXZpYXRlZCBhdHRyaWJ1dGUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1yZWFkX2F0dHJpYnV0ZSAoYXR0ciwgYWJicmV2LCB1bml0LCBpbmZvX3B0cikKLSAgICAgc3RydWN0IGF0dHJpYnV0ZSAgICphdHRyOwotICAgICBzdHJ1Y3QgYXR0cl9hYmJyZXYgKmFiYnJldjsKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAgICp1bml0OwotICAgICBjaGFyICAgICAgICAgICAgICAgKmluZm9fcHRyOwotewotICBiZmQgKmFiZmQgPSB1bml0LT5hYmZkOwotICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZDsKLSAgc3RydWN0IGR3YXJmX2Jsb2NrICpibGs7Ci0KLSAgYXR0ci0+bmFtZSA9IGFiYnJldi0+bmFtZTsKLSAgYXR0ci0+Zm9ybSA9IGFiYnJldi0+Zm9ybTsKLSAgc3dpdGNoIChhYmJyZXYtPmZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9hZGRyOgotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKLSAgICAgIERXX0FERFIgKGF0dHIpID0gcmVhZF9hZGRyZXNzICh1bml0LCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSB1bml0LT5hZGRyX3NpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2syOgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDI7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKLSAgICAgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOwotICAgICAgYmxrLT5zaXplID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA0OwotICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKLSAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKLSAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9kYXRhODoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfOF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6Ci0gICAgICBEV19TVFJJTkcgKGF0dHIpID0gcmVhZF9zdHJpbmcgKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrOgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKLSAgICAgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOwotICAgICAgYmxrLT5zaXplID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGExOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZmxhZzoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3NkYXRhOgotICAgICAgRFdfU05EIChhdHRyKSA9IHJlYWRfc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fdWRhdGE6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmMToKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjI6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmNDoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fc3RycDoKLSAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6Ci0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IEludmFsaWQgb3IgdW5oYW5kbGVkIEZPUk0gdmFsdWU6ICVkLiIpLAotCQkJICAgICBhYmJyZXYtPmZvcm0pOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgfQotICByZXR1cm4gaW5mb19wdHI7Ci19Ci0KLQotLyogU291cmNlIGxpbmUgaW5mb3JtYXRpb24gdGFibGUgcm91dGluZXMuICovCi0KLSNkZWZpbmUgRklMRV9BTExPQ19DSFVOSyA1Ci0jZGVmaW5lIERJUl9BTExPQ19DSFVOSyA1Ci0KLXN0cnVjdCBsaW5lX2luZm8gewotICBzdHJ1Y3QgbGluZV9pbmZvKiBwcmV2X2xpbmU7Ci0KLSAgYmZkX3ZtYSBhZGRyZXNzOwotICBjaGFyKiBmaWxlbmFtZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHVuc2lnbmVkIGludCBjb2x1bW47Ci0gIGludCBlbmRfc2VxdWVuY2U7CQkvKiBlbmQgb2YgKHNlcXVlbnRpYWwpIGNvZGUgc2VxdWVuY2UgKi8KLX07Ci0KLXN0cnVjdCBmaWxlaW5mbyB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBkaXI7Ci0gIHVuc2lnbmVkIGludCB0aW1lOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLX07Ci0KLXN0cnVjdCBsaW5lX2luZm9fdGFibGUgewotICBiZmQqIGFiZmQ7Ci0KLSAgdW5zaWduZWQgaW50IG51bV9maWxlczsKLSAgdW5zaWduZWQgaW50IG51bV9kaXJzOwotCi0gIGNoYXIqIGNvbXBfZGlyOwotICBjaGFyKiogZGlyczsKLSAgc3RydWN0IGZpbGVpbmZvKiBmaWxlczsKLSAgc3RydWN0IGxpbmVfaW5mbyogbGFzdF9saW5lOwotfTsKLQotc3RhdGljIHZvaWQgCi1hZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgZW5kX3NlcXVlbmNlKQotICAgICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiB0YWJsZTsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBjaGFyKiBmaWxlbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIHVuc2lnbmVkIGludCBjb2x1bW47Ci0gICAgIGludCBlbmRfc2VxdWVuY2U7Ci17Ci0gIHN0cnVjdCBsaW5lX2luZm8qIGluZm8gPSAoc3RydWN0IGxpbmVfaW5mbyopCi0gICAgYmZkX2FsbG9jICh0YWJsZS0+YWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbGluZV9pbmZvKSk7Ci0KLSAgaW5mby0+cHJldl9saW5lID0gdGFibGUtPmxhc3RfbGluZTsKLSAgdGFibGUtPmxhc3RfbGluZSA9IGluZm87Ci0KLSAgaW5mby0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGluZm8tPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIGluZm8tPmxpbmUgPSBsaW5lOwotICBpbmZvLT5jb2x1bW4gPSBjb2x1bW47Ci0gIGluZm8tPmVuZF9zZXF1ZW5jZSA9IGVuZF9zZXF1ZW5jZTsKLX0KLQotc3RhdGljIGNoYXIqIAotY29uY2F0X2ZpbGVuYW1lICh0YWJsZSwgZmlsZSkKLSAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0gICAgIHVuc2lnbmVkIGludCBmaWxlOwotewotICBjaGFyKiBmaWxlbmFtZTsKLQotICBpZiAoZmlsZSAtIDEgPj0gdGFibGUtPm51bV9maWxlcykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBtYW5nbGVkIGxpbmUgbnVtYmVyICIKLQkJCSAgICAgICAic2VjdGlvbiAoYmFkIGZpbGUgbnVtYmVyKS4iKSk7Ci0gICAgICByZXR1cm4gIjx1bmtub3duPiI7Ci0gICAgfQotCi0gIGZpbGVuYW1lID0gdGFibGUtPmZpbGVzW2ZpbGUgLSAxXS5uYW1lOwotICBpZiAoKmZpbGVuYW1lID09ICcvJykKLSAgICByZXR1cm4gZmlsZW5hbWU7Ci0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIqIGRpcm5hbWUgPSAodGFibGUtPmZpbGVzW2ZpbGUgLSAxXS5kaXIKLQkJICAgICAgID8gdGFibGUtPmRpcnNbdGFibGUtPmZpbGVzW2ZpbGUgLSAxXS5kaXIgLSAxXQotCQkgICAgICAgOiB0YWJsZS0+Y29tcF9kaXIpOwotICAgICAgcmV0dXJuIChjaGFyKikgY29uY2F0IChkaXJuYW1lLCAiLyIsIGZpbGVuYW1lLCBOVUxMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcmFuZ2VfYWRkICh1bml0LCBsb3dfcGMsIGhpZ2hfcGMpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQgKnVuaXQ7Ci0gICAgIGJmZF92bWEgbG93X3BjOwotICAgICBiZmRfdm1hIGhpZ2hfcGM7Ci17Ci0gIHN0cnVjdCBhcmFuZ2UgKmFyYW5nZTsKLQotICAvKiBmaXJzdCBzZWUgaWYgd2UgY2FuIGNoZWFwbHkgZXh0ZW5kIGFuIGV4aXN0aW5nIHJhbmdlOiAqLwotICBhcmFuZ2UgPSAmdW5pdC0+YXJhbmdlOwotICBkbwotICAgIHsKLSAgICAgIGlmIChsb3dfcGMgPT0gYXJhbmdlLT5oaWdoKQotCXsKLQkgIGFyYW5nZS0+aGlnaCA9IGhpZ2hfcGM7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGhpZ2hfcGMgPT0gYXJhbmdlLT5sb3cpCi0JewotCSAgYXJhbmdlLT5sb3cgPSBsb3dfcGM7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYXJhbmdlID0gYXJhbmdlLT5uZXh0OwotICAgIH0KLSAgd2hpbGUgKGFyYW5nZSk7Ci0KLSAgaWYgKHVuaXQtPmFyYW5nZS5oaWdoID09IDApCi0gICAgewotICAgICAgLyogdGhpcyBpcyB0aGUgZmlyc3QgYWRkcmVzcyByYW5nZTogc3RvcmUgaXQgaW4gdW5pdC0+YXJhbmdlOiAqLwotICAgICAgdW5pdC0+YXJhbmdlLm5leHQgPSAwOwotICAgICAgdW5pdC0+YXJhbmdlLmxvdyA9IGxvd19wYzsKLSAgICAgIHVuaXQtPmFyYW5nZS5oaWdoID0gaGlnaF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBhcmFuZ2UgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBhcmFuZ2UgbGlzdDogKi8KLSAgYXJhbmdlID0gYmZkX3phbGxvYyAodW5pdC0+YWJmZCwgc2l6ZW9mICgqYXJhbmdlKSk7Ci0gIGFyYW5nZS0+bG93ID0gbG93X3BjOwotICBhcmFuZ2UtPmhpZ2ggPSBoaWdoX3BjOwotCi0gIGFyYW5nZS0+bmV4dCA9IHVuaXQtPmFyYW5nZS5uZXh0OwotICB1bml0LT5hcmFuZ2UubmV4dCA9IGFyYW5nZTsKLX0KLQotLyogRGVjb2RlIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgVU5JVC4gKi8KLQotc3RhdGljIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqCi1kZWNvZGVfbGluZV9pbmZvICh1bml0KQotICAgICBzdHJ1Y3QgY29tcF91bml0ICp1bml0OwotewotICBiZmQgKmFiZmQgPSB1bml0LT5hYmZkOwotCi0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKnN0YXNoOwotCi0gIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOwotCi0gIGNoYXIgKmxpbmVfcHRyOwotICBjaGFyICpsaW5lX2VuZDsKLSAgc3RydWN0IGxpbmVfaGVhZCBsaDsKLSAgdW5zaWduZWQgaW50IGksIGJ5dGVzX3JlYWQ7Ci0gIGNoYXIgKmN1cl9maWxlLCAqY3VyX2RpcjsKLSAgdW5zaWduZWQgY2hhciBvcF9jb2RlLCBleHRlbmRlZF9vcCwgYWRqX29wY29kZTsKLQotICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICBpZiAoISBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci0KLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1Z19saW5lIik7Ci0gICAgICBpZiAoISBtc2VjKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2xpbmUgc2VjdGlvbi4iKSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIAotICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgaWYgKCEgc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyKQotCXJldHVybiAwOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG1zZWMsIAotCQkJCSAgICAgIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlciwgMCwKLQkJCQkgICAgICBzaXplKSkKLQlyZXR1cm4gMDsKLQotICAgICAgLyogRklYTUU6IFdlIG91Z2h0IHRvIGFwcGx5IHRoZSByZWxvY3MgYWdhaW5zdCB0aGlzIHNlY3Rpb24gYmVmb3JlCi0JIHdlIHByb2Nlc3MgaXQuLi4uICovCi0gICAgfQotCi0gIHRhYmxlID0gKHN0cnVjdCBsaW5lX2luZm9fdGFibGUqKSBiZmRfYWxsb2MgKGFiZmQsIAotCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKSk7Ci0gIHRhYmxlLT5hYmZkID0gYWJmZDsKLSAgdGFibGUtPmNvbXBfZGlyID0gdW5pdC0+Y29tcF9kaXI7Ci0KLSAgdGFibGUtPm51bV9maWxlcyA9IDA7Ci0gIHRhYmxlLT5maWxlcyA9IE5VTEw7Ci0KLSAgdGFibGUtPm51bV9kaXJzID0gMDsKLSAgdGFibGUtPmRpcnMgPSBOVUxMOwotCi0gIHRhYmxlLT5maWxlcyA9IE5VTEw7Ci0gIHRhYmxlLT5sYXN0X2xpbmUgPSBOVUxMOwotCi0gIGxpbmVfcHRyID0gc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyICsgdW5pdC0+bGluZV9vZmZzZXQ7Ci0KLSAgLyogcmVhZCBpbiB0aGUgcHJvbG9ndWUgKi8KLSAgbGgudG90YWxfbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDQ7Ci0gIGxpbmVfZW5kID0gbGluZV9wdHIgKyBsaC50b3RhbF9sZW5ndGg7Ci0gIGxoLnZlcnNpb24gPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMjsKLSAgbGgucHJvbG9ndWVfbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDQ7Ci0gIGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGguZGVmYXVsdF9pc19zdG10ID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGgubGluZV9iYXNlID0gcmVhZF8xX3NpZ25lZF9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLmxpbmVfcmFuZ2UgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5vcGNvZGVfYmFzZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLnN0YW5kYXJkX29wY29kZV9sZW5ndGhzID0gKHVuc2lnbmVkIGNoYXIgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIGxoLm9wY29kZV9iYXNlICogc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0KLSAgbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbMF0gPSAxOwotICBmb3IgKGkgPSAxOyBpIDwgbGgub3Bjb2RlX2Jhc2U7ICsraSkKLSAgICB7Ci0gICAgICBsaC5zdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tpXSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gICAgICBsaW5lX3B0ciArPSAxOwotICAgIH0KLQotICAvKiBSZWFkIGRpcmVjdG9yeSB0YWJsZSAgKi8KLSAgd2hpbGUgKChjdXJfZGlyID0gcmVhZF9zdHJpbmcgKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCkpICE9IE5VTEwpCi0gICAgewotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGlmICgodGFibGUtPm51bV9kaXJzICUgRElSX0FMTE9DX0NIVU5LKSA9PSAwKQotCXsKLQkgIHRhYmxlLT5kaXJzID0gKGNoYXIgKiopCi0JICAgIGJmZF9yZWFsbG9jICh0YWJsZS0+ZGlycywKLQkJCSAodGFibGUtPm51bV9kaXJzICsgRElSX0FMTE9DX0NIVU5LKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICBpZiAoISB0YWJsZS0+ZGlycykKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgICAgdGFibGUtPmRpcnNbdGFibGUtPm51bV9kaXJzKytdID0gY3VyX2RpcjsKLSAgICB9Ci0gIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgLyogUmVhZCBmaWxlIG5hbWUgdGFibGUgKi8KLSAgd2hpbGUgKChjdXJfZmlsZSA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBpZiAoKHRhYmxlLT5udW1fZmlsZXMgJSBGSUxFX0FMTE9DX0NIVU5LKSA9PSAwKQotCXsKLQkgIHRhYmxlLT5maWxlcyA9IChzdHJ1Y3QgZmlsZWluZm8gKikKLQkgICAgYmZkX3JlYWxsb2MgKHRhYmxlLT5maWxlcywKLQkJCSAodGFibGUtPm51bV9maWxlcyArIEZJTEVfQUxMT0NfQ0hVTkspCi0JCQkgKiBzaXplb2YgKHN0cnVjdCBmaWxlaW5mbykpOwotCSAgaWYgKCEgdGFibGUtPmZpbGVzKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10ubmFtZSA9IGN1cl9maWxlOwotICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLmRpciA9Ci0JcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnRpbWUgPQotCXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5zaXplID0KLQlyZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICB0YWJsZS0+bnVtX2ZpbGVzKys7Ci0gICAgfQotICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCi0gIC8qIFJlYWQgdGhlIHN0YXRlbWVudCBzZXF1ZW5jZXMgdW50aWwgdGhlcmUncyBub3RoaW5nIGxlZnQuICAqLwotICB3aGlsZSAobGluZV9wdHIgPCBsaW5lX2VuZCkKLSAgICB7Ci0gICAgICAvKiBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAgKi8KLSAgICAgIGJmZF92bWEgYWRkcmVzcyA9IDA7Ci0gICAgICBjaGFyKiBmaWxlbmFtZSA9IGNvbmNhdF9maWxlbmFtZSAodGFibGUsIDEpOwotICAgICAgdW5zaWduZWQgaW50IGxpbmUgPSAxOwotICAgICAgdW5zaWduZWQgaW50IGNvbHVtbiA9IDA7Ci0gICAgICBpbnQgaXNfc3RtdCA9IGxoLmRlZmF1bHRfaXNfc3RtdDsKLSAgICAgIGludCBiYXNpY19ibG9jayA9IDA7Ci0gICAgICBpbnQgZW5kX3NlcXVlbmNlID0gMCwgbmVlZF9sb3dfcGMgPSAxOwotICAgICAgYmZkX3ZtYSBsb3dfcGMgPSAwOwotCi0gICAgICAvKiBEZWNvZGUgdGhlIHRhYmxlLiAqLwotICAgICAgd2hpbGUgKCEgZW5kX3NlcXVlbmNlKQotCXsKLQkgIG9wX2NvZGUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotCSAgbGluZV9wdHIgKz0gMTsKLQkgIHN3aXRjaCAob3BfY29kZSkKLQkgICAgewotCSAgICBjYXNlIERXX0xOU19leHRlbmRlZF9vcDoKLQkgICAgICBsaW5lX3B0ciArPSAxOwkvKiBpZ25vcmUgbGVuZ3RoICovCi0JICAgICAgZXh0ZW5kZWRfb3AgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotCSAgICAgIGxpbmVfcHRyICs9IDE7Ci0JICAgICAgc3dpdGNoIChleHRlbmRlZF9vcCkKLQkJewotCQljYXNlIERXX0xORV9lbmRfc2VxdWVuY2U6Ci0JCSAgZW5kX3NlcXVlbmNlID0gMTsKLQkJICBhZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwKLQkJCQkgZW5kX3NlcXVlbmNlKTsKLQkJICBpZiAobmVlZF9sb3dfcGMpCi0JCSAgICB7Ci0JCSAgICAgIG5lZWRfbG93X3BjID0gMDsKLQkJICAgICAgbG93X3BjID0gYWRkcmVzczsKLQkJICAgIH0KLQkJICBhcmFuZ2VfYWRkICh1bml0LCBsb3dfcGMsIGFkZHJlc3MpOwotCQkgIGJyZWFrOwotCQljYXNlIERXX0xORV9zZXRfYWRkcmVzczoKLQkJICBhZGRyZXNzID0gcmVhZF9hZGRyZXNzICh1bml0LCBsaW5lX3B0cik7Ci0JCSAgbGluZV9wdHIgKz0gdW5pdC0+YWRkcl9zaXplOwotCQkgIGJyZWFrOwotCQljYXNlIERXX0xORV9kZWZpbmVfZmlsZToKLQkJICBjdXJfZmlsZSA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCSAgaWYgKCh0YWJsZS0+bnVtX2ZpbGVzICUgRklMRV9BTExPQ19DSFVOSykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdGFibGUtPmZpbGVzID0gKHN0cnVjdCBmaWxlaW5mbyAqKQotCQkJYmZkX3JlYWxsb2MgKHRhYmxlLT5maWxlcywKLQkJCQkgICAgICh0YWJsZS0+bnVtX2ZpbGVzICsgRklMRV9BTExPQ19DSFVOSykKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgZmlsZWluZm8pKTsKLQkJICAgICAgaWYgKCEgdGFibGUtPmZpbGVzKQotCQkJcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLm5hbWUgPSBjdXJfZmlsZTsKLQkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uZGlyID0KLQkJICAgIHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnRpbWUgPQotCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uc2l6ZSA9Ci0JCSAgICByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQkgIHRhYmxlLT5udW1fZmlsZXMrKzsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBtYW5nbGVkIGxpbmUgbnVtYmVyIHNlY3Rpb24uIikpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX2NvcHk6Ci0JICAgICAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIDApOwotCSAgICAgIGJhc2ljX2Jsb2NrID0gMDsKLQkgICAgICBpZiAobmVlZF9sb3dfcGMpCi0JCXsKLQkJICBuZWVkX2xvd19wYyA9IDA7Ci0JCSAgbG93X3BjID0gYWRkcmVzczsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX3BjOgotCSAgICAgIGFkZHJlc3MgKz0gbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGgKLQkJKiByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX2xpbmU6Ci0JICAgICAgbGluZSArPSByZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6Ci0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgZmlsZTsKLQotCQkvKiBUaGUgZmlsZSBhbmQgZGlyZWN0b3J5IHRhYmxlcyBhcmUgMCBiYXNlZCwgdGhlIHJlZmVyZW5jZXMKLQkJICAgYXJlIDEgYmFzZWQuICAqLwotCQlmaWxlID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCWxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCWZpbGVuYW1lID0gY29uY2F0X2ZpbGVuYW1lICh0YWJsZSwgZmlsZSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2NvbHVtbjoKLQkgICAgICBjb2x1bW4gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19uZWdhdGVfc3RtdDoKLQkgICAgICBpc19zdG10ID0gKCFpc19zdG10KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIGJhc2ljX2Jsb2NrID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfY29uc3RfYWRkX3BjOgotCSAgICAgIGFkZHJlc3MgKz0gbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGgKLQkJICAgICAgKiAoKDI1NSAtIGxoLm9wY29kZV9iYXNlKSAvIGxoLmxpbmVfcmFuZ2UpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgotCSAgICAgIGFkZHJlc3MgKz0gcmVhZF8yX2J5dGVzIChhYmZkLCBsaW5lX3B0cik7Ci0JICAgICAgbGluZV9wdHIgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoJCS8qIHNwZWNpYWwgb3BlcmFuZCAqLwotCSAgICAgIGFkal9vcGNvZGUgPSBvcF9jb2RlIC0gbGgub3Bjb2RlX2Jhc2U7Ci0JICAgICAgYWRkcmVzcyArPSAoYWRqX29wY29kZSAvIGxoLmxpbmVfcmFuZ2UpCi0JCSogbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7Ci0JICAgICAgbGluZSArPSBsaC5saW5lX2Jhc2UgKyAoYWRqX29wY29kZSAlIGxoLmxpbmVfcmFuZ2UpOwotCSAgICAgIC8qIGFwcGVuZCByb3cgdG8gbWF0cml4IHVzaW5nIGN1cnJlbnQgdmFsdWVzICovCi0JICAgICAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIDApOwotCSAgICAgIGJhc2ljX2Jsb2NrID0gMTsKLQkgICAgICBpZiAobmVlZF9sb3dfcGMpCi0JCXsKLQkJICBuZWVkX2xvd19wYyA9IDA7Ci0JCSAgbG93X3BjID0gYWRkcmVzczsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdGFibGU7Ci19Ci0KLQotLyogSWYgQUREUiBpcyB3aXRoaW4gVEFCTEUgc2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRydWUsCi0gICBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLiAgVGhlIG91dHB1dCBwYXJhbWV0ZXJzLCBGSUxFTkFNRV9QVFIgYW5kCi0gICBMSU5FTlVNQkVSX1BUUiwgYXJlIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzIHRvIGJlIGZpbGxlZCBpbi4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWxvb2t1cF9hZGRyZXNzX2luX2xpbmVfaW5mb190YWJsZSAodGFibGUsIAotCQkJCSAgIGFkZHIsCi0JCQkJICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkgICBsaW5lbnVtYmVyX3B0cikKLSAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKLXsKLSAgc3RydWN0IGxpbmVfaW5mbyogbmV4dF9saW5lID0gdGFibGUtPmxhc3RfbGluZTsKLSAgc3RydWN0IGxpbmVfaW5mbyogZWFjaF9saW5lOwotICAKLSAgaWYgKCFuZXh0X2xpbmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVhY2hfbGluZSA9IG5leHRfbGluZS0+cHJldl9saW5lOwotCi0gIHdoaWxlIChlYWNoX2xpbmUgJiYgbmV4dF9saW5lKQotICAgIHsKLSAgICAgIGlmICghZWFjaF9saW5lLT5lbmRfc2VxdWVuY2UKLQkgICYmIGFkZHIgPj0gZWFjaF9saW5lLT5hZGRyZXNzICYmIGFkZHIgPCBuZXh0X2xpbmUtPmFkZHJlc3MpCi0JewotCSAgKmZpbGVuYW1lX3B0ciA9IGVhY2hfbGluZS0+ZmlsZW5hbWU7Ci0JICAqbGluZW51bWJlcl9wdHIgPSBlYWNoX2xpbmUtPmxpbmU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBuZXh0X2xpbmUgPSBlYWNoX2xpbmU7Ci0gICAgICBlYWNoX2xpbmUgPSBlYWNoX2xpbmUtPnByZXZfbGluZTsKLSAgICB9Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0gIAotCi0KLQotLyogRnVuY3Rpb24gdGFibGUgZnVuY3Rpb25zLiAqLwotCi1zdHJ1Y3QgZnVuY2luZm8gewotICBzdHJ1Y3QgZnVuY2luZm8gKnByZXZfZnVuYzsKLQotICBjaGFyKiBuYW1lOwotICBiZmRfdm1hIGxvdzsKLSAgYmZkX3ZtYSBoaWdoOwotfTsKLQotCi0vKiBJZiBBRERSIGlzIHdpdGhpbiBUQUJMRSwgc2V0IEZVTkNUSU9OTkFNRV9QVFIsIGFuZCByZXR1cm4gdHJ1ZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlICh0YWJsZSwgCi0JCQkJICBhZGRyLAotCQkJCSAgZnVuY3Rpb25uYW1lX3B0cikKLSAgICAgc3RydWN0IGZ1bmNpbmZvKiB0YWJsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLXsKLSAgc3RydWN0IGZ1bmNpbmZvKiBlYWNoX2Z1bmM7Ci0KLSAgZm9yIChlYWNoX2Z1bmMgPSB0YWJsZTsKLSAgICAgICBlYWNoX2Z1bmM7Ci0gICAgICAgZWFjaF9mdW5jID0gZWFjaF9mdW5jLT5wcmV2X2Z1bmMpCi0gICAgewotICAgICAgaWYgKGFkZHIgPj0gZWFjaF9mdW5jLT5sb3cgJiYgYWRkciA8IGVhY2hfZnVuYy0+aGlnaCkKLQl7Ci0JICAqZnVuY3Rpb25uYW1lX3B0ciA9IGVhY2hfZnVuYy0+bmFtZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotCi0KLS8qIERXQVJGMiBDb21waWxhdGlvbiB1bml0IGZ1bmN0aW9ucy4gKi8KLQotCi0vKiBTY2FuIG92ZXIgZWFjaCBkaWUgaW4gYSBjb21wLiB1bml0IGxvb2tpbmcgZm9yIGZ1bmN0aW9ucyB0byBhZGQKLSAgIHRvIHRoZSBmdW5jdGlvbiB0YWJsZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXNjYW5fdW5pdF9mb3JfZnVuY3Rpb25zICh1bml0KQotICAgICBzdHJ1Y3QgY29tcF91bml0ICp1bml0OwotewotICBiZmQgKmFiZmQgPSB1bml0LT5hYmZkOwotICBjaGFyICppbmZvX3B0ciA9IHVuaXQtPmZpcnN0X2NoaWxkX2RpZV9wdHI7Ci0gIGludCBuZXN0aW5nX2xldmVsID0gMTsKLQotICB3aGlsZSAobmVzdGluZ19sZXZlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWJicmV2X251bWJlciwgYnl0ZXNfcmVhZCwgaTsKLSAgICAgIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OwotICAgICAgc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotICAgICAgc3RydWN0IGZ1bmNpbmZvICpmdW5jOwotICAgICAgY2hhciogbmFtZSA9IDA7Ci0KLSAgICAgIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICAgIGlmICghIGFiYnJldl9udW1iZXIpCi0JewotCSAgbmVzdGluZ19sZXZlbC0tOwotCSAgY29udGludWU7Ci0JfQotICAgICAgCi0gICAgICBhYmJyZXYgPSBsb29rdXBfYWJicmV2IChhYmJyZXZfbnVtYmVyLHVuaXQtPmFiYnJldnMpOwotICAgICAgaWYgKCEgYWJicmV2KQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IENvdWxkIG5vdCBmaW5kIGFiYnJldiBudW1iZXIgJWQuIiksIAotCQkJICAgICBhYmJyZXZfbnVtYmVyKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIAotICAgICAgaWYgKGFiYnJldi0+dGFnID09IERXX1RBR19zdWJwcm9ncmFtKQotCXsKLQkgIGZ1bmMgPSAoc3RydWN0IGZ1bmNpbmZvKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZnVuY2luZm8pKTsKLQkgIGZ1bmMtPnByZXZfZnVuYyA9IHVuaXQtPmZ1bmN0aW9uX3RhYmxlOwotCSAgdW5pdC0+ZnVuY3Rpb25fdGFibGUgPSBmdW5jOwotCX0KLSAgICAgIGVsc2UKLQlmdW5jID0gTlVMTDsKLSAgCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJicmV2LT5udW1fYXR0cnM7ICsraSkKLQl7Ci0JICBpbmZvX3B0ciA9IHJlYWRfYXR0cmlidXRlICgmYXR0ciwgJmFiYnJldi0+YXR0cnNbaV0sIHVuaXQsIGluZm9fcHRyKTsKLQkgIAotCSAgaWYgKGZ1bmMpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGF0dHIubmFtZSkKLQkJewotCQljYXNlIERXX0FUX25hbWU6Ci0JCSAgCi0JCSAgbmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCi0JCSAgLyogUHJlZmVyIERXX0FUX01JUFNfbGlua2FnZV9uYW1lIG92ZXIgRFdfQVRfbmFtZS4gICovCi0JCSAgaWYgKGZ1bmMtPm5hbWUgPT0gTlVMTCkKLQkJICAgIGZ1bmMtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZToKLQkJICBmdW5jLT5uYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19BVF9sb3dfcGM6Ci0JCSAgZnVuYy0+bG93ID0gRFdfQUREUiAoJmF0dHIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfQVRfaGlnaF9wYzoKLQkJICBmdW5jLT5oaWdoID0gRFdfQUREUiAoJmF0dHIpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChhdHRyLm5hbWUpCi0JCXsKLQkJY2FzZSBEV19BVF9uYW1lOgotCQkgIG5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkJICBicmVhazsKLQkJICAKLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoYWJicmV2LT5oYXNfY2hpbGRyZW4pCi0JbmVzdGluZ19sZXZlbCsrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLQotCi0KLS8qIFBhcnNlIGEgRFdBUkYyIGNvbXBpbGF0aW9uIHVuaXQgc3RhcnRpbmcgYXQgSU5GT19QVFIuICBUaGlzCi0gICBpbmNsdWRlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgdGhhdCBwcm9jZWVkcyB0aGUgRElFJ3MsIGJ1dAotICAgZG9lcyBub3QgaW5jbHVkZSB0aGUgbGVuZ3RoIGZpZWxkIHRoYXQgcHJlY2VlZHMgZWFjaCBjb21waWxhdGlvbgotICAgdW5pdCBoZWFkZXIuICBFTkRfUFRSIHBvaW50cyBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoaXMgY29tcCB1bml0LgotICAgSWYgQUJCUkVWX0xFTkdUSCBpcyAwLCB0aGVuIHRoZSBsZW5ndGggb2YgdGhlIGFiYnJldmlhdGlvbiBvZmZzZXQKLSAgIGlzIGFzc3VtZWQgdG8gYmUgZm91ciBieXRlcy4gIE90aGVyd2lzZSwgaXQgaXQgaXMgdGhlIHNpemUgZ2l2ZW4uCi0KLSAgIFRoaXMgcm91dGluZSBkb2VzIG5vdCByZWFkIHRoZSB3aG9sZSBjb21waWxhdGlvbiB1bml0OyBvbmx5IGVub3VnaAotICAgdG8gZ2V0IHRvIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgc3RydWN0IGNvbXBfdW5pdCAqCi1wYXJzZV9jb21wX3VuaXQgKGFiZmQsIGluZm9fcHRyLCBlbmRfcHRyLCBhYmJyZXZfbGVuZ3RoKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIGNoYXIqIGluZm9fcHRyOwotICAgICBjaGFyKiBlbmRfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgYWJicmV2X2xlbmd0aDsKLXsKLSAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKLQotICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotICB1bnNpZ25lZCBpbnQgYWJicmV2X29mZnNldDsKLSAgdW5zaWduZWQgY2hhciBhZGRyX3NpemU7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyoqIGFiYnJldnM7Ci0KLSAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGk7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OwotICBzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0KLSAgdmVyc2lvbiA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICBpbmZvX3B0ciArPSAyOwotICBCRkRfQVNTRVJUIChhYmJyZXZfbGVuZ3RoID09IDAKLQkgICAgICB8fCBhYmJyZXZfbGVuZ3RoID09IDQKLQkgICAgICB8fCBhYmJyZXZfbGVuZ3RoID09IDgpOwotICBpZiAoYWJicmV2X2xlbmd0aCA9PSAwIHx8IGFiYnJldl9sZW5ndGggPT0gNCkKLSAgICBhYmJyZXZfb2Zmc2V0ID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gIGVsc2UgaWYgKGFiYnJldl9sZW5ndGggPT0gOCkKLSAgICBhYmJyZXZfb2Zmc2V0ID0gcmVhZF84X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IGFiYnJldl9sZW5ndGg7Ci0gIGFkZHJfc2l6ZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IDE7Ci0KLSAgaWYgKHZlcnNpb24gIT0gMikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBmb3VuZCBkd2FyZiB2ZXJzaW9uICclaHUnLCB0aGlzIHJlYWRlciBvbmx5IGhhbmRsZXMgdmVyc2lvbiAyIGluZm9ybWF0aW9uLiIpLCB2ZXJzaW9uICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYWRkcl9zaXplID4gc2l6ZW9mIChiZmRfdm1hKSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG5vdCBoYW5kbGUgc2l6ZXMgZ3JlYXRlciB0aGFuICcldScuIiksCi0JCQkgYWRkcl9zaXplLAotCQkJIHNpemVvZiAoYmZkX3ZtYSkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFkZHJfc2l6ZSAhPSA0ICYmIGFkZHJfc2l6ZSAhPSA4KQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG9ubHkgaGFuZGxlIGFkZHJlc3Mgc2l6ZXMgJzQnIGFuZCAnOCcuIiwgYWRkcl9zaXplICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBhYmJyZXZzIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaW50byBhIHRhYmxlICovCi0gIGFiYnJldnMgPSByZWFkX2FiYnJldnMgKGFiZmQsIGFiYnJldl9vZmZzZXQpOwotICBpZiAoISBhYmJyZXZzKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICBpZiAoISBhYmJyZXZfbnVtYmVyKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IEJhZCBhYmJyZXYgbnVtYmVyOiAlZC4iKSwKLQkJCSBhYmJyZXZfbnVtYmVyKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFiYnJldiA9IGxvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIsIGFiYnJldnMpOwotICBpZiAoISBhYmJyZXYpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iKSwKLQkJCSBhYmJyZXZfbnVtYmVyKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgdW5pdCA9IChzdHJ1Y3QgY29tcF91bml0KikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29tcF91bml0KSk7Ci0gIHVuaXQtPmFiZmQgPSBhYmZkOwotICB1bml0LT5hZGRyX3NpemUgPSBhZGRyX3NpemU7IAotICB1bml0LT5hYmJyZXZzID0gYWJicmV2czsKLSAgdW5pdC0+ZW5kX3B0ciA9IGVuZF9wdHI7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGFiYnJldi0+bnVtX2F0dHJzOyArK2kpCi0gICAgewotICAgICAgaW5mb19wdHIgPSByZWFkX2F0dHJpYnV0ZSAoJmF0dHIsICZhYmJyZXYtPmF0dHJzW2ldLCB1bml0LCBpbmZvX3B0cik7Ci0KLSAgICAgIC8qIFN0b3JlIHRoZSBkYXRhIGlmIGl0IGlzIG9mIGFuIGF0dHJpYnV0ZSB3ZSB3YW50IHRvIGtlZXAgaW4gYQotCSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzd2l0Y2ggKGF0dHIubmFtZSkKLQl7Ci0JY2FzZSBEV19BVF9zdG10X2xpc3Q6Ci0JICB1bml0LT5zdG10bGlzdCA9IDE7Ci0JICB1bml0LT5saW5lX29mZnNldCA9IERXX1VOU05EICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfbmFtZToKLQkgIHVuaXQtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9sb3dfcGM6Ci0JICB1bml0LT5hcmFuZ2UubG93ID0gRFdfQUREUiAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2hpZ2hfcGM6Ci0JICB1bml0LT5hcmFuZ2UuaGlnaCA9IERXX0FERFIgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9jb21wX2RpcjoKLQkgIHsKLQkgICAgY2hhciogY29tcF9kaXIgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkgICAgaWYgKGNvbXBfZGlyKQotCSAgICAgIHsKLQkJLyogSXJpeCA2LjIgbmF0aXZlIGNjIHByZXBlbmRzIDxtYWNoaW5lPi46IHRvIHRoZSBjb21waWxhdGlvbgotCQkgICBkaXJlY3RvcnksIGdldCByaWQgb2YgaXQuICAqLwotCQljaGFyICpjcCA9IChjaGFyKikgc3RyY2hyIChjb21wX2RpciwgJzonKTsKLQotCQlpZiAoY3AgJiYgY3AgIT0gY29tcF9kaXIgJiYgY3BbLTFdID09ICcuJyAmJiBjcFsxXSA9PSAnLycpCi0JCSAgY29tcF9kaXIgPSBjcCArIDE7Ci0JICAgICAgfQotCSAgICB1bml0LT5jb21wX2RpciA9IGNvbXBfZGlyOwotCSAgICBicmVhazsKLQkgIH0KLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHVuaXQtPmZpcnN0X2NoaWxkX2RpZV9wdHIgPSBpbmZvX3B0cjsKLSAgcmV0dXJuIHVuaXQ7Ci19Ci0KLQotCi0KLQotLyogUmV0dXJuIHRydWUgaWYgVU5JVCBjb250YWlucyB0aGUgYWRkcmVzcyBnaXZlbiBieSBBRERSLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MgKHVuaXQsIGFkZHIpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGFyYW5nZSAqYXJhbmdlOwotCi0gIGlmICh1bml0LT5lcnJvcikKLSAgICByZXR1cm4gMDsKLQotICBhcmFuZ2UgPSAmdW5pdC0+YXJhbmdlOwotICBkbwotICAgIHsKLSAgICAgIGlmIChhZGRyID49IGFyYW5nZS0+bG93ICYmIGFkZHIgPCBhcmFuZ2UtPmhpZ2gpCi0JcmV0dXJuIDE7Ci0gICAgICBhcmFuZ2UgPSBhcmFuZ2UtPm5leHQ7Ci0gICAgfQotICB3aGlsZSAoYXJhbmdlKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogSWYgVU5JVCBjb250YWlucyBBRERSLCBzZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIHRvIHRoZSB2YWx1ZXMgZm9yCi0gICB0aGUgbGluZSBjb250YWluaW5nIEFERFIuICBUaGUgb3V0cHV0IHBhcmFtZXRlcnMsIEZJTEVOQU1FX1BUUiwKLSAgIEZVTkNUSU9OTkFNRV9QVFIsIGFuZCBMSU5FTlVNQkVSX1BUUiwgYXJlIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzCi0gICB0byBiZSBmaWxsZWQgaW4uICAKLQotICAgUmV0dXJuIHRydWUgb2YgVU5JVCBjb250YWlucyBBRERSLCBhbmQgbm8gZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQ7Ci0gICBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lICh1bml0LCBhZGRyLAotCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBib29sZWFuIGxpbmVfcDsKLSAgYm9vbGVhbiBmdW5jX3A7Ci0gIAotICBpZiAodW5pdC0+ZXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHVuaXQtPmxpbmVfdGFibGUpCi0gICAgewotICAgICAgaWYgKCEgdW5pdC0+c3RtdGxpc3QpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgCi0gICAgICB1bml0LT5saW5lX3RhYmxlID0gZGVjb2RlX2xpbmVfaW5mbyAodW5pdCk7Ci0KLSAgICAgIGlmICghIHVuaXQtPmxpbmVfdGFibGUpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIAotICAgICAgaWYgKCEgc2Nhbl91bml0X2Zvcl9mdW5jdGlvbnMgKHVuaXQpKQotCXsKLQkgIHVuaXQtPmVycm9yID0gMTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGxpbmVfcCA9IGxvb2t1cF9hZGRyZXNzX2luX2xpbmVfaW5mb190YWJsZSAodW5pdC0+bGluZV90YWJsZSwKLQkJCQkJICAgICAgYWRkciwKLQkJCQkJICAgICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJICAgICAgbGluZW51bWJlcl9wdHIpOwotICBmdW5jX3AgPSBsb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSAodW5pdC0+ZnVuY3Rpb25fdGFibGUsIAotCQkJCQkgICAgIGFkZHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0cik7Ci0gIHJldHVybiBsaW5lX3AgfHwgZnVuY19wOwotfQotCi0vKiBUaGUgRFdBUkYyIHZlcnNpb24gb2YgZmluZF9uZWFyZXN0IGxpbmUuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZQotICAgaXMgZm91bmQgd2l0aG91dCBlcnJvci4gIEFERFJfU0laRSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgaW5pdGlhbCAuZGVidWdfaW5mbyBsZW5ndGggZmllbGQgYW5kIGluIHRoZSBhYmJyZXZpYXRpb24gb2Zmc2V0LgotICAgWW91IG1heSB1c2UgemVybyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZQotICAgdXNlZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJICAgICAgIGxpbmVudW1iZXJfcHRyLAotCQkJICAgICAgIGFkZHJfc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKLSAgICAgdW5zaWduZWQgaW50IGFkZHJfc2l6ZTsKLXsKLSAgLyogUmVhZCBlYWNoIGNvbXBpbGF0aW9uIHVuaXQgZnJvbSB0aGUgc2VjdGlvbiAuZGVidWdfaW5mbywgYW5kIGNoZWNrCi0gICAgIHRvIHNlZSBpZiBpdCBjb250YWlucyB0aGUgYWRkcmVzcyB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gIElmIHllcywKLSAgICAgbG9va3VwIHRoZSBhZGRyZXNzLCBhbmQgcmV0dXJuIHRoZSBsaW5lIG51bWJlciBpbmZvLiAgSWYgbm8sIGdvCi0gICAgIG9uIHRvIHRoZSBuZXh0IGNvbXBpbGF0aW9uIHVuaXQuICAKLQotICAgICBXZSBrZWVwIGEgbGlzdCBvZiBhbGwgdGhlIHByZXZpb3VzbHkgcmVhZCBjb21waWxhdGlvbiB1bml0cywgYW5kCi0gICAgIGEgcG9pbnRlciB0byB0aGUgbmV4dCB1bi1yZWFkIGNvbXBpbGF0aW9uIHVuaXQuICBDaGVjayB0aGUgCi0gICAgIHByZXZpb3VzbHkgcmVhZCB1bml0cyBiZWZvcmUgcmVhZGluZyBtb3JlLgotICAgICAqLwotCi0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKnN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYyX2ZpbmRfbGluZV9pbmZvOwotCi0gIC8qIFdoYXQgYWRkcmVzcyBhcmUgd2UgbG9va2luZyBmb3I/ICovCi0gIGJmZF92bWEgYWRkciA9IG9mZnNldCArIHNlY3Rpb24tPnZtYTsKLQotICBzdHJ1Y3QgY29tcF91bml0KiBlYWNoOwotICAKLSAgKmZpbGVuYW1lX3B0ciA9IE5VTEw7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gTlVMTDsKLSAgKmxpbmVudW1iZXJfcHRyID0gMDsKLQotICAvKiBUaGUgRFdBUkYyIHNwZWMgc2F5cyB0aGF0IHRoZSBpbml0aWFsIGxlbmd0aCBmaWVsZCwgYW5kIHRoZQotICAgICBvZmZzZXQgb2YgdGhlIGFiYnJldmlhdGlvbiB0YWJsZSwgc2hvdWxkIGJvdGggYmUgNC1ieXRlIHZhbHVlcy4KLSAgICAgSG93ZXZlciwgc29tZSBjb21waWxlcnMgZG8gdGhpbmdzIGRpZmZlcmVudGx5LiAgKi8KLSAgaWYgKGFkZHJfc2l6ZSA9PSAwKQotICAgIGFkZHJfc2l6ZSA9IDQ7Ci0gIEJGRF9BU1NFUlQgKGFkZHJfc2l6ZSA9PSA0IHx8IGFkZHJfc2l6ZSA9PSA4KTsKLSAgICAKLSAgaWYgKCEgc3Rhc2gpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci0gICAgICAKLSAgICAgIHN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYyX2ZpbmRfbGluZV9pbmZvID0KLQkoc3RydWN0IGR3YXJmMl9kZWJ1ZyopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmMl9kZWJ1ZykpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1Z19pbmZvIik7Ci0gICAgICBpZiAoISBtc2VjKQotCXsKLQkgIC8qIE5vIGR3YXJmMiBpbmZvLiAgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHN0YXNoCi0JICAgICBoYXMgYmVlbiBhbGxvY2F0ZWQsIGJ1dCBjb250YWlucyB6ZXJvcywgdGhpcyBsZXRzCi0JICAgICBmdXR1cmUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBmYWlsIHF1aWNrZXIuICovCi0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKLSAgICAgIGlmIChzaXplID09IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBzdGFzaC0+aW5mb19wdHIgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaC0+aW5mb19wdHIpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG1zZWMsIHN0YXNoLT5pbmZvX3B0ciwgMCwgc2l6ZSkpCi0JewotCSAgc3Rhc2gtPmluZm9fcHRyID0gMDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0YXNoLT5pbmZvX3B0cl9lbmQgPSBzdGFzaC0+aW5mb19wdHIgKyBzaXplOwotCi0gICAgICAvKiBGSVhNRTogVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZQotCSAuZGVidWdfaW5mbyBzZWN0aW9uLiAgVGhlICdsb3cnIGFuZCAnaGlnaCcgYWRkcmVzc2VzIG9mIHRoZQotCSBjb21wX3VuaXRzIGFyZSBjb21wdXRlZCBieSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGluIHRoZQotCSAudGV4dCBzZWdtZW50LiAgV2UgbmVlZCB0aGVzZSBhZGRyZXNzZXMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lCi0JIHRoZSBuZWFyZXN0IGxpbmUgbnVtYmVyLCBhbmQgc28gd2UgaGF2ZSB0byByZXNvbHZlIHRoZQotCSByZWxvY3MuICBUaGVyZSBpcyBhIHNpbWlsYXIgcHJvYmxlbSB3aGVuIHRoZSAuZGVidWdfbGluZQotCSBzZWN0aW9uIGlzIHByb2Nlc3NlZCBhcyB3ZWxsIChlLmcuLCB0aGVyZSBtYXkgYmUgcmVsb2NzCi0JIGFnYWluc3QgdGhlIG9wZXJhbmQgb2YgdGhlIERXX0xORV9zZXRfYWRkcmVzcyBvcGVyYXRvcikuCi0JIAotCSBVbmZvcnR1bmF0ZWx5IGdldHRpbmcgaG9sZCBvZiB0aGUgcmVsb2MgaW5mb3JtYXRpb24gaXMgaGFyZC4uLgotCi0JIEZvciBub3csIHRoaXMgbWVhbnMgdGhhdCBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcyAoYXMKLQkgb3Bwb3NlZCB0byBmdWxseSBleGVjdXRhYmxlcykgZG9lcyBub3QgYWx3YXlzIHdvcmsgYXMgd2VsbCBhcwotCSB3ZSB3b3VsZCBsaWtlLiAgKi8KLSAgICB9Ci0gIAotICAvKiBBIG51bGwgaW5mb19wdHIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gZHdhcmYyIGluZm8gCi0gICAgIChvciB0aGF0IGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgc2V0dGluZyB1cCB0aGUgc3Rhc2gpLiAqLwotCi0gIGlmICghIHN0YXNoLT5pbmZvX3B0cikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ2hlY2sgdGhlIHByZXZpb3VzbHkgcmVhZCBjb21wLiB1bml0cyBmaXJzdC4gKi8KLQotICBmb3IgKGVhY2ggPSBzdGFzaC0+YWxsX2NvbXBfdW5pdHM7IGVhY2g7IGVhY2ggPSBlYWNoLT5uZXh0X3VuaXQpCi0gICAgaWYgKGNvbXBfdW5pdF9jb250YWluc19hZGRyZXNzIChlYWNoLCBhZGRyKSkKLSAgICAgIHJldHVybiBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKGVhY2gsIGFkZHIsIGZpbGVuYW1lX3B0ciwgCi0JCQkJCSAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZW51bWJlcl9wdHIpOwotCi0gIC8qIFJlYWQgZWFjaCByZW1haW5pbmcgY29tcC4gdW5pdHMgY2hlY2tpbmcgZWFjaCBhcyB0aGV5IGFyZSByZWFkLiAqLwotICB3aGlsZSAoc3Rhc2gtPmluZm9fcHRyIDwgc3Rhc2gtPmluZm9fcHRyX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29tcF91bml0KiBlYWNoOwotICAgICAgYmZkX3ZtYSBsZW5ndGg7Ci0gICAgICBib29sZWFuIGZvdW5kOwotCi0gICAgICBpZiAoYWRkcl9zaXplID09IDQpCi0JbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBzdGFzaC0+aW5mb19wdHIpOwotICAgICAgZWxzZQotCWxlbmd0aCA9IHJlYWRfOF9ieXRlcyAoYWJmZCwgc3Rhc2gtPmluZm9fcHRyKTsKLSAgICAgIHN0YXNoLT5pbmZvX3B0ciArPSBhZGRyX3NpemU7Ci0KLSAgICAgIGlmIChsZW5ndGggPiAwKQotICAgICAgICB7Ci0JICBlYWNoID0gcGFyc2VfY29tcF91bml0IChhYmZkLCBzdGFzaC0+aW5mb19wdHIsIAotCQkJCSAgc3Rhc2gtPmluZm9fcHRyICsgbGVuZ3RoLAotCQkJCSAgYWRkcl9zaXplKTsKLQkgIHN0YXNoLT5pbmZvX3B0ciArPSBsZW5ndGg7Ci0KLQkgIGlmIChlYWNoKQotCSAgICB7Ci0JICAgICAgZWFjaC0+bmV4dF91bml0ID0gc3Rhc2gtPmFsbF9jb21wX3VuaXRzOwotCSAgICAgIHN0YXNoLT5hbGxfY29tcF91bml0cyA9IGVhY2g7Ci0KLQkgICAgICAvKiBEV19BVF9sb3dfcGMgYW5kIERXX0FUX2hpZ2hfcGMgYXJlIG9wdGlvbmFsIGZvcgotCQkgY29tcGlsYXRpb24gdW5pdHMuICBJZiB3ZSBkb24ndCBoYXZlIHRoZW0gKGkuZS4sCi0JCSB1bml0LT5oaWdoID09IDApLCB3ZSBuZWVkIHRvIGNvbnN1bHQgdGhlIGxpbmUgaW5mbwotCQkgdGFibGUgdG8gc2VlIGlmIGEgY29tcGlsYXRpb24gdW5pdCBjb250YWlucyB0aGUgZ2l2ZW4KLQkJIGFkZHJlc3MuICovCi0JICAgICAgaWYgKGVhY2gtPmFyYW5nZS5oaWdoID4gMCkKLQkJewotCQkgIGlmIChjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAoZWFjaCwgYWRkcikpCi0JCSAgICByZXR1cm4gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLAotCQkJCQkJICAgICAgIGZpbGVuYW1lX3B0ciwKLQkJCQkJCSAgICAgICBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCQkJICAgICAgIGxpbmVudW1iZXJfcHRyKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZvdW5kID0gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLAotCQkJCQkJICAgICAgIGZpbGVuYW1lX3B0ciwKLQkJCQkJCSAgICAgICBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCQkJICAgICAgIGxpbmVudW1iZXJfcHRyKTsKLQkJICBpZiAoZm91bmQpCi0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIGVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9iZmQvZWNvZmYuYyBiL2JmZC9lY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmEyMzA5Li4wMDAwMDAwCi0tLSBhL2JmZC9lY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgzMiArMCwwIEBACi0vKiBHZW5lcmljIEVDT0ZGIChFeHRlbmRlZC1DT0ZGKSByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBPcmlnaW5hbCB2ZXJzaW9uIGJ5IFBlciBCb3RobmVyLgotICAgRnVsbCBzdXBwb3J0IGFkZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImFvdXQvcmFubGliLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0vKiBGSVhNRTogV2UgbmVlZCB0aGUgZGVmaW5pdGlvbnMgb2YgTl9TRVRbQURUQl0sIGJ1dCBhb3V0NjQuaCBkZWZpbmVzCi0gICBzb21lIG90aGVyIHN0dWZmIHdoaWNoIHdlIGRvbid0IHdhbnQgYW5kIHdoaWNoIGNvbmZsaWN0cyB3aXRoIHN0dWZmCi0gICB3ZSBkbyB3YW50LiAgKi8KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSN1bmRlZiBOX0FCUwotI3VuZGVmIGV4ZWNfaGRyCi0jdW5kZWYgb2JqX3N5bV9maWxlcG9zCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQgZWNvZmZfZ2V0X21hZ2ljIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGxvbmcgZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICAgICBmbGFnd29yZCBmbGFncykpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfc2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCwgU1lNUiAqZWNvZmZfc3ltLAotCQkJCQkgICBhc3ltYm9sICphc3ltLCBpbnQgZXh0LCBpbnQgd2VhaykpOwotc3RhdGljIHZvaWQgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgUEFSQU1TICgoYmZkICphYmZkLCBGRFIgKmZkciwKLQkJCQkJICBjaGFyICpzdHJpbmcsCi0JCQkJCSAgUk5EWFIgKnJuZHgsIGxvbmcgaXN5bSwKLQkJCQkJICBjb25zdCBjaGFyICp3aGljaCkpOwotc3RhdGljIGNoYXIgKmVjb2ZmX3R5cGVfdG9fc3RyaW5nIFBBUkFNUyAoKGJmZCAqYWJmZCwgRkRSICpmZHIsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBpbmR4KSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zbHVycF9yZWxvY190YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyBpbnQgZWNvZmZfc29ydF9oZHJzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfZ2V0X2V4dHIgUEFSQU1TICgoYXN5bWJvbCAqLCBFWFRSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3NldF9pbmRleCBQQVJBTVMgKChhc3ltYm9sICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWNvZmZfYXJtYXBfaGFzaCBQQVJBTVMgKChDT05TVCBjaGFyICpzLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnJlaGFzaCwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBobG9nKSk7Ci0MCi0vKiBUaGlzIHN0dWZmIGlzIHNvbWV3aGF0IGNvcGllZCBmcm9tIGNvZmZjb2RlLmguICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gYmZkX2RlYnVnX3NlY3Rpb24gPSB7ICIqREVCVUcqIiB9OwotCi0vKiBDcmVhdGUgYW4gRUNPRkYgb2JqZWN0LiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5lY29mZl9vYmpfZGF0YSA9ICgoc3RydWN0IGVjb2ZmX3RkYXRhICopCi0JCQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChlY29mZl9kYXRhX3R5cGUpKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5lY29mZl9vYmpfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBhIGhvb2sgY2FsbGVkIGJ5IGNvZmZfcmVhbF9vYmplY3RfcCB0byBjcmVhdGUgYW55IGJhY2tlbmQKLSAgIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLQotUFRSCi1fYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci0gICAgIFBUUiBhb3V0aGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqaW50ZXJuYWxfYSA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSBhb3V0aGRyOwotICBlY29mZl9kYXRhX3R5cGUgKmVjb2ZmOwotCi0gIGlmIChfYmZkX2Vjb2ZmX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBlY29mZiA9IGVjb2ZmX2RhdGEgKGFiZmQpOwotICBlY29mZi0+Z3Bfc2l6ZSA9IDg7Ci0gIGVjb2ZmLT5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotCi0gIGlmIChpbnRlcm5hbF9hICE9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBlY29mZi0+dGV4dF9zdGFydCA9IGludGVybmFsX2EtPnRleHRfc3RhcnQ7Ci0gICAgICBlY29mZi0+dGV4dF9lbmQgPSBpbnRlcm5hbF9hLT50ZXh0X3N0YXJ0ICsgaW50ZXJuYWxfYS0+dHNpemU7Ci0gICAgICBlY29mZi0+Z3AgPSBpbnRlcm5hbF9hLT5ncF92YWx1ZTsKLSAgICAgIGVjb2ZmLT5ncHJtYXNrID0gaW50ZXJuYWxfYS0+Z3BybWFzazsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JZWNvZmYtPmNwcm1hc2tbaV0gPSBpbnRlcm5hbF9hLT5jcHJtYXNrW2ldOwotICAgICAgZWNvZmYtPmZwcm1hc2sgPSBpbnRlcm5hbF9hLT5mcHJtYXNrOwotICAgICAgaWYgKGludGVybmFsX2EtPm1hZ2ljID09IEVDT0ZGX0FPVVRfWk1BR0lDKQotCWFiZmQtPmZsYWdzIHw9IERfUEFHRUQ7Ci0gICAgICBlbHNlCi0JYWJmZC0+ZmxhZ3MgJj1+IERfUEFHRUQ7Ci0gICAgfQotCi0gIC8qIEl0IHR1cm5zIG91dCB0aGF0IG5vIHNwZWNpYWwgYWN0aW9uIGlzIHJlcXVpcmVkIGJ5IHRoZSBNSVBTIG9yCi0gICAgIEFscGhhIEVDT0ZGIGJhY2tlbmRzLiAgVGhleSBoYXZlIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgYS5vdXQgaGVhZGVyLCBidXQgd2UganVzdCBjb3B5IGl0IGFsbCAoZS5nLiwgZ3BybWFzaywgY3BybWFzayBhbmQKLSAgICAgZnBybWFzaykgYW5kIGxldCB0aGUgc3dhcHBpbmcgcm91dGluZXMgZW5zdXJlIHRoYXQgb25seSByZWxldmFudAotICAgICBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIG91dC4gICovCi0KLSAgcmV0dXJuIChQVFIpIGVjb2ZmOwotfQotCi0vKiBJbml0aWFsaXplIGEgbmV3IHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDQ7Ci0KLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1RFWFQpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0lOSVQpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0ZJTkkpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfREFUQSkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1NEQVRBKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1JEQVRBKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElUOCkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJVDQpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9SQ09OU1QpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9QREFUQSkgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9CU1MpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9TQlNTKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19BTExPQzsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElCKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEFuIElyaXggNCBzaGFyZWQgbGliYXJ5LiAgKi8KLSAgICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgIH0KLQotICAvKiBQcm9iYWJseSBhbnkgb3RoZXIgc2VjdGlvbiBuYW1lIGlzIFNFQ19ORVZFUl9MT0FELCBidXQgSSdtCi0gICAgIHVuY2VydGFpbiBhYm91dCAuaW5pdCBvbiBzb21lIHN5c3RlbXMgYW5kIEkgZG9uJ3Qga25vdyBob3cgc2hhcmVkCi0gICAgIGxpYnJhcmllcyB3b3JrLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgdHlwZS4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLSAgIHRoZSBnZW5lcmljIENPRkYgcm91dGluZXMuICBJdCBpcyB0aGUgaW52ZXJzZSBvZiBlY29mZl9nZXRfbWFnaWMsCi0gICBiZWxvdy4gIFRoaXMgY291bGQgYmUgYW4gRUNPRkYgYmFja2VuZCByb3V0aW5lLCB3aXRoIG9uZSB2ZXJzaW9uCi0gICBmb3IgZWFjaCB0YXJnZXQsIGJ1dCB0aGVyZSBhcmVuJ3QgYWxsIHRoYXQgbWFueSBFQ09GRiB0YXJnZXRzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICB1bnNpZ25lZCBsb25nIG1hY2g7Ci0KLSAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX21hZ2ljKQotICAgIHsKLSAgICBjYXNlIE1JUFNfTUFHSUNfMToKLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUc6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICAgIG1hY2ggPSAzMDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMjoKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHMjoKLSAgICAgIC8qIE1JUFMgSVNBIGxldmVsIDI6IHRoZSByNjAwMCAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoID0gNjAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRTM6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzM6Ci0gICAgICAvKiBNSVBTIElTQSBsZXZlbCAzOiB0aGUgcjQwMDAgKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbWFjaCA9IDQwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfYWxwaGE7Ci0gICAgICBtYWNoID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgICAgbWFjaCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpOwotfQotCi0vKiBHZXQgdGhlIG1hZ2ljIG51bWJlciB0byB1c2UgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4KLSAgIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssIGFib3ZlLiAgKi8KLQotc3RhdGljIGludAotZWNvZmZfZ2V0X21hZ2ljIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBiaWcsIGxpdHRsZTsKLQotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIDA6Ci0JY2FzZSAzMDAwOgotCSAgYmlnID0gTUlQU19NQUdJQ19CSUc7Ci0JICBsaXR0bGUgPSBNSVBTX01BR0lDX0xJVFRMRTsKLQkgIGJyZWFrOwotCi0JY2FzZSA2MDAwOgotCSAgYmlnID0gTUlQU19NQUdJQ19CSUcyOwotCSAgbGl0dGxlID0gTUlQU19NQUdJQ19MSVRUTEUyOwotCSAgYnJlYWs7Ci0KLQljYXNlIDQwMDA6Ci0JICBiaWcgPSBNSVBTX01BR0lDX0JJRzM7Ci0JICBsaXR0bGUgPSBNSVBTX01BR0lDX0xJVFRMRTM7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHJldHVybiBiZmRfYmlnX2VuZGlhbiAoYWJmZCkgPyBiaWcgOiBsaXR0bGU7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgcmV0dXJuIEFMUEhBX01BR0lDOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBHZXQgdGhlIHNlY3Rpb24gc19mbGFncyB0byB1c2UgZm9yIGEgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBsb25nCi1lY29mZl9zZWNfdG9fc3R5cF9mbGFncyAobmFtZSwgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBsb25nIHN0eXA7Ci0KLSAgc3R5cCA9IDA7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0gICAgc3R5cCA9IFNUWVBfVEVYVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9TREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9TREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkRBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfUkRBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUOCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSVQ4OwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVQ0KSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJVDQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0JTUykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9CU1M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NCU1MpID09IDApCi0gICAgc3R5cCA9IFNUWVBfU0JTUzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSU5JVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9FQ09GRl9JTklUOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9GSU5JKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0VDT0ZGX0ZJTkk7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1BEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1BEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9YREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9YREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElCKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0VDT0ZGX0xJQjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfR09UKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0dPVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSEFTSCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9IQVNIOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EWU5BTUlDKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RZTkFNSUM7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQkxJU1QpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElCTElTVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkVMRFlOKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1JFTERZTjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQ09ORkxJQykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9DT05GTElDOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EWU5TVFIpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRFlOU1RSOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EWU5TWU0pID09IDApCi0gICAgc3R5cCA9IFNUWVBfRFlOU1lNOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9DT01NRU5UKSA9PSAwKQotICAgIHsKLSAgICAgIHN0eXAgPSBTVFlQX0NPTU1FTlQ7Ci0gICAgICBmbGFncyAmPX4gU0VDX05FVkVSX0xPQUQ7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SQ09OU1QpID09IDApCi0gICAgc3R5cCA9IFNUWVBfUkNPTlNUOwotICBlbHNlIGlmIChmbGFncyAmIFNFQ19DT0RFKSAKLSAgICBzdHlwID0gU1RZUF9URVhUOwotICBlbHNlIGlmIChmbGFncyAmIFNFQ19EQVRBKSAKLSAgICBzdHlwID0gU1RZUF9EQVRBOwotICBlbHNlIGlmIChmbGFncyAmIFNFQ19SRUFET05MWSkKLSAgICBzdHlwID0gU1RZUF9SREFUQTsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfTE9BRCkKLSAgICBzdHlwID0gU1RZUF9SRUc7Ci0gIGVsc2UKLSAgICBzdHlwID0gU1RZUF9CU1M7Ci0KLSAgaWYgKGZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0gICAgc3R5cCB8PSBTVFlQX05PTE9BRDsKLQotICByZXR1cm4gc3R5cDsKLX0KLQotLyogR2V0IHRoZSBCRkQgZmxhZ3MgdG8gdXNlIGZvciBhIHNlY3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLWZsYWd3b3JkCi1fYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGhkcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaW50ZXJuYWxfcyA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGhkcjsKLSAgbG9uZyBzdHlwX2ZsYWdzID0gaW50ZXJuYWxfcy0+c19mbGFnczsKLSAgZmxhZ3dvcmQgc2VjX2ZsYWdzPTA7Ci0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX05PTE9BRCkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7Ci0KLSAgLyogRm9yIDM4NiBDT0ZGLCBhdCBsZWFzdCwgYW4gdW5sb2FkYWJsZSB0ZXh0IG9yIGRhdGEgc2VjdGlvbiBpcwotICAgICBhY3R1YWxseSBhIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24uICAqLwotICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX1RFWFQpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRUNPRkZfSU5JVCkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9FQ09GRl9GSU5JKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0RZTkFNSUMpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfTElCTElTVCkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9SRUxEWU4pCi0gICAgICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfQ09ORkxJQwotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0RZTlNUUikKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9EWU5TWU0pCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfSEFTSCkpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0RBVEEpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1JEQVRBKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9TREFUQSkKLQkgICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUERBVEEKLQkgICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfWERBVEEKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfR09UKQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9SQ09OU1QpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgICAgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9SREFUQSkKLQkgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9QREFUQQotCSAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1JDT05TVCkKLQlzZWNfZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0JTUykKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfU0JTUykpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9JTkZPKSB8fCBzdHlwX2ZsYWdzID09IFNUWVBfQ09NTUVOVCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfTElUQSkKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfTElUOCkKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfTElUNCkpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFk7Ci0gICAgfQotICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9FQ09GRl9MSUIpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgICB9Ci0KLSAgcmV0dXJuIHNlY19mbGFnczsKLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHN5bWJvbGljIGhlYWRlciBmb3IgYW4gRUNPRkYgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfaGRyX3NpemU7Ci0gIFBUUiByYXcgPSBOVUxMOwotICBIRFJSICppbnRlcm5hbF9zeW1oZHI7Ci0KLSAgLyogU2VlIGlmIHdlJ3ZlIGFscmVhZHkgcmVhZCBpdCBpbi4gICovCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIubWFnaWMgPT0gCi0gICAgICBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN5bV9tYWdpYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWUgd2hldGhlciB0aGVyZSBpcyBhIHN5bWJvbGljIGhlYWRlci4gICovCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQXQgdGhpcyBwb2ludCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSBob2xkcyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMKLSAgICAgYXMgcmVhZCBmcm9tIHRoZSBmaWxlIGhlYWRlciwgYnV0IG9uIEVDT0ZGIHRoaXMgaXMgYWx3YXlzIHRoZQotICAgICBzaXplIG9mIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBoZWFkZXIuICBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvCi0gICAgIGhhbmRsZSB0aGlzIHdoZW4gd2UgZmlyc3QgcmVhZCB0aGUgZmlsZSBpbiBjb2ZmZ2VuLmMuICAqLwotICBleHRlcm5hbF9oZHJfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemU7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSBleHRlcm5hbF9oZHJfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gaGVhZGVyLiAgKi8KLSAgcmF3ID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgZXh0ZXJuYWxfaGRyX3NpemUpOwotICBpZiAocmF3ID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MsIFNFRUtfU0VUKSA9PSAtMQotICAgICAgfHwgKGJmZF9yZWFkIChyYXcsIGV4dGVybmFsX2hkcl9zaXplLCAxLCBhYmZkKQotCSAgIT0gZXh0ZXJuYWxfaGRyX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpbnRlcm5hbF9zeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotICAoKmJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9oZHJfaW4pIChhYmZkLCByYXcsIGludGVybmFsX3N5bWhkcik7Ci0KLSAgaWYgKGludGVybmFsX3N5bWhkci0+bWFnaWMgIT0gYmFja2VuZC0+ZGVidWdfc3dhcC5zeW1fbWFnaWMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGNhbiBnZXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHN5bWJvbHMuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IChpbnRlcm5hbF9zeW1oZHItPmlzeW1NYXgKLQkJCSAgICAgKyBpbnRlcm5hbF9zeW1oZHItPmlleHRNYXgpOwotCi0gIGlmIChyYXcgIT0gTlVMTCkKLSAgICBmcmVlIChyYXcpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyYXcgIT0gTlVMTCkKLSAgICBmcmVlIChyYXcpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIGltcG9ydGFudCBzeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgYW4gRUNPRkYKLSAgIG9iamVjdCBmaWxlLiAgVGhpcyBpcyBjYWxsZWQgYnkgZ2RiIHZpYSB0aGUgcmVhZF9kZWJ1Z19pbmZvIGVudHJ5Ci0gICBwb2ludCBpbiB0aGUgYmFja2VuZCBzdHJ1Y3R1cmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyAoYWJmZCwgaWdub3JlLCBkZWJ1ZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaWdub3JlOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIEhEUlIgKmludGVybmFsX3N5bWhkcjsKLSAgYmZkX3NpemVfdHlwZSByYXdfYmFzZTsKLSAgYmZkX3NpemVfdHlwZSByYXdfc2l6ZTsKLSAgUFRSIHJhdzsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgY2hhciAqZnJhd19zcmM7Ci0gIGNoYXIgKmZyYXdfZW5kOwotICBzdHJ1Y3QgZmRyICpmZHJfcHRyOwotICBiZmRfc2l6ZV90eXBlIHJhd19lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgY2JfZW5kOwotCi0gIEJGRF9BU1NFUlQgKGRlYnVnID09ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbyk7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB3ZSd2ZSBhbHJlYWR5IGdvdHRlbiBpdCwgYW5kIHdoZXRoZXIgdGhlcmUncyBhbnkgdG8KLSAgICAgZ2V0LiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5yYXdfc3ltZW50cyAhPSAoUFRSKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID09IDApCi0gICAgewotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludGVybmFsX3N5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgYWxsIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBhdCBvbmNlLiAgKi8KLSAgcmF3X2Jhc2UgPSAoZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zCi0JICAgICAgKyBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplKTsKLQotICAvKiBBbHBoYSBlY29mZiBtYWtlcyB0aGUgZGV0ZXJtaW5hdGlvbiBvZiByYXdfc2l6ZSBkaWZmaWN1bHQuIEl0IGhhcwotICAgICBhbiB1bmRvY3VtZW50ZWQgZGVidWcgZGF0YSBzZWN0aW9uIGJldHdlZW4gdGhlIHN5bWhkciBhbmQgdGhlIGZpcnN0Ci0gICAgIGRvY3VtZW50ZWQgc2VjdGlvbi4gQW5kIHRoZSBvcmRlcmluZyBvZiB0aGUgc2VjdGlvbnMgdmFyaWVzIGJldHdlZW4KLSAgICAgc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLgotICAgICBJZiBiZmQgc3VwcG9ydHMgU0VFS19FTkQgc29tZWRheSwgdGhpcyBjb2RlIGNvdWxkIGJlIHNpbXBsaWZpZWQuICAqLwotCi0gIHJhd19lbmQgPSAwOwotCi0jZGVmaW5lIFVQREFURV9SQVdfRU5EKHN0YXJ0LCBjb3VudCwgc2l6ZSkgXAotICBjYl9lbmQgPSBpbnRlcm5hbF9zeW1oZHItPnN0YXJ0ICsgaW50ZXJuYWxfc3ltaGRyLT5jb3VudCAqIChzaXplKTsgXAotICBpZiAoY2JfZW5kID4gcmF3X2VuZCkgXAotICAgIHJhd19lbmQgPSBjYl9lbmQKLQotICBVUERBVEVfUkFXX0VORCAoY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotICBVUERBVEVfUkFXX0VORCAoY2JEbk9mZnNldCwgaWRuTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2Rucl9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiUGRPZmZzZXQsIGlwZE1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlN5bU9mZnNldCwgaXN5bU1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYk9wdE9mZnNldCwgaW9wdE1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhcikpOwotICBVUERBVEVfUkFXX0VORCAoY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiRmRPZmZzZXQsIGlmZE1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlJmZE9mZnNldCwgY3JmZCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9yZmRfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkV4dE9mZnNldCwgaWV4dE1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZSk7Ci0KLSN1bmRlZiBVUERBVEVfUkFXX0VORAotCi0gIHJhd19zaXplID0gcmF3X2VuZCAtIHJhd19iYXNlOwotICBpZiAocmF3X3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgPSAwOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByYXcgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJhd19zaXplKTsKLSAgaWYgKHJhdyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkoZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zCi0JCSArIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemUpLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKHJhdywgcmF3X3NpemUsIDEsIGFiZmQpICE9IHJhd19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByYXcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlY29mZl9kYXRhIChhYmZkKS0+cmF3X3N5bWVudHMgPSByYXc7Ci0KLSAgLyogR2V0IHBvaW50ZXJzIGZvciB0aGUgbnVtZXJpYyBvZmZzZXRzIGluIHRoZSBIRFJSIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEZJWChvZmYxLCBvZmYyLCB0eXBlKSBcCi0gIGlmIChpbnRlcm5hbF9zeW1oZHItPm9mZjEgPT0gMCkgXAotICAgIGRlYnVnLT5vZmYyID0gKHR5cGUpIE5VTEw7IFwKLSAgZWxzZSBcCi0gICAgZGVidWctPm9mZjIgPSAodHlwZSkgKChjaGFyICopIHJhdyBcCi0JCQkgICsgKGludGVybmFsX3N5bWhkci0+b2ZmMSBcCi0JCQkgICAgIC0gcmF3X2Jhc2UpKQotICBGSVggKGNiTGluZU9mZnNldCwgbGluZSwgdW5zaWduZWQgY2hhciAqKTsKLSAgRklYIChjYkRuT2Zmc2V0LCBleHRlcm5hbF9kbnIsIFBUUik7Ci0gIEZJWCAoY2JQZE9mZnNldCwgZXh0ZXJuYWxfcGRyLCBQVFIpOwotICBGSVggKGNiU3ltT2Zmc2V0LCBleHRlcm5hbF9zeW0sIFBUUik7Ci0gIEZJWCAoY2JPcHRPZmZzZXQsIGV4dGVybmFsX29wdCwgUFRSKTsKLSAgRklYIChjYkF1eE9mZnNldCwgZXh0ZXJuYWxfYXV4LCB1bmlvbiBhdXhfZXh0ICopOwotICBGSVggKGNiU3NPZmZzZXQsIHNzLCBjaGFyICopOwotICBGSVggKGNiU3NFeHRPZmZzZXQsIHNzZXh0LCBjaGFyICopOwotICBGSVggKGNiRmRPZmZzZXQsIGV4dGVybmFsX2ZkciwgUFRSKTsKLSAgRklYIChjYlJmZE9mZnNldCwgZXh0ZXJuYWxfcmZkLCBQVFIpOwotICBGSVggKGNiRXh0T2Zmc2V0LCBleHRlcm5hbF9leHQsIFBUUik7Ci0jdW5kZWYgRklYCi0KLSAgLyogSSBkb24ndCB3YW50IHRvIGFsd2F5cyBzd2FwIGFsbCB0aGUgZGF0YSwgYmVjYXVzZSBpdCB3aWxsIGp1c3QKLSAgICAgd2FzdGUgdGltZSBhbmQgbW9zdCBwcm9ncmFtcyB3aWxsIG5ldmVyIGxvb2sgYXQgaXQuICBUaGUgb25seQotICAgICB0aW1lIHRoZSBsaW5rZXIgbmVlZHMgbW9zdCBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHN3YXBwZWQKLSAgICAgaXMgd2hlbiBsaW5raW5nIGJpZy1lbmRpYW4gYW5kIGxpdHRsZS1lbmRpYW4gTUlQUyBvYmplY3QgZmlsZXMKLSAgICAgdG9nZXRoZXIsIHdoaWNoIGlzIG5vdCBhIGNvbW1vbiBvY2N1cnJlbmNlLgotCi0gICAgIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgZmRyIHRvIGRlYWwgd2l0aCBhIGxvdCBvZiBpbmZvcm1hdGlvbiBpbgotICAgICB0aGUgc3ltYm9scywgc28gd2Ugc3dhcCB0aGVtIGhlcmUuICAqLwotICBkZWJ1Zy0+ZmRyID0gKHN0cnVjdCBmZHIgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgKGludGVybmFsX3N5bWhkci0+aWZkTWF4ICoKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBmZHIpKSk7Ci0gIGlmIChkZWJ1Zy0+ZmRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBleHRlcm5hbF9mZHJfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGZkcl9wdHIgPSBkZWJ1Zy0+ZmRyOwotICBmcmF3X3NyYyA9IChjaGFyICopIGRlYnVnLT5leHRlcm5hbF9mZHI7Ci0gIGZyYXdfZW5kID0gZnJhd19zcmMgKyBpbnRlcm5hbF9zeW1oZHItPmlmZE1heCAqIGV4dGVybmFsX2Zkcl9zaXplOwotICBmb3IgKDsgZnJhd19zcmMgPCBmcmF3X2VuZDsgZnJhd19zcmMgKz0gZXh0ZXJuYWxfZmRyX3NpemUsIGZkcl9wdHIrKykKLSAgICAoKmJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9mZHJfaW4pIChhYmZkLCAoUFRSKSBmcmF3X3NyYywgZmRyX3B0cik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBFQ09GRiBzeW1ib2wgdGFibGUgcm91dGluZXMuICBUaGUgRUNPRkYgc3ltYm9sIHRhYmxlIGlzIGRlc2NyaWJlZAotICAgaW4gZ2NjL21pcHMtdGZpbGUuYy4gICovCi0KLS8qIEVDT0ZGIHVzZXMgdHdvIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlCi0gICBvdGhlciBpcyBmb3Igc21hbGwgb2JqZWN0cy4gIEFsbCB0aGUgc21hbGwgb2JqZWN0cyBhcmUga2VwdAotICAgdG9nZXRoZXIsIGFuZCB0aGVuIHJlZmVyZW5jZWQgdmlhIHRoZSBncCBwb2ludGVyLCB3aGljaCB5aWVsZHMKLSAgIGZhc3RlciBhc3NlbWJsZXIgY29kZS4gIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIHRoZSBzbWFsbCBjb21tb24KLSAgIHNlY3Rpb24uICAqLwotc3RhdGljIGFzZWN0aW9uIGVjb2ZmX3Njb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sIGVjb2ZmX3Njb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKmVjb2ZmX3Njb21fc3ltYm9sX3B0cjsKLQotLyogQ3JlYXRlIGFuIGVtcHR5IHN5bWJvbC4gICovCi0KLWFzeW1ib2wgKgotX2JmZF9lY29mZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBlY29mZl9zeW1ib2xfdHlwZSAqbmV3OwotCi0gIG5ldyA9IChlY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoZWNvZmZfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKG5ldyA9PSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gKGFzeW1ib2wgKikgTlVMTDsKLSAgbWVtc2V0ICgoUFRSKSBuZXcsIDAsIHNpemVvZiAqbmV3KTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuZXctPmZkciA9IChGRFIgKikgTlVMTDsKLSAgbmV3LT5sb2NhbCA9IGZhbHNlOwotICBuZXctPm5hdGl2ZSA9IE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBTZXQgdGhlIEJGRCBmbGFncyBhbmQgc2VjdGlvbiBmb3IgYW4gRUNPRkYgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3NldF9zeW1ib2xfaW5mbyAoYWJmZCwgZWNvZmZfc3ltLCBhc3ltLCBleHQsIHdlYWspCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgU1lNUiAqZWNvZmZfc3ltOwotICAgICBhc3ltYm9sICphc3ltOwotICAgICBpbnQgZXh0OwotICAgICBpbnQgd2VhazsKLXsKLSAgYXN5bS0+dGhlX2JmZCA9IGFiZmQ7Ci0gIGFzeW0tPnZhbHVlID0gZWNvZmZfc3ltLT52YWx1ZTsKLSAgYXN5bS0+c2VjdGlvbiA9ICZiZmRfZGVidWdfc2VjdGlvbjsKLSAgYXN5bS0+dWRhdGEuaSA9IDA7Ci0KLSAgLyogTW9zdCBzeW1ib2wgdHlwZXMgYXJlIGp1c3QgZm9yIGRlYnVnZ2luZy4gICovCi0gIHN3aXRjaCAoZWNvZmZfc3ltLT5zdCkKLSAgICB7Ci0gICAgY2FzZSBzdEdsb2JhbDoKLSAgICBjYXNlIHN0U3RhdGljOgotICAgIGNhc2Ugc3RMYWJlbDoKLSAgICBjYXNlIHN0UHJvYzoKLSAgICBjYXNlIHN0U3RhdGljUHJvYzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc3ROaWw6Ci0gICAgICBpZiAoRUNPRkZfSVNfU1RBQiAoZWNvZmZfc3ltKSkKLQl7Ci0JICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICh3ZWFrKQotICAgIGFzeW0tPmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9XRUFLOwotICBlbHNlIGlmIChleHQpCi0gICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotICAgICAgLyogTm9ybWFsbHksIGEgbG9jYWwgc3RQcm9jIHN5bWJvbCB3aWxsIGhhdmUgYSBjb3JyZXNwb25kaW5nCi0gICAgICAgICBleHRlcm5hbCBzeW1ib2wuICBXZSBtYXJrIHRoZSBsb2NhbCBzeW1ib2wgYXMgYSBkZWJ1Z2dpbmcKLSAgICAgICAgIHN5bWJvbCwgaW4gb3JkZXIgdG8gcHJldmVudCBubSBmcm9tIHByaW50aW5nIGJvdGggb3V0LgotICAgICAgICAgU2ltaWxhcmx5LCB3ZSBtYXJrIHN0TGFiZWwgYW5kIHN0YWJzIHN5bWJvbHMgYXMgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2xzLiAgSW4gYm90aCBjYXNlcywgd2UgZG8gd2FudCB0byBzZXQgdGhlIHZhbHVlCi0gICAgICAgICBjb3JyZWN0bHkgYmFzZWQgb24gdGhlIHN5bWJvbCBjbGFzcy4gICovCi0gICAgICBpZiAoZWNvZmZfc3ltLT5zdCA9PSBzdFByb2MKLQkgIHx8IGVjb2ZmX3N5bS0+c3QgPT0gc3RMYWJlbAotCSAgfHwgRUNPRkZfSVNfU1RBQiAoZWNvZmZfc3ltKSkKLQlhc3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICAgIH0KLSAgc3dpdGNoIChlY29mZl9zeW0tPnNjKQotICAgIHsKLSAgICBjYXNlIHNjTmlsOgotICAgICAgLyogVXNlZCBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIGxhYmVscy4gIExlYXZlIHRoZW0gaW4gdGhlCi0JIGRlYnVnZ2luZyBzZWN0aW9uLCBhbmQgbWFyayB0aGVtIGFzIGxvY2FsLiAgSWYgQlNGX0RFQlVHR0lORwotCSBpcyBzZXQsIHRoZW4gbm0gZG9lcyBub3QgZGlzcGxheSB0aGVtIGZvciBzb21lIHJlYXNvbi4gIElmIG5vCi0JIGZsYWdzIGFyZSBzZXQgdGhlbiB0aGUgbGlua2VyIHdoaW5lcyBhYm91dCB0aGVtLiAgKi8KLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1RleHQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnRleHQiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NEYXRhOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5kYXRhIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQnNzOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5ic3MiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NSZWdpc3RlcjoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NBYnM6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NVbmRlZmluZWQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGFzeW0tPmZsYWdzID0gMDsKLSAgICAgIGFzeW0tPnZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NDZGJMb2NhbDoKLSAgICBjYXNlIHNjQml0czoKLSAgICBjYXNlIHNjQ2RiU3lzdGVtOgotICAgIGNhc2Ugc2NSZWdJbWFnZToKLSAgICBjYXNlIHNjSW5mbzoKLSAgICBjYXNlIHNjVXNlclN0cnVjdDoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NTRGF0YToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2RhdGEiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NTQnNzOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zYnNzIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjUkRhdGE6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJkYXRhIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVmFyOgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0NvbW1vbjoKLSAgICAgIGlmIChhc3ltLT52YWx1ZSA+IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplKQotCXsKLQkgIGFzeW0tPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgYXN5bS0+ZmxhZ3MgPSAwOwotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIHNjU0NvbW1vbjoKLSAgICAgIGlmIChlY29mZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID0gU0NPTU1PTjsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBlY29mZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZlY29mZl9zY29tX3N5bWJvbDsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0JICBlY29mZl9zY29tX3N5bWJvbC5uYW1lID0gU0NPTU1PTjsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgZWNvZmZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0JICBlY29mZl9zY29tX3N5bWJvbF9wdHIgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT5mbGFncyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVmFyUmVnaXN0ZXI6Ci0gICAgY2FzZSBzY1ZhcmlhbnQ6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjU1VuZGVmaW5lZDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgYXN5bS0+ZmxhZ3MgPSAwOwotICAgICAgYXN5bS0+dmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0luaXQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmluaXQiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NCYXNlZFZhcjoKLSAgICBjYXNlIHNjWERhdGE6Ci0gICAgY2FzZSBzY1BEYXRhOgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0Zpbmk6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmZpbmkiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NSQ29uc3Q6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJjb25zdCIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBMb29rIGZvciBzcGVjaWFsIGNvbnN0cnVjdG9ycyBzeW1ib2xzIGFuZCBtYWtlIHJlbG9jYXRpb24gZW50cmllcwotICAgICBpbiBhIHNwZWNpYWwgY29uc3RydWN0aW9uIHNlY3Rpb24uICBUaGVzZSBhcmUgcHJvZHVjZWQgYnkgdGhlCi0gICAgIC1mZ251LWxpbmtlciBhcmd1bWVudCB0byBnKysuICAqLwotICBpZiAoRUNPRkZfSVNfU1RBQiAoZWNvZmZfc3ltKSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVDT0ZGX1VOTUFSS19TVEFCIChlY29mZl9zeW0tPmluZGV4KSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBOX1NFVEE6Ci0JY2FzZSBOX1NFVFQ6Ci0JY2FzZSBOX1NFVEQ6Ci0JY2FzZSBOX1NFVEI6Ci0JICB7Ci0JICAgIC8qIFRoaXMgY29kZSBpcyBubyBsb25nZXIgbmVlZGVkLiAgSXQgdXNlZCB0byBiZSB1c2VkIHRvCi0JICAgICAgIG1ha2UgdGhlIGxpbmtlciBoYW5kbGUgc2V0IHN5bWJvbHMsIGJ1dCB0aGV5IGFyZSBub3cKLQkgICAgICAgaGFuZGxlZCBpbiB0aGUgYWRkX3N5bWJvbHMgcm91dGluZSBpbnN0ZWFkLiAgKi8KLSNpZiAwCi0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCSAgICBhcmVsZW50X2NoYWluICpyZWxvY19jaGFpbjsKLQkgICAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0KLQkgICAgLyogR2V0IGEgc2VjdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN5bWJvbCAodXN1YWxseQotCSAgICAgICBfX0NUT1JfTElTVF9fIG9yIF9fRFRPUl9MSVNUX18pLiAgRklYTUU6IGdjYyB1c2VzIHRoZQotCSAgICAgICBuYW1lIF9fX0NUT1JfTElTVCAodGhyZWUgdW5kZXJzY29yZXMpLiAgV2UgbmVlZAotCSAgICAgICBfX0NUT1JfTElTVCAodHdvIHVuZGVyc2NvcmVzKSwgc2luY2UgRUNPRkYgZG9lc24ndCB1c2UKLQkgICAgICAgYSBsZWFkaW5nIHVuZGVyc2NvcmUuICBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGdjYywKLQkgICAgICAgYnV0IGluc3RlYWQgd2UgZG8gaXQgaGVyZS4gIEFjdHVhbGx5LCB0aGlzIHNob3VsZCBhbGwKLQkgICAgICAgYmUgZG9uZSBkaWZmZXJlbnRseSBhbnlob3cuICAqLwotCSAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoYXN5bSk7Ci0JICAgIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdID09ICdfJyAmJiBuYW1lWzJdID09ICdfJykKLQkgICAgICB7Ci0JCSsrbmFtZTsKLQkJYXN5bS0+bmFtZSA9IG5hbWU7Ci0JICAgICAgfQotCSAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgICB7Ci0JCWNoYXIgKmNvcHk7Ci0KLQkJY29weSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lKSArIDEpOwotCQlpZiAoIWNvcHkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlzdHJjcHkgKGNvcHksIG5hbWUpOwotCQlzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgY29weSk7Ci0JICAgICAgfQotCi0JICAgIC8qIEJ1aWxkIGEgcmVsb2MgcG9pbnRpbmcgdG8gdGhpcyBjb25zdHJ1Y3Rvci4gICovCi0JICAgIHJlbG9jX2NoYWluID0KLQkgICAgICAoYXJlbGVudF9jaGFpbiAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXJlbGVudF9jaGFpbikpOwotCSAgICBpZiAoIXJlbG9jX2NoYWluKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5zeW1fcHRyX3B0ciA9Ci0JICAgICAgYmZkX2dldF9zZWN0aW9uIChhc3ltKS0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuYWRkcmVzcyA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5hZGRlbmQgPSBhc3ltLT52YWx1ZTsKLQkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5ob3d0byA9Ci0JICAgICAgZWNvZmZfYmFja2VuZCAoYWJmZCktPmNvbnN0cnVjdG9yX3JlbG9jOwotCi0JICAgIC8qIFNldCB1cCB0aGUgY29uc3RydWN0b3Igc2VjdGlvbiB0byBob2xkIHRoZSByZWxvYy4gICovCi0JICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX0NPTlNUUlVDVE9SOwotCSAgICArK3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0JICAgIC8qIENvbnN0cnVjdG9yIHNlY3Rpb25zIG11c3QgYmUgcm91bmRlZCB0byBhIGJvdW5kYXJ5Ci0JICAgICAgIGJhc2VkIG9uIHRoZSBiaXRzaXplLiAgVGhlc2UgYXJlIG5vdCByZWFsIHNlY3Rpb25zLS0KLQkgICAgICAgdGhleSBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgdGhlIGxpbmtlci0tc28gdGhlIEVDT0ZGCi0JICAgICAgIDE2IGJ5dGUgYWxpZ25tZW50IHJlc3RyaWN0aW9uIGRvZXMgbm90IGFwcGx5LiAgKi8KLQkgICAgYml0c2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5jb25zdHJ1Y3Rvcl9iaXRzaXplOwotCSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAxOwotCSAgICB3aGlsZSAoKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKSA8IGJpdHNpemUgLyA4KQotCSAgICAgICsrc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICAgIHJlbG9jX2NoYWluLT5uZXh0ID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0JICAgIHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluID0gcmVsb2NfY2hhaW47Ci0JICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSArPSBiaXRzaXplIC8gODsKLQotI2VuZGlmIC8qIDAgKi8KLQotCSAgICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgYSBjb25zdHJ1Y3Rvci4gICovCi0JICAgIGFzeW0tPmZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFuIEVDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemUKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9leHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX3N5bV9pbjsKLSAgYmZkX3NpemVfdHlwZSBpbnRlcm5hbF9zaXplOwotICBlY29mZl9zeW1ib2xfdHlwZSAqaW50ZXJuYWw7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICppbnRlcm5hbF9wdHI7Ci0gIGNoYXIgKmVyYXdfc3JjOwotICBjaGFyICplcmF3X2VuZDsKLSAgRkRSICpmZHJfcHRyOwotICBGRFIgKmZkcl9lbmQ7Ci0KLSAgLyogSWYgd2UndmUgYWxyZWFkeSByZWFkIGluIHRoZSBzeW1ib2wgdGFibGUsIGRvIG5vdGhpbmcuICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmNhbm9uaWNhbF9zeW1ib2xzICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogR2V0IHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnRlcm5hbF9zaXplID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBzaXplb2YgKGVjb2ZmX3N5bWJvbF90eXBlKTsKLSAgaW50ZXJuYWwgPSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBpbnRlcm5hbF9zaXplKTsKLSAgaWYgKGludGVybmFsID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludGVybmFsX3B0ciA9IGludGVybmFsOwotICBlcmF3X3NyYyA9IChjaGFyICopIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2V4dDsKLSAgZXJhd19lbmQgPSAoZXJhd19zcmMKLQkgICAgICArIChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heAotCQkgKiBleHRlcm5hbF9leHRfc2l6ZSkpOwotICBmb3IgKDsgZXJhd19zcmMgPCBlcmF3X2VuZDsgZXJhd19zcmMgKz0gZXh0ZXJuYWxfZXh0X3NpemUsIGludGVybmFsX3B0cisrKQotICAgIHsKLSAgICAgIEVYVFIgaW50ZXJuYWxfZXN5bTsKLQotICAgICAgKCpzd2FwX2V4dF9pbikgKGFiZmQsIChQVFIpIGVyYXdfc3JjLCAmaW50ZXJuYWxfZXN5bSk7Ci0gICAgICBpbnRlcm5hbF9wdHItPnN5bWJvbC5uYW1lID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnNzZXh0Ci0JCQkJICAgKyBpbnRlcm5hbF9lc3ltLmFzeW0uaXNzKTsKLSAgICAgIGlmICghZWNvZmZfc2V0X3N5bWJvbF9pbmZvIChhYmZkLCAmaW50ZXJuYWxfZXN5bS5hc3ltLAotCQkJCSAgJmludGVybmFsX3B0ci0+c3ltYm9sLCAxLAotCQkJCSAgaW50ZXJuYWxfZXN5bS53ZWFrZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBUaGUgYWxwaGEgdXNlcyBhIG5lZ2F0aXZlIGlmZCBmaWVsZCBmb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChpbnRlcm5hbF9lc3ltLmlmZCA+PSAwKQotCWludGVybmFsX3B0ci0+ZmRyID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmZkcgotCQkJICAgICArIGludGVybmFsX2VzeW0uaWZkKTsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9wdHItPmZkciA9IE5VTEw7Ci0gICAgICBpbnRlcm5hbF9wdHItPmxvY2FsID0gZmFsc2U7Ci0gICAgICBpbnRlcm5hbF9wdHItPm5hdGl2ZSA9IChQVFIpIGVyYXdfc3JjOwotICAgIH0KLQotICAvKiBUaGUgbG9jYWwgc3ltYm9scyBtdXN0IGJlIGFjY2Vzc2VkIHZpYSB0aGUgZmRyJ3MsIGJlY2F1c2UgdGhlCi0gICAgIHN0cmluZyBhbmQgYXV4IGluZGljZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBmZHIgaW5mb3JtYXRpb24uICAqLwotICBmZHJfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZmRyOwotICBmZHJfZW5kID0gZmRyX3B0ciArIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZmRNYXg7Ci0gIGZvciAoOyBmZHJfcHRyIDwgZmRyX2VuZDsgZmRyX3B0cisrKQotICAgIHsKLSAgICAgIGNoYXIgKmxyYXdfc3JjOwotICAgICAgY2hhciAqbHJhd19lbmQ7Ci0KLSAgICAgIGxyYXdfc3JjID0gKChjaGFyICopIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX3N5bQotCQkgICsgZmRyX3B0ci0+aXN5bUJhc2UgKiBleHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICBscmF3X2VuZCA9IGxyYXdfc3JjICsgZmRyX3B0ci0+Y3N5bSAqIGV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZm9yICg7Ci0JICAgbHJhd19zcmMgPCBscmF3X2VuZDsKLQkgICBscmF3X3NyYyArPSBleHRlcm5hbF9zeW1fc2l6ZSwgaW50ZXJuYWxfcHRyKyspCi0JewotCSAgU1lNUiBpbnRlcm5hbF9zeW07Ci0KLQkgICgqc3dhcF9zeW1faW4pIChhYmZkLCAoUFRSKSBscmF3X3NyYywgJmludGVybmFsX3N5bSk7Ci0JICBpbnRlcm5hbF9wdHItPnN5bWJvbC5uYW1lID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnNzCi0JCQkJICAgICAgICsgZmRyX3B0ci0+aXNzQmFzZQotCQkJCSAgICAgICArIGludGVybmFsX3N5bS5pc3MpOwotCSAgaWYgKCFlY29mZl9zZXRfc3ltYm9sX2luZm8gKGFiZmQsICZpbnRlcm5hbF9zeW0sCi0JCQkJICAgICAgJmludGVybmFsX3B0ci0+c3ltYm9sLCAwLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW50ZXJuYWxfcHRyLT5mZHIgPSBmZHJfcHRyOwotCSAgaW50ZXJuYWxfcHRyLT5sb2NhbCA9IHRydWU7Ci0JICBpbnRlcm5hbF9wdHItPm5hdGl2ZSA9IChQVFIpIGxyYXdfc3JjOwotCX0KLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmNhbm9uaWNhbF9zeW1ib2xzID0gaW50ZXJuYWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCBmb3IgdGhlIGNhbm9uaWNhbCBzeW1ib2xzLiAgKi8KLQotbG9uZwotX2JmZF9lY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbykpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIChzaXplb2YgKGVjb2ZmX3N5bWJvbF90eXBlICopKTsKLX0KLQotLyogR2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICoqbG9jYXRpb24gPSAoZWNvZmZfc3ltYm9sX3R5cGUgKiopIGFsb2NhdGlvbjsKLQotICBpZiAoX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3ltYmFzZSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5jYW5vbmljYWxfc3ltYm9sczsKLSAgd2hpbGUgKGNvdW50ZXIgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICAqKGxvY2F0aW9uKyspID0gc3ltYmFzZSsrOwotICAgICAgY291bnRlcisrOwotICAgIH0KLSAgKmxvY2F0aW9uKysgPSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi0vKiBUdXJuIEVDT0ZGIHR5cGUgaW5mb3JtYXRpb24gaW50byBhIHByaW50YWJsZSBzdHJpbmcuCi0gICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSBhbmQgZWNvZmZfdHlwZV90b19zdHJpbmcgYXJlIGZyb20KLSAgIGdjYy9taXBzLXRkdW1wLmMsIHdpdGggc3dhcHBpbmcgYWRkZWQgYW5kIHVzZWRfcHRyIHJlbW92ZWQuICAqLwotCi0vKiBXcml0ZSBhZ2dyZWdhdGUgaW5mb3JtYXRpb24gdG8gYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfZW1pdF9hZ2dyZWdhdGUgKGFiZmQsIGZkciwgc3RyaW5nLCBybmR4LCBpc3ltLCB3aGljaCkKLSAgICAgYmZkICphYmZkOwotICAgICBGRFIgKmZkcjsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBSTkRYUiAqcm5keDsKLSAgICAgbG9uZyBpc3ltOwotICAgICBjb25zdCBjaGFyICp3aGljaDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwID0KLSAgICAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbyA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbzsKLSAgdW5zaWduZWQgaW50IGlmZCA9IHJuZHgtPnJmZDsKLSAgdW5zaWduZWQgaW50IGluZHggPSBybmR4LT5pbmRleDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgCi0gIGlmIChpZmQgPT0gMHhmZmYpCi0gICAgaWZkID0gaXN5bTsKLQotICAvKiBBbiBpZmQgb2YgLTEgaXMgYW4gb3BhcXVlIHR5cGUuICBBbiBlc2NhcGVkIGluZGV4IG9mIDAgaXMgYQotICAgICBzdHJ1Y3QgcmV0dXJuIHR5cGUgb2YgYSBwcm9jZWR1cmUgY29tcGlsZWQgd2l0aG91dCAtZy4gICovCi0gIGlmIChpZmQgPT0gMHhmZmZmZmZmZgotICAgICAgfHwgKHJuZHgtPnJmZCA9PSAweGZmZiAmJiBpbmR4ID09IDApKQotICAgIG5hbWUgPSAiPHVuZGVmaW5lZD4iOwotICBlbHNlIGlmIChpbmR4ID09IGluZGV4TmlsKQotICAgIG5hbWUgPSAiPG5vIG5hbWU+IjsKLSAgZWxzZQotICAgIHsKLSAgICAgIFNZTVIgc3ltOwotCi0gICAgICBpZiAoZGVidWdfaW5mby0+ZXh0ZXJuYWxfcmZkID09IE5VTEwpCi0JZmRyID0gZGVidWdfaW5mby0+ZmRyICsgaWZkOwotICAgICAgZWxzZQotCXsKLQkgIFJGRFQgcmZkOwotCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfcmZkX2luKSAoYWJmZCwKLQkJCQkgICAgICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfcmZkCi0JCQkJICAgICAgICsgKChmZHItPnJmZEJhc2UgKyBpZmQpCi0JCQkJCSAgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSkpLAotCQkJCSAgICAgICZyZmQpOwotCSAgZmRyID0gZGVidWdfaW5mby0+ZmRyICsgcmZkOwotCX0KLQotICAgICAgaW5keCArPSBmZHItPmlzeW1CYXNlOwotCi0gICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwKLQkJCQkgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJCQkgICArIGluZHggKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSksCi0JCQkJICAmc3ltKTsKLQotICAgICAgbmFtZSA9IGRlYnVnX2luZm8tPnNzICsgZmRyLT5pc3NCYXNlICsgc3ltLmlzczsKLSAgICB9Ci0KLSAgc3ByaW50ZiAoc3RyaW5nLAotCSAgICIlcyAlcyB7IGlmZCA9ICV1LCBpbmRleCA9ICVsdSB9IiwKLQkgICB3aGljaCwgbmFtZSwgaWZkLAotCSAgICgobG9uZykgaW5keAotCSAgICArIGRlYnVnX2luZm8tPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KSk7Ci19Ci0KLS8qIENvbnZlcnQgdGhlIHR5cGUgaW5mb3JtYXRpb24gdG8gc3RyaW5nIGZvcm1hdC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWVjb2ZmX3R5cGVfdG9fc3RyaW5nIChhYmZkLCBmZHIsIGluZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRkRSICpmZHI7Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotewotICB1bmlvbiBhdXhfZXh0ICphdXhfcHRyOwotICBpbnQgYmlnZW5kaWFuOwotICBBVVhVIHU7Ci0gIHN0cnVjdCBxdWFsIHsKLSAgICB1bnNpZ25lZCBpbnQgIHR5cGU7Ci0gICAgaW50ICBsb3dfYm91bmQ7Ci0gICAgaW50ICBoaWdoX2JvdW5kOwotICAgIGludCAgc3RyaWRlOwotICB9IHF1YWxpZmllcnNbN107Ci0gIHVuc2lnbmVkIGludCBiYXNpY190eXBlOwotICBpbnQgaTsKLSAgY2hhciBidWZmZXIxWzEwMjRdOwotICBzdGF0aWMgY2hhciBidWZmZXIyWzEwMjRdOwotICBjaGFyICpwMSA9IGJ1ZmZlcjE7Ci0gIGNoYXIgKnAyID0gYnVmZmVyMjsKLSAgUk5EWFIgcm5keDsKLQotICBhdXhfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfYXV4ICsgZmRyLT5pYXV4QmFzZTsKLSAgYmlnZW5kaWFuID0gZmRyLT5mQmlnZW5kaWFuOwotCi0gIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0gICAgewotICAgICAgcXVhbGlmaWVyc1tpXS5sb3dfYm91bmQgPSAwOwotICAgICAgcXVhbGlmaWVyc1tpXS5oaWdoX2JvdW5kID0gMDsKLSAgICAgIHF1YWxpZmllcnNbaV0uc3RyaWRlID0gMDsKLSAgICB9Ci0KLSAgaWYgKEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XSkgPT0gKGJmZF92bWEpIC0xKQotICAgIHJldHVybiAiLTEgKG5vIHR5cGUpIjsKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KytdLmFfdGksICZ1LnRpKTsKLQotICBiYXNpY190eXBlID0gdS50aS5idDsKLSAgcXVhbGlmaWVyc1swXS50eXBlID0gdS50aS50cTA7Ci0gIHF1YWxpZmllcnNbMV0udHlwZSA9IHUudGkudHExOwotICBxdWFsaWZpZXJzWzJdLnR5cGUgPSB1LnRpLnRxMjsKLSAgcXVhbGlmaWVyc1szXS50eXBlID0gdS50aS50cTM7Ci0gIHF1YWxpZmllcnNbNF0udHlwZSA9IHUudGkudHE0OwotICBxdWFsaWZpZXJzWzVdLnR5cGUgPSB1LnRpLnRxNTsKLSAgcXVhbGlmaWVyc1s2XS50eXBlID0gdHFOaWw7Ci0KLSAgLyoKLSAgICogR28gZ2V0IHRoZSBiYXNpYyB0eXBlLgotICAgKi8KLSAgc3dpdGNoIChiYXNpY190eXBlKQotICAgIHsKLSAgICBjYXNlIGJ0TmlsOgkJCS8qIHVuZGVmaW5lZCAqLwotICAgICAgc3RyY3B5IChwMSwgIm5pbCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0QWRyOgkJCS8qIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwb2ludGVyICovCi0gICAgICBzdHJjcHkgKHAxLCAiYWRkcmVzcyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Q2hhcjoJCS8qIGNoYXJhY3RlciAqLwotICAgICAgc3RyY3B5IChwMSwgImNoYXIiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFVDaGFyOgkJLyogdW5zaWduZWQgY2hhcmFjdGVyICovCi0gICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgY2hhciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0U2hvcnQ6CQkvKiBzaG9ydCAqLwotICAgICAgc3RyY3B5IChwMSwgInNob3J0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVU2hvcnQ6CQkvKiB1bnNpZ25lZCBzaG9ydCAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIHNob3J0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRJbnQ6CQkJLyogaW50ICovCi0gICAgICBzdHJjcHkgKHAxLCAiaW50Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVSW50OgkJLyogdW5zaWduZWQgaW50ICovCi0gICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgaW50Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRMb25nOgkJLyogbG9uZyAqLwotICAgICAgc3RyY3B5IChwMSwgImxvbmciKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFVMb25nOgkJLyogdW5zaWduZWQgbG9uZyAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIGxvbmciKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEZsb2F0OgkJLyogZmxvYXQgKHJlYWwpICovCi0gICAgICBzdHJjcHkgKHAxLCAiZmxvYXQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidERvdWJsZToJCS8qIERvdWJsZSAocmVhbCkgKi8KLSAgICAgIHN0cmNweSAocDEsICJkb3VibGUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBTdHJ1Y3R1cmVzIGFkZCAxLTIgYXV4IHdvcmRzOgotCSAxc3Qgd29yZCBpcyBbU1RfUkZERVNDQVBFLCBvZmZzZXRdIHBvaW50ZXIgdG8gc3RydWN0IGRlZjsKLQkgMm5kIHdvcmQgaXMgZmlsZSBpbmRleCBpZiAxc3Qgd29yZCByZmQgaXMgU1RfUkZERVNDQVBFLiAgKi8KLQotICAgIGNhc2UgYnRTdHJ1Y3Q6CQkvKiBTdHJ1Y3R1cmUgKFJlY29yZCkgKi8KLSAgICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdLmFfcm5keCwgJnJuZHgpOwotICAgICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgKGFiZmQsIGZkciwgcDEsICZybmR4LAotCQkJICAgIChsb25nKSBBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsxXSksCi0JCQkgICAgInN0cnVjdCIpOwotICAgICAgaW5keCsrOwkJCS8qIHNraXAgYXV4IHdvcmRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogVW5pb25zIGFkZCAxLTIgYXV4IHdvcmRzOgotCSAxc3Qgd29yZCBpcyBbU1RfUkZERVNDQVBFLCBvZmZzZXRdIHBvaW50ZXIgdG8gdW5pb24gZGVmOwotCSAybmQgd29yZCBpcyBmaWxlIGluZGV4IGlmIDFzdCB3b3JkIHJmZCBpcyBTVF9SRkRFU0NBUEUuICAqLwotCi0gICAgY2FzZSBidFVuaW9uOgkJLyogVW5pb24gKi8KLSAgICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdLmFfcm5keCwgJnJuZHgpOwotICAgICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgKGFiZmQsIGZkciwgcDEsICZybmR4LAotCQkJICAgIChsb25nKSBBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsxXSksCi0JCQkgICAgInVuaW9uIik7Ci0gICAgICBpbmR4Kys7CQkJLyogc2tpcCBhdXggd29yZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBFbnVtZXJhdGlvbnMgYWRkIDEtMiBhdXggd29yZHM6Ci0JIDFzdCB3b3JkIGlzIFtTVF9SRkRFU0NBUEUsIG9mZnNldF0gcG9pbnRlciB0byBlbnVtIGRlZjsKLQkgMm5kIHdvcmQgaXMgZmlsZSBpbmRleCBpZiAxc3Qgd29yZCByZmQgaXMgU1RfUkZERVNDQVBFLiAgKi8KLQotICAgIGNhc2UgYnRFbnVtOgkJLyogRW51bWVyYXRpb24gKi8KLSAgICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdLmFfcm5keCwgJnJuZHgpOwotICAgICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgKGFiZmQsIGZkciwgcDEsICZybmR4LAotCQkJICAgIChsb25nKSBBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsxXSksCi0JCQkgICAgImVudW0iKTsKLSAgICAgIGluZHgrKzsJCQkvKiBza2lwIGF1eCB3b3JkcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VHlwZWRlZjoJCS8qIGRlZmluZWQgdmlhIGEgdHlwZWRlZiwgaXN5bVJlZiBwb2ludHMgKi8KLSAgICAgIHN0cmNweSAocDEsICJ0eXBlZGVmIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRSYW5nZToJCS8qIHN1YnJhbmdlIG9mIGludCAqLwotICAgICAgc3RyY3B5IChwMSwgInN1YnJhbmdlIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRTZXQ6CQkJLyogcGFzY2FsIHNldHMgKi8KLSAgICAgIHN0cmNweSAocDEsICJzZXQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidENvbXBsZXg6CQkvKiBmb3J0cmFuIGNvbXBsZXggKi8KLSAgICAgIHN0cmNweSAocDEsICJjb21wbGV4Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnREQ29tcGxleDoJCS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSAgICAgIHN0cmNweSAocDEsICJkb3VibGUgY29tcGxleCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0SW5kaXJlY3Q6CQkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLwotICAgICAgc3RyY3B5IChwMSwgImZvcndhcmQvdW5hbWVkIHR5cGVkZWYiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEZpeGVkRGVjOgkJLyogRml4ZWQgRGVjaW1hbCAqLwotICAgICAgc3RyY3B5IChwMSwgImZpeGVkIGRlY2ltYWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEZsb2F0RGVjOgkJLyogRmxvYXQgRGVjaW1hbCAqLwotICAgICAgc3RyY3B5IChwMSwgImZsb2F0IGRlY2ltYWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFN0cmluZzoJCS8qIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJzdHJpbmciKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEJpdDoJCQkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJiaXQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFBpY3R1cmU6CQkvKiBQaWN0dXJlICovCi0gICAgICBzdHJjcHkgKHAxLCAicGljdHVyZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Vm9pZDoJCS8qIFZvaWQgKi8KLSAgICAgIHN0cmNweSAocDEsICJ2b2lkIik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChwMSwgXygiVW5rbm93biBiYXNpYyB0eXBlICVkIiksIChpbnQpIGJhc2ljX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHAxICs9IHN0cmxlbiAoYnVmZmVyMSk7Ci0KLSAgLyoKLSAgICogSWYgdGhpcyBpcyBhIGJpdGZpZWxkLCBnZXQgdGhlIGJpdHNpemUuCi0gICAqLwotICBpZiAodS50aS5mQml0ZmllbGQpCi0gICAgewotICAgICAgaW50IGJpdHNpemU7Ci0KLSAgICAgIGJpdHNpemUgPSBBVVhfR0VUX1dJRFRIIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrK10pOwotICAgICAgc3ByaW50ZiAocDEsICIgOiAlZCIsIGJpdHNpemUpOwotICAgICAgcDEgKz0gc3RybGVuIChidWZmZXIxKTsKLSAgICB9Ci0KLQotICAvKgotICAgKiBEZWFsIHdpdGggYW55IHF1YWxpZmllcnMuCi0gICAqLwotICBpZiAocXVhbGlmaWVyc1swXS50eXBlICE9IHRxTmlsKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBTbmFyZiB1cCBhbnkgYXJyYXkgYm91bmRzIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgQXJyYXlzCi0gICAgICAgKiBzdG9yZSA1IHN1Y2Nlc3NpdmUgd29yZHMgaW4gdGhlIGF1eC4gdGFibGU6Ci0gICAgICAgKgl3b3JkIDAJUk5EWFIgdG8gdHlwZSBvZiB0aGUgYm91bmRzIChpZSwgaW50KQotICAgICAgICoJd29yZCAxCUN1cnJlbnQgZmlsZSBkZXNjcmlwdG9yIGluZGV4Ci0gICAgICAgKgl3b3JkIDIJbG93IGJvdW5kCi0gICAgICAgKgl3b3JkIDMJaGlnaCBib3VuZCAob3IgLTEgaWYgW10pCi0gICAgICAgKgl3b3JkIDQJc3RyaWRlIHNpemUgaW4gYml0cwotICAgICAgICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotCXsKLQkgIGlmIChxdWFsaWZpZXJzW2ldLnR5cGUgPT0gdHFBcnJheSkKLQkgICAgewotCSAgICAgIHF1YWxpZmllcnNbaV0ubG93X2JvdW5kID0KLQkJQVVYX0dFVF9ETkxPVyAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzJdKTsKLQkgICAgICBxdWFsaWZpZXJzW2ldLmhpZ2hfYm91bmQgPQotCQlBVVhfR0VUX0ROSElHSCAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzNdKTsKLQkgICAgICBxdWFsaWZpZXJzW2ldLnN0cmlkZSA9Ci0JCUFVWF9HRVRfV0lEVEggKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCs0XSk7Ci0JICAgICAgaW5keCArPSA1OwotCSAgICB9Ci0JfQotCi0gICAgICAvKgotICAgICAgICogTm93IHByaW50IG91dCB0aGUgcXVhbGlmaWVycy4KLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JICBzd2l0Y2ggKHF1YWxpZmllcnNbaV0udHlwZSkKLQkgICAgewotCSAgICBjYXNlIHRxTmlsOgotCSAgICBjYXNlIHRxTWF4OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFQdHI6Ci0JICAgICAgc3RyY3B5IChwMiwgInB0ciB0byAiKTsKLQkgICAgICBwMiArPSBzaXplb2YgKCJwdHIgdG8gIiktMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxVm9sOgotCSAgICAgIHN0cmNweSAocDIsICJ2b2xhdGlsZSAiKTsKLQkgICAgICBwMiArPSBzaXplb2YgKCJ2b2xhdGlsZSAiKS0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFGYXI6Ci0JICAgICAgc3RyY3B5IChwMiwgImZhciAiKTsKLQkgICAgICBwMiArPSBzaXplb2YgKCJmYXIgIiktMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxUHJvYzoKLQkgICAgICBzdHJjcHkgKHAyLCAiZnVuYy4gcmV0LiAiKTsKLQkgICAgICBwMiArPSBzaXplb2YgKCJmdW5jLiByZXQuICIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFBcnJheToKLQkgICAgICB7Ci0JCWludCBmaXJzdF9hcnJheSA9IGk7Ci0JCWludCBqOwotCi0JCS8qIFByaW50IGFycmF5IGJvdW5kcyByZXZlcnNlZCAoaWUsIGluIHRoZSBvcmRlciB0aGUgQwotCQkgICBwcm9ncmFtbWVyIHdyaXRlcyB0aGVtKS4gIEMgaXMgc3VjaCBhIGZ1biBsYW5ndWFnZS4uLi4gKi8KLQotCQl3aGlsZSAoaSA8IDUgJiYgcXVhbGlmaWVyc1tpKzFdLnR5cGUgPT0gdHFBcnJheSkKLQkJICBpKys7Ci0KLQkJZm9yIChqID0gaTsgaiA+PSBmaXJzdF9hcnJheTsgai0tKQotCQkgIHsKLQkJICAgIHN0cmNweSAocDIsICJhcnJheSBbIik7Ci0JCSAgICBwMiArPSBzaXplb2YgKCJhcnJheSBbIiktMTsKLQkJICAgIGlmIChxdWFsaWZpZXJzW2pdLmxvd19ib3VuZCAhPSAwKQotCQkgICAgICBzcHJpbnRmIChwMiwKLQkJCSAgICAgICAiJWxkOiVsZCB7JWxkIGJpdHN9IiwKLQkJCSAgICAgICAobG9uZykgcXVhbGlmaWVyc1tqXS5sb3dfYm91bmQsCi0JCQkgICAgICAgKGxvbmcpIHF1YWxpZmllcnNbal0uaGlnaF9ib3VuZCwKLQkJCSAgICAgICAobG9uZykgcXVhbGlmaWVyc1tqXS5zdHJpZGUpOwotCi0JCSAgICBlbHNlIGlmIChxdWFsaWZpZXJzW2pdLmhpZ2hfYm91bmQgIT0gLTEpCi0JCSAgICAgIHNwcmludGYgKHAyLAotCQkJICAgICAgICIlbGQgeyVsZCBiaXRzfSIsCi0JCQkgICAgICAgKGxvbmcpIChxdWFsaWZpZXJzW2pdLmhpZ2hfYm91bmQgKyAxKSwKLQkJCSAgICAgICAobG9uZykgKHF1YWxpZmllcnNbal0uc3RyaWRlKSk7Ci0KLQkJICAgIGVsc2UKLQkJICAgICAgc3ByaW50ZiAocDIsICIgeyVsZCBiaXRzfSIsIChsb25nKSAocXVhbGlmaWVyc1tqXS5zdHJpZGUpKTsKLQotCQkgICAgcDIgKz0gc3RybGVuIChwMik7Ci0JCSAgICBzdHJjcHkgKHAyLCAiXSBvZiAiKTsKLQkJICAgIHAyICs9IHNpemVvZiAoIl0gb2YgIiktMTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBzdHJjcHkgKHAyLCBidWZmZXIxKTsKLSAgcmV0dXJuIGJ1ZmZlcjI7Ci19Ci0KLS8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBFQ09GRiBzeW1ib2wgU1lNQk9MIGluIFJFVC4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotX2JmZF9lY29mZl9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmFiZmQ7CQkJLyogSWdub3JlZC4gICovCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBsb2NhbCBsYWJlbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnJCc7Ci19Ci0KLS8qIFByaW50IGluZm9ybWF0aW9uIGFib3V0IGFuIEVDT0ZGIHN5bWJvbC4gICovCi0KLXZvaWQKLV9iZmRfZWNvZmZfcHJpbnRfc3ltYm9sIChhYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcAotICAgID0gJmVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwOwotICBGSUxFICpmaWxlID0gKEZJTEUgKilmaWxlcDsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQotCXsKLQkgIFNZTVIgZWNvZmZfc3ltOwotCQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJICAgICAgJmVjb2ZmX3N5bSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiZWNvZmYgbG9jYWwgIik7Ci0JICBmcHJpbnRmX3ZtYSAoZmlsZSwgKGJmZF92bWEpIGVjb2ZmX3N5bS52YWx1ZSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICV4ICV4IiwgKHVuc2lnbmVkKSBlY29mZl9zeW0uc3QsCi0JCSAgICh1bnNpZ25lZCkgZWNvZmZfc3ltLnNjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRVhUUiBlY29mZl9leHQ7Ci0KLQkgICgqZGVidWdfc3dhcC0+c3dhcF9leHRfaW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAotCQkJCSAgICAgICZlY29mZl9leHQpOwotCSAgZnByaW50ZiAoZmlsZSwgImVjb2ZmIGV4dGVybiAiKTsKLQkgIGZwcmludGZfdm1hIChmaWxlLCAoYmZkX3ZtYSkgZWNvZmZfZXh0LmFzeW0udmFsdWUpOwotCSAgZnByaW50ZiAoZmlsZSwgIiAleCAleCIsICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uc3QsCi0JCSAgICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uc2MpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICAvKiBQcmludCBvdXQgdGhlIHN5bWJvbHMgaW4gYSByZWFzb25hYmxlIHdheSAqLwotICAgICAgewotCWNoYXIgdHlwZTsKLQlpbnQgcG9zOwotCUVYVFIgZWNvZmZfZXh0OwotCWNoYXIgam1wdGJsOwotCWNoYXIgY29ib2xfbWFpbjsKLQljaGFyIHdlYWtleHQ7Ci0KLQlpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQotCSAgewotCSAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKLQkJCQkJJmVjb2ZmX2V4dC5hc3ltKTsKLQkgICAgdHlwZSA9ICdsJzsKLQkgICAgcG9zID0gKCgoKGNoYXIgKikgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZQotCQkgICAgIC0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfc3ltKQotCQkgICAgLyBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSkKLQkJICAgKyBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCk7Ci0JICAgIGptcHRibCA9ICcgJzsKLQkgICAgY29ib2xfbWFpbiA9ICcgJzsKLQkgICAgd2Vha2V4dCA9ICcgJzsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgICgqZGVidWdfc3dhcC0+c3dhcF9leHRfaW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAotCQkJCQkmZWNvZmZfZXh0KTsKLQkgICAgdHlwZSA9ICdlJzsKLQkgICAgcG9zID0gKCgoY2hhciAqKSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlCi0JCSAgICAtIChjaGFyICopIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2V4dCkKLQkJICAgLyBkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0JICAgIGptcHRibCA9IGVjb2ZmX2V4dC5qbXB0YmwgPyAnaicgOiAnICc7Ci0JICAgIGNvYm9sX21haW4gPSBlY29mZl9leHQuY29ib2xfbWFpbiA/ICdjJyA6ICcgJzsKLQkgICAgd2Vha2V4dCA9IGVjb2ZmX2V4dC53ZWFrZXh0ID8gJ3cnIDogJyAnOwotCSAgfQotCi0JZnByaW50ZiAoZmlsZSwgIlslM2RdICVjICIsCi0JCSBwb3MsIHR5cGUpOwotCWZwcmludGZfdm1hIChmaWxlLCAoYmZkX3ZtYSkgZWNvZmZfZXh0LmFzeW0udmFsdWUpOwotCWZwcmludGYgKGZpbGUsICIgc3QgJXggc2MgJXggaW5keCAleCAlYyVjJWMgJXMiLAotCQkgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zdCwKLQkJICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uc2MsCi0JCSAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLmluZGV4LAotCQkgam1wdGJsLCBjb2JvbF9tYWluLCB3ZWFrZXh0LAotCQkgc3ltYm9sLT5uYW1lKTsKLQotCWlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+ZmRyICE9IE5VTEwKLQkgICAgJiYgZWNvZmZfZXh0LmFzeW0uaW5kZXggIT0gaW5kZXhOaWwpCi0JICB7Ci0JICAgIEZEUiAqZmRyOwotCSAgICB1bnNpZ25lZCBpbnQgaW5keDsKLQkgICAgaW50IGJpZ2VuZGlhbjsKLQkgICAgYmZkX3NpemVfdHlwZSBzeW1fYmFzZTsKLQkgICAgdW5pb24gYXV4X2V4dCAqYXV4X2Jhc2U7Ci0KLQkgICAgZmRyID0gZWNvZmZzeW1ib2wgKHN5bWJvbCktPmZkcjsKLQkgICAgaW5keCA9IGVjb2ZmX2V4dC5hc3ltLmluZGV4OwotCi0JICAgIC8qIHN5bV9iYXNlIGlzIHVzZWQgdG8gbWFwIHRoZSBmZHIgcmVsYXRpdmUgaW5kaWNlcyB3aGljaAotCSAgICAgICBhcHBlYXIgaW4gdGhlIGZpbGUgdG8gdGhlIHBvc2l0aW9uIG51bWJlciB3aGljaCB3ZSBhcmUKLQkgICAgICAgdXNpbmcuICAqLwotCSAgICBzeW1fYmFzZSA9IGZkci0+aXN5bUJhc2U7Ci0JICAgIGlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JICAgICAgc3ltX2Jhc2UgKz0KLQkJZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7Ci0KLQkgICAgLyogYXV4X2Jhc2UgaXMgdGhlIHN0YXJ0IG9mIHRoZSBhdXggZW50cmllcyBmb3IgdGhpcyBmaWxlOwotCSAgICAgICBhc3ltLmluZGV4IGlzIGFuIG9mZnNldCBmcm9tIHRoaXMuICAqLwotCSAgICBhdXhfYmFzZSA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9hdXgKLQkJCSsgZmRyLT5pYXV4QmFzZSk7Ci0KLQkgICAgLyogVGhlIGF1eCBlbnRyaWVzIGFyZSBzdG9yZWQgaW4gaG9zdCBieXRlIG9yZGVyOyB0aGUKLQkgICAgICAgb3JkZXIgaXMgaW5kaWNhdGVkIGJ5IGEgYml0IGluIHRoZSBmZHIuICAqLwotCSAgICBiaWdlbmRpYW4gPSBmZHItPmZCaWdlbmRpYW47Ci0KLQkgICAgLyogVGhpcyBzd2l0Y2ggaXMgYmFzaWNhbGx5IGZyb20gZ2NjL21pcHMtdGR1bXAuYyAgKi8KLQkgICAgc3dpdGNoIChlY29mZl9leHQuYXN5bS5zdCkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBzdE5pbDoKLQkgICAgICBjYXNlIHN0TGFiZWw6Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdEZpbGU6Ci0JICAgICAgY2FzZSBzdEJsb2NrOgotCQlmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RW5kOgotCQlpZiAoZWNvZmZfZXh0LmFzeW0uc2MgPT0gc2NUZXh0Ci0JCSAgICB8fCBlY29mZl9leHQuYXN5bS5zYyA9PSBzY0luZm8pCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBGaXJzdCBzeW1ib2w6ICVsZCIpLAotCQkJICAgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRmlyc3Qgc3ltYm9sOiAlbGQiKSwgCi0JCQkgICAoKGxvbmcpCi0JCQkgICAgKEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLAotCQkJCQkgICAmYXV4X2Jhc2VbZWNvZmZfZXh0LmFzeW0uaW5kZXhdKQotCQkJICAgICArIHN5bV9iYXNlKSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RQcm9jOgotCSAgICAgIGNhc2Ugc3RTdGF0aWNQcm9jOgotCQlpZiAoRUNPRkZfSVNfU1RBQiAoJmVjb2ZmX2V4dC5hc3ltKSkKLQkJICA7Ci0JCWVsc2UgaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEVuZCsxIHN5bWJvbDogJS03bGQgICBUeXBlOiAgJXMiKSwKLQkJCSAgICgobG9uZykKLQkJCSAgICAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sCi0JCQkJCSAgICZhdXhfYmFzZVtlY29mZl9leHQuYXN5bS5pbmRleF0pCi0JCQkgICAgICsgc3ltX2Jhc2UpKSwKLQkJCSAgIGVjb2ZmX3R5cGVfdG9fc3RyaW5nIChhYmZkLCBmZHIsIGluZHggKyAxKSk7Ci0JCWVsc2UKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIExvY2FsIHN5bWJvbDogJWxkIiksCi0JCQkgICAoKGxvbmcpIGluZHgKLQkJCSAgICArIChsb25nKSBzeW1fYmFzZQotCQkJICAgICsgKGVjb2ZmX2RhdGEgKGFiZmQpCi0JCQkgICAgICAgLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RTdHJ1Y3Q6Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgc3RydWN0OyBFbmQrMSBzeW1ib2w6ICVsZCIpLAotCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFVuaW9uOgotCQlmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIHVuaW9uOyBFbmQrMSBzeW1ib2w6ICVsZCIpLAotCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdEVudW06Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgZW51bTsgRW5kKzEgc3ltYm9sOiAlbGQiKSwKLQkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6Ci0JCWlmICghIEVDT0ZGX0lTX1NUQUIgKCZlY29mZl9leHQuYXN5bSkpCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBUeXBlOiAlcyIpLAotCQkJICAgZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCkpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIGFyZWxlbnQgKmludGVybmFsX3JlbG9jczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotICBjaGFyICpleHRlcm5hbF9yZWxvY3M7Ci0gIGFyZWxlbnQgKnJwdHI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGlmIChzZWN0aW9uLT5yZWxvY2F0aW9uICE9IChhcmVsZW50ICopIE5VTEwKLSAgICAgIHx8IHNlY3Rpb24tPnJlbG9jX2NvdW50ID09IDAKLSAgICAgIHx8IChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGludGVybmFsX3JlbG9jcyA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgKHNpemVvZiAoYXJlbGVudCkKLQkJCQkJICAgICogc2VjdGlvbi0+cmVsb2NfY291bnQpKTsKLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGV4dGVybmFsX3JlbG9jc19zaXplID0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBleHRlcm5hbF9yZWxvY3MgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSAoYXJlbGVudCAqKSBOVUxMCi0gICAgICB8fCBleHRlcm5hbF9yZWxvY3MgPT0gKGNoYXIgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBhYmZkKQotICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDAsIHJwdHIgPSBpbnRlcm5hbF9yZWxvY3M7IGkgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgaSsrLCBycHRyKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludGVybjsKLQotICAgICAgKCpiYWNrZW5kLT5zd2FwX3JlbG9jX2luKSAoYWJmZCwKLQkJCQkgZXh0ZXJuYWxfcmVsb2NzICsgaSAqIGV4dGVybmFsX3JlbG9jX3NpemUsCi0JCQkJICZpbnRlcm4pOwotCi0gICAgICBpZiAoaW50ZXJuLnJfZXh0ZXJuKQotCXsKLQkgIC8qIHJfc3ltbmR4IGlzIGFuIGluZGV4IGludG8gdGhlIGV4dGVybmFsIHN5bWJvbHMuICAqLwotCSAgQkZEX0FTU0VSVCAoaW50ZXJuLnJfc3ltbmR4ID49IDAKLQkJICAgICAgJiYgKGludGVybi5yX3N5bW5keAotCQkJICA8IChlY29mZl9kYXRhIChhYmZkKQotCQkJICAgICAtPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKSk7Ci0JICBycHRyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBpbnRlcm4ucl9zeW1uZHg7Ci0JICBycHRyLT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGludGVybi5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX05PTkUKLQkgICAgICAgfHwgaW50ZXJuLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fQUJTKQotCXsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICBycHRyLT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBDT05TVCBjaGFyICpzZWNfbmFtZTsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIC8qIHJfc3ltbmR4IGlzIGEgc2VjdGlvbiBrZXkuICAqLwotCSAgc3dpdGNoIChpbnRlcm4ucl9zeW1uZHgpCi0JICAgIHsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1RFWFQ6ICBzZWNfbmFtZSA9ICIudGV4dCI7ICBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1JEQVRBOiBzZWNfbmFtZSA9ICIucmRhdGEiOyBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX0RBVEE6ICBzZWNfbmFtZSA9ICIuZGF0YSI7ICBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1NEQVRBOiBzZWNfbmFtZSA9ICIuc2RhdGEiOyBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1NCU1M6ICBzZWNfbmFtZSA9ICIuc2JzcyI7ICBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX0JTUzogICBzZWNfbmFtZSA9ICIuYnNzIjsgICBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX0lOSVQ6ICBzZWNfbmFtZSA9ICIuaW5pdCI7ICBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX0xJVDg6ICBzZWNfbmFtZSA9ICIubGl0OCI7ICBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX0xJVDQ6ICBzZWNfbmFtZSA9ICIubGl0NCI7ICBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1hEQVRBOiBzZWNfbmFtZSA9ICIueGRhdGEiOyBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1BEQVRBOiBzZWNfbmFtZSA9ICIucGRhdGEiOyBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX0ZJTkk6ICBzZWNfbmFtZSA9ICIuZmluaSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUQTogIHNlY19uYW1lID0gIi5saXRhIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUkNPTlNUOiBzZWNfbmFtZSA9ICIucmNvbnN0IjsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotCSAgICB9Ci0KLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzZWNfbmFtZSk7Ci0JICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQotCSAgcnB0ci0+YWRkZW5kID0gLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpOwotCX0KLQotICAgICAgcnB0ci0+YWRkcmVzcyA9IGludGVybi5yX3ZhZGRyIC0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0KLSAgICAgIC8qIExldCB0aGUgYmFja2VuZCBzZWxlY3QgdGhlIGhvd3RvIGZpZWxkIGFuZCBkbyBhbnkgb3RoZXIKLQkgcmVxdWlyZWQgcHJvY2Vzc2luZy4gICovCi0gICAgICAoKmJhY2tlbmQtPmFkanVzdF9yZWxvY19pbikgKGFiZmQsICZpbnRlcm4sIHJwdHIpOwotICAgIH0KLQotICBiZmRfcmVsZWFzZSAoYWJmZCwgZXh0ZXJuYWxfcmVsb2NzKTsKLQotICBzZWN0aW9uLT5yZWxvY2F0aW9uID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgYSBjYW5vbmljYWwgbGlzdCBvZiByZWxvY3MuICAqLwotCi1sb25nCi1fYmZkX2Vjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgCi0gICAgewotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW47Ci0KLSAgICAgIC8qIFRoaXMgc2VjdGlvbiBoYXMgcmVsb2NzIG1hZGUgdXAgYnkgdXMsIG5vdCB0aGUgZmlsZSwgc28gdGFrZQotCSB0aGVtIG91dCBvZiB0aGVpciBjaGFpbiBhbmQgcGxhY2UgdGhlbSBpbnRvIHRoZSBkYXRhIGFyZWEKLQkgcHJvdmlkZWQuICAqLwotICAgICAgZm9yIChjb3VudCA9IDAsIGNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0JICAgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgICBjb3VudCsrLCBjaGFpbiA9IGNoYWluLT5uZXh0KQotCSpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotICAgIH0KLSAgZWxzZQotICAgIHsgCi0gICAgICBhcmVsZW50ICp0YmxwdHI7Ci0KLSAgICAgIGlmIChlY29mZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykgPT0gZmFsc2UpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQkqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICB9Ci0KLSAgKnJlbHB0ciA9IChhcmVsZW50ICopIE5VTEw7Ci0KLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotDAotLyogUHJvdmlkZWQgYSBCRkQsIGEgc2VjdGlvbiBhbmQgYW4gb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24sIGNhbGN1bGF0ZQotICAgYW5kIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlCi0gICB3YW50ZWQgbG9jYXRpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLV9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIGlnbm9yZV9zeW1ib2xzLCBvZmZzZXQsCi0JCQkgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIHJldGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqaWdub3JlX3N5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpyZXRsaW5lX3B0cjsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbyA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBGRFIncy4gICovCi0gIGlmICghIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsIGRlYnVnX2luZm8pCi0gICAgICB8fCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID09IE5VTEwpCi0gICAgewotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID0KLQkoKHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmluZF9saW5lKSkpOwotICAgICAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGxpbmVfaW5mbyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbzsKLQotICByZXR1cm4gX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCBkZWJ1Z19pbmZvLAotCQkJCSBkZWJ1Z19zd2FwLCBsaW5lX2luZm8sIGZpbGVuYW1lX3B0ciwKLQkJCQkgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpOwotfQotDAotLyogQ29weSBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgYnkgb2JqY29weSBhbmQgc3RyaXAuICBXZQotICAgdXNlIGl0IHRvIGNvcHkgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIG9uZSBCRkQgdG8gdGhlCi0gICBvdGhlci4gIEl0IHdvdWxkIGJlIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSBFQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBIb3dldmVyLCBpdCB3b3VsZCBiZSBhCi0gICBsb3Qgb2Ygd29yaywgYW5kIHRoZXJlIHdvdWxkIGJlIGxpdHRsZSBnYWluIChnYXMsIGdkYiwgYW5kIGxkCi0gICBhbHJlYWR5IGFjY2VzcyB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIHZpYSB0aGUKLSAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBhbmQgdGhhdCBzdHJ1Y3R1cmUgd291bGQgaGF2ZSB0byBiZQotICAgcmV0YWluZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCBFQ09GRiBkZWJ1Z2dpbmcgaW4gTUlQUyBFTEYpLgotCi0gICBUaGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgRUNPRkYgZXh0ZXJuYWwgc3ltYm9scyBjb21lcyBmcm9tCi0gICB0aGUgc3ltYm9sIHRhYmxlLCBzbyB0aGlzIGZ1bmN0aW9uIG9ubHkgaGFuZGxlcyB0aGUgb3RoZXIgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppaW5mbyA9ICZlY29mZl9kYXRhIChpYmZkKS0+ZGVidWdfaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm9pbmZvID0gJmVjb2ZmX2RhdGEgKG9iZmQpLT5kZWJ1Z19pbmZvOwotICByZWdpc3RlciBpbnQgaTsKLSAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOwotICBzaXplX3QgYzsKLSAgYm9vbGVhbiBsb2NhbDsKLQotICAvKiBXZSBvbmx5IHdhbnQgdG8gY29weSBpbmZvcm1hdGlvbiBvdmVyIGlmIGJvdGggQkZEJ3MgdXNlIEVDT0ZGCi0gICAgIGZvcm1hdC4gICovCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQ29weSB0aGUgR1AgdmFsdWUgYW5kIHRoZSByZWdpc3RlciBtYXNrcy4gICovCi0gIGVjb2ZmX2RhdGEgKG9iZmQpLT5ncCA9IGVjb2ZmX2RhdGEgKGliZmQpLT5ncDsKLSAgZWNvZmZfZGF0YSAob2JmZCktPmdwcm1hc2sgPSBlY29mZl9kYXRhIChpYmZkKS0+Z3BybWFzazsKLSAgZWNvZmZfZGF0YSAob2JmZCktPmZwcm1hc2sgPSBlY29mZl9kYXRhIChpYmZkKS0+ZnBybWFzazsKLSAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSAgICBlY29mZl9kYXRhIChvYmZkKS0+Y3BybWFza1tpXSA9IGVjb2ZmX2RhdGEgKGliZmQpLT5jcHJtYXNrW2ldOwotCi0gIC8qIENvcHkgdGhlIHZlcnNpb24gc3RhbXAuICAqLwotICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLnZzdGFtcCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIudnN0YW1wOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCBkb24ndCBjb3B5IGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBjID0gYmZkX2dldF9zeW1jb3VudCAob2JmZCk7Ci0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChvYmZkKTsKLSAgaWYgKGMgPT0gMCB8fCBzeW1fcHRyX3B0ciA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWUgaWYgdGhlcmUgYXJlIGFueSBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgbG9jYWwgPSBmYWxzZTsKLSAgZm9yICg7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCi0gICAgewotICAgICAgaWYgKGVjb2Zmc3ltYm9sICgqc3ltX3B0cl9wdHIpLT5sb2NhbCkKLQl7Ci0JICBsb2NhbCA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChsb2NhbCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgc29tZSBsb2NhbCBzeW1ib2xzLiAgV2UganVzdCBicmluZyBvdmVyIGFsbCB0aGUKLQkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRklYTUU6IFRoaXMgaXMgbm90IHF1aXRlIHRoZSByaWdodAotCSB0aGluZyB0byBkby4gIElmIHRoZSB1c2VyIGhhcyBhc2tlZCB1cyB0byBkaXNjYXJkIGFsbAotCSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZW4gd2UgYXJlIHByb2JhYmx5IGdvaW5nIHRvIHdpbmQgdXAKLQkga2VlcGluZyBpdCBiZWNhdXNlIHRoZXJlIHdpbGwgcHJvYmFibHkgYmUgc29tZSBsb2NhbCBzeW1ib2wKLQkgd2hpY2ggb2JqY29weSBkaWQgbm90IGRpc2NhcmQuICBXZSBzaG91bGQgYWN0dWFsbHkgYnJlYWsKLQkgYXBhcnQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbmQgb25seSBrZWVwIHRoYXQgd2hpY2gKLQkgYXBwbGllcyB0byB0aGUgc3ltYm9scyB3ZSB3YW50IHRvIGtlZXAuICAqLwotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pbGluZU1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWxpbmVNYXg7Ci0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmNiTGluZSA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuY2JMaW5lOwotICAgICAgb2luZm8tPmxpbmUgPSBpaW5mby0+bGluZTsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pZG5NYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlkbk1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9kbnIgPSBpaW5mby0+ZXh0ZXJuYWxfZG5yOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlwZE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaXBkTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX3BkciA9IGlpbmZvLT5leHRlcm5hbF9wZHI7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaXN5bU1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaXN5bU1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9zeW0gPSBpaW5mby0+ZXh0ZXJuYWxfc3ltOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlvcHRNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlvcHRNYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfb3B0ID0gaWluZm8tPmV4dGVybmFsX29wdDsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pYXV4TWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pYXV4TWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX2F1eCA9IGlpbmZvLT5leHRlcm5hbF9hdXg7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaXNzTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pc3NNYXg7Ci0gICAgICBvaW5mby0+c3MgPSBpaW5mby0+c3M7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pZmRNYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfZmRyID0gaWluZm8tPmV4dGVybmFsX2ZkcjsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5jcmZkID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5jcmZkOwotICAgICAgb2luZm8tPmV4dGVybmFsX3JmZCA9IGlpbmZvLT5leHRlcm5hbF9yZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgYXJlIGRpc2NhcmRpbmcgYWxsIHRoZSBsb2NhbCBzeW1ib2wgaW5mb3JtYXRpb24uICBMb29rCi0JIHRocm91Z2ggdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBGRFIKLQkgb3IgYXV4IGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGMgPSBiZmRfZ2V0X3N5bWNvdW50IChvYmZkKTsKLSAgICAgIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChvYmZkKTsKLSAgICAgIGZvciAoOyBjID4gMDsgYy0tLCBzeW1fcHRyX3B0cisrKQotCXsKLQkgIEVYVFIgZXN5bTsKLQotCSAgKCooZWNvZmZfYmFja2VuZCAob2JmZCktPmRlYnVnX3N3YXAuc3dhcF9leHRfaW4pKQotCSAgICAob2JmZCwgZWNvZmZzeW1ib2wgKCpzeW1fcHRyX3B0ciktPm5hdGl2ZSwgJmVzeW0pOwotCSAgZXN5bS5pZmQgPSBpZmROaWw7Ci0JICBlc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQkgICgqKGVjb2ZmX2JhY2tlbmQgKG9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X291dCkpCi0JICAgIChvYmZkLCAmZXN5bSwgZWNvZmZzeW1ib2wgKCpzeW1fcHRyX3B0ciktPm5hdGl2ZSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlLiAgVGhlIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgaXMgc3RvcmVkIGluIHRoZQotICAgYmFja2VuZCBwb2ludGVyLiAgV2UgYWx3YXlzIHNldCB0aGUgYXJjaGl0ZWN0dXJlIGFueWhvdywgc2luY2UgbWFueQotICAgY2FsbGVycyBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLSAgcmV0dXJuIGFyY2ggPT0gZWNvZmZfYmFja2VuZCAoYWJmZCktPmFyY2g7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLQotLypBUkdTVVNFRCovCi1pbnQKLV9iZmRfZWNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICBpbnQgYzsKLSAgaW50IHJldDsKLQotICBjID0gMDsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgKytjOwotCi0gIHJldCA9IChiZmRfY29mZl9maWxoc3ogKGFiZmQpCi0JICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKQotCSArIGMgKiBiZmRfY29mZl9zY25oc3ogKGFiZmQpKTsKLSAgcmV0dXJuIEJGRF9BTElHTiAocmV0LCAxNik7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkJICAgIG9mZnNldCwgY291bnQpOwotfQotCi0vKiBTb3J0IHNlY3Rpb25zIGJ5IFZNQSwgYnV0IHB1dCBTRUNfQUxMT0Mgc2VjdGlvbnMgZmlyc3QuICBUaGlzIGlzCi0gICBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotZWNvZmZfc29ydF9oZHJzIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci17Ci0gIGNvbnN0IGFzZWN0aW9uICpoZHIxID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMTsKLSAgY29uc3QgYXNlY3Rpb24gKmhkcjIgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcyOwotCi0gIGlmICgoaGRyMS0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgaWYgKChoZHIyLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChoZHIyLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChoZHIxLT52bWEgPCBoZHIyLT52bWEpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChoZHIxLT52bWEgPiBoZHIyLT52bWEpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9uIGZvciBlYWNoIHNlY3Rpb24sIGFuZCBzZXQKLSAgIHJlbG9jX2ZpbGVwb3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIHNvZmFyLCBmaWxlX3NvZmFyOwotICBhc2VjdGlvbiAqKnNvcnRlZF9oZHJzOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZpbGVfcHRyIG9sZF9zb2ZhcjsKLSAgYm9vbGVhbiByZGF0YV9pbl90ZXh0OwotICBib29sZWFuIGZpcnN0X2RhdGEsIGZpcnN0X25vbmFsbG9jOwotICBjb25zdCBiZmRfdm1hIHJvdW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPnJvdW5kOwotCi0gIHNvZmFyID0gX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZmFsc2UpOwotICBmaWxlX3NvZmFyID0gc29mYXI7Ci0KLSAgLyogU29ydCB0aGUgc2VjdGlvbnMgYnkgVk1BLiAgKi8KLSAgc29ydGVkX2hkcnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKGFiZmQtPnNlY3Rpb25fY291bnQKLQkJCQkJICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBpZiAoc29ydGVkX2hkcnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zLCBpID0gMDsKLSAgICAgICBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGkrKykKLSAgICBzb3J0ZWRfaGRyc1tpXSA9IGN1cnJlbnQ7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0KLSAgcXNvcnQgKHNvcnRlZF9oZHJzLCBhYmZkLT5zZWN0aW9uX2NvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLAotCSBlY29mZl9zb3J0X2hkcnMpOwotCi0gIC8qIFNvbWUgdmVyc2lvbnMgb2YgdGhlIE9TRiBsaW5rZXIgcHV0IHRoZSAucmRhdGEgc2VjdGlvbiBpbiB0aGUKLSAgICAgdGV4dCBzZWdtZW50LCBhbmQgc29tZSBkbyBub3QuICAqLwotICByZGF0YV9pbl90ZXh0ID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPnJkYXRhX2luX3RleHQ7Ci0gIGlmIChyZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgY3VycmVudCA9IHNvcnRlZF9oZHJzW2ldOwotCSAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JEQVRBKSA9PSAwKQotCSAgICBicmVhazsKLQkgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkNPTlNUKSAhPSAwKQotCSAgICB7Ci0JICAgICAgcmRhdGFfaW5fdGV4dCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnJkYXRhX2luX3RleHQgPSByZGF0YV9pbl90ZXh0OwotCi0gIGZpcnN0X2RhdGEgPSB0cnVlOwotICBmaXJzdF9ub25hbGxvYyA9IHRydWU7Ci0gIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLQotICAgICAgY3VycmVudCA9IHNvcnRlZF9oZHJzW2ldOwotCi0gICAgICAvKiBGb3IgdGhlIEFscGhhIEVDT0ZGIC5wZGF0YSBzZWN0aW9uIHRoZSBsbm5vcHRyIGZpZWxkIGlzCi0JIHN1cHBvc2VkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgLnBkYXRhIGVudHJpZXMgdGhhdCBhcmUKLQkgcmVhbGx5IGluIHRoZSBzZWN0aW9uLiAgRWFjaCBlbnRyeSBpcyA4IGJ5dGVzLiAgV2Ugc3RvcmUgdGhpcwotCSBhd2F5IGluIGxpbmVfZmlsZXBvcyBiZWZvcmUgaW5jcmVhc2luZyB0aGUgc2VjdGlvbiBzaXplLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9QREFUQSkgPT0gMCkKLQljdXJyZW50LT5saW5lX2ZpbGVwb3MgPSBjdXJyZW50LT5fcmF3X3NpemUgLyA4OwotCi0gICAgICBhbGlnbm1lbnRfcG93ZXIgPSBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgICAgIC8qIE9uIFVsdHJpeCwgdGhlIGRhdGEgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBmaWxlIG11c3QgYmUKLQkgYWxpZ25lZCB0byBhIHBhZ2UgYm91bmRhcnkgd2l0aGluIHRoZSBmaWxlLiAgVGhpcyBkb2VzIG5vdAotCSBhZmZlY3QgdGhlIHNlY3Rpb24gc2l6ZSwgdGhvdWdoLiAgRklYTUU6IERvZXMgdGhpcyB3b3JrIGZvcgotCSBvdGhlciBwbGF0Zm9ybXM/ICBJdCByZXF1aXJlcyBzb21lIG1vZGlmaWNhdGlvbiBmb3IgdGhlCi0JIEFscGhhLCBiZWNhdXNlIC5yZGF0YSBvbiB0aGUgQWxwaGEgZ29lcyB3aXRoIHRoZSB0ZXh0LCBub3QKLQkgdGhlIGRhdGEuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMAotCSAgJiYgISBmaXJzdF9kYXRhCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgJiYgKCEgcmRhdGFfaW5fdGV4dAotCSAgICAgIHx8IHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JEQVRBKSAhPSAwKQotCSAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDAKLQkgICYmIHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JDT05TVCkgIT0gMCkKLQl7Ci0JICBzb2ZhciA9IChzb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaWxlX3NvZmFyID0gKGZpbGVfc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCSAgZmlyc3RfZGF0YSA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQl7Ci0JICAvKiBPbiBJcml4IDQsIHRoZSBsb2NhdGlvbiBvZiBjb250ZW50cyBvZiB0aGUgLmxpYiBzZWN0aW9uCi0JICAgICBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiBpcyBhbHNvIHJvdW5kZWQgdXAgdG8gYQotCSAgICAgcGFnZSBib3VuZGFyeS4gICovCi0KLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoZmlyc3Rfbm9uYWxsb2MKLQkgICAgICAgJiYgKGN1cnJlbnQtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0JICAgICAgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0JewotCSAgLyogU2tpcCB1cCB0byB0aGUgbmV4dCBwYWdlIGZvciBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLCBzdWNoCi0gICAgICAgICAgICAgYXMgdGhlIC5jb21tZW50IHNlY3Rpb24gb24gdGhlIEFscGhhLiAgVGhpcyBsZWF2ZXMgcm9vbQotICAgICAgICAgICAgIGZvciB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLQkgIGZpcnN0X25vbmFsbG9jID0gZmFsc2U7Ci0JICBzb2ZhciA9IChzb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaWxlX3NvZmFyID0gKGZpbGVfc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCX0KLQotICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCi0JIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICAqLwotICAgICAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQlmaWxlX3NvZmFyID0gQkZEX0FMSUdOIChmaWxlX3NvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JewotCSAgc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIHNvZmFyKSAlIHJvdW5kOwotCSAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICAgIGZpbGVfc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIGZpbGVfc29mYXIpICUgcm91bmQ7Ci0JfQotCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCkpICE9IDApCi0JY3VycmVudC0+ZmlsZXBvcyA9IGZpbGVfc29mYXI7Ci0KLSAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCWZpbGVfc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOwotCi0gICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGlzIHNlY3Rpb24gaXMgb2YgdGhlIHJpZ2h0IHNpemUgdG9vICovCi0gICAgICBvbGRfc29mYXIgPSBzb2ZhcjsKLSAgICAgIHNvZmFyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCBhbGlnbm1lbnRfcG93ZXIpOwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JZmlsZV9zb2ZhciA9IEJGRF9BTElHTiAoZmlsZV9zb2ZhciwgMSA8PCBhbGlnbm1lbnRfcG93ZXIpOwotICAgICAgY3VycmVudC0+X3Jhd19zaXplICs9IHNvZmFyIC0gb2xkX3NvZmFyOwotICAgIH0KLQotICBmcmVlIChzb3J0ZWRfaGRycyk7Ci0gIHNvcnRlZF9oZHJzID0gTlVMTDsKLQotICBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvcyA9IGZpbGVfc29mYXI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlbG9jcyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGUKLSAgIG91dHB1dCBmaWxlLCBhcyB3ZWxsIGFzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9saWMgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlCi1lY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9Ci0gICAgZWNvZmZfYmFja2VuZCAoYWJmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGZpbGVfcHRyIHJlbG9jX2Jhc2U7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGZpbGVfcHRyIHN5bV9iYXNlOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlhYm9ydCAoKTsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLSAgCi0gIHJlbG9jX2Jhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvczsKLQotICByZWxvY19zaXplID0gMDsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID09IDApCi0JY3VycmVudC0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zaXplX3R5cGUgcmVsc2l6ZTsKLQotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSByZWxvY19iYXNlOwotCSAgcmVsc2l6ZSA9IGN1cnJlbnQtPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLQkgIHJlbG9jX3NpemUgKz0gcmVsc2l6ZTsKLQkgIHJlbG9jX2Jhc2UgKz0gcmVsc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHN5bV9iYXNlID0gZWNvZmZfZGF0YSAoYWJmZCktPnJlbG9jX2ZpbGVwb3MgKyByZWxvY19zaXplOwotCi0gIC8qIEF0IGxlYXN0IG9uIFVsdHJpeCwgdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBleGVjdXRhYmxlIGZpbGUgbXVzdAotICAgICBiZSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeS4gIEZJWE1FOiBJcyB0aGlzIHRydWUgb24gb3RoZXIKLSAgICAgcGxhdGZvcm1zPyAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICBzeW1fYmFzZSA9ICgoc3ltX2Jhc2UgKyBlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQgLSAxKQotCQkmfiAoZWNvZmZfYmFja2VuZCAoYWJmZCktPnJvdW5kIC0gMSkpOwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9IHN5bV9iYXNlOwotCi0gIHJldHVybiByZWxvY19zaXplOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgLyogVGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QsIGJlY2F1c2UgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGlzCi0gICAgIGdvaW5nIHRvIHNldCBvdXRwdXRfaGFzX2JlZ3VuIHRvIHRydWUuICAqLwotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoISBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSAubGliIHNlY3Rpb24gc3BlY2lhbGx5IHNvIHRoYXQgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgd29yayBvdXQuICBTZWUgY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyBpbiBjb2ZmY29kZS5oLiAgKi8KLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqcmVjLCAqcmVjZW5kOwotCi0gICAgICByZWMgPSAoYmZkX2J5dGUgKikgbG9jYXRpb247Ci0gICAgICByZWNlbmQgPSByZWMgKyBjb3VudDsKLSAgICAgIHdoaWxlIChyZWMgPCByZWNlbmQpCi0JewotCSAgKytzZWN0aW9uLT5sbWE7Ci0JICByZWMgKz0gYmZkX2dldF8zMiAoYWJmZCwgcmVjKSAqIDQ7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChyZWMgPT0gcmVjZW5kKTsKLSAgICB9Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgR1AgdmFsdWUgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5Ci0gICBubG1jb252LiAgKi8KLQotYmZkX3ZtYQotYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICByZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotfQotCi0vKiBTZXQgdGhlIEdQIHZhbHVlIGZvciBhbiBFQ09GRiBmaWxlLiAgVGhpcyBpcyBhIGhvb2sgdXNlZCBieSB0aGUKLSAgIGFzc2VtYmxlci4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwX3ZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgZ3BfdmFsdWU7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gZ3BfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgcmVnaXN0ZXIgbWFza3MgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5Ci0gICB0aGUgYXNzZW1ibGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyAoYWJmZCwgZ3BybWFzaywgZnBybWFzaywgY3BybWFzaykKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKLSAgICAgdW5zaWduZWQgbG9uZyAqY3BybWFzazsKLXsKLSAgZWNvZmZfZGF0YV90eXBlICp0ZGF0YTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHRkYXRhID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIHRkYXRhLT5ncHJtYXNrID0gZ3BybWFzazsKLSAgdGRhdGEtPmZwcm1hc2sgPSBmcHJtYXNrOwotICBpZiAoY3BybWFzayAhPSAodW5zaWduZWQgbG9uZyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCXRkYXRhLT5jcHJtYXNrW2ldID0gY3BybWFza1tpXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBFQ09GRiBFWFRSIGluZm9ybWF0aW9uIGZvciBhbiBleHRlcm5hbCBzeW1ib2wuICBUaGlzIGZ1bmN0aW9uCi0gICBpcyBwYXNzZWQgdG8gYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9nZXRfZXh0ciAoc3ltLCBlc3ltKQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmVzeW07Ci17Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICplY29mZl9zeW1fcHRyOwotICBiZmQgKmlucHV0X2JmZDsKLQotICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGVjb2Zmc3ltYm9sIChzeW0pLT5uYXRpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBpbmNsdWRlIGRlYnVnZ2luZywgbG9jYWwsIG9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMAotCSAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBlc3ltLT5qbXB0YmwgPSAwOwotICAgICAgZXN5bS0+Y29ib2xfbWFpbiA9IDA7Ci0gICAgICBlc3ltLT53ZWFrZXh0ID0gKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMDsKLSAgICAgIGVzeW0tPnJlc2VydmVkID0gMDsKLSAgICAgIGVzeW0tPmlmZCA9IGlmZE5pbDsKLSAgICAgIC8qIEZJWE1FOiB3ZSBjYW4gZG8gYmV0dGVyIHRoYW4gdGhpcyBmb3Igc3QgYW5kIHNjLiAgKi8KLSAgICAgIGVzeW0tPmFzeW0uc3QgPSBzdEdsb2JhbDsKLSAgICAgIGVzeW0tPmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVzeW0tPmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgZXN5bS0+YXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGVjb2ZmX3N5bV9wdHIgPSBlY29mZnN5bWJvbCAoc3ltKTsKLQotICBpZiAoZWNvZmZfc3ltX3B0ci0+bG9jYWwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlucHV0X2JmZCA9IGJmZF9hc3ltYm9sX2JmZCAoc3ltKTsKLSAgKCooZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbikpCi0gICAgKGlucHV0X2JmZCwgZWNvZmZfc3ltX3B0ci0+bmF0aXZlLCBlc3ltKTsKLQotICAvKiBJZiB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIsIHRoZW4gZXN5bSB3aWxsIGJlCi0gICAgIHVuZGVmaW5lZCBidXQgc3ltIHdpbGwgbm90IGJlLiAgR2V0IGEgYmV0dGVyIGNsYXNzIGZvciBzdWNoIGEKLSAgICAgc3ltYm9sLiAgKi8KLSAgaWYgKChlc3ltLT5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0gICAgICAgfHwgZXN5bS0+YXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0gICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICBlc3ltLT5hc3ltLnNjID0gc2NBYnM7Ci0KLSAgLyogQWRqdXN0IHRoZSBGRFIgaW5kZXggZm9yIHRoZSBzeW1ib2wgYnkgdGhhdCB1c2VkIGZvciB0aGUgaW5wdXQKLSAgICAgQkZELiAgKi8KLSAgaWYgKGVzeW0tPmlmZCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWc7Ci0KLSAgICAgIGlucHV0X2RlYnVnID0gJmVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm87Ci0gICAgICBCRkRfQVNTRVJUIChlc3ltLT5pZmQgPCBpbnB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7Ci0gICAgICBpZiAoaW5wdXRfZGVidWctPmlmZG1hcCAhPSAoUkZEVCAqKSBOVUxMKQotCWVzeW0tPmlmZCA9IGlucHV0X2RlYnVnLT5pZmRtYXBbZXN5bS0+aWZkXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZGV4LiAgVGhpcyByb3V0aW5lIGlzIHBhc3NlZCB0bwotICAgYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zZXRfaW5kZXggKHN5bSwgaW5keCkKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci17Ci0gIGVjb2ZmX3NldF9zeW1faW5kZXggKHN5bSwgaW5keCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBFQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX3ZtYSByb3VuZCA9IGJhY2tlbmQtPnJvdW5kOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGZpbGhzeiA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgYW91dHN6ID0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBzY25oc3ogPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2hkcl9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9yZWxvY19zaXplOwotICB2b2lkICgqIGNvbnN0IGFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSkKLSAgICA9IGJhY2tlbmQtPmFkanVzdF9yZWxvY19vdXQ7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9yZWxvY19vdXQ7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWcgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsKLSAgYmZkX3ZtYSB0ZXh0X3N0YXJ0OwotICBib29sZWFuIHNldF90ZXh0X3N0YXJ0OwotICBiZmRfc2l6ZV90eXBlIGRhdGFfc2l6ZTsKLSAgYmZkX3ZtYSBkYXRhX3N0YXJ0OwotICBib29sZWFuIHNldF9kYXRhX3N0YXJ0OwotICBiZmRfc2l6ZV90eXBlIGJzc19zaXplOwotICBQVFIgYnVmZiA9IE5VTEw7Ci0gIFBUUiByZWxvY19idWZmID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgaW50ZXJuYWxfZjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgaW50ZXJuYWxfYTsKLSAgaW50IGk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoZXJlIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NzIHdpbGwgZ28gaW4gdGhlIG91dHB1dAotICAgICBmaWxlLiAgKi8KLSAgcmVsb2Nfc2l6ZSA9IGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpOwotCi0gIGNvdW50ID0gMTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgewotICAgICAgY3VycmVudC0+dGFyZ2V0X2luZGV4ID0gY291bnQ7Ci0gICAgICArK2NvdW50OwotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICB0ZXh0X3NpemUgPSBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCBmYWxzZSk7Ci0gIGVsc2UKLSAgICB0ZXh0X3NpemUgPSAwOwotICB0ZXh0X3N0YXJ0ID0gMDsKLSAgc2V0X3RleHRfc3RhcnQgPSBmYWxzZTsKLSAgZGF0YV9zaXplID0gMDsKLSAgZGF0YV9zdGFydCA9IDA7Ci0gIHNldF9kYXRhX3N0YXJ0ID0gZmFsc2U7Ci0gIGJzc19zaXplID0gMDsKLQotICAvKiBXcml0ZSBzZWN0aW9uIGhlYWRlcnMgdG8gdGhlIGZpbGUuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJ1ZmYgYmlnIGVub3VnaCB0byBob2xkIGEgc2VjdGlvbiBoZWFkZXIsCi0gICAgIGZpbGUgaGVhZGVyLCBvciBhLm91dCBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX3NpemVfdHlwZSBzaXo7Ci0gICAgc2l6ID0gc2NuaHN6OwotICAgIGlmIChzaXogPCBmaWxoc3opCi0gICAgICBzaXogPSBmaWxoc3o7Ci0gICAgaWYgKHNpeiA8IGFvdXRzeikKLSAgICAgIHNpeiA9IGFvdXRzejsKLSAgICBidWZmID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2l6KTsKLSAgICBpZiAoYnVmZiA9PSBOVUxMKQotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIH0KLQotICBpbnRlcm5hbF9mLmZfbnNjbnMgPSAwOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKGZpbGhzeiArIGFvdXRzeiksIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgdm1hOwotCi0gICAgICArK2ludGVybmFsX2YuZl9uc2NuczsKLQotICAgICAgc3RybmNweSAoc2VjdGlvbi5zX25hbWUsIGN1cnJlbnQtPm5hbWUsIHNpemVvZiBzZWN0aW9uLnNfbmFtZSk7Ci0KLSAgICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgY29ycmVjdCBmb3IgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotICAgICAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCk7Ci0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXNlY3Rpb24uc192YWRkciA9IDA7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3ZhZGRyID0gdm1hOwotCi0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSBjdXJyZW50LT5sbWE7Ci0gICAgICBzZWN0aW9uLnNfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyB1bmxvYWRhYmxlIHRoZW4gdGhlIHNjbnB0ciB3aWxsIGJlIDAuICAqLwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpKSA9PSAwKQotCXNlY3Rpb24uc19zY25wdHIgPSAwOwotICAgICAgZWxzZQotCXNlY3Rpb24uc19zY25wdHIgPSBjdXJyZW50LT5maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCi0gICAgICAvKiBGSVhNRTogdGhlIGxubm9wdHIgb2YgdGhlIC5zYnNzIG9yIC5zZGF0YSBzZWN0aW9uIG9mIGFuCi0JIG9iamVjdCBmaWxlIHByb2R1Y2VkIGJ5IHRoZSBhc3NlbWJsZXIgaXMgc3VwcG9zZWQgdG8gcG9pbnQgdG8KLQkgaW5mb3JtYXRpb24gYWJvdXQgaG93IG11Y2ggcm9vbSBpcyByZXF1aXJlZCBieSBvYmplY3RzIG9mCi0JIHZhcmlvdXMgZGlmZmVyZW50IHNpemVzLiAgSSB0aGluayB0aGlzIG9ubHkgbWF0dGVycyBpZiB3ZQotCSB3YW50IHRoZSBsaW5rZXIgdG8gY29tcHV0ZSB0aGUgYmVzdCBzaXplIHRvIHVzZSwgb3IKLQkgc29tZXRoaW5nLiAgSSBkb24ndCBrbm93IHdoYXQgaGFwcGVucyBpZiB0aGUgaW5mb3JtYXRpb24gaXMKLQkgbm90IHByZXNlbnQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSAhPSAwKQotCXNlY3Rpb24uc19sbm5vcHRyID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgQWxwaGEgRUNPRkYgLnBkYXRhIHNlY3Rpb24gdXNlcyB0aGUgbG5ub3B0ciBmaWVsZCB0bwotCSAgICAgaG9sZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24gKGVhY2ggZW50cnkgaXMKLQkgICAgIDggYnl0ZXMpLiAgV2Ugc3RvcmVkIHRoaXMgaW4gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZCBpbgotCSAgICAgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgKi8KLQkgIHNlY3Rpb24uc19sbm5vcHRyID0gY3VycmVudC0+bGluZV9maWxlcG9zOwotCX0KLQotICAgICAgc2VjdGlvbi5zX25yZWxvYyA9IGN1cnJlbnQtPnJlbG9jX2NvdW50OwotICAgICAgc2VjdGlvbi5zX25sbm5vID0gMDsKLSAgICAgIHNlY3Rpb24uc19mbGFncyA9IGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzIChjdXJyZW50LT5uYW1lLAotCQkJCQkJIGN1cnJlbnQtPmZsYWdzKTsKLQotICAgICAgaWYgKGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgKFBUUikgJnNlY3Rpb24sIGJ1ZmYpID09IDAKLQkgIHx8IGJmZF93cml0ZSAoYnVmZiwgMSwgc2NuaHN6LCBhYmZkKSAhPSBzY25oc3opCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9URVhUKSAhPSAwCi0JICB8fCAoKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfUkRBVEEpICE9IDAKLQkgICAgICAmJiBlY29mZl9kYXRhIChhYmZkKS0+cmRhdGFfaW5fdGV4dCkKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EWU5BTUlDKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSUJMSVNUKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SRUxEWU4pICE9IDAKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX0NPTkZMSUMKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RZTlNUUikgIT0gMAotCSAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfRFlOU1lNKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9IQVNIKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9GSU5JKSAhPSAwCi0JICB8fCBzZWN0aW9uLnNfZmxhZ3MgPT0gU1RZUF9SQ09OU1QpCi0JewotCSAgdGV4dF9zaXplICs9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0JICBpZiAoISBzZXRfdGV4dF9zdGFydCB8fCB0ZXh0X3N0YXJ0ID4gdm1hKQotCSAgICB7Ci0JICAgICAgdGV4dF9zdGFydCA9IHZtYTsKLQkgICAgICBzZXRfdGV4dF9zdGFydCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SREFUQSkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EQVRBKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJVEEpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfTElUOCkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSVQ0KSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1NEQVRBKSAhPSAwCi0JICAgICAgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1hEQVRBCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0dPVCkgIT0gMCkKLQl7Ci0JICBkYXRhX3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQkgIGlmICghIHNldF9kYXRhX3N0YXJ0IHx8IGRhdGFfc3RhcnQgPiB2bWEpCi0JICAgIHsKLQkgICAgICBkYXRhX3N0YXJ0ID0gdm1hOwotCSAgICAgIHNldF9kYXRhX3N0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0JTUykgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9TQlNTKSAhPSAwKQotCWJzc19zaXplICs9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0gICAgICBlbHNlIGlmIChzZWN0aW9uLnNfZmxhZ3MgPT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9MSUIpICE9IDAKLQkgICAgICAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfQ09NTUVOVCkKLQkvKiBEbyBub3RoaW5nICovIDsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9CQotCi0gIC8qIFNldCB1cCB0aGUgZmlsZSBoZWFkZXIuICAqLwotCi0gIGludGVybmFsX2YuZl9tYWdpYyA9IGVjb2ZmX2dldF9tYWdpYyAoYWJmZCk7Ci0KLSAgLyogV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeQotICAgICB0aW1lIHlvdSBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtCi0gICAgIHNvcnJ5LiAgVGhpcyBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28KLSAgICAgaXQgY29tcGFyZXMgdGhlIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0KLSAgICAgZ251QGN5Z251cy5jb20uICAqLwotICBpbnRlcm5hbF9mLmZfdGltZGF0ID0gMDsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgRUNPRkYgZl9uc3ltcyBmaWVsZCBpcyBub3QgYWN0dWFsbHkgdGhlIG51bWJlciBvZgotCSBzeW1ib2xzLCBpdCdzIHRoZSBzaXplIG9mIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gICovCi0gICAgICBpbnRlcm5hbF9mLmZfbnN5bXMgPSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX25zeW1zID0gMDsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSAwOwotICAgIH0KLQotICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gYW91dHN6OwotCi0gIGludGVybmFsX2YuZl9mbGFncyA9IEZfTE5OTzsKLSAgaWYgKHJlbG9jX3NpemUgPT0gMCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9SRUxGTEc7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xTWU1TOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRVhFQzsKLQotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXUjsKLSAgZWxzZQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXOwotCi0gIC8qIFNldCB1cCB0aGUgYGBvcHRpb25hbCcnIGhlYWRlci4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIGludGVybmFsX2EubWFnaWMgPSBFQ09GRl9BT1VUX1pNQUdJQzsKLSAgZWxzZQotICAgIGludGVybmFsX2EubWFnaWMgPSBFQ09GRl9BT1VUX09NQUdJQzsKLQotICAvKiBGSVhNRTogSXMgdGhpcyByZWFsbHkgY29ycmVjdD8gICovCi0gIGludGVybmFsX2EudnN0YW1wID0gc3ltaGRyLT52c3RhbXA7Ci0KLSAgLyogQXQgbGVhc3Qgb24gVWx0cml4LCB0aGVzZSBoYXZlIHRvIGJlIHJvdW5kZWQgdG8gcGFnZSBib3VuZGFyaWVzLgotICAgICBGSVhNRTogSXMgdGhpcyB0cnVlIG9uIG90aGVyIHBsYXRmb3Jtcz8gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSAodGV4dF9zaXplICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IHRleHRfc3RhcnQgJn4gKHJvdW5kIC0gMSk7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gKGRhdGFfc2l6ZSArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0gICAgICBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBkYXRhX3N0YXJ0ICZ+IChyb3VuZCAtIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSB0ZXh0X3NpemU7Ci0gICAgICBpbnRlcm5hbF9hLnRleHRfc3RhcnQgPSB0ZXh0X3N0YXJ0OwotICAgICAgaW50ZXJuYWxfYS5kc2l6ZSA9IGRhdGFfc2l6ZTsKLSAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGRhdGFfc3RhcnQ7Ci0gICAgfQotCi0gIC8qIE9uIFVsdHJpeCwgdGhlIGluaXRpYWwgcG9ydGlvbnMgb2YgdGhlIC5zYnNzIGFuZCAuYnNzIHNlZ21lbnRzCi0gICAgIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIHNlY3Rpb24uICBUaGUgYnNpemUgZmllbGQgaW4gdGhlCi0gICAgIG9wdGlvbmFsIGhlYWRlciByZWNvcmRzIGhvdyBtYW55IGJzcyBieXRlcyBhcmUgcmVxdWlyZWQgYmV5b25kCi0gICAgIHRob3NlIGluIHRoZSBkYXRhIHNlY3Rpb24uICBUaGUgdmFsdWUgaXMgbm90IHJvdW5kZWQgdG8gYSBwYWdlCi0gICAgIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGJzc19zaXplIDwgaW50ZXJuYWxfYS5kc2l6ZSAtIGRhdGFfc2l6ZSkKLSAgICBic3Nfc2l6ZSA9IDA7Ci0gIGVsc2UKLSAgICBic3Nfc2l6ZSAtPSBpbnRlcm5hbF9hLmRzaXplIC0gZGF0YV9zaXplOwotICBpbnRlcm5hbF9hLmJzaXplID0gYnNzX3NpemU7Ci0gIGludGVybmFsX2EuYnNzX3N0YXJ0ID0gaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ICsgaW50ZXJuYWxfYS5kc2l6ZTsKLQotICBpbnRlcm5hbF9hLmVudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICBpbnRlcm5hbF9hLmdwX3ZhbHVlID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotCi0gIGludGVybmFsX2EuZ3BybWFzayA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncHJtYXNrOwotICBpbnRlcm5hbF9hLmZwcm1hc2sgPSBlY29mZl9kYXRhIChhYmZkKS0+ZnBybWFzazsKLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICBpbnRlcm5hbF9hLmNwcm1hc2tbaV0gPSBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1tpXTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgYWRqdXN0IHRoZSBoZWFkZXJzIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChiYWNrZW5kLT5hZGp1c3RfaGVhZGVycykKLSAgICB7Ci0gICAgICBpZiAoISAoKmJhY2tlbmQtPmFkanVzdF9oZWFkZXJzKSAoYWJmZCwgJmludGVybmFsX2YsICZpbnRlcm5hbF9hKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIGhlYWRlciBhbmQgdGhlIG9wdGlvbmFsIGhlYWRlci4gICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIChQVFIpICZpbnRlcm5hbF9mLCBidWZmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgZmlsaHN6LCBhYmZkKSAhPSBmaWxoc3opCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2EsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBhb3V0c3osIGFiZmQpICE9IGFvdXRzeikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCi0gICAgIHdyaXRpbmcgb3V0IHRoZSByZWxvY3Mgc28gdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wgaW5kaWNlcy4gIFdlCi0gICAgIGRvbid0IGRvIHRoaXMgaWYgdGhpcyBCRkQgd2FzIGNyZWF0ZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyLAotICAgICBzaW5jZSBpdCB3aWxsIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBzeW1ib2xzIGFuZCByZWxvY3MuICAqLwotICBpZiAoISBlY29mZl9kYXRhIChhYmZkKS0+bGlua2VyKQotICAgIHsKLSAgICAgIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0gICAgICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ID0gZGVidWctPmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotICAgICAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBpZiAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCSAgICAgKCgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCi0JCQkJICAgICAgPyB0cnVlIDogZmFsc2UpLAotCQkJCSAgICAgZWNvZmZfZ2V0X2V4dHIsIGVjb2ZmX3NldF9pbmRleCkKLQkgID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0gICAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLQkgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotCXsKLQkgIGFyZWxlbnQgKipyZWxvY19wdHJfcHRyOwotCSAgYXJlbGVudCAqKnJlbG9jX2VuZDsKLQkgIGNoYXIgKm91dF9wdHI7Ci0KLQkgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgcmVsb2NfYnVmZiA9Ci0JICAgIGJmZF9hbGxvYyAoYWJmZCwgY3VycmVudC0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKTsKLQkgIGlmIChyZWxvY19idWZmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICByZWxvY19wdHJfcHRyID0gY3VycmVudC0+b3JlbG9jYXRpb247Ci0JICByZWxvY19lbmQgPSByZWxvY19wdHJfcHRyICsgY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBvdXRfcHRyID0gKGNoYXIgKikgcmVsb2NfYnVmZjsKLQkgIGZvciAoOwotCSAgICAgICByZWxvY19wdHJfcHRyIDwgcmVsb2NfZW5kOwotCSAgICAgICByZWxvY19wdHJfcHRyKyssIG91dF9wdHIgKz0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSkKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnJlbG9jOwotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW47Ci0JICAKLQkgICAgICBtZW1zZXQgKChQVFIpICZpbiwgMCwgc2l6ZW9mIGluKTsKLQotCSAgICAgIHJlbG9jID0gKnJlbG9jX3B0cl9wdHI7Ci0JICAgICAgc3ltID0gKnJlbG9jLT5zeW1fcHRyX3B0cjsKLQotCSAgICAgIGluLnJfdmFkZHIgPSAocmVsb2MtPmFkZHJlc3MKLQkJCSAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQpKTsKLQkgICAgICBpbi5yX3R5cGUgPSByZWxvYy0+aG93dG8tPnR5cGU7Ci0KLQkgICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JCXsKLQkJICBpbi5yX3N5bW5keCA9IGVjb2ZmX2dldF9zeW1faW5kZXggKCpyZWxvYy0+c3ltX3B0cl9wdHIpOwotCQkgIGluLnJfZXh0ZXJuID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENPTlNUIGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0JTUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9CU1M7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0lOSVQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnhkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9YREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1BEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkNPTlNUOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIGluLnJfZXh0ZXJuID0gMDsKLQkJfQotCi0JICAgICAgKCphZGp1c3RfcmVsb2Nfb3V0KSAoYWJmZCwgcmVsb2MsICZpbik7Ci0KLQkgICAgICAoKnN3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgJmluLCAoUFRSKSBvdXRfcHRyKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnQtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3dyaXRlIChyZWxvY19idWZmLAotCQkJIGV4dGVybmFsX3JlbG9jX3NpemUsIGN1cnJlbnQtPnJlbG9jX2NvdW50LCBhYmZkKQotCSAgICAgICE9IGV4dGVybmFsX3JlbG9jX3NpemUgKiBjdXJyZW50LT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0JICByZWxvY19idWZmID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0JewotCSAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKGJmZF9lY29mZl93cml0ZV9kZWJ1ZyAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCSAgICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zKQotCSAgICAgID09IGZhbHNlKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSAuYnNzIHNlY3Rpb24gb2YgYSBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZSBtdXN0IHJlY2VpdmUgYW4KLSAgICAgZW50aXJlIHBhZ2UuICBJZiB0aGVyZSBhcmUgc3ltYm9scywgdGhlIHN5bWJvbHMgd2lsbCBzdGFydCBvbiB0aGUKLSAgICAgbmV4dCBwYWdlLiAgSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIG11c3QgZmlsbCBvdXQgdGhlIHBhZ2UgYnkKLSAgICAgaGFuZC4gICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDAKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zIC0gMSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgPT0gMCkKLQljID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2J1ZmYgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX2J1ZmYgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEFyY2hpdmUgaGFuZGxpbmcuICBFQ09GRiB1c2VzIHdoYXQgYXBwZWFycyB0byBiZSBhIHVuaXF1ZSB0eXBlIG9mCi0gICBhcmNoaXZlIGhlYWRlciAoYXJtYXApLiAgVGhlIGJ5dGUgb3JkZXJpbmcgb2YgdGhlIGFybWFwIGFuZCB0aGUKLSAgIGNvbnRlbnRzIGFyZSBlbmNvZGVkIGluIHRoZSBuYW1lIG9mIHRoZSBhcm1hcCBpdHNlbGYuICBBdCBsZWFzdCBmb3IKLSAgIG5vdywgd2Ugb25seSBzdXBwb3J0IGFyY2hpdmVzIHdpdGggdGhlIHNhbWUgYnl0ZSBvcmRlcmluZyBpbiB0aGUKLSAgIGFybWFwIGFuZCB0aGUgY29udGVudHMuCi0KLSAgIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIGluIHRoZSBhcm1hcCBhcmUgdGhlIG51bWJlciBvZiBzeW1ib2wKLSAgIGRlZmluaXRpb25zLiAgVGhpcyBpcyBhbHdheXMgYSBwb3dlciBvZiB0d28uCi0KLSAgIFRoaXMgaXMgZm9sbG93ZWQgYnkgdGhlIHN5bWJvbCBkZWZpbml0aW9ucy4gIEVhY2ggc3ltYm9sIGRlZmluaXRpb24KLSAgIG9jY3VwaWVzIDggYnl0ZXMuICBUaGUgZmlyc3QgZm91ciBieXRlcyBhcmUgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgc3RhcnQgb2YgdGhlIGFybWFwIHN0cmluZ3MgdG8gdGhlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgbmFtaW5nCi0gICB0aGlzIHN5bWJvbC4gIFRoZSBzZWNvbmQgZm91ciBieXRlcyBhcmUgdGhlIGZpbGUgb2Zmc2V0IHRvIHRoZQotICAgYXJjaGl2ZSBtZW1iZXIgd2hpY2ggZGVmaW5lcyB0aGlzIHN5bWJvbC4gIElmIHRoZSBzZWNvbmQgZm91ciBieXRlcwotICAgYXJlIDAsIHRoZW4gdGhpcyBpcyBub3QgYWN0dWFsbHkgYSBzeW1ib2wgZGVmaW5pdGlvbiwgYW5kIGl0IHNob3VsZAotICAgYmUgaWdub3JlZC4KLQotICAgVGhlIHN5bWJvbHMgYXJlIGhhc2hlZCBpbnRvIHRoZSBhcm1hcCB3aXRoIGEgY2xvc2VkIGhhc2hpbmcgc2NoZW1lLgotICAgU2VlIHRoZSBmdW5jdGlvbnMgYmVsb3cgZm9yIHRoZSBkZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0uCi0KLSAgIEFmdGVyIHRoZSBzeW1ib2wgZGVmaW5pdGlvbnMgY29tZXMgZm91ciBieXRlcyBob2xkaW5nIHRoZSBzaXplIG9mCi0gICB0aGUgc3RyaW5nIHRhYmxlLCBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIHRhYmxlIGl0c2VsZi4gICovCi0KLS8qIFRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgaGVhZGVycyBsb29rcyBsaWtlIHRoaXM6Ci0gICBfX19fX19fX19fRVtCTF1FW0JMXV8gKHdpdGggYSB0cmFpbGluZyBzcGFjZSkuCi0gICBUaGUgdHJhaWxpbmcgc3BhY2UgaXMgY2hhbmdlZCB0byBhbiBYIGlmIHRoZSBhcmNoaXZlIGlzIGNoYW5nZWQgdG8KLSAgIGluZGljYXRlIHRoYXQgdGhlIGFybWFwIGlzIG91dCBvZiBkYXRlLgotCi0gICBUaGUgQWxwaGEgc2VlbXMgdG8gdXNlIF9fX19fX19fNjRFW0JMXUVbQkxdXy4gICovCi0KLSNkZWZpbmUgQVJNQVBfQklHX0VORElBTiAnQicKLSNkZWZpbmUgQVJNQVBfTElUVExFX0VORElBTiAnTCcKLSNkZWZpbmUgQVJNQVBfTUFSS0VSICdFJwotI2RlZmluZSBBUk1BUF9TVEFSVF9MRU5HVEggMTAKLSNkZWZpbmUgQVJNQVBfSEVBREVSX01BUktFUl9JTkRFWCAxMAotI2RlZmluZSBBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYIDExCi0jZGVmaW5lIEFSTUFQX09CSkVDVF9NQVJLRVJfSU5ERVggMTIKLSNkZWZpbmUgQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWCAxMwotI2RlZmluZSBBUk1BUF9FTkRfSU5ERVggMTQKLSNkZWZpbmUgQVJNQVBfRU5EICJfICIKLQotLyogVGhpcyBpcyBhIG1hZ2ljIG51bWJlciB1c2VkIGluIHRoZSBoYXNoaW5nIGFsZ29yaXRobS4gICovCi0jZGVmaW5lIEFSTUFQX0hBU0hfTUFHSUMgMHg5ZGQ2OGFiNQotCi0vKiBUaGlzIHJldHVybnMgdGhlIGhhc2ggdmFsdWUgdG8gdXNlIGZvciBhIHN0cmluZy4gIEl0IGFsc28gc2V0cwotICAgKlJFSEFTSCB0byB0aGUgcmVoYXNoIGFkanVzdG1lbnQgaWYgdGhlIGZpcnN0IHNsb3QgaXMgdGFrZW4uICBTSVpFCi0gICBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIGFuZCBITE9HIGlzIHRoZSBsb2cKLSAgIGJhc2UgMiBvZiBTSVpFLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZWNvZmZfYXJtYXBfaGFzaCAocywgcmVoYXNoLCBzaXplLCBobG9nKQotICAgICBDT05TVCBjaGFyICpzOwotICAgICB1bnNpZ25lZCBpbnQgKnJlaGFzaDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHVuc2lnbmVkIGludCBobG9nOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoaGxvZyA9PSAwKQotICAgIHJldHVybiAwOwotICBoYXNoID0gKnMrKzsKLSAgd2hpbGUgKCpzICE9ICdcMCcpCi0gICAgaGFzaCA9ICgoaGFzaCA+PiAyNykgfCAoaGFzaCA8PCA1KSkgKyAqcysrOwotICBoYXNoICo9IEFSTUFQX0hBU0hfTUFHSUM7Ci0gICpyZWhhc2ggPSAoaGFzaCAmIChzaXplIC0gMSkpIHwgMTsKLSAgcmV0dXJuIGhhc2ggPj4gKDMyIC0gaGxvZyk7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGFybWFwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgcGFyc2VkX3NpemU7Ci0gIGNoYXIgKnJhd19hcm1hcDsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBjaGFyICpyYXdfcHRyOwotICBzdHJ1Y3Qgc3ltZGVmICpzeW1kZWZfcHRyOwotICBjaGFyICpzdHJpbmdiYXNlOwotICAKLSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBlbGVtZW50LiAgKi8KLSAgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotICBpZiAoaSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJcml4IDQuMC41RiBhcHBhcmVudGx5IGNhbiB1c2UgZWl0aGVyIGFuIEVDT0ZGIGFybWFwIG9yIGEKLSAgICAgc3RhbmRhcmQgQ09GRiBhcm1hcC4gIFdlIGNvdWxkIG1vdmUgdGhlIEVDT0ZGIGFybWFwIHN0dWZmIGludG8KLSAgICAgYmZkX3NsdXJwX2FybWFwLCBidXQgdGhhdCBzZWVtcyBpbmFwcHJvcHJpYXRlIHNpbmNlIG5vIG90aGVyCi0gICAgIHRhcmdldCB1c2VzIHRoaXMgZm9ybWF0LiAgSW5zdGVhZCwgd2UgY2hlY2sgZGlyZWN0bHkgZm9yIGEgQ09GRgotICAgICBhcm1hcC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKLSAgICByZXR1cm4gYmZkX3NsdXJwX2FybWFwIChhYmZkKTsKLQotICAvKiBTZWUgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJtYXAuICAqLwotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5hcm1hcF9zdGFydCwKLQkgICAgICAgQVJNQVBfU1RBUlRfTEVOR1RIKSAhPSAwCi0gICAgICB8fCBuZXh0bmFtZVtBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYXSAhPSBBUk1BUF9NQVJLRVIKLSAgICAgIHx8IChuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9CSUdfRU5ESUFOCi0JICAmJiBuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9MSVRUTEVfRU5ESUFOKQotICAgICAgfHwgbmV4dG5hbWVbQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWF0gIT0gQVJNQVBfTUFSS0VSCi0gICAgICB8fCAobmV4dG5hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gIT0gQVJNQVBfQklHX0VORElBTgotCSAgJiYgbmV4dG5hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gIT0gQVJNQVBfTElUVExFX0VORElBTikKLSAgICAgIHx8IHN0cm5jbXAgKG5leHRuYW1lICsgQVJNQVBfRU5EX0lOREVYLAotCQkgIEFSTUFQX0VORCwgc2l6ZW9mIEFSTUFQX0VORCAtIDEpICE9IDApCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGJ5dGUgb3JkZXJpbmcuICAqLwotICBpZiAoKChuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSA9PSBBUk1BUF9CSUdfRU5ESUFOKQotICAgICAgIF4gKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpKQotICAgICAgfHwgKChuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSA9PSBBUk1BUF9CSUdfRU5ESUFOKQotCSAgXiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIGFybWFwLiAgKi8KLSAgYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gKHN0cnVjdCBhcmVsdGRhdGEgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLSAgICAKLSAgcmF3X2FybWFwID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBwYXJzZWRfc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gKGNoYXIgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBwYXJzZWRfc2l6ZSwgYWJmZCkgIT0gcGFyc2VkX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gIGFyZGF0YS0+dGRhdGEgPSAoUFRSKSByYXdfYXJtYXA7Ci0KLSAgY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSAwOwotICBhcmRhdGEtPmNhY2hlID0gKHN0cnVjdCBhcl9jYWNoZSAqKSBOVUxMOwotCi0gIC8qIFRoaXMgY29kZSB1c2VkIHRvIG92ZXJsYXkgdGhlIHN5bWRlZnMgb3ZlciB0aGUgcmF3IGFyY2hpdmUgZGF0YSwKLSAgICAgYnV0IHRoYXQgZG9lc24ndCB3b3JrIG9uIGEgNjQgYml0IGhvc3QuICAqLwotCi0gIHN0cmluZ2Jhc2UgPSByYXdfYXJtYXAgKyBjb3VudCAqIDggKyA4OwotCi0jaWZkZWYgQ0hFQ0tfQVJNQVBfSEFTSAotICB7Ci0gICAgdW5zaWduZWQgaW50IGhsb2c7Ci0KLSAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBJIGhhdmUgdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHJpZ2h0IGJ5IG1ha2luZwotICAgICAgIHN1cmUgdGhhdCBldmVyeSBzeW1ib2wgY2FuIGJlIGxvb2tlZCB1cCBzdWNjZXNzZnVsbHkuICAqLwotICAgIGhsb2cgPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSA8PD0gMSkKLSAgICAgIGhsb2crKzsKLSAgICBCRkRfQVNTRVJUIChpID09IGNvdW50KTsKLQotICAgIHJhd19wdHIgPSByYXdfYXJtYXAgKyA0OwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IG5hbWVfb2Zmc2V0LCBmaWxlX29mZnNldDsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoLCBzcmNoOwotICAgICAgCi0JbmFtZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIHJhd19wdHIpOwotCWZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAocmF3X3B0ciArIDQpKTsKLQlpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQkgIGNvbnRpbnVlOwotCWhhc2ggPSBlY29mZl9hcm1hcF9oYXNoIChzdHJpbmdiYXNlICsgbmFtZV9vZmZzZXQsICZyZWhhc2gsIGNvdW50LAotCQkJCSBobG9nKTsKLQlpZiAoaGFzaCA9PSBpKQotCSAgY29udGludWU7Ci0KLQkvKiBTZWUgaWYgd2UgY2FuIHJlaGFzaCB0byB0aGlzIGxvY2F0aW9uLiAgKi8KLQlmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoY291bnQgLSAxKTsKLQkgICAgIHNyY2ggIT0gaGFzaCAmJiBzcmNoICE9IGk7Ci0JICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGNvdW50IC0gMSkpCi0JICBCRkRfQVNTRVJUIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfYXJtYXAgKyA4ICsgc3JjaCAqIDgpKQotCQkgICAgICAhPSAwKTsKLQlCRkRfQVNTRVJUIChzcmNoID09IGkpOwotICAgICAgfQotICB9Ci0KLSNlbmRpZiAvKiBDSEVDS19BUk1BUF9IQVNIICovCi0KLSAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19wdHIgKyA0KSkgIT0gMCkKLSAgICAgICsrYXJkYXRhLT5zeW1kZWZfY291bnQ7Ci0KLSAgc3ltZGVmX3B0ciA9ICgoc3RydWN0IHN5bWRlZiAqKQotCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkgICBhcmRhdGEtPnN5bWRlZl9jb3VudCAqIHNpemVvZiAoc3RydWN0IHN5bWRlZikpKTsKLSAgaWYgKCFzeW1kZWZfcHRyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIHN5bWRlZl9wdHI7Ci0KLSAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5hbWVfb2Zmc2V0LCBmaWxlX29mZnNldDsKLQotICAgICAgZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfcHRyICsgNCkpOwotICAgICAgaWYgKGZpbGVfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0gICAgICBuYW1lX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X3B0cik7Ci0gICAgICBzeW1kZWZfcHRyLT5zLm5hbWUgPSBzdHJpbmdiYXNlICsgbmFtZV9vZmZzZXQ7Ci0gICAgICBzeW1kZWZfcHRyLT5maWxlX29mZnNldCA9IGZpbGVfb2Zmc2V0OwotICAgICAgKytzeW1kZWZfcHRyOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuICAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyAlIDI7Ci0KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGFybWFwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICB1bnNpZ25lZCBpbnQgaGFzaHNpemUsIGhhc2hsb2c7Ci0gIHVuc2lnbmVkIGludCBzeW1kZWZzaXplOwotICBpbnQgcGFkaXQ7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZTsKLSAgZmlsZV9wdHIgZmlyc3RyZWFsOwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIGJmZF9ieXRlICpoYXNodGFibGU7Ci0gIGJmZCAqY3VycmVudDsKLSAgYmZkICpsYXN0X2VsdDsKLQotICAvKiBVbHRyaXggYXBwZWFycyB0byB1c2UgYXMgYSBoYXNoIHRhYmxlIHNpemUgdGhlIGxlYXN0IHBvd2VyIG9mIHR3bwotICAgICBncmVhdGVyIHRoYW4gdHdpY2UgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLSAgZm9yIChoYXNobG9nID0gMDsgKCh1bnNpZ25lZCBpbnQpIDEgPDwgaGFzaGxvZykgPD0gMiAqIG9ybF9jb3VudDsgaGFzaGxvZysrKQotICAgIDsKLSAgaGFzaHNpemUgPSAxIDw8IGhhc2hsb2c7Ci0KLSAgc3ltZGVmc2l6ZSA9IGhhc2hzaXplICogODsKLSAgcGFkaXQgPSBzdHJpZHggJSAyOwotICBzdHJpbmdzaXplID0gc3RyaWR4ICsgcGFkaXQ7Ci0KLSAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHN5bWRlZnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLwotICBtYXBzaXplID0gc3ltZGVmc2l6ZSArIHN0cmluZ3NpemUgKyA4OwotCi0gIGZpcnN0cmVhbCA9IFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBtYXBzaXplICsgZWxlbmd0aDsKLQotICBtZW1zZXQgKChQVFIpICZoZHIsIDAsIHNpemVvZiBoZHIpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBFQ09GRiBhcm1hcCBuYW1lLiAgKi8KLSAgc3RyY3B5IChoZHIuYXJfbmFtZSwgZWNvZmZfYmFja2VuZCAoYWJmZCktPmFybWFwX3N0YXJ0KTsKLSAgaGRyLmFyX25hbWVbQVJNQVBfSEVBREVSX01BUktFUl9JTkRFWF0gPSBBUk1BUF9NQVJLRVI7Ci0gIGhkci5hcl9uYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdID0KLSAgICAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKQotICAgICA/IEFSTUFQX0JJR19FTkRJQU4KLSAgICAgOiBBUk1BUF9MSVRUTEVfRU5ESUFOKTsKLSAgaGRyLmFyX25hbWVbQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWF0gPSBBUk1BUF9NQVJLRVI7Ci0gIGhkci5hcl9uYW1lW0FSTUFQX09CSkVDVF9FTkRJQU5fSU5ERVhdID0KLSAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkgPyBBUk1BUF9CSUdfRU5ESUFOIDogQVJNQVBfTElUVExFX0VORElBTjsKLSAgbWVtY3B5IChoZHIuYXJfbmFtZSArIEFSTUFQX0VORF9JTkRFWCwgQVJNQVBfRU5ELCBzaXplb2YgQVJNQVBfRU5EIC0gMSk7Ci0KLSAgLyogV3JpdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgdG8gYmUganVzdCBhIGxpdHRsZSBiaXQKLSAgICAgbGF0ZXIgdGhhbiB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaWxlLCBvdGhlcndpc2UgdGhlIGxpbmtlciB3aWxsCi0gICAgIGNvbXBsYWluIHRoYXQgdGhlIGluZGV4IGlzIG91dCBvZiBkYXRlLiAgQWN0dWFsbHksIHRoZSBVbHRyaXgKLSAgICAgbGlua2VyIGp1c3QgY2hlY2tzIHRoZSBhcmNoaXZlIG5hbWU7IHRoZSBHTlUgbGlua2VyIG1heSBjaGVjayB0aGUKLSAgICAgZGF0ZS4gICovCi0gIHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmc3RhdGJ1Zik7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIChzdGF0YnVmLnN0X210aW1lICsgNjApKTsKLQotICAvKiBUaGUgREVDc3RhdGlvbiB1c2VzIHplcm9lcyBmb3IgdGhlIHVpZCwgZ2lkIGFuZCBtb2RlIG9mIHRoZQotICAgICBhcm1hcC4gICovCi0gIGhkci5hcl91aWRbMF0gPSAnMCc7Ci0gIGhkci5hcl9naWRbMF0gPSAnMCc7Ci0jaWYgMAotICBoZHIuYXJfbW9kZVswXSA9ICcwJzsKLSNlbHNlCi0gIC8qIEJ1aWxkaW5nIGdjYyBlbmRzIHVwIGV4dHJhY3RpbmcgdGhlIGFybWFwIGFzIGEgZmlsZSAtIHR3aWNlLiAqLwotICBoZHIuYXJfbW9kZVswXSA9ICc2JzsKLSAgaGRyLmFyX21vZGVbMV0gPSAnNCc7Ci0gIGhkci5hcl9tb2RlWzJdID0gJzQnOwotI2VuZGlmCi0KLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotCi0gIGhkci5hcl9mbWFnWzBdID0gJ2AnOwotICBoZHIuYXJfZm1hZ1sxXSA9ICdcMDEyJzsKLQotICAvKiBUdXJuIGFsbCBudWxsIGJ5dGVzIGluIHRoZSBoZWFkZXIgaW50byBzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgaWYgKCgoY2hhciAqKSgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgKCgoY2hhciAqKSgmaGRyKSlbaV0pID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBoYXNoc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaGFzaHRhYmxlID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHN5bWRlZnNpemUpOwotICBpZiAoIWhhc2h0YWJsZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY3VycmVudCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgbGFzdF9lbHQgPSBjdXJyZW50OwotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKLQotICAgICAgLyogQWR2YW5jZSBmaXJzdHJlYWwgdG8gdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhpcyBhcmNoaXZlCi0JIGVsZW1lbnQuICAqLwotICAgICAgaWYgKCgoYmZkICopIG1hcFtpXS5wb3MpICE9IGxhc3RfZWx0KQotCXsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBmaXJzdHJlYWwgKz0gYXJlbHRfc2l6ZSAoY3VycmVudCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCSAgICAgIGZpcnN0cmVhbCArPSBmaXJzdHJlYWwgJSAyOwotCSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIG1hcFtpXS5wb3MpOwotCX0KLQotICAgICAgbGFzdF9lbHQgPSBjdXJyZW50OwotCi0gICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoKm1hcFtpXS5uYW1lLCAmcmVoYXNoLCBoYXNoc2l6ZSwgaGFzaGxvZyk7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKGhhc2ggKiA4KSArIDQpKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBzcmNoOwotCi0JICAvKiBUaGUgZGVzaXJlZCBzbG90IGlzIGFscmVhZHkgdGFrZW4uICAqLwotCSAgZm9yIChzcmNoID0gKGhhc2ggKyByZWhhc2gpICYgKGhhc2hzaXplIC0gMSk7Ci0JICAgICAgIHNyY2ggIT0gaGFzaDsKLQkgICAgICAgc3JjaCA9IChzcmNoICsgcmVoYXNoKSAmIChoYXNoc2l6ZSAtIDEpKQotCSAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpKSA9PSAwKQotCSAgICAgIGJyZWFrOwotCi0JICBCRkRfQVNTRVJUIChzcmNoICE9IGhhc2gpOwotCi0JICBoYXNoID0gc3JjaDsKLQl9Ci0JCi0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBtYXBbaV0ubmFtaWR4LAotCQkgICAgKFBUUikgKGhhc2h0YWJsZSArIGhhc2ggKiA4KSk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBmaXJzdHJlYWwsCi0JCSAgICAoUFRSKSAoaGFzaHRhYmxlICsgaGFzaCAqIDggKyA0KSk7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2h0YWJsZSwgMSwgc3ltZGVmc2l6ZSwgYWJmZCkgIT0gc3ltZGVmc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGhhc2h0YWJsZSk7Ci0KLSAgLyogTm93IHdyaXRlIHRoZSBzdHJpbmdzLiAgKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3RyaW5nc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoKm1hcFtpXS5uYW1lKSArIDE7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoKm1hcFtpXS5uYW1lKSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBERUNzdGF0aW9uIGFyIHdlIHVzZSBhIG51bGwuICAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgdGhpcyBCRkQgaXMgYW4gYXJjaGl2ZS4gIElmIGl0IGlzLCByZWFkIGluIHRoZSBhcm1hcAotICAgYW5kIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1fYmZkX2Vjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKLSAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKLQotICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQotICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YKLSAgICAgYXNzaWdubWVudC4gICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9Ci0gICAgKHN0cnVjdCBhcnRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKTsKLQotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEwpCi0gICAgewotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotICAgIH0KLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gU0FSTUFHOwotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotICAKLSAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpID09IGZhbHNlCi0gICAgICB8fCBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmQgKmZpcnN0OwotCi0gICAgICAvKiBUaGlzIGFyY2hpdmUgaGFzIGEgbWFwLCBzbyB3ZSBtYXkgcHJlc3VtZSB0aGF0IHRoZSBjb250ZW50cwotCSBhcmUgb2JqZWN0IGZpbGVzLiAgTWFrZSBzdXJlIHRoYXQgaWYgdGhlIGZpcnN0IGZpbGUgaW4gdGhlCi0JIGFyY2hpdmUgY2FuIGJlIHJlY29nbml6ZWQgYXMgYW4gb2JqZWN0IGZpbGUsIGl0IGlzIGZvciB0aGlzCi0JIHRhcmdldC4gIElmIG5vdCwgYXNzdW1lIHRoYXQgdGhpcyBpcyB0aGUgd3JvbmcgZm9ybWF0LiAgSWYKLQkgdGhlIGZpcnN0IGZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlLCBzb21lYm9keSBpcyBkb2luZwotCSBzb21ldGhpbmcgd2VpcmQsIGFuZCB3ZSBwZXJtaXQgaXQgc28gdGhhdCBhciAtdCB3aWxsIHdvcmsuICAqLwotCi0gICAgICBmaXJzdCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgICBpZiAoZmlyc3QgIT0gTlVMTCkKLQl7Ci0JICBib29sZWFuIGZhaWw7Ci0KLQkgIGZpcnN0LT50YXJnZXRfZGVmYXVsdGVkID0gZmFsc2U7Ci0JICBmYWlsID0gZmFsc2U7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlyc3QsIGJmZF9vYmplY3QpCi0JICAgICAgJiYgZmlyc3QtPnh2ZWMgIT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGZpcnN0KTsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotCSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgLyogV2Ugb3VnaHQgdG8gY2xvc2UgZmlyc3QgaGVyZSwgYnV0IHdlIGNhbid0LCBiZWNhdXNlIHdlCi0gICAgICAgICAgICAgaGF2ZSBubyB3YXkgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFyY2hpdmUgY2FjaGUuICBGSVhNRS4gICovCi0JfQotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQwKLS8qIEVDT0ZGIGxpbmtlciBjb2RlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWNvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgUFRSLCBjaGFyICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT5hYmZkID0gTlVMTDsKLSAgICAgIHJldC0+d3JpdHRlbiA9IDA7Ci0gICAgICByZXQtPnNtYWxsID0gMDsKLSAgICB9Ci0gIG1lbXNldCAoKFBUUikgJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIHJldC0+ZXN5bSk7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBFQ09GRiBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgZWNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEdpdmVuIGFuIEVDT0ZGIEJGRCwgYWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGFzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlIGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLgotICAgVGhpcyBsb29rcyB0aHJvdWdoIHRoZSB1bmRlZmluZWQgc3ltYm9scywgbG9va3MgZWFjaCBvbmUgdXAgaW4gdGhlCi0gICBhcmNoaXZlIGhhc2ggdGFibGUsIGFuZCBhZGRzIGFueSBhc3NvY2lhdGVkIG9iamVjdCBmaWxlLiAgV2UgZG8gbm90Ci0gICB1c2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyBiZWNhdXNlIEVDT0ZGIGFyY2hpdmVzCi0gICBhbHJlYWR5IGhhdmUgYSBoYXNoIHRhYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8gY29uc3RydWN0Ci0gICBhbm90aGVyIG9uZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9ieXRlICpyYXdfYXJtYXA7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqcHVuZGVmOwotICB1bnNpZ25lZCBpbnQgYXJtYXBfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBhcm1hcF9sb2c7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBiZmRfYnl0ZSAqaGFzaHRhYmxlOwotICBjb25zdCBjaGFyICpzdHJpbmdiYXNlOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSByYXcgZGF0YSBmb3IgdGhpcyBhcmNoaXZlLCBhcyBjYW4gaGFwcGVuIG9uCi0gICAgIElyaXggNC4wLjVGLCB3ZSBjYWxsIHRoZSBnZW5lcmljIHJvdXRpbmUuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9yZSBjbGV2ZXIgYWJvdXQgdGhpcywgc2luY2Ugc29tZWRheSB0ZGF0YQotICAgICBtYXkgZ2V0IHRvIHNvbWV0aGluZyBmb3IgYSBnZW5lcmljIGFyY2hpdmUuICAqLwotICByYXdfYXJtYXAgPSAoY29uc3QgYmZkX2J5dGUgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhOwotICBpZiAocmF3X2FybWFwID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHJldHVybiAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCSAgICAoYWJmZCwgaW5mbywgZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKLQotICBhcm1hcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwKTsKLQotICBhcm1hcF9sb2cgPSAwOwotICBmb3IgKGkgPSAxOyBpIDwgYXJtYXBfY291bnQ7IGkgPDw9IDEpCi0gICAgYXJtYXBfbG9nKys7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gYXJtYXBfY291bnQpOwotCi0gIGhhc2h0YWJsZSA9IHJhd19hcm1hcCArIDQ7Ci0gIHN0cmluZ2Jhc2UgPSAoY29uc3QgY2hhciAqKSByYXdfYXJtYXAgKyBhcm1hcF9jb3VudCAqIDggKyA4OwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scy4gICovCi0gIHB1bmRlZiA9ICZpbmZvLT5oYXNoLT51bmRlZnM7Ci0gIHdoaWxlICgqcHVuZGVmICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKLSAgICAgIHVuc2lnbmVkIGludCBmaWxlX29mZnNldDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmQgKmVsZW1lbnQ7Ci0KLSAgICAgIGggPSAqcHVuZGVmOwotCi0gICAgICAvKiBXaGVuIGEgc3ltYm9sIGlzIGRlZmluZWQsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20KLQkgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgLyogUmVtb3ZlIHRoaXMgZW50cnkgZnJvbSB0aGUgbGlzdCwgZm9yIGdlbmVyYWwgY2xlYW5saW5lc3MKLQkgICAgIGFuZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGxpc3QgYWdhaW4KLQkgICAgIGlmIHdlIHNlYXJjaCBhbnkgbW9yZSBsaWJyYXJpZXMuICBXZSBjYW4ndCByZW1vdmUgdGhlCi0JICAgICBlbnRyeSBpZiBpdCBpcyB0aGUgdGFpbCwgYmVjYXVzZSB0aGF0IHdvdWxkIGxvc2UgYW55Ci0JICAgICBlbnRyaWVzIHdlIGFkZCB0byB0aGUgbGlzdCBsYXRlciBvbi4gICovCi0JICBpZiAoKnB1bmRlZiAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKLQkgICAgKnB1bmRlZiA9ICgqcHVuZGVmKS0+bmV4dDsKLQkgIGVsc2UKLQkgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTmF0aXZlIEVDT0ZGIGxpbmtlcnMgZG8gbm90IHB1bGwgaW4gYXJjaGl2ZSBlbGVtZW50cyBtZXJlbHkKLQkgdG8gc2F0aXNmeSBjb21tb24gZGVmaW5pdGlvbnMsIHNvIG5laXRoZXIgZG8gd2UuICBXZSBsZWF2ZQotCSB0aGVtIG9uIHRoZSBsaXN0LCB0aG91Z2gsIGluIGNhc2Ugd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBzb21lCi0JIG90aGVyIG9iamVjdCBmb3JtYXQuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0gICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoaC0+cm9vdC5zdHJpbmcsICZyZWhhc2gsIGFybWFwX2NvdW50LAotCQkJICAgICAgIGFybWFwX2xvZyk7Ci0KLSAgICAgIGZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoaGFzaCAqIDgpICsgNCk7Ci0gICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQl7Ci0JICAvKiBOb3RoaW5nIGluIHRoaXMgc2xvdC4gICovCi0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKGhhc2ggKiA4KSk7Ci0gICAgICBpZiAobmFtZVswXSAhPSBoLT5yb290LnN0cmluZ1swXQotCSAgfHwgc3RyY21wIChuYW1lLCBoLT5yb290LnN0cmluZykgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc3JjaDsKLQkgIGJvb2xlYW4gZm91bmQ7Ci0KLQkgIC8qIFRoYXQgd2FzIHRoZSB3cm9uZyBzeW1ib2wuICBUcnkgcmVoYXNoaW5nLiAgKi8KLQkgIGZvdW5kID0gZmFsc2U7Ci0JICBmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoYXJtYXBfY291bnQgLSAxKTsKLQkgICAgICAgc3JjaCAhPSBoYXNoOwotCSAgICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGFybWFwX2NvdW50IC0gMSkpCi0JICAgIHsKLQkgICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpOwotCSAgICAgIGlmIChmaWxlX29mZnNldCA9PSAwKQotCQlicmVhazsKLQkgICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSk7Ci0JICAgICAgaWYgKG5hbWVbMF0gPT0gaC0+cm9vdC5zdHJpbmdbMF0KLQkJICAmJiBzdHJjbXAgKG5hbWUsIGgtPnJvb3Quc3RyaW5nKSA9PSAwKQotCQl7Ci0JCSAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZm91bmQpCi0JICAgIHsKLQkgICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGhhc2ggPSBzcmNoOwotCX0KLQotICAgICAgZWxlbWVudCA9ICgqYmFja2VuZC0+Z2V0X2VsdF9hdF9maWxlcG9zKSAoYWJmZCwgZmlsZV9vZmZzZXQpOwotICAgICAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBVbmxpa2UgdGhlIGdlbmVyaWMgbGlua2VyLCB3ZSBrbm93IHRoYXQgdGhpcyBlbGVtZW50IHByb3ZpZGVzCi0JIGEgZGVmaW5pdGlvbiBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgd2Uga25vdyB0aGF0IHdlIHdhbnQKLQkgdG8gaW5jbHVkZSBpdC4gIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYW55dGhpbmcuICAqLwotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBlbGVtZW50LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoZWxlbWVudCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgaWYgd2UgdXNlZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gICBiZWNhdXNlIHdlIHdlcmUgbm90IGRlYWxpbmcgd2l0aCBhbiBFQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgSERSUiAqc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKLSAgc2l6ZV90IGVzaXplOwotICBjaGFyICpzc2V4dCA9IE5VTEw7Ci0gIGNoYXIgKmV4dF9wdHI7Ci0gIGNoYXIgKmV4dF9lbmQ7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICBpZiAoISBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICBzeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIGV4dGVybmFsIHN0cmluZ3MuICAqLwotICBleHRlcm5hbF9leHRfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGVzaXplID0gc3ltaGRyLT5pZXh0TWF4ICogZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGV4dGVybmFsX2V4dCA9IChQVFIpIGJmZF9tYWxsb2MgKGVzaXplKTsKLSAgaWYgKGV4dGVybmFsX2V4dCA9PSBOVUxMICYmIGVzaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGV4dGVybmFsX2V4dCwgMSwgZXNpemUsIGFiZmQpICE9IGVzaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNzZXh0ID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3ltaGRyLT5pc3NFeHRNYXgpOwotICBpZiAoc3NleHQgPT0gTlVMTCAmJiBzeW1oZHItPmlzc0V4dE1heCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltaGRyLT5jYlNzRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChzc2V4dCwgMSwgc3ltaGRyLT5pc3NFeHRNYXgsIGFiZmQpICE9Ci0JICAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pc3NFeHRNYXgpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhleSBkZWZpbmUgc29tZQotICAgICBzeW1ib2wgdGhhdCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLiAgKi8KLSAgZXh0X3B0ciA9IChjaGFyICopIGV4dGVybmFsX2V4dDsKLSAgZXh0X2VuZCA9IGV4dF9wdHIgKyBlc2l6ZTsKLSAgZm9yICg7IGV4dF9wdHIgPCBleHRfZW5kOyBleHRfcHRyICs9IGV4dGVybmFsX2V4dF9zaXplKQotICAgIHsKLSAgICAgIEVYVFIgZXN5bTsKLSAgICAgIGJvb2xlYW4gZGVmOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXh0X3B0ciwgJmVzeW0pOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBzb21ldGhpbmcuICAqLwotICAgICAgaWYgKGVzeW0uYXN5bS5zdCAhPSBzdEdsb2JhbAotCSAgJiYgZXN5bS5hc3ltLnN0ICE9IHN0TGFiZWwKLQkgICYmIGVzeW0uYXN5bS5zdCAhPSBzdFByb2MpCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoZXN5bS5hc3ltLnNjKQotCXsKLQljYXNlIHNjVGV4dDoKLQljYXNlIHNjRGF0YToKLQljYXNlIHNjQnNzOgotCWNhc2Ugc2NBYnM6Ci0JY2FzZSBzY1NEYXRhOgotCWNhc2Ugc2NTQnNzOgotCWNhc2Ugc2NSRGF0YToKLQljYXNlIHNjQ29tbW9uOgotCWNhc2Ugc2NTQ29tbW9uOgotCWNhc2Ugc2NJbml0OgotCWNhc2Ugc2NGaW5pOgotCWNhc2Ugc2NSQ29uc3Q6Ci0JICBkZWYgPSB0cnVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRlZiA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISBkZWYpCi0JY29udGludWU7Ci0KLSAgICAgIG5hbWUgPSBzc2V4dCArIGVzeW0uYXN5bS5pc3M7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFVubGlrZSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHdlIGRvIG5vdCBwdWxsIGluIGVsZW1lbnRzIGJlY2F1c2UKLQkgb2YgY29tbW9uIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEluY2x1ZGUgdGhpcyBlbGVtZW50LiAgKi8KLSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAqcG5lZWRlZCA9IHRydWU7Ci0gICAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotICAgIH0KLQotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAoZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfZXh0KTsKLSAgaWYgKHNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoc3NleHQpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFQ09GRiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKLSAgc2l6ZV90IGVzaXplOwotICBjaGFyICpzc2V4dCA9IE5VTEw7Ci0gIGJvb2xlYW4gcmVzdWx0OwotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltaGRyID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKLQotICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBleHRlcm5hbCBzdHJpbmdzLiAgKi8KLSAgZXh0ZXJuYWxfZXh0X3NpemUgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgZXNpemUgPSBzeW1oZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZXh0ZXJuYWxfZXh0ID0gKFBUUikgYmZkX21hbGxvYyAoZXNpemUpOwotICBpZiAoZXh0ZXJuYWxfZXh0ID09IE5VTEwgJiYgZXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfZXh0LCAxLCBlc2l6ZSwgYWJmZCkgIT0gZXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3NleHQgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzeW1oZHItPmlzc0V4dE1heCk7Ci0gIGlmIChzc2V4dCA9PSBOVUxMICYmIHN5bWhkci0+aXNzRXh0TWF4ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiU3NFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKHNzZXh0LCAxLCBzeW1oZHItPmlzc0V4dE1heCwgYWJmZCkKLQkgICE9IChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlzc0V4dE1heCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVzdWx0ID0gZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KTsKLQotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICByZXR1cm4gcmVzdWx0OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBvZiBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlcgotICAgaGFzaCB0YWJsZS4gIFRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBzdHJpbmdzIHdlIGFyZSBwYXNzZWQgYXJlCi0gICBqdXN0IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGFuZCB3aWxsIGJlIGRpc2NhcmRlZC4gIFdlIG11c3QKLSAgIGV4cGxpY2l0bHkgc2F2ZSBhbnkgaW5mb3JtYXRpb24gd2UgbWF5IG5lZWQgbGF0ZXIgb24gaW4gdGhlIGxpbmsuCi0gICBXZSBkbyBub3Qgd2FudCB0byByZWFkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gYWdhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBQVFIgZXh0ZXJuYWxfZXh0OwotICAgICBjaGFyICpzc2V4dDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9leHRfaW47Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICB1bnNpZ25lZCBsb25nIGV4dF9jb3VudDsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBjaGFyICpleHRfcHRyOwotICBjaGFyICpleHRfZW5kOwotCi0gIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSBleHRfY291bnQgKiBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0gIGlmICghc3ltX2hhc2gpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IHN5bV9oYXNoOwotCi0gIGV4dF9wdHIgPSAoY2hhciAqKSBleHRlcm5hbF9leHQ7Ci0gIGV4dF9lbmQgPSBleHRfcHRyICsgZXh0X2NvdW50ICogZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGZvciAoOyBleHRfcHRyIDwgZXh0X2VuZDsgZXh0X3B0ciArPSBleHRlcm5hbF9leHRfc2l6ZSwgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBFWFRSIGVzeW07Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgKnN5bV9oYXNoID0gTlVMTDsKLQotICAgICAgKCpzd2FwX2V4dF9pbikgKGFiZmQsIChQVFIpIGV4dF9wdHIsICZlc3ltKTsKLQotICAgICAgLyogU2tpcCBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0gICAgICBza2lwID0gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKGVzeW0uYXN5bS5zdCkKLQl7Ci0JY2FzZSBzdEdsb2JhbDoKLQljYXNlIHN0U3RhdGljOgotCWNhc2Ugc3RMYWJlbDoKLQljYXNlIHN0UHJvYzoKLQljYXNlIHN0U3RhdGljUHJvYzoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBza2lwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNraXApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIHZhbHVlID0gZXN5bS5hc3ltLnZhbHVlOwotICAgICAgc3dpdGNoIChlc3ltLmFzeW0uc2MpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBzY05pbDoKLQljYXNlIHNjUmVnaXN0ZXI6Ci0JY2FzZSBzY0NkYkxvY2FsOgotCWNhc2Ugc2NCaXRzOgotCWNhc2Ugc2NDZGJTeXN0ZW06Ci0JY2FzZSBzY1JlZ0ltYWdlOgotCWNhc2Ugc2NJbmZvOgotCWNhc2Ugc2NVc2VyU3RydWN0OgotCWNhc2Ugc2NWYXI6Ci0JY2FzZSBzY1ZhclJlZ2lzdGVyOgotCWNhc2Ugc2NWYXJpYW50OgotCWNhc2Ugc2NCYXNlZFZhcjoKLQljYXNlIHNjWERhdGE6Ci0JY2FzZSBzY1BEYXRhOgotCSAgc2VjdGlvbiA9IE5VTEw7Ci0JICBicmVhazsKLQljYXNlIHNjVGV4dDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGV4dCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0RhdGE6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRhdGEiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NCc3M6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmJzcyIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0FiczoKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1VuZGVmaW5lZDoKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NEYXRhOgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NCc3M6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNic3MiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NSRGF0YToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmRhdGEiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NDb21tb246Ci0JICBpZiAodmFsdWUgPiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSkKLQkgICAgewotCSAgICAgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2Ugc2NTQ29tbW9uOgotCSAgaWYgKGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPSBTQ09NTU9OOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wubmFtZSA9IFNDT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2xfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgICB9Ci0JICBzZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGJyZWFrOwotCWNhc2Ugc2NTVW5kZWZpbmVkOgotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjSW5pdDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuaW5pdCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0Zpbmk6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmZpbmkiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NSQ29uc3Q6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJjb25zdCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IHNzZXh0ICsgZXN5bS5hc3ltLmlzczsKLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLAotCSAgICAgIGVzeW0ud2Vha2V4dCA/IEJTRl9XRUFLIDogQlNGX0dMT0JBTCwKLQkgICAgICBzZWN0aW9uLCB2YWx1ZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwgdHJ1ZSwgdHJ1ZSwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAqc3ltX2hhc2ggPSBoOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gRUNPRkYgaGFzaCB0YWJsZSwgc2F2ZSB0aGUgZXh0ZXJuYWwKLQkgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCi0JewotCSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMCi0JICAgICAgfHwgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQotCQkgICYmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikKLQkJICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpKSkKLQkgICAgewotCSAgICAgIGgtPmFiZmQgPSBhYmZkOwotCSAgICAgIGgtPmVzeW0gPSBlc3ltOwotCSAgICB9Ci0KLQkgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhpcyBzeW1ib2wgd2FzIHNtYWxsIHVuZGVmaW5lZC4gICovCi0JICBpZiAoZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkgICAgaC0+c21hbGwgPSAxOwotCi0JICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgZXZlciBzbWFsbCB1bmRlZmluZWQsIGl0IG5lZWRzIHRvIHdpbmQKLQkgICAgIHVwIGluIGEgR1AgcmVsYXRpdmUgc2VjdGlvbi4gIFdlIGNhbid0IGNvbnRyb2wgdGhlCi0JICAgICBzZWN0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wsIGJ1dCB3ZSBjYW4gY29udHJvbCB0aGUKLQkgICAgIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sLiAgVGhpcyBjYXNlIGlzIGFjdHVhbGx5IG5lZWRlZAotCSAgICAgb24gVWx0cml4IDQuMiB0byBoYW5kbGUgdGhlIHN5bWJvbCBjcmVkIGluIC1sY2tyYi4gICovCi0JICBpZiAoaC0+c21hbGwKLQkgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm5hbWUsIFNDT01NT04pICE9IDApCi0JICAgIHsKLQkgICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLAotCQkJCQkJCQkgU0NPTU1PTik7Ci0JICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQ29tbW9uOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIGZpbmFsIGxpbmsgcm91dGluZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBQVFIgaGFuZGxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gZWNvZmZfbGlua193cml0ZV9leHRlcm5hbC4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotLyogRUNPRkYgZmluYWwgbGluayByb3V0aW5lLiAgVGhpcyBsb29rcyB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEcwotICAgYW5kIGdhdGhlcnMgdG9nZXRoZXIgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGFuZCB0aGVuCi0gICBwcm9jZXNzZXMgYWxsIHRoZSBsaW5rIG9yZGVyIGluZm9ybWF0aW9uLiAgVGhpcyBtYXkgY2F1c2UgaXQgdG8KLSAgIGNsb3NlIGFuZCByZW9wZW4gc29tZSBpbnB1dCBCRkRzOyBJJ2xsIHNlZSBob3cgYmFkIHRoaXMgaXMuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOwotICBIRFJSICpzeW1oZHI7Ci0gIFBUUiBoYW5kbGU7Ci0gIHJlZ2lzdGVyIGJmZCAqaW5wdXRfYmZkOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzdHJ1Y3QgZXh0c3ltX2luZm8gZWluZm87Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGNvdW50cyBpbiB0aGUgc3ltYm9saWMKLSAgICAgaGVhZGVyLiAgKi8KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIHN5bWhkci0+dnN0YW1wID0gMDsKLSAgc3ltaGRyLT5pbGluZU1heCA9IDA7Ci0gIHN5bWhkci0+Y2JMaW5lID0gMDsKLSAgc3ltaGRyLT5pZG5NYXggPSAwOwotICBzeW1oZHItPmlwZE1heCA9IDA7Ci0gIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0gIHN5bWhkci0+aW9wdE1heCA9IDA7Ci0gIHN5bWhkci0+aWF1eE1heCA9IDA7Ci0gIHN5bWhkci0+aXNzTWF4ID0gMDsKLSAgc3ltaGRyLT5pc3NFeHRNYXggPSAwOwotICBzeW1oZHItPmlmZE1heCA9IDA7Ci0gIHN5bWhkci0+Y3JmZCA9IDA7Ci0gIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGl0c2VsZiBpbiB0aGUgZGVidWdfaW5mbwotICAgICBzdHJ1Y3R1cmUuICAqLwotICBkZWJ1Zy0+bGluZSA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfcGRyID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLSAgZGVidWctPnNzID0gTlVMTDsKLSAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9mZHIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2V4dCA9IGRlYnVnLT5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKLQotICBoYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLCBpbmZvKTsKLSAgaWYgKGhhbmRsZSA9PSAoUFRSKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIGVhY2ggaW5wdXQgQkZELiAgKi8KLSAgZm9yIChpbnB1dF9iZmQgPSBpbmZvLT5pbnB1dF9iZmRzOwotICAgICAgIGlucHV0X2JmZCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYm9vbGVhbiByZXQ7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotCXsKLQkgIC8qIEFiaXRyYXJpbHkgc2V0IHRoZSBzeW1ib2xpYyBoZWFkZXIgdnN0YW1wIHRvIHRoZSB2c3RhbXAKLQkgICAgIG9mIHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbiB0aGUgbGluay4gICovCi0JICBpZiAoc3ltaGRyLT52c3RhbXAgPT0gMCkKLQkgICAgc3ltaGRyLT52c3RhbXAKLQkgICAgICA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLnZzdGFtcDsKLQkgIHJldCA9IGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSAoYWJmZCwgaW5wdXRfYmZkLCBpbmZvLAotCQkJCQkJICAgaGFuZGxlKTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0ID0gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIgKGhhbmRsZSwgYWJmZCwKLQkJCQkJCWRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwKLQkJCQkJCWlucHV0X2JmZCwgaW5mbyk7Ci0gICAgICBpZiAoISByZXQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDb21iaW5lIHRoZSByZWdpc3RlciBtYXNrcy4gICovCi0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3BybWFzayB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncHJtYXNrOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmZwcm1hc2sgfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZnBybWFzazsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzBdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbMF07Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1sxXSB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5jcHJtYXNrWzFdOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbMl0gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1syXTsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzNdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbM107Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gIGVpbmZvLmFiZmQgPSBhYmZkOwotICBlaW5mby5pbmZvID0gaW5mbzsKLSAgZWNvZmZfbGlua19oYXNoX3RyYXZlcnNlIChlY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLAotCQkJICAgIChQVFIpICZlaW5mbyk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIG1ha2UgYSBwYXNzIG92ZXIgdGhlIGxpbmtfb3JkZXJzIHRvIGNvdW50IHVwIHRoZQotCSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgd2Ugd2lsbCBuZWVkIHRvIG91dHB1dCwgc28gdGhhdCB3ZSBrbm93Ci0JIGhvdyBtdWNoIHNwYWNlIHRoZXkgd2lsbCB0YWtlIHVwLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgICAgby0+cmVsb2NfY291bnQgKz0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgICAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIENvbXB1dGUgdGhlIHJlbG9jIGFuZCBzeW1ib2wgZmlsZSBwb3NpdGlvbnMuICAqLwotICBlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAoaGFuZGxlLCBhYmZkLCBkZWJ1ZywKLQkJCQkJICAgJmJhY2tlbmQtPmRlYnVnX3N3YXAsIGluZm8sCi0JCQkJCSAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9lY29mZl9kZWJ1Z19mcmVlIChoYW5kbGUsIGFiZmQsIGRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwgaW5mbyk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBOb3cgcmVzZXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0Ci0JIEJGRCB0byAwLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55Ci0JIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCB0aHVzIGZhci4gICovCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0Jby0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBHZXQgYSB2YWx1ZSBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IChoLT51LmRlZi52YWx1ZQotCQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBiZmRfdm1hIGxvOwotCi0JICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLwotCSAgbG8gPSAoYmZkX3ZtYSkgLTE7Ci0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoby0+dm1hIDwgbG8KLQkJICAmJiAoc3RyY21wIChvLT5uYW1lLCBfU0JTUykgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9TREFUQSkgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9MSVQ0KSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX0xJVDgpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCBfTElUQSkgPT0gMCkpCi0JCWxvID0gby0+dm1hOwotCSAgICB9Ci0JICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBsbyArIDB4ODAwMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYwotCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKLQkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCi0JfQotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltaGRyLT5pZXh0TWF4ICsgc3ltaGRyLT5pc3ltTWF4OwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGFuIGlucHV0IEJGRCBpbnRvIHRoZQotICAgb3V0cHV0IEJGRC4gIFRoaXMgbXVzdCByZWFkIGluIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBvZiB0aGUKLSAgIGlucHV0IEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgaGFuZGxlKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgUFRSIGhhbmRsZTsKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotICAgICZlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwOwotICBIRFJSICpzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYm9vbGVhbiByZXQ7Ci0KLSNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCi0gICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAotICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCi0JewkJCQkJCQkJXAotICAgICAgICAgIHJldCA9IGZhbHNlOwkJCQkJCQlcCi0gICAgICAgICAgZ290byByZXR1cm5fc29tZXRoaW5nOwkJCQkJXAotCX0JCQkJCQkJCVwKLSAgICAgIGlmICgoYmZkX3NlZWsgKGlucHV0X2JmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpCVwKLQkgICAhPSAwKQkJCQkJCQlcCi0JICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCi0JCQlpbnB1dF9iZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCVwKLQl7CQkJCQkJCQlcCi0gICAgICAgICAgcmV0ID0gZmFsc2U7CQkJCQkJCVwKLSAgICAgICAgICBnb3RvIHJldHVybl9zb21ldGhpbmc7CQkJCQlcCi0JfQkJCQkJCQkJXAotICAgIH0KLQotICAvKiBJZiByYXdfc3ltZW50cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgZGF0YSB3YXMgYWxyZWFkeSBieSByZWFkIGJ5Ci0gICAgIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mby4gICovCi0gIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLAotCSAgICB1bnNpZ25lZCBjaGFyICopOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgICAgIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JICAgIHVuaW9uIGF1eF9leHQgKik7Ci0gICAgICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7Ci0gICAgfQotI3VuZGVmIFJFQUQKLQotICAvKiBXZSBkbyBub3QgcmVhZCB0aGUgZXh0ZXJuYWwgc3RyaW5ncyBvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0KLSAgcmV0ID0gKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JIChoYW5kbGUsIG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKLQkgICZlY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+ZGVidWdfc3dhcCwKLQkgIGlucHV0X2JmZCwgZGVidWcsIHN3YXAsIGluZm8pKTsKLQotIHJldHVybl9zb21ldGhpbmc6Ci0gIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5saW5lKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOwotICAgICAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5zcyk7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGFjY2lkZW50YWxseSBmb2xsb3cgb25lIG9mIHRoZXNlIHBvaW50ZXJzCi0JIGludG8gZnJlZWQgbWVtb3J5LiAgKi8KLSAgICAgIGRlYnVnLT5saW5lID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX3BkciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfc3ltID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2F1eCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+c3MgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUHV0IG91dCBpbmZvcm1hdGlvbiBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgVGhlc2UgY29tZSBvbmx5IGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQgPSBlaW5mby0+YWJmZDsKLSAgYm9vbGVhbiBzdHJpcDsKLQotICAvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIGJlaW5nIHN0cmlwcGVkLiAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwIHx8IGgtPndyaXR0ZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKLSAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7Ci0gICAgICBoLT5lc3ltLndlYWtleHQgPSAwOwotICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKLSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICBlbHNlCi0JewotCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCQotCSAgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NEQVRBKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkRBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0JTUykgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSU5JVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRklOSSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUERBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUERhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9YREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NYRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JDT05TVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSQ29uc3Q7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCX0KLQotICAgICAgaC0+ZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+ZXN5bS5pZmQgIT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZQotCSBpbnB1dCBCRkQuICAqLwotICAgICAgZGVidWcgPSAmZWNvZmZfZGF0YSAoaC0+YWJmZCktPmRlYnVnX2luZm87Ci0gICAgICBCRkRfQVNTRVJUIChoLT5lc3ltLmlmZCA+PSAwCi0JCSAgJiYgaC0+ZXN5bS5pZmQgPCBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGRlYnVnLT5pZmRtYXBbaC0+ZXN5bS5pZmRdOwotICAgIH0KLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyAhPSBzY1VuZGVmaW5lZAotCSAgJiYgaC0+ZXN5bS5hc3ltLnNjICE9IHNjU1VuZGVmaW5lZCkKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCSAgfHwgaC0+ZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjICE9IHNjQ29tbW9uCi0JICAmJiBoLT5lc3ltLmFzeW0uc2MgIT0gc2NTQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQ29tbW9uOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgdXNlcyBpZXh0TWF4IHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHN5bWJvbCBudW1iZXIuICAqLwotICBoLT5pbmR4ID0gZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7Ci0gIGgtPndyaXR0ZW4gPSAxOwotCi0gIHJldHVybiAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotCSAgKG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKLQkgICAmZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmRlYnVnX3N3YXAsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JICAgJmgtPmVzeW0pKTsKLX0KLQotLyogUmVsb2NhdGUgYW5kIHdyaXRlIGFuIEVDT0ZGIHNlY3Rpb24gaW50byBhbiBFQ09GRiBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9pbmRpcmVjdF9saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZDsKLSAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY3Rpb25fdGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgY29va2VkX3NpemU7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKLSAgUFRSIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0KLSAgQkZEX0FTU0VSVCAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOwotCi0gIGlmIChsaW5rX29yZGVyLT5zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0KLSAgcmF3X3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGNvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotICBpZiAoY29va2VkX3NpemUgPT0gMCkKLSAgICBjb29rZWRfc2l6ZSA9IHJhd19zaXplOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOwotICBCRkRfQVNTRVJUIChjb29rZWRfc2l6ZSA9PSBsaW5rX29yZGVyLT5zaXplKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICBXZSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBsYXJnZXIgb2YKLSAgICAgdGhlIHNpemUgYmVmb3JlIHJlbG9jYXRpbmcgYW5kIHRoZSBzaXplIGFmdGVyIHJlbG9jYXRpbmcuICAqLwotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChyYXdfc2l6ZSA+PSBjb29rZWRfc2l6ZQotCQkJCSAgICAgID8gKHNpemVfdCkgcmF3X3NpemUKLQkJCQkgICAgICA6IChzaXplX3QpIGNvb2tlZF9zaXplKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgcmF3X3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHRoZSBjb250ZW50cyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvCi0gICAgIG1lbW9yeSwgaW4gd2hpY2ggY2FzZSB3ZSBjb3B5IHRoZW0gaW50byBvdXIgbmV3IGJ1ZmZlci4gIFdlIGRvbid0Ci0gICAgIHNpbXBseSByZXVzZSB0aGUgb2xkIGJ1ZmZlciBpbiBjYXNlIGNvb2tlZF9zaXplID4gcmF3X3NpemUuICAqLwotICBpZiAoc2VjdGlvbl90ZGF0YSAhPSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgJiYgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgbWVtY3B5IChjb250ZW50cywgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMsIChzaXplX3QpIHJhd19zaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIChQVFIpIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHJlbG9jcy4gIElmIHdlIGFyZSByZWxheGluZyBNSVBTIGNvZGUsIHRoZXkgd2lsbCBhbHJlYWR5Ci0gICAgIGhhdmUgYmVlbiByZWFkIGluLiAgT3RoZXJ3aXNlLCB3ZSByZWFkIHRoZW0gaW4gbm93LiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGV4dGVybmFsX3JlbG9jc19zaXplID0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGlmIChzZWN0aW9uX3RkYXRhICE9IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMCi0gICAgICAmJiBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBleHRlcm5hbF9yZWxvY3MgPSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7Ci0gICAgICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgZXh0ZXJuYWxfcmVsb2NzX3NpemUgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBpbnB1dF9iZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghICgoKmVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPnJlbG9jYXRlX3NlY3Rpb24pCi0JIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCSAgZXh0ZXJuYWxfcmVsb2NzKSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0ZWQgc2VjdGlvbi4gICovCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwKLQkJCQkgIG91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgY29udGVudHMsCi0JCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgY29va2VkX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIHJlbG9jcyB3ZXJlCi0gICAgIG1vZGlmaWVkLCBhbmQgd2Ugd3JpdGUgdGhlbSBvdXQgbm93LiAgV2UgdXNlIHRoZSByZWxvY19jb3VudAotICAgICBmaWVsZCBvZiBvdXRwdXRfc2VjdGlvbiB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdlCi0gICAgIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgICAgKG91dHB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcyArCi0JCSAgICAgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgb3V0cHV0X2JmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMICYmIHNlY3Rpb25fdGRhdGEgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwgJiYgc2VjdGlvbl90ZGF0YSA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSByZWxvYwotICAgcmVxdWVzdGVkIGJ5IHRoZSBsaW5rZXIsIGFuZCBkb2VzIGNvbWUgZnJvbSBhbnkgaW5wdXQgZmlsZS4gIFRoaXMKLSAgIGlzIHVzZWQgdG8gYnVpbGQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzIHdoZW4gbGlua2luZwotICAgd2l0aCAtVXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUgdHlwZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF92bWEgYWRkZW5kOwotICBhcmVsZW50IHJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jIGluOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9ieXRlICpyYnVmOwotICBib29sZWFuIG9rOwotCi0gIHR5cGUgPSBsaW5rX29yZGVyLT50eXBlOwotICBzZWN0aW9uID0gTlVMTDsKLSAgYWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7Ci0KLSAgLyogV2Ugc2V0IHVwIGFuIGFyZWxlbnQgdG8gcGFzcyB0byB0aGUgYmFja2VuZCBhZGp1c3RfcmVsb2Nfb3V0Ci0gICAgIHJvdXRpbmUuICAqLwotICByZWwuYWRkcmVzcyA9IGxpbmtfb3JkZXItPm9mZnNldDsKLQotICByZWwuaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAocmVsLmhvd3RvID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh0eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uOwotICAgICAgcmVsLnN5bV9wdHJfcHRyID0gc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sIGFzIHRob3VnaCBpdCB3ZXJlCi0gICAgICAgICBhY3R1YWxseSBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgdHlwZSA9IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI7Ci0JICBzZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JICAvKiBJdCBzZWVtcyB0aGF0IHdlIG91Z2h0IHRvIGFkZCB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotICAgICAgICAgICAgIGFkZGVuZCBoZXJlLCBidXQgaW4gcHJhY3RpY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgICAgICAgIGJlY2F1c2UgaXQgd2FzIHBhc3NlZCB0byBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4gICovCi0JICBhZGRlbmQgKz0gc2VjdGlvbi0+dm1hICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3Qgc2V0IHVwIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBjb3JyZWN0bHksCi0JICAgICBiZWNhdXNlIHdlIGhhdmUgbm8gYXN5bWJvbCBzdHJ1Y3R1cmUuICBDdXJyZW50bHkgbm8KLQkgICAgIGFkanVzdF9yZWxvY19vdXQgcm91dGluZSBjYXJlcy4gICovCi0JICByZWwuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIEFsbCBFQ09GRiByZWxvY3MgYXJlIGluLXBsYWNlLiAgUHV0IHRoZSBhZGRlbmQgaW50byB0aGUgb2JqZWN0Ci0gICAgIGZpbGUuICAqLwotCi0gIEJGRF9BU1NFUlQgKHJlbC5ob3d0by0+cGFydGlhbF9pbnBsYWNlKTsKLSAgaWYgKGFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWwuaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChyZWwuaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlY3Rpb24pCi0JCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAotCQkgIHJlbC5ob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWwuYWRkZW5kID0gMDsKLQotICAvKiBNb3ZlIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgaW50ZXJuYWxfcmVsb2Mgc3RydWN0dXJlLiAgKi8KLSAgaW4ucl92YWRkciA9IChyZWwuYWRkcmVzcwotCQkrIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKSk7Ci0gIGluLnJfdHlwZSA9IHJlbC5ob3d0by0+dHlwZTsKLQotICBpZiAodHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9ICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+aW5keCAhPSAtMSkKLQlpbi5yX3N5bW5keCA9IGgtPmluZHg7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGluLnJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICBpbi5yX2V4dGVybiA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQ09OU1QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBzZWN0aW9uKTsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi54ZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgICBpbi5yX2V4dGVybiA9IDA7Ci0gICAgfQotCi0gIC8qIExldCB0aGUgQkZEIGJhY2tlbmQgYWRqdXN0IHRoZSByZWxvYy4gICovCi0gICgqZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmFkanVzdF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmcmVsLCAmaW4pOwotCi0gIC8qIEdldCBzb21lIG1lbW9yeSBhbmQgc3dhcCBvdXQgdGhlIHJlbG9jLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5leHRlcm5hbF9yZWxvY19zaXplOwotICByYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX3JlbG9jX3NpemUpOwotICBpZiAocmJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKCplY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+c3dhcF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmaW4sIChQVFIpIHJidWYpOwotCi0gIG9rID0gKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgIChvdXRwdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MgKwotCQkgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKSwKLQkJICBTRUVLX1NFVCkgPT0gMAotCSYmIChiZmRfd3JpdGUgKChQVFIpIHJidWYsIDEsIGV4dGVybmFsX3JlbG9jX3NpemUsIG91dHB1dF9iZmQpCi0JICAgID09IGV4dGVybmFsX3JlbG9jX3NpemUpKTsKLQotICBpZiAob2spCi0gICAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZnJlZSAocmJ1Zik7Ci0KLSAgcmV0dXJuIG9rOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2ZmbGluay5jIGIvYmZkL2Vjb2ZmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTIwYTJiLi4wMDAwMDAwCi0tLSBhL2JmZC9lY29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OTkgKzAsMCBAQAotLyogUm91dGluZXMgdG8gbGluayBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJvYmphbGxvYy5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotc3RhdGljIGJvb2xlYW4gZWNvZmZfYWRkX2J5dGVzIFBBUkFNUyAoKGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JCQkJCXNpemVfdCBuZWVkKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdHJpbmdfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX2FsaWduX2RlYnVnIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfd3JpdGVfc3ltaGRyIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqLAotCQkJCQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqLAotCQkJCQkgICBmaWxlX3B0ciB3aGVyZSkpOwotc3RhdGljIGludCBjbXBfZmRydGFiX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBta19mZHJ0YWIgUEFSQU1TICgoYmZkICosCi0JCQkJICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCQkJCSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwKLQkJCQkgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKikpOwotc3RhdGljIGxvbmcgZmRydGFiX2xvb2t1cCBQQVJBTVMgKChzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGxvb2t1cF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKikpOwotDAotLyogUm91dGluZXMgdG8gc3dhcCBhdXhpbGlhcnkgaW5mb3JtYXRpb24gaW4gYW5kIG91dC4gIEkgYW0gYXNzdW1pbmcKLSAgIHRoYXQgdGhlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBmb3JtYXQgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRhcmdldAotICAgaW5kZXBlbmRlbnQuICAqLwotCi0vKiBTd2FwIGluIGEgdHlwZSBpbmZvcm1hdGlvbiByZWNvcmQuCi0gICBCSUdFTkQgc2F5cyB3aGV0aGVyIEFVWCBzeW1ib2xzIGFyZSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW47IHRoaXMKLSAgIGluZm8gY29tZXMgZnJvbSB0aGUgZmlsZSBoZWFkZXIgcmVjb3JkIChmaC1mQmlnZW5kaWFuKS4gICovCi0KLXZvaWQKLV9iZmRfZWNvZmZfc3dhcF90aXJfaW4gKGJpZ2VuZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3Qgc3RydWN0IHRpcl9leHQgKmV4dF9jb3B5OwotICAgICBUSVIgKmludGVybjsKLXsKLSAgc3RydWN0IHRpcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqZXh0X2NvcHk7CQkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGludGVybi0+ZkJpdGZpZWxkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfRkJJVEZJRUxEX0JJRyk7Ci0gICAgaW50ZXJuLT5jb250aW51ZWQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9DT05USU5VRURfQklHKTsKLSAgICBpbnRlcm4tPmJ0ICAgICAgICAgID0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9CVF9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTMV9CVF9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTQgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNF9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNF9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTUgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNV9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNV9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTAgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMF9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMF9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTEgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMV9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMV9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTIgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRMl9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMl9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTMgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRM19CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRM19TSF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5mQml0ZmllbGQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9GQklURklFTERfTElUVExFKTsKLSAgICBpbnRlcm4tPmNvbnRpbnVlZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0NPTlRJTlVFRF9MSVRUTEUpOwotICAgIGludGVybi0+YnQgICAgICAgICAgPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0JUX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFMxX0JUX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxNCAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE0X0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFE0X1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxNSAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE1X0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFE1X1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxMCAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFEwX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEwX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxMSAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFExX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFExX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxMiAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEyX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEyX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxMyAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEzX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEzX1NIX0xJVFRMRTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHR5cGUgaW5mb3JtYXRpb24gcmVjb3JkLgotICAgQklHRU5EIHNheXMgd2hldGhlciBBVVggc3ltYm9scyBhcmUgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuOyB0aGlzCi0gICBpbmZvIGNvbWVzIGZyb20gdGhlIGZpbGUgaGVhZGVyIHJlY29yZCAoZmgtZkJpZ2VuZGlhbikuICAqLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCAoYmlnZW5kLCBpbnRlcm5fY29weSwgZXh0KQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBUSVIgKmludGVybl9jb3B5OwotICAgICBzdHJ1Y3QgdGlyX2V4dCAqZXh0OwotewotICBUSVIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgZXh0LT50X2JpdHMxWzBdID0gKChpbnRlcm4tPmZCaXRmaWVsZCA/IFRJUl9CSVRTMV9GQklURklFTERfQklHIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+Y29udGludWVkID8gVElSX0JJVFMxX0NPTlRJTlVFRF9CSUcgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+YnQgPDwgVElSX0JJVFMxX0JUX1NIX0JJRykKLQkJCSAgJiBUSVJfQklUUzFfQlRfQklHKSk7Ci0gICAgZXh0LT50X3RxNDVbMF0gPSAoKChpbnRlcm4tPnRxNCA8PCBUSVJfQklUU19UUTRfU0hfQklHKQotCQkgICAgICAgJiBUSVJfQklUU19UUTRfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTUgPDwgVElSX0JJVFNfVFE1X1NIX0JJRykKLQkJCSAmIFRJUl9CSVRTX1RRNV9CSUcpKTsKLSAgICBleHQtPnRfdHEwMVswXSA9ICgoKGludGVybi0+dHEwIDw8IFRJUl9CSVRTX1RRMF9TSF9CSUcpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMF9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMSA8PCBUSVJfQklUU19UUTFfU0hfQklHKQotCQkJICYgVElSX0JJVFNfVFExX0JJRykpOwotICAgIGV4dC0+dF90cTIzWzBdID0gKCgoaW50ZXJuLT50cTIgPDwgVElSX0JJVFNfVFEyX1NIX0JJRykKLQkJICAgICAgICYgVElSX0JJVFNfVFEyX0JJRykKLQkJICAgICAgfCAoKGludGVybi0+dHEzIDw8IFRJUl9CSVRTX1RRM19TSF9CSUcpCi0JCQkgJiBUSVJfQklUU19UUTNfQklHKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0LT50X2JpdHMxWzBdID0gKChpbnRlcm4tPmZCaXRmaWVsZCA/IFRJUl9CSVRTMV9GQklURklFTERfTElUVExFIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+Y29udGludWVkID8gVElSX0JJVFMxX0NPTlRJTlVFRF9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+YnQgPDwgVElSX0JJVFMxX0JUX1NIX0xJVFRMRSkKLQkJCSAgJiBUSVJfQklUUzFfQlRfTElUVExFKSk7Ci0gICAgZXh0LT50X3RxNDVbMF0gPSAoKChpbnRlcm4tPnRxNCA8PCBUSVJfQklUU19UUTRfU0hfTElUVExFKQotCQkgICAgICAgJiBUSVJfQklUU19UUTRfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTUgPDwgVElSX0JJVFNfVFE1X1NIX0xJVFRMRSkKLQkJCSAmIFRJUl9CSVRTX1RRNV9MSVRUTEUpKTsKLSAgICBleHQtPnRfdHEwMVswXSA9ICgoKGludGVybi0+dHEwIDw8IFRJUl9CSVRTX1RRMF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMF9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMSA8PCBUSVJfQklUU19UUTFfU0hfTElUVExFKQotCQkJICYgVElSX0JJVFNfVFExX0xJVFRMRSkpOwotICAgIGV4dC0+dF90cTIzWzBdID0gKCgoaW50ZXJuLT50cTIgPDwgVElSX0JJVFNfVFEyX1NIX0xJVFRMRSkKLQkJICAgICAgICYgVElSX0JJVFNfVFEyX0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+dHEzIDw8IFRJUl9CSVRTX1RRM19TSF9MSVRUTEUpCi0JCQkgJiBUSVJfQklUU19UUTNfTElUVExFKSk7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhIHJlbGF0aXZlIHN5bWJvbCByZWNvcmQuICBCSUdFTkQgc2F5cyB3aGV0aGVyIGl0IGlzIGluCi0gICBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiovCi0KLXZvaWQKLV9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiaWdlbmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBybmR4X2V4dCAqZXh0X2NvcHk7Ci0gICAgIFJORFhSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBybmR4X2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICpleHRfY29weTsJCS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgaW50ZXJuLT5yZmQgICA9IChleHQtPnJfYml0c1swXSA8PCBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0JJRykKLQkJICB8ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX1JGRF9CSUcpCi0JCSAgICAJCSAgICA+PiBSTkRYX0JJVFMxX1JGRF9TSF9CSUcpOwotICAgIGludGVybi0+aW5kZXggPSAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9JTkRFWF9CSUcpCi0JCSAgICAJCSAgICA8PCBSTkRYX0JJVFMxX0lOREVYX1NIX0xFRlRfQklHKQotCQkgIHwgKGV4dC0+cl9iaXRzWzJdIDw8IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCSAgfCAoZXh0LT5yX2JpdHNbM10gPDwgUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5yZmQgICA9IChleHQtPnJfYml0c1swXSA8PCBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0xJVFRMRSkKLQkJICB8ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX1JGRF9MSVRUTEUpCi0JCSAgICAJCSAgICA8PCBSTkRYX0JJVFMxX1JGRF9TSF9MRUZUX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5pbmRleCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX0lOREVYX0xJVFRMRSkKLQkJICAgIAkJICAgID4+IFJORFhfQklUUzFfSU5ERVhfU0hfTElUVExFKQotCQkgIHwgKGV4dC0+cl9iaXRzWzJdIDw8IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9MSVRUTEUpCi0JCSAgfCAoKHVuc2lnbmVkIGludCkgZXh0LT5yX2JpdHNbM10KLQkJICAgICA8PCBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFKTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHJlbGF0aXZlIHN5bWJvbCByZWNvcmQuICBCSUdFTkQgc2F5cyB3aGV0aGVyIGl0IGlzIGluCi0gICBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiovCi0KLXZvaWQKLV9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCAoYmlnZW5kLCBpbnRlcm5fY29weSwgZXh0KQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBSTkRYUiAqaW50ZXJuX2NvcHk7Ci0gICAgIHN0cnVjdCBybmR4X2V4dCAqZXh0OwotewotICBSTkRYUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBleHQtPnJfYml0c1swXSA9IGludGVybi0+cmZkID4+IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfQklHOwotICAgIGV4dC0+cl9iaXRzWzFdID0gKCgoaW50ZXJuLT5yZmQgPDwgUk5EWF9CSVRTMV9SRkRfU0hfQklHKQotCQkgICAgICAgJiBSTkRYX0JJVFMxX1JGRF9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzFfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQkgJiBSTkRYX0JJVFMxX0lOREVYX0JJRykpOwotICAgIGV4dC0+cl9iaXRzWzJdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHOwotICAgIGV4dC0+cl9iaXRzWzNdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHOwotICB9IGVsc2UgewotICAgIGV4dC0+cl9iaXRzWzBdID0gaW50ZXJuLT5yZmQgPj4gUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9MSVRUTEU7Ci0gICAgZXh0LT5yX2JpdHNbMV0gPSAoKChpbnRlcm4tPnJmZCA+PiBSTkRYX0JJVFMxX1JGRF9TSF9MRUZUX0xJVFRMRSkKLQkJICAgICAgICYgUk5EWF9CSVRTMV9SRkRfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT5pbmRleCA8PCBSTkRYX0JJVFMxX0lOREVYX1NIX0xJVFRMRSkKLQkJCSAmIFJORFhfQklUUzFfSU5ERVhfTElUVExFKSk7Ci0gICAgZXh0LT5yX2JpdHNbMl0gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9MSVRUTEU7Ci0gICAgZXh0LT5yX2JpdHNbM10gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEU7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQwKLS8qIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBkYXRhIHRvIGFsbG9jYXRlLiAgKi8KLSNkZWZpbmUgQUxMT0NfU0laRSAoNDA2NCkKLQotLyogQWRkIGJ5dGVzIHRvIGEgYnVmZmVyLiAgUmV0dXJuIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgbmVlZCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgc2l6ZV90IG5lZWQ7Ci17Ci0gIHNpemVfdCBoYXZlOwotICBzaXplX3Qgd2FudDsKLSAgY2hhciAqbmV3YnVmOwotCi0gIGhhdmUgPSAqYnVmZW5kIC0gKmJ1ZjsKLSAgaWYgKGhhdmUgPiBuZWVkKQotICAgIHdhbnQgPSBBTExPQ19TSVpFOwotICBlbHNlCi0gICAgewotICAgICAgd2FudCA9IG5lZWQgLSBoYXZlOwotICAgICAgaWYgKHdhbnQgPCBBTExPQ19TSVpFKQotCXdhbnQgPSBBTExPQ19TSVpFOwotICAgIH0KLSAgbmV3YnVmID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKCpidWYsIGhhdmUgKyB3YW50KTsKLSAgaWYgKG5ld2J1ZiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKmJ1ZiA9IG5ld2J1ZjsKLSAgKmJ1ZmVuZCA9ICpidWYgKyBoYXZlICsgd2FudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGtlZXAgYSBoYXNoIHRhYmxlIHdoaWNoIG1hcHMgc3RyaW5ncyB0byBudW1iZXJzLiAgV2UgdXNlIGl0IHRvCi0gICBtYXAgRkRSIG5hbWVzIHRvIGluZGljZXMgaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgdG8gbWFwIGxvY2FsCi0gICBzdHJpbmdzIHdoZW4gY29tYmluaW5nIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogRkRSIGluZGV4IG9yIHN0cmluZyB0YWJsZSBvZmZzZXQuICAqLwotICBsb25nIHZhbDsKLSAgLyogTmV4dCBlbnRyeSBpbiBzdHJpbmcgdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKm5leHQ7Ci19OwotCi1zdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotfTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotc3RyaW5nX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnZhbCA9IC0xOwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBzdHJpbmdfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBXZSBjYW4ndCBhZmZvcmQgdG8gcmVhZCBpbiBhbGwgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGVuIHdlIGRvCi0gICBhIGxpbmsuICBJbnN0ZWFkLCB3ZSBidWlsZCBhIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyB0byBzaG93IGhvdwotICAgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBpbnB1dCBmaWxlIG1hcCB0byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdHJ1Y3Qgc2h1ZmZsZQotewotICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGlzIGxpbmtlZCBsaXN0LiAgKi8KLSAgc3RydWN0IHNodWZmbGUgKm5leHQ7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzaXplOwotICAvKiBXaGV0aGVyIHRoaXMgaW5mb3JtYXRpb24gY29tZXMgZnJvbSBhIGZpbGUgb3Igbm90LiAgKi8KLSAgYm9vbGVhbiBmaWxlcDsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBUaGUgQkZEIHRoZSBkYXRhIGNvbWVzIGZyb20uICAqLwotCSAgYmZkICppbnB1dF9iZmQ7Ci0JICAvKiBUaGUgb2Zmc2V0IHdpdGhpbiBpbnB1dF9iZmQuICAqLwotCSAgZmlsZV9wdHIgb2Zmc2V0OwotCX0gZmlsZTsKLSAgICAgIC8qIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3V0LiAgKi8KLSAgICAgIFBUUiBtZW1vcnk7Ci0gICAgfSB1OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWNyb3NzIGNhbGxzIHRvCi0gICBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZS4gICovCi0KLXN0cnVjdCBhY2N1bXVsYXRlCi17Ci0gIC8qIFRoZSBGRFIgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZSBmZHJfaGFzaDsKLSAgLyogVGhlIHN0cmluZ3MgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZSBzdHJfaGFzaDsKLSAgLyogTGlua2VkIGxpc3RzIGRlc2NyaWJpbmcgaG93IHRvIHNodWZmbGUgdGhlIGlucHV0IGRlYnVnCi0gICAgIGluZm9ybWF0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2Uga2VlcCBhIHBvaW50ZXIgdG8gYm90aCB0aGUKLSAgICAgaGVhZCBhbmQgdGhlIHRhaWwuICAqLwotICBzdHJ1Y3Qgc2h1ZmZsZSAqbGluZTsKLSAgc3RydWN0IHNodWZmbGUgKmxpbmVfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqcGRyOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqcGRyX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnN5bTsKLSAgc3RydWN0IHNodWZmbGUgKnN5bV9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpvcHQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpvcHRfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqYXV4OwotICBzdHJ1Y3Qgc2h1ZmZsZSAqYXV4X2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnNzOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqc3NfZW5kOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNzX2hhc2g7Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc3NfaGFzaF9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpmZHI7Ci0gIHN0cnVjdCBzaHVmZmxlICpmZHJfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqcmZkOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqcmZkX2VuZDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgZmlsZSBzaHVmZmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsYXJnZXN0X2ZpbGVfc2h1ZmZsZTsKLSAgLyogQW4gb2JqYWxsb2MgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBvYmphbGxvYyAqbWVtb3J5OwotfTsKLQotLyogQWRkIGEgZmlsZSBlbnRyeSB0byBhIHNodWZmbGUgbGlzdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGFkZF9maWxlX3NodWZmbGUgUEFSQU1TICgoc3RydWN0IGFjY3VtdWxhdGUgKiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKiwgYmZkICosIGZpbGVfcHRyLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIGJvb2xlYW4KLWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCBoZWFkLCB0YWlsLCBpbnB1dF9iZmQsIG9mZnNldCwgc2l6ZSkKLSAgICAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKmhlYWQ7Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqdGFpbDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotewotICBzdHJ1Y3Qgc2h1ZmZsZSAqbjsKLQotICBpZiAoKnRhaWwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwKLSAgICAgICYmICgqdGFpbCktPmZpbGVwCi0gICAgICAmJiAoKnRhaWwpLT51LmZpbGUuaW5wdXRfYmZkID09IGlucHV0X2JmZAotICAgICAgJiYgKCp0YWlsKS0+dS5maWxlLm9mZnNldCArICgqdGFpbCktPnNpemUgPT0gKHVuc2lnbmVkIGxvbmcpIG9mZnNldCkKLSAgICB7Ci0gICAgICAvKiBKdXN0IG1lcmdlIHRoaXMgZW50cnkgb250byB0aGUgZXhpc3Rpbmcgb25lLiAgKi8KLSAgICAgICgqdGFpbCktPnNpemUgKz0gc2l6ZTsKLSAgICAgIGlmICgoKnRhaWwpLT5zaXplID4gYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlKQotCWFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSA9ICgqdGFpbCktPnNpemU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbiA9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKLQkJCQkJIHNpemVvZiAoc3RydWN0IHNodWZmbGUpKTsKLSAgaWYgKCFuKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbi0+bmV4dCA9IE5VTEw7Ci0gIG4tPnNpemUgPSBzaXplOwotICBuLT5maWxlcCA9IHRydWU7Ci0gIG4tPnUuZmlsZS5pbnB1dF9iZmQgPSBpbnB1dF9iZmQ7Ci0gIG4tPnUuZmlsZS5vZmZzZXQgPSBvZmZzZXQ7Ci0gIGlmICgqaGVhZCA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKLSAgICAqaGVhZCA9IG47Ci0gIGlmICgqdGFpbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKLSAgICAoKnRhaWwpLT5uZXh0ID0gbjsKLSAgKnRhaWwgPSBuOwotICBpZiAoc2l6ZSA+IGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSkKLSAgICBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSBzaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgbWVtb3J5IGVudHJ5IHRvIGEgc2h1ZmZsZSBsaXN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gYWRkX21lbW9yeV9zaHVmZmxlIFBBUkFNUyAoKHN0cnVjdCBhY2N1bXVsYXRlICosCi0JCQkJCSAgIHN0cnVjdCBzaHVmZmxlICoqaGVhZCwKLQkJCQkJICAgc3RydWN0IHNodWZmbGUgKip0YWlsLAotCQkJCQkgICBiZmRfYnl0ZSAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1hZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCBoZWFkLCB0YWlsLCBkYXRhLCBzaXplKQotICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqaGVhZDsKLSAgICAgc3RydWN0IHNodWZmbGUgKip0YWlsOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotewotICBzdHJ1Y3Qgc2h1ZmZsZSAqbjsKLSAgICAgCi0gIG4gPSAoc3RydWN0IHNodWZmbGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBzaHVmZmxlKSk7Ci0gIGlmICghbikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5zaXplID0gc2l6ZTsKLSAgbi0+ZmlsZXAgPSBmYWxzZTsKLSAgbi0+dS5tZW1vcnkgPSAoUFRSKSBkYXRhOwotICBpZiAoKmhlYWQgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKmhlYWQgPSBuOwotICBpZiAoKnRhaWwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKCp0YWlsKS0+bmV4dCA9IG47Ci0gICp0YWlsID0gbjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIEZEUiBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIGEgaGFuZGxlIHdoaWNoIGlzIHRoZW4KLSAgIHBhc3NlZCBpbiB0byBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSwgZXQuIGFsLiAgKi8KLQotLypBUkdTVVNFRCovCi1QVFIKLWJmZF9lY29mZl9kZWJ1Z19pbml0IChvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbzsKLQotICBhaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBhY2N1bXVsYXRlKSk7Ci0gIGlmICghYWluZm8pCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAoJmFpbmZvLT5mZHJfaGFzaC50YWJsZSwgc3RyaW5nX2hhc2hfbmV3ZnVuYywKLQkJCSAgICAgICAxMDIxKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhaW5mby0+bGluZSA9IE5VTEw7Ci0gIGFpbmZvLT5saW5lX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5wZHIgPSBOVUxMOwotICBhaW5mby0+cGRyX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5zeW0gPSBOVUxMOwotICBhaW5mby0+c3ltX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5vcHQgPSBOVUxMOwotICBhaW5mby0+b3B0X2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5hdXggPSBOVUxMOwotICBhaW5mby0+YXV4X2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5zcyA9IE5VTEw7Ci0gIGFpbmZvLT5zc19lbmQgPSBOVUxMOwotICBhaW5mby0+c3NfaGFzaCA9IE5VTEw7Ci0gIGFpbmZvLT5zc19oYXNoX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5mZHIgPSBOVUxMOwotICBhaW5mby0+ZmRyX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5yZmQgPSBOVUxMOwotICBhaW5mby0+cmZkX2VuZCA9IE5VTEw7Ci0KLSAgYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlID0gMDsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmFpbmZvLT5zdHJfaGFzaC50YWJsZSwgc3RyaW5nX2hhc2hfbmV3ZnVuYykpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgc3RyaW5nIHRhYmxlIGlzIHRoZSBlbXB0eSBzdHJpbmcuICAqLwotICAgICAgb3V0cHV0X2RlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzTWF4ID0gMTsKLSAgICB9Ci0KLSAgYWluZm8tPm1lbW9yeSA9IG9iamFsbG9jX2NyZWF0ZSAoKTsKLSAgaWYgKGFpbmZvLT5tZW1vcnkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKFBUUikgYWluZm87Ci19Ci0KLS8qIEZyZWUgdGhlIGFjY3VtdWxhdGVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKGhhbmRsZSwgb3V0cHV0X2JmZCwgb3V0cHV0X2RlYnVnLCBvdXRwdXRfc3dhcCwgaW5mbykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXA7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICAKLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFpbmZvLT5mZHJfaGFzaC50YWJsZSk7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhaW5mby0+c3RyX2hhc2gudGFibGUpOwotCi0gIG9iamFsbG9jX2ZyZWUgKGFpbmZvLT5tZW1vcnkpOwotCi0gIGZyZWUgKGFpbmZvKTsKLX0KLQotLyogQWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gSU5QVVRfQkZEIGludG8KLSAgIE9VVFBVVF9CRkQuICBUaGUgSU5QVVRfREVCVUcgYXJndW1lbnQgcG9pbnRzIHRvIHNvbWUgRUNPRkYKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGljaCB3ZSB3YW50IHRvIGxpbmsgaW50byB0aGUgaW5mb3JtYXRpb24KLSAgIHBvaW50ZWQgdG8gYnkgdGhlIE9VVFBVVF9ERUJVRyBhcmd1bWVudC4gIE9VVFBVVF9TV0FQIGFuZAotICAgSU5QVVRfU1dBUCBwb2ludCB0byB0aGUgc3dhcHBpbmcgaW5mb3JtYXRpb24gbmVlZGVkLiAgSU5GTyBpcyB0aGUKLSAgIGxpbmtlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICBIQU5ETEUgaXMgcmV0dXJuZWQgYnkKLSAgIGJmZF9lY29mZl9kZWJ1Z19pbml0LiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSAoaGFuZGxlLCBvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLAotCQkJICAgIGlucHV0X2JmZCwgaW5wdXRfZGVidWcsIGlucHV0X3N3YXAsCi0JCQkgICAgaW5mbykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXA7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSkKLSAgICA9IGlucHV0X3N3YXAtPnN3YXBfc3ltX2luOwotICB2b2lkICgqIGNvbnN0IHN3YXBfcmZkX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBSRkRUICopKQotICAgID0gaW5wdXRfc3dhcC0+c3dhcF9yZmRfaW47Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKQotICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfc3ltX291dDsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2Zkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSkKLSAgICA9IG91dHB1dF9zd2FwLT5zd2FwX2Zkcl9vdXQ7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9yZmRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUkZEVCAqLCBQVFIpKQotICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfcmZkX291dDsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZSA9IG91dHB1dF9zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZSA9IG91dHB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9vcHRfc2l6ZSA9IG91dHB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZSA9IG91dHB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZmRfc2l6ZSA9IG91dHB1dF9zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKLSAgSERSUiAqIGNvbnN0IG91dHB1dF9zeW1oZHIgPSAmb3V0cHV0X2RlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIEhEUlIgKiBjb25zdCBpbnB1dF9zeW1oZHIgPSAmaW5wdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYmZkX3ZtYSBzZWN0aW9uX2FkanVzdFtzY01heF07Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF9ieXRlICpmZHJfc3RhcnQ7Ci0gIGJmZF9ieXRlICpmZHJfcHRyOwotICBiZmRfYnl0ZSAqZmRyX2VuZDsKLSAgYmZkX3NpemVfdHlwZSBmZHJfYWRkOwotICB1bnNpZ25lZCBpbnQgY29waWVkOwotICBSRkRUIGk7Ci0gIHVuc2lnbmVkIGxvbmcgc3o7Ci0gIGJmZF9ieXRlICpyZmRfb3V0OwotICBiZmRfYnl0ZSAqcmZkX2luOwotICBiZmRfYnl0ZSAqcmZkX2VuZDsKLSAgbG9uZyBuZXdyZmRiYXNlID0gMDsKLSAgbG9uZyBvbGRyZmRiYXNlID0gMDsKLSAgYmZkX2J5dGUgKmZkcl9vdXQ7Ci0KLSAgLyogVXNlIHNlY3Rpb25fYWRqdXN0IHRvIGhvbGQgdGhlIHZhbHVlIHRvIGFkZCB0byBhIHN5bWJvbCBpbiBhCi0gICAgIHBhcnRpY3VsYXIgc2VjdGlvbi4gICovCi0gIG1lbXNldCAoKFBUUikgc2VjdGlvbl9hZGp1c3QsIDAsIHNpemVvZiBzZWN0aW9uX2FkanVzdCk7Ci0KLSNkZWZpbmUgU0VUKG5hbWUsIGluZHgpIFwKLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgbmFtZSk7IFwKLSAgaWYgKHNlYyAhPSBOVUxMKSBcCi0gICAgc2VjdGlvbl9hZGp1c3RbaW5keF0gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hIFwKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCBcCi0JCQkgICAgLSBzZWMtPnZtYSk7Ci0KLSAgU0VUICgiLnRleHQiLCBzY1RleHQpOwotICBTRVQgKCIuZGF0YSIsIHNjRGF0YSk7Ci0gIFNFVCAoIi5ic3MiLCBzY0Jzcyk7Ci0gIFNFVCAoIi5zZGF0YSIsIHNjU0RhdGEpOwotICBTRVQgKCIuc2JzcyIsIHNjU0Jzcyk7Ci0gIC8qIHNjUmRhdGEgc2VjdGlvbiBtYXkgYmUgZWl0aGVyIC5yZGF0YSBvciAucm9kYXRhLiAgKi8KLSAgU0VUICgiLnJkYXRhIiwgc2NSRGF0YSk7Ci0gIFNFVCAoIi5yb2RhdGEiLCBzY1JEYXRhKTsKLSAgU0VUICgiLmluaXQiLCBzY0luaXQpOwotICBTRVQgKCIuZmluaSIsIHNjRmluaSk7Ci0gIFNFVCAoIi5yY29uc3QiLCBzY1JDb25zdCk7Ci0KLSN1bmRlZiBTRVQKLQotICAvKiBGaW5kIGFsbCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSBGRFIncy4gIFdlIG5lZWQKLSAgICAgdG8gaGFuZGxlIHRoZW0gd2hldGhlciB0aGV5IGFyZSBzd2FwcGVkIG9yIG5vdC4gICovCi0gIGlmIChpbnB1dF9kZWJ1Zy0+ZmRyICE9IChGRFIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBmZHJfc3RhcnQgPSAoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmZkcjsKLSAgICAgIGZkcl9hZGQgPSBzaXplb2YgKEZEUik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZmRyX3N0YXJ0ID0gKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5leHRlcm5hbF9mZHI7Ci0gICAgICBmZHJfYWRkID0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0gICAgfQotICBmZHJfZW5kID0gZmRyX3N0YXJ0ICsgaW5wdXRfc3ltaGRyLT5pZmRNYXggKiBmZHJfYWRkOwotCi0gIGlucHV0X2RlYnVnLT5pZmRtYXAgPSAoUkZEVCAqKSBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkJICAgIChpbnB1dF9zeW1oZHItPmlmZE1heAotCQkJCQkgICAgICogc2l6ZW9mIChSRkRUKSkpOwotCi0gIHN6ID0gKGlucHV0X3N5bWhkci0+Y3JmZCArIGlucHV0X3N5bWhkci0+aWZkTWF4KSAqIGV4dGVybmFsX3JmZF9zaXplOwotICByZmRfb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0gIGlmICghaW5wdXRfZGVidWctPmlmZG1hcCB8fCAhcmZkX291dCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5yZmQsICZhaW5mby0+cmZkX2VuZCwgcmZkX291dCwgc3opKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb3BpZWQgPSAwOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgRkRSJ3MgdG8gc2VlIHdoaWNoIG9uZXMgd2UgYXJlIGdvaW5nIHRvIGluY2x1ZGUKLSAgICAgaW4gdGhlIGZpbmFsIG91dHB1dC4gIFdlIGRvIG5vdCB3YW50IGR1cGxpY2F0ZSBGRFIgaW5mb3JtYXRpb24KLSAgICAgZm9yIGhlYWRlciBmaWxlcywgYmVjYXVzZSBFQ09GRiBkZWJ1Z2dpbmcgaXMgb2Z0ZW4gdmVyeSBsYXJnZS4KLSAgICAgV2hlbiB3ZSBmaW5kIGFuIEZEUiB3aXRoIG5vIGxpbmUgaW5mb3JtYXRpb24gd2hpY2ggY2FuIGJlIG1lcmdlZCwKLSAgICAgd2UgbG9vayBpdCB1cCBpbiBhIGhhc2ggdGFibGUgdG8gZW5zdXJlIHRoYXQgd2Ugb25seSBpbmNsdWRlIGl0Ci0gICAgIG9uY2UuICBXZSBrZWVwIGEgdGFibGUgbWFwcGluZyBGRFIgbnVtYmVycyB0byB0aGUgZmluYWwgbnVtYmVyCi0gICAgIHRoZXkgZ2V0IHdpdGggdGhlIEJGRCwgc28gdGhhdCB3ZSBjYW4gcmVmZXIgdG8gaXQgd2hlbiB3ZSB3cml0ZQotICAgICBvdXQgdGhlIGV4dGVybmFsIHN5bWJvbHMuICAqLwotICBmb3IgKGZkcl9wdHIgPSBmZHJfc3RhcnQsIGkgPSAwOwotICAgICAgIGZkcl9wdHIgPCBmZHJfZW5kOwotICAgICAgIGZkcl9wdHIgKz0gZmRyX2FkZCwgaSsrLCByZmRfb3V0ICs9IGV4dGVybmFsX3JmZF9zaXplKQotICAgIHsKLSAgICAgIEZEUiBmZHI7Ci0KLSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+ZmRyICE9IChGRFIgKikgTlVMTCkKLQlmZHIgPSAqKEZEUiAqKSBmZHJfcHRyOwotICAgICAgZWxzZQotCSgqaW5wdXRfc3dhcC0+c3dhcF9mZHJfaW4pIChpbnB1dF9iZmQsIChQVFIpIGZkcl9wdHIsICZmZHIpOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBGRFIgY2FuIGJlIG1lcmdlZCB3aXRoIGFuIGV4aXN0aW5nIG9uZS4gICovCi0gICAgICBpZiAoZmRyLmNiTGluZSA9PSAwICYmIGZkci5yc3MgIT0gLTEgJiYgZmRyLmZNZXJnZSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciAqbG9va3VwOwotCSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpmaDsKLQotCSAgLyogV2UgbG9vayB1cCBhIHN0cmluZyBmb3JtZWQgZnJvbSB0aGUgZmlsZSBuYW1lIGFuZCB0aGUKLQkgICAgIG51bWJlciBvZiBzeW1ib2xzIGFuZCBhdXggZW50cmllcy4gIFNvbWV0aW1lcyBhbiBpbmNsdWRlCi0JICAgICBmaWxlIHdpbGwgY29uZGl0aW9uYWxseSBkZWZpbmUgYSB0eXBlZGVmIG9yIHNvbWV0aGluZwotCSAgICAgYmFzZWQgb24gdGhlIG9yZGVyIG9mIGluY2x1ZGUgZmlsZXMuICBVc2luZyB0aGUgbnVtYmVyIG9mCi0JICAgICBzeW1ib2xzIGFuZCBhdXggZW50cmllcyBhcyBhIGhhc2ggcmVkdWNlcyB0aGUgY2hhbmNlIHRoYXQKLQkgICAgIHdlIHdpbGwgbWVyZ2Ugc3ltYm9sIGluZm9ybWF0aW9uIHRoYXQgc2hvdWxkIG5vdCBiZQotCSAgICAgbWVyZ2VkLiAgKi8KLQkgIG5hbWUgPSBpbnB1dF9kZWJ1Zy0+c3MgKyBmZHIuaXNzQmFzZSArIGZkci5yc3M7Ci0KLQkgIGxvb2t1cCA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyMCk7Ci0JICBpZiAobG9va3VwID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHNwcmludGYgKGxvb2t1cCwgIiVzICVseCAlbHgiLCBuYW1lLCBmZHIuY3N5bSwgZmRyLmNhdXgpOwotCi0JICBmaCA9IHN0cmluZ19oYXNoX2xvb2t1cCAoJmFpbmZvLT5mZHJfaGFzaCwgbG9va3VwLCB0cnVlLCB0cnVlKTsKLQkgIGZyZWUgKGxvb2t1cCk7Ci0JICBpZiAoZmggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChmaC0+dmFsICE9IC0xKQotCSAgICB7Ci0JICAgICAgaW5wdXRfZGVidWctPmlmZG1hcFtpXSA9IGZoLT52YWw7Ci0JICAgICAgKCpzd2FwX3JmZF9vdXQpIChvdXRwdXRfYmZkLCBpbnB1dF9kZWJ1Zy0+aWZkbWFwICsgaSwKLQkJCSAgICAgICAoUFRSKSByZmRfb3V0KTsKLQotCSAgICAgIC8qIERvbid0IGNvcHkgdGhpcyBGRFIuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGZoLT52YWwgPSBvdXRwdXRfc3ltaGRyLT5pZmRNYXggKyBjb3BpZWQ7Ci0JfQotCi0gICAgICBpbnB1dF9kZWJ1Zy0+aWZkbWFwW2ldID0gb3V0cHV0X3N5bWhkci0+aWZkTWF4ICsgY29waWVkOwotICAgICAgKCpzd2FwX3JmZF9vdXQpIChvdXRwdXRfYmZkLCBpbnB1dF9kZWJ1Zy0+aWZkbWFwICsgaSwgKFBUUikgcmZkX291dCk7Ci0gICAgICArK2NvcGllZDsKLSAgICB9Ci0KLSAgbmV3cmZkYmFzZSA9IG91dHB1dF9zeW1oZHItPmNyZmQ7Ci0gIG91dHB1dF9zeW1oZHItPmNyZmQgKz0gaW5wdXRfc3ltaGRyLT5pZmRNYXg7Ci0KLSAgLyogQ29weSBvdmVyIGFueSBleGlzdGluZyBSRkQncy4gIFJGRCdzIGFyZSBvbmx5IGNyZWF0ZWQgYnkgdGhlCi0gICAgIGxpbmtlciwgc28gdGhpcyB3aWxsIG9ubHkgaGFwcGVuIGZvciBpbnB1dCBmaWxlcyB3aGljaCBhcmUgdGhlCi0gICAgIHJlc3VsdCBvZiBhIHBhcnRpYWwgbGluay4gICovCi0gIHJmZF9pbiA9IChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZXh0ZXJuYWxfcmZkOwotICByZmRfZW5kID0gcmZkX2luICsgaW5wdXRfc3ltaGRyLT5jcmZkICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemU7Ci0gIGZvciAoOwotICAgICAgIHJmZF9pbiA8IHJmZF9lbmQ7Ci0gICAgICAgcmZkX2luICs9IGlucHV0X3N3YXAtPmV4dGVybmFsX3JmZF9zaXplKQotICAgIHsKLSAgICAgIFJGRFQgcmZkOwotCi0gICAgICAoKnN3YXBfcmZkX2luKSAoaW5wdXRfYmZkLCAoUFRSKSByZmRfaW4sICZyZmQpOwotICAgICAgQkZEX0FTU0VSVCAocmZkID49IDAgJiYgcmZkIDwgaW5wdXRfc3ltaGRyLT5pZmRNYXgpOwotICAgICAgcmZkID0gaW5wdXRfZGVidWctPmlmZG1hcFtyZmRdOwotICAgICAgKCpzd2FwX3JmZF9vdXQpIChvdXRwdXRfYmZkLCAmcmZkLCAoUFRSKSByZmRfb3V0KTsKLSAgICAgIHJmZF9vdXQgKz0gZXh0ZXJuYWxfcmZkX3NpemU7Ci0gICAgfQotCi0gIG9sZHJmZGJhc2UgPSBvdXRwdXRfc3ltaGRyLT5jcmZkOwotICBvdXRwdXRfc3ltaGRyLT5jcmZkICs9IGlucHV0X3N5bWhkci0+Y3JmZDsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIEZEUidzIGFuZCBjb3B5IG92ZXIgYWxsIGFzc29jaWF0ZWQgZGVidWdnaW5nCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgc3ogPSBjb3BpZWQgKiBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgZmRyX291dCA9IChiZmRfYnl0ZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwgc3opOwotICBpZiAoIWZkcl9vdXQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+ZmRyLCAmYWluZm8tPmZkcl9lbmQsIGZkcl9vdXQsIHN6KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoZmRyX3B0ciA9IGZkcl9zdGFydCwgaSA9IDA7Ci0gICAgICAgZmRyX3B0ciA8IGZkcl9lbmQ7Ci0gICAgICAgZmRyX3B0ciArPSBmZHJfYWRkLCBpKyspCi0gICAgewotICAgICAgRkRSIGZkcjsKLSAgICAgIGJmZF92bWEgZmRyX2FkcjsKLSAgICAgIGJmZF9ieXRlICpzeW1fb3V0OwotICAgICAgYmZkX2J5dGUgKmxyYXdfc3JjOwotICAgICAgYmZkX2J5dGUgKmxyYXdfZW5kOwotICAgICAgYm9vbGVhbiBmZ290ZmlsZW5hbWU7Ci0KLSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+aWZkbWFwW2ldIDwgb3V0cHV0X3N5bWhkci0+aWZkTWF4KQotCXsKLQkgIC8qIFdlIGFyZSBub3QgY29weWluZyB0aGlzIEZEUi4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+ZmRyICE9IChGRFIgKikgTlVMTCkKLQlmZHIgPSAqKEZEUiAqKSBmZHJfcHRyOwotICAgICAgZWxzZQotCSgqaW5wdXRfc3dhcC0+c3dhcF9mZHJfaW4pIChpbnB1dF9iZmQsIChQVFIpIGZkcl9wdHIsICZmZHIpOwotCi0gICAgICBmZHJfYWRyID0gZmRyLmFkcjsKLQotICAgICAgLyogQWRqdXN0IHRoZSBGRFIgYWRkcmVzcyBmb3IgYW55IGNoYW5nZXMgdGhhdCBtYXkgaGF2ZSBiZWVuCi0JIG1hZGUgYnkgcmVsYXhpbmcuICAqLwotICAgICAgaWYgKGlucHV0X2RlYnVnLT5hZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQl7Ci0JICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Ci0KLQkgIGZvciAoYWRqdXN0ID0gaW5wdXRfZGVidWctPmFkanVzdDsKLQkgICAgICAgYWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEw7Ci0JICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKLQkgICAgaWYgKGZkcl9hZHIgPj0gYWRqdXN0LT5zdGFydAotCQkmJiBmZHJfYWRyIDwgYWRqdXN0LT5lbmQpCi0JICAgICAgZmRyLmFkciArPSBhZGp1c3QtPmFkanVzdDsKLQl9Ci0KLSAgICAgIC8qIEZJWE1FOiBJdCBpcyBjb25jZWl2YWJsZSB0aGF0IHRoaXMgRkRSIHBvaW50cyB0byB0aGUgLmluaXQgb3IKLQkgLmZpbmkgc2VjdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGlzIHdpbGwgbm90IGRvIHRoZSByaWdodAotCSB0aGluZy4gICovCi0gICAgICBmZHIuYWRyICs9IHNlY3Rpb25fYWRqdXN0W3NjVGV4dF07Ci0KLSAgICAgIC8qIFN3YXAgaW4gdGhlIGxvY2FsIHN5bWJvbHMsIGFkanVzdCB0aGVpciB2YWx1ZXMsIGFuZCBzd2FwIHRoZW0KLQkgb3V0IGFnYWluLiAgKi8KLSAgICAgIGZnb3RmaWxlbmFtZSA9IGZhbHNlOwotICAgICAgc3ogPSBmZHIuY3N5bSAqIGV4dGVybmFsX3N5bV9zaXplOwotICAgICAgc3ltX291dCA9IChiZmRfYnl0ZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwgc3opOwotICAgICAgaWYgKCFzeW1fb3V0KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5zeW0sICZhaW5mby0+c3ltX2VuZCwgc3ltX291dCwKLQkJCSAgICAgICBzeikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbHJhd19zcmMgPSAoKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5leHRlcm5hbF9zeW0KLQkJICArIGZkci5pc3ltQmFzZSAqIGlucHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIGxyYXdfZW5kID0gbHJhd19zcmMgKyBmZHIuY3N5bSAqIGlucHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZm9yICg7ICBscmF3X3NyYyA8IGxyYXdfZW5kOyAgbHJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpCi0JewotCSAgU1lNUiBpbnRlcm5hbF9zeW07Ci0KLQkgICgqc3dhcF9zeW1faW4pIChpbnB1dF9iZmQsIChQVFIpIGxyYXdfc3JjLCAmaW50ZXJuYWxfc3ltKTsKLQotCSAgQkZEX0FTU0VSVCAoaW50ZXJuYWxfc3ltLnNjICE9IHNjQ29tbW9uCi0JCSAgICAgICYmIGludGVybmFsX3N5bS5zYyAhPSBzY1NDb21tb24pOwotCi0JICAvKiBBZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBzd2l0Y2ggKGludGVybmFsX3N5bS5zdCkKLQkgICAgewotCSAgICBjYXNlIHN0TmlsOgotCSAgICAgIGlmIChFQ09GRl9JU19TVEFCICgmaW50ZXJuYWxfc3ltKSkKLQkJYnJlYWs7Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBzdEdsb2JhbDoKLQkgICAgY2FzZSBzdFN0YXRpYzoKLQkgICAgY2FzZSBzdExhYmVsOgotCSAgICBjYXNlIHN0UHJvYzoKLQkgICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0JICAgICAgaWYgKGlucHV0X2RlYnVnLT5hZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQkJewotCQkgIGJmZF92bWEgdmFsdWU7Ci0JCSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotCi0JCSAgdmFsdWUgPSBpbnRlcm5hbF9zeW0udmFsdWU7Ci0JCSAgZm9yIChhZGp1c3QgPSBpbnB1dF9kZWJ1Zy0+YWRqdXN0OwotCQkgICAgICAgYWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEw7Ci0JCSAgICAgICBhZGp1c3QgPSBhZGp1c3QtPm5leHQpCi0JCSAgICBpZiAodmFsdWUgPj0gYWRqdXN0LT5zdGFydAotCQkJJiYgdmFsdWUgPCBhZGp1c3QtPmVuZCkKLQkJICAgICAgaW50ZXJuYWxfc3ltLnZhbHVlICs9IGFkanVzdC0+YWRqdXN0OwotCQl9Ci0JICAgICAgaW50ZXJuYWxfc3ltLnZhbHVlICs9IHNlY3Rpb25fYWRqdXN0W2ludGVybmFsX3N5bS5zY107Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgZG9pbmcgYSBmaW5hbCBsaW5rLCB3ZSBoYXNoIGFsbCB0aGUgc3RyaW5ncyBpbgotCSAgICAgdGhlIGxvY2FsIHN5bWJvbCB0YWJsZSB0b2dldGhlci4gIFRoaXMgcmVkdWNlcyB0aGUgYW1vdW50Ci0JICAgICBvZiBzcGFjZSByZXF1aXJlZCBieSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXZSBkb24ndCBkbwotCSAgICAgdGhpcyB3aGVuIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluayBiZWNhdXNlIGl0IHdvdWxkCi0JICAgICBwcmV2ZW50IHVzIGZyb20gZWFzaWx5IG1lcmdpbmcgZGlmZmVyZW50IEZEUidzLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gZmZpbGVuYW1lOwotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgICBpZiAoISBmZ290ZmlsZW5hbWUgJiYgaW50ZXJuYWxfc3ltLmlzcyA9PSBmZHIucnNzKQotCQlmZmlsZW5hbWUgPSB0cnVlOwotCSAgICAgIGVsc2UKLQkJZmZpbGVuYW1lID0gZmFsc2U7Ci0KLQkgICAgICAvKiBIYXNoIHRoZSBuYW1lIGludG8gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICAgICAgbmFtZSA9IGlucHV0X2RlYnVnLT5zcyArIGZkci5pc3NCYXNlICsgaW50ZXJuYWxfc3ltLmlzczsKLQkgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJaW50ZXJuYWxfc3ltLmlzcyA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLQotCQkgIHNoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmYWluZm8tPnN0cl9oYXNoLCBuYW1lLCB0cnVlLCB0cnVlKTsKLQkJICBpZiAoc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGlmIChzaC0+dmFsID09IC0xKQotCQkgICAgewotCQkgICAgICBzaC0+dmFsID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OwotCQkgICAgICBvdXRwdXRfc3ltaGRyLT5pc3NNYXggKz0gc3RybGVuIChuYW1lKSArIDE7Ci0JCSAgICAgIGlmIChhaW5mby0+c3NfaGFzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCQlhaW5mby0+c3NfaGFzaCA9IHNoOwotCQkgICAgICBpZiAoYWluZm8tPnNzX2hhc2hfZW5kCi0JCQkgICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJCWFpbmZvLT5zc19oYXNoX2VuZC0+bmV4dCA9IHNoOwotCQkgICAgICBhaW5mby0+c3NfaGFzaF9lbmQgPSBzaDsKLQkJICAgIH0KLQkJICBpbnRlcm5hbF9zeW0uaXNzID0gc2gtPnZhbDsKLQkJfQotCi0JICAgICAgaWYgKGZmaWxlbmFtZSkKLQkJewotCQkgIGZkci5yc3MgPSBpbnRlcm5hbF9zeW0uaXNzOwotCQkgIGZnb3RmaWxlbmFtZSA9IHRydWU7Ci0JCX0KLQkgICAgfQotCi0JICAoKnN3YXBfc3ltX291dCkgKG91dHB1dF9iZmQsICZpbnRlcm5hbF9zeW0sIHN5bV9vdXQpOwotCSAgc3ltX291dCArPSBleHRlcm5hbF9zeW1fc2l6ZTsKLQl9Ci0KLSAgICAgIGZkci5pc3ltQmFzZSA9IG91dHB1dF9zeW1oZHItPmlzeW1NYXg7Ci0gICAgICBvdXRwdXRfc3ltaGRyLT5pc3ltTWF4ICs9IGZkci5jc3ltOwotCi0gICAgICAvKiBDb3B5IHRoZSBpbmZvcm1hdGlvbiB0aGF0IGRvZXMgbm90IG5lZWQgc3dhcHBpbmcuICAqLwotCi0gICAgICAvKiBGSVhNRTogSWYgd2UgYXJlIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgbGluZQotCSBudW1iZXJzLiAgRnJhbmtseSwgZm9yZ2V0IGl0LiAgQW55Ym9keSB1c2luZyBzdGFicyBkZWJ1Z2dpbmcKLQkgaW5mb3JtYXRpb24gd2lsbCBub3QgdXNlIHRoaXMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24sIGFuZAotCSBzdGFicyBhcmUgYWRqdXN0ZWQgY29ycmVjdGx5LiAgKi8KLSAgICAgIGlmIChmZHIuY2JMaW5lID4gMCkKLQl7Ci0JICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPmxpbmUsICZhaW5mby0+bGluZV9lbmQsCi0JCQkJIGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc3ltaGRyLT5jYkxpbmVPZmZzZXQgKyBmZHIuY2JMaW5lT2Zmc2V0LAotCQkJCSBmZHIuY2JMaW5lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZmRyLmlsaW5lQmFzZSA9IG91dHB1dF9zeW1oZHItPmlsaW5lTWF4OwotCSAgZmRyLmNiTGluZU9mZnNldCA9IG91dHB1dF9zeW1oZHItPmNiTGluZTsKLQkgIG91dHB1dF9zeW1oZHItPmlsaW5lTWF4ICs9IGZkci5jbGluZTsKLQkgIG91dHB1dF9zeW1oZHItPmNiTGluZSArPSBmZHIuY2JMaW5lOwotCX0KLSAgICAgIGlmIChmZHIuY2F1eCA+IDApCi0JewotCSAgaWYgKCFhZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5hdXgsICZhaW5mby0+YXV4X2VuZCwKLQkJCQkgaW5wdXRfYmZkLAotCQkJCSAoaW5wdXRfc3ltaGRyLT5jYkF1eE9mZnNldAotCQkJCSAgKyBmZHIuaWF1eEJhc2UgKiBzaXplb2YgKHVuaW9uIGF1eF9leHQpKSwKLQkJCQkgZmRyLmNhdXggKiBzaXplb2YgKHVuaW9uIGF1eF9leHQpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZmRyLmlhdXhCYXNlID0gb3V0cHV0X3N5bWhkci0+aWF1eE1heDsKLQkgIG91dHB1dF9zeW1oZHItPmlhdXhNYXggKz0gZmRyLmNhdXg7Ci0JfQotICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQotCSAgLyogV2hlbiBhcmUgYXJlIGhhc2hpbmcgc3RyaW5ncywgd2UgbGllIGFib3V0IHRoZSBudW1iZXIgb2YKLQkgICAgIHN0cmluZ3MgYXR0YWNoZWQgdG8gZWFjaCBGRFIuICBXZSBuZWVkIHRvIHNldCBjYlNzCi0JICAgICBiZWNhdXNlIHNvbWUgdmVyc2lvbnMgb2YgZGJ4IGFwcGFyZW50bHkgdXNlIGl0IHRvIGRlY2lkZQotCSAgICAgaG93IG11Y2ggb2YgdGhlIHN0cmluZyB0YWJsZSB0byByZWFkIGluLiAgKi8KLQkgIGZkci5pc3NCYXNlID0gMDsKLQkgIGZkci5jYlNzID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OwotCX0KLSAgICAgIGVsc2UgaWYgKGZkci5jYlNzID4gMCkKLQl7Ci0JICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnNzLCAmYWluZm8tPnNzX2VuZCwKLQkJCQkgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zeW1oZHItPmNiU3NPZmZzZXQgKyBmZHIuaXNzQmFzZSwKLQkJCQkgZmRyLmNiU3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmZHIuaXNzQmFzZSA9IG91dHB1dF9zeW1oZHItPmlzc01heDsKLQkgIG91dHB1dF9zeW1oZHItPmlzc01heCArPSBmZHIuY2JTczsKLQl9Ci0KLSAgICAgIGlmICgob3V0cHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcgotCSAgID09IGlucHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcikKLQkgICYmIGlucHV0X2RlYnVnLT5hZGp1c3QgPT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQl7Ci0JICAvKiBUaGUgdHdvIEJGRCdzIGhhdmUgdGhlIHNhbWUgZW5kaWFubmVzcywgYW5kIHdlIGRvbid0IGhhdmUKLQkgICAgIHRvIGFkanVzdCB0aGUgUERSIGFkZHJlc3Nlcywgc28gc2ltcGx5IGNvcHlpbmcgdGhlCi0JICAgICBpbmZvcm1hdGlvbiB3aWxsIHN1ZmZpY2UuICAqLwotCSAgQkZEX0FTU0VSVCAoZXh0ZXJuYWxfcGRyX3NpemUgPT0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUpOwotCSAgaWYgKGZkci5jcGQgPiAwKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5wZHIsICZhaW5mby0+cGRyX2VuZCwKLQkJCQkgICAgIGlucHV0X2JmZCwKLQkJCQkgICAgIChpbnB1dF9zeW1oZHItPmNiUGRPZmZzZXQKLQkJCQkgICAgICArIGZkci5pcGRGaXJzdCAqIGV4dGVybmFsX3Bkcl9zaXplKSwKLQkJCQkgICAgIGZkci5jcGQgKiBleHRlcm5hbF9wZHJfc2l6ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgQkZEX0FTU0VSVCAoZXh0ZXJuYWxfb3B0X3NpemUgPT0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOwotCSAgaWYgKGZkci5jb3B0ID4gMCkKLQkgICAgewotCSAgICAgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+b3B0LCAmYWluZm8tPm9wdF9lbmQsCi0JCQkJICAgICBpbnB1dF9iZmQsCi0JCQkJICAgICAoaW5wdXRfc3ltaGRyLT5jYk9wdE9mZnNldAotCQkJCSAgICAgICsgZmRyLmlvcHRCYXNlICogZXh0ZXJuYWxfb3B0X3NpemUpLAotCQkJCSAgICAgZmRyLmNvcHQgKiBleHRlcm5hbF9vcHRfc2l6ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIG91dHN6LCBpbnN6OwotCSAgYmZkX2J5dGUgKmluOwotCSAgYmZkX2J5dGUgKmVuZDsKLQkgIGJmZF9ieXRlICpvdXQ7Ci0KLQkgIC8qIFRoZSB0d28gQkZEJ3MgaGF2ZSBkaWZmZXJlbnQgZW5kaWFubmVzcywgc28gd2UgbXVzdCBzd2FwCi0JICAgICBldmVyeXRoaW5nIGluIGFuZCBvdXQuICBUaGlzIGNvZGUgd291bGQgYWx3YXlzIHdvcmssIGJ1dAotCSAgICAgaXQgd291bGQgYmUgdW5uZWNlc3NhcmlseSBzbG93IGluIHRoZSBub3JtYWwgY2FzZS4gICovCi0JICBvdXRzeiA9IGV4dGVybmFsX3Bkcl9zaXplOwotCSAgaW5zeiA9IGlucHV0X3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotCSAgaW4gPSAoKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5leHRlcm5hbF9wZHIKLQkJKyBmZHIuaXBkRmlyc3QgKiBpbnN6KTsKLQkgIGVuZCA9IGluICsgZmRyLmNwZCAqIGluc3o7Ci0JICBzeiA9IGZkci5jcGQgKiBvdXRzejsKLQkgIG91dCA9IChiZmRfYnl0ZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwgc3opOwotCSAgaWYgKCFvdXQpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5wZHIsICZhaW5mby0+cGRyX2VuZCwgb3V0LAotCQkJCSAgIHN6KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZm9yICg7IGluIDwgZW5kOyBpbiArPSBpbnN6LCBvdXQgKz0gb3V0c3opCi0JICAgIHsKLQkgICAgICBQRFIgcGRyOwotCi0JICAgICAgKCppbnB1dF9zd2FwLT5zd2FwX3Bkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgaW4sICZwZHIpOwotCi0JICAgICAgLyogSWYgd2UgaGF2ZSBiZWVuIHJlbGF4aW5nLCB3ZSBtYXkgaGF2ZSB0byBhZGp1c3QgdGhlCi0JCSBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCQl7Ci0JCSAgYmZkX3ZtYSBhZHI7Ci0JCSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotCi0JCSAgYWRyID0gZmRyX2FkciArIHBkci5hZHI7Ci0JCSAgZm9yIChhZGp1c3QgPSBpbnB1dF9kZWJ1Zy0+YWRqdXN0OwotCQkgICAgICAgYWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEw7Ci0JCSAgICAgICBhZGp1c3QgPSBhZGp1c3QtPm5leHQpCi0JCSAgICBpZiAoYWRyID49IGFkanVzdC0+c3RhcnQKLQkJCSYmIGFkciA8IGFkanVzdC0+ZW5kKQotCQkgICAgICBwZHIuYWRyICs9IGFkanVzdC0+YWRqdXN0OwotCQl9Ci0KLQkgICAgICAoKm91dHB1dF9zd2FwLT5zd2FwX3Bkcl9vdXQpIChvdXRwdXRfYmZkLCAmcGRyLCAoUFRSKSBvdXQpOwotCSAgICB9Ci0KLQkgIC8qIFN3YXAgb3ZlciB0aGUgb3B0aW1pemF0aW9uIGluZm9ybWF0aW9uLiAgKi8KLQkgIG91dHN6ID0gZXh0ZXJuYWxfb3B0X3NpemU7Ci0JICBpbnN6ID0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemU7Ci0JICBpbiA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX29wdAotCQkrIGZkci5pb3B0QmFzZSAqIGluc3opOwotCSAgZW5kID0gaW4gKyBmZHIuY29wdCAqIGluc3o7Ci0JICBzeiA9IGZkci5jb3B0ICogb3V0c3o7Ci0JICBvdXQgPSAoYmZkX2J5dGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksIHN6KTsKLQkgIGlmICghb3V0KQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+b3B0LCAmYWluZm8tPm9wdF9lbmQsIG91dCwKLQkJCQkgICBzeikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGZvciAoOyBpbiA8IGVuZDsgaW4gKz0gaW5zeiwgb3V0ICs9IG91dHN6KQotCSAgICB7Ci0JICAgICAgT1BUUiBvcHQ7Ci0KLQkgICAgICAoKmlucHV0X3N3YXAtPnN3YXBfb3B0X2luKSAoaW5wdXRfYmZkLCAoUFRSKSBpbiwgJm9wdCk7Ci0JICAgICAgKCpvdXRwdXRfc3dhcC0+c3dhcF9vcHRfb3V0KSAob3V0cHV0X2JmZCwgJm9wdCwgKFBUUikgb3V0KTsKLQkgICAgfQotCX0KLQotICAgICAgZmRyLmlwZEZpcnN0ID0gb3V0cHV0X3N5bWhkci0+aXBkTWF4OwotICAgICAgb3V0cHV0X3N5bWhkci0+aXBkTWF4ICs9IGZkci5jcGQ7Ci0gICAgICBmZHIuaW9wdEJhc2UgPSBvdXRwdXRfc3ltaGRyLT5pb3B0TWF4OwotICAgICAgb3V0cHV0X3N5bWhkci0+aW9wdE1heCArPSBmZHIuY29wdDsKLQotICAgICAgaWYgKGZkci5jcmZkIDw9IDApCi0JewotCSAgLyogUG9pbnQgdGhpcyBGRFIgYXQgdGhlIHRhYmxlIG9mIFJGRCdzIHdlIGNyZWF0ZWQuICAqLwotCSAgZmRyLnJmZEJhc2UgPSBuZXdyZmRiYXNlOwotCSAgZmRyLmNyZmQgPSBpbnB1dF9zeW1oZHItPmlmZE1heDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogUG9pbnQgdGhpcyBGRFIgYXQgdGhlIHJlbWFwcGVkIFJGRCdzLiAgKi8KLQkgIGZkci5yZmRCYXNlICs9IG9sZHJmZGJhc2U7Ci0JfQotCi0gICAgICAoKnN3YXBfZmRyX291dCkgKG91dHB1dF9iZmQsICZmZHIsIGZkcl9vdXQpOwotICAgICAgZmRyX291dCArPSBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgICAgICsrb3V0cHV0X3N5bWhkci0+aWZkTWF4OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgc3RyaW5nIHRvIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2UgYXJlIGFjY3VtdWxhdGluZy4KLSAgIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gdGhlIGZkciBzdHJpbmcgYmFzZS4gICovCi0KLXN0YXRpYyBsb25nIGVjb2ZmX2FkZF9zdHJpbmcgUEFSQU1TICgoc3RydWN0IGFjY3VtdWxhdGUgKiwKLQkJCQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICosCi0JCQkJICAgICAgRkRSICpmZHIsIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1zdGF0aWMgbG9uZwotZWNvZmZfYWRkX3N0cmluZyAoYWluZm8sIGluZm8sIGRlYnVnLCBmZHIsIHN0cmluZykKLSAgICAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBGRFIgKmZkcjsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBIRFJSICpzeW1oZHI7Ci0gIHNpemVfdCBsZW47Ci0gIGJmZF9zaXplX3R5cGUgcmV0OwotCi0gIHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBsZW4gPSBzdHJsZW4gKHN0cmluZyk7Ci0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnNzLCAmYWluZm8tPnNzX2VuZCwgKFBUUikgc3RyaW5nLAotCQkJICAgICAgIGxlbiArIDEpKQotCXJldHVybiAtMTsKLSAgICAgIHJldCA9IHN5bWhkci0+aXNzTWF4OwotICAgICAgc3ltaGRyLT5pc3NNYXggKz0gbGVuICsgMTsKLSAgICAgIGZkci0+Y2JTcyArPSBsZW4gKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc2g7Ci0KLSAgICAgIHNoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmYWluZm8tPnN0cl9oYXNoLCBzdHJpbmcsIHRydWUsIHRydWUpOwotICAgICAgaWYgKHNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAoc2gtPnZhbCA9PSAtMSkKLQl7Ci0JICBzaC0+dmFsID0gc3ltaGRyLT5pc3NNYXg7Ci0JICBzeW1oZHItPmlzc01heCArPSBsZW4gKyAxOwotCSAgaWYgKGFpbmZvLT5zc19oYXNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgYWluZm8tPnNzX2hhc2ggPSBzaDsKLQkgIGlmIChhaW5mby0+c3NfaGFzaF9lbmQKLQkgICAgICAhPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGFpbmZvLT5zc19oYXNoX2VuZC0+bmV4dCA9IHNoOwotCSAgYWluZm8tPnNzX2hhc2hfZW5kID0gc2g7Ci0JfQotICAgICAgcmV0ID0gc2gtPnZhbDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWRkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgbm9uLUVDT0ZGIGZpbGUuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlciAoaGFuZGxlLCBvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsCi0JCQkJICBvdXRwdXRfc3dhcCwgaW5wdXRfYmZkLCBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFNZTVIgKiwgUFRSKSkKLSAgICA9IG91dHB1dF9zd2FwLT5zd2FwX3N5bV9vdXQ7Ci0gIEhEUlIgKm91dHB1dF9zeW1oZHIgPSAmb3V0cHV0X2RlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIEZEUiBmZHI7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGFzeW1ib2wgKipzeW1ib2xzOwotICBhc3ltYm9sICoqc3ltX3B0cjsKLSAgYXN5bWJvbCAqKnN5bV9lbmQ7Ci0gIGxvbmcgc3ltc2l6ZTsKLSAgbG9uZyBzeW1jb3VudDsKLSAgUFRSIGV4dGVybmFsX2ZkcjsKLQotICBtZW1zZXQgKChQVFIpICZmZHIsIDAsIHNpemVvZiBmZHIpOwotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIudGV4dCIpOwotICBpZiAoc2VjICE9IE5VTEwpCi0gICAgZmRyLmFkciA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBXaGF0IGFib3V0IC5pbml0IG9yIC5maW5pPyAgKi8KLSAgICAgIGZkci5hZHIgPSAwOwotICAgIH0KLQotICBmZHIuaXNzQmFzZSA9IG91dHB1dF9zeW1oZHItPmlzc01heDsKLSAgZmRyLmNiU3MgPSAwOwotICBmZHIucnNzID0gZWNvZmZfYWRkX3N0cmluZyAoYWluZm8sIGluZm8sIG91dHB1dF9kZWJ1ZywgJmZkciwKLQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotICBpZiAoZmRyLnJzcyA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZkci5pc3ltQmFzZSA9IG91dHB1dF9zeW1oZHItPmlzeW1NYXg7Ci0KLSAgLyogR2V0IHRoZSBsb2NhbCBzeW1ib2xzIGZyb20gdGhlIGlucHV0IEJGRC4gICovCi0gIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoaW5wdXRfYmZkKTsKLSAgaWYgKHN5bXNpemUgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHN5bXNpemUpOwotICBpZiAoc3ltYm9scyA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGlucHV0X2JmZCwgc3ltYm9scyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1fZW5kID0gc3ltYm9scyArIHN5bWNvdW50OwotCi0gIC8qIEhhbmRsZSB0aGUgbG9jYWwgc3ltYm9scy4gIEFueSBleHRlcm5hbCBzeW1ib2xzIGFyZSBoYW5kbGVkCi0gICAgIHNlcGFyYXRlbHkuICAqLwotICBmZHIuY3N5bSA9IDA7Ci0gIGZvciAoc3ltX3B0ciA9IHN5bWJvbHM7IHN5bV9wdHIgIT0gc3ltX2VuZDsgc3ltX3B0cisrKQotICAgIHsKLSAgICAgIFNZTVIgaW50ZXJuYWxfc3ltOwotICAgICAgUFRSIGV4dGVybmFsX3N5bTsKLQotICAgICAgaWYgKCgoKnN5bV9wdHIpLT5mbGFncyAmIEJTRl9FWFBPUlQpICE9IDApCi0JY29udGludWU7Ci0gICAgICBtZW1zZXQgKChQVFIpICZpbnRlcm5hbF9zeW0sIDAsIHNpemVvZiBpbnRlcm5hbF9zeW0pOwotICAgICAgaW50ZXJuYWxfc3ltLmlzcyA9IGVjb2ZmX2FkZF9zdHJpbmcgKGFpbmZvLCBpbmZvLCBvdXRwdXRfZGVidWcsICZmZHIsCi0JCQkJCSAgICgqc3ltX3B0ciktPm5hbWUpOwotCi0gICAgICBpZiAoaW50ZXJuYWxfc3ltLmlzcyA9PSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uICgoKnN5bV9wdHIpLT5zZWN0aW9uKQotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uICgoKnN5bV9wdHIpLT5zZWN0aW9uKSkKLQlpbnRlcm5hbF9zeW0udmFsdWUgPSAoKnN5bV9wdHIpLT52YWx1ZTsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9zeW0udmFsdWUgPSAoKCpzeW1fcHRyKS0+dmFsdWUKLQkJCSAgICAgICsgKCpzeW1fcHRyKS0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgKyAoKnN5bV9wdHIpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIGludGVybmFsX3N5bS5zdCA9IHN0TmlsOwotICAgICAgaW50ZXJuYWxfc3ltLnNjID0gc2NVbmRlZmluZWQ7Ci0gICAgICBpbnRlcm5hbF9zeW0uaW5kZXggPSBpbmRleE5pbDsKLQotICAgICAgZXh0ZXJuYWxfc3ltID0gKFBUUikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJCSAgIG91dHB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICBpZiAoIWV4dGVybmFsX3N5bSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAoKnN3YXBfc3ltX291dCkgKG91dHB1dF9iZmQsICZpbnRlcm5hbF9zeW0sIGV4dGVybmFsX3N5bSk7Ci0gICAgICBhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnN5bSwgJmFpbmZvLT5zeW1fZW5kLAotCQkJICBleHRlcm5hbF9zeW0sIG91dHB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICArK2Zkci5jc3ltOwotICAgICAgKytvdXRwdXRfc3ltaGRyLT5pc3ltTWF4OwotICAgIH0KLQotICBiZmRfcmVsZWFzZSAob3V0cHV0X2JmZCwgKFBUUikgc3ltYm9scyk7Ci0KLSAgLyogTGVhdmUgZXZlcnl0aGluZyBlbHNlIGluIHRoZSBGRFIgemVyb2VkIG91dC4gIFRoaXMgd2lsbCBjYXVzZQotICAgICB0aGUgbGFuZyBmaWVsZCB0byBiZSBsYW5nQy4gIFRoZSBmQmlnZW5kaWFuIGZpZWxkIHdpbGwKLSAgICAgaW5kaWNhdGUgbGl0dGxlIGVuZGlhbiBmb3JtYXQsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBiZWNhdXNlCi0gICAgIGl0IG9ubHkgYXBwbGllcyB0byBhdXggZmllbGRzIGFuZCB0aGVyZSBhcmUgbm9uZS4gICovCi0gIGV4dGVybmFsX2ZkciA9IChQVFIpIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LAotCQkJCSAgICAgICBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotICBpZiAoIWV4dGVybmFsX2ZkcikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICgqb3V0cHV0X3N3YXAtPnN3YXBfZmRyX291dCkgKG91dHB1dF9iZmQsICZmZHIsIGV4dGVybmFsX2Zkcik7Ci0gIGFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+ZmRyLCAmYWluZm8tPmZkcl9lbmQsCi0JCSAgICAgIGV4dGVybmFsX2Zkciwgb3V0cHV0X3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLQotICArK291dHB1dF9zeW1oZHItPmlmZE1heDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHVwIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGV4dGVybmFsIHN5bWJvbHMuCi0gICBGSVhNRTogVGhpcyBpcyBkb25lIHVzaW5nIGEgbWVtb3J5IGJ1ZmZlciwgYnV0IGl0IHNob3VsZCBiZQotICAgcHJvYmFibHkgYmUgY2hhbmdlZCB0byB1c2UgYSBzaHVmZmxlIHN0cnVjdHVyZS4gIFRoZSBhc3NlbWJsZXIgdXNlcwotICAgdGhpcyBpbnRlcmZhY2UsIHNvIHRoYXQgbXVzdCBiZSBjaGFuZ2VkIHRvIGRvIHNvbWV0aGluZyBlbHNlLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyAoYWJmZCwgZGVidWcsIHN3YXAsIHJlbG9jYXRlYWJsZSwgZ2V0X2V4dHIsCi0JCQkgICBzZXRfaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGJvb2xlYW4gKCpnZXRfZXh0cikgUEFSQU1TICgoYXN5bWJvbCAqLCBFWFRSICopKTsKLSAgICAgdm9pZCAoKnNldF9pbmRleCkgUEFSQU1TICgoYXN5bWJvbCAqLCBiZmRfc2l6ZV90eXBlKSk7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOwotICBzaXplX3QgYzsKLQotICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGlmIChzeW1fcHRyX3B0ciA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAoYyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOyBjID4gMDsgYy0tLCBzeW1fcHRyX3B0cisrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bV9wdHI7Ci0gICAgICBFWFRSIGVzeW07Ci0KLSAgICAgIHN5bV9wdHIgPSAqc3ltX3B0cl9wdHI7Ci0KLSAgICAgIC8qIEdldCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmICgoKmdldF9leHRyKSAoc3ltX3B0ciwgJmVzeW0pID09IGZhbHNlKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSdyZSBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSwgbW92ZSBjb21tb24gc3ltYm9scyBpbnRvCi0JIGJzcy4gICovCi0gICAgICBpZiAocmVsb2NhdGVhYmxlID09IGZhbHNlKQotCXsKLQkgIGlmIChlc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCi0JICAgIGVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgZWxzZSBpZiAoZXN5bS5hc3ltLnNjID09IHNjU0NvbW1vbikKLQkgICAgZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCX0KLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltX3B0ci0+c2VjdGlvbikKLQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltX3B0ci0+c2VjdGlvbikKLQkgIHx8IHN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIC8qIEZJWE1FOiBnYXMgZG9lcyBub3Qga2VlcCB0aGUgdmFsdWUgb2YgYSBzbWFsbCB1bmRlZmluZWQKLQkgICAgIHN5bWJvbCBpbiB0aGUgc3ltYm9sIGl0c2VsZiwgYmVjYXVzZSBvZiByZWxvY2F0aW9uCi0JICAgICBwcm9ibGVtcy4gICovCi0JICBpZiAoZXN5bS5hc3ltLnNjICE9IHNjU1VuZGVmaW5lZAotCSAgICAgIHx8IGVzeW0uYXN5bS52YWx1ZSA9PSAwCi0JICAgICAgfHwgc3ltX3B0ci0+dmFsdWUgIT0gMCkKLQkgICAgZXN5bS5hc3ltLnZhbHVlID0gc3ltX3B0ci0+dmFsdWU7Ci0JfQotICAgICAgZWxzZQotCWVzeW0uYXN5bS52YWx1ZSA9IChzeW1fcHRyLT52YWx1ZQotCQkJICAgKyBzeW1fcHRyLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIHN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0gICAgICBpZiAoc2V0X2luZGV4KQotCSgqc2V0X2luZGV4KSAoc3ltX3B0ciwgKGJmZF9zaXplX3R5cGUpIHN5bWhkci0+aWV4dE1heCk7Ci0KLSAgICAgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsIGRlYnVnLCBzd2FwLAotCQkJCQkgIHN5bV9wdHItPm5hbWUsICZlc3ltKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBzaW5nbGUgZXh0ZXJuYWwgc3ltYm9sIHRvIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChhYmZkLCBkZWJ1Zywgc3dhcCwgbmFtZSwgZXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFWFRSICplc3ltOwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplID0gc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9leHRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRVhUUiAqLCBQVFIpKQotICAgID0gc3dhcC0+c3dhcF9leHRfb3V0OwotICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIHNpemVfdCBuYW1lbGVuOwotCi0gIG5hbWVsZW4gPSBzdHJsZW4gKG5hbWUpOwotCi0gIGlmICgoc2l6ZV90KSAoZGVidWctPnNzZXh0X2VuZCAtIGRlYnVnLT5zc2V4dCkKLSAgICAgIDwgc3ltaGRyLT5pc3NFeHRNYXggKyBuYW1lbGVuICsgMSkKLSAgICB7Ci0gICAgICBpZiAoZWNvZmZfYWRkX2J5dGVzICgoY2hhciAqKikgJmRlYnVnLT5zc2V4dCwKLQkJCSAgIChjaGFyICoqKSAmZGVidWctPnNzZXh0X2VuZCwKLQkJCSAgIHN5bWhkci0+aXNzRXh0TWF4ICsgbmFtZWxlbiArIDEpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKHNpemVfdCkgKChjaGFyICopIGRlYnVnLT5leHRlcm5hbF9leHRfZW5kCi0JCS0gKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dCkKLSAgICAgIDwgKHN5bWhkci0+aWV4dE1heCArIDEpICogZXh0ZXJuYWxfZXh0X3NpemUpCi0gICAgewotICAgICAgaWYgKGVjb2ZmX2FkZF9ieXRlcyAoKGNoYXIgKiopICZkZWJ1Zy0+ZXh0ZXJuYWxfZXh0LAotCQkJICAgKGNoYXIgKiopICZkZWJ1Zy0+ZXh0ZXJuYWxfZXh0X2VuZCwKLQkJCSAgIChzeW1oZHItPmlleHRNYXggKyAxKSAqIGV4dGVybmFsX2V4dF9zaXplKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlc3ltLT5hc3ltLmlzcyA9IHN5bWhkci0+aXNzRXh0TWF4OwotCi0gICgqc3dhcF9leHRfb3V0KSAoYWJmZCwgZXN5bSwKLQkJICAgKChjaGFyICopIGRlYnVnLT5leHRlcm5hbF9leHQKLQkJICAgICsgc3ltaGRyLT5pZXh0TWF4ICogc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKLQotICArK3N5bWhkci0+aWV4dE1heDsKLQotICBzdHJjcHkgKGRlYnVnLT5zc2V4dCArIHN5bWhkci0+aXNzRXh0TWF4LCBuYW1lKTsKLSAgc3ltaGRyLT5pc3NFeHRNYXggKz0gbmFtZWxlbiArIDE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFsaWduIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1lY29mZl9hbGlnbl9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBiZmRfc2l6ZV90eXBlIGRlYnVnX2FsaWduLCBhdXhfYWxpZ24sIHJmZF9hbGlnbjsKLSAgc2l6ZV90IGFkZDsKLQotICAvKiBBZGp1c3QgdGhlIGNvdW50cyBzbyB0aGF0IHN0cnVjdHVyZXMgYXJlIGFsaWduZWQuICAqLwotICBkZWJ1Z19hbGlnbiA9IHN3YXAtPmRlYnVnX2FsaWduOwotICBhdXhfYWxpZ24gPSBkZWJ1Z19hbGlnbiAvIHNpemVvZiAodW5pb24gYXV4X2V4dCk7Ci0gIHJmZF9hbGlnbiA9IGRlYnVnX2FsaWduIC8gc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemU7Ci0KLSAgYWRkID0gZGVidWdfYWxpZ24gLSAoc3ltaGRyLT5jYkxpbmUgJiAoZGVidWdfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gZGVidWdfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5saW5lICE9ICh1bnNpZ25lZCBjaGFyICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPmxpbmUgKyBzeW1oZHItPmNiTGluZSksIDAsIGFkZCk7Ci0gICAgICBzeW1oZHItPmNiTGluZSArPSBhZGQ7Ci0gICAgfQotCi0gIGFkZCA9IGRlYnVnX2FsaWduIC0gKHN5bWhkci0+aXNzTWF4ICYgKGRlYnVnX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGRlYnVnX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+c3MgIT0gKGNoYXIgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+c3MgKyBzeW1oZHItPmlzc01heCksIDAsIGFkZCk7Ci0gICAgICBzeW1oZHItPmlzc01heCArPSBhZGQ7Ci0gICAgfQotCi0gIGFkZCA9IGRlYnVnX2FsaWduIC0gKHN5bWhkci0+aXNzRXh0TWF4ICYgKGRlYnVnX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGRlYnVnX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+c3NleHQgIT0gKGNoYXIgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+c3NleHQgKyBzeW1oZHItPmlzc0V4dE1heCksIDAsIGFkZCk7Ci0gICAgICBzeW1oZHItPmlzc0V4dE1heCArPSBhZGQ7Ci0gICAgfQotCi0gIGFkZCA9IGF1eF9hbGlnbiAtIChzeW1oZHItPmlhdXhNYXggJiAoYXV4X2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGF1eF9hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSAodW5pb24gYXV4X2V4dCAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5leHRlcm5hbF9hdXggKyBzeW1oZHItPmlhdXhNYXgpLCAwLAotCQlhZGQgKiBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgICAgIHN5bWhkci0+aWF1eE1heCArPSBhZGQ7Ci0gICAgfQotCi0gIGFkZCA9IHJmZF9hbGlnbiAtIChzeW1oZHItPmNyZmQgJiAocmZkX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IHJmZF9hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSAoUFRSKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKChjaGFyICopIGRlYnVnLT5leHRlcm5hbF9yZmQKLQkJICAgICAgICsgc3ltaGRyLT5jcmZkICogc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpLAotCQkwLCAoc2l6ZV90KSAoYWRkICogc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpKTsKLSAgICAgIHN5bWhkci0+Y3JmZCArPSBhZGQ7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIHNpemUgcmVxdWlyZWQgYnkgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWJmZF9zaXplX3R5cGUKLWJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCBkZWJ1Zywgc3dhcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotewotICBiZmRfc2l6ZV90eXBlIHRvdDsKLQotICBlY29mZl9hbGlnbl9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXApOwotICB0b3QgPSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZTsKLQotI2RlZmluZSBBREQoY291bnQsIHNpemUpIFwKLSAgdG90ICs9IGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuY291bnQgKiBzaXplCi0KLSAgQUREIChjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotICBBREQgKGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUpOwotICBBREQgKGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUpOwotICBBREQgKGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgQUREIChpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIEFERCAoaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gIEFERCAoaXNzTWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgQUREIChpc3NFeHRNYXgsIHNpemVvZiAoY2hhcikpOwotICBBREQgKGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotICBBREQgKGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKTsKLSAgQUREIChpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0KLSN1bmRlZiBBREQKLQotICByZXR1cm4gdG90OwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIEVDT0ZGIHN5bWJvbGljIGhlYWRlciwgZ2l2ZW4gdGhlIGZpbGUgcG9zaXRpb24gaXQgaXMKLSAgIGdvaW5nIHRvIGJlIHBsYWNlZCBhdC4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjb3VudHMgYXJlIHNldAotICAgY29ycmVjdGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3dyaXRlX3N5bWhkciAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotewotICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGNoYXIgKmJ1ZmYgPSBOVUxMOwotCi0gIGVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCk7Ci0KLSAgLyogR28gdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGluIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCB3aGVyZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdoZXJlICs9IHN3YXAtPmV4dGVybmFsX2hkcl9zaXplOwotCi0gIHN5bWhkci0+bWFnaWMgPSBzd2FwLT5zeW1fbWFnaWM7Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlsZSBvZmZzZXRzLiAgKi8KLSNkZWZpbmUgU0VUKG9mZnNldCwgY291bnQsIHNpemUpIFwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkgXAotICAgIHN5bWhkci0+b2Zmc2V0ID0gMDsgXAotICBlbHNlIFwKLSAgICB7IFwKLSAgICAgIHN5bWhkci0+b2Zmc2V0ID0gd2hlcmU7IFwKLSAgICAgIHdoZXJlICs9IHN5bWhkci0+Y291bnQgKiBzaXplOyBcCi0gICAgfQotCi0gIFNFVCAoY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotICBTRVQgKGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUpOwotICBTRVQgKGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUpOwotICBTRVQgKGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gIFNFVCAoY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplKTsKLSAgU0VUIChjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gIFNFVCAoY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhcikpOwotICBTRVQgKGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotICBTRVQgKGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSk7Ci0gIFNFVCAoY2JFeHRPZmZzZXQsIGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLSN1bmRlZiBTRVQKLQotICBidWZmID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpOwotICBpZiAoYnVmZiA9PSBOVUxMICYmIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgKCpzd2FwLT5zd2FwX2hkcl9vdXQpIChhYmZkLCBzeW1oZHIsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSwgYWJmZCkKLSAgICAgICE9IHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgZnVuY3Rpb24gYXNzdW1lcwotICAgdGhhdCB0aGUgaW5mb3JtYXRpb24gKHRoZSBwb2ludGVycyBhbmQgY291bnRzKSBpbiAqREVCVUcgaGF2ZSBiZWVuCi0gICBzZXQgY29ycmVjdGx5LiAgV0hFUkUgaXMgdGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIHRvIHdyaXRlIHRoZQotICAgaW5mb3JtYXRpb24gdG8uICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIHRoZSBmaWxlIG9mZnNldHMgaW4gdGhlCi0gICBzeW1ib2xpYyBoZWFkZXIuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfd3JpdGVfZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3N5bWhkciAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNkZWZpbmUgV1JJVEUocHRyLCBjb3VudCwgc2l6ZSwgb2Zmc2V0KSBcCi0gIEJGRF9BU1NFUlQgKHN5bWhkci0+b2Zmc2V0ID09IDAgXAotCSAgICAgIHx8IChiZmRfdm1hKSBiZmRfdGVsbCAoYWJmZCkgPT0gc3ltaGRyLT5vZmZzZXQpOyBcCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsIGFiZmQpIFwKLSAgICAgICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSBcCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFdSSVRFIChsaW5lLCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksIGNiTGluZU9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9kbnIsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIGNiRG5PZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfcGRyLCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBjYlBkT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX3N5bSwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIGNiU3ltT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX29wdCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUsIGNiT3B0T2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX2F1eCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwgY2JBdXhPZmZzZXQpOwotICBXUklURSAoc3MsIGlzc01heCwgc2l6ZW9mIChjaGFyKSwgY2JTc09mZnNldCk7Ci0gIFdSSVRFIChzc2V4dCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpLCBjYlNzRXh0T2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX2ZkciwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSwgY2JGZE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9yZmQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplLCBjYlJmZE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9leHQsIGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLCBjYkV4dE9mZnNldCk7Ci0jdW5kZWYgV1JJVEUKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc2h1ZmZsZSBsaXN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWNvZmZfd3JpdGVfc2h1ZmZsZSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICosCi0JCQkJCSAgICBzdHJ1Y3Qgc2h1ZmZsZSAqLCBQVFIgc3BhY2UpKTsKLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIHNodWZmbGUsIHNwYWNlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqc2h1ZmZsZTsKLSAgICAgUFRSIHNwYWNlOwotewotICByZWdpc3RlciBzdHJ1Y3Qgc2h1ZmZsZSAqbDsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLQotICB0b3RhbCA9IDA7Ci0gIGZvciAobCA9IHNodWZmbGU7IGwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGwtPmZpbGVwKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKGwtPnUubWVtb3J5LCAxLCBsLT5zaXplLCBhYmZkKSAhPSBsLT5zaXplKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChiZmRfc2VlayAobC0+dS5maWxlLmlucHV0X2JmZCwgbC0+dS5maWxlLm9mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoc3BhY2UsIDEsIGwtPnNpemUsIGwtPnUuZmlsZS5pbnB1dF9iZmQpICE9IGwtPnNpemUKLQkgICAgICB8fCBiZmRfd3JpdGUgKHNwYWNlLCAxLCBsLT5zaXplLCBhYmZkKSAhPSBsLT5zaXplKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgdG90YWwgKz0gbC0+c2l6ZTsKLSAgICB9Ci0KLSAgaWYgKCh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgYmZkX2J5dGUgKnM7Ci0KLSAgICAgIGkgPSBzd2FwLT5kZWJ1Z19hbGlnbiAtICh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKTsKLSAgICAgIHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaSk7Ci0gICAgICBpZiAocyA9PSBOVUxMICYmIGkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG1lbXNldCAoKFBUUikgcywgMCwgaSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLCAxLCBpLCBhYmZkKSAhPSBpKQotCXsKLQkgIGZyZWUgKHMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGZyZWUgKHMpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB1c2luZyBhY2N1bXVsYXRlZCBsaW5rZXIKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChoYW5kbGUsIGFiZmQsIGRlYnVnLCBzd2FwLCBpbmZvLCB3aGVyZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZmlsZV9wdHIgd2hlcmU7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIFBUUiBzcGFjZSA9IE5VTEw7Ci0KLSAgaWYgKCEgZWNvZmZfd3JpdGVfc3ltaGRyIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNwYWNlID0gKFBUUikgYmZkX21hbGxvYyAoYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlKTsKLSAgaWYgKHNwYWNlID09IE5VTEwgJiYgYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPmxpbmUsIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+cGRyLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnN5bSwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5vcHQsIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+YXV4LCBzcGFjZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBpcyB3cml0dGVuIG91dCBmcm9tIHRoZSBoYXNoIHRhYmxlIGlmIHRoaXMgaXMgYQotICAgICBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChhaW5mby0+c3NfaGFzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpOwotICAgICAgaWYgKCEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnNzLCBzcGFjZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLSAgICAgIGJmZF9ieXRlIG51bGw7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOwotCi0gICAgICBCRkRfQVNTRVJUIChhaW5mby0+c3MgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpOwotICAgICAgbnVsbCA9IDA7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmbnVsbCwgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHRvdGFsID0gMTsKLSAgICAgIEJGRF9BU1NFUlQgKGFpbmZvLT5zc19oYXNoID09IE5VTEwgfHwgYWluZm8tPnNzX2hhc2gtPnZhbCA9PSAxKTsKLSAgICAgIGZvciAoc2ggPSBhaW5mby0+c3NfaGFzaDsKLQkgICBzaCAhPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEw7Ci0JICAgc2ggPSBzaC0+bmV4dCkKLQl7Ci0JICBzaXplX3QgbGVuOwotCi0JICBsZW4gPSBzdHJsZW4gKHNoLT5yb290LnN0cmluZyk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzaC0+cm9vdC5zdHJpbmcsIDEsIGxlbiArIDEsIGFiZmQpICE9IGxlbiArIDEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgdG90YWwgKz0gbGVuICsgMTsKLQl9Ci0KLSAgICAgIGlmICgodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQkgIGJmZF9ieXRlICpzOwotCi0JICBpID0gc3dhcC0+ZGVidWdfYWxpZ24gLSAodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSk7Ci0JICBzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGkpOwotCSAgaWYgKHMgPT0gTlVMTCAmJiBpICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbWVtc2V0ICgoUFRSKSBzLCAwLCBpKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMsIDEsIGksIGFiZmQpICE9IGkpCi0JICAgIHsKLQkgICAgICBmcmVlIChzKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZnJlZSAocyk7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgZXh0ZXJuYWwgc3RyaW5ncyBhbmQgc3ltYm9sIGFyZSBub3QgY29udmVydGVkIG92ZXIgdG8gdXNpbmcKLSAgICAgc2h1ZmZsZXMuICBGSVhNRTogVGhleSBwcm9iYWJseSBzaG91bGQgYmUuICAqLwotICBpZiAoYmZkX3dyaXRlIChkZWJ1Zy0+c3NleHQsIDEsIGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzRXh0TWF4LCBhYmZkKQotICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzRXh0TWF4KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzRXh0TWF4ICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBiZmRfYnl0ZSAqczsKLQotICAgICAgaSA9IChzd2FwLT5kZWJ1Z19hbGlnbgotCSAgIC0gKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzRXh0TWF4ICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpKTsKLSAgICAgIHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaSk7Ci0gICAgICBpZiAocyA9PSBOVUxMICYmIGkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG1lbXNldCAoKFBUUikgcywgMCwgaSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLCAxLCBpLCBhYmZkKSAhPSBpKQotCXsKLQkgIGZyZWUgKHMpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgICAgZnJlZSAocyk7Ci0gICAgfQotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5mZHIsIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+cmZkLCBzcGFjZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgQkZEX0FTU0VSVCAoZGVidWctPnN5bWJvbGljX2hlYWRlci5jYkV4dE9mZnNldCA9PSAwCi0JICAgICAgfHwgKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuY2JFeHRPZmZzZXQKLQkJICA9PSAoYmZkX3ZtYSkgYmZkX3RlbGwgKGFiZmQpKSk7Ci0KLSAgaWYgKGJmZF93cml0ZSAoZGVidWctPmV4dGVybmFsX2V4dCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsCi0JCSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlleHRNYXgsIGFiZmQpCi0gICAgICAhPSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlleHRNYXggKiBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoc3BhY2UgIT0gTlVMTCkKLSAgICBmcmVlIChzcGFjZSk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3BhY2UgIT0gTlVMTCkKLSAgICBmcmVlIChzcGFjZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEhhbmRsZSB0aGUgZmluZF9uZWFyZXN0X2xpbmUgZnVuY3Rpb24gZm9yIGJvdGggRUNPRkYgYW5kIE1JUFMgRUxGCi0gICBmaWxlcy4gICovCi0KLS8qIENvbXBhcmUgRkRSIGVudHJpZXMuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBfZmRydGFiX2VudHJ5IChsZWZ0cCwgcmlnaHRwKQotICAgICBjb25zdCBQVFIgbGVmdHA7Ci0gICAgIGNvbnN0IFBUUiByaWdodHA7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKmxwID0KLSAgICAoY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqKSBsZWZ0cDsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqcnAgPQotICAgIChjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICopIHJpZ2h0cDsKLQotICBpZiAobHAtPmJhc2VfYWRkciA8IHJwLT5iYXNlX2FkZHIpCi0gICAgcmV0dXJuIC0xOwotICBpZiAobHAtPmJhc2VfYWRkciA+IHJwLT5iYXNlX2FkZHIpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBFYWNoIGZpbGUgZGVzY3JpcHRvciAoRkRSKSBoYXMgYSBtZW1vcnkgYWRkcmVzcywgdG8gc2ltcGxpZnkKLSAgIGxvb2tpbmcgdXAgYW4gRkRSIGJ5IGFkZHJlc3MsIHdlIGJ1aWxkIGEgdGFibGUgY292ZXJpbmcgYWxsIEZEUnMKLSAgIHRoYXQgaGF2ZSBhIGxlYXN0IG9uZSBwcm9jZWR1cmUgZGVzY3JpcHRvciBpbiB0aGVtLiAgVGhlIGZpbmFsCi0gICB0YWJsZSB3aWxsIGJlIHNvcnRlZCBieSBhZGRyZXNzIHNvIHdlIGNhbiBsb29rIGl0IHVwIHZpYSBiaW5hcnkKLSAgIHNlYXJjaC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ta19mZHJ0YWIgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcDsKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotewotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICp0YWI7Ci0gIEZEUiAqZmRyX3B0cjsKLSAgRkRSICpmZHJfc3RhcnQ7Ci0gIEZEUiAqZmRyX2VuZDsKLSAgYm9vbGVhbiBzdGFiczsKLSAgbG9uZyBsZW47Ci0KLSAgZmRyX3N0YXJ0ID0gZGVidWdfaW5mby0+ZmRyOwotICBmZHJfZW5kID0gZmRyX3N0YXJ0ICsgZGVidWdfaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heDsKLQotICAvKiBGaXJzdCwgbGV0J3Mgc2VlIGhvdyBsb25nIHRoZSB0YWJsZSBuZWVkcyB0byBiZTogKi8KLSAgZm9yIChsZW4gPSAwLCBmZHJfcHRyID0gZmRyX3N0YXJ0OyBmZHJfcHRyIDwgZmRyX2VuZDsgZmRyX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChmZHJfcHRyLT5jcGQgPT0gMCkJLyogc2tpcCBGRFJzIHRoYXQgaGF2ZSBubyBQRFJzICovCi0JY29udGludWU7Ci0gICAgICArK2xlbjsKLSAgICB9Ci0KLSAgLyogTm93LCBjcmVhdGUgYW5kIGZpbGwgaW4gdGhlIHRhYmxlOiAqLwotCi0gIGxpbmVfaW5mby0+ZmRydGFiID0gKChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KikKLQkJICAgICAgIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJICAgbGVuICogc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KSkpOwotICBpZiAobGluZV9pbmZvLT5mZHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGxpbmVfaW5mby0+ZmRydGFiX2xlbiA9IGxlbjsKLQotICB0YWIgPSBsaW5lX2luZm8tPmZkcnRhYjsKLSAgZm9yIChmZHJfcHRyID0gZmRyX3N0YXJ0OyBmZHJfcHRyIDwgZmRyX2VuZDsgZmRyX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChmZHJfcHRyLT5jcGQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGZpbGUgaGFzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluCi0JIGEgZmlsZSB3aXRoIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlIHNlY29uZCBsb2NhbAotCSBzeW1ib2wgaXMgbmFtZWQgQHN0YWJzLiAgKi8KLSAgICAgIHN0YWJzID0gZmFsc2U7Ci0gICAgICBpZiAoZmRyX3B0ci0+Y3N5bSA+PSAyKQotCXsKLQkgIGNoYXIgKnN5bV9wdHI7Ci0JICBTWU1SIHN5bTsKLQotCSAgc3ltX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJICAgICArIChmZHJfcHRyLT5pc3ltQmFzZSArIDEpKmRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBzeW1fcHRyLCAmc3ltKTsKLQkgIGlmIChzdHJjbXAgKGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3MsCi0JCSAgICAgIFNUQUJTX1NZTUJPTCkgPT0gMCkKLQkgICAgc3RhYnMgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKCFzdGFicykKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplOwotCSAgY2hhciAqcGRyX3B0cjsKLQkgIFBEUiBwZHI7Ci0KLQkgIGV4dGVybmFsX3Bkcl9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLQkgIHBkcl9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfcGRyCi0JCSAgICAgKyBmZHJfcHRyLT5pcGRGaXJzdCAqIGV4dGVybmFsX3Bkcl9zaXplKTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKTsKLQkgIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBQRFIgaXMgdGhlIG9mZnNldCBvZiB0aGF0Ci0JICAgICBwcm9jZWR1cmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBmaWxlIEZEUi4gICovCi0JICB0YWItPmJhc2VfYWRkciA9IGZkcl9wdHItPmFkciAtIHBkci5hZHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFhYWCBJIGRvbid0IGtub3cgYWJvdXQgc3RhYnMsIHNvIHRoaXMgaXMgYSBndWVzcwotCSAgICAgKGRhdmlkbUBjcy5hcml6b25hLmVkdSk6ICovCi0JICB0YWItPmJhc2VfYWRkciA9IGZkcl9wdHItPmFkcjsKLQl9Ci0gICAgICB0YWItPmZkciA9IGZkcl9wdHI7Ci0gICAgICArK3RhYjsKLSAgICB9Ci0KLSAgLyogRmluYWxseSwgdGhlIHRhYmxlIGlzIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG1lbW9yeS1hZGRyZXNzIG9yZGVyLgotICAgICBUaGUgdGFibGUgaXMgbW9zdGx5IHNvcnRlZCBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGNhc2VzIChlLmcuLAotICAgICBzdGF0aWMgZnVuY3Rpb25zIGluIGluY2x1ZGUgZmlsZXMpLCB3aGVyZSB0aGlzIGRvZXMgbm90IGhvbGQuCi0gICAgIFVzZSAib2R1bXAgLVBGdiIgdG8gdmVyaWZ5Li4uICAqLwotICBxc29ydCAoKFBUUikgbGluZV9pbmZvLT5mZHJ0YWIsIGxlbiwKLQkgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KSwgY21wX2ZkcnRhYl9lbnRyeSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiBpbmRleCBvZiBmaXJzdCBGRFIgdGhhdCBjb3ZlcnMgdG8gT0ZGU0VULiAgKi8KLQotc3RhdGljIGxvbmcKLWZkcnRhYl9sb29rdXAgKGxpbmVfaW5mbywgb2Zmc2V0KQotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotewotICBsb25nIGxvdywgaGlnaCwgbGVuOwotICBsb25nIG1pZCA9IC0xOwotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICp0YWI7Ci0KLSAgbGVuID0gbGluZV9pbmZvLT5mZHJ0YWJfbGVuOwotICBpZiAobGVuID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHRhYiA9IGxpbmVfaW5mby0+ZmRydGFiOwotICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBsZW4gLSAxIDsgbG93ICE9IGhpZ2ggOykKLSAgICB7Ci0gICAgICBtaWQgPSAoaGlnaCArIGxvdykgLyAyOwotICAgICAgaWYgKG9mZnNldCA+PSB0YWJbbWlkXS5iYXNlX2FkZHIgJiYgb2Zmc2V0IDwgdGFiW21pZCArIDFdLmJhc2VfYWRkcikKLQlnb3RvIGZpbmRfbWluOwotCi0gICAgICBpZiAodGFiW21pZF0uYmFzZV9hZGRyID4gb2Zmc2V0KQotCWhpZ2ggPSBtaWQ7Ci0gICAgICBlbHNlCi0JbG93ID0gbWlkICsgMTsKLSAgICB9Ci0gICsrbWlkOwotCi0gIC8qIGxhc3QgZW50cnkgaXMgY2F0Y2gtYWxsIGZvciBhbGwgaGlnaGVyIGFkZHJlc3NlczogKi8KLSAgaWYgKG9mZnNldCA8IHRhYlttaWRdLmJhc2VfYWRkcikKLSAgICByZXR1cm4gLTE7Ci0KLSBmaW5kX21pbjoKLQotICB3aGlsZSAobWlkID4gMCAmJiB0YWJbbWlkIC0gMV0uYmFzZV9hZGRyID09IHRhYlttaWRdLmJhc2VfYWRkcikKLSAgICAtLW1pZDsKLQotICByZXR1cm4gbWlkOwotfQotCi0vKiBMb29rIHVwIGEgbGluZSBnaXZlbiBhbiBhZGRyZXNzLCBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBpbgotICAgTElORV9JTkZPLT5jYWNoZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1sb29rdXBfbGluZSAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwOwotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci17Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnRhYjsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJvb2xlYW4gc3RhYnM7Ci0gIEZEUiAqZmRyX3B0cjsKLSAgaW50IGk7Ci0gIAotICBvZmZzZXQgPSBsaW5lX2luZm8tPmNhY2hlLnN0YXJ0OwotICAgICAKLSAgLyogQnVpbGQgRkRSIHRhYmxlIChzb3J0ZWQgYnkgb2JqZWN0IGZpbGUncyBiYXNlLWFkZHJlc3MpIGlmIHdlCi0gICAgIGRvbid0IGhhdmUgaXQgYWxyZWFkeS4gICovCi0gIGlmIChsaW5lX2luZm8tPmZkcnRhYiA9PSBOVUxMCi0gICAgICAmJiAhbWtfZmRydGFiIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0YWIgPSBsaW5lX2luZm8tPmZkcnRhYjsKLQotICAvKiBmaW5kIGZpcnN0IEZEUiBmb3IgYWRkcmVzcyBPRkZTRVQgKi8KLSAgaSA9IGZkcnRhYl9sb29rdXAgKGxpbmVfaW5mbywgb2Zmc2V0KTsKLSAgaWYgKGkgPCAwKQotICAgIHJldHVybiBmYWxzZTsJCS8qIG5vIEZEUiwgbm8gZnVuLi4uICovCi0gIGZkcl9wdHIgPSB0YWJbaV0uZmRyOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBmaWxlIGhhcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbiBhCi0gICAgIGZpbGUgd2l0aCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZSBzZWNvbmQgbG9jYWwgc3ltYm9sIGlzCi0gICAgIG5hbWVkIEBzdGFicy4gICovCi0gIHN0YWJzID0gZmFsc2U7Ci0gIGlmIChmZHJfcHRyLT5jc3ltID49IDIpCi0gICAgewotICAgICAgY2hhciAqc3ltX3B0cjsKLSAgICAgIFNZTVIgc3ltOwotCi0gICAgICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkgKyAoZmRyX3B0ci0+aXN5bUJhc2UgKyAxKSAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBzeW1fcHRyLCAmc3ltKTsKLSAgICAgIGlmIChzdHJjbXAgKGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3MsCi0JCSAgU1RBQlNfU1lNQk9MKSA9PSAwKQotCXN0YWJzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCFzdGFicykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplOwotICAgICAgY2hhciAqcGRyX3B0cjsKLSAgICAgIGNoYXIgKmJlc3RfcGRyID0gTlVMTDsKLSAgICAgIEZEUiAqYmVzdF9mZHI7Ci0gICAgICBiZmRfdm1hIGJlc3RfZGlzdCA9IH4wOwotICAgICAgUERSIHBkcjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmxpbmVfcHRyOwotICAgICAgdW5zaWduZWQgY2hhciAqbGluZV9lbmQ7Ci0gICAgICBpbnQgbGluZW5vOwotICAgICAgLyogVGhpcyBmaWxlIHVzZXMgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRWFjaCBGRFIgaGFzIGEKLSAgICAgICAgIGxpc3Qgb2YgcHJvY2VkdXJlIGRlc2NyaXB0b3JzIChQRFIpLiAgVGhlIGFkZHJlc3MgaW4gdGhlIEZEUgotICAgICAgICAgaXMgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByb2NlZHVyZS4gIFRoZSBhZGRyZXNzCi0gICAgICAgICBpbiB0aGUgZmlyc3QgUERSIGdpdmVzIHRoZSBvZmZzZXQgb2YgdGhhdCBwcm9jZWR1cmUgcmVsYXRpdmUKLSAgICAgICAgIHRvIHRoZSBvYmplY3QgZmlsZSdzIGJhc2UtYWRkcmVzcy4gIFRoZSBhZGRyZXNzZXMgaW4KLSAgICAgICAgIHN1YnNlcXVlbnQgUERScyBzcGVjaWZ5IGVhY2ggcHJvY2VkdXJlJ3MgYWRkcmVzcyByZWxhdGl2ZSB0bwotICAgICAgICAgdGhlIG9iamVjdCBmaWxlJ3MgYmFzZS1hZGRyZXNzLiAgVG8gbWFrZSB0aGluZ3MgbW9yZSBqdWljeSwKLSAgICAgICAgIHdoZW5ldmVyIHRoZSBQUk9GIGJpdCBpbiB0aGUgUERSIGlzIHNldCwgdGhlIHJlYWwgZW50cnkgcG9pbnQKLSAgICAgICAgIG9mIHRoZSBwcm9jZWR1cmUgbWF5IGJlIDE2IGJ5dGVzIGJlbG93IHdoYXQgd291bGQgbm9ybWFsbHkgYmUKLSAgICAgICAgIHRoZSBwcm9jZWR1cmUncyBlbnRyeSBwb2ludC4gIEluc3RlYWQsIERFQyBjYW1lIHVwIHdpdGggYQotICAgICAgICAgd2lja2VkIHNjaGVtZSB0byBjcmVhdGUgcHJvZmlsZWQgbGlicmFyaWVzICJvbiB0aGUgZmx5IjoKLSAgICAgICAgIGluc3RlYWQgb2Ygc2hpcHBpbmcgYSByZWd1bGFyIGFuZCBhIHByb2ZpbGVkIHZlcnNpb24gb2YgZWFjaAotICAgICAgICAgbGlicmFyeSwgdGhleSBpbnNlcnQgMTYgYnl0ZXMgb2YgdW51c2VkIHNwYWNlIGluIGZyb250IG9mCi0gICAgICAgICBlYWNoIHByb2NlZHVyZSBhbmQgc2V0IHRoZSAicHJvZiIgYml0IGluIHRoZSBQRFIgdG8gaW5kaWNhdGUKLSAgICAgICAgIHRoYXQgdGhlcmUgaXMgYSBnYXAgdGhlcmUgKHRoaXMgaXMgZG9uZSBhdXRvbWFnaWNhbGx5IGJ5ICJhcyIKLSAgICAgICAgIHdoZW4gb3B0aW9uICItcGciIGlzIHNwZWNpZmllZCkuICBUaHVzLCBub3JtYWxseSwgeW91IGxpbmsKLSAgICAgICAgIGFnYWluc3Qgc3VjaCBhIGxpYnJhcnkgYW5kLCBleGNlcHQgZm9yIGxvdHMgb2YgMTYgYnl0ZSBnYXBzCi0gICAgICAgICBiZXR3ZWVuIGZ1bmN0aW9ucywgdGhpbmdzIHdpbGwgYmVoYXZlIGFzIHVzdWFsLiAgSG93ZXZlciwKLSAgICAgICAgIHdoZW4gaW52b2tpbmcgImxkIiB3aXRoIG9wdGlvbiAiLXBnIiwgaXQgd2lsbCBmaWxsIHRob3NlIGdhcHMKLSAgICAgICAgIHdpdGggY29kZSB0aGF0IGNhbGxzIG1jb3VudCgpLiAgSXQgdGhlbiBtb3ZlcyB0aGUgZnVuY3Rpb24ncwotICAgICAgICAgZW50cnkgcG9pbnQgZG93biBieSAxNiBieXRlcywgYW5kIG91dCBwb3BzIGEgYmluYXJ5IHRoYXQgaGFzCi0gICAgICAgICBhbGwgZnVuY3Rpb25zIHByb2ZpbGVkLgotCi0gICAgICAgICBOT1RFOiBOZWl0aGVyIEZEUnMgbm9yIFBEUnMgYXJlIHN0cmljdGx5IHNvcnRlZCBpbiBtZW1vcnkKLSAgICAgICAgICAgICAgIG9yZGVyLiAgRm9yIGV4YW1wbGUsIHdoZW4gaW5jbHVkaW5nIGhlYWRlci1maWxlcyB0aGF0Ci0gICAgICAgICAgICAgICBkZWZpbmUgZnVuY3Rpb25zLCB0aGUgRkRScyBmb2xsb3cgYmVoaW5kIHRoZSBpbmNsdWRpbmcKLSAgICAgICAgICAgICAgIGZpbGUsIGV2ZW4gdGhvdWdoIHRoZWlyIGNvZGUgbWF5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYXQKLSAgICAgICAgICAgICAgIGEgbG93ZXIgYWRkcmVzcy4gIEZpbGUgY29mZi1hbHBoYS5jIGZyb20gbGliYmZkCi0gICAgICAgICAgICAgICBpbGx1c3RyYXRlcyB0aGlzICh1c2UgIm9kdW1wIC1QRnYiIHRvIGxvb2sgYXQgYSBmaWxlJ3MKLSAgICAgICAgICAgICAgIEZEUi9QRFIpLiAgU2ltaWxhcmx5LCBQRFJzIGFyZSBzb21ldGltZXMgb3V0IG9mIG9yZGVyCi0gICAgICAgICAgICAgICBhcyB3ZWxsLiAgQW4gZXhhbXBsZSBvZiB0aGlzIGlzIE9TRi8xIHYzLjAgbGliYydzCi0gICAgICAgICAgICAgICBtYWxsb2MuYy4gIEknbSBub3Qgc3VyZSB3aHkgdGhpcyBoYXBwZW5zLCBidXQgaXQgY291bGQKLSAgICAgICAgICAgICAgIGJlIGR1ZSB0byBvcHRpbWl6YXRpb25zIHRoYXQgcmVvcmRlciBhIGZ1bmN0aW9uJ3MKLSAgICAgICAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiBhbiBvYmplY3QtZmlsZS4KLSAgICAgICAgCi0gICAgICAgICBTdHJhdGVneToKLSAgICAgICAgIAotICAgICAgICAgT24gdGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgd2UgYnVpbGQgYSB0YWJsZSBvZiBGRFJzCi0gICAgICAgICB0aGF0IGlzIHNvcnRlZCBieSB0aGUgYmFzZS1hZGRyZXNzIG9mIHRoZSBvYmplY3QtZmlsZSB0aGUgRkRSCi0gICAgICAgICBpcyByZWZlcnJpbmcgdG8uICBOb3RpY2UgdGhhdCBlYWNoIG9iamVjdC1maWxlIG1heSBjb250YWluCi0gICAgICAgICBjb2RlIGZyb20gbXVsdGlwbGUgc291cmNlIGZpbGVzIChlLmcuLCBkdWUgdG8gY29kZSBkZWZpbmVkIGluCi0gICAgICAgICBpbmNsdWRlIGZpbGVzKS4gIFRodXMsIGZvciBhbnkgZ2l2ZW4gYmFzZS1hZGRyZXNzLCB0aGVyZSBtYXkKLSAgICAgICAgIGJlIG11bHRpcGxlIEZEUnMgKGJ1dCB0aGlzIGNhc2UgaXMsIGZvcnR1bmF0ZWx5LCB1bmNvbW1vbikuCi0gICAgICAgICBsb29rdXAoYWRkcikgZ3VhcmFudGVlcyB0byByZXR1cm4gdGhlIGZpcnN0IEZEUiB0aGF0IGFwcGxpZXMKLSAgICAgICAgIHRvIGFkZHJlc3MgQUREUi4gIFRodXMsIGFmdGVyIGludm9raW5nIGxvb2t1cCgpLCB3ZSBoYXZlIGEKLSAgICAgICAgIGxpc3Qgb2YgRkRScyB0aGF0IG1heSBjb250YWluIHRoZSBQRFIgZm9yIEFERFIuICBOZXh0LCB3ZQotICAgICAgICAgd2FsayB0aHJvdWdoIHRoZSBQRFJzIG9mIHRoZXNlIEZEUnMgYW5kIGxvY2F0ZSB0aGUgb25lIHRoYXQKLSAgICAgICAgIGlzIGNsb3Nlc3QgdG8gQUREUiAoaS5lLiwgZm9yIHdoaWNoIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgICAgICAgIEFERFIgYW5kIHRoZSBQRFIncyBlbnRyeSBwb2ludCBpcyBwb3NpdGl2ZSBhbmQgbWluaW1hbCkuCi0gICAgICAgICBPbmNlLCB0aGUgcmlnaHQgRkRSIGFuZCBQRFIgYXJlIGxvY2F0ZWQsIHdlIHNpbXBseSB3YWxrCi0gICAgICAgICB0aHJvdWdoIHRoZSBsaW5lLW51bWJlciB0YWJsZSB0byBsb29rdXAgdGhlIGxpbmUtbnVtYmVyIHRoYXQKLSAgICAgICAgIGJlc3QgbWF0Y2hlcyBBRERSLiAgT2J2aW91c2x5LCB0aGluZ3MgY291bGQgYmUgc3BlZCB1cCBieQotICAgICAgICAga2VlcGluZyBhIHNvcnRlZCBsaXN0IG9mIFBEUnMgaW5zdGVhZCBvZiBhIHNvcnRlZCBsaXN0IG9mCi0gICAgICAgICBGRFJzLiAgSG93ZXZlciwgdGhpcyB3b3VsZCBpbmNyZWFzZSBzcGFjZSByZXF1aXJlbWVudHMKLSAgICAgICAgIGNvbnNpZGVyYWJseSwgd2hpY2ggaXMgdW5kZXNpcmFibGUuICAqLwotICAgICAgZXh0ZXJuYWxfcGRyX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZTsKLQotICAgICAgLyogTWFrZSBvZmZzZXQgcmVsYXRpdmUgdG8gb2JqZWN0IGZpbGUncyBzdGFydC1hZGRyZXNzOiAqLwotICAgICAgb2Zmc2V0IC09IHRhYltpXS5iYXNlX2FkZHI7Ci0gICAgICAvKiBTZWFyY2ggRkRSIGxpc3Qgc3RhcnRpbmcgYXQgdGFiW2ldIGZvciB0aGUgUERSIHRoYXQgYmVzdCBtYXRjaGVzCi0gICAgICAgICBPRkZTRVQuICBOb3JtYWxseSwgdGhlIEZEUiBsaXN0IGlzIG9ubHkgb25lIGVudHJ5IGxvbmcuICAqLwotICAgICAgYmVzdF9mZHIgPSBOVUxMOwotICAgICAgZG8KLQl7Ci0JICBiZmRfdm1hIGRpc3QsIG1pbl9kaXN0ID0gMDsKLQkgIGNoYXIgKnBkcl9ob2xkOwotCSAgY2hhciAqcGRyX2VuZDsKLQkgIAotCSAgZmRyX3B0ciA9IHRhYltpXS5mZHI7Ci0JICAKLQkgIHBkcl9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfcGRyCi0JCSAgICAgKyBmZHJfcHRyLT5pcGRGaXJzdCAqIGV4dGVybmFsX3Bkcl9zaXplKTsKLQkgIHBkcl9lbmQgPSBwZHJfcHRyICsgZmRyX3B0ci0+Y3BkICogZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcik7Ci0JICAvKiBGaW5kIFBEUiB0aGF0IGlzIGNsb3Nlc3QgdG8gT0ZGU0VULiAgSWYgcGRyLnByb2YgaXMgc2V0LAotCSAgICAgdGhlIHByb2NlZHVyZSBlbnRyeS1wb2ludCAqbWF5KiBiZSAweDEwIGJlbG93IHBkci5hZHIuICBXZQotCSAgICAgc2ltcGx5IHByZXRlbmQgdGhhdCBwZHIucHJvZiAqaW1wbGllcyogYSBsb3dlciBlbnRyeS1wb2ludC4KLQkgICAgIFRoaXMgaXMgc2FmZSBiZWNhdXNlIGl0IGp1c3QgbWVhbnMgdGhhdCBtYXkgaWRlbnRpZnkgNCBOT1BzCi0JICAgICBpbiBmcm9udCBvZiB0aGUgZnVuY3Rpb24gYXMgYmVsb25naW5nIHRvIHRoZSBmdW5jdGlvbi4gICovCi0JICBmb3IgKHBkcl9ob2xkID0gTlVMTDsKLQkgICAgICAgcGRyX3B0ciA8IHBkcl9lbmQ7Ci0JICAgICAgIChwZHJfcHRyICs9IGV4dGVybmFsX3Bkcl9zaXplLAotCQkoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcikpKQotCSAgICB7Ci0JICAgICAgaWYgKG9mZnNldCA+PSAocGRyLmFkciAtIDB4MTAgKiBwZHIucHJvZikpCi0JCXsKLQkJICBkaXN0ID0gb2Zmc2V0IC0gKHBkci5hZHIgLSAweDEwICogcGRyLnByb2YpOwotCQkgIGlmICghcGRyX2hvbGQgfHwgZGlzdCA8IG1pbl9kaXN0KQotCQkgICAgewotCQkgICAgICBtaW5fZGlzdCA9IGRpc3Q7Ci0JCSAgICAgIHBkcl9ob2xkID0gcGRyX3B0cjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICAKLQkgIGlmICghYmVzdF9wZHIgfHwgbWluX2Rpc3QgPCBiZXN0X2Rpc3QpCi0JICAgIHsKLQkgICAgICBiZXN0X2Rpc3QgPSBtaW5fZGlzdDsKLQkgICAgICBiZXN0X2ZkciA9IGZkcl9wdHI7Ci0JICAgICAgYmVzdF9wZHIgPSBwZHJfaG9sZDsKLQkgICAgfQotCSAgLyogY29udGludWUgbG9vcGluZyB1bnRpbCBiYXNlX2FkZHIgb2YgbmV4dCBlbnRyeSBpcyBkaWZmZXJlbnQ6ICovCi0JfQotICAgICAgd2hpbGUgKCsraSA8IGxpbmVfaW5mby0+ZmRydGFiX2xlbgotCSAgICAgJiYgdGFiW2ldLmJhc2VfYWRkciA9PSB0YWJbaSAtIDFdLmJhc2VfYWRkcik7Ci0KLSAgICAgIGlmICghYmVzdF9mZHIgfHwgIWJlc3RfcGRyKQotCXJldHVybiBmYWxzZTsJCQkvKiBzaG91bGRuJ3QgaGFwcGVuLi4uICovCi0KLSAgICAgIC8qIHBoZXcsIGZpbmFsbHkgd2UgZ290IHNvbWV0aGluZyB0aGF0IHdlIGNhbiBob2xkIG9udG86ICovCi0gICAgICBmZHJfcHRyID0gYmVzdF9mZHI7Ci0gICAgICBwZHJfcHRyID0gYmVzdF9wZHI7Ci0gICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcik7Ci0gICAgICAvKiBOb3cgd2UgY2FuIGxvb2sgZm9yIHRoZSBhY3R1YWwgbGluZSBudW1iZXIuICBUaGUgbGluZSBudW1iZXJzCi0gICAgICAgICBhcmUgc3RvcmVkIGluIGEgdmVyeSBmdW5reSBmb3JtYXQsIHdoaWNoIEkgd29uJ3QgdHJ5IHRvCi0gICAgICAgICBkZXNjcmliZS4gIFRoZSBzZWFyY2ggaXMgYm91bmRlZCBieSB0aGUgZW5kIG9mIHRoZSBGRFJzIGxpbmUKLSAgICAgICAgIG51bWJlciBlbnRyaWVzLiAgKi8KLSAgICAgIGxpbmVfZW5kID0gZGVidWdfaW5mby0+bGluZSArIGZkcl9wdHItPmNiTGluZU9mZnNldCArIGZkcl9wdHItPmNiTGluZTsKLQotICAgICAgLyogTWFrZSBvZmZzZXQgcmVsYXRpdmUgdG8gcHJvY2VkdXJlIGVudHJ5OiAqLwotICAgICAgb2Zmc2V0IC09IHBkci5hZHIgLSAweDEwICogcGRyLnByb2Y7Ci0gICAgICBsaW5lbm8gPSBwZHIubG5Mb3c7Ci0gICAgICBsaW5lX3B0ciA9IGRlYnVnX2luZm8tPmxpbmUgKyBmZHJfcHRyLT5jYkxpbmVPZmZzZXQgKyBwZHIuY2JMaW5lT2Zmc2V0OwotICAgICAgd2hpbGUgKGxpbmVfcHRyIDwgbGluZV9lbmQpCi0JewotCSAgaW50IGRlbHRhOwotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0JICBkZWx0YSA9ICpsaW5lX3B0ciA+PiA0OwotCSAgaWYgKGRlbHRhID49IDB4OCkKLQkgICAgZGVsdGEgLT0gMHgxMDsKLQkgIGNvdW50ID0gKCpsaW5lX3B0ciAmIDB4ZikgKyAxOwotCSAgKytsaW5lX3B0cjsKLQkgIGlmIChkZWx0YSA9PSAtOCkKLQkgICAgewotCSAgICAgIGRlbHRhID0gKCgobGluZV9wdHJbMF0pICYgMHhmZikgPDwgOCkgKyAoKGxpbmVfcHRyWzFdKSAmIDB4ZmYpOwotCSAgICAgIGlmIChkZWx0YSA+PSAweDgwMDApCi0JCWRlbHRhIC09IDB4MTAwMDA7Ci0JICAgICAgbGluZV9wdHIgKz0gMjsKLQkgICAgfQotCSAgbGluZW5vICs9IGRlbHRhOwotCSAgaWYgKG9mZnNldCA8IGNvdW50ICogNCkKLQkgICAgewotCSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc3RvcCArPSBjb3VudCAqIDQgLSBvZmZzZXQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIG9mZnNldCAtPSBjb3VudCAqIDQ7Ci0JfQotCi0gICAgICAvKiBJZiBmZHJfcHRyLT5yc3MgaXMgLTEsIHRoZW4gdGhpcyBmaWxlIGRvZXMgbm90IGhhdmUgZnVsbAotICAgICAgICAgc3ltYm9scywgYXQgbGVhc3QgYWNjb3JkaW5nIHRvIGdkYi9taXBzcmVhZC5jLiAgKi8KLSAgICAgIGlmIChmZHJfcHRyLT5yc3MgPT0gLTEpCi0JewotCSAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IE5VTEw7Ci0JICBpZiAocGRyLmlzeW0gPT0gLTEpCi0JICAgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVYVFIgcHJvY19leHQ7Ci0KLQkgICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfZXh0X2luKQotCQkoYWJmZCwKLQkJICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9leHQKLQkJICArIHBkci5pc3ltICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpLAotCQkgJnByb2NfZXh0KTsKLQkgICAgICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IChkZWJ1Z19pbmZvLT5zc2V4dAotCQkJCQkgICAgICAgKyBwcm9jX2V4dC5hc3ltLmlzcyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU1lNUiBwcm9jX3N5bTsKLQotCSAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IChkZWJ1Z19pbmZvLT5zcwotCQkJCSAgICAgICArIGZkcl9wdHItPmlzc0Jhc2UKLQkJCQkgICAgICAgKyBmZHJfcHRyLT5yc3MpOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikKLQkgICAgKGFiZmQsCi0JICAgICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JICAgICAgKyAoKGZkcl9wdHItPmlzeW1CYXNlICsgcGRyLmlzeW0pCi0JCSAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKSksCi0JICAgICAmcHJvY19zeW0pOwotCSAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSAoZGVidWdfaW5mby0+c3MKLQkJCQkJICAgKyBmZHJfcHRyLT5pc3NCYXNlCi0JCQkJCSAgICsgcHJvY19zeW0uaXNzKTsKLQl9Ci0gICAgICBpZiAobGluZW5vID09IGlsaW5lTmlsKQotCWxpbmVubyA9IDA7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtID0gbGluZW5vOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBjb25zdCBjaGFyICpkaXJlY3RvcnlfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKm1haW5fZmlsZV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqY3VycmVudF9maWxlX25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lOwotICAgICAgY29uc3QgY2hhciAqbGluZV9maWxlX25hbWU7Ci0gICAgICBiZmRfdm1hIGxvd19mdW5jX3ZtYTsKLSAgICAgIGJmZF92bWEgbG93X2xpbmVfdm1hOwotICAgICAgYm9vbGVhbiBwYXN0X2xpbmU7Ci0gICAgICBib29sZWFuIHBhc3RfZm47Ci0gICAgICBjaGFyICpzeW1fcHRyLCAqc3ltX3B0cl9lbmQ7Ci0gICAgICBzaXplX3QgbGVuLCBmdW5jbGVuOwotICAgICAgY2hhciAqYnVmZmVyID0gTlVMTDsKLQotICAgICAgLyogVGhpcyBmaWxlIHVzZXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2hlbiBnY2MgaXMgbm90Ci0JIG9wdGltaXppbmcsIGl0IHdpbGwgcHV0IHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBiZWZvcmUKLQkgdGhlIGZ1bmN0aW9uIG5hbWUgc3RhYnMgZW50cnkuICBXaGVuIGdjYyBpcyBvcHRpbWl6aW5nLCBpdAotCSB3aWxsIHB1dCB0aGUgc3RhYnMgZW50cnkgZm9yIGFsbCB0aGUgZnVuY3Rpb24gZmlyc3QsIGZvbGxvd2VkCi0JIGJ5IHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gIChUaGlzIGFwcGVhcnMgdG8gaGFwcGVuCi0JIGJlY2F1c2Ugb2YgdGhlIHR3byBvdXRwdXQgZmlsZXMgdXNlZCBieSB0aGUgLW1ncG9wdCBzd2l0Y2gsCi0JIHdoaWNoIGlzIGltcGxpZWQgYnkgLU8pLiAgVGhpcyBtZWFucyB0aGF0IHdlIG11c3Qga2VlcAotCSBsb29raW5nIHRocm91Z2ggdGhlIHN5bWJvbHMgdW50aWwgd2UgZmluZCBib3RoIGEgbGluZSBudW1iZXIKLQkgYW5kIGEgZnVuY3Rpb24gbmFtZSB3aGljaCBhcmUgYmV5b25kIHRoZSBhZGRyZXNzIHdlIHdhbnQuICAqLwotCi0gICAgICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gTlVMTDsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gTlVMTDsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gPSAwOwotCi0gICAgICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gICAgICBtYWluX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBjdXJyZW50X2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBmdW5jdGlvbl9uYW1lID0gTlVMTDsKLSAgICAgIGxpbmVfZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGxvd19mdW5jX3ZtYSA9IDA7Ci0gICAgICBsb3dfbGluZV92bWEgPSAwOwotICAgICAgcGFzdF9saW5lID0gZmFsc2U7Ci0gICAgICBwYXN0X2ZuID0gZmFsc2U7Ci0KLSAgICAgIGV4dGVybmFsX3N5bV9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0KLSAgICAgIHN5bV9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCSArIChmZHJfcHRyLT5pc3ltQmFzZSArIDIpICogZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgc3ltX3B0cl9lbmQgPSBzeW1fcHRyICsgKGZkcl9wdHItPmNzeW0gLSAyKSAqIGV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZm9yICg7Ci0JICAgc3ltX3B0ciA8IHN5bV9wdHJfZW5kICYmICghIHBhc3RfbGluZSB8fCAhIHBhc3RfZm4pOwotCSAgIHN5bV9wdHIgKz0gZXh0ZXJuYWxfc3ltX3NpemUpCi0JewotCSAgU1lNUiBzeW07Ci0KLQkgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBzeW1fcHRyLCAmc3ltKTsKLQotCSAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZzeW0pKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChFQ09GRl9VTk1BUktfU1RBQiAoc3ltLmluZGV4KSkKLQkJewotCQljYXNlIE5fU086Ci0JCSAgbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9Ci0JCSAgICBkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzOwotCi0JCSAgLyogQ2hlY2sgdGhlIG5leHQgc3ltYm9sIHRvIHNlZSBpZiBpdCBpcyBhbHNvIGFuCi0gICAgICAgICAgICAgICAgICAgICBOX1NPIHN5bWJvbC4gICovCi0JCSAgaWYgKHN5bV9wdHIgKyBleHRlcm5hbF9zeW1fc2l6ZSA8IHN5bV9wdHJfZW5kKQotCQkgICAgewotCQkgICAgICBTWU1SIG5leHRzeW07Ci0KLQkJICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsCi0JCQkJCQkgIHN5bV9wdHIgKyBleHRlcm5hbF9zeW1fc2l6ZSwKLQkJCQkJCSAgJm5leHRzeW0pOwotCQkgICAgICBpZiAoRUNPRkZfSVNfU1RBQiAoJm5leHRzeW0pCi0JCQkgICYmIEVDT0ZGX1VOTUFSS19TVEFCIChuZXh0c3ltLmluZGV4KSA9PSBOX1NPKQotCQkJewotIAkJCSAgZGlyZWN0b3J5X25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQkJCSAgbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9Ci0JCQkgICAgZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgbmV4dHN5bS5pc3M7Ci0JCQkgIHN5bV9wdHIgKz0gZXh0ZXJuYWxfc3ltX3NpemU7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBOX1NPTDoKLQkJICBjdXJyZW50X2ZpbGVfbmFtZSA9Ci0JCSAgICBkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgTl9GVU46Ci0JCSAgaWYgKHN5bS52YWx1ZSA+IG9mZnNldCkKLQkJICAgIHBhc3RfZm4gPSB0cnVlOwotCQkgIGVsc2UgaWYgKHN5bS52YWx1ZSA+PSBsb3dfZnVuY192bWEpCi0JCSAgICB7Ci0JCSAgICAgIGxvd19mdW5jX3ZtYSA9IHN5bS52YWx1ZTsKLQkJICAgICAgZnVuY3Rpb25fbmFtZSA9Ci0JCQlkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN5bS5zdCA9PSBzdExhYmVsICYmIHN5bS5pbmRleCAhPSBpbmRleE5pbCkKLQkgICAgewotCSAgICAgIGlmIChzeW0udmFsdWUgPiBvZmZzZXQpCi0JCXBhc3RfbGluZSA9IHRydWU7Ci0JICAgICAgZWxzZSBpZiAoc3ltLnZhbHVlID49IGxvd19saW5lX3ZtYSkKLQkJewotCQkgIGxvd19saW5lX3ZtYSA9IHN5bS52YWx1ZTsKLQkJICBsaW5lX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCQkgIGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gPSBzeW0uaW5kZXg7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gIT0gMCkKLQltYWluX2ZpbGVfbmFtZSA9IGxpbmVfZmlsZV9uYW1lOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgc3R1ZmYgYWZ0ZXIgdGhlIGNvbG9uIGluIHRoZSBmdW5jdGlvbgotICAgICAgICAgbmFtZS4gIFdlIGFsc28gbmVlZCB0byBwdXQgdGhlIGRpcmVjdG9yeSBuYW1lIGFuZCB0aGUgZmlsZQotICAgICAgICAgbmFtZSB0b2dldGhlci4gICovCi0gICAgICBpZiAoZnVuY3Rpb25fbmFtZSA9PSBOVUxMKQotCWxlbiA9IGZ1bmNsZW4gPSAwOwotICAgICAgZWxzZQotCWxlbiA9IGZ1bmNsZW4gPSBzdHJsZW4gKGZ1bmN0aW9uX25hbWUpICsgMTsKLQotICAgICAgaWYgKG1haW5fZmlsZV9uYW1lICE9IE5VTEwKLQkgICYmIGRpcmVjdG9yeV9uYW1lICE9IE5VTEwKLQkgICYmIG1haW5fZmlsZV9uYW1lWzBdICE9ICcvJykKLQlsZW4gKz0gc3RybGVuIChkaXJlY3RvcnlfbmFtZSkgKyBzdHJsZW4gKG1haW5fZmlsZV9uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChsZW4gIT0gMCkKLQl7Ci0JICBpZiAobGluZV9pbmZvLT5maW5kX2J1ZmZlciAhPSBOVUxMKQotCSAgICBmcmVlIChsaW5lX2luZm8tPmZpbmRfYnVmZmVyKTsKLQkgIGJ1ZmZlciA9IChjaGFyICopIGJmZF9tYWxsb2MgKGxlbik7Ci0JICBpZiAoYnVmZmVyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGxpbmVfaW5mby0+ZmluZF9idWZmZXIgPSBidWZmZXI7Ci0JfQotCi0gICAgICBpZiAoZnVuY3Rpb25fbmFtZSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKmNvbG9uOwotCi0JICBzdHJjcHkgKGJ1ZmZlciwgZnVuY3Rpb25fbmFtZSk7Ci0JICBjb2xvbiA9IHN0cmNociAoYnVmZmVyLCAnOicpOwotCSAgaWYgKGNvbG9uICE9IE5VTEwpCi0JICAgICpjb2xvbiA9ICdcMCc7Ci0JICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IGJ1ZmZlcjsKLQl9Ci0KLSAgICAgIGlmIChtYWluX2ZpbGVfbmFtZSAhPSBOVUxMKQotCXsKLQkgIGlmIChkaXJlY3RvcnlfbmFtZSA9PSBOVUxMIHx8IG1haW5fZmlsZV9uYW1lWzBdID09ICcvJykKLQkgICAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IG1haW5fZmlsZV9uYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAoYnVmZmVyICsgZnVuY2xlbiwgIiVzJXMiLCBkaXJlY3RvcnlfbmFtZSwKLQkJICAgICAgIG1haW5fZmlsZV9uYW1lKTsKLQkgICAgICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gYnVmZmVyICsgZnVuY2xlbjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERvIHRoZSB3b3JrIG9mIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLAotCQkJbGluZV9pbmZvLCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIHJldGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXA7Ci0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqcmV0bGluZV9wdHI7Ci17Ci0gIG9mZnNldCArPSBzZWN0aW9uLT52bWE7Ci0KLSAgaWYgKGxpbmVfaW5mby0+Y2FjaGUuc2VjdCA9PSBOVUxMCi0gICAgICB8fCBsaW5lX2luZm8tPmNhY2hlLnNlY3QgIT0gc2VjdGlvbgotICAgICAgfHwgb2Zmc2V0IDwgbGluZV9pbmZvLT5jYWNoZS5zdGFydAotICAgICAgfHwgb2Zmc2V0ID49IGxpbmVfaW5mby0+Y2FjaGUuc3RvcCkKLSAgICB7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLnNlY3QgPSBzZWN0aW9uOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5zdGFydCA9IG9mZnNldDsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc3RvcCA9IG9mZnNldDsKLSAgICAgIGlmICghIGxvb2t1cF9saW5lIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pKQotCXsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuc2VjdCA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAqZmlsZW5hbWVfcHRyID0gbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZTsKLSAgKnJldGxpbmVfcHRyID0gbGluZV9pbmZvLT5jYWNoZS5saW5lX251bTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoZXNlIHJvdXRpbmVzIGNvcHkgc3ltYm9saWMgaW5mb3JtYXRpb24gaW50byBhIG1lbW9yeSBidWZmZXIuCi0KLSAgIEZJWE1FOiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhlIHNodWZmbGUgY29kZSBpcyB0byBhdm9pZCBzdG9yaW5nCi0gICBldmVyeXRoaW5nIGluIG1lbW9yeSwgc2luY2UgdGhlIGxpbmtlciBpcyBzdWNoIGEgbWVtb3J5IGhvZy4gIFRoaXMKLSAgIGNvZGUgbWFrZXMgdGhhdCBlZmZvcnQgdXNlbGVzcy4gIEl0IGlzIG9ubHkgY2FsbGVkIGJ5IHRoZSBNSVBTIEVMRgotICAgY29kZSB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgc28gaXQgaXMgbm90IHRoYXQgYmlnIGEKLSAgIGRlYWwsIGJ1dCBpdCBzaG91bGQgYmUgZml4ZWQgZXZlbnR1YWxseS4gICovCi0KLS8qIENvbGxlY3QgYSBzaHVmZmxlIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWNvZmZfY29sbGVjdF9zaHVmZmxlIFBBUkFNUyAoKHN0cnVjdCBzaHVmZmxlICosIGJmZF9ieXRlICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSAobCwgYnVmZikKLSAgICAgc3RydWN0IHNodWZmbGUgKmw7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotCi0gIHRvdGFsID0gMDsKLSAgZm9yICg7IGwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGwtPmZpbGVwKQotCW1lbWNweSAoYnVmZiwgbC0+dS5tZW1vcnksIGwtPnNpemUpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChiZmRfc2VlayAobC0+dS5maWxlLmlucHV0X2JmZCwgbC0+dS5maWxlLm9mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoYnVmZiwgMSwgbC0+c2l6ZSwgbC0+dS5maWxlLmlucHV0X2JmZCkgIT0gbC0+c2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHRvdGFsICs9IGwtPnNpemU7Ci0gICAgICBidWZmICs9IGwtPnNpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IFBEUiBpbmZvcm1hdGlvbiBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciAoaGFuZGxlLCBidWZmKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLQotICByZXR1cm4gZWNvZmZfY29sbGVjdF9zaHVmZmxlIChhaW5mby0+cGRyLCBidWZmKTsKLX0KLQotLyogQ29weSBzeW1ib2wgaW5mb3JtYXRpb24gaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0gKGhhbmRsZSwgYnVmZikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSAoYWluZm8tPnN5bSwgYnVmZik7Ci19Ci0KLS8qIENvcHkgdGhlIHN0cmluZyB0YWJsZSBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIChoYW5kbGUsIGJ1ZmYpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOwotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUgaXMgd3JpdHRlbiBvdXQgZnJvbSB0aGUgaGFzaCB0YWJsZSBpZiB0aGlzIGlzIGEKLSAgICAgZmluYWwgbGluay4gICovCi0gIEJGRF9BU1NFUlQgKGFpbmZvLT5zcyA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCk7Ci0gICpidWZmKysgPSAnXDAnOwotICB0b3RhbCA9IDE7Ci0gIEJGRF9BU1NFUlQgKGFpbmZvLT5zc19oYXNoID09IE5VTEwgfHwgYWluZm8tPnNzX2hhc2gtPnZhbCA9PSAxKTsKLSAgZm9yIChzaCA9IGFpbmZvLT5zc19oYXNoOwotICAgICAgIHNoICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTDsKLSAgICAgICBzaCA9IHNoLT5uZXh0KQotICAgIHsKLSAgICAgIHNpemVfdCBsZW47Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoc2gtPnJvb3Quc3RyaW5nKTsKLSAgICAgIG1lbWNweSAoYnVmZiwgKFBUUikgc2gtPnJvb3Quc3RyaW5nLCBsZW4gKyAxKTsKLSAgICAgIHRvdGFsICs9IGxlbiArIDE7Ci0gICAgICBidWZmICs9IGxlbiArIDE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2Zmc3dhcC5oIGIvYmZkL2Vjb2Zmc3dhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDI4ZDE2Li4wMDAwMDAwCi0tLSBhL2JmZC9lY29mZnN3YXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKiBHZW5lcmljIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYSBoZWFkZXIgZmlsZSwgYnV0IGl0IGNvbnRhaW5zIGV4ZWN1dGFibGUgcm91dGluZXMuCi0gICBUaGlzIGlzIGRvbmUgdGhpcyB3YXkgYmVjYXVzZSB0aGVzZSByb3V0aW5lcyBhcmUgc3Vic3RhbnRpYWxseQotICAgc2ltaWxhciwgYnV0IGFyZSBub3QgaWRlbnRpY2FsLCBmb3IgYWxsIEVDT0ZGIHRhcmdldHMuCi0KLSAgIFRoZXNlIGFyZSByb3V0aW5lcyB0byBzd2FwIHRoZSBFQ09GRiBzeW1ib2xpYyBpbmZvcm1hdGlvbiBpbiBhbmQKLSAgIG91dC4gIFRoZSByb3V0aW5lcyBhcmUgZGVmaW5lZCBzdGF0aWNhbGx5LiAgWW91IGNhbiBzZXQgYnJlYWtwb2ludHMKLSAgIG9uIHRoZW0gaW4gZ2RiIGJ5IG5hbWluZyB0aGUgaW5jbHVkaW5nIHNvdXJjZSBmaWxlOyBlLmcuLAotICAgJ2NvZmYtbWlwcy5jJzplY29mZl9zd2FwX2hkcl9pbi4KLQotICAgQmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlciBmaWxlLCBvbmUgb2YgRUNPRkZfMzIgb3IgRUNPRkZfNjQgbXVzdAotICAgYmUgZGVmaW5lZC4gIFRoZXNlIGFyZSBjaGVja2VkIHdoZW4gc3dhcHBpbmcgaW5mb3JtYXRpb24gdGhhdAotICAgZGVwZW5kcyB1cG9uIHRoZSB0YXJnZXQgc2l6ZS4gIFRoaXMgY29kZSB3b3JrcyBmb3IgMzIgYml0IGFuZCA2NAotICAgYml0IEVDT0ZGLCBidXQgbWF5IG5lZWQgdG8gYmUgZ2VuZXJhbGl6ZWQgaW4gdGhlIGZ1dHVyZS4KLQotICAgU29tZSBoZWFkZXIgZmlsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlcm5hbCBmb3JtcyBvZiB0aGVzZQotICAgc3RydWN0dXJlcyBtdXN0IGFsc28gYmUgaW5jbHVkZWQgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlciBmaWxlLgotICAgQ3VycmVudGx5IHRoaXMgaXMgZWl0aGVyIGNvZmYvbWlwcy5oIG9yIGNvZmYvYWxwaGEuaC4KLQotICAgSWYgdGhlIHN5bWJvbCBURVNUIGlzIGRlZmluZWQgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQsIGEKLSAgIGNvbXBhcmlzb24gaXMgbWFkZSB0byBlbnN1cmUgdGhhdCwgaW4gZmFjdCwgdGhlIG91dHB1dCBpcwotICAgYml0LWZvci1iaXQgdGhlIHNhbWUgYXMgdGhlIGlucHV0LiAgT2YgY291cnNlLCB0aGlzIHN5bWJvbCBzaG91bGQKLSAgIG9ubHkgYmUgZGVmaW5lZCB3aGVuIGRlbGliZXJhdGVseSB0ZXN0aW5nIHRoZSBjb2RlIG9uIGEgbWFjaGluZQotICAgd2l0aCB0aGUgcHJvcGVyIGJ5dGUgc2V4IGFuZCBzdWNoLiAgKi8KLQotI2lmZGVmIEVDT0ZGXzMyCi0jZGVmaW5lIGVjb2ZmX2dldF9vZmYgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIGVjb2ZmX3B1dF9vZmYgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotI2RlZmluZSBlY29mZl9nZXRfb2ZmIGJmZF9oX2dldF82NAotI2RlZmluZSBlY29mZl9wdXRfb2ZmIGJmZF9oX3B1dF82NAotI2VuZGlmCi0KLS8qIEVDT0ZGIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB0aGUgc2FtZQotICAgZm9yIGFsbCBFQ09GRiB0YXJnZXRzLCBzbyB0aGV5IGFyZSBkZWZpbmVkIGluIGVjb2ZmbGluay5jLiAgKi8KLQotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbgotICBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCB0aXJfZXh0ICosIFRJUiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFRJUiAqLCBzdHJ1Y3QgdGlyX2V4dCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbgotICBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCBybmR4X2V4dCAqLCBSTkRYUiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQKLSAgUEFSQU1TICgoaW50LCBjb25zdCBSTkRYUiAqLCBzdHJ1Y3Qgcm5keF9leHQgKikpOwotCi0vKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2hkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBIRFJSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfaGRyX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgSERSUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZmRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEZEUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Zkcl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBEUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3Bkcl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IFBEUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9zeW1fb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9leHRfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2V4dF9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEVYVFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3JmZF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBSRkRUICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcmZkX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgUkZEVCAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfb3B0X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIE9QVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9vcHRfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBPUFRSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9kbnJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgRE5SICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZG5yX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgRE5SICosIFBUUikpOwotCi0vKiBTd2FwIGluIHRoZSBzeW1ib2xpYyBoZWFkZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9oZHJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBIRFJSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBoZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgaGRyX2V4dCAqKSBleHRfY29weTsKLQotICBpbnRlcm4tPm1hZ2ljICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfbWFnaWMpOwotICBpbnRlcm4tPnZzdGFtcCAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfdnN0YW1wKTsKLSAgaW50ZXJuLT5pbGluZU1heCAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWxpbmVNYXgpOwotICBpbnRlcm4tPmNiTGluZSAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lKTsKLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZU9mZnNldCk7Ci0gIGludGVybi0+aWRuTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lkbk1heCk7Ci0gIGludGVybi0+Y2JEbk9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkRuT2Zmc2V0KTsKLSAgaW50ZXJuLT5pcGRNYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXBkTWF4KTsKLSAgaW50ZXJuLT5jYlBkT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUGRPZmZzZXQpOwotICBpbnRlcm4tPmlzeW1NYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3ltTWF4KTsKLSAgaW50ZXJuLT5jYlN5bU9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3ltT2Zmc2V0KTsKLSAgaW50ZXJuLT5pb3B0TWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaW9wdE1heCk7Ci0gIGludGVybi0+Y2JPcHRPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYk9wdE9mZnNldCk7Ci0gIGludGVybi0+aWF1eE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lhdXhNYXgpOwotICBpbnRlcm4tPmNiQXV4T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JBdXhPZmZzZXQpOwotICBpbnRlcm4tPmlzc01heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NNYXgpOwotICBpbnRlcm4tPmNiU3NPZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc09mZnNldCk7Ci0gIGludGVybi0+aXNzRXh0TWF4ICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc0V4dE1heCk7Ci0gIGludGVybi0+Y2JTc0V4dE9mZnNldCA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlNzRXh0T2Zmc2V0KTsKLSAgaW50ZXJuLT5pZmRNYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWZkTWF4KTsKLSAgaW50ZXJuLT5jYkZkT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRmRPZmZzZXQpOwotICBpbnRlcm4tPmNyZmQgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jcmZkKTsKLSAgaW50ZXJuLT5jYlJmZE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUmZkT2Zmc2V0KTsKLSAgaW50ZXJuLT5pZXh0TWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWV4dE1heCk7Ci0gIGludGVybi0+Y2JFeHRPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkV4dE9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBzeW1ib2xpYyBoZWFkZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9oZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBIRFJSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBoZHJfZXh0ICpleHQgPSAoc3RydWN0IGhkcl9leHQgKikgZXh0X3B0cjsKLSAgSERSUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsKLQotICBiZmRfaF9wdXRfc2lnbmVkXzE2IChhYmZkLCBpbnRlcm4tPm1hZ2ljLCAoYmZkX2J5dGUgKilleHQtPmhfbWFnaWMpOwotICBiZmRfaF9wdXRfc2lnbmVkXzE2IChhYmZkLCBpbnRlcm4tPnZzdGFtcCwgKGJmZF9ieXRlICopZXh0LT5oX3ZzdGFtcCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZU1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lsaW5lTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmUsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmUpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pZG5NYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZG5NYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiRG5PZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkRuT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlwZE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lwZE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JQZE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUGRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXN5bU1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lzeW1NYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiU3ltT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JTeW1PZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW9wdE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lvcHRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiT3B0T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JPcHRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWF1eE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lhdXhNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiQXV4T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JBdXhPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXNzTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc09mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3NFeHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NFeHRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiU3NFeHRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlNzRXh0T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlmZE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lmZE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JGZE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRmRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y3JmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NyZmQpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiUmZkT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JSZmRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWV4dE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lleHRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiRXh0T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JFeHRPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZmRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgRkRSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBmZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgZmRyX2V4dCAqKSBleHRfY29weTsKLSAgCi0gIGludGVybi0+YWRyICAgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9hZHIpOwotICBpbnRlcm4tPnJzcyAgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yc3MpOwotI2lmZGVmIEVDT0ZGXzY0Ci0gIGlmIChpbnRlcm4tPnJzcyA9PSAweGZmZmZmZmZmKQotICAgIGludGVybi0+cnNzID0gLTE7Ci0jZW5kaWYKLSAgaW50ZXJuLT5pc3NCYXNlICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaXNzQmFzZSk7Ci0gIGludGVybi0+Y2JTcyAgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYlNzKTsKLSAgaW50ZXJuLT5pc3ltQmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaXN5bUJhc2UpOwotICBpbnRlcm4tPmNzeW0gICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jc3ltKTsKLSAgaW50ZXJuLT5pbGluZUJhc2UgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaWxpbmVCYXNlKTsKLSAgaW50ZXJuLT5jbGluZSAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2xpbmUpOwotICBpbnRlcm4tPmlvcHRCYXNlICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pb3B0QmFzZSk7Ci0gIGludGVybi0+Y29wdCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NvcHQpOwotI2lmZGVmIEVDT0ZGXzMyCi0gIGludGVybi0+aXBkRmlyc3QgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgaW50ZXJuLT5jcGQgICAgICAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3BkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGludGVybi0+aXBkRmlyc3QgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgaW50ZXJuLT5jcGQgICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3BkKTsKLSNlbmRpZgotICBpbnRlcm4tPmlhdXhCYXNlICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pYXV4QmFzZSk7Ci0gIGludGVybi0+Y2F1eCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NhdXgpOwotICBpbnRlcm4tPnJmZEJhc2UgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yZmRCYXNlKTsKLSAgaW50ZXJuLT5jcmZkICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3JmZCk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBpbnRlcm4tPmxhbmcgICAgICAgID0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9MQU5HX0JJRykKLQkJCQkJPj4gRkRSX0JJVFMxX0xBTkdfU0hfQklHOwotICAgIGludGVybi0+Zk1lcmdlICAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRk1FUkdFX0JJRyk7Ci0gICAgaW50ZXJuLT5mUmVhZGluICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GUkVBRElOX0JJRyk7Ci0gICAgaW50ZXJuLT5mQmlnZW5kaWFuICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRyk7Ci0gICAgaW50ZXJuLT5nbGV2ZWwgICAgICA9IChleHQtPmZfYml0czJbMF0gJiBGRFJfQklUUzJfR0xFVkVMX0JJRykKLQkJCQkJPj4gRkRSX0JJVFMyX0dMRVZFTF9TSF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5sYW5nICAgICAgICA9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfTEFOR19MSVRUTEUpCi0JCQkJCT4+IEZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPmZNZXJnZSAgICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUpOwotICAgIGludGVybi0+ZlJlYWRpbiAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRlJFQURJTl9MSVRUTEUpOwotICAgIGludGVybi0+ZkJpZ2VuZGlhbiAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUpOwotICAgIGludGVybi0+Z2xldmVsICAgICAgPSAoZXh0LT5mX2JpdHMyWzBdICYgRkRSX0JJVFMyX0dMRVZFTF9MSVRUTEUpCi0JCQkJCT4+IEZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFOwotICB9Ci0gIGludGVybi0+cmVzZXJ2ZWQgPSAwOwotCi0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmVPZmZzZXQpOwotICBpbnRlcm4tPmNiTGluZSAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIGZpbGUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9mZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBGRFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGZkcl9leHQgKmV4dCA9IChzdHJ1Y3QgZmRyX2V4dCAqKSBleHRfcHRyOwotICBGRFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmFkciwgKGJmZF9ieXRlICopZXh0LT5mX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yc3MsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yc3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lzc0Jhc2UpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiU3MsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYlNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW1CYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaXN5bUJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y3N5bSwgKGJmZF9ieXRlICopZXh0LT5mX2NzeW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmVCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaWxpbmVCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNsaW5lLCAoYmZkX2J5dGUgKilleHQtPmZfY2xpbmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW9wdEJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pb3B0QmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jb3B0LCAoYmZkX2J5dGUgKilleHQtPmZfY29wdCk7Ci0jaWZkZWYgRUNPRkZfMzIKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmlwZEZpcnN0LCAoYmZkX2J5dGUgKilleHQtPmZfaXBkRmlyc3QpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+Y3BkLCAoYmZkX2J5dGUgKilleHQtPmZfY3BkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pcGRGaXJzdCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNwZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlhdXhCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaWF1eEJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y2F1eCwgKGJmZF9ieXRlICopZXh0LT5mX2NhdXgpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmZkQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX3JmZEJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y3JmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NyZmQpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgZXh0LT5mX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5sYW5nIDw8IEZEUl9CSVRTMV9MQU5HX1NIX0JJRykKLQkJCSYgRkRSX0JJVFMxX0xBTkdfQklHKQotCQkgICAgICAgfCAoaW50ZXJuLT5mTWVyZ2UgPyBGRFJfQklUUzFfRk1FUkdFX0JJRyA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmZSZWFkaW4gPyBGRFJfQklUUzFfRlJFQURJTl9CSUcgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mQmlnZW5kaWFuID8gRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHIDogMCkpOwotICAgIGV4dC0+Zl9iaXRzMlswXSA9ICgoaW50ZXJuLT5nbGV2ZWwgPDwgRkRSX0JJVFMyX0dMRVZFTF9TSF9CSUcpCi0JCSAgICAgICAmIEZEUl9CSVRTMl9HTEVWRUxfQklHKTsKLSAgICBleHQtPmZfYml0czJbMV0gPSAwOwotICAgIGV4dC0+Zl9iaXRzMlsyXSA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0LT5mX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5sYW5nIDw8IEZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRSkKLQkJCSYgRkRSX0JJVFMxX0xBTkdfTElUVExFKQotCQkgICAgICAgfCAoaW50ZXJuLT5mTWVyZ2UgPyBGRFJfQklUUzFfRk1FUkdFX0xJVFRMRSA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmZSZWFkaW4gPyBGRFJfQklUUzFfRlJFQURJTl9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mQmlnZW5kaWFuID8gRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFIDogMCkpOwotICAgIGV4dC0+Zl9iaXRzMlswXSA9ICgoaW50ZXJuLT5nbGV2ZWwgPDwgRkRSX0JJVFMyX0dMRVZFTF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIEZEUl9CSVRTMl9HTEVWRUxfTElUVExFKTsKLSAgICBleHQtPmZfYml0czJbMV0gPSAwOwotICAgIGV4dC0+Zl9iaXRzMlsyXSA9IDA7Ci0gIH0KLQotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZU9mZnNldCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lLCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotI2lmbmRlZiBNUFdfQwotCi0vKiBTd2FwIGluIHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBQRFIgKmludGVybjsKLXsKLSAgc3RydWN0IHBkcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9jb3B5OwotCi0gIG1lbXNldCAoKFBUUikgaW50ZXJuLCAwLCBzaXplb2YgKCppbnRlcm4pKTsKLQotICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgaW50ZXJuLT5pc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGludGVybi0+aWxpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgaW50ZXJuLT5yZWdtYXNrICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGludGVybi0+cmVnb2Zmc2V0ICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5pb3B0ICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBpbnRlcm4tPmZyZWdtYXNrICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGludGVybi0+ZnJlZ29mZnNldCAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVvZmZzZXQgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lcmVnICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGludGVybi0+cGNyZWcgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgaW50ZXJuLT5sbkxvdyAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBpbnRlcm4tPmxuSGlnaCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIEVDT0ZGXzY0Ci0gIGludGVybi0+Z3BfcHJvbG9ndWUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cF9ncF9wcm9sb2d1ZSk7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGludGVybi0+Z3BfdXNlZCA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9HUF9VU0VEX0JJRyk7Ci0gICAgICBpbnRlcm4tPnJlZ19mcmFtZSA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRUdfRlJBTUVfQklHKTsKLSAgICAgIGludGVybi0+cHJvZiA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9QUk9GX0JJRyk7Ci0gICAgICBpbnRlcm4tPnJlc2VydmVkID0gKCgoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFU0VSVkVEX0JJRykKLQkJCSAgIDw8IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MRUZUX0JJRykKLQkJCSAgfCAoKGV4dC0+cF9iaXRzMlswXSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcpCi0JCQkgICAgID4+IFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm4tPmdwX3VzZWQgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfR1BfVVNFRF9MSVRUTEUpOwotICAgICAgaW50ZXJuLT5yZWdfZnJhbWUgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVHX0ZSQU1FX0xJVFRMRSk7Ci0gICAgICBpbnRlcm4tPnByb2YgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUFJPRl9MSVRUTEUpOwotICAgICAgaW50ZXJuLT5yZXNlcnZlZCA9ICgoKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRVNFUlZFRF9MSVRUTEUpCi0JCQkgICA+PiBQRFJfQklUUzFfUkVTRVJWRURfU0hfTElUVExFKQotCQkJICB8ICgoZXh0LT5wX2JpdHMyWzBdICYgUERSX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSkKLQkJCSAgICAgPDwgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFKSk7Ci0gICAgfQotICBpbnRlcm4tPmxvY2Fsb2ZmID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnBfbG9jYWxvZmYpOwotI2VuZGlmICAKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFBEUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgcGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9wdHI7Ci0gIFBEUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+YWRyLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW0sIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5mcmFtZXJlZywgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPnBjcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5Mb3csIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkhpZ2gsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBFQ09GRl82NAotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW50ZXJuLT5ncF9wcm9sb2d1ZSwgKGJmZF9ieXRlICopIGV4dC0+cF9ncF9wcm9sb2d1ZSk7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dC0+cF9iaXRzMVswXSA9ICgoaW50ZXJuLT5ncF91c2VkID8gUERSX0JJVFMxX0dQX1VTRURfQklHIDogMCkKLQkJCSB8IChpbnRlcm4tPnJlZ19mcmFtZSA/IFBEUl9CSVRTMV9SRUdfRlJBTUVfQklHIDogMCkKLQkJCSB8IChpbnRlcm4tPnByb2YgPyBQRFJfQklUUzFfUFJPRl9CSUcgOiAwKQotCQkJIHwgKChpbnRlcm4tPnJlc2VydmVkCi0JCQkgICAgID4+IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MRUZUX0JJRykKLQkJCSAgICAmIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcpKTsKLSAgICAgIGV4dC0+cF9iaXRzMlswXSA9ICgoaW50ZXJuLT5yZXNlcnZlZCA8PCBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHKQotCQkJICYgUERSX0JJVFMyX1JFU0VSVkVEX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0LT5wX2JpdHMxWzBdID0gKChpbnRlcm4tPmdwX3VzZWQgPyBQRFJfQklUUzFfR1BfVVNFRF9MSVRUTEUgOiAwKQotCQkJIHwgKGludGVybi0+cmVnX2ZyYW1lID8gUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUgOiAwKQotCQkJIHwgKGludGVybi0+cHJvZiA/IFBEUl9CSVRTMV9QUk9GX0xJVFRMRSA6IDApCi0JCQkgfCAoKGludGVybi0+cmVzZXJ2ZWQgPDwgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRSkKLQkJCSAgICAmIFBEUl9CSVRTMV9SRVNFUlZFRF9MSVRUTEUpKTsKLSAgICAgIGV4dC0+cF9iaXRzMlswXSA9ICgoaW50ZXJuLT5yZXNlcnZlZCA+PgotCQkJICBQRFJfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUpCi0JCQkgJiBQRFJfQklUUzJfUkVTRVJWRURfTElUVExFKTsKLSAgICB9Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBpbnRlcm4tPmxvY2Fsb2ZmLCAoYmZkX2J5dGUgKikgZXh0LT5wX2xvY2Fsb2ZmKTsKLSNlbmRpZiAgCi0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLSNlbHNlIC8qIE1QV19DICovCi0vKiBTYW1lIHJvdXRpbmVzLCBidXQgd2l0aCBFQ09GRl82NCBjb2RlIHJlbW92ZWQsIHNvIF4mJSQjJiEgTVBXIEMgZG9lc24ndAotICAgY29ycnVwdCBpdHNlbGYgYW5kIHRoZW4gZnJlYWsgb3V0LiAqLwotLyogU3dhcCBpbiB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgUERSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBwZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfY29weTsKLSAgCi0gIGludGVybi0+YWRyICAgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9hZHIpOwotICBpbnRlcm4tPmlzeW0gICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgaW50ZXJuLT5pbGluZSAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBpbnRlcm4tPnJlZ21hc2sgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgaW50ZXJuLT5yZWdvZmZzZXQgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdvZmZzZXQpOwotICBpbnRlcm4tPmlvcHQgICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGludGVybi0+ZnJlZ21hc2sgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgaW50ZXJuLT5mcmVnb2Zmc2V0ICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZW9mZnNldCAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVyZWcgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgaW50ZXJuLT5wY3JlZyAgICAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBpbnRlcm4tPmxuTG93ICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGludGVybi0+bG5IaWdoICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuSGlnaCk7Ci0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUERSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBwZHJfZXh0ICpleHQgPSAoc3RydWN0IHBkcl9leHQgKikgZXh0X3B0cjsKLSAgUERSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5hZHIsIChiZmRfYnl0ZSAqKWV4dC0+cF9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXN5bSwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmUsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW9wdCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmFtZW9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmZyYW1lcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+cGNyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkxvdywgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuSGlnaCwgKGJmZF9ieXRlICopZXh0LT5wX2xuSGlnaCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBNUFdfQyAqLwotCi0vKiBTd2FwIGluIGEgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIFNZTVIgKmludGVybjsKLXsKLSAgc3RydWN0IHN5bV9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBzeW1fZXh0ICopIGV4dF9jb3B5OwotICAKLSAgaW50ZXJuLT5pc3MgICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnNfaXNzKTsKLSAgaW50ZXJuLT52YWx1ZSAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5zX3ZhbHVlKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGludGVybi0+c3QgICAgICAgICAgPSAgKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TVF9CSUcpCi0JCQkJCSAgID4+IFNZTV9CSVRTMV9TVF9TSF9CSUc7Ci0gICAgaW50ZXJuLT5zYyAgICAgICAgICA9ICgoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NDX0JJRykKLQkJCQkJICAgPDwgU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHKQotCQkJfCAoKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9TQ19CSUcpCi0JCQkJCSAgID4+IFNZTV9CSVRTMl9TQ19TSF9CSUcpOwotICAgIGludGVybi0+cmVzZXJ2ZWQgICAgPSAwICE9IChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfUkVTRVJWRURfQklHKTsKLSAgICBpbnRlcm4tPmluZGV4ICAgICAgID0gKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfSU5ERVhfQklHKQotCQkJCQkgICA8PCBTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQl8IChleHQtPnNfYml0czNbMF0gPDwgU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHKQotCQkJfCAoZXh0LT5zX2JpdHM0WzBdIDw8IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5zdCAgICAgICAgICA9ICAoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NUX0xJVFRMRSkKLQkJCQkJICAgPj4gU1lNX0JJVFMxX1NUX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnNjICAgICAgICAgID0gKChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU0NfTElUVExFKQotCQkJCQkgICA+PiBTWU1fQklUUzFfU0NfU0hfTElUVExFKQotCQkJfCAoKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9TQ19MSVRUTEUpCi0JCQkJCSAgIDw8IFNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5yZXNlcnZlZCAgICA9IDAgIT0gKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUpOwotICAgIGludGVybi0+aW5kZXggICAgICAgPSAoKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9JTkRFWF9MSVRUTEUpCi0JCQkJCSAgID4+IFNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUpCi0JCQl8IChleHQtPnNfYml0czNbMF0gPDwgU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFKQotCQkJfCAoKHVuc2lnbmVkIGludCkgZXh0LT5zX2JpdHM0WzBdCi0JCQkgICA8PCBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUpOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFNZTVIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHN5bV9leHQgKmV4dCA9IChzdHJ1Y3Qgc3ltX2V4dCAqKSBleHRfcHRyOwotICBTWU1SIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzcywgKGJmZF9ieXRlICopZXh0LT5zX2lzcyk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+dmFsdWUsIChiZmRfYnl0ZSAqKWV4dC0+c192YWx1ZSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBleHQtPnNfYml0czFbMF0gPSAoKChpbnRlcm4tPnN0IDw8IFNZTV9CSVRTMV9TVF9TSF9CSUcpCi0JCQkmIFNZTV9CSVRTMV9TVF9CSUcpCi0JCSAgICAgICB8ICgoaW50ZXJuLT5zYyA+PiBTWU1fQklUUzFfU0NfU0hfTEVGVF9CSUcpCi0JCQkgICYgU1lNX0JJVFMxX1NDX0JJRykpOwotICAgIGV4dC0+c19iaXRzMlswXSA9ICgoKGludGVybi0+c2MgPDwgU1lNX0JJVFMyX1NDX1NIX0JJRykKLQkJCSYgU1lNX0JJVFMyX1NDX0JJRykKLQkJICAgICAgIHwgKGludGVybi0+cmVzZXJ2ZWQgPyBTWU1fQklUUzJfUkVTRVJWRURfQklHIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRykKLQkJCSAgJiBTWU1fQklUUzJfSU5ERVhfQklHKSk7Ci0gICAgZXh0LT5zX2JpdHMzWzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHKSAmIDB4ZmY7Ci0gICAgZXh0LT5zX2JpdHM0WzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHKSAmIDB4ZmY7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0LT5zX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5zdCA8PCBTWU1fQklUUzFfU1RfU0hfTElUVExFKQotCQkJJiBTWU1fQklUUzFfU1RfTElUVExFKQotCQkgICAgICAgfCAoKGludGVybi0+c2MgPDwgU1lNX0JJVFMxX1NDX1NIX0xJVFRMRSkKLQkJCSAgJiBTWU1fQklUUzFfU0NfTElUVExFKSk7Ci0gICAgZXh0LT5zX2JpdHMyWzBdID0gKCgoaW50ZXJuLT5zYyA+PiBTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUpCi0JCQkmIFNZTV9CSVRTMl9TQ19MSVRUTEUpCi0JCSAgICAgICB8IChpbnRlcm4tPnJlc2VydmVkID8gU1lNX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5pbmRleCA8PCBTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFKQotCQkJICAmIFNZTV9CSVRTMl9JTkRFWF9MSVRUTEUpKTsKLSAgICBleHQtPnNfYml0czNbMF0gPSAoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUpICYgMHhmZjsKLSAgICBleHQtPnNfYml0czRbMF0gPSAoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUpICYgMHhmZjsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGFuIGV4dGVybmFsIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9leHRfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBFWFRSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBleHRfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgZXh0X2V4dCAqKSBleHRfY29weTsKLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgaW50ZXJuLT5qbXB0YmwgICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfSk1QVEJMX0JJRyk7Ci0gICAgaW50ZXJuLT5jb2JvbF9tYWluICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfQ09CT0xfTUFJTl9CSUcpOwotICAgIGludGVybi0+d2Vha2V4dCAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX1dFQUtFWFRfQklHKTsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPmptcHRibCAgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9KTVBUQkxfTElUVExFKTsKLSAgICBpbnRlcm4tPmNvYm9sX21haW4gID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT53ZWFrZXh0ICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfV0VBS0VYVF9MSVRUTEUpOwotICB9Ci0gIGludGVybi0+cmVzZXJ2ZWQgPSAwOwotCi0jaWZkZWYgRUNPRkZfMzIKLSAgaW50ZXJuLT5pZmQgICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSAgaW50ZXJuLT5pZmQgICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0KLSAgZWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsICZleHQtPmVzX2FzeW0sICZpbnRlcm4tPmFzeW0pOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhbiBleHRlcm5hbCBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZXh0X291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRVhUUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgZXh0X2V4dCAqZXh0ID0gKHN0cnVjdCBleHRfZXh0ICopIGV4dF9wdHI7Ci0gIEVYVFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGV4dC0+ZXNfYml0czFbMF0gPSAoKGludGVybi0+am1wdGJsID8gRVhUX0JJVFMxX0pNUFRCTF9CSUcgOiAwKQotCQkJfCAoaW50ZXJuLT5jb2JvbF9tYWluID8gRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHIDogMCkKLQkJCXwgKGludGVybi0+d2Vha2V4dCA/IEVYVF9CSVRTMV9XRUFLRVhUX0JJRyA6IDApKTsKLSAgICBleHQtPmVzX2JpdHMyWzBdID0gMDsKLSNpZmRlZiBFQ09GRl82NAotICAgIGV4dC0+ZXNfYml0czJbMV0gPSAwOwotICAgIGV4dC0+ZXNfYml0czJbMl0gPSAwOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgZXh0LT5lc19iaXRzMVswXSA9ICgoaW50ZXJuLT5qbXB0YmwgPyBFWFRfQklUUzFfSk1QVEJMX0xJVFRMRSA6IDApCi0JCQl8IChpbnRlcm4tPmNvYm9sX21haW4gPyBFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUgOiAwKQotCQkJfCAoaW50ZXJuLT53ZWFrZXh0ID8gRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFIDogMCkpOwotICAgIGV4dC0+ZXNfYml0czJbMF0gPSAwOwotI2lmZGVmIEVDT0ZGXzY0Ci0gICAgZXh0LT5lc19iaXRzMlsxXSA9IDA7Ci0gICAgZXh0LT5lc19iaXRzMlsyXSA9IDA7Ci0jZW5kaWYKLSAgfQotCi0jaWZkZWYgRUNPRkZfMzIKLSAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT5pZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGJmZF9oX3B1dF9zaWduZWRfMzIgKGFiZmQsIGludGVybi0+aWZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLQotICBlY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZpbnRlcm4tPmFzeW0sICZleHQtPmVzX2FzeW0pOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGEgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcmZkX2luIChhYmZkLCBleHRfcHRyLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9wdHI7Ci0gICAgIFJGRFQgKmludGVybjsKLXsKLSAgc3RydWN0IHJmZF9leHQgKmV4dCA9IChzdHJ1Y3QgcmZkX2V4dCAqKSBleHRfcHRyOwotCi0gICppbnRlcm4gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cmZkKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9yZmRfb3V0IChhYmZkLCBpbnRlcm4sIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUkZEVCAqaW50ZXJuOwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHJmZF9leHQgKmV4dCA9IChzdHJ1Y3QgcmZkX2V4dCAqKSBleHRfcHRyOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKmludGVybiwgKGJmZF9ieXRlICopZXh0LT5yZmQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGFuIG9wdGltaXphdGlvbiBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9vcHRfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBPUFRSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBvcHRfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3Qgb3B0X2V4dCAqKSBleHRfY29weTsKLQotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBpbnRlcm4tPm90ID0gZXh0LT5vX2JpdHMxWzBdOwotICAgICAgaW50ZXJuLT52YWx1ZSA9ICgoKHVuc2lnbmVkIGludCkgZXh0LT5vX2JpdHMyWzBdCi0JCQk8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcpCi0JCSAgICAgICB8ICgodW5zaWduZWQgaW50KSBleHQtPm9fYml0czNbMF0KLQkJCSAgPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHKQotCQkgICAgICAgfCAoKHVuc2lnbmVkIGludCkgZXh0LT5vX2JpdHM0WzBdCi0JCQkgIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybi0+b3QgPSBleHQtPm9fYml0czFbMF07Ci0gICAgICBpbnRlcm4tPnZhbHVlID0gKChleHQtPm9fYml0czJbMF0gPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFKQotCQkgICAgICAgfCAoZXh0LT5vX2JpdHMzWzBdIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRSkKLQkJICAgICAgIHwgKGV4dC0+b19iaXRzNFswXSA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUpKTsKLSAgICB9Ci0KLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCksCi0JCQkgICAmZXh0LT5vX3JuZHgsICZpbnRlcm4tPnJuZHgpOwotCi0gIGludGVybi0+b2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5vX29mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGFuIG9wdGltaXphdGlvbiBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9vcHRfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBPUFRSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBvcHRfZXh0ICpleHQgPSAoc3RydWN0IG9wdF9leHQgKikgZXh0X3B0cjsKLSAgT1BUUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLQotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHQtPm9fYml0czFbMF0gPSBpbnRlcm4tPm90OwotICAgICAgZXh0LT5vX2JpdHMyWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPm9fYml0czNbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+b19iaXRzNFswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfQklHOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dC0+b19iaXRzMVswXSA9IGludGVybi0+b3Q7Ci0gICAgICBleHQtPm9fYml0czJbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+b19iaXRzM1swXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5vX2JpdHM0WzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9MSVRUTEU7Ci0gICAgfQotCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSwKLQkJCSAgICAmaW50ZXJuLT5ybmR4LCAmZXh0LT5vX3JuZHgpOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT52YWx1ZSwgKGJmZF9ieXRlICopIGV4dC0+b19vZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGEgZGVuc2UgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZG5yX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgRE5SICppbnRlcm47Ci17Ci0gIHN0cnVjdCBkbnJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgZG5yX2V4dCAqKSBleHRfY29weTsKLQotICBpbnRlcm4tPnJmZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZF9yZmQpOwotICBpbnRlcm4tPmluZGV4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5kX2luZGV4KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSBkZW5zZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9kbnJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBETlIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGRucl9leHQgKmV4dCA9IChzdHJ1Y3QgZG5yX2V4dCAqKSBleHRfcHRyOwotICBETlIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZF9yZmQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW5kZXgsIChiZmRfYnl0ZSAqKSBleHQtPmRfaW5kZXgpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1iZmQuaCBiL2JmZC9lbGYtYmZkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjY3YmQuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZi1iZmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNDcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgRUxGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCRUxGX0hfCi0jZGVmaW5lIF9MSUJFTEZfSF8gMQotCi0jaW5jbHVkZSAiZWxmL2NvbW1vbi5oIgotI2luY2x1ZGUgImVsZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImVsZi9leHRlcm5hbC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogSWYgc2l6ZSBpc24ndCBzcGVjaWZpZWQgYXMgNjQgb3IgMzIsIE5BTUUgbWFjcm8gc2hvdWxkIGZhaWwuICAqLwotI2lmbmRlZiBOQU1FCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBOQU1FKHgseSkgQ0FUNCh4LDY0LF8seSkKLSNlbmRpZgotI2lmIEFSQ0hfU0laRT09MzIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCwzMixfLHkpCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE5BTUUKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCxOT1NJWkUsXyx5KQotI2VuZGlmCi0KLSNkZWZpbmUgRWxmTkFNRShYKQlOQU1FKEVsZixYKQotI2RlZmluZSBlbGZOQU1FKFgpCU5BTUUoZWxmLFgpCi0KLS8qIEluZm9ybWF0aW9uIGhlbGQgZm9yIGFuIEVMRiBzeW1ib2wuICBUaGUgZmlyc3QgZmllbGQgaXMgdGhlCi0gICBjb3JyZXNwb25kaW5nIGFzeW1ib2wuICBFdmVyeSBzeW1ib2wgaXMgYW4gRUxGIGZpbGUgaXMgYWN0dWFsbHkgYQotICAgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYWx0aG91Z2ggaXQgaXMgb2Z0ZW4gaGFuZGxlZCBhcyBhCi0gICBwb2ludGVyIHRvIGFuIGFzeW1ib2wuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgQkZEIHN5bWJvbC4gICovCi0gIGFzeW1ib2wgc3ltYm9sOwotICAvKiBFTEYgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgRWxmX0ludGVybmFsX1N5bSBpbnRlcm5hbF9lbGZfc3ltOwotICAvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaHBwYV9hcmdfcmVsb2M7Ci0gICAgICBQVFIgbWlwc19leHRyOwotICAgICAgUFRSIGFueTsKLSAgICB9Ci0gIHRjX2RhdGE7Ci0KLSAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgZnJvbSBhbiBFbGZfSW50ZXJuYWxfVmVyc3ltCi0gICAgIHN0cnVjdHVyZSBpbiBhIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24uICBJdCBpcyB6ZXJvIGlmIHRoZXJlIGlzIG5vCi0gICAgIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotCi19IGVsZl9zeW1ib2xfdHlwZTsKLQwKLS8qIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICBUaGlzIGlzIGluaXRpYWxpemVkIHRvIC0xLiAgSXQgaXMKLSAgICAgc2V0IHRvIC0yIGlmIHRoZSBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIFN5bWJvbCBzaXplLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIC8qIFN5bWJvbCBpbmRleCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgSW5pdGlhbGl6ZWQgdG8gLTEsIGFuZCByZW1haW5zCi0gICAgIC0xIGlmIHRoaXMgaXMgbm90IGEgZHluYW1pYyBzeW1ib2wuICAqLwotICBsb25nIGR5bmluZHg7Ci0KLSAgLyogU3RyaW5nIHRhYmxlIGluZGV4IGluIC5keW5zdHIgaWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5zdHJfaW5kZXg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGlzCi0gICAgIGZpZWxkIHBvaW50cyB0byBhIGRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUsIGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gIE90aGVyd2lzZSBpdCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgcmVxdWlyZXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZQotICAgICBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZCB1c2VzIHRoaXMgZmllbGQgdG8gdHJhY2sgdXNhZ2UgYW5kCi0gICAgIGZpbmFsIG9mZnNldC4gIFdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvIGRvY3VtZW50Ci0gICAgIHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZCBzaG91bGQgYmUKLSAgICAgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2ggcG9pbnQgdGhlCi0gICAgIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiB0aGlzIGZpZWxkIGlzIC0xLAotICAgICB0aGVuIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHJlZmNvdW50OwotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgfSBnb3Q7Ci0KLSAgLyogU2FtZSwgYnV0IHRyYWNrcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWZjb3VudDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0OwotICAgIH0gcGx0OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gdGhlIGxpbmtlciBjcmVhdGVkIHNlY3Rpb25zLCB0aGUgcHJvY2Vzc29yCi0gICAgIHNwZWNpZmljIGJhY2tlbmQgdXNlcyB0aGlzIGZpZWxkIHRvIG1hcCB0aGUgZmllbGQgaW50byB0aGUgb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXI7Ci0KLSAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gIHsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEKLSAgICAgICByZWd1bGFyIG9iamVjdC4gIEl0IHBvaW50cyB0byB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiByZWFkIGluCi0gICAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QuICAqLwotICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnZlcmRlZjsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0gICAgICAgb2JqZWN0LiAgSXQgaXMgc2V0IHVwIGluIHNpemVfZHluYW1pY19zZWN0aW9ucy4gIEl0IHBvaW50cyB0bwotICAgICAgIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdlIHNob3VsZCB3cml0ZSBvdXQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnRyZWU7Ci0gIH0gdmVyaW5mbzsKLQotICAvKiBWaXJ0dWFsIHRhYmxlIGVudHJ5IHVzZSBpbmZvcm1hdGlvbi4gIFRoaXMgYXJyYXkgaXMgbm9taW5hbGx5IG9mIHNpemUKLSAgICAgc2l6ZS9zaXplb2YodGFyZ2V0X3ZvaWRfcG9pbnRlciksIHRob3VnaCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gYXNzdW1lCi0gICAgIGFuZCB0cmFjayBhIHNpemUgd2hpbGUgdGhlIHN5bWJvbCBpcyBzdGlsbCB1bmRlZmluZWQuICBJdCBpcyBpbmRleGVkCi0gICAgIHZpYSBvZmZzZXQvc2l6ZW9mKHRhcmdldF92b2lkX3BvaW50ZXIpLiAgKi8KLSAgc2l6ZV90IHZ0YWJsZV9lbnRyaWVzX3NpemU7Ci0gIGJvb2xlYW4gKnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0KLSAgLyogVmlydHVhbCB0YWJsZSBkZXJpdmF0aW9uIGluZm8uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqdnRhYmxlX3BhcmVudDsKLQotICAvKiBTeW1ib2wgdHlwZSAoU1RUX05PVFlQRSwgU1RUX09CSkVDVCwgZXRjLikuICAqLwotICBjaGFyIHR5cGU7Ci0KLSAgLyogU3ltYm9sIHN0X290aGVyIHZhbHVlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvdGhlcjsKLQotICAvKiBIYXNoIHZhbHVlIG9mIHRoZSBuYW1lIGNvbXB1dGVkIHVzaW5nIHRoZSBFTEYgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgZWxmX2hhc2hfdmFsdWU7Ci0KLSAgLyogU29tZSBmbGFnczsgbGVnYWwgdmFsdWVzIGZvbGxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGVsZl9saW5rX2hhc2hfZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSIDAxCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSIDAyCi0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMgMDQKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyAwMTAKLSAgLyogU3ltYm9sIGhhcyBhIG5vbi13ZWFrIHJlZmVyZW5jZSBmcm9tIGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsgMDIwCi0gIC8qIER5bmFtaWMgc3ltYm9sIGhhcyBiZWVuIGFkanVzdGQuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RZTkFNSUNfQURKVVNURUQgMDQwCi0gIC8qIFN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX05FRURTX0NPUFkgMDEwMAotICAvKiBTeW1ib2wgbmVlZHMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIDAyMDAKLSAgLyogU3ltYm9sIGFwcGVhcnMgaW4gYSBub24tRUxGIGlucHV0IGZpbGUuICAqLwotI2RlZmluZSBFTEZfTElOS19OT05fRUxGIDA0MDAKLSAgLyogU3ltYm9sIHNob3VsZCBiZSBtYXJrZWQgYXMgaGlkZGVuIGluIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSElEREVOIDAxMDAwCi0gIC8qIFN5bWJvbCB3YXMgZm9yY2VkIHRvIGxvY2FsIHNjb3BlIGR1ZSB0byBhIHZlcnNpb24gc2NyaXB0IGZpbGUuICAqLwotI2RlZmluZSBFTEZfTElOS19GT1JDRURfTE9DQUwgMDIwMDAKLSAgLyogU3ltYm9sIHdhcyBtYXJrZWQgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTUFSSyAwNDAwMAotfTsKLQotLyogRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogV2hldGhlciB3ZSBoYXZlIGNyZWF0ZWQgdGhlIHNwZWNpYWwgZHluYW1pYyBzZWN0aW9ucyByZXF1aXJlZAotICAgICB3aGVuIGxpbmtpbmcgYWdhaW5zdCBvciBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotICAvKiBUaGUgQkZEIHVzZWQgdG8gaG9sZCBzcGVjaWFsIHNlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4KLSAgICAgVGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBCRkQgZm91bmQgd2hpY2ggcmVxdWlyZXMgdGhlc2Ugc2VjdGlvbnMgdG8KLSAgICAgYmUgY3JlYXRlZC4gICovCi0gIGJmZCAqZHlub2JqOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgZm91bmQgaW4gdGhlIGxpbmsgd2hpY2ggbXVzdCBiZSBwdXQgaW50bwotICAgICB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBkeW5zeW1jb3VudDsKLSAgLyogVGhlIHN0cmluZyB0YWJsZSBvZiBkeW5hbWljIHN5bWJvbHMsIHdoaWNoIGJlY29tZXMgdGhlIC5keW5zdHIKLSAgICAgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmR5bnN0cjsKLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlIGluIHRoZSAuaGFzaCBzZWN0aW9uLgotICAgICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBidWNrZXRjb3VudDsKLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBEVF9ORUVERUQgbmFtZXMgZm91bmQgaW4gZHluYW1pYyBvYmplY3RzCi0gICAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0gIC8qIFRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhnb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0MCi0vKiBDb25zdGFudCBpbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgYmFja2VuZC4gICovCi0KLXN0cnVjdCBlbGZfc2l6ZV9pbmZvIHsKLSAgdW5zaWduZWQgY2hhciBzaXplb2ZfZWhkciwgc2l6ZW9mX3BoZHIsIHNpemVvZl9zaGRyOwotICB1bnNpZ25lZCBjaGFyIHNpemVvZl9yZWwsIHNpemVvZl9yZWxhLCBzaXplb2Zfc3ltLCBzaXplb2ZfZHluLCBzaXplb2Zfbm90ZTsKLQotICB1bnNpZ25lZCBjaGFyIGFyY2hfc2l6ZSwgZmlsZV9hbGlnbjsKLSAgdW5zaWduZWQgY2hhciBlbGZjbGFzcywgZXZfY3VycmVudDsKLSAgaW50ICgqd3JpdGVfb3V0X3BoZHJzKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7Ci0gIGJvb2xlYW4gKCp3cml0ZV9zaGRyc19hbmRfZWhkcikgUEFSQU1TICgoYmZkICopKTsKLSAgdm9pZCAoKndyaXRlX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotICB2b2lkICgqc3dhcF9zeW1ib2xfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBQVFIpKTsKLSAgYm9vbGVhbiAoKnNsdXJwX3JlbG9jX3RhYmxlKQotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIGxvbmcgKCpzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci19OwotCi0jZGVmaW5lIGVsZl9zeW1ib2xfZnJvbShBQkZELFMpIFwKLQkoKChTKS0+dGhlX2JmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyIFwKLQkgICYmIChTKS0+dGhlX2JmZC0+dGRhdGEuZWxmX29ial9kYXRhICE9IDApIFwKLQkgPyAoZWxmX3N5bWJvbF90eXBlICopIChTKSBcCi0JIDogMCkKLQotc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEKLXsKLSAgLyogVGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0KLSAgLyogVGhlIEVMRiBtYWNoaW5lIGNvZGUgKEVNX3h4eHgpIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBpbnQgZWxmX21hY2hpbmVfY29kZTsKLQotICAvKiBUaGUgbWF4aW11bSBwYWdlIHNpemUgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGJmZF92bWEgbWF4cGFnZXNpemU7Ci0KLSAgLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBsaW5rZXIgc2hvdWxkIGFjdCBsaWtlIGNvbGxlY3QgYW5kIGdhdGhlcgotICAgICBnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLiAgVGhpcyBpcyB0cnVlIGZvcgotICAgICBNSVBTIEVMRiBiZWNhdXNlIHRoZSBJcml4IDUgdG9vbHMgY2FuIG5vdCBoYW5kbGUgdGhlIC5pbml0Ci0gICAgIHNlY3Rpb24uICAqLwotICBib29sZWFuIGNvbGxlY3Q7Ci0KLSAgLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBsaW5rZXIgc2hvdWxkIGlnbm9yZSBjaGFuZ2VzIHRvIHRoZSB0eXBlIG9mIGEKLSAgICAgc3ltYm9sLiAgVGhpcyBpcyB0cnVlIGZvciBNSVBTIEVMRiBiZWNhdXNlIHNvbWUgSXJpeCA1IG9iamVjdHMKLSAgICAgcmVjb3JkIHVuZGVmaW5lZCBmdW5jdGlvbnMgYXMgU1RUX09CSkVDVCBhbHRob3VnaCB0aGUgZGVmaW5pdGlvbnMKLSAgICAgYXJlIFNUVF9GVU5DLiAgKi8KLSAgYm9vbGVhbiB0eXBlX2NoYW5nZV9vazsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBhbiBFTEYgUkVMQSByZWxvY2F0aW9uIHRvIGEgQkZEIGFyZWxlbnQKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdm9pZCAoKmVsZl9pbmZvX3RvX2hvd3RvKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCSAgICAgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gdHJhbnNsYXRlIGFuIEVMRiBSRUwgcmVsb2NhdGlvbiB0byBhIEJGRCBhcmVsZW50Ci0gICAgIHN0cnVjdHVyZS4gICovCi0gIHZvaWQgKCplbGZfaW5mb190b19ob3d0b19yZWwpIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCSBFbGZfSW50ZXJuYWxfUmVsICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbCB3aGVuCi0gICAgIHBhcnRpdGlvbmluZyB0aGUgc3ltYm9sIHRhYmxlIGludG8gbG9jYWwgYW5kIGdsb2JhbCBzeW1ib2xzLgotICAgICBUaGlzIHNob3VsZCBiZSBOVUxMIGZvciBtb3N0IHRhcmdldHMsIGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QKLSAgICAgdGhpbmcgd2lsbCBiZSBkb25lLiAgTUlQUyBFTEYsIGF0IGxlYXN0IG9uIHRoZSBJcml4IDUsIGhhcwotICAgICBzcGVjaWFsIHJlcXVpcmVtZW50cy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIGhvb2tzIHdoaWNoIGFyZSBjYWxsZWQgb25seSBpZiB0aGV5Ci0gICAgIGFyZSBub3QgTlVMTC4gICovCi0KLSAgLyogQSBmdW5jdGlvbiB0byBwZXJtaXQgYSBiYWNrZW5kIHNwZWNpZmljIGNoZWNrIG9uIHdoZXRoZXIgYQotICAgICBwYXJ0aWN1bGFyIEJGRCBmb3JtYXQgaXMgcmVsZXZhbnQgZm9yIGFuIG9iamVjdCBmaWxlLCBhbmQgdG8KLSAgICAgcGVybWl0IHRoZSBiYWNrZW5kIHRvIHNldCBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIGl0IHdpc2hlcy4gIFdoZW4KLSAgICAgdGhpcyBpcyBjYWxsZWQgZWxmX2VsZmhlYWRlciBpcyBzZXQsIGJ1dCBhbnl0aGluZyBlbHNlIHNob3VsZCBiZQotICAgICB1c2VkIHdpdGggY2F1dGlvbi4gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIGNoZWNrX2Zvcm1hdAotICAgICByb3V0aW5lIHdpbGwgcmV0dXJuIGEgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCBlcnJvci4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgc3ltYm9sIHByb2Nlc3Npbmcgd2hlbiByZWFkaW5nIHRoZQotICAgICBFTEYgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyB3aGVyZSBhbnkgcHJvY2Vzc29yLXNwZWNpZmljIHNwZWNpYWwKLSAgICAgc2VjdGlvbiBpbmRpY2VzIGFyZSBoYW5kbGVkLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBkbyBhZGRpdGlvbmFsIHN5bWJvbCBwcm9jZXNzaW5nIGFmdGVyIHJlYWRpbmcgdGhlCi0gICAgIGVudGlyZSBFTEYgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkgIGVsZl9zeW1ib2xfdHlwZSAqLAotCQkJCQkJCSAgdW5zaWduZWQgaW50KSk7Ci0KLSAgIC8qIEEgZnVuY3Rpb24gdG8gc2V0IHRoZSB0eXBlIG9mIHRoZSBpbmZvIGZpZWxkLiAgUHJvY2Vzc29yLXNwZWNpZmljCi0gICAgIHR5cGVzIHNob3VsZCBiZSBoYW5kbGVkIGhlcmUuICovCi0gIGludCAoKmVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSkgUEFSQU1TICgoIEVsZl9JbnRlcm5hbF9TeW0gKiwgaW50KSk7IAotIAotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBvbiB0aGUgRUxGIHNlY3Rpb24gaGVhZGVyCi0gICAgIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZmxhZ3MgYW5kCi0gICAgIHR5cGUgZmllbGRzIGZvciBzb21lIHNlY3Rpb25zLCBvciB0byBhY3R1YWxseSB3cml0ZSBvdXQgZGF0YSBmb3IKLSAgICAgdW51c3VhbCBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGhhbmRsZSB1bnVzdWFsIHNlY3Rpb24gdHlwZXMgd2hlbiBjcmVhdGluZyBCRkQKLSAgICAgc2VjdGlvbnMgZnJvbSBFTEYgc2VjdGlvbnMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCSAgICBjaGFyICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIHNldCB1cCB0aGUgRUxGIHNlY3Rpb24gaGVhZGVyIGZvciBhIEJGRCBzZWN0aW9uIGluCi0gICAgIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIGl0IG91dC4gIFRoaXMgaXMgd2hlcmUgdGhlIGZsYWdzIGFuZCB0eXBlCi0gICAgIGZpZWxkcyBhcmUgc2V0IGZvciB1bnVzdWFsIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosCi0JCQkJCQlhc2VjdGlvbiAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBnZXQgdGhlIEVMRiBzZWN0aW9uIGluZGV4IGZvciBhIEJGRCBzZWN0aW9uLiAgSWYKLSAgICAgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBzZWN0aW9uIHdhcyBmb3VuZC4gIElmIGl0IGlzIGEgbm9ybWFsIEVMRgotICAgICBzZWN0aW9uLCAqUkVUVkFMIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZC4gIElmIGl0IGlzIG5vdCBhIG5vcm1hbAotICAgICBFTEYgc2VjdGlvbiAqUkVUVkFMIHNob3VsZCBiZSBzZXQgdG8gdGhlIFNITl94eHh4IGluZGV4LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbikKLSAgICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKnJldHZhbCkpOwotCi0gIC8qIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIGl0IGlzIGNhbGxlZCBieSB0aGUgYWRkX3N5bWJvbHMgcGhhc2UKLSAgICAgb2YgYSBsaW5rIGp1c3QgYmVmb3JlIGFkZGluZyBhIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCi0gICAgIHRhYmxlLiAgSXQgbWF5IG1vZGlmeSBhbnkgb2YgdGhlIGZpZWxkcyBhcyBpdCB3aXNoZXMuICBJZiAqTkFNRQotICAgICBpcyBzZXQgdG8gTlVMTCwgdGhlIHN5bWJvbCB3aWxsIGJlIHNraXBwZWQgcmF0aGVyIHRoYW4gYmVpbmcKLSAgICAgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgICBoYW5kbGluZyBhbGwgcHJvY2Vzc29yIGRlcGVuZGVudCBzeW1ib2wgYmluZGluZ3MgYW5kIHNlY3Rpb24KLSAgICAgaW5kaWNlcywgYW5kIG11c3Qgc2V0IGF0IGxlYXN0ICpGTEFHUyBhbmQgKlNFQyBmb3IgZWFjaCBwcm9jZXNzb3IKLSAgICAgZGVwZW5kZW50IGNhc2U7IGZhaWx1cmUgdG8gZG8gc28gd2lsbCBjYXVzZSBhIGxpbmsgZXJyb3IuICAqLwotICBib29sZWFuICgqZWxmX2FkZF9zeW1ib2xfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBjb25zdCBjaGFyICoqbmFtZSwKLQkgICAgIGZsYWd3b3JkICpmbGFncywgYXNlY3Rpb24gKipzZWMsIGJmZF92bWEgKnZhbHVlKSk7Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgaXQgaXMgY2FsbGVkIGJ5IHRoZSBlbGZfbGlua19vdXRwdXRfc3ltCi0gICAgIHBoYXNlIG9mIGEgbGluayBmb3IgZWFjaCBzeW1ib2wgd2hpY2ggd2lsbCBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqLAotCSAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci0KLSAgLyogVGhlIENSRUFURV9EWU5BTUlDX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIHRoZSBmaXJzdCB0aW1lIGl0IGVuY291bnRlcnMgYSBkeW5hbWljIG9iamVjdCBpbiB0aGUgbGluay4KLSAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGNyZWF0ZSBhbnkgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMKLSAgICAgbGlua2luZy4gIFRoZSBBQkZEIGFyZ3VtZW50IGlzIGEgZHluYW1pYyBvYmplY3QuICBUaGUgLmludGVycCwKLSAgICAgLmR5bmFtaWMsIC5keW5zeW0sIC5keW5zdHIsIGFuZCAuaGFzaCBmdW5jdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgICAgY3JlYXRlZCwgYW5kIHRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgc2VjdGlvbiBmbGFncyBpZgotICAgICBkZXNpcmVkLiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vcm1hbGx5IGNyZWF0ZSB0aGUgLmdvdCBhbmQgLnBsdAotICAgICBzZWN0aW9ucywgYnV0IGRpZmZlcmVudCBiYWNrZW5kcyBoYXZlIGRpZmZlcmVudCByZXF1aXJlbWVudHMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi0gIC8qIFRoZSBDSEVDS19SRUxPQ1MgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhZGRfc3ltYm9scyBwaGFzZSBvZgotICAgICB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgSXQgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggc2VjdGlvbiB3aXRoCi0gICAgIHJlbG9jcyBvZiBhbiBvYmplY3QgZmlsZSwganVzdCBhZnRlciB0aGUgc3ltYm9scyBmb3IgdGhlIG9iamVjdAotICAgICBmaWxlIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlCi0gICAgIGZ1bmN0aW9uIG11c3QgbG9vayB0aHJvdWdoIHRoZSByZWxvY3MgYW5kIGRvIGFueSBzcGVjaWFsIGhhbmRsaW5nCi0gICAgIHJlcXVpcmVkLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgYWxsb2NhdGluZyBzcGFjZSBpbiB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZSwgYW5kIHBlcmhhcHMgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSByZWxvYy4gIFRoZQotICAgICByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgICAgemVyby4gICovCi0gIGJvb2xlYW4gKCpjaGVja19yZWxvY3MpCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKm8sCi0JICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci0KLSAgLyogVGhlIEFESlVTVF9EWU5BTUlDX1NZTUJPTCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBmb3IgZXZlcnkgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQKLSAgICAgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZQotICAgICBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiwgYnV0IGJlZm9yZSB0aGUgU0laRV9EWU5BTUlDX1NFQ1RJT05TCi0gICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZC4gIFRoZSBoYXNoIHRhYmxlIGVudHJ5IHNob3VsZCBiZQotICAgICBiZmRfbGlua19oYXNoX2RlZmluZWQgb3JlIGJmZF9saW5rX2hhc2hfZGVmd2VhaywgYW5kIGl0IHNob3VsZCBiZQotICAgICBkZWZpbmVkIGluIGEgc2VjdGlvbiBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBEeW5hbWljIG9iamVjdAotICAgICBzZWN0aW9ucyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBmaW5hbCBsaW5rLCBhbmQgdGhpcyBmdW5jdGlvbiBpcwotICAgICByZXNwb25zaWJsZSBmb3IgY2hhbmdpbmcgdGhlIHZhbHVlIHRvIHNvbWV0aGluZyB3aGljaCB0aGUgcmVzdCBvZgotICAgICB0aGUgbGluayBjYW4gZGVhbCB3aXRoLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGludm9sdmUgYWRkaW5nIGFuCi0gICAgIGVudHJ5IHRvIHRoZSAucGx0IG9yIC5nb3Qgb3Igc29tZSBzdWNoIHNlY3Rpb24sIGFuZCBzZXR0aW5nIHRoZQotICAgICBzeW1ib2wgdG8gcG9pbnQgdG8gdGhhdC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpCi0gICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoKSk7Ci0KLSAgLyogVGhlIEFMV0FZU19TSVpFX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIKLSAgICAgYWZ0ZXIgYWxsIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4gYnV0IGJlZm9yZSB0aGUKLSAgICAgc2VjdGlvbiBzaXplcyBoYXZlIGJlZW4gc2V0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgQURKVVNUX0RZTkFNSUNfU1lNQk9MLCBidXQgYmVmb3JlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogVGhlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBhZnRlciBhbGwgdGhlIGxpbmtlciBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiBidXQgYmVmb3JlCi0gICAgIHRoZSBzZWN0aW9ucyBzaXplcyBoYXZlIGJlZW4gc2V0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgYXBwcm9wcmlhdGUgc3ltYm9scy4KLSAgICAgSXQgaXMgb25seSBjYWxsZWQgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gIEl0IG11c3QKLSAgICAgc2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucywgYW5kIG1heSBmaWxsIGluIHRoZWlyCi0gICAgIGNvbnRlbnRzIGFzIHdlbGwuICBUaGUgZ2VuZXJpYyBFTEYgbGlua2VyIGNhbiBoYW5kbGUgdGhlIC5keW5zeW0sCi0gICAgIC5keW5zdHIgYW5kIC5oYXNoIHNlY3Rpb25zLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZSB0aGUKLSAgICAgLmludGVycCBzZWN0aW9uIGFuZCBhbnkgc2VjdGlvbnMgY3JlYXRlZCBieSB0aGUKLSAgICAgQ1JFQVRFX0RZTkFNSUNfU0VDVElPTlMgZW50cnkgcG9pbnQuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgICB6ZXJvLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICAgIG5lY2Vzc2FyeS4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgICBhY2NvcmRpbmdseS4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgICBiZmQgKmlucHV0X2JmZCwgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZF9ieXRlICpjb250ZW50cywKLQkgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MsIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zKSk7Ci0KLSAgLyogVGhlIEZJTklTSF9EWU5BTUlDX1NZTUJPTCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBqdXN0IGJlZm9yZSBpdCB3cml0ZXMgYSBzeW1ib2wgb3V0IHRvIHRoZSAuZHluc3ltIHNlY3Rpb24uCi0gICAgIFRoZSBwcm9jZXNzb3IgYmFja2VuZCBtYXkgbWFrZSBhbnkgcmVxdWlyZWQgYWRqdXN0bWVudCB0byB0aGUKLSAgICAgc3ltYm9sLiAgSXQgbWF5IGFsc28gdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gc2V0IGNvbnRlbnRzIG9mIHRoZQotICAgICBkeW5hbWljIHNlY3Rpb25zLiAgTm90ZSB0aGF0IEZJTklTSF9EWU5BTUlDX1NZTUJPTCBpcyBjYWxsZWQgb24KLSAgICAgYWxsIC5keW5zeW0gc3ltYm9scywgd2hpbGUgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGlzIG9ubHkgY2FsbGVkCi0gICAgIG9uIHRob3NlIHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICpzeW0pKTsKLQotICAvKiBUaGUgRklOSVNIX0RZTkFNSUNfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAotICAgICBsaW5rZXIganVzdCBiZWZvcmUgaXQgd3JpdGVzIGFsbCB0aGUgZHluYW1pYyBzZWN0aW9ucyBvdXQgdG8gdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgVGhlIEZJTklTSF9EWU5BTUlDX1NZTUJPTCB3aWxsIGhhdmUgYmVlbiBjYWxsZWQgb24KLSAgICAgYWxsIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBkbyBhbnkgYmVnaW5uaW5nIHByb2Nlc3NpbmcgbmVlZGVkIGZvciB0aGUgRUxGIGZpbGUKLSAgICAgYmVmb3JlIGJ1aWxkaW5nIHRoZSBFTEYgaGVhZGVycyBhbmQgY29tcHV0aW5nIGZpbGUgcG9zaXRpb25zLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFueSBmaW5hbCBwcm9jZXNzaW5nIG5lZWRlZCBmb3IgdGhlIEVMRiBmaWxlCi0gICAgIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFRoZSBMSU5LRVIgYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIEJGRAotICAgICB3YXMgY3JlYXRlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gbGlua2VyKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuICBJdCBzaG91bGQKLSAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9ncmFtIHNlZ21lbnRzIHdoaWNoIHRoaXMgQkZECi0gICAgIHdpbGwgbmVlZC4gIEl0IHNob3VsZCByZXR1cm4gLTEgb24gZXJyb3IuICAqLwotICBpbnQgKCplbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycykgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBtb2RpZnkgYW4gZXhpc3Rpbmcgc2VnbWVudCBtYXAgaW4gYQotICAgICBiYWNrZW5kIHNwZWNpZmljIGZhc2hpb24uICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzZWN0aW9uIGdjIHRvIGRpc2NvdmVyIHRoZSBzZWN0aW9uIGEKLSAgICAgcGFydGljdWxhciByZWxvY2F0aW9uIHJlZmVycyB0by4gIEl0IG5lZWQgbm90IGJlIGRlZmluZWQgZm9yIGhvc3RzCi0gICAgIHRoYXQgaGF2ZSBubyBxdWVlciByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIGR1cmluZyB0aGUgc3dlZXAgcGhhc2Ugb2YgZ2MKLSAgICAgaW4gb3JkZXIgdGhhdCBhIGJhY2tlbmQgbWlnaHQgdXBkYXRlIGFueSBkYXRhIHN0cnVjdHVyZXMgaXQgbWlnaHQKLSAgICAgYmUgbWFpbnRhaW5pbmcuICAqLwotICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIEVMRiBoZWFkZXJzIGhhdmUKLSAgICAgYmVlbiBjcmVhdGVkLiAgVGhpcyBhbGxvd3MgZm9yIHRoaW5ncyBsaWtlIHRoZSBPUyBhbmQgQUJJIHZlcnNpb25zCi0gICAgIHRvIGJlIGNoYW5nZWQuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAvKiBUaGUgc3dhcHBpbmcgdGFibGUgdG8gdXNlIHdoZW4gZGVhbGluZyB3aXRoIEVDT0ZGIGluZm9ybWF0aW9uLgotICAgICBVc2VkIGZvciB0aGUgTUlQUyBFTEYgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgLyogQWx0ZXJuYXRlIEVNX3h4eHggbWFjaGluZSBjb2RlcyBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgaW50IGVsZl9tYWNoaW5lX2FsdDE7Ci0gIGludCBlbGZfbWFjaGluZV9hbHQyOwotCi0gIGNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvICpzOwotCi0gIC8qIG9mZnNldCBvZiB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgLmdvdCBzZWN0aW9uICovCi0gIGJmZF92bWEgZ290X3N5bWJvbF9vZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGhlYWRlcnMgZm9yIHRoZSBHT1QgYW5kIFBMVC4gIFRoaXMgaW5jbHVkZXMKLSAgICAgdGhlIHNvLWNhbGxlZCByZXNlcnZlZCBlbnRyaWVzIG9uIHNvbWUgc3lzdGVtcy4gICovCi0gIGJmZF92bWEgZ290X2hlYWRlcl9zaXplOwotICBiZmRfdm1hIHBsdF9oZWFkZXJfc2l6ZTsKLQotICAvKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG1heSB1c2UgUkVMIHJlbG9jYXRpb25zLiAgKFNvbWUgYmFja2VuZHMgdXNlCi0gICAgIGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zLCBhbmQgdGhpcyBmbGFnIGlzIHNldCBmb3IgdGhvc2UKLSAgICAgYmFja2VuZHMuKSAgKi8KLSAgdW5zaWduZWQgbWF5X3VzZV9yZWxfcCA6IDE7Ci0gICAgCi0gIC8qIFdoZXRoZXIgdGhlIGJhY2tlbmQgbWF5IHVzZSBSRUxBIHJlbG9jYXRpb25zLiAgKFNvbWUgYmFja2VuZHMgdXNlCi0gICAgIGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zLCBhbmQgdGhpcyBmbGFnIGlzIHNldCBmb3IgdGhvc2UKLSAgICAgYmFja2VuZHMuKSAgKi8KLSAgdW5zaWduZWQgbWF5X3VzZV9yZWxhX3AgOiAxOwotCi0gIC8qIFdoZXRoZXIgdGhlIGRlZmF1bHQgcmVsb2NhdGlvbiB0eXBlIGlzIFJFTEEuICBJZiBhIGJhY2tlbmQgd2l0aAotICAgICB0aGlzIGZsYWcgc2V0IHdhbnRzIFJFTCByZWxvY2F0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHNlY3Rpb24sCi0gICAgIGl0IG11c3Qgbm90ZSB0aGF0IGV4cGxpY2l0bHkuICBTaW1pbGFybHksIGlmIHRoaXMgZmxhZyBpcyBjbGVhciwKLSAgICAgYW5kIHRoZSBiYWNrZW5kIHdhbnRzIFJFTEEgcmVsb2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciAKLSAgICAgc2VjdGlvbi4gICovICAgCi0gIHVuc2lnbmVkIGRlZmF1bHRfdXNlX3JlbGFfcCA6IDE7Ci0KLSAgdW5zaWduZWQgd2FudF9nb3RfcGx0IDogMTsKLSAgdW5zaWduZWQgcGx0X3JlYWRvbmx5IDogMTsKLSAgdW5zaWduZWQgd2FudF9wbHRfc3ltIDogMTsKLSAgdW5zaWduZWQgcGx0X25vdF9sb2FkZWQgOiAxOwotICB1bnNpZ25lZCBwbHRfYWxpZ25tZW50IDogNDsKLSAgdW5zaWduZWQgY2FuX2djX3NlY3Rpb25zIDogMTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHN0b3JlZCBmb3IgZWFjaCBCRkQgc2VjdGlvbiBpbiBhbiBFTEYgZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgZWxmX25ld19zZWN0aW9uX2hvb2suICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEKLXsKLSAgLyogVGhlIEVMRiBoZWFkZXIgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHRoaXNfaGRyOwotICAvKiBUaGUgRUxGIGhlYWRlciBmb3IgdGhlIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgc2VjdGlvbiwgaWYgYW55LiAgKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgcmVsX2hkcjsKLSAgLyogSWYgdGhlcmUgaXMgYSBzZWNvbmQgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZWN0aW9uLAotICAgICBhcyBjYW4gaGFwcGVuIG9uIElyaXggNiwgdGhpcyBmaWVsZCBwb2ludHMgdG8gdGhlIGhlYWRlci4gICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyMjsKLSAgLyogVGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyBjdXJyZW50bHkgYXNzaWduZWQgdG8gUkVMX0hEUi4gICovCi0gIHVuc2lnbmVkIGludCByZWxfY291bnQ7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgY3VycmVudGx5IGFzc2lnbmVkIHRvIFJFTF9IRFIyLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlbF9jb3VudDI7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhpcyBzZWN0aW9uLiAgT25seSB1c2VkIGZvciBhbiBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGludCB0aGlzX2lkeDsKLSAgLyogVGhlIEVMRiBzZWN0aW9uIG51bWJlciBvZiB0aGUgcmVsb2Mgc2VjdGlvbiBpbmRpY2F0ZWQgYnkKLSAgICAgUkVMX0hEUiBpZiBhbnkuICBPbmx5IHVzZWQgZm9yIGFuIG91dHB1dCBmaWxlLiAgKi8KLSAgaW50IHJlbF9pZHg7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHJlbG9jIHNlY3Rpb24gaW5kaWNhdGVkIGJ5Ci0gICAgIFJFTF9IRFIyIGlmIGFueS4gIE9ubHkgdXNlZCBmb3IgYW4gb3V0cHV0IGZpbGUuICAqLwotICBpbnQgcmVsX2lkeDI7Ci0gIC8qIFVzZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyIHRvIHN0b3JlIHRoZSBzeW1ib2wgaGFzaCB0YWJsZSBlbnRyaWVzCi0gICAgIGFzc29jaWF0ZWQgd2l0aCByZWxvY3MgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKLSAgLyogQSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIHJlbG9jcy4gIElmIHRoZSBzZWN0aW9uIHVzZXMgUkVMIHJlbG9jcywKLSAgICAgcmF0aGVyIHRoYW4gUkVMQSwgYWxsIHRoZSByX2FkZGVuZCBmaWVsZHMgd2lsbCBiZSB6ZXJvLiAgVGhpcwotICAgICBwb2ludGVyIG1heSBiZSBOVUxMLiAgSXQgaXMgdXNlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIuICAqLwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAvKiBVc2VkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlciB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB0bwotICAgICByZWNvcmQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGV4IGZvciBhIHNlY3Rpb24gc3ltYm9sCi0gICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzZWN0aW9uLiAgQSB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgdGhlcmUgaXMKLSAgICAgbm8gZHluYW1pYyBzeW1ib2wgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIGxvbmcgZHluaW5keDsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEEgcG9pbnRlciBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgRUxGIGJhY2tlbmQuICAqLwotICBQVFIgdGRhdGE7Ci0gIC8qIE5vbnplcm8gaWYgdGhpcyBzZWN0aW9uIHVzZXMgUkVMQSByZWxvY2F0aW9ucywgcmF0aGVyIHRoYW4gUkVMLiAgKi8KLSAgdW5zaWduZWQgaW50IHVzZV9yZWxhX3A6MTsKLX07Ci0KLSNkZWZpbmUgZWxmX3NlY3Rpb25fZGF0YShzZWMpICAoKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSopc2VjLT51c2VkX2J5X2JmZCkKLQotI2RlZmluZSBnZXRfZWxmX2JhY2tlbmRfZGF0YShhYmZkKSBcCi0gICgoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKikgKGFiZmQpLT54dmVjLT5iYWNrZW5kX2RhdGEpCi0KLS8qIEVudW1lcmF0aW9uIHRvIHNwZWNpZnkgdGhlIHNwZWNpYWwgc2VjdGlvbi4gICovCi10eXBlZGVmIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0KLXsKLSAgTElOS0VSX1NFQ1RJT05fVU5LTk9XTiwJCS8qIG5vdCB1c2VkICovCi0gIExJTktFUl9TRUNUSU9OX0dPVCwJCQkvKiAuZ290IHNlY3Rpb24gZm9yIGdsb2JhbCBvZmZzZXQgcG9pbnRlcnMgKi8KLSAgTElOS0VSX1NFQ1RJT05fUExULAkJCS8qIC5wbHQgc2VjdGlvbiBmb3IgZ2VuZXJhdGVkIHByb2NlZHVyZSBzdHVicyAqLwotICBMSU5LRVJfU0VDVElPTl9TREFUQSwJCQkvKiAuc2RhdGEvLnNic3Mgc2VjdGlvbiBmb3IgUG93ZXJQQyAqLwotICBMSU5LRVJfU0VDVElPTl9TREFUQTIsCQkvKiAuc2RhdGEyLy5zYnNzMiBzZWN0aW9uIGZvciBQb3dlclBDICovCi0gIExJTktFUl9TRUNUSU9OX01BWAkJCS8qICMgb2YgbGlua2VyIHNlY3Rpb25zICovCi19IGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Q7Ci0KLS8qIFNlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbgotewotICBjaGFyICpuYW1lOwkJCQkvKiBuYW1lIG9mIHRoZSBzZWN0aW9uICovCi0gIGNoYXIgKnJlbF9uYW1lOwkJCS8qIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgLnJlbHssYX0uIHNlY3Rpb24gKi8KLSAgY2hhciAqYnNzX25hbWU7CQkJLyogbmFtZSBvZiBhIHJlbGF0ZWQgLmJzcyBzZWN0aW9uICovCi0gIGNoYXIgKnN5bV9uYW1lOwkJCS8qIG5hbWUgb2Ygc3ltYm9sIHRvIHJlZmVyZW5jZSB0aGlzIHNlY3Rpb24gKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247CQkJLyogcG9pbnRlciB0byB0aGUgc2VjdGlvbiAqLwotICBhc2VjdGlvbiAqYnNzX3NlY3Rpb247CQkvKiBwb2ludGVyIHRvIHRoZSBic3Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyAqLwotICBhc2VjdGlvbiAqcmVsX3NlY3Rpb247CQkvKiBwb2ludGVyIHRvIHRoZSByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIHRoaXMgc2VjdGlvbiAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7CS8qIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgc3ltYm9sIGhhc2ggdmFsdWUgKi8KLSAgYmZkX3ZtYSBpbml0aWFsX3NpemU7CQkJLyogaW5pdGlhbCBzaXplIGJlZm9yZSBhbnkgbGlua2VyIGdlbmVyYXRlZCBhbGxvY2F0aW9ucyAqLwotICBiZmRfdm1hIHN5bV9vZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIHN5bWJvbCBmcm9tIGJlZ2lubmluZyBvZiBzZWN0aW9uICovCi0gIGJmZF92bWEgaG9sZV9zaXplOwkJCS8qIHNpemUgb2YgcmVzZXJ2ZWQgYWRkcmVzcyBob2xlIGluIGFsbG9jYXRpb24gKi8KLSAgYmZkX3ZtYSBob2xlX29mZnNldDsJCQkvKiBjdXJyZW50IG9mZnNldCBmb3IgdGhlIGhvbGUgKi8KLSAgYmZkX3ZtYSBtYXhfaG9sZV9vZmZzZXQ7CQkvKiBtYXhpbXVtIG9mZnNldCBmb3IgdGhlIGhvbGUgKi8KLSAgZWxmX2xpbmtlcl9zZWN0aW9uX2VudW1fdCB3aGljaDsJLyogd2hpY2ggc2VjdGlvbiB0aGlzIGlzICovCi0gIGJvb2xlYW4gaG9sZV93cml0dGVuX3A7CQkvKiB3aGV0aGVyIHRoZSBob2xlIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0gIHVuc2lnbmVkIGludCBhbGlnbm1lbnQ7CQkvKiBhbGlnbm1lbnQgZm9yIHRoZSBzZWN0aW9uICovCi0gIGZsYWd3b3JkIGZsYWdzOwkJCS8qIGZsYWdzIHRvIHVzZSB0byBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLX0gZWxmX2xpbmtlcl9zZWN0aW9uX3Q7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGFsbG9jYXRlZCBwb2ludGVyIGVudHJpZXMuICBUaGlzIGhhbmdzIG9mZiBvZiB0aGUgc3ltYm9sIGxpc3RzLCBhbmQKLSAgIHByb3ZpZGVzIGFsbG93cyB1cyB0byByZXR1cm4gZGlmZmVyZW50IHBvaW50ZXJzLCBiYXNlZCBvbiBkaWZmZXJlbnQgYWRkZW5kJ3MuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMKLXsKLSAgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVycyAqbmV4dDsJLyogbmV4dCBhbGxvY2F0ZWQgcG9pbnRlciBmb3IgdGhpcyBzeW1ib2wgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7CQkJCS8qIG9mZnNldCBvZiBwb2ludGVyIGZyb20gYmVnaW5uaW5nIG9mIHNlY3Rpb24gKi8KLSAgYmZkX3NpZ25lZF92bWEgYWRkZW5kOwkJCS8qIGFkZGVuZCB1c2VkICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7CQkvKiB3aGljaCBsaW5rZXIgc2VjdGlvbiB0aGlzIGlzICovCi0gIGJvb2xlYW4gd3JpdHRlbl9hZGRyZXNzX3A7CQkJLyogd2hldGhlciBhZGRyZXNzIHdhcyB3cml0dGVuIHlldCAqLwotfSBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdDsKLQotLyogU29tZSBwcml2YXRlIGRhdGEgaXMgc3Rhc2hlZCBhd2F5IGZvciBmdXR1cmUgdXNlIHVzaW5nIHRoZSB0ZGF0YSBwb2ludGVyCi0gICBpbiB0aGUgYmZkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBlbGZfb2JqX3RkYXRhCi17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyIGVsZl9oZWFkZXJbMV07CS8qIEFjdHVhbCBkYXRhLCBidXQgcmVmIGxpa2UgcHRyICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICoqZWxmX3NlY3RfcHRyOwotICBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqc2VnbWVudF9tYXA7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYl9wdHI7Ci0gIGludCBudW1fbG9jYWxzOwotICBpbnQgbnVtX2dsb2JhbHM7Ci0gIGFzeW1ib2wgKipzZWN0aW9uX3N5bXM7CQkvKiBTVFRfU0VDVElPTiBzeW1ib2xzIGZvciBlYWNoIHNlY3Rpb24gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgc2hzdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBzdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW5zeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW5zdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJzeW1faGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJyZWZfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJkZWZfaGRyOwotICB1bnNpZ25lZCBpbnQgc3ltdGFiX3NlY3Rpb24sIHNoc3RydGFiX3NlY3Rpb247Ci0gIHVuc2lnbmVkIGludCBzdHJ0YWJfc2VjdGlvbiwgZHluc3ltdGFiX3NlY3Rpb247Ci0gIHVuc2lnbmVkIGludCBkeW52ZXJzeW1fc2VjdGlvbiwgZHludmVyZGVmX3NlY3Rpb24sIGR5bnZlcnJlZl9zZWN0aW9uOwotICBmaWxlX3B0ciBuZXh0X2ZpbGVfcG9zOwotI2lmIDAKLSAgLyogd2UgZG9uJ3QgbmVlZCB0aGVzZSBpbnNpZGUgYmZkIGFueW1vcmUsIGFuZCBJIHRoaW5rCi0gICAgIHRoZXNlIHdlcmVuJ3QgdXNlZCBvdXRzaWRlIGJmZC4gKi8KLSAgdm9pZCAqcHJzdGF0dXM7CQkJLyogVGhlIHJhdyAvcHJvYyBwcnN0YXR1cyBzdHJ1Y3R1cmUgKi8KLSAgdm9pZCAqcHJwc2luZm87CQkJLyogVGhlIHJhdyAvcHJvYyBwcnBzaW5mbyBzdHJ1Y3R1cmUgKi8KLSNlbmRpZgotICBiZmRfdm1hIGdwOwkJCQkvKiBUaGUgZ3AgdmFsdWUgKE1JUFMgb25seSwgZm9yIG5vdykgKi8KLSAgdW5zaWduZWQgaW50IGdwX3NpemU7CQkJLyogVGhlIGdwIHNpemUgKE1JUFMgb25seSwgZm9yIG5vdykgKi8KLQotICAvKiBJbmZvcm1hdGlvbiBncmFiYmVkIGZyb20gYW4gZWxmIGNvcmUgZmlsZS4gKi8KLSAgaW50IGNvcmVfc2lnbmFsOwotICBpbnQgY29yZV9waWQ7Ci0gIGludCBjb3JlX2x3cGlkOwotICBjaGFyKiBjb3JlX3Byb2dyYW07Ci0gIGNoYXIqIGNvcmVfY29tbWFuZDsKLQotICAvKiBUaGlzIGlzIHNldCB0byB0cnVlIGlmIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYnkgdGhlIGJhY2tlbmQKLSAgICAgbGlua2VyLiAgKi8KLSAgYm9vbGVhbiBsaW5rZXI7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gZXh0ZXJuYWwgc3ltYm9scyB0byBlbnRyaWVzIGluIHRoZSBsaW5rZXIgaGFzaAotICAgICB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGlzIGlzIGluZGV4ZWQgYnkgdGhlIHN5bWJvbCBpbmRleAotICAgICBtaW51cyB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltYm9sIHRhYmxlIGhlYWRlci4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgZ2xvYmFsIG9mZnNldAotICAgICB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGlzIGlzIGluZGV4ZWQgYnkgdGhlIHN5bWJvbCBpbmRleC4KLSAgICAgTGlrZSBmb3IgdGhlIGdsb2JhbHMsIHdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvCi0gICAgIGRvY3VtZW50IHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZAotICAgICBzaG91bGQgYmUgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2gKLSAgICAgcG9pbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiBhbiBlbnRyeQotICAgICBpcyAtMSwgdGhlbiB0aGUgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hICpyZWZjb3VudHM7Ci0gICAgICBiZmRfdm1hICpvZmZzZXRzOwotICAgIH0gbG9jYWxfZ290OwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSB2YXJpb3VzIGxpbmtlcgotICAgICBzZWN0aW9ucyBhZGRlZC4gIFRoaXMgaXMgaW5kZXggYnkgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqbGlua2VyX3NlY3Rpb25fcG9pbnRlcnM7Ci0KLSAgLyogVGhlIGxpbmtlciBFTEYgZW11bGF0aW9uIGNvZGUgbmVlZHMgdG8gbGV0IHRoZSBiYWNrZW5kIEVMRiBsaW5rZXIKLSAgICAga25vdyB3aGF0IGZpbGVuYW1lIHNob3VsZCBiZSB1c2VkIGZvciBhIGR5bmFtaWMgb2JqZWN0IGlmIHRoZQotICAgICBkeW5hbWljIG9iamVjdCBpcyBmb3VuZCB1c2luZyBhIHNlYXJjaC4gIFRoZSBlbXVsYXRpb24gY29kZSB0aGVuCi0gICAgIHNvbWV0aW1lcyBuZWVkcyB0byBrbm93IHdoYXQgbmFtZSB3YXMgYWN0dWFsbHkgdXNlZC4gIFVudGlsIHRoZQotICAgICBmaWxlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBsaW5rZXIgc3ltYm9sIHRhYmxlLCB0aGlzIGZpZWxkIGhvbGRzCi0gICAgIHRoZSBuYW1lIHRoZSBsaW5rZXIgd2FudHMuICBBZnRlciBpdCBoYXMgYmVlbiBhZGRlZCwgaXQgaG9sZHMgdGhlCi0gICAgIG5hbWUgYWN0dWFsbHkgdXNlZCwgd2hpY2ggd2lsbCBiZSB0aGUgRFRfU09OQU1FIGVudHJ5IGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gICovCi0gIGNvbnN0IGNoYXIgKmR0X25hbWU7Ci0KLSAgLyogSXJpeCA1IG9mdGVuIHNjcmV3cyB1cCB0aGUgc3ltYm9sIHRhYmxlLCBzb3J0aW5nIGxvY2FsIHN5bWJvbHMKLSAgICAgYWZ0ZXIgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGZsYWcgaXMgc2V0IGlmIHRoZSBzeW1ib2wgdGFibGUgaW4KLSAgICAgdGhpcyBCRkQgYXBwZWFycyB0byBiZSBzY3Jld2VkIHVwLiAgSWYgaXQgaXMsIHdlIGlnbm9yZSB0aGUKLSAgICAgc2hfaW5mbyBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGhlYWRlciwgYW5kIGFsd2F5cyByZWFkIGFsbCB0aGUKLSAgICAgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gYmFkX3N5bXRhYjsKLQotICAvKiBSZWNvcmRzIHRoZSByZXN1bHQgb2YgYGdldF9wcm9ncmFtX2hlYWRlcl9zaXplJy4gICovCi0gIGJmZF9zaXplX3R5cGUgcHJvZ3JhbV9oZWFkZXJfc2l6ZTsKLQotICAvKiBVc2VkIGJ5IGZpbmRfbmVhcmVzdF9saW5lIGVudHJ5IHBvaW50LiAgKi8KLSAgUFRSIGxpbmVfaW5mbzsKLQotICAvKiBVc2VkIGJ5IE1JUFMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIGVudHJ5IHBvaW50LiAgVGhlIHN0cnVjdHVyZQotICAgICBjb3VsZCBiZSBpbmNsdWRlZCBkaXJlY3RseSBpbiB0aGlzIG9uZSwgYnV0IHRoZXJlJ3Mgbm8gcG9pbnQgdG8KLSAgICAgd2FzdGluZyB0aGUgbWVtb3J5IGp1c3QgZm9yIHRoZSBpbmZyZXF1ZW50bHkgY2FsbGVkCi0gICAgIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmluZF9saW5lX2luZm87Ci0KLSAgLyogQSBwbGFjZSB0byBzdGFzaCBkd2FyZjEgaW5mbyBmb3IgdGhpcyBiZmQuICovCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcgKmR3YXJmMV9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBBIHBsYWNlIHRvIHN0YXNoIGR3YXJmMiBpbmZvIGZvciB0aGlzIGJmZC4gKi8KLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqZHdhcmYyX2ZpbmRfbGluZV9pbmZvOwotCi0gIC8qIEFuIGFycmF5IG9mIHN0dWIgc2VjdGlvbnMgaW5kZXhlZCBieSBzeW1ib2wgbnVtYmVyLCB1c2VkIGJ5IHRoZQotICAgICBNSVBTIEVMRiBsaW5rZXIuICBGSVhNRTogV2Ugc2hvdWxkIGZpZ3VyZSBvdXQgc29tZSB3YXkgdG8gb25seQotICAgICBpbmNsdWRlIHRoaXMgZmllbGQgZm9yIGEgTUlQUyBFTEYgdGFyZ2V0LiAgKi8KLSAgYXNlY3Rpb24gKipsb2NhbF9zdHViczsKLQotICAvKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgZV9mbGFncyBmaWVsZCBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotICBib29sZWFuIGZsYWdzX2luaXQ7Ci0KLSAgLyogTnVtYmVyIG9mIHN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb25zIHdlIGFyZSBhYm91dCB0byBlbWl0LiAgKi8KLSAgdW5zaWduZWQgaW50IGN2ZXJkZWZzOwotCi0gIC8qIE51bWJlciBvZiBzeW1ib2wgdmVyc2lvbiByZWZlcmVuY2VzIHdlIGFyZSBhYm91dCB0byBlbWl0LiAgKi8KLSAgdW5zaWduZWQgaW50IGN2ZXJyZWZzOwotCi0gIC8qIFN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb25zIGluIGV4dGVybmFsIG9iamVjdHMuICAqLwotICBFbGZfSW50ZXJuYWxfVmVyZGVmICp2ZXJkZWY7Ci0KLSAgLyogU3ltYm9sIHZlcnNpb24gcmVmZXJlbmNlcyB0byBleHRlcm5hbCBvYmplY3RzLiAgKi8KLSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnZlcnJlZjsKLQotICAvKiBMaW5rZXIgc2VjdGlvbnMgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb24gKmxpbmtlcl9zZWN0aW9uWyAoaW50KUxJTktFUl9TRUNUSU9OX01BWCBdOwotfTsKLQotI2RlZmluZSBlbGZfdGRhdGEoYmZkKQkJKChiZmQpIC0+IHRkYXRhLmVsZl9vYmpfZGF0YSkKLSNkZWZpbmUgZWxmX2VsZmhlYWRlcihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBlbGZfaGVhZGVyKQotI2RlZmluZSBlbGZfZWxmc2VjdGlvbnMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZWxmX3NlY3RfcHRyKQotI2RlZmluZSBlbGZfc2hzdHJ0YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3RydGFiX3B0cikKLSNkZWZpbmUgZWxmX29uZXN5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzeW10YWJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnN5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW5zeW10YWJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcnN5bShiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJzeW1fc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcmRlZihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJkZWZfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcnJlZihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJyZWZfc2VjdGlvbikKLSNkZWZpbmUgZWxmX251bV9sb2NhbHMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gbnVtX2xvY2FscykKLSNkZWZpbmUgZWxmX251bV9nbG9iYWxzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IG51bV9nbG9iYWxzKQotI2RlZmluZSBlbGZfc2VjdGlvbl9zeW1zKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHNlY3Rpb25fc3ltcykKLSNkZWZpbmUgY29yZV9wcnBzaW5mbyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBwcnBzaW5mbykKLSNkZWZpbmUgY29yZV9wcnN0YXR1cyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBwcnN0YXR1cykKLSNkZWZpbmUgZWxmX2dwKGJmZCkJCShlbGZfdGRhdGEoYmZkKSAtPiBncCkKLSNkZWZpbmUgZWxmX2dwX3NpemUoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZ3Bfc2l6ZSkKLSNkZWZpbmUgZWxmX3N5bV9oYXNoZXMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3ltX2hhc2hlcykKLSNkZWZpbmUgZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMoYmZkKSAoZWxmX3RkYXRhKGJmZCkgLT4gbG9jYWxfZ290LnJlZmNvdW50cykKLSNkZWZpbmUgZWxmX2xvY2FsX2dvdF9vZmZzZXRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxvY2FsX2dvdC5vZmZzZXRzKQotI2RlZmluZSBlbGZfbG9jYWxfcHRyX29mZnNldHMoYmZkKSAoZWxmX3RkYXRhKGJmZCkgLT4gbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMpCi0jZGVmaW5lIGVsZl9kdF9uYW1lKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGR0X25hbWUpCi0jZGVmaW5lIGVsZl9iYWRfc3ltdGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGJhZF9zeW10YWIpCi0jZGVmaW5lIGVsZl9mbGFnc19pbml0KGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGZsYWdzX2luaXQpCi0jZGVmaW5lIGVsZl9saW5rZXJfc2VjdGlvbihiZmQsbikgKGVsZl90ZGF0YShiZmQpIC0+IGxpbmtlcl9zZWN0aW9uWyhpbnQpbl0pCi0MCi1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRlZiAqLCBFbGZfSW50ZXJuYWxfVmVyZGVmICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRlZiAqLCBFbGZfRXh0ZXJuYWxfVmVyZGVmICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRhdXggKiwgRWxmX0ludGVybmFsX1ZlcmRhdXggKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRhdXggKiwgRWxmX0V4dGVybmFsX1ZlcmRhdXggKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqLCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqLCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJuYXV4ICosIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuYXV4ICosIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyc3ltICosIEVsZl9JbnRlcm5hbF9WZXJzeW0gKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVyc3ltICosIEVsZl9FeHRlcm5hbF9WZXJzeW0gKikpOwotCi1leHRlcm4gaW50IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCkpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwKLQkJCQkJICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLSNkZWZpbmUgZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIoYWJmZCxzdHJpbmRleCkgXAotICAgICBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKGFiZmQsZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keCxzdHJpbmRleCkKLQotI2RlZmluZSBiZmRfZWxmMzJfcHJpbnRfc3ltYm9sCWJmZF9lbGZfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGJmZF9lbGY2NF9wcmludF9zeW1ib2wJYmZkX2VsZl9wcmludF9zeW1ib2wKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmZkX2VsZl9oYXNoIFBBUkFNUyAoKENPTlNUIHVuc2lnbmVkIGNoYXIgKikpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkgICAgYXJlbGVudCAqLAotCQkJCQkJCSAgICBhc3ltYm9sICosCi0JCQkJCQkJICAgIFBUUiwKLQkJCQkJCQkgICAgYXNlY3Rpb24gKiwKLQkJCQkJCQkgICAgYmZkICosCi0JCQkJCQkJICAgIGNoYXIgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfbWtjb3JlZmlsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9TaGRyICpiZmRfZWxmX2ZpbmRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgRWxmX0ludGVybmFsX1NoZHIgKmhkciwgY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJICAgICAgIGZpbGVfcHRyLAotCQkJCQkJICAgICAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLQkJCQkJCSAgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLAotCQkJCQkJCSBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9lbGZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkgICAgICAgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYWxlbnQgKl9iZmRfZWxmX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkJdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQkgICAgYXN5bWJvbCAqKiwKLQkJCQkJCSAgICBiZmRfdm1hLCBDT05TVCBjaGFyICoqLAotCQkJCQkJICAgIENPTlNUIGNoYXIgKiosCi0JCQkJCQkgICAgdW5zaWduZWQgaW50ICopKTsKLSNkZWZpbmUgX2JmZF9lbGZfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBfYmZkX2VsZl9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLWV4dGVybiBpbnQgX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciAKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGJvb2xlYW4pKTsKLQotLyogSWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUgcmVsb2MgaGFuZGxpbmcgd3JpdHRlbiB5ZXQ6ICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfbm9faW5mb190b19ob3d0byBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCQkgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBzaGluZGV4KSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc2VjdGlvbl9mcm9tX3BoZHIgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotCi1leHRlcm4gaW50IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLQotYXNlY3Rpb24gKmJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQpKTsKLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfZWxmX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLWJvb2xlYW4KLV9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotYm9vbGVhbgotX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXZvaWQgX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MgUEFSQU1TICgoYmZkICopKTsKLWZpbGVfcHRyIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9TaGRyICosCi0JCQkJCQkJICAgIGZpbGVfcHRyLAotCQkJCQkJCSAgICBib29sZWFuKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICopKTsKLQotYm9vbGVhbiBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotYm9vbGVhbiBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotYm9vbGVhbiBfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4IFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCSAgICAgIFBUUikpOwotCi1lbGZfbGlua2VyX3NlY3Rpb25fdCAqX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0cykpOwotCi1lbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfcG9pbnRlcnMsCi0JICAgYmZkX3NpZ25lZF92bWEgYWRkZW5kLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2gpKTsKLQotYm9vbGVhbiBiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkgICBjb25zdCBFbGYzMl9JbnRlcm5hbF9SZWxhICpyZWwpKTsKLQotYmZkX3ZtYSBiZmRfZWxmMzJfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYWJmZCwKLQkgICBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgYmZkX3ZtYSByZWxvY2F0aW9uLAotCSAgIGNvbnN0IEVsZjMyX0ludGVybmFsX1JlbGEgKnJlbCwKLQkgICBpbnQgcmVsYXRpdmVfcmVsb2MpKTsKLQotYm9vbGVhbiBiZmRfZWxmNjRfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWxhICpyZWwpKTsKLQotYmZkX3ZtYSBiZmRfZWxmNjRfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYWJmZCwKLQkgICBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgYmZkX3ZtYSByZWxvY2F0aW9uLAotCSAgIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlbGEgKnJlbCwKLQkgICBpbnQgcmVsYXRpdmVfcmVsb2MpKTsKLQotYm9vbGVhbiBfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEKLSAgUEFSQU1TICgoYmZkICpkeW5vYmosCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIGludCBhbGlnbm1lbnQpKTsKLQotYm9vbGVhbiBfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjMyX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjMyX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY2hhciAqYmZkX2VsZjMyX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjMyX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkJIGJmZCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfU3ltICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9SZWwgKiwgRWxmX0ludGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKiwgRWxmMzJfRXh0ZXJuYWxfUmVsICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGYzMl9FeHRlcm5hbF9SZWxhICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3BoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1BoZHIgKiwgRWxmX0ludGVybmFsX1BoZHIgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIEVsZjMyX0V4dGVybmFsX1BoZHIgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfZHluX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfZHluX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX0R5biAqLCBFbGYzMl9FeHRlcm5hbF9EeW4gKikpOwotZXh0ZXJuIGxvbmcgYmZkX2VsZjMyX3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3dyaXRlX3NoZHJzX2FuZF9laGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGYzMl93cml0ZV9vdXRfcGhkcnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gRWxmX0ludGVybmFsX1JlbGEgKl9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBib29sZWFuKSk7Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZWxmNjRfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZWxmNjRfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmNjRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBiZmRfZWxmNjRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJCQkgYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfU3ltICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWwgKiwgRWxmX0ludGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9yZWxvY19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKiwgRWxmNjRfRXh0ZXJuYWxfUmVsICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGY2NF9FeHRlcm5hbF9SZWxhICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3BoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1BoZHIgKiwgRWxmX0ludGVybmFsX1BoZHIgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcGhkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIEVsZjY0X0V4dGVybmFsX1BoZHIgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfZHluX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfZHluX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX0R5biAqLCBFbGY2NF9FeHRlcm5hbF9EeW4gKikpOwotZXh0ZXJuIGxvbmcgYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gRWxmX0ludGVybmFsX1JlbGEgKl9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBib29sZWFuKSk7Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGJmZF9lbGY2NF9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgUFRSLAotICAgICAgICAgICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1ib29sZWFuIF9iZmRfZWxmMzJfZ2Nfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKLQotYm9vbGVhbiBfYmZkX2VsZjY0X2djX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX2NvbW1vbl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfZ2NfcmVjb3JkX3Z0aW5oZXJpdAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX3JlY29yZF92dGVudHJ5Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci0KLS8qIE1JUFMgRUxGIHNwZWNpZmljIHJvdXRpbmVzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLWV4dGVybiB2b2lkIF9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLWV4dGVybiB2b2lkIF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSNlbmRpZiAvKiBfTElCRUxGX0hfICovCmRpZmYgLS1naXQgYS9iZmQvZWxmLWhwcGEuaCBiL2JmZC9lbGYtaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNlMzkwLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYtaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTg0ICswLDAgQEAKLS8qIENvbW1vbiBjb2RlIGZvciBQQSBFTEYgaW1wbGVtZW50YXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEVMRl9IT1dUT19UQUJMRV9TSVpFICAgICAgIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQgKyAxCi0KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgRUxGX1JfVFlQRShYKSAgIEVMRjY0X1JfVFlQRShYKQotI2RlZmluZSBfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlIF9iZmRfZWxmNjRfaHBwYV9nZW5fcmVsb2NfdHlwZQotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIEVMRl9SX1RZUEUoWCkgICBFTEYzMl9SX1RZUEUoWCkKLSNkZWZpbmUgX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSBfYmZkX2VsZjMyX2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSNlbmRpZgotCi0vKiBFTEYvUEEgcmVsb2NhdGlvbiBob3d0byBlbnRyaWVzLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hwcGFfaG93dG9fdGFibGVbRUxGX0hPV1RPX1RBQkxFX1NJWkVdID0KLXsKLSAge1JfUEFSSVNDX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTk9ORSJ9LAotCi0gIC8qIFRoZSB2YWx1ZXMgaW4gRElSMzIgYXJlIHRvIHBsYWNhdGUgdGhlIGNoZWNrIGluCi0gICAgIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAge1JfUEFSSVNDX0RJUjMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIzMiIsIGZhbHNlLCAwLCAweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtSX1BBUklTQ19ESVIyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjIxTCJ9LAotICB7Ul9QQVJJU0NfRElSMTdSLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxN1IifSwKLSAge1JfUEFSSVNDX0RJUjE3RiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTdGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RJUjE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTRSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUENSRUwzMiwgMCwgMCwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDMyIn0sCi0KLSAge1JfUEFSSVNDX1BDUkVMMjFMLCAwLCAwLCAyMSwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE3UiwgMCwgMCwgMTcsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE3UiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxN0YsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxN0YifSwKLSAge1JfUEFSSVNDX1BDUkVMMTdDLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTdDIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE0UiwgMCwgMCwgMTQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0UiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNEYsIDAsIDAsIDE0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNEYifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19EUFJFTDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwyMUwifSwKLSAge1JfUEFSSVNDX0RQUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19EUFJFTDE0V1IifSwKLQotICB7Ul9QQVJJU0NfRFBSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19EUFJFTDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNFIifSwKLSAge1JfUEFSSVNDX0RQUkVMMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19EUFJFTDE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVFJFTDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX0RMVFJFTDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19ETFRSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVElORDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUSU5EMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRJTkQxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVElORDE0UiJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNEYifSwKLQotICB7Ul9QQVJJU0NfU0VUQkFTRSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19TRVRCQVNFIn0sCi0gIHtSX1BBUklTQ19TRUNSRUwzMiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19TRUNSRUwzMiJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDE3UiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE3UiJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDE3RiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE3RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTRGIn0sCi0gIHtSX1BBUklTQ19TRUdCQVNFLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1NFR0JBU0UifSwKLSAge1JfUEFSSVNDX1NFR1JFTDMyLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1NFR1JFTDMyIn0sCi0KLSAge1JfUEFSSVNDX1BMVE9GRjIxTCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNFIifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE0RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNEYifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjMyLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIzMiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjIxTCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9GUFRSMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE0UiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19GUFRSNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRlBUUjY0In0sCi0gIHtSX1BBUklTQ19QTEFCRUwzMiwgMCwgMCwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExBQkVMMzIifSwKLSAge1JfUEFSSVNDX1BMQUJFTDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExBQkVMMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1BMQUJFTDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExBQkVMMTRSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1BDUkVMNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUw2NCJ9LAotICB7Ul9QQVJJU0NfUENSRUwyMkMsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwyMkMifSwKLSAge1JfUEFSSVNDX1BDUkVMMjJGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMjJGIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNFdSIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE2RiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTZXRiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTZERiJ9LAotCi0gIHtSX1BBUklTQ19ESVI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVI2NCJ9LAotICB7Ul9QQVJJU0NfRElSNjRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVI2NFdSIn0sCi0gIHtSX1BBUklTQ19ESVI2NERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjY0RFIifSwKLSAge1JfUEFSSVNDX0RJUjE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTRXUiJ9LAotICB7Ul9QQVJJU0NfRElSMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNERSIn0sCi0gIHtSX1BBUklTQ19ESVIxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTZGIn0sCi0gIHtSX1BBUklTQ19ESVIxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE2V0YifSwKLSAge1JfUEFSSVNDX0RJUjE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTZERiJ9LAotICB7Ul9QQVJJU0NfR1BSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19HUFJFTDY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDE0V1IifSwKLSAge1JfUEFSSVNDX0RMVFJFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfR1BSRUwxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfR1BSRUwxNkYifSwKLSAge1JfUEFSSVNDX0dQUkVMMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19HUFJFTDE2V0YifSwKLSAge1JfUEFSSVNDX0dQUkVMMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19HUFJFTDE2REYifSwKLSAge1JfUEFSSVNDX0xUT0ZGNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkY2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVElORDE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUSU5EMTRXUiJ9LAotCi0gIHtSX1BBUklTQ19ETFRJTkQxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVElORDE0RFIifSwKLSAge1JfUEFSSVNDX0xUT0ZGMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGMTZGIn0sCi0gIHtSX1BBUklTQ19MVE9GRjE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkYxNkRGIn0sCi0gIHtSX1BBUklTQ19TRUNSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19TRUNSRUw2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JTRVJFTDE0V1IifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfU0VHUkVMNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VHUkVMNjQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0V1IifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTREUiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE2RiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNldGIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE2REYifSwKLQotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9GUFRSMTRXUiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE2RiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0NPUFksIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQ09QWSJ9LAotICB7Ul9QQVJJU0NfSVBMVCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19JUExUIn0sCi0KLSAge1JfUEFSSVNDX0VQTFQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRVBMVCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUwzMiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19UUFJFTDMyIn0sCi0gIHtSX1BBUklTQ19UUFJFTDIxTCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19UUFJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfVFAyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19UUFJFTDY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTRXUiJ9LAotCi0gIHtSX1BBUklTQ19UUFJFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVFBSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19UUFJFTDE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19UUFJFTDE2RiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTZXRiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1RQUkVMMTZERiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFA2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTRXUiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTREUiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfTFRPRkZfVFAxNkYifSwKLQotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTZXRiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTZERiJ9LAotfTsKLQotLyogUmV0dXJuIG9uZSAob3IgbW9yZSkgQkZEIHJlbG9jYXRpb25zIHdoaWNoIGltcGxlbWVudCB0aGUgYmFzZQotICAgcmVsb2NhdGlvbiB3aXRoIG1vZGlmaWNhdGlvbnMgYmFzZWQgb24gZm9ybWF0IGFuZCBmaWVsZC4gICovCi0KLWVsZl9ocHBhX3JlbG9jX3R5cGUgKioKLV9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUgKGFiZmQsIGJhc2VfdHlwZSwgZm9ybWF0LCBmaWVsZCwgaWdub3JlLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZWxmX2hwcGFfcmVsb2NfdHlwZSBiYXNlX3R5cGU7Ci0gICAgIGludCBmb3JtYXQ7Ci0gICAgIGludCBmaWVsZDsKLSAgICAgaW50IGlnbm9yZTsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBlbGZfaHBwYV9yZWxvY190eXBlICpmaW5hbHR5cGU7Ci0gIGVsZl9ocHBhX3JlbG9jX3R5cGUgKipmaW5hbF90eXBlczsKLQotICAvKiBBbGxvY2F0ZSBzbG90cyBmb3IgdGhlIEJGRCByZWxvY2F0aW9uLiAgKi8KLSAgZmluYWxfdHlwZXMgPSAoKGVsZl9ocHBhX3JlbG9jX3R5cGUgKiopCi0JCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmX2hwcGFfcmVsb2NfdHlwZSAqKSAqIDIpKTsKLSAgaWYgKGZpbmFsX3R5cGVzID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSByZWxvY2F0aW9uIGl0c2VsZi4gICovCi0gIGZpbmFsdHlwZSA9ICgoZWxmX2hwcGFfcmVsb2NfdHlwZSAqKQotCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmX2hwcGFfcmVsb2NfdHlwZSkpKTsKLSAgaWYgKGZpbmFsdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cy4gICovCi0gIGZpbmFsX3R5cGVzWzBdID0gZmluYWx0eXBlOwotICBmaW5hbF90eXBlc1sxXSA9IE5VTEw7Ci0KLSNkZWZpbmUgZmluYWxfdHlwZSBmaW5hbHR5cGVbMF0KLQotICBmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCi0gIC8qIEp1c3QgYSB0YW5nbGUgb2YgbmVzdGVkIHN3aXRjaCBzdGF0ZW1lbnRzIHRvIGRlYWwgd2l0aCB0aGUgYnJhaW5kYW1hZ2UKLSAgICAgdGhhdCBhIGRpZmZlcmVudCBmaWVsZCBzZWxlY3RvciBtZWFucyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHJlbG9jYXRpb24KLSAgICAgZm9yIFBBIEVMRi4gICovCi0gIHN3aXRjaCAoYmFzZV90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSFBQQToKLSAgICBjYXNlIFJfSFBQQV9BQlNfQ0FMTDoKLSAgICAgIHN3aXRjaCAoZm9ybWF0KQotCXsKLQljYXNlIDE0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxNFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9ydHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUSU5EMTRSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfdHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUSU5EMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDE3OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMTdGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxN1I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xzZWw6Ci0JICAgIGNhc2UgZV9scnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfbHRzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RMVElORDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2xwc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAzMjoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjMyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUExBQkVMMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9HT1RPRkY6Ci0gICAgICBzd2l0Y2ggKGZvcm1hdCkKLQl7Ci0JY2FzZSAxNDoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRFBSRUwxNFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19EUFJFTDE0RjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDIxOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfbHJzZWw6Ci0JICAgIGNhc2UgZV9sc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19EUFJFTDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgUl9IUFBBX1BDUkVMX0NBTEw6Ci0gICAgICBzd2l0Y2ggKGZvcm1hdCkKLQl7Ci0JY2FzZSAxNDoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxNFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE0RjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDE3OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE3UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTdGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMjI6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDIyRjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDIxOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfbHNlbDoKLQkgICAgY2FzZSBlX2xyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBmaW5hbF90eXBlczsKLX0KLQotLyogVHJhbnNsYXRlIGZyb20gYW4gZWxmIGludG8gZmllbGQgaW50byBhIGhvd3RvIHJlbG9jYXRpb24gcG9pbnRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV9pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIEJGRF9BU1NFUlQgKEVMRl9SX1RZUEUoZWxmX3JlbG9jLT5yX2luZm8pCi0JICAgICAgPCAodW5zaWduZWQgaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKTsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZlbGZfaHBwYV9ob3d0b190YWJsZVtFTEZfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyldOwotfQotCi0vKiBUcmFuc2xhdGUgZnJvbSBhbiBlbGYgaW50byBmaWVsZCBpbnRvIGEgaG93dG8gcmVsb2NhdGlvbiBwb2ludGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9ocHBhX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGX1JfVFlQRShlbGZfcmVsb2MtPnJfaW5mbykKLQkgICAgICA8ICh1bnNpZ25lZCBpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpOwotICBiZmRfcmVsb2MtPmhvd3RvID0gJmVsZl9ocHBhX2hvd3RvX3RhYmxlW0VMRl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKV07Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgaG93dG8gdGFibGUgZW50cnkgdG8gcGVyZm9ybSB0aGUgQ09ERQotICAgcmVsb2NhdGlvbiBmb3IgYW4gQVJDSCBtYWNoaW5lLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGlmICgoaW50KSBjb2RlIDwgKGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgoaW50KSBlbGZfaHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXS50eXBlID09IChpbnQpIGNvZGUpOwotICAgICAgcmV0dXJuICZlbGZfaHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXTsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyOwotewotICBpbnQgbWFjaCA9IGJmZF9nZXRfbWFjaCAoYWJmZCk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfihFRl9QQVJJU0NfQVJDSCB8IEVGX1BBUklTQ19UUkFQTklMCi0JCQkJICAgICB8IEVGX1BBUklTQ19FWFQgfCBFRl9QQVJJU0NfTFNCCi0JCQkJICAgICB8IEVGX1BBUklTQ19XSURFIHwgRUZfUEFSSVNDX05PX0tBQlAKLQkJCQkgICAgIHwgRUZfUEFSSVNDX0xBWllTV0FQKTsKLQotICBpZiAobWFjaCA9PSAxMCkKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzFfMDsKLSAgZWxzZSBpZiAobWFjaCA9PSAxMSkKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzFfMTsKLSAgZWxzZSBpZiAobWFjaCA9PSAyMCkKLSAgICB7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzJfMDsKLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1BBUklTQ19XSURFOwotI2VuZGlmCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDIwMC5jIGIvYmZkL2VsZi1tMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkMTkzZC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNSArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMjAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtbjEwMjAwX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX01OMTAyMDBfTk9ORSA9IDAsCi0gIFJfTU4xMDIwMF8zMiwKLSAgUl9NTjEwMjAwXzE2LAotICBSX01OMTAyMDBfOCwKLSAgUl9NTjEwMjAwXzI0LAotICBSX01OMTAyMDBfUENSRUw4LAotICBSX01OMTAyMDBfUENSRUwxNiwKLSAgUl9NTjEwMjAwX1BDUkVMMjQsCi0gIFJfTU4xMDIwMF9NQVgKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBEdW1teSByZWxvY2F0aW9uLiAgRG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDIwMF9OT05FLAotCSAwLAotCSAyLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfTk9ORSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8zMiIsCi0JIGZhbHNlLAotCSAweGZmZmZmZmZmLAotCSAweGZmZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDE2IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8xNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCA4IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDI0IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMjQsCi0JIDAsCi0JIDIsCi0JIDI0LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8yNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU2ltcGxlIDggcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF9QQ1JFTDgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAxNiBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwxNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwxNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIGEgMSBieXRlIGFkanVzdG1lbnQKLSAgICAgdG8gZ2V0IHRoZSBwYy1yZWxhdGl2ZSBvZmZzZXQgY29ycmVjdC4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwyNCwKLQkgMCwKLQkgMiwKLQkgMjQsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwyNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIHRydWUpLAotfTsKLQotc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwIG1uMTAyMDBfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX01OMTAyMDBfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTU4xMDIwMF8zMiwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTU4xMDIwMF8xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9NTjEwMjAwXzgsIH0sCi0gIHsgQkZEX1JFTE9DXzI0LCBSX01OMTAyMDBfMjQsIH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDgsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAyMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfMjRfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDI0LCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChtbjEwMjAwX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChtbjEwMjAwX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfbW4xMDIwMF9ob3d0b190YWJsZVttbjEwMjAwX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTU4xMDIwMCBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbW4xMDIwMF9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NTjEwMjAwX01BWCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21uMTAyMDBfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgaXNfbG9jYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgaW50IGlzX2xvY2FsOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzMyOgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzE2OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF84OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmIHx8IChsb25nKXZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfMjQ6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIHZhbHVlICY9IDB4ZmZmZmZmOwotICAgICAgdmFsdWUgfD0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmZjAwMDAwMCk7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUw4OgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IChvZmZzZXQgKyAxKTsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHhmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUwxNjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMik7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUwyNDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMyk7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwMDAwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgdmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmMDAwMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotfQotCi0MCi0vKiBSZWxvY2F0ZSBhbiBNTjEwMjAwIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaG93dG8gPSBlbGZfbW4xMDIwMF9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgciA9IG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kLAotCQkJCQkgICBpbmZvLCBzZWMsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY29uc3QgY2hhciAqbXNnID0gKGNvbnN0IGNoYXIgKikwOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIG1uMTAyMDAuCi0KLSAgIFRoZXJlJ3MgcXVpdGUgYSBmZXcgcmVsYXhpbmcgb3Bwb3J0dW5pdGVzIGF2YWlsYWJsZSBvbiB0aGUgbW4xMDIwMDoKLQotCSoganNyOjI0IC0+IGpzcjoxNiAJCQkJCSAgIDIgYnl0ZXMKLQotCSogam1wOjI0IC0+IGptcDoxNgkJCQkJICAgMiBieXRlcwotCSogam1wOjE2IC0+IGJyYTo4CQkJCQkgICAxIGJ5dGUKLQotCQkqIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaAotCQlhcm91bmQgdGhlIGp1bXAvYnJhLCB3ZSBtYXkgYmUgYWJsZSB0byByZXZlcnNlIGl0cyBjb25kaXRpb24KLQkJYW5kIGNoYW5nZSBpdHMgdGFyZ2V0IHRvIHRoZSBqdW1wJ3MgdGFyZ2V0LiAgVGhlIGp1bXAvYnJhCi0JCWNhbiB0aGVuIGJlIGRlbGV0ZWQuCQkJCSAgIDIgYnl0ZXMKLQotCSogbW92IGFiczI0IC0+IG1vdiBhYnMxNgkyIGJ5dGUgc2F2aW5ncwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMjQgY2FuIHJlbGF4IHRvIGltbTE2ICAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMTYgY2FuIHJlbGF4IHRvIGltbTggICAxIGJ5dGUKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGQyNCBjYW4gcmVsYXggdG8gZDE2CSAgIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBkMTYgY2FuIHJlbGF4IHRvIGQ4CSAgIDEgYnl0ZQotCi0JYWJzMjQsIGltbTI0LCBkMjQgYWxsIGxvb2sgdGhlIHNhbWUgYXQgdGhlIHJlbG9jIGxldmVsLiAgSXQKLQltaWdodCBtYWtlIHRoZSBjb2RlIHNpbXBsZXIgaWYgd2UgaGFkIGRpZmZlcmVudCByZWxvY3MgZm9yCi0JdGhlIHZhcmlvdXMgcmVsYXhhYmxlIG9wZXJhbmQgdHlwZXMuCi0gICAKLQlXZSBkb24ndCBoYW5kbGUgaW1tMTYtPmltbTggb3IgZDE2LT5kOCBhcyB0aGV5J3JlIHZlcnkgcmFyZQotCWFuZCBzb21ld2hhdCBtb3JlIGRpZmZpY3VsdCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1tbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIEFzc3VtZSBub3RoaW5nIGNoYW5nZXMuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogV2FsayB0aHJvdWdoIHRoZW0gbG9va2luZyBmb3IgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlbGF4ZWQsIHRoZW4gaWdub3JlCi0JIHRoaXMgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfTk9ORQotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF84Ci0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX01BWCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDI0Yml0IHBjLXJlbGF0aXZlIGJyYW5jaC9jYWxsIGludG8gYSAxNmJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2gvY2FsbC4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDI0KQotCXsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gKGlyZWwtPnJfb2Zmc2V0ICsgMyk7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmZmYgKyAyIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSB0d28gYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwMDEgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZTAgJiYgY29kZSAhPSAweGUxKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhlMCkKLQkJYmZkX3B1dF84IChhYmZkLCAweGZjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGUxKQotCQliZmRfcHV0XzggKGFiZmQsIDB4ZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDIwMF9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUgb2Zmc2V0LiAgKi8KLQkgICAgICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JICAgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgOGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2guICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfUENSRUwxNikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDIpOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gOCBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmICsgMSBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgb25lIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MCAmJiAobG9uZyl2YWx1ZSA+IC0weDgwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZmMpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZWEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDIwMF9QQ1JFTDgpOwotCi0JICAgICAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCSAgICAgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICBpcmVsLT5yX29mZnNldCArIDEsIDEpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byBlbGltaW5hdGUgYW4gdW5jb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gKLQkgd2hpY2ggaW1tZWRpYXRlbHkgZm9sbG93cyBhIGNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaCBhcm91bmQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLgotCi0JICAgIG9yaWdpbmFsOgkJbmV3OgotCSAgICBiQ0MgbGFiMQkJYkNDJyBsYWIyCi0JICAgIGJyYSBsYWIyCi0JICAgbGFiMToJICAgICAgIGxhYjE6Ci0KLQotCSBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgYkNDIGNhbid0IHJlYWNoIGxhYjIgYXQgYXNzZW1ibHkgdGltZSwKLQkgYnV0IGR1ZSB0byBvdGhlciByZWxheGF0aW9ucyBpdCBjYW4gcmVhY2ggYXQgbGluayB0aW1lLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX1BDUkVMOCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0JICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gKGlyZWwtPnJfb2Zmc2V0ICsgMSk7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogRG8gbm90aGluZyBpZiB0aGlzIHJlbG9jIGlzIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IHNlYy0+X2Nvb2tlZF9zaXplKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VlIGlmIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGFuIHVuY29uZGl0aW9uYWwgcGMtcmVsYXRpdmUKLQkgICAgIGJyYW5jaCwgbW9yZSBvZnRlbiB0aGFuIG5vdCB0aGlzIHRlc3Qgd2lsbCBmYWlsLCBzbyB3ZQotCSAgICAgdGVzdCBpdCBmaXJzdCB0byBzcGVlZCB0aGluZ3MgdXAuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhlYSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEFsc28gbWFrZSBzdXJlIHRoZSBuZXh0IHJlbG9jYXRpb24gYXBwbGllcyB0byB0aGUgbmV4dAotCSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoYXQgaXQncyBhIHBjLXJlbGF0aXZlIDggYml0IGJyYW5jaC4gICovCi0JICBucmVsID0gaXJlbCArIDE7Ci0JICBpZiAobnJlbCA9PSBpcmVsZW5kCi0JICAgICAgfHwgaXJlbC0+cl9vZmZzZXQgKyAyICE9IG5yZWwtPnJfb2Zmc2V0Ci0JICAgICAgfHwgRUxGMzJfUl9UWVBFIChucmVsLT5yX2luZm8pICE9IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgb3VyIGRlc3RpbmF0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlCi0JICAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0JICBpZiAoc3ltdmFsICE9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIGlyZWwtPnJfb2Zmc2V0ICsgMykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3cgbWFrZSBzdXJlIHdlIGFyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaC4gIFRoaXMgbWF5IG5vdAotCSAgICAgYmUgbmVjZXNzYXJ5LCBidXQgd2h5IHRha2UgdGhlIGNoYW5jZS4gCi0KLQkgICAgIE5vdGUgdGhlc2UgY2hlY2tzIGFzc3VtZSB0aGF0IFJfTU4xMDIwMF9QQ1JFTDggcmVsb2NzCi0JICAgICBvbmx5IG9jY3VyIG9uIGJDQyBhbmQgYkNDeCBpbnNucy4gIElmIHRoZXkgb2NjdXJlZAotCSAgICAgZWxzZXdoZXJlLCB3ZSdkIG5lZWQgdG8ga25vdyB0aGUgc3RhcnQgb2YgdGhpcyBpbnNuCi0JICAgICBmb3IgdGhpcyBjaGVjayB0byBiZSBhY2N1cmF0ZS4gICovCi0JICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICBpZiAoY29kZSAhPSAweGUwICYmIGNvZGUgIT0gMHhlMSAmJiBjb2RlICE9IDB4ZTIKLQkgICAgICAmJiBjb2RlICE9IDB4ZTMgJiYgY29kZSAhPSAweGU0ICYmIGNvZGUgIT0gMHhlNQotCSAgICAgICYmIGNvZGUgIT0gMHhlNiAmJiBjb2RlICE9IDB4ZTcgJiYgY29kZSAhPSAweGU4Ci0JICAgICAgJiYgY29kZSAhPSAweGU5ICYmIGNvZGUgIT0gMHhlYyAmJiBjb2RlICE9IDB4ZWQKLQkgICAgICAmJiBjb2RlICE9IDB4ZWUgJiYgY29kZSAhPSAweGVmICYmIGNvZGUgIT0gMHhmYwotCSAgICAgICYmIGNvZGUgIT0gMHhmZCAmJiBjb2RlICE9IDB4ZmUgJiYgY29kZSAhPSAweGZmKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgYWxzbyBoYXZlIHRvIGJlIHN1cmUgdGhlcmUgaXMgbm8gc3ltYm9sL2xhYmVsCi0JICAgICBhdCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotCSAgaWYgKG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIHNlYywgZXh0c3ltcywKLQkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0JICBzd2l0Y2ggKGNvZGUpCi0JICAgIHsKLQkgICAgICBjYXNlIDB4ZmM6Ci0JCWNvZGUgPSAweGZkOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmQ6Ci0JCWNvZGUgPSAweGZjOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmU6Ci0JCWNvZGUgPSAweGZmOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmY6Ci0JCWNvZGUgPSAweGZlOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTg6Ci0JCWNvZGUgPSAweGU5OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTk6Ci0JCWNvZGUgPSAweGU4OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTA6Ci0JCWNvZGUgPSAweGUyOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTI6Ci0JCWNvZGUgPSAweGUwOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTM6Ci0JCWNvZGUgPSAweGUxOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTE6Ci0JCWNvZGUgPSAweGUzOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTQ6Ci0JCWNvZGUgPSAweGU2OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTY6Ci0JCWNvZGUgPSAweGU0OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTc6Ci0JCWNvZGUgPSAweGU1OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTU6Ci0JCWNvZGUgPSAweGU3OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWM6Ci0JCWNvZGUgPSAweGVkOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWQ6Ci0JCWNvZGUgPSAweGVjOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWU6Ci0JCWNvZGUgPSAweGVmOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWY6Ci0JCWNvZGUgPSAweGVlOwotCQlicmVhazsKLQkgICAgfQotCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAKLQkgIC8qIFNldCB0aGUgcmVsb2MgdHlwZSBhbmQgc3ltYm9sIGZvciB0aGUgZmlyc3QgYnJhbmNoCi0JICAgICBmcm9tIHRoZSBzZWNvbmQgYnJhbmNoLiAgKi8KLQkgIGlyZWwtPnJfaW5mbyA9IG5yZWwtPnJfaW5mbzsKLQotCSAgLyogTWFrZSB0aGUgcmVsb2MgZm9yIHRoZSBzZWNvbmQgYnJhbmNoIGEgbnVsbCByZWxvYy4gICovCi0JICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCSAgICAgICBSX01OMTAyMDBfTk9ORSk7Ci0KLQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgKmFnYWluID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMjRiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF8yNCkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMuIAotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBBbGwgaW5zbnMgd2hpY2ggaGF2ZSAyNGJpdCBvcGVyYW5kcyBhcmUgNSBieXRlcyBsb25nLAotCQkgdGhlIGZpcnN0IGJ5dGUgd2lsbCBhbHdheXMgYmUgMHhmNCwgYnV0IHdlIGRvdWJsZSBjaGVjawotCQkgaXQganVzdCBpbiBjYXNlLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGY0KQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgc3dpdGNoIChjb2RlICYgMHhmYykKLQkJewotCQkvKiBtb3YgaW1tMjQsZG4gLT4gbW92IGltbTE2LGRuICovCi0JCWNhc2UgMHg3MDoKLQkJICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCi0JCSAgaWYgKHZhbHVlICYgMHg4MDAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZjggKyAoY29kZSAmIDB4MDMpLAotCQkJICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgUl9NTjEwMjAwXzE2KTsKLQotCQkgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKLQkJICAgICBvZmZzZXQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogbW92IGltbTI0LGFuIC0+IG1vdiBpbW0xNixhbiAKLQkJICAgY21wIGltbTI0LGFuIC0+IGNtcCBpbW0xNixhbgotCQkgICBtb3YgKGFiczI0KSxkbiAtPiBtb3YgKGFiczE2KSxkbgotCQkgICBtb3YgZG4sKGFiczI0KSAtPiBtb3YgZG4sKGFiczE2KQotCQkgICBtb3ZiIGRuLChhYnMyNCkgLT4gbW92YiBkbiwoYWJzMTYpCi0JCSAgIG1vdmJ1IChhYnMyNCksZG4gLT4gbW92YnUgKGFiczE2KSxkbiAqLwotCQljYXNlIDB4NzQ6Ci0JCWNhc2UgMHg3YzoKLQkJY2FzZSAweGMwOgotCQljYXNlIDB4NDA6Ci0JCWNhc2UgMHg0NDoKLQkJY2FzZSAweGM4OgotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxkZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgaWYgKChjb2RlICYgMHhmYykgPT0gMHg3NCkKLQkJICAgIGNvZGUgPSAweGRjICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4N2MpCi0JCSAgICBjb2RlID0gMHhlYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGMwKQotCQkgICAgY29kZSA9IDB4YzggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg0MCkKLQkJICAgIGNvZGUgPSAweGMwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NDQpCi0JCSAgICBjb2RlID0gMHhjNCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGM4KQotCQkgICAgY29kZSA9IDB4Y2MgKyAoY29kZSAmIDB4MDMpOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCi0JCSAgICAgb2Zmc2V0LiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIGNtcCBpbW0yNCxkbiAtPiBjbXAgaW1tMTYsZG4KLQkJICAgbW92IChhYnMyNCksYW4gLT4gbW92IChhYnMxNiksYW4KLQkJICAgbW92IGFuLChhYnMyNCkgLT4gbW92IGFuLChhYnMxNikKLQkJICAgYWRkIGltbTI0LGRuIC0+IGFkZCBpbW0xNixkbgotCQkgICBhZGQgaW1tMjQsYW4gLT4gYWRkIGltbTE2LGFuCi0JCSAgIHN1YiBpbW0yNCxkbiAtPiBzdWIgaW1tMTYsZG4KLQkJICAgc3ViIGltbTI0LGFuIC0+IHN1YiBpbW0xNixhbiAKLQkJICAgQW5kIGFsbCBkMjQtPmQxNiBpbiBtZW1vcnkgb3BzLiAgKi8KLQkJY2FzZSAweDc4OgotCQljYXNlIDB4ZDA6Ci0JCWNhc2UgMHg1MDoKLQkJY2FzZSAweDYwOgotCQljYXNlIDB4NjQ6Ci0JCWNhc2UgMHg2ODoKLQkJY2FzZSAweDZjOgotCQljYXNlIDB4ODA6Ci0JCWNhc2UgMHhmMDoKLQkJY2FzZSAweDAwOgotCQljYXNlIDB4MTA6Ci0JCWNhc2UgMHhiMDoKLQkJY2FzZSAweDMwOgotCQljYXNlIDB4YTA6Ci0JCWNhc2UgMHgyMDoKLQkJY2FzZSAweDkwOgotCQkgIC8qIE5vdCBzYWZlIGlmIHRoZSBoaWdoIGJpdCBpcyBvbiBhcyByZWxheGluZyBtYXkKLQkJICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KLQkJICBpZiAoKChjb2RlICYgMHhmYykgPT0gMHg3OAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDYwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4NjQKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2OAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDZjCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4ODAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHhmMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDAwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4MTAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHhiMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDMwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4YTAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgyMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDkwKQotCQkgICAgICAgJiYgKHZhbHVlICYgMHg4MDAwKSAhPSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZjcsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NzgpCi0JCSAgICBjb2RlID0gMHg0OCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGQwKQotCQkgICAgY29kZSA9IDB4MzAgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg1MCkKLQkJICAgIGNvZGUgPSAweDIwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NjApCi0JCSAgICBjb2RlID0gMHgxOCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDY0KQotCQkgICAgY29kZSA9IDB4MDggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg2OCkKLQkJICAgIGNvZGUgPSAweDFjICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NmMpCi0JCSAgICBjb2RlID0gMHgwYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDgwKQotCQkgICAgY29kZSA9IDB4YzAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhmMCkKLQkJICAgIGNvZGUgPSAweGIwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MDApCi0JCSAgICBjb2RlID0gMHg4MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDEwKQotCQkgICAgY29kZSA9IDB4YTAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhiMCkKLQkJICAgIGNvZGUgPSAweDcwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MzApCi0JCSAgICBjb2RlID0gMHg2MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGEwKQotCQkgICAgY29kZSA9IDB4ZDAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHgyMCkKLQkJICAgIGNvZGUgPSAweDkwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4OTApCi0JCSAgICBjb2RlID0gMHg1MCArIChjb2RlICYgMHgwNyk7Ci0KLQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOwotCi0JCSAgLyogRGVsZXRlIG9uZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIG1vdmIgKGFiczI0KSxkbiAtPm1vdmJ1IChhYnMxNiksZG4gZXh0eGIgYm4gKi8KLQkJY2FzZSAweGM0OgotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxkZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGNjICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGI4ICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgcmVsb2Mgd2lsbCBiZSBhcHBsaWVkIG9uZSBieXRlIGluIGZyb250IG9mIGl0cwotCQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAvKiBEZWxldGUgb25lIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAyLCAxKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpKQotCWlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGEgc3ltYm9sIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgZWxzZSByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBpbnQgc2huZHg7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2gsICoqc3ltX2hhc2hfZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgLyogRXhhbWluZSBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hfZW5kID0gKHN5bV9oYXNoCi0JCSAgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKQotCQkgICAgIC0gc3ltdGFiX2hkci0+c2hfaW5mbykpOwotICBmb3IgKDsgc3ltX2hhc2ggPCBzeW1faGFzaF9lbmQ7IHN5bV9oYXNoKyspCi0gICAgewotICAgICAgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID09IGFkZHIpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgICAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBtZW1jcHkgKGRhdGEsIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0KLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCWV4dGVybmFsX3N5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGV4dGVybmFsX3N5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpOwotCSAgaWYgKGV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIHN5bXRhYl9oZHItPnNoX2luZm8sIGlucHV0X2JmZCkKLQkJICAhPSAoc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkgICAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7ICsrZXN5bSwgKytpc3ltcCwgKytzZWNwcCkKLQl7Ci0JICBhc2VjdGlvbiAqaXNlYzsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID4gMCAmJiBpc3ltcC0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdobyBrbm93cz8gICovCi0JICAgICAgaXNlYyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnNlY3BwID0gaXNlYzsKLQl9Ci0KLSAgICAgIGlmICghIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX21uMTAyMDBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbW4xMDIwMCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21uMTAyMDAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfTU4xMDIwMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1uMTAyMDBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJMAotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCW1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDMwMC5jIGIvYmZkL2VsZi1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhMDlhOC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgyMSArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMzAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCi0KLXN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeQotewotICAvKiBUaGUgYmFzaWMgZWxmIGxpbmsgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcwotICAgICBjYWxsZWQgZGlyZWN0bHkgKGllIGJ5IG5hbWUpLiAgKi8KLSAgdW5zaWduZWQgaW50IGRpcmVjdF9jYWxsczsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgdGhlIHNpemUgb2YgdGhpcyBmdW5jdGlvbidzIHN0YWNrCi0gICAgIChpZiA8PSAyNTUgYnl0ZXMpLiAgV2Ugc3R1ZmYgdGhpcyBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMKLSAgICAgdG8gdGhpcyB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLgotCi0gICAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzdGFjayBhbGxvY2F0ZWQgYnkgbW92bSEgICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhY2tfc2l6ZTsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgYXJndW1lbnRzIChpZiBhbnkpIGZvciBtb3ZtIGluc3RydWN0aW9uCi0gICAgIGluIHRoZSBwcm9sb2d1ZS4gIFdlIHN0dWZmIHRoaXMgdmFsdWUgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zCi0gICAgIHRvIHRoZSB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX2FyZ3M7Ci0KLSAgLyogRm9yIGZ1bnRpb24gc3ltYm9scywgdGhlIGFtb3VudCBvZiBzdGFjayBzcGFjZSB0aGF0IHdvdWxkIGJlIGFsbG9jYXRlZAotICAgICBieSB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggbW92bV9hcmdzLCBidXQgd2UKLSAgICAgYWRkIGl0IHRvIHRoZSBoYXNoIHRhYmxlIHRvIGF2b2lkIGNvbXB1dGluZyBpdCBvdmVyIGFuZCBvdmVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX3N0YWNrX3NpemU7Ci0KLS8qIFdoZW4gc2V0LCBjb252ZXJ0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvIHRoaXMgdGFyZ2V0IGludG8gImNhbGxzIgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMgMHgxCi0KLS8qIFVzZWQgdG8gbWFyayBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBoYWQgcmVkdW5kYW50IHBhcnRzIG9mIHRoZWlyCi0gICBwcm9sb2d1ZSBkZWxldGVkLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTIDB4MgotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwotfTsKLQotLyogV2UgZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBtYWluIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBzbwotICAgd2UgY2FuIHN0b3JlIHN0YXRlIHZhcmlhYmxlcyBhbmQgYSBzZWNvbmRhcnkgaGFzaCB0YWJsZSB3aXRob3V0Ci0gICByZXNvcnRpbmcgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gICovCi1zdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogQSBoYXNoIHRhYmxlIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgV2UgY291bGQgZGVyaXZlIGEgbmV3IGhhc2ggdGFibGUKLSAgICAgaW5zdGVhZCBvZiB1c2luZyB0aGUgZnVsbCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSBpZiB3ZSB3YW50ZWQKLSAgICAgdG8gc2F2ZSBzb21lIG1lbW9yeS4gICovCi0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqc3RhdGljX2hhc2hfdGFibGU7Ci0KLSAgLyogUmFuZG9tIGxpbmtlciBzdGF0ZSBmbGFncy4gICovCi0jZGVmaW5lIE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEIDB4MQotICBjaGFyIGZsYWdzOwotfTsKLQotLyogRm9yIE1OMTAzMDAgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBHZXQgdGhlIE1OMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG1uMTAzMDBfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKm1uMTAzMDBfZWxmX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgY29tcHV0ZV9mdW5jdGlvbl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21uMTAzMDBfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIER1bW15IHJlbG9jYXRpb24uICBEb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX05PTkUsCi0JIDAsCi0JIDIsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9OT05FIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8zMiwKLQkgMCwKLQkgMiwKLQkgMzIsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzMyIiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMTYgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8xNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDggYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF84LAotCSAwLAotCSAwLAotCSA4LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF84IiwKLQkgZmFsc2UsCi0JIDB4ZmYsCi0JIDB4ZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX1BDUkVMMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMMzIiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmZmZiwKLQkgMHhmZmZmZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFN0YW5kYXJkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9QQ1JFTDE2LAotCSAwLAotCSAxLAotCSAxNiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSB0cnVlKSwKLSAgLyogU3RhbmRhcmQgOCBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfUENSRUw4LAotCSAwLAotCSAwLAotCSA4LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSB0cnVlKSwKLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX01OMTAzMDBfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRFTlRSWSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwXzI0LAotCSAwLAotCSAyLAotCSAyNCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSBmYWxzZSksCi0KLX07Ci0KLXN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCBtbjEwMzAwX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMzAwX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAzMDBfMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAzMDBfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDMwMF84LCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAzMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMOCwgfSwKLSAgeyBCRkRfUkVMT0NfMjQsIFJfTU4xMDMwMF8yNCwgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKG1uMTAzMDBfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKG1uMTAzMDBfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlW21uMTAzMDBfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNTjEwMzAwIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMzAwX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX01OMTAzMDBfTUFYKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbW4xMDMwMF9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCS8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCS8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbW4xMDMwMF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICBpbnQgaXNfbG9jYWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfTU4xMDMwMF9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzMyOgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzI0OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUgJiAweGZmLCBoaXRfZGF0YSk7Ci0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgKHZhbHVlID4+IDgpICYgMHhmZiwgaGl0X2RhdGEgKyAxKTsKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCAodmFsdWUgPj4gMTYpICYgMHhmZiwgaGl0X2RhdGEgKyAyKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8xNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfODoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX1BDUkVMODoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfUENSRUwxNjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9QQ1JFTDMyOgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IG9mZnNldDsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQ6Ci0gICAgY2FzZSBSX01OMTAzMDBfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLX0KLQotDAotLyogUmVsb2NhdGUgYW4gTU4xMDMwMCBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiopCi0JCSAoZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaG93dG8gPSBlbGZfbW4xMDMwMF9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgLyogSnVzdCBza2lwIHRoZSB2dGFibGUgZ2MgcmVsb2NzLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSX01OMTAzMDBfR05VX1ZURU5UUlkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHIgPSBtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKLQkJCQkJICAgaW5mbywgc2VjLCBoID09IE5VTEwpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNvbnN0IGNoYXIgKm1zZyA9IChjb25zdCBjaGFyICopMDsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCBpbml0aWFsaXppbmcgb25lIGhhc2ggdGFibGUgZW50cnkuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkgKGdlbl9lbnRyeSwgaW5fYXJncykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpnZW5fZW50cnk7Ci0gICAgIFBUUiBpbl9hcmdzOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmVudHJ5OwotICB1bnNpZ25lZCBpbnQgYnl0ZV9jb3VudCA9IDA7Ci0KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotCi0gIC8qIElmIHdlIGFscmVhZHkga25vdyB3ZSB3YW50IHRvIGNvbnZlcnQgImNhbGwiIHRvICJjYWxscyIgZm9yIGNhbGxzCi0gICAgIHRvIHRoaXMgc3ltYm9sLCB0aGVuIHJldHVybiBub3cuICAqLwotICBpZiAoZW50cnktPmZsYWdzID09IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBuYW1lZCBjYWxscyB0byB0aGlzIHN5bWJvbCwgb3IgdGhlcmUncyBub3RoaW5nIHdlCi0gICAgIGNhbiBtb3ZlIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4KLSAgICAgbm90ZSB0aGF0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byAiY2FsbHMiCi0gICAgIGluc3RydWN0aW9ucyBhbmQgcmV0dXJuLiAgKi8KLSAgaWYgKGVudHJ5LT5kaXJlY3RfY2FsbHMgPT0gMAotICAgICAgfHwgKGVudHJ5LT5zdGFja19zaXplID09IDAgJiYgZW50cnktPm1vdm1fYXJncyA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIGEgbm90ZSB0aGF0IHdlIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgotCSBpbnN0cnVjdGlvbnMgZm9yIGNhbGxzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGVudHJ5LT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBtYXkgYmUgYWJsZSB0byBtb3ZlIHNvbWUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvCi0gICAgIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICBDb3VudCBob3cgbWFueSBieXRlcyB3ZSBtaWdodCBiZSBhYmxlIHRvCi0gICAgIGVsaW1pbmF0ZSBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLQotICAvKiBBIG1vdm0gaW5zdHJ1Y3Rpb24gaXMgdHdvIGJ5dGVzLiAgKi8KLSAgaWYgKGVudHJ5LT5tb3ZtX2FyZ3MpCi0gICAgYnl0ZV9jb3VudCArPSAyOwotCi0gIC8qIENvdW50IHRoZSBpbnNuIHRvIGFsbG9jYXRlIHN0YWNrIHNwYWNlIHRvby4gICovCi0gIGlmIChlbnRyeS0+c3RhY2tfc2l6ZSA+IDAgJiYgZW50cnktPnN0YWNrX3NpemUgPD0gMTI4KQotICAgIGJ5dGVfY291bnQgKz0gMzsKLSAgZWxzZSBpZiAoZW50cnktPnN0YWNrX3NpemUgPiAwICYmIGVudHJ5LT5zdGFja19zaXplIDwgMjU2KQotICAgIGJ5dGVfY291bnQgKz0gNDsKLQotICAvKiBJZiB1c2luZyAiY2FsbCIgd2lsbCByZXN1bHQgaW4gbGFyZ2VyIGNvZGUsIHRoZW4gdHVybiBhbGwKLSAgICAgdGhlIGFzc29jaWF0ZWQgImNhbGwiIGluc3RydWN0aW9ucyBpbnRvICJjYWxscyIgaW5zdHJ1dGlvbnMuICAqLwotICBpZiAoYnl0ZV9jb3VudCA8IGVudHJ5LT5kaXJlY3RfY2FsbHMpCi0gICAgZW50cnktPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOwotCi0gIC8qIFRoaXMgcm91dGluZSBuZXZlciBmYWlscy4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMzAwLgotCi0gICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAzMDA6Ci0KLQkqIGNhbGxzOjMyIC0+IGNhbGxzOjE2IAkJCQkJICAgMiBieXRlcwotCSogY2FsbDozMiAgLT4gY2FsbDoxNgkJCQkJICAgMiBieXRlcwotCi0JKiBjYWxsOjMyIC0+IGNhbGxzOjMyCQkJCQkgICAxIGJ5dGUKLQkqIGNhbGw6MTYgLT4gY2FsbHM6MTYJCQkJCSAgIDEgYnl0ZQotCQkqIFRoZXNlIGFyZSBkb25lIGFueXRpbWUgdXNpbmcgImNhbGxzIiB3b3VsZCByZXN1bHQKLQkJaW4gc21hbGxlciBjb2RlLCBvciB3aGVuIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSB0aGUKLQkJbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS4KLQotCSogY2FsbDozMgkJCQkJCSAgIHZhcmllcwotCSogY2FsbDoxNgotCQkqIEluIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSBjYW4gbW92ZSBpbnN0cnVjdGlvbnMKLQkJZnJvbSBhIGZ1bmN0aW9uIHByb2xvZ3VlIGludG8gYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JCVRoaXMgaXMgb25seSBkb25lIGlmIHRoZSByZXN1bHRpbmcgY29kZSBpcyBubyBsYXJnZXIKLQkJdGhhbiB0aGUgb3JpZ2luYWwgY29kZS4KLQotCi0JKiBqbXA6MzIgLT4gam1wOjE2CQkJCQkgICAyIGJ5dGVzCi0JKiBqbXA6MTYgLT4gYnJhOjgJCQkJCSAgIDEgYnl0ZQotCi0JCSogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoCi0JCWFyb3VuZCB0aGUganVtcC9icmEsIHdlIG1heSBiZSBhYmxlIHRvIHJldmVyc2UgaXRzIGNvbmRpdGlvbgotCQlhbmQgY2hhbmdlIGl0cyB0YXJnZXQgdG8gdGhlIGp1bXAncyB0YXJnZXQuICBUaGUganVtcC9icmEKLQkJY2FuIHRoZW4gYmUgZGVsZXRlZC4JCQkJICAgMiBieXRlcwotCi0JKiBtb3YgYWJzMzIgLT4gbW92IGFiczE2CQkJCSAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMzIgY2FuIHJlbGF4IHRvIGltbTE2ICAxIG9yIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBpbW0xNiBjYW4gcmVsYXggdG8gaW1tOCAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDMyIGNhbiByZWxheCB0byBkMTYJICAgMSBvciAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIG9yIDIgYnl0ZXMKLQotCVdlIGRvbid0IGhhbmRsZSBpbW0xNi0+aW1tOCBvciBkMTYtPmQ4IGFzIHRoZXkncmUgdmVyeSByYXJlCi0JYW5kIHNvbWV3aGF0IG1vcmUgZGlmZmljdWx0IHRvIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIG1uMTAzMDAgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBmaWVsZHMgaW4gZWFjaCBoYXNoIHRhYmxlIGVudHJ5IHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICAqLwotICBpZiAoKGhhc2hfdGFibGUtPmZsYWdzICYgTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQpID09IDApCi0gICAgewotICAgICAgYmZkICppbnB1dF9iZmQ7Ci0KLSAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGlucHV0IGJmZHMuICAqLwotICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0JICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0JICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCi0JICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0gICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLSAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLSAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQotICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgfQotCi0JICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KLQkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotCSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCSAgICAgIGNoYXIgKm5ld19uYW1lOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgb2Ygc2VjdGlvbiBjb250ZW50cyBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICAgICAgZWxzZSBpZiAoc2VjdGlvbi0+X3Jhd19zaXplICE9IDApCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKiliZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgc2VjdGlvbiwKLQkJCQkJCSBjb250ZW50cywgKGZpbGVfcHRyKSAwLAotCQkJCQkJIHNlY3Rpb24tPl9yYXdfc2l6ZSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnRlbnRzID0gTlVMTDsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLiAgKi8KLQkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JCSAgJiYgc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKLQkJewotCi0JCSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLQkJICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkJICAgICAoaW5wdXRfYmZkLCBzZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJCSAgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkJICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQkgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLQkJICAvKiBOb3cgZXhhbWluZSBlYWNoIHJlbG9jYXRpb24uICAqLwotCQkgIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgaXJlbGVuZCA9IGlyZWwgKyBzZWN0aW9uLT5yZWxvY19jb3VudDsKLQkJICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQkJICAgIHsKLQkJICAgICAgbG9uZyByX3R5cGU7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKLQkJICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JCSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKLQkJICAgICAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pOwotCi0JCSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KVJfTU4xMDMwMF9NQVgpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBXZSBuZWVkIHRoZSBuYW1lIGFuZCBoYXNoIHRhYmxlIGVudHJ5IG9mIHRoZSB0YXJnZXQKLQkJCSBzeW1ib2whICAqLwotCQkgICAgICBoYXNoID0gTlVMTDsKLQkJICAgICAgc3ltID0gTlVMTDsKLQkJICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0KLQkJICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCQkJewotCQkJICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwKLQkJCQkJCSAgICBleHRzeW1zICsgcl9pbmRleCwgJmlzeW0pOwotCi0JCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJCSAgICBzeW1fc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAKLQkJCQkgICAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkJCSAgICBzeW1fc2VjCi0JCQkgICAgICA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIGlzeW0uc3Rfc2huZHgpOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkJCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCQkJICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgIGlzeW0uc3RfbmFtZSk7Ci0KLQkJCSAgLyogSWYgaXQgaXNuJ3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBkb24ndCBjYXJlCi0JCQkgICAgIGFib3V0IGl0LiAgKi8KLQkJCSAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkgICAgICAmJiBFTEZfU1RfVFlQRSAoaXN5bS5zdF9pbmZvKSAhPSBTVFRfRlVOQykKLQkJCSAgICBjb250aW51ZTsKLQotCQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkJICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJCSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJCQkgICAgICAgICBzeW1fbmFtZSwgdHJ1ZSwKLQkJCQkJCSAgICAgICAgIHRydWUsIGZhbHNlKTsKLQkJCSAgZnJlZSAobmV3X25hbWUpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHJfaW5kZXggLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkJCSAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCQkgICBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtyX2luZGV4XTsKLQkJCX0KLQotCQkgICAgICAvKiBJZiB0aGlzIGlzIG5vdCBhICJjYWxsIiBpbnN0cnVjdGlvbiwgdGhlbiB3ZQotCQkJIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgotCQkJIGluc3RydWN0aW9ucy4gICovCi0JCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwKLQkJCQkJY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCQkgICAgICBpZiAoY29kZSAhPSAweGRkICYmIGNvZGUgIT0gMHhjZCkKLQkJCWhhc2gtPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOwotCi0JCSAgICAgIC8qIElmIHRoaXMgaXMgYSBqdW1wL2NhbGwsIHRoZW4gYnVtcCB0aGUgZGlyZWN0X2NhbGxzCi0JCQkgY291bnRlci4gIEVsc2UgZm9yY2UgImNhbGwiIHRvICJjYWxscyIgY29udmVyc2lvbnMuICAqLwotCQkgICAgICBpZiAocl90eXBlID09IFJfTU4xMDMwMF9QQ1JFTDMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX01OMTAzMDBfUENSRUwxNikKLQkJCWhhc2gtPmRpcmVjdF9jYWxscysrOwotCQkgICAgICBlbHNlCi0JCQloYXNoLT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogTm93IGxvb2sgYXQgdGhlIGFjdHVhbCBjb250ZW50cyB0byBnZXQgdGhlIHN0YWNrIHNpemUsCi0JCSBhbmQgYSBsaXN0IG9mIHdoYXQgcmVnaXN0ZXJzIHdlcmUgc2F2ZWQgaW4gdGhlIHByb2xvZ3VlCi0JCSAoaWUgbW92bV9hcmdzKS4gICovCi0JICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCQl7Ci0KLQkJICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCQkgIGludCBpZHgsIHNobmR4OwotCi0JCSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgIHNlY3Rpb24pOwotCi0KLQkJICAvKiBMb29rIGF0IGVhY2ggZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24gYW5kCi0JCSAgICAgdXBkYXRlIGluZm8gZm9yIHRoYXQgZnVuY3Rpb24uICAqLwotCQkgIGVzeW0gPSBleHRzeW1zOwotCQkgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkJICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLQkJICAgIHsKLQkJICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0JCSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCQkgICYmIEVMRl9TVF9UWVBFIChpc3ltLnN0X2luZm8pID09IFNUVF9GVU5DKQotCQkJewotCQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwCi0JCQkJICAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCQkgICAgc3ltX3NlYwotCQkJICAgICAgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBpc3ltLnN0X3NobmR4KTsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQlpc3ltLnN0X25hbWUpOwotCi0JCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkJCSAgICAgbG9jYWwgc3ltYm9sIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0JCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkJICBzeW1fbmFtZSA9IG5ld19uYW1lOwotCi0JCQkgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkJICAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJCQkgICAgICAgICAgc3ltX25hbWUsIHRydWUsCi0JCQkJCQkgICAgICAgICAgdHJ1ZSwgZmFsc2UpOwotCQkJICBmcmVlIChuZXdfbmFtZSk7Ci0JCQkgIGNvbXB1dGVfZnVuY3Rpb25faW5mbyAoaW5wdXRfYmZkLCBoYXNoLAotCQkJCQkgICAgICAgICBpc3ltLnN0X3ZhbHVlLCBjb250ZW50cyk7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZQotCQkJCSAgICAgICAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0JCSAgZm9yIChpZHggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpZHgrKykKLQkJICAgIHsKLQkJICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0JCSAgICAgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgICAgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaWR4XTsKLQkJICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkJCSAgJiYgRUxGX1NUX1RZUEUgKGlzeW0uc3RfaW5mbykgPT0gU1RUX0ZVTkMKLQkJCSAgJiYgKGhhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWN0aW9uCi0JCQkgICYmICgoaGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICAgfHwgKGhhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQkJY29tcHV0ZV9mdW5jdGlvbl9pbmZvIChpbnB1dF9iZmQsIGhhc2gsCi0JCQkJCSAgICAgICAoaGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwKLQkJCQkJICAgICAgIGNvbnRlbnRzKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHJlbG9jcy4gICovCi0JICAgICAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0JCXsKLQkJICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgY29udGVudHMuICAqLwotCSAgICAgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQkgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICB9Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgc3ltYm9scy4gICovCi0JICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQlmcmVlIChmcmVlX2V4dHN5bXMpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQkJfQotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE5vdyBpdGVyYXRlIG9uIGVhY2ggc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlIGFuZCBwZXJmb3JtCi0JIHRoZSBmaW5hbCBpbml0aWFsaXphdGlvbiBzdGVwcyBvbiBlYWNoLiAgKi8KLSAgICAgIGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlIChoYXNoX3RhYmxlLAotCQkJCQllbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5LAotCQkJCQlOVUxMKTsKLSAgICAgIGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlIChoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZSwKLQkJCQkJZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSwKLQkJCQkJTlVMTCk7Ci0KLSAgICAgIC8qIEFsbCBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlIGFyZSBmdWxseSBpbml0aWFsaXplZC4gICovCi0gICAgICBoYXNoX3RhYmxlLT5mbGFncyB8PSBNTjEwMzAwX0hBU0hfRU5UUklFU19JTklUSUFMSVpFRDsKLQotICAgICAgLyogTm93IHRoYXQgZXZlcnl0aGluZyBoYXMgYmVlbiBpbml0aWFsaXplZCwgZ28gdGhyb3VnaCBlYWNoCi0JIGNvZGUgc2VjdGlvbiBhbmQgZGVsZXRlIGFueSBwcm9sb2d1ZSBpbnNucyB3aGljaCB3aWxsIGJlCi0JIHJlZHVuZGFudCBiZWNhdXNlIHRoZWlyIG9wZXJhdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkKLQkgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0JICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0JICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCi0JICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0gICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLSAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLSAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQotICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgfQotCi0JICAvKiBXYWxrIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KLQkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgc2huZHg7Ci0JICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQkgICAgICBpbnQgaWR4OwotCi0JICAgICAgLyogU2tpcCBub24tY29kZSBzZWN0aW9ucyBhbmQgZW1wdHkgc2VjdGlvbnMuICAqLwotCSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCB8fCBzZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKLQkJewotICAgICAgICAgICAgICAgICAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgICAgICAgICAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRfYmZkLCBzZWN0aW9uLCAoUFRSKSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgICAgICAgICAgICAgICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQl9Ci0KLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgb2Ygc2VjdGlvbiBjb250ZW50cyBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIHNlY3Rpb24sCi0JCQkJCQkgY29udGVudHMsIChmaWxlX3B0cikgMCwKLQkJCQkJCSBzZWN0aW9uLT5fcmF3X3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCi0JICAgICAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGlucHV0X2JmZCwgc2VjdGlvbik7Ci0KLQkgICAgICAvKiBOb3cgbG9vayBmb3IgYW55IGZ1bmN0aW9uIGluIHRoaXMgc2VjdGlvbiB3aGljaCBuZWVkcwotCQkgaW5zbnMgZGVsZXRlZCBmcm9tIGl0cyBwcm9sb2d1ZS4gICovCi0JICAgICAgZXN5bSA9IGV4dHN5bXM7Ci0JICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCQkgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0JCSAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0JCSAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0JCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQkJICBjaGFyICpuZXdfbmFtZTsKLQotCQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLQkJICBpZiAoaXN5bS5zdF9zaG5keCAhPSBzaG5keCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCSAgICBzeW1fc2VjCi0JCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bS5zdF9zaG5keCk7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQlzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCWlzeW0uc3RfbmFtZSk7Ci0KLQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JCSAgICAgbG9jYWwgc3ltYm9sIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0JCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkJICBzeW1faGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCSAgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkgICAgICAgICAgc3ltX25hbWUsIGZhbHNlLAotCQkJCQkgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLQotCQkgIGZyZWUgKG5ld19uYW1lKTsKLQkJICBpZiAoc3ltX2hhc2ggPT0gTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKCEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpCi0JCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTKSkKLQkJICAgIHsKLQkJICAgICAgaW50IGJ5dGVzID0gMDsKLQotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGluZ3MuICAqLwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopZXh0c3ltczsKLQkJICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgICAvKiBDb3VudCBob3cgbWFueSBieXRlcyB3ZSdyZSBnb2luZyB0byBkZWxldGUuICAqLwotCQkgICAgICBpZiAoc3ltX2hhc2gtPm1vdm1fYXJncykKLQkJCWJ5dGVzICs9IDI7Ci0KLQkJICAgICAgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDw9IDEyOCkKLQkJCWJ5dGVzICs9IDM7Ci0JCSAgICAgIGVsc2UgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplCi0JCQkgICAgICAgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPCAyNTYpCi0JCQlieXRlcyArPSA0OwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBkZWxldGVkIHByb2xvZ3VlIGJ5dGVzIGZvciB0aGlzCi0JCQkgZnVuY3Rpb24uICAqLwotCQkgICAgICBzeW1faGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTOwotCi0JCSAgICAgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotCQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoaW5wdXRfYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24sCi0JCQkJCQkJICAgaXN5bS5zdF92YWx1ZSwKLQkJCQkJCQkgICBieXRlcykpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZC4gIE5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dAotCQkJIG1heSBsZWFkIHRvIG1vcmUgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0JCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIExvb2sgZm9yIGFueSBnbG9iYWwgZnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiB3aGljaAotCQkgbmVlZCBpbnNucyBkZWxldGVkIGZyb20gdGhlaXIgcHJvbG9ndWVzLiAgKi8KLQkgICAgICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICAgICAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZQotCQkJCSAgIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLQkgICAgICBmb3IgKGlkeCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGlkeCsrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCQkgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLQkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICAgIChlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpZHhdKTsKLQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkgICAgICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWN0aW9uCi0JCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpCi0JCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTKSkKLQkJICAgIHsKLQkJICAgICAgaW50IGJ5dGVzID0gMDsKLQotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGluZ3MuICAqLwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopZXh0c3ltczsKLQkJICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgICAvKiBDb3VudCBob3cgbWFueSBieXRlcyB3ZSdyZSBnb2luZyB0byBkZWxldGUuICAqLwotCQkgICAgICBpZiAoc3ltX2hhc2gtPm1vdm1fYXJncykKLQkJCWJ5dGVzICs9IDI7Ci0KLQkJICAgICAgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDw9IDEyOCkKLQkJCWJ5dGVzICs9IDM7Ci0JCSAgICAgIGVsc2UgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplCi0JCQkgICAgICAgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPCAyNTYpCi0JCQlieXRlcyArPSA0OwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBkZWxldGVkIHByb2xvZ3VlIGJ5dGVzIGZvciB0aGlzCi0JCQkgZnVuY3Rpb24uICAqLwotCQkgICAgICBzeW1faGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTOwotCi0JCSAgICAgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotCQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoaW5wdXRfYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24sCi0JCQkJCQkJICAgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlLAotCQkJCQkJCSAgIGJ5dGVzKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAgIC8qIFNvbWV0aGluZyBjaGFuZ2VkLiAgTm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0Ci0JCQkgbWF5IGxlYWQgdG8gbW9yZSByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLQkJICAgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHJlbG9jcy4gICovCi0JICAgICAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0JCXsKLQkJICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgY29udGVudHMuICAqLwotCSAgICAgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQkgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICB9Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgc3ltYm9scy4gICovCi0JICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQlmcmVlIChmcmVlX2V4dHN5bXMpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQkJfQotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0KLSAgLyogKFJlKWluaXRpYWxpemUgZm9yIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzaG9ydGVuaW5nL3JlbGF4aW5nIHBhc3MuICAqLwotICBjb250ZW50cyA9IE5VTEw7Ci0gIGV4dHN5bXMgPSBOVUxMOwotICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIGZyZWVfY29udGVudHMgPSBOVUxMOwotICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZm9yIGEgcmVsb2NhdGVhYmxlIGxpbmssIGlmCi0gICAgIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHJlbG9jcywgb3IgaWYgdGhpcyBpcyBub3QgYQotICAgICBjb2RlIHNlY3Rpb24uICAqLwotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDAKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICAvKiBXYWxrIHRocm91Z2ggdGhlbSBsb29raW5nIGZvciByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlbGF4ZWQsIHRoZW4gaWdub3JlCi0JIHRoaXMgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfTk9ORQotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF84Ci0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX01BWCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCSAgY2hhciAqbmV3X25hbWU7Ci0KLQkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0KLQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMCAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgc3ltX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JICBzeW12YWwgPSAoaXN5bS5zdF92YWx1ZQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLAotCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCSAgICAgIGlzeW0uc3RfbmFtZSk7Ci0KLQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCSAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJZWxmX2xpbmtfaGFzaF9sb29rdXAgKCZoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwKLQkJCQkgICAgICBzeW1fbmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JICBmcmVlIChuZXdfbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCSAgLyogQW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgIGluZHggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkoZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdKTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAotIAkJc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotIAkJcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAzMmJpdCBwYy1yZWxhdGl2ZSBicmFuY2gvY2FsbCBpbnRvIGEgMTZiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoL2NhbGwsIGFsc28gZGVhbCB3aXRoICJjYWxsIiAtPiAiY2FsbHMiIGNvbnZlcnNpb25zIGFuZAotCSBpbnNlcnRpb24gb2YgcHJvbG9ndWUgZGF0YSBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUwzMikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBJZiB3ZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0dXJuZWQKLQkgICAgIGludG8gYSAiY2FsbHMiIGluc3RydWN0aW9uLCBkbyBzbyBub3cuICBJdCBzYXZlcyBhIGJ5dGUuICAqLwotCSAgaWYgKGggJiYgKGgtPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdyZSB3b3JraW5nIHdpdGggYSAiY2FsbCIgaW5zdHJ1Y3Rpb24hICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZGQpCi0JCXsKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLAotCQkgICAgIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCQkgIC8qIEZpeCBpcmVsLT5yX29mZnNldCBhbmQgaXJlbC0+cl9hZGRlbmQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDE7Ci0JCSAgaXJlbC0+cl9hZGRlbmQgKz0gMTsKLQotCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMywgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgpCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgc29tZSBkYXRhCi0JCSBmcm9tIHRhcmdldCBmdW5jdGlvbiBmaWxsZWQgaW4uICAqLwotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBJbnNlcnQgZGF0YSBmcm9tIHRoZSB0YXJnZXQgZnVuY3Rpb24gaW50byB0aGUgImNhbGwiCi0JCSBpbnN0cnVjdGlvbiBpZiBuZWVkZWQuICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZGQpCi0JCXsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPm1vdm1fYXJncywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgaC0+c3RhY2tfc2l6ZSArIGgtPm1vdm1fc3RhY2tfc2l6ZSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDUpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMsIG5vdGUgdGhlIGhpZ2ggdmFsdWUgaXMKLQkgICAgIDB4N2ZmZiArIDIgYXMgdGhlIHRhcmdldCB3aWxsIGJlIHR3byBieXRlcyBjbG9zZXIgaWYgd2UgYXJlCi0JICAgICBhYmxlIHRvIHJlbGF4LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4ODAwMSAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhkYyAmJiBjb2RlICE9IDB4ZGQgJiYgY29kZSAhPSAweGZmKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhkYykKLQkJYmZkX3B1dF84IChhYmZkLCAweGNjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGRkKQotCQliZmRfcHV0XzggKGFiZmQsIDB4Y2QsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZmYpCi0JCWJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JICAgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9NTjEwMzAwX1BDUkVMMTYpOwotCi0JICAgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgOGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2guICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUwxNikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBJZiB3ZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0dXJuZWQKLQkgICAgIGludG8gYSAiY2FsbHMiIGluc3RydWN0aW9uLCBkbyBzbyBub3cuICBJdCBzYXZlcyBhIGJ5dGUuICAqLwotCSAgaWYgKGggJiYgKGgtPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdyZSB3b3JraW5nIHdpdGggYSAiY2FsbCIgaW5zdHJ1Y3Rpb24hICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4Y2QpCi0JCXsKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLAotCQkgICAgIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCQkgIC8qIEZpeCBpcmVsLT5yX29mZnNldCBhbmQgaXJlbC0+cl9hZGRlbmQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDE7Ci0JCSAgaXJlbC0+cl9hZGRlbmQgKz0gMTsKLQotCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogSW5zZXJ0IGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGludG8gdGhlICJjYWxsIgotCQkgaW5zdHJ1Y3Rpb24gaWYgbmVlZGVkLiAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGNkKQotCQl7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBoLT5tb3ZtX2FyZ3MsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAyKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPnN0YWNrX3NpemUgKyBoLT5tb3ZtX3N0YWNrX3NpemUsCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAzKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gaXJlbC0+cl9vZmZzZXQ7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiA4IGJpdHMsIG5vdGUgdGhlIGhpZ2ggdmFsdWUgaXMKLQkgICAgIDB4N2YgKyAxIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSBvbmUgYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwICYmIChsb25nKXZhbHVlID4gLTB4ODApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhjYykKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhjYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9NTjEwMzAwX1BDUkVMOCk7Ci0KLQkgICAgICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAgICAgKmFnYWluID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVHJ5IHRvIGVsaW1pbmF0ZSBhbiB1bmNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlIGJyYW5jaAotCSB3aGljaCBpbW1lZGlhdGVseSBmb2xsb3dzIGEgY29uZGl0aW9uYWwgOCBiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoIGFyb3VuZCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guCi0KLQkgICAgb3JpZ2luYWw6CQluZXc6Ci0JICAgIGJDQyBsYWIxCQliQ0MnIGxhYjIKLQkgICAgYnJhIGxhYjIKLQkgICBsYWIxOgkgICAgICAgbGFiMToKLQotCi0JIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBiQ0MgY2FuJ3QgcmVhY2ggbGFiMiBhdCBhc3NlbWJseSB0aW1lLAotCSBidXQgZHVlIHRvIG90aGVyIHJlbGF4YXRpb25zIGl0IGNhbiByZWFjaCBhdCBsaW5rIHRpbWUuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUw4KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICpucmVsOwotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQkgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBEbyBub3RoaW5nIGlmIHRoaXMgcmVsb2MgaXMgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gc2VjLT5fY29va2VkX3NpemUpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTZWUgaWYgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYW4gdW5jb25kaXRpb25hbCBwYy1yZWxhdGl2ZQotCSAgICAgYnJhbmNoLCBtb3JlIG9mdGVuIHRoYW4gbm90IHRoaXMgdGVzdCB3aWxsIGZhaWwsIHNvIHdlCi0JICAgICB0ZXN0IGl0IGZpcnN0IHRvIHNwZWVkIHRoaW5ncyB1cC4gICovCi0JICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMSk7Ci0JICBpZiAoY29kZSAhPSAweGNhKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQWxzbyBtYWtlIHN1cmUgdGhlIG5leHQgcmVsb2NhdGlvbiBhcHBsaWVzIHRvIHRoZSBuZXh0Ci0JICAgICBpbnN0cnVjdGlvbiBhbmQgdGhhdCBpdCdzIGEgcGMtcmVsYXRpdmUgOCBiaXQgYnJhbmNoLiAgKi8KLQkgIG5yZWwgPSBpcmVsICsgMTsKLQkgIGlmIChucmVsID09IGlyZWxlbmQKLQkgICAgICB8fCBpcmVsLT5yX29mZnNldCArIDIgIT0gbnJlbC0+cl9vZmZzZXQKLQkgICAgICB8fCBFTEYzMl9SX1RZUEUgKG5yZWwtPnJfaW5mbykgIT0gKGludCkgUl9NTjEwMzAwX1BDUkVMOCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE1ha2Ugc3VyZSBvdXIgZGVzdGluYXRpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUKLQkgICAgIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLQkgIGlmIChzeW12YWwgIT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICsgaXJlbC0+cl9vZmZzZXQgKyAzKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE5vdyBtYWtlIHN1cmUgd2UgYXJlIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgVGhpcyBtYXkgbm90Ci0JICAgICBiZSBuZWNlc3NhcnksIGJ1dCB3aHkgdGFrZSB0aGUgY2hhbmNlLgotCi0JICAgICBOb3RlIHRoZXNlIGNoZWNrcyBhc3N1bWUgdGhhdCBSX01OMTAzMDBfUENSRUw4IHJlbG9jcwotCSAgICAgb25seSBvY2N1ciBvbiBiQ0MgYW5kIGJDQ3ggaW5zbnMuICBJZiB0aGV5IG9jY3VyZWQKLQkgICAgIGVsc2V3aGVyZSwgd2UnZCBuZWVkIHRvIGtub3cgdGhlIHN0YXJ0IG9mIHRoaXMgaW5zbgotCSAgICAgZm9yIHRoaXMgY2hlY2sgdG8gYmUgYWNjdXJhdGUuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhjMCAmJiBjb2RlICE9IDB4YzEgJiYgY29kZSAhPSAweGMyCi0JICAgICAgJiYgY29kZSAhPSAweGMzICYmIGNvZGUgIT0gMHhjNCAmJiBjb2RlICE9IDB4YzUKLQkgICAgICAmJiBjb2RlICE9IDB4YzYgJiYgY29kZSAhPSAweGM3ICYmIGNvZGUgIT0gMHhjOAotCSAgICAgICYmIGNvZGUgIT0gMHhjOSAmJiBjb2RlICE9IDB4ZTggJiYgY29kZSAhPSAweGU5Ci0JICAgICAgJiYgY29kZSAhPSAweGVhICYmIGNvZGUgIT0gMHhlYikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFdlIGFsc28gaGF2ZSB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHN5bWJvbC9sYWJlbAotCSAgICAgYXQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLQkgIGlmIChtbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsCi0JCQkJCSAgICBpcmVsLT5yX29mZnNldCArIDEpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotCSAgc3dpdGNoIChjb2RlKQotCSAgICB7Ci0JICAgICAgY2FzZSAweGM4OgotCQljb2RlID0gMHhjOTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM5OgotCQljb2RlID0gMHhjODsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMwOgotCQljb2RlID0gMHhjMjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMyOgotCQljb2RlID0gMHhjMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMzOgotCQljb2RlID0gMHhjMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMxOgotCQljb2RlID0gMHhjMzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM0OgotCQljb2RlID0gMHhjNjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM2OgotCQljb2RlID0gMHhjNDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM3OgotCQljb2RlID0gMHhjNTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM1OgotCQljb2RlID0gMHhjNzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU4OgotCQljb2RlID0gMHhlOTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDlkOgotCQljb2RlID0gMHhlODsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVhOgotCQljb2RlID0gMHhlYjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGViOgotCQljb2RlID0gMHhlYTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAvKiBTZXQgdGhlIHJlbG9jIHR5cGUgYW5kIHN5bWJvbCBmb3IgdGhlIGZpcnN0IGJyYW5jaAotCSAgICAgZnJvbSB0aGUgc2Vjb25kIGJyYW5jaC4gICovCi0JICBpcmVsLT5yX2luZm8gPSBucmVsLT5yX2luZm87Ci0KLQkgIC8qIE1ha2UgdGhlIHJlbG9jIGZvciB0aGUgc2Vjb25kIGJyYW5jaCBhIG51bGwgcmVsb2MuICAqLwotCSAgbnJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKLQkJCQkgICAgICAgUl9NTjEwMzAwX05PTkUpOwotCi0JICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICphZ2FpbiA9IHRydWU7Ci0JfQotCi0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMzJiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF8zMikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLgotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBNb3N0IGluc25zIHdoaWNoIGhhdmUgMzJiaXQgb3BlcmFuZHMgYXJlIDYgYnl0ZXMgbG9uZzsKLQkJIGV4Y2VwdGlvbnMgYXJlIHBjcmVsIGluc25zIGFuZCBiaXQgaW5zbnMuCi0KLQkJIFdlIGhhbmRsZSBwY3JlbCBpbnNucyBhYm92ZS4gIFdlIGRvbid0IGJvdGhlciB0cnlpbmcKLQkJIHRvIGhhbmRsZSB0aGUgYml0IGluc25zIGhlcmUuCi0KLQkJIFRoZSBmaXJzdCBieXRlIG9mIHRoZSByZW1haW5pbmcgaW5zbnMgd2lsbCBiZSAweGZjLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGZjKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKChjb2RlICYgMHhmMCkgPCAweDgwKQotCQlzd2l0Y2ggKGNvZGUgJiAweGYwKQotCQkgIHsKLQkJICAvKiBtb3YgKGQzMixhbSksZG4gICAtPiBtb3YgKGQzMixhbSksZG4KLQkJICAgICBtb3YgZG0sKGQzMixhbSkgICAtPiBtb3YgZG4sKGQzMixhbSkKLQkJICAgICBtb3YgKGQzMixhbSksYW4gICAtPiBtb3YgKGQzMixhbSksYW4KLQkJICAgICBtb3YgZG0sKGQzMixhbSkgICAtPiBtb3YgZG4sKGQzMixhbSkKLQkJICAgICBtb3ZidSAoZDMyLGFtKSxkbiAtPiBtb3ZidSAoZDMyLGFtKSxkbgotCQkgICAgIG1vdmJ1IGRtLChkMzIsYW0pIC0+IG1vdmJ1IGRuLChkMzIsYW0pCi0JCSAgICAgbW92aHUgKGQzMixhbSksZG4gLT4gbW92aHUgKGQzMixhbSksZG4KLQkJICAgICBtb3ZodSBkbSwoZDMyLGFtKSAtPiBtb3ZodSBkbiwoZDMyLGFtKSAqLwotCQkgIGNhc2UgMHgwMDoKLQkJICBjYXNlIDB4MTA6Ci0JCSAgY2FzZSAweDIwOgotCQkgIGNhc2UgMHgzMDoKLQkJICBjYXNlIDB4NDA6Ci0JCSAgY2FzZSAweDUwOgotCQkgIGNhc2UgMHg2MDoKLQkJICBjYXNlIDB4NzA6Ci0JCSAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICAqLwotCQkgICAgaWYgKGNvZGUgPT0gMHhjYwotCQkJJiYgKHZhbHVlICYgMHg4MDAwKSkKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMikpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYwKSA9PSAweDgwCi0JCSAgICAgICB8fCAoY29kZSAmIDB4ZjApID09IDB4OTApCi0JCXN3aXRjaCAoY29kZSAmIDB4ZjMpCi0JCSAgewotCQkgIC8qIG1vdiBkbiwoYWJzMzIpICAgLT4gbW92IGRuLChhYnMxNikKLQkJICAgICBtb3ZidSBkbiwoYWJzMzIpIC0+IG1vdmJ1IGRuLChhYnMxNikKLQkJICAgICBtb3ZodSBkbiwoYWJzMzIpIC0+IG1vdmh1IGRuLChhYnMxNikgICovCi0JCSAgY2FzZSAweDgxOgotCQkgIGNhc2UgMHg4MjoKLQkJICBjYXNlIDB4ODM6Ci0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgaWYgKChjb2RlICYgMHhmMykgPT0gMHg4MSkKLQkJICAgICAgY29kZSA9IDB4MDEgKyAoY29kZSAmIDB4MGMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYzKSA9PSAweDgyKQotCQkgICAgICBjb2RlID0gMHgwMiArIChjb2RlICYgMHgwYyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZjMpID09IDB4ODMpCi0JCSAgICAgIGNvZGUgPSAweDAzICsgKGNvZGUgJiAweDBjKTsKLQkJICAgIGVsc2UKLQkJICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogVGhlIG9wY29kZSBnb3Qgc2hvcnRlciB0b28sIHNvIHdlIGhhdmUgdG8gZml4IHRoZQotCQkgICAgICAgYWRkZW5kIGFuZCBvZmZzZXQgdG9vISAgKi8KLQkJICAgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAgIC8qIERlbGV0ZSB0aHJlZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMykpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQotCQkgIC8qIG1vdiBhbSwoYWJzMzIpICAgIC0+IG1vdiBhbSwoYWJzMTYpCi0JCSAgICAgbW92IGFtLChkMzIsc3ApICAgLT4gbW92IGFtLChkMTYsc3ApCi0JCSAgICAgbW92IGRtLChkMzIsc3ApICAgLT4gbW92IGRtLChkMzIsc3ApCi0JCSAgICAgbW92YnUgZG0sKGQzMixzcCkgLT4gbW92YnUgZG0sKGQzMixzcCkKLQkJICAgICBtb3ZodSBkbSwoZDMyLHNwKSAtPiBtb3ZodSBkbSwoZDMyLHNwKSAqLwotCQkgIGNhc2UgMHg4MDoKLQkJICBjYXNlIDB4OTA6Ci0JCSAgY2FzZSAweDkxOgotCQkgIGNhc2UgMHg5MjoKLQkJICBjYXNlIDB4OTM6Ci0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgICAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDIsIDIpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIGVsc2UgaWYgKChjb2RlICYgMHhmMCkgPCAweGYwKQotCQlzd2l0Y2ggKGNvZGUgJiAweGZjKQotCQkgIHsKLQkJICAvKiBtb3YgaW1tMzIsZG4gICAgIC0+IG1vdiBpbW0xNixkbgotCQkgICAgIG1vdiBpbW0zMixhbiAgICAgLT4gbW92IGltbTE2LGFuCi0JCSAgICAgbW92IChhYnMzMiksZG4gICAtPiBtb3YgKGFiczE2KSxkbgotCQkgICAgIG1vdmJ1IChhYnMzMiksZG4gLT4gbW92YnUgKGFiczE2KSxkbgotCQkgICAgIG1vdmh1IChhYnMzMiksZG4gLT4gbW92aHUgKGFiczE2KSxkbiAgKi8KLQkJICBjYXNlIDB4Y2M6Ci0JCSAgY2FzZSAweGRjOgotCQkgIGNhc2UgMHhhNDoKLQkJICBjYXNlIDB4YTg6Ci0JCSAgY2FzZSAweGFjOgotCQkgICAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQotCQkgICAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KLQkJICAgIGlmIChjb2RlID09IDB4Y2MKLQkJCSYmICh2YWx1ZSAmIDB4ODAwMCkpCi0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjYykKLQkJICAgICAgY29kZSA9IDB4MmMgKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGRjKQotCQkgICAgICBjb2RlID0gMHgyNCArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YTQpCi0JCSAgICAgIGNvZGUgPSAweDMwICsgKGNvZGUgJiAweDAzKTsKLQkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhOCkKLQkJICAgICAgY29kZSA9IDB4MzQgKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGFjKQotCQkgICAgICBjb2RlID0gMHgzOCArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKLQkJICAgICAgIGFkZGVuZCBhbmQgb2Zmc2V0IHRvbyEgICovCi0JCSAgICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgICAvKiBEZWxldGUgdGhyZWUgYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDEsIDMpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0KLQkJICAvKiBtb3YgKGFiczMyKSxhbiAgICAtPiBtb3YgKGFiczE2KSxhbgotCQkgICAgIG1vdiAoZDMyLHNwKSxhbiAgIC0+IG1vdiAoZDMyLHNwKSxhbgotCQkgICAgIG1vdiAoZDMyLHNwKSxkbiAgIC0+IG1vdiAoZDMyLHNwKSxkbgotCQkgICAgIG1vdmJ1IChkMzIsc3ApLGRuIC0+IG1vdmJ1IChkMzIsc3ApLGRuCi0JCSAgICAgbW92aHUgKGQzMixzcCksZG4gLT4gbW92aHUgKGQzMixzcCksZG4KLQkJICAgICBhZGQgaW1tMzIsZG4gICAgICAtPiBhZGQgaW1tMTYsZG4KLQkJICAgICBjbXAgaW1tMzIsZG4gICAgICAtPiBjbXAgaW1tMTYsZG4KLQkJICAgICBhZGQgaW1tMzIsYW4gICAgICAtPiBhZGQgaW1tMTYsYW4KLQkJICAgICBjbXAgaW1tMzIsYW4gICAgICAtPiBjbXAgaW1tMTYsYW4KLQkJICAgICBhbmQgaW1tMzIsZG4gICAgICAtPiBhbmQgaW1tMzIsZG4KLQkJICAgICBvciBpbW0zMixkbiAgICAgICAtPiBvciBpbW0zMixkbgotCQkgICAgIHhvciBpbW0zMixkbiAgICAgIC0+IHhvciBpbW0zMixkbgotCQkgICAgIGJ0c3QgaW1tMzIsZG4gICAgIC0+IGJ0c3QgaW1tMzIsZG4gKi8KLQotCQkgIGNhc2UgMHhhMDoKLQkJICBjYXNlIDB4YjA6Ci0JCSAgY2FzZSAweGIxOgotCQkgIGNhc2UgMHhiMjoKLQkJICBjYXNlIDB4YjM6Ci0JCSAgY2FzZSAweGMwOgotCQkgIGNhc2UgMHhjODoKLQotCQkgIGNhc2UgMHhkMDoKLQkJICBjYXNlIDB4ZDg6Ci0JCSAgY2FzZSAweGUwOgotCQkgIGNhc2UgMHhlMToKLQkJICBjYXNlIDB4ZTI6Ci0JCSAgY2FzZSAweGUzOgotCQkgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSBSX01OMTAzMDBfMTYpOwotCi0JCSAgICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZmUpCi0JCXsKLQkJICAvKiBhZGQgaW1tMzIsc3AgLT4gYWRkIGltbTE2LHNwICAqLwotCi0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIHN0YWNrIHNpemUgYW5kIG1vdm0gYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24KLSAgIHJlZmVycmVkIHRvIGJ5IEhBU0ggYXQgYWRkcmVzcyBBRERSIGluIHNlY3Rpb24gd2l0aAotICAgY29udGVudHMgQ09OVEVOVFMsIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgdm9pZAotY29tcHV0ZV9mdW5jdGlvbl9pbmZvIChhYmZkLCBoYXNoLCBhZGRyLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZTEsIGJ5dGUyOwotICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgYSB2ZXJ5IHNtYWxsIHN1YnNldCBvZiB0aGUgcG9zc2libGUgcHJvbG9ndWUKLSAgICAgc2VxdWVuY2VzIGhlcmUuICBCYXNpY2FsbHkgd2UgbG9vayBmb3I6Ci0KLSAgICAgbW92bSBbZDIsZDMsYTIsYTNdLHNwIChvcHRpb25hbCkKLSAgICAgYWRkIDxzaXplPixzcCAob3B0aW9uYWwsIGFuZCBvbmx5IGZvciBzaXplcyB3aGljaCBmaXQgaW4gYW4gdW5zaWduZWQKLQkJICAgIDggYml0IG51bWJlcikKLQotICAgICBJZiB3ZSBmaW5kIGFueXRoaW5nIGVsc2UsIHdlIHF1aXQuICAqLwotCi0gIC8qIExvb2sgZm9yIG1vdm0gW3JlZ3NdLHNwICovCi0gIGJ5dGUxID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIpOwotICBieXRlMiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMSk7Ci0KLSAgaWYgKGJ5dGUxID09IDB4Y2YpCi0gICAgewotICAgICAgaGFzaC0+bW92bV9hcmdzID0gYnl0ZTI7Ci0gICAgICBhZGRyICs9IDI7Ci0gICAgICBieXRlMSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgICAgIGJ5dGUyID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAxKTsKLSAgICB9Ci0KLSAgLyogTm93IGZpZ3VyZSBvdXQgaG93IG11Y2ggc3RhY2sgc3BhY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhlIG1vdm0KLSAgICAgaW5zdHJ1Y3Rpb24uICBXZSBuZWVkIHRoaXMga2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBmdW50aW9uJ3Mgbm9ybWFsCi0gICAgIHN0YWNrIHNwYWNlLiAgKi8KLSAgaWYgKGhhc2gtPm1vdm1fYXJncykKLSAgICB7Ci0gICAgICAvKiBTcGFjZSBmb3IgZDIuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4ODApCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFNwYWNlIGZvciBkMy4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHg0MCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNDsKLQotICAgICAgLyogU3BhY2UgZm9yIGEyLiAgKi8KLSAgICAgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDIwKQotCWhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA0OwotCi0gICAgICAvKiBTcGFjZSBmb3IgYTMuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4MTApCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7Ci0KLSAgICAgIC8qICJvdGhlciIgc3BhY2UuICBkMCwgZDEsIGEwLCBhMSwgbWRyLCBsaXIsIGxhciwgNCBieXRlIHBhZC4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgwOCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gOCAqIDQ7Ci0KLSAgICB9Ci0KLSAgLyogTm93IGxvb2sgZm9yIHRoZSB0d28gc3RhY2sgYWRqdXN0bWVudCB2YXJpYW50cy4gICovCi0gIGlmIChieXRlMSA9PSAweGY4ICYmIGJ5dGUyID09IDB4ZmUpCi0gICAgewotICAgICAgaW50IHRlbXAgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOwotICAgICAgdGVtcCA9ICgodGVtcCAmIDB4ZmYpIF4gKH4weDdmKSkgKyAweDgwOwotCi0gICAgICBoYXNoLT5zdGFja19zaXplID0gLXRlbXA7Ci0gICAgfQotICBlbHNlIGlmIChieXRlMSA9PSAweGZhICYmIGJ5dGUyID09IDB4ZmUpCi0gICAgewotICAgICAgaW50IHRlbXAgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgICAgIHRlbXAgPSAoKHRlbXAgJiAweGZmZmYpIF4gKH4weDdmZmYpKSArIDB4ODAwMDsKLSAgICAgIHRlbXAgPSAtdGVtcDsKLQotICAgICAgaWYgKHRlbXAgPCAyNTUpCi0JaGFzaC0+c3RhY2tfc2l6ZSA9IHRlbXA7Ci0gICAgfQotCi0gIC8qIElmIHRoZSB0b3RhbCBzdGFjayB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaXMgbW9yZQotICAgICB0aGFuIDI1NSBieXRlcywgdGhlbiB3ZSBjYW4ndCByZW1vdmUgdGhlIHN0YWNrIGFkanVzdG1lbnQgYnkgdXNpbmcKLSAgICAgImNhbGwiICh3ZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIHJlbW92ZSB0aGUgIm1vdm0iIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGhhc2gtPnN0YWNrX3NpemUgKyBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgPiAyNTUpCi0gICAgaGFzaC0+c3RhY2tfc2l6ZSA9IDA7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gIGludCBzaG5keCwgaW5kZXg7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCi0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikpCi0JaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgotCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotICAgICAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCSAgIChlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdKTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGEgc3ltYm9sIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgZWxzZSByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBpbnQgc2huZHg7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoLCAqKnN5bV9oYXNoX2VuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIC8qIEV4YW1pbmUgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPT0gYWRkcikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqKShlbGZfc3ltX2hhc2hlcyAoYWJmZCkpOwotICBzeW1faGFzaF9lbmQgPSAoc3ltX2hhc2gKLQkJICArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pCi0JCSAgICAgLSBzeW10YWJfaGRyLT5zaF9pbmZvKSk7Ci0gIGZvciAoOyBzeW1faGFzaCA8IHN5bV9oYXNoX2VuZDsgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKCpzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKCpzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1tbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0JZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLQlmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotCWZyZWUgKGV4dGVybmFsX3N5bXMpOwotICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0JZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKLSAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQXNzb3J0ZWQgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICAqLwotCi0vKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gTU4xMDMwMCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldC0+ZGlyZWN0X2NhbGxzID0gMDsKLSAgICAgIHJldC0+c3RhY2tfc2l6ZSA9IDA7Ci0gICAgICByZXQtPm1vdm1fc3RhY2tfc2l6ZSA9IDA7Ci0gICAgICByZXQtPmZsYWdzID0gMDsKLSAgICAgIHJldC0+bW92bV9hcmdzID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gbW4xMDMwMCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXQtPmZsYWdzID0gMDsKLSAgcmV0LT5zdGF0aWNfaGFzaF90YWJsZQotICAgID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQtPnN0YXRpY19oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0LT5zdGF0aWNfaGFzaF90YWJsZSk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotc3RhdGljIGludAotZWxmX21uMTAzMDBfbWFjaCAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTU4xMDMwMF9NQUNIKQotICAgIHsKLSAgICAgIGNhc2UgRV9NTjEwMzAwX01BQ0hfTU4xMDMwMDoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBiZmRfbWFjaF9tbjEwMzAwOwotCi0gICAgfQotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGEgTU4xMDMwMCBFTEYgb2JqZWN0Ci0gICBmaWxlLiAgVGhpcyBnZXRzIHRoZSBNTjEwMzAwIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZQotICAgbnVtYmVyLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1fYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGludCBpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmhkcnBwOwotICBjb25zdCBjaGFyICpuYW1lOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBiZmRfbWFjaF9tbjEwMzAwOgotCXZhbCA9IEVfTU4xMDMwMF9NQUNIX01OMTAzMDA7Ci0JYnJlYWs7Ci0KLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfiAoRUZfTU4xMDMwMF9NQUNIKTsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi1ib29sZWFuCi1fYmZkX21uMTAzMDBfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX21uMTAzMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZl9tbjEwMzAwX21hY2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX21uMTAzMDBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotICAgICAgJiYgYmZkX2dldF9tYWNoIChvYmZkKSA8IGJmZF9nZXRfbWFjaCAoaWJmZCkpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9tYWNoIChpYmZkKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfbW4xMDMwMF92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1tbjEwMzAwIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbW4xMDMwMAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19NTjEwMzAwCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCW1uMTAzMDBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCW1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJbW4xMDMwMF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQkJbW4xMDMwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0KLSNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0KLS8qIFNvIHdlIGNhbiBzZXQgYml0cyBpbiBlX2ZsYWdzLiAgKi8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9vYmplY3RfcAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZi5jIGIvYmZkL2VsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2QyM2M0Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMDEgKzAsMCBAQAotLyogRUxGIGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi1TRUNUSU9OCi0JRUxGIGJhY2tlbmRzCi0KLQlCRkQgc3VwcG9ydCBmb3IgRUxGIGZvcm1hdHMgaXMgYmVpbmcgd29ya2VkIG9uLgotCUN1cnJlbnRseSwgdGhlIGJlc3Qgc3VwcG9ydGVkIGJhY2sgZW5kcyBhcmUgZm9yIHNwYXJjIGFuZCBpMzg2Ci0JKHJ1bm5pbmcgc3ZyNCBvciBTb2xhcmlzIDIpLgotCi0JRG9jdW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWxzIG9mIHRoZSBzdXBwb3J0IGNvZGUgc3RpbGwgbmVlZHMKLQl0byBiZSB3cml0dGVuLiAgVGhlIGNvZGUgaXMgY2hhbmdpbmcgcXVpY2tseSBlbm91Z2ggdGhhdCB3ZQotCWhhdmVuJ3QgYm90aGVyZWQgeWV0LgotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jZGVmaW5lIEFSQ0hfU0laRSAwCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgSU5MSU5FIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm1ha2VfbWFwcGluZwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgZWxmX3NvcnRfc2VjdGlvbnMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcmVwX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN3YXBfb3V0X3N5bXMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKiosIGludCkpOwotc3RhdGljIGJvb2xlYW4gY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGNoYXIgKmVsZl9yZWFkIFBBUkFNUyAoKGJmZCAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGVsZl9mYWtlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFzc2lnbl9zZWN0aW9uX251bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IHN5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX21hcF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBTd2FwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gYW5kIG91dC4gIFRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzCi0gICBjdXJyZW50bHkgc2l6ZSBpbmRlcGVuZGVudC4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbAotICAgbmVlZCB0byBtb3ZlIGludG8gZWxmY29kZS5oLiAgKi8KLQotLyogU3dhcCBpbiBhIFZlcmRlZiBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRlZiAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICpkc3Q7Ci17Ci0gIGRzdC0+dmRfdmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF92ZXJzaW9uKTsKLSAgZHN0LT52ZF9mbGFncyAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZkX2ZsYWdzKTsKLSAgZHN0LT52ZF9uZHggICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZkX25keCk7Ci0gIGRzdC0+dmRfY250ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9jbnQpOwotICBkc3QtPnZkX2hhc2ggICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfaGFzaCk7Ci0gIGRzdC0+dmRfYXV4ICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZF9hdXgpOwotICBkc3QtPnZkX25leHQgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVyZGVmIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRlZiAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52ZF92ZXJzaW9uLCBkc3QtPnZkX3ZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfZmxhZ3MsIGRzdC0+dmRfZmxhZ3MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfbmR4LCBkc3QtPnZkX25keCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52ZF9jbnQsIGRzdC0+dmRfY250KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkX2hhc2gsIGRzdC0+dmRfaGFzaCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9hdXgsIGRzdC0+dmRfYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkX25leHQsIGRzdC0+dmRfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJkYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRhdXggKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggKmRzdDsKLXsKLSAgZHN0LT52ZGFfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZGFfbmFtZSk7Ci0gIGRzdC0+dmRhX25leHQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRhX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcmRhdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRhdXggKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcmRhdXggKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkYV9uYW1lLCBkc3QtPnZkYV9uYW1lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkYV9uZXh0LCBkc3QtPnZkYV9uZXh0KTsKLX0KLQotLyogU3dhcCBpbiBhIFZlcm5lZWQgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqZHN0OwotewotICBkc3QtPnZuX3ZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5fdmVyc2lvbik7Ci0gIGRzdC0+dm5fY250ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bl9jbnQpOwotICBkc3QtPnZuX2ZpbGUgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fZmlsZSk7Ci0gIGRzdC0+dm5fYXV4ICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bl9hdXgpOwotICBkc3QtPnZuX25leHQgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fbmV4dCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVybmVlZCBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dm5fdmVyc2lvbiwgZHN0LT52bl92ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuX2NudCwgZHN0LT52bl9jbnQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5fZmlsZSwgZHN0LT52bl9maWxlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX2F1eCwgZHN0LT52bl9hdXgpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5fbmV4dCwgZHN0LT52bl9uZXh0KTsKLX0KLQotLyogU3dhcCBpbiBhIFZlcm5hdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqZHN0OwotewotICBkc3QtPnZuYV9oYXNoICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bmFfaGFzaCk7Ci0gIGRzdC0+dm5hX2ZsYWdzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuYV9mbGFncyk7Ci0gIGRzdC0+dm5hX290aGVyID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuYV9vdGhlcik7Ci0gIGRzdC0+dm5hX25hbWUgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuYV9uYW1lKTsKLSAgZHN0LT52bmFfbmV4dCAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5hX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcm5hdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5hdXggKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1Zlcm5hdXggKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuYV9oYXNoLCBkc3QtPnZuYV9oYXNoKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuYV9mbGFncywgZHN0LT52bmFfZmxhZ3MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dm5hX290aGVyLCBkc3QtPnZuYV9vdGhlcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfbmFtZSwgZHN0LT52bmFfbmFtZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfbmV4dCwgZHN0LT52bmFfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJzeW0gc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJzeW0gKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcnN5bSAqZHN0OwotewotICBkc3QtPnZzX3ZlcnMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dnNfdmVycyk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVyc3ltIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcnN5bSAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVyc3ltICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52c192ZXJzLCBkc3QtPnZzX3ZlcnMpOwotfQotCi0vKiBTdGFuZGFyZCBFTEYgaGFzaCBmdW5jdGlvbi4gIERvIG5vdCBjaGFuZ2UgdGhpcyBmdW5jdGlvbjsgeW91IHdpbGwKLSAgIGNhdXNlIGludmFsaWQgaGFzaCB0YWJsZXMgdG8gYmUgZ2VuZXJhdGVkLiAgKi8KLXVuc2lnbmVkIGxvbmcKLWJmZF9lbGZfaGFzaCAobmFtZSkKLSAgICAgQ09OU1QgdW5zaWduZWQgY2hhciAqbmFtZTsKLXsKLSAgdW5zaWduZWQgbG9uZyBoID0gMDsKLSAgdW5zaWduZWQgbG9uZyBnOwotICBpbnQgY2g7Ci0KLSAgd2hpbGUgKChjaCA9ICpuYW1lKyspICE9ICdcMCcpCi0gICAgewotICAgICAgaCA9IChoIDw8IDQpICsgY2g7Ci0gICAgICBpZiAoKGcgPSAoaCAmIDB4ZjAwMDAwMDApKSAhPSAwKQotCXsKLQkgIGggXj0gZyA+PiAyNDsKLQkgIC8qIFRoZSBFTEYgQUJJIHNheXMgYGggJj0gfmcnLCBidXQgdGhpcyBpcyBlcXVpdmFsZW50IGluCi0JICAgICB0aGlzIGNhc2UgYW5kIG9uIHNvbWUgbWFjaGluZXMgb25lIGluc24gaW5zdGVhZCBvZiB0d28uICAqLwotCSAgaCBePSBnOwotCX0KLSAgICB9Ci0gIHJldHVybiBoOwotfQotCi0vKiBSZWFkIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBhdCBhIHNwZWNpZmllZCBvZmZzZXQgaW4gYW4gRUxGCi0gICBmaWxlLCBpbnRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciwgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlCi0gICBidWZmZXIuICovCi0KLXN0YXRpYyBjaGFyICoKLWVsZl9yZWFkIChhYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgY2hhciAqYnVmOwotCi0gIGlmICgoYnVmID0gYmZkX2FsbG9jIChhYmZkLCBzaXplKSkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBidWYsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBidWY7Ci19Ci0KLWJvb2xlYW4KLWJmZF9lbGZfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIC8qIHRoaXMganVzdCBkb2VzIGluaXRpYWxpemF0aW9uICovCi0gIC8qIGNvZmZfbWtvYmplY3QgemFsbG9jJ3Mgc3BhY2UgZm9yIHRkYXRhLmNvZmZfb2JqX2RhdGEgLi4uICovCi0gIGVsZl90ZGF0YSAoYWJmZCkgPSAoc3RydWN0IGVsZl9vYmpfdGRhdGEgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChlbGZfdGRhdGEgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBzaW5jZSBldmVyeXRoaW5nIGlzIGRvbmUgYXQgY2xvc2UgdGltZSwgZG8gd2UgbmVlZCBhbnkKLSAgICAgaW5pdGlhbGl6YXRpb24/ICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWJmZF9lbGZfbWtjb3JlZmlsZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgLyogSSB0aGluayB0aGlzIGNhbiBiZSBkb25lIGp1c3QgbGlrZSBhbiBvYmplY3QgZmlsZS4gKi8KLSAgcmV0dXJuIGJmZF9lbGZfbWtvYmplY3QgKGFiZmQpOwotfQotCi1jaGFyICoKLWJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIChhYmZkLCBzaGluZGV4KQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwotICBjaGFyICpzaHN0cnRhYiA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBzaHN0cnRhYnNpemU7Ci0KLSAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0gIGlmIChpX3NoZHJwID09IDAgfHwgaV9zaGRycFtzaGluZGV4XSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHNoc3RydGFiID0gKGNoYXIgKikgaV9zaGRycFtzaGluZGV4XS0+Y29udGVudHM7Ci0gIGlmIChzaHN0cnRhYiA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vIGNhY2hlZCBvbmUsIGF0dGVtcHQgdG8gcmVhZCwgYW5kIGNhY2hlIHdoYXQgd2UgcmVhZC4gKi8KLSAgICAgIG9mZnNldCA9IGlfc2hkcnBbc2hpbmRleF0tPnNoX29mZnNldDsKLSAgICAgIHNoc3RydGFic2l6ZSA9IGlfc2hkcnBbc2hpbmRleF0tPnNoX3NpemU7Ci0gICAgICBzaHN0cnRhYiA9IGVsZl9yZWFkIChhYmZkLCBvZmZzZXQsIHNoc3RydGFic2l6ZSk7Ci0gICAgICBpX3NoZHJwW3NoaW5kZXhdLT5jb250ZW50cyA9IChQVFIpIHNoc3RydGFiOwotICAgIH0KLSAgcmV0dXJuIHNoc3RydGFiOwotfQotCi1jaGFyICoKLWJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIHNoaW5kZXgsIHN0cmluZGV4KQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLSAgICAgdW5zaWduZWQgaW50IHN0cmluZGV4OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0gIGlmIChzdHJpbmRleCA9PSAwKQotICAgIHJldHVybiAiIjsKLQotICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdOwotCi0gIGlmIChoZHItPmNvbnRlbnRzID09IE5VTEwKLSAgICAgICYmIGJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIChhYmZkLCBzaGluZGV4KSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChzdHJpbmRleCA+PSBoZHItPnNoX3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBpbnZhbGlkIHN0cmluZyBvZmZzZXQgJXUgPj0gJWx1IGZvciBzZWN0aW9uIGAlcyciKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN0cmluZGV4LCAodW5zaWduZWQgbG9uZykgaGRyLT5zaF9zaXplLAotCSAoKHNoaW5kZXggPT0gZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keAotCSAgICYmIHN0cmluZGV4ID09IGhkci0+c2hfbmFtZSkKLQkgID8gIi5zaHN0cnRhYiIKLQkgIDogZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIgKGFiZmQsIGhkci0+c2hfbmFtZSkpKTsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgcmV0dXJuICgoY2hhciAqKSBoZHItPmNvbnRlbnRzKSArIHN0cmluZGV4OwotfQotCi0vKiBNYWtlIGEgQkZEIHNlY3Rpb24gZnJvbSBhbiBFTEYgc2VjdGlvbi4gIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGUKLSAgIEJGRCBzZWN0aW9uIGluIHRoZSBiZmRfc2VjdGlvbiBmaWVsZCBvZiB0aGUgaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKHN0cmNtcCAobmFtZSwKLQkJCSAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24pKSA9PSAwKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAobmV3c2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuZXdzZWN0LT5maWxlcG9zID0gaGRyLT5zaF9vZmZzZXQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAoYWJmZCwgbmV3c2VjdCwgaGRyLT5zaF9hZGRyKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgbmV3c2VjdCwgaGRyLT5zaF9zaXplKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBuZXdzZWN0LAotCQkJCSAgICAgIGJmZF9sb2cyIChoZHItPnNoX2FkZHJhbGlnbikpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmbGFncyA9IFNFQ19OT19GTEFHUzsKLSAgaWYgKGhkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotICAgIGZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGlmICgoaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBmbGFncyB8PSBTRUNfQUxMT0M7Ci0gICAgICBpZiAoaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0gICAgfQotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfV1JJVEUpID09IDApCi0gICAgZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKSAhPSAwKQotICAgIGZsYWdzIHw9IFNFQ19DT0RFOwotICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICBmbGFncyB8PSBTRUNfREFUQTsKLQotICAvKiBUaGUgZGVidWdnaW5nIHNlY3Rpb25zIGFwcGVhciB0byBiZSByZWNvZ25pemVkIG9ubHkgYnkgbmFtZSwgbm90Ci0gICAgIGFueSBzb3J0IG9mIGZsYWcuICAqLwotICBpZiAoc3RybmNtcCAobmFtZSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIiAtIDEpID09IDAKLSAgICAgIHx8IHN0cm5jbXAgKG5hbWUsICIubGluZSIsIHNpemVvZiAiLmxpbmUiIC0gMSkgPT0gMAotICAgICAgfHwgc3RybmNtcCAobmFtZSwgIi5zdGFiIiwgc2l6ZW9mICIuc3RhYiIgLSAxKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0KLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlLCB3ZQotICAgICBvbmx5IGxpbmsgYSBzaW5nbGUgY29weSBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0Ci0gICAgIGcrKy4gIGcrKyB3aWxsIGVtaXQgZWFjaCB0ZW1wbGF0ZSBleHBhbnNpb24gaW4gaXRzIG93biBzZWN0aW9uLgotICAgICBUaGUgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgYXMgd2Vhaywgc28gdGhhdCBtdWx0aXBsZSBkZWZpbml0aW9ucwotICAgICBhcmUgcGVybWl0dGVkLiAgVGhlIEdOVSBsaW5rZXIgZXh0ZW5zaW9uIGlzIHRvIGFjdHVhbGx5IGRpc2NhcmQKLSAgICAgYWxsIGJ1dCBvbmUgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251LmxpbmtvbmNlIiwgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0gICAgZmxhZ3MgfD0gU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QsIGZsYWdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKChmbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHBoZHJzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgbG1hLgotICAgICAgICAgSWYgYWxsIHRoZSBwX3BhZGRyIGZpZWxkcyBhcmUgemVybywgd2UgaWdub3JlIHRoZW0sIHNpbmNlCi0gICAgICAgICBzb21lIEVMRiBsaW5rZXJzIHByb2R1Y2Ugc3VjaCBvdXRwdXQuICAqLwotICAgICAgcGhkciA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07IGkrKywgcGhkcisrKQotCXsKLQkgIGlmIChwaGRyLT5wX3BhZGRyICE9IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW0pCi0JewotCSAgcGhkciA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0JICBmb3IgKGkgPSAwOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07IGkrKywgcGhkcisrKQotCSAgICB7Ci0JICAgICAgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9MT0FECi0JCSAgJiYgcGhkci0+cF92YWRkciAhPSBwaGRyLT5wX3BhZGRyCi0JCSAgJiYgcGhkci0+cF92YWRkciA8PSBoZHItPnNoX2FkZHIKLQkJICAmJiAocGhkci0+cF92YWRkciArIHBoZHItPnBfbWVtc3oKLQkJICAgICAgPj0gaGRyLT5zaF9hZGRyICsgaGRyLT5zaF9zaXplKQotCQkgICYmICgoZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotCQkgICAgICB8fCAocGhkci0+cF9vZmZzZXQgPD0gKGJmZF92bWEpIGhkci0+c2hfb2Zmc2V0Ci0JCQkgICYmIChwaGRyLT5wX29mZnNldCArIHBoZHItPnBfZmlsZXN6Ci0JCQkgICAgICA+PSBoZHItPnNoX29mZnNldCArIGhkci0+c2hfc2l6ZSkpKSkKLQkJewotCQkgIG5ld3NlY3QtPmxtYSArPSBwaGRyLT5wX3BhZGRyIC0gcGhkci0+cF92YWRkcjsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBoZHItPmJmZF9zZWN0aW9uID0gbmV3c2VjdDsKLSAgZWxmX3NlY3Rpb25fZGF0YSAobmV3c2VjdCktPnRoaXNfaGRyID0gKmhkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2VsZl9maW5kX3NlY3Rpb24KLQotU1lOT1BTSVMKLQlzdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKmJmZF9lbGZfZmluZF9zZWN0aW9uIChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCUhlbHBlciBmdW5jdGlvbnMgZm9yIEdEQiB0byBsb2NhdGUgdGhlIHN0cmluZyB0YWJsZXMuCi0JU2luY2UgQkZEIGhpZGVzIHN0cmluZyB0YWJsZXMgZnJvbSBjYWxsZXJzLCBHREIgbmVlZHMgdG8gdXNlIGFuCi0JaW50ZXJuYWwgaG9vayB0byBmaW5kIHRoZW0uICBTdW4ncyAuc3RhYnN0ciwgaW4gcGFydGljdWxhciwKLQlpc24ndCBldmVuIHBvaW50ZWQgdG8gYnkgdGhlIC5zdGFiIHNlY3Rpb24sIHNvIG9yZGluYXJ5Ci0JbWVjaGFuaXNtcyB3b3VsZG4ndCB3b3JrIHRvIGZpbmQgaXQsIGV2ZW4gaWYgd2UgaGFkIHNvbWUuCi0qLwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKgotYmZkX2VsZl9maW5kX3NlY3Rpb24gKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgY2hhciAqc2hzdHJ0YWI7Ci0gIHVuc2lnbmVkIGludCBtYXg7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpZiAoaV9zaGRycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNoc3RydGFiID0gYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24KLQkoYWJmZCwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgpOwotICAgICAgaWYgKHNoc3RydGFiICE9IE5VTEwpCi0JewotCSAgbWF4ID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0JICBmb3IgKGkgPSAxOyBpIDwgbWF4OyBpKyspCi0JICAgIGlmICghc3RyY21wICgmc2hzdHJ0YWJbaV9zaGRycFtpXS0+c2hfbmFtZV0sIG5hbWUpKQotCSAgICAgIHJldHVybiBpX3NoZHJwW2ldOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1jb25zdCBjaGFyICpjb25zdCBiZmRfZWxmX3NlY3Rpb25fdHlwZV9uYW1lc1tdID0gewotICAiU0hUX05VTEwiLCAiU0hUX1BST0dCSVRTIiwgIlNIVF9TWU1UQUIiLCAiU0hUX1NUUlRBQiIsCi0gICJTSFRfUkVMQSIsICJTSFRfSEFTSCIsICJTSFRfRFlOQU1JQyIsICJTSFRfTk9URSIsCi0gICJTSFRfTk9CSVRTIiwgIlNIVF9SRUwiLCAiU0hUX1NITElCIiwgIlNIVF9EWU5TWU0iLAotfTsKLQotLyogRUxGIHJlbG9jcyBhcmUgYWdhaW5zdCBzeW1ib2xzLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUKLSAgIG91dHB1dCwgYW5kIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcKLSAgIGhhcyBnaXZlbiB1cyBhbnkgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvCi0gICBiZSBhZ2FpbnN0IHRoZSBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvCi0gICBjaGFuZ2UgYW55dGhpbmcgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbAotICAgYWxsIGJlIGRvbmUgYXQgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlCi0gICBpbnRvIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotDAotLyogUHJpbnQgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBmYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmYXJnOwotewotICBGSUxFICpmID0gKEZJTEUgKikgZmFyZzsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnA7Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZHluYnVmID0gTlVMTDsKLQotICBwID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaSwgYzsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5Qcm9ncmFtIEhlYWRlcjpcbiIpKTsKLSAgICAgIGMgPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyssIHArKykKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCSAgY2hhciBidWZbMjBdOwotCi0JICBzd2l0Y2ggKHAtPnBfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFBUX05VTEw6IHMgPSAiTlVMTCI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0xPQUQ6IHMgPSAiTE9BRCI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0RZTkFNSUM6IHMgPSAiRFlOQU1JQyI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0lOVEVSUDogcyA9ICJJTlRFUlAiOyBicmVhazsKLQkgICAgY2FzZSBQVF9OT1RFOiBzID0gIk5PVEUiOyBicmVhazsKLQkgICAgY2FzZSBQVF9TSExJQjogcyA9ICJTSExJQiI7IGJyZWFrOwotCSAgICBjYXNlIFBUX1BIRFI6IHMgPSAiUEhEUiI7IGJyZWFrOwotCSAgICBkZWZhdWx0OiBzcHJpbnRmIChidWYsICIweCVseCIsIHAtPnBfdHlwZSk7IHMgPSBidWY7IGJyZWFrOwotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiJThzIG9mZiAgICAweCIsIHMpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfb2Zmc2V0KTsKLQkgIGZwcmludGYgKGYsICIgdmFkZHIgMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX3ZhZGRyKTsKLQkgIGZwcmludGYgKGYsICIgcGFkZHIgMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX3BhZGRyKTsKLQkgIGZwcmludGYgKGYsICIgYWxpZ24gMioqJXVcbiIsIGJmZF9sb2cyIChwLT5wX2FsaWduKSk7Ci0JICBmcHJpbnRmIChmLCAiICAgICAgICAgZmlsZXN6IDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9maWxlc3opOwotCSAgZnByaW50ZiAoZiwgIiBtZW1zeiAweCIpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfbWVtc3opOwotCSAgZnByaW50ZiAoZiwgIiBmbGFncyAlYyVjJWMiLAotCQkgICAocC0+cF9mbGFncyAmIFBGX1IpICE9IDAgPyAncicgOiAnLScsCi0JCSAgIChwLT5wX2ZsYWdzICYgUEZfVykgIT0gMCA/ICd3JyA6ICctJywKLQkJICAgKHAtPnBfZmxhZ3MgJiBQRl9YKSAhPSAwID8gJ3gnIDogJy0nKTsKLQkgIGlmICgocC0+cF9mbGFncyAmfiAoUEZfUiB8IFBGX1cgfCBQRl9YKSkgIT0gMCkKLQkgICAgZnByaW50ZiAoZiwgIiAlbHgiLCBwLT5wX2ZsYWdzICZ+IChQRl9SIHwgUEZfVyB8IFBGX1gpKTsKLQkgIGZwcmludGYgKGYsICJcbiIpOwotCX0KLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgZWxmc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBsaW5rOwotICAgICAgYmZkX2J5dGUgKmV4dGR5biwgKmV4dGR5bmVuZDsKLSAgICAgIHNpemVfdCBleHRkeW5zaXplOwotICAgICAgdm9pZCAoKnN3YXBfZHluX2luKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5EeW5hbWljIFNlY3Rpb246XG4iKSk7Ci0KLSAgICAgIGR5bmJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKGR5bmJ1ZiA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCAoUFRSKSBkeW5idWYsIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBzLT5fcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotICAgICAgaWYgKGVsZnNlYyA9PSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLSAgICAgIGV4dGR5bnNpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9keW47Ci0gICAgICBzd2FwX2R5bl9pbiA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c3dhcF9keW5faW47Ci0KLSAgICAgIGV4dGR5biA9IGR5bmJ1ZjsKLSAgICAgIGV4dGR5bmVuZCA9IGV4dGR5biArIHMtPl9yYXdfc2l6ZTsKLSAgICAgIGZvciAoOyBleHRkeW4gPCBleHRkeW5lbmQ7IGV4dGR5biArPSBleHRkeW5zaXplKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYWJbMjBdOwotCSAgYm9vbGVhbiBzdHJpbmdwOwotCi0JICAoKnN3YXBfZHluX2luKSAoYWJmZCwgKFBUUikgZXh0ZHluLCAmZHluKTsKLQotCSAgaWYgKGR5bi5kX3RhZyA9PSBEVF9OVUxMKQotCSAgICBicmVhazsKLQotCSAgc3RyaW5ncCA9IGZhbHNlOwotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzcHJpbnRmIChhYiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIGR5bi5kX3RhZyk7Ci0JICAgICAgbmFtZSA9IGFiOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTkVFREVEOiBuYW1lID0gIk5FRURFRCI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICJQTFRSRUxTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVEdPVDogbmFtZSA9ICJQTFRHT1QiOyBicmVhazsKLQkgICAgY2FzZSBEVF9IQVNIOiBuYW1lID0gIkhBU0giOyBicmVhazsKLQkgICAgY2FzZSBEVF9TVFJUQUI6IG5hbWUgPSAiU1RSVEFCIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1lNVEFCOiBuYW1lID0gIlNZTVRBQiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEE6IG5hbWUgPSAiUkVMQSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEFTWjogbmFtZSA9ICJSRUxBU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBRU5UOiBuYW1lID0gIlJFTEFFTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TVFJTWjogbmFtZSA9ICJTVFJTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTUVOVDogbmFtZSA9ICJTWU1FTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9JTklUOiBuYW1lID0gIklOSVQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9GSU5JOiBuYW1lID0gIkZJTkkiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TT05BTUU6IG5hbWUgPSAiU09OQU1FIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1JQQVRIOiBuYW1lID0gIlJQQVRIIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTUJPTElDOiBuYW1lID0gIlNZTUJPTElDIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMOiBuYW1lID0gIlJFTCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTFNaOiBuYW1lID0gIlJFTFNaIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMRU5UOiBuYW1lID0gIlJFTEVOVCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTDogbmFtZSA9ICJQTFRSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9ERUJVRzogbmFtZSA9ICJERUJVRyI7IGJyZWFrOwotCSAgICBjYXNlIERUX1RFWFRSRUw6IG5hbWUgPSAiVEVYVFJFTCI7IGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogbmFtZSA9ICJKTVBSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9BVVhJTElBUlk6IG5hbWUgPSAiQVVYSUxJQVJZIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX0ZJTFRFUjogbmFtZSA9ICJGSUxURVIiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSU1lNOiBuYW1lID0gIlZFUlNZTSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUkRFRjogbmFtZSA9ICJWRVJERUYiOyBicmVhazsKLQkgICAgY2FzZSBEVF9WRVJERUZOVU06IG5hbWUgPSAiVkVSREVGTlVNIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSTkVFRDogbmFtZSA9ICJWRVJORUVEIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSTkVFRE5VTTogbmFtZSA9ICJWRVJORUVETlVNIjsgYnJlYWs7Ci0JICAgIH0KLQotCSAgZnByaW50ZiAoZiwgIiAgJS0xMXMgIiwgbmFtZSk7Ci0JICBpZiAoISBzdHJpbmdwKQotCSAgICBmcHJpbnRmIChmLCAiMHglbHgiLCAodW5zaWduZWQgbG9uZykgZHluLmRfdW4uZF92YWwpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotCi0JICAgICAgc3RyaW5nID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQlkeW4uZF91bi5kX3ZhbCk7Ci0JICAgICAgaWYgKHN0cmluZyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcHJpbnRmIChmLCAiJXMiLCBzdHJpbmcpOwotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiXG4iKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGR5bmJ1Zik7Ci0gICAgICBkeW5idWYgPSBOVUxMOwotICAgIH0KLQotICBpZiAoKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0gICAgICB8fCAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPT0gTlVMTCkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqdDsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5WZXJzaW9uIGRlZmluaXRpb25zOlxuIikpOwotICAgICAgZm9yICh0ID0gZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmOyB0ICE9IE5VTEw7IHQgPSB0LT52ZF9uZXh0ZGVmKQotCXsKLQkgIGZwcmludGYgKGYsICIlZCAweCUyLjJ4IDB4JTguOGx4ICVzXG4iLCB0LT52ZF9uZHgsCi0JCSAgIHQtPnZkX2ZsYWdzLCB0LT52ZF9oYXNoLCB0LT52ZF9ub2RlbmFtZSk7Ci0JICBpZiAodC0+dmRfYXV4cHRyLT52ZGFfbmV4dHB0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggKmE7Ci0KLQkgICAgICBmcHJpbnRmIChmLCAiXHQiKTsKLQkgICAgICBmb3IgKGEgPSB0LT52ZF9hdXhwdHItPnZkYV9uZXh0cHRyOwotCQkgICBhICE9IE5VTEw7Ci0JCSAgIGEgPSBhLT52ZGFfbmV4dHB0cikKLQkJZnByaW50ZiAoZiwgIiVzICIsIGEtPnZkYV9ub2RlbmFtZSk7Ci0JICAgICAgZnByaW50ZiAoZiwgIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVycmVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJcblZlcnNpb24gUmVmZXJlbmNlczpcbiIpKTsKLSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dm5fbmV4dHJlZikKLQl7Ci0JICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCSAgZnByaW50ZiAoZiwgXygiICByZXF1aXJlZCBmcm9tICVzOlxuIiksIHQtPnZuX2ZpbGVuYW1lKTsKLQkgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JICAgIGZwcmludGYgKGYsICIgICAgMHglOC44bHggMHglMi4yeCAlMi4yZCAlc1xuIiwgYS0+dm5hX2hhc2gsCi0JCSAgICAgYS0+dm5hX2ZsYWdzLCBhLT52bmFfb3RoZXIsIGEtPnZuYV9ub2RlbmFtZSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGlzcGxheSBFTEYtc3BlY2lmaWMgZmllbGRzIG9mIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotYmZkX2VsZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiZWxmICIpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHN5bWJvbC0+dmFsdWUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlbHgiLCAobG9uZykgc3ltYm9sLT5mbGFncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZTsKLQlzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPyBzeW1ib2wtPnNlY3Rpb24tPm5hbWUgOiAiKCpub25lKikiOwotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0JZnByaW50ZiAoZmlsZSwgIiAlc1x0Iiwgc2VjdGlvbl9uYW1lKTsKLQkvKiBQcmludCB0aGUgIm90aGVyIiB2YWx1ZSBmb3IgYSBzeW1ib2wuICBGb3IgY29tbW9uIHN5bWJvbHMsCi0JICAgd2UndmUgYWxyZWFkeSBwcmludGVkIHRoZSBzaXplOyBub3cgcHJpbnQgdGhlIGFsaWdubWVudC4KLQkgICBGb3Igb3RoZXIgc3ltYm9scywgd2UgaGF2ZSBubyBzcGVjaWZpZWQgYWxpZ25tZW50LCBhbmQKLQkgICB3ZSd2ZSBwcmludGVkIHRoZSBhZGRyZXNzOyBub3cgcHJpbnQgdGhlIHNpemUuICAqLwotCWZwcmludGZfdm1hIChmaWxlLAotCQkgICAgIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLQkJICAgICAgPyAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlCi0JCSAgICAgIDogKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplKSk7Ci0KLQkvKiBJZiB3ZSBoYXZlIHZlcnNpb24gaW5mb3JtYXRpb24sIHByaW50IGl0LiAgKi8KLQlpZiAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX3NlY3Rpb24gIT0gMAotCSAgICAmJiAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX3NlY3Rpb24gIT0gMAotCQl8fCBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfc2VjdGlvbiAhPSAwKSkKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHZlcm51bTsKLQkgICAgY29uc3QgY2hhciAqdmVyc2lvbl9zdHJpbmc7Ci0KLQkgICAgdmVybnVtID0gKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+dmVyc2lvbiAmIFZFUlNZTV9WRVJTSU9OOwotCi0JICAgIGlmICh2ZXJudW0gPT0gMCkKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9ICIiOwotCSAgICBlbHNlIGlmICh2ZXJudW0gPT0gMSkKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9ICJCYXNlIjsKLQkgICAgZWxzZSBpZiAodmVybnVtIDw9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzKQotCSAgICAgIHZlcnNpb25fc3RyaW5nID0KLQkJZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmW3Zlcm51bSAtIDFdLnZkX25vZGVuYW1lOwotCSAgICBlbHNlCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotCQl2ZXJzaW9uX3N0cmluZyA9ICIiOwotCQlmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7Ci0JCSAgICAgdCAhPSBOVUxMOwotCQkgICAgIHQgPSB0LT52bl9uZXh0cmVmKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0JCSAgICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgICAgICB7Ci0JCQlpZiAoYS0+dm5hX290aGVyID09IHZlcm51bSkKLQkJCSAgewotCQkJICAgIHZlcnNpb25fc3RyaW5nID0gYS0+dm5hX25vZGVuYW1lOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmICgoKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+dmVyc2lvbiAmIFZFUlNZTV9ISURERU4pID09IDApCi0JICAgICAgZnByaW50ZiAoZmlsZSwgIiAgJS0xMXMiLCB2ZXJzaW9uX3N0cmluZyk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBpOwotCi0JCWZwcmludGYgKGZpbGUsICIgKCVzKSIsIHZlcnNpb25fc3RyaW5nKTsKLQkJZm9yIChpID0gMTAgLSBzdHJsZW4gKHZlcnNpb25fc3RyaW5nKTsgaSA+IDA7IC0taSkKLQkJICBwdXRjICgnICcsIGZpbGUpOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIElmIHRoZSBzdF9vdGhlciBmaWVsZCBpcyBub3QgemVybywgcHJpbnQgaXQuICAqLwotCWlmICgoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyICE9IDApCi0JICBmcHJpbnRmIChmaWxlLCAiIDB4JTAyeCIsCi0JCSAgICgodW5zaWduZWQgaW50KQotCQkgICAgKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcikpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPnNpemUgPSAwOwotICAgICAgcmV0LT5keW5pbmR4ID0gLTE7Ci0gICAgICByZXQtPmR5bnN0cl9pbmRleCA9IDA7Ci0gICAgICByZXQtPndlYWtkZWYgPSBOVUxMOwotICAgICAgcmV0LT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0LT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0LT5saW5rZXJfc2VjdGlvbl9wb2ludGVyID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopMDsKLSAgICAgIHJldC0+dmVyaW5mby52ZXJkZWYgPSBOVUxMOwotICAgICAgcmV0LT52dGFibGVfZW50cmllc191c2VkID0gTlVMTDsKLSAgICAgIHJldC0+dnRhYmxlX2VudHJpZXNfc2l6ZSA9IDA7Ci0gICAgICByZXQtPnZ0YWJsZV9wYXJlbnQgPSBOVUxMOwotICAgICAgcmV0LT50eXBlID0gU1RUX05PVFlQRTsKLSAgICAgIHJldC0+b3RoZXIgPSAwOwotICAgICAgLyogQXNzdW1lIHRoYXQgd2UgaGF2ZSBiZWVuIGNhbGxlZCBieSBhIG5vbi1FTEYgc3ltYm9sIHJlYWRlci4KLSAgICAgICAgIFRoaXMgZmxhZyBpcyB0aGVuIHJlc2V0IGJ5IHRoZSBjb2RlIHdoaWNoIHJlYWRzIGFuIEVMRiBpbnB1dAotICAgICAgICAgZmlsZS4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgc3ltYm9sIGNyZWF0ZWQgYnkgYSBub24tRUxGIHN5bWJvbAotICAgICAgICAgcmVhZGVyIHdpbGwgaGF2ZSB0aGUgZmxhZyBzZXQgY29ycmVjdGx5LiAgKi8KLSAgICAgIHJldC0+ZWxmX2xpbmtfaGFzaF9mbGFncyA9IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkID0gZmFsc2U7Ci0gIHRhYmxlLT5keW5vYmogPSBOVUxMOwotICAvKiBUaGUgZmlyc3QgZHluYW1pYyBzeW1ib2wgaXMgYSBkdW1teS4gICovCi0gIHRhYmxlLT5keW5zeW1jb3VudCA9IDE7Ci0gIHRhYmxlLT5keW5zdHIgPSBOVUxMOwotICB0YWJsZS0+YnVja2V0Y291bnQgPSAwOwotICB0YWJsZS0+bmVlZGVkID0gTlVMTDsKLSAgdGFibGUtPmhnb3QgPSBOVUxMOwotICB0YWJsZS0+c3RhYl9pbmZvID0gTlVMTDsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKHJldCwgYWJmZCwgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBmb3IgdGhlIEVMRiBlbXVsYXRpb24gY29kZSBpbiB0aGUgZ2VuZXJpYyBsaW5rZXIgdG8KLSAgIHRlbGwgdGhlIGJhY2tlbmQgbGlua2VyIHdoYXQgZmlsZSBuYW1lIHRvIHVzZSBmb3IgdGhlIERUX05FRURFRAotICAgZW50cnkgZm9yIGEgZHluYW1pYyBvYmplY3QuICBUaGUgZ2VuZXJpYyBsaW5rZXIgcGFzc2VzIG5hbWUgYXMgYW4KLSAgIGVtcHR5IHN0cmluZyB0byBpbmRpY2F0ZSB0aGF0IG5vIERUX05FRURFRCBlbnRyeSBzaG91bGQgYmUgbWFkZS4gICovCi0KLXZvaWQKLWJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0KQotICAgIGVsZl9kdF9uYW1lIChhYmZkKSA9IG5hbWU7Ci19Ci0KLS8qIEdldCB0aGUgbGlzdCBvZiBEVF9ORUVERUQgZW50cmllcyBmb3IgYSBsaW5rLiAgVGhpcyBpcyBhIGhvb2sgZm9yCi0gICB0aGUgbGlua2VyIEVMRiBlbXVsYXRpb24gY29kZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqCi1iZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgYWN0dWFsbHkgdXNlZCBmb3IgYSBkeW5hbWljIG9iamVjdCBmb3IgYSBsaW5rLiAgVGhpcwotICAgaXMgdGhlIFNPTkFNRSBlbnRyeSBpZiB0aGVyZSBpcyBvbmUuICBPdGhlcndpc2UsIGl0IGlzIHRoZSBzdHJpbmcKLSAgIHBhc3NlZCB0byBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSwgb3IgaXQgaXMgdGhlIGZpbGVuYW1lLiAgKi8KLQotY29uc3QgY2hhciAqCi1iZmRfZWxmX2dldF9kdF9zb25hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIGVsZl9kdF9uYW1lIChhYmZkKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdldCB0aGUgbGlzdCBvZiBEVF9ORUVERUQgZW50cmllcyBmcm9tIGEgQkZELiAgVGhpcyBpcyBhIGhvb2sgZm9yCi0gICB0aGUgRUxGIGxpbmtlciBlbXVsYXRpb24gY29kZS4gICovCi0KLWJvb2xlYW4KLWJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCAoYWJmZCwgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKipwbmVlZGVkOwotewotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKmR5bmJ1ZiA9IE5VTEw7Ci0gIGludCBlbGZzZWM7Ci0gIHVuc2lnbmVkIGxvbmcgbGluazsKLSAgYmZkX2J5dGUgKmV4dGR5biwgKmV4dGR5bmVuZDsKLSAgc2l6ZV90IGV4dGR5bnNpemU7Ci0gIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0KLSAgKnBuZWVkZWQgPSBOVUxMOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwgfHwgcy0+X3Jhd19zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHluYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChkeW5idWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIChQVFIpIGR5bmJ1ZiwgKGZpbGVfcHRyKSAwLAotCQkJCSAgcy0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotICBpZiAoZWxmc2VjID09IC0xKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLSAgZXh0ZHluc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2R5bjsKLSAgc3dhcF9keW5faW4gPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnN3YXBfZHluX2luOwotCi0gIGV4dGR5biA9IGR5bmJ1ZjsKLSAgZXh0ZHluZW5kID0gZXh0ZHluICsgcy0+X3Jhd19zaXplOwotICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4gKz0gZXh0ZHluc2l6ZSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQotICAgICAgKCpzd2FwX2R5bl9pbikgKGFiZmQsIChQVFIpIGV4dGR5biwgJmR5bik7Ci0KLSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfTlVMTCkKLQlicmVhazsKLQotICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQpCi0JewotCSAgY29uc3QgY2hhciAqc3RyaW5nOwotCSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0JICBzdHJpbmcgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAotCQkJCQkJICAgIGR5bi5kX3VuLmRfdmFsKTsKLQkgIGlmIChzdHJpbmcgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGwgPSAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICpsKTsKLQkgIGlmIChsID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBsLT5ieSA9IGFiZmQ7Ci0JICBsLT5uYW1lID0gc3RyaW5nOwotCSAgbC0+bmV4dCA9ICpwbmVlZGVkOwotCSAgKnBuZWVkZWQgPSBsOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAoZHluYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEFsbG9jYXRlIGFuIEVMRiBzdHJpbmcgdGFibGUtLWZvcmNlIHRoZSBmaXJzdCBieXRlIHRvIGJlIHplcm8uICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpCi17Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnJldDsKLQotICByZXQgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsb2M7Ci0KLSAgICAgIGxvYyA9IF9iZmRfc3RyaW5ndGFiX2FkZCAocmV0LCAiIiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgQkZEX0FTU0VSVCAobG9jID09IDAgfHwgbG9jID09IChiZmRfc2l6ZV90eXBlKSAtMSk7Ci0gICAgICBpZiAobG9jID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQl7Ci0JICBfYmZkX3N0cmluZ3RhYl9mcmVlIChyZXQpOwotCSAgcmV0ID0gTlVMTDsKLQl9Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotDAotLyogRUxGIC5vL2V4ZWMgZmlsZSByZWFkaW5nICovCi0KLS8qIENyZWF0ZSBhIG5ldyBiZmQgc2VjdGlvbiBmcm9tIGFuIEVMRiBzZWN0aW9uIGhlYWRlci4gKi8KLQotYm9vbGVhbgotYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBzaGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaGluZGV4OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XTsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmVoZHIgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgY2hhciAqbmFtZTsKLQotICBuYW1lID0gZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIgKGFiZmQsIGhkci0+c2hfbmFtZSk7Ci0KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX05VTEw6Ci0gICAgICAvKiBJbmFjdGl2ZSBzZWN0aW9uLiBUaHJvdyBpdCBhd2F5LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSBTSFRfUFJPR0JJVFM6CS8qIE5vcm1hbCBzZWN0aW9uIHdpdGggY29udGVudHMuICAqLwotICAgIGNhc2UgU0hUX0RZTkFNSUM6CS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgY2FzZSBTSFRfTk9CSVRTOgkvKiAuYnNzIHNlY3Rpb24uICAqLwotICAgIGNhc2UgU0hUX0hBU0g6CS8qIC5oYXNoIHNlY3Rpb24uICAqLwotICAgIGNhc2UgU0hUX05PVEU6CS8qIC5ub3RlIHNlY3Rpb24uICAqLwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLSAgICBjYXNlIFNIVF9TWU1UQUI6CQkvKiBBIHN5bWJvbCB0YWJsZSAqLwotICAgICAgaWYgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IHNoaW5kZXgpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfZW50c2l6ZSA9PSBiZWQtPnMtPnNpemVvZl9zeW0pOwotICAgICAgQkZEX0FTU0VSVCAoZWxmX29uZXN5bXRhYiAoYWJmZCkgPT0gMCk7Ci0gICAgICBlbGZfb25lc3ltdGFiIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyID0gKmhkcjsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gICAgICAvKiBTb21ldGltZXMgYSBzaGFyZWQgb2JqZWN0IHdpbGwgbWFwIGluIHRoZSBzeW1ib2wgdGFibGUuICBJZgotICAgICAgICAgU0hGX0FMTE9DIGlzIHNldCwgYW5kIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCB0aGVuIHdlIGFsc28KLSAgICAgICAgIHRyZWF0IHRoaXMgc2VjdGlvbiBhcyBhIEJGRCBzZWN0aW9uLiAgV2UgY2FuIG5vdCBiYXNlIHRoZQotICAgICAgICAgZGVjaXNpb24gcHVyZWx5IG9uIFNIRl9BTExPQywgYmVjYXVzZSB0aGF0IGZsYWcgaXMgc29tZXRpbWVzCi0gICAgICAgICBzZXQgaW4gYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdGhlCi0gICAgICAgICBsaW5rZXIuICAqLwotICAgICAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JICAmJiAhIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgU0hUX0RZTlNZTToJCS8qIEEgZHluYW1pYyBzeW1ib2wgdGFibGUgKi8KLSAgICAgIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSBzaGluZGV4KQotCXJldHVybiB0cnVlOwotCi0gICAgICBCRkRfQVNTRVJUIChoZHItPnNoX2VudHNpemUgPT0gYmVkLT5zLT5zaXplb2Zfc3ltKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApOwotICAgICAgZWxmX2R5bnN5bXRhYiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkciA9ICpoZHI7Ci0gICAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICAgICAgLyogQmVzaWRlcyBiZWluZyBhIHN5bWJvbCB0YWJsZSwgd2UgYWxzbyB0cmVhdCB0aGlzIGFzIGEgcmVndWxhcgotCSBzZWN0aW9uLCBzbyB0aGF0IG9iamNvcHkgY2FuIGhhbmRsZSBpdC4gICovCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1NUUlRBQjoJCS8qIEEgc3RyaW5nIHRhYmxlICovCi0gICAgICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotCXJldHVybiB0cnVlOwotICAgICAgaWYgKGVoZHItPmVfc2hzdHJuZHggPT0gc2hpbmRleCkKLQl7Ci0JICBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIgPSAqaGRyOwotCSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHI7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgZWhkci0+ZV9zaG51bTsgaSsrKQotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyMiA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaV07Ci0JICAgIGlmIChoZHIyLT5zaF9saW5rID09IHNoaW5kZXgpCi0JICAgICAgewotCQlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IGkpCi0JCSAgewotCQkgICAgZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkciA9ICpoZHI7Ci0JCSAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0KLQkJICAgICAgJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJICB9Ci0JCWlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSBpKQotCQkgIHsKLQkJICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnN0cnRhYl9oZHIgPSAqaGRyOwotCQkgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkciA9Ci0JCSAgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zdHJ0YWJfaGRyOwotCQkgICAgLyogV2UgYWxzbyB0cmVhdCB0aGlzIGFzIGEgcmVndWxhciBzZWN0aW9uLCBzbwotCQkgICAgICAgdGhhdCBvYmpjb3B5IGNhbiBoYW5kbGUgaXQuICAqLwotCQkgICAgYnJlYWs7Ci0JCSAgfQotI2lmIDAgLyogTm90IGhhbmRsaW5nIG90aGVyIHN0cmluZyB0YWJsZXMgc3BlY2lhbGx5IHJpZ2h0IG5vdy4gICovCi0JCWhkcjIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2ldOwkvKiBpbiBjYXNlIGl0IG1vdmVkICovCi0JCS8qIFdlIGhhdmUgYSBzdHJ0YWIgZm9yIHNvbWUgcmFuZG9tIG90aGVyIHNlY3Rpb24uICAqLwotCQluZXdzZWN0ID0gKGFzZWN0aW9uICopIGhkcjItPmJmZF9zZWN0aW9uOwotCQlpZiAoIW5ld3NlY3QpCi0JCSAgYnJlYWs7Ci0JCWhkci0+YmZkX3NlY3Rpb24gPSBuZXdzZWN0OwotCQloZHIyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG5ld3NlY3QpLT5zdHJfaGRyOwotCQkqaGRyMiA9ICpoZHI7Ci0JCWVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIyOwotI2VuZGlmCi0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1JFTDoKLSAgICBjYXNlIFNIVF9SRUxBOgotICAgICAgLyogKlRoZXNlKiBkbyBhIGxvdCBvZiB3b3JrIC0tIGJ1dCBidWlsZCBubyBzZWN0aW9ucyEgICovCi0gICAgICB7Ci0JYXNlY3Rpb24gKnRhcmdldF9zZWN0OwotCUVsZl9JbnRlcm5hbF9TaGRyICpoZHIyOwotCi0JLyogQ2hlY2sgZm9yIGEgYm9ndXMgbGluayB0byBhdm9pZCBjcmFzaGluZy4gICovCi0JaWYgKGhkci0+c2hfbGluayA+PSBlaGRyLT5lX3NobnVtKQotCSAgewotCSAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAoXygiJXM6IGludmFsaWQgbGluayAlbHUgZm9yIHJlbG9jIHNlY3Rpb24gJXMgKGluZGV4ICV1KSIpLAotCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBoZHItPnNoX2xpbmssIG5hbWUsIHNoaW5kZXgpKTsKLQkgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0JICB9Ci0KLQkvKiBGb3Igc29tZSBpbmNvbXByZWhlbnNpYmxlIHJlYXNvbiBPcmFjbGUgZGlzdHJpYnV0ZXMKLQkgICBsaWJyYXJpZXMgZm9yIFNvbGFyaXMgaW4gd2hpY2ggc29tZSBvZiB0aGUgb2JqZWN0cyBoYXZlCi0JICAgYm9ndXMgc2hfbGluayBmaWVsZHMuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGp1c3QKLQkgICByZWplY3QgdGhlbSwgYnV0LCB1bmZvcnR1bmF0ZWx5LCBzb21lIHBlb3BsZSBuZWVkIHRvIHVzZQotCSAgIHRoZW0uICBXZSBzY2FuIHRocm91Z2ggdGhlIHNlY3Rpb24gaGVhZGVyczsgaWYgd2UgZmluZCBvbmx5Ci0JICAgb25lIHN1aXRhYmxlIHN5bWJvbCB0YWJsZSwgd2UgY2xvYmJlciB0aGUgc2hfbGluayB0byBwb2ludAotCSAgIHRvIGl0LiAgSSBob3BlIHRoaXMgZG9lc24ndCBicmVhayBhbnl0aGluZy4gICovCi0JaWYgKGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCCi0JICAgICYmIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfRFlOU1lNKQotCSAgewotCSAgICBpbnQgc2NhbjsKLQkgICAgaW50IGZvdW5kOwotCi0JICAgIGZvdW5kID0gMDsKLQkgICAgZm9yIChzY2FuID0gMTsgc2NhbiA8IGVoZHItPmVfc2hudW07IHNjYW4rKykKLQkgICAgICB7Ci0JCWlmIChlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NjYW5dLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLQkJICAgIHx8IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2Nhbl0tPnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkKLQkJICB7Ci0JCSAgICBpZiAoZm91bmQgIT0gMCkKLQkJICAgICAgewotCQkJZm91bmQgPSAwOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGZvdW5kID0gc2NhbjsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoZm91bmQgIT0gMCkKLQkgICAgICBoZHItPnNoX2xpbmsgPSBmb3VuZDsKLQkgIH0KLQotCS8qIEdldCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQlpZiAoZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLQkgICAgJiYgISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfbGluaykpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBJZiB0aGlzIHJlbG9jIHNlY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBtYWluIHN5bWJvbCB0YWJsZSB3ZQotCSAgIGRvbid0IHRyZWF0IGl0IGFzIGEgcmVsb2Mgc2VjdGlvbi4gIEJGRCBjYW4ndCBhZGVxdWF0ZWx5Ci0JICAgcmVwcmVzZW50IHN1Y2ggYSBzZWN0aW9uLCBzbyBhdCBsZWFzdCBmb3Igbm93LCB3ZSBkb24ndAotCSAgIHRyeS4gIFdlIGp1c3QgcHJlc2VudCBpdCBhcyBhIG5vcm1hbCBzZWN0aW9uLiAgKi8KLQlpZiAoaGRyLT5zaF9saW5rICE9IGVsZl9vbmVzeW10YWIgKGFiZmQpKQotCSAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLQlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfaW5mbykpCi0JICByZXR1cm4gZmFsc2U7Ci0JdGFyZ2V0X3NlY3QgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaGRyLT5zaF9pbmZvKTsKLQlpZiAodGFyZ2V0X3NlY3QgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQotCWlmICgodGFyZ2V0X3NlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICAgIHx8IHRhcmdldF9zZWN0LT5yZWxvY19jb3VudCA9PSAwKQotCSAgaGRyMiA9ICZlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHI7Ci0JZWxzZQotCSAgewotCSAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID09IE5VTEwpOwotCSAgICBoZHIyID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaGRyMikpOwotCSAgICBlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID0gaGRyMjsKLQkgIH0KLQkqaGRyMiA9ICpoZHI7Ci0JZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkcjI7Ci0JdGFyZ2V0X3NlY3QtPnJlbG9jX2NvdW50ICs9IGhkci0+c2hfc2l6ZSAvIGhkci0+c2hfZW50c2l6ZTsKLQl0YXJnZXRfc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCXRhcmdldF9zZWN0LT5yZWxvY2F0aW9uID0gTlVMTDsKLQl0YXJnZXRfc2VjdC0+cmVsX2ZpbGVwb3MgPSBoZHItPnNoX29mZnNldDsKLQkvKiBJbiB0aGUgc2VjdGlvbiB0byB3aGljaCB0aGUgcmVsb2NhdGlvbnMgYXBwbHksIG1hcmsgd2hldGhlcgotCSAgIGl0cyByZWxvY2F0aW9ucyBhcmUgb2YgdGhlIFJFTCBvciBSRUxBIHZhcmlldHkuICAqLwotCWVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+dXNlX3JlbGFfcCAKLQkgID0gKGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSk7Ci0JYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotCXJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9HTlVfdmVyZGVmOgotICAgICAgZWxmX2R5bnZlcmRlZiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkciA9ICpoZHI7Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfR05VX3ZlcnN5bToKLSAgICAgIGVsZl9keW52ZXJzeW0gKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9oZHIgPSAqaGRyOwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX0dOVV92ZXJuZWVkOgotICAgICAgZWxmX2R5bnZlcnJlZiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX2hkciA9ICpoZHI7Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfU0hMSUI6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBDaGVjayBmb3IgYW55IHByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLSAgICAgIHsKLQlpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikKLQkgICgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdpdmVuIGFuIEVMRiBzZWN0aW9uIG51bWJlciwgcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgQkZECi0gICBzZWN0aW9uLiAgKi8KLQotYXNlY3Rpb24gKgotYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRleDsKLXsKLSAgQkZEX0FTU0VSVCAoaW5kZXggPiAwICYmIGluZGV4IDwgU0hOX0xPUkVTRVJWRSk7Ci0gIGlmIChpbmRleCA+PSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaW5kZXhdLT5iZmRfc2VjdGlvbjsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2RhdGE7Ci0KLSAgc2RhdGEgPSAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKnNkYXRhKSk7Ci0gIGlmICghc2RhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWMtPnVzZWRfYnlfYmZkID0gKFBUUikgc2RhdGE7Ci0KLSAgLyogSW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzZWN0aW9uIHNob3VsZCB1c2UgUkVMQSByZWxvY2F0aW9ucy4gICovCi0gIHNkYXRhLT51c2VfcmVsYV9wIAotICAgID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5kZWZhdWx0X3VzZV9yZWxhX3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBiZmQgc2VjdGlvbiBmcm9tIGFuIEVMRiBwcm9ncmFtIGhlYWRlci4KLQotICAgU2luY2UgcHJvZ3JhbSBzZWdtZW50cyBoYXZlIG5vIG5hbWVzLCB3ZSBnZW5lcmF0ZSBhIHN5bnRoZXRpYyBuYW1lCi0gICBvZiB0aGUgZm9ybSBzZWdtZW50PE5VTT4sIHdoZXJlIE5VTSBpcyBnZW5lcmFsbHkgdGhlIGluZGV4IGluIHRoZQotICAgcHJvZ3JhbSBoZWFkZXIgdGFibGUuICBGb3Igc2VnbWVudHMgdGhhdCBhcmUgc3BsaXQgKHNlZSBiZWxvdykgd2UKLSAgIGdlbmVyYXRlIHRoZSBuYW1lcyBzZWdtZW50PE5VTT5hIGFuZCBzZWdtZW50PE5VTT5iLgotCi0gICBOb3RlIHRoYXQgc29tZSBwcm9ncmFtIHNlZ21lbnRzIG1heSBoYXZlIGEgZmlsZSBzaXplIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4KLSAgIChsZXNzIHRoYW4pIHRoZSBtZW1vcnkgc2l6ZS4gIEFsbCB0aGlzIG1lYW5zIGlzIHRoYXQgYXQgZXhlY3V0aW9uIHRoZQotICAgc3lzdGVtIG11c3QgYWxsb2NhdGUgdGhlIGFtb3VudCBvZiBtZW1vcnkgc3BlY2lmaWVkIGJ5IHRoZSBtZW1vcnkgc2l6ZSwKLSAgIGJ1dCBvbmx5IGluaXRpYWxpemUgaXQgd2l0aCB0aGUgZmlyc3QgImZpbGUgc2l6ZSIgYnl0ZXMgcmVhZCBmcm9tIHRoZQotICAgZmlsZS4gIFRoaXMgd291bGQgb2NjdXIgZm9yIGV4YW1wbGUsIHdpdGggcHJvZ3JhbSBzZWdtZW50cyBjb25zaXN0aW5nCi0gICBvZiBjb21iaW5lZCBkYXRhK2Jzcy4KLQotICAgVG8gaGFuZGxlIHRoZSBhYm92ZSBzaXR1YXRpb24sIHRoaXMgcm91dGluZSBnZW5lcmF0ZXMgVFdPIGJmZCBzZWN0aW9ucwotICAgZm9yIHRoZSBzaW5nbGUgcHJvZ3JhbSBzZWdtZW50LiAgVGhlIGZpcnN0IGhhcyB0aGUgbGVuZ3RoIHNwZWNpZmllZCBieQotICAgdGhlIGZpbGUgc2l6ZSBvZiB0aGUgc2VnbWVudCwgYW5kIHRoZSBzZWNvbmQgaGFzIHRoZSBsZW5ndGggc3BlY2lmaWVkCi0gICBieSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gc2l6ZXMuICBJbiBlZmZlY3QsIHRoZSBzZWdtZW50IGlzIHNwbGl0Ci0gICBpbnRvIGl0J3MgaW5pdGlhbGl6ZWQgYW5kIHVuaW5pdGlhbGl6ZWQgcGFydHMuCi0KLSAqLwotCi1ib29sZWFuCi1iZmRfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKmhkcjsKLSAgICAgaW50IGluZGV4OwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lYnVmWzY0XTsKLSAgaW50IHNwbGl0OwotCi0gIHNwbGl0ID0gKChoZHItPnBfbWVtc3ogPiAwKQotCSAgICAmJiAoaGRyLT5wX2ZpbGVzeiA+IDApCi0JICAgICYmIChoZHItPnBfbWVtc3ogPiBoZHItPnBfZmlsZXN6KSk7Ci0gIHNwcmludGYgKG5hbWVidWYsIHNwbGl0ID8gInNlZ21lbnQlZGEiIDogInNlZ21lbnQlZCIsIGluZGV4KTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lYnVmKSArIDEpOwotICBpZiAoIW5hbWUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIG5hbWVidWYpOwotICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuZXdzZWN0LT52bWEgPSBoZHItPnBfdmFkZHI7Ci0gIG5ld3NlY3QtPmxtYSA9IGhkci0+cF9wYWRkcjsKLSAgbmV3c2VjdC0+X3Jhd19zaXplID0gaGRyLT5wX2ZpbGVzejsKLSAgbmV3c2VjdC0+ZmlsZXBvcyA9IGhkci0+cF9vZmZzZXQ7Ci0gIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGlmIChoZHItPnBfdHlwZSA9PSBQVF9MT0FEKQotICAgIHsKLSAgICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19MT0FEOwotICAgICAgaWYgKGhkci0+cF9mbGFncyAmIFBGX1gpCi0JewotCSAgLyogRklYTUU6IGFsbCB3ZSBrbm93biBpcyB0aGF0IGl0IGhhcyBleGVjdXRlIFBFUk1JU1NJT04sCi0JICAgICBtYXkgYmUgZGF0YS4gKi8KLQkgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCX0KLSAgICB9Ci0gIGlmICghKGhkci0+cF9mbGFncyAmIFBGX1cpKQotICAgIHsKLSAgICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgICB9Ci0KLSAgaWYgKHNwbGl0KQotICAgIHsKLSAgICAgIHNwcmludGYgKG5hbWVidWYsICJzZWdtZW50JWRiIiwgaW5kZXgpOwotICAgICAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lYnVmKSArIDEpOwotICAgICAgaWYgKCFuYW1lKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN0cmNweSAobmFtZSwgbmFtZWJ1Zik7Ci0gICAgICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gICAgICBpZiAobmV3c2VjdCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5ld3NlY3QtPnZtYSA9IGhkci0+cF92YWRkciArIGhkci0+cF9maWxlc3o7Ci0gICAgICBuZXdzZWN0LT5sbWEgPSBoZHItPnBfcGFkZHIgKyBoZHItPnBfZmlsZXN6OwotICAgICAgbmV3c2VjdC0+X3Jhd19zaXplID0gaGRyLT5wX21lbXN6IC0gaGRyLT5wX2ZpbGVzejsKLSAgICAgIGlmIChoZHItPnBfdHlwZSA9PSBQVF9MT0FEKQotCXsKLQkgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19BTExPQzsKLQkgIGlmIChoZHItPnBfZmxhZ3MgJiBQRl9YKQotCSAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQ09ERTsKLQl9Ci0gICAgICBpZiAoIShoZHItPnBfZmxhZ3MgJiBQRl9XKSkKLQluZXdzZWN0LT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbml0aWFsaXplIFJFTF9IRFIsIHRoZSBzZWN0aW9uLWhlYWRlciBmb3IgbmV3IHNlY3Rpb24sIGNvbnRhaW5pbmcKLSAgIHJlbG9jYXRpb25zIGFnYWluc3QgQVNFQ1QuICBJZiBVU0VfUkVMQV9QIGlzIHRydWUsIHdlIHVzZSBSRUxBCi0gICByZWxvY2F0aW9uczsgb3RoZXJ3aXNlLCB3ZSB1c2UgUkVMIHJlbG9jYXRpb25zLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyIChhYmZkLCByZWxfaGRyLCBhc2VjdCwgdXNlX3JlbGFfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBib29sZWFuIHVzZV9yZWxhX3A7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgIi5yZWxhIiArIHN0cmxlbiAoYXNlY3QtPm5hbWUpKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNwcmludGYgKG5hbWUsICIlcyVzIiwgdXNlX3JlbGFfcCA/ICIucmVsYSIgOiAiLnJlbCIsIGFzZWN0LT5uYW1lKTsKLSAgcmVsX2hkci0+c2hfbmFtZSA9Ci0gICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfc2hzdHJ0YWIgKGFiZmQpLCBuYW1lLAotCQkJCSAgICAgICB0cnVlLCBmYWxzZSk7Ci0gIGlmIChyZWxfaGRyLT5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmVsX2hkci0+c2hfdHlwZSA9IHVzZV9yZWxhX3AgPyBTSFRfUkVMQSA6IFNIVF9SRUw7Ci0gIHJlbF9oZHItPnNoX2VudHNpemUgPSAodXNlX3JlbGFfcAotCQkJID8gYmVkLT5zLT5zaXplb2ZfcmVsYQotCQkJIDogYmVkLT5zLT5zaXplb2ZfcmVsKTsKLSAgcmVsX2hkci0+c2hfYWRkcmFsaWduID0gYmVkLT5zLT5maWxlX2FsaWduOwotICByZWxfaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHJlbF9oZHItPnNoX2FkZHIgPSAwOwotICByZWxfaGRyLT5zaF9zaXplID0gMDsKLSAgcmVsX2hkci0+c2hfb2Zmc2V0ID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHVwIGFuIEVMRiBpbnRlcm5hbCBzZWN0aW9uIGhlYWRlciBmb3IgYSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGFzZWN0LCBmYWlsZWRwdHJhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBQVFIgZmFpbGVkcHRyYXJnOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBib29sZWFuICpmYWlsZWRwdHIgPSAoYm9vbGVhbiAqKSBmYWlsZWRwdHJhcmc7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICp0aGlzX2hkcjsKLQotICBpZiAoKmZhaWxlZHB0cikKLSAgICB7Ci0gICAgICAvKiBXZSBhbHJlYWR5IGZhaWxlZDsganVzdCBnZXQgb3V0IG9mIHRoZSBiZmRfbWFwX292ZXJfc2VjdGlvbnMKLSAgICAgICAgIGxvb3AuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0aGlzX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCktPnRoaXNfaGRyOwotCi0gIHRoaXNfaGRyLT5zaF9uYW1lID0gKHVuc2lnbmVkIGxvbmcpIF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX3Noc3RydGFiIChhYmZkKSwKLQkJCQkJCQkgIGFzZWN0LT5uYW1lLAotCQkJCQkJCSAgdHJ1ZSwgZmFsc2UpOwotICBpZiAodGhpc19oZHItPnNoX25hbWUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotICAgIHsKLSAgICAgICpmYWlsZWRwdHIgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0aGlzX2hkci0+c2hfZmxhZ3MgPSAwOwotCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0gICAgICB8fCBhc2VjdC0+dXNlcl9zZXRfdm1hKQotICAgIHRoaXNfaGRyLT5zaF9hZGRyID0gYXNlY3QtPnZtYTsKLSAgZWxzZQotICAgIHRoaXNfaGRyLT5zaF9hZGRyID0gMDsKLQotICB0aGlzX2hkci0+c2hfb2Zmc2V0ID0gMDsKLSAgdGhpc19oZHItPnNoX3NpemUgPSBhc2VjdC0+X3Jhd19zaXplOwotICB0aGlzX2hkci0+c2hfbGluayA9IDA7Ci0gIHRoaXNfaGRyLT5zaF9hZGRyYWxpZ24gPSAxIDw8IGFzZWN0LT5hbGlnbm1lbnRfcG93ZXI7Ci0gIC8qIFRoZSBzaF9lbnRzaXplIGFuZCBzaF9pbmZvIGZpZWxkcyBtYXkgaGF2ZSBiZWVuIHNldCBhbHJlYWR5IGJ5Ci0gICAgIGNvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEuICAqLwotCi0gIHRoaXNfaGRyLT5iZmRfc2VjdGlvbiA9IGFzZWN0OwotICB0aGlzX2hkci0+Y29udGVudHMgPSBOVUxMOwotCi0gIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYmFzZWQgb24gc2VjdGlvbiBuYW1lcy4gICovCi0gIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bnN0ciIpID09IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmhhc2giKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0hBU0g7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+YXJjaF9zaXplIC8gODsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZHluc3ltIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9EWU5TWU07Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZHluYW1pYyIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfRFlOQU1JQzsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfZHluOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIucmVsYSIsIDUpID09IDAKLQkgICAmJiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPm1heV91c2VfcmVsYV9wKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1JFTEE7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3JlbGE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5tYXlfdXNlX3JlbF9wKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1JFTDsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfcmVsOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIubm90ZSIsIDUpID09IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfTk9URTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIuc3RhYiIsIDUpID09IDAKLQkgICAmJiBzdHJjbXAgKGFzZWN0LT5uYW1lICsgc3RybGVuIChhc2VjdC0+bmFtZSkgLSAzLCAic3RyIikgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZ251LnZlcnNpb24iKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJzeW07Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmdudS52ZXJzaW9uX2QiKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJkZWY7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICAvKiBvYmpjb3B5IG9yIHN0cmlwIHdpbGwgY29weSBvdmVyIHNoX2luZm8sIGJ1dCBtYXkgbm90IHNldAotICAgICAgICAgY3ZlcmRlZnMuICBUaGUgbGlua2VyIHdpbGwgc2V0IGN2ZXJkZWZzLCBidXQgc2hfaW5mbyB3aWxsIGJlCi0gICAgICAgICB6ZXJvLiAgKi8KLSAgICAgIGlmICh0aGlzX2hkci0+c2hfaW5mbyA9PSAwKQotCXRoaXNfaGRyLT5zaF9pbmZvID0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnM7Ci0gICAgICBlbHNlCi0JQkZEX0FTU0VSVCAoZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMgPT0gMAotCQkgICAgfHwgdGhpc19oZHItPnNoX2luZm8gPT0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5nbnUudmVyc2lvbl9yIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9HTlVfdmVybmVlZDsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIC8qIG9iamNvcHkgb3Igc3RyaXAgd2lsbCBjb3B5IG92ZXIgc2hfaW5mbywgYnV0IG1heSBub3Qgc2V0Ci0gICAgICAgICBjdmVycmVmcy4gIFRoZSBsaW5rZXIgd2lsbCBzZXQgY3ZlcnJlZnMsIGJ1dCBzaF9pbmZvIHdpbGwgYmUKLSAgICAgICAgIHplcm8uICAqLwotICAgICAgaWYgKHRoaXNfaGRyLT5zaF9pbmZvID09IDApCi0JdGhpc19oZHItPnNoX2luZm8gPSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmczsKLSAgICAgIGVsc2UKLQlCRkRfQVNTRVJUIChlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmcyA9PSAwCi0JCSAgICB8fCB0aGlzX2hkci0+c2hfaW5mbyA9PSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmcyk7Ci0gICAgfQotICBlbHNlIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgKGFzZWN0LT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotICBlbHNlIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkpCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfTk9CSVRTOwotICBlbHNlCi0gICAgewotICAgICAgLyogV2hvIGtub3dzPyAgKi8KLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotICAgIH0KLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB0aGlzX2hkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfZmxhZ3MgfD0gU0hGX1dSSVRFOwotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfRVhFQ0lOU1RSOwotCi0gIC8qIENoZWNrIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpIChhYmZkLCB0aGlzX2hkciwgYXNlY3QpOwotCi0gIC8qIElmIHRoZSBzZWN0aW9uIGhhcyByZWxvY3MsIHNldCB1cCBhIHNlY3Rpb24gaGVhZGVyIGZvciB0aGUKLSAgICAgU0hUX1JFTFtBXSBzZWN0aW9uLiAgSWYgdHdvIHJlbG9jYXRpb24gc2VjdGlvbnMgYXJlIHJlcXVpcmVkIGZvcgotICAgICB0aGlzIHNlY3Rpb24sIGl0IGlzIHVwIHRvIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgYmFjay1lbmQgdG8KLSAgICAgY3JlYXRlIHRoZSBvdGhlci4gICovIAotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgIV9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciAoYWJmZCwgCi0JCQkJICAgICZlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCktPnJlbF9oZHIsCi0JCQkJICAgIGFzZWN0LCAKLQkJCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT51c2VfcmVsYV9wKSkKLSAgICAqZmFpbGVkcHRyID0gdHJ1ZTsKLX0KLQotLyogQXNzaWduIGFsbCBFTEYgc2VjdGlvbiBudW1iZXJzLiAgVGhlIGR1bW15IGZpcnN0IHNlY3Rpb24gaXMgaGFuZGxlZCBoZXJlCi0gICB0b28uICBUaGUgbGluay9pbmZvIHBvaW50ZXJzIGZvciB0aGUgc3RhbmRhcmQgc2VjdGlvbiB0eXBlcyBhcmUgZmlsbGVkCi0gICBpbiBoZXJlIHRvbywgd2hpbGUgd2UncmUgYXQgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXNzaWduX3NlY3Rpb25fbnVtYmVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqdCA9IGVsZl90ZGF0YSAoYWJmZCk7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX251bWJlcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIHNlY3Rpb25fbnVtYmVyID0gMTsKLQotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmQgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpOwotCi0gICAgICBkLT50aGlzX2lkeCA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0JZC0+cmVsX2lkeCA9IDA7Ci0gICAgICBlbHNlCi0JZC0+cmVsX2lkeCA9IHNlY3Rpb25fbnVtYmVyKys7Ci0KLSAgICAgIGlmIChkLT5yZWxfaGRyMikKLQlkLT5yZWxfaWR4MiA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gICAgICBlbHNlCi0JZC0+cmVsX2lkeDIgPSAwOwotICAgIH0KLQotICB0LT5zaHN0cnRhYl9zZWN0aW9uID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHggPSB0LT5zaHN0cnRhYl9zZWN0aW9uOwotICB0LT5zaHN0cnRhYl9oZHIuc2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9zaHN0cnRhYiAoYWJmZCkpOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgdC0+c3ltdGFiX3NlY3Rpb24gPSBzZWN0aW9uX251bWJlcisrOwotICAgICAgdC0+c3RydGFiX3NlY3Rpb24gPSBzZWN0aW9uX251bWJlcisrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bSA9IHNlY3Rpb25fbnVtYmVyOwotCi0gIC8qIFNldCB1cCB0aGUgbGlzdCBvZiBzZWN0aW9uIGhlYWRlciBwb2ludGVycywgaW4gYWdyZWVtZW50IHdpdGggdGhlCi0gICAgIGluZGljZXMuICAqLwotICBpX3NoZHJwID0gKChFbGZfSW50ZXJuYWxfU2hkciAqKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbl9udW1iZXIgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyICopKSk7Ci0gIGlmIChpX3NoZHJwID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlfc2hkcnBbMF0gPSAoKEVsZl9JbnRlcm5hbF9TaGRyICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkcikpKTsKLSAgaWYgKGlfc2hkcnBbMF0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaV9zaGRycCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBtZW1zZXQgKGlfc2hkcnBbMF0sIDAsIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKTsKLQotICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpID0gaV9zaGRycDsKLQotICBpX3NoZHJwW3QtPnNoc3RydGFiX3NlY3Rpb25dID0gJnQtPnNoc3RydGFiX2hkcjsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBpX3NoZHJwW3QtPnN5bXRhYl9zZWN0aW9uXSA9ICZ0LT5zeW10YWJfaGRyOwotICAgICAgaV9zaGRycFt0LT5zdHJ0YWJfc2VjdGlvbl0gPSAmdC0+c3RydGFiX2hkcjsKLSAgICAgIHQtPnN5bXRhYl9oZHIuc2hfbGluayA9IHQtPnN0cnRhYl9zZWN0aW9uOwotICAgIH0KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpkID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKTsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgaV9zaGRycFtkLT50aGlzX2lkeF0gPSAmZC0+dGhpc19oZHI7Ci0gICAgICBpZiAoZC0+cmVsX2lkeCAhPSAwKQotCWlfc2hkcnBbZC0+cmVsX2lkeF0gPSAmZC0+cmVsX2hkcjsKLSAgICAgIGlmIChkLT5yZWxfaWR4MiAhPSAwKQotCWlfc2hkcnBbZC0+cmVsX2lkeDJdID0gZC0+cmVsX2hkcjI7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIHNoX2xpbmsgYW5kIHNoX2luZm8gZmllbGRzIHdoaWxlIHdlJ3JlIGF0IGl0LiAgKi8KLQotICAgICAgLyogc2hfbGluayBvZiBhIHJlbG9jIHNlY3Rpb24gaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHN5bWJvbAotCSB0YWJsZS4gIHNoX2luZm8gaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHNlY3Rpb24gdG8gd2hpY2gKLQkgdGhlIHJlbG9jYXRpb24gZW50cmllcyBhcHBseS4gICovCi0gICAgICBpZiAoZC0+cmVsX2lkeCAhPSAwKQotCXsKLQkgIGQtPnJlbF9oZHIuc2hfbGluayA9IHQtPnN5bXRhYl9zZWN0aW9uOwotCSAgZC0+cmVsX2hkci5zaF9pbmZvID0gZC0+dGhpc19pZHg7Ci0JfQotICAgICAgaWYgKGQtPnJlbF9pZHgyICE9IDApCi0JewotCSAgZC0+cmVsX2hkcjItPnNoX2xpbmsgPSB0LT5zeW10YWJfc2VjdGlvbjsKLQkgIGQtPnJlbF9oZHIyLT5zaF9pbmZvID0gZC0+dGhpc19pZHg7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGQtPnRoaXNfaGRyLnNoX3R5cGUpCi0JewotCWNhc2UgU0hUX1JFTDoKLQljYXNlIFNIVF9SRUxBOgotCSAgLyogQSByZWxvYyBzZWN0aW9uIHdoaWNoIHdlIGFyZSB0cmVhdGluZyBhcyBhIG5vcm1hbCBCRkQKLQkgICAgIHNlY3Rpb24uICBzaF9saW5rIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzeW1ib2wKLQkgICAgIHRhYmxlLiAgc2hfaW5mbyBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc2VjdGlvbiB0bwotCSAgICAgd2hpY2ggdGhlIHJlbG9jYXRpb24gZW50cmllcyBhcHBseS4gIFdlIGFzc3VtZSB0aGF0IGFuCi0JICAgICBhbGxvY2F0ZWQgcmVsb2Mgc2VjdGlvbiB1c2VzIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQkgICAgIEZJWE1FOiBIb3cgY2FuIHdlIGJlIHN1cmU/ICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgZC0+dGhpc19oZHIuc2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQotCSAgLyogV2UgbG9vayB1cCB0aGUgc2VjdGlvbiB0aGUgcmVsb2NzIGFwcGx5IHRvIGJ5IG5hbWUuICAqLwotCSAgbmFtZSA9IHNlYy0+bmFtZTsKLQkgIGlmIChkLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUwpCi0JICAgIG5hbWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgbmFtZSArPSA1OwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGQtPnRoaXNfaGRyLnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX1NUUlRBQjoKLQkgIC8qIFdlIGFzc3VtZSB0aGF0IGEgc2VjdGlvbiBuYW1lZCAuc3RhYipzdHIgaXMgYSBzdGFicwotCSAgICAgc3RyaW5nIHNlY3Rpb24uICBXZSBsb29rIGZvciBhIHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lCi0JICAgICBidXQgd2l0aG91dCB0aGUgdHJhaWxpbmcgYGBzdHInJywgYW5kIHNldCBpdHMgc2hfbGluawotCSAgICAgZmllbGQgdG8gcG9pbnQgdG8gdGhpcyBzZWN0aW9uLiAgKi8KLQkgIGlmIChzdHJuY21wIChzZWMtPm5hbWUsICIuc3RhYiIsIHNpemVvZiAiLnN0YWIiIC0gMSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoc2VjLT5uYW1lICsgc3RybGVuIChzZWMtPm5hbWUpIC0gMywgInN0ciIpID09IDApCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuOwotCSAgICAgIGNoYXIgKmFsYzsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoc2VjLT5uYW1lKTsKLQkgICAgICBhbGMgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChsZW4gLSAyKTsKLQkgICAgICBpZiAoYWxjID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzdHJuY3B5IChhbGMsIHNlYy0+bmFtZSwgbGVuIC0gMyk7Ci0JICAgICAgYWxjW2xlbiAtIDNdID0gJ1wwJzsKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIGFsYyk7Ci0JICAgICAgZnJlZSAoYWxjKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPSBkLT50aGlzX2lkeDsKLQotCQkgIC8qIFRoaXMgaXMgYSAuc3RhYiBzZWN0aW9uLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JCSAgICA0ICsgMiAqIChiZWQtPnMtPmFyY2hfc2l6ZSAvIDgpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfRFlOQU1JQzoKLQljYXNlIFNIVF9EWU5TWU06Ci0JY2FzZSBTSFRfR05VX3Zlcm5lZWQ6Ci0JY2FzZSBTSFRfR05VX3ZlcmRlZjoKLQkgIC8qIHNoX2xpbmsgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIGluZGV4IG9mIHRoZSBzdHJpbmcgdGFibGUKLQkgICAgIHVzZWQgZm9yIHRoZSBkeW5hbWljIGVudHJpZXMsIG9yIHRoZSBzeW1ib2wgdGFibGUsIG9yIHRoZQotCSAgICAgdmVyc2lvbiBzdHJpbmdzLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zdHIiKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGQtPnRoaXNfaGRyLnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0hBU0g6Ci0JY2FzZSBTSFRfR05VX3ZlcnN5bToKLQkgIC8qIHNoX2xpbmsgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIGluZGV4IG9mIHRoZSBzeW1ib2wgdGFibGUKLQkgICAgIHRoaXMgaGFzaCB0YWJsZSBvciB2ZXJzaW9uIHRhYmxlIGlzIGZvci4gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBkLT50aGlzX2hkci5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFwIHN5bWJvbCBmcm9tIGl0J3MgaW50ZXJuYWwgbnVtYmVyIHRvIHRoZSBleHRlcm5hbCBudW1iZXIsIG1vdmluZwotICAgYWxsIGxvY2FsIHN5bWJvbHMgdG8gYmUgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgLyogSWYgdGhlIGJhY2tlbmQgaGFzIGEgc3BlY2lhbCBtYXBwaW5nLCB1c2UgaXQuICAqLwotICBpZiAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKQotICAgIHJldHVybiAoKCpnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpCi0JICAgIChhYmZkLCBzeW0pKTsKLQotICByZXR1cm4gKChzeW0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpICE9IDAKLQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tYXBfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgYXN5bWJvbCAqKnN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICBhc3ltYm9sICoqc2VjdF9zeW1zOwotICBpbnQgbnVtX2xvY2FscyA9IDA7Ci0gIGludCBudW1fZ2xvYmFscyA9IDA7Ci0gIGludCBudW1fbG9jYWxzMiA9IDA7Ci0gIGludCBudW1fZ2xvYmFsczIgPSAwOwotICBpbnQgbWF4X2luZGV4ID0gMDsKLSAgaW50IG51bV9zZWN0aW9ucyA9IDA7Ci0gIGludCBpZHg7Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgYXN5bWJvbCAqKm5ld19zeW1zOwotICBhc3ltYm9sICpzeW07Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJlbGZfbWFwX3N5bWJvbHNcbiIpOwotICBmZmx1c2ggKHN0ZGVycik7Ci0jZW5kaWYKLQotICAvKiBBZGQgYSBzZWN0aW9uIHN5bWJvbCBmb3IgZWFjaCBCRkQgc2VjdGlvbi4gIEZJWE1FOiBJcyB0aGlzIHJlYWxseQotICAgICBuZWNlc3Nhcnk/ICAqLwotICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChtYXhfaW5kZXggPCBhc2VjdC0+aW5kZXgpCi0JbWF4X2luZGV4ID0gYXNlY3QtPmluZGV4OwotICAgIH0KLQotICBtYXhfaW5kZXgrKzsKLSAgc2VjdF9zeW1zID0gKGFzeW1ib2wgKiopIGJmZF96YWxsb2MgKGFiZmQsIG1heF9pbmRleCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIGlmIChzZWN0X3N5bXMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsZl9zZWN0aW9uX3N5bXMgKGFiZmQpID0gc2VjdF9zeW1zOwotCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIHN5bSA9IHN5bXNbaWR4XTsKLSAgICAgIAotICAgICAgaWYgKChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0JICAmJiBzeW0tPnZhbHVlID09IDApCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgc2VjID0gc3ltLT5zZWN0aW9uOwotCi0JICBpZiAoc2VjLT5vd25lciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHNlYy0+b3duZXIgIT0gYWJmZCkKLQkJewotCQkgIGlmIChzZWMtPm91dHB1dF9vZmZzZXQgIT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCQkgIAotCQkgIHNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBFbXB0eSBzZWN0aW9ucyBpbiB0aGUgaW5wdXQgZmlsZXMgbWF5IGhhdmUgaGFkIGEgc2VjdGlvbgotCQkgICAgIHN5bWJvbCBjcmVhdGVkIGZvciB0aGVtLiAgKFNlZSB0aGUgY29tbWVudCBuZWFyIHRoZSBlbmQgb2YKLQkJICAgICBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyBpbiBsaW5rZXIuYykuICBJZiB0aGUgbGlua2VyCi0JCSAgICAgc2NyaXB0IGRpc2NhcmRzIHN1Y2ggc2VjdGlvbnMgdGhlbiB3ZSB3aWxsIHJlYWNoIHRoaXMgcG9pbnQuCi0JCSAgICAgU2luY2Ugd2Uga25vdyB0aGF0IHdlIGNhbm5vdCBhdm9pZCB0aGlzIGNhc2UsIHdlIGRldGVjdCBpdAotCQkgICAgIGFuZCBza2lwIHRoZSBhYm9ydCBhbmQgdGhlIGFzc2lnbm1lbnQgdG8gdGhlIHNlY3Rfc3ltcyBhcnJheS4KLQkJICAgICBUbyByZXByb2R1Y2UgdGhpcyBwYXJ0aWN1bGFyIGNhc2UgdHJ5IHJ1bm5pbmcgdGhlIGxpbmtlcgotCQkgICAgIHRlc3RzdWl0ZSB0ZXN0IGxkLXNjcmlwdHMvd2Vhay5leHAgZm9yIGFuIEVMRiBwb3J0IHRoYXQgdXNlcwotCQkgICAgIHRoZSBnZW5lcmljIGxpbmtlci4gICovCi0JCSAgaWYgKHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgQkZEX0FTU0VSVCAoc2VjLT5vd25lciA9PSBhYmZkKTsKLQkJfQotCSAgICAgIHNlY3Rfc3ltc1tzZWMtPmluZGV4XSA9IHN5bXNbaWR4XTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gIT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzeW0tPnRoZV9iZmQgPSBhYmZkOwotICAgICAgc3ltLT5uYW1lID0gYXNlY3QtPm5hbWU7Ci0gICAgICBzeW0tPnZhbHVlID0gMDsKLSAgICAgIC8qIFNldCB0aGUgZmxhZ3MgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgb25lIHdhcyBuZXdseSBhZGRlZC4gICovCi0gICAgICBzeW0tPmZsYWdzID0gMDsKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGFzZWN0OwotICAgICAgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gPSBzeW07Ci0gICAgICBudW1fc2VjdGlvbnMrKzsKLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotIF8oImNyZWF0aW5nIHNlY3Rpb24gc3ltYm9sLCBuYW1lID0gJXMsIHZhbHVlID0gMHglLjhseCwgaW5kZXggPSAlZCwgc2VjdGlvbiA9IDB4JS44bHhcbiIpLAotCSAgICAgICBhc2VjdC0+bmFtZSwgKGxvbmcpIGFzZWN0LT52bWEsIGFzZWN0LT5pbmRleCwgKGxvbmcpIGFzZWN0KTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBDbGFzc2lmeSBhbGwgb2YgdGhlIHN5bWJvbHMuICAqLwotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bXNbaWR4XSkpCi0JbnVtX2xvY2FscysrOwotICAgICAgZWxzZQotCW51bV9nbG9iYWxzKys7Ci0gICAgfQotICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSAhPSBOVUxMCi0JICAmJiBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPT0gMCkKLQl7Ci0JICBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdKSkKLQkgICAgbnVtX2xvY2FscysrOwotCSAgZWxzZQotCSAgICBudW1fZ2xvYmFscysrOwotCSAgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBzb3J0IHRoZSBzeW1ib2xzIHNvIHRoZSBsb2NhbCBzeW1ib2xzIGFyZSBmaXJzdC4gICovCi0gIG5ld19zeW1zID0gKChhc3ltYm9sICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAobnVtX2xvY2FscyArIG51bV9nbG9iYWxzKSAqIHNpemVvZiAoYXN5bWJvbCAqKSkpOwotICBpZiAobmV3X3N5bXMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gc3ltc1tpZHhdOwotICAgICAgaW50IGk7Ci0KLSAgICAgIGlmICghc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltKSkKLQlpID0gbnVtX2xvY2FsczIrKzsKLSAgICAgIGVsc2UKLQlpID0gbnVtX2xvY2FscyArIG51bV9nbG9iYWxzMisrOwotICAgICAgbmV3X3N5bXNbaV0gPSBzeW07Ci0gICAgICBzeW0tPnVkYXRhLmkgPSBpICsgMTsKLSAgICB9Ci0gIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdICE9IE5VTEwKLQkgICYmIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9PSAwKQotCXsKLQkgIGFzeW1ib2wgKnN5bSA9IHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdOwotCSAgaW50IGk7Ci0KLQkgIHN5bS0+ZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkpCi0JICAgIGkgPSBudW1fbG9jYWxzMisrOwotCSAgZWxzZQotCSAgICBpID0gbnVtX2xvY2FscyArIG51bV9nbG9iYWxzMisrOwotCSAgbmV3X3N5bXNbaV0gPSBzeW07Ci0JICBzeW0tPnVkYXRhLmkgPSBpICsgMTsKLQl9Ci0gICAgfQotCi0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBuZXdfc3ltcywgbnVtX2xvY2FscyArIG51bV9nbG9iYWxzKTsKLQotICBlbGZfbnVtX2xvY2FscyAoYWJmZCkgPSBudW1fbG9jYWxzOwotICBlbGZfbnVtX2dsb2JhbHMgKGFiZmQpID0gbnVtX2dsb2JhbHM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbGlnbiB0byB0aGUgbWF4aW11bSBmaWxlIGFsaWdubWVudCB0aGF0IGNvdWxkIGJlIHJlcXVpcmVkIGZvciBhbnkKLSAgIEVMRiBkYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgZmlsZV9wdHIgYWxpZ25fZmlsZV9wb3NpdGlvbiBQQVJBTVMgKChmaWxlX3B0ciwgaW50KSk7Ci1zdGF0aWMgSU5MSU5FIGZpbGVfcHRyCi1hbGlnbl9maWxlX3Bvc2l0aW9uIChvZmYsIGFsaWduKQotICAgICBmaWxlX3B0ciBvZmY7Ci0gICAgIGludCBhbGlnbjsKLXsKLSAgcmV0dXJuIChvZmYgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOwotfQotCi0vKiBBc3NpZ24gYSBmaWxlIHBvc2l0aW9uIHRvIGEgc2VjdGlvbiwgb3B0aW9uYWxseSBhbGlnbmluZyB0byB0aGUKLSAgIHJlcXVpcmVkIHNlY3Rpb24gYWxpZ25tZW50LiAgKi8KLQotSU5MSU5FIGZpbGVfcHRyCi1fYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaV9zaGRycCwgb2Zmc2V0LCBhbGlnbikKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmlfc2hkcnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYm9vbGVhbiBhbGlnbjsKLXsKLSAgaWYgKGFsaWduKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBhbDsKLQotICAgICAgYWwgPSBpX3NoZHJwLT5zaF9hZGRyYWxpZ247Ci0gICAgICBpZiAoYWwgPiAxKQotCW9mZnNldCA9IEJGRF9BTElHTiAob2Zmc2V0LCBhbCk7Ci0gICAgfQotICBpX3NoZHJwLT5zaF9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGlmIChpX3NoZHJwLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIGlfc2hkcnAtPmJmZF9zZWN0aW9uLT5maWxlcG9zID0gb2Zmc2V0OwotICBpZiAoaV9zaGRycC0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotICAgIG9mZnNldCArPSBpX3NoZHJwLT5zaF9zaXplOwotICByZXR1cm4gb2Zmc2V0OwotfQotCi0vKiBDb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyB3ZSBhcmUgZ29pbmcgdG8gcHV0IHRoZSBzZWN0aW9ucyBhdCwgYW5kCi0gICBvdGhlcndpc2UgcHJlcGFyZSB0byBiZWdpbiB3cml0aW5nIG91dCB0aGUgRUxGIGZpbGUuICBJZiBMSU5LX0lORk8KLSAgIGlzIG5vdCBOVUxMLCB0aGlzIGlzIGJlaW5nIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnNoc3RydGFiX2hkcjsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBEbyBhbnkgZWxmIGJhY2tlbmQgc3BlY2lmaWMgcHJvY2Vzc2luZyBmaXJzdC4gICovCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpIChhYmZkLCBsaW5rX2luZm8pOwotCi0gIGlmICghIHByZXBfaGVhZGVycyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFBvc3QgcHJvY2VzcyB0aGUgaGVhZGVycyBpZiBuZWNlc3NhcnkuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycykKLSAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpIChhYmZkLCBsaW5rX2luZm8pOwotCi0gIGZhaWxlZCA9IGZhbHNlOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGVsZl9mYWtlX3NlY3Rpb25zLCAmZmFpbGVkKTsKLSAgaWYgKGZhaWxlZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFhc3NpZ25fc2VjdGlvbl9udW1iZXJzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGJhY2tlbmQgbGlua2VyIGJ1aWxkcyBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24gaXRzZWxmLiAgKi8KLSAgaWYgKGxpbmtfaW5mbyA9PSBOVUxMICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICAvKiBOb24temVybyBpZiBkb2luZyBhIHJlbG9jYXRhYmxlIGxpbmsuICAqLwotICAgICAgaW50IHJlbG9jYXRhYmxlX3AgPSAhIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSk7Ci0KLSAgICAgIGlmICghIHN3YXBfb3V0X3N5bXMgKGFiZmQsICZzdHJ0YWIsIHJlbG9jYXRhYmxlX3ApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc2hzdHJ0YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkcjsKLSAgLyogc2hfbmFtZSB3YXMgc2V0IGluIHByZXBfaGVhZGVycy4gICovCi0gIHNoc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIHNoc3RydGFiX2hkci0+c2hfZmxhZ3MgPSAwOwotICBzaHN0cnRhYl9oZHItPnNoX2FkZHIgPSAwOwotICBzaHN0cnRhYl9oZHItPnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfc2hzdHJ0YWIgKGFiZmQpKTsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9saW5rID0gMDsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9pbmZvID0gMDsKLSAgLyogc2hfb2Zmc2V0IGlzIHNldCBpbiBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcy4gICovCi0gIHNoc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKLQotICBpZiAoIWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGxpbmtfaW5mbyA9PSBOVUxMICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBmaWxlX3B0ciBvZmY7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0gICAgICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOwotCi0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChoZHIsIG9mZiwgdHJ1ZSk7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyOwotICAgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICAgICAgLyogTm93IHRoYXQgd2Uga25vdyB3aGVyZSB0aGUgLnN0cnRhYiBzZWN0aW9uIGdvZXMsIHdyaXRlIGl0Ci0gICAgICAgICBvdXQuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgc3RydGFiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzdHJ0YWIpOwotICAgIH0KLQotICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIGEgc2V0IG9mIHNlY3Rpb25zIHRvIGEgcHJvZ3JhbSBzZWdtZW50LiAgKi8KLQotc3RhdGljIElOTElORSBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICoKLW1ha2VfbWFwcGluZyAoYWJmZCwgc2VjdGlvbnMsIGZyb20sIHRvLCBwaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci0gICAgIHVuc2lnbmVkIGludCBmcm9tOwotICAgICB1bnNpZ25lZCBpbnQgdG87Ci0gICAgIGJvb2xlYW4gcGhkcjsKLXsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGFzZWN0aW9uICoqaGRycHA7Ci0KLSAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotICAgICAgIGJmZF96YWxsb2MgKGFiZmQsCi0JCSAgIChzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApCi0JCSAgICArICh0byAtIGZyb20gLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG0tPm5leHQgPSBOVUxMOwotICBtLT5wX3R5cGUgPSBQVF9MT0FEOwotICBmb3IgKGkgPSBmcm9tLCBoZHJwcCA9IHNlY3Rpb25zICsgZnJvbTsgaSA8IHRvOyBpKyssIGhkcnBwKyspCi0gICAgbS0+c2VjdGlvbnNbaSAtIGZyb21dID0gKmhkcnBwOwotICBtLT5jb3VudCA9IHRvIC0gZnJvbTsKLQotICBpZiAoZnJvbSA9PSAwICYmIHBoZHIpCi0gICAgewotICAgICAgLyogSW5jbHVkZSB0aGUgaGVhZGVycyBpbiB0aGUgZmlyc3QgUFRfTE9BRCBzZWdtZW50LiAgKi8KLSAgICAgIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSAxOwotICAgICAgbS0+aW5jbHVkZXNfcGhkcnMgPSAxOwotICAgIH0KLQotICByZXR1cm4gbTsKLX0KLQotLyogU2V0IHVwIGEgbWFwcGluZyBmcm9tIEJGRCBzZWN0aW9ucyB0byBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1hcF9zZWN0aW9uc190b19zZWdtZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm1maXJzdDsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKnBtOwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptOwotICBhc2VjdGlvbiAqbGFzdF9oZHI7Ci0gIHVuc2lnbmVkIGludCBwaGRyX2luZGV4OwotICBiZmRfdm1hIG1heHBhZ2VzaXplOwotICBhc2VjdGlvbiAqKmhkcnBwOwotICBib29sZWFuIHBoZHJfaW5fc2VnbWVudCA9IHRydWU7Ci0gIGJvb2xlYW4gd3JpdGFibGU7Ci0gIGFzZWN0aW9uICpkeW5zZWM7Ci0KLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWxlY3QgdGhlIGFsbG9jYXRlZCBzZWN0aW9ucywgYW5kIHNvcnQgdGhlbS4gICovCi0KLSAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkKLQkJCQkgICAgICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKHNlY3Rpb25zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaSA9IDA7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JewotCSAgc2VjdGlvbnNbaV0gPSBzOwotCSAgKytpOwotCX0KLSAgICB9Ci0gIEJGRF9BU1NFUlQgKGkgPD0gYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKSk7Ci0gIGNvdW50ID0gaTsKLQotICBxc29ydCAoc2VjdGlvbnMsIChzaXplX3QpIGNvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLCBlbGZfc29ydF9zZWN0aW9ucyk7Ci0KLSAgLyogQnVpbGQgdGhlIG1hcHBpbmcuICAqLwotCi0gIG1maXJzdCA9IE5VTEw7Ci0gIHBtID0gJm1maXJzdDsKLQotICAvKiBJZiB3ZSBoYXZlIGEgLmludGVycCBzZWN0aW9uLCB0aGVuIGNyZWF0ZSBhIFBUX1BIRFIgc2VnbWVudCBmb3IKLSAgICAgdGhlIHByb2dyYW0gaGVhZGVycyBhbmQgYSBQVF9JTlRFUlAgc2VnbWVudCBmb3IgdGhlIC5pbnRlcnAKLSAgICAgc2VjdGlvbi4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB7Ci0gICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG0tPm5leHQgPSBOVUxMOwotICAgICAgbS0+cF90eXBlID0gUFRfUEhEUjsKLSAgICAgIC8qIEZJWE1FOiBVbml4V2FyZSBhbmQgU29sYXJpcyBzZXQgUEZfWCwgSXJpeCA1IGRvZXMgbm90LiAgKi8KLSAgICAgIG0tPnBfZmxhZ3MgPSBQRl9SIHwgUEZfWDsKLSAgICAgIG0tPnBfZmxhZ3NfdmFsaWQgPSAxOwotICAgICAgbS0+aW5jbHVkZXNfcGhkcnMgPSAxOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLQotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtLT5uZXh0ID0gTlVMTDsKLSAgICAgIG0tPnBfdHlwZSA9IFBUX0lOVEVSUDsKLSAgICAgIG0tPmNvdW50ID0gMTsKLSAgICAgIG0tPnNlY3Rpb25zWzBdID0gczsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2VjdGlvbnMuICBXZSBwdXQgc2VjdGlvbnMgaW4gdGhlIHNhbWUgcHJvZ3JhbQotICAgICBzZWdtZW50IHdoZW4gdGhlIHN0YXJ0IG9mIHRoZSBzZWNvbmQgc2VjdGlvbiBjYW4gYmUgcGxhY2VkIHdpdGhpbgotICAgICBhIGZldyBieXRlcyBvZiB0aGUgZW5kIG9mIHRoZSBmaXJzdCBzZWN0aW9uLiAgKi8KLSAgbGFzdF9oZHIgPSBOVUxMOwotICBwaGRyX2luZGV4ID0gMDsKLSAgbWF4cGFnZXNpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPm1heHBhZ2VzaXplOwotICB3cml0YWJsZSA9IGZhbHNlOwotICBkeW5zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChkeW5zZWMgIT0gTlVMTAotICAgICAgJiYgKGR5bnNlYy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICBkeW5zZWMgPSBOVUxMOwotCi0gIC8qIERlYWwgd2l0aCAtVHRleHQgb3Igc29tZXRoaW5nIHNpbWlsYXIgc3VjaCB0aGF0IHRoZSBmaXJzdCBzZWN0aW9uCi0gICAgIGlzIG5vdCBhZGphY2VudCB0byB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgVGhpcyBpcyBhbgotICAgICBhcHByb3hpbWF0aW9uLCBzaW5jZSBhdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cgZXhhY3RseSBob3cgbWFueQotICAgICBwcm9ncmFtIGhlYWRlcnMgd2Ugd2lsbCBuZWVkLiAgKi8KLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHBoZHJfc2l6ZTsKLQotICAgICAgcGhkcl9zaXplID0gZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZTsKLSAgICAgIGlmIChwaGRyX3NpemUgPT0gMCkKLQlwaGRyX3NpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9waGRyOwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpID09IDAKLQkgIHx8IHNlY3Rpb25zWzBdLT5sbWEgPCBwaGRyX3NpemUKLQkgIHx8IHNlY3Rpb25zWzBdLT5sbWEgJSBtYXhwYWdlc2l6ZSA8IHBoZHJfc2l6ZSAlIG1heHBhZ2VzaXplKQotCXBoZHJfaW5fc2VnbWVudCA9IGZhbHNlOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBoZHJwcCA9IHNlY3Rpb25zOyBpIDwgY291bnQ7IGkrKywgaGRycHArKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqaGRyOwotICAgICAgYm9vbGVhbiBuZXdfc2VnbWVudDsKLQotICAgICAgaGRyID0gKmhkcnBwOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBzZWN0aW9uIGFuZCB0aGUgbGFzdCBvbmUgd2lsbCBmaXQgaW4gdGhlIHNhbWUKLSAgICAgICAgIHNlZ21lbnQuICAqLwotCi0gICAgICBpZiAobGFzdF9oZHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgc2VnbWVudCB5ZXQsIHRoZW4gd2UgZG9uJ3QgbmVlZCBhIG5ldwotCSAgICAgb25lICh3ZSBidWlsZCB0aGUgbGFzdCBvbmUgYWZ0ZXIgdGhpcyBsb29wKS4gICovCi0JICBuZXdfc2VnbWVudCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKGxhc3RfaGRyLT5sbWEgLSBsYXN0X2hkci0+dm1hICE9IGhkci0+bG1hIC0gaGRyLT52bWEpCi0JewotCSAgLyogSWYgdGhpcyBzZWN0aW9uIGhhcyBhIGRpZmZlcmVudCByZWxhdGlvbiBiZXR3ZWVuIHRoZQotICAgICAgICAgICAgIHZpcnR1YWwgYWRkcmVzcyBhbmQgdGhlIGxvYWQgYWRkcmVzcywgdGhlbiB3ZSBuZWVkIGEgbmV3Ci0gICAgICAgICAgICAgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IHRydWU7Ci0JfQotICAgICAgZWxzZSBpZiAoQkZEX0FMSUdOIChsYXN0X2hkci0+bG1hICsgbGFzdF9oZHItPl9yYXdfc2l6ZSwgbWF4cGFnZXNpemUpCi0JICAgICAgIDwgQkZEX0FMSUdOIChoZHItPmxtYSwgbWF4cGFnZXNpemUpKQotCXsKLQkgIC8qIElmIHB1dHRpbmcgdGhpcyBzZWN0aW9uIGluIHRoaXMgc2VnbWVudCB3b3VsZCBmb3JjZSB1cyB0bwotICAgICAgICAgICAgIHNraXAgYSBwYWdlIGluIHRoZSBzZWdtZW50LCB0aGVuIHdlIG5lZWQgYSBuZXcgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IHRydWU7Ci0JfQotICAgICAgZWxzZSBpZiAoKGxhc3RfaGRyLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwCi0JICAgICAgICYmIChoZHItPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JewotCSAgLyogV2UgZG9uJ3Qgd2FudCB0byBwdXQgYSBsb2FkYWJsZSBzZWN0aW9uIGFmdGVyIGEKLSAgICAgICAgICAgICBub25sb2FkYWJsZSBzZWN0aW9uIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpID09IDApCi0JewotCSAgLyogSWYgdGhlIGZpbGUgaXMgbm90IGRlbWFuZCBwYWdlZCwgd2hpY2ggbWVhbnMgdGhhdCB3ZQotICAgICAgICAgICAgIGRvbid0IHJlcXVpcmUgdGhlIHNlY3Rpb25zIHRvIGJlIGNvcnJlY3RseSBhbGlnbmVkIGluIHRoZQotICAgICAgICAgICAgIGZpbGUsIHRoZW4gdGhlcmUgaXMgbm8gb3RoZXIgcmVhc29uIGZvciBhIG5ldyBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoISB3cml0YWJsZQotCSAgICAgICAmJiAoaGRyLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICAgICAmJiAoQkZEX0FMSUdOIChsYXN0X2hkci0+bG1hICsgbGFzdF9oZHItPl9yYXdfc2l6ZSwgbWF4cGFnZXNpemUpCi0JCSAgID09IGhkci0+bG1hKSkKLQl7Ci0JICAvKiBXZSBkb24ndCB3YW50IHRvIHB1dCBhIHdyaXRhYmxlIHNlY3Rpb24gaW4gYSByZWFkIG9ubHkKLSAgICAgICAgICAgICBzZWdtZW50LCB1bmxlc3MgdGhleSBhcmUgb24gdGhlIHNhbWUgcGFnZSBpbiBtZW1vcnkKLSAgICAgICAgICAgICBhbnlob3cuICBXZSBhbHJlYWR5IGtub3cgdGhhdCB0aGUgbGFzdCBzZWN0aW9uIGRvZXMgbm90Ci0gICAgICAgICAgICAgYnJpbmcgdXMgcGFzdCB0aGUgY3VycmVudCBzZWN0aW9uIG9uIHRoZSBwYWdlLCBzbyB0aGUKLSAgICAgICAgICAgICBvbmx5IGNhc2UgaW4gd2hpY2ggdGhlIG5ldyBzZWN0aW9uIGlzIG5vdCBvbiB0aGUgc2FtZQotICAgICAgICAgICAgIHBhZ2UgYXMgdGhlIHByZXZpb3VzIHNlY3Rpb24gaXMgd2hlbiB0aGUgcHJldmlvdXMgc2VjdGlvbgotICAgICAgICAgICAgIGVuZHMgcHJlY2lzZWx5IG9uIGEgcGFnZSBib3VuZGFyeS4gICovCi0JICBuZXdfc2VnbWVudCA9IHRydWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE90aGVyd2lzZSwgd2UgY2FuIHVzZSB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBuZXdfc2VnbWVudCkKLQl7Ci0JICBpZiAoKGhkci0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0JICAgIHdyaXRhYmxlID0gdHJ1ZTsKLQkgIGxhc3RfaGRyID0gaGRyOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBuZWVkIGEgbmV3IHByb2dyYW0gc2VnbWVudC4gIFdlIG11c3QgY3JlYXRlIGEgbmV3IHByb2dyYW0KLSAgICAgICAgIGhlYWRlciBob2xkaW5nIGFsbCB0aGUgc2VjdGlvbnMgZnJvbSBwaGRyX2luZGV4IHVudGlsIGhkci4gICovCi0KLSAgICAgIG0gPSBtYWtlX21hcHBpbmcgKGFiZmQsIHNlY3Rpb25zLCBwaGRyX2luZGV4LCBpLCBwaGRyX2luX3NlZ21lbnQpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0KLSAgICAgIGlmICgoaGRyLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQl3cml0YWJsZSA9IHRydWU7Ci0gICAgICBlbHNlCi0Jd3JpdGFibGUgPSBmYWxzZTsKLQotICAgICAgbGFzdF9oZHIgPSBoZHI7Ci0gICAgICBwaGRyX2luZGV4ID0gaTsKLSAgICAgIHBoZHJfaW5fc2VnbWVudCA9IGZhbHNlOwotICAgIH0KLQotICAvKiBDcmVhdGUgYSBmaW5hbCBQVF9MT0FEIHByb2dyYW0gc2VnbWVudC4gICovCi0gIGlmIChsYXN0X2hkciAhPSBOVUxMKQotICAgIHsKLSAgICAgIG0gPSBtYWtlX21hcHBpbmcgKGFiZmQsIHNlY3Rpb25zLCBwaGRyX2luZGV4LCBpLCBwaGRyX2luX3NlZ21lbnQpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgLmR5bmFtaWMgc2VjdGlvbiwgdGhyb3cgaW4gYSBQVF9EWU5BTUlDIHNlZ21lbnQuICAqLwotICBpZiAoZHluc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtLT5uZXh0ID0gTlVMTDsKLSAgICAgIG0tPnBfdHlwZSA9IFBUX0RZTkFNSUM7Ci0gICAgICBtLT5jb3VudCA9IDE7Ci0gICAgICBtLT5zZWN0aW9uc1swXSA9IGR5bnNlYzsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0gICAgfQotCi0gIC8qIEZvciBlYWNoIGxvYWRhYmxlIC5ub3RlIHNlY3Rpb24sIGFkZCBhIFBUX05PVEUgc2VnbWVudC4gIFdlIGRvbid0Ci0gICAgIHVzZSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSwgYmVjYXVzZSBpZiB3ZSBsaW5rIHRvZ2V0aGVyCi0gICAgIG5vbmxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zIGFuZCBsb2FkYWJsZSAubm90ZSBzZWN0aW9ucywgd2Ugd2lsbAotICAgICBnZW5lcmF0ZSB0d28gLm5vdGUgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlLiAgRklYTUU6IFVzaW5nCi0gICAgIG5hbWVzIGZvciBzZWN0aW9uIHR5cGVzIGlzIGJvZ3VzIGFueWhvdy4gICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCSAgJiYgc3RybmNtcCAocy0+bmFtZSwgIi5ub3RlIiwgNSkgPT0gMCkKLQl7Ci0JICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbS0+bmV4dCA9IE5VTEw7Ci0JICBtLT5wX3R5cGUgPSBQVF9OT1RFOwotCSAgbS0+Y291bnQgPSAxOwotCSAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCi0JICAqcG0gPSBtOwotCSAgcG0gPSAmbS0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHNlY3Rpb25zKTsKLSAgc2VjdGlvbnMgPSBOVUxMOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwID0gbWZpcnN0OwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBpbnQKLWVsZl9zb3J0X3NlY3Rpb25zIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci17Ci0gIGNvbnN0IGFzZWN0aW9uICpzZWMxID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMTsKLSAgY29uc3QgYXNlY3Rpb24gKnNlYzIgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcyOwotCi0gIC8qIFNvcnQgYnkgTE1BIGZpcnN0LCBzaW5jZSB0aGlzIGlzIHRoZSBhZGRyZXNzIHVzZWQgdG8KLSAgICAgcGxhY2UgdGhlIHNlY3Rpb24gaW50byBhIHNlZ21lbnQuICAqLwotICBpZiAoc2VjMS0+bG1hIDwgc2VjMi0+bG1hKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoc2VjMS0+bG1hID4gc2VjMi0+bG1hKQotICAgIHJldHVybiAxOwotCi0gIC8qIFRoZW4gc29ydCBieSBWTUEuICBOb3JtYWxseSB0aGUgTE1BIGFuZCB0aGUgVk1BIHdpbGwgYmUKLSAgICAgdGhlIHNhbWUsIGFuZCB0aGlzIHdpbGwgZG8gbm90aGluZy4gICovCi0gIGlmIChzZWMxLT52bWEgPCBzZWMyLT52bWEpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChzZWMxLT52bWEgPiBzZWMyLT52bWEpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogUHV0ICFTRUNfTE9BRCBzZWN0aW9ucyBhZnRlciBTRUNfTE9BRCBvbmVzLiAgKi8KLQotI2RlZmluZSBUT0VORCh4KSAoKCh4KS0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLQotICBpZiAoVE9FTkQgKHNlYzEpKQotICAgIHsKLSAgICAgIGlmIChUT0VORCAoc2VjMikpCi0JcmV0dXJuIHNlYzEtPnRhcmdldF9pbmRleCAtIHNlYzItPnRhcmdldF9pbmRleDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKFRPRU5EIChzZWMyKSkKLSAgICByZXR1cm4gLTE7Ci0KLSN1bmRlZiBUT0VORAotCi0gIC8qIFNvcnQgYnkgc2l6ZSwgdG8gcHV0IHplcm8gc2l6ZWQgc2VjdGlvbnMgYmVmb3JlIG90aGVycyBhdCB0aGUKLSAgICAgc2FtZSBhZGRyZXNzLiAgKi8KLQotICBpZiAoc2VjMS0+X3Jhd19zaXplIDwgc2VjMi0+X3Jhd19zaXplKQotICAgIHJldHVybiAtMTsKLSAgaWYgKHNlYzEtPl9yYXdfc2l6ZSA+IHNlYzItPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gc2VjMS0+dGFyZ2V0X2luZGV4IC0gc2VjMi0+dGFyZ2V0X2luZGV4OwotfQotCi0vKiBBc3NpZ24gZmlsZSBwb3NpdGlvbnMgdG8gdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBtYXBwaW5nIGZyb20KLSAgIHNlY3Rpb25zIHRvIHNlZ21lbnRzLiAgVGhpcyBmdW5jdGlvbiBhbHNvIHNldHMgdXAgc29tZSBmaWVsZHMgaW4KLSAgIHRoZSBmaWxlIGhlYWRlciwgYW5kIHdyaXRlcyBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotICBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcnM7Ci0gIGZpbGVfcHRyIG9mZiwgdm9mZjsKLSAgYmZkX3ZtYSBmaWxlaGRyX3ZhZGRyLCBmaWxlaGRyX3BhZGRyOwotICBiZmRfdm1hIHBoZHJzX3ZhZGRyLCBwaGRyc19wYWRkcjsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnA7Ci0KLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKSAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBjb3VudCA9IDA7Ci0gIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotICAgICsrY291bnQ7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhvZmYgPSBiZWQtPnMtPnNpemVvZl9laGRyOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waGVudHNpemUgPSBiZWQtPnMtPnNpemVvZl9waGRyOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bSA9IGNvdW50OwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHdlIGFscmVhZHkgY291bnRlZCB0aGUgbnVtYmVyIG9mIHByb2dyYW0gc2VnbWVudHMsIG1ha2Ugc3VyZQotICAgICB0aGF0IHdlIGFsbG9jYXRlZCBlbm91Z2ggc3BhY2UuICBUaGlzIGhhcHBlbnMgd2hlbiBTSVpFT0ZfSEVBREVSUwotICAgICBpcyB1c2VkIGluIGEgbGlua2VyIHNjcmlwdC4gICovCi0gIGFsbG9jID0gZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSAvIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gIGlmIChhbGxvYyAhPSAwICYmIGNvdW50ID4gYWxsb2MpCi0gICAgewotICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgIChfKCIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMgKGFsbG9jYXRlZCAldSwgbmVlZCAldSkiKSwKLQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYWxsb2MsIGNvdW50KSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGFsbG9jID09IDApCi0gICAgYWxsb2MgPSBjb3VudDsKLQotICBwaGRycyA9ICgoRWxmX0ludGVybmFsX1BoZHIgKikKLQkgICBiZmRfYWxsb2MgKGFiZmQsIGFsbG9jICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUGhkcikpKTsKLSAgaWYgKHBoZHJzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG9mZiA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0gIG9mZiArPSBhbGxvYyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0KLSAgZmlsZWhkcl92YWRkciA9IDA7Ci0gIGZpbGVoZHJfcGFkZHIgPSAwOwotICBwaGRyc192YWRkciA9IDA7Ci0gIHBoZHJzX3BhZGRyID0gMDsKLQotICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCwgcCA9IHBoZHJzOwotICAgICAgIG0gIT0gTlVMTDsKLSAgICAgICBtID0gbS0+bmV4dCwgcCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotICAgICAgLyogSWYgZWxmX3NlZ21lbnRfbWFwIGlzIG5vdCBmcm9tIG1hcF9zZWN0aW9uc190b19zZWdtZW50cywgdGhlCi0gICAgICAgICBzZWN0aW9ucyBtYXkgbm90IGJlIGNvcnJlY3RseSBvcmRlcmVkLiAgKi8KLSAgICAgIGlmIChtLT5jb3VudCA+IDApCi0JcXNvcnQgKG0tPnNlY3Rpb25zLCAoc2l6ZV90KSBtLT5jb3VudCwgc2l6ZW9mIChhc2VjdGlvbiAqKSwKLQkgICAgICAgZWxmX3NvcnRfc2VjdGlvbnMpOwotCi0gICAgICBwLT5wX3R5cGUgPSBtLT5wX3R5cGU7Ci0KLSAgICAgIGlmIChtLT5wX2ZsYWdzX3ZhbGlkKQotCXAtPnBfZmxhZ3MgPSBtLT5wX2ZsYWdzOwotICAgICAgZWxzZQotCXAtPnBfZmxhZ3MgPSAwOwotCi0gICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQKLQkgICYmIG0tPmNvdW50ID4gMAotCSAgJiYgKG0tPnNlY3Rpb25zWzBdLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQkgICAgb2ZmICs9IChtLT5zZWN0aW9uc1swXS0+dm1hIC0gb2ZmKSAlIGJlZC0+bWF4cGFnZXNpemU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGFsaWduOwotCi0JICAgICAgYWxpZ24gPSAwOwotCSAgICAgIGZvciAoaSA9IDAsIHNlY3BwID0gbS0+c2VjdGlvbnM7IGkgPCBtLT5jb3VudDsgaSsrLCBzZWNwcCsrKQotCQl7Ci0JCSAgYmZkX3NpemVfdHlwZSBzZWNhbGlnbjsKLQotCQkgIHNlY2FsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgKnNlY3BwKTsKLQkJICBpZiAoc2VjYWxpZ24gPiBhbGlnbikKLQkJICAgIGFsaWduID0gc2VjYWxpZ247Ci0JCX0KLQotCSAgICAgIG9mZiArPSAobS0+c2VjdGlvbnNbMF0tPnZtYSAtIG9mZikgJSAoMSA8PCBhbGlnbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChtLT5jb3VudCA9PSAwKQotCXAtPnBfdmFkZHIgPSAwOwotICAgICAgZWxzZQotCXAtPnBfdmFkZHIgPSBtLT5zZWN0aW9uc1swXS0+dm1hOwotCi0gICAgICBpZiAobS0+cF9wYWRkcl92YWxpZCkKLQlwLT5wX3BhZGRyID0gbS0+cF9wYWRkcjsKLSAgICAgIGVsc2UgaWYgKG0tPmNvdW50ID09IDApCi0JcC0+cF9wYWRkciA9IDA7Ci0gICAgICBlbHNlCi0JcC0+cF9wYWRkciA9IG0tPnNlY3Rpb25zWzBdLT5sbWE7Ci0KLSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQlwLT5wX2FsaWduID0gYmVkLT5tYXhwYWdlc2l6ZTsKLSAgICAgIGVsc2UgaWYgKG0tPmNvdW50ID09IDApCi0JcC0+cF9hbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLSAgICAgIGVsc2UKLQlwLT5wX2FsaWduID0gMDsKLQotICAgICAgcC0+cF9vZmZzZXQgPSAwOwotICAgICAgcC0+cF9maWxlc3ogPSAwOwotICAgICAgcC0+cF9tZW1zeiA9IDA7Ci0KLSAgICAgIGlmIChtLT5pbmNsdWRlc19maWxlaGRyKQotCXsKLQkgIGlmICghIG0tPnBfZmxhZ3NfdmFsaWQpCi0JICAgIHAtPnBfZmxhZ3MgfD0gUEZfUjsKLQkgIHAtPnBfb2Zmc2V0ID0gMDsKLQkgIHAtPnBfZmlsZXN6ID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkgIHAtPnBfbWVtc3ogPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCSAgaWYgKG0tPmNvdW50ID4gMCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKTsKLQotCSAgICAgIGlmIChwLT5wX3ZhZGRyIDwgKGJmZF92bWEpIG9mZikKLQkJewotCQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IE5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzLCB0cnkgbGlua2luZyB3aXRoIC1OIiksCi0JCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgcC0+cF92YWRkciAtPSBvZmY7Ci0JICAgICAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJcC0+cF9wYWRkciAtPSBvZmY7Ci0JICAgIH0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgewotCSAgICAgIGZpbGVoZHJfdmFkZHIgPSBwLT5wX3ZhZGRyOwotCSAgICAgIGZpbGVoZHJfcGFkZHIgPSBwLT5wX3BhZGRyOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobS0+aW5jbHVkZXNfcGhkcnMpCi0JewotCSAgaWYgKCEgbS0+cF9mbGFnc192YWxpZCkKLQkgICAgcC0+cF9mbGFncyB8PSBQRl9SOwotCi0JICBpZiAobS0+aW5jbHVkZXNfZmlsZWhkcikKLQkgICAgewotCSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkJewotCQkgIHBoZHJzX3ZhZGRyID0gcC0+cF92YWRkciArIGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0JCSAgcGhkcnNfcGFkZHIgPSBwLT5wX3BhZGRyICsgYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwLT5wX29mZnNldCA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0KLQkgICAgICBpZiAobS0+Y291bnQgPiAwKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAocC0+cF90eXBlID09IFBUX0xPQUQpOwotCQkgIHAtPnBfdmFkZHIgLT0gb2ZmIC0gcC0+cF9vZmZzZXQ7Ci0JCSAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJICAgIHAtPnBfcGFkZHIgLT0gb2ZmIC0gcC0+cF9vZmZzZXQ7Ci0JCX0KLQotCSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkJewotCQkgIHBoZHJzX3ZhZGRyID0gcC0+cF92YWRkcjsKLQkJICBwaGRyc19wYWRkciA9IHAtPnBfcGFkZHI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXBoZHJzX3ZhZGRyID0gYmVkLT5tYXhwYWdlc2l6ZSArIGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0JICAgIH0KLQotCSAgcC0+cF9maWxlc3ogKz0gYWxsb2MgKiBiZWQtPnMtPnNpemVvZl9waGRyOwotCSAgcC0+cF9tZW1zeiArPSBhbGxvYyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0JfQotCi0gICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQKLQkgIHx8IChwLT5wX3R5cGUgPT0gUFRfTk9URSAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpKQotCXsKLQkgIGlmICghIG0tPmluY2x1ZGVzX2ZpbGVoZHIgJiYgISBtLT5pbmNsdWRlc19waGRycykKLQkgICAgcC0+cF9vZmZzZXQgPSBvZmY7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlX3B0ciBhZGp1c3Q7Ci0KLQkgICAgICBhZGp1c3QgPSBvZmYgLSAocC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeik7Ci0JICAgICAgcC0+cF9maWxlc3ogKz0gYWRqdXN0OwotCSAgICAgIHAtPnBfbWVtc3ogKz0gYWRqdXN0OwotCSAgICB9Ci0JfQotCi0gICAgICB2b2ZmID0gb2ZmOwotCi0gICAgICBmb3IgKGkgPSAwLCBzZWNwcCA9IG0tPnNlY3Rpb25zOyBpIDwgbS0+Y291bnQ7IGkrKywgc2VjcHArKykKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICBiZmRfc2l6ZV90eXBlIGFsaWduOwotCi0JICBzZWMgPSAqc2VjcHA7Ci0JICBmbGFncyA9IHNlYy0+ZmxhZ3M7Ci0JICBhbGlnbiA9IDEgPDwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjKTsKLQotCSAgLyogVGhlIHNlY3Rpb24gbWF5IGhhdmUgYXJ0aWZpY2lhbCBhbGlnbm1lbnQgZm9yY2VkIGJ5IGEKLQkgICAgIGxpbmsgc2NyaXB0LiAgTm90aWNlIHRoaXMgY2FzZSBieSB0aGUgZ2FwIGJldHdlZW4gdGhlCi0JICAgICBjdW11bGF0aXZlIHBoZHIgdm1hIGFuZCB0aGUgc2VjdGlvbidzIHZtYS4gICovCi0JICBpZiAocC0+cF92YWRkciArIHAtPnBfbWVtc3ogPCBzZWMtPnZtYSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgYWRqdXN0ID0gc2VjLT52bWEgLSAocC0+cF92YWRkciArIHAtPnBfbWVtc3opOwotCi0JICAgICAgcC0+cF9tZW1zeiArPSBhZGp1c3Q7Ci0JICAgICAgb2ZmICs9IGFkanVzdDsKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXAtPnBfZmlsZXN6ICs9IGFkanVzdDsKLQkgICAgfQotCi0JICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQpCi0JICAgIHsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSBhZGp1c3Q7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBhZGp1c3QgPSBzZWMtPmxtYSAtIChwLT5wX3BhZGRyICsgcC0+cF9tZW1zeik7Ci0JCSAgaWYgKGFkanVzdCA8IDApCi0JCSAgICBhZGp1c3QgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQl7Ci0JCSAgLyogVGhlIHNlY3Rpb24gVk1BIG11c3QgZXF1YWwgdGhlIGZpbGUgcG9zaXRpb24KLQkJICAgICBtb2R1bG8gdGhlIHBhZ2Ugc2l6ZS4gIEZJWE1FOiBJJ20gbm90IHN1cmUgaWYKLQkJICAgICB0aGlzIGFkanVzdG1lbnQgaXMgcmVhbGx5IG5lY2Vzc2FyeS4gIFdlIHVzZWQgdG8KLQkJICAgICBub3QgaGF2ZSB0aGUgU0VDX0xPQUQgY2FzZSBqdXN0IGFib3ZlLCBhbmQgdGhlbgotCQkgICAgIHRoaXMgd2FzIG5lY2Vzc2FyeSwgYnV0IG5vdyBJJ20gbm90IHN1cmUuICAqLwotCQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCQkgICAgYWRqdXN0ID0gKHNlYy0+dm1hIC0gdm9mZikgJSBiZWQtPm1heHBhZ2VzaXplOwotCQkgIGVsc2UKLQkJICAgIGFkanVzdCA9IChzZWMtPnZtYSAtIHZvZmYpICUgYWxpZ247Ci0JCX0KLQkgICAgICBlbHNlCi0JCWFkanVzdCA9IDA7Ci0KLQkgICAgICBpZiAoYWRqdXN0ICE9IDApCi0JCXsKLQkJICBpZiAoaSA9PSAwKQotCQkgICAgewotCQkgICAgICAoKiBfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiRXJyb3I6IEZpcnN0IHNlY3Rpb24gaW4gc2VnbWVudCAoJXMpIHN0YXJ0cyBhdCAweCV4IiksCi0JCQkgYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgc2VjLT5sbWEpOwotCQkgICAgICAoKiBfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiICAgICAgIHdoZXJlYXMgc2VnbWVudCBzdGFydHMgYXQgMHgleCIpLAotCQkJIHAtPnBfcGFkZHIpOwotCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBwLT5wX21lbXN6ICs9IGFkanVzdDsKLQkJICBvZmYgKz0gYWRqdXN0OwotCQkgIHZvZmYgKz0gYWRqdXN0OwotCQkgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJICAgIHAtPnBfZmlsZXN6ICs9IGFkanVzdDsKLQkJfQotCi0JICAgICAgc2VjLT5maWxlcG9zID0gb2ZmOwotCi0JICAgICAgLyogV2UgY2hlY2sgU0VDX0hBU19DT05URU5UUyBoZXJlIGJlY2F1c2UgaWYgTk9MT0FEIGlzCi0gICAgICAgICAgICAgICAgIHVzZWQgaW4gYSBsaW5rZXIgc2NyaXB0IHdlIG1heSBoYXZlIGEgc2VjdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgIFNFQ19MT0FEIGNsZWFyIGJ1dCB3aGljaCBpcyBzdXBwb3NlZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkJICB8fCAoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCQlvZmYgKz0gc2VjLT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQl2b2ZmICs9IHNlYy0+X3Jhd19zaXplOwotCSAgICB9Ci0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTk9URSAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpCi0JICAgIHsKLQkgICAgICBpZiAoaSA9PSAwKQkvKiB0aGUgYWN0dWFsICJub3RlIiBzZWdtZW50ICovCi0JCXsJCS8qIHRoaXMgb25lIGFjdHVhbGx5IGNvbnRhaW5zIGV2ZXJ5dGhpbmcuICovCi0JCSAgc2VjLT5maWxlcG9zID0gb2ZmOwotCQkgIHAtPnBfZmlsZXN6ID0gc2VjLT5fcmF3X3NpemU7Ci0JCSAgb2ZmICs9IHNlYy0+X3Jhd19zaXplOwotCQkgIHZvZmYgPSBvZmY7Ci0JCX0KLQkgICAgICBlbHNlCS8qIGZha2Ugc2VjdGlvbnMgLS0gZG9uJ3QgbmVlZCB0byBiZSB3cml0dGVuICovCi0JCXsKLQkJICBzZWMtPmZpbGVwb3MgPSAwOwotCQkgIHNlYy0+X3Jhd19zaXplID0gMDsKLQkJICBmbGFncyA9IHNlYy0+ZmxhZ3MgPSAwOwkvKiBubyBjb250ZW50cyAqLwotCQl9Ci0JICAgICAgcC0+cF9tZW1zeiA9IDA7Ci0JICAgICAgcC0+cF9hbGlnbiA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHAtPnBfbWVtc3ogKz0gc2VjLT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXAtPnBfZmlsZXN6ICs9IHNlYy0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGFsaWduID4gcC0+cF9hbGlnbgotCQkgICYmIChwLT5wX3R5cGUgIT0gUFRfTE9BRCB8fCAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwKSkKLQkJcC0+cF9hbGlnbiA9IGFsaWduOwotCSAgICB9Ci0KLQkgIGlmICghIG0tPnBfZmxhZ3NfdmFsaWQpCi0JICAgIHsKLQkgICAgICBwLT5wX2ZsYWdzIHw9IFBGX1I7Ci0JICAgICAgaWYgKChmbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCQlwLT5wX2ZsYWdzIHw9IFBGX1g7Ci0JICAgICAgaWYgKChmbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQkJcC0+cF9mbGFncyB8PSBQRl9XOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHNldCB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucywgd2UgY2FuIHNldCB1cAotICAgICB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBub24gUFRfTE9BRCBzZWdtZW50cy4gICovCi0gIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwLCBwID0gcGhkcnM7Ci0gICAgICAgbSAhPSBOVUxMOwotICAgICAgIG0gPSBtLT5uZXh0LCBwKyspCi0gICAgewotICAgICAgaWYgKHAtPnBfdHlwZSAhPSBQVF9MT0FEICYmIG0tPmNvdW50ID4gMCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIG0tPmluY2x1ZGVzX2ZpbGVoZHIgJiYgISBtLT5pbmNsdWRlc19waGRycyk7Ci0JICBwLT5wX29mZnNldCA9IG0tPnNlY3Rpb25zWzBdLT5maWxlcG9zOwotCX0KLSAgICAgIGlmIChtLT5jb3VudCA9PSAwKQotCXsKLQkgIGlmIChtLT5pbmNsdWRlc19maWxlaGRyKQotCSAgICB7Ci0JICAgICAgcC0+cF92YWRkciA9IGZpbGVoZHJfdmFkZHI7Ci0JICAgICAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJcC0+cF9wYWRkciA9IGZpbGVoZHJfcGFkZHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG0tPmluY2x1ZGVzX3BoZHJzKQotCSAgICB7Ci0JICAgICAgcC0+cF92YWRkciA9IHBoZHJzX3ZhZGRyOwotCSAgICAgIGlmICghIG0tPnBfcGFkZHJfdmFsaWQpCi0JCXAtPnBfcGFkZHIgPSBwaGRyc19wYWRkcjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQ2xlYXIgb3V0IGFueSBwcm9ncmFtIGhlYWRlcnMgd2UgYWxsb2NhdGVkIGJ1dCBkaWQgbm90IHVzZS4gICovCi0gIGZvciAoOyBjb3VudCA8IGFsbG9jOyBjb3VudCsrLCBwKyspCi0gICAgewotICAgICAgbWVtc2V0IChwLCAwLCBzaXplb2YgKnApOwotICAgICAgcC0+cF90eXBlID0gUFRfTlVMTDsKLSAgICB9Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IHBoZHJzOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGJlZC0+cy0+c2l6ZW9mX2VoZHIsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZWQtPnMtPndyaXRlX291dF9waGRycyAoYWJmZCwgcGhkcnMsIGFsbG9jKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBwcm9ncmFtIGhlYWRlci4KLQotICAgSWYgdGhpcyBpcyBjYWxsZWQgYnkgdGhlIGxpbmtlciBiZWZvcmUgYW55IG9mIHRoZSBzZWN0aW9uIFZNQSdzIGFyZSBzZXQsIGl0Ci0gICBjYW4ndCBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGEgc3RyYW5nZSBtZW1vcnkgbGF5b3V0LiAgVGhpcyBvbmx5Ci0gICBoYXBwZW5zIHdoZW4gU0laRU9GX0hFQURFUlMgaXMgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQuICBJbiB0aGlzIGNhc2UsCi0gICBTT1JURURfSERSUyBpcyBOVUxMIGFuZCB3ZSBhc3N1bWUgdGhlIG5vcm1hbCBzY2VuYXJpbyBvZiBvbmUgdGV4dCBhbmQgb25lCi0gICBkYXRhIHNlZ21lbnQgKGV4Y2x1c2l2ZSBvZiAuaW50ZXJwIGFuZCAuZHluYW1pYykuCi0KLSAgID8/PyBVc2VyIHdyaXR0ZW4gc2NyaXB0cyBtdXN0IGVpdGhlciBub3QgdXNlIFNJWkVPRl9IRUFERVJTLCBvciBhc3N1bWUgdGhlcmUKLSAgIHdpbGwgYmUgdHdvIHNlZ21lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUKLWdldF9wcm9ncmFtX2hlYWRlcl9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNpemVfdCBzZWdzOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICAvKiBXZSBjYW4ndCByZXR1cm4gYSBkaWZmZXJlbnQgcmVzdWx0IGVhY2ggdGltZSB3ZSdyZSBjYWxsZWQuICAqLwotICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSAhPSAwKQotICAgIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOwotCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0KLSAgICAgIHNlZ3MgPSAwOwotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JKytzZWdzOwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSA9IHNlZ3MgKiBiZWQtPnMtPnNpemVvZl9waGRyOwotICAgICAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci0gICAgfQotCi0gIC8qIEFzc3VtZSB3ZSB3aWxsIG5lZWQgZXhhY3RseSB0d28gUFRfTE9BRCBzZWdtZW50czogb25lIGZvciB0ZXh0Ci0gICAgIGFuZCBvbmUgZm9yIGRhdGEuICAqLwotICBzZWdzID0gMjsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBhIGxvYWRhYmxlIGludGVycHJldGVyIHNlY3Rpb24sIHdlIG5lZWQgYQotCSBQVF9JTlRFUlAgc2VnbWVudC4gIEluIHRoaXMgY2FzZSwgYXNzdW1lIHdlIGFsc28gbmVlZCBhCi0JIFBUX1BIRFIgc2VnbWVudCwgYWx0aG91Z2ggdGhhdCBtYXkgbm90IGJlIHRydWUgZm9yIGFsbAotCSB0YXJnZXRzLiAgKi8KLSAgICAgIHNlZ3MgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgYSBQVF9EWU5BTUlDIHNlZ21lbnQuICAqLwotICAgICAgKytzZWdzOwotICAgIH0KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkgICYmIHN0cm5jbXAgKHMtPm5hbWUsICIubm90ZSIsIDUpID09IDApCi0JewotCSAgLyogV2UgbmVlZCBhIFBUX05PVEUgc2VnbWVudC4gICovCi0JICArK3NlZ3M7Ci0JfQotICAgIH0KLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgY291bnQgdXAgYW55IHByb2dyYW0gaGVhZGVycyBpdCBtaWdodCBuZWVkLiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpCi0gICAgewotICAgICAgaW50IGE7Ci0KLSAgICAgIGEgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpIChhYmZkKTsKLSAgICAgIGlmIChhID09IC0xKQotCWFib3J0ICgpOwotICAgICAgc2VncyArPSBhOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplID0gc2VncyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOwotfQotCi0vKiBXb3JrIG91dCB0aGUgZmlsZSBwb3NpdGlvbnMgb2YgYWxsIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgY2FsbGVkIGJ5Ci0gICBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICBBbGwgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kCi0gICBWTUFzIG11c3QgYmUga25vd24gYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgotCi0gICBXZSBkbyBub3QgY29uc2lkZXIgcmVsb2Mgc2VjdGlvbnMgYXQgdGhpcyBwb2ludCwgdW5sZXNzIHRoZXkgZm9ybQotICAgcGFydCBvZiB0aGUgbG9hZGFibGUgaW1hZ2UuICBSZWxvYyBzZWN0aW9ucyBhcmUgYXNzaWduZWQgZmlsZQotICAgcG9zaXRpb25zIGluIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzLCB3aGljaCBpcyBjYWxsZWQgYnkKLSAgIHdyaXRlX29iamVjdF9jb250ZW50cyBhbmQgZmluYWxfbGluay4KLQotICAgV2UgYWxzbyBkb24ndCBzZXQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgLnN5bXRhYiBhbmQgLnN0cnRhYiBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICogY29uc3QgdGRhdGEgPSBlbGZfdGRhdGEgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfRWhkciAqIGNvbnN0IGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiogY29uc3QgaV9zaGRycHAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBmaWxlX3B0ciBvZmY7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMAotICAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9jb3JlKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogU3RhcnQgYWZ0ZXIgdGhlIEVMRiBoZWFkZXIuICAqLwotICAgICAgb2ZmID0gaV9laGRycC0+ZV9laHNpemU7Ci0KLSAgICAgIC8qIFdlIGFyZSBub3QgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBhcmUKLQkgbm90IGNyZWF0aW5nIGEgcHJvZ3JhbSBoZWFkZXIsIGFuZCB0aGF0IHRoZSBhY3R1YWwgb3JkZXIgb2YKLQkgdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIGlzIHVuaW1wb3J0YW50LiAgKi8KLSAgICAgIGZvciAoaSA9IDEsIGhkcnBwID0gaV9zaGRycHAgKyAxOyBpIDwgaV9laGRycC0+ZV9zaG51bTsgaSsrLCBoZHJwcCsrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkgIGhkciA9ICpoZHJwcDsKLQkgIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0JICAgIHsKLQkgICAgICBoZHItPnNoX29mZnNldCA9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAoaSA9PSB0ZGF0YS0+c3ltdGFiX3NlY3Rpb24KLQkgICAgICB8fCBpID09IHRkYXRhLT5zdHJ0YWJfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGhkci0+c2hfb2Zmc2V0ID0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqKmhkcnBwOwotCi0gICAgICAvKiBBc3NpZ24gZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBsb2FkZWQgc2VjdGlvbnMgYmFzZWQgb24gdGhlCi0gICAgICAgICBhc3NpZ25tZW50IG9mIHNlY3Rpb25zIHRvIHNlZ21lbnRzLiAgKi8KLSAgICAgIGlmICghIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgb3RoZXIgc2VjdGlvbnMuICAqLwotCi0gICAgICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOwotICAgICAgZm9yIChpID0gMSwgaGRycHAgPSBpX3NoZHJwcCArIDE7IGkgPCBpX2VoZHJwLT5lX3NobnVtOyBpKyssIGhkcnBwKyspCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotCSAgaGRyID0gKmhkcnBwOwotCSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICAgICYmIGhkci0+YmZkX3NlY3Rpb24tPmZpbGVwb3MgIT0gMCkKLQkgICAgaGRyLT5zaF9vZmZzZXQgPSBoZHItPmJmZF9zZWN0aW9uLT5maWxlcG9zOwotCSAgZWxzZSBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogd2FybmluZzogYWxsb2NhdGVkIHNlY3Rpb24gYCVzJyBub3QgaW4gc2VnbWVudCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJKGhkci0+YmZkX3NlY3Rpb24gPT0gTlVMTAotCQkgPyAiKnVua25vd24qIgotCQkgOiBoZHItPmJmZF9zZWN0aW9uLT5uYW1lKSkpOwotCSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCQlvZmYgKz0gKGhkci0+c2hfYWRkciAtIG9mZikgJSBiZWQtPm1heHBhZ2VzaXplOwotCSAgICAgIGVsc2UKLQkJb2ZmICs9IChoZHItPnNoX2FkZHIgLSBvZmYpICUgaGRyLT5zaF9hZGRyYWxpZ247Ci0JICAgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLAotCQkJCQkJCSAgICAgICBmYWxzZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMCi0JCSAgIHx8IGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMQQotCQkgICB8fCBoZHIgPT0gaV9zaGRycHBbdGRhdGEtPnN5bXRhYl9zZWN0aW9uXQotCQkgICB8fCBoZHIgPT0gaV9zaGRycHBbdGRhdGEtPnN0cnRhYl9zZWN0aW9uXSkKLQkgICAgaGRyLT5zaF9vZmZzZXQgPSAtMTsKLQkgIGVsc2UKLQkgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQl9Ci0gICAgfQotCi0gIC8qIFBsYWNlIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotICBvZmYgPSBhbGlnbl9maWxlX3Bvc2l0aW9uIChvZmYsIGJlZC0+cy0+ZmlsZV9hbGlnbik7Ci0gIGlfZWhkcnAtPmVfc2hvZmYgPSBvZmY7Ci0gIG9mZiArPSBpX2VoZHJwLT5lX3NobnVtICogaV9laGRycC0+ZV9zaGVudHNpemU7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXByZXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9QaGRyICppX3BoZHJwID0gMDsgLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICBpbnQgY291bnQ7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnNoc3RydGFiOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0KLSAgc2hzdHJ0YWIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKHNoc3RydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9zaHN0cnRhYiAoYWJmZCkgPSBzaHN0cnRhYjsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzBdID0gRUxGTUFHMDsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9NQUcxXSA9IEVMRk1BRzE7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMl0gPSBFTEZNQUcyOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzNdID0gRUxGTUFHMzsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX0NMQVNTXSA9IGJlZC0+cy0+ZWxmY2xhc3M7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfREFUQV0gPQotICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IEVMRkRBVEEyTVNCIDogRUxGREFUQTJMU0I7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfVkVSU0lPTl0gPSBiZWQtPnMtPmV2X2N1cnJlbnQ7Ci0KLSAgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZPU0FCSV9TWVNWOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX0FCSVZFUlNJT05dID0gMDsKLQotICBmb3IgKGNvdW50ID0gRUlfUEFEOyBjb3VudCA8IEVJX05JREVOVDsgY291bnQrKykKLSAgICBpX2VoZHJwLT5lX2lkZW50W2NvdW50XSA9IDA7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfRFlOOwotICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfRVhFQzsKLSAgZWxzZSBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9jb3JlKQotICAgIGlfZWhkcnAtPmVfdHlwZSA9IEVUX0NPUkU7Ci0gIGVsc2UKLSAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9SRUw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3Vua25vd246Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9OT05FOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGlmIChiZWQtPnMtPmFyY2hfc2l6ZSA9PSA2NCkKLQlpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TUEFSQ1Y5OwotICAgICAgZWxzZQotCWlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1NQQVJDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fMzg2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fNjhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tODhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pODYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fOTYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgkvKiBNSVBTIFJ4eHh4ICovCi0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NSVBTOwkvKiBvbmx5IE1JUFMgUjMwMDAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaHBwYToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BBUklTQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BQQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9BTFBIQTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19EMTBWOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9kMzB2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX0QzMFY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2ZyMzA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfRlIzMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NQ09SRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfdjg1MDoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIDA6ICAgICAgICAgICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX1Y4NTA7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgY2FzZSBiZmRfYXJjaF9hcmM6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfQVJDOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0FSTTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbTMycjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19NMzJSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX01OMTAyMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAzMDA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfTU4xMDMwMDsKLSAgICAgIGJyZWFrOwotICAgICAgLyogYWxzbyBub3RlIHRoYXQgRU1fTTMyLCBBVCZUIFdFMzIxMDAgaXMgdW5rbm93biB0byBiZmQgKi8KLSAgICBkZWZhdWx0OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fTk9ORTsKLSAgICB9Ci0gIGlfZWhkcnAtPmVfdmVyc2lvbiA9IGJlZC0+cy0+ZXZfY3VycmVudDsKLSAgaV9laGRycC0+ZV9laHNpemUgPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCi0gIC8qIG5vIHByb2dyYW0gaGVhZGVyLCBmb3Igbm93LiAqLwotICBpX2VoZHJwLT5lX3Bob2ZmID0gMDsKLSAgaV9laGRycC0+ZV9waGVudHNpemUgPSAwOwotICBpX2VoZHJwLT5lX3BobnVtID0gMDsKLQotICAvKiBlYWNoIGJmZCBzZWN0aW9uIGlzIHNlY3Rpb24gaGVhZGVyIGVudHJ5ICovCi0gIGlfZWhkcnAtPmVfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBpX2VoZHJwLT5lX3NoZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3NoZHI7Ci0KLSAgLyogaWYgd2UncmUgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgd2UnbGwgbmVlZCBhIHByb2dyYW0gaGVhZGVyIHRhYmxlICovCi0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICAvKiBpdCBhbGwgaGFwcGVucyBsYXRlciAqLwotI2lmIDAKLSAgICAgIGlfZWhkcnAtPmVfcGhlbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcik7Ci0KLSAgICAgIC8qIGVsZl9idWlsZF9waGRycygpIHJldHVybnMgYSAoTlVMTC10ZXJtaW5hdGVkKSBhcnJheSBvZgotCSBFbGZfSW50ZXJuYWxfUGhkcnMgKi8KLSAgICAgIGlfcGhkcnAgPSBlbGZfYnVpbGRfcGhkcnMgKGFiZmQsIGlfZWhkcnAsIGlfc2hkcnAsICZpX2VoZHJwLT5lX3BobnVtKTsKLSAgICAgIGlfZWhkcnAtPmVfcGhvZmYgPSBvdXRiYXNlOwotICAgICAgb3V0YmFzZSArPSBpX2VoZHJwLT5lX3BoZW50c2l6ZSAqIGlfZWhkcnAtPmVfcGhudW07Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpX2VoZHJwLT5lX3BoZW50c2l6ZSA9IDA7Ci0gICAgICBpX3BoZHJwID0gMDsKLSAgICAgIGlfZWhkcnAtPmVfcGhvZmYgPSAwOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2hzdHJ0YWIsICIuc3ltdGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyLnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2hzdHJ0YWIsICIuc3RydGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfbmFtZSA9Ci0gICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaHN0cnRhYiwgIi5zaHN0cnRhYiIsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMQotICAgICAgfHwgZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xCi0gICAgICB8fCBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSByZWxvYyBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHBhcnQKLSAgIG9mIHRoZSBsb2FkYWJsZSBmaWxlIGltYWdlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgb2ZmOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKipzaGRycHA7Ci0KLSAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKLQotICBmb3IgKGkgPSAxLCBzaGRycHAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpICsgMTsKLSAgICAgICBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0gICAgICAgaSsrLCBzaGRycHArKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc2hkcnA7Ci0KLSAgICAgIHNoZHJwID0gKnNoZHJwcDsKLSAgICAgIGlmICgoc2hkcnAtPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBzaGRycC0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICYmIHNoZHJwLT5zaF9vZmZzZXQgPT0gLTEpCi0Jb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHNoZHJwLCBvZmYsIHRydWUpOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuCi0gICAgICAmJiAhIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICAgICAgICAgICAgIChhYmZkLCAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0KLSAgZmFpbGVkID0gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgYmVkLT5zLT53cml0ZV9yZWxvY3MsICZmYWlsZWQpOwotICBpZiAoZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCk7Ci0KLSAgLyogQWZ0ZXIgd3JpdGluZyB0aGUgaGVhZGVycywgd2UgbmVlZCB0byB3cml0ZSB0aGUgc2VjdGlvbnMgdG9vLi4uICovCi0gIGZvciAoY291bnQgPSAxOyBjb3VudCA8IGlfZWhkcnAtPmVfc2hudW07IGNvdW50KyspCi0gICAgewotICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nKQotCSgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpIChhYmZkLCBpX3NoZHJwW2NvdW50XSk7Ci0gICAgICBpZiAoaV9zaGRycFtjb3VudF0tPmNvbnRlbnRzKQotCXsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgaV9zaGRycFtjb3VudF0tPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3dyaXRlIChpX3NoZHJwW2NvdW50XS0+Y29udGVudHMsIGlfc2hkcnBbY291bnRdLT5zaF9zaXplLAotCQkJICAgICAxLCBhYmZkKQotCQkgICE9IGlfc2hkcnBbY291bnRdLT5zaF9zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGhlYWRlciBuYW1lcy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfaGRyLnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZWxmX3Noc3RydGFiIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpIChhYmZkLAotCQkJCQkJZWxmX3RkYXRhIChhYmZkKS0+bGlua2VyKTsKLQotICByZXR1cm4gYmVkLT5zLT53cml0ZV9zaGRyc19hbmRfZWhkciAoYWJmZCk7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIEhvcGVmdWxseSB0aGlzIGNhbiBiZSBkb25lIGp1c3QgbGlrZSBhbiBvYmplY3QgZmlsZS4gKi8KLSAgcmV0dXJuIF9iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCk7Ci19Ci0vKiBnaXZlbiBhIHNlY3Rpb24sIHNlYXJjaCB0aGUgaGVhZGVyIHRvIGZpbmQgdGhlbS4uLiAqLwotaW50Ci1fYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzZWMgKmFzZWN0OwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpbnQgaW5kZXg7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIGludCBtYXhpbmRleCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1heGluZGV4OyBpbmRleCsrKQotICAgIHsKLSAgICAgIGhkciA9IGlfc2hkcnBbaW5kZXhdOwotICAgICAgaWYgKGhkci0+YmZkX3NlY3Rpb24gPT0gYXNlY3QpCi0JcmV0dXJuIGluZGV4OwotICAgIH0KLQotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWF4aW5kZXg7IGluZGV4KyspCi0JewotCSAgaW50IHJldHZhbDsKLQotCSAgaGRyID0gaV9zaGRycFtpbmRleF07Ci0JICByZXR2YWwgPSBpbmRleDsKLQkgIGlmICgoKmJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKQotCSAgICAgIChhYmZkLCBoZHIsIGFzZWN0LCAmcmV0dmFsKSkKLQkgICAgcmV0dXJuIHJldHZhbDsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGFzZWN0KSkKLSAgICByZXR1cm4gU0hOX0FCUzsKLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYXNlY3QpKQotICAgIHJldHVybiBTSE5fQ09NTU9OOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChhc2VjdCkpCi0gICAgcmV0dXJuIFNITl9VTkRFRjsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qIEdpdmVuIGEgQkZEIHN5bWJvbCwgcmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgRUxGIHN5bWJvbCB0YWJsZSwgb3IgLTEKLSAgIG9uIGVycm9yLiAgKi8KLQotaW50Ci1fYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCBhc3ltX3B0cl9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFzeW1fcHRyX3B0cjsKLXsKLSAgYXN5bWJvbCAqYXN5bV9wdHIgPSAqYXN5bV9wdHJfcHRyOwotICBpbnQgaWR4OwotICBmbGFnd29yZCBmbGFncyA9IGFzeW1fcHRyLT5mbGFnczsKLQotICAvKiBXaGVuIGdhcyBjcmVhdGVzIHJlbG9jYXRpb25zIGFnYWluc3QgbG9jYWwgbGFiZWxzLCBpdCBjcmVhdGVzIGl0cwotICAgICBvd24gc3ltYm9sIGZvciB0aGUgc2VjdGlvbiwgYnV0IGRvZXMgcHV0IHRoZSBzeW1ib2wgaW50byB0aGUKLSAgICAgc3ltYm9sIGNoYWluLCBzbyB1ZGF0YSBpcyAwLiAgV2hlbiB0aGUgbGlua2VyIGlzIGdlbmVyYXRpbmcKLSAgICAgcmVsb2NhdGFibGUgb3V0cHV0LCB0aGlzIHNlY3Rpb24gc3ltYm9sIG1heSBiZSBmb3Igb25lIG9mIHRoZQotICAgICBpbnB1dCBzZWN0aW9ucyByYXRoZXIgdGhhbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotICBpZiAoYXN5bV9wdHItPnVkYXRhLmkgPT0gMAotICAgICAgJiYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgICAgJiYgYXN5bV9wdHItPnNlY3Rpb24pCi0gICAgewotICAgICAgaW50IGluZHg7Ci0KLSAgICAgIGlmIChhc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQlpbmR4ID0gYXN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5pbmRleDsKLSAgICAgIGVsc2UKLQlpbmR4ID0gYXN5bV9wdHItPnNlY3Rpb24tPmluZGV4OwotICAgICAgaWYgKGVsZl9zZWN0aW9uX3N5bXMgKGFiZmQpW2luZHhdKQotCWFzeW1fcHRyLT51ZGF0YS5pID0gZWxmX3NlY3Rpb25fc3ltcyAoYWJmZClbaW5keF0tPnVkYXRhLmk7Ci0gICAgfQotCi0gIGlkeCA9IGFzeW1fcHRyLT51ZGF0YS5pOwotCi0gIGlmIChpZHggPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIHdoZW4gdXNpbmcgLS1zdHJpcC1zeW1ib2wgb24gYSBzeW1ib2wKLSAgICAgICAgIHdoaWNoIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uIGVudHJ5LiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChhc3ltX3B0cikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotI2lmIERFQlVHICYgNAotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgXygiZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgMHglLjhseCwgbmFtZSA9ICVzLCBzeW0gbnVtID0gJWQsIGZsYWdzID0gMHglLjhseCVzXG4iKSwKLQkgICAgIChsb25nKSBhc3ltX3B0ciwgYXN5bV9wdHItPm5hbWUsIGlkeCwgZmxhZ3MsCi0JICAgICBlbGZfc3ltYm9sX2ZsYWdzIChmbGFncykpOwotICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogQ29weSBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBjb3BpZXMgYW55IHByb2dyYW0gaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICppZWhkcjsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWZpcnN0OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICoqcG07Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IG51bV9zZWdtZW50czsKLSAgYm9vbGVhbiBwaGRyX2luY2x1ZGVkID0gZmFsc2U7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChlbGZfdGRhdGEgKGliZmQpLT5waGRyID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWVoZHIgPSBlbGZfZWxmaGVhZGVyIChpYmZkKTsKLQotICBtZmlyc3QgPSBOVUxMOwotICBwbSA9ICZtZmlyc3Q7Ci0KLSAgbnVtX3NlZ21lbnRzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfcGhudW07Ci0KLSNkZWZpbmUgSVNfQ09OVEFJTkVEX0JZKGFkZHIsIGxlbiwgYm90dG9tLCBwaGRyKQkJIAlcCi0JICAoKGFkZHIpID49IChib3R0b20pCQkJCSAJICAJXAotCSAgICYmICggICAoKGFkZHIpICsgKGxlbikpIDw9ICgoYm90dG9tKSArIChwaGRyKS0+cF9tZW1zeikJXAotCSAgICAgICB8fCAoKGFkZHIpICsgKGxlbikpIDw9ICgoYm90dG9tKSArIChwaGRyKS0+cF9maWxlc3opKSkKLQotICAvKiBTcGVjaWFsIGNhc2U6IGNvcmVmaWxlICJOT1RFIiBzZWN0aW9uIGNvbnRhaW5pbmcgcmVncywgcHJwc2luZm8gZXRjLiAqLwotCi0jZGVmaW5lIElTX0NPUkVGSUxFX05PVEUocCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIChwLT5wX3R5cGUgPT0gUFRfTk9URSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIGJmZF9nZXRfZm9ybWF0IChpYmZkKSA9PSBiZmRfY29yZSAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgJiYgcy0+dm1hID09IDAgJiYgcy0+bG1hID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICAmJiAoYmZkX3ZtYSkgcy0+ZmlsZXBvcyA+PSBwLT5wX29mZnNldCAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIChiZmRfdm1hKSBzLT5maWxlcG9zICsgcy0+X3Jhd19zaXplICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgPD0gcC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeikKLQotICAvKiBUaGUgY29tcGxpY2F0ZWQgY2FzZSB3aGVuIHBfdmFkZHIgaXMgMCBpcyB0byBoYW5kbGUgdGhlIFNvbGFyaXMKLSAgICAgbGlua2VyLCB3aGljaCBnZW5lcmF0ZXMgYSBQVF9JTlRFUlAgc2VjdGlvbiB3aXRoIHBfdmFkZHIgYW5kCi0gICAgIHBfbWVtc3ogc2V0IHRvIDAuICAqLwotCi0jZGVmaW5lIElTX1NPTEFSSVNfUFRfSU5URVJQKHAsIHMpCQkJCQlcCi0JICAgIChwLT5wX3ZhZGRyID09IDAJCQkJCQlcCi0JICAgICAmJiBwLT5wX2ZpbGVzeiA+IDAJCQkJCQlcCi0JICAgICAmJiAocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCQkJXAotCSAgICAgJiYgcy0+X3Jhd19zaXplID4gMAkJCQkJXAotCSAgICAgJiYgKGJmZF92bWEpIHMtPmZpbGVwb3MgPj0gcC0+cF9vZmZzZXQJCQlcCi0JICAgICAmJiAoKGJmZF92bWEpIHMtPmZpbGVwb3MgKyBzLT5fcmF3X3NpemUJCQlcCi0JCSAgICAgPD0gcC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeikpCi0KLSAgLyogU2NhbiB0aHJvdWdoIHRoZSBzZWdtZW50cyBzcGVjaWZpZWQgaW4gdGhlIHByb2dyYW0gaGVhZGVyCi0gICAgIG9mIHRoZSBpbnB1dCBCRkQuICAqLwotICBmb3IgKGkgPSAwLCBwID0gZWxmX3RkYXRhIChpYmZkKS0+cGhkcjsgaSA8IG51bV9zZWdtZW50czsgaSsrLCBwKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNzZWNzOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotICAgICAgYXNlY3Rpb24gKm9zOwotICAgICAgdW5zaWduZWQgaW50IGlzZWM7Ci0gICAgICBiZmRfdm1hIG1hdGNoaW5nX2xtYTsKLSAgICAgIGJmZF92bWEgc3VnZ2VzdGVkX2xtYTsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAvKiBGb3IgZWFjaCBzZWN0aW9uIGluIHRoZSBpbnB1dCBCRkQsIGRlY2lkZSBpZiBpdCBzaG91bGQgYmUKLQkgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgc2VnbWVudC4gIEEgc2VjdGlvbiB3aWxsIGJlIGluY2x1ZGVkCi0JIGlmIGl0IGlzIHdpdGhpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgc2VnbWVudCwgYW5kIGl0IGlzCi0JIGFuIGFsbG9jYXRlZCBzZWdtZW50LCBhbmQgdGhlcmUgaXMgYW4gb3V0cHV0IHNlY3Rpb24KLQkgYXNzb2NpYXRlZCB3aXRoIGl0LiAgKi8KLSAgICAgIGNzZWNzID0gMDsKLSAgICAgIGZvciAocyA9IGliZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgewotCSAgICBpZiAoKElTX0NPTlRBSU5FRF9CWSAocy0+dm1hLCBzLT5fcmF3X3NpemUsIHAtPnBfdmFkZHIsIHApCi0JCSB8fCBJU19TT0xBUklTX1BUX0lOVEVSUCAocCwgcykpCi0JCSYmIChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgICArK2NzZWNzOwotCSAgICBlbHNlIGlmIChJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkgICAgICArK2NzZWNzOwotCSAgfQotCi0gICAgICAvKiBBbGxvY2F0ZSBhIHNlZ21lbnQgbWFwIGJpZyBlbm91Z2ggdG8gY29udGFpbiBhbGwgb2YgdGhlCi0JIHNlY3Rpb25zIHdlIGhhdmUgc2VsZWN0ZWQuICAqLwotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF9hbGxvYyAob2JmZCwKLQkJICAgICAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgICAgICsgKChzaXplX3QpIGNzZWNzIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpZWxkcyBvZiB0aGUgc2VnbWVudCBtYXAuICBEZWZhdWx0IHRvCi0JIHVzaW5nIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IGluIHRoZSBpbnB1dCBCRkQuICAqLwotICAgICAgbS0+bmV4dCAgICAgICAgICA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgICAgICAgID0gcC0+cF90eXBlOwotICAgICAgbS0+cF9mbGFncyAgICAgICA9IHAtPnBfZmxhZ3M7Ci0gICAgICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKLSAgICAgIG0tPnBfcGFkZHIgICAgICAgPSBwLT5wX3BhZGRyOwotICAgICAgbS0+cF9wYWRkcl92YWxpZCA9IDE7Ci0KLSAgICAgIC8qIERldGVybWluZSBpZiB0aGlzIHNlZ21lbnQgY29udGFpbnMgdGhlIEVMRiBmaWxlIGhlYWRlcgotCSBhbmQgaWYgaXQgY29udGFpbnMgdGhlIHByb2dyYW0gaGVhZGVycyB0aGVtc2VsdmVzLiAgKi8KLSAgICAgIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSAocC0+cF9vZmZzZXQgPT0gMAotCQkJICAgICAmJiBwLT5wX2ZpbGVzeiA+PSBpZWhkci0+ZV9laHNpemUpOwotCi0gICAgICBtLT5pbmNsdWRlc19waGRycyA9IDA7Ci0KLSAgICAgIGlmICghIHBoZHJfaW5jbHVkZWQgfHwgcC0+cF90eXBlICE9IFBUX0xPQUQpCi0JewotCSAgbS0+aW5jbHVkZXNfcGhkcnMgPQotCSAgICAocC0+cF9vZmZzZXQgPD0gKGJmZF92bWEpIGllaGRyLT5lX3Bob2ZmCi0JICAgICAmJiAocC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzegotCQkgPj0gKChiZmRfdm1hKSBpZWhkci0+ZV9waG9mZgotCQkgICAgICsgaWVoZHItPmVfcGhudW0gKiBpZWhkci0+ZV9waGVudHNpemUpKSk7Ci0JICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQgJiYgbS0+aW5jbHVkZXNfcGhkcnMpCi0JICAgIHBoZHJfaW5jbHVkZWQgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKGNzZWNzID09IDApCi0JewotCSAgLyogU3BlY2lhbCBzZWdtZW50cywgc3VjaCBhcyB0aGUgUFRfUEhEUiBzZWdtZW50LCBtYXkgY29udGFpbgotCSAgICAgbm8gc2VjdGlvbnMsIGJ1dCBvcmRpbmFyeSwgbG9hZGFibGUgc2VnbWVudHMgc2hvdWxkIGNvbnRhaW4KLQkgICAgIHNvbWV0aGluZy4gICovCi0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJKF8oIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotCSAgbS0+Y291bnQgPSAwOwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHNjYW4gdGhlIHNlY3Rpb25zIGluIHRoZSBpbnB1dCBCRkQgYWdhaW4gYW5kIGF0dGVtcHQKLQkgdG8gYWRkIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHNlY3Rpb25zIHRvIHRoZSBzZWdtZW50IG1hcC4KLQkgVGhlIHByb2JsZW0gaGVyZSBpcyBob3cgdG8gaGFuZGxlIGFuIG91dHB1dCBzZWN0aW9uIHdoaWNoIGhhcwotCSBiZWVuIG1vdmVkIChpZSBoYWQgaXRzIExNQSBjaGFuZ2VkKS4gIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmlsaXRpZXM6Ci0KLQkgMS4gTm9uZSBvZiB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkLgotCSAgICBJbiB0aGlzIGNhc2Ugd2UgY2FuIGNvbnRpbnVlIHRvIHVzZSB0aGUgc2VnbWVudCBMTUEgZnJvbSB0aGUKLQkgICAgaW5wdXQgQkZELgotCi0JIDIuIEFsbCBvZiB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIGJ5IHRoZSBzYW1lIGFtb3VudC4KLQkgICAgSW4gdGhpcyBjYXNlIHdlIGNhbiBjaGFuZ2UgdGhlIHNlZ21lbnQncyBMTUEgdG8gbWF0Y2ggdGhlIExNQQotCSAgICBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQotCSAzLiBTb21lIG9mIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQsIG90aGVycyBoYXZlIG5vdC4KLQkgICAgSW4gdGhpcyBjYXNlIHRob3NlIHNlY3Rpb25zIHdoaWNoIGhhdmUgbm90IGJlZW4gbW92ZWQgY2FuIGJlCi0JICAgIHBsYWNlZCBpbiB0aGUgY3VycmVudCBzZWdtZW50IHdoaWNoIHdpbGwgaGF2ZSB0byBoYXZlIGl0cyBzaXplLAotCSAgICBhbmQgcG9zc2libHkgaXRzIExNQSBjaGFuZ2VkLCBhbmQgYSBuZXcgc2VnbWVudCBvciBzZWdtZW50cyB3aWxsCi0JICAgIGhhdmUgdG8gYmUgY3JlYXRlZCB0byBjb250YWluIHRoZSBvdGhlciBzZWN0aW9ucy4KLQotCSA0LiBUaGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkLCBidXQgbm90IGJlIHRoZSBzYW1lIGFtb3VudC4KLQkgICAgSW4gdGhpcyBjYXNlIHdlIGNhbiBjaGFuZ2UgdGhlIHNlZ21lbnQncyBMTUEgdG8gbWF0Y2ggdGhlIExNQQotCSAgICBvZiB0aGUgZmlyc3Qgc2VjdGlvbiBhbmQgd2Ugd2lsbCBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBzZWdtZW50Ci0JICAgIG9yIHNlZ21lbnRzIHRvIGNvbnRhaW4gdGhlIG90aGVyIHNlY3Rpb25zLgotCi0JIEluIG9yZGVyIHRvIHNhdmUgdGltZSwgd2UgYWxsb2NhdGUgYW4gYXJyYXkgdG8gaG9sZCB0aGUgc2VjdGlvbgotCSBwb2ludGVycyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgQXMgdGhlc2Ugc2VjdGlvbnMgZ2V0IGFzc2lnbmVkCi0JIHRvIGEgc2VnbWVudCwgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoaXMgYXJyYXkuICAqLwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbiAqKSAqIGNzZWNzKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU3RlcCBPbmU6IFNjYW4gZm9yIHNlZ21lbnQgdnMgc2VjdGlvbiBMTUEgY29uZmxpY3RzLgotCSBBbHNvIGFkZCB0aGUgc2VjdGlvbnMgdG8gdGhlIHNlY3Rpb24gYXJyYXkgYWxsb2NhdGVkIGFib3ZlLgotCSBBbHNvIGFkZCB0aGUgc2VjdGlvbnMgdG8gdGhlIGN1cnJlbnQgc2VnbWVudC4gIEluIHRoZSBjb21tb24KLQkgY2FzZSwgd2hlcmUgdGhlIHNlY3Rpb25zIGhhdmUgbm90IGJlZW4gbW92ZWQsIHRoaXMgbWVhbnMgdGhhdAotCSB3ZSBoYXZlIGNvbXBsZXRlbHkgZmlsbGVkIHRoZSBzZWdtZW50LCBhbmQgdGhlcmUgaXMgbm90aGluZwotCSBtb3JlIHRvIGRvLiAgKi8KLQotICAgICAgaXNlYyA9IDA7Ci0gICAgICBtYXRjaGluZ19sbWEgPSBmYWxzZTsKLSAgICAgIHN1Z2dlc3RlZF9sbWEgPSAwOwotCi0gICAgICBmb3IgKGogPSAwLCBzID0gaWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgaWYgKCgoKElTX0NPTlRBSU5FRF9CWSAocy0+dm1hLCBzLT5fcmF3X3NpemUsIHAtPnBfdmFkZHIsIHApCi0JCSB8fCBJU19TT0xBUklTX1BUX0lOVEVSUCAocCwgcykpCi0JCSYmIChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgICAgfHwgSVNfQ09SRUZJTEVfTk9URSAocCwgcykpCi0JICAgICAgJiYgb3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNlY3Rpb25zW2orK10gPSBzOwotCi0JICAgICAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGxpbmtlciBhbHdheXMgc2V0cyBwX3BhZGRyIHRvIDAuCi0JCSBXZSB0cnkgdG8gY2F0Y2ggdGhhdCBjYXNlIGhlcmUsIGFuZCBzZXQgaXQgdG8gdGhlCi0JCSBjb3JyZWN0IHZhbHVlLiAgKi8KLQkgICAgICBpZiAocC0+cF9wYWRkciA9PSAwCi0JCSAgJiYgcC0+cF92YWRkciAhPSAwCi0JCSAgJiYgaXNlYyA9PSAwCi0JCSAgJiYgb3MtPmxtYSAhPSAwCi0JCSAgJiYgKG9zLT52bWEgPT0gKHAtPnBfdmFkZHIKLQkJCQkgICsgKG0tPmluY2x1ZGVzX2ZpbGVoZHIKLQkJCQkgICAgID8gaWVoZHItPmVfZWhzaXplCi0JCQkJICAgICA6IDApCi0JCQkJICArIChtLT5pbmNsdWRlc19waGRycwotCQkJCSAgICAgPyBpZWhkci0+ZV9waG51bSAqIGllaGRyLT5lX3BoZW50c2l6ZQotCQkJCSAgICAgOiAwKSkpKQotCQltLT5wX3BhZGRyID0gcC0+cF92YWRkcjsKLQotCSAgICAgIC8qIE1hdGNoIHVwIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IHdpdGggdGhlCi0JCSBMTUEgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChJU19DT05UQUlORURfQlkgKG9zLT5sbWEsIG9zLT5fcmF3X3NpemUsIG0tPnBfcGFkZHIsIHApCi0JCSAgfHwgSVNfQ09SRUZJTEVfTk9URSAocCwgcykpCi0JCXsKLQkJICBpZiAobWF0Y2hpbmdfbG1hID09IDApCi0JCSAgICBtYXRjaGluZ19sbWEgPSBvcy0+bG1hOwotCi0JCSAgLyogV2UgYXNzdW1lIHRoYXQgaWYgdGhlIHNlY3Rpb24gZml0cyB3aXRoaW4gdGhlIHNlZ21lbnQKLQkJICAgICB0aGF0IGl0IGRvZXMgbm90IG92ZXJsYXAgYW55IG90aGVyIHNlY3Rpb24gd2l0aGluIHRoYXQKLQkJICAgICBzZWdtZW50LiAgKi8KLQkJICBtLT5zZWN0aW9uc1tpc2VjKytdID0gb3M7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdWdnZXN0ZWRfbG1hID09IDApCi0JCXN1Z2dlc3RlZF9sbWEgPSBvcy0+bG1hOwotCSAgICB9Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChqID09IGNzZWNzKTsKLQotICAgICAgLyogU3RlcCBUd286IEFkanVzdCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBzZWdtZW50LAotCSBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGlzZWMgPT0gY3NlY3MpCi0JewotCSAgLyogQWxsIG9mIHRoZSBzZWN0aW9ucyBmaXR0ZWQgd2l0aGluIHRoZSBzZWdtZW50IGFzIGN1cnJlbnRseQotCSAgICAgc3BlY2lmaWVkLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBjYXNlLiAgQWRkIHRoZSBzZWdtZW50IHRvCi0JICAgICB0aGUgbGlzdCBvZiBidWlsdCBzZWdtZW50cyBhbmQgY2Fycnkgb24gdG8gcHJvY2VzcyB0aGUgbmV4dAotCSAgICAgcHJvZ3JhbSBoZWFkZXIgaW4gdGhlIGlucHV0IEJGRC4gICovCi0JICBtLT5jb3VudCA9IGNzZWNzOwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGZyZWUgKHNlY3Rpb25zKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKG1hdGNoaW5nX2xtYSAhPSAwKQotCXsKLQkgIC8qIEF0IGxlYXN0IG9uZSBzZWN0aW9uIGZpdHMgaW5zaWRlIHRoZSBjdXJyZW50IHNlZ21lbnQuCi0JICAgICBLZWVwIGl0LCBidXQgbW9kaWZ5IGl0cyBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hdGNoIHRoZQotCSAgICAgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uIHRoYXQgZml0dGVkLiAgKi8KLQotCSAgbS0+cF9wYWRkciA9IG1hdGNoaW5nX2xtYTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm9uZSBvZiB0aGUgc2VjdGlvbnMgZml0dGVkIGluc2lkZSB0aGUgY3VycmVudCBzZWdtZW50LgotCSAgICAgQ2hhbmdlIHRoZSBjdXJyZW50IHNlZ21lbnQncyBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hdGNoCi0JICAgICB0aGUgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uLiAgKi8KLQotCSAgbS0+cF9wYWRkciA9IHN1Z2dlc3RlZF9sbWE7Ci0JfQotCi0gICAgICAvKiBTdGVwIFRocmVlOiBMb29wIG92ZXIgdGhlIHNlY3Rpb25zIGFnYWluLCB0aGlzIHRpbWUgYXNzaWduaW5nCi0JIHRob3NlIHRoYXQgZml0IHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgYW5kIHJlbXZvaW5nIHRoZW0gZnJvbSB0aGUKLQkgc2VjdGlvbnMgYXJyYXk7IGJ1dCBtYWtpbmcgc3VyZSBub3QgdG8gbGVhdmUgbGFyZ2UgZ2Fwcy4gIE9uY2UgYWxsCi0JIHBvc3NpYmxlIHNlY3Rpb25zIGhhdmUgYmVlbiBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBzZWdtZW50IGl0IGlzCi0JIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGJ1aWx0IHNlZ21lbnRzIGFuZCBpZiBzZWN0aW9ucyBzdGlsbCByZW1haW4KLQkgdG8gYmUgYXNzaWduZWQsIGEgbmV3IHNlZ21lbnQgaXMgY29uc3RydWN0ZWQgYmVmb3JlIHJlcGVhdGluZwotCSB0aGUgbG9vcC4gICovCi0gICAgICBpc2VjID0gMDsKLSAgICAgIGRvCi0JewotCSAgbS0+Y291bnQgPSAwOwotCSAgc3VnZ2VzdGVkX2xtYSA9IDA7Ci0KLQkgIC8qIEZpbGwgdGhlIGN1cnJlbnQgc2VnbWVudCB3aXRoIHNlY3Rpb25zIHRoYXQgZml0LiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBjc2VjczsgaisrKQotCSAgICB7Ci0JICAgICAgcyA9IHNlY3Rpb25zW2pdOwotCi0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotCi0JICAgICAgaWYgKElTX0NPTlRBSU5FRF9CWSAob3MtPmxtYSwgb3MtPl9yYXdfc2l6ZSwgbS0+cF9wYWRkciwgcCkKLQkJICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkJewotCQkgIGlmIChtLT5jb3VudCA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBJZiB0aGUgZmlyc3Qgc2VjdGlvbiBpbiBhIHNlZ21lbnQgZG9lcyBub3Qgc3RhcnQgYXQKLQkJCSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LCB0aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4gICovCi0JCSAgICAgIGlmIChvcy0+bG1hICE9IG0tPnBfcGFkZHIpCi0JCQlhYm9ydCAoKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICogcHJldl9zZWM7Ci0JCSAgICAgIGJmZF92bWEgbWF4cGFnZXNpemU7Ci0KLQkJICAgICAgcHJldl9zZWMgPSBtLT5zZWN0aW9uc1ttLT5jb3VudCAtIDFdOwotCQkgICAgICBtYXhwYWdlc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvYmZkKS0+bWF4cGFnZXNpemU7Ci0KLQkJICAgICAgLyogSWYgdGhlIGdhcCBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHNlY3Rpb24KLQkJCSBhbmQgdGhlIHN0YXJ0IG9mIHRoaXMgc2VjdGlvbiBpcyBtb3JlIHRoYW4gbWF4cGFnZXNpemUKLQkJCSB0aGVuIHdlIG5lZWQgdG8gc3RhcnQgYSBuZXcgc2VnbWVudC4gICovCi0JCSAgICAgIGlmIChCRkRfQUxJR04gKHByZXZfc2VjLT5sbWEgKyBwcmV2X3NlYy0+X3Jhd19zaXplLCBtYXhwYWdlc2l6ZSkKLQkJCSAgPCBCRkRfQUxJR04gKG9zLT5sbWEsIG1heHBhZ2VzaXplKSkKLQkJCXsKLQkJCSAgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKLQkJCSAgICBzdWdnZXN0ZWRfbG1hID0gb3MtPmxtYTsKLQotCQkJICBjb250aW51ZTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIG0tPnNlY3Rpb25zW20tPmNvdW50KytdID0gb3M7Ci0JCSAgKytpc2VjOwotCQkgIHNlY3Rpb25zW2pdID0gTlVMTDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKLQkJc3VnZ2VzdGVkX2xtYSA9IG9zLT5sbWE7Ci0JICAgIH0KLQotCSAgQkZEX0FTU0VSVCAobS0+Y291bnQgPiAwKTsKLQotCSAgLyogQWRkIHRoZSBjdXJyZW50IHNlZ21lbnQgdG8gdGhlIGxpc3Qgb2YgYnVpbHQgc2VnbWVudHMuICAqLwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGlmIChpc2VjIDwgY3NlY3MpCi0JICAgIHsKLQkgICAgICAvKiBXZSBzdGlsbCBoYXZlIG5vdCBhbGxvY2F0ZWQgYWxsIG9mIHRoZSBzZWN0aW9ucyB0bwotCQkgc2VnbWVudHMuICBDcmVhdGUgYSBuZXcgc2VnbWVudCBoZXJlLCBpbml0aWFsaXNlIGl0Ci0JCSBhbmQgY2Fycnkgb24gbG9vcGluZy4gICovCi0KLQkgICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JCSAgIGJmZF9hbGxvYyAob2JmZCwKLQkJCSAgICAgIChzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApCi0JCQkgICAgICAgKyAoKHNpemVfdCkgY3NlY3MgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0JICAgICAgaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmllbGRzIG9mIHRoZSBzZWdtZW50IG1hcC4gIFNldCB0aGUgcGh5c2ljYWwKLQkJIHBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIExNQSBvZiB0aGUgZmlyc3Qgc2VjdGlvbiB0aGF0IGhhcwotCQkgbm90IHlldCBiZWVuIGFzc2lnbmVkLiAgKi8KLQotCSAgICAgIG0tPm5leHQgICAgICAgICAgICAgPSBOVUxMOwotCSAgICAgIG0tPnBfdHlwZSAgICAgICAgICAgPSBwLT5wX3R5cGU7Ci0JICAgICAgbS0+cF9mbGFncyAgICAgICAgICA9IHAtPnBfZmxhZ3M7Ci0JICAgICAgbS0+cF9mbGFnc192YWxpZCAgICA9IDE7Ci0JICAgICAgbS0+cF9wYWRkciAgICAgICAgICA9IHN1Z2dlc3RlZF9sbWE7Ci0JICAgICAgbS0+cF9wYWRkcl92YWxpZCAgICA9IDE7Ci0JICAgICAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IDA7Ci0JICAgICAgbS0+aW5jbHVkZXNfcGhkcnMgICA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAoaXNlYyA8IGNzZWNzKTsKLQotICAgICAgZnJlZSAoc2VjdGlvbnMpOwotICAgIH0KLQotICAvKiBUaGUgU29sYXJpcyBsaW5rZXIgY3JlYXRlcyBwcm9ncmFtIGhlYWRlcnMgaW4gd2hpY2ggYWxsIHRoZQotICAgICBwX3BhZGRyIGZpZWxkcyBhcmUgemVyby4gIFdoZW4gd2UgdHJ5IHRvIG9iamNvcHkgb3Igc3RyaXAgc3VjaCBhCi0gICAgIGZpbGUsIHdlIGdldCBjb25mdXNlZC4gIENoZWNrIGZvciB0aGlzIGNhc2UsIGFuZCBpZiB3ZSBmaW5kIGl0Ci0gICAgIHJlc2V0IHRoZSBwX3BhZGRyX3ZhbGlkIGZpZWxkcy4gICovCi0gIGZvciAobSA9IG1maXJzdDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLSAgICBpZiAobS0+cF9wYWRkciAhPSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChtID0gbWZpcnN0OyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotCW0tPnBfcGFkZHJfdmFsaWQgPSAwOwotICAgIH0KLQotICBlbGZfdGRhdGEgKG9iZmQpLT5zZWdtZW50X21hcCA9IG1maXJzdDsKLQotI2lmIDAKLSAgLyogRmluYWwgU3RlcDogU29ydCB0aGUgc2VnbWVudHMgaW50byBhc2NlbmRpbmcgb3JkZXIgb2YgcGh5c2ljYWwgYWRkcmVzcy4gKi8KLSAgaWYgKG1maXJzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAqIHByZXY7Ci0KLSAgICAgIHByZXYgPSBtZmlyc3Q7Ci0gICAgICBmb3IgKG0gPSBtZmlyc3QtPm5leHQ7IG0gIT0gTlVMTDsgcHJldiA9IG0sIG0gPSBtLT5uZXh0KQotCXsKLQkgIC8qIFllcyBJIGtub3cgLSBpdHMgYSBidWJibGUgc29ydC4uLi4qLwotCSAgaWYgKG0tPm5leHQgIT0gTlVMTCAmJiAobS0+bmV4dC0+cF9wYWRkciA8IG0tPnBfcGFkZHIpKQotCSAgICB7Ci0JICAgICAgLyogc3dhcCBtIGFuZCBtLT5uZXh0ICovCi0JICAgICAgcHJldi0+bmV4dCA9IG0tPm5leHQ7Ci0JICAgICAgbS0+bmV4dCA9IG0tPm5leHQtPm5leHQ7Ci0JICAgICAgcHJldi0+bmV4dC0+bmV4dCA9IG07Ci0KLQkgICAgICAvKiByZXN0YXJ0IGxvb3AuICovCi0JICAgICAgbSA9IG1maXJzdDsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotI3VuZGVmIElTX0NPTlRBSU5FRF9CWQotI3VuZGVmIElTX1NPTEFSSVNfUFRfSU5URVJQCi0jdW5kZWYgSVNfQ09SRUZJTEVfTk9URQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBUaGlzIGNvcGllcyBvdmVyIHRoZSBlbnRzaXplCi0gICBmaWVsZCwgYW5kIHNvbWV0aW1lcyB0aGUgaW5mbyBmaWVsZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICppaGRyLCAqb2hkcjsKLQotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQ29weSBvdmVyIHByaXZhdGUgQkZEIGRhdGEgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY29waWVkLgotICAgICBUaGlzIG11c3QgYmUgZG9uZSBoZXJlLCByYXRoZXIgdGhhbiBpbiB0aGUgY29weV9wcml2YXRlX2JmZF9kYXRhCi0gICAgIGVudHJ5IHBvaW50LCBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9uCi0gICAgIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHByb2dyYW0gaGVhZGVycyBoYXZlCi0gICAgIGFscmVhZHkgYmVlbiB3b3JrZWQgb3V0LiAgKi8KLSAgaWYgKGVsZl90ZGF0YSAob2JmZCktPnNlZ21lbnRfbWFwID09IE5VTEwKLSAgICAgICYmIGVsZl90ZGF0YSAoaWJmZCktPnBoZHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogT25seSBzZXQgdXAgdGhlIHNlZ21lbnRzIGlmIHRoZXJlIGFyZSBubyBtb3JlIFNFQ19BTExPQwotICAgICAgICAgc2VjdGlvbnMuICBGSVhNRTogVGhpcyB3b24ndCBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgb2JqY29weSBpcwotICAgICAgICAgdXNlZCB0byByZW1vdmUgdGhlIGxhc3QgU0VDX0FMTE9DIHNlY3Rpb24sIHNpbmNlIG9iamNvcHkKLSAgICAgICAgIHdvbid0IGNhbGwgdGhpcyByb3V0aW5lIGluIHRoYXQgY2FzZS4gICovCi0gICAgICBmb3IgKHMgPSBpc2VjLT5uZXh0OyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICBicmVhazsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JewotCSAgaWYgKCEgY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWhkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHI7Ci0gIG9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPnRoaXNfaGRyOwotCi0gIG9oZHItPnNoX2VudHNpemUgPSBpaGRyLT5zaF9lbnRzaXplOwotCi0gIGlmIChpaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLSAgICAgIHx8IGloZHItPnNoX3R5cGUgPT0gU0hUX0RZTlNZTQotICAgICAgfHwgaWhkci0+c2hfdHlwZSA9PSBTSFRfR05VX3Zlcm5lZWQKLSAgICAgIHx8IGloZHItPnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJkZWYpCi0gICAgb2hkci0+c2hfaW5mbyA9IGloZHItPnNoX2luZm87Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPnVzZV9yZWxhX3AKLSAgICA9IGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT51c2VfcmVsYV9wOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IHByaXZhdGUgc3ltYm9sIGluZm9ybWF0aW9uLiAgSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBzZWN0aW9uCi0gICB3aGljaCB3ZSBkaWQgbm90IG1hcCBpbnRvIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBtYXAgdGhlIHNlY3Rpb24KLSAgIGluZGV4IGNvcnJlY3RseS4gIFdlIHVzZSBzcGVjaWFsIG1hY3JvIGRlZmluaXRpb25zIGZvciB0aGUgbWFwcGVkCi0gICBzZWN0aW9uIGluZGljZXM7IHRoZXNlIGRlZmluaXRpb25zIGFyZSBpbnRlcnByZXRlZCBieSB0aGUKLSAgIHN3YXBfb3V0X3N5bXMgZnVuY3Rpb24uICAqLwotCi0jZGVmaW5lIE1BUF9PTkVTWU1UQUIgKFNITl9MT1JFU0VSVkUgLSAxKQotI2RlZmluZSBNQVBfRFlOU1lNVEFCIChTSE5fTE9SRVNFUlZFIC0gMikKLSNkZWZpbmUgTUFQX1NUUlRBQiAoU0hOX0xPUkVTRVJWRSAtIDMpCi0jZGVmaW5lIE1BUF9TSFNUUlRBQiAoU0hOX0xPUkVTRVJWRSAtIDQpCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bWFyZywgb2JmZCwgb3N5bWFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBhc3ltYm9sICppc3ltYXJnOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKm9zeW1hcmc7Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqaXN5bSwgKm9zeW07Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlzeW0gPSBlbGZfc3ltYm9sX2Zyb20gKGliZmQsIGlzeW1hcmcpOwotICBvc3ltID0gZWxmX3N5bWJvbF9mcm9tIChvYmZkLCBvc3ltYXJnKTsKLQotICBpZiAoaXN5bSAhPSBOVUxMCi0gICAgICAmJiBvc3ltICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaXN5bS0+c3ltYm9sLnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaG5keDsKLQotICAgICAgc2huZHggPSBpc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotICAgICAgaWYgKHNobmR4ID09IGVsZl9vbmVzeW10YWIgKGliZmQpKQotCXNobmR4ID0gTUFQX09ORVNZTVRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl9keW5zeW10YWIgKGliZmQpKQotCXNobmR4ID0gTUFQX0RZTlNZTVRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl90ZGF0YSAoaWJmZCktPnN0cnRhYl9zZWN0aW9uKQotCXNobmR4ID0gTUFQX1NUUlRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl90ZGF0YSAoaWJmZCktPnNoc3RydGFiX3NlY3Rpb24pCi0Jc2huZHggPSBNQVBfU0hTVFJUQUI7Ci0gICAgICBvc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ID0gc2huZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zd2FwX291dF9zeW1zIChhYmZkLCBzdHRwLCByZWxvY2F0YWJsZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKipzdHRwOwotICAgICBpbnQgcmVsb2NhdGFibGVfcDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICBpZiAoIWVsZl9tYXBfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIER1bXAgb3V0IHRoZSBzeW10YWJzLiAqLwotICB7Ci0gICAgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgYXN5bWJvbCAqKnN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0dDsKLSAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltc3RydGFiX2hkcjsKLSAgICBjaGFyICpvdXRib3VuZF9zeW1zOwotICAgIGludCBpZHg7Ci0KLSAgICBzdHQgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICBpZiAoc3R0ID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgc3ltdGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TWU1UQUI7Ci0gICAgc3ltdGFiX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICBzeW10YWJfaGRyLT5zaF9zaXplID0gc3ltdGFiX2hkci0+c2hfZW50c2l6ZSAqIChzeW1jb3VudCArIDEpOwotICAgIHN5bXRhYl9oZHItPnNoX2luZm8gPSBlbGZfbnVtX2xvY2FscyAoYWJmZCkgKyAxOwotICAgIHN5bXRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLQotICAgIHN5bXN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLQotICAgIG91dGJvdW5kX3N5bXMgPSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgICAgICAgKDEgKyBzeW1jb3VudCkgKiBiZWQtPnMtPnNpemVvZl9zeW0pOwotICAgIGlmIChvdXRib3VuZF9zeW1zID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoUFRSKSBvdXRib3VuZF9zeW1zOwotCi0gICAgLyogbm93IGdlbmVyYXRlIHRoZSBkYXRhIChmb3IgImNvbnRlbnRzIikgKi8KLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHplcm90aCBzeW1ib2wgYW5kIHN3YXAgaXQgb3V0LiAgKi8KLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgc3ltLnN0X25hbWUgPSAwOwotICAgICAgc3ltLnN0X3ZhbHVlID0gMDsKLSAgICAgIHN5bS5zdF9zaXplID0gMDsKLSAgICAgIHN5bS5zdF9pbmZvID0gMDsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBiZWQtPnMtPnN3YXBfc3ltYm9sX291dCAoYWJmZCwgJnN5bSwgKFBUUikgb3V0Ym91bmRfc3ltcyk7Ci0gICAgICBvdXRib3VuZF9zeW1zICs9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICB9Ci0gICAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgICB7Ci0JRWxmX0ludGVybmFsX1N5bSBzeW07Ci0JYmZkX3ZtYSB2YWx1ZSA9IHN5bXNbaWR4XS0+dmFsdWU7Ci0JZWxmX3N5bWJvbF90eXBlICp0eXBlX3B0cjsKLQlmbGFnd29yZCBmbGFncyA9IHN5bXNbaWR4XS0+ZmxhZ3M7Ci0JaW50IHR5cGU7Ci0KLQlpZiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JICAvKiBTZWN0aW9uIHN5bWJvbHMgaGF2ZSBubyBuYW1lcy4gICovCi0JICBzeW0uc3RfbmFtZSA9IDA7Ci0JZWxzZQotCSAgewotCSAgICBzeW0uc3RfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKHN0dCwKLQkJCQkJCQkgICAgICBzeW1zW2lkeF0tPm5hbWUsCi0JCQkJCQkJICAgICAgdHJ1ZSwgZmFsc2UpOwotCSAgICBpZiAoc3ltLnN0X25hbWUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCXR5cGVfcHRyID0gZWxmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1zW2lkeF0pOwotCi0JaWYgKChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotCSAgICAmJiBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNbaWR4XS0+c2VjdGlvbikpCi0JICB7Ci0JICAgIC8qIEVMRiBjb21tb24gc3ltYm9scyBwdXQgdGhlIGFsaWdubWVudCBpbnRvIHRoZSBgdmFsdWUnIGZpZWxkLAotCSAgICAgICBhbmQgdGhlIHNpemUgaW50byB0aGUgYHNpemUnIGZpZWxkLiAgVGhpcyBpcyBiYWNrd2FyZHMgZnJvbQotCSAgICAgICBob3cgQkZEIGhhbmRsZXMgaXQsIHNvIHJldmVyc2UgaXQgaGVyZS4gICovCi0JICAgIHN5bS5zdF9zaXplID0gdmFsdWU7Ci0JICAgIGlmICh0eXBlX3B0ciA9PSBOVUxMCi0JCXx8IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlID09IDApCi0JICAgICAgc3ltLnN0X3ZhbHVlID0gdmFsdWUgPj0gMTYgPyAxNiA6ICgxIDw8IGJmZF9sb2cyICh2YWx1ZSkpOwotCSAgICBlbHNlCi0JICAgICAgc3ltLnN0X3ZhbHVlID0gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWU7Ci0JICAgIHN5bS5zdF9zaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotCSAgICAgIChhYmZkLCBzeW1zW2lkeF0tPnNlY3Rpb24pOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNlY3Rpb24gKnNlYyA9IHN5bXNbaWR4XS0+c2VjdGlvbjsKLQkgICAgaW50IHNobmR4OwotCi0JICAgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uKQotCSAgICAgIHsKLQkJdmFsdWUgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQlzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCSAgICAgIH0KLQkgICAgLyogRG9uJ3QgYWRkIGluIHRoZSBzZWN0aW9uIHZtYSBmb3IgcmVsb2NhdGFibGUgb3V0cHV0LiAgKi8KLQkgICAgaWYgKCEgcmVsb2NhdGFibGVfcCkKLQkgICAgICB2YWx1ZSArPSBzZWMtPnZtYTsKLQkgICAgc3ltLnN0X3ZhbHVlID0gdmFsdWU7Ci0JICAgIHN5bS5zdF9zaXplID0gdHlwZV9wdHIgPyB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplIDogMDsKLQotCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0JCSYmIHR5cGVfcHRyICE9IE5VTEwKLQkJJiYgdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHggIT0gMCkKLQkgICAgICB7Ci0JCS8qIFRoaXMgc3ltYm9sIGlzIGluIGEgcmVhbCBFTEYgc2VjdGlvbiB3aGljaCB3ZSBkaWQKLSAgICAgICAgICAgICAgICAgICBub3QgY3JlYXRlIGFzIGEgQkZEIHNlY3Rpb24uICBVbmRvIHRoZSBtYXBwaW5nIGRvbmUKLSAgICAgICAgICAgICAgICAgICBieSBjb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEuICAqLwotCQlzaG5keCA9IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotCQlzd2l0Y2ggKHNobmR4KQotCQkgIHsKLQkJICBjYXNlIE1BUF9PTkVTWU1UQUI6Ci0JCSAgICBzaG5keCA9IGVsZl9vbmVzeW10YWIgKGFiZmQpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBNQVBfRFlOU1lNVEFCOgotCQkgICAgc2huZHggPSBlbGZfZHluc3ltdGFiIChhYmZkKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgTUFQX1NUUlRBQjoKLQkJICAgIHNobmR4ID0gZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX3NlY3Rpb247Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIE1BUF9TSFNUUlRBQjoKLQkJICAgIHNobmR4ID0gZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfc2VjdGlvbjsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotCQlpZiAoc2huZHggPT0gLTEpCi0JCSAgewotCQkgICAgYXNlY3Rpb24gKnNlYzI7Ci0KLQkJICAgIC8qIFdyaXRpbmcgdGhpcyB3b3VsZCBiZSBhIGhlbGwgb2YgYSBsb3QgZWFzaWVyIGlmCi0JCSAgICAgICB3ZSBoYWQgc29tZSBkZWNlbnQgZG9jdW1lbnRhdGlvbiBvbiBiZmQsIGFuZAotCQkgICAgICAga25ldyB3aGF0IHRvIGV4cGVjdCBvZiB0aGUgbGlicmFyeSwgYW5kIHdoYXQgdG8KLQkJICAgICAgIGRlbWFuZCBvZiBhcHBsaWNhdGlvbnMuICBGb3IgZXhhbXBsZSwgaXQKLQkJICAgICAgIGFwcGVhcnMgdGhhdCBgb2JqY29weScgbWlnaHQgbm90IHNldCB0aGUKLQkJICAgICAgIHNlY3Rpb24gb2YgYSBzeW1ib2wgdG8gYmUgYSBzZWN0aW9uIHRoYXQgaXMKLQkJICAgICAgIGFjdHVhbGx5IGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCSAgICBzZWMyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlYy0+bmFtZSk7Ci0JCSAgICBCRkRfQVNTRVJUIChzZWMyICE9IDApOwotCQkgICAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYzIpOwotCQkgICAgQkZEX0FTU0VSVCAoc2huZHggIT0gLTEpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgc3ltLnN0X3NobmR4ID0gc2huZHg7Ci0JICB9Ci0KLQlpZiAoKGZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCSAgdHlwZSA9IFNUVF9GVU5DOwotCWVsc2UgaWYgKChmbGFncyAmIEJTRl9PQkpFQ1QpICE9IDApCi0JICB0eXBlID0gU1RUX09CSkVDVDsKLQllbHNlCi0JICB0eXBlID0gU1RUX05PVFlQRTsKLQotICAgICAgICAvKiBQcm9jZXNzb3Itc3BlY2lmaWMgdHlwZXMgKi8KLSAgICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKQotICAgICAgICAgIHR5cGUgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKSAoJnR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLCB0eXBlKTsKLQotCWlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotCWVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIHR5cGUpOwotCWVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKCgoZmxhZ3MgJiBCU0ZfV0VBSykKLQkJCQkgICAgICA/IFNUQl9XRUFLCi0JCQkJICAgICAgOiBTVEJfR0xPQkFMKSwKLQkJCQkgICAgIHR5cGUpOwotCWVsc2UgaWYgKGZsYWdzICYgQlNGX0ZJTEUpCi0JICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9GSUxFKTsKLQllbHNlCi0JICB7Ci0JICAgIGludCBiaW5kID0gU1RCX0xPQ0FMOwotCi0JICAgIGlmIChmbGFncyAmIEJTRl9MT0NBTCkKLQkgICAgICBiaW5kID0gU1RCX0xPQ0FMOwotCSAgICBlbHNlIGlmIChmbGFncyAmIEJTRl9XRUFLKQotCSAgICAgIGJpbmQgPSBTVEJfV0VBSzsKLQkgICAgZWxzZSBpZiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCSAgICAgIGJpbmQgPSBTVEJfR0xPQkFMOwotCi0JICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGJpbmQsIHR5cGUpOwotCSAgfQotCi0JaWYgKHR5cGVfcHRyICE9IE5VTEwpCi0JICBzeW0uc3Rfb3RoZXIgPSB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcjsKLQllbHNlCi0JICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0JYmVkLT5zLT5zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sIChQVFIpIG91dGJvdW5kX3N5bXMpOwotCW91dGJvdW5kX3N5bXMgKz0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgICAgfQotCi0gICAgKnN0dHAgPSBzdHQ7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKHN0dCk7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0KLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLgotCi0gICBOb3RlIHRoYXQgd2UgYmFzZSBpdCBvbiB0aGUgY291bnQgcGx1cyAxLCBzaW5jZSB3ZSB3aWxsIG51bGwgdGVybWluYXRlCi0gICB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIHNpemUuICBIb3dldmVyLCB0aGUgRUxGIHN5bWJvbCB0YWJsZQotICAgYWx3YXlzIGhhcyBhIGR1bW15IGVudHJ5IGFzIHN5bWJvbCAjMCwgc28gaXQgZW5kcyB1cCBldmVuLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplOwotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9zeW07Ci0gIHN5bXRhYl9zaXplID0gKHN5bWNvdW50IC0gMSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0KLSAgcmV0dXJuIHN5bXRhYl9zaXplOwotfQotCi1sb25nCi1fYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzeW10YWJfc2l6ZTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2Zfc3ltOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCAtIDEgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIHJldHVybiBzeW10YWJfc2l6ZTsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0vKiBDYW5vbmljYWxpemUgdGhlIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKCEgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9yZWxvY190YWJsZSAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLAotCQkJCQkJCSAgIHN5bWJvbHMsCi0JCQkJCQkJICAgZmFsc2UpKQotICAgIHJldHVybiAtMTsKLQotICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGkrKykKLSAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQotICAqcmVscHRyID0gTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBsb25nIHN5bWNvdW50ID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9zeW1ib2xfdGFibGUKLSAgICAoYWJmZCwgYWxvY2F0aW9uLCBmYWxzZSk7Ci0KLSAgaWYgKHN5bWNvdW50ID49IDApCi0gICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgcmV0dXJuIHN5bWNvdW50OwotfQotCi1sb25nCi1fYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICByZXR1cm4gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9zeW1ib2xfdGFibGUKLSAgICAoYWJmZCwgYWxvY2F0aW9uLCB0cnVlKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzaXplIHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYyByZWxvYyBlbnRyaWVzLiAgQW55Ci0gICBzZWN0aW9uIHRoYXQgd2FzIGFjdHVhbGx5IGluc3RhbGxlZCBpbiB0aGUgQkZELCBhbmQgaGFzIHR5cGUKLSAgIFNIVF9SRUwgb3IgU0hUX1JFTEEsIGFuZCB1c2VzIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgaXMKLSAgIGNvbnNpZGVyZWQgdG8gYmUgYSBkeW5hbWljIHJlbG9jIHNlY3Rpb24uICAqLwotCi1sb25nCi1fYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHJldDsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0ID0gc2l6ZW9mIChhcmVsZW50ICopOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPT0gZWxmX2R5bnN5bXRhYiAoYWJmZCkKLQkmJiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAotCSAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkpCi0gICAgICByZXQgKz0gKChzLT5fcmF3X3NpemUgLyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZW50c2l6ZSkKLQkgICAgICAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQ2Fub25pY2FsaXplIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcy4gIE5vdGUgdGhhdCB3ZSByZXR1cm4KLSAgIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGFzIGEgc2luZ2xlIGJsb2NrLCBhbHRob3VnaCB0aGV5IGFyZQotICAgYWN0dWFsbHkgYXNzb2NpYXRlZCB3aXRoIHBhcnRpY3VsYXIgc2VjdGlvbnM7IHRoZSBpbnRlcmZhY2UsIHdoaWNoCi0gICB3YXMgZGVzaWduZWQgZm9yIFN1bk9TIHN0eWxlIHNoYXJlZCBsaWJyYXJpZXMsIGV4cGVjdHMgdGhhdCB0aGVyZQotICAgaXMgb25seSBvbmUgc2V0IG9mIGR5bmFtaWMgcmVsb2NzLiAgQW55IHNlY3Rpb24gdGhhdCB3YXMgYWN0dWFsbHkKLSAgIGluc3RhbGxlZCBpbiB0aGUgQkZELCBhbmQgaGFzIHR5cGUgU0hUX1JFTCBvciBTSFRfUkVMQSwgYW5kIHVzZXMKLSAgIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgaXMgY29uc2lkZXJlZCB0byBiZSBhIGR5bmFtaWMgcmVsb2MKLSAgIHNlY3Rpb24uICAqLwotCi1sb25nCi1fYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgc3RvcmFnZSwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICoqc3RvcmFnZTsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci17Ci0gIGJvb2xlYW4gKCpzbHVycF9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIGFzZWN0aW9uICpzOwotICBsb25nIHJldDsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzbHVycF9yZWxvY3MgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3JlbG9jX3RhYmxlOwotICByZXQgPSAwOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPT0gZWxmX2R5bnN5bXRhYiAoYWJmZCkKLQkgICYmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTEEpKQotCXsKLQkgIGFyZWxlbnQgKnA7Ci0JICBsb25nIGNvdW50LCBpOwotCi0JICBpZiAoISAoKnNsdXJwX3JlbG9jcykgKGFiZmQsIHMsIHN5bXMsIHRydWUpKQotCSAgICByZXR1cm4gLTE7Ci0JICBjb3VudCA9IHMtPl9yYXdfc2l6ZSAvIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplOwotCSAgcCA9IHMtPnJlbG9jYXRpb247Ci0JICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkgICAgKnN0b3JhZ2UrKyA9IHArKzsKLQkgIHJldCArPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gICpzdG9yYWdlID0gTlVMTDsKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogUmVhZCBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0KLSAgaWYgKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkZWYgKmV2ZXJkZWY7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICppdmVyZGVmOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPQotCSgoRWxmX0ludGVybmFsX1ZlcmRlZiAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBoZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJkZWYpKSk7Ci0gICAgICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzID0gaGRyLT5zaF9pbmZvOwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3JlYWQgKChQVFIpIGNvbnRlbnRzLCAxLCBoZHItPnNoX3NpemUsIGFiZmQpICE9IGhkci0+c2hfc2l6ZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZXZlcmRlZiA9IChFbGZfRXh0ZXJuYWxfVmVyZGVmICopIGNvbnRlbnRzOwotICAgICAgaXZlcmRlZiA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoZHItPnNoX2luZm87IGkrKywgaXZlcmRlZisrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpldmVyZGF1eDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICppdmVyZGF1eDsKLQkgIHVuc2lnbmVkIGludCBqOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiAoYWJmZCwgZXZlcmRlZiwgaXZlcmRlZik7Ci0KLQkgIGl2ZXJkZWYtPnZkX2JmZCA9IGFiZmQ7Ci0KLQkgIGl2ZXJkZWYtPnZkX2F1eHB0ciA9ICgoRWxmX0ludGVybmFsX1ZlcmRhdXggKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChpdmVyZGVmLT52ZF9jbnQKLQkJCQkJICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVyZGF1eCkpKSk7Ci0JICBpZiAoaXZlcmRlZi0+dmRfYXV4cHRyID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBldmVyZGF1eCA9ICgoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikKLQkJICAgICAgKChiZmRfYnl0ZSAqKSBldmVyZGVmICsgaXZlcmRlZi0+dmRfYXV4KSk7Ci0JICBpdmVyZGF1eCA9IGl2ZXJkZWYtPnZkX2F1eHB0cjsKLQkgIGZvciAoaiA9IDA7IGogPCBpdmVyZGVmLT52ZF9jbnQ7IGorKywgaXZlcmRhdXgrKykKLQkgICAgewotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiAoYWJmZCwgZXZlcmRhdXgsIGl2ZXJkYXV4KTsKLQotCSAgICAgIGl2ZXJkYXV4LT52ZGFfbm9kZW5hbWUgPQotCQliZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssCi0JCQkJCQkgaXZlcmRhdXgtPnZkYV9uYW1lKTsKLQkgICAgICBpZiAoaXZlcmRhdXgtPnZkYV9ub2RlbmFtZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmIChqICsgMSA8IGl2ZXJkZWYtPnZkX2NudCkKLQkJaXZlcmRhdXgtPnZkYV9uZXh0cHRyID0gaXZlcmRhdXggKyAxOwotCSAgICAgIGVsc2UKLQkJaXZlcmRhdXgtPnZkYV9uZXh0cHRyID0gTlVMTDsKLQotCSAgICAgIGV2ZXJkYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKQotCQkJICAoKGJmZF9ieXRlICopIGV2ZXJkYXV4ICsgaXZlcmRhdXgtPnZkYV9uZXh0KSk7Ci0JICAgIH0KLQotCSAgaXZlcmRlZi0+dmRfbm9kZW5hbWUgPSBpdmVyZGVmLT52ZF9hdXhwdHItPnZkYV9ub2RlbmFtZTsKLQotCSAgaWYgKGkgKyAxIDwgaGRyLT5zaF9pbmZvKQotCSAgICBpdmVyZGVmLT52ZF9uZXh0ZGVmID0gaXZlcmRlZiArIDE7Ci0JICBlbHNlCi0JICAgIGl2ZXJkZWYtPnZkX25leHRkZWYgPSBOVUxMOwotCi0JICBldmVyZGVmID0gKChFbGZfRXh0ZXJuYWxfVmVyZGVmICopCi0JCSAgICAgKChiZmRfYnl0ZSAqKSBldmVyZGVmICsgaXZlcmRlZi0+dmRfbmV4dCkpOwotCX0KLQotICAgICAgZnJlZSAoY29udGVudHMpOwotICAgICAgY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKmV2ZXJuZWVkOwotICAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKml2ZXJuZWVkOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfaGRyOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPQotCSgoRWxmX0ludGVybmFsX1Zlcm5lZWQgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVybmVlZCkpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnMgPSBoZHItPnNoX2luZm87Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIGhkci0+c2hfc2l6ZSwgYWJmZCkgIT0gaGRyLT5zaF9zaXplKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBldmVybmVlZCA9IChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSBjb250ZW50czsKLSAgICAgIGl2ZXJuZWVkID0gZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmOwotICAgICAgZm9yIChpID0gMDsgaSA8IGhkci0+c2hfaW5mbzsgaSsrLCBpdmVybmVlZCsrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICpldmVybmF1eDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICppdmVybmF1eDsKLQkgIHVuc2lnbmVkIGludCBqOwotCi0JICBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4gKGFiZmQsIGV2ZXJuZWVkLCBpdmVybmVlZCk7Ci0KLQkgIGl2ZXJuZWVkLT52bl9iZmQgPSBhYmZkOwotCi0JICBpdmVybmVlZC0+dm5fZmlsZW5hbWUgPQotCSAgICBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssCi0JCQkJCSAgICAgaXZlcm5lZWQtPnZuX2ZpbGUpOwotCSAgaWYgKGl2ZXJuZWVkLT52bl9maWxlbmFtZSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaXZlcm5lZWQtPnZuX2F1eHB0ciA9Ci0JICAgICgoRWxmX0ludGVybmFsX1Zlcm5hdXggKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCWl2ZXJuZWVkLT52bl9jbnQgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJuYXV4KSkpOwotCi0JICBldmVybmF1eCA9ICgoRWxmX0V4dGVybmFsX1Zlcm5hdXggKikKLQkJICAgICAgKChiZmRfYnl0ZSAqKSBldmVybmVlZCArIGl2ZXJuZWVkLT52bl9hdXgpKTsKLQkgIGl2ZXJuYXV4ID0gaXZlcm5lZWQtPnZuX2F1eHB0cjsKLQkgIGZvciAoaiA9IDA7IGogPCBpdmVybmVlZC0+dm5fY250OyBqKyssIGl2ZXJuYXV4KyspCi0JICAgIHsKLQkgICAgICBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4gKGFiZmQsIGV2ZXJuYXV4LCBpdmVybmF1eCk7Ci0KLQkgICAgICBpdmVybmF1eC0+dm5hX25vZGVuYW1lID0KLQkJYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLAotCQkJCQkJIGl2ZXJuYXV4LT52bmFfbmFtZSk7Ci0JICAgICAgaWYgKGl2ZXJuYXV4LT52bmFfbm9kZW5hbWUgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBpZiAoaiArIDEgPCBpdmVybmVlZC0+dm5fY250KQotCQlpdmVybmF1eC0+dm5hX25leHRwdHIgPSBpdmVybmF1eCArIDE7Ci0JICAgICAgZWxzZQotCQlpdmVybmF1eC0+dm5hX25leHRwdHIgPSBOVUxMOwotCi0JICAgICAgZXZlcm5hdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopCi0JCQkgICgoYmZkX2J5dGUgKikgZXZlcm5hdXggKyBpdmVybmF1eC0+dm5hX25leHQpKTsKLQkgICAgfQotCi0JICBpZiAoaSArIDEgPCBoZHItPnNoX2luZm8pCi0JICAgIGl2ZXJuZWVkLT52bl9uZXh0cmVmID0gaXZlcm5lZWQgKyAxOwotCSAgZWxzZQotCSAgICBpdmVybmVlZC0+dm5fbmV4dHJlZiA9IE5VTEw7Ci0KLQkgIGV2ZXJuZWVkID0gKChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKQotCQkgICAgICAoKGJmZF9ieXRlICopIGV2ZXJuZWVkICsgaXZlcm5lZWQtPnZuX25leHQpKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICAgIGNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotYXN5bWJvbCAqCi1fYmZkX2VsZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBlbGZfc3ltYm9sX3R5cGUgKm5ld3N5bTsKLQotICBuZXdzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmX3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3c3ltKQotICAgIHJldHVybiBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgbmV3c3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gICAgICByZXR1cm4gJm5ld3N5bS0+c3ltYm9sOwotICAgIH0KLX0KLQotdm9pZAotX2JmZF9lbGZfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIHN5bWJvbC4gIE1vc3QgdGFyZ2V0cwotICAgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBpc19sb2NhbF9sYWJlbF9uYW1lIGVudHJ5IHBvaW50LCBidXQgc29tZQotICAgb3ZlcnJpZGUgaXQuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIE5vcm1hbCBsb2NhbCBzeW1ib2xzIHN0YXJ0IHdpdGggYGAuTCcnLiAgKi8KLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEF0IGxlYXN0IHNvbWUgU1ZSNCBjb21waWxlcnMgKGUuZy4sIFVuaXhXYXJlIDIuMSBjYykgZ2VuZXJhdGUKLSAgICAgRFdBUkYgZGVidWdnaW5nIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBgYC4uJycuICAqLwotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogZ2NjIHdpbGwgc29tZXRpbWVzIGdlbmVyYXRlIHN5bWJvbHMgYmVnaW5uaW5nIHdpdGggYGBfLkxfJycgd2hlbgotICAgICBlbWl0dGluZyBEV0FSRiBkZWJ1Z2dpbmcgb3V0cHV0LiAgSSBzdXNwZWN0IHRoaXMgaXMgYWN0dWFsbHkgYQotICAgICBzbWFsbCBidWcgaW4gZ2NjIChpdCBjYWxscyBBU01fT1VUUFVUX0xBQkVMIHdoZW4gaXQgc2hvdWxkIGNhbGwKLSAgICAgQVNNX0dFTkVSQVRFX0lOVEVSTkFMX0xBQkVMLCBhbmQgdGhpcyBjYXVzZXMgdGhlIGxlYWRpbmcKLSAgICAgdW5kZXJzY29yZSB0byBiZSBlbWl0dGVkIG9uIHNvbWUgRUxGIHRhcmdldHMpLiAgRm9yIGVhc2Ugb2YgdXNlLAotICAgICB3ZSB0cmVhdCBzdWNoIHN5bWJvbHMgYXMgbG9jYWwuICAqLwotICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnTCcgJiYgbmFtZVszXSA9PSAnXycpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1hbGVudCAqCi1fYmZkX2VsZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICAvKiBJZiB0aGlzIGlzbid0IHRoZSByaWdodCBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgYmFja2VuZCwgYW5kIHRoaXMKLSAgICAgaXNuJ3QgdGhlIGdlbmVyaWMgYmFja2VuZCwgZmFpbC4gICovCi0gIGlmIChhcmNoICE9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+YXJjaAotICAgICAgJiYgYXJjaCAhPSBiZmRfYXJjaF91bmtub3duCi0gICAgICAmJiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24gYW5kIG9mZnNldCwgZm9yIGVycm9yCi0gICByZXBvcnRpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCSAgICBzZWN0aW9uLAotCQkJICAgIHN5bWJvbHMsCi0JCQkgICAgb2Zmc2V0LAotCQkJICAgIGZpbGVuYW1lX3B0ciwKLQkJCSAgICBmdW5jdGlvbm5hbWVfcHRyLAotCQkJICAgIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBib29sZWFuIGZvdW5kOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgYXN5bWJvbCAqZnVuYzsKLSAgYmZkX3ZtYSBsb3dfZnVuYzsKLSAgYXN5bWJvbCAqKnA7Ci0KLSAgaWYgKF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIAotCQkJCSAgICAgbGluZV9wdHIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIsIDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsCi0JCQkJCSAgICAgJmZvdW5kLCBmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIsCi0JCQkJCSAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKHN5bWJvbHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBOVUxMOwotICBmdW5jID0gTlVMTDsKLSAgbG93X2Z1bmMgPSAwOwotCi0gIGZvciAocCA9IHN5bWJvbHM7ICpwICE9IE5VTEw7IHArKykKLSAgICB7Ci0gICAgICBlbGZfc3ltYm9sX3R5cGUgKnE7Ci0KLSAgICAgIHEgPSAoZWxmX3N5bWJvbF90eXBlICopICpwOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uICgmcS0+c3ltYm9sKSAhPSBzZWN0aW9uKQotCWNvbnRpbnVlOwotCi0gICAgICBzd2l0Y2ggKEVMRl9TVF9UWVBFIChxLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfRklMRToKLQkgIGZpbGVuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoJnEtPnN5bWJvbCk7Ci0JICBicmVhazsKLQljYXNlIFNUVF9OT1RZUEU6Ci0JY2FzZSBTVFRfRlVOQzoKLQkgIGlmIChxLT5zeW1ib2wuc2VjdGlvbiA9PSBzZWN0aW9uCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlID49IGxvd19mdW5jCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgIGZ1bmMgPSAoYXN5bWJvbCAqKSBxOwotCSAgICAgIGxvd19mdW5jID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpmaWxlbmFtZV9wdHIgPSBmaWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBiZmRfYXN5bWJvbF9uYW1lIChmdW5jKTsKLSAgKmxpbmVfcHRyID0gMDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludAotX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gIGludCByZXQ7Ci0KLSAgcmV0ID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZWhkcjsKLSAgaWYgKCEgcmVsb2MpCi0gICAgcmV0ICs9IGdldF9wcm9ncmFtX2hlYWRlcl9zaXplIChhYmZkKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bgotICAgICAgJiYgISBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMKLSAgICAgIChhYmZkLCAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGhkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHI7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCArIG9mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQKLV9iZmRfZWxmX25vX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLSNpZiAwCi12b2lkCi1fYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLS8qIFRyeSB0byBjb252ZXJ0IGEgbm9uLUVMRiByZWxvYyBpbnRvIGFuIEVMRiBvbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgYXJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmFyZWxvYzsKLXsKLSAgLyogQ2hlY2sgd2hldGhlciB3ZSByZWFsbHkgaGF2ZSBhbiBFTEYgaG93dG8uICovCi0KLSAgaWYgKCgqYXJlbG9jLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gICAgICAvKiBBbGllbiByZWxvYzogVHJ5IHRvIGRldGVybWluZSBpdHMgdHlwZSB0byByZXBsYWNlIGl0IHdpdGggYW4KLQkgZXF1aXZhbGVudCBFTEYgcmVsb2MuICovCi0KLSAgICAgIGlmIChhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQl7Ci0JICBzd2l0Y2ggKGFyZWxvYy0+aG93dG8tPmJpdHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA4OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzEyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18yNF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDY0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfNjRfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0KLQkgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKTsKLQotCSAgaWYgKGFyZWxvYy0+aG93dG8tPnBjcmVsX29mZnNldCAhPSBob3d0by0+cGNyZWxfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JCWFyZWxvYy0+YWRkZW5kICs9IGFyZWxvYy0+YWRkcmVzczsKLQkgICAgICBlbHNlCi0JCWFyZWxvYy0+YWRkZW5kIC09IGFyZWxvYy0+YWRkcmVzczsgLyogYWRkZW5kIGlzIHVuc2lnbmVkISEgKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGFyZWxvYy0+aG93dG8tPmJpdHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA4OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxNDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjY6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18yNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDY0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0KLQkgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKTsKLQl9Ci0KLSAgICAgIGlmIChob3d0bykKLQlhcmVsb2MtPmhvd3RvID0gaG93dG87Ci0gICAgICBlbHNlCi0JZ290byBmYWlsOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGZhaWw6Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgIChfKCIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0gICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBhcmVsb2MtPmhvd3RvLT5uYW1lKTsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChlbGZfc2hzdHJ0YWIgKGFiZmQpICE9IE5VTEwpCi0JX2JmZF9zdHJpbmd0YWJfZnJlZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpOwotfQotCi0vKiBGb3IgUmVsIHRhcmdldHMsIHdlIGVuY29kZSBtZWFuaW5nZnVsIGRhdGEgZm9yIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgIGluIHRoZSByZWxvY2F0aW9uJ3Mgb2Zmc2V0LiAgVGh1cyB3ZSBjYW5ub3QgYWxsb3cgYW55IHNvcnQgb2Ygc2FuaXR5Ci0gICByYW5nZS1jaGVja2luZyB0byBpbnRlcmZlcmUuICBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gZG8gaW4gcHJvY2Vzc2luZwotICAgdGhpcyByZWxvYy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiAoYWJmZCwgcmUsIHN5bWJvbCwgZGF0YSwgaXMsIG9iZmQsIGVycm1zZykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlzOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qIEVsZiBjb3JlIGZpbGUgc3VwcG9ydC4gIE11Y2ggb2YgdGhpcyBvbmx5IHdvcmtzIG9uIG5hdGl2ZQotICAgdG9vbGNoYWlucywgc2luY2Ugd2UgcmVseSBvbiBrbm93aW5nIHRoZQotICAgbWFjaGluZS1kZXBlbmRlbnQgcHJvY2ZzIHN0cnVjdHVyZSBpbiBvcmRlciB0byBwaWNrCi0gICBvdXQgZGV0YWlscyBhYm91dCB0aGUgY29yZWZpbGUuICovCi0KLSNpZmRlZiBIQVZFX1NZU19QUk9DRlNfSAotIyBpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci0jZW5kaWYKLQotCi0vKiBEZWZpbmUgb2Zmc2V0b2YgZm9yIHRob3NlIHN5c3RlbXMgd2hpY2ggbGFjayBpdC4gKi8KLQotI2lmbmRlZiBvZmZzZXRvZgotIyBkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQotI2VuZGlmCi0KLQotLyogRklYTUU6IHRoaXMgaXMga2luZGEgd3JvbmcsIGJ1dCBpdCdzIHdoYXQgZ2RiIHdhbnRzLiAqLwotCi1zdGF0aWMgaW50Ci1lbGZjb3JlX21ha2VfcGlkIChhYmZkKQotICAgICBiZmQqIGFiZmQ7Ci17Ci0gIHJldHVybiAoKGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfbHdwaWQgPDwgMTYpCi0JICArIChlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3BpZCkpOwotfQotCi0KLS8qIElmIHRoZXJlIGlzbid0IGEgc2VjdGlvbiBjYWxsZWQgTkFNRSwgbWFrZSBvbmUsIHVzaW5nCi0gICBkYXRhIGZyb20gU0VDVC4gIE5vdGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhCi0gICByZWZlcmVuY2UgdG8gTkFNRSwgc28geW91IHNob3VsZG4ndCBkZWFsbG9jYXRlIG9yCi0gICBvdmVyd3JpdGUgaXQuICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgbmFtZSwgc2VjdCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBuYW1lOwotICAgICBhc2VjdGlvbiogc2VjdDsKLXsKLSAgYXNlY3Rpb24qIHNlY3QyOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0MiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdDIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc2VjdDItPl9yYXdfc2l6ZSA9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgc2VjdDItPmZpbGVwb3MgPSBzZWN0LT5maWxlcG9zOwotICBzZWN0Mi0+ZmxhZ3MgPSBzZWN0LT5mbGFnczsKLSAgc2VjdDItPmFsaWdubWVudF9wb3dlciA9IHNlY3QtPmFsaWdubWVudF9wb3dlcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogcHJzdGF0dXNfdCBleGlzdHMgb246Ci0gICAgIHNvbGFyaXMgMi5bNTY3XQotICAgICBsaW51eCAyLlswMV0gKyBnbGliYwotICAgICB1bml4d2FyZSA0LjIKLSovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3Byc3RhdHVzIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBwcnN0YXR1c190IHByc3RhdDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciogbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKHByc3RhdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmcHJzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChwcnN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbCA9IHByc3RhdC5wcl9jdXJzaWc7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHJzdGF0LnByX3BpZDsKLQotICAvKiBwcl93aG8gZXhpc3RzIG9uOgotICAgICAgIHNvbGFyaXMgMi5bNTY3XQotICAgICAgIHVuaXh3YXJlIDQuMgotICAgICBwcl93aG8gZG9lc24ndCBleGlzdCBvbjoKLSAgICAgICBsaW51eCAyLlswMV0KLSAgKi8KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1RfUFJfV0hPKQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkID0gcHJzdGF0LnByX3dobzsKLSNlbmRpZgotCi0gIC8qIE1ha2UgYSAiLnJlZy85OTkiIHNlY3Rpb24uICovCi0KLSAgc3ByaW50ZiAoYnVmLCAiLnJlZy8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChwcnN0YXQucHJfcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAocHJzdGF0dXNfdCwgcHJfcmVnKTsKLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZyIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpICovCi0KLQotLyogVGhlcmUgaXNuJ3QgYSBjb25zaXN0ZW50IHByZnByZWdzZXRfdCBhY3Jvc3MgcGxhdGZvcm1zLAotICAgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8gcGljayB0aGlzCi0gICBkYXRhIHN0cnVjdHVyZSBhcGFydC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wcmZwcmVnIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyKiBuYW1lOwotICBhc2VjdGlvbiogc2VjdDsKLQotICAvKiBNYWtlIGEgIi5yZWcyLzk5OSIgc2VjdGlvbi4gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnMi8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjdC0+X3Jhd19zaXplID0gbm90ZS0+ZGVzY3N6OwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvczsKLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZzIiLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpCi0jIGRlZmluZSBlbGZjb3JlX3BzaW5mb190IHBycHNpbmZvX3QKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkKLSMgZGVmaW5lIGVsZmNvcmVfcHNpbmZvX3QgcHNpbmZvX3QKLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0KLS8qIHJldHVybiBhIG1hbGxvYydlZCBjb3B5IG9mIGEgc3RyaW5nIGF0IFNUQVJUIHdoaWNoIGlzIGF0Ci0gICBtb3N0IE1BWCBieXRlcyBsb25nLCBwb3NzaWJseSB3aXRob3V0IGEgdGVybWluYXRpbmcgJ1wwJy4KLSAgIHRoZSBjb3B5IHdpbGwgYWx3YXlzIGhhdmUgYSB0ZXJtaW5hdGluZyAnXDAnLiAqLwotCi1zdGF0aWMgY2hhcioKLWVsZmNvcmVfc3RybmR1cCAoYWJmZCwgc3RhcnQsIG1heCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBzdGFydDsKLSAgICAgaW50IG1heDsKLXsKLSAgY2hhciogZHVwOwotICBjaGFyKiBlbmQgPSBtZW1jaHIgKHN0YXJ0LCAnXDAnLCBtYXgpOwotICBpbnQgbGVuOwotCi0gIGlmIChlbmQgPT0gTlVMTCkKLSAgICBsZW4gPSBtYXg7Ci0gIGVsc2UKLSAgICBsZW4gPSBlbmQgLSBzdGFydDsKLQotICBkdXAgPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOwotICBpZiAoZHVwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbWVtY3B5IChkdXAsIHN0YXJ0LCBsZW4pOwotICBkdXBbbGVuXSA9ICdcMCc7Ci0KLSAgcmV0dXJuIGR1cDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wc2luZm8gKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIGVsZmNvcmVfcHNpbmZvX3QgcHNpbmZvOwotCi0gIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChlbGZjb3JlX3BzaW5mb190KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCZwc2luZm8sIG5vdGUtPmRlc2NkYXRhLCBub3RlLT5kZXNjc3opOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcHJvZ3JhbQotICAgID0gZWxmY29yZV9zdHJuZHVwIChhYmZkLCBwc2luZm8ucHJfZm5hbWUsIHNpemVvZiAocHNpbmZvLnByX2ZuYW1lKSk7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9jb21tYW5kCi0gICAgPSBlbGZjb3JlX3N0cm5kdXAgKGFiZmQsIHBzaW5mby5wcl9wc2FyZ3MsIHNpemVvZiAocHNpbmZvLnByX3BzYXJncykpOwotCi0gIC8qIE5vdGUgdGhhdCBmb3Igc29tZSByZWFzb24sIGEgc3B1cmlvdXMgc3BhY2UgaXMgdGFja2VkCi0gICAgIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJncyBpbiBzb21lIChhdCBsZWFzdCBvbmUgYW55d2F5KQotICAgICBpbXBsZW1lbnRhdGlvbnMsIHNvIHN0cmlwIGl0IG9mZiBpZiBpdCBleGlzdHMuICovCi0KLSAgewotICAgIGNoYXIqIGNvbW1hbmQgPSBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQ7Ci0gICAgaW50IG4gPSBzdHJsZW4gKGNvbW1hbmQpOwotCi0gICAgaWYgKDAgPCBuICYmIGNvbW1hbmRbbiAtIDFdID09ICcgJykKLSAgICAgIGNvbW1hbmRbbiAtIDFdID0gJ1wwJzsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkgfHwgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkgKi8KLQotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3BzdGF0dXMgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHBzdGF0dXNfdCBwc3RhdDsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAocHN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJnBzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChwc3RhdCkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHN0YXQucHJfcGlkOwotCi0gIC8qIENvdWxkIGdyYWIgc29tZSBtb3JlIGRldGFpbHMgZnJvbSB0aGUgInJlcHJlc2VudGF0aXZlIgotICAgICBsd3BzdGF0dXNfdCBpbiBwc3RhdC5wcl9sd3AsIGJ1dCB3ZSdsbCBjYXRjaCBpdCBhbGwgaW4gYW4KLSAgICAgTlRfTFdQU1RBVFVTIG5vdGUsIHByZXN1bWFibHkuICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpICovCi0KLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX2x3cHN0YXR1cyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgbHdwc3RhdHVzX3QgbHdwc3RhdDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciogbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKGx3cHN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJmx3cHN0YXQsIG5vdGUtPmRlc2NkYXRhLCBzaXplb2YgKGx3cHN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkID0gbHdwc3RhdC5wcl9sd3BpZDsKLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWwgPSBsd3BzdGF0LnByX2N1cnNpZzsKLQotICAvKiBNYWtlIGEgIi5yZWcvOTk5IiBzZWN0aW9uLiAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIi5yZWcvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5IChuYW1lLCBidWYpOwotCi0gIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKHNlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9jb250ZXh0LnVjX21jb250ZXh0LmdyZWdzKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MKLSAgICArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfY29udGV4dC51Y19tY29udGV4dC5ncmVncyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX3JlZyk7Ci0jZW5kaWYKLQotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCFlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWciLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTWFrZSBhICIucmVnMi85OTkiIHNlY3Rpb24gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnMi8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVCkKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX2NvbnRleHQudWNfbWNvbnRleHQuZnByZWdzKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MKLSAgICArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfY29udGV4dC51Y19tY29udGV4dC5mcHJlZ3MpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0ZQUkVHKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfZnByZWcpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfZnByZWcpOwotI2VuZGlmCi0KLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnMiIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UKSAqLwotCi0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19ub3RlIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBzd2l0Y2ggKG5vdGUtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVCkKLSAgICBjYXNlIE5UX1BSU1RBVFVTOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wcnN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfUFNUQVRVU19UKQotICAgIGNhc2UgTlRfUFNUQVRVUzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpCi0gICAgY2FzZSBOVF9MV1BTVEFUVVM6Ci0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX2x3cHN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotICAgIGNhc2UgTlRfRlBSRUdTRVQ6CQkvKiBGSVhNRTogcmVuYW1lIHRvIE5UX1BSRlBSRUcgKi8KLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHJmcHJlZyAoYWJmZCwgbm90ZSk7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0gICAgY2FzZSBOVF9QUlBTSU5GTzoKLSAgICBjYXNlIE5UX1BTSU5GTzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHNpbmZvIChhYmZkLCBub3RlKTsKLSNlbmRpZgotICAgIH0KLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9yZWFkX25vdGVzIChhYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgc2l6ZTsKLXsKLSAgY2hhciogYnVmOwotICBjaGFyKiBwOwotCi0gIGlmIChzaXplIDw9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYnVmID0gYmZkX21hbGxvYyAoKHNpemVfdCkgc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9yZWFkIChidWYsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgIGVycm9yOgotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcCA9IGJ1ZjsKLSAgd2hpbGUgKHAgPCBidWYgKyBzaXplKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBiYWQgYWxpZ25tZW50IGFzc3VtcHRpb24uICovCi0gICAgICBFbGZfRXh0ZXJuYWxfTm90ZSogeG5wID0gKEVsZl9FeHRlcm5hbF9Ob3RlKikgcDsKLSAgICAgIEVsZl9JbnRlcm5hbF9Ob3RlIGluOwotCi0gICAgICBpbi50eXBlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT50eXBlKTsKLQotICAgICAgaW4ubmFtZXN6ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT5uYW1lc3opOwotICAgICAgaW4ubmFtZWRhdGEgPSB4bnAtPm5hbWU7Ci0KLSAgICAgIGluLmRlc2NzeiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhucC0+ZGVzY3N6KTsKLSAgICAgIGluLmRlc2NkYXRhID0gaW4ubmFtZWRhdGEgKyBCRkRfQUxJR04gKGluLm5hbWVzeiwgNCk7Ci0gICAgICBpbi5kZXNjcG9zID0gb2Zmc2V0ICsgKGluLmRlc2NkYXRhIC0gYnVmKTsKLQotICAgICAgaWYgKCEgZWxmY29yZV9ncm9rX25vdGUgKGFiZmQsICZpbikpCi0JZ290byBlcnJvcjsKLQotICAgICAgcCA9IGluLmRlc2NkYXRhICsgQkZEX0FMSUdOIChpbi5kZXNjc3osIDQpOwotICAgIH0KLQotICBmcmVlIChidWYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLWJvb2xlYW4KLV9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgcGhkciwgc2VjX251bSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciogcGhkcjsKLSAgICAgaW50IHNlY19udW07Ci17Ci0gIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgcGhkciwgc2VjX251bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTk9URQotICAgICAgJiYgISBlbGZjb3JlX3JlYWRfbm90ZXMgKGFiZmQsIHBoZHItPnBfb2Zmc2V0LCBwaGRyLT5wX2ZpbGVzeikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItYXJjLmMgYi9iZmQvZWxmMzItYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTBhMjQuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qIEFSQy1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgYXJjX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhcmNfZWxmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBhcmNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogVHJ5IHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2Ygc3BhY2Ugb2NjdXBpZWQgYnkgcmVsb2NhdGlvbiB0YWJsZXMKLSAgIG9uIHRoZSBST00gKG5vdCB0aGF0IHRoZSBST00gd29uJ3QgYmUgc3dhbXBlZCBieSBvdGhlciBFTEYgb3ZlcmhlYWQpLiAgKi8KLSNkZWZpbmUgVVNFX1JFTAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfYXJjX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0FSQ19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfQVJDXzMyLAkJLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjYgYml0IGFic29sdXRlIGJyYW5jaCwgcmlnaHQgc2hpZnRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfQVJDX0IyNiwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfQjI2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyMiBiaXQgYnJhbmNoOyBiaXRzIDIxLTIgYXJlIHN0b3JlZCBpbiBiaXRzIDI2LTcuICAqLwotICBIT1dUTyAoUl9BUkNfQjIyX1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNywJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJDX0IyMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZmZmODAsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmZmZjgwLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gQVJDIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBhcmNfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyY19yZWxvY19tYXAgYXJjX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9BUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0FSQ19CMjYsIFJfQVJDX0IyNiB9LAotICB7IEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMLCBSX0FSQ19CMjJfUENSRUwgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAoYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBhcmNfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX2FyY19ob3d0b190YWJsZVthcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBBUkMgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9BUkNfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfYXJjX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGFuIEFSQyBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hcmNfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBtYWNoOwotICB1bnNpZ25lZCBsb25nIGFyY2ggPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FSQ19NQUNIOwotCi0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBFX0FSQ19NQUNIX0JBU0U6Ci0gICAgICBtYWNoID0gYmZkX21hY2hfYXJjX2Jhc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVW5rbm93biBjcHUgdHlwZS4gID8/PyBXaGF0IHRvIGRvPyAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FyYywgbWFjaCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGFuIEFSQyBFTEYgb2JqZWN0IGZpbGUuCi0gICBUaGlzIGdldHMgdGhlIEFSQyBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyOwotewotICBpbnQgbWFjaDsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgc3dpdGNoIChtYWNoID0gYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9hcmNfYmFzZToKLSAgICAgIHZhbCA9IEVfQVJDX01BQ0hfQkFTRTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9BUkNfTUFDSDsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9saXR0bGVhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbGl0dGxlYXJjIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2JpZ2FyY192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItYmlnYXJjIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfYXJjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0FSQwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCTAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWFyY19pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAlhcmNfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCWFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItYXJtLmggYi9iZmQvZWxmMzItYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMmVlYTcuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWFybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE1NSArMCwwIEBACi0vKiAzMi1iaXQgRUxGIHN1cHBvcnQgZm9yIEFSTQotICAgQ29weXJpZ2h0IDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGluc24zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGluc24xNjsKLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGludCBlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlCi0gIFBBUkFNUyAoKCBFbGZfSW50ZXJuYWxfU3ltICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgY2hhciwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi1zdGF0aWMgaW5zbjMyIGluc2VydF90aHVtYl9icmFuY2gKLSAgUEFSQU1TICgoaW5zbjMyLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZmluZF90aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZmluZF9hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBDT05TVCBjaGFyICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCByZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIGVsZjMyX2FybV9wb3N0X3Byb2Nlc3NfaGVhZGVycwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBUaGUgbGlua2VyIHNjcmlwdCBrbm93cyB0aGUgc2VjdGlvbiBuYW1lcyBmb3IgcGxhY2VtZW50LgotICAgVGhlIGVudHJ5X25hbWVzIGFyZSB1c2VkIHRvIGRvIHNpbXBsZSBuYW1lIG1hbmdsaW5nIG9uIHRoZSBzdHVicy4KLSAgIEdpdmVuIGEgZnVuY3Rpb24gbmFtZSwgYW5kIGl0cyB0eXBlLCB0aGUgc3R1YiBjYW4gYmUgZm91bmQuIFRoZQotICAgbmFtZSBjYW4gYmUgY2hhbmdlZC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhlICVzIGJlIHByZXNlbnQuCi0gKi8KLQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggYWJmZCApICAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfN3QiCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX3RodW1iIgotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfNyIKLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fYXJtIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgICAgICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2Ci0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UKLSAgIHRoaXMuICBJdCBpcyBzZXQgdXAgc28gdGhhdCBhbnkgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBpcwotICAgY2FsbGVkIGJlZm9yZSB0aGUgcmVsb2NhdGlvbiBoYXMgYmVlbiBzZXQgdXAgY2FsbGVzIHRoZSBkeW5hbWljCi0gICBsaW5rZXIgZmlyc3QgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHQwX2VudHJ5IFtQTFRfRU5UUllfU0laRV0gPQotewotICAweDA0LCAweGUwLCAweDJkLCAweGU1LAkvKiBzdHIgICBsciwgW3NwLCAjLTRdISAgICAgKi8KLSAgMHgxMCwgMHhlMCwgMHg5ZiwgMHhlNSwJLyogbGRyICAgbHIsIFtwYywgIzE2XSAgICAgICovCi0gIDB4MGUsIDB4ZTAsIDB4OGYsIDB4ZTAsCS8qIGFkciAgIGxyLCBwYywgbHIgICAgICAgICAqLwotICAweDA4LCAweGYwLCAweGJlLCAweGU1CS8qIGxkciAgIHBjLCBbbHIsICMtNF0gICAgICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlCi0gICB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHRfZW50cnkgW1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MDQsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgIGlwLCBbcGMsICM0XSAgICAgICAqLwotICAweDBjLCAweGMwLCAweDhmLCAweGUwLAkvKiBhZGQgICBpcCwgcGMsIGlwICAgICAgICAgKi8KLSAgMHgwMCwgMHhmMCwgMHg5YywgMHhlNSwJLyogbGRyICAgcGMsIFtpcF0gICAgICAgICAgICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAgICAgIC8qIG9mZnNldCB0byBzeW1ib2wgaW4gZ290ICAqLwotfTsKLQotCi0vKiBUaGUgQVJNIGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKLSAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBpdCBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbgotICAgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZAotICAgZXh0ZW5kaW5nIHRoZSByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlCi0gICBoYXZlIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQKLXsKLSAgLyogTmV4dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogbmV4dDsKLSAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCi0gIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgLyogTnVtYmVyIG9mIHJlbG9jcyBjb3BpZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLX07Ci0KLS8qIEFybSBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLwotCi1zdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHBjcmVsX3JlbG9jc19jb3BpZWQ7Ci19OwotCi0vKiBEZWNsYXJlIHRoaXMgbm93IHRoYXQgdGhlIGFib3ZlIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIFRyYXZlcnNlIGFuIGFybSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBBUk0gZWxmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgZWxmMzJfYXJtX2hhc2hfdGFibGUoaW5mbykgXAotICAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopICgoaW5mbyktPmhhc2gpKQotCi0vKiBBUk0gRUxGIGxpbmtlciBoYXNoIHRhYmxlICovCi1zdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZQotICB7Ci0gICAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gICAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBUaHVtYi10by1BUk0gZ2x1ZS4gICovCi0gICAgbG9uZyBpbnQgdGh1bWJfZ2x1ZV9zaXplOwotCi0gICAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIEFSTS10by1UaHVtYiBnbHVlLiAgKi8KLSAgICBsb25nIGludCBhcm1fZ2x1ZV9zaXplOwotCi0gICAgLyogQW4gYXJiaXRhcnkgaW5wdXQgQkZEIGNob3NlbiB0byBob2xkIHRoZSBnbHVlIHNlY3Rpb25zLiAgKi8KLSAgICBiZmQgKiBiZmRfb2ZfZ2x1ZV9vd25lcjsKLQotICAgIC8qIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIga25vd2xlZGdlIG9mIHRoZSBBUk0ncyBwaXBlbGluZQotICAgICAgIGxlbmd0aCBzaG91bGQgYmUgYXBwbGllZCBieSB0aGUgbGlua2VyLiAgKi8KLSAgICBpbnQgbm9fcGlwZWxpbmVfa25vd2xlZGdlOwotICB9OwotCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhbiBBUk0gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9hcm1fbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiBlbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICogdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICogcmV0ID0KLSAgICAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0LT5wY3JlbF9yZWxvY3NfY29waWVkID0gTlVMTDsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBBUk0gZWxmIGxpbmtlciBoYXNoIHRhYmxlICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXQtPnRodW1iX2dsdWVfc2l6ZSA9IDA7Ci0gIHJldC0+YXJtX2dsdWVfc2l6ZSA9IDA7Ci0gIHJldC0+YmZkX29mX2dsdWVfb3duZXIgPSBOVUxMOwotICByZXQtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSA9IDA7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoKLWZpbmRfdGh1bWJfZ2x1ZSAobGlua19pbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpoYXNoX3RhYmxlOwotCi0gIC8qIFdlIG5lZWQgYSBwb2ludGVyIHRvIHRoZSBhcm1lbGYgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0gICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBoYXNoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihoYXNoX3RhYmxlKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKGhhc2ggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIiVzOiB1bmFibGUgdG8gZmluZCBUSFVNQiBnbHVlICclcycgZm9yIGAlcyciKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX2FybV9nbHVlIChsaW5rX2luZm8sIG5hbWUsIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKnRtcF9uYW1lOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBXZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgZWxmYXJtIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLwotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLSAgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIiVzOiB1bmFibGUgdG8gZmluZCBBUk0gZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLS8qCi0gICBBUk0tPlRodW1iIGdsdWU6Ci0KLSAgIC5hcm0KLSAgIF9fZnVuY19mcm9tX2FybToKLSAgIGxkciByMTIsIF9fZnVuY19hZGRyCi0gICBieCAgcjEyCi0gICBfX2Z1bmNfYWRkcjoKLSAgIC53b3JkIGZ1bmMgICAgQCBiZWhhdmUgYXMgaWYgeW91IHNhdyBhIEFSTV8zMiByZWxvYwotICovCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0laRSAxMgotc3RhdGljIGNvbnN0IGluc24zMiBhMnQxX2xkcl9pbnNuID0gMHhlNTlmYzAwMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0Ml9ieF9yMTJfaW5zbiA9IDB4ZTEyZmZmMWM7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDNfZnVuY19hZGRyX2luc24gPSAweDAwMDAwMDAxOwotCi0vKgotICAgVGh1bWItPkFSTTogICAgICAgICAgICAgICAgICAgICAgICAgIFRodW1iLT4obm9uLWludGVyd29ya2luZyBhd2FyZSkgQVJNCi0KLSAgIC50aHVtYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGh1bWIKLSAgIC5hbGlnbiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWxpZ24gMgotICAgX19mdW5jX2Zyb21fdGh1bWI6ICAgICAgICAgICAgICBfX2Z1bmNfZnJvbV90aHVtYjoKLSAgIGJ4IHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIHtyNiwgbHJ9Ci0gICBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRyICByNiwgX19mdW5jX2FkZHIKLSAgIC5hcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiAgbHIsIHBjCi0gICBfX2Z1bmNfY2hhbmdlX3RvX2FybTogICAgICAgICAgICAgICAgICAgICAgICBieCAgIHI2Ci0gICBiIGZ1bmMgICAgICAgICAgICAgICAgICAgICAgIC5hcm0KLSAgIF9fZnVuY19iYWNrX3RvX3RodW1iOgotICAgbGRtaWEgcjEzISB7cjYsIGxyfQotICAgYnggICAgbHIKLSAgIF9fZnVuY19hZGRyOgotICAgLndvcmQgICAgICAgIGZ1bmMKLSAqLwotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NJWkUgOAotc3RhdGljIGNvbnN0IGluc24xNiB0MmExX2J4X3BjX2luc24gPSAweDQ3Nzg7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTJfbm9vcF9pbnNuID0gMHg0NmMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmEzX2JfaW5zbiA9IDB4ZWEwMDAwMDA7Ci0KLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9wdXNoX2luc24gPSAweGI1NDA7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTJfbGRyX2luc24gPSAweDRlMDM7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTNfbW92X2luc24gPSAweDQ2ZmU7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTRfYnhfaW5zbiA9IDB4NDczMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNV9wb3BfaW5zbiA9IDB4ZThiZDQwNDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTZfYnhfaW5zbiA9IDB4ZTEyZmZmMWU7Ci0KLWJvb2xlYW4KLWJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGFzZWN0aW9uICogczsKLSAgYmZkX2J5dGUgKiBmb287Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGdsb2JhbHMtPmFybV9nbHVlX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICBpZiAoZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplOwotICAgICAgcy0+Y29udGVudHMgPSBmb287Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChsaW5rX2luZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogbGlua19pbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiBzOwotICBjaGFyICogdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLSAgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoZ2xvYmFscyktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47CQkJLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIC8qIFRoZSBvbmx5IHRyaWNrIGhlcmUgaXMgdXNpbmcgaGFzaF90YWJsZS0+YXJtX2dsdWVfc2l6ZSBhcyB0aGUgdmFsdWUuIEV2ZW4KLSAgICAgdGhvdWdoIHRoZSBzZWN0aW9uIGlzbid0IGFsbG9jYXRlZCB5ZXQsIHRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBiZSBwdXR0aW5nCi0gICAgIGl0LiAgKi8KLQotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkJICAgIEJTRl9HTE9CQUwsCi0JCQkJICAgIHMsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKyAxLAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArPSBBUk0yVEhVTUJfR0xVRV9TSVpFOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSAobGlua19pbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0gIGNoYXIgYmluZDsKLQotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoaGFzaF90YWJsZSAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihoYXNoX3RhYmxlKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsJCQkvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KLSAgICB9Ci0KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGxpbmtfaW5mbywgaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJICAgICBCU0ZfR0xPQkFMLCBzLCBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKyAxLAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICAvKiBJZiB3ZSBtYXJrIGl0ICd0aHVtYicsIHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBkbyBhIGJldHRlciBqb2IuICAqLwotICBiaW5kID0gRUxGX1NUX0JJTkQgKG15aC0+dHlwZSk7Ci0gIG15aC0+dHlwZSA9IEVMRl9TVF9JTkZPIChiaW5kLCBTVFRfQVJNX1RGVU5DKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgLyogQWxsb2NhdGUgYW5vdGhlciBzeW1ib2wgdG8gbWFyayB3aGVyZSB3ZSBzd2l0Y2ggdG8gYXJtIG1vZGUuICAqLwotCi0jZGVmaW5lIENIQU5HRV9UT19BUk0gIl9fJXNfY2hhbmdlX3RvX2FybSIKLSNkZWZpbmUgQkFDS19GUk9NX0FSTSAiX18lc19iYWNrX2Zyb21fYXJtIgotCi0gIHRtcF9uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQ0hBTkdFX1RPX0FSTSkgKyAxKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIENIQU5HRV9UT19BUk0sIG5hbWUpOwotCi0gIG15aCA9IE5VTEw7Ci0KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGxpbmtfaW5mbywgaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJICAgICAgQlNGX0xPQ0FMLCBzLCBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKyA0LAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgaGFzaF90YWJsZS0+dGh1bWJfZ2x1ZV9zaXplICs9IFRIVU1CMkFSTV9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBTZWxlY3QgYSBCRkQgdG8gYmUgdXNlZCB0byBob2xkIHRoZSBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBnbHVlIGNvZGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiBsZC9lbXVsdGVtcGwvCi0gICB7YXJtZWxmL3BlfS5lbSAgKi8KLWJvb2xlYW4KLWJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIGdldHRpbmcgYSBiZmQgdG8gaG9sZCB0aGUgZ2x1ZS4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0KLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLQotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTYXZlIHRoZSBiZmQgZm9yIGxhdGVyIHVzZS4gICovCi0gIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChhYmZkLCBsaW5rX2luZm8sIG5vX3BpcGVsaW5lX2tub3dsZWRnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBpbnQgbm9fcGlwZWxpbmVfa25vd2xlZGdlOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgdG8gY29uc3RydWN0IGFueSBnbHVlLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiAgV2UgaGF2ZSBhIGhvb2sKLSAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICAqLwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UgPSBub19waXBlbGluZV9rbm93bGVkZ2U7Ci0KLSAgLyogUnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgZ2x1ZSB2ZWN0b3JzLiAgKi8KLSAgc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAoOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIC8qIExvYWQgdGhlIHJlbG9jcy4gICovCi0KLSAgICAgIGlyZWwgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsCi0JCQkJCShFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotCi0gICAgICBCRkRfQVNTRVJUIChpcmVsICE9IDApOwotCi0gICAgICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQl7Ci0JICBsb25nIHJfdHlwZTsKLQkgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKLQkgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKLQkgIHJfaW5kZXggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKTsKLQotCSAgLyogVGhlc2UgYXJlIHRoZSBvbmx5IHJlbG9jYXRpb24gdHlwZXMgd2UgY2FyZSBhYm91dCAqLwotCSAgaWYgKCAgIHJfdHlwZSAhPSBSX0FSTV9QQzI0Ci0JICAgICAgJiYgcl90eXBlICE9IFJfQVJNX1RITV9QQzIyKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotCSAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCQlleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkJICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkJICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICAgICAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkJICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgbm90IGFnYWluc3QgYSBzeW1ib2wgaXQgY2Fubm90IGNvbmNlcm4gdXMuICovCi0KLQkgIGggPSBOVUxMOwotCi0JICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IGxvY2FsIHN5bWJvbHMgKi8KLQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sICovCi0JICByX2luZGV4IC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGVsZl9zeW1faGFzaGVzIChhYmZkKVtyX2luZGV4XTsKLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBhIHN0YXRpYyBzeW1ib2wgaXQgbXVzdCBiZSB3aXRoaW4KLQkgICAgIHRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHNvIGNhbm5vdCBiZSBhIGNyb3NzIEFSTS9UaHVtYiByZWxvY2F0aW9uLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gYXJtIGNvZGUuICBXZSBuZWVkIHRvIGxvb2sgdXAKLQkgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBhIHRodW1iIHRhcmdldCwgd2UKLQkgICAgICAgICBpbnNlcnQgZ2x1ZS4gICovCi0KLQkgICAgICBpZiAoRUxGX1NUX1RZUEUoaC0+dHlwZSkgPT0gU1RUX0FSTV9URlVOQykKLQkJcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChsaW5rX2luZm8sIGgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9BUk1fVEhNX1BDMjI6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gdGh1bWIgY29kZS4gIFdlIGxvb2sKLQkgICAgICAgICB1cCB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBub3QgYSB0aHVtYgotICAgICAgICAgICAgICAgICB0YXJnZXQsIHdlIGluc2VydCBnbHVlLiAqLwotCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChoLT50eXBlKSAhPSBTVFRfQVJNX1RGVU5DKQotCQlyZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGxpbmtfaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci1lcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLQotfQotCi0vKiBUaGUgdGh1bWIgZm9ybSBvZiBhIGxvbmcgYnJhbmNoIGlzIGEgYml0IGZpbmlja3ksIGJlY2F1c2UgdGhlIG9mZnNldAotICAgZW5jb2RpbmcgaXMgc3BsaXQgb3ZlciB0d28gZmllbGRzLCBlYWNoIGluIGl0J3Mgb3duIGluc3RydWN0aW9uLiBUaGV5Ci0gICBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLiBTbyBnaXZlbiBhIHRodW1iIGZvcm0gb2YgbG9uZyBicmFuY2gsIGFuZCBhbgotICAgb2Zmc2V0LCBpbnNlcnQgdGhlIG9mZnNldCBpbnRvIHRoZSB0aHVtYiBicmFuY2ggYW5kIHJldHVybiBmaW5pc2hlZAotICAgaW5zdHJ1Y3Rpb24uCi0KLSAgIEl0IHRha2VzIHR3byB0aHVtYiBpbnN0cnVjdGlvbnMgdG8gZW5jb2RlIHRoZSB0YXJnZXQgYWRkcmVzcy4gRWFjaCBoYXMKLSAgIDExIGJpdHMgdG8gaW52ZXN0LiBUaGUgdXBwZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIG9uZSAoaWRlbnRpZmVkIGJ5Ci0gICBILTAuLiBzZWUgYmVsb3cpLCB0aGUgbG93ZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIHRoZSBvdGhlciAoaWRlbnRpZmllZAotICAgYnkgSC0xKS4KLQotICAgQ29tYmluZSB0b2dldGhlciBhbmQgc2hpZnRlZCBsZWZ0IGJ5IDEgKGl0J3MgYSBoYWxmIHdvcmQgYWRkcmVzcykgYW5kCi0gICB0aGVyZSB5b3UgaGF2ZSBpdC4KLQotICAgT3A6IDExMTEgPSBGLAotICAgSC0wLCB1cHBlciBhZGRyZXNzLTAgPSAwMDAKLSAgIE9wOiAxMTExID0gRiwKLSAgIEgtMSwgbG93ZXIgYWRkcmVzcy0wID0gODAwCi0KLSAgIFRoZXkgY2FuIGJlIG9yZGVyZWQgZWl0aGVyIHdheSwgYnV0IHRoZSBhcm0gdG9vbHMgSSd2ZSBzZWVuIGFsd2F5cyBwdXQKLSAgIHRoZSBsb3dlciBvbmUgZmlyc3QuIEl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLiBrcmtAY3lnbnVzLmNvbQotCi0gICBYWFg6ICBBY3R1YWxseSB0aGUgb3JkZXIgZG9lcyBtYXR0ZXIuICBUaGUgc2Vjb25kIGluc3RydWN0aW9uIChILTEpCi0gICBtb3ZlcyB0aGUgY29tcHV0ZWQgYWRkcmVzcyBpbnRvIHRoZSBQQywgc28gaXQgbXVzdCBiZSB0aGUgc2Vjb25kIG9uZQotICAgaW4gdGhlIHNlcXVlbmNlLiAgVGhlIHByb2JsZW0sIGhvd2V2ZXIgaXMgdGhhdCB3aGlsc3QgbGl0dGxlIGVuZGlhbiBjb2RlCi0gICBzdG9yZXMgdGhlIGluc3RydWN0aW9ucyBpbiBISSB0aGVuIExPVyBvcmRlciwgYmlnIGVuZGlhbiBjb2RlIGRvZXMgdGhlCi0gICByZXZlcnNlLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLQotI2RlZmluZSBMT1dfSElfT1JERVIgMHhGODAwRjAwMAotI2RlZmluZSBISV9MT1dfT1JERVIgMHhGMDAwRjgwMAotCi1zdGF0aWMgaW5zbjMyCi1pbnNlcnRfdGh1bWJfYnJhbmNoIChicl9pbnNuLCByZWxfb2ZmKQotICAgICBpbnNuMzIgYnJfaW5zbjsKLSAgICAgaW50IHJlbF9vZmY7Ci17Ci0gIHVuc2lnbmVkIGludCBsb3dfYml0czsKLSAgdW5zaWduZWQgaW50IGhpZ2hfYml0czsKLQotCi0gIEJGRF9BU1NFUlQgKChyZWxfb2ZmICYgMSkgIT0gMSk7Ci0KLSAgcmVsX29mZiA+Pj0gMTsJCS8qIGhhbGYgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KLSAgbG93X2JpdHMgPSByZWxfb2ZmICYgMHgwMDAwMDdGRjsJLyogdGhlIGJvdHRvbSAxMSBiaXRzICovCi0gIGhpZ2hfYml0cyA9IChyZWxfb2ZmID4+IDExKSAmIDB4MDAwMDA3RkY7CS8qIHRoZSB0b3AgMTEgYml0cyAqLwotCi0gIGlmICgoYnJfaW5zbiAmIExPV19ISV9PUkRFUikgPT0gTE9XX0hJX09SREVSKQotICAgIGJyX2luc24gPSBMT1dfSElfT1JERVIgfCAobG93X2JpdHMgPDwgMTYpIHwgaGlnaF9iaXRzOwotICBlbHNlIGlmICgoYnJfaW5zbiAmIEhJX0xPV19PUkRFUikgPT0gSElfTE9XX09SREVSKQotICAgIGJyX2luc24gPSBISV9MT1dfT1JERVIgfCAoaGlnaF9iaXRzIDw8IDE2KSB8IGxvd19iaXRzOwotICBlbHNlCi0gICAgYWJvcnQgKCk7CQkJLyogZXJyb3IgLSBub3QgYSB2YWxpZCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybSAqLwotCi0gIC8qIEZJWE1FOiBhYm9ydCBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGNhbGwuIGtya0BjeWdudXMuY29tICovCi0KLSAgcmV0dXJuIGJyX2luc247Ci19Ci0KLS8qIFRodW1iIGNvZGUgY2FsbGluZyBhbiBBUk0gZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQKLWVsZjMyX3RodW1iX3RvX2FybV9zdHViIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgaGl0X2RhdGEsIHN5bV9zZWMsIG9mZnNldCwgYWRkZW5kLCB2YWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjaGFyICpuYW1lOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmhpdF9kYXRhOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGFkZGVuZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIGFzZWN0aW9uICpzID0gMDsKLSAgbG9uZyBpbnQgbXlfb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nIGludCB0bXA7Ci0gIGxvbmcgaW50IHJldF9vZmZzZXQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpnbG9iYWxzOwotCi0gIG15aCA9IGZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIG15X29mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLAotCQkJICAgICAgIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCi0gIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKLSAgICB7Ci0gICAgICBpZiAoc3ltX3NlYyAhPSBOVUxMCi0JICAmJiBzeW1fc2VjLT5vd25lciAhPSBOVUxMCi0JICAmJiAhSU5URVJXT1JLX0ZMQUcgKHN5bV9zZWMtPm93bmVyKSkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiB0aHVtYiBjYWxsIHRvIGFybSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC0tbXlfb2Zmc2V0OwotICAgICAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0gICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmExX2J4X3BjX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCi0gICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX25vb3BfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOwotCi0gICAgICByZXRfb2Zmc2V0ID0KLQkoKGJmZF9zaWduZWRfdm1hKSB2YWwpCS8qIEFkZHJlc3Mgb2YgZGVzdGluYXRpb24gb2YgdGhlIHN0dWIgKi8KLQktICgoYmZkX3NpZ25lZF92bWEpCi0JICAgKHMtPm91dHB1dF9vZmZzZXQJLyogT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JICAgICsgbXlfb2Zmc2V0CQkvKiBPZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgc3R1YiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc3R1YnMuICAqLwotCSAgICArIHMtPm91dHB1dF9zZWN0aW9uLT52bWEpCS8qIEFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotCSAgICsgNAkJCS8qIFRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXMgNCBieXRlcyBpbnRvIHRoZSBzdHViLiAgKi8KLQkgICArIDgpOwkJLyogQVJNIGJyYW5jaGVzIHdvcmsgZnJvbSB0aGUgcGMgb2YgdGhlIGluc3RydWN0aW9uICsgOC4gICovCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgdDJhM19iX2luc24gfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKSwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDQpOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLQotICAvKiBOb3cgZ28gYmFjayBhbmQgZml4IHVwIHRoZSBvcmlnaW5hbCBCTCBpbnNuIHRvIHBvaW50Ci0gICAgIHRvIGhlcmUuICAqLwotICByZXRfb2Zmc2V0ID0KLSAgICBzLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyBteV9vZmZzZXQKLSAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgKyBvZmZzZXQgKyBhZGRlbmQpCi0gICAgLSA0OwotCi0gIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEKLQkJICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCSAgICAgIGluc2VydF90aHVtYl9icmFuY2ggKHRtcCwgcmV0X29mZnNldCksCi0JICAgICAgaGl0X2RhdGEgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBcm0gY29kZSBjYWxsaW5nIGEgVGh1bWIgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQKLWVsZjMyX2FybV90b190aHVtYl9zdHViIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgaGl0X2RhdGEsIHN5bV9zZWMsIG9mZnNldCwgYWRkZW5kLCB2YWwpCi0KLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqaGl0X2RhdGE7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICBpbnQgb2Zmc2V0OwotICAgICBpbnQgYWRkZW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnQgdG1wOwotICBsb25nIGludCBteV9vZmZzZXQ7Ci0gIGFzZWN0aW9uICpzOwotICBsb25nIGludCByZXRfb2Zmc2V0OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLQotICBteWggPSBmaW5kX2FybV9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotICBpZiAobXloID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLAotCQkJICAgICAgIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPmNvbnRlbnRzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKTsKLQotICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0gICAgewotICAgICAgaWYgKHN5bV9zZWMgIT0gTlVMTAotCSAgJiYgc3ltX3NlYy0+b3duZXIgIT0gTlVMTAotCSAgJiYgIUlOVEVSV09SS19GTEFHIChzeW1fc2VjLT5vd25lcikpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JICAgIChfICgiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzeW1fc2VjLT5vd25lciksIG5hbWUpOwotCSAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JICAgIChfICgiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCX0KLSAgICAgIC0tbXlfb2Zmc2V0OwotICAgICAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQxX2xkcl9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0Ml9ieF9yMTJfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDQpOwotCi0gICAgICAvKiBJdCdzIGEgdGh1bWIgYWRkcmVzcy4gIEFkZCB0aGUgbG93IG9yZGVyIGJpdC4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWwgfCBhMnQzX2Z1bmNfYWRkcl9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLQotICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKTsKLSAgdG1wID0gdG1wICYgMHhGRjAwMDAwMDsKLQotICAvKiBTb21laG93IHRoZXNlIGFyZSBib3RoIDQgdG9vIGZhciwgc28gc3VidHJhY3QgOC4gKi8KLSAgcmV0X29mZnNldCA9IHMtPm91dHB1dF9vZmZzZXQKLSAgICArIG15X29mZnNldAotICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAgICArIG9mZnNldCArIGFkZGVuZCkKLSAgICAtIDg7Ci0KLSAgdG1wID0gdG1wIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRik7Ci0KLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdG1wLCBoaXRfZGF0YQotCSAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLCB2YWx1ZSwKLQkJCSAgICAgICBpbmZvLCBzeW1fc2VjLCBzeW1fbmFtZSwgc3ltX2ZsYWdzLCBoKQotICAgICByZWxvY19ob3d0b190eXBlICogICAgIGhvd3RvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgcmVsOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgIHZhbHVlOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgc3ltX3NlYzsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICBzeW1fbmFtZTsKLSAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICBzeW1fZmxhZ3M7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICBiZmRfYnl0ZSAqICAgICAgICAgICAgICAgICAgICBoaXRfZGF0YSA9IGNvbnRlbnRzICsgcmVsLT5yX29mZnNldDsKLSAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICAgZHlub2JqID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqICAgICAgICAgICAgICAgICAgICAgbG9jYWxfZ290X29mZnNldHM7Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgIHNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICBzcGx0ID0gTlVMTDsKLSAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgc3JlbG9jID0gTlVMTDsKLSAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgYWRkZW5kOwotICBiZmRfc2lnbmVkX3ZtYSAgICAgICAgICAgICAgICBzaWduZWRfYWRkZW5kOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaikKLSAgICB7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgIH0KLSAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSNpZmRlZiBVU0VfUkVMCi0gIGFkZGVuZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgaG93dG8tPnNyY19tYXNrOwotCi0gIGlmIChhZGRlbmQgJiAoKGhvd3RvLT5zcmNfbWFzayArIDEpID4+IDEpKQotICAgIHsKLSAgICAgIHNpZ25lZF9hZGRlbmQgPSAtMTsKLSAgICAgIHNpZ25lZF9hZGRlbmQgJj0gfiBob3d0by0+c3JjX21hc2s7Ci0gICAgICBzaWduZWRfYWRkZW5kIHw9IGFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzaWduZWRfYWRkZW5kID0gYWRkZW5kOwotI2Vsc2UKLSAgYWRkZW5kID0gc2lnbmVkX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FSTV9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fUEMyNDoKLSAgICBjYXNlIFJfQVJNX0FCUzMyOgotICAgIGNhc2UgUl9BUk1fUkVMMzI6Ci0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgY29waWVkCi0JIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1biB0aW1lLiAqLwotCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAocl90eXBlICE9IFJfQVJNX1BDMjQKLSAJICAgICAgfHwgKGggIT0gTlVMTAotCSAgICAgICAgICAmJiBoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKCEgaW5mby0+c3ltYm9saWMKLQkJICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotCSAgYm9vbGVhbiBza2lwLCByZWxvY2F0ZTsKLQotCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwKLQkJICAgICAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCSAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pLAotCQkJCSAgICAgbmFtZSArIDQpID09IDApOwotCi0JICAgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHNraXAgPSBmYWxzZTsKLQotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkgICAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICYgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJICAgICAgcmVsLT5yX29mZnNldCkpOwotCSAgICAgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JICAgIH0KLQotCSAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICBpZiAoc2tpcCkKLQkgICAgewotCSAgICAgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JICAgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkgICAgfQotCSAgZWxzZSBpZiAocl90eXBlID09IFJfQVJNX1BDMjQpCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwgJiYgaC0+ZHluaW5keCAhPSAtMSk7Ci0JICAgICAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJcmVsb2NhdGUgPSBmYWxzZTsKLQkgICAgICBlbHNlCi0JCXJlbG9jYXRlID0gdHJ1ZTsKLQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9QQzI0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGggPT0gTlVMTAotCQkgIHx8ICgoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQkJewotCQkgIHJlbG9jYXRlID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICBlbHNlCi0JCSAgICByZWxvY2F0ZSA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fQUJTMzIpOwotCQl9Ci0JICAgIH0KLQotCSAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAgICAoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKLQkJCQkgICAgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCSAgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0JICAKLQkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvIG5vdCB3YW50IHRvCi0JICAgICBmaWRkbGUgd2l0aCB0aGUgYWRkZW5kLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIHN5bWJvbAotCSAgICAgdmFsdWUgc28gdGhhdCBpdCBiZWNvbWVzIGFuIGFkZGVuZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2MuICovCi0JICBpZiAoISByZWxvY2F0ZSkKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotCSAgCi0JICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0JCQkJCSAgIChiZmRfdm1hKSAwKTsKLQl9Ci0gICAgICBlbHNlIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfQVJNX1BDMjQ6Ci0JICAvKiBBcm0gQi9CTCBpbnN0cnVjdGlvbiAqLwotCi0JICAvKiBDaGVjayBmb3IgYXJtIGNhbGxpbmcgdGh1bWIgZnVuY3Rpb24uICAqLwotCSAgaWYgKHN5bV9mbGFncyA9PSBTVFRfQVJNX1RGVU5DKQotCSAgICB7Ci0JICAgICAgZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIgKGluZm8sIHN5bV9uYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGhpdF9kYXRhLCBzeW1fc2VjLCByZWwtPnJfb2Zmc2V0LCBhZGRlbmQsIHZhbHVlKTsKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0KLQkgIGlmICggICBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItbGl0dGxlYXJtLW9hYmkiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgImVsZjMyLWJpZ2FybS1vYWJpIikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBvbGQgd2F5IG9mIGRvaW5nIHRoaW5ncy4gIFRyZWFyaW5nIHRoZSBhZGRlbmQgYXMgYQotCQkgYnl0ZSBzaXplZCBmaWVsZCBhbmQgYWRkaW5nIGluIHRoZSBwaXBlbGluZSBvZmZzZXQuICAqLwotCi0JICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgdmFsdWUgLT0gcmVsLT5yX29mZnNldDsKLQkgICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXZhbHVlIC09IDg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBBUk0gRUxGIEFCSSBzYXlzIHRoYXQgdGhpcyByZWxvYyBpcyBjb21wdXRlZCBhczogUyAtIFAgKyBBCi0JCSB3aGVyZToKLQkJICBTIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgaW4gdGhlIHJlbG9jYXRpb24uCi0JCSAgUCBpcyBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiBiZWluZyByZWxvY2F0ZWQuCi0JCSAgQSBpcyB0aGUgYWRkZW5kIChleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24pIGluIGJ5dGVzLgotCi0JCSBTIGlzIGhlbGQgaW4gJ3ZhbHVlJy4KLQkJIFAgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBpbnN0cnVjdGlvbgotCQkgICBwbHVzIHRoZSBvZmZzZXQgb2YgdGhlIHJlbG9jIGludG8gdGhhdCBzZWN0aW9uLCBpZToKLQkJICAgICAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCQkgICAgICByZWwtPnJfb2Zmc2V0KS4KLQkJIEEgaXMgdGhlIGFkZGVuZCwgY29udmVydGVkIGludG8gYnl0ZXMsIGllOgotCQkgICAgIChzaWduZWRfYWRkZW5kICogNCkKLQotCQkgTm90ZTogTm9uZSBvZiB0aGVzZSBvcGVyYXRpb25zIGhhdmUga25vd2xlZGdlIG9mIHRoZSBwaXBlbGluZQotCQkgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yLCB0aHVzIGl0IGlzIHVwIHRvIHRoZSBhc3NlbWJsZXIgdG8gZW5jb2RlCi0JCSB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGFkZGVuZC4gICovCi0KLQkgICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB2YWx1ZSAtPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIHZhbHVlICs9IChzaWduZWRfYWRkZW5kIDw8IGhvd3RvLT5zaXplKTsKLQotCSAgICAgIC8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSBhbHNvIHVzZWQgdG8gYWRkIGluIHRoZSBwaXBlbGluZQotCQkgb2Zmc2V0IGhlcmUuICBUaGlzIGlzIHdyb25nIGJlY2F1c2UgdGhlIGxpbmtlciBpcyBub3Qgc3VwcG9zZWQKLQkJIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIGFuZCBvbmUgZGF5IGl0IG1pZ2h0IGNoYW5nZS4gIEluIG9yZGVyCi0JCSB0byBzdXBwb3J0IG9sZCBiaW5hcmllcyB0aGF0IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIgaG93ZXZlciwgc28KLQkJIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHdoaWNoIEFCSSB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfRWhkciAqIGlfZWhkcnA7IC8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotCi0JCSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCk7Ci0KLQkJICBpZiAoaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gMCkKLQkJICAgIHZhbHVlIC09IDg7Ci0JCX0KLQkgICAgfQotCSAgCi0JICB2YWx1ZSA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0JICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0JICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAofiBob3d0by0+ZHN0X21hc2spKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9BQlMzMjoKLQkgIHZhbHVlICs9IGFkZGVuZDsKLQkgIGlmIChzeW1fZmxhZ3MgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgdmFsdWUgfD0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9SRUwzMjoKLQkgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgKz0gYWRkZW5kOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlM4OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpIHZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlMxNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZykgdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzEyOgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbiBmb3IgdGhlIGFybSAqLwotICAgICAgLyogQWxzbyB0aHVtYiBiICh1bmNvbmRpdGlvbmFsIGJyYW5jaCkuICA/Pz8gUmVhbGx5PyAgKi8KLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmIHx8IChsb25nKSB2YWx1ZSA8IC0weDgwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmZmZmMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX1RITV9BQlM1OgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0aHVtYi4gKi8KLSNpZmRlZiBVU0VfUkVMCi0gICAgICAvKiBOZWVkIHRvIHJlZmV0Y2ggYWRkZW5kLiAgKi8KLSAgICAgIGFkZGVuZCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgaG93dG8tPnNyY19tYXNrOwotICAgICAgLyogPz8/IE5lZWQgdG8gZGV0ZXJtaW5lIHNoaWZ0IGFtb3VudCBmcm9tIG9wZXJhbmQgc2l6ZS4gICovCi0gICAgICBhZGRlbmQgPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotI2VuZGlmCi0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIC8qID8/PyBJc24ndCB2YWx1ZSB1bnNpZ25lZD8gICovCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHgxZiB8fCAobG9uZykgdmFsdWUgPCAtMHgxMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICAvKiA/Pz8gVmFsdWUgbmVlZHMgdG8gYmUgcHJvcGVybHkgc2hpZnRlZCBpbnRvIHBsYWNlIGZpcnN0LiAgKi8KLSAgICAgIHZhbHVlIHw9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmODNmOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fVEhNX1BDMjI6Ci0gICAgICAvKiBUaHVtYiBCTCAoYnJhbmNoIGxvbmcgaW5zdHJ1Y3Rpb24pLiAqLwotICAgICAgewotCWJmZF92bWEgICAgICAgIHJlbG9jYXRpb247Ci0JYm9vbGVhbiAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQliZmRfdm1hICAgICAgICB1cHBlcl9pbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0JYmZkX3ZtYSAgICAgICAgbG93ZXJfaW5zbiA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyAyKTsKLQliZmRfdm1hICAgICAgICBzcmNfbWFzayA9IDB4MDA3RkZGRkU7Ci0JYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH4gcmVsb2Nfc2lnbmVkX21heDsKLQliZmRfdm1hICAgICAgICBjaGVjazsKLQliZmRfc2lnbmVkX3ZtYSBzaWduZWRfY2hlY2s7Ci0KLSNpZmRlZiBVU0VfUkVMCi0JLyogTmVlZCB0byByZWZldGNoIHRoZSBhZGRlbmQgYW5kIHNxdWlzaCB0aGUgdHdvIDExIGJpdCBwaWVjZXMKLQkgICB0b2dldGhlci4gICovCi0JewotCSAgYmZkX3ZtYSB1cHBlciA9IHVwcGVyX2luc24gJiAweDdmZjsKLQkgIGJmZF92bWEgbG93ZXIgPSBsb3dlcl9pbnNuICYgMHg3ZmY7Ci0JICB1cHBlciA9ICh1cHBlciBeIDB4NDAwKSAtIDB4NDAwOyAvKiBzaWduIGV4dGVuZCAqLwotCSAgYWRkZW5kID0gKHVwcGVyIDw8IDEyKSB8IChsb3dlciA8PCAxKTsKLQkgIHNpZ25lZF9hZGRlbmQgPSBhZGRlbmQ7Ci0JfQotI2VuZGlmCi0KLSAgICAgICAgLyogSWYgaXQncyBub3QgYSBjYWxsIHRvIHRodW1iLCBhc3N1bWUgY2FsbCB0byBhcm0gKi8KLQlpZiAoc3ltX2ZsYWdzICE9IFNUVF9BUk1fVEZVTkMpCi0JICB7Ci0JICAgIGlmIChlbGYzMl90aHVtYl90b19hcm1fc3R1YgotCQkoaW5mbywgc3ltX25hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJIGhpdF9kYXRhLCBzeW1fc2VjLCByZWwtPnJfb2Zmc2V0LCBhZGRlbmQsIHZhbHVlKSkKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JICB9Ci0KLQlyZWxvY2F0aW9uID0gdmFsdWUgKyBzaWduZWRfYWRkZW5kOwotCi0JcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIHJlbC0+cl9vZmZzZXQpOwotCQotCWlmICghIGdsb2JhbHMtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSkKLQkgIHsKLQkgICAgRWxmX0ludGVybmFsX0VoZHIgKiBpX2VoZHJwOyAvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLQkgICAgCi0JICAgIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpOwotCi0JICAgIC8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSBhbHNvIHVzZWQgdG8gYWRkIGluIHRoZSBwaXBsaW5lCi0JICAgICAgIG9mZnNldCBoZXJlLiAgVGhpcyBpcyB3cm9uZyBiZWNhdXNlIHRoZSBsaW5rZXIgaXMgbm90IHN1cHBvc2VkCi0JICAgICAgIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIGFuZCBvbmUgZGF5IGl0IG1pZ2h0IGNoYW5nZS4gIEluIG9yZGVyCi0JICAgICAgIHRvIHN1cHBvcnQgb2xkIGJpbmFyaWVzIHRoYXQgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciBob3dldmVyLCBzbwotCSAgICAgICB3ZSBhdHRlbXB0IHRvIGRldGVjdCB3aGljaCBBQkkgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSByZWxvYy4gICovCi0JICAgIGlmICggICBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItbGl0dGxlYXJtLW9hYmkiKSA9PSAwCi0JCXx8IHN0cmNtcCAoYmZkX2dldF90YXJnZXQgKGlucHV0X2JmZCksICJlbGYzMi1iaWdhcm0tb2FiaSIpID09IDAKLQkJfHwgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gMCkKLQkgICAgICByZWxvY2F0aW9uICs9IDQ7Ci0JICB9Ci0KLQljaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLQkvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkgICBsZWFkaW5nIDEgYml0cyAoYXNzdW1pbmcgdHdvcyBjb21wbGVtZW50KS4gICovCi0JaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCSAgc2lnbmVkX2NoZWNrID0gY2hlY2s7Ci0JZWxzZQotCSAgc2lnbmVkX2NoZWNrID0gY2hlY2sgfCB+KChiZmRfdm1hKSAtMSA+PiBob3d0by0+cmlnaHRzaGlmdCk7Ci0KLQkvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCWlmIChzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4IHx8IHNpZ25lZF9jaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICBvdmVyZmxvdyA9IHRydWU7Ci0KLQkvKiBQdXQgUkVMT0NBVElPTiBiYWNrIGludG8gdGhlIGluc24uICAqLwotCXVwcGVyX2luc24gPSAodXBwZXJfaW5zbiAmIH4oYmZkX3ZtYSkgMHg3ZmYpIHwgKChyZWxvY2F0aW9uID4+IDEyKSAmIDB4N2ZmKTsKLQlsb3dlcl9pbnNuID0gKGxvd2VyX2luc24gJiB+KGJmZF92bWEpIDB4N2ZmKSB8ICgocmVsb2NhdGlvbiA+PiAxKSAmIDB4N2ZmKTsKLQotCS8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlOiAgKi8KLQliZmRfcHV0XzE2IChpbnB1dF9iZmQsIHVwcGVyX2luc24sIGhpdF9kYXRhKTsKLQliZmRfcHV0XzE2IChpbnB1dF9iZmQsIGxvd2VyX2luc24sIGhpdF9kYXRhICsgMik7Ci0KLQlyZXR1cm4gKG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FSTV9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9DT1BZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX0dMT0JfREFUOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX0pVTVBfU0xPVDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SRUxBVElWRToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9HT1RPRkY6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICAgIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgICAKLSAgICAgIC8qIE5vdGUgdGhhdCBzZ290LT5vdXRwdXRfb2Zmc2V0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGlzCi0gICAgICAgICBjYWxjdWxhdGlvbi4gIFdlIGFsd2F5cyB3YW50IHRoZSBzdGFydCBvZiAuZ290LiAgSWYgd2UKLSAgICAgICAgIGRlZmluZSBfR0xPQkFMX09GRlNFVF9UQUJMRSBpbiBhIGRpZmZlcmVudCB3YXksIGFzIGlzCi0gICAgICAgICBwZXJtaXR0ZWQgYnkgdGhlIEFCSSwgd2UgbWlnaHQgaGF2ZSB0byBjaGFuZ2UgdGhpcwotICAgICAgICAgY2FsY3VsYXRpb24uICovCi0KLSAgICAgIHZhbHVlIC09IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fR09UUEM6Ci0gICAgICAvKiBVc2UgZ2xvYmFsIG9mZnNldCB0YWJsZSBhcyBzeW1ib2wgdmFsdWUuICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0KLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fR09UMzI6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAqLwotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQotCSAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICBpZiAoIWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHx8Ci0JICAgICAgKGluZm8tPnNoYXJlZCAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYyBsaW5rCi0JCSBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGxvY2FsbHkuICBXZSBtdXN0IGluaXRpYWxpemUgdGhpcwotCQkgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QKLQkJIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0Ci0JCSB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290IHJlbG9jYXRpb24KLQkJIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcyBpcyBkb25lIGluIHRoZQotCQkgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICovCi0KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWx1ZSwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJfQotCSAgICB9Ci0KLQkgIHZhbHVlID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwgJiYKLQkJICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQotCSAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UgdGhlCi0JICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5Ci0JICAgICBnZW5lcmF0ZWQgdGhlIG5lY2Vzc2FyeSByZWxvYy4gKi8KLQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkgICAgb2ZmICY9IH4xOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICBhc2VjdGlvbiAqIHNyZWxnb3Q7Ci0JCSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0KLQkJICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICsgb2ZmKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0JCSAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCSAgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkgICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQl9Ci0KLQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkgICAgfQotCi0JICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JfQotICAgICAgCi0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fUExUMzI6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSAgICAgIC8qIFJlc29sdmUgYSBQTFQzMiByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAotICAgICAgICAgd2l0aG91dCB1c2luZyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAJCQkJIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLSAgICAgICAgCQkJCSAoYmZkX3ZtYSkgMCk7Ci0KLSAgICAgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLSAgICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0gICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCXJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0JCQkJCSAoYmZkX3ZtYSkgMCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQoc3BsdCAhPSBOVUxMKTsKLSAgICAgIGlmIChzcGx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICB2YWx1ZSA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCSAgICAgICArIGgtPnBsdC5vZmZzZXQpOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgCQkJICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLSAgICAgICAgCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fU0JSRUwzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9BTVBfVkNBTEw5OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JTQlJFTDMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1RITV9SUEMyMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SUkVMMzI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUkFCUzMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JQQzI0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JCQVNFOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotfQotCi0KLS8qIFJlbG9jYXRlIGFuIEFSTSBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kOwotICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICBuYW1lOwotCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOwotICAgICAgYXJlbGVudCAgICAgICAgICAgICAgICAgICAgICBiZmRfcmVsb2M7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSAgID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmICggICByX3R5cGUgPT0gUl9BUk1fR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9BUk1fR05VX1ZUSU5IRVJJVCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvIChpbnB1dF9iZmQsICYgYmZkX3JlbG9jLCByZWwpOwotICAgICAgaG93dG8gPSBiZmRfcmVsb2MuaG93dG87Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotI2lmZGVmIFVTRV9SRUwKLQkJICB7Ci0JCSAgICBiZmRfdm1hIHZhbDsKLQkJICAgIGJmZF92bWEgaW5zbjsKLQotCQkgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJICAgIHZhbCA9IGluc24gKyAoKHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWUpCi0JCQkJICA+PiBob3d0by0+cmlnaHRzaGlmdCk7Ci0JCSAgICB2YWwgJj0gaG93dG8tPmRzdF9tYXNrOwotCQkgICAgdmFsIHw9IGluc24gJiB+KGhvd3RvLT5kc3RfbWFzayk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIH0KLSNlbHNlCi0JCSAgcmVsLT5yX2FkZGVuZCArPSAoc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZSkKLQkJICAgID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotI2VuZGlmCi0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgaW50IHJlbG9jYXRpb25fbmVlZGVkID0gMTsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICAgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uIHZhbHVlLgotCSAgICAgICAgIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUgb2JzY3VyZSBjYXNlcwotCSAgICAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAqLwotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JICAgICAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0JICAgICAgICBjYXNlIFJfQVJNX0FCUzMyOgotCSAgICAgICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgICAgICAgICAmJiAoCi0JICAgICAgICAgICAgICAJICAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JICAgICAgICAgICAgICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0JCQkgICkKLQkgICAgICAgICAgICAgICYmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICAgICkKLQkgICAgICAgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkgICAgICAgIGNhc2UgUl9BUk1fR09UUEM6Ci0JICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgY2FzZSBSX0FSTV9HT1QzMjoKLQkgICAgICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgICAgICAgICAgICAgICYmICghaW5mby0+c2hhcmVkCi0JICAgICAgICAgICAgICAgICAgfHwgKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCSAgICAgICAgICAgICAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCQkJICApCi0JCSAgICAgICkKLQkgICAgICAgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkgICAgICAgIGNhc2UgUl9BUk1fUExUMzI6Ci0JICAgICAgICAgIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKS0xKQotCSAgICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgZGVmYXVsdDoKLQkJICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkJICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAocmVsb2NhdGlvbl9uZWVkZWQpCi0JCXJlbG9jYXRpb24gPSBoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHNlYy0+b3V0cHV0X29mZnNldDsKLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQluYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgIGlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLQkgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQl9Ci0KLSAgICAgIHIgPSBlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWwsCi0JCQkJCSByZWxvY2F0aW9uLCBpbmZvLCBzZWMsIG5hbWUsCi0JCQkJCSAoaCA/IEVMRl9TVF9UWVBFIChoLT50eXBlKSA6Ci0JCQkJCSAgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykpLCBoKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBtc2cgPSAoY29uc3QgY2hhciAqKSAwOwotCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGtlZXAgQVJNIHNwZWNpZmljIGZsYWdzIGluIHRoZSBFTEYgaGVhZGVyLiAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGlmIChlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLSAgICAgICYmIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICE9IGZsYWdzKQotICAgIHsKLSAgICAgIGlmIChmbGFncyAmIEVGX0lOVEVSV09SSykKLQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiBOb3Qgc2V0dGluZyBpbnRlcndvcmsgZmxhZyBvZiAlcyBzaW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBhcyBub24taW50ZXJ3b3JraW5nIiksCi0JCQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZWxzZQotCV9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmsgZmxhZyBvZiAlcyBkdWUgdG8gb3V0c2lkZSByZXF1ZXN0IiksCi0JCQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmIChlbGZfZmxhZ3NfaW5pdCAob2JmZCkgJiYgaW5fZmxhZ3MgIT0gb3V0X2ZsYWdzKQotICAgIHsKLSAgICAgIC8qIENhbm5vdCBtaXggUElDIGFuZCBub24tUElDIGNvZGUuICAqLwotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX1BJQykgIT0gKG91dF9mbGFncyAmIEVGX1BJQykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDYW5ub3QgbWl4IEFQQ1MyNiBhbmQgQVBDUzMyIGNvZGUuICAqLwotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfMjYpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTXzI2KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIENhbm5vdCBtaXggZmxvYXQgQVBDUyBhbmQgbm9uLWZsb2F0IEFQQ1MgY29kZS4gICovCi0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfQVBDU19GTE9BVCkgIT0gKG91dF9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSWYgdGhlIHNyYyBhbmQgZGVzdCBoYXZlIGRpZmZlcmVudCBpbnRlcndvcmtpbmcgZmxhZ3MKLSAgICAgICAgIHRoZW4gdHVybiBvZmYgdGhlIGludGVyd29ya2luZyBiaXQuICAqLwotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX0lOVEVSV09SSykgIT0gKG91dF9mbGFncyAmIEVGX0lOVEVSV09SSykpCi0JewotCSAgaWYgKG91dF9mbGFncyAmIEVGX0lOVEVSV09SSykKLQkgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29yayBmbGFnIGluICVzIGJlY2F1c2Ugbm9uLWludGVyd29ya2luZyBjb2RlIGluICVzIGhhcyBiZWVuIGxpbmtlZCB3aXRoIGl0IiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLQkgIGluX2ZsYWdzICY9IH5FRl9JTlRFUldPUks7Ci0JfQotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgc2FtZSBlbmRpYW5lc3MgKi8KLSAgaWYgKCAgIGliZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04KLSAgICAgICYmIGliZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSBiZmRfYmlnX2VuZGlhbiAoaWJmZCkgPyAiYmlnIiA6ICJsaXR0bGUiLAotCSBiZmRfYmlnX2VuZGlhbiAob2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBpbnB1dCBCRkQgbXVzdCBoYXZlIGhhZCBpdHMgZmxhZ3MgaW5pdGlhbGlzZWQuICAqLwotICAvKiBUaGUgZm9sbG93aW5nIHNlZW1zIGJvZ3VzIHRvIG1lIC0tIFRoZSBmbGFncyBhcmUgaW5pdGlhbGl6ZWQgaW4KLSAgICAgdGhlIGFzc2VtYmxlciBidXQgSSBkb24ndCB0aGluayBhbiBlbGZfZmxhZ3NfaW5pdCBmaWVsZCBpcwotICAgICB3cml0dGVuIGludG8gdGhlIG9iamVjdCAqLwotICAvKiBCRkRfQVNTRVJUIChlbGZfZmxhZ3NfaW5pdCAoaWJmZCkpOyAqLwotCi0gIGluX2ZsYWdzICA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoIWVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgaW5wdXQgaXMgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIHRoZW4gZG8gbm90Ci0gICAgICAgICBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotICAgICAgICAgaW5zdGVhZCBhbGxvdyBmdXR1cmUgbWVyZ2VzIHRvIGRvIHRoaXMuICBJZiBubyBmdXR1cmUKLSAgICAgICAgIG1lcmdlcyBldmVyIHNldCB0aGVzZSBmbGFncyB0aGVuIHRoZXkgd2lsbCByZXRhaW4gdGhlaXIKLSAgICAgICAgIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLSAgICAgICAgIHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCi0gICAgICBpZiAoYmZkX2dldF9hcmNoX2luZm8gKGliZmQpLT50aGVfZGVmYXVsdCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gaW5fZmxhZ3M7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9nZXRfYXJjaCAoaWJmZCkKLQkgICYmIGJmZF9nZXRfYXJjaF9pbmZvIChvYmZkKS0+dGhlX2RlZmF1bHQpCi0JcmV0dXJuIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLCBiZmRfZ2V0X21hY2ggKGliZmQpKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQ29tcGxhaW4gYWJvdXQgdmFyaW91cyBmbGFnIG1pc21hdGNoZXMuICAqLwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTXzI2KSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU18yNikpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotRXJyb3I6ICVzIGNvbXBpbGVkIGZvciBBUENTLSVkLCB3aGVyZWFzICVzIGlzIGNvbXBpbGVkIGZvciBBUENTLSVkIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJCWluX2ZsYWdzICYgRUZfQVBDU18yNiA/IDI2IDogMzIsCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJCW91dF9mbGFncyAmIEVGX0FQQ1NfMjYgPyAyNiA6IDMyKTsKLQotICBpZiAoKGluX2ZsYWdzICYgRUZfQVBDU19GTE9BVCkgIT0gKG91dF9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpKQotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLUVycm9yOiAlcyBwYXNzZXMgZmxvYXRzIGluICVzIHJlZ2lzdGVycywgd2hlcmVhcyAlcyBwYXNzZXMgdGhlbSBpbiAlcyByZWdpc3RlcnMiKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkgICAgIGluX2ZsYWdzICYgRUZfQVBDU19GTE9BVCA/IF8gKCJmbG9hdCIpIDogXyAoImludGVnZXIiKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgICAgICBvdXRfZmxhZ3MgJiBFRl9BUENTXzI2ID8gXyAoImZsb2F0IikgOiBfICgiaW50ZWdlciIpKTsKLQotICBpZiAoKGluX2ZsYWdzICYgRUZfUElDKSAhPSAob3V0X2ZsYWdzICYgRUZfUElDKSkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1FcnJvcjogJXMgaXMgY29tcGlsZWQgYXMgcG9zaXRpb24gJXMgY29kZSwgd2hlcmVhcyAlcyBpcyBub3QiKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkgICAgaW5fZmxhZ3MgJiBFRl9QSUMgPyBfICgiaW5kZXBlbmRlbnQiKSA6IF8gKCJkZXBlbmRlbnQiKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICAvKiBJbnRlcndvcmtpbmcgbWlzbWF0Y2ggaXMgb25seSBhIHdhcm5pbmcuICovCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9JTlRFUldPUkspICE9IChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspKQotICAgIHsKLSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6ICVzICVzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyAlcyIpLAotCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgIGluX2ZsYWdzICYgRUZfSU5URVJXT1JLID8gXyAoInN1cHBvcnRzIikgOiBfICgiZG9lcyBub3Qgc3VwcG9ydCIpLAotCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJICAgIG91dF9mbGFncyAmIEVGX0lOVEVSV09SSyA/IF8gKCJkb2VzIG5vdCIpIDogXyAoImRvZXMiKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHB0cjsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHB0cjsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotCi0gIC8qIFByaW50IG5vcm1hbCBFTEYgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLQotICAvKiBJZ25vcmUgaW5pdCBmbGFnIC0gaXQgbWF5IG5vdCBiZSBzZXQsIGRlc3BpdGUgdGhlIGZsYWdzIGZpZWxkIGNvbnRhaW5pbmcgdmFsaWQgZGF0YS4gICovCi0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXyAoInByaXZhdGUgZmxhZ3MgPSAlbHg6IiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLQotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbaW50ZXJ3b3JraW5nIGVuYWJsZWRdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkXSIpKTsKLQotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9BUENTXzI2KQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW0FQQ1MtMjZdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbQVBDUy0zMl0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQVBDU19GTE9BVCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtmbG9hdHMgcGFzc2VkIGluIGZsb2F0IHJlZ2lzdGVyc10iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtmbG9hdHMgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzXSIpKTsKLQotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9QSUMpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbcG9zaXRpb24gaW5kZXBlbmRlbnRdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJzb2x1dGUgcG9zaXRpb25dIikpOwotCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludAotZWxmMzJfYXJtX2dldF9zeW1ib2xfdHlwZSAoZWxmX3N5bSwgdHlwZSkKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIGVsZl9zeW07Ci0gICAgIGludCB0eXBlOwotewotICBpZiAoRUxGX1NUX1RZUEUgKGVsZl9zeW0tPnN0X2luZm8pID09IFNUVF9BUk1fVEZVTkMpCi0gICAgcmV0dXJuIEVMRl9TVF9UWVBFIChlbGZfc3ltLT5zdF9pbmZvKTsKLSAgZWxzZQotICAgIHJldHVybiB0eXBlOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmMzJfYXJtX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICBlbHNlCi0gICAgIHsKLSAgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLSAgICAgICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotICAgICAgICAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0gICAgICAgICAgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICAvKiBXZSBkb24ndCBzdXBwb3J0IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBHT1QgYW5kIFBMVCByZWxvY3MgeWV0LiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICByZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbF9lbmQ7Ci0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzZ290LCAqc3JlbGdvdCwgKnNyZWxvYzsKLSAgYmZkX3ZtYSAqIGxvY2FsX2dvdF9vZmZzZXRzOwotICAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIHNnb3QgPSBzcmVsZ290ID0gc3JlbG9jID0gTlVMTDsKLSAgCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotICAgICAgCi0gICAgICAvKiBTb21lIHJlbG9jcyByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFJfQVJNX0dPVDMyOgotCSAgICBjYXNlIFJfQVJNX0dPVE9GRjoKLQkgICAgY2FzZSBSX0FSTV9HT1RQQzoKLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotCSAgY2FzZSBSX0FSTV9HT1QzMjoKLQkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgICB7Ci0JICAgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgICAgfQotCi0JICAgIC8qIEdldCB0aGUgZ290IHJlbG9jYXRpb24gc2VjdGlvbiBpZiBuZWNlc3NhcnkuICAqLwotCSAgICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgICAgewotCSAgICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkKLQkgICAgICAgIC8qIElmIG5vIGdvdCByZWxvY2F0aW9uIHNlY3Rpb24sIG1ha2Ugb25lIGFuZCBpbml0aWFsaXplLiAgKi8KLQkgICAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCSAgewotCQkgICAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJICAJCQkJICAgIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCSAgICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCi0JICAgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCSAgICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0gICAgIAkgICAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCi0gICAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHNpemVfdCBzaXplOwotCQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICAgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKLQkJICB9Ci0KLQkgICAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCi0JICAgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCSAgICAgb3V0cHV0IGEgUl9BUk1fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkgICAgIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICAgIH0KLQotCSAgICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkgICAgYnJlYWs7Ci0KLSAgCSAgY2FzZSBSX0FSTV9QTFQzMjoKLQkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCi0gICAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQotICAgICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLSAgICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoaCA9PSBOVUxMKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFJfQVJNX0FCUzMyOgotCSAgY2FzZSBSX0FSTV9SRUwzMjoKLQkgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIGlzIGEgcmVsb2MKLSAgICAgICAgICAgICAgIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBvciBhIG5vbiBQQyByZWxhdGl2ZSByZWxvYwotICAgICAgICAgICAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jCi0gICAgICAgICAgICAgICBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBsaW5raW5nIHdpdGgKLSAgICAgICAgICAgICAgIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgYSByZWxvYyBhZ2FpbnN0IGEKLSAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlCi0gICAgICAgICAgICAgICBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCkuICBBdAotICAgICAgICAgICAgICAgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzCi0gICAgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldAotICAgICAgICAgICAgICAgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAotICAgICAgICAgICAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgICAgICAgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfQVJNX1BDMjQKLQkgICAgICAgIHx8IChoICE9IE5VTEwKLQkJICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCSAgICAgIHsKLQkgICAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCi0gICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkJICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAgIChhYmZkLAotCQkJICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkgCSAgICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJICAgbmFtZSArIDQpID09IDApOwotCi0JCSAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgICAgewotCQkgICAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCSAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0JCSAgfQotCi0JICAgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGFuZCB0aGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwgc28gdGhhdAotICAgICAgICAgICAgICAgICAgIHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIGVsZl9pMzg2IGxpbmtlcgotICAgICAgICAgICAgICAgICAgIGhhc2ggdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvCi0gICAgICAgICAgICAgICAgICAgYW4gZWxmX2kzODZfbGlua19oYXNoX2VudHJ5LiAgKi8KLQkgICAgICAgIGlmIChoICE9IE5VTEwgJiYgaW5mby0+c3ltYm9saWMKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfQVJNX1BDMjQpCi0JCSAgewotCQkgICAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiBlaDsKLQkJICAgIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHA7Ci0KLQkJICAgIGVoID0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkJICAgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCi0JCSAgICAgICAgYnJlYWs7Ci0KLQkJICAgIGlmIChwID09IE5VTEwpCi0JCSAgICAgIHsKLQkJICAgICAgICBwID0gKChzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKikKLQkJCSAgICAgYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAqIHApKTsKLQotCQkgICAgICAgIGlmIChwID09IE5VTEwpCi0JCQkgIHJldHVybiBmYWxzZTsKLQkJICAgICAgICBwLT5uZXh0ID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci0JCSAgICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7Ci0JCSAgICAgICAgcC0+Y291bnQgPSAwOwotCQkgICAgICB9Ci0KLQkJICAgICsrcC0+Y291bnQ7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQkgIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBhbmQgb2Zmc2V0LCBmb3IgZXJyb3IKLSAgIHJlcG9ydGluZy4gICBUaGlzIGNvZGUgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGNvZGUgaW4gZWxmLmMsIGV4Y2VwdAotICAgdGhhdCBpdCBhbHNvIGFjY2VwdHMgU1RUX0FSTV9URlVOQyBhcyBhIHN5bWJvbCB0aGF0IG5hbWVzIGEgZnVuY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUKLSAgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICogICAgICAgICAgYWJmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKiAgICAgc3ltYm9sczsKLSAgICAgYmZkX3ZtYSAgICAgICAgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqICBmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKiogIGZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqIGxpbmVfcHRyOwotewotICBib29sZWFuICAgICAgZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsKLSAgYXN5bWJvbCAqICAgIGZ1bmM7Ci0gIGJmZF92bWEgICAgICBsb3dfZnVuYzsKLSAgYXN5bWJvbCAqKiAgIHA7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0ciwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmZWxmX3RkYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzeW1ib2xzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgZnVuYyA9IE5VTEw7Ci0gIGxvd19mdW5jID0gMDsKLQotICBmb3IgKHAgPSBzeW1ib2xzOyAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgZWxmX3N5bWJvbF90eXBlICpxOwotCi0gICAgICBxID0gKGVsZl9zeW1ib2xfdHlwZSAqKSAqcDsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoJnEtPnN5bWJvbCkgIT0gc2VjdGlvbikKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChFTEZfU1RfVFlQRSAocS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCWNhc2UgU1RUX0ZJTEU6Ci0JICBmaWxlbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCZxLT5zeW1ib2wpOwotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfTk9UWVBFOgotCWNhc2UgU1RUX0ZVTkM6Ci0JY2FzZSBTVFRfQVJNX1RGVU5DOgotCSAgaWYgKHEtPnN5bWJvbC5zZWN0aW9uID09IHNlY3Rpb24KLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmMKLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZnVuYyA9IChhc3ltYm9sICopIHE7Ci0JICAgICAgbG93X2Z1bmMgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpOwotICAqbGluZV9wdHIgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgYmZkICogZHlub2JqOwotICBhc2VjdGlvbiAqIHM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAotICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDApCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFQzMiByZWxvYyBpbiBhbiBpbnB1dAotICAgICAgICAgICAgIGZpbGUsIGJ1dCB0aGUgc3ltYm9sIHdhcyBuZXZlciByZWZlcnJlZCB0byBieSBhIGR5bmFtaWMKLSAgICAgICAgICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAotICAgICAgICAgICAgIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFBDMzIKLSAgICAgICAgICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKLQkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gNDsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfQVJNX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KLSAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiAzKQotICAgIHBvd2VyX29mX3R3byA9IDM7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbC5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsCi0gICAgIFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotICAgICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2UKLSAgICAgd2lsbCBub3QgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgIGVsZjMyX2FybV9kaXNjYXJkX2NvcGllcywKLQkJCQkgIChQVFIpIE5VTEwpOwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWwuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICogdGFyZ2V0OwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCi0gICAgICAgICAgICAgICAgIHRoYW4gLnJlbC5wbHQuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsLnBsdCIpICE9IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpvdXRuYW1lOwotCi0JCSAgcmVsb2NzID0gdHJ1ZTsKLQotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMCi0JCSAgICAgZW50cnkuICBUaGUgZW50cmllcyBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbgotCQkgICAgIHJlYWxseSBhcHBseSB0byB0aGUgLmdvdCBzZWN0aW9uLCB3aGljaCB3ZQotCQkgICAgIGNyZWF0ZWQgb3Vyc2VsdmVzIGFuZCBzbyBrbm93IGlzIG5vdCByZWFkb25seS4gICovCi0JCSAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkJICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JCSAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA0KTsKLQkJICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWx0ZXh0ID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBhc2VjdGlvbiAqKiBzcHA7Ci0KLQkgIGZvciAoc3BwID0gJnMtPm91dHB1dF9zZWN0aW9uLT5vd25lci0+c2VjdGlvbnM7Ci0JICAgICAgICpzcHAgIT0gcy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgICAgIHNwcCA9ICYoKnNwcCktPm5leHQpCi0JICAgIDsKLQkgICpzcHAgPSBzLT5vdXRwdXRfc2VjdGlvbi0+bmV4dDsKLQkgIC0tcy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLT5zZWN0aW9uX2NvdW50OwotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMRU5ULAotCQkJCQkJc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGYzMl9hcm1fbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUKLSAgIGRlZmluZWQgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZQotICAgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlCi0gICByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgUFRSIGlnbm9yZTsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIHN5bTsKLXsKLSAgYmZkICogZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqIHNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqIHNyZWw7Ci0gICAgICBiZmRfdm1hIHBsdF9pbmRleDsKLSAgICAgIGJmZF92bWEgZ290X29mZnNldDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0JIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAotCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCi0JIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQotCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAotCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCi0JIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwKLSAgICAgICAgICAgICAgZWxmMzJfYXJtX3BsdF9lbnRyeSwKLQkgICAgICBQTFRfRU5UUllfU0laRSk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGdvdF9vZmZzZXQKLQkJICAgICAgIC0gc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgLSBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICAtIGgtPnBsdC5vZmZzZXQgLSAxMiksCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDEyKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQpLAotCQkgIHNnb3QtPmNvbnRlbnRzICsgZ290X29mZnNldCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fSlVNUF9TTE9UKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqIHNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0JIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBUaGUgZW50cnkgaW4KLQkgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbgotCSB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fR0xPQl9EQVQpOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgc3JlbC0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbC0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fQ09QWSk7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgcy0+Y29udGVudHMKLQkJCQkgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogc2dvdDsKLSAgYXNlY3Rpb24gKiBzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICogbmFtZTsKLQkgIGFzZWN0aW9uICogczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbC5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMU1o6Ci0JICAgICAgLyogTXkgcmVhZGluZyBvZiB0aGUgU1ZSNCBBQkkgaW5kaWNhdGVzIHRoYXQgdGhlCi0JCSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkIGJlCi0JCSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTCkuICBUaGlzIGlzCi0JCSB3aGF0IFNvbGFyaXMgZG9lcy4gIEhvd2V2ZXIsIFVuaXhXYXJlIGNhbiBub3QgaGFuZGxlCi0JCSB0aGF0IGNhc2UuICBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxTWiBlbnRyeQotCQkgaGVyZSB0byBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UKLQkJIHRoZSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsLnBsdCB0byBmb2xsb3cgYWxsCi0JCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOwotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCW1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZjMyX2FybV9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0KLSAgICAgIC8qIFVuaXhXYXJlIHNldHMgdGhlIGVudHNpemUgb2YgLnBsdCB0byA0LCBhbHRob3VnaCB0aGF0IGRvZXNuJ3QKLQkgcmVhbGx5IHNlZW0gbGlrZSB0aGUgcmlnaHQgdmFsdWUuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogbGlua19pbmZvOwotewotICBFbGZfSW50ZXJuYWxfRWhkciAqIGlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX09TQUJJXSAgICAgID0gQVJNX0VMRl9PU19BQklfVkVSU0lPTjsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9BQklWRVJTSU9OXSA9IEFSTV9FTEZfQUJJX1ZFUlNJT047Ci19Ci0KLQotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX2FybQotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9BUk0KLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHg4MDAwCi0KLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAJZWxmMzJfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgCWVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCWVsZjMyX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEJZWxmMzJfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlICAgIGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgCWVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfZmluZF9uZWFyZXN0X2xpbmUJICAgICAgICBlbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUgICAgICAgICAgICAgZWxmMzJfYXJtX2dldF9zeW1ib2xfdHlwZQotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgZWxmMzJfYXJtX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgICAgICAgICAgZWxmMzJfYXJtX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgICAgIGVsZjMyX2FybV9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAJZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCWVsZjMyX2FybV9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCWVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwllbGYzMl9hcm1fc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCWVsZjMyX2FybV9wb3N0X3Byb2Nlc3NfaGVhZGVycwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAgICAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAgICAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAgICAwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfRU5UUllfU0laRQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZDEwdi5jIGIvYmZkL2VsZjMyLWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4MGJhZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZDEwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM0ICswLDAgQEAKLS8qIEQxMFYtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLS8qICNpbmNsdWRlICJlbGYvZDEwdi5oIiAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBkMTB2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci0KLQotLyogVXNlIFJFTCBpbnN0ZWFkIG9mIFJFTEEgdG8gc2F2ZSBzcGFjZSAqLwotI2RlZmluZSBVU0VfUkVMCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX0QxMFZfTk9ORSA9IDAsCi0gIFJfRDEwVl8xMF9QQ1JFTF9SLAotICBSX0QxMFZfMTBfUENSRUxfTCwKLSAgUl9EMTBWXzE2LAotICBSX0QxMFZfMTgsCi0gIFJfRDEwVl8xOF9QQ1JFTCwKLSAgUl9EMTBWXzMyLAotICBSX0QxMFZfR05VX1ZUSU5IRVJJVCwKLSAgUl9EMTBWX0dOVV9WVEVOVFJZLAotICBSX0QxMFZfbWF4Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfZDEwdl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9EMTBWX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBQQyBSZWxhdGl2ZSAxMC1iaXQgcmVsb2NhdGlvbiwgc2hpZnRlZCBieSAyICAqLwotICAvKiByaWdodCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xMF9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xMF9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJICAgICAgICAvKiBzcmNfbWFzayAqLwotCSAweGZmLCAgIAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMiAgKi8KLSAgLyogbGVmdCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xMF9QQ1JFTF9MLAkvKiB0eXBlICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotCSAxNSwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTBfUENSRUxfTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwN2Y4MDAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLwotCSAweDA3ZjgwMDAsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QxMFZfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDE4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIDIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xOCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxOCBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAyICAqLwotICBIT1dUTyAoUl9EMTBWXzE4X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDEwVl8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfRDEwVl9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9EMTBWX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9EMTBWX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9EMTBWX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAKLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gRDEwViBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZDEwdl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLSBzdGF0aWMgY29uc3Qgc3RydWN0IGQxMHZfcmVsb2NfbWFwIGQxMHZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0QxMFZfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SLCBSX0QxMFZfMTBfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wsIFJfRDEwVl8xMF9QQ1JFTF9MIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX0QxMFZfMTYgfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xOCwgUl9EMTBWXzE4IH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwsIFJfRDEwVl8xOF9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9EMTBWXzMyIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX0QxMFZfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfRDEwVl9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChkMTB2X3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBkMTB2X3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChkMTB2X3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfZDEwdl9ob3d0b190YWJsZVtkMTB2X3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRDEwViBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotZDEwdl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMTBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QxMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZjMyX2QxMHZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfRDEwVl9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIGQxMHYgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2QxMHZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0QxMFZfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYSBEMTBWIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl90eXBlID09IFJfRDEwVl9HTlVfVlRFTlRSWQotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX0QxMFZfR05VX1ZUSU5IRVJJVCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IGVsZl9kMTB2X2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCX0KLSAgICAgIAotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgMDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZDEwdgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19EMTBWCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2QxMHZfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWQxMHYiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JICAgICAgICAgICAgIDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCSAgICAgICAgICAgICBkMTB2X2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCSAgICAgICAgICAgICAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgICAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICBlbGYzMl9kMTB2X2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgICAgICAgZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICBlbGYzMl9kMTB2X2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICAgZWxmMzJfZDEwdl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAgICAgICAgICAxCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1kMzB2LmMgYi9iZmQvZWxmMzItZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBlOWU5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1kMzB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyogRDMwVi1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X2luZm9fdG9faG93dG9fcmVsYQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9kMzB2X3JlbG9jIFBBUkFNUyAoKAotICAgICBiZmQgKmFiZmQsCi0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICBhc3ltYm9sICpzeW1ib2wsCi0gICAgIFBUUiBkYXRhLAotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEgUEFSQU1TICgoCi0gICAgIGJmZCAqYWJmZCwKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgIGFzeW1ib2wgKnN5bWJvbCwKLSAgICAgUFRSIGRhdGEsCi0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7Ci0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX0QzMFZfTk9ORSA9IDAsCi0gIFJfRDMwVl82LAotICBSX0QzMFZfOV9QQ1JFTCwKLSAgUl9EMzBWXzlfUENSRUxfUiwKLSAgUl9EMzBWXzE1LAotICBSX0QzMFZfMTVfUENSRUwsCi0gIFJfRDMwVl8xNV9QQ1JFTF9SLAotICBSX0QzMFZfMjEsCi0gIFJfRDMwVl8yMV9QQ1JFTCwKLSAgUl9EMzBWXzIxX1BDUkVMX1IsCi0gIFJfRDMwVl8zMiwKLSAgUl9EMzBWXzMyX1BDUkVMLAotICBSX0QzMFZfMzJfTk9STUFMLAotICBSX0QzMFZfbWF4Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfZDMwdl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9EMzBWX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl82LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl82IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDkgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzlfUENSRUwsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfOV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDkgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzlfUENSRUxfUiwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl85X1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1LAkJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzE1IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1X1BDUkVMLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1X1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzE1X1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAyMSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAzICovCi0gIEhPV1RPIChSX0QzMFZfMjEsCQkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMjEiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIxIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8yMV9QQ1JFTCwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMjFfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjEgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMywgaW4gdGhlIFJpZ2h0IGNvbnRhaW5lciAqLwotICBIT1dUTyAoUl9EMzBWXzIxX1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxX1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgRDMwViAzMiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMzBWXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDMyIGJpdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfMzJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzMyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZ3VsYXIgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl8zMl9OT1JNQUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8zMl9OT1JNQUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotI2RlZmluZSBNSU4zMiAobG9uZyBsb25nKTB4ZmZmZmZmZmY4MDAwMDAwMExMCi0jZGVmaW5lIE1BWDMyIDB4N2ZmZmZmZmZMTAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2QzMHZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBsb25nIGxvbmcgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbjEsIGluMiwgbnVtOwotICBiZmRfdm1hIHRtcF9hZGRyID0gMDsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBpbnQgbWFrZV9hYnNvbHV0ZSA9IDA7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsgCi0KLSAgLyogYSBoYWNrZWQtdXAgdmVyc2lvbiBvZiBiZmRfcGVyZm9ybV9yZWxvYygpIGZvbGxvd3MgKi8KLSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotICBpZiAob3V0cHV0X2JmZCkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgdG1wX2FkZHIgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkrIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgICAgcmVsb2NhdGlvbiAtPSB0bXBfYWRkcjsKLSAgICB9Ci0gIAotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gZmxhZzsKLSAgICB9Ci0gIGVsc2UKLSAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgCi0gIGluMSA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGluMiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkciArIDQpOwotCi0gIC8qIGV4dHJhY3QgdGhlIGFkZGVuZCAqLwotICBudW0gPSAoKGluMiAmIDB4M0ZGRkYpCi0JIHwgKChpbjIgJiAweEZGMDAwMDApID4+IDIpCi0JIHwgKChpbjEgJiAweDNGKSA8PCAyNikpOwotICBpbjEgJj0gMHhGRkZGRkZDMDsKLSAgaW4yID0gMHg4MDAwMDAwMDsKLSAgCi0gIHJlbG9jYXRpb24gKz0gbnVtOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSAmJiBob3d0by0+Yml0c2l6ZSA9PSAzMikKLSAgICB7Ci0gICAgICAvKiB0aGUgRDMwViBoYXMgYSBQQyB0aGF0IGRvZXNuJ3Qgd3JhcCBhbmQgUEMtcmVsYXRpdmUganVtcHMgKi8KLSAgICAgIC8qIGFyZSBzaWduZWQsIHNvIGEgUEMtcmVsYXRpdmUganVtcCBjYW4ndGJlIG1vcmUgdGhhbiArLy0gMl4zMSBieXJ0ZXMgKi8KLSAgICAgIC8qIGlmIG9uZSBleGNlZWRzIHRoaXMsIGNoYW5nZSBpdCB0byBhbiBhYnNvbHV0ZSBqdW1wICovCi0gICAgICBpZiAocmVsb2NhdGlvbiA+IE1BWDMyKQotCXsKLQkgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiArIHRtcF9hZGRyKSAmIDB4ZmZmZmZmZmY7Ci0JICBtYWtlX2Fic29sdXRlID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChyZWxvY2F0aW9uIDwgTUlOMzIpCi0JewotCSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uICsgdG1wX2FkZHIpICYgMHhmZmZmZmZmZjsKLQkgIG1ha2VfYWJzb2x1dGUgPSAxOwotCX0KLSAgICB9Ci0gIAotICBpbjEgfD0gKHJlbG9jYXRpb24gPj4gMjYpICYgMHgzRjsJLyogdG9wIDYgYml0cyAqLwotICBpbjIgfD0gKChyZWxvY2F0aW9uICYgMHgwM0ZDMDAwMCkgPDwgMik7ICAvKiBuZXh0IDggYml0cyAqLyAKLSAgaW4yIHw9IHJlbG9jYXRpb24gJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KLSAgCi0gIC8qIGNoYW5nZSBhIFBDLXJlbGF0aXZlIGluc3RydWN0aW9uIHRvIGl0cyBhYnNvbHV0ZSBlcXVpdmFsZW50ICovCi0gIC8qIHdpdGggdGhpcyBzaW1wbGUgaGFjayAqLwotICBpZiAobWFrZV9hYnNvbHV0ZSkKLSAgICBpbjEgfD0gMHgwMDEwMDAwMDsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBpbjEsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluMiwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyICsgNCk7Ci0gIAotICByZXR1cm4gZmxhZzsKLX0gICAKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2QzMHZfcmVsb2NfMjEgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW4xLCBudW07Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgaW50IG1hc2ssIG1heDsKLQotICByID0gYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLSAgaWYgKHIgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQotICAgIHJldHVybiByOyAKLQotICAvKiBhIGhhY2tlZC11cCB2ZXJzaW9uIG9mIGJmZF9wZXJmb3JtX3JlbG9jKCkgZm9sbG93cyAqLwotIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGZsYWcgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChvdXRwdXRfYmZkKQotICAgIG91dHB1dF9iYXNlID0gMDsKLSAgZWxzZQotICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gZmxhZzsKLSAgICB9Ci0gIGVsc2UKLSAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgCi0gIGluMSA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgbWFzayA9ICAoMSA8PCBob3d0by0+Yml0c2l6ZSkgLSAxOwotICBpZiAoaG93dG8tPmJpdHNpemUgPT0gNikKLSAgICBtYXNrIDw8PSAxMjsKLSAgbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplICsgMikpIC0gMTsKLQotICAvKiBleHRyYWN0IHRoZSBhZGRlbmQgKi8KLSAgbnVtID0gaW4xICYgbWFzazsgIC8qIDE4IGJpdHMgKi8KLSAgaWYgKGhvd3RvLT5iaXRzaXplID09IDYpCi0gICAgbnVtID4+PSAxMjsKLSAgbnVtIDw8PSAzOyAvKiBzaGlmdCBsZWZ0IDMgKi8KLSAgaW4xICY9IH5tYXNrOyAgLyogbWFzayBvdXQgYWRkZW5kICovCi0KLSAgcmVsb2NhdGlvbiArPSBudW07Ci0gIGlmIChob3d0by0+dHlwZSA9PSBSX0QzMFZfMjFfUENSRUxfUiB8fCBob3d0by0+dHlwZSA9PSBSX0QzMFZfMTVfUENSRUxfUiB8fAotICAgICAgaG93dG8tPnR5cGUgPT0gUl9EMzBWXzlfUENSRUxfUiApCi0gICAgewotICAgICAgcmVsb2NhdGlvbiArPSA0OwotICAgIH0KLQotICBpZiAoKGludClyZWxvY2F0aW9uIDwgMCApCi0gICAgewotICAgICAgaWYgKH4oaW50KXJlbG9jYXRpb24gPiBtYXgpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGludClyZWxvY2F0aW9uID4gbWF4KQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICByZWxvY2F0aW9uID4+PSAzOyAKLSAgaWYgKGhvd3RvLT5iaXRzaXplID09IDYpCi0gICAgaW4xIHw9ICgocmVsb2NhdGlvbiAmIChtYXNrID4+IDEyKSkgPDwgMTIpOwotICBlbHNlCi0gICAgaW4xIHw9IHJlbG9jYXRpb24gJiBtYXNrOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGluMSwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgCi0gIHJldHVybiBmbGFnOwotfSAgIAotCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEQzMFYgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGQzMHZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZDMwdl9yZWxvY19tYXAgZDMwdl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfRDMwVl9OT05FLCB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzYsIFJfRDMwVl82IH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCwgUl9EMzBWXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IsIFJfRDMwVl85X1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8xNSwgUl9EMzBWXzE1IH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwsIFJfRDMwVl8xNV9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsIFJfRDMwVl8xNV9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMjEsIFJfRDMwVl8yMSB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMLCBSX0QzMFZfMjFfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SLCBSX0QzMFZfMjFfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzMyLCBSX0QzMFZfMzIgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTCwgUl9EMzBWXzMyX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX0QzMFZfMzJfTk9STUFMIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGQzMHZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGQzMHZfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGQzMHZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9kMzB2X2hvd3RvX3RhYmxlW2QzMHZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMzBWIEVMRiByZWxvYyAodHlwZSBSRUwpLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfRDMwVl9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9kMzB2X2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRDMwViBFTEYgcmVsb2MgKHR5cGUgUkVMQSkuICAqLwotCi1zdGF0aWMgdm9pZAotZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0QzMFZfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfZDMwdl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9kMzB2Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0QzMFYKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfZDMwdl92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItZDMwdiIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwlkMzB2X2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJZDMwdl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcJMAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZnIzMC5jIGIvYmZkL2VsZjMyLWZyMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4NzI1Zi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsODExICswLDAgQEAKLS8qIEZSMzAtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9mcjMwLmgiCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZnIzMF9lbGZfaTIwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmcjMwX2VsZl9pMzJfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGZyMzBfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBmcjMwX2VsZl9nY19zd2VlcF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKiBmcjMwX2VsZl9nY19tYXJrX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBmcjMwX2VsZl9ob3d0b190YWJsZSBbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjAgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzIwLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZnIzMF9lbGZfaTIwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMjAiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGYwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGludG8gNDggYml0cyBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF80OCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGZyMzBfZWxmX2kzMl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzQ4IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzZfSU5fNCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfNl9JTl80IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEFuIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzhfSU5fOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOF9JTl84IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEEgOSBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfOV9JTl84LAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDQsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF85X0lOXzgiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogQSAxMCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfMTBfSU5fOCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMTBfSU5fOCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwZmYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBQQyByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDEuICAqLwotICBIT1dUTyAoUl9GUjMwXzlfUENSRUwsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDksCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgMTIgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMS4gICovCi0gIEhPV1RPIChSX0ZSMzBfMTJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzEyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRlIzMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfRlIzMF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRlIzMF9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gCi19OwotDAotLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfRlIzMF8yMCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZWxmX2kyMF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgYXJlbGVudCAqICByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqICBzeW1ib2w7Ci0gICAgIFBUUiAgICAgICAgZGF0YTsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKiAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogICAgZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHg7Ci0gIAotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPQotICAgIHN5bWJvbC0+dmFsdWUKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY2F0aW9uID4gKCgxVSA8PCAyMCkgLSAxKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICB4ID0gKHggJiAweGZmMGYwMDAwKSB8IChyZWxvY2F0aW9uICYgMHgwMDAwZmZmZikgfCAoKHJlbG9jYXRpb24gJiAweDAwMGYwMDAwKSA8PCA0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBVdGlsaXR5IHRvIGFjdHVhbGx5IHBlcmZvcm0gYSBSX0ZSMzBfNDggcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMzJfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgICAgICAgcmVsb2NhdGlvbjsKLQotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPQotICAgIHN5bWJvbC0+dmFsdWUKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHJlbG9jYXRpb24sIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyArIDIpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEZSMzAgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGZyMzBfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBpbnQgZnIzMF9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZyMzBfcmVsb2NfbWFwIGZyMzBfcmVsb2NfbWFwIFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgIFJfRlIzMF9OT05FIH0sCi0gIHsgQkZEX1JFTE9DXzgsICAgICAgICAgICAgICBSX0ZSMzBfOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzIwLCAgICAgICAgUl9GUjMwXzIwIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICBSX0ZSMzBfMzIgfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF80OCwgICAgICAgIFJfRlIzMF80OCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzZfSU5fNCwgICAgUl9GUjMwXzZfSU5fNCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzhfSU5fOCwgICAgUl9GUjMwXzhfSU5fOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzlfSU5fOCwgICAgUl9GUjMwXzlfSU5fOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzEwX0lOXzgsICAgUl9GUjMwXzEwX0lOXzggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF85X1BDUkVMLCAgIFJfRlIzMF85X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwsICBSX0ZSMzBfMTJfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfRlIzMF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICBSX0ZSMzBfR05VX1ZURU5UUlkgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWZyMzBfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSBzaXplb2YgKGZyMzBfcmVsb2NfbWFwKSAvIHNpemVvZiAoZnIzMF9yZWxvY19tYXBbMF0pOwotICAgICAgIC0taTspCi0gICAgaWYgKGZyMzBfcmVsb2NfbWFwIFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0gICAgICByZXR1cm4gJiBmcjMwX2VsZl9ob3d0b190YWJsZSBbZnIzMF9yZWxvY19tYXBbaV0uZnIzMF9yZWxvY192YWxdOwotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRlIzMCBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0ZSMzBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW3JfdHlwZV07Ci19Ci0MCi0vKiBQZXJmb3JtIGEgc2luZ2xlIHJlbG9jYXRpb24uICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgc3RhbmRhcmQgQkZECi0gICByb3V0aW5lcywgYnV0IGEgZmV3IHJlbG9jcywgd2UgaGF2ZSB0byBkbyB0aGVtIG91cnNlbHZlcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICB4OwotICBiZmRfc2lnbmVkX3ZtYQlzcmVsOwotICAKLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0ZSMzBfMjA6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0KLSAgICAgIGlmIChyZWxvY2F0aW9uID4gKCgxIDw8IDIwKSAtIDEpKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZmYwZjAwMDApIHwgKHJlbG9jYXRpb24gJiAweDAwMDBmZmZmKSB8ICgocmVsb2NhdGlvbiAmIDB4MDAwZjAwMDApIDw8IDQpOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9GUjMwXzQ4OgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMjsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF85X1BDUkVMOgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMTsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7ICAvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLwotICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBpZiAoc3JlbCA+ICgoMSA8PCA4KSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCA4KSkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHNyZWwgPj4gMSwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF8xMl9QQ1JFTDoKLSAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7IC8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgYWRkIDIgdG8gdGhlIFBDLi4uICovCi0gICAgICBzcmVsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJICAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIGlmIChzcmVsID4gKCgxIDw8IDExKSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCAxMSkpKQotCSAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmODAwKSB8ICgoc3JlbCA+PiAxKSAmIDB4N2ZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotICAgIH0KLQotICByZXR1cm4gcjsKLX0KLQotDAotLyogUmVsb2NhdGUgYW4gRlIzMCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZQotICAgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgICBsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHJlbGVuZCAgICAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwgKyspCi0gICAgewotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOwotICAgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTDsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOwotICAgICAgCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIAotICAgICAgaWYgKCAgIHJfdHlwZSA9PSBSX0ZSMzBfR05VX1ZUSU5IRVJJVAotCSAgfHwgcl90eXBlID09IFJfRlIzMF9HTlVfVlRFTlRSWSkKLQljb250aW51ZTsKLSAgICAgIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0gICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIAotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBob3d0byAgPSBmcjMwX2VsZl9ob3d0b190YWJsZSArIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaCAgICAgID0gTlVMTDsKLSAgICAgIHN5bSAgICA9IE5VTEw7Ci0gICAgICBzZWMgICAgPSBOVUxMOwotICAgICAgCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JICAKLQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYykgOiBuYW1lOwotI2lmIDAKLQkgIGZwcmludGYgKHN0ZGVyciwgImxvY2FsOiBzZWM6ICVzLCBzeW06ICVzICglZCksIHZhbHVlOiAleCArICV4ICsgJXggYWRkZW5kICV4XG4iLAotCQkgICBzZWMtPm5hbWUsIG5hbWUsIHN5bS0+c3RfbmFtZSwKLQkJICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsCi0JCSAgIHN5bS0+c3RfdmFsdWUsIHJlbC0+cl9hZGRlbmQpOwotI2VuZGlmCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzIFtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgCi0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgImRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzLCB2YWx1ZTogJXggKyAleCArICV4IGdpdmVzOiAleFxuIiwKLQkJICAgICAgIHNlYy0+bmFtZSwgbmFtZSwgaC0+cm9vdC51LmRlZi52YWx1ZSwKLQkJICAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LCByZWxvY2F0aW9uKTsKLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAidW5kZWZpbmVkOiBzZWM6ICVzLCBuYW1lOiAlc1xuIiwKLQkJICAgICAgIHNlYy0+bmFtZSwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotI2lmIDAKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJ1bmtub3duOiBuYW1lOiAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgciA9IGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgIGNvbnRlbnRzLCByZWwsIHJlbG9jYXRpb24pOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIE5VTEw7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICByID0gaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdwotCQkoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wKLQkJKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG1zZykKLQkgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+d2FybmluZwotCSAgICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmICghIHIpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWZyMzBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICBpbmZvOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgIHJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfRlIzMF9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9GUjMwX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZyMzBfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotZnIzMF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9GUjMwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0ZSMzBfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2ZyMzAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfRlIzMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9mcjMwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1mcjMwIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCU5VTEwKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQlmcjMwX2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJZnIzMF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCWZyMzBfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgICAgIGZyMzBfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWZyMzBfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWdlbi5jIGIvYmZkL2VsZjMyLWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWQzNWFlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1nZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIEdlbmVyaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgc2hvdWxkIGJlCi0gICBnb29kIGVub3VnaCBmb3IgR0RCIG9yIG9iamR1bXAgdG8gcmVhZCB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGR1bW15ID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVU5LTk9XTiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZWxmX3JlbG9jOwotewotICBiZmRfcmVsb2MtPmhvd3RvID0gJmR1bW15OwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1iaWciCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfdW5rbm93bgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9OT05FCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0b19yZWwKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWhwcGEuYyBiL2JmZC9lbGYzMi1ocHBhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDIwY2QuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWhwcGEuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMzkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUCBQQS1SSVNDIEVMRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkKLQotCUNlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotCURlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZQotCVVuaXZlcnNpdHkgb2YgVXRhaAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2hwcGEuaCIKLSNpbmNsdWRlICJsaWJocHBhLmgiCi0jaW5jbHVkZSAiZWxmMzItaHBwYS5oIgotI2RlZmluZSBBUkNIX1NJWkUJCTMyCi0jaW5jbHVkZSAiZWxmLWhwcGEuaCIKLQotCi0vKiBXZSB1c2UgdGhyZWUgZGlmZmVyZW50IGhhc2ggdGFibGVzIHRvIGhvbGQgaW5mb3JtYXRpb24gZm9yCi0gICBsaW5raW5nIFBBIEVMRiBvYmplY3RzLgotCi0gICBUaGUgZmlyc3QgaXMgdGhlIGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlIHdoaWNoIGlzIGRlcml2ZWQKLSAgIGZyb20gdGhlIHN0YW5kYXJkIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gIFdlIHVzZSB0aGlzIGFzIGEgcGxhY2UgdG8KLSAgIGF0dGFjaCBvdGhlciBoYXNoIHRhYmxlcyBhbmQgc3RhdGljIGluZm9ybWF0aW9uLgotCi0gICBUaGUgc2Vjb25kIGlzIHRoZSBzdHViIGhhc2ggdGFibGUgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIHRoZQotICAgYmFzZSBCRkQgaGFzaCB0YWJsZS4gIFRoZSBzdHViIGhhc2ggdGFibGUgaG9sZHMgdGhlIGluZm9ybWF0aW9uCi0gICBuZWNlc3NhcnkgdG8gYnVpbGQgdGhlIGxpbmtlciBzdHVicyBkdXJpbmcgYSBsaW5rLiAgKi8KLQotLyogSGFzaCB0YWJsZSBmb3IgbGlua2VyIHN0dWJzLiAgKi8KLQotc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5Ci17Ci0gIC8qIEJhc2UgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUsIHdlIGNhbiBnZXQgdGhlIG5hbWUgb2YgdGhlIHN0dWIKLSAgICAgKGFuZCB0aHVzIGtub3cgZXhhY3RseSB3aGF0IGFjdGlvbnMgaXQgcGVyZm9ybXMpIGZyb20gdGhlIGJhc2UKLSAgICAgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc3R1Yi4gICovCi0gIGJmZF92bWEgb2Zmc2V0OwotCi0gIC8qIEdpdmVuIHRoZSBzeW1ib2wncyB2YWx1ZSBhbmQgaXRzIHNlY3Rpb24gd2UgY2FuIGRldGVybWluZSBpdHMgZmluYWwKLSAgICAgdmFsdWUgd2hlbiBidWlsZGluZyB0aGUgc3R1YnMgKHNvIHRoZSBzdHViIGtub3dzIHdoZXJlIHRvIGp1bXAuICAqLwotICBzeW12YWx1ZSB0YXJnZXRfdmFsdWU7Ci0gIGFzZWN0aW9uICp0YXJnZXRfc2VjdGlvbjsKLX07Ci0KLXN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZQotewotICAvKiBUaGUgaGFzaCB0YWJsZSBpdHNlbGYuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgc3R1YiBCRkQuICAqLwotICBiZmQgKnN0dWJfYmZkOwotCi0gIC8qIFdoZXJlIHRvIHBsYWNlIHRoZSBuZXh0IHN0dWIuICAqLwotICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0KLSAgLyogQ3VycmVudCBvZmZzZXQgaW4gdGhlIHN0dWIgc2VjdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KLX07Ci0KLXN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZTsKLQotICAvKiBBIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygb3V0cHV0IHN5bWJvbHMuICAqLwotICB1bnNpZ25lZCBpbnQgb3V0cHV0X3N5bWJvbF9jb3VudDsKLQotICAvKiBTdHVmZiBzbyB3ZSBjYW4gaGFuZGxlIERQIHJlbGF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgbG9uZyBnbG9iYWxfdmFsdWU7Ci0gIGludCBnbG9iYWxfc3ltX2RlZmluZWQ7Ci19OwotCi0vKiBFTEYzMi9IUFBBIHJlbG9jYXRpb24gc3VwcG9ydAotCi0JVGhpcyBmaWxlIGNvbnRhaW5zIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0IGFzIHNwZWNpZmllZAotCWluIHRoZSBTdHJhdHVzIEZUWC9Hb2xmIE9iamVjdCBGaWxlIEZvcm1hdCAoU0VELTE3NjIpIGRhdGVkCi0JRmVicnVhcnkgMTk5NC4gICovCi0KLSNpbmNsdWRlICJlbGYzMi1ocHBhLmgiCi0jaW5jbHVkZSAiaHBwYV9zdHVicy5oIgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBsb25nLAotCSAgIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIGJvb2xlYW4gaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBhc2VjdGlvbiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX2J1aWxkX29uZV9zdHViIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlbGYzMl9ocHBhX3NpemVfb2Zfc3R1YgotICBQQVJBTVMgKChiZmRfdm1hLCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX3ZtYSwgY2hhciAqKSk7Ci0KLS8qIEZvciBsaW5rZXIgc3R1YiBoYXNoIHRhYmxlcy4gICovCi0jZGVmaW5lIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0jZGVmaW5lIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKSBcCi0gIChiZmRfaGFzaF90cmF2ZXJzZSBcCi0gICAoJih0YWJsZSktPnJvb3QsIFwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksIFwKLSAgICAoaW5mbykpKQotCi0vKiBGb3IgSFBQQSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KVwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfZW50cnkgKikJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIFBBIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLQotLyogQXNzb3J0ZWQgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICAqLwotCi0vKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+b2Zmc2V0ID0gMDsKLSAgICAgIHJldC0+dGFyZ2V0X3ZhbHVlID0gMDsKLSAgICAgIHJldC0+dGFyZ2V0X3NlY3Rpb24gPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBzdHViIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIHN0dWJfYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKnN0dWJfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+b2Zmc2V0ID0gMDsKLSAgdGFibGUtPmxvY2F0aW9uID0gMDsKLSAgdGFibGUtPnN0dWJfYmZkID0gc3R1Yl9iZmQ7Ci0gIHJldHVybiAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBuZXdmdW5jKSk7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZSBQQSBFTEYgcG9ydCB1c2VzIHRoZSBkZXJpdmVkCi0gICBoYXNoIHRhYmxlIHRvIGtlZXAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIFBBIEVMRiBsaW5rZXIgKHdpdGhvdXQKLSAgIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMpLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXQtPnN0dWJfaGFzaF90YWJsZSA9IE5VTEw7Ci0gIHJldC0+b3V0cHV0X3N5bWJvbF9jb3VudCA9IDA7Ci0gIHJldC0+Z2xvYmFsX3ZhbHVlID0gMDsKLSAgcmV0LT5nbG9iYWxfc3ltX2RlZmluZWQgPSAwOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIFJlbG9jYXRlIHRoZSBnaXZlbiBJTlNOIGdpdmVuIHRoZSB2YXJpb3VzIGlucHV0IHBhcmFtZXRlcnMuCi0KLSAgIEZJWE1FOiBlbmRpYW5uZXNzIGFuZCBzaXplb2YgKGxvbmcpIGlzc3VlcyBhYm91bmQgaGVyZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1ocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChhYmZkLCBpbnB1dF9zZWN0LCBpbnNuLCBhZGRyZXNzLCBzeW1fdmFsdWUsCi0JCQlyX2FkZGVuZCwgcl9mb3JtYXQsIHJfZmllbGQsIHBjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0OwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgICAgbG9uZyBzeW1fdmFsdWU7Ci0gICAgIGxvbmcgcl9hZGRlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9maWVsZDsKLSAgICAgdW5zaWduZWQgbG9uZyBwY3JlbDsKLXsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGUgPSBnZXRfb3Bjb2RlIChpbnNuKTsKLSAgbG9uZyBjb25zdGFudF92YWx1ZTsKLQotICBzd2l0Y2ggKG9wY29kZSkKLSAgICB7Ci0gICAgY2FzZSBMRE86Ci0gICAgY2FzZSBMREI6Ci0gICAgY2FzZSBMREg6Ci0gICAgY2FzZSBMRFc6Ci0gICAgY2FzZSBMRFdNOgotICAgIGNhc2UgU1RCOgotICAgIGNhc2UgU1RIOgotICAgIGNhc2UgU1RXOgotICAgIGNhc2UgU1RXTToKLSAgICBjYXNlIENPTUlDTFI6Ci0gICAgY2FzZSBTVUJJOgotICAgIGNhc2UgQURESVQ6Ci0gICAgY2FzZSBBRERJOgotICAgIGNhc2UgTERJTDoKLSAgICBjYXNlIEFERElMOgotICAgICAgY29uc3RhbnRfdmFsdWUgPSBIUFBBX1JfQ09OU1RBTlQgKHJfYWRkZW5kKTsKLQotICAgICAgaWYgKHBjcmVsKQotCXN5bV92YWx1ZSAtPSBhZGRyZXNzOwotCi0gICAgICBzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCk7Ci0gICAgICByZXR1cm4gaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHN5bV92YWx1ZSwgcl9mb3JtYXQpOwotCi0gICAgY2FzZSBCTDoKLSAgICBjYXNlIEJFOgotICAgIGNhc2UgQkxFOgotICAgICAgLyogWFhYIGNvbXB1dGluZyBjb25zdGFudF92YWx1ZSBpcyBub3QgbmVlZGVkPz8/ICovCi0gICAgICBjb25zdGFudF92YWx1ZSA9IGFzc2VtYmxlXzE3ICgoaW5zbiAmIDB4MDAxZjAwMDApID4+IDE2LAotCQkJCSAgICAoaW5zbiAmIDB4MDAwMDFmZmMpID4+IDIsCi0JCQkJICAgIGluc24gJiAxKTsKLQotICAgICAgY29uc3RhbnRfdmFsdWUgPSAoY29uc3RhbnRfdmFsdWUgPDwgMTUpID4+IDE1OwotICAgICAgaWYgKHBjcmVsKQotCXsKLQkgIHN5bV92YWx1ZSAtPQotCSAgICBhZGRyZXNzICsgaW5wdXRfc2VjdC0+b3V0cHV0X29mZnNldAotCSAgICArIGlucHV0X3NlY3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAtOCwgcl9maWVsZCk7Ci0JfQotICAgICAgZWxzZQotCXN5bV92YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIGNvbnN0YW50X3ZhbHVlLCByX2ZpZWxkKTsKLQotICAgICAgcmV0dXJuIGhwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCBzeW1fdmFsdWUgPj4gMiwgcl9mb3JtYXQpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChvcGNvZGUgPT0gMCkKLQl7Ci0JICBjb25zdGFudF92YWx1ZSA9IEhQUEFfUl9DT05TVEFOVCAocl9hZGRlbmQpOwotCi0JICBpZiAocGNyZWwpCi0JICAgIHN5bV92YWx1ZSAtPSBhZGRyZXNzOwotCi0JICByZXR1cm4gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEhQUEEgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc3ltX3NlYy0+b3V0cHV0X29mZnNldDsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgPyAwIDogc3ltLT5zdF92YWx1ZSkKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGluZHg7Ci0KLQkgIGluZHggPSByX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHN5bV9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQlzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBlbHNlCi0JewotCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKLQkgIGlmIChzeW1fbmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoKnN5bV9uYW1lID09ICdcMCcpCi0JICAgIHN5bV9uYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzeW1fc2VjKTsKLQl9Ci0KLSAgICAgIHIgPSBlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJICAgICAgcmVsLT5yX29mZnNldCwgcmVsb2NhdGlvbiwKLQkJCQkJICAgICAgcmVsLT5yX2FkZGVuZCwgaW5mbywgc3ltX3NlYywKLQkJCQkJICAgICAgc3ltX25hbWUsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBEUCByZWxhdGl2ZSByZWxvY3MgaWYgJGdsb2JhbCQgaXMKLQkgICAgICAgdW5kZWZpbmVkLiAgVGhpcyBpcyBhIHBhbmljIHNpdHVhdGlvbiBzbyB3ZSBkb24ndCB0cnkKLQkgICAgICAgdG8gY29udGludWUuICAqLwotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCAiJGdsb2JhbCQiLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgewotCQkvKiBXZSB1c2UgdGhpcyByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBwZXJmb3JtZWQKLQkJICAgYSAiZGFuZ2Vyb3VzIiByZWxvY2F0aW9uLiAgVGhpcyBkb2Vzbid0IG1lYW4gd2UgZGlkCi0JCSAgIHRoZSB3cm9uZyB0aGluZywgaXQganVzdCBtZWFucyB0aGVyZSBtYXkgYmUgc29tZSBjbGVhbnVwCi0JCSAgIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBoZXJlLgotCi0JCSAgIEluIHBhcnRpY3VsYXIgd2UgaGFkIHRvIHN3YXAgdGhlIGxhc3QgY2FsbCBpbnNuIGFuZCBpdHMKLQkJICAgZGVsYXkgc2xvdC4gIElmIHRoZSBkZWxheSBzbG90IGluc24gbmVlZGVkIGEgcmVsb2NhdGlvbiwKLQkJICAgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkanVzdCB0aGUgbmV4dCByZWxvY2F0aW9uIGVudHJ5J3MKLQkJICAgb2Zmc2V0IHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgdGhlIGluc24gbW92ZWQuCi0KLQkJICAgVGhpcyBoYWlyIHdvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZiB3ZSBpbnNlcnRlZCBzdHVicwotCQkgICBiZXR3ZWVuIHByb2NlZHVyZXMgYW5kIHVzZWQgYSAiYmwiIHRvIGdldCB0byB0aGUgc3R1Yi4gICovCi0JCWlmIChyZWwgIT0gcmVsZW5kKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9SZWxhICpuZXh0X3JlbCA9IHJlbCArIDE7Ci0KLQkJICAgIGlmIChyZWwtPnJfb2Zmc2V0ICsgNCA9PSBuZXh0X3JlbC0+cl9vZmZzZXQpCi0JCSAgICAgIG5leHRfcmVsLT5yX29mZnNldCAtPSA0OwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgKGluZm8sIHN5bV9uYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWN0dWFsbHkgcGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICBUaGlzIGNhbiBnZXQKLSAgIHJhdGhlciBoYWlyeSB3aGVuIGxpbmtlciBzdHVicyBhcmUgbmVlZGVkLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJICAgIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgc3ltX25hbWUsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICBpbnQgaXNfbG9jYWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyByX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgdW5zaWduZWQgbG9uZyByX2Zvcm1hdCA9IGhvd3RvLT5iaXRzaXplOwotICB1bnNpZ25lZCBsb25nIHJfZmllbGQgPSBlX2ZzZWw7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OwotICBib29sZWFuIHJfcGNyZWwgPSBob3d0by0+cGNfcmVsYXRpdmU7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsdWUgZm9yICRnbG9iYWwkLiAgRklYTUUgaXNuJ3QgdGhpcyBlZmZlY3RpdmVseQotICAgICBqdXN0IGxpa2UgdGhlIGdwIHBvaW50ZXIgb24gTUlQUz8gIENhbiB3ZSB1c2UgdGhvc2Ugcm91dGluZXMgZm9yIHRoaXMKLSAgICAgcHVycG9zZT8gICovCi0gIGlmICghZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3N5bV9kZWZpbmVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksICIkZ2xvYmFsJCIsIGZhbHNlLAotCQkJCSBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpc24ndCBhICRnbG9iYWwkLCB0aGVuIHdlJ3JlIGluIGRlZXAgdHJvdWJsZS4gICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICAvKiBJZiAkZ2xvYmFsJCBpc24ndCBhIGRlZmluZWQgc3ltYm9sLCB0aGVuIHdlJ3JlIHN0aWxsIGluIGRlZXAKLQkgdHJvdWJsZS4gICovCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQlyZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF9zeW1fZGVmaW5lZCA9IDE7Ci0gICAgfQotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUEFSSVNDX05PTkU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QQVJJU0NfRElSMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxN0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3QzoKLSAgICAgIHJfZmllbGQgPSBlX2ZzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjFMOgotICAgICAgcl9maWVsZCA9IGVfbHJzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNFI6Ci0gICAgICByX2ZpZWxkID0gZV9ycnNlbDsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotCi0gICAgLyogRm9yIGFsbCB0aGUgRFAgcmVsYXRpdmUgcmVsb2NhdGlvbnMsIHdlIG5lZWQgdG8gZXhhbWluZSB0aGUgc3ltYm9sJ3MKLSAgICAgICBzZWN0aW9uLiAgSWYgaXQncyBhIGNvZGUgc2VjdGlvbiwgdGhlbiAiZGF0YSBwb2ludGVyIHJlbGF0aXZlIiBtYWtlcwotICAgICAgIG5vIHNlbnNlLiAgSW4gdGhhdCBjYXNlIHdlIGRvbid0IGFkanVzdCB0aGUgInZhbHVlIiwgYW5kIGZvciAyMSBiaXQKLSAgICAgICBhZGRpbCBpbnN0cnVjdGlvbnMsIHdlIGNoYW5nZSB0aGUgc291cmNlIGFkZGVuZCByZWdpc3RlciBmcm9tICVkcCB0bwotICAgICAgICVyMC4gICovCi0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDIxTDoKLSAgICAgIHJfZmllbGQgPSBlX2xyc2VsOwotICAgICAgaWYgKHN5bV9zZWMtPmZsYWdzICYgU0VDX0NPREUpCi0JewotCSAgaWYgKChpbnNuICYgMHhmYzAwMDAwMCkgPj4gMjYgPT0gMHhhCi0JICAgICAgICYmIChpbnNuICYgMHgwM2UwMDAwMCkgPj4gMjEgPT0gMHgxYikKLQkgICAgaW5zbiAmPSB+MHgwM2UwMDAwMDsKLQl9Ci0gICAgICBlbHNlCi0JdmFsdWUgLT0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0UjoKLSAgICAgIHJfZmllbGQgPSBlX3Jyc2VsOwotICAgICAgaWYgKChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNEY6Ci0gICAgICByX2ZpZWxkID0gZV9mc2VsOwotICAgICAgaWYgKChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotCi0gICAgLyogVGhlc2UgY2FzZXMgYXJlIHNlcGFyYXRlIGFzIHRoZXkgbWF5IGludm9sdmUgYSBsb3QgbW9yZSB3b3JrCi0gICAgICAgdG8gZGVhbCB3aXRoIGxpbmtlciBzdHVicy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwzMjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMQUJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMQUJFTDE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgotICAgICAgewotCWJmZF92bWEgbG9jYXRpb247Ci0JdW5zaWduZWQgaW50IGxlbiwgY2FsbGVyX2FyZ3MsIGNhbGxlZV9hcmdzOwotCWNoYXIgKm5ld19uYW1lLCAqc3R1Yl9uYW1lOwotCi0JLyogR2V0IHRoZSBmaWVsZCBzZWxlY3RvciByaWdodC4gIFdlJ2xsIG5lZWQgaXQgaW4gYSBtaW51dGUuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxN0YKLQkgICAgfHwgcl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDMyKQotCSAgcl9maWVsZCA9IGVfZnNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMjFMKQotCSAgcl9maWVsZCA9IGVfbHJzZWw7Ci0JZWxzZSBpZiAocl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDE0UikKLQkgIHJfZmllbGQgPSBlX3Jyc2VsOwotCi0JLyogRmluZCBvdXQgd2hlcmUgd2UgYXJlIGFuZCB3aGVyZSB3ZSdyZSBnb2luZy4gICovCi0JbG9jYXRpb24gPSAob2Zmc2V0ICsKLQkJICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCQkgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQlsZW4gPSBzdHJsZW4gKHN5bV9uYW1lKSArIDE7Ci0JaWYgKGlzX2xvY2FsKQotCSAgbGVuICs9IDk7Ci0JbmV3X25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotCWlmICghbmV3X25hbWUpCi0JICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQlzdHJjcHkgKG5ld19uYW1lLCBzeW1fbmFtZSk7Ci0KLQkvKiBMb2NhbCBzeW1ib2xzIGhhdmUgdW5pcXVlIElEcy4gICovCi0JaWYgKGlzX2xvY2FsKQotCSAgc3ByaW50ZiAobmV3X25hbWUgKyBsZW4gLSAxMCwgIl8lMDh4IiwgKGludClzeW1fc2VjKTsKLQotCS8qIEFueSBraW5kIG9mIGxpbmtlciBzdHViIG5lZWRlZD8gICovCi0JaWYgKCgoaW50KSh2YWx1ZSAtIGxvY2F0aW9uKSA+IDB4M2ZmZmYpCi0JICAgIHx8ICgoaW50KSh2YWx1ZSAtIGxvY2F0aW9uKSA8IChpbnQpMHhmZmZjMDAwMCkpCi0JICB7Ci0JICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotCSAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnN0dWJfaGFzaDsKLQkgICAgYXNlY3Rpb24gKnN0dWJfc2VjdGlvbjsKLQotCSAgICAvKiBCdWlsZCBhIG5hbWUgZm9yIHRoZSBzdHViLiAgKi8KLQotCSAgICBsZW4gPSBzdHJsZW4gKG5ld19uYW1lKTsKLQkgICAgbGVuICs9IDIzOwotCSAgICBzdHViX25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotCSAgICBpZiAoIXN0dWJfbmFtZSkKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgICAgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIgKGxvY2F0aW9uLCB2YWx1ZSwgc3R1Yl9uYW1lKTsKLQkgICAgc3RyY2F0IChzdHViX25hbWUsIG5ld19uYW1lKTsKLQkgICAgZnJlZSAobmV3X25hbWUpOwotCi0JICAgIHN0dWJfaGFzaF90YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLQotCSAgICBzdHViX2hhc2gKLQkgICAgICA9IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCAoc3R1Yl9oYXNoX3RhYmxlLCBzdHViX25hbWUsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlKTsKLQotCSAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhhdCBuYW1lLiAgKi8KLQkgICAgZnJlZSAoc3R1Yl9uYW1lKTsKLQotCSAgICAvKiBUaGUgc3R1YiBCRkQgb25seSBoYXMgb25lIHNlY3Rpb24uICAqLwotCSAgICBzdHViX3NlY3Rpb24gPSBzdHViX2hhc2hfdGFibGUtPnN0dWJfYmZkLT5zZWN0aW9uczsKLQotCSAgICBpZiAoc3R1Yl9oYXNoICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdGKQotCQkgIHsKLQkJICAgIHVuc2lnbmVkIGxvbmcgZGVsYXlfaW5zbjsKLQkJICAgIHVuc2lnbmVkIGludCBvcGNvZGUsIHJ0bl9yZWcsIGxkb190YXJnZXRfcmVnLCBsZG9fc3JjX3JlZzsKLQotCQkgICAgLyogV2UnbGwgbmVlZCB0byBwZWVrIGF0IHRoZSBuZXh0IGluc24uICAqLwotCQkgICAgZGVsYXlfaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyA0KTsKLQkJICAgIG9wY29kZSA9IGdldF9vcGNvZGUgKGRlbGF5X2luc24pOwotCi0JCSAgICAvKiBXZSBhbHNvIG5lZWQgdG8ga25vdyB0aGUgcmV0dXJuIHJlZ2lzdGVyIGZvciB0aGlzCi0JCSAgICAgICBjYWxsLiAgKi8KLQkJICAgIHJ0bl9yZWcgPSAoaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxOwotCi0JCSAgICBsZG9fc3JjX3JlZyA9IChkZWxheV9pbnNuICYgMHgwM2UwMDAwMCkgPj4gMjE7Ci0JCSAgICBsZG9fdGFyZ2V0X3JlZyA9IChkZWxheV9pbnNuICYgMHgwMDFmMDAwMCkgPj4gMTY7Ci0KLQkJICAgIC8qIE11bmdlIHVwIHRoZSB2YWx1ZSBhbmQgb3RoZXIgcGFyYW1ldGVycyBmb3IKLQkJICAgICAgIGhwcGFfZWxmX3JlbG9jYXRlX2luc24uICAqLwotCi0JCSAgICB2YWx1ZSA9IChzdHViX2hhc2gtPm9mZnNldAotCQkJICAgICArIHN0dWJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICArIHN0dWJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAgIHJfZm9ybWF0ID0gMTc7Ci0JCSAgICByX2ZpZWxkID0gZV9mc2VsOwotCQkgICAgcl9wY3JlbCA9IDA7Ci0JCSAgICBhZGRlbmQgPSAwOwotCi0JCSAgICAvKiBXZSBuZWVkIHRvIHBlZWsgYXQgdGhlIGRlbGF5IGluc24gYW5kIGRldGVybWluZSBpZgotCQkgICAgICAgd2UnbGwgbmVlZCB0byBzd2FwIHRoZSBicmFuY2ggYW5kIGl0cyBkZWxheSBpbnNuLiAgKi8KLQkJICAgIGlmICgoaW5zbiAmIDIpCi0JCQl8fCAob3Bjb2RlID09IExETwotCQkJICAgICYmIGxkb190YXJnZXRfcmVnID09IHJ0bl9yZWcpCi0JCQl8fCAoZGVsYXlfaW5zbiA9PSAweDA4MDAwMjQwKSkKLQkJICAgICAgewotCQkJLyogTm8gbmVlZCB0byBzd2FwIHRoZSBicmFuY2ggYW5kIGl0cyBkZWxheSBzbG90LCBidXQKLQkJCSAgIHdlIGRvIG5lZWQgdG8gbWFrZSBzdXJlIHRvIGp1bXAgcGFzdCB0aGUgcmV0dXJuCi0JCQkgICBwb2ludGVyIHVwZGF0ZSBpbiB0aGUgc3R1Yi4gICovCi0JCQl2YWx1ZSArPSA0OwotCi0JCQkvKiBJZiB0aGUgZGVsYXkgaW5zbiBkb2VzIGEgcmV0dXJuIHBvaW50ZXIgYWRqdXN0bWVudCwKLQkJCSAgIHRoZW4gd2UgaGF2ZSB0byBtYWtlIHN1cmUgaXQgc3RheXMgdmFsaWQuICAqLwotCQkJaWYgKG9wY29kZSA9PSBMRE8KLQkJCSAgICAmJiBsZG9fdGFyZ2V0X3JlZyA9PSBydG5fcmVnKQotCQkJICB7Ci0JCQkgICAgZGVsYXlfaW5zbiAmPSAweGZjMDBmZmZmOwotCQkJICAgIGRlbGF5X2luc24gfD0gKCgzMSA8PCAyMSkgfCAoMzEgPDwgMTYpKTsKLQkJCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGRlbGF5X2luc24sIGhpdF9kYXRhICsgNCk7Ci0JCQkgIH0KLQkJCS8qIFVzZSBhIEJMRSB0byByZWFjaCB0aGUgc3R1Yi4gICovCi0JCQlpbnNuID0gQkxFX1NSNF9SMDsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBXb25kZXJmdWwsIHdlIGhhdmUgdG8gc3dhcCB0aGUgY2FsbCBpbnNuIGFuZCBpdHMKLQkJCSAgIGRlbGF5IHNsb3QuICAqLwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBkZWxheV9pbnNuLCBoaXRfZGF0YSk7Ci0JCQkvKiBVc2UgYSBCTEUsbiB0byByZWFjaCB0aGUgc3R1Yi4gICovCi0JCQlpbnNuID0gKEJMRV9TUjRfUjAgfCAweDIpOwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSArIDQpOwotCQkJaW5zbiA9IGhwcGFfZWxmX3JlbG9jYXRlX2luc24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJICAgICAgIGluc24sIG9mZnNldCArIDQsCi0JCQkJCQkgICAgICAgdmFsdWUsIGFkZGVuZCwKLQkJCQkJCSAgICAgICByX2Zvcm1hdCwgcl9maWVsZCwKLQkJCQkJCSAgICAgICByX3BjcmVsKTsKLQkJCS8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0JCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGhpdF9kYXRhICsgNCk7Ci0JCQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICAgIGVsc2UKLQkJICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgICAgICB9Ci0JICB9Ci0JZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgICB9Ci0KLWRvX2Jhc2ljX3R5cGVfMToKLSAgICAgIGluc24gPSBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGluc24sCi0JCQkJICAgICBvZmZzZXQsIHZhbHVlLCBhZGRlbmQsIHJfZm9ybWF0LAotCQkJCSAgICAgcl9maWVsZCwgcl9wY3JlbCk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNvbWV0aGluZyB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUuICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIHRoZSBpbnN0cnVjdGlvbiB3b3JkLiAgKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gIHJldHVybiAoYmZkX3JlbG9jX29rKTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgU1lNIHJlcHJlc2VudHMgYSBsb2NhbCBsYWJlbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKLX0KLQotLyogVW5kbyB0aGUgZ2VuZXJpYyBFTEYgY29kZSdzIHN1YnRyYWN0aW9uIG9mIHNlY3Rpb24tPnZtYSBmcm9tIHRoZQotICAgdmFsdWUgb2YgZWFjaCBleHRlcm5hbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3A7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgKnZhbHAgKz0gKCpzZWNwKS0+dm1hOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBzdHViIG5lZWRlZCB0byBwZXJmb3JtIGEgY2FsbCBhc3N1bWluZyB0aGUKLSAgIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBmb3IgY2FsbGVyIGFuZCBjYWxsZWUgYXJlIGluIENBTExFUiBhbmQgQ0FMTEVFCi0gICBmb3IgYSBjYWxsIGZyb20gTE9DQVRJT04gdG8gREVTVElOQVRJT04uICBDb3B5IHRoZSBuYW1lIGludG8gU1RVQl9OQU1FLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChsb2NhdGlvbiwgZGVzdGluYXRpb24sIHN0dWJfbmFtZSkKLSAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247Ci0gICAgIGNoYXIgKnN0dWJfbmFtZTsKLXsKLSAgc3RyY3B5IChzdHViX25hbWUsICJfX19fX2xvbmdfYnJhbmNoX3N0dWJfIik7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHN0dWIgbmVlZGVkIHRvIGNhbGwgZnJvbSBMT0NBVElPTiB0byBERVNUSU5BVElPTgotICAgKGEgZnVuY3Rpb24gbmFtZWQgU1lNX05BTUUpLCB3aXRoIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBDQUxMRVIgYW5kCi0gICBDQUxMRUUuICBSZXR1cm4gemVybyBpZiBubyBzdHViIGlzIG5lZWRlZCB0byBwZXJmb3JtIHN1Y2ggYSBjYWxsLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZWxmMzJfaHBwYV9zaXplX29mX3N0dWIgKGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3ltX25hbWUpCi0gICAgIGJmZF92bWEgbG9jYXRpb24sIGRlc3RpbmF0aW9uOwotICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLXsKLSAgLyogRGV0ZXJtaW5lIGlmIGEgbG9uZyBicmFuY2ggc3R1YiBpcyBuZWVkZWQuICAqLwotICBpZiAoISgoKGludCkobG9jYXRpb24gLSBkZXN0aW5hdGlvbikgPiAweDNmZmZmKQotCXx8ICgoaW50KShsb2NhdGlvbiAtIGRlc3RpbmF0aW9uKSA8IChpbnQpMHhmZmZjMDAwMCkpKQotICAgIHJldHVybiAwOwotCi0gIGlmICghc3RybmNtcCAoIiQkIiwgc3ltX25hbWUsIDIpCi0gICAgICAmJiBzdHJjbXAgKCIkJGR5bmNhbGwiLCBzeW1fbmFtZSkpCi0gICAgcmV0dXJuIDEyOwotICBlbHNlCi0gICAgcmV0dXJuIDE2OwotfQotCi0vKiBCdWlsZCBvbmUgbGlua2VyIHN0dWIgYXMgZGVmaW5lZCBieSB0aGUgc3R1YiBoYXNoIHRhYmxlIGVudHJ5IEdFTl9FTlRSWS4KLSAgIElOX0FSR1MgY29udGFpbnMgdGhlIHN0dWIgQkZEIGFuZCBsaW5rIGluZm8gcG9pbnRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiAoZ2VuX2VudHJ5LCBpbl9hcmdzKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmdlbl9lbnRyeTsKLSAgICAgUFRSIGluX2FyZ3M7Ci17Ci0gIHZvaWQgKiphcmdzID0gKHZvaWQgKiopaW5fYXJnczsKLSAgYmZkICpzdHViX2JmZCA9IChiZmQgKilhcmdzWzBdOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWFyZ3NbMV07Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotICBiZmRfYnl0ZSAqbG9jOwotICBzeW12YWx1ZSBzeW1fdmFsdWU7Ci0gIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0gIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgdG8gdGhlIHN0dWIgaGFzaCB0YWJsZSwgdGhlIHBhcnRpY3VsYXIgZW50cnkgd2UKLSAgICAgYXJlIGJ1aWxkaW5nIGEgc3R1YiBmb3IsIGFuZCB3aGVyZSAoaW4gbWVtb3J5KSB3ZSBzaG91bGQgcGxhY2UgdGhlIHN0dWIKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotICBzdHViX2hhc2hfdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLSAgbG9jID0gc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbjsKLQotICAvKiBNYWtlIGEgbm90ZSBvZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgc3R1YnMgZm9yIHRoaXMgZW50cnkuICAqLwotICBlbnRyeS0+b2Zmc2V0ID0gc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQ7Ci0KLSAgLyogVGhlIHN5bWJvbCdzIG5hbWUgc3RhcnRzIGF0IG9mZnNldCAyMi4gICovCi0gIHN5bV9uYW1lID0gZW50cnktPnJvb3Quc3RyaW5nICsgMjI7Ci0KLSAgc3ltX3ZhbHVlID0gKGVudHJ5LT50YXJnZXRfdmFsdWUKLQkgICAgICAgKyBlbnRyeS0+dGFyZ2V0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBlbnRyeS0+dGFyZ2V0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0gIGlmICgxKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBvbmUgb2YgdHdvIHZhcmlhbnQgbG9uZyBicmFuY2ggc3R1YnMuICBPbmUgZm9yICQkZHluY2FsbCBhbmQKLQkgbm9ybWFsIGNhbGxzLCB0aGUgb3RoZXIgZm9yIGNhbGxzIHRvIG1pbGxpY29kZS4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgICBpbnQgbWlsbGljb2RlX2NhbGwgPSAwOwotCi0gICAgICBpZiAoIXN0cm5jbXAgKCIkJCIsIHN5bV9uYW1lLCAyKSAmJiBzdHJjbXAgKCIkJGR5bmNhbGwiLCBzeW1fbmFtZSkpCi0JbWlsbGljb2RlX2NhbGwgPSAxOwotCi0gICAgICAvKiBGaXJzdCB0aGUgcmV0dXJuIHBvaW50ZXIgYWRqdXN0bWVudC4gIERlcGVuZGluZyBvbiBleGFjdCBjYWxsaW5nCi0JIHNlcXVlbmNlIHRoaXMgaW5zdHJ1Y3Rpb24gbWF5IGJlIHNraXBwZWQuICAqLwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExET19NNF9SMzFfUjMxLCBsb2MpOwotCi0gICAgICAvKiBUaGUgbmV4dCB0d28gaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgbG9uZyBicmFuY2ggaXRzZWxmLiAgQSBsb25nIGJyYW5jaAotCSBpcyBmb3JtZWQgd2l0aCAibGRpbCIgbG9hZGluZyB0aGUgdXBwZXIgYml0cyBvZiB0aGUgdGFyZ2V0IGFkZHJlc3MKLQkgaW50byBhIHJlZ2lzdGVyLCB0aGVuIGJyYW5jaGluZyB3aXRoICJiZSIgd2hpY2ggYWRkcyBpbiB0aGUgbG93ZXIgYml0cy4KLQkgTG9uZyBicmFuY2hlcyB0byBtaWxsaWNvZGUgbnVsbGlmeSB0aGUgZGVsYXkgc2xvdCBvZiB0aGUgImJlIi4gICovCi0gICAgICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLCBMRElMX1IxLAotCQkJCWhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIDAsIGVfbHJzZWwpLCAyMSk7Ci0gICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jICsgNCk7Ci0gICAgICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLCBCRV9TUjRfUjEgfCAobWlsbGljb2RlX2NhbGwgPyAyIDogMCksCi0JCQkJaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgMCwgZV9ycnNlbCkgPj4gMiwKLQkJCQkxNyk7Ci0gICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jICsgOCk7Ci0KLSAgICAgIGlmICghbWlsbGljb2RlX2NhbGwpCi0JewotCSAgLyogVGhlIHNlcXVlbmNlIHRvIGNhbGwgdGhpcyBzdHViIHBsYWNlcyB0aGUgcmV0dXJuIHBvaW50ZXIgaW50byAlcjMxLAotCSAgICAgdGhlIGZpbmFsIHRhcmdldCBleHBlY3RzIHRoZSByZXR1cm4gcG9pbnRlciBpbiAlcjIsIHNvIGNvcHkgdGhlCi0JICAgICAgcmV0dXJuIHBvaW50ZXIgaW50byB0aGUgcHJvcGVyIHJlZ2lzdGVyLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBDT1BZX1IzMV9SMiwgbG9jICsgMTIpOwotCi0JICAvKiBVcGRhdGUgdGhlIGxvY2F0aW9uIGFuZCBvZmZzZXRzLiAgKi8KLQkgIHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb24gKz0gMTY7Ci0JICBzdHViX2hhc2hfdGFibGUtPm9mZnNldCArPSAxNjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXBkYXRlIHRoZSBsb2NhdGlvbiBhbmQgb2Zmc2V0cy4gICovCi0JICBzdHViX2hhc2hfdGFibGUtPmxvY2F0aW9uICs9IDEyOwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQgKz0gMTI7Ci0JfQotCi0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRXh0ZXJuYWwgZW50cnkgcG9pbnRzIGZvciBzaXppbmcgYW5kIGJ1aWxkaW5nIGxpbmtlciBzdHVicy4gICovCi0KLS8qIEJ1aWxkIGFsbCB0aGUgc3R1YnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG91dHB1dCBmaWxlLiAgVGhlCi0gICBzdHVicyBhcmUga2VwdCBpbiBhIGhhc2ggdGFibGUgYXR0YWNoZWQgdG8gdGhlIG1haW4gbGlua2VyIGhhc2gKLSAgIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGhwcGFlbGZfZmluaXNoIGluIHRoZSBsaW5rZXIuICAqLwotCi1ib29sZWFuCi1lbGYzMl9ocHBhX2J1aWxkX3N0dWJzIChzdHViX2JmZCwgaW5mbykKLSAgICAgYmZkICpzdHViX2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIC8qIFRoZSBzdHViIEJGRCBvbmx5IGhhcyBvbmUgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpzdHViX3NlYyA9IHN0dWJfYmZkLT5zZWN0aW9uczsKLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICp0YWJsZTsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHZvaWQgKmFyZ3NbMl07Ci0KLSAgLyogU28gd2UgY2FuIHBhc3MgYm90aCB0aGUgQkZEIGZvciB0aGUgc3R1YnMgYW5kIHRoZSBsaW5rIGluZm8KLSAgICAgc3RydWN0dXJlIHRvIHRoZSByb3V0aW5lIHdoaWNoIGFjdHVhbGx5IGJ1aWxkcyBzdHVicy4gICovCi0gIGFyZ3NbMF0gPSBzdHViX2JmZDsKLSAgYXJnc1sxXSA9IGluZm87Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIGxpbmtlciBzdHVicy4gICovCi0gIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMpOwotICBzdHViX3NlYy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChzdHViX2JmZCwgc2l6ZSk7Ci0gIGlmIChzdHViX3NlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHRhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGluZm8pLT5zdHViX2hhc2hfdGFibGU7Ci0gIHRhYmxlLT5sb2NhdGlvbiA9IHN0dWJfc2VjLT5jb250ZW50czsKLQotICAvKiBCdWlsZCB0aGUgc3R1YnMgYXMgZGlyZWN0ZWQgYnkgdGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0gIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RyYXZlcnNlICh0YWJsZSwgZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiwgYXJncyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSBhbmQgc2V0IHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gZm9yIGEgZmluYWwgbGluay4KLQotICAgVGhlIGJhc2ljIGlkZWEgaGVyZSBpcyB0byBleGFtaW5lIGFsbCB0aGUgcmVsb2NhdGlvbnMgbG9va2luZyBmb3IKLSAgIFBDLXJlbGF0aXZlIGNhbGxzIHRvIGEgdGFyZ2V0IHRoYXQgaXMgdW5yZWFjaGFibGUgd2l0aCBhICJibCIKLSAgIGluc3RydWN0aW9uIG9yIGNhbGxzIHdoZXJlIHRoZSBjYWxsZXIgYW5kIGNhbGxlZSBkaXNhZ3JlZSBvbiB0aGUKLSAgIGxvY2F0aW9uIG9mIHRoZWlyIGFyZ3VtZW50cyBvciByZXR1cm4gdmFsdWUuICAqLwotCi1ib29sZWFuCi1lbGYzMl9ocHBhX3NpemVfc3R1YnMgKHN0dWJfYmZkLCBvdXRwdXRfYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqc3R1Yl9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkICppbnB1dF9iZmQ7Ci0gIGFzZWN0aW9uICpzZWN0aW9uLCAqc3R1Yl9zZWMgPSAwOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywgKmlzeW0sICoqYWxsX2xvY2FsX3N5bXM7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0X3N5bXMsICplc3ltOwotICB1bnNpZ25lZCBpbnQgaSwgaW5kZXgsIGJmZF9jb3VudCA9IDA7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlID0gMDsKLQotICAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0gIHN0dWJfaGFzaF90YWJsZSA9ICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICopCi0JCSAgICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUpKSk7Ci0gIGlmICghc3R1Yl9oYXNoX3RhYmxlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdCAoc3R1Yl9oYXNoX3RhYmxlLCBzdHViX2JmZCwKLQkJCQkJZWxmMzJfaHBwYV9zdHViX2hhc2hfbmV3ZnVuYykpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQXR0YWNoIHRoZSBoYXNoIHRhYmxlcyB0byB0aGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPnN0dWJfaGFzaF90YWJsZSA9IHN0dWJfaGFzaF90YWJsZTsKLQotICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGlucHV0IEJGRHMuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkczsKLSAgICAgICBpbnB1dF9iZmQgIT0gTlVMTDsKLSAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCkKLSAgICAgYmZkX2NvdW50Kys7Ci0KLSAgLyogTWFnaWMgYXMgd2Uga25vdyB0aGUgc3R1YiBiZmQgb25seSBoYXMgb25lIHNlY3Rpb24uICAqLwotICBzdHViX3NlYyA9IHN0dWJfYmZkLT5zZWN0aW9uczsKLQotICAvKiBJZiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLCB0aGVuIHdlIGRvbid0Ci0gICAgIGhhdmUgdG8gZXhhbWluZSB0aGUgcmVsb2NzLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0gICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWxsIHRoZSBnbG9iYWwKLSAgICAgZnVuY3Rpb25zIHdlIGNhbiBzdGFydCBsb29raW5nIGZvciBzdHVicy4gICovCi0gIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzLCBpbmRleCA9IDA7Ci0gICAgICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQsIGluZGV4KyspCi0gICAgewotICAgICAgLyogV2UnbGwgbmVlZCB0aGUgc3ltYm9sIHRhYmxlIGluIGEgc2Vjb25kLiAgKi8KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICAgICAgaWYgKHN5bXRhYl9oZHItPnNoX2luZm8gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgbG9jYWxfc3ltcyA9IGFsbF9sb2NhbF9zeW1zW2luZGV4XTsKLQotICAgICAgLyogV2FsayBvdmVyIGVhY2ggc2VjdGlvbiBhdHRhY2hlZCB0byB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgICAgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgc2VjdGlvbiAhPSBOVUxMOwotCSAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICppbnB1dF9yZWxfaGRyOwotCSAgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqZXh0ZXJuYWxfcmVsb2NzLCAqZXJlbGFlbmQsICplcmVsYTsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MsICppcmVsYWVuZCwgKmlyZWxhOwotCi0JICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcywgdGhlbiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLwotCSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgICAgIHx8IHNlY3Rpb24tPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zLiAgKi8KLQkgIGV4dGVybmFsX3JlbG9jcwotCSAgICA9ICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCSAgICAgICBiZmRfbWFsbG9jIChzZWN0aW9uLT5yZWxvY19jb3VudAotCQkJICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSk7Ci0JICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIExpa2V3aXNlIGZvciB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbnMuICAqLwotCSAgaW50ZXJuYWxfcmVsb2NzCi0JICAgID0gKChFbGZfSW50ZXJuYWxfUmVsYSAqKQotCSAgICAgICBiZmRfbWFsbG9jIChzZWN0aW9uLT5yZWxvY19jb3VudCAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpKSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLQkgIGlucHV0X3JlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbF9oZHI7Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgaW5wdXRfcmVsX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGlucHV0X3JlbF9oZHItPnNoX3NpemUsCi0JCQkgICBpbnB1dF9iZmQpICE9IGlucHV0X3JlbF9oZHItPnNoX3NpemUpCi0JICAgIHsKLQkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBTd2FwIGluIHRoZSByZWxvY3MuICAqLwotCSAgZXJlbGEgPSBleHRlcm5hbF9yZWxvY3M7Ci0JICBlcmVsYWVuZCA9IGVyZWxhICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBlcmVsYSA8IGVyZWxhZW5kOyBlcmVsYSsrLCBpcmVsYSsrKQotCSAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4gKGlucHV0X2JmZCwgZXJlbGEsIGlyZWxhKTsKLQotCSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBleHRlcm5hbCByZWxvY3MsIGZyZWUgdGhlbS4gICovCi0JICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCi0JICAvKiBOb3cgZXhhbWluZSBlYWNoIHJlbG9jYXRpb24uICAqLwotCSAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBpcmVsYWVuZCA9IGlyZWxhICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKykKLQkgICAgewotCSAgICAgIGxvbmcgcl90eXBlLCBzaXplX29mX3N0dWI7Ci0JICAgICAgdW5zaWduZWQgbG9uZyByX2luZGV4OwotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotCSAgICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqc3R1Yl9oYXNoOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQkgICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgICAgICBzeW12YWx1ZSBzeW1fdmFsdWU7Ci0JICAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247Ci0JICAgICAgY2hhciAqbmV3X25hbWUgPSBOVUxMOwotCi0JICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpcmVsYS0+cl9pbmZvKTsKLQkgICAgICByX2luZGV4ID0gRUxGMzJfUl9TWU0gKGlyZWxhLT5yX2luZm8pOwotCi0JICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi0JCXsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogT25seSBsb29rIGZvciBzdHVicyBvbiBjYWxsIGluc3RydWN0aW9ucyBvciBwbGFiZWwKLQkJIHJlZmVyZW5jZXMuICAqLwotCSAgICAgIGlmIChyX3R5cGUgIT0gUl9QQVJJU0NfUENSRUwxN0YKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMzIKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMjFMCi0JCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDE0UikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3cgZGV0ZXJtaW5lIHRoZSBjYWxsIHRhcmdldCwgaXRzIG5hbWUsIHZhbHVlLCBzZWN0aW9uCi0JCSBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzLiAgKi8KLQkgICAgICBoYXNoID0gTlVMTDsKLQkgICAgICBzeW0gPSBOVUxMOwotCSAgICAgIHN5bV9zZWMgPSBOVUxMOwotCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJewotCQkgIC8qIEl0J3MgYSBsb2NhbCBzeW1ib2wuICAqLwotCQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkJICBzeW0gPSBsb2NhbF9zeW1zICsgcl9pbmRleDsKLQkJICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGlucHV0X2JmZClbc3ltLT5zdF9zaG5keF07Ci0JCSAgc3ltX3NlYyA9IGhkci0+YmZkX3NlY3Rpb247Ci0JCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCQkgIHN5bV92YWx1ZSA9IChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgICAgID8gMCA6IHN5bS0+c3RfdmFsdWUpOwotCQkgIGRlc3RpbmF0aW9uID0gKHN5bV92YWx1ZQotCQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgbG9jYWwKLQkJICAgICBzeW1ib2wgaW4gdGhlIHN0dWIgb3IgYXJnIGluZm8gaGFzaCB0YWJsZXMuICAqLwotCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCSAgaWYgKG5ld19uYW1lID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBJdCdzIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JCSAgbG9uZyBpbmRleDsKLQotCQkgIGluZGV4ID0gcl9pbmRleCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgaGFzaCA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZGV4XTsKLQkJICBpZiAoaGFzaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoYXNoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgewotCQkgICAgICBzeW1fc2VjID0gaGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICBzeW1fbmFtZSA9IGhhc2gtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCSAgICAgIHN5bV92YWx1ZSA9IGhhc2gtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIGRlc3RpbmF0aW9uID0gKHN5bV92YWx1ZQotCQkJCSAgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBOb3cgZGV0ZXJtaW5lIHdoZXJlIHRoZSBjYWxsIHBvaW50IGlzLiAgKi8KLQkgICAgICBsb2NhdGlvbiA9IChzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlyZWxhLT5yX29mZnNldCk7Ci0KLQkgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGRlc3RpbmF0aW9uIGZvciBQQ1JFTCBmdW5jdGlvbgotCQkgY2FsbHMgKGVnLiB3ZSBkb24ndCBjYXJlIGZvciBQTEFCRUxTKS4gICovCi0JICAgICAgaWYgKHJfdHlwZSAhPSBSX1BBUklTQ19QQ1JFTDE3RikKLQkJbG9jYXRpb24gPSBkZXN0aW5hdGlvbjsKLQotCSAgICAgIC8qIERldGVybWluZSB3aGF0IChpZiBhbnkpIGxpbmtlciBzdHViIGlzIG5lZWRlZCBhbmQgaXRzCi0JCSBzaXplIChpbiBieXRlcykuICAqLwotCSAgICAgIHNpemVfb2Zfc3R1YiA9IGVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViIChsb2NhdGlvbiwKLQkJCQkJCSAgICAgIGRlc3RpbmF0aW9uLAotCQkJCQkJICAgICAgc3ltX25hbWUpOwotCSAgICAgIGlmIChzaXplX29mX3N0dWIgIT0gMCkKLQkJewotCQkgIGNoYXIgKnN0dWJfbmFtZTsKLQkJICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JCSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoaXMgc3R1Yi4gICovCi0JCSAgbGVuID0gc3RybGVuIChzeW1fbmFtZSk7Ci0JCSAgbGVuICs9IDIzOwotCi0JCSAgc3R1Yl9uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKLQkJICBpZiAoIXN0dWJfbmFtZSkKLQkJICAgIHsKLQkJICAgICAgLyogQmVjYXVzZSBzeW1fbmFtZSB3YXMgbWFsbG9jZCBhYm92ZSBmb3IgbG9jYWwKLQkJCSBzeW1ib2xzLiAgKi8KLQkJICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCQkJZnJlZSAobmV3X25hbWUpOwotCi0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChsb2NhdGlvbiwgZGVzdGluYXRpb24sIHN0dWJfbmFtZSk7Ci0JCSAgc3RyY2F0IChzdHViX25hbWUgKyAyMiwgc3ltX25hbWUpOwotCi0JCSAgLyogQmVjYXVzZSBzeW1fbmFtZSB3YXMgbWFsbG9jZWQgYWJvdmUgZm9yIGxvY2FsIHN5bWJvbHMuICAqLwotCQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJICAgIGZyZWUgKG5ld19uYW1lKTsKLQotCQkgIHN0dWJfaGFzaAotCQkgICAgPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9uYW1lLAotCQkJCQkJICAgZmFsc2UsIGZhbHNlKTsKLQkJICBpZiAoc3R1Yl9oYXNoICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBwcm9wZXIgc3R1YiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIG5vdGhpbmcKLQkJCSBlbHNlIHRvIGRvLiAgKi8KLQkJICAgICAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMsCi0JCQkJCSAgICAoYmZkX3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsCi0JCQkJCQkJICAgICAgIHN0dWJfc2VjKQotCQkJCQkgICAgICsgc2l6ZV9vZl9zdHViKSk7Ci0KLQkJICAgICAgLyogRW50ZXIgdGhpcyBlbnRyeSBpbnRvIHRoZSBsaW5rZXIgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLQkJICAgICAgc3R1Yl9oYXNoCi0JCQk9IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCAoc3R1Yl9oYXNoX3RhYmxlLAotCQkJCQkJICAgICAgIHN0dWJfbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCSAgICAgIGlmIChzdHViX2hhc2ggPT0gTlVMTCkKLQkJCXsKLQkJCSAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJCSAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJCSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQkJICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJCX0KLQotCQkgICAgICAvKiBXZSdsbCBuZWVkIHRoZXNlIHRvIGRldGVybWluZSB0aGUgYWRkcmVzcyB0aGF0IHRoZQotCQkJIHN0dWIgd2lsbCBicmFuY2ggdG8uICAqLwotCQkgICAgICBzdHViX2hhc2gtPnRhcmdldF92YWx1ZSA9IHN5bV92YWx1ZTsKLQkJICAgICAgc3R1Yl9oYXNoLT50YXJnZXRfc2VjdGlvbiA9IHN5bV9zZWM7Ci0JCSAgICB9Ci0JCSAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJfQotCSAgICB9Ci0JICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGludGVybmFsIHJlbG9jcywgZnJlZSB0aGVtLiAgKi8KLQkgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JfQotICAgIH0KLSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBsb2NhbCBzeW1ib2xzLCBmcmVlIHRoZW0uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0gICAgaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIC8qIFJldHVybiBncmFjZWZ1bGx5LCBhdm9pZGluZyBkYW5nbGluZyByZWZlcmVuY2VzIHRvIHRoZSBoYXNoIHRhYmxlcy4gICovCi0gIGlmIChzdHViX2hhc2hfdGFibGUpCi0gICAgewotICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPnN0dWJfaGFzaF90YWJsZSA9IE5VTEw7Ci0gICAgICBmcmVlIChzdHViX2hhc2hfdGFibGUpOwotICAgIH0KLSAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gdG8gemVybyBzaW5jZSB3ZSdyZSBuZXZlciBnb2luZwotICAgICB0byBjcmVhdGUgdGhlbS4gICBBdm9pZHMgbG9zaW5nIHdoZW4gd2UgdHJ5IHRvIGdldCBpdHMgY29udGVudHMKLSAgICAgdG9vLiAgKi8KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLCBzdHViX3NlYywgMCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTWlzYyBCRkQgc3VwcG9ydCBjb2RlLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCWhwcGFfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gICAgICAgICAgICAgICAJZWxmX2hwcGFfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgICAgICAgICAgIAllbGZfaHBwYV9pbmZvX3RvX2hvd3RvX3JlbAotCi0vKiBTdHVmZiBmb3IgdGhlIEJGRCBsaW5rZXIuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQllbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQllbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2hwcGFfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWhwcGEiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9ocHBhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUEFSSVNDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1ocHBhLmggYi9iZmQvZWxmMzItaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDk5YWE4Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBFTEYzMi9IUFBBIHN1cHBvcnQKLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0IGFzIHNwZWNpZmllZAotICAgaW4gdGhlIFN0cmF0dXMgRlRYL0dvbGYgT2JqZWN0IEZpbGUgRm9ybWF0IChTRUQtMTc2MikgZGF0ZWQKLSAgIEZlYnJ1YXJ5IDE5OTQuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnk6Ci0KLSAgIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotICAgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWgKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEYzMl9IUFBBX0gKLSNkZWZpbmUgX0VMRjMyX0hQUEFfSAotCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImxpYmhwcGEuaCIKLSNpbmNsdWRlICJlbGYvaHBwYS5oIgotCi1ib29sZWFuIGVsZjMyX2hwcGFfc2l6ZV9zdHVicwotICBQQVJBTVMgKChiZmQgKiwgYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotYm9vbGVhbiBlbGYzMl9ocHBhX2J1aWxkX3N0dWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIERlZmluZSBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAotICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAotICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KLQotICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgotICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2NhdGlvbgotICAgYXMgYXBwcm9wcmlhdGUuICBUaGlzIGFsbG93cyBHQVMgdG8gc2hhcmUgbXVjaCBtb3JlIGNvZGUKLSAgIGJldHdlZW4gdGhlIHR3byB0YXJnZXQgb2JqZWN0IGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIFJfSFBQQV9OT05FCQkJUl9QQVJJU0NfTk9ORQotI2RlZmluZSBSX0hQUEEJCQkJUl9QQVJJU0NfRElSMzIKLSNkZWZpbmUgUl9IUFBBX0dPVE9GRgkJCVJfUEFSSVNDX0RQUkVMMjFMCi0jZGVmaW5lIFJfSFBQQV9QQ1JFTF9DQUxMCQlSX1BBUklTQ19QQ1JFTDIxTAotI2RlZmluZSBSX0hQUEFfQUJTX0NBTEwJCQlSX1BBUklTQ19ESVIxN0YKLSNkZWZpbmUgUl9IUFBBX0NPTVBMRVgJCQlSX1BBUklTQ19VTklNUExFTUVOVEVECi0KLSNlbmRpZiAvKiBfRUxGMzJfSFBQQV9IICovCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTM4Ni5jIGIvYmZkL2VsZjMyLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0OTZiMS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0MyArMCwwIEBACi0vKiBJbnRlbCA4MDM4Ni84MDQ4Ni1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5My0xOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmX2kzODZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogMzg2IHVzZXMgUkVMIHJlbG9jYXRpb25zIGluc3RlYWQgb2YgUkVMQSAqLwotCi0jaW5jbHVkZSAiZWxmL2kzODYuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hvd3RvX3RhYmxlW109Ci17Ci0gIEhPV1RPKFJfMzg2X05PTkUsCSAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9OT05FIiwJICAgIHRydWUsMHgwMDAwMDAwMCwweDAwMDAwMDAwLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfMzIsCSAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl8zMiIsCSAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDMzIsCSAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzMyIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzM4Nl9HT1QzMiwJIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVDMyIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9QTFQzMiwJIDAsMiwzMix0cnVlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUExUMzIiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfQ09QWSwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9DT1BZIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR0xPQl9EQVQsICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HTE9CX0RBVCIsIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfSlVNUF9TTE9ULCAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9KVU1QX1NMT1QiLHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUkVMQVRJVkUsICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9SRUxBVElWRSIsIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR09UT0ZGLCAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HT1RPRkYiLCAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR09UUEMsICAgICAwLDIsMzIsdHJ1ZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVFBDIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIHsgMTEgfSwKLSAgeyAxMiB9LAotICB7IDEzIH0sCi0gIHsgMTQgfSwKLSAgeyAxNSB9LAotICB7IDE2IH0sCi0gIHsgMTcgfSwKLSAgeyAxOCB9LAotICB7IDE5IH0sCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwotICBIT1dUTyhSXzM4Nl8xNiwJIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2XzE2IiwJICAgIHRydWUsMHhmZmZmLDB4ZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDMTYsCSAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzE2IiwJICAgIHRydWUsMHhmZmZmLDB4ZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfOCwJIDAsMCw4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfOCIsCSAgICB0cnVlLDB4ZmYsMHhmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDOCwJIDAsMCw4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDOCIsCSAgICB0cnVlLDB4ZmYsMHhmZix0cnVlKSwKLX07Ci0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5LiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfMzg2X0dOVV9WVElOSEVSSVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfMzg2X0dOVV9WVElOSEVSSVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG8gPQotICBIT1dUTyAoUl8zODZfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSXzM4Nl9HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7Ci0KLSNpZmRlZiBERUJVR19HRU5fUkVMT0MKLSNkZWZpbmUgVFJBQ0Uoc3RyKSBmcHJpbnRmIChzdGRlcnIsICJpMzg2IGJmZCByZWxvYyBsb29rdXAgJWQgKCVzKVxuIiwgY29kZSwgc3RyKQotI2Vsc2UKLSNkZWZpbmUgVFJBQ0Uoc3RyKQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19OT05FIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9OT05FIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl8zMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX0NUT1IiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2XzMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX1BDMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1BDMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1QzMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HT1QzMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9QTFQzMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfUExUMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9DT1BZOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0NPUFkiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0NPUFkgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR0xPQl9EQVQgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1Q6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfSlVNUF9TTE9UIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9KVU1QX1NMT1QgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfUkVMQVRJVkUgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RPRkY6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UT0ZGIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HT1RPRkYgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RQQzoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HT1RQQyIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UUEMgXTsKLQotICAgICAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbi4gICovCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18xNiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfMTZdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18xNl9QQ1JFTCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfUEMxNl07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfOCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfOF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfOF9QQ1JFTCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfUEM4XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQiKTsKLSAgICAgIHJldHVybiAmZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19WVEFCTEVfRU5UUlkiKTsKLSAgICAgIHJldHVybiAmZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBUUkFDRSAoIlVua25vd24iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfaTM4Nl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkCQkqYWJmZDsKLSAgICAgYXJlbGVudAkJKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICBlbnVtIGVsZl9pMzg2X3JlbG9jX3R5cGUgdHlwZTsKLQotICB0eXBlID0gKGVudW0gZWxmX2kzODZfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIGlmICh0eXBlID09IFJfMzg2X0dOVV9WVElOSEVSSVQpCi0gICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0bzsKLSAgZWxzZSBpZiAodHlwZSA9PSBSXzM4Nl9HTlVfVlRFTlRSWSkKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bzsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBSXzM4Nl9tYXgpOwotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IEZJUlNUX0lOVkFMSURfUkVMT0MgfHwgdHlwZSA+IExBU1RfSU5WQUxJRF9SRUxPQyk7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9ob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIGxhYmVsLiAgVGhlIFVuaXhXYXJlCi0gICAyLjEgY2MgZ2VuZXJhdGVzIHRlbXBvcmFyeSBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCAuWCwgc28gd2UKLSAgIHJlY29nbml6ZSB0aGVtIGhlcmUuICBGSVhNRTogZG8gb3RoZXIgU1ZSNCBjb21waWxlcnMgYWxzbyB1c2UgLlg/LgotICAgSWYgc28sIHdlIHNob3VsZCBtb3ZlIHRoZSAuWCByZWNvZ25pdGlvbiBpbnRvCi0gICBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ1gnKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIGkzODYgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9saWJjLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTYKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGFuIGFic29sdXRlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UKLSAgIHRoaXMuICBTZWUgdGhlIFNWUjQgQUJJIGkzODYgc3VwcGxlbWVudCB0byBzZWUgaG93IHRoaXMgd29ya3MuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGx0MF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweDM1LAkvKiBwdXNobCBjb250ZW50cyBvZiBhZGRyZXNzICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiAuZ290ICsgNC4gICovCi0gIDB4ZmYsIDB4MjUsCS8qIGptcCBpbmRpcmVjdCAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgLmdvdCArIDguICAqLwotICAwLCAwLCAwLCAwCS8qIHBhZCBvdXQgdG8gMTYgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGFuIGFic29sdXRlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZQotICAgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9wbHRfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHgyNSwJLyogam1wIGluZGlyZWN0ICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiB0aGlzIHN5bWJvbCBpbiAuZ290LiAgKi8KLSAgMHg2OCwJCS8qIHB1c2hsIGltbWVkaWF0ZSAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLwotICAweGU5LAkJLyogam1wIHJlbGF0aXZlICovCi0gIDAsIDAsIDAsIDAJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3RhcnQgb2YgLnBsdC4gICovCi19OwotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSBQSUMgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGljX3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHhiMywgNCwgMCwgMCwgMCwJLyogcHVzaGwgNCglZWJ4KSAqLwotICAweGZmLCAweGEzLCA4LCAwLCAwLCAwLAkvKiBqbXAgKjgoJWVieCkgKi8KLSAgMCwgMCwgMCwgMAkJCS8qIHBhZCBvdXQgdG8gMTYgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgUElDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZSB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BpY19wbHRfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHhhMywJLyogam1wICpvZmZzZXQoJWVieCkgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgb2YgdGhpcyBzeW1ib2wgaW4gLmdvdC4gICovCi0gIDB4NjgsCQkvKiBwdXNobCBpbW1lZGlhdGUgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLSAgMHhlOSwJCS8qIGptcCByZWxhdGl2ZSAqLwotICAwLCAwLCAwLCAwCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLwotfTsKLQotLyogVGhlIGkzODYgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQKLSAgIGl0IGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuCi0gICBsaW5raW5nIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkCi0gICBleHRlbmRpbmcgdGhlIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UKLSAgIGhhdmUgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBpMzg2IEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfaTM4Nl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JICAgIHsKLQkgICAgY2FzZSBSXzM4Nl9HT1QzMjoKLQkgICAgY2FzZSBSXzM4Nl9HT1RPRkY6Ci0JICAgIGNhc2UgUl8zODZfR09UUEM6Ci0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl8zODZfR09UMzI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotICAgICAJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfMzg2X1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlIGR5bmFtaWMKLSAgICAgICAgICAgICAgICAgICAgIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9QTFQzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCi0gICAgICAgICAgICAgbmV2ZXIgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5Ci0gICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgLyogSWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgcmVzb2x2ZSBpdCBkaXJlY3RseSB3aXRob3V0Ci0gICAgICAgICAgICAgY3JlYXRpbmcgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2XzMyOgotCWNhc2UgUl8zODZfUEMzMjoKLQkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBpcyBhIHJlbG9jCi0gICAgICAgICAgICAgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIG9yIGEgbm9uIFBDIHJlbGF0aXZlIHJlbG9jCi0gICAgICAgICAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jCi0gICAgICAgICAgICAgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICBIb3dldmVyLCBpZiB3ZSBhcmUgbGlua2luZyB3aXRoCi0gICAgICAgICAgICAgLUJzeW1ib2xpYywgd2UgZG8gbm90IG5lZWQgdG8gY29weSBhIHJlbG9jIGFnYWluc3QgYQotICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlCi0gICAgICAgICAgICAgaW5jbHVkaW5nIGluIHRoZSBsaW5rIChpLmUuLCBERUZfUkVHVUxBUiBpcyBzZXQpLiAgQXQKLSAgICAgICAgICAgICB0aGlzIHBvaW50IHdlIGhhdmUgbm90IHNlZW4gYWxsIHRoZSBpbnB1dCBmaWxlcywgc28gaXQgaXMKLSAgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldAotICAgICAgICAgICAgIGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLSAgICAgICAgICAgICBwb3NzaWJpbGl0eSBiZWxvdyBieSBzdG9yaW5nIGluZm9ybWF0aW9uIGluIHRoZQotICAgICAgICAgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgICAgJiYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfMzg2X1BDMzIKLQkJICB8fCAoaCAhPSBOVUxMCi0JCSAgICAgICYmICghIGluZm8tPnN5bWJvbGljCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JICAgIHsKLQkgICAgICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0gICAgICAgICAgICAgICAgIHJlbG9jIHR5cGVzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA0KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgYW5kIHRoaXMgaXMgYQotICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgd2UgY2FuIGRpc2NhcmQgdGhlbSBhZ2FpbiBpZiB0aGUgc3ltYm9sIGlzIGxhdGVyCi0gICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBlbGZfaTM4NiBsaW5rZXIKLSAgICAgICAgICAgICAgICAgaGFzaCB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8KLSAgICAgICAgICAgICAgICAgYW4gZWxmX2kzODZfbGlua19oYXNoX2VudHJ5LiAgKi8KLQkgICAgICBpZiAoaCAhPSBOVUxMICYmIGluZm8tPnN5bWJvbGljCi0JCSAgJiYgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl8zODZfUEMzMikKLQkJewotCQkgIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKmVoOwotCQkgIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpwOwotCi0JCSAgZWggPSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JCSAgZm9yIChwID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JCSAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgaWYgKHAgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgcCA9ICgoc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKikKLQkJCSAgIGJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKnApKTsKLQkJICAgICAgaWYgKHAgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgcC0+bmV4dCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOwotCQkgICAgICBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IHA7Ci0JCSAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7Ci0JCSAgICAgIHAtPmNvdW50ID0gMDsKLQkJICAgIH0KLQotCQkgICsrcC0+Y291bnQ7Ci0JCX0KLQkgICAgfQotCi0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl8zODZfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfMzg2X0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmX2kzODZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfMzg2X0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzM4Nl9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICAvKiA/Pz8gSXQgd291bGQgc2VlbSB0aGF0IHRoZSBleGlzdGluZyBpMzg2IGNvZGUgZG9lcyBubyBzb3J0Ci0gICAgIG9mIHJlZmVyZW5jZSBjb3VudGluZyBvciB3aGF0bm90IG9uIGl0cyBHT1QgYW5kIFBMVCBlbnRyaWVzLAotICAgICBzbyBpdCBpcyBub3QgcG9zc2libGUgdG8gZ2FyYmFnZSBjb2xsZWN0IHRoZW0gYXQgdGhpcyB0aW1lLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIsCi0gICAgIHdoZW4gd2Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgPT0gMCkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVDMyIHJlbG9jIGluIGFuIGlucHV0Ci0gICAgICAgICAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYwotICAgICAgICAgICAgIG9iamVjdC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkCi0gICAgICAgICAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEMzMgotICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKLQkgZmlyc3QgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAuZ290LnBsdCBzZWN0aW9uLCB3aGljaAotCSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgLmdvdCBzZWN0aW9uIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSA0OwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl8zODZfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbC5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsCi0gICAgIFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotICAgICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2UKLSAgICAgd2lsbCBub3QgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2kzODZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJIGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzLAotCQkJCSAoUFRSKSBOVUxMKTsKLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWwuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKLSAgICAgICAgICAgICAgICAgdGhhbiAucmVsLnBsdC4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWwucGx0IikgIT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkJICByZWxvY3MgPSB0cnVlOwotCi0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKLQkJICAgICBlbnRyeS4gIFRoZSBlbnRyaWVzIGluIHRoZSAucmVsLnBsdCBzZWN0aW9uCi0JCSAgICAgcmVhbGx5IGFwcGx5IHRvIHRoZSAuZ290IHNlY3Rpb24sIHdoaWNoIHdlCi0JCSAgICAgY3JlYXRlZCBvdXJzZWx2ZXMgYW5kIHNvIGtub3cgaXMgbm90IHJlYWRvbmx5LiAgKi8KLQkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDQpOwotCQkgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgIHJlbHRleHQgPSB0cnVlOwotCQl9Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUKLSAgIGRlZmluZWQgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZQotICAgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlCi0gICByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9kaXNjYXJkX2NvcGllcyAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWdub3JlOwotewotICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYW4gaTM4NiBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPT0gUl8zODZfR05VX1ZUSU5IRVJJVAotCSAgfHwgcl90eXBlID09IFJfMzg2X0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHJfdHlwZSA8IDAKLQkgIHx8IHJfdHlwZSA+PSAoaW50KSBSXzM4Nl9tYXgKLQkgIHx8IChyX3R5cGUgPj0gKGludCkgRklSU1RfSU5WQUxJRF9SRUxPQwotCSAgICAgICYmIHJfdHlwZSA8PSAoaW50KSBMQVNUX0lOVkFMSURfUkVMT0MpKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgYmZkX3ZtYSB2YWw7Ci0KLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgdmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIHZhbCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAocl90eXBlID09IFJfMzg2X0dPVFBDCi0JCSAgfHwgKHJfdHlwZSA9PSBSXzM4Nl9QTFQzMgotCQkgICAgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAocl90eXBlID09IFJfMzg2X0dPVDMyCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAocl90eXBlID09IFJfMzg2XzMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSXzM4Nl9QQzMyKQotCQkgICAgICAmJiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCQkgIC8qIERXQVJGIHdpbGwgZW1pdCBSXzM4Nl8zMiByZWxvY2F0aW9ucyBpbiBpdHMKLQkJCSAgICAgc2VjdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgZXh0ZXJuYWxseQotCQkJICAgICBpbiBzaGFyZWQgbGlicmFyaWVzLiAgV2UgY2FuJ3QgZG8gYW55dGhpbmcKLQkJCSAgICAgd2l0aCB0aGVtIGhlcmUuICAqLwotCQkJICB8fCAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSXzM4Nl9HT1QzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0JICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkJICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCQkgICAgIGxvY2FsbHksIG9yIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbAotCQkgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZSBtdXN0IGluaXRpYWxpemUKLQkJICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlCi0JCSAgICAgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UgdXNlIHRoZQotCQkgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSAgICAgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLSAgICAgICAgICAgICAgICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgIGFscmVhZHkgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkJICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0KLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X0dPVE9GRjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwgb2Zmc2V0Ci0JICAgICB0YWJsZS4gICovCi0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIE5vdGUgdGhhdCBzZ290LT5vdXRwdXRfb2Zmc2V0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGlzCi0JICAgICBjYWxjdWxhdGlvbi4gIFdlIGFsd2F5cyB3YW50IHRoZSBzdGFydCBvZiAuZ290LiAgSWYgd2UKLQkgICAgIGRlZmluZWQgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcwotCSAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKLQkgICAgIGNhbGN1bGF0aW9uLiAgKi8KLQkgIHJlbG9jYXRpb24gLT0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X0dPVFBDOgotCSAgLyogVXNlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXMgc3ltYm9sIHZhbHVlLiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9QTFQzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLQkgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogUmVzb2x2ZSBhIFBMVDMyIHJlbG9jIGFnYWluIGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAotICAgICAgICAgICAgIHdpdGhvdXQgdXNpbmcgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0gICAgICAgICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLSAgICAgICAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl8zMjoKLQljYXNlIFJfMzg2X1BDMzI6Ci0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgICAgJiYgKHJfdHlwZSAhPSBSXzM4Nl9QQzMyCi0JCSAgfHwgKGggIT0gTlVMTAotCQkgICAgICAmJiBoLT5keW5pbmR4ICE9IC0xCi0JCSAgICAgICYmICghIGluZm8tPnN5bWJvbGljCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXAsIHJlbG9jYXRlOwotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLQkJIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0JCSB0aW1lLiAgKi8KLQotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGlucHV0X2JmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA0KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJewotCQkgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSXzM4Nl9QQzMyKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMICYmIGgtPmR5bmluZHggIT0gLTEpOwotCQkgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfUEMzMik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCQkgIGlmIChoID09IE5VTEwKLQkJICAgICAgfHwgKChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQkJICAgIHsKLQkJICAgICAgcmVsb2NhdGUgPSB0cnVlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICAgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfMzIpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkbwotCQkgbm90IHdhbnQgdG8gZmlkZGxlIHdpdGggdGhlIGFkZGVuZC4gIE90aGVyd2lzZSwgd2UKLQkJIG5lZWQgdG8gaW5jbHVkZSB0aGUgc3ltYm9sIHZhbHVlIHNvIHRoYXQgaXQgYmVjb21lcwotCQkgYW4gYWRkZW5kIGZvciB0aGUgZHluYW1pYyByZWxvYy4gICovCi0JICAgICAgaWYgKCEgcmVsb2NhdGUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sIChiZmRfdm1hKSAwKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFNldAotCSBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgd2hpY2gKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBzeW1ib2wuICBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbAotCSBpbiBhbGwgdGhlIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGFyZSBtYWtpbmcgcGx0IGVudHJpZXMuICBUaGUKLQkgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIHBsdF9pbmRleCA9IGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDE7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIC5nb3QgdGFibGUgb2YgdGhlIGVudHJ5IHRoYXQKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBmdW5jdGlvbi4gIEVhY2ggLmdvdCBlbnRyeSBpcyA0IGJ5dGVzLgotCSBUaGUgZmlyc3QgdGhyZWUgYXJlIHJlc2VydmVkLiAgKi8KLSAgICAgIGdvdF9vZmZzZXQgPSAocGx0X2luZGV4ICsgMykgKiA0OwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfaTM4Nl9wbHRfZW50cnksCi0JCSAgUExUX0VOVFJZX1NJWkUpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBnb3Rfb2Zmc2V0KSwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfaTM4Nl9waWNfcGx0X2VudHJ5LAotCQkgIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGdvdF9vZmZzZXQsCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDIpOwotCX0KLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2luZGV4ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDcpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgLSAoaC0+cGx0Lm9mZnNldCArIFBMVF9FTlRSWV9TSVpFKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAxMik7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaC0+cGx0Lm9mZnNldAotCQkgICArIDYpLAotCQkgIHNnb3QtPmNvbnRlbnRzICsgZ290X29mZnNldCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfSlVNUF9TTE9UKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNldCBpdAotCSB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgTGlrZXdpc2UgaWYKLQkgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuCi0JIFRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCi0JIGluaXRpYWxpemVkIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9HTE9CX0RBVCk7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKLQkJCQkgKyBzcmVsLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAiLnJlbC5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbC5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X0NPUFkpOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHMtPmNvbnRlbnRzCi0JCQkJICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIC8qIE1hcmsgX0RZTkFNSUMgYW5kIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc2R5bjsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsLnBsdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgICAvKiBNeSByZWFkaW5nIG9mIHRoZSBTVlI0IEFCSSBpbmRpY2F0ZXMgdGhhdCB0aGUKLQkJIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHJlbG9jcyAoRFRfSk1QUkVMKSBzaG91bGQgYmUKLQkJIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMKS4gIFRoaXMgaXMKLQkJIHdoYXQgU29sYXJpcyBkb2VzLiAgSG93ZXZlciwgVW5peFdhcmUgY2FuIG5vdCBoYW5kbGUKLQkJIHRoYXQgY2FzZS4gIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTFNaIGVudHJ5Ci0JCSBoZXJlIHRvIG1ha2UgaXQgbm90IGluY2x1ZGUgdGhlIEpNUFJFTCByZWxvY3MuICBTaW5jZQotCQkgdGhlIGxpbmtlciBzY3JpcHQgYXJyYW5nZXMgZm9yIC5yZWwucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUwgZW50cnkuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWwucGx0Iik7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fcmF3X3NpemU7Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBpZiAoc3BsdCAmJiBzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfaTM4Nl9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0LAotCQkJICBzcGx0LT5jb250ZW50cyArIDIpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgOCwKLQkJCSAgc3BsdC0+Y29udGVudHMgKyA4KTsKLQkgICAgfQotCi0JICAvKiBVbml4V2FyZSBzZXRzIHRoZSBlbnRzaXplIG9mIC5wbHQgdG8gNCwgYWx0aG91Z2ggdGhhdCBkb2Vzbid0Ci0JICAgICByZWFsbHkgc2VlbSBsaWtlIHRoZSByaWdodCB2YWx1ZS4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCX0KLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfaTM4Nl92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItaTM4NiIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNXzM4NgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEwMDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZl9pMzg2X2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQllbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0JCQkJCWVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQllbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwllbGZfaTM4Nl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCWVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCWVsZl9pMzg2X2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCWVsZl9pMzg2X2djX3N3ZWVwX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQJMQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkJMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0JMAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCVBMVF9FTlRSWV9TSVpFCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1pODYwLmMgYi9iZmQvZWxmMzItaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJkMmQ5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBJbnRlbCA4NjAgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JIGJmZF9lbGYzMl9pODYwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICJlbGYzMi1pODYwIgotI2RlZmluZSBFTEZfQVJDSAkgYmZkX2FyY2hfaTg2MAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNXzg2MAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgIDEgLyogRklYTUU6IFRoaXMgbnVtYmVyIGlzIHdyb25nLCAgSXQgc2hvdWxkIGJlIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTk2MC5jIGIvYmZkL2VsZjMyLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3ZjA5OC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qIEludGVsIDg2MCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pOTYwLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmMzJfaTk2MF9yZWxvY2F0ZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICplbGYzMl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotI2RlZmluZSBVU0VfUkVMIDEKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZjMyX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZjMyX2k5NjBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZjMyX2k5NjBfaW5mb190b19ob3d0b19yZWwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hvd3RvX3RhYmxlW109Ci17Ci0gIEhPV1RPKFJfOTYwX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQllbGYzMl9pOTYwX3JlbG9jYXRlLCAiUl85NjBfTk9ORSIsIHRydWUsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgZmFsc2UpLAotICB7IDEgfSwKLSAgSE9XVE8gKFJfOTYwXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWVsZjMyX2k5NjBfcmVsb2NhdGUsICJSXzk2MF8zMiIsIHRydWUsCi0JMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl85NjBfSVAyNCwgMCwgMiwgMjQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQllbGYzMl9pOTYwX3JlbG9jYXRlLCAiUl85NjBfSVAyNCAiLCB0cnVlLAotCTB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgeyA0IH0sCi0gIHsgNSB9LAotICB7IDYgfSwKLSAgeyA3IH0KLX07Ci0KLXN0YXRpYyBlbnVtIGVsZl9pOTYwX3JlbG9jX3R5cGUKLWVsZjMyX2k5NjBfYmZkX3RvX3JlbG9jX3R5cGUgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKQotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gUl85NjBfTk9ORTsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuIFJfOTYwX09QVENBTEw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiBSXzk2MF8zMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiBSXzk2MF9JUDI0OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWVsZjMyX2k5NjBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZAkJKmFiZmQ7Ci0gICAgIGFyZWxlbnQJCSpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9pOTYwX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICBlbnVtIGVsZl9pOTYwX3JlbG9jX3R5cGUgdHlwZTsKLQotICB0eXBlID0gKGVudW0gZWxmX2k5NjBfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHR5cGUgPCBSXzk2MF9tYXgpOwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHR5cGVdOwotfQotCi0vKiBFTEYgcmVsb2NzIGFyZSBhZ2FpbnN0IHN5bWJvbHMuICBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZQotICAgb3V0cHV0LCBhbmQgdGhlIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCBhbmQgbm90aGluZwotICAgaGFzIGdpdmVuIHVzIGFueSBhZGRpdGlvbmFsIGFkZGVuZCwgdGhlIHJlc3VsdGluZyByZWxvYyB3aWxsIGFsc28KLSAgIGJlIGFnYWluc3QgdGhlIHNhbWUgc3ltYm9sLiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8KLSAgIGNoYW5nZSBhbnl0aGluZyBhYm91dCB0aGUgd2F5IHRoZSByZWxvYyBpcyBoYW5kbGVkLCBzaW5jZSBpdCB3aWxsCi0gICBhbGwgYmUgZG9uZSBhdCBmaW5hbCBsaW5rIHRpbWUuICBSYXRoZXIgdGhhbiBwdXQgc3BlY2lhbCBjYXNlIGNvZGUKLSAgIGludG8gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgYWxsIHRoZSByZWxvYyB0eXBlcyB1c2UgdGhpcyBob3d0bwotICAgZnVuY3Rpb24uICBJdCBqdXN0IHNob3J0IGNpcmN1aXRzIHRoZSByZWxvYyBpZiBwcm9kdWNpbmcKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmMzJfaTk2MF9yZWxvY2F0ZSAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIEhBQ0s6IEkgdGhpbmsgdGhpcyBmaXJzdCBjb25kaXRpb24gaXMgbmVjZXNzYXJ5IHdoZW4gcHJvZHVjaW5nCi0gICAgIHJlbG9jYXRhYmxlIG91dHB1dC4gIEFmdGVyIHRoZSBlbmQgb2YgSEFDSywgdGhlIGNvZGUgaXMgaWRlbnRpY2FsCi0gICAgIHRvIGJmZF9lbGZfZ2VuZXJpY19yZWxvYygpLiAgSSB3b3VsZCBfZ3Vlc3NfIHRoZSBmaXJzdCBjaGFuZ2UKLSAgICAgYmVsb25ncyB0aGVyZSByYXRoZXIgdGhhbiBoZXJlLiAgbWFydGluZG8gMTk5OC0xMC0yMy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgcmVsb2NfZW50cnktPmhvd3RvLT5wY19yZWxhdGl2ZQotICAgICAgJiYgIXJlbG9jX2VudHJ5LT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgLT0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0gIC8qIFRoaXMgaXMgbW9yZSBkdWJpb3VzLiAqLwotICBlbHNlIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotCSAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgLT0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGVuZCBvZiBIQUNLICovCi0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLQkgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0JICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgICAgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0JewotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICByZXR1cm4gZWxmX2hvd3RvX3RhYmxlICsgZWxmMzJfaTk2MF9iZmRfdG9fcmVsb2NfdHlwZSAoY29kZSk7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX2k5NjBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItaTk2MCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2k5NjAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV85NjAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFICAJMSAvKiBGSVhNRTogVGhpcyBudW1iZXIgaXMgd3JvbmcsICBJdCBzaG91bGQgYmUgdGhlIHBhZ2Ugc2l6ZSBpbiBieXRlcy4gICovCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tMzJyLmMgYi9iZmQvZWxmMzItbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY4NTIzLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tMzJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDgyICswLDAgQEAKLS8qIE0zMlItc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tMzJyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfMTBfcGNyZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgbTMycl9lbGZfcmVsb2NhdGVfaGkxNgotICBQQVJBTVMgKChiZmQgKiwgaW50LCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLWJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9sbzE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9zZGExNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG0zMnJfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLWJvb2xlYW4gX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXZvaWQgX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0jaWYgMCAvKiBub3QgeWV0ICovCi1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIG0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0jZGVmaW5lIE5PUF9JTlNOCQkweDcwMDAKLSNkZWZpbmUgTUFLRV9QQVJBTExFTChpbnNuKQkoKGluc24pIHwgMHg4MDAwKQotCi0vKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlLgotICAgVGhpcyBvbmx5IHNhdmVzIHNwYWNlIGluIGxpYnJhcmllcyBhbmQgb2JqZWN0IGZpbGVzLCBidXQgcGVyaGFwcwotICAgcmVsb2NzIHdpbGwgYmUgcHV0IGluIFJPTT8gIEFsbCBpbiBhbGwgdGhvdWdoLCBSRUwgcmVsb2NzIGFyZSBhIHBhaW4KLSAgIHRvIHdvcmsgd2l0aC4gICovCi0jZGVmaW5lIFVTRV9SRUwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbTMycl9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX00zMlJfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NMzJSXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjQgYml0IGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSXzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMi4KLSAgICAgVGhpcyByZWxvYyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIHJlbG9jYXRpb25zIGFyZSByZWxhdGl2ZSB0byBwYyAmIC00LgotICAgICBpLmUuIGJyYW5jaGVzIGluIHRoZSByaWdodCBpbnNuIHNsb3QgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBsZWZ0IGluc24KLSAgICAgc2xvdCBmb3IgcGMuICAqLwotICAvKiA/Pz8gSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGlzIHNob3VsZCBoYXZlIHBhcnRpYWxfaW5wbGFjZSBzZXQgb3Igbm90LgotICAgICBCcmFuY2ggcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBjYW4gc3RvcmUgdGhlIGFkZGVuZCBpbiB0aGUgaW5zbiwKLSAgICAgYW5kIGlmIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gZ2V0cyBjYWxsZWQgdGhlIGFkZGVuZCBtYXkgZ2V0IGFkZGVkCi0gICAgIGFnYWluLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8xMF9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMTBfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9NMzJSXzE4X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjYgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0gIC8qID8/PyBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoaXMgc2hvdWxkIGhhdmUgcGFydGlhbF9pbnBsYWNlIHNldCBvciBub3QuCi0gICAgIEJyYW5jaCByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGNhbiBzdG9yZSB0aGUgYWRkZW5kIGluIHRoZSBpbnNuLAotICAgICBhbmQgaWYgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBnZXRzIGNhbGxlZCB0aGUgYWRkZW5kIG1heSBnZXQgYWRkZWQKLSAgICAgYWdhaW4uICAqLwotICBIT1dUTyAoUl9NMzJSXzI2X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8yNl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgYWRkcmVzcyB3aGVuIGxvd2VyIDE2IGlzIG9yJ2QgaW4uICAqLwotICBIT1dUTyAoUl9NMzJSX0hJMTZfVUxPLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfSEkxNl9VTE8iLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGFkZHJlc3Mgd2hlbiBsb3dlciAxNiBpcyBhZGRlZCBpbi4gICovCi0gIEhPV1RPIChSX00zMlJfSEkxNl9TTE8sCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9ISTE2X1NMTyIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3dlciAxNiBiaXRzIG9mIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTbWFsbCBkYXRhIGFyZWEgMTYgYml0cyBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9NMzJSX1NEQTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX3NkYTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfU0RBMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAvKiBGSVhNRTogY29ycmVjdD8gKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX00zMlJfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotDAotLyogSGFuZGxlIHRoZSBSX00zMlJfMTBfUENSRUwgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICByZXR1cm4gbTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LT5ob3d0bywKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICBkYXRhLCByZWxvY19lbnRyeS0+YWRkcmVzcywKLQkJCQkgICAgIHN5bWJvbC0+c2VjdGlvbiwKLQkJCQkgICAgIChzeW1ib2wtPnZhbHVlCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCQkJICAgICByZWxvY19lbnRyeS0+YWRkZW5kKTsKLX0KLQotLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfTTMyUl8xMF9QQ1JFTCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jIChhYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwgZGF0YSwgb2Zmc2V0LAotCQkJICAgIHN5bWJvbF9zZWN0aW9uLCBzeW1ib2xfdmFsdWUsIGFkZGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYXNlY3Rpb24gKnN5bWJvbF9zZWN0aW9uOwotICAgICBiZmRfdm1hIHN5bWJvbF92YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF9zaWduZWRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgeDsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MgKG9mZnNldCBpbiBzZWN0aW9uKS4gICovCi0gIGlmIChvZmZzZXQgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJlbG9jYXRpb24gPSBzeW1ib2xfdmFsdWUgKyBhZGRlbmQ7Ci0gIC8qIE1ha2UgaXQgcGMgcmVsYXRpdmUuICAqLwotICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAvKiBUaGVzZSBqdW1wcyBtYXNrIG9mZiB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlIGN1cnJlbnQgYWRkcmVzcwotICAgICBiZWZvcmUgZG9pbmcgcGNyZWwgY2FsY3VsYXRpb25zLiAgKi8KLSAgcmVsb2NhdGlvbiAtPSAob2Zmc2V0ICYgLTRMKTsKLQotICBpZiAocmVsb2NhdGlvbiA8IC0weDIwMCB8fCByZWxvY2F0aW9uID4gMHgxZmYpCi0gICAgc3RhdHVzID0gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgc3RhdHVzID0gYmZkX3JlbG9jX29rOwotCi0gIHggPSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IGhvd3RvLT5iaXRwb3M7Ci0gIHggPSAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzayk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGRhdGEgKyBvZmZzZXQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jcy4KLSAgIEhJMTZfU0xPIGlzIGZvciB0aGUgYWRkMyBhbmQgbG9hZC9zdG9yZSB3aXRoIGRpc3BsYWNlbWVudCBpbnN0cnVjdGlvbnMuCi0gICBISTE2X1VMTyBpcyBmb3IgdGhlIG9yMyBpbnN0cnVjdGlvbi4KLSAgIEZvciBSX00zMlJfSEkxNl9TTE8sIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBzaWduIGV4dGVuZGVkIHdoZW4gYWRkZWQgdG8KLSAgIHRoZSBoaWdoIDE2IGJ5dGVzIHNvIGlmIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBuZWdhdGl2ZSAoYml0IDE1ID09IDEpIHRoZW4KLSAgIHdlIG11c3QgYWRkIG9uZSB0byB0aGUgaGlnaCAxNiBieXRlcyAod2hpY2ggd2lsbCBnZXQgc3VidHJhY3RlZCBvZmYgd2hlbgotICAgdGhlIGxvdyAxNiBiaXRzIGFyZSBhZGRlZCkuCi0gICBUaGVzZSByZWxvY3MgaGF2ZSB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYW4gUl9NMzJSX0xPMTYgcmVsb2MKLSAgIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBMTzE2IHRvIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUKLSAgIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkOyB3ZSBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuCi0gICBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gdGhlIGVsZjMyLW1pcHMuYy4gIFdlIGFsc28gc3VwcG9ydCBhbiBhcmJpdHJhcnkKLSAgIG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNiByZWxvYy4gIFRoZQotICAgYXNzZW1ibGVyIHNvcnRzIHRoZSByZWxvY3MgdG8gZW5zdXJlIGVhY2ggSEkxNiBpbW1lZGlhdGVseSBwcmVjZWRlcyBpdHMKLSAgIExPMTYuICBIb3dldmVyIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMsIHRoZSBhc3NlbWJsZXIgbWF5IG5vdCBmaW5kCi0gICB0aGUgcmVhbCBMTzE2IHNvIGl0IHBpY2tzIHRoZSBmaXJzdCBvbmUgaXQgZmluZHMuICAqLwotCi1zdHJ1Y3QgbTMycl9oaTE2Ci17Ci0gIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7Ci0gIGJmZF9ieXRlICphZGRyOwotICBiZmRfdm1hIGFkZGVuZDsKLX07Ci0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG0zMnJfaGkxNiAqbTMycl9oaTE2X2xpc3Q7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2hpMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG0zMnJfaGkxNiAqbjsKLQotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCi0gICAgIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcyAob2Zmc2V0IGluIHNlY3Rpb24pLiAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbTMycl9oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG0zMnJfaGkxNl9saXN0OwotICBtMzJyX2hpMTZfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogSGFuZGxlIGFuIE0zMlIgRUxGIEhJMTYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCB0eXBlLCByZWxoaSwgcmVsbG8sIGNvbnRlbnRzLCBhZGRlbmQpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBhZGRsbzsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Ci0KLSAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsbG8tPnJfb2Zmc2V0KTsKLSAgaWYgKHR5cGUgPT0gUl9NMzJSX0hJMTZfU0xPKQotICAgIGFkZGxvID0gKChhZGRsbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOwotICBlbHNlCi0gICAgYWRkbG8gJj0gMHhmZmZmOwotCi0gIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGFkZGxvOwotCi0gIC8qIFJlYWNjb3VudCBmb3Igc2lnbiBleHRlbnNpb24gb2YgbG93IHBhcnQuICAqLwotICBpZiAodHlwZSA9PSBSX00zMlJfSEkxNl9TTE8KLSAgICAgICYmIChhZGRlbmQgJiAweDgwMDApICE9IDApCi0gICAgYWRkZW5kICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIChpbnNuICYgMHhmZmZmMDAwMCkgfCAoKGFkZGVuZCA+PiAxNikgJiAweGZmZmYpLAotCSAgICAgIGNvbnRlbnRzICsgcmVsaGktPnJfb2Zmc2V0KTsKLX0KLQotLyogRG8gYW4gUl9NMzJSX0xPMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0Ci0gICBpbnBsYWNlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZQotICAgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jYXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9sbzE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobTMycl9oaTE2X2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbTMycl9oaTE2ICpsOwotCi0gICAgICBsID0gbTMycl9oaTE2X2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAotCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bwotCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogUmVhY2NvdW50IGZvciBzaWduIGV4dGVuc2lvbiBvZiBsb3cgcGFydC4gICovCi0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtMzJyX2hpMTZfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgTE8xNiByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogSGFuZGxlIHRoZSBSX00zMlJfU0RBMTYgcmVsb2MuCi0gICBUaGlzIHJlbG9jIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiBvYmplY3RzIGluIHRoZSBzbWFsbCBkYXRhIGFyZWEKLSAgIGFuZCB0byBwZXJmb3JtIGxvYWRzIGFuZCBzdG9yZXMgZnJvbSB0aGF0IGFyZWEuCi0gICBUaGUgbG93ZXIgMTYgYml0cyBhcmUgc2lnbiBleHRlbmRlZCBhbmQgYWRkZWQgdG8gdGhlIHJlZ2lzdGVyIHNwZWNpZmllZAotICAgaW4gdGhlIGluc3RydWN0aW9uLCB3aGljaCBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIF9TREFfQkFTRV8uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9zZGExNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSB5ZXQuICBCdXQgdGhlbiBhZ2FpbiwgdGhlIGxpbmtlcgotICAgICBtYXkgbmV2ZXIgY2FsbCB1cy4gICovCi0gIGFib3J0ICgpOwotfQotDAotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBNMzJSIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBtMzJyX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtMzJyX3JlbG9jX21hcCBtMzJyX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NMzJSX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTTMyUl8xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NMzJSXzMyIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjQsIFJfTTMyUl8yNCB9LAotICB7IEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLCBSX00zMlJfMTBfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwgUl9NMzJSXzE4X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsIFJfTTMyUl8yNl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLCBSX00zMlJfSEkxNl9VTE8gfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywgUl9NMzJSX0hJMTZfU0xPIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfTE8xNiwgUl9NMzJSX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9TREExNiwgUl9NMzJSX1NEQTE2IH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX00zMlJfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfTTMyUl9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChtMzJyX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtMzJyX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChtMzJyX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZtMzJyX2VsZl9ob3d0b190YWJsZVttMzJyX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTTMyUiBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NMzJSX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmbTMycl9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQwKLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgKi8KLQotYm9vbGVhbgotX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGhkciwgc2VjLCByZXR2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgKnJldHZhbDsKLXsKLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NMzJSX1NDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTTMyUiBFTEYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUgb3RoZXIKLSAgIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0IHRvZ2V0aGVyLCBhbmQgdGhlbgotICAgcmVmZXJlbmNlZCB2aWEgb25lIHJlZ2lzdGVyLCB3aGljaCB5aWVsZHMgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgSXQgaXMKLSAgIHVwIHRvIHRoZSBjb21waWxlciB0byBlbWl0IGFuIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIHJlZ2lzdGVyIHdpdGgKLSAgIF9TREFfQkFTRS4gIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gIFRoaXMKLSAgIGFwcHJvYWNoIGlzIGNvcGllZCBmcm9tIGVsZjMyLW1pcHMuYy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLiAgKi8KLQotdm9pZAotX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0KLSAgc3dpdGNoIChlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgIGlmIChtMzJyX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbDsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbC5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG0zMnJfZWxmX3Njb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHIgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgaGVyZS4KLSAgIFdlIGFsc28ga2VlcCB3YXRjaGluZyBmb3Igd2hldGhlciB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc2RhdGEgc3BlY2lhbAotICAgbGlua2VyIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICgqbmFtZXApWzBdID09ICdfJyAmJiAoKm5hbWVwKVsxXSA9PSAnUycKLSAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX1NEQV9CQVNFXyIpID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBzaW1wbGVyIHRoYW4gdXNpbmcgX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0JIChvdXIgbmVlZHMgYXJlIHNpbXBsZXIgdGhhbiBwcGMncyBuZWVkcykuICBBbHNvCi0JIF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiBjdXJyZW50bHkgaGFzIGEgYnVnIHdoZXJlIGlmIGEgLnNkYXRhCi0JIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMgYSBuZXcgb25lIGlzIGNyZWF0ZWQgdGhhdCBmb2xsb3dzIGl0IHdoaWNoCi0JIHNjcmV3cyBvZiBfU0RBX0JBU0VfIGFkZHJlc3MgY2FsY3MgYmVjYXVzZSBvdXRwdXRfb2Zmc2V0ICE9IDAuICAqLwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgY29iYmxlZCBmcm9tIGVsZjMyLXBwYy5jIGFuZCBlbGZsaW5rLmMuICAqLwotCi0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGludCBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLQkgIHMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKTsKLQl9Ci0KLSAgICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQliZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgaWYgKChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSBhYmZkLAotCQkJCQkJICJfU0RBX0JBU0VfIiwKLQkJCQkJCSBCU0ZfR0xPQkFMLAotCQkJCQkJIHMsCi0JCQkJCQkgMzI3NjgsCi0JCQkJCQkgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSBmYWxzZSwKLQkJCQkJCSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotICAgIH0KLQotICBzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBTREFfQkFTRSB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgc3ltYm9sIHZhbHVlIGNvcnJlY3RseS4gIFdlIGxvb2sgdXAgdGhlIHN5bWJvbCBfU0RBX0JBU0VfIGluIHRoZSBvdXRwdXQKLSAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVMRgotICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgotICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlIChvdXRwdXRfYmZkLCBpbmZvLCBlcnJvcl9tZXNzYWdlLCBwc2IpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJvcl9tZXNzYWdlOwotICAgICBiZmRfdm1hICpwc2I7Ci17Ci0gIGlmIChlbGZfZ3AgKG91dHB1dF9iZmQpID09IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAob3V0cHV0X2JmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIE9ubHkgZ2V0IHRoZSBlcnJvciBvbmNlLiAgKi8KLQkgICpwc2IgPSBlbGZfZ3AgKG91dHB1dF9iZmQpID0gNDsKLQkgICplcnJvcl9tZXNzYWdlID0KLQkgICAgKGNvbnN0IGNoYXIgKikgXygiU0RBIHJlbG9jYXRpb24gd2hlbiBfU0RBX0JBU0VfIG5vdCBkZWZpbmVkIik7Ci0JICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQl9Ci0gICAgfQotICAqcHNiID0gZWxmX2dwIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIFJlbG9jYXRlIGFuIE0zMlIvRCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICAvKiBBc3N1bWUgc3VjY2Vzcy4gICovCi0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgLyogV2UgY2FuJ3QgbW9kaWZ5IHJfYWRkZW5kIGhlcmUgYXMgZWxmX2xpbmtfaW5wdXRfYmZkIGhhcyBhbiBhc3NlcnQgdG8KLQkgZW5zdXJlIGl0J3MgemVybyAod2UgdXNlIFJFTCByZWxvY3MsIG5vdCBSRUxBKS4gIFRoZXJlZm9yZSB0aGlzCi0JIHNob3VsZCBiZSBhc3NpZ25pbmcgemVybyB0byBgYWRkZW5kJywgYnV0IGZvciBjbGFyaXR5IHdlIHVzZQotCSBgcl9hZGRlbmQnLiAgKi8KLSAgICAgIGJmZF92bWEgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfTTMyUl9tYXgpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludCkgcl90eXBlKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NMzJSX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfTTMyUl9HTlVfVlRJTkhFUklUKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSBtMzJyX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc2VjID0gTlVMTDsKLQkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgLyogRXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBMb2NhbCBzeW1ib2wuICAqLwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCSAgLyogU1RUX1NFQ1RJT046IHN5bWJvbCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgKi8KLQkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKLQkgICAgewotCSAgICAgIC8qIFN5bWJvbCBpc24ndCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgTm90aGluZyB0byBkby4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0jaWZuZGVmIFVTRV9SRUwKLQkgIC8qIFRoaXMgY2FuJ3QgYmUgZG9uZSBmb3IgVVNFX1JFTCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWVhbiBhbnl0aGluZwotCSAgICAgYW5kIGVsZl9saW5rX2lucHV0X2JmZCBhc3NlcnRzIHRoaXMgc3RheXMgemVyby4gICovCi0JICByZWwtPnJfYWRkZW5kID0gYWRkZW5kOwotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX1JFTAotCSAgLyogQWRkZW5kcyBhcmUgc3RvcmVkIHdpdGggcmVsb2NzLiAgV2UncmUgZG9uZS4gICovCi0JICBjb250aW51ZTsKLSNlbHNlIC8qIFVTRV9SRUwgKi8KLQkgIC8qIElmIHBhcnRpYWxfaW5wbGFjZSwgd2UgbmVlZCB0byBzdG9yZSBhbnkgYWRkaXRpb25hbCBhZGRlbmQKLQkgICAgIGJhY2sgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKCEgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSkKLQkgICAgY29udGludWU7Ci0JICAvKiA/Pz8gSGVyZSBpcyBhIG5pY2UgcGxhY2UgdG8gY2FsbCBhIHNwZWNpYWxfZnVuY3Rpb24KLQkgICAgIGxpa2UgaGFuZGxlci4gICovCi0JICBpZiAocl90eXBlICE9IFJfTTMyUl9ISTE2X1NMTyAmJiByX3R5cGUgIT0gUl9NMzJSX0hJMTZfVUxPKQotCSAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJYWRkZW5kLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7Ci0KLQkgICAgICAvKiBXZSBhbGxvdyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIGJlZm9yZSB0aGUKLQkJIExPMTYgcmVsb2MuICBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLQkJIGl0c2VsZi4gICovCi0JICAgICAgZm9yIChsb3JlbCA9IHJlbCArIDE7Ci0JCSAgIChsb3JlbCA8IHJlbGVuZAotCQkgICAgJiYgKEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfU0xPCi0JCQl8fCBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1VMTykpOwotCQkgICBsb3JlbCsrKQotCQljb250aW51ZTsKLQkgICAgICBpZiAobG9yZWwgPCByZWxlbmQKLQkJICAmJiBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9MTzE2KQotCQl7Ci0JCSAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCi0JCQkJCSAgY29udGVudHMsIGFkZGVuZCk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICAgIGVsc2UKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCi0JCQkJCSAgICBhZGRlbmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgICAgfQotI2VuZGlmIC8qIFVTRV9SRUwgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0JICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0JICBzeW0gPSBOVUxMOwotCSAgc2VjID0gTlVMTDsKLQotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIC8qIExvY2FsIHN5bWJvbC4gICovCi0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgICAgICBzeW1fbmFtZSA9ICI8bG9jYWwgc3ltYm9sPiI7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICsgc3ltLT5zdF92YWx1ZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAgICAgc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCi0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQl7Ci0JCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICByZWxvY2F0aW9uID0gMDsKLQkJICBlbHNlCi0JCSAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLCBvZmZzZXQpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCi0JICBpZiAob2Zmc2V0ID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICB7Ci0JICAgICAgciA9IGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCSAgICAgIGdvdG8gY2hlY2tfcmVsb2M7Ci0JICAgIH0KLQotCSAgc3dpdGNoICgoaW50KSByX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSAoaW50KSBSX00zMlJfMTBfUENSRUwgOgotCSAgICAgIHIgPSBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyAoaW5wdXRfYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMsIG9mZnNldCwKLQkJCQkJICAgICAgc2VjLCByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgKGludCkgUl9NMzJSX0hJMTZfU0xPIDoKLQkgICAgY2FzZSAoaW50KSBSX00zMlJfSEkxNl9VTE8gOgotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JCS8qIFdlIGFsbG93IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNiByZWxvY3MgYmVmb3JlIHRoZQotCQkgICBMTzE2IHJlbG9jLiAgVGhpcyBwZXJtaXRzIGdjYyB0byBlbWl0IHRoZSBISSBhbmQgTE8gcmVsb2NzCi0JCSAgIGl0c2VsZi4gICovCi0JCWZvciAobG9yZWwgPSByZWwgKyAxOwotCQkgICAgIChsb3JlbCA8IHJlbGVuZAotCQkgICAgICAmJiAoRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9TTE8KLQkJCSAgfHwgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9VTE8pKTsKLQkJICAgICBsb3JlbCsrKQotCQkgIGNvbnRpbnVlOwotCQlpZiAobG9yZWwgPCByZWxlbmQKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0xPMTYpCi0JCSAgewotCQkgICAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCi0JCQkJCSAgICBjb250ZW50cywgcmVsb2NhdGlvbiArIGFkZGVuZCk7Ci0JCSAgICByID0gYmZkX3JlbG9jX29rOwotCQkgIH0KLQkJZWxzZQotCQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCQljb250ZW50cywgb2Zmc2V0LAotCQkJCQkJcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAoaW50KSBSX00zMlJfU0RBMTYgOgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JCW5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotCQlpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCi0JCSAgewotCQkgICAgYmZkX3ZtYSBzZGFfYmFzZTsKLQkJICAgIGJmZCAqb3V0X2JmZCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotCi0JCSAgICByID0gbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UgKG91dF9iZmQsIGluZm8sCi0JCQkJCQkgJmVycm1zZywKLQkJCQkJCSAmc2RhX2Jhc2UpOwotCQkgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCQkgICAgICB7Ci0JCQlyZXQgPSBmYWxzZTsKLQkJCWdvdG8gY2hlY2tfcmVsb2M7Ci0JCSAgICAgIH0KLQotCQkgICAgLyogQXQgdGhpcyBwb2ludCBgcmVsb2NhdGlvbicgY29udGFpbnMgdGhlIG9iamVjdCdzCi0JCSAgICAgICBhZGRyZXNzLiAgKi8KLQkJICAgIHJlbG9jYXRpb24gLT0gc2RhX2Jhc2U7Ci0JCSAgICAvKiBOb3cgaXQgY29udGFpbnMgdGhlIG9mZnNldCBmcm9tIF9TREFfQkFTRV8uICAqLwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhbiAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBzZWN0aW9uICglcykiKSwKLQkJCQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkJICAgc3ltX25hbWUsCi0JCQkJCSAgIG0zMnJfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHJfdHlwZV0ubmFtZSwKLQkJCQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotCQkgICAgLypiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsgPz8/IHdoeT8gKi8KLQkJICAgIHJldCA9IGZhbHNlOwotCQkgICAgY29udGludWU7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBkZWZhdWx0IDoKLQkgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsIG9mZnNldCwKLQkJCQkJICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICBjaGVja19yZWxvYzoKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBnZW5lcmljIGVub3VnaCB0byBnbyBpbiBhIHV0aWxpdHkuICAqLwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIGlmIChlcnJtc2cgIT0gTlVMTCkKLQkgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG9mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBlcnJtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIGVycm1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG9mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0jaWYgMCAvKiByZWxheGluZyBub3Qgc3VwcG9ydGVkIHlldCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtMzJyLgotICAgUmVsYXhpbmcgb24gdGhlIG0zMnIgaXMgdHJpY2t5IGJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb24gYWxpZ25tZW50Ci0gICByZXF1aXJlbWVudHMgKDQgYnl0ZSBpbnN0cnVjdGlvbnMgbXVzdCBiZSBhbGlnbmVkIG9uIDQgYnl0ZSBib3VuZGFyaWVzKS4KLQotICAgVGhlIGZvbGxvd2luZyByZWxheGluZyBvcHBvcnR1bml0aWVzIGFyZSBoYW5kbGVkOgotCi0gICBzZXRoL2FkZDMvamwgLT4gYmwyNCBvciBibDgKLSAgIHNldGgvYWRkMyAtPiBsZDI0Ci0KLSAgIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIGJsMjQgLT4gYmw4IGJ1dCBnaXZlbjoKLQotICAgLSA0IGJ5dGUgaW5zbnMgbXVzdCBiZSBvbiA0IGJ5dGUgYm91bmRhcmllcwotICAgLSBicmFuY2ggaW5zdHJ1Y3Rpb25zIG9ubHkgYnJhbmNoIHRvIGluc25zIG9uIDQgYnl0ZSBib3VuZGFyaWVzCi0KLSAgIHRoaXMgaXNuJ3QgbXVjaCBvZiBhIHdpbiBiZWNhdXNlIHRoZSBpbnNuIGluIHRoZSAyICJkZWxldGVkIiBieXRlcwotICAgbXVzdCBiZWNvbWUgYSBub3AuICBXaXRoIHNvbWUgY29tcGxleGl0eSBzb21lIHJlYWwgcmVsYXhhdGlvbiBjb3VsZCBiZQotICAgZG9uZSBidXQgdGhlIGZyZXF1ZW5jeSBqdXN0IHdvdWxkbid0IG1ha2UgaXQgd29ydGggaXQ7IGl0J3MgYmV0dGVyIHRvCi0gICB0cnkgdG8gZG8gYWxsIHRoZSBjb2RlIGNvbXBhY3Rpb24gb25lIGNhbiBlbHNld2hlcmUuCi0gICBXaGVuIHRoZSBjaGlwIHN1cHBvcnRzIHBhcmFsbGVsIDE2IGJpdCBpbnNucywgdGhpbmdzIG1heSBjaGFuZ2UuCi0qLwotCi1zdGF0aWMgYm9vbGVhbiAKLW0zMnJfZWxmX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIC8qIFRoZSBSZWxhIHN0cnVjdHVyZXMgYXJlIHVzZWQgaGVyZSBiZWNhdXNlIHRoYXQncyB3aGF0Ci0gICAgIF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcyB1c2VzIFtmb3IgY29udmVuaWVuY2UgLSBpdCBzZXRzIHRoZSBhZGRlbmQKLSAgICAgZmllbGQgdG8gMF0uICAqLwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIEFzc3VtZSBub3RoaW5nIGNoYW5nZXMuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0gICAgICB8fCAwIC8qIEZJWE1FOiBjaGVjayBTSEZfTTMyUl9DQU5fUkVMQVggKi8pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICAvKiBXYWxrIHRocm91Z2ggdGhlbSBsb29raW5nIGZvciByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bXZhbDsKLQotICAgICAgLyogSWYgdGhpcyBpc24ndCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVsYXhlZCwgdGhlbiBpZ25vcmUKLQkgdGhpcyByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfTTMyUl9ISTE2X1NMTykKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgLyogVHJ5IHRvIGNoYW5nZSBhIHNldGgvYWRkMy9qbCBzdWJyb3V0aW5lIGNhbGwgdG8gYmwyNCBvciBibDguCi0JIFRoaXMgc2VxdWVuY2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciB3aGVuIGNvbXBpbGluZyBpbgotCSAzMiBiaXQgbW9kZS4gIEFsc28gbG9vayBmb3Igc2V0aC9hZGQzIC0+IGxkMjQuICAqLwotCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTTMyUl9ISTE2X1NMTykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgcGMgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGJmZF9zaWduZWRfdm1hIHBjcmVsX3ZhbHVlID0gc3ltdmFsIC0gcGM7Ci0JICB1bnNpZ25lZCBpbnQgY29kZSxyZWc7Ci0JICBpbnQgYWRkZW5kLG5vcF9wLGJsOF9wLHRvX2RlbGV0ZTsKLQotCSAgLyogVGhlIHRlc3RzIGFyZSBvcmRlcmVkIHNvIHRoYXQgd2UgZ2V0IG91dCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlCi0JICAgICBpZiB0aGlzIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gcmVsYXgsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdAotCSAgICAgd2UgYXJlIGxvb2tpbmcgZm9yIHR3byBzZXBhcmF0ZSBwb3NzaWJpbGl0aWVzIChqbC9sZDI0KS4gICovCi0KLQkgIC8qIERvIG5vdGhpbmcgaWYgbm8gcm9vbSBpbiB0aGUgc2VjdGlvbiBmb3IgdGhpcyB0byBiZSB3aGF0IHdlJ3JlCi0JICAgICBsb29raW5nIGZvci4gICovCi0JICBpZiAoaXJlbC0+cl9vZmZzZXQgPiBzZWMtPl9jb29rZWRfc2l6ZSAtIDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgcmVsb2NhdGlvbiBhcHBsaWVzIHRvIHRoZSBuZXh0Ci0JICAgICBpbnN0cnVjdGlvbiBhbmQgdGhhdCBpdCdzIHRoZSBhZGQzJ3MgcmVsb2MuICAqLwotCSAgbnJlbCA9IGlyZWwgKyAxOwotCSAgaWYgKG5yZWwgPT0gaXJlbGVuZAotCSAgICAgIHx8IGlyZWwtPnJfb2Zmc2V0ICsgNCAhPSBucmVsLT5yX29mZnNldAotCSAgICAgIHx8IEVMRjMyX1JfVFlQRSAobnJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX00zMlJfTE8xNikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBzZXRoL2FkZDMuICAqLwotCSAgLyogRklYTUU6IFRoaXMgaXMgd2hlcmUgbWFjcm9zIGZyb20gY2dlbiBjYW4gY29tZSBpbi4gICovCi0JICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDApOwotCSAgaWYgKChjb2RlICYgMHhmMGZmKSAhPSAweGQwYzApCi0JICAgIGNvbnRpbnVlOyAvKiBub3Qgc2V0aCByTixmb28gKi8KLQkgIHJlZyA9IChjb2RlICYgMHgwZjAwKSA+PiA4OwotCSAgY29kZSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA0KTsKLQkgIGlmIChjb2RlICE9ICgweDgwYTAgfCByZWcgfCAocmVnIDw8IDgpKSkKLQkgICAgY29udGludWU7IC8qIG5vdCBhZGQzIHJOLHJOLGZvbyAqLwotCi0JICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGNvbmZpcm1lZCB3ZSBoYXZlIHNldGgvYWRkMy4gIE5vdyBjaGVjawotCSAgICAgd2hldGhlciB0aGUgbmV4dCBpbnNuIGlzIGEgamwsIGluIHdoaWNoIGNhc2UgdHJ5IHRvIGNoYW5nZSB0aGlzCi0JICAgICB0byBibDI0IG9yIGJsOC4gICovCi0KLQkgIC8qIEVuc3VyZSB0aGUgYnJhbmNoIHRhcmdldCBpcyBpbiByYW5nZS4KLQkgICAgIFRoZSBibDI0IGluc3RydWN0aW9uIGhhcyBhIDI0IGJpdCBvcGVyYW5kIHdoaWNoIGlzIHRoZSB0YXJnZXQKLQkgICAgIGFkZHJlc3MgcmlnaHQgc2hpZnRlZCBieSAyLCBnaXZpbmcgYSBzaWduZWQgcmFuZ2Ugb2YgMjYgYml0cy4KLQkgICAgIE5vdGUgdGhhdCA0IGJ5dGVzIGFyZSBhZGRlZCB0byB0aGUgaGlnaCB2YWx1ZSBiZWNhdXNlIHRoZSB0YXJnZXQKLQkgICAgIHdpbGwgYmUgYXQgbGVhc3QgNCBieXRlcyBjbG9zZXIgaWYgd2UgY2FuIHJlbGF4LiAgSXQnbGwgYWN0dWFsbHkKLQkgICAgIGJlIDQgb3IgOCBieXRlcyBjbG9zZXIsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGp1c3QgeWV0IGFuZAotCSAgICAgdGhlIGRpZmZlcmVuY2UgaXNuJ3Qgc2lnbmlmaWNhbnQgZW5vdWdoIHRvIHdvcnJ5IGFib3V0LiAgKi8KLSNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCi0JICBwY3JlbF92YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLSNlbHNlCi0JICBhZGRlbmQgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDIpOwotCSAgcGNyZWxfdmFsdWUgKz0gYWRkZW5kOwotI2VuZGlmCi0KLQkgIGlmIChwY3JlbF92YWx1ZSA+PSAtKDEgPDwgMjUpICYmIHBjcmVsX3ZhbHVlIDwgKDEgPDwgMjUpICsgNAotCSAgICAgIC8qIERvIG5vdGhpbmcgaWYgbm8gcm9vbSBpbiB0aGUgc2VjdGlvbiBmb3IgdGhpcyB0byBiZSB3aGF0IHdlJ3JlCi0JCSBsb29raW5nIGZvci4gICovCi0JICAgICAgJiYgKGlyZWwtPnJfb2Zmc2V0IDw9IHNlYy0+X2Nvb2tlZF9zaXplIC0gMTIpCi0JICAgICAgLyogRW5zdXJlIHRoZSBuZXh0IGluc24gaXMgImpsIHJOIi4gICovCi0JICAgICAgJiYgKChjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDgpKSwKLQkJICBjb2RlICE9ICgweDFlYzAgfCByZWcpKSkKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiByZWxheCB0byBibDI0L2JsOC4gICovCi0KLQkgICAgICAvKiBTZWUgaWYgdGhlcmUncyBhIG5vcCBmb2xsb3dpbmcgdGhlIGpsLgotCQkgQWxzbyBzZWUgaWYgd2UgY2FuIHVzZSBhIGJsOCBpbnNuLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEwKTsKLQkgICAgICBub3BfcCA9IChjb2RlICYgMHg3ZmZmKSA9PSBOT1BfSU5TTjsKLQkgICAgICBibDhfcCA9IHBjcmVsX3ZhbHVlID49IC0weDIwMCAmJiBwY3JlbF92YWx1ZSA8IDB4MjAwOwotCi0JICAgICAgaWYgKGJsOF9wKQotCQl7Ci0JCSAgLyogQ2hhbmdlICJzZXRoIHJOLGZvbyIgdG8gImJsOCBmb28gfHwgbm9wIi4KLQkJICAgICBXZSBPUiBpbiBDT0RFIGp1c3QgaW4gY2FzZSBpdCdzIG5vdCBhIG5vcCAodGVjaG5pY2FsbHksCi0JCSAgICAgQ09ERSBjdXJyZW50bHkgbXVzdCBiZSBhIG5vcCwgYnV0IGZvciBjbGVhbm5lc3Mgd2UKLQkJICAgICBhbGxvdyBpdCB0byBiZSBhbnl0aGluZykuICAqLwotI2lmbmRlZiBVU0VfUkVMIC8qIHB1dCBpbiBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKi8KLQkJICBjb2RlID0gMHg3ZTAwMDAwMCB8IE1BS0VfUEFSQUxMRUwgKGNvZGUpOwotI2Vsc2UKLQkJICBjb2RlID0gKDB4N2UwMDAwMDAgKyAoKChhZGRlbmQgPj4gMikgJiAweGZmKSA8PCAxNikpIHwgTUFLRV9QQVJBTExFTCAoY29kZSk7Ci0jZW5kaWYKLQkJICB0b19kZWxldGUgPSA4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2hhbmdlIHRoZSBzZXRoIHJOLGZvbyB0byBhIGJsMjQgZm9vLiAgKi8KLSNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCi0JCSAgY29kZSA9IDB4ZmUwMDAwMDA7Ci0jZWxzZQotCQkgIGNvZGUgPSAweGZlMDAwMDAwICsgKChhZGRlbmQgPj4gMikgJiAweGZmZmZmZik7Ci0jZW5kaWYKLQkJICB0b19kZWxldGUgPSBub3BfcCA/IDggOiA0OwotCQl9Ci0KLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCSAgICAgIC8qIFNldCB0aGUgbmV3IHJlbG9jIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCi0JCQkJCSAgIGJsOF9wID8gUl9NMzJSXzEwX1BDUkVMIDogUl9NMzJSXzI2X1BDUkVMKTsKLQotCSAgICAgIC8qIERlbGV0ZSB0aGUgYWRkMyByZWxvYyBieSBtYWtpbmcgaXQgYSBudWxsIHJlbG9jLiAgKi8KLQkgICAgICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCQkgICBSX00zMlJfTk9ORSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkZGVuZCA+PSAwCi0JCSAgICYmIHN5bXZhbCArIGFkZGVuZCA8PSAweGZmZmZmZikKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiByZWxheCB0byBsZDI0LiAgKi8KLQotCSAgICAgIGNvZGUgPSAweGUwMDAwMDAwIHwgKHJlZyA8PCAyNCkgfCAoYWRkZW5kICYgMHhmZmZmZmYpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCSAgICAgIHRvX2RlbGV0ZSA9IDQ7Ci0JICAgICAgLyogVGVsbCB0aGUgZm9sbG93aW5nIGNvZGUgYSBub3AgZmlsbGVyIGlzbid0IG5lZWRlZC4gICovCi0JICAgICAgbm9wX3AgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBDYW4ndCBkbyBhbnl0aGluZyBoZXJlLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAvKiBEZWxldGUgVE9fREVMRVRFIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgaWYgKCFtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgNCwgdG9fZGVsZXRlKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIE5vdyB0aGF0IHRoZSBmb2xsb3dpbmcgYnl0ZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gcGxhY2UsIHNlZSBpZgotCSAgICAgd2UgbmVlZCB0byByZXBsYWNlIHRoZSBqbCB3aXRoIGEgbm9wLiAgVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGFkCi0JICAgICB0byB1c2UgYSBibDI0IGluc24gYW5kIHRoZSBpbnNuIGZvbGxvd2luZyB0aGUgamwgaXNuJ3QgYSBub3AuCi0JICAgICBUZWNobmljYWxseSwgdGhpcyBzaXR1YXRpb24gY2FuJ3QgaGFwcGVuIChzaW5jZSB0aGUgaW5zbiBjYW4KLQkgICAgIG5ldmVyIGJlIGV4ZWN1dGVkKSBidXQgdG8gYmUgY2xlYW4gd2UgZG8gdGhpcy4gIFdoZW4gdGhlIGNoaXAKLQkgICAgIHN1cHBvcnRzIHBhcmFsbGVsIDE2IGJpdCBpbnNucyB0aGluZ3MgbWF5IGNoYW5nZS4KLQkgICAgIFdlIGRvbid0IG5lZWQgdG8gZG8gdGhpcyBpbiB0aGUgY2FzZSBvZiByZWxheGluZyB0byBsZDI0LAotCSAgICAgYW5kIHRoZSBhYm92ZSBjb2RlIHNldHMgbm9wX3Agc28gdGhpcyBpc24ndCBkb25lLiAgKi8KLQkgIGlmICghIG5vcF9wICYmIHRvX2RlbGV0ZSA9PSA0KQotCSAgICBiZmRfcHV0XzE2IChhYmZkLCBOT1BfSU5TTiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOwotCi0JICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28gd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgKmFnYWluID0gdHJ1ZTsKLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBsb29wIHRvIHRyeSB0aGUgbmV4dCByZWxvYyAqLwotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JfQotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICBpbnQgc2huZHgsIGluZGV4OwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCi0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikpCi0JaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgotCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotICAgICAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdOwotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmICgoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICB3aGljaCB1c2VzIG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotbTMycl9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKLSAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAotCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQotICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7Ci0JICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQotCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCi0JCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQotCXsKLQkgIGFzZWN0aW9uICppc2VjOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOwotCi0JICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9NMzJSX1NDT01NT04pCi0JICAgIGlzZWMgPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2hvIGtub3dzPyAgKi8KLQkgICAgICBpc2VjID0gTlVMTDsKLQkgICAgfQotCi0JICAqc2VjcHAgPSBpc2VjOwotCX0KLQotICAgICAgaWYgKCEgbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZW5kaWYgLyogI2lmIDAgKi8KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX00zMlJfQVJDSDogICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTMyciwgYmZkX21hY2hfbTMycik7ICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KLXN0YXRpYyB2b2lkCi1tMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9tYWNoX20zMnI6ICB2YWwgPSBFX00zMlJfQVJDSDsgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9NMzJSX0FSQ0g7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBNMzJSIHNwZWNpZmljIGZpbGUgZmxhZ3MuICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiAgICBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzICA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0JIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLQkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX00zMlJfQVJDSCkpCi0gICAgewotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gRV9NMzJSX0FSQ0gpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogSW5zdHJ1Y3Rpb24gc2V0IG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpCi0gIAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotICAKLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICVseCIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0gIAotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTTMyUl9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9NMzJSX0FSQ0g6ICBmcHJpbnRmIChmaWxlLCBfKCI6IG0zMnIgaW5zdHJ1Y3Rpb25zIikpOyAgYnJlYWs7Ci0gICAgfQotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWFzZWN0aW9uICoKLW0zMnJfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX00zMlJfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBtMzJyICovCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotDAotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tMzJyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX00zMlIKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfbTMycl92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItbTMyciIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJCTAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkJbTMycl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCV9iZmRfbTMycl9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQltMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgbTMycl9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBtMzJyX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBtMzJyX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgICAgICAgICAgICAgMQotI2lmIDAgLyogbm90IHlldCAqLwotLyogcmVsYXggc3VwcG9ydCAqLwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JCW0zMnJfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCQltMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkJbTMycl9lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAJbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEJbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCQkJCQkKLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tNjhrLmMgYi9iZmQvZWxmMzItbTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2VjZjM2Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAxICswLDAgQEAKLS8qIE1vdG9yb2xhIDY4ayBzZXJpZXMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpyZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZl9tNjhrX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmVsZl9tNjhrX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2djX3N3ZWVwX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2FkanVzdF9keW5pbmR4Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gewotICBIT1dUTyhSXzY4S19OT05FLCAgICAgICAwLCAwLCAwLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfTk9ORSIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwMDAsZmFsc2UpLAotICBIT1dUTyhSXzY4S18zMiwgICAgICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfMzIiLCAgICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S18xNiwgICAgICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfMTYiLCAgICAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S184LCAgICAgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfOCIsICAgICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QQzMyLCAgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUEMzMiIsICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BDMTYsICAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QQzE2IiwgICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUEM4LCAgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BDOCIsICAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QzMiwgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMzIiLCAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDE2LCAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfR09UOCwgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDgiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QzMk8sICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMzJPIiwgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HT1QxNk8sICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMTZPIiwgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HT1Q4TywgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UOE8iLCAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQzMiwgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMzIiLCAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BMVDE2LCAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUExUOCwgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDgiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QTFQzMk8sICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMzJPIiwgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQxNk8sICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMTZPIiwgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQ4TywgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUOE8iLCAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19DT1BZLCAgICAgICAwLCAwLCAwLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfQ09QWSIsICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HTE9CX0RBVCwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR0xPQl9EQVQiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19KTVBfU0xPVCwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfSk1QX1NMT1QiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19SRUxBVElWRSwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUkVMQVRJVkUiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl82OEtfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl82OEtfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSXzY4S19HTlVfVlRFTlRSWSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfNjhLX0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1ydHlwZV90b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl82OEtfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b190YWJsZVtFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pXTsKLX0KLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBydHlwZV90b19ob3d0bwotCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfdmFsOwotICBpbnQgZWxmX3ZhbDsKLX0gcmVsb2NfbWFwW10gPSB7Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfNjhLX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfNjhLXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSXzY4S18xNiB9LAotICB7IEJGRF9SRUxPQ184LCBSXzY4S184IH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSXzY4S19QQzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSXzY4S19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfNjhLX1BDOCB9LAotICB7IEJGRF9SRUxPQ18zMl9HT1RfUENSRUwsIFJfNjhLX0dPVDMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwgUl82OEtfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfOF9HT1RfUENSRUwsIFJfNjhLX0dPVDggfSwKLSAgeyBCRkRfUkVMT0NfMzJfR09UT0ZGLCBSXzY4S19HT1QzMk8gfSwKLSAgeyBCRkRfUkVMT0NfMTZfR09UT0ZGLCBSXzY4S19HT1QxNk8gfSwKLSAgeyBCRkRfUkVMT0NfOF9HT1RPRkYsIFJfNjhLX0dPVDhPIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCwgUl82OEtfUExUMzIgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUExUX1BDUkVMLCBSXzY4S19QTFQxNiB9LAotICB7IEJGRF9SRUxPQ184X1BMVF9QQ1JFTCwgUl82OEtfUExUOCB9LAotICB7IEJGRF9SRUxPQ18zMl9QTFRPRkYsIFJfNjhLX1BMVDMyTyB9LAotICB7IEJGRF9SRUxPQ18xNl9QTFRPRkYsIFJfNjhLX1BMVDE2TyB9LAotICB7IEJGRF9SRUxPQ184X1BMVE9GRiwgUl82OEtfUExUOE8gfSwKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl82OEtfQ09QWSB9LAotICB7IEJGRF9SRUxPQ182OEtfR0xPQl9EQVQsIFJfNjhLX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DXzY4S19KTVBfU0xPVCwgUl82OEtfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFLCBSXzY4S19SRUxBVElWRSB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSXzY4S18zMiB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl82OEtfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfNjhLX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHJlbG9jX21hcCkgLyBzaXplb2YgKHJlbG9jX21hcFswXSk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocmVsb2NfbWFwW2ldLmJmZF92YWwgPT0gY29kZSkKLQlyZXR1cm4gJmhvd3RvX3RhYmxlW3JlbG9jX21hcFtpXS5lbGZfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgRUxGX0FSQ0ggYmZkX2FyY2hfbTY4awotLyogZW5kIGNvZGUgZ2VuZXJhdGVkIGJ5IGVsZi5lbCAqLwotCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIG02OGsgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9saWJjLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMjAKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZSB0aGlzLiAgU2VlCi0gICB0aGUgU1ZSNCBBQkkgbTY4ayBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfbTY4a19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MmYsIDB4M2IsIDB4MDEsIDB4NzAsIC8qIG1vdmUubCAoJXBjLGFkZHIpLC0oJXNwKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxhZGRyXSkgKi8KLSAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gLmdvdCArIDguICAqLwotICAwLCAwLCAwLCAwCQkgIC8qIHBhZCBvdXQgdG8gMjAgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX202OGtfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxzeW1ib2xAR09UUENdKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHgyZiwgMHgzYywJCSAgLyogbW92ZS5sICNvZmZzZXQsLSglc3ApICovCi0gIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsCQkgIC8qIGJyYS5sIC5wbHQgKi8KLSAgMCwgMCwgMCwgMAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLSNkZWZpbmUgQ1BVMzJfRkxBRyhhYmZkKSAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQ1BVMzIpCi0KLSNkZWZpbmUgUExUX0NQVTMyX0VOVFJZX1NJWkUgMjQKLS8qIFByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJpZXMgZm9yIHRoZSBjcHUzMiAqLwotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9jcHUzMl9wbHQwX2VudHJ5W1BMVF9DUFUzMl9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MjAsIDB4N2IsIDB4MDEsIDB4NzAsIC8qIG1vdmVhbCAlcGNAKDB4YyksICVhMCAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZDAsICAgICAgICAgICAgIC8qIGptcCAlYTBAICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCBvZmZzZXQgdG8gLmdvdCArOC4gKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgLyogcGFkIG91dCB0byAyNCBieXRlcy4gICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHBhZCBvdXQgdG8gMjQgYnl0ZXMuICAqLwotICAwLCAwCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2NwdTMyX3BsdF9lbnRyeVtQTFRfQ1BVMzJfRU5UUllfU0laRV0gPQotewotICAweDIwLCAweDdiLCAweDAxLCAweDcwLCAgLyogbW92ZWFsICVwY0AoMHhjKSwgJWEwICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHg0ZSwgMHhkMCwgICAgICAgICAgICAgIC8qIGptcCAlYTBAICovCi0gIDB4MmYsIDB4M2MsICAgICAgICAgICAgICAvKiBtb3ZlLmwgI29mZnNldCwtKCVzcCkgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsICAgICAgICAgICAgICAvKiBicmEubCAucGx0ICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLSAgMCwgMAotfTsKLQotLyogVGhlIG02OGsgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQgaXQKLSAgIGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkIGV4dGVuZGluZyB0aGUKLSAgIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UgaGF2ZQotICAgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBtNjhrIEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfbTY4a19oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICopIChwKS0+aGFzaCkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEtlZXAgbTY4ay1zcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBtNjhrLXNwZWNpZmljIGRhdGEgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgaW5fZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgcHRyOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0KLSAgLyogUHJpbnQgbm9ybWFsIEVMRiBwcml2YXRlIGRhdGEuICAqLwotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotCi0gIC8qIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLiAgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0NQVTMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2NwdTMyXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HT1Q4OgotCWNhc2UgUl82OEtfR09UMTY6Ci0JY2FzZSBSXzY4S19HT1QzMjoKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJIChTRUNfQUxMT0MKLQkJCQkJCSAgfCBTRUNfTE9BRAotCQkJCQkJICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0KLQkJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICAvKiBBbGxvY2F0ZSByZWxvY2F0aW9uIHNwYWNlLiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF9zaWduZWRfdm1hKTsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkJCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplKSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCkgPSBsb2NhbF9nb3RfcmVmY291bnRzOwotCQkgIG1lbXNldCAobG9jYWxfZ290X3JlZmNvdW50cywgLTEsIHNpemUpOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID09IC0xKQotCQl7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPSAxOwotCi0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCQkgb3V0cHV0IGEgUl82OEtfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkJIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdKys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotCSAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2hpY2ggaXMKLSAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkKLSAgICAgICAgICAgICBhZnRlciBhbGwuICAqLwotCi0JICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLQkgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4TzoKLQljYXNlIFJfNjhLX1BMVDE2TzoKLQljYXNlIFJfNjhLX1BMVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIHRoaXMgcmVsb2NhdGlvbiBmb3IgYQotCQkgbG9jYWwgc3ltYm9sLiAgRklYTUU6IGRvZXMgaXQ/ICBIb3cgdG8gaGFuZGxlIGl0IGlmCi0JCSBpdCBkb2VzIG1ha2Ugc2Vuc2U/ICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgIGVsc2UKLQkgICAgaC0+cGx0LnJlZmNvdW50Kys7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUEM4OgotCWNhc2UgUl82OEtfUEMxNjoKLQljYXNlIFJfNjhLX1BDMzI6Ci0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgdGhpcyBpcyBub3QgYSBsb2NhbAotCSAgICAgc3ltYm9sLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgSG93ZXZlciB3aGVuIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljIGFuZCB0aGlzIGlzIGEgZ2xvYmFsCi0JICAgICBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlIGluY2x1ZGluZyBpbiB0aGUKLQkgICAgIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCksIHRoZW4gd2UgY2FuIHJlc29sdmUgdGhlCi0JICAgICByZWxvYyBkaXJlY3RseS4gIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0Ci0JICAgICBmaWxlcywgc28gaXQgaXMgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQKLQkgICAgIHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLQkgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0JICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmICghKGluZm8tPnNoYXJlZAotCQkmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkmJiBoICE9IE5VTEwKLQkJJiYgKCFpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJewotCQkgIC8qIE1ha2Ugc3VyZSBhIHBsdCBlbnRyeSBpcyBjcmVhdGVkIGZvciB0aGlzIHN5bWJvbCBpZgotCQkgICAgIGl0IHR1cm5zIG91dCB0byBiZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBkeW5hbWljCi0JCSAgICAgb2JqZWN0LiAgKi8KLQkJICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkJICBlbHNlCi0JCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl82OEtfODoKLQljYXNlIFJfNjhLXzE2OgotCWNhc2UgUl82OEtfMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIGEgcGx0IGVudHJ5IGlzIGNyZWF0ZWQgZm9yIHRoaXMgc3ltYm9sIGlmIGl0Ci0JCSB0dXJucyBvdXQgdG8gYmUgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotCSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JCWgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JICAgICAgZWxzZQotCQloLT5wbHQucmVmY291bnQrKzsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0byBjb3B5IHRoZQotCSAgICAgcmVsb2MgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCQkgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotCQkgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgICB8IFNFQ19SRUFET05MWSkpCi0JCQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YKLQkJIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsCi0JCSBzbyB0aGF0IHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotCQkgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLQkJIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBtNjhrZWxmIGxpbmtlciBoYXNoIHRhYmxlLAotCQkgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8gYW4KLQkJIGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgaWYgKChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzY4S19QQzgKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMTYKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMzIpCi0JCSAgJiYgaW5mby0+c3ltYm9saWMpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICplaDsKLQkJICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcDsKLQotCQkgIGVoID0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCQkgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICBicmVhazsKLQotCQkgIGlmIChwID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSAoKHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICpwKSk7Ci0JCSAgICAgIGlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKLQkJICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICBwLT5jb3VudCA9IDA7Ci0JCSAgICB9Ci0KLQkJICArK3AtPmNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZl9tNjhrX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl82OEtfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaikKLSAgICB7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgfQotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl82OEtfR09UODoKLQljYXNlIFJfNjhLX0dPVDE2OgotCWNhc2UgUl82OEtfR09UMzI6Ci0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLQkJewotCQkgIC0taC0+Z290LnJlZmNvdW50OwotCQkgIGlmIChoLT5nb3QucmVmY291bnQgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgLmdvdCBlbnRyeSBhbnkgbW9yZS4gICovCi0JCSAgICAgIHNnb3QtPl9yYXdfc2l6ZSAtPSA0OwotCQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgLT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPiAwKQotCQl7Ci0JCSAgLS1sb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XTsKLQkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgLmdvdCBlbnRyeSBhbnkgbW9yZS4gICovCi0JCSAgICAgIHNnb3QtPl9yYXdfc2l6ZSAtPSA0OwotCQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkJc3JlbGdvdC0+X3Jhd19zaXplIC09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX1BMVDg6Ci0JY2FzZSBSXzY4S19QTFQxNjoKLQljYXNlIFJfNjhLX1BMVDMyOgotCWNhc2UgUl82OEtfUExUOE86Ci0JY2FzZSBSXzY4S19QTFQxNk86Ci0JY2FzZSBSXzY4S19QTFQzMk86Ci0JY2FzZSBSXzY4S19QQzg6Ci0JY2FzZSBSXzY4S19QQzE2OgotCWNhc2UgUl82OEtfUEMzMjoKLQljYXNlIFJfNjhLXzg6Ci0JY2FzZSBSXzY4S18xNjoKLQljYXNlIFJfNjhLXzMyOgotCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQotCQktLWgtPnBsdC5yZWZjb3VudDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwCi0JICAvKiBXZSBtdXN0IGFsd2F5cyBjcmVhdGUgdGhlIHBsdCBlbnRyeSBpZiBpdCB3YXMgcmVmZXJlbmNlZAotCSAgICAgYnkgYSBQTFR4eE8gcmVsb2NhdGlvbi4gIEluIHRoaXMgY2FzZSB3ZSBhbHJlYWR5IHJlY29yZGVkCi0JICAgICBpdCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICYmIGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFR4eCByZWxvYyBpbiBhbiBpbnB1dAotCSAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYwotCSAgICAgb2JqZWN0LiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQKLQkgICAgIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFBDeHgKLQkgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBHQyBtYXkgaGF2ZSByZW5kZXJlZCB0aGlzIGVudHJ5IHVudXNlZC4gICovCi0gICAgICBpZiAoaC0+cGx0LnJlZmNvdW50IDw9IDApCi0JewotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQl7Ci0JICBpZiAoQ1BVMzJfRkxBRyAoZHlub2JqKSkKLQkgICAgcy0+X3Jhd19zaXplICs9IFBMVF9DUFUzMl9FTlRSWV9TSVpFOwotCSAgZWxzZQotCSAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgaWYgKENQVTMyX0ZMQUcgKGR5bm9iaikpCi0gICAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfQ1BVMzJfRU5UUllfU0laRTsKLSAgICAgIGVsc2UKLSAgICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKLQkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gNDsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFJlaW5pdGlhbGl6ZSB0aGUgcGx0IG9mZnNldCBub3cgdGhhdCBpdCBpcyBub3QgdXNlZCBhcyBhIHJlZmVyZW5jZQotICAgICBjb3VudCBhbnkgbW9yZS4gICovCi0gIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl82OEtfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsYS5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0JIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLQkgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotCSB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotCSBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsIFBDCi0gICAgIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgV2UKLSAgICAgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdpbGwgbm90Ci0gICAgIGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCAmJiBpbmZvLT5zeW1ib2xpYykKLSAgICBlbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9tNjhrX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSBlbGZfbTY4a19kaXNjYXJkX2NvcGllcywKLQkJCQkgKFBUUikgTlVMTCk7Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICBwbHQgPSBmYWxzZTsKLSAgcmVsb2NzID0gZmFsc2U7Ci0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCi0gICAgICAgICAgICAgICAgIHRoYW4gLnJlbGEucGx0LiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbGEucGx0IikgIT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkJICByZWxvY3MgPSB0cnVlOwotCi0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKLQkJICAgICBlbnRyeS4gIC5yZWxhLnBsdCBpcyBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGgKLQkJICAgICAuZ290LnBsdCwgd2hpY2ggaXMgbmV2ZXIgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgotICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1pZ2h0IG5lZWQgdG8gY29weQotICAgICByZWxvY3MuICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZQotICAgICBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50Ci0gICAgIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeSBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAotCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7Ci0KLQkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQotCSAgKytjOwotCX0KLQotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgZWxmX202OGtfYWRqdXN0X2R5bmluZHgsCi0JCQkgICAgICAoUFRSKSAmYyk7Ci0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBjcGFyZzsKLXsKLSAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX202OGtfbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZAotICAgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3MKLSAgIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYW4gTTY4SyBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSXzY4S19tYXgpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGlmICgoKHJfdHlwZSA9PSBSXzY4S19QTFQ4Ci0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMTYKLQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19QTFQzMgotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDhPCi0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMTZPCi0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMzJPKQotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMQotCQkgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQkJICB8fCAoKHJfdHlwZSA9PSBSXzY4S19HT1Q4TwotCQkgICAgICAgfHwgcl90eXBlID09IFJfNjhLX0dPVDE2TwotCQkgICAgICAgfHwgcl90eXBlID09IFJfNjhLX0dPVDMyTwotCQkgICAgICAgfHwgKChyX3R5cGUgPT0gUl82OEtfR09UOAotCQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNgotCQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMikKLQkJCSAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgICAgICAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgIT0gMCkpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSXzY4S184Ci0JCQkgIHx8IHJfdHlwZSA9PSBSXzY4S18xNgotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfMzIKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDOAotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfUEMxNgotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfUEMzMikpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLQkJICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLQkJICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKGluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbAotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl82OEtfR09UODoKLQljYXNlIFJfNjhLX0dPVDE2OgotCWNhc2UgUl82OEtfR09UMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wKLQkgICAgIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdGhlIG9mZnNldCBvZiB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluCi0JICAgICB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLQkgIHsKLQkgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCQlCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkJQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkJaWYgKCFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgfHwgKGluZm8tPnNoYXJlZAotCQkJJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCQkmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJICB7Ci0JCSAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkJICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JCSAgICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKLQkJICAgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuLiAgV2UgbXVzdCBpbml0aWFsaXplCi0JCSAgICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UKLQkJICAgICAgIHRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZQotCQkgICAgICAgdXNlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIKLQkJICAgICAgIHdlIGhhdmUgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCQkgICAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgICBvZmYgJj0gfjE7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJCWgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCUJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQotCQlvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkJLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLQkJICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSAgIGFscmVhZHkgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICAqLwotCQlpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgb2ZmICY9IH4xOwotCQllbHNlCi0JCSAgewotCQkgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCi0JCSAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgICB7Ci0JCQlhc2VjdGlvbiAqc3JlbGdvdDsKLQkJCUVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkJc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJCUJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJCW91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgICArIG9mZik7Ci0JCQlvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7Ci0JCQlvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uOwotCQkJYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAgICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkJKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgICAgfQotCi0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCSAgICBpZiAocl90eXBlID09IFJfNjhLX0dPVDhPCi0JCXx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNk8KLQkJfHwgcl90eXBlID09IFJfNjhLX0dPVDMyTykKLQkgICAgICB7Ci0JCS8qIFRoaXMgcmVsb2NhdGlvbiBkb2VzIG5vdCB1c2UgdGhlIGFkZGVuZC4gICovCi0JCXJlbC0+cl9hZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gKz0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLQkgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogUmVzb2x2ZSBhIFBMVHh4IHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHksCi0JICAgICB3aXRob3V0IHVzaW5nIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xCi0JICAgICAgfHwgIWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotCQkgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotCQkgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUOE86Ci0JY2FzZSBSXzY4S19QTFQxNk86Ci0JY2FzZSBSXzY4S19QTFQzMk86Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbgotCSAgICAgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSBoLT5wbHQub2Zmc2V0OwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZG9lcyBub3QgdXNlIHRoZSBhZGRlbmQuICAqLwotCSAgcmVsLT5yX2FkZGVuZCA9IDA7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QQzg6Ci0JY2FzZSBSXzY4S19QQzE2OgotCWNhc2UgUl82OEtfUEMzMjoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfNjhLXzg6Ci0JY2FzZSBSXzY4S18xNjoKLQljYXNlIFJfNjhLXzMyOgotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICAgICYmICgocl90eXBlICE9IFJfNjhLX1BDOAotCQkgICAmJiByX3R5cGUgIT0gUl82OEtfUEMxNgotCQkgICAmJiByX3R5cGUgIT0gUl82OEtfUEMzMikKLQkJICB8fCAoIWluZm8tPnN5bWJvbGljCi0JCSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcCwgcmVsb2NhdGU7Ci0KLQkgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucwotCQkgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLQkJIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJewotCQkgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJfQotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAotCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIHJfdHlwZSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocl90eXBlID09IFJfNjhLXzMyKQotCQkgICAgewotCQkgICAgICByZWxvY2F0ZSA9IHRydWU7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfNjhLX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQl9Ci0JCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQlpbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0JCQkgIEJGRF9BU1NFUlQgKGluZHggPiAwKTsKLQkJCX0KLQotCQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCByX3R5cGUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgZXhjZXB0IGZvciBSXzY4S18zMgotICAgICAgICAgICAgICAgICByZWxvY2F0aW9ucyB0aGF0IGhhdmUgYmVlbiB0dXJuZWQgaW50bwotICAgICAgICAgICAgICAgICBSXzY4S19SRUxBVElWRS4gICovCi0JICAgICAgaWYgKCFyZWxvY2F0ZSkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIC8qIFRoZXNlIGFyZSBuby1vcHMgaW4gdGhlIGVuZC4gICovCi0JICBjb250aW51ZTsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghKGluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cKLQkJICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGludCBwbHRfb2ZmMSwgcGx0X29mZjIsIHBsdF9vZmYzOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0JIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAotCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCi0JIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQotCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKCBDUFUzMl9GTEFHIChvdXRwdXRfYmZkKSkKLSAgICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9DUFUzMl9FTlRSWV9TSVpFIC0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAotCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCi0JIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7Ci0KLSAgICAgIGlmICggQ1BVMzJfRkxBRyAob3V0cHV0X2JmZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfY3B1MzJfcGx0X2VudHJ5LAotCSAgICAgICAgICBQTFRfQ1BVMzJfRU5UUllfU0laRSk7Ci0gICAgICAgICAgcGx0X29mZjEgPSA0OwotICAgICAgICAgIHBsdF9vZmYyID0gMTI7Ci0gICAgICAgICAgcGx0X29mZjMgPSAxODsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX202OGtfcGx0X2VudHJ5LAotCSAgICAgICAgICBQTFRfRU5UUllfU0laRSk7Ci0gICAgICAgICAgcGx0X29mZjEgPSA0OwotICAgICAgICAgIHBsdF9vZmYyID0gMTA7Ci0gICAgICAgICAgcGx0X29mZjMgPSAxNjsKLSAgICAgICAgfQotCi0gICAgICAvKiBUaGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBleHRlbnNpb24gd29yZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICArIGdvdF9vZmZzZXQKLQkJICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnBsdC5vZmZzZXQgKyAyKSksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgcGx0X29mZjEpOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBwbHRfaW5kZXggKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIHBsdF9vZmYyKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIC0gKGgtPnBsdC5vZmZzZXQgKyBwbHRfb2ZmMyksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgcGx0X29mZjMpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICArIGgtPnBsdC5vZmZzZXQKLQkJICAgKyA4KSwKLQkJICBzZ290LT5jb250ZW50cyArIGdvdF9vZmZzZXQpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl82OEtfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBwbHRfaW5kZXgpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLQkgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCi0JIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgotCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgotCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JewotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfNjhLX1JFTEFUSVZFKTsKLQkgIHJlbGEucl9hZGRlbmQgPSBiZmRfZ2V0X3NpZ25lZF8zMiAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAoc2dvdC0+Y29udGVudHMKLQkJCQkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmIH4xKSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgc2dvdC0+Y29udGVudHMgKyAoaC0+Z290Lm9mZnNldCAmIH4xKSk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl82OEtfR0xPQl9EQVQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGludCBwbHRfZW50cnkwX3NpemUsIHBsdF9vZmYxLCBwbHRfb2ZmMjsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbGEucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTEFTWjoKLQkgICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgcmVsb2NzIChEVF9KTVBSRUwpIHNob3VsZAotCQkgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMQSkuCi0JCSBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxBU1ogZW50cnkgaGVyZSB0bwotCQkgbWFrZSBpdCBub3QgaW5jbHVkZSB0aGUgSk1QUkVMIHJlbG9jcy4gIFNpbmNlIHRoZQotCQkgbGlua2VyIHNjcmlwdCBhcnJhbmdlcyBmb3IgLnJlbGEucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUxBIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X2Nvb2tlZF9zaXplOwotCQkgIGVsc2UKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9yYXdfc2l6ZTsKLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0gICAgICAgICAgaWYgKCFDUFUzMl9GTEFHIChvdXRwdXRfYmZkKSkKLSAgICAgICAgICAgIHsKLQkgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfbTY4a19wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgNAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAyKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMTApKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgMTIpOwotICAgICAgICAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgCi0gICAgICAgICAgICAgICA9IFBMVF9FTlRSWV9TSVpFOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgLyogY3B1MzIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX2NwdTMyX3BsdDBfZW50cnksIFBMVF9DUFUzMl9FTlRSWV9TSVpFKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgOAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxMCkpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyAxMCk7Ci0gICAgICAgICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSAKLSAgICAgICAgICAgICAgID0gUExUX0NQVTMyX0VOVFJZX1NJWkU7Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBmaXJzdCB0aHJlZSBlbnRyaWVzIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgOCk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2R5bnN5bTsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBpbnQgYzsKLQotICAgICAgLyogU2V0IHVwIHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCi0gICAgICBzZHluc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNkeW5zeW0gIT0gTlVMTCk7Ci0KLSAgICAgIHN5bS5zdF9zaXplID0gMDsKLSAgICAgIHN5bS5zdF9uYW1lID0gMDsKLSAgICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotICAgICAgc3ltLnN0X290aGVyID0gMDsKLQotICAgICAgYyA9IDA7Ci0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpbnQgaW5keDsKLQotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7Ci0KLQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7Ci0JICBzeW0uc3Rfc2huZHggPSBpbmR4OwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAotCQkJCSAgICAgKFBUUikgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkJCSAgICAgc2R5bnN5bS0+Y29udGVudHMpCi0JCQkJCSAgICArIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4KSk7Ci0KLQkgICsrYzsKLQl9Ci0KLSAgICAgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgb3V0cHV0IC5keW5zeW0gc2VjdGlvbiB0byB0aGUKLSAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNkeW5zeW0tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9IGMgKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9tNjhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItbTY4ayIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fNjhLCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MjAwMAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJCWVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmX202OGtfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawllbGZfbTY4a19nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawllbGZfbTY4a19nY19zd2VlcF9ob29rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tODhrLmMgYi9iZmQvZWxmMzItbTg4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRlMjJhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBNb3Rvcm9sYSA4OGstc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9ucywgYnV0IHNob3VsZCBiZSBnb29kIGVub3VnaAotICAgZm9yIEdEQi4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tODhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tODhrIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbTg4awotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNXzg4SwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgIAkxIC8qIEZJWE1FOiBUaGlzIG51bWJlciBpcyB3cm9uZywgIEl0IHNob3VsZCBiZSB0aGUgcGFnZSBzaXplIGluIGJ5dGVzLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJX2JmZF9lbGZfbm9faW5mb190b19ob3d0bwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbWNvcmUuYyBiL2JmZC9lbGYzMi1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBkZGM1Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qIE1vdG9yb2xhIE1Db3JlIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBhIHByZWxpbWluYXJ5IFJDRSBFTEYgQUJJLiAgVGhlCi0gICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBSQ0UgRUxGIEFCSS4gICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZQlVU0VfUkVMQQkvKiBPbmx5IFVTRV9SRUwgaXMgYWN0dWFsbHkgc2lnbmlmaWNhbnQsIGJ1dCB0aGlzIGlzCi0JCQkgICBoZXJlIGFyZSBhIHJlbWluZGVyLi4uICovCi0KLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9ob3d0b19pbml0Ci0gIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgUl9NQ09SRV9tYXhdOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9lbGZfaG93dG9fcmF3W10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX01DT1JFX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX05PTkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01DT1JFX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJBRERSMzIiLAkJLyogbmFtZSAqLy8qIEZvciBjb21wYXRhYmlsaXR5IHdpdGggY29mZi9wZSBwb3J0LiAgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTElNTThCWTQiLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBic3IvYnQvYmYvYnIgaW5zdHJ1Y3Rpb25zOyAxMSBiaXRzICsgMSB6ZXJvIGJpdCAKLSAgICAgU3BhbiAyayBpbnN0cnVjdGlvbnMgPT0gNGsgYnl0ZXMuCi0gICAgIE9ubHkgdXNlZnVsIHBpZWNlcyBhdCB0aGUgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIHRoZSBvcGNvZGUgKDUgYml0cykgKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxJTU0xMUJZMiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDQgYml0cyArIDEgemVybyBiaXQ7ICdsb29wdCcgaW5zdHJ1Y3Rpb24gb25seTsgdW5zdXBwb3J0ZWQuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NNEJZMiwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMSU1NNEJZMiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBwYy1yZWxhdGl2ZS4gRXZlbnR1YWxseSB0aGlzIHdpbGwgaGVscCBzdXBwb3J0IFBJQyBjb2RlLiAqLwotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFBDUkVMSU1NMTFCWTIsIHRoaXMgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhCi0gICAgICdqc3JpJyBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIFRoZXJlIGlzIGEgc2VwYXJhdGUgcmVsb2NhdGlvbgotICAgICBlbnRyeSBmb3IgdGhlIGxpdGVyYWwgcG9vbCBlbnRyeSB0aGF0IGl0IHJlZmVyZW5jZXMsIGJ1dCB3ZSAKLSAgICAgbWlnaHQgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGpzcmkgdG8gYSBic3IgaWYgdGhlIHRhcmdldCB0dXJucyBvdXQKLSAgICAgdG8gYmUgY2xvc2UgZW5vdWdoIFtldmVuIHRob3VnaCB3ZSB3b24ndCByZWNsYWltIHRoZSBsaXRlcmFsIHBvb2wKLSAgICAgZW50cnksIHdlJ2xsIGdldCBzb21lIHJ1bnRpbWUgZWZmaWNpZW5jeSBiYWNrXS4gTm90ZSB0aGF0IHRoaXMKLSAgICAgaXMgYSByZWxvY2F0aW9uIHRoYXQgd2UgYXJlIGFsbG93ZWQgdG8gc2FmZWx5IGlnbm9yZS4gICovIAotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NQ09SRV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9NQ09SRV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfTUNPUkVfR05VX1ZURU5UUlksICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX01DT1JFX0dOVV9WVEVOVFJZIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBIT1dUTyAoUl9NQ09SRV9SRUxBVElWRSwgICAgICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1JFTEFUSVZFIiwgICAgLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQwKLS8qIEluaXRpYWxpemUgdGhlIG1jb3JlX2VsZl9ob3d0b190YWJsZSwgc28gdGhhdCBsaW5lYXIgYWNjZXNzZXMgY2FuIGJlIGRvbmUuICAqLwotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9ob3d0b19pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fcmF3KTsgaS0tOykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICAgIAotICAgICAgdHlwZSA9IG1jb3JlX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIAotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fdGFibGUpKTsKLSAgICAgIAotICAgICAgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFt0eXBlXSA9ICYgbWNvcmVfZWxmX2hvd3RvX3JhdyBbaV07Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9OT05FOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTk9ORToJCSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX05PTkU7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJCSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0FERFIzMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNDoJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxJTU04Qlk0OyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMjogICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTTExQlkyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyOgkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTTRCWTI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUwzMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyOiBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOiAgICAgICAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0dOVV9WVElOSEVSSVQ7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWTogICAgICAgICAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0dOVV9WVEVOVFJZOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6ICAgICAgICAgICAgICAgICAgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9SRUxBVElWRTsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0gICAgfQotCi0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIHJldHVybiBtY29yZV9lbGZfaG93dG9fdGFibGUgWyhpbnQpIG1jb3JlX3JlbG9jXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBSQ0UgRUxGIHJlbG9jLiAgKi8KLXN0YXRpYyB2b2lkCi1tY29yZV9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKiBkc3Q7Ci17Ci0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9NQ09SRV9tYXgpOwotICAKLSAgY2FjaGVfcHRyLT5ob3d0byA9IG1jb3JlX2VsZl9ob3d0b190YWJsZSBbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0vKiBGdW5jdGlvbiB0byBzZXQgd2hldGhlciBhIG1vZHVsZSBuZWVkcyB0aGUgLW1yZWxvY2F0YWJsZSBiaXQgc2V0LiAqLwotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghIGVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotICBib29sZWFuIGVycm9yOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbi5cbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLSAgICAgICAgIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIAotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCS8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIERvbid0IHByZXRlbmQgd2UgY2FuIGRlYWwgd2l0aCB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqIHN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlOwotewotICBCRkRfQVNTRVJUIChyZWxvY19lbnRyeS0+aG93dG8gIT0gKHJlbG9jX2hvd3RvX3R5cGUgKikwKTsKLSAgCi0gIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJICAgICAgcmVsb2NfZW50cnktPmhvd3RvLT5uYW1lLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPnR5cGUpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0MCi0vKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uLgotCi0gICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgemVyby4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlIHJlbG9jIGFkZGVuZCBhcwotICAgbmVjZXNzYXJ5LgotCi0gICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdF9zaG5keCBmaWVsZCBvZiBlYWNoIGxvY2FsIHN5bWJvbC4KLQotICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlCi0gICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYWRkZW5kIG11c3QgYmUgYWRqdXN0ZWQKLSAgIGFjY29yZGluZ2x5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsID0gcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotICBsb25nIGluc247Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgIm1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50LAotCSAgIChpbmZvLT5yZWxvY2F0ZWFibGUpID8gIiAocmVsb2NhdGFibGUpIiA6ICIiKTsKLSNlbmRpZgotCi0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUgICAgcl90eXBlID0gKGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByID0gYmZkX3JlbG9jX290aGVyOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWMgPSAoYXNlY3Rpb24gKikgMDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bSA9IChFbGZfSW50ZXJuYWxfU3ltICopIDA7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIDA7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgIG9sZGluc3Q7Ci0gICAgICAKLSAgICAgIC8qIFVua25vd24gcmVsb2NhdGlvbiBoYW5kbGluZyAqLwotICAgICAgaWYgKCh1bnNpZ25lZCkgcl90eXBlID49ICh1bnNpZ25lZCkgUl9NQ09SRV9tYXgKLQkgIHx8ICEgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KXJfdHlwZV0pCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogVW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWRcbiIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgIChpbnQpIHJfdHlwZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAKLSAgICAgIGhvd3RvID0gbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSByX3R5cGVdOwotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIAotCSAgICAgIGlmICgodW5zaWduZWQpRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCQkgICBob3d0by0+bmFtZSwgKGludCkgcl90eXBlLCByX3N5bW5keCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIGFkZGVuZCk7Ci0jZW5kaWYKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotCi0gICAgICAvKiBDb21wbGFpbiBhYm91dCBrbm93biByZWxvY2F0aW9uIHRoYXQgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkICovCi0gICAgICBpZiAoaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24gPT0gbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgIGhvd3RvLT5uYW1lLAotCQkJICAgICAgKGludClyX3R5cGUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzIFtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgaWYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAJIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgcmV0ID0gZmFsc2U7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTI6Ci0JICBvbGRpbnN0ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0jZGVmaW5lCU1DT1JFX0lOU1RfQlNSCTB4RjgwMAotCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBNQ09SRV9JTlNUX0JTUiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgYnJlYWs7Ci0JfQotCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkgICAgICAgaG93dG8tPm5hbWUsIHJfdHlwZSwgcl9zeW1uZHgsIChsb25nKSBvZmZzZXQsIChsb25nKSBhZGRlbmQpOwotI2VuZGlmCi0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQkoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rICYmIHJfdHlwZSA9PSBSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyKQotCXsKLQkgIC8qIFdhc24ndCBvaywgYmFjayBpdCBvdXQgYW5kIGdpdmUgdXAuICAqLwotCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBvbGRpbnN0LCBjb250ZW50cyArIG9mZnNldCk7Ci0JICByID0gYmZkX3JlbG9jX29rOwotCX0KLSAgICAgIAotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHJldCA9IGZhbHNlOwotCSAgCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKiBuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotCQkgICAgCi0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICBicmVhazsKLQotCQkgICAgaWYgKCogbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQotCQkoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICBvZmZzZXQpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tY29yZV9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICAgIGluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NQ09SRV9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYXNlY3Rpb24gKiBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgCi0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTUNPUkVfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQkgIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tY29yZS1iaWciCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICAgICJlbGYzMi1tY29yZS1saXR0bGUiCi0KLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21jb3JlCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fTUNPUkUKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAJCS8qIDRrLCBpZiB3ZSBldmVyIGhhdmUgJ2VtICovCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAlOVUxMCi0KLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQltY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQltY29yZV9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCW1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJbWNvcmVfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCQltY29yZV9lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgbWNvcmVfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbWlwcy5jIGIvYmZkL2VsZjMyLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwMDQyMy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODUyNyArMCwwIEBACi0vKiBNSVBTLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE1vc3Qgb2YgdGhlIGluZm9ybWF0aW9uIGFkZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LAotICAgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaGFuZGxlcyBNSVBTIEVMRiB0YXJnZXRzLiAgU0dJIElyaXggNSB1c2VzIGEgc2xpZ2h0bHkKLSAgIGRpZmZlcmVudCBNSVBTIEVMRiBmcm9tIG90aGVyIHRhcmdldHMuICBUaGlzIG1hdHRlcnMgd2hlbiBsaW5raW5nLgotICAgVGhpcyBmaWxlIHN1cHBvcnRzIGJvdGgsIHN3aXRjaGluZyBhdCBydW50aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9taXBzLmgiCi0jZGVmaW5lIEVDT0ZGXzMyCi0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCAuZ290IGluZm9ybWF0aW9uIHdoZW4gbGlua2luZy4gIEl0Ci0gICBpcyBzdG9yZWQgaW4gdGhlIHRkYXRhIGZpZWxkIG9mIHRoZSBiZmRfZWxmX3NlY3Rpb25fZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbWlwc19nb3RfaW5mbwotewotICAvKiBUaGUgZ2xvYmFsIHN5bWJvbCBpbiB0aGUgR09UIHdpdGggdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZ2xvYmFsX2dvdHN5bTsKLSAgLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxfZ290bm87Ci0gIC8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzIHdlIGhhdmUgdXNlZC4gICovCi0gIHVuc2lnbmVkIGludCBhc3NpZ25lZF9nb3RubzsKLX07Ci0KLS8qIFRoZSBNSVBTIEVMRiBsaW5rZXIgbmVlZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzeW1ib2wgaW4KLSAgIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBFeHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFWFRSIGVzeW07Ci0KLSAgLyogTnVtYmVyIG9mIE1JUFNfMzIgb3IgTUlQU19SRUwzMiByZWxvY3MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGludCBtaXBzXzMyX3JlbG9jczsKLQotICAvKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGR5bmFtaWMgcmVsb2NhdGlvbiAoaW4gdGhlIC5yZWwuZHluCi0gICAgIHNlY3Rpb24pIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBpbnQgbWluX2R5bl9yZWxvY19pbmRleDsKLQotICAvKiBJZiB0aGVyZSBpcyBhIHN0dWIgdGhhdCAzMiBiaXQgZnVuY3Rpb25zIHNob3VsZCB1c2UgdG8gY2FsbCB0aGlzCi0gICAgIDE2IGJpdCBmdW5jdGlvbiwgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgc3R1Yi4gICovCi0gIGFzZWN0aW9uICpmbl9zdHViOwotCi0gIC8qIFdoZXRoZXIgd2UgbmVlZCB0aGUgZm5fc3R1YjsgdGhpcyBpcyBzZXQgaWYgdGhpcyBzeW1ib2wgYXBwZWFycwotICAgICBpbiBhbnkgcmVsb2NzIG90aGVyIHRoYW4gYSAxNiBiaXQgY2FsbC4gICovCi0gIGJvb2xlYW4gbmVlZF9mbl9zdHViOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgc3R1YiB0aGF0IDE2IGJpdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0byBjYWxsIHRoaXMKLSAgICAgMzIgYml0IGZ1bmN0aW9uLCB0aGlzIHBvaW50cyB0byB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBzdHViLiAgKi8KLSAgYXNlY3Rpb24gKmNhbGxfc3R1YjsKLQotICAvKiBUaGlzIGlzIGxpa2UgdGhlIGNhbGxfc3R1YiBmaWVsZCwgYnV0IGl0IGlzIHVzZWQgaWYgdGhlIGZ1bmN0aW9uCi0gICAgIGJlaW5nIGNhbGxlZCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuICAqLwotICBhc2VjdGlvbiAqY2FsbF9mcF9zdHViOwotfTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMzJfNjRiaXRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2luZm9fdG9faG93dG9fcmVsYQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX2dwdGFiICosIEVsZjMyX2dwdGFiICopKTsKLXN0YXRpYyB2b2lkIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9ncHRhYiAqLCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9tc3ltX2luIAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfTXN5bSAqLCBFbGYzMl9JbnRlcm5hbF9Nc3ltICopKTsKLXN0YXRpYyB2b2lkIGJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9JbnRlcm5hbF9Nc3ltICosIEVsZjMyX0V4dGVybmFsX01zeW0gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc3ltX2lzX2dsb2JhbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjMyX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlCi0gIFBBUkFNUyAoKFBUUiwgYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOwotc3RhdGljIGludCBtaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgSU5MSU5FIGludCBlbGZfbWlwc19pc2EgUEFSQU1TICgoZmxhZ3dvcmQpKTsKLXN0YXRpYyBJTkxJTkUgaW50IGVsZl9taXBzX21hY2ggUEFSQU1TICgoZmxhZ3dvcmQpKTsKLXN0YXRpYyBJTkxJTkUgY2hhciogZWxmX21pcHNfYWJpX25hbWUgUEFSQU1TICgoZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKm1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgZ3B0YWJfY29tcGFyZSBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGZfcmVsb2NhdGVfaGkxNgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX2J5dGUgKiwKLQkgICBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmX3JlbG9jYXRlX2dsb2JhbF9nb3QKLSAgIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMxNl9qdW1wX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMTZfZ3ByZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19lbGZfZmluYWxfZ3AKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKmVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKm1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZl9pcml4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wgCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfc2lnbl9leHRlbmQgUEFSQU1TICgoYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9vdmVyZmxvd19wIFBBUkFNUyAoKGJmZF92bWEsIGludCkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfaGlnaCBQQVJBTVMgKChiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9oaWdoZXIgUEFSQU1TICgoYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfaGlnaGVzdCBQQVJBTVMgKChiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9sb2NhbF9nb3RfaW5kZXgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleAotICBQQVJBTVMgKChiZmQgKiwgYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9nb3RfcGFnZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9uZXh0X2xvMTZfYWRkZW5kCi0gIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSwgcmVsb2NfaG93dG9fdHlwZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiosCi0JICAgYmZkX3ZtYSAqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9vYnRhaW5fY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmQgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSwKLQkgICBiZmQgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfYXNzaWduX2dwIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZV9mIAotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKiBtaXBzX2VsZl9nb3Rfc2VjdGlvbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHN0cnVjdCBtaXBzX2dvdF9pbmZvICptaXBzX2VsZl9nb3RfaW5mbyAKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IG1pcHNfZ290X2luZm8gKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfZ290MTZfZW50cnkgCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICosCi0JICAgbG9uZywgYmZkX3ZtYSwgYXNlY3Rpb24gKikpOwotCi0vKiBUaGUgbGV2ZWwgb2YgSVJJWCBjb21wYXRpYmlsaXR5IHdlJ3JlIHN0cml2aW5nIGZvci4gICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGljdF9ub25lLAotICBpY3RfaXJpeDUsCi0gIGljdF9pcml4NgotfSBpcml4X2NvbXBhdF90OwotCi0vKiBOb256ZXJvIGlmIEFCRkQgaXMgdXNpbmcgdGhlIE4zMiBBQkkuICAqLwotCi0jZGVmaW5lIEFCSV9OMzJfUChhYmZkKSBcCi0gICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSTIpICE9IDApCi0KLS8qIE5vbnplcm8gaWYgQUJGRCBpcyB1c2luZyB0aGUgNjQtYml0IEFCSS4gIEZJWE1FOiBUaGlzIGlzIG5ldmVyCi0gICB0cnVlLCB5ZXQuICAqLwotI2RlZmluZSBBQklfNjRfUChhYmZkKSBcCi0gICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTNjQpICE9IDApCi0KLS8qIFdoYXQgdmVyc2lvbiBvZiBJcml4IHdlIGFyZSB0cnlpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoLiAgRklYTUU6Ci0gICBBdCB0aGUgbW9tZW50LCB3ZSBuZXZlciBnZW5lcmF0ZSAibm9ybWFsIiBNSVBTIEVMRiBBQkkgZXhlY3V0YWJsZXM7Ci0gICB3ZSBhbHdheXMgdXNlIHNvbWUgdmVyc2lvbiBvZiBJcml4LiAgKi8KLQotI2RlZmluZSBJUklYX0NPTVBBVChhYmZkKSBcCi0gICgoQUJJX04zMl9QIChhYmZkKSB8fCBBQklfNjRfUCAoYWJmZCkpID8gaWN0X2lyaXg2IDogaWN0X2lyaXg1KQotCi0vKiBXaGV0aGVyIHdlIGFyZSB0cnlpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIElSSVggYXQgYWxsLiAgKi8KLQotI2RlZmluZSBTR0lfQ09NUEFUKGFiZmQpIFwKLSAgKElSSVhfQ09NUEFUIChhYmZkKSAhPSBpY3Rfbm9uZSkKLQotLyogVGhlIG5hbWUgb2YgdGhlIG1zeW0gc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FKGFiZmQpICIubXN5bSIKLQotLyogVGhlIG5hbWUgb2YgdGhlIHNyZGF0YSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRShhYmZkKSAiLnNyZGF0YSIKLQotLyogVGhlIG5hbWUgb2YgdGhlIG9wdGlvbnMgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FKGFiZmQpIFwKLSAgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYgPyAiLk1JUFMub3B0aW9ucyIgOiAiLm9wdGlvbnMiKQotCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3R1YiBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUoYWJmZCkgXAotICAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NiA/ICIuTUlQUy5zdHVicyIgOiAiLnN0dWIiKQotCi0vKiBUaGUgbnVtYmVyIG9mIGxvY2FsIC5nb3QgZW50cmllcyB3ZSByZXNlcnZlLiAgKi8KLSNkZWZpbmUgTUlQU19SRVNFUlZFRF9HT1ROTyAoMikKLQotLyogSW5zdHJ1Y3Rpb25zIHdoaWNoIGFwcGVhciBpbiBhIHN0dWIuICBGb3Igc29tZSByZWFzb24gdGhlIHN0dWIgaXMKLSAgIHNsaWdodGx5IGRpZmZlcmVudCBvbiBhbiBTR0kgc3lzdGVtLiAgKi8KLSNkZWZpbmUgRUxGX01JUFNfR1BfT0ZGU0VUKGFiZmQpIChTR0lfQ09NUEFUIChhYmZkKSA/IDB4N2ZmMCA6IDB4ODAwMCkKLSNkZWZpbmUgU1RVQl9MVyhhYmZkKQkJCQkJXAotICAoU0dJX0NPTVBBVCAoYWJmZCkJCQkJCVwKLSAgID8gMHg4Zjk5ODAxMAkJCS8qIGx3IHQ5LDB4ODAxMChncCkgKi8JXAotICAgOiAweDhmOTk4MDAwKQkJLyogbHcgdDksMHg4MDAwKGdwKSAqLwotI2RlZmluZSBTVFVCX01PVkUgMHgwM2UwNzgyNQkvKiBtb3ZlIHQ3LHJhICovCi0jZGVmaW5lIFNUVUJfSkFMUiAweDAzMjBmODA5CS8qIGphbCB0OSAqLwotI2RlZmluZSBTVFVCX0xJMTYgMHgzNDE4MDAwMAkvKiBvcmkgdDgsemVybywwICovCi0jZGVmaW5lIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFICgxNikKLQotI2lmIDAKLS8qIFdlIG5vIGxvbmdlciB0cnkgdG8gaWRlbnRpZnkgcGFydGljdWxhciBzZWN0aW9ucyBmb3IgdGhlIC5keW5zeW0KLSAgIHNlY3Rpb24uICBXaGVuIHdlIGRvLCB3ZSB3aW5kIHVwIGNyYXNoaW5nIGlmIHRoZXJlIGFyZSBvdGhlciByYW5kb20KLSAgIHNlY3Rpb25zIHdpdGggcmVsb2NhdGlvbnMuICAqLwotCi0vKiBOYW1lcyBvZiBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIC5keW5zeW0gc2VjdGlvbiBpbiBhbiBJcml4IDUKLSAgIGV4ZWN1dGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXNbXSA9Ci17Ci0gICIudGV4dCIsCi0gICIuaW5pdCIsCi0gICIuZmluaSIsCi0gICIuZGF0YSIsCi0gICIucm9kYXRhIiwKLSAgIi5zZGF0YSIsCi0gICIuc2JzcyIsCi0gICIuYnNzIiwKLSAgTlVMTAotfTsKLQotI2RlZmluZSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVMgXAotICAoc2l6ZW9mIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXMgLyBzaXplb2YgbWlwc19lbGZfZHluc3ltX3NlY19uYW1lc1swXSkKLQotLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXMgd2hpY2ggZ28gaW4gdGhlCi0gICB0ZXh0IHNlZ21lbnQuICAqLwotCi0jZGVmaW5lIE1JUFNfVEVYVF9EWU5TWU1fU0VDTk8gKDMpCi0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFRoZSBuYW1lcyBvZiB0aGUgcnVudGltZSBwcm9jZWR1cmUgdGFibGUgc3ltYm9scyB1c2VkIG9uIElyaXggNS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1tdID0KLXsKLSAgIl9wcm9jZWR1cmVfdGFibGUiLAotICAiX3Byb2NlZHVyZV9zdHJpbmdfdGFibGUiLAotICAiX3Byb2NlZHVyZV90YWJsZV9zaXplIiwKLSAgTlVMTAotfTsKLQotLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24gb24KLSAgIElyaXggNS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaWQxOwkJLyogQWx3YXlzIG9uZT8gICovCi0gIHVuc2lnbmVkIGxvbmcgbnVtOwkJLyogTnVtYmVyIG9mIGNvbXBhY3QgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpZDI7CQkvKiBBbHdheXMgdHdvPyAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CQkvKiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkMDsJLyogWmVybz8gICovCi0gIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQxOwkvKiBaZXJvPyAgKi8KLX0gRWxmMzJfY29tcGFjdF9yZWw7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGJmZF9ieXRlIGlkMVs0XTsKLSAgYmZkX2J5dGUgbnVtWzRdOwotICBiZmRfYnl0ZSBpZDJbNF07Ci0gIGJmZF9ieXRlIG9mZnNldFs0XTsKLSAgYmZkX2J5dGUgcmVzZXJ2ZWQwWzRdOwotICBiZmRfYnl0ZSByZXNlcnZlZDFbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBpbnQgY3R5cGUgOiAxOwkvKiAxOiBsb25nIDA6IHNob3J0IGZvcm1hdC4gU2VlIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgaW50IHJ0eXBlIDogNDsJLyogUmVsb2NhdGlvbiB0eXBlcy4gU2VlIGJlbG93LiAqLwotICB1bnNpZ25lZCBpbnQgZGlzdDJ0byA6IDg7Ci0gIHVuc2lnbmVkIGludCByZWx2YWRkciA6IDE5OwkvKiAoVkFERFIgLSB2YWRkciBvZiB0aGUgcHJldmlvdXMgZW50cnkpLyA0ICovCi0gIHVuc2lnbmVkIGxvbmcga29uc3Q7CQkvKiBLT05TVCBmaWVsZC4gU2VlIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgbG9uZyB2YWRkcjsJCS8qIFZBRERSIHRvIGJlIHJlbG9jYXRlZC4gICovCi19IEVsZjMyX2NyaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50IGN0eXBlIDogMTsJLyogMTogbG9uZyAwOiBzaG9ydCBmb3JtYXQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGludCBydHlwZSA6IDQ7CS8qIFJlbG9jYXRpb24gdHlwZXMuIFNlZSBiZWxvdy4gKi8KLSAgdW5zaWduZWQgaW50IGRpc3QydG8gOiA4OwotICB1bnNpZ25lZCBpbnQgcmVsdmFkZHIgOiAxOTsJLyogKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KS8gNCAqLwotICB1bnNpZ25lZCBsb25nIGtvbnN0OwkJLyogS09OU1QgZmllbGQuIFNlZSBiZWxvdy4gICovCi19IEVsZjMyX2NyaW5mbzI7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGJmZF9ieXRlIGluZm9bNF07Ci0gIGJmZF9ieXRlIGtvbnN0WzRdOwotICBiZmRfYnl0ZSB2YWRkcls0XTsKLX0gRWxmMzJfRXh0ZXJuYWxfY3JpbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpbmZvWzRdOwotICBiZmRfYnl0ZSBrb25zdFs0XTsKLX0gRWxmMzJfRXh0ZXJuYWxfY3JpbmZvMjsKLQotLyogVGhlc2UgYXJlIHRoZSBjb25zdGFudHMgdXNlZCB0byBzd2FwIHRoZSBiaXRmaWVsZHMgaW4gYSBjcmluZm8uICAqLwotCi0jZGVmaW5lIENSSU5GT19DVFlQRSAoMHgxKQotI2RlZmluZSBDUklORk9fQ1RZUEVfU0ggKDMxKQotI2RlZmluZSBDUklORk9fUlRZUEUgKDB4ZikKLSNkZWZpbmUgQ1JJTkZPX1JUWVBFX1NIICgyNykKLSNkZWZpbmUgQ1JJTkZPX0RJU1QyVE8gKDB4ZmYpCi0jZGVmaW5lIENSSU5GT19ESVNUMlRPX1NIICgxOSkKLSNkZWZpbmUgQ1JJTkZPX1JFTFZBRERSICgweDdmZmZmKQotI2RlZmluZSBDUklORk9fUkVMVkFERFJfU0ggKDApCi0KLS8qIEEgY29tcGFjdCByZWxvY2F0aW9uIGluZm8gaGFzIGxvbmcgKDMgd29yZHMpIG9yIHNob3J0ICgyIHdvcmRzKQotICAgZm9ybWF0cy4gIEEgc2hvcnQgZm9ybWF0IGRvZXNuJ3QgaGF2ZSBWQUREUiBmaWVsZCBhbmQgcmVsdmFkZHIKLSAgIGZpZWxkcyBjb250YWlucyAoKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KSA+PiAyKS4gICovCi0jZGVmaW5lIENSRl9NSVBTX0xPTkcJCQkxCi0jZGVmaW5lIENSRl9NSVBTX1NIT1JUCQkJMAotCi0vKiBUaGVyZSBhcmUgNCB0eXBlcyBvZiBjb21wYWN0IHJlbG9jYXRpb24gYXQgbGVhc3QuIFRoZSB2YWx1ZSBLT05TVAotICAgaGFzIGRpZmZlcmVudCBtZWFuaW5nIGZvciBlYWNoIHR5cGU6Ci0KLSAgICh0eXBlKQkJKGtvbnN0KQotICAgQ1RfTUlQU19SRUwzMglBZGRyZXNzIGluIGRhdGEKLSAgIENUX01JUFNfV09SRAkJQWRkcmVzcyBpbiB3b3JkIChYWFgpCi0gICBDVF9NSVBTX0dQSElfTE8JR1AgLSB2YWRkcgotICAgQ1RfTUlQU19KTVBBRAlBZGRyZXNzIHRvIGp1bXAKLSAgICovCi0KLSNkZWZpbmUgQ1JUX01JUFNfUkVMMzIJCQkweGEKLSNkZWZpbmUgQ1JUX01JUFNfV09SRAkJCTB4YgotI2RlZmluZSBDUlRfTUlQU19HUEhJX0xPCQkweGMKLSNkZWZpbmUgQ1JUX01JUFNfSk1QQUQJCQkweGQKLQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfZm9ybWF0KHgsZm9ybWF0KQkoKHgpLmN0eXBlID0gKGZvcm1hdCkpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl90eXBlKHgsdHlwZSkJCSgoeCkucnR5cGUgPSAodHlwZSkpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl9kaXN0MnRvKHgsdikJCSgoeCkuZGlzdDJ0byA9ICh2KSkKLSNkZWZpbmUgbWlwc19lbGZfc2V0X2NyX3JlbHZhZGRyKHgsZCkJCSgoeCkucmVsdmFkZHIgPSAoZCk8PDIpCi0KLXN0YXRpYyB2b2lkIGJmZF9lbGYzMl9zd2FwX2NvbXBhY3RfcmVsX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfY29tcGFjdF9yZWwgKiwgRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwgKikpOwotc3RhdGljIHZvaWQgYmZkX2VsZjMyX3N3YXBfY3JpbmZvX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfY3JpbmZvICosIEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSk7Ci0KLSNkZWZpbmUgVVNFX1JFTAkxCQkvKiBNSVBTIHVzZXMgUkVMIHJlbG9jYXRpb25zIGluc3RlYWQgb2YgUkVMQSAqLwotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDI2IGJpdCBicmFuY2ggYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18yNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1QxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfUEMxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgY2FsbCB0aHJvdWdoIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTEwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZGVmaW5lZCBvbiBJcml4IDUsIGFsdGhvdWdoIHRoZXkgYXJlCi0gICAgICAgbm90IGRlZmluZWQgYnkgdGhlIEFCSS4gICovCi0gICAgeyAxMyB9LAotICAgIHsgMTQgfSwKLSAgICB7IDE1IH0sCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzQsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVsb2NhdGlvbi4gIFRoaXMgaXMgdXNlZCBpbiAzMiBiaXQgRUxGIHdoZW4gYWRkcmVzc2VzCi0gICAgIGFyZSA2NCBiaXRzIGxvbmc7IHRoZSB1cHBlciAzMiBiaXRzIGFyZSBzaW1wbHkgYSBzaWduIGV4dGVuc2lvbi4KLSAgICAgVGhlIGZpZWxkcyBvZiB0aGUgaG93dG8gc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGZvciBSX01JUFNfMzIsCi0gICAgIG90aGVyIHRoYW4gdGhlIHR5cGUsIG5hbWUsIGFuZCBzcGVjaWFsX2Z1bmN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHMzMl82NGJpdF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfRElTUCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgdG8gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfUEFHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX1BBR0UiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogT2Zmc2V0IGZyb20gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfT0ZTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX09GU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHN1YnRyYWN0aW9uLiAgVXNlZCBpbiB0aGUgTjMyIEFCSS4gICovCi0gIEhPV1RPIChSX01JUFNfU1VCLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU1VCIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVXNlZCB0byBjYXVzZSB0aGUgbGlua2VyIHRvIGluc2VydCBhbmQgZGVsZXRlIGluc3RydWN0aW9ucz8gICovCi0gIHsgUl9NSVBTX0lOU0VSVF9BIH0sCi0gIHsgUl9NSVBTX0lOU0VSVF9CIH0sCi0gIHsgUl9NSVBTX0RFTEVURSB9LAotCi0gIC8qIEdldCB0aGUgaGlnaGVyIHZhbHVlcyBvZiBhIDY0IGJpdCBhZGRlbmQuICBQcmVzdW1hYmx5IG5vdCB1c2VkIGluCi0gICAgIDMyIGJpdCBFTEYuICAqLwotICB7IFJfTUlQU19ISUdIRVIgfSwKLSAgeyBSX01JUFNfSElHSEVTVCB9LAotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTZWN0aW9uIGRpc3BsYWNlbWVudC4gICovCi0gIEhPV1RPIChSX01JUFNfU0NOX0RJU1AsICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0NOX0RJU1AiLCAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICB7IFJfTUlQU19SRUwxNiB9LAotICB7IFJfTUlQU19BRERfSU1NRURJQVRFIH0sCi0gIHsgUl9NSVBTX1BKVU1QIH0sCi0gIHsgUl9NSVBTX1JFTEdPVCB9LAotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVGhlIHJlbG9jIHVzZWQgZm9yIEJGRF9SRUxPQ19DVE9SIHdoZW4gZG9pbmcgYSA2NCBiaXQgbGluay4gIFRoaXMKLSAgIGlzIGEgaGFjayB0byBtYWtlIHRoZSBsaW5rZXIgdGhpbmsgdGhhdCB3ZSBuZWVkIDY0IGJpdCB2YWx1ZXMuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfY3RvcjY0X2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHMxNl9qdW1wX2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQUzE2XzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgbWlwczE2X2p1bXBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2XzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGdwcmVsIGluc3RydWN0aW9uLiAgVGhlIHNyY19tYXNrIGFuZAotICAgZHNrX21hc2sgZm9yIHRoaXMgaG93dG8gZG8gbm90IHJlZmxlY3QgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiwgaW4KLSAgIHdoaWNoIHRoZSB2YWx1ZSBpcyBub3QgY29udGlndW91czsgdGhlIG1hc2tzIGFyZSBmb3IgdGhlCi0gICBjb252ZW5pZW5jZSBvZiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzMTZfZ3ByZWxfaG93dG8gPQotICBIT1dUTyAoUl9NSVBTMTZfR1BSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMTZfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2X0dQUkVMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIERvIGEgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbi4gIFRoaXMgaGFzIHRvIGJlIGRvbmUgaW4gY29tYmluYXRpb24KLSAgIHdpdGggYSBSX01JUFNfTE8xNiByZWxvYywgYmVjYXVzZSB0aGVyZSBpcyBhIGNhcnJ5IGZyb20gdGhlIExPMTYgdG8KLSAgIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZQotICAgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuICBNSVBTIEVMRiByZXF1aXJlcyB0aGF0IHRoZQotICAgTE8xNiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEhJMTYuICBBcyBhIEdOVSBleHRlbnNpb24sIHdlIHBlcm1pdCBhbgotICAgYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNgotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpMTYKLXsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaTE2ICptaXBzX2hpMTZfbGlzdDsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgc3ltYm9sLAotCQkgICAgIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLAotCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtaXBzX2hpMTYgKm47Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0ID0gYmZkX3JlbG9jX29rOwotCi0gIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0gICAgewotICAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgICBiZmRfdm1hIGdwOwotCi0gICAgICBpZiAocmV0ID09IGJmZF9yZWxvY191bmRlZmluZWQpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0JcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLQkgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLQl9Ci0KLSAgICAgIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwKLQkJCSAgICAgICBlcnJvcl9tZXNzYWdlLCAmZ3ApOwotICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0JcmV0dXJuIHJldDsKLQotICAgICAgcmVsb2NhdGlvbiA9IGdwIC0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotCSAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0JcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQlyZWxvY2F0aW9uID0gMDsKLSAgICAgIGVsc2UKLQlyZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2IGRvIHRoZSBhY3R1YWwgcmVsb2NhdGlvbi4gICovCi0gIG4gPSAoc3RydWN0IG1pcHNfaGkxNiAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX2hpMTZfbGlzdDsKLSAgbWlwc19oaTE2X2xpc3QgPSBuOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0Ci0gICBpbnBsYWNlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZQotICAgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYyAoYWJmZCwKLQkJICAgICByZWxvY19lbnRyeSwKLQkJICAgICBzeW1ib2wsCi0JCSAgICAgZGF0YSwKLQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGFyZWxlbnQgZ3BfZGlzcF9yZWxlbnQ7Ci0KLSAgaWYgKG1pcHNfaGkxNl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkxNiAqbDsKLQotICAgICAgbCA9IG1pcHNfaGkxNl9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbWlwc19oaTE2ICpuZXh0OwotCi0JICAvKiBEbyB0aGUgSEkxNiByZWxvY2F0aW9uLiAgTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGRvbid0IG5lZWQKLQkgICAgIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIExPMTYgaXRzZWxmLCBleGNlcHQgd2hlcmUgdG8KLQkgICAgIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZSBMTzE2LiAgKi8KLQkgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBsLT5hZGRyKTsKLQkgIHZhbGxvID0gKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKTsKLQkgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0JICB2YWwgKz0gbC0+YWRkZW5kOwotCi0JICAvKiBUaGUgbG93IG9yZGVyIDE2IGJpdHMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgc2lnbmVkCi0JICAgICB2YWx1ZS4gIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMKLQkgICAgIHJlcXVpcmVzIGFuIGFkanVzdG1lbnQgaW4gdGhlIGhpZ2ggb3JkZXIgYml0cy4gIFdlIG5lZWQKLQkgICAgIHRvIG1ha2UgdGhpcyBhZGp1c3RtZW50IGluIHR3byB3YXlzOiBvbmNlIGZvciB0aGUgYml0cyB3ZQotCSAgICAgdG9vayBmcm9tIHRoZSBkYXRhLCBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcKLQkgICAgIGJhY2sgaW4gdG8gdGhlIGRhdGEuICAqLwotCSAgaWYgKCh2YWxsbyAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsIC09IDB4MTAwMDA7Ci0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLCAiX2dwX2Rpc3AiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZ3BfZGlzcF9yZWxlbnQgPSAqcmVsb2NfZW50cnk7Ci0JICAgICAgcmVsb2NfZW50cnkgPSAmZ3BfZGlzcF9yZWxlbnQ7Ci0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IGwtPmFkZGVuZDsKLQkgICAgfQotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtaXBzX2hpMTZfbGlzdCA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0gICAgewotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgICAgIGJmZF92bWEgZ3AsIHJlbG9jYXRpb247Ci0KLSAgICAgIC8qIEZJWE1FOiBEb2VzIHRoaXMgY2FzZSBldmVyIG9jY3VyPyAgKi8KLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgdHJ1ZSwgZXJyb3JfbWVzc2FnZSwgJmdwKTsKLSAgICAgIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotCXJldHVybiByZXQ7Ci0KLSAgICAgIHJlbG9jYXRpb24gPSBncCAtIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAgICAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAgICAgZ3BfZGlzcF9yZWxlbnQgPSAqcmVsb2NfZW50cnk7Ci0gICAgICByZWxvY19lbnRyeSA9ICZncF9kaXNwX3JlbGVudDsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uIC0gNDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBMTzE2IHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCWlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBhIFJfTUlQU19HT1QxNiByZWxvYy4gIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBnbG9iYWwgb2Zmc2V0Ci0gICB0YWJsZSB1c2VkIGZvciBQSUMgY29kZS4gIElmIHRoZSBzeW1ib2wgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB0aGUKLSAgIGluc3RydWN0aW9uIGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIG9mZnNldCBvZiB0aGUgYXBwcm9wcmlhdGUKLSAgIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgSWYgdGhlIHN5bWJvbCBpcyBhIHNlY3Rpb24KLSAgIHN5bWJvbCwgdGhlIG5leHQgcmVsb2MgaXMgYSBSX01JUFNfTE8xNiByZWxvYy4gIFRoZSB0d28gMTYgYml0Ci0gICBhZGRlbmRzIGFyZSBjb21iaW5lZCB0byBmb3JtIHRoZSByZWFsIGFkZGVuZCBhZ2FpbnN0IHRoZSBzZWN0aW9uCi0gICBzeW1ib2w7IHRoZSBHT1QxNiBpcyBtb2RpZmllZCB0byBjb250YWluIHRoZSBvZmZzZXQgb2YgYW4gZW50cnkgaW4KLSAgIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBhbmQgdGhlIExPMTYgaXMgbW9kaWZpZWQgdG8gb2Zmc2V0IGl0Ci0gICBhcHByb3ByaWF0ZWx5LiAgVGh1cyBhbiBvZmZzZXQgbGFyZ2VyIHRoYW4gMTYgYml0cyByZXF1aXJlcyBhCi0gICBtb2RpZmllZCB2YWx1ZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLQotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWZmaWNlcyBmb3IgdGhlIGFzc2VtYmxlciwgYnV0IHRoZSBsaW5rZXIgZG9lcwotICAgbm90IHlldCBrbm93IGhvdyB0byBjcmVhdGUgZ2xvYmFsIG9mZnNldCB0YWJsZXMuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICBzeW1ib2wsCi0JCSAgICAgIGRhdGEsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgY2FuIGhhbmRsZSBpdAotICAgICBqdXN0IGxpa2UgSEkxNi4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgcmV0dXJuIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotCi0gIGFib3J0ICgpOwotfQotCi0vKiBTZXQgdGhlIEdQIHZhbHVlIGZvciBPVVRQVVRfQkZELiAgUmV0dXJucyBmYWxzZSBpZiB0aGlzIGlzIGEKLSAgIGRhbmdlcm91cyByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2Fzc2lnbl9ncCAob3V0cHV0X2JmZCwgcGdwKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgKnBncDsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBhc3ltYm9sICoqc3ltOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGZpZ3VyZWQgb3V0IHdoYXQgR1Agd2lsbCBiZSwganVzdCByZXR1cm4gaXQuICAqLwotICAqcGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoKnBncCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotICBzeW0gPSBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpOwotCi0gIC8qIFRoZSBsaW5rZXIgc2NyaXB0IHdpbGwgaGF2ZSBjcmVhdGVkIGEgc3ltYm9sIG5hbWVkIGBfZ3AnIHdpdGggdGhlCi0gICAgIGFwcHJvcHJpYXRlIHZhbHVlLiAgKi8KLSAgaWYgKHN5bSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICBpID0gY291bnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltKyspCi0JewotCSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqbmFtZTsKLQotCSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpzeW0pOwotCSAgaWYgKCpuYW1lID09ICdfJyAmJiBzdHJjbXAgKG5hbWUsICJfZ3AiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgKnBncCA9IGJmZF9hc3ltYm9sX3ZhbHVlICgqc3ltKTsKLQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgKnBncCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChpID49IGNvdW50KQotICAgIHsKLSAgICAgIC8qIE9ubHkgZ2V0IHRoZSBlcnJvciBvbmNlLiAgKi8KLSAgICAgICpwZ3AgPSA0OwotICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBncCB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgc3ltYm9sIHZhbHVlIGNvcnJlY3RseS4gIFdlIGxvb2sgdXAgdGhlIHN5bWJvbCBfZ3AgaW4gdGhlIG91dHB1dAotICAgQkZELiAgSWYgd2UgY2FuJ3QgZmluZCBpdCwgd2UncmUgc3R1Y2suICBXZSBjYWNoZSBpdCBpbiB0aGUgRUxGCi0gICB0YXJnZXQgZGF0YS4gIFdlIGRvbid0IG5lZWQgdG8gYWRqdXN0IHRoZSBzeW1ib2wgdmFsdWUgZm9yIGFuCi0gICBleHRlcm5hbCBzeW1ib2wgaWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLCBlcnJvcl9tZXNzYWdlLCBwZ3ApCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci0gICAgIGJmZF92bWEgKnBncDsKLXsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgISByZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgKnBncCA9IDA7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLSAgICB9Ci0KLSAgKnBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgaWYgKCpwZ3AgPT0gMAotICAgICAgJiYgKCEgcmVsb2NhdGVhYmxlCi0JICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkpCi0gICAgewotICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLwotCSAgKnBncCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDB4NDAwMDsKLQkgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCAqcGdwKTsKLQl9Ci0gICAgICBlbHNlIGlmICghbWlwc19lbGZfYXNzaWduX2dwIChvdXRwdXRfYmZkLCBwZ3ApKQotCXsKLQkgICplcnJvcl9tZXNzYWdlID0KLQkgICAgKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIpOwotCSAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JfQotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBEbyBhIFJfTUlQU19HUFJFTDE2IHJlbG9jYXRpb24uICBUaGlzIGlzIGEgMTYgYml0IHZhbHVlIHdoaWNoIG11c3QKLSAgIGJlY29tZSB0aGUgb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgVGhpcyBmdW5jdGlvbiBhbHNvIGhhbmRsZXMKLSAgIFJfTUlQU19MSVRFUkFMIHJlbG9jYXRpb25zLCBhbHRob3VnaCB0aG9zZSBjYW4gYmUgaGFuZGxlZCBtb3JlCi0gICBjbGV2ZXJseSBiZWNhdXNlIHRoZSBlbnRyaWVzIGluIHRoZSAubGl0OCBhbmQgLmxpdDQgc2VjdGlvbnMgY2FuIGJlCi0gICBtZXJnZWQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdwcmVsMTZfd2l0aF9ncCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkJICAgICAgYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgICAgYm9vbGVhbiwgUFRSLCBiZmRfdm1hKSk7Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLSAgICB9Ci0KLSAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLCBlcnJvcl9tZXNzYWdlLAotCQkJICAgJmdwKTsKLSAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0gICAgcmV0dXJuIHJldDsKLQotICByZXR1cm4gZ3ByZWwxNl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWxvY2F0ZWFibGUsIGRhdGEsIGdwKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ3ByZWwxNl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLCByZWxvY2F0ZWFibGUsIGRhdGEsCi0JCSBncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIGdwOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICAvKiBTZXQgdmFsIHRvIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvciBzeW1ib2wuICAqLwotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT5zcmNfbWFzayA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBvY2N1cnMgd2l0aCB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4gICovCi0gICAgICB2YWwgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgKyByZWxvY19lbnRyeS0+YWRkZW5kKSAmIDB4ZmZmZjsKLSAgICAgIGlmICh2YWwgJiAweDgwMDApCi0JdmFsIC09IDB4MTAwMDA7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB2YWwgZm9yIHRoZSBmaW5hbCBzZWN0aW9uIGxvY2F0aW9uIGFuZCBHUCB2YWx1ZS4gIElmIHdlCi0gICAgIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvcgotICAgICBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotICBpZiAoISByZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHZhbCArPSByZWxvY2F0aW9uIC0gZ3A7Ci0KLSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAodmFsICYgMHhmZmZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIE1ha2Ugc3VyZSBpdCBmaXQgaW4gMTYgYml0cy4gICovCi0gIGlmICh2YWwgPj0gMHg4MDAwICYmIHZhbCA8IDB4ZmZmZjgwMDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBEbyBhIFJfTUlQU19HUFJFTDMyIHJlbG9jYXRpb24uICBJcyB0aGlzIDMyIGJpdCB2YWx1ZSB0aGUgb2Zmc2V0Ci0gICBmcm9tIHRoZSBncCByZWdpc3Rlcj8gWFhYICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ3ByZWwzMl93aXRoX2dwIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkgICAgICBhcmVsZW50ICosIGFzZWN0aW9uICosCi0JCQkJCQkgICAgICBib29sZWFuLCBQVFIsIGJmZF92bWEpKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MgKGFiZmQsCi0JCQlyZWxvY19lbnRyeSwKLQkJCXN5bWJvbCwKLQkJCWRhdGEsCi0JCQlpbnB1dF9zZWN0aW9uLAotCQkJb3V0cHV0X2JmZCwKLQkJCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncDsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aCBubwotICAgICBhZGRlbmQsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGFueXRoaW5nLiAgV2Ugd2lsbCBvbmx5IGhhdmUgYW4KLSAgICAgYWRkZW5kIGlmIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIHJlbG9jLCBub3QgcmVhZCBmcm9tIGFuIEVMRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikKLQlfKCIzMmJpdHMgZ3AgcmVsYXRpdmUgcmVsb2NhdGlvbiBvY2N1cnMgZm9yIGFuIGV4dGVybmFsIHN5bWJvbCIpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgICAgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotCi0gICAgICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsCi0JCQkgICAgICAgZXJyb3JfbWVzc2FnZSwgJmdwKTsKLSAgICAgIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotCXJldHVybiByZXQ7Ci0gICAgfQotCi0gIHJldHVybiBncHJlbDMyX3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sCi0JCQkgIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ncHJlbDMyX3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sIHJlbG9jYXRlYWJsZSwgZGF0YSwKLQkJIGdwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGJmZF92bWEgZ3A7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnNyY19tYXNrID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBjYXNlIGFyaXNlcyB3aXRoIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KLSAgICAgIHZhbCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgLyogU2V0IHZhbCB0byB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb3Igc3ltYm9sLiAgKi8KLSAgdmFsICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogQWRqdXN0IHZhbCBmb3IgdGhlIGZpbmFsIHNlY3Rpb24gbG9jYXRpb24gYW5kIEdQIHZhbHVlLiAgSWYgd2UKLSAgICAgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yCi0gICAgIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIGlmICghIHJlbG9jYXRlYWJsZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmIChyZWxvY2F0ZWFibGUpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBIYW5kbGUgYSA2NCBiaXQgcmVsb2MgaW4gYSAzMiBiaXQgTUlQUyBFTEYgZmlsZS4gIFRoZXNlIGFyZQotICAgZ2VuZXJhdGVkIHdoZW4gYWRkcmVzZXMgYXJlIDY0IGJpdHMuICBUaGUgdXBwZXIgMzIgYml0cyBhcmUgYSBzaW1sZQotICAgc2lnbiBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzMzJfNjRiaXRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gIGFyZWxlbnQgcmVsb2MzMjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIGJmZF9zaXplX3R5cGUgYWRkcjsKLQotICByID0gYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLSAgaWYgKHIgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQotICAgIHJldHVybiByOwotCi0gIC8qIERvIGEgbm9ybWFsIDMyIGJpdCByZWxvY2F0aW9uIG9uIHRoZSBsb3dlciAzMiBiaXRzLiAgKi8KLSAgcmVsb2MzMiA9ICpyZWxvY19lbnRyeTsKLSAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICByZWxvYzMyLmFkZHJlc3MgKz0gNDsKLSAgcmVsb2MzMi5ob3d0byA9ICZlbGZfbWlwc19ob3d0b190YWJsZVtSX01JUFNfMzJdOwotICByID0gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoYWJmZCwgJnJlbG9jMzIsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLQotICAvKiBTaWduIGV4dGVuZCBpbnRvIHRoZSB1cHBlciAzMiBiaXRzLiAgKi8KLSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvYzMyLmFkZHJlc3MpOwotICBpZiAoKHZhbCAmIDB4ODAwMDAwMDApICE9IDApCi0gICAgdmFsID0gMHhmZmZmZmZmZjsKLSAgZWxzZQotICAgIHZhbCA9IDA7Ci0gIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKLSAgICBhZGRyICs9IDQ7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICByZXR1cm4gcjsKLX0KLQotLyogSGFuZGxlIGEgbWlwczE2IGp1bXAuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzMTZfanVtcF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogRklYTUUuICAqLwotICB7Ci0gICAgc3RhdGljIGJvb2xlYW4gd2FybmVkOwotCi0gICAgaWYgKCEgd2FybmVkKQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIkxpbmtpbmcgbWlwczE2IG9iamVjdHMgaW50byAlcyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCIpLAotCSBiZmRfZ2V0X3RhcmdldCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKSk7Ci0gICAgd2FybmVkID0gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0vKiBIYW5kbGUgYSBtaXBzMTYgR1AgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzMTZfZ3ByZWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3A7Ci0gIHVuc2lnbmVkIHNob3J0IGV4dGVuZCwgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyBmaW5hbDsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aCBubwotICAgICBhZGRlbmQsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGFueXRoaW5nLiAgV2Ugd2lsbCBvbmx5IGhhdmUgYW4KLSAgICAgYWRkZW5kIGlmIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIHJlbG9jLCBub3QgcmVhZCBmcm9tIGFuIEVMRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZWxvY2F0ZWFibGUgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gICAgICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0gICAgfQotCi0gIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwgZXJyb3JfbWVzc2FnZSwKLQkJCSAgICZncCk7Ci0gIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotICAgIHJldHVybiByZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBQaWNrIHVwIHRoZSBtaXBzMTYgZXh0ZW5kIGluc3RydWN0aW9uIGFuZCB0aGUgcmVhbCBpbnN0cnVjdGlvbi4gICovCi0gIGV4dGVuZCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyArIDIpOwotCi0gIC8qIFN0dWZmIHRoZSBjdXJyZW50IGFkZGVuZCBiYWNrIGFzIGEgMzIgYml0IHZhbHVlLCBkbyB0aGUgdXN1YWwKLSAgICAgcmVsb2NhdGlvbiwgYW5kIHRoZW4gY2xlYW4gdXAuICAqLwotICBiZmRfcHV0XzMyIChhYmZkLAotCSAgICAgICgoKGV4dGVuZCAmIDB4MWYpIDw8IDExKQotCSAgICAgICB8IChleHRlbmQgJiAweDdlMCkKLQkgICAgICAgfCAoaW5zbiAmIDB4MWYpKSwKLQkgICAgICAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICByZXQgPSBncHJlbDE2X3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sCi0JCQkgcmVsb2NhdGVhYmxlLCBkYXRhLCBncCk7Ci0KLSAgZmluYWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkgICAgICAoKGV4dGVuZCAmIDB4ZjgwMCkKLQkgICAgICAgfCAoKGZpbmFsID4+IDExKSAmIDB4MWYpCi0JICAgICAgIHwgKGZpbmFsICYgMHg3ZTApKSwKLQkgICAgICAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkgICAgICAoKGluc24gJiAweGZmZTApCi0JICAgICAgIHwgKGZpbmFsICYgMHgxZikpLAotCSAgICAgIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgKyAyKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBSZXR1cm4gdGhlIElTQSBmb3IgYSBNSVBTIGVfZmxhZ3MgdmFsdWUuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZWxmX21pcHNfaXNhIChmbGFncykKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpCi0gICAgewotICAgIGNhc2UgRV9NSVBTX0FSQ0hfMToKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgRV9NSVBTX0FSQ0hfMjoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgRV9NSVBTX0FSQ0hfMzoKLSAgICAgIHJldHVybiAzOwotICAgIGNhc2UgRV9NSVBTX0FSQ0hfNDoKLSAgICAgIHJldHVybiA0OwotICAgIH0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIFJldHVybiB0aGUgTUFDSCBmb3IgYSBNSVBTIGVfZmxhZ3MgdmFsdWUuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZWxmX21pcHNfbWFjaCAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19NQUNIKQotICAgIHsKLSAgICBjYXNlIEVfTUlQU19NQUNIXzM5MDA6Ci0gICAgICByZXR1cm4gYmZkX21hY2hfbWlwczM5MDA7Ci0KLSAgICBjYXNlIEVfTUlQU19NQUNIXzQwMTA6Ci0gICAgICByZXR1cm4gYmZkX21hY2hfbWlwczQwMTA7Ci0KLSAgICBjYXNlIEVfTUlQU19NQUNIXzQxMDA6Ci0gICAgICByZXR1cm4gYmZkX21hY2hfbWlwczQxMDA7Ci0KLSAgICBjYXNlIEVfTUlQU19NQUNIXzQxMTE6Ci0gICAgICByZXR1cm4gYmZkX21hY2hfbWlwczQxMTE7Ci0KLSAgICBjYXNlIEVfTUlQU19NQUNIXzQ2NTA6Ci0gICAgICByZXR1cm4gYmZkX21hY2hfbWlwczQ2NTA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfQVJDSCkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIEVfTUlQU19BUkNIXzE6Ci0JICByZXR1cm4gYmZkX21hY2hfbWlwczMwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NSVBTX0FSQ0hfMjoKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzNjAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01JUFNfQVJDSF8zOgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTUlQU19BUkNIXzQ6Ci0JICByZXR1cm4gYmZkX21hY2hfbWlwczgwMDA7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gcHJpbnRhYmxlIG5hbWUgZm9yIEFCSSBmcm9tIGZsYWd3b3JkLiAqLwotCi1zdGF0aWMgSU5MSU5FIGNoYXIqCi1lbGZfbWlwc19hYmlfbmFtZSAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BQkkpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAibm9uZSI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX08zMjoKLSAgICAgIHJldHVybiAiTzMyIjsKLSAgICBjYXNlIEVfTUlQU19BQklfTzY0OgotICAgICAgcmV0dXJuICJPNjQiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9FQUJJMzI6Ci0gICAgICByZXR1cm4gIkVBQkkzMiI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX0VBQkk2NDoKLSAgICAgIHJldHVybiAiRUFCSTY0IjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIGFiaSI7Ci0gICAgfQotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gTUlQUyBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAotICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfU1VCLCBSX01JUFNfU1VCIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UsIFJfTUlQU19HT1RfUEFHRSB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNULCBSX01JUFNfR09UX09GU1QgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfRElTUCwgUl9NSVBTX0dPVF9ESVNQIH0KLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9taXBzX2hvd3RvX3RhYmxlWyhpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIC8qIFdlIG5lZWQgdG8gaGFuZGxlIEJGRF9SRUxPQ19DVE9SIHNwZWNpYWxseS4KLQkgU2VsZWN0IHRoZSByaWdodCByZWxvY2F0aW9uIChSX01JUFNfMzIgb3IgUl9NSVBTXzY0KSBiYXNlZCBvbiB0aGUKLQkgc2l6ZSBvZiBhZGRyZXNzZXMgb24gdGhpcyBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpID09IDMyKQotCXJldHVybiAmZWxmX21pcHNfaG93dG9fdGFibGVbKGludCkgUl9NSVBTXzMyXTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gJmVsZl9taXBzX2N0b3I2NF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfZ3ByZWxfaG93dG87Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGluaGVyaXRfaG93dG87Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0bzsKLSAgICB9Ci19Ci0KLS8qIEdpdmVuIGEgTUlQUyBFbGYzMl9JbnRlcm5hbF9SZWwsIGZpbGwgaW4gYW4gYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9NSVBTMTZfMjY6Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTMTZfR1BSRUw6Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9taXBzMTZfZ3ByZWxfaG93dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NSVBTX21heCk7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9taXBzX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVGhlIGFkZGVuZCBmb3IgYSBHUFJFTDE2IG9yIExJVEVSQUwgcmVsb2NhdGlvbiBjb21lcyBmcm9tIHRoZSBHUAotICAgICB2YWx1ZSBmb3IgdGhlIG9iamVjdCBmaWxlLiAgV2UgZ2V0IHRoZSBhZGRlbmQgbm93LCByYXRoZXIgdGhhbgotICAgICB3aGVuIHdlIGRvIHRoZSByZWxvY2F0aW9uLCBiZWNhdXNlIHRoZSBzeW1ib2wgbWFuaXB1bGF0aW9ucyBkb25lCi0gICAgIGJ5IHRoZSBsaW5rZXIgbWF5IGNhdXNlIHVzIHRvIGxvc2UgdHJhY2sgb2YgdGhlIGlucHV0IEJGRC4gICovCi0gIGlmICgoKCpjYWNoZV9wdHItPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLSAgICAgICYmIChyX3R5cGUgPT0gKHVuc2lnbmVkIGludCkgUl9NSVBTX0dQUkVMMTYKLQkgIHx8IHJfdHlwZSA9PSAodW5zaWduZWQgaW50KSBSX01JUFNfTElURVJBTCkpCi0gICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBlbGZfZ3AgKGFiZmQpOwotfQotCi0vKiBHaXZlbiBhIE1JUFMgRWxmMzJfSW50ZXJuYWxfUmVsYSwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIC8qIFNpbmNlIGFuIEVsZjMyX0ludGVybmFsX1JlbCBpcyBhbiBpbml0aWFsIHByZWZpeCBvZiBhbgotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhLCB3ZSBjYW4ganVzdCB1c2UgbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotICAgICBhYm92ZS4gICovCi0gIG1pcHNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgKEVsZjMyX0ludGVybmFsX1JlbCAqKSBkc3QpOwotCi0gIC8qIElmIHdlIGV2ZXIgbmVlZCB0byBkbyBhbnkgZXh0cmEgcHJvY2Vzc2luZyB3aXRoIGRzdC0+cl9hZGRlbmQKLSAgICAgKHRoZSBmaWVsZCBvbWl0dGVkIGluIGFuIEVsZjMyX0ludGVybmFsX1JlbCkgd2UgY2FuIGRvIGl0IGhlcmUuICAqLwotfQotDAotLyogQSAucmVnaW5mbyBzZWN0aW9uIGhvbGRzIGEgc2luZ2xlIEVsZjMyX1JlZ0luZm8gc3RydWN0dXJlLiAgVGhlc2UKLSAgIHJvdXRpbmVzIHN3YXAgdGhpcyBzdHJ1Y3R1cmUgaW4gYW5kIG91dC4gIFRoZXkgYXJlIHVzZWQgb3V0c2lkZSBvZgotICAgQkZELCBzbyB0aGV5IGFyZSBnbG9iYWxseSB2aXNpYmxlLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci0gICAgIEVsZjMyX1JlZ0luZm8gKmluOwotewotICBpbi0+cmlfZ3BybWFzayA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzFdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBpbi0+cmlfY3BybWFza1syXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGluLT5yaV9ncF92YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLXZvaWQKLWJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9SZWdJbmZvICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncHJtYXNrLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwcm1hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1swXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMV0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzJdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1szXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzNdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2dwX3ZhbHVlLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwX3ZhbHVlKTsKLX0KLQotLyogSW4gdGhlIDY0IGJpdCBBQkksIHRoZSAuTUlQUy5vcHRpb25zIHNlY3Rpb24gaG9sZHMgcmVnaXN0ZXIKLSAgIGluZm9ybWF0aW9uIGluIGFuIEVsZjY0X1JlZ2luZm8gc3RydWN0dXJlLiAgVGhlc2Ugcm91dGluZXMgc3dhcAotICAgdGhlbSBpbiBhbmQgb3V0LiAgVGhleSBhcmUgZ2xvYmFsbHkgdmlzaWJsZSBiZWNhdXNlIHRoZXkgYXJlIHVzZWQKLSAgIG91dHNpZGUgb2YgQkZELiAgVGhlc2Ugcm91dGluZXMgYXJlIGhlcmUgc28gdGhhdCBnYXMgY2FuIGNhbGwgdGhlbQotICAgd2l0aG91dCB3b3JyeWluZyBhYm91dCB3aGV0aGVyIHRoZSA2NCBiaXQgQUJJIGhhcyBiZWVuIGluY2x1ZGVkLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKmluOwotewotICBpbi0+cmlfZ3BybWFzayA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgaW4tPnJpX3BhZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9wYWQpOwotICBpbi0+cmlfY3BybWFza1swXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzBdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMV0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1sxXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzJdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMl0pOwotICBpbi0+cmlfY3BybWFza1szXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzNdKTsKLSAgaW4tPnJpX2dwX3ZhbHVlID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2dwX3ZhbHVlKTsKLX0KLQotdm9pZAotYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKmluOwotICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2dwcm1hc2ssCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9wYWQsCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfcGFkKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMF0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzFdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1syXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbM10sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncF92YWx1ZSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLS8qIFN3YXAgYW4gZW50cnkgaW4gYSAuZ3B0YWIgc2VjdGlvbi4gIE5vdGUgdGhhdCB0aGVzZSByb3V0aW5lcyByZWx5Ci0gICBvbiB0aGUgZXF1aXZhbGVuY2Ugb2YgdGhlIHR3byBlbGVtZW50cyBvZiB0aGUgdW5pb24uICAqLwotCi1zdGF0aWMgdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX0V4dGVybmFsX2dwdGFiICpleDsKLSAgICAgRWxmMzJfZ3B0YWIgKmluOwotewotICBpbi0+Z3RfZW50cnkuZ3RfZ192YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPmd0X2VudHJ5Lmd0X2dfdmFsdWUpOwotICBpbi0+Z3RfZW50cnkuZ3RfYnl0ZXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5ndF9lbnRyeS5ndF9ieXRlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX2dwdGFiICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+Z3RfZW50cnkuZ3RfZ192YWx1ZSwKLQkJZXgtPmd0X2VudHJ5Lmd0X2dfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+Z3RfZW50cnkuZ3RfYnl0ZXMsCi0JCWV4LT5ndF9lbnRyeS5ndF9ieXRlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9jb21wYWN0X3JlbCAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmlkMSwgZXgtPmlkMSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5udW0sIGV4LT5udW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+aWQyLCBleC0+aWQyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPm9mZnNldCwgZXgtPm9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yZXNlcnZlZDAsIGV4LT5yZXNlcnZlZDApOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmVzZXJ2ZWQxLCBleC0+cmVzZXJ2ZWQxKTsKLX0KLQotc3RhdGljIHZvaWQKLWJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9jcmluZm8gKmluOwotICAgICBFbGYzMl9FeHRlcm5hbF9jcmluZm8gKmV4OwotewotICB1bnNpZ25lZCBsb25nIGw7Ci0KLSAgbCA9ICgoKGluLT5jdHlwZSAmIENSSU5GT19DVFlQRSkgPDwgQ1JJTkZPX0NUWVBFX1NIKQotICAgICAgIHwgKChpbi0+cnR5cGUgJiBDUklORk9fUlRZUEUpIDw8IENSSU5GT19SVFlQRV9TSCkKLSAgICAgICB8ICgoaW4tPmRpc3QydG8gJiBDUklORk9fRElTVDJUTykgPDwgQ1JJTkZPX0RJU1QyVE9fU0gpCi0gICAgICAgfCAoKGluLT5yZWx2YWRkciAmIENSSU5GT19SRUxWQUREUikgPDwgQ1JJTkZPX1JFTFZBRERSX1NIKSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGwsIGV4LT5pbmZvKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmtvbnN0LCBleC0+a29uc3QpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+dmFkZHIsIGV4LT52YWRkcik7Ci19Ci0KLS8qIFN3YXAgaW4gYW4gb3B0aW9ucyBoZWFkZXIuICAqLwotCi12b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX09wdGlvbnMgKmV4OwotICAgICBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqaW47Ci17Ci0gIGluLT5raW5kID0gYmZkX2hfZ2V0XzggKGFiZmQsIGV4LT5raW5kKTsKLSAgaW4tPnNpemUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXgtPnNpemUpOwotICBpbi0+c2VjdGlvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXgtPnNlY3Rpb24pOwotICBpbi0+aW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPmluZm8pOwotfQotCi0vKiBTd2FwIG91dCBhbiBvcHRpb25zIGhlYWRlci4gICovCi0KLXZvaWQKLWJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX09wdGlvbnMgKmluOwotICAgICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqZXg7Ci17Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBpbi0+a2luZCwgZXgtPmtpbmQpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW4tPnNpemUsIGV4LT5zaXplKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+c2VjdGlvbiwgZXgtPnNlY3Rpb24pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5pbmZvLCBleC0+aW5mbyk7Ci19Ci0KLS8qIFN3YXAgaW4gYW4gTVNZTSBlbnRyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9tc3ltX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfRXh0ZXJuYWxfTXN5bSAqZXg7Ci0gICAgIEVsZjMyX0ludGVybmFsX01zeW0gKmluOwotewotICBpbi0+bXNfaGFzaF92YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPm1zX2hhc2hfdmFsdWUpOwotICBpbi0+bXNfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPm1zX2luZm8pOwotfQotCi0vKiBTd2FwIG91dCBhbiBNU1lNIGVudHJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLWJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfSW50ZXJuYWxfTXN5bSAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX01zeW0gKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5tc19oYXNoX3ZhbHVlLCBleC0+bXNfaGFzaF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPm1zX2luZm8sIGV4LT5tc19pbmZvKTsKLX0KLQotDAotLyogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgZ2xvYmFsIGZvciB0aGUgcHVycG9zZXMgb2Ygc3BsaXR0aW5nCi0gICB0aGUgc3ltYm9sIHRhYmxlIGludG8gZ2xvYmFsIHN5bWJvbHMgYW5kIGxvY2FsIHN5bWJvbHMuICBBdCBsZWFzdAotICAgb24gSXJpeCA1LCB0aGlzIHNwbGl0IG11c3QgYmUgYmV0d2VlbiBzZWN0aW9uIHN5bWJvbHMgYW5kIGFsbCBvdGhlcgotICAgc3ltYm9scy4gIE9uIG1vc3QgRUxGIHRhcmdldHMgdGhlIHNwbGl0IGlzIGJldHdlZW4gc3RhdGljIHN5bWJvbHMKLSAgIGFuZCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3N5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIHJldHVybiAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLX0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGEgTUlQUyBFTEYgZmlsZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX21pcHMsCi0JCQkgICAgIGVsZl9taXBzX21hY2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhIDMyLWJpdCBNSVBTIEVMRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmMzJfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogSXJpeCA1IGlzIGJyb2tlbi4gIE9iamVjdCBmaWxlIHN5bWJvbCB0YWJsZXMgYXJlIG5vdCBhbHdheXMKLSAgICAgc29ydGVkIGNvcnJlY3RseSBzdWNoIHRoYXQgbG9jYWwgc3ltYm9scyBwcmVjZWRlIGdsb2JhbCBzeW1ib2xzLAotICAgICBhbmQgdGhlIHNoX2luZm8gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBpcyBub3QgYWx3YXlzIHJpZ2h0LiAgKi8KLSAgZWxmX2JhZF9zeW10YWIgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9taXBzX2VsZl9vYmplY3RfcCAoYWJmZCk7Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgYSBNSVBTIEVMRiBvYmplY3QKLSAgIGZpbGUuICBUaGlzIGdldHMgdGhlIE1JUFMgYXJjaGl0ZWN0dXJlIHJpZ2h0IGJhc2VkIG9uIHRoZSBtYWNoaW5lCi0gICBudW1iZXIuICBUaGlzIGlzIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKipoZHJwcDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczM5MDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8xIHwgRV9NSVBTX01BQ0hfMzkwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNjAwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDMwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMTA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDEwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTExOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQxMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2NTA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDY1MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKTsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotCi0gIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBmb3IgLmdwdGFiIHNlY3Rpb25zIGFuZCBvdGhlciBhcHByb3ByaWF0ZQotICAgICBpbmZvIGZvciBlYWNoIHNwZWNpYWwgc2VjdGlvbi4gICovCi0gIGZvciAoaSA9IDEsIGhkcnBwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKSArIDE7Ci0gICAgICAgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotICAgICAgIGkrKywgaGRycHArKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCgqaGRycHApLT5zaF90eXBlKQotCXsKLQljYXNlIFNIVF9NSVBTX01TWU06Ci0JY2FzZSBTSFRfTUlQU19MSUJMSVNUOgotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3RyIik7Ci0JICBpZiAoc2VjICE9IE5VTEwpCi0JICAgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfR1BUQUI6Ci0JICBCRkRfQVNTRVJUICgoKmhkcnBwKS0+YmZkX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsICgqaGRycHApLT5iZmRfc2VjdGlvbik7Ci0JICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwKLQkJICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCk7Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDEpOwotCSAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotCSAgKCpoZHJwcCktPnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTUlQU19DT05URU5UOgotCSAgQkZEX0FTU0VSVCAoKCpoZHJwcCktPmJmZF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCAoKmhkcnBwKS0+YmZkX3NlY3Rpb24pOwotCSAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuTUlQUy5jb250ZW50IiwKLQkJCQkgIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKSA9PSAwKTsKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgbmFtZSArIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKTsKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfU1lNQk9MX0xJQjoKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGlibGlzdCIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfaW5mbyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX0VWRU5UUzoKLQkgIEJGRF9BU1NFUlQgKCgqaGRycHApLT5iZmRfc2VjdGlvbiAhPSBOVUxMKTsKLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgKCpoZHJwcCktPmJmZF9zZWN0aW9uKTsKLQkgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTCk7Ci0JICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpID09IDApCi0JICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgICBuYW1lICsgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLk1JUFMucG9zdF9yZWwiLAotCQkJCSAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgPT0gMCk7Ci0JICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCi0JCQkJCSAgICAgKG5hbWUKLQkJCQkJICAgICAgKyBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpKTsKLQkgICAgfQotCSAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotCSAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JfQotICAgIH0KLX0KLQwKLS8qIEZ1bmN0aW9uIHRvIGtlZXAgTUlQUyBzcGVjaWZpYyBmaWxlIGZsYWdzIGxpa2UgYXMgRUZfTUlQU19QSUMuICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvbGRfZmxhZ3M7Ci0gIGZsYWd3b3JkIG5ld19mbGFnczsKLSAgYm9vbGVhbiBvazsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICptc2c7Ci0KLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaWJmZCkpCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIpOwotICAgICAgZWxzZQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iKTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgfD0gbmV3X2ZsYWdzICYgRUZfTUlQU19OT1JFT1JERVI7Ci0gIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghIGVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9nZXRfYXJjaCAoaWJmZCkKLQkgICYmIGJmZF9nZXRfYXJjaF9pbmZvIChvYmZkKS0+dGhlX2RlZmF1bHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksCi0JCQkJICAgYmZkX2dldF9tYWNoIChpYmZkKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBDaGVjayBmbGFnIGNvbXBhdGliaWxpdHkuICAqLwotCi0gIG5ld19mbGFncyAmPSB+RUZfTUlQU19OT1JFT1JERVI7Ci0gIG9sZF9mbGFncyAmPSB+RUZfTUlQU19OT1JFT1JERVI7Ci0KLSAgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgb2sgPSB0cnVlOwotCi0gIGlmICgobmV3X2ZsYWdzICYgRUZfTUlQU19QSUMpICE9IChvbGRfZmxhZ3MgJiBFRl9NSVBTX1BJQykpCi0gICAgewotICAgICAgbmV3X2ZsYWdzICY9IH5FRl9NSVBTX1BJQzsKLSAgICAgIG9sZF9mbGFncyAmPSB+RUZfTUlQU19QSUM7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGxpbmtpbmcgUElDIGZpbGVzIHdpdGggbm9uLVBJQyBmaWxlcyIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICBvayA9IGZhbHNlOwotICAgIH0KLQotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfQ1BJQykgIT0gKG9sZF9mbGFncyAmIEVGX01JUFNfQ1BJQykpCi0gICAgewotICAgICAgbmV3X2ZsYWdzICY9IH5FRl9NSVBTX0NQSUM7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfQ1BJQzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogbGlua2luZyBhYmljYWxscyBmaWxlcyB3aXRoIG5vbi1hYmljYWxscyBmaWxlcyIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICBvayA9IGZhbHNlOwotICAgIH0KLQotICAvKiBDb21wYXJlIHRoZSBJU0Ency4gKi8KLSAgaWYgKChuZXdfZmxhZ3MgJiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKSkKLSAgICAgICE9IChvbGRfZmxhZ3MgJiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKSkpCi0gICAgewotICAgICAgaW50IG5ld19tYWNoID0gbmV3X2ZsYWdzICYgRUZfTUlQU19NQUNIOwotICAgICAgaW50IG9sZF9tYWNoID0gb2xkX2ZsYWdzICYgRUZfTUlQU19NQUNIOwotICAgICAgaW50IG5ld19pc2EgPSBlbGZfbWlwc19pc2EgKG5ld19mbGFncyk7Ci0gICAgICBpbnQgb2xkX2lzYSA9IGVsZl9taXBzX2lzYSAob2xkX2ZsYWdzKTsKLQotICAgICAgLyogSWYgZWl0aGVyIGhhcyBubyBtYWNoaW5lIHNwZWNpZmllZCwganVzdCBjb21wYXJlIHRoZSBnZW5lcmFsIGlzYSdzLgotCSBTb21lIGNvbWJpbmF0aW9ucyBvZiBtYWNoaW5lcyBhcmUgb2ssIGlmIHRoZSBpc2EncyBtYXRjaC4gKi8KLSAgICAgIGlmICghIG5ld19tYWNoIAotCSAgfHwgISBvbGRfbWFjaAotCSAgfHwgbmV3X21hY2ggPT0gb2xkX21hY2gKLQkgICkKLQl7Ci0JICAvKiBEb24ndCB3YXJuIGFib3V0IG1peGluZyAtbWlwczEgYW5kIC1taXBzMiBjb2RlLCBvciBtaXhpbmcgLW1pcHMzCi0JICAgICBhbmQgLW1pcHM0IGNvZGUuICBUaGV5IHdpbGwgbm9ybWFsbHkgdXNlIHRoZSBzYW1lIGRhdGEgc2l6ZXMgYW5kCi0JICAgICBjYWxsaW5nIGNvbnZlbnRpb25zLiAgKi8KLQotCSAgaWYgKChuZXdfaXNhID09IDEgfHwgbmV3X2lzYSA9PSAyKQotCSAgICAgID8gKG9sZF9pc2EgIT0gMSAmJiBvbGRfaXNhICE9IDIpCi0JICAgICAgOiAob2xkX2lzYSA9PSAxIHx8IG9sZF9pc2EgPT0gMikpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiBJU0EgbWlzbWF0Y2ggKC1taXBzJWQpIHdpdGggcHJldmlvdXMgbW9kdWxlcyAoLW1pcHMlZCkiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIG5ld19pc2EsIG9sZF9pc2EpOwotCSAgICAgIG9rID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBJU0EgbWlzbWF0Y2ggKCVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKCVkKSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19tYWNoIChuZXdfZmxhZ3MpLAotCSAgICAgZWxmX21pcHNfbWFjaCAob2xkX2ZsYWdzKSk7Ci0JICBvayA9IGZhbHNlOwotCX0KLQotICAgICAgbmV3X2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKTsKLSAgICB9Ci0KLSAgLyogQ29tcGFyZSBBQkkncyAqLwotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfQUJJKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19BQkkpKQotICAgIHsKLSAgICAgIC8qIE9ubHkgZXJyb3IgaWYgYm90aCBhcmUgc2V0ICh0byBkaWZmZXJlbnQgdmFsdWVzKS4gKi8KLSAgICAgIGlmICgobmV3X2ZsYWdzICYgRUZfTUlQU19BQkkpCi0JICAmJiAob2xkX2ZsYWdzICYgRUZfTUlQU19BQkkpKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IEFCSSBtaXNtYXRjaDogbGlua2luZyAlcyBtb2R1bGUgd2l0aCBwcmV2aW91cyAlcyBtb2R1bGVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgICAgIGVsZl9taXBzX2FiaV9uYW1lIChuZXdfZmxhZ3MpLAotCSAgICAgZWxmX21pcHNfYWJpX25hbWUgKG9sZF9mbGFncykpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0gICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfQUJJOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0FCSTsKLSAgICB9Ci0KLSAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksICh1bnNpZ25lZCBsb25nKSBuZXdfZmxhZ3MsCi0JICh1bnNpZ25lZCBsb25nKSBvbGRfZmxhZ3MpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgb2spCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotc3RhdGljIGJvb2xlYW4KLV9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLQotICAvKiBQcmludCBub3JtYWwgRUxGIHByaXZhdGUgZGF0YS4gICovCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXyAoInByaXZhdGUgZmxhZ3MgPSAlbHg6IiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLQotICBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfTzMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1PMzJdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9PNjQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU82NF0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX0VBQkkzMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9RUFCSTMyXSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfRUFCSTY0KQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1FQUJJNjRdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpIHVua25vd25dIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSTIpKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1OMzJdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbm8gYWJpIHNldF0iKSk7Ci0KLSAgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMV0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzM10iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfNCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzNF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFt1bmtub3duIElTQV0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU18zMkJJVE1PREUpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbMzJiaXRtb2RlXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW25vdCAzMmJpdG1vZGVdIikpOwotCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhhbmRsZSBhIE1JUFMgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLgotICAgVGhpcyByb3V0aW5lIHN1cHBvcnRzIGJvdGggdGhlIDMyLWJpdCBhbmQgNjQtYml0IEVMRiBBQkkuCi0KLSAgIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgU0hGX01JUFNfR1BSRUwgZmxhZywgYnV0IEknbSBub3Qgc3VyZQotICAgaG93IHRvLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzID0gMDsKLQotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gIEZvcnR1bmF0ZWx5LCB0aGUgQUJJIGdpdmVzCi0gICAgIHN1Z2dlc3RlZCBuYW1lcyBmb3IgYWxsIHRoZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLCBzbyB3ZSB3aWxsCi0gICAgIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdGhpcy4gICovCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9NSVBTX0xJQkxJU1Q6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmxpYmxpc3QiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTToKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTkZMSUNUOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5jb25mbGljdCIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19HUFRBQjoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfVUNPREU6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnVjb2RlIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RFQlVHOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gU0VDX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfUkVHSU5GTzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpICE9IDAKLQkgIHx8IGhkci0+c2hfc2l6ZSAhPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLmludGVyZmFjZXMiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfQ09OVEVOVDoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfT1BUSU9OUzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RXQVJGOgotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWdfIiwgc2l6ZW9mICIuZGVidWdfIiAtIDEpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLnN5bWxpYiIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCSAgICAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKLQkJCQkgICAgfCBmbGFncykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIDMyLWJpdCBNSVBTIEVMRiBzcGVjaWZpYyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoISBfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGSVhNRTogV2Ugc2hvdWxkIHJlY29yZCBzaF9pbmZvIGZvciBhIC5ncHRhYiBzZWN0aW9uLiAgKi8KLQotICAvKiBGb3IgYSAucmVnaW5mbyBzZWN0aW9uLCBzZXQgdGhlIGdwIHZhbHVlIGluIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbgotICAgICBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uICBXZSBuZWVkIHRoZSBncCB2YWx1ZSB3aGlsZQotICAgICBwcm9jZXNzaW5nIHJlbG9jcywgc28gd2UganVzdCBnZXQgaXQgbm93LiAgVGhlIC5yZWdpbmZvIHNlY3Rpb24KLSAgICAgaXMgbm90IHVzZWQgaW4gdGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkuICAqLwotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX1JFR0lORk8pCi0gICAgewotICAgICAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0gICAgICBFbGYzMl9SZWdJbmZvIHM7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgJmV4dCwgJnMpOwotICAgICAgZWxmX2dwIChhYmZkKSA9IHMucmlfZ3BfdmFsdWU7Ci0gICAgfQotCi0gIC8qIEZvciBhIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbiwgbG9vayBmb3IgYSBPREtfUkVHSU5GTyBlbnRyeSwgYW5kCi0gICAgIHNldCB0aGUgZ3AgdmFsdWUgYmFzZWQgb24gd2hhdCB3ZSBmaW5kLiAgV2UgbWF5IHNlZSBib3RoCi0gICAgIFNIVF9NSVBTX1JFR0lORk8gYW5kIFNIVF9NSVBTX09QVElPTlMvT0RLX1JFR0lORk87IGluIHRoYXQgY2FzZSwKLSAgICAgdGhleSBzaG91bGQgYWdyZWUuICAqLwotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqbCwgKmxlbmQ7Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgaGRyLT5zaF9zaXplKSkKLQl7Ci0JICBmcmVlIChjb250ZW50cyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbCA9IGNvbnRlbnRzOwotICAgICAgbGVuZCA9IGNvbnRlbnRzICsgaGRyLT5zaF9zaXplOwotICAgICAgd2hpbGUgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSA8PSBsZW5kKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9PcHRpb25zIGludG9wdDsKLQotCSAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGwsCi0JCQkJCSZpbnRvcHQpOwotCSAgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgRWxmMzJfUmVnSW5mbyBpbnRyZWc7Ci0KLQkgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4KLQkJKGFiZmQsCi0JCSAoKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikKLQkJICAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKSksCi0JCSAmaW50cmVnKTsKLQkgICAgICBlbGZfZ3AgKGFiZmQpID0gaW50cmVnLnJpX2dwX3ZhbHVlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIE1JUFMgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saWJsaXN0IikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19MSUJMSVNUOwotICAgICAgaGRyLT5zaF9pbmZvID0gc2VjLT5fcmF3X3NpemUgLyBzaXplb2YgKEVsZjMyX0xpYik7Ci0gICAgICAvKiBUaGUgc2hfbGluayBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19NU1lNOwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gODsKLSAgICAgIC8qIEZJWE1FOiBTZXQgdGhlIHNoX2luZm8gZmllbGQuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmNvbmZsaWN0IikgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19DT05GTElDVDsKLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19HUFRBQjsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpOwotICAgICAgLyogVGhlIHNoX2luZm8gZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnVjb2RlIikgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19VQ09ERTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLm1kZWJ1ZyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfREVCVUc7Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAubWRlYnVnIHNlY3Rpb24gaGFzIGFuCi0gICAgICAgICBlbnRzaXplIG9mIDAuICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCi0gICAgICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQloZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgZWxzZQotCWhkci0+c2hfZW50c2l6ZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfUkVHSU5GTzsKLSAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaGFzIGFuCi0gICAgICAgICBlbnRzaXplIG9mIDB4MTguICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCi0gICAgICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQloZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pOwotICAgICAgZWxzZQotCWhkci0+c2hfZW50c2l6ZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChTR0lfQ09NUEFUIChhYmZkKQotCSAgICYmIChzdHJjbXAgKG5hbWUsICIuaGFzaCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bmFtaWMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5zdHIiKSA9PSAwKSkKLSAgICB7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSAwOwotI2lmIDAKLSAgICAgIC8qIFRoaXMgaXNuJ3QgaG93IHRoZSBJcml4IDYgbGlua2VyIGJlaGF2ZXMuICAqLwotICAgICAgaGRyLT5zaF9pbmZvID0gU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZ290IikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfR1BSRUw7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLmludGVyZmFjZXMiKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0lGQUNFOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmNvbnRlbnQiLCBzdHJsZW4gKCIuTUlQUy5jb250ZW50IikpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfQ09OVEVOVDsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfTk9TVFJJUDsKLSAgICAgIC8qIFRoZSBzaF9pbmZvIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX09QVElPTlM7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSAxOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5kZWJ1Z18iLCBzaXplb2YgIi5kZWJ1Z18iIC0gMSkgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19EV0FSRjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuc3ltbGliIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19TWU1CT0xfTElCOwotICAgICAgLyogVGhlIHNoX2xpbmsgYW5kIHNoX2luZm8gZmllbGRzIGFyZSBzZXQgaW4KLSAgICAgICAgIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpID09IDAKLQkgICB8fCBzdHJuY21wIChuYW1lLCAiLk1JUFMucG9zdF9yZWwiLAotCQkgICAgICAgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0VWRU5UUzsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfTk9TVFJJUDsKLSAgICAgIC8qIFRoZSBzaF9saW5rIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX01TWU07Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDg7Ci0gICAgfQotCi0gIC8qIFRoZSBnZW5lcmljIGVsZl9mYWtlX3NlY3Rpb25zIHdpbGwgc2V0IHVwIFJFTF9IRFIgdXNpbmcgdGhlCi0gICAgIGRlZmF1bHQga2luZCBvZiByZWxvY2F0aW9ucy4gIEJ1dCwgd2UgbWF5IGFjdHVhbGx5IG5lZWQgYm90aAotICAgICBraW5kcyBvZiByZWxvY2F0aW9ucywgc28gd2Ugc2V0IHVwIHRoZSBzZWNvbmQgaGVhZGVyIGhlcmUuICAqLwotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICplc2Q7Ci0KLSAgICAgIGVzZCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyk7Ci0gICAgICBCRkRfQVNTRVJUIChlc2QtPnJlbF9oZHIyID09IE5VTEwpOwotICAgICAgZXNkLT5yZWxfaGRyMiAKLQk9IChFbGZfSW50ZXJuYWxfU2hkciAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0gICAgICBpZiAoIWVzZC0+cmVsX2hkcjIpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyIChhYmZkLCBlc2QtPnJlbF9oZHIyLCBzZWMsCi0JCQkJIWVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnVzZV9yZWxhX3ApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2l2ZW4gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIGxvY2F0ZSB0aGUgY29ycmVzcG9uZGluZyBFTEYgc2VjdGlvbgotICAgaW5kZXguICBUaGlzIGlzIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4KLSAgIEFjdHVhbGx5LCBpdCdzIG5vdCBjbGVhciB0byBtZSB0aGF0IHRoZSA2NC1iaXQgQUJJIHN1cHBvcnRzIHRoZXNlLAotICAgYnV0IGZvciBub24tUElDIG9iamVjdHMgd2Ugd2lsbCBjZXJ0YWlubHkgd2FudCBzdXBwb3J0IGZvciBhdCBsZWFzdAotICAgdGhlIC5zY29tbW9uIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCAqcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICAqcmV0dmFsID0gU0hOX01JUFNfU0NPTU1PTjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuYWNvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NSVBTX0FDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV2hlbiBhcmUgd3JpdGluZyBvdXQgdGhlIC5vcHRpb25zIG9yIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiwKLSAgIHJlbWVtYmVyIHRoZSBieXRlcyB3ZSBhcmUgd3JpdGluZyBvdXQsIHNvIHRoYXQgd2UgY2FuIGluc3RhbGwgdGhlCi0gICBHUCB2YWx1ZSBpbiB0aGUgc2VjdGlvbl9wcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgKmM7Ci0KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpKTsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBpZiAoYyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgaWYgKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICBzaXplID0gc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgZWxzZQotCSAgICBzaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgYyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50ZGF0YSA9IChQVFIpIGM7Ci0JfQotCi0gICAgICBtZW1jcHkgKGMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwKLQkJCQkJY291bnQpOwotfQotCi0vKiBXb3JrIG92ZXIgYSBzZWN0aW9uIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICBGSVhNRTogV2UgcmVjb2duaXplCi0gICBzZWN0aW9ucyB0aGF0IG5lZWQgdGhlIFNIRl9NSVBTX0dQUkVMIGZsYWcgYnkgbmFtZTsgdGhlcmUgaGFzIHRvIGJlCi0gICBhIGJldHRlciB3YXkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGlmIChoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uKTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMAotCSAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfTk9CSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuY29tcGFjdF9yZWwiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgPSAwOwotCSAgaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ydHByb2MiKSA9PSAwKQotCXsKLQkgIGlmIChoZHItPnNoX2FkZHJhbGlnbiAhPSAwICYmIGhkci0+c2hfZW50c2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFkanVzdDsKLQotCSAgICAgIGFkanVzdCA9IGhkci0+c2hfc2l6ZSAlIGhkci0+c2hfYWRkcmFsaWduOwotCSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQkJaGRyLT5zaF9zaXplICs9IGhkci0+c2hfYWRkcmFsaWduIC0gYWRqdXN0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV29yayBvdmVyIGEgc2VjdGlvbiBqdXN0IGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFdlIHVwZGF0ZSB0aGUgR1AKLSAgIHZhbHVlIGluIHRoZSBTSFRfTUlQU19SRUdJTkZPIGFuZCBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb25zIGJhc2VkCi0gICBvbiB0aGUgdmFsdWUgd2UgYXJlIHVzaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nIChhYmZkLCBoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOwotewotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX1JFR0lORk8KLSAgICAgICYmIGhkci0+c2hfc2l6ZSA+IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYnVmWzRdOwotCi0gICAgICBCRkRfQVNTRVJUIChoZHItPnNoX3NpemUgPT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0gICAgICBCRkRfQVNTRVJUIChoZHItPmNvbnRlbnRzID09IE5VTEwpOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBoZHItPnNoX29mZnNldCArIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykgLSA0LAotCQkgICAgU0VFS19TRVQpID09IC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGVsZl9ncCAoYWJmZCksIGJ1Zik7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChidWYsIChiZmRfc2l6ZV90eXBlKSAxLCAoYmZkX3NpemVfdHlwZSkgNCwgYWJmZCkgIT0gNCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUwotICAgICAgJiYgaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKSAhPSBOVUxMCi0gICAgICAmJiBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKS0+dGRhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHMsICpsLCAqbGVuZDsKLQotICAgICAgLyogV2Ugc3RvcmVkIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGluIHRoZSBlbGZfc2VjdGlvbl9kYXRhIHRkYXRhCi0JIGZpZWxkIGluIHRoZSBzZXRfc2VjdGlvbl9jb250ZW50cyByb3V0aW5lLiAgV2Ugc2F2ZSB0aGUKLQkgc2VjdGlvbiBjb250ZW50cyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmVhZCB0aGVtIGFnYWluLgotCSBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBlbGZfZ3AgaXMgc2V0LCBzbyB3ZSBjYW4gbG9vawotCSB0aHJvdWdoIHRoZSBzZWN0aW9uIGNvbnRlbnRzIHRvIHNlZSBpZiB0aGVyZSBpcyBhbgotCSBPREtfUkVHSU5GTyBzdHJ1Y3R1cmUuICAqLwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBsID0gY29udGVudHM7Ci0gICAgICBsZW5kID0gY29udGVudHMgKyBoZHItPnNoX3NpemU7Ci0gICAgICB3aGlsZSAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpIDw9IGxlbmQpCi0JewotCSAgRWxmX0ludGVybmFsX09wdGlvbnMgaW50b3B0OwotCi0JICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgbCwKLQkJCQkJJmludG9wdCk7Ci0JICBpZiAoaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSBidWZbNF07Ci0KLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCQkgICAgKGhkci0+c2hfb2Zmc2V0Ci0JCQkgICAgICsgKGwgLSBjb250ZW50cykKLQkJCSAgICAgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKQotCQkJICAgICArIChzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pIC0gNCkpLAotCQkJICAgICBTRUVLX1NFVCkgPT0gLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGVsZl9ncCAoYWJmZCksIGJ1Zik7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA0LCBhYmZkKSAhPSA0KQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGwgKz0gaW50b3B0LnNpemU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcgKGFiZmQsIGhkcik7Ci19Ci0MCi0vKiBNSVBTIEVMRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXIgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQKLSAgIHRvZ2V0aGVyLCBhbmQgdGhlbiByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcG9pbnRlciwgd2hpY2ggeWllbGRzCi0gICBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uCi0gICBzZWN0aW9uLiAgVGhpcyBhcHByb2FjaCBpcyBjb3BpZWQgZnJvbSBlY29mZi5jLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtaXBzX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBtaXBzX2VsZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptaXBzX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIE1JUFMgRUxGIGFsc28gdXNlcyBhbiBhY29tbW9uIHNlY3Rpb24sIHdoaWNoIHJlcHJlc2VudHMgYW4KLSAgIGFsbG9jYXRlZCBjb21tb24gc3ltYm9sIHdoaWNoIG1heSBiZSBvdmVycmlkZGVuIGJ5IGEKLSAgIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeS4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCi0vKiBUaGUgSXJpeCA1IHN1cHBvcnQgdXNlcyB0d28gdmlydHVhbCBzZWN0aW9ucywgd2hpY2ggcmVwcmVzZW50Ci0gICB0ZXh0L2RhdGEgc3ltYm9scyBkZWZpbmVkIGluIGR5bmFtaWMgb2JqZWN0cy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfdGV4dF9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyOwotCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfZGF0YV9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTUlQUyBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLgotICAgVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotdm9pZAotX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0gIHN3aXRjaCAoZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9NSVBTX0FDT01NT046Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlIGZpbGUuCi0JIEl0IGlzIGFuIGFsbG9jYXRlZCBjb21tb24gc2VjdGlvbi4gIFRoZSBkeW5hbWljIGxpbmtlciBjYW4KLQkgZWl0aGVyIHJlc29sdmUgdGhlc2Ugc3ltYm9scyB0byBzb21ldGhpbmcgaW4gYSBzaGFyZWQKLQkgbGlicmFyeSwgb3IgaXQgY2FuIGp1c3QgbGVhdmUgdGhlbSBoZXJlLiAgRm9yIG91ciBwdXJwb3NlcywKLQkgd2UgY2FuIGNvbnNpZGVyIHRoZXNlIHN5bWJvbHMgdG8gYmUgaW4gYSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBhY29tbW9uIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPSAiLmFjb21tb24iOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0FMTE9DOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2wubmFtZSA9ICIuYWNvbW1vbiI7Ci0JICBtaXBzX2VsZl9hY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMgb24gSVJJWDUuICAqLwotICAgICAgaWYgKGFzeW0tPnZhbHVlID4gZWxmX2dwX3NpemUgKGFiZmQpCi0JICB8fCBJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2KQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIFNITl9NSVBTX1NDT01NT046Ci0gICAgICBpZiAobWlwc19lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2wubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19TVU5ERUZJTkVEOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotI2lmIDAgLyogZm9yIFNHSV9DT01QQVQgKi8KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19EQVRBOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0KLX0KLQwKLS8qIFdoZW4gY3JlYXRpbmcgYW4gSXJpeCA1IGV4ZWN1dGFibGUsIHdlIG5lZWQgUkVHSU5GTyBhbmQgUlRQUk9DCi0gICBzZWdtZW50cy4gICovCi0KLXN0YXRpYyBpbnQKLW1pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBpbnQgcmV0ID0gMDsKLQotICBpZiAoIVNHSV9DT01QQVQgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIGEgUFRfTUlQU19SRUdJTkZPIHNlZ21lbnQuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVnaW5mbyIpOwotICBpZiAocyAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkpCi0gICAgKytyZXQ7Ci0KLSAgLyogU2VlIGlmIHdlIG5lZWQgYSBQVF9NSVBTX09QVElPTlMgc2VnbWVudC4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2Ci0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgCi0JCQkJICBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpKQotICAgICsrcmV0OwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIGEgUFRfTUlQU19SVFBST0Mgc2VnbWVudC4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1Ci0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpKQotICAgICsrcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIE1vZGlmeSB0aGUgc2VnbWVudCBtYXAgZm9yIGFuIElyaXggNSBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbSwgKipwbTsKLQotICBpZiAoISBTR0lfQ09NUEFUIChhYmZkKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBpcyBhIC5yZWdpbmZvIHNlY3Rpb24sIHdlIG5lZWQgYSBQVF9NSVBTX1JFR0lORk8KLSAgICAgc2VnbWVudC4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JaWYgKG0tPnBfdHlwZSA9PSBQVF9NSVBTX1JFR0lORk8pCi0JICBicmVhazsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JewotCSAgbSA9IChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbSk7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG0tPnBfdHlwZSA9IFBUX01JUFNfUkVHSU5GTzsKLQkgIG0tPmNvdW50ID0gMTsKLQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQotCSAgLyogV2Ugd2FudCB0byBwdXQgaXQgYWZ0ZXIgdGhlIFBIRFIgYW5kIElOVEVSUCBzZWdtZW50cy4gICovCi0JICBwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsKLQkgIHdoaWxlICgqcG0gIT0gTlVMTAotCQkgJiYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfUEhEUgotCQkgICAgIHx8ICgqcG0pLT5wX3R5cGUgPT0gUFRfSU5URVJQKSkKLQkgICAgcG0gPSAmKCpwbSktPm5leHQ7Ci0KLQkgIG0tPm5leHQgPSAqcG07Ci0JICAqcG0gPSBtOwotCX0KLSAgICB9Ci0KLSAgLyogRm9yIElSSVggNiwgd2UgZG9uJ3QgaGF2ZSAubWRlYnVnIHNlY3Rpb25zLCBub3IgZG9lcyBhbnl0aGluZyBidXQKLSAgICAgLmR5bmFtaWMgZW5kIHVwIGluIFBUX0RZTkFNSUMuICBIb3dldmVyLCB3ZSBkbyBoYXZlIHRvIGluc2VydCBhCi0gICAgIFBUX09QVElPTlMgc2VnZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBwcm9ncmFtIGhlYWRlcgotICAgICB0YWJsZS4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0JaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMpCi0JICBicmVhazsKLQotICAgICAgaWYgKHMpCi0JewotCSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqb3B0aW9uc19zZWdtZW50OwotCi0JICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbTsgbSA9IG0tPm5leHQpCi0JICAgIGlmIChtLT5wX3R5cGUgPT0gUFRfUEhEUikKLQkgICAgICBicmVhazsKLQotCSAgLyogVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKi8KLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb3B0aW9uc19zZWdtZW50ID0gYmZkX3phbGxvYyAoYWJmZCwgCi0JCQkJCXNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpOwotCSAgb3B0aW9uc19zZWdtZW50LT5uZXh0ID0gbS0+bmV4dDsKLQkgIG9wdGlvbnNfc2VnbWVudC0+cF90eXBlID0gUFRfTUlQU19PUFRJT05TOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX2ZsYWdzID0gUEZfUjsKLQkgIG9wdGlvbnNfc2VnbWVudC0+cF9mbGFnc192YWxpZCA9IHRydWU7Ci0JICBvcHRpb25zX3NlZ21lbnQtPmNvdW50ID0gMTsKLQkgIG9wdGlvbnNfc2VnbWVudC0+c2VjdGlvbnNbMF0gPSBzOwotCSAgbS0+bmV4dCA9IG9wdGlvbnNfc2VnbWVudDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhlcmUgYXJlIC5keW5hbWljIGFuZCAubWRlYnVnIHNlY3Rpb25zLCB3ZSBtYWtlIGEgcm9vbQotCSBmb3IgdGhlIFJUUFJPQyBoZWFkZXIuICBGSVhNRTogUmV3cml0ZSB3aXRob3V0IHNlY3Rpb24gbmFtZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpID09IE5VTEwKLQkgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKSAhPSBOVUxMCi0JICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKSAhPSBOVUxMKQotCXsKLQkgIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotCSAgICBpZiAobS0+cF90eXBlID09IFBUX01JUFNfUlRQUk9DKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKG0gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG0gPSAoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKm0pOwotCSAgICAgIGlmIChtID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIG0tPnBfdHlwZSA9IFBUX01JUFNfUlRQUk9DOwotCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCXsKLQkJICBtLT5jb3VudCA9IDA7Ci0JCSAgbS0+cF9mbGFncyA9IDA7Ci0JCSAgbS0+cF9mbGFnc192YWxpZCA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBtLT5jb3VudCA9IDE7Ci0JCSAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCQl9Ci0KLQkgICAgICAvKiBXZSB3YW50IHRvIHB1dCBpdCBhZnRlciB0aGUgRFlOQU1JQyBzZWdtZW50LiAgKi8KLQkgICAgICBwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsKLQkgICAgICB3aGlsZSAoKnBtICE9IE5VTEwgJiYgKCpwbSktPnBfdHlwZSAhPSBQVF9EWU5BTUlDKQotCQlwbSA9ICYoKnBtKS0+bmV4dDsKLQkgICAgICBpZiAoKnBtICE9IE5VTEwpCi0JCXBtID0gJigqcG0pLT5uZXh0OwotCi0JICAgICAgbS0+bmV4dCA9ICpwbTsKLQkgICAgICAqcG0gPSBtOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBPbiBJcml4IDUsIHRoZSBQVF9EWU5BTUlDIHNlZ21lbnQgaW5jbHVkZXMgdGhlIC5keW5hbWljLAotCSAuZHluc3RyLCAuZHluc3ltLCBhbmQgLmhhc2ggc2VjdGlvbnMsIGFuZCBldmVyeXRoaW5nIGluCi0JIGJldHdlZW4uICAqLwotICAgICAgZm9yIChwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgKnBtICE9IE5VTEw7IHBtID0gJigqcG0pLT5uZXh0KQotCWlmICgoKnBtKS0+cF90eXBlID09IFBUX0RZTkFNSUMpCi0JICBicmVhazsKLSAgICAgIG0gPSAqcG07Ci0gICAgICBpZiAobSAhPSBOVUxMCi0JICAmJiBtLT5jb3VudCA9PSAxCi0JICAmJiBzdHJjbXAgKG0tPnNlY3Rpb25zWzBdLT5uYW1lLCAiLmR5bmFtaWMiKSA9PSAwKQotCXsKLQkgIHN0YXRpYyBjb25zdCBjaGFyICpzZWNfbmFtZXNbXSA9Ci0JICB7ICIuZHluYW1pYyIsICIuZHluc3RyIiwgIi5keW5zeW0iLCAiLmhhc2giIH07Ci0JICBiZmRfdm1hIGxvdywgaGlnaDsKLQkgIHVuc2lnbmVkIGludCBpLCBjOwotCSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbjsKLQotCSAgbG93ID0gMHhmZmZmZmZmZjsKLQkgIGhpZ2ggPSAwOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBzZWNfbmFtZXMgLyBzaXplb2Ygc2VjX25hbWVzWzBdOyBpKyspCi0JICAgIHsKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlY19uYW1lc1tpXSk7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJewotCQkgIGJmZF9zaXplX3R5cGUgc3o7Ci0KLQkJICBpZiAobG93ID4gcy0+dm1hKQotCQkgICAgbG93ID0gcy0+dm1hOwotCQkgIHN6ID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgIGlmIChzeiA9PSAwKQotCQkgICAgc3ogPSBzLT5fcmF3X3NpemU7Ci0JCSAgaWYgKGhpZ2ggPCBzLT52bWEgKyBzeikKLQkJICAgIGhpZ2ggPSBzLT52bWEgKyBzejsKLQkJfQotCSAgICB9Ci0KLQkgIGMgPSAwOwotCSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCQkmJiBzLT52bWEgPj0gbG93Ci0JCSYmICgocy0+dm1hCi0JCSAgICAgKyAocy0+X2Nvb2tlZF9zaXplICE9IDAgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpKQotCQkgICAgPD0gaGlnaCkpCi0JICAgICAgKytjOwotCi0JICBuID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbiArIChjIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAqbiA9ICptOwotCSAgbi0+Y291bnQgPSBjOwotCi0JICBpID0gMDsKLQkgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0JCSAgJiYgcy0+dm1hID49IGxvdwotCQkgICYmICgocy0+dm1hCi0JCSAgICAgICArIChzLT5fY29va2VkX3NpemUgIT0gMCA/Ci0JCQkgIHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSkpCi0JCSAgICAgIDw9IGhpZ2gpKQotCQl7Ci0JCSAgbi0+c2VjdGlvbnNbaV0gPSBzOwotCQkgICsraTsKLQkJfQotCSAgICB9Ci0KLQkgICpwbSA9IG47Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgY3JlYXRlZCBieSB0aGUKLSAgIGxvYWRlciBmb3IgdXNlIGJ5IHRoZSBzdGF0aWMgZXhjZXB0aW9uIHN5c3RlbS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHJ1bnRpbWVfcGRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLwotCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCi0JbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCi0JbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KLQlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLwotCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KLQlsb25nCWlycHNzOwkJLyogaW5kZXggaW50byB0aGUgcnVudGltZSBzdHJpbmcgdGFibGUgKi8KLQlsb25nCXJlc2VydmVkOwotCXN0cnVjdCBleGNlcHRpb25faW5mbyAqZXhjZXB0aW9uX2luZm87LyogcG9pbnRlciB0byBleGNlcHRpb24gYXJyYXkgKi8KLX0gUlBEUiwgKnBSUERSOwotI2RlZmluZSBjYlJQRFIgc2l6ZW9mKFJQRFIpCi0jZGVmaW5lIHJwZE5pbCAoKHBSUERSKSAwKQotCi0vKiBTd2FwIFJQRFIgKHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIGVudHJ5KSBmb3Igb3V0cHV0LiAgKi8KLQotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9ycGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUlBEUiAqLCBzdHJ1Y3QgcnBkcl9leHQgKikpOwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9ycGRyX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFJQRFIgKmluOwotICAgICBzdHJ1Y3QgcnBkcl9leHQgKmV4OwotewotICAvKiBlY29mZl9wdXRfb2ZmIHdhcyBkZWZpbmVkIGluIGVjb2Zmc3dhcC5oLiAgKi8KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW4tPmFkciwgKGJmZF9ieXRlICopIGV4LT5wX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKSBleC0+cF9yZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+ZnJlZ21hc2ssIChiZmRfYnl0ZSAqKSBleC0+cF9mcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmFtZW9mZnNldCk7Ci0KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmFtZXJlZyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnBjcmVnLCAoYmZkX2J5dGUgKikgZXgtPnBfcGNyZWcpOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmlycHNzLCAoYmZkX2J5dGUgKikgZXgtPnBfaXJwc3MpOwotI2lmIDAgLyogRklYTUUgKi8KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW4tPmV4Y2VwdGlvbl9pbmZvLCAoYmZkX2J5dGUgKikgZXgtPnBfZXhjZXB0aW9uX2luZm8pOwotI2VuZGlmCi19Ci0MCi0vKiBSZWFkIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgLm1kZWJ1ZyBzZWN0aW9uIGludG8gYQotICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgc2VjdGlvbiwgZGVidWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgY2hhciAqZXh0X2hkciA9IE5VTEw7Ci0KLSAgc3dhcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgbWVtc2V0IChkZWJ1ZywgMCwgc2l6ZW9mKCpkZWJ1ZykpOwotCi0gIGV4dF9oZHIgPSAoY2hhciAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChleHRfaGRyID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBleHRfaGRyLCAoZmlsZV9wdHIpIDAsCi0JCQkJc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgICA9PSBmYWxzZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgKCpzd2FwLT5zd2FwX2hkcl9pbikgKGFiZmQsIGV4dF9oZHIsIHN5bWhkcik7Ci0KLSAgLyogVGhlIHN5bWJvbGljIGhlYWRlciBjb250YWlucyBhYnNvbHV0ZSBmaWxlIG9mZnNldHMgYW5kIHNpemVzIHRvCi0gICAgIHJlYWQuICAqLwotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgc3ltaGRyLT5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWFiZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgIH0KLQotICBSRUFEIChsaW5lLCBjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgdW5zaWduZWQgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3N5bSwgY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQl1bmlvbiBhdXhfZXh0ICopOwotICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChzc2V4dCwgY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3JmZCwgY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9leHQsIGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgUFRSKTsKLSN1bmRlZiBSRUFECi0KLSAgZGVidWctPmZkciA9IE5VTEw7Ci0gIGRlYnVnLT5hZGp1c3QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXh0X2hkciAhPSBOVUxMKQotICAgIGZyZWUgKGV4dF9oZHIpOwotICBpZiAoZGVidWctPmxpbmUgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+bGluZSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3N5bSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gIGlmIChkZWJ1Zy0+c3MgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3MpOwotICBpZiAoZGVidWctPnNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzZXh0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9mZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogTUlQUyBFTEYgbG9jYWwgbGFiZWxzIHN0YXJ0IHdpdGggJyQnLCBub3QgJ0wnLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnJCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogT24gSXJpeCA2LCB0aGUgbGFiZWxzIGdvIGJhY2sgdG8gc3RhcnRpbmcgd2l0aCAnLicsIHNvIHdlIGFjY2VwdAotICAgICB0aGUgZ2VuZXJpYyBFTEYgbG9jYWwgbGFiZWwgc3ludGF4IGFzIHdlbGwuICAqLwotICByZXR1cm4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0KLS8qIE1JUFMgRUxGIHVzZXMgYSBzcGVjaWFsIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUgaW4gb3JkZXIgdGhlCi0gICBoYW5kbGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZDsKLSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSBpOwotfTsKLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQkJIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBhc2VjdGlvbiAqbXNlYzsKLQotICBpZiAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyLCAKLQkJCQkgICAgIEFCSV82NF9QIChhYmZkKSA/IDggOiAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIik7Ci0gIGlmIChtc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb3JpZ2ZsYWdzOwotICAgICAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmk7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotCWdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLQotICAgICAgLyogSWYgd2UgYXJlIGNhbGxlZCBkdXJpbmcgYSBsaW5rLCBtaXBzX2VsZl9maW5hbF9saW5rIG1heSBoYXZlCi0JIGNsZWFyZWQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmllbGQuICBXZSBmb3JjZSBpdCBiYWNrIG9uIGhlcmUKLQkgaWYgYXBwcm9wcmlhdGUgKHdoaWNoIGl0IG5vcm1hbGx5IHdpbGwgYmUpLiAgKi8KLSAgICAgIG9yaWdmbGFncyA9IG1zZWMtPmZsYWdzOwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG1zZWMpLT50aGlzX2hkci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JbXNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgZmkgPSBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbzsKLSAgICAgIGlmIChmaSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBjaGFyICpmcmF3X3NyYzsKLQkgIGNoYXIgKmZyYXdfZW5kOwotCSAgc3RydWN0IGZkciAqZmRyX3B0cjsKLQotCSAgZmkgPSAoKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKikKLQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lKSkpOwotCSAgaWYgKGZpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKCEgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIG1zZWMsICZmaS0+ZCkpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogU3dhcCBpbiB0aGUgRkRSIGluZm9ybWF0aW9uLiAgKi8KLQkgIGZpLT5kLmZkciA9ICgoc3RydWN0IGZkciAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgKGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKgotCQkJCSAgIHNpemVvZiAoc3RydWN0IGZkcikpKSk7Ci0JICBpZiAoZmktPmQuZmRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGV4dGVybmFsX2Zkcl9zaXplID0gc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBmZHJfcHRyID0gZmktPmQuZmRyOwotCSAgZnJhd19zcmMgPSAoY2hhciAqKSBmaS0+ZC5leHRlcm5hbF9mZHI7Ci0JICBmcmF3X2VuZCA9IChmcmF3X3NyYwotCQkgICAgICArIGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKiBleHRlcm5hbF9mZHJfc2l6ZSk7Ci0JICBmb3IgKDsgZnJhd19zcmMgPCBmcmF3X2VuZDsgZnJhd19zcmMgKz0gZXh0ZXJuYWxfZmRyX3NpemUsIGZkcl9wdHIrKykKLQkgICAgKCpzd2FwLT5zd2FwX2Zkcl9pbikgKGFiZmQsIChQVFIpIGZyYXdfc3JjLCBmZHJfcHRyKTsKLQotCSAgZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPSBmaTsKLQotCSAgLyogTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciB0byBldmVyIGZyZWUgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICBmaW5kX25lYXJlc3RfbGluZSBpcyBlaXRoZXIgY2FsbGVkIGFsbCB0aGUgdGltZSwgYXMgaW4KLSAgICAgICAgICAgICBvYmpkdW1wIC1sLCBzbyB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHNhdmVkLCBvciBpdCBpcwotICAgICAgICAgICAgIHJhcmVseSBjYWxsZWQsIGFzIGluIGxkIGVycm9yIG1lc3NhZ2VzLCBzbyB0aGUgbWVtb3J5Ci0gICAgICAgICAgICAgd2FzdGVkIGlzIHVuaW1wb3J0YW50LiAgU3RpbGwsIGl0IHdvdWxkIHByb2JhYmx5IGJlIGEKLSAgICAgICAgICAgICBnb29kIGlkZWEgZm9yIGZyZWVfY2FjaGVkX2luZm8gdG8gdGhyb3cgaXQgYXdheS4gICovCi0JfQotCi0gICAgICBpZiAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCAmZmktPmQsIHN3YXAsCi0JCQkJICAmZmktPmksIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgIGxpbmVfcHRyKSkKLQl7Ci0JICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0gICAgfQotCi0gIC8qIEZhbGwgYmFjayBvbiB0aGUgZ2VuZXJpYyBFTEYgZmluZF9uZWFyZXN0X2xpbmUgcm91dGluZS4gICovCi0KLSAgcmV0dXJuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cik7Ci19Ci0MCi0gIC8qIFRoZSBtaXBzMTYgY29tcGlsZXIgdXNlcyBhIGNvdXBsZSBvZiBzcGVjaWFsIHNlY3Rpb25zIHRvIGhhbmRsZQotICAgICBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMuCi0KLSAgICAgU2VjdGlvbiBuYW1lcyB0aGF0IGxvb2sgbGlrZSAubWlwczE2LmZuLkZOTkFNRSBjb250YWluIHN0dWJzIHRoYXQKLSAgICAgY29weSBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgZnJvbSB0aGUgZnAgcmVncyB0byB0aGUgZ3AgcmVncyBhbmQKLSAgICAgdGhlbiBqdW1wIHRvIEZOTkFNRS4gIElmIGFueSAzMiBiaXQgZnVuY3Rpb24gY2FsbHMgRk5OQU1FLCB0aGUKLSAgICAgY2FsbCBzaG91bGQgYmUgcmVkaXJlY3RlZCB0byB0aGUgc3R1YiBpbnN0ZWFkLiAgSWYgbm8gMzIgYml0Ci0gICAgIGZ1bmN0aW9uIGNhbGxzIEZOTkFNRSwgdGhlIHN0dWIgc2hvdWxkIGJlIGRpc2NhcmRlZC4gIFdlIG5lZWQgdG8KLSAgICAgY29uc2lkZXIgYW55IHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24sIG5vdCBqdXN0IGEgY2FsbCwgYmVjYXVzZQotICAgICBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaXMgdGFrZW4gd2Ugd2lsbCBuZWVkIHRoZSBzdHViLAotICAgICBzaW5jZSB0aGUgYWRkcmVzcyBtaWdodCBiZSBwYXNzZWQgdG8gYSAzMiBiaXQgZnVuY3Rpb24uCi0KLSAgICAgU2VjdGlvbiBuYW1lcyB0aGF0IGxvb2sgbGlrZSAubWlwczE2LmNhbGwuRk5OQU1FIGNvbnRhaW4gc3R1YnMKLSAgICAgdGhhdCBjb3B5IGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBmcm9tIHRoZSBncCByZWdzIHRvIHRoZSBmcAotICAgICByZWdzIGFuZCB0aGVuIGp1bXAgdG8gRk5OQU1FLiAgSWYgRk5OQU1FIGlzIGEgMzIgYml0IGZ1bmN0aW9uLAotICAgICB0aGVuIGFueSAxNiBiaXQgZnVuY3Rpb24gdGhhdCBjYWxscyBGTk5BTUUgc2hvdWxkIGJlIHJlZGlyZWN0ZWQKLSAgICAgdG8gdGhlIHN0dWIgaW5zdGVhZC4gIElmIEZOTkFNRSBpcyBub3QgYSAzMiBiaXQgZnVuY3Rpb24sIHRoZQotICAgICBzdHViIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0KLSAgICAgLm1pcHMxNi5jYWxsLmZwLkZOTkFNRSBzZWN0aW9ucyBhcmUgc2ltaWxhciwgYnV0IGNvbnRhaW4gc3R1YnMKLSAgICAgd2hpY2ggY2FsbCBGTk5BTUUgYW5kIHRoZW4gY29weSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZwIHJlZ3MKLSAgICAgdG8gdGhlIGdwIHJlZ3MuICBUaGVzZSBzdHVicyBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGluICQxOCB3aGlsZQotICAgICBjYWxsaW5nIEZOTkFNRTsgYW55IGZ1bmN0aW9uIHdoaWNoIG1pZ2h0IGNhbGwgb25lIG9mIHRoZXNlIHN0dWJzCi0gICAgIG11c3QgYXJyYW5nZSB0byBzYXZlICQxOCBhcm91bmQgdGhlIGNhbGwuICAoVGhpcyBjYXNlIGlzIG5vdAotICAgICBuZWVkZWQgZm9yIDMyIGJpdCBmdW5jdGlvbnMgdGhhdCBjYWxsIDE2IGJpdCBmdW5jdGlvbnMsIGJlY2F1c2UKLSAgICAgMTYgYml0IGZ1bmN0aW9ucyBhbHdheXMgcmV0dXJuIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiBib3RoCi0gICAgICRmMC8kZjEgYW5kICQyLyQzLikKLQotICAgICBOb3RlIHRoYXQgaW4gYWxsIGNhc2VzIEZOTkFNRSBtaWdodCBiZSBkZWZpbmVkIHN0YXRpY2FsbHkuCi0gICAgIFRoZXJlZm9yZSwgRk5OQU1FIGlzIG5vdCB1c2VkIGxpdGVyYWxseS4gIEluc3RlYWQsIHRoZSByZWxvY2F0aW9uCi0gICAgIGluZm9ybWF0aW9uIHdpbGwgaW5kaWNhdGUgd2hpY2ggc3ltYm9sIHRoZSBzZWN0aW9uIGlzIGZvci4KLQotICAgICBXZSByZWNvcmQgYW55IHN0dWJzIHRoYXQgd2UgZmluZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotI2RlZmluZSBGTl9TVFVCICIubWlwczE2LmZuLiIKLSNkZWZpbmUgQ0FMTF9TVFVCICIubWlwczE2LmNhbGwuIgotI2RlZmluZSBDQUxMX0ZQX1NUVUIgIi5taXBzMTYuY2FsbC5mcC4iCi0KLS8qIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotI2lmIDAKLSAgLyogV2Ugbm8gbG9uZ2VyIHVzZSB0aGlzLiAgKi8KLSAgLyogU3RyaW5nIHNlY3Rpb24gaW5kaWNlcyBmb3IgdGhlIGR5bmFtaWMgc2VjdGlvbiBzeW1ib2xzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBkeW5zeW1fc2VjX3N0cmluZGV4W1NJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FU107Ci0jZW5kaWYKLSAgLyogVGhlIG51bWJlciBvZiAucnRwcm9jIGVudHJpZXMuICAqLwotICBiZmRfc2l6ZV90eXBlIHByb2NlZHVyZV9jb3VudDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uIChpZiBTR0lfQ09NUEFUKS4gICovCi0gIGJmZF9zaXplX3R5cGUgY29tcGFjdF9yZWxfc2l6ZTsKLSAgLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiBEVF9NSVBTX1JMRF9NQVAgZHluYW1pYwotICAgICBlbnRyeSBpcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgX19ybGRfb2JqX2hlYWQgYXMgaW4gSXJpeCA1LiAqLwotICBib29sZWFuIHVzZV9ybGRfb2JqX2hlYWQ7Ci0gIC8qIFRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSBfX3JsZF9tYXAgb3IgX19ybGRfb2JqX2hlYWQgc3ltYm9sLiAgKi8KLSAgYmZkX3ZtYSBybGRfdmFsdWU7Ci0gIC8qIFRoaXMgaXMgc2V0IGlmIHdlIHNlZSBhbnkgbWlwczE2IHN0dWIgc2VjdGlvbnMuICovCi0gIGJvb2xlYW4gbWlwczE2X3N0dWJzX3NlZW47Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIG1pcHNfZWxmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCVwKLSAgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIG1pcHNfZWxmX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX291dHB1dF9leHRzeW0KLSAgUEFSQU1TICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLW1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgbWVtc2V0ICgmcmV0LT5lc3ltLCAwLCBzaXplb2YgKEVYVFIpKTsKLSAgICAgIC8qIFdlIHVzZSAtMiBhcyBhIG1hcmtlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBoYXMKLQkgbm90IGJlZW4gc2V0LiAgLTEgbWVhbnMgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBpZmQuICAqLwotICAgICAgcmV0LT5lc3ltLmlmZCA9IC0yOwotICAgICAgcmV0LT5taXBzXzMyX3JlbG9jcyA9IDA7Ci0gICAgICByZXQtPm1pbl9keW5fcmVsb2NfaW5kZXggPSAwOwotICAgICAgcmV0LT5mbl9zdHViID0gTlVMTDsKLSAgICAgIHJldC0+bmVlZF9mbl9zdHViID0gZmFsc2U7Ci0gICAgICByZXQtPmNhbGxfc3R1YiA9IE5VTEw7Ci0gICAgICByZXQtPmNhbGxfZnBfc3R1YiA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotbWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmIDAKLSAgLyogV2Ugbm8gbG9uZ2VyIHVzZSB0aGlzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUzsgaSsrKQotICAgIHJldC0+ZHluc3ltX3NlY19zdHJpbmRleFtpXSA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLSNlbmRpZgotICByZXQtPnByb2NlZHVyZV9jb3VudCA9IDA7Ci0gIHJldC0+Y29tcGFjdF9yZWxfc2l6ZSA9IDA7Ci0gIHJldC0+dXNlX3JsZF9vYmpfaGVhZCA9IGZhbHNlOwotICByZXQtPnJsZF92YWx1ZSA9IDA7Ci0gIHJldC0+bWlwczE2X3N0dWJzX3NlZW4gPSBmYWxzZTsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgTUlQUyBzZWN0aW9uIG51bWJlcnMgaGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX3JsZF9uZXdfaW50ZXJmYWNlIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIElyaXggNSBybGQgZW50cnkgbmFtZS4gICovCi0gICAgICAqbmFtZXAgPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHN3aXRjaCAoc3ltLT5zdF9zaG5keCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fQ09NTU9OOgotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIHRoZSBHUCBzaXplIGFyZSBhdXRvbWF0aWNhbGx5Ci0JIHRyZWF0ZWQgYXMgU0hOX01JUFNfU0NPTU1PTiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChzeW0tPnN0X3NpemUgPiBlbGZfZ3Bfc2l6ZSAoYWJmZCkKLQkgIHx8IElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYpCi0JYnJlYWs7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgU0hOX01JUFNfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19URVhUOgotICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGlmIChtaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24ubmFtZSA9ICIudGV4dCI7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24uZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSBOVUxMOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLnN5bWJvbCA9ICZtaXBzX2VsZl90ZXh0X3N5bWJvbDsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3N5bWJvbF9wdHI7Ci0JICBtaXBzX2VsZl90ZXh0X3N5bWJvbC5uYW1lID0gIi50ZXh0IjsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl90ZXh0X3NlY3Rpb247Ci0JICBtaXBzX2VsZl90ZXh0X3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfdGV4dF9zeW1ib2w7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyID0gJm1pcHNfZWxmX3RleHRfc2VjdGlvbjsKLQl9Ci0gICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBkbyAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHIgaWYKLSAgICAgICAgIGluZm8tPnNoYXJlZC4gIEkgZG9uJ3Qga25vdyB3aHksIGFuZCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSwKLSAgICAgICAgIHNvIEkgdG9vayBpdCBvdXQuICAqLwotICAgICAgKnNlY3AgPSBtaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX0FDT01NT046Ci0gICAgICAvKiBGYWxsIHRocm91Z2guIFhYWCBDYW4gd2UgdHJlYXQgdGhpcyBhcyBhbGxvY2F0ZWQgZGF0YT8gICovCi0gICAgY2FzZSBTSE5fTUlQU19EQVRBOgotICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGlmIChtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24ubmFtZSA9ICIuZGF0YSI7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24uZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSBOVUxMOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLnN5bWJvbCA9ICZtaXBzX2VsZl9kYXRhX3N5bWJvbDsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtaXBzX2VsZl9kYXRhX3N5bWJvbF9wdHI7Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbC5uYW1lID0gIi5kYXRhIjsKLQkgIG1pcHNfZWxmX2RhdGFfc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl9kYXRhX3NlY3Rpb247Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyID0gJm1pcHNfZWxmX2RhdGFfc2VjdGlvbjsKLQl9Ci0gICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBkbyAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHIgaWYKLSAgICAgICAgIGluZm8tPnNoYXJlZC4gIEkgZG9uJ3Qga25vdyB3aHksIGFuZCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSwKLSAgICAgICAgIHNvIEkgdG9vayBpdCBvdXQuICAqLwotICAgICAgKnNlY3AgPSBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1NVTkRFRklORUQ6Ci0gICAgICAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0gICAgICAmJiAhIGluZm8tPnNoYXJlZAotICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCi0gICAgICAmJiBzdHJjbXAgKCpuYW1lcCwgIl9fcmxkX29ial9oZWFkIikgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogTWFyayBfX3JsZF9vYmpfaGVhZCBhcyBkeW5hbWljLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgYWJmZCwgKm5hbWVwLCBCU0ZfR0xPQkFMLCAqc2VjcCwKLQkgICAgICAoYmZkX3ZtYSkgKnZhbHAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbWlwczE2IHRleHQgc3ltYm9sLCBhZGQgMSB0byB0aGUgdmFsdWUgdG8gbWFrZSBpdAotICAgICBvZGQuICBUaGlzIHdpbGwgY2F1c2Ugc29tZXRoaW5nIGxpa2UgLndvcmQgU1lNIHRvIGNvbWUgdXAgd2l0aAotICAgICB0aGUgcmlnaHQgdmFsdWUgd2hlbiBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMuICAqLwotICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KQotICAgICsrKnZhbHA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gbWlwc19lbGZfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHdyaXRlIG91dCBFQ09GRiBkZWJ1Z2dpbmcgZXh0ZXJuYWwgc3ltYm9sCi0gICBpbmZvcm1hdGlvbi4gIEl0IGlzIGNhbGxlZCB2aWEgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgVGhlCi0gICBFQ09GRiBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gbXVzdCBtYXRjaCB0aGUgRUxGIGV4dGVybmFsCi0gICBzeW1ib2wgaW5mb3JtYXRpb24uICBVbmZvcnR1bmF0ZWx5LCBhdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cKLSAgIHdoZXRoZXIgYSBzeW1ib2wgaXMgcmVxdWlyZWQgYnkgcmVsb2MgaW5mb3JtYXRpb24sIHNvIHRoZSB0d28KLSAgIHRhYmxlcyBtYXkgd2luZCB1cCBiZWluZyBkaWZmZXJlbnQuICBXZSBtdXN0IHNvcnQgb3V0IHRoZSBleHRlcm5hbAotICAgc3ltYm9sIGluZm9ybWF0aW9uIGJlZm9yZSB3ZSBjYW4gc2V0IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAubWRlYnVnCi0gICBzZWN0aW9uLCBhbmQgd2UgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlIC5tZGVidWcgc2VjdGlvbiBiZWZvcmUgd2UKLSAgIGNhbiByZWxvY2F0ZSBhbnkgc2VjdGlvbnMsIGFuZCB3ZSBjYW4ndCBrbm93IHdoaWNoIHN5bWJvbHMgYXJlCi0gICByZXF1aXJlZCBieSByZWxvY2F0aW9uIHVudGlsIHdlIHJlbG9jYXRlIHRoZSBzZWN0aW9ucy4KLSAgIEZvcnR1bmF0ZWx5LCBpdCBpcyByZWxhdGl2ZWx5IHVubGlrZWx5IHRoYXQgYW55IHN5bWJvbCB3aWxsIGJlCi0gICBzdHJpcHBlZCBidXQgcmVxdWlyZWQgYnkgYSByZWxvYy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBub3QgaGFwcGVuCi0gICB3aGVuIGdlbmVyYXRpbmcgYSBmaW5hbCBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBib29sZWFuIHN0cmlwOwotICBhc2VjdGlvbiAqc2VjLCAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgaWYgKGgtPnJvb3QuaW5keCA9PSAtMikKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgfHwgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCi0JICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UgaWYgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgICB8fCAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChlaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5lc3ltLmlmZCA9PSAtMikKLSAgICB7Ci0gICAgICBoLT5lc3ltLmptcHRibCA9IDA7Ci0gICAgICBoLT5lc3ltLmNvYm9sX21haW4gPSAwOwotICAgICAgaC0+ZXN5bS53ZWFrZXh0ID0gMDsKLSAgICAgIGgtPmVzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5pZmQgPSBpZmROaWw7Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RHbG9iYWw7Ci0KLSAgICAgIGlmIChTR0lfQ09NUEFUIChlaW5mby0+YWJmZCkKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAvKiBVc2UgdW5kZWZpbmVkIGNsYXNzLiAgQWxzbywgc2V0IGNsYXNzIGFuZCB0eXBlIGZvciBzb21lCi0gICAgICAgICAgICAgc3BlY2lhbCBzeW1ib2xzLiAgKi8KLQkgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzFdKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzJdKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPQotCQltaXBzX2VsZl9oYXNoX3RhYmxlIChlaW5mby0+aW5mbyktPnByb2NlZHVyZV9jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBlbGZfZ3AgKGVpbmZvLT5hYmZkKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgc3ltYm9sIGggaXMgdGhlIG9uZSBmcm9tCi0JICAgICB0aGUgYW5vdGhlciBzaGFyZWQgbGlicmFyeSwgT1VUUFVUX1NFQ1RJT04gbWF5IGJlIG51bGwuICAqLwotCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJvZGF0YSIpID09IDAKLQkJICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotCSAgICAgIGVsc2UKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGgtPmVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICBlbHNlIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIGVsc2UKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNldCB0eXBlIGFuZCB2YWx1ZSBmb3IgYSBzeW1ib2wgd2l0aCBhIGZ1bmN0aW9uIHN0dWIuICAqLwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RQcm9jOwotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QucGx0Lm9mZnNldAotCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0JfQotI2lmIDAgLyogRklYTUU/ICAqLwotICAgICAgaC0+ZXN5bS5pZmQgPSAwOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGVpbmZvLT5hYmZkLCBlaW5mby0+ZGVidWcsIGVpbmZvLT5zd2FwLAotCQkJCSAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCQkgICAgICAmaC0+ZXN5bSkpCi0gICAgewotICAgICAgZWluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBydW50aW1lIHByb2NlZHVyZSB0YWJsZSBmcm9tIHRoZSAubWRlYnVnIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAoaGFuZGxlLCBhYmZkLCBpbmZvLCBzLCBkZWJ1ZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIEhEUlIgKmhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBSUERSICpycGRyLCAqcnA7Ci0gIHN0cnVjdCBycGRyX2V4dCAqZXJwOwotICBQVFIgcnRwcm9jOwotICBzdHJ1Y3QgcGRyX2V4dCAqZXBkcjsKLSAgc3RydWN0IHN5bV9leHQgKmVzeW07Ci0gIGNoYXIgKnNzLCAqKnN2OwotICBjaGFyICpzdHI7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY291bnQ7Ci0gIHVuc2lnbmVkIGxvbmcgc2luZGV4OwotICB1bnNpZ25lZCBsb25nIGk7Ci0gIFBEUiBwZHI7Ci0gIFNZTVIgc3ltOwotICBjb25zdCBjaGFyICpub19uYW1lX2Z1bmMgPSBfKCJzdGF0aWMgcHJvY2VkdXJlIChubyBuYW1lKSIpOwotCi0gIGVwZHIgPSBOVUxMOwotICBycGRyID0gTlVMTDsKLSAgZXN5bSA9IE5VTEw7Ci0gIHNzID0gTlVMTDsKLSAgc3YgPSBOVUxMOwotCi0gIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgc2luZGV4ID0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKLSAgY291bnQgPSBoZHItPmlwZE1heDsKLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBzaXplID0gc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgICAgIGVwZHIgPSAoc3RydWN0IHBkcl9leHQgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKLSAgICAgIGlmIChlcGRyID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciAoaGFuZGxlLCAoUFRSKSBlcGRyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2l6ZSA9IHNpemVvZiAoUlBEUik7Ci0gICAgICBycCA9IHJwZHIgPSAoUlBEUiAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKHJwZHIgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc3YgPSAoY2hhciAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChjaGFyICopICogY291bnQpOwotICAgICAgaWYgKHN2ID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNvdW50ID0gaGRyLT5pc3ltTWF4OwotICAgICAgc2l6ZSA9IHN3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZXN5bSA9IChzdHJ1Y3Qgc3ltX2V4dCAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKGVzeW0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKCEgX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIChoYW5kbGUsIChQVFIpIGVzeW0pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjb3VudCA9IGhkci0+aXNzTWF4OwotICAgICAgc3MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChjb3VudCk7Ci0gICAgICBpZiAoc3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIChoYW5kbGUsIChQVFIpIHNzKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY291bnQgPSBoZHItPmlwZE1heDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBycCsrKQotCXsKLQkgICgqc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSAoZXBkciArIGkpLCAmcGRyKTsKLQkgICgqc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCAoUFRSKSAmZXN5bVtwZHIuaXN5bV0sICZzeW0pOwotCSAgcnAtPmFkciA9IHN5bS52YWx1ZTsKLQkgIHJwLT5yZWdtYXNrID0gcGRyLnJlZ21hc2s7Ci0JICBycC0+cmVnb2Zmc2V0ID0gcGRyLnJlZ29mZnNldDsKLQkgIHJwLT5mcmVnbWFzayA9IHBkci5mcmVnbWFzazsKLQkgIHJwLT5mcmVnb2Zmc2V0ID0gcGRyLmZyZWdvZmZzZXQ7Ci0JICBycC0+ZnJhbWVvZmZzZXQgPSBwZHIuZnJhbWVvZmZzZXQ7Ci0JICBycC0+ZnJhbWVyZWcgPSBwZHIuZnJhbWVyZWc7Ci0JICBycC0+cGNyZWcgPSBwZHIucGNyZWc7Ci0JICBycC0+aXJwc3MgPSBzaW5kZXg7Ci0JICBzdltpXSA9IHNzICsgc3ltLmlzczsKLQkgIHNpbmRleCArPSBzdHJsZW4gKHN2W2ldKSArIDE7Ci0JfQotICAgIH0KLQotICBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMikgKyBzaW5kZXg7Ci0gIHNpemUgPSBCRkRfQUxJR04gKHNpemUsIDE2KTsKLSAgcnRwcm9jID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKHJ0cHJvYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSAwOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSBjb3VudCArIDI7Ci0KLSAgZXJwID0gKHN0cnVjdCBycGRyX2V4dCAqKSBydHByb2M7Ci0gIG1lbXNldCAoZXJwLCAwLCBzaXplb2YgKHN0cnVjdCBycGRyX2V4dCkpOwotICBlcnArKzsKLSAgc3RyID0gKGNoYXIgKikgcnRwcm9jICsgc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMik7Ci0gIHN0cmNweSAoc3RyLCBub19uYW1lX2Z1bmMpOwotICBzdHIgKz0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgZWNvZmZfc3dhcF9ycGRyX291dCAoYWJmZCwgcnBkciArIGksIGVycCArIGkpOwotICAgICAgc3RyY3B5IChzdHIsIHN2W2ldKTsKLSAgICAgIHN0ciArPSBzdHJsZW4gKHN2W2ldKSArIDE7Ci0gICAgfQotICBlY29mZl9wdXRfb2ZmIChhYmZkLCAoYmZkX3ZtYSkgLTEsIChiZmRfYnl0ZSAqKSAoZXJwICsgY291bnQpLT5wX2Fkcik7Ci0KLSAgLyogU2V0IHRoZSBzaXplIGFuZCBjb250ZW50cyBvZiAucnRwcm9jIHNlY3Rpb24uICAqLwotICBzLT5fcmF3X3NpemUgPSBzaXplOwotICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBydHByb2M7Ci0KLSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLSAgcy0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0gIGlmIChlcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZXBkcik7Ci0gIGlmIChycGRyICE9IE5VTEwpCi0gICAgZnJlZSAocnBkcik7Ci0gIGlmIChlc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXN5bSk7Ci0gIGlmIChzcyAhPSBOVUxMKQotICAgIGZyZWUgKHNzKTsKLSAgaWYgKHN2ICE9IE5VTEwpCi0gICAgZnJlZSAoc3YpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXBkciAhPSBOVUxMKQotICAgIGZyZWUgKGVwZHIpOwotICBpZiAocnBkciAhPSBOVUxMKQotICAgIGZyZWUgKHJwZHIpOwotICBpZiAoZXN5bSAhPSBOVUxMKQotICAgIGZyZWUgKGVzeW0pOwotICBpZiAoc3MgIT0gTlVMTCkKLSAgICBmcmVlIChzcyk7Ci0gIGlmIChzdiAhPSBOVUxMKQotICAgIGZyZWUgKHN2KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIGNvbXBhcmlzb24gcm91dGluZSB1c2VkIHRvIHNvcnQgLmdwdGFiIGVudHJpZXMuICAqLwotCi1zdGF0aWMgaW50Ci1ncHRhYl9jb21wYXJlIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBFbGYzMl9ncHRhYiAqYTEgPSAoY29uc3QgRWxmMzJfZ3B0YWIgKikgcDE7Ci0gIGNvbnN0IEVsZjMyX2dwdGFiICphMiA9IChjb25zdCBFbGYzMl9ncHRhYiAqKSBwMjsKLQotICByZXR1cm4gYTEtPmd0X2VudHJ5Lmd0X2dfdmFsdWUgLSBhMi0+Z3RfZW50cnkuZ3RfZ192YWx1ZTsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGxpbmsgcm91dGluZSB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIGFuZAotICAgdGhlIC5tZGVidWcgc2VjdGlvbnMuICBXZSBuZWVkIHRvIG1lcmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlc2UKLSAgIHNlY3Rpb25zIHRvZ2V0aGVyLCBub3Qgd3JpdGUgdGhlbSBhbGwgb3V0IHNlcXVlbnRpYWxseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqKnNlY3BwOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBhc2VjdGlvbiAqcmVnaW5mb19zZWMsICptZGVidWdfc2VjLCAqZ3B0YWJfZGF0YV9zZWMsICpncHRhYl9ic3Nfc2VjOwotICBhc2VjdGlvbiAqcnRwcm9jX3NlYzsKLSAgRWxmMzJfUmVnSW5mbyByZWdpbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1ZzsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAKLSAgICA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgSERSUiAqc3ltaGRyID0gJmRlYnVnLnN5bWJvbGljX2hlYWRlcjsKLSAgUFRSIG1kZWJ1Z19oYW5kbGUgPSBOVUxMOwotCi0gIC8qIElmIGFsbCB0aGUgdGhpbmdzIHdlIGxpbmtlZCB0b2dldGhlciB3ZXJlIFBJQywgYnV0IHdlJ3JlCi0gICAgIHByb2R1Y2luZyBhbiBleGVjdXRhYmxlIChyYXRoZXIgdGhhbiBhIHNoYXJlZCBvYmplY3QpLCB0aGVuIHRoZQotICAgICByZXN1bHRpbmcgZmlsZSBpcyBDUElDIChpLmUuLCBpdCBjYWxscyBQSUMgY29kZS4pICAqLwotICBpZiAoIWluZm8tPnNoYXJlZAotICAgICAgJiYgIWluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX1BJQykKLSAgICB7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPSB+RUZfTUlQU19QSUM7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9NSVBTX0NQSUM7Ci0gICAgfQotCi0gIC8qIE9uIElSSVg1LCB3ZSBvbWl0IHRoZSAub3B0aW9ucyBzZWN0aW9uLiAgT24gSVJJWDYsIGhvd2V2ZXIsIHdlCi0gICAgIGluY2x1ZGUgaXQsIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHByb2Nlc3MgaXQgcXVpdGUgcmlnaHQuICAoU29tZQotICAgICBlbnRyaWVzIGFyZSBzdXBwb3NlZCB0byBiZSBtZXJnZWQuKSAgRW1waXJpY2FsbHksIHdlIHNlZW0gdG8gYmUKLSAgICAgYmV0dGVyIG9mZiBpbmNsdWRpbmcgaXQgdGhlbiBub3QuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NSkKLSAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOyAqc2VjcHAgIT0gTlVMTDsgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcCAoKCpzZWNwcCktPm5hbWUsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLQkgIHsKLQkgICAgZm9yIChwID0gKCpzZWNwcCktPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkgICAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgKCpzZWNwcCktPmxpbmtfb3JkZXJfaGVhZCA9IE5VTEw7Ci0JICAgICpzZWNwcCA9ICgqc2VjcHApLT5uZXh0OwotCSAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0JICAgIAotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBHZXQgYSB2YWx1ZSBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgaWYgKGVsZl9ncCAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX2dwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQllbGZfZ3AgKGFiZmQpID0gKGgtPnUuZGVmLnZhbHVlCi0JCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBiZmRfdm1hIGxvOwotCi0JICAvKiBGaW5kIHRoZSBHUC1yZWxhdGl2ZSBzZWN0aW9uIHdpdGggdGhlIGxvd2VzdCBvZmZzZXQuICAqLwotCSAgbG8gPSAoYmZkX3ZtYSkgLTE7Ci0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIGlmIChvLT52bWEgPCBsbyAKLQkJJiYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5zaF9mbGFncyAmIFNIRl9NSVBTX0dQUkVMKSkKLQkgICAgICBsbyA9IG8tPnZtYTsKLQotCSAgLyogQW5kIGNhbGN1bGF0ZSBHUCByZWxhdGl2ZSB0byB0aGF0LiAgKi8KLQkgIGVsZl9ncCAoYWJmZCkgPSBsbyArIEVMRl9NSVBTX0dQX09GRlNFVCAoYWJmZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uIG5lZWRzIHRvIGRvIGEgcmVsb2MKLQkgICAgIGludm9sdmluZyB0aGUgR1AgdmFsdWUsIGl0IHNob3VsZCBtYWtlIGEgcmVsb2NfZGFuZ2Vyb3VzCi0JICAgICBjYWxsYmFjayB0byB3YXJuIHRoYXQgR1AgaXMgbm90IGRlZmluZWQuICAqLwotCX0KLSAgICB9Ci0KLSAgLyogR28gdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNvbGxlY3QgdGhlIC5yZWdpbmZvIGFuZCAubWRlYnVnCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVnaW5mb19zZWMgPSBOVUxMOwotICBtZGVidWdfc2VjID0gTlVMTDsKLSAgZ3B0YWJfZGF0YV9zZWMgPSBOVUxMOwotICBncHRhYl9ic3Nfc2VjID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIucmVnaW5mbyIpID09IDApCi0JewotCSAgbWVtc2V0ICgmcmVnaW5mbywgMCwgc2l6ZW9mIHJlZ2luZm8pOwotCi0JICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAucmVnaW5mbyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLQkgICAgICBFbGYzMl9SZWdJbmZvIHN1YjsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBoYXMgcHJvYmFibHkgY2xvYmJlcmVkIHRoZQotICAgICAgICAgICAgICAgICBzaXplIHRvIGJlIHplcm8gYnl0ZXMuICAqLwotCSAgICAgIGlmIChpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICAoUFRSKSAmZXh0LAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgICAgIHNpemVvZiBleHQpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4gKGlucHV0X2JmZCwgJmV4dCwgJnN1Yik7Ci0KLQkgICAgICByZWdpbmZvLnJpX2dwcm1hc2sgfD0gc3ViLnJpX2dwcm1hc2s7Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzBdIHw9IHN1Yi5yaV9jcHJtYXNrWzBdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1sxXSB8PSBzdWIucmlfY3BybWFza1sxXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0gfD0gc3ViLnJpX2Nwcm1hc2tbMl07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzNdIHw9IHN1Yi5yaV9jcHJtYXNrWzNdOwotCi0JICAgICAgLyogcmlfZ3BfdmFsdWUgaXMgc2V0IGJ5IHRoZSBmdW5jdGlvbgotCQkgbWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3Npbmcgd2hlbiB0aGUgc2VjdGlvbiBpcwotCQkgZmluYWxseSB3cml0dGVuIG91dC4gICovCi0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogU2l6ZSBoYXMgYmVlbiBzZXQgaW4gbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMgICovCi0JICBCRkRfQVNTRVJUKG8tPl9yYXdfc2l6ZSA9PSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIHJlZ2luZm9fc2VjID0gbzsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIubWRlYnVnIikgPT0gMCkKLQl7Ci0JICBzdHJ1Y3QgZXh0c3ltX2luZm8gZWluZm87Ci0KLQkgIC8qIFdlIGhhdmUgZm91bmQgdGhlIC5tZGVidWcgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JICAgICBMb29rIHRocm91Z2ggYWxsIHRoZSBsaW5rX29yZGVycyBjb21wcmlzaW5nIGl0IGFuZCBtZXJnZQotCSAgICAgdGhlIGluZm9ybWF0aW9uIHRvZ2V0aGVyLiAgKi8KLQkgIHN5bWhkci0+bWFnaWMgPSBzd2FwLT5zeW1fbWFnaWM7Ci0JICAvKiBGSVhNRTogV2hhdCBzaG91bGQgdGhlIHZlcnNpb24gc3RhbXAgYmU/ICAqLwotCSAgc3ltaGRyLT52c3RhbXAgPSAwOwotCSAgc3ltaGRyLT5pbGluZU1heCA9IDA7Ci0JICBzeW1oZHItPmNiTGluZSA9IDA7Ci0JICBzeW1oZHItPmlkbk1heCA9IDA7Ci0JICBzeW1oZHItPmlwZE1heCA9IDA7Ci0JICBzeW1oZHItPmlzeW1NYXggPSAwOwotCSAgc3ltaGRyLT5pb3B0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWF1eE1heCA9IDA7Ci0JICBzeW1oZHItPmlzc01heCA9IDA7Ci0JICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0JICBzeW1oZHItPmlmZE1heCA9IDA7Ci0JICBzeW1oZHItPmNyZmQgPSAwOwotCSAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLQotCSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGl0c2VsZiBpbiB0aGUKLQkgICAgIGRlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQkgIGRlYnVnLmxpbmUgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZG5yID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3BkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9zeW0gPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfb3B0ID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2F1eCA9IE5VTEw7Ci0JICBkZWJ1Zy5zcyA9IE5VTEw7Ci0JICBkZWJ1Zy5zc2V4dCA9IGRlYnVnLnNzZXh0X2VuZCA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9mZHIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcmZkID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2V4dCA9IGRlYnVnLmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotCi0JICBtZGVidWdfaGFuZGxlID0gYmZkX2Vjb2ZmX2RlYnVnX2luaXQgKGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7Ci0JICBpZiAobWRlYnVnX2hhbmRsZSA9PSAoUFRSKSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCSAgICAgIEVYVFIgZXN5bTsKLQkgICAgICBiZmRfdm1hIGxhc3Q7Ci0JICAgICAgdW5zaWduZWQgaW50IGk7Ci0JICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lW10gPQotCQl7ICIudGV4dCIsICIuaW5pdCIsICIuZmluaSIsICIuZGF0YSIsCi0JCSAgICAiLnJvZGF0YSIsICIuc2RhdGEiLCAiLnNic3MiLCAiLmJzcyIgfTsKLQkgICAgICBzdGF0aWMgY29uc3QgaW50IHNjW10gPSB7IHNjVGV4dCwgc2NJbml0LCBzY0ZpbmksIHNjRGF0YSwKLQkJCQkJICBzY1JEYXRhLCBzY1NEYXRhLCBzY1NCc3MsIHNjQnNzIH07Ci0KLQkgICAgICBlc3ltLmptcHRibCA9IDA7Ci0JICAgICAgZXN5bS5jb2JvbF9tYWluID0gMDsKLQkgICAgICBlc3ltLndlYWtleHQgPSAwOwotCSAgICAgIGVzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uaWZkID0gaWZkTmlsOwotCSAgICAgIGVzeW0uYXN5bS5pc3MgPSBpc3NOaWw7Ci0JICAgICAgZXN5bS5hc3ltLnN0ID0gc3RMb2NhbDsKLQkgICAgICBlc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJICBlc3ltLmFzeW0uc2MgPSBzY1tpXTsKLQkJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVbaV0pOwotCQkgIGlmIChzICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVzeW0uYXN5bS52YWx1ZSA9IHMtPnZtYTsKLQkJICAgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBlc3ltLmFzeW0udmFsdWUgPSBsYXN0OwotCi0JCSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgJmRlYnVnLCBzd2FwLAotCQkJCQkJICAgICAgbmFtZVtpXSwgJmVzeW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcDsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBpbnB1dF9kZWJ1ZzsKLQkgICAgICBjaGFyICplcmF3X3NyYzsKLQkgICAgICBjaGFyICplcmF3X2VuZDsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JCSAgfHwgKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCSAgICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCkgPT0gTlVMTCkKLQkJewotCQkgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IGEgbm9uIE1JUFMgRUxGIGJmZCB3b3VsZCBiZQotCQkgICAgIGRvaW5nIHdpdGggYSAubWRlYnVnIHNlY3Rpb24sIGJ1dCBJIGRvbid0IHJlYWxseQotCQkgICAgIHdhbnQgdG8gZGVhbCB3aXRoIGl0LiAgKi8KLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaW5wdXRfc3dhcCA9IChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKQotCQkJICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChwLT5zaXplID09IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICAvKiBUaGUgRUNPRkYgbGlua2luZyBjb2RlIGV4cGVjdHMgdGhhdCB3ZSBoYXZlIGFscmVhZHkKLQkJIHJlYWQgaW4gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbmQgc2V0IHVwIGFuCi0JCSBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZSwgc28gd2UgZG8gdGhhdCBub3cuICAqLwotCSAgICAgIGlmICghIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICAmaW5wdXRfZGVidWcpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAoISAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLQkJICAgICAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbnB1dF9iZmQsCi0JCSAgICAgICZpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwgaW5mbykpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBMb29wIHRocm91Z2ggdGhlIGV4dGVybmFsIHN5bWJvbHMuICBGb3IgZWFjaCBvbmUgd2l0aAotCQkgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24sIHRyeSB0byBmaW5kIHRoZSBzeW1ib2wgaW4KLQkJIHRoZSBsaW5rZXIgZ2xvYmFsIGhhc2ggdGFibGUgYW5kIHNhdmUgdGhlIGluZm9ybWF0aW9uCi0JCSBmb3IgdGhlIG91dHB1dCBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQkgICAgICBlcmF3X3NyYyA9IGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dDsKLQkgICAgICBlcmF3X2VuZCA9IChlcmF3X3NyYwotCQkJICArIChpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWV4dE1heAotCQkJICAgICAqIGlucHV0X3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKSk7Ci0JICAgICAgZm9yICg7Ci0JCSAgIGVyYXdfc3JjIDwgZXJhd19lbmQ7Ci0JCSAgIGVyYXdfc3JjICs9IGlucHV0X3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKQotCQl7Ci0JCSAgRVhUUiBleHQ7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgKCppbnB1dF9zd2FwLT5zd2FwX2V4dF9pbikgKGlucHV0X2JmZCwgKFBUUikgZXJhd19zcmMsICZleHQpOwotCQkgIGlmIChleHQuYXN5bS5zYyA9PSBzY05pbAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIG5hbWUgPSBpbnB1dF9kZWJ1Zy5zc2V4dCArIGV4dC5hc3ltLmlzczsKLQkJICBoID0gbWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMIHx8IGgtPmVzeW0uaWZkICE9IC0yKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoZXh0LmlmZCAhPSAtMSkKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoZXh0LmlmZAotCQkJCSAgPCBpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLQkJICAgICAgZXh0LmlmZCA9IGlucHV0X2RlYnVnLmlmZG1hcFtleHQuaWZkXTsKLQkJICAgIH0KLQotCQkgIGgtPmVzeW0gPSBleHQ7Ci0JCX0KLQotCSAgICAgIC8qIEZyZWUgdXAgdGhlIGluZm9ybWF0aW9uIHdlIGp1c3QgcmVhZC4gICovCi0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcubGluZSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZG5yKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9wZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3N5bSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfb3B0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9hdXgpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5zc2V4dCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZmRyKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9yZmQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dCk7Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpICYmIGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSAucnRwcm9jIHNlY3Rpb24uICAqLwotCSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgICAgICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQgfCBTRUNfUkVBRE9OTFkpOwotCi0JCSAgcnRwcm9jX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnRwcm9jIik7Ci0JCSAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcnRwcm9jX3NlYywgZmxhZ3MpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcnRwcm9jX3NlYywgNCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsCi0JCQkJCQkgICAgIGluZm8sIHJ0cHJvY19zZWMsICZkZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQkgIGVpbmZvLmFiZmQgPSBhYmZkOwotCSAgZWluZm8uaW5mbyA9IGluZm87Ci0JICBlaW5mby5kZWJ1ZyA9ICZkZWJ1ZzsKLQkgIGVpbmZvLnN3YXAgPSBzd2FwOwotCSAgZWluZm8uZmFpbGVkID0gZmFsc2U7Ci0JICBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICAgICBtaXBzX2VsZl9vdXRwdXRfZXh0c3ltLAotCQkJCSAgICAgICAoUFRSKSAmZWluZm8pOwotCSAgaWYgKGVpbmZvLmZhaWxlZCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5tZGVidWcgc2VjdGlvbi4gICovCi0JICBvLT5fcmF3X3NpemUgPSBiZmRfZWNvZmZfZGVidWdfc2l6ZSAoYWJmZCwgJmRlYnVnLCBzd2FwKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIG1kZWJ1Z19zZWMgPSBvOwotCX0KLQotICAgICAgaWYgKHN0cm5jbXAgKG8tPm5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0JewotCSAgY29uc3QgY2hhciAqc3VibmFtZTsKLQkgIHVuc2lnbmVkIGludCBjOwotCSAgRWxmMzJfZ3B0YWIgKnRhYjsKLQkgIEVsZjMyX0V4dGVybmFsX2dwdGFiICpleHRfdGFiOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIC8qIFRoZSAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzIHNlY3Rpb25zIGhvbGQKLQkgICAgIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBzbWFsbCBkYXRhIGFyZWEgd291bGQKLQkgICAgIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiB0aGUgLUcgc3dpdGNoLiAgVGhlc2Ugc2VjdGlvbnMKLQkgICAgIG5vdCB1c2VkIGluIGV4ZWN1dGFibGVzIGZpbGVzLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLQkgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCQkgICBwID0gcC0+bmV4dCkKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCi0JCSAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCQljb250aW51ZTsKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JCSAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSAgICAgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkJfQotCi0JICAgICAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcwotCQkgY3VycmVudGx5IG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICAgICAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICAgICAgLyogUmVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZm9yIChzZWNwcCA9ICZhYmZkLT5zZWN0aW9uczsKLQkJICAgKnNlY3BwICE9IG87Ci0JCSAgIHNlY3BwID0gJigqc2VjcHApLT5uZXh0KQotCQk7Ci0JICAgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgICAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgaXMgb25lIGdwdGFiIGZvciBpbml0aWFsaXplZCBkYXRhLCBhbmQgb25lIGZvcgotCSAgICAgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2RhdGEiKSA9PSAwKQotCSAgICBncHRhYl9kYXRhX3NlYyA9IG87Ci0JICBlbHNlIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2JzcyIpID09IDApCi0JICAgIGdwdGFiX2Jzc19zZWMgPSBvOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogaWxsZWdhbCBzZWN0aW9uIG5hbWUgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBUaGUgbGlua2VyIHNjcmlwdCBhbHdheXMgY29tYmluZXMgLmdwdGFiLmRhdGEgYW5kCi0JICAgICAuZ3B0YWIuc2RhdGEgaW50byAuZ3B0YWIuc2RhdGEsIGFuZCBsaWtld2lzZSBmb3IKLQkgICAgIC5ncHRhYi5ic3MgYW5kIC5ncHRhYi5zYnNzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcwotCSAgICAgbm8gLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBpbiB3aGljaAotCSAgICAgY2FzZSB3ZSBtdXN0IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3VibmFtZSA9IG8tPm5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdWJuYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKG8gPT0gZ3B0YWJfZGF0YV9zZWMpCi0JCW8tPm5hbWUgPSAiLmdwdGFiLmRhdGEiOwotCSAgICAgIGVsc2UKLQkJby0+bmFtZSA9ICIuZ3B0YWIuYnNzIjsKLQkgICAgICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICAgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIFNldCB1cCB0aGUgZmlyc3QgZW50cnkuICAqLwotCSAgYyA9IDE7Ci0JICB0YWIgPSAoRWxmMzJfZ3B0YWIgKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoRWxmMzJfZ3B0YWIpKTsKLQkgIGlmICh0YWIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGFiWzBdLmd0X2hlYWRlci5ndF9jdXJyZW50X2dfdmFsdWUgPSBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X3VudXNlZCA9IDA7Ci0KLQkgIC8qIENvbWJpbmUgdGhlIGlucHV0IHNlY3Rpb25zLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGdwZW50cnk7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIENvbWJpbmUgdGhlIGdwdGFiIGVudHJpZXMgZm9yIHRoaXMgaW5wdXQgc2VjdGlvbiBvbmUKLQkJIGJ5IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgaW5wdXQgZ3B0YWIgZW50cmllcyBhcmUKLQkJIHNvcnRlZCBieSBhc2NlbmRpbmcgLUcgdmFsdWUuICAqLwotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoZ3BlbnRyeSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpOwotCQkgICBncGVudHJ5IDwgc2l6ZTsKLQkJICAgZ3BlbnRyeSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkKLQkJewotCQkgIEVsZjMyX0V4dGVybmFsX2dwdGFiIGV4dF9ncHRhYjsKLQkJICBFbGYzMl9ncHRhYiBpbnRfZ3B0YWI7Ci0JCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JCSAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0JCSAgYm9vbGVhbiBleGFjdDsKLQkJICB1bnNpZ25lZCBpbnQgbG9vazsKLQotCQkgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSAmZXh0X2dwdGFiLAotCQkJICBncGVudHJ5LCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkpKQotCQkgICAgewotCQkgICAgICBmcmVlICh0YWIpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luIChpbnB1dF9iZmQsICZleHRfZ3B0YWIsCi0JCQkJCQkmaW50X2dwdGFiKTsKLQkJICB2YWwgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfZ192YWx1ZTsKLQkJICBhZGQgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXMgLSBsYXN0OwotCi0JCSAgZXhhY3QgPSBmYWxzZTsKLQkJICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQotCQkgICAgewotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPj0gdmFsKQotCQkJdGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2J5dGVzICs9IGFkZDsKLQotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPT0gdmFsKQotCQkJZXhhY3QgPSB0cnVlOwotCQkgICAgfQotCi0JCSAgaWYgKCEgZXhhY3QpCi0JCSAgICB7Ci0JCSAgICAgIEVsZjMyX2dwdGFiICpuZXdfdGFiOwotCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4OwotCi0JCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgdGFibGUgZW50cnkuICAqLwotCQkgICAgICBuZXdfdGFiID0gKChFbGYzMl9ncHRhYiAqKQotCQkJCSBiZmRfcmVhbGxvYyAoKFBUUikgdGFiLAotCQkJCQkgICAgICAoYyArIDEpICogc2l6ZW9mIChFbGYzMl9ncHRhYikpKTsKLQkJICAgICAgaWYgKG5ld190YWIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgZnJlZSAodGFiKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICB0YWIgPSBuZXdfdGFiOwotCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9IHZhbDsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzID0gYWRkOwotCi0JCSAgICAgIC8qIE1lcmdlIGluIHRoZSBzaXplIGZvciB0aGUgbmV4dCBzbWFsbGVzdCAtRwotCQkJIHZhbHVlLCBzaW5jZSB0aGF0IHdpbGwgYmUgaW1wbGllZCBieSB0aGlzIG5ldwotCQkJIHZhbHVlLiAgKi8KLQkJICAgICAgbWF4ID0gMDsKLQkJICAgICAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJCXsKLQkJCSAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlIDwgdmFsCi0JCQkgICAgICAmJiAobWF4ID09IDAKLQkJCQkgIHx8ICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZQotCQkJCSAgICAgID4gdGFiW21heF0uZ3RfZW50cnkuZ3RfZ192YWx1ZSkpKQotCQkJICAgIG1heCA9IGxvb2s7Ci0JCQl9Ci0JCSAgICAgIGlmIChtYXggIT0gMCkKLQkJCXRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyArPQotCQkJICB0YWJbbWF4XS5ndF9lbnRyeS5ndF9ieXRlczsKLQotCQkgICAgICArK2M7Ci0JCSAgICB9Ci0KLQkJICBsYXN0ID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzOwotCQl9Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogVGhlIHRhYmxlIG11c3QgYmUgc29ydGVkIGJ5IC1HIHZhbHVlLiAgKi8KLQkgIGlmIChjID4gMikKLQkgICAgcXNvcnQgKHRhYiArIDEsIGMgLSAxLCBzaXplb2YgKHRhYlswXSksIGdwdGFiX2NvbXBhcmUpOwotCi0JICAvKiBTd2FwIG91dCB0aGUgdGFibGUuICAqLwotCSAgZXh0X3RhYiA9ICgoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikKLQkJICAgICBiZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkpOwotCSAgaWYgKGV4dF90YWIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHRhYik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0JICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0IChhYmZkLCB0YWIgKyBpLCBleHRfdGFiICsgaSk7Ci0JICBmcmVlICh0YWIpOwotCi0JICBvLT5fcmF3X3NpemUgPSBjICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0JICBvLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRfdGFiOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgaWYgKCEgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgY29tcHV0ZWQgc2VjdGlvbnMuICAqLwotCi0gIGlmIChyZWdpbmZvX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLQotICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgJnJlZ2luZm8sICZleHQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCByZWdpbmZvX3NlYywgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG1kZWJ1Z19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bik7Ci0gICAgICBpZiAoISBiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1ZywKLQkJCQkJICAgICAgIHN3YXAsIGluZm8sCi0JCQkJCSAgICAgICBtZGVidWdfc2VjLT5maWxlcG9zKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJmZF9lY29mZl9kZWJ1Z19mcmVlIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGluZm8pOwotICAgIH0KLQotICBpZiAoZ3B0YWJfZGF0YV9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBncHRhYl9kYXRhX3NlYywKLQkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGdwdGFiX2Jzc19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBncHRhYl9ic3Nfc2VjLAotCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQotICAgIHsKLSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLSAgICAgIGlmIChydHByb2Nfc2VjICE9IE5VTEwpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBydHByb2Nfc2VjLAotCQkJCQkgIHJ0cHJvY19zZWMtPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwKLQkJCQkJICBydHByb2Nfc2VjLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgTUlQUyBFTEYgSEkxNiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJlbGhpLCByZWxsbywgY29udGVudHMsIGFkZGVuZCkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxoaTsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGxvOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBiZmRfdm1hIGluc247Ci0gIGJmZF92bWEgYWRkbG87Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotCi0gIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGxvLT5yX29mZnNldCk7Ci0gIGFkZGxvICY9IDB4ZmZmZjsKLQotICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBhZGRsbzsKLQotICBpZiAoKGFkZGxvICYgMHg4MDAwKSAhPSAwKQotICAgIGFkZGVuZCAtPSAweDEwMDAwOwotICBpZiAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCkKLSAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgKGluc24gJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZiksCi0JICAgICAgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotfQotCi0vKiBIYW5kbGUgYSBNSVBTIEVMRiBsb2NhbCBHT1QxNiByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgc2dvdCwgcmVsaGksIHJlbGxvLAotCQkJICAgICBjb250ZW50cywgYWRkZW5kKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBhc3NpZ25lZF9nb3RubzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3ZtYSBhZGRsbzsKLSAgYmZkX3ZtYSBhZGRyZXNzOwotICBiZmRfdm1hIGhpcGFnZTsKLSAgYmZkX2J5dGUgKmdvdF9jb250ZW50czsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotCi0gIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGxvLT5yX29mZnNldCk7Ci0gIGFkZGxvICY9IDB4ZmZmZjsKLQotICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBhZGRsbzsKLQotICBpZiAoKGFkZGxvICYgMHg4MDAwKSAhPSAwKQotICAgIGFkZGVuZCAtPSAweDEwMDAwOwotICBpZiAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCkKLSAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQotICAvKiBHZXQgYSBnb3QgZW50cnkgcmVwcmVzZW50aW5nIHJlcXVlc3RlZCBoaXBhZ2UuICAqLwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgYXNzaWduZWRfZ290bm8gPSBnLT5hc3NpZ25lZF9nb3RubzsKLSAgZ290X2NvbnRlbnRzID0gc2dvdC0+Y29udGVudHM7Ci0gIGhpcGFnZSA9IGFkZGVuZCAmIDB4ZmZmZjAwMDA7Ci0KLSAgZm9yIChpID0gTUlQU19SRVNFUlZFRF9HT1ROTzsgaSA8IGFzc2lnbmVkX2dvdG5vOyBpKyspCi0gICAgewotICAgICAgYWRkcmVzcyA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZ290X2NvbnRlbnRzICsgaSAqIDQpOwotICAgICAgaWYgKGhpcGFnZSA9PSAoYWRkcmVzcyAmIDB4ZmZmZjAwMDApKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSA9PSBhc3NpZ25lZF9nb3RubykKLSAgICB7Ci0gICAgICBpZiAoYXNzaWduZWRfZ290bm8gPj0gZy0+bG9jYWxfZ290bm8pCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJtb3JlIGdvdCBlbnRyaWVzIGFyZSBuZWVkZWQgZm9yIGhpcGFnZSByZWxvY2F0aW9ucyIpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBoaXBhZ2UsIGdvdF9jb250ZW50cyArIGFzc2lnbmVkX2dvdG5vICogNCk7Ci0gICAgICArK2ctPmFzc2lnbmVkX2dvdG5vOwotICAgIH0KLQotICBpID0gLSBFTEZfTUlQU19HUF9PRkZTRVQgKG91dHB1dF9iZmQpICsgaSAqIDQ7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGluc24gJiAweGZmZmYwMDAwKSB8IChpICYgMHhmZmZmKSwKLQkgICAgICBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBNSVBTIEVMRiBDQUxMMTYgcmVsb2MgYW5kIGdsb2JhbCBHT1QxNiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZl9yZWxvY2F0ZV9nbG9iYWxfZ290IChpbnB1dF9iZmQsIHJlbCwgY29udGVudHMsIG9mZnNldCkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIGJmZF92bWEgaW5zbjsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgKGluc24gJiAweGZmZmYwMDAwKSB8IChvZmZzZXQgJiAweGZmZmYpLAotCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci19Ci0KLS8qIFJldHVybnMgdGhlIEdPVCBzZWN0aW9uIGZvciBBQkZELiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1pcHNfZWxmX2dvdF9zZWN0aW9uIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKTsKLX0KLQotLyogUmV0dXJucyB0aGUgR09UIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluayBpbmRpY2F0ZWQgYnkKLSAgIElORk8uICBJZiBTR09UUCBpcyBub24tTlVMTCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIEdPVCAKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfZ290X2luZm8gKgotbWlwc19lbGZfZ290X2luZm8gKGFiZmQsIHNnb3RwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICoqc2dvdHA7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBzZ290ID0gbWlwc19lbGZfZ290X3NlY3Rpb24gKGFiZmQpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgaWYgKHNnb3RwKQotICAgICpzZ290cCA9IHNnb3Q7Ci0gIHJldHVybiBnOwotfQotCi0vKiBTaWduLWV4dGVuZCBWQUxVRSwgd2hpY2ggaGFzIHRoZSBpbmRpY2F0ZWQgbnVtYmVyIG9mIEJJVFMuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfc2lnbl9leHRlbmQgKHZhbHVlLCBiaXRzKQotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBpbnQgYml0czsKLXsKLSAgaWYgKHZhbHVlICYgKDEgPDwgKGJpdHMgLSAxKSkpCi0gICAgLyogVkFMVUUgaXMgbmVnYXRpdmUuICAqLwotICAgIHZhbHVlIHw9ICgoYmZkX3ZtYSkgLSAxKSA8PCBiaXRzOyAgICAgIAotICAKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIGluZGljYXRlZCBWQUxVRSBoYXMgb3ZlcmZsb3dlZCB0aGUgbWF4aW11bQotICAgcmFuZ2UgZXhwcmVzc2FibGUgYnkgYSBzaWduZWQgbnVtYmVyIHdpdGggdGhlIGluZGljYXRlZCBudW1iZXIgb2YKLSAgIEJJVFMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIGJpdHMpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotewotICBiZmRfc2lnbmVkX3ZtYSBzdmFsdWUgPSAoYmZkX3NpZ25lZF92bWEpIHZhbHVlOwotCi0gIGlmIChzdmFsdWUgPiAoMSA8PCAoYml0cyAtIDEpKSAtIDEpCi0gICAgLyogVGhlIHZhbHVlIGlzIHRvbyBiaWcuICAqLwotICAgIHJldHVybiB0cnVlOwotICBlbHNlIGlmIChzdmFsdWUgPCAtKDEgPDwgKGJpdHMgLSAxKSkpCi0gICAgLyogVGhlIHZhbHVlIGlzIHRvbyBzbWFsbC4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gIC8qIEFsbCBpcyB3ZWxsLiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlICVoaWdoIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2hpZ2ggKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlOwotewotICByZXR1cm4gKCh2YWx1ZSArIChiZmRfdm1hKSAweDgwMDApID4+IDE2KSAmIDB4ZmZmZjsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSAlaGlnaGVyIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2hpZ2hlciAodmFsdWUpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0jaWZkZWYgQkZENjQKLSAgcmV0dXJuICgodmFsdWUgKyAoYmZkX3ZtYSkgMHg4MDAwODAwMCkgPj4gMzIpICYgMHhmZmZmOwotI2Vsc2UKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAoYmZkX3ZtYSkgLTE7Ci0jZW5kaWYKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSAlaGlnaGVzdCBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfdm1hIAotbWlwc19lbGZfaGlnaGVzdCAodmFsdWUpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0jaWZkZWYgQkZENjQKLSAgcmV0dXJuICgodmFsdWUgKyAoYmZkX3ZtYSkgMHg4MDAwODAwMDgwMDApID4gNDgpICYgMHhmZmZmOwotI2Vsc2UKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAoYmZkX3ZtYSkgLTE7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJucyB0aGUgR09UIGluZGV4IGZvciB0aGUgZ2xvYmFsIHN5bWJvbCBpbmRpY2F0ZWQgYnkgSC4gICovCi0KLXN0YXRpYyBiZmRfdm1hIAotbWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleCAoYWJmZCwgaCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkX3ZtYSBpbmRleDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoYWJmZCwgJnNnb3QpOwotCi0gIC8qIE9uY2Ugd2UgZGV0ZXJtaW5lIHRoZSBnbG9iYWwgR09UIGVudHJ5IHdpdGggdGhlIGxvd2VzdCBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZSBpbmRleCwgd2UgbXVzdCBwdXQgYWxsIGR5bmFtaWMgc3ltYm9scyB3aXRoIGdyZWF0ZXIKLSAgICAgaW5kaWNlcyBpbnRvIHRoZSBHT1QuICBUaGF0IG1ha2VzIGl0IGVhc3kgdG8gY2FsY3VsYXRlIHRoZSBHT1QKLSAgICAgb2Zmc2V0LiAgKi8KLSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCA+PSBnLT5nbG9iYWxfZ290c3ltLT5keW5pbmR4KTsKLSAgaW5kZXggPSAoaC0+ZHluaW5keCAtIGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHggKyBnLT5sb2NhbF9nb3RubykgKiA0OwotICBCRkRfQVNTRVJUIChpbmRleCA8IHNnb3QtPl9yYXdfc2l6ZSk7Ci0KLSAgcmV0dXJuIGluZGV4OwotfQotCi0vKiBSZXR1cm5zIHRoZSBvZmZzZXQgZm9yIHRoZSBlbnRyeSBhdCB0aGUgSU5ERVh0aCBwb3NpdGlvbgotICAgaW4gdGhlIEdPVC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGR5bm9iaiwgb3V0cHV0X2JmZCwgaW5kZXgpCi0gICAgIGJmZCAqZHlub2JqOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgaW5kZXg7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBiZmRfdm1hIGdwOwotICBjaGFyICplcnJvcl9tZXNzYWdlOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIGluZGV4IC0gCi0JICBncCk7Ci19Ci0KLS8qIElmIEggaXMgYSBzeW1ib2wgdGhhdCBuZWVkcyBhIGdsb2JhbCBHT1QgZW50cnksIGJ1dCBoYXMgYSBkeW5hbWljCi0gICBzeW1ib2wgdGFibGUgaW5kZXggbG93ZXIgdGhhbiBhbnkgd2UndmUgc2VlbiB0byBkYXRlLCByZWNvcmQgaXQgZm9yCi0gICBwb3N0ZXJpdHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sIChoLCBpbmZvLCBnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotewotICAvKiBBIGdsb2JhbCBzeW1ib2wgaW4gdGhlIEdPVCBtdXN0IGFsc28gYmUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sCi0gICAgIHRhYmxlLiAgKi8KLSAgaWYgKGgtPmR5bmluZHggPT0gLTEKLSAgICAgICYmICFiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgbWFya2VkIHRoaXMgZW50cnkgYXMgbmVlZCBHT1Qgc3BhY2UsIHdlIGRvbid0Ci0gICAgIG5lZWQgdG8gZG8gaXQgYWdhaW4uICAqLwotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLSAxKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEJ5IHNldHRpbmcgdGhpcyB0byBhIHZhbHVlIG90aGVyIHRoYW4gLTEsIHdlIGFyZSBpbmRpY2F0aW5nIHRoYXQKLSAgICAgdGhlcmUgbmVlZHMgdG8gYmUgYSBHT1QgZW50cnkgZm9yIEguICAqLwotICBoLT5nb3Qub2Zmc2V0ID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIHRvIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZV9mIHdoZW4gc29ydGluZwotICAgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0gICAgIAotc3RydWN0IG1pcHNfZWxmX2hhc2hfc29ydF9kYXRhCi17Ci0gIC8qIFRoZSBzeW1ib2wgaW4gdGhlIGdsb2JhbCBHT1Qgd2l0aCB0aGUgbG93ZXN0IGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0gICAgIGluZGV4LiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmxvdzsKLSAgLyogVGhlIGxlYXN0IGR5bmFtaWMgc3ltYm9sIHRhYmxlIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gYSBzeW1ib2wKLSAgICAgd2l0aCBhIEdPVCBlbnRyeS4gICovCi0gIGxvbmcgbWluX2dvdF9keW5pbmR4OwotICAvKiBUaGUgZ3JlYXRlc3QgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggbm90IGNvcnJlc3BvbmRpbmcgdG8gYQotICAgICBzeW1ib2wgd2l0aG91dCBhIEdPVCBlbnRyeS4gICovCi0gIGxvbmcgbWF4X25vbl9nb3RfZHluaW5keDsKLX07Ci0KLS8qIElmIEggbmVlZHMgYSBHT1QgZW50cnksIGFzc2lnbiBpdCB0aGUgaGlnaGVzdCBhdmFpbGFibGUgZHluYW1pYwotICAgaW5kZXguICBPdGhlcndpc2UsIGFzc2lnbiBpdCB0aGUgbG93ZXN0IGF2YWlsYWJsZSBkeW5hbWljIAotICAgaW5kZXguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2YgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgbWlwc19lbGZfaGFzaF9zb3J0X2RhdGEgKmhzZCAKLSAgICA9IChzdHJ1Y3QgbWlwc19lbGZfaGFzaF9zb3J0X2RhdGEgKikgZGF0YTsKLQotICAvKiBTeW1ib2xzIHdpdGhvdXQgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcyBhcmVuJ3QgaW50ZXJlc3RpbmcKLSAgICAgYXQgYWxsLiAgKi8KLSAgaWYgKGgtPnJvb3QuZHluaW5keCA9PSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+cm9vdC5nb3Qub2Zmc2V0ICE9IDApCi0gICAgaC0+cm9vdC5keW5pbmR4ID0gaHNkLT5tYXhfbm9uX2dvdF9keW5pbmR4Kys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoLT5yb290LmR5bmluZHggPSAtLWhzZC0+bWluX2dvdF9keW5pbmR4OwotICAgICAgaHNkLT5sb3cgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNvcnQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHNvIHRoYXQgc3ltYm9scyB0aGF0IG5lZWQgR09UIGVudHJpZXMKLSAgIGFwcGVhciB0b3dhcmRzIHRoZSBlbmQuICBUaGlzIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBHT1Qgc3BhY2UKLSAgIHJlcXVpcmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSAoaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9oYXNoX3NvcnRfZGF0YSBoc2Q7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBoc2QubG93ID0gTlVMTDsKLSAgaHNkLm1pbl9nb3RfZHluaW5keCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gIGhzZC5tYXhfbm9uX2dvdF9keW5pbmR4ID0gMTsKLSAgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlICgoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikgCi0JCQkJZWxmX2hhc2hfdGFibGUgKGluZm8pKSwgCi0JCQkgICAgICAgbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2YsIAotCQkJICAgICAgICZoc2QpOwotCi0gIC8qIFRoZXJlIHNob3VkIGhhdmUgYmVlbiBlbm91Z2ggcm9vbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHRvCi0gICAgIGFjY29tb2RhdGUgYm90aCB0aGUgR09UIGFuZCBub24tR09UIHN5bWJvbHMuICAqLwotICBCRkRfQVNTRVJUIChoc2QubWluX2dvdF9keW5pbmR4ID09IGhzZC5tYXhfbm9uX2dvdF9keW5pbmR4KTsKLQotICAvKiBOb3cgd2Uga25vdyB3aGljaCBkeW5hbWljIHN5bWJvbCBoYXMgdGhlIGxvd2VzdCBkeW5hbWljIHN5bWJvbAotICAgICB0YWJsZSBpbmRleCBpbiB0aGUgR09ULiAgKi8KLSAgZyA9IG1pcHNfZWxmX2dvdF9pbmZvIChkeW5vYmosIE5VTEwpOwotICBnLT5nbG9iYWxfZ290c3ltID0gaHNkLmxvdzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgbG9jYWwgR09UIGVudHJ5IGZvciBWQUxVRS4gIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGVudHJ5LAotICAgb3IgLTEgaWYgaXQgY291bGQgbm90IGJlIGNyZWF0ZWQuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSAoYWJmZCwgZywgc2dvdCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gICAgIGFzZWN0aW9uICpzZ290OwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAoZy0+YXNzaWduZWRfZ290bm8gPj0gZy0+bG9jYWxfZ290bm8pCi0gICAgewotICAgICAgLyogV2UgZGlkbid0IGFsbG9jYXRlIGVub3VnaCBzcGFjZSBpbiB0aGUgR09ULiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCJub3QgZW5vdWdoIEdPVCBzcGFjZSBmb3IgbG9jYWwgR09UIGVudHJpZXMiKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgLTE7Ci0gICAgfQotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBzZ290LT5jb250ZW50cyArIDQgKiBnLT5hc3NpZ25lZF9nb3Rubyk7Ci0gIHJldHVybiA0ICogZy0+YXNzaWduZWRfZ290bm8rKzsKLX0KLQotLyogUmV0dXJucyB0aGUgR09UIG9mZnNldCBhdCB3aGljaCB0aGUgaW5kaWNhdGVkIGFkZHJlc3MgY2FuIGJlIGZvdW5kLgotICAgSWYgdGhlcmUgaXMgbm90IHlldCBhIEdPVCBlbnRyeSBmb3IgdGhpcyB2YWx1ZSwgY3JlYXRlIG9uZS4gIFJldHVybnMKLSAgIC0xIGlmIG5vIHNhdGlzZmFjdG9yeSBHT1Qgb2Zmc2V0IGNhbiBiZSBmb3VuZC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9sb2NhbF9nb3RfaW5kZXggKGFiZmQsIGluZm8sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZF9ieXRlICplbnRyeTsKLQotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAmc2dvdCk7Ci0KLSAgLyogTG9vayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGFwcHJvcHJpYXRlIGVudHJ5LiAgKi8KLSAgZm9yIChlbnRyeSA9IHNnb3QtPmNvbnRlbnRzICsgNCAqIE1JUFNfUkVTRVJWRURfR09UTk87IAotICAgICAgIGVudHJ5ICE9IHNnb3QtPmNvbnRlbnRzICsgNCAqIGctPmFzc2lnbmVkX2dvdG5vOwotICAgICAgIGVudHJ5ICs9IDQpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyZXNzID0gYmZkX2dldF8zMiAoYWJmZCwgZW50cnkpOwotCi0gICAgICBpZiAoYWRkcmVzcyA9PSB2YWx1ZSkKLQlyZXR1cm4gZW50cnkgLSBzZ290LT5jb250ZW50czsKLSAgICB9Ci0KLSAgcmV0dXJuIG1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkgKGFiZmQsIGcsIHNnb3QsIHZhbHVlKTsKLX0KLQotLyogRmluZCBhIEdPVCBlbnRyeSB0aGF0IGlzIHdpdGhpbiAzMktCIG9mIHRoZSBWQUxVRS4gIFRoZXNlIGVudHJpZXMKLSAgIGFyZSBzdXBwb3NlZCB0byBiZSBwbGFjZWQgYXQgc21hbGwgb2Zmc2V0cyBpbiB0aGUgR09ULCBpLmUuLAotICAgd2l0aGluIDMyS0Igb2YgR1AuICBSZXR1cm4gdGhlIGluZGV4IGludG8gdGhlIEdPVCBmb3IgdGhpcyBwYWdlLAotICAgYW5kIHN0b3JlIHRoZSBvZmZzZXQgZnJvbSB0aGlzIGVudHJ5IHRvIHRoZSBkZXNpcmVkIGFkZHJlc3MgaW4KLSAgIE9GRlNFVFAsIGlmIGl0IGlzIG5vbi1OVUxMLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2dvdF9wYWdlIChhYmZkLCBpbmZvLCB2YWx1ZSwgb2Zmc2V0cCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSAqb2Zmc2V0cDsKLXsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICBiZmRfYnl0ZSAqZW50cnk7Ci0gIGJmZF9ieXRlICpsYXN0X2VudHJ5OwotICBiZmRfdm1hIGluZGV4OwotICBiZmRfdm1hIGFkZHJlc3M7Ci0KLSAgZyA9IG1pcHNfZWxmX2dvdF9pbmZvIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgJnNnb3QpOwotCi0gIC8qIExvb2sgdG8gc2VlIGlmIHdlIGFsZWFkeSBoYXZlIGFuIGFwcHJvcHJpYXRlIGVudHJ5LiAgKi8KLSAgbGFzdF9lbnRyeSA9IHNnb3QtPmNvbnRlbnRzICsgNCAqIGctPmFzc2lnbmVkX2dvdG5vOwotICBmb3IgKGVudHJ5ID0gc2dvdC0+Y29udGVudHMgKyA0ICogTUlQU19SRVNFUlZFRF9HT1ROTzsgCi0gICAgICAgZW50cnkgIT0gbGFzdF9lbnRyeTsKLSAgICAgICBlbnRyeSArPSA0KQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBiZmRfZ2V0XzMyIChhYmZkLCBlbnRyeSk7Ci0gICAgICBpZiAoIW1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlIC0gYWRkcmVzcywgMTYpKQotCXsKLQkgIC8qIFRoaXMgZW50cnkgd2lsbCBzZXJ2ZSBhcyB0aGUgcGFnZSBwb2ludGVyLiAgV2UgY2FuIGFkZCBhCi0JICAgICAxNi1iaXQgbnVtYmVyIHRvIGl0IHRvIGdldCB0aGUgYWN0dWFsIGFkZHJlc3MuICAqLwotCSAgaW5kZXggPSBlbnRyeSAtIHNnb3QtPmNvbnRlbnRzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSBlbnRyeSwgd2UgY3JlYXRlIG9uZSBub3cuICAqLwotICBpZiAoZW50cnkgPT0gbGFzdF9lbnRyeSkKLSAgICBpbmRleCA9IG1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkgKGFiZmQsIGcsIHNnb3QsIHZhbHVlKTsKLQotICBpZiAob2Zmc2V0cCkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gYmZkX2dldF8zMiAoYWJmZCwgZW50cnkpOwotICAgICAgKm9mZnNldHAgPSB2YWx1ZSAtIGFkZHJlc3M7Ci0gICAgfQotCi0gIHJldHVybiBpbmRleDsKLX0KLQotLyogRmluZCBhIEdPVCBlbnRyeSB3aG9zZSBoaWdoZXItb3JkZXIgMTYgYml0cyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UKLSAgIGZvciB2YWx1ZS4gIFJldHVybiB0aGUgaW5kZXggaW50byB0aGUgR09UIGZvciB0aGlzIGVudHJ5LiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2dvdDE2X2VudHJ5IChhYmZkLCBpbmZvLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICBiZmRfYnl0ZSAqZW50cnk7Ci0gIGJmZF9ieXRlICpsYXN0X2VudHJ5OwotICBiZmRfdm1hIGluZGV4OwotICBiZmRfdm1hIGFkZHJlc3M7Ci0KLSAgdmFsdWUgJj0gMHhmZmZmMDAwMDsKLSAgZyA9IG1pcHNfZWxmX2dvdF9pbmZvIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgJnNnb3QpOwotCi0gIC8qIExvb2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBhcHByb3ByaWF0ZSBlbnRyeS4gICovCi0gIGxhc3RfZW50cnkgPSBzZ290LT5jb250ZW50cyArIDQgKiBnLT5hc3NpZ25lZF9nb3RubzsKLSAgZm9yIChlbnRyeSA9IHNnb3QtPmNvbnRlbnRzICsgNCAqIE1JUFNfUkVTRVJWRURfR09UTk87IAotICAgICAgIGVudHJ5ICE9IGxhc3RfZW50cnk7Ci0gICAgICAgZW50cnkgKz0gNCkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gYmZkX2dldF8zMiAoYWJmZCwgZW50cnkpOwotICAgICAgaWYgKGFkZHJlc3MgJiAweGZmZmYwMDAwID09IHZhbHVlKQotCXsKLQkgIC8qIFRoaXMgZW50cnkgaGFzIHRoZSByaWdodCBoaWdoLW9yZGVyIDE2IGJpdHMuICAqLwotCSAgaW5kZXggPSA0ICogKGVudHJ5IC0gc2dvdC0+Y29udGVudHMpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSBlbnRyeSwgd2UgY3JlYXRlIG9uZSBub3cuICAqLwotICBpZiAoZW50cnkgPT0gbGFzdF9lbnRyeSkKLSAgICBpbmRleCA9IG1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkgKGFiZmQsIGcsIHNnb3QsIHZhbHVlKTsKLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFNldHMgKkFEREVORFAgdG8gdGhlIGFkZGVuZCBmb3IgdGhlIGZpcnN0IFJfTUlQU19MTzE2IHJlbG9jYXRpb24KLSAgIGZvdW5kLCBiZWdpbm5pbmcgd2l0aCBSRUxPQ0FUSU9OLiAgUkVMRU5EIGlzIG9uZS1wYXN0LXRoZS1lbmQgb2YKLSAgIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQgKHJlbG9jYXRpb24sIHJlbGVuZCwgYWRkZW5kcCkKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIC8qIEFjY29yZGluZyB0byB0aGUgTUlQUyBFTEYgQUJJLCB0aGUgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbiBtdXN0IGJlCi0gICAgIGltbWVkaWF0ZWx5IGZvbGxvd2luZy4gIEhvd2V2ZXIsIGZvciB0aGUgSVJJWDYgQUJJLCB0aGUgbmV4dAotICAgICByZWxvY2F0aW9uIG1heSBiZSBhIGNvbXBvc2VkIHJlbG9jYXRpb24gY29uc2lzdGluZyBvZiBzZXZlcmFsCi0gICAgIHJlbG9jYXRpb25zIGZvciB0aGUgc2FtZSBhZGRyZXNzLiAgSW4gdGhhdCBjYXNlLCB0aGUgUl9NSVBTX0xPMTYKLSAgICAgcmVsbyFzY2F0aW9uIG1heSBvY2N1ciBhcyBvbmUgb2YgdGhlc2UuICBXZSBwZXJtaXQgYSBzaW1pbGFyCi0gICAgIGV4dGVuc2lvbiBpbiBnZW5lcmFsLCBhcyB0aGF0IGlzIHVzZWZ1bCBmb3IgR0NDLiAgKi8KLSAgd2hpbGUgKHJlbG9jYXRpb24gPCByZWxlbmQpCi0gICAgewotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKSA9PSBSX01JUFNfTE8xNikKLQl7Ci0JICAqYWRkZW5kcCA9IHJlbG9jYXRpb24tPnJfYWRkZW5kOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICArK3JlbG9jYXRpb247Ci0gICAgfQotCi0gIC8qIFdlIGRpZG4ndCBmaW5kIGl0LiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDcmVhdGUgYSByZWwuZHluIHJlbG9jYXRpb24gZm9yIHRoZSBkeW5hbWljIGxpbmtlciB0byByZXNvbHZlLiAgVGhlCi0gICByZWxvY2F0aW4gaXMgYWdhaW5zdCB0aGUgc3ltYm9sIHdpdGggdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGluZGV4Ci0gICBEWU5JTkRYLiAgUkVMIGlzIHRoZSBvcmlnaW5hbCByZWxvY2F0aW9uLCB3aGljaCBpcyBub3cgYmVpbmcgbWFkZQotICAgZHluYW1pYy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLW1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24gKG91dHB1dF9iZmQsIGluZm8sIHJlbCwgZHluaW5keCwKLQkJCQkgICAgYWRkZW5kLCBpbnB1dF9zZWN0aW9uKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBsb25nIGR5bmluZHg7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLXsKLSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0gIGJvb2xlYW4gc2tpcDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgYmZkICpkeW5vYmo7Ci0gIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5keW4iKTsKLSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCi0gIHNraXAgPSBmYWxzZTsKLQotICAvKiBUaGUgc3ltYm9sIGZvciB0aGUgcmVsb2NhdGlvbiBpcyB0aGUgc2FtZSBhcyBpdCB3YXMgZm9yIHRoZQotICAgICBvcmlnaW5hbCByZWxvY2F0aW9uLiAgKi8KLSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoZHluaW5keCwgUl9NSVBTX1JFTDMyKTsKLQotICAvKiBUaGUgb2Zmc2V0IGZvciB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUKLSAgICAgb3JpZ2luYWwgcmVsb2NhdGlvbiwgYWRqdXN0ZWQgYnkgdGhlIG9mZnNldCBhdCB3aGljaCB0aGUgb3JpZ2luYWwKLSAgICAgc2VjdGlvbiBpcyBvdXRwdXQuICAqLwotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotICAgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfdm1hIG9mZjsKLQotICAgICAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCSAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkgICAgICBpbnB1dF9zZWN0aW9uLAotCSAgICAgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCSAgICAgIHJlbC0+cl9vZmZzZXQpKTsKLSAgICAgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCXNraXAgPSB0cnVlOwotICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotICAgIH0KLSAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgLyogSWYgd2UndmUgZGVjaWRlZCB0byBza2lwIHRoaXMgcmVsb2NhdGlvbiwganVzdCBvdXRwdXQgYW4gZW10cHkKLSAgICAgcmVjb3JkLiAgKi8KLSAgaWYgKHNraXApCi0gICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2YgKG91dHJlbCkpOwotCi0gIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCSAgICAoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKLQkJCSAgICAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkgICAgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBvdXRwdXQgc2VjdGlvbiBpcyB3cml0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlcgotICAgICB3aWxsIGJlIHdyaXRpbmcgdG8gaXQuICAqLwotICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2ZsYWdzCi0gICAgfD0gU0hGX1dSSVRFOwotCi0gIC8qIE9uIElSSVg1LCBtYWtlIGFuIGVudHJ5IG9mIGNvbXBhY3QgcmVsb2NhdGlvbiBpbmZvLiAgKi8KLSAgaWYgKCEgc2tpcCAmJiBJUklYX0NPTVBBVCAob3V0cHV0X2JmZCkgPT0gaWN0X2lyaXg1KQotICAgIHsKLSAgICAgIGFzZWN0aW9uKiBzY3B0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb21wYWN0X3JlbCIpOwotICAgICAgYmZkX2J5dGUgKmNyOwotCi0gICAgICBpZiAoc2NwdCkKLQl7Ci0JICBFbGYzMl9jcmluZm8gY3B0cmVsOwotCi0JICBtaXBzX2VsZl9zZXRfY3JfZm9ybWF0IChjcHRyZWwsIENSRl9NSVBTX0xPTkcpOwotCSAgY3B0cmVsLnZhZGRyID0gKHJlbC0+cl9vZmZzZXQKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICBpZiAocl90eXBlID09IFJfTUlQU19SRUwzMikKLQkgICAgbWlwc19lbGZfc2V0X2NyX3R5cGUgKGNwdHJlbCwgQ1JUX01JUFNfUkVMMzIpOwotCSAgZWxzZQotCSAgICBtaXBzX2VsZl9zZXRfY3JfdHlwZSAoY3B0cmVsLCBDUlRfTUlQU19XT1JEKTsKLQkgIG1pcHNfZWxmX3NldF9jcl9kaXN0MnRvIChjcHRyZWwsIDApOwotCSAgY3B0cmVsLmtvbnN0ID0gYWRkZW5kOwotCi0JICBjciA9IChzY3B0LT5jb250ZW50cwotCQkrIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpKTsKLQkgIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKG91dHB1dF9iZmQsICZjcHRyZWwsCi0JCQkJICAgICAoKEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSBjcgotCQkJCSAgICAgICsgc2NwdC0+cmVsb2NfY291bnQpKTsKLQkgICsrc2NwdC0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gc3JlbG9jLT5yZWxvY19jb3VudCAtIDE7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgdmFsdWUgcHJvZHVjZWQgYnkgdGhlIFJFTE9DQVRJT04gKHdoaWNoIGNvbWVzIGZyb20KLSAgIHRoZSBJTlBVVF9CRkQpLiAgVGhlIEFEREVORCBpcyB0aGUgYWRkZW5kIHRvIHVzZSBmb3IgdGhpcwotICAgUkVMT0NBVElPTjsgUkVMT0NBVElPTi0+Ul9BRERFTkQgaXMgaWdub3JlZC4KLQotICAgVGhlIHJlc3VsdCBvZiB0aGUgcmVsb2NhdGlvbiBjYWxjdWxhdGlvbiBpcyBzdG9yZWQgaW4gVkFMVUVQLgotCi0gICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYmZkX3JlbG9jX2NvbnRpbnVlIGlmIHRoZSBjYWxsZXIgbmVlZCB0YWtlIG5vCi0gICBmdXJ0aGVyIGFjdGlvbiByZWdhcmRpbmcgdGhpcyByZWxvY2F0aW9uLCBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkIGlmCi0gICBzb21ldGhpbmcgZ29lcyBkcmFtYXRpY2FsbHkgd3JvbmcsIGJmZF9yZWxvY19vdmVyZmxvdyBpZiBhbgotICAgb3ZlcmZsb3cgb2NjdXJzLCBhbmQgYmZkX3JlbG9jX29rIHRvIGluZGljYXRlIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbiAoYWJmZCwgCi0JCQkgICAgICAgaW5wdXRfYmZkLAotCQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICAgaW5mbywKLQkJCSAgICAgICByZWxvY2F0aW9uLAotCQkJICAgICAgIGFkZGVuZCwKLQkJCSAgICAgICBob3d0bywKLQkJCSAgICAgICByZWxlbmQsCi0JCQkgICAgICAgbG9jYWxfc3ltcywKLQkJCSAgICAgICBsb2NhbF9zZWN0aW9ucywKLQkJCSAgICAgICB2YWx1ZXAsCi0JCQkgICAgICAgbmFtZXApIAotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY2F0aW9uOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci0gICAgIGJmZF92bWEgKnZhbHVlcDsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotewotICAvKiBUaGUgZXZlbnR1YWwgdmFsdWUgd2Ugd2lsbCByZXR1cm4uICAqLwotICBiZmRfdm1hIHZhbHVlOwotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFnYWluc3Qgd2hpY2ggdGhlIHJlbG9jYXRpb24gaXMKLSAgICAgb2NjdXJyaW5nLiAgKi8KLSAgYmZkX3ZtYSBzeW1ib2wgPSAwOwotICAvKiBUaGUgZmluYWwgR1AgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIHJlbG9jYXRhYmxlLCBleGVjdXRhYmxlLCBvcgotICAgICBzaGFyZWQgb2JqZWN0IGZpbGUgYmVpbmcgcHJvZHVjZWQuICAqLwotICBiZmRfdm1hIGdwID0gKGJmZF92bWEpIC0gMTsKLSAgLyogVGhlIHBsYWNlIChzZWN0aW9uIG9mZnNldCBvciBhZGRyZXNzKSBvZiB0aGUgc3RvcmFnZSB1bml0IGJlaW5nCi0gICAgIHJlbG9jYXRlZC4gICovCi0gIGJmZF92bWEgcDsKLSAgLyogVGhlIHZhbHVlIG9mIEdQIHVzZWQgdG8gY3JlYXRlIHRoZSByZWxvY2F0YWJsZSBvYmplY3QuICAqLwotICBiZmRfdm1hIGdwMCA9IChiZmRfdm1hKSAtIDE7Ci0gIC8qIFRoZSBvZmZzZXQgaW50byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBhdCB3aGljaCB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgcmVsb2NhdGlvbiBlbnRyeSBzeW1ib2wsIGFkanVzdGVkIGJ5IHRoZSBhZGRlbmQsIHJlc2lkZXMKLSAgICAgZHVyaW5nIGV4ZWN1dGlvbi4gICovCi0gIGJmZF92bWEgZyA9IChiZmRfdm1hKSAtIDE7Ci0gIC8qIFRoZSBzZWN0aW9uIGluIHdoaWNoIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBieSB0aGUgcmVsb2NhdGlvbiBpcwotICAgICBsb2NhdGVkLiAgKi8KLSAgYXNlY3Rpb24gKnNlYyA9IE5VTEw7Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkqIGggPSBOVUxMOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBib29sZWFuIGxvY2FsX3A7Ci0gIGJvb2xlYW4gZ3BfZGlzcF9wID0gZmFsc2U7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzaXplX3QgZXh0c3ltb2ZmOwotICBpbnQgcl90eXBlOwotICBib29sZWFuIG92ZXJmbG93ZWRfcDsKLQotICAvKiBQYXJzZSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbG9jYXRpb24tPnJfaW5mbyk7Ci0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLSAgcCA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hIAotICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICsgcmVsb2NhdGlvbi0+cl9vZmZzZXQpOwotCi0gIC8qIEFzc3VtZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gb3ZlcmZsb3cuICAqLwotICBvdmVyZmxvd2VkX3AgPSBmYWxzZTsKLQotICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgaXMgbG9jYWwuICAqLwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgaWYgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgdGFibGUgZG9lcyBub3QgZm9sbG93IHRoZSBydWxlIHRoYXQgbG9jYWwgc3ltYm9scwotCSBtdXN0IGNvbWUgYmVmb3JlIGdsb2JhbHMuICAqLwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICAgIGxvY2FsX3AgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0gIT0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRzeW1vZmYgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgbG9jYWxfcCA9IHJfc3ltbmR4IDwgZXh0c3ltb2ZmOwotICAgIH0KLSAgICAgIAotICAvKiBGaWd1cmUgb3V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgaWYgKGxvY2FsX3ApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotCi0gICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0gICAgICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0KLSAgICAgIHN5bWJvbCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKLQlzeW1ib2wgKz0gc3ltLT5zdF92YWx1ZTsKLQotICAgICAgLyogTUlQUzE2IHRleHQgbGFiZWxzIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9kZC4gICovCi0gICAgICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KQotCSsrc3ltYm9sOwotCi0gICAgICAvKiBSZWNvcmQgdGhlIG5hbWUgb2YgdGhpcyBzeW1ib2wsIGZvciBvdXIgY2FsbGVyLiAgKi8KLSAgICAgICpuYW1lcCA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQlzeW0tPnN0X25hbWUpOwotICAgICAgaWYgKCpuYW1lcCA9ICdcMCcpCi0JKm5hbWVwID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBnbG9iYWwgc3ltYm9scyB3ZSBsb29rIHVwIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2gtdGFibGUuICAqLwotICAgICAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAKLQkgICBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKSBbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKLSAgICAgIC8qIEZpbmQgdGhlIHJlYWwgaGFzaC10YWJsZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnJvb3QudS5pLmxpbms7Ci0gICAgICAKLSAgICAgIC8qIFJlY29yZCB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbCwgZm9yIG91ciBjYWxsZXIuICAqLwotICAgICAgKm5hbWVwID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBpcyB0aGUgc3BlY2lhbCBfZ3BfZGlzcCBzeW1ib2wuICBOb3RlIHRoYXQgc3VjaCBhCi0JIHN5bWJvbCBtdXN0IGFsd2F5cyBiZSBhIGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCAiX2dwX2Rpc3AiKSA9PSAwKQotCXsKLQkgIC8qIFJlbG9jYXRpb25zIGFnYWluc3QgX2dwX2Rpc3AgYXJlIHBlcm1pdHRlZCBvbmx5IHdpdGgKLQkgICAgIFJfTUlQU19ISTE2IGFuZCBSX01JUFNfTE8xNiByZWxvY2F0aW9ucy4gICovCi0JICBpZiAocl90eXBlICE9IFJfTUlQU19ISTE2ICYmIHJfdHlwZSAhPSBSX01JUFNfTE8xNikKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLQkgIGdwX2Rpc3BfcCA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkLCBjYWxjdWxhdGUgaXRzIGFkZHJlc3MuICAqLwotICAgICAgaWYgKChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikKLQl7Ci0JICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uKQotCSAgICBzeW1ib2wgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlIAotCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICBlbHNlCi0JICAgIHN5bWJvbCA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jYXRpb24tPnJfb2Zmc2V0KTsKLQkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRldGVybWluZWQgdGhlIEdPVCBvZmZzZXQsIG9yIHRoZSBHUCB2YWx1ZSwKLSAgICAgYW5kIHdlJ3JlIGdvaW5nIHRvIG5lZWQgaXQsIGdldCBpdCBub3cuICAqLwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgIGNhc2UgUl9NSVBTX0dPVF9ESVNQOgotICAgIGNhc2UgUl9NSVBTX0dPVF9ISTE2OgotICAgIGNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLSAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLSAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0gICAgICAvKiBGaW5kIHRoZSBpbmRleCBpbnRvIHRoZSBHT1Qgd2hlcmUgdGhpcyB2YWx1ZSBpcyBsb2NhdGVkLiAgKi8KLSAgICAgIGlmIChoKQotCXsKLQkgIEJGRF9BU1NFUlQgKGFkZGVuZCA9PSAwKTsKLQkgIGcgPSBtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4IAotCSAgICAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JICAgICAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkqKSBoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZyA9IG1pcHNfZWxmX2xvY2FsX2dvdF9pbmRleCAoYWJmZCwgaW5mbywgc3ltYm9sICsgYWRkZW5kKTsKLQkgIGlmIChnID09IChiZmRfdm1hKSAtMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogQ29udmVydCBHT1QgaW5kaWNlcyB0byBhY3R1YWwgb2Zmc2V0cy4gICovCi0gICAgICBnID0gbWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICBhYmZkLCBnKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX01JUFNfSEkxNjoKLSAgICBjYXNlIFJfTUlQU19MTzE2OgotICAgIGNhc2UgUl9NSVBTX0dQUkVMMTY6Ci0gICAgY2FzZSBSX01JUFNfR1BSRUwzMjoKLSAgICAgIGdwMCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChpbnB1dF9iZmQpOwotICAgICAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoYWJmZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGF0IGtpbmQgb2YgcmVsb2NhdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQuICAqLwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01JUFNfTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgICBjYXNlIFJfTUlQU18xNjoKLSAgICAgIHZhbHVlID0gc3ltYm9sICsgbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCwgMTYpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfMzI6Ci0gICAgY2FzZSBSX01JUFNfUkVMMzI6Ci0gICAgICAvKiBJZiB3ZSdyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBvciB0aGlzIHJlbG9jYXRpb24gaXMKLQkgYWdhaW5zdCBhIHN5bWJvbCBpbiBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHdlIGNhbid0IGtub3cKLQkgd2hlcmUgdGhlIHN5bWJvbCB3aWxsIGVuZCB1cC4gIFNvLCB3ZSBjcmVhdGUgYSByZWxvY2F0aW9uCi0JIHJlY29yZCBpbiB0aGUgb3V0cHV0LCBhbmQgbGVhdmUgdGhlIGpvYiB1cCB0byB0aGUgZHluYW1pYwotCSBsaW5rZXIuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZCB8fCAhc2VjLT5vdXRwdXRfc2VjdGlvbikKLQl7Ci0JICB1bnNpZ25lZCBpbnQgcmVsb2NfaW5kZXg7Ci0KLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICByZWxvY19pbmRleCAKLQkgICAgPSBtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uIChhYmZkLCAKLQkJCQkJCSAgIGluZm8sIAotCQkJCQkJICAgcmVsb2NhdGlvbiwKLQkJCQkJCSAgIGgtPnJvb3QuZHluaW5keCwKLQkJCQkJCSAgIGFkZGVuZCwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pOwotCSAgaWYgKGgtPm1pbl9keW5fcmVsb2NfaW5kZXggPT0gMAotCSAgICAgIHx8IHJlbG9jX2luZGV4IDwgaC0+bWluX2R5bl9yZWxvY19pbmRleCkKLQkgICAgaC0+bWluX2R5bl9yZWxvY19pbmRleCA9IHJlbG9jX2luZGV4OwotCSAgdmFsdWUgPSBzeW1ib2wgKyBhZGRlbmQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTXzMyKQotCSAgICB2YWx1ZSA9IHN5bWJvbCArIGFkZGVuZDsKLQkgIGVsc2UKLQkgICAgdmFsdWUgPSBhZGRlbmQ7Ci0JfQotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU18yNjoKLSAgICAgIGlmIChsb2NhbF9wKQotCXZhbHVlID0gKCgoYWRkZW5kIDw8IDIpIHwgKHAgJiAweGYwMDAwMDAwKSkgKyBzeW1ib2wpID4+IDI7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSAobWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCA8PCAyLCAyOCkgKyBzeW1ib2wpID4+IDI7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0hJMTY6Ci0gICAgICBpZiAoIWdwX2Rpc3BfcCkKLQl7Ci0JICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2ggKGFkZGVuZCArIHN5bWJvbCk7Ci0JICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHZhbHVlID0gbWlwc19lbGZfaGlnaCAoYWRkZW5kICsgZ3AgLSBwKTsKLQkgIG92ZXJmbG93ZWRfcCA9IG1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlLCAxNik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19MTzE2OgotICAgICAgaWYgKCFncF9kaXNwX3ApCi0JdmFsdWUgPSAoc3ltYm9sICsgYWRkZW5kKSAmIGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGVsc2UKLQl7Ci0JICB2YWx1ZSA9IGFkZGVuZCArIGdwIC0gcCArIDQ7Ci0JICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfTElURVJBTDoKLSAgICAgIC8qIEJlY2F1c2Ugd2UgZG9uJ3QgbWVyZ2UgbGl0ZXJhbCBzZWN0aW9ucywgd2UgY2FuIGhhbmRsZSB0aGlzCi0JIGp1c3QgbGlrZSBSX01JUFNfR1BSRUwxNi4gIEluIHRoZSBsb25nIHJ1biwgd2Ugc2hvdWxkIG1lcmdlCi0JIHNoYXJlZCBsaXRlcmFscywgYW5kIHRoZW4gd2Ugd2lsbCBuZWVkIHRvIGFkZGl0aW9uYWwgd29yawotCSBoZXJlLiAgKi8KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQotICAgIGNhc2UgUl9NSVBTX0dQUkVMMTY6Ci0gICAgICBpZiAobG9jYWxfcCkKLQl2YWx1ZSA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KSArIHN5bWJvbCArIGdwMCAtIGdwOwotICAgICAgZWxzZQotCXZhbHVlID0gbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCwgMTYpICsgc3ltYm9sIC0gZ3A7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19HT1QxNjoKLSAgICAgIGlmIChsb2NhbF9wKQotCXsKLQkgIHZhbHVlID0gbWlwc19lbGZfZ290MTZfZW50cnkgKGFiZmQsIGluZm8sIHN5bWJvbCArIGFkZGVuZCk7Ci0JICBpZiAodmFsdWUgPT0gKGJmZF92bWEpIC0xKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB2YWx1ZSAKLQkgICAgPSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkgICAgICBhYmZkLAotCQkJCQkgICAgICB2YWx1ZSk7Ci0JICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCi0gICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgIGNhc2UgUl9NSVBTX0dPVF9ESVNQOgotICAgICAgdmFsdWUgPSBnOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfR1BSRUwzMjoKLSAgICAgIHZhbHVlID0gKGFkZGVuZCArIHN5bWJvbCArIGdwMCAtIGdwKSAmIGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfUEMxNjoKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCwgMTYpICsgc3ltYm9sIC0gcDsKLSAgICAgIG92ZXJmbG93ZWRfcCA9IG1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlLCAxNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0dPVF9ISTE2OgotICAgIGNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLSAgICAgIC8qIFdlJ3JlIGFsbG93ZWQgdG8gaGFuZGxlIHRoZXNlIHR3byByZWxvY2F0aW9ucyBpZGVudGljYWxseS4KLQkgVGhlIGR5bmFtaWMgbGlua2VyIGlzIGFsbG93ZWQgdG8gaGFuZGxlIHRoZSBDQUxMIHJlbG9jYXRpb25zCi0JIGRpZmZlcmVudGx5IGJ5IGNyZWF0aW5nIGEgbGF6eSBldmFsdWF0aW9uIHN0dWIuICAqLwotICAgICAgdmFsdWUgPSBnOwotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoICh2YWx1ZSk7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0dPVF9MTzE2OgotICAgIGNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLSAgICAgIHZhbHVlID0gZyAmIGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfNjQ6Ci0gICAgICB2YWx1ZSA9IChzeW1ib2wgKyBhZGRlbmQpICYgaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HT1RfUEFHRToKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfZ290X3BhZ2UgKGFiZmQsIGluZm8sIHN5bWJvbCArIGFkZGVuZCwgTlVMTCk7Ci0gICAgICBpZiAodmFsdWUgPT0gKGJmZF92bWEpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICAgICAgYWJmZCwKLQkJCQkJICAgICAgdmFsdWUpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX01JUFNfR09UX09GU1Q6Ci0gICAgICBtaXBzX2VsZl9nb3RfcGFnZSAoYWJmZCwgaW5mbywgc3ltYm9sICsgYWRkZW5kLCAmdmFsdWUpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfU1VCOgotICAgICAgdmFsdWUgPSBzeW1ib2wgLSBhZGRlbmQ7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0hJR0hFUjoKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfaGlnaGVyIChhZGRlbmQgKyBzeW1ib2wpOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19ISUdIRVNUOgotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoZXN0IChhZGRlbmQgKyBzeW1ib2wpOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19TQ05fRElTUDoKLSAgICAgIHZhbHVlID0gc3ltYm9sICsgYWRkZW5kIC0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19QSlVNUDoKLSAgICBjYXNlIFJfTUlQU19KQUxSOgotICAgICAgLyogQm90aCBvZiB0aGVzZSBtYXkgYmUgaWdub3JlZC4gIFJfTUlQU19KQUxSIGlzIGFuIG9wdGltaXphdGlvbgotCSBoaW50OyB3ZSBjb3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ5IGhvbm9yaW5nIHRoYXQgaGludC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gICAgY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKLSAgICAgIC8qIFdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggdGhlc2UgYXQgcHJlc2VudC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gICAgY2FzZSBSX01JUFMxNl8yNjoKLSAgICBjYXNlIFJfTUlQUzE2X0dQUkVMOgotICAgICAgLyogVGhlc2UgcmVsb2NhdGlvbnMsIHVzZWQgZm9yIE1JUFMxNiwgYXJlIG5vdCBjbGVhcmx5Ci0JIGRvY3VtZW50ZWQgYW55d2hlcmUuICBXaGF0IGRvIHRoZXkgZG8/ICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQW4gdW5yZWNvZ25pemVkIHJlbG9jYXRpb24gdHlwZS4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIFZBTFVFIGZvciBvdXIgY2FsbGVyLiAgKi8KLSAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gb3ZlcmZsb3dlZF9wID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotfQotCi0vKiBPYnRhaW4gdGhlIGZpZWxkIHJlbG9jYXRlZCBieSBSRUxPQ0FUSU9OLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX29idGFpbl9jb250ZW50cyAoaG93dG8sIHJlbG9jYXRpb24sIGlucHV0X2JmZCwgY29udGVudHMpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgYmZkX3ZtYSB4OwotICBiZmRfYnl0ZSAqbG9jYXRpb24gPSBjb250ZW50cyArIHJlbG9jYXRpb24tPnJfb2Zmc2V0OwotCi0gIHN3aXRjaCAoYmZkX2dldF9yZWxvY19zaXplIChob3d0bykpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHggPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICB4ID0gYmZkX2dldF84IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgODoKLSNpZmRlZiBCRkQ2NAotICAgICAgeCA9IGJmZF9nZXRfNjQgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4geDsKLX0KLQotLyogSXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIFJFTE9DQVRJT04gaXMgdGhlCi0gICBWQUxVRS4gIFVzZSBIT1dUTyB0byBwbGFjZSBWQUxVRSBpbnRvIHRoZSBvdXRwdXQgZmlsZSBhdCB0aGUKLSAgIGFwcHJvcHJpYXRlIHBvc2l0aW9uLiAgVGhlIFNFQ1RJT04gaXMgdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhlCi0gICByZWxvY2F0aW4gYXBwbGllcy4KLQotICAgUmV0dXJucyBmYWxzZSBpZiBhbnl0aGluZyBnb2VzIHdyb25nLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoaG93dG8sIHJlbG9jYXRpb24sIHZhbHVlLCBpbnB1dF9iZmQsIGNvbnRlbnRzKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGJmZF92bWEgeDsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uID0gY29udGVudHMgKyByZWxvY2F0aW9uLT5yX29mZnNldDsKLQotICAvKiBPYnRhaW4gdGhlIGN1cnJlbnQgdmFsdWUuICAqLwotICB4ID0gbWlwc19lbGZfb2J0YWluX2NvbnRlbnRzIChob3d0bywgcmVsb2NhdGlvbiwgaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0KLSAgLyogQ2xlYXIgdGhlIGZpZWxkIHdlIGFyZSBzZXR0aW5nLiAgKi8KLSAgeCAmPSB+aG93dG8tPmRzdF9tYXNrOwotCi0gIC8qIFNldCB0aGUgZmllbGQuICAqLwotICB4IHw9ICh2YWx1ZSAmIGhvd3RvLT5kc3RfbWFzayk7Ci0KLSAgLyogUHV0IHRoZSB2YWx1ZSBpbnRvIHRoZSBvdXRwdXQuICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICB4ID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDg6Ci0jaWZkZWYgQkZENjQKLSAgICAgIGJmZF9wdXRfNjQgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogUmVsb2NhdGUgYSBNSVBTIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHNpemVfdCBsb2NzeW1jb3VudDsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgYXNlY3Rpb24gKnNnb3QsICpzcmVsb2MsICpzY3B0OwotICBiZmQgKmR5bm9iajsKLSAgYmZkX3ZtYSBncDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZF92bWEgYWRkZW5kOwotICBiZmRfdm1hIGxhc3RfaGkxNl9hZGRlbmQ7Ci0gIGJvb2xlYW4gbmV4dF9yZWxvY2F0aW9uX2Zvcl9zYW1lX2FkZHJlc3NfcCA9IGZhbHNlOwotICBib29sZWFuIHVzZV9zYXZlZF9hZGRlbmRfcCA9IGZhbHNlOwotICBib29sZWFuIGxhc3RfaGkxNl9hZGRlbmRfdmFsaWRfcCA9IGZhbHNlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLSAgaWYgKGR5bm9iaiA9PSBOVUxMIHx8ICEgU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0gICAgc2NwdCA9IE5VTEw7Ci0gIGVsc2UKLSAgICBzY3B0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb21wYWN0X3JlbCIpOwotICBnID0gTlVMTDsKLQotICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBleHRzeW1vZmYgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgIH0KLQotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIAotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgIGludCByZXN1bHQ7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICAgICAgLyogRmluZCB0aGUgcmVsb2NhdGlvbiBob3d0byBmb3IgdGhpcyByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGhvd3RvID0gZWxmX21pcHNfaG93dG9fdGFibGUgKyBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKCF1c2Vfc2F2ZWRfYWRkZW5kX3ApCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0KLQkgIC8qIElmIHRoZXNlIHJlbG9jYXRpb25zIHdlcmUgb3JpZ2luYWxseSBvZiB0aGUgUkVMIHZhcmlldHksCi0JICAgICB3ZSBtdXN0IHB1bGwgdGhlIGFkZGVuZCBvdXQgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZQotCSAgICAgcmVsb2NhdGVkLiAgT3RoZXJ3aXNlLCB3ZSBzaW1wbHkgdXNlIHRoZSBjb250ZW50cyBvZiB0aGUKLQkgICAgIFJFTEEgcmVsb2NhdGlvbi4gIFRvIGRldGVybWluZSB3aGljaCBmbGF2b3Igb3IgcmVsb2NhdGlvbgotCSAgICAgdGhpcyBpcywgd2UgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIElOUFVUX1NFQ1RJT04ncwotCSAgICAgUkVMX0hEUiBpcyByZWFkIGJlZm9yZSBpdHMgUkVMX0hEUjIuICAqLwotCSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkcjsKLQkgIGlmIChyZWwgLSByZWxvY3MgPj0gcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemUpCi0JICAgIHJlbF9oZHIgPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkcjI7Ci0JICBpZiAocmVsX2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCkpCi0JICAgIHsKLQkgICAgICBpbnQgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLQkgICAgICBhZGRlbmQgPSBtaXBzX2VsZl9vYnRhaW5fY29udGVudHMgKGhvd3RvLCAKLQkJCQkJCSByZWwsCi0JCQkJCQkgaW5wdXRfYmZkLAotCQkJCQkJIGNvbnRlbnRzKTsKLQkgICAgICBhZGRlbmQgJj0gaG93dG8tPnNyY19tYXNrOwotCi0JICAgICAgLyogRm9yIHNvbWUga2luZHMgb2YgcmVsb2NhdGlvbnMsIHRoZSBBRERFTkQgaXMgYQotCQkgY29tYmluYXRpb24gb2YgdGhlIGFkZGVuZCBzdG9yZWQgaW4gdHdvIGRpZmZlcmVudAotCQkgcmVsb2NhdGlvbnMuICAgKi8KLQkgICAgICBpZiAocl90eXBlID09IFJfTUlQU19ISTE2IHx8IHJfdHlwZSA9PSBSX01JUFNfR09UMTYpCi0JCXsKLQkJICAvKiBTY2FuIGFoZWFkIHRvIGZpbmQgYSBtYXRjaGluZyBSX01JUFNfTE8xNgotCQkgICAgIHJlbG9jYXRpb24uICAqLwotCQkgIGJmZF92bWEgbDsKLQkJICAKLQkJICBpZiAoIW1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQgKHJlbCwgcmVsZW5kLCAmbCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAvKiBTYXZlIHRoZSBoaWdoLW9yZGVyIGJpdCBmb3IgbGF0ZXIuICBXaGVuIHdlCi0JCSAgICAgZW5jb3VudGVyIHRoZSBSX01JUFNfTE8xNiByZWxvY2F0aW9uIHdlIHdpbGwgbmVlZAotCQkgICAgIHRoZW0gYWdhaW4uICAqLwotCQkgIGFkZGVuZCA8PD0gMTY7Ci0JCSAgbGFzdF9oaTE2X2FkZGVuZCA9IGFkZGVuZDsKLQkJICBsYXN0X2hpMTZfYWRkZW5kX3ZhbGlkX3AgPSB0cnVlOwotCi0JCSAgLyogQ29tcHV0ZSB0aGUgY29tYmluZWQgYWRkZW5kLiAgKi8KLQkJICBhZGRlbmQgfD0gbDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfTE8xNikgCi0JCXsKLQkJICAvKiBVc2VkIHRoZSBzYXZlZCBISTE2IGFkZGVuZC4gICovCi0JCSAgaWYgKCFsYXN0X2hpMTZfYWRkZW5kX3ZhbGlkX3ApCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgYWRkZW5kIHw9IGxhc3RfaGkxNl9hZGRlbmQ7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCX0KLQotICAgICAgLyogSW4gdGhlIE4zMiBhbmQgNjQtYml0IEFCSXMgdGhlcmUgbWF5IGJlIG11bHRpcGxlIGNvbnNlY3V0aXZlCi0JIHJlbG9jYXRpb25zIGZvciB0aGUgc2FtZSBvZmZzZXQuICBJbiB0aGF0IGNhc2Ugd2UgYXJlCi0JIHN1cHBvc2VkIHRvIHRyZWF0IHRoZSBvdXRwdXQgb2YgZWFjaCByZWxvY2F0aW9uIGFzIHRoZSBhZGRlbmQKLQkgZm9yIHRoZSBuZXh0LiAgKi8KLSAgICAgIGlmIChyZWwgKyAxIDwgcmVsZW5kICYmIHJlbC0+cl9vZmZzZXQgPT0gKHJlbCArIDEpLT5yX29mZnNldCkKLQl1c2Vfc2F2ZWRfYWRkZW5kX3AgPSB0cnVlOwotICAgICAgZWxzZQotCXVzZV9zYXZlZF9hZGRlbmRfcCA9IGZhbHNlOwotCi0gICAgICAvKiBGaWd1cmUgb3V0IHdoYXQgdmFsdWUgd2UgYXJlIHN1cHBvc2VkIHRvIHJlbG9jYXRlLiAgKi8KLSAgICAgIHN3aXRjaCAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gKG91dHB1dF9iZmQsIAotCQkJCQkgICAgIGlucHV0X2JmZCwKLQkJCQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgIGluZm8sCi0JCQkJCSAgICAgcmVsLAotCQkJCQkgICAgIGFkZGVuZCwKLQkJCQkJICAgICBob3d0bywKLQkJCQkJICAgICByZWxlbmQsCi0JCQkJCSAgICAgbG9jYWxfc3ltcywKLQkJCQkJICAgICBsb2NhbF9zZWN0aW9ucywKLQkJCQkJICAgICAmdmFsdWUsCi0JCQkJCSAgICAgJm5hbWUpKQotCXsKLQljYXNlIGJmZF9yZWxvY19jb250aW51ZToKLQkgIC8qIFRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0JICBjb250aW51ZTsKLQotCWNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgIHJldHVybiBmYWxzZTsKLQotCWNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICh1c2Vfc2F2ZWRfYWRkZW5kX3ApCi0JICAgIC8qIElnbm9yZSBvdmVyZmxvdyB1bnRpbCB3ZSByZWFjaCB0aGUgbGFzdCByZWxvY2F0aW9uIGZvcgotCSAgICAgICBhIGdpdmVuIGxvY2F0aW9uLiAgKi8KLQkgICAgOwotCSAgZWxzZSBpZiAoIW5hbWUKLQkJICAgfHwgISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQkgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgd2UndmUgZ290IGFub3RoZXIgcmVsb2NhdGlvbiBmb3IgdGhlIGFkZHJlc3MsIGtlZXAgZ29pbmcKLQkgdW50aWwgd2UgcmVhY2ggdGhlIGxhc3Qgb25lLiAgKi8KLSAgICAgIGlmICh1c2Vfc2F2ZWRfYWRkZW5kX3ApCi0JewotCSAgYWRkZW5kID0gdmFsdWU7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFjdHVhbGx5IHBlcmZvcm0gdGhlIHJlbG9jYXRpb24uICAqLwotICAgICAgbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uIChob3d0bywgcmVsLCB2YWx1ZSwgaW5wdXRfYmZkLCAKLQkJCQkgICBjb250ZW50cyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGhvb2sgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgbGlua2VyIHdyaXRlcyBvdXQgYSBnbG9iYWwKLSAgIHN5bWJvbC4gIFdlIG1hcmsgc3ltYm9scyBhcyBzbWFsbCBjb21tb24gaWYgYXBwcm9wcmlhdGUuICBUaGlzIGlzCi0gICBhbHNvIHdoZXJlIHdlIHVuZG8gdGhlIGluY3JlbWVudCBvZiB0aGUgdmFsdWUgZm9yIGEgbWlwczE2IHN5bWJvbC4gICovCi0KLS8qQVJHU0lHTk9SRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBuYW1lLCBzeW0sIGlucHV0X3NlYykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjOwotewotICAvKiBJZiB3ZSBzZWUgYSBjb21tb24gc3ltYm9sLCB3aGljaCBpbXBsaWVzIGEgcmVsb2NhdGFibGUgbGluaywgdGhlbgotICAgICBpZiBhIHN5bWJvbCB3YXMgc21hbGwgY29tbW9uIGluIGFuIGlucHV0IGZpbGUsIG1hcmsgaXQgYXMgc21hbGwKLSAgICAgY29tbW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmIHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnNjb21tb24iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19TQ09NTU9OOwotCi0gIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYKLSAgICAgICYmIChzeW0tPnN0X3ZhbHVlICYgMSkgIT0gMCkKLSAgICAtLXN5bS0+c3RfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKGFiZmQpIFwKLSAgIChBQklfTjMyX1AgKGFiZmQpID8gIi91c3IvbGliMzIvbGliYy5zby4xIiA6ICIvdXNyL2xpYi9saWJjLnNvLjEiKQotCi0vKiBDcmVhdGUgZHluYW1pYyBzZWN0aW9ucyB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBjb25zdCBjaGFyICogY29uc3QgKm5hbWVwOwotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCB8IFNFQ19SRUFET05MWSk7Ci0KLSAgLyogTWlwcyBBQkkgcmVxdWVzdHMgdGhlIC5keW5hbWljIHNlY3Rpb24gdG8gYmUgcmVhZCBvbmx5LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSB0aGUgLm1zeW0gc2VjdGlvbiBvbiBJUklYNi4gIEl0IGlzIHVzZWQgYnkgdGhlIGR5bmFtaWMKLSAgICAgbGlua2VyIHRvIHNwZWVkIHVwIGR5bmFtaWMgcmVsb2NhdGlvbnMsIGFuZCB0byBhdm9pZCBjb21wdXRpbmcKLSAgICAgdGhlIEVMRiBoYXNoIGZvciBzeW1ib2xzLiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYKLSAgICAgICYmICFtaXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKiBDcmVhdGUgLnN0dWIgc2VjdGlvbi4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgCi0JCQkgICAgICAgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAoYWJmZCkpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX0NPREUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDUKLSAgICAgICYmICFpbmZvLT5zaGFyZWQKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJsZF9tYXAiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyAmIH5TRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogT24gSVJJWDUsIHdlIGFkanVzdCBhZGQgc29tZSBhZGRpdGlvbmFsIHN5bWJvbHMgYW5kIGNoYW5nZSB0aGUKLSAgICAgYWxpZ25tZW50cyBvZiBzZXZlcmFsIHNlY3Rpb25zLiAgVGhlcmUgaXMgbm8gQUJJIGRvY3VtZW50YXRpb24KLSAgICAgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgbmVjZXNzYXJ5IG9uIElSSVg2LCBub3IgYW55IGV2aWRlbmNlIHRoYXQKLSAgICAgdGhlIGxpbmtlciB0YWtlcyBzdWNoIGFjdGlvbi4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1KQotICAgIHsKLSAgICAgIGZvciAobmFtZXAgPSBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzOyAqbmFtZXAgIT0gTlVMTDsgbmFtZXArKykKLQl7Ci0JICBoID0gTlVMTDsKLQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsICpuYW1lcCwgQlNGX0dMT0JBTCwgYmZkX3VuZF9zZWN0aW9uX3B0ciwKLQkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgIGgtPnR5cGUgPSBTVFRfU0VDVElPTjsKLQotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSAuY29tcGFjdF9yZWwgc2VjdGlvbi4gICovCi0gICAgICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDaGFuZ2UgYWxpZ21lbnRzIG9mIHNvbWUgc2VjdGlvbnMuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmhhc2giKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgfQotCi0gIGlmICghaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGggPSBOVUxMOwotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgYWJmZCwgIl9EWU5BTUlDX0xJTksiLCBCU0ZfR0xPQkFMLCBiZmRfYWJzX3NlY3Rpb25fcHRyLAotCSAgICAgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX1NFQ1RJT047Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZCkKLQl7Ci0JICAvKiBfX3JsZF9tYXAgaXMgYSBmb3VyIGJ5dGUgd29yZCBsb2NhdGVkIGluIHRoZSAuZGF0YSBzZWN0aW9uCi0JICAgICBhbmQgaXMgZmlsbGVkIGluIGJ5IHRoZSBydGxkIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvCi0JICAgICB0aGUgX3JfZGVidWcgc3RydWN0dXJlLiBJdHMgc3ltYm9sIHZhbHVlIHdpbGwgYmUgc2V0IGluCi0JICAgICBtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wuICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgIGggPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgIl9fcmxkX21hcCIsIEJTRl9HTE9CQUwsIHMsCi0JCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuY29tcGFjdF9yZWwiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JICAgICAgIHwgU0VDX1JFQURPTkxZKTsKLQotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuY29tcGFjdF9yZWwiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uIHRvIGhvbGQgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlCi0gICAgIGxpbmtlciBzY3JpcHQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgc3ltYm9sIGlmIHdlCi0gICAgIGFyZSBub3QgY3JlYXRpbmcgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGZpcnN0IHNldmVyYWwgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzIGFyZSByZXNlcnZlZC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IE1JUFNfUkVTRVJWRURfR09UTk8gKiA0OwotCi0gIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IG1pcHNfZ290X2luZm8pKTsKLSAgaWYgKGcgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGctPmdsb2JhbF9nb3RzeW0gPSBOVUxMOwotICBnLT5sb2NhbF9nb3RubyA9IE1JUFNfUkVTRVJWRURfR09UTk87Ci0gIGctPmFzc2lnbmVkX2dvdG5vID0gTUlQU19SRVNFUlZFRF9HT1ROTzsKLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpID09IE5VTEwpCi0gICAgewotICAgICAgcy0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKSk7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocykgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGRhdGEgPSAoUFRSKSBnOwotICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZmxhZ3MgCi0gICAgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybnMgdGhlIC5tc3ltIHNlY3Rpb24gZm9yIEFCRkQsIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90Ci0gICBhbHJlYWR5IGV4aXN0LiAgUmV0dXJucyBOVUxMIHRvIGluZGljYXRlIGVycm9yLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpOwotICBpZiAoIXMpIAotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpOwotICAgICAgaWYgKCFzCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAKLQkJCQkgICAgIFNFQ19BTExPQwotCQkJCSAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCAKLQkJCQkgICAgIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gczsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgZXh0c3ltb2ZmID0gKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkgPyAwIDogc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICAvKiBDaGVjayBmb3IgdGhlIG1pcHMxNiBzdHViIHNlY3Rpb25zLiAgKi8KLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0gIGlmIChzdHJuY21wIChuYW1lLCBGTl9TVFVCLCBzaXplb2YgRk5fU1RVQiAtIDEpID09IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQotICAgICAgLyogTG9vayBhdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHdoaWNoIHN5bWJvbAotICAgICAgICAgdGhpcyBpcyBmb3IuICAqLwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWxvY3MtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZgotCSAgfHwgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbzsKLQotCSAgLyogVGhpcyBzdHViIGlzIGZvciBhIGxvY2FsIHN5bWJvbC4gIFRoaXMgc3R1YiB3aWxsIG9ubHkgYmUKLSAgICAgICAgICAgICBuZWVkZWQgaWYgdGhlcmUgaXMgc29tZSByZWxvY2F0aW9uIGluIHRoaXMgQkZELCBvdGhlcgotICAgICAgICAgICAgIHRoYW4gYSAxNiBiaXQgZnVuY3Rpb24gY2FsbCwgd2hpY2ggcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnNlY19yZWxvY3M7Ci0JICAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnIsICpyZW5kOwotCi0JICAgICAgLyogV2UgY2FuIGlnbm9yZSBzdHViIHNlY3Rpb25zIHdoZW4gbG9va2luZyBmb3IgcmVsb2NzLiAgKi8KLQkgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JCSAgfHwgby0+cmVsb2NfY291bnQgPT0gMAotCQkgIHx8IHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgRk5fU1RVQiwKLQkJCSAgICAgIHNpemVvZiBGTl9TVFVCIC0gMSkgPT0gMAotCQkgIHx8IHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgQ0FMTF9TVFVCLAotCQkJICAgICAgc2l6ZW9mIENBTExfU1RVQiAtIDEpID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIENBTExfRlBfU1RVQiwKLQkJCSAgICAgIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIHNlY19yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgICAgKGFiZmQsIG8sIChQVFIpIE5VTEwsCi0JCQkgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJICAgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgICAgIGlmIChzZWNfcmVsb2NzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHJlbmQgPSBzZWNfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgZm9yIChyID0gc2VjX3JlbG9jczsgciA8IHJlbmQ7IHIrKykKLQkJaWYgKEVMRjMyX1JfU1lNIChyLT5yX2luZm8pID09IHJfc3ltbmR4Ci0JCSAgICAmJiBFTEYzMl9SX1RZUEUgKHItPnJfaW5mbykgIT0gUl9NSVBTMTZfMjYpCi0JCSAgYnJlYWs7Ci0KLQkgICAgICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoc2VjX3JlbG9jcyk7Ci0KLQkgICAgICBpZiAociA8IHJlbmQpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGVyZSBpcyBubyBub24tY2FsbCByZWxvYyBmb3IgdGhpcyBzdHViLCBzbyB3ZSBkbwotICAgICAgICAgICAgICAgICBub3QgbmVlZCBpdC4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZQotICAgICAgICAgICAgICAgICB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZQotICAgICAgICAgICAgICAgICBjYW4gZWFzaWx5IGRpc2NhcmQgaXQgYnkgc2V0dGluZyB0aGUgU0VDX0VYQ0xVREUKLSAgICAgICAgICAgICAgICAgZmxhZy4gICovCi0JICAgICAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBSZWNvcmQgdGhpcyBzdHViIGluIGFuIGFycmF5IG9mIGxvY2FsIHN5bWJvbCBzdHVicyBmb3IKLSAgICAgICAgICAgICB0aGlzIEJGRC4gKi8KLQkgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9zdHVicyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBzeW1jb3VudDsKLQkgICAgICBhc2VjdGlvbiAqKm47Ci0KLQkgICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotCQlzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0JICAgICAgZWxzZQotCQlzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICAgICAgbiA9IChhc2VjdGlvbiAqKikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJICAgIHN5bWNvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0JICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmxvY2FsX3N0dWJzID0gbjsKLQkgICAgfQotCi0JICBlbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9zdHVic1tyX3N5bW5keF0gPSBzZWM7Ci0KLQkgIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IG1pcHMxNl9zdHVic19zZWVuIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICBUaGF0IGZsYWcgaXMgdXNlZCB0byBzZWUgd2hldGhlciB3ZSBuZWVkIHRvIGxvb2sgdGhyb3VnaAotICAgICAgICAgICAgIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGZvciBzdHVicy4gIFdlIGRvbid0IG5lZWQgdG8gc2V0Ci0gICAgICAgICAgICAgaXQgaGVyZSwgYmVjYXVzZSB3ZSBqdXN0IGhhdmUgYSBsb2NhbCBzdHViLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgICAgICBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSk7Ci0KLQkgIC8qIEggaXMgdGhlIHN5bWJvbCB0aGlzIHN0dWIgaXMgZm9yLiAgKi8KLQotCSAgaC0+Zm5fc3R1YiA9IHNlYzsKLQkgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbiA9IHRydWU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgQ0FMTF9TVFVCLCBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgPT0gMAotCSAgIHx8IHN0cm5jbXAgKG5hbWUsIENBTExfRlBfU1RVQiwgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqKmxvYzsKLQotICAgICAgLyogTG9vayBhdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHdoaWNoIHN5bWJvbAotICAgICAgICAgdGhpcyBpcyBmb3IuICAqLwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWxvY3MtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZgotCSAgfHwgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0gPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGlzIHN0dWIgd2FzIGFjdHVhbGx5IGJ1aWx0IGZvciBhIHN0YXRpYyBzeW1ib2wgZGVmaW5lZAotCSAgICAgaW4gdGhlIHNhbWUgZmlsZS4gIFdlIGFzc3VtZSB0aGF0IGFsbCBzdGF0aWMgc3ltYm9scyBpbgotCSAgICAgbWlwczE2IGNvZGUgYXJlIHRoZW1zZWx2ZXMgbWlwczE2LCBzbyB3ZSBjYW4gc2ltcGx5Ci0JICAgICBkaXNjYXJkIHRoaXMgc3R1Yi4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZQotCSAgICAgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucywgd2UgY2FuCi0JICAgICBlYXNpbHkgZGlzY2FyZCBpdCBieSBzZXR0aW5nIHRoZSBTRUNfRVhDTFVERSBmbGFnLiAgKi8KLQkgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGggPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSk7Ci0KLSAgICAgIC8qIEggaXMgdGhlIHN5bWJvbCB0aGlzIHN0dWIgaXMgZm9yLiAgKi8KLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIENBTExfRlBfU1RVQiwgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0JbG9jID0gJmgtPmNhbGxfZnBfc3R1YjsKLSAgICAgIGVsc2UKLQlsb2MgPSAmaC0+Y2FsbF9zdHViOwotCi0gICAgICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgc3R1YiBmb3IgdGhpcyBmdW5jdGlvbiwgd2UKLQkgZG9uJ3QgbmVlZCBhbm90aGVyIG9uZSwgc28gd2UgY2FuIGRpc2NhcmQgdGhpcyBvbmUuICBTaW5jZQotCSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zCi0JIHRvIG91dHB1dCBzZWN0aW9ucywgd2UgY2FuIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlCi0JIFNFQ19FWENMVURFIGZsYWcuICBXZSBjYW4gYWxzbyBkaXNjYXJkIHRoaXMgc2VjdGlvbiBpZiB3ZQotCSBoYXBwZW4gdG8gYWxyZWFkeSBrbm93IHRoYXQgdGhpcyBpcyBhIG1pcHMxNiBmdW5jdGlvbjsgaXQgaXMKLQkgbm90IG5lY2Vzc2FyeSB0byBjaGVjayB0aGlzIGhlcmUsIGFzIGl0IGlzIGNoZWNrZWQgbGF0ZXIsIGJ1dAotCSBpdCBpcyBzbGlnaHRseSBmYXN0ZXIgdG8gY2hlY2sgbm93LiAgKi8KLSAgICAgIGlmICgqbG9jICE9IE5VTEwgfHwgaC0+cm9vdC5vdGhlciA9PSBTVE9fTUlQUzE2KQotCXsKLQkgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgICpsb2MgPSBzZWM7Ci0gICAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+bWlwczE2X3N0dWJzX3NlZW4gPSB0cnVlOwotICAgIH0KLQotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgewotICAgICAgc2dvdCA9IE5VTEw7Ci0gICAgICBnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0JZyA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0JICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLQkgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0JfQotICAgIH0KLQotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZikKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0KLQkgIC8qIFRoaXMgbWF5IGJlIGFuIGluZGlyZWN0IHN5bWJvbCBjcmVhdGVkIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uLiAgKi8KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JCWggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgICAgfQotCX0KLQotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMIHx8IHNnb3QgPT0gTlVMTCkKLQl7Ci0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfTUlQU19HT1QxNjoKLQkgICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotCSAgICBjYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLQkgICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9MTzE2OgotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZHlub2JqLCAmc2dvdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX01JUFNfMzI6Ci0JICAgIGNhc2UgUl9NSVBTX1JFTDMyOgotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTAotCQkgICYmIChpbmZvLT5zaGFyZWQgfHwgaCAhPSBOVUxMKQotCQkgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCFoICYmIChyX3R5cGUgPT0gUl9NSVBTX0NBTExfTE8xNgotCQkgfHwgcl90eXBlID09IFJfTUlQU19HT1RfTE8xNgotCQkgfHwgcl90eXBlID09IFJfTUlQU19HT1RfRElTUCkpCi0JewotCSAgLyogV2UgbWF5IG5lZWQgYSBsb2NhbCBHT1QgZW50cnkgZm9yIHRoaXMgcmVsb2NhdGlvbi4gIFdlCi0JICAgICBkb24ndCBjb3VudCBSX01JUFNfSEkxNiBvciBSX01JUFNfR09UMTYgcmVsb2NhdGlvbnMKLQkgICAgIGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIGZvbGxvd2VkIGJ5IGEgUl9NSVBTX0xPMTYKLQkgICAgIHJlbG9jYXRpb24gZm9yIHRoZSB2YWx1ZS4gIFdlIGRvbid0IFJfTUlQU19HT1RfUEFHRQotCSAgICAgYmVjYXVzZSB3ZSBjYW4gZXN0aW1hdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCi0JICAgICBuZWVkZWQgYnkgbG9va2luZyBhdCB0aGUgc2l6ZSBvZiB0aGUgc2VnbWVudC4KLQotCSAgICAgVGhpcyBlc3RpbWF0aW9uIGlzIHZlcnkgY29uc2VydmF0aXZlIHNpbmNlIHdlIGNhbiBtZXJnZQotCSAgICAgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIEdPVC4gIEluIG9yZGVyIHRvIGJlIGxlc3MKLQkgICAgIGNvbnNlcnZhdGl2ZSwgd2UgY291bGQgYWN0dWFsbHkgYnVpbGQgdGhlIEdPVCBoZXJlLAotCSAgICAgcmF0aGVyIHRoYW4gaW4gcmVsb2NhdGVfc2VjdGlvbi4gICovCi0JICBnLT5sb2NhbF9nb3RubysrOwotCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX01JUFNfQ0FMTDE2OgotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IENBTEwxNiByZWxvYyBhdCAweCVseCBub3QgYWdhaW5zdCBnbG9iYWwgc3ltYm9sIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQotCWNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLQljYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKCFtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgKGgsIGluZm8sIGcpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFdlIG5lZWQgYSBzdHViLCBub3QgYSBwbHQgZW50cnkgZm9yIHRoZSB1bmRlZmluZWQKLQkgICAgIGZ1bmN0aW9uLiAgQnV0IHdlIHJlY29yZCBpdCBhcyBpZiBpdCBuZWVkcyBwbHQuICBTZWUKLQkgICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgaW4gZWxmbGluay5oLiAgKi8KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBoLT50eXBlID0gU1RUX0ZVTkM7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfR09UMTY6Ci0JY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0JY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0JY2FzZSBSX01JUFNfR09UX0RJU1A6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggJiYgIW1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAoaCwgaW5mbywgZykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfMzI6Ci0JY2FzZSBSX01JUFNfUkVMMzI6Ci0JICBpZiAoKGluZm8tPnNoYXJlZCB8fCBoICE9IE5VTEwpCi0JICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lID0gIi5yZWwuZHluIjsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAgICAgIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSkpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkJICA0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0JCSAgICAgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUgYXMgUl9NSVBTX1JFTDMyCi0JCSAgICAgcmVsb2NzLiAgV2UgbWFrZSByb29tIGZvciB0aGlzIHJlbG9jIGluIHRoZQotCQkgICAgIC5yZWwuZHluIHJlbG9jIHNlY3Rpb24gKi8KLQkJICBpZiAoc3JlbG9jLT5fcmF3X3NpemUgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogQWRkIGEgbnVsbCBlbGVtZW50LiAqLwotCQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQkJICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpobWlwczsKLQotCQkgIC8qIFdlIG9ubHkgbmVlZCB0byBjb3B5IHRoaXMgcmVsb2MgaWYgdGhlIHN5bWJvbCBpcwotICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQkJICBobWlwcyA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JCSAgKytobWlwcy0+bWlwc18zMl9yZWxvY3M7Ci0JCX0KLQkgICAgIAotCSAgICAgIC8qIEV2ZW4gdGhvdWdoIHdlIGRvbid0IGRpcmVjdGx5IG5lZWQgYSBHT1QgZW50cnkgZm9yCi0JCSB0aGlzIHN5bWJvbCwgYSBzeW1ib2wgbXVzdCBoYXZlIGEgZHluYW1pYyBzeW1ib2wKLQkJIHRhYmxlIGluZGV4IGdyZWF0ZXIgdGhhdCBEVF9HT1RTWU0gaWYgdGhlcmUgYXJlCi0JCSBkeW5hbWljIHJlbG9jYXRpb25zIGFnYWluc3QgaXQuICAqLwotCSAgICAgIGlmICghbWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sIChoLCBpbmZvLCBnKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLQkgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmNvbXBhY3RfcmVsX3NpemUgKz0KLQkgICAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NyaW5mbyk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfMjY6Ci0JY2FzZSBSX01JUFNfR1BSRUwxNjoKLQljYXNlIFJfTUlQU19MSVRFUkFMOgotCWNhc2UgUl9NSVBTX0dQUkVMMzI6Ci0JICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkpCi0JICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplICs9Ci0JICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jcmluZm8pOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgcmVsb2MgaXMgbm90IGEgMTYgYml0IGNhbGwsIGFuZCBpdCBoYXMgYSBnbG9iYWwKLSAgICAgICAgIHN5bWJvbCwgdGhlbiB3ZSB3aWxsIG5lZWQgdGhlIGZuX3N0dWIgaWYgdGhlcmUgaXMgb25lLgotICAgICAgICAgUmVmZXJlbmNlcyBmcm9tIGEgc3R1YiBzZWN0aW9uIGRvIG5vdCBjb3VudC4gKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIHJfdHlwZSAhPSBSX01JUFMxNl8yNgotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIEZOX1NUVUIsCi0JCSAgICAgIHNpemVvZiBGTl9TVFVCIC0gMSkgIT0gMAotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIENBTExfU1RVQiwKLQkJICAgICAgc2l6ZW9mIENBTExfU1RVQiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBDQUxMX0ZQX1NUVUIsCi0JCSAgICAgIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSAhPSAwKQotCXsKLQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOwotCi0JICBtaCA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JICBtaC0+bmVlZF9mbl9zdHViID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWlwc19lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgLyogPz8/IERvIG1pcHMxNiBzdHViIHNlY3Rpb25zIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsPyAgKi8KLQotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NSVBTX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSNpZiAwCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9NSVBTX0dPVDE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotICAgICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0gICAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLQkvKiA/Pz8gSXQgd291bGQgc2VlbSB0aGF0IHRoZSBleGlzdGluZyBNSVBTIGNvZGUgZG9lcyBubyBzb3J0Ci0JICAgb2YgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHdoYXRub3Qgb24gaXRzIEdPVCBhbmQgUExUIGVudHJpZXMsCi0JICAgc28gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdhcmJhZ2UgY29sbGVjdCB0aGVtIGF0IHRoaXMgdGltZS4gICovCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpobWlwczsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCwgd2UgbmVlZCB0byBjb3B5Ci0gICAgIGFueSBSX01JUFNfMzIgb3IgUl9NSVBTX1JFTDMyIHJlbG9jcyBhZ2FpbnN0IGl0IGludG8gdGhlIG91dHB1dAotICAgICBmaWxlLiAgKi8KLSAgaG1pcHMgPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGhtaXBzLT5taXBzXzMyX3JlbG9jcyAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgewotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXsKLQkgIC8qIE1ha2Ugcm9vbSBmb3IgYSBudWxsIGVsZW1lbnQuICovCi0JICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgKytzLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gaG1pcHMtPm1pcHNfMzJfcmVsb2NzICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotICAgIH0KLQotICAvKiBGb3IgYSBmdW5jdGlvbiwgY3JlYXRlIGEgc3R1YiwgaWYgbmVlZGVkLiAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIHRoZW4gc2V0Ci0JIHRoZSBzeW1ib2wgdG8gdGhlIHN0dWIgbG9jYXRpb24uICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UKLQkgZnVuY3Rpb24gcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwKLQkgZXhlY3V0YWJsZSBhbmQgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogV2UgbmVlZCAuc3R1YiBzZWN0aW9uLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgICAgICAgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLQkgIC8qIFhYWCBXcml0ZSB0aGlzIHN0dWIgYWRkcmVzcyBzb21ld2hlcmUuICAqLwotCSAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotCSAgLyogTWFrZSByb29tIGZvciB0aGlzIHN0dWIgY29kZS4gICovCi0JICBzLT5fcmF3X3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0KLQkgIC8qIFRoZSBsYXN0IGhhbGYgd29yZCBvZiB0aGUgc3R1YiB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBpbmRleAotCSAgICAgb2YgdGhpcyBzeW1ib2wgaW4gLmR5bnN5bSBzZWN0aW9uLiAgKi8KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHJlYWQsCi0gICBhbmQgdGhlIGlucHV0IHNlY3Rpb25zIGhhdmUgYmVlbiBhc3NpZ25lZCB0byBvdXRwdXQgc2VjdGlvbnMuICBXZQotICAgY2hlY2sgZm9yIGFueSBtaXBzMTYgc3R1YiBzZWN0aW9ucyB0aGF0IHdlIGNhbiBkaXNjYXJkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzCi0gIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnJpOwotCi0gIC8qIFRoZSAucmVnaW5mbyBzZWN0aW9uIGhhcyBhIGZpeGVkIHNpemUuICAqLwotICByaSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlZ2luZm8iKTsKLSAgaWYgKHJpICE9IE5VTEwpCi0gICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHJpLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAhIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgIG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicywKLQkJCSAgICAgICAoUFRSKSBOVUxMKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgdGhlIG1pcHMxNiBzdHVicyBmb3IgYSBwYXJ0aWN1bGFyIHN5bWJvbCwgYW5kIHNlZSBpZiB3ZSBjYW4KLSAgIGRpc2NhcmQgdGhlbS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGlmIChoLT5mbl9zdHViICE9IE5VTEwKLSAgICAgICYmICEgaC0+bmVlZF9mbl9zdHViKQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZuX3N0dWI7IHRoZSBvbmx5IHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wKLSAgICAgICAgIGFyZSAxNiBiaXQgY2FsbHMuICBDbG9iYmVyIHRoZSBzaXplIHRvIDAgdG8gcHJldmVudCBpdCBmcm9tCi0gICAgICAgICBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0gICAgICBoLT5mbl9zdHViLT5fcmF3X3NpemUgPSAwOwotICAgICAgaC0+Zm5fc3R1Yi0+X2Nvb2tlZF9zaXplID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPmZsYWdzICY9IH4gU0VDX1JFTE9DOwotICAgICAgaC0+Zm5fc3R1Yi0+cmVsb2NfY291bnQgPSAwOwotICAgICAgaC0+Zm5fc3R1Yi0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gICAgfQotCi0gIGlmIChoLT5jYWxsX3N0dWIgIT0gTlVMTAotICAgICAgJiYgaC0+cm9vdC5vdGhlciA9PSBTVE9fTUlQUzE2KQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGNhbGxfc3R1YjsgdGhpcyBpcyBhIDE2IGJpdCBmdW5jdGlvbiwgc28KLSAgICAgICAgIGNhbGxzIGZyb20gb3RoZXIgMTYgYml0IGZ1bmN0aW9ucyBhcmUgT0suICBDbG9iYmVyIHRoZSBzaXplCi0gICAgICAgICB0byAwIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0gICAgICBoLT5jYWxsX3N0dWItPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICBoLT5jYWxsX3N0dWItPl9jb29rZWRfc2l6ZSA9IDA7Ci0gICAgICBoLT5jYWxsX3N0dWItPmZsYWdzICY9IH4gU0VDX1JFTE9DOwotICAgICAgaC0+Y2FsbF9zdHViLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBoLT5jYWxsX3N0dWItPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICAgIH0KLQotICBpZiAoaC0+Y2FsbF9mcF9zdHViICE9IE5VTEwKLSAgICAgICYmIGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBjYWxsX3N0dWI7IHRoaXMgaXMgYSAxNiBiaXQgZnVuY3Rpb24sIHNvCi0gICAgICAgICBjYWxscyBmcm9tIG90aGVyIDE2IGJpdCBmdW5jdGlvbnMgYXJlIE9LLiAgQ2xvYmJlciB0aGUgc2l6ZQotICAgICAgICAgdG8gMCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5fcmF3X3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5fY29va2VkX3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+cmVsb2NfY291bnQgPSAwOwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplIAotCSAgICA9IHN0cmxlbiAoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgKG91dHB1dF9iZmQpKSArIDE7Ci0JICBzLT5jb250ZW50cyAKLQkgICAgPSAoYmZkX2J5dGUgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgKG91dHB1dF9iZmQpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIG9ubHkgc3RyaXAgdGhlIHNlY3Rpb24gaWYgdGhlIG91dHB1dCBzZWN0aW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgaGFzIHRoZSBzYW1lIG5hbWUuICBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwKLSAgICAgICAgICAgICAgICAgaW5wdXQgc2VjdGlvbnMgZm9yIHRoaXMgb3V0cHV0IHNlY3Rpb24uICBGSVhNRTogVGhpcwotICAgICAgICAgICAgICAgICBjb2RlIGlzIHByb2JhYmx5IG5vdCBuZWVkZWQgdGhlc2UgZGF5cyBhbnlob3csIHNpbmNlCi0gICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgbm93IGRvZXMgbm90IGNyZWF0ZSBlbXB0eSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCSAgICAgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCSAgJiYgc3RyY21wIChuYW1lLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCQkJICAgcy0+b3V0cHV0X3NlY3Rpb24pKSA9PSAwKQotCQlzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4KLSAgICAgICAgICAgICAgICAgSWYgdGhlIHJlbG9jYXRpb24gc2VjdGlvbiBpcyAucmVsLmR5biwgd2UgYWx3YXlzCi0gICAgICAgICAgICAgICAgIGFzc2VydCBhIERUX1RFWFRSRUwgZW50cnkgcmF0aGVyIHRoYW4gdGVzdGluZyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgIHRoZXJlIGV4aXN0cyBhIHJlbG9jYXRpb24gdG8gYSByZWFkIG9ubHkgc2VjdGlvbiBvcgotICAgICAgICAgICAgICAgICBub3QuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JICAgICAgaWYgKCh0YXJnZXQgIT0gTlVMTAotCQkgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICB8fCBzdHJjbXAgKG91dG5hbWUsICIucmVsLmR5biIpID09IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsLmR5biIpICE9IDApCi0JCXMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgPT0gMCkKLQl7Ci0JICBpbnQgaTsKLSAJICBiZmRfc2l6ZV90eXBlIGxvYWRhYmxlX3NpemUgPSAwOwotIAkgIGJmZF9zaXplX3R5cGUgbG9jYWxfZ290bm87Ci0gCSAgc3RydWN0IF9iZmQgKnN1YjsKLQotIAkgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHMpICE9IE5VTEwpOwotCSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGRhdGE7Ci0gCSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotIAkgIC8qIENhbGN1bGF0ZSB0aGUgdG90YWwgbG9hZGFibGUgc2l6ZSBvZiB0aGUgb3V0cHV0LiAgVGhhdAotIAkgICAgIHdpbGwgZ2l2ZSB1cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgR09UX1BBR0UgZW50cmllcwotIAkgICAgIHJlcXVpcmVkLiAgKi8KLSAJICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1Yjsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gCSAgICB7Ci0gCSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotIAotIAkgICAgICBmb3IgKHN1YnNlY3Rpb24gPSBzdWItPnNlY3Rpb25zOyAKLSAJCSAgIHN1YnNlY3Rpb247IAotIAkJICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0gCQl7Ci0gCQkgIGlmICgoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gCQkgICAgY29udGludWU7Ci0gCQkgIGxvYWRhYmxlX3NpemUgKz0gKHN1YnNlY3Rpb24tPl9yYXdfc2l6ZSArIDB4ZikgJiB+MHhmOwotIAkJfQotIAkgICAgfQotIAkgIGxvYWRhYmxlX3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0KLSAJICAvKiBBc3N1bWUgdGhlcmUgYXJlIHR3byBsb2FkYWJsZSBzZWdtZW50cyBjb25zaXN0aW5nIG9mCi0gCSAgICAgY29udGlndW91cyBzZWN0aW9ucy4gIElzIDUgZW5vdWdoPyAqLwotIAkgIGxvY2FsX2dvdG5vID0gKGxvYWRhYmxlX3NpemUgPj4gMTYpICsgNTsKLSAJICBnLT5sb2NhbF9nb3RubyArPSBsb2NhbF9nb3RubzsKLSAJICBzLT5fcmF3X3NpemUgKz0gbG9jYWxfZ290bm8gKiA0OwotCi0gCSAgLyogVGhlcmUgaGFzIHRvIGJlIGEgZ2xvYmFsIEdPVCBlbnRyeSBmb3IgZXZlcnkgc3ltYm9sIHdpdGgKLSAJICAgICBhIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGluZGV4IG9mIERUX01JUFNfR09UU1lNIG9yCi0gCSAgICAgaGlnaGVyLiAgVGhlcmVmb3JlLCBpdCBtYWtlIHNlbnNlIHRvIHB1dCB0aG9zZSBzeW1ib2xzCi0gCSAgICAgdGhhdCBuZWVkIEdPVCBlbnRyaWVzIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZS4gIFdlCi0gCSAgICAgZG8gdGhhdCBoZXJlLiAgKi8KLSAJICBpZiAoIW1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSAoaW5mbykpCi0gCSAgICByZXR1cm4gZmFsc2U7Ci0KLSAJICBpID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCAtIGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHg7Ci0JICBzLT5fcmF3X3NpemUgKz0gaSAqIDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpID09IDApCi0JewotCSAgLyogSXJpeCBybGQgYXNzdW1lcyB0aGF0IHRoZSBmdW5jdGlvbiBzdHViIGlzbid0IGF0IHRoZSBlbmQKLQkgICAgIG9mIC50ZXh0IHNlY3Rpb24uIFNvIHB1dCBhIGR1bW15LiBYWFggICovCi0JICBzLT5fcmF3X3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0JfQotICAgICAgZWxzZSBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICAgICAgJiYgISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLnJsZF9tYXAiLCA4KSA9PSAwKQotCXsKLQkgIC8qIFdlIGFkZCBhIHJvb20gZm9yIF9fcmxkX21hcC4gSXQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlCi0JICAgICBydGxkIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBfcl9kZWJ1ZyBzdHJ1Y3R1cmUuICAqLwotCSAgcy0+X3Jhd19zaXplICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5jb21wYWN0X3JlbCIsIDEyKSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Y29tcGFjdF9yZWxfc2l6ZTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKQotCSAgICAgICA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IChzaXplb2YgKEVsZjMyX0V4dGVybmFsX01zeW0pIAotCQkJKiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudAotCQkJICAgKyBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpKSk7Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmluaXQiLCA1KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmX21pcHNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLQkgICAgewotCSAgICAgIC8qIFNHSSBvYmplY3QgaGFzIHRoZSBlcXVpdmFsZW5jZSBvZiBEVF9ERUJVRyBpbiB0aGUKLQkJIERUX01JUFNfUkxEX01BUCBlbnRyeS4gICovCi0JICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX1JMRF9NQVAsIDApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTFNaLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEVOVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19DT05GTElDVE5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19MSUJMSVNUTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuY29uZmxpY3QiKSAhPSBOVUxMKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19DT05GTElDVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubGlibGlzdCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0xJQkxJU1QsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfUkxEX1ZFUlNJT04sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0ZMQUdTLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSNpZiAwCi0gICAgICAvKiBUaW1lIHN0YW1wcyBpbiBleGVjdXRhYmxlIGZpbGVzIGFyZSBhIGJhZCBpZGVhLiAgKi8KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19USU1FX1NUQU1QLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotI2lmIDAgLyogRklYTUUgICovCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfSUNIRUNLU1VNLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotI2lmIDAgLyogRklYTUUgICovCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfSVZFUlNJT04sIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfQkFTRV9BRERSRVNTLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19MT0NBTF9HT1ROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfU1lNVEFCTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX1VOUkVGRVhUTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0dPVFNZTSwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoSVJJWF9DT01QQVQgKGR5bm9iaikgPT0gaWN0X2lyaXg1Ci0JICAmJiAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19ISVBBR0VOTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoSVJJWF9DT01QQVQgKGR5bm9iaikgPT0gaWN0X2lyaXg2Ci0JICAmJiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JICAgICAgKGR5bm9iaiwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGR5bm9iaikpKQotCSAgJiYgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19PUFRJT05TLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgICBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoZHlub2JqKSkKLQkgICYmICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfTVNZTSwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSB1c2UgZHluYW1pYyBsaW5raW5nLCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24gc3ltYm9sIGZvciBlYWNoCi0gICAgIG91dHB1dCBzZWN0aW9uLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleQotICAgICBtdXN0IGNvbWUgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotICAgICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeQotICAgICBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgYywgaTsKLSAgICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICAgIGMgPSAwOwotICAgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICAgIHsKLSNpZiAwCi0JLyogV2Ugbm8gbG9uZ2VyIHRyeSB0byByZXN0cmljdCB0aGUgc2V0IG9mIHNlY3Rpb25zIHdoaWNoIGdldAotICAgICAgICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBzaW5jZSBpdCBmYWlscyBpZiB3ZSBoYXZlCi0gICAgICAgICAgIG90aGVyIHJhbmRvbSBzZWN0aW9ucyB3aGljaCBuZWVkIGR5bmFtaWMgcmVsb2NhdGlvbnMuICAqLwotCWNvbnN0IGNoYXIgKiBjb25zdCAqbmFtZXA7Ci0JYmZkX3NpemVfdHlwZSBzdHJpbmRleDsKLQlzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7Ci0KLQlpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0JICB7Ci0JICAgIGMgPSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVMgLSAxOwotCSAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgIG1pcHNfZWxmX2FkanVzdF9keW5pbmR4LAotCQkJCSAgICAoUFRSKSAmYyk7Ci0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgKz0gYzsKLQotCSAgICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKLQkgICAgQkZEX0FTU0VSVCAoZHluc3RyICE9IE5VTEwpOwotCi0JICAgIGZvciAoaSA9IDEsIG5hbWVwID0gbWlwc19lbGZfZHluc3ltX3NlY19uYW1lczsKLQkJICpuYW1lcCAhPSBOVUxMOwotCQkgaSsrLCBuYW1lcCsrKQotCSAgICAgIHsKLQkJcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAqbmFtZXApOwotCQlpZiAocyAhPSBOVUxMKQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gaTsKLQotCQlzdHJpbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZHluc3RyLCAqbmFtZXAsIHRydWUsIGZhbHNlKTsKLQkJaWYgKHN0cmluZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICByZXR1cm4gZmFsc2U7Ci0KLQkJbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bV9zZWNfc3RyaW5kZXhbaV0gPSBzdHJpbmRleDsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotI2VuZGlmIC8qIDAgKi8KLQkgIHsKLQkgICAgYyA9IGJmZF9jb3VudF9zZWN0aW9ucyAob3V0cHV0X2JmZCk7Ci0JICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAgX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCwKLQkJCQkgICAgKFBUUikgJmMpOwotCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7Ci0KLQkgICAgZm9yIChpID0gMSwgcyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0LCBpKyspCi0JICAgICAgewotCQllbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9IGk7Ci0JCS8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0JCSAgIGZpZGRsZSB3aXRoIGR5bnN0cl9pbmRleC4gICovCi0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIElmIE5BTUUgaXMgb25lIG9mIHRoZSBzcGVjaWFsIElSSVg2IHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgbGlua2VyLAotICAgYWRqdXN0IGl0IGFwcHJvcHJpYXRlbHkgbm93LiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAoYWJmZCwgbmFtZSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgLyogVGhlIGxpbmtlciBzY3JpcHQgdGFrZXMgY2FyZSBvZiBwcm92aWRpbmcgbmFtZXMgYW5kIHZhbHVlcyBmb3IKLSAgICAgdGhlc2UsIGJ1dCB3ZSBtdXN0IHBsYWNlIHRoZW0gaW50byB0aGUgcmlnaHQgc2VjdGlvbnMuICAqLwotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgdGV4dF9zZWN0aW9uX3N5bWJvbHNbXSA9IHsKLSAgICAiX2Z0ZXh0IiwKLSAgICAiX2V0ZXh0IiwKLSAgICAiX19kc29fZGlzcGxhY2VtZW50IiwKLSAgICAiX19lbGZfaGVhZGVyIiwKLSAgICAiX19wcm9ncmFtX2hlYWRlcl90YWJsZSIsCi0gICAgTlVMTAotICB9OwotCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBkYXRhX3NlY3Rpb25fc3ltYm9sc1tdID0gewotICAgICJfZmRhdGEiLAotICAgICJfZWRhdGEiLAotICAgICJfZW5kIiwKLSAgICAiX2Zic3MiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBjb25zdCAqcDsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkKLSAgICBmb3IgKHAgPSAoaSA9PSAwKSA/IHRleHRfc2VjdGlvbl9zeW1ib2xzIDogZGF0YV9zZWN0aW9uX3N5bWJvbHM7IAotCSAqcDsKLQkgKytwKQotICAgICAgaWYgKHN0cmNtcCAoKnAsIG5hbWUpID09IDApCi0JewotCSAgLyogQWxsIG9mIHRoZXNlIHN5bWJvbHMgYXJlIGdpdmVuIHR5cGUgU1RUX1NFQ1RJT04gYnkgdGhlCi0JICAgICBJUklYNiBsaW5rZXIuICAqLwotCSAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLQkgIAotCSAgLyogVGhlIElSSVggbGlua2VyIHB1dHMgdGhlc2Ugc3ltYm9scyBpbiBzcGVjaWFsIHNlY3Rpb25zLiAgKi8KLQkgIGlmIChpID09IDApCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19URVhUOwotCSAgZWxzZQotCSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfREFUQTsKLQkgIAotCSAgYnJlYWs7Ci0JfQotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGJmZF92bWEgZ3ZhbDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzbXN5bTsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBndmFsID0gc3ltLT5zdF92YWx1ZTsKLSAgbWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX2J5dGUgc3R1YltNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRV07Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIHN0dWIuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgdGhlIHN0dWIuICAqLwotICAgICAgcCA9IHN0dWI7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0xXKG91dHB1dF9iZmQpLCBwKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfTU9WRSwgcCk7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIEZJWE1FOiBDYW4gaC0+ZHluaW5kZXggYmUgbW9yZSB0aGFuIDY0Sz8gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCAmIDB4ZmZmZjAwMDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0pBTFIsIHApOwotICAgICAgcCArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9MSTE2ICsgaC0+ZHluaW5keCwgcCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPnBsdC5vZmZzZXQgPD0gcy0+X3Jhd19zaXplKTsKLSAgICAgIG1lbWNweSAocy0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBzdHViLCBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0KLSAgICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQuICBwbHQub2Zmc2V0ICE9IC0xIG9jY3VycwotCSBvbmx5IGZvciB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuICAqLwotICAgICAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQotICAgICAgLyogVGhlIHJ1bi10aW1lIGxpbmtlciB1c2VzIHRoZSBzdF92YWx1ZSBmaWVsZCBvZiB0aGUgc3ltYm9sCi0JIHRvIHJlc2V0IHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciB0aGlzIGV4dGVybmFsCi0JIHRvIGl0cyBzdHViIGFkZHJlc3Mgd2hlbiB1bmxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGd2YWwgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCArIGgtPnBsdC5vZmZzZXQ7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gZ3ZhbDsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotICAvKiBSdW4gdGhyb3VnaCB0aGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSwgY3JlYXRpbmcgR09UIGVudHJpZXMgZm9yIGFsbAotICAgICB0aGUgc3ltYm9scyB0aGF0IG5lZWQgdGhlbS4gICovCi0gIGlmIChoLT5keW5pbmR4ID49IGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHgpCi0gICAgewotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotCi0gICAgICBpZiAoc3ltLT5zdF92YWx1ZSkKLQl2YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0gICAgICBlbHNlCi0JLyogRm9yIGFuIGVudGl0eSBkZWZpbmVkIGluIGEgc2hhcmVkIG9iamVjdCwgdGhpcyB3aWxsIGJlCi0JICAgTlVMTC4gIChGb3IgZnVuY3Rpb25zIGluIHNoYXJlZCBvYmplY3RzIGZvcgotCSAgIHdoaWNoIHdlIGhhdmUgY3JlYXRlZCBzdHVicywgU1RfVkFMVUUgd2lsbCBiZSBub24tTlVMTC4KLQkgICBUaGF0J3MgYmVjYXVzZSBzdWNoIHRoZSBmdW5jdGlvbnMgYXJlIG5vdyBubyBsb25nZXIgZGVmaW5lZAotCSAgIGluIGEgc2hhcmVkIG9iamVjdC4pICAqLwotCXZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICAgICAgb2Zmc2V0ID0gbWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleCAoZHlub2JqLCBoKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBzZ290LT5jb250ZW50cyArIG9mZnNldCk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIC5tc3ltIGVudHJ5LCBpZiBhcHByb3ByaWF0ZS4gICovCi0gIHNtc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotICBpZiAoc21zeW0pCi0gICAgewotICAgICAgRWxmMzJfSW50ZXJuYWxfTXN5bSBtc3ltOwotCi0gICAgICBtc3ltLm1zX2hhc2hfdmFsdWUgPSBiZmRfZWxmX2hhc2ggKGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgLyogSXQgaXMgdW5kb2N1bWVudGVkIHdoYXQgdGhlIGAxJyBpbmRpY2F0ZXMsIGJ1dCBJUklYNiB1c2VzCi0JIHRoaXMgdmFsdWUuICAqLwotICAgICAgbXN5bS5tc19pbmZvID0gRUxGMzJfTVNfSU5GTyAobWgtPm1pbl9keW5fcmVsb2NfaW5kZXgsIDEpOwotICAgICAgYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9vdXQgCi0JKGR5bm9iaiwgJm1zeW0sCi0JICgoRWxmMzJfRXh0ZXJuYWxfTXN5bSAqKSBzbXN5bS0+Y29udGVudHMpICsgaC0+ZHluaW5keCk7Ci0gICAgfQotCi0gIC8qIE1hcmsgX0RZTkFNSUMgYW5kIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhcyBhYnNvbHV0ZS4gICovCi0gIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICBpZiAoc3RyY21wIChuYW1lLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKG5hbWUsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfRFlOQU1JQ19MSU5LIikgPT0gMCkKLSAgICB7Ci0gICAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgICAgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICJfZ3BfZGlzcCIpID09IDApCi0JewotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF92YWx1ZSA9IGVsZl9ncCAob3V0cHV0X2JmZCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1sxXSkgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF9vdGhlciA9IFNUT19QUk9URUNURUQ7Ci0JICBzeW0tPnN0X3ZhbHVlID0gMDsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1syXSkgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF9vdGhlciA9IFNUT19QUk9URUNURUQ7Ci0JICBzeW0tPnN0X3ZhbHVlID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnByb2NlZHVyZV9jb3VudDsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0FCUykKLQl7Ci0JICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQykKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1RFWFQ7Ci0JICBlbHNlIGlmIChoLT50eXBlID09IFNUVF9PQkpFQ1QpCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCX0KLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBJUklYNi1zcGVjaWZpYyBzeW1ib2xzLiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChvdXRwdXRfYmZkKSA9PSBpY3RfaXJpeDYpCi0gICAgbWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBuYW1lLCBzeW0pOwotCi0gIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKQotICAgICAgJiYgISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQKLQkgICYmIHN0cmNtcCAobmFtZSwgIl9fcmxkX21hcCIpID09IDApCi0JewotCSAgYXNlY3Rpb24gKnMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJsZF9tYXAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzeW0tPnN0X3ZhbHVlID0gcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgcy0+Y29udGVudHMpOwotCSAgaWYgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWUgPT0gMCkKLQkgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiX19ybGRfb2JqX2hlYWQiKSA9PSAwKQotCXsKLQkgIC8qIElSSVg2IGRvZXMgbm90IHVzZSBhIC5ybGRfbWFwIHNlY3Rpb24uICAqLwotCSAgaWYgKElSSVhfQ09NUEFUIChvdXRwdXRfYmZkKSA9PSBpY3RfaXJpeDUpCi0JICAgIEJGRF9BU1NFUlQgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmxkX21hcCIpIAotCQkJIT0gTlVMTCk7Ci0JICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID0gc3ltLT5zdF92YWx1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBtaXBzMTYgc3ltYm9sLCBmb3JjZSB0aGUgdmFsdWUgdG8gYmUgZXZlbi4gICovCi0gIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYKLSAgICAgICYmIChzeW0tPnN0X3ZhbHVlICYgMSkgIT0gMCkKLSAgICAtLXN5bS0+c3RfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBpZiAoc2dvdCA9PSBOVUxMKQotICAgIGcgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0gICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBzaXplX3QgZWxlbXNpemU7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxFTlQ6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1NUUlNaOgotCSAgICAgIC8qIFJld3JpdGUgRFRfU1RSU1ouICAqLwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0KLQkJX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfTUlQU19DT05GTElDVDoKLQkgICAgICBuYW1lID0gIi5jb25mbGljdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX01JUFNfTElCTElTVDoKLQkgICAgICBuYW1lID0gIi5saWJsaXN0IjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfUkxEX1ZFUlNJT046Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSAxOyAvKiBYWFggKi8KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19GTEFHUzoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IFJIRl9OT1RQT1Q7IC8qIFhYWCAqLwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86Ci0JICAgICAgbmFtZSA9ICIuY29uZmxpY3QiOwotCSAgICAgIGVsZW1zaXplID0gc2l6ZW9mIChFbGYzMl9Db25mbGljdCk7Ci0JICAgICAgZ290byBzZXRfZWxlbW5vOwotCi0JICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86Ci0JICAgICAgbmFtZSA9ICIubGlibGlzdCI7Ci0JICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0xpYik7Ci0JICAgIHNldF9lbGVtbm86Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemUgLyBlbGVtc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZSAvIGVsZW1zaXplOwotCQl9Ci0JICAgICAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgPSAwOwotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfVElNRV9TVEFNUDoKLQkgICAgICB0aW1lICgodGltZV90ICopICZkeW4uZF91bi5kX3ZhbCk7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSUNIRUNLU1VNOgotCSAgICAgIC8qIFhYWCBGSVhNRTogKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSVZFUlNJT046Ci0JICAgICAgLyogWFhYIEZJWE1FOiAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19CQVNFX0FERFJFU1M6Ci0JICAgICAgcyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWEgJiB+KDB4ZmZmZik7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09UTk86Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBnLT5sb2NhbF9nb3RubzsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKLQkgICAgICBuYW1lID0gIi5keW5zeW0iOwotCSAgICAgIGVsZW1zaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemUgLyBlbGVtc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplIC8gZWxlbXNpemU7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKLQkgICAgICAvKiBUaGUgaW5kZXggaW50byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgd2hpY2ggaXMgdGhlCi0JCSBlbnRyeSBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sIHRoYXQgaXMgbm90Ci0JCSByZWZlcmVuY2VkIHdpdGhpbiB0aGUgc2FtZSBvYmplY3QuICAqLwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKSArIDE7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfR09UU1lNOgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keDsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19ISVBBR0VOTzoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGctPmxvY2FsX2dvdG5vIC0gTUlQU19SRVNFUlZFRF9HT1ROTzsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19STERfTUFQOgotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19PUFRJT05TOgotCSAgICAgIHMgPSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JCSAgIChvdXRwdXRfYmZkLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19NU1lNOgotCSAgICAgIHMgPSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JCSAgIChvdXRwdXRfYmZkLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBiZSBmaWxsZWQgYXQKLSAgICAgcnVudGltZS4gVGhlIHNlY29uZCBlbnRyeSB3aWxsIGJlIHVzZWQgYnkgc29tZSBydW50aW1lIGxvYWRlcnMuCi0gICAgIFRoaXMgaXNuJ3QgdGhlIGNhc2Ugb2YgSXJpeCBybGQuICovCi0gIGlmIChzZ290ICE9IE5VTEwgJiYgc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDB4ODAwMDAwMDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7Ci0gICAgfQotCi0gIGlmIChzZ290ICE9IE5VTEwpCi0gICAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICB7Ci0gICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgYXNlY3Rpb24gKnNtc3ltOwotICAgIGFzZWN0aW9uICpzOwotICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgIEVsZjMyX2NvbXBhY3RfcmVsIGNwdDsKLQotICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiBTR0kgc2V0cwotICAgICAgIHRoZSBTVFRfTk9UWVBFIGF0dHJpYnV0ZSBmb3IgdGhlc2Ugc3ltYm9scy4gIFNob3VsZCB3ZSBkbyBzbz8gICovCi0KLSAgICBzZHluc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICBzbXN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgICAgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotICAgIGlmIChzZHluc3ltICE9IE5VTEwpCi0gICAgICB7Ci0jaWYgMAotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqIGNvbnN0ICogbmFtZXAgPSBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzOwotCXVuc2lnbmVkIGludCBpOwotCWJmZF92bWEgbGFzdDsKLQlsb25nIGRpbmR4OwotCi0JLyogV2Ugbm8gbG9uZ2VyIHRyeSB0byByZXN0cmljdCB0aGUgc2V0IG9mIHNlY3Rpb25zIHdoaWNoIGdldAotICAgICAgICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBzaW5jZSBpdCBmYWlscyBpZiB3ZSBoYXZlCi0gICAgICAgICAgIG90aGVyIHJhbmRvbSBzZWN0aW9ucyB3aGljaCBuZWVkIGR5bmFtaWMgcmVsb2NhdGlvbnMuICAqLwotCWlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLQkgIHsKLQkgICAgc3ltLnN0X3NpemUgPSAwOwotCSAgICBzeW0uc3RfbmFtZSA9IDA7Ci0JICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX05PVFlQRSk7Ci0JICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLQkgICAgaSA9IDA7Ci0JICAgIGxhc3QgPSAwOwotCSAgICBkaW5keCA9IDA7Ci0JICAgIHdoaWxlICgobmFtZSA9ICpuYW1lcCsrKSAhPSBOVUxMKQotCSAgICAgIHsKLQkJcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkJaWYgKHMgIT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7Ci0JCSAgICBkaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4OwotCQkgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBzeW0uc3RfdmFsdWUgPSBsYXN0OwotCQkgICAgZGluZHgrKzsKLQkJICB9Ci0KLQkJc3ltLnN0X3NobmR4ID0gKGkgPCBNSVBTX1RFWFRfRFlOU1lNX1NFQ05PCi0JCQkJPyBTSE5fTUlQU19URVhUCi0JCQkJOiBTSE5fTUlQU19EQVRBKTsKLQkJKytpOwotCQlzeW0uc3RfbmFtZSA9Ci0JCSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bV9zZWNfc3RyaW5kZXhbZGluZHhdOwotCi0JCWJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZzeW0sCi0JCQkJCSAgICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBkaW5keCkpOwotCSAgICAgIH0KLQotCSAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8KLQkgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQkgICAgICBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVM7Ci0JICB9Ci0JZWxzZQotI2VuZGlmIC8qIDAgKi8KLQkgIHsKLQkgICAgRWxmMzJfSW50ZXJuYWxfTXN5bSBtc3ltOwotCi0JICAgIHN5bS5zdF9zaXplID0gMDsKLQkgICAgc3ltLnN0X25hbWUgPSAwOwotCSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLQkgICAgc3ltLnN0X290aGVyID0gMDsKLQotCSAgICBtc3ltLm1zX2hhc2hfdmFsdWUgPSAwOwotCSAgICBtc3ltLm1zX2luZm8gPSBFTEYzMl9NU19JTkZPICgwLCAxKTsKLQotCSAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgICB7Ci0JCWludCBpbmR4OwotCQlsb25nIGR5bmluZHg7Ci0KLQkJc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JCWluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JCUJGRF9BU1NFUlQgKGluZHggPiAwKTsKLQkJc3ltLnN0X3NobmR4ID0gaW5keDsKLQkJCi0JCWR5bmluZHggID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHg7Ci0KLQkJYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAKLQkJICAob3V0cHV0X2JmZCwgJnN5bSwKLQkJICAgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkgICAgKyBkeW5pbmR4KSk7Ci0JCQotCQlpZiAoc21zeW0pCi0JCSAgYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9vdXQgCi0JCSAgICAob3V0cHV0X2JmZCwgJm1zeW0sCi0JCSAgICAgKCgoRWxmMzJfRXh0ZXJuYWxfTXN5bSAqKSBzbXN5bS0+Y29udGVudHMpCi0JCSAgICAgICsgZHluaW5keCkpOwotCSAgICAgIH0KLQotCSAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8KLQkgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQkgICAgICBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpICsgMTsKLQkgIH0KLSAgICAgIH0KLQotICAgIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLSAgICAgIHsKLQkvKiBXcml0ZSAuY29tcGFjdF9yZWwgc2VjdGlvbiBvdXQuICAqLwotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbXBhY3RfcmVsIik7Ci0JaWYgKHMgIT0gTlVMTCkKLQkgIHsKLQkgICAgY3B0LmlkMSA9IDE7Ci0JICAgIGNwdC5udW0gPSBzLT5yZWxvY19jb3VudDsKLQkgICAgY3B0LmlkMiA9IDI7Ci0JICAgIGNwdC5vZmZzZXQgPSAocy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MKLQkJCSAgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKSk7Ci0JICAgIGNwdC5yZXNlcnZlZDAgPSAwOwotCSAgICBjcHQucmVzZXJ2ZWQxID0gMDsKLQkgICAgYmZkX2VsZjMyX3N3YXBfY29tcGFjdF9yZWxfb3V0IChvdXRwdXRfYmZkLCAmY3B0LAotCQkJCQkgICAgKChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCAqKQotCQkJCQkgICAgIHMtPmNvbnRlbnRzKSk7Ci0KLQkgICAgLyogQ2xlYW4gdXAgYSBkdW1teSBzdHViIGZ1bmN0aW9uIGVudHJ5IGluIC50ZXh0LiAgKi8KLQkgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCQkgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotCSAgICBpZiAocyAhPSBOVUxMKQotCSAgICAgIHsKLQkJZmlsZV9wdHIgZHVtbXlfb2Zmc2V0OwotCi0JCUJGRF9BU1NFUlQgKHMtPl9yYXdfc2l6ZSA+PSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0JCWR1bW15X29mZnNldCA9IHMtPl9yYXdfc2l6ZSAtIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCQltZW1zZXQgKHMtPmNvbnRlbnRzICsgZHVtbXlfb2Zmc2V0LCAwLAotCQkJTUlQU19GVU5DVElPTl9TVFVCX1NJWkUpOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIENsZWFuIHVwIGEgZmlyc3QgcmVsb2NhdGlvbiBpbiAucmVsLmR5bi4gICovCi0gICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOwotICAgIGlmIChzICE9IE5VTEwgJiYgcy0+X3Jhd19zaXplID4gMCkKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBiZmRfZ2VuZXJpY19nZXRfLi4uIGV4Y2VwdCB0aGF0IHNvbWUKLSAgIE1JUFMgcmVsb2NhdGlvbnMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFNpZ2guICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJICAgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkgKFBUUikgZGF0YSwKLQkJCQkgMCwKLQkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSdyZSBub3QgcmVsYXhpbmcgdGhlIHNlY3Rpb24sIHNvIGp1c3QgY29weSB0aGUgc2l6ZSBpbmZvICovCi0gIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcGFyZW50OwotICAgICAgLyogZm9yIG1pcHMgKi8KLSAgICAgIGludCBncF9mb3VuZDsKLSAgICAgIGJmZF92bWEgZ3AgPSAweDEyMzQ1Njc4OwkvKiBpbml0aWFsaXplIGp1c3QgdG8gc2h1dCBnY2MgdXAgKi8KLQotICAgICAgewotCXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbGg7Ci0JLyogU2tpcCBhbGwgdGhpcyBzdHVmZiBpZiB3ZSBhcmVuJ3QgbWl4aW5nIGZvcm1hdHMuICAqLwotCWlmIChhYmZkICYmIGlucHV0X2JmZAotCSAgICAmJiBhYmZkLT54dmVjID09IGlucHV0X2JmZC0+eHZlYykKLQkgIGxoID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIGggPSBiZmRfaGFzaF9sb29rdXAgKCZsaW5rX2luZm8tPmhhc2gtPnRhYmxlLCAiX2dwIiwgZmFsc2UsIGZhbHNlKTsKLQkgICAgbGggPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkgIH0KLSAgICAgIGxvb2t1cDoKLQlpZiAobGgpCi0JICB7Ci0JICAgIHN3aXRjaCAobGgtPnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCQlncF9mb3VuZCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCQlncF9mb3VuZCA9IDE7Ci0JCWdwID0gbGgtPnUuZGVmLnZhbHVlOwotCQlicmVhazsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0JCWxoID0gbGgtPnUuaS5saW5rOwotCQkvKiBAQEZJWE1FICBpZ25vcmluZyB3YXJuaW5nIGZvciBub3cgKi8KLQkJZ290byBsb29rdXA7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLQkgICAgICBkZWZhdWx0OgotCQlhYm9ydCAoKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgZ3BfZm91bmQgPSAwOwotICAgICAgfQotICAgICAgLyogZW5kIG1pcHMgKi8KLSAgICAgIGZvciAocGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50ICE9IChhcmVsZW50ICopIE5VTEw7Ci0JICAgcGFyZW50KyspCi0JewotCSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotCSAgLyogU3BlY2lmaWMgdG8gTUlQUzogRGVhbCB3aXRoIHJlbG9jYXRpb24gdHlwZXMgdGhhdCByZXF1aXJlCi0JICAgICBrbm93aW5nIHRoZSBncCBvZiB0aGUgb3V0cHV0IGJmZC4gICovCi0JICBhc3ltYm9sICpzeW0gPSAqKCpwYXJlbnQpLT5zeW1fcHRyX3B0cjsKLQkgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgYWJmZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBzcGVjaWFsX2Z1bmN0aW9uIHdvdWxkbid0IGdldCBjYWxsZWQgYW55d2F5cy4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKCFncF9mb3VuZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBncCBpc24ndCB0aGVyZTsgbGV0IHRoZSBzcGVjaWFsIGZ1bmN0aW9uIGNvZGUKLQkJIGZhbGwgb3ZlciBvbiBpdHMgb3duLiAgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoKCpwYXJlbnQpLT5ob3d0by0+c3BlY2lhbF9mdW5jdGlvbgotCQkgICA9PSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpCi0JICAgIHsKLQkgICAgICAvKiBieXBhc3Mgc3BlY2lhbF9mdW5jdGlvbiBjYWxsICovCi0JICAgICAgciA9IGdwcmVsMTZfd2l0aF9ncCAoaW5wdXRfYmZkLCBzeW0sICpwYXJlbnQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgcmVsb2NhdGVhYmxlLCAoUFRSKSBkYXRhLCBncCk7Ci0JICAgICAgZ290byBza2lwX2JmZF9wZXJmb3JtX3JlbG9jYXRpb247Ci0JICAgIH0KLQkgIC8qIGVuZCBtaXBzIHNwZWNpZmljIHN0dWZmICovCi0KLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKnBhcmVudCwKLQkJCQkgICAgICAoUFRSKSBkYXRhLAotCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTCwKLQkJCQkgICAgICAmZXJyb3JfbWVzc2FnZSk7Ci0Jc2tpcF9iZmRfcGVyZm9ybV9yZWxvY2F0aW9uOgotCi0JICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzICovCi0JICAgICAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSAqcGFyZW50OwotCSAgICAgIG9zLT5yZWxvY19jb3VudCsrOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkJICBCRkRfQVNTRVJUIChlcnJvcl9tZXNzYWdlICE9IChjaGFyICopIE5VTEwpOwotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJCShsaW5rX2luZm8sIGVycm9yX21lc3NhZ2UsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSAoKnBhcmVudCktPmhvd3RvLT5uYW1lLCAoKnBhcmVudCktPmFkZGVuZCwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBlbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotDAotLyogRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUKLSAgIC5tZGVidWcgc2VjdGlvbiwgd2hpY2ggaXMgaW4gdGhlIEVDT0ZGIGRlYnVnZ2luZyBmb3JtYXQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwIG1pcHNfZWxmMzJfZWNvZmZfZGVidWdfc3dhcCA9Ci17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpY1N5bSwKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICA0LAotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX2luLAotICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gIGVjb2ZmX3N3YXBfc3ltX2luLAotICBlY29mZl9zd2FwX29wdF9pbiwKLSAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gIGVjb2ZmX3N3YXBfcmZkX2luLAotICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICBlY29mZl9zd2FwX29wdF9vdXQsCi0gIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCi19OwotDAotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWxpdHRsZW1pcHMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1iaWdtaXBzIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX21pcHMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTUlQUwotCi0vKiBUaGUgU1ZSNCBNSVBTIEFCSSBzYXlzIHRoYXQgdGhpcyBzaG91bGQgYmUgMHgxMDAwMCwgYnV0IElyaXggNSB1c2VzCi0gICBhIHZhbHVlIG9mIDB4MTAwMCwgYW5kIHdlIGFyZSBjb21wYXRpYmxlLiAgKi8KLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxMDAwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY29sbGVjdAkJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vawl0cnVlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwl0cnVlCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQltaXBzX2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCW1pcHNfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbAltaXBzX2VsZl9zeW1faXNfZ2xvYmFsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQltaXBzX2VsZjMyX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCW1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwlfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCW1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgXAotCQkJCQltaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAkmbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLQkJCQkJbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmMzJfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmMzJfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQltaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawltaXBzX2VsZl9maW5hbF9saW5rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCW1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCW1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwltaXBzX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zIFwKLQkJCQkJbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayBcCi0JCQkJCW1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCW1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCW1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawltaXBzX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawltaXBzX2VsZl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCSg0Kk1JUFNfUkVTRVJWRURfR09UTk8pCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1wcGMuYyBiL2JmZC9lbGYzMi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2MWE3Yy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODUzICswLDAgQEAKLS8qIFBvd2VyUEMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gYSBwcmVsaW1pbmFyeSBQb3dlclBDIEVMRiBBQkkuICBUaGUKLSAgIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdGhlIGZpbmFsIFBvd2VyUEMgRUxGIEFCSS4gIEl0IGluY2x1ZGVzCi0gICBzdWdnZXN0aW9ucyBmcm9tIHRoZSBpbi1wcm9ncmVzcyBFbWJlZGRlZCBQb3dlclBDIEFCSSwgYW5kIHRoYXQKLSAgIGluZm9ybWF0aW9uIG1heSBhbHNvIG5vdCBtYXRjaC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9wcGMuaCIKLQotI2RlZmluZSBVU0VfUkVMQQkJLyogd2Ugd2FudCBSRUxBIHJlbG9jYXRpb25zLCBub3QgUkVMICovCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqY2FjaGVfcHRyLCBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfaG93dG9faW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1zdGF0aWMgaW50IHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkciBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJICBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci0KLXN0YXRpYyBlbGZfbGlua2VyX3NlY3Rpb25fdCAqcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0pKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9jaGVja19yZWxvY3MgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICBhc2VjdGlvbiAqLAotCQkJCQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIGFzZWN0aW9uICogcHBjX2VsZl9nY19tYXJrX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCQlFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLAotCQkJCQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JCQkJCQlFbGZfSW50ZXJuYWxfU3ltICpzeW0pKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9nY19zd2VlcF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgICAgIGFzZWN0aW9uICpzZWMsCi0JCQkJCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGp1c3RfZHluaW5keCBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkJIGJmZCAqLAotCQkJCQkJIGFzZWN0aW9uICosCi0JCQkJCQkgYmZkX2J5dGUgKiwKLQkJCQkJCSBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzLAotCQkJCQkJIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JCQkJCQkgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sgIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCQkJIGNvbnN0IGNoYXIgKiosCi0JCQkJCQkgZmxhZ3dvcmQgKiwKLQkJCQkJCSBhc2VjdGlvbiAqKiwKLQkJCQkJCSBiZmRfdm1hICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgQlJBTkNIX1BSRURJQ1RfQklUIDB4MjAwMDAwCQkvKiBicmFuY2ggcHJlZGljdGlvbiBiaXQgZm9yIGJyYW5jaCB0YWtlbiByZWxvY3MgKi8KLSNkZWZpbmUgUkFfUkVHSVNURVJfTUFTSyAweDAwMWYwMDAwCQkvKiBtYXNrIHRvIHNldCBSQSBpbiBtZW1vcnkgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFJBX1JFR0lTVEVSX1NISUZUIDE2CQkJLyogdmFsdWUgdG8gc2hpZnQgcmVnaXN0ZXIgYnkgdG8gaW5zZXJ0IFJBICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotLyogVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGx0IHJlc2VydmVkIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotI2RlZmluZSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFIDcyCi0vKiBUaGUgc2l6ZSBvZiB0aGUgZ2FwIGJldHdlZW4gZW50cmllcyBpbiB0aGUgUExULiAgKi8KLSNkZWZpbmUgUExUX1NMT1RfU0laRSA4Ci0vKiBUaGUgbnVtYmVyIG9mIHNpbmdsZS1zbG90IFBMVCBlbnRyaWVzICh0aGUgcmVzdCB1c2UgdHdvIHNsb3RzKS4gICovCi0jZGVmaW5lIFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMgODE5MgotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClSX1BQQ19tYXggXTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2VsZl9ob3d0b19yYXdbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfUFBDX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9QUENfQUREUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAyNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgotICAgICBGSVhNRTogd2UgZG9uJ3QgY2hlY2sgdGhhdCwgd2UganVzdCBjbGVhciB0aGVtLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjI0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCByZWxvY2F0aW9uIHdpdGhvdXQgb3ZlcmZsb3cuICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIG9yZGVyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MsIHBsdXMgMSBpZiB0aGUgY29udGVudHMgb2YKLSAgICAgdGhlIGxvdyAxNiBiaXRzLCB0cmVhdGVkIGFzIGEgc2lnbmVkIG51bWJlciwgaXMgbmVnYXRpdmUuCSovCi0gIEhPV1RPIChSX1BQQ19BRERSMTZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2g7IHRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlIHplcm8uCi0gICAgIEZJWE1FOiB3ZSBkb24ndCBjaGVjayB0aGF0LCB3ZSBqdXN0IGNsZWFyIHRoZW0uICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2gsIGZvciB3aGljaCBiaXQgMTAgc2hvdWxkIGJlIHNldCB0bwotICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uCVRoZSBsb3dlciB0d28KLSAgICAgYml0cyBtdXN0IGJlIHplcm8uCSAqLwotICBIT1dUTyAoUl9QUENfQUREUjE0X0JSVEFLRU4sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0X0JSVEFLRU4iLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMTYgYml0IGJyYW5jaCwgZm9yIHdoaWNoIGJpdCAxMCBzaG91bGQgYmUgc2V0IHRvCi0gICAgIGluZGljYXRlIHRoYXQgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIKLSAgICAgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNF9CUk5UQUtFTiwgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTRfQlJOVEFLRU4iLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgkgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4JICovCi0gIEhPV1RPIChSX1BQQ19SRUwxNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMTQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2guCUJpdCAxMCBzaG91bGQgYmUgc2V0IHRvIGluZGljYXRlIHRoYXQKLSAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbi4gIFRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlCi0gICAgIHplcm8uICAqLwotICBIT1dUTyAoUl9QUENfUkVMMTRfQlJUQUtFTiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwxNF9CUlRBS0VOIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2guCUJpdCAxMCBzaG91bGQgYmUgc2V0IHRvIGluZGljYXRlIHRoYXQKLSAgICAgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIgdHdvIGJpdHMgbXVzdAotICAgICBiZSB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDE0X0JSTlRBS0VOLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTDE0X0JSTlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2LCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yIHRoZQotICAgICBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0xPLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTZfTE8sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEksIGJ1dCByZWZlcnJpbmcgdG8gdGhlIEdPVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19HT1QxNl9ISSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTZfSEkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCSAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9IQSwgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dPVDE2X0hBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX1JFTDI0LCBidXQgcmVmZXJyaW5nIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotICAgICBlbnRyeSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFRSRUwyNCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUUkVMMjQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgaXMgdXNlZCBvbmx5IGJ5IHRoZSBkeW5hbWljIGxpbmtlci4gIFRoZSBzeW1ib2wgc2hvdWxkIGV4aXN0Ci0gICAgIGJvdGggaW4gdGhlIG9iamVjdCBiZWluZyBydW4gYW5kIGluIHNvbWUgc2hhcmVkIGxpYnJhcnkuICBUaGUKLSAgICAgZHluYW1pYyBsaW5rZXIgY29waWVzIHRoZSBkYXRhIGFkZHJlc3NlZCBieSB0aGUgc3ltYm9sIGZyb20gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGludG8gdGhlIG9iamVjdCwgYmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nCi0gICAgIHJ1biBoYXMgdG8gaGF2ZSB0aGUgZGF0YSBhdCBzb21lIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX1BQQ19DT1BZLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQ09QWSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMzIsIGJ1dCB1c2VkIHdoZW4gc2V0dGluZyBnbG9iYWwgb2Zmc2V0IHRhYmxlCi0gICAgIGVudHJpZXMuICAqLwotICBIT1dUTyAoUl9QUENfR0xPQl9EQVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dMT0JfREFUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTWFya3MgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBmb3IgYSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfSk1QX1NMT1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0pNUF9TTE9UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBXaGVuIHRoZSBvYmplY3QgaXMgcnVuLCB0aGlzCi0gICAgIGxvbmd3b3JkIGlzIHNldCB0byB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBvYmplY3QsIHBsdXMgdGhlCi0gICAgIGFkZGVuZC4gICovCi0gIEhPV1RPIChSX1BQQ19SRUxBVElWRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMQVRJVkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX1JFTDI0LCBidXQgdXNlcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB3aXRoaW4gdGhlCi0gICAgIG9iamVjdCByYXRoZXIgdGhhbiB0aGUgZmluYWwgdmFsdWUuICBOb3JtYWxseSB1c2VkIGZvcgotICAgICBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICAqLwotICBIT1dUTyAoUl9QUENfTE9DQUwyNFBDLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0xPQ0FMMjRQQyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMzIsIGJ1dCBtYXkgYmUgdW5hbGlnbmVkLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1VBRERSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1VBRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNiwgYnV0IG1heSBiZSB1bmFsaWduZWQuICAqLwotICBIT1dUTyAoUl9QUENfVUFERFIxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfVUFERFIxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IFBDIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX1BQQ19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgcmVsb2NhdGlvbiB0byB0aGUgc3ltYm9sJ3MgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICAgIEZJWE1FOiBub3Qgc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9QUENfUExUMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB0byB0aGUgc3ltYm9sJ3MgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICAgIEZJWE1FOiBub3Qgc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9QUENfUExUUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFRSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9MTywgYnV0IHJlZmVycmluZyB0byB0aGUgUExUIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hJLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBQTFQgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEEsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIFBMVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFQxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQxNl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzaWduLWV4dGVuZGVkIDE2IGJpdCB2YWx1ZSByZWxhdGl2ZSB0byBfU0RBX0JBU0VfLCBmb3IgdXNlIHdpdGgKLSAgICAgc21hbGwgZGF0YSBpdGVtcy4gICovCi0gIEhPV1RPIChSX1BQQ19TREFSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0RBUkVMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gIEhPV1RPIChSX1BQQ19TRUNUT0ZGLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYtYml0IGxvd2VyIGhhbGYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRl9MTywJICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYtYml0IHVwcGVyIGhhbGYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRl9ISSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCB1cHBlciBoYWxmIGFkanVzdGVkIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGZyb20gdGhlIEVtYmVkZGVkIEVMRiBBQkksIGFuZCBhcmUgbm90Ci0gICAgIGluIHRoZSBTVlI0IEVMRiBBQkkuICAqLwotCi0gIC8qIDMyIGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHZhbHVlIHJlc3VsdGluZyBmcm9tIHRoZSBhZGRlbmQgbWludXMgdGhlIHN5bWJvbCAqLwotICBIT1dUTyAoUl9QUENfRU1CX05BRERSMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfQUREUjE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbWludXMgdGhlIHN5bWJvbCAqLwotICBIT1dUTyAoUl9QUENfRU1CX05BRERSMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTZfSEkiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIG9yZGVyIDE2IGJpdHMgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWRkZW5kIG1pbnVzIHRoZSBhZGRyZXNzLAotICAgICBwbHVzIDEgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb3cgMTYgYml0cywgdHJlYXRlZCBhcyBhIHNpZ25lZCBudW1iZXIsCi0gICAgIGlzIG5lZ2F0aXZlLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTZfSEEiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhbGxvY2F0aW5nIGEgNCBieXRlIHdvcmQgdG8gaG9sZCBhbgotICAgICBhZGRyZXNzIGluIHRoZSAuc2RhdGEgc2VjdGlvbiwgYW5kIHJldHVybmluZyB0aGUgb2Zmc2V0IGZyb20KLSAgICAgX1NEQV9CQVNFXyBmb3IgdGhhdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBSTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREFJMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhbGxvY2F0aW5nIGEgNCBieXRlIHdvcmQgdG8gaG9sZCBhbgotICAgICBhZGRyZXNzIGluIHRoZSAuc2RhdGEyIHNlY3Rpb24sIGFuZCByZXR1cm5pbmcgdGhlIG9mZnNldCBmcm9tCi0gICAgIF9TREEyX0JBU0VfIGZvciB0aGF0IHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9TREEySTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEySTE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHNpZ24tZXh0ZW5kZWQgMTYgYml0IHZhbHVlIHJlbGF0aXZlIHRvIF9TREEyX0JBU0VfLCBmb3IgdXNlIHdpdGgKLSAgICAgc21hbGwgZGF0YSBpdGVtcy4JICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMlJFTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1NEQTJSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlbG9jYXRlIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8gb3IgX1NEQTJfQkFTRV8sIGZpbGxpbmcgaW4gdGhlIDE2IGJpdAotICAgICBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJhc2UsIGFuZCBmaWxsaW5nIGluIHRoZSByZWdpc3RlcgotICAgICBmaWVsZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAoMCwgMiwgb3IgMTMpLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9TREEyMSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1NEQTIxIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfTVJLUkVGICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTRUMxNiAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU1RfTE8gKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX1JFTFNUX0hJICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTVF9IQSAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfQklUX0ZMRCAqLwotCi0gIC8qIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gYWdhaW5zdCBlaXRoZXIgX1NEQV9CQVNFXyBvciBfU0RBMl9CQVNFXywgZmlsbGluZwotICAgICBpbiB0aGUgMTYgYml0IHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgYmFzZSwgYW5kIGZpbGxpbmcgaW4gdGhlCi0gICAgIHJlZ2lzdGVyIGZpZWxkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyICgwLCAyLCBvciAxMykuICAqLwotICBIT1dUTyAoUl9QUENfRU1CX1JFTFNEQSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfUkVMU0RBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9QUENfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9QUENfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFBob255IHJlbG9jIHRvIGhhbmRsZSBBSVggc3R5bGUgVE9DIGVudHJpZXMgKi8KLSAgSE9XVE8gKFJfUFBDX1RPQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfVE9DMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLQwKLS8qIEluaXRpYWxpemUgdGhlIHBwY19lbGZfaG93dG9fdGFibGUsIHNvIHRoYXQgbGluZWFyIGFjY2Vzc2VzIGNhbiBiZSBkb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lbGZfaG93dG9faW5pdCAoKQotewotICB1bnNpZ25lZCBpbnQgaSwgdHlwZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwcGNfZWxmX2hvd3RvX3JhdykgLyBzaXplb2YgKHBwY19lbGZfaG93dG9fcmF3WzBdKTsgaSsrKQotICAgIHsKLSAgICAgIHR5cGUgPSBwcGNfZWxmX2hvd3RvX3Jhd1tpXS50eXBlOwotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IHNpemVvZihwcGNfZWxmX2hvd3RvX3RhYmxlKSAvIHNpemVvZihwcGNfZWxmX2hvd3RvX3RhYmxlWzBdKSk7Ci0gICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlW3R5cGVdID0gJnBwY19lbGZfaG93dG9fcmF3W2ldOwotICAgIH0KLX0KLQotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciB0aGUgUFBDIHdpdGggb3B0aW9uIC0tbXBjODYwYzBbPTxuPl0uCi0KLSAgIFRoZSBNUEM4NjAsIHJldmlzaW9uIEMwIG9yIGVhcmxpZXIgY29udGFpbnMgYSBidWcgaW4gdGhlIGRpZS4KLSAgIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWUsIHRoZSBuZXh0IGluc3RydWN0aW9uCi0gICB0byBiZSBleGVjdXRlZCAqbWF5KiBiZSB0cmVhdGVkIGFzIGEgbm8tb3AuCi0gICAxLyBBIGZvcndhcmQgYnJhbmNoIGlzIGV4ZWN1dGVkLgotICAgMi8gVGhlIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90IHRha2VuLgotICAgMy8gVGhlIGJyYW5jaCBpcyB0YWtlbi4KLSAgIDQvIFRoZSBicmFuY2ggaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCA1IHdvcmRzIG9mIGEgcGFnZS4KLSAgICAgIChUaGUgRU9QIGxpbWl0IGlzIDUgYnkgZGVmYXVsdCBidXQgbWF5IGJlIHNwZWNpZmllZCBhcyBhbnkgdmFsdWUgZnJvbSAxLTEwLikKLSAgIAotICAgT3VyIHNvZnR3YXJlIHNvbHV0aW9uIGlzIHRvIGRldGVjdCB0aGVzZSBwcm9ibGVtYXRpYyBicmFuY2hlcyBpbiBhCi0gICBsaW5rZXIgcGFzcyBhbmQgbW9kaWZ5IHRoZW0gYXMgZm9sbG93czoKLSAgIDEvIFVuY29uZGl0aW9uYWwgYnJhbmNoZXMgLSBTaW5jZSB0aGVzZSBhcmUgYWx3YXlzIHByZWRpY3RlZCB0YWtlbiwKLSAgICAgIHRoZXJlIGlzIG5vIHByb2JsZW0gYW5kIG5vIGFjdGlvbiBpcyByZXF1aXJlZC4KLSAgIDIvIENvbmRpdGlvbmFsIGJhY2t3YXJkIGJyYW5jaGVzIC0gTm8gcHJvYmxlbSwgbm8gYWN0aW9uIHJlcXVpcmVkLgotICAgMy8gQ29uZGl0aW9uYWwgZm9yd2FyZCBicmFuY2hlcyAtIEVuc3VyZSB0aGF0IHRoZSAiaW52ZXJzZSBwcmVkaWN0aW9uCi0gICAgICBiaXQiIGlzIHNldCAoZW5zdXJlIGl0IGlzIHByZWRpY3RlZCB0YWtlbikuCi0gICA0LyBDb25kaXRpb25hbCByZWdpc3RlciBicmFuY2hlcyAtIEVuc3VyZSB0aGF0IHRoZSAieSBiaXQiIGlzIHNldAotICAgICAgKGVuc3VyZSBpdCBpcyBwcmVkaWN0ZWQgdGFrZW4pLgotKi8KLQotLyogU29ydCBzZWN0aW9ucyBieSBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGludAotcHBjX2VsZl9zb3J0X3JlbGEgKGFyZzEsIGFyZzIpCi0gICAgY29uc3Qgdm9pZCAqYXJnMTsKLSAgICBjb25zdCB2b2lkICphcmcyOwotewotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGExID0gKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhKiopIGFyZzE7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICoqcmVsYTIgPSAoY29uc3QgRWxmX0ludGVybmFsX1JlbGEqKikgYXJnMjsKLQotICAvKiBTb3J0IGJ5IG9mZnNldC4gKi8KLSAgcmV0dXJuICgoKnJlbGExKS0+cl9vZmZzZXQgLSAoKnJlbGEyKS0+cl9vZmZzZXQpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBpc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgIGJmZCAqYWJmZDsKLSAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgIGJvb2xlYW4gKmFnYWluOwotewotI2RlZmluZSBQQUdFU0laRSAweDEwMDAKLQotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGFfY29tYiA9IE5VTEw7Ci0gIGludCBjb21iX2N1cnIsIGNvbWJfY291bnQ7Ci0KLSAgLyogV2UgbmV2ZXIgaGF2ZSB0byBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIHBlciBpbnB1dCBzZWN0aW9uLiAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBJZiBuZWVkZWQsIGluaXRpYWxpemUgdGhpcyBzZWN0aW9uJ3MgY29va2VkIHNpemUuICAqLwotICBpZiAoaXNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgICBpc2VjLT5fY29va2VkX3NpemUgPSBpc2VjLT5fcmF3X3NpemU7Ci0KLSAgLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIHRleHQgc2VjdGlvbnMgd2hpY2ggb3ZlcmxhcCB0aGUKLSAgdHJvdWJsZXNvbWUgYXJlYSBhdCB0aGUgZW5kIG9mIGEgcGFnZS4gKi8KLSAgaWYgKGxpbmtfaW5mby0+bXBjODYwYzAgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0NPREUpICYmIGlzZWMtPl9jb29rZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGRvdCwgZW5kX3BhZ2UsIGVuZF9zZWN0aW9uOwotICAgICAgYm9vbGVhbiBzZWN0aW9uX21vZGlmaWVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICovCi0gICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGlzZWMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpc2VjLCBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIGlzZWMtPl9yYXdfc2l6ZSkpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBjb21iX2N1cnIgPSAwOwotICAgICAgY29tYl9jb3VudCA9IDA7Ci0gICAgICBpZiAoaXNlYy0+cmVsb2NfY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBuOwotCi0gICAgICAgICAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgICAgICBpbnRlcm5hbF9yZWxvY3MgPSBfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MgKAotICAgIAkgICAgYWJmZCwgaXNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIAotICAgIAkgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSk7Ci0gICAgICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIAkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIAkgICAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAKLSAgICAgICAgICAvKiBTZXR1cCBhIGZhc3RlciBhY2Nlc3MgbWV0aG9kIGZvciB0aGUgcmVsb2MgaW5mbyB3ZSBuZWVkLiAqLwotICAgICAgICAgIHJlbGFfY29tYiA9IChFbGZfSW50ZXJuYWxfUmVsYSoqKQotCSAgICBiZmRfbWFsbG9jIChpc2VjLT5yZWxvY19jb3VudCpzaXplb2YoRWxmX0ludGVybmFsX1JlbGEqKSk7Ci0gICAgICAgICAgaWYgKHJlbGFfY29tYiA9PSBOVUxMKQotICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICBmb3IgKG49MDsgbjxpc2VjLT5yZWxvY19jb3VudDsgKytuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsb25nIHJfdHlwZTsKLSAgICAKLSAgICAgICAgICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpbnRlcm5hbF9yZWxvY3Nbbl0ucl9pbmZvKTsKLSAgICAgICAgICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpUl9QUENfbWF4KQotICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgCi0gICAgICAgICAgICAgIC8qIFByb2xvZ3VlIGNvbnN0YW50cyBhcmUgc29tZXRpbWVzIHByZXNlbnQgaW4gdGhlICIudGV4dCIKLSAgICAgICAgICAgICAgc2VjdGlvbnMgYW5kIHRoZXkgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYXNzb2NpYXRlZCByZWxvY2F0aW9uLgotICAgICAgICAgICAgICBXZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgdGhvc2Ugd29yZHMgYW5kIHNvbWUgb3RoZXJzIHdoaWNoCi0gICAgICAgICAgICAgIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgcmVsb2NhdGlvbnMuICBIb3dldmVyLCBub3QgYWxsCi0gICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHdpbGwgaGF2ZSBhIHJlbG9jYXRpb24gc28gd2Ugd2lsbAotICAgICAgICAgICAgICBvbmx5IGlnbm9yZSB3b3JkcyB0aGF0IDEpIGhhdmUgYSByZWxvYywgYW5kIDIpIHRoZSByZWxvYwotICAgICAgICAgICAgICBpcyBub3QgYXBwbGljYWJsZSB0byBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KLSAgICAgICAgICAgICAgVGhlIGFycmF5IHJlbGFfY29tYiBpcyBidWlsdCBoZXJlIGZvciB1c2UgaW4gdGhlIEVPUCBzY2FuIGxvb3AuICovCi0gICAgICAgICAgICAgIHN3aXRjaCAocl90eXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJfUFBDX0FERFIxNF9CUk5UQUtFTjogICAgIC8qIGFic29sdXRlLCBwcmVkaWN0ZWQgbm90IHRha2VuICovCi0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19SRUwxNDogICAgICAgICAgICAgICAvKiByZWxhdGl2ZSBjb25kLiBici4gKi8KLSAgICAgICAgICAgICAgICBjYXNlIFJfUFBDX1JFTDE0X0JSTlRBS0VOOiAgICAgIC8qIHJlbC4gY29uZC4gYnIuLCBwcmVkaWN0ZWQgbm90IHRha2VuICovCi0gICAgICAgICAgICAgICAgICAvKiBXZSBzaG91bGQgY2hlY2sgdGhlIGluc3RydWN0aW9uLiAqLwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIC8qIFRoZSB3b3JkIGlzIG5vdCBhIGNvbmRpdGlvbmFsIGJyYW5jaCAtIGlnbm9yZSBpdC4gKi8KLSAgICAgICAgICAgICAgICAgIHJlbGFfY29tYltjb21iX2NvdW50KytdID0gJmludGVybmFsX3JlbG9jc1tuXTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29tYl9jb3VudCA+IDEpCi0gICAgICAgICAgICAgIHFzb3J0IChyZWxhX2NvbWIsIChzaXplX3QpIGNvbWJfY291bnQsIHNpemVvZiAoaW50KSwgcHBjX2VsZl9zb3J0X3JlbGEpOwotICAgICAgICB9Ci0KLSAgICAgIC8qIEVudW1lcmF0ZSBlYWNoIEVPUCByZWdpb24gdGhhdCBvdmVybGFwcyB0aGlzIHNlY3Rpb24uICovCi0gICAgICBlbmRfc2VjdGlvbiA9IGlzZWMtPnZtYSArIGlzZWMtPl9jb29rZWRfc2l6ZTsKLSAgICAgIGRvdCA9IGVuZF9wYWdlID0gKGlzZWMtPnZtYSB8IChQQUdFU0laRSAtIDEpKSArIDE7Ci0gICAgICBkb3QgLT0gbGlua19pbmZvLT5tcGM4NjBjMDsKLSAgICAgIHNlY3Rpb25fbW9kaWZpZWQgPSBmYWxzZTsKLSAgICAgIGlmIChkb3QgPCBpc2VjLT52bWEpICAgICAgLyogSW5jcmVtZW50IHRoZSBzdGFydCBwb3NpdGlvbiBpZiB0aGlzIHNlY3Rpb24gKi8KLSAgICAgICAgICBkb3QgPSBpc2VjLT52bWE7ICAgICAgLyogYmVnaW5zIGluIHRoZSBtaWRkbGUgb2YgaXRzIGZpcnN0IEVPUCByZWdpb24uICovCi0gICAgICBmb3IgKDsKLSAgICAgICAgICAgZG90IDwgZW5kX3NlY3Rpb247Ci0gICAgICAgICAgIGRvdCArPSBQQUdFU0laRSwgZW5kX3BhZ2UgKz0gUEFHRVNJWkUpCi0gICAgICAgIHsKLQotICAgICAgICAgIC8qIENoZWNrIGVhY2ggd29yZCBpbiB0aGlzIEVPUCByZWdpb24uICovCi0gICAgICAgICAgZm9yICg7IGRvdCA8IGVuZF9wYWdlOyBkb3QgKz0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmZkX3ZtYSBpc2VjX29mZnNldDsKLSAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgICAgICAgICBib29sZWFuIHNraXAsIG1vZGlmaWVkOwotCi0gICAgICAgICAgICAgIC8qIERvbid0IHByb2Nlc3MgdGhpcyB3b3JkIGlmIHRoZXJlIGlzIGEgcmVsb2NhdGlvbiBmb3IgaXQgYW5kCi0gICAgICAgICAgICAgIHRoZSByZWxvY2F0aW9uIGluZGljYXRlcyB0aGUgd29yZCBpcyBub3QgYSBjb25kaXRpb25hbCBicmFuY2guICovCi0gICAgICAgICAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgaXNlY19vZmZzZXQgPSBkb3QgLSBpc2VjLT52bWE7Ci0gICAgICAgICAgICAgIGZvciAoOyBjb21iX2N1cnI8Y29tYl9jb3VudDsgKytjb21iX2N1cnIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmZkX3ZtYSByX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgcl9vZmZzZXQgPSByZWxhX2NvbWJbY29tYl9jdXJyXS0+cl9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICBpZiAocl9vZmZzZXQgPj0gaXNlY19vZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocl9vZmZzZXQgPT0gaXNlY19vZmZzZXQpIHNraXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc2tpcCkgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGN1cnJlbnQgd29yZCBmb3IgYSBwcm9ibGVtYXRpYyBjb25kaXRpb25hbCBicmFuY2guICovCi0jZGVmaW5lIEJPMChpbnNuKSAoKGluc24pICYgMHgwMjAwMDAwMCkKLSNkZWZpbmUgQk8yKGluc24pICgoaW5zbikgJiAweDAwODAwMDAwKQotI2RlZmluZSBCTzQoaW5zbikgKChpbnNuKSAmIDB4MDAyMDAwMDApCi0gICAgICAgICAgICAgIGluc24gPSAodW5zaWduZWQgbG9uZykgYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBpc2VjX29mZnNldCk7Ci0gICAgICAgICAgICAgIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlmICgoaW5zbiAmIDB4RmMwMDAwMDApID09IDB4NDAwMDAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gaXMgQkN4ICovCi0gICAgICAgICAgICAgICAgICBpZiAoKCFCTzAoaW5zbikgfHwgIUJPMihpbnNuKSkgJiYgIUJPNChpbnNuKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGJmZF92bWEgdGFyZ2V0OwotICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyAibm9ybWFsIi4KLSAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gaW5zbiAmIDB4MDAwMEZmZmM7ICAgICAgICAgICAgICAgLypleHRyYWN0Ki8KLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAodGFyZ2V0IF4gMHg4MDAwKSAtIDB4ODAwMDsgICAgICAvKnNpZ24gZXh0ZW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAweDAwMDAwMDAyKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgKz0gZG90OyAgICAgICAgICAgICAgICAgICAgICAgIC8qY29udmVydCB0byBhYnMqLwotICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPiBkb3QpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoKGluc24gJiAweEZjMDBGZmZlKSA9PSAweDRjMDAwNDIwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDQ1RSeCAqLwotICAgICAgICAgICAgICAgICAgaWYgKCghQk8wKGluc24pIHx8ICFCTzIoaW5zbikpICYmICFCTzQoaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyBub3QtdGFrZW4uCi0JCSAgICAgIElmIHRoaXMgaXMgYSBmb3J3YXJkIGJyYW5jaCwgaXQgaXMgcHJvYmxlbWF0aWMuCi0gICAgICAgICAgICAgICAgICAgICAgU2luY2Ugd2UgY2FuJ3QgdGVsbCBzdGF0aWNhbGx5IGlmIGl0IHdpbGwgYnJhbmNoIGZvcndhcmQsCi0gICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGUgcHJlZGljdGlvbiBiaXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgaW5zbiB8PSAweDAwMjAwMDAwOyAgIC8qIHNldCB0aGUgcHJlZGljdGlvbiBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4RmMwMEZmZmUpID09IDB4NGMwMDAwMjApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gaXMgQkNMUnggKi8KLSAgICAgICAgICAgICAgICAgIGlmICgoIUJPMChpbnNuKSB8fCAhQk8yKGluc24pKSAmJiAhQk80KGluc24pKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90LXRha2VuLgotCQkgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLgotICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGNhbid0IHRlbGwgc3RhdGljYWxseSBpZiBpdCB3aWxsIGJyYW5jaCBmb3J3YXJkLAotICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhlIHByZWRpY3Rpb24gYml0LiAqLwotICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLSN1bmRlZiBCTzAKLSN1bmRlZiBCTzIKLSN1bmRlZiBCTzQKLSAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkKQotCSAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBpc2VjX29mZnNldCk7Ci0JCSAgc2VjdGlvbl9tb2RpZmllZCA9IHRydWU7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGlmIChzZWN0aW9uX21vZGlmaWVkKQotCXsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAocmVsYV9jb21iICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocmVsYV9jb21iKTsKLSAgICAgIHJlbGFfY29tYiA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxhX2NvbWIgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxhX2NvbWIpOwotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotDAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcHBjX3JlbG9jID0gUl9QUENfTk9ORTsKLQotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbUl9QUENfQUREUjMyXSkKLSAgICAvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBzd2l0Y2ggKChpbnQpY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJcHBjX3JlbG9jID0gUl9QUENfTk9ORTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMzI7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkEyNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTRfQlJUQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IyNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDI0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDE0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfR09UMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0xPOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkY6CXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19DT1BZOgkJcHBjX3JlbG9jID0gUl9QUENfQ09QWTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQ6CXBwY19yZWxvYyA9IFJfUFBDX0dMT0JfREFUOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoJcHBjX3JlbG9jID0gUl9QUENfTE9DQUwyNFBDOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlwcGNfcmVsb2MgPSBSX1BQQ19SRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfUExUT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRjoJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgkJcHBjX3JlbG9jID0gUl9QUENfU0RBUkVMMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgkJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGX0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1RPQzE2OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0xPOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hJOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hBOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQUkxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTJJMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREEyUkVMOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTIxOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9NUktSRUY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU0VDMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEk7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQ6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9CSVRfRkxEOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTREE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoJcHBjX3JlbG9jID0gUl9QUENfR05VX1ZUSU5IRVJJVDsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOglwcGNfcmVsb2MgPSBSX1BQQ19HTlVfVlRFTlRSWTsJCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClwcGNfcmVsb2MgXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBQb3dlclBDIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbIFJfUFBDX0FERFIzMiBdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfUFBDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSBwcGNfZWxmX2hvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pXTsKLX0KLQotLyogSGFuZGxlIHRoZSBSX1BQQ19BRERSMTZfSEEgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIHJlbG9jX2VudHJ5LT5hZGRlbmQgKz0gKHJlbG9jYXRpb24gJiAweDgwMDApIDw8IDE7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gc2V0IHdoZXRoZXIgYSBtb2R1bGUgbmVlZHMgdGhlIC1tcmVsb2NhdGFibGUgYml0IHNldC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvbGRfZmxhZ3M7Ci0gIGZsYWd3b3JkIG5ld19mbGFnczsKLSAgYm9vbGVhbiBlcnJvcjsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICptc2c7Ci0KLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaWJmZCkpCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIpOwotICAgICAgZWxzZQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iKTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQkvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotCi0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotCi0gIGVsc2UJCQkJCS8qIEluY29tcGF0aWJsZSBmbGFncyAqLwotICAgIHsKLSAgICAgIC8qIFdhcm4gYWJvdXQgLW1yZWxvY2F0YWJsZSBtaXNtYXRjaC4gIEFsbG93IC1tcmVsb2NhdGFibGUtbGliIHRvIGJlIGxpbmtlZAotICAgICAgICAgd2l0aCBlaXRoZXIuICAqLwotICAgICAgZXJyb3IgPSBmYWxzZTsKLSAgICAgIGlmICgobmV3X2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKSAhPSAwCi0JICAmJiAob2xkX2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKSA9PSAwKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCBub3JtYWxseSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCX0KLSAgICAgIGVsc2UgaWYgKChuZXdfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpID09IDAKLQkgICAgICAgJiYgKG9sZF9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRSkgIT0gMCkKLQl7Ci0JICBlcnJvciA9IHRydWU7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBjb21waWxlZCBub3JtYWxseSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBvdXRwdXQgaXMgLW1yZWxvY2F0YWJsZS1saWIgaWZmIGJvdGggdGhlIGlucHV0IGZpbGVzIGFyZS4gICovCi0gICAgICBpZiAoISAobmV3X2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpCi0JZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgJj0gfkVGX1BQQ19SRUxPQ0FUQUJMRV9MSUI7Ci0KLSAgICAgIC8qIFRoZSBvdXRwdXQgaXMgLW1yZWxvY2F0YWJsZSBpZmYgaXQgY2FuJ3QgYmUgLW1yZWxvY2F0YWJsZS1saWIsCi0gICAgICAgICBidXQgZWFjaCBpbnB1dCBmaWxlIGlzIGVpdGhlciAtbXJlbG9jYXRhYmxlIG9yIC1tcmVsb2NhdGFibGUtbGliLiAgKi8KLSAgICAgIGlmICghIChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpCi0JICAmJiAobmV3X2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfUkVMT0NBVEFCTEUpKQotCSAgJiYgKG9sZF9mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX1JFTE9DQVRBQkxFKSkpCi0JZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFOwotCi0gICAgICAvKiBEbyBub3Qgd2FybiBhYm91dCBlYWJpIHZzLiBWLjQgbWlzbWF0Y2gsIGp1c3Qgb3IgaW4gdGhlIGJpdCBpZiBhbnkgbW9kdWxlIHVzZXMgaXQgKi8KLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IChuZXdfZmxhZ3MgJiBFRl9QUENfRU1CKTsKLQotICAgICAgbmV3X2ZsYWdzICY9IH4gKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfRU1CKTsKLSAgICAgIG9sZF9mbGFncyAmPSB+IChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX0VNQik7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgYW55IG90aGVyIG1pc21hdGNoZXMgKi8KLSAgICAgIGlmIChuZXdfZmxhZ3MgIT0gb2xkX2ZsYWdzKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0JfQotCi0gICAgICBpZiAoZXJyb3IpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogSGFuZGxlIGEgUG93ZXJQQyBzcGVjaWZpYyBzZWN0aW9uIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB3aGVuIGVsZmNvZGUuaCBmaW5kcyBhIHNlY3Rpb24gd2l0aCBhbiB1bmtub3duIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5ld3NlY3QgPSBoZHItPmJmZF9zZWN0aW9uOwotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCk7Ci0gIGlmIChoZHItPnNoX2ZsYWdzICYgU0hGX0VYQ0xVREUpCi0gICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfT1JERVJFRCkKLSAgICBmbGFncyB8PSBTRUNfU09SVF9FTlRSSUVTOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwgZmxhZ3MpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogU2V0IHVwIGFueSBvdGhlciBzZWN0aW9uIGZsYWdzIGFuZCBzdWNoIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIHNoZHIsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKnNoZHI7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLXsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkKLSAgICBzaGRyLT5zaF9mbGFncyB8PSBTSEZfRVhDTFVERTsKLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19TT1JUX0VOVFJJRVMpICE9IDApCi0gICAgc2hkci0+c2hfdHlwZSA9IFNIVF9PUkRFUkVEOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBDcmVhdGUgYSBzcGVjaWFsIGxpbmtlciBzZWN0aW9uICovCi1zdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtIHdoaWNoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaXJzdCBiZmQgc2VjdGlvbiB0aGF0IG5lZWRzIHRoZSBzcGVjaWFsIHNlY3Rpb24gKi8KLSAgaWYgKCFkeW5vYmopCi0gICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUsIGNyZWF0ZSB0aGUgc2VjdGlvbiAqLwotICBsc2VjdCA9IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCk7Ci0gIGlmICghbHNlY3QpCi0gICAgewotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgZGVmYXVsdHM7Ci0gICAgICBzdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgemVyb19zZWN0aW9uOwotCi0gICAgICBkZWZhdWx0cyA9IHplcm9fc2VjdGlvbjsKLSAgICAgIGRlZmF1bHRzLndoaWNoID0gd2hpY2g7Ci0gICAgICBkZWZhdWx0cy5ob2xlX3dyaXR0ZW5fcCA9IGZhbHNlOwotICAgICAgZGVmYXVsdHMuYWxpZ25tZW50ID0gMjsKLQotICAgICAgLyogQm90aCBvZiB0aGVzZSBzZWN0aW9ucyBhcmUgKHRlY2huaWNhbGx5KSBjcmVhdGVkIGJ5IHRoZSB1c2VyCi0JIHB1dHRpbmcgZGF0YSBpbiB0aGVtLCBzbyB0aGV5IHNob3VsZG4ndCBiZSBtYXJrZWQKLQkgU0VDX0xJTktFUl9DUkVBVEVELgotCi0JIFRoZSBsaW5rZXIgY3JlYXRlcyB0aGVtIHNvIGl0IGhhcyBzb21ld2hlcmUgdG8gYXR0YWNoIHRoZWlyCi0JIHJlc3BlY3RpdmUgc3ltYm9scy4gSW4gZmFjdCwgaWYgdGhleSB3ZXJlIGVtcHR5IGl0IHdvdWxkCi0JIGJlIE9LIHRvIGxlYXZlIHRoZSBzeW1ib2wgc2V0IHRvIDAgKG9yIGFueSByYW5kb20gbnVtYmVyKSwgYmVjYXVzZQotCSB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgc2hvdWxkIG5ldmVyIGJlIHVzZWQuICAqLwotICAgICAgZGVmYXVsdHMuZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQl8IFNFQ19JTl9NRU1PUlkpOwotCi0gICAgICBzd2l0Y2ggKHdoaWNoKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVW5rbm93biBzcGVjaWFsIGxpbmtlciB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAoaW50KXdoaWNoKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKLQotCWNhc2UgTElOS0VSX1NFQ1RJT05fU0RBVEE6CS8qIC5zZGF0YS8uc2JzcyBzZWN0aW9uICovCi0JICBkZWZhdWx0cy5uYW1lCQkgID0gIi5zZGF0YSI7Ci0JICBkZWZhdWx0cy5yZWxfbmFtZQkgID0gIi5yZWxhLnNkYXRhIjsKLQkgIGRlZmF1bHRzLmJzc19uYW1lCSAgPSAiLnNic3MiOwotCSAgZGVmYXVsdHMuc3ltX25hbWUJICA9ICJfU0RBX0JBU0VfIjsKLQkgIGRlZmF1bHRzLnN5bV9vZmZzZXQJICA9IDMyNzY4OwotCSAgYnJlYWs7Ci0KLQljYXNlIExJTktFUl9TRUNUSU9OX1NEQVRBMjoJLyogLnNkYXRhMi8uc2JzczIgc2VjdGlvbiAqLwotCSAgZGVmYXVsdHMubmFtZQkJICA9ICIuc2RhdGEyIjsKLQkgIGRlZmF1bHRzLnJlbF9uYW1lCSAgPSAiLnJlbGEuc2RhdGEyIjsKLQkgIGRlZmF1bHRzLmJzc19uYW1lCSAgPSAiLnNic3MyIjsKLQkgIGRlZmF1bHRzLnN5bV9uYW1lCSAgPSAiX1NEQTJfQkFTRV8iOwotCSAgZGVmYXVsdHMuc3ltX29mZnNldAkgID0gMzI3Njg7Ci0JICBkZWZhdWx0cy5mbGFncwkgfD0gU0VDX1JFQURPTkxZOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBsc2VjdCA9IF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgd2hpY2gsICZkZWZhdWx0cyk7Ci0gICAgfQotCi0gIHJldHVybiBsc2VjdDsKLX0KLQotDAotLyogSWYgd2UgaGF2ZSBhIG5vbi16ZXJvIHNpemVkIC5zYnNzMiBvciAuUFBDLkVNQi5zYnNzMCBzZWN0aW9ucywgd2UgbmVlZCB0byBidW1wIHVwCi0gICB0aGUgbnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGludCByZXQ7Ci0KLSAgcmV0ID0gMDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgKytyZXQ7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNic3MyIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAgJiYgcy0+X3Jhd19zaXplID4gMCkKLSAgICArK3JldDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuUFBDLkVNQi5zYnNzMCIpOwotICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgKytyZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogTW9kaWZ5IHRoZSBzZWdtZW50IG1hcCBpZiBuZWVkZWQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgaGF2ZSB0byBjcmVhdGUgLmR5bnNic3MgYW5kIC5yZWxhLnNic3MgaGVyZSBzbyB0aGF0IHRoZXkgZ2V0IG1hcHBlZAotICAgdG8gb3V0cHV0IHNlY3Rpb25zIChqdXN0IGxpa2UgX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgaGFzCi0gICB0byBjcmVhdGUgLmR5bmJzcyBhbmQgLnJlbGEuYnNzKS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyhhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS5zYnNzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLSAgYmZkX3ZtYSBwbHRfb2Zmc2V0OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKCghaW5mby0+c2hhcmVkIHx8IGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JICB8fCAoaW5mby0+c2hhcmVkICYmIGgtPnBsdC5yZWZjb3VudCA8PSAwKSkKLQl7Ci0JICAvKiBBIFBMVCBlbnRyeSBpcyBub3QgcmVxdWlyZWQvYWxsb3dlZCB3aGVuOgotCi0JICAgICAxLiBXZSBhcmUgbm90IHVzaW5nIGxkLnNvOyBiZWNhdXNlIHRoZW4gdGhlIFBMVCBlbnRyeQotCSAgICAgY2FuJ3QgYmUgc2V0IHVwLCBzbyB3ZSBjYW4ndCB1c2Ugb25lLgotCi0JICAgICAyLiBXZSBrbm93IGZvciBjZXJ0YWluIHRoYXQgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbgotCSAgICAgdGhpcyBvYmplY3QsIGJlY2F1c2UgdGhpcyBvYmplY3QgaXMgdGhlIGFwcGxpY2F0aW9uLAotCSAgICAgaXMgbGlua2VkIHdpdGggLUJzeW1ib2xpYywgb3IgYmVjYXVzZSB0aGUgc3ltYm9sIGlzIGxvY2FsLgotCi0JICAgICAzLiBHQyBoYXMgcmVuZGVyZWQgdGhlIGVudHJ5IHVudXNlZC4KLQkgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaW4gYW4gZXhlY3V0YWJsZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUKLQkgICAgIHN5bWJvbCBnbyB0byB0aGUgUExULCBzbyB3ZSBjYW4ndCB0dXJuIGl0IG9mZiBpbiB0aGF0IGNhc2UuCi0JICAgICA/Pz8gVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaGVyZSBpcyB0byByZWZlcmVuY2UgY291bnQKLQkgICAgIGFsbCB1c2VzIG9mIHRoZSBzeW1ib2wsIG5vdCBqdXN0IHRob3NlIHRvIHRoZSBHT1Qgb3IgUExULiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0lOSVRJQUxfRU5UUllfU0laRTsKLQotICAgICAgLyogVGhlIFBvd2VyUEMgUExUIGlzIGFjdHVhbGx5IGNvbXBvc2VkIG9mIHR3byBwYXJ0cywgdGhlIGZpcnN0IHBhcnQKLQkgaXMgMiB3b3JkcyAoZm9yIGEgbG9hZCBhbmQgYSBqdW1wKSwgYW5kIHRoZW4gdGhlcmUgaXMgYSByZW1haW5pbmcKLQkgd29yZCBhdmFpbGFibGUgYXQgdGhlIGVuZC4gICovCi0gICAgICBwbHRfb2Zmc2V0ID0gKFBMVF9JTklUSUFMX0VOVFJZX1NJWkUKLQkJICAgICsgKFBMVF9TTE9UX1NJWkUKLQkJICAgICAgICogKChzLT5fcmF3X3NpemUgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKQotCQkJICAvIFBMVF9FTlRSWV9TSVpFKSkpOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcGx0X29mZnNldDsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBwbHRfb2Zmc2V0OwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICBBZnRlciB0aGUgODE5Mm5kIGVudHJ5LCByb29tCi0gICAgICAgICBmb3IgdHdvIGVudHJpZXMgaXMgYWxsb2NhdGVkLiAgKi8KLSAgICAgIGlmICgocy0+X3Jhd19zaXplIC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkgLyBQTFRfRU5UUllfU0laRQotCSAgPj0gUExUX05VTV9TSU5HTEVfRU5UUklFUykKLQlzLT5fcmF3X3NpemUgKz0gMiAqIFBMVF9FTlRSWV9TSVpFOwotICAgICAgZWxzZQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuCi0KLSAgICAgT2YgY291cnNlLCBpZiB0aGUgc3ltYm9sIGlzIHN1ZmZpY2llbnRseSBzbWFsbCwgd2UgbXVzdCBpbnN0ZWFkCi0gICAgIGFsbG9jYXRlIGl0IGluIC5zYnNzLiAgRklYTUU6IEl0IHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGlzIGlmIGFuZAotICAgICBvbmx5IGlmIHRoZXJlIHdlcmUgYWN0dWFsbHkgU0RBUkVMIHJlbG9jcyBmb3IgdGhhdCBzeW1ib2wuICAqLwotCi0gIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnNic3MiKTsKLSAgZWxzZQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1BQQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWxhLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuc2JzcyIpOwotICAgICAgZWxzZQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKLSAgICBwb3dlcl9vZl90d28gPSA0OwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfYWRqdXN0X2R5bmluZHggKGgsIGNwYXJnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGNwYXJnOwotewotICBpbnQgKmNwID0gKGludCAqKSBjcGFyZzsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfYWRqdXN0X2R5bmluZHggY2FsbGVkLCBoLT5keW5pbmR4ID0gJWQsICpjcCA9ICVkXG4iLCBoLT5keW5pbmR4LCAqY3ApOwotI2VuZGlmCi0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3QsIC5yZWxhLnNkYXRhLCBhbmQKLQkgLnJlbGEuc2RhdGEyIHNlY3Rpb25zLiAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUKLQkgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbCBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldAotCSB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsIGV0IGFsLCB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldAotCSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZSBiZWxvdy4gICovCi0gICAgICBzdGF0aWMgY2hhciAqcmVsYV9zZWN0aW9uc1tdID0geyAiLnJlbGEuZ290IiwgIi5yZWxhLnNkYXRhIiwKLQkJCQkgICAgICAgIi5yZWxhLnNkYXRhMiIsICIucmVsYS5zYnNzIiwKLQkJCQkgICAgICAgKGNoYXIgKikwIH07Ci0gICAgICBjaGFyICoqcDsKLQotICAgICAgZm9yIChwID0gcmVsYV9zZWN0aW9uczsgKnAgIT0gKGNoYXIgKikwOyBwKyspCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICpwKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9uIHNlY3Rpb25zLiAqLwotCSAgICAgIHJlbG9jcyA9IHRydWU7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5nb3QiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KLSAgICAgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoCi0gICAgIG1lYW5zIHRoYXQgdGhleSBtdXN0IGNvbWUgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotICAgICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeQotICAgICBvdGhlciBkeW5hbWljIHN5bWJvbC4KLQotICAgICBGSVhNRTogV2UgYXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBuZXZlciBiZSByZWxvY2F0aW9ucyB0bwotICAgICBsb2NhdGlvbnMgaW4gbGlua2VyLWNyZWF0ZWQgc2VjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZQotICAgICBleHRlcm5hbGx5LXZpc2libGUgbmFtZXMuIEluc3RlYWQsIHdlIHNob3VsZCB3b3JrIG91dCBwcmVjaXNlbHkKLSAgICAgd2hpY2ggc2VjdGlvbnMgcmVsb2NhdGlvbnMgYXJlIHRhcmdldHRlZCBhdC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGZvciAoYyA9IDAsIHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwCi0JICAgICAgfHwgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSAwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0JICAgICBmaWRkbGUgd2l0aCBkeW5zdHJfaW5kZXguICAqLwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9IGMgKyAxOwotCi0JICBjKys7Ci0JfQotCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBwcGNfZWxmX2FkanVzdF9keW5pbmR4LAotCQkJICAgICAgKFBUUikgJmMpOwotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YTsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhMjsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgYXNlY3Rpb24gKnNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbGdvdCA9IE5VTEw7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfY2hlY2tfcmVsb2NzIGNhbGxlZCBmb3Igc2VjdGlvbiAlcyBpbiAlc1xuIiwKLQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0jZW5kaWYKLQotICAvKiBDcmVhdGUgdGhlIGxpbmtlciBnZW5lcmF0ZWQgc2VjdGlvbnMgYWxsIHRoZSB0aW1lIHNvIHRoYXQgdGhlCi0gICAgIHNwZWNpYWwgc3ltYm9scyBhcmUgY3JlYXRlZC4gICovCi0KLSAgaWYgKChzZGF0YSA9IGVsZl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgTElOS0VSX1NFQ1RJT05fU0RBVEEpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNkYXRhID0gcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIExJTktFUl9TRUNUSU9OX1NEQVRBKTsKLSAgICAgIGlmICghc2RhdGEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIGlmICgoc2RhdGEyID0gZWxmX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBMSU5LRVJfU0VDVElPTl9TREFUQTIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNkYXRhMiA9IHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBMSU5LRVJfU0VDVElPTl9TREFUQTIpOwotICAgICAgaWYgKCFzZGF0YTIpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICAvKiBJZiBhIHJlbG9jYXRpb24gcmVmZXJzIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgY3JlYXRlIHRoZSAuZ290LgotCSBUaGlzIHNob3dzIHVwIGluIHBhcnRpY3VsYXIgaW4gYW4gUl9QUENfQUREUjMyIGluIHRoZSBlYWJpCi0JIHN0YXJ0dXAgY29kZS4gICovCi0gICAgICBpZiAoaCAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCXsKLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQkvKiBHT1QxNiByZWxvY2F0aW9ucyAqLwotCWNhc2UgUl9QUENfR09UMTY6Ci0JY2FzZSBSX1BQQ19HT1QxNl9MTzoKLQljYXNlIFJfUFBDX0dPVDE2X0hJOgotCWNhc2UgUl9QUENfR09UMTZfSEE6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAgKFNFQ19BTExPQwotCQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290LnJlZmNvdW50ID09IC0xKQotCQl7Ci0JCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgIGlmICghYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgLyogQWxsb2NhdGUgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCQkgIC8qIEFsbG9jYXRlIHJlbG9jYXRpb24gc3BhY2UuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JCSAgaC0+Z290LnJlZmNvdW50ID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF9zaWduZWRfdm1hKTsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzID0gKGJmZF9zaWduZWRfdm1hICopCi0JCSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpID0gbG9jYWxfZ290X3JlZmNvdW50czsKLQkJICBtZW1zZXQgKGxvY2FsX2dvdF9yZWZjb3VudHMsIC0xLCBzaXplKTsKLQkJfQotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9PSAtMSkKLQkJewotCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCi0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSX1BQQ19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JCSAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQlsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSsrOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIEluZGlyZWN0IC5zZGF0YSByZWxvY2F0aW9uICovCi0JY2FzZSBSX1BQQ19FTUJfU0RBSTE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgIlJfUFBDX0VNQl9TREFJMTYiKSk7Ci0JICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoIWJmZF9lbGYzMl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgc2RhdGEsIGgsIHJlbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEyIHJlbG9jYXRpb24gKi8KLQljYXNlIFJfUFBDX0VNQl9TREEySTE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgIlJfUFBDX0VNQl9TREEySTE2IikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoIWJmZF9lbGYzMl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgc2RhdGEyLCBoLCByZWwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQQ19TREFSRUwxNjoKLQljYXNlIFJfUFBDX0VNQl9TREEyUkVMOgotCWNhc2UgUl9QUENfRU1CX1NEQTIxOgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJcHBjX2VsZl9ob3d0b190YWJsZVsoaW50KUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pXS0+bmFtZSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFBDX1BMVDMyOgotCWNhc2UgUl9QUENfUExUUkVMMjQ6Ci0JY2FzZSBSX1BQQ19QTFQxNl9MTzoKLQljYXNlIFJfUFBDX1BMVDE2X0hJOgotCWNhc2UgUl9QUENfUExUMTZfSEE6Ci0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIlJlbG9jIHJlcXVpcmVzIGEgUExUIGVudHJ5XG4iKTsKLSNlbmRpZgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgICAgICAgICAgICAgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICB7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGgtPnBsdC5yZWZjb3VudCsrOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoZSBmb2xsb3dpbmcgcmVsb2NhdGlvbnMgZG9uJ3QgbmVlZCB0byBwcm9wYWdhdGUgdGhlCi0JICAgICByZWxvY2F0aW9uIGlmIGxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0IHNpbmNlIHRoZXkgYXJlCi0JICAgICBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQljYXNlIFJfUFBDX1NFQ1RPRkY6Ci0JY2FzZSBSX1BQQ19TRUNUT0ZGX0xPOgotCWNhc2UgUl9QUENfU0VDVE9GRl9ISToKLQljYXNlIFJfUFBDX1NFQ1RPRkZfSEE6Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWZlcnMgb25seSB0byBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkgKi8KLQljYXNlIFJfUFBDX0xPQ0FMMjRQQzoKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX1BQQ19HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9QUENfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0JICAgICByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotCSAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAgKi8KLQljYXNlIFJfUFBDX1JFTDI0OgotCWNhc2UgUl9QUENfUkVMMTQ6Ci0JY2FzZSBSX1BQQ19SRUwxNF9CUlRBS0VOOgotCWNhc2UgUl9QUENfUkVMMTRfQlJOVEFLRU46Ci0JY2FzZSBSX1BQQ19SRUwzMjoKLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JZGVmYXVsdDoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfY2hlY2tfcmVsb2NzIG5lZWQgdG8gY3JlYXRlIHJlbG9jYXRpb24gZm9yICVzXG4iLAotCQkgICAgICAgKGggJiYgaC0+cm9vdC5yb290LnN0cmluZykgPyBoLT5yb290LnJvb3Quc3RyaW5nIDogIjx1bmtub3duPiIpOwotI2VuZGlmCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBoZXJlIGRvIHdoYXQgdGhlIG02OGsgYW5kIGkzODYKLQkJIGJhY2tlbmRzIGRvOiBpZiB0aGUgcmVsb2MgaXMgcGMtcmVsYXRpdmUsIHJlY29yZCBpdAotCQkgaW4gY2FzZSBpdCB0dXJucyBvdXQgdGhhdCB0aGUgcmVsb2MgaXMgdW5uZWNlc3NhcnkKLQkJIGJlY2F1c2UgdGhlIHN5bWJvbCBpcyBmb3JjZWQgbG9jYWwgYnkgdmVyc2lvbmluZyBvcgotCQkgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQmR5bmFtaWMuICBGb3J0dW5hdGVseSB0aGlzCi0JCSBjYXNlIGlzIG5vdCBmcmVxdWVudC4gICovCi0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLXBwY19lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfUFBDX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX1BQQ19HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9QUENfR09UMTY6Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2X0xPOgotICAgICAgY2FzZSBSX1BQQ19HT1QxNl9ISToKLSAgICAgIGNhc2UgUl9QUENfR09UMTZfSEE6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5nb3QucmVmY291bnQtLTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JICAgICAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0tLTsKLQkgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUl9QUENfUExUMzI6Ci0gICAgICBjYXNlIFJfUFBDX1BMVFJFTDI0OgotICAgICAgY2FzZSBSX1BQQ19QTFQxNl9MTzoKLSAgICAgIGNhc2UgUl9QUENfUExUMTZfSEk6Ci0gICAgICBjYXNlIFJfUFBDX1BMVDE2X0hBOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+cGx0LnJlZmNvdW50LS07Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgdXNlIGl0IHRvIHB1dCAuY29tbSBpdGVtcyBpbiAuc2JzcywgYW5kIG5vdCAuYnNzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3A7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTgotICAgICAgJiYgIWluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3ltLT5zdF9zaXplIDw9IChiZmRfdm1hKSBiZmRfZ2V0X2dwX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtRyBubiBieXRlcyBhcmUgYXV0b21hdGljYWxseQotCSBwdXQgaW50byAuc2RhdGEuICAqLwotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhCi0JPSBwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgTElOS0VSX1NFQ1RJT05fU0RBVEEpOwotCi0gICAgICBpZiAoIXNkYXRhLT5ic3Nfc2VjdGlvbikKLQl7Ci0JICAvKiBXZSBkb24ndCBnbyB0aHJvdWdoIGJmZF9tYWtlX3NlY3Rpb24sIGJlY2F1c2Ugd2UgZG9uJ3QKLSAgICAgICAgICAgICB3YW50IHRvIGF0dGFjaCB0aGlzIGNvbW1vbiBzZWN0aW9uIHRvIERZTk9CSi4gIFRoZSBsaW5rZXIKLSAgICAgICAgICAgICB3aWxsIG1vdmUgdGhlIHN5bWJvbHMgdG8gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBzZWN0aW9uCi0gICAgICAgICAgICAgd2hlbiBpdCBkZWZpbmVzIGNvbW1vbiBzeW1ib2xzLiAgKi8KLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbiA9ICgoYXNlY3Rpb24gKikKLQkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSkpOwotCSAgaWYgKHNkYXRhLT5ic3Nfc2VjdGlvbiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPm5hbWUgPSBzZGF0YS0+YnNzX25hbWU7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbCA9Ci0JICAgIChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2xfcHRyX3B0ciA9Ci0JICAgIChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wgKikpOwotCSAgaWYgKHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sID09IE5VTEwKLQkgICAgICB8fCBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sLT5uYW1lID0gc2RhdGEtPmJzc19uYW1lOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wtPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wtPnNlY3Rpb24gPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0JICAqc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2xfcHRyX3B0ciA9IHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sOwotCX0KLQotICAgICAgKnNlY3AgPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlcyIsCi0JICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0gICAgICBiZmRfdm1hIHJlbG9jX2luZGV4OwotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiwgcGx0X29mZnNldCA9ICVkIiwgaC0+cGx0Lm9mZnNldCk7Ci0jZW5kaWYKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFNldAotICAgICAgICAgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBmaWxsIGluIHRoZSAucGx0LiAgVGhlIHBwYyBkeW5hbWljIGxpbmtlcgotCSB3aWxsIGZpbGwgaXQgaW4uICAqLwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9QUENfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0KLSAgICAgIHJlbG9jX2luZGV4ID0gKGgtPnBsdC5vZmZzZXQgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKSAvIFBMVF9TTE9UX1NJWkU7Ci0gICAgICBpZiAocmVsb2NfaW5kZXggPiBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTKQotCXJlbG9jX2luZGV4IC09IChyZWxvY19pbmRleCAtIFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMpIC8gMjsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHJlbG9jX2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0gICAgICAgICB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgVGhlIGVudHJ5IGluCi0JIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaW4KLQkgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1BQQ19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQoKGgtPmdvdC5vZmZzZXQgJiAxKSA9PSAwKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfUFBDX0dMT0JfREFUKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLCBjb3B5Iik7Ci0jZW5kaWYKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAgICIucmVsYS5zYnNzIik7Ci0gICAgICBlbHNlCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfUFBDX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGFzZWN0aW9uICpzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgY2FsbGVkXG4iKTsKLSNlbmRpZgotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGJvb2xlYW4gc2l6ZTsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOiAgIG5hbWUgPSAiLnBsdCI7CSAgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgIGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogICBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CSAgICAgIG5hbWUgPSBOVUxMOwkgIHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG5hbWUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQlkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgc2l6ZSkKLQkJICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgICAgIGVsc2UKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCQkgICAgfQotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRkIGEgYmxybCBpbnN0cnVjdGlvbiBhdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8tNCBzbyB0aGF0IGEgZnVuY3Rpb24gY2FuCi0gICAgIGVhc2lseSBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICAqLwotICBpZiAoc2dvdCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50cyA9IHNnb3QtPmNvbnRlbnRzOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0ZTgwMDAyMSAvKiBibHJsICovLCBjb250ZW50cyk7Ci0KLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIGNvbnRlbnRzKzQpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIGNvbnRlbnRzKzQpOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotICAgIH0KLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZHluc3ltOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBtYXhkaW5keCA9IDA7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQotICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOwotCi0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLSAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGludCBpbmR4LCBkaW5keDsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgZGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keDsKLQkgIGlmIChkaW5keCA+IDApCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUKGluZHggPiAwKTsKLQkgICAgICBCRkRfQVNTRVJUKGRpbmR4ID4gMCk7Ci0KLQkgICAgICBpZiAoZGluZHggPiBtYXhkaW5keCkKLQkJbWF4ZGluZHggPSBkaW5keDsKLQotCSAgICAgIHN5bS5zdF9zaG5keCA9IGluZHg7Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAotCQkJCQkgKFBUUikgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkJCQkgc2R5bnN5bS0+Y29udGVudHMpCi0JCQkJCQkrIGRpbmR4KSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgb3V0cHV0IC5keW5zeW0gc2VjdGlvbiB0byB0aGUKLSAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNkeW5zeW0tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9Ci0JbWF4ZGluZHggKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcgkJICA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBiZmQgKmR5bm9iagkJCQkgID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YQkJICA9IChkeW5vYmopID8gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIExJTktFUl9TRUNUSU9OX1NEQVRBKSAgOiBOVUxMOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEyCQkgID0gKGR5bm9iaikgPyBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgTElOS0VSX1NFQ1RJT05fU0RBVEEyKSA6IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwJCSAgPSByZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQJCSAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYXNlY3Rpb24gKnNyZWxvYwkJCSAgPSBOVUxMOwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBib29sZWFuIHJldAkJCQkgID0gdHJ1ZTsKLSAgbG9uZyBpbnNuOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JICAgKGluZm8tPnJlbG9jYXRlYWJsZSkgPyAiIChyZWxvY2F0YWJsZSkiIDogIiIpOwotI2VuZGlmCi0KLSAgaWYgKCFwcGNfZWxmX2hvd3RvX3RhYmxlWyBSX1BQQ19BRERSMzIgXSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBwcGNfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc3BsdCA9IHNnb3QgPSBOVUxMOwotICBpZiAoZHlub2JqICE9IE5VTEwpCi0gICAgewotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICB9Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcl90eXBlCT0gKGVudW0gZWxmX3BwY19yZWxvY190eXBlKUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSBvZmZzZXQJCQk9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBiZmRfdm1hIGFkZGVuZAkJCT0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByCQk9IGJmZF9yZWxvY19vdGhlcjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bQkJPSAoRWxmX0ludGVybmFsX1N5bSAqKTA7Ci0gICAgICBhc2VjdGlvbiAqc2VjCQkJPSAoYXNlY3Rpb24gKikwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgJPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikwOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWUJCT0gKGNvbnN0IGNoYXIgKikwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICAvKiBVbmtub3duIHJlbG9jYXRpb24gaGFuZGxpbmcgKi8KLSAgICAgIGlmICgodW5zaWduZWQpcl90eXBlID49ICh1bnNpZ25lZClSX1BQQ19tYXggfHwgIXBwY19lbGZfaG93dG9fdGFibGVbKGludClyX3R5cGVdKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaG93dG8gPSBwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpcl90eXBlXTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoKHVuc2lnbmVkKUVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkJICAgaG93dG8tPm5hbWUsCi0JCSAgIChpbnQpcl90eXBlLAotCQkgICByX3N5bW5keCwKLQkJICAgKGxvbmcpb2Zmc2V0LAotCQkgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCi0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIHN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX1BQQ19QTFQzMgotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAocl90eXBlID09IFJfUFBDX0xPQ0FMMjRQQwotCQkgICAgICAmJiBzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl9QUENfR09UMTYKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19HT1QxNl9MTwotCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX0dPVDE2X0hJCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfR09UMTZfSEEpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIyNAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfTE8KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2X0hBCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTQKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNF9CUlRBS0VOCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTRfQlJOVEFLRU4KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1BMVFJFTDI0Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19DT1BZCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19HTE9CX0RBVAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfSk1QX1NMT1QKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1NEQVJFTDE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIzMgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2X0xPCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTZfSEEKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREFJMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREEySTE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMlJFTAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTVJLUkVGCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfQklUX0ZMRAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1JFTFNEQQotCQkJICB8fCAoKHJfdHlwZSA9PSBSX1BQQ19SRUwyNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwzMgotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNF9CUlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDE0X0JSTlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTEFUSVZFKQotCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKShpbmZvLAotCQkJCQkJCSBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkJCSBpbnB1dF9iZmQsCi0JCQkJCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkJIHJlbC0+cl9vZmZzZXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCBmb3Igc3ltYm9sICVzIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlLCBzeW1fbmFtZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgbmVlZCBubyBzcGVjaWFsIHByb2Nlc3NpbmcuICAqLwotCWNhc2UgKGludClSX1BQQ19MT0NBTDI0UEM6Ci0JICAvKiBJdCBtYWtlcyBubyBzZW5zZSB0byBwb2ludCBhIGxvY2FsIHJlbG9jYXRpb24KLQkgICAgIGF0IGEgc3ltYm9sIG5vdCBpbiB0aGlzIG9iamVjdC4gICovCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICYmIHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKSAoaW5mbywKLQkJCQkJCQkgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCQkJICBpbnB1dF9iZmQsCi0JCQkJCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJCSAgcmVsLT5yX29mZnNldCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBSZWxvY2F0aW9ucyB0aGF0IG1heSBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgaWYgdGhpcyBpcyBhIHNoYXJlZAotICAgICAgICAgICBvYmplY3QuICAqLwotCWNhc2UgKGludClSX1BQQ19SRUwyNDoKLQljYXNlIChpbnQpUl9QUENfUkVMMzI6Ci0JY2FzZSAoaW50KVJfUFBDX1JFTDE0OgotCSAgLyogSWYgdGhlc2UgcmVsb2NhdGlvbnMgYXJlIG5vdCB0byBhIG5hbWVkIHN5bWJvbCwgdGhleSBjYW4gYmUKLQkgICAgIGhhbmRsZWQgcmlnaHQgaGVyZSwgbm8gbmVlZCB0byBib3RoZXIgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgYWx3YXlzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCBpZiB0aGlzIGlzIGEgc2hhcmVkCi0gICAgICAgICAgIG9iamVjdC4gICovCi0JY2FzZSAoaW50KVJfUFBDX05PTkU6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIzMjoKLQljYXNlIChpbnQpUl9QUENfQUREUjI0OgotCWNhc2UgKGludClSX1BQQ19BRERSMTY6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNl9MTzoKLQljYXNlIChpbnQpUl9QUENfQUREUjE2X0hJOgotCWNhc2UgKGludClSX1BQQ19BRERSMTZfSEE6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNDoKLQljYXNlIChpbnQpUl9QUENfVUFERFIzMjoKLQljYXNlIChpbnQpUl9QUENfVUFERFIxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gbmVlZCB0byBjcmVhdGUgcmVsb2NhdGlvbiBmb3IgJXNcbiIsCi0JCSAgICAgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKSA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+Iik7Ci0jZW5kaWYKLQotCSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0gICAgICAgICAgICAgICAgIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0gICAgICAgICAgICAgICAgIGJlY29tZSBsb2NhbC4gICovCi0JICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMCi0JCSAgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJewotCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIHJfdHlwZSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChyX3R5cGUgPT0gUl9QUENfQUREUjMyKQotCQkgICAgewotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1BQQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCSAgICAgIHx8IChoLT5yb290LnR5cGUKLQkJCQkJICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkJfQotCQkgICAgICBpZiAoc2VjICE9IE5VTEwgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotCQkJaW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkJCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OwotCQkJICBCRkRfQVNTRVJUKGluZHggPiAwKTsKLSNpZmRlZiBERUJVRwotCQkJICBpZiAoaW5keCA8PSAwKQotCQkJICAgIHsKLQkJCSAgICAgIHByaW50ZigiaW5keD0lZCBzZWN0aW9uPSVzIGZsYWdzPSUwOHggbmFtZT0lc1xuIiwKLQkJCQkgICAgIGluZHgsIG9zZWMtPm5hbWUsIG9zZWMtPmZsYWdzLAotCQkJCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JCQkgICAgfQotI2VuZGlmCi0JCQl9Ci0KLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JICAgICAgLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvIHRoZXJlJ3Mgbm8KLSAgICAgICAgICAgICAgICAgbmVlZCB0byBkbyBhbnl0aGluZyBub3csIHVubGVzcyB0aGlzIGlzIGEgUkVMQVRJVkUKLSAgICAgICAgICAgICAgICAgcmVsb2MgaW4gYW4gdW5hbGxvY2F0ZWQgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKHNraXAKLQkJICB8fCAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICB8fCBFTEYzMl9SX1RZUEUgKG91dHJlbC5yX2luZm8pICE9IFJfUFBDX1JFTEFUSVZFKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBBcml0aG1ldGljIGFkanVzdCByZWxvY2F0aW9ucyB0aGF0IGFyZW4ndCBnb2luZyBpbnRvIGEKLQkgICAgIHNoYXJlZCBvYmplY3QuICAqLwotCSAgaWYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfSEEKLQkgICAgICAvKiBJdCdzIGp1c3QgcG9zc2libGUgdGhhdCB0aGlzIHN5bWJvbCBpcyBhIHdlYWsgc3ltYm9sCi0JCSB0aGF0J3Mgbm90IGFjdHVhbGx5IGRlZmluZWQgYW55d2hlcmUuIEluIHRoYXQgY2FzZSwKLQkJICdzZWMnIHdvdWxkIGJlIE5VTEwsIGFuZCB3ZSBzaG91bGQgbGVhdmUgdGhlIHN5bWJvbAotCQkgYWxvbmUgKGl0IHdpbGwgYmUgc2V0IHRvIHplcm8gZWxzZXdoZXJlIGluIHRoZSBsaW5rKS4gICovCi0JICAgICAgJiYgc2VjICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhZGRlbmQgKz0gKChyZWxvY2F0aW9uICsgYWRkZW5kKSAmIDB4ODAwMCkgPDwgMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBicmFuY2ggdGFrZW4gcHJlZGljdGlvbiByZWxvY2F0aW9ucyAqLwotCWNhc2UgKGludClSX1BQQ19BRERSMTRfQlJUQUtFTjoKLQljYXNlIChpbnQpUl9QUENfUkVMMTRfQlJUQUtFTjoKLQkgIGluc24gPSBiZmRfZ2V0XzMyIChvdXRwdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBpZiAoKHJlbG9jYXRpb24gLSBvZmZzZXQpICYgMHg4MDAwKQotCSAgICBpbnNuICY9IH5CUkFOQ0hfUFJFRElDVF9CSVQ7Ci0JICBlbHNlCi0JICAgIGluc24gfD0gQlJBTkNIX1BSRURJQ1RfQklUOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgYnJlYWs7Ci0KLQkvKiBicmFuY2ggbm90IHRha2VuIHByZWRpY2l0aW9uIHJlbG9jYXRpb25zICovCi0JY2FzZSAoaW50KVJfUFBDX0FERFIxNF9CUk5UQUtFTjoKLQljYXNlIChpbnQpUl9QUENfUkVMMTRfQlJOVEFLRU46Ci0JICBpbnNuID0gYmZkX2dldF8zMiAob3V0cHV0X2JmZCwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgaWYgKChyZWxvY2F0aW9uIC0gb2Zmc2V0KSAmIDB4ODAwMCkKLQkgICAgaW5zbiB8PSBCUkFOQ0hfUFJFRElDVF9CSVQ7Ci0JICBlbHNlCi0JICAgIGluc24gJj0gfkJSQU5DSF9QUkVESUNUX0JJVDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGJyZWFrOwotCi0JLyogR09UMTYgcmVsb2NhdGlvbnMgKi8KLQljYXNlIChpbnQpUl9QUENfR09UMTY6Ci0JY2FzZSAoaW50KVJfUFBDX0dPVDE2X0xPOgotCWNhc2UgKGludClSX1BQQ19HT1QxNl9ISToKLQljYXNlIChpbnQpUl9QUENfR09UMTZfSEE6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGdsb2JhbAotICAgICAgICAgICAgIG9mZnNldCB0YWJsZS4gICovCi0JICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBvZmYgPSBoLT5nb3Qub2Zmc2V0OwotCSAgICAgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSBzdGF0aWMgbGluaywgb3IgaXQgaXMgYQotICAgICAgICAgICAgICAgICAgICAgLUJzeW1ib2xpYyBsaW5rIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgIGxvY2FsbHkuICBXZSBtdXN0IGluaXRpYWxpemUgdGhpcyBlbnRyeSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QKLSAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUgbGVhc3QKLSAgICAgICAgICAgICAgICAgICAgIHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIDQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTAotCQkJICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQotCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCi0JCSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLQkJIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZW50cnkuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIFJfUFBDX1JFTEFUSVZFIHJlbG9jCi0JCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1BQQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb247Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkJICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICAgICAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQotCQkgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSB8PSAxOwotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIDQ7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JLyogSW5kaXJlY3QgLnNkYXRhIHJlbG9jYXRpb24gKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX1NEQUkxNjoKLQkgIEJGRF9BU1NFUlQgKHNkYXRhICE9IE5VTEwpOwotCSAgcmVsb2NhdGlvbiA9IGJmZF9lbGYzMl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLAotCQkJCQkJCQlzZGF0YSwgaCwgcmVsb2NhdGlvbiwgcmVsLAotCQkJCQkJCQlSX1BQQ19SRUxBVElWRSk7Ci0JICBicmVhazsKLQotCS8qIEluZGlyZWN0IC5zZGF0YTIgcmVsb2NhdGlvbiAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfU0RBMkkxNjoKLQkgIEJGRF9BU1NFUlQgKHNkYXRhMiAhPSBOVUxMKTsKLQkgIHJlbG9jYXRpb24gPSBiZmRfZWxmMzJfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywKLQkJCQkJCQkJc2RhdGEyLCBoLCByZWxvY2F0aW9uLCByZWwsCi0JCQkJCQkJCVJfUFBDX1JFTEFUSVZFKTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIHRoZSBUT0MxNiByZWxvYy4gIFdlIHdhbnQgdG8gdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoZSAuZ290Ci0JICAgc2VjdGlvbiwgbm90IHRoZSBhY3R1YWwgVk1BLiAgVGhpcyBpcyBhcHByb3ByaWF0ZSB3aGVuIGdlbmVyYXRpbmcKLQkgICBhbiBlbWJlZGRlZCBFTEYgb2JqZWN0LCBmb3Igd2hpY2ggdGhlIC5nb3Qgc2VjdGlvbiBhY3RzIGxpa2UgdGhlCi0JICAgQUlYIC50b2Mgc2VjdGlvbi4gICovCi0JY2FzZSAoaW50KVJfUFBDX1RPQzE2OgkJCS8qIHBob255IEdPVDE2IHJlbG9jYXRpb25zICovCi0JICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICBCRkRfQVNTRVJUIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykKLQkJICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5nb3QiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuY2dvdCIpID09IDApCi0KLQkgIGFkZGVuZCAtPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQgKyAweDgwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgKGludClSX1BQQ19QTFRSRUwyNDoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEKLQkgICAgICB8fCBzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0gICAgICAgICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLSAgICAgICAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0gCSAgYnJlYWs7Ci0KLQkvKiByZWxvY2F0ZSBhZ2FpbnN0IF9TREFfQkFTRV8gKi8KLQljYXNlIChpbnQpUl9QUENfU0RBUkVMMTY6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgIT0gMAotCQkmJiBzdHJjbXAgKG5hbWUsICIuc2JzcyIpICE9IDApCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIiksCi0JCQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJICAgICAgIHN5bV9uYW1lLAotCQkJCSAgICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAotCQkJCSAgICAgICBuYW1lKTsKLQkgICAgICB9Ci0JICAgIGFkZGVuZCAtPSAoc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIH0KLQkgIGJyZWFrOwotCi0KLQkvKiByZWxvY2F0ZSBhZ2FpbnN0IF9TREEyX0JBU0VfICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9TREEyUkVMOgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YTIiKSAhPSAwICYmIHN0cmNtcCAobmFtZSwgIi5zYnNzMiIpICE9IDApCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIiksCi0JCQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJICAgICAgIHN5bV9uYW1lLAotCQkJCSAgICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAotCQkJCSAgICAgICBuYW1lKTsKLQkJCi0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlyZXQgPSBmYWxzZTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICBhZGRlbmQgLT0gKHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICB9Ci0JICBicmVhazsKLQotCi0JLyogcmVsb2NhdGUgYWdhaW5zdCBlaXRoZXIgX1NEQV9CQVNFXywgX1NEQTJfQkFTRV8sIG9yIDAgKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX1NEQTIxOgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU0RBOgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBpbnQgcmVnOwotCi0JICAgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCSAgICAgIHsKLQkJcmVnID0gMTM7Ci0JCWFkZGVuZCAtPSAoc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICArIHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpID09IDAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MyIikgPT0gMCkKLQkgICAgICB7Ci0JCXJlZyA9IDI7Ci0JCWFkZGVuZCAtPSAoc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLlBQQy5FTUIuc2RhdGEwIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICIuUFBDLkVNQi5zYnNzMCIpID09IDApCi0JICAgICAgewotCQlyZWcgPSAwOwotCSAgICAgIH0KLQotCSAgICBlbHNlCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIiksCi0JCQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJICAgICAgIHN5bV9uYW1lLAotCQkJCSAgICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAotCQkJCSAgICAgICBuYW1lKTsKLQotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJcmV0ID0gZmFsc2U7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICBpZiAocl90eXBlID09IFJfUFBDX0VNQl9TREEyMSkKLQkgICAgICB7CQkJLyogZmlsbCBpbiByZWdpc3RlciBmaWVsZCAqLwotCQlpbnNuID0gYmZkX2dldF8zMiAob3V0cHV0X2JmZCwgY29udGVudHMgKyBvZmZzZXQpOwotCQlpbnNuID0gKGluc24gJiB+UkFfUkVHSVNURVJfTUFTSykgfCAocmVnIDw8IFJBX1JFR0lTVEVSX1NISUZUKTsKLQkJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JLyogUmVsb2NhdGUgYWdhaW5zdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uICovCi0JY2FzZSAoaW50KVJfUFBDX1NFQ1RPRkY6Ci0JY2FzZSAoaW50KVJfUFBDX1NFQ1RPRkZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX1NFQ1RPRkZfSEk6Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICBhZGRlbmQgLT0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0KLQljYXNlIChpbnQpUl9QUENfU0VDVE9GRl9IQToKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgIGFkZGVuZCAtPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBhZGRlbmQgKz0gKChyZWxvY2F0aW9uICsgYWRkZW5kKSAmIDB4ODAwMCkgPDwgMTsKLQkgIGJyZWFrOwotCi0JLyogTmVnYXRpdmUgcmVsb2NhdGlvbnMgKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMzI6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2OgotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNl9MTzoKLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTZfSEk6Ci0JICBhZGRlbmQgLT0gMipyZWxvY2F0aW9uOwotCSAgYnJlYWs7Ci0KLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTZfSEE6Ci0JICBhZGRlbmQgLT0gMipyZWxvY2F0aW9uOwotCSAgYWRkZW5kICs9ICgocmVsb2NhdGlvbiArIGFkZGVuZCkgJiAweDgwMDApIDw8IDE7Ci0JICBicmVhazsKLQotCS8qIE5PUCByZWxvY2F0aW9uIHRoYXQgcHJldmVudHMgZ2FyYmFnZSBjb2xsZWN0aW5nIGxpbmtlcnMgZnJvbSBvbWl0dGluZyBhCi0JICAgcmVmZXJlbmNlLiAgKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX01SS1JFRjoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAoaW50KVJfUFBDX0NPUFk6Ci0JY2FzZSAoaW50KVJfUFBDX0dMT0JfREFUOgotCWNhc2UgKGludClSX1BQQ19KTVBfU0xPVDoKLQljYXNlIChpbnQpUl9QUENfUkVMQVRJVkU6Ci0JY2FzZSAoaW50KVJfUFBDX1BMVDMyOgotCWNhc2UgKGludClSX1BQQ19QTFRSRUwzMjoKLQljYXNlIChpbnQpUl9QUENfUExUMTZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX1BMVDE2X0hJOgotCWNhc2UgKGludClSX1BQQ19QTFQxNl9IQToKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNFQzE2OgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU1RfTE86Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTVF9ISToKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNUX0hBOgotCWNhc2UgKGludClSX1BQQ19FTUJfQklUX0ZMRDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFJlbG9jYXRpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHN5bWJvbCAlcy4iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgc3ltX25hbWUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgKGludClSX1BQQ19HTlVfVlRJTkhFUklUOgotCWNhc2UgKGludClSX1BQQ19HTlVfVlRFTlRSWToKLQkgIC8qIFRoZXNlIGFyZSBuby1vcHMgaW4gdGhlIGVuZC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBuYW1lID0gJXMsIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCi0JICAgICAgIGhvd3RvLT5uYW1lLAotCSAgICAgICAoaW50KXJfdHlwZSwKLQkgICAgICAgc3ltX25hbWUsCi0JICAgICAgIHJfc3ltbmR4LAotCSAgICAgICAobG9uZylvZmZzZXQsCi0JICAgICAgIChsb25nKWFkZGVuZCk7Ci0jZW5kaWYKLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCi0JCQkJICAgIGlucHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsCi0JCQkJICAgIG9mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwKLQkJCQkgICAgYWRkZW5kKTsKLQotICAgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rKQotCTsKLSAgICAgIGVsc2UgaWYgKHIgPT0gYmZkX3JlbG9jX292ZXJmbG93KQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JCSAgJiYgaG93dG8tPnBjX3JlbGF0aXZlKQotCQl7Ci0JCSAgLyogQXNzdW1lIHRoaXMgaXMgYSBjYWxsIHByb3RlY3RlZCBieSBvdGhlciBjb2RlIHRoYXQKLQkJICAgICBkZXRlY3QgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBJZiB0aGlzIGlzIHRoZSBjYXNlLAotCQkgICAgIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZSBvdmVyZmxvdy4gIElmIG5vdCwgdGhlCi0JCSAgICAgcHJvZ3JhbSBpcyBob3NlZCBhbnl3YXksIGFuZCBhIGxpdHRsZSB3YXJuaW5nIGlzbid0Ci0JCSAgICAgZ29pbmcgdG8gaGVscC4gICovCi0KLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgfQotCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpKGluZm8sCi0JCQkJCQkgICBuYW1lLAotCQkJCQkJICAgaG93dG8tPm5hbWUsCi0JCQkJCQkgICAoYmZkX3ZtYSkgMCwKLQkJCQkJCSAgIGlucHV0X2JmZCwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICBvZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXJldCA9IGZhbHNlOwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OwotfQotCi0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItcG93ZXJwY2xlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX3Bvd2VycGNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXBvd2VycGMiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9wb3dlcnBjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUFBDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwlwcGNfZWxmX2luZm9fdG9faG93dG8KLQotI2lmZGVmICBFTV9DWUdOVVNfUE9XRVJQQwotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxCUVNX0NZR05VU19QT1dFUlBDCi0jZW5kaWYKLQotI2lmZGVmIEVNX1BQQ19PTEQKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMglFTV9QUENfT0xECi0jZW5kaWYKLQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0CTQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfSU5JVElBTF9FTlRSWV9TSVpFCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEJcHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCXBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24gICAgICAgICAgICAgcHBjX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsJCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJCXBwY19lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCXBwY19lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJCXBwY19lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbAlwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCXBwY19lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwlwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCQlwcGNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMJcHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJCXBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1zaC5jIGIvYmZkL2VsZjMyLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzllOGEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTExICswLDAgQEAKLS8qIEhpdGFjaGkgU0ggc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvc2guaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX2VsZl9pZ25vcmVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc2hfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHNoX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX2FsaWduX2xvYWRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9zd2FwX2luc25zCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnNoX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc2hfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfU0hfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgU2V0dGluZyBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZSBhbmQKLSAgICAgc3JjX21hc2sgdG8gYSBub24temVybyB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBDT0ZGIHRvb2xjaGFpbi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVIzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9TSF9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgUEMgcmVsYXRpdmUgYnJhbmNoIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUE4sCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQTiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggZGl2aWRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfU0hfSU5EMTJXLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9JTkQxMlciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCB1bnNpZ25lZCBQQyByZWxhdGl2ZSBkaXZpZGVkIGJ5IDQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4V1BMLAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IHVuc2lnbmVkIFBDIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUFosCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4V1BaIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlLiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB3ZSBoYXZlIHNvbWUKLSAgICAgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQgaXMgbm90Ci0gICAgIGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOEJQLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhCUCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gIEZJWE1FOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYKLSAgICAgd2UgaGF2ZSBzb21lIHNwZWNpYWwgc3ltYm9sIGZvciB0aGUgR0JSIHJlbGF0aXZlIGFyZWEsIGFuZCB0aGF0Ci0gICAgIGlzIG5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhXIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUgZGl2aWRlZCBieSA0LiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZgotICAgICB3ZSBoYXZlIHNvbWUgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQKLSAgICAgaXMgbm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOEwsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOEwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgMTAgfSwKLSAgeyAxMSB9LAotICB7IDEyIH0sCi0gIHsgMTMgfSwKLSAgeyAxNCB9LAotICB7IDE1IH0sCi0gIHsgMTYgfSwKLSAgeyAxNyB9LAotICB7IDE4IH0sCi0gIHsgMTkgfSwKLSAgeyAyMCB9LAotICB7IDIxIH0sCi0gIHsgMjIgfSwKLSAgeyAyMyB9LAotICB7IDI0IH0sCi0KLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbiB1c2VkIGZvciByZWxheGluZy4gIFRoZQotICAgICBmaW5hbCBwYXNzIG9mIHRoZSBsaW5rZXIgbmV2ZXIgbmVlZHMgdG8gZG8gYW55dGhpbmcgd2l0aCBhbnkgb2YKLSAgICAgdGhlc2UgcmVsb2NzLiAgQW55IHJlcXVpcmVkIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlCi0gICAgIHJlbGF4YXRpb24gY29kZS4gICovCi0KLSAgLyogQSAxNiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC53b3JkIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0gxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC5sb25nIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5kaWNhdGVzIGEgLnVzZXMgcHNldWRvLW9wLiAgVGhlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgLnVzZXMKLSAgICAgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBjYW4gYmUgcmVsYXhlZC4KLSAgICAgVGhlIG9mZnNldCBmaWVsZCBob2xkcyB0aGUgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbgotICAgICB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0gIEhPV1RPIChSX1NIX1VTRVMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfVVNFUyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIHRoaXMgcmVsb2MgZm9yIGFkZHJlc3NlcyByZWZlcnJlZCB0bwotICAgICBieSB0aGUgcmVnaXN0ZXIgbG9hZHMgYXNzb2NpYXRlZCB3aXRoIFVTRVMgcmVsb2NzLiAgVGhlIG9mZnNldAotICAgICBmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCi0gICAgIG9iamVjdCBmaWxlLiAgKi8KLSAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfQ09VTlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluZGljYXRlcyBhbiBhbGlnbm1lbnQgc3RhdGVtZW50LiAgVGhlIG9mZnNldCBmaWVsZCBpcyB0aGUgcG93ZXIKLSAgICAgb2YgMiB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZSBtdXN0IGJlCi0gICAgIGFsaWduZWQuICAqLwotICBIT1dUTyAoUl9TSF9BTElHTiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9BTElHTiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgdGhpcyByZWxvYyBiZWZvcmUgYSBibG9jayBvZgotICAgICBpbnN0cnVjdGlvbnMuICBBIHNlY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBhcyBhc3N1bWluaW5nIGl0Ci0gICAgIGNvbnRhaW5zIGRhdGEsIHVubGVzcyB0aGlzIHJlbG9jIGlzIHNlZW4uICAqLwotICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0NPREUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSB0aGlzIHJlbG9jIGFmdGVyIGEgYmxvY2sgb2YKLSAgICAgaW5zdHJ1Y3Rpb25zIHdoZW4gaXQgc2VlcyBkYXRhIHRoYXQgaXMgbm90IGluc3RydWN0aW9ucy4gICovCi0gIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfREFUQSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhpcyByZWxvYyBmb3IgZWFjaCBsYWJlbCB3aXRoaW4gYSBibG9jawotICAgICBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBhdm9pZCBzd2FwcGluZwotICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIHRoZSB0YXJnZXRzIG9mIGJyYW5jaGVzLiAgKi8KLSAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfTEFCRUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDggYml0IHN3aXRjaCB0YWJsZSBlbnRyeS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGZvciBhbiBleHByZXNzaW9uCi0gICAgIHN1Y2ggYXMgYGAud29yZCBMMSAtIEwyJycuICBUaGUgb2Zmc2V0IGhvbGRzIHRoZSBkaWZmZXJlbmNlCi0gICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIEwyLiAgKi8KLSAgSE9XVE8gKFJfU0hfU1dJVENIOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9TV0lUQ0g4IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX1NIX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1NIX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9TSF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfU0hfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIGlzIGxpa2UgdGhlIENPRkYKLSAgIGZ1bmN0aW9uLCBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvcnJlY3QgZm9yIG90aGVyIEVMRiB0YXJnZXRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc2hfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBzeW1fdmFsdWU7Ci0gIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgcl90eXBlOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gYWRkciArIChiZmRfYnl0ZSAqKSBkYXRhOwotCi0gIHJfdHlwZSA9IChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSByZWxvY19lbnRyeS0+aG93dG8tPnR5cGU7Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQYXJ0aWFsIGxpbmtpbmctLWRvIG5vdGhpbmcuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIEFsbW9zdCBhbGwgcmVsb2NzIGhhdmUgdG8gZG8gd2l0aCByZWxheGluZy4gIElmIGFueSB3b3JrIG11c3QgYmUKLSAgICAgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KLSAgaWYgKHJfdHlwZSAhPSBSX1NIX0RJUjMyCi0gICAgICAmJiAocl90eXBlICE9IFJfU0hfSU5EMTJXCi0JICB8fCAoc3ltYm9sX2luLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICBpZiAoc3ltYm9sX2luICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHN5bV92YWx1ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgCi0gICAgc3ltX3ZhbHVlID0gKHN5bWJvbF9pbi0+dmFsdWUgKwotCQkgc3ltYm9sX2luLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9TSF9ESVIzMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfU0hfSU5EMTJXOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIHN5bV92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgc3ltX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICsgYWRkcgotCQkgICAgKyA0KTsKLSAgICAgIHN5bV92YWx1ZSArPSAoaW5zbiAmIDB4ZmZmKSA8PCAxOwotICAgICAgaWYgKGluc24gJiAweDgwMCkKLQlzeW1fdmFsdWUgLT0gMHgxMDAwOwotICAgICAgaW5zbiA9IChpbnNuICYgMHhmMDAwKSB8IChzeW1fdmFsdWUgJiAweGZmZik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBpZiAoc3ltX3ZhbHVlIDwgKGJmZF92bWEpIC0weDEwMDAgfHwgc3ltX3ZhbHVlID49IDB4MTAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcmVsb2NzIHdoaWNoIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLAotICAgd2hpY2ggdGhlIGxpbmtlciBzaG91bGQgb3RoZXJ3aXNlIGlnbm9yZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNoX2VsZl9pZ25vcmVfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIEVMRiByZWxvY3MuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotLyogQW4gYXJyYXkgbWFwcGluZyBCRkQgcmVsb2MgY29kZXMgdG8gU0ggRUxGIHJlbG9jcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzaF9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU0hfTk9ORSB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9ESVIzMiB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NIX0RJUjMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NIX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIsIFJfU0hfRElSOFdQTiB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiwgUl9TSF9JTkQxMlcgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLCBSX1NIX0RJUjhXUFogfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX0RJUjhXUEwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TSF9TV0lUQ0g4IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDE2IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLCBSX1NIX1NXSVRDSDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1VTRVMsIFJfU0hfVVNFUyB9LAotICB7IEJGRF9SRUxPQ19TSF9DT1VOVCwgUl9TSF9DT1VOVCB9LAotICB7IEJGRF9SRUxPQ19TSF9BTElHTiwgUl9TSF9BTElHTiB9LAotICB7IEJGRF9SRUxPQ19TSF9DT0RFLCBSX1NIX0NPREUgfSwKLSAgeyBCRkRfUkVMT0NfU0hfREFUQSwgUl9TSF9EQVRBIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0xBQkVMLCBSX1NIX0xBQkVMIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NIX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NIX0dOVV9WVEVOVFJZIH0sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCi0gICBjb3JyZXNwb25kaW5nIFNIIEVMZiByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc2hfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKHNoX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZzaF9lbGZfaG93dG9fdGFibGVbKGludCkgc2hfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2l2ZW4gYW4gRUxGIHJlbG9jLCBmaWxsIGluIHRoZSBob3d0byBmaWVsZCBvZiBhIHJlbGVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zaF9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcjsKLQotICByID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAociA8ICh1bnNpZ25lZCBpbnQpIFJfU0hfbWF4KTsKLSAgQkZEX0FTU0VSVCAociA8IFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQyB8fCByID4gUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MpOwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSAmc2hfZWxmX2hvd3RvX3RhYmxlW3JdOwotfQotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciBTSCBFTEYuICBTZWUgdGhlIGNvcnJlc3BvbmRpbmcKLSAgIGZ1bmN0aW9uIGluIGNvZmYtc2guYyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgZG9lcy4gIEZJWE1FOgotICAgVGhlcmUgaXMgYSBsb3Qgb2YgZHVwbGljYXRpb24gaGVyZSBiZXR3ZWVuIHRoaXMgY29kZSBhbmQgdGhlIENPRkYKLSAgIHNwZWNpZmljIGNvZGUuICBUaGUgZm9ybWF0IG9mIHJlbG9jcyBhbmQgc3ltYm9scyBpcyB3b3VuZCBkZWVwbHkKLSAgIGludG8gdGhpcyBjb2RlLCBidXQgaXQgd291bGQgc3RpbGwgYmUgYmV0dGVyIGlmIHRoZSBkdXBsaWNhdGlvbgotICAgY291bGQgYmUgZWxpbWluYXRlZCBzb21laG93LiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgYWx0aG91Z2ggYm90aAotICAgZnVuY3Rpb25zIHVzZSBzeW1ib2xzIGxpa2UgUl9TSF9DT0RFLCB0aG9zZSBzeW1ib2xzIGhhdmUgZGlmZmVyZW50Ci0gICB2YWx1ZXM7IGluIGNvZmYtc2guYyB0aGV5IGNvbWUgZnJvbSBpbmNsdWRlL2NvZmYvc2guaCwgd2hlcmVhcyBoZXJlCi0gICB0aGV5IGNvbWUgZnJvbSBlbnVtIGVsZl9zaF9yZWxvY190eXBlIGluIGluY2x1ZGUvZWxmL3NoLmguICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNoX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBib29sZWFuIGhhdmVfY29kZTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBoYXZlX2NvZGUgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbGFkZHIsIHBhZGRyLCBzeW12YWw7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBpbnNuOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxmbiwgKmlyZWxzY2FuLCAqaXJlbGNvdW50OwotICAgICAgYmZkX3NpZ25lZF92bWEgZm9mZjsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0NPREUpCi0JaGF2ZV9jb2RlID0gdHJ1ZTsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX1VTRVMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSByX2FkZGVuZCBmaWVsZCBvZiB0aGUgUl9TSF9VU0VTIHJlbG9jIHdpbGwgcG9pbnQgdXMgdG8KLSAgICAgICAgIHRoZSByZWdpc3RlciBsb2FkLiAgVGhlIDQgaXMgYmVjYXVzZSB0aGUgcl9hZGRlbmQgZmllbGQgaXMKLSAgICAgICAgIGNvbXB1dGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEganVtcCBvZmZzZXQsIHdoaWNoIGFyZSBiYXNlZAotICAgICAgICAgZnJvbSA0IGJ5dGVzIGFmdGVyIHRoZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGxhZGRyID0gaXJlbC0+cl9vZmZzZXQgKyA0ICsgaXJlbC0+cl9hZGRlbmQ7Ci0gICAgICBpZiAobGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbGFkZHIpOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IG1vdi5sIE5OLHJOLCB3ZSBkb24ndCBrbm93IHdoYXQgdG8KLSAgICAgICAgIGRvLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgIT0gMHhkMDAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBSX1NIX1VTRVMgcG9pbnRzIHRvIHVucmVjb2duaXplZCBpbnNuIDB4JXgiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCwgaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgbG9hZGVkLiAgVGhlCi0gICAgICAJIGRpc3BsYWNlbWVudCBpbiB0aGUgbW92LmwgaW5zdHJ1Y3Rpb24gaXMgcXVhZHJ1cGxlZC4gIEl0IGlzIGEKLSAgICAgIAkgZGlzcGxhY2VtZW50IGZyb20gZm91ciBieXRlcyBhZnRlciB0aGUgbW92bCBpbnN0cnVjdGlvbiwgYnV0LAotICAgICAgCSBiZWZvcmUgYWRkaW5nIGluIHRoZSBQQyBhZGRyZXNzLCB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cwotICAgICAgCSBvZiB0aGUgUEMgYXJlIGNsZWFyZWQuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkCi0gICAgICAJIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgIHBhZGRyID0gaW5zbiAmIDB4ZmY7Ci0gICAgICBwYWRkciAqPSA0OwotICAgICAgcGFkZHIgKz0gKGxhZGRyICsgNCkgJn4gMzsKLSAgICAgIGlmIChwYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgcmVsb2MgZm9yIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzCi0gICAgICAgICBiZWluZyBsb2FkZWQuICBUaGlzIHJlbG9jIHdpbGwgdGVsbCB1cyB3aGljaCBmdW5jdGlvbiBpcwotICAgICAgICAgYWN0dWFsbHkgYmVpbmcgY2FsbGVkLiAgKi8KLSAgICAgIGZvciAoaXJlbGZuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsZm4gPCBpcmVsZW5kOyBpcmVsZm4rKykKLQlpZiAoaXJlbGZuLT5yX29mZnNldCA9PSBwYWRkcgotCSAgICAmJiBFTEYzMl9SX1RZUEUgKGlyZWxmbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0RJUjMyKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbGZuID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0KLQkgIGlmIChpc3ltLnN0X3NobmR4ICE9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKSkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgc3ltdmFsICs9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgcGFkZHIpOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxsIGNhbiBiZSBzaG9ydGVuZWQuICAqLwotICAgICAgZm9mZiA9IChzeW12YWwKLQkgICAgICAtIChpcmVsLT5yX29mZnNldAotCQkgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIDQpKTsKLSAgICAgIGlmIChmb2ZmIDwgLTB4MTAwMCB8fCBmb2ZmID49IDB4MTAwMCkKLQl7Ci0JICAvKiBBZnRlciBhbGwgdGhhdCB3b3JrLCB3ZSBjYW4ndCBzaG9ydGVuIHRoaXMgZnVuY3Rpb24gY2FsbC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFNob3J0ZW4gdGhlIGZ1bmN0aW9uIGNhbGwuICAqLwotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0gICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAgICAgLyogUmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotCi0gICAgICAvKiBDaGFuZ2UgdGhlIFJfU0hfVVNFUyByZWxvYyBpbnRvIGFuIFJfU0hfSU5EMTJXIHJlbG9jLCBhbmQKLSAgICAgICAgIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSwgUl9TSF9JTkQxMlcpOwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIElmIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWNhdXNlIG9mIGZ1dHVyZSByZWxheGluZywKLSAgICAgICAgICAgICBpdCB3aWxsIGJlIGhhbmRsZWQgaGVyZSBsaWtlIG90aGVyIGludGVybmFsIElORDEyVwotICAgICAgICAgICAgIHJlbG9jcy4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICAweGIwMDAgfCAoKGZvZmYgPj4gMSkgJiAweGZmZiksCi0JCSAgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBjYW4ndCBmdWxseSByZXNvbHZlIHRoaXMgeWV0LCBiZWNhdXNlIHRoZSBleHRlcm5hbAotICAgICAgICAgICAgIHN5bWJvbCB2YWx1ZSBtYXkgYmUgY2hhbmdlZCBieSBmdXR1cmUgcmVsYXhpbmcuICBXZSBsZXQKLSAgICAgICAgICAgICB0aGUgZmluYWwgbGluayBwaGFzZSBoYW5kbGUgaXQuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgMHhiMDAwLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIFJfU0hfVVNFUyByZWxvYyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKLSAgICAgICAgIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsZW5kOyBpcmVsc2NhbisrKQotCWlmIChFTEYzMl9SX1RZUEUgKGlyZWxzY2FuLT5yX2luZm8pID09IChpbnQpIFJfU0hfVVNFUwotCSAgICAmJiBsYWRkciA9PSBpcmVsc2Nhbi0+cl9vZmZzZXQgKyA0ICsgaXJlbHNjYW4tPnJfYWRkZW5kKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbHNjYW4gPCBpcmVsZW5kKQotCXsKLQkgIC8qIFNvbWUgb3RoZXIgZnVuY3Rpb24gY2FsbCBkZXBlbmRzIHVwb24gdGhpcyByZWdpc3RlciBsb2FkLAotCSAgICAgYW5kIHdlIGhhdmUgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBmdW5jdGlvbiBjYWxsLgotCSAgICAgSW5kZWVkLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byBjb252ZXJ0IGl0LiAgVGhlcmUgaXMKLQkgICAgIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIGEgUl9TSF9DT1VOVCByZWxvYyBvbiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCi0gICAgICAgICBmdW5jdGlvbiBhZGRyZXNzIGlzIHN0b3JlZC4gIERvIHRoaXMgYmVmb3JlIGRlbGV0aW5nIGFueQotICAgICAgICAgYnl0ZXMsIHRvIGF2b2lkIGNvbmZ1c2lvbiBhYm91dCB0aGUgYWRkcmVzcy4gICovCi0gICAgICBmb3IgKGlyZWxjb3VudCA9IGludGVybmFsX3JlbG9jczsgaXJlbGNvdW50IDwgaXJlbGVuZDsgaXJlbGNvdW50KyspCi0JaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gcGFkZHIKLQkgICAgJiYgRUxGMzJfUl9UWVBFIChpcmVsY291bnQtPnJfaW5mbykgPT0gKGludCkgUl9TSF9DT1VOVCkKLQkgIGJyZWFrOwotCi0gICAgICAvKiBEZWxldGUgdGhlIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgaWYgKCEgc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBsYWRkciwgMikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywganVzdCBpbiBjYXNlIGl0IHBlcm1pdHMgc29tZQotICAgICAgICAgb3RoZXIgZnVuY3Rpb24gY2FsbCB0byBjb21lIHdpdGhpbiByYW5nZSwgd2Ugc2hvdWxkIHJlbGF4Ci0gICAgICAgICBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLSAgICAgICphZ2FpbiA9IHRydWU7Ci0KLSAgICAgIC8qIE5vdyBjaGVjayB3aGV0aGVyIHdlIGdvdCBhIENPVU5UIHJlbG9jLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQgPj0gaXJlbGVuZCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgQ09VTlQgcmVsb2MiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIHVzZXMgaXMgc3RvcmVkIGluIHRoZSByX2FkZGVuZCBmaWVsZC4gIFdlJ3ZlCi0gICAgICAgICBqdXN0IGRlbGV0ZWQgb25lLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfYWRkZW5kID09IDApCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgY291bnQiKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC0taXJlbGNvdW50LT5yX2FkZGVuZDsKLQotICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlcywgd2UgY2FuIGRlbGV0ZSB0aGUgYWRkcmVzcy4gIFJlbG9hZAotICAgICAgICAgdGhlIGFkZHJlc3MgZnJvbSBpcmVsZm4sIGluIGNhc2UgaXQgd2FzIGNoYW5nZWQgYnkgdGhlCi0gICAgICAgICBwcmV2aW91cyBjYWxsIHRvIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9hZGRlbmQgPT0gMCkKLQl7Ci0JICBpZiAoISBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGlyZWxmbi0+cl9vZmZzZXQsIDQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFdlJ3ZlIGRvbmUgYWxsIHdlIGNhbiB3aXRoIHRoYXQgZnVuY3Rpb24gY2FsbC4gICovCi0gICAgfQotCi0gIC8qIExvb2sgZm9yIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IHdlIGNhbiBhbGlnbiBvbiBmb3VyCi0gICAgIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmIChoYXZlX2NvZGUpCi0gICAgewotICAgICAgYm9vbGVhbiBzd2FwcGVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBzaF9lbGZfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywKLQkJCQkmc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzd2FwcGVkKQotCXsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gIEZJWE1FOiBUaGVyZSBpcyBhCi0gICBsb3Qgb2YgZHVwbGljYXRpb24gYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCBzaF9yZWxheF9kZWxldGVfYnl0ZXMKLSAgIGluIGNvZmYtc2guYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICBpbnQgc2huZHgsIGluZGV4OwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAmJiBjb3VudCA8ICgxIDw8IGlyZWwtPnJfYWRkZW5kKSkKLQl7Ci0JICBpcmVsYWxpZ24gPSBpcmVsOwotCSAgdG9hZGRyID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBpZiAoaXJlbGFsaWduID09IE5VTEwpCi0gICAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotI2RlZmluZSBOT1BfT1BDT0RFICgweDAwMDkpCi0KLSAgICAgIEJGRF9BU1NFUlQgKChjb3VudCAmIDEpID09IDApOwotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDIpCi0JYmZkX3B1dF8xNiAoYWJmZCwgTk9QX09QQ09ERSwgY29udGVudHMgKyB0b2FkZHIgLSBjb3VudCArIGkpOwotICAgIH0KLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBucmFkZHIsIHN0b3A7Ci0gICAgICBiZmRfdm1hIHN0YXJ0ID0gMDsKLSAgICAgIGludCBpbnNuID0gMDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IG9mZiwgYWRqdXN0LCBvaW5zbjsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmYgPSAwOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBucmFkZHIgPSBpcmVsLT5yX29mZnNldDsKLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpCi0JICB8fCAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfQUxJR04KLQkgICAgICAmJiBpcmVsLT5yX29mZnNldCA9PSB0b2FkZHIpKQotCW5yYWRkciAtPSBjb3VudDsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgcmVsb2Mgd2FzIGZvciB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLCBpbiB3aGljaAotCSBjYXNlIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IGl0LiAgRG9uJ3QgZGVsZXRlIHJlbG9jcyB3aGljaAotCSByZXByZXNlbnQgYWRkcmVzc2VzLCB0aG91Z2guICAqLwotICAgICAgaWYgKGlyZWwtPnJfb2Zmc2V0ID49IGFkZHIKLQkgICYmIGlyZWwtPnJfb2Zmc2V0IDwgYWRkciArIGNvdW50Ci0JICAmJiBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9BTElHTgotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQ09ERQotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfREFUQQotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfTEFCRUwpCi0JaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgIChpbnQpIFJfU0hfTk9ORSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgc2VlIGlmIHRoZSByYW5nZSBpdCBjb3ZlcnMKLSAgICAgICAgIGluY2x1ZGVzIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQuICAqLwotICAgICAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTjoKLQljYXNlIFJfU0hfSU5EMTJXOgotCWNhc2UgUl9TSF9ESVI4V1BaOgotCWNhc2UgUl9TSF9ESVI4V1BMOgotCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVIzMjoKLQkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoaXMKLSAgICAgICAgICAgICBzZWN0aW9uLCBhbmQgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZSBhZGp1c3RlZCBiZWxvdywgd2UKLSAgICAgICAgICAgICBtdXN0IGNoZWNrIHRoZSBhZGRlbmQgdG8gc2VlIGl0IHdpbGwgcHV0IHRoZSB2YWx1ZSBpbgotICAgICAgICAgICAgIHJhbmdlIHRvIGJlIGFkanVzdGVkLCBhbmQgaGVuY2UgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KLQkgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJCWV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJJnN5bSk7Ci0JICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkgICYmIChzeW0uc3RfdmFsdWUgPD0gYWRkcgotCQkgICAgICB8fCBzeW0uc3RfdmFsdWUgPj0gdG9hZGRyKSkKLQkJewotCQkgIGJmZF92bWEgdmFsOwotCi0JCSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCQkgIHZhbCArPSBzeW0uc3RfdmFsdWU7Ci0JCSAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkJfQotCSAgICB9Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgaWYgKG9mZiAmIDB4ODApCi0JICAgIG9mZiAtPSAweDEwMDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9JTkQxMlc6Ci0JICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9mZiA9IGluc24gJiAweGZmZjsKLQkgICAgICBpZiAob2ZmICYgMHg4MDApCi0JCW9mZiAtPSAweDEwMDA7Ci0JICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQWjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IHN0YXJ0ICsgNCArIG9mZiAqIDI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVI4V1BMOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gKHN0YXJ0ICZ+IChiZmRfdm1hKSAzKSArIDQgKyBvZmYgKiA0OwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfU1dJVENIODoKLQljYXNlIFJfU0hfU1dJVENIMTY6Ci0JY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgLyogVGhlc2UgcmVsb2NzIHR5cGVzIHJlcHJlc2VudAotCSAgICAgICAud29yZCBMMi1MMQotCSAgICAgVGhlIHJfYWRkZW5kIGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jCi0JICAgICBhZGRyZXNzIGFuZCBMMS4gIFRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSByZWxvYywgYW5kCi0JICAgICBhZGRpbmcgaW4gdGhlIGNvbnRlbnRzIGdpdmVzIHVzIHRoZSB0b3AuICBXZSBtdXN0IGFkanVzdAotCSAgICAgYm90aCB0aGUgcl9vZmZzZXQgZmllbGQgYW5kIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCSAgICAgTi5CLiBpbiBnYXMgLyBjb2ZmIGJmZCwgdGhlIGVsZiBiZmQgcl9hZGRlbmQgaXMgY2FsbGVkIHJfb2Zmc2V0LAotCSAgICAgYW5kIHRoZSBlbGYgYmZkIHJfb2Zmc2V0IGlzIGNhbGxlZCByX3ZhZGRyLiAgKi8KLQotCSAgc3RvcCA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgc3RhcnQgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RvcCAtIChsb25nKSBpcmVsLT5yX2FkZGVuZCk7Ci0KLQkgIGlmIChzdGFydCA+IGFkZHIKLQkgICAgICAmJiBzdGFydCA8IHRvYWRkcgotCSAgICAgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCSAgICBpcmVsLT5yX2FkZGVuZCArPSBjb3VudDsKLQkgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JCSAgICYmIHN0b3AgPCB0b2FkZHIKLQkJICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9hZGRlbmQgLT0gY291bnQ7Ci0KLQkgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0gxNikKLQkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0g4KQotCSAgICB2b2ZmID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIHZvZmYpOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TSF9VU0VTOgotCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQKLQkJCSAgICArIChsb25nKSBpcmVsLT5yX2FkZGVuZAotCQkJICAgICsgNCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzdGFydCA+IGFkZHIKLQkgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSBjb3VudDsKLSAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JICAgICAgICYmIHN0b3AgPCB0b2FkZHIKLQkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSAtIGNvdW50OwotICAgICAgZWxzZQotCWFkanVzdCA9IDA7Ci0KLSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQl7Ci0JICBvaW5zbiA9IGluc247Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUE46Ci0JICAgIGNhc2UgUl9TSF9ESVI4V1BaOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0lORDEyVzoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BMOgotCSAgICAgIEJGRF9BU1NFUlQgKGFkanVzdCA9PSBjb3VudCB8fCBjb3VudCA+PSA0KTsKLQkgICAgICBpZiAoY291bnQgPj0gNCkKLQkJaW5zbiArPSBhZGp1c3QgLyA0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoaXJlbC0+cl9vZmZzZXQgJiAzKSA9PSAwKQotCQkgICAgKytpbnNuOwotCQl9Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gxNjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IC0gMHg4MDAwIHx8IHZvZmYgPj0gMHg4MDAwKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMTYgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMzI6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfVVNFUzoKLQkgICAgICBpcmVsLT5yX2FkZGVuZCArPSBhZGp1c3Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaXJlbC0+cl9vZmZzZXQgPSBucmFkZHI7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIG90aGVyIHNlY3Rpb25zLiAgSWYgdGhlcmUgY29udGFpbiBhbnkgSU1NMzIKLSAgICAgcmVsb2NzIGFnYWluc3QgaW50ZXJuYWwgc3ltYm9scyB3aGljaCB3ZSBhcmUgbm90IGdvaW5nIHRvIGFkanVzdAotICAgICBiZWxvdywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBhZGRlbmRzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsc2NhbiwgKmlyZWxzY2FuZW5kOwotICAgICAgYmZkX2J5dGUgKm9jb250ZW50czsKLQotICAgICAgaWYgKG8gPT0gc2VjCi0JICB8fCAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgcmVsb2NzLiAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMKLSAgICAgICAgIGZhbHNlLCB3ZSBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLCB3aGVuIHdlCi0gICAgICAgICBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChhYmZkLCBvLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSAgdHJ1ZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2NvbnRlbnRzID0gTlVMTDsKLSAgICAgIGlyZWxzY2FuZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxzY2FuZW5kOyBpcmVsc2NhbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotCi0JICAvKiBEd2FyZiBsaW5lIG51bWJlcnMgdXNlIFJfU0hfU1dJVENIMzIgcmVsb2NzLiAgKi8KLQkgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWxzY2FuLT5yX2luZm8pID09IChpbnQpIFJfU0hfU1dJVENIMzIpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHN0YXJ0LCBzdG9wOwotCSAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmY7Ci0KLQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCXsKLQkJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCSAgICBvY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHM7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0JCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAotCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzID0gb2NvbnRlbnRzOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzdG9wID0gaXJlbHNjYW4tPnJfb2Zmc2V0OwotCSAgICAgIHN0YXJ0Ci0JCT0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0b3AgLSAobG9uZykgaXJlbHNjYW4tPnJfYWRkZW5kKTsKLQotCSAgICAgIC8qIFNUT1AgaXMgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiwgc28gaXQgd29uJ3QgY2hhbmdlLiAgKi8KLQkgICAgICBpZiAoc3RhcnQgPiBhZGRyICYmIHN0YXJ0IDwgdG9hZGRyKQotCQlpcmVsc2Nhbi0+cl9hZGRlbmQgKz0gY291bnQ7Ci0KLQkgICAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIHZvZmYpOwotCi0JICAgICAgaWYgKHN0YXJ0ID4gYWRkcgotCQkgICYmIHN0YXJ0IDwgdG9hZGRyCi0JCSAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JCWJmZF9wdXRfc2lnbmVkXzMyIChhYmZkLCB2b2ZmICsgY291bnQsCi0JCQkJICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgICBlbHNlIGlmIChzdG9wID4gYWRkcgotCQkgICAgICAgJiYgc3RvcCA8IHRvYWRkcgotCQkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQkJYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYgLSBjb3VudCwKLQkJCQkgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICB9Ci0KLQkgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWxzY2FuLT5yX2luZm8pICE9IChpbnQpIFJfU0hfRElSMzIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoRUxGMzJfUl9TWU0gKGlyZWxzY2FuLT5yX2luZm8pID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIGNvbnRpbnVlOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbHNjYW4tPnJfaW5mbyksCi0JCQkJICAgICZzeW0pOwotCi0JICBpZiAoc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAgICAgJiYgKHN5bS5zdF92YWx1ZSA8PSBhZGRyCi0JCSAgfHwgc3ltLnN0X3ZhbHVlID49IHRvYWRkcikpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJewotCQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJICAgIG9jb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50czsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd2UgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLQkJICAgICAgb2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG8tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLCBvY29udGVudHMsCi0JCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgPSBvY29udGVudHM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgICAgdmFsICs9IHN5bS5zdF92YWx1ZTsKLQkgICAgICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCWJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LAotCQkJICAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgotCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotICAgICAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdOwotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmICgoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7Ci0JfQotICAgIH0KLQotICAvKiBTZWUgaWYgd2UgY2FuIG1vdmUgdGhlIEFMSUdOIHJlbG9jIGZvcndhcmQuICBXZSBoYXZlIGFkanVzdGVkCi0gICAgIHJfb2Zmc2V0IGZvciBpdCBhbHJlYWR5LiAgKi8KLSAgaWYgKGlyZWxhbGlnbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWxpZ250bywgYWxpZ25hZGRyOwotCi0gICAgICBhbGlnbnRvID0gQkZEX0FMSUdOICh0b2FkZHIsIDEgPDwgaXJlbGFsaWduLT5yX2FkZGVuZCk7Ci0gICAgICBhbGlnbmFkZHIgPSBCRkRfQUxJR04gKGlyZWxhbGlnbi0+cl9vZmZzZXQsCi0JCQkgICAgIDEgPDwgaXJlbGFsaWduLT5yX2FkZGVuZCk7Ci0gICAgICBpZiAoYWxpZ250byAhPSBhbGlnbmFkZHIpCi0JewotCSAgLyogVGFpbCByZWN1cnNpb24uICAqLwotCSAgcmV0dXJuIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWxpZ25hZGRyLAotCQkJCQkgICAgYWxpZ250byAtIGFsaWduYWRkcik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayBmb3IgbG9hZHMgYW5kIHN0b3JlcyB3aGljaCB3ZSBjYW4gYWxpZ24gdG8gZm91ciBieXRlCi0gICBib3VuZGFyaWVzLiAgVGhpcyBpcyBsaWtlIHNoX2FsaWduX2xvYWRzIGluIGNvZmYtc2guYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywgcHN3YXBwZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICpwc3dhcHBlZDsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfdm1hICpsYWJlbHMgPSBOVUxMOwotICBiZmRfdm1hICpsYWJlbCwgKmxhYmVsX2VuZDsKLQotICAqcHN3YXBwZWQgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBHZXQgYWxsIHRoZSBhZGRyZXNzZXMgd2l0aCBsYWJlbHMgb24gdGhlbS4gICovCi0gIGxhYmVscyA9IChiZmRfdm1hICopIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGJmZF92bWEpKTsKLSAgaWYgKGxhYmVscyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBsYWJlbF9lbmQgPSBsYWJlbHM7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfTEFCRUwpCi0JewotCSAgKmxhYmVsX2VuZCA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgKytsYWJlbF9lbmQ7Ci0JfQotICAgIH0KLQotICAvKiBOb3RlIHRoYXQgdGhlIGFzc2VtYmxlciBjdXJyZW50bHkgYWx3YXlzIG91dHB1dHMgcmVsb2NzIGluCi0gICAgIGFkZHJlc3Mgb3JkZXIuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBzb3J0Ci0gICAgIHRoZSBsYWJlbCB2YWx1ZXMgYW5kIHRoZSByZWxvY3MuICAqLwotCi0gIGxhYmVsID0gbGFiZWxzOwotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN0YXJ0LCBzdG9wOwotCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQ09ERSkKLQljb250aW51ZTsKLQotICAgICAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQotICAgICAgZm9yIChpcmVsKys7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0RBVEEpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsIDwgaXJlbGVuZCkKLQlzdG9wID0gaXJlbC0+cl9vZmZzZXQ7Ci0gICAgICBlbHNlCi0Jc3RvcCA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gICAgICBpZiAoISBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbiAoYWJmZCwgc2VjLCBjb250ZW50cywgc2hfZWxmX3N3YXBfaW5zbnMsCi0JCQkJICAgICAoUFRSKSBpbnRlcm5hbF9yZWxvY3MsICZsYWJlbCwKLQkJCQkgICAgIGxhYmVsX2VuZCwgc3RhcnQsIHN0b3AsIHBzd2FwcGVkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZnJlZSAobGFiZWxzKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGxhYmVscyAhPSBOVUxMKQotICAgIGZyZWUgKGxhYmVscyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU3dhcCB0d28gU0ggaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyBsaWtlIHNoX3N3YXBfaW5zbnMgaW4gY29mZi1zaC5jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9zd2FwX2luc25zIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHJlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSAoRWxmX0ludGVybmFsX1JlbGEgKikgcmVsb2NzOwotICB1bnNpZ25lZCBzaG9ydCBpMSwgaTI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLQotICAvKiBTd2FwIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gICovCi0gIGkxID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgaTIgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTIsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkxLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLQotICAvKiBBZGp1c3QgYWxsIHJlbG9jIGFkZHJlc3Nlcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfc2hfcmVsb2NfdHlwZSB0eXBlOwotICAgICAgaW50IGFkZDsKLQotICAgICAgLyogVGhlcmUgYXJlIGEgZmV3IHNwZWNpYWwgdHlwZXMgb2YgcmVsb2NzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgYWRqdXN0LiAgVGhlc2UgcmVsb2NzIGRvIG5vdCBhcHBseSB0byB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLAotICAgICAgICAgYnV0IGFyZSBvbmx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRkcmVzcy4gICovCi0gICAgICB0eXBlID0gKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKLSAgICAgIGlmICh0eXBlID09IFJfU0hfQUxJR04KLQkgIHx8IHR5cGUgPT0gUl9TSF9DT0RFCi0JICB8fCB0eXBlID09IFJfU0hfREFUQQotCSAgfHwgdHlwZSA9PSBSX1NIX0xBQkVMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiBhbiBSX1NIX1VTRVMgcmVsb2MgcG9pbnRzIHRvIG9uZSBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nCi0gICAgICAgICBzd2FwcGVkLCB3ZSBtdXN0IGFkanVzdCBpdC4gIEl0IHdvdWxkIGJlIGluY29ycmVjdCB0byBkbyB0aGlzCi0gICAgICAgICBmb3IgYSBqdW1wLCB0aG91Z2gsIHNpbmNlIHdlIHdhbnQgdG8gZXhlY3V0ZSBib3RoCi0gICAgICAgICBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIGp1bXAuICAoV2UgaGF2ZSBhdm9pZGVkIHN3YXBwaW5nCi0gICAgICAgICBhcm91bmQgYSBsYWJlbCwgc28gdGhlIGp1bXAgd2lsbCBub3Qgd2luZCB1cCBleGVjdXRpbmcgYW4KLSAgICAgICAgIGluc3RydWN0aW9uIGl0IHNob3VsZG4ndCkuICAqLwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9VU0VTKQotCXsKLQkgIGJmZF92bWEgb2ZmOwotCi0JICBvZmYgPSBpcmVsLT5yX29mZnNldCArIDQgKyBpcmVsLT5yX2FkZGVuZDsKLQkgIGlmIChvZmYgPT0gYWRkcikKLQkgICAgaXJlbC0+cl9vZmZzZXQgKz0gMjsKLQkgIGVsc2UgaWYgKG9mZiA9PSBhZGRyICsgMikKLQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKLQl9Ci0KLSAgICAgIGlmIChpcmVsLT5yX29mZnNldCA9PSBhZGRyKQotCXsKLQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDI7Ci0JICBhZGQgPSAtMjsKLQl9Ci0gICAgICBlbHNlIGlmIChpcmVsLT5yX29mZnNldCA9PSBhZGRyICsgMikKLQl7Ci0JICBpcmVsLT5yX29mZnNldCAtPSAyOwotCSAgYWRkID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JYWRkID0gMDsKLQotICAgICAgaWYgKGFkZCAhPSAwKQotCXsKLQkgIGJmZF9ieXRlICpsb2M7Ci0JICB1bnNpZ25lZCBzaG9ydCBpbnNuLCBvaW5zbjsKLQkgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLQkgIGxvYyA9IGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQ7Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoICh0eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUE46Ci0JICAgIGNhc2UgUl9TSF9ESVI4V1BaOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfSU5EMTJXOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfRElSOFdQTDoKLQkgICAgICAvKiBUaGlzIHJlbG9jIGlnbm9yZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDMgYml0cyBvZgotICAgICAgICAgICAgICAgICB0aGUgcHJvZ3JhbSBjb3VudGVyIGJlZm9yZSBhZGRpbmcgaW4gdGhlIG9mZnNldC4KLSAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IGlmIEFERFIgaXMgYXQgYW4gZXZlbiBhZGRyZXNzLCB0aGUKLSAgICAgICAgICAgICAgICAgc3dhcCB3aWxsIG5vdCBhZmZlY3QgdGhlIG9mZnNldC4gIElmIEFERFIgaXMgYW4gYXQgYW4KLSAgICAgICAgICAgICAgICAgb2RkIGFkZHJlc3MsIHRoZW4gdGhlIGluc3RydWN0aW9uIHdpbGwgYmUgY3Jvc3NpbmcgYQotICAgICAgICAgICAgICAgICBmb3VyIGJ5dGUgYm91bmRhcnksIGFuZCBtdXN0IGJlIGFkanVzdGVkLiAgKi8KLQkgICAgICBpZiAoKGFkZHIgJiAzKSAhPSAwKQotCQl7Ci0JCSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JCSAgb2luc24gPSBpbnNuOwotCQkgIGluc24gKz0gYWRkIC8gMjsKLQkJICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkJfQotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSZWxvY2F0ZSBhbiBTSCBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfdm1hIGFkZGVuZCA9IChiZmRfdm1hKTA7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0gICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICAvKiBNYW55IG9mIHRoZSByZWxvY3MgYXJlIG9ubHkgdXNlZCBmb3IgcmVsYXhpbmcsIGFuZCBhcmUKLSAgICAgICAgIGhhbmRsZWQgZW50aXJlbHkgYnkgdGhlIHJlbGF4YXRpb24gY29kZS4gICovCi0gICAgICBpZiAocl90eXBlID4gKGludCkgUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgPCAwCi0JICB8fCByX3R5cGUgPj0gKGludCkgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgY2VydGFpbmx5IGluY29ycmVjdC4gIEhvd2V2ZXIsIGl0IGlzIGhvdyB0aGUKLSAgICAgICAgIENPRkYgbGlua2VyIHdvcmtzLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgIT0gKGludCkgUl9TSF9ESVIzMgotCSAgJiYgcl90eXBlICE9IChpbnQpIFJfU0hfSU5EMTJXKQotCWNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IHNoX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGZvciBhbiBpbnRlcm5hbCBJTkQxMlcKLSAgICAgICAgICAgICByZWxvY2F0aW9uLiAgRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIGhvdwotICAgICAgICAgICAgIHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotCSAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQkgICAgY29udGludWU7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgaG93IHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQlyZWxvY2F0aW9uIC09IDQ7Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWNhc2UgKGludClSX1NIX0RJUjMyOgotCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ09GRiByZWxvY3MgZG9uJ3QgdXNlIHRoZSBhZGRlbmQuIFRoZSBhZGRlbmQgaXMgdXNlZCBmb3IgUl9TSF9ESVIzMiAKLQkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGNvbXBpbGVycy4gKi8KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1zaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCWRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotCWZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0JZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLQlmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMCi0gICAgICAmJiBpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1zdGF0aWMgYXNlY3Rpb24gKgotc2hfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfU0hfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9TSF9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICAvKiB3ZSBkb24ndCB1c2UgZ290IGFuZCBwbHQgZW50cmllcyBmb3Igc2guICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9TSF9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9TSF9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfc2hfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXNoIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfc2hsX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXNobCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3NoCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fU0gKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJc2hfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCXNoX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24Jc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCQlzaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICBzaF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgc2hfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICBzaF9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1zcGFyYy5jIGIvYmZkL2VsZjMyLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjcwMmMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcxICswLDAgQEAKLS8qIFNQQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmMzJfc3BhcmNfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX2FkanVzdF9keW5pbmR4Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0MCi0vKiBUaGUgcmVsb2NhdGlvbiAiaG93dG8iIHRhYmxlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotcmVsb2NfaG93dG9fdHlwZSBfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QTFQzMiwgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QTFQzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVBMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19MT1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDMyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDMyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMCwgICAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEwIiwgICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTEsICAgICAgICAwLDIsMTEsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMSIsICAgICAgZmFsc2UsMCwweDAwMDAwN2ZmLHRydWUpLAotICAvKiBUaGVzZSBhcmUgZm9yIHNwYXJjNjQgaW4gYSA2NCBiaXQgZW52aXJvbm1lbnQuCi0gICAgIFZhbHVlcyBuZWVkIHRvIGJlIGhlcmUgYmVjYXVzZSB0aGUgdGFibGUgaXMgaW5kZXhlZCBieSByZWxvYyBudW1iZXIuICAqLwotICBIT1dUTyhSX1NQQVJDXzY0LCAgICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfT0xPMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISDIyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hNMTAsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ISDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ19ISDIyIiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hNMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENfTE0yMiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgLyogRW5kIHNwYXJjNjQgaW4gNjQgYml0IGVudmlyb25tZW50IHZhbHVlcy4KLSAgICAgVGhlIGZvbGxvd2luZyBhcmUgZm9yIHNwYXJjNjQgaW4gYSAzMiBiaXQgZW52aXJvbm1lbnQuICAqLwotICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVWMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVWMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLX07Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl9TUEFSQ19HTlVfVlRJTkhFUklULCAwLDIsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1NQQVJDX0dOVV9WVElOSEVSSVQiLCBmYWxzZSwwLCAwLCBmYWxzZSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfU1BBUkNfR05VX1ZURU5UUlksIDAsMiwwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwiUl9TUEFSQ19HTlVfVlRFTlRSWSIsIGZhbHNlLDAsMCwgZmFsc2UpOwotCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KLS8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLSAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAotICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAotICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKLSAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1JFVjMyLCBSX1NQQVJDX1JFVjMyIH0sCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfU1BBUkNfR05VX1ZUSU5IRVJJVH0sCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NQQVJDX0dOVV9WVEVOVFJZfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICByZXR1cm4gJmVsZjMyX3NwYXJjX3Z0aW5oZXJpdF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIHJldHVybiAmZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0bzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgICByZXR1cm4gJl9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgRUxGMzJfUl9UWVBFIHNvIHdlIGhhdmUgb3VyIG93biBjb3B5IG9mIHRoaXMgZnVuY3Rpb24sCi0gICBhbmQgZWxmNjQtc3BhcmMuYyBoYXMgaXRzIG93biBjb3B5LiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgc3dpdGNoIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pKQotICAgIHsKLSAgICBjYXNlIFJfU1BBUkNfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmMzJfc3BhcmNfdnRpbmhlcml0X2hvd3RvOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfU1BBUkNfR05VX1ZURU5UUlk6Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX3NwYXJjX3Z0ZW50cnlfaG93dG87Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXhfc3RkKTsKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKV07Ci0gICAgfQotfQotDAotLyogRm9yIHVuc3VwcG9ydGVkIHJlbG9jcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MgKGFiZmQsCi0JCQkgICAgIHJlbG9jX2VudHJ5LAotCQkJICAgICBzeW1ib2wsCi0JCQkgICAgIGRhdGEsCi0JCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIG91dHB1dF9iZmQsCi0JCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotLyogSGFuZGxlIHRoZSBXRElTUDE2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MgKGFiZmQsCi0JCQkgcmVsb2NfZW50cnksCi0JCQkgc3ltYm9sLAotCQkJIGRhdGEsCi0JCQkgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLAotCQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgeDsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQl8ICgocmVsb2NhdGlvbiA+PiAyKSAmIDB4M2ZmZikpOwotICBiZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgLSAweDQwMDAwCi0gICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPiAweDNmZmZmKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogRnVuY3Rpb25zIGZvciB0aGUgU1BBUkMgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgbm9wIG9wY29kZSB3ZSB1c2UuICAqLwotCi0jZGVmaW5lIFNQQVJDX05PUCAweDAxMDAwMDAwCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLQotLyogVGhlIGZpcnN0IGZvdXIgZW50cmllcyBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFyZSByZXNlcnZlZCwKLSAgIGFuZCB0aGUgaW5pdGlhbCBjb250ZW50cyBhcmUgdW5pbXBvcnRhbnQgKHdlIHplcm8gdGhlbSBvdXQpLgotICAgU3Vic2VxdWVudCBlbnRyaWVzIGxvb2sgbGlrZSB0aGlzLiAgU2VlIHRoZSBTVlI0IEFCSSBTUEFSQwotICAgc3VwcGxlbWVudCB0byBzZWUgaG93IHRoaXMgd29ya3MuICAqLwotCi0vKiBzZXRoaSAlaGkoLi0ucGx0MCksJWcxLiAgV2UgZmlsbCBpbiB0aGUgYWRkcmVzcyBsYXRlci4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMCAweDAzMDAwMDAwCi0vKiBiLGEgLnBsdDAuICBXZSBmaWxsIGluIHRoZSBvZmZzZXQgbGF0ZXIuICAqLwotI2RlZmluZSBQTFRfRU5UUllfV09SRDEgMHgzMDgwMDAwMAotLyogbm9wLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQyIFNQQVJDX05PUAotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbGdvdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX1NQQVJDX0dPVDEwOgotCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoZHlub2JqID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0KLQkgIC8qIElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZSB0aGFuIDB4MTAwMCBieXRlcywgd2UgYWRkCi0JICAgICAweDEwMDAgdG8gdGhlIHZhbHVlIG9mIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgc28gdGhhdCAxMwotCSAgICAgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPj0gMHgxMDAwCi0JICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID09IDApCi0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgV1BMVDMwCi0gICAgICAgICAgICAgICAgIHJlbG9jIGZvciBhIGxvY2FsIHN5bWJvbCBpZiB5b3UgYXNzZW1ibGUgYSBjYWxsIGZyb20KLSAgICAgICAgICAgICAgICAgb25lIHNlY3Rpb24gdG8gYW5vdGhlciB3aGVuIHVzaW5nIC1LIHBpYy4gIFdlIHRyZWF0Ci0gICAgICAgICAgICAgICAgIGl0IGFzIFdESVNQMzAuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19QQzEwOgotCWNhc2UgUl9TUEFSQ19QQzIyOgotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQljYXNlIFJfU1BBUkNfRElTUDMyOgotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCB3ZSBkbyBub3QgbmVlZCB0byBjb3B5Ci0gICAgICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcwotICAgICAgICAgICAgIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZSBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sCi0gICAgICAgICAgICAgREVGX1JFR1VMQVIgaXMgc2V0KS4gIEZJWE1FOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm90Ci0gICAgICAgICAgICAgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGF0Ci0gICAgICAgICAgICAgREVGX1JFR1VMQVIgaXMgbm90IHNldCBub3cgYnV0IHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcwotICAgICAgICAgICAgIG5ldmVyIGNsZWFyZWQpLiAgVGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGluCi0gICAgICAgICAgICAgZWxmMzItaTM4Ni5jLiAgKi8KLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCAoaW5mby0+c3ltYm9saWMKLQkJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDXzg6Ci0JY2FzZSBSX1NQQVJDXzE2OgotCWNhc2UgUl9TUEFSQ18zMjoKLQljYXNlIFJfU1BBUkNfSEkyMjoKLQljYXNlIFJfU1BBUkNfMjI6Ci0JY2FzZSBSX1NQQVJDXzEzOgotCWNhc2UgUl9TUEFSQ19MTzEwOgotCWNhc2UgUl9TUEFSQ19VQTMyOgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0KLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfU1BBUkNfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLQotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfU1BBUkNfR09UMTA6Ci0gICAgICBjYXNlIFJfU1BBUkNfR09UMTM6Ci0gICAgICBjYXNlIFJfU1BBUkNfR09UMjI6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5nb3QucmVmY291bnQtLTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JICAgICAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0tLTsKLQkgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUl9TUEFSQ19QTFQzMjoKLSAgICAgIGNhc2UgUl9TUEFSQ19ISVBMVDIyOgotICAgICAgY2FzZSBSX1NQQVJDX0xPUExUMTA6Ci0gICAgICBjYXNlIFJfU1BBUkNfUENQTFQzMjoKLSAgICAgIGNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+cGx0LnJlZmNvdW50LS07Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyCi0gICAgIChhbHRob3VnaCB3ZSBjb3VsZCBhY3R1YWxseSBkbyBpdCBoZXJlKS4gIFRoZSBTVFRfTk9UWVBFCi0gICAgIGNvbmRpdGlvbiBpcyBhIGhhY2sgc3BlY2lmaWNhbGx5IGZvciB0aGUgT3JhY2xlIGxpYnJhcmllcwotICAgICBkZWxpdmVyZWQgZm9yIFNvbGFyaXM7IGZvciBzb21lIGluZXhwbGljYWJsZSByZWFzb24sIHRoZXkgZGVmaW5lCi0gICAgIHNvbWUgb2YgdGhlaXIgZnVuY3Rpb25zIGFzIFNUVF9OT1RZUEUgd2hlbiB0aGV5IHJlYWxseSBzaG91bGQgYmUKLSAgICAgU1RUX0ZVTkMuICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMAotICAgICAgfHwgKGgtPnR5cGUgPT0gU1RUX05PVFlQRQotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkpCi0gICAgewotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgIHx8ICgoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFdQTFQzMCByZWxvYyBpbiBhbiBpbnB1dAotCSAgICAgZmlsZSwgYnV0IG5vbmUgb2YgdGhlIGlucHV0IGZpbGVzIHdlcmUgZHluYW1pYyBvYmplY3RzLgotCSAgICAgT3IsIHdoZW4gbGlua2luZyB0aGUgbWFpbiBhcHBsaWNhdGlvbiBvciBhIC1Cc3ltYm9saWMKLQkgICAgIHNoYXJlZCBsaWJyYXJ5IGFnYWluc3QgUElDIGNvZGUuICBPciB3aGVuIGEgZ2xvYmFsIHN5bWJvbAotCSAgICAgaGFzIGJlZW4gbWFkZSBwcml2YXRlLCBlLmcuIHZpYSB2ZXJzaW9uaW5nLgotCi0JICAgICBJbiB0aGVzZSBjYXNlcyB3ZSBrbm93IHdoYXQgdmFsdWUgdGhlIHN5bWJvbCB3aWxsIHJlc29sdmUKLQkgICAgIHRvLCBzbyB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkIGEgcHJvY2VkdXJlIGxpbmthZ2UKLQkgICAgIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBXRElTUDMwIHJlbG9jIGluc3RlYWQuICAqLwotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBUaGUgZmlyc3QgZm91ciBlbnRyaWVzIGluIC5wbHQgYXJlIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSA0ICogUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBoYXMgYSBtYXhpbXVtIHNpemUuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+PSAweDQwMDAwMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLSAgICAgICBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLSAgICAgICBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotICAgICAgIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0gICAgICAgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgICAgewotCWgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLSAgICAgIH0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfU1BBUkNfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlcgotICAgICB0byBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGJvb2xlYW4gcmVscGx0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotCi0gICAgICAvKiBNYWtlIHNwYWNlIGZvciB0aGUgdHJhaWxpbmcgbm9wIGluIC5wbHQuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+IDApCi0Jcy0+X3Jhd19zaXplICs9IDQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3Qgc2VjdGlvbi4KLSAgICAgICAgIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLSAgICAgICAgIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWxhLmdvdCwKLSAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHJlbHRleHQgPSBmYWxzZTsKLSAgcmVscGx0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBpdCBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgaXQgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsYS5wbHQiKSA9PSAwKQotCQlyZWxwbHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5nb3QiKSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uCi0gICAgIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbiBmb3Igd2hpY2ggd2UgbWlnaHQgbmVlZCB0byBjb3B5Ci0gICAgIHJlbG9jcy4gIFRoZXNlIGFyZSBsb2NhbCBzeW1ib2xzLCB3aGljaCBtZWFucyB0aGF0IHRoZXkgbXVzdCBjb21lCi0gICAgIGZpcnN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIFRoYXQgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQKLSAgICAgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGV4IG9mIGV2ZXJ5IG90aGVyIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBpbnQgYzsKLQotICAgICAgYyA9IDA7Ci0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwCi0JICAgICAgfHwgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSBjICsgMTsKLQotCSAgLyogVGhlc2Ugc3ltYm9scyB3aWxsIGhhdmUgbm8gbmFtZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAgICAgICAgICAgICBmaWRkbGUgd2l0aCBkeW5zdHJfaW5kZXguICAqLwotCi0JICArK2M7Ci0JfQotCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBlbGYzMl9zcGFyY19hZGp1c3RfZHluaW5keCwKLQkJCSAgICAgIChQVFIpICZjKTsKLSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgKz0gYzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEluY3JlbWVudCB0aGUgaW5kZXggb2YgYSBkeW5hbWljIHN5bWJvbCBieSBhIGdpdmVuIGFtb3VudC4gIENhbGxlZAotICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmluZHggKGgsIGNwYXJnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGNwYXJnOwotewotICBpbnQgKmNwID0gKGludCAqKSBjcGFyZzsKLQotICBpZiAoaC0+ZHluaW5keCAhPSAtMSkKLSAgICBoLT5keW5pbmR4ICs9ICpjcDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgU1BBUkMgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGJmZF92bWEgZ290X2Jhc2U7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9PSBOVUxMKQotICAgIGdvdF9iYXNlID0gMDsKLSAgZWxzZQotICAgIGdvdF9iYXNlID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcGx0ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl90eXBlID09IFJfU1BBUkNfR05VX1ZUSU5IRVJJVCAKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19HTlVfVlRFTlRSWSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1NQQVJDX21heF9zdGQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGlmICgocl90eXBlID09IFJfU1BBUkNfV1BMVDMwCi0JCSAgICYmIGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIHx8ICgocl90eXBlID09IFJfU1BBUkNfR09UMTAKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0dPVDEzCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19HT1QyMikKLQkJICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgICAgJiYgKCEgaW5mby0+c2hhcmVkCi0JCQkgIHx8ICghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JCSAgICAgICYmIChyX3R5cGUgPT0gUl9TUEFSQ184Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0RJU1A4Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0RJU1AxNgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQMzIKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AzMAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19XRElTUDIyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMTkKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AxNgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ISTIyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzIyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzEzCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0xPMTAKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfVUEzMgotCQkJICB8fCAoKHJfdHlwZSA9PSBSX1NQQVJDX1BDMTAKLQkJCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19QQzIyKQotCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9TUEFSQ19HT1QxMDoKLQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JY2FzZSBSX1NQQVJDX0dPVDIyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKLSAgICAgICAgICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLSAgICAgICAgICAgICAgICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKLSAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZSBtdXN0IGluaXRpYWxpemUKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZQotCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jCi0JCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQkJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCQkgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgV1BMVDMwIHJlbG9jCi0JICAgICBmb3IgYSBsb2NhbCBzeW1ib2wgaWYgeW91IGFzc2VtYmxlIGEgY2FsbCBmcm9tIG9uZQotCSAgICAgc2VjdGlvbiB0byBhbm90aGVyIHdoZW4gdXNpbmcgLUsgcGljLiAgV2UgdHJlYXQgaXQgYXMKLQkgICAgIFdESVNQMzAuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkJKyBoLT5wbHQub2Zmc2V0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgKGluZm8tPnN5bWJvbGljCi0JCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ184OgotCWNhc2UgUl9TUEFSQ18xNjoKLQljYXNlIFJfU1BBUkNfMzI6Ci0JY2FzZSBSX1NQQVJDX0hJMjI6Ci0JY2FzZSBSX1NQQVJDXzIyOgotCWNhc2UgUl9TUEFSQ18xMzoKLQljYXNlIFJfU1BBUkNfTE8xMDoKLQljYXNlIFJfU1BBUkNfVUEzMjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLSAgICAgICAgICAgICAgICAgdGltZS4gICovCi0KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChpbnB1dF9iZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF92bWEgb2ZmOwotCi0JCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCX0KLQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChza2lwKQotCQltZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAotCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocl90eXBlID09IFJfU1BBUkNfMzIpCi0JCSAgICB7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCX0KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCWluZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQotCQkJICAvKiBGSVhNRTogd2UgcmVhbGx5IHNob3VsZCBiZSBhYmxlIHRvIGxpbmsgbm9uLXBpYwotCQkJICAgICBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQkJCSAgaWYgKGluZHggPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJCShfKCIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgICAgIHJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQotCQkgICAgICAvKiBGb3Igbm9uLVJFTEFUSVZFIGR5bmFtaWMgcmVsb2NhdGlvbnMsIHdlIGtlZXAgdGhlCi0JCQkgc2FtZSBzeW1ib2wsIGFuZCBzbyBnZW5lcmFsbHkgdGhlIHNhbWUgYWRkZW5kLiAgQnV0Ci0JCQkgd2UgZG8gbmVlZCB0byBhZGp1c3QgdGhvc2UgcmVsb2NhdGlvbnMgcmVmZXJlbmNpbmcKLQkJCSBzZWN0aW9ucy4gICovCi0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgJiYgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCSAgICAgICAgb3V0cmVsLnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCtzeW0tPnN0X3ZhbHVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0gICAgICAgICAgICAgICAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0gICAgICAgICAgICAgICAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChza2lwCi0JCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgfHwgRUxGMzJfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQotCQljb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocl90eXBlID09IFJfU1BBUkNfV0RJU1AxNikKLQl7Ci0JICBiZmRfdm1hIHg7Ci0KLQkgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgcmVsb2NhdGlvbiAtPSByZWwtPnJfb2Zmc2V0OwotCi0JICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQkJfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAotCSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0JICAgIHIgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICBlbHNlCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfU1BBUkNfUkVWMzIpCi0JewotCSAgYmZkX3ZtYSB4OwotCi0JICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0KLQkgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICB4ID0geCArIHJlbG9jYXRpb247Ci0JICBiZmRfcHV0bDMyICgvKmlucHV0X2JmZCwqLyB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgciA9IGJmZF9yZWxvY19vazsKLQl9Ci0gICAgICBlbHNlCi0JciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLSAgICAgICAgIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIFBMVF9FTlRSWV9XT1JEMCArIGgtPnBsdC5vZmZzZXQsCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKFBMVF9FTlRSWV9XT1JEMQotCQkgICArICgoKC0gKGgtPnBsdC5vZmZzZXQgKyA0KSkgPj4gMikgJiAweDNmZmZmZikpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0VOVFJZX1dPUkQyLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDgpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19KTVBfU0xPVCk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDQpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLSAgICAgICAgIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0dMT0JfREFUKTsKLQl9Ci0KLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfQ09QWSk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgcy0+Y29udGVudHMKLQkJCQkgICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotICBhc2VjdGlvbiAqc2dvdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBib29sZWFuIHNpemU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENsZWFyIHRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLAotCSBhbmQgcHV0IGEgbm9wIGluIHRoZSBsYXN0IGZvdXIgYnl0ZXMuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgbWVtc2V0IChzcGx0LT5jb250ZW50cywgMCwgNCAqIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX05PUCwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBzcGx0LT5fcmF3X3NpemUgLSA0KTsKLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JUExUX0VOVFJZX1NJWkU7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IGM7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQotICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOwotCi0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaW50IGluZHg7Ci0KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkgICAgIChQVFIpICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOwotCi0JICArK2M7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCi0gICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPSBjICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgZV9mbGFncyBmaWVsZC4KLQotICAgV2UgZG9uJ3QgZGVmaW5lIHNldF9wcml2YXRlX2ZsYWdzIG9yIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBiZWNhdXNlCi0gICB0aGUgb25seSBjdXJyZW50bHkgZGVmaW5lZCB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBiZmQgbWFjaCBudW1iZXIsCi0gICBzbyB3ZSB1c2UgdGhlIGxhdHRlciBpbnN0ZWFkIGFuZCBkZWZlciBzZXR0aW5nIGVfZmxhZ3MgdW50aWwgdGhlCi0gICBmaWxlIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBib29sZWFuIGVycm9yOwotICBzdGF0aWMgaW50IHByZXZpb3VzX2liZmRfZV9mbGFncyA9IC0xOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBlcnJvciA9IGZhbHNlOwotCi0jaWYgMAotICAvKiA/Pz8gVGhlIG5hdGl2ZSBsaW5rZXIgZG9lc24ndCBkbyB0aGlzIHNvIHdlIGNhbid0IChvdGhlcndpc2UgZ2NjIHdvdWxkCi0gICAgIGhhdmUgdG8ga25vdyB3aGljaCBsaW5rZXIgaXMgYmVpbmcgdXNlZCkuICBJbnN0ZWFkLCB0aGUgbmF0aXZlIGxpbmtlcgotICAgICBidW1wcyB1cCB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIHdoZW4gaXQgaGFzIHRvLiAgSG93ZXZlciwgSSBzdGlsbCB0aGluawotICAgICB3YXJuaW5ncyBsaWtlIHRoZXNlIGFyZSBnb29kLCBzbyBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgdGhlbSB0dXJuZWQgb24KLSAgICAgYnkgc29tZSBvcHRpb24uICAqLwotCi0gIC8qIElmIHRoZSBvdXRwdXQgbWFjaGluZSBpcyBub3JtYWwgc3BhcmMsIHdlIGNhbid0IGFsbG93IHY5IGlucHV0IGZpbGVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPT0gYmZkX21hY2hfc3BhcmMKLSAgICAgICYmIChiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwotCSAgfHwgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKSkKLSAgICB7Ci0gICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhIHY4cGx1cyBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotICAvKiBJZiB0aGUgb3V0cHV0IG1hY2hpbmUgaXMgdjksIHdlIGNhbid0IGFsbG93IHY5K3ZpcyBpbnB1dCBmaWxlcy4gICovCi0gIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwotICAgICAgJiYgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzYSBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OHBsdXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgIH0KLSNlbHNlCi0gIGlmIChiZmRfZ2V0X21hY2ggKGliZmQpID49IGJmZF9tYWNoX3NwYXJjX3Y5KQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgNjQgYml0IHN5c3RlbSBhbmQgdGFyZ2V0IGlzIDMyIGJpdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKLSAgICBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotI2VuZGlmCi0KLSAgaWYgKCgoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0gICAgICAgIT0gcHJldmlvdXNfaWJmZF9lX2ZsYWdzKQotICAgICAgJiYgcHJldmlvdXNfaWJmZF9lX2ZsYWdzID49IDApCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIGxpdHRsZSBlbmRpYW4gZmlsZXMgd2l0aCBiaWcgZW5kaWFuIGZpbGVzIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICB9Ci0gIHByZXZpb3VzX2liZmRfZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfTEVEQVRBOwotCi0gIGlmIChlcnJvcikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID09IEVNX1NQQVJDMzJQTFVTKQotICAgIHsKLSAgICAgIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0JcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotCQkJCQkgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpOwotICAgICAgZWxzZSBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ18zMlBMVVMpCi0JcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotCQkJCQkgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0gICAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYyk7Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgdGhlIG9iamVjdCBmaWxlLgotICAgV2UgbmVlZCB0byBzZXQgdGhlIGVfbWFjaGluZSBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlcjsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjIDoKLSAgICAgIGJyZWFrOyAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgOgotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX1NQQVJDMzJQTFVTOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX1NQQVJDXzMyUExVU19NQVNLOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfMzJQTFVTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXNhIDoKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9TUEFSQzMyUExVUzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9TUEFSQ18zMlBMVVNfTUFTSzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUyB8IEVGX1NQQVJDX1NVTl9VUzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSA6Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID0gRU1fU1BBUkM7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9TUEFSQ19MRURBVEE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmMzJfc3BhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmMzItc3BhcmMiCi0jZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgRU1fU1BBUkMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSBFTV9TUEFSQzMyUExVUwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgMHgxMDAwMAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCWVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCWVsZjMyX3NwYXJjX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQllbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgZWxmMzJfc3BhcmNfZ2Nfc3dlZXBfaG9vawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSA0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSAoNCpQTFRfRU5UUllfU0laRSkKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXY4NTAuYyBiL2JmZC9lbGYzMi12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTYwZTguLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXY4NTAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMzQgKzAsMCBAQAotLyogVjg1MC1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0KLS8qIFhYWCBGSVhNRTogVGhpcyBjb2RlIGlzIGxpdHRlcmVkIHdpdGggMzJiaXQgaW50LCAxNmJpdCBzaG9ydCwgOGJpdCBjaGFyCi0gICBkZXBlbmRlbmNpZXMuICBBcyBpcyB0aGUgZ2FzICYgc2ltdWxhdG9yIGNvZGUgb3IgdGhlIHY4NTAuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi92ODUwLmgiCi0KLS8qIHNpZ24tZXh0ZW5kIGEgMjQtYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUMjQoeCkJKCgoKHgpICYgMHhmZmZmZmYpIF4gKH4gMHg3ZmZmZmYpKSArIDB4ODAwMDAwKQotICAgICAgCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqdjg1MF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsYQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdjg1MF9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgaW50LCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIHJlbWVtYmVyX2hpMTZzX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKiBmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJmZF92bWEsCi0JICAgYmZkX3ZtYSwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCB2ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLQotLyogTm90ZTogSXQgaXMgUkVRVUlSRUQgdGhhdCB0aGUgJ3R5cGUnIHZhbHVlIG9mIGVhY2ggZW50cnkgaW4gdGhpcyBhcnJheQotICAgbWF0Y2ggdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgYXJyYXkuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgdjg1MF9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9OT05FLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX05PTkUiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBQQyByZWxhdGl2ZSA5IGJpdCBicmFuY2guICovCi0gIEhPV1RPIChSX1Y4NTBfOV9QQ1JFTCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF85X1BDUkVMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgMjIgYml0IGJyYW5jaC4gKi8KLSAgSE9XVE8gKFJfVjg1MF8yMl9QQ1JFTCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjIsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNywJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfMjJfUENSRUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZmZmODAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmZmY4MCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX1Y4NTBfSEkxNl9TLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9ISTE2X1MiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0hJMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0hJMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0xPMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0xPMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaW1wbGUgMzJiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9WODUwXzMyLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF8zMiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDE2Yml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF8xNiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDhiaXQgcmVsb2MuCSAqLwotICBIT1dUTyAoUl9WODUwXzgsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzgiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTUgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMSwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZSwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNSBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZSwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfNl84X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMSwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV82XzhfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2UsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4N2UsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzdfOF9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfN184X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzdfN19PRkZTRVQsCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDcsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfN183X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyISAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA1IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzRfNV9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfNF81X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDBmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDBmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV80XzRfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzRfNF9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUwMDIwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUwMDIwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX0NBTExUXzZfN19PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNywJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0NBTExUXzZfN19PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9WODUwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1Y4NTBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX1Y4NTBfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1Y4NTBfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBWODUwIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXAKLXsKLSAgLyogQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUIGlzIDI1OCwgd2hpY2ggd2lsbCBub3QgZml4IGluIGFuCi0gICAgIHVuc2lnbmVkIGNoYXIuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXAgdjg1MF9lbGZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLAkJUl9WODUwX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF85X1BDUkVMLAlSX1Y4NTBfOV9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMLAlSX1Y4NTBfMjJfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLAkJUl9WODUwX0hJMTZfUyB9LAotICB7IEJGRF9SRUxPQ19ISTE2LAkJUl9WODUwX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTE8xNiwJCVJfVjg1MF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLAkJUl9WODUwXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LAkJUl9WODUwXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzgsCQlSX1Y4NTBfOCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQsIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VULCBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQsIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQsICAgUl9WODUwX1REQV82XzhfT0ZGU0VUICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVCwgICBSX1Y4NTBfVERBXzdfOF9PRkZTRVQgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VULCAgIFJfVjg1MF9UREFfN183X09GRlNFVCAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCwgICAgICAgICBSX1Y4NTBfVERBXzRfNV9PRkZTRVQgICAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VULCAgICAgICAgIFJfVjg1MF9UREFfNF80X09GRlNFVCAgICAgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULCBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQsICAgICAgIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUICAgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULCAgICAgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCAgICAgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsICAgICAgICAgICAgICAgUl9WODUwX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgICAgICAgICAgICAgICAgUl9WODUwX0dOVV9WVEVOVFJZIH0sCi0KLX07Ci0KLQwKLS8qIE1hcCBhIGJmZCByZWxvY2F0aW9uIGludG8gdGhlIGFwcHJvcHJpYXRlIGhvd3RvIHN0cnVjdHVyZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotdjg1MF9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKHY4NTBfZWxmX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAodjg1MF9lbGZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQl7Ci0JICBCRkRfQVNTRVJUICh2ODUwX2VsZl9ob3d0b190YWJsZVt2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF0udHlwZSA9PSB2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbCk7Ci0JICAKLQkgIHJldHVybiAmIHY4NTBfZWxmX2hvd3RvX3RhYmxlW3Y4NTBfZWxmX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0MCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIFY4NTAgRUxGIHJlbG9jLiAgKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBhcmVsZW50ICogICAgICAgICAgICAgY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKiAgZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1Y4NTBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZ2ODUwX2VsZl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGEgVjg1MCBFTEYgcmVsb2MgKHR5cGUgUkVMQSkuICovCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgICAgICAgICAgICBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgICAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1Y4NTBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZ2ODUwX2VsZl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgcmVsb2NzOwotewotICBib29sZWFuIHJldCA9IHRydWU7Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgZW51bSB2ODUwX3JlbG9jX3R5cGUgcl90eXBlOwotICBpbnQgb3RoZXIgPSAwOwotICBjb25zdCBjaGFyICpjb21tb24gPSAoY29uc3QgY2hhciAqKTA7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInY4NTBfZWxmX2NoZWNrX3JlbG9jcyBjYWxsZWQgZm9yIHNlY3Rpb24gJXMgaW4gJXNcbiIsCi0JICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICByX3R5cGUgPSAoZW51bSB2ODUwX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBSX1Y4NTBfTk9ORToKLQljYXNlIFJfVjg1MF85X1BDUkVMOgotCWNhc2UgUl9WODUwXzIyX1BDUkVMOgotCWNhc2UgUl9WODUwX0hJMTZfUzoKLQljYXNlIFJfVjg1MF9ISTE2OgotCWNhc2UgUl9WODUwX0xPMTY6Ci0JY2FzZSBSX1Y4NTBfMzI6Ci0JY2FzZSBSX1Y4NTBfMTY6Ci0JY2FzZSBSX1Y4NTBfODoKLQljYXNlIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOgotCWNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKLQkgIGJyZWFrOwotCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0JY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLQljYXNlIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfU0RBOwotCSAgY29tbW9uID0gIi5zY29tbW9uIjsKLQkgIGdvdG8gc21hbGxfZGF0YV9jb21tb247Ci0JICAKLQljYXNlIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDoKLQkgIG90aGVyID0gVjg1MF9PVEhFUl9aREE7Ci0JICBjb21tb24gPSAiLnpjb21tb24iOwotCSAgZ290byBzbWFsbF9kYXRhX2NvbW1vbjsKLQkgIAotCWNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV82XzhfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV83XzhfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV83XzdfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfVERBOwotCSAgY29tbW9uID0gIi50Y29tbW9uIjsKLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0jZGVmaW5lIFY4NTBfT1RIRVJfTUFTSyAoVjg1MF9PVEhFUl9UREEgfCBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBKQotCi0Jc21hbGxfZGF0YV9jb21tb246Ci0JICBpZiAoaCkKLQkgICAgewotCSAgICAgIGgtPm90aGVyIHw9IG90aGVyOwkvKiBmbGFnIHdoaWNoIHR5cGUgb2YgcmVsb2NhdGlvbiB3YXMgdXNlZCAqLwotCSAgICAgIGlmICgoaC0+b3RoZXIgJiBWODUwX09USEVSX01BU0spICE9IChvdGhlciAmIFY4NTBfT1RIRVJfTUFTSykKLQkJICAmJiAoaC0+b3RoZXIgJiBWODUwX09USEVSX0VSUk9SKSA9PSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqIG1zZzsKLQkJICBzdGF0aWMgY2hhciAgYnVmZlsyMDBdOyAvKiBYWFggKi8KLQotCQkgIHN3aXRjaCAoaC0+b3RoZXIgJiBWODUwX09USEVSX01BU0spCi0JCSAgICB7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBvY2N1cHkgaW4gbXVsdGlwbGUgc21hbGwgZGF0YSByZWdpb25zIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2FuIG9ubHkgYmUgaW4gb25lIG9mIHRoZSBzbWFsbCwgemVybywgYW5kIHRpbnkgZGF0YSByZWdpb25zIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB6ZXJvIGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1REQToKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFY4NTBfT1RIRVJfWkRBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IGJlIGluIGJvdGggemVybyBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBzcHJpbnRmIChidWZmLCBtc2csIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkgIGluZm8tPmNhbGxiYWNrcy0+d2FybmluZyAoaW5mbywgYnVmZiwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJICAgIGFiZmQsIGgtPnJvb3QudS5kZWYuc2VjdGlvbiwgMCk7Ci0KLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBoLT5vdGhlciB8PSBWODUwX09USEVSX0VSUk9SOwotCQkgIHJldCA9IGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgaC0+cm9vdC51LmMucAotCSAgICAgICYmICFzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoLT5yb290LnUuYy5wLT5zZWN0aW9uKSwgIkNPTU1PTiIpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlY3Rpb24gPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBjb21tb24pOwotCSAgICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJ2ODUwX2VsZl9jaGVja19yZWxvY3MsIGZvdW5kICVzIHJlbG9jYXRpb24gZm9yICVzJXNcbiIsCi0JCSAgIHY4NTBfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLm5hbWUsCi0JCSAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iLAotCQkgICAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSA/ICIsIHN5bWJvbCBpcyBjb21tb24iIDogIiIpOwotI2VuZGlmCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBJbiB0aGUgb2xkIHZlcnNpb24sIHdoZW4gYW4gZW50cnkgd2FzIGNoZWNrZWQgb3V0IGZyb20gdGhlIHRhYmxlLAotICogaXQgd2FzIGRlbGV0ZWQuICBUaGlzIHByb2R1Y2VkIGFuIGVycm9yIGlmIHRoZSBlbnRyeSB3YXMgbmVlZGVkCi0gKiBtb3JlIHRoYW4gb25jZSwgYXMgdGhlIHNlY29uZCBhdHRlbXB0ZWQgcmV0cnkgZmFpbGVkLgotICoKLSAqIEluIHRoZSBjdXJyZW50IHZlcnNpb24sIHRoZSBlbnRyeSBpcyBub3QgZGVsZXRlZCwgaW5zdGVhZCB3ZSBzZXQKLSAqIHRoZSBmaWVsZCAnZm91bmQnIHRvIHRydWUuICBJZiBhIHNlY29uZCBsb29rdXAgbWF0Y2hlcyB0aGUgc2FtZQotICogZW50cnksIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBoaTE2cyByZWxvYyBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQKLSAqIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHVwZGF0ZWQgYSBzZWNvbmQgdGltZS4KLSAqCi0gKiBUT0RPIC0gVE9GSVg6IElmIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byByZXN0b3JlIDIgZGlmZmVyZW50Ci0gKiBhZGRyZXNzZXMgZnJvbSB0aGUgc2FtZSB0YWJsZSBlbnRyeSwgd2hlcmUgdGhlIGZpcnN0IGdlbmVyYXRlcyBhbgotICogb3ZlcmZsb3csIHdoaWxzdCB0aGUgc2Vjb25kIGRvIG5vdCwgdGhlbiB0aGlzIGNvZGUgd2lsbCBmYWlsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IGhpMTZzX2xvY2F0aW9uCi17Ci0gIGJmZF92bWEgICAgICAgYWRkZW5kOwotICBiZmRfYnl0ZSAqICAgIGFkZHJlc3M7Ci0gIHVuc2lnbmVkIGxvbmcgY291bnRlcjsKLSAgYm9vbGVhbiAgICAgICBmb3VuZDsKLSAgc3RydWN0IGhpMTZzX2xvY2F0aW9uICogbmV4dDsKLX0KLWhpMTZzX2xvY2F0aW9uOwotCi1zdGF0aWMgaGkxNnNfbG9jYXRpb24gKiAgcHJldmlvdXNfaGkxNnM7Ci1zdGF0aWMgaGkxNnNfbG9jYXRpb24gKiAgZnJlZV9oaTE2czsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICAgICBoaTE2c19jb3VudGVyOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfaGkxNnNfcmVsb2MgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcykKLSAgICAgYmZkICogICAgICBhYmZkOwotICAgICBiZmRfdm1hICAgIGFkZGVuZDsKLSAgICAgYmZkX2J5dGUgKiBhZGRyZXNzOwotewotICBoaTE2c19sb2NhdGlvbiAqIGVudHJ5ID0gTlVMTDsKLSAgCi0gIC8qIEZpbmQgYSBmcmVlIHN0cnVjdHVyZS4gICovCi0gIGlmIChmcmVlX2hpMTZzID09IE5VTEwpCi0gICAgZnJlZV9oaTE2cyA9IChoaTE2c19sb2NhdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKCogZnJlZV9oaTE2cykpOwotCi0gIGVudHJ5ICAgICAgPSBmcmVlX2hpMTZzOwotICBmcmVlX2hpMTZzID0gZnJlZV9oaTE2cy0+bmV4dDsKLSAgCi0gIGVudHJ5LT5hZGRlbmQgID0gYWRkZW5kOwotICBlbnRyeS0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGVudHJ5LT5jb3VudGVyID0gaGkxNnNfY291bnRlciArKzsKLSAgZW50cnktPmZvdW5kICAgPSBmYWxzZTsKLSAgZW50cnktPm5leHQgICAgPSBwcmV2aW91c19oaTE2czsKLSAgcHJldmlvdXNfaGkxNnMgPSBlbnRyeTsKLSAgCi0gIC8qIENvcGUgd2l0aCB3cmFwIGFyb3VuZCBvZiBvdXIgY291bnRlci4gICovCi0gIGlmIChoaTE2c19jb3VudGVyID09IDApCi0gICAgewotICAgICAgLyogWFhYIC0gQXNzdW1lIHRoYXQgYWxsIGNvdW50ZXIgZW50cmllcyBkaWZmZXIgb25seSBpbiB0aGVpciBsb3cgMTYgYml0cy4gICovCi0gICAgICBmb3IgKGVudHJ5ID0gcHJldmlvdXNfaGkxNnM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JZW50cnktPmNvdW50ZXIgJj0gMHhmZmZmOwotCi0gICAgICBoaTE2c19jb3VudGVyID0gMHgxMDAwMDsKLSAgICB9Ci0gIAotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1maW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MgKGFkZGVuZCwgYWxyZWFkeV9mb3VuZCkKLSAgICAgYmZkX3ZtYSAgIGFkZGVuZDsKLSAgICAgYm9vbGVhbiAqIGFscmVhZHlfZm91bmQ7Ci17Ci0gIGhpMTZzX2xvY2F0aW9uICogbWF0Y2ggPSBOVUxMOwotICBoaTE2c19sb2NhdGlvbiAqIGVudHJ5OwotICBoaTE2c19sb2NhdGlvbiAqIHByZXZpb3VzID0gTlVMTDsKLSAgaGkxNnNfbG9jYXRpb24gKiBwcmV2OwotICBpbnQgICAgICAgICAgICAgIGk7Ci0gIGJmZF9ieXRlICogICAgICAgYWRkcjsKLSAgCi0gIC8qIFNlYXJjaCB0aGUgdGFibGUuICBSZWNvcmQgdGhlIG1vc3QgcmVjZW50IGVudHJ5IHRoYXQgbWF0Y2hlcy4gICovCi0gIGZvciAoZW50cnkgPSBwcmV2aW91c19oaTE2czsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgewotICAgICAgaWYgKGVudHJ5LT5hZGRlbmQgPT0gYWRkZW5kCi0JICAmJiAobWF0Y2ggPT0gTlVMTCB8fCBtYXRjaC0+Y291bnRlciA8IGVudHJ5LT5jb3VudGVyKSkKLQl7Ci0JICBwcmV2aW91cyA9IHByZXY7Ci0JICBtYXRjaCAgICA9IGVudHJ5OwotCX0KLSAgICAgIAotICAgICAgcHJldiA9IGVudHJ5OwotICAgIH0KLQotICBpZiAobWF0Y2ggPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBFeHRyYWN0IHRoZSBhZGRyZXNzLiAgKi8KLSAgYWRkciA9IG1hdGNoLT5hZGRyZXNzOwotCi0gIC8qIFJlbWViZXIgaWYgdGhpcyBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYmVmb3JlLiAgKi8KLSAgaWYgKGFscmVhZHlfZm91bmQpCi0gICAgKiBhbHJlYWR5X2ZvdW5kID0gbWF0Y2gtPmZvdW5kOwotCi0gIC8qIE5vdGUgdGhhdCB0aGlzIGVudHJ5IGhhcyBub3cgYmVlbiB1c2VkLiAgKi8KLSAgbWF0Y2gtPmZvdW5kID0gdHJ1ZTsKLSAgCi0gIHJldHVybiBhZGRyOwotfSAgICAgCi0KLS8qIEZJWE1FOiAgVGhlIGNvZGUgaGVyZSBwcm9iYWJseSBvdWdodCB0byBiZSByZW1vdmVkIGFuZCB0aGUgY29kZSBpbiByZWxvYy5jCi0gICBhbGxvd2VkIHRvIGRvIGl0cyAgc3R1ZmYgaW5zdGVhZC4gIEF0IGxlYXN0IGZvciBtb3N0IG9mIHRoZSByZWxvY3MsIGFud3lheS4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsIHJfdHlwZSwgYWRkZW5kLCBhZGRyZXNzKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGludCAgICAgICAgcl90eXBlOwotICAgICBiZmRfdm1hICAgIGFkZGVuZDsKLSAgICAgYmZkX2J5dGUgKiBhZGRyZXNzOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF9zaWduZWRfdm1hIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgLyogZnByaW50ZiAoc3RkZXJyLCAicmVsb2MgdHlwZSAlZCBub3QgU1VQUE9SVEVEXG4iLCByX3R5cGUgKTsgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfMzI6Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzIyX1BDUkVMOgotICAgICAgaWYgKHNhZGRlbmQgPiAweDFmZmZmZiB8fCBzYWRkZW5kIDwgLTB4MjAwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmICgoYWRkZW5kICUgMikgIT0gMCkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAgPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGluc24gJj0gfjB4ZmZmZTAwM2Y7Ci0gICAgICBpbnNuIHw9ICgoKGFkZGVuZCAmIDB4ZmZmZSkgPDwgMTYpIHwgKChhZGRlbmQgJiAweDNmMDAwMCkgPj4gMTYpKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzlfUENSRUw6Ci0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmYgfHwgc2FkZGVuZCA8IC0weDEwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoKGFkZGVuZCAlIDIpICE9IDApCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBpbnNuICY9IH4gMHhmODcwOwotICAgICAgaW5zbiB8PSAoKGFkZGVuZCAmIDB4MWYwKSA8PCA3KSB8ICgoYWRkZW5kICYgMHgwZSkgPDwgMyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0hJMTY6Ci0gICAgICBhZGRlbmQgKz0gKGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpIDw8IDE2KTsKLSAgICAgIGFkZGVuZCA9IChhZGRlbmQgPj4gMTYpOwotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfSEkxNl9TOgotICAgICAgLyogUmVtZW1iZXIgd2hlcmUgdGhpcyByZWxvY2F0aW9uIHRvb2sgcGxhY2UuICAqLwotICAgICAgcmVtZW1iZXJfaGkxNnNfcmVsb2MgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcyk7Ci0KLSAgICAgIGFkZGVuZCArPSAoYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcykgPDwgMTYpOwotICAgICAgYWRkZW5kID0gKGFkZGVuZCA+PiAxNikgKyAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCk7Ci0gICAgICAKLSAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBjYW5ub3Qgb3ZlcmZsb3cuICovCi0gICAgICBpZiAoYWRkZW5kID4gMHg3ZmZmKQotCWFkZGVuZCA9IDA7Ci0gICAgICAKLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0xPMTY6Ci0gICAgICAvKiBDYWxjdWxhdGUgdGhlIHN1bSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbiBhbmQgdGhlCi0JIGFkZGVuZCBhbmQgY2hlY2sgZm9yIG92ZXJmbG93IGZyb20gdGhlIGxvdyAxNiBiaXRzIGludG8gdGhlIGhpZ2gKLQkgMTYgYml0cy4gIFRoZSBhc3NlbWJsZXIgaGFzIGFscmVhZHkgZG9uZSBzb21lIG9mIHRoaXM6ICBJZiB0aGUKLQkgdmFsdWUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbiBoYXMgaXRzIDE1dGggYml0IHNldCwgKGNvdW50aW5nCi0JIGZyb20gemVybykgdGhlbiB0aGUgYXNzZW1ibGVyIHdpbGwgaGF2ZSBhZGRlZCAxIHRvIHRoZSB2YWx1ZQotCSBzdG9yZWQgaW4gdGhlIGFzc29jaWF0ZWQgSEkxNlMgcmVsb2MuICBTbyBmb3IgZXhhbXBsZSwgdGhlc2UKLQkgcmVsb2NhdGlvbnM6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkICksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKSwgcjEsIHIxCi0KLQkgd2lsbCBzdG9yZSAwIGluIHRoZSB2YWx1ZSBmaWVsZHMgZm9yIHRoZSBNT1ZISSBhbmQgTU9WRUEgaW5zdHJ1Y3Rpb25zCi0JIGFuZCBhZGRlbmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBvZiBmcmVkLCBidXQgZm9yIHRoZXNlIGluc3RydWN0aW9uczoKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgKyAweDEyMzQ1NiksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEyMzQ1NiksIHIxLCByMQotCi0JIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1PVkhJIGluc3RydWN0aW9uIHdpbGwgYmUgMHgxMiBhbmQgdGhlIHZhbHVlCi0JIHN0b3JlZCBpbiB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24gd2lsbCBiZSAweDM0NTYuICBJZiBob3dldmVyIHRoZQotCSBpbnN0cnVjdGlvbnMgd2VyZToKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgKyAweDEwZmZmZiksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEwZmZmZiksIHIxLCByMQotCi0JIHRoZW4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gd291bGQgYmUgMHgxMSAobm90Ci0JIDB4MTApIGFuZCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbiB3b3VsZCBiZSAweGZmZmYuCi0JIFRodXMgKGFzc3VtaW5nIGZvciB0aGUgbW9tZW50IHRoYXQgdGhlIGFkZGVuZCBpcyAwKSwgYXQgcnVuIHRpbWUgdGhlCi0JIE1PVkhJIGluc3RydWN0aW9uIGxvYWRzIDB4MTEwMDAwIGludG8gcjEsIHRoZW4gdGhlIE1PVkVBIGluc3RydWN0aW9uCi0JIGFkZHMgMHhmZmZmZmZmZiAoc2lnbiBleHRlbnNpb24hKSBwcm9kdWNpbmcgMHgxMGZmZmYuICBTaW1pbGFybHkgaWYKLQkgdGhlIGluc3RydWN0aW9ucyB3ZXJlOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCAtIDEpLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkIC0gMSksIHIxLCByMQotCi0JIHRoZW4gMCBpcyBzdG9yZWQgaW4gdGhlIE1PVkhJIGluc3RydWN0aW9uIGFuZCAtMSBpcyBzdG9yZWQgaW4gdGhlCi0JIE1PVkVBIGluc3RydWN0aW9uLgotCi0JIE92ZXJmbG93IGNhbiBvY2N1ciBpZiB0aGUgYWRkaXRpb24gb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUKLQkgaW5zdHJ1Y3Rpb24gcGx1cyB0aGUgYWRkZW5kIHNldHMgdGhlIDE1dGggYml0IHdoZW4gYmVmb3JlIGl0IHdhcyBjbGVhci4KLQkgVGhpcyBpcyBiZWNhdXNlIHRoZSAxNXRoIGJpdCB3aWxsIGJlIHNpZ24gZXh0ZW5kZWQgaW50byB0aGUgaGlnaCBwYXJ0LAotCSB0aHVzIHJlZHVjaW5nIGl0cyB2YWx1ZSBieSBvbmUsIGJ1dCBzaW5jZSB0aGUgMTV0aCBiaXQgd2FzIG9yaWdpbmFsbHkKLQkgY2xlYXIsIHRoZSBhc3NlbWJsZXIgd2lsbCBub3QgaGF2ZSBhZGRlZCAxIHRvIHRoZSBwcmV2aW91cyBISTE2UyByZWxvYwotCSB0byBjb21wZW5zYXRlIGZvciB0aGlzIGVmZmVjdC4gIEZvciBleGFtcGxlOgotCi0JICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMjM0NTYpLCByMCwgcjEKLQkgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEyMzQ1NiksIHIxLCByMQotCi0JIFRoZSB2YWx1ZSBzdG9yZWQgaW4gSEkxNlMgcmVsb2MgaXMgMHgxMiwgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTE8xNgotCSByZWxvYyBpcyAweDM0NTYuICBJZiB3ZSBhc3N1bWUgdGhhdCB0aGUgYWRkcmVzcyBvZiBmcmVkIGlzIDB4MDAwMDcwMDAKLQkgdGhlbiB0aGUgcmVsb2NhdGlvbnMgYmVjb21lOgotCi0JICAgSEkxNlM6IDB4MDAxMiArICgweDAwMDA3MDAwID4+IDE2KSAgICA9IDB4MTIKLQkgICBMTzE2OiAgMHgzNDU2ICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHhhNDU2Ci0KLQkgYnV0IHdoZW4gdGhlIGluc3RydWN0aW9ucyBhcmUgZXhlY3V0ZWQsIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbidzIHZhbHVlCi0JIGlzIHNpZ25lZCBleHRlbmRlZCwgc28gdGhlIHN1bSBiZWNvbWVzOgotCi0JICAgICAgMHgwMDEyMDAwMAotCSAgICArIDB4ZmZmZmE0NTYKLQkgICAgLS0tLS0tLS0tLS0tCi0JICAgICAgMHgwMDExYTQ1NiAgICBidXQgJ2ZyZWQgKyAweDEyMzQ1NicgPSAweDAwMTJhNDU2Ci0KLQkgTm90ZSB0aGF0IGlmIHRoZSAxNXRoIGJpdCB3YXMgc2V0IGluIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIExPMTYKLQkgcmVsb2MsIHRoZW4gd2UgZG8gbm90IGhhdmUgdG8gZG8gYW55dGhpbmc6Ci0KLQkgICAgbW92aGkgaGkoIGZyZWQgKyAweDEwZmZmZiksIHIwLCByMQotCSAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTBmZmZmKSwgcjEsIHIxCi0KLQkgICAgSEkxNlM6ICAweDAwMTEgKyAoMHgwMDAwNzAwMCA+PiAxNikgICAgPSAweDExCi0JICAgIExPMTY6ICAgMHhmZmZmICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHg2ZmZmCi0KLQkgICAgICAweDAwMTEwMDAwCi0JICAgICsgMHgwMDAwNmZmZgotCSAgICAtLS0tLS0tLS0tLS0KLQkgICAgICAweDAwMTE2ZmZmICA9IGZyZWQgKyAweDEwZmZmZiA9IDB4NzAwMCArIDB4MTBmZmZmCi0KLQkgCi0JIE92ZXJmbG93IGNhbiBhbHNvIG9jY3VyIGlmIHRoZSBjb21wdXRhdGlvbiBjYXJyaWVzIGludG8gdGhlIDE2dGggYml0Ci0JIGFuZCBpdCBhbHNvIHJlc3VsdHMgaW4gdGhlIDE1dGggYml0IGhhdmluZyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgMTV0aAotCSBiaXQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlLiAgIFdoYXQgaGFwcGVucyBpcyB0aGF0IHRoZSBISTE2UyByZWxvYwotCSB3aWxsIGhhdmUgYWxyZWFkeSBleGFtaW5lZCB0aGUgMTV0aCBiaXQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlIGFuZAotCSBhZGRlZCAxIHRvIHRoZSBoaWdoIHBhcnQgaWYgdGhlIGJpdCBpcyBzZXQuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUKLQkgc2lnbiBleHRlbnNpb24gb2YgMTV0aCBiaXQgb2YgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uICBCdXQgbm93Ci0JIHRoZXJlIGlzIGEgY2FycnkgaW50byB0aGUgMTZ0aCBiaXQsIGFuZCB0aGlzIGhhcyBub3QgYmVlbiBhbGxvd2VkIGZvci4KLQotCSBTbywgZm9yIGV4YW1wbGUgaWYgZnJlZCBpcyBhdCBhZGRyZXNzIDB4ZjAwMDoKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHhmZmZmKSwgcjAsIHIxICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBzZXRdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweGZmZmYpLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDEgKyAoMHgwMDAwZjAwMCA+PiAxNikgICAgPSAweDAwMDEKLQkgICBMTzE2OiAgMHhmZmZmICsgKDB4MDAwMGYwMDAgJiAweGZmZmYpID0gMHhlZmZmICAgKGNhcnJ5IGludG8gYml0IDE2IGlzIGxvc3QpCi0KLQkgICAgIDB4MDAwMTAwMDAKLQkgICArIDB4ZmZmZmVmZmYKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMGVmZmYgICBidXQgJ2ZyZWQgKyAweGZmZmYnID0gMHgwMDAxZWZmZgotCi0JIFNpbWlsYXJseSwgaWYgdGhlIDE1dGggYml0IHJlbWFpbnMgY2xlYXIsIGJ1dCBvdmVyZmxvdyBvY2N1cnMgaW50bwotCSB0aGUgMTZ0aCBiaXQgdGhlbiAoYXNzdW1pbmcgdGhlIGFkZHJlc3Mgb2YgZnJlZCBpcyAweGYwMDApOgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweDcwMDApLCByMCwgcjEgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIGNsZWFyXQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHg3MDAwKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAwICsgKDB4MDAwMGYwMDAgPj4gMTYpICAgID0gMHgwMDAwCi0JICAgTE8xNjogIDB4NzAwMCArICgweDAwMDBmMDAwICYgMHhmZmZmKSA9IDB4NmZmZiAgKGNhcnJ5IGludG8gYml0IDE2IGlzIGxvc3QpCi0KLQkgICAgIDB4MDAwMDAwMDAKLQkgICArIDB4MDAwMDZmZmYKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMDZmZmYgICBidXQgJ2ZyZWQgKyAweDcwMDAnID0gMHgwMDAxNmZmZgotCSAgIAotCSBOb3RlIC0gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaWYgYSBjYXJyeSBvY2N1cnMsIGFuZCB0aGUKLQkgMTV0aCBiaXQgY2hhbmdlcyBpdHMgdmFsdWUgZnJvbSBiZWluZyBzZXQgdG8gYmVpbmcgY2xlYXIsIGFzIHRoZSBISTE2UwotCSByZWxvYyB3aWxsIGhhdmUgYWxyZWFkeSBhZGRlZCBpbiAxIHRvIHRoZSBoaWdoIHBhcnQgZm9yIHVzOgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweGZmZmYpLCByMCwgcjEgICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBzZXRdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweGZmZmYpLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDEgKyAoMHgwMDAwNzAwMCA+PiAxNikKLQkgICBMTzE2OiAgMHhmZmZmICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKLQotCSAgICAgMHgwMDAxMDAwMAotCSAgICsgMHgwMDAwNmZmZiAgIChiaXQgMTUgbm90IHNldCwgc28gdGhlIHRvcCBoYWxmIGlzIHplcm8pCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDE2ZmZmICAgd2hpY2ggaXMgcmlnaHQgKGFzc3VtaW5nIHRoYXQgZnJlZCBpcyBhdCAweDcwMDApCi0KLQkgYnV0IGlmIHRoZSAxNXRoIGJpdCBnb2VzIGZyb20gYmVpbmcgY2xlYXIgdG8gYmVpbmcgc2V0LCB0aGVuIHdlIG11c3QKLQkgb25jZSBhZ2FpbiBoYW5kbGUgb3ZlcmZsb3c6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4NzAwMCksIHIwLCByMSAgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIGNsZWFyXQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHg3MDAwKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAwICsgKDB4MDAwMGZmZmYgPj4gMTYpCi0JICAgTE8xNjogIDB4NzAwMCArICgweDAwMDBmZmZmICYgMHhmZmZmKSA9IDB4NmZmZiAgKGNhcnJ5IGludG8gYml0IDE2KQotCi0JICAgICAweDAwMDAwMDAwCi0JICAgKyAweDAwMDA2ZmZmICAgKGJpdCAxNSBub3Qgc2V0LCBzbyB0aGUgdG9wIGhhbGYgaXMgemVybykKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMDZmZmYgICB3aGljaCBpcyB3cm9uZyAoYXNzdW1pbmcgdGhhdCBmcmVkIGlzIGF0IDB4ZmZmZikKLQkgKi8KLQotICAgICAgewotCWxvbmcgcmVzdWx0OwotCi0JaW5zbiAgID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0JcmVzdWx0ID0gaW5zbiArIGFkZGVuZDsKLQotI2RlZmluZSBCSVQxNV9TRVQoeCkgKCh4KSAmIDB4ODAwMCkKLSNkZWZpbmUgT1ZFUkZMT1dTKGEsaSkgKCgoKGEpICYgMHhmZmZmKSArIChpKSkgPiAweGZmZmYpCi0JCi0JaWYgKChCSVQxNV9TRVQgKHJlc3VsdCkgJiYgISBCSVQxNV9TRVQgKGFkZGVuZCkpCi0JICAgIHx8IChPVkVSRkxPV1MgKGFkZGVuZCwgaW5zbikKLQkJJiYgKCghIEJJVDE1X1NFVCAoaW5zbikpIHx8IChCSVQxNV9TRVQgKGFkZGVuZCkpKSkpCi0JICB7Ci0JICAgIGJvb2xlYW4gYWxyZWFkeV91cGRhdGVkOwotCSAgICBiZmRfYnl0ZSAqIGhpMTZzX2FkZHJlc3MgPSBmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MKLQkgICAgICAoYWRkZW5kLCAmIGFscmVhZHlfdXBkYXRlZCk7Ci0JICAgIAotCSAgICAvKiBBbWVuZCB0aGUgbWF0Y2hpbmcgSEkxNl9TIHJlbG9jYXRpb24uICAqLwotCSAgICBpZiAoaGkxNnNfYWRkcmVzcyAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKCEgYWxyZWFkeV91cGRhdGVkKQotCQkgIHsKLQkJICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBoaTE2c19hZGRyZXNzKTsKLQkJICAgIGluc24gKz0gMTsKLQkJICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGhpMTZzX2FkZHJlc3MpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0ZGVyciwgXygiRkFJTEVEIHRvIGZpbmQgcHJldmlvdXMgSEkxNiByZWxvY1xuIikpOwotCQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgICAgIH0KLQkgIH0KLQkKLQkvKiBEbyBub3QgY29tcGxhaW4gaWYgdmFsdWUgaGFzIHRvcCBiaXQgc2V0LCBhcyB0aGlzIGhhcyBiZWVuIGFudGljaXBhdGVkLiAgKi8KLQlpbnNuID0gcmVzdWx0ICYgMHhmZmZmOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1Y4NTBfODoKLSAgICAgIGFkZGVuZCArPSAoY2hhcikgYmZkX2dldF84IChhYmZkLCBhZGRyZXNzKTsKLQotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2YgfHwgc2FkZGVuZCA8IC0weDgwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ6Ci0gICAgICBhZGRlbmQgKz0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGZmZmYgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfMTY6Ci0KLSAgICAgIC8qIGRyb3AgdGhyb3VnaCAqLyAgICAgICAgICAgIAotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOgotICAgICAgYWRkZW5kICs9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZmZmIHx8IHNhZGRlbmQgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoaW5zbiAmIDB4ZmZmZSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmZmUgfHwgc2FkZGVuZCA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuID0gKGFkZGVuZCAmIH4xKSB8IChpbnNuICYgMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV82XzhfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4N2UpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmYyB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMykKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODE7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV83XzhfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4N2YpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmZSB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV83XzdfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9IGluc24gJiAweDdmOwotCQotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2YgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNV9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHhmKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4MWUgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZmYwOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfNF80X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSBpbnNuICYgMHhmOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZmYwOwotICAgICAgaW5zbiB8PSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmUwMDAwKSA+PiAxNikgKyAoKGluc24gJiAweDIwKSA+PiA1KTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2ZmZiB8fCBzYWRkZW5kIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpbnNuICY9IDB4MDAwMWZmZGY7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgJiAxKSA8PCA1OwotICAgICAgaW5zbiB8PSAoYWRkZW5kICYgfjEpIDw8IDE2OwotICAgICAgCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4M2YpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZSB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgfQotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBJbnNlcnQgdGhlIGFkZGVuZCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9yZWxvYyAoYWJmZCwgcmVsb2MsIHN5bWJvbCwgZGF0YSwgaXNlY3Rpb24sIG9iZmQsIGVycikKLSAgICAgYmZkICogICAgICAgYWJmZDsKLSAgICAgYXJlbGVudCAqICAgcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiAgIHN5bWJvbDsKLSAgICAgUFRSICAgICAgICAgZGF0YTsKLSAgICAgYXNlY3Rpb24gKiAgaXNlY3Rpb247Ci0gICAgIGJmZCAqICAgICAgIG9iZmQ7Ci0gICAgIGNoYXIgKiogICAgIGVycjsKLXsKLSAgbG9uZyByZWxvY2F0aW9uOwotICAKLSAgLyogSWYgdGhlcmUgaXMgYW4gb3V0cHV0IEJGRCwKLSAgICAgYW5kIHRoZSBzeW1ib2wgaXMgbm90IGEgc2VjdGlvbiBuYW1lICh3aGljaCBpcyBvbmx5IGRlZmluZWQgYXQgZmluYWwgbGluayB0aW1lKSwKLSAgICAgYW5kIGVpdGhlciB3ZSBhcmUgbm90IHB1dHRpbmcgdGhlIGFkZGVuZCBpbnRvIHRoZSBpbnN0cnVjdGlvbgotICAgICAgICAgb3IgdGhlIGFkZGVuZCBpcyB6ZXJvLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGFkZCBpbnRvIHRoZSBpbnN0cnVjdGlvbgotICAgICB0aGVuIGp1c3QgZml4dXAgdGhlIGFkZHJlc3MgYW5kIHJldHVybi4gICovCi0gIGlmIChvYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvYy0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRyZXNzICs9IGlzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0jaWYgMCAgCi0gIGVsc2UgaWYgKG9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAKLSAgLyogQ2F0Y2ggcmVsb2NzIGludm9sdmluZyB1bmRlZmluZWQgc3ltYm9scy4gICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBXZSBoYW5kbGUgZmluYWwgbGlua2luZyBvZiBzb21lIHJlbG9jcyBvdXJzZWx2ZXMuICAqLwotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2MtPmFkZHJlc3MgPiBpc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotICAKLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0gIAotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlICsgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jLT5hZGRlbmQ7Ci0gIAotICBpZiAocmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0JIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotICAgICAgcmVsb2NhdGlvbiAtPSBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgCi0gICAgICAvKiBEZWFsIHdpdGggcGNyZWxfb2Zmc2V0ICovCi0gICAgICByZWxvY2F0aW9uIC09IHJlbG9jLT5hZGRyZXNzOwotICAgIH0KLQotICByZWxvYy0+YWRkZW5kID0gcmVsb2NhdGlvbjsJCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqICAgICAgICAgYWJmZDsKLSAgICAgY29uc3QgY2hhciAqICBuYW1lOwotewotICByZXR1cm4gKCAgIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAnTCcgfHwgbmFtZVsxXSA9PSAnLicpKQotCSAgfHwgKG5hbWVbMF0gPT0gJ18nICYmICBuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09ICdMJyAmJiBuYW1lWzNdID09ICdfJykpOwotfQotCi0MCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgICAgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgaG93dG87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgc3ltX3NlYzsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaXNfbG9jYWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIHJfdHlwZSAgID0gaG93dG8tPnR5cGU7Ci0gIGJmZF9ieXRlICogICAgIGhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0KLSAgLyogQWRqdXN0IHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHJlbG9jYXRpb24uICAqLwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIFJfVjg1MF8yMl9QQ1JFTDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkrIG9mZnNldCk7Ci0KLSAgICAgIC8qIElmIHRoZSBzaWduIGV4dGVuc2lvbiB3aWxsIGNvcnJ1cHQgdGhlIHZhbHVlIHRoZW4gd2UgaGF2ZSBvdmVyZmxvd2VkLiAgKi8KLSAgICAgIGlmICgoKHZhbHVlICYgMHhmZjAwMDAwMCkgIT0gMHgwKSAmJiAoKHZhbHVlICYgMHhmZjAwMDAwMCkgIT0gMHhmZjAwMDAwMCkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgdmFsdWUgPSBTRVhUMjQgKHZhbHVlKTsgIC8qIE9ubHkgdGhlIGJvdHRvbSAyNCBiaXRzIG9mIHRoZSBQQyBhcmUgdmFsaWQgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfSEkxNl9TOgotICAgIGNhc2UgUl9WODUwX0hJMTY6Ci0gICAgY2FzZSBSX1Y4NTBfTE8xNjoKLSAgICBjYXNlIFJfVjg1MF8xNjoKLSAgICBjYXNlIFJfVjg1MF8zMjoKLSAgICBjYXNlIFJfVjg1MF84OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgkKLSAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgICBpZiAoc3ltX3NlYyA9PSBOVUxMKQotCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0gICAgICB2YWx1ZSAtPSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGdwOwotCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQotCWlmIChzeW1fc2VjID09IE5VTEwpCi0JICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQkgIAotCS8qIEdldCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX19ncCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotCi0JZ3AgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl2YWx1ZSAtPSAoZ3AgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBlcDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0JCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2VwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2VwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7ICAvKiBBY3R1YWxseSB0aGlzIGluZGljYXRlcyB0aGF0IF9fZXAgY291bGQgbm90IGJlIGZvdW5kLiAqLwotCi0JZXAgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gZXA7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGN0YnA7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCQotCS8qIEdldCB0aGUgdmFsdWUgb2YgX19jdGJwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2N0YnAiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk7ICAvKiBBY3R1YWxseSB0aGlzIGluZGljYXRlcyB0aGF0IF9fY3RicCBjb3VsZCBub3QgYmUgZm91bmQuICovCi0KLQljdGJwID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl2YWx1ZSAtPSBjdGJwOwotICAgICAgfQotICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGN0YnA7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCkKLQkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2N0YnAuICAqLwotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fY3RicCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKTsKLQotCWN0YnAgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl2YWx1ZSAtPSAoY3RicCAtIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgfQotICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfTk9ORToKLSAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogUGVyZm9ybSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHJldHVybiB2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcl90eXBlLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOyAKLX0KLQotDAotLyogUmVsb2NhdGUgYW4gVjg1MCBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICBpZiAoc3ltX2hhc2hlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluZm8tPmNhbGxiYWNrcy0+d2FybmluZwotCShpbmZvLCAibm8gaGFzaCB0YWJsZSBhdmFpbGFibGUiLCBOVUxMLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIDApOwotCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAKLSAgLyogUmVzZXQgdGhlIGxpc3Qgb2YgcmVtZW1iZXJlZCBISTE2UyByZWxvY3MgdG8gZW1wdHkuICAqLwotICBmcmVlX2hpMTZzICAgICA9IHByZXZpb3VzX2hpMTZzOwotICBwcmV2aW91c19oaTE2cyA9IE5VTEw7Ci0gIGhpMTZzX2NvdW50ZXIgID0gMDsKLSAgCi0gIHJlbCAgICA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgICA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl90eXBlID09IFJfVjg1MF9HTlVfVlRFTlRSWQotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX1Y4NTBfR05VX1ZUSU5IRVJJVCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGhvd3RvID0gdjg1MF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotI2lmIDAKLQkgIHsKLQkgICAgY2hhciAqIG5hbWU7Ci0JICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JICAgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/ICI8bm9uZT4iIDogbmFtZTsKLWZwcmludGYgKHN0ZGVyciwgImxvY2FsOiBzZWM6ICVzLCBzeW06ICVzICglZCksIHZhbHVlOiAleCArICV4ICsgJXggYWRkZW5kICV4XG4iLAotCSBzZWMtPm5hbWUsIG5hbWUsIHN5bS0+c3RfbmFtZSwKLQkgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHN5bS0+c3RfdmFsdWUsIHJlbC0+cl9hZGRlbmQpOwotCSAgfQotI2VuZGlmCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0jaWYgMAotZnByaW50ZiAoc3RkZXJyLCAiZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXMsIHZhbHVlOiAleCArICV4ICsgJXggZ2l2ZXM6ICV4XG4iLAotCSBzZWMtPm5hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS5kZWYudmFsdWUsIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LCByZWxvY2F0aW9uKTsKLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHsKLSNpZiAwCi1mcHJpbnRmIChzdGRlcnIsICJ1bmRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzXG4iLAotCSBzZWMtPm5hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotI2VuZGlmCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLSNpZiAwCi1mcHJpbnRmIChzdGRlcnIsICJ1bmtub3duOiBuYW1lOiAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRklYTUU6IFdlIHNob3VsZCB1c2UgdGhlIGFkZGVuZCwgYnV0IHRoZSBDT0ZGIHJlbG9jYXRpb25zCi0gICAgICAgICBkb24ndC4gICovCi0gICAgICByID0gdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCXJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQsCi0JCQkJCWluZm8sIHNlYywgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBuYW1lOwotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopMDsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyByZWxvY2F0aW9uIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3RoZXI6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19ncCIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2NvbnRpbnVlOgotCSAgICAgIG1zZyA9IF8oImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZXAiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19jdGJwIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qIE5vIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIHY4NTAtZWxmICovCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotdjg1MF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVfVjg1MF9BUkNIOiAgICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCAwKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFX0FSQ0g6ICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfdjg1MCwgYmZkX21hY2hfdjg1MGUpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVBX0FSQ0g6ICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCBiZmRfbWFjaF92ODUwZWEpOyBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6IHZhbCA9IEVfVjg1MF9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgdmFsID0gRV9WODUwRV9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogdmFsID0gRV9WODUwRUFfQVJDSDsgIGJyZWFrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfVjg1MF9BUkNIOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGtlZXAgVjg1MCBzcGVjaWZpYyBmaWxlIGZsYWdzLiAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICogICAgYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKLQkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOwotCi0gIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0JIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLQkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLSAgICAgICYmIChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gRV9WODUwX0FSQ0gpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogQXJjaGl0ZWN0dXJlIG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotICAKLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLSAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oInByaXZhdGUgZmxhZ3MgPSAlbHg6ICIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0gIAotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9WODUwX0FSQ0g6IGZwcmludGYgKGZpbGUsIF8oInY4NTAgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVfQVJDSDogIGZwcmludGYgKGZpbGUsIF8oInY4NTBlIGFyY2hpdGVjdHVyZSIpKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFQV9BUkNIOiBmcHJpbnRmIChmaWxlLCBfKCJ2ODUwZWEgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICB9Ci0gIAotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVjg1MCBFTEYgdXNlcyBmb3VyIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlCi0gICBvdGhlcnMgYXJlIGZvciAoc21hbGwpIG9iamVjdHMgaW4gb25lIG9mIHRoZSBzcGVjaWFsIGRhdGEgYXJlYXM6Ci0gICBzbWFsbCwgdGlueSBhbmQgemVyby4gIEFsbCB0aGUgb2JqZWN0cyBhcmUga2VwdCB0b2dldGhlciwgYW5kIHRoZW4KLSAgIHJlZmVyZW5jZWQgdmlhIHRoZSBncCByZWdpc3RlciwgdGhlIGVwIHJlZ2lzdGVyIG9yIHRoZSByMCByZWdpc3RlcgotICAgcmVzcGVjdGl2ZWx5LCB3aGljaCB5aWVsZHMgc21hbGxlciwgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcwotICAgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWxmMzItbWlwcy5jLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgIHY4NTBfZWxmX3Njb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKiB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci1zdGF0aWMgYXNlY3Rpb24gIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sICAgdjg1MF9lbGZfdGNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0cjsKLXN0YXRpYyBhc2VjdGlvbiAgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgICB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICogdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOwotCi0KLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBoZHI7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICBzZWM7Ci0gICAgIGludCAqICAgICAgICAgICAgICAgICByZXR2YWw7Ci17Ci0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnNjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9TQ09NTU9OOwotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnRjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9UQ09NTU9OOwotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnpjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9aQ09NTU9OOwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgc3BlY2lhbCBWODUwIHNlY3Rpb24gbnVtYmVycyB0aGF0IGEgc3ltYm9sIG1heSB1c2UuICAqLwotCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgKGFiZmQsIGFzeW0pCi0gICAgIGJmZCAqICAgICBhYmZkOwotICAgICBhc3ltYm9sICogYXN5bTsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICogZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOwotICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKLSAgCi0gIGluZGV4ID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotCi0gIC8qIElmIHRoZSBzZWN0aW9uIGluZGV4IGlzIGFuICJvcmRpbmFyeSIgaW5kZXgsIHRoZW4gaXQgbWF5Ci0gICAgIHJlZmVyIHRvIGEgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlci4KLSAgICAgQ2hlY2sgdGhlIHNlY3Rpb24ncyB0eXBlIGFuZCBjaGFuZ2UgdGhlIGluZGV4IGl0IG1hdGNoZXMuCi0gICAgIAotICAgICBGSVhNRTogU2hvdWxkIHdlIGFsdGVyIHRoZSBzdF9zaG5keCBmaWVsZCBhcyB3ZWxsID8gICovCi0gIAotICBpZiAoaW5kZXggPCBlbGZfZWxmaGVhZGVyKGFiZmQpWzBdLmVfc2hudW0pCi0gICAgc3dpdGNoIChlbGZfZWxmc2VjdGlvbnMoYWJmZClbaW5kZXhdLT5zaF90eXBlKQotICAgICAgewotICAgICAgY2FzZSBTSFRfVjg1MF9TQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfVENPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1RDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1pDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9aQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLSAgCi0gIHN3aXRjaCAoaW5kZXgpCi0gICAgewotICAgIGNhc2UgU0hOX1Y4NTBfU0NPTU1PTjoKLSAgICAgIGlmICh2ODUwX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OIHwgU0VDX0FMTE9DIHwgU0VDX0RBVEE7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2w7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0cjsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbC5mbGFncyAgICAgICAgICAgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0ciAgICAgICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICYgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSE5fVjg1MF9UQ09NTU9OOgotICAgICAgaWYgKHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgdGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIudGNvbW1vbiI7Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHI7Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnRjb21tb24iOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wuZmxhZ3MgICAgICAgICAgID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHIgICAgICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX1Y4NTBfWkNPTU1PTjoKLSAgICAgIGlmICh2ODUwX2VsZl96Y29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHpjb21tb24gc2VjdGlvbi4gICovCi0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnpjb21tb24iOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLmZsYWdzICAgICAgICAgID0gU0VDX0lTX0NPTU1PTjsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi56Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLmZsYWdzICAgICAgICAgICA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyICAgICAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJiB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgdjg1MCBzZWN0aW9uIG51bWJlcnMgaGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgIGluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiBzeW07Ci0gICAgIGNvbnN0IGNoYXIgKiogICAgICAgICAgICBuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKiAgICAgICAgICAgICAgIGZsYWdzcDsKLSAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICAgIHNlY3A7Ci0gICAgIGJmZF92bWEgKiAgICAgICAgICAgICAgICB2YWxwOwotewotICBpbnQgaW5kZXggPSBzeW0tPnN0X3NobmR4OwotICAKLSAgLyogSWYgdGhlIHNlY3Rpb24gaW5kZXggaXMgYW4gIm9yZGluYXJ5IiBpbmRleCwgdGhlbiBpdCBtYXkKLSAgICAgcmVmZXIgdG8gYSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gY3JlYXRlZCBieSB0aGUgYXNzZW1ibGVyLgotICAgICBDaGVjayB0aGUgc2VjdGlvbidzIHR5cGUgYW5kIGNoYW5nZSB0aGUgaW5kZXggaXQgbWF0Y2hlcy4KLSAgICAgCi0gICAgIEZJWE1FOiBTaG91bGQgd2UgYWx0ZXIgdGhlIHN0X3NobmR4IGZpZWxkIGFzIHdlbGwgPyAgKi8KLSAgCi0gIGlmIChpbmRleCA8IGVsZl9lbGZoZWFkZXIoYWJmZClbMF0uZV9zaG51bSkKLSAgICBzd2l0Y2ggKGVsZl9lbGZzZWN0aW9ucyhhYmZkKVtpbmRleF0tPnNoX3R5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIFNIVF9WODUwX1NDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9TQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9UQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfVENPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfWkNPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1pDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotICAKLSAgc3dpdGNoIChpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fVjg1MF9TQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNITl9WODUwX1RDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50Y29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0hOX1Y4NTBfWkNPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnpjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTSUdOT1JFRCovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgaW5wdXRfc2VjKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIHN5bTsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWM7Ci17Ci0gIC8qIElmIHdlIHNlZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGltcGxpZXMgYSByZWxvY2F0YWJsZSBsaW5rLCB0aGVuCi0gICAgIGlmIGEgc3ltYm9sIHdhcyBpbiBhIHNwZWNpYWwgY29tbW9uIHNlY3Rpb24gaW4gYW4gaW5wdXQgZmlsZSwgbWFyawotICAgICBpdCBhcyBhIHNwZWNpYWwgY29tbW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIAotICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi5zY29tbW9uIikgPT0gMCkKLQlzeW0tPnN0X3NobmR4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnRjb21tb24iKSA9PSAwKQotCXN5bS0+c3Rfc2huZHggPSBTSE5fVjg1MF9UQ09NTU9OOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuemNvbW1vbiIpID09IDApCi0Jc3ltLT5zdF9zaG5keCA9IFNITl9WODUwX1pDT01NT047Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICogICAgICAgICAgICAgICBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgICAgY2hhciAqICAgICAgICAgICAgICBuYW1lOwotewotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gICovCi0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX1Y4NTBfU0NPTU1PTjoKLSAgICBjYXNlIFNIVF9WODUwX1RDT01NT046Ci0gICAgY2FzZSBTSFRfVjg1MF9aQ09NTU9OOgotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKLQkJCQkgICAgfCBTRUNfSVNfQ09NTU9OKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGEgVjg1MCBFTEYgc2VjdGlvbi4gIFdlIGRvIHRoaXMgYnkgdGhlCi0gICBzZWN0aW9uIG5hbWUsIHdoaWNoIGlzIGEgaGFjaywgYnV0IG91Z2h0IHRvIHdvcmsuICAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgIHNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIG5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX1Y4NTBfU0NPTU1PTjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi50Y29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfVjg1MF9UQ09NTU9OOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnpjb21tb24iKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9WODUwX1pDT01NT047Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQkJYmZkX2VsZjMyX3Y4NTBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJCSJlbGYzMi12ODUwIgotI2RlZmluZSBFTEZfQVJDSAkJCQliZmRfYXJjaF92ODUwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCQlFTV9DWUdOVVNfVjg1MAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkJMHgxMDAwCi0JCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkJdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCQl2ODUwX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAJdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJCXY4NTBfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgCXY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIAl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCXY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIAl2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJdjg1MF9lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgdjg1MF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICB2ODUwX2VsZl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQl2ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQl2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIJCQknXycKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLmMgYi9iZmQvZWxmMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyMjk2OS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIEVMRiAzMi1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRQkJMzIKLQotCi0jaW5jbHVkZSAiZWxmY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LWFscGhhLmMgYi9iZmQvZWxmNjQtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhN2M0MC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NzQgKzAsMCBAQAotLyogQWxwaGEgc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdlIG5lZWQgYSBwdWJsaXNoZWQgQUJJIHNwZWMgZm9yIHRoaXMuICBVbnRpbCBvbmUgY29tZXMgb3V0LCBkb24ndAotICAgYXNzdW1lIHRoaXMnbGwgcmVtYWluIHVuY2hhbmdlZCBmb3JldmVyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2luY2x1ZGUgImVsZi9hbHBoYS5oIgotCi0jZGVmaW5lIEFMUEhBRUNPRkYKLQotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBOZWVkZWQgZm9yIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gKi8KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jZGVmaW5lIEVDT0ZGXzY0Ci0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TKChiZmQgKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX3JlbG9jX25pbAotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9yZWxvY19iYWQKLSAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwCi0gIFBBUkFNUygoYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUygoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfaW5mb190b19ob3d0bwotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIEVsZjY0X0ludGVybmFsX1JlbGEgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9vYmplY3RfcAotICBQQVJBTVMoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMoKGJmZCAqLCBFbGY2NF9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBFbGY2NF9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbwotICBQQVJBTVMoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUygoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cwotICBQQVJBTVMoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfbWVyZ2VfZ290cwotICBQQVJBTVMoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzCi0gIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqc2VjLAotCSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2FkanVzdF9keW5pbmR4Ci0gIFBBUkFNUygoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmFsX2xpbmsKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0MCi1zdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIEV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVYVFIgZXN5bTsKLQotICAvKiBDdW11bGF0aXZlIGZsYWdzIGZvciBhbGwgdGhlIC5nb3QgZW50cmllcy4gICovCi0gIGludCBmbGFnczsKLQotICAvKiBDb250ZXh0cyAoTElUVVNFKSBpbiB3aGljaCBhIGxpdGVyYWwgd2FzIHJlZmVyZW5jZWQuICAqLwotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIgMHgwMQotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX01FTSAgMHgwMgotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0JZVEUgMHgwNAotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMgMHgwOAotCi0gIC8qIFVzZWQgdG8gaW1wbGVtZW50IG11bHRpcGxlIC5nb3Qgc3Vic2VjdGlvbnMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeQotICB7Ci0gICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKm5leHQ7Ci0KLSAgICAvKiB3aGljaCAuZ290IHN1YnNlY3Rpb24/ICAqLwotICAgIGJmZCAqZ290b2JqOwotCi0gICAgLyogdGhlIGFkZGVuZCBpbiBlZmZlY3QgZm9yIHRoaXMgZW50cnkuICAqLwotICAgIGJmZF92bWEgYWRkZW5kOwotCi0gICAgLyogdGhlIC5nb3Qgb2Zmc2V0IGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICBpbnQgZ290X29mZnNldDsKLQotICAgIGludCBmbGFnczsKLQotICAgIC8qIEFuIGFkZGl0aW9uYWwgZmxhZy4gICovCi0jZGVmaW5lIEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkUgMHgxMAotCi0gICAgaW50IHVzZV9jb3VudDsKLSAgfSAqZ290X2VudHJpZXM7Ci0KLSAgLyogdXNlZCB0byBjb3VudCBub24tZ290LCBub24tcGx0IHJlbG9jYXRpb25zIGZvciBkZWxheWVkIHNpemluZwotICAgICBvZiByZWxvY2F0aW9uIHNlY3Rpb25zLiAgKi8KLSAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeQotICB7Ci0gICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqbmV4dDsKLQotICAgIC8qIHdoaWNoIC5yZWxvYyBzZWN0aW9uPyAqLwotICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgLyogd2hhdCBraW5kIG9mIHJlbG9jYXRpb24/ICovCi0gICAgdW5zaWduZWQgbG9uZyBydHlwZTsKLQotICAgIC8qIGhvdyBtYW55IGRpZCB3ZSBmaW5kPyAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotICB9ICpyZWxvY19lbnRyaWVzOwotfTsKLQotLyogQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgaGVhZCBvZiBhIGxpc3Qgb2YgLmdvdCBzdWJzZWN0aW9ucyBsaW5rZWQgdGhyb3VnaAotICAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmdvdF9saW5rX25leHQuICAqLwotICBiZmQgKmdvdF9saXN0OwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCVwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEdldCB0aGUgb2JqZWN0J3Mgc3ltYm9scyBhcyBvdXIgb3duIGVudHJ5IHR5cGUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9zeW1faGFzaGVzKGFiZmQpIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKillbGZfc3ltX2hhc2hlcyhhYmZkKSkKLQotLyogU2hvdWxkIHdlIGRvIGR5bmFtaWMgdGhpbmdzIHRvIHRoaXMgc3ltYm9sPyAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcChoLCBpbmZvKSAJCQkJXAotICAoKCgoaW5mbyktPnNoYXJlZCAmJiAhKGluZm8pLT5zeW1ib2xpYykJCQkJXAotICAgIHx8ICgoKGgpLT5lbGZfbGlua19oYXNoX2ZsYWdzCQkJCQlcCi0JICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkJXAotICAgICAgICA9PSAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKQlcCi0gICAgfHwgKGgpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsJCQlcCi0gICAgfHwgKGgpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQkJCQlcCi0gICAmJiAoaCktPmR5bmluZHggIT0gLTEpCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIG1lbXNldCAoJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIChFWFRSKSk7Ci0gICAgICAvKiBXZSB1c2UgLTIgYXMgYSBtYXJrZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5mb3JtYXRpb24gaGFzCi0JIG5vdCBiZWVuIHNldC4gIC0xIG1lYW5zIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgaWZkLiAgKi8KLSAgICAgIHJldC0+ZXN5bS5pZmQgPSAtMjsKLSAgICAgIHJldC0+ZmxhZ3MgPSAwOwotICAgICAgcmV0LT5nb3RfZW50cmllcyA9IE5VTEw7Ci0gICAgICByZXQtPnJlbG9jX2VudHJpZXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGY2NF9hbHBoYV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0MCi0vKiBXZSBoYXZlIHNvbWUgcHJpdmF0ZSBmaWVsZHMgaGFuZ2luZyBvZmYgb2YgdGhlIGVsZl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YQotewotICBzdHJ1Y3QgZWxmX29ial90ZGF0YSByb290OwotCi0gIC8qIEZvciBldmVyeSBpbnB1dCBmaWxlLCB0aGVzZSBhcmUgdGhlIGdvdCBlbnRyaWVzIGZvciB0aGF0IG9iamVjdCdzCi0gICAgIGxvY2FsIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKiBsb2NhbF9nb3RfZW50cmllczsKLQotICAvKiBGb3IgZXZlcnkgaW5wdXQgZmlsZSwgdGhpcyBpcyB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgZ290IHRoYXQKLSAgICAgdGhpcyBpbnB1dCBmaWxlIHVzZXMuICAqLwotICBiZmQgKmdvdG9iajsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGEgbGlua2VkIGxpc3QgdGhyb3VnaCB0aGUgb2JqZWN0cyB1c2luZyB0aGlzIGdvdCAqLwotICBiZmQgKmluX2dvdF9saW5rX25leHQ7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyBhIGxpbmsgdG8gdGhlIG5leHQgZ290IHN1YnNlZ21lbnQuICAqLwotICBiZmQgKmdvdF9saW5rX25leHQ7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyB0aGUgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpnb3Q7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyBpdCdzIHRvdGFsIG51bWJlciBvZiAqZW50cmllcyouICAqLwotICBpbnQgdG90YWxfZ290X2VudHJpZXM7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXIgb2YgKmVudHJpZXMqIHJlcXVpcmVkCi0gICAgIHRvIGhvbGQgYWxsIG9mIHRoZSBtZW1iZXIgb2JqZWN0J3MgbG9jYWwgZ290LiAgKi8KLSAgaW50IG5fbG9jYWxfZ290X2VudHJpZXM7Ci19OwotCi0jZGVmaW5lIGFscGhhX2VsZl90ZGF0YShhYmZkKSBcCi0gICgoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEgKikgKGFiZmQpLT50ZGF0YS5hbnkpCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5hbnkgPSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5hbnkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQWxsb2NhdGUgb3VyIHNwZWNpYWwgdGFyZ2V0IGRhdGEuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSAqbmV3X3RkYXRhOwotICBuZXdfdGRhdGEgPSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld190ZGF0YS0+cm9vdCA9ICphYmZkLT50ZGF0YS5lbGZfb2JqX2RhdGE7Ci0gIGFiZmQtPnRkYXRhLmFueSA9IG5ld190ZGF0YTsKLQotICAvKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhbiBBbHBoYSBFTEYgZmlsZS4gICovCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9hbHBoYSwgMCk7Ci19Ci0MCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmNjRfYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX0FMUEhBX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19uaWwsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1JFRkxPTkcsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBHUCByZWxhdGl2ZSBvZmZzZXQuICBUaGlzIGlzIGp1c3QgbGlrZSBSRUZMT05HIGV4Y2VwdAotICAgICB0aGF0IHdoZW4gdGhlIHZhbHVlIGlzIHVzZWQgdGhlIHZhbHVlIG9mIHRoZSBncCByZWdpc3RlciB3aWxsIGJlCi0gICAgIGFkZGVkIGluLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVXNlZCBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWZlcnMgdG8gbWVtb3J5IG9mZiB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJFTEZfTElURVJBTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIG9ubHkgYXBwZWFycyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gRUxGX0xJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBUaGUgc3ltYm9sIGluZGV4IGlzIHNwZWNpYWw6Ci0gICAgIDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZSByZWdpc3RlciBvZiBhIG1lbW9yeQotICAgICBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZQotICAgICBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbiBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUKLSAgICAgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uCi0gICAgIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9BTFBIQV9MSVRVU0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfbmlsLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRVU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvYWQgdGhlIGdwIHJlZ2lzdGVyLiAgVGhpcyBpcyBhbHdheXMgdXNlZCBmb3IgYSBsZGFoIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIGxvYWRzIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSBncCByZWdpc3Rlci4gIFRoZSBzeW1ib2wKLSAgICAgaW5kZXggb2YgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBpcyBhbiBvZmZzZXQgaW4gYnl0ZXMgdG8gdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB0aGF0IGxvYWRzIHRoZSBsb3dlciAxNiBiaXRzLiAgVGhlIHZhbHVlIHRvIHVzZSBmb3IKLSAgICAgdGhlIHJlbG9jYXRpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgR1AgdmFsdWUgYW5kIHRoZQotICAgICBjdXJyZW50IGxvY2F0aW9uOyB0aGUgbG9hZCB3aWxsIGFsd2F5cyBiZSBkb25lIGFnYWluc3QgYSByZWdpc3RlcgotICAgICBob2xkaW5nIHRoZSBjdXJyZW50IGFkZHJlc3MuCi0KLSAgICAgTk9URTogVW5saWtlIEVDT0ZGLCBwYXJ0aWFsIGluLXBsYWNlIHJlbG9jYXRpb24gaXMgbm90IGRvbmUuICBJZgotICAgICBhbnkgb2Zmc2V0IGlzIHByZXNlbnQgaW4gdGhlIGluc3RydWN0aW9ucywgaXQgaXMgYW4gb2Zmc2V0IGZyb20KLSAgICAgdGhlIHJlZ2lzdGVyIHRvIHRoZSBsZGFoIGluc3RydWN0aW9uLiAgVGhpcyBsZXRzIHVzIGF2b2lkIGFueQotICAgICBzdHVwaWQgaGFja2VyeSBsaWtlIGludmVudGluZyBhIGdwIHZhbHVlIHRvIGRvIHBhcnRpYWwgcmVsb2NhdGlvbgotICAgICBhZ2FpbnN0LiAgQWxzbyB1bmxpa2UgRUNPRkYsIHdlIGRvIHRoZSB3aG9sZSByZWxvY2F0aW9uIG9mZiBvZgotICAgICB0aGUgR1BESVNQIHJhdGhlciB0aGFuIGEgR1BESVNQX0hJMTYvR1BESVNQX0xPMTYgcGFpci4gIEFuIG9kZCwKLSAgICAgc3BhY2UgY29uc3VtaW5nIGJpdCwgdGhhdCwgc2luY2UgYWxsIHRoZSBpbmZvcm1hdGlvbiB3YXMgcHJlc2VudAotICAgICBpbiB0aGUgR1BESVNQX0hJMTYgcmVsb2MuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUERJU1AsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2dwZGlzcCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BESVNQIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjEgYml0IGJyYW5jaC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSElOVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMNjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1NUT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BTVUIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIEdQIHVzZWQgYnkgK3JfYWRkZW5kIHVudGlsIHRoZSBuZXh0IEdQVkFMVUUgb3IgdGhlCi0gICAgIGVuZCBvZiB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQVkFMVUUsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCAxNiBiaXRzIG9mIHRoZSBkaXNwbGFjZW1lbnQgZnJvbSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUxISUdILAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUxISUdIIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBsb3cgMTYgYml0cyBvZiB0aGUgZGlzcGxhY2VtZW50IGZyb20gR1AgdG8gdGhlIHRhcmdldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQUkVMTE9XLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMTE9XIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYtYml0IGRpc3BsYWNlbWVudCBmcm9tIHRoZSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9HUF8xNiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0dQXzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIGJpdHMgb2YgYSAzMi1iaXQgZGlzcGxhY2VtZW50IGZyb20gdGhlIEdQIHRvIHRoZSB0YXJnZXQ7IHRoZQotICAgICBsb3cgYml0cyBhcmUgc3VwcGxpZWQgaW4gdGhlIHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfR1BfSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0dQX0hJMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIGJpdHMgb2YgYSAzMi1iaXQgZGlzcGxhY2VtZW50IHRvIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZQotICAgICBjdXJyZW50IHNlY3Rpb24gKHRoZSByZWxvY2F0aW9uIHRhcmdldCBpcyBpZ25vcmVkKTsgdGhlIGxvdyBiaXRzIGFyZSAKLSAgICAgc3VwcGxpZWQgaW4gdGhlIHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfU0NOX0hJMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9TQ05fSEkzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgcHJldmlvdXMgYnIsIGJzciwganNyCi0gICAgIG9yIGptcCBpbnNuIChhcyB0YWdnZWQgYnkgYSBCUkFERFIgb3IgSElOVCByZWxvYykgdG8gdGhlIHRhcmdldDsgdGhlCi0gICAgIGxvdyBiaXRzIGFyZSBzdXBwbGllZCBieSBzdWJzZXF1ZW50IFJfQUxQSEFfSU1NRURfTE8zMiByZWxvY3MuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0JSX0hJMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9CUl9ISTMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgbG93IDE2IGJpdHMgb2YgYSBkaXNwbGFjZW1lbnQgY2FsY3VsYXRlZCBpbiBhIHByZXZpb3VzIEhJMzIgcmVsb2MuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0xPMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9MTzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBNaXNjIEVMRiByZWxvY2F0aW9ucy4gKi8KLQotICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiB0byBjb3B5IHRoZSB0YXJnZXQgaW50byBvdXIgLmR5bmJzcyBzZWN0aW9uLiAgKi8KLSAgLyogTm90IGdlbmVyYXRlZCwgYXMgYWxsIEFscGhhIG9iamVjdHMgdXNlIFBJQywgc28gaXQgaXMgbm90IG5lZWRlZC4gIEl0Ci0gICAgIGlzIHByZXNlbnQgYmVjYXVzZSBldmVyeSBvdGhlciBFTEYgaGFzIG9uZSwgYnV0IHNob3VsZCBub3QgYmUgdXNlZAotICAgICBiZWNhdXNlIC5keW5ic3MgaXMgYW4gdWdseSB0aGluZy4gICovCi0gIEhPV1RPIChSX0FMUEhBX0NPUFksCi0JIDAsCi0JIDAsCi0JIDAsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJDT1BZIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIGZvciBhIC5nb3QgZW50cnkuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HTE9CX0RBVCwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkdMT0JfREFUIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIGZvciBhIC5wbHQgZW50cnkuICAqLwotICBIT1dUTyAoUl9BTFBIQV9KTVBfU0xPVCwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkpNUF9TTE9UIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIHRvIGFkZCB0aGUgYmFzZSBvZiB0aGUgRFNPIHRvIGEgNjQtYml0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVMQVRJVkUsCi0JIDAsCi0JIDAsCi0JIDAsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSRUxBVElWRSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSB0cnVlKQotfTsKLQotLyogQSByZWxvY2F0aW9uIGZ1bmN0aW9uIHdoaWNoIGRvZXNuJ3QgZG8gYW55dGhpbmcuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgcmVsb2MtPmFkZHJlc3MgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBBIHJlbG9jYXRpb24gZnVuY3Rpb24gdXNlZCBmb3IgYW4gdW5zdXBwb3J0ZWQgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9yZWxvY19iYWQgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgcmVsb2MtPmFkZHJlc3MgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotLyogRG8gdGhlIHdvcmsgb2YgdGhlIEdQRElTUCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwIChhYmZkLCBncGRpc3AsIHBfbGRhaCwgcF9sZGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSBncGRpc3A7Ci0gICAgIGJmZF9ieXRlICpwX2xkYWg7Ci0gICAgIGJmZF9ieXRlICpwX2xkYTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldCA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgaV9sZGFoLCBpX2xkYTsKLQotICBpX2xkYWggPSBiZmRfZ2V0XzMyIChhYmZkLCBwX2xkYWgpOwotICBpX2xkYSA9IGJmZF9nZXRfMzIgKGFiZmQsIHBfbGRhKTsKLQotICAvKiBDb21wbGFpbiBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgY29ycmVjdC4gICovCi0gIGlmICgoKGlfbGRhaCA+PiAyNikgJiAweDNmKSAhPSAweDA5Ci0gICAgICB8fCAoKGlfbGRhID4+IDI2KSAmIDB4M2YpICE9IDB4MDgpCi0gICAgcmV0ID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQotICAvKiBFeHRyYWN0IHRoZSB1c2VyLXN1cHBsaWVkIG9mZnNldCwgbWlycm9yaW5nIHRoZSBzaWduIGV4dGVuc2lvbnMKLSAgICAgdGhhdCB0aGUgaW5zdHJ1Y3Rpb25zIHBlcmZvcm0uICAqLwotICBhZGRlbmQgPSAoKGlfbGRhaCAmIDB4ZmZmZikgPDwgMTYpIHwgKGlfbGRhICYgMHhmZmZmKTsKLSAgYWRkZW5kID0gKGFkZGVuZCBeIDB4ODAwMDgwMDApIC0gMHg4MDAwODAwMDsKLQotICBncGRpc3AgKz0gYWRkZW5kOwotCi0gIGlmICgoYmZkX3NpZ25lZF92bWEpIGdwZGlzcCA8IC0oYmZkX3NpZ25lZF92bWEpIDB4ODAwMDAwMDAKLSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgZ3BkaXNwID49IChiZmRfc2lnbmVkX3ZtYSkgMHg3ZmZmODAwMCkKLSAgICByZXQgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uIGFnYWluLiAgKi8KLSAgaV9sZGFoID0gKChpX2xkYWggJiAweGZmZmYwMDAwKQotCSAgICB8ICgoKGdwZGlzcCA+PiAxNikgKyAoKGdwZGlzcCA+PiAxNSkgJiAxKSkgJiAweGZmZmYpKTsKLSAgaV9sZGEgPSAoaV9sZGEgJiAweGZmZmYwMDAwKSB8IChncGRpc3AgJiAweGZmZmYpOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGlfbGRhaCwgcF9sZGFoKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaV9sZGEsIHBfbGRhKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgc3BlY2lhbCBmdW5jdGlvbiBmb3IgdGhlIEdQRElTUCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX2dwZGlzcCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bSwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgb3V0cHV0X2JmZCwgZXJyX21zZykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycl9tc2c7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3AsIHJlbG9jYXRpb247Ci0gIGJmZF9ieXRlICpwX2xkYWgsICpwX2xkYTsKLQotICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBub3QgZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSB8fAotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKyByZWxvY19lbnRyeS0+YWRkZW5kID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBUaGUgZ3AgdXNlZCBpbiB0aGUgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IG9iamVjdCB0byB3aGljaCB0aGlzCi0gICAgIGlucHV0IG9iamVjdCBiZWxvbmdzIGlzIGNhY2hlZCBvbiB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoYWJmZCk7Ci0KLSAgcmVsb2NhdGlvbiA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkrIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBwX2xkYWggPSAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBwX2xkYSA9IHBfbGRhaCArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcmV0ID0gZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwIChhYmZkLCBncCAtIHJlbG9jYXRpb24sIHBfbGRhaCwgcF9sZGEpOwotCi0gIC8qIENvbXBsYWluIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBjb3JyZWN0LiAgKi8KLSAgaWYgKHJldCA9PSBiZmRfcmVsb2NfZGFuZ2Vyb3VzKQotICAgICplcnJfbXNnID0gXygiR1BESVNQIHJlbG9jYXRpb24gZGlkIG5vdCBmaW5kIGxkYWggYW5kIGxkYSBpbnN0cnVjdGlvbnMiKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gQWxwaGEgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGVsZl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIGludCBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwIGVsZjY0X2FscGhhX3JlbG9jX21hcFtdID0KLXsKLSAge0JGRF9SRUxPQ19OT05FLAkJUl9BTFBIQV9OT05FfSwKLSAge0JGRF9SRUxPQ18zMiwJCVJfQUxQSEFfUkVGTE9OR30sCi0gIHtCRkRfUkVMT0NfNjQsCQlSX0FMUEhBX1JFRlFVQUR9LAotICB7QkZEX1JFTE9DX0NUT1IsCQlSX0FMUEhBX1JFRlFVQUR9LAotICB7QkZEX1JFTE9DX0dQUkVMMzIsCQlSX0FMUEhBX0dQUkVMMzJ9LAotICB7QkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLAlSX0FMUEhBX0xJVEVSQUx9LAotICB7QkZEX1JFTE9DX0FMUEhBX0xJVFVTRSwJUl9BTFBIQV9MSVRVU0V9LAotICB7QkZEX1JFTE9DX0FMUEhBX0dQRElTUCwJUl9BTFBIQV9HUERJU1B9LAotICB7QkZEX1JFTE9DXzIzX1BDUkVMX1MyLAlSX0FMUEhBX0JSQUREUn0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfSElOVCwJUl9BTFBIQV9ISU5UfSwKLSAge0JGRF9SRUxPQ18xNl9QQ1JFTCwJCVJfQUxQSEFfU1JFTDE2fSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwJCVJfQUxQSEFfU1JFTDMyfSwKLSAge0JGRF9SRUxPQ182NF9QQ1JFTCwJCVJfQUxQSEFfU1JFTDY0fSwKLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIEhPV1RPIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgY29uc3Qgc3RydWN0IGVsZl9yZWxvY19tYXAgKmksICplOwotICBpID0gZSA9IGVsZjY0X2FscGhhX3JlbG9jX21hcDsKLSAgZSArPSBzaXplb2YgKGVsZjY0X2FscGhhX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsKLSAgZm9yICg7IGkgIT0gZTsgKytpKQotICAgIHsKLSAgICAgIGlmIChpLT5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtpLT5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBHaXZlbiBhbiBBbHBoYSBFTEYgcmVsb2MgdHlwZSwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGY2NF9hbHBoYV9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjY0X1JfVFlQRShkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfQUxQSEFfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotDAotLyogVGhlc2UgZnVuY3Rpb25zIGRvIHJlbGF4YXRpb24gZm9yIEFscGhhIEVMRi4gCi0KLSAgIEN1cnJlbnRseSBJJ20gb25seSBoYW5kbGluZyB3aGF0IEkgY2FuIGRvIHdpdGggZXhpc3RpbmcgY29tcGlsZXIKLSAgIGFuZCBhc3NlbWJsZXIgc3VwcG9ydCwgd2hpY2ggbWVhbnMgbm8gaW5zdHJ1Y3Rpb25zIGFyZSByZW1vdmVkLAotICAgdGhvdWdoIHNvbWUgbWF5IGJlIG5vcHBlZC4gIEF0IHRoaXMgdGltZSBHQ0MgZG9lcyBub3QgZW1pdCBlbm91Z2gKLSAgIGluZm9ybWF0aW9uIHRvIGRvIGFsbCBvZiB0aGUgcmVsYXhpbmcgdGhhdCBpcyBwb3NzaWJsZS4gIEl0IHdpbGwKLSAgIHRha2Ugc29tZSBub3Qgc21hbGwgYW1vdW50IG9mIHdvcmsgZm9yIHRoYXQgdG8gaGFwcGVuLgotCi0gICBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgaW50ZXJlc3RpbmcgcGFwZXJzIHRoYXQgSSBvbmNlIHJlYWQgb24gdGhpcwotICAgc3ViamVjdCwgdGhhdCBJIGNhbm5vdCBmaW5kIHJlZmVyZW5jZXMgdG8gYXQgdGhlIG1vbWVudCwgdGhhdAotICAgcmVsYXRlZCB0byBBbHBoYSBpbiBwYXJ0aWN1bGFyLiAgVGhleSBhcmUgYnkgRGF2aWQgV2FsbCwgdGhlbiBvZgotICAgREVDIFdSTC4gICovCi0KLSNkZWZpbmUgT1BfTERBCQkweDA4Ci0jZGVmaW5lIE9QX0xEQUgJCTB4MDkKLSNkZWZpbmUgSU5TTl9KU1IJMHg2ODAwNDAwMAotI2RlZmluZSBJTlNOX0pTUl9NQVNLCTB4ZmMwMGMwMDAKLSNkZWZpbmUgT1BfTERRCQkweDI5Ci0jZGVmaW5lIE9QX0JSCQkweDMwCi0jZGVmaW5lIE9QX0JTUgkJMHgzNAotI2RlZmluZSBJTlNOX1VOT1AJMHgyZmUwMDAwMAotCi1zdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywgKnJlbGVuZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgYm9vbGVhbiBjaGFuZ2VkX2NvbnRlbnRzOwotICBib29sZWFuIGNoYW5nZWRfcmVsb2NzOwotICBiZmRfdm1hIGdwOwotICBiZmQgKmdvdG9iajsKLSAgYXNlY3Rpb24gKnRzZWM7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotICB1bnNpZ25lZCBjaGFyIG90aGVyOwotfTsKLQotc3RhdGljIEVsZl9JbnRlcm5hbF9SZWxhICogZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UKLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbywgYmZkX3ZtYSBzeW12YWwsIAotICAgICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGVuZCkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvLCBiZmRfdm1hIHN5bXZhbCwgCi0gICAgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwpKTsKLQotc3RhdGljIGJmZF92bWEgZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwKLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbywgYmZkX3ZtYSBzeW12YWwpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgIGJvb2xlYW4gKmFnYWluKSk7Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfUmVsYSAqCi1lbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcyAocmVsLCByZWxlbmQsIG9mZnNldCwgdHlwZSkKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGludCB0eXBlOwotewotICB3aGlsZSAocmVsIDwgcmVsZW5kKQotICAgIHsKLSAgICAgIGlmIChyZWwtPnJfb2Zmc2V0ID09IG9mZnNldCAmJiBFTEY2NF9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSB0eXBlKQotCXJldHVybiByZWw7Ci0gICAgICArK3JlbDsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgRWxmX0ludGVybmFsX1JlbGEgKgotZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UgKGluZm8sIHN5bXZhbCwgaXJlbCwgaXJlbGVuZCkKLSAgICAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgc3ltdmFsOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICp1cmVsOwotICBpbnQgZmxhZ3MsIGNvdW50LCBpOwotICBiZmRfc2lnbmVkX3ZtYSBkaXNwOwotICBib29sZWFuIGZpdHMxNjsKLSAgYm9vbGVhbiBmaXRzMzI7Ci0gIGJvb2xlYW4gbGl0X3JldXNlZCA9IGZhbHNlOwotICBib29sZWFuIGFsbF9vcHRpbWl6ZWQgPSB0cnVlOwotICB1bnNpZ25lZCBpbnQgbGl0X2luc247Ci0KLSAgbGl0X2luc24gPSBiZmRfZ2V0XzMyIChpbmZvLT5hYmZkLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLSAgaWYgKGxpdF9pbnNuID4+IDI2ICE9IE9QX0xEUSkKLSAgICB7Ci0gICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgKCIlczogJXMrMHglbHg6IHdhcm5pbmc6IExJVEVSQUwgcmVsb2NhdGlvbiBhZ2FpbnN0IHVuZXhwZWN0ZWQgaW5zbiIsCi0JYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIGluZm8tPnNlYy0+bmFtZSwKLQkodW5zaWduZWQgbG9uZylpcmVsLT5yX29mZnNldCkpOwotICAgICAgcmV0dXJuIGlyZWw7Ci0gICAgfQotCi0gIC8qIFN1bW1hcml6ZSBob3cgdGhpcyBwYXJ0aWN1bGFyIExJVEVSQUwgaXMgdXNlZC4gICovCi0gIGZvciAodXJlbCA9IGlyZWwrMSwgZmxhZ3MgPSBjb3VudCA9IDA7IHVyZWwgPCBpcmVsZW5kOyArK3VyZWwsICsrY291bnQpCi0gICAgewotICAgICAgaWYgKEVMRjY0X1JfVFlQRSAodXJlbC0+cl9pbmZvKSAhPSBSX0FMUEhBX0xJVFVTRSkKLQlicmVhazsKLSAgICAgIGlmICh1cmVsLT5yX2FkZGVuZCA+PSAwICYmIHVyZWwtPnJfYWRkZW5kIDw9IDMpCi0JZmxhZ3MgfD0gMSA8PCB1cmVsLT5yX2FkZGVuZDsKLSAgICB9Ci0KLSAgLyogQSBsaXR0bGUgcHJlcGFyYXRpb24gZm9yIHRoZSBsb29wLi4uICovCi0gIGRpc3AgPSBzeW12YWwgLSBpbmZvLT5ncDsKLSAgZml0czE2ID0gKGRpc3AgPj0gLShiZmRfc2lnbmVkX3ZtYSkweDgwMDAgJiYgZGlzcCA8IDB4ODAwMCk7Ci0gIGZpdHMzMiA9IChkaXNwID49IC0oYmZkX3NpZ25lZF92bWEpMHg4MDAwMDAwMCAmJiBkaXNwIDwgMHg3ZmZmODAwMCk7Ci0KLSAgZm9yICh1cmVsID0gaXJlbCsxLCBpID0gMDsgaSA8IGNvdW50OyArK2ksICsrdXJlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbmZvLT5hYmZkLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQotICAgICAgc3dpdGNoICh1cmVsLT5yX2FkZGVuZCkKLQl7Ci0JZGVmYXVsdDogLyogMCA9IEFERFJFU1MgRk9STUFUICovCi0JICAvKiBUaGlzIHR5cGUgaXMgcmVhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciB0byBub3RlIHRoYXQgYWxsCi0JICAgICB1c2VzIGNhbm5vdCBiZSBvcHRpbWl6ZWQsIGJ1dCB0byBzdGlsbCBhbGxvdyBzb21lLiAgKi8KLQkgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAxOiAvKiBNRU0gRk9STUFUICovCi0JICAvKiBXZSBjYW4gYWx3YXlzIG9wdGltaXplIDE2LWJpdCBkaXNwbGFjZW1lbnRzLiAgKi8KLQkgIGlmIChmaXRzMTYpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogc2FuaXR5IGNoZWNrIHRoZSBpbnNuIGZvciBtZW0gZm9ybWF0IHdpdGgKLQkJIHplcm8gYWRkZW5kLiAgKi8KLQotCSAgICAgIC8qIFRha2UgdGhlIG9wIGNvZGUgYW5kIGRlc3QgZnJvbSB0aGlzIGluc24sIHRha2UgdGhlIGJhc2UgCi0JCSByZWdpc3RlciBmcm9tIHRoZSBsaXRlcmFsIGluc24uICBMZWF2ZSB0aGUgb2Zmc2V0IGFsb25lLiAgKi8KLQkgICAgICBpbnNuID0gKGluc24gJiAweGZmZTAwMDAwKSB8IChsaXRfaW5zbiAmIDB4MDAxZjAwMDApOwotCSAgICAgIHVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxMT1cpOwotCSAgICAgIHVyZWwtPnJfYWRkZW5kID0gaXJlbC0+cl9hZGRlbmQ7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0JICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0JICAgIH0KLQotCSAgLyogSWYgYWxsIG1lbStieXRlLCB3ZSBjYW4gb3B0aW1pemUgMzItYml0IG1lbSBkaXNwbGFjZW1lbnRzLiAgKi8KLQkgIGVsc2UgaWYgKGZpdHMzMiAmJiAhKGZsYWdzICYgfjYpKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IHNhbml0eSBjaGVjayB0aGF0IGxpdCBpbnNuIFJhIGlzIG1lbSBpbnNuIFJiLCBhbmQKLQkJIHRoYXQgbWVtX2luc24gZGlzcCBpcyB6ZXJvLiAgKi8KLQotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxISUdIKTsKLQkgICAgICBsaXRfaW5zbiA9IChPUF9MREFIIDw8IDI2KSB8IChsaXRfaW5zbiAmIDB4MDNmZjAwMDApOwotCSAgICAgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGxpdF9pbnNuLAotCQkJICBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBsaXRfcmV1c2VkID0gdHJ1ZTsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQotCSAgICAgIHVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxMT1cpOwotCSAgICAgIHVyZWwtPnJfYWRkZW5kID0gaXJlbC0+cl9hZGRlbmQ7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAyOiAvKiBCWVRFIE9GRlNFVCBGT1JNQVQgKi8KLQkgIC8qIFdlIGNhbiBhbHdheXMgb3B0aW1pemUgYnl0ZSBpbnN0cnVjdGlvbnMuICAqLwotCi0JICAvKiBGSVhNRTogc2FuaXR5IGNoZWNrIHRoZSBpbnNuIGZvciBieXRlIG9wLiAgQ2hlY2sgdGhhdCB0aGUKLQkgICAgIGxpdGVyYWwgZGVzdCByZWcgaXMgaW5kZWVkIFJiIGluIHRoZSBieXRlIGluc24uICAqLwotCi0JICBpbnNuID0gKGluc24gJiB+MHgwMDFmZjAwMCkgfCAoKHN5bXZhbCAmIDcpIDw8IDEzKSB8IDB4MTAwMDsKLQotCSAgdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX0FMUEhBX05PTkUpOwotCSAgdXJlbC0+cl9hZGRlbmQgPSAwOwotCSAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0JICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQkgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6IC8qIENBTEwgRk9STUFUICovCi0JICB7Ci0JICAgIC8qIElmIG5vdCB6ZXJvLCBwbGFjZSB0byBqdW1wIHdpdGhvdXQgbmVlZGluZyBwdi4gICovCi0JICAgIGJmZF92bWEgb3B0ZGVzdCA9IGVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsIChpbmZvLCBzeW12YWwpOwotCSAgICBiZmRfdm1hIG9yZyA9IChpbmZvLT5zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5mby0+c2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIHVyZWwtPnJfb2Zmc2V0ICsgNCk7Ci0JICAgIGJmZF9zaWduZWRfdm1hIG9kaXNwOwotCi0JICAgIG9kaXNwID0gKG9wdGRlc3QgPyBvcHRkZXN0IDogc3ltdmFsKSAtIG9yZzsKLQkgICAgaWYgKG9kaXNwID49IC0weDQwMDAwMCAmJiBvZGlzcCA8IDB4NDAwMDAwKQotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgKnhyZWw7Ci0KLQkJLyogUHJlc2VydmUgYnJhbmNoIHByZWRpY3Rpb24gY2FsbCBzdGFjayB3aGVuIHBvc3NpYmxlLiAqLwotCQlpZiAoKGluc24gJiBJTlNOX0pTUl9NQVNLKSA9PSBJTlNOX0pTUikKLQkJICBpbnNuID0gKE9QX0JTUiA8PCAyNikgfCAoaW5zbiAmIDB4MDNlMDAwMDApOwotCQllbHNlCi0JCSAgaW5zbiA9IChPUF9CUiA8PCAyNikgfCAoaW5zbiAmIDB4MDNlMDAwMDApOwotCQkgIAotCQl1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgIFJfQUxQSEFfQlJBRERSKTsKLQkJdXJlbC0+cl9hZGRlbmQgPSBpcmVsLT5yX2FkZGVuZDsKLQotCQlpZiAob3B0ZGVzdCkKLQkJICB1cmVsLT5yX2FkZGVuZCArPSBvcHRkZXN0IC0gc3ltdmFsOwotCQllbHNlCi0JCSAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCi0JCWJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOwotCi0JCS8qIEtpbGwgYW55IEhJTlQgcmVsb2MgdGhhdCBtaWdodCBleGlzdCBmb3IgdGhpcyBpbnNuLiAgKi8KLQkJeHJlbCA9IChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcwotCQkJKGluZm8tPnJlbG9jcywgaW5mby0+cmVsZW5kLCB1cmVsLT5yX29mZnNldCwgCi0JCQkgUl9BTFBIQV9ISU5UKSk7Ci0JCWlmICh4cmVsKQotCQkgIHhyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9BTFBIQV9OT05FKTsKLQotCQlpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQkJaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQotCSAgICAvKiA/Pz8gSWYgdGFyZ2V0IGdwID09IGN1cnJlbnQgZ3Agd2UgY2FuIGVsaW1pbmF0ZSB0aGUgZ3AgcmVsb2FkLgotCSAgICAgICBUaGlzIGRvZXMgZGVwZW5kIG9uIGV2ZXJ5IHBsYWNlIGEgZ3AgY291bGQgYmUgcmVsb2FkZWQgd2lsbAotCSAgICAgICBiZSwgd2hpY2ggY3VycmVudGx5IGhhcHBlbnMgZm9yIGFsbCBjb2RlIHByb2R1Y2VkIGJ5IGdjYywgYnV0Ci0JICAgICAgIG5vdCBuZWNlc3NhcmlseSBieSBoYW5kLWNvZGVkIGFzc2VtYmx5LCBvciBpZiBzaWJsaW5nIGNhbGxzCi0JICAgICAgIGFyZSBlbmFibGVkIGluIGdjYy4gCi0KLQkgICAgICAgUGVyaGFwcyBjb25kaXRpb25hbGl6ZSB0aGlzIG9uIGEgZmxhZyBiZWluZyBzZXQgaW4gdGhlIHRhcmdldAotCSAgICAgICBvYmplY3QgZmlsZSdzIGhlYWRlciwgYW5kIGhhdmUgZ2NjIHNldCBpdD8gICovCi0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIGFsbCBjYXNlcyB3ZXJlIG9wdGltaXplZCwgd2UgY2FuIHJlZHVjZSB0aGUgdXNlIGNvdW50IG9uIHRoaXMKLSAgICAgZ290IGVudHJ5IGJ5IG9uZSwgcG9zc2libHkgZWxpbWluYXRpbmcgaXQuICAqLwotICBpZiAoYWxsX29wdGltaXplZCkKLSAgICB7Ci0gICAgICBpbmZvLT5nb3RlbnQtPnVzZV9jb3VudCAtPSAxOwotICAgICAgYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPnRvdGFsX2dvdF9lbnRyaWVzIC09IDE7Ci0gICAgICBpZiAoIWluZm8tPmgpCi0JYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPm5fbG9jYWxfZ290X2VudHJpZXMgLT0gMTsKLQotICAgICAgLyogSWYgdGhlIGxpdGVyYWwgaW5zdHJ1Y3Rpb24gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoaXQgbWF5IGhhdmUgYmVlbgotCSByZXVzZWQuICBXZSBjYW4gZWxpbWluYXRlIGl0LgotCSA/Pz8gRm9yIG5vdywgSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBjb21wYWN0aW5nIHRoZSBzZWN0aW9uLAotCSBzbyBqdXN0IG5vcCBpdCBvdXQuICAqLwotICAgICAgaWYgKCFsaXRfcmV1c2VkKQotCXsKLQkgIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9BTFBIQV9OT05FKTsKLQkgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLQotCSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgSU5TTl9VTk9QLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGlyZWwgKyBjb3VudDsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsIChpbmZvLCBzeW12YWwpCi0gICAgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHN5bXZhbDsKLXsKLSAgLyogSWYgdGhlIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBncCwgYW5kIHdlIGNhbiBpZGVudGlmeSB0aGF0IHRoZQotICAgICBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgaXRzIGZ1bmN0aW9uIHBvaW50ZXIsIHdlIGNhbiBlbGltaW5hdGUgdGhlCi0gICAgIGFkZHJlc3MgbG9hZC4gICovCi0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgTk9QViwgd2UgYXJlIGJlaW5nIHRvbGQgdGhlIGZ1bmN0aW9uIG5ldmVyCi0gICAgIG5lZWRzIGl0cyBwcm9jZWR1cmUgdmFsdWUuICAqLwotICBpZiAoaW5mby0+b3RoZXIgPT0gU1RPX0FMUEhBX05PUFYpCi0gICAgcmV0dXJuIHN5bXZhbDsKLQotICAvKiBJZiB0aGUgc3ltYm9sIGlzIG1hcmtlZCBTVERfR1AsIHdlIGFyZSBiZWluZyB0b2xkIHRoZSBmdW5jdGlvbiBkb2VzCi0gICAgIGEgbm9ybWFsIGxkZ3AgaW4gdGhlIGZpcnN0IHR3byB3b3Jkcy4gICovIAotICBlbHNlIGlmIChpbmZvLT5vdGhlciA9PSBTVE9fQUxQSEFfU1REX0dQTE9BRCkKLSAgICA7Ci0KLSAgLyogT3RoZXJ3aXNlLCB3ZSBtYXkgYmUgYWJsZSB0byBpZGVudGlmeSBhIEdQIGxvYWQgaW4gdGhlIGZpcnN0IHR3bwotICAgICB3b3Jkcywgd2hpY2ggd2UgY2FuIHRoZW4gc2tpcC4gICovCi0gIGVsc2UgCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnRzZWNfcmVsb2NzLCAqdHNlY19yZWxlbmQsICp0c2VjX2ZyZWUsICpncGRpc3A7Ci0gICAgICBiZmRfdm1hIG9mczsKLQotICAgICAgLyogTG9hZCB0aGUgcmVsb2NhdGlvbnMgZnJvbSB0aGUgc2VjdGlvbiB0aGF0IHRoZSB0YXJnZXQgc3ltYm9sIGlzIGluLiAqLwotICAgICAgaWYgKGluZm8tPnNlYyA9PSBpbmZvLT50c2VjKQotCXsKLQkgIHRzZWNfcmVsb2NzID0gaW5mby0+cmVsb2NzOwotCSAgdHNlY19yZWxlbmQgPSBpbmZvLT5yZWxlbmQ7Ci0JICB0c2VjX2ZyZWUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0c2VjX3JlbG9jcyA9IChfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAgICAgKGluZm8tPmFiZmQsIGluZm8tPnRzZWMsIChQVFIpIE5VTEwsCi0JCQkgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgaW5mby0+bGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgaWYgKHRzZWNfcmVsb2NzID09IE5VTEwpCi0JICAgIHJldHVybiAwOwotCSAgdHNlY19yZWxlbmQgPSB0c2VjX3JlbG9jcyArIGluZm8tPnRzZWMtPnJlbG9jX2NvdW50OwotCSAgdHNlY19mcmVlID0gKGluZm8tPmxpbmtfaW5mby0+a2VlcF9tZW1vcnkgPyBOVUxMIDogdHNlY19yZWxvY3MpOwotCX0KLQotICAgICAgLyogUmVjb3ZlciB0aGUgc3ltYm9sJ3Mgb2Zmc2V0IHdpdGhpbiB0aGUgc2VjdGlvbi4gICovCi0gICAgICBvZnMgPSAoc3ltdmFsIC0gaW5mby0+dHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgLSBpbmZvLT50c2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSAgCi0gICAgICAvKiBMb29rIGZvciBhIEdQRElTUCByZWxvYy4gICovCi0gICAgICBncGRpc3AgPSAoZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMKLQkJKHRzZWNfcmVsb2NzLCB0c2VjX3JlbGVuZCwgb2ZzLCBSX0FMUEhBX0dQRElTUCkpOwotCi0gICAgICBpZiAoIWdwZGlzcCB8fCBncGRpc3AtPnJfYWRkZW5kICE9IDQpCi0JewotCSAgaWYgKHRzZWNfZnJlZSkKLQkgICAgZnJlZSAodHNlY19mcmVlKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmICh0c2VjX2ZyZWUpCi0gICAgICAgIGZyZWUgKHRzZWNfZnJlZSk7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIG5vdyBkZXRlcm1pbmVkIHRoYXQgd2UgY2FuIHNraXAgYW4gaW5pdGlhbCBncCBsb2FkLiAgVmVyaWZ5IAotICAgICB0aGF0IHRoZSBjYWxsIGFuZCB0aGUgdGFyZ2V0IHVzZSB0aGUgc2FtZSBncC4gICAqLwotICBpZiAoaW5mby0+bGlua19pbmZvLT5oYXNoLT5jcmVhdG9yICE9IGluZm8tPnRzZWMtPm93bmVyLT54dmVjCi0gICAgICB8fCBpbmZvLT5nb3RvYmogIT0gYWxwaGFfZWxmX3RkYXRhIChpbmZvLT50c2VjLT5vd25lciktPmdvdG9iaikKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gc3ltdmFsICsgODsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlbGF4X3dpdGhvdXRfbGl0dXNlIChpbmZvLCBzeW12YWwsIGlyZWwpCi0gICAgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCBpbnNuOwotICBiZmRfc2lnbmVkX3ZtYSBkaXNwOwotCi0gIC8qIEdldCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnNuID0gYmZkX2dldF8zMiAoaW5mby0+YWJmZCwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0KLSAgaWYgKGluc24gPj4gMjYgIT0gT1BfTERRKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoIiVzOiAlcysweCVseDogd2FybmluZzogTElURVJBTCByZWxvY2F0aW9uIGFnYWluc3QgdW5leHBlY3RlZCBpbnNuIiwKLQliZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgaW5mby0+c2VjLT5uYW1lLAotCSh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFNvIHdlIGFyZW4ndCB0b2xkIG11Y2guICBEbyB3aGF0IHdlIGNhbiB3aXRoIHRoZSBhZGRyZXNzIGxvYWQgYW5kCi0gICAgIGZha2UgdGhlIHJlc3QuICBBbGwgb2YgdGhlIG9wdGltaXphdGlvbnMgaGVyZSByZXF1aXJlIHRoYXQgdGhlCi0gICAgIG9mZnNldCBmcm9tIHRoZSBHUCBmaXQgaW4gMTYgYml0cy4gICovCi0KLSAgZGlzcCA9IHN5bXZhbCAtIGluZm8tPmdwOwotICBpZiAoZGlzcCA8IC0weDgwMDAgfHwgZGlzcCA+PSAweDgwMDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogT24gdGhlIExJVEVSQUwgaW5zdHJ1Y3Rpb24gaXRzZWxmLCBjb25zaWRlciBleGNoYW5naW5nCi0gICAgIGBsZHEgUixYKGdwKScgZm9yIGBsZGEgUixZKGdwKScuICAqLwotCi0gIGluc24gPSAoT1BfTERBIDw8IDI2KSB8IChpbnNuICYgMHgwM2ZmMDAwMCk7Ci0gIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQotICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLCBSX0FMUEhBX0dQUkVMTE9XKTsKLSAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0gIC8qIFJlZHVjZSB0aGUgdXNlIGNvdW50IG9uIHRoaXMgZ290IGVudHJ5IGJ5IG9uZSwgcG9zc2libHkKLSAgICAgZWxpbWluYXRpbmcgaXQuICAqLwotICBpbmZvLT5nb3RlbnQtPnVzZV9jb3VudCAtPSAxOwotICBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+dG90YWxfZ290X2VudHJpZXMgLT0gMTsKLSAgaWYgKCFpbmZvLT5oKQotICAgIGFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT5uX2xvY2FsX2dvdF9lbnRyaWVzIC09IDE7Ci0KLSAgLyogPz8/IFNlYXJjaCBmb3J3YXJkIHRocm91Z2ggdGhpcyBiYXNpYyBibG9jayBsb29raW5nIGZvciBpbnNucwotICAgICB0aGF0IHVzZSB0aGUgdGFyZ2V0IHJlZ2lzdGVyLiAgU3RvcCBhZnRlciBhbiBpbnNuIG1vZGlmeWluZyB0aGUKLSAgICAgcmVnaXN0ZXIgaXMgc2Vlbiwgb3IgYWZ0ZXIgYSBicmFuY2ggb3IgY2FsbC4KLQotICAgICBBbnkgc3VjaCBtZW1vcnkgbG9hZCBpbnNuIG1heSBiZSBzdWJzdGl0dXRlZCBieSBhIGxvYWQgZGlyZWN0bHkKLSAgICAgb2ZmIHRoZSBHUC4gIFRoaXMgYWxsb3dzIHRoZSBtZW1vcnkgbG9hZCBpbnNuIHRvIGJlIGlzc3VlZCBiZWZvcmUKLSAgICAgdGhlIGNhbGN1bGF0ZWQgR1AgcmVnaXN0ZXIgd291bGQgb3RoZXJ3aXNlIGJlIHJlYWR5LiAKLQotICAgICBBbnkgc3VjaCBqc3IgaW5zbiBjYW4gYmUgcmVwbGFjZWQgYnkgYSBic3IgaWYgaXQgaXMgaW4gcmFuZ2UuCi0KLSAgICAgVGhpcyB3b3VsZCBtZWFuIHRoYXQgd2UnZCBoYXZlIHRvIF9hZGRfIHJlbG9jYXRpb25zLCB0aGUgcGFpbiBvZgotICAgICB3aGljaCBnaXZlcyBvbmUgcGF1c2UuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllczsKLSAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gaW5mbzsKLQotICAvKiBXZSBhcmUgbm90IGN1cnJlbnRseSBjaGFuZ2luZyBhbnkgc2l6ZXMsIHNvIG9ubHkgb25lIHBhc3MuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5sb2NhbF9nb3RfZW50cmllczsKLQotICAvKiBMb2FkIHRoZSByZWxvY2F0aW9ucyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0gIGluZm8uYWJmZCA9IGFiZmQ7Ci0gIGluZm8uc2VjID0gc2VjOwotICBpbmZvLmxpbmtfaW5mbyA9IGxpbmtfaW5mbzsKLSAgaW5mby5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIGluZm8ucmVsZW5kID0gaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogRmluZCB0aGUgR1AgZm9yIHRoaXMgb2JqZWN0LiAgKi8KLSAgaW5mby5nb3RvYmogPSBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT5nb3RvYmo7Ci0gIGlmIChpbmZvLmdvdG9iaikKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoaW5mby5nb3RvYmopLT5nb3Q7Ci0gICAgICBpbmZvLmdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGluZm8uZ290b2JqKTsKLSAgICAgIGlmIChpbmZvLmdwID09IDApCi0JewotCSAgaW5mby5ncCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyAweDgwMDApOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKGluZm8uZ290b2JqLCBpbmZvLmdwKTsKLQl9Ci0gICAgfQotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgICAgIGlmIChFTEY2NF9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9BTFBIQV9MSVRFUkFMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGluZm8uY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgaW5mby5jb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGluZm8uY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGluZm8uY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgaW5mby5jb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjY0X0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICZpc3ltKTsKLQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaW5mby50c2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpbmZvLnRzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaXN5bS5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGluZm8udHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGluZm8udHNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlIAotCSAgICBjb250aW51ZTsJLyogd2hvIGtub3dzLiAqLwotCi0JICBpbmZvLmggPSBOVUxMOwotCSAgaW5mby5vdGhlciA9IGlzeW0uc3Rfb3RoZXI7Ci0JICBnb3RlbnQgPSBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShpcmVsLT5yX2luZm8pXTsKLQkgIHN5bXZhbCA9IGlzeW0uc3RfdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBpbmR4ID0gRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIC8qIFdlIGNhbid0IGRvIGFudGhpbmcgd2l0aCB1bmRlZmluZWQgb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JICAgICAgfHwgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBsaW5rX2luZm8pKQotCSAgICBjb250aW51ZTsKLQotCSAgaW5mby5oID0gaDsKLQkgIGluZm8uZ290ZW50ID0gZ290ZW50OwotCSAgaW5mby50c2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBpbmZvLm90aGVyID0gaC0+cm9vdC5vdGhlcjsKLQkgIGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOwotCSAgc3ltdmFsID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOwotCX0KLQotICAgICAgLyogU2VhcmNoIGZvciB0aGUgZ290IGVudHJ5IHRvIGJlIHVzZWQgYnkgdGhpcyByZWxvY2F0aW9uLiAgKi8KLSAgICAgIHdoaWxlIChnb3RlbnQtPmdvdG9iaiAhPSBpbmZvLmdvdG9iaiB8fCBnb3RlbnQtPmFkZGVuZCAhPSBpcmVsLT5yX2FkZGVuZCkKLQlnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0gICAgICBpbmZvLmdvdGVudCA9IGdvdGVudDsKLQotICAgICAgc3ltdmFsICs9IGluZm8udHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGluZm8udHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIHN5bXZhbCArPSBpcmVsLT5yX2FkZGVuZDsKLQotICAgICAgQkZEX0FTU0VSVChpbmZvLmdvdGVudCAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhlcmUgZXhpc3QgTElUVVNFIHJlbG9jYXRpb25zIGltbWVkaWF0ZWx5IGZvbGxvd2luZywgdGhpcwotCSBvcGVucyB1cCBhbGwgc29ydHMgb2YgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9ucywgYmVjYXVzZSB3ZQotCSBub3cga25vdyBldmVyeSBsb2NhdGlvbiB0aGF0IHRoaXMgYWRkcmVzcyBsb2FkIGlzIHVzZWQuICAqLwotCi0gICAgICBpZiAoaXJlbCsxIDwgaXJlbGVuZCAmJiBFTEY2NF9SX1RZUEUgKGlyZWxbMV0ucl9pbmZvKSA9PSBSX0FMUEhBX0xJVFVTRSkKLQl7Ci0JICBpcmVsID0gZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UgKCZpbmZvLCBzeW12YWwsIGlyZWwsIGlyZWxlbmQpOwotCSAgaWYgKGlyZWwgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UgKCZpbmZvLCBzeW12YWwsIGlyZWwpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmICghZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKGFiZmQsIGxpbmtfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLmNoYW5nZWRfcmVsb2NzKQotICAgIHsKLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgIH0KLQotICBpZiAoaW5mby5jaGFuZ2VkX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gaW5mby5jb250ZW50czsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBpbmZvLmNvbnRlbnRzOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgfQotCi0gICphZ2FpbiA9IGluZm8uY2hhbmdlZF9jb250ZW50cyB8fCBpbmZvLmNoYW5nZWRfcmVsb2NzOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBQTFQvR09UIFN0dWZmICovCi0jZGVmaW5lIFBMVF9IRUFERVJfU0laRSAzMgotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQxCTB4YzM2MDAwMDAJLyogYnIgICAkMjcsLis0ICAgICAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQyCTB4YTc3YjAwMGMJLyogbGRxICAkMjcsMTIoJDI3KSAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQzCTB4NDdmZjA0MWYJLyogbm9wICAgICAgICAgICAgICAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQ0CTB4NmI3YjAwMDAJLyogam1wICAkMjcsKCQyNykgICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDEyCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMQkJMHhjMzgwMDAwMAkvKiBiciAgICQyOCwgcGx0MCAgICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMgkJMAotI2RlZmluZSBQTFRfRU5UUllfV09SRDMJCTAKLQotI2RlZmluZSBNQVhfR09UX0VOVFJJRVMJCSg2NCoxMDI0IC8gOCkKLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28iCi0MCi0vKiBIYW5kbGUgYW4gQWxwaGEgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLgotICAgRklYTUU6IFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBTSEZfQUxQSEFfR1BSRUwgZmxhZywgYnV0IEknbSBub3Qgc3VyZQotICAgaG93IHRvLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmNjRfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLQotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gIEZvcnR1bmF0ZWx5LCB0aGUgQUJJIGdpdmVzCi0gICAgIHN1Z2dlc3RlZCBuYW1lcyBmb3IgYWxsIHRoZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLCBzbyB3ZSB3aWxsCi0gICAgIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdGhpcy4gICovCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9BTFBIQV9ERUJVRzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgY2FzZSBTSFRfQUxQSEFfUkVHSU5GTzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpICE9IDAKLQkgIHx8IGhkci0+c2hfc2l6ZSAhPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld3NlY3QgPSBoZHItPmJmZF9zZWN0aW9uOwotCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX0FMUEhBX0RFQlVHKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwKLQkJCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0KQotCQkJCSAgICB8IFNFQ19ERUJVR0dJTkcpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICAvKiBGb3IgYSAucmVnaW5mbyBzZWN0aW9uLCBzZXQgdGhlIGdwIHZhbHVlIGluIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbgotICAgICBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uICBXZSBuZWVkIHRoZSBncCB2YWx1ZSB3aGlsZQotICAgICBwcm9jZXNzaW5nIHJlbG9jcywgc28gd2UganVzdCBnZXQgaXQgbm93LiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfQUxQSEFfUkVHSU5GTykKLSAgICB7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLSAgICAgIEVsZjY0X1JlZ0luZm8gczsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBuZXdzZWN0LCAoUFRSKSAmZXh0LAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2FscGhhX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgJmV4dCwgJnMpOwotICAgICAgZWxmX2dwIChhYmZkKSA9IHMucmlfZ3BfdmFsdWU7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhbiBBbHBoYSBFTEYgc2VjdGlvbi4gIFdlIGRvIHRoaXMgYnkgdGhlCi0gICBzZWN0aW9uIG5hbWUsIHdoaWNoIGlzIGEgaGFjaywgYnV0IG91Z2h0IHRvIHdvcmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucyAoYWJmZCwgaGRyLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmNjRfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZWdpc3RlciBjb25zdCBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotICBpZiAoc3RyY21wIChuYW1lLCAiLm1kZWJ1ZyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0FMUEhBX0RFQlVHOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAwLiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAgKQotCWhkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0FMUEhBX1JFR0lORk87Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAucmVnaW5mbyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAweDE4LiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotCi0gICAgICAvKiBGb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIHRoZSBjb3JyZWN0IHZhbHVlLCBldmVuIGlmIHRoZQotCSBsaW5rZXIgdGhpbmtzIGl0IGlzIGxhcmdlci4gIFRoZSBsaW5rIHJvdXRpbmUgYmVsb3cgd2lsbCBvbmx5Ci0JIHdyaXRlIG91dCB0aGlzIG11Y2ggZGF0YSBmb3IgLnJlZ2luZm8uICAqLwotICAgICAgaGRyLT5zaF9zaXplID0gc2VjLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmhhc2giKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bmFtaWMiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIGhkci0+c2hfaW5mbyA9IFNJWkVPRl9BTFBIQV9EWU5TWU1fU0VDTkFNRVM7Ci0gICAgfQotI2VuZGlmCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0gICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxQSEFfR1BSRUw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSB1c2UgaXQgdG8gcHV0IC5jb21tIGl0ZW1zIGluIC5zYnNzLCBhbmQgbm90IC5ic3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN5bS0+c3Rfc2l6ZSA8PSBiZmRfZ2V0X2dwX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtRyBubiBieXRlcyBhcmUKLQkgYXV0b21hdGljYWxseSBwdXQgaW50byAuc2Jzcy4gICovCi0KLSAgICAgIGFzZWN0aW9uICpzY29tbSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNjb21tb24iKTsKLQotICAgICAgaWYgKHNjb21tID09IE5VTEwpCi0JewotCSAgc2NvbW0gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnNjb21tb24iKTsKLQkgIGlmIChzY29tbSA9PSBOVUxMCi0JICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2NvbW0sIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgICB8IFNFQ19JU19DT01NT04KLQkJCQkJCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAqc2VjcCA9IHNjb21tOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24oYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmdvdCIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPmdvdCA9IHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhbGwgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSAucGx0LCAucmVsYS5wbHQsIC5nb3QsIGFuZCAucmVsYS5nb3Qgc2VjdGlvbnMuICAqLwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJICAgIHwgU0VDX0NPREUpKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5wbHQgc2VjdGlvbi4gICovCi0gIGggPSBOVUxMOwotICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgKGluZm8sIGFiZmQsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbGEucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG1heSBvciBtYXkgbm90IGhhdmUgY3JlYXRlZCBhIC5nb3Qgc2VjdGlvbiBmb3IgdGhpcyBvYmplY3QsIGJ1dAotICAgICB3ZSBkZWZpbml0ZWx5IGhhdm4ndCBkb25lIHRoZSByZXN0IG9mIHRoZSB3b3JrLiAgKi8KLQotICBpZiAoIWVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uKGFiZmQsICIucmVsYS5nb3QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXQgdGhlIHN0YXJ0IG9mIHRoZQotICAgICBkeW5vYmoncyAuZ290IHNlY3Rpb24uICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBsaW5rZXIgc2NyaXB0Ci0gICAgIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIHN5bWJvbCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nCi0gICAgIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGggPSBOVUxMOwotICBpZiAoIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCShpbmZvLCBhYmZkLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgQlNGX0dMT0JBTCwKLQkgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5nb3QsIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCSBmYWxzZSwgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QgPSBoOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIC5tZGVidWcgc2VjdGlvbiBpbnRvIGEKLSAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgc2VjdGlvbiwgZGVidWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgY2hhciAqZXh0X2hkciA9IE5VTEw7Ci0KLSAgc3dhcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgbWVtc2V0IChkZWJ1ZywgMCwgc2l6ZW9mKCpkZWJ1ZykpOwotCi0gIGV4dF9oZHIgPSAoY2hhciAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChleHRfaGRyID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBleHRfaGRyLCAoZmlsZV9wdHIpIDAsCi0JCQkJc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgICA9PSBmYWxzZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgKCpzd2FwLT5zd2FwX2hkcl9pbikgKGFiZmQsIGV4dF9oZHIsIHN5bWhkcik7Ci0KLSAgLyogVGhlIHN5bWJvbGljIGhlYWRlciBjb250YWlucyBhYnNvbHV0ZSBmaWxlIG9mZnNldHMgYW5kIHNpemVzIHRvCi0gICAgIHJlYWQuICAqLwotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgc3ltaGRyLT5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWFiZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgIH0KLQotICBSRUFEIChsaW5lLCBjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgdW5zaWduZWQgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3N5bSwgY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQl1bmlvbiBhdXhfZXh0ICopOwotICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChzc2V4dCwgY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3JmZCwgY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9leHQsIGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgUFRSKTsKLSN1bmRlZiBSRUFECi0KLSAgZGVidWctPmZkciA9IE5VTEw7Ci0gIGRlYnVnLT5hZGp1c3QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXh0X2hkciAhPSBOVUxMKQotICAgIGZyZWUgKGV4dF9oZHIpOwotICBpZiAoZGVidWctPmxpbmUgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+bGluZSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3N5bSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gIGlmIChkZWJ1Zy0+c3MgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3MpOwotICBpZiAoZGVidWctPnNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzZXh0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9mZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBbHBoYSBFTEYgbG9jYWwgbGFiZWxzIHN0YXJ0IHdpdGggJyQnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJyQnOwotfQotCi0vKiBBbHBoYSBFTEYgZm9sbG93cyBNSVBTIEVMRiBpbiB1c2luZyBhIHNwZWNpYWwgZmluZF9uZWFyZXN0X2xpbmUKLSAgIHJvdXRpbmUgaW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXZQotICAgc3RpbGwgY2FsbCB0aGlzIG1pcHNfZWxmX2ZpbmRfbGluZSBiZWNhdXNlIG9mIHRoZSBzbG90Ci0gICBmaW5kX2xpbmVfaW5mbyBpbiBlbGZfb2JqX3RkYXRhIGlzIGRlY2xhcmVkIHRoYXQgd2F5LiAgKi8KLQotc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZQotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkOwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lIGk7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJICAgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBhc2VjdGlvbiAqbXNlYzsKLQotICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIik7Ci0gIGlmIChtc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb3JpZ2ZsYWdzOwotICAgICAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmk7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotCWdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLQotICAgICAgLyogSWYgd2UgYXJlIGNhbGxlZCBkdXJpbmcgYSBsaW5rLCBhbHBoYV9lbGZfZmluYWxfbGluayBtYXkgaGF2ZQotCSBjbGVhcmVkIHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZpZWxkLiAgV2UgZm9yY2UgaXQgYmFjayBvbiBoZXJlCi0JIGlmIGFwcHJvcHJpYXRlICh3aGljaCBpdCBub3JtYWxseSB3aWxsIGJlKS4gICovCi0gICAgICBvcmlnZmxhZ3MgPSBtc2VjLT5mbGFnczsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChtc2VjKS0+dGhpc19oZHIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCW1zZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIGZpID0gZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0gICAgICBpZiAoZmkgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotCSAgY2hhciAqZnJhd19zcmM7Ci0JICBjaGFyICpmcmF3X2VuZDsKLQkgIHN0cnVjdCBmZHIgKmZkcl9wdHI7Ci0KLQkgIGZpID0gKChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSkpKTsKLQkgIGlmIChmaSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBtc2VjLCAmZmktPmQpKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFN3YXAgaW4gdGhlIEZEUiBpbmZvcm1hdGlvbi4gICovCi0JICBmaS0+ZC5mZHIgPSAoKHN0cnVjdCBmZHIgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgIChmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICoKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBmZHIpKSkpOwotCSAgaWYgKGZpLT5kLmZkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBleHRlcm5hbF9mZHJfc2l6ZSA9IHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotCSAgZmRyX3B0ciA9IGZpLT5kLmZkcjsKLQkgIGZyYXdfc3JjID0gKGNoYXIgKikgZmktPmQuZXh0ZXJuYWxfZmRyOwotCSAgZnJhd19lbmQgPSAoZnJhd19zcmMKLQkJICAgICAgKyBmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemUpOwotCSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0JICAgICgqc3dhcC0+c3dhcF9mZHJfaW4pIChhYmZkLCAoUFRSKSBmcmF3X3NyYywgZmRyX3B0cik7Ci0KLQkgIGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID0gZmk7Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gZXZlciBmcmVlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgZmluZF9uZWFyZXN0X2xpbmUgaXMgZWl0aGVyIGNhbGxlZCBhbGwgdGhlIHRpbWUsIGFzIGluCi0gICAgICAgICAgICAgb2JqZHVtcCAtbCwgc28gdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBzYXZlZCwgb3IgaXQgaXMKLSAgICAgICAgICAgICByYXJlbHkgY2FsbGVkLCBhcyBpbiBsZCBlcnJvciBtZXNzYWdlcywgc28gdGhlIG1lbW9yeQotICAgICAgICAgICAgIHdhc3RlZCBpcyB1bmltcG9ydGFudC4gIFN0aWxsLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBhCi0gICAgICAgICAgICAgZ29vZCBpZGVhIGZvciBmcmVlX2NhY2hlZF9pbmZvIHRvIHRocm93IGl0IGF3YXkuICAqLwotCX0KLQotICAgICAgaWYgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgJmZpLT5kLCBzd2FwLAotCQkJCSAgJmZpLT5pLCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICBsaW5lX3B0cikpCi0JewotCSAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotICAgIH0KLQotICAvKiBGYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUuICAqLwotCi0gIHJldHVybiBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIpOwotfQotDAotLyogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBhbHBoYV9lbGZfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBleHRzeW1faW5mbyAqZWluZm8gPSAoc3RydWN0IGV4dHN5bV9pbmZvICopIGRhdGE7Ci0gIGJvb2xlYW4gc3RyaXA7Ci0gIGFzZWN0aW9uICpzZWMsICpvdXRwdXRfc2VjdGlvbjsKLQotICBpZiAoaC0+cm9vdC5pbmR4ID09IC0yKQotICAgIHN0cmlwID0gZmFsc2U7Ci0gIGVsc2UgaWYgKCgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgICAgICB8fCAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMCkKLSAgICAgICAgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotICAgICAgICAgICYmIChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotICAgICAgICAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotICAgICAgICAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICBpZiAoc3RyaXApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmVzeW0uaWZkID09IC0yKQotICAgIHsKLSAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKLSAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7Ci0gICAgICBoLT5lc3ltLndlYWtleHQgPSAwOwotICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKLSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKLQotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgICAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0gICAgICAgICAvKiBXaGVuIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBzeW1ib2wgaCBpcyB0aGUgb25lIGZyb20KLSAgICAgICAgICAgIHRoZSBhbm90aGVyIHNoYXJlZCBsaWJyYXJ5LCBPVVRQVVRfU0VDVElPTiBtYXkgYmUgbnVsbC4gICovCi0gICAgICAgICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLSAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NVbmRlZmluZWQ7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X3NlY3Rpb24tPm93bmVyLCBvdXRwdXRfc2VjdGlvbik7Ci0KLSAgICAgICAgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTRGF0YTsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucm9kYXRhIikgPT0gMAotICAgICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1JEYXRhOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjSW5pdDsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0Zpbmk7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgIGgtPmVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCi0gICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICBlbHNlIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICBlbHNlCi0gICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdHlwZSBhbmQgdmFsdWUgZm9yIGEgc3ltYm9sIHdpdGggYSBmdW5jdGlvbiBzdHViLiAgKi8KLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0UHJvYzsKLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChlaW5mby0+YWJmZCwgIi5wbHQiKTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkgIGlmIChvdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5wbHQub2Zmc2V0Ci0JCQkJICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJCSAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLQl9Ci0jaWYgMCAvKiBGSVhNRT8gICovCi0gICAgICBoLT5lc3ltLmlmZCA9IDA7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoZWluZm8tPmFiZmQsIGVpbmZvLT5kZWJ1ZywgZWluZm8tPnN3YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5lc3ltKSkKLSAgICB7Ci0gICAgICBlaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZJWE1FOiAgQ3JlYXRlIGEgcnVudGltZSBwcm9jZWR1cmUgdGFibGUgZnJvbSB0aGUgLm1kZWJ1ZyBzZWN0aW9uLgotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAoaGFuZGxlLCBhYmZkLCBpbmZvLCBzLCBkZWJ1ZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSovCi0MCi0vKiBIYW5kbGUgZHluYW1pYyByZWxvY2F0aW9ucyB3aGVuIGRvaW5nIGFuIEFscGhhIEVMRiBsaW5rLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBjb25zdCBjaGFyICpyZWxfc2VjX25hbWU7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIGludCBnb3RfY3JlYXRlZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIGlmIChkeW5vYmogPT0gTlVMTCkKLSAgICBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQotICBzcmVsb2MgPSBOVUxMOwotICByZWxfc2VjX25hbWUgPSBOVUxMOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YShhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzKGFiZmQpOwotICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YShhYmZkKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0gIGdvdF9jcmVhdGVkID0gMDsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4LCByX3R5cGU7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0JICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUjsKLQl9Ci0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9BTFBIQV9MSVRFUkFMOgotCSAgewotCSAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCSAgICBpbnQgZmxhZ3MgPSAwOwotCi0JICAgIGlmIChoKQotCSAgICAgIHsKLQkJLyogU2VhcmNoIGZvciBhbmQgcG9zc2libHkgY3JlYXRlIGEgZ290IGVudHJ5LiAgKi8KLQkJZm9yIChnb3RlbnQgPSBoLT5nb3RfZW50cmllczsgZ290ZW50IDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCQkgIGlmIChnb3RlbnQtPmdvdG9iaiA9PSBhYmZkICYmCi0JCSAgICAgIGdvdGVudC0+YWRkZW5kID09IHJlbC0+cl9hZGRlbmQpCi0JCSAgICBicmVhazsKLQotCQlpZiAoIWdvdGVudCkKLQkJICB7Ci0JCSAgICBnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICopCi0JCQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5KSkpOwotCQkgICAgaWYgKCFnb3RlbnQpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgZ290ZW50LT5nb3RvYmogPSBhYmZkOwotCQkgICAgZ290ZW50LT5hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQkgICAgZ290ZW50LT5nb3Rfb2Zmc2V0ID0gLTE7Ci0JCSAgICBnb3RlbnQtPmZsYWdzID0gMDsKLQkJICAgIGdvdGVudC0+dXNlX2NvdW50ID0gMTsKLQotCQkgICAgZ290ZW50LT5uZXh0ID0gaC0+Z290X2VudHJpZXM7Ci0JCSAgICBoLT5nb3RfZW50cmllcyA9IGdvdGVudDsKLQotCQkgICAgYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+dG90YWxfZ290X2VudHJpZXMrKzsKLQkJICB9Ci0JCWVsc2UKLQkJICBnb3RlbnQtPnVzZV9jb3VudCArPSAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogVGhpcyBpcyBhIGxvY2FsIC5nb3QgZW50cnkgLS0gcmVjb3JkIGZvciBtZXJnZS4gICovCi0JCWlmICghbG9jYWxfZ290X2VudHJpZXMpCi0JCSAgewotCQkgICAgc2l6ZV90IHNpemU7Ci0JCSAgICBzaXplID0gKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgICAqIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKikpOwotCi0JCSAgICBsb2NhbF9nb3RfZW50cmllcyA9ICgoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKiopCi0JCQkJCSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpKTsKLQkJICAgIGlmICghbG9jYWxfZ290X2VudHJpZXMpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgbWVtc2V0IChsb2NhbF9nb3RfZW50cmllcywgMCwgc2l6ZSk7Ci0JCSAgICBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9nb3RfZW50cmllcyA9Ci0JCSAgICAgIGxvY2FsX2dvdF9lbnRyaWVzOwotCQkgIH0KLQotCQlmb3IgKGdvdGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKV07Ci0JCSAgICAgZ290ZW50ICE9IE5VTEwgJiYgZ290ZW50LT5hZGRlbmQgIT0gcmVsLT5yX2FkZGVuZDsKLQkJICAgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JCSAgY29udGludWU7Ci0JCWlmICghZ290ZW50KQotCQkgIHsKLQkJICAgIGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKikKLQkJCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkpKSk7Ci0JCSAgICBpZiAoIWdvdGVudCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBnb3RlbnQtPmdvdG9iaiA9IGFiZmQ7Ci0JCSAgICBnb3RlbnQtPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICBnb3RlbnQtPmdvdF9vZmZzZXQgPSAtMTsKLQkJICAgIGdvdGVudC0+ZmxhZ3MgPSAwOwotCQkgICAgZ290ZW50LT51c2VfY291bnQgPSAxOwotCi0JCSAgICBnb3RlbnQtPm5leHQgPSBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyldOwotCQkgICAgbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pXSA9IGdvdGVudDsKLQotCQkgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT50b3RhbF9nb3RfZW50cmllcysrOwotCQkgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5uX2xvY2FsX2dvdF9lbnRyaWVzKys7Ci0JCSAgfQotCQllbHNlCi0JCSAgZ290ZW50LT51c2VfY291bnQgKz0gMTsKLQkgICAgICB9Ci0KLQkgICAgLyogUmVtZW1iZXIgaG93IHRoaXMgbGl0ZXJhbCBpcyB1c2VkIGZyb20gaXRzIExJVFVTRXMuCi0JICAgICAgIFRoaXMgd2lsbCBiZSBpbXBvcnRhbnQgd2hlbiBpdCBjb21lcyB0byBkZWNpZGUgaWYgd2UgY2FuCi0JICAgICAgIGNyZWF0ZSBhIC5wbHQgZW50cnkgZm9yIGEgZnVuY3Rpb24gc3ltYm9sLiAgKi8KLQkgICAgaWYgKHJlbCsxIDwgcmVsZW5kCi0JCSYmIEVMRjY0X1JfVFlQRSAocmVsWzFdLnJfaW5mbykgPT0gUl9BTFBIQV9MSVRVU0UpCi0JICAgICAgewotCQlkbwotCQkgIHsKLQkJICAgICsrcmVsOwotCQkgICAgaWYgKHJlbC0+cl9hZGRlbmQgPj0gMSAmJiByZWwtPnJfYWRkZW5kIDw9IDMpCi0JCSAgICAgIGZsYWdzIHw9IDEgPDwgcmVsLT5yX2FkZGVuZDsKLQkJICB9Ci0JCXdoaWxlIChyZWwrMSA8IHJlbGVuZCAmJgotCQkgICAgICAgRUxGNjRfUl9UWVBFIChyZWxbMV0ucl9pbmZvKSA9PSBSX0FMUEhBX0xJVFVTRSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBObyBMSVRVU0VzIC0tIHByZXN1bWFibHkgdGhlIGFkZHJlc3MgaXMgbm90IGJlaW5nCi0JCSAgIGxvYWRlZCBmb3Igbm90aGluZy4gICovCi0JCWZsYWdzID0gQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSOwotCSAgICAgIH0KLQotCSAgICBnb3RlbnQtPmZsYWdzIHw9IGZsYWdzOwotCSAgICBpZiAoaCkKLQkgICAgICB7Ci0JCS8qIE1ha2UgYSBndWVzcyBhcyB0byB3aGV0aGVyIGEgLnBsdCBlbnRyeSB3aWxsIGJlIG5lZWRlZC4gICovCi0JCWlmICgoaC0+ZmxhZ3MgfD0gZmxhZ3MpID09IEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQykKLQkJICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JCWVsc2UKLQkJICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgICAgIH0KLQkgIH0KLQkgIC8qIEZBTExUSFJVICovCi0KLQljYXNlIFJfQUxQSEFfR1BESVNQOgotCWNhc2UgUl9BTFBIQV9HUFJFTDMyOgotCWNhc2UgUl9BTFBIQV9HUFJFTEhJR0g6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMTE9XOgotCSAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoZSAuZ290IGhlcmUsIGJ1dCB0aGUgc2VjdGlvbnMgbXVzdAotCSAgICAgYmUgY3JlYXRlZCBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCSAgICAgc2VjdGlvbnMuICAqLwotCSAgaWYgKCFnb3RfY3JlYXRlZCkKLQkgICAgewotCSAgICAgIGlmICghZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoZSBvYmplY3QncyBnb3RvYmogaXMgc2V0IHRvIGl0c2VsZiBzbwotCQkgdGhhdCB3ZSBkZWZhdWx0IHRvIGV2ZXJ5IG9iamVjdCB3aXRoIGl0cyBvd24gLmdvdC4KLQkJIFdlJ2xsIG1lcmdlIC5nb3RzIGxhdGVyIG9uY2Ugd2UndmUgY29sbGVjdGVkIGVhY2gKLQkJIG9iamVjdCdzIGluZm8uICAqLwotCSAgICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+Z290b2JqID0gYWJmZDsKLQotCSAgICAgIGdvdF9jcmVhdGVkID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQUxQSEFfU1JFTDE2OgotCWNhc2UgUl9BTFBIQV9TUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX1NSRUw2NDoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgUl9BTFBIQV9SRUZMT05HOgotCWNhc2UgUl9BTFBIQV9SRUZRVUFEOgotCSAgaWYgKHJlbF9zZWNfbmFtZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcmVsX3NlY19uYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgICAgIChhYmZkLCBlbGZfZWxmaGVhZGVyKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JICAgICAgaWYgKHJlbF9zZWNfbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChyZWxfc2VjX25hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkgICAgIHJlbF9zZWNfbmFtZSs1KSA9PSAwKTsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc2VjdGlvbiBoZXJlIG5vdyB3aGV0aGVyIHdlIGV2ZW50dWFsbHkKLQkgICAgIHVzZSBpdCBvciBub3Qgc28gdGhhdCBpdCBnZXRzIG1hcHBlZCB0byBhbiBvdXRwdXQgc2VjdGlvbiBieQotCSAgICAgdGhlIGxpbmtlci4gIElmIG5vdCB1c2VkLCB3ZSdsbCBraWxsIGl0IGluCi0JICAgICBzaXplX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgcmVsX3NlY19uYW1lKTsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIHJlbF9zZWNfbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLAotCQkJCQkJIChTRUNfQUxMT0N8U0VDX0xPQUQKLQkJCQkJCSAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMykpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCkKLQkgICAgewotCSAgICAgIC8qIFNpbmNlIHdlIGhhdm4ndCBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgc3ltYm9scyB5ZXQsIHdlCi0JCSBkb24ndCBrbm93IHdoZXRoZXIgd2UnbGwgYWN0dWFsbHkgbmVlZCBhIGR5bmFtaWMgcmVsb2NhdGlvbgotCQkgZW50cnkgZm9yIHRoaXMgcmVsb2MuICBTbyBtYWtlIGEgcmVjb3JkIG9mIGl0LiAgT25jZSB3ZQotCQkgZmluZCBvdXQgaWYgdGhpcyB0aGluZyBuZWVkcyBkeW5hbWljIHJlbG9jYXRpb24gd2UnbGwKLQkJIGV4cGFuZCB0aGUgcmVsb2NhdGlvbiBzZWN0aW9ucyBieSB0aGUgYXBwcm9wcmlhdGUgYW1vdW50LiAqLwotCi0JICAgICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqcmVudDsKLQotCSAgICAgIGZvciAocmVudCA9IGgtPnJlbG9jX2VudHJpZXM7IHJlbnQ7IHJlbnQgPSByZW50LT5uZXh0KQotCQlpZiAocmVudC0+cnR5cGUgPT0gcl90eXBlICYmIHJlbnQtPnNyZWwgPT0gc3JlbG9jKQotCQkgIGJyZWFrOwotCi0JICAgICAgaWYgKCFyZW50KQotCQl7Ci0JCSAgcmVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqKQotCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkpKSk7Ci0JCSAgaWYgKCFyZW50KQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgcmVudC0+c3JlbCA9IHNyZWxvYzsKLQkJICByZW50LT5ydHlwZSA9IHJfdHlwZTsKLQkJICByZW50LT5jb3VudCA9IDE7Ci0KLQkJICByZW50LT5uZXh0ID0gaC0+cmVsb2NfZW50cmllczsKLQkJICBoLT5yZWxvY19lbnRyaWVzID0gcmVudDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVudC0+Y291bnQrKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgLyogSWYgdGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBuZWVkIGEgUkVMQVRJVkUgcmVsb2MuICAqLwotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICphaDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICBhaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWg7Ci0KLSAgLyogTm93IHRoYXQgd2UndmUgc2VlbiBhbGwgb2YgdGhlIGlucHV0IHN5bWJvbHMsIGZpbmFsaXplIG91ciBkZWNpc2lvbgotICAgICBhYm91dCB3aGV0aGVyIHRoaXMgc3ltYm9sIHNob3VsZCBnZXQgYSAucGx0IGVudHJ5LiAgKi8KLQotICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0gICAgICAmJiBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoaCwgaW5mbykKLSAgICAgICYmICgoaC0+dHlwZSA9PSBTVFRfRlVOQwotCSAgICYmICEoYWgtPmZsYWdzICYgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSKSkKLQkgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKLQkgICAgICAmJiBhaC0+ZmxhZ3MgPT0gQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DKSkKLSAgICAgIC8qIERvbid0IHByZXZlbnQgb3RoZXJ3aXNlIHZhbGlkIHByb2dyYW1zIGZyb20gbGlua2luZyBieSBhdHRlbXB0aW5nCi0JIHRvIGNyZWF0ZSBhIG5ldyAuZ290IGVudHJ5IHNvbWV3aGVyZS4gIEEgQ29ycmVjdCBTb2x1dGlvbiB3b3VsZCBiZQotCSB0byBhZGQgYSBuZXcgLmdvdCBzZWN0aW9uIHRvIGEgbmV3IG9iamVjdCBmaWxlIGFuZCBsZXQgaXQgYmUgbWVyZ2VkCi0JIHNvbWV3aGVyZSBsYXRlci4gIEJ1dCBmb3Igbm93IGRvbid0IGJvdGhlci4gICovCi0gICAgICAmJiBhaC0+Z290X2VudHJpZXMpCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIGlmICghcyAmJiAhZWxmNjRfYWxwaGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGR5bm9iaiwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgZmlyc3QgYml0IG9mIHRoZSAucGx0IGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSBQTFRfSEVBREVSX1NJWkU7Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlIG5vdAotCSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhlIGxvY2F0aW9uCi0JIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uIHBvaW50ZXJzIGNvbXBhcmUKLQkgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT5wbHQub2Zmc2V0OwotCX0KLQotICAgICAgLyogV2UgYWxzbyBuZWVkIGEgSk1QX1NMT1QgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICBUaGUgQWxwaGEsIHNpbmNlIGl0IHVzZXMgLmdvdCBlbnRyaWVzIGZvciBhbGwKLSAgICAgc3ltYm9scyBldmVuIGluIHJlZ3VsYXIgb2JqZWN0cywgZG9lcyBub3QgbmVlZCB0aGUgaGFja2VyeSBvZiBhCi0gICAgIC5keW5ic3Mgc2VjdGlvbiBhbmQgQ09QWSBkeW5hbWljIHJlbG9jYXRpb25zLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3ltYm9sIHZlcnNpb25pbmcgY2FuIGNyZWF0ZSBuZXcgc3ltYm9scywgYW5kIG1ha2Ugb3VyIG9sZCBzeW1ib2xzCi0gICBpbmRpcmVjdCB0byB0aGUgbmV3IG9uZXMuICBDb25zb2xpZGF0ZSB0aGUgZ290IGFuZCByZWxvYyBpbmZvcm1hdGlvbgotICAgaW4gdGhlc2Ugc2l0dWF0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9tZXJnZV9pbmRfc3ltYm9scyAoaGksIGR1bW15KQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGk7Ci0gICAgIFBUUiBkdW1teTsKLXsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmhzOwotCi0gIGlmIChoaS0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaHMgPSBoaTsKLSAgZG8gewotICAgIGhzID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaHMtPnJvb3Qucm9vdC51LmkubGluazsKLSAgfSB3aGlsZSAoaHMtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpOwotCi0gIC8qIE1lcmdlIHRoZSBmbGFncy4gIFdoZWUuICAqLwotCi0gIGhzLT5mbGFncyB8PSBoaS0+ZmxhZ3M7Ci0KLSAgLyogTWVyZ2UgdGhlIC5nb3QgZW50cmllcy4gIENhbm5pYmFsaXplIHRoZSBvbGQgc3ltYm9sJ3MgbGlzdCBpbgotICAgICBkb2luZyBzbywgc2luY2Ugd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlLiAgKi8KLQotICBpZiAoaHMtPmdvdF9lbnRyaWVzID09IE5VTEwpCi0gICAgaHMtPmdvdF9lbnRyaWVzID0gaGktPmdvdF9lbnRyaWVzOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdpLCAqZ3MsICpnaW4sICpnc2g7Ci0KLSAgICAgIGdzaCA9IGhzLT5nb3RfZW50cmllczsKLSAgICAgIGZvciAoZ2kgPSBoaS0+Z290X2VudHJpZXM7IGdpIDsgZ2kgPSBnaW4pCi0JewotCSAgZ2luID0gZ2ktPm5leHQ7Ci0JICBmb3IgKGdzID0gZ3NoOyBncyA7IGdzID0gZ3MtPm5leHQpCi0JICAgIGlmIChnaS0+Z290b2JqID09IGdzLT5nb3RvYmogJiYgZ2ktPmFkZGVuZCA9PSBncy0+YWRkZW5kKQotCSAgICAgIGdvdG8gZ290X2ZvdW5kOwotCSAgZ2ktPm5leHQgPSBocy0+Z290X2VudHJpZXM7Ci0JICBocy0+Z290X2VudHJpZXMgPSBnaTsKLQlnb3RfZm91bmQ6OwotCX0KLSAgICB9Ci0gIGhpLT5nb3RfZW50cmllcyA9IE5VTEw7Ci0KLSAgLyogQW5kIHNpbWlsYXIgZm9yIHRoZSByZWxvYyBlbnRyaWVzLiAgKi8KLQotICBpZiAoaHMtPnJlbG9jX2VudHJpZXMgPT0gTlVMTCkKLSAgICBocy0+cmVsb2NfZW50cmllcyA9IGhpLT5yZWxvY19lbnRyaWVzOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqcmksICpycywgKnJpbiwgKnJzaDsKLQotICAgICAgcnNoID0gaHMtPnJlbG9jX2VudHJpZXM7Ci0gICAgICBmb3IgKHJpID0gaGktPnJlbG9jX2VudHJpZXM7IHJpIDsgcmkgPSByaW4pCi0JewotCSAgcmluID0gcmktPm5leHQ7Ci0JICBmb3IgKHJzID0gcnNoOyBycyA7IHJzID0gcnMtPm5leHQpCi0JICAgIGlmIChyaS0+cnR5cGUgPT0gcnMtPnJ0eXBlKQotCSAgICAgIHsKLQkJcnMtPmNvdW50ICs9IHJpLT5jb3VudDsKLQkJZ290byBmb3VuZF9yZWxvYzsKLQkgICAgICB9Ci0JICByaS0+bmV4dCA9IGhzLT5yZWxvY19lbnRyaWVzOwotCSAgaHMtPnJlbG9jX2VudHJpZXMgPSByaTsKLQlmb3VuZF9yZWxvYzo7Ci0JfQotICAgIH0KLSAgaGktPnJlbG9jX2VudHJpZXMgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJcyBpdCBwb3NzaWJsZSB0byBtZXJnZSB0d28gb2JqZWN0IGZpbGUncyAuZ290IHRhYmxlcz8gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cyAoYSwgYikKLSAgICAgYmZkICphLCAqYjsKLXsKLSAgaW50IHRvdGFsID0gYWxwaGFfZWxmX3RkYXRhIChhKS0+dG90YWxfZ290X2VudHJpZXM7Ci0gIGJmZCAqYnN1YjsKLQotICAvKiBUcml2aWFsIHF1aWNrIGZhbGxvdXQgdGVzdC4gICovCi0gIGlmICh0b3RhbCArIGFscGhhX2VsZl90ZGF0YSAoYiktPnRvdGFsX2dvdF9lbnRyaWVzIDw9IE1BWF9HT1RfRU5UUklFUykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBCeSB0aGVpciBuYXR1cmUsIGxvY2FsIC5nb3QgZW50cmllcyBjYW5ub3QgYmUgbWVyZ2VkLiAgKi8KLSAgaWYgKCh0b3RhbCArPSBhbHBoYV9lbGZfdGRhdGEgKGIpLT5uX2xvY2FsX2dvdF9lbnRyaWVzKSA+IE1BWF9HT1RfRU5UUklFUykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmFpbGluZyB0aGUgY29tbW9uIHRyaXZpYWwgY29tcGFyaXNvbiwgd2UgbXVzdCBlZmZlY3RpdmVseQotICAgICBwZXJmb3JtIHRoZSBtZXJnZS4gIE5vdCBhY3R1YWxseSBwZXJmb3JtaW5nIHRoZSBtZXJnZSBtZWFucyB0aGF0Ci0gICAgIHdlIGRvbid0IGhhdmUgdG8gc3RvcmUgdW5kbyBpbmZvcm1hdGlvbiBpbiBjYXNlIHdlIGZhaWwuICAqLwotICBmb3IgKGJzdWIgPSBiOyBic3ViIDsgYnN1YiA9IGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmluX2dvdF9saW5rX25leHQpCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKipoYXNoZXMgPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyAoYnN1Yik7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGJzdWIpLT5zeW10YWJfaGRyOwotICAgICAgaW50IGksIG47Ci0KLSAgICAgIG4gPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc3ltdGFiX2hkci0+c2hfZW50c2l6ZSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCXsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICphZSwgKmJlOwotCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSBoYXNoZXNbaV07Ci0JICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSAgICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgZm9yIChiZSA9IGgtPmdvdF9lbnRyaWVzOyBiZSA7IGJlID0gYmUtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoYmUtPnVzZV9jb3VudCA9PSAwKQotCSAgICAgICAgY29udGludWU7Ci0JICAgICAgaWYgKGJlLT5nb3RvYmogIT0gYikKLQkgICAgICAgIGNvbnRpbnVlOwotCi0JICAgICAgZm9yIChhZSA9IGgtPmdvdF9lbnRyaWVzOyBhZSA7IGFlID0gYWUtPm5leHQpCi0JICAgICAgICBpZiAoYWUtPmdvdG9iaiA9PSBhICYmIGFlLT5hZGRlbmQgPT0gYmUtPmFkZGVuZCkKLQkJICBnb3RvIGdsb2JhbF9mb3VuZDsKLQotCSAgICAgIGlmICgrK3RvdGFsID4gTUFYX0dPVF9FTlRSSUVTKQotCSAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBnbG9iYWxfZm91bmQ6OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWN0dWFsbHkgbWVyZ2UgdHdvIC5nb3QgdGFibGVzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjY0X2FscGhhX21lcmdlX2dvdHMgKGEsIGIpCi0gICAgIGJmZCAqYSwgKmI7Ci17Ci0gIGludCB0b3RhbCA9IGFscGhhX2VsZl90ZGF0YSAoYSktPnRvdGFsX2dvdF9lbnRyaWVzOwotICBiZmQgKmJzdWI7Ci0KLSAgLyogUmVtZW1iZXIgbG9jYWwgZXhwYW5zaW9uLiAgKi8KLSAgewotICAgIGludCBlID0gYWxwaGFfZWxmX3RkYXRhIChiKS0+bl9sb2NhbF9nb3RfZW50cmllczsKLSAgICB0b3RhbCArPSBlOwotICAgIGFscGhhX2VsZl90ZGF0YSAoYSktPm5fbG9jYWxfZ290X2VudHJpZXMgKz0gZTsKLSAgfQotCi0gIGZvciAoYnN1YiA9IGI7IGJzdWIgOyBic3ViID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKmxvY2FsX2dvdF9lbnRyaWVzOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKipoYXNoZXM7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgICAgIGludCBpLCBuOwotCi0gICAgICAvKiBMZXQgdGhlIGxvY2FsIC5nb3QgZW50cmllcyBrbm93IHRoZXkgYXJlIHBhcnQgb2YgYSBuZXcgc3Vic2VnbWVudC4gICovCi0gICAgICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmxvY2FsX2dvdF9lbnRyaWVzOwotICAgICAgaWYgKGxvY2FsX2dvdF9lbnRyaWVzKQotICAgICAgICB7Ci0JICBuID0gZWxmX3RkYXRhIChic3ViKS0+c3ltdGFiX2hkci5zaF9pbmZvOwotCSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKLQkgICAgewotCSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICplbnQ7Ci0JICAgICAgZm9yIChlbnQgPSBsb2NhbF9nb3RfZW50cmllc1tpXTsgZW50OyBlbnQgPSBlbnQtPm5leHQpCi0JICAgICAgICBlbnQtPmdvdG9iaiA9IGE7Ci0JICAgIH0KLSAgICAgICAgfQotCi0gICAgICAvKiBNZXJnZSB0aGUgZ2xvYmFsIC5nb3QgZW50cmllcy4gICovCi0gICAgICBoYXNoZXMgPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyAoYnN1Yik7Ci0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYnN1YiktPnN5bXRhYl9oZHI7Ci0KLSAgICAgIG4gPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc3ltdGFiX2hkci0+c2hfZW50c2l6ZSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotICAgICAgICB7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqYWUsICpiZSwgKipwYmUsICoqc3RhcnQ7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGhhc2hlc1tpXTsKLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBzdGFydCA9ICZoLT5nb3RfZW50cmllczsKLQkgIGZvciAocGJlID0gc3RhcnQsIGJlID0gKnN0YXJ0OyBiZSA7IHBiZSA9ICZiZS0+bmV4dCwgYmUgPSBiZS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChiZS0+dXNlX2NvdW50ID09IDApCi0JICAgICAgICB7Ci0JCSAgKnBiZSA9IGJlLT5uZXh0OwotCQkgIGNvbnRpbnVlOwotCSAgICAgICAgfQotCSAgICAgIGlmIChiZS0+Z290b2JqICE9IGIpCi0JICAgICAgICBjb250aW51ZTsKLQotCSAgICAgIGZvciAoYWUgPSAqc3RhcnQ7IGFlIDsgYWUgPSBhZS0+bmV4dCkKLQkgICAgICAgIGlmIChhZS0+Z290b2JqID09IGEgJiYgYWUtPmFkZGVuZCA9PSBiZS0+YWRkZW5kKQotCQkgIHsKLQkJICAgIGFlLT5mbGFncyB8PSBiZS0+ZmxhZ3M7Ci0JCSAgICBhZS0+dXNlX2NvdW50ICs9IGJlLT51c2VfY291bnQ7Ci0JCSAgICAqcGJlID0gYmUtPm5leHQ7Ci0JCSAgICBnb3RvIGdsb2JhbF9mb3VuZDsKLQkJICB9Ci0JICAgICAgYmUtPmdvdG9iaiA9IGE7Ci0JICAgICAgdG90YWwgKz0gMTsKLQotCSAgICBnbG9iYWxfZm91bmQ6OwotCSAgICB9Ci0gICAgICAgIH0KLQotICAgICAgYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+Z290b2JqID0gYTsKLSAgICB9Ci0gIGFscGhhX2VsZl90ZGF0YSAoYSktPnRvdGFsX2dvdF9lbnRyaWVzID0gdG90YWw7Ci0KLSAgLyogTWVyZ2UgdGhlIHR3byBpbl9nb3QgY2hhaW5zLiAgKi8KLSAgewotICAgIGJmZCAqbmV4dDsKLQotICAgIGJzdWIgPSBhOwotICAgIHdoaWxlICgobmV4dCA9IGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmluX2dvdF9saW5rX25leHQpICE9IE5VTEwpCi0gICAgICBic3ViID0gbmV4dDsKLQotICAgIGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmluX2dvdF9saW5rX25leHQgPSBiOwotICB9Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0cyBmb3IgdGhlIGdvdCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbCAoaCwgYXJnKQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGFyZzsKLXsKLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQotICBmb3IgKGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOyBnb3RlbnQ7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLSAgICBpZiAoZ290ZW50LT51c2VfY291bnQgPiAwKQotICAgICAgewotCWJmZF9zaXplX3R5cGUgKnBsZ2UKLQkgID0gJmFscGhhX2VsZl90ZGF0YSAoZ290ZW50LT5nb3RvYmopLT5nb3QtPl9yYXdfc2l6ZTsKLQotCWdvdGVudC0+Z290X29mZnNldCA9ICpwbGdlOwotCSpwbGdlICs9IDg7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzIChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICppLCAqZ290X2xpc3QgPSBhbHBoYV9lbGZfaGFzaF90YWJsZShpbmZvKS0+Z290X2xpc3Q7Ci0KLSAgLyogRmlyc3QsIHplcm8gb3V0IHRoZSAuZ290IHNpemVzLCBhcyB3ZSBtYXkgYmUgcmVjYWxjdWxhdGluZyB0aGUKLSAgICAgLmdvdCBhZnRlciBvcHRpbWl6aW5nIGl0LiAgKi8KLSAgZm9yIChpID0gZ290X2xpc3Q7IGkgOyBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotICAgIGFscGhhX2VsZl90ZGF0YShpKS0+Z290LT5fcmF3X3NpemUgPSAwOwotCi0gIC8qIE5leHQsIGZpbGwgaW4gdGhlIG9mZnNldHMgZm9yIGFsbCB0aGUgZ2xvYmFsIGVudHJpZXMuICAqLwotICBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlIChhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sLAotCQkJCU5VTEwpOwotCi0gIC8qIEZpbmFsbHksIGZpbGwgaW4gdGhlIG9mZnNldHMgZm9yIHRoZSBsb2NhbCBlbnRyaWVzLiAgKi8KLSAgZm9yIChpID0gZ290X2xpc3Q7IGkgOyBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgZ290X29mZnNldCA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290LT5fcmF3X3NpemU7Ci0gICAgICBiZmQgKmo7Ci0KLSAgICAgIGZvciAoaiA9IGk7IGogOyBqID0gYWxwaGFfZWxmX3RkYXRhKGopLT5pbl9nb3RfbGlua19uZXh0KQotCXsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXMsICpnb3RlbnQ7Ci0JICBpbnQgaywgbjsKLQotCSAgbG9jYWxfZ290X2VudHJpZXMgPSBhbHBoYV9lbGZfdGRhdGEoaiktPmxvY2FsX2dvdF9lbnRyaWVzOwotCSAgaWYgKCFsb2NhbF9nb3RfZW50cmllcykKLQkgICAgY29udGludWU7Ci0KLQkgIGZvciAoayA9IDAsIG4gPSBlbGZfdGRhdGEoaiktPnN5bXRhYl9oZHIuc2hfaW5mbzsgayA8IG47ICsraykKLQkgICAgZm9yIChnb3RlbnQgPSBsb2NhbF9nb3RfZW50cmllc1trXTsgZ290ZW50OyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JICAgICAgaWYgKGdvdGVudC0+dXNlX2NvdW50ID4gMCkKLQkgICAgICAgIHsKLQkJICBnb3RlbnQtPmdvdF9vZmZzZXQgPSBnb3Rfb2Zmc2V0OwotCQkgIGdvdF9vZmZzZXQgKz0gODsKLQkgICAgICAgIH0KLQl9Ci0KLSAgICAgIGFscGhhX2VsZl90ZGF0YShpKS0+Z290LT5fcmF3X3NpemUgPSBnb3Rfb2Zmc2V0OwotICAgICAgYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9jb29rZWRfc2l6ZSA9IGdvdF9vZmZzZXQ7Ci0gICAgfQotfQotCi0vKiBDb25zdHJ1Y3RzIHRoZSBnb3RzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmksICpnb3RfbGlzdCwgKmN1cl9nb3Rfb2JqOwotICBpbnQgc29tZXRoaW5nX2NoYW5nZWQgPSAwOwotCi0gIGdvdF9saXN0ID0gYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbGlzdDsKLQotICAvKiBPbiB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLCBwcmV0ZW5kIHdlIGhhdmUgYW4gZXhpc3RpbmcgZ290IGxpc3QKLSAgICAgY29uc2lzdGluZyBvZiBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgaWYgKGdvdF9saXN0ID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gaW5mby0+aW5wdXRfYmZkczsgaSA7IGkgPSBpLT5saW5rX25leHQpCi0JewotCSAgYmZkICp0aGlzX2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoaSktPmdvdG9iajsKLQkgIGlmICh0aGlzX2dvdCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgYXJlIGFzc3VtaW5nIG5vIG1lcmdpbmcgaGFzIHlldCBvY3VycmVkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKHRoaXNfZ290ID09IGkpOwotCi0gICAgICAgICAgaWYgKGFscGhhX2VsZl90ZGF0YSAodGhpc19nb3QpLT50b3RhbF9nb3RfZW50cmllcyA+IE1BWF9HT1RfRU5UUklFUykKLQkgICAgewotCSAgICAgIC8qIFlpa2VzISBBIHNpbmdsZSBvYmplY3QgZmlsZSBoYXMgdG9vIG1hbnkgZW50cmllcy4gICovCi0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgICAoXygiJXM6IC5nb3Qgc3Vic2VnbWVudCBleGNlZWRzIDY0SyAoc2l6ZSAlZCkiKSwKLQkgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpKSwKLQkgICAgICAgICBhbHBoYV9lbGZfdGRhdGEgKHRoaXNfZ290KS0+dG90YWxfZ290X2VudHJpZXMgKiA4KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGdvdF9saXN0ID09IE5VTEwpCi0JICAgIGdvdF9saXN0ID0gdGhpc19nb3Q7Ci0JICBlbHNlCi0JICAgIGFscGhhX2VsZl90ZGF0YShjdXJfZ290X29iaiktPmdvdF9saW5rX25leHQgPSB0aGlzX2dvdDsKLQkgIGN1cl9nb3Rfb2JqID0gdGhpc19nb3Q7Ci0JfQotCi0gICAgICAvKiBTdHJhbmdlIGRlZ2VuZXJhdGUgY2FzZSBvZiBubyBnb3QgcmVmZXJlbmNlcy4gICovCi0gICAgICBpZiAoZ290X2xpc3QgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbGlzdCA9IGdvdF9saXN0OwotCi0gICAgICAvKiBGb3JjZSBnb3Qgb2Zmc2V0cyB0byBiZSByZWNhbGN1bGF0ZWQuICAqLwotICAgICAgc29tZXRoaW5nX2NoYW5nZWQgPSAxOwotICAgIH0KLQotICBjdXJfZ290X29iaiA9IGdvdF9saXN0OwotICBpID0gYWxwaGFfZWxmX3RkYXRhKGN1cl9nb3Rfb2JqKS0+Z290X2xpbmtfbmV4dDsKLSAgd2hpbGUgKGkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMgKGN1cl9nb3Rfb2JqLCBpKSkKLQl7Ci0JICBlbGY2NF9hbHBoYV9tZXJnZV9nb3RzIChjdXJfZ290X29iaiwgaSk7Ci0JICBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0OwotCSAgYWxwaGFfZWxmX3RkYXRhKGN1cl9nb3Rfb2JqKS0+Z290X2xpbmtfbmV4dCA9IGk7Ci0JICBzb21ldGhpbmdfY2hhbmdlZCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1cl9nb3Rfb2JqID0gaTsKLQkgIGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQ7Ci0JfQotICAgIH0KLQotICAvKiBPbmNlIHRoZSBnb3RzIGhhdmUgYmVlbiBtZXJnZWQsIGZpbGwgaW4gdGhlIGdvdCBvZmZzZXRzIGZvcgotICAgICBldmVyeXRoaW5nIHRoZXJlaW4uICAqLwotICBpZiAoMSB8fCBzb21ldGhpbmdfY2hhbmdlZCkKLSAgICBlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzIChpbmZvKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCwgdGFrZSBjYXJlIG9mIHRoZSBpbmRpcmVjdCBzeW1ib2xzIGNyZWF0ZWQgYnkgdmVyc2lvbmluZy4gICovCi0gIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQllbGY2NF9hbHBoYV9tZXJnZV9pbmRfc3ltYm9scywKLQkJCQlOVUxMKTsKLQotICBpZiAoIWVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCBvZiB0aGUgLmdvdCBzdWJzZWN0aW9ucy4gICovCi0gIGkgPSBhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9saXN0OwotICBmb3IgKCA7IGkgOyBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3Q7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID4gMCkKLQl7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChpLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXb3JrIG91dCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzIChoLCBpbmZvKQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIC8qIElmIHRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYXMgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QKLSAgICAgZmlsZSwgYW5kIHRoZXJlIHdhcyBubyBkZWZpbml0aW9uIGluIGFueSBkeW5hbWljIG9iamVjdCwgdGhlbiB0aGUKLSAgICAgbGlua2VyIHdpbGwgaGF2ZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZSBzeW1ib2wgaW4gYSBjb21tb24KLSAgICAgc2VjdGlvbiBidXQgdGhlIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIgZmxhZyB3aWxsIG5vdCBoYXZlIGJlZW4KLSAgICAgc2V0LiAgVGhpcyBpcyBkb25lIGZvciBkeW5hbWljIHN5bWJvbHMgaW4KLSAgICAgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCBidXQgdGhpcyBpcyBub3QgZG9uZSBmb3Igbm9uLWR5bmFtaWMKLSAgICAgc3ltYm9scywgc29tZWhvdy4gICovCi0gIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncwotICAgICAgICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIKLQkgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCSAgfCBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSkKLSAgICAgICA9PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKQotICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgIShoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykpCi0gICAgewotICAgICAgaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgZHluYW1pYywgd2UnbGwgbmVlZCBhbGwgdGhlIHJlbG9jYXRpb25zIGluIHRoZWlyCi0gICAgIG5hdHVyYWwgZm9ybS4gIElmIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCBhbmQgaXQgaGFzIGJlZW4gZm9yY2VkCi0gICAgIGxvY2FsLCB3ZSdsbCBuZWVkIHRoZSBzYW1lIG51bWJlciBvZiBSRUxBVElWRSByZWxvY2F0aW9ucy4gICovCi0KLSAgaWYgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgaW5mbykgfHwgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKnJlbGVudDsKLSAgICAgIGJmZCAqZHlub2JqOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLSAgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgZm9yIChyZWxlbnQgPSBoLT5yZWxvY19lbnRyaWVzOyByZWxlbnQ7IHJlbGVudCA9IHJlbGVudC0+bmV4dCkKLQlpZiAocmVsZW50LT5ydHlwZSA9PSBSX0FMUEhBX1JFRkxPTkcKLQkgICAgfHwgcmVsZW50LT5ydHlwZSA9PSBSX0FMUEhBX1JFRlFVQUQpCi0JICB7Ci0JICAgIHJlbGVudC0+c3JlbC0+X3Jhd19zaXplICs9Ci0JICAgICAgc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogcmVsZW50LT5jb3VudDsKLQkgIH0KLQotICAgICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgICAgIGNvdW50ID0gMDsKLQotICAgICAgZm9yIChnb3RlbnQgPSBoLT5nb3RfZW50cmllczsgZ290ZW50IDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCWNvdW50Kys7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSB1c2luZyBhIC5wbHQgZW50cnksIHN1YnRyYWN0IG9uZSwgYXMgdGhlIGZpcnN0Ci0JIHJlZmVyZW5jZSB1c2VzIGEgLnJlbGEucGx0IGVudHJ5IGluc3RlYWQuICAqLwotICAgICAgaWYgKGgtPnJvb3QucGx0Lm9mZnNldCAhPSBNSU5VU19PTkUpCi0JY291bnQtLTsKLQotICAgICAgaWYgKGNvdW50ID4gMCkKLQl7Ci0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpICogY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBib29sZWFuIHJlbHBsdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoIWluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLQotICAgICAgLyogTm93IHRoYXQgd2UndmUgc2VlbiBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCB3ZSBjYW4gZGVjaWRlIHdoaWNoCi0JIHN5bWJvbHMgbmVlZCBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBhbmQgd2hpY2ggZG9uJ3QuICBXZSd2ZQotCSBjb2xsZWN0ZWQgaW5mb3JtYXRpb24gaW4gY2hlY2tfcmVsb2NzIHRoYXQgd2UgY2FuIG5vdyBhcHBseSB0bwotCSBzaXplIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gc2VjdGlvbnMuICAqLwotICAgICAgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICBlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcywKLQkJCQkgICAgaW5mbyk7Ci0KLSAgICAgIC8qIFdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcywgZWFjaCBsb2NhbCAuZ290IGVudHJ5IG5lZWRzIGEKLQkgUkVMQVRJVkUgcmVsb2MuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQl7Ci0JICBiZmQgKmk7Ci0JICBhc2VjdGlvbiAqc3JlbDsKLQkgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0KLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0JICBmb3IgKGkgPSBhbHBoYV9lbGZfaGFzaF90YWJsZShpbmZvKS0+Z290X2xpc3QsIGNvdW50ID0gMDsKLQkgICAgICAgaSAhPSBOVUxMOwotCSAgICAgICBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotCSAgICBjb3VudCArPSBhbHBoYV9lbGZfdGRhdGEoaSktPm5fbG9jYWxfZ290X2VudHJpZXM7Ci0KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBjb3VudCAqIHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQl9Ci0gICAgfQotICAvKiBlbHNlIHdlJ3JlIG5vdCBkeW5hbWljIGFuZCBieSBkZWZpbml0aW9uIHdlIGRvbid0IG5lZWQgc3VjaCB0aGluZ3MuICAqLwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICByZWxwbHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlIG91dHB1dCBmaWxlLgotCSBUaGlzIGlzIHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kIC5yZWxhLnBsdC4gIFdlIG11c3QgY3JlYXRlIGl0Ci0JIGluIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZCBiZWZvcmUKLQkgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucy4gIFRoZQotCSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQKLQkgaXQgaXMgdGhhdCBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8KLQkgZ28gaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIHN0cmlwID0gKHMtPl9yYXdfc2l6ZSA9PSAwKTsKLQotCSAgaWYgKCFzdHJpcCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJcmVsdGV4dCA9IHRydWU7Ci0KLQkgICAgICBpZiAoc3RyY21wKG5hbWUsICIucmVsYS5wbHQiKSA9PSAwKQotCQlyZWxwbHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgZHluYW1pYyBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQkgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgotICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2gKLSAgICAgbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZSBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0gICAgIFRoYXQgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGV4IG9mIGV2ZXJ5Ci0gICAgIG90aGVyIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBsb25nIGNbMl0sIGk7Ci0gICAgICBhc2VjdGlvbiAqcDsKLQotICAgICAgY1swXSA9IDA7Ci0gICAgICBjWzFdID0gYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKTsKLQotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjWzFdOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUoaW5mbyksCi0JCQkgICAgICBlbGY2NF9hbHBoYV9hZGp1c3RfZHluaW5keCwKLQkJCSAgICAgIChQVFIpIGMpOwotCi0gICAgICBmb3IgKGkgPSAxLCBwID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgcCAhPSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0LCBpKyspCi0JewotCSAgZWxmX3NlY3Rpb25fZGF0YSAocCktPmR5bmluZHggPSBpOwotCSAgLyogVGhlc2Ugc3ltYm9scyB3aWxsIGhhdmUgbm8gbmFtZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLQkgICAgIGZpZGRsZSB3aXRoIGR5bnN0cl9pbmRleC4gICovCi0JfQotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCFiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgIHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5jcmVtZW50IHRoZSBpbmRleCBvZiBhIGR5bmFtaWMgc3ltYm9sIGJ5IGEgZ2l2ZW4gYW1vdW50LiAgQ2FsbGVkCi0gICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9hZGp1c3RfZHluaW5keCAoaCwgY3BhcmcpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgY3Bhcmc7Ci17Ci0gIGxvbmcgKmNwID0gKGxvbmcgKiljcGFyZzsKLQotICBpZiAoaC0+ZHluaW5keCA+PSBjcFswXSkKLSAgICBoLT5keW5pbmR4ICs9IGNwWzFdOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBBbHBoYSBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotICBhc2VjdGlvbiAqc2VjLCAqc2dvdCwgKnNyZWwsICpzcmVsZ290OwotICBiZmQgKmR5bm9iaiwgKmdvdG9iajsKLSAgYmZkX3ZtYSBncDsKLQotICBzcmVsZ290ID0gc3JlbCA9IE5VTEw7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaikKLSAgICB7Ci0gICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgIH0KLQotICAvKiBGaW5kIHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBpbnB1dCBiZmQuICAqLwotICBzZ290ID0gTlVMTDsKLSAgZ3AgPSAwOwotICBnb3RvYmogPSBhbHBoYV9lbGZfdGRhdGEgKGlucHV0X2JmZCktPmdvdG9iajsKLSAgaWYgKGdvdG9iaikKLSAgICB7Ci0gICAgICBzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChnb3RvYmopLT5nb3Q7Ci0gICAgICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChnb3RvYmopOwotICAgICAgaWYgKGdwID09IDApCi0JewotCSAgZ3AgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJKyAweDgwMDApOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKGdvdG9iaiwgZ3ApOwotCX0KLSAgICB9Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGNjRfUl9UWVBFKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX0FMUEhBX21heCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBob3d0byA9IGVsZjY0X2FscGhhX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICByX3N5bW5keCA9IEVMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCi0JICAvKiBUaGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBHUERJU1AgYW5kIExJVFVTRSBpcyAKLQkgICAgIGltbWF0ZXJpYWwuICBPbmx5IHRoZSBhZGRlbmQgaXMgc2lnbmlmaWNhbnQuICAqLwotCSAgaWYgKHJfdHlwZSA9PSBSX0FMUEhBX0dQRElTUCB8fCByX3R5cGUgPT0gUl9BTFBIQV9MSVRVU0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRShzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQotI2lmIHJ0aF9ub3RkZWYKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX0FMUEhBX0xJVEVSQUwKLQkJICAgJiYgZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAmJiAoIWluZm8tPnNoYXJlZAotCQkgICAgICAgfHwgIWluZm8tPnN5bWJvbGljCi0JCSAgICAgICB8fCAhKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCFpbmZvLT5zeW1ib2xpYwotCQkJICB8fCAhKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX0FMUEhBX1JFRkxPTkcKLQkJCSAgfHwgcl90eXBlID09IFJfQUxQSEFfUkVGUVVBRAotCQkJICB8fCByX3R5cGUgPT0gUl9BTFBIQV9MSVRFUkFMKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbiB2YWx1ZS4KLQkJICAgICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lIG9ic2N1cmUgY2FzZXMKLQkJICAgICBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLSNlbHNlCi0JICAgICAgLyogRklYTUU6IEFyZSBub3QgdGhlc2Ugb2JzY3VyZSBjYXNlcyBzaW1wbHkgYnVncz8gIExldCdzCi0JCSBnZXQgc29tZXRoaW5nIHdvcmtpbmcgYW5kIGNvbWUgYmFjayB0byB0aGlzLiAgKi8KLQkgICAgICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQlyZWxvY2F0aW9uID0gMDsKLSNlbmRpZiAvKiBydGhfbm90ZGVmICovCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX0FMUEhBX0dQRElTUDoKLQkgIHsKLQkgICAgYmZkX2J5dGUgKnBfbGRhaCwgKnBfbGRhOwotCi0JICAgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0KLQkgICAgcmVsb2NhdGlvbiA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHBfbGRhaCA9IGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcF9sZGEgPSBwX2xkYWggKyByZWwtPnJfYWRkZW5kOwotCi0JICAgIHIgPSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGlucHV0X2JmZCwgZ3AgLSByZWxvY2F0aW9uLAotCQkJCQkgICAgIHBfbGRhaCwgcF9sZGEpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQUxQSEFfT1BfUFVTSDoKLQljYXNlIFJfQUxQSEFfT1BfU1RPUkU6Ci0JY2FzZSBSX0FMUEhBX09QX1BTVUI6Ci0JY2FzZSBSX0FMUEhBX09QX1BSU0hJRlQ6Ci0JICAvKiBXZSBoYXRlIHRoZXNlIHNpbGx5IGJlYXN0cy4gICovCi0JICBhYm9ydCgpOwotCi0JY2FzZSBSX0FMUEhBX0xJVEVSQUw6Ci0JICB7Ci0JICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0JICAgIGJvb2xlYW4gZHluYW1pY19zeW1ib2w7Ci0KLQkgICAgQkZEX0FTU0VSVChzZ290ICE9IE5VTEwpOwotCSAgICBCRkRfQVNTRVJUKGdwICE9IDApOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCQlnb3RlbnQgPSBoLT5nb3RfZW50cmllczsKLQkJZHluYW1pY19zeW1ib2wgPSBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGluZm8pOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZ290ZW50ID0gKGFscGhhX2VsZl90ZGF0YShpbnB1dF9iZmQpLT4KLQkJCSAgbG9jYWxfZ290X2VudHJpZXNbcl9zeW1uZHhdKTsKLQkJZHluYW1pY19zeW1ib2wgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgQkZEX0FTU0VSVChnb3RlbnQgIT0gTlVMTCk7Ci0KLQkgICAgd2hpbGUgKGdvdGVudC0+Z290b2JqICE9IGdvdG9iaiB8fCBnb3RlbnQtPmFkZGVuZCAhPSBhZGRlbmQpCi0JICAgICAgZ290ZW50ID0gZ290ZW50LT5uZXh0OwotCi0JICAgIEJGRF9BU1NFUlQoZ290ZW50LT51c2VfY291bnQgPj0gMSk7Ci0KLQkgICAgLyogSW5pdGlhbGl6ZSB0aGUgLmdvdCBlbnRyeSdzIHZhbHVlLiAgKi8KLQkgICAgaWYgKCEoZ290ZW50LT5mbGFncyAmIEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkUpKQotCSAgICAgIHsKLQkJYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbithZGRlbmQsCi0JCQkgICAgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0JCS8qIElmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZm9yY2VkIGxvY2FsLCBvdXRwdXQgYQotCQkgICBSRUxBVElWRSByZWxvYywgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgaGFuZGxlZCBpbgotCQkgICBmaW5pc2hfZHluYW1pY19zeW1ib2wuICAqLwotCQlpZiAoaW5mby0+c2hhcmVkICYmICFkeW5hbWljX3N5bWJvbCkKLQkJICB7Ci0JCSAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgIEJGRF9BU1NFUlQoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkJICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7Ci0JCSAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0JCSAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgICAgICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCSAgICAgICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KyspOwotCQkgICAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpCi0JCQkJKiBzcmVsZ290LT5yZWxvY19jb3VudAotCQkJCTw9IHNyZWxnb3QtPl9jb29rZWRfc2l6ZSk7Ci0JCSAgfQotCi0JCWdvdGVudC0+ZmxhZ3MgfD0gQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORTsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIHRoZSBncHJlbCByZWxvY2F0aW9uLiAgKi8KLQkgICAgYWRkZW5kID0gMDsKLQkgICAgcmVsb2NhdGlvbiA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JICAgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICB9Ci0JICAvKiBvdmVyZmxvdyBoYW5kbGVkIGJ5IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAqLwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX0dQUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMTE9XOgotCSAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQkgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfR1BSRUxISUdIOgotCSAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQkgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICByZWxvY2F0aW9uICs9IGFkZGVuZDsKLQkgIGFkZGVuZCA9IDA7Ci0JICByZWxvY2F0aW9uID0gKCgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj4gMTYpCi0JCQkrICgocmVsb2NhdGlvbiA+PiAxNSkgJiAxKSk7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfQlJBRERSOgotCWNhc2UgUl9BTFBIQV9ISU5UOgotCSAgLyogVGhlIHJlZ3VsYXIgUEMtcmVsYXRpdmUgc3R1ZmYgbWVhc3VyZXMgZnJvbSB0aGUgc3RhcnQgb2YKLQkgICAgIHRoZSBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB0aGUgZW5kLiAgKi8KLQkgIGFkZGVuZCAtPSA0OwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX1JFRkxPTkc6Ci0JY2FzZSBSX0FMUEhBX1JFRlFVQUQ6Ci0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgYm9vbGVhbiBza2lwOwotCi0JICAgIC8qIENhcmVmdWwgaGVyZSB0byByZW1lbWJlciBSRUxBVElWRSByZWxvY2F0aW9ucyBmb3IgZ2xvYmFsCi0JICAgICAgIHZhcmlhYmxlcyBmb3Igc3ltYm9saWMgc2hhcmVkIG9iamVjdHMuICAqLwotCi0JICAgIGlmIChoICYmIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgaW5mbykpCi0JICAgICAgewotCQlCRkRfQVNTRVJUKGgtPnJvb3QuZHluaW5keCAhPSAtMSk7Ci0JCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oaC0+cm9vdC5keW5pbmR4LCByX3R5cGUpOwotCQlvdXRyZWwucl9hZGRlbmQgPSBhZGRlbmQ7Ci0JCWFkZGVuZCA9IDAsIHJlbG9jYXRpb24gPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaW5mby0+c2hhcmVkKQotCSAgICAgIHsKLQkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTygwLCBSX0FMUEhBX1JFTEFUSVZFKTsKLQkJb3V0cmVsLnJfYWRkZW5kID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQkgICAgaWYgKCFzcmVsKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQluYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCShpbnB1dF9iZmQsIGVsZl9lbGZoZWFkZXIoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSBlbGZfc2VjdGlvbl9kYXRhKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJQkZEX0FTU0VSVChuYW1lICE9IE5VTEwpOwotCi0JCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJQkZEX0FTU0VSVChzcmVsICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfdm1hIG9mZjsKLQotCQlvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCSAgICAgICAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCSZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJcmVsLT5yX29mZnNldCkpOwotCQlpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICBza2lwID0gdHJ1ZTsKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCSAgICAgIH0KLQotCSAgICBpZiAoISBza2lwKQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgZWxzZQotCSAgICAgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0KLQkgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCXNyZWwtPmNvbnRlbnRzKQotCQkJCSAgICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspOwotCSAgICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCQkJPD0gc3JlbC0+X2Nvb2tlZF9zaXplKTsKLQkgIH0KLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWRlZmF1bHQ6Ci0JZGVmYXVsdF9yZWxvYzoKLQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCByZWxvY2F0aW9uLAotCQkJCQlhZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHIpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICAgIH0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSBNSU5VU19PTkUpCi0gICAgewotICAgICAgLyogRmlsbCBpbiB0aGUgLnBsdCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgYXNlY3Rpb24gKnNwbHQsICpzZ290LCAqc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLSAgICAgIGJmZF92bWEgZ290X2FkZHIsIHBsdF9hZGRyOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgLyogVGhlIGZpcnN0IC5nb3QgZW50cnkgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSAucGx0IHdpdGggdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBmdW5jdGlvbi4gICovCi0gICAgICBnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5nb3RfZW50cmllczsKLSAgICAgIEJGRF9BU1NFUlQgKGdvdGVudCAmJiBnb3RlbnQtPmFkZGVuZCA9PSAwKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdDsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0KLSAgICAgIGdvdF9hZGRyID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0gICAgICBwbHRfYWRkciA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBoLT5wbHQub2Zmc2V0KTsKLQotICAgICAgcGx0X2luZGV4ID0gKGgtPnBsdC5vZmZzZXQgLSBQTFRfSEVBREVSX1NJWkUpIC8gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgaW5zbjEsIGluc24yLCBpbnNuMzsKLQotCWluc24xID0gUExUX0VOVFJZX1dPUkQxIHwgKCgtKGgtPnBsdC5vZmZzZXQgKyA0KSA+PiAyKSAmIDB4MWZmZmZmKTsKLQlpbnNuMiA9IFBMVF9FTlRSWV9XT1JEMjsKLQlpbnNuMyA9IFBMVF9FTlRSWV9XT1JEMzsKLQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24xLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQpOwotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24yLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA0KTsKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuMywgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgOCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0gICAgICBvdXRyZWwucl9vZmZzZXQgPSBnb3RfYWRkcjsKLSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oaC0+ZHluaW5keCwgUl9BTFBIQV9KTVBfU0xPVCk7Ci0gICAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKilzcmVsLT5jb250ZW50cwotCQkJCSAgKyBwbHRfaW5kZXgpKTsKLQotICAgICAgaWYgKCEoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4gdGhlCi0JICAgICAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJpZXMgaW4gdGhlIC5nb3QuICAqLwotICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcGx0X2FkZHIsIHNnb3QtPmNvbnRlbnRzICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogU3Vic2VxdWVudCAuZ290IGVudHJpZXMgd2lsbCBjb250aW51ZSB0byBib3VuY2UgdGhyb3VnaCB0aGUgLnBsdC4gICovCi0gICAgICBpZiAoZ290ZW50LT5uZXh0KQotCXsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICBCRkRfQVNTRVJUICghIGluZm8tPnNoYXJlZCB8fCBzcmVsICE9IE5VTEwpOwotCi0JICBnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgc2dvdCA9IGFscGhhX2VsZl90ZGF0YShnb3RlbnQtPmdvdG9iaiktPmdvdDsKLQkgICAgICBCRkRfQVNTRVJUKHNnb3QgIT0gTlVMTCk7Ci0JICAgICAgQkZEX0FTU0VSVChnb3RlbnQtPmFkZGVuZCA9PSAwKTsKLQotCSAgICAgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHBsdF9hZGRyLAotCQkgICAgICAgICAgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKDAsIFJfQUxQSEFfUkVMQVRJVkUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0KLQkJICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICAgICBzcmVsLT5jb250ZW50cykKLQkJCQkJICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspOwotCQkgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50Ci0JCQkgICAgICA8PSBzcmVsLT5fY29va2VkX3NpemUpOwotCQl9Ci0KLQkgICAgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0JICAgIH0KLSAgICAgICAgICB3aGlsZSAoZ290ZW50ICE9IE5VTEwpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wIChoLCBpbmZvKSkKLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGZvciB0aGlzIHN5bWJvbCdzIC5nb3QgZW50cmllcy4gICovCi0gICAgICBhc2VjdGlvbiAqc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0gICAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FMUEhBX0dMT0JfREFUKTsKLSAgICAgIGZvciAoZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoKS0+Z290X2VudHJpZXM7Ci0JICAgZ290ZW50ICE9IE5VTEw7Ci0JICAgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdDsKLQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJICAgICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JICBvdXRyZWwucl9hZGRlbmQgPSBnb3RlbnQtPmFkZGVuZDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKXNyZWwtPmNvbnRlbnRzCi0JCQkJICAgICAgKyBzcmVsLT5yZWxvY19jb3VudCsrKSk7Ci0JICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCQkgICAgICA8PSBzcmVsLT5fY29va2VkX3NpemUpOwotCX0KLSAgICB9Ci0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmNjRfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIucGx0IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOwotCSAgICAgIGdvdG8gZ2V0X3NpemU7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbGEucGx0IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0KLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgLyogTXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlIFRJUyB2MS4xIEVMRiBkb2N1bWVudCBpbmRpY2F0ZXMKLQkJIHRoYXQgUkVMQVNaIHNob3VsZCBub3QgaW5jbHVkZSBKTVBSRUwuICBUaGlzIGlzIG5vdCB3aGF0Ci0JCSB0aGUgcmVzdCBvZiB0aGUgQkZEIGRvZXMuICBJdCBpcywgaG93ZXZlciwgd2hhdCB0aGUKLQkJIGdsaWJjIGxkLnNvIHdhbnRzLiAgRG8gdGhpcyBmaXh1cCBoZXJlIHVudGlsIHdlIGZvdW5kCi0JCSBvdXQgd2hvIGlzIHJpZ2h0LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKLQkgICAgICBpZiAocykKLQkJewotCQkgIGR5bi5kX3VuLmRfdmFsIC09Ci0JCSAgICAocy0+X2Nvb2tlZF9zaXplID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IChzID8gcy0+dm1hIDogMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZ2V0X3NpemU6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9Ci0JCShzLT5fY29va2VkX3NpemUgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JfQotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSBQTFQwIGVudHJ5ICovCi0gICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQxLCBzcGx0LT5jb250ZW50cyk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQyLCBzcGx0LT5jb250ZW50cyArIDQpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JEMywgc3BsdC0+Y29udGVudHMgKyA4KTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDQsIHNwbHQtPmNvbnRlbnRzICsgMTIpOwotCi0JICAvKiBUaGUgbmV4dCB0d28gd29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gYnkgbGQuc28gKi8KLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIDAsIHNwbHQtPmNvbnRlbnRzICsgMTYpOwotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgMCwgc3BsdC0+Y29udGVudHMgKyAyNCk7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JICAgIFBMVF9IRUFERVJfU0laRTsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLSAgICAgIHNkeW5zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAoc2R5bnN5bSAhPSBOVUxMKTsKLQotICAgICAgc3ltLnN0X3NpemUgPSAwOwotICAgICAgc3ltLnN0X25hbWUgPSAwOwotICAgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpbnQgaW5keDsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkgICAgIChQVFIpICgoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOwotCX0KLQotICAgICAgLyogU2V0IHRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBvdXRwdXQgLmR5bnN5bSBzZWN0aW9uIHRvIHRoZQotICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQliZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbCBsaW5rIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAucmVnaW5mbyBhbmQKLSAgIHRoZSAubWRlYnVnIHNlY3Rpb25zLiAgV2UgbmVlZCB0byBtZXJnZSBhbGwgaW5zdGFuY2VzIG9mIHRoZXNlCi0gICBzZWN0aW9ucyB0b2dldGhlciwgbm90IHdyaXRlIHRoZW0gYWxsIG91dCBzZXF1ZW50aWFsbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotI2lmIDAKLQkgICAgICBpZiAoKytuZ290cyA9PSAyKQotCQl7Ci0JCSAgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgXygidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIiksIChjaGFyICopIE5VTEwsCi0JCSAgICAgb3V0cHV0X2JmZCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKTsKLQkJfQotI2VuZGlmCi0KLSAgLyogR28gdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNvbGxlY3QgdGhlIC5yZWdpbmZvIGFuZCAubWRlYnVnCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVnaW5mb19zZWMgPSBOVUxMOwotICBtZGVidWdfc2VjID0gTlVMTDsKLSAgZ3B0YWJfZGF0YV9zZWMgPSBOVUxMOwotICBncHRhYl9ic3Nfc2VjID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLnJlZ2luZm8iKSA9PSAwKQotCXsKLQkgIG1lbXNldCAoJnJlZ2luZm8sIDAsIHNpemVvZiByZWdpbmZvKTsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JICAgICBMb29rIHRocm91Z2ggYWxsIHRoZSBsaW5rX29yZGVycyBjb21wcmlzaW5nIGl0IGFuZCBtZXJnZQotCSAgICAgdGhlIGluZm9ybWF0aW9uIHRvZ2V0aGVyLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0JICAgICAgRWxmNjRfUmVnSW5mbyBzdWI7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIFRoZSBsaW5rZXIgZW11bGF0aW9uIGNvZGUgaGFzIHByb2JhYmx5IGNsb2JiZXJlZCB0aGUKLSAgICAgICAgICAgICAgICAgc2l6ZSB0byBiZSB6ZXJvIGJ5dGVzLiAgKi8KLQkgICAgICBpZiAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCWlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgKFBUUikgJmV4dCwKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkgICAgICBzaXplb2YgZXh0KSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgYmZkX2FscGhhX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoaW5wdXRfYmZkLCAmZXh0LCAmc3ViKTsKLQotCSAgICAgIHJlZ2luZm8ucmlfZ3BybWFzayB8PSBzdWIucmlfZ3BybWFzazsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gfD0gc3ViLnJpX2Nwcm1hc2tbMF07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzFdIHw9IHN1Yi5yaV9jcHJtYXNrWzFdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1syXSB8PSBzdWIucmlfY3BybWFza1syXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gfD0gc3ViLnJpX2Nwcm1hc2tbM107Ci0KLQkgICAgICAvKiByaV9ncF92YWx1ZSBpcyBzZXQgYnkgdGhlIGZ1bmN0aW9uCi0JCSBhbHBoYV9lbGZfc2VjdGlvbl9wcm9jZXNzaW5nIHdoZW4gdGhlIHNlY3Rpb24gaXMKLQkJIGZpbmFsbHkgd3JpdHRlbiBvdXQuICAqLwotCi0JICAgICAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICB9Ci0KLQkgIC8qIEZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gdGhlIHZhbHVlIHdlIHdhbnQuICAqLwotCSAgby0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIHJlZ2luZm9fc2VjID0gbzsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5tZGVidWciKSA9PSAwKQotCXsKLQkgIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQkgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgdmVyc2lvbiBzdGFtcCBiZT8gICovCi0JICBzeW1oZHItPnZzdGFtcCA9IDA7Ci0JICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLQkgIHN5bWhkci0+Y2JMaW5lID0gMDsKLQkgIHN5bWhkci0+aWRuTWF4ID0gMDsKLQkgIHN5bWhkci0+aXBkTWF4ID0gMDsKLQkgIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0JICBzeW1oZHItPmlvcHRNYXggPSAwOwotCSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzTWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWZkTWF4ID0gMDsKLQkgIHN5bWhkci0+Y3JmZCA9IDA7Ci0JICBzeW1oZHItPmlleHRNYXggPSAwOwotCi0JICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZQotCSAgICAgZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCSAgZGVidWcubGluZSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9kbnIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcGRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9vcHQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLQkgIGRlYnVnLnNzID0gTlVMTDsKLQkgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9yZmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0KLQkgIG1kZWJ1Z19oYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLQkgIGlmIChtZGVidWdfaGFuZGxlID09IChQVFIpIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKDEpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQkgICAgICBFWFRSIGVzeW07Ci0JICAgICAgYmZkX3ZtYSBsYXN0OwotCSAgICAgIHVuc2lnbmVkIGludCBpOwotCSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZVtdID0KLQkJewotCQkgICIudGV4dCIsICIuaW5pdCIsICIuZmluaSIsICIuZGF0YSIsCi0JCSAgIi5yb2RhdGEiLCAiLnNkYXRhIiwgIi5zYnNzIiwgIi5ic3MiCi0JCX07Ci0JICAgICAgc3RhdGljIGNvbnN0IGludCBzY1tdID0geyBzY1RleHQsIHNjSW5pdCwgc2NGaW5pLCBzY0RhdGEsCi0JCQkJCSAgc2NSRGF0YSwgc2NTRGF0YSwgc2NTQnNzLCBzY0JzcyB9OwotCi0JICAgICAgZXN5bS5qbXB0YmwgPSAwOwotCSAgICAgIGVzeW0uY29ib2xfbWFpbiA9IDA7Ci0JICAgICAgZXN5bS53ZWFrZXh0ID0gMDsKLQkgICAgICBlc3ltLnJlc2VydmVkID0gMDsKLQkgICAgICBlc3ltLmlmZCA9IGlmZE5pbDsKLQkgICAgICBlc3ltLmFzeW0uaXNzID0gaXNzTmlsOwotCSAgICAgIGVzeW0uYXN5bS5zdCA9IHN0TG9jYWw7Ci0JICAgICAgZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLQkgICAgICBlc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCSAgZXN5bS5hc3ltLnNjID0gc2NbaV07Ci0JCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lW2ldKTsKLQkJICBpZiAocyAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBlc3ltLmFzeW0udmFsdWUgPSBzLT52bWE7Ci0JCSAgICAgIGxhc3QgPSBzLT52bWEgKyBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZXN5bS5hc3ltLnZhbHVlID0gbGFzdDsKLQotCQkgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsICZkZWJ1Zywgc3dhcCwKLQkJCQkJCSAgICAgIG5hbWVbaV0sICZlc3ltKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0JICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gaW5wdXRfZGVidWc7Ci0JICAgICAgY2hhciAqZXJhd19zcmM7Ci0JICAgICAgY2hhciAqZXJhd19lbmQ7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkgIHx8IChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKQotCQkgICAgICAtPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApID09IE5VTEwpCi0JCXsKLQkJICAvKiBJIGRvbid0IGtub3cgd2hhdCBhIG5vbiBBTFBIQSBFTEYgYmZkIHdvdWxkIGJlCi0JCSAgICAgZG9pbmcgd2l0aCBhIC5tZGVidWcgc2VjdGlvbiwgYnV0IEkgZG9uJ3QgcmVhbGx5Ci0JCSAgICAgd2FudCB0byBkZWFsIHdpdGggaXQuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zd2FwID0gKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCQkgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnNpemUgPT0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIFRoZSBFQ09GRiBsaW5raW5nIGNvZGUgZXhwZWN0cyB0aGF0IHdlIGhhdmUgYWxyZWFkeQotCQkgcmVhZCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBzZXQgdXAgYW4KLQkJIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBzbyB3ZSBkbyB0aGF0IG5vdy4gICovCi0JICAgICAgaWYgKCFlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSZpbnB1dF9kZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCQkgICAgIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGlucHV0X2JmZCwKLQkJICAgICAgJmlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLCBpbmZvKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIEZvciBlYWNoIG9uZSB3aXRoCi0JCSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiwgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbgotCQkgdGhlIGxpbmtlciBnbG9iYWwgaGFzaCB0YWJsZSBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24KLQkJIGZvciB0aGUgb3V0cHV0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotCSAgICAgIGVyYXdfc3JjID0gaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0OwotCSAgICAgIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JCQkgICsgKGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCQkgICAgICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKLQkgICAgICBmb3IgKDsKLQkJICAgZXJhd19zcmMgPCBlcmF3X2VuZDsKLQkJICAgZXJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0JCXsKLQkJICBFWFRSIGV4dDsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgKCppbnB1dF9zd2FwLT5zd2FwX2V4dF9pbikgKGlucHV0X2JmZCwgKFBUUikgZXJhd19zcmMsICZleHQpOwotCQkgIGlmIChleHQuYXN5bS5zYyA9PSBzY05pbAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIG5hbWUgPSBpbnB1dF9kZWJ1Zy5zc2V4dCArIGV4dC5hc3ltLmlzczsKLQkJICBoID0gYWxwaGFfZWxmX2xpbmtfaGFzaF9sb29rdXAgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMIHx8IGgtPmVzeW0uaWZkICE9IC0yKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoZXh0LmlmZCAhPSAtMSkKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoZXh0LmlmZAotCQkJCSAgPCBpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLQkJICAgICAgZXh0LmlmZCA9IGlucHV0X2RlYnVnLmlmZG1hcFtleHQuaWZkXTsKLQkJICAgIH0KLQotCQkgIGgtPmVzeW0gPSBleHQ7Ci0JCX0KLQotCSAgICAgIC8qIEZyZWUgdXAgdGhlIGluZm9ybWF0aW9uIHdlIGp1c3QgcmVhZC4gICovCi0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcubGluZSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZG5yKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9wZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3N5bSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfb3B0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9hdXgpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5zc2V4dCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZmRyKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9yZmQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dCk7Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgLnJ0cHJvYyBzZWN0aW9uLiAgKi8KLQkgICAgICBydHByb2Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnRwcm9jIik7Ci0JICAgICAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJICAgIHwgU0VDX1JFQURPTkxZKTsKLQotCQkgIHJ0cHJvY19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJ0cHJvYyIpOwotCQkgIGlmIChydHByb2Nfc2VjID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJ0cHJvY19zZWMsIGZsYWdzKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHJ0cHJvY19zZWMsIDEyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKCEgYWxwaGFfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsCi0JCQkJCQkgICAgIGluZm8sIHJ0cHJvY19zZWMsICZkZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotI2VuZGlmCi0KLQotCSAgLyogQnVpbGQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0JICBlaW5mby5hYmZkID0gYWJmZDsKLQkgIGVpbmZvLmluZm8gPSBpbmZvOwotCSAgZWluZm8uZGVidWcgPSAmZGVidWc7Ci0JICBlaW5mby5zd2FwID0gc3dhcDsKLQkgIGVpbmZvLmZhaWxlZCA9IGZhbHNlOwotCSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSwKLQkJCQkgIChQVFIpICZlaW5mbyk7Ci0JICBpZiAoZWluZm8uZmFpbGVkKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgIG8tPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCAmZGVidWcsIHN3YXApOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgbWRlYnVnX3NlYyA9IG87Ci0JfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICAgICAgaWYgKHN0cm5jbXAgKG8tPm5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0JewotCSAgY29uc3QgY2hhciAqc3VibmFtZTsKLQkgIHVuc2lnbmVkIGludCBjOwotCSAgRWxmNjRfZ3B0YWIgKnRhYjsKLQkgIEVsZjY0X0V4dGVybmFsX2dwdGFiICpleHRfdGFiOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIC8qIFRoZSAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzIHNlY3Rpb25zIGhvbGQKLQkgICAgIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBzbWFsbCBkYXRhIGFyZWEgd291bGQKLQkgICAgIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiB0aGUgLUcgc3dpdGNoLiAgVGhlc2Ugc2VjdGlvbnMKLQkgICAgIG5vdCB1c2VkIGluIGV4ZWN1dGFibGVzIGZpbGVzLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLQkgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCQkgICBwID0gcC0+bmV4dCkKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCi0JCSAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCQljb250aW51ZTsKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JCSAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSAgICAgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkJfQotCi0JICAgICAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcwotCQkgY3VycmVudGx5IG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICAgICAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICAgICAgLyogUmVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZm9yIChzZWNwcCA9ICZhYmZkLT5zZWN0aW9uczsKLQkJICAgKnNlY3BwICE9IG87Ci0JCSAgIHNlY3BwID0gJigqc2VjcHApLT5uZXh0KQotCQk7Ci0JICAgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgICAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgaXMgb25lIGdwdGFiIGZvciBpbml0aWFsaXplZCBkYXRhLCBhbmQgb25lIGZvcgotCSAgICAgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2RhdGEiKSA9PSAwKQotCSAgICBncHRhYl9kYXRhX3NlYyA9IG87Ci0JICBlbHNlIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2JzcyIpID09IDApCi0JICAgIGdwdGFiX2Jzc19zZWMgPSBvOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogaWxsZWdhbCBzZWN0aW9uIG5hbWUgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBUaGUgbGlua2VyIHNjcmlwdCBhbHdheXMgY29tYmluZXMgLmdwdGFiLmRhdGEgYW5kCi0JICAgICAuZ3B0YWIuc2RhdGEgaW50byAuZ3B0YWIuc2RhdGEsIGFuZCBsaWtld2lzZSBmb3IKLQkgICAgIC5ncHRhYi5ic3MgYW5kIC5ncHRhYi5zYnNzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcwotCSAgICAgbm8gLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBpbiB3aGljaAotCSAgICAgY2FzZSB3ZSBtdXN0IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3VibmFtZSA9IG8tPm5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdWJuYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKG8gPT0gZ3B0YWJfZGF0YV9zZWMpCi0JCW8tPm5hbWUgPSAiLmdwdGFiLmRhdGEiOwotCSAgICAgIGVsc2UKLQkJby0+bmFtZSA9ICIuZ3B0YWIuYnNzIjsKLQkgICAgICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICAgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIFNldCB1cCB0aGUgZmlyc3QgZW50cnkuICAqLwotCSAgYyA9IDE7Ci0JICB0YWIgPSAoRWxmNjRfZ3B0YWIgKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoRWxmNjRfZ3B0YWIpKTsKLQkgIGlmICh0YWIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGFiWzBdLmd0X2hlYWRlci5ndF9jdXJyZW50X2dfdmFsdWUgPSBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X3VudXNlZCA9IDA7Ci0KLQkgIC8qIENvbWJpbmUgdGhlIGlucHV0IHNlY3Rpb25zLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGdwZW50cnk7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIENvbWJpbmUgdGhlIGdwdGFiIGVudHJpZXMgZm9yIHRoaXMgaW5wdXQgc2VjdGlvbiBvbmUKLQkJIGJ5IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgaW5wdXQgZ3B0YWIgZW50cmllcyBhcmUKLQkJIHNvcnRlZCBieSBhc2NlbmRpbmcgLUcgdmFsdWUuICAqLwotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoZ3BlbnRyeSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpOwotCQkgICBncGVudHJ5IDwgc2l6ZTsKLQkJICAgZ3BlbnRyeSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkKLQkJewotCQkgIEVsZjY0X0V4dGVybmFsX2dwdGFiIGV4dF9ncHRhYjsKLQkJICBFbGY2NF9ncHRhYiBpbnRfZ3B0YWI7Ci0JCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JCSAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0JCSAgYm9vbGVhbiBleGFjdDsKLQkJICB1bnNpZ25lZCBpbnQgbG9vazsKLQotCQkgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSAmZXh0X2dwdGFiLAotCQkJICBncGVudHJ5LCBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkpKQotCQkgICAgewotCQkgICAgICBmcmVlICh0YWIpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9ncHRhYl9pbiAoaW5wdXRfYmZkLCAmZXh0X2dwdGFiLAotCQkJCQkJJmludF9ncHRhYik7Ci0JCSAgdmFsID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2dfdmFsdWU7Ci0JCSAgYWRkID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzIC0gbGFzdDsKLQotCQkgIGV4YWN0ID0gZmFsc2U7Ci0JCSAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJICAgIHsKLQkJICAgICAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID49IHZhbCkKLQkJCXRhYltsb29rXS5ndF9lbnRyeS5ndF9ieXRlcyArPSBhZGQ7Ci0KLQkJICAgICAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID09IHZhbCkKLQkJCWV4YWN0ID0gdHJ1ZTsKLQkJICAgIH0KLQotCQkgIGlmICghIGV4YWN0KQotCQkgICAgewotCQkgICAgICBFbGY2NF9ncHRhYiAqbmV3X3RhYjsKLQkJICAgICAgdW5zaWduZWQgaW50IG1heDsKLQotCQkgICAgICAvKiBXZSBuZWVkIGEgbmV3IHRhYmxlIGVudHJ5LiAgKi8KLQkJICAgICAgbmV3X3RhYiA9ICgoRWxmNjRfZ3B0YWIgKikKLQkJCQkgYmZkX3JlYWxsb2MgKChQVFIpIHRhYiwKLQkJCQkJICAgICAgKGMgKyAxKSAqIHNpemVvZiAoRWxmNjRfZ3B0YWIpKSk7Ci0JCSAgICAgIGlmIChuZXdfdGFiID09IE5VTEwpCi0JCQl7Ci0JCQkgIGZyZWUgKHRhYik7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgdGFiID0gbmV3X3RhYjsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPSB2YWw7Ci0JCSAgICAgIHRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyA9IGFkZDsKLQotCQkgICAgICAvKiBNZXJnZSBpbiB0aGUgc2l6ZSBmb3IgdGhlIG5leHQgc21hbGxlc3QgLUcKLQkJCSB2YWx1ZSwgc2luY2UgdGhhdCB3aWxsIGJlIGltcGxpZWQgYnkgdGhpcyBuZXcKLQkJCSB2YWx1ZS4gICovCi0JCSAgICAgIG1heCA9IDA7Ci0JCSAgICAgIGZvciAobG9vayA9IDE7IGxvb2sgPCBjOyBsb29rKyspCi0JCQl7Ci0JCQkgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA8IHZhbAotCQkJICAgICAgJiYgKG1heCA9PSAwCi0JCQkJICB8fCAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUKLQkJCQkgICAgICA+IHRhYlttYXhdLmd0X2VudHJ5Lmd0X2dfdmFsdWUpKSkKLQkJCSAgICBtYXggPSBsb29rOwotCQkJfQotCQkgICAgICBpZiAobWF4ICE9IDApCi0JCQl0YWJbY10uZ3RfZW50cnkuZ3RfYnl0ZXMgKz0KLQkJCSAgdGFiW21heF0uZ3RfZW50cnkuZ3RfYnl0ZXM7Ci0KLQkJICAgICAgKytjOwotCQkgICAgfQotCi0JCSAgbGFzdCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9ieXRlczsKLQkJfQotCi0JICAgICAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB0YWJsZSBtdXN0IGJlIHNvcnRlZCBieSAtRyB2YWx1ZS4gICovCi0JICBpZiAoYyA+IDIpCi0JICAgIHFzb3J0ICh0YWIgKyAxLCBjIC0gMSwgc2l6ZW9mICh0YWJbMF0pLCBncHRhYl9jb21wYXJlKTsKLQotCSAgLyogU3dhcCBvdXQgdGhlIHRhYmxlLiAgKi8KLQkgIGV4dF90YWIgPSAoKEVsZjY0X0V4dGVybmFsX2dwdGFiICopCi0JCSAgICAgYmZkX2FsbG9jIChhYmZkLCBjICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9ncHRhYikpKTsKLQkgIGlmIChleHRfdGFiID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlICh0YWIpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotCSAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIHRhYiArIGksIGV4dF90YWIgKyBpKTsKLQkgIGZyZWUgKHRhYik7Ci0KLQkgIG8tPl9yYXdfc2l6ZSA9IGMgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKTsKLQkgIG8tPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dF90YWI7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCX0KLSNlbmRpZgotCi0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgaWYgKCEgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgY29tcHV0ZWQgc2VjdGlvbnMuICAqLwotCi0gIC8qIFRoZSAuZ290IHN1YnNlY3Rpb25zLi4uICAqLwotICB7Ci0gICAgYmZkICppLCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgICBmb3IgKGkgPSBhbHBoYV9lbGZfaGFzaF90YWJsZShpbmZvKS0+Z290X2xpc3Q7Ci0JIGkgIT0gTlVMTDsKLQkgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2dvdDsKLQotCS8qIGVsZl9iZmRfZmluYWxfbGluayBhbHJlYWR5IGRpZCBldmVyeXRoaW5nIGluIGR5bm9iai4gICovCi0JaWYgKGkgPT0gZHlub2JqKQotCSAgY29udGludWU7Ci0KLQlzZ290ID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3Q7Ci0JaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZ290LT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJc2dvdC0+Y29udGVudHMsIHNnb3QtPm91dHB1dF9vZmZzZXQsCi0JCQkJCXNnb3QtPl9yYXdfc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgaWYgKHJlZ2luZm9fc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gZXh0OwotCi0gICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgJnJlZ2luZm8sICZleHQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCByZWdpbmZvX3NlYywgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobWRlYnVnX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKLSAgICAgIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLAotCQkJCQkgICAgICAgc3dhcCwgaW5mbywKLQkJCQkJICAgICAgIG1kZWJ1Z19zZWMtPmZpbGVwb3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7Ci0gICAgfQotCi0gIGlmIChncHRhYl9kYXRhX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2RhdGFfc2VjLAotCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZ3B0YWJfYnNzX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2Jzc19zZWMsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgQ29waWVkCi0gICBmcm9tIGVsZjMyLW1pcHMuYy4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcAotZWxmNjRfYWxwaGFfZWNvZmZfZGVidWdfc3dhcCA9Ci17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpY1N5bTIsCi0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgOCwKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gIGVjb2ZmX3N3YXBfcGRyX2luLAotICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gIGVjb2ZmX3N3YXBfZmRyX2luLAotICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgZWNvZmZfc3dhcF9leHRfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgZWNvZmZfc3dhcF9leHRfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICBlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGY2NF9hbHBoYV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGY2NC1hbHBoYSIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2FscGhhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgCUVNX0FMUEhBCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAJMHgxMDAwMAotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIGVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIGVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBcCi0gIGVsZjY0X2FscGhhX2luZm9fdG9faG93dG8KLQotI2RlZmluZSBiZmRfZWxmNjRfbWtvYmplY3QgXAotICBlbGY2NF9hbHBoYV9ta29iamVjdAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCBcCi0gIGVsZjY0X2FscGhhX29iamVjdF9wCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIgXAotICBlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zIFwKLSAgZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucwotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIGVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjY0X2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayBcCi0gIGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgXAotICBlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotICBlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBcCi0gIGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLSAgZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLSAgZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIFwKLSAgZWxmNjRfYWxwaGFfZmluYWxfbGluawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAgXAotICAmZWxmNjRfYWxwaGFfZWNvZmZfZGVidWdfc3dhcAotCi0vKgotICogQSBmZXcgY29uc3RhbnRzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgLnBsdCBzZWN0aW9uIGlzIHNldCB1cC4KLSAqLwotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgUExUX0hFQURFUl9TSVpFCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1nZW4uYyBiL2JmZC9lbGY2NC1nZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkYzA5ZC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiBHZW5lcmljIHN1cHBvcnQgZm9yIDY0LWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IHNob3VsZCBiZQotICAgZ29vZCBlbm91Z2ggZm9yIEdEQiBvciBvYmpkdW1wIHRvIHJlYWQgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBkdW1teSA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlVOS05PV04iLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtYmlnIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX3Vua25vd24KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTk9ORQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1taXBzLmMgYi9iZmQvZWxmNjQtbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmU2MDc1Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYzICswLDAgQEAKLS8qIE1JUFMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBzdXBwb3J0cyB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4KLQotICAgVGhlIE1JUFMgNjQtYml0IEVMRiBBQkkgdXNlcyBhbiB1bnVzdWFsIHJlbG9jIGZvcm1hdC4gIFRoaXMgZmlsZQotICAgb3ZlcnJpZGVzIHRoZSB1c3VhbCBFTEYgcmVsb2MgaGFuZGxpbmcsIGFuZCBoYW5kbGVzIHJlYWRpbmcgYW5kCi0gICB3cml0aW5nIHRoZSByZWxvY2F0aW9ucyBoZXJlLgotCi0gICBUaGUgTUlQUyA2NC1iaXQgRUxGIEFCSSBhbHNvIHVzZXMgYW4gdW51c3VhbCBhcmNoaXZlIG1hcCBmb3JtYXQuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGUgNjQtYml0IEFCSSBpcyBub3Qgc3VwcG9zZWQgdG8KLSAgIHVzZSBFQ09GRi4gIEhvd2V2ZXIsIHdlIHN1cHBvcnQgaXQgYW55aG93IGZvciBhbiBlYXNpZXIgY2hhbmdlb3Zlci4gICovCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLS8qIFRoZSA2NCBiaXQgdmVyc2lvbnMgb2YgdGhlIG1kZWJ1ZyBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGFscGhhLmguICAqLwotI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqLAotCSAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqLAotCSAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKiwKLQkgICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKiwKLQkgICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGxvbmcgbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3dyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2VjdGlvbl9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3dyaXRlX2FybWFwCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKTsKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLS8qIFRoZSByZWxvY2F0aW9uIHRhYmxlIHVzZWQgZm9yIFNIVF9SRUwgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbFtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgc3ltYm9sIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX1JFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMjYgYml0IGJyYW5jaCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18yNiwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93Ci0JCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCi0JCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfSEkxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSEkxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfTE8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTE8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBsaXRlcmFsIHNlY3Rpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MSVRFUkFMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBjYWxsIHRocm91Z2ggZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTEwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAgIHsgMTMgfSwKLSAgICB7IDE0IH0sCi0gICAgeyAxNSB9LAotCi0gIC8qIEEgNSBiaXQgc2hpZnQgZmllbGQuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ1IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2MwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNiBiaXQgc2hpZnQgZmllbGQuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHk7IGEgc3BlY2lhbCBmdW5jdGlvbiBpcwotICAgICBuZWVkZWQgdG8gcHV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiB0aGUgcmlnaHQgcGxhY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2M0LAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCB0byBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfUEFHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX1BBR0UiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogT2Zmc2V0IGZyb20gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX09GU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9PRlNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHN1YnN0cmFjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX1NVQiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NVQiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSU5TRVJUX0EsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19JTlNFUlRfQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbiwgYW5kIGNoYW5nZSBhbGwgcmVsb2NhdGlvbnMKLSAgICAgdG8gcmVmZXIgdG8gdGhlIG9sZCBpbnN0cnVjdGlvbiBhdCB0aGUgYWRkcmVzcy4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9CLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGVsZXRlIGEgMzIgYml0IGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfREVMRVRFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0RFTEVURSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlciB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFUiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXN0IHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhlIHJlbWFpbmluZyByZWxvY3MgYXJlLCBidXQgdGhleSBhcmUgZGVmaW5lZAotICAgICBvbiBJcml4IDYuICAqLwotCi0gIEhPV1RPIChSX01JUFNfU0NOX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TQ05fRElTUCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1JFTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfQUREX0lNTUVESUFURSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0FERF9JTU1FRElBVEUiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19QSlVNUCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QSlVNUCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1JFTEdPVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUxHT1QiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHJvdGVjdGVkIGp1bXAgY29udmVyc2lvbi4gIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGhpbnQuICBObyAKLSAgICAgcmVsb2NhdGlvbiBpcyByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3MuICAqLwotICBIT1dUTyAoUl9NSVBTX0pBTFIsCSAgICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0pBTFIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBUaGUgcmVsb2NhdGlvbiB0YWJsZSB1c2VkIGZvciBTSFRfUkVMQSBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsYVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgc3ltYm9sIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX1JFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDI2IGJpdCBicmFuY2ggYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18yNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfSEkxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSEkxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBsaXRlcmFsIHNlY3Rpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MSVRFUkFMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1QxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfUEMxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBjYWxsIHRocm91Z2ggZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTEwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICB7IDEzIH0sCi0gICAgeyAxNCB9LAotICAgIHsgMTUgfSwKLQotICAvKiBBIDUgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0RJU1AiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCB0byBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfUEFHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX1BBR0UiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE9mZnNldCBmcm9tIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCBzdWJzdHJhY3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TVUIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TVUIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSU5TRVJUX0EsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19JTlNFUlRfQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbiwgYW5kIGNoYW5nZSBhbGwgcmVsb2NhdGlvbnMKLSAgICAgdG8gcmVmZXIgdG8gdGhlIG9sZCBpbnN0cnVjdGlvbiBhdCB0aGUgYWRkcmVzcy4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9CLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGVsZXRlIGEgMzIgYml0IGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfREVMRVRFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0RFTEVURSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlciB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFUiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhlIHJlbWFpbmluZyByZWxvY3MgYXJlLCBidXQgdGhleSBhcmUgZGVmaW5lZAotICAgICBvbiBJcml4IDYuICAqLwotCi0gIEhPV1RPIChSX01JUFNfU0NOX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TQ05fRElTUCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1JFTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfQUREX0lNTUVESUFURSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0FERF9JTU1FRElBVEUiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19QSlVNUCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QSlVNUCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1JFTEdPVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUxHT1QiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHJvdGVjdGVkIGp1bXAgY29udmVyc2lvbi4gIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGhpbnQuICBObyAKLSAgICAgcmVsb2NhdGlvbiBpcyByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3MuICAqLwotICBIT1dUTyAoUl9NSVBTX0pBTFIsCSAgICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0pBTFIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBTd2FwIGluIGEgTUlQUyA2NC1iaXQgUmVsIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKnNyYzsKLSAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOwotICBkc3QtPnJfc3ltID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3N5bSk7Ci0gIGRzdC0+cl9zc3ltID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3N5bSk7Ci0gIGRzdC0+cl90eXBlMyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUzKTsKLSAgZHN0LT5yX3R5cGUyID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTIpOwotICBkc3QtPnJfdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUpOwotfQotCi0vKiBTd2FwIGluIGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX3N5bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zeW0pOwotICBkc3QtPnJfc3N5bSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3NzeW0pOwotICBkc3QtPnJfdHlwZTMgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMyk7Ci0gIGRzdC0+cl90eXBlMiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUyKTsKLSAgZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlKTsKLSAgZHN0LT5yX2FkZGVuZCA9IGJmZF9oX2dldF9zaWduZWRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfYWRkZW5kKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiBTd2FwIG91dCBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqc3JjOwotICAgICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqZHN0OwotewotICBiZmRfaF9wdXRfNjQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIChiZmRfYnl0ZSAqKSBkc3QtPnJfb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnJfc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3N5bSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfc3N5bSwgKGJmZF9ieXRlICopIGRzdC0+cl9zc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMywgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMyk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZTIsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZTIpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZSk7Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqZHN0OwotewotICBiZmRfaF9wdXRfNjQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIChiZmRfYnl0ZSAqKSBkc3QtPnJfb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnJfc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3N5bSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfc3N5bSwgKGJmZF9ieXRlICopIGRzdC0+cl9zc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMywgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMyk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZTIsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZTIpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZSk7Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX2FkZGVuZCwgKGJmZF9ieXRlICopIGRzdC0+cl9hZGRlbmQpOwotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gTUlQUyBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgbWlwc19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfTUlQU19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9NSVBTXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01JUFNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfNjQsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX01JUFNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfTUlQU19SRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0pNUCwgUl9NSVBTXzI2IH0sCi0gIHsgQkZEX1JFTE9DX0hJMTZfUywgUl9NSVBTX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTE8xNiwgUl9NSVBTX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTCwgUl9NSVBTX0dQUkVMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBSX01JUFNfTElURVJBTCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBSX01JUFNfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUENSRUwsIFJfTUlQU19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBSX01JUFNfQ0FMTDE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR1BSRUwzMiwgUl9NSVBTX0dQUkVMMzIgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiwgUl9NSVBTX0dPVF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIFJfTUlQU19HT1RfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwgUl9NSVBTX0NBTExfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwgUl9NSVBTX0NBTExfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX1NVQiwgUl9NSVBTX1NVQiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFLCBSX01JUFNfR09UX1BBR0UgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfT0ZTVCwgUl9NSVBTX0dPVF9PRlNUIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0RJU1AsIFJfTUlQU19HT1RfRElTUCB9Ci19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyB0eXBlLCByZXR1cm4gYSBob3d0byBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1taXBzX2VsZjY0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChtaXBzX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtaXBzX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JewotCSAgaW50IHY7Ci0KLQkgIHYgPSAoaW50KSBtaXBzX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsOwotCSAgcmV0dXJuICZtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbFt2XTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTaW5jZSBlYWNoIGVudHJ5IGluIGFuIFNIVF9SRUwgb3IgU0hUX1JFTEEgc2VjdGlvbiBjYW4gcmVwcmVzZW50IHVwCi0gICB0byB0aHJlZSByZWxvY3MsIHdlIG11c3QgdGVsbCB0aGUgdXNlciB0byBhbGxvY2F0ZSBtb3JlIHNwYWNlLiAgKi8KLQotc3RhdGljIGxvbmcKLW1pcHNfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIChzZWMtPnJlbG9jX2NvdW50ICogMyArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0vKiBSZWFkIHRoZSByZWxvY2F0aW9ucyBmcm9tIG9uZSByZWxvYyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgcmVsX2hkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLXsKLSAgUFRSIGFsbG9jYXRlZCA9IE5VTEw7Ci0gIGJmZF9ieXRlICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxlbnRzOwotICBhcmVsZW50ICpyZWxlbnQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBlbnRzaXplOwotICByZWxvY19ob3d0b190eXBlICpob3d0b190YWJsZTsKLQotICBhbGxvY2F0ZWQgPSAoUFRSKSBiZmRfbWFsbG9jIChyZWxfaGRyLT5zaF9zaXplKTsKLSAgaWYgKGFsbG9jYXRlZCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgcmVsX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChhbGxvY2F0ZWQsIDEsIHJlbF9oZHItPnNoX3NpemUsIGFiZmQpICE9IHJlbF9oZHItPnNoX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIG5hdGl2ZV9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYWxsb2NhdGVkOwotCi0gIHJlbGVudHMgPSBhc2VjdC0+cmVsb2NhdGlvbiArIGFzZWN0LT5yZWxvY19jb3VudDsKLQotICBlbnRzaXplID0gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgQkZEX0FTU0VSVCAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsKQotCSAgICAgIHx8IGVudHNpemUgPT0gc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEpKTsKLQotICBjb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyBlbnRzaXplOwotCi0gIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpKQotICAgIGhvd3RvX3RhYmxlID0gbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWw7Ci0gIGVsc2UKLSAgICBob3d0b190YWJsZSA9IG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsYTsKLQotICByZWxlbnQgPSByZWxlbnRzOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgbmF0aXZlX3JlbG9jcyArPSBlbnRzaXplKQotICAgIHsKLSAgICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSByZWxhOwotICAgICAgYm9vbGVhbiB1c2VkX3N5bSwgdXNlZF9zc3ltOwotICAgICAgaW50IGlyOwotCi0gICAgICBpZiAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSkpCi0JbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbiAoYWJmZCwKLQkJCQkgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICopIG5hdGl2ZV9yZWxvY3MsCi0JCQkJICAgJnJlbGEpOwotICAgICAgZWxzZQotCXsKLQkgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsIHJlbDsKLQotCSAgbWlwc19lbGY2NF9zd2FwX3JlbG9jX2luIChhYmZkLAotCQkJCSAgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKikgbmF0aXZlX3JlbG9jcywKLQkJCQkgICAgJnJlbCk7Ci0JICByZWxhLnJfb2Zmc2V0ID0gcmVsLnJfb2Zmc2V0OwotCSAgcmVsYS5yX3N5bSA9IHJlbC5yX3N5bTsKLQkgIHJlbGEucl9zc3ltID0gcmVsLnJfc3N5bTsKLQkgIHJlbGEucl90eXBlMyA9IHJlbC5yX3R5cGUzOwotCSAgcmVsYS5yX3R5cGUyID0gcmVsLnJfdHlwZTI7Ci0JICByZWxhLnJfdHlwZSA9IHJlbC5yX3R5cGU7Ci0JICByZWxhLnJfYWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIC8qIEVhY2ggZW50cnkgcmVwcmVzZW50cyB1cCB0byB0aHJlZSBhY3R1YWwgcmVsb2NhdGlvbnMuICAqLwotCi0gICAgICB1c2VkX3N5bSA9IGZhbHNlOwotICAgICAgdXNlZF9zc3ltID0gZmFsc2U7Ci0gICAgICBmb3IgKGlyID0gMDsgaXIgPCAzOyBpcisrKQotCXsKLQkgIGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSB0eXBlOwotCi0JICBzd2l0Y2ggKGlyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgMDoKLQkgICAgICB0eXBlID0gKGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSkgcmVsYS5yX3R5cGU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICB0eXBlID0gKGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSkgcmVsYS5yX3R5cGUyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI6Ci0JICAgICAgdHlwZSA9IChlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUpIHJlbGEucl90eXBlMzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAodHlwZSA9PSBSX01JUFNfTk9ORSkKLQkgICAgewotCSAgICAgIC8qIFRoZXJlIGFyZSBubyBtb3JlIHJlbG9jYXRpb25zIGluIHRoaXMgZW50cnkuICBJZiB0aGlzCi0gICAgICAgICAgICAgICAgIGlzIHRoZSBmaXJzdCBlbnRyeSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIGR1bW15Ci0gICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gc28gdGhhdCB0aGUgZ2VuZXJpYyBsaW5rZXIga25vd3MgdGhhdAotICAgICAgICAgICAgICAgICB0aGVyZSBoYXMgYmVlbiBhIGJyZWFrIGluIHRoZSBzZXF1ZW5jZSBvZiByZWxvY2F0aW9ucwotICAgICAgICAgICAgICAgICBhcHBseWluZyB0byBhIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKGlyID09IDApCi0JCXsKLQkJICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkJICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQ7Ci0JCSAgZWxzZQotCQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7Ci0JCSAgcmVsZW50LT5hZGRlbmQgPSAwOwotCQkgIHJlbGVudC0+aG93dG8gPSAmaG93dG9fdGFibGVbKGludCkgUl9NSVBTX05PTkVdOwotCQkgICsrcmVsZW50OwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU29tZSB0eXBlcyByZXF1aXJlIHN5bWJvbHMsIHdoZXJlYXMgc29tZSBkbyBub3QuICAqLwotCSAgc3dpdGNoICh0eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgUl9NSVBTX05PTkU6Ci0JICAgIGNhc2UgUl9NSVBTX0xJVEVSQUw6Ci0JICAgIGNhc2UgUl9NSVBTX0lOU0VSVF9BOgotCSAgICBjYXNlIFJfTUlQU19JTlNFUlRfQjoKLQkgICAgY2FzZSBSX01JUFNfREVMRVRFOgotCSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghIHVzZWRfc3ltKQotCQl7Ci0JCSAgaWYgKHJlbGEucl9zeW0gPT0gMCkKLQkJICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzeW1ib2wgKipwcywgKnM7Ci0KLQkJICAgICAgcHMgPSBzeW1ib2xzICsgcmVsYS5yX3N5bSAtIDE7Ci0JCSAgICAgIHMgPSAqcHM7Ci0JCSAgICAgIGlmICgocy0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JCQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gcHM7Ci0JCSAgICAgIGVsc2UKLQkJCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBzLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQkJICAgIH0KLQotCQkgIHVzZWRfc3ltID0gdHJ1ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCEgdXNlZF9zc3ltKQotCQl7Ci0JCSAgc3dpdGNoIChyZWxhLnJfc3N5bSkKLQkJICAgIHsKLQkJICAgIGNhc2UgUlNTX1VOREVGOgotCQkgICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0KLQkJCWJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBSU1NfR1A6Ci0JCSAgICBjYXNlIFJTU19HUDA6Ci0JCSAgICBjYXNlIFJTU19MT0M6Ci0JCSAgICAgIC8qIEZJWE1FOiBJIHRoaW5rIHRoZXNlIG5lZWQgdG8gYmUgaGFuZGxlZCB1c2luZwotICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgaG93dG8gc3RydWN0dXJlcy4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKDApOwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgdXNlZF9zc3ltID0gdHJ1ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuCi0JICAgICBvYmplY3QgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3IKLQkgICAgIHNoYXJlZCBsaWJyYXJ5LiAgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzCi0JICAgICBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDApCi0JICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQ7Ci0JICBlbHNlCi0JICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQgLSBhc2VjdC0+dm1hOwotCi0JICByZWxlbnQtPmFkZGVuZCA9IHJlbGEucl9hZGRlbmQ7Ci0KLQkgIHJlbGVudC0+aG93dG8gPSAmaG93dG9fdGFibGVbKGludCkgdHlwZV07Ci0KLQkgICsrcmVsZW50OwotCX0KLSAgICB9Ci0KLSAgYXNlY3QtPnJlbG9jX2NvdW50ICs9IHJlbGVudCAtIHJlbGVudHM7Ci0KLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgdGhlIHJlbG9jYXRpb25zLiAgT24gSXJpeCA2LCB0aGVyZSBjYW4gYmUgdHdvIHJlbG9jIHNlY3Rpb25zCi0gICBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICogY29uc3QgZCA9IGVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KTsKLQotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gIT0gTlVMTAotICAgICAgfHwgKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIDMgYXJlbGVudCBzdHJ1Y3R1cmVzIGZvciBlYWNoIFJlbCBzdHJ1Y3R1cmUuICAqLwotICBhc2VjdC0+cmVsb2NhdGlvbiA9ICgoYXJlbGVudCAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgYXNlY3QtPnJlbG9jX2NvdW50ICogMyAqIHNpemVvZiAoYXJlbGVudCkpKTsKLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBzbHVycF9vbmVfcmVsb2NfdGFibGUgcm91dGluZSBpbmNyZW1lbnRzIHJlbG9jX2NvdW50LiAgKi8KLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gMDsKLQotICBpZiAoISBtaXBzX2VsZjY0X3NsdXJwX29uZV9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsICZkLT5yZWxfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChkLT5yZWxfaGRyMiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywKLQkJCQkJICAgICAgZC0+cmVsX2hkcjIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF93cml0ZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgYm9vbGVhbiAqZmFpbGVkcCA9IChib29sZWFuICopIGRhdGE7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbGFfaGRyOwotICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKmV4dF9yZWxhOwotICB1bnNpZ25lZCBpbnQgaWR4OwotICBhc3ltYm9sICpsYXN0X3N5bSA9IDA7Ci0gIGludCBsYXN0X3N5bV9pZHggPSAwOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKCpmYWlsZWRwKQotICAgIHJldHVybjsKLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFRoZSBsaW5rZXIgYmFja2VuZCB3cml0ZXMgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLCBhbmQgc2V0cyB0aGUKLSAgICAgcmVsb2NfY291bnQgZmllbGQgdG8gemVybyB0byBpbmhpYml0IHdyaXRpbmcgdGhlbSBoZXJlLiAgQWxzbywKLSAgICAgc29tZXRpbWVzIHRoZSBTRUNfUkVMT0MgZmxhZyBnZXRzIHNldCBldmVuIHdoZW4gdGhlcmUgYXJlbid0IGFueQotICAgICByZWxvY3MuICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBXZSBjYW4gY29tYmluZSB1cCB0byB0aHJlZSByZWxvY3MgdGhhdCByZWZlciB0byB0aGUgc2FtZSBhZGRyZXNzCi0gICAgIGlmIHRoZSBsYXR0ZXIgcmVsb2NzIGhhdmUgbm8gYXNzb2NpYXRlZCBzeW1ib2wuICAqLwotICBjb3VudCA9IDA7Ci0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgICsrY291bnQ7Ci0KLSAgICAgIGFkZHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF0tPmFkZHJlc3M7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnI7Ci0KLQkgIGlmIChpZHggKyAxID49IHNlYy0+cmVsb2NfY291bnQpCi0JICAgIGJyZWFrOwotCSAgciA9IHNlYy0+b3JlbG9jYXRpb25baWR4ICsgMV07Ci0JICBpZiAoci0+YWRkcmVzcyAhPSBhZGRyCi0JICAgICAgfHwgISBiZmRfaXNfYWJzX3NlY3Rpb24gKCgqci0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKQotCSAgICAgIHx8ICgqci0+c3ltX3B0cl9wdHIpLT52YWx1ZSAhPSAwKQotCSAgICBicmVhazsKLQotCSAgLyogV2UgY2FuIG1lcmdlIHRoZSByZWxvYyBhdCBJRFggKyAxIHdpdGggdGhlIHJlbG9jIGF0IElEWC4gICovCi0KLQkgICsraWR4OwotCX0KLSAgICB9Ci0KLSAgcmVsYV9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkcjsKLQotICByZWxhX2hkci0+c2hfc2l6ZSA9IHJlbGFfaGRyLT5zaF9lbnRzaXplICogY291bnQ7Ci0gIHJlbGFfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsYV9oZHItPnNoX3NpemUpOwotICBpZiAocmVsYV9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgKmZhaWxlZHAgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBleHRfcmVsYSA9IChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgcmVsYV9oZHItPmNvbnRlbnRzOwotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrLCBleHRfcmVsYSsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnB0cjsKLSAgICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSBpbnRfcmVsYTsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGludCBuOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQlpbnRfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzczsKLSAgICAgIGVsc2UKLQlpbnRfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzcyArIHNlYy0+dm1hOwotCi0gICAgICBzeW0gPSAqcHRyLT5zeW1fcHRyX3B0cjsKLSAgICAgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JbiA9IGxhc3Rfc3ltX2lkeDsKLSAgICAgIGVsc2UKLQl7Ci0JICBsYXN0X3N5bSA9IHN5bTsKLQkgIG4gPSBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCAmc3ltKTsKLQkgIGlmIChuIDwgMCkKLQkgICAgewotCSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JfQotCi0gICAgICBpbnRfcmVsYS5yX3N5bSA9IG47Ci0KLSAgICAgIGludF9yZWxhLnJfYWRkZW5kID0gcHRyLT5hZGRlbmQ7Ci0KLSAgICAgIGludF9yZWxhLnJfc3N5bSA9IFJTU19VTkRFRjsKLQotICAgICAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgJiYgISBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgcHRyKSkKLQl7Ci0JICAqZmFpbGVkcCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpbnRfcmVsYS5yX3R5cGUgPSBwdHItPmhvd3RvLT50eXBlOwotICAgICAgaW50X3JlbGEucl90eXBlMiA9IChpbnQpIFJfTUlQU19OT05FOwotICAgICAgaW50X3JlbGEucl90eXBlMyA9IChpbnQpIFJfTUlQU19OT05FOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnI7Ci0KLQkgIGlmIChpZHggKyAxID49IHNlYy0+cmVsb2NfY291bnQpCi0JICAgIGJyZWFrOwotCSAgciA9IHNlYy0+b3JlbG9jYXRpb25baWR4ICsgMV07Ci0JICBpZiAoci0+YWRkcmVzcyAhPSBwdHItPmFkZHJlc3MKLQkgICAgICB8fCAhIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgfHwgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlICE9IDApCi0JICAgIGJyZWFrOwotCi0JICAvKiBXZSBjYW4gbWVyZ2UgdGhlIHJlbG9jIGF0IElEWCArIDEgd2l0aCB0aGUgcmVsb2MgYXQgSURYLiAgKi8KLQotCSAgaWYgKGkgPT0gMCkKLQkgICAgaW50X3JlbGEucl90eXBlMiA9IHItPmhvd3RvLT50eXBlOwotCSAgZWxzZQotCSAgICBpbnRfcmVsYS5yX3R5cGUzID0gci0+aG93dG8tPnR5cGU7Ci0KLQkgICsraWR4OwotCX0KLQotICAgICAgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZpbnRfcmVsYSwgZXh0X3JlbGEpOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChleHRfcmVsYSAtIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgcmVsYV9oZHItPmNvbnRlbnRzCi0JICAgICAgPT0gY291bnQpOwotfQotDAotLyogSGFuZGxlIGEgNjQtYml0IE1JUFMgRUxGIHNwZWNpZmljIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmICghIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZvciBhIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbiwgbG9vayBmb3IgYSBPREtfUkVHSU5GTyBlbnRyeSwgYW5kCi0gICAgIHNldCB0aGUgZ3AgdmFsdWUgYmFzZWQgb24gd2hhdCB3ZSBmaW5kLiAgV2UgbWF5IHNlZSBib3RoCi0gICAgIFNIVF9NSVBTX1JFR0lORk8gYW5kIFNIVF9NSVBTX09QVElPTlMvT0RLX1JFR0lORk87IGluIHRoYXQgY2FzZSwKLSAgICAgdGhleSBzaG91bGQgYWdyZWUuICAqLwotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqbCwgKmxlbmQ7Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgaGRyLT5zaF9zaXplKSkKLQl7Ci0JICBmcmVlIChjb250ZW50cyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbCA9IGNvbnRlbnRzOwotICAgICAgbGVuZCA9IGNvbnRlbnRzICsgaGRyLT5zaF9zaXplOwotICAgICAgd2hpbGUgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSA8PSBsZW5kKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9PcHRpb25zIGludG9wdDsKLQotCSAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGwsCi0JCQkJCSZpbnRvcHQpOwotCSAgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyBpbnRyZWc7Ci0KLQkgICAgICBiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4KLQkJKGFiZmQsCi0JCSAoKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikKLQkJICAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKSksCi0JCSAmaW50cmVnKTsKLQkgICAgICBlbGZfZ3AgKGFiZmQpID0gaW50cmVnLnJpX2dwX3ZhbHVlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdvcmsgb3ZlciBhIHNlY3Rpb24ganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBXZSB1cGRhdGUgdGhlIEdQCi0gICB2YWx1ZSBpbiB0aGUgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSB3ZSBhcmUKLSAgIHVzaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2VjdGlvbl9wcm9jZXNzaW5nIChhYmZkLCBoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLXsKLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TCi0gICAgICAmJiBoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICAvKiBXZSBzdG9yZWQgdGhlIHNlY3Rpb24gY29udGVudHMgaW4gdGhlIGVsZl9zZWN0aW9uX2RhdGEgdGRhdGEKLQkgZmllbGQgaW4gdGhlIHNldF9zZWN0aW9uX2NvbnRlbnRzIHJvdXRpbmUuICBXZSBzYXZlIHRoZQotCSBzZWN0aW9uIGNvbnRlbnRzIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZWFkIHRoZW0gYWdhaW4uCi0JIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IGVsZl9ncCBpcyBzZXQsIHNvIHdlIGNhbiBsb29rCi0JIHRocm91Z2ggdGhlIHNlY3Rpb24gY29udGVudHMgdG8gc2VlIGlmIHRoZXJlIGlzIGFuCi0JIE9ES19SRUdJTkZPIHN0cnVjdHVyZS4gICovCi0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YTsKLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChpbnRvcHQua2luZCA9PSBPREtfUkVHSU5GTykKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIGJ1Zls4XTsKLQotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJCSAgICAoaGRyLT5zaF9vZmZzZXQKLQkJCSAgICAgKyAobCAtIGNvbnRlbnRzKQotCQkJICAgICArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpCi0JCQkgICAgICsgKHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykgLSA4KSksCi0JCQkgICAgIFNFRUtfU0VUKSA9PSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJmZF9oX3B1dF82NCAoYWJmZCwgZWxmX2dwIChhYmZkKSwgYnVmKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDgsIGFiZmQpICE9IDgpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgbCArPSBpbnRvcHQuc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKTsKLX0KLQwKLS8qIElyaXggNiBkZWZpbmVzIGEgYnJhbmQgbmV3IGFyY2hpdmUgbWFwIGZvcm1hdCwgc28gdGhhdCB0aGV5IGNhbgotICAgaGF2ZSBhcmNoaXZlcyBtb3JlIHRoYW4gNCBHQiBpbiBzaXplLiAgKi8KLQotLyogUmVhZCBhbiBJcml4IDYgYXJtYXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICBmaWxlX3B0ciBhcmhkcnBvczsKLSAgYmZkX3NpemVfdHlwZSBpLCBwYXJzZWRfc2l6ZSwgbnN5bXosIHN0cmluZ3NpemUsIGNhcnN5bV9zaXplLCBwdHJzaXplOwotICBzdHJ1Y3QgYXJlbHRkYXRhICptYXBkYXRhOwotICBiZmRfYnl0ZSBpbnRfYnVmWzhdOwotICBjaGFyICpzdHJpbmdiYXNlOwotICBiZmRfYnl0ZSAqcmF3X2FybWFwID0gTlVMTDsKLSAgY2Fyc3ltICpjYXJzeW1zOwotCi0gIGFyZGF0YS0+c3ltZGVmcyA9IE5VTEw7Ci0KLSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBlbGVtZW50LiAgKi8KLSAgYXJoZHJwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGkgPSBiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKTsKLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtIDE2LCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQXJjaGl2ZXMgd2l0aCB0cmFkaXRpb25hbCBhcm1hcHMgYXJlIHN0aWxsIHBlcm1pdHRlZC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKLSAgICByZXR1cm4gYmZkX3NsdXJwX2FybWFwIChhYmZkKTsKLQotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICIvU1lNNjQvICAgICAgICAgIiwgMTYpICE9IDApCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwotCi0gIGlmIChiZmRfcmVhZCAoaW50X2J1ZiwgMSwgOCwgYWJmZCkgIT0gOCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbnN5bXogPSBiZmRfZ2V0YjY0IChpbnRfYnVmKTsKLSAgc3RyaW5nc2l6ZSA9IHBhcnNlZF9zaXplIC0gOCAqIG5zeW16IC0gODsKLQotICBjYXJzeW1fc2l6ZSA9IG5zeW16ICogc2l6ZW9mIChjYXJzeW0pOwotICBwdHJzaXplID0gOCAqIG5zeW16OwotCi0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgYmZkX3phbGxvYyAoYWJmZCwgY2Fyc3ltX3NpemUgKyBzdHJpbmdzaXplICsgMSk7Ci0gIGlmIChhcmRhdGEtPnN5bWRlZnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNhcnN5bXMgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gIHN0cmluZ2Jhc2UgPSAoKGNoYXIgKikgYXJkYXRhLT5zeW1kZWZzKSArIGNhcnN5bV9zaXplOwotCi0gIHJhd19hcm1hcCA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHB0cnNpemUpOwotICBpZiAocmF3X2FybWFwID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9yZWFkIChyYXdfYXJtYXAsIDEsIHB0cnNpemUsIGFiZmQpICE9IHB0cnNpemUKLSAgICAgIHx8IGJmZF9yZWFkIChzdHJpbmdiYXNlLCAxLCBzdHJpbmdzaXplLCBhYmZkKSAhPSBzdHJpbmdzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBuc3ltejsgaSsrKQotICAgIHsKLSAgICAgIGNhcnN5bXMtPmZpbGVfb2Zmc2V0ID0gYmZkX2dldGI2NCAocmF3X2FybWFwICsgaSAqIDgpOwotICAgICAgY2Fyc3ltcy0+bmFtZSA9IHN0cmluZ2Jhc2U7Ci0gICAgICBzdHJpbmdiYXNlICs9IHN0cmxlbiAoc3RyaW5nYmFzZSkgKyAxOwotICAgICAgKytjYXJzeW1zOwotICAgIH0KLSAgKnN0cmluZ2Jhc2UgPSAnXDAnOwotCi0gIGFyZGF0YS0+c3ltZGVmX2NvdW50ID0gbnN5bXo7Ci0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYXJoZHJwb3MgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgcGFyc2VkX3NpemU7Ci0KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJhd19hcm1hcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyYXdfYXJtYXAgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmF3X2FybWFwKTsKLSAgaWYgKGFyZGF0YS0+c3ltZGVmcyAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBhcmRhdGEtPnN5bWRlZnMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBJcml4IDYgYXJtYXAuICBUaGUgSXJpeCA2IHRvb2xzIGFyZSBzdXBwb3NlZCB0byBiZQotICAgYWJsZSB0byBoYW5kbGUgb3JkaW5hcnkgRUxGIGFybWFwcywgYnV0IGF0IGxlYXN0IG9uIElyaXggNi4yIHRoZQotICAgbGlua2VyIGNyYXNoZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBzeW1ib2xfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IChzeW1ib2xfY291bnQgKiA4KSArIDg7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplID0gc3RyaWR4OwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHN0cmluZ3NpemUgKyByYW5saWJzaXplOwotICBmaWxlX3B0ciBhcmNoaXZlX21lbWJlcl9maWxlX3B0cjsKLSAgYmZkICpjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IHBhZGRpbmc7Ci0gIGJmZF9ieXRlIGJ1Zls4XTsKLQotICBwYWRkaW5nID0gQkZEX0FMSUdOIChtYXBzaXplLCA4KSAtIG1hcHNpemU7Ci0gIG1hcHNpemUgKz0gcGFkZGluZzsKLQotICAvKiB3b3JrIG91dCB3aGVyZSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgd2lsbCBnbyBpbiB0aGUgYXJjaGl2ZSAqLwotICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciA9IChtYXBzaXplCi0JCQkgICAgICsgZWxlbmd0aAotCQkJICAgICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikKLQkJCSAgICAgKyBTQVJNQUcpOwotCi0gIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgc3RyY3B5IChoZHIuYXJfbmFtZSwgIi9TWU02NC8iKTsKLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIChsb25nKSB0aW1lIChOVUxMKSk7Ci0gIC8qIFRoaXMsIGF0IGxlYXN0LCBpcyB3aGF0IEludGVsIGNvZmYgc2V0cyB0aGUgdmFsdWVzIHRvLjogKi8KLSAgc3ByaW50ZiAoKGhkci5hcl91aWQpLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoKGhkci5hcl9naWQpLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoKGhkci5hcl9tb2RlKSwgIiUtN28iLCAodW5zaWduZWQpIDApOwotICBzdHJuY3B5IChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLQotICAvKiBXcml0ZSB0aGUgYXIgaGVhZGVyIGZvciB0aGlzIGl0ZW0gYW5kIHRoZSBudW1iZXIgb2Ygc3ltYm9scyAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFyY2gpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcHV0YjY0IChzeW1ib2xfY291bnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOCwgYXJjaCkgIT0gOCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVHdvIHBhc3NlcywgZmlyc3Qgd3JpdGUgdGhlIGZpbGUgb2Zmc2V0cyBmb3IgZWFjaCBzeW1ib2wgLQotICAgICByZW1lbWJlcmluZyB0aGF0IGVhY2ggb2Zmc2V0IGlzIG9uIGEgdHdvIGJ5dGUgYm91bmRhcnkuICAqLwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBlYWNoCi0gICAgIHN5bWJvbCwgYW5kIHJlbWVtYmVyIHRvIGtlZXAgdGhlIG9mZnNldHMgcGFkZGVkIG91dC4gICovCi0KLSAgY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgY291bnQgPSAwOwotICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIE5VTEwgJiYgY291bnQgPCBzeW1ib2xfY291bnQpCi0gICAgewotICAgICAgLyogRm9yIGVhY2ggc3ltYm9sIHdoaWNoIGlzIHVzZWQgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCwgd3JpdGUgb3V0Ci0JIHRoZSBvYmplY3QgZmlsZSdzIGFkZHJlc3MgaW4gdGhlIGFyY2hpdmUgKi8KLQotICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbY291bnRdKS5wb3MpID09IGN1cnJlbnQpCi0JewotCSAgYmZkX3B1dGI2NCAoYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIsIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDgsIGFyY2gpICE9IDgpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgLyogQWRkIHNpemUgb2YgdGhpcyBhcmNoaXZlIGVudHJ5ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSAoYXJlbHRfc2l6ZSAoY3VycmVudCkKLQkJCQkgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gICAgICAvKiByZW1lbWJlciBhYm91dCB0aGUgZXZlbiBhbGlnbm1lbnQgKi8KLSAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICUgMjsKLSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotICAgIH0KLQotICAvKiBub3cgd3JpdGUgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcyAqLwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzeW1ib2xfY291bnQ7IGNvdW50KyspCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoKm1hcFtjb3VudF0ubmFtZSkgKyAxOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgqbWFwW2NvdW50XS5uYW1lLCAxLCBsZW4sIGFyY2gpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNheXMgdGhhdCB0aGlzIHNob3VsZCBiZSBwYWRkZWQgdG8gYW4gOCBieXRlIGJvdW5kYXJ5LgotICAgICBIb3dldmVyLCB0aGUgSXJpeCA2LjIgdG9vbHMgZG8gbm90IGFwcGVhciB0byBkbyB0aGlzLiAgKi8KLSAgd2hpbGUgKHBhZGRpbmcgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAtLXBhZGRpbmc7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUKLSAgIC5tZGVidWcgc2VjdGlvbiwgd2hpY2ggaXMgaW4gdGhlIEVDT0ZGIGRlYnVnZ2luZyBmb3JtYXQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwIG1pcHNfZWxmNjRfZWNvZmZfZGVidWdfc3dhcCA9Ci17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpY1N5bTIsCi0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgOCwKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gIGVjb2ZmX3N3YXBfcGRyX2luLAotICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gIGVjb2ZmX3N3YXBfZmRyX2luLAotICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgZWNvZmZfc3dhcF9leHRfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgZWNvZmZfc3dhcF9leHRfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICBfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbwotfTsKLQwKLS8qIFJlbG9jYXRpb25zIGluIHRoZSA2NCBiaXQgTUlQUyBFTEYgQUJJIGFyZSBtb3JlIGNvbXBsZXggdGhhbiBpbgotICAgc3RhbmRhcmQgRUxGLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZWRpcmVjdCB0aGUgcmVsb2NhdGlvbgotICAgaGFuZGxpbmcgcm91dGluZXMuICAqLwotCi1jb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBtaXBzX2VsZjY0X3NpemVfaW5mbyA9Ci17Ci0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfRWhkciksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUGhkciksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU2hkciksCi0gIHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpLAotICBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU3ltKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9EeW4pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9Ob3RlKSwKLSAgNjQsCQkvKiBhcmNoX3NpemUgKi8KLSAgOCwJCS8qIGZpbGVfYWxpZ24gKi8KLSAgRUxGQ0xBU1M2NCwKLSAgRVZfQ1VSUkVOVCwKLSAgYmZkX2VsZjY0X3dyaXRlX291dF9waGRycywKLSAgYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyLAotICBtaXBzX2VsZjY0X3dyaXRlX3JlbG9jcywKLSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCwKLSAgbWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZSwKLSAgYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgYmZkX2VsZjY0X3N3YXBfZHluX2luCi19OwotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmNjQtbGl0dGxlbWlwcyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmNjRfYmlnbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjY0LWJpZ21pcHMiCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfbWlwcwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9NSVBTCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2luZm8JCW1pcHNfZWxmNjRfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQlfYmZkX21pcHNfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCW1pcHNfZWxmNjRfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwlfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCW1pcHNfZWxmNjRfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCSZtaXBzX2VsZjY0X2Vjb2ZmX2RlYnVnX3N3YXAKLQotI2RlZmluZSBiZmRfZWxmNjRfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIG1pcHNfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXAJbWlwc19lbGY2NF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmNjRfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3NldF9wcml2YXRlX2ZsYWdzCV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9mdW5jdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfc2x1cnBfYXJtYXAJbWlwc19lbGY2NF9zbHVycF9hcm1hcAotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV90cnVuY2F0ZV9hcm5hbWUgXAotCQkJCQlfYmZkX2FyY2hpdmVfY29mZl90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfd3JpdGVfYXJtYXAJbWlwc19lbGY2NF93cml0ZV9hcm1hcAotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9yZWFkX2FyX2hkcglfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkcgotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4IFwKLQkJCQkJX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotCQkJCQlfYmZkX2FyY2hpdmVfY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotCi0jaW5jbHVkZSAiZWxmNjQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmNjQtc3BhcmMuYyBiL2JmZC9lbGY2NC1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY2YmNlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3NSArMCwwIEBACi0vKiBTUEFSQy1zcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgaXMgZGVmaW5lZCBpZiBvbmUgd2FudHMgdG8gYnVpbGQgdXB3YXJkIGNvbXBhdGlibGUgYmluYXJpZXMKLSAgIHdpdGggdGhlIG9yaWdpbmFsIHNwYXJjNjQtZWxmIHRvb2xjaGFpbi4gIFRoZSBzdXBwb3J0IGlzIGtlcHQgaW4gZm9yCi0gICBub3cgYnV0IGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gIGRqZSA5NzA5MzAgICovCi0vKiNkZWZpbmUgU1BBUkM2NF9PTERfUkVMT0NTKi8KLQotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlLiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FICh+IChiZmRfdm1hKSAwKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgc3BhcmM2NF9lbGZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyB2b2lkIHNwYXJjNjRfZWxmX2J1aWxkX3BsdAotICBQQVJBTVMoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldAotICBQQVJBTVMoKGludCkpOwotc3RhdGljIGJmZF92bWEgc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQKLSAgUEFSQU1TKChpbnQsIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKnNlYywKLQkgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9hZGp1c3RfZHluaW5keAotICBQQVJBTVMoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotDAotLyogVGhlIHJlbG9jYXRpb24gImhvd3RvIiB0YWJsZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX25vdHN1cF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl9oaXgyMl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX2xveDEwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSNpZm5kZWYgU1BBUkM2NF9PTERfUkVMT0NTCi0gIC8qIFRoZXNlIGFyZW4ndCBpbXBsZW1lbnRlZCB5ZXQuICAqLwotICBIT1dUTyhSX1NQQVJDX1BMVDMyLCAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUExUMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSElQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX0xPUExUMTAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDUExUMzIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUENQTFQzMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BDUExUMTAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2VuZGlmCi0gIEhPV1RPKFJfU1BBUkNfMTAsICAgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMCIsICAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzExLCAgICAgICAgMCwyLDExLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTEiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDdmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ182NCwgICAgICAgIDAsNCw2NCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19PTE8xMCIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hIMjIsICAgICA0MiwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ITTEwLCAgICAgMzIsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hIMjIsICA0MiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUENfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ITTEwLCAgMzIsMiwxMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgIDEwLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQ19MTTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQNjQsICAgIDAsNCw2NCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1A2NCIsICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUExUNjQsICAgICAwLDQsNjQsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QTFQ2NCIsICAgZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVgyMiwgICAgIDAsNCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwYXJjX2VsZl9oaXgyMl9yZWxvYywgICJSX1NQQVJDX0hJWDIyIiwgICBmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0xPWDEwLCAgICAgMCw0LCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX2xveDEwX3JlbG9jLCAgIlJfU1BBUkNfTE9YMTAiLCAgIGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfSDQ0LCAgICAgIDIyLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19INDQiLCAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19NNDQsICAgICAgMTIsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX000NCIsICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0w0NCwgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTDQ0IiwgICAgIGZhbHNlLDAsMHgwMDAwMGZmZixmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVHSVNURVIsICAwLDQsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19SRUdJU1RFUiIsZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTY0LCAgICAgICAgMCw0LDY0LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUE2NCIsICAgICAgZmFsc2UsMCxNSU5VU19PTkUsIHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMTYsICAgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VQTE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSkKLX07Ci0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KLS8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLSAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAotICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAotICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKLSAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX0RJU1A2NCwgUl9TUEFSQ19ESVNQNjR9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BMVDY0LCBSX1NQQVJDX1BMVDY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ISVgyMiwgUl9TUEFSQ19ISVgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTE9YMTAsIFJfU1BBUkNfTE9YMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0g0NCwgUl9TUEFSQ19INDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX000NCwgUl9TUEFSQ19NNDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX0w0NCwgUl9TUEFSQ19MNDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSLCBSX1NQQVJDX1JFR0lTVEVSfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3BhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotc3BhcmM2NF9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKEVMRjY0X1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXhfc3RkKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtFTEY2NF9SX1RZUEUgKGRzdC0+cl9pbmZvKV07Ci19Ci0MCi0vKiBVdGlsaXR5IGZvciBwZXJmb3JtaW5nIHRoZSBzdGFuZGFyZCBpbml0aWFsIHdvcmsgb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgIHJlbG9jYXRpb24uCi0gICAqUFJFTE9DQVRJT04gd2lsbCBjb250YWluIHRoZSByZWxvY2F0ZWQgaXRlbS4KLSAgICpQSU5TTiB3aWxsIGNvbnRhaW4gdGhlIGluc3RydWN0aW9uIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgIElmIHRoZSByZXN1bHQgaXMgYGJmZF9yZWxvY19vdGhlcicgdGhlIGNhbGxlciBjYW4gY29udGludWUgd2l0aAotICAgcGVyZm9ybWluZyB0aGUgcmVsb2NhdGlvbi4gIE90aGVyd2lzZSBpdCBtdXN0IHN0b3AgYW5kIHJldHVybiB0aGUKLSAgIHZhbHVlIHRvIGl0cyBjYWxsZXIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1pbml0X2luc25fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIHByZWxvY2F0aW9uLAotCQkgcGluc24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgKnByZWxvY2F0aW9uOwotICAgICBiZmRfdm1hICpwaW5zbjsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISBob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBUaGlzIHdvcmtzIGJlY2F1c2UgcGFydGlhbF9pbnBsYWNlID09IGZhbHNlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgKnByZWxvY2F0aW9uID0gcmVsb2NhdGlvbjsKLSAgKnBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci19Ci0KLS8qIEZvciB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfbm90c3VwX3JlbG9jIChhYmZkLAotCQkJcmVsb2NfZW50cnksCi0JCQlzeW1ib2wsCi0JCQlkYXRhLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgV0RJU1AxNiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICBpbnNuID0gKGluc24gJiB+MHgzMDNmZmYpIHwgKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCi0JCQkgICAgICAgfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAotICAgICAgfHwgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID4gMHgzZmZmZikKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIHRoZSBISVgyMiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9oaXgyMl9yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIHJlbG9jYXRpb24gXj0gTUlOVVNfT05FOwotICBpbnNuID0gKGluc24gJiB+MHgzZmZmZmYpIHwgKChyZWxvY2F0aW9uID4+IDEwKSAmIDB4M2ZmZmZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKChyZWxvY2F0aW9uICYgfiAoYmZkX3ZtYSkgMHhmZmZmZmZmZikgIT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIHRoZSBMT1gxMCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9sb3gxMF9yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIGluc24gPSAoaW5zbiAmIH4weDFmZmYpIHwgMHgxYzAwIHwgKHJlbG9jYXRpb24gJiAweDNmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBQTFQvR09UIHN0dWZmICovCi0KLS8qIEJvdGggdGhlIGhlYWRlcnMgYW5kIHRoZSBlbnRyaWVzIGFyZSBpY2FjaGUgYWxpZ25lZC4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFCQkzMgotI2RlZmluZSBQTFRfSEVBREVSX1NJWkUJCSg0ICogUExUX0VOVFJZX1NJWkUpCi0jZGVmaW5lIExBUkdFX1BMVF9USFJFU0hPTEQJMzI3NjgKLSNkZWZpbmUgR09UX1JFU0VSVkVEX0VOVFJJRVMJMQotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9zcGFyY3Y5L2xkLnNvLjEiCi0KLQotLyogRmlsbCBpbiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNwYXJjNjRfZWxmX2J1aWxkX3BsdCAob3V0cHV0X2JmZCwgY29udGVudHMsIG5lbnRyaWVzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICAgICBpbnQgbmVudHJpZXM7Ci17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBub3AgPSAweDAxMDAwMDAwOwotICBpbnQgaSwgajsKLSAgCi0gIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgYXJlIHJlc2VydmVkLCBhbmQgYXJlIGluaXRpYWxseSB1bmRlZmluZWQuCi0gICAgIFdlIGZpbGwgdGhlbSB3aXRoIGBpbGx0cmFwIDAnIHRvIGZvcmNlIGxkLnNvIHRvIGRvIHNvbWV0aGluZy4gICovCi0KLSAgZm9yIChpID0gMDsgaSA8IFBMVF9IRUFERVJfU0laRS80OyArK2kpCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgY29udGVudHMraSo0KTsKLQotICAvKiBUaGUgZmlyc3QgMzI3NjggZW50cmllcyBhcmUgY2xvc2UgZW5vdWdoIHRvIHBsdDEgdG8gZ2V0IHRoZXJlIHZpYQotICAgICBhIHN0cmFpZ2h0IGJyYW5jaC4gICovCi0KLSAgZm9yIChpID0gNDsgaSA8IExBUkdFX1BMVF9USFJFU0hPTEQgJiYgaSA8IG5lbnRyaWVzOyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqZW50cnkgPSBjb250ZW50cyArIGkgKiBQTFRfRU5UUllfU0laRTsKLSAgICAgIHVuc2lnbmVkIGludCBzZXRoaSwgYmE7Ci0KLSAgICAgIC8qIHNldGhpICguIC0gcGx0MCksICVnMSAqLwotICAgICAgc2V0aGkgPSAweDAzMDAwMDAwIHwgKGkgKiBQTFRfRU5UUllfU0laRSk7Ci0KLSAgICAgIC8qIGJhLGEscHQgJWljYywgcGx0MSAqLwotICAgICAgYmEgPSAweDMwNDgwMDAwIHwgKCgoY29udGVudHMrUExUX0VOVFJZX1NJWkUpIC0gKGVudHJ5KzQpKSAvIDQgJiAweDdmZmZmKTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgc2V0aGksIGVudHJ5KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGJhLCBlbnRyeSs0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrOCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzEyKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMTYpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsyMCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzI0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMjgpOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRyaWNreSBiaXQuICBFbnRyaWVzIDMyNzY4IGFuZCBoaWdoZXIgYXJlIGdyb3VwZWQgaW4gYmxvY2tzIG9mCi0gICAgIDE2MDogMTYwIGVudHJpZXMgYW5kIDE2MCBwb2ludGVycy4gIFRoaXMgaXMgdG8gc2VwYXJhdGUgY29kZSBmcm9tIGRhdGEsCi0gICAgIHdoaWNoIGlzIG11Y2ggZnJpZW5kbGllciBvbiB0aGUgY2FjaGUuICAqLwotICAKLSAgZm9yICg7IGkgPCBuZW50cmllczsgaSArPSAxNjApCi0gICAgewotICAgICAgaW50IGJsb2NrID0gKGkgKyAxNjAgPD0gbmVudHJpZXMgPyAxNjAgOiBuZW50cmllcyAtIGkpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2NrOyArK2opCi0JewotCSAgdW5zaWduZWQgY2hhciAqZW50cnksICpwdHI7Ci0JICB1bnNpZ25lZCBpbnQgbGR4OwotCi0JICBlbnRyeSA9IGNvbnRlbnRzICsgaSpQTFRfRU5UUllfU0laRSArIGoqNCo2OwotCSAgcHRyID0gY29udGVudHMgKyBpKlBMVF9FTlRSWV9TSVpFICsgYmxvY2sqNCo2ICsgaio4OwotCi0JICAvKiBsZHggWyVvNyArIHB0ciAtIGVudHJ5KzRdLCAlZzEgKi8KLQkgIGxkeCA9IDB4YzI1YmUwMDAgfCAoKHB0ciAtIGVudHJ5KzQpICYgMHgxZmZmKTsKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg4YTEwMDAwZiwgZW50cnkpOyAgICAvKiBtb3YgJW83LCVnNSAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0MDAwMDAwMiwgZW50cnkrNCk7ICAvKiBjYWxsIC4rOCAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSs4KTsgICAgICAgICAvKiBub3AgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxkeCwgZW50cnkrMTIpOyAgICAgICAgLyogbGR4IFslbzcrUF0sJWcxICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDgzYzNjMDAxLCBlbnRyeSsxNik7IC8qIGptcGwgJW83KyVnMSwlZzEgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4OWUxMDAwMDUsIGVudHJ5KzIwKTsgLyogbW92ICVnNSwlbzcgKi8KLQotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgY29udGVudHMgLSBlbnRyeSs0LCBwdHIpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgb2Zmc2V0IG9mIGEgcGFydGljdWxhciBwbHQgZW50cnkgd2l0aGluIHRoZSAucGx0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaW5kZXgpCi0gICAgIGludCBpbmRleDsKLXsKLSAgaW50IGJsb2NrLCBvZnM7Ci0KLSAgaWYgKGluZGV4IDwgTEFSR0VfUExUX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gaW5kZXggKiBQTFRfRU5UUllfU0laRTsKLQotICAvKiBTZWUgYWJvdmUgZm9yIGRldGFpbHMuICAqLwotCi0gIGJsb2NrID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgLyAxNjA7Ci0gIG9mcyA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOwotCi0gIHJldHVybiAoKGJmZF92bWEpKExBUkdFX1BMVF9USFJFU0hPTEQgKyBibG9jayoxNjApICogUExUX0VOVFJZX1NJWkUKLQkgICsgb2ZzICogNio0KTsKLX0KLQotc3RhdGljIGJmZF92bWEKLXNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0IChpbmRleCwgbWF4KQotICAgICBpbnQgaW5kZXgsIG1heDsKLXsKLSAgaW50IGJsb2NrLCBvZnMsIGxhc3Q7Ci0KLSAgQkZEX0FTU0VSVChpbmRleCA+PSBMQVJHRV9QTFRfVEhSRVNIT0xEKTsKLQotICAvKiBTZWUgYWJvdmUgZm9yIGRldGFpbHMuICAqLwotCi0gIGJsb2NrID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgLyAxNjA7Ci0gIG9mcyA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOwotICBsYXN0ID0gKG1heCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOwotCi0gIHJldHVybiAoKExBUkdFX1BMVF9USFJFU0hPTEQgKyBibG9jayoxNjApICogUExUX0VOVFJZX1NJWkUKLQkgICsgbGFzdCAqIDYqNAotCSAgKyBvZnMgKiA4KTsKLX0KLQotCi0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8ICEoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDMpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDg7Ci0KLSNpZiAwCi0JICAvKiBEb2Vzbid0IHdvcmsgZm9yIDY0LWJpdCAtZlBJQywgc2luY2Ugc2V0aGkvb3IgYnVpbGRzCi0JICAgICB1bnNpZ25lZCBudW1iZXJzLiAgSWYgd2UgcGVybWl0IG91cnNlbHZlcyB0byBtb2RpZnkKLQkgICAgIGNvZGUgc28gd2UgZ2V0IHNldGhpL3hvciwgdGhpcyBjb3VsZCB3b3JrLgotCSAgICAgUXVlc3Rpb246IGRvIHdlIGNvbnNpZGVyIGNvbmRpdGlvbmFsbHkgcmUtZW5hYmxpbmcKLSAgICAgICAgICAgICB0aGlzIGZvciAtZnBpYywgb25jZSB3ZSBrbm93IGFib3V0IG9iamVjdCBjb2RlIG1vZGVscz8gICovCi0JICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIGFkZAotCSAgICAgMHgxMDAwIHRvIHRoZSB2YWx1ZSBvZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHNvIHRoYXQgMTMKLQkgICAgIGJpdCByZWxvY2F0aW9ucyBoYXZlIGEgZ3JlYXRlciBjaGFuY2Ugb2Ygd29ya2luZy4gICovCi0JICBpZiAoc2dvdC0+X3Jhd19zaXplID49IDB4MTAwMAotCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9PSAwKQotCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPSAweDEwMDA7Ci0jZW5kaWYKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQljYXNlIFJfU1BBUkNfSElQTFQyMjoKLQljYXNlIFJfU1BBUkNfTE9QTFQxMDoKLQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQljYXNlIFJfU1BBUkNfUENQTFQyMjoKLQljYXNlIFJfU1BBUkNfUENQTFQxMDoKLQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0Ci0gICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBwcm9jZWR1cmUgbGlua2FnZQotICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JY2FzZSBSX1NQQVJDX1BDX0hIMjI6Ci0JY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX0RJU1A2NDoKLQljYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQljYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQljYXNlIFJfU1BBUkNfV0RJU1AxOToKLQljYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfODoKLQljYXNlIFJfU1BBUkNfMTY6Ci0JY2FzZSBSX1NQQVJDXzMyOgotCWNhc2UgUl9TUEFSQ19ISTIyOgotCWNhc2UgUl9TUEFSQ18yMjoKLQljYXNlIFJfU1BBUkNfMTM6Ci0JY2FzZSBSX1NQQVJDX0xPMTA6Ci0JY2FzZSBSX1NQQVJDX1VBMzI6Ci0JY2FzZSBSX1NQQVJDXzEwOgotCWNhc2UgUl9TUEFSQ18xMToKLQljYXNlIFJfU1BBUkNfNjQ6Ci0JY2FzZSBSX1NQQVJDX09MTzEwOgotCWNhc2UgUl9TUEFSQ19ISDIyOgotCWNhc2UgUl9TUEFSQ19ITTEwOgotCWNhc2UgUl9TUEFSQ19MTTIyOgotCWNhc2UgUl9TUEFSQ183OgotCWNhc2UgUl9TUEFSQ181OgotCWNhc2UgUl9TUEFSQ182OgotCWNhc2UgUl9TUEFSQ19ISVgyMjoKLQljYXNlIFJfU1BBUkNfTE9YMTA6Ci0JY2FzZSBSX1NQQVJDX0g0NDoKLQljYXNlIFJfU1BBUkNfTTQ0OgotCWNhc2UgUl9TUEFSQ19MNDQ6Ci0JY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JY2FzZSBSX1NQQVJDX1VBMTY6Ci0JICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlIHJlbG9jcwotCSAgICAgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYyBzZWN0aW9uIGluCi0JICAgICBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAKLQotCSAgICAgQnV0IGRvbid0IGRvIHRoaXMgZm9yIGRlYnVnZ2luZyBzZWN0aW9ucyAtLSB0aGlzIHNob3dzIHVwCi0JICAgICB3aXRoIERXQVJGMiAtLSBmaXJzdCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBsb2FkZWQsIGFuZAotCSAgICAgc2Vjb25kIGJlY2F1c2UgRFdBUkYgc2V6IHRoZSBkZWJ1ZyBpbmZvIGlzIG5vdCB0byBiZQotCSAgICAgYmlhc2VkIGJ5IHRoZSBsb2FkIGFkZHJlc3MuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZCAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCi0JICAgIHsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1JFR0lTVEVSOgotCSAgLyogTm90aGluZyB0byBkby4gICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikoXygiJXM6IGNoZWNrX3JlbG9jczogdW5oYW5kbGVkIHJlbG9jIHR5cGUgJWQiKSwKLQkJCQliZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpLAotCQkJCUVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlcgotICAgICAoYWx0aG91Z2ggd2UgY291bGQgYWN0dWFsbHkgZG8gaXQgaGVyZSkuICBUaGUgU1RUX05PVFlQRQotICAgICBjb25kaXRpb24gaXMgYSBoYWNrIHNwZWNpZmljYWxseSBmb3IgdGhlIE9yYWNsZSBsaWJyYXJpZXMKLSAgICAgZGVsaXZlcmVkIGZvciBTb2xhcmlzOyBmb3Igc29tZSBpbmV4cGxpY2FibGUgcmVhc29uLCB0aGV5IGRlZmluZQotICAgICBzb21lIG9mIHRoZWlyIGZ1bmN0aW9ucyBhcyBTVFRfTk9UWVBFIHdoZW4gdGhleSByZWFsbHkgc2hvdWxkIGJlCi0gICAgIFNUVF9GVU5DLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgV1BMVDMwIHJlbG9jIGluIGFuIGlucHV0Ci0gICAgICAgICAgICAgZmlsZSwgYnV0IG5vbmUgb2YgdGhlIGlucHV0IGZpbGVzIHdlcmUgZHluYW1pYyBvYmplY3RzLgotICAgICAgICAgICAgIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkIGEKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgV0RJU1AzMAotICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogVGhlIGZpcnN0IGZvdXIgYml0IGluIC5wbHQgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IFBMVF9IRUFERVJfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIC8qIFRvIHNpbXBsaWZ5IG1hdHRlcnMgbGF0ZXIsIGp1c3Qgc3RvcmUgdGhlIHBsdCBpbmRleCBoZXJlLiAgKi8KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBwbHQgZW50cmllcyBhcmUgcmVzZXJ2ZWQsIGFuZCB0aGUgcmVsb2NhdGlvbnMgbXVzdAotCSBwYWlyIHVwIGV4YWN0bHkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSAoUExUX0hFQURFUl9TSVpFL1BMVF9FTlRSWV9TSVpFCi0JCQkgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKTsKLQotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBzaXplIGlzIGJvdW5kZWQgYnkgdGhlIG1hZ25pdHVkZQotCSBvZiB0aGUgb2Zmc2V0IHdlIGNhbiBkZXNjcmliZSBpbiB0aGUgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+PSAoYmZkX3ZtYSkxIDw8IDMyKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfU1BBUkNfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlcgotICAgICB0byBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgMTYtYnl0ZXMgaXMgdGhlIHNpemUKLSAgICAgb2YgdGhlIGxhcmdlc3QgdHlwZSB0aGF0IHJlcXVpcmVzIGhhcmQgYWxpZ25tZW50IC0tIGxvbmcgZG91YmxlLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKLSAgICBwb3dlcl9vZl90d28gPSA0OwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGJvb2xlYW4gcmVscGx0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIHJlbHBsdCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKLQkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDAKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICBaZXJvIHRoZSBtZW1vcnkKLQkgZm9yIHRoZSBiZW5lZml0IG9mIC5yZWxhLnBsdCwgd2hpY2ggaGFzIDQgdW51c2VkIGVudHJpZXMKLQkgYXQgdGhlIGJlZ2lubmluZywgYW5kIHdlIGRvbid0IHdhbnQgZ2FyYmFnZS4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1BBUkNfUExURk1ULAotCQkJCQkJKGluZm8tPnNoYXJlZCAhPSAwKSArIDEpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgotICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1pZ2h0IG5lZWQgdG8gY29weQotICAgICByZWxvY3MuICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZQotICAgICBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50Ci0gICAgIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeSBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAotCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7Ci0KLQkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQotCSAgKytjOwotCX0KLQotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmluZHgsCi0JCQkgICAgICAoUFRSKSAmYyk7Ci0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBjcGFyZzsKLXsKLSAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBSZWxvY2F0ZSBhIFNQQVJDNjQgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGJmZF92bWEgZ290X2Jhc2U7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlKGluZm8pLT5oZ290ID09IE5VTEwpCi0gICAgZ290X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgZ290X2Jhc2UgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgc2dvdCA9IHNwbHQgPSBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9TUEFSQ19tYXhfc3RkKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gc3BhcmM2NF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcF9pdCA9IGZhbHNlOwotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQkJY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0JCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgotCQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQkJY2FzZSBSX1NQQVJDX1BDUExUMjI6Ci0JCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JCSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX0dPVDEwOgotCQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkJICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoIWluZm8tPnNoYXJlZAotCQkJICB8fCAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8ICEoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX1BDMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQzIyOgotCQljYXNlIFJfU1BBUkNfUENfSEgyMjoKLQkJY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQ19MTTIyOgotCQkgIGlmICghc3RyY21wKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSkKLQkJICAgIGJyZWFrOwotCQkgIC8qIEZBTExUSFJVICovCi0KLQkJY2FzZSBSX1NQQVJDXzg6Ci0JCWNhc2UgUl9TUEFSQ18xNjoKLQkJY2FzZSBSX1NQQVJDXzMyOgotCQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQMTY6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCQljYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQkJY2FzZSBSX1NQQVJDX0hJMjI6Ci0JCWNhc2UgUl9TUEFSQ18yMjoKLQkJY2FzZSBSX1NQQVJDXzEzOgotCQljYXNlIFJfU1BBUkNfTE8xMDoKLQkJY2FzZSBSX1NQQVJDX1VBMzI6Ci0JCWNhc2UgUl9TUEFSQ18xMDoKLQkJY2FzZSBSX1NQQVJDXzExOgotCQljYXNlIFJfU1BBUkNfNjQ6Ci0JCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQkJY2FzZSBSX1NQQVJDX0hIMjI6Ci0JCWNhc2UgUl9TUEFSQ19ITTEwOgotCQljYXNlIFJfU1BBUkNfTE0yMjoKLQkJY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCQljYXNlIFJfU1BBUkNfNzoKLQkJY2FzZSBSX1NQQVJDXzU6Ci0JCWNhc2UgUl9TUEFSQ182OgotCQljYXNlIFJfU1BBUkNfRElTUDY0OgotCQljYXNlIFJfU1BBUkNfSElYMjI6Ci0JCWNhc2UgUl9TUEFSQ19MT1gxMDoKLQkJY2FzZSBSX1NQQVJDX0g0NDoKLQkJY2FzZSBSX1NQQVJDX000NDoKLQkJY2FzZSBSX1NQQVJDX0w0NDoKLQkJY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JCWNhc2UgUl9TUEFSQ19VQTE2OgotCQkgIGlmIChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgICBza2lwX2l0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgaWYgKHNraXBfaXQpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgY29waWVkCi0JIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1biB0aW1lLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSkKLQl7Ci0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfU1BBUkNfUEMxMDoKLQkgICAgY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQ19ISDIyOgotCSAgICBjYXNlIFJfU1BBUkNfUENfSE0xMDoKLQkgICAgY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JICAgICAgaWYgKGggIT0gTlVMTAotCQkgICYmICFzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSkKLQkJYnJlYWs7Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBSX1NQQVJDX0RJU1A4OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDE2OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDMyOgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19XRElTUDE5OgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgICAgY2FzZSBSX1NQQVJDX0RJU1A2NDoKLQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQlicmVhazsKLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFJfU1BBUkNfODoKLQkgICAgY2FzZSBSX1NQQVJDXzE2OgotCSAgICBjYXNlIFJfU1BBUkNfMzI6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISTIyOgotCSAgICBjYXNlIFJfU1BBUkNfMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMzoKLQkgICAgY2FzZSBSX1NQQVJDX0xPMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19VQTMyOgotCSAgICBjYXNlIFJfU1BBUkNfMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMToKLQkgICAgY2FzZSBSX1NQQVJDXzY0OgotCSAgICBjYXNlIFJfU1BBUkNfT0xPMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISDIyOgotCSAgICBjYXNlIFJfU1BBUkNfSE0xMDoKLQkgICAgY2FzZSBSX1NQQVJDX0xNMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ183OgotCSAgICBjYXNlIFJfU1BBUkNfNToKLQkgICAgY2FzZSBSX1NQQVJDXzY6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISVgyMjoKLQkgICAgY2FzZSBSX1NQQVJDX0xPWDEwOgotCSAgICBjYXNlIFJfU1BBUkNfSDQ0OgotCSAgICBjYXNlIFJfU1BBUkNfTTQ0OgotCSAgICBjYXNlIFJfU1BBUkNfTDQ0OgotCSAgICBjYXNlIFJfU1BBUkNfVUE2NDoKLQkgICAgY2FzZSBSX1NQQVJDX1VBMTY6Ci0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JCWJvb2xlYW4gc2tpcDsKLQotCQlpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmFtZSA9Ci0JCSAgICAgIChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgICAoaW5wdXRfYmZkLAotCQkJZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCWVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkJJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsCi0JCQkJCQkJCWlucHV0X3NlY3Rpb24pLAotCQkJCQkgICBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgICAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQkgIH0KLQotCQlza2lwID0gZmFsc2U7Ci0KLQkJaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCQllbHNlCi0JCSAgewotCQkgICAgYmZkX3ZtYSBvZmY7Ci0KLQkJICAgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgICBpZiAob2ZmID09IE1JTlVTX09ORSkKLQkJICAgICAgc2tpcCA9IHRydWU7Ci0JCSAgICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCSAgfQotCi0JCW91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCS8qIE9wdGltaXplIHVuYWxpZ25lZCByZWxvYyB1c2FnZSBub3cgdGhhdCB3ZSBrbm93IHdoZXJlCi0JCSAgIGl0IGZpbmFsbHkgcmVzaWRlcy4gICovCi0JCXN3aXRjaCAocl90eXBlKQotCQkgIHsKLQkJICBjYXNlIFJfU1BBUkNfMTY6Ci0JCSAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ICYgMSkgcl90eXBlID0gUl9TUEFSQ19VQTE2OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDX1VBMTY6Ci0JCSAgICBpZiAoIShvdXRyZWwucl9vZmZzZXQgJiAxKSkgcl90eXBlID0gUl9TUEFSQ18xNjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ18zMjoKLQkJICAgIGlmIChvdXRyZWwucl9vZmZzZXQgJiAzKSByX3R5cGUgPSBSX1NQQVJDX1VBMzI7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfVUEzMjoKLQkJICAgIGlmICghKG91dHJlbC5yX29mZnNldCAmIDMpKSByX3R5cGUgPSBSX1NQQVJDXzMyOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDXzY0OgotCQkgICAgaWYgKG91dHJlbC5yX29mZnNldCAmIDcpIHJfdHlwZSA9IFJfU1BBUkNfVUE2NDsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ19VQTY0OgotCQkgICAgaWYgKCEob3V0cmVsLnJfb2Zmc2V0ICYgNykpIHJfdHlwZSA9IFJfU1BBUkNfNjQ7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJaWYgKHNraXApCi0JCSAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkJLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhlIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0JCSAgIGJlY29tZSBsb2NhbC4gICovCi0JCWVsc2UgaWYgKGggIT0gTlVMTAotCQkJICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHsKLQkJICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKLQkJICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDXzY0KQotCQkgICAgICB7Ci0JCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJCW91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWxvbmcgaW5keDsKLQotCQkJaWYgKGggPT0gTlVMTCkKLQkJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCQl8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQkgIH0KLQkJCWlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQkgIGluZHggPSAwOwotCQkJZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJICB7Ci0JCQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICAgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQotCQkJICAgIC8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkIGJlIGFibGUgdG8gbGluayBub24tcGljCi0JCQkgICAgICAgc2hhcmVkIGxpYnJhcmllcy4gICovCi0JCQkgICAgaWYgKGluZHggPT0gMCkKLQkJCSAgICAgIHsKLQkJCQlCRkRfRkFJTCAoKTsKLQkJCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCQkgIChfKCIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iKSwKLQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQotCQkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQotCQkJLyogRm9yIG5vbi1SRUxBVElWRSBkeW5hbWljIHJlbG9jYXRpb25zLCB3ZSBrZWVwIHRoZQotCQkJICAgc2FtZSBzeW1ib2wsIGFuZCBzbyBnZW5lcmFsbHkgdGhlIHNhbWUgYWRkZW5kLiAgQnV0Ci0JCQkgICB3ZSBkbyBuZWVkIHRvIGFkanVzdCB0aG9zZSByZWxvY2F0aW9ucyByZWZlcmVuY2luZwotCQkJICAgc2VjdGlvbnMuICAqLwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJCWlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgICAmJiBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJCSAgb3V0cmVsLnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCtzeW0tPnN0X3ZhbHVlOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCWJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICgoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JCSsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCQkvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotCQkgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotCQkgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkJaWYgKHNraXAKLQkJICAgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgICAgfHwgRUxGNjRfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQotCQkgIGNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0JICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYwotCQkgICAgIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBsb2NhbGx5LCBvciB0aGUgc3ltYm9sCi0JCSAgICAgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLiAgV2UKLQkJICAgICBtdXN0IGluaXRpYWxpemUgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLQkJICAgICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgOCwgd2UKLQkJICAgICB1c2UgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZQotCQkgICAgIGhhdmUgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzIGlzCi0JCSAgICAgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSBnb3RfYmFzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMKTsKLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgOC4gIFdlIHVzZQotCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jCi0JCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJCSArIG9mZik7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uOwotCQkgICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkJICgoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0JICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQljYXNlIFJfU1BBUkNfSElQTFQyMjoKLQljYXNlIFJfU1BBUkNfTE9QTFQxMDoKLQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQljYXNlIFJfU1BBUkNfUENQTFQyMjoKLQljYXNlIFJfU1BBUkNfUENQTFQxMDoKLQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotCQkgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotCQkgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgZ290byBkb19kZWZhdWx0OwotCSAgICB9Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpKTsKLQkgIGdvdG8gZG9fZGVmYXVsdDsKLQotCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQkgIHsKLQkgICAgYmZkX3ZtYSB4OwotCi0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgICAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uICYgMHgzZmYpICsgRUxGNjRfUl9UWVBFX0RBVEEgKHJlbC0+cl9pbmZvKTsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgxZmZmKSB8IChyZWxvY2F0aW9uICYgMHgxZmZmKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICB7Ci0JICAgIGJmZF92bWEgeDsKLQotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICAgIC8qIEFkanVzdCBmb3IgcGMtcmVsYXRpdmUtbmVzcy4gICovCi0JICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIHJlbG9jYXRpb24gLT0gcmVsLT5yX29mZnNldDsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgzMDNmZmYpIHwgKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCi0JCQkJICAgfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX0hJWDIyOgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiBeIE1JTlVTX09ORTsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgzZmZmZmYpIHwgKChyZWxvY2F0aW9uID4+IDEwKSAmIDB4M2ZmZmZmKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX0xPWDEwOgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gJiAweDNmZikgfCAweDFjMDA7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4MWZmZikgfCByZWxvY2F0aW9uOwotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQlkb19kZWZhdWx0OgotCSAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCXJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHIpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JCSAgICAmJiBob3d0by0+cGNfcmVsYXRpdmUpCi0JCSAgewotCQkgICAgLyogQXNzdW1lIHRoaXMgaXMgYSBjYWxsIHByb3RlY3RlZCBieSBvdGhlciBjb2RlIHRoYXQKLQkJICAgICAgIGRldGVjdCB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsCi0JCSAgICAgICB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgb3ZlcmZsb3cuICBJZiBub3QsIHRoZSAKLQkJICAgICAgIHByb2dyYW0gaXMgaG9zZWQgYW55d2F5LCBhbmQgYSBsaXR0bGUgd2FybmluZyBpc24ndAotCQkgICAgICAgZ29pbmcgdG8gaGVscC4gICovCi0JCSAgICBicmVhazsKLQkJICB9Ci0JCSAgCi0JICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJKGlucHV0X2JmZCwKLQkJCSBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJIHN5bS0+c3RfbmFtZSkpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgICB9Ci0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUExULiAgU2V0IGl0IHVwLiAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgaWYgKGgtPnBsdC5vZmZzZXQgPCBMQVJHRV9QTFRfVEhSRVNIT0xEKQotCXsKLQkgIHJlbGEucl9vZmZzZXQgPSBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChoLT5wbHQub2Zmc2V0KTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgbWF4ID0gc3BsdC0+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkU7Ci0JICByZWxhLnJfb2Zmc2V0ID0gc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgKGgtPnBsdC5vZmZzZXQsIG1heCk7Ci0JICByZWxhLnJfYWRkZW5kID0gLShzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChoLT5wbHQub2Zmc2V0KSArIDQpOwotCX0KLSAgICAgIHJlbGEucl9vZmZzZXQgKz0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0pNUF9TTE9UKTsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgaC0+cGx0Lm9mZnNldCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgR09ULiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIGFzZWN0aW9uICpzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfR0xPQl9EQVQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbHMgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19DT1BZKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cwotCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGFzZWN0aW9uICpzZ290OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGJvb2xlYW4gc2l6ZTsKLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOiAgIG5hbWUgPSAiLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogICBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CSAgICAgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSAucGx0IHNlY3Rpb24uICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgc3BhcmM2NF9lbGZfYnVpbGRfcGx0KG91dHB1dF9iZmQsIHNwbHQtPmNvbnRlbnRzLAotCQkJCXNwbHQtPl9yYXdfc2l6ZSAvIFBMVF9FTlRSWV9TSVpFKTsKLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JUExUX0VOVFJZX1NJWkU7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF82NCAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA4OwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IGM7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQotICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOwotCi0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaW50IGluZHg7Ci0KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkgICAgIChQVFIpICgoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOwotCi0JICArK2M7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCi0gICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPSBjICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgZV9mbGFncyBmaWVsZC4gKi8KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBib29sZWFuIGVycm9yOwotICBmbGFnd29yZCBuZXdfZmxhZ3MsIG9sZF9mbGFnczsKLSAgaW50IG5ld19tbSwgb2xkX21tOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpICAgLyogRmlyc3QgY2FsbCwgbm8gZmxhZ3Mgc2V0ICovCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykgICAgICAvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLwotICAgIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvbXBhdGlibGUgZmxhZ3MgKi8KLSAgICB7Ci0gICAgICBlcnJvciA9IGZhbHNlOwotICAKLSAgICAgIG9sZF9mbGFncyB8PSAobmV3X2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzF8RUZfU1BBUkNfSEFMX1IxKSk7Ci0gICAgICBuZXdfZmxhZ3MgfD0gKG9sZF9mbGFncyAmIChFRl9TUEFSQ19TVU5fVVMxfEVGX1NQQVJDX0hBTF9SMSkpOwotICAgICAgaWYgKChvbGRfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKSA9PQotICAgICAgICAgICAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgKF8oIiVzOiBsaW5raW5nIFVsdHJhU1BBUkMgc3BlY2lmaWMgd2l0aCBIQUwgc3BlY2lmaWMgY29kZSIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIC8qIENob29zZSB0aGUgbW9zdCByZXN0cmljdGl2ZSBtZW1vcnkgb3JkZXJpbmcgKi8KLSAgICAgIG9sZF9tbSA9IChvbGRfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKTsKLSAgICAgIG5ld19tbSA9IChuZXdfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKTsKLSAgICAgIG9sZF9mbGFncyAmPSB+RUZfU1BBUkNWOV9NTTsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfU1BBUkNWOV9NTTsKLSAgICAgIGlmIChuZXdfbW0gPCBvbGRfbW0pIG9sZF9tbSA9IG5ld19tbTsKLSAgICAgIG9sZF9mbGFncyB8PSBvbGRfbW07Ci0gICAgICBuZXdfZmxhZ3MgfD0gb2xkX21tOwotCi0gICAgICAvKiBXYXJuIGFib3V0IGFueSBvdGhlciBtaXNtYXRjaGVzICovCi0gICAgICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCIlczogdXNlcyBkaWZmZXJlbnQgZV9mbGFncyAoMHglbHgpIGZpZWxkcyB0aGFuIHByZXZpb3VzIG1vZHVsZXMgKDB4JWx4KSIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0gICAgICAgIH0KLQotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBvbGRfZmxhZ3M7Ci0KLSAgICAgIGlmIChlcnJvcikKLSAgICAgICAgewotICAgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGEgU1BBUkM2NCBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIG1hY2ggPSBiZmRfbWFjaF9zcGFyY192OTsKLSAgCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0gICAgbWFjaCA9IGJmZF9tYWNoX3NwYXJjX3Y5YTsKLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBtYWNoKTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmNjRfc3BhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmNjQtc3BhcmMiCi0jZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAweDEwMDAwMAotCi0vKiBUaGlzIGlzIHRoZSBvZmZpY2lhbCBBQkkgdmFsdWUuICAqLwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNX1NQQVJDVjkKLQotLyogVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3ZSB1c2VkIGJlZm9yZSB0aGUgQUJJIHdhcyByZWxlYXNlZC4gICovCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgRU1fT0xEX1NQQVJDVjkKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBcCi0gIHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIHNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgXAotICBzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLSAgc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0gIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIFwKLSAgc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotICBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotICBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gIHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCBcCi0gIHNwYXJjNjRfZWxmX29iamVjdF9wCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDEKLQotLyogU2VjdGlvbiA1LjIuNCBvZiB0aGUgQUJJIHNwZWNpZmllcyBhIDI1Ni1ieXRlIGJvdW5kYXJ5IGZvciB0aGUgdGFibGUuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50IDgKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgOAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgUExUX0hFQURFUl9TSVpFCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC5jIGIvYmZkL2VsZjY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmI1YjUuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBFTEYgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUJCTY0Ci0KLSNpbmNsdWRlICJlbGZjb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW5hYmkuYyBiL2JmZC9lbGZhcm0tbmFiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NmYWRhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tbmFiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG5ldyBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpZm5kZWYgTlVNX0VMRU0KLSNkZWZpbmUgTlVNX0VMRU0oYSkgIChzaXplb2YgKGEpIC8gKHNpemVvZiAoYSlbMF0pKQotI2VuZGlmCi0KLSNkZWZpbmUgVVNFX1JFTAotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgICAgICAgICAiZWxmMzItbGl0dGxlYXJtIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICAgICAgICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybSIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0bwotCi0jZGVmaW5lIEFSTV9FTEZfQUJJX1ZFUlNJT04JCTAKLSNkZWZpbmUgQVJNX0VMRl9PU19BQklfVkVSU0lPTgkJRUxGT1NBQklfQVJNCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1BDMjQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9QQzEzLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUEMxMyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAvKiAxNiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzEyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA4ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwOGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9BQlM1LAkvKiB0eXBlICovCi0JIDYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fQUJTNSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2UwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1NCUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1NCUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzIyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMywJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fUEM4LAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzgiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BTVBfVkNBTEw5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fU1dJMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU1dJMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1NXSTgsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TV0k4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlc2UgbmV4dCB0d28gcmVsb2NzIGFyZSBkZWZpbmVkLCBidXQgSSBkbyBub3Qga25vdyB3aGF0IHRoZXkgZG8uICAqLwotICAKLSAgSE9XVE8gKFJfQVJNX1hQQzI1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1hQQzI1IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9YUEMyMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9YUEMyMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUaGVzZSBuZXh0IHRocmVlIHJlbG9jcyBhcmUgbm90IGRlZmluZWQsIGJ1dCB3ZSBuZWVkIHRvIGZpbGwgdGhlIHNwYWNlLiAgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xNyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY3MgdXNlZCBpbiBBUk0gTGludXggKi8KLSAgCi0gIEhPV1RPIChSX0FSTV9DT1BZLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0NPUFkiLAkJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9HTE9CX0RBVCwJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dMT0JfREFUIiwJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAgICAgICAgCi0gIEhPV1RPIChSX0FSTV9KVU1QX1NMT1QsCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9KVU1QX1NMT1QiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX1JFTEFUSVZFLAkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fUkVMQVRJVkUiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVE9GRiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HT1RPRkYiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVFBDLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVFBDIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HT1QzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAgICAgICAgCi0gIEhPV1RPIChSX0FSTV9QTFQzMiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDI2LCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9QTFQzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRW5kIG9mIHJlbG9jcyB1c2VkIGluIEFSTSBMaW51eCAqLyAKLQotICBIT1dUTyAoUl9BUk1fUlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkFCUzMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SUEMyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUlBDMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SQkFTRSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV92dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSk7ICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzExLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzExIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgcGMgcmVsYXRpdmUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzksCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAKLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiBiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqIGVsZl9yZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZWxmX3JlbG9jLT5yX2luZm8pOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fVEhNX1BDMTE6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdGhtX3BjMTFfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fVEhNX1BDOToKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHJfdHlwZSA+PSBOVU1fRUxFTSAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKSkKLQliZmRfcmVsb2MtPmhvd3RvID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0gIAotc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAKLSAgewotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgYmZkX3JlbG9jX3ZhbDsKLSAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgIGVsZl9yZWxvY192YWw7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCBlbGYzMl9hcm1fcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9OT05FfSwKLSAge0JGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgUl9BUk1fUEMyNH0sCi0gIHtCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzMyfSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgUl9BUk1fUkVMMzJ9LAotICB7QkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlM4fSwKLSAge0JGRF9SRUxPQ18xNiwgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTMTZ9LAotICB7QkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLCAgICAgICBSX0FSTV9BQlMxMn0sCi0gIHtCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwgICAgIFJfQVJNX1RITV9BQlM1fSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgUl9BUk1fVEhNX1BDMjJ9LAotICB7QkZEX1JFTE9DX0FSTV9DT1BZLCAgICAgICAgICAgICBSX0FSTV9DT1BZfSwKLSAge0JGRF9SRUxPQ19BUk1fR0xPQl9EQVQsICAgICAgICAgUl9BUk1fR0xPQl9EQVR9LAotICB7QkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsICAgICAgICBSX0FSTV9KVU1QX1NMT1R9LAotICB7QkZEX1JFTE9DX0FSTV9SRUxBVElWRSwgICAgICAgICBSX0FSTV9SRUxBVElWRX0sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVE9GRiwgICAgICAgICAgIFJfQVJNX0dPVE9GRn0sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVFBDLCAgICAgICAgICAgIFJfQVJNX0dPVFBDfSwKLSAge0JGRF9SRUxPQ19BUk1fR09UMzIsICAgICAgICAgICAgUl9BUk1fR09UMzJ9LAotICB7QkZEX1JFTE9DX0FSTV9QTFQzMiwgICAgICAgICAgICBSX0FSTV9QTFQzMn0KLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgotICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTSAoZWxmMzJfYXJtX3JlbG9jX21hcCk7IGkgKyspCi0JaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgICAKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotfQotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW9hYmkuYyBiL2JmZC9lbGZhcm0tb2FiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFkODNlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tb2FiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG9sZCBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0tb2FiaS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBVU0VfUkVMQQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0tb2FiaSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgICAgICAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybS1vYWJpIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgZWxmMzJfYXJtX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICAwCi0KLSNkZWZpbmUgQVJNX0VMRl9BQklfVkVSU0lPTgkJMAotI2RlZmluZSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OCQkwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9QQzI0LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMxMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwOGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fQUJTNSwJLyogdHlwZSAqLwotCSA2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TQlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TQlJFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQU1QX1ZDQUxMOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEMxMSwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMxMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEM5LAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotICAKLSAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotCi0gIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JBQlMzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUlBDMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogTG9jYXRlIGEgcmVsb2MgaW4gdGhlIGhvd3RvIHRhYmxlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQKLSAgIHdoZW4gdGhlIGVudHJ5IG51bWJlciBpcyBpcyA+IFJfQVJNX0dOVV9WVElOSEVSSVQuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZmluZF9ob3d0byAocl90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgcl90eXBlOwotewotICBpbnQgaTsKLSAgCi0gIGZvciAoaSA9IE5VTV9FTEVNIChlbGYzMl9hcm1faG93dG9fdGFibGUpOyBpLS07KQotICAgIGlmIChlbGYzMl9hcm1faG93dG9fdGFibGUgW2ldLnR5cGUgPT0gcl90eXBlKQotICAgICAgcmV0dXJuIGVsZjMyX2FybV9ob3d0b190YWJsZSArIGk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyk7Ci0KLSAgaWYgKHJfdHlwZSA8PSBSX0FSTV9HTlVfVlRJTkhFUklUKQotICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV9ob3d0b190YWJsZVtyX3R5cGVdOwotICBlbHNlCi0gICAgYmZkX3JlbG9jLT5ob3d0byA9IGZpbmRfaG93dG8gKHJfdHlwZSk7Ci19Ci0KLXN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwCi0gIHsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCBlbGYzMl9hcm1fcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9OT05FIH0sCi0gIHtCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIFJfQVJNX1BDMjQgfSwKLSAge0JGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTMzIgfSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgUl9BUk1fUkVMMzIgfSwKLSAge0JGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTOCB9LAotICB7QkZEX1JFTE9DXzE2LCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMxNiB9LAotICB7QkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLCAgICAgICBSX0FSTV9BQlMxMiB9LAotICB7QkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQsICAgICBSX0FSTV9USE1fQUJTNSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzLCBSX0FSTV9USE1fUEMyMiB9LAotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9TQlJFTDMyIH0sCi0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX0FNUF9WQ0FMTDkgfSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiwgUl9BUk1fVEhNX1BDMTEgfSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LCAgUl9BUk1fVEhNX1BDOSB9LCAgCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsICAgICAgIFJfQVJNX0dOVV9WVElOSEVSSVQgfSwKLSAge0JGRF9SRUxPQ19WVEFCTEVfRU5UUlksICAgICAgICAgUl9BUk1fR05VX1ZURU5UUlkgfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gTlVNX0VMRU0gKGVsZjMyX2FybV9yZWxvY19tYXApOyBpLS07KQotICAgIGlmIChlbGYzMl9hcm1fcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV9ob3d0b190YWJsZSBbZWxmMzJfYXJtX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQVJNX1BMVDMyKQotICAgIHJldHVybiBmaW5kX2hvd3RvIChSX0FSTV9QTFQzMik7Ci0gIAotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJlbGYzMi1hcm0uaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGZjb2RlLmggYi9iZmQvZWxmY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWExOTQzLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEzICswLDAgQEAKLS8qIEVMRiBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4gIFN1ZmZpY2llbnQgc3VwcG9ydCBmb3IgZ2RiLgotCi0gICBSZXdyaXR0ZW4gYnkgTWFyayBFaWNoaW4gQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbgotICAgcHVibGlzaGVkIGluICJTeXN0ZW0gViBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlIiwgY2hhcHRlcnMgNAotICAgYW5kIDUsIGFzIHdlbGwgYXMgdGhlIHZhcmlvdXMgIlByb2Nlc3NvciBTdXBwbGVtZW50IiBkb2N1bWVudHMKLSAgIGRlcml2ZWQgZnJvbSBpdC4gQWRkZWQgc3VwcG9ydCBmb3IgYXNzZW1ibGVyIGFuZCBvdGhlciBvYmplY3QgZmlsZQotICAgdXRpbGl0aWVzLiAgRnVydGhlciB3b3JrIGRvbmUgYnkgS2VuIFJhZWJ1cm4gKEN5Z251cyBTdXBwb3J0KSwgTWljaGFlbAotICAgTWVpc3NuZXIgKE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiksIGFuZCBQZXRlciBIb29nZW5ib29tIChVbml2ZXJzaXR5Ci0gICBvZiBVdGFoKSB0byBmaW5pc2ggYW5kIGV4dGVuZCB0aGlzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFByb2JsZW1zIGFuZCBvdGhlciBpc3N1ZXMgdG8gcmVzb2x2ZS4KLQotICAgKDEpCUJGRCBleHBlY3RzIHRoZXJlIHRvIGJlIHNvbWUgZml4ZWQgbnVtYmVyIG9mICJzZWN0aW9ucyIgaW4KLSAgICAgICAgdGhlIG9iamVjdCBmaWxlLiAgSS5FLiB0aGVyZSBpcyBhICJzZWN0aW9uX2NvdW50IiB2YXJpYWJsZSBpbiB0aGUKLQliZmQgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMuICBIb3dldmVyLCBFTEYKLQlzdXBwb3J0cyBtdWx0aXBsZSAidmlld3MiIG9mIGEgZmlsZS4gIEluIHBhcnRpY3VsYXIsIHdpdGggY3VycmVudAotCWltcGxlbWVudGF0aW9ucywgZXhlY3V0YWJsZSBmaWxlcyB0eXBpY2FsbHkgaGF2ZSB0d28gdGFibGVzLCBhCi0JcHJvZ3JhbSBoZWFkZXIgdGFibGUgYW5kIGEgc2VjdGlvbiBoZWFkZXIgdGFibGUsIGJvdGggb2Ygd2hpY2gKLQlwYXJ0aXRpb24gdGhlIGV4ZWN1dGFibGUuCi0KLQlJbiBFTEYtc3BlYWssIHRoZSAibGlua2luZyB2aWV3IiBvZiB0aGUgZmlsZSB1c2VzIHRoZSBzZWN0aW9uIGhlYWRlcgotCXRhYmxlIHRvIGFjY2VzcyAic2VjdGlvbnMiIHdpdGhpbiB0aGUgZmlsZSwgYW5kIHRoZSAiZXhlY3V0aW9uIHZpZXciCi0JdXNlcyB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUgdG8gYWNjZXNzICJzZWdtZW50cyIgd2l0aGluIHRoZSBmaWxlLgotCSJTZWdtZW50cyIgdHlwaWNhbGx5IG1heSBjb250YWluIGFsbCB0aGUgZGF0YSBmcm9tIG9uZSBvciBtb3JlCi0JInNlY3Rpb25zIi4KLQotCU5vdGUgdGhhdCB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaXMgb3B0aW9uYWwgaW4gRUxGIGV4ZWN1dGFibGVzLAotCWJ1dCBpdCBpcyB0aGlzIGluZm9ybWF0aW9uIHRoYXQgaXMgbW9zdCB1c2VmdWwgdG8gZ2RiLiAgSWYgdGhlCi0Jc2VjdGlvbiBoZWFkZXIgdGFibGUgaXMgbWlzc2luZywgdGhlbiBnZGIgc2hvdWxkIHByb2JhYmx5IHRyeQotCXRvIG1ha2UgZG8gd2l0aCB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUuICAoRklYTUUpCi0KLSAgICgyKSAgVGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBvbmNlIGluIDMyLWJpdCBtb2RlIGFuZAotCW9uY2UgaW4gNjQtYml0IG1vZGUuICBNb3JlIG9mIGl0IHNob3VsZCBiZSBtYWRlIHNpemUtaW5kZXBlbmRlbnQKLQlhbmQgbW92ZWQgaW50byBlbGYuYy4KLQotICAgKDMpCUVMRiBzZWN0aW9uIHN5bWJvbHMgYXJlIGhhbmRsZWQgcmF0aGVyIHNsb3BwaWx5IG5vdy4gIFRoaXMgc2hvdWxkCi0JYmUgY2xlYW5lZCB1cCwgYW5kIEVMRiBzZWN0aW9uIHN5bWJvbHMgcmVjb25jaWxlZCB3aXRoIEJGRCBzZWN0aW9uCi0Jc3ltYm9scy4KLQotICAgKDQpICBXZSBuZWVkIGEgcHVibGlzaGVkIHNwZWMgZm9yIDY0LWJpdCBFTEYuICBXZSd2ZSBnb3Qgc29tZSBzdHVmZiBoZXJlCi0JdGhhdCB3ZSdyZSB1c2luZyBmb3IgU1BBUkMgVjkgNjQtYml0IGNoaXBzLCBidXQgZG9uJ3QgYXNzdW1lIHRoYXQKLQlpdCdzIGNhc3QgaW4gc3RvbmUuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFJlbmFtaW5nIHN0cnVjdHVyZXMsIHR5cGVkZWZzLCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyB0byBiZSBzaXplLXNwZWNpZmljLiAgKi8KLSNkZWZpbmUgRWxmX0V4dGVybmFsX0VoZHIJTkFNRShFbGYsRXh0ZXJuYWxfRWhkcikKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1N5bQlOQU1FKEVsZixFeHRlcm5hbF9TeW0pCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9TaGRyCU5BTUUoRWxmLEV4dGVybmFsX1NoZHIpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9QaGRyCU5BTUUoRWxmLEV4dGVybmFsX1BoZHIpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9SZWwJTkFNRShFbGYsRXh0ZXJuYWxfUmVsKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUmVsYQlOQU1FKEVsZixFeHRlcm5hbF9SZWxhKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfRHluCU5BTUUoRWxmLEV4dGVybmFsX0R5bikKLQotI2RlZmluZSBlbGZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAlOQU1FKGJmZF9lbGYsY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAlOQU1FKGJmZF9lbGYsY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKQotI2RlZmluZSBlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFwKLSAgTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLSNkZWZpbmUgZWxmX29iamVjdF9wCQkJTkFNRShiZmRfZWxmLG9iamVjdF9wKQotI2RlZmluZSBlbGZfY29yZV9maWxlX3AJCQlOQU1FKGJmZF9lbGYsY29yZV9maWxlX3ApCi0jZGVmaW5lIGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCU5BTUUoYmZkX2VsZixnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2RlZmluZSBlbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFwKLSAgTkFNRShiZmRfZWxmLGdldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2NfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3JlbG9jX2luKQotI2RlZmluZSBlbGZfc3dhcF9yZWxvY2FfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3JlbG9jYV9pbikKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2Nfb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY19vdXQpCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jYV9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3JlbG9jYV9vdXQpCi0jZGVmaW5lIGVsZl9zd2FwX3N5bWJvbF9pbgkJTkFNRShiZmRfZWxmLHN3YXBfc3ltYm9sX2luKQotI2RlZmluZSBlbGZfc3dhcF9zeW1ib2xfb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9zeW1ib2xfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9waGRyX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9waGRyX2luKQotI2RlZmluZSBlbGZfc3dhcF9waGRyX291dAkJTkFNRShiZmRfZWxmLHN3YXBfcGhkcl9vdXQpCi0jZGVmaW5lIGVsZl9zd2FwX2R5bl9pbgkJCU5BTUUoYmZkX2VsZixzd2FwX2R5bl9pbikKLSNkZWZpbmUgZWxmX3N3YXBfZHluX291dAkJTkFNRShiZmRfZWxmLHN3YXBfZHluX291dCkKLSNkZWZpbmUgZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZAlOQU1FKGJmZF9lbGYsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotI2RlZmluZSBlbGZfY2Fub25pY2FsaXplX3JlbG9jCQlOQU1FKGJmZF9lbGYsY2Fub25pY2FsaXplX3JlbG9jKQotI2RlZmluZSBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlCQlOQU1FKGJmZF9lbGYsc2x1cnBfc3ltYm9sX3RhYmxlKQotI2RlZmluZSBlbGZfZ2V0X3N5bXRhYgkJCU5BTUUoYmZkX2VsZixnZXRfc3ltdGFiKQotI2RlZmluZSBlbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgTkFNRShiZmRfZWxmLGNhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYikKLSNkZWZpbmUgZWxmX21ha2VfZW1wdHlfc3ltYm9sCQlOQU1FKGJmZF9lbGYsbWFrZV9lbXB0eV9zeW1ib2wpCi0jZGVmaW5lIGVsZl9nZXRfc3ltYm9sX2luZm8JCU5BTUUoYmZkX2VsZixnZXRfc3ltYm9sX2luZm8pCi0jZGVmaW5lIGVsZl9nZXRfbGluZW5vCQkJTkFNRShiZmRfZWxmLGdldF9saW5lbm8pCi0jZGVmaW5lIGVsZl9zZXRfYXJjaF9tYWNoCQlOQU1FKGJmZF9lbGYsc2V0X2FyY2hfbWFjaCkKLSNkZWZpbmUgZWxmX2ZpbmRfbmVhcmVzdF9saW5lCQlOQU1FKGJmZF9lbGYsZmluZF9uZWFyZXN0X2xpbmUpCi0jZGVmaW5lIGVsZl9zaXplb2ZfaGVhZGVycwkJTkFNRShiZmRfZWxmLHNpemVvZl9oZWFkZXJzKQotI2RlZmluZSBlbGZfc2V0X3NlY3Rpb25fY29udGVudHMJTkFNRShiZmRfZWxmLHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2RlZmluZSBlbGZfbm9faW5mb190b19ob3d0bwkJTkFNRShiZmRfZWxmLG5vX2luZm9fdG9faG93dG8pCi0jZGVmaW5lIGVsZl9ub19pbmZvX3RvX2hvd3RvX3JlbAlOQU1FKGJmZF9lbGYsbm9faW5mb190b19ob3d0b19yZWwpCi0jZGVmaW5lIGVsZl9maW5kX3NlY3Rpb24JCU5BTUUoYmZkX2VsZixmaW5kX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9iZmRfbGlua19hZGRfc3ltYm9scwlOQU1FKGJmZF9lbGYsYmZkX2xpbmtfYWRkX3N5bWJvbHMpCi0jZGVmaW5lIGVsZl9hZGRfZHluYW1pY19lbnRyeQkJTkFNRShiZmRfZWxmLGFkZF9keW5hbWljX2VudHJ5KQotI2RlZmluZSBlbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIJTkFNRShiZmRfZWxmLHdyaXRlX3NoZHJzX2FuZF9laGRyKQotI2RlZmluZSBlbGZfd3JpdGVfb3V0X3BoZHJzCQlOQU1FKGJmZF9lbGYsd3JpdGVfb3V0X3BoZHJzKQotI2RlZmluZSBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0gIE5BTUUoYmZkX2VsZixsaW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKQotI2RlZmluZSBlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iZmRfZmluYWxfbGluawkJTkFNRShiZmRfZWxmLGJmZF9maW5hbF9saW5rKQotI2RlZmluZSBlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gTkFNRShiZmRfZWxmLGNyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKQotI2RlZmluZSBlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gTkFNRShiZmRfZWxmLGZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKQotI2RlZmluZSBlbGZfZ2Nfc2VjdGlvbnMJCQlOQU1FKF9iZmRfZWxmLGdjX3NlY3Rpb25zKQotI2RlZmluZSBlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzIFwKLSAgTkFNRShfYmZkX2VsZixnY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpCi0jZGVmaW5lIGVsZl9nY19jb21tb25fZmluYWxfbGluawlOQU1FKF9iZmRfZWxmLGdjX2NvbW1vbl9maW5hbF9saW5rKQotI2RlZmluZSBlbGZfZ2NfcmVjb3JkX3Z0aW5oZXJpdAkJTkFNRShfYmZkX2VsZixnY19yZWNvcmRfdnRpbmhlcml0KQotI2RlZmluZSBlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkJCU5BTUUoX2JmZF9lbGYsZ2NfcmVjb3JkX3Z0ZW50cnkpCi0KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgRUxGX1JfSU5GTyhYLFkpCUVMRjY0X1JfSU5GTyhYLFkpCi0jZGVmaW5lIEVMRl9SX1NZTShYKQlFTEY2NF9SX1NZTShYKQotI2RlZmluZSBFTEZfUl9UWVBFKFgpCUVMRjY0X1JfVFlQRShYKQotI2RlZmluZSBFTEZDTEFTUwlFTEZDTEFTUzY0Ci0jZGVmaW5lIEZJTEVfQUxJR04JOAotI2RlZmluZSBMT0dfRklMRV9BTElHTgkzCi0jZW5kaWYKLSNpZiBBUkNIX1NJWkUgPT0gMzIKLSNkZWZpbmUgRUxGX1JfSU5GTyhYLFkpCUVMRjMyX1JfSU5GTyhYLFkpCi0jZGVmaW5lIEVMRl9SX1NZTShYKQlFTEYzMl9SX1NZTShYKQotI2RlZmluZSBFTEZfUl9UWVBFKFgpCUVMRjMyX1JfVFlQRShYKQotI2RlZmluZSBFTEZDTEFTUwlFTEZDTEFTUzMyCi0jZGVmaW5lIEZJTEVfQUxJR04JNAotI2RlZmluZSBMT0dfRklMRV9BTElHTgkyCi0jZW5kaWYKLQotLyogU3RhdGljIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCBlbGZfc3dhcF9laGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfRWhkciAqLCBFbGZfSW50ZXJuYWxfRWhkciAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc3dhcF9laGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX0VoZHIgKiwgRWxmX0V4dGVybmFsX0VoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX3N3YXBfc2hkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1NoZHIgKiwgRWxmX0ludGVybmFsX1NoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX3N3YXBfc2hkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICosIEVsZl9FeHRlcm5hbF9TaGRyICopKTsKLQotI2RlZmluZSBlbGZfc3RyaW5ndGFiX2luaXQgX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQKLQotI2RlZmluZSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBiZmRfc2l6ZV90eXBlLAotCSAgIGFyZWxlbnQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gZWxmX3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9maWxlX3AgUEFSQU1TICgoRWxmX0V4dGVybmFsX0VoZHIgKikpOwotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIGVsZl9kZWJ1Z19zZWN0aW9uIFBBUkFNUyAoKGludCwgRWxmX0ludGVybmFsX1NoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX2RlYnVnX2ZpbGUgUEFSQU1TICgoRWxmX0ludGVybmFsX0VoZHIgKikpOwotc3RhdGljIGNoYXIgKmVsZl9zeW1ib2xfZmxhZ3MgUEFSQU1TICgoZmxhZ3dvcmQpKTsKLSNlbmRpZgotDAotLyogU3RydWN0dXJlIHN3YXBwaW5nIHJvdXRpbmVzICovCi0KLS8qIFNob3VsZCBwZXJoYXBzIHVzZSBwdXRfb2Zmc2V0LCBwdXRfd29yZCwgZXRjLiAgRm9yIG5vdywgdGhlIHR3byB2ZXJzaW9ucwotICAgY2FuIGJlIGhhbmRsZWQgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIDMyIGJpdHMgb3IgInRoZSBsb25nIHR5cGUiLiAgKi8KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIHB1dF9zaWduZWRfd29yZAliZmRfaF9wdXRfc2lnbmVkXzY0Ci0jZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF82NAotI2RlZmluZSBnZXRfc2lnbmVkX3dvcmQJYmZkX2hfZ2V0X3NpZ25lZF82NAotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF8zMgotI2RlZmluZSBwdXRfc2lnbmVkX3dvcmQJYmZkX2hfcHV0X3NpZ25lZF8zMgotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfMzIKLSNkZWZpbmUgZ2V0X3NpZ25lZF93b3JkCWJmZF9oX2dldF9zaWduZWRfMzIKLSNlbmRpZgotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgc3ltYm9sIGluIGludGVybmFsCi0gICBmb3JtYXQuICovCi0KLXZvaWQKLWVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1N5bSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpkc3Q7Ci17Ci0gIGRzdC0+c3RfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfbmFtZSk7Ci0gIGRzdC0+c3RfdmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfdmFsdWUpOwotICBkc3QtPnN0X3NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3Rfc2l6ZSk7Ci0gIGRzdC0+c3RfaW5mbyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9pbmZvKTsKLSAgZHN0LT5zdF9vdGhlciA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9vdGhlcik7Ci0gIGRzdC0+c3Rfc2huZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3NobmR4KTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzeW1ib2wgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbAotICAgZm9ybWF0LiAqLwotCi12b2lkCi1lbGZfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCBzcmMsIGNkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3JjOwotICAgICBQVFIgY2RzdDsKLXsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZHN0ID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgY2RzdDsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnN0X25hbWUsIGRzdC0+c3RfbmFtZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnN0X3ZhbHVlLCBkc3QtPnN0X3ZhbHVlKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c3Rfc2l6ZSwgZHN0LT5zdF9zaXplKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3RfaW5mbywgZHN0LT5zdF9pbmZvKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3Rfb3RoZXIsIGRzdC0+c3Rfb3RoZXIpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+c3Rfc2huZHgsIGRzdC0+c3Rfc2huZHgpOwotfQotCi0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIGZpbGUgaGVhZGVyIGluCi0gICBpbnRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9laGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfRWhkciAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfRWhkciAqZHN0OwotewotICBtZW1jcHkgKGRzdC0+ZV9pZGVudCwgc3JjLT5lX2lkZW50LCBFSV9OSURFTlQpOwotICBkc3QtPmVfdHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV90eXBlKTsKLSAgZHN0LT5lX21hY2hpbmUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfbWFjaGluZSk7Ci0gIGRzdC0+ZV92ZXJzaW9uID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3ZlcnNpb24pOwotICBkc3QtPmVfZW50cnkgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9lbnRyeSk7Ci0gIGRzdC0+ZV9waG9mZiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3Bob2ZmKTsKLSAgZHN0LT5lX3Nob2ZmID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hvZmYpOwotICBkc3QtPmVfZmxhZ3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfZmxhZ3MpOwotICBkc3QtPmVfZWhzaXplID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX2Voc2l6ZSk7Ci0gIGRzdC0+ZV9waGVudHNpemUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhlbnRzaXplKTsKLSAgZHN0LT5lX3BobnVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3BobnVtKTsKLSAgZHN0LT5lX3NoZW50c2l6ZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaGVudHNpemUpOwotICBkc3QtPmVfc2hudW0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hudW0pOwotICBkc3QtPmVfc2hzdHJuZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hzdHJuZHgpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBmaWxlIGhlYWRlciBpbgotICAgZXh0ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotZWxmX3N3YXBfZWhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9FaGRyICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9FaGRyICpkc3Q7Ci17Ci0gIG1lbWNweSAoZHN0LT5lX2lkZW50LCBzcmMtPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0gIC8qIG5vdGUgdGhhdCBhbGwgZWxlbWVudHMgb2YgZHN0IGFyZSAqYXJyYXlzIG9mIHVuc2lnbmVkIGNoYXIqIGFscmVhZHkuLi4gKi8KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfdHlwZSwgZHN0LT5lX3R5cGUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9tYWNoaW5lLCBkc3QtPmVfbWFjaGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5lX3ZlcnNpb24sIGRzdC0+ZV92ZXJzaW9uKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9lbnRyeSwgZHN0LT5lX2VudHJ5KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9waG9mZiwgZHN0LT5lX3Bob2ZmKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9zaG9mZiwgZHN0LT5lX3Nob2ZmKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPmVfZmxhZ3MsIGRzdC0+ZV9mbGFncyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX2Voc2l6ZSwgZHN0LT5lX2Voc2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BoZW50c2l6ZSwgZHN0LT5lX3BoZW50c2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BobnVtLCBkc3QtPmVfcGhudW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaGVudHNpemUsIGRzdC0+ZV9zaGVudHNpemUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaG51bSwgZHN0LT5lX3NobnVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfc2hzdHJuZHgsIGRzdC0+ZV9zaHN0cm5keCk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9TaGRyICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpkc3Q7Ci17Ci0gIGRzdC0+c2hfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfbmFtZSk7Ci0gIGRzdC0+c2hfdHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfdHlwZSk7Ci0gIGRzdC0+c2hfZmxhZ3MgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfZmxhZ3MpOwotICBkc3QtPnNoX2FkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcik7Ci0gIGRzdC0+c2hfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX29mZnNldCk7Ci0gIGRzdC0+c2hfc2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9zaXplKTsKLSAgZHN0LT5zaF9saW5rID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9saW5rKTsKLSAgZHN0LT5zaF9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9pbmZvKTsKLSAgZHN0LT5zaF9hZGRyYWxpZ24gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcmFsaWduKTsKLSAgZHN0LT5zaF9lbnRzaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2VudHNpemUpOwotICBkc3QtPmJmZF9zZWN0aW9uID0gTlVMTDsKLSAgZHN0LT5jb250ZW50cyA9IE5VTEw7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4KLSAgIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9zaGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1NoZHIgKmRzdDsKLXsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfbmFtZSwgZHN0LT5zaF9uYW1lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX3R5cGUsIGRzdC0+c2hfdHlwZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2ZsYWdzLCBkc3QtPnNoX2ZsYWdzKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkciwgZHN0LT5zaF9hZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfb2Zmc2V0LCBkc3QtPnNoX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX3NpemUsIGRzdC0+c2hfc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9saW5rLCBkc3QtPnNoX2xpbmspOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfaW5mbywgZHN0LT5zaF9pbmZvKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkcmFsaWduLCBkc3QtPnNoX2FkZHJhbGlnbik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2VudHNpemUsIGRzdC0+c2hfZW50c2l6ZSk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotdm9pZAotZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1BoZHIgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKmRzdDsKLXsKLSAgZHN0LT5wX3R5cGUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfdHlwZSk7Ci0gIGRzdC0+cF9mbGFncyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9mbGFncyk7Ci0gIGRzdC0+cF9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9vZmZzZXQpOwotICBkc3QtPnBfdmFkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF92YWRkcik7Ci0gIGRzdC0+cF9wYWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3BhZGRyKTsKLSAgZHN0LT5wX2ZpbGVzeiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2ZpbGVzeik7Ci0gIGRzdC0+cF9tZW1zeiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX21lbXN6KTsKLSAgZHN0LT5wX2FsaWduID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfYWxpZ24pOwotfQotCi12b2lkCi1lbGZfc3dhcF9waGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1BoZHIgKmRzdDsKLXsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cF90eXBlLCBkc3QtPnBfdHlwZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfb2Zmc2V0LCBkc3QtPnBfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF92YWRkciwgZHN0LT5wX3ZhZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9wYWRkciwgZHN0LT5wX3BhZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9maWxlc3osIGRzdC0+cF9maWxlc3opOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX21lbXN6LCBkc3QtPnBfbWVtc3opOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cF9mbGFncywgZHN0LT5wX2ZsYWdzKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9hbGlnbiwgZHN0LT5wX2FsaWduKTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiByZWxvYyBmcm9tIGV4dGVybmFsIGZvcm1hdCB0byBpbnRlcm5hbCBmb3JtYXQuICovCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9SZWwgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbCAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX2luZm8gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9pbmZvKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9pbmZvID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfaW5mbyk7Ci0gIGRzdC0+cl9hZGRlbmQgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfYWRkZW5kKTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiByZWxvYyBmcm9tIGludGVybmFsIGZvcm1hdCB0byBleHRlcm5hbCBmb3JtYXQuICovCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIGRzdC0+cl9vZmZzZXQpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX2luZm8sIGRzdC0+cl9pbmZvKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfb2Zmc2V0LCBkc3QtPnJfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9pbmZvLCBkc3QtPnJfaW5mbyk7Ci0gIHB1dF9zaWduZWRfd29yZCAoYWJmZCwgc3JjLT5yX2FkZGVuZCwgZHN0LT5yX2FkZGVuZCk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9keW5faW4gKGFiZmQsIHAsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBQVFIgcDsKLSAgICAgRWxmX0ludGVybmFsX0R5biAqZHN0OwotewotICBjb25zdCBFbGZfRXh0ZXJuYWxfRHluICpzcmMgPSAoY29uc3QgRWxmX0V4dGVybmFsX0R5biAqKSBwOwotCi0gIGRzdC0+ZF90YWcgPSBnZXRfd29yZCAoYWJmZCwgc3JjLT5kX3RhZyk7Ci0gIGRzdC0+ZF91bi5kX3ZhbCA9IGdldF93b3JkIChhYmZkLCBzcmMtPmRfdW4uZF92YWwpOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfZHluX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX0R5biAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfRHluICpkc3Q7Ci17Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPmRfdGFnLCBkc3QtPmRfdGFnKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZF91bi5kX3ZhbCwgZHN0LT5kX3VuLmRfdmFsKTsKLX0KLQwKLS8qIEVMRiAuby9leGVjIGZpbGUgcmVhZGluZyAqLwotCi0KLS8qIEJlZ2luIHByb2Nlc3NpbmcgYSBnaXZlbiBvYmplY3QuCi0KLSAgIEZpcnN0IHdlIHZhbGlkYXRlIHRoZSBmaWxlIGJ5IHJlYWRpbmcgaW4gdGhlIEVMRiBoZWFkZXIgYW5kIGNoZWNraW5nCi0gICB0aGUgbWFnaWMgbnVtYmVyLiAgKi8KLQotc3RhdGljIElOTElORSBib29sZWFuCi1lbGZfZmlsZV9wICh4X2VoZHJwKQotICAgICBFbGZfRXh0ZXJuYWxfRWhkciAqeF9laGRycDsKLXsKLSAgcmV0dXJuICgoeF9laGRycC0+ZV9pZGVudFtFSV9NQUcwXSA9PSBFTEZNQUcwKQotCSAgJiYgKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMV0gPT0gRUxGTUFHMSkKLQkgICYmICh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzJdID09IEVMRk1BRzIpCi0JICAmJiAoeF9laGRycC0+ZV9pZGVudFtFSV9NQUczXSA9PSBFTEZNQUczKSk7Ci19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggQUJGRCBtYXRjaGVzIHRoZSB0YXJnZXQgdmVjdG9yCi0gICB0aGF0IEFCRkQgcG9pbnRzIHRvLgotCi0gICBOb3RlIHRoYXQgd2UgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHdpdGggdGhlIHNhbWUgQUJGRCwgYnV0IGRpZmZlcmVudAotICAgdGFyZ2V0IHZlY3RvcnMsIG1vc3Qgb2Ygd2hpY2ggd2lsbCBub3QgbWF0Y2guICBXZSBoYXZlIHRvIGF2b2lkIGxlYXZpbmcKLSAgIGFueSBzaWRlIGVmZmVjdHMgaW4gQUJGRCwgb3IgYW55IGRhdGEgaXQgcG9pbnRzIHRvIChsaWtlIHRkYXRhKSwgaWYgdGhlCi0gICBmaWxlIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfRXh0ZXJuYWxfU2hkciB4X3NoZHI7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5LCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICppX3NoZHJwID0gTlVMTDsgLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci0gIGNoYXIgKnNoc3RydGFiOwkJLyogSW50ZXJuYWwgY29weSBvZiBzZWN0aW9uIGhlYWRlciBzdHJpbmd0YWIgKi8KLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZDsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IGVsZl90ZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOwotICBhc2VjdGlvbiAqczsKLQotICAvKiBSZWFkIGluIHRoZSBFTEYgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHhfZWhkcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogTm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgdmFsaWQgRUxGIGZpbGUsIGFuZCBvbmUgdGhhdCBCRkQgY2FuCi0gICAgIG1ha2UgdXNlIG9mLiAgVGhlIG1hZ2ljIG51bWJlciBtdXN0IG1hdGNoLCB0aGUgYWRkcmVzcyBzaXplICgnY2xhc3MnKQotICAgICBhbmQgYnl0ZS1zd2FwcGluZyBtdXN0IG1hdGNoIG91ciBYVkVDIGVudHJ5LCBhbmQgaXQgbXVzdCBoYXZlIGEKLSAgICAgc2VjdGlvbiBoZWFkZXIgdGFibGUgKEZJWE1FOiBTZWUgY29tbWVudHMgcmUgc2VjdGlvbnMgYXQgdG9wIG9mIHRoaXMKLSAgICAgZmlsZSkuICovCi0KLSAgaWYgKChlbGZfZmlsZV9wICgmeF9laGRyKSA9PSBmYWxzZSkgfHwKLSAgICAgICh4X2VoZHIuZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKSB8fAotICAgICAgKHhfZWhkci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUykpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIENoZWNrIHRoYXQgZmlsZSdzIGJ5dGUgb3JkZXIgbWF0Y2hlcyB4dmVjJ3MgKi8KLSAgc3dpdGNoICh4X2VoZHIuZV9pZGVudFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjoJCS8qIEJpZy1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjoJCS8qIExpdHRsZS1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBTk9ORToJCS8qIE5vIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCi0gICAgZGVmYXVsdDoJCQkvKiBVbmtub3duIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCi0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBlbGZfb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bwotICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KLQotICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9vYmpfdGRhdGEpKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLSAgZWxmX3RkYXRhIChhYmZkKSA9IG5ld190ZGF0YTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBieXRlIG9yZGVyLCBzd2FwIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgKi8KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBlbGZfc3dhcF9laGRyX2luIChhYmZkLCAmeF9laGRyLCBpX2VoZHJwKTsKLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0KLSAgLyogUmVqZWN0IEVUX0NPUkUgKGhlYWRlciBpbmRpY2F0ZXMgY29yZSBmaWxlLCBub3Qgb2JqZWN0IGZpbGUpICovCi0gIGlmIChpX2VoZHJwLT5lX3R5cGUgPT0gRVRfQ09SRSkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogSWYgdGhlcmUgaXMgbm8gc2VjdGlvbiBoZWFkZXIgdGFibGUsIHdlJ3JlIGhvc2VkLiAqLwotICBpZiAoaV9laGRycC0+ZV9zaG9mZiA9PSAwKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBBcyBhIHNpbXBsZSBzYW5pdHkgY2hlY2ssIHZlcmlmeSB0aGF0IHRoZSB3aGF0IEJGRCB0aGlua3MgaXMgdGhlCi0gICAgIHNpemUgb2YgZWFjaCBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBhY3R1YWxseSBtYXRjaGVzIHRoZSBzaXplCi0gICAgIHJlY29yZGVkIGluIHRoZSBmaWxlLiAqLwotICBpZiAoaV9laGRycC0+ZV9zaGVudHNpemUgIT0gc2l6ZW9mICh4X3NoZHIpKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgRUxGIGVfbWFjaGluZSBmaWVsZCBtYXRjaGVzIHdoYXQgdGhpcyBwYXJ0aWN1bGFyCi0gICAgIEJGRCBmb3JtYXQgZXhwZWN0cy4gICovCi0gIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gaV9laGRycC0+ZV9tYWNoaW5lCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQxID09IDAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MSkKLSAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDIgPT0gMCB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQyKSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldF9wdHI7Ci0KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gIExldCBpdCBtYXRjaCBhbnkgRUxGIHRhcmdldAotCSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyBiYWNrZW5kLiAgKi8KLSAgICAgIGZvciAodGFyZ2V0X3B0ciA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0X3B0ciAhPSBOVUxMOyB0YXJnZXRfcHRyKyspCi0JewotCSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJhY2s7Ci0KLQkgIGlmICgoKnRhcmdldF9wdHIpLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIGNvbnRpbnVlOwotCSAgYmFjayA9IChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoKnRhcmdldF9wdHIpLT5iYWNrZW5kX2RhdGE7Ci0JICBpZiAoYmFjay0+ZWxmX21hY2hpbmVfY29kZSA9PSBpX2VoZHJwLT5lX21hY2hpbmUKLQkgICAgICB8fCAoYmFjay0+ZWxmX21hY2hpbmVfYWx0MSAhPSAwCi0JCSAgJiYgYmFjay0+ZWxmX21hY2hpbmVfYWx0MSA9PSBpX2VoZHJwLT5lX21hY2hpbmUpCi0JICAgICAgfHwgKGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgIT0gMAotCQkgICYmIGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgPT0gaV9laGRycC0+ZV9tYWNoaW5lKSkKLQkgICAgewotCSAgICAgIC8qIHRhcmdldF9wdHIgaXMgYW4gRUxGIGJhY2tlbmQgd2hpY2ggbWF0Y2hlcyB0aGlzCi0JCSBvYmplY3QgZmlsZSwgc28gcmVqZWN0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICAqLwotCSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGlfZWhkcnAtPmVfdHlwZSA9PSBFVF9FWEVDKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgZWxzZSBpZiAoaV9laGRycC0+ZV90eXBlID09IEVUX0RZTikKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGlmIChpX2VoZHJwLT5lX3BobnVtID4gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotCi0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGViZC0+YXJjaCwgMCkpCi0gICAgewotICAgICAgLyogSXQncyBPSyBpZiB0aGlzIGZhaWxzIGZvciB0aGUgZ2VuZXJpYyB0YXJnZXQuICAqLwotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3BlY2lmaWVkIGluIHRoZSBFTEYgZmlsZSBoZWFkZXIuICovCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvcHkgb2YgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluCi0gICAgIGludGVybmFsIGZvcm0sIHNlZWsgdG8gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluIHRoZSBmaWxlLAotICAgICByZWFkIGl0IGluLCBhbmQgY29udmVydCBpdCB0byBpbnRlcm5hbCBmb3JtLiAgKi8KLSAgaV9zaGRycCA9ICgoRWxmX0ludGVybmFsX1NoZHIgKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaV9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSk7Ci0gIGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICoqKQotCQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChpX3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgaWYgKCFpX3NoZHJwIHx8ICFlbGZfZWxmc2VjdGlvbnMgKGFiZmQpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfc2hvZmYsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBmb3IgKHNoaW5kZXggPSAwOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X3NoZHIsIHNpemVvZiB4X3NoZHIsIDEsIGFiZmQpICE9IHNpemVvZiAoeF9zaGRyKSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICAgIGVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsICZ4X3NoZHIsIGlfc2hkcnAgKyBzaGluZGV4KTsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBpX3NoZHJwICsgc2hpbmRleDsKLQotICAgICAgLyogSWYgdGhlIHNlY3Rpb24gaXMgbG9hZGVkLCBidXQgbm90IHBhZ2UgYWxpZ25lZCwgY2xlYXIKLSAgICAgICAgIERfUEFHRUQuICAqLwotICAgICAgaWYgKChpX3NoZHJwW3NoaW5kZXhdLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JICAmJiBpX3NoZHJwW3NoaW5kZXhdLnNoX3R5cGUgIT0gU0hUX05PQklUUwotCSAgJiYgKCgoaV9zaGRycFtzaGluZGV4XS5zaF9hZGRyIC0gaV9zaGRycFtzaGluZGV4XS5zaF9vZmZzZXQpCi0JICAgICAgICUgZWJkLT5tYXhwYWdlc2l6ZSkKLQkgICAgICAhPSAwKSkKLQlhYmZkLT5mbGFncyAmPSB+RF9QQUdFRDsKLSAgICB9Ci0gIGlmIChpX2VoZHJwLT5lX3Noc3RybmR4KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaV9laGRycC0+ZV9zaHN0cm5keCkpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIGlmIChpX2VoZHJwLT5lX3BobnVtID09IDApCi0gICAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaV9waGRyOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSAoKEVsZl9JbnRlcm5hbF9QaGRyICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaV9laGRycC0+ZV9waG51bQotCQkJCQkgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSkpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5waGRyID09IE5VTEwpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfcGhvZmYsIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgICAgaV9waGRyID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpX2VoZHJwLT5lX3BobnVtOyBpKyssIGlfcGhkcisrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9QaGRyIHhfcGhkcjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmeF9waGRyLCBzaXplb2YgeF9waGRyLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiB4X3BoZHIpCi0JICAgIGdvdG8gZ290X25vX21hdGNoOwotCSAgZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgJnhfcGhkciwgaV9waGRyKTsKLQl9Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgc2VjdGlvbnMuICBXZQotICAgICB3aWxsIG5lZWQgdGhlIGJhc2UgcG9pbnRlciB0byB0aGlzIHRhYmxlIGxhdGVyLiAqLwotICAvKiBXZSByZWFkIHRoaXMgaW5saW5lIG5vdywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGdvIHRocm91Z2gKLSAgICAgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIHdpdGggaXQgKHNpbmNlIHRoaXMgcGFydGljdWxhciBzdHJ0YWIgaXMKLSAgICAgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUgRUxGIHNlY3Rpb24gbmFtZXMuKSAqLwotCi0gIHNoc3RydGFiID0gYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24gKGFiZmQsIGlfZWhkcnAtPmVfc2hzdHJuZHgpOwotICBpZiAoIXNoc3RydGFiKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIC8qIE9uY2UgYWxsIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMgaGF2ZSBiZWVuIHJlYWQgYW5kIGNvbnZlcnRlZCwgd2UKLSAgICAgY2FuIHN0YXJ0IHByb2Nlc3NpbmcgdGhlbS4gIE5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIgaXMKLSAgICAgYSBkdW1teSBwbGFjZWhvbGRlciBlbnRyeSwgc28gd2UgaWdub3JlIGl0LiAgKi8KLQotICBmb3IgKHNoaW5kZXggPSAxOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgc2hpbmRleCkpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIExldCB0aGUgYmFja2VuZCBkb3VibGUgY2hlY2sgdGhlIGZvcm1hdCBhbmQgb3ZlcnJpZGUgZ2xvYmFsCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfb2JqZWN0X3ApCi0gICAgewotICAgICAgaWYgKCgqZWJkLT5lbGZfYmFja2VuZF9vYmplY3RfcCkgKGFiZmQpID09IGZhbHNlKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGFueSByZWxvYyBzZWN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgZGVidWdnaW5nIHNlY3Rpb25zLCBtYXJrIHRoZSByZWxvYyBzZWN0aW9ucyBhcyBkZWJ1Z2dpbmcgYXMgd2VsbC4gICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAotCSAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKQotCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2luZm8gPiAwKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGFyZ19pbmRleDsKLQkgIGFzZWN0aW9uICp0YXJnX3NlYzsKLQotCSAgdGFyZ19pbmRleCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9pbmZvOwotCSAgdGFyZ19zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgdGFyZ19pbmRleCk7Ci0JICBpZiAodGFyZ19zZWMgIT0gTlVMTAotCSAgICAgICYmICh0YXJnX3NlYy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgICBzLT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChhYmZkLT54dmVjKTsKLQotIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I6Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotIGdvdF9ub19tYXRjaDoKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMCi0gICAgICAmJiBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0ciAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0cik7Ci0gIGlmIChpX3NoZHJwICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIGlfc2hkcnApOwotICBpZiAobmV3X3RkYXRhICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5ld190ZGF0YSk7Ci0gIGVsZl90ZGF0YSAoYWJmZCkgPSBwcmVzZXJ2ZWRfdGRhdGE7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0MCi0vKiBFTEYgLm8vZXhlYyBmaWxlIHdyaXRpbmcgKi8KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJvb2xlYW4gKmZhaWxlZHAgPSAoYm9vbGVhbiAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZl9FeHRlcm5hbF9SZWxhICpvdXRib3VuZF9yZWxvY2FzOwotICBFbGZfRXh0ZXJuYWxfUmVsICpvdXRib3VuZF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIGludCB1c2VfcmVsYV9wOwotICBhc3ltYm9sICpsYXN0X3N5bSA9IDA7Ci0gIGludCBsYXN0X3N5bV9pZHggPSAwOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKCpmYWlsZWRwKQotICAgIHJldHVybjsKLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFRoZSBsaW5rZXIgYmFja2VuZCB3cml0ZXMgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLCBhbmQgc2V0cyB0aGUKLSAgICAgcmVsb2NfY291bnQgZmllbGQgdG8gemVybyB0byBpbmhpYml0IHdyaXRpbmcgdGhlbSBoZXJlLiAgQWxzbywKLSAgICAgc29tZXRpbWVzIHRoZSBTRUNfUkVMT0MgZmxhZyBnZXRzIHNldCBldmVuIHdoZW4gdGhlcmUgYXJlbid0IGFueQotICAgICByZWxvY3MuICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOwotCi0gIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBzZWMtPnJlbG9jX2NvdW50OwotICByZWxhX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbGFfaGRyLT5zaF9zaXplKTsKLSAgaWYgKHJlbGFfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSByZWxvY2F0aW9ucyBhcmUgUkVMQSBvciBSRUwgcmVsb2NhdGlvbnMuICAqLwotICBpZiAocmVsYV9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0gICAgdXNlX3JlbGFfcCA9IHRydWU7Ci0gIGVsc2UgaWYgKHJlbGFfaGRyLT5zaF90eXBlID09IFNIVF9SRUwpCi0gICAgdXNlX3JlbGFfcCA9IGZhbHNlOwotICBlbHNlCi0gICAgLyogRXZlcnkgcmVsb2NhdGlvbiBzZWN0aW9uIHNob3VsZCBiZSBlaXRoZXIgYW4gU0hUX1JFTEEgb3IgYW4KLSAgICAgICBTSFRfUkVMIHNlY3Rpb24uICAqLwotICAgIGFib3J0ICgpOwotCi0gIC8qIG9yZWxvY2F0aW9uIGhhcyB0aGUgZGF0YSwgcmVsb2NfY291bnQgaGFzIHRoZSBjb3VudC4uLiAqLwotICBpZiAodXNlX3JlbGFfcCkKLSAgICB7Ci0gICAgICBvdXRib3VuZF9yZWxvY2FzID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSBkc3RfcmVsYTsKLQkgIEVsZl9FeHRlcm5hbF9SZWxhICpzcmNfcmVsYTsKLQkgIGFyZWxlbnQgKnB0cjsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIGludCBuOwotCi0JICBwdHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF07Ci0JICBzcmNfcmVsYSA9IG91dGJvdW5kX3JlbG9jYXMgKyBpZHg7Ci0KLQkgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKLQkgICAgIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgZHN0X3JlbGEucl9vZmZzZXQgPSBwdHItPmFkZHJlc3M7Ci0JICBlbHNlCi0JICAgIGRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLQkgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotCSAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQkgICAgbiA9IGxhc3Rfc3ltX2lkeDsKLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSAmJiBzeW0tPnZhbHVlID09IDApCi0JICAgIG4gPSBTVE5fVU5ERUY7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsYXN0X3N5bSA9IHN5bTsKLQkgICAgICBuID0gX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0JICAgICAgaWYgKG4gPCAwKQotCQl7Ci0JCSAgKmZhaWxlZHAgPSB0cnVlOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JICAgIH0KLQotCSAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmICgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgICAgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JICAgIHsKLQkgICAgICAqZmFpbGVkcCA9IHRydWU7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGRzdF9yZWxhLnJfaW5mbyA9IEVMRl9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0JICBkc3RfcmVsYS5yX2FkZGVuZCA9IHB0ci0+YWRkZW5kOwotCSAgZWxmX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmRzdF9yZWxhLCBzcmNfcmVsYSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIC8qIFJFTCByZWxvY2F0aW9ucyAqLwotICAgIHsKLSAgICAgIG91dGJvdW5kX3JlbG9jcyA9IChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGRzdF9yZWw7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsICpzcmNfcmVsOwotCSAgYXJlbGVudCAqcHRyOwotCSAgaW50IG47Ci0JICBhc3ltYm9sICpzeW07Ci0KLQkgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLQkgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotCSAgc3JjX3JlbCA9IG91dGJvdW5kX3JlbG9jcyArIGlkeDsKLQotCSAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSAgICAgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0JICAgICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCSAgICBkc3RfcmVsLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotCSAgZWxzZQotCSAgICBkc3RfcmVsLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLQkgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JICAgIG4gPSBsYXN0X3N5bV9pZHg7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsYXN0X3N5bSA9IHN5bTsKLQkgICAgICBuID0gX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0JICAgICAgaWYgKG4gPCAwKQotCQl7Ci0JCSAgKmZhaWxlZHAgPSB0cnVlOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JICAgIH0KLQotCSAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgICAgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JICAgIHsKLQkgICAgICAqZmFpbGVkcCA9IHRydWU7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGRzdF9yZWwucl9pbmZvID0gRUxGX1JfSU5GTyAobiwgcHRyLT5ob3d0by0+dHlwZSk7Ci0KLQkgIGVsZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmRzdF9yZWwsIHNyY19yZWwpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotaW50Ci1lbGZfd3JpdGVfb3V0X3BoZHJzIChhYmZkLCBwaGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgICAgaW50IGNvdW50OwotewotICB3aGlsZSAoY291bnQtLSkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUGhkciBleHRwaGRyOwotICAgICAgZWxmX3N3YXBfcGhkcl9vdXQgKGFiZmQsIHBoZHIsICZleHRwaGRyKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZleHRwaGRyLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpKQotCXJldHVybiAtMTsKLSAgICAgIHBoZHIrKzsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gaGVhZGVycyBhbmQgdGhlIEVMRiBmaWxlIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLWVsZl93cml0ZV9zaGRyc19hbmRfZWhkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfRXh0ZXJuYWxfRWhkciB4X2VoZHI7CS8qIEVsZiBmaWxlIGhlYWRlciwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9FeHRlcm5hbF9TaGRyICp4X3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlLCBpbnRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotCi0gIC8qIHN3YXAgdGhlIGhlYWRlciBiZWZvcmUgc3BpdHRpbmcgaXQgb3V0Li4uICovCi0KLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0gIGVsZl9zd2FwX2VoZHJfb3V0IChhYmZkLCBpX2VoZHJwLCAmeF9laGRyKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mICh4X2VoZHIpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogYXQgdGhpcyBwb2ludCB3ZSd2ZSBjb25jb2N0ZWQgYWxsIHRoZSBFTEYgc2VjdGlvbnMuLi4gKi8KLSAgeF9zaGRycCA9IChFbGZfRXh0ZXJuYWxfU2hkciAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqeF9zaGRycCkgKiAoaV9laGRycC0+ZV9zaG51bSkpOwotICBpZiAoIXhfc2hkcnApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGlfZWhkcnAtPmVfc2hudW07IGNvdW50KyspCi0gICAgewotI2lmIERFQlVHICYgMgotICAgICAgZWxmX2RlYnVnX3NlY3Rpb24gKGNvdW50LCBpX3NoZHJwW2NvdW50XSk7Ci0jZW5kaWYKLSAgICAgIGVsZl9zd2FwX3NoZHJfb3V0IChhYmZkLCBpX3NoZHJwW2NvdW50XSwgeF9zaGRycCArIGNvdW50KTsKLSAgICB9Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBpX2VoZHJwLT5lX3Nob2ZmLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgeF9zaGRycCwgc2l6ZW9mICgqeF9zaGRycCksIGlfZWhkcnAtPmVfc2hudW0sIGFiZmQpCi0JICAhPSBzaXplb2YgKCp4X3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBuZWVkIHRvIGR1bXAgdGhlIHN0cmluZyB0YWJsZSB0b28uLi4gKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotZWxmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCwgc3ltcHRycywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltcHRyczsJCS8qIEJ1ZmZlciBmb3IgZ2VuZXJhdGVkIGJmZCBzeW1ib2xzICovCi0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnZlcmhkcjsKLSAgdW5zaWduZWQgbG9uZyBzeW1jb3VudDsJLyogTnVtYmVyIG9mIGV4dGVybmFsIEVMRiBzeW1ib2xzICovCi0gIGVsZl9zeW1ib2xfdHlwZSAqc3ltOwkJLyogUG9pbnRlciB0byBjdXJyZW50IGJmZCBzeW1ib2wgKi8KLSAgZWxmX3N5bWJvbF90eXBlICpzeW1iYXNlOwkvKiBCdWZmZXIgZm9yIGdlbmVyYXRlZCBiZmQgc3ltYm9scyAqLwotICBFbGZfSW50ZXJuYWxfU3ltIGlfc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICp4X3N5bXAgPSBOVUxMOwotICBFbGZfRXh0ZXJuYWxfVmVyc3ltICp4X3ZlcnN5bXAgPSBOVUxMOwotCi0gIC8qIFJlYWQgZWFjaCByYXcgRUxGIHN5bWJvbCwgY29udmVydGluZyBmcm9tIGV4dGVybmFsIEVMRiBmb3JtIHRvCi0gICAgIGludGVybmFsIEVMRiBmb3JtLCBhbmQgdGhlbiB1c2luZyB0aGUgaW5mb3JtYXRpb24gdG8gY3JlYXRlIGEKLSAgICAgY2Fub25pY2FsIGJmZCBzeW1ib2wgdGFibGUgZW50cnkuCi0KLSAgICAgTm90ZSB0aGF0IHdlIGFsbG9jYXRlIHRoZSBpbml0aWFsIGJmZCBjYW5vbmljYWwgc3ltYm9sIGJ1ZmZlcgotICAgICBiYXNlZCBvbiBhIG9uZS10by1vbmUgbWFwcGluZyBvZiB0aGUgRUxGIHN5bWJvbHMgdG8gY2Fub25pY2FsCi0gICAgIHN5bWJvbHMuICBXZSBhY3R1YWxseSB1c2UgYWxsIHRoZSBFTEYgc3ltYm9scywgc28gdGhlcmUgd2lsbCBiZSBubwotICAgICBzcGFjZSBsZWZ0IG92ZXIgYXQgdGhlIGVuZC4gIFdoZW4gd2UgaGF2ZSBhbGwgdGhlIHN5bWJvbHMsIHdlCi0gICAgIGJ1aWxkIHRoZSBjYWxsZXIncyBwb2ludGVyIHZlY3Rvci4gKi8KLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgICAgdmVyaGRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKLSAgICAgIGlmIChlbGZfZHludmVyc3ltIChhYmZkKSA9PSAwKQotCXZlcmhkciA9IE5VTEw7Ci0gICAgICBlbHNlCi0JdmVyaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9oZHI7Ci0gICAgICBpZiAoKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9zZWN0aW9uICE9IDAKLQkgICAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPT0gTlVMTCkKLQkgIHx8IChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfc2VjdGlvbiAhPSAwCi0JICAgICAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiAtMTsKLQotICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0KLSAgaWYgKHN5bWNvdW50ID09IDApCi0gICAgc3ltID0gc3ltYmFzZSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHN5bWJhc2UgPSAoKGVsZl9zeW1ib2xfdHlwZSAqKQotCQkgYmZkX3phbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGVsZl9zeW1ib2xfdHlwZSkpKTsKLSAgICAgIGlmIChzeW1iYXNlID09IChlbGZfc3ltYm9sX3R5cGUgKikgTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgICBzeW0gPSBzeW1iYXNlOwotCi0gICAgICAvKiBUZW1wb3JhcmlseSBhbGxvY2F0ZSByb29tIGZvciB0aGUgcmF3IEVMRiBzeW1ib2xzLiAgKi8KLSAgICAgIHhfc3ltcCA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQliZmRfbWFsbG9jIChzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgICAgIGlmICh4X3N5bXAgPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHhfc3ltcCwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgc3ltY291bnQsIGFiZmQpCi0JICAhPSBzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFJlYWQgdGhlIHJhdyBFTEYgdmVyc2lvbiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi0gICAgICBpZiAodmVyaGRyICE9IE5VTEwKLQkgICYmIHZlcmhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSkgIT0gc3ltY291bnQpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdmVyc2lvbiBjb3VudCAoJWxkKSBkb2VzIG5vdCBtYXRjaCBzeW1ib2wgY291bnQgKCVsZCkiKSwKLQkgICAgIGFiZmQtPmZpbGVuYW1lLAotCSAgICAgKGxvbmcpICh2ZXJoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pKSwKLQkgICAgIHN5bWNvdW50KTsKLQotCSAgLyogU2x1cnAgaW4gdGhlIHN5bWJvbHMgd2l0aG91dCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG1vcmUgaGVscGZ1bCB0aGFuIGp1c3QgcXVpdHRpbmcuICAqLwotCSAgdmVyaGRyID0gTlVMTDsKLQl9Ci0KLSAgICAgIGlmICh2ZXJoZHIgIT0gTlVMTCkKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHZlcmhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIHhfdmVyc3ltcCA9IChFbGZfRXh0ZXJuYWxfVmVyc3ltICopIGJmZF9tYWxsb2MgKHZlcmhkci0+c2hfc2l6ZSk7Ci0JICBpZiAoeF92ZXJzeW1wID09IE5VTEwgJiYgdmVyaGRyLT5zaF9zaXplICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpIHhfdmVyc3ltcCwgMSwgdmVyaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgICAgICE9IHZlcmhkci0+c2hfc2l6ZSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBTa2lwIGZpcnN0IHN5bWJvbCwgd2hpY2ggaXMgYSBudWxsIGR1bW15LiAgKi8KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBzeW1jb3VudDsgaSsrKQotCXsKLQkgIGVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgeF9zeW1wICsgaSwgJmlfc3ltKTsKLQkgIG1lbWNweSAoJnN5bS0+aW50ZXJuYWxfZWxmX3N5bSwgJmlfc3ltLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKLSNpZmRlZiBFTEZfS0VFUF9FWFRTWU0KLQkgIG1lbWNweSAoJnN5bS0+bmF0aXZlX2VsZl9zeW0sIHhfc3ltcCArIGksIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpOwotI2VuZGlmCi0JICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotCSAgc3ltLT5zeW1ib2wubmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsCi0JCQkJCQkJICAgICAgaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICAgIGlfc3ltLnN0X25hbWUpOwotCi0JICBzeW0tPnN5bWJvbC52YWx1ZSA9IGlfc3ltLnN0X3ZhbHVlOwotCi0JICBpZiAoaV9zeW0uc3Rfc2huZHggPiAwICYmIGlfc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLAotCQkJCQkJCSAgICBpX3N5bS5zdF9zaG5keCk7Ci0JICAgICAgaWYgKHN5bS0+c3ltYm9sLnNlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIGEgc2VjdGlvbiBmb3Igd2hpY2ggd2UgZGlkIG5vdAotCQkgICAgIGNyZWF0ZSBhIEJGRCBzZWN0aW9uLiAgSnVzdCB1c2UgYmZkX2Fic19zZWN0aW9uLAotCQkgICAgIGFsdGhvdWdoIGl0IGlzIHdyb25nLiAgRklYTUUuICAqLwotCQkgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgfQotCSAgZWxzZSBpZiAoaV9zeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICAgIC8qIEVsZiBwdXRzIHRoZSBhbGlnbm1lbnQgaW50byB0aGUgYHZhbHVlJyBmaWVsZCwgYW5kCi0JCSB0aGUgc2l6ZSBpbnRvIHRoZSBgc2l6ZScgZmllbGQuICBCRkQgd2FudHMgdG8gc2VlIHRoZQotCQkgc2l6ZSBpbiB0aGUgdmFsdWUgZmllbGQsIGFuZCBkb2Vzbid0IGNhcmUgKGF0IHRoZQotCQkgbW9tZW50KSBhYm91dCB0aGUgYWxpZ25tZW50LiAgKi8KLQkgICAgICBzeW0tPnN5bWJvbC52YWx1ZSA9IGlfc3ltLnN0X3NpemU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIGZpbGUsIHRoZW4gdGhlIHN5bWJvbCB2YWx1ZSBpcwotICAgICAgICAgICAgIGFscmVhZHkgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSAhPSAwKQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0KLQkgIHN3aXRjaCAoRUxGX1NUX0JJTkQgKGlfc3ltLnN0X2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgU1RCX0xPQ0FMOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9MT0NBTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVEJfR0xPQkFMOgotCSAgICAgIGlmIChpX3N5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYKLQkJICAmJiBpX3N5bS5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKQotCQlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUQl9XRUFLOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9XRUFLOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoRUxGX1NUX1RZUEUgKGlfc3ltLnN0X2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgU1RUX1NFQ1RJT046Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNIHwgQlNGX0RFQlVHR0lORzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVFRfRklMRToKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRklMRSB8IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RUX0ZVTkM6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUVF9PQkpFQ1Q6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoZHluYW1pYykKLQkgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0RZTkFNSUM7Ci0KLQkgIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJzeW0gaXZlcnN5bTsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCB4X3ZlcnN5bXAgKyBpLCAmaXZlcnN5bSk7Ci0JICAgICAgc3ltLT52ZXJzaW9uID0gaXZlcnN5bS52c192ZXJzOwotCSAgICB9Ci0KLQkgIC8qIERvIHNvbWUgYmFja2VuZC1zcGVjaWZpYyBwcm9jZXNzaW5nIG9uIHRoaXMgc3ltYm9sLiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQkgICAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpCi0JICAgICAgKCplYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKSAoYWJmZCwgJnN5bS0+c3ltYm9sKTsKLQkgIH0KLQotCSAgc3ltKys7Ci0JfQotICAgIH0KLQotICAvKiBEbyBzb21lIGJhY2tlbmQtc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiB0aGlzIHN5bWJvbCB0YWJsZS4gICovCi0gIHsKLSAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICAgIGlmIChlYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKQotICAgICAgKCplYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKSAoYWJmZCwgc3ltYmFzZSwgc3ltY291bnQpOwotICB9Ci0KLSAgLyogV2UgcmVseSBvbiB0aGUgemFsbG9jIHRvIGNsZWFyIG91dCB0aGUgZmluYWwgc3ltYm9sIGVudHJ5LiAgKi8KLQotICBzeW1jb3VudCA9IHN5bSAtIHN5bWJhc2U7Ci0KLSAgLyogRmlsbCBpbiB0aGUgdXNlcidzIHN5bWJvbCBwb2ludGVyIHZlY3RvciBpZiBuZWVkZWQuICAqLwotICBpZiAoc3ltcHRycykKLSAgICB7Ci0gICAgICBsb25nIGwgPSBzeW1jb3VudDsKLQotICAgICAgc3ltID0gc3ltYmFzZTsKLSAgICAgIHdoaWxlIChsLS0gPiAwKQotCXsKLQkgICpzeW1wdHJzKysgPSAmc3ltLT5zeW1ib2w7Ci0JICBzeW0rKzsKLQl9Ci0gICAgICAqc3ltcHRycyA9IDA7CQkvKiBGaW5hbCBudWxsIHBvaW50ZXIgKi8KLSAgICB9Ci0KLSAgaWYgKHhfdmVyc3ltcCAhPSBOVUxMKQotICAgIGZyZWUgKHhfdmVyc3ltcCk7Ci0gIGlmICh4X3N5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3N5bXApOwotICByZXR1cm4gc3ltY291bnQ7Ci1lcnJvcl9yZXR1cm46Ci0gIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3ZlcnN5bXApOwotICBpZiAoeF9zeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF9zeW1wKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiBSZWFkICByZWxvY2F0aW9ucyBmb3IgQVNFQ1QgZnJvbSBSRUxfSERSLiAgVGhlcmUgYXJlIFJFTE9DX0NPVU5UIG9mIAotICAgdGhlbS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIChhYmZkLCBhc2VjdCwgcmVsX2hkciwgcmVsb2NfY291bnQsCi0JCQkJICAgIHJlbGVudHMsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgICAgYXJlbGVudCAqcmVsZW50czsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIFBUUiBhbGxvY2F0ZWQgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmF0aXZlX3JlbG9jczsKLSAgYXJlbGVudCAqcmVsZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0KLSAgYWxsb2NhdGVkID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChhbGxvY2F0ZWQgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHJlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoYWxsb2NhdGVkLCAxLCByZWxfaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7Ci0KLSAgZW50c2l6ZSA9IHJlbF9oZHItPnNoX2VudHNpemU7Ci0gIEJGRF9BU1NFUlQgKGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKQotCSAgICAgIHx8IGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotCi0gIGZvciAoaSA9IDAsIHJlbGVudCA9IHJlbGVudHM7Ci0gICAgICAgaSA8IHJlbG9jX2NvdW50OwotICAgICAgIGkrKywgcmVsZW50KyssIG5hdGl2ZV9yZWxvY3MgKz0gZW50c2l6ZSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKQotCWVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9SZWxhICopIG5hdGl2ZV9yZWxvY3MsICZyZWxhKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9SZWwgKikgbmF0aXZlX3JlbG9jcywgJnJlbCk7Ci0JICByZWxhLnJfb2Zmc2V0ID0gcmVsLnJfb2Zmc2V0OwotCSAgcmVsYS5yX2luZm8gPSByZWwucl9pbmZvOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIG5vcm1hbCBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUsCi0JIGFuZCB0aGUgYWRkcmVzcyBvZiBhIGR5bmFtaWMgcmVsb2MgaXMgYWJzb2x1dGUuLiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAgfHwgZHluYW1pYykKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0OwotICAgICAgZWxzZQotCXJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQgLSBhc2VjdC0+dm1hOwotCi0gICAgICBpZiAoRUxGX1JfU1lNIChyZWxhLnJfaW5mbykgPT0gMCkKLQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBlbHNlCi0JewotCSAgYXN5bWJvbCAqKnBzLCAqczsKLQotCSAgcHMgPSBzeW1ib2xzICsgRUxGX1JfU1lNIChyZWxhLnJfaW5mbykgLSAxOwotCSAgcyA9ICpwczsKLQotCSAgLyogQ2Fub25pY2FsaXplIEVMRiBzZWN0aW9uIHN5bWJvbHMuICBGSVhNRTogV2h5PyAgKi8KLQkgIGlmICgocy0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBwczsKLQkgIGVsc2UKLQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHMtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgcmVsZW50LT5hZGRlbmQgPSByZWxhLnJfYWRkZW5kOwotCi0gICAgICBpZiAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSkKLQkoKmViZC0+ZWxmX2luZm9fdG9faG93dG8pIChhYmZkLCByZWxlbnQsICZyZWxhKTsKLSAgICAgIGVsc2UKLQkoKmViZC0+ZWxmX2luZm9fdG9faG93dG9fcmVsKSAoYWJmZCwgcmVsZW50LCAmcmVsKTsKLSAgICB9Ci0KLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICogY29uc3QgZCA9IGVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyMjsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDI7Ci0gIGFyZWxlbnQgKnJlbGVudHM7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+cmVsX2hkcjsKLSAgICAgIHJlbG9jX2NvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemU7Ci0gICAgICByZWxfaGRyMiA9IGQtPnJlbF9oZHIyOwotICAgICAgcmVsb2NfY291bnQyID0gKHJlbF9oZHIyIAotCQkgICAgICA/IChyZWxfaGRyMi0+c2hfc2l6ZSAvIHJlbF9oZHIyLT5zaF9lbnRzaXplKQotCQkgICAgICA6IDApOwotCi0gICAgICBCRkRfQVNTRVJUIChhc2VjdC0+cmVsb2NfY291bnQgPT0gcmVsb2NfY291bnQgKyByZWxvY19jb3VudDIpOwotICAgICAgQkZEX0FTU0VSVCAoYXNlY3QtPnJlbF9maWxlcG9zID09IHJlbF9oZHItPnNoX29mZnNldAotCQkgIHx8IChyZWxfaGRyMiAmJiBhc2VjdC0+cmVsX2ZpbGVwb3MgPT0gcmVsX2hkcjItPnNoX29mZnNldCkpOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTm90ZSB0aGF0IEFTRUNULT5SRUxPQ19DT1VOVCB0ZW5kcyBub3QgdG8gYmUgYWNjdXJhdGUgaW4gdGhpcwotCSBjYXNlIGJlY2F1c2UgcmVsb2NhdGlvbnMgYWdhaW5zdCB0aGlzIHNlY3Rpb24gbWF5IHVzZSB0aGUKLQkgZHluYW1pYyBzeW1ib2wgdGFibGUsIGFuZCBpbiB0aGF0IGNhc2UgYmZkX3NlY3Rpb25fZnJvbV9zaGRyCi0JIGluIGVsZi5jIGRvZXMgbm90IHVwZGF0ZSB0aGUgUkVMT0NfQ09VTlQuICAqLwotICAgICAgaWYgKGFzZWN0LT5fcmF3X3NpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcmVsX2hkciA9ICZkLT50aGlzX2hkcjsKLSAgICAgIHJlbG9jX2NvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemU7Ci0gICAgICByZWxfaGRyMiA9IE5VTEw7Ci0gICAgICByZWxvY19jb3VudDIgPSAwOwotICAgIH0KLQotICByZWxlbnRzID0gKChhcmVsZW50ICopIAotCSAgICAgYmZkX2FsbG9jIChhYmZkLCAKLQkJCShyZWxvY19jb3VudCArIHJlbG9jX2NvdW50MikgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0gIGlmIChyZWxlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbiAoYWJmZCwgYXNlY3QsCi0JCQkJCSAgIHJlbF9oZHIsIHJlbG9jX2NvdW50LAotCQkJCQkgICByZWxlbnRzLAotCQkJCQkgICBzeW1ib2xzLCBkeW5hbWljKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpZiAocmVsX2hkcjIgCi0gICAgICAmJiAhZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbiAoYWJmZCwgYXNlY3QsCi0JCQkJCSAgICAgIHJlbF9oZHIyLCByZWxvY19jb3VudDIsCi0JCQkJCSAgICAgIHJlbGVudHMgKyByZWxvY19jb3VudCwKLQkJCQkJICAgICAgc3ltYm9scywgZHluYW1pYykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIAotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbGVudHM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkCi1lbGZfZGVidWdfc2VjdGlvbiAobnVtLCBoZHIpCi0gICAgIGludCBudW07Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuU2VjdGlvbiMlZCAnJXMnIDB4JS44bHhcbiIsIG51bSwKLQkgICBoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwgPyBoZHItPmJmZF9zZWN0aW9uLT5uYW1lIDogIiIsCi0JICAgKGxvbmcpIGhkcik7Ci0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAic2hfbmFtZSAgICAgID0gJWxkXHRzaF90eXBlICAgICAgPSAlbGRcdHNoX2ZsYWdzICAgICA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9uYW1lLAotCSAgIChsb25nKSBoZHItPnNoX3R5cGUsCi0JICAgKGxvbmcpIGhkci0+c2hfZmxhZ3MpOwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgInNoX2FkZHIgICAgICA9ICVsZFx0c2hfb2Zmc2V0ICAgID0gJWxkXHRzaF9zaXplICAgICAgPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfYWRkciwKLQkgICAobG9uZykgaGRyLT5zaF9vZmZzZXQsCi0JICAgKGxvbmcpIGhkci0+c2hfc2l6ZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAic2hfbGluayAgICAgID0gJWxkXHRzaF9pbmZvICAgICAgPSAlbGRcdHNoX2FkZHJhbGlnbiA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9saW5rLAotCSAgIChsb25nKSBoZHItPnNoX2luZm8sCi0JICAgKGxvbmcpIGhkci0+c2hfYWRkcmFsaWduKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAic2hfZW50c2l6ZSAgID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX2VudHNpemUpOwotICBmZmx1c2ggKHN0ZGVycik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZGVidWdfZmlsZSAoZWhkcnApCi0gICAgIEVsZl9JbnRlcm5hbF9FaGRyICplaGRycDsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9lbnRyeSAgICAgID0gMHglLjhseFxuIiwgKGxvbmcpIGVoZHJwLT5lX2VudHJ5KTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9waG9mZiAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfcGhvZmYpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3BobnVtICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9waG51bSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfcGhlbnRzaXplICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3BoZW50c2l6ZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfc2hvZmYgICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3Nob2ZmKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9zaG51bSAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfc2hudW0pOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3NoZW50c2l6ZSAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9zaGVudHNpemUpOwotfQotCi1zdGF0aWMgY2hhciAqCi1lbGZfc3ltYm9sX2ZsYWdzIChmbGFncykKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKLQotICBidWZmZXJbMF0gPSAnXDAnOwotICBpZiAoZmxhZ3MgJiBCU0ZfTE9DQUwpCi0gICAgc3RyY2F0IChidWZmZXIsICIgbG9jYWwiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGdsb2JhbCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0gICAgc3RyY2F0IChidWZmZXIsICIgZGVidWciKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCi0gICAgc3RyY2F0IChidWZmZXIsICIgZnVuY3Rpb24iKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfS0VFUCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBrZWVwIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0tFRVBfRykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBrZWVwX2ciKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfV0VBSykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiB3ZWFrIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIHNlY3Rpb24tc3ltIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX09MRF9DT01NT04pCi0gICAgc3RyY2F0IChidWZmZXIsICIgb2xkLWNvbW1vbiIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9OT1RfQVRfRU5EKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIG5vdC1hdC1lbmQiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpCi0gICAgc3RyY2F0IChidWZmZXIsICIgY29uc3RydWN0b3IiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfV0FSTklORykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiB3YXJuaW5nIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0lORElSRUNUKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGluZGlyZWN0Iik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0ZJTEUpCi0gICAgc3RyY2F0IChidWZmZXIsICIgZmlsZSIpOwotCi0gIGlmIChmbGFncyAmIERZTkFNSUMpCi0gICAgc3RyY2F0IChidWZmZXIsICIgZHluYW1pYyIpOwotCi0gIGlmIChmbGFncyAmIH4oQlNGX0xPQ0FMCi0JCXwgQlNGX0dMT0JBTAotCQl8IEJTRl9ERUJVR0dJTkcKLQkJfCBCU0ZfRlVOQ1RJT04KLQkJfCBCU0ZfS0VFUAotCQl8IEJTRl9LRUVQX0cKLQkJfCBCU0ZfV0VBSwotCQl8IEJTRl9TRUNUSU9OX1NZTQotCQl8IEJTRl9PTERfQ09NTU9OCi0JCXwgQlNGX05PVF9BVF9FTkQKLQkJfCBCU0ZfQ09OU1RSVUNUT1IKLQkJfCBCU0ZfV0FSTklORwotCQl8IEJTRl9JTkRJUkVDVAotCQl8IEJTRl9GSUxFCi0JCXwgQlNGX0RZTkFNSUMpKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIHVua25vd24tYml0cyIpOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0jZW5kaWYKLQwKLSNpbmNsdWRlICJlbGZjb3JlLmgiCi0jaW5jbHVkZSAiZWxmbGluay5oIgotDAotLyogU2l6ZS1kZXBlbmRlbnQgZGF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KLWNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIE5BTUUoX2JmZF9lbGYsc2l6ZV9pbmZvKSA9IHsKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRWhkciksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9TaGRyKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX0R5biksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX05vdGUpLAotCi0gIEFSQ0hfU0laRSwgRklMRV9BTElHTiwKLSAgRUxGQ0xBU1MsIEVWX0NVUlJFTlQsCi0gIGVsZl93cml0ZV9vdXRfcGhkcnMsCi0gIGVsZl93cml0ZV9zaGRyc19hbmRfZWhkciwKLSAgd3JpdGVfcmVsb2NzLAotICBlbGZfc3dhcF9zeW1ib2xfb3V0LAotICBlbGZfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGVsZl9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGVsZl9zd2FwX2R5bl9pbgotfTsKZGlmZiAtLWdpdCBhL2JmZC9lbGZjb3JlLmggYi9iZmQvZWxmY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ1NGFhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZjb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogRUxGIGNvcmUgZmlsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi1jaGFyKgotZWxmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfY29tbWFuZDsKLX0KLQotaW50Ci1lbGZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbDsKLX0KLQotCi1ib29sZWFuCi1lbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIGNoYXIqIGNvcmVuYW1lOwotCi0gIC8qIHh2ZWNzIG11c3QgbWF0Y2ggaWYgYm90aCBhcmUgRUxGIGZpbGVzIGZvciB0aGUgc2FtZSB0YXJnZXQuICovCi0KLSAgaWYgKGNvcmVfYmZkLT54dmVjICE9IGV4ZWNfYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiB0aGUgbmFtZSBpbiB0aGUgY29yZWZpbGUgbWF0Y2hlcyB0aGUgZXhlY3V0YWJsZSBuYW1lLiAqLwotCi0gIGNvcmVuYW1lID0gZWxmX3RkYXRhIChjb3JlX2JmZCktPmNvcmVfcHJvZ3JhbTsKLSAgaWYgKGNvcmVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciogZXhlY25hbWUgPSBzdHJyY2hyIChleGVjX2JmZC0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBleGVjbmFtZSA9IGV4ZWNuYW1lID8gZXhlY25hbWUgKyAxIDogZXhlY19iZmQtPmZpbGVuYW1lOwotCi0gICAgICBpZiAoc3RyY21wKGV4ZWNuYW1lLCBjb3JlbmFtZSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qICBDb3JlIGZpbGVzIGFyZSBzaW1wbHkgc3RhbmRhcmQgRUxGIGZvcm1hdHRlZCBmaWxlcyB0aGF0IHBhcnRpdGlvbgotICAgIHRoZSBmaWxlIHVzaW5nIHRoZSBleGVjdXRpb24gdmlldyBvZiB0aGUgZmlsZSAocHJvZ3JhbSBoZWFkZXIgdGFibGUpCi0gICAgcmF0aGVyIHRoYW4gdGhlIGxpbmtpbmcgdmlldy4gIEluIGZhY3QsIHRoZXJlIGlzIG5vIHNlY3Rpb24gaGVhZGVyCi0gICAgdGFibGUgaW4gYSBjb3JlIGZpbGUuCi0KLSAgICBUaGUgcHJvY2VzcyBzdGF0dXMgaW5mb3JtYXRpb24gKGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YgdGhlIGdlbmVyYWwKLSAgICByZWdpc3RlciBzZXQpIGFuZCB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0IGFyZSBzdG9yZWQgaW4gYQotICAgIHNlZ21lbnQgb2YgdHlwZSBQVF9OT1RFLiAgV2UgaGFuZGNyYWZ0IGEgY291cGxlIG9mIGV4dHJhIGJmZCBzZWN0aW9ucwotICAgIHRoYXQgYWxsb3cgc3RhbmRhcmQgYmZkIGFjY2VzcyB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgKC5yZWcpIGFuZCB0aGUKLSAgICBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKC5yZWcyKS4KLQotICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotZWxmX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEVsZl9FeHRlcm5hbF9FaGRyIHhfZWhkcjsJLyogRWxmIGZpbGUgaGVhZGVyLCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9FaGRyICppX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1BoZHIgKmlfcGhkcnA7CS8qIEVsZiBwcm9ncmFtIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICB1bnNpZ25lZCBpbnQgcGhpbmRleDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZDsKLQotICAvKiBSZWFkIGluIHRoZSBFTEYgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X2VoZHIsIHNpemVvZiAoeF9laGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh4X2VoZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBDaGVjayB0aGUgbWFnaWMgbnVtYmVyLiAqLwotICBpZiAoZWxmX2ZpbGVfcCAoJnhfZWhkcikgPT0gZmFsc2UpCi0gICAgewotICAgIHdyb25nOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRklYTUU6IENoZWNrIEVJX1ZFUlNJT04gaGVyZSAhICovCi0KLSAgLyogQ2hlY2sgdGhlIGFkZHJlc3Mgc2l6ZSAoImNsYXNzIikuICovCi0gIGlmICh4X2VoZHIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1MpCi0gICAgZ290byB3cm9uZzsKLQotICAvKiBDaGVjayB0aGUgYnl0ZW9yZGVyLiAqLwotICBzd2l0Y2ggKHhfZWhkci5lX2lkZW50W0VJX0RBVEFdKQotICAgIHsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOgkJLyogQmlnLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWdvdG8gd3Jvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOgkJLyogTGl0dGxlLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotCWdvdG8gd3Jvbmc7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZ290byB3cm9uZzsKLSAgICB9Ci0KLSAgLyogR2l2ZSBhYmZkIGFuIGVsZl9vYmpfdGRhdGEuICovCi0gIGVsZl90ZGF0YSAoYWJmZCkgPQotICAgIChzdHJ1Y3QgZWxmX29ial90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChlbGZfdGRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogRklYTUU6IGZyb20gaGVyZSBvbiBkb3duLCAiZ290byB3cm9uZyIgd2lsbCBsZWFrIG1lbW9yeS4gICovCi0KLSAgLyogU3dhcCBpbiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLCBub3cgdGhhdCB3ZSBoYXZlIHRoZSBieXRlIG9yZGVyLiAqLwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIGVsZl9zd2FwX2VoZHJfaW4gKGFiZmQsICZ4X2VoZHIsIGlfZWhkcnApOwotCi0jaWYgREVCVUcgJiAxCi0gIGVsZl9kZWJ1Z19maWxlIChpX2VoZHJwKTsKLSNlbmRpZgotCi0gIGViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBFTEYgZV9tYWNoaW5lIGZpZWxkIG1hdGNoZXMgd2hhdCB0aGlzIHBhcnRpY3VsYXIKLSAgICAgQkZEIGZvcm1hdCBleHBlY3RzLiAgKi8KLQotICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IGlfZWhkcnAtPmVfbWFjaGluZQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MSA9PSAwCi0JICB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQxKQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MiA9PSAwCi0JICB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQyKSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldF9wdHI7Ci0KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIHdyb25nOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICBMZXQgaXQgbWF0Y2ggYW55IEVMRiB0YXJnZXQKLQkgZm9yIHdoaWNoIHdlIGRvIG5vdCBoYXZlIGEgc3BlY2lmaWMgYmFja2VuZC4gICovCi0KLSAgICAgIGZvciAodGFyZ2V0X3B0ciA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0X3B0ciAhPSBOVUxMOyB0YXJnZXRfcHRyKyspCi0JewotCSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJhY2s7Ci0KLQkgIGlmICgoKnRhcmdldF9wdHIpLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIGNvbnRpbnVlOwotCSAgYmFjayA9IChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoKnRhcmdldF9wdHIpLT5iYWNrZW5kX2RhdGE7Ci0JICBpZiAoYmFjay0+ZWxmX21hY2hpbmVfY29kZSA9PSBpX2VoZHJwLT5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgICAvKiB0YXJnZXRfcHRyIGlzIGFuIEVMRiBiYWNrZW5kIHdoaWNoIG1hdGNoZXMgdGhpcwotCQkgb2JqZWN0IGZpbGUsIHNvIHJlamVjdCB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0LiAgKi8KLQkgICAgICBnb3RvIHdyb25nOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBubyBwcm9ncmFtIGhlYWRlciwgb3IgdGhlIHR5cGUgaXMgbm90IGEgY29yZSBmaWxlLCB0aGVuCi0gICAgIHdlIGFyZSBob3NlZC4gKi8KLSAgaWYgKGlfZWhkcnAtPmVfcGhvZmYgPT0gMCB8fCBpX2VoZHJwLT5lX3R5cGUgIT0gRVRfQ09SRSkKLSAgICBnb3RvIHdyb25nOwotCi0gIC8qIERvZXMgQkZEJ3MgaWRlYSBvZiB0aGUgcGhkciBzaXplIG1hdGNoIHRoZSBzaXplCi0gICAgIHJlY29yZGVkIGluIHRoZSBmaWxlPyAqLwotICBpZiAoaV9laGRycC0+ZV9waGVudHNpemUgIT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcikpCi0gICAgZ290byB3cm9uZzsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHByb2dyYW0gaGVhZGVycy4gKi8KLSAgaV9waGRycCA9IChFbGZfSW50ZXJuYWxfUGhkciAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaV9waGRycCkgKiBpX2VoZHJwLT5lX3BobnVtKTsKLSAgaWYgKCFpX3BoZHJwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSBpX3BoZHJwOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdG8gaW50ZXJuYWwgZm9ybS4gKi8KLSAgZm9yIChwaGluZGV4ID0gMDsgcGhpbmRleCA8IGlfZWhkcnAtPmVfcGhudW07ICsrcGhpbmRleCkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUGhkciB4X3BoZHI7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZ4X3BoZHIsIHNpemVvZiAoeF9waGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoeF9waGRyKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgJnhfcGhkciwgaV9waGRycCArIHBoaW5kZXgpOwotICAgIH0KLQotICAvKiBQcm9jZXNzIGVhY2ggcHJvZ3JhbSBoZWFkZXIuICovCi0gIGZvciAocGhpbmRleCA9IDA7IHBoaW5kZXggPCBpX2VoZHJwLT5lX3BobnVtOyArK3BoaW5kZXgpCi0gICAgewotICAgICAgaWYgKCFfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGlfcGhkcnAgKyBwaGluZGV4LCBwaGluZGV4KSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZS4gKi8KLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgZWJkLT5hcmNoLCAwKSkKLSAgICB7Ci0gICAgICAvKiBJdCdzIE9LIGlmIHRoaXMgZmFpbHMgZm9yIHRoZSBnZW5lcmljIHRhcmdldC4gICovCi0gICAgICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IEVNX05PTkUpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gdGhlIEVMRiBoZWFkZXIuICovCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuYyBiL2JmZC9lbGZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDRlMWIuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKiBFTEYgbGlua2luZyBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2RlZmluZSBBUkNIX1NJWkUgMAotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotYm9vbGVhbgotX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpbnQgcHRyYWxpZ247Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmdvdCIpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKLSAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gICAgfQotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJlZC0+d2FudF9nb3RfcGx0KQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdC5wbHQiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlIC5nb3QKLSAgICAgKG9yIC5nb3QucGx0KSBzZWN0aW9uLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgbGlua2VyIHNjcmlwdAotICAgICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgaWYgd2UgYXJlIG5vdCBjcmVhdGluZwotICAgICBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JIGJlZC0+Z290X3N5bWJvbF9vZmZzZXQsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSBiZWQtPmNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9IGg7Ci0KLSAgLyogVGhlIGZpcnN0IGJpdCBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBpcyB0aGUgaGVhZGVyLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGJlZC0+Z290X2hlYWRlcl9zaXplICsgYmVkLT5nb3Rfc3ltYm9sX29mZnNldDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLQotLyogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFncywgcGx0ZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpbnQgcHRyYWxpZ247Ci0KLSAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKLSAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5wbHQsIC5yZWxbYV0ucGx0LCAuZ290LCAuZ290LnBsdCwgLmR5bmJzcywgYW5kCi0gICAgIC5yZWxbYV0uYnNzIHNlY3Rpb25zLiAgKi8KLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIHBsdGZsYWdzID0gZmxhZ3M7Ci0gIHBsdGZsYWdzIHw9IFNFQ19DT0RFOwotICBpZiAoYmVkLT5wbHRfbm90X2xvYWRlZCkKLSAgICBwbHRmbGFncyAmPSB+IChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotICBpZiAoYmVkLT5wbHRfcmVhZG9ubHkpCi0gICAgcGx0ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgcGx0ZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIGJlZC0+cGx0X2FsaWdubWVudCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPndhbnRfcGx0X3N5bSkKLSAgICB7Ci0gICAgICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKLQkgLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgCi0JCQliZWQtPmRlZmF1bHRfdXNlX3JlbGFfcCA/ICIucmVsYS5wbHQiIDogIi5yZWwucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgLmR5bmJzcyBzZWN0aW9uIGlzIGEgcGxhY2UgdG8gcHV0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQKLSAgICAgYnkgZHluYW1pYyBvYmplY3RzLCBhcmUgcmVmZXJlbmNlZCBieSByZWd1bGFyIG9iamVjdHMsIGFuZCBhcmUKLSAgICAgbm90IGZ1bmN0aW9ucy4gIFdlIG11c3QgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIHByb2Nlc3MKLSAgICAgaW1hZ2UgYW5kIHVzZSBhIFJfKl9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGluaXRpYWxpemUgdGhlbSBhdCBydW4gdGltZS4gIFRoZSBsaW5rZXIgc2NyaXB0IHB1dHMgdGhlIC5keW5ic3MKLSAgICAgc2VjdGlvbiBpbnRvIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGZpbmFsIGltYWdlLiAgKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgLnJlbFthXS5ic3Mgc2VjdGlvbiBob2xkcyBjb3B5IHJlbG9jcy4gIFRoaXMgc2VjdGlvbiBpcyBub3QKLSAgICAgbm9ybWFsbHkgbmVlZGVkLiAgV2UgbmVlZCB0byBjcmVhdGUgaXQgaGVyZSwgdGhvdWdoLCBzbyB0aGF0IHRoZQotICAgICBsaW5rZXIgd2lsbCBtYXAgaXQgdG8gYW4gb3V0cHV0IHNlY3Rpb24uICBXZSBjYW4ndCBqdXN0IGNyZWF0ZSBpdAotICAgICBvbmx5IGlmIHdlIG5lZWQgaXQsIGJlY2F1c2Ugd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHdlIG5lZWQgaXQKLSAgICAgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIGFuZCB0aGUgZmlyc3QgdGltZSB0aGUKLSAgICAgbWFpbiBsaW5rZXIgY29kZSBjYWxscyBCRkQgYWZ0ZXIgZXhhbWluaW5nIGFsbCB0aGUgaW5wdXQgZmlsZXMKLSAgICAgKHNpemVfZHluYW1pY19zZWN0aW9ucykgdGhlIGlucHV0IHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCi0gICAgIG1hcHBlZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgSWYgdGhlIHNlY3Rpb24gdHVybnMgb3V0IG5vdCB0bwotICAgICBiZSBuZWVkZWQsIHdlIGNhbiBkaXNjYXJkIGl0IGxhdGVyLiAgV2Ugd2lsbCBuZXZlciBuZWVkIHRoaXMKLSAgICAgc2VjdGlvbiB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCBzaW5jZSB0aGV5IGRvIG5vdCB1c2UKLSAgICAgY29weSByZWxvY3MuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIAotCQkJICAgIChiZWQtPmRlZmF1bHRfdXNlX3JlbGFfcCAKLQkJCSAgICAgPyAiLnJlbGEuYnNzIiA6ICIucmVsLmJzcyIpKTsgCi0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWNvcmQgYSBuZXcgZHluYW1pYyBzeW1ib2wuICBXZSByZWNvcmQgdGhlIGR5bmFtaWMgc3ltYm9scyBhcyB3ZQotICAgcmVhZCB0aGUgaW5wdXQgZmlsZXMsIHNpbmNlIHdlIG5lZWQgdG8gaGF2ZSBhIGxpc3Qgb2YgYWxsIG9mIHRoZW0KLSAgIGJlZm9yZSB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaW5hbCBzaXplcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb25zLgotICAgTm90ZSB0aGF0IHdlIG1heSBhY3R1YWxseSBjYWxsIHRoaXMgZnVuY3Rpb24gZXZlbiB0aG91Z2ggd2UgYXJlIG5vdAotICAgZ29pbmcgdG8gb3V0cHV0IGFueSBkeW5hbWljIHN5bWJvbHM7IGluIHNvbWUgY2FzZXMgd2Uga25vdyB0aGF0IGEKLSAgIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBidXQgb25seSBpZiB0aGVyZSBpcwotICAgb25lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAgICAgY2hhciAqcCwgKmFsYzsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIGNvcHk7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIGgtPmR5bmluZHggPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotCSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLQkgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgZG9uJ3QgcHV0IGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBkeW5hbWljIHN0cmluZwotICAgICAgICAgdGFibGUuICAqLwotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGFsYyA9IE5VTEw7Ci0JICBjb3B5ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0JICBpZiAoYWxjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cm5jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7Ci0JICBuYW1lID0gYWxjOwotCSAgY29weSA9IHRydWU7Ci0JfQotCi0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIG5hbWUsIHRydWUsIGNvcHkpOwotCi0gICAgICBpZiAoYWxjICE9IE5VTEwpCi0JZnJlZSAoYWxjKTsKLQotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IGluZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZWFzZSB0aGUgaW5kZXggYXQgd2hpY2ggSCB3aWxsIGFwcGVhciBpbiB0aGUgZHluYW1pYyBzeW1ib2wKLSAgIHRhYmxlIGJ5IElOQ1JFTUVOVCAod2hpY2ggaXMgcmVhbGx5IGFuIGBpbnQgKicpLiAgQ2FsbGVkIHZpYQotICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHggKGgsIGluY3JlbWVudCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpbmNyZW1lbnQ7Ci17Ci0gIGlmIChoLT5keW5pbmR4ICE9IC0xKQotICAgIGgtPmR5bmluZHggKz0gKigoaW50ICopIGluY3JlbWVudCk7Ci0gICAgCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiwgb3IgcmV0dXJuIGEgcG9pbnRlciB0byBhIGxpbmtlciBzZWN0aW9uIGFscmVhZHkgY3JlYXRlZCAgKi8KLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCwgZGVmYXVsdHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0gd2hpY2g7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0czsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBsc2VjdCA9IChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKQotCWJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl90KSk7Ci0KLSAgICAgICpsc2VjdCA9ICpkZWZhdWx0czsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCkgPSBsc2VjdDsKLSAgICAgIGxzZWN0LT53aGljaCA9IHdoaWNoOwotICAgICAgbHNlY3QtPmhvbGVfd3JpdHRlbl9wID0gZmFsc2U7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGUgc2VjdGlvbnMgYWxyZWFkeSBleGlzdCAqLwotICAgICAgbHNlY3QtPnNlY3Rpb24gPSBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPm5hbWUpOwotICAgICAgaWYgKCFzIHx8IChzLT5mbGFncyAmIGRlZmF1bHRzLT5mbGFncykgIT0gZGVmYXVsdHMtPmZsYWdzKQotCXsKLQkgIGxzZWN0LT5zZWN0aW9uID0gcyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChkeW5vYmosIGxzZWN0LT5uYW1lKTsKLQotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLCBkZWZhdWx0cy0+ZmxhZ3MpOwotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBsc2VjdC0+YWxpZ25tZW50KTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpIDwgbHNlY3QtPmFsaWdubWVudCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIGxzZWN0LT5hbGlnbm1lbnQpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBhbGlnbl9wb3dlciAocy0+X3Jhd19zaXplLCBsc2VjdC0+YWxpZ25tZW50KTsKLQotICAgICAgLyogSXMgdGhlcmUgYSBob2xlIHdlIGhhdmUgdG8gcHJvdmlkZT8gIElmIHNvIGNoZWNrIHdoZXRoZXIgdGhlIHNlZ21lbnQgaXMKLQkgdG9vIGJpZyBhbHJlYWR5ICovCi0gICAgICBpZiAobHNlY3QtPmhvbGVfc2l6ZSkKLQl7Ci0JICBsc2VjdC0+aG9sZV9vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0JICBzLT5fcmF3X3NpemUgKz0gbHNlY3QtPmhvbGVfc2l6ZTsKLQkgIGlmIChsc2VjdC0+aG9sZV9vZmZzZXQgPiBsc2VjdC0+bWF4X2hvbGVfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogU2VjdGlvbiAlcyBpcyBhbHJlYWR5IHRvIGxhcmdlIHRvIHB1dCBob2xlIG9mICVsZCBieXRlcyBpbiIpLAotCQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAgICBsc2VjdC0+bmFtZSwKLQkJCQkgICAgIChsb25nKWxzZWN0LT5ob2xlX3NpemUpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ3JlYXRpbmcgc2VjdGlvbiAlcywgY3VycmVudCBzaXplID0gJWxkXG4iLAotCSAgICAgICBsc2VjdC0+bmFtZSwgKGxvbmcpcy0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAobHNlY3QtPnN5bV9uYW1lKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQWRkaW5nICVzIHRvIHNlY3Rpb24gJXNcbiIsCi0JCSAgIGxzZWN0LT5zeW1fbmFtZSwKLQkJICAgbHNlY3QtPm5hbWUpOwotI2VuZGlmCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBsc2VjdC0+c3ltX25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgICAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCSAgICAgbHNlY3QtPnN5bV9uYW1lLAotCQkJCQkJICAgICBCU0ZfR0xPQkFMLAotCQkJCQkJICAgICBzLAotCQkJCQkJICAgICAoKGxzZWN0LT5ob2xlX3NpemUpCi0JCQkJCQkgICAgICA/IHMtPl9yYXdfc2l6ZSAtIGxzZWN0LT5ob2xlX3NpemUgKyBsc2VjdC0+c3ltX29mZnNldAotCQkJCQkJICAgICAgOiBsc2VjdC0+c3ltX29mZnNldCksCi0JCQkJCQkgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgIGZhbHNlLAotCQkJCQkJICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGlmICgoZGVmYXVsdHMtPndoaWNoICE9IExJTktFUl9TRUNUSU9OX1NEQVRBKQotCSAgICAgICYmIChkZWZhdWx0cy0+d2hpY2ggIT0gTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCi0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgIGxzZWN0LT5zeW1faGFzaCA9IGg7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JfQotICAgIH0KLQotI2lmIDAKLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiAgVGhlIHNlY3Rpb25zIHdoaWNoIG1heSBleGlzdCBpbiB0aGUKLSAgICAgb2JqZWN0IGZpbGUgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHNlY3Rpb25zIHdlIHdhbnQgdG8KLSAgICAgY3JlYXRlLiAgKi8KLQotICAvKiBGaW5kIHRoZSByZWxhdGVkIHNlY3Rpb25zIGlmIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KLSAgaWYgKGxzZWN0LT5ic3NfbmFtZSAmJiAhbHNlY3QtPmJzc19zZWN0aW9uKQotICAgIGxzZWN0LT5ic3Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5ic3NfbmFtZSk7Ci0KLSAgaWYgKGxzZWN0LT5yZWxfbmFtZSAmJiAhbHNlY3QtPnJlbF9zZWN0aW9uKQotICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5yZWxfbmFtZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0KLQwKLS8qIEZpbmQgYSBsaW5rZXIgZ2VuZXJhdGVkIHBvaW50ZXIgd2l0aCBhIGdpdmVuIGFkZGVuZCBhbmQgdHlwZS4gICovCi0KLWVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoKLV9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAobGlua2VyX3BvaW50ZXJzLCBhZGRlbmQsIHdoaWNoKQotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzOwotICAgICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7Ci17Ci0gIGZvciAoIDsgbGlua2VyX3BvaW50ZXJzICE9IE5VTEw7IGxpbmtlcl9wb2ludGVycyA9IGxpbmtlcl9wb2ludGVycy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAod2hpY2ggPT0gbGlua2VyX3BvaW50ZXJzLT53aGljaCAmJiBhZGRlbmQgPT0gbGlua2VyX3BvaW50ZXJzLT5hZGRlbmQpCi0JcmV0dXJuIGxpbmtlcl9wb2ludGVyczsKLSAgICB9Ci0KLSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci19Ci0KLQwKLS8qIE1ha2UgdGhlIC5yZWxhIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhIChkeW5vYmosIGxzZWN0LCBhbGlnbm1lbnQpCi0gICAgIGJmZCAqZHlub2JqOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci17Ci0gIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgICAgIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24gPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwKLQkJCQkgICAgICBsc2VjdC0+cmVsX3NlY3Rpb24sCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIGxzZWN0LT5yZWxfc2VjdGlvbiwgYWxpZ25tZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuaCBiL2JmZC9lbGZsaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZGViY2EuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzMzkgKzAsMCBAQAotLyogRUxGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRUxGIGxpbmtlciBjb2RlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHJvdXRpbmVzIGNhbGxlZCB2aWEKLSAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2Ugd2hpY2ggbXVzdCByZXR1cm4gZmFpbHVyZS4gICovCi0KLXN0cnVjdCBlbGZfaW5mb19mYWlsZWQKLXsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWVyZ2Vfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiwKLQkgICBib29sZWFuICosIGJvb2xlYW4gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9maXhfc3ltYm9sX2ZsYWdzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9jb2xsZWN0X2hhc2hfY29kZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBQVFIsIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgZWxmX2xpbmtfb3V0cHV0X3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIEdpdmVuIGFuIEVMRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1lbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0dXJuIGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0MCi0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gRUxGIGFyY2hpdmUgZmlsZSB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBXZQotICAgZG9uJ3QgdXNlIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgYmVjYXVzZSBvZiBhCi0gICBwcm9ibGVtIHdoaWNoIGFyaXNlcyBvbiBVbml4V2FyZS4gIFRoZSBVbml4V2FyZSBsaWJjLnNvIGlzIGFuCi0gICBhcmNoaXZlIHdoaWNoIGluY2x1ZGVzIGFuIGVudHJ5IGxpYmMuc28uMSB3aGljaCBkZWZpbmVzIGEgYnVuY2ggb2YKLSAgIHN5bWJvbHMuICBUaGUgbGliYy5zbyBhcmNoaXZlIGFsc28gaW5jbHVkZXMgYSBudW1iZXIgb2Ygb3RoZXIKLSAgIG9iamVjdCBmaWxlcywgd2hpY2ggYWxzbyBkZWZpbmUgc3ltYm9scywgc29tZSBvZiB3aGljaCBhcmUgdGhlIHNhbWUKLSAgIGFzIHRob3NlIGRlZmluZWQgaW4gbGliYy5zby4xLiAgQ29ycmVjdCBsaW5raW5nIHJlcXVpcmVzIHRoYXQgd2UKLSAgIGNvbnNpZGVyIGVhY2ggb2JqZWN0IGZpbGUgaW4gdHVybiwgYW5kIGluY2x1ZGUgaXQgaWYgaXQgZGVmaW5lcyBhbnkKLSAgIHN5bWJvbHMgd2UgbmVlZC4gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgZG9lcyBub3QgZG8KLSAgIHRoaXM7IGl0IGxvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBpbmNsdWRlcwotICAgYW55IG9iamVjdCBmaWxlIHdoaWNoIGRlZmluZXMgdGhlbS4gIFdoZW4gdGhpcyBhbGdvcml0aG0gaXMgdXNlZCBvbgotICAgVW5peFdhcmUsIGl0IHdpbmRzIHVwIHB1bGxpbmcgaW4gbGliYy5zby4xIGVhcmx5IGFuZCBkZWZpbmluZyBhCi0gICBidW5jaCBvZiBzeW1ib2xzLiAgVGhpcyBtZWFucyB0aGF0IHNvbWUgb2YgdGhlIG90aGVyIG9iamVjdHMgaW4gdGhlCi0gICBhcmNoaXZlIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGxpbmssIHdoaWNoIGlzIGluY29ycmVjdCBzaW5jZSB0aGV5Ci0gICBwcmVjZWRlIGxpYmMuc28uMSBpbiB0aGUgYXJjaGl2ZS4KLQotICAgRm9ydHVuYXRlbHksIEVMRiBhcmNoaXZlIGhhbmRsaW5nIGlzIHNpbXBsZXIgdGhhbiB0aGF0IGRvbmUgYnkKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMsIHdoaWNoIGhhcyB0byBhbGxvdyBmb3IgYS5vdXQKLSAgIG9kZGl0aWVzLiAgSW4gRUxGLCBpZiB3ZSBmaW5kIGEgc3ltYm9sIGluIHRoZSBhcmNoaXZlIG1hcCwgYW5kIHRoZQotICAgc3ltYm9sIGlzIGN1cnJlbnRseSB1bmRlZmluZWQsIHdlIGtub3cgdGhhdCB3ZSBtdXN0IHB1bGwgaW4gdGhhdAotICAgb2JqZWN0IGZpbGUuCi0KLSAgIFVuZm9ydHVuYXRlbHksIHdlIGRvIGhhdmUgdG8gbWFrZSBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgc3ltYm9sCi0gICB0YWJsZSB1bnRpbCBub3RoaW5nIGZ1cnRoZXIgaXMgcmVzb2x2ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3ltaW5kZXggYzsKLSAgYm9vbGVhbiAqZGVmaW5lZCA9IE5VTEw7Ci0gIGJvb2xlYW4gKmluY2x1ZGVkID0gTlVMTDsKLSAgY2Fyc3ltICpzeW1kZWZzOwotICBib29sZWFuIGxvb3A7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEtlZXAgdHJhY2sgb2YgYWxsIHN5bWJvbHMgd2Uga25vdyB0byBiZSBhbHJlYWR5IGRlZmluZWQsIGFuZCBhbGwKLSAgICAgZmlsZXMgd2Uga25vdyB0byBiZSBhbHJlYWR5IGluY2x1ZGVkLiAgVGhpcyBpcyB0byBzcGVlZCB1cCB0aGUKLSAgICAgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHBhc3Nlcy4gICovCi0gIGMgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50OwotICBpZiAoYyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBkZWZpbmVkID0gKGJvb2xlYW4gKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoYm9vbGVhbikpOwotICBpbmNsdWRlZCA9IChib29sZWFuICopIGJmZF9tYWxsb2MgKGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgaWYgKGRlZmluZWQgPT0gKGJvb2xlYW4gKikgTlVMTCB8fCBpbmNsdWRlZCA9PSAoYm9vbGVhbiAqKSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKGRlZmluZWQsIDAsIGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgbWVtc2V0IChpbmNsdWRlZCwgMCwgYyAqIHNpemVvZiAoYm9vbGVhbikpOwotCi0gIHN5bWRlZnMgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmczsKLQotICBkbwotICAgIHsKLSAgICAgIGZpbGVfcHRyIGxhc3Q7Ci0gICAgICBzeW1pbmRleCBpOwotICAgICAgY2Fyc3ltICpzeW1kZWY7Ci0gICAgICBjYXJzeW0gKnN5bWRlZmVuZDsKLQotICAgICAgbG9vcCA9IGZhbHNlOwotICAgICAgbGFzdCA9IC0xOwotCi0gICAgICBzeW1kZWYgPSBzeW1kZWZzOwotICAgICAgc3ltZGVmZW5kID0gc3ltZGVmICsgYzsKLSAgICAgIGZvciAoaSA9IDA7IHN5bWRlZiA8IHN5bWRlZmVuZDsgc3ltZGVmKyssIGkrKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIGJmZCAqZWxlbWVudDsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnNfdGFpbDsKLQkgIHN5bWluZGV4IG1hcms7Ci0KLQkgIGlmIChkZWZpbmVkW2ldIHx8IGluY2x1ZGVkW2ldKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChzeW1kZWYtPmZpbGVfb2Zmc2V0ID09IGxhc3QpCi0JICAgIHsKLQkgICAgICBpbmNsdWRlZFtpXSA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIHN5bWRlZi0+bmFtZSwKLQkJCQkgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGFyICpwLCAqY29weTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBkZWZhdWx0IHZlcnNpb24gKHRoZSBuYW1lIGNvbnRhaW5zIEBAKSwKLQkJIGxvb2sgdXAgdGhlIHN5bWJvbCBhZ2FpbiB3aXRob3V0IHRoZSB2ZXJzaW9uLiAgVGhlCi0JCSBlZmZlY3QgaXMgdGhhdCByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgd2l0aG91dCB0aGUKLQkJIHZlcnNpb24gd2lsbCBiZSBtYXRjaGVkIGJ5IHRoZSBkZWZhdWx0IHN5bWJvbCBpbiB0aGUKLQkJIGFyY2hpdmUuICAqLwotCi0JICAgICAgcCA9IHN0cmNociAoc3ltZGVmLT5uYW1lLCBFTEZfVkVSX0NIUik7Ci0JICAgICAgaWYgKHAgPT0gTlVMTCB8fCBwWzFdICE9IEVMRl9WRVJfQ0hSKQotCQljb250aW51ZTsKLQotCSAgICAgIGNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHAgLSBzeW1kZWYtPm5hbWUgKyAxKTsKLQkgICAgICBpZiAoY29weSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBtZW1jcHkgKGNvcHksIHN5bWRlZi0+bmFtZSwgcCAtIHN5bWRlZi0+bmFtZSk7Ci0JICAgICAgY29weVtwIC0gc3ltZGVmLT5uYW1lXSA9ICdcMCc7Ci0KLQkgICAgICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgY29weSwKLQkJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29weSk7Ci0JICAgIH0KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlkZWZpbmVkW2ldID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGluY2x1ZGUgdGhpcyBhcmNoaXZlIG1lbWJlci4gICovCi0KLQkgIGVsZW1lbnQgPSBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgc3ltZGVmLT5maWxlX29mZnNldCk7Ci0JICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIERvdWJsZWNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgaW5jbHVkZWQgdGhpcyBvYmplY3QKLQkgICAgIGFscmVhZHktLWl0IHNob3VsZCBiZSBpbXBvc3NpYmxlLCBidXQgdGhlcmUgbWF5IGJlCi0JICAgICBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgYXJjaGl2ZS4gICovCi0JICBpZiAoZWxlbWVudC0+YXJjaGl2ZV9wYXNzICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gMTsKLQotCSAgdW5kZWZzX3RhaWwgPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbDsKLQotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBlbGVtZW50LAotCQkJCQkJCSBzeW1kZWYtPm5hbWUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmICghIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoZWxlbWVudCwgaW5mbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBJZiB0aGVyZSBhcmUgYW55IG5ldyB1bmRlZmluZWQgc3ltYm9scywgd2UgbmVlZCB0byBtYWtlCi0JICAgICBhbm90aGVyIHBhc3MgdGhyb3VnaCB0aGUgYXJjaGl2ZSBpbiBvcmRlciB0byBzZWUgd2hldGhlcgotCSAgICAgdGhleSBjYW4gYmUgZGVmaW5lZC4gIEZJWE1FOiBUaGlzIGlzbid0IHBlcmZlY3QsIGJlY2F1c2UKLQkgICAgIGNvbW1vbiBzeW1ib2xzIHdpbmQgdXAgb24gdW5kZWZzX3RhaWwgYW5kIGJlY2F1c2UgYW4KLQkgICAgIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBsYXRlciBvbiBpbiB0aGlzIHBhc3MKLQkgICAgIGRvZXMgbm90IHJlcXVpcmUgYW5vdGhlciBwYXNzLiAgVGhpcyBpc24ndCBhIGJ1ZywgYnV0IGl0Ci0JICAgICBkb2VzIG1ha2UgdGhlIGNvZGUgbGVzcyBlZmZpY2llbnQgdGhhbiBpdCBjb3VsZCBiZS4gICovCi0JICBpZiAodW5kZWZzX3RhaWwgIT0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwpCi0JICAgIGxvb3AgPSB0cnVlOwotCi0JICAvKiBMb29rIGJhY2t3YXJkIHRvIG1hcmsgYWxsIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlCi0JICAgICB3aGljaCB3ZSBoYXZlIGFscmVhZHkgc2VlbiBpbiB0aGlzIHBhc3MuICAqLwotCSAgbWFyayA9IGk7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaW5jbHVkZWRbbWFya10gPSB0cnVlOwotCSAgICAgIGlmIChtYXJrID09IDApCi0JCWJyZWFrOwotCSAgICAgIC0tbWFyazsKLQkgICAgfQotCSAgd2hpbGUgKHN5bWRlZnNbbWFya10uZmlsZV9vZmZzZXQgPT0gc3ltZGVmLT5maWxlX29mZnNldCk7Ci0KLQkgIC8qIFdlIG1hcmsgc3Vic2VxdWVudCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBhcyB3ZSBnbwotCSAgICAgb24gdGhyb3VnaCB0aGUgbG9vcC4gICovCi0JICBsYXN0ID0gc3ltZGVmLT5maWxlX29mZnNldDsKLQl9Ci0gICAgfQotICB3aGlsZSAobG9vcCk7Ci0KLSAgZnJlZSAoZGVmaW5lZCk7Ci0gIGZyZWUgKGluY2x1ZGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGRlZmluZWQgIT0gKGJvb2xlYW4gKikgTlVMTCkKLSAgICBmcmVlIChkZWZpbmVkKTsKLSAgaWYgKGluY2x1ZGVkICE9IChib29sZWFuICopIE5VTEwpCi0gICAgZnJlZSAoaW5jbHVkZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBkZWZpbmUgYSBuZXcgc3ltYm9sLiAgSXQKLSAgIGhhbmRsZXMgdGhlIHZhcmlvdXMgY2FzZXMgd2hpY2ggYXJpc2Ugd2hlbiB3ZSBmaW5kIGEgZGVmaW5pdGlvbiBpbgotICAgYSBkeW5hbWljIG9iamVjdCwgb3Igd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgZGVmaW5pdGlvbiBpbiBhCi0gICBkeW5hbWljIG9iamVjdC4gIFRoZSBuZXcgc3ltYm9sIGlzIGRlc2NyaWJlZCBieSBOQU1FLCBTWU0sIFBTRUMsCi0gICBhbmQgUFZBTFVFLiAgV2Ugc2V0IFNZTV9IQVNIIHRvIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgV2Ugc2V0Ci0gICBPVkVSUklERSBpZiB0aGUgb2xkIHN5bWJvbCBpcyBvdmVycmlkaW5nIGEgbmV3IGRlZmluaXRpb24uICBXZSBzZXQKLSAgIFRZUEVfQ0hBTkdFX09LIGlmIGl0IGlzIE9LIGZvciB0aGUgdHlwZSB0byBjaGFuZ2UuICBXZSBzZXQKLSAgIFNJWkVfQ0hBTkdFX09LIGlmIGl0IGlzIE9LIGZvciB0aGUgc2l6ZSB0byBjaGFuZ2UuICBCeSBPSyB0bwotICAgY2hhbmdlLCB3ZSBtZWFuIHRoYXQgd2Ugc2hvdWxkbid0IHdhcm4gaWYgdGhlIHR5cGUgb3Igc2l6ZSBkb2VzCi0gICBjaGFuZ2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgbmFtZSwgc3ltLCBwc2VjLCBwdmFsdWUsIHN5bV9oYXNoLAotCQkgIG92ZXJyaWRlLCB0eXBlX2NoYW5nZV9vaywgc2l6ZV9jaGFuZ2Vfb2spCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgYXNlY3Rpb24gKipwc2VjOwotICAgICBiZmRfdm1hICpwdmFsdWU7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gICAgIGJvb2xlYW4gKm92ZXJyaWRlOwotICAgICBib29sZWFuICp0eXBlX2NoYW5nZV9vazsKLSAgICAgYm9vbGVhbiAqc2l6ZV9jaGFuZ2Vfb2s7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBpbnQgYmluZDsKLSAgYmZkICpvbGRiZmQ7Ci0gIGJvb2xlYW4gbmV3ZHluLCBvbGRkeW4sIG9sZGRlZiwgbmV3ZGVmLCBuZXdkeW5jb21tb24sIG9sZGR5bmNvbW1vbjsKLQotICAqb3ZlcnJpZGUgPSBmYWxzZTsKLQotICBzZWMgPSAqcHNlYzsKLSAgYmluZCA9IEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pOwotCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgZWxzZQotICAgIGggPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGZhbHNlLCBmYWxzZSkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKnN5bV9oYXNoID0gaDsKLQotICAvKiBUaGlzIGNvZGUgaXMgZm9yIGNvcGluZyB3aXRoIGR5bmFtaWMgb2JqZWN0cywgYW5kIGlzIG9ubHkgdXNlZnVsCi0gICAgIGlmIHdlIGFyZSBkb2luZyBhbiBFTEYgbGluay4gICovCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRm9yIG1lcmdpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCByZWFsIHN5bWJvbHMuICAqLwotCi0gIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotICAvKiBJZiB3ZSBqdXN0IGNyZWF0ZWQgdGhlIHN5bWJvbCwgbWFyayBpdCBhcyBiZWluZyBhbiBFTEYgc3ltYm9sLgotICAgICBPdGhlciB0aGFuIHRoYXQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8tLXRoZXJlIGlzIG5vIG1lcmdlIGlzc3VlCi0gICAgIHdpdGggYSBuZXdseSBkZWZpbmVkIHN5bWJvbC0tc28gd2UganVzdCByZXR1cm4uICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBPTERCRkQgaXMgYSBCRkQgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGlzdGluZyBzeW1ib2wuICAqLwotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgb2xkYmZkID0gTlVMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgb2xkYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgb2xkYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm93bmVyOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEluIGNhc2VzIGludm9sdmluZyB3ZWFrIHZlcnNpb25lZCBzeW1ib2xzLCB3ZSBtYXkgd2luZCB1cCB0cnlpbmcKLSAgICAgdG8gbWVyZ2UgYSBzeW1ib2wgd2l0aCBpdHNlbGYuICBDYXRjaCB0aGF0IGhlcmUsIHRvIGF2b2lkIHRoZQotICAgICBjb25mdXNpb24gdGhhdCByZXN1bHRzIGlmIHdlIHRyeSB0byBvdmVycmlkZSBhIHN5bWJvbCB3aXRoCi0gICAgIGl0c2VsZi4gICovCi0gIGlmIChhYmZkID09IG9sZGJmZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBORVdEWU4gYW5kIE9MRERZTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKLSAgICAgcmVzcGVjdGl2ZWx5LCBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIG5ld2R5biA9IHRydWU7Ci0gIGVsc2UKLSAgICBuZXdkeW4gPSBmYWxzZTsKLQotICBpZiAob2xkYmZkID09IE5VTEwgfHwgKG9sZGJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIG9sZGR5biA9IGZhbHNlOwotICBlbHNlCi0gICAgb2xkZHluID0gdHJ1ZTsKLQotICAvKiBORVdERUYgYW5kIE9MRERFRiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKLSAgICAgcmVzcGVjdGl2ZWx5LCBhcHBlYXIgdG8gYmUgYSBkZWZpbml0aW9uIHJhdGhlciB0aGFuIHJlZmVyZW5jZS4gICovCi0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgbmV3ZGVmID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBuZXdkZWYgPSB0cnVlOwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIG9sZGRlZiA9IGZhbHNlOwotICBlbHNlCi0gICAgb2xkZGVmID0gdHJ1ZTsKLQotICAvKiBORVdEWU5DT01NT04gYW5kIE9MRERZTkNPTU1PTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkCi0gICAgIHN5bWJvbCwgcmVzcGVjdGl2ZWx5LCBhcHBlYXJzIHRvIGJlIGEgY29tbW9uIHN5bWJvbCBpbiBhIGR5bmFtaWMKLSAgICAgb2JqZWN0LiAgSWYgYSBzeW1ib2wgYXBwZWFycyBpbiBhbiB1bmluaXRpYWxpemVkIHNlY3Rpb24sIGFuZCBpcwotICAgICBub3Qgd2VhaywgYW5kIGlzIG5vdCBhIGZ1bmN0aW9uLCB0aGVuIGl0IG1heSBiZSBhIGNvbW1vbiBzeW1ib2wKLSAgICAgd2hpY2ggd2FzIHJlc29sdmVkIHdoZW4gdGhlIGR5bmFtaWMgb2JqZWN0IHdhcyBjcmVhdGVkLiAgV2Ugd2FudAotICAgICB0byB0cmVhdCBzdWNoIHN5bWJvbHMgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZXkgcmFpc2Ugc3BlY2lhbAotICAgICBjb25zaWRlcmF0aW9ucyB3aGVuIHNldHRpbmcgdGhlIHN5bWJvbCBzaXplOiBpZiB0aGUgc3ltYm9sCi0gICAgIGFwcGVhcnMgYXMgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QsIGFuZCB0aGUgc2l6ZSBpbgotICAgICB0aGUgcmVndWxhciBvYmplY3QgaXMgbGFyZ2VyLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIHVzZSB0aGUKLSAgICAgbGFyZ2VyIHNpemUuICBUaGlzIHByb2JsZW1hdGljIGNhc2UgY2FuIGFsd2F5cyBiZSBhdm9pZGVkIGluIEMsCi0gICAgIGJ1dCBpdCBtdXN0IGJlIGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gdXNpbmcgRm9ydHJhbiBzaGFyZWQKLSAgICAgbGlicmFyaWVzLgotCi0gICAgIE5vdGUgdGhhdCBpZiBORVdEWU5DT01NT04gaXMgc2V0LCBORVdERUYgd2lsbCBiZSBzZXQsIGFuZAotICAgICBsaWtld2lzZSBmb3IgT0xERFlOQ09NTU9OIGFuZCBPTERERUYuCi0KLSAgICAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBqdXN0IGEgaGV1cmlzdGljLCBhbmQgdGhhdCBpdCBpcyBxdWl0ZQotICAgICBwb3NzaWJsZSB0byBoYXZlIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdCB3aGljaAotICAgICBpcyByZWFsbHkgYSBkZWZpbml0aW9uLCByYXRoZXIgdGhhbiBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIGNvdWxkCi0gICAgIGxlYWQgdG8gc29tZSBtaW5vciBjb25mdXNpb24gd2hlbiB0aGUgc3ltYm9sIHJlYWxseSBpcyBhIGNvbW1vbgotICAgICBzeW1ib2wgaW4gc29tZSByZWd1bGFyIG9iamVjdC4gIEhvd2V2ZXIsIEkgdGhpbmsgaXQgd2lsbCBiZQotICAgICBoYXJtbGVzcy4gICovCi0KLSAgaWYgKG5ld2R5bgotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotICAgICAgJiYgc3ltLT5zdF9zaXplID4gMAotICAgICAgJiYgYmluZCAhPSBTVEJfV0VBSwotICAgICAgJiYgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX0ZVTkMpCi0gICAgbmV3ZHluY29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotCi0gIGlmIChvbGRkeW4KLSAgICAgICYmIG9sZGRlZgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotICAgICAgJiYgaC0+c2l6ZSA+IDAKLSAgICAgICYmIGgtPnR5cGUgIT0gU1RUX0ZVTkMpCi0gICAgb2xkZHluY29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gIC8qIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSB0eXBlIGlmIGVpdGhlciB0aGUgZXhpc3Rpbmcgc3ltYm9sIG9yIHRoZQotICAgICBuZXcgc3ltYm9sIGlzIHdlYWsuICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLSAgICAgIHx8IGJpbmQgPT0gU1RCX1dFQUspCi0gICAgKnR5cGVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAvKiBJdCdzIE9LIHRvIGNoYW5nZSB0aGUgc2l6ZSBpZiBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBvciB0aGUKLSAgICAgbmV3IHN5bWJvbCBpcyB3ZWFrLCBvciBpZiB0aGUgb2xkIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLwotCi0gIGlmICgqdHlwZV9jaGFuZ2Vfb2sKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gIC8qIElmIGJvdGggdGhlIG9sZCBhbmQgdGhlIG5ldyBzeW1ib2xzIGxvb2sgbGlrZSBjb21tb24gc3ltYm9scyBpbiBhCi0gICAgIGR5bmFtaWMgb2JqZWN0LCBzZXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0byB0aGUgbGFyZ2VyIG9mIHRoZQotICAgICB0d28uICAqLwotCi0gIGlmIChvbGRkeW5jb21tb24KLSAgICAgICYmIG5ld2R5bmNvbW1vbgotICAgICAgJiYgc3ltLT5zdF9zaXplICE9IGgtPnNpemUpCi0gICAgewotICAgICAgLyogU2luY2Ugd2UgdGhpbmsgd2UgaGF2ZSB0d28gY29tbW9uIHN5bWJvbHMsIGlzc3VlIGEgbXVsdGlwbGUKLSAgICAgICAgIGNvbW1vbiB3YXJuaW5nIGlmIGRlc2lyZWQuICBOb3RlIHRoYXQgd2Ugb25seSB3YXJuIGlmIHRoZQotICAgICAgICAgc2l6ZSBpcyBkaWZmZXJlbnQuICBJZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZSwgd2Ugc2ltcGx5IGxldAotICAgICAgICAgdGhlIG9sZCBzeW1ib2wgb3ZlcnJpZGUgdGhlIG5ldyBvbmUgYXMgbm9ybWFsbHkgaGFwcGVucyB3aXRoCi0gICAgICAgICBzeW1ib2xzIGRlZmluZWQgaW4gZHluYW1pYyBvYmplY3RzLiAgKi8KLQotICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgb2xkYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwKLQkgICAgICBoLT5zaXplLCBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc3ltLT5zdF9zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc3ltLT5zdF9zaXplID4gaC0+c2l6ZSkKLQloLT5zaXplID0gc3ltLT5zdF9zaXplOwotCi0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbG9va2luZyBhdCBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgaGF2ZSBmb3VuZCBhCi0gICAgIGRlZmluaXRpb24sIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZCBieQotICAgICBzb21lIG90aGVyIG9iamVjdC4gIElmIHNvLCB3ZSB3YW50IHRvIHVzZSB0aGUgZXhpc3RpbmcKLSAgICAgZGVmaW5pdGlvbiwgYW5kIHdlIGRvIG5vdCB3YW50IHRvIHJlcG9ydCBhIG11bHRpcGxlIHN5bWJvbAotICAgICBkZWZpbml0aW9uIGVycm9yOyB3ZSBkbyB0aGlzIGJ5IGNsb2JiZXJpbmcgKlBTRUMgdG8gYmUKLSAgICAgYmZkX3VuZF9zZWN0aW9uX3B0ci4KLQotICAgICBXZSB0cmVhdCBhIGNvbW1vbiBzeW1ib2wgYXMgYSBkZWZpbml0aW9uIGlmIHRoZSBzeW1ib2wgaW4gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGlzIGEgZnVuY3Rpb24sIHNpbmNlIGNvbW1vbiBzeW1ib2xzIGFsd2F5cwotICAgICByZXByZXNlbnQgdmFyaWFibGVzOyB0aGlzIGNhbiBjYXVzZSBjb25mdXNpb24gaW4gcHJpbmNpcGxlLCBidXQKLSAgICAgYW55IHN1Y2ggY29uZnVzaW9uIHdvdWxkIHNlZW0gdG8gaW5kaWNhdGUgYW4gZXJyb25lb3VzIHByb2dyYW0gb3IKLSAgICAgc2hhcmVkIGxpYnJhcnkuICBXZSBhbHNvIHBlcm1pdCBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyCi0gICAgIG9iamVjdCB0byBvdmVycmlkZSBhIHdlYWsgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4KLQotICAgICBXZSBwcmVmZXIgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnkgdG8gYSB3ZWFrCi0gICAgIGRlZmluaXRpb24gaW4gdGhlIGV4ZWN1dGFibGUuICAqLwotCi0gIGlmIChuZXdkeW4KLSAgICAgICYmIG5ld2RlZgotICAgICAgJiYgKG9sZGRlZgotCSAgfHwgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIChiaW5kID09IFNUQl9XRUFLCi0JCSAgfHwgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX0ZVTkMpKSkKLSAgICAgICYmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICB8fCBiaW5kID09IFNUQl9XRUFLKSkKLSAgICB7Ci0gICAgICAqb3ZlcnJpZGUgPSB0cnVlOwotICAgICAgbmV3ZGVmID0gZmFsc2U7Ci0gICAgICBuZXdkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgKnBzZWMgPSBzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2hlbiB0aGUgb2xkIHN5bWJvbCBpcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4KLSAgICAgICAgIHdlIGFyZSBleHBsaWNpdGx5IGxldHRpbmcgaXQgb3ZlcnJpZGUgYSB3ZWFrIHN5bWJvbCBvcgotICAgICAgICAgZnVuY3Rpb24gaW4gYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gd2FybiBhYm91dAotICAgICAgICAgYSB0eXBlIGNoYW5nZS4gIElmIHRoZSBvbGQgc3ltYm9sIGlzIGEgZGVmaW5lZCBzeW1ib2wsIGEgdHlwZQotICAgICAgICAgY2hhbmdlIHdhcm5pbmcgbWF5IHN0aWxsIGJlIGFwcHJvcHJpYXRlLiAgKi8KLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBvbGQgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYQotICAgICBuZXcgc3ltYm9sIHdoaWNoIGxvb2tzIGxpa2UgYSBjb21tb24gc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4KLSAgICAgV2UgY2hhbmdlICpQU0VDIGFuZCAqUFZBTFVFIHRvIG1ha2UgdGhlIG5ldyBzeW1ib2wgbG9vayBsaWtlIGEKLSAgICAgY29tbW9uIHN5bWJvbCwgYW5kIGxldCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aWxsIGRvCi0gICAgIHRoZSByaWdodCB0aGluZy4gICovCi0KLSAgaWYgKG5ld2R5bmNvbW1vbgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHsKLSAgICAgICpvdmVycmlkZSA9IHRydWU7Ci0gICAgICBuZXdkZWYgPSBmYWxzZTsKLSAgICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotICAgICAgKnB2YWx1ZSA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgICpwc2VjID0gc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvbGQgc3ltYm9sIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoZSBuZXcgc3ltYm9sIGlzCi0gICAgIGEgZGVmaW5pdGlvbiB3aGljaCBpcyBub3QgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBuZXcKLSAgICAgc3ltYm9sIG92ZXJyaWRlcyB0aGUgb2xkIHN5bWJvbC4gIFN5bWJvbHMgZnJvbSByZWd1bGFyIGZpbGVzCi0gICAgIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBzeW1ib2xzIGZyb20gZHluYW1pYyBvYmplY3RzLCBldmVuIGlmCi0gICAgIHRoZXkgYXJlIGRlZmluZWQgYWZ0ZXIgdGhlIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLgotCi0gICAgIEFzIGFib3ZlLCB3ZSBhZ2FpbiBwZXJtaXQgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QgdG8KLSAgICAgb3ZlcnJpZGUgYSBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdCBpZiB0aGUgc2hhcmVkIG9iamVjdAotICAgICBzeW1ib2wgaXMgYSBmdW5jdGlvbiBvciBpcyB3ZWFrLgotCi0gICAgIEFzIGFib3ZlLCB3ZSBwZXJtaXQgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdCB0bwotICAgICBvdmVycmlkZSBhIHdlYWsgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLQotICBpZiAoISBuZXdkeW4KLSAgICAgICYmIChuZXdkZWYKLQkgIHx8IChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgIHx8IGgtPnR5cGUgPT0gU1RUX0ZVTkMpKSkKLSAgICAgICYmIG9sZGR5bgotICAgICAgJiYgb2xkZGVmCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChiaW5kICE9IFNUQl9XRUFLCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICAvKiBDaGFuZ2UgdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gdW5kZWZpbmVkLCBhbmQgbGV0Ci0JIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIGRvIHRoZSByaWdodCB0aGluZyB3aXRoIHRoZQotCSBuZXcgZGVmaW5pdGlvbi4gICovCi0KLSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgb2xkZGVmID0gZmFsc2U7Ci0gICAgICBvbGRkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgLyogV2UgYWdhaW4gcGVybWl0IGEgdHlwZSBjaGFuZ2Ugd2hlbiBhIGNvbW1vbiBzeW1ib2wgbWF5IGJlCi0gICAgICAgICBvdmVycmlkaW5nIGEgZnVuY3Rpb24uICAqLwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCSp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIC8qIFRoaXMgdW5pb24gbWF5IGhhdmUgYmVlbiBzZXQgdG8gYmUgbm9uLU5VTEwgd2hlbiB0aGlzIHN5bWJvbAotCSB3YXMgc2VlbiBpbiBhIGR5bmFtaWMgb2JqZWN0LiAgV2UgbXVzdCBmb3JjZSB0aGUgdW5pb24gdG8gYmUKLQkgTlVMTCwgc28gdGhhdCBpdCBpcyBjb3JyZWN0IGZvciBhIHJlZ3VsYXIgc3ltYm9sLiAgKi8KLQotICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gTlVMTDsKLQotICAgICAgLyogSW4gdGhpcyBzcGVjaWFsIGNhc2UsIGlmIEggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdGlvbiwKLSAgICAgICAgIHdlIHdhbnQgdGhlIGNhbGxlciB0byBmcm9iIHdpdGggSCByYXRoZXIgdGhhbiB3aXRoIHRoZQotICAgICAgICAgaW5kaXJlY3Qgc3ltYm9sLiAgVGhhdCB3aWxsIHBlcm1pdCB0aGUgY2FsbGVyIHRvIHJlZGVmaW5lIHRoZQotICAgICAgICAgdGFyZ2V0IG9mIHRoZSBpbmRpcmVjdGlvbiwgcmF0aGVyIHRoYW4gdGhlIGluZGlyZWN0IHN5bWJvbAotICAgICAgICAgaXRzZWxmLiAgRklYTUU6IFRoaXMgd2lsbCBicmVhayB0aGUgLXkgb3B0aW9uIGlmIHdlIHN0b3JlIGEKLSAgICAgICAgIHN5bWJvbCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuICAqLwotICAgICAgKnN5bV9oYXNoID0gaDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBuZXcgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYW4KLSAgICAgb2xkIHN5bWJvbCB0aGF0IGxvb2tzIGxpa2UgaXQgbWlnaHQgYmUgYSBjb21tb24gc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYSBzaGFyZWQgb2JqZWN0LiAgTm90ZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBjYXNlIGluCi0gICAgIHdoaWNoIGEgbmV3IGNvbW1vbiBzeW1ib2wgc2hvdWxkIHNpbXBseSBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbgotICAgICBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0gIGlmICghIG5ld2R5bgotICAgICAgJiYgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiBvbGRkeW5jb21tb24pCi0gICAgewotICAgICAgLyogSXQgd291bGQgYmUgYmVzdCBpZiB3ZSBjb3VsZCBzZXQgdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gYQotCSBjb21tb24gc3ltYm9sLCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSBmb3IgdGhlIHNlY3Rpb24KLQkgb3IgdGhlIGFsaWdubWVudC4gICovCi0gICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBvbGRiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLAotCSAgICAgIGgtPnNpemUsIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBzeW0tPnN0X3NpemUpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmVkdW1lZCBjb21tb24gc3ltYm9sIGluIHRoZSBkeW5hbWljIG9iamVjdCBpcwotICAgICAgICAgbGFyZ2VyLCBwcmV0ZW5kIHRoYXQgdGhlIG5ldyBzeW1ib2wgaGFzIGl0cyBzaXplLiAgKi8KLQotICAgICAgaWYgKGgtPnNpemUgPiAqcHZhbHVlKQotCSpwdmFsdWUgPSBoLT5zaXplOwotCi0gICAgICAvKiBGSVhNRTogV2Ugbm8gbG9uZ2VyIGtub3cgdGhlIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGUgc3ltYm9sCi0JIGluIHRoZSBkeW5hbWljIG9iamVjdCwgc28gd2UganVzdCB3aW5kIHVwIHVzaW5nIHRoZSBvbmUgZnJvbQotCSB0aGUgcmVndWxhciBvYmplY3QuICAqLwotCi0gICAgICBvbGRkZWYgPSBmYWxzZTsKLSAgICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLSAgICAgICp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgd2VhayBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QKLSAgICAgZm9sbG93ZWQgYnkgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdC4gIEluIHRoaXMKLSAgICAgY2FzZSwgd2UgcHJlZmVyIHRoZSBkZWZpbml0aW9uIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgaWYgKG9sZGRlZgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiBuZXdkeW4KLSAgICAgICYmIGJpbmQgIT0gU1RCX1dFQUspCi0gICAgewotICAgICAgLyogVG8gbWFrZSB0aGlzIHdvcmsgd2UgaGF2ZSB0byBmcm9iIHRoZSBmbGFncyBzbyB0aGF0IHRoZSByZXN0Ci0gICAgICAgICBvZiB0aGUgY29kZSBkb2VzIG5vdCB0aGluayB3ZSBhcmUgdXNpbmcgdGhlIHJlZ3VsYXIKLSAgICAgICAgIGRlZmluaXRpb24uICAqLwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0KLSAgICAgIC8qIElmIEggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdGlvbiwgd2Ugd2FudCB0aGUgY2FsbGVyIHRvCi0gICAgICAgICB1c2UgSCByYXRoZXIgdGhhbiB0aGUgaW5kaXJlY3Qgc3ltYm9sLiAgT3RoZXJ3aXNlIGlmIHdlIGFyZQotICAgICAgICAgZGVmaW5pbmcgYSBuZXcgaW5kaXJlY3Qgc3ltYm9sIHdlIHdpbGwgd2luZCB1cCBhdHRhY2hpbmcgaXQKLSAgICAgICAgIHRvIHRoZSBlbnRyeSB3ZSBhcmUgb3ZlcnJpZGluZy4gICovCi0gICAgICAqc3ltX2hhc2ggPSBoOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIG5vbi13ZWFrIGRlZmluaXRpb24gaW4gYSBzaGFyZWQKLSAgICAgb2JqZWN0IGZvbGxvd2VkIGJ5IGEgd2VhayBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QuICBJbgotICAgICB0aGlzIGNhc2Ugd2UgcHJlZmVyIHRvIGRlZmluaXRpb24gaW4gdGhlIHNoYXJlZCBvYmplY3QuICBUbyBtYWtlCi0gICAgIHRoaXMgd29yayB3ZSBoYXZlIHRvIHRlbGwgdGhlIGNhbGxlciB0byBub3QgdHJlYXQgdGhlIG5ldyBzeW1ib2wKLSAgICAgYXMgYSBkZWZpbml0aW9uLiAgKi8KLSAgaWYgKG9sZGRlZgotICAgICAgJiYgb2xkZHluCi0gICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICAmJiBuZXdkZWYKLSAgICAgICYmICEgbmV3ZHluCi0gICAgICAmJiBiaW5kID09IFNUQl9XRUFLKQotICAgICpvdmVycmlkZSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gRUxGIG9iamVjdCBmaWxlIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gKCphZGRfc3ltYm9sX2hvb2spIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkJCQkgICAgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLAotCQkJCSAgICAgIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLSAgYm9vbGVhbiAoKmNoZWNrX3JlbG9jcykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgYXNlY3Rpb24gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotICBib29sZWFuIGNvbGxlY3Q7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIHNpemVfdCBzeW1jb3VudDsKLSAgc2l6ZV90IGV4dHN5bWNvdW50OwotICBzaXplX3QgZXh0c3ltb2ZmOwotICBFbGZfRXh0ZXJuYWxfU3ltICpidWYgPSBOVUxMOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBib29sZWFuIGR5bmFtaWM7Ci0gIGJmZF9ieXRlICpkeW52ZXIgPSBOVUxMOwotICBFbGZfRXh0ZXJuYWxfVmVyc3ltICpleHR2ZXJzeW0gPSBOVUxMOwotICBFbGZfRXh0ZXJuYWxfVmVyc3ltICpldmVyOwotICBFbGZfRXh0ZXJuYWxfRHluICpkeW5idWYgPSBOVUxMOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqd2Vha3M7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW07Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW1lbmQ7Ci0KLSAgYWRkX3N5bWJvbF9ob29rID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYWRkX3N5bWJvbF9ob29rOwotICBjb2xsZWN0ID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0OwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIGR5bmFtaWMgPSBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGR5bmFtaWMgPSB0cnVlOwotCi0gICAgICAvKiBZb3UgY2FuJ3QgdXNlIC1yIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gIEFsc28sIHRoZXJlJ3Mgbm8KLQkgaG9wZSBvZiB1c2luZyBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoIGRvZXMgbm90IGV4YWN0bHkgbWF0Y2gKLQkgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSB8fCBpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBhbnkgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIG5hbWVkCi0gICAgIC5nbnUud2FybmluZy5TWU1CT0wgYXJlIHRyZWF0ZWQgYXMgd2FybmluZyBzeW1ib2xzIGZvciB0aGUgZ2l2ZW4KLSAgICAgc3ltYm9sLiAgVGhpcyBkaWZmZXJzIGZyb20gLmdudS53YXJuaW5nIHNlY3Rpb25zLCB3aGljaCBnZW5lcmF0ZQotICAgICB3YXJuaW5ncyB3aGVuIHRoZXkgYXJlIGluY2x1ZGVkIGluIGFuIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpOwotCSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDApCi0JICAgIHsKLQkgICAgICBjaGFyICptc2c7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzejsKLQotCSAgICAgIG5hbWUgKz0gc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDE7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2hhcmVkIG9iamVjdCwgdGhlbiBsb29rIHVwIHRoZSBzeW1ib2wKLQkJIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgaXQgaXMgdGhlcmUsIGFuZCBpdCBpcyBhbHJlYWR5Ci0JCSBiZWVuIGRlZmluZWQsIHRoZW4gd2Ugd2lsbCBub3QgYmUgdXNpbmcgdGhlIGVudHJ5Ci0JCSBmcm9tIHRoaXMgc2hhcmVkIG9iamVjdCwgc28gd2UgZG9uJ3QgbmVlZCB0byB3YXJuLgotCQkgRklYTUU6IElmIHdlIHNlZSB0aGUgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0Ci0JCSBsYXRlciBvbiwgd2Ugd2lsbCB3YXJuLCBidXQgd2Ugc2hvdWxkbid0LiAgVGhlIG9ubHkKLQkJIGZpeCBpcyB0byBrZWVwIHRyYWNrIG9mIHdoYXQgd2FybmluZ3Mgd2UgYXJlIHN1cHBvc2VkCi0JCSB0byBlbWl0LCBhbmQgdGhlbiBoYW5kbGUgdGhlbSBhbGwgYXQgdGhlIGVuZCBvZiB0aGUKLQkJIGxpbmsuICAqLwotCSAgICAgIGlmIChkeW5hbWljICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLQkJewotCQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JCSAgLyogRklYTUU6IFdoYXQgYWJvdXQgYmZkX2xpbmtfaGFzaF9jb21tb24/ICAqLwotCQkgIGlmIChoICE9IE5VTEwKLQkJICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaXNzdWUgdGhpcyB3YXJuaW5nLiAgQ2xvYmJlcgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZWN0aW9uIHNpemUgc28gdGhhdCB0aGUgd2FybmluZyBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCQkgICAgICBzLT5fcmF3X3NpemUgPSAwOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3ogPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzKTsKLQkgICAgICBtc2cgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN6ICsgMSk7Ci0JICAgICAgaWYgKG1zZyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgbXNnLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBtc2dbc3pdID0gJ1wwJzsKLQotCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBCU0ZfV0FSTklORywgcywgKGJmZF92bWEpIDAsIG1zZywKLQkJICAgICAgZmFsc2UsIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJewotCQkgIC8qIENsb2JiZXIgdGhlIHNlY3Rpb24gc2l6ZSBzbyB0aGF0IHRoZSB3YXJuaW5nIGRvZXMKLSAgICAgICAgICAgICAgICAgICAgIG5vdCBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJICBzLT5fcmF3X3NpemUgPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIG9iamVjdCwgd2UgYWx3YXlzIGxpbmsgYWdhaW5zdCB0aGUgLmR5bnN5bQotICAgICBzeW1ib2wgdGFibGUsIG5vdCB0aGUgLnN5bXRhYiBzeW1ib2wgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIKLSAgICAgd2lsbCBvbmx5IHNlZSB0aGUgLmR5bnN5bSBzeW1ib2wgdGFibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwotICAgICBsb29rIGF0IC5zeW10YWIgZm9yIGEgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIGlmICghIGR5bmFtaWMgfHwgZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZWxzZQotICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIC8qIFJlYWQgaW4gYW55IHZlcnNpb24gZGVmaW5pdGlvbnMuICAqLwotCi0gICAgICBpZiAoISBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFJlYWQgaW4gdGhlIHN5bWJvbCB2ZXJzaW9ucywgYnV0IGRvbid0IGJvdGhlciB0byBjb252ZXJ0IHRoZW0KLSAgICAgICAgIHRvIGludGVybmFsIGZvcm1hdC4gICovCi0gICAgICBpZiAoZWxmX2R5bnZlcnN5bSAoYWJmZCkgIT0gMCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqdmVyc3ltaGRyOwotCi0JICB2ZXJzeW1oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX2hkcjsKLQkgIGV4dHZlcnN5bSA9IChFbGZfRXh0ZXJuYWxfVmVyc3ltICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0JICBpZiAoZXh0dmVyc3ltID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCB2ZXJzeW1oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKChQVFIpIGV4dHZlcnN5bSwgMSwgdmVyc3ltaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICE9IHZlcnN5bWhkci0+c2hfc2l6ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW10YWIgaGVhZGVyIHRlbGxzIHVzIHdoZXJlIHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzIHN0YXJ0LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbG9jYWwgc3ltYm9scyBhdAotICAgICB0aGlzIHBvaW50LiAgKi8KLSAgaWYgKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHRzeW1jb3VudCA9IHN5bWNvdW50OwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRzeW1jb3VudCA9IHN5bWNvdW50IC0gaGRyLT5zaF9pbmZvOwotICAgICAgZXh0c3ltb2ZmID0gaGRyLT5zaF9pbmZvOwotICAgIH0KLQotICBidWYgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkgYmZkX21hbGxvYyAoZXh0c3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGlmIChidWYgPT0gTlVMTCAmJiBleHRzeW1jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeSBmb3IgZWFjaCBleHRlcm5hbAotICAgICBzeW1ib2wuICAqLwotICBzeW1faGFzaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIGV4dHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotICBpZiAoc3ltX2hhc2ggPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgZWxmX3N5bV9oYXNoZXMgKGFiZmQpID0gc3ltX2hhc2g7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgY3JlYXRlIGFsbCB0aGUgZHluYW1pYwotICAgICAgICAgc2VjdGlvbnMgaW1tZWRpYXRlbHkuICBXZSBuZWVkIHRvIGF0dGFjaCB0aGVtIHRvIHNvbWV0aGluZywKLSAgICAgICAgIHNvIHdlIGF0dGFjaCB0aGVtIHRvIHRoaXMgQkZELCBwcm92aWRlZCBpdCBpcyB0aGUgcmlnaHQKLSAgICAgICAgIGZvcm1hdC4gIEZJWE1FOiBJZiB0aGVyZSBhcmUgbm8gaW5wdXQgQkZEJ3Mgb2YgdGhlIHNhbWUKLSAgICAgICAgIGZvcm1hdCBhcyB0aGUgb3V0cHV0LCB3ZSBjYW4ndCBtYWtlIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotCXsKLQkgIGlmICghIGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgYm9vbGVhbiBhZGRfbmVlZGVkOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZF9zaXplX3R5cGUgb2xkc2l6ZTsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3RyaW5kZXg7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIG5hbWUgdG8gdXNlIGluIGEgRFRfTkVFREVEIGVudHJ5IHRoYXQgcmVmZXJzIHRvIHRoaXMKLQkgb2JqZWN0LiAgSWYgdGhlIG9iamVjdCBoYXMgYSBEVF9TT05BTUUgZW50cnksIHdlIHVzZSBpdC4KLQkgT3RoZXJ3aXNlLCBpZiB0aGUgZ2VuZXJpYyBsaW5rZXIgc3R1Y2sgc29tZXRoaW5nIGluCi0JIGVsZl9kdF9uYW1lLCB3ZSB1c2UgdGhhdC4gIE90aGVyd2lzZSwgd2UganVzdCB1c2UgdGhlIGZpbGUKLQkgbmFtZS4gIElmIHRoZSBnZW5lcmljIGxpbmtlciBwdXQgYSBudWxsIHN0cmluZyBpbnRvCi0JIGVsZl9kdF9uYW1lLCB3ZSBkb24ndCBtYWtlIGEgRFRfTkVFREVEIGVudHJ5IGF0IGFsbCwgZXZlbiBpZgotCSB0aGVyZSBpcyBhIERUX1NPTkFNRSBlbnRyeS4gICovCi0gICAgICBhZGRfbmVlZGVkID0gdHJ1ZTsKLSAgICAgIG5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICAgIGlmIChlbGZfZHRfbmFtZSAoYWJmZCkgIT0gTlVMTCkKLQl7Ci0JICBuYW1lID0gZWxmX2R0X25hbWUgKGFiZmQpOwotCSAgaWYgKCpuYW1lID09ICdcMCcpCi0JICAgIGFkZF9uZWVkZWQgPSBmYWxzZTsKLQl9Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfRHluICpleHRkeW47Ci0JICBFbGZfRXh0ZXJuYWxfRHluICpleHRkeW5lbmQ7Ci0JICBpbnQgZWxmc2VjOwotCSAgdW5zaWduZWQgbG9uZyBsaW5rOwotCi0JICBkeW5idWYgPSAoRWxmX0V4dGVybmFsX0R5biAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotCSAgaWYgKGR5bmJ1ZiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCAoUFRSKSBkeW5idWYsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBzLT5fcmF3X3NpemUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLQkgIGlmIChlbGZzZWMgPT0gLTEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbGluayA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbZWxmc2VjXS0+c2hfbGluazsKLQotCSAgZXh0ZHluID0gZHluYnVmOwotCSAgZXh0ZHluZW5kID0gZXh0ZHluICsgcy0+X3Jhd19zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKTsKLQkgIGZvciAoOyBleHRkeW4gPCBleHRkeW5lbmQ7IGV4dGR5bisrKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0KLQkgICAgICBlbGZfc3dhcF9keW5faW4gKGFiZmQsIGV4dGR5biwgJmR5bik7Ci0JICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9TT05BTUUpCi0JCXsKLQkJICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQkgIGR5bi5kX3VuLmRfdmFsKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX05FRURFRCkKLQkJewotCQkgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbiwgKipwbjsKLQkJICBjaGFyICpmbm0sICphbm07Ci0KLQkJICBuID0gKChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QpKSk7Ci0JCSAgZm5tID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQkgZHluLmRfdW4uZF92YWwpOwotCQkgIGlmIChuID09IE5VTEwgfHwgZm5tID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBhbm0gPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoZm5tKSArIDEpOwotCQkgIGlmIChhbm0gPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cmNweSAoYW5tLCBmbm0pOwotCQkgIG4tPm5hbWUgPSBhbm07Ci0JCSAgbi0+YnkgPSBhYmZkOwotCQkgIG4tPm5leHQgPSBOVUxMOwotCQkgIGZvciAocG4gPSAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci0JCSAgICAgICAqcG4gIT0gTlVMTDsKLQkJICAgICAgIHBuID0gJigqcG4pLT5uZXh0KQotCQkgICAgOwotCQkgICpwbiA9IG47Ci0JCX0KLQkgICAgfQotCi0JICBmcmVlIChkeW5idWYpOwotCSAgZHluYnVmID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgYW55IG9mIHRoZSBzZWN0aW9ucyBpbiBhIGR5bmFtaWMKLQkgb2JqZWN0IGluIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGhhY2sgYnkgc2ltcGx5IGNsb2JiZXJpbmcgdGhlCi0JIGxpc3Qgb2Ygc2VjdGlvbnMgaW4gdGhlIEJGRC4gIFRoaXMgY291bGQgYmUgaGFuZGxlZCBtb3JlCi0JIGNsZWFubHkgYnksIHNheSwgYSBuZXcgc2VjdGlvbiBmbGFnOyB0aGUgZXhpc3RpbmcKLQkgU0VDX05FVkVSX0xPQUQgZmxhZyBpcyBub3QgdGhlIG9uZSB3ZSB3YW50LCBiZWNhdXNlIHRoYXQgb25lCi0JIHN0aWxsIGltcGxpZXMgdGhhdCB0aGUgc2VjdGlvbiB0YWtlcyB1cCBzcGFjZSBpbiB0aGUgb3V0cHV0Ci0JIGZpbGUuICAqLwotICAgICAgYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotICAgICAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDA7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIHRoZSBsaW5rLCBjcmVhdGUKLQkgdGhlIHNwZWNpYWwgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgbGlua2luZy4gICovCi0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQl7Ci0JICBpZiAoISBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGFkZF9uZWVkZWQpCi0JewotCSAgLyogQWRkIGEgRFRfTkVFREVEIGVudHJ5IGZvciB0aGlzIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQkgIG9sZHNpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0JICBzdHJpbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsIG5hbWUsCi0JCQkJCSB0cnVlLCBmYWxzZSk7Ci0JICBpZiAoc3RyaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG9sZHNpemUgPT0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNkeW47Ci0JICAgICAgRWxmX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0JICAgICAgLyogVGhlIGhhc2ggdGFibGUgc2l6ZSBkaWQgbm90IGNoYW5nZSwgd2hpY2ggbWVhbnMgdGhhdAotCQkgdGhlIGR5bmFtaWMgb2JqZWN0IG5hbWUgd2FzIGFscmVhZHkgZW50ZXJlZC4gIElmIHdlCi0JCSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgdGhpcyBkeW5hbWljIG9iamVjdCBpbiB0aGUKLQkJIGxpbmssIGp1c3QgaWdub3JlIGl0LiAgVGhlcmUgaXMgbm8gcmVhc29uIHRvIGluY2x1ZGUKLQkJIGEgcGFydGljdWxhciBkeW5hbWljIG9iamVjdCBtb3JlIHRoYW4gb25jZS4gICovCi0JICAgICAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICAgICAgIi5keW5hbWljIik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLQotCSAgICAgIGR5bmNvbiA9IChFbGZfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotCSAgICAgIGR5bmNvbmVuZCA9IChFbGZfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArCi0JCQkJCQlzZHluLT5fcmF3X3NpemUpOwotCSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0KLQkJICBlbGZfc3dhcF9keW5faW4gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCBkeW5jb24sCi0JCQkJICAgJmR5bik7Ci0JCSAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQKLQkJICAgICAgJiYgZHluLmRfdW4uZF92YWwgPT0gc3RyaW5kZXgpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChidWYgIT0gTlVMTCkKLQkJCWZyZWUgKGJ1Zik7Ci0JCSAgICAgIGlmIChleHR2ZXJzeW0gIT0gTlVMTCkKLQkJCWZyZWUgKGV4dHZlcnN5bSk7Ci0JCSAgICAgIHJldHVybiB0cnVlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ORUVERUQsIHN0cmluZGV4KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBTYXZlIHRoZSBTT05BTUUsIGlmIHRoZXJlIGlzIG9uZSwgYmVjYXVzZSBzb21ldGltZXMgdGhlCi0gICAgICAgICBsaW5rZXIgZW11bGF0aW9uIGNvZGUgd2lsbCBuZWVkIHRvIGtub3cgaXQuICAqLwotICAgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgZWxmX2R0X25hbWUgKGFiZmQpID0gbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQloZHItPnNoX29mZnNldCArIGV4dHN5bW9mZiAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKChQVFIpIGJ1Ziwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgZXh0c3ltY291bnQsIGFiZmQpCi0JICAhPSBleHRzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdlYWtzID0gTlVMTDsKLQotICBldmVyID0gZXh0dmVyc3ltICE9IE5VTEwgPyBleHR2ZXJzeW0gKyBleHRzeW1vZmYgOiBOVUxMOwotICBlc3ltZW5kID0gYnVmICsgZXh0c3ltY291bnQ7Ci0gIGZvciAoZXN5bSA9IGJ1ZjsKLSAgICAgICBlc3ltIDwgZXN5bWVuZDsKLSAgICAgICBlc3ltKyssIHN5bV9oYXNoKyssIGV2ZXIgPSAoZXZlciAhPSBOVUxMID8gZXZlciArIDEgOiBOVUxMKSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBiaW5kOwotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgICAgIGJvb2xlYW4gc2l6ZV9jaGFuZ2Vfb2ssIHR5cGVfY2hhbmdlX29rOwotICAgICAgYm9vbGVhbiBuZXdfd2Vha2RlZjsKLSAgICAgIHVuc2lnbmVkIGludCBvbGRfYWxpZ25tZW50OwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZzeW0pOwotCi0gICAgICBmbGFncyA9IEJTRl9OT19GTEFHUzsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICB2YWx1ZSA9IHN5bS5zdF92YWx1ZTsKLSAgICAgICpzeW1faGFzaCA9IE5VTEw7Ci0KLSAgICAgIGJpbmQgPSBFTEZfU1RfQklORCAoc3ltLnN0X2luZm8pOwotICAgICAgaWYgKGJpbmQgPT0gU1RCX0xPQ0FMKQotCXsKLQkgIC8qIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUsIHNpbmNlIEVMRiByZXF1aXJlcyB0aGF0IGFsbAotCSAgICAgZ2xvYmFsIHN5bWJvbHMgZm9sbG93IGFsbCBsb2NhbCBzeW1ib2xzLCBhbmQgdGhhdCBzaF9pbmZvCi0JICAgICBwb2ludCB0byB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gIFVuZm9ydHVuYXRlYWx5LCBJcml4IDUKLQkgICAgIHNjcmV3cyB0aGlzIHVwLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGJpbmQgPT0gU1RCX0dMT0JBTCkKLQl7Ci0JICBpZiAoc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRgotCSAgICAgICYmIHN5bS5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKQotCSAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBlbHNlCi0JICAgIGZsYWdzID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChiaW5kID09IFNUQl9XRUFLKQotCWZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBlbHNlCi0JewotCSAgLyogTGVhdmUgaXQgdXAgdG8gdGhlIHByb2Nlc3NvciBiYWNrZW5kLiAgKi8KLQl9Ci0KLSAgICAgIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChzeW0uc3Rfc2huZHggPiAwICYmIHN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JewotCSAgc2VjID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLnN0X3NobmR4KTsKLQkgIGlmIChzZWMgPT0gTlVMTCkKLQkgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgIT0gMCkKLQkgICAgdmFsdWUgLT0gc2VjLT52bWE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0Jc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCXsKLQkgIHNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAvKiBXaGF0IEVMRiBjYWxscyB0aGUgc2l6ZSB3ZSBjYWxsIHRoZSB2YWx1ZS4gIFdoYXQgRUxGCi0JICAgICBjYWxscyB0aGUgdmFsdWUgd2UgY2FsbCB0aGUgYWxpZ25tZW50LiAgKi8KLQkgIHZhbHVlID0gc3ltLnN0X3NpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExlYXZlIGl0IHVwIHRvIHRoZSBwcm9jZXNzb3IgYmFja2VuZC4gICovCi0JfQotCi0gICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLCBzeW0uc3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYWRkX3N5bWJvbF9ob29rKQotCXsKLQkgIGlmICghICgqYWRkX3N5bWJvbF9ob29rKSAoYWJmZCwgaW5mbywgJnN5bSwgJm5hbWUsICZmbGFncywgJnNlYywKLQkJCQkgICAgJnZhbHVlKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFRoZSBob29rIGZ1bmN0aW9uIHNldHMgdGhlIG5hbWUgdG8gTlVMTCBpZiB0aGlzIHN5bWJvbAotCSAgICAgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHNvbWUgcmVhc29uLiAgKi8KLQkgIGlmIChuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogU2FuaXR5IGNoZWNrIHRoYXQgYWxsIHBvc3NpYmlsaXRpZXMgd2VyZSBoYW5kbGVkLiAgKi8KLSAgICAgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQlkZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgICAgIHNpemVfY2hhbmdlX29rID0gZmFsc2U7Ci0gICAgICB0eXBlX2NoYW5nZV9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+dHlwZV9jaGFuZ2Vfb2s7Ci0gICAgICBvbGRfYWxpZ25tZW50ID0gMDsKLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyOwotCSAgdW5zaWduZWQgaW50IHZlcm51bSA9IDA7Ci0JICBib29sZWFuIG92ZXJyaWRlOwotCi0JICBpZiAoZXZlciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4gKGFiZmQsIGV2ZXIsICZpdmVyKTsKLQkgICAgICB2ZXJudW0gPSBpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fVkVSU0lPTjsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBoaWRkZW4gc3ltYm9sLCBvciBpZiBpdCBpcyBub3QgdmVyc2lvbgotICAgICAgICAgICAgICAgICAxLCB3ZSBhcHBlbmQgdGhlIHZlcnNpb24gbmFtZSB0byB0aGUgc3ltYm9sIG5hbWUuCi0gICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHdlIGRvIG5vdCBtb2RpZnkgYSBub24taGlkZGVuIGFic29sdXRlCi0gICAgICAgICAgICAgICAgIHN5bWJvbCwgYmVjYXVzZSBpdCBtaWdodCBiZSB0aGUgdmVyc2lvbiBzeW1ib2wKLSAgICAgICAgICAgICAgICAgaXRzZWxmLiAgRklYTUU6IFdoYXQgaWYgaXQgaXNuJ3Q/ICAqLwotCSAgICAgIGlmICgoaXZlci52c192ZXJzICYgVkVSU1lNX0hJRERFTikgIT0gMAotCQkgIHx8ICh2ZXJudW0gPiAxICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKSkKLQkJewotCQkgIGNvbnN0IGNoYXIgKnZlcnN0cjsKLQkJICBpbnQgbmFtZWxlbiwgbmV3bGVuOwotCQkgIGNoYXIgKm5ld25hbWUsICpwOwotCi0JCSAgaWYgKHN5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYpCi0JCSAgICB7Ci0JCSAgICAgIGlmICh2ZXJudW0gPiBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyLnNoX2luZm8pCi0JCQl7Ci0JCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAgIChfKCIlczogJXM6IGludmFsaWQgdmVyc2lvbiAldSAobWF4ICVkKSIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgdmVybnVtLAotCQkJICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyLnNoX2luZm8pOwotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHZlcm51bSA+IDEpCi0JCQl2ZXJzdHIgPQotCQkJICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWZbdmVybnVtIC0gMV0udmRfbm9kZW5hbWU7Ci0JCSAgICAgIGVsc2UKLQkJCXZlcnN0ciA9ICIiOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgY2Fubm90IHNpbXBseSB0ZXN0IGZvciB0aGUgbnVtYmVyIG9mCi0JCQkgZW50cmllcyBpbiB0aGUgVkVSTkVFRCBzZWN0aW9uIHNpbmNlIHRoZQotCQkJIG51bWJlcnMgZm9yIHRoZSBuZWVkZWQgdmVyc2lvbnMgZG8gbm90IHN0YXJ0Ci0JCQkgYXQgMC4gICovCi0JCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotCi0JCSAgICAgIHZlcnN0ciA9IE5VTEw7Ci0JCSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsKLQkJCSAgIHQgIT0gTlVMTDsKLQkJCSAgIHQgPSB0LT52bl9uZXh0cmVmKQotCQkJewotCQkJICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQkJICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChhLT52bmFfb3RoZXIgPT0gdmVybnVtKQotCQkJCXsKLQkJCQkgIHZlcnN0ciA9IGEtPnZuYV9ub2RlbmFtZTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgIGlmIChhICE9IE5VTEwpCi0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGlmICh2ZXJzdHIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiAlczogaW52YWxpZCBuZWVkZWQgdmVyc2lvbiAlZCIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgdmVybnVtKTsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQkgICAgfQotCi0JCSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0JCSAgbmV3bGVuID0gbmFtZWxlbiArIHN0cmxlbiAodmVyc3RyKSArIDI7Ci0JCSAgaWYgKChpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fSElEREVOKSA9PSAwKQotCQkgICAgKytuZXdsZW47Ci0KLQkJICBuZXduYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBuZXdsZW4pOwotCQkgIGlmIChuZXduYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCQkgIHAgPSBuZXduYW1lICsgbmFtZWxlbjsKLQkJICAqcCsrID0gRUxGX1ZFUl9DSFI7Ci0JCSAgaWYgKChpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fSElEREVOKSA9PSAwKQotCQkgICAgKnArKyA9IEVMRl9WRVJfQ0hSOwotCQkgIHN0cmNweSAocCwgdmVyc3RyKTsKLQotCQkgIG5hbWUgPSBuZXduYW1lOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgbmFtZSwgJnN5bSwgJnNlYywgJnZhbHVlLAotCQkJCSAgc3ltX2hhc2gsICZvdmVycmlkZSwgJnR5cGVfY2hhbmdlX29rLAotCQkJCSAgJnNpemVfY2hhbmdlX29rKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvdmVycmlkZSkKLQkgICAgZGVmaW5pdGlvbiA9IGZhbHNlOwotCi0JICBoID0gKnN5bV9oYXNoOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLQkgIC8qIFJlbWVtYmVyIHRoZSBvbGQgYWxpZ25tZW50IGlmIHRoaXMgaXMgYSBjb21tb24gc3ltYm9sLCBzbwotICAgICAgICAgICAgIHRoYXQgd2UgZG9uJ3QgcmVkdWNlIHRoZSBhbGlnbm1lbnQgbGF0ZXIgb24uICBXZSBjYW4ndAotICAgICAgICAgICAgIGNoZWNrIGxhdGVyLCBiZWNhdXNlIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gICAgICAgICAgICAgd2lsbCBzZXQgYSBkZWZhdWx0IGZvciB0aGUgYWxpZ25tZW50IHdoaWNoIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICBvdmVycmlkZS4gICovCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICBvbGRfYWxpZ25tZW50ID0gaC0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmICE9IE5VTEwKLQkgICAgICAmJiAhIG92ZXJyaWRlCi0JICAgICAgJiYgdmVybnVtID4gMQotCSAgICAgICYmIGRlZmluaXRpb24pCi0JICAgIGgtPnZlcmluZm8udmVyZGVmID0gJmVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZlt2ZXJudW0gLSAxXTsKLQl9Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWMsIHZhbHVlLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCSAgICAgIGZhbHNlLCBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGggPSAqc3ltX2hhc2g7Ci0gICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotICAgICAgKnN5bV9oYXNoID0gaDsKLQotICAgICAgbmV3X3dlYWtkZWYgPSBmYWxzZTsKLSAgICAgIGlmIChkeW5hbWljCi0JICAmJiBkZWZpbml0aW9uCi0JICAmJiAoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgJiYgRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSAhPSBTVFRfRlVOQwotCSAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JICAmJiBoLT53ZWFrZGVmID09IE5VTEwpCi0JewotCSAgLyogS2VlcCBhIGxpc3Qgb2YgYWxsIHdlYWsgZGVmaW5lZCBub24gZnVuY3Rpb24gc3ltYm9scyBmcm9tCi0JICAgICBhIGR5bmFtaWMgb2JqZWN0LCB1c2luZyB0aGUgd2Vha2RlZiBmaWVsZC4gIExhdGVyIGluIHRoaXMKLQkgICAgIGZ1bmN0aW9uIHdlIHdpbGwgc2V0IHRoZSB3ZWFrZGVmIGZpZWxkIHRvIHRoZSBjb3JyZWN0Ci0JICAgICB2YWx1ZS4gIFdlIG9ubHkgcHV0IG5vbi1mdW5jdGlvbiBzeW1ib2xzIGZyb20gZHluYW1pYwotCSAgICAgb2JqZWN0cyBvbiB0aGlzIGxpc3QsIGJlY2F1c2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRoZSBvbmx5Ci0JICAgICB0aW1lIHdlIG5lZWQgdG8ga25vdyB0aGUgbm9ybWFsIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIGEKLQkgICAgIHdlYWsgc3ltYm9sLCBhbmQgdGhlIGluZm9ybWF0aW9uIGlzIHRpbWUgY29uc3VtaW5nIHRvCi0JICAgICBmaWd1cmUgb3V0LiAgSWYgdGhlIHdlYWtkZWYgZmllbGQgaXMgbm90IGFscmVhZHkgTlVMTCwKLQkgICAgIHRoZW4gdGhpcyBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZCBieSBzb21lIHByZXZpb3VzCi0JICAgICBkeW5hbWljIG9iamVjdCwgYW5kIHdlIHdpbGwgYmUgdXNpbmcgdGhhdCBwcmV2aW91cwotCSAgICAgZGVmaW5pdGlvbiBhbnlob3cuICAqLwotCi0JICBoLT53ZWFrZGVmID0gd2Vha3M7Ci0JICB3ZWFrcyA9IGg7Ci0JICBuZXdfd2Vha2RlZiA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCi0JICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgdW5zaWduZWQgaW50IGFsaWduOwotCi0JICBhbGlnbiA9IGJmZF9sb2cyIChzeW0uc3RfdmFsdWUpOwotCSAgaWYgKGFsaWduID4gb2xkX2FsaWdubWVudCkKLQkgICAgaC0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ247Ci0JfQotCi0gICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGludCBvbGRfZmxhZ3M7Ci0JICBib29sZWFuIGR5bnN5bTsKLQkgIGludCBuZXdfZmxhZzsKLQotCSAgLyogUmVtZW1iZXIgdGhlIHN5bWJvbCBzaXplIGFuZCB0eXBlLiAgKi8KLQkgIGlmIChzeW0uc3Rfc2l6ZSAhPSAwCi0JICAgICAgJiYgKGRlZmluaXRpb24gfHwgaC0+c2l6ZSA9PSAwKSkKLQkgICAgewotCSAgICAgIGlmIChoLT5zaXplICE9IDAgJiYgaC0+c2l6ZSAhPSBzeW0uc3Rfc2l6ZSAmJiAhIHNpemVfY2hhbmdlX29rKQotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiV2FybmluZzogc2l6ZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWx1IHRvICVsdSBpbiAlcyIpLAotCQkgICBuYW1lLCAodW5zaWduZWQgbG9uZykgaC0+c2l6ZSwgKHVuc2lnbmVkIGxvbmcpIHN5bS5zdF9zaXplLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgICAgICBoLT5zaXplID0gc3ltLnN0X3NpemU7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4gd2UgYWx3YXlzIHdhbnQgSC0+U0laRQotICAgICAgICAgICAgIHRvIGJlIHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgVGhlIGNvZGUganVzdCBhYm92ZQotICAgICAgICAgICAgIHdvbid0IGZpeCB0aGUgc2l6ZSBpZiBhIGNvbW1vbiBzeW1ib2wgYmVjb21lcyBsYXJnZXIuICBXZQotICAgICAgICAgICAgIGRvbid0IHdhcm4gYWJvdXQgYSBzaXplIGNoYW5nZSBoZXJlLCBiZWNhdXNlIHRoYXQgaXMKLSAgICAgICAgICAgICBjb3ZlcmVkIGJ5IC0td2Fybi1jb21tb24uICAqLwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgaC0+c2l6ZSA9IGgtPnJvb3QudS5jLnNpemU7Ci0KLQkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pICE9IFNUVF9OT1RZUEUKLQkgICAgICAmJiAoZGVmaW5pdGlvbiB8fCBoLT50eXBlID09IFNUVF9OT1RZUEUpKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnR5cGUgIT0gU1RUX05PVFlQRQotCQkgICYmIGgtPnR5cGUgIT0gRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKQotCQkgICYmICEgdHlwZV9jaGFuZ2Vfb2spCi0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIpLAotCQkgICBuYW1lLCBoLT50eXBlLCBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgICAgICBoLT50eXBlID0gRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKTsKLQkgICAgfQotCi0JICBpZiAoc3ltLnN0X290aGVyICE9IDAKLQkgICAgICAmJiAoZGVmaW5pdGlvbiB8fCBoLT5vdGhlciA9PSAwKSkKLQkgICAgaC0+b3RoZXIgPSBzeW0uc3Rfb3RoZXI7Ci0KLQkgIC8qIFNldCBhIGZsYWcgaW4gdGhlIGhhc2ggdGFibGUgZW50cnkgaW5kaWNhdGluZyB0aGUgdHlwZSBvZgotCSAgICAgcmVmZXJlbmNlIG9yIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4gIEtlZXAgYSBjb3VudCBvZgotCSAgICAgdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgd2UgZmluZC4gIEEgZHluYW1pYyBzeW1ib2wKLQkgICAgIGlzIG9uZSB3aGljaCBpcyByZWZlcmVuY2VkIG9yIGRlZmluZWQgYnkgYm90aCBhIHJlZ3VsYXIKLQkgICAgIG9iamVjdCBhbmQgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLQkgIG9sZF9mbGFncyA9IGgtPmVsZl9saW5rX2hhc2hfZmxhZ3M7Ci0JICBkeW5zeW0gPSBmYWxzZTsKLQkgIGlmICghIGR5bmFtaWMpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWZpbml0aW9uKQotCQl7Ci0JCSAgbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOwotCQkgIGlmIChiaW5kICE9IFNUQl9XRUFLKQotCQkgICAgbmV3X2ZsYWcgfD0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLOwotCQl9Ci0JICAgICAgZWxzZQotCQluZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICAgICAgaWYgKGluZm8tPnNoYXJlZAotCQkgIHx8IChvbGRfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQwotCQkJCSAgIHwgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykpICE9IDApCi0JCWR5bnN5bSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGRlZmluaXRpb24pCi0JCW5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLQkgICAgICBlbHNlCi0JCW5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQzsKLQkgICAgICBpZiAoKG9sZF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0JCQkJfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkgIT0gMAotCQkgIHx8IChoLT53ZWFrZGVmICE9IE5VTEwKLQkJICAgICAgJiYgISBuZXdfd2Vha2RlZgotCQkgICAgICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ICE9IC0xKSkKLQkJZHluc3ltID0gdHJ1ZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IG5ld19mbGFnOwotCi0JICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYSB2ZXJzaW9uLCBhbmQgaXQgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICB2ZXJzaW9uLCB3ZSBjcmVhdGUgYW4gaW5kaXJlY3Qgc3ltYm9sIGZyb20gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICBuYW1lIHRvIHRoZSBmdWxseSBkZWNvcmF0ZWQgbmFtZS4gIFRoaXMgd2lsbCBjYXVzZQotICAgICAgICAgICAgIGV4dGVybmFsIHJlZmVyZW5jZXMgd2hpY2ggZG8gbm90IHNwZWNpZnkgYSB2ZXJzaW9uIHRvIGJlCi0gICAgICAgICAgICAgYm91bmQgdG8gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICAqLwotCSAgaWYgKGRlZmluaXRpb24pCi0JICAgIHsKLQkgICAgICBjaGFyICpwOwotCi0JICAgICAgcCA9IHN0cmNociAobmFtZSwgRUxGX1ZFUl9DSFIpOwotCSAgICAgIGlmIChwICE9IE5VTEwgJiYgcFsxXSA9PSBFTEZfVkVSX0NIUikKLQkJewotCQkgIGNoYXIgKnNob3J0bmFtZTsKLQkJICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGk7Ci0JCSAgYm9vbGVhbiBvdmVycmlkZTsKLQotCQkgIHNob3J0bmFtZSA9IGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCQkgcCAtIG5hbWUgKyAxKTsKLQkJICBpZiAoc2hvcnRuYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJuY3B5IChzaG9ydG5hbWUsIG5hbWUsIHAgLSBuYW1lKTsKLQkJICBzaG9ydG5hbWVbcCAtIG5hbWVdID0gJ1wwJzsKLQotCQkgIC8qIFdlIGFyZSBnb2luZyB0byBjcmVhdGUgYSBuZXcgc3ltYm9sLiAgTWVyZ2UgaXQKLSAgICAgICAgICAgICAgICAgICAgIHdpdGggYW55IGV4aXN0aW5nIHN5bWJvbCB3aXRoIHRoaXMgbmFtZS4gIEZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzIG9mIHRoZSBtZXJnZSwgYWN0IGFzIHRob3VnaCB3ZSB3ZXJlCi0gICAgICAgICAgICAgICAgICAgICBkZWZpbmluZyB0aGUgc3ltYm9sIHdlIGp1c3QgZGVmaW5lZCwgYWx0aG91Z2ggd2UKLSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IGdvaW5nIHRvIGRlZmluZSBhbiBpbmRpcmVjdCBzeW1ib2wuICAqLwotCQkgIHR5cGVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgc2l6ZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLQkJICBpZiAoISBlbGZfbWVyZ2Vfc3ltYm9sIChhYmZkLCBpbmZvLCBzaG9ydG5hbWUsICZzeW0sICZzZWMsCi0JCQkJCSAgJnZhbHVlLCAmaGksICZvdmVycmlkZSwKLQkJCQkJICAmdHlwZV9jaGFuZ2Vfb2ssICZzaXplX2NoYW5nZV9vaykpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIGlmICghIG92ZXJyaWRlKQotCQkgICAgewotCQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJCSAgICAgKGluZm8sIGFiZmQsIHNob3J0bmFtZSwgQlNGX0lORElSRUNULAotCQkJICAgICAgYmZkX2luZF9zZWN0aW9uX3B0ciwgKGJmZF92bWEpIDAsIG5hbWUsIGZhbHNlLAotCQkJICAgICAgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGkpKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogSW4gdGhpcyBjYXNlIHRoZSBzeW1ib2wgbmFtZWQgU0hPUlROQU1FIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGluZyB0aGUgaW5kaXJlY3Qgc3ltYm9sIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGQuICBXZSB3ZXJlIHBsYW5uaW5nIG9uIG1ha2luZyBTSE9SVE5BTUUgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdCBzeW1ib2wgcmVmZXJyaW5nIHRvIE5BTUUuICBTSE9SVE5BTUUKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgbmFtZSB3aXRob3V0IGEgdmVyc2lvbi4gIE5BTUUgaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgdmVyc2lvbmVkIG5hbWUsIGFuZCBpdCBpcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24uCi0KLQkJCSBPdmVycmlkaW5nIG1lYW5zIHRoYXQgd2UgYWxyZWFkeSBzYXcgYQotCQkJIGRlZmluaXRpb24gZm9yIHRoZSBzeW1ib2wgU0hPUlROQU1FIGluIGEKLQkJCSByZWd1bGFyIG9iamVjdCwgYW5kIGl0IGlzIG92ZXJyaWRpbmcgdGhlCi0JCQkgc3ltYm9sIGRlZmluZWQgaW4gdGhlIGR5bmFtaWMgb2JqZWN0LgotCi0JCQkgV2hlbiB0aGlzIGhhcHBlbnMsIHdlIGFjdHVhbGx5IHdhbnQgdG8gY2hhbmdlCi0JCQkgTkFNRSwgdGhlIHN5bWJvbCB3ZSBqdXN0IGFkZGVkLCB0byByZWZlciB0bwotCQkJIFNIT1JUTkFNRS4gIFRoaXMgd2lsbCBjYXVzZSByZWZlcmVuY2VzIHRvCi0JCQkgTkFNRSBpbiB0aGUgc2hhcmVkIG9iamVjdCB0byBiZWNvbWUKLQkJCSByZWZlcmVuY2VzIHRvIFNIT1JUTkFNRSBpbiB0aGUgcmVndWxhcgotCQkJIG9iamVjdC4gIFRoaXMgaXMgd2hhdCB3ZSBleHBlY3Qgd2hlbiB3ZQotCQkJIG92ZXJyaWRlIGEgZnVuY3Rpb24gaW4gYSBzaGFyZWQgb2JqZWN0OiB0aGF0Ci0JCQkgdGhlIHJlZmVyZW5jZXMgaW4gdGhlIHNoYXJlZCBvYmplY3Qgd2lsbCBiZQotCQkJIG1hcHBlZCB0byB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgcmVndWxhcgotCQkJIG9iamVjdC4gICovCi0KLQkJICAgICAgd2hpbGUgKGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkJICAgICB8fCBoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJCWhpID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGhpLT5yb290LnUuaS5saW5rOwotCi0JCSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q7Ci0JCSAgICAgIGgtPnJvb3QudS5pLmxpbmsgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaGk7Ci0JCSAgICAgIGlmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykKLQkJCXsKLQkJCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQzsKLQkJCSAgaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLQkJCSAgaWYgKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCQkgICAgewotCQkJICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sCi0JCQkJCQkJCQkgaGkpKQotCQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICAvKiBOb3cgc2V0IEhJIHRvIEgsIHNvIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBzZXQgdGhlIG90aGVyIGZpZWxkcyBjb3JyZWN0bHkuICAqLwotCQkgICAgICBoaSA9IGg7Ci0JCSAgICB9Ci0KLQkJICAvKiBJZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uIHNvbWV3aGVyZSwKLQkJICAgICB0aGVuIEhJIG1heSBub3QgcG9pbnQgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sLiAgV2UKLQkJICAgICB3aWxsIGhhdmUgcmVwb3J0ZWQgYW4gZXJyb3IgdG8gdGhlIHVzZXIgaW4gdGhhdAotCQkgICAgIGNhc2UuICAqLwotCi0JCSAgaWYgKGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmh0OwotCi0JCSAgICAgIC8qIElmIHRoZSBzeW1ib2wgYmVjYW1lIGluZGlyZWN0LCB0aGVuIHdlIGFzc3VtZQotCQkJIHRoYXQgd2UgaGF2ZSBub3Qgc2VlbiBhIGRlZmluaXRpb24gYmVmb3JlLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQwotCQkJCSAgICAgIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCQkJICA9PSAwKTsKLQotCQkgICAgICBodCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoaS0+cm9vdC51LmkubGluazsKLQotCQkgICAgICAvKiBDb3B5IGRvd24gYW55IHJlZmVyZW5jZXMgdGhhdCB3ZSBtYXkgaGF2ZQotCQkJIGFscmVhZHkgc2VlbiB0byB0aGUgc3ltYm9sIHdoaWNoIGp1c3QgYmVjYW1lCi0JCQkgaW5kaXJlY3QuICAqLwotCQkgICAgICBodC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PQotCQkJKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgJiAoRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQwotCQkJICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKSk7Ci0KLQkJICAgICAgLyogQ29weSBvdmVyIHRoZSBnbG9iYWwgYW5kIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlCi0JCQkgb2Zmc2V0IGVudHJpZXMuICBUaGVzZSBtYXkgaGF2ZSBiZWVuIGFscmVhZHkgc2V0Ci0JCQkgdXAgYnkgYSBjaGVja19yZWxvY3Mgcm91dGluZS4gICovCi0JCSAgICAgIGlmIChodC0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JCQl7Ci0JCQkgIGh0LT5nb3Qub2Zmc2V0ID0gaGktPmdvdC5vZmZzZXQ7Ci0JCQkgIGhpLT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJfQotCQkgICAgICBCRkRfQVNTRVJUIChoaS0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpOwotCi0JCSAgICAgIGlmIChodC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JCQl7Ci0JCQkgIGh0LT5wbHQub2Zmc2V0ID0gaGktPnBsdC5vZmZzZXQ7Ci0JCQkgIGhpLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJfQotCQkgICAgICBCRkRfQVNTRVJUIChoaS0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpOwotCi0JCSAgICAgIGlmIChodC0+ZHluaW5keCA9PSAtMSkKLQkJCXsKLQkJCSAgaHQtPmR5bmluZHggPSBoaS0+ZHluaW5keDsKLQkJCSAgaHQtPmR5bnN0cl9pbmRleCA9IGhpLT5keW5zdHJfaW5kZXg7Ci0JCQkgIGhpLT5keW5pbmR4ID0gLTE7Ci0JCQkgIGhpLT5keW5zdHJfaW5kZXggPSAwOwotCQkJfQotCQkgICAgICBCRkRfQVNTRVJUIChoaS0+ZHluaW5keCA9PSAtMSk7Ci0KLQkJICAgICAgLyogRklYTUU6IFRoZXJlIG1heSBiZSBvdGhlciBpbmZvcm1hdGlvbiB0byBjb3B5Ci0JCQkgb3ZlciBmb3IgcGFydGljdWxhciB0YXJnZXRzLiAgKi8KLQotCQkgICAgICAvKiBTZWUgaWYgdGhlIG5ldyBmbGFncyBsZWFkIHVzIHRvIHJlYWxpemUgdGhhdAotCQkJIHRoZSBzeW1ib2wgbXVzdCBiZSBkeW5hbWljLiAgKi8KLQkJICAgICAgaWYgKCEgZHluc3ltKQotCQkJewotCQkJICBpZiAoISBkeW5hbWljKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkJCQkgIHx8ICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAgICAgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKQotCQkJCSAgICAgICE9IDApKQotCQkJCWR5bnN5bSA9IHRydWU7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaWYgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMCkKLQkJCQlkeW5zeW0gPSB0cnVlOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQotCQkgIC8qIFdlIGFsc28gbmVlZCB0byBkZWZpbmUgYW4gaW5kaXJlY3Rpb24gZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIG5vbmRlZmF1bHQgdmVyc2lvbiBvZiB0aGUgc3ltYm9sLiAgKi8KLQotCQkgIHNob3J0bmFtZSA9IGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCQkgc3RybGVuIChuYW1lKSk7Ci0JCSAgaWYgKHNob3J0bmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RybmNweSAoc2hvcnRuYW1lLCBuYW1lLCBwIC0gbmFtZSk7Ci0JCSAgc3RyY3B5IChzaG9ydG5hbWUgKyAocCAtIG5hbWUpLCBwICsgMSk7Ci0KLQkJICAvKiBPbmNlIGFnYWluLCBtZXJnZSB3aXRoIGFueSBleGlzdGluZyBzeW1ib2wuICAqLwotCQkgIHR5cGVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgc2l6ZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLQkJICBpZiAoISBlbGZfbWVyZ2Vfc3ltYm9sIChhYmZkLCBpbmZvLCBzaG9ydG5hbWUsICZzeW0sICZzZWMsCi0JCQkJCSAgJnZhbHVlLCAmaGksICZvdmVycmlkZSwKLQkJCQkJICAmdHlwZV9jaGFuZ2Vfb2ssICZzaXplX2NoYW5nZV9vaykpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIGlmIChvdmVycmlkZSkKLQkJICAgIHsKLQkJICAgICAgLyogSGVyZSBTSE9SVE5BTUUgaXMgYSB2ZXJzaW9uZWQgbmFtZSwgc28gd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBleHBlY3QgdG8gc2VlIHRoZSB0eXBlIG9mIG92ZXJyaWRlIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG8gaW4gdGhlIGNhc2UgYWJvdmUuICAqLwotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogd2FybmluZzogdW5leHBlY3RlZCByZWRlZmluaXRpb24gb2YgYCVzJyIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzaG9ydG5hbWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCQkgICAgIChpbmZvLCBhYmZkLCBzaG9ydG5hbWUsIEJTRl9JTkRJUkVDVCwKLQkJCSAgICAgIGJmZF9pbmRfc2VjdGlvbl9wdHIsIChiZmRfdm1hKSAwLCBuYW1lLCBmYWxzZSwKLQkJCSAgICAgIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmhpKSkpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBJZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uIHNvbWV3aGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIEhJIG1heSBub3QgcG9pbnQgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sLgotICAgICAgICAgICAgICAgICAgICAgICAgIFdlIHdpbGwgaGF2ZSByZXBvcnRlZCBhbiBlcnJvciB0byB0aGUgdXNlciBpbgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FzZS4gICovCi0KLQkJICAgICAgaWYgKGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLQkJCXsKLQkJCSAgLyogSWYgdGhlIHN5bWJvbCBiZWNhbWUgaW5kaXJlY3QsIHRoZW4gd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIHRoYXQgd2UgaGF2ZSBub3Qgc2VlbiBhIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlLiAgKi8KLQkJCSAgQkZEX0FTU0VSVCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgICAgICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkJICB8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCQkJCSAgICAgID09IDApOwotCi0JCQkgIC8qIENvcHkgZG93biBhbnkgcmVmZXJlbmNlcyB0aGF0IHdlIG1heSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgc2VlbiB0byB0aGUgc3ltYm9sIHdoaWNoIGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYW1lIGluZGlyZWN0LiAgKi8KLQkJCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PQotCQkJICAgIChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAmIChFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDCi0JCQkJfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspKTsKLQotCQkJICAvKiBDb3B5IG92ZXIgdGhlIGdsb2JhbCBhbmQgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgb2Zmc2V0IGVudHJpZXMuICBUaGVzZSBtYXkgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgc2V0IHVwIGJ5IGEgY2hlY2tfcmVsb2NzIHJvdXRpbmUuICAqLwotCQkJICBpZiAoaC0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JCQkgICAgewotCQkJICAgICAgaC0+Z290Lm9mZnNldCA9IGhpLT5nb3Qub2Zmc2V0OwotCQkJICAgICAgaGktPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JCQkgICAgfQotCQkJICBCRkRfQVNTRVJUIChoaS0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpOwotCi0JCQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5wbHQub2Zmc2V0ID0gaGktPnBsdC5vZmZzZXQ7Ci0JCQkgICAgICBoaS0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCSAgICB9Ci0JCQkgIEJGRF9BU1NFUlQgKGhpLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7Ci0KLQkJCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCQkgICAgewotCQkJICAgICAgaC0+ZHluaW5keCA9IGhpLT5keW5pbmR4OwotCQkJICAgICAgaC0+ZHluc3RyX2luZGV4ID0gaGktPmR5bnN0cl9pbmRleDsKLQkJCSAgICAgIGhpLT5keW5pbmR4ID0gLTE7Ci0JCQkgICAgICBoaS0+ZHluc3RyX2luZGV4ID0gMDsKLQkJCSAgICB9Ci0JCQkgIEJGRF9BU1NFUlQgKGhpLT5keW5pbmR4ID09IC0xKTsKLQotCQkJICAvKiBGSVhNRTogVGhlcmUgbWF5IGJlIG90aGVyIGluZm9ybWF0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgb3ZlciBmb3IgcGFydGljdWxhciB0YXJnZXRzLiAgKi8KLQotCQkJICAvKiBTZWUgaWYgdGhlIG5ldyBmbGFncyBsZWFkIHVzIHRvIHJlYWxpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgc3ltYm9sIG11c3QgYmUgZHluYW1pYy4gICovCi0JCQkgIGlmICghIGR5bnN5bSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoISBkeW5hbWljKQotCQkJCXsKLQkJCQkgIGlmIChpbmZvLT5zaGFyZWQKLQkJCQkgICAgICB8fCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJCSAgICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykKLQkJCQkJICAhPSAwKSkKLQkJCQkgICAgZHluc3ltID0gdHJ1ZTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgaWYgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDApCi0JCQkJICAgIGR5bnN5bSA9IHRydWU7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChkeW5zeW0gJiYgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTAotCQkgICYmICEgbmV3X3dlYWtkZWYKLQkJICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sCi0JCQkJCQkJICAgICBoLT53ZWFrZGVmKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBzZXQgdGhlIHdlYWtkZWZzIGZpZWxkIGNvcnJlY3RseSBmb3IgYWxsIHRoZSB3ZWFrIGRlZmluZWQKLSAgICAgc3ltYm9scyB3ZSBmb3VuZC4gIFRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGlzIHRvIHNlYXJjaCBhbGwgdGhlCi0gICAgIHN5bWJvbHMuICBTaW5jZSB3ZSBvbmx5IG5lZWQgdGhlIGluZm9ybWF0aW9uIGZvciBub24gZnVuY3Rpb25zIGluCi0gICAgIGR5bmFtaWMgb2JqZWN0cywgdGhhdCdzIHRoZSBvbmx5IHRpbWUgd2UgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uCi0gICAgIHRoZSBsaXN0IFdFQUtTLiAgV2UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIHNvIHRoYXQgaWYgYSByZWd1bGFyCi0gICAgIG9iamVjdCByZWZlcnMgdG8gYSBzeW1ib2wgZGVmaW5lZCB3ZWFrbHkgaW4gYSBkeW5hbWljIG9iamVjdCwgdGhlCi0gICAgIHJlYWwgc3ltYm9sIGluIHRoZSBkeW5hbWljIG9iamVjdCBpcyBhbHNvIHB1dCBpbiB0aGUgZHluYW1pYwotICAgICBzeW1ib2xzOyB3ZSBhbHNvIG11c3QgYXJyYW5nZSBmb3IgYm90aCBzeW1ib2xzIHRvIHBvaW50IHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbi4gIFdlIGNvdWxkIGhhbmRsZSB0aGUgZ2VuZXJhbCBjYXNlIG9mIHN5bWJvbAotICAgICBhbGlhc2luZywgYnV0IGEgZ2VuZXJhbCBzeW1ib2wgYWxpYXMgY2FuIG9ubHkgYmUgZ2VuZXJhdGVkIGluCi0gICAgIGFzc2VtYmxlciBjb2RlLCBoYW5kbGluZyBpdCBjb3JyZWN0bHkgd291bGQgYmUgdmVyeSB0aW1lCi0gICAgIGNvbnN1bWluZywgYW5kIG90aGVyIEVMRiBsaW5rZXJzIGRvbid0IGhhbmRsZSBnZW5lcmFsIGFsaWFzaW5nCi0gICAgIGVpdGhlci4gICovCi0gIHdoaWxlICh3ZWFrcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpobG9vazsKLSAgICAgIGFzZWN0aW9uICpzbG9vazsKLSAgICAgIGJmZF92bWEgdmxvb2s7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhwcDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqaHBwZW5kOwotCi0gICAgICBobG9vayA9IHdlYWtzOwotICAgICAgd2Vha3MgPSBobG9vay0+d2Vha2RlZjsKLSAgICAgIGhsb29rLT53ZWFrZGVmID0gTlVMTDsKLQotICAgICAgQkZEX0FTU0VSVCAoaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkJICB8fCBobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpOwotICAgICAgc2xvb2sgPSBobG9vay0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgdmxvb2sgPSBobG9vay0+cm9vdC51LmRlZi52YWx1ZTsKLQotICAgICAgaHBwID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICAgICAgaHBwZW5kID0gaHBwICsgZXh0c3ltY291bnQ7Ci0gICAgICBmb3IgKDsgaHBwIDwgaHBwZW5kOyBocHArKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9ICpocHA7Ci0JICBpZiAoaCAhPSBOVUxMICYmIGggIT0gaGxvb2sKLQkgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNsb29rCi0JICAgICAgJiYgaC0+cm9vdC51LmRlZi52YWx1ZSA9PSB2bG9vaykKLQkgICAgewotCSAgICAgIGhsb29rLT53ZWFrZGVmID0gaDsKLQotCSAgICAgIC8qIElmIHRoZSB3ZWFrIGRlZmluaXRpb24gaXMgaW4gdGhlIGxpc3Qgb2YgZHluYW1pYwotCQkgc3ltYm9scywgbWFrZSBzdXJlIHRoZSByZWFsIGRlZmluaXRpb24gaXMgcHV0IHRoZXJlCi0JCSBhcyB3ZWxsLiAgKi8KLQkgICAgICBpZiAoaGxvb2stPmR5bmluZHggIT0gLTEKLQkJICAmJiBoLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoZSByZWFsIGRlZmluaXRpb24gaXMgaW4gdGhlIGxpc3Qgb2YgZHluYW1pYwotICAgICAgICAgICAgICAgICBzeW1ib2xzLCBtYWtlIHN1cmUgdGhlIHdlYWsgZGVmaW5pdGlvbiBpcyBwdXQgdGhlcmUKLSAgICAgICAgICAgICAgICAgYXMgd2VsbC4gIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZW4gdGhlIGR5bmFtaWMKLSAgICAgICAgICAgICAgICAgbG9hZGVyIG1pZ2h0IG5vdCBtZXJnZSB0aGUgZW50cmllcyBmb3IgdGhlIHJlYWwKLSAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBhbmQgdGhlIHdlYWsgZGVmaW5pdGlvbi4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggIT0gLTEKLQkJICAmJiBobG9vay0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBobG9vaykpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgYnVmID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGV4dHZlcnN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGV4dHZlcnN5bSk7Ci0gICAgICBleHR2ZXJzeW0gPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGlzIG9iamVjdCBpcyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG91dHB1dCBvYmplY3QsIGFuZCBpdCBpcwotICAgICBub3QgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBsZXQgdGhlIGJhY2tlbmQgbG9vayB0aHJvdWdoIHRoZQotICAgICByZWxvY3MuCi0KLSAgICAgVGhpcyBpcyByZXF1aXJlZCB0byBidWlsZCBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJpZXMgYW5kIHRvCi0gICAgIGFycmFuZ2UgZm9yIGR5bmFtaWMgcmVsb2NzLiAgSXQgaXMgbm90IHJlcXVpcmVkIGZvciB0aGUKLSAgICAgcGFydGljdWxhciBjb21tb24gY2FzZSBvZiBsaW5raW5nIG5vbiBQSUMgY29kZSwgZXZlbiB3aGVuIGxpbmtpbmcKLSAgICAgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLCBidXQgdW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyB3YXkgb2YKLSAgICAga25vd2luZyB3aGV0aGVyIGFuIG9iamVjdCBmaWxlIGhhcyBiZWVuIGNvbXBpbGVkIFBJQyBvciBub3QuCi0gICAgIExvb2tpbmcgdGhyb3VnaCB0aGUgcmVsb2NzIGlzIG5vdCBwYXJ0aWN1bGFybHkgdGltZSBjb25zdW1pbmcuCi0gICAgIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgbXVzdCBlaXRoZXIgKDEpIGtlZXAgdGhlIHJlbG9jcyBpbiBtZW1vcnksCi0gICAgIHdoaWNoIGNhdXNlcyB0aGUgbGlua2VyIHRvIHJlcXVpcmUgYWRkaXRpb25hbCBydW50aW1lIG1lbW9yeSBvcgotICAgICAoMikgcmVhZCB0aGUgcmVsb2NzIHR3aWNlIGZyb20gdGhlIGlucHV0IGZpbGUsIHdoaWNoIHdhc3RlcyB0aW1lLgotICAgICBUaGlzIHdvdWxkIGJlIGEgZ29vZCBjYXNlIGZvciB1c2luZyBtbWFwLgotCi0gICAgIEkgaGF2ZSBubyBpZGVhIGhvdyB0byBoYW5kbGUgbGlua2luZyBQSUMgY29kZSBpbnRvIGEgZmlsZSBvZiBhCi0gICAgIGRpZmZlcmVudCBmb3JtYXQuICBJdCBwcm9iYWJseSBjYW4ndCBiZSBkb25lLiAgKi8KLSAgY2hlY2tfcmVsb2NzID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jaGVja19yZWxvY3M7Ci0gIGlmICghIGR5bmFtaWMKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcgotICAgICAgJiYgY2hlY2tfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0JICBib29sZWFuIG9rOwotCi0JICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICAgICAgfHwgby0+cmVsb2NfY291bnQgPT0gMAotCSAgICAgIHx8ICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyKQotCQkgICYmIChvLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0JICAgICAgfHwgYmZkX2lzX2Fic19zZWN0aW9uIChvLT5vdXRwdXRfc2VjdGlvbikpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpbnRlcm5hbF9yZWxvY3MgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkJICAgICAoYWJmZCwgbywgKFBUUikgTlVMTCwKLQkJCSAgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJICAgICAgaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIG9rID0gKCpjaGVja19yZWxvY3MpIChhYmZkLCBpbmZvLCBvLCBpbnRlcm5hbF9yZWxvY3MpOwotCi0JICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLQkgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgaWYgKCEgb2spCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIG5vbi10cmFkaXRpb25hbCwgbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCB0cnkgdG8KLSAgICAgb3B0aW1pemUgdGhlIGhhbmRsaW5nIG9mIHRoZSAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCi0gIGlmICghIGR5bmFtaWMKLSAgICAgICYmICEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIGluZm8tPnRyYWRpdGlvbmFsX2Zvcm1hdAotICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsICYmIGluZm8tPnN0cmlwICE9IHN0cmlwX2RlYnVnZ2VyKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3RhYiwgKnN0YWJzdHI7Ci0KLSAgICAgIHN0YWIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFiIik7Ci0gICAgICBpZiAoc3RhYiAhPSBOVUxMKQotCXsKLQkgIHN0YWJzdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFic3RyIik7Ci0KLQkgIGlmIChzdGFic3RyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKnNlY2RhdGE7Ci0KLQkgICAgICBzZWNkYXRhID0gZWxmX3NlY3Rpb25fZGF0YSAoc3RhYik7Ci0JICAgICAgaWYgKCEgX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMgKGFiZmQsCi0JCQkJCSAgICAgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJCQkgICAgIHN0YWIsIHN0YWJzdHIsCi0JCQkJCSAgICAgJnNlY2RhdGEtPnN0YWJfaW5mbykpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIGlmIChkeW5idWYgIT0gTlVMTCkKLSAgICBmcmVlIChkeW5idWYpOwotICBpZiAoZHludmVyICE9IE5VTEwpCi0gICAgZnJlZSAoZHludmVyKTsKLSAgaWYgKGV4dHZlcnN5bSAhPSBOVUxMKQotICAgIGZyZWUgKGV4dHZlcnN5bSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ3JlYXRlIHNvbWUgc2VjdGlvbnMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBkeW5hbWljIGxpbmtpbmcKLSAgIGluZm9ybWF0aW9uLiAgQUJGRCBpcyBhbiBpbnB1dCBmaWxlIHdoaWNoIHJlcXVpcmVzIGR5bmFtaWMgc2VjdGlvbnMKLSAgIHRvIGJlIGNyZWF0ZWQuICBUaGUgZHluYW1pYyBzZWN0aW9ucyB0YWtlIHVwIHZpcnR1YWwgbWVtb3J5IHNwYWNlCi0gICB3aGVuIHRoZSBmaW5hbCBleGVjdXRhYmxlIGlzIHJ1biwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUKLSAgIGFkZHJlc3NlcyBhcmUgYXNzaWduZWQgdG8gdGhlIG91dHB1dCBzZWN0aW9ucy4gIFdlIHdvcmsgb3V0IHRoZQotICAgYWN0dWFsIGNvbnRlbnRzIGFuZCBzaXplIG9mIHRoZXNlIHNlY3Rpb25zIGxhdGVyLiAgKi8KLQotYm9vbGVhbgotZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IGFsbCBkeW5hbWljIHNlY3Rpb25zIHVzZSB0aGUgc2FtZSBpbnB1dCBCRkQuICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7Ci0gIGVsc2UKLSAgICBhYmZkID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnIGZvciBhbGwgb2YgdGhlc2UKLSAgICAgc2VjdGlvbnMuICAqLwotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIC8qIEEgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGUgaGFzIGEgLmludGVycCBzZWN0aW9uLCBidXQgYQotICAgICBzaGFyZWQgbGlicmFyeSBkb2VzIG5vdC4gICovCi0gIGlmICghIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5pbnRlcnAiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDcmVhdGUgc2VjdGlvbnMgdG8gaG9sZCB2ZXJzaW9uIGluZm9ybWF0aW9ucy4gIFRoZXNlIGFyZSByZW1vdmVkCi0gICAgIGlmIHRoZXkgYXJlIG5vdCBuZWVkZWQuICAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nbnUudmVyc2lvbl9kIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nbnUudmVyc2lvbiIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDEpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nbnUudmVyc2lvbl9yIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zeW0iKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN0ciIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9IGVsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICAgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluYW1pYyIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIHNwZWNpYWwgc3ltYm9sIF9EWU5BTUlDIGlzIGFsd2F5cyBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZQotICAgICAuZHluYW1pYyBzZWN0aW9uLiAgVGhpcyBjYWxsIG9jY3VycyBiZWZvcmUgd2UgaGF2ZSBwcm9jZXNzZWQgdGhlCi0gICAgIHN5bWJvbHMgZm9yIGFueSBkeW5hbWljIG9iamVjdCwgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAotICAgICBvdmVycmlkaW5nIGEgZHluYW1pYyBkZWZpbml0aW9uLiAgV2UgY291bGQgc2V0IF9EWU5BTUlDIGluIGEKLSAgICAgbGlua2VyIHNjcmlwdCwgYnV0IHdlIG9ubHkgd2FudCB0byBkZWZpbmUgaXQgaWYgd2UgYXJlLCBpbiBmYWN0LAotICAgICBjcmVhdGluZyBhIC5keW5hbWljIHNlY3Rpb24uICBXZSBkb24ndCB3YW50IHRvIGRlZmluZSBpdCBpZiB0aGVyZQotICAgICBpcyBubyAuZHluYW1pYyBzZWN0aW9uLCBzaW5jZSBvbiBzb21lIEVMRiBwbGF0Zm9ybXMgdGhlIHN0YXJ0IHVwCi0gICAgIGNvZGUgZXhhbWluZXMgaXQgdG8gZGVjaWRlIGhvdyB0byBpbml0aWFsaXplIHRoZSBwcm9jZXNzLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAoaW5mbywgYWJmZCwgIl9EWU5BTUlDIiwgQlNGX0dMT0JBTCwgcywgKGJmZF92bWEpIDAsCi0JICAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuaGFzaCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTGV0IHRoZSBiYWNrZW5kIGNyZWF0ZSB0aGUgcmVzdCBvZiB0aGUgc2VjdGlvbnMuICBUaGlzIGxldHMgdGhlCi0gICAgIGJhY2tlbmQgc2V0IHRoZSByaWdodCBmbGFncy4gIFRoZSBiYWNrZW5kIHdpbGwgbm9ybWFsbHkgY3JlYXRlCi0gICAgIHRoZSAuZ290IGFuZCAucGx0IHNlY3Rpb25zLiAgKi8KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYW4gZW50cnkgdG8gdGhlIC5keW5hbWljIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCB0YWcsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdGFnOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgc2l6ZV90IG5ld3NpemU7Ci0gIGJmZF9ieXRlICpuZXdjb250ZW50czsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgbmV3c2l6ZSA9IHMtPl9yYXdfc2l6ZSArIHNpemVvZiAoRWxmX0V4dGVybmFsX0R5bik7Ci0gIG5ld2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChzLT5jb250ZW50cywgbmV3c2l6ZSk7Ci0gIGlmIChuZXdjb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkeW4uZF90YWcgPSB0YWc7Ci0gIGR5bi5kX3VuLmRfdmFsID0gdmFsOwotICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sCi0JCSAgICAoRWxmX0V4dGVybmFsX0R5biAqKSAobmV3Y29udGVudHMgKyBzLT5fcmF3X3NpemUpKTsKLQotICBzLT5fcmF3X3NpemUgPSBuZXdzaXplOwotICBzLT5jb250ZW50cyA9IG5ld2NvbnRlbnRzOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZnJvbSB0aGUgc2VjdGlvbiBpbmRpY2F0ZWQgYnkgU0hEUi4gIFRoaXMKLSAgIG1heSBiZSBlaXRoZXIgYSBSRUwgb3IgYSBSRUxBIHNlY3Rpb24uICBUaGUgcmVsb2NhdGlvbnMgYXJlCi0gICB0cmFuc2xhdGVkIGludG8gUkVMQSByZWxvY2F0aW9ucyBhbmQgc3RvcmVkIGluIElOVEVSTkFMX1JFTE9DUywKLSAgIHdoaWNoIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgdG8gY29udGFpbiBlbm91Z2ggc3BhY2UuCi0gICBUaGUgRVhURVJOQUxfUkVMT0NTIGFyZSBhIGJ1ZmZlciB3aGVyZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUKLSAgIHJlbG9jYXRpb25zIHNob3VsZCBiZSBzdG9yZWQuCi0KLSAgIFJldHVybnMgZmFsc2UgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uIChhYmZkLCBzaGRyLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJICAgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzaGRyOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotewotICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jYXRpb25zLCB0aGF0J3MgT0suICAqLwotICBpZiAoIXNoZHIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUG9zaXRpb24gb3Vyc2VsdmVzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICAqLwotICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgc2hkci0+c2hfc2l6ZSwgYWJmZCkKLSAgICAgICE9IHNoZHItPnNoX3NpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENvbnZlcnQgdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zIHRvIHRoZSBpbnRlcm5hbCBmb3JtYXQuICAqLwotICBpZiAoc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsZW5kOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotCi0gICAgICBlcmVsID0gKEVsZl9FeHRlcm5hbF9SZWwgKikgZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZXJlbGVuZCA9IGVyZWwgKyBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yICg7IGVyZWwgPCBlcmVsZW5kOyBlcmVsKyssIGlyZWxhKyspCi0JewotCSAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotCi0JICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgJmlyZWwpOwotCSAgaXJlbGEtPnJfb2Zmc2V0ID0gaXJlbC5yX29mZnNldDsKLQkgIGlyZWxhLT5yX2luZm8gPSBpcmVsLnJfaW5mbzsKLQkgIGlyZWxhLT5yX2FkZGVuZCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYWVuZDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKLQotICAgICAgQkZEX0FTU0VSVCAoc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0KLSAgICAgIGVyZWxhID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGVyZWxhZW5kID0gZXJlbGEgKyBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yICg7IGVyZWxhIDwgZXJlbGFlbmQ7IGVyZWxhKyssIGlyZWxhKyspCi0JZWxmX3N3YXBfcmVsb2NhX2luIChhYmZkLCBlcmVsYSwgaXJlbGEpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gTy4gIFRoZXkgbWF5IGhhdmUgYmVlbgotICAgY2FjaGVkLiAgSWYgdGhlIEVYVEVSTkFMX1JFTE9DUyBhbmQgSU5URVJOQUxfUkVMT0NTIGFyZ3VtZW50cyBhcmUKLSAgIG5vdCBOVUxMLCB0aGV5IGFyZSB1c2VkIGFzIGJ1ZmZlcnMgdG8gcmVhZCBpbnRvLiAgVGhleSBhcmUga25vd24gdG8KLSAgIGJlIGxhcmdlIGVub3VnaC4gIElmIHRoZSBJTlRFUk5BTF9SRUxPQ1MgcmVsb2NzIGFyZ3VtZW50IGlzIE5VTEwsCi0gICB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsbG9jYXRlZCB1c2luZyBlaXRoZXIgbWFsbG9jIG9yIGJmZF9hbGxvYywKLSAgIGFjY29yZGluZyB0byB0aGUgS0VFUF9NRU1PUlkgYXJndW1lbnQuICBJZiBPIGhhcyB0d28gcmVsb2NhdGlvbgotICAgc2VjdGlvbnMgKGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zKSwgdGhlbiB0aGUgUkVMX0hEUgotICAgcmVsb2NhdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QgaW4gSU5URVJOQUxfUkVMT0NTLCBmb2xsb3dlZCBieSB0aGUKLSAgIFJFTF9IRFIyIHJlbG9jYXRpb25zLiAgKi8KLQotRWxmX0ludGVybmFsX1JlbGEgKgotTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKSAoYWJmZCwgbywgZXh0ZXJuYWxfcmVsb2NzLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJIGtlZXBfbWVtb3J5KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpvOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBib29sZWFuIGtlZXBfbWVtb3J5OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgUFRSIGFsbG9jMSA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICphbGxvYzIgPSBOVUxMOwotCi0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzICE9IE5VTEwpCi0gICAgcmV0dXJuIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY3M7Ci0KLSAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLQotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IHNpemU7Ci0KLSAgICAgIHNpemUgPSBvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpOwotICAgICAgaWYgKGtlZXBfbWVtb3J5KQotCWludGVybmFsX3JlbG9jcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgZWxzZQotCWludGVybmFsX3JlbG9jcyA9IGFsbG9jMiA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZTsKLQotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMikKLQlzaXplICs9IChzaXplX3QpIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMi0+c2hfc2l6ZTsKLSAgICAgIGFsbG9jMSA9IChQVFIpIGJmZF9tYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGFsbG9jMSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gYWxsb2MxOwotICAgIH0KLQotICBpZiAoIWVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbiAoYWJmZCwgcmVsX2hkciwKLQkJCQkJICBleHRlcm5hbF9yZWxvY3MsCi0JCQkJCSAgaW50ZXJuYWxfcmVsb2NzKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCFlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gCi0gICAgICAoYWJmZCwgCi0gICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLAotICAgICAgICgoYmZkX2J5dGUgKikgZXh0ZXJuYWxfcmVsb2NzKSArIHJlbF9oZHItPnNoX3NpemUsCi0gICAgICAgaW50ZXJuYWxfcmVsb2NzICsgcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciBuZXh0IHRpbWUsIGlmIHdlIGNhbi4gICovCi0gIGlmIChrZWVwX21lbW9yeSkKLSAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotCi0gIC8qIERvbid0IGZyZWUgYWxsb2MyLCBzaW5jZSBpZiBpdCB3YXMgYWxsb2NhdGVkIHdlIGFyZSBwYXNzaW5nIGl0Ci0gICAgIGJhY2sgKHVuZGVyIHRoZSBuYW1lIG9mIGludGVybmFsX3JlbG9jcykuICAqLwotCi0gIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotICBpZiAoYWxsb2MyICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MyKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IHRvIGEgc3ltYm9sIG1hZGUgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1OQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUsIHByb3ZpZGUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJvb2xlYW4gcHJvdmlkZTsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsIGFuZCBpdCBpcwotICAgICBjdXJyZW50bHkgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBidXQgbm90IGJ5IGEgcmVndWxhcgotICAgICBvYmplY3QsIHRoZW4gbWFyayBpdCBhcyB1bmRlZmluZWQgc28gdGhhdCB0aGUgZ2VuZXJpYyBsaW5rZXIgd2lsbAotICAgICBmb3JjZSB0aGUgY29ycmVjdCB2YWx1ZS4gICovCi0gIGlmIChwcm92aWRlCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsIGFuZCBpdCBpcwotICAgICBjdXJyZW50bHkgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBidXQgbm90IGJ5IGEgcmVndWxhciBvYmplY3QsCi0gICAgIHRoZW4gY2xlYXIgb3V0IGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlY2F1c2UgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZQotICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFueSBtb3JlLiAgKi8KLSAgaWYgKCFwcm92aWRlCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICBoLT52ZXJpbmZvLnZlcmRlZiA9IE5VTEw7Ci0KLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkgIHwgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykpICE9IDAKLSAgICAgICB8fCBpbmZvLT5zaGFyZWQpCi0gICAgICAmJiBoLT5keW5pbmR4ID09IC0xKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSB3ZWFrIGRlZmluZWQgc3ltYm9sLCBhbmQgd2Uga25vdyBhIGNvcnJlc3BvbmRpbmcKLQkgcmVhbCBzeW1ib2wgZnJvbSB0aGUgc2FtZSBkeW5hbWljIG9iamVjdCwgbWFrZSBzdXJlIHRoZSByZWFsCi0JIHN5bWJvbCBpcyBhbHNvIG1hZGUgaW50byBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT53ZWFrZGVmICE9IE5VTEwKLQkgICYmIGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgtPndlYWtkZWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uLiAgKi8KLQotc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbwotewotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogVmVyc2lvbiB0cmVlLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJkZWZzOwotICAvKiBXaGV0aGVyIHdlIGFyZSBleHBvcnRpbmcgYWxsIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7Ci0gIC8qIFdoZXRoZXIgd2UgcmVtb3ZlZCBhbnkgc3ltYm9scyBmcm9tIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0gIGJvb2xlYW4gcmVtb3ZlZF9keW5hbWljOwotICAvKiBXaGV0aGVyIHdlIGhhZCBhIGZhaWx1cmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcy4gICovCi0KLXN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbwotewotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgdmVyczsKLSAgLyogV2hldGhlciB3ZSBoYWQgYSBmYWlsdXJlLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi0vKiBBcnJheSB1c2VkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGhhc2ggdGFibGUgYnVja2V0cyB0byB1c2UKLSAgIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0aGVyZSBhcmUuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgotICAgMyBzeW1ib2xzIHdlIHVzZSAxIGJ1Y2tldCwgZmV3ZXIgdGhhbiAxNyBzeW1ib2xzIHdlIHVzZSAzIGJ1Y2tldHMsCi0gICBmZXdlciB0aGFuIDM3IHdlIHVzZSAxNyBidWNrZXRzLCBhbmQgc28gZm9ydGguICBXZSBuZXZlciB1c2UgbW9yZQotICAgdGhhbiAzMjc3MSBidWNrZXRzLiAgKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBlbGZfYnVja2V0c1tdID0KLXsKLSAgMSwgMywgMTcsIDM3LCA2NywgOTcsIDEzMSwgMTk3LCAyNjMsIDUyMSwgMTAzMSwgMjA1MywgNDA5OSwgODIwOSwKLSAgMTY0MTEsIDMyNzcxLCAwCi19OwotCi0vKiBDb21wdXRlIGJ1Y2tldCBjb3VudCBmb3IgaGFzaGluZyB0YWJsZS4gIFdlIGRvIG5vdCB1c2UgYSBzdGF0aWMgc2V0Ci0gICBvZiBwb3NzaWJsZSB0YWJsZXMgc2l6ZXMgYW55bW9yZS4gIEluc3RlYWQgd2UgZGV0ZXJtaW5lIGZvciBhbGwKLSAgIHBvc3NpYmxlIHJlYXNvbmFibGUgc2l6ZXMgb2YgdGhlIHRhYmxlIHRoZSBvdXRjb21lIChpLmUuLCB0aGUKLSAgIG51bWJlciBvZiBjb2xsaXNpb25zIGV0YykgYW5kIGNob29zZSB0aGUgYmVzdCBzb2x1dGlvbi4gIFRoZQotICAgd2VpZ2h0aW5nIGZ1bmN0aW9ucyBhcmUgbm90IHRvbyBzaW1wbGUgdG8gYWxsb3cgdGhlIHRhYmxlIHRvIGdyb3cKLSAgIHdpdGhvdXQgYm91bmRzLiAgSW5zdGVhZCBvbmUgb2YgdGhlIHdlaWdodGluZyBmYWN0b3JzIGlzIHRoZSBzaXplLgotICAgVGhlcmVmb3JlIHRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZ29vZCBwYXlvZmYgYmV0d2VlbiBmZXcgY29sbGlzaW9ucwotICAgKD0gc2hvcnQgY2hhaW4gbGVuZ3RocykgYW5kIHRhYmxlIHNpemUuICAqLwotc3RhdGljIHNpemVfdAotY29tcHV0ZV9idWNrZXRfY291bnQgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzaXplX3QgZHluc3ltY291bnQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICBzaXplX3QgYmVzdF9zaXplOwotICB1bnNpZ25lZCBsb25nIGludCAqaGFzaGNvZGVzOwotICB1bnNpZ25lZCBsb25nIGludCAqaGFzaGNvZGVzcDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgaTsKLQotICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlcyBmb3IgYWxsIGV4cG9ydGVkIHN5bWJvbHMuICBBdCB0aGUgc2FtZQotICAgICB0aW1lIHN0b3JlIHRoZSB2YWx1ZXMgaW4gYW4gYXJyYXkgc28gdGhhdCB3ZSBjb3VsZCB1c2UgdGhlbSBmb3IKLSAgICAgb3B0aW1pemF0aW9ucy4gICovCi0gIGhhc2hjb2RlcyA9ICh1bnNpZ25lZCBsb25nIGludCAqKSBiZmRfbWFsbG9jIChkeW5zeW1jb3VudAotCQkJCQkJKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSk7Ci0gIGlmIChoYXNoY29kZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgaGFzaGNvZGVzcCA9IGhhc2hjb2RlczsKLQotICAvKiBQdXQgYWxsIGhhc2ggdmFsdWVzIGluIEhBU0hDT0RFUy4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2NvbGxlY3RfaGFzaF9jb2RlcywgJmhhc2hjb2Rlc3ApOwotCi0vKiBXZSBoYXZlIGEgcHJvYmxlbSBoZXJlLiAgVGhlIGZvbGxvd2luZyBjb2RlIHRvIG9wdGltaXplIHRoZSB0YWJsZQotICAgc2l6ZSByZXF1aXJlcyBhbiBpbnRlZ2VyIHR5cGUgd2l0aCBtb3JlIHRoZSAzMiBiaXRzLiAgSWYKLSAgIEJGRF9IT1NUX1VfNjRfQklUIGlzIHNldCB3ZSBrbm93IGFib3V0IHN1Y2ggYSB0eXBlLiAgKi8KLSNpZmRlZiBCRkRfSE9TVF9VXzY0X0JJVAotICBpZiAoaW5mby0+b3B0aW1pemUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCBuc3ltcyA9IGhhc2hjb2Rlc3AgLSBoYXNoY29kZXM7Ci0gICAgICBzaXplX3QgbWluc2l6ZTsKLSAgICAgIHNpemVfdCBtYXhzaXplOwotICAgICAgQkZEX0hPU1RfVV82NF9CSVQgYmVzdF9jaGxlbiA9IH4oKEJGRF9IT1NUX1VfNjRfQklUKSAwKTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICpjb3VudHMgOwotCi0gICAgICAvKiBQb3NzaWJsZSBvcHRpbWl6YXRpb24gcGFyYW1ldGVyczogaWYgd2UgaGF2ZSBOU1lNUyBzeW1ib2xzIHdlIHNheQotCSB0aGF0IHRoZSBoYXNoaW5nIHRhYmxlIG11c3QgYXQgbGVhc3QgaGF2ZSBOU1lNUy80IGFuZCBhdCBtb3N0Ci0JIDIqTlNZTVMgYnVja2V0cy4gICovCi0gICAgICBtaW5zaXplID0gbnN5bXMgLyA0OwotICAgICAgaWYgKG1pbnNpemUgPT0gMCkKLQltaW5zaXplID0gMTsKLSAgICAgIGJlc3Rfc2l6ZSA9IG1heHNpemUgPSBuc3ltcyAqIDI7Ci0KLSAgICAgIC8qIENyZWF0ZSBhcnJheSB3aGVyZSB3ZSBjb3VudCB0aGUgY29sbGlzaW9ucyBpbi4gIFdlIG11c3QgdXNlIGJmZF9tYWxsb2MKLQkgc2luY2UgdGhlIHNpemUgY291bGQgYmUgbGFyZ2UuICAqLwotICAgICAgY291bnRzID0gKHVuc2lnbmVkIGxvbmcgaW50ICopIGJmZF9tYWxsb2MgKG1heHNpemUKLQkJCQkJCSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKTsKLSAgICAgIGlmIChjb3VudHMgPT0gTlVMTCkKLQl7Ci0JICBmcmVlIChoYXNoY29kZXMpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBDb21wdXRlIHRoZSAib3B0aW1hbCIgc2l6ZSBmb3IgdGhlIGhhc2ggdGFibGUuICBUaGUgY3JpdGVyaWEgaXMgYQotCSBtaW5pbWFsIGNoYWluIGxlbmd0aC4gIFRoZSBtaW5vciBjcml0ZXJpYSBpcyAob2YgY291cnNlKSB0aGUgc2l6ZQotCSBvZiB0aGUgdGFibGUuICAqLwotICAgICAgZm9yIChpID0gbWluc2l6ZTsgaSA8IG1heHNpemU7ICsraSkKLQl7Ci0JICAvKiBXYWxrIHRocm91Z2ggdGhlIGFycmF5IG9mIGhhc2hjb2RlcyBhbmQgY291bnQgdGhlIGNvbGxpc2lvbnMuICAqLwotCSAgQkZEX0hPU1RfVV82NF9CSVQgbWF4OwotCSAgdW5zaWduZWQgbG9uZyBpbnQgajsKLQkgIHVuc2lnbmVkIGxvbmcgaW50IGZhY3Q7Ci0KLQkgIG1lbXNldCAoY291bnRzLCAnXDAnLCBpICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOwotCi0JICAvKiBEZXRlcm1pbmUgaG93IG9mdGVuIGVhY2ggaGFzaCBidWNrZXQgaXMgdXNlZC4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7ICsraikKLQkgICAgKytjb3VudHNbaGFzaGNvZGVzW2pdICUgaV07Ci0KLQkgIC8qIEZvciB0aGUgd2VpZ2h0IGZ1bmN0aW9uIHdlIG5lZWQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgICAgIHBhZ2VzaXplIG9uIHRoZSB0YXJnZXQuICBUaGlzIGlzIGluZm9ybWF0aW9uIG5lZWQgbm90IGJlIDEwMCUKLQkgICAgIGFjY3VyYXRlLiAgU2luY2UgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIChzbyBmYXIpIHdlCi0JICAgICBkZWZpbmUgaXQgaGVyZSB0byBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZS4gIElmIGl0IGlzIGNydWNpYWwKLQkgICAgIHRvIGhhdmUgYSBiZXR0ZXIgdmFsdWUgc29tZSBkYXkgc2ltcGx5IGRlZmluZSB0aGlzIHZhbHVlLiAgKi8KLSMgaWZuZGVmIEJGRF9UQVJHRVRfUEFHRVNJWkUKLSMgIGRlZmluZSBCRkRfVEFSR0VUX1BBR0VTSVpFCSg0MDk2KQotIyBlbmRpZgotCi0JICAvKiBXZSBpbiBhbnkgY2FzZSBuZWVkIDIgKyBOU1lNUyBlbnRyaWVzIGZvciB0aGUgc2l6ZSB2YWx1ZXMgYW5kCi0JICAgICB0aGUgY2hhaW5zLiAgKi8KLQkgIG1heCA9ICgyICsgbnN5bXMpICogKEFSQ0hfU0laRSAvIDgpOwotCi0jIGlmIDEKLQkgIC8qIFZhcmlhbnQgMTogb3B0aW1pemUgZm9yIHNob3J0IGNoYWlucy4gIFdlIGFkZCB0aGUgc3F1YXJlcwotCSAgICAgb2YgYWxsIHRoZSBjaGFpbiBsZW5ndGhzICh3aGljaCBmYXZvdXMgbWFueSBzbWFsbCBjaGFpbgotCSAgICAgb3ZlciBhIGZldyBsb25nIGNoYWlucykuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKLQkgICAgbWF4ICs9IGNvdW50c1tqXSAqIGNvdW50c1tqXTsKLQotCSAgLyogVGhpcyBhZGRzIHBlbmFsdGllcyBmb3IgdGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgdGFibGUuICAqLwotCSAgZmFjdCA9IGkgLyAoQkZEX1RBUkdFVF9QQUdFU0laRSAvIChBUkNIX1NJWkUgLyA4KSkgKyAxOwotCSAgbWF4ICo9IGZhY3QgKiBmYWN0OwotIyBlbHNlCi0JICAvKiBWYXJpYW50IDI6IE9wdGltaXplIGEgbG90IG1vcmUgZm9yIHNtYWxsIHRhYmxlLiAgSGVyZSB3ZQotCSAgICAgYWxzbyBhZGQgc3F1YXJlcyBvZiB0aGUgc2l6ZSBidXQgd2UgYWxzbyBhZGQgcGVuYWx0aWVzIGZvcgotCSAgICAgZW1wdHkgc2xvdHMgKHRoZSArMSB0ZXJtKS4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgaTsgKytqKQotCSAgICBtYXggKz0gKDEgKyBjb3VudHNbal0pICogKDEgKyBjb3VudHNbal0pOwotCi0JICAvKiBUaGUgb3ZlcmFsbCBzaXplIG9mIHRoZSB0YWJsZSBpcyBjb25zaWRlcmVkLCBidXQgbm90IGFzCi0JICAgICBzdHJvbmcgYXMgaW4gdmFyaWFudCAxLCB3aGVyZSBpdCBpcyBzcXVhcmVkLiAgKi8KLQkgIGZhY3QgPSBpIC8gKEJGRF9UQVJHRVRfUEFHRVNJWkUgLyAoQVJDSF9TSVpFIC8gOCkpICsgMTsKLQkgIG1heCAqPSBmYWN0OwotIyBlbmRpZgotCi0JICAvKiBDb21wYXJlIHdpdGggY3VycmVudCBiZXN0IHJlc3VsdHMuICAqLwotCSAgaWYgKG1heCA8IGJlc3RfY2hsZW4pCi0JICAgIHsKLQkgICAgICBiZXN0X2NobGVuID0gbWF4OwotCSAgICAgIGJlc3Rfc2l6ZSA9IGk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZyZWUgKGNvdW50cyk7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0hPU1RfVV82NF9CSVQpICovCi0gICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgZmFsbGJhY2sgc29sdXRpb24gaWYgbm8gNjRiaXQgdHlwZSBpcyBhdmFpbGFibGUgb3IgaWYgd2UKLQkgYXJlIG5vdCBzdXBwb3NlZCB0byBzcGVuZCBtdWNoIHRpbWUgb24gb3B0aW1pemF0aW9ucy4gIFdlIHNlbGVjdCB0aGUKLQkgYnVja2V0IGNvdW50IHVzaW5nIGEgZml4ZWQgc2V0IG9mIG51bWJlcnMuICAqLwotICAgICAgZm9yIChpID0gMDsgZWxmX2J1Y2tldHNbaV0gIT0gMDsgaSsrKQotCXsKLQkgIGJlc3Rfc2l6ZSA9IGVsZl9idWNrZXRzW2ldOwotCSAgaWYgKGR5bnN5bWNvdW50IDwgZWxmX2J1Y2tldHNbaSArIDFdKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEZyZWUgdGhlIGFycmF5cyB3ZSBuZWVkZWQuICAqLwotICBmcmVlIChoYXNoY29kZXMpOwotCi0gIHJldHVybiBiZXN0X3NpemU7Ci19Ci0KLS8qIFJlbW92ZSBTRUNUSU9OIGZyb20gdGhlIEJGRC4gIElmIGEgc3ltYm9sIGZvciBTRUNUSU9OIHdhcyBnb2luZyB0bwotICAgYmUgcHV0IGludG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCByZW1vdmUgaXQsIGFuZCByZW51bWJlcgotICAgc3Vic2VxdWVudCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyAoaW5mbywgc2VjdGlvbikKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICAvKiBSZW1vdmUgdGhlIHNlY3Rpb24gZnJvbSB0aGUgb3V0cHV0IGxpc3QuICAqLwotICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHNlY3Rpb24pOwotCi0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiktPmR5bmluZHgpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBpbnQgaW5jcmVtZW50ID0gLTE7Ci0KLSAgICAgIC8qIFdlIHdlcmUgZ29pbmcgdG8gb3V0cHV0IGFuIGVudHJ5IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZQotCSBmb3IgdGhlIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2VjdGlvbi4gIE5vdywgdGhlCi0JIHNlY3Rpb24gaXMgZ29uZS4gIFNvLCB3ZSBtdXN0IHJlbnVtYmVyIHRoZSBkeW5hbWljIGluZGljZXMgb2YKLQkgYWxsIHN1YnNlcXVlbnQgc2VjdGlvbnMgYW5kIGFsbCBvdGhlciBlbnRyaWVzIGluIHRoZSBkeW5hbWljCi0JIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiktPmR5bmluZHggPSAwOwotICAgICAgZm9yIChzID0gc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm5leHQ7IHM7IHMgPSBzLT5uZXh0KQotCWlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkKLQkgIC0tZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHg7Ci0gICAgICAKLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgsCi0JCQkgICAgICAmaW5jcmVtZW50KTsKLQotICAgICAgLyogVGhlcmUgaXMgb25lIGxlc3MgZHluYW1pYyBzeW1ib2wgdGhhbiB0aGVyZSB3YXMgYmVmb3JlLiAgKi8KLSAgICAgIC0tZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgICB9Ci19Ci0KLS8qIFNldCB1cCB0aGUgc2l6ZXMgYW5kIGNvbnRlbnRzIG9mIHRoZSBFTEYgZHluYW1pYyBzZWN0aW9ucy4gIFRoaXMgaXMKLSAgIGNhbGxlZCBieSB0aGUgRUxGIGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlCi0gICBtdXN0IHNldCB0aGUgc2l6ZXMgb2YgdGhlIHNlY3Rpb25zIGJlZm9yZSB0aGUgbGlua2VyIHNldHMgdGhlCi0gICBhZGRyZXNzZXMgb2YgdGhlIHZhcmlvdXMgc2VjdGlvbnMuICAqLwotCi1ib29sZWFuCi1OQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgc29uYW1lLCBycGF0aCwKLQkJCQkgICAgIGV4cG9ydF9keW5hbWljLCBmaWx0ZXJfc2hsaWIsCi0JCQkJICAgICBhdXhpbGlhcnlfZmlsdGVycywgaW5mbywgc2ludGVycHB0ciwKLQkJCQkgICAgIHZlcmRlZnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY29uc3QgY2hhciAqc29uYW1lOwotICAgICBjb25zdCBjaGFyICpycGF0aDsKLSAgICAgYm9vbGVhbiBleHBvcnRfZHluYW1pYzsKLSAgICAgY29uc3QgY2hhciAqZmlsdGVyX3NobGliOwotICAgICBjb25zdCBjaGFyICogY29uc3QgKmF1eGlsaWFyeV9maWx0ZXJzOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKipzaW50ZXJwcHRyOwotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcmRlZnM7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc29uYW1lX2luZHg7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotICBiZmRfc2l6ZV90eXBlIG9sZF9keW5zeW1jb3VudDsKLSAgc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyBhc3ZpbmZvOwotCi0gICpzaW50ZXJwcHRyID0gTlVMTDsKLQotICBzb25hbWVfaW5keCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZSBiYWNrZW5kIG1heSBoYXZlIHRvIGNyZWF0ZSBzb21lIHNlY3Rpb25zIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICAgICB3ZSdyZSBkeW5hbWljIG9yIG5vdC4gICovCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKTsKLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgICAgICYmICEgKCpiZWQtPmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIElmIHRoZXJlIHdlcmUgbm8gZHluYW1pYyBvYmplY3RzIGluIHRoZSBsaW5rLCB0aGVyZSBpcyBub3RoaW5nIHRvCi0gICAgIGRvIGhlcmUuICAqLwotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgYXJlIHN1cHBvc2VkIHRvIGV4cG9ydCBhbGwgc3ltYm9scyBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbAotICAgICB0YWJsZSAodGhpcyBpcyBub3QgdGhlIG5vcm1hbCBjYXNlKSwgdGhlbiBkbyBzby4gICovCi0gIGlmIChleHBvcnRfZHluYW1pYykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkIGVpZjsKLQotICAgICAgZWlmLmZhaWxlZCA9IGZhbHNlOwotICAgICAgZWlmLmluZm8gPSBpbmZvOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfZXhwb3J0X3N5bWJvbCwKLQkJCSAgICAgIChQVFIpICZlaWYpOwotICAgICAgaWYgKGVpZi5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCBlaWY7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3Ryc2l6ZTsKLQotICAgICAgKnNpbnRlcnBwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotICAgICAgQkZEX0FTU0VSVCAoKnNpbnRlcnBwdHIgIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpOwotCi0gICAgICBpZiAoc29uYW1lICE9IE5VTEwpCi0JewotCSAgc29uYW1lX2luZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgc29uYW1lLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChzb25hbWVfaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU09OQU1FLCBzb25hbWVfaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5zeW1ib2xpYykKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NZTUJPTElDLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJwYXRoICE9IE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwgcnBhdGgsCi0JCQkJICAgICB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMQotCSAgICAgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SUEFUSCwgaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChmaWx0ZXJfc2hsaWIgIT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCSAgICAgZmlsdGVyX3NobGliLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMQotCSAgICAgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9GSUxURVIsIGluZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYXV4aWxpYXJ5X2ZpbHRlcnMgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICogY29uc3QgKnA7Ci0KLQkgIGZvciAocCA9IGF1eGlsaWFyeV9maWx0ZXJzOyAqcCAhPSBOVUxMOyBwKyspCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICpwLCB0cnVlLCB0cnVlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkJICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfQVVYSUxJQVJZLCBpbmR4KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBdHRhY2ggYWxsIHRoZSBzeW1ib2xzIHRvIHRoZWlyIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICAgICAgYXN2aW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLSAgICAgIGFzdmluZm8uaW5mbyA9IGluZm87Ci0gICAgICBhc3ZpbmZvLnZlcmRlZnMgPSB2ZXJkZWZzOwotICAgICAgYXN2aW5mby5leHBvcnRfZHluYW1pYyA9IGV4cG9ydF9keW5hbWljOwotICAgICAgYXN2aW5mby5yZW1vdmVkX2R5bmFtaWMgPSBmYWxzZTsKLSAgICAgIGFzdmluZm8uZmFpbGVkID0gZmFsc2U7Ci0KLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiwKLQkJCSAgICAgIChQVFIpICZhc3ZpbmZvKTsKLSAgICAgIGlmIChhc3ZpbmZvLmZhaWxlZCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZpbmQgYWxsIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgYW5kIG1ha2UKLQkgdGhlIGJhY2tlbmQgcGljayBhIHJlYXNvbmFibGUgdmFsdWUgZm9yIHRoZW0uICAqLwotICAgICAgZWlmLmZhaWxlZCA9IGZhbHNlOwotICAgICAgZWlmLmluZm8gPSBpbmZvOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLQkJCSAgICAgIChQVFIpICZlaWYpOwotICAgICAgaWYgKGVpZi5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiBzb21lIG9mIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9iZmRfZmluYWxfbGluaywgYnV0IHdlIG11c3QgYWRkIHRoZSBlbnRyaWVzCi0JIG5vdyBzbyB0aGF0IHdlIGtub3cgdGhlIGZpbmFsIHNpemUgb2YgdGhlIC5keW5hbWljIHNlY3Rpb24uICAqLwotCi0gICAgICAvKiBJZiB0aGVyZSBhcmUgaW5pdGlhbGl6YXRpb24gYW5kL29yIGZpbmFsaXphdGlvbiBmdW5jdGlvbnMgdG8KLQkgY2FsbCB0aGVuIGFkZCB0aGUgY29ycmVzcG9uZGluZyBEVF9JTklUL0RUX0ZJTkkgZW50cmllcy4gICovCi0gICAgICBoID0gKGluZm8tPmluaXRfZnVuY3Rpb24KLQkgICA/IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJCSAgIGluZm8tPmluaXRfZnVuY3Rpb24sIGZhbHNlLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkKLQkgICA6IE5VTEwpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCQl8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSAhPSAwKQotCXsKLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSU5JVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBoID0gKGluZm8tPmZpbmlfZnVuY3Rpb24KLQkgICA/IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJCSAgIGluZm8tPmZpbmlfZnVuY3Rpb24sIGZhbHNlLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkKLQkgICA6IE5VTEwpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCQl8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSAhPSAwKQotCXsKLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfRklOSSwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0cnNpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0gICAgICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0hBU0gsIDApCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1RSVEFCLCAwKQotCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NZTVRBQiwgMCkKLQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TVFJTWiwgc3Ryc2l6ZSkKLQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1FTlQsCi0JCQkJICAgICAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgYmFja2VuZCBtdXN0IHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbGwgdGhlIG90aGVyIGR5bmFtaWMKLSAgICAgc2VjdGlvbnMuICAqLwotICBvbGRfZHluc3ltY291bnQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgICAgICYmICEgKCpiZWQtPmVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucykgKG91dHB1dF9iZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgc2l6ZV90IGR5bnN5bWNvdW50OwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBzaXplX3QgYnVja2V0Y291bnQgPSAwOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uX2QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgYWRkaXRpb25hbCB2ZXJzaW9uIGRlZmluaXRpb25zIGlmIHdlIGFyZQotICAgICAgICAganVzdCBsaW5raW5nIGEgcmVndWxhciBhcHBsaWNhdGlvbi4gICovCi0gICAgICB2ZXJkZWZzID0gYXN2aW5mby52ZXJkZWZzOwotCi0gICAgICBpZiAodmVyZGVmcyA9PSBOVUxMKQotCWVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyAoaW5mbywgcyk7Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGNkZWZzOwotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp0OwotCSAgYmZkX2J5dGUgKnA7Ci0JICBFbGZfSW50ZXJuYWxfVmVyZGVmIGRlZjsKLQkgIEVsZl9JbnRlcm5hbF9WZXJkYXV4IGRlZmF1eDsKLQotCSAgaWYgKGFzdmluZm8ucmVtb3ZlZF9keW5hbWljKQotCSAgICB7Ci0JICAgICAgLyogU29tZSBkeW5hbWljIHN5bWJvbHMgd2VyZSBjaGFuZ2VkIHRvIGJlIGxvY2FsCi0JCSBzeW1ib2xzLiAgSW4gdGhpcyBjYXNlLCB3ZSByZW51bWJlciBhbGwgb2YgdGhlCi0JCSBkeW5hbWljIHN5bWJvbHMsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGhvbGUuICBJZgotCQkgdGhlIGJhY2tlbmQgY2hhbmdlZCBkeW5zeW1jb3VudCwgdGhlbiBhc3N1bWUgdGhhdCB0aGUKLQkJIG5ldyBzeW1ib2xzIGFyZSBhdCB0aGUgc3RhcnQuICBUaGlzIGlzIHRoZSBjYXNlIG9uCi0JCSB0aGUgTUlQUy4gIEZJWE1FOiBUaGUgbmFtZXMgb2YgdGhlIHJlbW92ZWQgc3ltYm9scwotCQkgd2lsbCBzdGlsbCBiZSBpbiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGUsIHdhc3RpbmcKLQkJIHNwYWNlLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0KLQkJMSArIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50IC0gb2xkX2R5bnN5bWNvdW50KTsKLQkgICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgICAgZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcywKLQkJCQkgICAgICAoUFRSKSBpbmZvKTsKLQkgICAgfQotCi0JICBjZGVmcyA9IDA7Ci0JICBzaXplID0gMDsKLQotCSAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIGJhc2UgdmVyc2lvbi4gICovCi0JICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgKytjZGVmczsKLQotCSAgZm9yICh0ID0gdmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbjsKLQotCSAgICAgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgICAgICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICAgICsrY2RlZnM7Ci0KLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICB9Ci0KLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBGaWxsIGluIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0KLQkgIHAgPSBzLT5jb250ZW50czsKLQotCSAgZGVmLnZkX3ZlcnNpb24gPSBWRVJfREVGX0NVUlJFTlQ7Ci0JICBkZWYudmRfZmxhZ3MgPSBWRVJfRkxHX0JBU0U7Ci0JICBkZWYudmRfbmR4ID0gMTsKLQkgIGRlZi52ZF9jbnQgPSAxOwotCSAgZGVmLnZkX2F1eCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBkZWYudmRfbmV4dCA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpCi0JCQkgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KSk7Ci0KLQkgIGlmIChzb25hbWVfaW5keCAhPSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIHsKLQkgICAgICBkZWYudmRfaGFzaCA9IGJmZF9lbGZfaGFzaCAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc29uYW1lKTsKLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBzb25hbWVfaW5keDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBuYW1lID0gb3V0cHV0X2JmZC0+ZmlsZW5hbWU7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKChjb25zdCB1bnNpZ25lZCBjaGFyICopIG5hbWUpOwotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IGluZHg7Ci0JICAgIH0KLQkgIGRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAob3V0cHV0X2JmZCwgJmRlZiwKLQkJCQkgICAgKEVsZl9FeHRlcm5hbF9WZXJkZWYgKilwKTsKLQkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJICAgICAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7Ci0JICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCi0JICBmb3IgKHQgPSB2ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGNkZXBzOwotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbjsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGNkZXBzID0gMDsKLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQkrK2NkZXBzOwotCi0JICAgICAgLyogQWRkIGEgc3ltYm9sIHJlcHJlc2VudGluZyB0aGlzIHZlcnNpb24uICAqLwotCSAgICAgIGggPSBOVUxMOwotCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgICAgIChpbmZvLCBkeW5vYmosIHQtPm5hbWUsIEJTRl9HTE9CQUwsIGJmZF9hYnNfc2VjdGlvbl9wdHIsCi0JCSAgICAgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkJICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaiktPmNvbGxlY3QsCi0JCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfiBFTEZfTElOS19OT05fRUxGOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCi0JICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBkZWYudmRfdmVyc2lvbiA9IFZFUl9ERUZfQ1VSUkVOVDsKLQkgICAgICBkZWYudmRfZmxhZ3MgPSAwOwotCSAgICAgIGlmICh0LT5nbG9iYWxzID09IE5VTEwgJiYgdC0+bG9jYWxzID09IE5VTEwgJiYgISB0LT51c2VkKQotCQlkZWYudmRfZmxhZ3MgfD0gVkVSX0ZMR19XRUFLOwotCSAgICAgIGRlZi52ZF9uZHggPSB0LT52ZXJudW0gKyAxOwotCSAgICAgIGRlZi52ZF9jbnQgPSBjZGVwcyArIDE7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHQtPm5hbWUpOwotCSAgICAgIGRlZi52ZF9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgICAgIGlmICh0LT5uZXh0ICE9IE5VTEwpCi0JCWRlZi52ZF9uZXh0ID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZikKLQkJCSAgICAgICArIChjZGVwcyArIDEpICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCkpOwotCSAgICAgIGVsc2UKLQkJZGVmLnZkX25leHQgPSAwOwotCi0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0IChvdXRwdXRfYmZkLCAmZGVmLAotCQkJCQkoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSBwKTsKLQkgICAgICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0KLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBoLT5keW5zdHJfaW5kZXg7Ci0JICAgICAgaWYgKHQtPmRlcHMgPT0gTlVMTCkKLQkJZGVmYXV4LnZkYV9uZXh0ID0gMDsKLQkgICAgICBlbHNlCi0JCWRlZmF1eC52ZGFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICAgIHQtPm5hbWVfaW5keCA9IGRlZmF1eC52ZGFfbmFtZTsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJCSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7Ci0JICAgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCSAgICAgIGZvciAobiA9IHQtPmRlcHM7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JCXsKLQkJICBpZiAobi0+dmVyc2lvbl9uZWVkZWQgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUKLQkJCSB2ZXJzaW9uIHNjcmlwdC4gICovCi0JCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZGVmYXV4LnZkYV9uYW1lID0gbi0+dmVyc2lvbl9uZWVkZWQtPm5hbWVfaW5keDsKLQkJICBpZiAobi0+bmV4dCA9PSBOVUxMKQotCQkgICAgZGVmYXV4LnZkYV9uZXh0ID0gMDsKLQkJICBlbHNlCi0JCSAgICBkZWZhdXgudmRhX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCQkgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCQkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUkRFRiwgMCkKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSREVGTlVNLCBjZGVmcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcmRlZnMgPSBjZGVmczsKLQl9Ci0KLSAgICAgIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSB2ZXJzaW9uIHJlZmVyZW5jZSBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb25fciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHsKLQlzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gc2luZm87Ci0KLQlzaW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLQlzaW5mby5pbmZvID0gaW5mbzsKLQlzaW5mby52ZXJzID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcmRlZnM7Ci0JaWYgKHNpbmZvLnZlcnMgPT0gMCkKLQkgIHNpbmZvLnZlcnMgPSAxOwotCXNpbmZvLmZhaWxlZCA9IGZhbHNlOwotCi0JZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCWVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMsCi0JCQkJKFBUUikgJnNpbmZvKTsKLQotCWlmIChlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkKLQkgIGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyAoaW5mbywgcyk7Ci0JZWxzZQotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQkgICAgdW5zaWduZWQgaW50IHNpemU7Ci0JICAgIHVuc2lnbmVkIGludCBjcmVmczsKLQkgICAgYmZkX2J5dGUgKnA7Ci0KLQkgICAgLyogQnVpbGQgdGhlIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KLQkgICAgc2l6ZSA9IDA7Ci0JICAgIGNyZWZzID0gMDsKLQkgICAgZm9yICh0ID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmOwotCQkgdCAhPSBOVUxMOwotCQkgdCA9IHQtPnZuX25leHRyZWYpCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCQkrK2NyZWZzOwotCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7Ci0JICAgICAgfQotCi0JICAgIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc2l6ZSk7Ci0JICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBwID0gcy0+Y29udGVudHM7Ci0JICAgIGZvciAodCA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZjsKLQkJIHQgIT0gTlVMTDsKLQkJIHQgPSB0LT52bl9uZXh0cmVmKQotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IGNhdXg7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCQliZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJY2F1eCA9IDA7Ci0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgKytjYXV4OwotCi0JCXQtPnZuX3ZlcnNpb24gPSBWRVJfTkVFRF9DVVJSRU5UOwotCQl0LT52bl9jbnQgPSBjYXV4OwotCQlpZiAoZWxmX2R0X25hbWUgKHQtPnZuX2JmZCkgIT0gTlVMTCkKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICBlbGZfZHRfbmFtZSAodC0+dm5fYmZkKSwKLQkJCQkJICAgICB0cnVlLCBmYWxzZSk7Ci0JCWVsc2UKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICB0LT52bl9iZmQtPmZpbGVuYW1lLCB0cnVlLCBmYWxzZSk7Ci0JCWlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXQtPnZuX2ZpbGUgPSBpbmR4OwotCQl0LT52bl9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKLQkJaWYgKHQtPnZuX25leHRyZWYgPT0gTlVMTCkKLQkJICB0LT52bl9uZXh0ID0gMDsKLQkJZWxzZQotCQkgIHQtPnZuX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCkKLQkJCQkrIGNhdXggKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KSk7Ci0KLQkJX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAob3V0cHV0X2JmZCwgdCwKLQkJCQkJICAgKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHApOwotCQlwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCi0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgewotCQkgICAgYS0+dm5hX2hhc2ggPSBiZmRfZWxmX2hhc2ggKChjb25zdCB1bnNpZ25lZCBjaGFyICopCi0JCQkJCQlhLT52bmFfbm9kZW5hbWUpOwotCQkgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAgICAgICBhLT52bmFfbm9kZW5hbWUsIHRydWUsIGZhbHNlKTsKLQkJICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgYS0+dm5hX25hbWUgPSBpbmR4OwotCQkgICAgaWYgKGEtPnZuYV9uZXh0cHRyID09IE5VTEwpCi0JCSAgICAgIGEtPnZuYV9uZXh0ID0gMDsKLQkJICAgIGVsc2UKLQkJICAgICAgYS0+dm5hX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KTsKLQotCQkgICAgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCAob3V0cHV0X2JmZCwgYSwKLQkJCQkJICAgICAgIChFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKSBwKTsKLQkJICAgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUk5FRUQsIDApCi0JCXx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJORUVETlVNLCBjcmVmcykpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJyZWZzID0gY3JlZnM7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIGR5bnN5bWNvdW50ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQotICAgICAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAoZHluc3ltY291bnQgPT0gMAotCSAgfHwgKHZlcmRlZnMgPT0gTlVMTCAmJiBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkpCi0JewotCSAgZWxmX2xpbmtfcmVtb3ZlX3NlY3Rpb25fYW5kX2FkanVzdF9keW5pbmRpY2VzIChpbmZvLCBzKTsKLQkgIC8qIFRoZSBEWU5TWU1DT1VOVCBtaWdodCBoYXZlIGNoYW5nZWQgaWYgd2Ugd2VyZSBnb2luZyB0bwotCSAgICAgb3V0cHV0IGEgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cnkgZm9yIFMuICAqLwotCSAgZHluc3ltY291bnQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSk7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJTWU0sIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBpbiBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMuCi0JIFdlIHdpbGwgYnVpbGQgdGhlIGNvbnRlbnRzIG9mIC5keW5zeW0gYW5kIC5oYXNoIHdoZW4gd2UgYnVpbGQKLQkgdGhlIGZpbmFsIHN5bWJvbCB0YWJsZSwgYmVjYXVzZSB1bnRpbCB0aGVuIHdlIGRvIG5vdCBrbm93IHRoZQotCSBjb3JyZWN0IHZhbHVlIHRvIGdpdmUgdGhlIHN5bWJvbHMuICBXZSBidWlsdCB0aGUgLmR5bnN0cgotCSBzZWN0aW9uIGFzIHdlIHdlbnQgYWxvbmcgaW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIC5keW5zeW0gaXMgYSBkdW1teSBzeW1ib2wuICAqLwotICAgICAgaXN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLnN0X3NpemUgPSAwOwotICAgICAgaXN5bS5zdF9uYW1lID0gMDsKLSAgICAgIGlzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBpc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGlzeW0uc3Rfc2huZHggPSAwOwotICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJmlzeW0sCi0JCQkgICAoUFRSKSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzLT5jb250ZW50cyk7Ci0KLSAgICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGhhc2hpbmcgdGFibGUuICBBcyBhIHNpZGUgZWZmZWN0IHRoaXMKLQkgY29tcHV0ZXMgdGhlIGhhc2ggdmFsdWVzIGZvciBhbGwgdGhlIG5hbWVzIHdlIGV4cG9ydC4gICovCi0gICAgICBidWNrZXRjb3VudCA9IGNvbXB1dGVfYnVja2V0X2NvdW50IChpbmZvKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9ICgyICsgYnVja2V0Y291bnQgKyBkeW5zeW1jb3VudCkgKiAoQVJDSF9TSVpFIC8gOCk7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotCi0gICAgICBwdXRfd29yZCAob3V0cHV0X2JmZCwgYnVja2V0Y291bnQsIHMtPmNvbnRlbnRzKTsKLSAgICAgIHB1dF93b3JkIChvdXRwdXRfYmZkLCBkeW5zeW1jb3VudCwgcy0+Y29udGVudHMgKyAoQVJDSF9TSVpFIC8gOCkpOwotCi0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKLQotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9OVUxMLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRml4IHVwIHRoZSBmbGFncyBmb3IgYSBzeW1ib2wuICBUaGlzIGhhbmRsZXMgdmFyaW91cyBjYXNlcyB3aGljaAotICAgY2FuIG9ubHkgYmUgZml4ZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBhcmUgc2Vlbi4gIFRoaXMgaXMKLSAgIGN1cnJlbnRseSBjYWxsZWQgYnkgYm90aCBhZGp1c3RfZHluYW1pY19zeW1ib2wgYW5kCi0gICBhc3NpZ25fc3ltX3ZlcnNpb24sIHdoaWNoIGlzIHVubmVjZXNzYXJ5IGJ1dCBwZXJoYXBzIG1vcmUgcm9idXN0IGluCi0gICB0aGUgZmFjZSBvZiBmdXR1cmUgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgZWlmKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmOwotewotICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgbWVudGlvbmVkIGluIGEgbm9uLUVMRiBmaWxlLCB0cnkgdG8gc2V0Ci0gICAgIERFRl9SRUdVTEFSIGFuZCBSRUZfUkVHVUxBUiBjb3JyZWN0bHkuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0bwotICAgICBwZXJtaXQgYSBub24tRUxGIGZpbGUgdG8gY29ycmVjdGx5IHJlZmVyIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYW4gRUxGIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0VMRikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTsKLQkgIGVsc2UKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCX0KLQotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEKLQkgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChlaWYtPmluZm8sIGgpKQotCSAgICB7Ci0JICAgICAgZWlmLT5mYWlsZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBVbmZvcnR1bmF0ZWx5LCBFTEZfTElOS19OT05fRUxGIGlzIG9ubHkgY29ycmVjdCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhIG5vbi1FTEYgZmlsZS4gIEZvcnR1bmF0ZWx5LCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhbiBFTEYgZmlsZSwgd2UncmUgcHJvYmFibHkgT0sgdW5sZXNzIHRoZQotICAgICAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgbm9uLUVMRiBmaWxlLiAgQ2F0Y2ggdGhhdCBjYXNlIGhlcmUuCi0gICAgICAgICBGSVhNRTogV2UncmUgc3RpbGwgaW4gdHJvdWJsZSBpZiB0aGUgc3ltYm9sIHdhcyBmaXJzdCBzZWVuIGluCi0gICAgICAgICBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhlbiBsYXRlciBpbiBhIG5vbi1FTEYgcmVndWxhciBvYmplY3QuICAqLwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgICAgID8gKGJmZF9nZXRfZmxhdm91ciAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcikKLQkJICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgICAgOiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JCSAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMCkpKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgotICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgotICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0gICAgIGZsYWcgd2lsbCBub3QgaGF2ZSBiZWVuIHNldC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQotICAvKiBJZiAtQnN5bWJvbGljIHdhcyB1c2VkICh3aGljaCBtZWFucyB0byBiaW5kIHJlZmVyZW5jZXMgdG8gZ2xvYmFsCi0gICAgIHN5bWJvbHMgdG8gdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgb2JqZWN0KSwgYW5kIHRoaXMKLSAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QsIHRoZW4gaXQgYWN0dWFsbHkgZG9lc24ndAotICAgICBuZWVkIGEgUExUIGVudHJ5LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgICYmIGVpZi0+aW5mby0+c2hhcmVkCi0gICAgICAmJiBlaWYtPmluZm8tPnN5bWJvbGljCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0gICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSB0aGUgYmFja2VuZCBwaWNrIGEgZ29vZCB2YWx1ZSBmb3IgYSBkeW5hbWljIHN5bWJvbC4gIFRoaXMgaXMKLSAgIGNhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSwgYW5kIGFsc28gY2FsbHMgaXRzZWxmCi0gICByZWN1cnNpdmVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZiA9IChzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICopIGRhdGE7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIC8qIElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhlc2UgYXJlIGFkZGVkIGJ5IHRoZSB2ZXJzaW9uaW5nIGNvZGUuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRml4IHRoZSBzeW1ib2wgZmxhZ3MuICAqLwotICBpZiAoISBlbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgZWlmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIFBMVCBlbnRyeSwgYW5kIGl0IGlzIG5vdAotICAgICBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIG9yIGlzIG5vdCByZWZlcmVuY2VkIGJ5IGEgcmVndWxhcgotICAgICBvYmplY3QsIGlnbm9yZSBpdC4gIFdlIGRvIGhhdmUgdG8gaGFuZGxlIGEgd2VhayBkZWZpbmVkIHN5bWJvbCwKLSAgICAgZXZlbiBpZiBubyByZWd1bGFyIG9iamVjdCByZWZlcnMgdG8gaXQsIGlmIHdlIGRlY2lkZWQgdG8gYWRkIGl0Ci0gICAgIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEZJWE1FOiBEbyB3ZSBub3JtYWxseSBuZWVkIHRvIHdvcnJ5Ci0gICAgIGFib3V0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgYnkgb25lIGR5bmFtaWMgb2JqZWN0IGFuZAotICAgICByZWZlcmVuY2VkIGJ5IGFub3RoZXIgb25lPyAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpID09IDAKLSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDAKLQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMAotCSAgICAgICYmIChoLT53ZWFrZGVmID09IE5VTEwgfHwgaC0+d2Vha2RlZi0+ZHluaW5keCA9PSAtMSkpKSkKLSAgICB7Ci0gICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgYWRqdXN0ZWQgdGhpcyBzeW1ib2wsIGRvbid0IGRvIGl0IGFnYWluLiAgVGhpcwotICAgICBjYW4gaGFwcGVuIHZpYSBhIHJlY3Vyc2l2ZSBjYWxsLiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIERvbid0IGxvb2sgYXQgdGhpcyBzeW1ib2wgYWdhaW4uICBOb3RlIHRoYXQgd2UgbXVzdCBzZXQgdGhpcwotICAgICBhZnRlciBjaGVja2luZyB0aGUgYWJvdmUgY29uZGl0aW9ucywgYmVjYXVzZSB3ZSBtYXkgbG9vayBhdCBhCi0gICAgIHN5bWJvbCBvbmNlLCBkZWNpZGUgbm90IHRvIGRvIGFueXRoaW5nLCBhbmQgdGhlbiBnZXQgY2FsbGVkCi0gICAgIHJlY3Vyc2l2ZWx5IGxhdGVyIGFmdGVyIFJFRl9SRUdVTEFSIGlzIHNldCBiZWxvdy4gICovCi0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEOwotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIGRlZmluaXRpb24sIGFuZCB3ZSBrbm93IGEgcmVhbCBkZWZpbml0aW9uLCBhbmQKLSAgICAgdGhlIHJlYWwgc3ltYm9sIGlzIG5vdCBpdHNlbGYgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsCi0gICAgIHRoZW4gZ2V0IGEgZ29vZCB2YWx1ZSBmb3IgdGhlIHJlYWwgZGVmaW5pdGlvbi4gIFdlIGhhbmRsZSB0aGUKLSAgICAgcmVhbCBzeW1ib2wgZmlyc3QsIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGJhY2tlbmQgcm91dGluZS4KLQotICAgICBOb3RlIHRoYXQgdGhlcmUgaXMgYSBjb25mdXNpbmcgY2FzZSBoZXJlLiAgSWYgdGhlIHJlYWwgZGVmaW5pdGlvbgotICAgICBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwgd2UgZG9uJ3QgZ2V0IHRoZSByZWFsIHN5bWJvbAotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCwgYnV0IHdlIGRvIGdldCB0aGUgd2VhayBzeW1ib2wuICBJZiB0aGUKLSAgICAgcHJvY2Vzc29yIGJhY2tlbmQgdXNlcyBhIENPUFkgcmVsb2MsIHRoZW4gaWYgc29tZSByb3V0aW5lIGluIHRoZQotICAgICBkeW5hbWljIG9iamVjdCBjaGFuZ2VzIHRoZSByZWFsIHN5bWJvbCwgd2Ugd2lsbCBub3Qgc2VlIHRoYXQKLSAgICAgY2hhbmdlIGluIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgc3ltYm9sLiAgVGhpcyBpcyB0aGUgd2F5IG90aGVyCi0gICAgIEVMRiBsaW5rZXJzIHdvcmsgYXMgd2VsbCwgYW5kIHNlZW1zIHRvIGJlIGEgcmVzdWx0IG9mIHRoZSBzaGFyZWQKLSAgICAgbGlicmFyeSBtb2RlbC4KLQotICAgICBJIHdpbGwgY2xhcmlmeSB0aGlzIGlzc3VlLiAgTW9zdCBTVlI0IHNoYXJlZCBsaWJyYXJpZXMgZGVmaW5lIHRoZQotICAgICB2YXJpYWJsZSBfdGltZXpvbmUgYW5kIGRlZmluZSB0aW1lem9uZSBhcyBhIHdlYWsgc3lub255bS4gIFRoZQotICAgICB0enNldCBjYWxsIGNoYW5nZXMgX3RpbWV6b25lLiAgSWYgeW91IHdyaXRlCi0gICAgICAgZXh0ZXJuIGludCB0aW1lem9uZTsKLSAgICAgICBpbnQgX3RpbWV6b25lID0gNTsKLSAgICAgICBpbnQgbWFpbiAoKSB7IHR6c2V0ICgpOyBwcmludGYgKCIlZCAlZFxuIiwgdGltZXpvbmUsIF90aW1lem9uZSk7IH0KLSAgICAgeW91IG1pZ2h0IGV4cGVjdCB0aGF0LCBzaW5jZSB0aW1lem9uZSBpcyBhIHN5bm9ueW0gZm9yIF90aW1lem9uZSwKLSAgICAgdGhlIHNhbWUgbnVtYmVyIHdpbGwgcHJpbnQgYm90aCB0aW1lcy4gIEhvd2V2ZXIsIGlmIHRoZSBwcm9jZXNzb3IKLSAgICAgYmFja2VuZCB1c2VzIGEgQ09QWSByZWxvYywgdGhlbiBhY3R1YWxseSB0aW1lem9uZSB3aWxsIGJlIGNvcGllZAotICAgICBpbnRvIHlvdXIgcHJvY2VzcyBpbWFnZSwgYW5kLCBzaW5jZSB5b3UgZGVmaW5lIF90aW1lem9uZQotICAgICB5b3Vyc2VsZiwgX3RpbWV6b25lIHdpbGwgbm90LiAgVGh1cyB0aW1lem9uZSBhbmQgX3RpbWV6b25lIHdpbGwKLSAgICAgd2luZCB1cCBhdCBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9ucy4gIFRoZSB0enNldCBjYWxsIHdpbGwgc2V0Ci0gICAgIF90aW1lem9uZSwgbGVhdmluZyB0aW1lem9uZSB1bmNoYW5nZWQuICAqLwotCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIHdlYWtkZWYgPSBoLT53ZWFrZGVmOwotICAgICAgQkZEX0FTU0VSVCAod2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IHdlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgQkZEX0FTU0VSVCAod2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpOwotICAgICAgaWYgKCh3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwgc28gd2UKLQkgICAgIHdpbGwgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwuICBDbGVhciB3ZWFrZGVmIGZvciB0aGUKLQkgICAgIGNvbnZlbmllbmNlIG9mIHRoZSBwcm9jZXNzb3IgYmFja2VuZC4gICovCi0JICBoLT53ZWFrZGVmID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlcmUgaXMgYW4gaW1wbGljaXQgcmVmZXJlbmNlIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZQotCSAgICAgdmlhIHRoZSB3ZWFrIHN5bWJvbC4gICovCi0JICB3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0JICBpZiAoaC0+d2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCSAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKQotCSAgICB3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSzsKLQkgIGlmICghIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKHdlYWtkZWYsIChQVFIpIGVpZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIGEgc3ltYm9sIGhhcyBubyB0eXBlIGFuZCBubyBzaXplIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgUExUCi0gICAgIGVudHJ5LCB0aGVuIHdlIGFyZSBwcm9iYWJseSBhYm91dCB0byBkbyB0aGUgd3JvbmcgdGhpbmcgaGVyZTogd2UKLSAgICAgYXJlIHByb2JhYmx5IGdvaW5nIHRvIGNyZWF0ZSBhIENPUFkgcmVsb2MgZm9yIGFuIGVtcHR5IG9iamVjdC4KLSAgICAgVGhpcyBjYXNlIGNhbiBhcmlzZSB3aGVuIGEgc2hhcmVkIG9iamVjdCBpcyBidWlsdCB3aXRoIGFzc2VtYmx5Ci0gICAgIGNvZGUsIGFuZCB0aGUgYXNzZW1ibHkgY29kZSBmYWlscyB0byBzZXQgdGhlIHN5bWJvbCB0eXBlLiAgKi8KLSAgaWYgKGgtPnNpemUgPT0gMAotICAgICAgJiYgaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSA9PSAwKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgKF8oIndhcm5pbmc6IHR5cGUgYW5kIHNpemUgb2YgZHluYW1pYyBzeW1ib2wgYCVzJyBhcmUgbm90IGRlZmluZWQiKSwKLQkgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGVpZi0+aW5mbyktPmR5bm9iajsKLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaik7Ci0gIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpIChlaWYtPmluZm8sIGgpKQotICAgIHsKLSAgICAgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBleHBvcnQgYWxsIGRlZmluZWQgc3ltYm9scyBpbnRvIHRoZSBkeW5hbWljCi0gICBzeW1ib2wgdGFibGUuICBJdCBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2V4cG9ydF9zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmID0gKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikgZGF0YTsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5keW5pbmR4ID09IC0xCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCSAgJiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChlaWYtPmluZm8sIGgpKQotCXsKLQkgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGluIG90aGVyIHNoYXJlZAotICAgbGlicmFyaWVzIGFuZCByZWZlcmVuY2VkIGhlcmUuICBVcGRhdGUgdGhlIGxpc3Qgb2YgdmVyc2lvbgotICAgZGVwZW5kZW5jaWVzLiAgVGhpcyB3aWxsIGJlIHB1dCBpbnRvIHRoZSAuZ251LnZlcnNpb25fciBzZWN0aW9uLgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gKnJpbmZvID0gKHN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbyAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLSAgLyogV2Ugb25seSBjYXJlIGFib3V0IHN5bWJvbHMgZGVmaW5lZCBpbiBzaGFyZWQgb2JqZWN0cyB3aXRoIHZlcnNpb24KLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDAKLSAgICAgIHx8IGgtPmR5bmluZHggPT0gLTEKLSAgICAgIHx8IGgtPnZlcmluZm8udmVyZGVmID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlIGlmIHdlIGFscmVhZHkga25vdyBhYm91dCB0aGlzIHZlcnNpb24uICAqLwotICBmb3IgKHQgPSBlbGZfdGRhdGEgKHJpbmZvLT5vdXRwdXRfYmZkKS0+dmVycmVmOyB0ICE9IE5VTEw7IHQgPSB0LT52bl9uZXh0cmVmKQotICAgIHsKLSAgICAgIGlmICh0LT52bl9iZmQgIT0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2JmZCkKLQljb250aW51ZTsKLQotICAgICAgZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQlpZiAoYS0+dm5hX25vZGVuYW1lID09IGgtPnZlcmluZm8udmVyZGVmLT52ZF9ub2RlbmFtZSkKLQkgIHJldHVybiB0cnVlOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIG5ldyB2ZXJzaW9uLiAgQWRkIGl0IHRvIHRyZWUgd2UgYXJlIGJ1aWxkaW5nLiAgKi8KLQotICBpZiAodCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHQgPSAoRWxmX0ludGVybmFsX1Zlcm5lZWQgKikgYmZkX3phbGxvYyAocmluZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqdCk7Ci0gICAgICBpZiAodCA9PSBOVUxMKQotCXsKLQkgIHJpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgdC0+dm5fYmZkID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2JmZDsKLSAgICAgIHQtPnZuX25leHRyZWYgPSBlbGZfdGRhdGEgKHJpbmZvLT5vdXRwdXRfYmZkKS0+dmVycmVmOwotICAgICAgZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZiA9IHQ7Ci0gICAgfQotCi0gIGEgPSAoRWxmX0ludGVybmFsX1Zlcm5hdXggKikgYmZkX3phbGxvYyAocmluZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqYSk7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIGFyZSBjb3B5aW5nIGEgc3RyaW5nIHBvaW50ZXIgaGVyZSwgYW5kIHRlc3RpbmcgaXQKLSAgICAgYWJvdmUuICBJZiBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIGlzIGV2ZXIgY2hhbmdlZCB0bwotICAgICBkaXNjYXJkIHRoZSBzdHJpbmcgZGF0YSB3aGVuIGxvdyBpbiBtZW1vcnksIHRoaXMgd2lsbCBoYXZlIHRvIGJlCi0gICAgIGZpeGVkLiAgKi8KLSAgYS0+dm5hX25vZGVuYW1lID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX25vZGVuYW1lOwotCi0gIGEtPnZuYV9mbGFncyA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9mbGFnczsKLSAgYS0+dm5hX25leHRwdHIgPSB0LT52bl9hdXhwdHI7Ci0KLSAgaC0+dmVyaW5mby52ZXJkZWYtPnZkX2V4cF9yZWZubyA9IHJpbmZvLT52ZXJzOwotICArK3JpbmZvLT52ZXJzOwotCi0gIGEtPnZuYV9vdGhlciA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9leHBfcmVmbm8gKyAxOwotCi0gIHQtPnZuX2F1eHB0ciA9IGE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpZ3VyZSBvdXQgYXBwcm9wcmlhdGUgdmVyc2lvbnMgZm9yIGFsbCB0aGUgc3ltYm9scy4gIFdlIG1heSBub3QKLSAgIGhhdmUgdGhlIHZlcnNpb24gbnVtYmVyIHNjcmlwdCB1bnRpbCB3ZSBoYXZlIHJlYWQgYWxsIG9mIHRoZSBpbnB1dAotICAgZmlsZXMsIHNvIHVudGlsIHRoYXQgcG9pbnQgd2UgZG9uJ3Qga25vdyB3aGljaCBzeW1ib2xzIHNob3VsZCBiZQotICAgbG9jYWwuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyAqc2luZm8gPQotICAgIChzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gc2luZm8tPmluZm87Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotICBjaGFyICpwOwotCi0gIC8qIEZpeCB0aGUgc3ltYm9sIGZsYWdzLiAgKi8KLSAgZWlmLmZhaWxlZCA9IGZhbHNlOwotICBlaWYuaW5mbyA9IGluZm87Ci0gIGlmICghIGVsZl9maXhfc3ltYm9sX2ZsYWdzIChoLCAmZWlmKSkKLSAgICB7Ci0gICAgICBpZiAoZWlmLmZhaWxlZCkKLQlzaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2Ugb25seSBuZWVkIHZlcnNpb24gbnVtYmVycyBmb3Igc3ltYm9scyBkZWZpbmVkIGluIHJlZ3VsYXIKLSAgICAgb2JqZWN0cy4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcCA9IHN0cmNociAoaC0+cm9vdC5yb290LnN0cmluZywgRUxGX1ZFUl9DSFIpOwotICBpZiAocCAhPSBOVUxMICYmIGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLSAgICAgIGJvb2xlYW4gaGlkZGVuOwotCi0gICAgICBoaWRkZW4gPSB0cnVlOwotCi0gICAgICAvKiBUaGVyZSBhcmUgdHdvIGNvbnNlY3V0aXZlIEVMRl9WRVJfQ0hSIGNoYXJhY3RlcnMgaWYgdGhpcyBpcwotICAgICAgICAgbm90IGEgaGlkZGVuIHN5bWJvbC4gICovCi0gICAgICArK3A7Ci0gICAgICBpZiAoKnAgPT0gRUxGX1ZFUl9DSFIpCi0JewotCSAgaGlkZGVuID0gZmFsc2U7Ci0JICArK3A7Ci0JfQotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBubyB2ZXJzaW9uIHN0cmluZywgd2UgY2FuIGp1c3QgcmV0dXJuIG91dC4gICovCi0gICAgICBpZiAoKnAgPT0gJ1wwJykKLQl7Ci0JICBpZiAoaGlkZGVuKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hJRERFTjsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhlIHZlcnNpb24uICBJZiB3ZSBmaW5kIGl0LCBpdCBpcyBubyBsb25nZXIgd2Vhay4gICovCi0gICAgICBmb3IgKHQgPSBzaW5mby0+dmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQl7Ci0JICBpZiAoc3RyY21wICh0LT5uYW1lLCBwKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW50IGxlbjsKLQkgICAgICBjaGFyICphbGM7Ci0JICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpkOwotCi0JICAgICAgbGVuID0gcCAtIGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgYWxjID0gYmZkX2FsbG9jIChzaW5mby0+b3V0cHV0X2JmZCwgbGVuKTsKLQkgICAgICBpZiAoYWxjID09IE5VTEwpCi0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgc3RybmNweSAoYWxjLCBoLT5yb290LnJvb3Quc3RyaW5nLCBsZW4gLSAxKTsKLQkgICAgICBhbGNbbGVuIC0gMV0gPSAnXDAnOwotCSAgICAgIGlmIChhbGNbbGVuIC0gMl0gPT0gRUxGX1ZFUl9DSFIpCi0JICAgICAgICBhbGNbbGVuIC0gMl0gPSAnXDAnOwotCi0JICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQkgICAgICB0LT51c2VkID0gdHJ1ZTsKLQkgICAgICBkID0gTlVMTDsKLQotCSAgICAgIGlmICh0LT5nbG9iYWxzICE9IE5VTEwpCi0JCXsKLQkJICBmb3IgKGQgPSB0LT5nbG9iYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQkgICAgaWYgKCgqZC0+bWF0Y2gpIChkLCBhbGMpKQotCQkgICAgICBicmVhazsKLQkJfQotCi0JICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGZvcmNlIHRoaXMgc3ltYm9sIHRvCi0gICAgICAgICAgICAgICAgIGxvY2FsIHNjb3BlLiAgKi8KLQkgICAgICBpZiAoZCA9PSBOVUxMICYmIHQtPmxvY2FscyAhPSBOVUxMKQotCQl7Ci0JCSAgZm9yIChkID0gdC0+bG9jYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoKCpkLT5tYXRjaCkgKGQsIGFsYykpCi0JCQl7Ci0JCQkgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JCQkgICAgICAmJiBpbmZvLT5zaGFyZWQKLQkJCSAgICAgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQotCQkJICAgIHsKLQkJCSAgICAgIHNpbmZvLT5yZW1vdmVkX2R5bmFtaWMgPSB0cnVlOwotCQkJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JCQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fgotCQkJCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCQkJICAgICAgaC0+ZHluaW5keCA9IC0xOwotCQkJICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCSAgICAgIC8qIEZJWE1FOiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGhhcwotCQkJCSBhbHJlYWR5IGJlZW4gcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMKLQkJCQkgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLwotCQkJICAgIH0KLQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX3JlbGVhc2UgKHNpbmZvLT5vdXRwdXRfYmZkLCBhbGMpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gYXBwbGljYXRpb24sIHdlIG5lZWQgdG8gY3JlYXRlIGEKLSAgICAgICAgIHZlcnNpb24gbm9kZSBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgICAgIGlmICh0ID09IE5VTEwgJiYgISBpbmZvLT5zaGFyZWQpCi0JewotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICoqcHA7Ci0JICBpbnQgdmVyc2lvbl9pbmRleDsKLQotCSAgLyogSWYgd2UgYXJlbid0IGdvaW5nIHRvIGV4cG9ydCB0aGlzIHN5bWJvbCwgd2UgZG9uJ3QgbmVlZAotICAgICAgICAgICAgIHRvIHdvcnJ5IGFib3V0IGl0LiAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHJldHVybiB0cnVlOwotCi0JICB0ID0gKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikKLQkgICAgICAgYmZkX2FsbG9jIChzaW5mby0+b3V0cHV0X2JmZCwgc2l6ZW9mICp0KSk7Ci0JICBpZiAodCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHQtPm5leHQgPSBOVUxMOwotCSAgdC0+bmFtZSA9IHA7Ci0JICB0LT5nbG9iYWxzID0gTlVMTDsKLQkgIHQtPmxvY2FscyA9IE5VTEw7Ci0JICB0LT5kZXBzID0gTlVMTDsKLQkgIHQtPm5hbWVfaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOwotCSAgdC0+dXNlZCA9IHRydWU7Ci0KLQkgIHZlcnNpb25faW5kZXggPSAxOwotCSAgZm9yIChwcCA9ICZzaW5mby0+dmVyZGVmczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCSAgICArK3ZlcnNpb25faW5kZXg7Ci0JICB0LT52ZXJudW0gPSB2ZXJzaW9uX2luZGV4OwotCi0JICAqcHAgPSB0OwotCi0JICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCX0KLSAgICAgIGVsc2UgaWYgKHQgPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBjb3VsZCBub3QgZmluZCB0aGUgdmVyc2lvbiBmb3IgYSBzeW1ib2wgd2hlbgotICAgICAgICAgICAgIGdlbmVyYXRpbmcgYSBzaGFyZWQgYXJjaGl2ZS4gIFJldHVybiBhbiBlcnJvci4gICovCi0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bmRlZmluZWQgdmVyc2lvbmVkIHN5bWJvbCBuYW1lICVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzaW5mby0+b3V0cHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBzaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChoaWRkZW4pCi0JaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19ISURERU47Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IGhhdmUgYSB2ZXJzaW9uIGZvciB0aGlzIHN5bWJvbCwgc2VlIGlmIHdlIGNhbiBmaW5kCi0gICAgIHNvbWV0aGluZy4gICovCi0gIGlmIChoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCAmJiBzaW5mby0+dmVyZGVmcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqZGVmbHQ7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmQ7Ci0KLSAgICAgIC8qIFNlZSBpZiBjYW4gZmluZCB3aGF0IHZlcnNpb24gdGhpcyBzeW1ib2wgaXMgaW4uICBJZiB0aGUKLSAgICAgICAgIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSBsb2NhbCwgdGhlbiBkb24ndCBhY3R1YWxseSByZWdpc3RlcgotICAgICAgICAgaXQuICAqLwotICAgICAgZGVmbHQgPSBOVUxMOwotICAgICAgZm9yICh0ID0gc2luZm8tPnZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgaWYgKHQtPmdsb2JhbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoZCA9IHQtPmdsb2JhbHM7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0JCXsKLQkJICBpZiAoKCpkLT5tYXRjaCkgKGQsIGgtPnJvb3Qucm9vdC5zdHJpbmcpKQotCQkgICAgewotCQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGQgIT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHQtPmxvY2FscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChkID0gdC0+bG9jYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQl7Ci0JCSAgaWYgKGQtPnBhdHRlcm5bMF0gPT0gJyonICYmIGQtPnBhdHRlcm5bMV0gPT0gJ1wwJykKLQkJICAgIGRlZmx0ID0gdDsKLQkJICBlbHNlIGlmICgoKmQtPm1hdGNoKSAoZCwgaC0+cm9vdC5yb290LnN0cmluZykpCi0JCSAgICB7Ci0JCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JCSAgICAgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JCQkgICYmIGluZm8tPnNoYXJlZAotCQkJICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKLQkJCXsKLQkJCSAgc2luZm8tPnJlbW92ZWRfZHluYW1pYyA9IHRydWU7Ci0JCQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOwotCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkJCSAgaC0+ZHluaW5keCA9IC0xOwotCQkJICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJICAvKiBGSVhNRTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBoYXMgYWxyZWFkeQotCQkJICAgICBiZWVuIHJlY29yZGVkIGluIHRoZSBkeW5hbWljIHN0cmluZyB0YWJsZQotCQkJICAgICBzZWN0aW9uLiAgKi8KLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChkICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZGVmbHQgIT0gTlVMTCAmJiBoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKLQl7Ci0JICBoLT52ZXJpbmZvLnZlcnRyZWUgPSBkZWZsdDsKLQkgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JICAgICAgJiYgaW5mby0+c2hhcmVkCi0JICAgICAgJiYgISBzaW5mby0+ZXhwb3J0X2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBzaW5mby0+cmVtb3ZlZF9keW5hbWljID0gdHJ1ZTsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTDsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgICBoLT5keW5pbmR4ID0gLTE7Ci0JICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkgICAgICAvKiBGSVhNRTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuCi0JCSByZWNvcmRlZCBpbiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGUgc2VjdGlvbi4gICovCi0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVudW1iZXIgdGhlIGR5bmFtaWMgc3ltYm9scywgaWYgc29tZSBvZgotICAgdGhlbSBhcmUgcmVtb3ZlZCBiZWNhdXNlIHRoZXkgYXJlIG1hcmtlZCBhcyBsb2NhbC4gIFRoaXMgaXMgY2FsbGVkCi0gICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgewotICAgICAgaC0+ZHluaW5keCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gICAgICArK2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRmluYWwgcGhhc2Ugb2YgRUxGIGxpbmtlci4gICovCi0KLS8qIEEgc3RydWN0dXJlIHdlIHVzZSB0byBhdm9pZCBwYXNzaW5nIGxhcmdlIG51bWJlcnMgb2YgYXJndW1lbnRzLiAgKi8KLQotc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzeW1zdHJ0YWI7Ci0gIC8qIC5keW5zeW0gc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpkeW5zeW1fc2VjOwotICAvKiAuaGFzaCBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKmhhc2hfc2VjOwotICAvKiBzeW1ib2wgdmVyc2lvbiBzZWN0aW9uICguZ251LnZlcnNpb24pLiAgKi8KLSAgYXNlY3Rpb24gKnN5bXZlcl9zZWM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBjb250ZW50cyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBpbnRlcm5hbCByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgbG9jYWwgc3ltYm9scyBvZiBhbnkgaW5wdXQKLSAgICAgQkZELiAgKi8KLSAgRWxmX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGludGVybmFsIGxvY2FsIHN5bWJvbHMgb2YgYW55IGlucHV0Ci0gICAgIEJGRC4gICovCi0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXM7Ci0gIC8qIEFycmF5IGxhcmdlIGVub3VnaCB0byBob2xkIGEgc3ltYm9sIGluZGV4IGZvciBlYWNoIGxvY2FsIHN5bWJvbAotICAgICBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgbG9uZyAqaW5kaWNlczsKLSAgLyogQXJyYXkgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBzZWN0aW9uIHBvaW50ZXIgZm9yIGVhY2ggbG9jYWwKLSAgICAgc3ltYm9sIG9mIGFueSBpbnB1dCBCRkQuICAqLwotICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotICAvKiBCdWZmZXIgdG8gaG9sZCBzd2FwcGVkIG91dCBzeW1ib2xzLiAgKi8KLSAgRWxmX0V4dGVybmFsX1N5bSAqc3ltYnVmOwotICAvKiBOdW1iZXIgb2Ygc3dhcHBlZCBvdXQgc3ltYm9scyBpbiBidWZmZXIuICAqLwotICBzaXplX3Qgc3ltYnVmX2NvdW50OwotICAvKiBOdW1iZXIgb2Ygc3ltYm9scyB3aGljaCBmaXQgaW4gc3ltYnVmLiAgKi8KLSAgc2l6ZV90IHN5bWJ1Zl9zaXplOwotfTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfb3V0cHV0X3N5bQotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19vdXRwdXRfZXh0c3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gZWxmX2xpbmtfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBlbGZfb3V0ZXh0X2luZm8KLXsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIGJvb2xlYW4gbG9jYWxzeW1zOwotICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci19OwotCi0vKiBDb21wdXRlIHRoZSBzaXplIG9mLCBhbmQgYWxsb2NhdGUgc3BhY2UgZm9yLCBSRUxfSERSIHdoaWNoIGlzIHRoZQotICAgc2VjdGlvbiBoZWFkZXIgZm9yIGEgc2VjdGlvbiBjb250YWluaW5nIHJlbG9jYXRpb25zIGZvciBPLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbiAoYWJmZCwgcmVsX2hkciwgbykKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgYXNlY3Rpb24gKm87Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcCwgKipwZW5kOwotCi0gIC8qIFdlIGFyZSBvdmVyZXN0aW1hdGluZyB0aGUgc2l6ZSByZXF1aXJlZCBmb3IgdGhlIHJlbG9jYXRpb24KLSAgICAgc2VjdGlvbnMsIGluIHRoZSBjYXNlIHRoYXQgd2UgYXJlIHVzaW5nIGJvdGggUkVMIGFuZCBSRUxBCi0gICAgIHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSBzZWN0aW9uLiAgSW4gdGhhdCBjYXNlLCBSRUxPQ19DT1VOVCB3aWxsCi0gICAgIGJlIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVsb2NhdGlvbnMgcmVxdWlyZWQsIGFuZCB3ZSBhbGxvY2F0ZQotICAgICBzcGFjZSBmb3IgdGhhdCBtYW55IFJFTCByZWxvY2F0aW9ucyBhcyB3ZWxsIGFzIHRoYXQgbWFueSBSRUxBCi0gICAgIHJlbG9jYXRpb25zLiAgVGhpcyBhcHByb3hpbWF0aW9uIGlzIHdhc3RlZnVsIG9mIGRpc2sgc3BhY2UuCi0gICAgIEhvd2V2ZXIsIHVudGlsIHdlIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgZWFjaCBraW5kIG9mCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQsIGl0J3MgZGlmZmljdWx0IHRvIGNhbGN1bGF0ZSB0aGUgcmlnaHQKLSAgICAgdmFsdWUuICAqLwotICByZWxfaGRyLT5zaF9zaXplID0gcmVsX2hkci0+c2hfZW50c2l6ZSAqIG8tPnJlbG9jX2NvdW50OwotCi0gIC8qIFRoZSBjb250ZW50cyBmaWVsZCBtdXN0IGxhc3QgaW50byB3cml0ZV9vYmplY3RfY29udGVudHMsIHNvIHdlCi0gICAgIGFsbG9jYXRlIGl0IHdpdGggYmZkX2FsbG9jIHJhdGhlciB0aGFuIG1hbGxvYy4gICovCi0gIHJlbF9oZHItPmNvbnRlbnRzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxfaGRyLT5zaF9zaXplKTsKLSAgaWYgKHJlbF9oZHItPmNvbnRlbnRzID09IE5VTEwgJiYgcmVsX2hkci0+c2hfc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikKLSAgICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAqIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLSAgaWYgKHAgPT0gTlVMTCAmJiBvLT5yZWxvY19jb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyA9IHA7Ci0gIHBlbmQgPSBwICsgby0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBwIDwgcGVuZDsgcCsrKQotICAgICpwID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRG8gdGhlIGZpbmFsIHN0ZXAgb2YgYW4gRUxGIGxpbmsuICAqLwotCi1ib29sZWFuCi1lbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gZHluYW1pYzsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICByZWdpc3RlciBhc2VjdGlvbiAqbzsKLSAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICByZWdpc3RlciBiZmQgKnN1YjsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBzaXplX3QgbWF4X2V4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHNpemVfdCBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBmaWxlX3B0ciBvZmY7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gZWxmc3ltOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW1zdHJ0YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvIGVvaW5mbzsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgZHluYW1pYyA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN5bXN0cnRhYiA9IGVsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGZpbmZvLmR5bnN5bV9zZWMgPSBOVUxMOwotICAgICAgZmluZm8uaGFzaF9zZWMgPSBOVUxMOwotICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZmluZm8uZHluc3ltX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBmaW5mby5oYXNoX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAoZmluZm8uZHluc3ltX3NlYyAhPSBOVUxMICYmIGZpbmZvLmhhc2hfc2VjICE9IE5VTEwpOwotICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKLSAgICAgIC8qIE5vdGUgdGhhdCBpdCBpcyBPSyBpZiBzeW12ZXJfc2VjIGlzIE5VTEwuICAqLwotICAgIH0KLQotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uaW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25zID0gTlVMTDsKLSAgZmluZm8uc3ltYnVmID0gTlVMTDsKLSAgZmluZm8uc3ltYnVmX2NvdW50ID0gMDsKLQotICAvKiBDb3VudCB1cCB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHdlIHdpbGwgb3V0cHV0IGZvciBlYWNoIG91dHB1dAotICAgICBzZWN0aW9uLCBzbyB0aGF0IHdlIGtub3cgdGhlIHNpemVzIG9mIHRoZSByZWxvYyBzZWN0aW9ucy4gIFdlCi0gICAgIGFsc28gZmlndXJlIG91dCBzb21lIG1heGltdW0gc2l6ZXMuICAqLwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9leHRlcm5hbF9yZWxvY19zaXplID0gMDsKLSAgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50ID0gMDsKLSAgbWF4X3N5bV9jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0KLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JICAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCW8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5fY29va2VkX3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotCSAgICAgIC8qIFdlIGFyZSBpbnRlcmVzdGVkIGluIGp1c3QgbG9jYWwgc3ltYm9scywgbm90IGFsbAotCQkgc3ltYm9scy4gICovCi0JICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc2VjLT5vd25lcikgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkgICYmIChzZWMtPm93bmVyLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JCXsKLQkJICBzaXplX3Qgc3ltX2NvdW50OwotCi0JCSAgaWYgKGVsZl9iYWRfc3ltdGFiIChzZWMtPm93bmVyKSkKLQkJICAgIHN5bV9jb3VudCA9IChlbGZfdGRhdGEgKHNlYy0+b3duZXIpLT5zeW10YWJfaGRyLnNoX3NpemUKLQkJCQkgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKTsKLQkJICBlbHNlCi0JCSAgICBzeW1fY291bnQgPSBlbGZfdGRhdGEgKHNlYy0+b3duZXIpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0KLQkJICBpZiAoc3ltX2NvdW50ID4gbWF4X3N5bV9jb3VudCkKLQkJICAgIG1heF9zeW1fY291bnQgPSBzeW1fY291bnQ7Ci0KLQkJICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBleHRfc2l6ZTsKLQotCQkgICAgICBleHRfc2l6ZSA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfc2l6ZTsKLQkJICAgICAgaWYgKGV4dF9zaXplID4gbWF4X2V4dGVybmFsX3JlbG9jX3NpemUpCi0JCQltYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGV4dF9zaXplOwotCQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9pbnRlcm5hbF9yZWxvY19jb3VudCkKLQkJCW1heF9pbnRlcm5hbF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID4gMCkKLQlvLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0gICAgICBlbHNlCi0JewotCSAgLyogRXhwbGljaXRseSBjbGVhciB0aGUgU0VDX1JFTE9DIGZsYWcuICBUaGUgbGlua2VyIHRlbmRzIHRvCi0JICAgICBzZXQgaXQgKHRoaXMgaXMgcHJvYmFibHkgYSBidWcpIGFuZCBpZiBpdCBpcyBzZXQKLQkgICAgIGFzc2lnbl9zZWN0aW9uX251bWJlcnMgd2lsbCBjcmVhdGUgYSByZWxvYyBzZWN0aW9uLiAgKi8KLQkgIG8tPmZsYWdzICY9fiBTRUNfUkVMT0M7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgU0VDX0FMTE9DIGZsYWcgaXMgbm90IHNldCwgZm9yY2UgdGhlIHNlY3Rpb24gVk1BIHRvCi0JIHplcm8uICBUaGlzIGlzIGRvbmUgaW4gZWxmX2Zha2Vfc2VjdGlvbnMgYXMgd2VsbCwgYnV0IGZvcmNpbmcKLQkgdGhlIFZNQSB0byAwIGhlcmUgd2lsbCBlbnN1cmUgdGhhdCByZWxvY3MgYWdhaW5zdCB0aGVzZQotCSBzZWN0aW9ucyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMAotCSAgJiYgISBvLT51c2VyX3NldF92bWEpCi0Jby0+dm1hID0gMDsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBzeW1ib2wgdGFibGUKLSAgICAgYW5kIHRoZSByZWxvY3MuICBXZSBzZXQgc3ltY291bnQgdG8gZm9yY2UgYXNzaWduX3NlY3Rpb25fbnVtYmVycwotICAgICB0byBjcmVhdGUgYSBzeW1ib2wgdGFibGUuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCA/IDAgOiAxOwotICBCRkRfQVNTRVJUICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOwotICBpZiAoISBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQsIGluZm8pKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoYXQgY3JlYXRlZCB0aGUgcmVsb2Mgc2VjdGlvbnMuICBTZXQgdGhlaXIgc2l6ZXMsIGFuZCBhc3NpZ24KLSAgICAgdGhlbSBmaWxlIHBvc2l0aW9ucywgYW5kIGFsbG9jYXRlIHNvbWUgYnVmZmVycy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgaWYgKCFlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24gKGFiZmQsCi0JCQkJCSAgICAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIsCi0JCQkJCSAgICBvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjIKLQkgICAgICAmJiAhZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uIChhYmZkLAotCQkJCQkgICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLAotCQkJCQkgICAgICAgbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MgKGFiZmQpOwotCi0gIC8qIFdlIGhhdmUgbm93IGFzc2lnbmVkIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zIGV4Y2VwdAotICAgICAuc3ltdGFiIGFuZCAuc3RydGFiLiAgV2Ugc3RhcnQgdGhlIC5zeW10YWIgc2VjdGlvbiBhdCB0aGUgY3VycmVudAotICAgICBmaWxlIHBvc2l0aW9uLCBhbmQgd3JpdGUgZGlyZWN0bHkgdG8gaXQuICBXZSBidWlsZCB0aGUgLnN0cnRhYgotICAgICBzZWN0aW9uIGluIG1lbW9yeS4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAvKiBzaF9uYW1lIGlzIHNldCBpbiBwcmVwX2hlYWRlcnMuICAqLwotICBzeW10YWJfaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQjsKLSAgc3ltdGFiX2hkci0+c2hfZmxhZ3MgPSAwOwotICBzeW10YWJfaGRyLT5zaF9hZGRyID0gMDsKLSAgc3ltdGFiX2hkci0+c2hfc2l6ZSA9IDA7Ci0gIHN5bXRhYl9oZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAvKiBzaF9saW5rIGlzIHNldCBpbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLiAgKi8KLSAgLyogc2hfaW5mbyBpcyBzZXQgYmVsb3cuICAqLwotICAvKiBzaF9vZmZzZXQgaXMgc2V0IGp1c3QgYmVsb3cuICAqLwotICBzeW10YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSA0OyAgLyogRklYTUU6IHN5c3RlbSBkZXBlbmRlbnQ/ICAqLwotCi0gIG9mZiA9IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3M7Ci0gIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChzeW10YWJfaGRyLCBvZmYsIHRydWUpOwotCi0gIC8qIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgaXMKLSAgICAgaW5jb3JyZWN0LiAgV2UgZG8gbm90IHlldCBrbm93IHRoZSBzaXplIG9mIHRoZSAuc3ltdGFiIHNlY3Rpb24uCi0gICAgIFdlIGNvcnJlY3QgbmV4dF9maWxlX3BvcyBiZWxvdywgYWZ0ZXIgd2UgZG8ga25vdyB0aGUgc2l6ZS4gICovCi0KLSAgLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCBzd2FwcGVkIG91dCBzeW1ib2xzLiAgVGhpcyBpcyB0byBhdm9pZAotICAgICBjb250aW51b3VzbHkgc2Vla2luZyB0byB0aGUgcmlnaHQgcG9zaXRpb24gaW4gdGhlIGZpbGUuICAqLwotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSB8fCBtYXhfc3ltX2NvdW50IDwgMjApCi0gICAgZmluZm8uc3ltYnVmX3NpemUgPSAyMDsKLSAgZWxzZQotICAgIGZpbmZvLnN5bWJ1Zl9zaXplID0gbWF4X3N5bV9jb3VudDsKLSAgZmluZm8uc3ltYnVmID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JCSAgYmZkX21hbGxvYyAoZmluZm8uc3ltYnVmX3NpemUgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGlmIChmaW5mby5zeW1idWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBTdGFydCB3cml0aW5nIG91dCB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIGZpcnN0IHN5bWJvbCBpcyBhbHdheXMgYQotICAgICBkdW1teSBzeW1ib2wuICAqLwotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsIHx8IGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBlbGZzeW0uc3RfdmFsdWUgPSAwOwotICAgICAgZWxmc3ltLnN0X3NpemUgPSAwOwotICAgICAgZWxmc3ltLnN0X2luZm8gPSAwOwotICAgICAgZWxmc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGVsZnN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKCZmaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgJmVsZnN5bSwgYmZkX3VuZF9zZWN0aW9uX3B0cikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0jaWYgMAotICAvKiBTb21lIHN0YW5kYXJkIEVMRiBsaW5rZXJzIGRvIHRoaXMsIGJ1dCB3ZSBkb24ndCBiZWNhdXNlIGl0IGNhdXNlcwotICAgICBib290c3RyYXAgY29tcGFyaXNvbiBmYWlsdXJlcy4gICovCi0gIC8qIE91dHB1dCBhIGZpbGUgc3ltYm9sIGZvciB0aGUgb3V0cHV0IGZpbGUgYXMgdGhlIHNlY29uZCBzeW1ib2wuCi0gICAgIFdlIG91dHB1dCB0aGlzIGV2ZW4gaWYgd2UgYXJlIGRpc2NhcmRpbmcgbG9jYWwgc3ltYm9scywgYWx0aG91Z2gKLSAgICAgSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdC4gICovCi0gIGVsZnN5bS5zdF92YWx1ZSA9IDA7Ci0gIGVsZnN5bS5zdF9zaXplID0gMDsKLSAgZWxmc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfRklMRSk7Ci0gIGVsZnN5bS5zdF9vdGhlciA9IDA7Ci0gIGVsZnN5bS5zdF9zaG5keCA9IFNITl9BQlM7Ci0gIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKCZmaW5mbywgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgICZlbGZzeW0sIGJmZF9hYnNfc2VjdGlvbl9wdHIpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotI2VuZGlmCi0KLSAgLyogT3V0cHV0IGEgc3ltYm9sIGZvciBlYWNoIHNlY3Rpb24uICBXZSBvdXRwdXQgdGhlc2UgZXZlbiBpZiB3ZSBhcmUKLSAgICAgZGlzY2FyZGluZyBsb2NhbCBzeW1ib2xzLCBzaW5jZSB0aGV5IGFyZSB1c2VkIGZvciByZWxvY3MuICBUaGVzZQotICAgICBzeW1ib2xzIGhhdmUgbm8gbmFtZXMuICBXZSBzdG9yZSB0aGUgaW5kZXggb2YgZWFjaCBvbmUgaW4gdGhlCi0gICAgIGluZGV4IGZpZWxkIG9mIHRoZSBzZWN0aW9uLCBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0IGFnYWluIHdoZW4KLSAgICAgb3V0cHV0dGluZyByZWxvY3MuICAqLwotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsIHx8IGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBlbGZzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIGVsZnN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07IGkrKykKLQl7Ci0JICBvID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaSk7Ci0JICBpZiAobyAhPSBOVUxMKQotCSAgICBvLT50YXJnZXRfaW5kZXggPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGVsZnN5bS5zdF9zaG5keCA9IGk7Ci0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8IG8gPT0gTlVMTCkKLQkgICAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKLQkgIGVsc2UKLQkgICAgZWxmc3ltLnN0X3ZhbHVlID0gby0+dm1hOwotCSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICAgJmVsZnN5bSwgbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgdG8gaG9sZCBpbmZvcm1hdGlvbiByZWFkIGluIGZyb20gdGhlIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgZmluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jIChtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9ICgoRWxmX0ludGVybmFsX1JlbGEgKikKLQkJCSAgIGJmZF9tYWxsb2MgKG1heF9pbnRlcm5hbF9yZWxvY19jb3VudAotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpKSk7Ci0gIGZpbmZvLmV4dGVybmFsX3N5bXMgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICBmaW5mby5pbmRpY2VzID0gKGxvbmcgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAobG9uZykpOwotICBmaW5mby5zZWN0aW9ucyA9ICgoYXNlY3Rpb24gKiopCi0JCSAgICBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOwotICBpZiAoKGZpbmZvLmNvbnRlbnRzID09IE5VTEwgJiYgbWF4X2NvbnRlbnRzX3NpemUgIT0gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAhPSAwKQotICAgICAgfHwgKGZpbmZvLmludGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9pbnRlcm5hbF9yZWxvY19jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCi0gICAgICB8fCAoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLnNlY3Rpb25zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBTaW5jZSBFTEYgcGVybWl0cyByZWxvY2F0aW9ucyB0byBiZSBhZ2FpbnN0IGxvY2FsIHN5bWJvbHMsIHdlCi0gICAgIG11c3QgaGF2ZSB0aGUgbG9jYWwgc3ltYm9scyBhdmFpbGFibGUgd2hlbiB3ZSBkbyB0aGUgcmVsb2NhdGlvbnMuCi0gICAgIFNpbmNlIHdlIHdvdWxkIHJhdGhlciBvbmx5IHJlYWQgdGhlIGxvY2FsIHN5bWJvbHMgb25jZSwgYW5kIHdlCi0gICAgIHdvdWxkIHJhdGhlciBub3Qga2VlcCB0aGVtIGluIG1lbW9yeSwgd2UgaGFuZGxlIGFsbCB0aGUKLSAgICAgcmVsb2NhdGlvbnMgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgdGhlIHNhbWUgdGltZS4KLQotICAgICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB0aGUgdG90YWwgbnVtYmVyIG9mIGxvY2FsCi0gICAgIHN5bWJvbHMgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCBvZiB0aGVtLCBhbmQgdGhlIGxvY2FsIHN5bWJvbAotICAgICBpbmRpY2VzIHByZWNlZGUgdGhlIGdsb2JhbCBzeW1ib2wgaW5kaWNlcy4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuCi0gICAgIHdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCB3ZSBzZWUgYSByZWxvYyBhZ2FpbnN0Ci0gICAgIGEgZ2xvYmFsIHN5bWJvbCwgd2UgY2FuIG5vdCBrbm93IHRoZSBzeW1ib2wgaW5kZXggdW50aWwgd2UgaGF2ZQotICAgICBmaW5pc2hlZCBleGFtaW5pbmcgYWxsIHRoZSBsb2NhbCBzeW1ib2xzIHRvIHNlZSB3aGljaCBvbmVzIHdlIGFyZQotICAgICBnb2luZyB0byBvdXRwdXQuICBUbyBkZWFsIHdpdGggdGhpcywgd2Uga2VlcCB0aGUgcmVsb2NhdGlvbnMgaW4KLSAgICAgbWVtb3J5LCBhbmQgZG9uJ3Qgb3V0cHV0IHRoZW0gdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluay4gIFRoaXMgaXMKLSAgICAgYW4gdW5mb3J0dW5hdGUgd2FzdGUgb2YgbWVtb3J5LCBidXQgSSBkb24ndCBzZWUgYSBnb29kIHdheSBhcm91bmQKLSAgICAgaXQuICBGb3J0dW5hdGVseSwgaXQgb25seSBoYXBwZW5zIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZQotICAgICBsaW5rLCB3aGljaCBpcyBub3QgdGhlIGNvbW1vbiBjYXNlLiAgRklYTUU6IElmIGtlZXBfbWVtb3J5IGlzIHNldAotICAgICB3ZSBjb3VsZCB3cml0ZSB0aGUgcmVsb2NzIG91dCBhbmQgdGhlbiByZWFkIHRoZW0gYWdhaW47IEkgZG9uJ3QKLSAgICAga25vdyBob3cgYmFkIHRoZSBtZW1vcnkgbG9zcyB3aWxsIGJlLiAgKi8KLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotCQl7Ci0JCSAgaWYgKCEgZWxmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIHN1YikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGlmICghIGVsZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFRoYXQgd3JvdGUgb3V0IGFsbCB0aGUgbG9jYWwgc3ltYm9scy4gIEZpbmlzaCB1cCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIHdpdGggdGhlIGdsb2JhbCBzeW1ib2xzLiAgKi8KLQotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsICYmIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICAvKiBPdXRwdXQgYW55IGdsb2JhbCBzeW1ib2xzIHRoYXQgZ290IGNvbnZlcnRlZCB0byBsb2NhbCBpbiBhCi0gICAgICAgICB2ZXJzaW9uIHNjcmlwdC4gIFdlIGRvIHRoaXMgaW4gYSBzZXBhcmF0ZSBzdGVwIHNpbmNlIEVMRgotICAgICAgICAgcmVxdWlyZXMgYWxsIGxvY2FsIHN5bWJvbHMgdG8gYXBwZWFyIHByaW9yIHRvIGFueSBnbG9iYWwKLSAgICAgICAgIHN5bWJvbHMuICBGSVhNRTogV2Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBpZiBzb21lIGdsb2JhbAotICAgICAgICAgc3ltYm9scyB3ZXJlLCBpbiBmYWN0LCBjb252ZXJ0ZWQgdG8gYmVjb21lIGxvY2FsLiAgRklYTUU6Ci0gICAgICAgICBXaWxsIHRoaXMgd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgSXJpeCA1IGxpbmtlcj8gICovCi0gICAgICBlb2luZm8uZmFpbGVkID0gZmFsc2U7Ci0gICAgICBlb2luZm8uZmluZm8gPSAmZmluZm87Ci0gICAgICBlb2luZm8ubG9jYWxzeW1zID0gdHJ1ZTsKLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSwKLQkJCSAgICAgIChQVFIpICZlb2luZm8pOwotICAgICAgaWYgKGVvaW5mby5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc2hfaW5mbyBmaWVsZCByZWNvcmRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uIGxvY2FsCi0gICAgIHN5bWJvbC4gICovCi0gIHN5bXRhYl9oZHItPnNoX2luZm8gPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgaWYgKGR5bmFtaWMpCi0gICAgZWxmX3NlY3Rpb25fZGF0YSAoZmluZm8uZHluc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0gMTsKLQotICAvKiBXZSBnZXQgdGhlIGdsb2JhbCBzeW1ib2xzIGZyb20gdGhlIGhhc2ggdGFibGUuICAqLwotICBlb2luZm8uZmFpbGVkID0gZmFsc2U7Ci0gIGVvaW5mby5sb2NhbHN5bXMgPSBmYWxzZTsKLSAgZW9pbmZvLmZpbmZvID0gJmZpbmZvOwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGVsZl9saW5rX291dHB1dF9leHRzeW0sCi0JCQkgIChQVFIpICZlb2luZm8pOwotICBpZiAoZW9pbmZvLmZhaWxlZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmx1c2ggYWxsIHN5bWJvbHMgdG8gdGhlIGZpbGUuICAqLwotICBpZiAoISBlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyAoJmZpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdlIGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bXRhYiBzZWN0aW9uLiAgKi8KLSAgb2ZmICs9IHN5bXRhYl9oZHItPnNoX3NpemU7Ci0KLSAgLyogRmluaXNoIHVwIGFuZCB3cml0ZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgKC5zdHJ0YWIpCi0gICAgIHNlY3Rpb24uICAqLwotICBzeW1zdHJ0YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0gIC8qIHNoX25hbWUgd2FzIHNldCBpbiBwcmVwX2hlYWRlcnMuICAqLwotICBzeW1zdHJ0YWJfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgc3ltc3RydGFiX2hkci0+c2hfZmxhZ3MgPSAwOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9hZGRyID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN5bXN0cnRhYik7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2VudHNpemUgPSAwOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9saW5rID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7Ci0gIC8qIHNoX29mZnNldCBpcyBzZXQganVzdCBiZWxvdy4gICovCi0gIHN5bXN0cnRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDE7Ci0KLSAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHN5bXN0cnRhYl9oZHIsIG9mZiwgdHJ1ZSk7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXN0cnRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZmluZm8uc3ltc3RydGFiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgcmVsb2NzIHRvIGhhdmUgdGhlIGNvcnJlY3Qgc3ltYm9sIGluZGljZXMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHJlbF9oYXNoID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXM7Ci0gICAgICByZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyOwotICAgICAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudCA9PSBvLT5yZWxvY19jb3VudCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgby0+cmVsb2NfY291bnQ7IGkrKywgcmVsX2hhc2grKykKLQl7Ci0JICBpZiAoKnJlbF9oYXNoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBCRkRfQVNTRVJUICgoKnJlbF9oYXNoKS0+aW5keCA+PSAwKTsKLQotCSAgaWYgKHJlbF9oZHItPnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSkKLQkgICAgewotCSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotCi0JICAgICAgZXJlbCA9IChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbF9oZHItPmNvbnRlbnRzICsgaTsKLQkgICAgICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgJmlyZWwpOwotCSAgICAgIGlyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCi0JCQkJCUVMRl9SX1RZUEUgKGlyZWwucl9pbmZvKSk7Ci0JICAgICAgZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmaXJlbCwgZXJlbCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHJlbF9oZHItPnNoX2VudHNpemUKLQkJCSAgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotCi0JICAgICAgZXJlbGEgPSAoRWxmX0V4dGVybmFsX1JlbGEgKikgcmVsX2hkci0+Y29udGVudHMgKyBpOwotCSAgICAgIGVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgZXJlbGEsICZpcmVsYSk7Ci0JICAgICAgaXJlbGEucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCi0JCQkJCSBFTEZfUl9UWVBFIChpcmVsYS5yX2luZm8pKTsKLQkgICAgICBlbGZfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCAmaXJlbGEsIGVyZWxhKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogU2V0IHRoZSByZWxvY19jb3VudCBmaWVsZCB0byAwIHRvIHByZXZlbnQgd3JpdGVfcmVsb2NzIGZyb20KLQkgdHJ5aW5nIHRvIHN3YXAgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LCBvciBnZW5lcmF0aW5nIGEKLSAgICAgc2hhcmVkIGxpYnJhcnksIGZpbmlzaCB1cCB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICAvKiBGaXggdXAgLmR5bmFtaWMgZW50cmllcy4gICovCi0gICAgICBvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gICAgICBCRkRfQVNTRVJUIChvICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmX0V4dGVybmFsX0R5biAqKSBvLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGZfRXh0ZXJuYWxfRHluICopIChvLT5jb250ZW50cyArIG8tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotCSAgZWxmX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSU5JVDoKLQkgICAgICBuYW1lID0gaW5mby0+aW5pdF9mdW5jdGlvbjsKLQkgICAgICBnb3RvIGdldF9zeW07Ci0JICAgIGNhc2UgRFRfRklOSToKLQkgICAgICBuYW1lID0gaW5mby0+ZmluaV9mdW5jdGlvbjsKLQkgICAgZ2V0X3N5bToKLQkgICAgICB7Ci0JCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCWggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAotCQkJCQkgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWlmIChoICE9IE5VTEwKLQkJICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQl8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJICB7Ci0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICBvID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgaWYgKG8tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JCSAgICAgIGR5bi5kX3VuLmRfdmFsICs9IChvLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIG8tPm91dHB1dF9vZmZzZXQpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBUaGUgc3ltYm9sIGlzIGltcG9ydGVkIGZyb20gYW5vdGhlciBzaGFyZWQKLQkJCSAgIGxpYnJhcnkgYW5kIGRvZXMgbm90IGFwcGx5IHRvIHRoaXMgb25lLiAgKi8KLQkJCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkJICAgICAgfQotCi0JCSAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX0hBU0g6Ci0JICAgICAgbmFtZSA9ICIuaGFzaCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1NUUlRBQjoKLQkgICAgICBuYW1lID0gIi5keW5zdHIiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9TWU1UQUI6Ci0JICAgICAgbmFtZSA9ICIuZHluc3ltIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfVkVSREVGOgotCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uX2QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9WRVJORUVEOgotCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uX3IiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9WRVJTWU06Ci0JICAgICAgbmFtZSA9ICIuZ251LnZlcnNpb24iOwotCSAgICBnZXRfdm1hOgotCSAgICAgIG8gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAobyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IG8tPnZtYTsKLQkgICAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUw6Ci0JICAgIGNhc2UgRFRfUkVMQToKLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9SRUwgfHwgZHluLmRfdGFnID09IERUX1JFTFNaKQotCQl0eXBlID0gU0hUX1JFTDsKLQkgICAgICBlbHNlCi0JCXR5cGUgPSBTSFRfUkVMQTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JICAgICAgZm9yIChpID0gMTsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOyBpKyspCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0JCSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpXTsKLQkJICBpZiAoaGRyLT5zaF90eXBlID09IHR5cGUKLQkJICAgICAgJiYgKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfUkVMU1ogfHwgZHluLmRfdGFnID09IERUX1JFTEFTWikKLQkJCWR5bi5kX3VuLmRfdmFsICs9IGhkci0+c2hfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAoZHluLmRfdW4uZF92YWwgPT0gMAotCQkJICAgICAgfHwgaGRyLT5zaF9hZGRyIDwgZHluLmRfdW4uZF92YWwpCi0JCQkgICAgZHluLmRfdW4uZF92YWwgPSBoZHItPnNoX2FkZHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgY3JlYXRlZCBhbnkgZHluYW1pYyBzZWN0aW9ucywgdGhlbiBvdXRwdXQgdGhlbS4gICovCi0gIGlmIChkeW5vYmogIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpIChhYmZkLCBpbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZm9yIChvID0gZHlub2JqLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgICAgIHx8IG8tPl9yYXdfc2l6ZSA9PSAwKQotCSAgICBjb250aW51ZTsKLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHNlY3Rpb25zCi0gICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAoKGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfdHlwZQotCSAgICAgICAhPSBTSFRfU1RSVEFCKQotCSAgICAgIHx8IHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCAiLmR5bnN0ciIpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBvLT5jb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbGVfcHRyIG9mZjsKLQotCSAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGUgLmR5bnN0ciBzZWN0aW9uIGFyZSBhY3R1YWxseSBpbiBhCi0gICAgICAgICAgICAgICAgIHN0cmluZ3RhYi4gICovCi0JICAgICAgb2ZmID0gZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9vZmZzZXQ7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLAotCQkJCQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBvcHRpbWl6ZWQgc3RhYnMgc3RyaW5ncywgb3V0cHV0IHRoZW0uICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAoYWJmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN5bXN0cnRhYik7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW5kaWNlcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmluZGljZXMpOwotICBpZiAoZmluZm8uc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zZWN0aW9ucyk7Ci0gIGlmIChmaW5mby5zeW1idWYgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1idWYpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAhPSBOVUxMKQotCWZyZWUgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKLSAgICB9Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+bGlua2VyID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN5bXN0cnRhYik7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW5kaWNlcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmluZGljZXMpOwotICBpZiAoZmluZm8uc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zZWN0aW9ucyk7Ci0gIGlmIChmaW5mby5zeW1idWYgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1idWYpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAhPSBOVUxMKQotCWZyZWUgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsIGVsZnN5bSwgaW5wdXRfc2VjKQotICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmVsZnN5bTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlYzsKLXsKLSAgYm9vbGVhbiAoKm91dHB1dF9zeW1ib2xfaG9vaykgUEFSQU1TICgoYmZkICosCi0JCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkJCQkJIGNvbnN0IGNoYXIgKiwKLQkJCQkJIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkJCQkJIGFzZWN0aW9uICopKTsKLQotICBvdXRwdXRfc3ltYm9sX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpLT4KLSAgICBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vazsKLSAgaWYgKG91dHB1dF9zeW1ib2xfaG9vayAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgoKm91dHB1dF9zeW1ib2xfaG9vaykKLQkgICAgIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIG5hbWUsIGVsZnN5bSwgaW5wdXRfc2VjKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0gICAgZWxmc3ltLT5zdF9uYW1lID0gMDsKLSAgZWxzZSBpZiAoaW5wdXRfc2VjLT5mbGFncyAmIFNFQ19FWENMVURFKQotICAgIGVsZnN5bS0+c3RfbmFtZSA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbGZzeW0tPnN0X25hbWUgPSAodW5zaWduZWQgbG9uZykgX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3ltc3RydGFiLAotCQkJCQkJCSAgICBuYW1lLCB0cnVlLAotCQkJCQkJCSAgICBmYWxzZSk7Ci0gICAgICBpZiAoZWxmc3ltLT5zdF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChmaW5mby0+c3ltYnVmX2NvdW50ID49IGZpbmZvLT5zeW1idWZfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyAoZmluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWxmX3N3YXBfc3ltYm9sX291dCAoZmluZm8tPm91dHB1dF9iZmQsIGVsZnN5bSwKLQkJICAgICAgIChQVFIpIChmaW5mby0+c3ltYnVmICsgZmluZm8tPnN5bWJ1Zl9jb3VudCkpOwotICArK2ZpbmZvLT5zeW1idWZfY291bnQ7Ci0KLSAgKysgYmZkX2dldF9zeW1jb3VudCAoZmluZm8tPm91dHB1dF9iZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGbHVzaCB0aGUgb3V0cHV0IHN5bWJvbHMgdG8gdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKGZpbmZvKQotICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci17Ci0gIGlmIChmaW5mby0+c3ltYnVmX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiOwotCi0gICAgICBzeW10YWIgPSAmZWxmX3RkYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoZmluZm8tPm91dHB1dF9iZmQsIHN5bXRhYi0+c2hfb2Zmc2V0ICsgc3ltdGFiLT5zaF9zaXplLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKChQVFIpIGZpbmZvLT5zeW1idWYsIGZpbmZvLT5zeW1idWZfY291bnQsCi0JCQkgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgZmluZm8tPm91dHB1dF9iZmQpCi0JICAgICAgIT0gZmluZm8tPnN5bWJ1Zl9jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltdGFiLT5zaF9zaXplICs9IGZpbmZvLT5zeW1idWZfY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gICAgICBmaW5mby0+c3ltYnVmX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbiBleHRlcm5hbCBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlIHRyYXZlcnNhbCByb3V0aW5lLiAgV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwKLSAgIHdlIGdvIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lIHdlIG91dHB1dAotICAgYW55dGhpbmcgdGhhdCBtaWdodCBoYXZlIGJlZW4gZm9yY2VkIHRvIGxvY2FsIHNjb3BlIGluIGEgdmVyc2lvbgotICAgc2NyaXB0LiAgVGhlIHNlY29uZCB0aW1lIHdlIG91dHB1dCB0aGUgc3ltYm9scyB0aGF0IGFyZSBzdGlsbAotICAgZ2xvYmFsIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvICplb2luZm8gPSAoc3RydWN0IGVsZl9vdXRleHRfaW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSBlb2luZm8tPmZpbmZvOwotICBib29sZWFuIHN0cmlwOwotICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgYXNlY3Rpb24gKmlucHV0X3NlYzsKLQotICAvKiBEZWNpZGUgd2hldGhlciB0byBvdXRwdXQgdGhpcyBzeW1ib2wgaW4gdGhpcyBwYXNzLiAgKi8KLSAgaWYgKGVvaW5mby0+bG9jYWxzeW1zKQotICAgIHsKLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgc3ltYm9sIGlzCi0gICAgIHJlZmVyZW5jZWQgYnkgYSBzaGFyZWQgbGlicmFyeSBidXQgaXMgbm90IGRlZmluZWQgYW55d2hlcmUsIHRoZW4KLSAgICAgd2FybiB0aGF0IGl0IGlzIHVuZGVmaW5lZC4gIElmIHdlIGRvIG5vdCBkbyB0aGlzLCB0aGUgcnVudGltZQotICAgICBsaW5rZXIgd2lsbCBjb21wbGFpbiB0aGF0IHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIHdoZW4gdGhlCi0gICAgIHByb2dyYW0gaXMgcnVuLiAgV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzeW1ib2xzIHRoYXQgYXJlCi0gICAgIHJlZmVyZW5jZWQgYnkgcmVndWxhciBmaWxlcywgYmVjYXVzZSB3ZSB3aWxsIGFscmVhZHkgaGF2ZSBpc3N1ZWQKLSAgICAgd2FybmluZ3MgZm9yIHRoZW0uICAqLwotICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIChmaW5mby0+aW5mby0+c2hhcmVkCi0JICAgICYmICFmaW5mby0+aW5mby0+bm9fdW5kZWZpbmVkKQotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCSAgICAgKGZpbmZvLT5pbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoLT5yb290LnUudW5kZWYuYWJmZCwKLQkgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgMCkpKQotCXsKLQkgIGVvaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IHN5bWJvbHMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gbWVudGlvbmVkIGJ5Ci0gICAgIGEgcmVndWxhciBmaWxlLCBvciB0aGF0IHdlIGhhdmUgYmVlbiB0b2xkIHRvIHN0cmlwLiAgSG93ZXZlciwgaWYKLSAgICAgaC0+aW5keCBpcyBzZXQgdG8gLTIsIHRoZSBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jIGFuZCB3ZSBtdXN0Ci0gICAgIG91dHB1dCBpdC4gICovCi0gIGlmIChoLT5pbmR4ID09IC0yKQotICAgIHN0cmlwID0gZmFsc2U7Ci0gIGVsc2UgaWYgKCgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKQotCSAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgICB8fCAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UKLSAgICBzdHJpcCA9IGZhbHNlOwotCi0gIC8qIElmIHdlJ3JlIHN0cmlwcGluZyBpdCwgYW5kIGl0J3Mgbm90IGEgZHluYW1pYyBzeW1ib2wsIHRoZXJlJ3MKLSAgICAgbm90aGluZyBlbHNlIHRvIGRvLiAgKi8KLSAgaWYgKHN0cmlwICYmIGgtPmR5bmluZHggPT0gLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltLnN0X3ZhbHVlID0gMDsKLSAgc3ltLnN0X3NpemUgPSBoLT5zaXplOwotICBzeW0uc3Rfb3RoZXIgPSBoLT5vdGhlcjsKLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSAhPSAwKQotICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgaC0+dHlwZSk7Ci0gIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX1dFQUssIGgtPnR5cGUpOwotICBlbHNlCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgaC0+dHlwZSk7Ci0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIGlucHV0X3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpbnB1dF9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlpbnB1dF9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JaWYgKGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkgIHsKLQkgICAgc3ltLnN0X3NobmR4ID0KLQkgICAgICBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkJIGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3ltLnN0X3NobmR4ID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IGNvdWxkIG5vdCBmaW5kIG91dHB1dCBzZWN0aW9uICVzIGZvciBpbnB1dCBzZWN0aW9uICVzIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGZpbmZvLT5vdXRwdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwKLQkJICAgaW5wdXRfc2VjLT5uYW1lKTsKLQkJZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIC8qIEVMRiBzeW1ib2xzIGluIHJlbG9jYXRlYWJsZSBmaWxlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZSwKLQkgICAgICAgYnV0IGluIG5vbnJlbG9jYXRlYWJsZSBmaWxlcyB0aGV5IGFyZSB2aXJ0dWFsCi0JICAgICAgIGFkZHJlc3Nlcy4gICovCi0JICAgIHN5bS5zdF92YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWUgKyBpbnB1dF9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgICAgc3ltLnN0X3ZhbHVlICs9IGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIEJGRF9BU1NFUlQgKGlucHV0X3NlYy0+b3duZXIgPT0gTlVMTAotCQkJfHwgKGlucHV0X3NlYy0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCk7Ci0JICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQkgICAgaW5wdXRfc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIGlucHV0X3NlYyA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fQ09NTU9OOwotICAgICAgc3ltLnN0X3ZhbHVlID0gMSA8PCBoLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICAgIC8qIFRoZXNlIHN5bWJvbHMgYXJlIGNyZWF0ZWQgYnkgc3ltYm9sIHZlcnNpb25pbmcuICBUaGV5IHBvaW50Ci0gICAgICAgICB0byB0aGUgZGVjb3JhdGVkIHZlcnNpb24gb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgaWYgdGhlCi0gICAgICAgICBzeW1ib2wgZm9vQEBHTlVfMS4yIGlzIHRoZSBkZWZhdWx0LCB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICAgICBmb28gaXMgdXNlZCB3aXRoIG5vIHZlcnNpb24sIHRoZW4gd2UgYWRkIGFuIGluZGlyZWN0IHN5bWJvbAotICAgICAgICAgZm9vIHdoaWNoIHBvaW50cyB0byBmb29AQEdOVV8xLjIuICBXZSBpZ25vcmUgdGhlc2Ugc3ltYm9scywKLSAgICAgICAgIHNpbmNlIHRoZSBpbmRpcmVjdGVkIHN5bWJvbCBpcyBhbHJlYWR5IGluIHRoZSBoYXNoIHRhYmxlLiAgSWYKLSAgICAgICAgIHRoZSBpbmRpcmVjdCBzeW1ib2wgaXMgbm9uLUVMRiwgZmFsbCB0aHJvdWdoIGFuZCBvdXRwdXQgaXQuICAqLwotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0VMRikgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIFdlIGNhbid0IHJlcHJlc2VudCB0aGVzZSBzeW1ib2xzIGluIEVMRiwgYWx0aG91Z2ggYSB3YXJuaW5nCi0gICAgICAgICBzeW1ib2wgbWF5IGhhdmUgY29tZSBmcm9tIGEgLmdudS53YXJuaW5nLlNZTUJPTCBzZWN0aW9uLiAgV2UKLSAgICAgICAgIGp1c3QgcHV0IHRoZSB0YXJnZXQgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgdGhlIHRhcmdldAotICAgICAgICAgc3ltYm9sIGRvZXMgbm90IHJlYWxseSBleGlzdCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKGgtPnJvb3QudS5pLmxpbmstPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gKGVsZl9saW5rX291dHB1dF9leHRzeW0KLQkgICAgICAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbmssIGRhdGEpKTsKLSAgICB9Ci0KLSAgLyogR2l2ZSB0aGUgcHJvY2Vzc29yIGJhY2tlbmQgYSBjaGFuY2UgdG8gdHdlYWsgdGhlIHN5bWJvbCB2YWx1ZSwKLSAgICAgYW5kIGFsc28gdG8gZmluaXNoIHVwIGFueXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgdGhpcwotICAgICBzeW1ib2wuICAqLwotICBpZiAoKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgIT0gMCkKLSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gICAgICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpOwotICAgICAgaWYgKCEgKCgqYmVkLT5lbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpCi0JICAgICAoZmluZm8tPm91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBoLCAmc3ltKSkpCi0JewotCSAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG1hcmtpbmcgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIGFuZCB0aGVyZSBhcmUgbm8KLSAgICAgbm9uLXdlYWsgcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCBmcm9tIGEgcmVndWxhciBvYmplY3QsIHRoZW4KLSAgICAgbWFyayB0aGUgc3ltYm9sIGFzIHdlYWsgdW5kZWZpbmVkLiAgV2UgY2FuJ3QgZG8gdGhpcyBlYXJsaWVyLAotICAgICBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBiZSBtYXJrZWQgYXMgdW5kZWZpbmVkIHVudGlsIHRoZQotICAgICBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZSBnZXRzIHRocm91Z2ggd2l0aCBpdC4gICovCi0gIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGCi0gICAgICAmJiBzeW0uc3RfaW5mbyA9PSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgaC0+dHlwZSkKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspID09IDApCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX1dFQUssIGgtPnR5cGUpOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIHNob3VsZCBiZSBwdXQgaW4gdGhlIC5keW5zeW0gc2VjdGlvbiwgdGhlbiBwdXQgaXQKLSAgICAgdGhlcmUgbm93LiAgV2UgaGF2ZSBhbHJlYWR5IGtub3cgdGhlIHN5bWJvbCBpbmRleC4gIFdlIGFsc28gZmlsbAotICAgICBpbiB0aGUgZW50cnkgaW4gdGhlIC5oYXNoIHNlY3Rpb24uICAqLwotICBpZiAoaC0+ZHluaW5keCAhPSAtMQotICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBidWNrZXRjb3VudDsKLSAgICAgIHNpemVfdCBidWNrZXQ7Ci0gICAgICBiZmRfYnl0ZSAqYnVja2V0cG9zOwotICAgICAgYmZkX3ZtYSBjaGFpbjsKLQotICAgICAgc3ltLnN0X25hbWUgPSBoLT5keW5zdHJfaW5kZXg7Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCAmc3ltLAotCQkJICAgKFBUUikgKCgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQkJCSAgIGZpbmZvLT5keW5zeW1fc2VjLT5jb250ZW50cykKLQkJCQkgICsgaC0+ZHluaW5keCkpOwotCi0gICAgICBidWNrZXRjb3VudCA9IGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmJ1Y2tldGNvdW50OwotICAgICAgYnVja2V0ID0gaC0+ZWxmX2hhc2hfdmFsdWUgJSBidWNrZXRjb3VudDsKLSAgICAgIGJ1Y2tldHBvcyA9ICgoYmZkX2J5dGUgKikgZmluZm8tPmhhc2hfc2VjLT5jb250ZW50cwotCQkgICArIChidWNrZXQgKyAyKSAqIChBUkNIX1NJWkUgLyA4KSk7Ci0gICAgICBjaGFpbiA9IGdldF93b3JkIChmaW5mby0+b3V0cHV0X2JmZCwgYnVja2V0cG9zKTsKLSAgICAgIHB1dF93b3JkIChmaW5mby0+b3V0cHV0X2JmZCwgaC0+ZHluaW5keCwgYnVja2V0cG9zKTsKLSAgICAgIHB1dF93b3JkIChmaW5mby0+b3V0cHV0X2JmZCwgY2hhaW4sCi0JCSgoYmZkX2J5dGUgKikgZmluZm8tPmhhc2hfc2VjLT5jb250ZW50cwotCQkgKyAoYnVja2V0Y291bnQgKyAyICsgaC0+ZHluaW5keCkgKiAoQVJDSF9TSVpFIC8gOCkpKTsKLQotICAgICAgaWYgKGZpbmZvLT5zeW12ZXJfc2VjICE9IE5VTEwgJiYgZmluZm8tPnN5bXZlcl9zZWMtPmNvbnRlbnRzICE9IE5VTEwpCi0JewotCSAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyc3ltOwotCi0JICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnZlcmluZm8udmVyZGVmID09IE5VTEwpCi0JCWl2ZXJzeW0udnNfdmVycyA9IDA7Ci0JICAgICAgZWxzZQotCQlpdmVyc3ltLnZzX3ZlcnMgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vICsgMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotCQlpdmVyc3ltLnZzX3ZlcnMgPSAxOwotCSAgICAgIGVsc2UKLQkJaXZlcnN5bS52c192ZXJzID0gaC0+dmVyaW5mby52ZXJ0cmVlLT52ZXJudW0gKyAxOwotCSAgICB9Ci0KLQkgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hJRERFTikgIT0gMCkKLQkgICAgaXZlcnN5bS52c192ZXJzIHw9IFZFUlNZTV9ISURERU47Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCAoZmluZm8tPm91dHB1dF9iZmQsICZpdmVyc3ltLAotCQkJCSAgICAoKChFbGZfRXh0ZXJuYWxfVmVyc3ltICopCi0JCQkJICAgICAgZmluZm8tPnN5bXZlcl9zZWMtPmNvbnRlbnRzKQotCQkJCSAgICAgKyBoLT5keW5pbmR4KSk7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBzdHJpcHBpbmcgaXQsIHRoZW4gaXQgd2FzIGp1c3QgYSBkeW5hbWljIHN5bWJvbCwgYW5kCi0gICAgIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHRvIGRvLiAgKi8KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmluZHggPSBiZmRfZ2V0X3N5bWNvdW50IChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsICZzeW0sIGlucHV0X3NlYykpCi0gICAgewotICAgICAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSB0aGUgcmVsb2NhdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSBJTlRFUk5BTF9SRUxPQ1MgKHdoaWNoCi0gICBvcmlnaW5hdGVkIGZyb20gdGhlIHNlY3Rpb24gZ2l2ZW4gYnkgSU5QVVRfUkVMX0hEUikgdG8gdGhlCi0gICBPVVRQVVRfQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9saW5rX291dHB1dF9yZWxvY3MgKG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGlucHV0X3JlbF9oZHIsIAotCQkJaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaW5wdXRfcmVsX2hkcjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpvdXRwdXRfcmVsX2hkcjsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgKnJlbF9jb3VudHA7Ci0KLSAgb3V0cHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLSAgb3V0cHV0X3JlbF9oZHIgPSBOVUxMOwotCi0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfZW50c2l6ZSAKLSAgICAgID09IGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUpCi0gICAgewotICAgICAgb3V0cHV0X3JlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyOwotICAgICAgcmVsX2NvdW50cCA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudDsKLSAgICB9Ci0gIGVsc2UgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjIKLQkgICAmJiAoZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyMi0+c2hfZW50c2l6ZQotCSAgICAgICA9PSBpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplKSkKLSAgICB7Ci0gICAgICBvdXRwdXRfcmVsX2hkciA9IGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjI7Ci0gICAgICByZWxfY291bnRwID0gJmVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50MjsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAob3V0cHV0X3JlbF9oZHIgIT0gTlVMTCk7Ci0gIAotICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLSAgaXJlbGFlbmQgPSBpcmVsYSArIGlucHV0X3JlbF9oZHItPnNoX3NpemUgLyBpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplOwotICBpZiAoaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0KLSAgICAgIGVyZWwgPSAoKEVsZl9FeHRlcm5hbF9SZWwgKikgb3V0cHV0X3JlbF9oZHItPmNvbnRlbnRzICsgKnJlbF9jb3VudHApOwotICAgICAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyssIGVyZWwrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0KLQkgIGlyZWwucl9vZmZzZXQgPSBpcmVsYS0+cl9vZmZzZXQ7Ci0JICBpcmVsLnJfaW5mbyA9IGlyZWxhLT5yX2luZm87Ci0JICBCRkRfQVNTRVJUIChpcmVsYS0+cl9hZGRlbmQgPT0gMCk7Ci0JICBlbGZfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZpcmVsLCBlcmVsKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotCi0gICAgICBCRkRfQVNTRVJUIChpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplCi0JCSAgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotICAgICAgZXJlbGEgPSAoKEVsZl9FeHRlcm5hbF9SZWxhICopIG91dHB1dF9yZWxfaGRyLT5jb250ZW50cyArICpyZWxfY291bnRwKTsKLSAgICAgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCBlcmVsYSsrKQotCWVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsIGlyZWxhLCBlcmVsYSk7Ci0gICAgfQotCi0gIC8qIEJ1bXAgdGhlIGNvdW50ZXIsIHNvIHRoYXQgd2Uga25vdyB3aGVyZSB0byBhZGQgdGhlIG5leHQgc2V0IG9mCi0gICAgIHJlbG9jYXRpb25zLiAgKi8KLSAgKnJlbF9jb3VudHAgKz0gaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSAvIGlucHV0X3JlbF9oZHItPnNoX2VudHNpemU7Ci19Ci0KLS8qIExpbmsgYW4gaW5wdXQgZmlsZSBpbnRvIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuICBUaGlzIGZ1bmN0aW9uCi0gICBoYW5kbGVzIGFsbCB0aGUgc2VjdGlvbnMgYW5kIHJlbG9jYXRpb25zIG9mIHRoZSBpbnB1dCBmaWxlIGF0IG9uY2UuCi0gICBUaGlzIGlzIHNvIHRoYXQgd2Ugb25seSBoYXZlIHRvIHJlYWQgdGhlIGxvY2FsIHN5bWJvbHMgb25jZSwgYW5kCi0gICBkb24ndCBoYXZlIHRvIGtlZXAgdGhlbSBpbiBtZW1vcnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBib29sZWFuICgqcmVsb2NhdGVfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCQkJCSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCQkJCSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHNpemVfdCBsb2NzeW1jb3VudDsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltczsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bWVuZDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaXN5bTsKLSAgbG9uZyAqcGluZGV4OwotICBhc2VjdGlvbiAqKnBwc2VjdGlvbjsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICByZWxvY2F0ZV9zZWN0aW9uID0KLSAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAob3V0cHV0X2JmZCktPmVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb247Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgb2JqZWN0LCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nIGhlcmU6Ci0gICAgIHdlIGRvbid0IHdhbnQgdGhlIGxvY2FsIHN5bWJvbHMsIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBzZWN0aW9uCi0gICAgIGNvbnRlbnRzLiAgKi8KLSAgaWYgKChpbnB1dF9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgaWYgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIHsKLSAgICAgIGxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gICAgICBleHRzeW1vZmYgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGV4dHN5bW9mZiA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGxvY2FsIHN5bWJvbHMuICAqLwotICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLSAgICBleHRlcm5hbF9zeW1zID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gIGVsc2UgaWYgKGxvY3N5bWNvdW50ID09IDApCi0gICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gZmluZm8tPmV4dGVybmFsX3N5bXM7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQkJbG9jc3ltY291bnQsIGlucHV0X2JmZCkKLQkgICAgICAhPSBsb2NzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU3dhcCBpbiB0aGUgbG9jYWwgc3ltYm9scyBhbmQgd3JpdGUgb3V0IHRoZSBvbmVzIHdoaWNoIHdlIGtub3cKLSAgICAgYXJlIGdvaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgbG9jc3ltY291bnQ7Ci0gIGlzeW0gPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgcGluZGV4ID0gZmluZm8tPmluZGljZXM7Ci0gIHBwc2VjdGlvbiA9IGZpbmZvLT5zZWN0aW9uczsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGlzeW0rKywgcGluZGV4KyssIHBwc2VjdGlvbisrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICppc2VjOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gb3N5bTsKLQotICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW0pOwotICAgICAgKnBpbmRleCA9IC0xOwotCi0gICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0JewotCSAgaWYgKEVMRl9TVF9CSU5EIChpc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAgIHsKLQkgICAgICAqcHBzZWN0aW9uID0gTlVMTDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGlzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQlpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKGlzeW0tPnN0X3NobmR4ID4gMCAmJiBpc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JaXNlYyA9IHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bS0+c3Rfc2huZHgpOwotICAgICAgZWxzZSBpZiAoaXN5bS0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQlpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKGlzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2hvIGtub3dzPyAgKi8KLQkgIGlzZWMgPSBOVUxMOwotCX0KLQotICAgICAgKnBwc2VjdGlvbiA9IGlzZWM7Ci0KLSAgICAgIC8qIERvbid0IG91dHB1dCB0aGUgZmlyc3QsIHVuZGVmaW5lZCwgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChlc3ltID09IGV4dGVybmFsX3N5bXMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcgYWxsIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IHRoaXMKLQkgb25lLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZXZlciBvdXRwdXQgc2VjdGlvbiBzeW1ib2xzLiAgSW5zdGVhZCwgd2UgdXNlIHRoZSBzZWN0aW9uCi0JIHN5bWJvbCBvZiB0aGUgY29ycmVzcG9uZGluZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBpZiAoRUxGX1NUX1RZUEUgKGlzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgZGlzY2FyZGluZyBhbGwgbG9jYWwgc3ltYm9scywgd2UgZG9uJ3Qgd2FudCB0bwotCSBvdXRwdXQgdGhpcyBvbmUuICBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQKLQkgZmlsZSwgdGhlbiBzb21lIG9mIHRoZSBsb2NhbCBzeW1ib2xzIG1heSBiZSByZXF1aXJlZCBieQotCSByZWxvY3M7IHdlIG91dHB1dCB0aGVtIGJlbG93IGFzIHdlIGRpc2NvdmVyIHRoYXQgdGhleSBhcmUKLQkgbmVlZGVkLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhIHNlY3Rpb24gd2hpY2ggd2UgYXJlCi0gICAgICAgICBkaXNjYXJkaW5nLCB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgaXQsIGJ1dCBub3RlIHRoYXQKLSAgICAgICAgIGxpbmtlcl9tYXJrIGlzIG9ubHkgcmVsaWFibGUgZm9yIHNlY3Rpb25zIHRoYXQgaGF2ZSBjb250ZW50cy4KLSAgICAgICAgIEZvciB0aGUgYmVuZWZpdCBvZiB0aGUgTUlQUyBFTEYgbGlua2VyLCB3ZSBjaGVjayBTRUNfRVhDTFVERQotICAgICAgICAgYXMgd2VsbCBhcyBsaW5rZXJfbWFyay4gICovCi0gICAgICBpZiAoaXN5bS0+c3Rfc2huZHggPiAwCi0JICAmJiBpc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUKLQkgICYmIGlzZWMgIT0gTlVMTAotCSAgJiYgKCghIGlzZWMtPmxpbmtlcl9tYXJrICYmIChpc2VjLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICAgICAgfHwgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCQkgICYmIChpc2VjLT5mbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCSAgICAgIGlzeW0tPnN0X25hbWUpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFNlZSBpZiB3ZSBhcmUgZGlzY2FyZGluZyBzeW1ib2xzIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgICAgIGlmICgoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpCi0JICAgICAgID09IE5VTEwpKQotCSAgfHwgKGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbAotCSAgICAgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGFyZSBnb2luZyB0byBvdXRwdXQgdGhpcyBzeW1ib2wuICAqLwotCi0gICAgICBvc3ltID0gKmlzeW07Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgc2VjdGlvbiBpbmRleCBmb3IgdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIG9zeW0uc3Rfc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKG91dHB1dF9iZmQsCi0JCQkJCQkJIGlzZWMtPm91dHB1dF9zZWN0aW9uKTsKLSAgICAgIGlmIChvc3ltLnN0X3NobmR4ID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAqcGluZGV4ID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgICAgIC8qIEVMRiBzeW1ib2xzIGluIHJlbG9jYXRlYWJsZSBmaWxlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZSwgYnV0Ci0JIGluIGV4ZWN1dGFibGUgZmlsZXMgdGhleSBhcmUgdmlydHVhbCBhZGRyZXNzZXMuICBOb3RlIHRoYXQKLQkgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBhbGwgRUxGIHNlY3Rpb25zIGhhdmUgYW4gYXNzb2NpYXRlZAotCSBCRkQgc2VjdGlvbiB3aXRoIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3Igb3V0cHV0X29mZnNldDsgYmVsb3cKLQkgd2UgYXNzdW1lIHRoYXQgdGhleSBhbHNvIGhhdmUgYSByZWFzb25hYmxlIHZhbHVlIGZvcgotCSBvdXRwdXRfc2VjdGlvbi4gIEFueSBzcGVjaWFsIHNlY3Rpb25zIG11c3QgYmUgc2V0IHVwIHRvIG1lZXQKLQkgdGhlc2UgcmVxdWlyZW1lbnRzLiAgKi8KLSAgICAgIG9zeW0uc3RfdmFsdWUgKz0gaXNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0Jb3N5bS5zdF92YWx1ZSArPSBpc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgbmFtZSwgJm9zeW0sIGlzZWMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc2VjdGlvbi4gICovCi0gIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCi0gICAgICBpZiAoISBvLT5saW5rZXJfbWFyaykKLQl7Ci0JICAvKiBUaGlzIHNlY3Rpb24gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICB8fCAoby0+X3Jhd19zaXplID09IDAgJiYgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMCkKLQl7Ci0JICAvKiBTZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0JICAgICBvciBzb21lc3VjaC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24uICBUaGV5IGhhdmUgYmVlbiBjYWNoZWQgYnkgYQotICAgICAgICAgcmVsYXhhdGlvbiByb3V0aW5lLiAgTm90ZSB0aGF0IG8gaXMgYSBzZWN0aW9uIGluIGFuIGlucHV0Ci0gICAgICAgICBmaWxlLCBzbyB0aGUgY29udGVudHMgZmllbGQgd2lsbCBub3QgaGF2ZSBiZWVuIHNldCBieSBhbnkgb2YKLSAgICAgICAgIHRoZSByb3V0aW5lcyB3aGljaCB3b3JrIG9uIG91dHB1dCBmaWxlcy4gICovCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgY29udGVudHMgPSBmaW5mby0+Y29udGVudHM7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgbywgY29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBvLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0KLQkgIC8qIEdldCB0aGUgc3dhcHBlZCByZWxvY3MuICAqLwotCSAgaW50ZXJuYWxfcmVsb2NzID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKLQkJCSAgICAgKGlucHV0X2JmZCwgbywgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkJCSAgICAgIGZpbmZvLT5pbnRlcm5hbF9yZWxvY3MsIGZhbHNlKSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwKLQkgICAgICAmJiBvLT5yZWxvY19jb3VudCA+IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogUmVsb2NhdGUgdGhlIHNlY3Rpb24gYnkgaW52b2tpbmcgYSBiYWNrIGVuZCByb3V0aW5lLgotCi0JICAgICBUaGUgYmFjayBlbmQgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0aW5nIHRoZQotCSAgICAgc2VjdGlvbiBjb250ZW50cyBhcyBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MKLQkgICAgIGFuZCBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlCi0JICAgICByZWxvYyBhZGRlbmQgYXMgbmVjZXNzYXJ5LgotCi0JICAgICBUaGUgYmFjayBlbmQgcm91dGluZSBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcKLQkgICAgIHRoZSByZWxvYyBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLQkgICAgIFRoZSBiYWNrIGVuZCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbgotCSAgICAgaW50ZXJuYWwgc3ltYm9scywgYW5kIGNhbiBhY2Nlc3MgdGhlIGhhc2ggdGFibGUgZW50cmllcwotCSAgICAgZm9yIHRoZSBleHRlcm5hbCBzeW1ib2xzIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotCSAgICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZSBiYWNrIGVuZCByb3V0aW5lCi0JICAgICBtdXN0IGhhbmRsZSBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUKLQkgICAgIG91dHB1dCBzeW1ib2wgaXMgZ29pbmcgdG8gYmUgYSBzZWN0aW9uIHN5bWJvbAotCSAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0IHNlY3Rpb24sIHdoaWNoIHdpbGwgcmVxdWlyZQotCSAgICAgdGhlIGFkZGVuZCB0byBiZSBhZGp1c3RlZC4gICovCi0KLQkgIGlmICghICgqcmVsb2NhdGVfc2VjdGlvbikgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCSAgICAgaW5wdXRfYmZkLCBvLCBjb250ZW50cywKLQkJCQkgICAgIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgIGZpbmZvLT5pbnRlcm5hbF9zeW1zLAotCQkJCSAgICAgZmluZm8tPnNlY3Rpb25zKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFlbmQ7Ci0JICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaW5wdXRfcmVsX2hkcjsKLQotCSAgICAgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCi0KLQkgICAgICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBpcmVsYWVuZCA9IGlyZWxhICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgcmVsX2hhc2ggPSAoZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfaGFzaGVzCi0JCQkgICsgZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQpOwotCSAgICAgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCByZWxfaGFzaCsrKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQkJICBFbGZfSW50ZXJuYWxfU3ltICppc3ltOwotCQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkJICBpcmVsYS0+cl9vZmZzZXQgKz0gby0+b3V0cHV0X29mZnNldDsKLQotCQkgIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChpcmVsYS0+cl9pbmZvKTsKLQotCQkgIGlmIChyX3N5bW5keCA9PSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAocl9zeW1uZHggPj0gbG9jc3ltY291bnQKLQkJICAgICAgfHwgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpCi0JCQkgICYmIGZpbmZvLT5zZWN0aW9uc1tyX3N5bW5keF0gPT0gTlVMTCkpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpyaDsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbC4gIFdlCi0JCQkgaGF2ZSBub3QgeWV0IG91dHB1dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMsIHNvCi0JCQkgd2UgZG8gbm90IGtub3cgdGhlIHN5bWJvbCBpbmRleCBvZiBhbnkgZ2xvYmFsCi0JCQkgc3ltYm9sLiAgV2Ugc2V0IHRoZSByZWxfaGFzaCBlbnRyeSBmb3IgdGhpcwotCQkJIHJlbG9jIHRvIHBvaW50IHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeQotCQkJIGZvciB0aGlzIHN5bWJvbC4gIFRoZSBzeW1ib2wgaW5kZXggaXMgdGhlbgotCQkJIHNldCBhdCB0aGUgZW5kIG9mIGVsZl9iZmRfZmluYWxfbGluay4gICovCi0JCSAgICAgIGluZHggPSByX3N5bW5keCAtIGV4dHN5bW9mZjsKLQkJICAgICAgcmggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkJICAgICAgd2hpbGUgKHJoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkJICAgICB8fCByaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJCXJoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIHJoLT5yb290LnUuaS5saW5rOwotCi0JCSAgICAgIC8qIFNldHRpbmcgdGhlIGluZGV4IHRvIC0yIHRlbGxzCi0JCQkgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSB0aGF0IHRoaXMgc3ltYm9sIGlzCi0JCQkgdXNlZCBieSBhIHJlbG9jLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAocmgtPmluZHggPCAwKTsKLQkJICAgICAgcmgtPmluZHggPSAtMjsKLQotCQkgICAgICAqcmVsX2hhc2ggPSByaDsKLQotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLiAqLwotCi0JCSAgKnJlbF9oYXNoID0gTlVMTDsKLQkJICBpc3ltID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKLQkJICBzZWMgPSBmaW5mby0+c2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGlmIChFTEZfU1RfVFlQRSAoaXN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCSAgICB7Ci0JCSAgICAgIC8qIEkgc3VwcG9zZSB0aGUgYmFja2VuZCBvdWdodCB0byBmaWxsIGluIHRoZQotCQkJIHNlY3Rpb24gb2YgYW55IFNUVF9TRUNUSU9OIHN5bWJvbCBhZ2FpbnN0IGEKLQkJCSBwcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbi4gIElmIHdlIGhhdmUKLQkJCSBkaXNjYXJkZWQgYSBzZWN0aW9uLCB0aGUgb3V0cHV0X3NlY3Rpb24gd2lsbAotCQkJIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JCQkgICYmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLQkJCSAgICAgIHx8IChzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkJCQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjLT5vdXRwdXRfc2VjdGlvbikpKSkKLQkJCXJfc3ltbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHJfc3ltbmR4ID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkJICBCRkRfQVNTRVJUIChyX3N5bW5keCAhPSAwKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChmaW5mby0+aW5kaWNlc1tyX3N5bW5keF0gPT0gLTEpCi0JCQl7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgbGluazsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JCQkgICAgewotCQkJICAgICAgLyogWW91IGNhbid0IGRvIGxkIC1yIC1zLiAgKi8KLQkJCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCi0JCQkgIC8qIFRoaXMgc3ltYm9sIHdhcyBza2lwcGVkIGVhcmxpZXIsIGJ1dAotCQkJICAgICBzaW5jZSBpdCBpcyBuZWVkZWQgYnkgYSByZWxvYywgd2UKLQkJCSAgICAgbXVzdCBvdXRwdXQgaXQgbm93LiAgKi8KLQkJCSAgbGluayA9IHN5bXRhYl9oZHItPnNoX2xpbms7Ci0JCQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJCSAgbGluaywKLQkJCQkJCQkJICBpc3ltLT5zdF9uYW1lKTsKLQkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGlzeW0tPnN0X3NobmR4ID0KLQkJCSAgICBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKG91dHB1dF9iZmQsCi0JCQkJCQkJICAgICAgIG9zZWMpOwotCQkJICBpZiAoaXN5bS0+c3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgaXN5bS0+c3RfdmFsdWUgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQkJICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCQkJICAgIGlzeW0tPnN0X3ZhbHVlICs9IG9zZWMtPnZtYTsKLQotCQkJICBmaW5mby0+aW5kaWNlc1tyX3N5bW5keF0gPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQotCQkJICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgbmFtZSwgaXN5bSwgc2VjKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJICAgICAgcl9zeW1uZHggPSBmaW5mby0+aW5kaWNlc1tyX3N5bW5keF07Ci0JCSAgICB9Ci0KLQkJICBpcmVsYS0+cl9pbmZvID0gRUxGX1JfSU5GTyAocl9zeW1uZHgsCi0JCQkJCSAgICAgIEVMRl9SX1RZUEUgKGlyZWxhLT5yX2luZm8pKTsKLQkJfQotCi0JICAgICAgLyogU3dhcCBvdXQgdGhlIHJlbG9jcy4gICovCi0JICAgICAgaW5wdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLQkgICAgICBlbGZfbGlua19vdXRwdXRfcmVsb2NzIChvdXRwdXRfYmZkLCBvLCAKLQkJCQkgICAgICBpbnB1dF9yZWxfaGRyLAotCQkJCSAgICAgIGludGVybmFsX3JlbG9jcyk7Ci0JICAgICAgaW50ZXJuYWxfcmVsb2NzIAotCQkrPSBpbnB1dF9yZWxfaGRyLT5zaF9zaXplIC8gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZTsKLQkgICAgICBpbnB1dF9yZWxfaGRyID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyOwotCSAgICAgIGlmIChpbnB1dF9yZWxfaGRyKQotCQllbGZfbGlua19vdXRwdXRfcmVsb2NzIChvdXRwdXRfYmZkLCBvLCAKLQkJCQkJaW5wdXRfcmVsX2hkciwKLQkJCQkJaW50ZXJuYWxfcmVsb2NzKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JewotCSAgaWYgKCEgKG8tPmZsYWdzICYgU0VDX0VYQ0xVREUpICYmCi0JICAgICAgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgIChvLT5fY29va2VkX3NpemUgIT0gMAotCQkJCQkgICA/IG8tPl9jb29rZWRfc2l6ZQotCQkJCQkgICA6IG8tPl9yYXdfc2l6ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+c3RhYl9pbmZvLAotCQkgIG8sICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+c3RhYl9pbmZvLCBjb250ZW50cykpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUxGIGZpbGUuICBUaGlzIGlzIGEgcmVsb2MKLSAgIHJlcXVlc3RlZCBieSB0aGUgbGlua2VyLCBhbmQgZG9lcyBjb21lIGZyb20gYW55IGlucHV0IGZpbGUuICBUaGlzCi0gICBpcyB1c2VkIHRvIGJ1aWxkIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLVVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBsb25nIGluZHg7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBiZmRfdm1hIGFkZGVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaF9wdHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gIHJlbF9oYXNoX3B0ciA9IChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oYXNoZXMKLQkJICArIGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50KTsKLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBpbmR4ID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIEJGRF9BU1NFUlQgKGluZHggIT0gMCk7Ci0gICAgICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMgdGhvdWdoIGl0IHdlcmUKLSAgICAgICAgIGFjdHVhbGx5IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIHNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBpbmR4ID0gc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCSAgLyogSXQgc2VlbXMgdGhhdCB3ZSBvdWdodCB0byBhZGQgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUKLSAgICAgICAgICAgICBhZGRlbmQgaGVyZSwgYnV0IGluIHByYWN0aWNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQKLSAgICAgICAgICAgICBiZWNhdXNlIGl0IHdhcyBwYXNzZWQgdG8gY29uc3RydWN0b3JfY2FsbGJhY2suICAqLwotCSAgYWRkZW5kICs9IHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCX0KLSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICAvKiBTZXR0aW5nIHRoZSBpbmRleCB0byAtMiB0ZWxscyBlbGZfbGlua19vdXRwdXRfZXh0c3ltIHRoYXQKLQkgICAgIHRoaXMgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCi0JICBoLT5pbmR4ID0gLTI7Ci0JICAqcmVsX2hhc2hfcHRyID0gaDsKLQkgIGluZHggPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5keCA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGFuIGlucGxhY2UgcmVsb2MsIHdlIG11c3Qgd3JpdGUgdGhlIGFkZGVuZCBpbnRvIHRoZQotICAgICBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlICYmIGFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLCBhZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChpbmZvLAotCQkgIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgPyBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCSAgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgaG93dG8tPm5hbWUsIGFkZGVuZCwgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJICAoYmZkX3ZtYSkgMCkpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbiwgKFBUUikgYnVmLAotCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsIHNpemUpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGlmICghIG9rKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgYSByZWxvYyBpcyByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbiBpbiBhCi0gICAgIHJlbG9jYXRlYWJsZSBmaWxlLCBhbmQgaXMgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYW4gZXhlY3V0YWJsZQotICAgICBmaWxlLiAgKi8KLSAgb2Zmc2V0ID0gbGlua19vcmRlci0+b2Zmc2V0OwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgb2Zmc2V0ICs9IG91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHI7Ci0KLSAgaWYgKHJlbF9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOwotCi0gICAgICBpcmVsLnJfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgaXJlbC5yX2luZm8gPSBFTEZfUl9JTkZPIChpbmR4LCBob3d0by0+dHlwZSk7Ci0gICAgICBlcmVsID0gKChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbF9oZHItPmNvbnRlbnRzCi0JICAgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudCk7Ci0gICAgICBlbGZfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZpcmVsLCBlcmVsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQotICAgICAgaXJlbGEucl9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICBpcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPIChpbmR4LCBob3d0by0+dHlwZSk7Ci0gICAgICBpcmVsYS5yX2FkZGVuZCA9IGFkZGVuZDsKLSAgICAgIGVyZWxhID0gKChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxfaGRyLT5jb250ZW50cwotCSAgICAgICArIGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50KTsKLSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZpcmVsYSwgZXJlbGEpOwotICAgIH0KLQotICArK2VsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBBbGxvY2F0ZSBhIHBvaW50ZXIgdG8gbGl2ZSBpbiBhIGxpbmtlciBjcmVhdGVkIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1lbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIGxzZWN0LCBoLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci17Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9IE5VTEw7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfc2VjdGlvbl9wdHI7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTs7Ci0KLSAgQkZEX0FTU0VSVCAobHNlY3QgIT0gTlVMTCk7Ci0KLSAgLyogSXMgdGhpcyBhIGdsb2JhbCBzeW1ib2w/ICovCi0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgLyogSGFzIHRoaXMgc3ltYm9sIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGlmIHNvLCBvdXIgd29yayBpcyBkb25lICovCi0gICAgICBpZiAoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChoLT5saW5rZXJfc2VjdGlvbl9wb2ludGVyLAotCQkJCQkJcmVsLT5yX2FkZGVuZCwKLQkJCQkJCWxzZWN0LT53aGljaCkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSAmaC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlcjsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAobHNlY3QtPnJlbF9zZWN0aW9uKQotCWxzZWN0LT5yZWxfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpOwotICAgIH0KLQotICBlbHNlICAvKiBBbGxvY2F0aW9uIG9mIGEgcG9pbnRlciB0byBhIGxvY2FsIHN5bWJvbCAqLwotICAgIHsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqcHRyID0gZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChhYmZkKTsKLQotICAgICAgLyogQWxsb2NhdGUgYSB0YWJsZSB0byBob2xkIHRoZSBsb2NhbCBzeW1ib2xzIGlmIGZpcnN0IHRpbWUgKi8KLSAgICAgIGlmICghcHRyKQotCXsKLQkgIHVuc2lnbmVkIGludCBudW1fc3ltYm9scyA9IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JICBwdHIgPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKiopCi0JICAgIGJmZF9hbGxvYyAoYWJmZCwgbnVtX3N5bWJvbHMgKiBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopKTsKLQotCSAgaWYgKCFwdHIpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChhYmZkKSA9IHB0cjsKLQkgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgaSsrKQotCSAgICBwdHJbaV0gPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikwOwotCX0KLQotICAgICAgLyogSGFzIHRoaXMgc3ltYm9sIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGlmIHNvLCBvdXIgd29yayBpcyBkb25lICovCi0gICAgICBpZiAoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChwdHJbcl9zeW1uZHhdLAotCQkJCQkJcmVsLT5yX2FkZGVuZCwKLQkJCQkJCWxzZWN0LT53aGljaCkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSAmcHRyW3Jfc3ltbmR4XTsKLQotICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQl7Ci0JICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLQkgICAgIG91dHB1dCBhIFJfPHh4eD5fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLQkgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCSAgQkZEX0FTU0VSVCAobHNlY3QtPnJlbF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbHNlY3QtPnJlbF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSk7Ci0JfQotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBwb2ludGVyIGluIHRoZSBsaW5rZXIgc2VjdGlvbiwgYW5kIGFsbG9jYXRlIGEgbmV3IHBvaW50ZXIgcmVjb3JkCi0gICAgIGZyb20gaW50ZXJuYWwgbWVtb3J5LiAgKi8KLSAgQkZEX0FTU0VSVCAocHRyX2xpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKLSAgbGlua2VyX3NlY3Rpb25fcHRyID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190KSk7Ci0KLSAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+bmV4dCA9ICpwdHJfbGlua2VyX3NlY3Rpb25fcHRyOwotICBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+d2hpY2ggPSBsc2VjdC0+d2hpY2g7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3AgPSBmYWxzZTsKLSAgKnB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSBsaW5rZXJfc2VjdGlvbl9wdHI7Ci0KLSNpZiAwCi0gIGlmIChsc2VjdC0+aG9sZV9zaXplICYmIGxzZWN0LT5ob2xlX29mZnNldCA8IGxzZWN0LT5tYXhfaG9sZV9vZmZzZXQpCi0gICAgewotICAgICAgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQgPSBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplIC0gbHNlY3QtPmhvbGVfc2l6ZSArIChBUkNIX1NJWkUgLyA4KTsKLSAgICAgIGxzZWN0LT5ob2xlX29mZnNldCArPSBBUkNIX1NJWkUgLyA4OwotICAgICAgbHNlY3QtPnN5bV9vZmZzZXQgICs9IEFSQ0hfU0laRSAvIDg7Ci0gICAgICBpZiAobHNlY3QtPnN5bV9oYXNoKQkvKiBCdW1wIHVwIHN5bWJvbCB2YWx1ZSBpZiBuZWVkZWQgKi8KLQl7Ci0JICBsc2VjdC0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUgKz0gQVJDSF9TSVpFIC8gODsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQnVtcCB1cCAlcyBieSAlbGQsIGN1cnJlbnQgdmFsdWUgPSAlbGRcbiIsCi0JCSAgIGxzZWN0LT5zeW1faGFzaC0+cm9vdC5yb290LnN0cmluZywKLQkJICAgKGxvbmcpQVJDSF9TSVpFIC8gOCwKLQkJICAgKGxvbmcpbHNlY3QtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0ID0gbHNlY3QtPnNlY3Rpb24tPl9yYXdfc2l6ZTsKLQotICBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplICs9IEFSQ0hfU0laRSAvIDg7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJDcmVhdGUgcG9pbnRlciBpbiBsaW5rZXIgc2VjdGlvbiAlcywgb2Zmc2V0ID0gJWxkLCBzZWN0aW9uIHNpemUgPSAlbGRcbiIsCi0JICAgbHNlY3QtPm5hbWUsIChsb25nKWxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0LCAobG9uZylsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBiZmRfcHV0X3B0cihCRkQsVkFMLEFERFIpIGJmZF9wdXRfNjQgKEJGRCwgVkFMLCBBRERSKQotI2VuZGlmCi0jaWYgQVJDSF9TSVpFPT0zMgotI2RlZmluZSBiZmRfcHV0X3B0cihCRkQsVkFMLEFERFIpIGJmZF9wdXRfMzIgKEJGRCwgVkFMLCBBRERSKQotI2VuZGlmCi0KLS8qIEZpbGwgaW4gdGhlIGFkZHJlc3MgZm9yIGEgcG9pbnRlciBnZW5lcmF0ZWQgaW4gYWxpbmtlciBzZWN0aW9uLiAgKi8KLQotYmZkX3ZtYQotZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sIGxzZWN0LCBoLCByZWxvY2F0aW9uLCByZWwsIHJlbGF0aXZlX3JlbG9jKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBpbnQgcmVsYXRpdmVfcmVsb2M7Ci17Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfc2VjdGlvbl9wdHI7Ci0KLSAgQkZEX0FTU0VSVCAobHNlY3QgIT0gTlVMTCk7Ci0KLSAgaWYgKGggIT0gTlVMTCkJCS8qIGdsb2JhbCBzeW1ib2wgKi8KLSAgICB7Ci0gICAgICBsaW5rZXJfc2VjdGlvbl9wdHIgPSBfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGgtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXIsCi0JCQkJCQkJCSByZWwtPnJfYWRkZW5kLAotCQkJCQkJCQkgbHNlY3QtPndoaWNoKTsKLQotICAgICAgQkZEX0FTU0VSVCAobGlua2VyX3NlY3Rpb25fcHRyICE9IE5VTEwpOwotCi0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIGluZm8tPnN5bWJvbGljCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JewotCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0JICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSAgICAgbG9jYWxseS4gIFdlIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZQotCSAgICAgZ2xvYmFsIHNlY3Rpb24uCi0KLQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLjx4eHg+Ci0JICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCSAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wKQotCSAgICB7Ci0JICAgICAgbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF9wdHIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24gKyBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCwKLQkJCSAgbHNlY3QtPnNlY3Rpb24tPmNvbnRlbnRzICsgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQkJCQkvKiBsb2NhbCBzeW1ib2wgKi8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZCkgIT0gTlVMTCk7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZClbcl9zeW1uZHhdICE9IE5VTEwpOwotICAgICAgbGlua2VyX3NlY3Rpb25fcHRyID0gX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZClbcl9zeW1uZHhdLAotCQkJCQkJCQkgcmVsLT5yX2FkZGVuZCwKLQkJCQkJCQkJIGxzZWN0LT53aGljaCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGxpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKLQotICAgICAgLyogV3JpdGUgb3V0IHBvaW50ZXIgaWYgaXQgaGFzbid0IGJlZW4gcmV3cml0dGVuIG91dCBiZWZvcmUgKi8KLSAgICAgIGlmICghbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCkKLQl7Ci0JICBsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wID0gdHJ1ZTsKLQkgIGJmZF9wdXRfcHRyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQsCi0JCSAgICAgICBsc2VjdC0+c2VjdGlvbi0+Y29udGVudHMgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc3JlbCA9IGxzZWN0LT5yZWxfc2VjdGlvbjsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVsYXRpdmUgcmVsb2MgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JICAgICAgaWYgKCFzcmVsKQotCQlsc2VjdC0+cmVsX3NlY3Rpb24gPSBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkJCQkgICAgIGxzZWN0LT5yZWxfbmFtZSk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKGxzZWN0LT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICsgbHNlY3QtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCQkgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7Ci0JICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKDAsIHJlbGF0aXZlX3JlbG9jKTsKLQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgKCgoRWxmX0V4dGVybmFsX1JlbGEgKikKLQkJCQkgICAgIGxzZWN0LT5zZWN0aW9uLT5jb250ZW50cykKLQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChsc2VjdC0+c2VjdGlvbiktPnJlbF9jb3VudCkpOwotCSAgICAgICsrZWxmX3NlY3Rpb25fZGF0YSAobHNlY3QtPnNlY3Rpb24pLT5yZWxfY291bnQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJlbG9jYXRpb24gPSAobHNlY3QtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldAotCQktIGxzZWN0LT5ob2xlX29mZnNldAotCQktIGxzZWN0LT5zeW1fb2Zmc2V0KTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIkZpbmlzaCBwb2ludGVyIGluIGxpbmtlciBzZWN0aW9uICVzLCBvZmZzZXQgPSAlbGQgKDB4JWx4KVxuIiwKLQkgICBsc2VjdC0+bmFtZSwgKGxvbmcpcmVsb2NhdGlvbiwgKGxvbmcpcmVsb2NhdGlvbik7Ci0jZW5kaWYKLQotICAvKiBTdWJ0cmFjdCBvdXQgdGhlIGFkZGVuZCwgYmVjYXVzZSBpdCB3aWxsIGdldCBhZGRlZCBiYWNrIGluIGJ5IHRoZSBub3JtYWwKLSAgICAgcHJvY2Vzc2luZy4gICovCi0gIHJldHVybiByZWxvY2F0aW9uIC0gbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQ7Ci19Ci0MCi0vKiBHYXJiYWdlIGNvbGxlY3QgdW51c2VkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX21hcmsKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpzZWMsCi0JICAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLQkgICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKSkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2Nfc3dlZXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgYm9vbGVhbiAoKmdjX3N3ZWVwX2hvb2spCi0JICAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkJICAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zd2VlcF9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBpZHhwdHIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgb2ZmYXJnKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGR1bW15KSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBkdW1teSkpOwotCi0vKiBUaGUgbWFyayBwaGFzZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uICBGb3IgYSBnaXZlbiBzZWN0aW9uLCBtYXJrCi0gICBpdCwgYW5kIGFsbCB0aGUgc2VjdGlvbnMgd2hpY2ggZGVmaW5lIHN5bWJvbHMgdG8gd2hpY2ggaXQgcmVmZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19tYXJrIChpbmZvLCBzZWMsIGdjX21hcmtfaG9vaykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFzZWN0aW9uICogKCpnY19tYXJrX2hvb2spCi0gICAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotewotICBib29sZWFuIHJldCA9IHRydWU7Ci0KLSAgc2VjLT5nY19tYXJrID0gMTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVsb2NzLiAgKi8KLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbHN0YXJ0LCAqcmVsLCAqcmVsZW5kOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gICAgICBzaXplX3QgbmxvY3N5bXM7Ci0gICAgICBzaXplX3QgZXh0c3ltb2ZmOwotICAgICAgRWxmX0V4dGVybmFsX1N5bSAqbG9jc3ltcywgKmZyZWVzeW1zID0gTlVMTDsKLSAgICAgIGJmZCAqaW5wdXRfYmZkID0gc2VjLT5vd25lcjsKLQotICAgICAgLyogR0NGSVhNRTogaG93IHRvIGFycmFuZ2Ugc28gdGhhdCByZWxvY3MgYW5kIHN5bWJvbHMgYXJlIG5vdAotCSByZXJlYWQgY29udGludWFsbHk/ICAqLwotCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICAgICAgLyogUmVhZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0JewotCSAgbmxvY3N5bXMgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgICAgICBleHRzeW1vZmYgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlleHRzeW1vZmYgPSBubG9jc3ltcyA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMpCi0JbG9jc3ltcyA9IChFbGZfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZSBpZiAobmxvY3N5bXMgPT0gMCkKLQlsb2NzeW1zID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBsb2NzeW1zID0gZnJlZXN5bXMgPQotCSAgICBiZmRfbWFsbG9jIChubG9jc3ltcyAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpOwotCSAgaWYgKGZyZWVzeW1zID09IE5VTEwKLQkgICAgICB8fCBiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChsb2NzeW1zLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIG5sb2NzeW1zLCBpbnB1dF9iZmQpCi0JCSAgIT0gbmxvY3N5bXMgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQkgICAgewotCSAgICAgIHJldCA9IGZhbHNlOwotCSAgICAgIGdvdG8gb3V0MTsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICAqLwotICAgICAgcmVsc3RhcnQgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkgIChzZWMtPm93bmVyLCBzZWMsIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotICAgICAgaWYgKHJlbHN0YXJ0ID09IE5VTEwpCi0JewotCSAgcmV0ID0gZmFsc2U7Ci0JICBnb3RvIG91dDE7Ci0JfQotICAgICAgcmVsZW5kID0gcmVsc3RhcnQgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBmb3IgKHJlbCA9IHJlbHN0YXJ0OyByZWwgPCByZWxlbmQ7IHJlbCsrKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0JICBhc2VjdGlvbiAqcnNlYzsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgRWxmX0ludGVybmFsX1N5bSBzOwotCi0JICByX3N5bW5keCA9IEVMRl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZWxmX2JhZF9zeW10YWIgKHNlYy0+b3duZXIpKQotCSAgICB7Ci0JICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsICZsb2NzeW1zW3Jfc3ltbmR4XSwgJnMpOwotCSAgICAgIGlmIChFTEZfU1RfQklORCAocy5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpCi0JICAgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgTlVMTCwgJnMpOwotCSAgICAgIGVsc2UKLQkJewotCSAgICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0JICAgICAgICAgIHJzZWMgPSAoKmdjX21hcmtfaG9vaykoc2VjLT5vd25lciwgaW5mbywgcmVsLCBoLCBOVUxMKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyX3N5bW5keCA+PSBubG9jc3ltcykKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXTsKLQkgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgaCwgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCAmbG9jc3ltc1tyX3N5bW5keF0sICZzKTsKLQkgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgTlVMTCwgJnMpOwotCSAgICB9Ci0KLQkgIGlmIChyc2VjICYmICFyc2VjLT5nY19tYXJrKQotCSAgICBpZiAoIWVsZl9nY19tYXJrIChpbmZvLCByc2VjLCBnY19tYXJrX2hvb2spKQotCSAgICAgIHsKLQkJcmV0ID0gZmFsc2U7Ci0JCWdvdG8gb3V0MjsKLQkgICAgICB9Ci0JfQotCi0gICAgb3V0MjoKLSAgICAgIGlmICghaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAocmVsc3RhcnQpOwotICAgIG91dDE6Ci0gICAgICBpZiAoZnJlZXN5bXMpCi0JZnJlZSAoZnJlZXN5bXMpOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgc3dlZXAgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgUmVtb3ZlIGFsbCBnYXJiYWdlIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zd2VlcCAoaW5mbywgZ2Nfc3dlZXBfaG9vaykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKCpnY19zd2VlcF9ob29rKQotICAgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCQljb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci17Ci0gIGJmZCAqc3ViOwotCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIC8qIEtlZXAgc3BlY2lhbCBzZWN0aW9ucy4gIEtlZXAgLmRlYnVnIHNlY3Rpb25zLiAgKi8KLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpCi0JICAgICAgfHwgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykpCi0JICAgIG8tPmdjX21hcmsgPSAxOwotCi0JICBpZiAoby0+Z2NfbWFyaykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNraXAgc3dlZXBpbmcgc2VjdGlvbnMgYWxyZWFkeSBleGNsdWRlZC4gICovCi0JICBpZiAoby0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNpbmNlIHRoaXMgaXMgZWFybHkgaW4gdGhlIGxpbmsgcHJvY2VzcywgaXQgaXMgc2ltcGxlCi0JICAgICB0byByZW1vdmUgYSBzZWN0aW9uIGZyb20gdGhlIG91dHB1dC4gICovCi0JICBvLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQotCSAgLyogQnV0IHdlIGFsc28gaGF2ZSB0byB1cGRhdGUgc29tZSBvZiB0aGUgcmVsb2NhdGlvbgotCSAgICAgaW5mbyB3ZSBjb2xsZWN0ZWQgYmVmb3JlLiAgKi8KLQkgIGlmIChnY19zd2VlcF9ob29rCi0JICAgICAgJiYgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAmJiBvLT5yZWxvY19jb3VudCA+IDApCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGJvb2xlYW4gcjsKLQotCSAgICAgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkJIChvLT5vd25lciwgbywgTlVMTCwgTlVMTCwgaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHIgPSAoKmdjX3N3ZWVwX2hvb2spKG8tPm93bmVyLCBpbmZvLCBvLCBpbnRlcm5hbF9yZWxvY3MpOwotCi0JICAgICAgaWYgKCFpbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgICAgIGlmICghcikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBSZW1vdmUgdGhlIHN5bWJvbHMgdGhhdCB3ZXJlIGluIHRoZSBzd2VwdCBzZWN0aW9ucyBmcm9tIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZS4gIEdDRklYTUU6IEFueW9uZSBrbm93IGhvdyB0byBnZXQgdGhlbSBvdXQgb2YgdGhlCi0gICAgIHN0YXRpYyBzeW1ib2wgdGFibGUgYXMgd2VsbD8gICovCi0gIHsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgZWxmX2djX3N3ZWVwX3N5bWJvbCwKLQkJCSAgICAoUFRSKSAmaSk7Ci0KLSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0gaTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTd2VlcCBzeW1ib2xzIGluIHN3ZXB0IHNlY3Rpb25zLiAgQ2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zd2VlcF9zeW1ib2wgKGgsIGlkeHB0cikKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZHhwdHI7Ci17Ci0gIGludCAqaWR4ID0gKGludCAqKSBpZHhwdHI7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICYmICgoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICB8fCBoLT5yb290LnUuZGVmLnNlY3Rpb24tPmdjX21hcmspKQotICAgIGgtPmR5bmluZHggPSAoKmlkeCkrKzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJvcG9nYXRlIGNvbGxlY3RlZCB2dGFibGUgaW5mb3JtYXRpb24uICBUaGlzIGlzIGNhbGxlZCB0aHJvdWdoCi0gICBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCAoaCwgb2twKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9rcDsKLXsKLSAgLyogVGhvc2UgdGhhdCBhcmUgbm90IHZ0YWJsZXMuICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhvc2UgdnRhYmxlcyB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMsIHdlIGNhbm5vdCBtZXJnZS4gICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGJlZW4gZG9uZSwgZXhpdC4gICovCi0gIGlmIChoLT52dGFibGVfZW50cmllc191c2VkICYmIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbLTFdKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgcGFyZW50J3MgdGFibGUgaXMgdXAgdG8gZGF0ZS4gICovCi0gIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCAoaC0+dnRhYmxlX3BhcmVudCwgb2twKTsKLQotICBpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vbmUgb2YgdGhpcyB0YWJsZSdzIGVudHJpZXMgd2VyZSByZWZlcmVuY2VkLiAgUmUtdXNlIHRoZQotCSBwYXJlbnQncyB0YWJsZS4gICovCi0gICAgICBoLT52dGFibGVfZW50cmllc191c2VkID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc19zaXplOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBuOwotICAgICAgYm9vbGVhbiAqY3UsICpwdTsKLQotICAgICAgLyogT3IgdGhlIHBhcmVudCdzIGVudHJpZXMgaW50byBvdXJzLiAgKi8KLSAgICAgIGN1ID0gaC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGN1Wy0xXSA9IHRydWU7Ci0gICAgICBwdSA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0gICAgICBpZiAocHUgIT0gTlVMTCkKLQl7Ci0JICBuID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfc2l6ZSAvIEZJTEVfQUxJR047Ci0JICB3aGlsZSAoLS1uICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoKnB1KSAqY3UgPSB0cnVlOwotCSAgICAgIHB1KyssIGN1Kys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcyAoaCwgb2twKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9rcDsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSBoc3RhcnQsIGhlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxzdGFydCwgKnJlbGVuZCwgKnJlbDsKLQotICAvKiBUYWtlIGNhcmUgb2YgYm90aCB0aG9zZSBzeW1ib2xzIHRoYXQgZG8gbm90IGRlc2NyaWJlIHZ0YWJsZXMgYXMKLSAgICAgd2VsbCBhcyB0aG9zZSB0aGF0IGFyZSBub3QgbG9hZGVkLiAgKi8KLSAgaWYgKGgtPnZ0YWJsZV9wYXJlbnQgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0KLSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICBoc3RhcnQgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICBoZW5kID0gaHN0YXJ0ICsgaC0+c2l6ZTsKLQotICByZWxzdGFydCA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JICAgICAgKHNlYy0+b3duZXIsIHNlYywgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIHRydWUpKTsKLSAgaWYgKCFyZWxzdGFydCkKLSAgICByZXR1cm4gKihib29sZWFuICopb2twID0gZmFsc2U7Ci0gIHJlbGVuZCA9IHJlbHN0YXJ0ICsgc2VjLT5yZWxvY19jb3VudDsKLQotICBmb3IgKHJlbCA9IHJlbHN0YXJ0OyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIGlmIChyZWwtPnJfb2Zmc2V0ID49IGhzdGFydCAmJiByZWwtPnJfb2Zmc2V0IDwgaGVuZCkKLSAgICAgIHsKLQkvKiBJZiB0aGUgZW50cnkgaXMgaW4gdXNlLCBkbyBub3RoaW5nLiAgKi8KLQlpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZAotCSAgICAmJiAocmVsLT5yX29mZnNldCAtIGhzdGFydCkgPCBoLT52dGFibGVfZW50cmllc19zaXplKQotCSAgewotCSAgICBiZmRfdm1hIGVudHJ5ID0gKHJlbC0+cl9vZmZzZXQgLSBoc3RhcnQpIC8gRklMRV9BTElHTjsKLQkgICAgaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbZW50cnldKQotCSAgICAgIGNvbnRpbnVlOwotCSAgfQotCS8qIE90aGVyd2lzZSwga2lsbCBpdC4gICovCi0JcmVsLT5yX29mZnNldCA9IHJlbC0+cl9pbmZvID0gcmVsLT5yX2FkZGVuZCA9IDA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERvIG1hcmsgYW5kIHN3ZWVwIG9mIHVudXNlZCBzZWN0aW9ucy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiBvayA9IHRydWU7Ci0gIGJmZCAqc3ViOwotICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLSAgICAgICAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0KLSAgaWYgKCFnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNhbl9nY19zZWN0aW9ucwotICAgICAgfHwgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBcHBseSB0cmFuc2l0aXZlIGNsb3N1cmUgdG8gdGhlIHZ0YWJsZSBlbnRyeSB1c2FnZSBpbmZvLiAgKi8KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQsCi0JCQkgIChQVFIpICZvayk7Ci0gIGlmICghb2spCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEtpbGwgdGhlIHZ0YWJsZSByZWxvY2F0aW9ucyB0aGF0IHdlcmUgbm90IHVzZWQuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MsCi0JCQkgIChQVFIpICZvayk7Ci0gIGlmICghb2spCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdyb3ZlbCB0aHJvdWdoIHJlbG9jcyB0byBmaW5kIG91dCB3aG8gc3RheXMgLi4uICAqLwotCi0gIGdjX21hcmtfaG9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Z2NfbWFya19ob29rOwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKG8tPmZsYWdzICYgU0VDX0tFRVApCi0gIAkgICAgaWYgKCFlbGZfZ2NfbWFyayAoaW5mbywgbywgZ2NfbWFya19ob29rKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiAuLi4gYW5kIG1hcmsgU0VDX0VYQ0xVREUgZm9yIHRob3NlIHRoYXQgZ28uICAqLwotICBpZiAoIWVsZl9nY19zd2VlcChpbmZvLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdjX3N3ZWVwX2hvb2spKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIENhbGxlZCBmcm9tIGNoZWNrX3JlbG9jcyB0byByZWNvcmQgdGhlIGV4aXN0YW5jZSBvZiBhIFZUSU5IRVJJVCByZWxvYy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzZWFyY2gsICpjaGlsZDsKLSAgYmZkX3NpemVfdHlwZSBleHRzeW1jb3VudDsKLQotICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltdGFiIGhlYWRlciB0ZWxscyB1cyB3aGVyZSB0aGUKLSAgICAgZXh0ZXJuYWwgc3ltYm9scyBzdGFydC4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGxvY2FsIHN5bWJvbHMgYXQKLSAgICAgdGhpcyBwb2ludC4gICovCi0gIGV4dHN5bWNvdW50ID0gZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9zaXplL3NpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIGV4dHN5bWNvdW50IC09IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBleHRzeW1jb3VudDsKLQotICAvKiBIdW50IGRvd24gdGhlIGNoaWxkIHN5bWJvbCwgd2hpY2ggaXMgaW4gdGhpcyBzZWN0aW9uIGF0IHRoZSBzYW1lCi0gICAgIG9mZnNldCBhcyB0aGUgcmVsb2NhdGlvbi4gICovCi0gIGZvciAoc2VhcmNoID0gc3ltX2hhc2hlczsgc2VhcmNoICE9IHN5bV9oYXNoZXNfZW5kOyArK3NlYXJjaCkKLSAgICB7Ci0gICAgICBpZiAoKGNoaWxkID0gKnNlYXJjaCkgIT0gTlVMTAotCSAgJiYgKGNoaWxkLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgY2hpbGQtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBjaGlsZC0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgY2hpbGQtPnJvb3QudS5kZWYudmFsdWUgPT0gb2Zmc2V0KQotCWdvdG8gd2luOwotICAgIH0KLQotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogJXMrJWx1OiBObyBzeW1ib2wgZm91bmQgZm9yIElOSEVSSVQiLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzZWMtPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KTsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi13aW46Ci0gIGlmICghaCkKLSAgICB7Ci0gICAgICAvKiBUaGlzICpzaG91bGQqIG9ubHkgYmUgdGhlIGFic29sdXRlIHNlY3Rpb24uICBJdCBjb3VsZCBwb3RlbnRpYWxseQotCSBiZSB0aGF0IHNvbWVvbmUgaGFzIGRlZmluZWQgYSBub24tZ2xvYmFsIHZ0YWJsZSB0aG91Z2gsIHdoaWNoCi0JIHdvdWxkIGJlIGJhZC4gIEl0IGlzbid0IHdvcnRoIHBhZ2luZyBpbiB0aGUgbG9jYWwgc3ltYm9scyB0byBiZQotCSBzdXJlIHRob3VnaDsgdGhhdCBjYXNlIHNob3VsZCBzaW1wbHkgYmUgaGFuZGxlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotICAgICAgY2hpbGQtPnZ0YWJsZV9wYXJlbnQgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgLTE7Ci0gICAgfQotICBlbHNlCi0gICAgY2hpbGQtPnZ0YWJsZV9wYXJlbnQgPSBoOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsZWQgZnJvbSBjaGVja19yZWxvY3MgdG8gcmVjb3JkIHRoZSBleGlzdGFuY2Ugb2YgYSBWVEVOVFJZIHJlbG9jLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIGFkZGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGlmIChhZGRlbmQgPj0gaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSkKLSAgICB7Ci0gICAgICBzaXplX3Qgc2l6ZSwgYnl0ZXM7Ci0gICAgICBib29sZWFuICpwdHIgPSBoLT52dGFibGVfZW50cmllc191c2VkOwotCi0gICAgICAvKiBXaGlsZSB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgd2UgaGF2ZSB0byBiZSBwcmVwYXJlZCB0byBoYW5kbGUKLQkgYSB6ZXJvIHNpemUuICAqLwotICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQlzaXplID0gYWRkZW5kOwotICAgICAgZWxzZQotCXsKLQkgIHNpemUgPSBoLT5zaXplOwotCSAgaWYgKHNpemUgPCBhZGRlbmQpCi0JICAgIHsKLQkgICAgICAvKiBPb3BzISAgV2UndmUgZ290IGEgcmVmZXJlbmNlIHBhc3QgdGhlIGRlZmluZWQgZW5kIG9mCi0JCSB0aGUgdGFibGUuICBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIC0tIHNoYWxsIHdlIHdhcm4/ICAqLwotCSAgICAgIHNpemUgPSBhZGRlbmQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG9uZSBleHRyYSBlbnRyeSBmb3IgdXNlIGFzIGEgImRvbmUiIGZsYWcgZm9yIHRoZQotCSBjb25zb2xpZGF0aW9uIHBhc3MuICAqLwotICAgICAgYnl0ZXMgPSAoc2l6ZSAvIEZJTEVfQUxJR04gKyAxKSAqIHNpemVvZihib29sZWFuKTsKLQotICAgICAgaWYgKHB0cikKLQl7Ci0JICBzaXplX3Qgb2xkYnl0ZXM7Ci0KLQkgIHB0ciA9IHJlYWxsb2MgKHB0ci0xLCBieXRlcyk7Ci0JICBpZiAocHRyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2xkYnl0ZXMgPSAoaC0+dnRhYmxlX2VudHJpZXNfc2l6ZS9GSUxFX0FMSUdOICsgMSkgKiBzaXplb2YoYm9vbGVhbik7Ci0JICBtZW1zZXQgKHB0ciArIG9sZGJ5dGVzLCAwLCBieXRlcyAtIG9sZGJ5dGVzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHRyID0gY2FsbG9jICgxLCBieXRlcyk7Ci0JICBpZiAocHRyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEFuZCBhcnJhbmdlIGZvciB0aGF0IGRvbmUgZmxhZyB0byBiZSBhdCBpbmRleCAtMS4gICovCi0gICAgICBoLT52dGFibGVfZW50cmllc191c2VkID0gcHRyKzE7Ci0gICAgICBoLT52dGFibGVfZW50cmllc19zaXplID0gc2l6ZTsKLSAgICB9Ci0gIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbYWRkZW5kIC8gRklMRV9BTElHTl0gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbmQgYW4gYWNjb21wYW55aW5nIGJpdCB0byB3b3JrIG91dCBmaW5hbCBnb3QgZW50cnkgb2Zmc2V0cyBvbmNlCi0gICB3ZSdyZSBkb25lLiAgU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGZpbmFsX2xpbmsuICAqLwotCi1ib29sZWFuCi1lbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmk7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGJmZF92bWEgZ290b2ZmOwotCi0gIC8qIFRoZSBHT1Qgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSAuZ290IHNlY3Rpb24sIGJ1dCB0aGUgR09UIGhlYWRlciBpcwotICAgICBwdXQgaW50byB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgaWYgdGhlIGJhY2tlbmQgdXNlcyBpdC4gICovCi0gIGlmIChiZWQtPndhbnRfZ290X3BsdCkKLSAgICBnb3RvZmYgPSAwOwotICBlbHNlCi0gICAgZ290b2ZmID0gYmVkLT5nb3RfaGVhZGVyX3NpemU7Ci0KLSAgLyogRG8gdGhlIGxvY2FsIC5nb3QgZW50cmllcyBmaXJzdC4gICovCi0gIGZvciAoaSA9IGluZm8tPmlucHV0X2JmZHM7IGk7IGkgPSBpLT5saW5rX25leHQpCi0gICAgewotICAgICAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdCA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChpKTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaiwgbG9jc3ltY291bnQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLQotICAgICAgaWYgKCFsb2NhbF9nb3QpCi0JY29udGludWU7Ci0KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpKS0+c3ltdGFiX2hkcjsKLSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaSkpCi0JbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIGVsc2UKLQlsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBsb2NzeW1jb3VudDsgKytqKQotCXsKLQkgIGlmIChsb2NhbF9nb3Rbal0gPiAwKQotCSAgICB7Ci0JICAgICAgbG9jYWxfZ290W2pdID0gZ290b2ZmOwotCSAgICAgIGdvdG9mZiArPSBBUkNIX1NJWkUgLyA4OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGxvY2FsX2dvdFtqXSA9IChiZmRfdm1hKSAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZW4gdGhlIGdsb2JhbCAuZ290IGFuZCAucGx0IGVudHJpZXMuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cywKLQkJCSAgKFBUUikgJmdvdG9mZik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBuZWVkIGEgc3BlY2lhbCB0b3AtbGV2ZWwgbGluayByb3V0aW5lIHRvIGNvbnZlcnQgZ290IHJlZmVyZW5jZSBjb3VudHMKLSAgIHRvIHJlYWwgZ290IG9mZnNldHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzIChoLCBvZmZhcmcpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgb2ZmYXJnOwotewotICBiZmRfdm1hICpvZmYgPSAoYmZkX3ZtYSAqKSBvZmZhcmc7Ci0KLSAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0gICAgewotICAgICAgaC0+Z290Lm9mZnNldCA9IG9mZlswXTsKLSAgICAgIG9mZlswXSArPSBBUkNIX1NJWkUgLyA4OwotICAgIH0KLSAgZWxzZQotICAgIGgtPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbnkgZm9sayBuZWVkIG5vIG1vcmUgaW4gdGhlIHdheSBvZiBmaW5hbCBsaW5rIHRoYW4gdGhpcywgb25jZQotICAgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudGluZyBpcyBlbmFibGVkLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX2NvbW1vbl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoIWVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnZva2UgdGhlIHJlZ3VsYXIgRUxGIGJhY2tlbmQgbGlua2VyIHRvIGRvIGFsbCB0aGUgd29yay4gICovCi0gIHJldHVybiBlbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRob3VnaCBlbGZfbGlua19oYXNoX3RyYXZlcnNlIHRvIHN0b3JlCi0gICBhbGwgaGFzaCB2YWx1ZSBvZiB0aGUgZXhwb3J0ZWQgc3ltYm9scyBpbiBhbiBhcnJheS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfY29sbGVjdF9oYXNoX2NvZGVzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgKip2YWx1ZXAgPSAodW5zaWduZWQgbG9uZyAqKikgZGF0YTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgbG9uZyBoYTsKLSAgY2hhciAqYWxjID0gTlVMTDsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHAgPSBzdHJjaHIgKG5hbWUsIEVMRl9WRVJfQ0hSKTsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhbGMgPSBiZmRfbWFsbG9jIChwIC0gbmFtZSArIDEpOwotICAgICAgbWVtY3B5IChhbGMsIG5hbWUsIHAgLSBuYW1lKTsKLSAgICAgIGFsY1twIC0gbmFtZV0gPSAnXDAnOwotICAgICAgbmFtZSA9IGFsYzsKLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZS4gICovCi0gIGhhID0gYmZkX2VsZl9oYXNoIChuYW1lKTsKLQotICAvKiBTdG9yZSB0aGUgZm91bmQgaGFzaCB2YWx1ZSBpbiB0aGUgYXJyYXkgZ2l2ZW4gYXMgdGhlIGFyZ3VtZW50LiAgKi8KLSAgKigqdmFsdWVwKSsrID0gaGE7Ci0KLSAgLyogQW5kIHN0b3JlIGl0IGluIHRoZSBzdHJ1Y3Qgc28gdGhhdCB3ZSBjYW4gcHV0IGl0IGluIHRoZSBoYXNoIHRhYmxlCi0gICAgIGxhdGVyLiAgKi8KLSAgaC0+ZWxmX2hhc2hfdmFsdWUgPSBoYTsKLQotICBpZiAoYWxjICE9IE5VTEwpCi0gICAgZnJlZSAoYWxjKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGZ4eC10YXJnZXQuaCBiL2JmZC9lbGZ4eC10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM1ZDk1ZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmeHgtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NjEgKzAsMCBAQAotLyogVGFyZ2V0IGRlZmluaXRpb25zIGZvciBOTi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgQkZEIGtub3dzIGFib3V0IGEgdGFyZ2V0LgotICAgSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIHdoYXQgcm91dGluZXMgdG8gY2FsbAotICAgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLCBldGMuICBFdmVyeSBCRkQgcG9pbnRzIHRvIGEgdGFyZ2V0IHN0cnVjdHVyZQotICAgd2l0aCBpdHMgInh2ZWMiIG1lbWJlci4KLQotICAgVGhlcmUgYXJlIHR3byBzdWNoIHN0cnVjdHVyZXMgaGVyZTogIG9uZSBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcyBhbmQKLSAgIG9uZSBmb3IgbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4gICAqLwotCi0jZGVmaW5lCWJmZF9lbGZOTl9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jaWZuZGVmIGJmZF9lbGZOTl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX3JlbG9jCV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2lmbmRlZiBiZmRfZWxmTk5fZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZk5OX2ZpbmRfbmVhcmVzdF9saW5lCV9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX3JlYWRfbWluaXN5bWJvbHMJX2JmZF9lbGZfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBiZmRfZWxmTk5fbWluaXN5bWJvbF90b19zeW1ib2wJX2JmZF9lbGZfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9saW5lbm8JCV9iZmRfZWxmX2dldF9saW5lbm8KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltYm9sX2luZm8JX2JmZF9lbGZfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltdGFiCQlfYmZkX2VsZl9nZXRfc3ltdGFiCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNpZiAwIC8qIGRvbmUgaW4gZWxmLWJmZC5oICovCi0jZGVmaW5lIGJmZF9lbGZOTl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9tYWtlX2VtcHR5X3N5bWJvbAlfYmZkX2VsZl9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBiZmRfZWxmTk5fbmV3X3NlY3Rpb25faG9vawlfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIGJmZF9lbGZOTl9zZXRfYXJjaF9tYWNoCQlfYmZkX2VsZl9zZXRfYXJjaF9tYWNoCi0jaWZuZGVmIGJmZF9lbGZOTl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2RlZmluZSBiZmRfZWxmTk5fc2l6ZW9mX2hlYWRlcnMJX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX29iamVjdF9jb250ZW50cyBfYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCAoYmZkX3ZtYSkgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQgMgotI2VuZGlmCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CWJmZF92b2lkCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19lbmQJYmZkX3ZvaWQKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJKFBST1RPKHZvaWQsKCopLChiZmQqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJTlVMTAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2djX3NlY3Rpb25zIF9iZmRfZWxmTk5fZ2Nfc2VjdGlvbnMKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZW5kaWYKLQotI2lmZGVmIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNlbHNlIC8qICEgZGVmaW5lZCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikgKi8KLS8qIElmIG5vIGJhY2tlbmQgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLCB1c2UgdGhlIGdlbmVyaWMgbGlua2VyLiAgKi8KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19hZGRfc3ltYm9scwlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfZmluYWxfbGluawotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2ZpbmFsX2xpbmsJX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2VuZGlmIC8qICEgZGVmaW5lZCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikgKi8KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2FyY2hpdmVfcAotI2RlZmluZSBiZmRfZWxmTk5fYXJjaGl2ZV9wIGJmZF9nZW5lcmljX2FyY2hpdmVfcAotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fbWtvYmplY3QKLSNkZWZpbmUgYmZkX2VsZk5OX21rb2JqZWN0IGJmZF9lbGZfbWtvYmplY3QKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0jZGVmaW5lIGJmZF9lbGZOTl9ta2NvcmVmaWxlIGJmZF9lbGZfbWtjb3JlZmlsZQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX21rYXJjaGl2ZQotI2RlZmluZSBiZmRfZWxmTk5fbWthcmNoaXZlIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgMAotI2VuZGlmCi0KLSNpZm5kZWYgRUxGX01BWFBBR0VTSVpFCi0gICNlcnJvciBFTEZfTUFYUEFHRVNJWkUgaXMgbm90IGRlZmluZWQKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIDEKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2NvbGxlY3QKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY29sbGVjdCBmYWxzZQotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rIGZhbHNlCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMJTlVMTAotI2VuZGlmCi0KLS8qIFByZXZpb3VzbHksIGJhY2tlbmRzIGNvdWxkIG9ubHkgdXNlIFNIVF9SRUwgb3IgU0hUX1JFTEEgcmVsb2NhdGlvbgotICAgc2VjdGlvbnMsIGJ1dCBub3QgYm90aC4gIFRoZXkgZGVmaW5lZCBVU0VfUkVMIHRvIGluZGljYXRlIFNIVF9SRUwKLSAgIHNlY3Rpb25zLCBhbmQgbGVmdCBpdCB1bmRlZmluZWQgdG8gaW5kaWNhdGVkIFNIVF9SRUxBIHNlY3Rpb25zLgotICAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBzdGlsbCBzdXBwb3J0IHRoaXMgdXNhZ2UuICAqLwotI2lmbmRlZiBVU0VfUkVMCi0jZGVmaW5lIFVTRV9SRUwgMAotI2Vsc2UKLSN1bmRlZiBVU0VfUkVMCi0jZGVmaW5lIFVTRV9SRUwgMQotI2VuZGlmIAotCi0vKiBVc2UgdGhlc2UgaW4gbmV3IGNvZGUuICAqLwotI2lmbmRlZiBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbF9wIAotI2RlZmluZSBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbF9wIFVTRV9SRUwKLSNlbmRpZiAKLSNpZm5kZWYgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3AgIVVTRV9SRUwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9kZWZhdWx0X3VzZV9yZWxhX3AgCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2RlZmF1bHRfdXNlX3JlbGFfcCAhVVNFX1JFTAotI2VuZGlmCi0KLSNpZm5kZWYgRUxGX01BQ0hJTkVfQUxUMQotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxIDAKLSNlbmRpZgotCi0jaWZuZGVmIEVMRl9NQUNISU5FX0FMVDIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMiAwCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9zaXplX2luZm8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvIF9iZmRfZWxmTk5fc2l6ZV9pbmZvCi0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIF9iZmRfZWxmTk5fc2l6ZV9pbmZvOwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgZWxmTk5fYmVkID0KLXsKLSAgRUxGX0FSQ0gsCQkJLyogYXJjaCAqLwotICBFTEZfTUFDSElORV9DT0RFLAkJLyogZWxmX21hY2hpbmVfY29kZSAqLwotICBFTEZfTUFYUEFHRVNJWkUsCQkvKiBtYXhwYWdlc2l6ZSAqLwotICBlbGZfYmFja2VuZF9jb2xsZWN0LAotICBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vaywKLSAgZWxmX2luZm9fdG9faG93dG8sCi0gIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCwKLSAgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCwKLSAgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCi0gIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAotICBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotICBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sCi0gIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vaywKLSAgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCi0gIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MsCi0gIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiwKLSAgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotICBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMsCi0gIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCwKLSAgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAotICBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLAotICBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycywKLSAgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCwKLSAgRUxGX01BQ0hJTkVfQUxUMSwKLSAgRUxGX01BQ0hJTkVfQUxUMiwKLSAgJmVsZl9iYWNrZW5kX3NpemVfaW5mbywKLSAgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQsCi0gIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSwKLSAgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplLAotICBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbF9wLAotICBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcCwKLSAgZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wLAotICBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQsCi0gIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSwKLSAgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltLAotICBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCwKLSAgZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCwKLSAgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCi19OwotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfQklHX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8Ci0gICBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0RFQlVHR0lORyB8IFNFQ19FWENMVURFIHwgU0VDX1NPUlRfRU5UUklFUyksCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNCwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIGJmZF9lbGZOTl9vYmplY3RfcCwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZWxmTk5fYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgYmZkX2VsZk5OX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl9ta29iamVjdCwKLSAgICBiZmRfZWxmTk5fbWthcmNoaXZlLAotICAgIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLSAgfSwKLQotICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChiZmRfZWxmTk4pLAotI2lmZGVmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucwotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYmZkX2VsZk5OX2FyY2hpdmUpLAotI2Vsc2UKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSNlbmRpZgotICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKGJmZF9lbGZOTiksCi0KLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSAmZWxmTk5fYmVkLAotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfTElUVExFX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgbGl0dGxlIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8Ci0gICBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0RFQlVHR0lORyB8IFNFQ19FWENMVURFIHwgU0VDX1NPUlRfRU5UUklFUyksCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNCwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIGJmZF9lbGZOTl9vYmplY3RfcCwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZWxmTk5fYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgYmZkX2VsZk5OX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl9ta29iamVjdCwKLSAgICBiZmRfZWxmTk5fbWthcmNoaXZlLAotICAgIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLSAgfSwKLQotICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChiZmRfZWxmTk4pLAotI2lmZGVmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucwotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYmZkX2VsZk5OX2FyY2hpdmUpLAotI2Vsc2UKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSNlbmRpZgotICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKGJmZF9lbGZOTiksCi0KLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSAmZWxmTk5fYmVkLAotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGUtYXJtLmMgYi9iZmQvZXBvYy1wZS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMjc3YS4uMDAwMDAwMAotLS0gYS9iZmQvZXBvYy1wZS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICAgIDAKLSNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggICAgIiIKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybV9lcG9jX3BlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgImVwb2MtcGUtYXJtLWJpZyIKLQotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9lcG9jX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9lcG9jX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9hcm1fZXBvY19wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJwZS1hcm0uYyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGVpLWFybS5jIGIvYmZkL2Vwb2MtcGVpLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM0ZDhiLi4wMDAwMDAwCi0tLSBhL2JmZC9lcG9jLXBlaS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgICAgMAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAgICAiIgotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlaS1hcm0tbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAiZXBvYy1wZWktYXJtLWJpZyIKLQotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9lcG9jX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9lcG9jX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9hcm1fZXBvY19wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJwZWktYXJtLmMiCi0KZGlmZiAtLWdpdCBhL2JmZC9mb3JtYXQuYyBiL2JmZC9mb3JtYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMWY5Yy4uMDAwMDAwMAotLS0gYS9iZmQvZm9ybWF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyogR2VuZXJpYyBCRkQgc3VwcG9ydCBmb3IgZmlsZSBmb3JtYXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JRmlsZSBmb3JtYXRzCi0KLQlBIGZvcm1hdCBpcyBhIEJGRCBjb25jZXB0IG9mIGhpZ2ggbGV2ZWwgZmlsZSBjb250ZW50cyB0eXBlLiBUaGUKLQlmb3JtYXRzIHN1cHBvcnRlZCBieSBCRkQgYXJlOiAKLQotCW8gPDxiZmRfb2JqZWN0Pj4KLQotCVRoZSBCRkQgbWF5IGNvbnRhaW4gZGF0YSwgc3ltYm9scywgcmVsb2NhdGlvbnMgYW5kIGRlYnVnIGluZm8uCi0KLQlvIDw8YmZkX2FyY2hpdmU+PgotCi0JVGhlIEJGRCBjb250YWlucyBvdGhlciBCRkRzIGFuZCBhbiBvcHRpb25hbCBpbmRleC4KLQotCW8gPDxiZmRfY29yZT4+Ci0KLQlUaGUgQkZEIGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgYW4gZXhlY3V0YWJsZSBjb3JlIGR1bXAuCi0KLQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBJTVBPUlQgZnJvbSB0YXJnZXRzLmMuICAqLwotZXh0ZXJuIGNvbnN0IHNpemVfdCBfYmZkX3RhcmdldF92ZWN0b3JfZW50cmllczsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX2Zvcm1hdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NoZWNrX2Zvcm1hdChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KTsKLQotREVTQ1JJUFRJT04KLQlWZXJpZnkgaWYgdGhlIGZpbGUgYXR0YWNoZWQgdG8gdGhlIEJGRCBAdmFye2FiZmR9IGlzIGNvbXBhdGlibGUKLQl3aXRoIHRoZSBmb3JtYXQgQHZhcntmb3JtYXR9IChpLmUuLCBvbmUgb2YgPDxiZmRfb2JqZWN0Pj4sCi0JPDxiZmRfYXJjaGl2ZT4+IG9yIDw8YmZkX2NvcmU+PikuCi0KLQlJZiB0aGUgQkZEIGhhcyBiZWVuIHNldCB0byBhIHNwZWNpZmljIHRhcmdldCBiZWZvcmUgdGhlCi0JY2FsbCwgb25seSB0aGUgbmFtZWQgdGFyZ2V0IGFuZCBmb3JtYXQgY29tYmluYXRpb24gaXMKLQljaGVja2VkLiBJZiB0aGUgdGFyZ2V0IGhhcyBub3QgYmVlbiBzZXQsIG9yIGhhcyBiZWVuIHNldCB0bwotCTw8ZGVmYXVsdD4+LCB0aGVuIGFsbCB0aGUga25vd24gdGFyZ2V0IGJhY2tlbmRzIGlzCi0JaW50ZXJyb2dhdGVkIHRvIGRldGVybWluZSBhIG1hdGNoLiAgSWYgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0JbWF0Y2hlcywgaXQgaXMgdXNlZC4gIElmIG5vdCwgZXhhY3RseSBvbmUgdGFyZ2V0IG11c3QgcmVjb2duaXplCi0JdGhlIGZpbGUsIG9yIGFuIGVycm9yIHJlc3VsdHMuCi0KLQlUaGUgZnVuY3Rpb24gcmV0dXJucyA8PHRydWU+PiBvbiBzdWNjZXNzLCBvdGhlcndpc2UgPDxmYWxzZT4+Ci0Jd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczogIAotCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlpZiA8PGZvcm1hdD4+IGlzIG5vdCBvbmUgb2YgPDxiZmRfb2JqZWN0Pj4sIDw8YmZkX2FyY2hpdmU+PiBvcgotCTw8YmZkX2NvcmU+Pi4KLQotCW8gPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+PiAtCi0JaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgYSByZWFkIC0gZXZlbiBzb21lIGZpbGUgbWlzbWF0Y2hlcwotCWNhbiBjYXVzZSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGxzLgotCi0JbyA8PGZpbGVfbm90X3JlY29nbmlzZWQ+PiAtCi0Jbm9uZSBvZiB0aGUgYmFja2VuZHMgcmVjb2duaXNlZCB0aGUgZmlsZSBmb3JtYXQuCi0KLQlvIDw8YmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZD4+IC0KLQltb3JlIHRoYW4gb25lIGJhY2tlbmQgcmVjb2duaXNlZCB0aGUgZmlsZSBmb3JtYXQuCi0qLwotCi1ib29sZWFuCi1iZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBmb3JtYXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0gIHJldHVybiBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGZvcm1hdCwgTlVMTCk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQsIGNoYXIgKioqbWF0Y2hpbmcpOwotCi1ERVNDUklQVElPTgotCUxpa2UgPDxiZmRfY2hlY2tfZm9ybWF0Pj4sIGV4Y2VwdCB3aGVuIGl0IHJldHVybnMgZmFsc2Ugd2l0aAotCTw8YmZkX2Vycm5vPj4gc2V0IHRvIDw8YmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZD4+LiAgSW4gdGhhdAotCWNhc2UsIGlmIEB2YXJ7bWF0Y2hpbmd9IGlzIG5vdCBOVUxMLCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0JYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIGZvcm1hdHMgdGhhdCBtYXRjaGVkLAotCWFsbG9jYXRlZCB3aXRoIDw8bWFsbG9jPj4uCi0JVGhlbiB0aGUgdXNlciBtYXkgY2hvb3NlIGEgZm9ybWF0IGFuZCB0cnkgYWdhaW4uCi0KLQlXaGVuIGRvbmUgd2l0aCB0aGUgbGlzdCB0aGF0IEB2YXJ7bWF0Y2hpbmd9IHBvaW50cyB0bywgdGhlIGNhbGxlcgotCXNob3VsZCBmcmVlIGl0LiAgCi0qLwotCi1ib29sZWFuCi1iZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGZvcm1hdCwgbWF0Y2hpbmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci0gICAgIGNoYXIgKioqbWF0Y2hpbmc7Ci17Ci0gIGV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWM7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0LCAqc2F2ZV90YXJnLCAqcmlnaHRfdGFyZzsKLSAgY2hhciAqKm1hdGNoaW5nX3ZlY3RvciA9IE5VTEw7Ci0gIGludCBtYXRjaF9jb3VudDsKLQotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpIHx8Ci0gICAgICAoKGludCkoYWJmZC0+Zm9ybWF0KSA8IChpbnQpYmZkX3Vua25vd24pIHx8Ci0gICAgICAoKGludCkoYWJmZC0+Zm9ybWF0KSA+PSAoaW50KWJmZF90eXBlX2VuZCkpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX3Vua25vd24pCi0gICAgcmV0dXJuIChhYmZkLT5mb3JtYXQgPT0gZm9ybWF0KT8gdHJ1ZTogZmFsc2U7Ci0KLQotICAvKiBTaW5jZSB0aGUgdGFyZ2V0IHR5cGUgd2FzIGRlZmF1bHRlZCwgY2hlY2sgdGhlbSAKLSAgICAgYWxsIGluIHRoZSBob3BlIHRoYXQgb25lIHdpbGwgYmUgdW5pcXVlbHkgcmVjb2duaXplZC4gICovCi0KLSAgc2F2ZV90YXJnID0gYWJmZC0+eHZlYzsKLSAgbWF0Y2hfY291bnQgPSAwOwotICBpZiAobWF0Y2hpbmcpCi0gICAgewotICAgICAgbWF0Y2hpbmdfdmVjdG9yID0KLQkoY2hhciAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChjaGFyICopICoKLQkJCSAgICAgIChfYmZkX3RhcmdldF92ZWN0b3JfZW50cmllcyArIDEpKTsKLSAgICAgIGlmICghbWF0Y2hpbmdfdmVjdG9yKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1hdGNoaW5nX3ZlY3RvclswXSA9IE5VTEw7Ci0gICAgICAqbWF0Y2hpbmcgPSBtYXRjaGluZ192ZWN0b3I7Ci0gICAgfQotICByaWdodF90YXJnID0gMDsKLQotCi0gIC8qIHByZXN1bWUgdGhlIGFuc3dlciBpcyB5ZXMgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gZm9ybWF0OwotCi0gIC8qIElmIHRoZSB0YXJnZXQgdHlwZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIGp1c3QgY2hlY2sgdGhhdCB0YXJnZXQuICAqLwotCi0gIGlmICghYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkgewotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKTAsIFNFRUtfU0VUKSAhPSAwKQkvKiByZXdpbmQhICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmlnaHRfdGFyZyA9IEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9jaGVja19mb3JtYXQsIChhYmZkKSk7Ci0gICAgaWYgKHJpZ2h0X3RhcmcpIHsKLSAgICAgIGFiZmQtPnh2ZWMgPSByaWdodF90YXJnOwkJLyogU2V0IHRoZSB0YXJnZXQgYXMgcmV0dXJuZWQgKi8KLSAgICAgIGlmIChtYXRjaGluZykKLQlmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotICAgICAgcmV0dXJuIHRydWU7CQkJLyogRmlsZSBwb3NpdGlvbiBoYXMgbW92ZWQsIEJUVyAqLwotICAgIH0KLQotICAgIC8qIEZvciBhIGxvbmcgdGltZSB0aGUgY29kZSBoYXMgZHJvcHBlZCB0aHJvdWdoIHRvIGNoZWNrIGFsbAotICAgICAgIHRhcmdldHMgaWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgd2FzIHdyb25nLiAgSSBkb24ndCBrbm93IHdoeSwKLSAgICAgICBhbmQgSSdtIHJlbHVjdGFudCB0byBjaGFuZ2UgaXQuICBIb3dldmVyLCBpbiB0aGUgY2FzZSBvZiBhbgotICAgICAgIGFyY2hpdmUsIGl0IGNhbiBjYXVzZSBwcm9ibGVtcy4gIElmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGRvZXMKLSAgICAgICBub3QgcGVybWl0IGFyY2hpdmVzIChlLmcuLCB0aGUgYmluYXJ5IHRhcmdldCksIHRoZW4gd2Ugc2hvdWxkCi0gICAgICAgbm90IGFsbG93IHNvbWUgb3RoZXIgdGFyZ2V0IHRvIHJlY29nbml6ZSBpdCBhcyBhbiBhcmNoaXZlLCBidXQKLSAgICAgICBzaG91bGQgaW5zdGVhZCBhbGxvdyB0aGUgc3BlY2lmaWVkIHRhcmdldCB0byByZWNvZ25pemUgaXQgYXMgYW4KLSAgICAgICBvYmplY3QuICBXaGVuIEkgZmlyc3QgbWFkZSB0aGlzIGNoYW5nZSwgaXQgYnJva2UgdGhlIFBFIHRhcmdldCwKLSAgICAgICBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgcGVpLWkzODYgdGFyZ2V0IGRpZCBub3QgcmVjb2duaXplIHRoZQotICAgICAgIGFjdHVhbCBwZS1pMzg2IGFyY2hpdmUuICBTaW5jZSB0aGVyZSBtYXkgYmUgb3RoZXIgcHJvYmxlbXMgb2YKLSAgICAgICB0aGlzIHNvcnQsIEkgY2hhbmdlZCB0aGlzIHRlc3QgdG8gY2hlY2sgb25seSBmb3IgdGhlIGJpbmFyeQotICAgICAgIHRhcmdldC4gICovCi0KLSAgICBpZiAoZm9ybWF0ID09IGJmZF9hcmNoaXZlICYmIHNhdmVfdGFyZyA9PSAmYmluYXJ5X3ZlYykKLSAgICAgIHsKLQlhYmZkLT54dmVjID0gc2F2ZV90YXJnOwotCWFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotCWlmIChtYXRjaGluZykKLQkgIGZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgfQotCi0gIGZvciAodGFyZ2V0ID0gYmZkX3RhcmdldF92ZWN0b3I7ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspIHsKLSAgICBjb25zdCBiZmRfdGFyZ2V0ICp0ZW1wOwotCi0gICAgaWYgKCp0YXJnZXQgPT0gJmJpbmFyeV92ZWMpCi0gICAgICBjb250aW51ZTsKLQotICAgIGFiZmQtPnh2ZWMgPSAqdGFyZ2V0OwkvKiBDaGFuZ2UgQkZEJ3MgdGFyZ2V0IHRlbXBvcmFyaWx5ICovCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpMCwgU0VFS19TRVQpICE9IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLyogSWYgX2JmZF9jaGVja19mb3JtYXQgbmVnbGVjdHMgdG8gc2V0IGJmZF9lcnJvciwgYXNzdW1lIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQuCi0gICAgICAgV2UgZGlkbid0IHVzZWQgdG8gZXZlbiBwYXkgYW55IGF0dGVudGlvbiB0byBiZmRfZXJyb3IsIHNvIEkgc3VzcGVjdAotICAgICAgIHRoYXQgc29tZSBfYmZkX2NoZWNrX2Zvcm1hdCBtaWdodCBoYXZlIHRoaXMgcHJvYmxlbS4gICovCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgdGVtcCA9IEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9jaGVja19mb3JtYXQsIChhYmZkKSk7Ci0gICAgaWYgKHRlbXApIHsJCQkJLyogVGhpcyBmb3JtYXQgY2hlY2tzIG91dCBhcyBvayEgKi8KLSAgICAgIHJpZ2h0X3RhcmcgPSB0ZW1wOwotICAgICAgaWYgKG1hdGNoaW5nKQotCXsKLQkgIG1hdGNoaW5nX3ZlY3RvclttYXRjaF9jb3VudF0gPSB0ZW1wLT5uYW1lOwotCSAgbWF0Y2hpbmdfdmVjdG9yW21hdGNoX2NvdW50ICsgMV0gPSBOVUxMOwotCX0KLSAgICAgIG1hdGNoX2NvdW50Kys7Ci0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldCwgYWNjZXB0IGl0LCBldmVuIGlmIG90aGVyIHRhcmdldHMKLQkgbWlnaHQgbWF0Y2guICBQZW9wbGUgd2hvIHdhbnQgdGhvc2Ugb3RoZXIgdGFyZ2V0cyBoYXZlIHRvIHNldCAKLQkgdGhlIEdOVVRBUkdFVCB2YXJpYWJsZS4gICovCi0gICAgICBpZiAodGVtcCA9PSBiZmRfZGVmYXVsdF92ZWN0b3JbMF0pCi0JewotCSAgaWYgKG1hdGNoaW5nKQotCSAgICB7Ci0JICAgICAgbWF0Y2hpbmdfdmVjdG9yWzBdID0gdGVtcC0+bmFtZTsKLQkgICAgICBtYXRjaGluZ192ZWN0b3JbMV0gPSBOVUxMOwotCSAgICB9Ci0JICBtYXRjaF9jb3VudCA9IDE7Ci0JICBicmVhazsKLQl9Ci0jaWZkZWYgR05VOTYwCi0gICAgICAvKiBCaWctIGFuZCBsaXR0bGUtZW5kaWFuIGIub3V0IGFyY2hpdmVzIGxvb2sgdGhlIHNhbWUsIGJ1dCBpdCBkb2Vzbid0Ci0gICAgICAgKiBtYXR0ZXI6IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlaXIgaGVhZGVycywgYW5kIG1lbWJlciBmaWxlIGJ5dGUKLSAgICAgICAqIG9yZGVycyB3aWxsIChJIGhvcGUpIGJlIGhhbmRsZWQgYXBwcm9wcmlhdGVseSBieSBiZmQuICBEaXR0byBmb3IgYmlnCi0gICAgICAgKiBhbmQgbGl0dGxlIGNvZmYgYXJjaGl2ZXMuICBBbmQgdGhlIDQgY29mZi9iLm91dCBvYmplY3QgZm9ybWF0cyBhcmUKLSAgICAgICAqIHVuYW1iaWd1b3VzLiAgU28gYWNjZXB0IHRoZSBmaXJzdCBtYXRjaCB3ZSBmaW5kLgotICAgICAgICovCi0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0gZWxzZSBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KSB7Ci0gICAgICBhYmZkLT54dmVjID0gc2F2ZV90YXJnOwotICAgICAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gICAgICBpZiAobWF0Y2hpbmcgJiYgYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1hdGNoX2NvdW50ID09IDEpIHsKLSAgICBhYmZkLT54dmVjID0gcmlnaHRfdGFyZzsJCS8qIENoYW5nZSBCRkQncyB0YXJnZXQgcGVybWFuZW50bHkgKi8KLSAgICBpZiAobWF0Y2hpbmcpCi0gICAgICBmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotICAgIHJldHVybiB0cnVlOwkJCS8qIEZpbGUgcG9zaXRpb24gaGFzIG1vdmVkLCBCVFcgKi8KLSAgfQotCi0gIGFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7CQkvKiBSZXN0b3JlIG9yaWdpbmFsIHRhcmdldCB0eXBlICovCi0gIGFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwkJLyogUmVzdG9yZSBvcmlnaW5hbCBmb3JtYXQgKi8KLSAgaWYgKG1hdGNoX2NvdW50ID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQpOwotICAgICAgaWYgKG1hdGNoaW5nKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9mb3JtYXQKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfZm9ybWF0KGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpOwotCi1ERVNDUklQVElPTgotCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZmlsZSBmb3JtYXQgb2YgdGhlIEJGRCBAdmFye2FiZmR9IHRvIHRoZQotCWZvcm1hdCBAdmFye2Zvcm1hdH0uIElmIHRoZSB0YXJnZXQgc2V0IGluIHRoZSBCRkQgZG9lcyBub3QKLQlzdXBwb3J0IHRoZSBmb3JtYXQgcmVxdWVzdGVkLCB0aGUgZm9ybWF0IGlzIGludmFsaWQsIG9yIHRoZSBCRkQKLQlpcyBub3Qgb3BlbiBmb3Igd3JpdGluZywgdGhlbiBhbiBlcnJvciBvY2N1cnMuCi0KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfZm9ybWF0IChhYmZkLCBmb3JtYXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0KLSAgaWYgKGJmZF9yZWFkX3AgKGFiZmQpIHx8Ci0gICAgICAoKGludClhYmZkLT5mb3JtYXQgPCAoaW50KWJmZF91bmtub3duKSB8fAotICAgICAgKChpbnQpYWJmZC0+Zm9ybWF0ID49IChpbnQpYmZkX3R5cGVfZW5kKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfdW5rbm93bikKLSAgICByZXR1cm4gKGFiZmQtPmZvcm1hdCA9PSBmb3JtYXQpID8gdHJ1ZTpmYWxzZTsKLQotICAvKiBwcmVzdW1lIHRoZSBhbnN3ZXIgaXMgeWVzICovCi0gIGFiZmQtPmZvcm1hdCA9IGZvcm1hdDsKLQotICBpZiAoIUJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9zZXRfZm9ybWF0LCAoYWJmZCkpKSB7Ci0gICAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Zvcm1hdF9zdHJpbmcKLQotU1lOT1BTSVMKLQlDT05TVCBjaGFyICpiZmRfZm9ybWF0X3N0cmluZyhiZmRfZm9ybWF0IGZvcm1hdCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byBhIGNvbnN0IHN0cmluZwotCTw8aW52YWxpZD4+LCA8PG9iamVjdD4+LCA8PGFyY2hpdmU+PiwgPDxjb3JlPj4sIG9yIDw8dW5rbm93bj4+LAotCWRlcGVuZGluZyB1cG9uIHRoZSB2YWx1ZSBvZiBAdmFye2Zvcm1hdH0uCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9mb3JtYXRfc3RyaW5nIChmb3JtYXQpCi0gICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotewotICBpZiAoKChpbnQpZm9ybWF0IDwoaW50KSBiZmRfdW5rbm93bikgCi0gICAgICB8fCAoKGludClmb3JtYXQgPj0oaW50KSBiZmRfdHlwZV9lbmQpKSAKLSAgICByZXR1cm4gImludmFsaWQiOwotICAKLSAgc3dpdGNoIChmb3JtYXQpIHsKLSAgY2FzZSBiZmRfb2JqZWN0OgotICAgIHJldHVybiAib2JqZWN0IjsJCS8qIGxpbmtlci9hc3NlbWJlci9jb21waWxlciBvdXRwdXQgKi8KLSAgY2FzZSBiZmRfYXJjaGl2ZTogCi0gICAgcmV0dXJuICJhcmNoaXZlIjsJCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLSAgY2FzZSBiZmRfY29yZTogCi0gICAgcmV0dXJuICJjb3JlIjsJCS8qIGNvcmUgZHVtcCAqLwotICBkZWZhdWx0OiAKLSAgICByZXR1cm4gInVua25vd24iOwotICB9Ci19CmRpZmYgLS1naXQgYS9iZmQvZnJlZWJzZC5oIGIvYmZkL2ZyZWVic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiMTlhYy4uMDAwMDAwMAotLS0gYS9iZmQvZnJlZWJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkZWZpbml0aW9ucyB1c2VkIGJ5IGFsbCBGcmVlQlNEIHRhcmdldHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotKi8KLQotLyogRnJlZUJTRCBaTUFHSUMgZmlsZXMgbmV2ZXIgaGF2ZSB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAqLwotI2RlZmluZQlOX0hFQURFUl9JTl9URVhUKHgpCTAKLQotLyogWk1BR0lDIGZpbGVzIHN0YXJ0IGF0IG9mZnNldCAwLiAgRG9lcyBub3QgYXBwbHkgdG8gUU1BR0lDIGZpbGVzLiAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJCTAKLQotI2RlZmluZSBOX0dFVE1BR0lDX05FVChleGVjKSBcCi0JKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZGVmaW5lIE5fR0VUTUlEX05FVChleGVjKSBcCi0JKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4M2ZmKQotI2RlZmluZSBOX0dFVEZMQUdfTkVUKGV4KSBcCi0JKCgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCi0KLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSBcCi0JKChlbnVtIG1hY2hpbmVfdHlwZSkgXAotCSAoKE5fR0VUTUFHSUNfTkVUIChleGVjKSA9PSBaTUFHSUMpID8gTl9HRVRNSURfTkVUIChleGVjKSA6IFwKLQkgICgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4M2ZmKSkKLSNkZWZpbmUgTl9GTEFHUyhleGVjKSBcCi0JKChOX0dFVE1BR0lDX05FVCAoZXhlYykgPT0gWk1BR0lDKSA/IE5fR0VURkxBR19ORVQgKGV4ZWMpIDogXAotCSAoKGV4ZWMpLmFfaW5mbyA+PiAyNikgJiAweDNmKQotCi0jZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotCSB8ICgoKGludCkodHlwZSkgJiAweDNmZikgPDwgMTYpIFwKLQkgfCAoKChmbGFncykgJiAweDNmKSA8PCAyNikpCi0jZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0gICAgICAgICAoKGV4ZWMpLmFfaW5mbyAmIDB4ZmIwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweDNmZikgPDwgMTYpKQotI2RlZmluZSBOX1NFVF9GTEFHUyhleGVjLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gXAotCSAoKGV4ZWMpLmFfaW5mbyAmIDB4MDNmZmZmZmYpIHwgKChmbGFncyAmIDB4MDNmKSA8PCAyNikpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIE9uIEZyZWVCU0QsIHRoZSBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGluIGkzODYgKGxpdHRsZS1lbmRpYW4pCi0gICBmb3JtYXQuICBJIHRoaW5rLiAgKi8KLSNkZWZpbmUgU1dBUF9NQUdJQyhleHQpIGJmZF9nZXRsMzIgKGV4dCkKLQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi1zdGF0aWMgYm9vbGVhbiBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0gICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFKGFiZmQpOwotI2Vsc2UKLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0jZW5kaWYKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICBpZiAoc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYS5vdXQtbTY4azRrLW5ldGJzZCIpID09IDApCi0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjhLNEtfTkVUQlNEKTsKLSAgICBlbHNlCi0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjhLX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1NQQVJDX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMzg2X05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfbnMzMms6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzUzMl9ORVRCU0QpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgICBicmVhazsKLSAgfQotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2dlbi1hb3V0LmMgYi9iZmQvZ2VuLWFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlZDkxYS4uMDAwMDAwMAotLS0gYS9iZmQvZ2VuLWFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKiBHZW5lcmF0ZSBwYXJhbWV0ZXJzIGZvciBhbiBhLm91dCBzeXN0ZW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiL3Vzci9pbmNsdWRlL2Eub3V0LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsgY2hhcioqIGFyZ3Y7Ci17Ci0gIHN0cnVjdCBleGVjIG15X2V4ZWM7Ci0gIGludCBwYWdlX3NpemU7Ci0gIGNoYXIgKnRhcmdldCA9ICJ1bmtub3duIiwgKmFyY2ggPSAidW5rbm93biI7Ci0gIEZJTEUgKmZpbGUgPSBmb3BlbigiZ2VuLWFvdXQiLCAiciIpOwotCi0gIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gZ2VuLWFvdXQhXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoZnJlYWQoJm15X2V4ZWMsIHNpemVvZihzdHJ1Y3QgZXhlYyksIDEsIGZpbGUpICE9IDEpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlYWQgZ2VuLWFvdXQhXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHRhcmdldCA9IGFyZ3ZbMV07Ci0gIGlmICh0YXJnZXQgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZ2VuLWFvdXQgdGFyZ2V0X25hbWVcbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gIH0KLQotI2lmZGVmIE5fVFhUT0ZGCi0gIHBhZ2Vfc2l6ZSA9IE5fVFhUT0ZGKG15X2V4ZWMpOwotICBpZiAocGFnZV9zaXplID09IDApCi0gICAgcHJpbnRmKCIjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMVxuIik7Ci0gIGVsc2UKLSAgICBwcmludGYoIiNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwXG4iKTsKLSNlbmRpZgotCi0gIHByaW50ZigiI2RlZmluZSBCWVRFU19JTl9XT1JEICVkXG4iLCBzaXplb2YgKGludCkpOwotICBpZiAobXlfZXhlYy5hX2VudHJ5ID09IDApIHsKLSAgICAgIHByaW50ZigiI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVST1xuIik7Ci0gICAgICBwcmludGYoIiNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgKi9cbiIpOwotICB9Ci0gIGVsc2UgewotICAgICAgcHJpbnRmKCIvKiNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8qL1xuIik7Ci0gICAgICBwcmludGYoIi8qI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCovXG4iKTsKLSAgfQotCi0gIHByaW50ZigiI2RlZmluZSBURVhUX1NUQVJUX0FERFIgJWRcbiIsIG15X2V4ZWMuYV9lbnRyeSk7Ci0KLSNpZmRlZiBQQUdTSVoKLSAgaWYgKHBhZ2Vfc2l6ZSA9PSAwKQotICAgIHBhZ2Vfc2l6ZSA9IFBBR1NJWjsKLSNlbmRpZgotICBpZiAocGFnZV9zaXplICE9IDApCi0gICAgcHJpbnRmKCIjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgJWRcbiIsIHBhZ2Vfc2l6ZSk7Ci0gIGVsc2UKLSAgICBwcmludGYoIi8qICNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA/Pz8gKi9cbiIpOwotICBwcmludGYoIiNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkVcbiIpOwotCi0jaWZkZWYgdmF4Ci0gIGFyY2ggPSAidmF4IjsKLSNlbmRpZgotI2lmZGVmIG02OGsKLSAgYXJjaCA9ICJtNjhrIjsKLSNlbmRpZgotICBpZiAoYXJjaFswXSA9PSAnMScpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ3YXJuaW5nOiBwcmVwcm9jZXNzb3Igc3Vic3RpdHV0ZWQgYXJjaGl0ZWN0dXJlIG5hbWUgaW5zaWRlIHN0cmluZzsiKSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiAgICAgICAgIGZpeCBERUZBVUxUX0FSQ0ggaW4gdGhlIG91dHB1dCBmaWxlIHlvdXJzZWxmXG4iKSk7Ci0gICAgICBhcmNoID0gInVua25vd24iOwotICAgIH0KLSAgcHJpbnRmKCIjZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF8lc1xuIiwgYXJjaCk7Ci0KLSAgcHJpbnRmKCJcbiNkZWZpbmUgTVkoT1ApIENBVCglc18sT1ApXG4iLCB0YXJnZXQpOwotICBwcmludGYoIiNkZWZpbmUgVEFSR0VUTkFNRSBcImEub3V0LSVzXCJcblxuIiwgdGFyZ2V0KTsKLQotICBwcmludGYoIiNpbmNsdWRlIFwiYmZkLmhcIlxuIik7Ci0gIHByaW50ZigiI2luY2x1ZGUgXCJzeXNkZXAuaFwiXG4iKTsKLSAgcHJpbnRmKCIjaW5jbHVkZSBcImxpYmJmZC5oXCJcbiIpOwotICBwcmludGYoIiNpbmNsdWRlIFwibGliYW91dC5oXCJcbiIpOwotICBwcmludGYoIlxuI2luY2x1ZGUgXCJhb3V0LXRhcmdldC5oXCJcbiIpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2dlbmxpbmsuaCBiL2JmZC9nZW5saW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGE4ZGUuLjAwMDAwMDAKLS0tIGEvYmZkL2dlbmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBnZW5saW5rLmggLS0gaW50ZXJmYWNlIHRvIHRoZSBCRkQgZ2VuZXJpYyBsaW5rZXIKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEdFTkxJTktfSAotI2RlZmluZSBHRU5MSU5LX0gKLQotLyogVGhpcyBoZWFkZXIgZmlsZSBpcyBpbnRlcm5hbCB0byBCRkQuICBJdCBkZXNjcmliZXMgdGhlIGludGVybmFsCi0gICBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgQkZEIGdlbmVyaWMgbGlua2VyLCBpbiBjYXNlCi0gICBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgbGlua2VycyB3YW50IHRvIHVzZSBvciBjYWxsIHRoZW0uICBOb3RlCi0gICB0aGF0IHNvbWUgZnVuY3Rpb25zLCBzdWNoIGFzIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlLAotICAgYXJlIGRlY2xhcmVkIGluIGxpYmJmZC5oLCBiZWNhdXNlIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHdpZGVseQotICAgdXNlZC4gIFRoZSBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIHdpbGwgcHJvYmFibHkgb25seQotICAgYmUgdXNlZCBieSBhIGZldyBmaWxlcyBiZXNpZGVzIGxpbmtlci5jIGl0c2VsZi4gIEluIGZhY3QsIHRoaXMgZmlsZQotICAgaXMgbm90IHBhcnRpY3VsYXJseSBjb21wbGV0ZTsgSSBoYXZlIG9ubHkgcHV0IGluIHRoZSBpbnRlcmZhY2VzIEkKLSAgIGFjdHVhbGx5IG5lZWRlZC4gICovCi0KLS8qIFRoZSBnZW5lcmljIGxpbmtlciB1c2VzIGEgaGFzaCB0YWJsZSB3aGljaCBpcyBhIGRlcml2ZWQgY2xhc3Mgb2YKLSAgIHRoZSBzdGFuZGFyZCBsaW5rZXIgaGFzaCB0YWJsZSwganVzdCBhcyB0aGUgb3RoZXIgYmFja2VuZCBzcGVjaWZpYwotICAgbGlua2VycyBkby4gIERvIG5vdCBjb25mdXNlIHRoZSBnZW5lcmljIGxpbmtlciBoYXNoIHRhYmxlIHdpdGggdGhlCi0gICBzdGFuZGFyZCBCRkQgbGlua2VyIGhhc2ggdGFibGUgaXQgaXMgYnVpbHQgdXBvbi4gICovCi0KLS8qIEdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgYm9vbGVhbiB3cml0dGVuOwotICAvKiBTeW1ib2wgZnJvbSBpbnB1dCBCRkQuICAqLwotICBhc3ltYm9sICpzeW07Ci19OwotCi0vKiBHZW5lcmljIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBUaGUgZ2VuZXJpYyBsaW5rZXIgcmVhZHMgaW4gdGhlIGFzeW1ib2wgc3RydWN0dXJlcyBmb3IgYW4gaW5wdXQgQkZECi0gICBhbmQga2VlcHMgdGhlbSBpbiB0aGUgb3V0c3ltYm9sIGFuZCBzeW1jb3VudCBmaWVsZHMuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLQotLyogQWRkIHRoZSBzeW1ib2xzIG9mIGlucHV0X2JmZCB0byB0aGUgc3ltYm9scyBiZWluZyBidWlsdCBmb3IKLSAgIG91dHB1dF9iZmQuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBzaXplX3QgKnBzeW1hbGxvYykpOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wsIHdoaWNoIG1heSBiZSBjYWxsZWQgdmlhCi0gICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvCi17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIHNpemVfdCAqcHN5bWFsbG9jOwotfTsKLQotLyogV3JpdGUgb3V0IGEgc2luZ2xlIGdsb2JhbCBzeW1ib2wuICBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZAotICAgdmlhIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UuICBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3QKLSAgIGFjdHVhbGx5IGJlIGEgc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvICouICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIEdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGVudHJ5IGNyZWF0aW9uIHJvdXRpbmUuICAqLwotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotICAgICAgICAgICBjb25zdCBjaGFyICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvZ28zMnN0dWIuaCBiL2JmZC9nbzMyc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQzODhjLi4wMDAwMDAwCi0tLSBhL2JmZC9nbzMyc3R1Yi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTB4NGQsMHg1YSwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgyNywweDAwLDB4ZmYsMHhmZiwweDAwLDB4MDAsCi0weDYwLDB4MDcsMHgwMCwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgwZCwweDBhLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDY4LAotMHgyMCwweDY3LDB4NjUsMHg2ZSwweDY1LDB4NzIsMHg2MSwweDc0LDB4NjUsMHg2NCwweDIwLDB4NjYsMHg3MiwweDZmLDB4NmQsMHgyMCwKLTB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsMHg2ZCwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLDB4NzMsCi0weDZkLDB4MmMsMHgyMCwweDZmLDB4NmUsMHgyMCwweDU3LDB4NjUsMHg2NCwweDIwLDB4NGEsMHg3NSwweDZlLDB4MjAsMHgzMSwweDMxLAotMHgyMCwweDMxLDB4MzYsMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDMxLDB4MzksMHgzOSwweDM3LDB4MGQsMHgwYSwKLTB4NTQsMHg2OCwweDY1LDB4MjAsMHg1MywweDU0LDB4NTUsMHg0MiwweDJlLDB4NDUsMHg1OCwweDQ1LDB4MjAsMHg3MywweDc0LDB4NzUsCi0weDYyLDB4MjAsMHg2YywweDZmLDB4NjEsMHg2NCwweDY1LDB4NzIsMHgyMCwweDY5LDB4NzMsMHgyMCwweDQzLDB4NmYsMHg3MCwweDc5LAotMHg3MiwweDY5LDB4NjcsMHg2OCwweDc0LDB4MjAsMHgyOCwweDQzLDB4MjksMHgyMCwweDMxLDB4MzksMHgzOSwweDMzLDB4MmQsMHgzMSwKLTB4MzksMHgzOSwweDM1LDB4MjAsMHg0NCwweDRhLDB4MjAsMHg0NCwweDY1LDB4NmMsMHg2ZiwweDcyLDB4NjksMHg2NSwweDJlLDB4MjAsCi0weDBkLDB4MGEsMHg1MCwweDY1LDB4NzIsMHg2ZCwweDY5LDB4NzMsMHg3MywweDY5LDB4NmYsMHg2ZSwweDIwLDB4NjcsMHg3MiwweDYxLAotMHg2ZSwweDc0LDB4NjUsMHg2NCwweDIwLDB4NzQsMHg2ZiwweDIwLDB4NzUsMHg3MywweDY1LDB4MjAsMHg2NiwweDZmLDB4NzIsMHgyMCwKLTB4NjEsMHg2ZSwweDc5LDB4MjAsMHg3MCwweDc1LDB4NzIsMHg3MCwweDZmLDB4NzMsMHg2NSwweDIwLDB4NzAsMHg3MiwweDZmLDB4NzYsCi0weDY5LDB4NjQsMHg2NSwweDY0LDB4MjAsMHg3NCwweDY4LDB4NjksMHg3MywweDIwLDB4NjMsMHg2ZiwweDcwLDB4NzksMHg3MiwweDY5LAotMHg2NywweDY4LDB4NzQsMHgyMCwweDBkLDB4MGEsMHg3MiwweDY1LDB4NmQsMHg2MSwweDY5LDB4NmUsMHg3MywweDIwLDB4NzAsMHg3MiwKLTB4NjUsMHg3MywweDY1LDB4NmUsMHg3NCwweDIwLDB4NjEsMHg2ZSwweDY0LDB4MjAsMHg3NSwweDZlLDB4NmQsMHg2ZiwweDY0LDB4NjksCi0weDY2LDB4NjksMHg2NSwweDY0LDB4MmUsMHgyMCwweDBkLDB4MGEsMHg1NCwweDY4LDB4NjksMHg3MywweDIwLDB4NmYsMHg2ZSwweDZjLAotMHg3OSwweDIwLDB4NjEsMHg3MCwweDcwLDB4NmMsMHg2OSwweDY1LDB4NzMsMHgyMCwweDc0LDB4NmYsMHgyMCwweDc0LDB4NjgsMHg2NSwKLTB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJjLDB4MjAsMHg2MSwweDZlLDB4NjQsMHgyMCwweDZlLDB4NmYsMHg3NCwweDIwLDB4NmUsCi0weDY1LDB4NjMsMHg2MywweDY1LDB4NzMsMHg3MywweDYxLDB4NzIsMHg2OSwweDZjLDB4NzksMHgyMCwweDc0LDB4NjgsMHg2NSwweDIwLAotMHg3NywweDY4LDB4NmYsMHg2YywweDY1LDB4MjAsMHg3MCwweDcyLDB4NmYsMHg2NywweDcyLDB4NjEsMHg2ZCwweDJlLDB4MGEsMHgwZCwKLTB4MGEsMHgyNCwweDQ5LDB4NjQsMHgzYSwweDIwLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsMHg2ZCwweDIwLDB4NjIsCi0weDc1LDB4NjksMHg2YywweDc0LDB4MjAsMHgzMCwweDM2LDB4MmYsMHgzMSwweDMxLDB4MmYsMHgzOSwweDM3LDB4MjAsMHgzMSwweDM2LAotMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDYyLDB4NzksMHgyMCwweDY0LDB4NmEsMHg2MSwweDczLDB4NmQsMHgyMCwKLTB4MjQsMHgwYSwweDBkLDB4MGEsMHg0MCwweDI4LDB4MjMsMHgyOSwweDIwLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsCi0weDZkLDB4MjAsMHg2MiwweDc1LDB4NjksMHg2YywweDc0LDB4MjAsMHgzMCwweDM2LDB4MmYsMHgzMSwweDMxLDB4MmYsMHgzOSwweDM3LAotMHgyMCwweDMxLDB4MzYsMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDYyLDB4NzksMHgyMCwweDY0LDB4NmEsMHg2MSwKLTB4NzMsMHg2ZCwweDBhLDB4MGQsMHgwYSwweDFhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHg2NywweDZmLDB4MzMsMHgzMiwweDczLDB4NzQsMHg3NSwweDYyLDB4MmMsMHgyMCwweDc2LDB4MjAsMHgzMiwweDJlLDB4MzAsMHgzMCwKLTB4NTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDU3LDB4NTMsMHg0NCwweDUwLDB4NGQsMHg0OSwweDJlLDB4NDUsMHg1OCwweDQ1LDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MGUsMHgxZiwweDhjLDB4MWUsMHgyNCwweDAwLDB4OGMsMHgwNiwweDYwLDB4MDcsMHhmYywweGI0LAotMHgzMCwweGNkLDB4MjEsMHgzYywweDAzLDB4NzMsMHgwNiwweGJhLDB4ODYsMHgwNSwweGU5LDB4YjIsMHgwMywweGEyLDB4NjksMHgwOCwKLTB4YmIsMHg3MCwweDA4LDB4YTEsMHgyMCwweDAwLDB4MzksMHhjMywweDczLDB4MDIsMHg4OSwweGMzLDB4ODksMHgxZSwweDIwLDB4MDAsCi0weGZlLDB4YzcsMHhiOSwweDA0LDB4ZmYsMHhkMywweGViLDB4YjQsMHg0YSwweGNkLDB4MjEsMHg3MywweDBhLDB4ZDMsMHhlMywweGZlLAotMHhjZiwweDg5LDB4MWUsMHgyMCwweDAwLDB4ZWIsMHhkOSwweDI2LDB4OGUsMHgwNiwweDJjLDB4MDAsMHgzMSwweGZmLDB4MzAsMHhjMCwKLTB4YTksMHhmMiwweGFlLDB4MjYsMHg4MSwweDNkLDB4NTAsMHg0MSwweDc1LDB4MTUsMHhhZiwweDI2LDB4ODEsMHgzZCwweDU0LDB4NDgsCi0weDc1LDB4MGQsMHhhZiwweDI2LDB4ODAsMHgzZCwweDNkLDB4NzUsMHgwNiwweDQ3LDB4ODksMHgzZSwweDY3LDB4MDQsMHg0ZiwweGFlLAotMHg3NSwweGRmLDB4YWYsMHgwNiwweDU3LDB4MzEsMHhjOSwweDc0LDB4MTAsMHhiYSwweDVkLDB4MDUsMHhlOSwweDUwLDB4MDMsMHgwOSwKLTB4YzksMHg3NSwweGY2LDB4NDEsMHhlOCwweDkyLDB4MDMsMHg3MiwweGYwLDB4YjgsMHg4NywweDE2LDB4Y2QsMHgyZiwweDA5LDB4YzAsCi0weDc1LDB4ZWQsMHg4MCwweGUzLDB4MDEsMHg3NCwweGU4LDB4ODksMHgzZSwweDAwLDB4MDYsMHg4YywweDA2LDB4MDIsMHgwNiwweDg5LAotMHgzNiwweDA0LDB4MDYsMHg1ZiwweDA3LDB4ZTgsMHhkNSwweDAyLDB4ODksMHgzZSwweDJhLDB4MDAsMHg4OSwweDM2LDB4NjIsMHgwNywKLTB4ODAsMHgzZSwweDJjLDB4MDAsMHgwMCwweDc0LDB4MjQsMHhiOSwweDA4LDB4MDAsMHhiZiwweDJjLDB4MDAsMHg4YSwweDA1LDB4NDcsCi0weDA4LDB4YzAsMHg3NCwweDA1LDB4ODgsMHgwNywweDQzLDB4ZTIsMHhmNCwweDY2LDB4YzcsMHgwNywweDJlLDB4NDUsMHg1OCwweDQ1LAotMHg4MSwweGMzLDB4MDQsMHgwMCwweGM2LDB4MDcsMHgwMCwweDg5LDB4MWUsMHg2MiwweDA3LDB4YjgsMHgwMCwweDNkLDB4YmEsMHg2NCwKLTB4MDcsMHhjZCwweDIxLDB4MGYsMHg4MiwweGI0LDB4MDIsMHhhMywweDA2LDB4MDYsMHg4OSwweGMzLDB4YjksMHgwNiwweDAwLDB4YmEsCi0weGI1LDB4MDcsMHhiNCwweDNmLDB4Y2QsMHgyMSwweDMxLDB4ZDIsMHgzMSwweGM5LDB4YTEsMHhiNSwweDA3LDB4M2QsMHg0YywweDAxLAotMHg3NCwweDFiLDB4M2QsMHg0ZCwweDVhLDB4MGYsMHg4NSwweDk3LDB4MDIsMHg4YiwweDE2LDB4YjksMHgwNywweGMxLDB4ZTIsMHgwOSwKLTB4OGIsMHgxZSwweGI3LDB4MDcsMHgwOSwweGRiLDB4NzQsMHgwNSwweDgwLDB4ZWUsMHgwMiwweDAxLDB4ZGEsMHg4OSwweDE2LDB4YmIsCi0weDA3LDB4ODksMHgwZSwweGJkLDB4MDcsMHhiOCwweDAwLDB4NDIsMHg4YiwweDFlLDB4MDYsMHgwNiwweGNkLDB4MjEsMHhiOSwweGE4LAotMHgwMCwweGJhLDB4YmYsMHgwNywweGI0LDB4M2YsMHhjZCwweDIxLDB4M2QsMHhhOCwweDAwLDB4NzUsMHgwNiwweDgxLDB4M2UsMHhiZiwKLTB4MDcsMHg0YywweDAxLDB4MGYsMHg4NSwweDVlLDB4MDIsMHg2NiwweGExLDB4ZTMsMHgwNywweDY2LDB4YTMsMHgxMCwweDA2LDB4NjYsCi0weDhiLDB4MGUsMHhiYiwweDA3LDB4NjYsMHhhMSwweDAzLDB4MDgsMHg2NiwweDAxLDB4YzgsMHg2NiwweGEzLDB4MDgsMHgwNiwweDY2LAotMHhhMSwweDJiLDB4MDgsMHg2NiwweDAxLDB4YzgsMHg2NiwweGEzLDB4MGMsMHgwNiwweDY2LDB4OGIsMHgxZSwweDRiLDB4MDgsMHg2NiwKLTB4YTEsMHg0ZiwweDA4LDB4NjYsMHgwMSwweGMzLDB4NjYsMHhiOCwweDAxLDB4MDAsMHgwMSwweDAwLDB4NjYsMHgzOSwweGMzLDB4NzMsCi0weDAzLDB4NjYsMHg4OSwweGMzLDB4NjYsMHg4MSwweGMzLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgzMSwweGRiLDB4NjYsMHg4OSwweDFlLAotMHgxYywweDAwLDB4ZTgsMHhlOCwweDAyLDB4OGIsMHgxZSwweDA0LDB4MDYsMHgwOSwweGRiLDB4NzQsMHgwYSwweGI0LDB4NDgsMHhjZCwKLTB4MjEsMHgwZiwweDgyLDB4MTAsMHgwMiwweDhlLDB4YzAsMHhlOCwweGZiLDB4MDIsMHhiOCwweDAxLDB4MDAsMHhmZiwweDFlLDB4MDAsCi0weDA2LDB4MGYsMHg4MiwweDA4LDB4MDIsMHg4YywweDA2LDB4MjYsMHgwMCwweDhjLDB4MGUsMHgyOCwweDAwLDB4OGMsMHhkOCwweGEzLAotMHgyMiwweDAwLDB4OGUsMHhjMCwweDMxLDB4YzAsMHhiOSwweDAxLDB4MDAsMHhjZCwweDMxLDB4NzIsMHgwNywweGEzLDB4MTQsMHgwNiwKLTB4MzEsMHhjMCwweGNkLDB4MzEsMHgwZiwweDgyLDB4ZWEsMHgwMSwweGEzLDB4MTYsMHgwNiwweDY2LDB4OGIsMHgwZSwweDFjLDB4MDAsCi0weGI4LDB4MDEsMHgwNSwweDhiLDB4MWUsMHgxZSwweDAwLDB4Y2QsMHgzMSwweDBmLDB4ODIsMHhkYSwweDAxLDB4ODksMHgxZSwweDFhLAotMHgwNiwweDg5LDB4MGUsMHgxOCwweDA2LDB4ODksMHgzNiwweDFhLDB4MDAsMHg4OSwweDNlLDB4MTgsMHgwMCwweGI4LDB4MDcsMHgwMCwKLTB4OGIsMHgxZSwweDE0LDB4MDYsMHg4YiwweDBlLDB4MWEsMHgwNiwweDhiLDB4MTYsMHgxOCwweDA2LDB4Y2QsMHgzMSwweGI4LDB4MDksCi0weDAwLDB4OGMsMHhjOSwweDgxLDB4ZTEsMHgwMywweDAwLDB4YzEsMHhlMSwweDA1LDB4NTEsMHg4MSwweGM5LDB4OWIsMHhjMCwweGNkLAotMHgzMSwweGI4LDB4MDgsMHgwMCwweDhiLDB4MGUsMHgxZSwweDAwLDB4NDksMHhiYSwweGZmLDB4ZmYsMHhjZCwweDMxLDB4YjgsMHgwNywKLTB4MDAsMHg4YiwweDFlLDB4MTYsMHgwNiwweDhiLDB4MGUsMHgxYSwweDA2LDB4OGIsMHgxNiwweDE4LDB4MDYsMHhjZCwweDMxLDB4YjgsCi0weDA5LDB4MDAsMHg1OSwweDgxLDB4YzksMHg5MywweGMwLDB4Y2QsMHgzMSwweGI4LDB4MDgsMHgwMCwweDhiLDB4MGUsMHgxZSwweDAwLAotMHg0OSwweGJhLDB4ZmYsMHhmZiwweGNkLDB4MzEsMHhiOCwweDAwLDB4MDEsMHhiYiwweDAwLDB4MGYsMHhjZCwweDMxLDB4NzMsMHgxMCwKLTB4M2QsMHgwOCwweDAwLDB4MGYsMHg4NSwweDY1LDB4MDEsMHhiOCwweDAwLDB4MDEsMHhjZCwweDMxLDB4MGYsMHg4MiwweDVjLDB4MDEsCi0weGEzLDB4MWMsMHgwNiwweDg5LDB4MTYsMHgxZSwweDA2LDB4YzEsMHhlMywweDA0LDB4ODksMHgxZSwweDIwLDB4MDYsMHg2NiwweDhiLAotMHgzNiwweDA4LDB4MDYsMHg2NiwweDhiLDB4M2UsMHhmYiwweDA3LDB4NjYsMHg4YiwweDBlLDB4ZmYsMHgwNywweGU4LDB4NDksMHgwMCwKLTB4NjYsMHg4YiwweDM2LDB4MGMsMHgwNiwweDY2LDB4OGIsMHgzZSwweDIzLDB4MDgsMHg2NiwweDhiLDB4MGUsMHgyNywweDA4LDB4ZTgsCi0weDM3LDB4MDAsMHg4ZSwweDA2LDB4MTYsMHgwNiwweDY2LDB4OGIsMHgzZSwweDRiLDB4MDgsMHg2NiwweDhiLDB4MGUsMHg0ZiwweDA4LAotMHg2NiwweDMxLDB4YzAsMHg2NiwweGMxLDB4ZTksMHgwMiwweDY3LDB4ZjMsMHg2NiwweGFiLDB4YjQsMHgzZSwweDhiLDB4MWUsMHgwNiwKLTB4MDYsMHhjZCwweDIxLDB4YjgsMHgwMSwweDAxLDB4OGIsMHgxNiwweDFlLDB4MDYsMHhjZCwweDMxLDB4MWUsMHgwZiwweGExLDB4OGUsCi0weDFlLDB4MTYsMHgwNiwweDY2LDB4NjQsMHhmZiwweDJlLDB4MTAsMHgwNiwweDY2LDB4ODksMHhmMCwweDY2LDB4MjUsMHhmZiwweDAxLAotMHgwMCwweDAwLDB4NjYsMHgwMSwweGMxLDB4MjksMHhjNiwweDY2LDB4MjksMHhjNywweDY2LDB4ODksMHgwZSwweDI2LDB4MDYsMHg2NiwKLTB4ODksMHgzZSwweDIyLDB4MDYsMHhlOCwweGZlLDB4MDAsMHg4OSwweDM2LDB4M2UsMHgwNiwweDY2LDB4YzEsMHhlZSwweDEwLDB4ODksCi0weDM2LDB4NDIsMHgwNiwweDhiLDB4MWUsMHgwNiwweDA2LDB4ODksMHgxZSwweDNhLDB4MDYsMHhjNywweDA2LDB4NDYsMHgwNiwweDAwLAotMHg0MiwweGU4LDB4ZjIsMHgwMCwweGExLDB4MWMsMHgwNiwweGEzLDB4NGUsMHgwNiwweGM3LDB4MDYsMHgzZSwweDA2LDB4MDAsMHgwMCwKLTB4YzYsMHgwNiwweDQ3LDB4MDYsMHgzZiwweGExLDB4MjgsMHgwNiwweDA5LDB4YzAsMHg3NSwweDA5LDB4YTEsMHgyNiwweDA2LDB4M2IsCi0weDA2LDB4MjAsMHgwNiwweDc2LDB4MDMsMHhhMSwweDIwLDB4MDYsMHhhMywweDQyLDB4MDYsMHhlOCwweGM4LDB4MDAsMHg2NiwweDMxLAotMHhjOSwweDhiLDB4MGUsMHg0NiwweDA2LDB4NjYsMHg4YiwweDNlLDB4MjIsMHgwNiwweDY2LDB4MDEsMHgwZSwweDIyLDB4MDYsMHg2NiwKLTB4MjksMHgwZSwweDI2LDB4MDYsMHg2NiwweDMxLDB4ZjYsMHhjMSwweGU5LDB4MDIsMHgxZSwweDA2LDB4OGUsMHgwNiwweDE2LDB4MDYsCi0weDhlLDB4MWUsMHgxZSwweDA2LDB4NjcsMHhmMywweDY2LDB4YTUsMHgwNywweDFmLDB4NjYsMHgwMywweDBlLDB4MjYsMHgwNiwweDc1LAotMHhhZiwweGMzLDB4M2MsMHgzYSwweDc0LDB4MDYsMHgzYywweDJmLDB4NzQsMHgwMiwweDNjLDB4NWMsMHhjMywweGJlLDB4NjQsMHgwNywKLTB4ODksMHhmMywweDI2LDB4OGEsMHgwNSwweDQ3LDB4ODgsMHgwNCwweDM4LDB4ZTAsMHg3NCwweDBlLDB4MDgsMHhjMCwweDc0LDB4MGEsCi0weDQ2LDB4ZTgsMHhkZSwweGZmLDB4NzUsMHhlYywweDg5LDB4ZjMsMHg3NCwweGU4LDB4YzMsMHhiYSwweDI2LDB4MDUsMHhlYiwweDA4LAotMHhiYSwweDM0LDB4MDUsMHhlYiwweDAzLDB4YmEsMHgzZSwweDA1LDB4NTIsMHg4YiwweDFlLDB4NjIsMHgwNywweGM2LDB4MDcsMHgyNCwKLTB4YmIsMHg2NCwweDA3LDB4ZWIsMHgxZSwweGU4LDB4ZWQsMHgwMCwweGJhLDB4NzgsMHgwNSwweGViLDB4MTIsMHhiYSwweDkxLDB4MDUsCi0weGViLDB4MGQsMHhiYSwweGEzLDB4MDUsMHhlYiwweDA4LDB4YmEsMHhiNSwweDA1LDB4ZWIsMHgwMywweGJhLDB4NzgsMHgwNSwweDUyLAotMHhiYiwweDE5LDB4MDUsMHhlOCwweDE0LDB4MDAsMHg1YiwweGU4LDB4MTAsMHgwMCwweGJiLDB4NDIsMHgwNCwweGU4LDB4MGEsMHgwMCwKLTB4YjgsMHhmZiwweDRjLDB4Y2QsMHgyMSwweDQzLDB4YjQsMHgwMiwweGNkLDB4MjEsMHg4YSwweDE3LDB4ODAsMHhmYSwweDI0LDB4NzUsCi0weGY0LDB4YzMsMHgwZCwweDBhLDB4MjQsMHg1MCwweDUxLDB4NTcsMHgzMSwweGMwLDB4YmYsMHgyYSwweDA2LDB4YjksMHgxOSwweDAwLAotMHhmMywweGFiLDB4NWYsMHg1OSwweDU4LDB4YzMsMHhiOCwweDAwLDB4MDMsMHhiYiwweDIxLDB4MDAsMHgzMSwweGM5LDB4NjYsMHhiZiwKLTB4MmEsMHgwNiwweDAwLDB4MDAsMHhjZCwweDMxLDB4YzMsMHgwMCwweDAwLDB4MzAsMHhlNCwweGU4LDB4NWYsMHhmZiwweDg5LDB4ZGUsCi0weDhiLDB4M2UsMHg2NywweDA0LDB4ZWIsMHgxOCwweGI0LDB4M2IsMHhlOCwweDUyLDB4ZmYsMHg4MSwweGZlLDB4NjQsMHgwNywweDc0LAotMHgxMywweDhhLDB4ODQsMHhmZiwweGZmLDB4ZTgsMHgzYSwweGZmLDB4NzQsMHgwNCwweGM2LDB4MDQsMHg1YywweDQ2LDB4ZTgsMHgwMywKLTB4MDAsMHg3MiwweGUzLDB4YzMsMHhlOCwweDM2LDB4MDAsMHhiYiwweDQ0LDB4MDAsMHg4YSwweDA3LDB4ODgsMHgwNCwweDQzLDB4NDYsCi0weDA4LDB4YzAsMHg3NSwweGY2LDB4MDYsMHg1NywweDFlLDB4MDcsMHhlOCwweDlhLDB4ZmYsMHhiYiwweDJhLDB4MDYsMHg4YywweDlmLAotMHgwNCwweDAwLDB4ODksMHg5ZiwweDAyLDB4MDAsMHhiYSwweDY0LDB4MDcsMHhiOCwweDAwLDB4NGIsMHhjZCwweDIxLDB4NWYsMHgwNywKLTB4NzIsMHgwOSwweGI0LDB4NGQsMHhjZCwweDIxLDB4MmQsMHgwMCwweDAzLDB4ZjcsMHhkOCwweGViLDB4MjgsMHg4MCwweDNlLDB4NjksCi0weDA4LDB4MDUsMHg3MiwweDIwLDB4YjgsMHgwMCwweDU4LDB4Y2QsMHgyMSwweGEyLDB4NjcsMHgwOCwweGI4LDB4MDIsMHg1OCwweGNkLAotMHgyMSwweGEyLDB4NjgsMHgwOCwweGI4LDB4MDEsMHg1OCwweGJiLDB4ODAsMHgwMCwweGNkLDB4MjEsMHhiOCwweDAzLDB4NTgsMHhiYiwKLTB4MDEsMHgwMCwweGNkLDB4MjEsMHhjMywweDljLDB4ODAsMHgzZSwweDY5LDB4MDgsMHgwNSwweDcyLDB4MWEsMHg1MCwweDUzLDB4YjgsCi0weDAzLDB4NTgsMHg4YSwweDFlLDB4NjgsMHgwOCwweDMwLDB4ZmYsMHhjZCwweDIxLDB4YjgsMHgwMSwweDU4LDB4OGEsMHgxZSwweDY3LAotMHgwOCwweDMwLDB4ZmYsMHhjZCwweDIxLDB4NWIsMHg1OCwweDlkLDB4YzMsMHg0YywweDZmLDB4NjEsMHg2NCwweDIwLDB4NjUsMHg3MiwKLTB4NzIsMHg2ZiwweDcyLDB4M2EsMHgyMCwweDI0LDB4M2EsMHgyMCwweDYzLDB4NjEsMHg2ZSwweDZlLDB4NmYsMHg3NCwweDIwLDB4NmYsCi0weDcwLDB4NjUsMHg2ZSwweDI0LDB4M2EsMHgyMCwweDZlLDB4NmYsMHg3NCwweDIwLDB4NDUsMHg1OCwweDQ1LDB4MjQsMHgzYSwweDIwLAotMHg2ZSwweDZmLDB4NzQsMHgyMCwweDQzLDB4NGYsMHg0NiwweDQ2LDB4MjAsMHgyOCwweDQzLDB4NjgsMHg2NSwweDYzLDB4NmIsMHgyMCwKLTB4NjYsMHg2ZiwweDcyLDB4MjAsMHg3NiwweDY5LDB4NzIsMHg3NSwweDczLDB4NjUsMHg3MywweDI5LDB4MjQsMHg2ZSwweDZmLDB4MjAsCi0weDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHgyZCwweDIwLDB4NDcsMHg2NSwweDc0LDB4MjAsMHg2MywweDczLDB4NjQsMHg3MCwweDZkLAotMHg2OSwweDJhLDB4NjIsMHgyZSwweDdhLDB4NjksMHg3MCwweDI0LDB4NmUsMHg2ZiwweDIwLDB4NDQsMHg0ZiwweDUzLDB4MjAsMHg2ZCwKLTB4NjUsMHg2ZCwweDZmLDB4NzIsMHg3OSwweDI0LDB4NmUsMHg2NSwweDY1LDB4NjQsMHgyMCwweDQ0LDB4NGYsMHg1MywweDIwLDB4MzMsCi0weDI0LDB4NjMsMHg2MSwweDZlLDB4MjcsMHg3NCwweDIwLDB4NzMsMHg3NywweDY5LDB4NzQsMHg2MywweDY4LDB4MjAsMHg2ZCwweDZmLAotMHg2NCwweDY1LDB4MjQsMHg2ZSwweDZmLDB4MjAsMHg0NCwweDUwLDB4NGQsMHg0OSwweDIwLDB4NzMsMHg2NSwweDZjLDB4NjUsMHg2MywKLTB4NzQsMHg2ZiwweDcyLDB4NzMsMHgyNCwweDZlLDB4NmYsMHgyMCwweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHg2ZCwweDY1LDB4NmQsCi0weDZmLDB4NzIsMHg3OSwweDI0LDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAotMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKLTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCi0weDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9iZmQvaGFzaC5jIGIvYmZkL2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3MzA0MC4uMDAwMDAwMAotLS0gYS9iZmQvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLS8qIGhhc2guYyAtLSBoYXNoIHRhYmxlIHJvdXRpbmVzIGZvciBCRkQKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0KLS8qCi1TRUNUSU9OCi0JSGFzaCBUYWJsZXMKLQotQGNpbmRleCBIYXNoIHRhYmxlcwotCUJGRCBwcm92aWRlcyBhIHNpbXBsZSBzZXQgb2YgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICBSb3V0aW5lcwotCWFyZSBwcm92aWRlZCB0byBpbml0aWFsaXplIGEgaGFzaCB0YWJsZSwgdG8gZnJlZSBhIGhhc2ggdGFibGUsCi0JdG8gbG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUgYW5kIG9wdGlvbmFsbHkgY3JlYXRlIGFuCi0JZW50cnkgZm9yIGl0LCBhbmQgdG8gdHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgVGhlcmUgaXMKLQljdXJyZW50bHkgbm8gcm91dGluZSB0byBkZWxldGUgYW4gc3RyaW5nIGZyb20gYSBoYXNoIHRhYmxlLgotCi0JVGhlIGJhc2ljIGhhc2ggdGFibGUgZG9lcyBub3QgcGVybWl0IGFueSBkYXRhIHRvIGJlIHN0b3JlZAotCXdpdGggYSBzdHJpbmcuICBIb3dldmVyLCBhIGhhc2ggdGFibGUgaXMgZGVzaWduZWQgdG8gcHJlc2VudCBhCi0JYmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIHR5cGVzIG9mIGhhc2ggdGFibGVzIG1heSBiZQotCWRlcml2ZWQuICBUaGVzZSBkZXJpdmVkIHR5cGVzIG1heSBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0Jd2l0aCB0aGUgc3RyaW5nLiAgSGFzaCB0YWJsZXMgd2VyZSBpbXBsZW1lbnRlZCBpbiB0aGlzIHdheSwKLQlyYXRoZXIgdGhhbiBzaW1wbHkgcHJvdmlkaW5nIGEgZGF0YSBwb2ludGVyIGluIGEgaGFzaCB0YWJsZQotCWVudHJ5LCBiZWNhdXNlIHRoZXkgd2VyZSBkZXNpZ25lZCBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIgYmFjawotCWVuZHMuICBUaGUgbGlua2VyIG1heSBjcmVhdGUgdGhvdXNhbmRzIG9mIGhhc2ggdGFibGUgZW50cmllcywKLQlhbmQgdGhlIG92ZXJoZWFkIG9mIGFsbG9jYXRpbmcgcHJpdmF0ZSBkYXRhIGFuZCBzdG9yaW5nIGFuZAotCWZvbGxvd2luZyBwb2ludGVycyBiZWNvbWVzIG5vdGljZWFibGUuCi0KLQlUaGUgYmFzaWMgaGFzaCB0YWJsZSBjb2RlIGlzIGluIDw8aGFzaC5jPj4uCi0KLUBtZW51Ci1AKiBDcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGU6OgotQCogTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZzo6Ci1AKiBUcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZTo6Ci1AKiBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGU6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1DcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGUsIExvb2tpbmcgVXAgb3IgRW50ZXJpbmcgYSBTdHJpbmcsIEhhc2ggVGFibGVzLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCUNyZWF0aW5nIGFuZCBmcmVlaW5nIGEgaGFzaCB0YWJsZQotCi1AZmluZGV4IGJmZF9oYXNoX3RhYmxlX2luaXQKLUBmaW5kZXggYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0JVG8gY3JlYXRlIGEgaGFzaCB0YWJsZSwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgPDxzdHJ1Y3QKLQliZmRfaGFzaF90YWJsZT4+IChkZWZpbmVkIGluIDw8YmZkLmg+PikgYW5kIGNhbGwKLQk8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiAoaWYgeW91IGtub3cgYXBwcm94aW1hdGVseSBob3cgbWFueQotCWVudHJpZXMgeW91IHdpbGwgbmVlZCwgdGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfdGFibGVfaW5pdF9uPj4sCi0Jd2hpY2ggdGFrZXMgYSBAdmFye3NpemV9IGFyZ3VtZW50LCBtYXkgYmUgdXNlZCkuCi0JPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gcmV0dXJucyA8PGZhbHNlPj4gaWYgc29tZSBzb3J0IG9mCi0JZXJyb3Igb2NjdXJzLgotCi1AZmluZGV4IGJmZF9oYXNoX25ld2Z1bmMKLQlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gdGFrZSBhcyBhbiBhcmd1bWVudCBhCi0JZnVuY3Rpb24gdG8gdXNlIHRvIGNyZWF0ZSBuZXcgZW50cmllcy4gIEZvciBhIGJhc2ljIGhhc2gKLQl0YWJsZSwgdXNlIHRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX25ld2Z1bmM+Pi4gIEB4cmVme0Rlcml2aW5nCi0JYSBOZXcgSGFzaCBUYWJsZSBUeXBlfSwgZm9yIHdoeSB5b3Ugd291bGQgd2FudCB0byB1c2UgYQotCWRpZmZlcmVudCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudC4KLQotQGZpbmRleCBiZmRfaGFzaF9hbGxvY2F0ZQotCTw8YmZkX2hhc2hfdGFibGVfaW5pdD4+IHdpbGwgY3JlYXRlIGFuIG9iamFsbG9jIHdoaWNoIHdpbGwgYmUKLQl1c2VkIHRvIGFsbG9jYXRlIG5ldyBlbnRyaWVzLiAgWW91IG1heSBhbGxvY2F0ZSBtZW1vcnkgb24gdGhpcwotCW9iamFsbG9jIHVzaW5nIDw8YmZkX2hhc2hfYWxsb2NhdGU+Pi4KLQotQGZpbmRleCBiZmRfaGFzaF90YWJsZV9mcmVlCi0JVXNlIDw8YmZkX2hhc2hfdGFibGVfZnJlZT4+IHRvIGZyZWUgdXAgYWxsIHRoZSBtZW1vcnkgdGhhdCBoYXMKLQliZWVuIGFsbG9jYXRlZCBmb3IgYSBoYXNoIHRhYmxlLiAgVGhpcyB3aWxsIG5vdCBmcmVlIHVwIHRoZQotCTw8c3RydWN0IGJmZF9oYXNoX3RhYmxlPj4gaXRzZWxmLCB3aGljaCB5b3UgbXVzdCBwcm92aWRlLgotCi1JTk9ERQotTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZywgVHJhdmVyc2luZyBhIEhhc2ggVGFibGUsIENyZWF0aW5nIGFuZCBGcmVlaW5nIGEgSGFzaCBUYWJsZSwgSGFzaCBUYWJsZXMKLVNVQlNFQ1RJT04KLQlMb29raW5nIHVwIG9yIGVudGVyaW5nIGEgc3RyaW5nCi0KLUBmaW5kZXggYmZkX2hhc2hfbG9va3VwCi0JVGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfbG9va3VwPj4gaXMgdXNlZCBib3RoIHRvIGxvb2sgdXAgYQotCXN0cmluZyBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgdG8gY3JlYXRlIGEgbmV3IGVudHJ5LgotCi0JSWYgdGhlIEB2YXJ7Y3JlYXRlfSBhcmd1bWVudCBpcyA8PGZhbHNlPj4sIDw8YmZkX2hhc2hfbG9va3VwPj4KLQl3aWxsIGxvb2sgdXAgYSBzdHJpbmcuICBJZiB0aGUgc3RyaW5nIGlzIGZvdW5kLCBpdCB3aWxsCi0JcmV0dXJucyBhIHBvaW50ZXIgdG8gYSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+LiAgSWYgdGhlCi0Jc3RyaW5nIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgPDxiZmRfaGFzaF9sb29rdXA+PiB3aWxsCi0JcmV0dXJuIDw8TlVMTD4+LiAgWW91IHNob3VsZCBub3QgbW9kaWZ5IGFueSBvZiB0aGUgZmllbGRzIGluCi0JdGhlIHJldHVybnMgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Pi4KLQotCUlmIHRoZSBAdmFye2NyZWF0ZX0gYXJndW1lbnQgaXMgPDx0cnVlPj4sIHRoZSBzdHJpbmcgd2lsbCBiZQotCWVudGVyZWQgaW50byB0aGUgaGFzaCB0YWJsZSBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4KLQlFaXRoZXIgd2F5IGEgcG9pbnRlciB0byBhIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4gd2lsbCBiZQotCXJldHVybmVkLCBlaXRoZXIgdG8gdGhlIGV4aXN0aW5nIHN0cnVjdHVyZSBvciB0byBhIG5ld2x5Ci0JY3JlYXRlZCBvbmUuICBJbiB0aGlzIGNhc2UsIGEgPDxOVUxMPj4gcmV0dXJuIG1lYW5zIHRoYXQgYW4KLQllcnJvciBvY2N1cnJlZC4KLQotCUlmIHRoZSBAdmFye2NyZWF0ZX0gYXJndW1lbnQgaXMgPDx0cnVlPj4sIGFuZCBhIG5ldyBlbnRyeSBpcwotCWNyZWF0ZWQsIHRoZSBAdmFye2NvcHl9IGFyZ3VtZW50IGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8KLQljb3B5IHRoZSBzdHJpbmcgb250byB0aGUgaGFzaCB0YWJsZSBvYmphbGxvYyBvciBub3QuICBJZgotCUB2YXJ7Y29weX0gaXMgcGFzc2VkIGFzIDw8ZmFsc2U+PiwgeW91IG11c3QgYmUgY2FyZWZ1bCBub3QgdG8KLQlkZWFsbG9jYXRlIG9yIG1vZGlmeSB0aGUgc3RyaW5nIGFzIGxvbmcgYXMgdGhlIGhhc2ggdGFibGUKLQlleGlzdHMuCi0KLUlOT0RFCi1UcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZSwgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlLCBMb29raW5nIFVwIG9yIEVudGVyaW5nIGEgU3RyaW5nLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCVRyYXZlcnNpbmcgYSBoYXNoIHRhYmxlCi0KLUBmaW5kZXggYmZkX2hhc2hfdHJhdmVyc2UKLQlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90cmF2ZXJzZT4+IG1heSBiZSB1c2VkIHRvIHRyYXZlcnNlIGEKLQloYXNoIHRhYmxlLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LiAgVGhlIHRyYXZlcnNhbAotCWlzIGRvbmUgaW4gYSByYW5kb20gb3JkZXIuCi0KLQk8PGJmZF9oYXNoX3RyYXZlcnNlPj4gdGFrZXMgYXMgYXJndW1lbnRzIGEgZnVuY3Rpb24gYW5kIGEKLQlnZW5lcmljIDw8dm9pZCAqPj4gcG9pbnRlci4gIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhCi0JaGFzaCB0YWJsZSBlbnRyeSAoYSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqPj4pIGFuZCB0aGUKLQlnZW5lcmljIHBvaW50ZXIgcGFzc2VkIHRvIDw8YmZkX2hhc2hfdHJhdmVyc2U+Pi4gIFRoZSBmdW5jdGlvbgotCW11c3QgcmV0dXJuIGEgPDxib29sZWFuPj4gdmFsdWUsIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRvCi0JY29udGludWUgdHJhdmVyc2luZyB0aGUgaGFzaCB0YWJsZS4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0JPDxmYWxzZT4+LCA8PGJmZF9oYXNoX3RyYXZlcnNlPj4gd2lsbCBzdG9wIHRoZSB0cmF2ZXJzYWwgYW5kCi0JcmV0dXJuIGltbWVkaWF0ZWx5LgotCi1JTk9ERQotRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlLCAsIFRyYXZlcnNpbmcgYSBIYXNoIFRhYmxlLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCURlcml2aW5nIGEgbmV3IGhhc2ggdGFibGUgdHlwZQotCi0JTWFueSB1c2VzIG9mIGhhc2ggdGFibGVzIHdhbnQgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotCXdoaWNoIGVhY2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBTb21lIGFsc28gZmluZCBpdAotCWNvbnZlbmllbnQgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBoYXNoIHRhYmxlCi0JaXRzZWxmLiAgVGhpcyBtYXkgYmUgZG9uZSB1c2luZyBhIGRlcml2ZWQgaGFzaCB0YWJsZS4KLQotCVNpbmNlIEMgaXMgbm90IGFuIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZSwgY3JlYXRpbmcgYSBkZXJpdmVkCi0JaGFzaCB0YWJsZSByZXF1aXJlcyBzdGlja2luZyB0b2dldGhlciBzb21lIGJvaWxlcnBsYXRlCi0Jcm91dGluZXMgd2l0aCBhIGZldyBkaWZmZXJlbmNlcyBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBoYXNoCi0JdGFibGUgeW91IHdhbnQgdG8gY3JlYXRlLgotCi0JQW4gZXhhbXBsZSBvZiBhIGRlcml2ZWQgaGFzaCB0YWJsZSBpcyB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0JVGhlIHN0cnVjdHVyZXMgZm9yIHRoaXMgYXJlIGRlZmluZWQgaW4gPDxiZmRsaW5rLmg+Pi4gIFRoZQotCWZ1bmN0aW9ucyBhcmUgaW4gPDxsaW5rZXIuYz4+LgotCi0JWW91IG1heSBhbHNvIGRlcml2ZSBhIGhhc2ggdGFibGUgZnJvbSBhbiBhbHJlYWR5IGRlcml2ZWQgaGFzaAotCXRhYmxlLiAgRm9yIGV4YW1wbGUsIHRoZSBhLm91dCBsaW5rZXIgYmFja2VuZCBjb2RlIHVzZXMgYSBoYXNoCi0JdGFibGUgZGVyaXZlZCBmcm9tIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotQG1lbnUKLUAqIERlZmluZSB0aGUgRGVyaXZlZCBTdHJ1Y3R1cmVzOjoKLUAqIFdyaXRlIHRoZSBEZXJpdmVkIENyZWF0aW9uIFJvdXRpbmU6OgotQCogV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lczo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLURlZmluZSB0aGUgRGVyaXZlZCBTdHJ1Y3R1cmVzLCBXcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZQotU1VCU1VCU0VDVElPTgotCURlZmluZSB0aGUgZGVyaXZlZCBzdHJ1Y3R1cmVzCi0KLQlZb3UgbXVzdCBkZWZpbmUgYSBzdHJ1Y3R1cmUgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLAotCWFuZCBhIHN0cnVjdHVyZSBmb3IgdGhlIGhhc2ggdGFibGUgaXRzZWxmLgotCi0JVGhlIGZpcnN0IGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoCi0JdGFibGUgbXVzdCBiZSBvZiB0aGUgdHlwZSB1c2VkIGZvciBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZQotCXlvdSBhcmUgZGVyaXZpbmcgZnJvbS4gIElmIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSBhIGJhc2ljIGhhc2gKLQl0YWJsZSB0aGlzIGlzIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4sIHdoaWNoIGlzIGRlZmluZWQgaW4KLQk8PGJmZC5oPj4uICBUaGUgZmlyc3QgZmllbGQgaW4gdGhlIHN0cnVjdHVyZSBmb3IgdGhlIGhhc2gKLQl0YWJsZSBpdHNlbGYgbXVzdCBiZSBvZiB0aGUgdHlwZSBvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlCi0JZGVyaXZpbmcgZnJvbSBpdHNlbGYuICBJZiB5b3UgYXJlIGRlcml2aW5nIGZyb20gYSBiYXNpYyBoYXNoCi0JdGFibGUsIHRoaXMgaXMgPDxzdHJ1Y3QgYmZkX2hhc2hfdGFibGU+Pi4KLQotCUZvciBleGFtcGxlLCB0aGUgbGlua2VyIGhhc2ggdGFibGUgZGVmaW5lcyA8PHN0cnVjdAotCWJmZF9saW5rX2hhc2hfZW50cnk+PiAoaW4gPDxiZmRsaW5rLmg+PikuICBUaGUgZmlyc3QgZmllbGQsCi0JPDxyb290Pj4sIGlzIG9mIHR5cGUgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Pi4gIFNpbWlsYXJseSwKLQl0aGUgZmlyc3QgZmllbGQgaW4gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LCA8PHRhYmxlPj4sCi0JaXMgb2YgdHlwZSA8PHN0cnVjdCBiZmRfaGFzaF90YWJsZT4+LgotCi1JTk9ERQotV3JpdGUgdGhlIERlcml2ZWQgQ3JlYXRpb24gUm91dGluZSwgV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lcywgRGVmaW5lIHRoZSBEZXJpdmVkIFN0cnVjdHVyZXMsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZQotU1VCU1VCU0VDVElPTgotCVdyaXRlIHRoZSBkZXJpdmVkIGNyZWF0aW9uIHJvdXRpbmUKLQotCVlvdSBtdXN0IHdyaXRlIGEgcm91dGluZSB3aGljaCB3aWxsIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhbgotCWVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgVGhpcyByb3V0aW5lIGlzIHBhc3NlZCBhcyB0aGUKLQlmdW5jdGlvbiBhcmd1bWVudCB0byA8PGJmZF9oYXNoX3RhYmxlX2luaXQ+Pi4KLQotCUluIG9yZGVyIHRvIHBlcm1pdCBvdGhlciBoYXNoIHRhYmxlcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlCi0JaGFzaCB0YWJsZSB5b3UgYXJlIGNyZWF0aW5nLCB0aGlzIHJvdXRpbmUgbXVzdCBiZSB3cml0dGVuIGluIGEKLQlzdGFuZGFyZCB3YXkuCi0KLQlUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNyZWF0aW9uIHJvdXRpbmUgaXMgYSBwb2ludGVyIHRvIGEKLQloYXNoIHRhYmxlIGVudHJ5LiAgVGhpcyBtYXkgYmUgPDxOVUxMPj4sIGluIHdoaWNoIGNhc2UgdGhlCi0Jcm91dGluZSBzaG91bGQgYWxsb2NhdGUgdGhlIHJpZ2h0IGFtb3VudCBvZiBzcGFjZS4gIE90aGVyd2lzZQotCXRoZSBzcGFjZSBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhIGhhc2ggdGFibGUgdHlwZQotCWRlcml2ZWQgZnJvbSB0aGlzIG9uZS4KLQotCUFmdGVyIGFsbG9jYXRpbmcgc3BhY2UsIHRoZSBjcmVhdGlvbiByb3V0aW5lIG11c3QgY2FsbCB0aGUKLQljcmVhdGlvbiByb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHR5cGUgaXQgaXMgZGVyaXZlZCBmcm9tLAotCXBhc3NpbmcgaW4gYSBwb2ludGVyIHRvIHRoZSBzcGFjZSBpdCBqdXN0IGFsbG9jYXRlZC4gIFRoaXMKLQl3aWxsIGluaXRpYWxpemUgYW55IGZpZWxkcyB1c2VkIGJ5IHRoZSBiYXNlIGhhc2ggdGFibGUuCi0KLQlGaW5hbGx5IHRoZSBjcmVhdGlvbiByb3V0aW5lIG11c3QgaW5pdGlhbGl6ZSBhbnkgbG9jYWwgZmllbGRzCi0JZm9yIHRoZSBuZXcgaGFzaCB0YWJsZSB0eXBlLgotCi0JSGVyZSBpcyBhIGJvaWxlcnBsYXRlIGV4YW1wbGUgb2YgYSBjcmVhdGlvbiByb3V0aW5lLgotCUB2YXJ7ZnVuY3Rpb25fbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIHJvdXRpbmUuCi0JQHZhcntlbnRyeV90eXBlfSBpcyB0aGUgdHlwZSBvZiBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSB5b3UKLQlhcmUgY3JlYXRpbmcuICBAdmFye2Jhc2VfbmV3ZnVuY30gaXMgdGhlIG5hbWUgb2YgdGhlIGNyZWF0aW9uCi0Jcm91dGluZSBvZiB0aGUgaGFzaCB0YWJsZSB0eXBlIHlvdXIgaGFzaCB0YWJsZSBpcyBkZXJpdmVkCi0JZnJvbS4KLQotRVhBTVBMRQotCi0uc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLS5AdmFye2Z1bmN0aW9uX25hbWV9IChlbnRyeSwgdGFibGUsIHN0cmluZykKLS4gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0uICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotLiAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotLnsKLS4gIHN0cnVjdCBAdmFye2VudHJ5X3R5cGV9ICpyZXQgPSAoQHZhcntlbnRyeV90eXBlfSAqKSBlbnRyeTsKLS4KLS4geyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotLiAgICBkZXJpdmVkIGNsYXNzLiAgKn0KLS4gIGlmIChyZXQgPT0gKEB2YXJ7ZW50cnlfdHlwZX0gKikgTlVMTCkKLS4gICAgewotLiAgICAgIHJldCA9ICgoQHZhcntlbnRyeV90eXBlfSAqKQotLgkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoQHZhcntlbnRyeV90eXBlfSkpKTsKLS4gICAgICBpZiAocmV0ID09IChAdmFye2VudHJ5X3R5cGV9ICopIE5VTEwpCi0uICAgICAgICByZXR1cm4gTlVMTDsKLS4gICAgfQotLgotLiB7KiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgYmFzZSBjbGFzcy4gICp9Ci0uICByZXQgPSAoKEB2YXJ7ZW50cnlfdHlwZX0gKikKLS4JIEB2YXJ7YmFzZV9uZXdmdW5jfSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLS4KLS4geyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzIGhlcmUuICAqfQotLgotLiAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotLn0KLQotREVTQ1JJUFRJT04KLQlUaGUgY3JlYXRpb24gcm91dGluZSBmb3IgdGhlIGxpbmtlciBoYXNoIHRhYmxlLCB3aGljaCBpcyBpbgotCTw8bGlua2VyLmM+PiwgbG9va3MganVzdCBsaWtlIHRoaXMgZXhhbXBsZS4KLQlAdmFye2Z1bmN0aW9uX25hbWV9IGlzIDw8X2JmZF9saW5rX2hhc2hfbmV3ZnVuYz4+LgotCUB2YXJ7ZW50cnlfdHlwZX0gaXMgPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeT4+LgotCUB2YXJ7YmFzZV9uZXdmdW5jfSBpcyA8PGJmZF9oYXNoX25ld2Z1bmM+PiwgdGhlIGNyZWF0aW9uCi0Jcm91dGluZSBmb3IgYSBiYXNpYyBoYXNoIHRhYmxlLgotCi0JPDxfYmZkX2xpbmtfaGFzaF9uZXdmdW5jPj4gYWxzbyBpbml0aWFsaXplcyB0aGUgbG9jYWwgZmllbGRzCi0JaW4gYSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyeTogPDx0eXBlPj4sIDw8d3JpdHRlbj4+IGFuZAotCTw8bmV4dD4+LgotCi1JTk9ERQotV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lcywgLCBXcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUKLVNVQlNVQlNFQ1RJT04KLQlXcml0ZSBvdGhlciBkZXJpdmVkIHJvdXRpbmVzCi0KLQlZb3Ugd2lsbCB3YW50IHRvIHdyaXRlIG90aGVyIHJvdXRpbmVzIGZvciB5b3VyIG5ldyBoYXNoIHRhYmxlLAotCWFzIHdlbGwuICAKLQotCVlvdSB3aWxsIHdhbnQgYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSB3aGljaCBjYWxscyB0aGUKLQlpbml0aWFsaXphdGlvbiByb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHlvdSBhcmUgZGVyaXZpbmcgZnJvbQotCWFuZCBpbml0aWFsaXplcyBhbnkgb3RoZXIgbG9jYWwgZmllbGRzLiAgRm9yIHRoZSBsaW5rZXIgaGFzaAotCXRhYmxlLCB0aGlzIGlzIDw8X2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdD4+IGluIDw8bGlua2VyLmM+Pi4KLQotCVlvdSB3aWxsIHdhbnQgYSBsb29rdXAgcm91dGluZSB3aGljaCBjYWxscyB0aGUgbG9va3VwIHJvdXRpbmUKLQlvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlIGRlcml2aW5nIGZyb20gYW5kIGNhc3RzIHRoZSByZXN1bHQuCi0JVGhlIGxpbmtlciBoYXNoIHRhYmxlIHVzZXMgPDxiZmRfbGlua19oYXNoX2xvb2t1cD4+IGluCi0JPDxsaW5rZXIuYz4+ICh0aGlzIGFjdHVhbGx5IHRha2VzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hpY2gKLQlpdCB1c2VzIHRvIGRlY2lkZSBob3cgdG8gcmV0dXJuIHRoZSBsb29rZWQgdXAgdmFsdWUpLgotCi0JWW91IG1heSB3YW50IGEgdHJhdmVyc2FsIHJvdXRpbmUuICBUaGlzIHNob3VsZCBqdXN0IGNhbGwgdGhlCi0JdHJhdmVyc2FsIHJvdXRpbmUgb2YgdGhlIGhhc2ggdGFibGUgeW91IGFyZSBkZXJpdmluZyBmcm9tIHdpdGgKLQlhcHByb3ByaWF0ZSBjYXN0cy4gIFRoZSBsaW5rZXIgaGFzaCB0YWJsZSB1c2VzCi0JPDxiZmRfbGlua19oYXNoX3RyYXZlcnNlPj4gaW4gPDxsaW5rZXIuYz4+LgotCi0JVGhlc2Ugcm91dGluZXMgbWF5IHNpbXBseSBiZSBkZWZpbmVkIGFzIG1hY3Jvcy4gIEZvciBleGFtcGxlLAotCXRoZSBhLm91dCBiYWNrZW5kIGxpbmtlciBoYXNoIHRhYmxlLCB3aGljaCBpcyBkZXJpdmVkIGZyb20gdGhlCi0JbGlua2VyIGhhc2ggdGFibGUsIHVzZXMgbWFjcm9zIGZvciB0aGUgbG9va3VwIGFuZCB0cmF2ZXJzYWwKLQlyb3V0aW5lcy4gIFRoZXNlIGFyZSA8PGFvdXRfbGlua19oYXNoX2xvb2t1cD4+IGFuZAotCTw8YW91dF9saW5rX2hhc2hfdHJhdmVyc2U+PiBpbiBhb3V0eC5oLgotKi8KLQotLyogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGVudHJpZXMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgREVGQVVMVF9TSVpFICg0MDUxKQotCi0vKiBDcmVhdGUgYSBuZXcgaGFzaCB0YWJsZSwgZ2l2ZW4gYSBudW1iZXIgb2YgZW50cmllcy4gICovCi0KLWJvb2xlYW4KLWJmZF9oYXNoX3RhYmxlX2luaXRfbiAodGFibGUsIG5ld2Z1bmMsIHNpemUpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgYWxsb2MgPSBzaXplICogc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKik7Ci0KLSAgdGFibGUtPm1lbW9yeSA9IChQVFIpIG9iamFsbG9jX2NyZWF0ZSAoKTsKLSAgaWYgKHRhYmxlLT5tZW1vcnkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHRhYmxlLT50YWJsZSA9ICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqKQotCQkgIG9iamFsbG9jX2FsbG9jICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnksIGFsbG9jKSk7Ci0gIGlmICh0YWJsZS0+dGFibGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbXNldCAoKFBUUikgdGFibGUtPnRhYmxlLCAwLCBhbGxvYyk7Ci0gIHRhYmxlLT5zaXplID0gc2l6ZTsKLSAgdGFibGUtPm5ld2Z1bmMgPSBuZXdmdW5jOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IGhhc2ggdGFibGUgd2l0aCB0aGUgZGVmYXVsdCBudW1iZXIgb2YgZW50cmllcy4gICovCi0KLWJvb2xlYW4KLWJmZF9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICByZXR1cm4gYmZkX2hhc2hfdGFibGVfaW5pdF9uICh0YWJsZSwgbmV3ZnVuYywgREVGQVVMVF9TSVpFKTsKLX0KLQotLyogRnJlZSBhIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1iZmRfaGFzaF90YWJsZV9mcmVlICh0YWJsZSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLXsKLSAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSB0YWJsZS0+bWVtb3J5KTsKLSAgdGFibGUtPm1lbW9yeSA9IE5VTEw7Ci19Ci0KLS8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWJmZF9oYXNoX2xvb2t1cCAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotICAgICBib29sZWFuIGNvcHk7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaGFzaHA7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgCi0gIGhhc2ggPSAwOwotICBsZW4gPSAwOwotICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyaW5nOwotICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggKz0gYyArIChjIDw8IDE3KTsKLSAgICAgIGhhc2ggXj0gaGFzaCA+PiAyOwotICAgICAgKytsZW47Ci0gICAgfQotICBoYXNoICs9IGxlbiArIChsZW4gPDwgMTcpOwotICBoYXNoIF49IGhhc2ggPj4gMjsKLQotICBpbmRleCA9IGhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgZm9yIChoYXNocCA9IHRhYmxlLT50YWJsZVtpbmRleF07Ci0gICAgICAgaGFzaHAgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIGhhc2hwID0gaGFzaHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKGhhc2hwLT5oYXNoID09IGhhc2gKLQkgICYmIHN0cmNtcCAoaGFzaHAtPnN0cmluZywgc3RyaW5nKSA9PSAwKQotCXJldHVybiBoYXNocDsKLSAgICB9Ci0KLSAgaWYgKCEgY3JlYXRlKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7Ci0KLSAgaGFzaHAgPSAoKnRhYmxlLT5uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMLCB0YWJsZSwgc3RyaW5nKTsKLSAgaWYgKGhhc2hwID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICBpZiAoY29weSkKLSAgICB7Ci0gICAgICBjaGFyICpuZXc7Ci0KLSAgICAgIG5ldyA9IChjaGFyICopIG9iamFsbG9jX2FsbG9jICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnksCi0JCQkJICAgICBsZW4gKyAxKTsKLSAgICAgIGlmICghbmV3KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKLQl9Ci0gICAgICBzdHJjcHkgKG5ldywgc3RyaW5nKTsKLSAgICAgIHN0cmluZyA9IG5ldzsKLSAgICB9Ci0gIGhhc2hwLT5zdHJpbmcgPSBzdHJpbmc7Ci0gIGhhc2hwLT5oYXNoID0gaGFzaDsKLSAgaGFzaHAtPm5leHQgPSB0YWJsZS0+dGFibGVbaW5kZXhdOwotICB0YWJsZS0+dGFibGVbaW5kZXhdID0gaGFzaHA7Ci0KLSAgcmV0dXJuIGhhc2hwOwotfQotCi0vKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWJmZF9oYXNoX3JlcGxhY2UgKHRhYmxlLCBvbGQsIG53KQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm9sZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpudzsKLXsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKipwcGg7Ci0KLSAgaW5kZXggPSBvbGQtPmhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgZm9yIChwcGggPSAmdGFibGUtPnRhYmxlW2luZGV4XTsKLSAgICAgICAoKnBwaCkgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIHBwaCA9ICYoKnBwaCktPm5leHQpCi0gICAgewotICAgICAgaWYgKCpwcGggPT0gb2xkKQotCXsKLQkgICpwcGggPSBudzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGFib3J0ICgpOwotfQotCi0vKiBCYXNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWJmZF9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChlbnRyeSA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgZW50cnkgPSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKQotCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSkpKTsKLSAgcmV0dXJuIGVudHJ5OwotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBpbiBhIGhhc2ggdGFibGUuICAqLwotCi1QVFIKLWJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIFBUUiByZXQ7Ci0KLSAgcmV0ID0gb2JqYWxsb2NfYWxsb2MgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgdGFibGUtPm1lbW9yeSwgc2l6ZSk7Ci0gIGlmIChyZXQgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWJmZF9oYXNoX3RyYXZlcnNlICh0YWJsZSwgZnVuYywgaW5mbykKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYm9vbGVhbiAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLSAgICAgUFRSIGluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+c2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqcDsKLQotICAgICAgZm9yIChwID0gdGFibGUtPnRhYmxlW2ldOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmICghICgqZnVuYykgKHAsIGluZm8pKQotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQwKLS8qIEEgZmV3IGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIChhLm91dCwgQ09GRiwgRUxGKSB1c2UgYSBzdHJpbmcKLSAgIHRhYmxlLiAgVGhlc2UgZnVuY3Rpb25zIHN1cHBvcnQgYWRkaW5nIHN0cmluZ3MgdG8gYSBzdHJpbmcgdGFibGUsCi0gICByZXR1cm5pbmcgdGhlIGJ5dGUgb2Zmc2V0LCBhbmQgd3JpdGluZyBvdXQgdGhlIHRhYmxlLgotCi0gICBQb3NzaWJsZSBpbXByb3ZlbWVudHM6Ci0gICArIGxvb2sgZm9yIHN0cmluZ3MgbWF0Y2hpbmcgdHJhaWxpbmcgc3Vic3RyaW5ncyBvZiBvdGhlciBzdHJpbmdzCi0gICArIGJldHRlciBkYXRhIHN0cnVjdHVyZXM/ICBiYWxhbmNlZCB0cmVlcz8KLSAgICsgbG9vayBhdCByZWR1Y2luZyBtZW1vcnkgdXNlIGVsc2V3aGVyZSAtLSBtYXliZSBpZiB3ZSBkaWRuJ3QgaGF2ZQotICAgICB0byBjb25zdHJ1Y3QgdGhlIGVudGlyZSBzeW1ib2wgdGFibGUgYXQgb25jZSwgd2UgY291bGQgZ2V0IGJ5Ci0gICAgIHdpdGggc21hbGxlciBhbW91bnRzIG9mIFZNPyAgKFdoYXQgZWZmZWN0IGRvZXMgdGhhdCBoYXZlIG9uIHRoZQotICAgICBzdHJpbmcgdGFibGUgcmVkdWN0aW9ucz8pICAqLwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgc3RydGFiIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEluZGV4IGluIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgaW5kZXg7Ci0gIC8qIE5leHQgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqbmV4dDsKLX07Ci0KLS8qIFRoZSBzdHJ0YWIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2gKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotICAvKiBTaXplIG9mIHN0cnRhYi0tYWxzbyBuZXh0IGF2YWlsYWJsZSBpbmRleC4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogRmlyc3Qgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqZmlyc3Q7Ci0gIC8qIExhc3Qgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqbGFzdDsKLSAgLyogV2hldGhlciB0byBwcmVjZWRlIHN0cmluZ3Mgd2l0aCBhIHR3byBieXRlIGxlbmd0aCwgYXMgaW4gdGhlCi0gICAgIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgYm9vbGVhbiB4Y29mZjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0cnRhYl9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYSBzdHJ0YWIuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0cnRhYl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmRleCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBzdHJ0YWIuICAqLwotCi0jZGVmaW5lIHN0cnRhYl9oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIENyZWF0ZSBhIG5ldyBzdHJ0YWIuICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfc3RyaW5ndGFiX2luaXQgKCkKLXsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFibGU7Ci0KLSAgdGFibGUgPSAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikKLQkgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfc3RydGFiX2hhc2gpKSk7Ci0gIGlmICh0YWJsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIHN0cnRhYl9oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHRhYmxlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB0YWJsZS0+c2l6ZSA9IDA7Ci0gIHRhYmxlLT5maXJzdCA9IE5VTEw7Ci0gIHRhYmxlLT5sYXN0ID0gTlVMTDsKLSAgdGFibGUtPnhjb2ZmID0gZmFsc2U7Ci0KLSAgcmV0dXJuIHRhYmxlOwotfQotCi0vKiBDcmVhdGUgYSBuZXcgc3RydGFiIGluIHdoaWNoIHRoZSBzdHJpbmdzIGFyZSBvdXRwdXQgaW4gdGhlIGZvcm1hdAotICAgdXNlZCBpbiB0aGUgWENPRkYgLmRlYnVnIHNlY3Rpb246IGEgdHdvIGJ5dGUgbGVuZ3RoIHByZWNlZGVzIGVhY2gKLSAgIHN0cmluZy4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKgotX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCAoKQotewotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpyZXQ7Ci0KLSAgcmV0ID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHJldC0+eGNvZmYgPSB0cnVlOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBGcmVlIGEgc3RydGFiLiAgKi8KLQotdm9pZAotX2JmZF9zdHJpbmd0YWJfZnJlZSAodGFibGUpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYmxlOwotewotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmdGFibGUtPnRhYmxlKTsKLSAgZnJlZSAodGFibGUpOwotfQotCi0vKiBHZXQgdGhlIGluZGV4IG9mIGEgc3RyaW5nIGluIGEgc3RydGFiLCBhZGRpbmcgaXQgaWYgaXQgaXMgbm90Ci0gICBhbHJlYWR5IHByZXNlbnQuICBJZiBIQVNIIGlzIGZhbHNlLCB3ZSBkb24ndCByZWFsbHkgdXNlIHRoZSBoYXNoCi0gICB0YWJsZSwgYW5kIHdlIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGUgc3RyaW5ncy4gICovCi0KLWJmZF9zaXplX3R5cGUKLV9iZmRfc3RyaW5ndGFiX2FkZCAodGFiLCBzdHIsIGhhc2gsIGNvcHkpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBib29sZWFuIGhhc2g7Ci0gICAgIGJvb2xlYW4gY29weTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICplbnRyeTsKLQotICBpZiAoaGFzaCkKLSAgICB7Ci0gICAgICBlbnRyeSA9IHN0cnRhYl9oYXNoX2xvb2t1cCAodGFiLCBzdHIsIHRydWUsIGNvcHkpOwotICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbnRyeSA9ICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopCi0JICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmdGFiLT50YWJsZSwKLQkJCQkgIHNpemVvZiAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5KSkpOwotICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICAgIGlmICghIGNvcHkpCi0JZW50cnktPnJvb3Quc3RyaW5nID0gc3RyOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKm47Ci0KLQkgIG4gPSAoY2hhciAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJnRhYi0+dGFibGUsIHN0cmxlbiAoc3RyKSArIDEpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLQkgIGVudHJ5LT5yb290LnN0cmluZyA9IG47Ci0JfQotICAgICAgZW50cnktPmluZGV4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgICAgZW50cnktPm5leHQgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZW50cnktPmluZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLSAgICB7Ci0gICAgICBlbnRyeS0+aW5kZXggPSB0YWItPnNpemU7Ci0gICAgICB0YWItPnNpemUgKz0gc3RybGVuIChzdHIpICsgMTsKLSAgICAgIGlmICh0YWItPnhjb2ZmKQotCXsKLQkgIGVudHJ5LT5pbmRleCArPSAyOwotCSAgdGFiLT5zaXplICs9IDI7Ci0JfQotICAgICAgaWYgKHRhYi0+Zmlyc3QgPT0gTlVMTCkKLQl0YWItPmZpcnN0ID0gZW50cnk7Ci0gICAgICBlbHNlCi0JdGFiLT5sYXN0LT5uZXh0ID0gZW50cnk7Ci0gICAgICB0YWItPmxhc3QgPSBlbnRyeTsKLSAgICB9Ci0KLSAgcmV0dXJuIGVudHJ5LT5pbmRleDsKLX0KLQotLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzdHJ0YWIuICAqLwotCi1iZmRfc2l6ZV90eXBlCi1fYmZkX3N0cmluZ3RhYl9zaXplICh0YWIpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLXsKLSAgcmV0dXJuIHRhYi0+c2l6ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RydGFiLiAgQUJGRCBtdXN0IGFscmVhZHkgYmUgYXQgdGhlIHJpZ2h0IGxvY2F0aW9uIGluCi0gICB0aGUgZmlsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIHRhYikKLSAgICAgcmVnaXN0ZXIgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci17Ci0gIHJlZ2lzdGVyIGJvb2xlYW4geGNvZmY7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0KLSAgeGNvZmYgPSB0YWItPnhjb2ZmOwotCi0gIGZvciAoZW50cnkgPSB0YWItPmZpcnN0OyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgIHJlZ2lzdGVyIHNpemVfdCBsZW47Ci0KLSAgICAgIHN0ciA9IGVudHJ5LT5yb290LnN0cmluZzsKLSAgICAgIGxlbiA9IHN0cmxlbiAoc3RyKSArIDE7Ci0KLSAgICAgIGlmICh4Y29mZikKLQl7Ci0JICBiZmRfYnl0ZSBidWZbMl07Ci0KLQkgIC8qIFRoZSBvdXRwdXQgbGVuZ3RoIGluY2x1ZGVzIHRoZSBudWxsIGJ5dGUuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgbGVuLCBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmLCAxLCAyLCBhYmZkKSAhPSAyKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzdHIsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvaG9zdC1hb3V0LmMgYi9iZmQvaG9zdC1hb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjQzZGMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3QtYW91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGxvY2FsIGhvc3QncyBhLm91dCBiaW5hcmllcwotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBQcm9iYWJseSBKb2huIEdpbG1vcmUncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUJQVJDSF9TSVpFCTMyCi0KLS8qIFdoZW4gcG9ydGluZyB0byBhIG5ldyBzeXN0ZW0sIHlvdSBtdXN0IHN1cHBseToKLQotCUhPU1RfUEFHRV9TSVpFCQkob3B0aW9uYWwpCi0JSE9TVF9TRUdNRU5UX1NJWkUJKG9wdGlvbmFsIC0tIGRlZmF1bHRzIHRvIHBhZ2Ugc2l6ZSkKLQlIT1NUX01BQ0hJTkVfQVJDSAkob3B0aW9uYWwpCi0JSE9TVF9NQUNISU5FX01BQ0hJTkUJKG9wdGlvbmFsKQotCUhPU1RfVEVYVF9TVEFSVF9BRERSCShvcHRpb25hbCkKLQlIT1NUX1NUQUNLX0VORF9BRERSCShub3QgdXNlZCwgZXhjZXB0IGJ5IHRyYWQtY29yZSA/Pz8pCi0JSE9TVF9CSUdfRU5ESUFOX1AJKHJlcXVpcmVkIC0tIGRlZmluZSBpZiBiaWctZW5kaWFuKQotCi0gICBpbiB0aGUgLi9ob3N0cy9oLXN5c3RlbW5hbWUuaCBmaWxlLiAgKi8KLQotI2lmZGVmIFRSQURfSEVBREVSCi0jaW5jbHVkZSBUUkFEX0hFQURFUgotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfUEFHRV9TSVpFCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJSE9TVF9QQUdFX1NJWkUKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1NFR01FTlRfU0laRQotI2RlZmluZQlTRUdNRU5UX1NJWkUJSE9TVF9TRUdNRU5UX1NJWkUKLSNlbHNlCi0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9URVhUX1NUQVJUX0FERFIKLSNkZWZpbmUJVEVYVF9TVEFSVF9BRERSCUhPU1RfVEVYVF9TVEFSVF9BRERSCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9TVEFDS19FTkRfQUREUgotI2RlZmluZQlTVEFDS19FTkRfQUREUglIT1NUX1NUQUNLX0VORF9BRERSCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9CSUdfRU5ESUFOX1AKLSNkZWZpbmUJVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2Vsc2UKLSN1bmRlZiAgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIEhPU1RfTUFDSElORV9BUkNICi0jaWZkZWYgSE9TVF9NQUNISU5FX01BQ0hJTkUKLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChhYmZkLCBleGVjcCkgXAotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKGFiZmQsIEhPU1RfTUFDSElORV9BUkNILCBIT1NUX01BQ0hJTkVfTUFDSElORSkKLSNlbHNlCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goYWJmZCwgZXhlY3ApIFwKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBIT1NUX01BQ0hJTkVfQVJDSCwgMCkKLSNlbmRpZgotI2VuZGlmIC8qIEhPU1RfTUFDSElORV9BUkNIICovCi0KLSNkZWZpbmUgTVkoT1ApIENBVChob3N0X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dCIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvYWxwaGFsaW51eC5oIGIvYmZkL2hvc3RzL2FscGhhbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliOGQ2OS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvYWxwaGFsaW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vKiBMaW51eCBkdW1wcyAic3RydWN0IHRhc2tfc3RydWN0IiBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlLWZpbGUuICBUaGlzCi0gICBzdHJ1Y3R1cmUgaXMgY3VycmVudGx5IDEwODAgYnl0ZXMgbG9uZywgYnV0IHdlIGFsbG93IHVwIHRvIDQwOTYKLSAgIGJ5dGVzIHRvIGFsbG93IGZvciBzb21lIGZ1dHVyZSBncm93dGguICAqLwotI2RlZmluZSBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECQk0MDk2Ci0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGFiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5zaWduYWwpCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvYWxwaGF2bXMuaCBiL2JmZC9ob3N0cy9hbHBoYXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWUzOTFhLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9hbHBoYXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogYWxwaGF2bXMuaCAtLSBCRkQgZGVmaW5pdGlvbnMgZm9yIGFuIG9wZW5WTVMgaG9zdAotICAgQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkKLSAgIG9mIHByb0dJUyBTb2Z0d2FyZWVudHdpY2tsdW5nLCBBYWNoZW4sIEdlcm1hbnkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2luY2x1ZGUgPHVuaXhpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotLyogTWFrZSB0aGUgYmFzaWMgdHlwZXMgNjQtYml0IHF1YW50aXRpZXMgb24gdGhlIGhvc3QuCi0gICBBbHNvIHByb3ZpZGUgdGhlIHN1cHBvcnQgbWFjcm9zIEJGRCBuZWVkcy4gICovCi0jIGlmZGVmIF9fR05VQ19fCi0jICBkZWZpbmUJQkZEX0hPU1RfNjRfQklUCWxvbmcgbG9uZwotIyBlbHNlCi0jICBkZWZpbmUJQkZEX0hPU1RfNjRfQklUCWxvbmcKLSMgZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUIHVpbnQ2NF90eXBlOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgaW50NjRfdHlwZTsKLQotIyBkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkgLyogQkZEX0hPU1RfNjRfQklUICovCi0jIGRlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotIyBkZWZpbmUgQllURVNfSU5fUFJJTlRGX0lOVCA0Ci0KLS8qIFRoZXNlIG11c3QgaGF2ZSB0eXBlIHVuc2lnbmVkIGxvbmcgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGFzCi0gICBhcmd1bWVudHMgaW4gcHJpbnRmIGZ1bmN0aW9ucy4gICovCi0jIGRlZmluZSB1aW50NjRfdHlwZUxPVyh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpICYgMHhmZmZmZmZmZikpKSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLSMgZGVmaW5lIHVpbnQ2NF90eXBlSElHSCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotI2VuZGlmIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotCi0jaW5jbHVkZSAiZm9wZW4tdm1zLmgiCi0KLSNkZWZpbmUgTk9fRkNOVEwgMQotCi0jaWZuZGVmIE9fQUNDTU9ERQotI2RlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZIHwgT19XUk9OTFkgfCBPX1JEV1IpCi0jZW5kaWYKLQotZXh0ZXJuIGludCBnZXRwYWdlc2l6ZSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oIGIvYmZkL2hvc3RzL2RlY3N0YXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwYzE0My4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogSG9wZWZ1bGx5IHRoaXMgc2hvdWxkIGluY2x1ZGUgZWl0aGVyIG1hY2hpbmUvcGFyYW0uaCAoVWx0cml4KSBvcgotICAgbWFjaGluZS9tYWNocGFyYW0uaCAoTWFjaCksIHdoaWNoZXZlciBpcyBpdHMgbmFtZSBvbiB0aGlzIHN5c3RlbS4gICovCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHIC0tIHdlIHVzZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQlVU1JURVhUCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCQlVU1JEQVRBCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCi0KLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVsdGE2OC5oIGIvYmZkL2hvc3RzL2RlbHRhNjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2YTZlNi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZGVsdGE2OC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGEgTW90b3JvbGEgRGVsdGEgMzMwMCBib3ggcnVubmluZyBTeXN0ZW0gViBSMy4wLgotICAgQ29udHJpYnV0ZWQgYnkgbWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGUuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIERlZmluaXRpb25zIHVzZWQgYnkgdHJhZC1jb3JlLmMuICAqLwotI2RlZmluZQlOQlBHCQkJTkJQQwotI2RlZmluZQlIT1NUX0RBVEFfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X2RhdG9yZwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X3R4dG9yZwotI2lmIDAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDQwMDAwMDAwCi0jZWxzZQotLyogVXNlcidzIHN0YWNrLCBjb3BpZWQgZnJvbSBzeXMvcGFyYW0uaCAgKi8KLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwotI2VuZGlmCi0jZGVmaW5lCVVQQUdFUwkJCVVTSVpFCi0jZGVmaW5lCVRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2Fib3J0CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZHB4Mi5oIGIvYmZkL2hvc3RzL2RweDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2Mzk1Zi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZHB4Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyB0aGF0IGFyZSBuZWVkZWQgZm9yIGNvcmUgZmlsZXMuICBDb3JlIHNlY3Rpb24gc2l6ZXMgZm9yCi0gICB0aGUgRFBYMiBhcmUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZGVmaW5lIE5CUEcgMQotI2RlZmluZSBVUEFHRVMgKFVTSVpFICogTkJQUCkKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgKHUudV9leGRhdGEudXhfZGF0b3JnKQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIChVU0VSU1RBQ0spCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaHAzMDBic2QuaCBiL2JmZC9ob3N0cy9ocDMwMGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI4NzE3Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9ocDMwMGJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEJTRDRfNAotI2RlZmluZSBOT19DT1JFX0NPTU1BTkQKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcJLyogRGF0YSBzZWcgc3RhcnQgYWRkciByb3VuZHMgdG8gTkJQRyAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9tNjhrCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCTB4ZmZmMDAwMDAKLSNkZWZpbmUJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2YnNkLmggYi9iZmQvaG9zdHMvaTM4NmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWVlM2Q4Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBJbnRlbCAzODYgcnVubmluZyBhbnkgQlNEIFVuaXggKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotLyogUmVjZW50IHZlcnNpb25zIG9mIEZyZWVCU0QgZG9uJ3QgZGVmaW5lIE5CUEcuICAqLwotI2lmbmRlZiBOQlBHCi0jaWZkZWYgUEFHRV9TSVpFCi0jZGVmaW5lIE5CUEcgUEFHRV9TSVpFCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLQotLyogSm9saXR6IHN1Z2dlc3RlZCBkZWZpbmluZyBIT1NUX1NUQUNLX0VORF9BRERSIHRvCi0gICAodS51X2twcm9jLmtwX2Vwcm9jLmVfdm0udm1fbWF4c2FkZHIgKyBNQVhTU0laKSwgd2hpY2ggc2hvdWxkIHdvcmsgb24KLSAgIGJvdGggQlNESSBhbmQgMzg2QlNELCBidXQgdGhhdCBpcyBiZWxpZXZlZCBub3QgdG8gd29yayBmb3IgQlNEIDQuNC4gICovCi0KLSNpZmRlZiBfX2JzZGlfXwotLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgcmlnaHQgdGhpbmcgZm9yIEJTREkuICAqLwotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQlVU1JTVEFDSwotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAoKGJmZF92bWEpdS51X2twcm9jLmtwX2Vwcm9jLmVfdm0udm1fZGFkZHIpCi0jZWxzZQotLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgcmlnaHQgdGhpbmcgZm9yIDM4NkJTRCByZWxlYXNlIDAuMS4gICovCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCShVU1JTVEFDSyAtIE1BWFNTSVopCi0jZW5kaWYKLQotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGNvcmVfYmZkKSBcCi0gICgoY29yZV9iZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X3NpZykKLSNkZWZpbmUgdV9jb21tIHVfa3Byb2Mua3BfcHJvYy5wX2NvbW0KZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2bGludXguaCBiL2JmZC9ob3N0cy9pMzg2bGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhNTFmMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NmxpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qIExpbnV4IHdyaXRlcyB0aGUgdGFzayBzdHJ1Y3R1cmUgYXQgdGhlIGVuZCBvZiB0aGUgY29yZSBmaWxlLiAgQ3VycmVudGx5IGl0Ci0gICBpcyAyOTEyIGJ5dGVzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIHNob3VsZCBiZSBhIHBpY2tpZXIgY2hlY2ssIGJ1dAotICAgd2Ugc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB0b28gcGlja3kgKHRoZSBzaXplIG9mIHRoZSB0YXNrIHN0cnVjdHVyZSBtaWdodAotICAgdmFyeSwgYW5kIGlmIGl0J3Mgbm90IHRoZSBsZW5ndGggd2UgZXhwZWN0IGl0IHRvIGJlLCBpdCBkb2Vzbid0IGFmZmVjdAotICAgb3VyIGFiaWxpdHkgdG8gcHJvY2VzcyB0aGUgY29yZSBmaWxlKS4gIFNvIGFsbG93IDAtNDA5NiBleHRyYSBieXRlcyBhdAotICAgdGhlIGVuZC4gICovCi0KLSNkZWZpbmUgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRCA0MDk2CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4Nm1hY2gzLmggYi9iZmQvaG9zdHMvaTM4Nm1hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzYxZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2kzODZtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi1GSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4NnNjby5oIGIvYmZkL2hvc3RzL2kzODZzY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NjA4Yy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NnNjby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogQ29yZSBmaWxlIHN0dWZmLiAgQXQgbGVhc3Qgc29tZSwgcGVyaGFwcyBhbGwsIG9mIHRoZSBmb2xsb3dpbmcKLSAgIGRlZmluZXMgd29yayBvbiBtYW55IG1vcmUgc3lzdGVtcyB0aGFuIGp1c3QgU0NPLiAgKi8KLQotI2RlZmluZSBOQlBHIE5CUEMKLSNkZWZpbmUgVVBBR0VTIFVTSVpFCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIHUudV9leGRhdGEudXhfZGF0b3JnCi0jZGVmaW5lIEhPU1RfU1RBQ0tfU1RBUlRfQUREUiB1LnVfc3ViCi0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGNvcmVfdXBhZ2UoYWJmZCktPnVfc3lzYWJvcnQgIT0gMCkgXAotICAgPyBjb3JlX3VwYWdlKGFiZmQpLT51X3N5c2Fib3J0IFwKLSAgIDogLTEpCi0KLS8qIEFjY29yZGluZyB0byB0aGUgbWFucGFnZSwgYSB2ZXJzaW9uIDIgU0NPIGNvcmVmaWxlIGNhbiBjb250YWluCi0gICB2YXJpb3VzIGFkZGl0aW9uYWwgc2VjdGlvbnMgKGl0IGlzIGNsZXZlcmx5IGFycmFuZ2VkIHNvIHRoZSB1IGFyZWEsCi0gICBkYXRhLCBhbmQgc3RhY2sgYXJlIGZpcnN0IHdoZXJlIHdlIGNhbiBmaW5kIHRoZW0pLiAgU28gd2l0aG91dAotICAgd3JpdGluZyBsb3RzIG9mIGNvZGUgdG8gcGFyc2UgYWxsIHRoZWlyIGhlYWRlcnMgYW5kIHN0dWZmLCB3ZSBjYW4ndAotICAga25vdyB3aGV0aGVyIGEgY29yZWZpbGUgaXMgYmlnZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLiAgKi8KLQotI2RlZmluZSBUUkFEX0NPUkVfQUxMT1dfQU5ZX0VYVFJBX1NJWkUgMQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2k4NjBtYWNoMy5oIGIvYmZkL2hvc3RzL2k4NjBtYWNoMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQyYWExLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pODYwbWFjaDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSB3YXMgaGFja2VkIGZyb20gaTM4Nm1hY2gzLmggICBbZG9sYW5Ac3NkLmludGVsLmNvbV0gKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi1GSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2k4NjAKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbTY4a2F1eC5oIGIvYmZkL2hvc3RzL202OGthdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzNzc1NS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTY4a2F1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGFuIEFwcGxlIE1hY2ludG9zaCBydW5uaW5nIEEvVVggMy54LiAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhZ2UuaD4KLQotLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0cmFkLWNvcmUuYy4gICovCi0jZGVmaW5lCU5CUEcJCQlOQlBQCi0KLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF9kYXRvcmcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF90eHRvcmcKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDEwMDAwMDAwMAotCi0jZGVmaW5lCVVQQUdFUwkJCVVTSVpFCi0KLSNkZWZpbmUJVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gIChhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tNjhrbGludXguaCBiL2JmZC9ob3N0cy9tNjhrbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2N2RmYS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTY4a2xpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qIExpbnV4IGR1bXBzICJzdHJ1Y3QgdGFza19zdHJ1Y3QiIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUtZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjdXJyZW50bHkgMjUxMiBieXRlcyBsb25nLCBidXQgd2UgYWxsb3cgdXAgdG8gNDA5NgotICAgYnl0ZXMgdG8gYWxsb3cgZm9yIHNvbWUgZnV0dXJlIGdyb3d0aC4gICovCi0jZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQJCTQwOTYKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gICgoYWJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnNpZ25hbCkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tODhrbWFjaDMuaCBiL2JmZC9ob3N0cy9tODhrbWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxNTUzOC4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTg4a21hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSN1bmRlZiBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDMKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX204OGsKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc2JzZC5oIGIvYmZkL2hvc3RzL21pcHNic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYWQyMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbWlwc2JzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSN1bmRlZiBBTElHTgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0vKiAjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcgLS0gd2UgdXNlIEhPU1RfREFUQV9TVEFSVF9BRERSICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX21pcHMKLS8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJVVNSU1RBQ0sKLSNkZWZpbmUgTk9fQ09SRV9DT01NQU5ECmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc21hY2gzLmggYi9iZmQvaG9zdHMvbWlwc21hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzQ2OGQuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL21pcHNtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvbWFjaHBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLS8qICNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRyAgKi8KLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbWlwcwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCVVTUkRBVEEKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL25ld3MtbWlwcy5oIGIvYmZkL2hvc3RzL25ld3MtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc5OWJlLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9uZXdzLW1pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIFNvbnkgTmV3cyBydW5uaW5nIE5ld3NPUyAzLjIuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0KLSNkZWZpbmUgSE9TVF9QQUdFX1NJWkUgTkJQRwotCi0jZGVmaW5lIEhPU1RfTUFDSElORV9BUkNIIGJmZF9hcmNoX21pcHMKLQotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiBVU1JURVhUCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIFVTUkRBVEEKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiBVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL25ld3MuaCBiL2JmZC9ob3N0cy9uZXdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzk0NmMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL25ld3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyogU29ueSBOZXdzIHJ1bm5pbmcgTmV3c09TIDMuMi4gICovCi0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBIT1NUX1BBR0VfU0laRSBOQlBHCi0jZGVmaW5lIEhPU1RfU0VHTUVOVF9TSVpFIE5CUEcKLSNkZWZpbmUgSE9TVF9NQUNISU5FX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3BjNTMybWFjaC5oIGIvYmZkL2hvc3RzL3BjNTMybWFjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk2ZjU5Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9wYzUzMm1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotLyogVGhpcyBpcyBhbiB1Z2x5IHdheSB0byBoYWNrIGFyb3VuZCB0aGUgaW5jb3JyZWN0Ci0gKiBkZWZpbml0aW9uIG9mIFVQQUdFUyBpbiBuczUzMi9tYWNocGFyYW0uaC4KLSAqCi0gKiBUaGUgZGVmaW5pdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgc2l6ZSByZXNlcnZlZAotICogZm9yICJzdHJ1Y3QgdXNlciIgaW4gY29yZSBmaWxlcyBpbiBQQUdFUywKLSAqIGJ1dCBpbnN0ZWFkIGl0IGdpdmVzIGl0IGluIDUxMi1ieXRlIGNvcmUtY2xpY2tzCi0gKiBmb3IgbnM1MzIsIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi0jZXJyb3IgVVBBR0VTIGlzIG5laXRoZXIgMiBub3IgMTYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvcmlzY29zLmggYi9iZmQvaG9zdHMvcmlzY29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmE4MjYuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3Jpc2Nvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyogUklTQy9vcyA0LjUyQywgYW5kIHByZXN1bWFibHkgb3RoZXIgdmVyc2lvbnMuICAqLwotCi0jaW5jbHVkZSA8YnNkNDMvbWFjaGluZS9tYWNocGFyYW0uaD4KLSNpbmNsdWRlIDxic2Q0My9tYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBOQlBHIEJTRDQzX05CUEcKLSNkZWZpbmUgVVBBR0VTIEJTRDQzX1VQQUdFUwotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiBCU0Q0M19VU1JURVhUCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIEJTRDQzX1VTUkRBVEEKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiBCU0Q0M19VU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3N5bW1ldHJ5LmggYi9iZmQvaG9zdHMvc3ltbWV0cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3MTdiMy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvc3ltbWV0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIFN5bW1ldHJ5IHJ1bm5pbmcgZWl0aGVyIGR5bml4IDMuMSAoYnNkKSBvciBwdHggKHN5c3YpLiAgKi8KLQotI2RlZmluZSBOQlBHIDQwOTYKLSNkZWZpbmUgVVBBR0VTIDEKLQotI2lmZGVmIF9TRVFVRU5UXwotLyogcHR4ICovCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAweDNmZmZlMDAwCi0jZGVmaW5lIFRSQURfQ09SRV9VU0VSX09GRlNFVCAoKFVQQUdFUyAqIE5CUEcpIC0gc2l6ZW9mIChzdHJ1Y3QgdXNlcikpCi0jZWxzZQotLyogZHluaXggKi8KLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgMHgxMDAwCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIChOQlBHICogdS51X3RzaXplKQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIDB4M2ZmZmYwMDAKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy90YWhvZS5oIGIvYmZkL2hvc3RzL3RhaG9lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNmNlZTIuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3RhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jZGVmaW5lCU5PX0NPUkVfQ09NTUFORAotCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdGFob2UKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQotI2RlZmluZQlIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheGJzZC5oIGIvYmZkL2hvc3RzL3ZheGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI5Y2NlLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy92YXhic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNkZWZpbmUJTk9fQ09SRV9DT01NQU5ECQkvKiBObyBjb21tYW5kIG5hbWUgaW4gY29yZSBmaWxlICovCi0KLSNpZiAwCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotLyogRG9lcyBub3QgZXhpc3Qgb24gQlNEIDQuMywgaXQgdXNlcyBtYWNoaW5lL21hY2hwYXJhbS5oLgotICAgV2hhdGV2ZXIgaXQgaXMsIGl0J3MgaW5jbHVkZWQgYnkgPHN5cy9wYXJhbS5oPiwgd2hpY2ggdHJhZC1jb3JlLmMsCi0gICB0aGUgb25seSBwbGFjZSB0aGF0IHVzZXMgdGhpcyAoSSB0aGluayksIGFscmVhZHkgaW5jbHVkZXMuICAqLwotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNlbmRpZgotI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KLQotLyogTm90ZSB0aGF0IEhPU1RfUEFHRV9TSVpFIC0tIHRoZSBwYWdlIHNpemUgYXMgZmFyIGFzIGV4ZWN1dGFibGUgZmlsZXMKLSAgIGFyZSBjb25jZXJuZWQgLS0gaXMgbm90IHRoZSBzYW1lIGFzIE5CUEcsIGJlY2F1c2Ugb2YgcGFnZSBjbHVzdGVyaW5nLiAgKi8KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEwMjQKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJMAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCSgweDgwMDAwMDAwIC0gKFVQQUdFUyAqIE5CUEcpKQotI3VuZGVmCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4dWx0LmggYi9iZmQvaG9zdHMvdmF4dWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzMxYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheHVsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJKE5CUEcqQ0xTSVpFKQotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKLSN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheHVsdDIuaCBiL2JmZC9ob3N0cy92YXh1bHQyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzMxYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheHVsdDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCShOQlBHKkNMU0laRSkKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCi0jdW5kZWYJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ocDMwMGJzZC5jIGIvYmZkL2hwMzAwYnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjdiMTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwMzAwYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQIDkwMDAvMzAwICg2ODAwMC1iYXNlZCkgbWFjaGluZXMgcnVubmluZyBCU0QgVW5peC4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwIC8qIEF2b2lkcyB3YXJuaW5nICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaHAzMDBic2RfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1ocDMwMGJzZCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHAzMDBocHV4LmMgYi9iZmQvaHAzMDBocHV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTIzMTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwMzAwaHB1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBocC11eCA5MDAwLzMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBHbGVubiBFbmdlbC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi0gICAgaHB1eCBuYXRpdmUgIC0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhwMzAwaHB1eCBiZmQgfCAtLS0tLS0tLS0tPiBocHV4IHcvZ251IGV4dAotICAgIGhwdXggdy9nbnUgZXh0ZW5zaW9uIC0tLS0+IHwgICAgICAgICAgICAgICB8Ci0KLQotICAgIFN1cHBvcnQgZm9yIHRoZSA5MDAwL1szNF0wMCBoYXMgc2V2ZXJhbCBsaW1pdGF0aW9ucy4KLSAgICAgIDEuIFNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAyLiBUaGUgb3V0cHV0IGZvcm1hdCBmcm9tIHRoaXMgYmZkIGlzIG5vdCB1c2FibGUgYnkgbmF0aXZlIHRvb2xzLgotCi0gICAgVGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3Igd3JpdGluZyB0aGlzIGJmZCB3YXMgdG8gYWxsb3cgdXNlIG9mCi0gICAgZ2RiIGFuZCBnY2MgZm9yIGhvc3QgYmFzZWQgZGVidWdnaW5nIGFuZCBub3QgdG8gbWltaWMgdGhlIGhwLXV4IHRvb2xzCi0gICAgaW4gZXZlcnkgZGV0YWlsLiAgVGhpcyBsZWFkcyB0byBhIHNpZ25pZmljYW50IHNpbXBsaWZpY2F0aW9uIG9mIHRoZQotICAgIGNvZGUgYW5kIGEgbGVhcCBpbiBwZXJmb3JtYW5jZS4gIFRoZSBkZWNpc2lvbiB0byBub3Qgb3V0cHV0IGhwIG5hdGl2ZQotICAgIGNvbXBhdGlibGUgb2JqZWN0cyB3YXMgZnVydGhlciBzdHJlbmd0aGVuZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcmljaG5lc3MKLSAgICBvZiB0aGUgZ2NjIGNvbXBpbGVkIG9iamVjdHMgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgbG9zcyBvZgotICAgIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHdoaWxlIHRoZSBocCBmb3JtYXQgc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YKLSAgICBzZWNvbmRhcnkgc3ltYm9scywgaXQgZG9lcyBub3Qgc3VwcG9ydCBpbmRpcmVjdCBzeW1ib2xzLiAgQW5vdGhlcgotICAgIHJlYXNvbiBpcyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGltcGxlbWVudGF0aW9ucwotICAgIG9mIGdjYyBvbiBocHV4IHdoaWNoIHVzZWQgJ2hweHQnIHRvIHRyYW5zbGF0ZSAuYSBhbmQgLm8gZmlsZXMgaW50byBhCi0gICAgZm9ybWF0IHdoaWNoIGNvdWxkIGJlIHJlYWRpbHkgdW5kZXJzdG9vZCBieSB0aGUgZ251IGxpbmtlciBhbmQgZ2RiLgotICAgIFRoaXMgYWxsb3dzIHJlYWRpbmcgaHAgc2Vjb25kYXJ5IHN5bWJvbHMgYW5kIGNvbnZlcnRpbmcgdGhlbSBpbnRvCi0gICAgaW5kaXJlY3Qgc3ltYm9scyBidXQgdGhlIHJldmVyc2UgaXQgbm90IGFsd2F5cyBwb3NzaWJsZS4KLQotICAgIEFub3RoZXIgZXhhbXBsZSBvZiBkaWZmZXJlbmNlcyBpcyB0aGF0IHRoZSBocCBmb3JtYXQgc3RvcmVzIHN5bWJvbCBvZmZzZXRzCi0gICAgaW4gdGhlIG9iamVjdCBjb2RlIHdoaWxlIHRoZSBnbnUgdXRpbGl0aWVzIHVzZSBhIGZpZWxkIGluIHRoZQotICAgIHJlbG9jYXRpb24gcmVjb3JkIGZvciB0aGlzLiAgVG8gc3VwcG9ydCB0aGUgaHAgbmF0aXZlIGZvcm1hdCwgdGhlIG9iamVjdAotICAgIGNvZGUgd291bGQgbmVlZCB0byBiZSBwYXRjaGVkIHdpdGggdGhlIG9mZnNldHMgd2hlbiBwcm9kdWNpbmcgLm8gZmlsZXMuCi0KLSAgICBUaGUgYmFzaWMgdGVjaG5pcXVlIHRha2VuIGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gI2luY2x1ZGUgdGhlIGNvZGUKLSAgICBmcm9tIGFvdXR4LmggYW5kIGFvdXQtdGFyZ2V0Lmggd2l0aCBhcHByb3ByaWF0ZSAjZGVmaW5lcyB0byBvdmVycmlkZQotICAgIGNvZGUgd2hlcmUgYSB1bmlxdWUgaW1wbGVtZW50YXRpb24gaXMgbmVlZGVkOgotCi0gICAgewotICAgICAgICAjZGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYKLSAgICAgICAgI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLSAgICAgICAgaW1wbGVtZW50IGEgYnVuY2ggb2YgZnVuY3Rpb25zCi0KLSAgICAgICAgI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0gICAgfQotCi0gICAgVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgIG9mIGhhdmluZyBhbiBhcnJheSBvZiBubGlzdCBpdGVtcyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncywgaHAncyBmb3JtYXQKLSAgICBoYXMgdGhlbSBtaXhlZCB0b2dldGhlciBpbiBvbmUgc3RydWN0dXJlLiAgSW4gYWRkaXRpb24sIHRoZSBzdHJpbmdzIGFyZQotICAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICAgbmxpc3QgZWxlbWVudCAxCi0gICAgc3RyaW5nMQotICAgIG5saXN0IGVsZW1lbnQgMgotICAgIHN0cmluZzIKLSAgICAuLi4KLQotICAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgIGFuZCBjb252ZXJ0IGl0IHRvIGNhbm9uaWNhbCBmb3JtLiAgQXMgd2UgbWFyY2ggdGhydSB0aGUgdGFibGUsIHdlIGNvcHkKLSAgICB0aGUgbmxpc3QgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCB3ZSBjb21wYWN0IHRoZSBzdHJpbmdzIGFuZCBudWxsCi0gICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICAgc3RyaW5nMQotICAgIG51bGwKLSAgICBzdHJpbmcyCi0gICAgbnVsbAotICovCi0KLS8qIEBAIElzIHRoaXMgcmVhbGx5IHNvIGRpZmZlcmVudCBmcm9tIG5vcm1hbCBhLm91dCB0aGF0IGl0IG5lZWRzIHRvIGluY2x1ZGUKLSAgIGFvdXR4Lmg/ICBXZSBzaG91bGQgZ28gdGhyb3VnaCB0aGlzIGZpbGUgc29tZXRpbWUgYW5kIHNlZSB3aGF0IGNhbiBiZSBtYWRlCi0gICBtb3JlIGRlcGVuZGVudCBvbiBhb3V0MzIubyBhbmQgd2hhdCBtaWdodCBuZWVkIHRvIGJlIGJyb2tlbiBvZmYgYW5kIGFjY2Vzc2VkCi0gICB0aHJvdWdoIHRoZSBiYWNrZW5kX2RhdGEgZmllbGQuICBPciwgbWF5YmUgd2UgcmVhbGx5IGRvIG5lZWQgc3VjaCBhCi0gICBjb21wbGV0ZWx5IHNlcGFyYXRlIGltcGxlbWVudGF0aW9uLiAgSSBkb24ndCBoYXZlIHRpbWUgdG8gaW52ZXN0aWdhdGUgdGhpcwotICAgbXVjaCBmdXJ0aGVyIHJpZ2h0IG5vdy4gIFtyYWVidXJuOjE5OTMwNDI4LjIxMjRFU1RdICovCi0vKiBAQCBBbHNvLCBub3RlIHRoYXQgdGhlcmUgd2luZCB1cCBiZWluZyB0d28gdmVyc2lvbnMgb2Ygc29tZSByb3V0aW5lcywgd2l0aAotICAgZGlmZmVyZW50IG5hbWVzLCBvbmx5IG9uZSBvZiB3aGljaCBhY3R1YWxseSBnZXRzIHVzZWQuICBGb3IgZXhhbXBsZToKLQlzbHVycF9zeW1ib2xfdGFibGUKLQlzd2FwX3N0ZF9yZWxvY19pbgotCXNsdXJwX3JlbG9jX3RhYmxlCi0JZ2V0X3N5bXRhYgotCWdldF9zeW10YWJfdXBwZXJfYm91bmQKLQljYW5vbmljYWxpemVfcmVsb2MKLQlta29iamVjdAotICAgVGhpcyBzaG91bGQgYWxzbyBiZSBmaXhlZC4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaHAzMDBocHV4IgotI2RlZmluZSBNWShPUCkgQ0FUKGhwMzAwaHB1eF8sT1ApCi0KLSNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBocDMwMGhwdXhfZXhlY19ieXRlcwotI2RlZmluZSBleHRlcm5hbF9ubGlzdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKLQotI2luY2x1ZGUgImFvdXQvaHAzMDBocHV4LmgiCi0KLS8qIGRlZmluZSB0aGVzZSBzbyB3ZSBjYW4gY29tcGlsZSB1bnVzZWQgcm91dGluZXMgaW4gYW91dHguaCAqLwotI2RlZmluZSBlX3N0cnggIGVfc2hsaWIKLSNkZWZpbmUgZV9vdGhlciBlX2xlbmd0aAotI2RlZmluZSBlX2Rlc2MgIGVfYWxtb2QKLQotI2RlZmluZSBBUl9QQURfQ0hBUiAnLycKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBwcm92aWRlIG92ZXJyaWRlcyBmb3Igcm91dGluZXMgaW4gdGhpcyBmaWxlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0aGVzZSBkb24ndCB1c2UgTVkgYmVjYXVzZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyB3aXRoaW4gSlVNUF9UQUJMRQotICAgKENBVCB3aW5kcyB1cCBiZWluZyBleHBhbmRlZCByZWN1cnNpdmVseSwgd2hpY2ggQU5TSSBDIGNvbXBpbGVycwotICAgd2lsbCBub3QgZG8pLiAgKi8KLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBocDMwMGhwdXhfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGhwMzAwaHB1eF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBocDMwMGhwdXhfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBocDMwMGhwdXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0vKiBVbnRpbCBhbmQgdW5sZXNzIHdlIGNvbnZlcnQgdGhlIHNsdXJwX3JlbG9jIGFuZCBzbHVycF9zeW10YWIKLSAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSwgd2UgY2FuIG5vdCB1c2UgdGhlIGRlZmF1bHQgYW91dAotICAgZnJlZV9jYWNoZWRfaW5mbyByb3V0aW5lIHdoaWNoIGFzc3VtZXMgdGhhdCB0aGUgcmVsb2NzIGFuZCBzeW10YWJzCi0gICB3ZXJlIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MuICAqLwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotCi0jZGVmaW5lIGhwMzAwaHB1eF93cml0ZV9zeW1zIGFvdXRfMzJfd3JpdGVfc3ltcwotCi0jZGVmaW5lIE1ZX2NhbGxiYWNrIE1ZKGNhbGxiYWNrKQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDB4MgotCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGhwMzAwaHB1eF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLQotI2RlZmluZSBIUF9TWU1UWVBFX1VOREVGSU5FRAkweDAwCi0jZGVmaW5lIEhQX1NZTVRZUEVfQUJTT0xVVEUJMHgwMQotI2RlZmluZSBIUF9TWU1UWVBFX1RFWFQJCTB4MDIKLSNkZWZpbmUgSFBfU1lNVFlQRV9EQVRBCQkweDAzCi0jZGVmaW5lIEhQX1NZTVRZUEVfQlNTCQkweDA0Ci0jZGVmaW5lIEhQX1NZTVRZUEVfQ09NTU9OCTB4MDUKLQotI2RlZmluZSBIUF9TWU1UWVBFX1RZUEUJCTB4MEYKLSNkZWZpbmUgSFBfU1lNVFlQRV9GSUxFTkFNRQkweDFGCi0KLSNkZWZpbmUgSFBfU1lNVFlQRV9BTElHTgkweDEwCi0jZGVmaW5lIEhQX1NZTVRZUEVfRVhURVJOQUwJMHgyMAotI2RlZmluZSBIUF9TRUNPTkRBUllfU1lNQk9MICAgICAweDQwCi0KLS8qIFJFTE9DQVRJT04gREVGSU5JVElPTlMgKi8KLSNkZWZpbmUgSFBfUlNFR01FTlRfVEVYVAkweDAwCi0jZGVmaW5lIEhQX1JTRUdNRU5UX0RBVEEJMHgwMQotI2RlZmluZSBIUF9SU0VHTUVOVF9CU1MJCTB4MDIKLSNkZWZpbmUgSFBfUlNFR01FTlRfRVhURVJOQUwJMHgwMwotI2RlZmluZSBIUF9SU0VHTUVOVF9QQ1JFTCAgICAgICAweDA0Ci0jZGVmaW5lIEhQX1JTRUdNRU5UX1JETFQgICAgICAgIDB4MDUKLSNkZWZpbmUgSFBfUlNFR01FTlRfUlBMVCAgICAgICAgMHgwNgotI2RlZmluZSBIUF9SU0VHTUVOVF9OT09QCTB4M0YKLQotI2RlZmluZSBIUF9STEVOR1RIX0JZVEUJCTB4MDAKLSNkZWZpbmUgSFBfUkxFTkdUSF9XT1JECQkweDAxCi0jZGVmaW5lIEhQX1JMRU5HVEhfTE9ORwkJMHgwMgotI2RlZmluZSBIUF9STEVOR1RIX0FMSUdOCTB4MDMKLQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhocDMwMGhwdXgsXzMyXyx5KQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2RlZmluZSBCTUFHSUMgSFBVWF9ET1RfT19NQUdJQwotI2RlZmluZSBRTUFHSUMgMDMxNAotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotLyogU2luY2UgdGhlIGhwdXggc3ltYm9sIHRhYmxlIGhhcyBubGlzdCBlbGVtZW50cyBpbnRlcnNwZXJzZWQgd2l0aAotICAgc3RyaW5ncyBhbmQgd2UgbmVlZCB0byBpbnNlcnQgc29tIHN0cmluZ3MgZm9yIHNlY29uZGFyeSBzeW1ib2xzLCB3ZQotICAgZ2l2ZSBvdXJzZWx2ZXMgYSBsaXR0bGUgZXh0cmEgcGFkZGluZyB1cCBmcm9udCB0byBhY2NvdW50IGZvcgotICAgdGhpcy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBub24tc2Vjb25kYXJ5IHN5bWJvbCB3ZSBwcm9jZXNzLCB3ZSBnYWluCi0gICA5IGJ5dGVzIG9mIHNwYWNlIGZvciB0aGUgZGlzY2FyZGVkIG5saXN0IGVsZW1lbnQgKG9uZSBieXRlIHVzZWQgZm9yCi0gICBudWxsKS4gIFNZTV9FWFRSQV9CWVRFUyBpcyB0aGUgZXh0cmEgc3BhY2UuICAqLwotI2RlZmluZSBTWU1fRVhUUkFfQllURVMgICAxMDI0Ci0KLS8qIFNldCBwYXJhbWV0ZXJzIGFib3V0IHRoaXMgYS5vdXQgZmlsZSB0aGF0IGFyZSBtYWNoaW5lLWRlcGVuZGVudC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBzb21lX2FvdXRfb2JqZWN0X3AganVzdCBiZWZvcmUgaXQgcmV0dXJucy4gICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWSAoY2FsbGJhY2spIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLQotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHsKLSAgICAgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fR05VX1RSRUxPRkYgKCpleGVjcCk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9HTlVfRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAgICAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICAgICAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fR05VX1NZTU9GRiAoKmV4ZWNwKTsKLSAgICAgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAob2JqX3N5bV9maWxlcG9zIChhYmZkKSArIGV4ZWNwLT5hX3N5bXMpOwotCi0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gMTI7Ci0gICAgICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gMTI7Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWSAod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCi0gIGZpbGVfcHRyIHRleHRfZW5kOwotCi0gIG1lbXNldCAoJmV4ZWNfYnl0ZXMsIDAsIHNpemVvZiAoZXhlY19ieXRlcykpOwotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFIChhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0KLSAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgTkFNRSAoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotICBleGVjcC0+YV9zeW1zID0gMDsKLQotICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCAweGMpOwotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLQotICBOQU1FIChhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsKLQotICAvKiB1cGRhdGUgZmllbGRzIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgc3dhcF9leGVjX2hlYWRlcl9vdXQgKi8KLQotICAvKiB0aGlzIGlzIHJlYWxseSB0aGUgc3ltIHRhYmxlIHNpemUgYnV0IHdlIHN0b3JlIGl0IGluIGRyZWxvY3MgKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIDEyLCBleGVjX2J5dGVzLmVfZHJlbG9jcyk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgZmFsc2UpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xzLCBhbmQgdGhlbiB0aGUgcmVsb2NzLiAgV2UgbXVzdCB3cml0ZSBvdXQKLSAgICAgICB0aGUgc3ltYm9scyBmaXJzdCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgKi8KLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIHRoZSByZWxvY3MgdG8gd2hlcmUgd2Ugd2FudCB0byBwdXQgdGhlIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIE5fRFJFTE9GRiAoKmV4ZWNwKSArIGV4ZWNwLT5hX2Ryc2l6ZSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCFNWSAod3JpdGVfc3ltcykgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9EUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBjb252ZXJ0IHRoZSBocCBzeW1ib2wgdHlwZSB0byBiZSB0aGUgc2FtZSBhcyBhb3V0NjQuaCB1c2FnZSBzbyB3ZSAqLwotLyogY2FuIHBpZ2d5YmFjayByb3V0aW5lcyBpbiBhb3V0eC5oLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotc3RhdGljIHZvaWQKLWNvbnZlcnRfc3ltX3R5cGUgKHN5bV9wb2ludGVyLCBjYWNoZV9wdHIsIGFiZmQpCi0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7Ci0gICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0cjsKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbmFtZV90eXBlOwotICBpbnQgbmV3X3R5cGU7Ci0KLSAgbmFtZV90eXBlID0gKGNhY2hlX3B0ci0+dHlwZSk7Ci0gIG5ld190eXBlID0gMDsKLQotICBpZiAoKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfQUxJR04pICE9IDApCi0gICAgewotICAgICAgLyogaW91X2Vycm9yICgiYWxpZ25lZCBzeW1ib2wgZW5jb3VudGVyZWQ6ICVzIiwgbmFtZSk7Ki8KLSAgICAgIG5hbWVfdHlwZSA9IDA7Ci0gICAgfQotCi0gIGlmIChuYW1lX3R5cGUgPT0gSFBfU1lNVFlQRV9GSUxFTkFNRSkKLSAgICBuZXdfdHlwZSA9IE5fRk47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfVFlQRSkKLQl7Ci0JY2FzZSBIUF9TWU1UWVBFX1VOREVGSU5FRDoKLQkgIG5ld190eXBlID0gTl9VTkRGOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQUJTT0xVVEU6Ci0JICBuZXdfdHlwZSA9IE5fQUJTOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfVEVYVDoKLQkgIG5ld190eXBlID0gTl9URVhUOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfREFUQToKLQkgIG5ld190eXBlID0gTl9EQVRBOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQlNTOgotCSAgbmV3X3R5cGUgPSBOX0JTUzsKLQkgIGJyZWFrOwotCi0JY2FzZSBIUF9TWU1UWVBFX0NPTU1PTjoKLQkgIG5ld190eXBlID0gTl9DT01NOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAobmFtZV90eXBlICYgSFBfU1lNVFlQRV9FWFRFUk5BTCkKLQluZXdfdHlwZSB8PSBOX0VYVDsKLQotICAgICAgaWYgKG5hbWVfdHlwZSAmIEhQX1NFQ09OREFSWV9TWU1CT0wpCi0JewotCSAgc3dpdGNoIChuZXdfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyBub256ZXJvLCB0aGVuIGp1c3QgdHJlYXQgdGhpcyBhcyBhCi0gICAgICAgICAgICAgICAgIGNvbW1vbiBzeW1ib2wuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBjb3JyZWN0IGluCi0gICAgICAgICAgICAgICAgIGFsbCBjYXNlcywgYnV0IGl0IGlzIG1vcmUgY29ycmVjdCB0aGFuIHRyZWF0aW5nIGl0IGFzCi0gICAgICAgICAgICAgICAgIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgPT0gMCkKLQkJbmV3X3R5cGUgPSBOX1dFQUtVOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICAgICAgbmV3X3R5cGUgPSBOX1dFQUtBOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLVDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBjYWNoZV9wdHItPnR5cGUgPSBuZXdfdHlwZTsKLQotfQotCi0KLS8qCi1ERVNDUklQVElPTgotICAgICAgICBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdwotICAgICAgICBieXRlIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyCi0gICAgICAgIHN0cnVjdHVyZS4KLSovCi0KLXZvaWQKLU5BTUUgKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKikgcmF3X2J5dGVzOwotCi0gIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKLSAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCi0gICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKLSAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLwotICBtZW1zZXQgKGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7Ci0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogY2hlY2sgdGhlIGhlYWRlciB0byBzZWUgaWYgaXQgd2FzIGdlbmVyYXRlZCBieSBhIGJmZCBvdXRwdXQgKi8KLSAgLyogdGhpcyBpcyBkZXRlY3RlZCByYXRoZXIgYml6YXJlbHkgYnkgcmVxdWlyaW5nIGEgYnVuY2ggb2YgICAgKi8KLSAgLyogaGVhZGVyIGZpZWxkcyB0byBiZSB6ZXJvIGFuZCBhbiBvbGQgdW51c2VkIGZpZWxkIChub3cgdXNlZCkgKi8KLSAgLyogdG8gYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgZG8KLSAgICB7Ci0gICAgICBsb25nIHN5bXM7Ci0gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOwotICAgICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfcGFzc2l6ZSkgIT0gMCkKLQlicmVhazsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpICE9IDApCi0JYnJlYWs7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9zdXBzaXplKSAhPSAwKQotCWJyZWFrOwotCi0gICAgICBzeW1zID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9kcmVsb2NzKTsKLSAgICAgIGlmIChzeW1zID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIC8qIE9LLCB3ZSd2ZSBwYXNzZWQgdGhlIHRlc3QgYXMgYmVzdCBhcyB3ZSBjYW4gZGV0ZXJtaW5lICovCi0gICAgICBleGVjcC0+YV9zeW1zID0gc3ltczsKLQotICAgICAgLyogYWxsb2NhdGUgc3RvcmFnZSBmb3Igd2hlcmUgd2Ugd2lsbCBzdG9yZSB0aGlzIHJlc3VsdCAqLwotICAgICAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKnJhd3B0cikpOwotCi0gICAgICBpZiAocmF3cHRyID09IE5VTEwpCi0JcmV0dXJuOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotICAgICAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IGdudV9lbmNhcF9mb3JtYXQ7Ci0gICAgfQotICB3aGlsZSAoMCk7Ci19Ci0KLQotLyogVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgb2YgaGF2aW5nIGFuIGFycmF5IG9mIG5saXN0IGl0ZW1zIGFuZCBhbiBhcnJheSBvZiBzdHJpbmdzLCBocCdzIGZvcm1hdAotICAgaGFzIHRoZW0gbWl4ZWQgdG9nZXRoZXIgaW4gb25lIHN0cnVjdHVyZS4gIEluIGFkZGl0aW9uLCB0aGUgc3RyaW5ncyBhcmUKLSAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICBubGlzdCBlbGVtZW50IDEKLSAgIHN0cmluZzEKLSAgIG5saXN0IGVsZW1lbnQgMgotICAgc3RyaW5nMgotICAgLi4uCi0KLSAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgYW5kIGNvbnZlcnQgaXQgdG8gY2Fub25pY2FsIGZvcm0uICBBcyB3ZSBtYXJjaCB0aHJ1IHRoZSB0YWJsZSwgd2UgY29weQotICAgdGhlIG5saXN0IGRhdGEgaW50byB0aGUgaW50ZXJuYWwgZm9ybSBhbmQgd2UgY29tcGFjdCB0aGUgc3RyaW5ncyBhbmQgbnVsbAotICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICBzdHJpbmcxCi0gICBudWxsCi0gICBzdHJpbmcyCi0gICBudWxsCi0gICAuLi4KLSovCi0KLWJvb2xlYW4KLU1ZIChzbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltYm9sX2J5dGVzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKLSAgY2hhciAqc3RyaW5nczsKLSAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOwotICB1bnNpZ25lZCBudW1fc3ltcyA9IDA7Ci0KLSAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLwotICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgc3ltYm9sX2J5dGVzID0gZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQlzeW1ib2xfYnl0ZXMgKyBTWU1fRVhUUkFfQllURVMpOwotICBpZiAoIXN0cmluZ3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1zID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoc3RyaW5ncyArIFNZTV9FWFRSQV9CWVRFUyk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkICgoUFRSKSBzeW1zLCBzeW1ib2xfYnl0ZXMsIDEsIGFiZmQpICE9IHN5bWJvbF9ieXRlcykKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgc3ltcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgc3ltX2VuZCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1zKSArIHN5bWJvbF9ieXRlcyk7Ci0KLSAgLyogZmlyc3QsIG1hcmNoIHRocnUgdGhlIHRhYmxlIGFuZCBmaWd1cmUgb3V0IGhvdyBtYW55IHN5bWJvbHMgdGhlcmUgYXJlICovCi0gIGZvciAoc3ltX3BvaW50ZXIgPSBzeW1zOyBzeW1fcG9pbnRlciA8IHN5bV9lbmQ7IHN5bV9wb2ludGVyKyssIG51bV9zeW1zKyspCi0gICAgewotICAgICAgLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCi0gICAgICBzeW1fcG9pbnRlciA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1fcG9pbnRlcikgKwotCQkJCQkgICAgICAgc3ltX3BvaW50ZXItPmVfbGVuZ3RoWzBdKTsKLSAgICB9Ci0KLSAgLyogbm93IHRoYXQgd2Uga25vdyB0aGUgc3ltYm9sIGNvdW50LCB1cGRhdGUgdGhlIGJmZCBoZWFkZXIgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBudW1fc3ltczsKLQotICBjYWNoZWQgPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwKLQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSkpOwotICBpZiAoY2FjaGVkID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogYXMgd2UgbWFyY2ggdGhydSB0aGUgaHAgc3ltYm9sIHRhYmxlLCBjb252ZXJ0IGl0IGludG8gYSBsaXN0IG9mCi0gICAgIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIHRvIGhvbGQgdGhlIHN5bWJvbCBuYW1lcy4gIE1ha2Ugc3VyZSBhbnkKLSAgICAgYXNzaWdubWVudCB0byB0aGUgc3RyaW5ncyBwb2ludGVyIGlzIGRvbmUgYWZ0ZXIgd2UncmUgdGhydSB1c2luZwotICAgICB0aGUgbmxpc3Qgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGFueXRoaW5nIGltcG9ydGFudC4gKi8KLQotICAvKiBPSywgbm93IHdhbGsgdGhlIG5ldyBzeW10YWJsZSwgY2FjaGVpbmcgc3ltYm9sIHByb3BlcnRpZXMgKi8KLSAgewotICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0ciA9IGNhY2hlZDsKLSAgICBhb3V0X3N5bWJvbF90eXBlIGNhY2hlX3NhdmU7Ci0gICAgLyogUnVuIHRocm91Z2ggdGFibGUgYW5kIGNvcHkgdmFsdWVzICovCi0gICAgZm9yIChzeW1fcG9pbnRlciA9IHN5bXMsIGNhY2hlX3B0ciA9IGNhY2hlZDsKLQkgc3ltX3BvaW50ZXIgPCBzeW1fZW5kOyBzeW1fcG9pbnRlcisrLCBjYWNoZV9wdHIrKykKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCWNhY2hlX3B0ci0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCWNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCBzeW1fcG9pbnRlci0+ZV92YWx1ZSk7Ci0JY2FjaGVfcHRyLT5kZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3ltX3BvaW50ZXItPmVfYWxtb2QpOwotCWNhY2hlX3B0ci0+dHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3ltX3BvaW50ZXItPmVfdHlwZSk7Ci0JY2FjaGVfcHRyLT5zeW1ib2wudWRhdGEucCA9IE5VTEw7Ci0JbGVuZ3RoID0gYmZkX2dldF84IChhYmZkLCBzeW1fcG9pbnRlci0+ZV9sZW5ndGgpOwotCWNhY2hlX3B0ci0+b3RoZXIgPSBsZW5ndGg7CS8qIG90aGVyIG5vdCB1c2VkLCBzYXZlIGxlbmd0aCBoZXJlICovCi0KLQljYWNoZV9zYXZlID0gKmNhY2hlX3B0cjsKLQljb252ZXJ0X3N5bV90eXBlIChzeW1fcG9pbnRlciwgY2FjaGVfcHRyLCBhYmZkKTsKLQlpZiAoIXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogZm9yIGhwdXgsIHRoZSAnbGVuZ2h0JyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiAqLwotCS8qIHRoZSBzeW1ib2wgbmFtZSB3aGljaCBmb2xsb3dzIHRoZSBubGlzdCBlbnRyeS4gICAgICAgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JaWYgKGxlbmd0aCkKLQkgIHsKLQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCSAgICAvKiB0aGUgaHAgc3RyaW5nIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQgc28gd2UgY3JlYXRlIGEgbmV3IG9uZSovCi0JICAgIC8qIGJ5IGNvcHlpbmcgdGhlIHN0cmluZyB0byBvdmVybGFwIHRoZSBqdXN0IHZhY2F0ZWQgbmxpc3QgICAgKi8KLQkgICAgLyogc3RydWN0dXJlIGJlZm9yZSBpdCBpbiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzOwotCSAgICBtZW1jcHkgKHN0cmluZ3MsIHN5bV9wb2ludGVyICsgMSwgbGVuZ3RoKTsKLQkgICAgc3RyaW5nc1tsZW5ndGhdID0gJ1wwJzsKLQkgICAgc3RyaW5ncyArPSBsZW5ndGggKyAxOwotCSAgfQotCWVsc2UKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSBOVUxMOwotCi0JLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCi0Jc3ltX3BvaW50ZXIgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopICgoKGNoYXIgKikgc3ltX3BvaW50ZXIpICsKLQkJCQkJCSBsZW5ndGgpOwotICAgICAgfQotICB9Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSBjYWNoZWQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi12b2lkCi1NWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybiA9IDA7Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWwgPSAwOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0gIHJfaW5kZXggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGJ5dGVzLT5yX2luZGV4KTsKLQotICBzd2l0Y2ggKGJ5dGVzLT5yX3R5cGVbMF0pCi0gICAgewotICAgIGNhc2UgSFBfUlNFR01FTlRfVEVYVDoKLSAgICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0RBVEE6Ci0gICAgICByX2luZGV4ID0gTl9EQVRBOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9CU1M6Ci0gICAgICByX2luZGV4ID0gTl9CU1M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0VYVEVSTkFMOgotICAgICAgcl9leHRlcm4gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9QQ1JFTDoKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIHJfcGNyZWwgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9SRExUOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9SUExUOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9OT09QOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHN3aXRjaCAoYnl0ZXMtPnJfbGVuZ3RoWzBdKQotICAgIHsKLSAgICBjYXNlIEhQX1JMRU5HVEhfQllURToKLSAgICAgIHJfbGVuZ3RoID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUkxFTkdUSF9XT1JEOgotICAgICAgcl9sZW5ndGggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9STEVOR1RIX0xPTkc6Ci0gICAgICByX2xlbmd0aCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IGhvd3RvX3RhYmxlX3N0ZCArIHJfbGVuZ3RoICsgNCAqIHJfcGNyZWw7Ci0gIC8qIEZJWE1FLXNvb246ICBSb2xsIGJhc2VyZWwsIGptcHRhYmxlLCByZWxhdGl2ZSBiaXRzIGludG8gaG93dG8gc2V0dGluZyAqLwotCi0gIC8qIFRoaXMgbWFjcm8gdXNlcyB0aGUgcl9pbmRleCB2YWx1ZSBjb21wdXRlZCBhYm92ZSAqLwotICBpZiAocl9wY3JlbCAmJiByX2V4dGVybikKLSAgICB7Ci0gICAgICAvKiBUaGUgR05VIGxpbmtlciBhc3N1bWVzIGFueSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLwotICAgICAgLyogaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgaW1hZ2Ugd2hpbGUgdGhlIEhQIGxpbmtlciAgKi8KLSAgICAgIC8qIGFkZHMgdGhpcyBpbiBsYXRlci4gIEFkZCBpdCBpbiBub3cuLi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBNT1ZFX0FERFJFU1MgKC1jYWNoZV9wdHItPmFkZHJlc3MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIE1PVkVfQUREUkVTUyAoMCk7Ci0gICAgfQotfQotCi1ib29sZWFuCi1NWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIFBUUiByZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotICBzaXplX3QgZWFjaF9zaXplOwotICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpycHRyOwotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotZG9pdDoKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIGNvdW50ID0gcmVsb2Nfc2l6ZSAvIGVhY2hfc2l6ZTsKLQotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX3phbGxvYyAoYWJmZCwgKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mCi0JCQkJCQkJKGFyZWxlbnQpKSk7Ci0gIGlmICghcmVsb2NfY2FjaGUgJiYgY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmVsb2NzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY3MgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcnB0ciA9IChzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICopIHJlbG9jczsKLSAgY291bnRlciA9IDA7Ci0gIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotCi0gIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLSAgICB7Ci0gICAgICBNWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0gICAgfQotCi0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGlkZW50aWNhbCB0byBmdW5jdGlvbnMgaW4gYW91dHguaCBleGNlcHQgKi8KLS8qIHRoZXkgcmVmZXIgdG8gTVkoZnVuYykgcmF0aGVyIHRoYW4gTkFNRShhb3V0LGZ1bmMpIGFuZCB0aGV5IGFsc28gICAgICovCi0vKiBjYWxsIGFvdXRfMzIgdmVyc2lvbnMgaWYgdGhlIGlucHV0IGZpbGUgd2FzIGdlbmVyYXRlZCBieSBnY2MgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbG9uZyBhb3V0XzMyX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICogYWJmZCwgYXN5bWJvbCAqKiBsb2NhdGlvbikpOwotbG9uZyBhb3V0XzMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1sb25nIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIFBBUkFNUyAoKGJmZCAqIGFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkJIGFyZWxlbnQgKiogcmVscHRyLAotCQkJCQkgYXN5bWJvbCAqKiBzeW1ib2xzKSk7Ci0KLWxvbmcKLU1ZIChnZXRfc3ltdGFiKSAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKLSAgICByZXR1cm4gYW91dF8zMl9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbik7Ci0KLSAgaWYgKCFNWSAoc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoc3ltYmFzZSA9IG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpOyBjb3VudGVyKysgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTspCi0gICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopIChzeW1iYXNlKyspOwotICAqbG9jYXRpb24rKyA9IDA7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotbG9uZwotTVkgKGdldF9zeW10YWJfdXBwZXJfYm91bmQpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmICghTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlICopKTsKLX0KLQotCi0KLQotbG9uZwotTVkgKGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpOwotCi0gIGlmICghKHRibHB0ciB8fCBNWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCi0JewotCSAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQl7Ci0JICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQl9Ci0gICAgfQotICAqcmVscHRyID0gMDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHBwYV9zdHVicy5oIGIvYmZkL2hwcGFfc3R1YnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OTNlOC4uMDAwMDAwMAotLS0gYS9iZmQvaHBwYV9zdHVicy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogSFBQQSBsaW5rZXIgc3R1YiBpbnN0cnVjdGlvbnMgICovCi0KLS8qIFRoZXNlIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIHdoaWNoIHRoZSBsaW5rZXIgbWF5IGluc2VydCBpbnRvIHRoZQotICAgY29kZSBzdHJlYW0gd2hlbiBidWlsZGluZyBmaW5hbCBleGVjdXRhYmxlcyB0byBoYW5kbGUgb3V0LW9mLXJhbmdlCi0gICBjYWxscyBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotCi0jZGVmaW5lIExET19NNF9SMzFfUjMxCQkweDM3ZmYzZmY5CS8qIGxkbyAtNCglcjMxKSwlcjMxCSAgKi8KLSNkZWZpbmUgTERJTF9SMQkJCTB4MjAyMDAwMDAJLyogbGRpbCBYWFgsJXIxCQkgICovCi0jZGVmaW5lIEJFX1NSNF9SMQkJMHhlMDIwMjAwMAkvKiBiZSBYWFgoJXNyNCwlcjEpCSAgKi8KLSNkZWZpbmUgQ09QWV9SMzFfUjIgICAgICAgICAgCTB4MDgxZjAyNDIJLyogY29weSAlcjMxLCVyMgkgICovCi0jZGVmaW5lIEJMRV9TUjRfUjAJCTB4ZTQwMDIwMDAJLyogYmxlIFhYWCglc3I0LCVyMCkJICAqLwotI2RlZmluZSBCTEVfU1I0X1IxCQkweGU0MjAyMDAwCS8qIGJsZSBYWFgoJXNyNCwlcjEpCSAgKi8KLSNkZWZpbmUgQlZfTl8wX1IzMQkJMHhlYmUwYzAwMgkvKiBidixuIDAoJXIzMSkJCSAgKi8KLSNkZWZpbmUgU1RXX1IzMV9NOFIzMAkJMHg2YmRmM2ZmMQkvKiBzdHcgJXIzMSwtOCglcjMwKQkgICovCi0jZGVmaW5lIExEV19NOFIzMF9SMzEJCTB4NGJkZjNmZjEJLyogbGR3IC04KCVyMzApLCVyMzEJICAqLwotI2RlZmluZSBTVFdfQVJHX00xNlIzMAkJMHg2YmMwM2ZlMQkvKiBzdHcgJWFyZ1gsLTE2KCVyMzApCSAgKi8KLSNkZWZpbmUgTERXX00xNlIzMF9BUkcJCTB4NGJjMDNmZTEJLyogbGR3IC0xMiglcjMwKSwlYXJnWAkgICovCi0jZGVmaW5lIFNUV19BUkdfTTEyUjMwCQkweDZiYzAzZmU5CS8qIHN0dyAlYXJnWCwtMTYoJXIzMCkJICAqLwotI2RlZmluZSBMRFdfTTEyUjMwX0FSRwkJMHg0YmMwM2ZlOQkvKiBsZHcgLTEyKCVyMzApLCVhcmdYCSAgKi8KLSNkZWZpbmUgRlNUV19GQVJHX00xNlIzMAkweDI3YzExMjAwCS8qIGZzdHdzICVmYXJnWCwtMTYoJXIzMCkgKi8KLSNkZWZpbmUgRkxEV19NMTZSMzBfRkFSRwkweDI3YzExMDAwCS8qIGZsZHdzIC0xNiglcjMwKSwlZmFyZ1ggKi8KLSNkZWZpbmUgRlNURF9GQVJHX00xNlIzMAkweDJmYzExMjAwCS8qIGZzdGRzICVmYXJnWCwtMTYoJXIzMCkgKi8KLSNkZWZpbmUgRkxERF9NMTZSMzBfRkFSRwkweDJmYzExMDAwCS8qIGZsZGRzIC0xNiglcjMwKSwlZmFyZ1ggKi8KZGlmZiAtLWdpdCBhL2JmZC9ocHBhYnNkLWNvcmUuYyBiL2JmZC9ocHBhYnNkLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjMjJmNS4uMDAwMDAwMAotLS0gYS9iZmQvaHBwYWJzZC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUFBBIEJTRCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LiAKLQotICAgVGhlIGNvcmUgZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBVdGFoIDQuM0JTRCBhbmQgT1NGMSBwb3J0cyBvbiB0aGUKLSAgIFBBIGlzIGEgbWl4IGJldHdlZW4gdHJhZGl0aW9uYWwgY29yZXMgYW5kIGhwdXggY29yZXMgLS0ganVzdAotICAgZGlmZmVyZW50IGVub3VnaCB0aGF0IHN1cHBvcnRpbmcgdGhpcyBmb3JtYXQgd291bGQgdGVuZCB0byBhZGQKLSAgIGdyb3NzIGhhY2tzIHRvIHRyYWQtY29yZS5jIG9yIGhwdXgtY29yZS5jLiAgU28gaW5zdGVhZCB3ZSBrZWVwIGFueQotICAgZ3Jvc3MgaGFja3MgaXNvbGF0ZWQgdG8gdGhpcyBmaWxlLiAgKi8KLSAgIAotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFBQQS1CU0Qgc3R5bGUKLSAgIGNvcmUgZmlsZXMuCi0KLSAgIEkgd291bGQgbm90IGV4cGVjdCB0aGlzIHRvIGJlIG9mIHVzZSB0byBhbnkgb3RoZXIgaG9zdC90YXJnZXQsIGJ1dAotICAgeW91IG5ldmVyIGtub3cuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFCU0QpCi0KLSNpbmNsdWRlICJtYWNoaW5lL3ZtcGFyYW0uaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwKLQkJCQkJICAgIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotCQkJCQkgICAgZmlsZV9wdHIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGFzeW1ib2wgKmhwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKmhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEuICAqLwotCi1zdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdAotICB7Ci0gICAgaW50IHNpZzsKLSAgICBjaGFyIGNtZFtNQVhDT01MRU4gKyAxXTsKLSAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuaHBwYWJzZF9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5yZWdfc2VjdGlvbikKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCBvZmZzZXQsIGFsaWdubWVudF9wb3dlcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT5maWxlcG9zID0gb2Zmc2V0OwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ25tZW50X3Bvd2VyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBzdHJ1Y3QgdXNlciB1OwotICBzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqY29yZWRhdGE7Ci0gIGludCBjbGlja3N6OwotCi0gIC8qIFRyeSB0byByZWFkIGluIHRoZSB1LWFyZWEuICBXZSB3aWxsIG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGlzCi0gICAgIHRvIGtub3cgaG93IHRvIGdyb2sgdGhlIHJlc3Qgb2YgdGhlIGNvcmUgc3RydWN0dXJlcy4gICovCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmdSwgMSwgc2l6ZW9mIHUsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiB1KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHBhZ2Ugc2l6ZSBvdXQgb2YgdGhlIHUgc3RydWN0dXJlLiAgVGhpcyB3aWxsIGJlIGRpZmZlcmVudAotICAgICBmb3IgUEEgMS4wIG1hY2hpbmVzIGFuZCBQQSAxLjEgbWFjaGluZXMuICAgWXVrISAgKi8KLSAgY2xpY2tzeiA9IHUudV9wY2IucGNiX3Bnc3o7Ci0KLSAgLyogY2xpY2tzeiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvID49IDJrLiAgKi8KLSAgaWYgKGNsaWNrc3ogPCAweDgwMAotICAgICAgfHwgY2xpY2tzeiAhPSAoY2xpY2tzeiAmIC1jbGlja3N6KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gIC8qIFNhbml0eSBjaGVja3MuICBNYWtlIHN1cmUgdGhlIHNpemUgb2YgdGhlIGNvcmUgZmlsZSBtYXRjaGVzIHRoZQotICAgICB0aGUgc2l6ZSBjb21wdXRlZCBmcm9tIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgY29yZSBpdHNlbGYuICAqLwotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIGlmIChOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSArIHUudV9zc2l6ZSkgPiBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBpZiAoY2xpY2tzeiAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpIDwgc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCS8qIFRoZSBmaWxlIGlzIHRvbyBiaWcuICBNYXliZSBpdCdzIG5vdCBhIGNvcmUgZmlsZQotCSAgIG9yIHdlIG90aGVyd2lzZSBoYXZlIGJhZCB2YWx1ZXMgZm9yIHVfZHNpemUgYW5kIHVfc3NpemUpLiAgKi8KLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIGNvcmVkYXRhID0gKHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVkYXRhKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE1ha2UgdGhlIGNvcmUgZGF0YSBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgdGRhdGEgcGFydCBvZiB0aGUgQkZELiAgKi8KLSAgYWJmZC0+dGRhdGEuaHBwYWJzZF9jb3JlX2RhdGEgPSBjb3JlZGF0YTsKLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0JCQkJCSAgIFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgIGNsaWNrc3ogKiB1LnVfc3NpemUsCi0JCQkJCSAgIE5CUEcgKiAoVVNJWkUgKyBLU1RBS1NJWkUpIAotCQkJCQkgICAgICsgY2xpY2tzeiAqIHUudV9kc2l6ZSwgMik7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBVU1JTVEFDSzsgCi0KLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCQkgIFNFQ19BTExPQyArIFNFQ19MT0FECi0JCQkJCSAgICArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgY2xpY2tzeiAqIHUudV9kc2l6ZSwKLQkJCQkJICBOQlBHICogKFVTSVpFICsgS1NUQUtTSVpFKSwgMik7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IFVEQVRBU0VHOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkJCSBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgS1NUQUtTSVpFICogTkJQRywKLQkJCQkJIE5CUEcgKiBVU0laRSwgMik7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCB1LnVfY29tbSwgTUFYQ09NTEVOICsgMSk7Ci0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IHUudV9jb2RlOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1ocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIC8qIFRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cgdGhpcy4uLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHBhYnNkX2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHBhYnNkX2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQgKCkKLXsKLSAgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwLiAgKi8KLSAgYWJvcnQgKCk7CQotfQotCi0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGhwcGFic2RfY29yZV92ZWMgPQotICB7Ci0gICAgImhwcGFic2QtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBocHBhYnNkX2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChocHBhYnNkX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChocHBhYnNkX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9ocHV4LWNvcmUuYyBiL2JmZC9ocHV4LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlNzA5Zi4uMDAwMDAwMAotLS0gYS9iZmQvaHB1eC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUC9VWCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgotICAgQ29udmVydGVkIHRvIGJhY2stZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNVcHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFAvVVggc3R5bGUKLSAgIGNvcmUgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQMzAwSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0KLS8qIEZJWE1FOiBzeXMvY29yZS5oIGRvZXNuJ3QgZXhpc3QgZm9yIEhQVVggdmVyc2lvbiA3LiAgSFBVWCB2ZXJzaW9uCi0gICA1LCA2LCBhbmQgNyBjb3JlIGZpbGVzIHNlZW0gdG8gYmUgc3RhbmRhcmQgdHJhZC1jb3JlLmMgdHlwZSBjb3JlCi0gICBmaWxlczsgY2FuIHdlIGp1c3QgdXNlIHRyYWQtY29yZS5jIGluIGFkZGl0aW9uIHRvIHRoaXMgZmlsZT8gICovCi0KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0KLSNlbmRpZiAvKiBIT1NUX0hQUEFIUFVYICovCi0KLSNpZmRlZiBIT1NUX0hQUEFCU0QKLQotLyogTm90IGEgdmVyeSBzd2lmdCBwbGFjZSB0byBwdXQgaXQsIGJ1dCB0aGF0J3Mgd2hlcmUgdGhlIEJTRCBwb3J0Ci0gICBwdXRzIHRoZW0uICAqLwotI2luY2x1ZGUgIi9ocHV4L3Vzci9pbmNsdWRlL3N5cy9jb3JlLmgiCi0KLSNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEhBVkVfRElSRU5UX0gKLSMgaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLS8qIEtsdWRnZTogVGhlcmUncyBubyBleHBsaWNpdCBtZWNoYW5pc20gcHJvdmlkZWQgYnkgc3lzL2NvcmUuaCB0bwotICAgY29uZGl0aW9uYWxseSBrbm93IHdoZXRoZXIgYSBwcm9jX2luZm8gaGFzIHRocmVhZCBpZCBmaWVsZHMuCi0gICBIb3dldmVyLCBDT1JFX0FOT05fU0hNRU0gc2hvd3MgdXAgZmlyc3QgYXQgMTAuMzAsIHdoaWNoIGlzCi0gICBoYXBwaWx5IGFsc28gd2hlbiBtZWFuaW5nZnVsIHRocmVhZCBpZCdzIHNob3cgdXAgaW4gcHJvY19pbmZvLiAqLwotI2lmIGRlZmluZWQoQ09SRV9BTk9OX1NITUVNKQotI2RlZmluZSBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCAoMSkKLSNlbmRpZgotCi0vKiBUaGlzIHR5cGUgYXBwZWFycyBhdCBIUC1VWCAxMC4zMC4gIERlZmluaW5nIGl0IGlmIG5vdCBkZWZpbmVkCi0gICBieSBzeXMvY29yZS5oIGFsbG93cyB1cyB0byBidWlsZCBmb3Igb2xkZXIgSFAtVVgncywgYW5kIChzaW5jZQotICAgaXQgd29uJ3QgYmUgZW5jb3VudGVyZWQgaW4gY29yZS1kdW1wcyBmcm9tIG9sZGVyIEhQLVVYJ3MpIGlzCi0gICBoYXJtbGVzcy4gKi8KLSNpZiAhZGVmaW5lZChDT1JFX0FOT05fU0hNRU0pCi0jZGVmaW5lIENPUkVfQU5PTl9TSE1FTSAweDAwMDAwMjAwICAgICAgICAgLyogYW5vbnltb3VzIHNoYXJlZCBtZW1vcnkgKi8KLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi0vKiAubHdwaWQgYW5kIC51c2VyX3RpZCBhcmUgb25seSB2YWxpZCBpZiBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCwgZWxzZSB0aGV5Ci0gICBhcmUgc2V0IHRvIDAuICBBbHNvLCB1bnRpbCBIUC1VWCBpbXBsZW1lbnRzIE14TiB0aHJlYWRzLCAudXNlcl90aWQgYW5kCi0gICAubHdwaWQgYXJlIHN5bm9ueW1vdXMuICovCi1zdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgaW50IGx3cGlkOyAgICAgICAgICAgICAgIC8qIEtlcm5lbCB0aHJlYWQgSUQuICovCi0gIHVuc2lnbmVkIGxvbmcgdXNlcl90aWQ7ICAvKiBVc2VyIHRocmVhZCBJRC4gKi8KLSAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5ocHV4X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotI2RlZmluZSBjb3JlX2tlcm5lbF90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+bHdwaWQpCi0jZGVmaW5lIGNvcmVfdXNlcl90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+dXNlcl90aWQpCi0KLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgYWxpZ25tZW50X3Bvd2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWhwdXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgYmZkIHRhcmdldCBpZiB0aGUgZmlsZSBpcyBhIGNvcmVmaWxlLgotICAgSXQgcmV0dXJucyBudWxsIG9yIDAgaWYgaXQgZmluZHMgb3V0IHRoYWF0IGl0IGlzIG5vdCBhIGNvcmUgZmlsZS4KLSAgIFRoZSB3YXkgaXQgY2hlY2tzIHRoaXMgaXMgYnkgbG9va2luZyBmb3IgYWxsb3dlZCAndHlwZScgZmllbGQgdmFsdWVzLgotICAgVGhlc2UgYXJlIGRlY2xhcmVkIGluIHN5cy9jb3JlLmgKLSAgIFRoZXJlIGFyZSBzb21lIHZhbHVlcyB3aGljaCBhcmUgJ3Jlc2VydmVkIGZvciBmdXR1cmUgdXNlJy4gSW4gcGFydGljdWxhcgotICAgQ09SRV9OT05FIGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgMC4gVGhpcyBtYXkgYmUgYSBjYXRjaC1hbGwgZm9yIGNhc2VzCi0gICBpbiB3aGljaCB0aGUgY29yZSBmaWxlIGlzIGdlbmVyYXRlZCBieSBzb21lIG5vbi1ocHV4IGFwcGxpY2F0aW9uLgotICAgKEkgYW0ganVzdCBndWVzc2luZyBoZXJlISkKLSovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1ocHV4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50ICBnb29kX3NlY3Rpb25zID0gMDsKLSAgaW50ICB1bmtub3duX3NlY3Rpb25zID0gMDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBocHV4X2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB2YWw7Ci0gICAgICBzdHJ1Y3QgY29yZWhlYWQgY29yZV9oZWFkZXI7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7Ci0gICAgICBpZiAodmFsIDw9IDApCi0JYnJlYWs7Ci0gICAgICBzd2l0Y2ggKGNvcmVfaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgQ09SRV9LRVJORUw6Ci0JY2FzZSBDT1JFX0ZPUk1BVDoKLQkgIGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKTsJLyogSnVzdCBza2lwIHRoaXMgKi8KLSAgICAgICAgICBnb29kX3NlY3Rpb25zKys7Ci0JICBicmVhazsKLQljYXNlIENPUkVfRVhFQzoKLQkgIHsKLQkgICAgc3RydWN0IHByb2NfZXhlYyBwcm9jX2V4ZWM7Ci0JICAgIGlmIChiZmRfcmVhZCAoKHZvaWQgKikgJnByb2NfZXhlYywgMSwgY29yZV9oZWFkZXIubGVuLCBhYmZkKQotCQkhPSBjb3JlX2hlYWRlci5sZW4pCi0JICAgICAgYnJlYWs7Ci0JICAgIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIHByb2NfZXhlYy5jbWQsIE1BWENPTUxFTiArIDEpOwotICAgICAgICAgICAgZ29vZF9zZWN0aW9ucysrOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFX1BST0M6Ci0JICB7Ci0JICAgIHN0cnVjdCBwcm9jX2luZm8gcHJvY19pbmZvOwotCSAgICBjaGFyICBzZWNuYW1lWzEwMF07ICAvKiBPZiBhcmJpdHJhcnkgc2l6ZSwgYnV0IHBsZW50eSBsYXJnZS4gKi8KLQotICAgICAgICAgICAgLyogV2UgbmVlZCB0byByZWFkIHRoaXMgc2VjdGlvbiwgJ2NhdXNlIHdlIG5lZWQgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBjb3JlLWR1bXBlZCBhcHAgd2FzIHRocmVhZGVkIGJlZm9yZSB3ZSBjcmVhdGUKLSAgICAgICAgICAgICAgIGFueSAucmVnIHNlY3Rpb25zLiAqLwotCSAgICBpZiAoYmZkX3JlYWQgKCZwcm9jX2luZm8sIDEsIGNvcmVfaGVhZGVyLmxlbiwgYWJmZCkKLQkJIT0gY29yZV9oZWFkZXIubGVuKQotCSAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIC8qIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBjcmVhdGUgdGhvc2Ugc2VjdGlvbnMgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgZmlsZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkLCBpdCBzZWVtcy4gKi8KLSAgICAgICAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgLWNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpICE9IDApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0jaWYgZGVmaW5lZChQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCkKLSAgICAgICAgICAgIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPSBwcm9jX2luZm8ubHdwaWQ7Ci0gICAgICAgICAgICBjb3JlX3VzZXJfdGhyZWFkX2lkIChhYmZkKSA9IHByb2NfaW5mby51c2VyX3RpZDsKLSNlbHNlCi0gICAgICAgICAgICBjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSAgICAgICAgICAgIGNvcmVfdXNlcl90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSNlbmRpZgotICAgICAgICAgICAgLyogSWYgdGhlIHByb2dyYW0gd2FzIHVudGhyZWFkZWQsIHRoZW4gd2UnbGwganVzdCBjcmVhdGUgYQotICAgICAgICAgICAgICAgLnJlZyBzZWN0aW9uLgotCi0gICAgICAgICAgICAgICBJZiB0aGUgcHJvZ3JhbSB3YXMgdGhyZWFkZWQsIHRoZW4gd2UnbGwgY3JlYXRlIC5yZWcvWFhYWFgKLSAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIGVhY2ggdGhyZWFkLCB3aGVyZSBYWFhYWCBpcyBhIHByaW50YWJsZQotICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtlcm5lbCB0aHJlYWQgaWQuICBXZSdsbCBhbHNvCi0gICAgICAgICAgICAgICBjcmVhdGUgYSAucmVnIHNlY3Rpb24gZm9yIHRoZSB0aHJlYWQgdGhhdCB3YXMgcnVubmluZwotICAgICAgICAgICAgICAgYW5kIHNpZ25hbGxlZCBhdCB0aGUgdGltZSBvZiB0aGUgY29yZS1kdW1wIChpLmUuLCB0aGlzCi0gICAgICAgICAgICAgICBpcyBlZmZlY3RpdmVseSBhbiBhbGlhcywgbmVlZGVkIHRvIGtlZXAgR0RCIGhhcHB5LikKLQotICAgICAgICAgICAgICAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFhYWCcgYXMgb3Bwb3NlZCB0byAnLnJlZ1hYWFhYJwotICAgICAgICAgICAgICAgYmVjYXVzZSBHREIgZXhwZWN0cyB0aGF0IC5yZWcyIHdpbGwgYmUgdGhlIGZsb2F0aW5nLQotICAgICAgICAgICAgICAgcG9pbnQgcmVnaXN0ZXJzLiAqLwotICAgICAgICAgICAgaWYgKGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaGVhZGVyLmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAmcHJvY19pbmZvIC0gKGludCkgJiBwcm9jX2luZm8uaHdfcmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVyZSBhcmUgdGhyZWFkcy4gIElzIHRoaXMgdGhlIG9uZSB0aGF0IGNhdXNlZCB0aGUKLSAgICAgICAgICAgICAgICAgICBjb3JlLWR1bXA/ICBXZSdsbCBjbGFpbSBpdCB3YXMgdGhlIHJ1bm5pbmcgdGhyZWFkLiAqLwotICAgICAgICAgICAgICAgIGlmIChwcm9jX2luZm8uc2lnICE9IC0xKQotICAgICAgICAgICAgICAgICAgewotCQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJCQkgICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkJICAgIGNvcmVfaGVhZGVyLmxlbiwKLQkJCQkJICAgIChpbnQpICZwcm9jX2luZm8gLSAoaW50KSAmIHByb2NfaW5mby5od19yZWdzLAotCQkJCQkgICAgMikpCi0JCSAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFdlIGFsd2F5cyBtYWtlIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgZm9yIGV2ZXJ5IHRocmVhZC4gKi8KLSAgICAgICAgICAgICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkpOwotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2hlYWRlci5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgJnByb2NfaW5mbyAtIChpbnQpICYgcHJvY19pbmZvLmh3X3JlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgfQotCSAgICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBwcm9jX2luZm8uc2lnOwotICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKSAhPSAwKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX0RBVEE6Ci0JY2FzZSBDT1JFX1NUQUNLOgotCWNhc2UgQ09SRV9URVhUOgotCWNhc2UgQ09SRV9NTUY6Ci0JY2FzZSBDT1JFX1NITToKLQljYXNlIENPUkVfQU5PTl9TSE1FTToKLQkgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICBjb3JlX2hlYWRlci5sZW4sIGNvcmVfaGVhZGVyLmFkZHIsIDIpKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgYmZkX3NlZWsgKGFiZmQsIGNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpOwotICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX05PTkU6Ci0gICAgICAgICAgLyogTGV0J3Mgbm90IHB1bnQgaWYgd2UgZW5jb3VudGVyIGEgc2VjdGlvbiBvZiB1bmtub3duCi0gICAgICAgICAgICAgdHlwZS4gIFJhdGhlciwgbGV0J3MgbWFrZSBhIG5vdGUgb2YgaXQuICBJZiB3ZSBsYXRlcgotICAgICAgICAgICAgIHNlZSB0aGF0IHRoZXJlIHdlcmUgYWxzbyAiZ29vZCIgc2VjdGlvbnMsIHRoZW4gd2UnbGwKLSAgICAgICAgICAgICBkZWNsYXJlIHRoYXQgdGhpcyBhIGNvcmUgZmlsZSwgYnV0IHdlJ2xsIGFsc28gd2FybiB0aGF0Ci0gICAgICAgICAgICAgaXQgbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZ2RiLgotICAgICAgICAgICAgICovCi0JICB1bmtub3duX3NlY3Rpb25zKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgCi0gICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyp1bnJlY29nbml6ZWQgY29yZSBmaWxlIHR5cGUgKi8KLQl9Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIFdlcmUgdGhlcmUgc2VjdGlvbnMgb2YgdW5rbm93biB0eXBlPyAgSWYgc28sIHlldCB0aGVyZSB3ZXJlCi0gICAgIGF0IGxlYXN0IHNvbWUgY29tcGxldGUgc2VjdGlvbnMgb2Yga25vd24gdHlwZSwgdGhlbiwgaXNzdWUKLSAgICAgYSB3YXJuaW5nLiAgUG9zc2libHkgdGhlIGNvcmUgZmlsZSB3YXMgZ2VuZXJhdGVkIG9uIGEgdmVyc2lvbgotICAgICBvZiBIUC1VWCB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoYXQgZm9yIHdoaWNoIHRoaXMgZ2RiIHdhcwotICAgICBidWlsdC4KLSAgICAgKi8KLSAgaWYgKCh1bmtub3duX3NlY3Rpb25zID4gMCkgJiYgKGdvb2Rfc2VjdGlvbnMgPiAwKSkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICgiJXMgYXBwZWFycyB0byBiZSBhIGNvcmUgZmlsZSxcbmJ1dCBjb250YWlucyB1bmtub3duIHNlY3Rpb25zLiAgSXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIG9uIGFuIGluY29tcGF0aWJsZVxudmVyc2lvbiBvZiBIUC1VWC4gIEFzIGEgcmVzdWx0LCBzb21lIGluZm9ybWF0aW9uIG1heSBiZSB1bmF2YWlsYWJsZS5cbiIsCi0gICAgICAgYWJmZC0+ZmlsZW5hbWUpOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1ocHV4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWhwdXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1ocHV4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotI2RlZmluZSBocHV4X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwdXhfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHB1eF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHV4X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHV4X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiaHB1eC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGhwdXhfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YW91dC5jIGIvYmZkL2kzODZhb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjJjZmYuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZhb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhlIG9ubHkgMzg2IGFvdXQgc3lzdGVtIHdlIGhhdmUgaGVyZSBpcyBHTzMyIGZyb20gREouIAotICAgVGhlc2UgbnVtYmVycyBtYWtlIEJGRCB3b3JrIHdpdGggdGhhdC4gSWYgeW91ciBhb3V0IDM4NiBzeXN0ZW0KLSAgIGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlLCB3ZSdsbCBoYXZlIHRvIHNwbGl0IHRoZW0gaW50byBkaWZmZXJlbnQKLSAgIGZpbGVzLiAgU2VuZCBtZSAoc2FjQGN5Z251cy5jb20pIHRoZSBydW5lcyB0byBtYWtlIGl0IHdvcmsgb24geW91cgotICAgc3lzdGVtLCBhbmQgSSdsbCBzdGljayBpdCBpbiBmb3IgdGhlIG5leHQgcmVsZWFzZS4gICovCi0KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE5fVFhUT0ZGKHgpIDB4MjAKLSNkZWZpbmUgTl9UWFRBRERSKHgpIChOX01BR0lDKHgpPT1aTUFHSUMgPyAweDEwMjAgOiAwKQotCi0jZGVmaW5lIE5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKLSNpZiAwCi0jZGVmaW5lIE5fREFUQUREUih4KSAoTl9NQUdJQyh4KT09T01BR0lDPyAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpIDogKFNFR01FTlRfU0laRSArICgoMHgxMDIwKyh4KS5hX3RleHQtMSkgJiB+KFNFR01FTlRfU0laRS0xKSkpKQotI2RlZmluZSBOT1NVQkVYRUNCCi0KLSNlbmRpZgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4NDAwMDAwCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2YW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYiCi0jZGVmaW5lIE5PX1dSSVRFX0hFQURFUl9LTFVER0UgMQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzg2YW91dF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTIChhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cwotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpKCk7Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVkoc2V0X3NpemVzKSwKLSAgMSwJCQkJLyogZXhlYyBoZWFkZXIgbm90IGNvdW50ZWQgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YnNkLmMgYi9iZmQvaTM4NmJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI4ZmUzLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgQlNELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZGF0YSBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGZvcm1hdCB1c2VkIHVuZGVyIGFsbCB0aGUgdmFyaW91cwotICAgQlNEIHBvcnRzIGZvciAzODYgbWFjaGluZXMuICAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotCi0vKiBaTUFHSUMgZmlsZXMgbmV2ZXIgaGF2ZSB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAgKi8KLSNkZWZpbmUJTl9IRUFERVJfSU5fVEVYVCh4KQkwCi0KLS8qIFpNQUdJQyBmaWxlcyBzdGFydCBhdCBhZGRyZXNzIDAuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIFFNQUdJQy4gICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmJzZF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtYnNkIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2ZHluaXguYyBiL2JmZC9pMzg2ZHluaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MGExNC4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmR5bml4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgZHluaXguCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBCRkQgaXMgY3VycmVudGx5IG9ubHkgdGVzdGVkIHdpdGggZ2RiLCB3cml0aW5nIG9iamVjdCBmaWxlcwotICAgbWF5IG5vdCB3b3JrLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2luY2x1ZGUgImFvdXQvZHluaXgzLmgiCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmR5bml4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1keW5peCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoaTM4NmR5bml4LF8zMl8seSkKLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGkzODZkeW5peF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotCi0vKiBhb3V0eC5oIHJlcXVpcmVzIGRlZmluaXRpb25zIGZvciBOTUFHSUMsIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDAKLSNkZWZpbmUgQk1BR0lDIE9NQUdJQwotI2RlZmluZSBRTUFHSUMgWE1BR0lDCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiAoQWIpdXNlIHNvbWUgZmllbGRzIGluIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlciB0byBiZSBhYmxlIHRvIHJlYWQKLSAgIGV4ZWN1dGFibGVzIHRoYXQgY29udGFpbiBzaGFyZWQgZGF0YS4gICovCi0KLSNkZWZpbmUgYV9zaGRhdGEgYV90bG9hZAotI2RlZmluZSBhX3NoZHJzaXplIGFfZGxvYWQKLQotdm9pZAotaTM4NmR5bml4XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcwotICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKLSAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cwotICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCi0gIG1lbXNldCAoKFBUUikgZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgZXhlY3AtPmFfc2hkYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZGF0YSk7Ci0gIGV4ZWNwLT5hX3NoZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZHJzaXplKTsKLX0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmZyZWVic2QuYyBiL2JmZC9pMzg2ZnJlZWJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTYzNzFiLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2ZnJlZWJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBGcmVlQlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODZfTkVUQlNEIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmZyZWVic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1mcmVlYnNkIgotCi0jaW5jbHVkZSAiZnJlZWJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZsaW51eC5jIGIvYmZkL2kzODZsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDRiZGNkLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4NiB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2bGludXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWxpbnV4IgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOwotCi0vKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKLSAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgotICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWkzODZsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OwotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsKLQotLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotDAotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZQlHT1RfUkVGX1BSRUZJWAkiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAotI2RlZmluZQlQTFRfUkVGX1BSRUZJWAkiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+Zml4dXBfY291bnQgPSAwOwotICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKLSAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotCQkJCSAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIHN0cnVjdCBmaXh1cCAqZjsKLQotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0JICBpZiAoZiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotCSBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLQkgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotCQkgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotCQkJICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotCSAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotCSAgKnArKyA9ICdcMCc7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotCSAgICAgYWxsb2MsIHApOwotCSAgZnJlZSAoYWxsb2MpOwotCX0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdCBpdCAqLwotICBpc19wbHQgPSBJU19QTFRfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGlmIChpc19wbHQgfHwgSVNfR09UX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKSkKLSAgICB7Ci0gICAgICAvKiBMb29rIHVwIHRoaXMgc3ltYm9sIHR3aWNlLiAgT25jZSBqdXN0IGFzIGEgcmVndWxhciBsb29rdXAsCi0JIGFuZCB0aGVuIGFnYWluIGZvbGxvd2luZyBhbGwgb2YgdGhlIGluZGlyZWN0IGxpbmtzIHVudGlsIHdlCi0JIHJlYWNoIGEgcmVhbCBzeW1ib2wuICAqLwotICAgICAgaDEgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIC8qIGgyIGRvZXMgbm90IGZvbGxvdyBpbmRpcmVjdCBzeW1ib2xzLiAqLwotICAgICAgaDIgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotCSB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLQkgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0JIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotCSBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLQkgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLQkgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgxLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgICAgfHwgaDItPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpKQotCXsKLQkgIC8qIFNlZSBpZiB0aGVyZSBpcyBhICJidWlsdGluIiBmaXh1cCBhbHJlYWR5IHByZXNlbnQKLQkgICAgIGludm9sdmluZyB0aGlzIHN5bWJvbC4gIElmIHNvLCBjb252ZXJ0IGl0IHRvIGEgcmVndWxhcgotCSAgICAgZml4dXAuICBJbiB0aGUgZW5kLCB0aGlzIHJlbGF4ZXMgc29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzCi0JICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcGVyZm9ybWluZyBmaXh1cHMuICAqLwotCSAgZXhpc3RzID0gZmFsc2U7Ci0JICBmb3IgKGYxID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0JICAgICAgIGYxICE9IE5VTEw7Ci0JICAgICAgIGYxID0gZjEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKGYxLT5oICE9IGggJiYgZjEtPmggIT0gaDEpCi0JCSAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChmMS0+aCA9PSBoMSkKLQkJZXhpc3RzID0gdHJ1ZTsKLQkgICAgICBpZiAoISBleGlzdHMKLQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkJICBmLT5qdW1wID0gaXNfcGx0OwotCQl9Ci0JICAgICAgZjEtPmggPSBoMTsKLQkgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLQkgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0JICAgICAgZXhpc3RzID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKCEgZXhpc3RzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkgICAgICBpZiAoZiA9PSBOVUxMKQotCQl7Ci0JCSAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotCSBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCBmaW5kIHRoZSBmaXh1cHMuLi4gKi8KLSAgbGludXhfbGlua19oYXNoX3RyYXZlcnNlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBsaW51eF90YWxseV9zeW1ib2xzLAotCQkJICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQl7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGZpeHVwIHRhYmxlLiAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwgCi0JICBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JICBvcy0+dm1hICsgcy0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQotICBmaXh1cF90YWJsZSA9IHMtPmNvbnRlbnRzOwotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQsIGZpeHVwX3RhYmxlKTsKLSAgZml4dXBfdGFibGUgKz0gNDsKLQotICAvKiBGaWxsIGluIGZpeHVwIHRhYmxlLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiRml4dXAoJWQpICVzOiAleCAleFxuIixmLT5qdW1wLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCSAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGYtPmp1bXApCi0JewotCSAgLyogUmVsYXRpdmUgYWRkcmVzcyAqLwotCSAgbmV3X2FkZHIgPSBuZXdfYWRkciAtIChmLT52YWx1ZSArIDUpOyAKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUgKyAxLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCX0KLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIG1hcmtlciBzbyB3ZSBrbm93IHRvIHN3aXRjaCB0byB0aGUgb3RoZXIgdHlwZSBvZiBmaXh1cCAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JewotCSAgaWYgKCEgZi0+YnVpbHRpbikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkJIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLQkgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0JICBwcmludGYgKCJGaXh1cChCKSAlczogJXggJXhcbiIsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICE9IGZpeHVwc193cml0dGVuKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIpKTsKLSAgICAgIHdoaWxlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiBmaXh1cHNfd3JpdHRlbikKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgICsrZml4dXBzX3dyaXR0ZW47Ci0JfQotICAgIH0KLQotICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJICAgICAgIl9fQlVJTFRJTl9GSVhVUFNfXyIsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGlzID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiQnVpbHRpbiBmaXh1cCB0YWJsZSBhdCAleFxuIiwgbmV3X2FkZHIpOwotI2VuZGlmCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZseW54LmMgYi9iZmQvaTM4Nmx5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwMzQ0ZS4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nmx5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWx5bngiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBXUklURV9IRUFERVJTCi0jZGVmaW5lIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApCQkJCQkgICAgICBcCi0gICAgICB7CQkJCQkJCQkJICAgICAgXAotCWJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJICAgICAgXAotCWZpbGVfcHRyIHRleHRfZW5kOwkJCQkJCSAgICAgIFwKLQlpZiAoYWRhdGEoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQkJCSAgICAgIFwKLQkgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOyAgICAgXAotICAgIAkJCQkJCQkJCSAgICAgIFwKLQlleGVjcC0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwkgICAgICBcCi0JZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwkJCSAgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICAgICBcCi0JCQkgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJICAgICAgXAotCWV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgICAgIFwKLQlpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkgICAgICBcCi0JICAgICE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgICAgIFwKLQkvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgICAgXAotICAJCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAgICAgXAotCQkgICE9IDApCQkJCQkJCSAgICAgIFwKLQkgICAgICAgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCEgTkFNRShhb3V0LHdyaXRlX3N5bXMpKGFiZmQpKSByZXR1cm4gZmFsc2U7CQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICAgIGlmICghTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkgICBcCi0JCXJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gMDsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCFOQU1FKGx5bngsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpICAgIFwKLQkJcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkgICAgfQkJCQkJCQkJICAgICAgXAotICAgICAgfQotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotDAotCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0KLWV4dGVybiByZWxvY19ob3d0b190eXBlIGFvdXRfMzJfZXh0X2hvd3RvX3RhYmxlW107Ci1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhb3V0XzMyX3N0ZF9ob3d0b190YWJsZVtdOwotCi0vKiBTdGFuZGFyZCByZWxvYyBzdHVmZiAqLwotLyogT3V0cHV0IHN0YW5kYXJkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi12b2lkCi1OQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRCAoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemU7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLSAgcl9wY3JlbCA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsJLyogUmVsYXRpdmUgdG8gUEM/ICovCi0gIC8qIHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZT8/PyAgRklYTUUtc29vbiAqLwotICByX2Jhc2VyZWwgPSAwOwotICByX2ptcHRhYmxlID0gMDsKLSAgcl9yZWxhdGl2ZSA9IDA7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT5LRUVQSVQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCXwgKHJfcGNyZWwgPyBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCXwgKHJfYmFzZXJlbCA/IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHIDogMCkKLQl8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHIDogMCkKLQl8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHIDogMCkKLQl8IChyX2xlbmd0aCA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkocl9leHRlcm4gPyBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFIDogMCkKLQl8IChyX3BjcmVsID8gUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQl8IChyX2Jhc2VyZWwgPyBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSA6IDApCi0JfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSA6IDApCi0JfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSA6IDApCi0JfCAocl9sZW5ndGggPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotfQotCi0KLS8qIEV4dGVuZGVkIHN0dWZmICovCi0vKiBPdXRwdXQgZXh0ZW5kZWQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhIGZpbGUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICovCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfaW5kZXggPSAoKmctPnN5bV9wdHJfcHRyKS0+S0VFUElUOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCXwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKHJfZXh0ZXJuID8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLSAgICB9Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIHJfYWRkZW5kLCBuYXRwdHItPnJfYWRkZW5kKTsKLX0KLQotLyogQkZEIGRlYWxzIGludGVybmFsbHkgd2l0aCBhbGwgdGhpbmdzIGJhc2VkIGZyb20gdGhlIHNlY3Rpb24gdGhleSdyZQotICAgaW4uIHNvLCBzb21ldGhpbmcgaW4gMTAgYnl0ZXMgaW50byBhIHRleHQgc2VjdGlvbiAgd2l0aCBhIGJhc2Ugb2YKLSAgIDUwIHdvdWxkIGhhdmUgYSBzeW1ib2wgKC50ZXh0KzEwKSBhbmQga25vdyAudGV4dCB2bWEgd2FzIDUwLgotCi0gICBBb3V0IGtlZXBzIGFsbCBpdCdzIHN5bWJvbHMgYmFzZWQgZnJvbSB6ZXJvLCBzbyB0aGUgc3ltYm9sIHdvdWxkCi0gICBjb250YWluIDYwLiBUaGlzIG1hY3JvIHN1YnMgdGhlIGJhc2Ugb2YgZWFjaCBzZWN0aW9uIGZyb20gdGhlIHZhbHVlCi0gICB0byBnaXZlIHRoZSB0cnVlIG9mZnNldCBmcm9tIHRoZSBzZWN0aW9uICovCi0KLQotI2RlZmluZSBNT1ZFX0FERFJFU1MoYWQpICAgICAgIAkJCQkJCVwKLSAgaWYgKHJfZXh0ZXJuKSB7CQkJCQkJCVwKLSAgIC8qIHVuZGVmaW5lZCBzeW1ib2wgKi8JCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgcl9pbmRleDsJCQlcCi0gICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICB9IGVsc2UgewkJCQkJCQkJXAotICAgIC8qIGRlZmluZWQsIHNlY3Rpb24gcmVsYXRpdmUuIHJlcGxhY2Ugc3ltYm9sIHdpdGggcG9pbnRlciB0byAgICAJXAotICAgICAgIHN5bWJvbCB3aGljaCBwb2ludHMgdG8gc2VjdGlvbiAgKi8JCQkJXAotICAgIHN3aXRjaCAocl9pbmRleCkgewkJCQkJCQlcCi0gICAgY2FzZSBOX1RFWFQ6CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkICAtIHN1LT50ZXh0c2VjLT52bWE7CQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgY2FzZSBOX0RBVEE6CQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX2RhdGFzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmRhdGFzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fQlNTOgkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfYnNzc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAtIHN1LT5ic3NzZWMtPnZtYTsJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgZGVmYXVsdDoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQUJTOgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoJCQkJCQkJXAotICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgfSAgICAgCQkJCQkJCQlcCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IChHRVRfU1dPUkQgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpKTsKLQotICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07Ci0gIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotICByX3R5cGUgPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLSAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9leHRfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gIE1PVkVfQUREUkVTUyAoR0VUX1NXT1JEIChhYmZkLCBieXRlcy0+cl9hZGRlbmQpKTsKLX0KLQotdm9pZAotTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07Ci0gIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICByX3BjcmVsID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7Ci0gIHJfam1wdGFibGUgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKLSAgcl9yZWxhdGl2ZSA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRykpOwotICByX2xlbmd0aCA9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0gICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9zdGRfaG93dG9fdGFibGUgKyByX2xlbmd0aCArIDQgKiByX3BjcmVsOwotICAvKiBGSVhNRS1zb29uOiAgUm9sbCBiYXNlcmVsLCBqbXB0YWJsZSwgcmVsYXRpdmUgYml0cyBpbnRvIGhvd3RvIHNldHRpbmcgKi8KLQotICBNT1ZFX0FERFJFU1MgKDApOwotfQotCi0vKiBSZWxvYyBoYWNrZXJ5ICovCi0KLWJvb2xlYW4KLU5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi1kb2l0OgotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFzZWN0LT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0KLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jIChjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAoIXJlbG9jX2NhY2hlICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHJlbG9jX2NhY2hlLCAwLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jcyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NzICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICAgICAgZnJlZSAocmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3M7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgICBhcmVsZW50ICpjYWNoZV9wdHIgPSByZWxvY19jYWNoZTsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCXsKLQkgIE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCQkJYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpycHRyID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOwotICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgICAgYXJlbGVudCAqY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0KLSAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLQl7Ci0JICBOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLQl9Ci0KLSAgICB9Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLS8qIFdyaXRlIG91dCBhIHJlbG9jYXRpb24gc2VjdGlvbiBpbnRvIGFuIG9iamVjdCBmaWxlLiAgKi8KLQotYm9vbGVhbgotTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgYXJlbGVudCAqKmdlbmVyaWM7Ci0gIHVuc2lnbmVkIGNoYXIgKm5hdGl2ZSwgKm5hdHB0cjsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLQotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc2l6ZV90IG5hdHNpemU7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBuYXRzaXplID0gZWFjaF9zaXplICogY291bnQ7Ci0gIG5hdGl2ZSA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKGFiZmQsIG5hdHNpemUpOwotICBpZiAoIW5hdGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2VuZXJpYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCi0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBuYXRwdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotbG9uZwotTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKCEodGJscHRyIHx8IE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCXsKLQkgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCX0KLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm1hY2gzLmMgYi9iZmQvaTM4Nm1hY2gzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjc1ODIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZtYWNoMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGZvciBNYWNoIDMsIHdoaWNoIHVzZXMgYS5vdXQsIG5vdCBNYWNoLU8uICAqLwotCi0vKiBUaGVyZSBpcyBubyBtYWdpYyBudW1iZXIgb3IgYW55dGhpbmcgd2hpY2ggbGV0cyB1cyBkaXN0aW5ndWlzaCB0aGlzIHRhcmdldAotICAgZnJvbSBpMzg2YW91dCBvciBpMzg2YnNkLiAgU28gdGhpcyB0YXJnZXQgaXMgb25seSB1c2VmdWwgaWYgaXQgaXMgdGhlCi0gICBkZWZhdWx0IHRhcmdldC4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkxCi0jZGVmaW5lCVNFR01FTlRfU0laRQkweDEwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MTAwMDAKLSNkZWZpbmUgQVJDSCAzMgotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLS8qIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCB3aGVuIE5fTUFHSUMoeCkgPT0gWk1BR0lDLiAgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpCSgoeCkuYV90ZXh0KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZtYWNoM18sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW1hY2gzIgotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpKCk7Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVkoc2V0X3NpemVzKSwKLSAgMSwJCQkJLyogZXhlYyBoZWFkZXIgbm90IGNvdW50ZWQgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bXNkb3MuYyBiL2JmZC9pMzg2bXNkb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmMjRiMi4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nm1zZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNUy1ET1MgZXhlY3V0YWJsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQnJ5YW4gRm9yZCBvZiB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaWYgMAotc3RydWN0IGV4ZV9oZWFkZXIKLXsKLQl1bnNpZ25lZCBzaG9ydCBtYWdpYzsKLQl1bnNpZ25lZCBzaG9ydCBieXRlc19pbl9sYXN0X3BhZ2U7Ci0JdW5zaWduZWQgc2hvcnQgbnBhZ2VzOwkvKiBudW1iZXIgb2YgNTEyLWJ5dGUgInBhZ2VzIiBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBucmVsb2NzOwotCXVuc2lnbmVkIHNob3J0IGhlYWRlcl9wYXJhczsJLyogbnVtYmVyIG9mIDE2LWJ5dGUgcGFyYWdyYXBocyBpbiBoZWFkZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDsKLQl1bnNpZ25lZCBzaG9ydCBsb2FkX3N3aXRjaDsKLQl1bnNpZ25lZCBzaG9ydCBzc19vZnM7Ci0JdW5zaWduZWQgc2hvcnQgc3A7Ci0JdW5zaWduZWQgc2hvcnQgY2hlY2tzdW07Ci0JdW5zaWduZWQgc2hvcnQgaXA7Ci0JdW5zaWduZWQgc2hvcnQgY3Nfb2ZzOwotCXVuc2lnbmVkIHNob3J0IHJlbG9jX29mczsKLQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDI7Ci0JdW5zaWduZWQgc2hvcnQgc29tZXRoaW5nMTsKLQl1bnNpZ25lZCBzaG9ydCBzb21ldGhpbmcyOwotCXVuc2lnbmVkIHNob3J0IHNvbWV0aGluZzM7Ci19OwotI2VuZGlmCi0KLSNkZWZpbmUgRVhFX01BR0lDCTB4NWE0ZAotI2RlZmluZSBFWEVfTE9BRF9ISUdICTB4MDAwMAotI2RlZmluZSBFWEVfTE9BRF9MT1cJMHhmZmZmCi0jZGVmaW5lIEVYRV9QQUdFX1NJWkUJNTEyCi0KLQotc3RhdGljIGludAotbXNkb3Nfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdGF0aWMgY2hhciBoZHJbRVhFX1BBR0VfU0laRV07Ci0gIGZpbGVfcHRyIG91dGZpbGVfc2l6ZSA9IHNpemVvZihoZHIpOwotICBiZmRfdm1hIGhpZ2hfdm1hID0gMDsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICAvKiBGaW5kIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwcm9ncmFtIG9uIGRpc2sgYW5kIGluIG1lbW9yeS4gICovCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykgPT0gMCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0FMTE9DKQotICAgICAgICB7Ci0JICBiZmRfdm1hIHNlY192bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JICAJCSAgICArIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLQkgIGlmIChzZWNfdm1hID4gaGlnaF92bWEpCi0JICAgIGhpZ2hfdm1hID0gc2VjX3ZtYTsKLQl9Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0xPQUQpCi0gICAgICAgIHsKLQkgIGZpbGVfcHRyIHNlY19lbmQgPSBzaXplb2YoaGRyKQotCSAgCQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkJICAgICArIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLQkgIGlmIChzZWNfZW5kID4gb3V0ZmlsZV9zaXplKQotCSAgICBvdXRmaWxlX3NpemUgPSBzZWNfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBwcm9ncmFtIGlzbid0IHRvbyBiaWcuICAqLwotICBpZiAoaGlnaF92bWEgPiAoYmZkX3ZtYSkweGZmZmYpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvcihiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogY29uc3RhbnRzICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBFWEVfTUFHSUMsICZoZHJbMF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgRVhFX1BBR0VfU0laRSAvIDE2LCAmaGRyWzhdKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIEVYRV9MT0FEX0xPVywgJmhkclsxMl0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgzZSwgJmhkclsyNF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgwMDAxLCAmaGRyWzI4XSk7IC8qIFhYWD8/PyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgzMGZiLCAmaGRyWzMwXSk7IC8qIFhYWD8/PyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHg3MjZhLCAmaGRyWzMyXSk7IC8qIFhYWD8/PyAqLwotCi0gIC8qIGJ5dGVzIGluIGxhc3QgcGFnZSAoMCA9IGZ1bGwgcGFnZSkgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIG91dGZpbGVfc2l6ZSAmIChFWEVfUEFHRV9TSVpFIC0gMSksICZoZHJbMl0pOwotCi0gIC8qIG51bWJlciBvZiBwYWdlcyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgKG91dGZpbGVfc2l6ZSArIEVYRV9QQUdFX1NJWkUgLSAxKSAvIEVYRV9QQUdFX1NJWkUsCi0gIAkgICAgICAgJmhkcls0XSk7Ci0KLSAgLyogU2V0IHRoZSBpbml0aWFsIHN0YWNrIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnNzLgotICAgICBUaGUgcHJvZ3JhbSdzIGNydDAgY29kZSBtdXN0IHJlbG9jYXRlIGl0IHRvIGEgcmVhbCBzdGFjay4gICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBoaWdoX3ZtYSwgJmhkclsxNl0pOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChoZHIsIDEsIHNpemVvZihoZHIpLCBhYmZkKSAhPSBzaXplb2YoaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1tc2Rvc19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0aW9uLT5maWxlcG9zID0gRVhFX1BBR0VfU0laRSArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0xPQUQpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0jZGVmaW5lIG1zZG9zX21rb2JqZWN0IGFvdXRfMzJfbWtvYmplY3QKLSNkZWZpbmUgbXNkb3NfbWFrZV9lbXB0eV9zeW1ib2wgYW91dF8zMl9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBtc2Rvc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dF8zMl9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lCW1zZG9zX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBtc2Rvc19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgbXNkb3NfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotI2RlZmluZSBtc2Rvc19nZXRfc2VjdGlvbl9jb250ZW50cyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbXNkb3NfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBtc2Rvc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG1zZG9zX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgbXNkb3NfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG1zZG9zX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBtc2Rvc19zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgbXNkb3NfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG1zZG9zX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBtc2Rvc19wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIG1zZG9zX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgbXNkb3NfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgbXNkb3NfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG1zZG9zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG1zZG9zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgbXNkb3NfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG1zZG9zX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgbXNkb3NfY2Fub25pY2FsaXplX3JlbG9jIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIG1zZG9zX2dldF9yZWxvY191cHBlcl9ib3VuZCBfYmZkX25vcmVsb2NzX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBtc2Rvc18zMl9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgaTM4Nm1zZG9zX3ZlYyA9Ci17Ci0gICJtc2RvcyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChFWEVDX1ApLAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgbXNkb3NfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIG1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvYmZkL2kzODZuZXRic2QuYyBiL2JmZC9pMzg2bmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyN2I2ZjkuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lCURFRkFVTFRfTUlEIAlNXzM4Nl9ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2b3M5ay5jIGIvYmZkL2kzODZvczlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDFmNWIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZvczlrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBvczkwMDAgaTM4NiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgIm9zOWsuaCIKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKm9zOWtfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIHRha2VuIGZyb20gYSByYXcgYnl0ZQotICAgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIgc3RydWN0dXJlLiAgKi8KLWJvb2xlYW4KLW9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBtaF9jb20gKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0gIHVuc2lnbmVkIGludCBkbG9hZCwgZG1lbXNpemUsIGRtZW1zdGFydDsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBieXRlcy0+bV9zeW5jKTsKLSAgZXhlY3AtPmFfc3ltcyA9IDA7Ci0gIGV4ZWNwLT5hX2VudHJ5ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+bV9leGVjKTsKLSAgZXhlY3AtPmFfdGFsaWduID0gMjsKLSAgZXhlY3AtPmFfZGFsaWduID0gMjsKLSAgZXhlY3AtPmFfYmFsaWduID0gMjsKLQotICBkbG9hZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1faWRhdGEpOwotICBleGVjcC0+YV9kYXRhID0gZGxvYWQgKyA4OwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBkbG9hZCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoJmRtZW1zdGFydCwgc2l6ZW9mIChkbWVtc3RhcnQpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChkbWVtc3RhcnQpKQotICAgICAgfHwgKGJmZF9yZWFkICgmZG1lbXNpemUsIHNpemVvZiAoZG1lbXNpemUpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChkbWVtc2l6ZSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjcC0+YV90bG9hZCA9IDA7Ci0gIGV4ZWNwLT5hX2Rsb2FkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZG1lbXN0YXJ0KTsKLSAgZXhlY3AtPmFfdGV4dCA9IGRsb2FkIC0gZXhlY3AtPmFfdGxvYWQ7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZkbWVtc2l6ZSk7Ci0gIGV4ZWNwLT5hX2JzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1fZGF0YSkgLSBleGVjcC0+YV9kYXRhOwotCi0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IDA7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlIGludG8gdGhlCi0gICBzdXBwbGllZCBidWZmZXIgcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4gICovCi0KLVBST1RPICh2b2lkLCBvczlrX3N3YXBfZXhlY19oZWFkZXJfb3V0LAotICAgICAgICAgKGJmZCAqIGFiZmQsCi0JICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqIGV4ZWNwLAotCSAgc3RydWN0IG1oX2NvbSAqIHJhd19ieXRlcykpOwotdm9pZAotb3M5a19zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIG1oX2NvbSAqcmF3X2J5dGVzOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvLCBieXRlcy0+ZV9pbmZvKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90ZXh0LCBieXRlcy0+ZV90ZXh0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9kYXRhLCBieXRlcy0+ZV9kYXRhKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9ic3MsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfc3ltcywgYnl0ZXMtPmVfc3ltcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZW50cnksIGJ5dGVzLT5lX2VudHJ5KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3Rsb2FkLCBieXRlcy0+ZV90bG9hZCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZGxvYWQsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgYnl0ZXMtPmVfdGFsaWduWzBdID0gZXhlY3AtPmFfdGFsaWduOwotICBieXRlcy0+ZV9kYWxpZ25bMF0gPSBleGVjcC0+YV9kYWxpZ247Ci0gIGJ5dGVzLT5lX2JhbGlnblswXSA9IGV4ZWNwLT5hX2JhbGlnbjsKLSAgYnl0ZXMtPmVfcmVsYXhhYmxlWzBdID0gZXhlY3AtPmFfcmVsYXhhYmxlOwotfQotCi0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vczlrX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgbWhfY29tIGV4ZWNfYnl0ZXM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIE1IQ09NX0JZVEVTX1NJWkUsIDEsIGFiZmQpCi0gICAgICAhPSBNSENPTV9CWVRFU19TSVpFKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhbmV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleGVjX2J5dGVzLm1fc3luYyk7Ci0gIGlmIChOX0JBRE1BRyAoYW5leGVjKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoISBvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsICZleGVjX2J5dGVzLCAmYW5leGVjKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgb3M5a19jYWxsYmFjayk7Ci19Ci0KLQotLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQotICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3M5a19jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGxvbmcgYnNzX3N0YXJ0OwotCi0gIC8qIEFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9pMzg2LCAwKTsKLQotICAvKiBUaGUgcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAwOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gMDsKLQotICAvKiBUaGUgYWxpZ25tZW50cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV90YWxpZ247Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfZGFsaWduOwotICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfYmFsaWduOwotCi0gIC8qIFRoZSBzdGFydGluZyBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV90bG9hZDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV9kbG9hZDsKLQotICAvKiBBbmQgcmVsb2FkIHRoZSBzaXplcywgc2luY2UgdGhlIGFvdXQgbW9kdWxlIHphcHMgdGhlbSAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX3RleHQ7Ci0KLSAgYnNzX3N0YXJ0ID0gZXhlY3AtPmFfZGxvYWQgKyBleGVjcC0+YV9kYXRhOwkvKiBCU1MgPSBlbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSBhbGlnbl9wb3dlciAoYnNzX3N0YXJ0LCBleGVjcC0+YV9iYWxpZ24pOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gZXhlY3AtPmFfZW50cnk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IGV4ZWNwLT5hX2Rsb2FkOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICoqKgotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUk9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gIE5fRFJPRkYoKmV4ZWNwKTsKLSAgKi8KLQotICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMTsJLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAxOy8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gTUhDT01fQllURVNfU0laRTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2lmIDAKLXN0cnVjdCBib3V0X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBhb3V0ZGF0YSBhOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLW9zOWtfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKLQotICByYXdwdHIgPSAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG9ial9ic3NzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vczlrX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLQotICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfaW5mbyA9IEJNQUdJQzsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzID0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoc3RydWN0IG5saXN0KTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RhbGlnbiA9IG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfZGFsaWduID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9iYWxpZ24gPSBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90bG9hZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBleGVjX2hkciAoYWJmZCktPmFfZGxvYWQgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICBib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjX2hkciAoYWJmZCksICZzd2FwcGVkX2hkcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIHN3YXBwZWRfaGRyLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0JICAhPSBFWEVDX0JZVEVTX1NJWkUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1NZTU9GRiAoKmV4ZWNfaGRyIChhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWFvdXRfMzJfd3JpdGVfc3ltcyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fVFJPRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fRFJPRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1vczlrX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7CQkJCS8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MKLQkrIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gICAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpIGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgPT0gY291bnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgaW50Ci1vczlrX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBib29sZWFuIGlnbm9yZTsKLXsKLSAgcmV0dXJuIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLQotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIG9zOWtfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBvczlrX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgb3M5a19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgb3M5a19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBvczlrX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG9zOWtfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgb3M5a19iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjID0KLXsKLSAgImkzODZvczlrIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IFdQX1RFWFQpLAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsIG9zOWtfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChvczlrKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2llZWUuYyBiL2JmZC9pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNmIxMzYuLjAwMDAwMDAKLS0tIGEvYmZkL2llZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpZWVlLTY5NSBvYmplY3RzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBLRUVQTUlOVVNQQ0lOSU5TVCAwCi0KLS8qIElFRUUgNjk1IGZvcm1hdCBpcyBhIHN0cmVhbSBvZiByZWNvcmRzLCB3aGljaCB3ZSBwYXJzZSB1c2luZyBhIHNpbXBsZSBvbmUtCi0gICB0b2tlbiAod2hpY2ggaXMgb25lIGJ5dGUgaW4gdGhpcyBsZXhpY29uKSBsb29rYWhlYWQgcmVjdXJzaXZlIGRlY2VudAotICAgcGFyc2VyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImllZWUuaCIKLSNpbmNsdWRlICJsaWJpZWVlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2J5dGUgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV8yYnl0ZXMgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9pbnQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaWQgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hLCBhc3ltYm9sICosIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgaWVlZV93cml0ZV9pbnQ1IFBBUkFNUyAoKGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaW50NV9vdXQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRoX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZG9fYXNfcmVwZWF0IFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRob3V0X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2RhdGFfcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX21lX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfcHJvY2Vzc29yIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfZGVidWcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBpZWVlIGZpbGVzIGluIHRoZSBzdHJhbmdlIHdheSB0aGF0IHRoZQotICAgc3RhbmRhcmQgcmVxdWlyZXMuICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGJhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJhcmc7Ci17Ci0gIGJmZF9ieXRlIGJ5dGU7Ci0KLSAgYnl0ZSA9IGJhcmc7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZieXRlLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJ5dGVzOwotewotICBiZmRfYnl0ZSBidWZmZXJbMl07Ci0KLSAgYnVmZmVyWzBdID0gYnl0ZXMgPj4gODsKLSAgYnVmZmVyWzFdID0gYnl0ZXMgJiAweGZmOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIDIsIGFiZmQpICE9IDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50IChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAodmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgICAgIC8qIEhvdyBtYW55IHNpZ25pZmljYW50IGJ5dGVzID8gKi8KLSAgICAgIC8qIEZJWE1FIEZPUiBMT05HRVIgSU5UUyAqLwotICAgICAgaWYgKHZhbHVlICYgMHhmZjAwMDAwMCkKLQlsZW5ndGggPSA0OwotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwZmYwMDAwKQotCWxlbmd0aCA9IDM7Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDAwMGZmMDApCi0JbGVuZ3RoID0gMjsKLSAgICAgIGVsc2UKLQlsZW5ndGggPSAxOwotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgIChiZmRfYnl0ZSkgKChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtCi0JCQkJCSArIGxlbmd0aCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAobGVuZ3RoKQotCXsKLQljYXNlIDQ6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlID4+IDI0KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAzOgotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSA+PiAxNikpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMjoKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUgPj4gOCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMToKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2lkIChhYmZkLCBpZCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICppZDsKLXsKLSAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbiAoaWQpOwotCi0gIGlmIChsZW5ndGggPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDI1NSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDY1NTM1KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIChpbnQpIGxlbmd0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3RyaW5nIHRvbyBsb25nICglZCBjaGFycywgbWF4IDY1NTM1KSIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGVuZ3RoKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGlkLCAxLCBsZW5ndGgsIGFiZmQpICE9IGxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRnVuY3Rpb25zIGZvciByZWFkaW5nIGZyb20gaWVlZSBmaWxlcyBpbiB0aGUgc3RyYW5nZSB3YXkgdGhhdCB0aGUKLXN0YW5kYXJkIHJlcXVpcmVzOgotKi8KLQotI2RlZmluZSB0aGlzX2J5dGUoaWVlZSkgKigoaWVlZSktPmlucHV0X3ApCi0jZGVmaW5lIG5leHRfYnl0ZShpZWVlKSAoKGllZWUpLT5pbnB1dF9wKyspCi0jZGVmaW5lIHRoaXNfYnl0ZV9hbmRfbmV4dChpZWVlKSAoKigoaWVlZSktPmlucHV0X3ArKykpCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAotcmVhZF8yYnl0ZXMgKGllZWUpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLXsKLSAgdW5zaWduZWQgY2hhciBjMSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gIHVuc2lnbmVkIGNoYXIgYzIgPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICByZXR1cm4gKGMxIDw8IDgpIHwgYzI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZ2V0X3N0cmluZyAoaWVlZSwgc3RyaW5nLCBsZW5ndGgpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmluZ1tpXSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX2lkIChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGNoYXIgKnN0cmluZzsKLSAgbGVuZ3RoID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgaWYgKGxlbmd0aCA8PSAweDdmKQotICAgIHsKLSAgICAgIC8qIFNpbXBsZSBzdHJpbmcgb2YgbGVuZ3RoIDAgdG8gMTI3ICovCi0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZSkKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCBieXRlLCBhbGxvd2luZyAwLi4yNTUgKi8KLSAgICAgIGxlbmd0aCA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZikKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCB0d28gYnl0ZXMsIGFsbG93aW5nIDAuLjY1NTM1ICovCi0gICAgICBsZW5ndGggPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgICAgbGVuZ3RoID0gKGxlbmd0aCAqIDI1NikgKyB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgIH0KLSAgLyogQnV5IG1lbW9yeSBhbmQgcmVhZCBzdHJpbmcgKi8KLSAgc3RyaW5nID0gYmZkX2FsbG9jIChpZWVlLT5hYmZkLCBsZW5ndGggKyAxKTsKLSAgaWYgKCFzdHJpbmcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGJmZF9nZXRfc3RyaW5nIChpZWVlLCBzdHJpbmcsIGxlbmd0aCk7Ci0gIHN0cmluZ1tsZW5ndGhdID0gMDsKLSAgcmV0dXJuIHN0cmluZzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiBwY3JlbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICB1bnNpZ25lZCBpbnQgdGVybV9jb3VudCA9IDA7Ci0KLSAgaWYgKHZhbHVlICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50Kys7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBEZWYgb2YgYSBjb21tb24gc3ltYm9sICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfWF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdGVybV9jb3VudCsrOwotICAgIH0KLSAgZWxzZSBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogUmVmIHRvIGRlZmluZWQgc3ltYm9sIC0gKi8KLQotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9JX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgKEJTRl9MT0NBTCB8IEJTRl9TRUNUSU9OX1NZTSkpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgbG9jYWwgc3ltYm9sLiAgV2UgY2FuCi0JICAgICBlYXNpbHkgZG8gYSBsb2NhbCBhcyBhIHNlY3Rpb24rb2Zmc2V0LiAgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9SX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQkgIGlmIChzeW1ib2wtPnZhbHVlICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICB0ZXJtX2NvdW50Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5yZWNvZ25pemVkIHN5bWJvbCBgJXMnIGZsYWdzIDB4JXgiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCSAgICAgc3ltYm9sLT5mbGFncyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIC8qIHN1YnRyYWN0IHRoZSBwYyBmcm9tIGhlcmUgYnkgYXNraW5nIGZvciBQQyBvZiB0aGlzIHNlY3Rpb24qLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1BfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKGluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgYSAwIGFkZHJlc3MuICAqLwotICBpZiAodGVybV9jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHdoaWxlICh0ZXJtX2NvdW50ID4gMSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50LS07Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotd3JpdGVzIGFueSBpbnRlZ2VyIGludG8gdGhlIGJ1ZmZlciBzdXBwbGllZCBhbmQgYWx3YXlzIHRha2VzIDUgYnl0ZXMKLSovCi1zdGF0aWMgdm9pZAotaWVlZV93cml0ZV9pbnQ1IChidWZmZXIsIHZhbHVlKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBidWZmZXJbMF0gPSAoYmZkX2J5dGUpIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW07Ci0gIGJ1ZmZlclsxXSA9ICh2YWx1ZSA+PiAyNCkgJiAweGZmOwotICBidWZmZXJbMl0gPSAodmFsdWUgPj4gMTYpICYgMHhmZjsKLSAgYnVmZmVyWzNdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKLSAgYnVmZmVyWzRdID0gKHZhbHVlID4+IDApICYgMHhmZjsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50NV9vdXQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGJmZF9ieXRlIGJbNV07Ci0KLSAgaWVlZV93cml0ZV9pbnQ1IChiLCB2YWx1ZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGIsIDEsIDUsIGFiZmQpICE9IDUpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2ludCAoaWVlZSwgdmFsdWVfcHRyKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJmZF92bWEgKnZhbHVlX3B0cjsKLXsKLSAgaW50IHZhbHVlID0gdGhpc19ieXRlIChpZWVlKTsKLSAgaW50IHJlc3VsdDsKLSAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgICp2YWx1ZV9wdHIgPSB2YWx1ZTsKLSAgICAgIG5leHRfYnl0ZSAoaWVlZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlID49IDB4ODAgJiYgdmFsdWUgPD0gMHg4OCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSB2YWx1ZSAmIDB4ZjsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICBuZXh0X2J5dGUgKGllZWUpOwotICAgICAgd2hpbGUgKGNvdW50KQotCXsKLQkgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotCSAgY291bnQtLTsKLQl9Ci0gICAgICAqdmFsdWVfcHRyID0gcmVzdWx0OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX2kgKGllZWUsIG9rKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJvb2xlYW4gKm9rOwotewotICBiZmRfdm1hIHg7Ci0gICpvayA9IHBhcnNlX2ludCAoaWVlZSwgJngpOwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGJmZF92bWEKLW11c3RfcGFyc2VfaW50IChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIGJmZF92bWEgcmVzdWx0OwotICBCRkRfQVNTRVJUIChwYXJzZV9pbnQgKGllZWUsICZyZXN1bHQpID09IHRydWUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfdm1hIHZhbHVlOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci19IGllZWVfdmFsdWVfdHlwZTsKLQotCi0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIGFyZwotI2RlZmluZSBQQ1JFTF9PRkZTRVQgZmFsc2UKLQotI2Vsc2UKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIDAKLSNkZWZpbmUgUENSRUxfT0ZGU0VUIHRydWUKLQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFiczMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIDAsCi0JICJhYnMzMiIsCi0JIHRydWUsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWJzMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczE2IiwKLQkgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwKLQkgMHgwMDAwZmZmZiwKLQkgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhYnM4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczgiLAotCSB0cnVlLAotCSAweDAwMDAwMGZmLAotCSAweDAwMDAwMGZmLAotCSBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJlbDMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIDAsCi0JICJyZWwzMiIsCi0JIHRydWUsCi0JIFNSQ19NQVNLICgweGZmZmZmZmZmKSwKLQkgMHhmZmZmZmZmZiwKLQkgUENSRUxfT0ZGU0VUKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmVsMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDE2IiwKLQkgdHJ1ZSwKLQkgU1JDX01BU0sgKDB4MDAwMGZmZmYpLAotCSAweDAwMDBmZmZmLAotCSBQQ1JFTF9PRkZTRVQpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByZWw4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDgiLAotCSB0cnVlLAotCSBTUkNfTUFTSyAoMHgwMDAwMDBmZiksCi0JIDB4MDAwMDAwZmYsCi0JIFBDUkVMX09GRlNFVCk7Ci0KLXN0YXRpYyBpZWVlX3N5bWJvbF9pbmRleF90eXBlIE5PU1lNQk9MID0gezAsIDB9OwotCi1zdGF0aWMgdm9pZAotcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGV4dHJhLCBzZWN0aW9uKQotICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLSAgICAgYmZkX3ZtYSAqdmFsdWU7Ci0gICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiAqcGNyZWw7Ci0gICAgIHVuc2lnbmVkIGludCAqZXh0cmE7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbjsKLQotewotI2RlZmluZSBQT1Mgc3BbMV0KLSNkZWZpbmUgVE9TIHNwWzBdCi0jZGVmaW5lIE5PUyBzcFstMV0KLSNkZWZpbmUgSU5DIHNwKys7Ci0jZGVmaW5lIERFQyBzcC0tOwotCi0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGllZWVfdmFsdWVfdHlwZSBzdGFja1sxMF07Ci0KLSAgLyogVGhlIHN0YWNrIHBvaW50ZXIgYWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCB1bnVzZWQgbG9jYXRpb24gKi8KLSNkZWZpbmUgUFVTSCh4LHkseikgVE9TLnN5bWJvbD14O1RPUy5zZWN0aW9uPXk7VE9TLnZhbHVlPXo7SU5DOwotI2RlZmluZSBQT1AoeCx5LHopIERFQzt4PVRPUy5zeW1ib2w7eT1UT1Muc2VjdGlvbjt6PVRPUy52YWx1ZTsKLSAgaWVlZV92YWx1ZV90eXBlICpzcCA9IHN0YWNrOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1BfZW51bToKLQkgIC8qIFAgdmFyaWFibGUsIGN1cnJlbnQgcHJvZ3JhbSBjb3VudGVyIGZvciBzZWN0aW9uIG4gKi8KLQkgIHsKLQkgICAgaW50IHNlY3Rpb25fbjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgKnBjcmVsID0gdHJ1ZTsKLQkgICAgc2VjdGlvbl9uID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICBQVVNIIChOT1NZTUJPTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgaWVlZV92YXJpYWJsZV9MX2VudW06Ci0JICAvKiBMIHZhcmlhYmxlICBhZGRyZXNzIG9mIHNlY3Rpb24gTiAqLwotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIFBVU0ggKE5PU1lNQk9MLCBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0sIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQkgIC8qIFIgdmFyaWFibGUsIGxvZ2ljYWwgYWRkcmVzcyBvZiBzZWN0aW9uIG1vZHVsZSAqLwotCSAgLyogRklYTUUsIHRoaXMgc2hvdWxkIGJlIGRpZmZlcmVudCB0byBMICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsIGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXSwgMCk7Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfU19lbnVtOgotCSAgLyogUyB2YXJpYWJsZSwgc2l6ZSBpbiBNQVVTIG9mIHNlY3Rpb24gbW9kdWxlICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsCi0JCTAsCi0JCWllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXS0+X3Jhd19zaXplKTsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YXJpYWJsZV9JX2VudW06Ci0JICAvKiBQdXNoIHRoZSBhZGRyZXNzIG9mIHZhcmlhYmxlIG4gKi8KLQkgIHsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgc3kuaW5kZXggPSAoaW50KSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmxldHRlciA9ICdJJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfWF9lbnVtOgotCSAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiBleHRlcm5hbCB2YXJpYWJsZSBuICovCi0JICB7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmluZGV4ID0gKGludCkgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSk7Ci0JICAgIHN5LmxldHRlciA9ICdYJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX3VuZF9zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfZnVuY3Rpb25fbWludXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xLCAqc2VjdGlvbl9kdW1teTsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5LCBzZWN0aW9uMSwgdmFsdWUxKTsKLQkgICAgUE9QIChzeSwgc2VjdGlvbl9kdW1teSwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3ksIHNlY3Rpb24xID8gc2VjdGlvbjEgOiBzZWN0aW9uX2R1bW15LCB2YWx1ZTIgLSB2YWx1ZTEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjI7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5MSwgc2VjdGlvbjEsIHZhbHVlMSk7Ci0JICAgIFBPUCAoc3kyLCBzZWN0aW9uMiwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3kxLmxldHRlciA/IHN5MSA6IHN5MiwKLQkJICBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24xKSA/IHNlY3Rpb24yIDogc2VjdGlvbjEsCi0JCSAgdmFsdWUxICsgdmFsdWUyKTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgdmE7Ci0JICAgIEJGRF9BU1NFUlQgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPCAoaW50KSBpZWVlX3ZhcmlhYmxlX0FfZW51bQotCQkgICAgfHwgdGhpc19ieXRlICgmKGllZWUtPmgpKSA+IChpbnQpIGllZWVfdmFyaWFibGVfWl9lbnVtKTsKLQkgICAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhKSkKLQkgICAgICB7Ci0JCVBVU0ggKE5PU1lNQk9MLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB2YSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKgotCQkgIFRoYXRzIGFsbCB0aGF0IHdlIGNhbiB1bmRlcnN0YW5kLiBBcyBmYXIgYXMgSSBjYW4gc2VlCi0JCSAgdGhlcmUgaXMgYSBidWcgaW4gdGhlIE1pY3JvdGVjIElFRUUgb3V0cHV0IHdoaWNoIEknbQotCQkgIHVzaW5nIHRvIHNjYW4sIHdoZXJlYnkgdGhlIGNvbW1hIG9wZXJhdG9yIGlzIG9taXR0ZWQKLQkJICBzb21ldGltZXMgaW4gYW4gZXhwcmVzc2lvbiwgZ2l2aW5nIGV4cHJlc3Npb25zIHdpdGggdG9vCi0JCSAgbWFueSB0ZXJtcy4gV2UgY2FuIHRlbGwgaWYgdGhhdCdzIHRoZSBjYXNlIGJ5IGVuc3VyaW5nCi0JCSAgdGhhdCBzcCA9PSBzdGFjayBoZXJlLiBJZiBub3QsIHRoZW4gd2UndmUgcHVzaGVkCi0JCSAgc29tZXRoaW5nIHRvbyBmYXIsIHNvIHdlIGtlZXAgYWRkaW5nLiAgKi8KLQotCQl3aGlsZSAoc3AgIT0gc3RhY2sgKyAxKQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpzZWN0aW9uMTsKLQkJICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCQkgICAgUE9QIChzeTEsIHNlY3Rpb24xLCAqZXh0cmEpOwotCQkgIH0KLQkJewotCQkgIGFzZWN0aW9uICpkdW1teTsKLQotCQkgIFBPUCAoKnN5bWJvbCwgZHVtbXksICp2YWx1ZSk7Ci0JCSAgaWYgKHNlY3Rpb24pCi0JCSAgICAqc2VjdGlvbiA9IGR1bW15OwotCQl9Ci0KLQkJbG9vcCA9IGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0gICAgfQotfQotCi0KLSNkZWZpbmUgaWVlZV9zZWVrKGFiZmQsIG9mZnNldCkgXAotICBJRUVFX0RBVEEoYWJmZCktPmguaW5wdXRfcCA9IElFRUVfREFUQShhYmZkKS0+aC5maXJzdF9ieXRlICsgb2Zmc2V0Ci0KLSNkZWZpbmUgaWVlZV9wb3MoYWJmZCkgXAotICAoSUVFRV9EQVRBKGFiZmQpLT5oLmlucHV0X3AgLSBJRUVFX0RBVEEoYWJmZCktPmguZmlyc3RfYnl0ZSkKLQotc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2luZGV4Owotc3RhdGljIGNoYXIgbGFzdF90eXBlOwkJLyogaXMgdGhlIGluZGV4IGZvciBhbiBYIG9yIGEgRCAqLwotCi1zdGF0aWMgaWVlZV9zeW1ib2xfdHlwZSAqCi1nZXRfc3ltYm9sIChhYmZkLAotCSAgICBpZWVlLAotCSAgICBsYXN0X3N5bWJvbCwKLQkgICAgc3ltYm9sX2NvdW50LAotCSAgICBwcHRyLAotCSAgICBtYXhfaW5kZXgsCi0JICAgIHRoaXNfdHlwZQotKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICBpZWVlX3N5bWJvbF90eXBlICpsYXN0X3N5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICpzeW1ib2xfY291bnQ7Ci0gICAgIGllZWVfc3ltYm9sX3R5cGUgKioqcHB0cjsKLSAgICAgdW5zaWduZWQgaW50ICptYXhfaW5kZXg7Ci0gICAgIGNoYXIgdGhpc190eXBlCi0gICAgICA7Ci17Ci0gIC8qIE5lZWQgYSBuZXcgc3ltYm9sICovCi0gIHVuc2lnbmVkIGludCBuZXdfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gIGlmIChuZXdfaW5kZXggIT0gbGFzdF9pbmRleCB8fCB0aGlzX3R5cGUgIT0gbGFzdF90eXBlKQotICAgIHsKLSAgICAgIGllZWVfc3ltYm9sX3R5cGUgKm5ld19zeW1ib2wgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwKLQkJCQkJCSBzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUpKTsKLSAgICAgIGlmICghbmV3X3N5bWJvbCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbmV3X3N5bWJvbC0+aW5kZXggPSBuZXdfaW5kZXg7Ci0gICAgICBsYXN0X2luZGV4ID0gbmV3X2luZGV4OwotICAgICAgKCpzeW1ib2xfY291bnQpKys7Ci0gICAgICAqKnBwdHIgPSBuZXdfc3ltYm9sOwotICAgICAgKnBwdHIgPSAmbmV3X3N5bWJvbC0+bmV4dDsKLSAgICAgIGlmIChuZXdfaW5kZXggPiAqbWF4X2luZGV4KQotCXsKLQkgICptYXhfaW5kZXggPSBuZXdfaW5kZXg7Ci0JfQotICAgICAgbGFzdF90eXBlID0gdGhpc190eXBlOwotICAgICAgbmV3X3N5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgcmV0dXJuIG5ld19zeW1ib2w7Ci0gICAgfQotICByZXR1cm4gbGFzdF9zeW1ib2w7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBmaWxlX3B0ciBvZmZzZXQgPSBpZWVlLT53LnIuZXh0ZXJuYWxfcGFydDsKLQotICBpZWVlX3N5bWJvbF90eXBlICoqcHJldl9zeW1ib2xzX3B0ciA9ICZpZWVlLT5leHRlcm5hbF9zeW1ib2xzOwotICBpZWVlX3N5bWJvbF90eXBlICoqcHJldl9yZWZlcmVuY2VfcHRyID0gJmllZWUtPmV4dGVybmFsX3JlZmVyZW5jZTsKLSAgaWVlZV9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IDA7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGxhc3RfaW5kZXggPSAweGZmZmZmZjsKLSAgaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPSB0cnVlOwotCi0gIGllZWVfc2VlayAoYWJmZCwgb2Zmc2V0KTsKLQotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JewotCWNhc2UgaWVlZV9ubl9yZWNvcmQ6Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICBzeW1ib2wgPSBnZXRfc3ltYm9sIChhYmZkLCBpZWVlLCBzeW1ib2wsICZzeW1ib2xfY291bnQsCi0JCQkgICAgICAgJnByZXZfc3ltYm9sc19wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXgsICdJJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX05PX0ZMQUdTOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3N5bWJvbHNfcHRyLAotCQkJICAgICAgICZpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4LCAnRCcpOwotCSAgaWYgKHN5bWJvbCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIEJGRF9BU1NFUlQgKHN5bWJvbC0+aW5kZXggPj0gaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleCk7Ci0KLQkgIHN5bWJvbC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCSAgc3ltYm9sLT5zeW1ib2wubmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCSAgc3ltYm9sLT5zeW1ib2wudWRhdGEucCA9IChQVFIpIE5VTEw7Ci0JICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0gPj4gODoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2luZGV4OwotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX3R5cGVfaW5kZXg7Ci0JICAgIHVuc2lnbmVkIGludCBzeW1ib2xfYXR0cmlidXRlX2RlZjsKLQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQkgICAgc3dpdGNoIChyZWFkXzJieXRlcyAoaWVlZSkpCi0JICAgICAgewotCSAgICAgIGNhc2UgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW06Ci0JCXN5bWJvbF9uYW1lX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQlzeW1ib2xfdHlwZV9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJc3ltYm9sX2F0dHJpYnV0ZV9kZWYgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCXN3aXRjaCAoc3ltYm9sX2F0dHJpYnV0ZV9kZWYpCi0JCSAgewotCQkgIGNhc2UgODoKLQkJICBjYXNlIDE5OgotCQkgICAgcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgICAgKF8oIiVzOiB1bmltcGxlbWVudGVkIEFUSSByZWNvcmQgICV1IGZvciBzeW1ib2wgJXUiKSwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzeW1ib2xfYXR0cmlidXRlX2RlZiwKLQkJICAgICAgIHN5bWJvbF9uYW1lX2luZGV4KTsKLQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICBjYXNlIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2luZm9fcmVjb3JkX2VudW06Ci0JCS8qIFNraXAgb3ZlciBBVFggcmVjb3JkLiAqLwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgaWVlZV9hdG5fcmVjb3JkX2VudW06Ci0JCS8qIFdlIG1heSBnZXQgY2FsbCBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24gaGVyZSwKLQkJICAgd2hpY2ggd2UganVzdCBpZ25vcmUuICBUaGUgZm9ybWF0IGlzCi0JCSAgIHskRjF9JHtDRX17aW5kZXh9eyQwMH17JDNGfXskM0Z9eyNfb2ZfQVNOc30gKi8KLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJaWYgKHZhbHVlICE9IDB4M2YpCi0JCSAgewotCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAgIChfKCIlczogdW5leHBlY3RlZCBBVE4gdHlwZSAlZCBpbiBleHRlcm5hbCBwYXJ0IiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIChpbnQpIHZhbHVlKTsKLQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJd2hpbGUgKHZhbHVlID4gMCkKLQkJICB7Ci0JCSAgICBiZmRfdm1hIHZhbDE7Ci0KLQkJICAgIC0tdmFsdWU7Ci0KLQkJICAgIHN3aXRjaCAocmVhZF8yYnl0ZXMgKGllZWUpKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgaWVlZV9hc25fcmVjb3JkX2VudW06Ci0JCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsMSk7Ci0JCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsMSk7Ci0JCQlicmVhazsKLQotCQkgICAgICBkZWZhdWx0OgotCQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgIChfKCIlczogdW5leHBlY3RlZCB0eXBlIGFmdGVyIEFUTiIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFsdWVfcmVjb3JkX2VudW0gPj4gODoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2luZGV4OwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbF9pZ25vcmU7Ci0JICAgIGJvb2xlYW4gcGNyZWxfaWdub3JlOwotCSAgICB1bnNpZ25lZCBpbnQgZXh0cmE7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgICAgc3ltYm9sX25hbWVfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHBhcnNlX2V4cHJlc3Npb24gKGllZWUsCi0JCQkgICAgICAmc3ltYm9sLT5zeW1ib2wudmFsdWUsCi0JCQkgICAgICAmc3ltYm9sX2lnbm9yZSwKLQkJCSAgICAgICZwY3JlbF9pZ25vcmUsCi0JCQkgICAgICAmZXh0cmEsCi0JCQkgICAgICAmc3ltYm9sLT5zeW1ib2wuc2VjdGlvbik7Ci0KLQkgICAgLyogRnVsbHkgbGlua2VkIElFRUUtNjk1IGZpbGVzIHRlbmQgdG8gZ2l2ZSBldmVyeSBzeW1ib2wKLSAgICAgICAgICAgICAgIGFuIGFic29sdXRlIHZhbHVlLiAgVHJ5IHRvIGNvbnZlcnQgdGhhdCBiYWNrIGludG8gYQotICAgICAgICAgICAgICAgc2VjdGlvbiByZWxhdGl2ZSB2YWx1ZS4gIEZJWE1FOiBUaGlzIHdvbid0IGFsd2F5cyB0bwotICAgICAgICAgICAgICAgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbikKLQkJJiYgKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSA9PSAwKQotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWw7Ci0JCWFzZWN0aW9uICpzOwotCi0JCXZhbCA9IHN5bWJvbC0+c3ltYm9sLnZhbHVlOwotCQlmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkJICB7Ci0JCSAgICBpZiAodmFsID49IHMtPnZtYSAmJiB2YWwgPCBzLT52bWEgKyBzLT5fcmF3X3NpemUpCi0JCSAgICAgIHsKLQkJCXN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBzOwotCQkJc3ltYm9sLT5zeW1ib2wudmFsdWUgLT0gcy0+dm1hOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQ7Ci0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV93ZWFrX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIHNpemU7Ci0JICAgIGJmZF92bWEgdmFsdWU7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIC8qIFRocm93IGF3YXkgdGhlIGV4dGVybmFsIHJlZmVyZW5jZSBpbmRleCAqLwotCSAgICAodm9pZCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBGZXRjaCB0aGUgZGVmYXVsdCBzaXplIGlmIG5vdCByZXNvbHZlZCAqLwotCSAgICBzaXplID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBGZXRjaCB0aGUgZGVmYXV0bHQgdmFsdWUgaWYgYXZhaWxhYmxlICovCi0JICAgIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSkgPT0gZmFsc2UpCi0JICAgICAgewotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCSAgICAvKiBUaGlzIHR1cm5zIGludG8gYSBjb21tb24gKi8KLQkgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgIHN5bWJvbC0+c3ltYm9sLnZhbHVlID0gc2l6ZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3JlZmVyZW5jZV9wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXgsICdYJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgc3ltYm9sLT5zeW1ib2wudmFsdWUgPSAoYmZkX3ZtYSkgMDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gMDsKLQotCSAgQkZEX0FTU0VSVCAoc3ltYm9sLT5pbmRleCA+PSBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4KTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4ICE9IDApCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50ID0KLQlpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4IC0KLQlpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4ICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQgPSAwOwotICAgIH0KLQotICBpZiAoaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCA9Ci0JaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCAtCi0JaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPQotICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudDsKLQotICBpZiAoc3ltYm9sX2NvdW50ICE9IGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBnYXBzIGluIHRoZSB0YWJsZSAtLSAqLwotICAgICAgaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPSBmYWxzZTsKLSAgICB9Ci0KLSAgKnByZXZfc3ltYm9sc19wdHIgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICAqcHJldl9yZWZlcmVuY2VfcHRyID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChJRUVFX0RBVEEgKGFiZmQpLT5yZWFkX3N5bWJvbHMgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBJRUVFX0RBVEEgKGFiZmQpLT5yZWFkX3N5bWJvbHMgPSB0cnVlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWllZWVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoISBpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgIT0gMCkgPwotICAgIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAoaWVlZV9zeW1ib2xfdHlwZSAqKSkgOiAwOwotfQotCi0vKgotTW92ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0cyB0byB0aGUgY2Fub24gdGFibGUsIGFuZCBpbnNlcnQgaW4KLXN5bWJvbCBpbmRleCBvcmRlcgotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci0KLWxvbmcKLWllZWVfZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICBpZWVlX3N5bWJvbF90eXBlICpzeW1wOwotICBzdGF0aWMgYmZkIGR1bW15X2JmZDsKLSAgc3RhdGljIGFzeW1ib2wgZW1wdHlfc3ltYm9sID0KLSAgLyogdGhlX2JmZCwgbmFtZSwgdmFsdWUsIGF0dHIsIHNlY3Rpb24gKi8KLSAgeyZkdW1teV9iZmQsICIgaWVlZSBlbXB0eSIsIChzeW12YWx1ZSkgMCwgQlNGX0RFQlVHR0lORywgYmZkX2Fic19zZWN0aW9uX3B0cn07Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgICAgIGR1bW15X2JmZC54dmVjID0gJmllZWVfdmVjOwotICAgICAgaWYgKCEgaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID09IGZhbHNlKQotCXsKLQkgIC8qIEFycmdoIC0gdGhlcmUgYXJlIGdhcHMgaW4gdGhlIHRhYmxlLCBydW4gdGhyb3VnaCBhbmQgZmlsbCB0aGVtICovCi0JICAvKiB1cCB3aXRoIHBvaW50ZXJzIHRvIGEgbnVsbCBwbGFjZSAqLwotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c3ltY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGxvY2F0aW9uW2ldID0gJmVtcHR5X3N5bWJvbDsKLQkgICAgfQotCX0KLQotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0ID0gLWllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXg7Ci0gICAgICBmb3IgKHN5bXAgPSBJRUVFX0RBVEEgKGFiZmQpLT5leHRlcm5hbF9zeW1ib2xzOwotCSAgIHN5bXAgIT0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQkgICBzeW1wID0gc3ltcC0+bmV4dCkKLQl7Ci0JICAvKiBQbGFjZSBpbnRvIHRhYmxlIGF0IGNvcnJlY3QgaW5kZXggbG9jYXRpb25zICovCi0JICBsb2NhdGlvbltzeW1wLT5pbmRleCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldF0gPSAmc3ltcC0+c3ltYm9sOwotCX0KLQotICAgICAgLyogVGhlIGV4dGVybmFsIHJlZnMgYXJlIGluZGV4ZWQgaW4gYSBiaXQgKi8KLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldCA9Ci0JLWllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXggKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQ7Ci0KLSAgICAgIGZvciAoc3ltcCA9IElFRUVfREFUQSAoYWJmZCktPmV4dGVybmFsX3JlZmVyZW5jZTsKLQkgICBzeW1wICE9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7Ci0JICAgc3ltcCA9IHN5bXAtPm5leHQpCi0JewotCSAgbG9jYXRpb25bc3ltcC0+aW5kZXggKyBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXRdID0KLQkgICAgJnN5bXAtPnN5bWJvbDsKLQotCX0KLSAgICB9Ci0gIGlmIChhYmZkLT5zeW1jb3VudCkKLSAgICB7Ci0gICAgICBsb2NhdGlvblthYmZkLT5zeW1jb3VudF0gPSAoYXN5bWJvbCAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGFiZmQtPnN5bWNvdW50OwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZ2V0X3NlY3Rpb25fZW50cnkgKGFiZmQsIGllZWUsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA+PSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGMsIGk7Ci0gICAgICBhc2VjdGlvbiAqKm47Ci0KLSAgICAgIGMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemU7Ci0gICAgICBpZiAoYyA9PSAwKQotCWMgPSAyMDsKLSAgICAgIHdoaWxlIChjIDw9IGluZGV4KQotCWMgKj0gMjsKLQotICAgICAgbiA9ICgoYXNlY3Rpb24gKiopCi0JICAgYmZkX3JlYWxsb2MgKGllZWUtPnNlY3Rpb25fdGFibGUsIGMgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gICAgICBpZiAobiA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBmb3IgKGkgPSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemU7IGkgPCBjOyBpKyspCi0JbltpXSA9IE5VTEw7Ci0KLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGUgPSBuOwotICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplID0gYzsKLSAgICB9Ci0KLSAgaWYgKGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnRtcCA9IGJmZF9hbGxvYyAoYWJmZCwgMTEpOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgICAgIGlmICghdG1wKQotCXJldHVybiBOVUxMOwotICAgICAgc3ByaW50ZiAodG1wLCAiIGZzZWMlNGQiLCBpbmRleCk7Ci0gICAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgdG1wKTsKLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID0gc2VjdGlvbjsKLSAgICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX05PX0ZMQUdTOwotICAgICAgc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gaW5kZXg7Ci0gICAgICBpZWVlLT5zZWN0aW9uX3RhYmxlW2luZGV4XSA9IHNlY3Rpb247Ci0gICAgfQotICByZXR1cm4gaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF07Ci19Ci0KLXN0YXRpYyB2b2lkCi1pZWVlX3NsdXJwX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgZmlsZV9wdHIgb2Zmc2V0ID0gaWVlZS0+dy5yLnNlY3Rpb25fcGFydDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgY2hhciAqbmFtZTsKLQotICBpZiAob2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgc2VjdGlvbl90eXBlWzNdOwotICAgICAgaWVlZV9zZWVrIChhYmZkLCBvZmZzZXQpOwotICAgICAgd2hpbGUgKHRydWUpCi0JewotCSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCSAgICB7Ci0JICAgIGNhc2UgaWVlZV9zZWN0aW9uX3R5cGVfZW51bToKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBzZWN0aW9uX2luZGV4OwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQlzZWN0aW9uX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0JCXNlY3Rpb24gPSBnZXRfc2VjdGlvbl9lbnRyeSAoYWJmZCwgaWVlZSwgc2VjdGlvbl9pbmRleCk7Ci0KLQkJc2VjdGlvbl90eXBlWzBdID0gdGhpc19ieXRlX2FuZF9uZXh0ICgmKGllZWUtPmgpKTsKLQotCQkvKiBTZXQgbWluaW1hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuIEF0dHJpYnV0ZXMgYXJlCi0JCSAgIGV4dGVuZGVkIGxhdGVyLCBiYXNlZCBvbiBzZWN0aW9uIGNvbnRlbnRzLiAqLwotCi0JCXN3aXRjaCAoc2VjdGlvbl90eXBlWzBdKQotCQkgIHsKLQkJICBjYXNlIDB4QzE6Ci0JCSAgICAvKiBOb3JtYWwgYXR0cmlidXRlcyBmb3IgYWJzb2x1dGUgc2VjdGlvbnMJKi8KLQkJICAgIHNlY3Rpb25fdHlwZVsxXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkJICAgIHN3aXRjaCAoc2VjdGlvbl90eXBlWzFdKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMHhEMzoJLyogQVMgQWJzb2x1dGUgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0JCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc2VjdGlvbl90eXBlWzJdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJCXN3aXRjaCAoc2VjdGlvbl90eXBlWzJdKQotCQkJICB7Ci0JCQkgIGNhc2UgMHhEMDoKLQkJCSAgICAvKiBOb3JtYWwgY29kZSAqLwotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMHhDNDoKLQkJCSAgICAvKiBOb3JtYWwgZGF0YSAqLwotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMHhEMjoKLQkJCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJICAgIC8qIE5vcm1hbCByb20gZGF0YSAqLwotCQkJICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19ST00gfCBTRUNfREFUQTsKLQkJCSAgICBicmVhazsKLQkJCSAgZGVmYXVsdDoKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDB4QzM6CS8qIE5hbWVkIHJlbG9jYXRhYmxlIHNlY3Rpb25zICh0eXBlIEMpICovCi0JCSAgICBzZWN0aW9uX3R5cGVbMV0gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JCSAgICBzd2l0Y2ggKHNlY3Rpb25fdHlwZVsxXSkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDB4RDA6CS8qIE5vcm1hbCBjb2RlIChDUCkgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDB4QzQ6CS8qIE5vcm1hbCBkYXRhIChDRCkgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDB4RDI6CS8qIE5vcm1hbCByb20gZGF0YSAoQ1IpICovCi0JCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JPTSB8IFNFQ19EQVRBOwotCQkJYnJlYWs7Ci0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBSZWFkIHNlY3Rpb24gbmFtZSwgdXNlIGl0IGlmIG5vbiBlbXB0eS4gKi8KLQkJbmFtZSA9IHJlYWRfaWQgKCZpZWVlLT5oKTsKLQkJaWYgKG5hbWVbMF0pCi0JCSAgc2VjdGlvbi0+bmFtZSA9IG5hbWU7Ci0KLQkJLyogU2tpcCB0aGVzZSBmaWVsZHMsIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQgKi8KLQkJewotCQkgIGJmZF92bWEgcGFyZW50LCBicm90aGVyLCBjb250ZXh0OwotCQkgIHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnBhcmVudCk7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmYnJvdGhlcik7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmY29udGV4dCk7Ci0JCX0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0JCWJmZF92bWEgdmFsdWU7Ci0JCWFzZWN0aW9uICpzZWN0aW9uOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQlzZWN0aW9uX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCZpZWVlLT5oKTsKLQkJc2VjdGlvbiA9IGdldF9zZWN0aW9uX2VudHJ5IChhYmZkLCBpZWVlLCBzZWN0aW9uX2luZGV4KTsKLQkJaWYgKHNlY3Rpb25faW5kZXggPiBpZWVlLT5zZWN0aW9uX2NvdW50KQotCQkgIHsKLQkJICAgIGllZWUtPnNlY3Rpb25fY291bnQgPSBzZWN0aW9uX2luZGV4OwotCQkgIH0KLQkJc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0KLQkJICBiZmRfbG9nMiAobXVzdF9wYXJzZV9pbnQgKCZpZWVlLT5oKSk7Ci0JCSh2b2lkKSBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtOgotCSAgICAgIHsKLQkJaWVlZV9yZWNvcmRfZW51bV90eXBlIHQgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAocmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpKTsKLQotCQlzd2l0Y2ggKHQpCi0JCSAgewotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX3NpemVfZW51bToKLQkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07Ci0JCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfcGh5c2ljYWxfcmVnaW9uX3NpemVfZW51bToKLQkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07Ci0JCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfcmVnaW9uX2Jhc2VfYWRkcmVzc19lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9tYXVfc2l6ZV9lbnVtOgotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX21fdmFsdWVfZW51bToKLQkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtOgotCQkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgICh2b2lkKSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogTWFrZSBhIHNlY3Rpb24gZm9yIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIGFueS4gIFdlIGRvbid0IHRyeQotICAgdG8gaW50ZXJwcmV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb247IHdlIGp1c3QgcG9pbnQgdGhlIHNlY3Rpb24KLSAgIGF0IHRoZSBhcmVhIGluIHRoZSBmaWxlIHNvIHRoYXQgcHJvZ3JhbSB3aGljaCB1bmRlcnN0YW5kIGNhbiBkaWcgaXQKLSAgIG91dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2RlYnVnIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRlYnVnIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNlYy0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlYy0+ZmlsZXBvcyA9IGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0OwotICBzZWMtPl9yYXdfc2l6ZSA9IGllZWUtPncuci5kYXRhX3BhcnQgLSBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgYXJjaGl2ZSBzdHVmZgotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1pZWVlX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpsaWJyYXJ5OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgY2hhciBidWZmZXJbNTEyXTsKLSAgZmlsZV9wdHIgYnVmZmVyX29mZnNldCA9IDA7Ci0gIGllZWVfYXJfZGF0YV90eXBlICpzYXZlID0gYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhOwotICBpZWVlX2FyX2RhdGFfdHlwZSAqaWVlZTsKLSAgdW5zaWduZWQgaW50IGFsY19lbHRzOwotICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqZWx0cyA9IE5VTEw7Ci0KLSAgYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhID0KLSAgICAoaWVlZV9hcl9kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGllZWVfYXJfZGF0YV90eXBlKSk7Ci0gIGlmICghYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZWVlID0gSUVFRV9BUl9EQVRBIChhYmZkKTsKLQotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCi0gIGllZWUtPmguZmlyc3RfYnl0ZSA9IGJ1ZmZlcjsKLSAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCi0gIGllZWUtPmguYWJmZCA9IGFiZmQ7Ci0KLSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgIT0gTW9kdWxlX0JlZ2lubmluZykKLSAgICB7Ci0gICAgICBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEgPSBzYXZlOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0gIGxpYnJhcnkgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLSAgaWYgKHN0cmNtcCAobGlicmFyeSwgIkxJQlJBUlkiKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpZWVlKTsKLSAgICAgIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9IHNhdmU7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIC8qIFRocm93IGF3YXkgdGhlIGZpbGVuYW1lICovCi0gIHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCi0gIGllZWUtPmVsZW1lbnRfY291bnQgPSAwOwotICBpZWVlLT5lbGVtZW50X2luZGV4ID0gMDsKLQotICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIHRoZSBhZCBwYXJ0ICovCi0gIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsJLyogQW5kIHRoZSB0d28gZHVtbXkgbnVtYmVycyAqLwotICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0KLSAgYWxjX2VsdHMgPSAxMDsKLSAgZWx0cyA9IChpZWVlX2FyX29ic3RhY2tfdHlwZSAqKSBiZmRfbWFsbG9jIChhbGNfZWx0cyAqIHNpemVvZiAqZWx0cyk7Ci0gIGlmIChlbHRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogUmVhZCB0aGUgaW5kZXggb2YgdGhlIEJCIHRhYmxlICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCByZWM7Ci0gICAgICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqdDsKLQotICAgICAgcmVjID0gcmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpOwotICAgICAgaWYgKHJlYyAhPSAoaW50KSBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCWJyZWFrOwotCi0gICAgICBpZiAoaWVlZS0+ZWxlbWVudF9jb3VudCA+PSBhbGNfZWx0cykKLQl7Ci0JICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqbjsKLQotCSAgYWxjX2VsdHMgKj0gMjsKLQkgIG4gPSAoKGllZWVfYXJfb2JzdGFja190eXBlICopCi0JICAgICAgIGJmZF9yZWFsbG9jIChlbHRzLCBhbGNfZWx0cyAqIHNpemVvZiAqZWx0cykpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBlbHRzID0gbjsKLQl9Ci0KLSAgICAgIHQgPSAmZWx0c1tpZWVlLT5lbGVtZW50X2NvdW50XTsKLSAgICAgIGllZWUtPmVsZW1lbnRfY291bnQrKzsKLQotICAgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotICAgICAgdC0+ZmlsZV9vZmZzZXQgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gICAgICB0LT5hYmZkID0gKGJmZCAqKSBOVUxMOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBnbyBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCi0gICAgICBpZiAoKHNpemVfdCkgaWVlZV9wb3MgKGFiZmQpID4gc2l6ZW9mIChidWZmZXIpIC8gMikKLQl7Ci0JICAvKiBQYXN0IGhhbGYgd2F5LCByZXNlZWsgYW5kIHJlcHJpbWUgKi8KLQkgIGJ1ZmZlcl9vZmZzZXQgKz0gaWVlZV9wb3MgKGFiZmQpOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBidWZmZXJfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMKLQkgICAgIHRvIHJlYWQgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLQkgIGJmZF9yZWFkICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCk7Ci0JICBpZWVlLT5oLmZpcnN0X2J5dGUgPSBidWZmZXI7Ci0JICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0JfQotICAgIH0KLQotICBpZWVlLT5lbGVtZW50cyA9ICgoaWVlZV9hcl9vYnN0YWNrX3R5cGUgKikKLQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAgICBpZWVlLT5lbGVtZW50X2NvdW50ICogc2l6ZW9mICppZWVlLT5lbGVtZW50cykpOwotICBpZiAoaWVlZS0+ZWxlbWVudHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtY3B5IChpZWVlLT5lbGVtZW50cywgZWx0cywKLQkgIGllZWUtPmVsZW1lbnRfY291bnQgKiBzaXplb2YgKmllZWUtPmVsZW1lbnRzKTsKLSAgZnJlZSAoZWx0cyk7Ci0gIGVsdHMgPSBOVUxMOwotCi0gIC8qIE5vdyBzY2FuIHRoZSBhcmVhIGFnYWluLCBhbmQgcmVwbGFjZSBCQiBvZmZzZXRzIHdpdGggZmlsZSAqLwotICAvKiBvZmZzZXRzICovCi0KLSAgZm9yIChpID0gMjsgaSA8IGllZWUtPmVsZW1lbnRfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0bwotCSByZWFkIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gICAgICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotICAgICAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOwotICAgICAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCi0gICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIEY4ICovCi0gICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIDE0ICovCi0gICAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIERyb3Agc2l6ZSBvZiBibG9jayAqLwotICAgICAgaWYgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSAhPSAwKQotCXsKLQkgIC8qIFRoaXMgb2JqZWN0IGhhcyBiZWVuIGRlbGV0ZWQgKi8KLQkgIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWVlZS0+ZWxlbWVudHNbaV0uZmlsZV9vZmZzZXQgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JfQotICAgIH0KLQotICAvKiAgYWJmZC0+aGFzX2FybWFwID0gOyovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChlbHRzICE9IE5VTEwpCi0gICAgZnJlZSAoZWx0cyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSAoaWVlZV9kYXRhX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX2RhdGFfdHlwZSkpOwotICByZXR1cm4gYWJmZC0+dGRhdGEuaWVlZV9kYXRhID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWllZWVfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqcHJvY2Vzc29yOwotICB1bnNpZ25lZCBpbnQgcGFydDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzMwMF07Ci0gIGllZWVfZGF0YV90eXBlICpzYXZlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSAwOwotICBpZWVlX21rb2JqZWN0IChhYmZkKTsKLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZmFpbDsKLSAgLyogUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGluIHRvIHNlZSBpZiBpdCBtYWtlcyBzZW5zZSAqLwotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCi0gIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLSAgaWYgKHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSkgIT0gTW9kdWxlX0JlZ2lubmluZykKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0KLSAgaWVlZS0+cmVhZF9zeW1ib2xzID0gZmFsc2U7Ci0gIGllZWUtPnJlYWRfZGF0YSA9IGZhbHNlOwotICBpZWVlLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCA9IDA7Ci0gIGllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXggPSBJRUVFX1BVQkxJQ19CQVNFOwotICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4ID0gSUVFRV9SRUZFUkVOQ0VfQkFTRTsKLSAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCA9IDA7Ci0gIGllZWUtPmguYWJmZCA9IGFiZmQ7Ci0gIGllZWUtPnNlY3Rpb25fdGFibGUgPSBOVUxMOwotICBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUgPSAwOwotCi0gIHByb2Nlc3NvciA9IGllZWUtPm1iLnByb2Nlc3NvciA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotICBpZiAoc3RyY21wIChwcm9jZXNzb3IsICJMSUJSQVJZIikgPT0gMCkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0gIGllZWUtPm1iLm1vZHVsZV9uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0gIGlmIChhYmZkLT5maWxlbmFtZSA9PSAoQ09OU1QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFiZmQtPmZpbGVuYW1lID0gaWVlZS0+bWIubW9kdWxlX25hbWU7Ci0gICAgfQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4KLSAgICAgKi8KLSAgewotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaDsKLSAgICBjaGFyIGZhbWlseVsxMF07Ci0KLSAgICAvKiBJRUVFIGRvZXMgbm90IHNwZWNpZnkgdGhlIGZvcm1hdCBvZiB0aGUgcHJvY2Vzc29yIGlkZW50aWZpY2F0b24KLSAgICAgICBzdHJpbmcsIHNvIHRoZSBjb21waWxlciBpcyBmcmVlIHRvIHB1dCBpbiBpdCB3aGF0ZXZlciBpdCB3YW50cy4KLSAgICAgICBXZSB0cnkgaGVyZSB0byByZWNvZ25pemUgZGlmZmVyZW50IHByb2Nlc3NvcnMgYmVsb25naW5nIHRvIHRoZQotICAgICAgIG02OGsgZmFtaWx5LiAgQ29kZSBmb3Igb3RoZXIgcHJvY2Vzc29ycyBjYW4gYmUgYWRkZWQgaGVyZS4gICovCi0gICAgaWYgKChwcm9jZXNzb3JbMF0gPT0gJzYnKSAmJiAocHJvY2Vzc29yWzFdID09ICc4JykpCi0gICAgICB7Ci0JaWYgKHByb2Nlc3NvclsyXSA9PSAnMycpCSAgICAvKiA2ODN4eCBpbnRlZ3JhdGVkIHByb2Nlc3NvcnMgKi8KLQkgIHsKLQkgICAgc3dpdGNoIChwcm9jZXNzb3JbM10pCi0JICAgICAgewotCSAgICAgIGNhc2UgJzAnOgkJCSAgICAvKiA2ODMwMiwgNjgzMDYsIDY4MzA3ICovCi0JICAgICAgY2FzZSAnMic6CQkJICAgIC8qIDY4MzIyLCA2ODMyOCAqLwotCSAgICAgIGNhc2UgJzUnOgkJCSAgICAvKiA2ODM1NiAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MDAwIik7ICAgLyogTUM2ODAwMC1iYXNlZCBjb250cm9sbGVycyAqLwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgkJCSAgICAvKiA2ODMzMCwgNjgzMzEsIDY4MzMyLCA2ODMzMywKLQkJCQkJICAgICAgIDY4MzM0LCA2ODMzNSwgNjgzMzYsIDY4MzM4ICovCi0JICAgICAgY2FzZSAnNic6CQkJICAgIC8qIDY4MzYwICovCi0JICAgICAgY2FzZSAnNyc6CQkJICAgIC8qIDY4Mzc2ICovCi0JCXN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgICAvKiBDUFUzMiBhbmQgQ1BVMzIrICovCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNCc6Ci0JCWlmIChwcm9jZXNzb3JbNF0gPT0gJzknKSAgICAvKiA2ODM0OSAqLwotCQkgIHN0cmNweSAoZmFtaWx5LCAiNjgwMzAiKTsgLyogQ1BVMDMwICovCi0JCWVsc2UJCSAgICAgICAgICAgIC8qIDY4MzQwLCA2ODM0MSAqLwotCQkgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgLyogQ1BVMzIgYW5kIENQVTMyKyAqLwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6CQkJICAgIC8qIERvZXMgbm90IGV4aXN0IHlldCAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7ICAgLyogR3Vlc3MgaXQgd2lsbCBiZSBDUFUzMiAqLwotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmICh0b3VwcGVyIChwcm9jZXNzb3JbM10pID09ICdGJykgICAvKiA2OEYzMzMgKi8KLQkgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsJICAgICAgICAgIC8qIENQVTMyICovCi0JZWxzZSBpZiAoKHRvdXBwZXIgKHByb2Nlc3NvclszXSkgPT0gJ0MnKSAgLyogRW1iZWRkZWQgY29udHJvbGxlcnMgKi8KLQkJICYmICgodG91cHBlciAocHJvY2Vzc29yWzJdKSA9PSAnRScpCi0JCSAgICAgfHwgKHRvdXBwZXIgKHByb2Nlc3NvclsyXSkgPT0gJ0gnKQotCQkgICAgIHx8ICh0b3VwcGVyIChwcm9jZXNzb3JbMl0pID09ICdMJykpKQotCSAgewotCSAgICBzdHJjcHkgKGZhbWlseSwgIjY4Iik7Ci0JICAgIHN0cm5jYXQgKGZhbWlseSwgcHJvY2Vzc29yICsgNCwgNyk7Ci0JICAgIGZhbWlseVs5XSA9ICdcMCc7Ci0JICB9Ci0JZWxzZQkJCQkgLyogIlJlZ3VsYXIiIHByb2Nlc3NvcnMgKi8KLQkgIHsKLQkgICAgc3RybmNweSAoZmFtaWx5LCBwcm9jZXNzb3IsIDkpOwotCSAgICBmYW1pbHlbOV0gPSAnXDAnOwotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKChzdHJuY21wIChwcm9jZXNzb3IsICJjcHUzMiIsIDUpID09IDApIC8qIENQVTMyIGFuZCBDUFUzMisgKi8KLQkgICAgIHx8IChzdHJuY21wIChwcm9jZXNzb3IsICJDUFUzMiIsIDUpID09IDApKQotICAgICAgc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOwotICAgIGVsc2UKLSAgICAgIHsKLQlzdHJuY3B5IChmYW1pbHksIHByb2Nlc3NvciwgOSk7Ci0JZmFtaWx5WzldID0gJ1wwJzsKLSAgICAgIH0KLQotICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoIChmYW1pbHkpOwotICAgIGlmIChhcmNoID09IDApCi0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0gICAgYWJmZC0+YXJjaF9pbmZvID0gYXJjaDsKLSAgfQotCi0gIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpICE9IChpbnQpIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX2VudW0pCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmaWVlZS0+YWQubnVtYmVyX29mX2JpdHNfbWF1KSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmaWVlZS0+YWQubnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcykgPT0gZmFsc2UpCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIGJ5dGUgb3JkZXIgaW5mbywgdGFrZSBpdCAqLwotICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX3ZhcmlhYmxlX0xfZW51bSB8fAotICAgICAgdGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX3ZhcmlhYmxlX01fZW51bSkKLSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0gIGZvciAocGFydCA9IDA7IHBhcnQgPCBOX1dfVkFSSUFCTEVTOyBwYXJ0KyspCi0gICAgewotICAgICAgYm9vbGVhbiBvazsKLSAgICAgIGlmIChyZWFkXzJieXRlcyAoJihpZWVlLT5oKSkgIT0gKGludCkgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotICAgICAgaWYgKHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSkgIT0gcGFydCkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotCi0gICAgICBpZWVlLT53Lm9mZnNldFtwYXJ0XSA9IHBhcnNlX2kgKCYoaWVlZS0+aCksICZvayk7Ci0gICAgICBpZiAob2sgPT0gZmFsc2UpCi0JewotCSAgZ290byBmYWlsOwotCX0KLQotICAgIH0KLQotICBpZiAoaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQgIT0gMCkKLSAgICBhYmZkLT5mbGFncyA9IEhBU19TWU1TOwotCi0gIC8qIEJ5IG5vdyB3ZSBrbm93IHRoYXQgdGhpcyBpcyBhIHJlYWwgSUVFRSBmaWxlLCB3ZSdyZSBnb2luZyB0byByZWFkCi0gICAgIHRoZSB3aG9sZSB0aGluZyBpbnRvIG1lbW9yeSBzbyB0aGF0IHdlIGNhbiBydW4gdXAgYW5kIGRvd24gaXQKLSAgICAgcXVpY2tseS4gIFdlIGNhbiB3b3JrIG91dCBob3cgYmlnIHRoZSBmaWxlIGlzIGZyb20gdGhlIHRyYWlsZXIKLSAgICAgcmVjb3JkICovCi0KLSAgSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlID0KLSAgICAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwgaWVlZS0+dy5yLm1lX3JlY29yZCArIDEpOwotICBpZiAoIUlFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSkKLSAgICBnb3RvIGZhaWw7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGZhaWw7Ci0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSAoSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlKSwgMSwKLQkgICAgaWVlZS0+dy5yLm1lX3JlY29yZCArIDEsIGFiZmQpOwotCi0gIGllZWVfc2x1cnBfc2VjdGlvbnMgKGFiZmQpOwotCi0gIGlmICghIGllZWVfc2x1cnBfZGVidWcgKGFiZmQpKQotICAgIGdvdG8gZmFpbDsKLQotICAvKiBQYXJzZSBzZWN0aW9uIGRhdGEgdG8gYWN0aXZhdGUgZmlsZSBhbmQgc2VjdGlvbiBmbGFncyBpbXBsaWVkIGJ5Ci0gICAgIHNlY3Rpb24gY29udGVudHMuICovCi0KLSAgaWYgKCEgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpKQotICAgIGdvdG8gZmFpbDsKLSAgICAKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci1nb3Rfd3JvbmdfZm9ybWF0OgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLWZhaWw6Ci0gICh2b2lkKSBiZmRfcmVsZWFzZSAoYWJmZCwgaWVlZSk7Ci0gIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA9IHNhdmU7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi12b2lkCi1pZWVlX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoc3ltYm9sLT5uYW1lWzBdID09ICcgJykKLSAgICByZXQtPm5hbWUgPSAiKiBlbXB0eSB0YWJsZSBlbnRyeSAiOwotICBpZiAoIXN5bWJvbC0+c2VjdGlvbikKLSAgICByZXQtPnR5cGUgPSAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkgPyAnYScgOiAnQSc7Ci19Ci0KLXZvaWQKLWllZWVfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSNpZiAwCi0gICAgICBmcHJpbnRmIChmaWxlLCAiJTR4ICUyeCIsIGFvdXRfc3ltYm9sIChzeW1ib2wpLT5kZXNjICYgMHhmZmZmLAotCSAgICAgICBhb3V0X3N5bWJvbCAoc3ltYm9sKS0+b3RoZXIgJiAweGZmKTsKLSNlbmRpZgotICAgICAgQkZEX0ZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSA9Ci0JICAoc3ltYm9sLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMCi0JICAgPyAiKmFicyIKLQkgICA6IHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0JaWYgKHN5bWJvbC0+bmFtZVswXSA9PSAnICcpCi0JICB7Ci0JICAgIGZwcmludGYgKGZpbGUsICIqIGVtcHR5IHRhYmxlIGVudHJ5ICIpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCSAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJTA0eCAlMDJ4ICVzIiwKLQkJICAgICBzZWN0aW9uX25hbWUsCi0JCSAgICAgKHVuc2lnbmVkKSBpZWVlX3N5bWJvbCAoc3ltYm9sKS0+aW5kZXgsCi0JCSAgICAgKHVuc2lnbmVkKSAwLAotCQkgICAgIHN5bWJvbC0+bmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1kb19vbmUgKGllZWUsIGN1cnJlbnRfbWFwLCBsb2NhdGlvbl9wdHIsIHMsIGl0ZXJhdGlvbnMpCi0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKmN1cnJlbnRfbWFwOwotICAgICB1bnNpZ25lZCBjaGFyICpsb2NhdGlvbl9wdHI7Ci0gICAgIGFzZWN0aW9uICpzOwotICAgICBpbnQgaXRlcmF0aW9uczsKLXsKLSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotICAgIHsKLSAgICBjYXNlIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtOgotICAgICAgewotCXVuc2lnbmVkIGludCBudW1iZXJfb2ZfbWF1czsKLQl1bnNpZ25lZCBpbnQgaTsKLQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCW51bWJlcl9vZl9tYXVzID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9tYXVzOyBpKyspCi0JICB7Ci0JICAgIGxvY2F0aW9uX3B0cltjdXJyZW50X21hcC0+cGMrK10gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bToKLSAgICAgIHsKLQlib29sZWFuIGxvb3AgPSB0cnVlOwotCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0Jd2hpbGUgKGxvb3ApCi0JICB7Ci0JICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQotCSAgICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9zaWduZWRfb3Blbl9iX2VudW06Ci0JICAgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX29wZW5fYl9lbnVtOgotCSAgICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW06Ci0JCXsKLQkJICB1bnNpZ25lZCBpbnQgZXh0cmEgPSA0OwotCQkgIGJvb2xlYW4gcGNyZWwgPSBmYWxzZTsKLQkJICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkJICBpZWVlX3JlbG9jX3R5cGUgKnIgPQotCQkgIChpZWVlX3JlbG9jX3R5cGUgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsCi0JCQkJCQkgc2l6ZW9mIChpZWVlX3JlbG9jX3R5cGUpKTsKLQkJICBpZiAoIXIpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAqKGN1cnJlbnRfbWFwLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkgIGN1cnJlbnRfbWFwLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkgIHItPm5leHQgPSAoaWVlZV9yZWxvY190eXBlICopIE5VTEw7Ci0JCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLS8qCQkJICAgIGFib3J0KCk7Ki8KLQkJICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSAwOwotCQkgIHBhcnNlX2V4cHJlc3Npb24gKGllZWUsCi0JCQkJICAgICZyLT5yZWxlbnQuYWRkZW5kLAotCQkJCSAgICAmci0+c3ltYm9sLAotCQkJCSAgICAmcGNyZWwsICZleHRyYSwgJnNlY3Rpb24pOwotCQkgIHItPnJlbGVudC5hZGRyZXNzID0gY3VycmVudF9tYXAtPnBjOwotCQkgIHMtPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkJICBzLT5vd25lci0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotCQkgIHMtPnJlbG9jX2NvdW50Kys7Ci0JCSAgaWYgKHItPnJlbGVudC5zeW1fcHRyX3B0ciA9PSBOVUxMICYmIHNlY3Rpb24gIT0gTlVMTCkKLQkJICAgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IHNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCi0JCSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV9jb21tYSkKLQkJICAgIHsKLQkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgICAgLyogRmV0Y2ggbnVtYmVyIG9mIGJ5dGVzIHRvIHBhZCAqLwotCQkgICAgICBleHRyYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIH07Ci0KLQkJICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JCSAgICB7Ci0JCSAgICBjYXNlIGllZWVfZnVuY3Rpb25fc2lnbmVkX2Nsb3NlX2JfZW51bToKLQkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGllZWVfZnVuY3Rpb25fdW5zaWduZWRfY2xvc2VfYl9lbnVtOgotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtOgotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qIEJ1aWxkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgdGhpcyB0eXBlICovCi0JCSAgLyogSWYgcGMgcmVsIHRoZW4gc3RpY2sgLXZlIHBjIGludG8gaW5zdHJ1Y3Rpb24KLQkJICAgICBhbmQgdGFrZSBvdXQgb2YgcmVsb2MgLi4KLQotCQkgICAgIEkndmUgY2hhbmdlZCB0aGlzLiBJdCdzIGFsbCB0b28gY29tcGxpY2F0ZWQuIEkKLQkJICAgICBrZWVwIDAgaW4gdGhlIGluc3RydWN0aW9uIG5vdy4gICovCi0KLQkJICBzd2l0Y2ggKGV4dHJhKQotCQkgICAgewotCQkgICAgY2FzZSAwOgotCQkgICAgY2FzZSA0OgotCi0JCSAgICAgIGlmIChwY3JlbCA9PSB0cnVlKQotCQkJewotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0JCQkgIGJmZF9wdXRfMzIgKGllZWUtPmguYWJmZCwgLWN1cnJlbnRfbWFwLT5wYywgbG9jYXRpb25fcHRyICsKLQkJCQkgICAgICBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMzJfaG93dG87Ci0JCQkgIHItPnJlbGVudC5hZGRlbmQgLT0KLQkJCSAgICBjdXJyZW50X21hcC0+cGM7Ci0jZWxzZQotCQkJICBiZmRfcHV0XzMyIChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArCi0JCQkJICAgICAgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDMyX2hvd3RvOwotI2VuZGlmCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYmZkX3B1dF8zMiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKwotCQkJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZhYnMzMl9ob3d0bzsKLQkJCX0KLQkJICAgICAgY3VycmVudF9tYXAtPnBjICs9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAyOgotCQkgICAgICBpZiAocGNyZWwgPT0gdHJ1ZSkKLQkJCXsKLSNpZiBLRUVQTUlOVVNQQ0lOSU5TVAotCQkJICBiZmRfcHV0XzE2IChpZWVlLT5oLmFiZmQsIChpbnQpICgtY3VycmVudF9tYXAtPnBjKSwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50LmFkZGVuZCAtPSBjdXJyZW50X21hcC0+cGM7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwxNl9ob3d0bzsKLSNlbHNlCi0KLQkJCSAgYmZkX3B1dF8xNiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMTZfaG93dG87Ci0jZW5kaWYKLQkJCX0KLQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9wdXRfMTYgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmFiczE2X2hvd3RvOwotCQkJfQotCQkgICAgICBjdXJyZW50X21hcC0+cGMgKz0gMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIGlmIChwY3JlbCA9PSB0cnVlKQotCQkJewotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAoaW50KSAoLWN1cnJlbnRfbWFwLT5wYyksIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5hZGRlbmQgLT0gY3VycmVudF9tYXAtPnBjOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsOF9ob3d0bzsKLSNlbHNlCi0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsOF9ob3d0bzsKLSNlbmRpZgotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmYWJzOF9ob3d0bzsKLQkJCX0KLQkJICAgICAgY3VycmVudF9tYXAtPnBjICs9IDE7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCXsKLQkJICBiZmRfdm1hIHRoaXNfc2l6ZTsKLQkJICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdGhpc19zaXplKSA9PSB0cnVlKQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkJICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXNfc2l6ZTsgaSsrKQotCQkJewotCQkJICBsb2NhdGlvbl9wdHJbY3VycmVudF9tYXAtPnBjKytdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvb3AgPSBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIH0KLQotCSAgICAvKiBQcmV2ZW50IG1vcmUgdGhhbiB0aGUgZmlyc3QgbG9hZC1pdGVtIG9mIGFuIExSIHJlY29yZAotCSAgICAgICBmcm9tIGJlaW5nIHJlcGVhdGVkIChNUkkgY29udmVudGlvbikuICovCi0JICAgIGlmIChpdGVyYXRpb25zICE9IDEpCi0JICAgICAgbG9vcCA9IGZhbHNlOwotCSAgfQotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgaW4gYWxsIHRoZSBzZWN0aW9uIGRhdGEgYW5kIHJlbG9jYXRpb24gc3R1ZmYgdG9vICovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uX3B0ciA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX251bWJlcjsKLQotICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKmN1cnJlbnRfbWFwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBOVUxMOwotICBhc2VjdGlvbiAqczsKLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgYXJlYSAqLwotICBpZiAoaWVlZS0+cmVhZF9kYXRhID09IHRydWUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGllZWUtPnJlYWRfZGF0YSA9IHRydWU7Ci0gIGllZWVfc2VlayAoYWJmZCwgaWVlZS0+dy5yLmRhdGFfcGFydCk7Ci0KLSAgLyogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhbGwgdGhlIHNlY3Rpb24gY29udGVudHMgKi8KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpwZXIgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHMtPnVzZWRfYnlfYmZkOwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0JY29udGludWU7Ci0gICAgICBwZXItPmRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoIXBlci0+ZGF0YSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKlNVUFBSRVNTIDY4Ki8KLSAgICAgIHBlci0+cmVsb2NfdGFpbF9wdHIgPQotCShpZWVlX3JlbG9jX3R5cGUgKiopICYgKHMtPnJlbG9jYXRpb24pOwotICAgIH0KLQotICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JewotCSAgLyogSUYgd2Ugc2VlIGFueXRoaW5nIHN0cmFuZ2UgdGhlbiBxdWl0ICovCi0JZGVmYXVsdDoKLQkgIHJldHVybiB0cnVlOwotCi0JY2FzZSBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bToKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBzZWN0aW9uX251bWJlciA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgIHMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlW3NlY3Rpb25fbnVtYmVyXTsKLQkgIHMtPmZsYWdzIHw9IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLQkgIGN1cnJlbnRfbWFwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzLT51c2VkX2J5X2JmZDsKLQkgIGxvY2F0aW9uX3B0ciA9IGN1cnJlbnRfbWFwLT5kYXRhIC0gcy0+dm1hOwotCSAgLyogVGhlIGRvY3VtZW50IEkgaGF2ZSBzYXlzIHRoYXQgTWljcm90ZWMncyBjb21waWxlcnMgcmVzZXQgKi8KLQkgIC8qIHRoaXMgYWZ0ZXIgYSBzZWMgc2VjdGlvbiwgZXZlbiB0aG91Z2ggdGhlIHN0YW5kYXJkIHNheXMgbm90ICovCi0JICAvKiB0by4gU08gLi4gKi8KLQkgIGN1cnJlbnRfbWFwLT5wYyA9IHMtPnZtYTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bToKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JICAgIHsKLQkgICAgY2FzZSBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gJiAweGZmOgotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWx1ZTsKLQkJaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci0JCXVuc2lnbmVkIGludCBleHRyYTsKLQkJYm9vbGVhbiBwY3JlbDsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwkvKiBUaG93IGF3YXkgc2VjdGlvbiAjKi8KLQkJcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwgJnZhbHVlLAotCQkJCSAgJnN5bWJvbCwKLQkJCQkgICZwY3JlbCwgJmV4dHJhLAotCQkJCSAgMCk7Ci0JCWN1cnJlbnRfbWFwLT5wYyA9IHZhbHVlOwotCQlCRkRfQVNTRVJUICgodW5zaWduZWQpICh2YWx1ZSAtIHMtPnZtYSkgPD0gcy0+X3Jhd19zaXplKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSAmIDB4ZmY6Ci0JICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAgIC8qIFdlJ3ZlIGdvdCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIG5vdyAtICovCi0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgQkZEX0ZBSUwgKCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfcmVwZWF0X2RhdGFfZW51bToKLQkgIHsKLQkgICAgLyogUmVwZWF0IHRoZSBmb2xsb3dpbmcgTEQgb3IgTFIgbiB0aW1lcyAtIHdlIGRvIHRoaXMgYnkKLQkJIHJlbWVtYmVyaW5nIHRoZSBzdHJlYW0gcG9pbnRlciBiZWZvcmUgcnVubmluZyBpdCBhbmQKLQkJIHJlc2V0dGluZyBpdCBhbmQgcnVubmluZyBpdCBuIHRpbWVzLiBXZSBzcGVjaWFsIGNhc2UKLQkJIHRoZSByZXBldGl0aW9uIG9mIGEgcmVwZWF0X2RhdGEvbG9hZF9jb25zdGFudAotCQkgKi8KLQotCSAgICB1bnNpZ25lZCBpbnQgaXRlcmF0aW9uczsKLQkgICAgdW5zaWduZWQgY2hhciAqc3RhcnQ7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIGl0ZXJhdGlvbnMgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHN0YXJ0ID0gaWVlZS0+aC5pbnB1dF9wOwotCSAgICBpZiAoc3RhcnRbMF0gPT0gKGludCkgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0gJiYKLQkJc3RhcnRbMV0gPT0gMSkKLQkgICAgICB7Ci0JCXdoaWxlIChpdGVyYXRpb25zICE9IDApCi0JCSAgewotCQkgICAgbG9jYXRpb25fcHRyW2N1cnJlbnRfbWFwLT5wYysrXSA9IHN0YXJ0WzJdOwotCQkgICAgaXRlcmF0aW9ucy0tOwotCQkgIH0KLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXdoaWxlIChpdGVyYXRpb25zICE9IDApCi0JCSAgewotCQkgICAgaWVlZS0+aC5pbnB1dF9wID0gc3RhcnQ7Ci0JCSAgICBpZiAoIWRvX29uZSAoaWVlZSwgY3VycmVudF9tYXAsIGxvY2F0aW9uX3B0ciwgcywKLQkJCQkgaXRlcmF0aW9ucykpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGl0ZXJhdGlvbnMtLTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bToKLQljYXNlIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bToKLQkgIHsKLQkgICAgaWYgKCFkb19vbmUgKGllZWUsIGN1cnJlbnRfbWFwLCBsb2NhdGlvbl9wdHIsIHMsIDEpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotfQotCi1ib29sZWFuCi1pZWVlX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIG5ld3NlY3QtPnVzZWRfYnlfYmZkID0gKFBUUikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaWVlZV9wZXJfc2VjdGlvbl90eXBlKSk7Ci0gIGlmICghbmV3c2VjdC0+dXNlZF9ieV9iZmQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZWVlX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBpZWVlX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+c2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIHJldHVybiB0cnVlOwotfQotCi1sb25nCi1pZWVlX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHJldHVybiAwOwotICBpZiAoISBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZDsKLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sCi0JCQkJCSAgICAgIG9mZnNldCwgY291bnQpOwotICBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCk7Ci0gICh2b2lkKSBtZW1jcHkgKChQVFIpIGxvY2F0aW9uLCAoUFRSKSAocC0+ZGF0YSArIG9mZnNldCksICh1bnNpZ25lZCkgY291bnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotaWVlZV9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotLyogIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7Ki8KLSAgaWVlZV9yZWxvY190eXBlICpzcmMgPSAoaWVlZV9yZWxvY190eXBlICopIChzZWN0aW9uLT5yZWxvY2F0aW9uKTsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChzcmMgIT0gKGllZWVfcmVsb2NfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdvcmsgb3V0IHdoaWNoIHN5bWJvbCB0byBhdHRhY2ggaXQgdGhpcyByZWxvYyB0byAqLwotICAgICAgc3dpdGNoIChzcmMtPnN5bWJvbC5sZXR0ZXIpCi0JewotCWNhc2UgJ0knOgotCSAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICBzeW1ib2xzICsgc3JjLT5zeW1ib2wuaW5kZXggKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfYmFzZV9vZmZzZXQ7Ci0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgc3ltYm9scyArIHNyYy0+c3ltYm9sLmluZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgaWYgKHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyICE9IE5VTEwpCi0JICAgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0clswXS0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCi0JICBCRkRfRkFJTCAoKTsKLQl9Ci0gICAgICAqcmVscHRyKysgPSAmc3JjLT5yZWxlbnQ7Ci0gICAgICBzcmMgPSBzcmMtPm5leHQ7Ci0gICAgfQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi1zdGF0aWMgaW50Ci1jb21wIChhcCwgYnApCi0gICAgIENPTlNUIFBUUiBhcDsKLSAgICAgQ09OU1QgUFRSIGJwOwotewotICBhcmVsZW50ICphID0gKigoYXJlbGVudCAqKikgYXApOwotICBhcmVsZW50ICpiID0gKigoYXJlbGVudCAqKikgYnApOwotICByZXR1cm4gYS0+YWRkcmVzcyAtIGItPmFkZHJlc3M7Ci19Ci0KLS8qIFdyaXRlIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBhc2VjdGlvbiAqczsKLSAgaWVlZS0+dy5yLnNlY3Rpb25fcGFydCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAocykKLQkgICYmIChzLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpID09IDApCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGltYWdlIGlzIGV4ZWN1dGFibGUsIHNvIG91dHB1dCBhYnNvbHV0ZSBzZWN0aW9ucyAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9BX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfU19lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfQ19lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocy0+ZmxhZ3MgJiAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00pKQotCSAgICB7Ci0JICAgIGNhc2UgU0VDX0NPREUgfCBTRUNfTE9BRDoKLQkgICAgY2FzZSBTRUNfQ09ERToKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfUF9lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNFQ19EQVRBOgotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9EX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0VDX1JPTToKLQkgICAgY2FzZSBTRUNfUk9NIHwgU0VDX0RBVEE6Ci0JICAgIGNhc2UgU0VDX1JPTSB8IFNFQ19MT0FEOgotCSAgICBjYXNlIFNFQ19ST00gfCBTRUNfREFUQSB8IFNFQ19MT0FEOgotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9SX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCi0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCBzLT5uYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotI2lmIDAKLQkgIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKTsJLyogUGFyZW50ICovCi0JICBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCk7CS8qIEJyb3RoZXIgKi8KLQkgIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKTsJLyogQ29udGV4dCAqLwotI2VuZGlmCi0JICAvKiBBbGlnbm1lbnQgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDEgPDwgcy0+YWxpZ25tZW50X3Bvd2VyKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTaXplICovCi0JICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9zZWN0aW9uX3NpemVfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0JICAgIHsKLQkgICAgICAvKiBSZWxvY2F0ZWFibGUgc2VjdGlvbnMgZG9uJ3QgaGF2ZSBhc2wgcmVjb3JkcyAqLwotCSAgICAgIC8qIFZtYSAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3NlY3Rpb25fYmFzZV9hZGRyZXNzX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJCSgoYmZkX2J5dGUpCi0JCQkJCSAocy0+aW5kZXgKLQkJCQkJICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPmxtYSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWRvX3dpdGhfcmVsb2NzIChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcyA9Ci0gICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkgLyBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IHJlbG9jc190b19nbyA9IHMtPnJlbG9jX2NvdW50OwotICBiZmRfYnl0ZSAqc3RyZWFtID0gaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGE7Ci0gIGFyZWxlbnQgKipwID0gcy0+b3JlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgY3VycmVudF9ieXRlX2luZGV4ID0gMDsKLQotICBxc29ydCAocy0+b3JlbG9jYXRpb24sCi0JIHJlbG9jc190b19nbywKLQkgc2l6ZW9mIChhcmVsZW50ICoqKSwKLQkgY29tcCk7Ci0KLSAgLyogT3V0cHV0IHRoZSBzZWN0aW9uIHByZWhlYWRlciAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfc2VjdGlvbl9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDAgJiYgcmVsb2NzX3RvX2dvID09IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPmxtYSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgMCwgcy0+c3ltYm9sLCAwLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChyZWxvY3NfdG9fZ28gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jYXRpb25zIHRoZW4gb3V0cHV0IHRoZSBsb2FkIGNvbnN0YW50Ci0JIGJ5dGUgb3Bjb2RlIHJhdGhlciB0aGFuIHRoZSBsb2FkIHdpdGggcmVsb2NhdGlvbiBvcGNvZGUgKi8KLQotICAgICAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9yYXdfc2l6ZSkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHJ1bjsKLQkgIHVuc2lnbmVkIGludCBNQVhSVU4gPSAxMjc7Ci0JICBydW4gPSBNQVhSVU47Ci0JICBpZiAocnVuID4gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4KQotCSAgICB7Ci0JICAgICAgcnVuID0gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4OwotCSAgICB9Ci0KLQkgIGlmIChydW4gIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT3V0cHV0IGEgc3RyZWFtIG9mIGJ5dGVzICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJ1bikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KSwKLQkJCSAgICAgMSwKLQkJCSAgICAgcnVuLAotCQkJICAgICBhYmZkKQotCQkgICE9IHJ1bikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSBydW47Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW0pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogT3V0cHV0IHRoZSBkYXRhIHN0cmVhbSBhcyB0aGUgbG9uZ2VzdCBzZXF1ZW5jZSBvZiBieXRlcwotCSBwb3NzaWJsZSwgYWxsb3dpbmcgZm9yIHRoZSBhIHJlYXNvbmFibGUgcGFja2V0IHNpemUgYW5kCi0JIHJlbG9jYXRpb24gc3R1ZmZzLiAgKi8KLQotICAgICAgaWYgKChQVFIpIHN0cmVhbSA9PSAoUFRSKSBOVUxMKQotCXsKLQkgIC8qIE91dHB1dHRpbmcgYSBzZWN0aW9uIHdpdGhvdXQgZGF0YSwgZmlsbCBpdCB1cCAqLwotCSAgc3RyZWFtID0gKHVuc2lnbmVkIGNoYXIgKikgKGJmZF9hbGxvYyAoYWJmZCwgcy0+X3Jhd19zaXplKSk7Ci0JICBpZiAoIXN0cmVhbSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbWVtc2V0ICgoUFRSKSBzdHJlYW0sIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0JfQotICAgICAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9yYXdfc2l6ZSkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHJ1bjsKLQkgIHVuc2lnbmVkIGludCBNQVhSVU4gPSAxMjc7Ci0JICBpZiAocmVsb2NzX3RvX2dvKQotCSAgICB7Ci0JICAgICAgcnVuID0gKCpwKS0+YWRkcmVzcyAtIGN1cnJlbnRfYnl0ZV9pbmRleDsKLQkgICAgICBpZiAocnVuID4gTUFYUlVOKQotCQlydW4gPSBNQVhSVU47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJ1biA9IE1BWFJVTjsKLQkgICAgfQotCSAgaWYgKHJ1biA+IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkgICAgewotCSAgICAgIHJ1biA9IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleDsKLQkgICAgfQotCi0JICBpZiAocnVuICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBPdXRwdXQgYSBzdHJlYW0gb2YgYnl0ZXMgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcnVuKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpLAotCQkJICAgICAxLAotCQkJICAgICBydW4sCi0JCQkgICAgIGFiZmQpCi0JCSAgIT0gcnVuKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IHJ1bjsKLQkgICAgfQotCSAgLyogT3V0cHV0IGFueSByZWxvY2F0aW9ucyBoZXJlICovCi0JICBpZiAocmVsb2NzX3RvX2dvICYmICgqcCkgJiYgKCpwKS0+YWRkcmVzcyA9PSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JICAgIHsKLQkgICAgICB3aGlsZSAocmVsb2NzX3RvX2dvCi0JCSAgICAgJiYgKCpwKSAmJiAoKnApLT5hZGRyZXNzID09IGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkJewotCQkgIGFyZWxlbnQgKnIgPSAqcDsKLQkJICBiZmRfc2lnbmVkX3ZtYSBvdjsKLQotI2lmIDAKLQkJICBpZiAoci0+aG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgewotCQkgICAgICByLT5hZGRlbmQgKz0gY3VycmVudF9ieXRlX2luZGV4OwotCQkgICAgfQotI2VuZGlmCi0KLQkJICBzd2l0Y2ggKHItPmhvd3RvLT5zaXplKQotCQkgICAgewotCQkgICAgY2FzZSAyOgotCi0JCSAgICAgIG92ID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgIHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCk7Ci0JCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSA0OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgb3YgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwKLQkJCQkJICAgICAgc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KTsKLQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAwOgotCQkgICAgICBvdiA9IGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsCi0JCQkJCSAgICAgc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KTsKLQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4Kys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgb3YgPSAwOwotCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgb3YgJj0gci0+aG93dG8tPnNyY19tYXNrOwotCi0JCSAgaWYgKHItPmhvd3RvLT5wY19yZWxhdGl2ZQotCQkgICAgICAmJiAhIHItPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JCSAgICBvdiArPSByLT5hZGRyZXNzOwotCi0JCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCQkgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0vKgkJICBhYm9ydCgpOyovCi0KLQkJICBpZiAoci0+c3ltX3B0cl9wdHIgIT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgci0+YWRkZW5kICsgb3YsCi0JCQkJCQkgICAqKHItPnN5bV9wdHJfcHRyKSwKLQkJCQkJCSAgIHItPmhvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCQkJCSAgIHMtPmluZGV4KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgci0+YWRkZW5kICsgb3YsCi0JCQkJCQkgICAoYXN5bWJvbCAqKSBOVUxMLAotCQkJCQkJICAgci0+aG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCQkJICAgcy0+aW5kZXgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgaWYgKG51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3MKLQkJICAgICAgIT0gYmZkX2dldF9yZWxvY19zaXplIChyLT5ob3d0bykpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLAotCQkJCQkgICAgYmZkX2dldF9yZWxvY19zaXplIChyLT5ob3d0bykpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJIGllZWVfZnVuY3Rpb25fZWl0aGVyX2Nsb3NlX2JfZW51bSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICByZWxvY3NfdG9fZ28tLTsKLQkJICBwKys7Ci0JCX0KLQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSWYgdGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGVuIHdlIGNhbiBiZQotICAgY2xldmVyIGFib3V0IGhvdyB3ZSB3cml0ZS4gIFdlIGJsb2NrIGl0ZW1zIHVwIGludG8gYSBtYXggb2YgMTI3Ci0gICBieXRlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kb19hc19yZXBlYXQgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGlmIChzLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCSAgICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtID4+IDgpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtICYgMHhmZikKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCSAgICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5sbWEpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9yZXBlYXRfZGF0YV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+X3Jhd19zaXplKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDEpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWRvX3dpdGhvdXRfcmVsb2NzIChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBiZmRfYnl0ZSAqc3RyZWFtID0gaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGE7Ci0KLSAgaWYgKHN0cmVhbSA9PSAwIHx8ICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkpCi0gICAgewotICAgICAgaWYgKCEgZG9fYXNfcmVwZWF0IChhYmZkLCBzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+X3Jhd19zaXplOyBpKyspCi0JewotCSAgaWYgKHN0cmVhbVtpXSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoISBkb19hc19yZXBlYXQgKGFiZmQsIHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHJfc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0cjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyX2VuZDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnB1dF9wdHJfc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5wdXRfcHRyOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlucHV0X3B0cl9lbmQ7Ci1zdGF0aWMgYmZkICppbnB1dF9iZmQ7Ci1zdGF0aWMgYmZkICpvdXRwdXRfYmZkOwotc3RhdGljIGludCBvdXRwdXRfYnVmZmVyOwotCi1zdGF0aWMgdm9pZAotZmlsbCAoKQotewotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgaW5wdXRfcHRyX3N0YXJ0LCAxLCBpbnB1dF9wdHJfZW5kIC0gaW5wdXRfcHRyX3N0YXJ0LCBpbnB1dF9iZmQpOwotICBpbnB1dF9wdHIgPSBpbnB1dF9wdHJfc3RhcnQ7Ci19Ci1zdGF0aWMgdm9pZAotZmx1c2ggKCkKLXsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgKG91dHB1dF9wdHJfc3RhcnQpLCAxLCBvdXRwdXRfcHRyIC0gb3V0cHV0X3B0cl9zdGFydCwKLQkJIG91dHB1dF9iZmQpCi0gICAgICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHB1dF9wdHIgLSBvdXRwdXRfcHRyX3N0YXJ0KSkKLSAgICBhYm9ydCAoKTsKLSAgb3V0cHV0X3B0ciA9IG91dHB1dF9wdHJfc3RhcnQ7Ci0gIG91dHB1dF9idWZmZXIrKzsKLX0KLQotI2RlZmluZSBUSElTKCkgKCAqaW5wdXRfcHRyICkKLSNkZWZpbmUgTkVYVCgpIHsgaW5wdXRfcHRyKys7IGlmIChpbnB1dF9wdHIgPT0gaW5wdXRfcHRyX2VuZCkgZmlsbCgpOyB9Ci0jZGVmaW5lIE9VVCh4KSB7ICpvdXRwdXRfcHRyKysgPSAoeCk7IGlmKG91dHB1dF9wdHIgPT0gb3V0cHV0X3B0cl9lbmQpICBmbHVzaCgpOyB9Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9pbnQgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEyNykKLSAgICB7Ci0gICAgICBPVVQgKHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotICAgICAgLyogSG93IG1hbnkgc2lnbmlmaWNhbnQgYnl0ZXMgPyAqLwotICAgICAgLyogRklYTUUgRk9SIExPTkdFUiBJTlRTICovCi0gICAgICBpZiAodmFsdWUgJiAweGZmMDAwMDAwKQotCXsKLQkgIGxlbmd0aCA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwZmYwMDAwKQotCXsKLQkgIGxlbmd0aCA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwMDBmZjAwKQotCXsKLQkgIGxlbmd0aCA9IDI7Ci0JfQotICAgICAgZWxzZQotCWxlbmd0aCA9IDE7Ci0KLSAgICAgIE9VVCAoKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gKyBsZW5ndGgpOwotICAgICAgc3dpdGNoIChsZW5ndGgpCi0JewotCWNhc2UgNDoKLQkgIE9VVCAodmFsdWUgPj4gMjQpOwotCWNhc2UgMzoKLQkgIE9VVCAodmFsdWUgPj4gMTYpOwotCWNhc2UgMjoKLQkgIE9VVCAodmFsdWUgPj4gOCk7Ci0JY2FzZSAxOgotCSAgT1VUICh2YWx1ZSk7Ci0JfQotCi0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY29weV9pZCAoKQotewotICBpbnQgbGVuZ3RoID0gVEhJUyAoKTsKLSAgY2hhciBjaDsKLSAgT1VUIChsZW5ndGgpOwotICBORVhUICgpOwotICB3aGlsZSAobGVuZ3RoLS0pCi0gICAgewotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgT1VUIChjaCk7Ci0gICAgICBORVhUICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBWQVIoeCkgKCh4IHwgMHg4MCkpCi1zdGF0aWMgdm9pZAotY29weV9leHByZXNzaW9uICgpCi17Ci0gIGludCBzdGFja1sxMF07Ci0gIGludCAqdG9zID0gc3RhY2s7Ci0gIGludCB2YWx1ZSA9IDA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHN3aXRjaCAoVEhJUyAoKSkKLQl7Ci0JY2FzZSAweDg0OgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MzoKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MjoKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgxOgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MDoKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSAwOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmIChUSElTICgpID4gMHg4NCkKLQkgICAgewotCSAgICAgIC8qIE5vdCBhIG51bWJlciwganVzdCBidWcgb3V0IHdpdGggdGhlIGFuc3dlciAqLwotCSAgICAgIHdyaXRlX2ludCAoKigtLXRvcykpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgKnRvcysrID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIDB4YTU6Ci0JICAvKiBQTFVTIGFueXRoaW5nICovCi0JICB7Ci0JICAgIGludCB2YWx1ZSA9ICooLS10b3MpOwotCSAgICB2YWx1ZSArPSAqKC0tdG9zKTsKLQkgICAgKnRvcysrID0gdmFsdWU7Ci0JICAgIE5FWFQgKCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIFZBUiAoJ1InKToKLQkgIHsKLQkgICAgaW50IHNlY3Rpb25fbnVtYmVyOwotCSAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLQkgICAgYXNlY3Rpb24gKnM7Ci0JICAgIE5FWFQgKCk7Ci0JICAgIHNlY3Rpb25fbnVtYmVyID0gVEhJUyAoKTsKLQotCSAgICBORVhUICgpOwotCSAgICBpZWVlID0gSUVFRV9EQVRBIChpbnB1dF9iZmQpOwotCSAgICBzID0gaWVlZS0+c2VjdGlvbl90YWJsZVtzZWN0aW9uX251bWJlcl07Ci0JICAgIGlmIChzLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgICB7Ci0JCXZhbHVlID0gcy0+b3V0cHV0X3NlY3Rpb24tPmxtYTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXZhbHVlID0gMDsKLQkgICAgICB9Ci0JICAgIHZhbHVlICs9IHMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgICp0b3MrKyA9IHZhbHVlOwotCSAgICB2YWx1ZSA9IDA7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4OTA6Ci0JICB7Ci0JICAgIE5FWFQgKCk7Ci0JICAgIHdyaXRlX2ludCAoKigtLXRvcykpOwotCSAgICBPVVQgKDB4OTApOwotCSAgICByZXR1cm47Ci0KLQkgIH0KLQl9Ci0gICAgfQotCi19Ci0KLS8qIERyb3AgdGhlIGludCBpbiB0aGUgYnVmZmVyLCBhbmQgY29weSBhIG51bGwgaW50byB0aGUgZ2FwLCB3aGljaCB3ZQotICAgd2lsbCBvdmVyd3JpdGUgbGF0ZXIgKi8KLQotc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnB0cnA7Ci0gIGludCBidWZmZXI7Ci19OwotCi1zdGF0aWMgdm9pZAotZmlsbF9pbnQgKGJ1ZikKLSAgICAgc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0ICpidWY7Ci17Ci0gIGlmIChidWYtPmJ1ZmZlciA9PSBvdXRwdXRfYnVmZmVyKQotICAgIHsKLSAgICAgIC8qIFN0aWxsIGEgY2hhbmNlIHRvIG91dHB1dCB0aGUgc2l6ZSAqLwotICAgICAgaW50IHZhbHVlID0gb3V0cHV0X3B0ciAtIGJ1Zi0+cHRycCArIDM7Ci0gICAgICBidWYtPnB0cnBbMF0gPSB2YWx1ZSA+PiAyNDsKLSAgICAgIGJ1Zi0+cHRycFsxXSA9IHZhbHVlID4+IDE2OwotICAgICAgYnVmLT5wdHJwWzJdID0gdmFsdWUgPj4gODsKLSAgICAgIGJ1Zi0+cHRycFszXSA9IHZhbHVlID4+IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZHJvcF9pbnQgKGJ1ZikKLSAgICAgc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0ICpidWY7Ci17Ci0gIGludCB0eXBlID0gVEhJUyAoKTsKLSAgaW50IGNoOwotICBpZiAodHlwZSA8PSAweDg0KQotICAgIHsKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMHg4NDoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgzOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODI6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MToKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgwOgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgT1VUICgweDg0KTsKLSAgYnVmLT5wdHJwID0gb3V0cHV0X3B0cjsKLSAgYnVmLT5idWZmZXIgPSBvdXRwdXRfYnVmZmVyOwotICBPVVQgKDApOwotICBPVVQgKDApOwotICBPVVQgKDApOwotICBPVVQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotY29weV9pbnQgKCkKLXsKLSAgaW50IHR5cGUgPSBUSElTICgpOwotICBpbnQgY2g7Ci0gIGlmICh0eXBlIDw9IDB4ODQpCi0gICAgewotICAgICAgT1VUICh0eXBlKTsKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMHg4NDoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODM6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgT1VUIChjaCk7Ci0JY2FzZSAweDgyOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MToKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODA6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0jZGVmaW5lIElEIGNvcHlfaWQoKQotI2RlZmluZSBJTlQgY29weV9pbnQoKQotI2RlZmluZSBFWFAgY29weV9leHByZXNzaW9uKCkKLXN0YXRpYyB2b2lkIGNvcHlfdGlsbF9lbmQgKCk7Ci0jZGVmaW5lIElOVG4ocSkgY29weV9pbnQoKQotI2RlZmluZSBFWFBuKHEpIGNvcHlfZXhwcmVzc2lvbigpCi0KLXN0YXRpYyB2b2lkCi1mMV9yZWNvcmQgKCkKLXsKLSAgaW50IGNoOwotICAvKiBBVE4gcmVjb3JkICovCi0gIE5FWFQgKCk7Ci0gIGNoID0gVEhJUyAoKTsKLSAgc3dpdGNoIChjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKGNoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjOToKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGM5KTsKLSAgICAgIElOVDsKLSAgICAgIElOVDsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHgxNjoKLQkgIE5FWFQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4MDE6Ci0JICBORVhUICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAwOgotCSAgTkVYVCAoKTsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMzoKLQkgIE5FWFQgKCk7Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4MTM6Ci0JICBFWFBuIChpbnN0cnVjdGlvbiBhZGRyZXNzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ZDg6Ci0gICAgICAvKiBFWHRlcm5hbCByZWYgKi8KLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGQ4KTsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjZToKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGNlKTsKLSAgICAgIElOVDsKLSAgICAgIElOVDsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIElOVDsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHgwMToKLQkgIElOVDsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMjoKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNDoKLQkgIEVYUG4gKGV4dGVybmFsIGZ1bmN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNToKLQkgIGJyZWFrOwotCWNhc2UgMHgwNzoKLQkgIElOVG4gKGxpbmUgbnVtYmVyKTsKLQkgIElOVDsKLQljYXNlIDB4MDg6Ci0JICBicmVhazsKLQljYXNlIDB4MGE6Ci0JICBJTlRuIChsb2NrZWQgcmVnaXN0ZXIpOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDNmOgotCSAgY29weV90aWxsX2VuZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgzZToKLQkgIGNvcHlfdGlsbF9lbmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4NDA6Ci0JICBjb3B5X3RpbGxfZW5kICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDQxOgotCSAgSUQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1mMF9yZWNvcmQgKCkKLXsKLSAgLyogQXR0cmlidXRlIHJlY29yZCAqLwotICBORVhUICgpOwotICBPVVQgKDB4ZjApOwotICBJTlRuIChTeW1ib2wgbmFtZSk7Ci0gIElEOwotfQotCi1zdGF0aWMgdm9pZAotY29weV90aWxsX2VuZCAoKQotewotICBpbnQgY2ggPSBUSElTICgpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoY2ggPD0gMHg4MCkKLQl7Ci0JICBPVVQgKGNoKTsKLQkgIE5FWFQgKCk7Ci0JICBjaCA9IFRISVMgKCk7Ci0JfQotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweDg0OgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgzOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgyOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgxOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQotCSAgY2ggPSBUSElTICgpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1mMl9yZWNvcmQgKCkKLXsKLSAgTkVYVCAoKTsKLSAgT1VUICgweGYyKTsKLSAgSU5UOwotICBORVhUICgpOwotICBPVVQgKDB4Y2UpOwotICBJTlQ7Ci0gIGNvcHlfdGlsbF9lbmQgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYmxvY2sgKCk7Ci1zdGF0aWMgdm9pZAotZjhfcmVjb3JkICgpCi17Ci0gIGludCBjaDsKLSAgTkVYVCAoKTsKLSAgY2ggPSBUSElTICgpOwotICBzd2l0Y2ggKGNoKQotICAgIHsKLSAgICBjYXNlIDB4MDE6Ci0gICAgY2FzZSAweDAyOgotICAgIGNhc2UgMHgwMzoKLSAgICAgIC8qIFVuaXF1ZSB0eXBlZGVmcyBmb3IgbW9kdWxlICovCi0gICAgICAvKiBHTG9iYWwgdHlwZWRlZnMgICovCi0gICAgICAvKiBIaWdoIGxldmVsIG1vZHVsZSBzY29wZSBiZWdpbm5pbmcgKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoY2gpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCi0JYmxvY2sgKCk7Ci0KLQlORVhUICgpOwotCWZpbGxfaW50ICgmb2IpOwotCU9VVCAoMHhmOSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDQ6Ci0gICAgICAvKiBHbG9iYWwgZnVuY3Rpb24gKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNCk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoc3RhY2sgc2l6ZSk7Ci0JSU5UbiAocmV0IHZhbCk7Ci0JRVhQbiAob2Zmc2V0KTsKLQotCWJsb2NrICgpOwotCi0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCUVYUG4gKHNpemUgb2YgYmxvY2spOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MDU6Ci0gICAgICAvKiBGaWxlIG5hbWUgZm9yIHNvdXJjZSBsaW5lIG51bWJlcnMgKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNSk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoeWVhcik7Ci0JSU5UbiAobW9udGgpOwotCUlOVG4gKGRheSk7Ci0JSU5UbiAoaG91cik7Ci0JSU5UbiAobW9udXRlKTsKLQlJTlRuIChzZWNvbmQpOwotCWJsb2NrICgpOwotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDA2OgotICAgICAgLyogTG9jYWwgZnVuY3Rpb24gKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNik7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoc3RhY2sgc2l6ZSk7Ci0JSU5UbiAodHlwZSByZXR1cm4pOwotCUVYUG4gKG9mZnNldCk7Ci0JYmxvY2sgKCk7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCUVYUG4gKHNpemUpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MGE6Ci0gICAgICAvKiBBc3NlbWJsZXIgbW9kdWxlIHNjb3BlIGJlZ2lubmluZyAtKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0KLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDBhKTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJRDsKLQlJTlQ7Ci0JSUQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0KLQlibG9jayAoKTsKLQotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwYjoKLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwYik7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UOwotCUlOVG4gKHNlY3Rpb24gaW5kZXgpOwotCUVYUG4gKG9mZnNldCk7Ci0JSU5UbiAoc3R1ZmYpOwotCi0JYmxvY2sgKCk7Ci0KLQlPVVQgKDB4ZjkpOwotCU5FWFQgKCk7Ci0JRVhQbiAoU2l6ZSBpbiBNYXVzKTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWUyX3JlY29yZCAoKQotewotICBPVVQgKDB4ZTIpOwotICBORVhUICgpOwotICBPVVQgKDB4Y2UpOwotICBORVhUICgpOwotICBJTlQ7Ci0gIEVYUDsKLX0KLQotc3RhdGljIHZvaWQKLWJsb2NrICgpCi17Ci0gIGludCBjaDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweGUxOgotCWNhc2UgMHhlNToKLQkgIHJldHVybjsKLQljYXNlIDB4Zjk6Ci0JICByZXR1cm47Ci0JY2FzZSAweGYwOgotCSAgZjBfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYxOgotCSAgZjFfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYyOgotCSAgZjJfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGY4OgotCSAgZjhfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgZTJfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0KLQl9Ci0gICAgfQotfQotCi0KLQotLyogcmVsb2NhdGVfZGVidWcsCi0gICBtb3ZlcyBhbGwgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGZyb20gdGhlIHNvdXJjZSBiZmQgdG8gdGhlIG91dHB1dAotICAgYmZkLCBhbmQgcmVsb2NhdGVzIGFueSBleHByZXNzaW9ucyBpdCBmaW5kcwotKi8KLQotc3RhdGljIHZvaWQKLXJlbG9jYXRlX2RlYnVnIChvdXRwdXQsIGlucHV0KQotICAgICBiZmQgKm91dHB1dDsKLSAgICAgYmZkICppbnB1dDsKLXsKLSNkZWZpbmUgSUJTIDQwMAotI2RlZmluZSBPQlMgNDAwCi0gIHVuc2lnbmVkIGNoYXIgaW5wdXRfYnVmZmVyW0lCU107Ci0KLSAgaW5wdXRfcHRyX3N0YXJ0ID0gaW5wdXRfcHRyID0gaW5wdXRfYnVmZmVyOwotICBpbnB1dF9wdHJfZW5kID0gaW5wdXRfYnVmZmVyICsgSUJTOwotICBpbnB1dF9iZmQgPSBpbnB1dDsKLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGlucHV0X3B0cl9zdGFydCwgMSwgSUJTLCBpbnB1dCk7Ci0gIGJsb2NrICgpOwotfQotCi0vKgotICBEdXJpbmcgbGlua2luZywgd2Ugd2UgdG9sZCBhYm91dCB0aGUgYmZkcyB3aGljaCBtYWRlIHVwIG91cgotICBjb250ZW50cywgd2UgaGF2ZSBhIGxpc3Qgb2YgdGhlbS4gVGhleSB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIGdvIHRvCi0gIHRoZSBkZWJ1ZyBpbmZvIGluIGVhY2gsIGFuZCBjb3B5IGl0IG91dCwgcmVsb2NhdGluZyBpdCBhcyB3ZSBnby4KLSovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2RlYnVnX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBiZmRfY2hhaW5fdHlwZSAqY2hhaW4gPSBpZWVlLT5jaGFpbl9yb290OwotICB1bnNpZ25lZCBjaGFyIG91dHB1dF9idWZmZXJbT0JTXTsKLSAgYm9vbGVhbiBzb21lX2RlYnVnID0gZmFsc2U7Ci0gIGZpbGVfcHRyIGhlcmUgPSBiZmRfdGVsbCAoYWJmZCk7Ci0KLSAgb3V0cHV0X3B0cl9zdGFydCA9IG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmZmVyOwotICBvdXRwdXRfcHRyX2VuZCA9IG91dHB1dF9idWZmZXIgKyBPQlM7Ci0gIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmZmVyOwotICBvdXRwdXRfYmZkID0gYWJmZDsKLQotICBpZiAoY2hhaW4gPT0gKGJmZF9jaGFpbl90eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gMDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSBoZXJlOwotICAgICAgaWYgKGJmZF93cml0ZSAocy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgYWJmZCkgIT0gcy0+X3Jhd19zaXplKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoY2hhaW4gIT0gKGJmZF9jaGFpbl90eXBlICopIE5VTEwpCi0JewotCSAgYmZkICplbnRyeSA9IGNoYWluLT50aGlzOwotCSAgaWVlZV9kYXRhX3R5cGUgKmVudHJ5X2llZWUgPSBJRUVFX0RBVEEgKGVudHJ5KTsKLQkgIGlmIChlbnRyeV9pZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfc2VlayAoZW50cnksIGVudHJ5X2llZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0LAotCQkJICAgIFNFRUtfU0VUKQotCQkgICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0ZV9kZWJ1ZyAoYWJmZCwgZW50cnkpOwotCSAgICB9Ci0KLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgICAgaWYgKHNvbWVfZGVidWcpCi0JewotCSAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSBoZXJlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IDA7Ci0JfQotCi0gICAgICBmbHVzaCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIHRoZSBkYXRhIGluIGFuIGllZWUgd2F5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZGF0YV9wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGllZWUtPncuci5kYXRhX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIHNlY3Rpb25zIHRoYXQgaGF2ZSBubyBsb2FkYWJsZSBjb250ZW50cyAoLmJzcywKLSAgICAgICAgIGRlYnVnZ2luZywgZXRjLikgICovCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jIHJlY29yZHMgc28gd2UgY2FuIGluc2VydCB0aGVtIGluIHRoZSBjb3JyZWN0Ci0JIHBsYWNlcyAqLwotICAgICAgaWYgKHMtPnJlbG9jX2NvdW50ICE9IDApCi0JewotCSAgaWYgKCEgZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGRvX3dpdGhvdXRfcmVsb2NzIChhYmZkLCBzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWluaXRfZm9yX291dHB1dCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQotCXsKLQkgIGllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhID0gKGJmZF9ieXRlICopIChiZmRfYWxsb2MgKGFiZmQsIHMtPl9yYXdfc2l6ZSkpOwotCSAgaWYgKCFpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIGV4ZWMgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0vKiBzZXQgc2VjdGlvbiBjb250ZW50cyBpcyBjb21wbGljYXRlZCB3aXRoIElFRUUgc2luY2UgdGhlIGZvcm1hdCBpcwotKiBub3QgYSBieXRlIGltYWdlLCBidXQgYSByZWNvcmQgc3RyZWFtLgotKi8KLWJvb2xlYW4KLWllZWVfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPmNvbnRlbnRzID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBldmVyeXRoaW5nCi0gICAgICAgICBpcyB3aXRoaW4gcmFuZ2UuICAqLwotICAgICAgbWVtY3B5IChzZWN0aW9uLT5jb250ZW50cyArIG9mZnNldCwgbG9jYXRpb24sIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaWVlZV9wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCFpbml0X2Zvcl9vdXRwdXQgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbWNweSAoKFBUUikgKGllZWVfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhICsgb2Zmc2V0KSwKLQkgIChQVFIpIGxvY2F0aW9uLAotCSAgKHVuc2lnbmVkIGludCkgY291bnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgdGhlIGV4dGVybmFsIHN5bWJvbHMgb2YgYSBmaWxlLiAgSUVFRSBjb25zaWRlcnMgdHdvIHNvcnRzIG9mCi0gICBleHRlcm5hbCBzeW1ib2xzLCBwdWJsaWMsIGFuZCByZWZlcmVuY2VkLiAgSXQgdXNlcyB0byBpbnRlcm5hbAotICAgZm9ybXMgdG8gaW5kZXggdGhlbSBhcyB3ZWxsLiAgV2hlbiB3ZSB3cml0ZSB0aGVtIG91dCB3ZSB0dXJuIHRoZWlyCi0gICBzeW1ib2wgdmFsdWVzIGludG8gaW5kZXhlcyBmcm9tIHRoZSByaWdodCBiYXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICoqcTsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIHVuc2lnbmVkIGludCByZWZlcmVuY2VfaW5kZXggPSBJRUVFX1JFRkVSRU5DRV9CQVNFOwotICB1bnNpZ25lZCBpbnQgcHVibGljX2luZGV4ID0gSUVFRV9QVUJMSUNfQkFTRSArIDI7Ci0gIGZpbGVfcHRyIGhlcmUgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGJvb2xlYW4gaGFkb25lID0gZmFsc2U7Ci0gIGlmIChhYmZkLT5vdXRzeW1ib2xzICE9IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHsKLQotICAgICAgZm9yIChxID0gYWJmZC0+b3V0c3ltYm9sczsgKnEgIT0gKGFzeW1ib2wgKikgTlVMTDsgcSsrKQotCXsKLQkgIGFzeW1ib2wgKnAgPSAqcTsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtdXN0IGJlIGEgc3ltYm9sIHJlZmVyZW5jZSAuLiAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCByZWZlcmVuY2VfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBwLT5uYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHAtPnZhbHVlID0gcmVmZXJlbmNlX2luZGV4OwotCSAgICAgIHJlZmVyZW5jZV9pbmRleCsrOwotCSAgICAgIGhhZG9uZSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgd2VhayByZWZlcmVuY2UgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcmVmZXJlbmNlX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcC0+bmFtZSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJaWVlZV93ZWFrX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJlZmVyZW5jZV9pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBwLT52YWx1ZSA9IHJlZmVyZW5jZV9pbmRleDsKLQkgICAgICByZWZlcmVuY2VfaW5kZXgrKzsKLQkgICAgICBoYWRvbmUgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIG11c3QgYmUgYSBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIHAtPm5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcHVibGljX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxNSkgLyogaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLwotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxOSkgLyogc3RhdGljIHN5bWJvbCAqLwotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxKSkgLyogb25lIG9mIHRoZW0gKi8KLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSB2YWx1ZSAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCQl7Ci0JCSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotCQkgICAgewotCQkgICAgICAvKiBJZiBmdWxseSBsaW5rZWQsIHRoZW4gb3V0cHV0IGFsbCBzeW1ib2xzCi0JCQkgcmVsb2NhdGVkICovCi0JCSAgICAgIGlmICghIChpZWVlX3dyaXRlX2ludAotCQkJICAgICAoYWJmZCwKLQkJCSAgICAgIChwLT52YWx1ZQotCQkJICAgICAgICsgcC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChpZWVlX3dyaXRlX2V4cHJlc3Npb24KLQkJCSAgICAgKGFiZmQsCi0JCQkgICAgICBwLT52YWx1ZSArIHAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCQkgICAgICBwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+c3ltYm9sLAotCQkJICAgICAgZmFsc2UsIDApKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwKLQkJCQkJICAgICAgIHAtPnZhbHVlLAotCQkJCQkgICAgICAgYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sLAotCQkJCQkgICAgICAgZmFsc2UsIDApKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgcC0+dmFsdWUgPSBwdWJsaWNfaW5kZXg7Ci0JICAgICAgcHVibGljX2luZGV4Kys7Ci0JICAgICAgaGFkb25lID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIC0gd2hlbiB0aGVyZSBhcmUgZ2FwcyBpbiB0aGUgc3ltYm9scyByZWFkICovCi0JICAgICAgLyogZnJvbSBhbiBpbnB1dCBpZWVlIGZpbGUgKi8KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChoYWRvbmUpCi0gICAgaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQgPSBoZXJlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIGV4dGVuW10gPQotewotICAweGYwLCAweDIwLCAweDAwLAotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzNywgMywgMywJLyogU2V0IHZlcnNpb24gMyByZXYgMyAgIAkqLwotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzOSwgMiwvKiBrZWVwIHN5bWJvbCBpbiAgb3JpZ2luYWwgY2FzZSAqLwotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzOAkvKiBzZXQgb2JqZWN0IHR5cGUgcmVsb2NhdGVhYmxlIHRvIHggKi8KLX07Ci0KLXN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIGVudmlbXSA9Ci17Ci0gIDB4ZjAsIDB4MjEsIDB4MDAsCi0KLS8qICAgIDB4ZjEsIDB4Y2UsIDB4MjEsIDAwLCA1MCwgMHg4MiwgMHgwNywgMHhjNywgMHgwOSwgMHgxMSwgMHgxMSwKLSAgICAweDE5LCAweDJjLAotKi8KLSAgMHhmMSwgMHhjZSwgMHgyMSwgMDAsIDUyLCAweDAwLAkvKiBleGVjIG9rICovCi0KLSAgMHhmMSwgMHhjZSwgMHgyMSwgMCwgNTMsIDB4MDMsLyogaG9zdCB1bml4ICovCi0vKiAgICAweGYxLCAweGNlLCAweDIxLCAwLCA1NCwgMiwxLDEJdG9vbCAmIHZlcnNpb24gIyAqLwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfbWVfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGllZWUtPncuci50cmFpbGVyX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIGFiZmQtPnN0YXJ0X2FkZHJlc3MpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZWVlLT53LnIubWVfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbW9kdWxlX2VuZF9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIElFRUUgcHJvY2Vzc29yIElELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfcHJvY2Vzc29yIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaDsKLQotICBhcmNoID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpOwotICBzd2l0Y2ggKGFyY2gtPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCBiZmRfcHJpbnRhYmxlX25hbWUgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICIyOTAwMCIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICJIOC8zMDAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaDg1MDA6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiSDgvNTAwIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0gICAgICBzd2l0Y2ggKGFyY2gtPm1hY2gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwS0EiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBLQiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX21hY2hfaTk2MF9jYToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2MENBIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotCWNhc2UgYmZkX21hY2hfaTk2MF94YToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2ME1DIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgewotCWNvbnN0IGNoYXIgKmlkOwotCi0Jc3dpdGNoIChhcmNoLT5tYWNoKQotCSAgewotCSAgZGVmYXVsdDoJCWlkID0gIjY4MDIwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAwMDogaWQgPSAiNjgwMDAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDA4OiBpZCA9ICI2ODAwOCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6IGlkID0gIjY4MDEwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAyMDogaWQgPSAiNjgwMjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDMwOiBpZCA9ICI2ODAzMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwNDA6IGlkID0gIjY4MDQwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODA2MDogaWQgPSAiNjgwNjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfY3B1MzI6ICBpZCA9ICJjcHUzMiI7IGJyZWFrOwotCSAgfQotCi0JaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgaWQpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1pZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaWxlX3B0ciBvbGQ7Ci0KLSAgLyogRmFzdCBmb3J3YXJkIG92ZXIgdGhlIGhlYWRlciBhcmVhICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9wcm9jZXNzb3IgKGFiZmQpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIGFiZmQtPmZpbGVuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmFzdCBmb3J3YXJkIG92ZXIgdGhlIHZhcmlhYmxlIGJpdHMgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQml0cyBwZXIgTUFVICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAoYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIE1BVSdzIHBlciBhZGRyZXNzICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAoYmZkX2J5dGUpIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKQotCQkJCSAgICAgLyBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvbGQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoOCAqIE5fV19WQVJJQUJMRVMpLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWVlZS0+dy5yLmV4dGVuc2lvbl9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfd3JpdGUgKChjaGFyICopIGV4dGVuLCAxLCBzaXplb2YgKGV4dGVuKSwgYWJmZCkgIT0gc2l6ZW9mIChleHRlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAweDEpKSAvKiBBYnNvbHV0ZSAqLwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDB4MikpIC8qIFJlbG9jYXRlYWJsZSAqLwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWVlZS0+dy5yLmVudmlyb25tZW50YWxfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBlbnZpLCAxLCBzaXplb2YgKGVudmkpLCBhYmZkKSAhPSBzaXplb2YgKGVudmkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgSFAgZW11bGF0b3IgZGF0YWJhc2UgcmVxdWlyZXMgYSB0aW1lc3RhbXAgaW4gdGhlIGZpbGUuICAqLwotICB7Ci0gICAgdGltZV90IG5vdzsKLSAgICBjb25zdCBzdHJ1Y3QgdG0gKnQ7Ci0KLSAgICB0aW1lICgmbm93KTsKLSAgICB0ID0gKHN0cnVjdCB0bSAqKSBsb2NhbHRpbWUgKCZub3cpOwotICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMHgyMSkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMCkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgNTApCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1feWVhciArIDE5MDApCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbW9uICsgMSkKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9tZGF5KQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX2hvdXIpCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbWluKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX3NlYykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBvdXRwdXRfYmZkID0gYWJmZDsKLQotICBmbHVzaCAoKTsKLQotICBpZiAoISBpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBGaXJzdCB3cml0ZSB0aGUgc3ltYm9scy4gIFRoaXMgY2hhbmdlcyB0aGVpciB2YWx1ZXMgaW50byB0YWJsZQotICAgIGluZGVjZXMgc28gd2UgY2FudCB1c2UgaXQgYWZ0ZXIgdGhpcyBwb2ludC4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qICBpZWVlX3dyaXRlX2J5dGUoYWJmZCwgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0pOyovCi0KLSAgLyogIGllZWVfd3JpdGVfYnl0ZShhYmZkLCBpZWVlX3JlY29yZF9zZXBlcmF0b3JfZW51bSk7Ki8KLQotCi0gIC8qIFdyaXRlIGFueSBkZWJ1Z3Mgd2UgaGF2ZSBiZWVuIHRvbGQgYWJvdXQuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2RlYnVnX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDYW4gb25seSB3cml0ZSB0aGUgZGF0YSBvbmNlIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiB3cml0dGVuLCBzaW5jZQotICAgICB0aGUgZGF0YSBjb250YWlucyByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHdoaWNoIHBvaW50cyB0byB0aGUKLSAgICAgc3ltYm9scy4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZGF0YV9wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQXQgdGhlIGVuZCB3ZSBwdXQgdGhlIGVuZCEgICovCi0gIGlmICghIGllZWVfd3JpdGVfbWVfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdlbmVyYXRlIHRoZSBoZWFkZXIgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvbGQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTl9XX1ZBUklBQkxFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgaSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQ1X291dCAoYWJmZCwgaWVlZS0+dy5vZmZzZXRbaV0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBOYXRpdmUtbGV2ZWwgaW50ZXJmYWNlIHRvIHN5bWJvbHMuICovCi0KLS8qIFdlIHJlYWQgdGhlIHN5bWJvbHMgaW50byBhIGJ1ZmZlciwgd2hpY2ggaXMgZGlzY2FyZGVkIHdoZW4gdGhpcwotICAgZnVuY3Rpb24gZXhpdHMuICBXZSByZWFkIHRoZSBzdHJpbmdzIGludG8gYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvCi0gICBob2xkIHRoZW0gYWxsIHBsdXMgYWxsIHRoZSBjYWNoZWQgc3ltYm9sIGVudHJpZXMuICovCi0KLWFzeW1ib2wgKgotaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX3N5bWJvbF90eXBlICpuZXcgPQotICAgIChpZWVlX3N5bWJvbF90eXBlICopIGJmZF96bWFsbG9jIChzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi1zdGF0aWMgYmZkICoKLWllZWVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBwcmV2KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKmFyID0gSUVFRV9BUl9EQVRBIChhcmNoKTsKLSAgLyogdGFrZSB0aGUgbmV4dCBvbmUgZnJvbSB0aGUgYXJjaCBzdGF0ZSwgb3IgcmVzZXQgKi8KLSAgaWYgKHByZXYgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBpbmRleCAtIHRoZSBmaXJzdCB0d28gZW50cmllcyBhcmUgYm9ndXMqLwotICAgICAgYXItPmVsZW1lbnRfaW5kZXggPSAyOwotICAgIH0KLSAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKnAgPSBhci0+ZWxlbWVudHMgKyBhci0+ZWxlbWVudF9pbmRleDsKLSAgICAgIGFyLT5lbGVtZW50X2luZGV4Kys7Ci0gICAgICBpZiAoYXItPmVsZW1lbnRfaW5kZXggPD0gYXItPmVsZW1lbnRfY291bnQpCi0JewotCSAgaWYgKHAtPmZpbGVfb2Zmc2V0ICE9IChmaWxlX3B0cikgMCkKLQkgICAgewotCSAgICAgIGlmIChwLT5hYmZkID09IChiZmQgKikgTlVMTCkKLQkJewotCQkgIHAtPmFiZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2gpOwotCQkgIHAtPmFiZmQtPm9yaWdpbiA9IHAtPmZpbGVfb2Zmc2V0OwotCQl9Ci0JICAgICAgcmV0dXJuIHAtPmFiZmQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotCSAgcmV0dXJuIChiZmQgKikgTlVMTDsKLQl9Ci0KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJc2VjdGlvbiwKLQkJCXN5bWJvbHMsCi0JCQlvZmZzZXQsCi0JCQlmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLAotCQkJbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBpZWVlX2FyX2RhdGFfdHlwZSAqYXIgPSAoaWVlZV9hcl9kYXRhX3R5cGUgKikgTlVMTDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLSAgICBhciA9IGFiZmQtPm15X2FyY2hpdmUtPnRkYXRhLmllZWVfYXJfZGF0YTsKLSAgaWYgKGFyID09IChpZWVlX2FyX2RhdGFfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChJRUVFX0RBVEEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGllZWVfb2JqZWN0X3AgKGFiZmQpID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBidWYtPnN0X3NpemUgPSBpZWVlLT53LnIubWVfcmVjb3JkICsgMTsKLSAgYnVmLT5zdF9tb2RlID0gMDY0NDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWllZWVfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB4OwotewotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgZGVidWcgaW5mbyByb3V0aW5lcyBhcmUgbmV2ZXIgdXNlZC4gICovCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19zdGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi19Ci0KLXN0YXRpYyB2b2lkCi1pZWVlX2JmZF9kZWJ1Z19pbmZvX2VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi19Ci0KLQotLyogQWRkIHRoaXMgc2VjdGlvbiB0byB0aGUgbGlzdCBvZiBzZWN0aW9ucyB3ZSBoYXZlIGRlYnVnIGluZm8gZm9yLCB0bwotICAgYmUgcmVhZHkgdG8gb3V0cHV0IGl0IGF0IGNsb3NlIHRpbWUKLSAgICovCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoc2VjdGlvbi0+b3duZXIpOwotICBpZWVlX2RhdGFfdHlwZSAqb3V0cHV0X2llZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICAvKiBjYW4gb25seSBhY2N1bXVsYXRlIGRhdGEgZnJvbSBvdGhlciBpZWVlIGJmZHMgKi8KLSAgaWYgKHNlY3Rpb24tPm93bmVyLT54dmVjICE9IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuOwotICAvKiBPbmx5IGJvdGhlciBvbmNlIHBlciBiZmQgKi8KLSAgaWYgKGllZWUtPmRvbmVfZGVidWcgPT0gdHJ1ZSkKLSAgICByZXR1cm47Ci0gIGllZWUtPmRvbmVfZGVidWcgPSB0cnVlOwotCi0gIC8qIERvbid0IGJvdGhlciBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvICovCi0gIGlmIChpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9PSAwKQotICAgIHJldHVybjsKLQotCi0gIC8qIEFkZCB0byBjaGFpbiAqLwotICB7Ci0gICAgYmZkX2NoYWluX3R5cGUgKm4gPSAoYmZkX2NoYWluX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGJmZF9jaGFpbl90eXBlKSk7Ci0gICAgaWYgKCFuKQotICAgICAgYWJvcnQgKCk7CQkvKiBGSVhNRSAqLwotICAgIG4tPnRoaXMgPSBzZWN0aW9uLT5vd25lcjsKLSAgICBuLT5uZXh0ID0gKGJmZF9jaGFpbl90eXBlICopIE5VTEw7Ci0KLSAgICBpZiAob3V0cHV0X2llZWUtPmNoYWluX2hlYWQpCi0gICAgICB7Ci0Jb3V0cHV0X2llZWUtPmNoYWluX2hlYWQtPm5leHQgPSBuOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlvdXRwdXRfaWVlZS0+Y2hhaW5fcm9vdCA9IG47Ci0KLSAgICAgIH0KLSAgICBvdXRwdXRfaWVlZS0+Y2hhaW5faGVhZCA9IG47Ci0gIH0KLX0KLQotI2VuZGlmCi0KLSNkZWZpbmUJaWVlZV9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgaWVlZV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBpZWVlX3NsdXJwX2FybWFwIGJmZF90cnVlCi0jZGVmaW5lIGllZWVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBpZWVlX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgaWVlZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIGllZWVfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIGllZWVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLQotI2RlZmluZSBpZWVlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaWVlZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaWVlZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGllZWVfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBpZWVlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIGllZWVfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgaWVlZV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIGllZWVfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpZWVlX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWVlZV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpZWVlX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGllZWVfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qU1VQUFJFU1MgNDYwICovCi1jb25zdCBiZmRfdGFyZ2V0IGllZWVfdmVjID0KLXsKLSAgImllZWUiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBpZWVlX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgaWVlZV9hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBpZWVlX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2loZXguYyBiL2JmZC9paGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTUzZDMuLjAwMDAwMDAKLS0tIGEvYmZkL2loZXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCBIZXggb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0IDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IEludGVsIEhleCBmaWxlcyBsb29rIGxpa2U6Ci0KLTEuIElOVEVMIEZPUk1BVFMKLQotQS4gSW50ZWwgMQotCi0gICAxNi1iaXQgYWRkcmVzcy1maWVsZCBmb3JtYXQsIGZvciBmaWxlcyA2NGsgYnl0ZXMgaW4gbGVuZ3RoIG9yIGxlc3MuCi0KLSAgIERBVEEgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24oOikKLSAgIDIuLjMJCVRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiBoZXggbm90YXRpb24KLSAgIDQuLjUJCUhpZ2ggYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgNi4uNwkJTG93IGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMCIKLSAgIDEwLi54CURhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgotCXggPSAobnVtYmVyIG9mIGJ5dGVzIC0gMSkgKiAyICsgMTEKLSAgIHgrMS4ueCsyCUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgeCszLi54KzQJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgRU5EIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAwIgotICAgNC4uNwkJVHJhbnNmZXItYWRkcmVzcyAodXN1YWxseSAiMDAwMCIpCi0JCXRoZSBqdW1wLXRvIGFkZHJlc3MsIGV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDEiCi0gICAxMC4uMTEJQ2hlY2tzdW0sIGluIGhleCBub3RhdGlvbgotICAgMTIuLjEzCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLUIuIElOVEVMIDIKLQotICAgTUNTLTg2IGZvcm1hdCwgdXNpbmcgYSAyMC1iaXQgYWRkcmVzcyBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNjRLIGJ5dGVzLgotCi0gICBEQVRBIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQgb2YgdGhpcyByZWNvcmQsIGhleCBub3RhdGlvbgotICAgNC4uNQkJSGlnaCBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA2Li43CQlMb3cgYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAwIgotICAgMTAuLngJVGhlIGRhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgotCXggPSAobnVtYmVyIG9mIGRhdGEgYnl0ZXMgLSAxKSAqIDIgKyAxMQotICAgeCsxLi54KzIJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICB4KzMuLngrNAlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBFWFRFTkRFRCBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDIiCi0gICAxMC4uMTEJSGlnaCBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcwotICAgMTIuLjEzCUxvdyBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcwotICAgMTQuLjE1CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMTYuLjE3CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLSAgIFRoZSBjaGVja3N1bXMgYXJlIHRoZSB0d28ncyBjb21wbGVtZW50IG9mIHRoZSA4LWJpdCBzdW0KLSAgIHdpdGhvdXQgY2Fycnkgb2YgdGhlIGJ5dGUgY291bnQsIG9mZnNldCBhZGRyZXNzLCBhbmQgdGhlCi0gICByZWNvcmQgdHlwZS4KLQotICAgU1RBUlQgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMyIKLSAgIDEwLi4xMwk4MDg2IENTIHZhbHVlCi0gICAxNC4uMTcJODA4NiBJUCB2YWx1ZQotICAgMTguLjE5CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMjAuLjIxCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLUFub3RoZXIgZG9jdW1lbnQgcmVwb3J0cyB0aGVzZSBhZGRpdGlvbmFsIHR5cGVzOgotCi0gICBFWFRFTkRFRCBMSU5FQVIgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNCIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIGFkZHJlc3Mgb2Ygc3Vic2VxdWVudCByZWNvcmRzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgU1RBUlQgTElORUFSIEFERFJFU1MgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDUiCi0gICAxMC4uMTMJVXBwZXIgMTYgYml0cyBvZiBzdGFydCBhZGRyZXNzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotVGhlIE1SSSBjb21waWxlciB1c2VzIHRoaXMsIHdoaWNoIGlzIGEgcmVwZWF0IG9mIHR5cGUgNToKLQotICBFWFRFTkRFRCBTVEFSVCBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNSIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE0Li4xNwlMb3dlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE4Li4xOQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDIwLi4yMQlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIHZvaWQgaWhleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGloZXhfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IGloZXhfZ2V0X2J5dGUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgaWhleF9iYWRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2NhbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmloZXhfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX3JlY29yZAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGFzeW1ib2wgKmloZXhfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGloZXhfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBwdXQgb24gb25lIGxpbmUgZHVyaW5nIG91dHB1dC4gICovCi0KLSNkZWZpbmUgQ0hVTksgKDIxKQotCi0vKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KLQotI2RlZmluZSBOSUJCTEUoeCkgKGhleF92YWx1ZSAoeCkpCi0jZGVmaW5lIEhFWDIoYnVmZmVyKSAoKE5JQkJMRSAoKGJ1ZmZlcilbMF0pIDw8IDQpICsgTklCQkxFICgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIEhFWDQoYnVmZmVyKSAoKEhFWDIgKGJ1ZmZlcikgPDwgOCkgKyBIRVgyICgoYnVmZmVyKSArIDIpKQotI2RlZmluZSBJU0hFWCh4KSAoaGV4X3AgKHgpKQotCi0vKiBXaGVuIHdlIHdyaXRlIG91dCBhbiBpaGV4IHZhbHVlLCB0aGUgdmFsdWVzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgSW5zdGVhZCwgd2UgaG9sZCB0aGVtIGluIG1lbW9yeSBpbiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfbGlzdAotewotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKm5leHQ7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci19OwotCi0vKiBUaGUgaWhleCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqaGVhZDsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICp0YWlsOwotfTsKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gICovCi0KLXN0YXRpYyB2b2lkCi1paGV4X2luaXQgKCkKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGVkOwotCi0gIGlmICghIGluaXRlZCkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSB0cnVlOwotICAgICAgaGV4X2luaXQgKCk7Ci0gICAgfQotfQotCi0vKiBDcmVhdGUgYW4gaWhleCBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGRhdGEuaWhleF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKnRkYXRhOwotCi0gICAgICB0ZGF0YSA9ICgoc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKikKLQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0KSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuaWhleF9kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgYnl0ZSBmcm9tIGEgQkZELiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgIFJldHVybiBFT0Ygb24gZXJyb3Igb3IgZW5kIG9mIGZpbGUuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaWhleF9nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Ci17Ci0gIGJmZF9ieXRlIGM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JKmVycm9ycHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotCi0gIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOwotfQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgaW50IGM7Ci0gICAgIGJvb2xlYW4gZXJyb3I7Ci17Ci0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBpZiAoISBlcnJvcikKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKCEgaXNwcmludCAoYykpCi0Jc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYzsKLQkgIGJ1ZlsxXSA9ICdcMCc7Ci0JfQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiVkOiB1bmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIEludGVsIEhleCBmaWxlXG4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubywgYnVmKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLX0KLQotLyogUmVhZCBhbiBJbnRlbCBoZXggZmlsZSBhbmQgdHVybiBpdCBpbnRvIHNlY3Rpb25zLiAgV2UgY3JlYXRlIGEgbmV3Ci0gICBzZWN0aW9uIGZvciBlYWNoIGNvbnRpZ3VvdXMgc2V0IG9mIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfc2NhbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfdm1hIHNlZ2Jhc2U7Ci0gIGJmZF92bWEgZXh0YmFzZTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgaW50IGxpbmVubzsKLSAgYm9vbGVhbiBlcnJvcjsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplOwotICBpbnQgYzsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IDA7Ci0KLSAgc2VnYmFzZSA9IDA7Ci0gIGV4dGJhc2UgPSAwOwotICBzZWMgPSBOVUxMOwotICBsaW5lbm8gPSAxOwotICBlcnJvciA9IGZhbHNlOwotICBidWZzaXplID0gMDsKLSAgd2hpbGUgKChjID0gaWhleF9nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGlmIChjID09ICdccicpCi0JY29udGludWU7Ci0gICAgICBlbHNlIGlmIChjID09ICdcbicpCi0JewotCSAgKytsaW5lbm87Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChjICE9ICc6JykKLQl7Ci0JICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxlX3B0ciBwb3M7Ci0JICBjaGFyIGhkcls4XTsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgdW5zaWduZWQgaW50IGxlbjsKLQkgIGJmZF92bWEgYWRkcjsKLQkgIHVuc2lnbmVkIGludCB0eXBlOwotCSAgdW5zaWduZWQgaW50IGNoYXJzOwotCSAgdW5zaWduZWQgaW50IGNoa3N1bTsKLQotCSAgLyogVGhpcyBpcyBhIGRhdGEgcmVjb3JkLiAgKi8KLQotCSAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKLQotCSAgLyogUmVhZCB0aGUgaGVhZGVyIGJ5dGVzLiAgKi8KLQotCSAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCEgSVNIRVggKGhkcltpXSkpCi0JCXsKLQkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgbGVuID0gSEVYMiAoaGRyKTsKLQkgIGFkZHIgPSBIRVg0IChoZHIgKyAyKTsKLQkgIHR5cGUgPSBIRVgyIChoZHIgKyA2KTsKLQotCSAgLyogUmVhZCB0aGUgZGF0YSBieXRlcy4gICovCi0KLQkgIGNoYXJzID0gbGVuICogMiArIDI7Ci0JICBpZiAoY2hhcnMgPj0gYnVmc2l6ZSkKLQkgICAgewotCSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAoYnVmLCBjaGFycyk7Ci0JICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBidWZzaXplID0gY2hhcnM7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGNoYXJzLCBhYmZkKSAhPSBjaGFycykKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjaGFyczsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCEgSVNIRVggKGJ1ZltpXSkpCi0JCXsKLQkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgdGhlIGNoZWNrc3VtLiAgKi8KLQkgIGNoa3N1bSA9IGxlbiArIGFkZHIgKyAoYWRkciA+PiA4KSArIHR5cGU7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JICAgIGNoa3N1bSArPSBIRVgyIChidWYgKyAyICogaSk7Ci0JICBpZiAoKCgtIGNoa3N1bSkgJiAweGZmKSAhPSAodW5zaWduZWQgaW50KSBIRVgyIChidWYgKyAyICogaSkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiVkOiBiYWQgY2hlY2tzdW0gaW4gSW50ZWwgSGV4IGZpbGUgKGV4cGVjdGVkICV1LCBmb3VuZCAldSkiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sCi0JCSAoLSBjaGtzdW0pICYgMHhmZiwgKHVuc2lnbmVkIGludCkgSEVYMiAoYnVmICsgMiAqIGkpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIC8qIFRoaXMgaXMgYSBkYXRhIHJlY29yZC4gICovCi0JICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JCSAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHIpCi0JCXsKLQkJICAvKiBUaGlzIGRhdGEgZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJ1aWxkaW5nLiAgKi8KLQkJICBzZWMtPl9yYXdfc2l6ZSArPSBsZW47Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsZW4gPiAwKQotCQl7Ci0JCSAgY2hhciBzZWNidWZbMjBdOwotCQkgIGNoYXIgKnNlY25hbWU7Ci0KLQkJICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7Ci0JCSAgc2VjbmFtZSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzZWNidWYpICsgMSk7Ci0JCSAgaWYgKHNlY25hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKLQkJICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBzZWNuYW1lKTsKLQkJICBpZiAoc2VjID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzZWMtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotCQkgIHNlYy0+dm1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOwotCQkgIHNlYy0+bG1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOwotCQkgIHNlYy0+X3Jhd19zaXplID0gbGVuOwotCQkgIHNlYy0+ZmlsZXBvcyA9IHBvczsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMToKLQkgICAgICAvKiBBbiBlbmQgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+c3RhcnRfYWRkcmVzcyA9PSAwKQotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcjsKLQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0KLQkgICAgY2FzZSAyOgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAobGVuICE9IDIpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBzZWdiYXNlID0gSEVYNCAoYnVmKSA8PCA0OwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMzoKLQkgICAgICAvKiBBbiBleHRlbmRlZCBzdGFydCBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSA0KQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBzdGFydCBhZGRyZXNzIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBhYmZkLT5zdGFydF9hZGRyZXNzICs9IChIRVg0IChidWYpIDw8IDQpICsgSEVYNCAoYnVmICsgNCk7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSA0OgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSAyKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGV4dGJhc2UgPSBIRVg0IChidWYpIDw8IDE2OwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgNToKLQkgICAgICAvKiBBbiBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyByZWNvcmQuICAqLwotCSAgICAgIGlmIChsZW4gIT0gMiAmJiBsZW4gIT0gNCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGlmIChsZW4gPT0gMikKLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyArPSBIRVg0IChidWYpIDw8IDE2OwotCSAgICAgIGVsc2UKLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyA9IChIRVg0IChidWYpIDw8IDE2KSArIEhFWDQgKGJ1ZiArIDQpOwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczolZDogdW5yZWNvZ25pemVkIGloZXggdHlwZSAldSBpbiBJbnRlbCBIZXggZmlsZVxuIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCB0eXBlKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVycm9yKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUcnkgdG8gcmVjb2duaXplIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaWhleF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBiWzldOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgaWhleF9pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9yZWFkIChiLCAxLCA5LCBhYmZkKSAhPSA5KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYlswXSAhPSAnOicpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IDk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBJU0hFWCAoYltpXSkpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHR5cGUgPSBIRVgyIChiICsgNyk7Ci0gIGlmICh0eXBlID4gNSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgaXQgbG9va3MgbGlrZSBpdCByZWFsbHkgaXMgYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi0gIGlmICghIGloZXhfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhIGloZXhfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgY29udGVudHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgaW50IGM7Ci0gIGJmZF9ieXRlICpwOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemU7Ci0gIGJvb2xlYW4gZXJyb3I7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBwID0gY29udGVudHM7Ci0gIGJ1ZnNpemUgPSAwOwotICBlcnJvciA9IGZhbHNlOwotICB3aGlsZSAoKGMgPSBpaGV4X2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciBoZHJbOF07Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgYmZkX3ZtYSBhZGRyOwotICAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGloZXhfc2NhbiBoYXMgc3VjY2VlZGVkLCBzbyB3ZSBvdWdodCB0bwotICAgICAgICAga25vdyB0aGUgZXhhY3QgZm9ybWF0LiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGMgPT0gJzonKTsKLQotICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGxlbiA9IEhFWDIgKGhkcik7Ci0gICAgICBhZGRyID0gSEVYNCAoaGRyICsgMik7Ci0gICAgICB0eXBlID0gSEVYMiAoaGRyICsgNik7Ci0KLSAgICAgIC8qIFdlIHNob3VsZCBvbmx5IHNlZSB0eXBlIDAgcmVjb3JkcyBoZXJlLiAgKi8KLSAgICAgIGlmICh0eXBlICE9IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogaW50ZXJuYWwgZXJyb3IgaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpZiAobGVuICogMiA+IGJ1ZnNpemUpCi0JewotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChidWYsIGxlbiAqIDIpOwotCSAgaWYgKGJ1ZiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGJ1ZnNpemUgPSBsZW4gKiAyOwotCX0KLQotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGxlbiAqIDIsIGFiZmQpICE9IGxlbiAqIDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkqcCsrID0gSEVYMiAoYnVmICsgMiAqIGkpOwotICAgICAgaWYgKChiZmRfc2l6ZV90eXBlKSAocCAtIGNvbnRlbnRzKSA+PSBzZWN0aW9uLT5fcmF3X3NpemUpCi0JewotCSAgLyogV2UndmUgcmVhZCBldmVyeXRoaW5nIGluIHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmIChidWYgIT0gTlVMTCkKLQkgICAgZnJlZSAoYnVmKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogU2tpcCB0aGUgY2hlY2tzdW0uICAqLwotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIDIsIGFiZmQpICE9IDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmICgoYmZkX3NpemVfdHlwZSkgKHAgLSBjb250ZW50cykgPCBzZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBiYWQgc2VjdGlvbiBsZW5ndGggaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPSBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBpaGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgc2VjdGlvbi0+dXNlZF9ieV9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbWVtY3B5IChsb2NhdGlvbiwgKGJmZF9ieXRlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkICsgb2Zmc2V0LAotCSAgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbjsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICp0ZGF0YTsKLQotICBpZiAoY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0gICAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuID0gKChzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGloZXhfZGF0YV9saXN0KSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtY3B5IChkYXRhLCBsb2NhdGlvbiwgKHNpemVfdCkgY291bnQpOwotCi0gIG4tPmRhdGEgPSBkYXRhOwotICBuLT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKLSAgbi0+c2l6ZSA9IGNvdW50OwotCi0gIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKLSAgICAgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLwotICB0ZGF0YSA9IGFiZmQtPnRkYXRhLmloZXhfZGF0YTsKLSAgaWYgKHRkYXRhLT50YWlsICE9IE5VTEwKLSAgICAgICYmIG4tPndoZXJlID49IHRkYXRhLT50YWlsLT53aGVyZSkKLSAgICB7Ci0gICAgICB0ZGF0YS0+dGFpbC0+bmV4dCA9IG47Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIHRkYXRhLT50YWlsID0gbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKipwcDsKLQotICAgICAgZm9yIChwcCA9ICZ0ZGF0YS0+aGVhZDsKLQkgICAqcHAgIT0gTlVMTCAmJiAoKnBwKS0+d2hlcmUgPCBuLT53aGVyZTsKLQkgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQk7Ci0gICAgICBuLT5uZXh0ID0gKnBwOwotICAgICAgKnBwID0gbjsKLSAgICAgIGlmIChuLT5uZXh0ID09IE5VTEwpCi0JdGRhdGEtPnRhaWwgPSBuOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSByZWNvcmQgb3V0IHRvIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBjb3VudCwgYWRkciwgdHlwZSwgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotICBjaGFyIGJ1Zls5ICsgQ0hVTksgKiAyICsgNF07Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBjaGtzdW07Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jZGVmaW5lIFRPSEVYKGJ1ZiwgdikgXAotICAoKGJ1ZilbMF0gPSBkaWdzWygodikgPj4gNCkgJiAweGZdLCAoYnVmKVsxXSA9IGRpZ3NbKHYpICYgMHhmXSkKLQotICBidWZbMF0gPSAnOic7Ci0gIFRPSEVYIChidWYgKyAxLCBjb3VudCk7Ci0gIFRPSEVYIChidWYgKyAzLCAoYWRkciA+PiA4KSAmIDB4ZmYpOwotICBUT0hFWCAoYnVmICsgNSwgYWRkciAmIDB4ZmYpOwotICBUT0hFWCAoYnVmICsgNywgdHlwZSk7Ci0KLSAgY2hrc3VtID0gY291bnQgKyBhZGRyICsgKGFkZHIgPj4gOCkgKyB0eXBlOwotCi0gIGZvciAoaSA9IDAsIHAgPSBidWYgKyA5OyBpIDwgY291bnQ7IGkrKywgcCArPSAyLCBkYXRhKyspCi0gICAgewotICAgICAgVE9IRVggKHAsICpkYXRhKTsKLSAgICAgIGNoa3N1bSArPSAqZGF0YTsKLSAgICB9Ci0KLSAgVE9IRVggKHAsICgtIGNoa3N1bSkgJiAweGZmKTsKLSAgcFsyXSA9ICdccic7Ci0gIHBbM10gPSAnXG4nOwotCi0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOSArIGNvdW50ICogMiArIDQsIGFiZmQpICE9IDkgKyBjb3VudCAqIDIgKyA0KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF92bWEgc2VnYmFzZTsKLSAgYmZkX3ZtYSBleHRiYXNlOwotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKmw7Ci0KLSAgc2VnYmFzZSA9IDA7Ci0gIGV4dGJhc2UgPSAwOwotICBmb3IgKGwgPSBhYmZkLT50ZGF0YS5paGV4X2RhdGEtPmhlYWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYmZkX3ZtYSB3aGVyZTsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLQotICAgICAgd2hlcmUgPSBsLT53aGVyZTsKLSAgICAgIHAgPSBsLT5kYXRhOwotICAgICAgY291bnQgPSBsLT5zaXplOwotICAgICAgd2hpbGUgKGNvdW50ID4gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIG5vdzsKLQotCSAgbm93ID0gY291bnQ7Ci0JICBpZiAobm93ID4gQ0hVTkspCi0JICAgIG5vdyA9IENIVU5LOwotCi0JICBpZiAod2hlcmUgPiBzZWdiYXNlICsgZXh0YmFzZSArIDB4ZmZmZikKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIGFkZHJbMl07Ci0KLQkgICAgICAvKiBXZSBuZWVkIGEgbmV3IGJhc2UgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKHdoZXJlIDw9IDB4ZmZmZmYpCi0JCXsKLQkJICAvKiBUaGUgYWRkcmVzc2VzIHNob3VsZCBiZSBzb3J0ZWQuICAqLwotCQkgIEJGRF9BU1NFUlQgKGV4dGJhc2UgPT0gMCk7Ci0KLQkJICBzZWdiYXNlID0gd2hlcmUgJiAweGYwMDAwOwotCQkgIGFkZHJbMF0gPSAoYmZkX2J5dGUpKHNlZ2Jhc2UgPj4gMTIpICYgMHhmZjsKLQkJICBhZGRyWzFdID0gKGJmZF9ieXRlKShzZWdiYXNlID4+IDQpICYgMHhmZjsKLQkJICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGUgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgYW5kIHRoZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGFyZSBjb21iaW5lZCwgYXQgbGVhc3QgYnkKLSAgICAgICAgICAgICAgICAgICAgIHNvbWUgcmVhZGVycy4gIFdlIG5lZWQgYW4gZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgIHJlY29yZCBoZXJlLCBzbyBpZiB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IGFuCi0gICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCwgemVybyBpdCBvdXQgdG8gYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2lvbi4gICovCi0JCSAgaWYgKHNlZ2Jhc2UgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgYWRkclswXSA9IDA7Ci0JCSAgICAgIGFkZHJbMV0gPSAwOwotCQkgICAgICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHNlZ2Jhc2UgPSAwOwotCQkgICAgfQotCi0JCSAgZXh0YmFzZSA9IHdoZXJlICYgMHhmZmZmMDAwMDsKLQkJICBpZiAod2hlcmUgPiBleHRiYXNlICsgMHhmZmZmKQotCQkgICAgewotCQkgICAgICBjaGFyIGJ1ZlsyMF07Ci0KLQkJICAgICAgc3ByaW50Zl92bWEgKGJ1Ziwgd2hlcmUpOwotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogYWRkcmVzcyAweCVzIG91dCBvZiByYW5nZSBmb3IgSW50ZXggSGV4IGZpbGUiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYnVmKTsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBhZGRyWzBdID0gKGJmZF9ieXRlKShleHRiYXNlID4+IDI0KSAmIDB4ZmY7Ci0JCSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZXh0YmFzZSA+PiAxNikgJiAweGZmOwotCQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCA0LCBhZGRyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBub3csIHdoZXJlIC0gKGV4dGJhc2UgKyBzZWdiYXNlKSwKLQkJCQkgICAwLCBwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICB3aGVyZSArPSBub3c7Ci0JICBwICs9IG5vdzsKLQkgIGNvdW50IC09IG5vdzsKLQl9Ci0gICAgfQotCi0gIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzICE9IDApCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydDsKLSAgICAgIGJmZF9ieXRlIHN0YXJ0YnVmWzRdOwotCi0gICAgICBzdGFydCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3M7Ci0KLSAgICAgIGlmIChzdGFydCA8PSAweGZmZmZmKQotCXsKLQkgIHN0YXJ0YnVmWzBdID0gKGJmZF9ieXRlKSgoc3RhcnQgJiAweGYwMDAwKSA+PiAxMikgJiAweGZmOwotCSAgc3RhcnRidWZbMV0gPSAwOwotCSAgc3RhcnRidWZbMl0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDgpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzNdID0gKGJmZF9ieXRlKXN0YXJ0ICYgMHhmZjsKLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCA0LCAwLCAzLCBzdGFydGJ1ZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RhcnRidWZbMF0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDI0KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlsxXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gMTYpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzJdID0gKGJmZF9ieXRlKShzdGFydCA+PiA4KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlszXSA9IChiZmRfYnl0ZSlzdGFydCAmIDB4ZmY7Ci0JICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgNCwgMCwgNSwgc3RhcnRidWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgMSwgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gIFRoaXMgaXMgcmVxdWlyZWQgb25seSBiZWNhdXNlCi0gICBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSB3YW50cyB0byBjcmVhdGUgYSBzeW1ib2wgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotaWhleF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXc7Ci0KLSAgbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcgIT0gTlVMTCkKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhlIG91dHB1dCBmaWxlLiAgVGhlIGFyY2hpdGVjdHVyZSBpcwotICAgaXJyZWxldmFudCwgc28gd2UgaWdub3JlIGVycm9ycyBhYm91dCB1bmtub3duIGFyY2hpdGVjdHVyZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpKQotICAgIHsKLSAgICAgIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycywgZm9yIHRoZSBsaW5rZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWloZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotLyogU29tZSByYW5kb20gZGVmaW5pdGlvbnMgZm9yIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotI2RlZmluZQlpaGV4X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBpaGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBpaGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgaWhleF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGJmZF8wbAotI2RlZmluZSBpaGV4X2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGloZXhfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBpaGV4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGloZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGloZXhfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaWhleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGloZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGloZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBpaGV4X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGloZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpaGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWhleF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWhleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpaGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGloZXhfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWhleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLyogVGhlIEludGVsIEhleCB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYyA9Ci17Ci0gICJpaGV4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIDAsCQkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIGloZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWhleCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9pbml0LmMgYi9iZmQvaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmExZDUwLi4wMDAwMDAwCi0tLSBhL2JmZC9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBiZmQgaW5pdGlhbGl6YXRpb24gc3R1ZmYKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyoKLVNFQ1RJT04KLQlJbml0aWFsaXphdGlvbgotCi0JVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgaW5pdGlhbGl6aW5nIGEgQkZELgotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2luaXQKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9pbml0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIEJGRCBmdW5jdGlvbiB0bwotCWluaXRpYWxpemUgbWFnaWNhbCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCi0qLwotCi0vKiBBY3R1YWxseSwgdGhlcmUgaXMgY3VycmVudGx5IG5vdGhpbmcgZm9yIHRoaXMgZnVuY3Rpb24gdG8gZG8uCi0gICBIb3dldmVyLCBzb21lZGF5IGl0IG1heSBiZSBuZWVkZWQsIHNvIGtlZXAgaXQgYXJvdW5kLiAgKi8KLQotdm9pZAotYmZkX2luaXQgKCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JmZC9pcml4LWNvcmUuYyBiL2JmZC9pcml4LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0Y2EyMC4uMDAwMDAwMAotLS0gYS9iZmQvaXJpeC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJcml4IGNvcmUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3R1IEdyb3NzbWFuLCBDeWdudXMgU3VwcG9ydC4KLSAgIENvbnZlcnRlZCB0byBiYWNrLWVuZCBmb3JtIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIElyaXggc3R5bGUgY29yZQotICAgZmlsZXMgKG5hbWVseSwgSXJpeCA0IGFuZCBJcml4IDUsIHNvIGZhcikuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZmRlZiBJUklYX0NPUkUKLQotI2luY2x1ZGUgPGNvcmUub3V0Lmg+Ci0KLXN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW0NPUkVfTkFNRVNJWkVdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuc2dpX2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi1zdGF0aWMgYXNlY3Rpb24gKm1ha2VfYmZkX2FzZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmlyaXhfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKmlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGlyaXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGFzeW1ib2wgKmlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gNDsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWlyaXhfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgaTsKLSAgY2hhciAqc2VjbmFtZTsKLSAgc3RydWN0IGNvcmVvdXQgY29yZW91dDsKLSAgc3RydWN0IGlkZXNjICppZGcsICppZGYsICppZHM7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVvdXQsIDEsIHNpemVvZiBjb3Jlb3V0LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgY29yZW91dCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZm5kZWYgQ09SRV9NQUdJQ04zMgotI2RlZmluZSBDT1JFX01BR0lDTjMyIENPUkVfTUFHSUMKLSNlbmRpZgotICBpZiAoKGNvcmVvdXQuY19tYWdpYyAhPSBDT1JFX01BR0lDICYmIGNvcmVvdXQuY19tYWdpYyAhPSBDT1JFX01BR0lDTjMyKQotICAgICAgfHwgY29yZW91dC5jX3ZlcnNpb24gIT0gQ09SRV9WRVJTSU9OMSkKLSAgICByZXR1cm4gMDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IHNnaV9jb3JlX3N0cnVjdCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgY29yZW91dC5jX25hbWUsIENPUkVfTkFNRVNJWkUpOwotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBjb3Jlb3V0LmNfc2lnY2F1c2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3Jlb3V0LmNfdm1hcG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvcmVvdXQuY19udm1hcDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCB2bWFwIHZtYXA7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZ2bWFwLCAxLCBzaXplb2Ygdm1hcCwgYWJmZCk7Ci0gICAgICBpZiAodmFsICE9IHNpemVvZiB2bWFwKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKHZtYXAudl90eXBlKQotCXsKLQljYXNlIFZEQVRBOgotCSAgc2VjbmFtZSA9ICIuZGF0YSI7Ci0JICBicmVhazsKLQljYXNlIFZTVEFDSzoKLQkgIHNlY25hbWUgPSAiLnN0YWNrIjsKLQkgIGJyZWFrOwotI2lmZGVmIFZNQVBGSUxFCi0JY2FzZSBWTUFQRklMRToKLQkgIHNlY25hbWUgPSAiLm1hcGZpbGUiOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBIGZpbGUgb2Zmc2V0IG9mIHplcm8gbWVhbnMgdGhhdCB0aGUgc2VjdGlvbiBpcyBub3QgY29udGFpbmVkCi0JIGluIHRoZSBjb3JlZmlsZS4gICovCi0gICAgICBpZiAodm1hcC52X29mZnNldCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLAotCQkJICAgICAgU0VDX0FMTE9DK1NFQ19MT0FEK1NFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICB2bWFwLnZfbGVuLAotCQkJICAgICAgdm1hcC52X3ZhZGRyLAotCQkJICAgICAgdm1hcC52X29mZnNldCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWdzIGFyZSBjb250aWd1b3VzIHdpdGhpbiB0aGUgY29yZSBmaWxlLiAqLwotCi0gIGlkZyA9ICZjb3Jlb3V0LmNfaWRlc2NbSV9HUFJFR1NdOwotICBpZGYgPSAmY29yZW91dC5jX2lkZXNjW0lfRlBSRUdTXTsKLSAgaWRzID0gJmNvcmVvdXQuY19pZGVzY1tJX1NQRUNSRUdTXTsKLQotICBpZiAoaWRnLT5pX29mZnNldCArIGlkZy0+aV9sZW4gIT0gaWRmLT5pX29mZnNldAotICAgICAgfHwgaWRmLT5pX29mZnNldCArIGlkZi0+aV9sZW4gIT0gaWRzLT5pX29mZnNldCkKLSAgICByZXR1cm4gMDsJCQkvKiBDYW4ndCBkZWFsIHdpdGggbm9uLWNvbnRpZyByZWdzICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBpZGctPmlfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkgICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCSAgICAgaWRnLT5pX2xlbiArIGlkZi0+aV9sZW4gKyBpZHMtPmlfbGVuLAotCQkgICAgIDAsCi0JCSAgICAgaWRnLT5pX29mZnNldCk7Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOwotfQotCi1zdGF0aWMgaW50Ci1pcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pcml4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogWFhYIC0gRklYTUUgKi8KLX0KLQotc3RhdGljIGFzeW1ib2wgKgotaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBpcml4X2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIGlyaXhfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGlyaXhfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaXJpeF9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGlyaXhfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGlyaXhfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgaXJpeF9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGlyaXhfY29yZV92ZWMgPQotICB7Ci0gICAgImlyaXgtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBpcml4X2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChpcml4X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChpcml4X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLSNlbmRpZiAvKiBJUklYX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJhb3V0LmggYi9iZmQvbGliYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDAxZDNkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJhb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgYS5vdXQgKGFuZCBzaW1pbGFyKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTElCQU9VVF9ICi0jZGVmaW5lIExJQkFPVVRfSAotCi0vKiBXZSB0cnkgdG8gZW5jYXBzdWxhdGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSB2YXJpb3VzIGEub3V0IGZpbGUKLSAgIHZhcmlhbnRzIGluIGEgZmV3IHJvdXRpbmVzLCBhbmQgb3RoZXJ3aXNlIHNoYXJlIGxhcmdlIG1hc3NlcyBvZiBjb2RlLgotICAgVGhpcyBtZWFucyB3ZSBvbmx5IGhhdmUgdG8gZml4IGJ1Z3MgaW4gb25lIHBsYWNlLCBtb3N0IG9mIHRoZSB0aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogUGFyYW1ldGVyaXplIHRoZSBhLm91dCBjb2RlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYmVpbmcgYnVpbHQKLSAgIGZvciBhIDMyLWJpdCBhcmNoaXRlY3R1cmUgb3IgYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF82NAotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF82NAotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfNjQKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF82NF8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfNjQpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgOAotI2Vsc2UgLyogQVJDSF9TSVpFID09IDMyICovCi0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF8zMgotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfMzIKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF8zMl8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfMzIpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2VuZGlmIC8qIEFSQ0hfU0laRT09MzIgKi8KLQotLyogRGVjbGFyZSBhdCBmaWxlIGxldmVsLCBzaW5jZSB1c2VkIGluIHBhcmFtZXRlciBsaXN0cywgd2hpY2ggaGF2ZQotICAgd2VpcmQgc2NvcGUuICAqLwotc3RydWN0IGV4dGVybmFsX2V4ZWM7Ci1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3Q7Ci1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsOwotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbDsKLQwKLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgYm9vbGVhbiB3cml0dGVuOwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBpbnQgaW5keDsKLX07Ci0KLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgYS5vdXQgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGFvdXRfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIEJhY2stZW5kIGluZm9ybWF0aW9uIGZvciB2YXJpb3VzIGEub3V0IHRhcmdldHMuICAqLwotc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhCi17Ci0gIC8qIEFyZSBaTUFHSUMgZmlsZXMgbWFwcGVkIGNvbnRpZ3VvdXNseT8gIElmIHNvLCB0aGUgdGV4dCBzZWN0aW9uIG1heQotICAgICBuZWVkIG1vcmUgcGFkZGluZywgaWYgdGhlIHNlZ21lbnQgc2l6ZSAoZ3JhbnVsYXJpdHkgZm9yIG1lbW9yeSBhY2Nlc3MKLSAgICAgY29udHJvbCkgaXMgbGFyZ2VyIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgem1hZ2ljX21hcHBlZF9jb250aWd1b3VzOwotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBaTUFHSUMvTk1BR0lDIGZpbGUgaGVhZGVycyBnZXQgbWFwcGVkIGluIHdpdGggdGhlCi0gICAgIHRleHQgc2VjdGlvbiwgd2hpY2ggc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGhlYWRlci4KLSAgICAgSWYgbm90LCB0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBvbiB0aGUgbmV4dCBwYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X2luY2x1ZGVzX2hlYWRlcjsKLQotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIGlmIHRoZSBlbnRyeSBhZGRyZXNzIGlzIG5vdCBpbiB0aGUKLSAgICAgZmlyc3QgU0VHTUVOVF9TSVpFIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24sIGl0IGlzIHRha2VuIHRvIGJlCi0gICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi0gICAgIGZvciBrZXJuZWxzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBlbnRyeV9pc190ZXh0X2FkZHJlc3M7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHBhc3MgdG8gTl9TRVRfRkxBR1MuICAqLwotICB1bnNpZ25lZCBjaGFyIGV4ZWNfaGRyX2ZsYWdzOwotCi0gIC8qIElmIHRoZSB0ZXh0IHNlY3Rpb24gVk1BIGlzbid0IHNwZWNpZmllZCwgYW5kIHdlIG5lZWQgYW4gYWJzb2x1dGUKLSAgICAgYWRkcmVzcywgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQuICBJZiB3ZSdyZSBwcm9kdWNpbmcgYSByZWxvY2F0YWJsZQotICAgICBmaWxlLCB6ZXJvIGlzIGFsd2F5cyB1c2VkLiAgKi8KLSAgLyogPz8gUGVyaGFwcyBhIGNhbGxiYWNrIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZT8gIFdpbGwgdGhpcyBkbyBhbnl0aGluZwotICAgICByZWFzb25hYmxlIGZvciBhIGZvcm1hdCB0aGF0IGhhbmRsZXMgbXVsdGlwbGUgQ1BVcyB3aXRoIGRpZmZlcmVudAotICAgICBsb2FkIGFkZHJlc3NlcyBmb3IgZWFjaD8gICovCi0gIGJmZF92bWEgZGVmYXVsdF90ZXh0X3ZtYTsKLQotICAvKiBDYWxsYmFjayBmb3Igc2V0dGluZyB0aGUgcGFnZSBhbmQgc2VnbWVudCBzaXplcywgaWYgdGhleSBjYW4ndCBiZQotICAgICB0cml2aWFsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICBib29sZWFuICgqc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIHptYWdpYyBmaWxlcyBvbmx5LiBGb3IgZ28zMiwgdGhlIGxlbmd0aCBvZiB0aGUgZXhlYyBoZWFkZXIgY29udHJpYnV0ZXMKLSAgICAgdG8gdGhlIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbiBpbiB0aGUgZmlsZSBmb3IgYWxpZ25tZW50IHB1cnBvc2VzIGJ1dAotICAgICBkb2VzICpub3QqIGdldCBjb3VudGVkIGluIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgY2hhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZDsKLQotICAvKiBDYWxsYmFjayBmcm9tIHRoZSBhZGQgc3ltYm9scyBwaGFzZSBvZiB0aGUgbGlua2VyIGNvZGUgdG8gaGFuZGxlCi0gICAgIGEgZHluYW1pYyBvYmplY3QuICAqLwotICBib29sZWFuICgqYWRkX2R5bmFtaWNfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAotCQkJCQkgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOwotCi0gIC8qIENhbGxiYWNrIGZyb20gdGhlIGFkZCBzeW1ib2xzIHBoYXNlIG9mIHRoZSBsaW5rZXIgY29kZSB0byBoYW5kbGUKLSAgICAgYWRkaW5nIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCi0JCQkJICAgICBib29sZWFuLAotCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotICAvKiBDYWxsZWQgdG8gaGFuZGxlIGxpbmtpbmcgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCpsaW5rX2R5bmFtaWNfb2JqZWN0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotCi0gIC8qIENhbGxlZCBmb3IgZWFjaCBnbG9iYWwgc3ltYm9sIGJlaW5nIHdyaXR0ZW4gb3V0IGJ5IHRoZSBsaW5rZXIuCi0gICAgIFRoaXMgc2hvdWxkIHdyaXRlIG91dCB0aGUgZHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqd3JpdGVfZHluYW1pY19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIC8qIElmIHRoaXMgY2FsbGJhY2sgaXMgbm90IE5VTEwsIHRoZSBsaW5rZXIgY2FsbHMgaXQgZm9yIGVhY2ggcmVsb2MuCi0gICAgIFJFTE9DIGlzIGEgcG9pbnRlciB0byB0aGUgdW5zd2FwcGVkIHJlbG9jLiAgSWYgKlNLSVAgaXMgc2V0IHRvCi0gICAgIHRydWUsIHRoZSByZWxvYyB3aWxsIGJlIHNraXBwZWQuICAqUkVMT0NBVElPTiBtYXkgYmUgY2hhbmdlZCB0bwotICAgICBjaGFuZ2UgdGhlIGVmZmVjdHMgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgYmZkICppbnB1dF9iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoLAotCQkJCQkgIFBUUiByZWxvYywgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCQkgIGJvb2xlYW4gKnNraXAsCi0JCQkJCSAgYmZkX3ZtYSAqcmVsb2NhdGlvbikpOwotCi0gIC8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgbGluayB0byBmaW5pc2ggdXAgYW55IGR5bmFtaWMgbGlua2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpmaW5pc2hfZHluYW1pY19saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotfTsKLSNkZWZpbmUgYW91dF9iYWNrZW5kX2luZm8oYWJmZCkgXAotCSgoQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICopKChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKSkKLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IGluIG1lbW9yeSBvZiBhICJzdHJ1Y3QgZXhlYyIgd2hpbGUgd2UgcHJvY2VzcyBpdC4KLSAgIEFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0JYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLiAgKi8KLQotc3RydWN0IGludGVybmFsX2V4ZWMKLXsKLSAgICBsb25nIGFfaW5mbzsJCS8qIE1hZ2ljIG51bWJlciBhbmQgZmxhZ3MsIHBhY2tlZCAqLwotICAgIGJmZF92bWEgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgaW4gbWVtICovCi0gICAgYmZkX3ZtYSBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSAqLwotICAgIGJmZF92bWEgYV9lbnRyeTsJCS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgICBiZmRfdm1hIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHRleHQncyByZWxvY2F0aW9uIGluZm8sIGluIGJ5dGVzICovCi0gICAgYmZkX3ZtYSBhX2Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiBkYXRhJ3MgcmVsb2NhdGlvbiBpbmZvLCBpbiBieXRlcyAqLwotICAgIC8qIEFkZGVkIGZvciBpOTYwICovCi0gICAgYmZkX3ZtYSBhX3Rsb2FkOwkJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotICAgIGJmZF92bWEgYV9kbG9hZDsJCS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50ICovCi0gICAgdW5zaWduZWQgY2hhciBhX2RhbGlnbjsJLyogQWxpZ25tZW50IG9mIGRhdGEgc2VnbWVudCAqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudCAqLwotICAgIGNoYXIgYV9yZWxheGFibGU7ICAgICAgICAgICAvKiBFbm91Z2ggaW5mbyBmb3IgbGlua2VyIHJlbGF4ICovCi19OwotCi0vKiBNYWdpYyBudW1iZXIgaXMgd3JpdHRlbiAKLTwgTVNCICAgICAgICAgID4KLTMxMzAyOTI4MjcyNjI1MjQyMzIyMjEyMDE5MTgxNzE2MTUxNDEzMTIxMTEwMDkwODA3MDYwNTA0MDMwMjAxMDAKLTwgRkxBR1MgICAgICAgID48IE1BQ0hJTkUgVFlQRSA+PCAgTUFHSUMgTlVNQkVSICAgICAgICAgICAgICAgID4KLSovCi0vKiBNYWdpYyBudW1iZXIgZm9yIE5ldEJTRCBpcwotPE1TQiAgICAgICAgICAgPgotMzEzMDI5MjgyNzI2MjUyNDIzMjIyMTIwMTkxODE3MTYxNTE0MTMxMjExMTAwOTA4MDcwNjA1MDQwMzAyMDEwMAotPCBGTEFHUyAgICA+PCBNQUNISU5FIFRZUEUgICAgID48ICBNQUdJQyBOVU1CRVIgICAgICAgICAgICAgICAgPgotKi8KLQotZW51bSBtYWNoaW5lX3R5cGUgewotICBNX1VOS05PV04gPSAwLAotICBNXzY4MDEwID0gMSwKLSAgTV82ODAyMCA9IDIsCi0gIE1fU1BBUkMgPSAzLAotICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bnMgbnVtYmVycyAqLwotICAvKiBtYWtlIHRoZXNlIHVwIGZvciB0aGUgbnMzMmsqLwotICBNX05TMzIwMzIgPSAoNjQpLAkJLyogbnMzMjAzMiBydW5uaW5nID8gKi8KLSAgTV9OUzMyNTMyID0gKDY0ICsgNSksCQkvKiBuczMyNTMyIHJ1bm5pbmcgbWFjaCAqLwotCi0gIE1fMzg2ID0gMTAwLAotICBNXzI5SyA9IDEwMSwgICAgICAgICAgLyogQU1EIDI5MDAwICovCi0gIE1fMzg2X0RZTklYID0gMTAyLAkvKiBTZXF1ZW50IHJ1bm5pbmcgZHluaXggKi8KLSAgTV9BUk0gPSAxMDMsCQkvKiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqLwotICBNX1NQQVJDTEVUID0gMTMxLAkvKiBTUEFSQ2xldCA9IE1fU1BBUkMgKyAxMjggKi8KLSAgTV8zODZfTkVUQlNEID0gMTM0LAkvKiBOZXRCU0QvaTM4NiBiaW5hcnkgKi8KLSAgTV82OEtfTkVUQlNEID0gMTM1LAkvKiBOZXRCU0QvbTY4ayBiaW5hcnkgKi8KLSAgTV82OEs0S19ORVRCU0QgPSAxMzYsCS8qIE5ldEJTRC9tNjhrNGsgYmluYXJ5ICovCi0gIE1fNTMyX05FVEJTRCA9IDEzNywJLyogTmV0QlNEL25zMzJrIGJpbmFyeSAqLwotICBNX1NQQVJDX05FVEJTRCA9IDEzOCwJLyogTmV0QlNEL3NwYXJjIGJpbmFyeSAqLwotICBNX1BNQVhfTkVUQlNEID0gMTM5LAkvKiBOZXRCU0QvcG1heCAoTUlQUyBsaXR0bGUtZW5kaWFuKSBiaW5hcnkgKi8KLSAgTV9WQVhfTkVUQlNEID0gMTQwLAkvKiBOZXRCU0QvdmF4IGJpbmFyeSAqLwotICBNX0FMUEhBX05FVEJTRCA9IDE0MSwJLyogTmV0QlNEL2FscGhhIGJpbmFyeSAqLwotICBNX0FSTTZfTkVUQlNEID0gMTQzLAkvKiBOZXRCU0QvYXJtMzIgYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfMSA9IDE0NywJLyogMHg5MywgcmVzZXJ2ZWQgKi8KLSAgTV9NSVBTMSA9IDE1MSwgICAgICAgIC8qIE1JUFMgUjIwMDAvUjMwMDAgYmluYXJ5ICovCi0gIE1fTUlQUzIgPSAxNTIsICAgICAgICAvKiBNSVBTIFI0MDAwL1I2MDAwIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzIgPSAxNjMsCS8qIDB4YTMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfMyA9IDE3OSwJLyogMHhiMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF80ID0gMTk1LAkvKiAweGMzLCByZXNlcnZlZCAqLwotICBNX0hQMjAwID0gMjAwLAkvKiBIUCAyMDAgKDY4MDEwKSBCU0QgYmluYXJ5ICovCi0gIE1fSFAzMDAgPSAoMzAwICUgMjU2KSwgLyogSFAgMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLwotICBNX0hQVVggPSAoMHgyMGMgJSAyNTYpLCAvKiBIUCAyMDAvMzAwIEhQVVggYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfNSA9IDIxMSwJLyogMHhkMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF82ID0gMjI3LAkvKiAweGUzLCByZXNlcnZlZCAqLwotICAvKiAgTV9TUEFSQ0xFVF83ID0gMjQzCS8gKiAweGYzLCByZXNlcnZlZCAqLwotICBNX1NQQVJDTElURV9MRSA9IDI0MwotfTsKLQotI2RlZmluZSBOX0RZTkFNSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweDgwMDAwMDAwKQotCi0jaWZuZGVmIE5fTUFHSUMKLSMgZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZW5kaWYKLQotI2lmbmRlZiBOX01BQ0hUWVBFCi0jIGRlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9GTEFHUwotIyBkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0lORk8KLSMgZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0oKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0gfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKLSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0RZTkFNSUMKLSMgZGVmaW5lIE5fU0VUX0RZTkFNSUMoZXhlYywgZHluYW1pYykgXAotKChleGVjKS5hX2luZm8gPSAoZHluYW1pYykgPyAoKGV4ZWMpLmFfaW5mbyB8IDB4ODAwMDAwMDApIDogXAotKChleGVjKS5hX2luZm8gJiAweDdmZmZmZmZmKSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX01BR0lDCi0jIGRlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAotKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9NQUNIVFlQRQotIyBkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9GTEFHUwotIyBkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IGFvdXRfc3ltYm9sIHsKLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIHNob3J0IGRlc2M7Ci0gIGNoYXIgb3RoZXI7Ci0gIHVuc2lnbmVkIGNoYXIgdHlwZTsKLX0gYW91dF9zeW1ib2xfdHlwZTsKLQotLyogVGhlIGB0ZGF0YScgc3RydWN0IGZvciBhbGwgYS5vdXQtbGlrZSBvYmplY3QgZmlsZSBmb3JtYXRzLgotICAgVmFyaW91cyB0aGluZ3MgZGVwZW5kIG9uIHRoaXMgc3RydWN0IGJlaW5nIGFyb3VuZCBhbnkgdGltZSBhbiBhLm91dAotICAgZmlsZSBpcyBiZWluZyBoYW5kbGVkLiAgQW4gZXhhbXBsZSBpcyBkYnhyZWFkLmMgaW4gR0RCLiAgKi8KLQotc3RydWN0IGFvdXRkYXRhIHsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmhkcjsJCS8qIGV4ZWMgZmlsZSBoZWFkZXIgKi8KLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sczsJCS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIAotICAvKiBGb3IgZWFzZSwgd2UgZG8gdGhpcyAqLwotICBhc2VjdGlvbiAqdGV4dHNlYzsKLSAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gIGFzZWN0aW9uICpic3NzZWM7Ci0KLSAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0gIGZpbGVfcHRyIHN0cl9maWxlcG9zOwotCi0gIC8qIFNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgcmVsb2NfZW50cnlfc2l6ZTsKLQotICAvKiBTaXplIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgc3ltYm9sX2VudHJ5X3NpemU7Ci0KLSAgLyogUGFnZSBzaXplIC0gbmVlZGVkIGZvciBhbGlnbm1lbnQgb2YgZGVtYW5kIHBhZ2VkIGZpbGVzLiAqLwotICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKLQotICAvKiBTZWdtZW50IHNpemUgLSBuZWVkZWQgZm9yIGFsaWdubWVudCBvZiBkZW1hbmQgcGFnZWQgZmlsZXMuICovCi0gIHVuc2lnbmVkIGxvbmcgc2VnbWVudF9zaXplOwotCi0gIC8qIFptYWdpYyBkaXNrIGJsb2NrIHNpemUgLSBuZWVkIHRvIGFsaWduIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgICBzZWN0aW9uIGluIFpNQUdJQyBiaW5hcmllcy4gIE5vcm1hbGx5IHRoZSBzYW1lIGFzIHBhZ2Vfc2l6ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZTsKLQotICB1bnNpZ25lZCBleGVjX2J5dGVzX3NpemU7Ci0gIHVuc2lnbmVkIHZtYV9hZGp1c3RlZCA6IDE7Ci0KLSAgLyogdXNlZCB3aGVuIGEgYmZkIHN1cHBvcnRzIHNldmVyYWwgaGlnaGx5IHNpbWlsYXIgZm9ybWF0cyAqLwotICBlbnVtCi0gICAgewotICAgICAgZGVmYXVsdF9mb3JtYXQgPSAwLAotICAgICAgLyogVXNlZCBvbiBIUCA5MDAwLzMwMCBydW5uaW5nIEhQL1VYLiAgU2VlIGhwMzAwaHB1eC5jLiAgKi8KLSAgICAgIGdudV9lbmNhcF9mb3JtYXQsCi0gICAgICAvKiBVc2VkIG9uIExpbnV4LCAzODZCU0QsIGV0Yy4gIFNlZSBpbmNsdWRlL2FvdXQvYW91dDY0LmguICAqLwotICAgICAgcV9tYWdpY19mb3JtYXQKLSAgICB9IHN1YmZvcm1hdDsKLQotICBlbnVtCi0gICAgewotICAgICAgdW5kZWNpZGVkX21hZ2ljID0gMCwKLSAgICAgIHpfbWFnaWMsCi0gICAgICBvX21hZ2ljLAotICAgICAgbl9tYWdpYwotICAgIH0gbWFnaWM7Ci0KLSAgLyogQSBidWZmZXIgZm9yIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgY2hhciAqbGluZV9idWY7Ci0KLSAgLyogVGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0ZXJuYWxfc3ltczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fY291bnQ7Ci0gIGJmZF93aW5kb3cgc3ltX3dpbmRvdzsKLSAgY2hhciAqZXh0ZXJuYWxfc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zdHJpbmdfc2l6ZTsKLSAgYmZkX3dpbmRvdyBzdHJpbmdfd2luZG93OwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIEEgcG9pbnRlciBmb3Igc2hhcmVkIGxpYnJhcnkgaW5mb3JtYXRpb24uICAqLwotICBQVFIgZHluYW1pY19pbmZvOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0Ci0gICAgIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZyBvbiBTdW5PUy4gIFRoaXMgaXMgaW5kZXhlZCBieSB0aGUgc3ltYm9sCi0gICAgIGluZGV4LiAgKi8KLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci19OwotCi1zdHJ1Y3QgIGFvdXRfZGF0YV9zdHJ1Y3QgewotICAgIHN0cnVjdCBhb3V0ZGF0YSBhOwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi0jZGVmaW5lCWFkYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuYW91dF9kYXRhLT5hKQotI2RlZmluZQlleGVjX2hkcihiZmQpCQkoYWRhdGEoYmZkKS5oZHIpCi0jZGVmaW5lCW9ial9hb3V0X3N5bWJvbHMoYmZkKQkoYWRhdGEoYmZkKS5zeW1ib2xzKQotI2RlZmluZQlvYmpfdGV4dHNlYyhiZmQpCShhZGF0YShiZmQpLnRleHRzZWMpCi0jZGVmaW5lCW9ial9kYXRhc2VjKGJmZCkJKGFkYXRhKGJmZCkuZGF0YXNlYykKLSNkZWZpbmUJb2JqX2Jzc3NlYyhiZmQpCQkoYWRhdGEoYmZkKS5ic3NzZWMpCi0jZGVmaW5lCW9ial9zeW1fZmlsZXBvcyhiZmQpCShhZGF0YShiZmQpLnN5bV9maWxlcG9zKQotI2RlZmluZQlvYmpfc3RyX2ZpbGVwb3MoYmZkKQkoYWRhdGEoYmZkKS5zdHJfZmlsZXBvcykKLSNkZWZpbmUJb2JqX3JlbG9jX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5yZWxvY19lbnRyeV9zaXplKQotI2RlZmluZQlvYmpfc3ltYm9sX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5zeW1ib2xfZW50cnlfc2l6ZSkKLSNkZWZpbmUgb2JqX2FvdXRfc3ViZm9ybWF0KGJmZCkJKGFkYXRhKGJmZCkuc3ViZm9ybWF0KQotI2RlZmluZSBvYmpfYW91dF9leHRlcm5hbF9zeW1zKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltcykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50KGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltX2NvdW50KQotI2RlZmluZSBvYmpfYW91dF9zeW1fd2luZG93KGJmZCkgKGFkYXRhKGJmZCkuc3ltX3dpbmRvdykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyhiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3RyaW5nX3NpemUpCi0jZGVmaW5lIG9ial9hb3V0X3N0cmluZ193aW5kb3coYmZkKSAoYWRhdGEoYmZkKS5zdHJpbmdfd2luZG93KQotI2RlZmluZSBvYmpfYW91dF9zeW1faGFzaGVzKGJmZCkgKGFkYXRhKGJmZCkuc3ltX2hhc2hlcykKLSNkZWZpbmUgb2JqX2FvdXRfZHluYW1pY19pbmZvKGJmZCkgKGFkYXRhKGJmZCkuZHluYW1pY19pbmZvKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sICovCi0jZGVmaW5lIGFvdXRfc3ltYm9sKGFzeW1ib2wpICgoYW91dF9zeW1ib2xfdHlwZSAqKSgmKGFzeW1ib2wpLT50aGVfYmZkKSkKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBhLm91dCBzZWN0aW9uLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seQotICAgdXNlZCBieSB0aGUgYS5vdXQgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0Ci17Ci0gIC8qIFRoZSB1bnN3YXBwZWQgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBQVFIgcmVsb2NzOwotfTsKLQotI2RlZmluZSBhb3V0X3NlY3Rpb25fZGF0YShzKSBcCi0gICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKSAocyktPnVzZWRfYnlfYmZkKQotCi0jZGVmaW5lIHNldF9hb3V0X3NlY3Rpb25fZGF0YShzLHYpIFwKLSAgKChzKS0+dXNlZF9ieV9iZmQgPSAoUFRSKSYodiktPnJlbG9jcykKLQotLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gYW91dHguaCAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKikpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLU5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCQkJCSAgICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrKShiZmQgKikpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LG1rb2JqZWN0KSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZW51bSBtYWNoaW5lX3R5cGUKLU5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQkJCSB1bnNpZ25lZCBsb25nIG1hY2hpbmUsCi0JCQkJIGJvb2xlYW4gKnVua25vd24pKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JCSAJCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKiwKLQkJCQkJICAgc3RydWN0IGV4dGVybmFsX25saXN0ICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUsIGNoYXIgKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSwKLQkJCQkJICAgYm9vbGVhbiBkeW5hbWljKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsd3JpdGVfc3ltcykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1OQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBhc2VjdCwKLQkJCQkgICAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1sb25nCi1OQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkgICAgICAgYXJlbGVudCAqKnJlbHB0ciwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIGFzZWN0KSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3JlbG9jKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBzZWNfcHRyIGlnbm9yZSkpOwotCi1hbGVudCAqCi1OQU1FKGFvdXQsZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgYXN5bWJvbCAqaWdub3JlX3N5bWJvbCkpOwotCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBQVFIgZmlsZSwKLQkJCSAgICBhc3ltYm9sICpzeW1ib2wsIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLQotdm9pZAotTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0gICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwgdW5zaWduZWQgaW50ICpsaW5lX3B0cikpOwotCi1sb25nCi1OQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLQkJCQkJIGFzeW1ib2wgKikpOwotCi1pbnQKLU5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGV4ZWMpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZSwgZmlsZV9wdHIgKnRleHRfZW5kKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpCi0gICAgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgY29uc3QgY2hhciAqKSkpOwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgICAgICB2b2lkICgqKSAoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosCi0JCQkJCSBmaWxlX3B0ciAqKSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEEub3V0IHVzZXMgdGhlIGdlbmVyaWMgdmVyc2lvbnMgb2YgdGhlc2Ugcm91dGluZXMuLi4gKi8KLQotI2RlZmluZQlhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lCWFvdXRfNjRfZ2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jaWZuZGVmIE5PX1dSSVRFX0hFQURFUl9LTFVER0UKLSNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBhb3V0XzMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgV1JJVEVfSEVBREVSUwotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgIFwKLQliZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCSAgICAgIFwKLQlmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkgICAgICBcCi0JaWYgKGFkYXRhKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykJCQkgICAgICBcCi0JICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsJICAgICAgXAotCWV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsJCQkgICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICAgICBcCi0JaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJICAgICAgXAotCSAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgICAgIFwKLSAgCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkgICAgICBcCi0JICAgICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICB7CQkJCQkJCQkgICAgICBcCi0JICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApIFwKLQkgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICBpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgICAgIFwKLQkgIH0JCQkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSAgICAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgCSAgICAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgICAgICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0gICAgICB9CQkJCQkJCQkJICAgICAgCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCQU9VVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC1pbi5oIGIvYmZkL2xpYmJmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFjODIzLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0MiArMCwwIEBACi0vKiBsaWJiZmQuaCAtLSBEZWNsYXJhdGlvbnMgdXNlZCBieSBiZmQgbGlicmFyeSAqaW1wbGVtZW50YXRpb24qLgotICAgKFRoaXMgaW5jbHVkZSBmaWxlIGlzIG5vdCBmb3IgdXNlcnMgb2YgdGhlIGxpYnJhcnkuKQotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJiZmQuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bwotKiogZ2VuZXJhdGUgdGhpcyBmaWxlLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFsaWduIGFuIGFkZHJlc3MgdXB3YXJkIHRvIGEgYm91bmRhcnksIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAgIEUuZy4gYWxpZ24gdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IHdpdGggYXJndW1lbnQgb2YgOC4gIFRha2UgY2FyZSBuZXZlcgotICAgdG8gd3JhcCBhcm91bmQgaWYgdGhlIGFkZHJlc3MgaXMgd2l0aGluIGJvdW5kYXJ5LTEgb2YgdGhlIGVuZCBvZiB0aGUKLSAgIGFkZHJlc3Mgc3BhY2UuICAqLwotI2RlZmluZSBCRkRfQUxJR04odGhpcywgYm91bmRhcnkpCQkJCQlcCi0gICgoKChiZmRfdm1hKSAodGhpcykgKyAoYm91bmRhcnkpIC0gMSkgPj0gKGJmZF92bWEpICh0aGlzKSkJCVwKLSAgID8gKCgoYmZkX3ZtYSkgKHRoaXMpICsgKChib3VuZGFyeSkgLSAxKSkgJiAofigoYm91bmRhcnkpLTEpKSkJXAotICAgOiB+IChiZmRfdm1hKSAwKQotCi0vKiBJZiB5b3Ugd2FudCB0byByZWFkIGFuZCB3cml0ZSBsYXJnZSBibG9ja3MsIHlvdSBtaWdodCB3YW50IHRvIGRvIGl0Ci0gICBpbiBxdWFudGEgb2YgdGhpcyBhbW91bnQgKi8KLSNkZWZpbmUgREVGQVVMVF9CVUZGRVJTSVpFIDgxOTIKLQotLyogU2V0IGEgdGRhdGEgZmllbGQuICBDYW4ndCB1c2UgdGhlIG90aGVyIG1hY3JvcyBmb3IgdGhpcywgc2luY2UgdGhleQotICAgZG8gY2FzdHMsIGFuZCBjYXN0aW5nIHRvIHRoZSBsZWZ0IG9mIGFzc2lnbm1lbnQgaXNuJ3QgcG9ydGFibGUuICAqLwotI2RlZmluZSBzZXRfdGRhdGEoYmZkLCB2KSAoKGJmZCktPnRkYXRhLmFueSA9IChQVFIpICh2KSkKLQotLyogSWYgQkZEX0lOX01FTU9SWSBpcyBzZXQgZm9yIGEgQkZELCB0aGVuIHRoZSBpb3N0cmVhbSBmaWVsZHMgcG9pbnRzCi0gICB0byBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBiZmRfaW5fbWVtb3J5Ci17Ci0gIC8qIFNpemUgb2YgYnVmZmVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBCdWZmZXIgaG9sZGluZyBjb250ZW50cyBvZiBCRkQuICAqLwotICBiZmRfYnl0ZSAqYnVmZmVyOwotfTsKLQotLyogdGRhdGEgZm9yIGFuIGFyY2hpdmUuICBGb3IgYW4gaW5wdXQgYXJjaGl2ZSwgY2FjaGUKLSAgIG5lZWRzIHRvIGJlIGZyZWUoKSdkLiAgRm9yIGFuIG91dHB1dCBhcmNoaXZlLCBzeW1kZWZzIGRvLiAgKi8KLQotc3RydWN0IGFydGRhdGEgewotICBmaWxlX3B0ciBmaXJzdF9maWxlX2ZpbGVwb3M7Ci0gIC8qIFNwZWVkIHVwIHNlYXJjaGluZyB0aGUgYXJtYXAgKi8KLSAgc3RydWN0IGFyX2NhY2hlICpjYWNoZTsKLSAgYmZkICphcmNoaXZlX2hlYWQ7ICAgICAgICAgICAgLyogT25seSBpbnRlcmVzdGluZyBpbiBvdXRwdXQgcm91dGluZXMgKi8KLSAgY2Fyc3ltICpzeW1kZWZzOwkJLyogdGhlIHN5bWRlZiBlbnRyaWVzICovCi0gIHN5bWluZGV4IHN5bWRlZl9jb3VudDsgICAgICAgICAgICAgLyogaG93IG1hbnkgdGhlcmUgYXJlICovCi0gIGNoYXIgKmV4dGVuZGVkX25hbWVzOwkJLyogY2xldmVyIGludGVsIGV4dGVuc2lvbiAqLwotICAvKiB3aGVuIG1vcmUgY29tcGlsZXJzIGFyZSBzdGFuZGFyZCBDLCB0aGlzIGNhbiBiZSBhIHRpbWVfdCAqLwotICBsb25nICBhcm1hcF90aW1lc3RhbXA7CS8qIFRpbWVzdGFtcCB2YWx1ZSB3cml0dGVuIGludG8gYXJtYXAuCi0JCQkJICAgVGhpcyBpcyB1c2VkIGZvciBCU0QgYXJjaGl2ZXMgdG8gY2hlY2sKLQkJCQkgICB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgcmVjZW50IGVub3VnaAotCQkJCSAgIGZvciB0aGUgQlNEIGxpbmtlciB0byBub3QgY29tcGxhaW4sCi0JCQkJICAganVzdCBiZWZvcmUgd2UgZmluaXNoIHdyaXRpbmcgYW4KLQkJCQkgICBhcmNoaXZlLiAgKi8KLSAgZmlsZV9wdHIgYXJtYXBfZGF0ZXBvczsJLyogUG9zaXRpb24gd2l0aGluIGFyY2hpdmUgdG8gc2VlayB0bwotCQkJCSAgIHJld3JpdGUgdGhlIGRhdGUgZmllbGQuICAqLwotICBQVFIgdGRhdGE7CQkJLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi19OwotCi0jZGVmaW5lIGJmZF9hcmRhdGEoYmZkKSAoKGJmZCktPnRkYXRhLmFvdXRfYXJfZGF0YSkKLQotLyogR29lcyBpbiBiZmQncyBhcmVsdF9kYXRhIHNsb3QgKi8KLXN0cnVjdCBhcmVsdGRhdGEgewotICBjaGFyICogYXJjaF9oZWFkZXI7CQkJICAgICAvKiBpdCdzIGFjdHVhbGx5IGEgc3RyaW5nICovCi0gIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsgICAgIC8qIG9jdGV0cyBvZiBmaWxlc2l6ZSBub3QgaW5jbHVkaW5nIGFyX2hkciAqLwotICBjaGFyICpmaWxlbmFtZTsJCQkgICAgIC8qIG51bGwtdGVybWluYXRlZCAqLwotfTsKLQotI2RlZmluZSBhcmVsdF9zaXplKGJmZCkgKCgoc3RydWN0IGFyZWx0ZGF0YSAqKSgoYmZkKS0+YXJlbHRfZGF0YSkpLT5wYXJzZWRfc2l6ZSkKLQotZXh0ZXJuIFBUUiBiZmRfbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfcmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfem1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotZXh0ZXJuIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyOwotCi0vKiBUaGVzZSByb3V0aW5lcyBhbGxvY2F0ZSBhbmQgZnJlZSB0aGluZ3Mgb24gdGhlIEJGRCdzIG9iamFsbG9jLiAgKi8KLQotZXh0ZXJuIFBUUiBiZmRfYWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfemFsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiB2b2lkIGJmZF9yZWxlYXNlIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotYmZkICoJX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIFBBUkFNUyAoKGJmZCAqb2JmZCkpOwotYmZkICoJX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUgUEFSQU1TICgoYmZkICphcmNoX2JmZCwgZmlsZV9wdHIgaW5kZXgpKTsKLWJvb2xlYW4gX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBiZmQgKikpOwotYm9vbGVhbglfYmZkX2dlbmVyaWNfbWthcmNoaXZlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY29uc3QgYmZkX3RhcmdldCAqYmZkX2dlbmVyaWNfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbgliZmRfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIGJmZF9zbHVycF9ic2RfYXJtYXBfZjIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jZGVmaW5lIGJmZF9zbHVycF9ic2RfYXJtYXAgYmZkX3NsdXJwX2FybWFwCi0jZGVmaW5lIGJmZF9zbHVycF9jb2ZmX2FybWFwIGJmZF9zbHVycF9hcm1hcAotYm9vbGVhbglfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLWJvb2xlYW4JX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCkpOwotYmZkICpfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyBQQVJBTVMgKChiZmQgKmFyY2hpdmUsIGZpbGVfcHRyIGZpbGVwb3MpKTsKLWV4dGVybiBiZmQgKl9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotYmZkICogX2JmZF9uZXdfYmZkIFBBUkFNUyAoKHZvaWQpKTsKLQotYm9vbGVhbgliZmRfZmFsc2UgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWJvb2xlYW4JYmZkX3RydWUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLVBUUgliZmRfbnVsbHZvaWRwdHIgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWludAliZmRfMCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotdW5zaWduZWQgaW50CWJmZF8wdSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotbG9uZwliZmRfMGwgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJX2JmZF9uMSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotdm9pZAliZmRfdm9pZCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotCi1iZmQgKl9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gUEFSQU1TICgoYmZkICopKTsKLWNvbnN0IGJmZF90YXJnZXQgKl9iZmRfZHVtbXlfdGFyZ2V0IFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi12b2lkCWJmZF9kb250X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLXZvaWQJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9nbnVfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotCi1ib29sZWFuCWJzZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotCQkJCSAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci0KLWJvb2xlYW4JY29mZl93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotCQkJCSAgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1leHRlcm4gUFRSIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gUFRSIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi1iZmQgKgliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoaXZlLAotCQkJCQkJICAgICBiZmQgKmxhc3RfZmlsZSkpOwotCi1pbnQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotCi0jZGVmaW5lIF9iZmRfcmVhZF9hcl9oZHIoYWJmZCkgXAotICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWFkX2FyX2hkcl9mbiwgKGFiZmQpKQotDAotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cCBiZmRfdHJ1ZQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfd2luZG93ICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9DT1BZLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqLCBhc3ltYm9sICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIFBUUikpKSBiZmRfdHJ1ZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9DT1JFIHdoZW4gdGhlcmUgaXMgbm8gY29yZSBmaWxlCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKS4gICovCi0KLWV4dGVybiBjaGFyICpfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgd2hlbiB0aGVyZSBpcyBubyBhcmNoaXZlCi0gICBmaWxlIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9hcm1hcCBiZmRfZmFsc2UKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfZmFsc2UKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV90cnVuY2F0ZV9hcm5hbWUgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNoYXIgKikpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfd3JpdGVfYXJtYXAgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gICgoYmZkICooKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCBcCi0gICgoYmZkICooKikgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfZmFsc2UKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBCU0Qgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLiAgKi8KLQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2FybWFwIGJmZF9zbHVycF9ic2RfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF90cnVuY2F0ZV9hcm5hbWUgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF93cml0ZV9hcm1hcCBic2Rfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLSAgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQ09GRiBzdHlsZQotICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLiAgKi8KLQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9hcm1hcCBiZmRfc2x1cnBfY29mZl9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfd3JpdGVfYXJtYXAgY29mZl93cml0ZV9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLSAgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyB3aGVyZSB0aGVyZSBpcyBubyBzeW1ib2wKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWFrZV9lbXB0eV9zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbCBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbyBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vIFwKLSAgKChhbGVudCAqKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZSBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLCBcCi0JICAgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHVuc2lnbmVkIGxvbmcpKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9SRUxPQ1Mgd2hlbiB0aGVyZSBpcyBubyByZWxvYwotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKLSAgKChyZWxvY19ob3d0b190eXBlICooKikgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUgZm9yIHRhcmdldHMgd2hpY2ggbWF5IG5vdAotICAgYmUgd3JpdHRlbi4gIFVzZSBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9ub3dyaXRlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9hcmNoX21hY2ggXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X3NlY3Rpb25fY29udGVudHMgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSkpIFwKLSAgIGJmZF9mYWxzZSkKLQotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfTElOSyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKLSAgIHN1cHBvcnQgbGlua2luZy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluaykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9saW5rX3NpemVvZl9oZWFkZXJzICgoaW50ICgqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpKSBiZmRfMCkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gICgoYmZkX2J5dGUgKigqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBcCi0JICAgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX3JlbGF4X3NlY3Rpb24gXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2djX3NlY3Rpb25zIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKigqKSBQQVJBTVMgKChiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2FkZF9zeW1ib2xzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9maW5hbF9saW5rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX2ZhbHNlKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBoYXZlIGR5bmFtaWMgc3ltYm9scyBvciByZWxvY3MuICBVc2UgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQwotICAgKF9iZmRfbm9keW5hbWljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotDAotLyogR2VuZXJpYyByb3V0aW5lIHRvIGRldGVybWluZSBvZiB0aGUgZ2l2ZW4gc3ltYm9sIGlzIGEgbG9jYWwKLSAgIGxhYmVsLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBHZW5lcmljIG1pbmlzeW1ib2wgcm91dGluZXMuICAqLwotZXh0ZXJuIGxvbmcgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKTsKLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHVzaW5nIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBib29sZWFuICosIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICosIFBUUiAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYWRlcnN0IGxpbmUgdXNpbmcgRFdBUkYgMSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHVzaW5nIERXQVJGIDIgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogQSByb3V0aW5lIHRvIGNyZWF0ZSBlbnRyaWVzIGZvciBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LAotCSAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLS8qIEluaXRpYWxpemUgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBHZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBjcmVhdGlvbiByb3V0aW5lLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLQotLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICBUaGlzIHZlcnNpb24gaXMgdXNlZCBieSB0YXJnZXRzIGZvcgotICAgd2hpY2ggdGhlIGxpbmtlciBtdXN0IGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLAotICAgYXMgdGhlIGNvbGxlY3QyIHByb2dyYW0gZG9lcy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYXJjaGl2ZSBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBib29sZWFuICgqY2hlY2tmbikgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSk7Ci0KLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGF2b2lkIHByb3RvdHlwZSBlcnJvcnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSBfYmZkX2xpbmtfaGFzaF9lbnRyeTsKLQotLyogR2VuZXJpYyByb3V0aW5lIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKm5hbWUsIGZsYWd3b3JkLAotCSAgIGFzZWN0aW9uICosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjb3B5LAotCSAgIGJvb2xlYW4gY29uc3RydWN0b3IsIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLS8qIEdlbmVyaWMgbGluayByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpOwotCi0vKiBHZW5lcmljIHJlbG9jX2xpbmtfb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIERlZmF1bHQgbGluayBvcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogQ291bnQgdGhlIG51bWJlciBvZiByZWxvYyBlbnRyaWVzIGluIGEgbGluayBvcmRlciBsaXN0LiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBGaW5hbCBsaW5rIHJlbG9jYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJmZF92bWEgYWRkcmVzcywgYmZkX3ZtYSB2YWx1ZSwgYmZkX3ZtYSBhZGRlbmQpKTsKLQotLyogUmVsb2NhdGUgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGJ5IGEgaG93dG8gYW5kIGEgdmFsdWUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotLyogTGluayBzdGFicyBpbiBzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGFzcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwgUFRSICopKTsKLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWJzdHIgc3RyaW5nIHRhYmxlIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIFBBUkFNUyAoKGJmZCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIGFuIG9mZnNldCB3aXRoaW4gYSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbgotICAgc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX3ZtYSkpOwotCi0vKiBDcmVhdGUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBDcmVhdGUgYW4gWENPRkYgLmRlYnVnIHNlY3Rpb24gc3R5bGUgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRnJlZSBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBfYmZkX3N0cmluZ3RhYl9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfc2l6ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogQWRkIGEgc3RyaW5nIHRvIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX2FkZAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBoYXNoLAotCSAgIGJvb2xlYW4gY29weSkpOwotCi0vKiBXcml0ZSBvdXQgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdHJpbmd0YWJfZW1pdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIENoZWNrIHRoYXQgZW5kaWFubmVzcyBvZiBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgbWF0Y2guICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0MCi0vKiBNYWNyb3MgdG8gdGVsbCBpZiBiZmRzIGFyZSByZWFkIG9yIHdyaXRlIGVuYWJsZWQuCi0KLSAgIE5vdGUgdGhhdCBiZmRzIG9wZW4gZm9yIHJlYWQgbWF5IGJlIHNjcmliYmxlZCBpbnRvIGlmIHRoZSBmZCBwYXNzZWQKLSAgIHRvIGJmZF9mZG9wZW5yIGlzIGFjdHVhbGx5IG9wZW4gYm90aCBmb3IgcmVhZCBhbmQgd3JpdGUKLSAgIHNpbXVsdGFuZW91c2x5LiAgSG93ZXZlciBhbiBvdXRwdXQgYmZkIHdpbGwgbmV2ZXIgYmUgb3BlbiBmb3IKLSAgIHJlYWQuICBUaGVyZWZvcmUgc29tZXRpbWVzIHlvdSB3YW50IHRvIGNoZWNrIGJmZF9yZWFkX3Agb3IKLSAgICFiZmRfcmVhZF9wLCBhbmQgb25seSBzb21ldGltZXMgYmZkX3dyaXRlX3AuCi0qLwotCi0jZGVmaW5lCWJmZF9yZWFkX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHJlYWRfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQotI2RlZmluZQliZmRfd3JpdGVfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQotCi12b2lkCWJmZF9hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciosaW50KSk7Ci0KLSNkZWZpbmUgQkZEX0FTU0VSVCh4KSBcCi17IGlmICghKHgpKSBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQotCi0jZGVmaW5lIEJGRF9GQUlMKCkgXAoteyBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQotCi1GSUxFICoJYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLS8qIExpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldCB2ZWN0b3JzLCBhbmQgdGhlIGRlZmF1bHQgdmVjdG9yIChpZgotICAgYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGlzIE5VTEwsIHRoZXJlIGlzIG5vIGRlZmF1bHQpLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgYmZkX3RhcmdldF92ZWN0b3JbXTsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXTsKLQotLyogRnVuY3Rpb25zIHNoYXJlZCBieSB0aGUgRUNPRkYgYW5kIE1JUFMgRUxGIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCi0gICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgZWNvZmZfZmluZF9saW5lOwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0gUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIF9iZmRfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci0KLS8qIEZ1bmN0aW9uIHNoYXJlZCBieSB0aGUgQ09GRiBhbmQgRUxGIFNIIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCi0gICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYm9vbGVhbiAoKikgKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpLAotCSAgIFBUUiwgYmZkX3ZtYSAqKiwgYmZkX3ZtYSAqLCBiZmRfdm1hLCBiZmRfdm1hLCBib29sZWFuICopKTsKLQotLyogQW5kIG1vcmUgZm9sbG93cyAqLwotCmRpZmYgLS1naXQgYS9iZmQvbGliYmZkLmMgYi9iZmQvbGliYmZkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYTNkZTAuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmJmZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NiArMCwwIEBACi0vKiBBc3NvcnRlZCBCRkQgc3VwcG9ydCByb3V0aW5lcywgb25seSB1c2VkIGludGVybmFsbHkuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotI2RlZmluZSBnZXRwYWdlc2l6ZSgpIDIwNDgKLSNlbmRpZgotCi1zdGF0aWMgaW50IHJlYWxfcmVhZCBQQVJBTVMgKChQVFIsIHNpemVfdCwgc2l6ZV90LCBGSUxFICopKTsKLQotLyoKLVNFQ1RJT04KLQlJbnRlcm5hbCBmdW5jdGlvbnMKLQotREVTQ1JJUFRJT04KLQlUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCB3aXRoaW4gQkZELgotCVRoZXkgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZXhwb3J0LCBidXQgYXJlIGRvY3VtZW50ZWQgaGVyZSBmb3IKLQljb21wbGV0ZW5lc3MuCi0qLwotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKLSAgIG9wZXJhdGlvbnMuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9mYWxzZSAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3Igc3VwcG9ydGVkIG9wZXJhdGlvbnMKLSAgIHdoaWNoIGRvIG5vdCBhY3R1YWxseSBkbyBhbnl0aGluZy4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX3RydWUgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmU7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKLSAgIG9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB2YWx1ZS4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1iZmRfbnVsbHZvaWRwdHIgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmU7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKkFSR1NVU0VEKi8KLWludCAKLWJmZF8wIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlOwotewotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi11bnNpZ25lZCBpbnQgCi1iZmRfMHUgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmU7Ci17Ci0gICByZXR1cm4gMDsKLX0KLQotLypBUkdVU0VEKi8KLWxvbmcKLWJmZF8wbCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciB1bnN1cHBvcnRlZAotICAgb3BlcmF0aW9ucyB3aGljaCByZXR1cm4gLTEgb24gZXJyb3IuICAqLwotCi0vKkFSR1NVU0VEKi8KLWxvbmcKLV9iZmRfbjEgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZCAKLWJmZF92b2lkIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlOwotewotfQotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoaWdub3JlX2NvcmVfYmZkLCBpZ25vcmVfZXhlY19iZmQpCi0gICAgIGJmZCAqaWdub3JlX2NvcmVfYmZkOwotICAgICBiZmQgKmlnbm9yZV9leGVjX2JmZDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSb3V0aW5lIHRvIGhhbmRsZSBjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGVudHJ5IHBvaW50IGZvciB0YXJnZXRzCi0gICB3aXRob3V0IGNvcmUgZmlsZSBzdXBwb3J0LiAgKi8KLQotLypBUkdTVVNFRCovCi1jaGFyICoKLV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gKGNoYXIgKilOVUxMOwotfQotCi0vKiBSb3V0aW5lIHRvIGhhbmRsZSBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgZW50cnkgcG9pbnQgZm9yIHRhcmdldHMKLSAgIHdpdGhvdXQgY29yZSBmaWxlIHN1cHBvcnQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWludAotX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHU1VTRUQqLwotY29uc3QgYmZkX3RhcmdldCAqCi1fYmZkX2R1bW15X3RhcmdldCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICByZXR1cm4gMDsKLX0KLQwKLS8qIEFsbG9jYXRlIG1lbW9yeSB1c2luZyBtYWxsb2MuICAqLwotCi1QVFIKLWJmZF9tYWxsb2MgKHNpemUpCi0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcHRyOwotCi0gIHB0ciA9IChQVFIpIG1hbGxvYyAoc2l6ZSk7Ci0gIGlmIChwdHIgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFJlYWxsb2NhdGUgbWVtb3J5IHVzaW5nIHJlYWxsb2MuICAqLwotCi1QVFIKLWJmZF9yZWFsbG9jIChwdHIsIHNpemUpCi0gICAgIFBUUiBwdHI7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcmV0OwotCi0gIGlmIChwdHIgPT0gTlVMTCkKLSAgICByZXQgPSBtYWxsb2MgKHNpemUpOwotICBlbHNlCi0gICAgcmV0ID0gcmVhbGxvYyAocHRyLCBzaXplKTsKLQotICBpZiAocmV0ID09IE5VTEwpCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWxsb2NhdGUgbWVtb3J5IHVzaW5nIG1hbGxvYyBhbmQgY2xlYXIgaXQuICAqLwotCi1QVFIKLWJmZF96bWFsbG9jIChzaXplKQotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHB0cjsKLQotICBwdHIgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotCi0gIGlmIChzaXplICE9IDApCi0gICAgewotICAgICAgaWYgKHB0ciA9PSBOVUxMKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgZWxzZQotCW1lbXNldCAocHRyLCAwLCBzaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIFNvbWUgSU8gY29kZSAqLwotCi0KLS8qIE5vdGUgdGhhdCBhcmNoaXZlIGVudHJpZXMgZG9uJ3QgaGF2ZSBzdHJlYW1zOyB0aGV5IHNoYXJlIHRoZWlyIHBhcmVudCdzLgotICAgVGhpcyBhbGxvd3Mgc29tZW9uZSB0byBwbGF5IHdpdGggdGhlIGlvc3RyZWFtIGJlaGluZCBCRkQncyBiYWNrLgotCi0gICBBbHNvLCBub3RlIHRoYXQgdGhlIG9yaWdpbiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIGEgZmlsZSdzCi0gICBjb250ZW50cyAoMCBmb3Igbm9uLWFyY2hpdmUgZWxlbWVudHMpLiAgRm9yIGFyY2hpdmUgZW50cmllcyB0aGlzIGlzIHRoZQotICAgZmlyc3Qgb2N0ZXQgaW4gdGhlIGZpbGUsIE5PVCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcmNoaXZlIGhlYWRlci4gKi8KLQotc3RhdGljIGludAotcmVhbF9yZWFkICh3aGVyZSwgYSxiLCBmaWxlKQotICAgICBQVFIgd2hlcmU7Ci0gICAgIHNpemVfdCBhOwotICAgICBzaXplX3QgYjsKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgLyogRklYTUUgLSB0aGlzIGxvb2tzIGxpa2UgYW4gb3B0aW1pemF0aW9uLCBidXQgaXQncyByZWFsbHkgdG8gY292ZXIKLSAgICAgdXAgZm9yIGEgZmVhdHVyZSBvZiBzb21lIE9TcyAobm90IHNvbGFyaXMgLSBzaWdoKSB0aGF0Ci0gICAgIGxkL3BlLWRsbC5jIHRha2VzIGFkdmFudGFnZSBvZiAoYXBwYXJlbnRseSkgd2hlbiBpdCBjcmVhdGVzIEJGRHMKLSAgICAgaW50ZXJuYWxseSBhbmQgdHJpZXMgdG8gbGluayBhZ2FpbnN0IHRoZW0uICBCRkQgc2VlbXMgdG8gYmUgc21hcnQKLSAgICAgZW5vdWdoIHRvIHJlYWxpemUgdGhlcmUgYXJlIG5vIHN5bWJvbCByZWNvcmRzIGluIHRoZSAiZmlsZSIgdGhhdAotICAgICBkb2Vzbid0IGV4aXN0IGJ1dCBhdHRlbXB0cyB0byByZWFkIHRoZW0gYW55d2F5LiAgT24gU29sYXJpcywKLSAgICAgYXR0ZW1wdGluZyB0byByZWFkIHplcm8gYnl0ZXMgZnJvbSBhIE5VTEwgZmlsZSByZXN1bHRzIGluIGEgY29yZQotICAgICBkdW1wLCBidXQgb24gb3RoZXIgcGxhdGZvcm1zIGl0IGp1c3QgcmV0dXJucyB6ZXJvIGJ5dGVzIHJlYWQuCi0gICAgIFRoaXMgbWFrZXMgaXQgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuIC0gREogKi8KLSAgaWYgKGEgPT0gMCB8fCBiID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSNpZiBkZWZpbmVkIChfX1ZBWCkgJiYgZGVmaW5lZCAoVk1TKQotICAvKiBBcHBhcmVudGx5IGZyZWFkIG9uIFZheCBWTVMgZG9lcyBub3Qga2VlcCB0aGUgcmVjb3JkIGxlbmd0aAotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHJldHVybiByZWFkIChmaWxlbm8gKGZpbGUpLCB3aGVyZSwgYSAqIGIpOwotI2Vsc2UKLSAgcmV0dXJuIGZyZWFkICh3aGVyZSwgYSwgYiwgZmlsZSk7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJuIHZhbHVlIGlzIGFtb3VudCByZWFkIChGSVhNRTogaG93IGFyZSBlcnJvcnMgYW5kIGVuZCBvZiBmaWxlIGRlYWx0Ci0gICB3aXRoPyAgV2UgbmV2ZXIgY2FsbCBiZmRfc2V0X2Vycm9yLCB3aGljaCBpcyBwcm9iYWJseSBhIG1pc3Rha2UpLiAgKi8KLQotYmZkX3NpemVfdHlwZQotYmZkX3JlYWQgKHB0ciwgc2l6ZSwgbml0ZW1zLCBhYmZkKQotICAgICBQVFIgcHRyOwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgIGJmZF9zaXplX3R5cGUgbml0ZW1zOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBucmVhZDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotICAgICAgYmZkX3NpemVfdHlwZSBnZXQ7Ci0KLSAgICAgIGJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBhYmZkLT5pb3N0cmVhbTsKLSAgICAgIGdldCA9IHNpemUgKiBuaXRlbXM7Ci0gICAgICBpZiAoYWJmZC0+d2hlcmUgKyBnZXQgPiBiaW0tPnNpemUpCi0JewotCSAgZ2V0ID0gYmltLT5zaXplIC0gYWJmZC0+d2hlcmU7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCX0KLSAgICAgIG1lbWNweSAocHRyLCBiaW0tPmJ1ZmZlciArIGFiZmQtPndoZXJlLCBnZXQpOwotICAgICAgYWJmZC0+d2hlcmUgKz0gZ2V0OwotICAgICAgcmV0dXJuIGdldDsKLSAgICB9Ci0KLSAgbnJlYWQgPSByZWFsX3JlYWQgKHB0ciwgMSwgKHNpemVfdCkoc2l6ZSpuaXRlbXMpLCBiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKLSAgaWYgKG5yZWFkID4gMCkKLSAgICBhYmZkLT53aGVyZSArPSBucmVhZDsKLQotICAvKiBTZXQgYmZkX2Vycm9yIGlmIHdlIGRpZCBub3QgcmVhZCBhcyBtdWNoIGRhdGEgYXMgd2UgZXhwZWN0ZWQuCi0KLSAgICAgSWYgdGhlIHJlYWQgZmFpbGVkIGR1ZSB0byBhbiBlcnJvciBzZXQgdGhlIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKLSAgICAgZWxzZSBzZXQgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLgotCi0gICAgIEEgQkZEIGJhY2tlbmQgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkIHRvCi0gICAgIHByb3ZpZGUgc29tZXRoaW5nIG1vcmUgdXNlZnVsIChlZy4gbm9fc3ltYm9scyBvciB3cm9uZ19mb3JtYXQpLiAgKi8KLSAgaWYgKG5yZWFkIDwgKGludCkoc2l6ZSAqIG5pdGVtcykpCi0gICAgewotICAgICAgaWYgKGZlcnJvciAoYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCkpKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlbHNlCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5yZWFkOwotfQotCi0vKiBUaGUgd2luZG93IHN1cHBvcnQgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGJlIGJyb2tlbiBvdXQgaW50bwotICAgYW5vdGhlciBmaWxlLi4uLiAgKi8KLS8qIFRoZSBpZGVhIGJlaGluZCB0aGUgbmV4dCBhbmQgcmVmY291bnQgZmllbGRzIGlzIHRoYXQgb25lIG1hcHBlZAotICAgcmVnaW9uIGNhbiBzdWZmaWNlIGZvciBtdWx0aXBsZSByZWFkLW9ubHkgd2luZG93cyBvciBtdWx0aXBsZQotICAgbm9uLW92ZXJsYXBwaW5nIHJlYWQtd3JpdGUgd2luZG93cy4gIEl0J3Mgbm90IGltcGxlbWVudGVkIHlldAotICAgdGhvdWdoLiAgKi8KLXN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCB7Ci0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqbmV4dDsKLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgaW50IHJlZmNvdW50IDogMzE7CQkvKiBzaG91bGQgYmUgZW5vdWdoLi4uICovCi0gIHVuc2lnbmVkIG1hcHBlZCA6IDE7CQkvKiAxID0gbW1hcCwgMCA9IG1hbGxvYyAqLwotfTsKLQotdm9pZAotYmZkX2luaXRfd2luZG93ICh3aW5kb3dwKQotICAgICBiZmRfd2luZG93ICp3aW5kb3dwOwotewotICB3aW5kb3dwLT5kYXRhID0gMDsKLSAgd2luZG93cC0+aSA9IDA7Ci0gIHdpbmRvd3AtPnNpemUgPSAwOwotfQotDAotLyogQ3VycmVudGx5LCBpZiBVU0VfTU1BUCBpcyB1bmRlZmluZWQsIG5vbmUgaWYgdGhlIHdpbmRvdyBzdHVmZiBpcwotICAgdXNlZC4gIE9rYXksIHNvIGl0J3MgbWlzLW5hbWVkLiAgQXQgbGVhc3QgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KLSAgICItLXdpdGhvdXQtbW1hcCIgaXMgbW9yZSBvYnZpb3VzIHRoYW4gIi0td2l0aG91dC13aW5kb3dzIiBvciBzb21lCi0gICBzdWNoLiAgKi8KLSNpZmRlZiBVU0VfTU1BUAotCi0jdW5kZWYgSEFWRV9NUFJPVEVDVCAvKiBjb2RlJ3Mgbm90IHRlc3RlZCB5ZXQgKi8KLQotI2lmIEhBVkVfTU1BUCB8fCBIQVZFX01QUk9URUNUIHx8IEhBVkVfTUFEVklTRQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBNQVBfRklMRQotI2RlZmluZSBNQVBfRklMRSAwCi0jZW5kaWYKLQotc3RhdGljIGludCBkZWJ1Z193aW5kb3dzOwotCi12b2lkCi1iZmRfZnJlZV93aW5kb3cgKHdpbmRvd3ApCi0gICAgIGJmZF93aW5kb3cgKndpbmRvd3A7Ci17Ci0gIGJmZF93aW5kb3dfaW50ZXJuYWwgKmkgPSB3aW5kb3dwLT5pOwotICB3aW5kb3dwLT5pID0gMDsKLSAgd2luZG93cC0+ZGF0YSA9IDA7Ci0gIGlmIChpID09IDApCi0gICAgcmV0dXJuOwotICBpLT5yZWZjb3VudC0tOwotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJmcmVlaW5nIHdpbmRvdyBAJXA8JXAsJWx4LCVwPlxuIiwKLQkgICAgIHdpbmRvd3AsIHdpbmRvd3AtPmRhdGEsIHdpbmRvd3AtPnNpemUsIHdpbmRvd3AtPmkpOwotICBpZiAoaS0+cmVmY291bnQgIT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGktPm1hcHBlZCkKLSAgICB7Ci0jaWZkZWYgSEFWRV9NTUFQCi0gICAgICBtdW5tYXAgKGktPmRhdGEsIGktPnNpemUpOwotICAgICAgZ290byBub19mcmVlOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgfQotI2lmZGVmIEhBVkVfTVBST1RFQ1QKLSAgbXByb3RlY3QgKGktPmRhdGEsIGktPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotI2VuZGlmCi0gIGZyZWUgKGktPmRhdGEpOwotI2lmZGVmIEhBVkVfTU1BUAotIG5vX2ZyZWU6Ci0jZW5kaWYKLSAgaS0+ZGF0YSA9IDA7Ci0gIC8qIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHJlZmVyZW5jZXMgdG8gaSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgZnJlZSAoaSk7Ci19Ci0KLXN0YXRpYyBpbnQgb2tfdG9fbWFwID0gMTsKLQotYm9vbGVhbgotYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgb2Zmc2V0LCBzaXplLCB3aW5kb3dwLCB3cml0YWJsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3dpbmRvdyAqd2luZG93cDsKLSAgICAgYm9vbGVhbiB3cml0YWJsZTsKLXsKLSAgc3RhdGljIHNpemVfdCBwYWdlc2l6ZTsKLSAgYmZkX3dpbmRvd19pbnRlcm5hbCAqaSA9IHdpbmRvd3AtPmk7Ci0gIHNpemVfdCBzaXplX3RvX2FsbG9jID0gc2l6ZTsKLQotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJiZmRfZ2V0X2ZpbGVfd2luZG93ICglcCwgJTZsZCwgJTZsZCwgJXA8JXAsJWx4LCVwPiwgJWQpIiwKLQkgICAgIGFiZmQsIChsb25nKSBvZmZzZXQsIChsb25nKSBzaXplLAotCSAgICAgd2luZG93cCwgd2luZG93cC0+ZGF0YSwgKHVuc2lnbmVkIGxvbmcpIHdpbmRvd3AtPnNpemUsCi0JICAgICB3aW5kb3dwLT5pLCB3cml0YWJsZSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgdGhlIHBhZ2Ugc2l6ZSwgc28gd2UgY2FuIGJlIGZyaWVuZGx5IHRvIG1tYXAuICAqLwotICBpZiAocGFnZXNpemUgPT0gMCkKLSAgICBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplICgpOwotICBpZiAocGFnZXNpemUgPT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHsKLSAgICAgIHdpbmRvd3AtPmkgPSBpID0gKGJmZF93aW5kb3dfaW50ZXJuYWwgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkX3dpbmRvd19pbnRlcm5hbCkpOwotICAgICAgaWYgKGkgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpLT5kYXRhID0gMDsKLSAgICB9Ci0jaWZkZWYgSEFWRV9NTUFQCi0gIGlmIChva190b19tYXAKLSAgICAgICYmIChpLT5kYXRhID09IDAgfHwgaS0+bWFwcGVkID09IDEpCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSA9PSAwKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIGZpbGVfb2Zmc2V0LCBvZmZzZXQyOwotICAgICAgc2l6ZV90IHJlYWxfc2l6ZTsKLSAgICAgIGludCBmZDsKLSAgICAgIEZJTEUgKmY7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHJlYWwgZmlsZSBhbmQgdGhlIHJlYWwgb2Zmc2V0IGludG8gaXQuICAqLwotICAgICAgd2hpbGUgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLQl7Ci0JICBvZmZzZXQgKz0gYWJmZC0+b3JpZ2luOwotCSAgYWJmZCA9IGFiZmQtPm15X2FyY2hpdmU7Ci0JfQotICAgICAgZiA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgICAgZmQgPSBmaWxlbm8gKGYpOwotCi0gICAgICAvKiBDb21wdXRlIG9mZnNldHMgYW5kIHNpemUgZm9yIG1tYXAgYW5kIGZvciB0aGUgdXNlcidzIGRhdGEuICAqLwotICAgICAgb2Zmc2V0MiA9IG9mZnNldCAlIHBhZ2VzaXplOwotICAgICAgaWYgKG9mZnNldDIgPCAwKQotCWFib3J0ICgpOwotICAgICAgZmlsZV9vZmZzZXQgPSBvZmZzZXQgLSBvZmZzZXQyOwotICAgICAgcmVhbF9zaXplID0gb2Zmc2V0ICsgc2l6ZSAtIGZpbGVfb2Zmc2V0OwotICAgICAgcmVhbF9zaXplID0gcmVhbF9zaXplICsgcGFnZXNpemUgLSAxOwotICAgICAgcmVhbF9zaXplIC09IHJlYWxfc2l6ZSAlIHBhZ2VzaXplOwotCi0gICAgICAvKiBJZiB3ZSdyZSByZS11c2luZyBhIG1lbW9yeSByZWdpb24sIG1ha2Ugc3VyZSBpdCdzIGJpZyBlbm91Z2guICAqLwotICAgICAgaWYgKGktPmRhdGEgJiYgaS0+c2l6ZSA8IHNpemUpCi0JewotCSAgbXVubWFwIChpLT5kYXRhLCBpLT5zaXplKTsKLQkgIGktPmRhdGEgPSAwOwotCX0KLSAgICAgIGktPmRhdGEgPSBtbWFwIChpLT5kYXRhLCByZWFsX3NpemUsCi0JCSAgICAgIHdyaXRhYmxlID8gUFJPVF9XUklURSB8IFBST1RfUkVBRCA6IFBST1RfUkVBRCwKLQkJICAgICAgKHdyaXRhYmxlCi0JCSAgICAgICA/IE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUKLQkJICAgICAgIDogTUFQX0ZJTEUgfCBNQVBfU0hBUkVEKSwKLQkJICAgICAgZmQsIGZpbGVfb2Zmc2V0KTsKLSAgICAgIGlmIChpLT5kYXRhID09IChQVFIpIC0xKQotCXsKLQkgIC8qIEFuIGVycm9yIGhhcHBlbmVkLiAgUmVwb3J0IGl0LCBvciB0cnkgdXNpbmcgbWFsbG9jLCBvcgotCSAgICAgc29tZXRoaW5nLiAgKi8KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICBpLT5kYXRhID0gMDsKLQkgIHdpbmRvd3AtPmRhdGEgPSAwOwotCSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIlx0XHRtbWFwIGZhaWxlZCFcbiIpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChkZWJ1Z193aW5kb3dzKQotCWZwcmludGYgKHN0ZGVyciwgIlxuXHRtYXBwZWQgJWxkIGF0ICVwLCBvZmZzZXQgaXMgJWxkXG4iLAotCQkgKGxvbmcpIHJlYWxfc2l6ZSwgaS0+ZGF0YSwgKGxvbmcpIG9mZnNldDIpOwotICAgICAgaS0+c2l6ZSA9IHJlYWxfc2l6ZTsKLSAgICAgIHdpbmRvd3AtPmRhdGEgPSAoUFRSKSAoKGJmZF9ieXRlICopIGktPmRhdGEgKyBvZmZzZXQyKTsKLSAgICAgIHdpbmRvd3AtPnNpemUgPSBzaXplOwotICAgICAgaS0+bWFwcGVkID0gMTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZSBpZiAoZGVidWdfd2luZG93cykKLSAgICB7Ci0gICAgICBpZiAob2tfdG9fbWFwKQotCWZwcmludGYgKHN0ZGVyciwgXygibm90IG1hcHBpbmc6IGRhdGE9JWx4IG1hcHBlZD0lZFxuIiksCi0JCSAodW5zaWduZWQgbG9uZykgaS0+ZGF0YSwgKGludCkgaS0+bWFwcGVkKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsIF8oIm5vdCBtYXBwaW5nOiBlbnYgdmFyIG5vdCBzZXRcbiIpKTsKLSAgICB9Ci0jZWxzZQotICBva190b19tYXAgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIGlmICghd3JpdGFibGUpCi0gICAgewotICAgICAgc2l6ZV90b19hbGxvYyArPSBwYWdlc2l6ZSAtIDE7Ci0gICAgICBzaXplX3RvX2FsbG9jIC09IHNpemVfdG9fYWxsb2MgJSBwYWdlc2l6ZTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXG5cdCVzKCU2bGQpIiwKLQkgICAgIGktPmRhdGEgPyAicmVhbGxvYyIgOiAiIG1hbGxvYyIsIChsb25nKSBzaXplX3RvX2FsbG9jKTsKLSAgaS0+ZGF0YSA9IChQVFIpIGJmZF9yZWFsbG9jIChpLT5kYXRhLCBzaXplX3RvX2FsbG9jKTsKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHQtPiAlcFxuIiwgaS0+ZGF0YSk7Ci0gIGktPnJlZmNvdW50ID0gMTsKLSAgaWYgKGktPmRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZV90b19hbGxvYyA9PSAwKQotCXJldHVybiB0cnVlOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpLT5zaXplID0gYmZkX3JlYWQgKGktPmRhdGEsIHNpemUsIDEsIGFiZmQpOwotICBpZiAoaS0+c2l6ZSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLSAgaS0+bWFwcGVkID0gMDsKLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIGlmICghd3JpdGFibGUpCi0gICAgewotICAgICAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JZnByaW50ZiAoc3RkZXJyLCAiXHRtcHJvdGVjdCAoJXAsICVsZCwgUFJPVF9SRUFEKVxuIiwgaS0+ZGF0YSwKLQkJIChsb25nKSBpLT5zaXplKTsKLSAgICAgIG1wcm90ZWN0IChpLT5kYXRhLCBpLT5zaXplLCBQUk9UX1JFQUQpOwotICAgIH0KLSNlbmRpZgotICB3aW5kb3dwLT5kYXRhID0gaS0+ZGF0YTsKLSAgd2luZG93cC0+c2l6ZSA9IGktPnNpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogVVNFX01NQVAgKi8KLQwKLWJmZF9zaXplX3R5cGUKLWJmZF93cml0ZSAocHRyLCBzaXplLCBuaXRlbXMsIGFiZmQpCi0gICAgIENPTlNUIFBUUiBwdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3NpemVfdHlwZSBuaXRlbXM7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBud3JvdGU7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSAoYWJmZC0+aW9zdHJlYW0pOwotICAgICAgc2l6ZSAqPSBuaXRlbXM7Ci0gICAgICBpZiAoYWJmZC0+d2hlcmUgKyBzaXplID4gYmltLT5zaXplKQotCXsKLQkgIGxvbmcgbmV3c2l6ZSwgb2xkc2l6ZSA9IChiaW0tPnNpemUgKyAxMjcpICYgfjEyNzsKLQkgIGJpbS0+c2l6ZSA9IGFiZmQtPndoZXJlICsgc2l6ZTsKLQkgIC8qIFJvdW5kIHVwIHRvIGN1dCBkb3duIG9uIG1lbW9yeSBmcmFnbWVudGF0aW9uICovCi0JICBuZXdzaXplID0gKGJpbS0+c2l6ZSArIDEyNykgJiB+MTI3OwotCSAgaWYgKG5ld3NpemUgPiBvbGRzaXplKQotCSAgICB7Ci0JICAgICAgYmltLT5idWZmZXIgPSBiZmRfcmVhbGxvYyAoYmltLT5idWZmZXIsIG5ld3NpemUpOwotCSAgICAgIGlmIChiaW0tPmJ1ZmZlciA9PSAwKQotCQl7Ci0JCSAgYmltLT5zaXplID0gMDsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgbWVtY3B5IChiaW0tPmJ1ZmZlciArIGFiZmQtPndoZXJlLCBwdHIsIHNpemUpOwotICAgICAgYWJmZC0+d2hlcmUgKz0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICBud3JvdGUgPSBmd3JpdGUgKHB0ciwgMSwgKHNpemVfdCkgKHNpemUgKiBuaXRlbXMpLAotCQkgICBiZmRfY2FjaGVfbG9va3VwIChhYmZkKSk7Ci0gIGlmIChud3JvdGUgPiAwKQotICAgIGFiZmQtPndoZXJlICs9IG53cm90ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBud3JvdGUgIT0gc2l6ZSAqIG5pdGVtcykKLSAgICB7Ci0jaWZkZWYgRU5PU1BDCi0gICAgICBpZiAobndyb3RlID49IDApCi0JZXJybm8gPSBFTk9TUEM7Ci0jZW5kaWYKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgfQotICByZXR1cm4gbndyb3RlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludAotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQoYmZkICphYmZkLCAgaW50IGkpOwotCi1ERVNDUklQVElPTgotCVdyaXRlIGEgNCBieXRlIGludGVnZXIgQHZhcntpfSB0byB0aGUgb3V0cHV0IEJGRCBAdmFye2FiZmR9LCBpbiBiaWcKLQllbmRpYW4gb3JkZXIgcmVnYXJkbGVzcyBvZiB3aGF0IGVsc2UgaXMgZ29pbmcgb24uICBUaGlzIGlzIHVzZWZ1bCBpbgotCWFyY2hpdmVzLgotCi0qLwotdm9pZAotYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFiZmQsIGkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGk7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgYmZkX3B1dGIzMihpLCBidWZmZXIpOwotICBpZiAoYmZkX3dyaXRlKChQVFIpYnVmZmVyLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIGFib3J0ICgpOwotfQotCi1sb25nCi1iZmRfdGVsbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmaWxlX3B0ciBwdHI7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIGFiZmQtPndoZXJlOwotCi0gIHB0ciA9IGZ0ZWxsIChiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKLQotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKLSAgICBwdHIgLT0gYWJmZC0+b3JpZ2luOwotICBhYmZkLT53aGVyZSA9IHB0cjsKLSAgcmV0dXJuIHB0cjsKLX0KLQotaW50Ci1iZmRfZmx1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmZmx1c2ggKGJmZF9jYWNoZV9sb29rdXAoYWJmZCkpOwotfQotCi0vKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlCi0gICBiZmRfZ2V0X2Vycm9yIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLwotaW50Ci1iZmRfc3RhdCAoYWJmZCwgc3RhdGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZjsKLXsKLSAgRklMRSAqZjsKLSAgaW50IHJlc3VsdDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJlc3VsdCA9IGZzdGF0IChmaWxlbm8gKGYpLCBzdGF0YnVmKTsKLSAgaWYgKHJlc3VsdCA8IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub256ZXJvIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlIGJmZF9nZXRfZXJyb3IKLSAgIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLwotCi1pbnQKLWJmZF9zZWVrIChhYmZkLCBwb3NpdGlvbiwgZGlyZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIHBvc2l0aW9uOwotICAgICBpbnQgZGlyZWN0aW9uOwotewotICBpbnQgcmVzdWx0OwotICBGSUxFICpmOwotICBmaWxlX3B0ciBmaWxlX3Bvc2l0aW9uOwotICAvKiBGb3IgdGhlIHRpbWUgYmVpbmcsIGEgQkZEIG1heSBub3Qgc2VlayB0byBpdCdzIGVuZC4gIFRoZSBwcm9ibGVtCi0gICAgIGlzIHRoYXQgd2UgZG9uJ3QgZWFzaWx5IGhhdmUgYSB3YXkgdG8gcmVjb2duaXplIHRoZSBlbmQgb2YgYW4KLSAgICAgZWxlbWVudCBpbiBhbiBhcmNoaXZlLiAqLwotCi0gIEJGRF9BU1NFUlQgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCB8fCBkaXJlY3Rpb24gPT0gU0VFS19DVVIpOwotCi0gIGlmIChkaXJlY3Rpb24gPT0gU0VFS19DVVIgJiYgcG9zaXRpb24gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZGlyZWN0aW9uID09IFNFRUtfU0VUKQotCWFiZmQtPndoZXJlID0gcG9zaXRpb247Ci0gICAgICBlbHNlCi0JYWJmZC0+d2hlcmUgKz0gcG9zaXRpb247Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfYXJjaGl2ZSAmJiBhYmZkLT5teV9hcmNoaXZlID09IDApCi0gICAgewotI2lmIDAKLSAgICAgIC8qIEV4cGxhbmF0aW9uIGZvciB0aGlzIGNvZGU6IEknbSBvbmx5IGFib3V0IDk1KyUgc3VyZSB0aGF0IHRoZSBhYm92ZQotCSBjb25kaXRpb25zIGFyZSBzdWZmaWNpZW50IGFuZCB0aGF0IGFsbCBpL28gY2FsbHMgYXJlIHByb3Blcmx5Ci0JIGFkanVzdGluZyB0aGUgYHdoZXJlJyBmaWVsZC4gIFNvIHRoaXMgaXMgc29ydCBvZiBhbiBgYXNzZXJ0JwotCSB0aGF0IHRoZSBgd2hlcmUnIGZpZWxkIGlzIGNvcnJlY3QuICBJZiB3ZSBjYW4gZ28gYSB3aGlsZSB3aXRob3V0Ci0JIHRyaXBwaW5nIHRoZSBhYm9ydCwgd2UgY2FuIHByb2JhYmx5IHNhZmVseSBkaXNhYmxlIHRoaXMgY29kZSwKLQkgc28gdGhhdCB0aGUgcmVhbCBvcHRpbWl6YXRpb25zIGhhcHBlbi4gICovCi0gICAgICBmaWxlX3B0ciB3aGVyZV9hbV9pX25vdzsKLSAgICAgIHdoZXJlX2FtX2lfbm93ID0gZnRlbGwgKGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpKTsKLSAgICAgIGlmIChhYmZkLT5teV9hcmNoaXZlKQotCXdoZXJlX2FtX2lfbm93IC09IGFiZmQtPm9yaWdpbjsKLSAgICAgIGlmICh3aGVyZV9hbV9pX25vdyAhPSBhYmZkLT53aGVyZSkKLQlhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBwb3NpdGlvbiA9PSBhYmZkLT53aGVyZSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHNvbWV0aGluZyBzbWFydGVyIHRvIG9wdGltaXplIGFjY2VzcyB0byBhcmNoaXZlcy4KLQkgQ3VycmVudGx5LCBhbnl0aGluZyBpbnNpZGUgYW4gYXJjaGl2ZSBpcyByZWFkIHZpYSB0aGUgZmlsZQotCSBoYW5kbGUgZm9yIHRoZSBhcmNoaXZlLiAgV2hpY2ggbWVhbnMgdGhhdCBhIGJmZF9zZWVrIG9uIG9uZQotCSBjb21wb25lbnQgYWZmZWN0cyB0aGUgYGN1cnJlbnQgcG9zaXRpb24nIGluIHRoZSBhcmNoaXZlLCBhcwotCSB3ZWxsIGFzIGluIGFueSBvdGhlciBjb21wb25lbnQuCi0KLQkgSXQgbWlnaHQgYmUgc3VmZmljaWVudCB0byBwdXQgYSBzcGlrZSB0aHJvdWdoIHRoZSBjYWNoZQotCSBhYnN0cmFjdGlvbiwgYW5kIGxvb2sgdG8gdGhlIGFyY2hpdmUgZm9yIHRoZSBmaWxlIHBvc2l0aW9uLAotCSBidXQgSSB0aGluayB3ZSBzaG91bGQgdHJ5IGZvciBzb21ldGhpbmcgY2xlYW5lci4KLQotCSBJbiB0aGUgbWVhbnRpbWUsIG5vIG9wdGltaXphdGlvbiBmb3IgYXJjaGl2ZXMuICAqLwotICAgIH0KLQotICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGZpbGVfcG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0gICAgZmlsZV9wb3NpdGlvbiArPSBhYmZkLT5vcmlnaW47Ci0KLSAgcmVzdWx0ID0gZnNlZWsgKGYsIGZpbGVfcG9zaXRpb24sIGRpcmVjdGlvbik7Ci0KLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIHsKLSAgICAgIGludCBob2xkX2Vycm5vID0gZXJybm87Ci0KLSAgICAgIC8qIEZvcmNlIHJlZGV0ZXJtaW5hdGlvbiBvZiBgd2hlcmUnIGZpZWxkLiAgKi8KLSAgICAgIGJmZF90ZWxsIChhYmZkKTsKLQotICAgICAgLyogQW4gRUlOVkFMIGVycm9yIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIGZpbGUgb2Zmc2V0IHdhcwotICAgICAgICAgYWJzdXJkLiAgKi8KLSAgICAgIGlmIChob2xkX2Vycm5vID09IEVJTlZBTCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICBlcnJubyA9IGhvbGRfZXJybm87Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkanVzdCBgd2hlcmUnIGZpZWxkLiAgKi8KLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCi0JYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKLSAgICAgIGVsc2UKLQlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0MCi0vKiogVGhlIGRvLWl0LXlvdXJzZWxmIChieXRlKSBzZXgtY2hhbmdlIGtpdCAqLwotCi0vKiBUaGUgbWlkZGxlIGxldHRlciBlLmcuIGdldDxiPnNob3J0IGluZGljYXRlcyBCaWcgb3IgTGl0dGxlIGVuZGlhbgotICAgdGFyZ2V0IG1hY2hpbmUuICBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0Ci0gICBtYWNoaW5lIGlzOyB0aGVzZSByb3V0aW5lcyB3b3JrIGZvciBlaXRoZXIuICAqLwotCi0vKiBGSVhNRTogU2hvdWxkIHRoZXNlIHRha2UgYSBjb3VudCBhcmd1bWVudD8KLSAgIEFuc3dlciAoZ251QGN5Z251cy5jb20pOiAgTm8sIGJ1dCBwZXJoYXBzIHRoZXkgc2hvdWxkIGJlIGlubGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgaW4gc3dhcC5oICNpZmRlZiBfX0dOVUNfXy4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwcm9mIHRoZW0gbGF0ZXIgYW5kIGZpbmQgb3V0LiAgKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3B1dF9zaXplCi1GVU5DVElPTgotCWJmZF9nZXRfc2l6ZQotCi1ERVNDUklQVElPTgotCVRoZXNlIG1hY3JvcyBhcyB1c2VkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHJhdyBkYXRhIGluCi0Jc2VjdGlvbnM7IGVhY2ggYWNjZXNzIChleGNlcHQgZm9yIGJ5dGVzKSBpcyB2ZWN0b3JlZCB0aHJvdWdoCi0JdGhlIHRhcmdldCBmb3JtYXQgb2YgdGhlIEJGRCBhbmQgbWFuZ2xlZCBhY2NvcmRpbmdseS4gVGhlCi0JbWFuZ2xpbmcgcGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBlbmRpYW4gdHJhbnNsYXRpb25zIGFuZAotCXJlbW92ZXMgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gIE5vdGUgdGhhdCB0eXBlcyBhY2NlcHRlZCBhbmQKLQlyZXR1cm5lZCBieSB0aGVzZSBtYWNyb3MgYXJlIGlkZW50aWNhbCBzbyB0aGV5IGNhbiBiZSBzd2FwcGVkCi0JYXJvdW5kIGluIG1hY3Jvcy0tLWZvciBleGFtcGxlLCBAZmlsZXtsaWJhb3V0Lmh9IGRlZmluZXMgPDxHRVRfV09SRD4+Ci0JdG8gZWl0aGVyIDw8YmZkX2dldF8zMj4+IG9yIDw8YmZkX2dldF82ND4+LgotCi0JSW4gdGhlIHB1dCByb3V0aW5lcywgQHZhcnt2YWx9IG11c3QgYmUgYSA8PGJmZF92bWE+Pi4gIElmIHdlIGFyZSBvbiBhCi0Jc3lzdGVtIHdpdGhvdXQgcHJvdG90eXBlcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nCi0Jc3VyZSB0aGF0IGlzIHRydWUsIHdpdGggYSBjYXN0IGlmIG5lY2Vzc2FyeS4gIFdlIGRvbid0IGNhc3QKLQl0aGVtIGluIHRoZSBtYWNybyBkZWZpbml0aW9ucyBiZWNhdXNlIHRoYXQgd291bGQgcHJldmVudCA8PGxpbnQ+PgotCW9yIDw8Z2NjIC1XYWxsPj4gZnJvbSBkZXRlY3Rpbmcgc2lucyBzdWNoIGFzIHBhc3NpbmcgYSBwb2ludGVyLgotCVRvIGRldGVjdCBjYWxsaW5nIHRoZXNlIHdpdGggbGVzcyB0aGFuIGEgPDxiZmRfdm1hPj4sIHVzZQotCTw8Z2NjIC1XY29udmVyc2lvbj4+IG9uIGEgaG9zdCB3aXRoIDY0IGJpdCA8PGJmZF92bWE+PidzLgotCi0uCi0ueyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKn0KLS4KLS4jZGVmaW5lIGJmZF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICAoKigodW5zaWduZWQgY2hhciAqKShwdHIpKSA9ICh1bnNpZ25lZCBjaGFyKSh2YWwpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfOCBcCi0uCQliZmRfcHV0XzgKLS4jZGVmaW5lIGJmZF9nZXRfOChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLS4JCSgoKih1bnNpZ25lZCBjaGFyICopKHB0cikgXiAweDgwKSAtIDB4ODApCi0uCi0uI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MTYsICgodmFsKSwocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8xNiBcCi0uCQkgYmZkX3B1dF8xNgotLiNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgxNiwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAJIEJGRF9TRU5EIChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDMyLCAoKHZhbCksKHB0cikpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMzIgXAotLgkJIGJmZF9wdXRfMzIKLS4jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MzIsIChwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzMyLCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHg2NCwgKCh2YWwpLCAocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0uCQkgYmZkX3B1dF82NAotLiNkZWZpbmUgYmZkX2dldF82NChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHg2NCwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotLgotKi8gCi0KLS8qCi1GVU5DVElPTgotCWJmZF9oX3B1dF9zaXplCi0JYmZkX2hfZ2V0X3NpemUKLQotREVTQ1JJUFRJT04KLQlUaGVzZSBtYWNyb3MgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGVpciA8PGJmZF9nZXRfeD4+Ci0JYnJldGhlcmVuLCBleGNlcHQgdGhhdCB0aGV5IGFyZSB1c2VkIGZvciByZW1vdmluZyBpbmZvcm1hdGlvbgotCWZvciB0aGUgaGVhZGVyIHJlY29yZHMgb2Ygb2JqZWN0IGZpbGVzLiBCZWxpZXZlIGl0IG9yIG5vdCwKLQlzb21lIG9iamVjdCBmaWxlcyBrZWVwIHRoZWlyIGhlYWRlciByZWNvcmRzIGluIGJpZyBlbmRpYW4KLQlvcmRlciBhbmQgdGhlaXIgZGF0YSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLgotLgotLnsqIEJ5dGUgc3dhcHBpbmcgbWFjcm9zIGZvciBmaWxlIGhlYWRlciBkYXRhLiAgKn0KLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0uCQliZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF84KGFiZmQsIHZhbCwgcHRyKSBcCi0uCQliZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotLiNkZWZpbmUgYmZkX2hfZ2V0XzgoYWJmZCwgcHRyKSBcCi0uCQliZmRfZ2V0XzggKGFiZmQsIHB0cikKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLS4JCWJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8xNiBcCi0uCQkgYmZkX2hfcHV0XzE2Ci0uI2RlZmluZSBiZmRfaF9nZXRfMTYoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHgzMiwodmFsLHB0cikpCi0uI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzMyIFwKLS4JCSBiZmRfaF9wdXRfMzIKLS4jZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDMyLChwdHIpKQotLiNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0uCi0uI2RlZmluZSBiZmRfaF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDY0LCh2YWwsIHB0cikpCi0uI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKLS4JCSBiZmRfaF9wdXRfNjQKLS4jZGVmaW5lIGJmZF9oX2dldF82NChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDY0LChwdHIpKQotLiNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0uCi0qLyAKLQotLyogU2lnbiBleHRlbnNpb24gdG8gYmZkX3NpZ25lZF92bWEuICAqLwotI2RlZmluZSBDT0VSQ0UxNih4KSAoKChiZmRfc2lnbmVkX3ZtYSkgKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCkKLSNkZWZpbmUgQ09FUkNFMzIoeCkgXAotICAoKGJmZF9zaWduZWRfdm1hKSAobG9uZykgKCgodW5zaWduZWQgbG9uZykgKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKSkKLSNkZWZpbmUgRUlHSFRfR0FaSUxMSU9OICgoKEJGRF9IT1NUXzY0X0JJVCkweDgwMDAwMDAwKSA8PCAzMikKLSNkZWZpbmUgQ09FUkNFNjQoeCkgXAotICAoKChiZmRfc2lnbmVkX3ZtYSkgKHgpIF4gRUlHSFRfR0FaSUxMSU9OKSAtIEVJR0hUX0dBWklMTElPTikKLQotYmZkX3ZtYQotYmZkX2dldGIxNiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHJldHVybiAoYWRkclswXSA8PCA4KSB8IGFkZHJbMV07Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRsMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdOwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGJfc2lnbmVkXzE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIENPRVJDRTE2KChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXSk7Ci19Ci0KLWJmZF9zaWduZWRfdm1hCi1iZmRfZ2V0bF9zaWduZWRfMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gQ09FUkNFMTYoKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdKTsKLX0KLQotdm9pZAotYmZkX3B1dGIxNiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiA4KTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSApZGF0YTsKLX0KLQotdm9pZAotYmZkX3B1dGwxNiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOyAgICAgICAgICAgICAKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUgKWRhdGE7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gOCk7Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRiMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdIDw8IDI0OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDE2OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM107Ci0gIHJldHVybiAoYmZkX3ZtYSkgdjsKLX0KLQotYmZkX3ZtYQotYmZkX2dldGwzMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXSA8PCAyNDsKLSAgcmV0dXJuIChiZmRfdm1hKSB2OwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGJfc2lnbmVkXzMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXSA8PCAyNDsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdOwotICByZXR1cm4gQ09FUkNFMzIgKHYpOwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGxfc2lnbmVkXzMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXTsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDE2OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdIDw8IDI0OwotICByZXR1cm4gQ09FUkNFMzIgKHYpOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0YjY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLQotICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbM10pICk7Ci0KLSAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzddKSk7Ci0KLSAgcmV0dXJuIGhpZ2ggPDwgMzIgfCBsb3c7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgaGlnaD0gKCgoKCgoKGFkZHJbN10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkcls0XSkpOwotCi0gIGxvdyA9ICgoKCgoKCgoYmZkX3ZtYSlhZGRyWzNdIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbMF0pICk7Ci0KLSAgcmV0dXJuIGhpZ2ggPDwgMzIgfCBsb3c7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotCi19Ci0KLWJmZF9zaWduZWRfdm1hCi1iZmRfZ2V0Yl9zaWduZWRfNjQgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotCi0gIGhpZ2g9ICgoKCgoKCgoYWRkclswXSkgPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclszXSkgKTsKLQotICBsb3cgPSAoKCgoKCgoKChiZmRfdm1hKWFkZHJbNF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkcls1XSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkcls2XSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbN10pKTsKLQotICByZXR1cm4gQ09FUkNFNjQoaGlnaCA8PCAzMiB8IGxvdyk7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGxfc2lnbmVkXzY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgaGlnaD0gKCgoKCgoKGFkZHJbN10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkcls0XSkpOwotCi0gIGxvdyA9ICgoKCgoKCgoYmZkX3ZtYSlhZGRyWzNdIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbMF0pICk7Ci0KLSAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotdm9pZAotYmZkX3B1dGIzMiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgICAgICAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci0gICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMTYpOwotICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICA4KTsKLSAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSlkYXRhOwotfQotCi12b2lkCi1iZmRfcHV0bDMyIChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICAgICAgICBhZGRyWzBdID0gKGJmZF9ieXRlKWRhdGE7Ci0gICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gIDgpOwotICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+IDE2KTsKLSAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci19Ci0KLXZvaWQKLWJmZF9wdXRiNjQgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNyo4KSk7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDYqOCkpOwotICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICg1KjgpKTsKLSAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNCo4KSk7Ci0gIGFkZHJbNF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDMqOCkpOwotICBhZGRyWzVdID0gKGJmZF9ieXRlKShkYXRhID4+ICgyKjgpKTsKLSAgYWRkcls2XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMSo4KSk7Ci0gIGFkZHJbN10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDAqOCkpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSNlbmRpZgotfQotCi12b2lkCi1iZmRfcHV0bDY0IChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotI2lmZGVmIEJGRDY0Ci0gIGFkZHJbN10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDcqOCkpOwotICBhZGRyWzZdID0gKGJmZF9ieXRlKShkYXRhID4+ICg2KjgpKTsKLSAgYWRkcls1XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNSo4KSk7Ci0gIGFkZHJbNF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDQqOCkpOwotICBhZGRyWzNdID0gKGJmZF9ieXRlKShkYXRhID4+ICgzKjgpKTsKLSAgYWRkclsyXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMio4KSk7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDEqOCkpOwotICBhZGRyWzBdID0gKGJmZF9ieXRlKShkYXRhID4+ICgwKjgpKTsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0jZW5kaWYKLX0KLQwKLS8qIERlZmF1bHQgaW1wbGVtZW50YXRpb24gKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICAgIGlmIChjb3VudCA9PSAwKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoKGJmZF9zaXplX3R5cGUpKG9mZnNldCtjb3VudCkgPiBzZWN0aW9uLT5fcmF3X3NpemUKLSAgICAgICAgfHwgYmZkX3NlZWsoYWJmZCwgKGZpbGVfcHRyKShzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpID09IC0xCi0gICAgICAgIHx8IGJmZF9yZWFkKGxvY2F0aW9uLCAoYmZkX3NpemVfdHlwZSkxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgICAgIHJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLwotICAgIHJldHVybiAodHJ1ZSk7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgKGFiZmQsIHNlY3Rpb24sIHcsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBiZmRfd2luZG93ICp3OwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0jaWZkZWYgVVNFX01NQVAKLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChhYmZkLT54dmVjLT5fYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzICE9IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cykKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBrbm93IHdoYXQgY2hhbmdlcyB0aGUgYmZkJ3MgZ2V0X3NlY3Rpb25fY29udGVudHMKLQkgbWV0aG9kIG1heSBoYXZlIHRvIG1ha2UuICBTbyBwdW50IHRyeWluZyB0byBtYXAgdGhlIGZpbGUKLQkgd2luZG93LCBhbmQgbGV0IGdldF9zZWN0aW9uX2NvbnRlbnRzIGRvIGl0cyB0aGluZy4gICovCi0gICAgICAvKiBAQCBGSVhNRSA6IElmIHRoZSBpbnRlcm5hbCB3aW5kb3cgaGFzIGEgcmVmY291bnQgb2YgMSBhbmQgd2FzCi0JIGFsbG9jYXRlZCB3aXRoIG1hbGxvYyBpbnN0ZWFkIG9mIG1tYXAsIGp1c3QgcmV1c2UgaXQuICAqLwotICAgICAgYmZkX2ZyZWVfd2luZG93ICh3KTsKLSAgICAgIHctPmkgPSAoYmZkX3dpbmRvd19pbnRlcm5hbCAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChiZmRfd2luZG93X2ludGVybmFsKSk7Ci0gICAgICBpZiAody0+aSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHctPmktPmRhdGEgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBjb3VudCk7Ci0gICAgICBpZiAody0+aS0+ZGF0YSA9PSBOVUxMKQotCXsKLQkgIGZyZWUgKHctPmkpOwotCSAgdy0+aSA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgdy0+aS0+bWFwcGVkID0gMDsKLSAgICAgIHctPmktPnJlZmNvdW50ID0gMTsKLSAgICAgIHctPnNpemUgPSB3LT5pLT5zaXplID0gY291bnQ7Ci0gICAgICB3LT5kYXRhID0gdy0+aS0+ZGF0YTsKLSAgICAgIHJldHVybiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIHctPmRhdGEsIG9mZnNldCwgY291bnQpOwotICAgIH0KLSAgaWYgKChiZmRfc2l6ZV90eXBlKSAob2Zmc2V0K2NvdW50KSA+IHNlY3Rpb24tPl9yYXdfc2l6ZQotICAgICAgfHwgKGJmZF9nZXRfZmlsZV93aW5kb3cgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIGNvdW50LCB3LCB0cnVlKQotCSAgPT0gZmFsc2UpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci0jZWxzZQotICBhYm9ydCAoKTsKLSNlbmRpZgotfQotCi0vKiBUaGlzIGdlbmVyaWMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgY3JlYXRpbmcKLSAgIE5FVyBzZWN0aW9ucyBpcyBkaXNhbGxvd2VkLiAgSXQgaXMgdXNlZnVsIGluIHBhdGNoaW5nIGV4aXN0aW5nIHNlY3Rpb25zCi0gICBpbiByZWFkLXdyaXRlIGZpbGVzLCB0aG91Z2guICBTZWUgb3RoZXIgc2V0X3NlY3Rpb25fY29udGVudHMgZnVuY3Rpb25zCi0gICB0byBzZWUgd2h5IGl0IGRvZXNuJ3Qgd29yayBmb3IgbmV3IHNlY3Rpb25zLiAgKi8KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpID09IC0xCi0gICAgICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAoYmZkX3NpemVfdHlwZSkgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2xvZzIKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2xvZzIoYmZkX3ZtYSB4KTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIGxvZyBiYXNlIDIgb2YgdGhlIHZhbHVlIHN1cHBsaWVkLCByb3VuZGVkIHVwLiAgRS5nLiwgYW4KLQlAdmFye3h9IG9mIDEwMjUgcmV0dXJucyAxMS4KLSovCi0KLXVuc2lnbmVkIGludAotYmZkX2xvZzIgKHgpCi0gICAgIGJmZF92bWEgeDsKLXsKLSAgdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7Ci0KLSAgd2hpbGUgKCgoKGJmZF92bWEpIDEpIDw8IHJlc3VsdCkgPCB4KQotICAgICsrcmVzdWx0OwotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sZWFuCi1iZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgbG9jYWxzX3ByZWZpeCA9IChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdfJykgPyAnTCcgOiAnLic7Ci0KLSAgcmV0dXJuIChuYW1lWzBdID09IGxvY2Fsc19wcmVmaXgpOwotfQotCi0vKiAgQ2FuIGJlIHVzZWQgZnJvbSAvIGZvciBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSB0byBjaGVjayB0aGF0Ci0gICAgZW5kaWFubmVzcyBtYXRjaGVzIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBmaWxlLiAgUmV0dXJucwotICAgIHRydWUgZm9yIGEgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBlbWl0cyBhbiBlcnJvci4gICovCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaCAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSgiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4iLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgYmZkX2JpZ19lbmRpYW4gKGliZmQpID8gImJpZyIgOiAibGl0dGxlIiwKLQkgYmZkX2JpZ19lbmRpYW4gKG9iZmQpID8gImJpZyIgOiAibGl0dGxlIik7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9saWJiZmQuaCBiL2JmZC9saWJiZmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjM2YzOC4uMDAwMDAwMAotLS0gYS9iZmQvbGliYmZkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OTUgKzAsMCBAQAotLyogbGliYmZkLmggLS0gRGVjbGFyYXRpb25zIHVzZWQgYnkgYmZkIGxpYnJhcnkgKmltcGxlbWVudGF0aW9uKi4KLSAgIChUaGlzIGluY2x1ZGUgZmlsZSBpcyBub3QgZm9yIHVzZXJzIG9mIHRoZSBsaWJyYXJ5LikKLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogbGliYmZkLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoaXMgZmlsZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbGlnbiBhbiBhZGRyZXNzIHVwd2FyZCB0byBhIGJvdW5kYXJ5LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gICBFLmcuIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSB3aXRoIGFyZ3VtZW50IG9mIDguICBUYWtlIGNhcmUgbmV2ZXIKLSAgIHRvIHdyYXAgYXJvdW5kIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBib3VuZGFyeS0xIG9mIHRoZSBlbmQgb2YgdGhlCi0gICBhZGRyZXNzIHNwYWNlLiAgKi8KLSNkZWZpbmUgQkZEX0FMSUdOKHRoaXMsIGJvdW5kYXJ5KQkJCQkJXAotICAoKCgoYmZkX3ZtYSkgKHRoaXMpICsgKGJvdW5kYXJ5KSAtIDEpID49IChiZmRfdm1hKSAodGhpcykpCQlcCi0gICA/ICgoKGJmZF92bWEpICh0aGlzKSArICgoYm91bmRhcnkpIC0gMSkpICYgKH4oKGJvdW5kYXJ5KS0xKSkpCVwKLSAgIDogfiAoYmZkX3ZtYSkgMCkKLQotLyogSWYgeW91IHdhbnQgdG8gcmVhZCBhbmQgd3JpdGUgbGFyZ2UgYmxvY2tzLCB5b3UgbWlnaHQgd2FudCB0byBkbyBpdAotICAgaW4gcXVhbnRhIG9mIHRoaXMgYW1vdW50ICovCi0jZGVmaW5lIERFRkFVTFRfQlVGRkVSU0laRSA4MTkyCi0KLS8qIFNldCBhIHRkYXRhIGZpZWxkLiAgQ2FuJ3QgdXNlIHRoZSBvdGhlciBtYWNyb3MgZm9yIHRoaXMsIHNpbmNlIHRoZXkKLSAgIGRvIGNhc3RzLCBhbmQgY2FzdGluZyB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50IGlzbid0IHBvcnRhYmxlLiAgKi8KLSNkZWZpbmUgc2V0X3RkYXRhKGJmZCwgdikgKChiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAodikpCi0KLS8qIElmIEJGRF9JTl9NRU1PUlkgaXMgc2V0IGZvciBhIEJGRCwgdGhlbiB0aGUgaW9zdHJlYW0gZmllbGRzIHBvaW50cwotICAgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYmZkX2luX21lbW9yeQotewotICAvKiBTaXplIG9mIGJ1ZmZlci4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogQnVmZmVyIGhvbGRpbmcgY29udGVudHMgb2YgQkZELiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLX07Ci0KLS8qIHRkYXRhIGZvciBhbiBhcmNoaXZlLiAgRm9yIGFuIGlucHV0IGFyY2hpdmUsIGNhY2hlCi0gICBuZWVkcyB0byBiZSBmcmVlKCknZC4gIEZvciBhbiBvdXRwdXQgYXJjaGl2ZSwgc3ltZGVmcyBkby4gICovCi0KLXN0cnVjdCBhcnRkYXRhIHsKLSAgZmlsZV9wdHIgZmlyc3RfZmlsZV9maWxlcG9zOwotICAvKiBTcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFybWFwICovCi0gIHN0cnVjdCBhcl9jYWNoZSAqY2FjaGU7Ci0gIGJmZCAqYXJjaGl2ZV9oZWFkOyAgICAgICAgICAgIC8qIE9ubHkgaW50ZXJlc3RpbmcgaW4gb3V0cHV0IHJvdXRpbmVzICovCi0gIGNhcnN5bSAqc3ltZGVmczsJCS8qIHRoZSBzeW1kZWYgZW50cmllcyAqLwotICBzeW1pbmRleCBzeW1kZWZfY291bnQ7ICAgICAgICAgICAgIC8qIGhvdyBtYW55IHRoZXJlIGFyZSAqLwotICBjaGFyICpleHRlbmRlZF9uYW1lczsJCS8qIGNsZXZlciBpbnRlbCBleHRlbnNpb24gKi8KLSAgLyogd2hlbiBtb3JlIGNvbXBpbGVycyBhcmUgc3RhbmRhcmQgQywgdGhpcyBjYW4gYmUgYSB0aW1lX3QgKi8KLSAgbG9uZyAgYXJtYXBfdGltZXN0YW1wOwkvKiBUaW1lc3RhbXAgdmFsdWUgd3JpdHRlbiBpbnRvIGFybWFwLgotCQkJCSAgIFRoaXMgaXMgdXNlZCBmb3IgQlNEIGFyY2hpdmVzIHRvIGNoZWNrCi0JCQkJICAgdGhhdCB0aGUgdGltZXN0YW1wIGlzIHJlY2VudCBlbm91Z2gKLQkJCQkgICBmb3IgdGhlIEJTRCBsaW5rZXIgdG8gbm90IGNvbXBsYWluLAotCQkJCSAgIGp1c3QgYmVmb3JlIHdlIGZpbmlzaCB3cml0aW5nIGFuCi0JCQkJICAgYXJjaGl2ZS4gICovCi0gIGZpbGVfcHRyIGFybWFwX2RhdGVwb3M7CS8qIFBvc2l0aW9uIHdpdGhpbiBhcmNoaXZlIHRvIHNlZWsgdG8KLQkJCQkgICByZXdyaXRlIHRoZSBkYXRlIGZpZWxkLiAgKi8KLSAgUFRSIHRkYXRhOwkJCS8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotfTsKLQotI2RlZmluZSBiZmRfYXJkYXRhKGJmZCkgKChiZmQpLT50ZGF0YS5hb3V0X2FyX2RhdGEpCi0KLS8qIEdvZXMgaW4gYmZkJ3MgYXJlbHRfZGF0YSBzbG90ICovCi1zdHJ1Y3QgYXJlbHRkYXRhIHsKLSAgY2hhciAqIGFyY2hfaGVhZGVyOwkJCSAgICAgLyogaXQncyBhY3R1YWxseSBhIHN0cmluZyAqLwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7ICAgICAvKiBvY3RldHMgb2YgZmlsZXNpemUgbm90IGluY2x1ZGluZyBhcl9oZHIgKi8KLSAgY2hhciAqZmlsZW5hbWU7CQkJICAgICAvKiBudWxsLXRlcm1pbmF0ZWQgKi8KLX07Ci0KLSNkZWZpbmUgYXJlbHRfc2l6ZShiZmQpICgoKHN0cnVjdCBhcmVsdGRhdGEgKikoKGJmZCktPmFyZWx0X2RhdGEpKS0+cGFyc2VkX3NpemUpCi0KLWV4dGVybiBQVFIgYmZkX21hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3JlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3ptYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLWV4dGVybiBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIF9iZmRfZXJyb3JfaGFuZGxlcjsKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgYW5kIGZyZWUgdGhpbmdzIG9uIHRoZSBCRkQncyBvYmphbGxvYy4gICovCi0KLWV4dGVybiBQVFIgYmZkX2FsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3phbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBiZmRfcmVsZWFzZSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLWJmZCAqCV9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCBQQVJBTVMgKChiZmQgKm9iZmQpKTsKLWJmZCAqCV9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIFBBUkFNUyAoKGJmZCAqYXJjaF9iZmQsIGZpbGVfcHRyIGluZGV4KSk7Ci1ib29sZWFuIF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkICopKTsKLWJvb2xlYW4JX2JmZF9nZW5lcmljX21rYXJjaGl2ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKmJmZF9nZW5lcmljX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JYmZkX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBiZmRfc2x1cnBfYnNkX2FybWFwX2YyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBiZmRfc2x1cnBfYnNkX2FybWFwIGJmZF9zbHVycF9hcm1hcAotI2RlZmluZSBiZmRfc2x1cnBfY29mZl9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLWJvb2xlYW4JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1ib29sZWFuCV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50IGVsZW5ndGgpKTsKLWJmZCAqX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICphcmNoaXZlLCBmaWxlX3B0ciBmaWxlcG9zKSk7Ci1leHRlcm4gYmZkICpfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLWJmZCAqIF9iZmRfbmV3X2JmZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJvb2xlYW4JYmZkX2ZhbHNlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1ib29sZWFuCWJmZF90cnVlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1QVFIJYmZkX251bGx2b2lkcHRyIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1pbnQJYmZkXzAgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXVuc2lnbmVkIGludAliZmRfMHUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJYmZkXzBsIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCV9iZmRfbjEgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXZvaWQJYmZkX3ZvaWQgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLQotYmZkICpfYmZkX25ld19iZmRfY29udGFpbmVkX2luIFBBUkFNUyAoKGJmZCAqKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpfYmZkX2R1bW15X3RhcmdldCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZAliZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfZ251X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLQotYm9vbGVhbglic2Rfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1ib29sZWFuCWNvZmZfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotYmZkICoJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwKLQkJCQkJCSAgICAgYmZkICpsYXN0X2ZpbGUpKTsKLQotaW50CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLQotI2RlZmluZSBfYmZkX3JlYWRfYXJfaGRyKGFiZmQpIFwKLSAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVhZF9hcl9oZHJfZm4sIChhYmZkKSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9HRU5FUklDLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3dpbmRvdyAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09QWS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSkgYmZkX3RydWUpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09SRSB3aGVuIHRoZXJlIGlzIG5vIGNvcmUgZmlsZQotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSkuICAqLwotCi1leHRlcm4gY2hhciAqX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHdoZW4gdGhlcmUgaXMgbm8gYXJjaGl2ZQotICAgZmlsZSBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfYXJtYXAgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjaGFyICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX2ZhbHNlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQlNEIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9hcm1hcCBiZmRfc2x1cnBfYnNkX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfdHJ1bmNhdGVfYXJuYW1lIGJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IENPRkYgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2NvZmZfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3dyaXRlX2FybWFwIGNvZmZfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgd2hlcmUgdGhlcmUgaXMgbm8gc3ltYm9sCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21ha2VfZW1wdHlfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8gXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubyBcCi0gICgoYWxlbnQgKigqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwgXAotCSAgICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIHdoZW4gdGhlcmUgaXMgbm8gcmVsb2MKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFIGZvciB0YXJnZXRzIHdoaWNoIG1heSBub3QKLSAgIGJlIHdyaXR0ZW4uICBVc2UgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfbm93cml0ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfYXJjaF9tYWNoIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpKSBcCi0gICBiZmRfZmFsc2UpCi0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0xJTksgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBzdXBwb3J0IGxpbmtpbmcuICBVc2UgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLiAgKi8KLQotI2RlZmluZSBfYmZkX25vbGlua19zaXplb2ZfaGVhZGVycyAoKGludCAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKSkgYmZkXzApCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICAoKGJmZF9ieXRlICooKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgXAotCSAgICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19hZGRfc3ltYm9scyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZmluYWxfbGluayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19zcGxpdF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF9mYWxzZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgaGF2ZSBkeW5hbWljIHN5bWJvbHMgb3IgcmVsb2NzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLSAgIChfYmZkX25vZHluYW1pYykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZSB0byBkZXRlcm1pbmUgb2YgdGhlIGdpdmVuIHN5bWJvbCBpcyBhIGxvY2FsCi0gICBsYWJlbC4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogR2VuZXJpYyBtaW5pc3ltYm9sIHJvdXRpbmVzLiAgKi8KLWV4dGVybiBsb25nIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBhc3ltYm9sICpfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbiAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFkZXJzdCBsaW5lIHVzaW5nIERXQVJGIDEgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyBEV0FSRiAyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEEgcm91dGluZSB0byBjcmVhdGUgZW50cmllcyBmb3IgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi0vKiBJbml0aWFsaXplIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgY3JlYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQgYnkgdGFyZ2V0cyBmb3IKLSAgIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZSwKLSAgIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFyY2hpdmUgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgYm9vbGVhbiAoKmNoZWNrZm4pIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpOwotCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBwcm90b3R5cGUgZXJyb3JzLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgX2JmZF9saW5rX2hhc2hfZW50cnk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZSB0byBhZGQgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICpuYW1lLCBmbGFnd29yZCwKLQkgICBhc2VjdGlvbiAqLCBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY29weSwKLQkgICBib29sZWFuIGNvbnN0cnVjdG9yLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHZW5lcmljIGxpbmsgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotLyogR2VuZXJpYyByZWxvY19saW5rX29yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsb2MgZW50cmllcyBpbiBhIGxpbmsgb3JkZXIgbGlzdC4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRmluYWwgbGluayByZWxvY2F0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBiZmRfdm1hIGFkZHJlc3MsIGJmZF92bWEgdmFsdWUsIGJmZF92bWEgYWRkZW5kKSk7Ci0KLS8qIFJlbG9jYXRlIGEgcGFydGljdWxhciBsb2NhdGlvbiBieSBhIGhvd3RvIGFuZCBhIHZhbHVlLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIExpbmsgc3RhYnMgaW4gc2VjdGlvbnMgaW4gdGhlIGZpcnN0IHBhc3MuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIGFzZWN0aW9uICosIFBUUiAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX2J5dGUgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHN0cmluZyB0YWJsZSB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgUFRSICopKTsKLQotLyogRmluZCBhbiBvZmZzZXQgd2l0aGluIGEgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4KLSAgIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF92bWEpKTsKLQotLyogQ3JlYXRlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ3JlYXRlIGFuIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uIHN0eWxlIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZyZWUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9zdHJpbmd0YWJfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX3NpemUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9hZGQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gaGFzaCwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RyaW5ndGFiX2VtaXQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBDaGVjayB0aGF0IGVuZGlhbm5lc3Mgb2YgaW5wdXQgYW5kIG91dHB1dCBmaWxlIG1hdGNoLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotDAotLyogTWFjcm9zIHRvIHRlbGwgaWYgYmZkcyBhcmUgcmVhZCBvciB3cml0ZSBlbmFibGVkLgotCi0gICBOb3RlIHRoYXQgYmZkcyBvcGVuIGZvciByZWFkIG1heSBiZSBzY3JpYmJsZWQgaW50byBpZiB0aGUgZmQgcGFzc2VkCi0gICB0byBiZmRfZmRvcGVuciBpcyBhY3R1YWxseSBvcGVuIGJvdGggZm9yIHJlYWQgYW5kIHdyaXRlCi0gICBzaW11bHRhbmVvdXNseS4gIEhvd2V2ZXIgYW4gb3V0cHV0IGJmZCB3aWxsIG5ldmVyIGJlIG9wZW4gZm9yCi0gICByZWFkLiAgVGhlcmVmb3JlIHNvbWV0aW1lcyB5b3Ugd2FudCB0byBjaGVjayBiZmRfcmVhZF9wIG9yCi0gICAhYmZkX3JlYWRfcCwgYW5kIG9ubHkgc29tZXRpbWVzIGJmZF93cml0ZV9wLgotKi8KLQotI2RlZmluZQliZmRfcmVhZF9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSByZWFkX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLSNkZWZpbmUJYmZkX3dyaXRlX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLQotdm9pZAliZmRfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIqLGludCkpOwotCi0jZGVmaW5lIEJGRF9BU1NFUlQoeCkgXAoteyBpZiAoISh4KSkgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotI2RlZmluZSBCRkRfRkFJTCgpIFwKLXsgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotRklMRSAqCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKiBMaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXQgdmVjdG9ycywgYW5kIHRoZSBkZWZhdWx0IHZlY3RvciAoaWYKLSAgIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBpcyBOVUxMLCB0aGVyZSBpcyBubyBkZWZhdWx0KS4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW107Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW107Ci0KLS8qIEZ1bmN0aW9ucyBzaGFyZWQgYnkgdGhlIEVDT0ZGIGFuZCBNSVBTIEVMRiBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZTsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwKLQkgICBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci0KLWV4dGVybiBiZmRfdm1hIF9iZmRfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotCi0vKiBGdW5jdGlvbiBzaGFyZWQgYnkgdGhlIENPRkYgYW5kIEVMRiBTSCBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJvb2xlYW4gKCopIChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSwKLQkgICBQVFIsIGJmZF92bWEgKiosIGJmZF92bWEgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZvbGxvd3MgKi8KLQotdm9pZCAKLWJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IFBBUkFNUyAoKGJmZCAqYWJmZCwgIGludCBpKSk7Ci0KLXVuc2lnbmVkIGludCAKLWJmZF9sb2cyIFBBUkFNUyAoKGJmZF92bWEgeCkpOwotCi0jZGVmaW5lIEJGRF9DQUNIRV9NQVhfT1BFTiAxMAotZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLSNkZWZpbmUgYmZkX2NhY2hlX2xvb2t1cCh4KSBcCi0gICAgKCh4KT09YmZkX2xhc3RfY2FjaGU/IFwKLSAgICAgIChGSUxFKikoYmZkX2xhc3RfY2FjaGUtPmlvc3RyZWFtKTogXAotICAgICAgIGJmZF9jYWNoZV9sb29rdXBfd29ya2VyKHgpKQotYm9vbGVhbiAKLWJmZF9jYWNoZV9pbml0ICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWJmZF9jYWNoZV9jbG9zZSAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLUZJTEUqIAotYmZkX29wZW5fZmlsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotRklMRSAqCi1iZmRfY2FjaGVfbG9va3VwX3dvcmtlciBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotI2lmZGVmIF9CRkRfTUFLRV9UQUJMRV9iZmRfcmVsb2NfY29kZV9yZWFsCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBiZmRfcmVsb2NfY29kZV9yZWFsX25hbWVzW10gPSB7ICJAQHVuaW5pdGlhbGl6ZWRAQCIsCi0KLSAgIkJGRF9SRUxPQ182NCIsCi0gICJCRkRfUkVMT0NfMzIiLAotICAiQkZEX1JFTE9DXzI2IiwKLSAgIkJGRF9SRUxPQ18yNCIsCi0gICJCRkRfUkVMT0NfMTYiLAotICAiQkZEX1JFTE9DXzE0IiwKLSAgIkJGRF9SRUxPQ184IiwKLSAgIkJGRF9SRUxPQ182NF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DXzI0X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTJfUENSRUwiLAotICAiQkZEX1JFTE9DXzhfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTZfR09UX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ184X0dPVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ18xNl9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0xPMTZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfOF9HT1RPRkYiLAotICAiQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMjRfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18xNl9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzhfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9QTFRPRkYiLAotICAiQkZEX1JFTE9DXzE2X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfTE8xNl9QTFRPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1NfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ184X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfNjhLX0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ182OEtfSk1QX1NMT1QiLAotICAiQkZEX1JFTE9DXzY4S19SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfMzJfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfMTZfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfTE8xNl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19ISTE2X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ184X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX1JWQSIsCi0gICJCRkRfUkVMT0NfOF9GRm5uIiwKLSAgIkJGRF9SRUxPQ18zMl9QQ1JFTF9TMiIsCi0gICJCRkRfUkVMT0NfMTZfUENSRUxfUzIiLAotICAiQkZEX1JFTE9DXzIzX1BDUkVMX1MyIiwKLSAgIkJGRF9SRUxPQ19ISTIyIiwKLSAgIkJGRF9SRUxPQ19MTzEwIiwKLSAgIkJGRF9SRUxPQ19HUFJFTDE2IiwKLSAgIkJGRF9SRUxPQ19HUFJFTDMyIiwKLSAgIkJGRF9SRUxPQ19JOTYwX0NBTExKIiwKLSAgIkJGRF9SRUxPQ19OT05FIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19XRElTUDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQzIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQzEzIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HT1QxMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR09UMTMiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dPVDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQzEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQzIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19XUExUMzAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0NPUFkiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DX1NQQVJDX1VBMzIiLAotICAiQkZEX1JFTE9DX1NQQVJDX0JBU0UxMyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfQkFTRTIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ18xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfMTEiLAotICAiQkZEX1JFTE9DX1NQQVJDX09MTzEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19ISDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19ITTEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19MTTIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQ19ISDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19XRElTUDE2IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19XRElTUDE5IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ183IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ182IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ181IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QTFQ2NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSElYMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX0xPWDEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19INDQiLAotICAiQkZEX1JFTE9DX1NQQVJDX000NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTDQ0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUkVWMzIiLAotICAiQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2IiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfR1BESVNQIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfTElUVVNFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9ISU5UIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiIsCi0gICJCRkRfUkVMT0NfTUlQU19KTVAiLAotICAiQkZEX1JFTE9DX01JUFMxNl9KTVAiLAotICAiQkZEX1JFTE9DX01JUFMxNl9HUFJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TIiwKLSAgIkJGRF9SRUxPQ19MTzE2IiwKLSAgIkJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MiLAotICAiQkZEX1JFTE9DX1BDUkVMX0xPMTYiLAotICAiQkZEX1JFTE9DX01JUFNfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1QxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19DQUxMMTYiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0hJMTYiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0xPMTYiLAotICAiQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19TVUIiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX1BBR0UiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX09GU1QiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0RJU1AiLAotCi0gICJCRkRfUkVMT0NfMzg2X0dPVDMyIiwKLSAgIkJGRF9SRUxPQ18zODZfUExUMzIiLAotICAiQkZEX1JFTE9DXzM4Nl9DT1BZIiwKLSAgIkJGRF9SRUxPQ18zODZfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QiLAotICAiQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfMzg2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMzg2X0dPVFBDIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fOCIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzE2IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMzIiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF84IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzE2IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzMyIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX1BQQ19CMjYiLAotICAiQkZEX1JFTE9DX1BQQ19CQTI2IiwKLSAgIkJGRF9SRUxPQ19QUENfVE9DMTYiLAotICAiQkZEX1JFTE9DX1BQQ19CMTYiLAotICAiQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0JBMTYiLAotICAiQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOIiwKLSAgIkJGRF9SRUxPQ19QUENfQ09QWSIsCi0gICJCRkRfUkVMT0NfUFBDX0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ19QUENfSk1QX1NMT1QiLAotICAiQkZEX1JFTE9DX1BQQ19SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQyIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTyIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTCIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9TREEyMSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8iLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEkiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRCIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEiLAotICAiQkZEX1JFTE9DX0NUT1IiLAotICAiQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0giLAotICAiQkZEX1JFTE9DX0FSTV9JTU1FRElBVEUiLAotICAiQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURSIsCi0gICJCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9TSElGVF9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9TV0kiLAotICAiQkZEX1JFTE9DX0FSTV9NVUxUSSIsCi0gICJCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9BRFJfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fTERSX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FSTV9JTl9QT09MIiwKLSAgIkJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTgiLAotICAiQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9BREQiLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVCIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVDEyIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UMzIiLAotICAiQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QiLAotICAiQkZEX1JFTE9DX0FSTV9DT1BZIiwKLSAgIkJGRF9SRUxPQ19BUk1fR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DX0FSTV9QTFQzMiIsCi0gICJCRkRfUkVMT0NfQVJNX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UUEMiLAotICAiQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIiLAotICAiQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00Qlk0IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04Qlk0IiwKLSAgIkJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIiLAotICAiQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCIsCi0gICJCRkRfUkVMT0NfU0hfU1dJVENIMTYiLAotICAiQkZEX1JFTE9DX1NIX1NXSVRDSDMyIiwKLSAgIkJGRF9SRUxPQ19TSF9VU0VTIiwKLSAgIkJGRF9SRUxPQ19TSF9DT1VOVCIsCi0gICJCRkRfUkVMT0NfU0hfQUxJR04iLAotICAiQkZEX1JFTE9DX1NIX0NPREUiLAotICAiQkZEX1JFTE9DX1NIX0RBVEEiLAotICAiQkZEX1JFTE9DX1NIX0xBQkVMIiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5IiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiIsCi0gICJCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMiLAotICAiQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwiLAotICAiQkZEX1JFTE9DX0FSQ19CMjYiLAotICAiQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MIiwKLSAgIkJGRF9SRUxPQ19EMTBWXzE4IiwKLSAgIkJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzYiLAotICAiQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IiLAotICAiQkZEX1JFTE9DX0QzMFZfMTUiLAotICAiQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwiLAotICAiQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMSIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzMyIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzI0IiwKLSAgIkJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0xPMTYiLAotICAiQkZEX1JFTE9DX00zMlJfU0RBMTYiLAotICAiQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUIiwKLQotICAiQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX01OMTAzMDBfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX1RJQzMwX0xEUCIsCi0gICJCRkRfUkVMT0NfRlIzMF80OCIsCi0gICJCRkRfUkVMT0NfRlIzMF8yMCIsCi0gICJCRkRfUkVMT0NfRlIzMF82X0lOXzQiLAotICAiQkZEX1JFTE9DX0ZSMzBfOF9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzlfSU5fOCIsCi0gICJCRkRfUkVMT0NfRlIzMF8xMF9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzlfUENSRUwiLAotICAiQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMiIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9SVkEiLAotICAiQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIiwKLSAgIkJGRF9SRUxPQ19WVEFCTEVfRU5UUlkiLAotICJAQG92ZXJmbG93OiBCRkRfUkVMT0NfVU5VU0VEQEAiLAotfTsKLSNlbmRpZgotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGUpKTsKLQotYm9vbGVhbiAKLWJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICBib29sZWFuICopKTsKLQotYm9vbGVhbiAKLWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotYmZkX2J5dGUgKgotCi1iZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKLSAgICBiZmRfYnl0ZSAqZGF0YSwKLSAgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLSAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICphYmZkLAotICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotICAgIHVuc2lnbmVkIGxvbmcgbWFjaCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2RlZmF1bHRfY29tcGF0aWJsZQotIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYSwKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmIpKTsKLQotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKgotYmZkX2VsZl9maW5kX3NlY3Rpb24gIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqbmFtZSkpOwotCmRpZmYgLS1naXQgYS9iZmQvbGliY29mZi1pbi5oIGIvYmZkL2xpYmNvZmYtaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMjEyMS4uMDAwMDAwMAotLS0gYS9iZmQvbGliY29mZi1pbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qIEJGRCBDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJjb2ZmLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJjb2ZmLWluLmggb3IgY29mZmNvZGUuaC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiBPYmplY3QgZmlsZSB0ZGF0YTsgYWNjZXNzIG1hY3JvcyAqLwotCi0jZGVmaW5lIGNvZmZfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmNvZmZfb2JqX2RhdGEpCi0jZGVmaW5lIGV4ZWNfaGRyKGJmZCkJCShjb2ZmX2RhdGEoYmZkKS0+aGRyKQotI2RlZmluZSBvYmpfcGUoYmZkKSAgICAgICAgICAgICAoY29mZl9kYXRhKGJmZCktPnBlKQotI2RlZmluZSBvYmpfc3ltYm9scyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltYm9scykKLSNkZWZpbmUJb2JqX3N5bV9maWxlcG9zKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1fZmlsZXBvcykKLQotI2RlZmluZSBvYmpfcmVsb2NiYXNlKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yZWxvY2Jhc2UpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50cyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudHMpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50X2NvdW50KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50X2NvdW50KQotI2RlZmluZSBvYmpfY29udmVydChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+Y29udmVyc2lvbl90YWJsZSkKLSNkZWZpbmUgb2JqX2NvbnZfdGFibGVfc2l6ZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+Y29udl90YWJsZV9zaXplKQotCi0jZGVmaW5lIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5leHRlcm5hbF9zeW1zKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N5bXMoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX3N0cmluZ3MoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5zdHJpbmdzKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N0cmluZ3MoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX3N5bV9oYXNoZXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5zeW1faGFzaGVzKQotCi0jZGVmaW5lIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+bG9jYWxfdG9jX3N5bV9tYXApCi0KLS8qIGBUZGF0YScgaW5mb3JtYXRpb24ga2VwdCBmb3IgQ09GRiBmaWxlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfdGRhdGEKLXsKLSAgc3RydWN0ICAgY29mZl9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLwotICB1bnNpZ25lZCBpbnQgKmNvbnZlcnNpb25fdGFibGU7Ci0gIGludCBjb252X3RhYmxlX3NpemU7Ci0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotCi0gIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd19zeW1lbnRzOwotICB1bnNpZ25lZCBpbnQgcmF3X3N5bWVudF9jb3VudDsKLQotICAvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBvbmNlIHdyaXRpbmcgaGFzIGJlZ3VuICovCi0gIGxvbmcgaW50IHJlbG9jYmFzZTsKLQotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbCB0YWJsZQotICAgICB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycgdW5mb3J0dW5hdGVseSB2YXJ5Ci0gICAgIGZyb20gY29mZiBpbXBsZW1lbnRhdGlvbiB0byBpbXBsZW1lbnRhdGlvbi4uLiAgKi8KLSAgdW5zaWduZWQgbG9jYWxfbl9idG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBsb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX3RzaGlmdDsKLSAgdW5zaWduZWQgbG9jYWxfc3ltZXN6OwotICB1bnNpZ25lZCBsb2NhbF9hdXhlc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2xpbmVzejsKLQotICAvKiBUaGUgdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbHMuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLiAgKi8KLSAgUFRSIGV4dGVybmFsX3N5bXM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGV4dGVybmFsX3N5bXMgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zeW1zOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLiAgKi8KLSAgY2hhciAqc3RyaW5nczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgc3RyaW5ncyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N0cmluZ3M7Ci0KLSAgLyogaXMgdGhpcyBhIFBFIGZvcm1hdCBjb2ZmIGZpbGUgKi8KLSAgaW50IHBlOwotICAvKiBVc2VkIGJ5IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiB1c2VkIGJ5IHRoZSBwZSBsaW5rZXIgZm9yIFBvd2VyUEMgKi8KLSAgaW50ICpsb2NhbF90b2Nfc3ltX21hcDsKLQotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotCi0gIC8qIFVzZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogQ29weSBvZiBzb21lIG9mIHRoZSBmX2ZsYWdzIGJpdHMgaW4gdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsCi0gICAgIHVzZWQgYnkgQVJNIGNvZGUuICAqLwotICBmbGFnd29yZCBmbGFnczsKLQotfSBjb2ZmX2RhdGFfdHlwZTsKLQotLyogVGRhdGEgZm9yIHBlIGltYWdlIGZpbGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgcGVfdGRhdGEKLXsKLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGVfb3B0aGRyOwotICBpbnQgZGxsOwotICBpbnQgaGFzX3JlbG9jX3NlY3Rpb247Ci0gIGJvb2xlYW4gKCppbl9yZWxvY19wKSBQQVJBTVMoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKLSAgZmxhZ3dvcmQgcmVhbF9mbGFnczsKLX0gcGVfZGF0YV90eXBlOwotCi0jZGVmaW5lIHBlX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5wZV9vYmpfZGF0YSkKLQotLyogVGRhdGEgZm9yIFhDT0ZGIGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX3RkYXRhCi17Ci0gIC8qIEJhc2ljIENPRkYgaW5mb3JtYXRpb24uICAqLwotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotCi0gIC8qIFRydWUgaWYgYSBsYXJnZSBhLm91dCBoZWFkZXIgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCi0gIGJvb2xlYW4gZnVsbF9hb3V0aGRyOwotCi0gIC8qIFRPQyB2YWx1ZS4gICovCi0gIGJmZF92bWEgdG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBUT0MuICAqLwotICBpbnQgc250b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIGVudHJ5IHBvaW50LiAgKi8KLSAgaW50IHNuZW50cnk7Ci0KLSAgLyogLnRleHQgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IHRleHRfYWxpZ25fcG93ZXI7Ci0KLSAgLyogLmRhdGEgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IGRhdGFfYWxpZ25fcG93ZXI7Ci0KLSAgLyogbW9kdHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IG1vZHR5cGU7Ci0KLSAgLyogY3B1dHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IGNwdXR5cGU7Ci0KLSAgLyogbWF4ZGF0YSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4ZGF0YTsKLQotICAvKiBtYXhzdGFjayBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4c3RhY2s7Ci0KLSAgLyogVXNlZCBieSB0aGUgWENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kaWNlczsKLSAgdW5zaWduZWQgaW50IGltcG9ydF9maWxlX2lkOwotfTsKLQotI2RlZmluZSB4Y29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLnhjb2ZmX29ial9kYXRhKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAqIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBjb2Zmc3ltYm9sKGFzeW1ib2wpICgoY29mZl9zeW1ib2xfdHlwZSAqKSgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBUaGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgYSBzZWN0aW9uIG1heSBiZSBzZXQgdG8gYSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHJlbG9jcywgc3dhcHBlZCBpbnRvIENPRkYgaW50ZXJuYWwgZm9ybS4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgcmVsb2NzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfcmVsb2NzOwotICAvKiBUaGUgc2VjdGlvbiBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGNvbnRlbnRzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfY29udGVudHM7Ci0gIC8qIEluZm9ybWF0aW9uIGNhY2hlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBjaGFyICpmdW5jdGlvbjsKLSAgaW50IGxpbmVfYmFzZTsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEF2YWlsYWJsZSBmb3IgaW5kaXZpZHVhbCBiYWNrZW5kcy4gICovCi0gIFBUUiB0ZGF0YTsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gWENPRkYgZmlsZXMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFVzZWQgZm9yIFhDT0ZGIGNzZWN0cyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXI7IHBvaW50cyB0byB0aGUgcmVhbAotICAgICBYQ09GRiBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoaXMgY3NlY3QuICAqLwotICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotICAvKiBUaGUgbGluZW5vX2NvdW50IGZpZWxkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24sIGJlY2F1c2Ugd2UgYXJlCi0gICAgIGdvaW5nIHRvIGNsb2JiZXIgaXQgdGhlcmUuICAqLwotICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotICAvKiBUaGUgZmlyc3QgYW5kIG9uZSBwYXN0IHRoZSBsYXN0IHN5bWJvbCBpbmRpY2VzIGZvciBzeW1ib2xzIHVzZWQKLSAgICAgYnkgdGhpcyBjc2VjdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc3ltbmR4OwotICB1bnNpZ25lZCBsb25nIGxhc3Rfc3ltbmR4OwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gdGhlIHhjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBQRUkgaW1hZ2UgZmlsZXMuICAqLwotCi1zdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgdmlydF9zaXplOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBwZWlfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICBTZXQgdG8gLTEgaW5pdGlhbGx5LiAgU2V0IHRvIC0yIGlmCi0gICAgIHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgdHlwZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGNsYXNzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBjbGFzczsKLQotICAvKiBOdW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMuICAqLwotICBjaGFyIG51bWF1eDsKLQotICAvKiBCRkQgdG8gdGFrZSBhdXhpbGlhcnkgZW50cmllcyBmcm9tLiAgKi8KLSAgYmZkICphdXhiZmQ7Ci0KLSAgLyogUG9pbnRlciB0byBhcnJheSBvZiBhdXhpbGlhcnkgZW50cmllcywgaWYgYW55LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXg7Ci19OwotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3Qgc2VjICpjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggUEFSQU1TICgoYmZkICosIGludCkpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBpbnQgY29mZl9jb3VudF9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNvZmZfc3ltYm9sX2Zyb20gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9yZW51bWJlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9tYW5nbGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYWxlbnQgKmNvZmZfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9zZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosCi0JCQkJICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLWV4dGVybiB2b2lkIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCSAgc3ltYm9sX2luZm8gKnJldCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBhc3ltYm9sICoqLAotCQkJCQkgICAgICAgYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyKSk7Ci1leHRlcm4gaW50IGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gcmVsb2MpKTsKLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1leHRlcm4gYmZkX2J5dGUgKmJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGJmZF92bWEgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgUEFSQU1TICgoYXJlbGVudCAqLAotCQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgIGFzZWN0aW9uICopKTsKLWV4dGVybiB2b2lkIGJmZF9wZXJmb3JtX3NsaXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgc2xpcCwKLQkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfdm1hIHZhbCkpOwotCi0vKiBGdW5jdGlvbnMgYW5kIHR5cGVzIGluIGNvZmZsaW5rLmMuICAqLwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gbWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCwgYW5kIHVuaW9uCi0gICBkZWZpbml0aW9ucyBpbiB0aGUgbGlua2VyLiAgKi8KLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgZWxlbWVudCAoYW4gZW51bSB2YWx1ZSwgYQotICAgc3RydWN0dXJlIG9yIHVuaW9uIGZpZWxkKSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQKLXsKLSAgLyogTmV4dCBlbGVtZW50LiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbmV4dDsKLQotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUeXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGZvciBjb21wbGV4IHR5cGUuICAqLwotICBsb25nIHRhZ25keDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgZGVidWcgbWVyZ2UgZW50cmllcyBmb3IgYSBnaXZlbiBuYW1lLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZQotewotICAvKiBOZXh0IHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbmV4dDsKLQotICAvKiBDbGFzcyBvZiB0eXBlLiAgKi8KLSAgaW50IGNsYXNzOwotCi0gIC8qIFN5bWJvbCBpbmRleCB3aGVyZSB0aGlzIHR5cGUgaXMgZGVmaW5lZC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBMaXN0IG9mIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqZWxlbWVudHM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBzdG9yZSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogQSBsaXN0IG9mIHR5cGVzIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqdHlwZXM7Ci19OwotCi0vKiBUaGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJih0YWJsZSktPnJvb3QsIF9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpKQotCi0vKiBGcmVlIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0YWJsZSktPnJvb3QpKQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdoZW4gZG9pbmcKLSAgIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaGVzOwotfTsKLQotLyogSW5mb3JtYXRpb24gdGhhdCB3ZSBwYXNzIGFyb3VuZCB3aGlsZSBkb2luZyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBVc2VkIHRvIGluZGljYXRlIGZhaWx1cmUgaW4gdHJhdmVyc2FsIHJvdXRpbmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLSAgLyogSWYgZG9pbmcgInRhc2sgbGlua2luZyIgc2V0IG9ubHkgZHVyaW5nIHRoZSB0aW1lIHdoZW4gd2Ugd2FudCB0aGUKLSAgICAgZ2xvYmFsIHN5bWJvbCB3cml0ZXIgdG8gY29udmVydCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBkZWZpbmVkIGdsb2JhbAotICAgICBzeW1ib2xzIGZyb20gZ2xvYmFsIHRvIHN0YXRpYy4gKi8KLSAgYm9vbGVhbiBnbG9iYWxfdG9fc3RhdGljOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvcgotICAgICBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZSB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqc2VjdGlvbl9pbmZvOwotICAvKiBTeW1ib2wgaW5kZXggb2YgbGFzdCBDX0ZJTEUgc3ltYm9sICgtMSBpZiBub25lKS4gICovCi0gIGxvbmcgbGFzdF9maWxlX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0IENfRklMRSBzeW1ib2wuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGxhc3RfZmlsZTsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGZpcnN0IGF1eCBlbnRyeSBvZiBsYXN0IC5iZiBzeW1ib2wgd2l0aCBhbiBlbXB0eQotICAgICBlbmRuZHggZmllbGQgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2JmX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0X2JmX2luZGV4IGF1eCBlbnRyeS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCBsYXN0X2JmOwotICAvKiBIYXNoIHRhYmxlIHVzZWQgdG8gbWVyZ2UgZGVidWcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlIGRlYnVnX21lcmdlOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHNlY3Rpb25zIG9mIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBhc2VjdGlvbiAqKnNlY19wdHJzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKl9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscwotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotCi0jZGVmaW5lIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0vKiBGdW5jdGlvbnMgaW4geGNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotLyogRnVuY3Rpb25zIGluIGNvZmYtcHBjLmMuICBGSVhNRTogVGhlc2UgYXJlIGNhbGxlZCBiZSBwZS5lbSBpbiB0aGUKLSAgIGxpbmtlciwgYW5kIHNvIHNob3VsZCBzdGFydCB3aXRoIGJmZCBhbmQgYmUgZGVjbGFyZWQgaW4gYmZkLmguICAqLwotCi1leHRlcm4gYm9vbGVhbiBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgdGFrZW4gZnJvbSB0aGUgc291cmNlIC4uICovCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJjb2ZmLmggYi9iZmQvbGliY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE4YTRkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ODggKzAsMCBAQAotLyogQkZEIENPRkYgb2JqZWN0IGZpbGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmNvZmYuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmNvZmYtaW4uaCBvciBjb2ZmY29kZS5oLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIE9iamVjdCBmaWxlIHRkYXRhOyBhY2Nlc3MgbWFjcm9zICovCi0KLSNkZWZpbmUgY29mZl9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuY29mZl9vYmpfZGF0YSkKLSNkZWZpbmUgZXhlY19oZHIoYmZkKQkJKGNvZmZfZGF0YShiZmQpLT5oZHIpCi0jZGVmaW5lIG9ial9wZShiZmQpICAgICAgICAgICAgIChjb2ZmX2RhdGEoYmZkKS0+cGUpCi0jZGVmaW5lIG9ial9zeW1ib2xzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1ib2xzKQotI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bV9maWxlcG9zKQotCi0jZGVmaW5lIG9ial9yZWxvY2Jhc2UoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJlbG9jYmFzZSkKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50cykKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRfY291bnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRfY291bnQpCi0jZGVmaW5lIG9ial9jb252ZXJ0KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5jb252ZXJzaW9uX3RhYmxlKQotI2RlZmluZSBvYmpfY29udl90YWJsZV9zaXplKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5jb252X3RhYmxlX3NpemUpCi0KLSNkZWZpbmUgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmV4dGVybmFsX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3ltcyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3ltcykKLSNkZWZpbmUgb2JqX2NvZmZfc3RyaW5ncyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPnN0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3RyaW5ncykKLSNkZWZpbmUgb2JqX2NvZmZfc3ltX2hhc2hlcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPnN5bV9oYXNoZXMpCi0KLSNkZWZpbmUgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5sb2NhbF90b2Nfc3ltX21hcCkKLQotLyogYFRkYXRhJyBpbmZvcm1hdGlvbiBrZXB0IGZvciBDT0ZGIGZpbGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl90ZGF0YQotewotICBzdHJ1Y3QgICBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7CS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIHVuc2lnbmVkIGludCAqY29udmVyc2lvbl90YWJsZTsKLSAgaW50IGNvbnZfdGFibGVfc2l6ZTsKLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3X3N5bWVudHM7Ci0gIHVuc2lnbmVkIGludCByYXdfc3ltZW50X2NvdW50OwotCi0gIC8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIG9uY2Ugd3JpdGluZyBoYXMgYmVndW4gKi8KLSAgbG9uZyBpbnQgcmVsb2NiYXNlOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJyB1bmZvcnR1bmF0ZWx5IHZhcnkKLSAgICAgZnJvbSBjb2ZmIGltcGxlbWVudGF0aW9uIHRvIGltcGxlbWVudGF0aW9uLi4uICAqLwotICB1bnNpZ25lZCBsb2NhbF9uX2J0bWFzazsKLSAgdW5zaWduZWQgbG9jYWxfbl9idHNoZnQ7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdHNoaWZ0OwotICB1bnNpZ25lZCBsb2NhbF9zeW1lc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2F1eGVzejsKLSAgdW5zaWduZWQgbG9jYWxfbGluZXN6OwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9scy4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMuICAqLwotICBQVFIgZXh0ZXJuYWxfc3ltczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgZXh0ZXJuYWxfc3ltcyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZS4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuICAqLwotICBjaGFyICpzdHJpbmdzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBzdHJpbmdzIG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfc3RyaW5nczsKLQotICAvKiBpcyB0aGlzIGEgUEUgZm9ybWF0IGNvZmYgZmlsZSAqLwotICBpbnQgcGU7Ci0gIC8qIFVzZWQgYnkgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIHVzZWQgYnkgdGhlIHBlIGxpbmtlciBmb3IgUG93ZXJQQyAqLwotICBpbnQgKmxvY2FsX3RvY19zeW1fbWFwOwotCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0KLSAgLyogVXNlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgUFRSIGxpbmVfaW5mbzsKLQotICAvKiBDb3B5IG9mIHNvbWUgb2YgdGhlIGZfZmxhZ3MgYml0cyBpbiB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwKLSAgICAgdXNlZCBieSBBUk0gY29kZS4gICovCi0gIGZsYWd3b3JkIGZsYWdzOwotCi19IGNvZmZfZGF0YV90eXBlOwotCi0vKiBUZGF0YSBmb3IgcGUgaW1hZ2UgZmlsZXMuICovCi10eXBlZGVmIHN0cnVjdCBwZV90ZGF0YQotewotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZV9vcHRoZHI7Ci0gIGludCBkbGw7Ci0gIGludCBoYXNfcmVsb2Nfc2VjdGlvbjsKLSAgYm9vbGVhbiAoKmluX3JlbG9jX3ApIFBBUkFNUygoYmZkICosIHJlbG9jX2hvd3RvX3R5cGUgKikpOwotICBmbGFnd29yZCByZWFsX2ZsYWdzOwotfSBwZV9kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgcGVfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLnBlX29ial9kYXRhKQotCi0vKiBUZGF0YSBmb3IgWENPRkYgZmlsZXMuICAqLwotCi1zdHJ1Y3QgeGNvZmZfdGRhdGEKLXsKLSAgLyogQmFzaWMgQ09GRiBpbmZvcm1hdGlvbi4gICovCi0gIGNvZmZfZGF0YV90eXBlIGNvZmY7Ci0KLSAgLyogVHJ1ZSBpZiBhIGxhcmdlIGEub3V0IGhlYWRlciBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KLSAgYm9vbGVhbiBmdWxsX2FvdXRoZHI7Ci0KLSAgLyogVE9DIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSB0b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIFRPQy4gICovCi0gIGludCBzbnRvYzsKLQotICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgZW50cnkgcG9pbnQuICAqLwotICBpbnQgc25lbnRyeTsKLQotICAvKiAudGV4dCBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgdGV4dF9hbGlnbl9wb3dlcjsKLQotICAvKiAuZGF0YSBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgZGF0YV9hbGlnbl9wb3dlcjsKLQotICAvKiBtb2R0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgbW9kdHlwZTsKLQotICAvKiBjcHV0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgY3B1dHlwZTsKLQotICAvKiBtYXhkYXRhIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhkYXRhOwotCi0gIC8qIG1heHN0YWNrIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhzdGFjazsKLQotICAvKiBVc2VkIGJ5IHRoZSBYQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0gIGFzZWN0aW9uICoqY3NlY3RzOwotICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRpY2VzOwotICB1bnNpZ25lZCBpbnQgaW1wb3J0X2ZpbGVfaWQ7Ci19OwotCi0jZGVmaW5lIHhjb2ZmX2RhdGEoYWJmZCkgKChhYmZkKS0+dGRhdGEueGNvZmZfb2JqX2RhdGEpCi0KLS8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICogbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbC4gICovCi0jZGVmaW5lIGNvZmZzeW1ib2woYXN5bWJvbCkgKChjb2ZmX3N5bWJvbF90eXBlICopKCYoKGFzeW1ib2wpLT50aGVfYmZkKSkpCi0KLS8qIFRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiBhIHNlY3Rpb24gbWF5IGJlIHNldCB0byBhIHBvaW50ZXIgdG8gdGhpcwotICAgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgcmVsb2NzLCBzd2FwcGVkIGludG8gQ09GRiBpbnRlcm5hbCBmb3JtLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSByZWxvY3MgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9yZWxvY3M7Ci0gIC8qIFRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgY29udGVudHMgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9jb250ZW50czsKLSAgLyogSW5mb3JtYXRpb24gY2FjaGVkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKmZ1bmN0aW9uOwotICBpbnQgbGluZV9iYXNlOwotICAvKiBBIHBvaW50ZXIgdXNlZCBmb3IgLnN0YWIgbGlua2luZyBvcHRpbWl6YXRpb25zLiAgKi8KLSAgUFRSIHN0YWJfaW5mbzsKLSAgLyogQXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGJhY2tlbmRzLiAgKi8KLSAgUFRSIHRkYXRhOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqKSAoc2VjKS0+dXNlZF9ieV9iZmQpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBYQ09GRiBmaWxlcy4gIFRoaXMgaXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLQotc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVXNlZCBmb3IgWENPRkYgY3NlY3RzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlcjsgcG9pbnRzIHRvIHRoZSByZWFsCi0gICAgIFhDT0ZGIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgdGhpcyBjc2VjdC4gICovCi0gIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0gIC8qIFRoZSBsaW5lbm9fY291bnQgZmllbGQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiwgYmVjYXVzZSB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gY2xvYmJlciBpdCB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0gIC8qIFRoZSBmaXJzdCBhbmQgb25lIHBhc3QgdGhlIGxhc3Qgc3ltYm9sIGluZGljZXMgZm9yIHN5bWJvbHMgdXNlZAotICAgICBieSB0aGlzIGNzZWN0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaXJzdF9zeW1uZHg7Ci0gIHVuc2lnbmVkIGxvbmcgbGFzdF9zeW1uZHg7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyB0aGUgeGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSB4Y29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKLQotLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFBFSSBpbWFnZSBmaWxlcy4gICovCi0KLXN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgdmlydHVhbCBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSB2aXJ0X3NpemU7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIHBlaV9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHBlaV9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIFN5bWJvbCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdHlwZTsKLQotICAvKiBTeW1ib2wgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGNsYXNzOwotCi0gIC8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcy4gICovCi0gIGNoYXIgbnVtYXV4OwotCi0gIC8qIEJGRCB0byB0YWtlIGF1eGlsaWFyeSBlbnRyaWVzIGZyb20uICAqLwotICBiZmQgKmF1eGJmZDsKLQotICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGF1eGlsaWFyeSBlbnRyaWVzLCBpZiBhbnkuICAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKLX07Ci0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogRnVuY3Rpb25zIGluIGNvZmZnZW4uYy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBzZWMgKmNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGludCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdCAqY29mZl9zeW1ib2xfZnJvbSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX21hbmdsZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBhbGVudCAqY29mZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX3NlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKmNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIGNvZmZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwKLQkJCQkgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOwotZXh0ZXJuIHZvaWQgY29mZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgIGFzeW1ib2wgKiosCi0JCQkJCSAgICAgICBiZmRfdm1hIG9mZnNldCwKLQkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKLWV4dGVybiBpbnQgY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiByZWxvYykpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLWV4dGVybiBiZmRfYnl0ZSAqYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYmZkX3ZtYSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosCi0JCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgYXNlY3Rpb24gKikpOwotZXh0ZXJuIHZvaWQgYmZkX3BlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF92bWEgdmFsKSk7Ci0KLS8qIEZ1bmN0aW9ucyBhbmQgdHlwZXMgaW4gY29mZmxpbmsuYy4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBtZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0LCBhbmQgdW5pb24KLSAgIGRlZmluaXRpb25zIGluIHRoZSBsaW5rZXIuICAqLwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHNpbmdsZSBlbGVtZW50IChhbiBlbnVtIHZhbHVlLCBhCi0gICBzdHJ1Y3R1cmUgb3IgdW5pb24gZmllbGQpIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudAotewotICAvKiBOZXh0IGVsZW1lbnQuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICpuZXh0OwotCi0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICAvKiBTeW1ib2wgaW5kZXggZm9yIGNvbXBsZXggdHlwZS4gICovCi0gIGxvbmcgdGFnbmR4OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiBkZWJ1ZyBtZXJnZSBlbnRyaWVzIGZvciBhIGdpdmVuIG5hbWUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlCi17Ci0gIC8qIE5leHQgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICpuZXh0OwotCi0gIC8qIENsYXNzIG9mIHR5cGUuICAqLwotICBpbnQgY2xhc3M7Ci0KLSAgLyogU3ltYm9sIGluZGV4IHdoZXJlIHRoaXMgdHlwZSBpcyBkZWZpbmVkLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIExpc3Qgb2YgZWxlbWVudHMuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICplbGVtZW50czsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIHN0b3JlIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBBIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICp0eXBlczsKLX07Ci0KLS8qIFRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9pbml0ICgmKHRhYmxlKS0+cm9vdCwgX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYykpCi0KLS8qIEZyZWUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9mcmVlICgmKHRhYmxlKS0+cm9vdCkpCi0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2hlbiBkb2luZwotICAgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoZSByZWxvY3MgdG8gYmUgb3V0cHV0LiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIEZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdob3NlIGluZGV4IHdhcyBub3Qga25vd24KLSAgICAgd2hlbiB0aGUgcmVsb2Mgd2FzIGhhbmRsZWQsIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFVzZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSBpbiB0cmF2ZXJzYWwgcm91dGluZS4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotICAvKiBJZiBkb2luZyAidGFzayBsaW5raW5nIiBzZXQgb25seSBkdXJpbmcgdGhlIHRpbWUgd2hlbiB3ZSB3YW50IHRoZQotICAgICBnbG9iYWwgc3ltYm9sIHdyaXRlciB0byBjb252ZXJ0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGRlZmluZWQgZ2xvYmFsCi0gICAgIHN5bWJvbHMgZnJvbSBnbG9iYWwgdG8gc3RhdGljLiAqLwotICBib29sZWFuIGdsb2JhbF90b19zdGF0aWM7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGtlcHQgZm9yCi0gICAgIGVhY2ggb3V0cHV0IHNlY3Rpb24sIGluZGV4ZWQgYnkgdGhlIHRhcmdldF9pbmRleCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgZmlyc3QgYXV4IGVudHJ5IG9mIGxhc3QgLmJmIHN5bWJvbCB3aXRoIGFuIGVtcHR5Ci0gICAgIGVuZG5keCBmaWVsZCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfYmZfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3RfYmZfaW5kZXggYXV4IGVudHJ5LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGxhc3RfYmY7Ci0gIC8qIEhhc2ggdGFibGUgdXNlZCB0byBtZXJnZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUgZGVidWdfbWVyZ2U7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc2VjdGlvbnMgb2Ygc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGFzZWN0aW9uICoqc2VjX3B0cnM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgaW5kaWNlcyBvZiBzeW1ib2xzIG9mIGFueQotICAgICBpbnB1dCBmaWxlLiAgKi8KLSAgbG9uZyAqc3ltX2luZGljZXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBmb3IgYW55IGlucHV0IGZpbGUuICAqLwotICBiZmRfYnl0ZSAqb3V0c3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxpbmUgbnVtYmVycyBmb3IgYW55IGlucHV0Ci0gICAgIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci19OwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bQotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0KLSNkZWZpbmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIEZ1bmN0aW9ucyBpbiB4Y29mZmxpbmsuYy4gICovCi0KLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi0vKiBGdW5jdGlvbnMgaW4gY29mZi1wcGMuYy4gIEZJWE1FOiBUaGVzZSBhcmUgY2FsbGVkIGJlIHBlLmVtIGluIHRoZQotICAgbGlua2VyLCBhbmQgc28gc2hvdWxkIHN0YXJ0IHdpdGggYmZkIGFuZCBiZSBkZWNsYXJlZCBpbiBiZmQuaC4gICovCi0KLWV4dGVybiBib29sZWFuIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBBbmQgbW9yZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgLi4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0Ci17Ci0KLSAgICAgICAgLyogUmVtZW1iZXJzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBmaWxlIGZvcgotICAgICAgICAgIHRoaXMgc3ltYm9sLiBHZW5lcmF0ZWQgYnkgY29mZl9yZW51bWJlcl9zeW1ib2xzLiAqLwotdW5zaWduZWQgaW50IG9mZnNldDsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuICBVc2VkIGZvcgotICAgICAgICAgIFhDT0ZGIENfQlNUQVQgc3ltYm9scy4gIFNldCBieSBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi11bnNpZ25lZCBpbnQgZml4X3ZhbHVlIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHRhZyBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfdGFnIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIGVuZGlkeCBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfZW5kIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHhfY3NlY3QueF9zY25sZW4gZmllbGQgYmUgcmVudW1iZXJlZC4KLSAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICovCi11bnNpZ25lZCBpbnQgZml4X3NjbmxlbiA6IDE7Ci0KLSAgICAgICAgLyogRml4IHVwIGFuIFhDT0ZGIENfQklOQ0wvQ19FSU5DTCBzeW1ib2wuICBUaGUgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIFNldCBieQotICAgICAgICAgIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKi8KLXVuc2lnbmVkIGludCBmaXhfbGluZSA6IDE7Ci0KLSAgICAgICAgLyogVGhlIGNvbnRhaW5lciBmb3IgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgcmVhZCBhbmQgdHJhbnNsYXRlZAotICAgICAgICAgICBmcm9tIHRoZSBmaWxlLiAqLwotCi11bmlvbiB7Ci0gICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4ZW50OwotICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0gfSB1OwotfSBjb21iaW5lZF9lbnRyeV90eXBlOwotCi0KLSAvKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXM6ICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdAotewotICAgIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCi1hc3ltYm9sIHN5bWJvbDsKLQotICAgIC8qIEEgcG9pbnRlciB0byB0aGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqLwotY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBsaW5lbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqLwotc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSAqbGluZW5vOwotCi0gICAgLyogSGF2ZSB0aGUgbGluZSBudW1iZXJzIGJlZW4gcmVsb2NhdGVkIHlldCA/ICovCi1ib29sZWFuIGRvbmVfbGluZW5vOwotfSBjb2ZmX3N5bWJvbF90eXBlOwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX2F1eF9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLSAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKLSAgICAgICBpbnQgICAgICAgICAgICAgY2xhc3MsCi0gICAgICAgaW50ICAgICAgICAgICAgIGluZGF1eCwKLSAgICAgICBpbnQgICAgICAgICAgICAgbnVtYXV4LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zeW1faW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkICwKLSAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgICAgICAgIGV4dCwKLSAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBpbnQgICAgIHR5cGUsCi0gICAgICAgaW50ICAgICBjbGFzcywKLSAgICAgICBpbnQgICAgIGluZGF1eCwKLSAgICAgICBpbnQgICAgIG51bWF1eCwKLSAgICAgICBQVFIgICAgIGV4dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgUEFSQU1TICgoCi0gICAgICBiZmQgICAgICAqYWJmZCwKLSAgICAgIFBUUiAgICAgIGluLAotICAgICAgUFRSICAgICAgZXh0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBleHQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIHNyYywKLSAgICAgICBQVFIgICAgIGRzdCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIFBUUiAgICAgb3V0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgX2JmZF9maWxoc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfYW91dHN6OwotIHVuc2lnbmVkIGludCBfYmZkX3NjbmhzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9zeW1lc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfYXV4ZXN6OwotIHVuc2lnbmVkIGludCBfYmZkX3JlbHN6OwotIHVuc2lnbmVkIGludCBfYmZkX2xpbmVzejsKLSBib29sZWFuIF9iZmRfY29mZl9sb25nX2ZpbGVuYW1lczsKLSBib29sZWFuIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXM7Ci0gdW5zaWduZWQgaW50IF9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyOwotIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLSBQVFIgKCpfYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9hb3V0aGRyKSk7Ci0gZmxhZ3dvcmQgKCpfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIsCi0gICAgICAgY29uc3QgY2hhciAqbmFtZSkpOwotIHZvaWQgKCpfYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3ByaW50X2F1eCkgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIEZJTEUgKmZpbGUsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4LAotICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgpKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0gICAgICAgYXJlbGVudCAqcmVsb2MsCi0gICAgICAgYmZkX2J5dGUgKmRhdGEsCi0gICAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyLAotICAgICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cikpOwotIGludCAoKl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgYXJlbGVudCAqciwKLSAgICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucykgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmlucHV0X2JmZCwKLSAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3MsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltcywKLSAgICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zKSk7Ci0gcmVsb2NfaG93dG9fdHlwZSAqKCpfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLAotICAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0sCi0gICAgICAgYmZkX3ZtYSAqYWRkZW5kcCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoCi0gICAgICAgYmZkICpvYmZkLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotICAgICAgIGJmZCAqaWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2MsCi0gICAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKCgKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICBmbGFnd29yZCBmbGFncywgCi0gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICAgYmZkX3ZtYSB2YWx1ZSwKLSAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsCi0gICAgICAgYm9vbGVhbiBjb3B5LAotICAgICAgIGJvb2xlYW4gY29sbGVjdCwgCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocCkpOwotCi0gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqIGFiZmQsCi0gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqIGFiZmQsCi0gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0KLX0gYmZkX2NvZmZfYmFja2VuZF9kYXRhOwotCi0jZGVmaW5lIGNvZmZfYmFja2VuZF9pbmZvKGFiZmQpICgoYmZkX2NvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X2luKGEsZSx0LGMsaW5kLG51bSxpKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfaW4pIChhLGUsdCxjLGluZCxudW0saSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1faW4oYSxlLGkpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX3N5bV9pbikgKGEsZSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19pbihhLGUsaSkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvICggYSktPl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgKGEsZSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX291dChhYmZkLCBpLCBvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQoYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X291dChhLGksdCxjLGluZCxudW0sbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgKGEsaSx0LGMsaW5kLG51bSxvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2ZpbGhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbGhzeikKLSNkZWZpbmUgYmZkX2NvZmZfYW91dHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYW91dHN6KQotI2RlZmluZSBiZmRfY29mZl9zY25oc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zY25oc3opCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bWVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N5bWVzeikKLSNkZWZpbmUgYmZkX2NvZmZfYXV4ZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYXV4ZXN6KQotI2RlZmluZSBiZmRfY29mZl9yZWxzeihhYmZkKSAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9yZWxzeikKLSNkZWZpbmUgYmZkX2NvZmZfbGluZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfbGluZXN6KQotI2RlZmluZSBiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyhhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMpCi0jZGVmaW5lIGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyhhYmZkKSBcCi0gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpCi0jZGVmaW5lIGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIoYWJmZCkgXAotICAgICAgICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcikKLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4oYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2soYWJmZCwgZmlsZWhkcikgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayhhYmZkLCBmaWxlaGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLSNkZWZpbmUgYmZkX2NvZmZfbWtvYmplY3RfaG9vayhhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ta29iamVjdF9ob29rKSAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayhhYmZkLCBzY25oZHIsIG5hbWUpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSAoYWJmZCwgc2NuaGRyLCBuYW1lKSkKLQotI2RlZmluZSBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2soYWJmZCwgc2VjLCBzY25oZHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKGFiZmQpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcoYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLQotI2RlZmluZSBiZmRfY29mZl9wcmludF9hdXgoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLSAgICAgICAgIChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KSkKLQotI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpXAotICAgICAgICAgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKVwKLSAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bV9pc19nbG9iYWwoYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsKVwKLSAgICAgICAgIChhYmZkLCBzeW0pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyhhYmZkKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpXAotICAgICAgICAgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsob2JmZCwgaW5mbylcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKG9iZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaylcCi0gICAgICAgICAob2JmZCwgaW5mbykpCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24ob2JmZCxpbmZvLGliZmQsbyxjb24scmVsLGlzeW1zLHNlY3MpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChpYmZkKS0+X2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pXAotICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIG8sIGNvbiwgcmVsLCBpc3ltcywgc2VjcykpCi0jZGVmaW5lIGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKVwKLSAgICAgICAgIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKSkKLSNkZWZpbmUgYmZkX2NvZmZfYWRqdXN0X3N5bW5keChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KVwKLSAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKSkKLSNkZWZpbmUgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbChpbmZvLGFiZmQsbmFtZSxmbGFncyxzZWN0aW9uLHZhbHVlLHN0cmluZyxjcCxjb2xsLGhhc2hwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKVwKLSAgICAgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY3AsIGNvbGwsIGhhc2hwKSkKLQotI2RlZmluZSBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oYSxwKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSAoYSxwKSkKLSNkZWZpbmUgYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KGEscCkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgKGEscCkpCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJlY29mZi5oIGIvYmZkL2xpYmVjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjY5YTUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmVjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyogQkZEIEVDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaWZuZGVmIEVDT0ZGX0gKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jZW5kaWYKLQotLyogVGhpcyBpcyB0aGUgYmFja2VuZCBpbmZvcm1hdGlvbiBrZXB0IGZvciBFQ09GRiBmaWxlcy4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjb25zdGFudCBmb3IgYSBwYXJ0aWN1bGFyIGJhY2tlbmQuICBUaGUgZmlyc3QgZWxlbWVudAotICAgaXMgdGhlIENPRkYgYmFja2VuZCBkYXRhIHN0cnVjdHVyZSwgc28gdGhhdCBFQ09GRiB0YXJnZXRzIGNhbiB1c2UKLSAgIHRoZSBnZW5lcmljIENPRkYgY29kZS4gICovCi0KLSNkZWZpbmUgZWNvZmZfYmFja2VuZChhYmZkKSBcCi0gICgoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKLQotc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YQotewotICAvKiBDT0ZGIGJhY2tlbmQgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KLSAgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGNvZmY7Ci0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gIGNvbnN0IGNoYXIgKmFybWFwX3N0YXJ0OwotICAvKiBUaGUgcGFnZSBib3VuZGFyeSB1c2VkIHRvIGFsaWduIHNlY3Rpb25zIGluIGEgZGVtYW5kLXBhZ2VkCi0gICAgIGV4ZWN1dGFibGUgZmlsZS4gIEUuZy4sIDB4MTAwMC4gICovCi0gIGJmZF92bWEgcm91bmQ7Ci0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGludCBjb25zdHJ1Y3Rvcl9iaXRzaXplOwotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICByZWxvY19ob3d0b190eXBlICpjb25zdHJ1Y3Rvcl9yZWxvYzsKLSAgLyogSG93IHRvIHN3YXAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgZGVidWdfc3dhcDsKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgdm9pZCAoKnN3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBQVFIpKTsKLSAgLyogQmFja2VuZCByZWxvYyB0d2Vha2luZy4gICovCi0gIHZvaWQgKCphZGp1c3RfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkgICBhcmVsZW50ICopKTsKLSAgdm9pZCAoKmFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIGJvb2xlYW4gKCpyZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGJmZCAqaW5wdXRfYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCSAgICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzKSk7Ci0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBib29sZWFuICgqYWRqdXN0X2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLAotCQkJCSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOwotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gIFRoaXMKLSAgICAgaXMgbmVlZGVkIGJlY2F1c2UgT1NGLzEgMy4yIHVzZXMgYSB3ZWlyZCBhcmNoaXZlIGZvcm1hdC4gICovCi0gIGJmZCAqKCpnZXRfZWx0X2F0X2ZpbGVwb3MpIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0cikpOwotfTsKLQotLyogVGhpcyBpcyB0aGUgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGtlcHQgZm9yIEVDT0ZGIGZpbGVzLiAgKi8KLQotI2RlZmluZSBlY29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLmVjb2ZmX29ial9kYXRhKQotCi10eXBlZGVmIHN0cnVjdCBlY29mZl90ZGF0YQotewotICAvKiBUaGUgcmVsb2MgZmlsZSBwb3NpdGlvbiwgc2V0IGJ5Ci0gICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCi0gIGZpbGVfcHRyIHJlbG9jX2ZpbGVwb3M7Ci0KLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBmaWxlIHBvc2l0aW9uLCBzZXQgYnkgX2JmZF9lY29mZl9ta29iamVjdF9ob29rLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgLyogVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHRleHQgc2VnbWVudC4gIE9ubHkgdmFsaWQgZm9yIGFuCi0gICAgIGV4aXN0aW5nIGZpbGUsIG5vdCBmb3Igb25lIHdlIGFyZSBjcmVhdGluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdGV4dF9zdGFydDsKLSAgdW5zaWduZWQgbG9uZyB0ZXh0X2VuZDsKLQotICAvKiBUaGUgY2FjaGVkIGdwIHZhbHVlLiAgVGhpcyBpcyB1c2VkIHdoZW4gcmVsb2NhdGluZy4gICovCi0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogVGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIG9wdGltaXplIHVzaW5nIGdwLiAgVGhpcyBpcwotICAgICB0eXBpY2FsbHkgc2V0IGJ5IHRoZSAtRyBvcHRpb24gdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IKLSAgICAgbGlua2VyLiAgKi8KLSAgdW5zaWduZWQgaW50IGdwX3NpemU7Ci0KLSAgLyogVGhlIHJlZ2lzdGVyIG1hc2tzLiAgV2hlbiBsaW5raW5nLCBhbGwgdGhlIG1hc2tzIGZvdW5kIGluIHRoZQotICAgICBpbnB1dCBmaWxlcyBhcmUgY29tYmluZWQgaW50byB0aGUgbWFza3Mgb2YgdGhlIG91dHB1dCBmaWxlLgotICAgICBUaGVzZSBhcmUgbm90IGFsbCB1c2VkIGZvciBhbGwgdGFyZ2V0cywgYnV0IHRoYXQncyBPSywgYmVjYXVzZQotICAgICB0aGUgcmVsZXZhbnQgb25lcyBhcmUgdGhlIG9ubHkgb25lcyBzd2FwcGVkIGluIGFuZCBvdXQuICAqLwotICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7Ci0gIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKLSAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOwotCi0gIC8qIFRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1Z19pbmZvOwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBQVFIgcmF3X3N5bWVudHM7Ci0KLSAgLyogVGhlIGNhbm9uaWNhbCBCRkQgc3ltYm9scy4gICovCi0gIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0ICpjYW5vbmljYWxfc3ltYm9sczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBleHRlcm5hbCBzeW1ib2wgbnVtYmVycyB0byBlbnRyaWVzIGluIHRoZSBsaW5rZXIKLSAgICAgaGFzaCB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICAqLwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSByZWxvYyBzeW1ib2wgaW5kaWNlcyB0byBzZWN0aW9ucywgdXNlZCB3aGVuCi0gICAgIGxpbmtpbmcuICAqLwotICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uOwotCi0gIC8qIFRydWUgaWYgdGhpcyBCRkQgd2FzIHdyaXR0ZW4gYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgYm9vbGVhbiBsaW5rZXI7Ci0KLSAgLyogVHJ1ZSBpZiBhIHdhcm5pbmcgdGhhdCBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMgYXJlCi0gICAgIG5lZWRlZCBpbiB0aGUgb3V0cHV0IGJpbmFyeSB3YXMgaXNzdWVkIGFscmVhZHkuICAqLwotICBib29sZWFuIGlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nOwotCi0gIC8qIFVzZWQgYnkgZmluZF9uZWFyZXN0X2xpbmUgZW50cnkgcG9pbnQuICBUaGUgc3RydWN0dXJlIGNvdWxkIGJlCi0gICAgIGluY2x1ZGVkIGRpcmVjdGx5IGluIHRoaXMgb25lLCBidXQgdGhlcmUncyBubyBwb2ludCB0byB3YXN0aW5nCi0gICAgIHRoZSBtZW1vcnkganVzdCBmb3IgdGhlIGluZnJlcXVlbnRseSBjYWxsZWQgZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpmaW5kX2xpbmVfaW5mbzsKLQotICAvKiBXaGV0aGVyIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBpbiB0aGUgdGV4dCBzZWdtZW50IGZvciB0aGlzCi0gICAgIHBhcnRpY3VsYXIgRUNPRkYgZmlsZS4gIFRoaXMgaXMgbm90IHZhbGlkIHVudGlsCi0gICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBjYWxsZWQuICAqLwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0KLX0gZWNvZmZfZGF0YV90eXBlOwotCi0vKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0Ci17Ci0gIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCi0gIGFzeW1ib2wgc3ltYm9sOwotCi0gIC8qIFRoZSBmZHIgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgRkRSICpmZHI7Ci0KLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sIHJhdGhlciB0aGFuIGFuIGV4dGVybmFsIG9uZS4gICovCi0gIGJvb2xlYW4gbG9jYWw7Ci0KLSAgLyogQSBwb2ludGVyIHRvIHRoZSB1bnN3YXBwZWQgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbC4KLSAgICAgVGhpcyBpcyBlaXRoZXIgYSBzdHJ1Y3Qgc3ltX2V4dCBvciBhIHN0cnVjdCBleHRfZXh0LCBkZXBlbmRpbmcgb24KLSAgICAgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbCBmaWVsZCBhYm92ZS4gICovCi0gIFBUUiBuYXRpdmU7Ci19IGVjb2ZmX3N5bWJvbF90eXBlOwotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBlY29mZnN5bWJvbChhc3ltYm9sKSAoKGVjb2ZmX3N5bWJvbF90eXBlICopICgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBXZSBuZWVkIHRvIHNhdmUgdGhlIGluZGV4IG9mIGFuIGV4dGVybmFsIHN5bWJvbCB3aGVuIHdlIHdyaXRlIGl0Ci0gICBvdXQgc28gdGhhdCBjYW4gc2V0IHRoZSBzeW1ib2wgaW5kZXggY29ycmVjdGx5IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICB0aGUgcmVsb2NzLiAgKi8KLSNkZWZpbmUgZWNvZmZfZ2V0X3N5bV9pbmRleChzeW1ib2wpICgoc3ltYm9sKS0+dWRhdGEuaSkKLSNkZWZpbmUgZWNvZmZfc2V0X3N5bV9pbmRleChzeW1ib2wsIGlkeCkgKChzeW1ib2wpLT51ZGF0YS5pID0gKGlkeCkpCi0KLS8qIFdoZW4gZ2VuZXJhdGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLCB0aGUgbGlua2VyIHJlbGF4ZXMgdGhlIGNvZGUKLSAgIHRvIHR1cm4gUEMgcmVsYXRpdmUgYnJhbmNoZXMgaW50byBsb25nZXIgY29kZSBzZXF1ZW5jZXMgd2hlbiB0aGUgUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCBpcyBvdXQgb2YgcmFuZ2UuICBUaGlzIGludm9sdmVzIHJlYWRpbmcgdGhlIHJlbG9jcwotICAgaW4gYmZkX3JlbGF4X3NlY3Rpb24gYXMgd2VsbCBhcyBpbiBiZmRfZmluYWxfbGluaywgYW5kIHJlcXVpcmVzIHRoZQotICAgY29kZSB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHJlbG9jcyBoYXZlIGJlZW4gZXhwYW5kZWQuICBBIHBvaW50ZXIKLSAgIHRvIHRoaXMgc3RydWN0dXJlIGlzIHB1dCBpbiB0aGUgdXNlZF9ieV9iZmQgcG9pbnRlciBvZiBhIHNlY3Rpb24gdG8KLSAgIGtlZXAgdHJhY2sgb2YgdGhpcyBpbmZvcm1hdGlvbi4gIFRoZSB1c2VyX2J5X2JmZCBwb2ludGVyIHdpbGwgYmUKLSAgIE5VTEwgaWYgdGhlIGluZm9ybWF0aW9uIHdhcyBub3QgbmVlZGVkLiAgKi8KLQotc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHVuc3dhcHBlZCByZWxvY3MgZm9yIHRoaXMgc2VjdGlvbi4gIFRoZXNlIGFyZSBzdG9yZWQgaW4KLSAgICAgbWVtb3J5IHNvIHRoZSBpbnB1dCBmaWxlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVhZCB0d2ljZS4gICovCi0gIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAgVGhlc2UgYnl0ZXMgbWF5IG9yIG1heSBub3QgYmUgc2F2ZWQKLSAgICAgaW4gbWVtb3J5LCBidXQgaWYgaXQgaXMgdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlbS4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLQotICAvKiBPZmZzZXQgYWRqdXN0bWVudHMgZm9yIFBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgQSBudW1iZXIgb3RoZXIgdGhhbgotICAgICAxIGlzIGFuIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2gsIG9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5Ci0gICAgIHdoaWNoIGlzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byAudGV4dCBsb2NhdGlvbnM7IHRoaXMgYWRkZW5kCi0gICAgIGFyaXNlcyBiZWNhdXNlIHRoZSBicmFuY2ggb3IgZGlmZmVyZW5jZSBjcm9zc2VzIG9uZSBvciBtb3JlCi0gICAgIGJyYW5jaGVzIHdoaWNoIHdlcmUgZXhwYW5kZWQgaW50byBhIGxhcmdlciBjb2RlIHNlcXVlbmNlLiAgQSAxCi0gICAgIG1lYW5zIHRoYXQgdGhpcyBicmFuY2ggd2FzIGl0c2VsZiBleHBhbmRlZCBpbnRvIGEgbGFyZ2VyIGNvZGUKLSAgICAgc2VxdWVuY2UuICAxIGlzIG5vdCBhIHBvc3NpYmxlIG9mZnNldCwgc2luY2UgYWxsIG9mZnNldHMgbXVzdCBiZQotICAgICBtdWx0aXBsZXMgb2YgdGhlIGluc3RydWN0aW9uIHNpemUsIHdoaWNoIGlzIDQ7IGFsc28sIHRoZSBvbmx5Ci0gICAgIHJlbG9jcyB3aXRoIG5vbi16ZXJvIG9mZnNldHMgd2lsbCBiZSBQQyByZWxhdGl2ZSBicmFuY2hlcyBvcgotICAgICBzd2l0Y2ggdGFibGUgZW50cmllcyB3aXRoaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuICBJZiB0aGlzIGZpZWxkCi0gICAgIGlzIE5VTEwsIG5vIGJyYW5jaGVzIHdlcmUgZXhwYW5kZWQgYW5kIG5vIG9mZnNldHMgYXJlIHJlcXVpcmVkLgotICAgICBPdGhlcndpc2UgdGhlcmUgYXJlIGFzIG1hbnkgZW50cmllcyBhcyB0aGVyZSBhcmUgcmVsb2NzIGluIHRoZQotICAgICBzZWN0aW9uLCBhbmQgdGhlIGVudHJ5IGZvciBhbnkgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgaXMKLSAgICAgemVyby4gICovCi0gIGxvbmcgKm9mZnNldHM7Ci0KLSAgLyogV2hlbiBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSAoaS5lLiwgZmluYWwsIG5vbi1yZWxvY2F0YWJsZSBsaW5rKQotICAgICBvbiB0aGUgQWxwaGEsIHdlIG1heSBuZWVkIHRvIHVzZSBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMKLSAgICAgdG8gc3BhbiB0aGUgZW50aXJlIC5saXRhIHNlY3Rpb24uICBJbiBlc3NlbmNlLCB3ZSBhbGxvdyBlYWNoCi0gICAgIGlucHV0IC5saXRhIHNlY3Rpb24gdG8gaGF2ZSBpdHMgb3duIGdwIHZhbHVlLiAgVG8gc3VwcG9ydCB0aGlzLAotICAgICB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGdwIHZhbHVlcyB0aGF0IHdlIHBpY2tlZCBmb3IgZWFjaAotICAgICBpbnB1dCAubGl0YSBzZWN0aW9uIC4gKi8KLSAgYmZkX3ZtYSBncDsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgZWNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBlY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBFQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBsb25nIGluZHg7Ci0gIC8qIEJGRCB0aGF0IGV4dCBmaWVsZCB2YWx1ZSBjYW1lIGZyb20uICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIEVDT0ZGIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVYVFIgZXN5bTsKLSAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuIG91dC4gICovCi0gIGNoYXIgd3JpdHRlbjsKLSAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCB3YXMgcmVmZXJyZWQgdG8gYXMgc21hbGwgdW5kZWZpbmVkLiAgKi8KLSAgY2hhciBzbWFsbDsKLX07Ci0KLS8qIEVDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogTWFrZSBhbiBFQ09GRiBvYmplY3QuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSZWFkIGluIHRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgRUNPRkYgQkZEIGJhY2tlbmQgdmVjdG9ycy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKl9iZmRfZWNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jZGVmaW5lCV9iZmRfZWNvZmZfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmFsb2NhdGlvbikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3ByaW50X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9nZXRfc3ltYm9sX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hIG9mZnNldCwKLQkgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyLCBjb25zdCBjaGFyICoqZm5uYW1lX3B0ciwKLQkgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgX2JmZF9lY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZAotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9jYW5vbmljYWxpemVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci0vKiBlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgZGVmaW5lZCBieSBiYWNrZW5kLiAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLWV4dGVybiBpbnQgX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKLS8qIGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgZGVmaW5lZCBieSBiYWNrZW5kLiAgKi8KLS8qIGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGRlZmluZWQgYnkgYmFja2VuZC4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogSG9vayBmdW5jdGlvbnMgZm9yIHRoZSBnZW5lcmljIENPRkYgc2VjdGlvbiByZWFkaW5nIGNvZGUuICAqLwotCi1leHRlcm4gUFRSIF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSkpIGJmZF92b2lkKQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOwotZXh0ZXJuIGZsYWd3b3JkIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgaGRyLCBjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogRUNPRkYgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHRoZSBzYW1lCi0gICBmb3IgYWxsIEVDT0ZGIHRhcmdldHMsIHNvIHRoZXkgYXJlIGRlZmluZWQgaW4gZWNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7CmRpZmYgLS1naXQgYS9iZmQvbGliaHBwYS5oIGIvYmZkL2xpYmhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyNTZhMi4uMDAwMDAwMAotLS0gYS9iZmQvbGliaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjgxICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgLCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0hQUEFfSAotI2RlZmluZSBfSFBQQV9ICi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFBBX1BBR0VTSVpFIDB4MTAwMAotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIElOTElORSBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmIC8qIEdOVSBDPyAqLwotI2VuZGlmIC8qIElOTElORSAqLwotCi0jaWYgX19HTlVDX18gPj0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3Ci0vKiBEZWNsYXJlIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGUgdW51c2VkIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncy4gICovCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8zICh1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzMgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8xMiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzEyICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBhc3NlbWJsZV8xNyAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JCQkJCSB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzE3ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgYXNzZW1ibGVfMjEgKHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGUgKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzIxICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIHNpZ25fZXh0ZW5kICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IG9uZXMgKGludCkgX19hdHRyaWJ1dGUgKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgc2lnbl91bmV4dCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGxvd19zaWduX2V4dGVuZCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgbG93X3NpZ25fdW5leHQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBocHBhX2ZpZWxkX2FkanVzdCAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSBjaGFyIGJmZF9ocHBhX2luc24yZm10ICh1bnNpZ25lZCBsb25nKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSAgdW5zaWduZWQgbG9uZyBocHBhX3JlYnVpbGRfaW5zbiAoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotI2VuZGlmIC8qIGdjYyAyLjcgb3IgaGlnaGVyICovCi0KLQotLyogVGhlIFBBIGluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi1lbnVtIHBhX2FyY2gge3BhMTAgPSAxMCwgcGExMSA9IDExLCBwYTIwID0gMjB9OwotCi0vKiBIUCBQQS1SSVNDIHJlbG9jYXRpb24gdHlwZXMgKi8KLQotZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUKLSAgewotICAgIFJfSFBQQV9GU0VMID0gMHgwLAotICAgIFJfSFBQQV9MU1NFTCA9IDB4MSwKLSAgICBSX0hQUEFfUlNTRUwgPSAweDIsCi0gICAgUl9IUFBBX0xTRUwgPSAweDMsCi0gICAgUl9IUFBBX1JTRUwgPSAweDQsCi0gICAgUl9IUFBBX0xEU0VMID0gMHg1LAotICAgIFJfSFBQQV9SRFNFTCA9IDB4NiwKLSAgICBSX0hQUEFfTFJTRUwgPSAweDcsCi0gICAgUl9IUFBBX1JSU0VMID0gMHg4LAotICAgIFJfSFBQQV9OU0VMICA9IDB4OSwKLSAgICBSX0hQUEFfTkxTRUwgID0gMHhhLAotICAgIFJfSFBQQV9OTFJTRUwgID0gMHhiLAotICAgIFJfSFBQQV9QU0VMID0gMHhjLAotICAgIFJfSFBQQV9MUFNFTCA9IDB4ZCwKLSAgICBSX0hQUEFfUlBTRUwgPSAweGUsCi0gICAgUl9IUFBBX1RTRUwgPSAweGYsCi0gICAgUl9IUFBBX0xUU0VMID0gMHgxMCwKLSAgICBSX0hQUEFfUlRTRUwgPSAweDExCi0gIH07Ci0KLS8qIC91c3IvaW5jbHVkZS9yZWxvYy5oIGRlZmluZXMgdGhlc2UgdG8gY29uc3RhbnRzLiAgV2Ugd2FudCB0byB1c2UKLSAgIHRoZW0gaW4gZW51bXMsIHNvICN1bmRlZiB0aGVtIGJlZm9yZSB3ZSBzdGFydCB1c2luZyB0aGVtLiAgV2UgbWlnaHQKLSAgIGJlIGFibGUgdG8gZml4IHRoaXMgYW5vdGhlciB3YXkgYnkgc2ltcGx5IG1hbmFnaW5nIG5vdCB0byBpbmNsdWRlCi0gICAvdXNyL2luY2x1ZGUvcmVsb2MuaCwgYnV0IGN1cnJlbnRseSBHREIgcGlja3MgdXAgdGhlc2UgZGVmaW5lcwotICAgc29tZXdoZXJlLiAgKi8KLSN1bmRlZiBlX2ZzZWwKLSN1bmRlZiBlX2xzc2VsCi0jdW5kZWYgZV9yc3NlbAotI3VuZGVmIGVfbHNlbAotI3VuZGVmIGVfcnNlbAotI3VuZGVmIGVfbGRzZWwKLSN1bmRlZiBlX3Jkc2VsCi0jdW5kZWYgZV9scnNlbAotI3VuZGVmIGVfcnJzZWwKLSN1bmRlZiBlX25zZWwKLSN1bmRlZiBlX25sc2VsCi0jdW5kZWYgZV9ubHJzZWwKLSN1bmRlZiBlX3BzZWwKLSN1bmRlZiBlX2xwc2VsCi0jdW5kZWYgZV9ycHNlbAotI3VuZGVmIGVfdHNlbAotI3VuZGVmIGVfbHRzZWwKLSN1bmRlZiBlX3J0c2VsCi0jdW5kZWYgZV9vbmUKLSN1bmRlZiBlX3R3bwotI3VuZGVmIGVfcGNyZWwKLSN1bmRlZiBlX2NvbgotI3VuZGVmIGVfcGxhYmVsCi0jdW5kZWYgZV9hYnMKLQotLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KLWVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdAotICB7Ci0gICAgZV9mc2VsID0gUl9IUFBBX0ZTRUwsCi0gICAgZV9sc3NlbCA9IFJfSFBQQV9MU1NFTCwKLSAgICBlX3Jzc2VsID0gUl9IUFBBX1JTU0VMLAotICAgIGVfbHNlbCA9IFJfSFBQQV9MU0VMLAotICAgIGVfcnNlbCA9IFJfSFBQQV9SU0VMLAotICAgIGVfbGRzZWwgPSBSX0hQUEFfTERTRUwsCi0gICAgZV9yZHNlbCA9IFJfSFBQQV9SRFNFTCwKLSAgICBlX2xyc2VsID0gUl9IUFBBX0xSU0VMLAotICAgIGVfcnJzZWwgPSBSX0hQUEFfUlJTRUwsCi0gICAgZV9uc2VsID0gUl9IUFBBX05TRUwsCi0gICAgZV9ubHNlbCA9IFJfSFBQQV9OTFNFTCwKLSAgICBlX25scnNlbCA9IFJfSFBQQV9OTFJTRUwsCi0gICAgZV9wc2VsID0gUl9IUFBBX1BTRUwsCi0gICAgZV9scHNlbCA9IFJfSFBQQV9MUFNFTCwKLSAgICBlX3Jwc2VsID0gUl9IUFBBX1JQU0VMLAotICAgIGVfdHNlbCA9IFJfSFBQQV9UU0VMLAotICAgIGVfbHRzZWwgPSBSX0hQUEFfTFRTRUwsCi0gICAgZV9ydHNlbCA9IFJfSFBQQV9SVFNFTAotICB9OwotCi1lbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlCi0gIHsKLSAgICBSX0hQUEFfRV9PTkUgPSAwLAotICAgIFJfSFBQQV9FX1RXTyA9IDEsCi0gICAgUl9IUFBBX0VfUENSRUwgPSAyLAotICAgIFJfSFBQQV9FX0NPTiA9IDMsCi0gICAgUl9IUFBBX0VfUExBQkVMID0gNywKLSAgICBSX0hQUEFfRV9BQlMgPSAxOAotICB9OwotCi0vKiBmb3IgY29tcGF0aWJpbGl0eSAqLwotZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZV9hbHQKLSAgewotICAgIGVfb25lID0gUl9IUFBBX0VfT05FLAotICAgIGVfdHdvID0gUl9IUFBBX0VfVFdPLAotICAgIGVfcGNyZWwgPSBSX0hQUEFfRV9QQ1JFTCwKLSAgICBlX2NvbiA9IFJfSFBQQV9FX0NPTiwKLSAgICBlX3BsYWJlbCA9IFJfSFBQQV9FX1BMQUJFTCwKLSAgICBlX2FicyA9IFJfSFBQQV9FX0FCUwotICB9OwotCi0KLS8qIFJlbG9jYXRpb25zIGZvciBmdW5jdGlvbiBjYWxscyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlcgotICAgcmVsb2NhdGlvbiBiaXRzLiAgVGhlc2UgYml0cyBkZXNjcmliZSBleGFjdGx5IHdoZXJlIHRoZSBjYWxsZXIgaGFzCi0gICBwbGFjZWQgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIGFuZCB3aGVyZSBpdCBleHBlY3RzIHRvIGZpbmQgYSByZXR1cm4KLSAgIHZhbHVlLgotCi0gICBCb3RoIEVMRiBhbmQgU09NIGVuY29kZSB0aGlzIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgYWRkZW5kIGZpZWxkCi0gICBvZiB0aGUgY2FsbCByZWxvY2F0aW9uLiAgKE5vdGUgdGhpcyBjb3VsZCBicmVhayB2ZXJ5IGJhZGx5IGlmIG9uZQotICAgd2FzIHRvIG1ha2UgYSBjYWxsIGxpa2UgYmwgZm9vICsgMHgxMjM0NTY3OCkuCi0KLSAgIFRoZSBoaWdoIG9yZGVyIDEwIGJpdHMgY29udGFpbiBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwKLSAgIHRoZSBsb3cgb3JkZXIgMjIgYml0cyBjb250YWluIHRoZSBjb25zdGFudCBvZmZzZXQuICAqLwotICAgCi0jZGVmaW5lIEhQUEFfUl9BUkdfUkVMT0MoYSkJKCgoYSkgPj4gMjIpICYgMHgzRkYpCi0jZGVmaW5lIEhQUEFfUl9DT05TVEFOVChhKQkoKCgoaW50KShhKSkgPDwgMTApID4+IDEwKQotI2RlZmluZSBIUFBBX1JfQURERU5EKHIsYykJKCgocikgPDwgMjIpICsgKChjKSAmIDB4M0ZGRkZGKSkKLSNkZWZpbmUgSFBQQV9XSURFCSAgICAgICAoMCkgLyogUFNXIFctYml0LCBuZWVkIHRvIGNoZWNrISBGSVhNRSAqLwotCi0vKiBUaGVzZSBtYWNyb3MgZ2V0IGJpdCBmaWVsZHMgdXNpbmcgSFAncyBudW1iZXJpbmcgKE1TQiA9IDApLAotICogYnV0IG5vdGUgdGhhdCAiTUFTSyIgYXNzdW1lcyB0aGF0IHRoZSBMU0IgYml0cyBhcmUgd2hhdCdzCi0gKiB3YW50ZWQuCi0gKi8KLSNpZm5kZWYgR0VUX0ZJRUxECi0jZGVmaW5lIEdFVF9GSUVMRChYLCBGUk9NLCBUTykgXAotICAoKFgpID4+ICgzMSAtIChUTykpICYgKCgxIDw8ICgoVE8pIC0gKEZST00pICsgMSkpIC0gMSkpCi0jZW5kaWYgIAotI2RlZmluZSBHRVRfQklUKFgsIFdISUNIKSBcCi0gIEdFVF9GSUVMRCAoWCwgV0hJQ0gsIFdISUNIKQotCi0jZGVmaW5lIE1BU0soU0laRSkgXAotICAofigoLTEpIDw8IFNJWkUpKQotICAKLSNkZWZpbmUgQ0FURU5BVEUoWCwgWFNJWkUsIFksIFlTSVpFKSBcCi0gICgoKFggJiBNQVNLIChYU0laRSkpIDw8IFlTSVpFKSB8IChZICYgTUFTSyAoWVNJWkUpKSkKLQotI2RlZmluZSBFTEVWRU4oWCkgXAotICBDQVRFTkFURSAoR0VUX0JJVCAoWCwgMTApLCAxLCBHRVRfRklFTEQgKFgsIDAsIDkpLCAxMCkKLSAgCi0vKiBTb21lIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIFBBIGluc3RydWN0aW9ucy4gICovCi0KLS8qIE5PVEU6IHRoZXNlIHVzZSB0aGUgSFAgY29udmVudGlvbiB0aGF0IGZ7MX0gaXMgdGhlIF9sZWZ0XyBtb3N0Ci0gKiAgICAgICBiaXQgKE1TQikgb2YgZjsgdGhleSBzb21ldGltZXMgaGF2ZSB0byBpbXBvc2UgYW4gYXNzdW1wdGlvbgotICogICAgICAgYWJvdXQgdGhlIHNpemUgb2YgYSBmaWVsZDsgYW5kIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBtb3N0Ci0gKiAgICAgICBhcmVuJ3QgdXNlZC4KLSAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLXNpZ25fZXh0ZW5kICh4LCBsZW4pCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci17Ci0gIHJldHVybiAoaW50KSh4ID4+IChsZW4gLSAxKSA/ICgtMSA8PCBsZW4pIHwgeCA6IHgpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotYXNzZW1ibGVfMyAoeCkKLSAgICAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIHJldHVybiBDQVRFTkFURSAoR0VUX0JJVCAoeCwgMiksIDEsIEdFVF9GSUVMRCAoeCwgMCwgMSksIDIpOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8zICh4LCByKQotICAgICB1bnNpZ25lZCBpbnQgeDsKLSAgICAgdW5zaWduZWQgaW50ICpyOwotewotICAqciA9ICgoKHggJiA0KSA+PiAyKSB8ICgoeCAmIDMpIDw8IDEpKSAmIDc7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV82ICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgcmV0dXJuICgoKHggJiAweDEpIDw8IDUpICsgKDMyIC0gKHkgJiAweDFmKSkpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotYXNzZW1ibGVfMTIgKHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCB4LCB5OwotewotICByZXR1cm4gQ0FURU5BVEUgKENBVEVOQVRFICh5LCAxLCBHRVRfQklUICh4LCAxMCksIDEpLCAyLAotIAkJICAgR0VUX0ZJRUxEICh4LCAwLCA5KSwgOSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzEyIChhczEyLCB4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgYXMxMjsKLSAgICAgdW5zaWduZWQgaW50ICp4LCAqeTsKLXsKLSAgKnkgPSAoYXMxMiAmIDB4ODAwKSA+PiAxMTsKLSAgKnggPSAoKGFzMTIgJiAweDNmZikgPDwgMSkgfCAoKGFzMTIgJiAweDQwMCkgPj4gMTApOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzE2ICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgLyogRGVwZW5kcyBvbiBQU1cgVy1iaXQgISovCi0gIHVuc2lnbmVkIGludCB0ZW1wOwotCi0gIGlmIChIUFBBX1dJREUpCi0gICAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTMpLCAxLAotCQkJICAgICAgIChHRVRfQklUICh5LCAxMykgXiBHRVRfQklUICh4LCAwKSksIDEpLCAyLAotCQkgICAgIENBVEVOQVRFICgoR0VUX0JJVCAoeSwgMTMpIF4gR0VUX0JJVCAoeCwgMSkpLCAxLAotCQkJICAgICAgIEdFVF9GSUVMRCAoeSwgMCwgMTIpLCAxMyksIDE0KTsKLSAgZWxzZQotICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKEdFVF9CSVQgKHksIDEzKSwgMSwgR0VUX0JJVCAoeSwgMTMpLCAxKSwgMiwKLQkJICAgICBDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTMpLCAxLCBHRVRfRklFTEQgKHksIDAsIDEyKSwgMTMpLCAxNCk7Ci0KLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICh0ZW1wLCAxNik7Ci19Ci0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1hc3NlbWJsZV8xNmEgKHgsIHksIHopCi0gICAgIHVuc2lnbmVkIGludCB4LCB5LCB6OwotewotICAvKiBEZXBlbmRzIG9uIFBTVyBXLWJpdCAhKi8KLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0KLSAgaWYgKEhQUEFfV0lERSkKLSAgICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFICh6LCAxLCAoeiBeIEdFVF9CSVQgKHgsIDApKSwgMSksIDIsCi0JCSAgICAgQ0FURU5BVEUgKCh6IF4gR0VUX0JJVCAoeCwgMSkpLCAxLCB5LCAxMSksIDEyKTsKLSAgZWxzZSAKLSAgICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsIHosIDEpLCAyLCBDQVRFTkFURSAoeiwgMSwgeSwgMTEpLCAxMik7Ci0KLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICgodGVtcCA8PCAyKSwgMTYpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzE3ICh4LCB5LCB6KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeSwgejsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0gIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsIHgsIDUpLCA2LAotCQkgICBDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTApLCAxLCBHRVRfRklFTEQgKHksIDAsIDkpLCAxMCksIDExKTsKLSAgCi0gIHJldHVybiB0ZW1wOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8xNyAoYXMxNywgeCwgeSwgeikKLSAgICAgdW5zaWduZWQgaW50IGFzMTc7Ci0gICAgIHVuc2lnbmVkIGludCAqeCwgKnksICp6OwotewotCi0gICp6ID0gKGFzMTcgJiAweDEwMDAwKSA+PiAxNjsKLSAgKnggPSAoYXMxNyAmIDB4MGY4MDApID4+IDExOwotICAqeSA9ICgoKGFzMTcgJiAweDAwNDAwKSA+PiAxMCkgfCAoKGFzMTcgJiAweDNmZikgPDwgMSkpICYgMHg3ZmY7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotYXNzZW1ibGVfMjEgKHgpCi0gICAgIHVuc2lnbmVkIGludCB4OwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLSAgdGVtcCA9ICgoeCAmIDEpIDw8IDIwKSB8Ci0gICAgKCh4ICYgMHhmZmUpIDw8IDgpIHwKLSAgICAoKHggJiAweGMwMDApID4+IDcpIHwKLSAgICAoKHggJiAweDFmMDAwMCkgPj4gMTQpIHwKLSAgICAoKHggJiAweDAwMzAwMCkgPj4gMTIpOwotICByZXR1cm4gdGVtcCAmIDB4MWZmZmZmOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzIyIChhLGIsYyxkKQotICAgICB1bnNpZ25lZCBpbnQgYSxiLGMsZDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotICAKLSAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoZCwgMSwgYSwgNSksIDYsCi0JCSAgIENBVEVOQVRFIChiLCA1LCBFTEVWRU4gKGMpLCAxMSksIDE2KTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQgKHRlbXAsIDIyKTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1kaXNfYXNzZW1ibGVfMjEgKGFzMjEsIHgpCi0gICAgIHVuc2lnbmVkIGludCBhczIxLCAqeDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0KLSAgdGVtcCA9IChhczIxICYgMHgxMDAwMDApID4+IDIwOwotICB0ZW1wIHw9IChhczIxICYgMHgwZmZlMDApID4+IDg7Ci0gIHRlbXAgfD0gKGFzMjEgJiAweDAwMDE4MCkgPDwgNzsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMDdjKSA8PCAxNDsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMDAzKSA8PCAxMjsKLSAgKnggPSB0ZW1wOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotb25lcyAobikKLSAgICAgaW50IG47Ci17Ci0gIHVuc2lnbmVkIGludCBsZW5fb25lczsKLSAgaW50IGk7Ci0KLSAgaSA9IDA7Ci0gIGxlbl9vbmVzID0gMDsKLSAgd2hpbGUgKGkgPCBuKQotICAgIHsKLSAgICAgIGxlbl9vbmVzID0gKGxlbl9vbmVzIDw8IDEpIHwgMTsKLSAgICAgIGkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbl9vbmVzOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLXNpZ25fdW5leHQgKHgsIGxlbiwgcmVzdWx0KQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotICAgICB1bnNpZ25lZCBpbnQgKnJlc3VsdDsKLXsKLSAgdW5zaWduZWQgaW50IGxlbl9vbmVzOwotCi0gIGxlbl9vbmVzID0gb25lcyAobGVuKTsKLQotICAqcmVzdWx0ID0geCAmIGxlbl9vbmVzOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWxvd19zaWduX2V4dGVuZCAoeCwgbGVuKQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotewotICByZXR1cm4gKGludCkoKHggJiAweDEgPyAoLTEgPDwgKGxlbiAtIDEpKSA6IDApIHwgeCA+PiAxKTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1sb3dfc2lnbl91bmV4dCAoeCwgbGVuLCByZXN1bHQpCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci0gICAgIHVuc2lnbmVkIGludCAqcmVzdWx0OwotewotICB1bnNpZ25lZCBpbnQgdGVtcDsKLSAgdW5zaWduZWQgaW50IHNpZ247Ci0gIHVuc2lnbmVkIGludCByZXN0OwotICB1bnNpZ25lZCBpbnQgb25lX2JpdF9hdF9sZW47Ci0gIHVuc2lnbmVkIGludCBsZW5fb25lczsKLQotICBsZW5fb25lcyA9IG9uZXMgKGxlbik7Ci0gIG9uZV9iaXRfYXRfbGVuID0gMSA8PCAobGVuIC0gMSk7Ci0KLSAgc2lnbl91bmV4dCAoeCwgbGVuLCAmdGVtcCk7Ci0gIHNpZ24gPSB0ZW1wICYgb25lX2JpdF9hdF9sZW47Ci0gIHNpZ24gPj49IChsZW4gLSAxKTsKLQotICByZXN0ID0gdGVtcCAmIChsZW5fb25lcyBeIG9uZV9iaXRfYXRfbGVuKTsKLSAgcmVzdCA8PD0gMTsKLQotICAqcmVzdWx0ID0gcmVzdCB8IHNpZ247Ci19Ci0KLS8qIEhhbmRsZSBmaWVsZCBzZWxlY3RvcnMgZm9yIFBBIGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBjb25zdGFudF92YWx1ZTsKLSAgICAgdW5zaWduZWQgc2hvcnQgcl9maWVsZDsKLXsKLSAgc3dpdGNoIChyX2ZpZWxkKQotICAgIHsKLSAgICBjYXNlIGVfZnNlbDoJCS8qIEYgIDogbm8gY2hhbmdlCQkgICAgICAqLwotICAgIGNhc2UgZV9uc2VsOgkJLyogTiAgOiBubyBjaGFuZ2UJCSAgICAgICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sc3NlbDoJCS8qIExTIDogaWYgKGJpdCAyMSkgdGhlbiBhZGQgMHg4MDAKLQkJCQkgICBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yc3NlbDoJCS8qIFJTIDogU2lnbiBleHRlbmQgZnJvbSBiaXQgMjEJKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgZWxzZQotCXZhbHVlICY9IDB4N2ZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbHNlbDoJCS8qIEwgIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCi0gICAgY2FzZSBlX25sc2VsOgkJLyogTkwgIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yc2VsOgkJLyogUiAgOiBTZXQgYml0cyAwLTIwIHRvIHplcm8JICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSA9IHZhbHVlICYgMHg3ZmY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sZHNlbDoJCS8qIExEIDogQWRkIDB4ODAwLCBhcml0aG1ldGljIHNoaWZ0Ci0JCQkJICAgcmlnaHQgMTEgYml0cwkJICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yZHNlbDoJCS8qIFJEIDogU2V0IGJpdHMgMC0yMCB0byBvbmUJICAgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xyc2VsOgkJLyogTFIgOiBMIHdpdGggInJvdW5kZWQiIGNvbnN0YW50ICAgICAgKi8KLSAgICBjYXNlIGVfbmxyc2VsOgkJLyogTkxSIDogTkwgd2l0aCAicm91bmRlZCIgY29uc3RhbnQgICAgICAqLwotICAgICAgdmFsdWUgPSB2YWx1ZSArICgoY29uc3RhbnRfdmFsdWUgKyAweDEwMDApICYgMHhmZmZmZTAwMCk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcnJzZWw6CQkvKiBSUiA6IFIgd2l0aCAicm91bmRlZCIgY29uc3RhbnQgICAgICAqLwotICAgICAgdmFsdWUgPSB2YWx1ZSArICgoY29uc3RhbnRfdmFsdWUgKyAweDEwMDApICYgMHhmZmZmZTAwMCk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4N2ZmKSArIGNvbnN0YW50X3ZhbHVlIC0gKChjb25zdGFudF92YWx1ZSArIDB4MTAwMCkgJiAweGZmZmZlMDAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotCi19Ci0KLS8qIFBBLVJJU0MgT1BDT0RFUyAqLwotI2RlZmluZSBnZXRfb3Bjb2RlKGluc24pCSgoaW5zbikgJiAweGZjMDAwMDAwKSA+PiAyNgotCi0vKiBGSVhNRTogdGhpcyBsaXN0IGlzIGluY29tcGxldGUuICBJdCBzaG91bGQgYWxzbyBiZSBhbiBlbnVtZXJhdGVkCi0gICB0eXBlIHJhdGhlciB0aGFuICNkZWZpbmVzLiAgKi8KLQotI2RlZmluZSBMRE8JMHgwZAotI2RlZmluZSBMREIJMHgxMAotI2RlZmluZSBMREgJMHgxMQotI2RlZmluZSBMRFcJMHgxMgotI2RlZmluZSBMRFdNCTB4MTMKLSNkZWZpbmUgU1RCCTB4MTgKLSNkZWZpbmUgU1RICTB4MTkKLSNkZWZpbmUgU1RXCTB4MWEKLSNkZWZpbmUgU1RXTQkweDFiCi0jZGVmaW5lIENPTUlDTFIJMHgyNAotI2RlZmluZSBTVUJJCTB4MjUKLSNkZWZpbmUgU1VCSU8JMHgyNQotI2RlZmluZSBBRERJVAkweDJjCi0jZGVmaW5lIEFERElUTwkweDJjCi0jZGVmaW5lIEFEREkJMHgyZAotI2RlZmluZSBBRERJTwkweDJkCi0jZGVmaW5lIExESUwJMHgwOAotI2RlZmluZSBBRERJTAkweDBhCi0KLSNkZWZpbmUgTU9WQgkweDMyCi0jZGVmaW5lIE1PVklCCTB4MzMKLSNkZWZpbmUgQ09NQlQJMHgyMAotI2RlZmluZSBDT01CRgkweDIyCi0jZGVmaW5lIENPTUlCVAkweDIxCi0jZGVmaW5lIENPTUlCRgkweDIzCi0jZGVmaW5lIEFEREJUCTB4MjgKLSNkZWZpbmUgQUREQkYJMHgyYQotI2RlZmluZSBBRERJQlQJMHgyOQotI2RlZmluZSBBRERJQkYJMHgyYgotI2RlZmluZSBCVkIJMHgzMAotI2RlZmluZSBCQgkweDMxCi0KLSNkZWZpbmUgQkwJMHgzYQotI2RlZmluZSBCTEUJMHgzOQotI2RlZmluZSBCRQkweDM4Ci0KLSAgCi0vKiBHaXZlbiBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sIHJldHVybiBpdHMgZm9ybWF0LgotCi0gICBGSVhNRTogIG9wY29kZXMgd2hpY2ggZG8gbm90IG1hcCB0byBhIGtub3duIGZvcm1hdAotICAgc2hvdWxkIHJldHVybiBhbiBlcnJvciBvZiBzb21lIHNvcnQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGNoYXIKLWJmZF9ocHBhX2luc24yZm10IChpbnNuKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci17Ci0gIGNoYXIgZm10ID0gLTE7Ci0gIHVuc2lnbmVkIGNoYXIgb3AgPSBnZXRfb3Bjb2RlIChpbnNuKTsKLSAgCi0gIHN3aXRjaCAob3ApCi0gICAgewotICAgIGNhc2UgQURESToKLSAgICBjYXNlIEFERElUOgotICAgIGNhc2UgU1VCSToKLSAgICAgIGZtdCA9IDExOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1ZCOgotICAgIGNhc2UgTU9WSUI6Ci0gICAgY2FzZSBDT01CVDoKLSAgICBjYXNlIENPTUJGOgotICAgIGNhc2UgQ09NSUJUOgotICAgIGNhc2UgQ09NSUJGOgotICAgIGNhc2UgQUREQlQ6Ci0gICAgY2FzZSBBRERCRjoKLSAgICBjYXNlIEFERElCVDoKLSAgICBjYXNlIEFERElCRjoKLSAgICBjYXNlIEJWQjoKLSAgICBjYXNlIEJCOgotICAgICAgZm10ID0gMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExETzoKLSAgICBjYXNlIExEQjoKLSAgICBjYXNlIExESDoKLSAgICBjYXNlIExEVzoKLSAgICBjYXNlIExEV006Ci0gICAgY2FzZSBTVEI6Ci0gICAgY2FzZSBTVEg6Ci0gICAgY2FzZSBTVFc6Ci0gICAgY2FzZSBTVFdNOgotICAgICAgZm10ID0gMTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJMOgotICAgIGNhc2UgQkU6Ci0gICAgY2FzZSBCTEU6Ci0gICAgICBmbXQgPSAxNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTERJTDoKLSAgICBjYXNlIEFERElMOgotICAgICAgZm10ID0gMjE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZm10ID0gMzI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmbXQ7Ci19Ci0KLQotLyogSW5zZXJ0IFZBTFVFIGludG8gSU5TTiB1c2luZyBSX0ZPUk1BVCB0byBkZXRlcm1pbmUgZXhhY3RseSB3aGF0Ci0gICBiaXRzIHRvIGNoYW5nZS4gICovCi0gICAKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHZhbHVlLCByX2Zvcm1hdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY29uc3RfcGFydDsKLSAgdW5zaWduZWQgbG9uZyByZWJ1aWx0X3BhcnQ7Ci0KLSAgc3dpdGNoIChyX2Zvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSAxMToKLSAgICAgIHsKLQl1bnNpZ25lZCB3MSwgdzsKLQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmZTAwMjsKLQlkaXNfYXNzZW1ibGVfMTIgKHZhbHVlLCAmdzEsICZ3KTsKLQlyZWJ1aWx0X3BhcnQgPSAodzEgPDwgMikgfCB3OwotCXJldHVybiBjb25zdF9wYXJ0IHwgcmVidWlsdF9wYXJ0OwotICAgICAgfQotCi0gICAgY2FzZSAxMjoKLSAgICAgIHsKLQl1bnNpZ25lZCB3MSwgdzsKLQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmZTAwMjsKLQlkaXNfYXNzZW1ibGVfMTIgKHZhbHVlLCAmdzEsICZ3KTsKLQlyZWJ1aWx0X3BhcnQgPSAodzEgPDwgMikgfCB3OwotCXJldHVybiBjb25zdF9wYXJ0IHwgcmVidWlsdF9wYXJ0OwotICAgICAgfQotCi0gICAgY2FzZSAxNDoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZXh0OwotCQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmYzAwMDsKLQlsb3dfc2lnbl91bmV4dCAodmFsdWUsIDE0LCAmZXh0KTsKLQlyZXR1cm4gY29uc3RfcGFydCB8IGV4dDsKLSAgICAgIH0KLQotICAgIGNhc2UgMTc6Ci0gICAgICB7Ci0JdW5zaWduZWQgdzEsIHcyLCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZTBlMDAyOwotCWRpc19hc3NlbWJsZV8xNyAodmFsdWUsICZ3MSwgJncyLCAmdyk7Ci0JcmVidWlsdF9wYXJ0ID0gKHcyIDw8IDIpIHwgKHcxIDw8IDE2KSB8IHc7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCByZWJ1aWx0X3BhcnQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDIxOgotICAgICAgewotCXVuc2lnbmVkIGludCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZTAwMDAwOwotCWRpc19hc3NlbWJsZV8yMSAodmFsdWUsICZ3KTsKLQlyZXR1cm4gY29uc3RfcGFydCB8IHc7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDMyOgotICAgICAgY29uc3RfcGFydCA9IDA7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICByZXR1cm4gaW5zbjsKLX0KLQotI2VuZGlmIC8qIF9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJpZWVlLmggYi9iZmQvbGliaWVlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU4MDZlLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJpZWVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogSUVFRS02OTUgb2JqZWN0IGZpbGUgZm9ybWF0czogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIE1vc3RseSBTdGV2ZSBDaGFtYmVybGFpbidzIGZhdWx0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IGluZGV4OjI0OwotICBjaGFyIGxldHRlcjsKLX0gaWVlZV9zeW1ib2xfaW5kZXhfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgY3QgewotICBiZmQgKnRoaXM7Ci0gIHN0cnVjdCBjdCAqbmV4dDsKLX0gYmZkX2NoYWluX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfc3ltYm9sIAotewotICBhc3ltYm9sIHN5bWJvbDsKLSAgc3RydWN0IGllZWVfc3ltYm9sICpuZXh0OwotCi0gIHVuc2lnbmVkIGludCBpbmRleDsKLX0gaWVlZV9zeW1ib2xfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3JlbG9jIHsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHN0cnVjdCBpZWVlX3JlbG9jICpuZXh0OwotICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbDsKLQotfSBpZWVlX3JlbG9jX3R5cGU7Ci0KLSNkZWZpbmUgaWVlZV9zeW1ib2woeCkgKChpZWVlX3N5bWJvbF90eXBlICopKHgpKQotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3Blcl9zZWN0aW9uCi17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJmZF92bWEgcGM7Ci0gIC8qIEZvciBvdXRwdXQgKi8KLSAgZmlsZV9wdHIgY3VycmVudF9wb3M7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X2J5dGU7Ci0gIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0gIGllZWVfcmVsb2NfdHlwZSAqKnJlbG9jX3RhaWxfcHRyOwotfSBpZWVlX3Blcl9zZWN0aW9uX3R5cGU7Ci0KLSNkZWZpbmUgaWVlZV9wZXJfc2VjdGlvbih4KSAoKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSgoeCktPnVzZWRfYnlfYmZkKSkKLSAgCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkICBjaGFyICppbnB1dF9wOwotICB1bnNpZ25lZCBjaGFyICpmaXJzdF9ieXRlOwotICBiZmQgKmFiZmQ7Ci19IGNvbW1vbl9oZWFkZXJfdHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfZGF0YV9zdHJ1Y3QKLXsKLSAgY29tbW9uX2hlYWRlcl90eXBlIGg7Ci0gIGJvb2xlYW4gcmVhZF9zeW1ib2xzOwotICBib29sZWFuIHJlYWRfZGF0YTsJCi0gIGZpbGVfcHRyIG91dHB1dF9jdXJzb3I7Ci0gIC8qIE1hcCBvZiBzZWN0aW9uIGluZGV4ZXMgdG8gc2VjdGlvbiBwdHJzICovCi0gIGFzZWN0aW9uICoqc2VjdGlvbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fdGFibGVfc2l6ZTsKLSAgaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfdHlwZSBhZDsKLSAgaWVlZV9tb2R1bGVfYmVnaW5fdHlwZSBtYjsKLSAgaWVlZV93X3ZhcmlhYmxlX3R5cGUgdzsKLSAgCi0gIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OwotICAKLSAgdW5zaWduZWQgaW50IG1hcF9pZHg7Ci0gIC8qIExpc3Qgb2YgR0xPQkFMIEVYUE9SVCBzeW1ib2xzICovCi0gIGllZWVfc3ltYm9sX3R5cGUgKmV4dGVybmFsX3N5bWJvbHM7Ci0gIC8qIExpc3Qgb2YgVU5ERUZJTkVEIHN5bWJvbHMgKi8KLSAgaWVlZV9zeW1ib2xfdHlwZSAqZXh0ZXJuYWxfcmVmZXJlbmNlOwotICAKLSAgLyogV2hlbiB0aGUgc3ltYm9scyBoYXZlIGJlZW4gY2Fub25pY2FsaXplZCwgdGhleSBhcmUgaW4gYQotICAgICogc3BlY2lhbCBvcmRlciwgd2UgcmVtZW1iZXIgdmFyaW91cyBiYXNlcyBoZXJlLi4gKi8KLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9zeW1ib2xfbWluX2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfc3ltYm9sX2NvdW50OwotICBpbnQgZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0OwotICAKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50OwotICBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0OwotICAKLQotICBib29sZWFuIHN5bWJvbF90YWJsZV9mdWxsOwotCi0gIAotYm9vbGVhbiBkb25lX2RlYnVnOwotCi0KLWJmZF9jaGFpbl90eXBlICpjaGFpbl9oZWFkOwotYmZkX2NoYWluX3R5cGUgKmNoYWluX3Jvb3Q7Ci0KLX0gaWVlZV9kYXRhX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7Ci0gIGJmZCAqYWJmZDsKLX0gaWVlZV9hcl9vYnN0YWNrX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfYXJfZGF0YV9zdHJ1Y3QgCi17Ci0gIGNvbW1vbl9oZWFkZXJfdHlwZSBoOwotICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqZWxlbWVudHM7Ci0gIAotICB1bnNpZ25lZCAgaW50IGVsZW1lbnRfaW5kZXggOwotICB1bnNpZ25lZCBpbnQgZWxlbWVudF9jb3VudDsKLQotfSBpZWVlX2FyX2RhdGFfdHlwZTsKLQotI2RlZmluZSBJRUVFX0RBVEEoYWJmZCkgKChhYmZkKS0+dGRhdGEuaWVlZV9kYXRhKQotI2RlZmluZSBJRUVFX0FSX0RBVEEoYWJmZCkgKChhYmZkKS0+dGRhdGEuaWVlZV9hcl9kYXRhKQotCi0jZGVmaW5lIHB0cihhYmZkKSAoaWVlZV9kYXRhKGFiZmQpLT5pbnB1dF9wKQpkaWZmIC0tZ2l0IGEvYmZkL2xpYm5sbS5oIGIvYmZkL2xpYm5sbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmQyZTRlLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJubG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlcykgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQk5MTV9IXwotI2RlZmluZSBfTElCTkxNX0hfIDEKLQotI2lmZGVmIEFSQ0hfU0laRQotIyAgZGVmaW5lIE5MTV9BUkNIX1NJWkUgQVJDSF9TSVpFCi0jZW5kaWYKLSNpbmNsdWRlICJubG0vY29tbW9uLmgiCi0jaW5jbHVkZSAibmxtL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibmxtL2V4dGVybmFsLmgiCi0KLS8qIEEgcmVsb2MgZm9yIGFuIGltcG9ydGVkIE5MTSBzeW1ib2wuICBOb3JtYWwgcmVsb2NzIGFyZSBhc3NvY2lhdGVkCi0gICB3aXRoIHNlY3Rpb25zLCBhbmQgaW5jbHVkZSBhIHN5bWJvbC4gIFRoZXNlIHJlbG9jcyBhcmUgYXNzb2NpYXRlZAotICAgd2l0aCAodW5kZWZpbmVkKSBzeW1ib2xzLCBhbmQgaW5jbHVkZSBhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgbmxtX3JlbGVudAotewotICAvKiBTZWN0aW9uIG9mIHJlbG9jLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIFJlbG9jIGluZm8gKHN5bV9wdHJfcHRyIGZpZWxkIHNldCBvbmx5IHdoZW4gY2Fub25pY2FsaXplZCkuICAqLwotICBhcmVsZW50IHJlbG9jOwotfTsKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYW4gTkxNIHN5bWJvbC4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEJGRCBzeW1ib2wuICAqLwotICBhc3ltYm9sIHN5bWJvbDsKLSAgLyogTnVtYmVyIG9mIHJlbG9jIGVudHJpZXMgZm9yIGltcG9ydGVkIHN5bWJvbC4gICovCi0gIGJmZF9zaXplX3R5cGUgcmNudDsKLSAgLyogQXJyYXkgb2YgcmVsb2MgaW5mb3JtYXRpb24gZm9yIGltcG9ydGVkIHN5bWJvbC4gICovCi0gIHN0cnVjdCBubG1fcmVsZW50ICpyZWxvY3M7Ci19IG5sbU5BTUUoc3ltYm9sX3R5cGUpOwotCi1leHRlcm4gYm9vbGVhbiBubG1fbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIG5sbV9zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCi0JCQkJCSAgdW5zaWduZWQgbG9uZykpOwotCi1leHRlcm4gdm9pZCBubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSAgICAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfc3ltdGFiKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGFzeW1ib2wgKm5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBubG1OQU1FKHByaW50X3N5bWJvbCkKLSAgICAgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqbmxtTkFNRShvYmplY3RfcCkKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIG5sbU5BTUUoc2V0X2FyY2hfbWFjaCkKLSAgICAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLSAgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIG5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBTb21lIHByaXZhdGUgZGF0YSBpcyBzdGFzaGVkIGF3YXkgZm9yIGZ1dHVyZSB1c2UgdXNpbmcgdGhlIHRkYXRhIHBvaW50ZXIKLSAgIGluIHRoZSBiZmQgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG5sbV9vYmpfdGRhdGEKLXsKLSAgLyogQWN0dWFsIGRhdGEsIGJ1dCByZWYgbGlrZSBwdHIgKi8KLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcglubG1fZml4ZWRfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCW5sbV92YXJpYWJsZV9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcglubG1fdmVyc2lvbl9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCW5sbV9jb3B5cmlnaHRfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCW5sbV9leHRlbmRlZF9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCW5sbV9jdXN0b21faGRyWzFdOwotICBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgbmxtX2N5Z251c19leHRfaGRyWzFdOwotICAvKiBCRkQgTkxNIHN5bWJvbHMuICAqLwotICBubG1OQU1FKHN5bWJvbF90eXBlKQkJKm5sbV9zeW1ib2xzOwotICAvKiBMb3dlc3QgdGV4dCBhbmQgZGF0YSBWTUEgdmFsdWVzLiAgKi8KLSAgYmZkX3ZtYQkJCW5sbV90ZXh0X2xvdzsKLSAgYmZkX3ZtYQkJCW5sbV9kYXRhX2xvdzsKLSAgLyogQ2FjaGVzIGZvciBkYXRhIHJlYWQgZnJvbSBvYmplY3QgZmlsZS4gICovCi0gIGFyZWxlbnQgKgkJCW5sbV9yZWxvY19maXh1cHM7Ci0gIGFzZWN0aW9uICoqCQkJbmxtX3JlbG9jX2ZpeHVwX3NlY3M7Ci0gIC8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIHBvaW50ZXIsCi0gICAgIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgeWV0IGFub3RoZXIgZW50cnkgcG9pbnQgdG8gaW5pdGlhbGl6ZSB0aGUKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QJLyogQWxwaGEgYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0JewotCSAgYmZkX3ZtYSBncDsJCQkvKiBHUCB2YWx1ZS4gICovCi0JICBiZmRfdm1hIGxpdGFfYWRkcmVzczsJCS8qIC5saXRhIHNlY3Rpb24gYWRkcmVzcy4gICovCi0JICBiZmRfc2l6ZV90eXBlIGxpdGFfc2l6ZTsJLyogLmxpdGEgc2VjdGlvbiBzaXplLiAgKi8KLQl9Ci0gICAgICBhbHBoYV9iYWNrZW5kX2RhdGE7Ci0gICAgfQotICBiYWNrZW5kX2RhdGE7Ci19OwotCi0jZGVmaW5lIG5sbV90ZGF0YShiZmQpCQkJKChiZmQpIC0+IHRkYXRhLm5sbV9vYmpfZGF0YSkKLSNkZWZpbmUgbmxtX2ZpeGVkX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2ZpeGVkX2hkcikKLSNkZWZpbmUgbmxtX3ZhcmlhYmxlX2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdmFyaWFibGVfaGRyKQotI2RlZmluZSBubG1fdmVyc2lvbl9oZWFkZXIoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV92ZXJzaW9uX2hkcikKLSNkZWZpbmUgbmxtX2NvcHlyaWdodF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2NvcHlyaWdodF9oZHIpCi0jZGVmaW5lIG5sbV9leHRlbmRlZF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2V4dGVuZGVkX2hkcikKLSNkZWZpbmUgbmxtX2N1c3RvbV9oZWFkZXIoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9jdXN0b21faGRyKQotI2RlZmluZSBubG1fY3lnbnVzX2V4dF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2N5Z251c19leHRfaGRyKQotI2RlZmluZSBubG1fZ2V0X3N5bWJvbHMoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9zeW1ib2xzKQotI2RlZmluZSBubG1fc2V0X3N5bWJvbHMoYmZkLCBwKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9zeW1ib2xzID0gKHApKQotI2RlZmluZSBubG1fc2V0X3RleHRfbG93KGJmZCwgaSkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV90ZXh0X2xvdyA9IChpKSkKLSNkZWZpbmUgbmxtX2dldF90ZXh0X2xvdyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3RleHRfbG93KQotI2RlZmluZSBubG1fc2V0X2RhdGFfbG93KGJmZCwgaSkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9kYXRhX2xvdyA9IChpKSkKLSNkZWZpbmUgbmxtX2dldF9kYXRhX2xvdyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2RhdGFfbG93KQotI2RlZmluZSBubG1fcmVsb2NhdGlvbl9maXh1cHMoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3JlbG9jX2ZpeHVwcykKLSNkZWZpbmUgbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcyhiZmQpCShubG1fdGRhdGEoYmZkKS0+bmxtX3JlbG9jX2ZpeHVwX3NlY3MpCi0KLSNkZWZpbmUgbmxtX2FscGhhX2JhY2tlbmRfZGF0YShiZmQpIFwKLSAgKCZubG1fdGRhdGEgKGJmZCktPmJhY2tlbmRfZGF0YS5hbHBoYV9iYWNrZW5kX2RhdGEpCi0KLS8qIFRoaXMgaXMgdXNlZCB3aGVuIHdyaXRpbmcgb3V0IHRoZSBleHRlcm5hbCByZWxvY3MuICovCi0KLXN0cnVjdCByZWxvY19hbmRfc2VjCi17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYXNlY3Rpb24gKnNlYzsKLX07Ci0KLS8qIFdlIHN0b3JlIHNvbWUgZnVuY3Rpb24gcG9pbnRlciBpbiB0aGUgYmFja2VuZCBzdHJ1Y3R1cmUuICBUaGlzIGxldHMKLSAgIGRpZmZlcmVudCBOTE0gdGFyZ2V0cyBzaGFyZSBtb3N0IG9mIHRoZSBzYW1lIGNvZGUsIHdoaWxlIHByb3ZpZGluZwotICAgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUgd2hlcmUgbmVjZXNzYXJ5LiAgKi8KLQotc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEKLXsKLSAgLyogU2lnbmF0dXJlIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBjaGFyIHNpZ25hdHVyZVtOTE1fU0lHTkFUVVJFX1NJWkVdOwotICAvKiBTaXplIG9mIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIGZpeGVkX2hlYWRlcl9zaXplOwotICAvKiBTaXplIG9mIG9wdGlvbmFsIHByZWZpeCBmb3IgdGhpcyBiYWNrZW5kLiAgU29tZSBiYWNrZW5kIG1heQotICAgICByZXF1aXJlIHRoaXMgdG8gYmUgYSBmdW5jdGlvbiwgYnV0IHNvIGZhciBhIGNvbnN0YW50IGlzIE9LLiAgVGhpcwotICAgICBpcyBmb3IgYSBwcmVmaXggd2hpY2ggcHJlY2VkZXMgdGhlIHN0YW5kYXJkIE5MTSBmaXhlZCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG9wdGlvbmFsX3ByZWZpeF9zaXplOwotICAvKiBBcmNoaXRlY3R1cmUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogTWFjaGluZS4gICovCi0gIGxvbmcgbWFjaDsKLSAgLyogU29tZSBOTE0gZm9ybWF0cyBkbyBub3QgdXNlIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiwgc28KLSAgICAgYWxsIHVuaW5pdGlhbGl6ZWQgZGF0YSBtdXN0IGJlIHB1dCBpbnRvIHRoZSByZWd1bGFyIGRhdGEgc2VjdGlvbgotICAgICBpbnN0ZWFkLiAgKi8KLSAgYm9vbGVhbiBub191bmluaXRpYWxpemVkX2RhdGE7Ci0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgaGF2ZSBhIHByZWZpeCBvbiB0aGUgZmlsZS4gIElmIHRoaXMgZnVuY3Rpb24gaXMKLSAgICAgbm90IE5VTEwsIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IG5sbV9vYmplY3RfcC4gIEl0IHNob3VsZCByZXR1cm4KLSAgICAgdHJ1ZSBpZiB0aGlzIGZpbGUgY291bGQgbWF0Y2ggdGhpcyBmb3JtYXQsIGFuZCBpdCBzaG91bGQgbGVhdmUKLSAgICAgdGhlIEJGRCBzdWNoIHRoYXQgYSBiZmRfcmVhZCB3aWxsIHBpY2sgdXAgdGhlIGZpeGVkIGhlYWRlci4gICovCi0gIGJvb2xlYW4gKCpubG1fYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLSAgLyogV3JpdGUgb3V0IHRoZSBwcmVmaXguICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBOVUxMLiAgVGhpcyBtdXN0Ci0gICAgIHdyaXRlIG91dCB0aGUgc2FtZSBudW1iZXIgb2YgYnl0ZXMgYXMgaXMgaW4gdGhlIGZpZWxkCi0gICAgIG9wdGlvbmFsX3ByZWZpeF9zaXplLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9wcmVmaXgpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIC8qIFJlYWQgYSByZWxvY2F0aW9uIGZpeHVwIGZyb20gYWJmZC4gIFRoZSByZWxvYyBpbmZvcm1hdGlvbiBpcwotICAgICBtYWNoaW5lIHNwZWNpZmljLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgc3ltYm9sIGlmIHRoaXMgaXMKLSAgICAgYW4gaW1wb3J0LCBvciBOVUxMIGlmIHRoaXMgaXMgYSByZWxvYyBmaXh1cC4gIFRoaXMgZnVuY3Rpb24KLSAgICAgc2hvdWxkIHNldCB0aGUgdGhpcmQgYXJndW1lbnQgdG8gdGhlIHNlY3Rpb24gd2hpY2ggdGhlIHJlbG9jCi0gICAgIGJlbG9uZ3MgaW4sIGFuZCB0aGUgZm91cnRoIGFyZ3VtZW50IHRvIHRoZSByZWxvYyBpdHNlbGY7IGl0IGRvZXMKLSAgICAgbm90IG5lZWQgdG8gZmlsbCBpbiB0aGUgc3ltX3B0cl9wdHIgZmllbGQgZm9yIGEgcmVsb2MgYWdhaW5zdCBhbgotICAgICBpbXBvcnQgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9yZWFkX3JlbG9jKSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwKLQkJCQkgICAgIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLSAgLyogVG8gbWFrZSBvYmpjb3B5IHRvIGFuIGkzODYgTkxNIHdvcmssIHRoZSBpMzg2IGJhY2tlbmQgbmVlZHMgYQotICAgICBjaGFuY2UgdG8gd29yayBvdmVyIHRoZSByZWxvY3MuICBUaGlzIGlzIGEgYml0IGlja3kuICAqLwotICBib29sZWFuICgqbmxtX21hbmdsZV9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgZGF0YSwKLQkJCQkJYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCWJmZF9zaXplX3R5cGUgY291bnQpKTsKLSAgLyogUmVhZCBhbiBpbXBvcnQgcmVjb3JkIGZyb20gYWJmZC4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhpcwotICAgICB3ZXJlIGluIGEgbWFjaGluZS1kZXBlbmRlbnQgZm9ybWF0LCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIGJlLiAqLwotICBib29sZWFuICgqbmxtX3JlYWRfaW1wb3J0KSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotICAvKiBXcml0ZSBhbiBpbXBvcnQgcmVjb3JkIHRvIGFiZmQuICovCi0gIGJvb2xlYW4gKCpubG1fd3JpdGVfaW1wb3J0KSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci0gIC8qIFNldCB0aGUgc2VjdGlvbiBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgVGhpcyBtYXkgYmUgTlVMTCwgaW4gd2hpY2gKLSAgICAgY2FzZSBhIGRlZmF1bHQgbWV0aG9kIHdpbGwgYmUgdXNlZC4gICovCi0gIGJvb2xlYW4gKCpubG1fc2V0X3B1YmxpY19zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotICAvKiBHZXQgdGhlIG9mZnNldCB0byB3cml0ZSBvdXQgZm9yIGEgcHVibGljIHN5bWJvbC4gIFRoaXMgbWF5IGJlCi0gICAgIE5VTEwsIGluIHdoaWNoIGNhc2UgYSBkZWZhdWx0IG1ldGhvZCB3aWxsIGJlIHVzZWQuICAqLwotICBiZmRfdm1hICgqbmxtX2dldF9wdWJsaWNfb2Zmc2V0KSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0gIC8qIFN3YXAgdGhlIGZpeGVkIGhlYWRlciBpbiBhbmQgb3V0ICovCi0gIHZvaWQgKCpubG1fc3dhcF9maGRyX2luKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkgICAgUFRSLAotCQkJCSAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICopKTsKLSAgdm9pZCAoKm5sbV9zd2FwX2ZoZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwKLQkJCQkgICAgIHN0cnVjdCBubG1faW50ZXJuYWxfZml4ZWRfaGVhZGVyICosCi0JCQkJICAgICBQVFIpKTsKLSAgLyogV3JpdGUgb3V0IGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0gIGJvb2xlYW4gKCpubG1fd3JpdGVfZXh0ZXJuYWwpIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLAotCQkJCQkgYXN5bWJvbCAqLAotCQkJCQkgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotICBib29sZWFuICgqbmxtX3dyaXRlX2V4cG9ydCkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkX3ZtYSkpOwotfTsKLQotI2RlZmluZSBubG1fYmFja2VuZChiZmQpIFwKLSAgKChzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSAqKSgoYmZkKSAtPiB4dmVjIC0+IGJhY2tlbmRfZGF0YSkpCi0jZGVmaW5lIG5sbV9zaWduYXR1cmUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IHNpZ25hdHVyZSkKLSNkZWZpbmUgbmxtX2ZpeGVkX2hlYWRlcl9zaXplKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBmaXhlZF9oZWFkZXJfc2l6ZSkKLSNkZWZpbmUgbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBvcHRpb25hbF9wcmVmaXhfc2l6ZSkKLSNkZWZpbmUgbmxtX2FyY2hpdGVjdHVyZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gYXJjaCkKLSNkZWZpbmUgbmxtX21hY2hpbmUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG1hY2gpCi0jZGVmaW5lIG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5vX3VuaW5pdGlhbGl6ZWRfZGF0YSkKLSNkZWZpbmUgbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX2JhY2tlbmRfb2JqZWN0X3ApCi0jZGVmaW5lIG5sbV93cml0ZV9wcmVmaXhfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX3ByZWZpeCkKLSNkZWZpbmUgbmxtX3JlYWRfcmVsb2NfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3JlYWRfcmVsb2MpCi0jZGVmaW5lIG5sbV9tYW5nbGVfcmVsb2NzX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9tYW5nbGVfcmVsb2NzKQotI2RlZmluZSBubG1fcmVhZF9pbXBvcnRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3JlYWRfaW1wb3J0KQotI2RlZmluZSBubG1fd3JpdGVfaW1wb3J0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9pbXBvcnQpCi0jZGVmaW5lIG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3NldF9wdWJsaWNfc2VjdGlvbikKLSNkZWZpbmUgbmxtX2dldF9wdWJsaWNfb2Zmc2V0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9nZXRfcHVibGljX29mZnNldCkKLSNkZWZpbmUgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9zd2FwX2ZoZHJfaW4pCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3N3YXBfZmhkcl9vdXQpCi0jZGVmaW5lIG5sbV93cml0ZV9leHRlcm5hbF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfZXh0ZXJuYWwpCi0jZGVmaW5lIG5sbV93cml0ZV9leHBvcnRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX2V4cG9ydCkKLQotLyogVGhlIE5MTSBjb2RlLCBkYXRhLCBhbmQgdW5pbml0aWFsaXplZCBzZWN0aW9ucyBoYXZlIG5vIG5hbWVzIGRlZmluZWQKLSAgIGluIHRoZSBOTE0sIGJ1dCBiZmQgd2FudHMgdG8gZ2l2ZSB0aGVtIG5hbWVzLCBzbyB1c2UgdGhlIHRyYWRpdGlvbmFsCi0gICBVTklYIG5hbWVzLiAgKi8KLQotI2RlZmluZSBOTE1fQ09ERV9OQU1FCQkJIi50ZXh0IgotI2RlZmluZSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FCSIuZGF0YSIKLSNkZWZpbmUgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FCSIuYnNzIgotCi0jZW5kaWYgLyogX0xJQk5MTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYm9hc3lzLmggYi9iZmQvbGlib2FzeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZWE1OS4uMDAwMDAwMAotLS0gYS9iZmQvbGlib2FzeXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIEJGRCBpbnRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIE9hc3lzIGZpbGUgZm9ybWF0IGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBTY3Jhd2xlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfc3ltYm9sCi17Ci0gIGFzeW1ib2wgc3ltYm9sOwotfSBvYXN5c19zeW1ib2xfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3JlbG9jIHsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHN0cnVjdCBfb2FzeXNfcmVsb2MgKm5leHQ7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2w7Ci19IG9hc3lzX3JlbG9jX3R5cGU7Ci0KLQotI2RlZmluZSBvYXN5c19zeW1ib2woeCkgKChvYXN5c19zeW1ib2xfdHlwZSAqKSh4KSkKLSNkZWZpbmUgb2FzeXNfcGVyX3NlY3Rpb24oeCkgKChvYXN5c19wZXJfc2VjdGlvbl90eXBlICopKHgtPnVzZWRfYnlfYmZkKSkKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3Blcl9zZWN0aW9uCi17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJvb2xlYW4gaGFkX3ZtYTsKLSAgb2FzeXNfcmVsb2NfdHlwZSAqKnJlbG9jX3RhaWxfcHRyOwotICBiZmRfdm1hIHBjOwotCi0KLSAgZmlsZV9wdHIgY3VycmVudF9wb3M7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X2J5dGU7Ci0gIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci19IG9hc3lzX3Blcl9zZWN0aW9uX3R5cGU7Ci0KLSNkZWZpbmUgTlNFQ1RJT05TIDEwCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19hcl9vYnN0YWNrIHsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7Ci0gIGJmZCAqYWJmZDsKLX0gb2FzeXNfYXJfb2JzdGFja190eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19tb2R1bGVfaW5mbyB7Ci0gIGZpbGVfcHRyIHBvczsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqbmFtZTsKLX0gb2FzeXNfbW9kdWxlX2luZm9fdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgewotICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2R1bGU7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfaW5kZXg7Ci19IG9hc3lzX2FyX2RhdGFfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX2RhdGEgewotICBjaGFyICpzdHJpbmdzOwotICBhc3ltYm9sICpzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3N0cmluZ19sZW5ndGg7Ci0gIGFzZWN0aW9uICpzZWN0aW9uc1tPQVNZU19NQVhfU0VDX0NPVU5UXTsKLSAgZmlsZV9wdHIgZmlyc3RfZGF0YV9yZWNvcmQ7Ci19IG9hc3lzX2RhdGFfdHlwZTsKLQotI2RlZmluZSBPQVNZU19EQVRBKGFiZmQpCSgoYWJmZCktPnRkYXRhLm9hc3lzX29ial9kYXRhKQotI2RlZmluZSBPQVNZU19BUl9EQVRBKGFiZmQpCSgoYWJmZCktPnRkYXRhLm9hc3lzX2FyX2RhdGEpCi0KZGlmZiAtLWdpdCBhL2JmZC9saW5rZXIuYyBiL2JmZC9saW5rZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmYjYyMS4uMDAwMDAwMAotLS0gYS9iZmQvbGlua2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODA0ICswLDAgQEAKLS8qIGxpbmtlci5jIC0tIEJGRCBsaW5rZXIgcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotCi0vKgotU0VDVElPTgotCUxpbmtlciBGdW5jdGlvbnMKLQotQGNpbmRleCBMaW5rZXIKLQlUaGUgbGlua2VyIHVzZXMgdGhyZWUgc3BlY2lhbCBlbnRyeSBwb2ludHMgaW4gdGhlIEJGRCB0YXJnZXQKLQl2ZWN0b3IuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHdyaXRlIHNwZWNpYWwgcm91dGluZXMgZm9yCi0JdGhlc2UgZW50cnkgcG9pbnRzIHdoZW4gY3JlYXRpbmcgYSBuZXcgQkZEIGJhY2sgZW5kLCBzaW5jZQotCWdlbmVyaWMgdmVyc2lvbnMgYXJlIHByb3ZpZGVkLiAgSG93ZXZlciwgd3JpdGluZyB0aGVtIGNhbgotCXNwZWVkIHVwIGxpbmtpbmcgYW5kIG1ha2UgaXQgdXNlIHNpZ25pZmljYW50bHkgbGVzcyBydW50aW1lCi0JbWVtb3J5LgotCi0JVGhlIGZpcnN0IHJvdXRpbmUgY3JlYXRlcyBhIGhhc2ggdGFibGUgdXNlZCBieSB0aGUgb3RoZXIKLQlyb3V0aW5lcy4gIFRoZSBzZWNvbmQgcm91dGluZSBhZGRzIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0JZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gIFRoZSB0aGlyZCByb3V0aW5lIHRha2VzIGFsbCB0aGUKLQlvYmplY3QgZmlsZXMgYW5kIGxpbmtzIHRoZW0gdG9nZXRoZXIgdG8gY3JlYXRlIHRoZSBvdXRwdXQKLQlmaWxlLiAgVGhlc2Ugcm91dGluZXMgYXJlIGRlc2lnbmVkIHNvIHRoYXQgdGhlIGxpbmtlciBwcm9wZXIKLQlkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIHN5bWJvbHMgaW4gdGhlIG9iamVjdAotCWZpbGVzIHRoYXQgaXQgaXMgbGlua2luZy4gIFRoZSBsaW5rZXIgbWVyZWx5IGFycmFuZ2VzIHRoZQotCXNlY3Rpb25zIGFzIGRpcmVjdGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IGFuZCBsZXRzIEJGRCBoYW5kbGUKLQl0aGUgZGV0YWlscyBvZiBzeW1ib2xzIGFuZCByZWxvY3MuCi0KLQlUaGUgc2Vjb25kIHJvdXRpbmUgYW5kIHRoaXJkIHJvdXRpbmVzIGFyZSBwYXNzZWQgYSBwb2ludGVyIHRvCi0JYSA8PHN0cnVjdCBiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlIChkZWZpbmVkIGluCi0JPDxiZmRsaW5rLmg+Pikgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIGxpbmssCi0JaW5jbHVkaW5nIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSAod2hpY2ggd2FzIGNyZWF0ZWQgYnkgdGhlCi0JZmlyc3Qgcm91dGluZSkgYW5kIGEgc2V0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byB0aGUgbGlua2VyCi0JcHJvcGVyLgotCi0JVGhlIGdlbmVyaWMgbGlua2VyIHJvdXRpbmVzIGFyZSBpbiA8PGxpbmtlci5jPj4sIGFuZCB1c2UgdGhlCi0JaGVhZGVyIGZpbGUgPDxnZW5saW5rLmg+Pi4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhlIG9ubHkgYmFjawotCWVuZHMgd2hpY2ggaGF2ZSBpbXBsZW1lbnRlZCB2ZXJzaW9ucyBvZiB0aGVzZSByb3V0aW5lcyBhcmUKLQlhLm91dCAoaW4gPDxhb3V0eC5oPj4pIGFuZCBFQ09GRiAoaW4gPDxlY29mZi5jPj4pLiAgVGhlIGEub3V0Ci0Jcm91dGluZXMgYXJlIHVzZWQgYXMgZXhhbXBsZXMgdGhyb3VnaG91dCB0aGlzIHNlY3Rpb24uCi0KLUBtZW51CQotQCogQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZTo6Ci1AKiBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZTo6Ci1AKiBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rOjoKLUBlbmQgbWVudQotCi1JTk9ERQotQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlDcmVhdGluZyBhIGxpbmtlciBoYXNoIHRhYmxlCi0KLUBjaW5kZXggX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGluIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKQotCVRoZSBsaW5rZXIgcm91dGluZXMgbXVzdCBjcmVhdGUgYSBoYXNoIHRhYmxlLCB3aGljaCBtdXN0IGJlCi0JZGVyaXZlZCBmcm9tIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+PiBkZXNjcmliZWQgaW4KLQk8PGJmZGxpbmsuYz4+LiAgQHhyZWZ7SGFzaCBUYWJsZXN9LCBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvCi0JY3JlYXRlIGEgZGVyaXZlZCBoYXNoIHRhYmxlLiAgVGhpcyBlbnRyeSBwb2ludCBpcyBjYWxsZWQgdXNpbmcKLQl0aGUgdGFyZ2V0IHZlY3RvciBvZiB0aGUgbGlua2VyIG91dHB1dCBmaWxlLgotCi0JVGhlIDw8X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlPj4gZW50cnkgcG9pbnQgbXVzdCBhbGxvY2F0ZQotCWFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBkZXNpcmVkIGhhc2ggdGFibGUuICBJZiB0aGUKLQliYWNrIGVuZCBkb2VzIG5vdCByZXF1aXJlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGJlCi0Jc3RvcmVkIHdpdGggdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIHRoZSBlbnRyeSBwb2ludCBtYXkKLQlzaW1wbHkgY3JlYXRlIGEgPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LiAgTW9zdCBsaWtlbHksCi0JaG93ZXZlciwgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgbmVlZGVkLgotCi0JRm9yIGV4YW1wbGUsIHdpdGggZWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSB0aGUgYS5vdXQKLQlsaW5rZXIga2VlcHMgdGhlIGluZGV4IHRoZSBzeW1ib2wgaGFzIGluIHRoZSBmaW5hbCBvdXRwdXQgZmlsZQotCSh0aGlzIGluZGV4IG51bWJlciBpcyB1c2VkIHNvIHRoYXQgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZQotCWxpbmsgdGhlIHN5bWJvbCBpbmRleCB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZSBjYW4gYmUgcXVpY2tseQotCWZpbGxlZCBpbiB3aGVuIGNvcHlpbmcgb3ZlciBhIHJlbG9jKS4gIFRoZSBhLm91dCBsaW5rZXIgY29kZQotCWRlZmluZXMgdGhlIHJlcXVpcmVkIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyBmb3IgYSBoYXNoIHRhYmxlCi0JZGVyaXZlZCBmcm9tIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+Pi4gIFRoZSBhLm91dCBsaW5rZXIKLQloYXNoIHRhYmxlIGlzIGNyZWF0ZWQgYnkgdGhlIGZ1bmN0aW9uCi0JPDxOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk+PjsgaXQgc2ltcGx5IGFsbG9jYXRlcwotCXNwYWNlIGZvciB0aGUgaGFzaCB0YWJsZSwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZXR1cm5zIGEKLQlwb2ludGVyIHRvIGl0LgotCi0JV2hlbiB3cml0aW5nIHRoZSBsaW5rZXIgcm91dGluZXMgZm9yIGEgbmV3IGJhY2sgZW5kLCB5b3Ugd2lsbAotCWdlbmVyYWxseSBub3Qga25vdyBleGFjdGx5IHdoaWNoIGZpZWxkcyB3aWxsIGJlIHJlcXVpcmVkIHVudGlsCi0JeW91IGhhdmUgZmluaXNoZWQuICBZb3Ugc2hvdWxkIHNpbXBseSBjcmVhdGUgYSBuZXcgaGFzaCB0YWJsZQotCXdoaWNoIGRlZmluZXMgbm8gYWRkaXRpb25hbCBmaWVsZHMsIGFuZCB0aGVuIHNpbXBseSBhZGQgZmllbGRzCi0JYXMgdGhleSBiZWNvbWUgbmVjZXNzYXJ5LgotCi1JTk9ERQotQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssIENyZWF0aW5nIGEgTGlua2VyIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlBZGRpbmcgc3ltYm9scyB0byB0aGUgaGFzaCB0YWJsZQotCi1AY2luZGV4IF9iZmRfbGlua19hZGRfc3ltYm9scyBpbiB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IHRhcmdldCB2ZWN0b3IgKF9iZmRfbGlua19hZGRfc3ltYm9scykKLQlUaGUgbGlua2VyIHByb3BlciB3aWxsIGNhbGwgdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4KLQllbnRyeSBwb2ludCBmb3IgZWFjaCBvYmplY3QgZmlsZSBvciBhcmNoaXZlIHdoaWNoIGlzIHRvIGJlCi0JbGlua2VkICh0eXBpY2FsbHkgdGhlc2UgYXJlIHRoZSBmaWxlcyBuYW1lZCBvbiB0aGUgY29tbWFuZAotCWxpbmUsIGJ1dCBzb21lIG1heSBhbHNvIGNvbWUgZnJvbSB0aGUgbGlua2VyIHNjcmlwdCkuICBUaGUKLQllbnRyeSBwb2ludCBpcyByZXNwb25zaWJsZSBmb3IgZXhhbWluaW5nIHRoZSBmaWxlLiAgRm9yIGFuCi0Jb2JqZWN0IGZpbGUsIEJGRCBtdXN0IGFkZCBhbnkgcmVsZXZhbnQgc3ltYm9sIGluZm9ybWF0aW9uIHRvCi0JdGhlIGhhc2ggdGFibGUuICBGb3IgYW4gYXJjaGl2ZSwgQkZEIG11c3QgZGV0ZXJtaW5lIHdoaWNoCi0JZWxlbWVudHMgb2YgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHVzZWQgYW5kIGFkZGluZyB0aGVtIHRvIHRoZQotCWxpbmsuCi0KLQlUaGUgYS5vdXQgdmVyc2lvbiBvZiB0aGlzIGVudHJ5IHBvaW50IGlzCi0JPDxOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scyk+Pi4KLQotQG1lbnUKLUAqIERpZmZlcmluZyBmaWxlIGZvcm1hdHM6OgotQCogQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZTo6Ci1AKiBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmU6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1EaWZmZXJpbmcgZmlsZSBmb3JtYXRzLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKLVNVQlNVQlNFQ1RJT04KLQlEaWZmZXJpbmcgZmlsZSBmb3JtYXRzCi0KLQlOb3JtYWxseSBhbGwgdGhlIGZpbGVzIGludm9sdmVkIGluIGEgbGluayB3aWxsIGJlIG9mIHRoZSBzYW1lCi0JZm9ybWF0LCBidXQgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBsaW5rIHRvZ2V0aGVyIGRpZmZlcmVudAotCWZvcm1hdCBvYmplY3QgZmlsZXMsIGFuZCB0aGUgYmFjayBlbmQgbXVzdCBzdXBwb3J0IHRoYXQuICBUaGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGVudHJ5IHBvaW50IGlzIGNhbGxlZCB2aWEgdGhlIHRhcmdldAotCXZlY3RvciBvZiB0aGUgZmlsZSB0byBiZSBhZGRlZC4gIFRoaXMgaGFzIGFuIGltcG9ydGFudAotCWNvbnNlcXVlbmNlOiB0aGUgZnVuY3Rpb24gbWF5IG5vdCBhc3N1bWUgdGhhdCB0aGUgaGFzaCB0YWJsZQotCWlzIHRoZSB0eXBlIGNyZWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcKLQk8PF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZT4+IHZlY3Rvci4gIEFsbCB0aGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uIGNhbiBhc3N1bWUgYWJvdXQgdGhlIGhhc2gKLQl0YWJsZSBpcyB0aGF0IGl0IGlzIGRlcml2ZWQgZnJvbSA8PHN0cnVjdAotCWJmZF9saW5rX2hhc2hfdGFibGU+Pi4KLQotCVNvbWV0aW1lcyB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbiBtdXN0IHN0b3JlCi0Jc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGFzaCB0YWJsZSBlbnRyeSB0byBiZSB1c2VkIGJ5IHRoZQotCTw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24uICBJbiBzdWNoIGEgY2FzZSB0aGUgPDxjcmVhdG9yPj4KLQlmaWVsZCBvZiB0aGUgaGFzaCB0YWJsZSBtdXN0IGJlIGNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0JaGFzaCB0YWJsZSB3YXMgY3JlYXRlZCBieSBhbiBvYmplY3QgZmlsZSBvZiB0aGUgc2FtZSBmb3JtYXQuCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIG11c3QgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIGEKLQloYXNoIGVudHJ5IHdpdGhvdXQgYW55IGV4dHJhIGluZm9ybWF0aW9uIGFkZGVkIGJ5IHRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24uICBBIGhhc2ggZW50cnkgd2l0aG91dAotCWV4dHJhIGluZm9ybWF0aW9uIHdpbGwgYWxzbyBvY2N1ciB3aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JZGlyZWN0cyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHN5bWJvbC4gIE5vdGUgdGhhdCwgcmVnYXJkbGVzcwotCW9mIGhvdyBhIGhhc2ggdGFibGUgZW50cnkgaXMgYWRkZWQsIGFsbCB0aGUgZmllbGRzIHdpbGwgYmUKLQlpbml0aWFsaXplZCB0byBzb21lIHNvcnQgb2YgbnVsbCB2YWx1ZSBieSB0aGUgaGFzaCB0YWJsZSBlbnRyeQotCWluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLgotCi0JU2VlIDw8ZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzPj4gZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvCi0JY2hlY2sgdGhlIDw8Y3JlYXRvcj4+IGZpZWxkIGJlZm9yZSBzYXZpbmcgaW5mb3JtYXRpb24gKGluIHRoaXMKLQljYXNlLCB0aGUgRUNPRkYgZXh0ZXJuYWwgc3ltYm9sIGRlYnVnZ2luZyBpbmZvcm1hdGlvbikgaW4gYQotCWhhc2ggdGFibGUgZW50cnkuCi0KLUlOT0RFCi1BZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUsIERpZmZlcmluZyBmaWxlIGZvcm1hdHMsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlCi1TVUJTVUJTRUNUSU9OCi0JQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZQotCi0JV2hlbiB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIGlzIHBhc3NlZCBhbiBvYmplY3QKLQlmaWxlLCBpdCBtdXN0IGFkZCBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMgaW4gdGhhdAotCW9iamVjdCBmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGFjdHVhbCB3b3JrIG9mIGFkZGluZyB0aGUKLQlzeW1ib2wgdG8gdGhlIGhhc2ggdGFibGUgaXMgbm9ybWFsbHkgaGFuZGxlZCBieSB0aGUgZnVuY3Rpb24KLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4uICBUaGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcKLQlhbGwgdGhlIHN5bWJvbHMgZnJvbSB0aGUgb2JqZWN0IGZpbGUgYW5kIHBhc3NpbmcgdGhlIGNvcnJlY3QKLQlpbmZvcm1hdGlvbiB0byA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4uCi0KLQlUaGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIHNob3VsZCBub3QgdXNlCi0JPDxiZmRfY2Fub25pY2FsaXplX3N5bXRhYj4+IHRvIHJlYWQgdGhlIHN5bWJvbHMuICBUaGUgcG9pbnQgb2YKLQlwcm92aWRpbmcgdGhpcyByb3V0aW5lIGlzIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nCi0JdGhlIHN5bWJvbHMgaW50byBnZW5lcmljIDw8YXN5bWJvbD4+IHN0cnVjdHVyZXMuCi0KLUBmaW5kZXggX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4gaGFuZGxlcyB0aGUgZGV0YWlscyBvZgotCWNvbWJpbmluZyBjb21tb24gc3ltYm9scywgd2FybmluZyBhYm91dCBtdWx0aXBsZSBkZWZpbml0aW9ucywKLQlhbmQgc28gZm9ydGguICBJdCB0YWtlcyBhcmd1bWVudHMgd2hpY2ggZGVzY3JpYmUgdGhlIHN5bWJvbCB0bwotCWFkZCwgbm90YWJseSBzeW1ib2wgZmxhZ3MsIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldC4gIFRoZQotCXN5bWJvbCBmbGFncyBpbmNsdWRlIHN1Y2ggdGhpbmdzIGFzIDw8QlNGX1dFQUs+PiBvcgotCTw8QlNGX0lORElSRUNUPj4uICBUaGUgc2VjdGlvbiBpcyBhIHNlY3Rpb24gaW4gdGhlIG9iamVjdAotCWZpbGUsIG9yIHNvbWV0aGluZyBsaWtlIDw8YmZkX3VuZF9zZWN0aW9uX3B0cj4+IGZvciBhbiB1bmRlZmluZWQKLQlzeW1ib2wgb3IgPDxiZmRfY29tX3NlY3Rpb25fcHRyPj4gZm9yIGEgY29tbW9uIHN5bWJvbC4KLQotCUlmIHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgaXMgYWxzbyBnb2luZyB0byBuZWVkIHRvCi0JcmVhZCB0aGUgc3ltYm9sIGluZm9ybWF0aW9uLCB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PgotCXJvdXRpbmUgc2hvdWxkIHNhdmUgaXQgc29tZXdoZXJlIGF0dGFjaGVkIHRvIHRoZSBvYmplY3QgZmlsZQotCUJGRC4gIEhvd2V2ZXIsIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgb25seSBiZSBzYXZlZCBpZiB0aGUKLQk8PGtlZXBfbWVtb3J5Pj4gZmllbGQgb2YgdGhlIDw8aW5mbz4+IGFyZ3VtZW50IGlzIHRydWUsIHNvCi0JdGhhdCB0aGUgPDwtbm8ta2VlcC1tZW1vcnk+PiBsaW5rZXIgc3dpdGNoIGlzIGVmZmVjdGl2ZS4KLQotCVRoZSBhLm91dCBmdW5jdGlvbiB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSBpcwotCTw8YW91dF9saW5rX2FkZF9vYmplY3Rfc3ltYm9scz4+LCBhbmQgbW9zdCBvZiB0aGUgaW50ZXJlc3RpbmcKLQl3b3JrIGlzIGluIDw8YW91dF9saW5rX2FkZF9zeW1ib2xzPj4uICBUaGUgbGF0dGVyIHNhdmVzCi0JcG9pbnRlcnMgdG8gdGhlIGhhc2ggdGFibGVzIGVudHJpZXMgY3JlYXRlZCBieQotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+PiBpbmRleGVkIGJ5IHN5bWJvbCBudW1iZXIsCi0Jc28gdGhhdCB0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIGRvZXMgbm90IGhhdmUgdG8gY2FsbAotCXRoZSBoYXNoIHRhYmxlIGxvb2t1cCByb3V0aW5lIHRvIGxvY2F0ZSB0aGUgZW50cnkuCi0KLUlOT0RFCi1BZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUsICwgQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKLVNVQlNVQlNFQ1RJT04KLQlBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUKLQotCVdoZW4gdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBpcyBwYXNzZWQgYW4KLQlhcmNoaXZlLCBpdCBtdXN0IGxvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZQotCWFyY2hpdmUgYW5kIGRlY2lkZSB3aGljaCBlbGVtZW50cyBvZiB0aGUgYXJjaGl2ZSBzaG91bGQgYmUKLQlpbmNsdWRlZCBpbiB0aGUgbGluay4gIEZvciBlYWNoIHN1Y2ggZWxlbWVudCBpdCBtdXN0IGNhbGwgdGhlCi0JPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gbGlua2VyIGNhbGxiYWNrLCBhbmQgaXQgbXVzdCBhZGQgdGhlCi0Jc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZSB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0KLUBmaW5kZXggX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCUluIG1vc3QgY2FzZXMgdGhlIHdvcmsgb2YgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2xzIGluIHRoZQotCWFyY2hpdmUgc2hvdWxkIGJlIGRvbmUgYnkgdGhlCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4gZnVuY3Rpb24uICBUaGlzCi0JZnVuY3Rpb24gYnVpbGRzIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBhbmQKLQlsb29rcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzIHRvIHNlZSB3aGljaAotCWVsZW1lbnRzIHNob3VsZCBiZSBpbmNsdWRlZC4KLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiBpcyBwYXNzZWQgYSBmdW5jdGlvbgotCXRvIGNhbGwgdG8gbWFrZSB0aGUgZmluYWwgZGVjaXNpb24gYWJvdXQgYWRkaW5nIGFuIGFyY2hpdmUKLQllbGVtZW50IHRvIHRoZSBsaW5rIGFuZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsgb2YgYWRkaW5nIHRoZQotCXN5bWJvbHMgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi0JVGhlIGZ1bmN0aW9uIHBhc3NlZCB0bwotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+IG11c3QgcmVhZCB0aGUKLQlzeW1ib2xzIG9mIHRoZSBhcmNoaXZlIGVsZW1lbnQgYW5kIGRlY2lkZSB3aGV0aGVyIHRoZSBhcmNoaXZlCi0JZWxlbWVudCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBJZiB0aGUgZWxlbWVudCBpcyB0bwotCWJlIGluY2x1ZGVkLCB0aGUgPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gbGlua2VyIGNhbGxiYWNrCi0Jcm91dGluZSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBlbGVtZW50IGFzIGFuIGFyZ3VtZW50LCBhbmQKLQl0aGUgZWxlbWVudHMgc3ltYm9scyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZQotCWp1c3QgYXMgdGhvdWdoIHRoZSBlbGVtZW50IGhhZCBpdHNlbGYgYmVlbiBwYXNzZWQgdG8gdGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbi4KLQotCVdoZW4gdGhlIGEub3V0IDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24gcmVjZWl2ZXMgYW4KLQlhcmNoaXZlLCBpdCBjYWxscyA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PgotCXBhc3NpbmcgPDxhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Pj4gYXMgdGhlIGZ1bmN0aW9uCi0JYXJndW1lbnQuIDw8YW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudD4+IGNhbGxzCi0JPDxhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scz4+LiAgSWYgdGhlIGxhdHRlciBkZWNpZGVzIHRvIGFkZAotCXRoZSBlbGVtZW50IChhbiBlbGVtZW50IGlzIG9ubHkgYWRkZWQgaWYgaXQgcHJvdmlkZXMgYSByZWFsLAotCW5vbi1jb21tb24sIGRlZmluaXRpb24gZm9yIGEgcHJldmlvdXNseSB1bmRlZmluZWQgb3IgY29tbW9uCi0Jc3ltYm9sKSBpdCBjYWxscyB0aGUgPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gY2FsbGJhY2sgYW5kIHRoZW4KLQk8PGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQ+PiBjYWxscwotCTw8YW91dF9saW5rX2FkZF9zeW1ib2xzPj4gdG8gYWN0dWFsbHkgYWRkIHRoZSBzeW1ib2xzIHRvIHRoZQotCWxpbmtlciBoYXNoIHRhYmxlLgotCi0JVGhlIEVDT0ZGIGJhY2sgZW5kIGlzIHVudXN1YWwgaW4gdGhhdCBpdCBkb2VzIG5vdCBub3JtYWxseQotCWNhbGwgPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4sIGJlY2F1c2UgRUNPRkYKLQlhcmNoaXZlcyBhbHJlYWR5IGNvbnRhaW4gYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMuICBUaGUgRUNPRkYKLQliYWNrIGVuZCBzZWFyY2hlcyB0aGUgYXJjaGl2ZSBpdHNlbGYgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mCi0JY3JlYXRpbmcgYSBuZXcgaGFzaCB0YWJsZS4KLQotSU5PREUKLVBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssICwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlQZXJmb3JtaW5nIHRoZSBmaW5hbCBsaW5rCi0KLUBjaW5kZXggX2JmZF9saW5rX2ZpbmFsX2xpbmsgaW4gdGFyZ2V0IHZlY3RvcgotQGNpbmRleCB0YXJnZXQgdmVjdG9yIChfYmZkX2ZpbmFsX2xpbmspCi0JV2hlbiBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIHRoZSBsaW5rZXIgY2FsbHMKLQl0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBlbnRyeSBwb2ludCBvZiB0aGUgb3V0cHV0IEJGRC4gIFRoaXMKLQlyb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9kdWNpbmcgdGhlIGZpbmFsIG91dHB1dCBmaWxlLAotCXdoaWNoIGhhcyBzZXZlcmFsIGFzcGVjdHMuICBJdCBtdXN0IHJlbG9jYXRlIHRoZSBjb250ZW50cyBvZgotCXRoZSBpbnB1dCBzZWN0aW9ucyBhbmQgY29weSB0aGUgZGF0YSBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0JSXQgbXVzdCBidWlsZCBhbiBvdXRwdXQgc3ltYm9sIHRhYmxlIGluY2x1ZGluZyBhbnkgbG9jYWwKLQlzeW1ib2xzIGZyb20gdGhlIGlucHV0IGZpbGVzIGFuZCB0aGUgZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUKLQloYXNoIHRhYmxlLiAgV2hlbiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgaXQgbXVzdAotCW1vZGlmeSB0aGUgaW5wdXQgcmVsb2NzIGFuZCB3cml0ZSB0aGVtIGludG8gdGhlIG91dHB1dCBmaWxlLgotCVRoZXJlIG1heSBhbHNvIGJlIG9iamVjdCBmb3JtYXQgZGVwZW5kZW50IHdvcmsgdG8gYmUgZG9uZS4KLQotCVRoZSBsaW5rZXIgd2lsbCBhbHNvIGNhbGwgdGhlIDw8d3JpdGVfb2JqZWN0X2NvbnRlbnRzPj4gZW50cnkKLQlwb2ludCB3aGVuIHRoZSBCRkQgaXMgY2xvc2VkLiAgVGhlIHR3byBlbnRyeSBwb2ludHMgbXVzdCB3b3JrCi0JdG9nZXRoZXIgaW4gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQgZmlsZS4KLQotCVRoZSBkZXRhaWxzIG9mIGhvdyB0aGlzIHdvcmtzIGFyZSBpbmV2aXRhYmx5IGRlcGVuZGVudCB1cG9uCi0JdGhlIHNwZWNpZmljIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZSBhLm91dAotCTw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBpcyA8PE5BTUUoYW91dCxmaW5hbF9saW5rKT4+LgotCi1AbWVudQotQCogSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlcjo6Ci1AKiBSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzOjoKLUAqIFdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZTo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLUluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIsIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKLVNVQlNVQlNFQ1RJT04KLQlJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyCi0KLQlCZWZvcmUgdGhlIGxpbmtlciBjYWxscyB0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBlbnRyeSBwb2ludCwKLQlpdCBzZXRzIHVwIHNvbWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZnVuY3Rpb24gdG8gdXNlLgotCi0JVGhlIDw8aW5wdXRfYmZkcz4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQl3aWxsIHBvaW50IHRvIGEgbGlzdCBvZiBhbGwgdGhlIGlucHV0IGZpbGVzIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuICBUaGVzZSBmaWxlcyBhcmUgbGlua2VkIHRocm91Z2ggdGhlIDw8bGlua19uZXh0Pj4gZmllbGQKLQlvZiB0aGUgPDxiZmQ+PiBzdHJ1Y3R1cmUuCi0KLQlFYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdpbGwgaGF2ZSBhIGxpc3Qgb2YKLQk8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIHRoZSA8PGxpbmtfb3JkZXJfaGVhZD4+Ci0JZmllbGQgKHRoZSA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbgotCTw8YmZkbGluay5oPj4pLiAgVGhlc2Ugc3RydWN0dXJlcyBkZXNjcmliZSBob3cgdG8gY3JlYXRlIHRoZQotCWNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBpbiB0ZXJtcyBvZiB0aGUgY29udGVudHMgb2YKLQl2YXJpb3VzIGlucHV0IHNlY3Rpb25zLCBmaWxsIGNvbnN0YW50cywgYW5kLCBldmVudHVhbGx5LCBvdGhlcgotCXR5cGVzIG9mIGluZm9ybWF0aW9uLiAgVGhleSBhbHNvIGRlc2NyaWJlIHJlbG9jcyB0aGF0IG11c3QgYmUKLQljcmVhdGVkIGJ5IHRoZSBCRkQgYmFja2VuZCwgYnV0IGRvIG5vdCBjb3JyZXNwb25kIHRvIGFueSBpbnB1dAotCWZpbGU7IHRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IC1Vciwgd2hpY2ggYnVpbGRzIGNvbnN0cnVjdG9ycwotCXdoaWxlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUuCi0KLUlOT0RFCi1SZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBXcml0aW5nIHRoZSBzeW1ib2wgdGFibGUsIEluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKLVNVQlNVQlNFQ1RJT04KLQlSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbiBzaG91bGQgbG9vayB0aHJvdWdoIHRoZQotCTw8bGlua19vcmRlcj4+IHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaCBzZWN0aW9uIG9mIHRoZQotCW91dHB1dCBmaWxlLiAgRWFjaCA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmUgc2hvdWxkIGVpdGhlciBiZQotCWhhbmRsZWQgc3BlY2lhbGx5LCBvciBpdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbgotCTw8X2JmZF9kZWZhdWx0X2xpbmtfb3JkZXI+PiB3aGljaCB3aWxsIGRvIHRoZSByaWdodCB0aGluZwotCSg8PF9iZmRfZGVmYXVsdF9saW5rX29yZGVyPj4gaXMgZGVmaW5lZCBpbiA8PGxpbmtlci5jPj4pLgotCi0JRm9yIGVmZmljaWVuY3ksIGEgPDxsaW5rX29yZGVyPj4gb2YgdHlwZQotCTw8YmZkX2luZGlyZWN0X2xpbmtfb3JkZXI+PiB3aG9zZSBhc3NvY2lhdGVkIHNlY3Rpb24gYmVsb25ncwotCXRvIGEgQkZEIG9mIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3V0cHV0IEJGRCBtdXN0IGJlIGhhbmRsZWQKLQlzcGVjaWFsbHkuICBUaGlzIHR5cGUgb2YgPDxsaW5rX29yZGVyPj4gZGVzY3JpYmVzIHBhcnQgb2YgYW4KLQlvdXRwdXQgc2VjdGlvbiBpbiB0ZXJtcyBvZiBhIHNlY3Rpb24gYmVsb25naW5nIHRvIG9uZSBvZiB0aGUKLQlpbnB1dCBmaWxlcy4gIFRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIHNob3VsZCByZWFkIHRoZQotCWNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFuZCBhbnkgYXNzb2NpYXRlZCByZWxvY3MsIGFwcGx5IHRoZQotCXJlbG9jcyB0byB0aGUgc2VjdGlvbiBjb250ZW50cywgYW5kIHdyaXRlIG91dCB0aGUgbW9kaWZpZWQKLQlzZWN0aW9uIGNvbnRlbnRzLiAgSWYgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGUKLQlyZWxvY3MgdGhlbXNlbHZlcyBtdXN0IGFsc28gYmUgbW9kaWZpZWQgYW5kIHdyaXR0ZW4gb3V0LgotCi1AZmluZGV4IF9iZmRfcmVsb2NhdGVfY29udGVudHMKLUBmaW5kZXggX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0JVGhlIGZ1bmN0aW9ucyA8PF9iZmRfcmVsb2NhdGVfY29udGVudHM+PiBhbmQKLQk8PF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZT4+IHByb3ZpZGUgc29tZSBnZW5lcmFsIHN1cHBvcnQgZm9yCi0JcGVyZm9ybWluZyB0aGUgYWN0dWFsIHJlbG9jYXRpb25zLCBub3RhYmx5IG92ZXJmbG93IGNoZWNraW5nLgotCVRoZWlyIGFyZ3VtZW50cyBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeW1ib2wgdGhlCi0JcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGFuZCBhIDw8cmVsb2NfaG93dG9fdHlwZT4+IGFyZ3VtZW50Ci0Jd2hpY2ggZGVzY3JpYmVzIHRoZSByZWxvY2F0aW9uIHRvIHBlcmZvcm0uICBUaGVzZSBmdW5jdGlvbnMKLQlhcmUgZGVmaW5lZCBpbiA8PHJlbG9jLmM+Pi4KLQotCVRoZSBhLm91dCBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIHJlYWRpbmcsIHJlbG9jYXRpbmcsIGFuZAotCXdyaXRpbmcgc2VjdGlvbiBjb250ZW50cyBpcyA8PGFvdXRfbGlua19pbnB1dF9zZWN0aW9uPj4uICBUaGUKLQlhY3R1YWwgcmVsb2NhdGlvbiBpcyBkb25lIGluIDw8YW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkPj4KLQlhbmQgPDxhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQ+Pi4KLQotSU5PREUKLVdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZSwgLCBSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rCi1TVUJTVUJTRUNUSU9OCi0JV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbiBtdXN0IGdhdGhlciBhbGwgdGhlIHN5bWJvbHMKLQlpbiB0aGUgaW5wdXQgZmlsZXMgYW5kIHdyaXRlIHRoZW0gb3V0LiAgSXQgbXVzdCBhbHNvIHdyaXRlIG91dAotCWFsbCB0aGUgc3ltYm9scyBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBUaGlzIG11c3QgYmUKLQljb250cm9sbGVkIGJ5IHRoZSA8PHN0cmlwPj4gYW5kIDw8ZGlzY2FyZD4+IGZpZWxkcyBvZiB0aGUKLQk8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUuCi0KLQlUaGUgbG9jYWwgc3ltYm9scyBvZiB0aGUgaW5wdXQgZmlsZXMgd2lsbCBub3QgaGF2ZSBiZWVuCi0JZW50ZXJlZCBpbnRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZSA8PF9iZmRfZmluYWxfbGluaz4+Ci0Jcm91dGluZSBtdXN0IGNvbnNpZGVyIGVhY2ggaW5wdXQgZmlsZSBhbmQgaW5jbHVkZSB0aGUgc3ltYm9scwotCWluIHRoZSBvdXRwdXQgZmlsZS4gIEl0IG1heSBiZSBjb252ZW5pZW50IHRvIGRvIHRoaXMgd2hlbgotCWxvb2tpbmcgdGhyb3VnaCB0aGUgPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlcywgb3IgaXQgbWF5IGJlCi0JZG9uZSBieSBzdGVwcGluZyB0aHJvdWdoIHRoZSA8PGlucHV0X2JmZHM+PiBsaXN0LgotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBtdXN0IGFsc28gdHJhdmVyc2UgdGhlIGdsb2JhbAotCWhhc2ggdGFibGUgdG8gZ2F0aGVyIGFsbCB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICBJdAotCWlzIHBvc3NpYmxlIHRoYXQgbW9zdCBvZiB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMgbWF5IGJlCi0Jd3JpdHRlbiBvdXQgd2hlbiBjb25zaWRlcmluZyB0aGUgc3ltYm9scyBvZiBlYWNoIGlucHV0IGZpbGUsCi0JYnV0IGl0IGlzIHN0aWxsIG5lY2Vzc2FyeSB0byB0cmF2ZXJzZSB0aGUgaGFzaCB0YWJsZSBzaW5jZSB0aGUKLQlsaW5rZXIgc2NyaXB0IG1heSBoYXZlIGRlZmluZWQgc29tZSBzeW1ib2xzIHRoYXQgYXJlIG5vdCBpbgotCWFueSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0KLQlUaGUgPDxzdHJpcD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQljb250cm9scyB3aGljaCBzeW1ib2xzIGFyZSB3cml0dGVuIG91dC4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMKLQlhcmUgbGlzdGVkIGluIDw8YmZkbGluay5oPj4uICBJZiB0aGUgdmFsdWUgaXMgPDxzdHJpcF9zb21lPj4sCi0JdGhlbiB0aGUgPDxrZWVwX2hhc2g+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4KLQlzdHJ1Y3R1cmUgaXMgYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8ga2VlcDsgZWFjaCBzeW1ib2wKLQlzaG91bGQgYmUgbG9va2VkIHVwIGluIHRoaXMgaGFzaCB0YWJsZSwgYW5kIG9ubHkgc3ltYm9scyB3aGljaAotCWFyZSBwcmVzZW50IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLQlJZiB0aGUgPDxzdHJpcD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQlwZXJtaXRzIGxvY2FsIHN5bWJvbHMgdG8gYmUgd3JpdHRlbiBvdXQsIHRoZSA8PGRpc2NhcmQ+PiBmaWVsZAotCWlzIHVzZWQgdG8gZnVydGhlciBjb250cm9scyB3aGljaCBsb2NhbCBzeW1ib2xzIGFyZSBpbmNsdWRlZAotCWluIHRoZSBvdXRwdXQgZmlsZS4gIElmIHRoZSB2YWx1ZSBpcyA8PGRpc2NhcmRfbD4+LCB0aGVuIGFsbAotCWxvY2FsIHN5bWJvbHMgd2hpY2ggYmVnaW4gd2l0aCBhIGNlcnRhaW4gcHJlZml4IGFyZSBkaXNjYXJkZWQ7Ci0JdGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSA8PGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lPj4gZW50cnkgcG9pbnQuCi0KLQlUaGUgYS5vdXQgYmFja2VuZCBoYW5kbGVzIHN5bWJvbHMgYnkgY2FsbGluZwotCTw8YW91dF9saW5rX3dyaXRlX3N5bWJvbHM+PiBvbiBlYWNoIGlucHV0IEJGRCBhbmQgdGhlbgotCXRyYXZlcnNpbmcgdGhlIGdsb2JhbCBoYXNoIHRhYmxlIHdpdGggdGhlIGZ1bmN0aW9uCi0JPDxhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sPj4uICBJdCBidWlsZHMgYSBzdHJpbmcgdGFibGUKLQl3aGlsZSB3cml0aW5nIG91dCB0aGUgc3ltYm9scywgd2hpY2ggaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0Ci0JZmlsZSBhdCB0aGUgZW5kIG9mIDw8TkFNRShhb3V0LGZpbmFsX2xpbmspPj4uCi0qLwotCi1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCwgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfc2l6ZV90eXBlIGNvdW50LCBhc3ltYm9sICoqLAotCSAgIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJmZCAqaGFzaF9lbnRyeV9iZmQgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgc2V0X3N5bWJvbF9mcm9tX2hhc2gKLSAgUEFSQU1TICgoYXN5bWJvbCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QgKnBzeW1hbGxvYywgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWZhdWx0X2ZpbGxfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBib29sZWFuKSk7Ci0KLS8qIFRoZSBsaW5rIGhhc2ggdGFibGUgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gYmZkbGluay5oLiAgSXQgcHJvdmlkZXMKLSAgIGEgYmFzZSBoYXNoIHRhYmxlIHdoaWNoIHRoZSBiYWNrZW5kIHNwZWNpZmljIGhhc2ggdGFibGVzIGFyZSBidWlsdAotICAgdXBvbi4gICovCi0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfbmV3OwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGEgbGluayBoYXNoIHRhYmxlLiAgVGhlIEJGRCBhcmd1bWVudCBpcyB0aGUgb25lCi0gICByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPmNyZWF0b3IgPSBhYmZkLT54dmVjOwotICB0YWJsZS0+dW5kZWZzID0gTlVMTDsKLSAgdGFibGUtPnVuZGVmc190YWlsID0gTlVMTDsKLSAgcmV0dXJuIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIG5ld2Z1bmMpOwotfQotCi0vKiBMb29rIHVwIGEgc3ltYm9sIGluIGEgbGluayBoYXNoIHRhYmxlLiAgSWYgZm9sbG93IGlzIHRydWUsIHdlCi0gICBmb2xsb3cgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCBhbmQgYmZkX2xpbmtfaGFzaF93YXJuaW5nIGxpbmtzIHRvCi0gICB0aGUgcmVhbCBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqCi1iZmRfbGlua19oYXNoX2xvb2t1cCAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNyZWF0ZTsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGZvbGxvdzsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX2xvb2t1cCAoJnRhYmxlLT50YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpKTsKLQotICBpZiAoZm9sbG93ICYmIHJldCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICB3aGlsZSAocmV0LT50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgIHx8IHJldC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JcmV0ID0gcmV0LT51LmkubGluazsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogTG9vayB1cCBhIHN5bWJvbCBpbiB0aGUgbWFpbiBsaW5rZXIgaGFzaCB0YWJsZSBpZiB0aGUgc3ltYm9sIG1pZ2h0Ci0gICBiZSB3cmFwcGVkLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciByZWZlcmVuY2VzIHRvIGFuCi0gICB1bmRlZmluZWQgc3ltYm9sLCBub3QgZm9yIGRlZmluaXRpb25zIG9mIGEgc3ltYm9sLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKgotYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNyZWF0ZTsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGZvbGxvdzsKLXsKLSAgaWYgKGluZm8tPndyYXBfaGFzaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmw7Ci0KLSAgICAgIGwgPSBzdHJpbmc7Ci0gICAgICBpZiAoKmwgPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSkKLQkrK2w7Ci0KLSN1bmRlZiBXUkFQCi0jZGVmaW5lIFdSQVAgIl9fd3JhcF8iCi0KLSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGluZm8tPndyYXBfaGFzaCwgbCwgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKm47Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgYmVpbmcgd3JhcHBlZC4gIFdlIHdhbnQgdG8gcmVwbGFjZSBhbGwKLSAgICAgICAgICAgICByZWZlcmVuY2VzIHRvIFNZTSB3aXRoIHJlZmVyZW5jZXMgdG8gX193cmFwX1NZTS4gICovCi0KLQkgIG4gPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKGwpICsgc2l6ZW9mIFdSQVAgKyAxKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICAvKiBOb3RlIHRoYXQgc3ltYm9sX2xlYWRpbmdfY2hhciBtYXkgYmUgJ1wwJy4gICovCi0JICBuWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIG5bMV0gPSAnXDAnOwotCSAgc3RyY2F0IChuLCBXUkFQKTsKLQkgIHN0cmNhdCAobiwgbCk7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG4sIGNyZWF0ZSwgdHJ1ZSwgZm9sbG93KTsKLQkgIGZyZWUgKG4pOwotCSAgcmV0dXJuIGg7Ci0JfQotCi0jdW5kZWYgV1JBUAotCi0jdW5kZWYgUkVBTAotI2RlZmluZSBSRUFMICJfX3JlYWxfIgotCi0gICAgICBpZiAoKmwgPT0gJ18nCi0JICAmJiBzdHJuY21wIChsLCBSRUFMLCBzaXplb2YgUkVBTCAtIDEpID09IDAKLQkgICYmIGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+d3JhcF9oYXNoLCBsICsgc2l6ZW9mIFJFQUwgLSAxLAotCQkJICAgICAgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKm47Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBfX3JlYWxfU1lNLCB3aGVyZSBTWU0gaXMgYmVpbmcKLSAgICAgICAgICAgICB3cmFwcGVkLiAgV2Ugd2FudCB0byByZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIF9fcmVhbF9TWU0KLSAgICAgICAgICAgICB3aXRoIHJlZmVyZW5jZXMgdG8gU1lNLiAgKi8KLQotCSAgbiA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobCArIHNpemVvZiBSRUFMIC0gMSkgKyAyKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICAvKiBOb3RlIHRoYXQgc3ltYm9sX2xlYWRpbmdfY2hhciBtYXkgYmUgJ1wwJy4gICovCi0JICBuWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIG5bMV0gPSAnXDAnOwotCSAgc3RyY2F0IChuLCBsICsgc2l6ZW9mIFJFQUwgLSAxKTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbiwgY3JlYXRlLCB0cnVlLCBmb2xsb3cpOwotCSAgZnJlZSAobik7Ci0JICByZXR1cm4gaDsKLQl9Ci0KLSN1bmRlZiBSRUFMCi0gICAgfQotCi0gIHJldHVybiBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdyk7Ci19Ci0KLS8qIFRyYXZlcnNlIGEgZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICBUaGUgb25seSByZWFzb24gdGhpcyBpcyBub3QgYQotICAgbWFjcm8gaXMgdG8gZG8gYmV0dGVyIHR5cGUgY2hlY2tpbmcuICBUaGlzIGNvZGUgcHJlc3VtZXMgdGhhdCBhbgotICAgYXJndW1lbnQgcGFzc2VkIGFzIGEgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogbWF5IGJlIGNhdWdodCBhcyBhCi0gICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIHdpdGggbm8gZXhwbGljaXQgY2FzdCByZXF1aXJlZCBvbiB0aGUKLSAgIGNhbGwuICAqLwotCi12b2lkIAotYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAodGFibGUsIGZ1bmMsIGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYm9vbGVhbiAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotICAgICBQVFIgaW5mbzsKLXsKLSAgYmZkX2hhc2hfdHJhdmVyc2UgKCZ0YWJsZS0+dGFibGUsCi0JCSAgICAgKChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpCi0JCSAgICAgIGZ1bmMpLAotCQkgICAgIGluZm8pOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlIHVuZGVmcyBsaXN0LiAgKi8KLQotSU5MSU5FIHZvaWQKLWJmZF9saW5rX2FkZF91bmRlZiAodGFibGUsIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIEJGRF9BU1NFUlQgKGgtPm5leHQgPT0gTlVMTCk7Ci0gIGlmICh0YWJsZS0+dW5kZWZzX3RhaWwgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgdGFibGUtPnVuZGVmc190YWlsLT5uZXh0ID0gaDsKLSAgaWYgKHRhYmxlLT51bmRlZnMgPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgdGFibGUtPnVuZGVmcyA9IGg7Ci0gIHRhYmxlLT51bmRlZnNfdGFpbCA9IGg7Ci19Ci0MCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT53cml0dGVuID0gZmFsc2U7Ci0gICAgICByZXQtPnN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogR3JhYiB0aGUgc3ltYm9scyBmb3IgYW4gb2JqZWN0IGZpbGUgd2hlbiBkb2luZyBhIGdlbmVyaWMgbGluay4gIFdlCi0gICBzdG9yZSB0aGUgc3ltYm9scyBpbiB0aGUgb3V0c3ltYm9scyBmaWVsZC4gIFdlIG5lZWQgdG8ga2VlcCB0aGVtCi0gICBhcm91bmQgZm9yIHRoZSBlbnRpcmUgbGluayB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IHJlYWQgdGhlbSBvbmNlLgotICAgSWYgd2UgcmVhZCB0aGVtIG11bHRpcGxlIHRpbWVzLCB3ZSBtaWdodCB3aW5kIHVwIHdpdGggcmVsb2NzIGFuZAotICAgdGhlIGhhc2ggdGFibGUgcG9pbnRpbmcgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc3ltYm9sCi0gICBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBsb25nIHN5bXNpemU7Ci0gICAgICBsb25nIHN5bWNvdW50OwotCi0gICAgICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICAgICAgaWYgKHN5bXNpemUgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChhYmZkLCBzeW1zaXplKTsKLSAgICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID09IE5VTEwgJiYgc3ltc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkpOwotICAgICAgaWYgKHN5bWNvdW50IDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bWNvdW50OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gYWRkIHN5bWJvbHMgdG8gZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUKLSAgIGdsb2JhbCBoYXNoIHRhYmxlLiAgVGhpcyB2ZXJzaW9uIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY29sbGVjdAotICAgY29uc3RydWN0b3JzIGJ5IG5hbWUuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgZmFsc2UpOwotfQotCi0vKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbAotICAgaGFzaCB0YWJsZS4gIFRoaXMgdmVyc2lvbiBhdXRvbWF0aWNhbGx5IGNvbGxlY3RzIGNvbnN0cnVjdG9ycyBieQotICAgbmFtZSwgYXMgdGhlIGNvbGxlY3QyIHByb2dyYW0gZG9lcy4gIEl0IHNob3VsZCBiZSB1c2VkIGZvciBhbnkKLSAgIHRhcmdldCB3aGljaCBkb2VzIG5vdCBwcm92aWRlIHNvbWUgb3RoZXIgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHVwCi0gICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzOyB0aGVzZSBhcmUgYXBwcm94aW1hdGVseSB0aG9zZSB0YXJnZXRzCi0gICBmb3Igd2hpY2ggZ2NjIHVzZXMgY29sbGVjdDIgYW5kIGRvIG5vdCBzdXBwb3J0IHN0YWJzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgdHJ1ZSk7Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBib29sZWFuIHJldDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0ID0gZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0ID0gKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkgICAgIChhYmZkLCBpbmZvLAotCSAgICAgIChjb2xsZWN0Ci0JICAgICAgID8gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0Ci0JICAgICAgIDogZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0KSkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8sIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCAoYWJmZCwgaW5mbywKLQkJCQkgICAgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKSwKLQkJCQkgICAgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpLAotCQkJCSAgICAgICBjb2xsZWN0KTsKLX0KLQwKLS8qIFdlIGJ1aWxkIGEgaGFzaCB0YWJsZSBvZiBhbGwgc3ltYm9scyBkZWZpbmVkIGluIGFuIGFyY2hpdmUuICAqLwotCi0vKiBBbiBhcmNoaXZlIHN5bWJvbCBtYXkgYmUgZGVmaW5lZCBieSBtdWx0aXBsZSBhcmNoaXZlIGVsZW1lbnRzLgotICAgVGhpcyBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIGhvbGQgdGhlIGVsZW1lbnRzLiAgKi8KLQotc3RydWN0IGFyY2hpdmVfbGlzdAotewotICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpuZXh0OwotICBpbnQgaW5keDsKLX07Ci0KLS8qIEFuIGVudHJ5IGluIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFdoZXJlIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmRlZnM7Ci19OwotCi0vKiBBbiBhcmNoaXZlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLQotc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICphcmNoaXZlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gYXJjaGl2ZV9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGZvciBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWFyY2hpdmVfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmRlZnMgPSAoc3RydWN0IGFyY2hpdmVfbGlzdCAqKSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFyY2hpdmVfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnRhYmxlLCBuZXdmdW5jKTsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFyY2hpdmVfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogQWxsb2NhdGUgc3BhY2UgaW4gYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhcmNoaXZlX2hhc2hfYWxsb2NhdGUodCwgc2l6ZSkgYmZkX2hhc2hfYWxsb2NhdGUgKCYodCktPnRhYmxlLCAoc2l6ZSkpCi0KLS8qIEZyZWUgYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSh0KSBiZmRfaGFzaF90YWJsZV9mcmVlICgmKHQpLT50YWJsZSkKLQotLyogR2VuZXJpYyBmdW5jdGlvbiB0byBhZGQgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUgZmlsZSB0byB0aGUgZ2xvYmFsCi0gICBoYXNoIGZpbGUuICBUaGlzIGZ1bmN0aW9uIHByZXN1bWVzIHRoYXQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlCi0gICBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgaW4gKHRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSB0aGUKLSAgIGJmZF9jaGVja19mb3JtYXQgZW50cnkgcG9pbnQpLiAgSXQgbG9va3MgdGhyb3VnaCB0aGUgdW5kZWZpbmVkIGFuZAotICAgY29tbW9uIHN5bWJvbHMgYW5kIHNlYXJjaGVzIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBmb3IgdGhlbS4gIElmCi0gICBpdCBmaW5kcyBhbiBlbnRyeSwgaXQgaW5jbHVkZXMgdGhlIGFzc29jaWF0ZWQgb2JqZWN0IGZpbGUgaW4gdGhlCi0gICBsaW5rLgotCi0gICBUaGUgb2xkIGxpbmtlciBsb29rZWQgdGhyb3VnaCB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgZm9yCi0gICB1bmRlZmluZWQgc3ltYm9scy4gIFdlIGRvIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kLCBsb29raW5nIHRocm91Z2gKLSAgIHVuZGVmaW5lZCBzeW1ib2xzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gdGhlIGFyY2hpdmUuICBUaGUKLSAgIGFkdmFudGFnZSBvZiB0aGUgbmV3ZXIgc2NoZW1lIGlzIHRoYXQgd2Ugb25seSBoYXZlIHRvIGxvb2sgdGhyb3VnaAotICAgdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMgb25jZSwgd2hlcmVhcyB0aGUgb2xkIG1ldGhvZCBoYWQgdG8KLSAgIHJlLXNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIGVhY2ggdGltZSBhIG5ldyBvYmplY3QgZmlsZSB3YXMgYWRkZWQuCi0KLSAgIFRoZSBDSEVDS0ZOIGFyZ3VtZW50IGlzIHVzZWQgdG8gc2VlIGlmIGFuIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQuICBDSEVDS0ZOIHNob3VsZCBzZXQgKlBORUVERUQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IGZpbGUKLSAgIHNob3VsZCBiZSBpbmNsdWRlZCwgYW5kIG11c3QgYWxzbyBjYWxsIHRoZSBiZmRfbGlua19pbmZvCi0gICBhZGRfYXJjaGl2ZV9lbGVtZW50IGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBoYW5kbGUgYWRkaW5nIHRoZSBzeW1ib2xzCi0gICB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBDSEVDS0ZOIHNob3VsZCBvbmx5IHJldHVybiBmYWxzZSBpZiBzb21lCi0gICBzb3J0IG9mIGVycm9yIG9jY3Vycy4KLQotICAgRm9yIHNvbWUgZm9ybWF0cywgc3VjaCBhcyBhLm91dCwgaXQgaXMgcG9zc2libGUgdG8gbG9vayB0aHJvdWdoIGFuCi0gICBvYmplY3QgZmlsZSBidXQgbm90IGFjdHVhbGx5IGluY2x1ZGUgaXQgaW4gdGhlIGxpbmsuICBUaGUKLSAgIGFyY2hpdmVfcGFzcyBmaWVsZCBpbiBhIEJGRCBpcyB1c2VkIHRvIGF2b2lkIGNoZWNraW5nIHRoZSBzeW1ib2xzCi0gICBvZiBhbiBvYmplY3QgZmlsZXMgdG9vIG1hbnkgdGltZXMuICBXaGVuIGFuIG9iamVjdCBpcyBpbmNsdWRlZCBpbgotICAgdGhlIGxpbmssIGFyY2hpdmVfcGFzcyBpcyBzZXQgdG8gLTEuICBJZiBhbiBvYmplY3QgaXMgc2Nhbm5lZCBidXQKLSAgIG5vdCBpbmNsdWRlZCwgYXJjaGl2ZV9wYXNzIGlzIHNldCB0byB0aGUgcGFzcyBudW1iZXIuICBUaGUgcGFzcwotICAgbnVtYmVyIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIG5ldyBvYmplY3QgZmlsZSBpcyBpbmNsdWRlZC4gIFRoZQotICAgcGFzcyBudW1iZXIgaXMgdXNlZCBiZWNhdXNlIHdoZW4gYSBuZXcgb2JqZWN0IGZpbGUgaXMgaW5jbHVkZWQgaXQKLSAgIG1heSBjcmVhdGUgbmV3IHVuZGVmaW5lZCBzeW1ib2xzIHdoaWNoIGNhdXNlIGEgcHJldmlvdXNseSBleGFtaW5lZAotICAgb2JqZWN0IGZpbGUgdG8gYmUgaW5jbHVkZWQuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvLCBjaGVja2ZuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICgqY2hlY2tmbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXsKLSAgY2Fyc3ltICphcnN5bXM7Ci0gIGNhcnN5bSAqYXJzeW1fZW5kOwotICByZWdpc3RlciBjYXJzeW0gKmFyc3ltOwotICBpbnQgcGFzczsKLSAgc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSBhcnN5bV9oYXNoOwotICBpbnQgaW5keDsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipwdW5kZWY7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFyc3ltcyA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzOwotICBhcnN5bV9lbmQgPSBhcnN5bXMgKyBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50OwotCi0gIC8qIEluIG9yZGVyIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYW4gc3ltYm9sIGlzIGRlZmluZWQgaW4KLSAgICAgdGhpcyBhcmNoaXZlLCB3ZSBidWlsZCBhIGhhc2ggdGFibGUgb2YgdGhlIHN5bWJvbHMuICAqLwotICBpZiAoISBhcmNoaXZlX2hhc2hfdGFibGVfaW5pdCAoJmFyc3ltX2hhc2gsIGFyY2hpdmVfaGFzaF9uZXdmdW5jKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoYXJzeW0gPSBhcnN5bXMsIGluZHggPSAwOyBhcnN5bSA8IGFyc3ltX2VuZDsgYXJzeW0rKywgaW5keCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKmFyaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmwsICoqcHA7Ci0KLSAgICAgIGFyaCA9IGFyY2hpdmVfaGFzaF9sb29rdXAgKCZhcnN5bV9oYXNoLCBhcnN5bS0+bmFtZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgaWYgKGFyaCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbCA9ICgoc3RydWN0IGFyY2hpdmVfbGlzdCAqKQotCSAgIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZSAoJmFyc3ltX2hhc2gsIHNpemVvZiAoc3RydWN0IGFyY2hpdmVfbGlzdCkpKTsKLSAgICAgIGlmIChsID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsLT5pbmR4ID0gaW5keDsKLSAgICAgIGZvciAocHAgPSAmYXJoLT5kZWZzOwotCSAgICpwcCAhPSAoc3RydWN0IGFyY2hpdmVfbGlzdCAqKSBOVUxMOwotCSAgIHBwID0gJigqcHApLT5uZXh0KQotCTsKLSAgICAgICpwcCA9IGw7Ci0gICAgICBsLT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIGFyY2hpdmVfcGFzcyBmaWVsZCBpbiB0aGUgYXJjaGl2ZSBpdHNlbGYgaXMgdXNlZCB0bwotICAgICBpbml0aWFsaXplIFBBU1MsIHNpbmUgd2UgbWF5IHNlYXJjaCB0aGUgc2FtZSBhcmNoaXZlIG11bHRpcGxlCi0gICAgIHRpbWVzLiAgKi8KLSAgcGFzcyA9IGFiZmQtPmFyY2hpdmVfcGFzcyArIDE7Ci0KLSAgLyogTmV3IHVuZGVmaW5lZCBzeW1ib2xzIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBzbyB3ZQotICAgICBvbmx5IG5lZWQgdG8gbG9vayB0aHJvdWdoIGl0IG9uY2UuICAqLwotICBwdW5kZWYgPSAmaW5mby0+aGFzaC0+dW5kZWZzOwotICB3aGlsZSAoKnB1bmRlZiAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKmFyaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmw7Ci0KLSAgICAgIGggPSAqcHVuZGVmOwotCi0gICAgICAvKiBXaGVuIGEgc3ltYm9sIGlzIGRlZmluZWQsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20KLQkgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgLyogUmVtb3ZlIHRoaXMgZW50cnkgZnJvbSB0aGUgbGlzdCwgZm9yIGdlbmVyYWwgY2xlYW5saW5lc3MKLQkgICAgIGFuZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGxpc3QgYWdhaW4KLQkgICAgIGlmIHdlIHNlYXJjaCBhbnkgbW9yZSBsaWJyYXJpZXMuICBXZSBjYW4ndCByZW1vdmUgdGhlCi0JICAgICBlbnRyeSBpZiBpdCBpcyB0aGUgdGFpbCwgYmVjYXVzZSB0aGF0IHdvdWxkIGxvc2UgYW55Ci0JICAgICBlbnRyaWVzIHdlIGFkZCB0byB0aGUgbGlzdCBsYXRlciBvbiAoaXQgd291bGQgYWxzbyBjYXVzZQotCSAgICAgdXMgdG8gbG9zZSB0cmFjayBvZiB3aGV0aGVyIHRoZSBzeW1ib2wgaGFzIGJlZW4KLQkgICAgIHJlZmVyZW5jZWQpLiAgKi8KLQkgIGlmICgqcHVuZGVmICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQotCSAgICAqcHVuZGVmID0gKCpwdW5kZWYpLT5uZXh0OwotCSAgZWxzZQotCSAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgbWFwLiAgKi8KLSAgICAgIGFyaCA9IGFyY2hpdmVfaGFzaF9sb29rdXAgKCZhcnN5bV9oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChhcmggPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLQl7Ci0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGF0IGFsbCB0aGUgb2JqZWN0cyB3aGljaCBkZWZpbmUgdGhpcyBzeW1ib2wuICAqLwotICAgICAgZm9yIChsID0gYXJoLT5kZWZzOyBsICE9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLQkgIGJmZCAqZWxlbWVudDsKLQkgIGJvb2xlYW4gbmVlZGVkOwotCi0JICAvKiBJZiB0aGUgc3ltYm9sIGhhcyBnb3R0ZW4gZGVmaW5lZCBhbG9uZyB0aGUgd2F5LCBxdWl0LiAgKi8KLQkgIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgYnJlYWs7Ci0KLQkgIGVsZW1lbnQgPSBiZmRfZ2V0X2VsdF9hdF9pbmRleCAoYWJmZCwgbC0+aW5keCk7Ci0JICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGluY2x1ZGVkIHRoaXMgZWxlbWVudCwgb3IgaWYgd2UndmUKLQkgICAgIGFscmVhZHkgY2hlY2tlZCBpdCBvbiB0aGlzIHBhc3MsIGNvbnRpbnVlLiAgKi8KLQkgIGlmIChlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPT0gLTEKLQkgICAgICB8fCBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPT0gcGFzcykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHdlIGNhbid0IGZpZ3VyZSB0aGlzIGVsZW1lbnQgb3V0LCBqdXN0IGlnbm9yZSBpdC4gICovCi0JICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQkgICAgewotCSAgICAgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIENIRUNLRk4gd2lsbCBzZWUgaWYgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBpbmNsdWRlZCwgYW5kCi0JICAgICBnbyBhaGVhZCBhbmQgaW5jbHVkZSBpdCBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBpZiAoISAoKmNoZWNrZm4pIChlbGVtZW50LCBpbmZvLCAmbmVlZGVkKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmICghIG5lZWRlZCkKLQkgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gcGFzczsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IC0xOwotCi0JICAgICAgLyogSW5jcmVtZW50IHRoZSBwYXNzIGNvdW50IHRvIHNob3cgdGhhdCB3ZSBtYXkgbmVlZCB0bwotCQkgcmVjaGVjayBvYmplY3QgZmlsZXMgd2hpY2ggd2VyZSBhbHJlYWR5IGNoZWNrZWQuICAqLwotCSAgICAgICsrcGFzczsKLQkgICAgfQotCX0KLQotICAgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLSAgICB9Ci0KLSAgYXJjaGl2ZV9oYXNoX3RhYmxlX2ZyZWUgKCZhcnN5bV9oYXNoKTsKLQotICAvKiBTYXZlIFBBU1MgaW4gY2FzZSB3ZSBhcmUgY2FsbGVkIGFnYWluLiAgKi8KLSAgYWJmZC0+YXJjaGl2ZV9wYXNzID0gcGFzczsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgYXJjaGl2ZV9oYXNoX3RhYmxlX2ZyZWUgKCZhcnN5bV9oYXNoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogU2VlIGlmIHdlIHNob3VsZCBpbmNsdWRlIGFuIGFyY2hpdmUgZWxlbWVudC4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkCi0gICB3aGVuIHdlIGRvIG5vdCB3YW50IHRvIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYmFzZWQgb24KLSAgIHRoZSBzeW1ib2wgbmFtZSwgcHJlc3VtYWJseSBiZWNhdXNlIHdlIGhhdmUgc29tZSBvdGhlciBtZWNoYW5pc20KLSAgIGZvciBmaW5kaW5nIHRoZW0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCwgZmFsc2UpOwotfQotCi0vKiBTZWUgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgYW4gYXJjaGl2ZSBlbGVtZW50LiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQKLSAgIHdoZW4gd2Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IGNvbGxlY3QgY29uc3RydWN0b3JzIGJhc2VkIG9uIHRoZQotICAgc3ltYm9sIG5hbWUsIGFzIGNvbGxlY3QyIGRvZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCwgdHJ1ZSk7Ci19Ci0KLS8qIFNlZSBpZiB3ZSBzaG91bGQgaW5jbHVkZSBhbiBhcmNoaXZlIGVsZW1lbnQuICBPcHRpb25hbGx5IGNvbGxlY3QKLSAgIGNvbnN0cnVjdG9ycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGFzeW1ib2wgKipwcCwgKipwcGVuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwcCA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgcHBlbmQgPSBwcCArIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGZvciAoOyBwcCA8IHBwZW5kOyBwcCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnA7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBnbG9iYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChwLT5zZWN0aW9uKQotCSAgJiYgKHAtPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfSU5ESVJFQ1QgfCBCU0ZfV0VBSykpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaWYgd2Uga25vdyBzb21ldGhpbmcgYWJvdXQgdGhpcwotCSBzeW1ib2wsIGFuZCBpdCBpcyB1bmRlZmluZWQgb3IgY29tbW9uLiAgQW4gdW5kZWZpbmVkIHdlYWsKLQkgc3ltYm9sICh0eXBlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSBpcyBub3QgY29uc2lkZXJlZCB0byBiZQotCSBhIHJlZmVyZW5jZSB3aGVuIHB1bGxpbmcgZmlsZXMgb3V0IG9mIGFuIGFyY2hpdmUuICBTZWUgdGhlCi0JIFNWUjQgQUJJLCBwLiA0LTI3LiAgKi8KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgYmZkX2FzeW1ib2xfbmFtZSAocCksIGZhbHNlLAotCQkJCWZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICB8fCAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBQIGlzIGEgc3ltYm9sIHdlIGFyZSBsb29raW5nIGZvci4gICovCi0KLSAgICAgIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JewotCSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCi0JICAvKiBUaGlzIG9iamVjdCBmaWxlIGRlZmluZXMgdGhpcyBzeW1ib2wsIHNvIHB1bGwgaXQgaW4uICAqLwotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLAotCQkJCQkJCSBiZmRfYXN5bWJvbF9uYW1lIChwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN5bWNvdW50ID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0JICBpZiAoISBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0IChhYmZkLCBpbmZvLCBzeW1jb3VudCwKLQkJCQkJICAgICAgc3ltYm9scywgY29sbGVjdCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICpwbmVlZGVkID0gdHJ1ZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogUCBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCi0gICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBiZmQgKnN5bWJmZDsKLQkgIGJmZF92bWEgc2l6ZTsKLQkgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCSAgc3ltYmZkID0gaC0+dS51bmRlZi5hYmZkOwotCSAgaWYgKHN5bWJmZCA9PSAoYmZkICopIE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCBhcyB1bmRlZmluZWQgZnJvbSBvdXRzaWRlCi0JCSBCRkQuICBXZSBhc3N1bWUgdGhhdCB3ZSBzaG91bGQgbGluayBpbiB0aGUgb2JqZWN0Ci0JCSBmaWxlLiAgVGhpcyBpcyBmb3IgdGhlIC11IG9wdGlvbiBpbiB0aGUgbGlua2VyLiAgKi8KLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkKLQkJICAoaW5mbywgYWJmZCwgYmZkX2FzeW1ib2xfbmFtZSAocCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkgIC8qIFR1cm4gdGhlIHN5bWJvbCBpbnRvIGEgY29tbW9uIHN5bWJvbCBidXQgZG8gbm90IGxpbmsgaW4KLQkgICAgIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgaG93IGEub3V0IHdvcmtzLiAgT2JqZWN0Ci0JICAgICBmb3JtYXRzIHRoYXQgcmVxdWlyZSBkaWZmZXJlbnQgc2VtYW50aWNzIG11c3QgaW1wbGVtZW50Ci0JICAgICB0aGlzIGZ1bmN0aW9uIGRpZmZlcmVudGx5LiAgVGhpcyBzeW1ib2wgaXMgYWxyZWFkeSBvbiB0aGUKLQkgICAgIHVuZGVmcyBsaXN0LiAgV2UgYWRkIHRoZSBzZWN0aW9uIHRvIGEgY29tbW9uIHNlY3Rpb24KLQkgICAgIGF0dGFjaGVkIHRvIHN5bWJmZCB0byBlbnN1cmUgdGhhdCBpdCBpcyBpbiBhIEJGRCB3aGljaAotCSAgICAgd2lsbCBiZSBsaW5rZWQgaW4uICAqLwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOwotCSAgaC0+dS5jLnAgPQotCSAgICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSAqKQotCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQlzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKLQkgIGlmIChoLT51LmMucCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHNpemUgPSBiZmRfYXN5bWJvbF92YWx1ZSAocCk7Ci0JICBoLT51LmMuc2l6ZSA9IHNpemU7Ci0KLQkgIHBvd2VyID0gYmZkX2xvZzIgKHNpemUpOwotCSAgaWYgKHBvd2VyID4gNCkKLQkgICAgcG93ZXIgPSA0OwotCSAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCi0JICBpZiAocC0+c2VjdGlvbiA9PSBiZmRfY29tX3NlY3Rpb25fcHRyKQotCSAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3ltYmZkLCAiQ09NTU9OIik7Ci0JICBlbHNlCi0JICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzeW1iZmQsCi0JCQkJCQkJICBwLT5zZWN0aW9uLT5uYW1lKTsKLQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sIGlmIG5lY2Vzc2FyeS4gIFRoaXMKLQkgICAgIGlzIGhvdyBhLm91dCB3b3Jrcy4gIE9iamVjdCBmb3JtYXRzIHRoYXQgcmVxdWlyZQotCSAgICAgZGlmZmVyZW50IHNlbWFudGljcyBtdXN0IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uCi0JICAgICBkaWZmZXJlbnRseS4gICovCi0JICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHApID4gaC0+dS5jLnNpemUpCi0JICAgIGgtPnUuYy5zaXplID0gYmZkX2FzeW1ib2xfdmFsdWUgKHApOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBhcmNoaXZlIGVsZW1lbnQgaXMgbm90IG5lZWRlZC4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBBQkZECi0gICBpcyB0aGUgb2JqZWN0IGZpbGUuICBJTkZPIGlzIHRoZSBsaW5rZXIgaW5mb3JtYXRpb24uICBTWU1CT0xfQ09VTlQKLSAgIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scy4gIFNZTUJPTFMgaXMgdGhlIGxpc3Qgb2Ygc3ltYm9scy4gIENPTExFQ1QKLSAgIGlzIHRydWUgaWYgY29uc3RydWN0b3JzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNvbGxlY3RlZCBieSBuYW1lCi0gICBhcyBpcyBkb25lIGJ5IGNvbGxlY3QyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QgKGFiZmQsIGluZm8sIHN5bWJvbF9jb3VudCwgc3ltYm9scywgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1ib2xfY291bnQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGFzeW1ib2wgKipwcCwgKipwcGVuZDsKLQotICBwcCA9IHN5bWJvbHM7Ci0gIHBwZW5kID0gc3ltYm9scyArIHN5bWJvbF9jb3VudDsKLSAgZm9yICg7IHBwIDwgcHBlbmQ7IHBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqcDsKLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgaWYgKChwLT5mbGFncyAmIChCU0ZfSU5ESVJFQ1QKLQkJICAgICAgIHwgQlNGX1dBUk5JTkcKLQkJICAgICAgIHwgQlNGX0dMT0JBTAotCQkgICAgICAgfCBCU0ZfQ09OU1RSVUNUT1IKLQkJICAgICAgIHwgQlNGX1dFQUspKSAhPSAwCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjb25zdCBjaGFyICpzdHJpbmc7Ci0JICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChwKTsKLQkgIGlmICgoKHAtPmZsYWdzICYgQlNGX0lORElSRUNUKSAhPSAwCi0JICAgICAgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JICAgICAgJiYgcHAgKyAxIDwgcHBlbmQpCi0JICAgIHsKLQkgICAgICBwcCsrOwotCSAgICAgIHN0cmluZyA9IGJmZF9hc3ltYm9sX25hbWUgKCpwcCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChwLT5mbGFncyAmIEJTRl9XQVJOSU5HKSAhPSAwCi0JCSAgICYmIHBwICsgMSA8IHBwZW5kKQotCSAgICB7Ci0JICAgICAgLyogVGhlIG5hbWUgb2YgUCBpcyBhY3R1YWxseSB0aGUgd2FybmluZyBzdHJpbmcsIGFuZCB0aGUKLQkJIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dC4gICovCi0JICAgICAgc3RyaW5nID0gbmFtZTsKLQkgICAgICBwcCsrOwotCSAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqcHApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN0cmluZyA9IE5VTEw7Ci0KLQkgIGggPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgbmFtZSwgcC0+ZmxhZ3MsIGJmZF9nZXRfc2VjdGlvbiAocCksCi0JCSAgcC0+dmFsdWUsIHN0cmluZywgZmFsc2UsIGNvbGxlY3QsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBzeW1ib2wsIGFuZCB0aGUgbGlua2VyIGRpZG4ndCBkbwotICAgICAgICAgICAgIGFueXRoaW5nIHdpdGggaXQsIHRoZW4gd2Ugd2FudCB0byBqdXN0IHBhc3MgdGhlIHN5bWJvbAotICAgICAgICAgICAgIHRocm91Z2ggdG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcyB3aWxsIGhhcHBlbiB3aGVuCi0gICAgICAgICAgICAgbGlua2luZyB3aXRoIC1yLiAgKi8KLQkgIGlmICgocC0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLQkgICAgICAmJiAoaCA9PSBOVUxMIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykpCi0JICAgIHsKLQkgICAgICBwLT51ZGF0YS5wID0gTlVMTDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTYXZlIHRoZSBCRkQgc3ltYm9sIHNvIHRoYXQgd2UgZG9uJ3QgbG9zZSBhbnkgYmFja2VuZAotCSAgICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBtYXkgYmUgYXR0YWNoZWQgdG8gaXQuICBXZSBvbmx5Ci0JICAgICB3YW50IHRoaXMgb25lIGlmIGl0IGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB0aGUKLQkgICAgIGV4aXN0aW5nIG9uZTsgd2UgZG9uJ3Qgd2FudCB0byByZXBsYWNlIGEgZGVmaW5lZCBzeW1ib2wKLQkgICAgIHdpdGggYW4gdW5kZWZpbmVkIG9uZS4gIFRoaXMgcm91dGluZSBtYXkgYmUgY2FsbGVkIHdpdGggYQotCSAgICAgaGFzaCB0YWJsZSBvdGhlciB0aGFuIHRoZSBnZW5lcmljIGhhc2ggdGFibGUsIHNvIHdlIG9ubHkKLQkgICAgIGRvIHRoaXMgaWYgd2UgYXJlIGNlcnRhaW4gdGhhdCB0aGUgaGFzaCB0YWJsZSBpcyBhCi0JICAgICBnZW5lcmljIG9uZS4gICovCi0JICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnN5bSA9PSAoYXN5bWJvbCAqKSBOVUxMCi0JCSAgfHwgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCQkgICAgICAmJiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JCQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChoLT5zeW0pKSkpKQotCQl7Ci0JCSAgaC0+c3ltID0gcDsKLQkJICAvKiBCU0ZfT0xEX0NPTU1PTiBpcyBhIGhhY2sgdG8gc3VwcG9ydCBDT0ZGIHJlbG9jCi0JCSAgICAgcmVhZGluZywgYW5kIGl0IHNob3VsZCBnbyBhd2F5IHdoZW4gdGhlIENPRkYKLQkJICAgICBsaW5rZXIgaXMgc3dpdGNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uLiAgKi8KLQkJICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKSkKLQkJICAgIHAtPmZsYWdzIHw9IEJTRl9PTERfQ09NTU9OOwotCQl9Ci0JICAgIH0KLQotCSAgLyogU3RvcmUgYSBiYWNrIHBvaW50ZXIgZnJvbSB0aGUgc3ltYm9sIHRvIHRoZSBoYXNoCi0JICAgICB0YWJsZSBlbnRyeSBmb3IgdGhlIGJlbmVmaXQgb2YgcmVsYXhhdGlvbiBjb2RlIHVudGlsCi0JICAgICBpdCBnZXRzIHJld3JpdHRlbiB0byBub3QgdXNlIGFzeW1ib2wgc3RydWN0dXJlcy4KLQkgICAgIFNldHRpbmcgdGhpcyBpcyBhbHNvIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGVzZQotCSAgICAgc3ltYm9scyB3ZXJlIHNldCB1cCBieSB0aGUgZ2VuZXJpYyBsaW5rZXIuICAqLwotCSAgcC0+dWRhdGEucCA9IChQVFIpIGg7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFdlIHVzZSBhIHN0YXRlIHRhYmxlIHRvIGRlYWwgd2l0aCBhZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFRoZSBmaXJzdCBpbmRleCBpbnRvIHRoZSBzdGF0ZSB0YWJsZSBkZXNjcmliZXMgdGhlIHN5bWJvbAotICAgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICBUaGUgc2Vjb25kIGluZGV4IGludG8gdGhlIHN0YXRlIHRhYmxlIGlzIHRoZQotICAgdHlwZSBvZiB0aGUgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhlIHN5bWJvbCBmcm9tIHRoZSBvYmplY3QgZmlsZSBpcyB0dXJuZWQgaW50byBvbmUgb2YgdGhlc2Ugcm93Ci0gICB2YWx1ZXMuICAqLwotCi1lbnVtIGxpbmtfcm93Ci17Ci0gIFVOREVGX1JPVywJCS8qIFVuZGVmaW5lZC4gICovCi0gIFVOREVGV19ST1csCQkvKiBXZWFrIHVuZGVmaW5lZC4gICovCi0gIERFRl9ST1csCQkvKiBEZWZpbmVkLiAgKi8KLSAgREVGV19ST1csCQkvKiBXZWFrIGRlZmluZWQuICAqLwotICBDT01NT05fUk9XLAkJLyogQ29tbW9uLiAgKi8KLSAgSU5EUl9ST1csCQkvKiBJbmRpcmVjdC4gICovCi0gIFdBUk5fUk9XLAkJLyogV2FybmluZy4gICovCi0gIFNFVF9ST1cJCS8qIE1lbWJlciBvZiBzZXQuICAqLwotfTsKLQotLyogYXBwYXJlbnRseSBuZWVkZWQgZm9yIEhpdGFjaGkgMzA1MFIoSEktVVgvV0UyKT8gKi8KLSN1bmRlZiBGQUlMCi0KLS8qIFRoZSBhY3Rpb25zIHRvIHRha2UgaW4gdGhlIHN0YXRlIHRhYmxlLiAgKi8KLQotZW51bSBsaW5rX2FjdGlvbgotewotICBGQUlMLAkJLyogQWJvcnQuICovCi0gIFVORCwJCS8qIE1hcmsgc3ltYm9sIHVuZGVmaW5lZC4gICovCi0gIFdFQUssCQkvKiBNYXJrIHN5bWJvbCB3ZWFrIHVuZGVmaW5lZC4gICovCi0gIERFRiwJCS8qIE1hcmsgc3ltYm9sIGRlZmluZWQuICAqLwotICBERUZXLAkJLyogTWFyayBzeW1ib2wgd2VhayBkZWZpbmVkLiAgKi8KLSAgQ09NLAkJLyogTWFyayBzeW1ib2wgY29tbW9uLiAgKi8KLSAgUkVGLAkJLyogTWFyayBkZWZpbmVkIHN5bWJvbCByZWZlcmVuY2VkLiAgKi8KLSAgQ1JFRiwJCS8qIFBvc3NpYmx5IHdhcm4gYWJvdXQgY29tbW9uIHJlZmVyZW5jZSB0byBkZWZpbmVkIHN5bWJvbC4gICovCi0gIENERUYsCQkvKiBEZWZpbmUgZXhpc3RpbmcgY29tbW9uIHN5bWJvbC4gICovCi0gIE5PQUNULAkvKiBObyBhY3Rpb24uICAqLwotICBCSUcsCQkvKiBNYXJrIHN5bWJvbCBjb21tb24gdXNpbmcgbGFyZ2VzdCBzaXplLiAgKi8KLSAgTURFRiwJCS8qIE11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IuICAqLwotICBNSU5ELAkJLyogTXVsdGlwbGUgaW5kaXJlY3Qgc3ltYm9scy4gICovCi0gIElORCwJCS8qIE1ha2UgaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLSAgQ0lORCwJCS8qIE1ha2UgaW5kaXJlY3Qgc3ltYm9sIGZyb20gZXhpc3RpbmcgY29tbW9uIHN5bWJvbC4gICovCi0gIFNFVCwJCS8qIEFkZCB2YWx1ZSB0byBzZXQuICAqLwotICBNV0FSTiwJLyogTWFrZSB3YXJuaW5nIHN5bWJvbC4gICovCi0gIFdBUk4sCQkvKiBJc3N1ZSB3YXJuaW5nLiAgKi8KLSAgQ1dBUk4sCS8qIFdhcm4gaWYgcmVmZXJlbmNlZCwgZWxzZSBNV0FSTi4gICovCi0gIENZQ0xFLAkvKiBSZXBlYXQgd2l0aCBzeW1ib2wgcG9pbnRlZCB0by4gICovCi0gIFJFRkMsCQkvKiBNYXJrIGluZGlyZWN0IHN5bWJvbCByZWZlcmVuY2VkIGFuZCB0aGVuIENZQ0xFLiAgKi8KLSAgV0FSTkMJCS8qIElzc3VlIHdhcm5pbmcgYW5kIHRoZW4gQ1lDTEUuICAqLwotfTsKLQotLyogVGhlIHN0YXRlIHRhYmxlIGl0c2VsZi4gIFRoZSBmaXJzdCBpbmRleCBpcyBhIGxpbmtfcm93IGFuZCB0aGUKLSAgIHNlY29uZCBpbmRleCBpcyBhIGJmZF9saW5rX2hhc2hfdHlwZS4gICovCi0KLXN0YXRpYyBjb25zdCBlbnVtIGxpbmtfYWN0aW9uIGxpbmtfYWN0aW9uWzhdWzhdID0KLXsKLSAgLyogY3VycmVudFxwcmV2ICAgIG5ldyAgICB1bmRlZiAgdW5kZWZ3IGRlZiAgICBkZWZ3ICAgY29tICAgIGluZHIgICB3YXJuICAqLwotICAvKiBVTkRFRl9ST1cgCSovICB7VU5ELCAgIE5PQUNULCBVTkQsICAgUkVGLCAgIFJFRiwgICBOT0FDVCwgUkVGQywgIFdBUk5DIH0sCi0gIC8qIFVOREVGV19ST1cJKi8gIHtXRUFLLCAgTk9BQ1QsIE5PQUNULCBSRUYsICAgUkVGLCAgIE5PQUNULCBSRUZDLCAgV0FSTkMgfSwKLSAgLyogREVGX1JPVyAJKi8gIHtERUYsICAgREVGLCAgIERFRiwgICBNREVGLCAgREVGLCAgIENERUYsICBNREVGLCAgQ1lDTEUgfSwKLSAgLyogREVGV19ST1cgCSovICB7REVGVywgIERFRlcsICBERUZXLCAgTk9BQ1QsIE5PQUNULCBOT0FDVCwgTk9BQ1QsIENZQ0xFIH0sCi0gIC8qIENPTU1PTl9ST1cJKi8gIHtDT00sICAgQ09NLCAgIENPTSwgICBDUkVGLCAgQ1JFRiwgIEJJRywgICBSRUZDLCAgV0FSTkMgfSwKLSAgLyogSU5EUl9ST1cJKi8gIHtJTkQsICAgSU5ELCAgIElORCwgICBNREVGLCAgSU5ELCAgIENJTkQsICBNSU5ELCAgQ1lDTEUgfSwKLSAgLyogV0FSTl9ST1cgICAqLyAge01XQVJOLCBXQVJOLCAgV0FSTiwgIENXQVJOLCBDV0FSTiwgV0FSTiwgIENXQVJOLCBNV0FSTiB9LAotICAvKiBTRVRfUk9XCSovICB7U0VULCAgIFNFVCwgICBTRVQsICAgU0VULCAgIFNFVCwgICBTRVQsICAgQ1lDTEUsIENZQ0xFIH0KLX07Ci0KLS8qIE1vc3Qgb2YgdGhlIGVudHJpZXMgaW4gdGhlIExJTktfQUNUSU9OIHRhYmxlIGFyZSBzdHJhaWdodGZvcndhcmQsCi0gICBidXQgYSBmZXcgYXJlIHNvbWV3aGF0IHN1YnRsZS4KLQotICAgQSByZWZlcmVuY2UgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sIChVTkRFRl9ST1cvaW5kciBvcgotICAgVU5ERUZXX1JPVy9pbmRyKSBpcyBjb3VudGVkIGFzIGEgcmVmZXJlbmNlIGJvdGggdG8gdGhlIGluZGlyZWN0Ci0gICBzeW1ib2wgYW5kIHRvIHRoZSBzeW1ib2wgdGhlIGluZGlyZWN0IHN5bWJvbCBwb2ludHMgdG8uCi0KLSAgIEEgcmVmZXJlbmNlIHRvIGEgd2FybmluZyBzeW1ib2wgKFVOREVGX1JPVy93YXJuIG9yIFVOREVGV19ST1cvd2FybikKLSAgIGNhdXNlcyB0aGUgd2FybmluZyB0byBiZSBpc3N1ZWQuCi0KLSAgIEEgY29tbW9uIGRlZmluaXRpb24gb2YgYW4gaW5kaXJlY3Qgc3ltYm9sIChDT01NT05fUk9XL2luZHIpIGlzCi0gICB0cmVhdGVkIGFzIGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIExpa2V3aXNlIGZvciBhbiBpbmRpcmVjdAotICAgZGVmaW5pdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgKElORFJfUk9XL2NvbSkuCi0KLSAgIEFuIGluZGlyZWN0IGRlZmluaXRpb24gb2YgYSB3YXJuaW5nIChJTkRSX1JPVy93YXJuKSBkb2VzIG5vdCBjYXVzZQotICAgdGhlIHdhcm5pbmcgdG8gYmUgaXNzdWVkLgotCi0gICBJZiBhIHdhcm5pbmcgaXMgY3JlYXRlZCBmb3IgYW4gaW5kaXJlY3Qgc3ltYm9sIChXQVJOX1JPVy9pbmRyKSBubwotICAgd2FybmluZyBpcyBjcmVhdGVkIGZvciB0aGUgc3ltYm9sIHRoZSBpbmRpcmVjdCBzeW1ib2wgcG9pbnRzIHRvLgotCi0gICBBZGRpbmcgYW4gZW50cnkgdG8gYSBzZXQgZG9lcyBub3QgY291bnQgYXMgYSByZWZlcmVuY2UgdG8gYSBzZXQsCi0gICBhbmQgbm8gd2FybmluZyBpcyBpc3N1ZWQgKFNFVF9ST1cvd2FybikuICAqLwotCi0vKiBSZXR1cm4gdGhlIEJGRCBpbiB3aGljaCBhIGhhc2ggZW50cnkgaGFzIGJlZW4gZGVmaW5lZCwgaWYga25vd24uICAqLwotCi1zdGF0aWMgYmZkICoKLWhhc2hfZW50cnlfYmZkIChoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgd2hpbGUgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotICAgIGggPSBoLT51LmkubGluazsKLSAgc3dpdGNoIChoLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgcmV0dXJuIGgtPnUudW5kZWYuYWJmZDsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHJldHVybiBoLT51LmRlZi5zZWN0aW9uLT5vd25lcjsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgcmV0dXJuIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuCi0gICBBQkZEIGlzIHRoZSBCRkQgdGhlIHN5bWJvbCBjb21lcyBmcm9tLgotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLgotICAgRkxBR1MgaXMgdGhlIEJTRl8qIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wuCi0gICBTRUNUSU9OIGlzIHRoZSBzZWN0aW9uIGluIHdoaWNoIHRoZSBzeW1ib2wgaXMgZGVmaW5lZDsgdGhpcyBtYXkgYmUKLSAgICAgYmZkX3VuZF9zZWN0aW9uX3B0ciBvciBiZmRfY29tX3NlY3Rpb25fcHRyLgotICAgVkFMVUUgaXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uLgotICAgU1RSSU5HIGlzIHVzZWQgZm9yIGVpdGhlciBhbiBpbmRpcmVjdCBzeW1ib2wsIGluIHdoaWNoIGNhc2UgaXQgaXMKLSAgICAgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBpbmRpcmVjdCB0bywgb3IgYSB3YXJuaW5nIHN5bWJvbCwgaW4KLSAgICAgd2hpY2ggY2FzZSBpdCBpcyB0aGUgd2FybmluZyBzdHJpbmcuCi0gICBDT1BZIGlzIHRydWUgaWYgTkFNRSBvciBTVFJJTkcgbXVzdCBiZSBjb3BpZWQgaW50byBsb2NhbGx5Ci0gICAgIGFsbG9jYXRlZCBtZW1vcnkgaWYgdGhleSBuZWVkIHRvIGJlIHNhdmVkLgotICAgQ09MTEVDVCBpcyB0cnVlIGlmIHdlIHNob3VsZCBhdXRvbWF0aWNhbGx5IGNvbGxlY3QgZ2NjIGNvbnN0cnVjdG9yCi0gICAgIG9yIGRlc3RydWN0b3IgbmFtZXMgYXMgY29sbGVjdDIgZG9lcy4KLSAgIEhBU0hQLCBpZiBub3QgTlVMTCwgaXMgYSBwbGFjZSB0byBzdG9yZSB0aGUgY3JlYXRlZCBoYXNoIHRhYmxlCi0gICAgIGVudHJ5OyBpZiAqSEFTSFAgaXMgbm90IE5VTEwsIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgbG9va2VkIHVwCi0gICAgIHRoZSBoYXNoIHRhYmxlIGVudHJ5LCBhbmQgc3RvcmVkIGl0IGluICpIQVNIUC4gKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwKLQkJCQkgIHN0cmluZywgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgZW51bSBsaW5rX3JvdyByb3c7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGN5Y2xlOwotCi0gIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICB8fCAoZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpICE9IDApCi0gICAgcm93ID0gSU5EUl9ST1c7Ci0gIGVsc2UgaWYgKChmbGFncyAmIEJTRl9XQVJOSU5HKSAhPSAwKQotICAgIHJvdyA9IFdBUk5fUk9XOwotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgcm93ID0gU0VUX1JPVzsKLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzICYgQlNGX1dFQUspICE9IDApCi0Jcm93ID0gVU5ERUZXX1JPVzsKLSAgICAgIGVsc2UKLQlyb3cgPSBVTkRFRl9ST1c7Ci0gICAgfQotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMCkKLSAgICByb3cgPSBERUZXX1JPVzsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByb3cgPSBDT01NT05fUk9XOwotICBlbHNlCi0gICAgcm93ID0gREVGX1JPVzsKLQotICBpZiAoaGFzaHAgIT0gTlVMTCAmJiAqaGFzaHAgIT0gTlVMTCkKLSAgICBoID0gKmhhc2hwOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHJvdyA9PSBVTkRFRl9ST1cgfHwgcm93ID09IFVOREVGV19ST1cpCi0JaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLSAgICAgIGVsc2UKLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+bm90aWNlX2FsbAotICAgICAgfHwgKGluZm8tPm5vdGljZV9oYXNoICE9IChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikgTlVMTAotCSAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+bm90aWNlX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpKSkKLSAgICB7Ci0gICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+bm90aWNlKSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsIGFiZmQsIHNlY3Rpb24sCi0JCQkJCXZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChoYXNocCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIE5VTEwpCi0gICAgKmhhc2hwID0gaDsKLQotICBkbwotICAgIHsKLSAgICAgIGVudW0gbGlua19hY3Rpb24gYWN0aW9uOwotCi0gICAgICBjeWNsZSA9IGZhbHNlOwotICAgICAgYWN0aW9uID0gbGlua19hY3Rpb25bKGludCkgcm93XVsoaW50KSBoLT50eXBlXTsKLSAgICAgIHN3aXRjaCAoYWN0aW9uKQotCXsKLQljYXNlIEZBSUw6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgTk9BQ1Q6Ci0JICAvKiBEbyBub3RoaW5nLiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBVTkQ6Ci0JICAvKiBNYWtlIGEgbmV3IHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLQkgIGJmZF9saW5rX2FkZF91bmRlZiAoaW5mby0+aGFzaCwgaCk7Ci0JICBicmVhazsKLQotCWNhc2UgV0VBSzoKLQkgIC8qIE1ha2UgYSBuZXcgd2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazsKLQkgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JICBicmVhazsKLQotCWNhc2UgQ0RFRjoKLQkgIC8qIFdlIGhhdmUgZm91bmQgYSBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaCB3YXMKLQkgICAgIHByZXZpb3VzbHkgY29tbW9uLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgaC0+dS5jLnNpemUsCi0JCSAgYWJmZCwgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgREVGOgotCWNhc2UgREVGVzoKLQkgIHsKLQkgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb2xkdHlwZTsKLQotCSAgICAvKiBEZWZpbmUgYSBzeW1ib2wuICAqLwotCSAgICBvbGR0eXBlID0gaC0+dHlwZTsKLQkgICAgaWYgKGFjdGlvbiA9PSBERUZXKQotCSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZndlYWs7Ci0JICAgIGVsc2UKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKLQkgICAgaC0+dS5kZWYudmFsdWUgPSB2YWx1ZTsKLQotCSAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8sIHdlIGFjdCBsaWtlIGNvbGxlY3QyIGFuZAotCSAgICAgICBpZGVudGlmeSBhbGwgZnVuY3Rpb25zIHRoYXQgbWlnaHQgYmUgZ2xvYmFsCi0JICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kIHBhc3MgdGhlbSB1cCBpbiBhCi0JICAgICAgIGNhbGxiYWNrLiAgV2Ugb25seSBkbyB0aGlzIGZvciBjZXJ0YWluIG9iamVjdCBmaWxlCi0JICAgICAgIHR5cGVzLCBzaW5jZSBtYW55IG9iamVjdCBmaWxlIHR5cGVzIGNhbiBoYW5kbGUgdGhpcwotCSAgICAgICBhdXRvbWF0aWNhbGx5LiAgKi8KLQkgICAgaWYgKGNvbGxlY3QgJiYgbmFtZVswXSA9PSAnXycpCi0JICAgICAgewotCQljb25zdCBjaGFyICpzOwotCi0JCS8qIEEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lIHN0YXJ0cyBsaWtlIHRoaXM6Ci0JCSAgIF8rR0xPQkFMX1tfLiRdW0lEXVtfLiRdIHdoZXJlIHRoZSBmaXJzdCBbXy4kXSBhbmQKLQkJICAgdGhlIHNlY29uZCBhcmUgdGhlIHNhbWUgY2hhcmFjdGVyICh3ZSBhY2NlcHQgYW55Ci0JCSAgIGNoYXJhY3RlciB0aGVyZSwgaW4gY2FzZSBhIG5ldyBvYmplY3QgZmlsZSBmb3JtYXQKLQkJICAgY29tZXMgYWxvbmcgd2l0aCBldmVuIHdvcnNlIG5hbWluZyByZXN0cmljdGlvbnMpLiAgKi8KLQotI2RlZmluZSBDT05TX1BSRUZJWCAiR0xPQkFMXyIKLSNkZWZpbmUgQ09OU19QUkVGSVhfTEVOIChzaXplb2YgQ09OU19QUkVGSVggLSAxKQotCi0JCXMgPSBuYW1lICsgMTsKLQkJd2hpbGUgKCpzID09ICdfJykKLQkJICArK3M7Ci0JCWlmIChzWzBdID09ICdHJwotCQkgICAgJiYgc3RybmNtcCAocywgQ09OU19QUkVGSVgsIENPTlNfUFJFRklYX0xFTiAtIDEpID09IDApCi0JCSAgewotCQkgICAgY2hhciBjOwotCi0JCSAgICBjID0gc1tDT05TX1BSRUZJWF9MRU4gKyAxXTsKLQkJICAgIGlmICgoYyA9PSAnSScgfHwgYyA9PSAnRCcpCi0JCQkmJiBzW0NPTlNfUFJFRklYX0xFTl0gPT0gc1tDT05TX1BSRUZJWF9MRU4gKyAyXSkKLQkJICAgICAgewotCQkJLyogSWYgdGhpcyBpcyBhIGRlZmluaXRpb24gb2YgYSBzeW1ib2wgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBwcmV2aW91c2x5IHdlYWtseSBkZWZpbmVkLCB3ZSBhcmUgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyb3VibGUuICBXZSBoYXZlIGFscmVhZHkgYWRkZWQgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgZW50cnkgZm9yIHRoZSB3ZWFrIGRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwgYW5kIG5vdyB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbmV3IHN5bWJvbC4gIEZvcnR1bmF0ZWx5LCB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBuZXZlciBhcmlzZSBpbiBwcmFjdGljZS4gICovCi0JCQlpZiAob2xkdHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCQkgIGFib3J0ICgpOwotCi0JCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPmNvbnN0cnVjdG9yKQotCQkJICAgICAgIChpbmZvLAotCQkJCWMgPT0gJ0knID8gdHJ1ZSA6IGZhbHNlLAotCQkJCWgtPnJvb3Quc3RyaW5nLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkpKQotCQkJICByZXR1cm4gZmFsc2U7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCi0JICBicmVhazsKLQotCWNhc2UgQ09NOgotCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbC4gICovCi0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgYmZkX2xpbmtfYWRkX3VuZGVmIChpbmZvLT5oYXNoLCBoKTsKLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2NvbW1vbjsKLQkgIGgtPnUuYy5wID0KLQkgICAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKLQkgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkpKSk7Ci0JICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBoLT51LmMuc2l6ZSA9IHZhbHVlOwotCi0JICAvKiBTZWxlY3QgYSBkZWZhdWx0IGFsaWdubWVudCBiYXNlZCBvbiB0aGUgc2l6ZS4gIFRoaXMgbWF5Ci0gICAgICAgICAgICAgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2FsbGVyLiAgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHBvd2VyOwotCi0JICAgIHBvd2VyID0gYmZkX2xvZzIgKHZhbHVlKTsKLQkgICAgaWYgKHBvd2VyID4gNCkKLQkgICAgICBwb3dlciA9IDQ7Ci0JICAgIGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLQkgIH0KLQotCSAgLyogVGhlIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sIGlzIG9ubHkgdXNlZCBpZiB0aGUgY29tbW9uCi0gICAgICAgICAgICAgc3ltYm9sIGlzIGFjdHVhbGx5IGFsbG9jYXRlZC4gIEl0IGJhc2ljYWxseSBwcm92aWRlcyBhCi0gICAgICAgICAgICAgaG9vayBmb3IgdGhlIGxpbmtlciBzY3JpcHQgdG8gZGVjaWRlIHdoaWNoIG91dHB1dCBzZWN0aW9uCi0gICAgICAgICAgICAgdGhlIGNvbW1vbiBzeW1ib2xzIHNob3VsZCBiZSBwdXQgaW4uICBJbiBtb3N0IGNhc2VzLCB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCB3aWxsIGJlIGJmZF9jb21fc2VjdGlvbl9wdHIsCi0gICAgICAgICAgICAgdGhlIGNvZGUgaGVyZSB3aWxsIGNob29zZSBhIGNvbW1vbiBzeW1ib2wgc2VjdGlvbiBuYW1lZAotICAgICAgICAgICAgICJDT01NT04iLCBhbmQgdGhlIGxpbmtlciBzY3JpcHQgd2lsbCBjb250YWluICooQ09NTU9OKSBpbgotICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gIEEgZmV3IHRhcmdldHMgdXNlIHNlcGFyYXRlIGNvbW1vbgotICAgICAgICAgICAgIHNlY3Rpb25zIGZvciBzbWFsbCBzeW1ib2xzLCBhbmQgdGhleSByZXF1aXJlIHNwZWNpYWwKLSAgICAgICAgICAgICBoYW5kbGluZy4gICovCi0JICBpZiAoc2VjdGlvbiA9PSBiZmRfY29tX3NlY3Rpb25fcHRyKQotCSAgICB7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICJDT01NT04iKTsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNlY3Rpb24tPm93bmVyICE9IGFiZmQpCi0JICAgIHsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwKLQkJCQkJCQkgICAgc2VjdGlvbi0+bmFtZSk7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gc2VjdGlvbjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSRUY6Ci0JICAvKiBBIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5uZXh0ID09IE5VTEwgJiYgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgIT0gaCkKLQkgICAgaC0+bmV4dCA9IGg7Ci0JICBicmVhazsKLQotCWNhc2UgQklHOgotCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaAotCSAgICAgYWxyZWFkeSBoYWQgYSBjb21tb24gZGVmaW5pdGlvbi4gIFVzZSB0aGUgbWF4aW11bSBvZiB0aGUKLQkgICAgIHR3byBzaXplcy4gICovCi0JICBCRkRfQVNTRVJUIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLAotCQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lciwgYmZkX2xpbmtfaGFzaF9jb21tb24sIGgtPnUuYy5zaXplLAotCQkgIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCB2YWx1ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAodmFsdWUgPiBoLT51LmMuc2l6ZSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCSAgICAgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0KLQkgICAgICAvKiBTZWxlY3QgYSBkZWZhdWx0IGFsaWdubWVudCBiYXNlZCBvbiB0aGUgc2l6ZS4gIFRoaXMgbWF5Ci0JCSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsZXIuICAqLwotCSAgICAgIHBvd2VyID0gYmZkX2xvZzIgKHZhbHVlKTsKLQkgICAgICBpZiAocG93ZXIgPiA0KQotCQlwb3dlciA9IDQ7Ci0JICAgICAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ1JFRjoKLQkgIHsKLQkgICAgYmZkICpvYmZkOwotCi0JICAgIC8qIFdlIGhhdmUgZm91bmQgYSBjb21tb24gZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wgd2hpY2gKLQkgICAgICAgd2FzIGFscmVhZHkgZGVmaW5lZC4gIEZJWE1FOiBJdCB3b3VsZCBuaWNlIGlmIHdlIGNvdWxkCi0JICAgICAgIHJlcG9ydCB0aGUgQkZEIHdoaWNoIGRlZmluZWQgYW4gaW5kaXJlY3Qgc3ltYm9sLCBidXQgd2UKLQkgICAgICAgZG9uJ3QgaGF2ZSBhbnl3aGVyZSB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24uICAqLwotCSAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgb2JmZCA9IGgtPnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgICBlbHNlCi0JICAgICAgb2JmZCA9IE5VTEw7Ci0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgICAoaW5mbywgaC0+cm9vdC5zdHJpbmcsIG9iZmQsIGgtPnR5cGUsIChiZmRfdm1hKSAwLAotCQkgICAgYWJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHZhbHVlKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIE1JTkQ6Ci0JICAvKiBNdWx0aXBsZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhpcyBpcyBPSyBpZiB0aGV5IGJvdGggcG9pbnQKLQkgICAgIHRvIHRoZSBzYW1lIHN5bWJvbC4gICovCi0JICBpZiAoc3RyY21wIChoLT51LmkubGluay0+cm9vdC5zdHJpbmcsIHN0cmluZykgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgTURFRjoKLQkgIC8qIEhhbmRsZSBhIG11bHRpcGxlIGRlZmluaXRpb24uICAqLwotCSAgewotCSAgICBhc2VjdGlvbiAqbXNlYzsKLQkgICAgYmZkX3ZtYSBtdmFsOwotCi0JICAgIHN3aXRjaCAoaC0+dHlwZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JCW1zZWMgPSBoLT51LmRlZi5zZWN0aW9uOwotCQltdmFsID0gaC0+dS5kZWYudmFsdWU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLQkJbXNlYyA9IGJmZF9pbmRfc2VjdGlvbl9wdHI7Ci0JCW12YWwgPSAwOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlhYm9ydCAoKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSWdub3JlIGEgcmVkZWZpbml0aW9uIG9mIGFuIGFic29sdXRlIHN5bWJvbCB0byB0aGUgc2FtZQotICAgICAgICAgICAgICAgdmFsdWU7IGl0J3MgaGFybWxlc3MuICAqLwotCSAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJJiYgYmZkX2lzX2Fic19zZWN0aW9uIChtc2VjKQotCQkmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0JCSYmIHZhbHVlID09IG12YWwpCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQotCQkgICAoaW5mbywgaC0+cm9vdC5zdHJpbmcsIG1zZWMtPm93bmVyLCBtc2VjLCBtdmFsLCBhYmZkLAotCQkgICAgc2VjdGlvbiwgdmFsdWUpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ0lORDoKLQkgIC8qIENyZWF0ZSBhbiBpbmRpcmVjdCBzeW1ib2wgZnJvbSBhbiBleGlzdGluZyBjb21tb24gc3ltYm9sLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgaC0+dS5jLnNpemUsCi0JCSAgYWJmZCwgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIElORDoKLQkgIC8qIENyZWF0ZSBhbiBpbmRpcmVjdCBzeW1ib2wuICAqLwotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaW5oOwotCi0JICAgIC8qIFNUUklORyBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHdlIHdhbnQgdG8gaW5kaXJlY3QKLQkgICAgICAgdG8uICAqLwotCSAgICBpbmggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBzdHJpbmcsIHRydWUsCi0JCQkJCQljb3B5LCBmYWxzZSk7Ci0JICAgIGlmIChpbmggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoaW5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICAgIHsKLQkJaW5oLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JCWluaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLQkJYmZkX2xpbmtfYWRkX3VuZGVmIChpbmZvLT5oYXNoLCBpbmgpOwotCSAgICAgIH0KLQotCSAgICAvKiBJZiB0aGUgaW5kaXJlY3Qgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQsIHdlIG5lZWQgdG8KLQkgICAgICAgcHVzaCB0aGUgcmVmZXJlbmNlIGRvd24gdG8gdGhlIHN5bWJvbCB3ZSBhcmUKLQkgICAgICAgcmVmZXJlbmNpbmcuICAqLwotCSAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgICB7Ci0JCXJvdyA9IFVOREVGX1JPVzsKLQkJY3ljbGUgPSB0cnVlOwotCSAgICAgIH0KLQotCSAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDsKLQkgICAgaC0+dS5pLmxpbmsgPSBpbmg7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0VUOgotCSAgLyogQWRkIGFuIGVudHJ5IHRvIGEgc2V0LiAgKi8KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfdG9fc2V0KSAoaW5mbywgaCwgQkZEX1JFTE9DX0NUT1IsCi0JCQkJCQlhYmZkLCBzZWN0aW9uLCB2YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBXQVJOQzoKLQkgIC8qIElzc3VlIGEgd2FybmluZyBhbmQgY3ljbGUuICAqLwotCSAgaWYgKGgtPnUuaS53YXJuaW5nICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykgKGluZm8sIGgtPnUuaS53YXJuaW5nLAotCQkJCQkJIGgtPnJvb3Quc3RyaW5nLCBhYmZkLAotCQkJCQkJIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkJIChiZmRfdm1hKSAwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIC8qIE9ubHkgaXNzdWUgYSB3YXJuaW5nIG9uY2UuICAqLwotCSAgICAgIGgtPnUuaS53YXJuaW5nID0gTlVMTDsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIENZQ0xFOgotCSAgLyogVHJ5IGFnYWluIHdpdGggdGhlIHJlZmVyZW5jZWQgc3ltYm9sLiAgKi8KLQkgIGggPSBoLT51LmkubGluazsKLQkgIGN5Y2xlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSRUZDOgotCSAgLyogQSByZWZlcmVuY2UgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5uZXh0ID09IE5VTEwgJiYgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgIT0gaCkKLQkgICAgaC0+bmV4dCA9IGg7Ci0JICBoID0gaC0+dS5pLmxpbms7Ci0JICBjeWNsZSA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgV0FSTjoKLQkgIC8qIElzc3VlIGEgd2FybmluZy4gICovCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykgKGluZm8sIHN0cmluZywgaC0+cm9vdC5zdHJpbmcsCi0JCQkJCSAgICAgaGFzaF9lbnRyeV9iZmQgKGgpLAotCQkJCQkgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBDV0FSTjoKLQkgIC8qIFdhcm4gaWYgdGhpcyBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZCBhbHJlYWR5LAotCSAgICAgb3RoZXJ3aXNlIGFkZCBhIHdhcm5pbmcuICBBIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkIGlmCi0JICAgICB0aGUgbmV4dCBmaWVsZCBpcyBub3QgTlVMTCwgb3IgaXQgaXMgdGhlIHRhaWwgb2YgdGhlCi0JICAgICB1bmRlZmluZWQgc3ltYm9sIGxpc3QuICBUaGUgUkVGIGNhc2UgYWJvdmUgaGVscHMgdG8KLQkgICAgIGVuc3VyZSB0aGlzLiAgKi8KLQkgIGlmIChoLT5uZXh0ICE9IE5VTEwgfHwgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgPT0gaCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywgc3RyaW5nLCBoLT5yb290LnN0cmluZywKLQkJCQkJCSBoYXNoX2VudHJ5X2JmZCAoaCksCi0JCQkJCQkgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCQkgKGJmZF92bWEpIDApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBNV0FSTjoKLQkgIC8qIE1ha2UgYSB3YXJuaW5nIHN5bWJvbC4gICovCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpzdWI7Ci0KLQkgICAgLyogU1RSSU5HIGlzIHRoZSB3YXJuaW5nIHRvIGdpdmUuICAqLwotCSAgICBzdWIgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JCSAgICgoKmluZm8tPmhhc2gtPnRhYmxlLm5ld2Z1bmMpCi0JCSAgICAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMLCAmaW5mby0+aGFzaC0+dGFibGUsCi0JCSAgICAgaC0+cm9vdC5zdHJpbmcpKSk7Ci0JICAgIGlmIChzdWIgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICpzdWIgPSAqaDsKLQkgICAgc3ViLT50eXBlID0gYmZkX2xpbmtfaGFzaF93YXJuaW5nOwotCSAgICBzdWItPnUuaS5saW5rID0gaDsKLQkgICAgaWYgKCEgY29weSkKLQkgICAgICBzdWItPnUuaS53YXJuaW5nID0gc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQljaGFyICp3OwotCi0JCXcgPSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCSAgICAgICBzdHJsZW4gKHN0cmluZykgKyAxKTsKLQkJaWYgKHcgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXN0cmNweSAodywgc3RyaW5nKTsKLQkJc3ViLT51Lmkud2FybmluZyA9IHc7Ci0JICAgICAgfQotCi0JICAgIGJmZF9oYXNoX3JlcGxhY2UgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCSAgICAgIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgaCwKLQkJCSAgICAgIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgc3ViKTsKLQkgICAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICAgKmhhc2hwID0gc3ViOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGN5Y2xlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEdlbmVyaWMgZmluYWwgbGluayByb3V0aW5lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqc3ViOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzaXplX3Qgb3V0c3ltYWxsb2M7Ci0gIHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyB3Z2luZm87Ci0KLSAgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9IChhc3ltYm9sICoqKSBOVUxMOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0gIG91dHN5bWFsbG9jID0gMDsKLQotICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICAgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCXAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+bGlua2VyX21hcmsgPSB0cnVlOwotCi0gIC8qIEJ1aWxkIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gKGJmZCAqKSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICBpZiAoISBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyAoYWJmZCwgc3ViLCBpbmZvLCAmb3V0c3ltYWxsb2MpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFjY3VtdWxhdGUgdGhlIGdsb2JhbCBzeW1ib2xzLiAgKi8KLSAgd2dpbmZvLmluZm8gPSBpbmZvOwotICB3Z2luZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIHdnaW5mby5wc3ltYWxsb2MgPSAmb3V0c3ltYWxsb2M7Ci0gIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UgKF9iZmRfZ2VuZXJpY19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICBfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sLAotCQkJCSAgIChQVFIpICZ3Z2luZm8pOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdHJhaWxpbmcgTlVMTCBwb2ludGVyIG9uIE9VVFNZTUJPTFMuICBXZQotICAgICBzaG91bGRuJ3QgcmVhbGx5IG5lZWQgb25lLCBzaW5jZSB3ZSBoYXZlIFNZTUNPVU5ULCBidXQgc29tZSBvbGQKLSAgICAgY29kZSBzdGlsbCBleHBlY3RzIG9uZS4gICovCi0gIGlmICghIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKGFiZmQsICZvdXRzeW1hbGxvYywgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBvdXRwdXQgcmVsb2NzIGZvciBlYWNoIHNlY3Rpb24uICAqLwotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgICBvID0gby0+bmV4dCkKLQl7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkJKytvLT5yZWxvY19jb3VudDsKLQkgICAgICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JCSAgYmZkICppbnB1dF9iZmQ7Ci0JCSAgbG9uZyByZWxzaXplOwotCQkgIGFyZWxlbnQgKipyZWxvY3M7Ci0JCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0JCSAgbG9uZyByZWxvY19jb3VudDsKLQotCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0JCSAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0JCSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQkJICBpZiAocmVsc2l6ZSA8IDApCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbHNpemUpOwotCQkgIGlmICghcmVsb2NzICYmIHJlbHNpemUgIT0gMCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBzeW1ib2xzID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCk7Ci0JCSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJCQlyZWxvY3MsCi0JCQkJCQkJc3ltYm9scyk7Ci0JCSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBCRkRfQVNTRVJUICgodW5zaWduZWQgbG9uZykgcmVsb2NfY291bnQKLQkJCSAgICAgID09IGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkJICBvLT5yZWxvY19jb3VudCArPSByZWxvY19jb3VudDsKLQkJICBmcmVlIChyZWxvY3MpOwotCQl9Ci0JICAgIH0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IDApCi0JICAgIHsKLQkgICAgICBvLT5vcmVsb2NhdGlvbiA9ICgoYXJlbGVudCAqKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChvLT5yZWxvY19jb3VudAotCQkJCQkgICAgKiBzaXplb2YgKGFyZWxlbnQgKikpKSk7Ci0JICAgICAgaWYgKCFvLT5vcmVsb2NhdGlvbikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIG8tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgICAvKiBSZXNldCB0aGUgY291bnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhbiBpbmRleAotCQkgd2hlbiBwdXR0aW5nIGluIHRoZSBvdXRwdXQgcmVsb2NzLiAgKi8KLQkgICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBhbGwgdGhlIGxpbmsgb3JkZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBzZWN0aW9ucy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIG8gIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0KQotCXsKLQkgIHN3aXRjaCAocC0+dHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI6Ci0JICAgIGNhc2UgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyOgotCSAgICAgIGlmICghIF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyOgotCSAgICAgIGlmICghIGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCwgdHJ1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGFuIG91dHB1dCBzeW1ib2wgdG8gdGhlIG91dHB1dCBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAob3V0cHV0X2JmZCwgcHN5bWFsbG9jLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc2l6ZV90ICpwc3ltYWxsb2M7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpID49ICpwc3ltYWxsb2MpCi0gICAgewotICAgICAgYXN5bWJvbCAqKm5ld3N5bXM7Ci0KLSAgICAgIGlmICgqcHN5bWFsbG9jID09IDApCi0JKnBzeW1hbGxvYyA9IDEyNDsKLSAgICAgIGVsc2UKLQkqcHN5bWFsbG9jICo9IDI7Ci0gICAgICBuZXdzeW1zID0gKGFzeW1ib2wgKiopIGJmZF9yZWFsbG9jIChiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpLAotCQkJCQkgICpwc3ltYWxsb2MgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgaWYgKG5ld3N5bXMgPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKSA9IG5ld3N5bXM7Ci0gICAgfQotCi0gIGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCkgW2JmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpXSA9IHN5bTsKLSAgaWYgKHN5bSAhPSBOVUxMKQotICAgICsrIGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgdGhlIHN5bWJvbHMgZm9yIGFuIGlucHV0IEJGRC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sIHBzeW1hbGxvYykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHNpemVfdCAqcHN5bWFsbG9jOwotewotICBhc3ltYm9sICoqc3ltX3B0cjsKLSAgYXN5bWJvbCAqKnN5bV9lbmQ7Ci0KLSAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIGEgZmlsZW5hbWUgc3ltYm9sIGlmIHdlIGFyZSBzdXBwb3NlZCB0by4gICovCi0gIGlmIChpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBmb3IgKHNlYyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIHNlYyA9IHNlYy0+bmV4dCkKLQl7Ci0JICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKm5ld3N5bTsKLQotCSAgICAgIG5ld3N5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoaW5wdXRfYmZkKTsKLQkgICAgICBpZiAoIW5ld3N5bSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIG5ld3N5bS0+bmFtZSA9IGlucHV0X2JmZC0+ZmlsZW5hbWU7Ci0JICAgICAgbmV3c3ltLT52YWx1ZSA9IDA7Ci0JICAgICAgbmV3c3ltLT5mbGFncyA9IEJTRl9MT0NBTCB8IEJTRl9GSUxFOwotCSAgICAgIG5ld3N5bS0+c2VjdGlvbiA9IHNlYzsKLQotCSAgICAgIGlmICghIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKG91dHB1dF9iZmQsIHBzeW1hbGxvYywKLQkJCQkJICAgICAgIG5ld3N5bSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIHZhbHVlcyBvZiB0aGUgZ2xvYmFsbHkgdmlzaWJsZSBzeW1ib2xzLCBhbmQgd3JpdGUgb3V0Ci0gICAgIGxvY2FsIHN5bWJvbHMuICAqLwotICBzeW1fcHRyID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCk7Ci0gIHN5bV9lbmQgPSBzeW1fcHRyICsgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChpbnB1dF9iZmQpOwotICBmb3IgKDsgc3ltX3B0ciA8IHN5bV9lbmQ7IHN5bV9wdHIrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBib29sZWFuIG91dHB1dDsKLQotICAgICAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTDsKLSAgICAgIHN5bSA9ICpzeW1fcHRyOwotICAgICAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9JTkRJUkVDVAotCQkJIHwgQlNGX1dBUk5JTkcKLQkJCSB8IEJTRl9HTE9CQUwKLQkJCSB8IEJTRl9DT05TVFJVQ1RPUgotCQkJIHwgQlNGX1dFQUspKSAhPSAwCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXsKLQkgIGlmIChzeW0tPnVkYXRhLnAgIT0gTlVMTCkKLQkgICAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgc3ltLT51ZGF0YS5wOwotCSAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGNhc2Ugbm9ybWFsbHkgbWVhbnMgdGhhdCB0aGUgbWFpbiBsaW5rZXIgY29kZQotICAgICAgICAgICAgICAgICBkZWxpYmVyYXRlbHkgaWdub3JlZCB0aGlzIGNvbnN0cnVjdG9yIHN5bWJvbC4gIFdlCi0gICAgICAgICAgICAgICAgIHNob3VsZCBqdXN0IHBhc3MgaXQgdGhyb3VnaC4gIFRoaXMgd2lsbCBzY3JldyB1cCBpZgotICAgICAgICAgICAgICAgICB0aGUgY29uc3RydWN0b3Igc3ltYm9sIGlzIGZyb20gYSBkaWZmZXJlbnQsCi0gICAgICAgICAgICAgICAgIG5vbi1nZW5lcmljLCBvYmplY3QgZmlsZSBmb3JtYXQsIGJ1dCB0aGUgY2FzZSB3aWxsCi0gICAgICAgICAgICAgICAgIG9ubHkgYXJpc2Ugd2hlbiBsaW5raW5nIHdpdGggLXIsIHdoaWNoIHdpbGwgcHJvYmFibHkKLSAgICAgICAgICAgICAgICAgZmFpbCBhbnlob3csIHNpbmNlIHRoZXJlIHdpbGwgYmUgbm8gd2F5IHRvIHJlcHJlc2VudAotICAgICAgICAgICAgICAgICB0aGUgcmVsb2NzIGluIHRoZSBvdXRwdXQgZm9ybWF0IGJlaW5nIHVzZWQuICAqLwotCSAgICAgIGggPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIGggPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJICAgICAgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCSAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkgIGVsc2UKLQkgICAgaCA9IF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbG9va3VwIChfYmZkX2dlbmVyaWNfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCSAgICAgICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkgICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCSAgaWYgKGggIT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogRm9yY2UgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wgdG8gcG9pbnQgdG8KLQkJIHRoZSBzYW1lIGFyZWEgaW4gbWVtb3J5LiAgSXQgaXMgcG9zc2libGUgdGhhdAotCQkgdGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBoYXNoIHRhYmxlCi0JCSBvdGhlciB0aGFuIGEgZ2VuZXJpYyBoYXNoIHRhYmxlLCBzbyB3ZSBkb3VibGUKLQkJIGNoZWNrIHRoYXQuICAqLwotCSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGlucHV0X2JmZC0+eHZlYykKLQkJewotCQkgIGlmIChoLT5zeW0gIT0gKGFzeW1ib2wgKikgTlVMTCkKLQkJICAgICpzeW1fcHRyID0gc3ltID0gaC0+c3ltOwotCQl9Ci0KLQkgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotCQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLQkJICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkJICBzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JCSAgc3ltLT5mbGFncyAmPX4gQlNGX0NPTlNUUlVDVE9SOwotCQkgIHN5bS0+dmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCQkgIHN5bS0+c2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JCSAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLQkJICBzeW0tPmZsYWdzICY9fiBCU0ZfQ09OU1RSVUNUT1I7Ci0JCSAgc3ltLT52YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgc3ltLT5zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCQkgIHN5bS0+dmFsdWUgPSBoLT5yb290LnUuYy5zaXplOwotCQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkJICBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCSAgICB7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSk7Ci0JCSAgICAgIHN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JCSAgICB9Ci0JCSAgLyogV2UgZG8gbm90IHNldCB0aGUgc2VjdGlvbiBvZiB0aGUgc3ltYm9sIHRvCi0JCSAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi4gIFRoYXQgdmFsdWUgd2FzIHNhdmVkIHNvCi0JCSAgICAgdGhhdCB3ZSB3b3VsZCBrbm93IHdoZXJlIHRvIGFsbG9jYXRlIHRoZSBzeW1ib2wKLQkJICAgICBpZiBpdCB3YXMgZGVmaW5lZC4gIEluIHRoaXMgY2FzZSB0aGUgdHlwZSBpcwotCQkgICAgIHN0aWxsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBzbyB3ZSBkaWQgbm90IGRlZmluZQotCQkgICAgIGl0LCBzbyB3ZSBkbyBub3Qgd2FudCB0byB1c2UgdGhhdCBzZWN0aW9uLiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUaGlzIHN3aXRjaCBpcyBzdHJhaWdodCBmcm9tIHRoZSBvbGQgY29kZSBpbgotCSB3cml0ZV9maWxlX2xvY2FscyBpbiBsZHN5bS5jLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IChpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+a2VlcF9oYXNoLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkKLQkJICA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpKSkKLQlvdXRwdXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpICE9IDApCi0JewotCSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbWFya2VkIGFzIG9jY3VycmluZyBub3csIHJhdGhlcgotCSAgICAgdGhhbiBhdCB0aGUgZW5kLCBvdXRwdXQgaXQgbm93LiAgVGhpcyBpcyB1c2VkIGZvcgotCSAgICAgQ09GRiBDX0VYVCBGQ04gc3ltYm9scy4gIEZJWE1FOiBUaGVyZSBtdXN0IGJlIGEKLQkgICAgIGJldHRlciB3YXkuICAqLwotCSAgaWYgKGJmZF9hc3ltYm9sX2JmZCAoc3ltKSA9PSBpbnB1dF9iZmQKLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSAhPSAwKQotCSAgICBvdXRwdXQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBvdXRwdXQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0Jb3V0cHV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0JewotCSAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUpCi0JICAgIG91dHB1dCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIG91dHB1dCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0Jb3V0cHV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkKLQl7Ci0JICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfV0FSTklORykgIT0gMCkKLQkgICAgb3V0cHV0ID0gZmFsc2U7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGluZm8tPmRpc2NhcmQpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSBkaXNjYXJkX2FsbDoKLQkJICBvdXRwdXQgPSBmYWxzZTsKLQkJICBicmVhazsKLQkJY2FzZSBkaXNjYXJkX2w6Ci0JCSAgaWYgKGJmZF9pc19sb2NhbF9sYWJlbCAoaW5wdXRfYmZkLCBzeW0pKQotCQkgICAgb3V0cHV0ID0gZmFsc2U7Ci0JCSAgZWxzZQotCQkgICAgb3V0cHV0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSBkaXNjYXJkX25vbmU6Ci0JCSAgb3V0cHV0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpKQotCXsKLQkgIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0JICAgIG91dHB1dCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIG91dHB1dCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBzZWN0aW9uIHdoaWNoIGlzIG5vdCBiZWluZyBpbmNsdWRlZAotCSBpbiB0aGUgb3V0cHV0IGZpbGUsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgdGhlIHN5bWJvbC4KLQotCSBHcm9zcy4gIC5ic3MgYW5kIHNpbWlsYXIgc2VjdGlvbnMgd29uJ3QgaGF2ZSB0aGUgbGlua2VyX21hcmsKLQkgZmllbGQgc2V0LiAgKi8KLSAgICAgIGlmICgoc3ltLT5zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKLQkgICYmIHN5bS0+c2VjdGlvbi0+bGlua2VyX21hcmsgPT0gZmFsc2UpCi0Jb3V0cHV0ID0gZmFsc2U7Ci0KLSAgICAgIGlmIChvdXRwdXQpCi0JewotCSAgaWYgKCEgZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAob3V0cHV0X2JmZCwgcHN5bWFsbG9jLCBzeW0pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoaCAhPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGgtPndyaXR0ZW4gPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2VjdGlvbiBhbmQgdmFsdWUgb2YgYSBnZW5lcmljIEJGRCBzeW1ib2wgYmFzZWQgb24gYSBsaW5rZXIKLSAgIGhhc2ggdGFibGUgZW50cnkuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X3N5bWJvbF9mcm9tX2hhc2ggKHN5bSwgaCkKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgc3dpdGNoIChoLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb25zdHJ1Y3RvciBzeW1ib2wgaXMgc2VlbiBidXQgd2UgYXJlCi0gICAgICAgICBub3QgYnVpbGRpbmcgY29uc3RydWN0b3JzLiAgKi8KLSAgICAgIGlmIChzeW0tPnNlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBCRkRfQVNTRVJUICgoc3ltLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgc3ltLT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIHN5bS0+dmFsdWUgPSAwOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgICBzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgc3ltLT52YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIHN5bS0+dmFsdWUgPSAwOwotICAgICAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgc3ltLT5zZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbjsKLSAgICAgIHN5bS0+dmFsdWUgPSBoLT51LmRlZi52YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGgtPnUuZGVmLnNlY3Rpb247Ci0gICAgICBzeW0tPnZhbHVlID0gaC0+dS5kZWYudmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgc3ltLT52YWx1ZSA9IGgtPnUuYy5zaXplOwotICAgICAgaWYgKHN5bS0+c2VjdGlvbiA9PSBOVUxMKQotCXN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQl7Ci0JICBCRkRfQVNTRVJUIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpOwotCSAgc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQl9Ci0gICAgICAvKiBEbyBub3Qgc2V0IHRoZSBzZWN0aW9uOyBzZWUgX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMuICAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/ICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYSBnbG9iYWwgc3ltYm9sLCBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LgotICAgVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvICp3Z2luZm8gPQotICAgIChzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gKikgZGF0YTsKLSAgYXN5bWJvbCAqc3ltOwotCi0gIGlmIChoLT53cml0dGVuKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPndyaXR0ZW4gPSB0cnVlOwotCi0gIGlmICh3Z2luZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotICAgICAgfHwgKHdnaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgJiYgYmZkX2hhc2hfbG9va3VwICh3Z2luZm8tPmluZm8tPmtlZXBfaGFzaCwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPnN5bSAhPSAoYXN5bWJvbCAqKSBOVUxMKQotICAgIHN5bSA9IGgtPnN5bTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAod2dpbmZvLT5vdXRwdXRfYmZkKTsKLSAgICAgIGlmICghc3ltKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bS0+bmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBzeW0tPmZsYWdzID0gMDsKLSAgICB9Ci0KLSAgc2V0X3N5bWJvbF9mcm9tX2hhc2ggKHN5bSwgJmgtPnJvb3QpOwotCi0gIHN5bS0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQotICBpZiAoISBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sICh3Z2luZm8tPm91dHB1dF9iZmQsIHdnaW5mby0+cHN5bWFsbG9jLAotCQkJCSAgIHN5bSkpCi0gICAgewotICAgICAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZmFpbHVyZS4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIHJlbG9jYXRpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGFyZWxlbnQgKnI7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIGFib3J0ICgpOwotICBpZiAoc2VjLT5vcmVsb2NhdGlvbiA9PSAoYXJlbGVudCAqKikgTlVMTCkKLSAgICBhYm9ydCAoKTsKLQotICByID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKHIgPT0gKGFyZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgci0+YWRkcmVzcyA9IGxpbmtfb3JkZXItPm9mZnNldDsKLSAgci0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAoci0+aG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBzeW1ib2wgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbi4gICovCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgci0+c3ltX3B0cl9wdHIgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICB8fCAhIGgtPndyaXR0ZW4pCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkgIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHItPnN5bV9wdHJfcHRyID0gJmgtPnN5bTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiBpbnBsYWNlIHJlbG9jLCB3cml0ZSB0aGUgYWRkZW5kIHRvIHRoZSBvYmplY3QgZmlsZS4KLSAgICAgT3RoZXJ3aXNlLCBzdG9yZSBpdCBpbiB0aGUgcmVsb2MgYWRkZW5kLiAgKi8KLSAgaWYgKCEgci0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZSkKLSAgICByLT5hZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyLT5ob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKHItPmhvd3RvLCBhYmZkLAotCQkJCSAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywKLQkJICAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgID8gYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24pCi0JCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAotCQkgIHItPmhvd3RvLT5uYW1lLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCwKLQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHItPmFkZGVuZCA9IDA7Ci0gICAgfQotCi0gIHNlYy0+b3JlbG9jYXRpb25bc2VjLT5yZWxvY19jb3VudF0gPSByOwotICArK3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBhIG5ldyBsaW5rX29yZGVyIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKgotYmZkX25ld19saW5rX29yZGVyIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKm5ldzsKLQotICBuZXcgPSAoKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX29yZGVyKSkpOwotICBpZiAoIW5ldykKLSAgICByZXR1cm4gTlVMTDsKLQotICBuZXctPnR5cGUgPSBiZmRfdW5kZWZpbmVkX2xpbmtfb3JkZXI7Ci0gIG5ldy0+b2Zmc2V0ID0gMDsKLSAgbmV3LT5zaXplID0gMDsKLSAgbmV3LT5uZXh0ID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0gIGlmIChzZWN0aW9uLT5saW5rX29yZGVyX3RhaWwgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMKQotICAgIHNlY3Rpb24tPmxpbmtfb3JkZXJfdGFpbC0+bmV4dCA9IG5ldzsKLSAgZWxzZQotICAgIHNlY3Rpb24tPmxpbmtfb3JkZXJfaGVhZCA9IG5ldzsKLSAgc2VjdGlvbi0+bGlua19vcmRlcl90YWlsID0gbmV3OwotCi0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIERlZmF1bHQgbGluayBvcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICBOb3RlIHRoYXQgd2UgY2FuIG5vdCBoYW5kbGUKLSAgIHRoZSByZWxvY19saW5rX29yZGVyIHR5cGVzIGhlcmUsIHNpbmNlIHRoZXkgZGVwZW5kIHVwb24gdGhlIGRldGFpbHMKLSAgIG9mIGhvdyB0aGUgcGFydGljdWxhciBiYWNrZW5kcyBnZW5lcmF0ZXMgcmVsb2NzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBzd2l0Y2ggKGxpbmtfb3JkZXItPnR5cGUpCi0gICAgewotICAgIGNhc2UgYmZkX3VuZGVmaW5lZF9saW5rX29yZGVyOgotICAgIGNhc2UgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjoKLSAgICBjYXNlIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcjoKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcjoKLSAgICAgIHJldHVybiBkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlciwKLQkJCQkJICBmYWxzZSk7Ci0gICAgY2FzZSBiZmRfZmlsbF9saW5rX29yZGVyOgotICAgICAgcmV0dXJuIGRlZmF1bHRfZmlsbF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpOwotICAgIGNhc2UgYmZkX2RhdGFfbGlua19vcmRlcjoKLSAgICAgIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkgICAgICAgKFBUUikgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzLAotCQkJCSAgICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwKLQkJCQkgICAgICAgbGlua19vcmRlci0+c2l6ZSk7Ci0gICAgfQotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gaGFuZGxlIGEgYmZkX2ZpbGxfbGlua19vcmRlci4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWRlZmF1bHRfZmlsbF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKnNwYWNlOwotICBzaXplX3QgaTsKLSAgaW50IGZpbGw7Ci0gIGJvb2xlYW4gcmVzdWx0OwotCi0gIEJGRF9BU1NFUlQgKChzZWMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCk7Ci0KLSAgc2l6ZSA9IChzaXplX3QpIGxpbmtfb3JkZXItPnNpemU7Ci0gIHNwYWNlID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc2l6ZSk7Ci0gIGlmIChzcGFjZSA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsbCA9IGxpbmtfb3JkZXItPnUuZmlsbC52YWx1ZTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gMikKLSAgICBzcGFjZVtpXSA9IGZpbGwgPj4gODsKLSAgZm9yIChpID0gMTsgaSA8IHNpemU7IGkgKz0gMikKLSAgICBzcGFjZVtpXSA9IGZpbGw7Ci0gIHJlc3VsdCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBzcGFjZSwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LAotCQkJCSAgICAgbGlua19vcmRlci0+c2l6ZSk7Ci0gIGZyZWUgKHNwYWNlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBhIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIsCi0JCQkgICAgIGdlbmVyaWNfbGlua2VyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYm9vbGVhbiBnZW5lcmljX2xpbmtlcjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmV3X2NvbnRlbnRzOwotCi0gIEJGRF9BU1NFUlQgKChvdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKTsKLQotICBpZiAobGlua19vcmRlci0+c2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPT0gbGlua19vcmRlci0+c2l6ZSk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwCi0gICAgICAmJiBvdXRwdXRfc2VjdGlvbi0+b3JlbG9jYXRpb24gPT0gKGFyZWxlbnQgKiopIE5VTEwpCi0gICAgewotICAgICAgLyogU3BhY2UgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIG91dHB1dCByZWxvY2F0aW9ucy4KLQkgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGNhbGxlZCBieSBhIHNwZWNpZmljIGJhY2tlbmQKLQkgYmVjYXVzZSBzb21lYm9keSBpcyBhdHRlbXB0aW5nIHRvIGxpbmsgdG9nZXRoZXIgZGlmZmVyZW50Ci0JIHR5cGVzIG9mIG9iamVjdCBmaWxlcy4gIEhhbmRsaW5nIHRoaXMgY2FzZSBjb3JyZWN0bHkgaXMKLQkgZGlmZmljdWx0LCBhbmQgc29tZXRpbWVzIGltcG9zc2libGUuICAqLwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIkF0dGVtcHQgdG8gZG8gcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCAlcyBpbnB1dCBhbmQgJXMgb3V0cHV0IiksCi0JIGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGdlbmVyaWNfbGlua2VyKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipzeW1wcDsKLSAgICAgIGFzeW1ib2wgKipzeW1wcGVuZDsKLQotICAgICAgLyogR2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scy4gIFRoZSBnZW5lcmljIGxpbmtlciB3aWxsIGFsd2F5cwotCSBoYXZlIHJldHJpZXZlZCB0aGVtIGJ5IHRoaXMgcG9pbnQsIGJ1dCB3ZSBhcmUgYmVpbmcgY2FsbGVkIGJ5Ci0JIGEgc3BlY2lmaWMgbGlua2VyLCBwcmVzdW1hYmx5IGJlY2F1c2Ugd2UgYXJlIGxpbmtpbmcKLQkgZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdCBmaWxlcyB0b2dldGhlci4gICovCi0gICAgICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2luY2Ugd2UgaGF2ZSBiZWVuIGNhbGxlZCBieSBhIHNwZWNpZmljIGxpbmtlciwgcmF0aGVyIHRoYW4KLQkgdGhlIGdlbmVyaWMgbGlua2VyLCB0aGUgdmFsdWVzIG9mIHRoZSBzeW1ib2xzIHdpbGwgbm90IGJlCi0JIHJpZ2h0LiAgVGhleSB3aWxsIGJlIHRoZSB2YWx1ZXMgYXMgc2VlbiBpbiB0aGUgaW5wdXQgZmlsZSwKLQkgbm90IHRoZSB2YWx1ZXMgb2YgdGhlIGZpbmFsIGxpbmsuICBXZSBuZWVkIHRvIGZpeCB0aGVtIHVwCi0JIGJlZm9yZSB3ZSBjYW4gcmVsb2NhdGUgdGhlIHNlY3Rpb24uICAqLwotICAgICAgc3ltcHAgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKTsKLSAgICAgIHN5bXBwZW5kID0gc3ltcHAgKyBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGlucHV0X2JmZCk7Ci0gICAgICBmb3IgKDsgc3ltcHAgPCBzeW1wcGVuZDsgc3ltcHArKykKLQl7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgc3ltID0gKnN5bXBwOwotCi0JICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0lORElSRUNUCi0JCQkgICAgIHwgQlNGX1dBUk5JTkcKLQkJCSAgICAgfCBCU0ZfR0xPQkFMCi0JCQkgICAgIHwgQlNGX0NPTlNUUlVDVE9SCi0JCQkgICAgIHwgQlNGX1dFQUspKSAhPSAwCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICB7Ci0JICAgICAgLyogc3ltLT51ZGF0YSBtYXkgaGF2ZSBiZWVuIHNldCBieQotCQkgZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdC4gICovCi0JICAgICAgaWYgKHN5bS0+dWRhdGEucCAhPSBOVUxMKQotCQloID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIHN5bS0+dWRhdGEucDsKLQkgICAgICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JCWggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkJICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICAgIGVsc2UKLQkJaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLAotCQkJCQkgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCSAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlzZXRfc3ltYm9sX2Zyb21faGFzaCAoc3ltLCBoKTsKLQkgICAgfQotCX0JICAKLSAgICB9Ci0KLSAgLyogR2V0IGFuZCByZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGNvbnRlbnRzID0gKChiZmRfYnl0ZSAqKQotCSAgICAgIGJmZF9tYWxsb2MgKGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBuZXdfY29udGVudHMgPSAoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCQkgIChvdXRwdXRfYmZkLCBpbmZvLCBsaW5rX29yZGVyLCBjb250ZW50cywgaW5mby0+cmVsb2NhdGVhYmxlLAotCQkgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSkpOwotICBpZiAoIW5ld19jb250ZW50cykKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBPdXRwdXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgbmV3X2NvbnRlbnRzLAotCQkJCSAgbGlua19vcmRlci0+b2Zmc2V0LCBsaW5rX29yZGVyLT5zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSBsaXR0bGUgcm91dGluZSB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBpbiBhIGxpbmtfb3JkZXIKLSAgIGxpc3QuICAqLwotCi11bnNpZ25lZCBpbnQKLV9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKGxpbmtfb3JkZXIpCi0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbDsKLQotICBjID0gMDsKLSAgZm9yIChsID0gbGlua19vcmRlcjsgbCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkgIHx8IGwtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSsrYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGM7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9saW5rX3NwbGl0X3NlY3Rpb24KLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfbGlua19zcGxpdF9zZWN0aW9uKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYyk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIG5vbnplcm8gaWYgQHZhcntzZWN9IHNob3VsZCBiZSBzcGxpdCBkdXJpbmcgYQotCXJlbG9jZWF0YWJsZSBvciBmaW5hbCBsaW5rLgotCi0uI2RlZmluZSBiZmRfbGlua19zcGxpdF9zZWN0aW9uKGFiZmQsIHNlYykgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24sIChhYmZkLCBzZWMpKQotLgotCi0qLwotCi0KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9seW54LWNvcmUuYyBiL2JmZC9seW54LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1ODE3Ny4uMDAwMDAwMAotLS0gYS9iZmQvbHlueC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyogQkZEIGJhY2sgZW5kIGZvciBMeW54IGNvcmUgZmlsZXMKLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLSNpbmNsdWRlIDxzeXMvY29uZi5oPgotI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KLS8qIHN5cy9rZXJuZWwuaCBzaG91bGQgZGVmaW5lIHRoaXMsIGJ1dCBkb2Vzbid0IGFsd2F5cywgc2lnaC4gKi8KLSNpZm5kZWYgX19MWU5YT1MKLSNkZWZpbmUgX19MWU5YT1MKLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9tZW0uaD4KLSNpbmNsdWRlIDxzeXMvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzeXMvaXRpbWVyLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxzeXMvcHJvYy5oPgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi1zdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgY2hhciBjbWRbUE5NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5seW54X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi0vKiBIYW5kbGUgTHlueCBjb3JlIGR1bXAgZmlsZS4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmV3bmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1seW54X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBzZWNudW07Ci0gIHN0cnVjdCBwc3NlbnRyeSBwc3M7Ci0gIHNpemVfdCB0Y29udGV4dF9zaXplOwotICBjb3JlX3N0X3QgKnRocmVhZHA7Ci0gIGludCBwYWdlc2l6ZTsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0KLSAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsJLyogU2VyaW91cyBjcm9zcy10YXJnZXQgaXNzdWUgaGVyZS4uLiAgVGhpcwotCQkJCSAgIHJlYWxseSBuZWVkcyB0byBjb21lIGZyb20gYSBzeXN0ZW0tc3BlY2lmaWMKLQkJCQkgICBoZWFkZXIgZmlsZS4gICovCi0KLSAgLyogR2V0IHRoZSBwc3MgZW50cnkgZnJvbSB0aGUgY29yZSBmaWxlICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmcHNzLCAxLCBzaXplb2YgcHNzLCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgcHNzKQotICAgIHsKLSAgICAgIC8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QpKTsKLQotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBwc3MucG5hbWUsIFBOTUxFTiArIDEpOwotCi0gIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHRocmVhZCBjb250ZXh0cyAqLwotCi0gIHRjb250ZXh0X3NpemUgPSBwc3MudGhyZWFkY250ICogc2l6ZW9mIChjb3JlX3N0X3QpOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdGhyZWFkIGNvbnRleHRzICovCi0KLSAgdGhyZWFkcCA9IChjb3JlX3N0X3QgKiliZmRfYWxsb2MgKGFiZmQsIHRjb250ZXh0X3NpemUpOwotICBpZiAoIXRocmVhZHApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2F2ZSB0aHJlYWQgY29udGV4dHMgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHBhZ2VzaXplLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKil0aHJlYWRwLCBwc3MudGhyZWFkY250LCBzaXplb2YgKGNvcmVfc3RfdCksIGFiZmQpOwotCi0gIGlmICh2YWwgIT0gdGNvbnRleHRfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSB0b28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IHRocmVhZHAtPmN1cnJzaWc7Ci0KLSAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwKLQkJCSAgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgcHNzLnNzaXplLAotCQkJICAgICAgIHBzcy5zbGltaXQsCi0JCQkgICAgICAgcGFnZXNpemUgKyB0Y29udGV4dF9zaXplKTsKLSAgaWYgKCFuZXdzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCSAgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgcHNzLmRhdGFfbGVuICsgcHNzLmJzc19sZW4sCi0JCQkgICAgICAgcHNzLmRhdGFfc3RhcnQsCi0JCQkgICAgICAgcGFnZXNpemUgKyB0Y29udGV4dF9zaXplICsgcHNzLnNzaXplCi0jaWYgZGVmaW5lZCAoU1BBUkMpIHx8IGRlZmluZWQgKF9fU1BBUkNfXykKLQkJCSAgICAgICAvKiBTUEFSQyBMeW54IHNlZW1zIHRvIHN0YXJ0IGR1bXBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgLmRhdGEgc2VjdGlvbiBhdCBhIHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeS4gIEl0J3MgT0sgdG8gY2hlY2sgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgbGlrZSBTUEFSQyBoZXJlIGJlY2F1c2UgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gYSBMeW54Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC4gICovCi0JCQkgICAgICAgKyBwc3MuZGF0YV9zdGFydCAlIHBhZ2VzaXplCi0jZW5kaWYKLQkJCSAgICAgICApOwotICBpZiAoIW5ld3NlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLS8qIEFuZCwgbm93IGZvciB0aGUgLnJlZy9YWFggcHNldWRvIHNlY3Rpb25zLiAgRWFjaCB0aHJlYWQgaGFzIGl0J3Mgb3duCi0gICAucmVnL1hYWCBzZWN0aW9uLCB3aGVyZSBYWFggaXMgdGhlIHRocmVhZCBpZCAod2l0aG91dCBsZWFkaW5nIHplcm9zKS4gIFRoZQotICAgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkIChhdCB0aGUgdGltZSBvZiB0aGUgY29yZSBkdW1wKSBhbHNvIGhhcyBhbiBhbGlhcwotICAgY2FsbGVkIGAucmVnJyAoanVzdCB0byBrZWVwIEdEQiBoYXBweSkuICBOb3RlIHRoYXQgd2UgdXNlIGAucmVnL1hYWCcgYXMKLSAgIG9wcG9zZWQgdG8gYC5yZWdYWFgnIGJlY2F1c2UgR0RCIGV4cGVjdHMgdGhhdCAucmVnMiB3aWxsIGJlIHRoZSBmbG9hdGluZy0KLSAgIHBvaW50IHJlZ2lzdGVycy4gICovCi0KLSAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkgICAgICAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgICBzaXplb2YgKGNvcmVfc3RfdCksCi0JCQkgICAgICAgMCwKLQkJCSAgICAgICBwYWdlc2l6ZSk7Ci0gIGlmICghbmV3c2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKHNlY251bSA9IDA7IHNlY251bSA8IHBzcy50aHJlYWRjbnQ7IHNlY251bSsrKQotICAgIHsKLSAgICAgIGNoYXIgc2VjbmFtZVsxMDBdOwotCi0gICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIEJVSUxEUElEICgwLCB0aHJlYWRwW3NlY251bV0udGlkKSk7Ci0gICAgICBuZXdzZWN0ID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0JCQkJICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkgICBzaXplb2YgKGNvcmVfc3RfdCksCi0JCQkJICAgMCwKLQkJCQkgICBwYWdlc2l6ZSArIHNlY251bSAqIHNpemVvZiAoY29yZV9zdF90KSk7Ci0gICAgICBpZiAoIW5ld3NlY3QpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1jaGFyICoKLWx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWJvb2xlYW4KLWx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvbTY4azRrbmV0YnNkLmMgYi9iZmQvbTY4azRrbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzQzOGQuLjAwMDAwMDAKLS0tIGEvYmZkL202OGs0a25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgxMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLNEtfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChtNjhrNGtuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4azRrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL202OGtsaW51eC5jIGIvYmZkL202OGtsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY0N2E4Li4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIG02OGsgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzY4MDIwIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a2xpbnV4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4ay1saW51eCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKLQotLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0Ci0gICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKLSAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotc3RhdGljIGJvb2xlYW4gbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1tNjhrbGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotDAotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZQlHT1RfUkVGX1BSRUZJWAkiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAotI2RlZmluZQlQTFRfUkVGX1BSRUZJWAkiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+Zml4dXBfY291bnQgPSAwOwotICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKLSAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotCQkJCSAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIHN0cnVjdCBmaXh1cCAqZjsKLQotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0JICBpZiAoZiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotCSBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLQkgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotCQkgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotCQkJICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotCSAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotCSAgKnArKyA9ICdcMCc7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotCSAgICAgYWxsb2MsIHApOwotCSAgZnJlZSAoYWxsb2MpOwotCX0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdCBpdCAqLwotICBpc19wbHQgPSBJU19QTFRfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGlmIChpc19wbHQgfHwgSVNfR09UX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKSkKLSAgICB7Ci0gICAgICAvKiBMb29rIHVwIHRoaXMgc3ltYm9sIHR3aWNlLiAgT25jZSBqdXN0IGFzIGEgcmVndWxhciBsb29rdXAsCi0JIGFuZCB0aGVuIGFnYWluIGZvbGxvd2luZyBhbGwgb2YgdGhlIGluZGlyZWN0IGxpbmtzIHVudGlsIHdlCi0JIHJlYWNoIGEgcmVhbCBzeW1ib2wuICAqLwotICAgICAgaDEgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIC8qIGgyIGRvZXMgbm90IGZvbGxvdyBpbmRpcmVjdCBzeW1ib2xzLiAqLwotICAgICAgaDIgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotCSB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLQkgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0JIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotCSBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLQkgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLQkgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgxLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgICAgfHwgaDItPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpKQotCXsKLQkgIC8qIFNlZSBpZiB0aGVyZSBpcyBhICJidWlsdGluIiBmaXh1cCBhbHJlYWR5IHByZXNlbnQKLQkgICAgIGludm9sdmluZyB0aGlzIHN5bWJvbC4gIElmIHNvLCBjb252ZXJ0IGl0IHRvIGEgcmVndWxhcgotCSAgICAgZml4dXAuICBJbiB0aGUgZW5kLCB0aGlzIHJlbGF4ZXMgc29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzCi0JICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcGVyZm9ybWluZyBmaXh1cHMuICAqLwotCSAgZXhpc3RzID0gZmFsc2U7Ci0JICBmb3IgKGYxID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0JICAgICAgIGYxICE9IE5VTEw7Ci0JICAgICAgIGYxID0gZjEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKGYxLT5oICE9IGggJiYgZjEtPmggIT0gaDEpCi0JCSAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChmMS0+aCA9PSBoMSkKLQkJZXhpc3RzID0gdHJ1ZTsKLQkgICAgICBpZiAoISBleGlzdHMKLQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkJICBmLT5qdW1wID0gaXNfcGx0OwotCQl9Ci0JICAgICAgZjEtPmggPSBoMTsKLQkgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLQkgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0JICAgICAgZXhpc3RzID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKCEgZXhpc3RzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkgICAgICBpZiAoZiA9PSBOVUxMKQotCQl7Ci0JCSAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotCSBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCBmaW5kIHRoZSBmaXh1cHMuLi4gKi8KLSAgbGludXhfbGlua19oYXNoX3RyYXZlcnNlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBsaW51eF90YWxseV9zeW1ib2xzLAotCQkJICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQl7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGZpeHVwIHRhYmxlLiAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwgCi0JICBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JICBvcy0+dm1hICsgcy0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQotICBmaXh1cF90YWJsZSA9IHMtPmNvbnRlbnRzOwotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQsIGZpeHVwX3RhYmxlKTsKLSAgZml4dXBfdGFibGUgKz0gNDsKLQotICAvKiBGaWxsIGluIGZpeHVwIHRhYmxlLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiRml4dXAoJWQpICVzOiAleCAleFxuIixmLT5qdW1wLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCSAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGYtPmp1bXApCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSArIDIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGlucyAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNwZWNpYWwgbWFya2VyIHNvIHdlIGtub3cgdG8gc3dpdGNoIHRvIHRoZSBvdGhlciB0eXBlIG9mIGZpeHVwICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBpZiAoISBmLT5idWlsdGluKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotCQkgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotCSAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLQkgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLQkJICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgIT0gZml4dXBzX3dyaXR0ZW4pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJXYXJuaW5nOiBmaXh1cCBjb3VudCBtaXNtYXRjaFxuIikpOwotICAgICAgd2hpbGUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IGZpeHVwc193cml0dGVuKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gICAgfQotCi0gIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkgICAgICAiX19CVUlMVElOX0ZJWFVQU19fIiwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgaXMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJCdWlsdGluIGZpeHVwIHRhYmxlIGF0ICV4XG4iLCBuZXdfYWRkcik7Ci0jZW5kaWYKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBvdXRwdXRfYmZkKQotICAgICAgIT0gcy0+X3Jhd19zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbTY4a2x5bnguYyBiL2JmZC9tNjhrbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNkZmJjLi4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBtNjhrIGJpbmFyaWVzIHVuZGVyIEx5bnhPUy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a2x5bnhfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbHlueCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLWNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCgpOwotaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKCk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wKCk7Ci0KLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcCBseW54X2NvcmVfZmlsZV9wCi0KLSNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbTY4a25ldGJzZC5jIGIvYmZkL202OGtuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMTY2NS4uMDAwMDAwMAotLS0gYS9iZmQvbTY4a25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLS8qIE91ciBtNjhrIHBvcnRzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCi0gICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gYWxsIG02OGsgbWFjaGluZXMuICovCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a25ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tNjhrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL204OGttYWNoMy5jIGIvYmZkL204OGttYWNoMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTU2NDA4Li4wMDAwMDAwCi0tLSBhL2JmZC9tODhrbWFjaDMuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgbTg4ayBhLm91dCAoTWFjaCAzKSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJKDQwOTYqMikKLSNkZWZpbmUgU0VHTUVOVF9TSVpFCTB4MjAwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTAKLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMSAJCS8qIChOX01BR0lHKHgpID09IFpNQUdJQykgKi8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkJKCh4KS5hX3RleHQpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX204OGsKLSNkZWZpbmUgTVkoT1ApIENBVChtODhrbWFjaDNfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tODhrLW1hY2gzIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tYWtlZmlsZS5kb3MgYi9iZmQvbWFrZWZpbGUuZG9zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIyYzZhLi4wMDAwMDAwCi0tLSBhL2JmZC9tYWtlZmlsZS5kb3MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1DRkxBR1M9LU8yCi0KLS5jLm8gOgotCWdjYyAkKENGTEFHUykgLUkuIC1JLi4vaW5jbHVkZSAtYyAkPAotCi1hbGwgOiBsaWJiZmQuYQotCi10YXJnZXRzLm8gOiB0YXJnZXRzLmMKLQlnY2MgJChDRkxBR1MpIC1JLiAtSS4uL2luY2x1ZGUgLURTRUxFQ1RfVkVDUz0mZ28zMmNvZmZfdmVjLCZpMzg2YW91dF92ZWMgLURERUZBVUxUX1ZFQ1RPUj1nbzMyY29mZl92ZWMgLWMgJCouYwotCi1hcmNodXJlcy5vIDogYXJjaHVyZXMuYwotCWdjYyAkKENGTEFHUykgLUkuIC1JLi4vaW5jbHVkZSAtRFNFTEVDVF9BUkNISVRFQ1RVUkVTPWJmZF9pMzg2X2FyY2ggLWMgJCouYwotCi1PQkpTID0gXAotCWxpYmJmZC5vIFwKLQlvcG5jbHMubyBcCi0JYmZkLm8gXAotCWFyY2hpdmUubyBcCi0JdGFyZ2V0cy5vIFwKLQljYWNoZS5vIFwKLQlhcmNodXJlcy5vIFwKLQljb3JlZmlsZS5vIFwKLQlzZWN0aW9uLm8gXAotCWZvcm1hdC5vIFwKLQlzeW1zLm8gXAotCXJlbG9jLm8gXAotCWluaXQubyBcCi0JY29mZmdlbi5vIFwKLQlzcmVjLm8gXAotCWhhc2gubyBcCi0JbGlua2VyLm8gXAotCWVjb2ZmLm8gXAotCWVjb2ZmbGluay5vIFwKLQllbGYubyBcCi0JYW91dDMyLm8gXAotCXN0YWItc3ltLm8gXAotCWkzODZhb3V0Lm8gXAotCWNwdS1pMzg2Lm8gXAotCWNvZmYtZ28zMi5vIFwKLQljb2ZmbGluay5vIFwKLQllbGYzMi5vIFwKLQliaW5hcnkubyBcCi0JdGVraGV4Lm8gXAotCSRFCi0KLWxpYmJmZC5hIDogJChPQkpTKQotCS1ybSBsaWJiZmQuYQotCWFyIHJ2cyBsaWJiZmQuYSAkKE9CSlMpCi0JcmFubGliIGxpYmJmZC5hCmRpZmYgLS1naXQgYS9iZmQvbWFrZWZpbGUudm1zIGIvYmZkL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2YjFmZi4uMDAwMDAwMAotLS0gYS9iZmQvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgYmZkIGxpYnJhcnkgdW5kZXIgb3BlblZNUyAoQWxwaGEgYW5kIFZheCkKLSMKLSMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcm1pLmRlCi0jCi0jCi0KLUNDPWNjCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1IT1NURklMRT1hbHBoYXZtcy5oCi1UQVJHRVRPQkpTID0gY3B1LWFscGhhLm9iagotZWxzZQotSE9TVEZJTEU9dmF4dm1zLmgKLVRBUkdFVE9CSlMgPSBjcHUtdmF4Lm9iagotZW5kaWYKLQotCi1PQkpTPWFyY2hpdmUub2JqLGFyY2h1cmVzLm9iaixiZmQub2JqLGNhY2hlLm9iaixjb2ZmZ2VuLm9iaixjb3JlZmlsZS5vYmosXAotICBmb3JtYXQub2JqLGluaXQub2JqLGxpYmJmZC5vYmosb3BuY2xzLm9iaixyZWxvYy5vYmosc2VjdGlvbi5vYmosc3ltcy5vYmosXAotICB0YXJnZXRzLm9iaixoYXNoLm9iaixsaW5rZXIub2JqLGVsZi5vYmosc3JlYy5vYmosYmluYXJ5Lm9iaix0ZWtoZXgub2JqLFwKLSAgaWhleC5vYmosc3RhYi1zeW1zLm9iaix2bXMub2JqLHZtcy1oZHIub2JqLHZtcy1nc2Qub2JqLHZtcy10aXIub2JqLFwKLSAgdm1zLW1pc2Mub2JqLCQoVEFSR0VUT0JKUykKLQotaWZlcSAoJChDQyksZ2NjKQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfYWxwaGFfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF9hbHBoYV9hcmNoIixcCi0iSEFWRV92bXNfYWxwaGFfdmVjPTEiKQotZWxzZQotREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc192YXhfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF92YXhfYXJjaCIsXAotIkhBVkVfdm1zX3ZheF92ZWM9MSIsIlZNU19ERUJVRyIpCi1lbmRpZgotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkkKERFRlMpCi1lbHNlCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc19hbHBoYV92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX2FscGhhX2FyY2giLFwKLSJIQVZFX3Ztc19hbHBoYV92ZWM9MSIsInVubGluaz1yZW1vdmUiLCJjb25zdD0iLCJWTVNfREVCVUciLCkKLWVsc2UKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfdmF4X3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfdmF4X2FyY2giLFwKLSJIQVZFX3Ztc192YXhfdmVjPTEiLCJ1bmxpbms9cmVtb3ZlIiwiY29uc3Q9IiwiVk1TX0RFQlVHIikKLWVuZGlmCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKSQoREVGUykvd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMsbG9uZ2V4dGVybikKLWVuZGlmCi0KLQotbGliYmZkLm9sYjogc3lzZGVwLmggYmZkLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJiZmQgJChPQkpTKQotCi1zeXNkZXAuaDogWy5ob3N0c10kKEhPU1RGSUxFKSBjb25maWcuaAotCSQoQ1ApICQ8ICRACi0KLWJmZC5oOiBiZmQtaW4yLmgKLQkkJCBAY29uZmlndXJlCi0KLXRhcmdtYXRjaC5oOiBiZmQuaAotY29uZmlnLmg6IGJmZC5oCi0KLXZtcy5jOiB2bXMuaAotdm1zLW1oZC5jOiB2bXMuaAotdm1zLWdzZC5jOiB2bXMuaAotdm1zLXRpci5jOiB2bXMuaAotdm1zLW1pc2MuYzogdm1zLmgKLXRhcmdldHMuYzogdGFyZ21hdGNoLmgKLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSBsaWJiZmQub2xiOwotCSQoUk0pIHN5c2RlcC5oOwotCSQoUk0pIGJmZC5oOwotCSQoUk0pIHRhcmdtYXRjaC5oOwotCSQoUk0pIGNvbmZpZy5oOwotCSQoUk0pICoub2JqOwpkaWZmIC0tZ2l0IGEvYmZkL21pcHNic2QuYyBiL2JmZC9taXBzYnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmE2OGQuLjAwMDAwMDAKLS0tIGEvYmZkL21pcHNic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgTUlQUyBCU0QgKGEub3V0KSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUmFscGggQ2FtcGJlbGwuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLS8qICNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8gKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gKHgpLmFfZW50cnkgOgkvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi9cCi0JICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRQkvKiBubyBwYWRkaW5nICovXAotICAgICkKLSNkZWZpbmUgTl9EQVRBRERSKHgpIChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX21pcHMKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fVU5LTk9XTiBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNX01JUFMxIHx8IChtdHlwZSkgPT0gTV9NSVBTMikKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXDAnCi0KLSNkZWZpbmUgTVkoT1ApIENBVChtaXBzYnNkXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKEFCRkQsIEVYRUMpIFwKLSAgTVkoc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIE1ZKGNob29zZV9yZWxvY19zaXplKShBQkZEKTsKLXN0YXRpYyB2b2lkIE1ZKHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG1hY2h0eXBlKSk7Ci1zdGF0aWMgdm9pZCBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLS8qIFdlIGNhbid0IHVzZSBNWSh4KSBoZXJlIGJlY2F1c2UgaXQgbGVhZHMgdG8gYSByZWN1cnNpdmUgY2FsbCB0byBDQVQKLSAgIHdoZW4gZXhwYW5kZWQgaW5zaWRlIEpVTVBfVEFCTEUuICAqLwotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc2JzZF9yZWxvY19ob3d0b190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgbWlwc2JzZF9jYW5vbmljYWxpemVfcmVsb2MKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotI2RlZmluZSBNWV9CRkRfVEFSR0VUCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi1zdGF0aWMgdm9pZAotTVkoc2V0X2FyY2hfbWFjaCkgKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGxvbmcgbWFjaGluZTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gKi8KLSAgc3dpdGNoIChtYWNodHlwZSkgewotCi0gIGNhc2UgTV9NSVBTMToKLSAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICBtYWNoaW5lID0gMzAwMDsKLSAgICBicmVhazsKLQotICBjYXNlIE1fTUlQUzI6Ci0gICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgbWFjaGluZSA9IDQwMDA7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICBtYWNoaW5lID0gMDsKLSAgICBicmVhazsKLSAgfQotICBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsgIAotfQotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotTVkoY2hvb3NlX3JlbG9jX3NpemUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEJTRCBhLm91dCBmb3JtYXQuCi0gIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaChhYmZkKSkgewotICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgc3dpdGNoIChiZmRfZ2V0X21hY2goYWJmZCkpIHsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAxMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82ODAxMCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbTY4MDIwOgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4MDIwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fU1BBUkMpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzM4Nik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMjlLKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoKGFiZmQpKSB7Ci0gICAgY2FzZSA0MDAwOgotICAgIGNhc2UgNjAwMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9NSVBTMik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX01JUFMxKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gIH0KLQotICBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkoYWJmZCk7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKiBNSVBTIHJlbG9jYXRpb24gdHlwZXMuCi0gKi8KLSNkZWZpbmUgTUlQU19SRUxPQ18zMgkJMAotI2RlZmluZSBNSVBTX1JFTE9DX0pNUAkJMQotI2RlZmluZSBNSVBTX1JFTE9DX1dESVNQMTYJMgotI2RlZmluZSBNSVBTX1JFTE9DX0hJMTYJCTMKLSNkZWZpbmUgTUlQU19SRUxPQ19ISTE2X1MJNAotI2RlZmluZSBNSVBTX1JFTE9DX0xPMTYJCTUKLQotLyoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBwZXJmb3JtaW5nIGEgQkZEX1JFTE9DX01JUFNfSk1QIHJlbG9jYXRpb24uCi0gKiBUaGUganVtcCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGZvcm1lZCBmcm9tIHRoZSB1cHBlciA0IGJpdHMgb2YgdGhlCi0gKiAiY3VycmVudCIgcHJvZ3JhbSBjb3VudGVyIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBqdW1wIGluc3RydWN0aW9uJ3MKLSAqIDI2IGJpdCBmaWVsZCBhbmQgdHdvIHRyYWlsaW5nIHplcm9zLgotICogSWYgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgbm90IGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlICJjdXJyZW50IgotICogcHJvZ3JhbSBjb3VudGVyLCB0aGVuIHdlIG5lZWQgdG8gc2lnbmFsIGFuIGVycm9yLgotICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9qbXBfYWRkciAoYWJmZCxyZWxvY19lbnRyeSxzeW1ib2wsZGF0YSxpbnB1dF9zZWN0aW9uLG91dHB1dF9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbiwgcGM7Ci0gCi0gIC8qIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGp1c3QgY29udGludWUuICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiAKLSAgICogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgKiBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4KLSAgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBwYyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArIDQ7Ci0KLSAgaWYgKChyZWxvY2F0aW9uICYgMHhGMDAwMDAwMCkgIT0gKHBjICYgMHhGMDAwMDAwMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKgotICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHBlcmZvcm1pbmcgYSBCRkRfUkVMT0NfSEkxNl9TIHJlbG9jYXRpb24uCi0gKiBXZSBuZWVkIHRvIHNlZSBpZiBiaXQgMTUgaXMgc2V0IGluIHRoZSByZXN1bHQuIElmIGl0IGlzLCB3ZSBhZGQKLSAqIDB4MTAwMDAgYW5kIGNvbnRpbnVlIG5vcm1hbGx5LiBUaGlzIHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uCi0gKiB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQgYXQgcnVuIHRpbWUuCi0gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZml4X2hpMTZfcyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCSBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9oaTE2X3MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotIAotICAvKiBJZiB0aGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBqdXN0IGNvbnRpbnVlLiAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogCi0gICAqIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICogaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuCi0gICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jYXRpb24gJiAweDgwMDApCi0gICAgcmVsb2NfZW50cnktPmFkZGVuZCArPSAweDEwMDAwOwotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfaG93dG9fdGFibGVfZXh0W10gPSB7Ci0gIHtNSVBTX1JFTE9DXzMyLCAgICAgIDAsIDIsIDMyLCBmYWxzZSwgMCwgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLAotCSIzMiIsICAgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0pNUCwgICAgIDIsIDIsIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQltaXBzX2ZpeF9qbXBfYWRkciwKLQkiTUlQU19KTVAiLCBmYWxzZSwgMCwgMHgwM2ZmZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19XRElTUDE2LCAyLCAyLCAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkiV0RJU1AxNiIsICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19ISTE2LCAgIDE2LCAyLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLAotCSJISTE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0hJMTZfUywgMTYsIDIsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgICAgIG1pcHNfZml4X2hpMTZfcywKLSAgICAgICAgIkhJMTZfUyIsICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfTE8xNiwgICAgMCwgMiwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSJMTzE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1NWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCkgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAoYWJmZCkgIT0gYmZkX2FyY2hfbWlwcykKLSAgICByZXR1cm4gMDsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DXzMyXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX0pNUF0pOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19XRElTUDE2XSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSEkxNl0pOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSEkxNl9TXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfTE8xNl0pOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgYW91dHguaCB2ZXJzaW9uIGJ1dCB3ZSBuZWVkIHRvIGRvIG91cgotICogb3duIG1hcHBpbmcgb2YgZXh0ZXJuYWwgcmVsb2MgdHlwZSB2YWx1ZXMgdG8gaG93dG8gZW50cmllcy4KLSAqLwotbG9uZwotTVkoY2Fub25pY2FsaXplX3JlbG9jKShhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgICBiZmQgKmFiZmQ7Ci0gICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCwgYzsKLSAgZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgTkFNRShhb3V0LGV4dF9ob3d0b190YWJsZSlbXTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZSwgcmV0dXJuIHRoZSB2YWx1ZXMuICovCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykgewotICAgICAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OwotICAgIH0KLSAgICAqcmVscHRyID0gMDsKLSAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIH0KLSAgaWYgKHRibHB0ciAmJiBzZWN0aW9uLT5yZWxvY19jb3VudCkgewotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KSAKLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotCi0gIGlmICghTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKShhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLSAgICByZXR1cm4gLTE7Ci0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgLyogZml4IHVwIGhvd3RvIGVudHJpZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspIAotICAgIHsKLSAgICAgIGMgPSB0YmxwdHItPmhvd3RvIC0gTkFNRShhb3V0LGV4dF9ob3d0b190YWJsZSk7Ci0gICAgICB0YmxwdHItPmhvd3RvID0gJm1pcHNfaG93dG9fdGFibGVfZXh0W2NdOwotCi0gICAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgMCwJCQkJLyogem1hZ2ljIGNvbnRpZ3VvdXMgKi8KLSAgMSwJCQkJLyogdGV4dCBpbmNsIGhlYWRlciAqLwotICAwLAkJCQkvKiBlbnRyeSBpcyB0ZXh0IGFkZHJlc3MgKi8KLSAgMCwJCQkJLyogZXhlY19oZHJfZmxhZ3MgKi8KLSAgVEFSR0VUX1BBR0VfU0laRSwJCQkvKiB0ZXh0IHZtYSAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIDAsCQkJCS8qIHRleHQgc2l6ZSBpbmNsdWRlcyBleGVjIGhlYWRlciAqLwotICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCi0gIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCi0gIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KLSAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KLSAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLwotICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2xpdHRsZV92ZWMgPQotewotICAiYS5vdXQtbWlwcy1saXR0bGUiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAotfTsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYyA9Ci17Ci0gICJhLm91dC1taXBzLWJpZyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL21wdy1jb25maWcuaW4gYi9iZmQvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhZGRlZS4uMDAwMDAwMAotLS0gYS9iZmQvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgQkZELgotCi0jIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBjb3JyZWN0LgotCi1TZXQgc2VsYXJjaHMgIiZiZmRfe3RhcmdldF9jcHV9X2FyY2giCi1TZXQgZGVmdmVjICIiCi1TZXQgc2VsdmVjcyAiIgotU2V0IGhhdmV2ZWNzICIiCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1tNjhrLmMubyAie299ImNvZmZsaW5rLmMubycKLQlTZXQgZGVmdmVjIG02OGtjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmbTY4a2NvZmZfdmVjJwotCVNldCBoYXZldmVjcyAnLWQgSEFWRV9tNjhrY29mZl92ZWMnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3Bvd2VycGMtYXBwbGUtbWFjb3MvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLXBtYWMuYy5vICJ7b30ieGNvZmZsaW5rLmMubycKLQlTZXQgZGVmdmVjIHBtYWNfeGNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZwbWFjX3hjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfcG1hY194Y29mZl92ZWMnCi0JU2V0IHNlbGFyY2hzICImYmZkX3Bvd2VycGNfYXJjaCIKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvaTM4Ni1cT3B0aW9uLXgtZ28zMi8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtaTM4Ni5jLm8nCi0JU2V0IGRlZnZlYyBpMzg2Y29mZl92ZWMKLQlTZXQgc2VsdmVjcyAnJmkzODZjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfaTM4NmNvZmZfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLW1pcHMuYy5vICJ7b30iZWNvZmYuYy5vICJ7b30iZWNvZmZsaW5rLmMubyAie299ImVsZjMyLmMubyAie299ImVsZjMyLW1pcHMuYy5vICJ7b30iZWxmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBlY29mZl9iaWdfdmVjCi0JU2V0IHNlbHZlY3MgJyZlY29mZl9iaWdfdmVjLCZlY29mZl9saXR0bGVfdmVjLCZiZmRfZWxmMzJfYmlnbWlwc192ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX2Vjb2ZmX2JpZ192ZWMgLWQgSEFWRV9lY29mZl9saXR0bGVfdmVjIC1kIEhBVkVfYmZkX2VsZjMyX2JpZ21pcHNfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1cT3B0aW9uLXgtaG1zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1zaC5jLm8gIntvfSJjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBzaGNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZzaGNvZmZfdmVjLCZzaGxjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfc2hjb2ZmX3ZlYyAtZCBIQVZFX3NobGNvZmZfdmVjJwotRW5kIElmCi0KLVNldCB0YSBgZWNobyB7c2VsYXJjaHN9IHwgc2VkIC1lICdzLyZiZmRfL3tvfWNwdS0vZycgLWUgJ3MvX2FyY2gvLmMuby9nJ2AKLQotU2V0IHRkZWZhdWx0cyAiLWQgREVGQVVMVF9WRUNUT1I9e2RlZnZlY30gLWQgU0VMRUNUX1ZFQ1M9e3NlbHZlY3N9IC1kIFNFTEVDVF9BUkNISVRFQ1RVUkVTPXtzZWxhcmNoc30ge2hhdmV2ZWNzfSIKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICdXT1JEU0laRSA9IDMyJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ0JGRF9NQUNISU5FUyA9ICcge3RhfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnQkZEX0JBQ0tFTkRTID0gJyB7QkZEX0JBQ0tFTkRTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdUREVGQVVMVFMgPSAnIHt0ZGVmYXVsdHN9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdIREVQRklMRVMgPSAnCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnVERFUEZJTEVTID0gJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCQk+PiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCi0KLSMgV2UgY2FuIG9ubHkgaGFuZGxlIDMyLWJpdCB0YXJnZXRzIHJpZ2h0IG5vdy4KLQotc2VkIC1lICdzL0BXT1JEU0laRUAvMzIvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9Ad29yZHNpemVALzMyLycgXE9wdGlvbi1kCi0gICAgLWUgInMvQFZFUlNJT05AL2BDYXRlbmF0ZSB7c3JjZGlyfVZFUlNJT05gLyIgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQC8wLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0X0JJVEAvLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUX1VfNjRfQklUQC8vJyBcT3B0aW9uLWQKLSAgICAtZSAncy9AQkZEX0hPU1RfNjRCSVRfTE9OR0AvMC8nIFxPcHRpb24tZAotICAgICJ7c3JjZGlyfSJiZmQtaW4yLmggPiJ7b30iYmZkLmgtbmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImJmZC5oLW5ldyAie299ImJmZC5oCi0KLXNlZCAtZSAncy9OTi8zMi9nJyAie3NyY2Rpcn0iZWxmeHgtdGFyZ2V0LmggPiJ7b30iZWxmMzItdGFyZ2V0LmgtbmV3Ci1Nb3ZlSWZDaGFuZ2UgIntvfSJlbGYzMi10YXJnZXQuaC1uZXcgIntvfSJlbGYzMi10YXJnZXQuaAotCi0jIFByZS1leHBhbmQgc29tZSBtYWNyb3MgaW4gY29mZnN3YXAuaCwgc28gTVBXIEMgZG9lc24ndCBjaG9rZS4KLQotc2VkIC1lICdzL14gIFBVVF9BT1VUSERSX1RTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0RTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0JTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0VOVFJZICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgKC8gIGJmZF9oX3B1dF8zMiAoLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvXiAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAie3NyY2Rpcn0iY29mZnN3YXAuaCA+IntvfSJjb2Zmc3dhcC5oLW5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb2Zmc3dhcC5oLW5ldyAie299ImNvZmZzd2FwLmgKZGlmZiAtLWdpdCBhL2JmZC9tcHctbWFrZS5zZWQgYi9iZmQvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ2M2M3Li4wMDAwMDAwCi0tLSBhL2JmZC9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIFVuaXggQkZEIE1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQotIyBXaGFjayBvdXQgdW51c2VkIGhvc3QgYW5kIHRhcmdldCBkZWZpbmUgYml0cy4KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotL1RERUZJTkVTL3MvQFRERUZJTkVTQC8vCi0KLSMgRml4IHBhdGhuYW1lcyB0byBpbmNsdWRlIGRpcmVjdG9yaWVzLgotL15JTkNESVIgPSAvcy9eSU5DRElSID0gLiokL0lOQ0RJUiA9ICJ7dG9wc3JjZGlyfSJpbmNsdWRlLwotL15DU0VBUkNIID0gL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLSMgQ29tbWVudCBvdXQgc2V0dGluZyBvZiB2YXJzLCBjb25maWd1cmUgc2NyaXB0IHdpbGwgYWRkIHRoZXNlIGl0c2VsZi4KLS9eV09SRFNJWkUgPS9zL14vIy8KLSMgL15BTExfQkFDS0VORFMvcy9eLyMvCi0vXkJGRF9CQUNLRU5EUy9zL14vIy8KLS9eQkZEX01BQ0hJTkVTL3MvXi8jLwotL15UREVGQVVMVFMvcy9eLyMvCi0KLSMgUmVtb3ZlIGV4dHJhLCB1c2VsZXNzLCAiYWxsIi4KLS9eYWxsIFxcT3B0aW9uLWYgX29sZGVzdC8sL14kL2QKLQotIyBSZW1vdmUgdGhlIE1ha2VmaWxlIHJlYnVpbGQgcnVsZS4KLS9eTWFrZWZpbGUgLywvLS1yZWNoZWNrL2QKLQotIyBEb24ndCBkbyBhbnkgcmVjdXJzaXZlIHN1YmRpciBzdHVmZi4KLS8gc3ViZGlyX2RvL3Mve01BS0V9L251bGwtY29tbWFuZC8KLQotL0JGRF9IL3MvXntCRkRfSH0vI3tCRkRfSH0vCi0KLSMgQWRkIGV4cGxpY2l0IHNyY2RpciBwYXRocyB0byBzcGVjaWFsIGZpbGVzLgotL2NvbmZpZy5iZmQvcy8gY29uZmlnLmJmZC8gIntzfSJjb25maWcuYmZkL2cKLS90YXJnbWF0Y2guc2VkL3MvIHRhcmdtYXRjaC5zZWQvICJ7c30idGFyZ21hdGNoLnNlZC9nCi0KLSMgUG9pbnQgYXQgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW4gdGhlIG9iamRpci4KLS9iZmQvcy8ie3N9ImJmZFwuaC8ie299ImJmZC5oL2cKLS9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS90YXJnbWF0Y2gvcy8ie3N9InRhcmdtYXRjaFwuaC8ie299InRhcmdtYXRjaC5oL2cKLS90YXJnbWF0Y2gvcy9edGFyZ21hdGNoXC5oLyJ7b30idGFyZ21hdGNoLmgvCi0vZWxmMzItdGFyZ2V0L3MvIntzfSJlbGYzMi10YXJnZXRcLmgvIntvfSJlbGYzMi10YXJnZXQuaC9nCi0vZWxmMzItdGFyZ2V0L3MvXmVsZjMyLXRhcmdldFwuaC8ie299ImVsZjMyLXRhcmdldC5oLwotL2VsZjY0LXRhcmdldC9zLyJ7c30iZWxmNjQtdGFyZ2V0XC5oLyJ7b30iZWxmNjQtdGFyZ2V0LmgvZwotL2VsZjY0LXRhcmdldC9zL15lbGY2NC10YXJnZXRcLmgvIntvfSJlbGY2NC10YXJnZXQuaC8KLQotLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZwotCi0vZGVwL3MvXC5kZXAvX19kZXAvZwotCi0jIFJlbW92aW5nIGR1cGxpY2F0ZXMgaXMgY29vbCBidXQgcHJlc2VudGx5IHVubmVjZXNzYXJ5LAotIyBzbyB3aGFjayB0aGlzIG91dC4KLS9eb2ZpbGVzIFxcT3B0aW9uLWYvLC9eJC9kCi0vb2ZpbGVzL3Mve09GSUxFU30gb2ZpbGVzL3tPRklMRVN9LwotL2VjaG8gb2ZpbGVzID0gL2QKLS9jYXQgb2ZpbGVzL3MvYGNhdCBvZmlsZXNgL3tPRklMRVN9LwotCi0jIE5vIGNvcmVmaWxlIHN1cHBvcnQuCi0vQ09SRUZJTEUvcy9AQ09SRUZJTEVALy8KLS9DT1JFRkxBRy9zL0BDT1JFRkxBR0AvLwotCi0jIE5vIFBJQyBmb29sZXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCi0vQEFMTExJQlNAL3MvQEFMTExJQlNAL3tUQVJHRVRMSUJ9LwotL0BQSUNMSVNUQC9zL0BQSUNMSVNUQC8vCi0vQFBJQ0ZMQUdAL3MvQFBJQ0ZMQUdALy8KLS9ee09GSUxFU30gXFxPcHRpb24tZiBzdGFtcC1waWNkaXIvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBwaWMgdHJpY2tlcnkgZnJvbSB0aGUgZGVmYXVsdCBidWlsZCBydWxlLgotL15cLmNcLm8gXFxPcHRpb24tZiAvLC9FbmQgSWYvY1wKLS5jLm8gXFxPcHRpb24tZiAuYwotCi0jIE1QVyBNYWtlIGRvZXNuJ3Qga25vdyBhYm91dCAkPC4KLS8ie299InRhcmdldHMuYy5vIFxcT3B0aW9uLWYgIntzfSJ0YXJnZXRzLmMgTWFrZWZpbGUvLC9eJC9jXAotIntvfSJ0YXJnZXRzLmMubyBcXE9wdGlvbi1mICJ7c30idGFyZ2V0cy5jIE1ha2VmaWxlXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7QUxMX0NGTEFHU30ge1RERUZBVUxUU30gIntzfSJ0YXJnZXRzLmMgLW8gIntvfSJ0YXJnZXRzLmMubwotCi0vIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGUvLC9eJC9jXAotIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGVcCi0Je0NDfSBAREFTSF9DX0ZMQUdAIHtBTExfQ0ZMQUdTfSB7VERFRkFVTFRTfSAie3N9ImFyY2h1cmVzLmMgLW8gIntvfSJhcmNodXJlcy5jLm8KLQotIyBSZW1vdmUgdGhlIC5oIHJlYnVpbGRpbmcgcnVsZXMsIHdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgZG9jIHN1YmRpciwKLSMgb3IgYSB3YXkgdG8gYnVpbGQgdGhlIHByb3RvdHlwZS1oYWNraW5nIHRvb2wgdGhhdCdzIGluIGl0LgotL14ie3NyY2Rpcn0iYmZkLWluMi5oIFxcT3B0aW9uLWYgLywvXiQvZAotL14ie3NyY2Rpcn0ibGliYmZkLmggXFxPcHRpb24tZiAvLC9eJC9kCi0vXiJ7c3JjZGlyfSJsaWJjb2ZmLmggXFxPcHRpb24tZiAvLC9eJC9kCmRpZmYgLS1naXQgYS9iZmQvbmV0YnNkLWNvcmUuYyBiL2JmZC9uZXRic2QtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWIxODRkLi4wMDAwMDAwCi0tLSBhL2JmZC9uZXRic2QtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgTmV0QlNEIHN0eWxlIGNvcmUgZmlsZXMKLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBhdWwgS3JhbmVuYnVyZywgRVVSCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9jb3JlLmg+Ci0KLS8qCi0gKiBGSVhNRTogT24gTmV0QlNEL3NwYXJjIENPUkVfRlBVX09GRlNFVCBzaG91bGQgYmUgKHNpemVvZihzdHJ1Y3QgdHJhcGZyYW1lKSkKLSAqLwotCi1zdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0IHsKLQlzdHJ1Y3QgY29yZSBjb3JlOwotfSAqcmF3cHRyOwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCW5ldGJzZF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjaGFyICoJCW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCAJCW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbgkJbmV0YnNkX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCQlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSGFuZGxlIE5ldEJTRC1zdHlsZSBjb3JlIGR1bXAgZmlsZS4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1uZXRic2RfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLQotewotCWludAkJaSwgdmFsLCBvZmZzZXQ7Ci0JYXNlY3Rpb24JKmFzZWN0LCAqYXNlY3QyOwotCXN0cnVjdCBjb3JlCWNvcmU7Ci0Jc3RydWN0IGNvcmVzZWcJY29yZXNlZzsKLQotCXZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZjb3JlLCAxLCBzaXplb2YgY29yZSwgYWJmZCk7Ci0JaWYgKHZhbCAhPSBzaXplb2YgY29yZSkgewotCQkvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKENPUkVfR0VUTUFHSUMoY29yZSkgIT0gQ09SRU1BR0lDKSB7Ci0JCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJhd3B0ciA9IChzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCkpOwotCWlmIChyYXdwdHIgPT0gTlVMTCkgewotCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYXdwdHItPmNvcmUgPSBjb3JlOwotCWFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLQlvZmZzZXQgPSBjb3JlLmNfaGRyc2l6ZTsKLQlmb3IgKGkgPSAwOyBpIDwgY29yZS5jX25zZWc7IGkrKykgewotCi0JCWlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkJCWdvdG8gcHVudDsKLQotCQl2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmY29yZXNlZywgMSwgc2l6ZW9mIGNvcmVzZWcsIGFiZmQpOwotCQlpZiAodmFsICE9IHNpemVvZiBjb3Jlc2VnKSB7Ci0JCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JCQlnb3RvIHB1bnQ7Ci0JCX0KLQkJaWYgKENPUkVfR0VUTUFHSUMoY29yZXNlZykgIT0gQ09SRVNFR01BR0lDKSB7Ci0JCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQkJZ290byBwdW50OwotCQl9Ci0KLQkJb2Zmc2V0ICs9IGNvcmUuY19zZWdoZHJzaXplOwotCi0JCWFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZihhc2VjdGlvbikpOwotCQlpZiAoYXNlY3QgPT0gTlVMTCkgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJCWdvdG8gcHVudDsKLQkJfQotCi0JCWFzZWN0LT5fcmF3X3NpemUgPSBjb3Jlc2VnLmNfc2l6ZTsKLQkJYXNlY3QtPnZtYSA9IGNvcmVzZWcuY19hZGRyOwotCQlhc2VjdC0+ZmlsZXBvcyA9IG9mZnNldDsKLQkJYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JCWFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0JCWFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0JCWFiZmQtPnNlY3Rpb25fY291bnQrKzsKLQkJb2Zmc2V0ICs9IGNvcmVzZWcuY19zaXplOwotCi0JCXN3aXRjaCAoQ09SRV9HRVRGTEFHKGNvcmVzZWcpKSB7Ci0JCWNhc2UgQ09SRV9DUFU6Ci0JCQlhc2VjdC0+bmFtZSA9ICIucmVnIjsKLQkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFM7Ci0jaWZkZWYgQ09SRV9GUFVfT0ZGU0VUCi0JCQkvKiBIYWNraXNoLi4uICovCi0JCQlhc2VjdC0+X3Jhd19zaXplID0gQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyID0gKGFzZWN0aW9uICopYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJCQkgc2l6ZW9mIChhc2VjdGlvbikpOwotCQkJaWYgKGFzZWN0MiA9PSBOVUxMKSB7Ci0JCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJCQlnb3RvIHB1bnQ7Ci0JCQl9Ci0JCQlhc2VjdDItPl9yYXdfc2l6ZSA9IGNvcmVzZWcuY19zaXplIC0gQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyLT52bWEgPSAwOwotCQkJYXNlY3QyLT5maWxlcG9zID0gYXNlY3QtPmZpbGVwb3MgKyBDT1JFX0ZQVV9PRkZTRVQ7Ci0JCQlhc2VjdDItPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JCQlhc2VjdDItPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKLQkJCWFzZWN0Mi0+bmFtZSA9ICIucmVnMiI7Ci0JCQlhc2VjdDItPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUzsKLQkJCWFiZmQtPnNlY3Rpb25zID0gYXNlY3QyOwotCQkJYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotI2VuZGlmCi0KLQkJCWJyZWFrOwotCQljYXNlIENPUkVfREFUQToKLQkJCWFzZWN0LT5uYW1lID0gIi5kYXRhIjsKLQkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQytTRUNfTE9BRCtTRUNfSEFTX0NPTlRFTlRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09SRV9TVEFDSzoKLQkJCWFzZWN0LT5uYW1lID0gIi5zdGFjayI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0JcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLXB1bnQ6CXsKLQkJYXNlY3Rpb24JKmFuZXh0OwotCQlmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFuZXh0KSB7Ci0JCQlhbmV4dCA9IGFzZWN0LT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKWFzZWN0KTsKLQkJfQotCX0KLQlmcmVlICgodm9pZCAqKXJhd3B0cik7Ci0JYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YSA9IE5VTEw7Ci0JYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotCWFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhcioKLW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotCWJmZCAqYWJmZDsKLXsKLSAvKnJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOyovCi0gIHJldHVybiBhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhLT5jb3JlLmNfbmFtZTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0JYmZkICphYmZkOwotewotICAvKnJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ki8KLSAgcmV0dXJuIGFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEtPmNvcmUuY19zaWdubzsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1uZXRic2RfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgbmV0YnNkX2NvcmVfdmVjID0KLSAgewotICAgICJuZXRic2QtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIG5ldGJzZF9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChuZXRic2QpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9uZXRic2QuaCBiL2JmZC9uZXRic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0ODJmMC4uMDAwMDAwMAotLS0gYS9iZmQvbmV0YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsIE5ldEJTRCB0YXJnZXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotVVNBLiAgKi8KLQotLyogQ2hlY2sgZm9yIG91ciBtYWNoaW5lIHR5cGUgKHBhcnQgb2YgbWFnaWMgbnVtYmVyKS4gKi8KLSNpZm5kZWYgTUFDSFRZUEVfT0sKLSNkZWZpbmUgTUFDSFRZUEVfT0sobSkgKChtKSA9PSBERUZBVUxUX01JRCB8fCAobSkgPT0gTV9VTktOT1dOKQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIG5vcm1hbCBsb2FkIGFkZHJlc3MgZm9yIGV4ZWN1dGFibGVzLiAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJCVRBUkdFVF9QQUdFX1NJWkUKLQotLyogTmV0QlNEIFpNQUdJQyBoYXMgaXRzIGhlYWRlciBpbiB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxCi0KLS8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkgdXNpbmcgdGhlIGZsYWdzLiAqLwotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgCShOX0RZTkFNSUMoeCkpCi0KLS8qIFdlIGhhdmUgNiBiaXRzIG9mIGZsYWdzIGFuZCAxMCBiaXRzIG9mIG1hY2hpbmUgSUQuICAqLwotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpIFwKLQkoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweDAzZmYpKQotI2RlZmluZSBOX0ZMQUdTKGV4ZWMpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKLQotI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKLQkgfCAoKChpbnQpKHR5cGUpICYgMHgzZmYpIDw8IDE2KSBcCi0JIHwgKCgoZmxhZ3MpICYgMHgzZikgPDwgMjQpKQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotCSgoZXhlYykuYV9pbmZvID0gXAotICAgICAgICAgKChleGVjKS5hX2luZm8gJiAweGZiMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHgzZmYpIDw8IDE2KSkKLSNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLQkgKChleGVjKS5hX2luZm8gJiAweDAzZmZmZmZmKSB8ICgoZmxhZ3MgJiAweDAzZikgPDwgMjYpKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0vKiBPbiBOZXRCU0QsIHRoZSBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGluIG50b2hsJ3MgIm5ldHdvcmsiIChiaWctZW5kaWFuKQotICAgZm9ybWF0LiAgKi8KLSNkZWZpbmUgU1dBUF9NQUdJQyhleHQpIGJmZF9nZXRiMzIgKGV4dCkKLQotLyogT24gTmV0QlNELCB0aGUgZW50cnkgcG9pbnQgbWF5IGJlIHRha2VuIHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAxCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogV2UgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCB0aGUgbWFnaWMgbnVtYmVyIGhhcyBiZWVuIHNldC4gIFRoaXMKLSAgICAgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gZG9uZSBieSBzZXRfc2VjdGlvbl9jb250ZW50cywgYnV0IG9ubHkgaWYKLSAgICAgdGhlcmUgYWN0dWFsbHkgYXJlIHNvbWUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0gICAgICBmaWxlX3B0ciB0ZXh0X2VuZDsKLQotICAgICAgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7Ci0gICAgfQotCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBERUZBVUxUX0FSQ0g6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBERUZBVUxUX01JRCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogVGhlIE5ldEJTRCBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGJpZy1lbmRpYW4gKi8KLSNpZm5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICAvKiBYWFggYXJlbid0IHRoZXJlIGFueSBtYWNybyB0byBjaGFuZ2UgYnl0ZW9yZGVyIG9mIGEgd29yZCBpbmRlcGVuZGVudCBvZgotICAgICB0aGUgaG9zdCdzIG9yIHRhcmdldCdzIGVuZGlhbmVzc2VzPyAgKi8KLSAgZXhlY3AtPmFfaW5mbwotICAgID0gKGV4ZWNwLT5hX2luZm8gJiAweGZmKSA8PCAyNCB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwKSA8PCA4Ci0gICAgICB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwMDApID4+IDggfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMDAwMDApID4+IDI0OwotI2VuZGlmCi0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmV3c29zMy5jIGIvYmZkL25ld3NvczMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjN2E3NS4uMDAwMDAwMAotLS0gYS9iZmQvbmV3c29zMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXdzT1MzIChTb255LCA2OGspIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTVkoT1ApIENBVChuZXdzb3MzXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbmV3c29zMyIKLSNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgd2hlbiBjb21waWxlZCB3aXRoIC1XYWxsLiAqLwotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtLXRhcmdldC5oIGIvYmZkL25sbS10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxZDQ3ZC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtLXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qIFRhcmdldCBkZWZpbml0aW9ucyBmb3IgMzIvNjQtYml0IE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIG5sbV9jb3JlX2ZpbGVfcCBfYmZkX2R1bW15X3RhcmdldAotCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIG5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2dldF9zeW10YWIgbmxtTkFNRShnZXRfc3ltdGFiKQotI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wgbmxtTkFNRShtYWtlX2VtcHR5X3N5bWJvbCkKLSNkZWZpbmUgbmxtX3ByaW50X3N5bWJvbCBubG1OQU1FKHByaW50X3N5bWJvbCkKLSNkZWZpbmUgbmxtX2dldF9zeW1ib2xfaW5mbyBubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgbmxtX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgbmxtX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBubG1fZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgbmxtX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgbmxtX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgbmxtX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9jYW5vbmljYWxpemVfcmVsb2MgbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIG5sbV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBubG1fc2V0X3NlY3Rpb25fY29udGVudHMgbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLQotI2RlZmluZSBubG1fc2l6ZW9mX2hlYWRlcnMgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgbmxtX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbmxtX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgbmxtX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBubG1fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgbmxtX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG5sbV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBubG1fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYSB0YXJnZXQuCi0gICBJdCBpbmNsdWRlcyB0aGluZ3MgbGlrZSBpdHMgYnl0ZSBvcmRlciwgbmFtZSwgd2hhdCByb3V0aW5lcyB0byBjYWxsCi0gICB0byBkbyB2YXJpb3VzIG9wZXJhdGlvbnMsIGV0Yy4gIEV2ZXJ5IEJGRCBwb2ludHMgdG8gYSB0YXJnZXQgc3RydWN0dXJlCi0gICB3aXRoIGl0cyAieHZlYyIgbWVtYmVyLgotCi0gICBUaGVyZSBhcmUgdHdvIHN1Y2ggc3RydWN0dXJlcyBoZXJlOiAgb25lIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzIGFuZAotICAgb25lIGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLiAgICovCi0KLQotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9CSUdfU1lNID0KLXsKLSAgLyogbmFtZTogaWRlbnRpZnkga2luZCBvZiB0YXJnZXQgKi8KLSAgVEFSR0VUX0JJR19OQU1FLAotCi0gIC8qIGZsYXZvdXI6IGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCBmaWxlICovCi0gIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCi0KLSAgLyogYnl0ZW9yZGVyOiBkYXRhIGlzIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogaGVhZGVyX2J5dGVvcmRlcjogaGVhZGVyIGlzIGFsc28gYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBvYmplY3RfZmxhZ3M6IG1hc2sgb2YgYWxsIGZpbGUgZmxhZ3MgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFMKLSAgIHwgV1BfVEVYVCksCi0gIAotICAvKiBzZWN0aW9uX2ZsYWdzOiBtYXNrIG9mIGFsbCBzZWN0aW9uIGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfUkVBRE9OTFkgfAotICAgU0VDX0NPREUgfCBTRUNfREFUQSksIAotCi0gICAvKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICAgICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgIDAsCi0KLSAgLyogYXJfcGFkX2NoYXI6IHBhZCBjaGFyYWN0ZXIgZm9yIGZpbGVuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQvb3Igb3MgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUgKi8KLSAgJy8nLAotCi0gIC8qIGFyX21heF9uYW1lbGVuOiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUuICBUaGlzIHZhbHVlIGlzCi0gICAgIGEgV0FHICh3aWxkIGEqKiBndWVzcykgKi8KLSAgMTUsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZGF0YSBzZWN0aW9ucyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBmaWxlIGhlYWRlcnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogYmZkX2NoZWNrX2Zvcm1hdDogY2hlY2sgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgcmVhZCAqLwotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICBubG1OQU1FKG9iamVjdF9wKSwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBubG1fY29yZV9maWxlX3AJCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIG5sbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIGJmZF93cml0ZV9jb250ZW50czogd3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICAvKiBJbml0aWFsaXplIGEganVtcCB0YWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBtYWNyby4gIEFsbCBuYW1lcyBzdGFydCB3aXRoCi0gICAgICJubG0iICovCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSBUQVJHRVRfQkFDS0VORF9EQVRBCi19OwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9MSVRUTEVfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGxpdHRsZSBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTCi0gICB8IFdQX1RFWFQpLAotICAKLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19EQVRBKSwgCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICAgMCwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNSwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIG5sbU5BTUUob2JqZWN0X3ApLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLwotICAgIG5sbV9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cyksCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIEluaXRpYWxpemUgYSBqdW1wIHRhYmxlIHdpdGggdGhlIHN0YW5kYXJkIG1hY3JvLiAgQWxsIG5hbWVzIHN0YXJ0IHdpdGgKLSAgICAgIm5sbSIgKi8KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAvKiBiYWNrZW5kX2RhdGE6ICovCi0gIChQVFIpIFRBUkdFVF9CQUNLRU5EX0RBVEEKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9ubG0uYyBiL2JmZC9ubG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljNmJhYS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLS8qIE1ha2UgYW4gTkxNIG9iamVjdC4gIFdlIGp1c3QgbmVlZCB0byBhbGxvY2F0ZSB0aGUgYmFja2VuZAotICAgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1ubG1fbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG5sbV90ZGF0YSAoYWJmZCkgPQotICAgIChzdHJ1Y3QgbmxtX29ial90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBubG1fb2JqX3RkYXRhKSk7Ci0gIGlmIChubG1fdGRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgaWYgKG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCksCi0JCQkgICAgICAgbmxtX21hY2hpbmUgKGFiZmQpKTsKLQotICAvKiBzaW5jZSBldmVyeXRoaW5nIGlzIGRvbmUgYXQgY2xvc2UgdGltZSwgZG8gd2UgbmVlZCBhbnkgaW5pdGlhbGl6YXRpb24/ICovCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGZvciBhbiBOTE0gb2JqZWN0LiAgKi8KLQotYm9vbGVhbgotbmxtX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotICByZXR1cm4gYXJjaCA9PSBubG1fYXJjaGl0ZWN0dXJlIChhYmZkKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1hbHBoYS5jIGIvYmZkL25sbTMyLWFscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzhlNTEuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTIgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgMzItYml0IEFscGhhIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIDMyIGJpdCBBbHBoYSBOTE0gZm9ybWF0LiAgWW91IG1pZ2h0IHRoaW5rCi0gICB0aGF0IGFuIEFscGhhIGNoaXAgd291bGQgdXNlIGEgNjQgYml0IGZvcm1hdCwgYnV0LCBmb3Igc29tZSByZWFzb24sCi0gICBpdCBkb2Vzbid0LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL2FscGhhLWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX2FscGhhX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgotCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfcHJlZml4Ci0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3JlYWRfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9zZXRfcHVibGljX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBiZmRfdm1hIG5sbV9hbHBoYV9nZXRfcHVibGljX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotDAotLyogQWxwaGEgTkxNJ3MgaGF2ZSBhIHByZWZpeCBoZWFkZXIgYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0uICBUaGlzCi0gICBmdW5jdGlvbiByZWFkcyBpdCBpbiwgdmVyaWZpZXMgdGhlIHZlcnNpb24sIGFuZCBzZWVrcyB0aGUgYmZkIHRvCi0gICB0aGUgbG9jYXRpb24gYmVmb3JlIHRoZSByZWd1bGFyIE5MTSBoZWFkZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX2JhY2tlbmRfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnMsIHNpemVvZiBzLCAxLCBhYmZkKSAhPSBzaXplb2YgcykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgcy5tYWdpYykgIT0gTkxNMzJfQUxQSEFfTUFHSUMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZJWE1FOiBTaG91bGQgd2UgY2hlY2sgdGhlIGZvcm1hdCBudW1iZXI/ICAqLwotCi0gIC8qIFNraXAgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVyLiAgKi8KLSAgc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcy5zaXplKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzaXplLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcHJlZml4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV93cml0ZV9wcmVmaXggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKLQotICBtZW1zZXQgKCZzLCAwLCBzaXplb2Ygcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIE5MTTMyX0FMUEhBX01BR0lDLCBzLm1hZ2ljKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgMiwgcy5mb3JtYXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzaXplb2Ygcywgcy5zaXplKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnMsIHNpemVvZiBzLCAxLCBhYmZkKSAhPSBzaXplb2YgcykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2MgdHlwZXMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG0zMl9hbHBoYV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQgYnkgaXRzZWxmLiAgSG93ZXZlciwgaXQgYXBwZWFycyBhZnRlciBhCi0gICAgIEdQRElTUCByZWxvYyB0byBpZGVudGlmeSB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGxvdyBvcmRlciAxNiBiaXRzCi0gICAgIG9mIHRoZSBncCByZWdpc3RlciBhcmUgbG9hZGVkLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfSUdOT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJR05PUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRkxPTkcsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGUVVBRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQCi0gICAgIHJlZ2lzdGVyLiAgVGhlIG9mZnNldCBpcyAxNiBiaXRzIG9mIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICBUaGlzCi0gICAgIHJlbG9jIGFsd2F5cyBzZWVtcyB0byBiZSBhZ2FpbnN0IHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElURVJBTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIExJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBJdCBzZWVtcyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0gICAgIHVzZSB0aGlzIHRvIGVsaW1pbmF0ZSBhIHBvcnRpb24gb2YgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc3ltYm9sCi0gICAgIGluZGV4IGlzIHNwZWNpYWw6IDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZQotICAgICByZWdpc3RlciBvZiBhIG1lbW9yeSBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwKLSAgICAgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZSBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbgotICAgICBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQKLSAgICAgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueQotICAgICByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElUVVNFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElUVVNFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb2FkIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgaXMgYWx3YXlzIHVzZWQgZm9yIGEgbGRhaCBpbnN0cnVjdGlvbgotICAgICB3aGljaCBsb2FkcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgZ3AgcmVnaXN0ZXIuICBUaGUgbmV4dCByZWxvYwotICAgICB3aWxsIGJlIGFuIElHTk9SRSByZWxvYyB3aGljaCBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGRhCi0gICAgIGluc3RydWN0aW9uIHdoaWNoIGxvYWRzIHRoZSBsb3dlciAxNiBiaXRzLiAgVGhlIHN5bWJvbCBpbmRleCBvZgotICAgICB0aGUgR1BESVNQIGluc3RydWN0aW9uIGFwcGVhcnMgdG8gYWN0dWFsbHkgYmUgdGhlIG51bWJlciBvZiBieXRlcwotICAgICBiZXR3ZWVuIHRoZSBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBnaXZlcyB0d28gZGlmZmVyZW50Ci0gICAgIHdheXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaXM7IEkgZG9uJ3Qga25vdyB3aHkKLSAgICAgYm90aCBhcmUgdXNlZC4gIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByZWxvY2F0aW9uIGlzIHRoZQotICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdQIHZhbHVlIGFuZCB0aGUgY3VycmVudCBsb2NhdGlvbjsgdGhlCi0gICAgIGxvYWQgd2lsbCBhbHdheXMgYmUgZG9uZSBhZ2FpbnN0IGEgcmVnaXN0ZXIgaG9sZGluZyB0aGUgY3VycmVudAotICAgICBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BESVNQLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BESVNQIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyMSBiaXQgYnJhbmNoLiAgVGhlIG5hdGl2ZSBhc3NlbWJsZXIgZ2VuZXJhdGVzIHRoZXNlIGZvcgotICAgICBicmFuY2hlcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYW5kIGFsc28gZmlsbHMgaW4gdGhlIFBDCi0gICAgIHJlbGF0aXZlIG9mZnNldCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBJdCBzZWVtcyB0byBtZSB0aGF0IHRoaXMKLSAgICAgcmVsb2MsIHVubGlrZSB0aGUgb3RoZXJzLCBpcyBub3QgcGFydGlhbF9pbnBsYWNlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfQlJBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkJSQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChBTFBIQV9SX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSElOVCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMNjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KLSAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9TVE9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFNVQiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHJlbG9jYXRpb24gc3RhY2sgcmlnaHQgYnkgdGhlCi0gICAgIGdpdmVuIHZhbHVlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFJTSElGVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFkanVzdCB0aGUgR1AgdmFsdWUgZm9yIGEgbmV3IHJhbmdlIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQVkFMVUUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQVkFMVUUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfYWxwaGFfbndfaG93dG8gPQotICBIT1dUTyAoQUxQSEFfUl9OV19SRUxPQywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTldfUkVMT0MiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBSZWFkIGFuIEFscGhhIE5MTSByZWxvYy4gIFRoaXMgcm91dGluZSBrZWVwcyBzb21lIHN0YXRpYyBkYXRhIHdoaWNoCi0gICBpdCB1c2VzIHdoZW4gaGFuZGxpbmcgbG9jYWwgcmVsb2NzLiAgVGhpcyBvbmx5IHdvcmtzIGNvcnJlY3RseQotICAgYmVjYXVzZSBhbGwgdGhlIGxvY2FsIHJlbG9jcyBhcmUgcmVhZCBhdCBvbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgc3RhdGljIGJmZF92bWEgZ3BfdmFsdWU7Ci0gIHN0YXRpYyBiZmRfdm1hIGxpdGFfYWRkcmVzczsKLSAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3JlbG9jIGV4dDsKLSAgYmZkX3ZtYSByX3ZhZGRyOwotICBsb25nIHJfc3ltbmR4OwotICBpbnQgcl90eXBlLCByX2V4dGVybiwgcl9vZmZzZXQsIHJfc2l6ZTsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7Ci0KLSAgLyogUmVhZCB0aGUgcmVsb2MgZnJvbSB0aGUgZmlsZS4gICovCi0gIGlmIChiZmRfcmVhZCAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3dhcCBpbiB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotICByX3ZhZGRyID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LnJfdmFkZHIpOwotICByX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC5yX3N5bW5keCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKLQotICByX3R5cGUgPSAoKGV4dC5yX2JpdHNbMF0gJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSkKLQkgICAgPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICByX2V4dGVybiA9IChleHQucl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgcl9vZmZzZXQgPSAoKGV4dC5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCSAgICAgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOwotICAvKiBJZ25vcmUgdGhlIHJlc2VydmVkIGJpdHMuICAqLwotICByX3NpemUgPSAoKGV4dC5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSkKLQkgICAgPj4gUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpOwotCi0gIC8qIEZpbGwgaW4gdGhlIEJGRCBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKHJfZXh0ZXJuKQotICAgIHsKLSAgICAgIC8qIEV4dGVybmFsIHJlbG9jYXRpb25zIGFyZSBvbmx5IHVzZWQgZm9yIGltcG9ydHMuICAqLwotICAgICAgQkZEX0FTU0VSVCAoc3ltICE9IE5VTEwpOwotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgc3ltX3B0cl9wdHIgZm9yIHRoaXMgY2FzZS4gIEl0IGlzIHNldCBpbgotCSBubG1fY2Fub25pY2FsaXplX3JlbG9jLiAgKi8KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBOVUxMOwotICAgICAgcmVsLT5hZGRlbmQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEludGVybmFsIHJlbG9jYXRpb25zIGFyZSBvbmx5IHVzZWQgZm9yIGxvY2FsIHJlbG9jYXRpb24KLQkgZml4dXBzLiAgSWYgdGhleSBhcmUgbm90IE5XX1JFTE9DIG9yIEdQRElTUCBvciBJR05PUkUsIHRoZXkKLQkgbXVzdCBiZSBhZ2FpbnN0IC50ZXh0IG9yIC5kYXRhLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DIHx8IHN5bSA9PSBOVUxMKTsKLSAgICAgIGlmIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQwotCSAgfHwgcl90eXBlID09IEFMUEhBX1JfR1BESVNQCi0JICB8fCByX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUpCi0JewotCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfc3ltbmR4ID09IEFMUEhBX1JFTE9DX1NFQ1RJT05fVEVYVCkKLQl7Ci0JICByZWwtPnN5bV9wdHJfcHRyID0gY29kZV9zZWMtPnN5bWJvbF9wdHJfcHRyOwotCSAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY29kZV9zZWMpID09IDApOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfc3ltbmR4ID09IEFMUEhBX1JFTE9DX1NFQ1RJT05fREFUQSkKLQl7Ci0JICByZWwtPnN5bV9wdHJfcHRyID0gZGF0YV9zZWMtPnN5bWJvbF9wdHJfcHRyOwotCSAgcmVsLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGRhdGFfc2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoMCk7Ci0JICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBXZSB1c2UgdGhlIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlbG9jIGlzIGluIHRoZSAudGV4dAotICAgICBvciAuZGF0YSBzZWN0aW9uLiAgUl9OV19SRUxPQyByZWxvY3MgZG9uJ3QgcmVhbGx5IGhhdmUgYSBzZWN0aW9uLAotICAgICBzbyB3ZSBwdXQgdGhlbSBpbiAudGV4dC4gICovCi0gIGlmIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQwotICAgICAgfHwgcl92YWRkciA8IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKSkKLSAgICB7Ci0gICAgICAqc2VjcCA9IGNvZGVfc2VjOwotICAgICAgcmVsLT5hZGRyZXNzID0gcl92YWRkcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqc2VjcCA9IGRhdGFfc2VjOwotICAgICAgcmVsLT5hZGRyZXNzID0gcl92YWRkciAtIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKLSAgICB9Ci0KLSAgLyogV2UgbXVzdCBhZGp1c3QgdGhlIGFkZGVuZCBiYXNlZCBvbiB0aGUgdHlwZS4gICovCi0gIEJGRF9BU1NFUlQgKChyX3R5cGUgPj0gMCAmJiByX3R5cGUgPD0gQUxQSEFfUl9HUFZBTFVFKQotCSAgICAgIHx8IHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBBTFBIQV9SX0JSQUREUjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDE2OgotICAgIGNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUw2NDoKLSAgICAgIC8qIFRoZSBQQyByZWxhdGl2ZSByZWxvY3MgZG8gbm90IHNlZW0gdG8gdXNlIHRoZSBzZWN0aW9uIFZNQSBhcwotCSBhIG5lZ2F0aXZlIGFkZGVuZC4gICovCi0gICAgICByZWwtPmFkZGVuZCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFJFTDMyOgotICAgICAgLyogQ29weSB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgYWRkZW5kLCB0bwotCSBlbnN1cmUgdGhhdCB3ZSBhcmUgbm90IGNvbmZ1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotICAgICAgaWYgKCEgcl9leHRlcm4pCi0JcmVsLT5hZGRlbmQgKz0gZ3BfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9MSVRFUkFMOgotICAgICAgQkZEX0FTU0VSVCAoISByX2V4dGVybik7Ci0gICAgICByZWwtPmFkZGVuZCArPSBsaXRhX2FkZHJlc3M7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0gICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKLSAgICAgIC8qIFRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3MgZG8gbm90IHVzZSBhIHN5bWJvbCwgb3IgYW4KLQkgYWRkZW5kLCBidXQgdGhleSBkbyB1c2UgYSBzcGVjaWFsIGNvZGUuICBQdXQgdGhpcyBjb2RlIGluIHRoZQotCSBhZGRlbmQgZmllbGQuICAqLwotICAgICAgcmVsLT5hZGRlbmQgPSByX3N5bW5keDsKLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1NUT1JFOgotICAgICAgLyogVGhlIFNUT1JFIHJlbG9jIG5lZWRzIHRoZSBzaXplIGFuZCBvZmZzZXQgZmllbGRzLiAgV2Ugc3RvcmUKLQkgdGhlbSBpbiB0aGUgYWRkZW5kLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKHJfb2Zmc2V0IDwgMjU2ICYmIHJfc2l6ZSA8IDI1Nik7Ci0gICAgICByZWwtPmFkZGVuZCA9IChyX29mZnNldCA8PCA4KSArIHJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0gICAgICAvKiBUaGUgUFVTSCwgUFNVQiBhbmQgUFJTSElGVCByZWxvY3MgZG8gbm90IGFjdHVhbGx5IHVzZSBhbgotCSBhZGRyZXNzLiAgSSBiZWxpZXZlIHRoYXQgdGhlIGFkZHJlc3Mgc3VwcGxpZWQgaXMgcmVhbGx5IGFuCi0JIGFkZGVuZC4gICovCi0gICAgICByZWwtPmFkZGVuZCA9IHJfdmFkZHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFZBTFVFOgotICAgICAgLyogUmVjb3JkIHRoZSBuZXcgZ3AgdmFsdWUuICAqLwotICAgICAgZ3BfdmFsdWUgKz0gcl9zeW1uZHg7Ci0gICAgICByZWwtPmFkZGVuZCA9IGdwX3ZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgLyogSWYgdGhlIHR5cGUgaXMgQUxQSEFfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlCi0JIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICBGb3IKLQkgc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYyB0eXBlIGlzIG5vdCBhZGp1c3RlZCBieQotCSB0aGUgc2VjdGlvbiB2bWEuICBXZSByZWNvcmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlCi0JIGhlcmUsIGZvciBjb252ZW5pZW5jZSB3aGVuIGRvaW5nIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICByZWwtPmFkZHJlc3MgPSByX3ZhZGRyOwotICAgICAgcmVsLT5hZGRlbmQgPSBncF92YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX05XX1JFTE9DOgotICAgICAgLyogSWYgdGhpcyBpcyBTRVRHUCwgd2Ugc2V0IHRoZSBhZGRlbmQgdG8gMC4gIE90aGVyd2lzZSB3ZSBzZXQKLQkgdGhlIGFkZGVuZCB0byB0aGUgc2l6ZSBvZiB0aGUgLmxpdGEgc2VjdGlvbiAodGhpcyBpcwotCSByX3N5bW5keCkgcGx1cyAxLiAgV2UgaGF2ZSBhbHJlYWR5IHNldCB0aGUgYWRkcmVzcyBvZiB0aGUKLQkgcmVsb2MgdG8gcl92YWRkci4gICovCi0gICAgICBpZiAocl9zaXplID09IEFMUEhBX1JfTldfUkVMT0NfU0VUR1ApCi0JewotCSAgZ3BfdmFsdWUgPSByX3ZhZGRyOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfc2l6ZSA9PSBBTFBIQV9SX05XX1JFTE9DX0xJVEEpCi0JewotCSAgbGl0YV9hZGRyZXNzID0gcl92YWRkcjsKLQkgIHJlbC0+YWRkZW5kID0gcl9zeW1uZHggKyAxOwotCX0KLSAgICAgIGVsc2UKLQlCRkRfQVNTRVJUICgwKTsKLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAocl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MpCi0gICAgcmVsLT5ob3d0byA9ICZubG0zMl9hbHBoYV9ud19ob3d0bzsKLSAgZWxzZQotICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFuZ2xlIEFscGhhIE5MTSByZWxvY3MgZm9yIG91dHB1dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYW4gQUxQSEEgTkxNIGltcG9ydCByZWNvcmQgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLwotICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOwotICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOwotICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKLSAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKCFubG1fcmVsb2NzKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX2FscGhhX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCi0JCQkJJm5sbV9yZWxvY3MgLT4gcmVsb2MpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmxtX3JlbG9jcysrOwotICAgICAgc3ltIC0+IHJjbnQrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGFuIEFscGhhIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYmZkX3ZtYSByX3ZhZGRyOwotICBsb25nIHJfc3ltbmR4OwotICBpbnQgcl90eXBlLCByX2V4dGVybiwgcl9vZmZzZXQsIHJfc2l6ZTsKLSAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3JlbG9jIGV4dDsKLQotICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAvKiBHZXQgdmFsdWVzIGZvciB0aGUgcmVsb2NhdGlvbiBmaWVsZHMuICAqLwotICByX3R5cGUgPSByZWwtPmhvd3RvLT50eXBlOwotICBpZiAocl90eXBlICE9IEFMUEhBX1JfTldfUkVMT0MpCi0gICAgewotICAgICAgcl92YWRkciA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7Ci0gICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQlyX3ZhZGRyICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsCi0JCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJCQkgICAgICBOTE1fQ09ERV9OQU1FKSk7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXsKLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcl9leHRlcm4gPSAwOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSAmIFNFQ19DT0RFKQotCSAgICByX3N5bW5keCA9IEFMUEhBX1JFTE9DX1NFQ1RJT05fVEVYVDsKLQkgIGVsc2UKLQkgICAgcl9zeW1uZHggPSBBTFBIQV9SRUxPQ19TRUNUSU9OX0RBVEE7Ci0JfQotICAgICAgcl9vZmZzZXQgPSAwOwotICAgICAgcl9zaXplID0gMDsKLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0JY2FzZSBBTFBIQV9SX0dQRElTUDoKLQkgIHJfc3ltbmR4ID0gcmVsLT5hZGRlbmQ7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLQkgIHJfc2l6ZSA9IHJlbC0+YWRkZW5kICYgMHhmZjsKLQkgIHJfb2Zmc2V0ID0gKHJlbC0+YWRkZW5kID4+IDgpICYgMHhmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0JY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0JY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0JICByX3ZhZGRyID0gcmVsLT5hZGRlbmQ7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9JR05PUkU6Ci0JICByX3ZhZGRyID0gcmVsLT5hZGRyZXNzOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DICovCi0gICAgICByX3ZhZGRyID0gcmVsLT5hZGRyZXNzOwotICAgICAgaWYgKHJlbC0+YWRkZW5kID09IDApCi0JewotCSAgcl9zeW1uZHggPSAwOwotCSAgcl9zaXplID0gQUxQSEFfUl9OV19SRUxPQ19TRVRHUDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcl9zeW1uZHggPSByZWwtPmFkZGVuZCAtIDE7Ci0JICByX3NpemUgPSBBTFBIQV9SX05XX1JFTE9DX0xJVEE7Ci0JfQotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9vZmZzZXQgPSAwOwotICAgIH0KLQotICAvKiBTd2FwIG91dCB0aGUgcmVsb2NhdGlvbiBmaWVsZHMuICAqLwotICBiZmRfaF9wdXRfNjQgKGFiZmQsIHJfdmFkZHIsIChiZmRfYnl0ZSAqKSBleHQucl92YWRkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgcl9zeW1uZHgsIChiZmRfYnl0ZSAqKSBleHQucl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSk7Ci0KLSAgZXh0LnJfYml0c1swXSA9ICgocl90eXBlIDw8IFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFKQotCQkgICAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKTsKLSAgZXh0LnJfYml0c1sxXSA9ICgocl9leHRlcm4gPyBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFIDogMCkKLQkJICAgfCAoKHJfb2Zmc2V0IDw8IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpCi0JCSAgICAgICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkpOwotICBleHQucl9iaXRzWzJdID0gMDsKLSAgZXh0LnJfYml0c1szXSA9ICgocl9zaXplIDw8IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKQotCQkgICAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jYXRpb24uICAqLwotICBpZiAoYmZkX3dyaXRlICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEFscGhhIE5ldFdhcmUgZG9lcyBub3QgdXNlIHRoZSBoaWdoIGJpdCB0byBkZXRlcm1pbmUgd2hldGhlciBhCi0gICBwdWJsaWMgc3ltYm9sIGlzIGluIHRoZSBjb2RlIHNlZ21lbnQgb3IgdGhlIGRhdGEgc2VnbWVudC4gIEluc3RlYWQsCi0gICBpdCBqdXN0IHVzZXMgdGhlIGFkZHJlc3MuICBUaGUgc2V0X3B1YmxpY19zZWN0aW9uIGFuZAotICAgZ2V0X3B1YmxpY19vZmZzZXQgcm91dGluZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29kZSB3aGljaCB1c2VzIHRoZQotICAgaGlnaCBiaXQuICAqLwotCi0vKiBTZXQgdGhlIHNlY3Rpb24gZm9yIGEgcHVibGljIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfc2V0X3B1YmxpY19zZWN0aW9uIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7Ci0KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAoc3ltLT5zeW1ib2wudmFsdWUgPCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYykpCi0gICAgewotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGNvZGVfc2VjOwotICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBkYXRhX3NlYzsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlIC09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKLSAgICAgIC8qIFRoZSBkYXRhIHNlZ21lbnQgaGFkIGJldHRlciBiZSBhbGlnbmVkLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYykgJiAweGYpID09IDApOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW5sbV9hbHBoYV9nZXRfcHVibGljX29mZnNldCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgcmV0dXJuIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotfQotDAotLyogV3JpdGUgYW4gQWxwaGEgTkxNIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Ci17Ci0gIGludCBpOwotICBiZmRfYnl0ZSBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0gIGFyZWxlbnQgcjsKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQgKyAyLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGZpcnN0IHR3byByZWxvY3MgZm9yIGVhY2ggZXh0ZXJuYWwgc3ltYm9sIGFyZSB0aGUgLmxpdGEKLSAgICAgYWRkcmVzcyBhbmQgdGhlIEdQIHZhbHVlLiAgKi8KLSAgci5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICByLmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOwotCi0gIHIuYWRkcmVzcyA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKGFiZmQpLT5saXRhX2FkZHJlc3M7Ci0gIHIuYWRkZW5kID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAoYWJmZCktPmxpdGFfc2l6ZSArIDE7Ci0gIGlmIChubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgJnIpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICByLmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChhYmZkKS0+Z3A7Ci0gIHIuYWRkZW5kID0gMDsKLSAgaWYgKG5sbV9hbHBoYV93cml0ZV9pbXBvcnQgKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCAmcikgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSAgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2luY2x1ZGUgIm5sbXN3YXAuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX2FscGhhX2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBBbHBoYSBNb2R1bGUgICBcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9hbHBoYV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotICBzaXplb2YgKHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyKSwKLSAgYmZkX2FyY2hfYWxwaGEsCi0gIDAsCi0gIHRydWUsIC8qIG5vIHVuaW5pdGlhbGl6ZWQgZGF0YSBwZXJtaXR0ZWQgYnkgQWxwaGEgTmV0V2FyZS4gICovCi0gIG5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wLAotICBubG1fYWxwaGFfd3JpdGVfcHJlZml4LAotICBubG1fYWxwaGFfcmVhZF9yZWxvYywKLSAgbmxtX2FscGhhX21hbmdsZV9yZWxvY3MsCi0gIG5sbV9hbHBoYV9yZWFkX2ltcG9ydCwKLSAgbmxtX2FscGhhX3dyaXRlX2ltcG9ydCwKLSAgbmxtX2FscGhhX3NldF9wdWJsaWNfc2VjdGlvbiwKLSAgbmxtX2FscGhhX2dldF9wdWJsaWNfb2Zmc2V0LAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9hbHBoYV93cml0ZV9leHRlcm5hbCwKLSAgMCwJLyogd3JpdGVfZXhwb3J0ICovCi19OwotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJIm5sbTMyLWFscGhhIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJbmxtTkFNRShhbHBoYV92ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9hbHBoYV9iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItaTM4Ni5jIGIvYmZkL25sbTMyLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2Yzc0ZC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzItaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBpMzg2IE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL2kzODYtZXh0LmgiCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtMzJfaTM4Nl9FeHRlcm5hbF9GaXhlZF9IZWFkZXIKLQotI2luY2x1ZGUgImxpYm5sbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBubG1faTM4Nl9yZWFkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLCBhc2VjdGlvbiAqKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1faTM4Nl93cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1faTM4Nl9yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotCi0vKiBBZGp1c3QgdGhlIHJlbG9jIGxvY2F0aW9uIGJ5IGFuIGFic29sdXRlIHZhbHVlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX2kzODZfYWJzX2hvd3RvID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICIzMiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBBZGp1c3QgdGhlIHJlbG9jIGxvY2F0aW9uIGJ5IGEgUEMgcmVsYXRpdmUgZGlzcGxhY2VtZW50LiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX2kzODZfcGNyZWxfaG93dG8gPQotICBIT1dUTyAoMSwJCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkRJU1AzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFJlYWQgYSBOZXRXYXJlIGkzODYgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2kzODZfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIGJmZF92bWEgdmFsOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0KLSAgLyogVGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIGVpdGhlciB0aGUgY29kZSBvciBkYXRhIHNlZ21lbnQuCi0gICAgIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoaWNoIG5lZWRzIHRvIGJlIGFkanVzdGVkLgotCi0gICAgIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGZpeHVwIHJhdGhlciB0aGFuIGFuIGltcG9ydGVkIHN5bWJvbCAodGhlCi0gICAgIHN5bSBhcmd1bWVudCBpcyBOVUxMKSB0aGVuIHRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSBsb2NhdGlvbgotICAgICBuZWVkcyB0byBiZSBhZGp1c3RlZCBieSB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50LCBvciAxIGlmCi0gICAgIHRoZSBsb2NhdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCBieSB0aGUgYWRkcmVzcyBvZiB0aGUgY29kZQotICAgICBzZWdtZW50LiAgSWYgdGhpcyBpcyBhbiBpbXBvcnRlZCBzeW1ib2wsIHRoZW4gdGhlIGhpZ2ggYml0IGlzIDAKLSAgICAgaWYgdGhlIGxvY2F0aW9uIGlzIDAgaWYgdGhlIGxvY2F0aW9uIHNob3VsZCBiZSBhZGp1c3RlZCBieSB0aGUKLSAgICAgb2Zmc2V0IHRvIHRoZSBzeW1ib2wsIG9yIDEgaWYgdGhlIGxvY2F0aW9uIHNob3VsZCBhZGp1c3RlZCBieSB0aGUKLSAgICAgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4KLQotICAgICBUaGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldAotICAgICBpbnRvIHRoZSBkYXRhIHNlZ21lbnQsIG9yIDEgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZQotICAgICBjb2RlIHNlZ21lbnQuCi0KLSAgICAgQWxsIHRoaXMgdHJhbnNsYXRlcyBmYWlybHkgZWFzaWx5IGludG8gYSBCRkQgcmVsb2MuICAqLwotCi0gIGlmIChzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbCAmIE5MTV9ISUJJVCkgPT0gMCkKLQluYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gTkxNX0NPREVfTkFNRTsKLQkgIHZhbCAmPX4gTkxNX0hJQklUOwotCX0KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSktPnN5bWJvbF9wdHJfcHRyOwotICAgICAgcmVsLT5ob3d0byA9ICZubG1faTM4Nl9hYnNfaG93dG87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gdGhpcyBjYXNlIHdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgc3ltX3B0cl9wdHIgZmllbGQuICAqLwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IE5VTEw7Ci0gICAgICBpZiAoKHZhbCAmIE5MTV9ISUJJVCkgPT0gMCkKLQlyZWwtPmhvd3RvID0gJm5sbV9pMzg2X3BjcmVsX2hvd3RvOwotICAgICAgZWxzZQotCXsKLQkgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfYWJzX2hvd3RvOwotCSAgdmFsICY9fiBOTE1fSElCSVQ7Ci0JfQotICAgIH0KLQotICBpZiAoKHZhbCAmIChOTE1fSElCSVQgPj4gMSkpID09IDApCi0gICAgKnNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqc2VjcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgICAgIHZhbCAmPX4gKE5MTV9ISUJJVCA+PiAxKTsKLSAgICB9Ci0KLSAgcmVsLT5hZGRyZXNzID0gdmFsOwotICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgTmV0V2FyZSBpMzg2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBhc3ltYm9sICpzeW07Ci0gIGJmZF92bWEgdmFsOwotICBiZmRfYnl0ZSB0ZW1wWzRdOwotCi0gIC8qIE5ldFdhcmUgb25seSBzdXBwb3J0cyB0d28ga2luZHMgb2YgcmVsb2NzLiAgV2Ugc2hvdWxkIGNoZWNrCi0gICAgIHNwZWNpYWxfZnVuY3Rpb24gaGVyZSwgYXMgd2VsbCwgYnV0IGF0IHRoZSBtb21lbnQgY29mZi1pMzg2Ci0gICAgIHJlbG9jcyB1c2VzIGEgc3BlY2lhbF9mdW5jdGlvbiB3aGljaCBkb2VzIG5vdCBhZmZlY3Qgd2hhdCB3ZSBkbwotICAgICBoZXJlLiAgKi8KLSAgaWYgKHJlbC0+YWRkZW5kICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8gPT0gTlVMTAotICAgICAgfHwgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvLT5zaXplICE9IDIKLSAgICAgIHx8IHJlbC0+aG93dG8tPmJpdHNpemUgIT0gMzIKLSAgICAgIHx8IHJlbC0+aG93dG8tPmJpdHBvcyAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvLT5zcmNfbWFzayAhPSAweGZmZmZmZmZmCi0gICAgICB8fCByZWwtPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gIC8qIFRoZSB2YWx1ZSB3ZSB3cml0ZSBvdXQgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBhcHByb3ByaWF0ZQotICAgICBzZWdtZW50LiAgVGhpcyBvZmZzZXQgaXMgdGhlIHNlY3Rpb24gdm1hLCBhZGp1c3RlZCBieSB0aGUgdm1hIG9mCi0gICAgIHRoZSBsb3dlc3Qgc2VjdGlvbiBpbiB0aGF0IHNlZ21lbnQsIHBsdXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24uICAqLwotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpICsgcmVsLT5hZGRyZXNzOwotCi0gIC8qIFRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgMCBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0Ci0gICAgIGludG8gdGhlIGRhdGEgc2VnbWVudCwgb3IgMSBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0IGludG8gdGhlCi0gICAgIGNvZGUgc2VnbWVudC4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkKLSAgICB7Ci0gICAgICB2YWwgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0gICAgICB2YWwgfD0gTkxNX0hJQklUID4+IDE7Ci0gICAgfQotICBlbHNlCi0gICAgdmFsIC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICAvKiBOZXRXYXJlIG9ubHkgc3VwcG9ydHMgYWJzb2x1dGUgaW50ZXJuYWwgcmVsb2NzLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogVGhlIGhpZ2ggYml0IGlzIDEgaWYgdGhlIHJlbG9jIGlzIGFnYWluc3QgdGhlIGNvZGUgc2VjdGlvbiwgMAotCSBpZiBhZ2FpbnN0IHRoZSBkYXRhIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSAmIFNFQ19DT0RFKQotCXZhbCB8PSBOTE1fSElCSVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIGhpZ2ggYml0IGlzIDEgaWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSByZWxvYywgMCBpZiBpdCBpcyBQQwotCSByZWxhdGl2ZS4gICovCi0gICAgICBpZiAoISByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQl2YWwgfD0gTkxNX0hJQklUOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFBDIHJlbGF0aXZlIHJlbG9jcyBvbiBOZXRXYXJlIG11c3QgYmUgcGNyZWxfb2Zmc2V0LiAgKi8KLQkgIGlmICghIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJIHdhbnQgdG8gYmUgYWJsZSB0byB1c2Ugb2JqY29weSB0byB0dXJuIGEgaTM4NiBhLm91dCBvciBDT0ZGIGZpbGUKLSAgIGludG8gYSBOZXRXYXJlIGkzODYgbW9kdWxlLiAgVGhhdCBtZWFucyB0aGF0IHRoZSByZWxvY3MgZnJvbSB0aGUKLSAgIHNvdXJjZSBmaWxlIGhhdmUgdG8gYmUgbWFwcGVkIGludG8gcmVsb2NzIHRoYXQgYXBwbHkgdG8gdGhlIHRhcmdldAotICAgZmlsZS4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyB0byBnaXZlCi0gICBpdCBhIGNoYW5jZSB0byByZXdvcmsgdGhlIHJlbG9jcy4KLQotICAgVGhpcyBpcyBhY3R1YWxseSBhIGZhaXJseSBnZW5lcmFsIGNvbmNlcHQuICBIb3dldmVyLCB0aGlzIGlzIG5vdCBhCi0gICBnZW5lcmFsIGltcGxlbWVudGF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGFyZWxlbnQgKipyZWxfcHRyX3B0ciwgKipyZWxfZW5kOwotCi0gIHJlbF9wdHJfcHRyID0gc2VjLT5vcmVsb2NhdGlvbjsKLSAgcmVsX2VuZCA9IHJlbF9wdHJfcHRyICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbF9wdHJfcHRyIDwgcmVsX2VuZDsgcmVsX3B0cl9wdHIrKykKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWw7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLQotICAgICAgcmVsID0gKnJlbF9wdHJfcHRyOwotICAgICAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgICAgIC8qIE5vdGUgdGhhdCBubyBzZXJpb3VzIGhhcm0gd2lsbCBlbnN1ZSBpZiB3ZSBmYWlsIHRvIGNoYW5nZSBhCi0JIHJlbG9jLiAgV2Ugd2lsbCB3aW5kIHVwIGZhaWxpbmcgaW4gbmxtX2kzODZfd3JpdGVfaW1wb3J0LiAgKi8KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgcmVsb2MgaXMgd2l0aGluIHRoZSBkYXRhIHdlIGhhdmUuICBXZSBvbmx5IDQKLQkgYnl0ZSByZWxvY3MgaGVyZSwgc28gd2UgaW5zaXN0IG9uIGhhdmluZyA0IGJ5dGVzLiAgKi8KLSAgICAgIGlmIChyZWwtPmFkZHJlc3MgPCBvZmZzZXQKLQkgIHx8IHJlbC0+YWRkcmVzcyArIDQgPiBvZmZzZXQgKyBjb3VudCkKLQljb250aW51ZTsKLQotICAgICAgLyogTmV0V2FyZSBkb2Vzbid0IHN1cHBvcnQgcmVsb2MgYWRkZW5kcywgc28gd2UgZ2V0IHJpZCBvZiB0aGVtCi0JIGhlcmUgYnkgc2ltcGx5IGFkZGluZyB0aGVtIGludG8gdGhlIG9iamVjdCBkYXRhLiAgV2UgaGFuZGxlCi0JIHRoZSBzeW1ib2wgdmFsdWUsIGlmIGFueSwgdGhlIHNhbWUgd2F5LiAgKi8KLSAgICAgIGFkZGVuZCA9IHJlbC0+YWRkZW5kICsgc3ltLT52YWx1ZTsKLQotICAgICAgLyogVGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbi4gIElmIHRoZQotCSBzeW1ib2wgaXMgaW4gdGhlIC5ic3Mgc2VnbWVudCwgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBzaXplIG9mCi0JIHRoZSBkYXRhIHNlZ21lbnQgaW4gdGhlIG9mZnNldCBhcyB3ZWxsLiAgRm9ydHVuYXRlbHksIHdlIGtub3cKLQkgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzaXplIG9mIHRoZSBkYXRhIHNlY3Rpb24gaXMgaW4gdGhlIE5MTQotCSBoZWFkZXIuICAqLwotICAgICAgaWYgKCgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICYgU0VDX0xPQUQpID09IDApCi0JICAmJiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgICAmIFNFQ19BTExPQykgIT0gMCkpCi0JYWRkZW5kICs9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VTaXplOwotCi0gICAgICBpZiAoYWRkZW5kICE9IDAKLQkgICYmIHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zaXplID09IDIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHNpemUgPT0gMzIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHBvcyA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zcmNfbWFzayA9PSAweGZmZmZmZmZmCi0JICAmJiByZWwtPmhvd3RvLT5kc3RfbWFzayA9PSAweGZmZmZmZmZmKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbC0+YWRkcmVzcyAtIG9mZnNldCk7Ci0JICB2YWwgKz0gYWRkZW5kOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbC0+YWRkcmVzcyAtIG9mZnNldCk7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotCi0gICAgICAvKiBOZXRXYXJlIHVzZXMgYSByZWxvYyB3aXRoIHBjcmVsX29mZnNldCBzZXQuICBXZSBhZGp1c3QKLQkgcGNfcmVsYXRpdmUgcmVsb2NzIGFjY29yZGluZ2x5LiAgV2UgYXJlIGdvaW5nIHRvIGNoYW5nZSB0aGUKLQkgaG93dG8gZmllbGQsIHNvIHdlIGNhbiBvbmx5IGRvIHRoaXMgaWYgdGhlIGN1cnJlbnQgb25lIGlzCi0JIGNvbXBhdGlibGUuICBXZSBzaG91bGQgY2hlY2sgc3BlY2lhbF9mdW5jdGlvbiBoZXJlLCBidXQgYXQKLQkgdGhlIG1vbWVudCBjb2ZmLWkzODYgdXNlcyBhIHNwZWNpYWxfZnVuY3Rpb24gd2hpY2ggZG9lcyBub3QKLQkgYWZmZWN0IHdoYXQgd2UgYXJlIGRvaW5nIGhlcmUuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmICEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0Ci0JICAmJiByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNpemUgPT0gMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0c2l6ZSA9PSAzMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0cG9zID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNyY19tYXNrID09IDB4ZmZmZmZmZmYKLQkgICYmIHJlbC0+aG93dG8tPmRzdF9tYXNrID09IDB4ZmZmZmZmZmYpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIC8qIFdoZW4gcGNyZWxfb2Zmc2V0IGlzIG5vdCBzZXQsIGl0IG1lYW5zIHRoYXQgdGhlIG5lZ2F0aXZlCi0JICAgICBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB0aGUKLQkgICAgIG1lbW9yeSBsb2NhdGlvbi4gIFdlIG11c3QgYWRkIGl0IGJhY2sgaW4uICAqLwotCSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWwtPmFkZHJlc3MgLSBvZmZzZXQpOwotCSAgdmFsICs9IHJlbC0+YWRkcmVzczsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWwtPmFkZHJlc3MgLSBvZmZzZXQpOwotCi0JICByZWwtPmhvd3RvID0gJm5sbV9pMzg2X3BjcmVsX2hvd3RvOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBOZXRXYXJlIGkzODYgaW1wb3J0IHJlY29yZCAqLwotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X3JlYWRfaW1wb3J0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgc3RydWN0IG5sbV9yZWxlbnQgKm5sbV9yZWxvY3M7CS8qIHJlbG9jYXRpb24gcmVjb3JkcyBmb3Igc3ltYm9sICovCi0gIGJmZF9zaXplX3R5cGUgcmNvdW50OwkJCS8qIG51bWJlciBvZiByZWxvY3MgKi8KLSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIHRlbXBvcmFyeSAzMi1iaXQgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiBzeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkIChuYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpICE9IHN5bWxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5hbWVbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gIHN5bSAtPiBzeW1ib2wubmFtZSA9IG5hbWU7Ci0gIHN5bSAtPiBzeW1ib2wuZmxhZ3MgPSAwOwotICBzeW0gLT4gc3ltYm9sLnZhbHVlID0gMDsKLSAgc3ltIC0+IHN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmNvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLSAgbmxtX3JlbG9jcyA9ICgoc3RydWN0IG5sbV9yZWxlbnQgKikKLQkJYmZkX2FsbG9jIChhYmZkLCByY291bnQgKiBzaXplb2YgKHN0cnVjdCBubG1fcmVsZW50KSkpOwotICBpZiAoIW5sbV9yZWxvY3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gcmVsb2NzID0gbmxtX3JlbG9jczsKLSAgc3ltIC0+IHJjbnQgPSAwOwotICB3aGlsZSAoc3ltIC0+IHJjbnQgPCByY291bnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAKLSAgICAgIGlmIChubG1faTM4Nl9yZWFkX3JlbG9jIChhYmZkLCBzeW0sICZzZWN0aW9uLAotCQkJICAgICAgICZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl93cml0ZV9leHRlcm5hbCAoYWJmZCwgY291bnQsIHN5bSwgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnJlbG9jczsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIGxlbjsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChubG1faTM4Nl93cml0ZV9pbXBvcnQgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCi0JCQkJIHJlbG9jc1tpXS5yZWwpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9pMzg2X2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9pMzg2X0V4dGVybmFsX0ZpeGVkX0hlYWRlciksCi0gIDAsCS8qIG9wdGlvbmFsX3ByZWZpeF9zaXplICovCi0gIGJmZF9hcmNoX2kzODYsCi0gIDAsCi0gIGZhbHNlLAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeF9mdW5jICovCi0gIG5sbV9pMzg2X3JlYWRfcmVsb2MsCi0gIG5sbV9pMzg2X21hbmdsZV9yZWxvY3MsCi0gIG5sbV9pMzg2X3JlYWRfaW1wb3J0LAotICBubG1faTM4Nl93cml0ZV9pbXBvcnQsCi0gIDAsCS8qIHNldF9wdWJsaWNfc2VjdGlvbiAqLwotICAwLAkvKiBnZXRfcHVibGljX29mZnNldCAqLwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9pMzg2X3dyaXRlX2V4dGVybmFsLAotICAwLAkvKiB3cml0ZV9leHBvcnQgKi8KLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkibmxtMzItaTM4NiIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCW5sbU5BTUUoaTM4Nl92ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9pMzg2X2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1wcGMuYyBiL2JmZC9ubG0zMi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmMmRlOC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzItcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ1ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBQb3dlclBDIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBUaGUgZm9ybWF0IG9mIGEgUG93ZXJQQyBOTE0gY2hhbmdlZC4gIERlZmluZSBPTERGT1JNQVQgdG8gZ2V0IHRoZQotICAgb2xkIGZvcm1hdC4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNpbmNsdWRlICJubG0vcHBjLWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX3Bvd2VycGNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotI2lmZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfcHJlZml4Ci0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY19yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotCi0jaWZkZWYgT0xERk9STUFUCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY193cml0ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLCBpbnQpKTsKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotCi0jaWZuZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBubG1fcG93ZXJwY19nZXRfcHVibGljX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0jZW5kaWYKLQwKLSNpZmRlZiBPTERGT1JNQVQKLQotLyogVGhlIHByZWZpeCBoZWFkZXIgaXMgb25seSB1c2VkIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogUG93ZXJQQyBOTE0ncyBoYXZlIGEgcHJlZml4IGhlYWRlciBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTS4gIFRoaXMKLSAgIGZ1bmN0aW9uIHJlYWRzIGl0IGluLCB2ZXJpZmllcyB0aGUgdmVyc2lvbiwgYW5kIHNlZWtzIHRoZSBiZmQgdG8KLSAgIHRoZSBsb2NhdGlvbiBiZWZvcmUgdGhlIHJlZ3VsYXIgTkxNIGhlYWRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19iYWNrZW5kX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChtZW1jbXAgKHMuc2lnbmF0dXJlLCBOTE0zMl9QT1dFUlBDX1NJR05BVFVSRSwgc2l6ZW9mIHMuc2lnbmF0dXJlKSAhPSAwCi0gICAgICB8fCBiZmRfaF9nZXRfMzIgKGFiZmQsIHMuaGVhZGVyVmVyc2lvbikgIT0gTkxNMzJfUE9XRVJQQ19IRUFERVJfVkVSU0lPTikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcHJlZml4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgbWVtc2V0ICgmcywgMCwgc2l6ZW9mIHMpOwotICBtZW1jcHkgKHMuc2lnbmF0dXJlLCBOTE0zMl9QT1dFUlBDX1NJR05BVFVSRSwgc2l6ZW9mIHMuc2lnbmF0dXJlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgTkxNMzJfUE9XRVJQQ19IRUFERVJfVkVSU0lPTiwgcy5oZWFkZXJWZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgMCwgcy5vcmlnaW5zKTsKLQotICAvKiBGSVhNRTogV2hhdCBzaG91bGQgd2UgZG8gYWJvdXQgdGhlIGRhdGU/ICAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogT0xERk9STUFUICovCi0MCi0jaWZuZGVmIE9MREZPUk1BVAotCi0vKiBUaGVyZSBpcyBvbmx5IG9uZSB0eXBlIG9mIHJlbG9jIGluIGEgUG93ZXJQQyBOTE0uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1fcG93ZXJwY19ob3d0byA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiMzIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogUmVhZCBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfYnl0ZSB0ZW1wWzRdOwotICBiZmRfdm1hIHZhbDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRlbXApOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyBhIHdvcmQgb2Zmc2V0IGludG8gZWl0aGVyIHRoZSBjb2RlIG9yIGRhdGEgc2VnbWVudC4KLSAgICAgVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hpY2ggbmVlZHMgdG8gYmUgYWRqdXN0ZWQuCi0KLSAgICAgVGhlIGhpZ2ggYml0IGlzIDAgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZSBkYXRhCi0gICAgIHNlZ21lbnQsIG9yIDEgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZSB0ZXh0IHNlZ21lbnQuCi0KLSAgICAgSWYgdGhpcyBpcyBhIHJlbG9jYXRpb24gZml4dXAgcmF0aGVyIHRoYW4gYW4gaW1wb3J0ZWQgc3ltYm9sICh0aGUKLSAgICAgc3ltIGFyZ3VtZW50IGlzIE5VTEwpLCB0aGVuIHRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgMAotICAgICBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IHNob3VsZCBiZSBhZGRlZCB0byB0aGUKLSAgICAgbG9jYXRpb24gYWRkcmVzc2VkIGJ5IHRoZSB2YWx1ZSwgb3IgMSBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgdGV4dAotICAgICBzZWdtZW50IHNob3VsZCBiZSBhZGRlZC4KLQotICAgICBJZiB0aGlzIGlzIGFuIGltcG9ydGVkIHN5bWJvbCwgdGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcwotICAgICBub3QgdXNlZCBhbmQgbXVzdCBiZSAwLiAgKi8KLQotICBpZiAoKHZhbCAmIE5MTV9ISUJJVCkgPT0gMCkKLSAgICBuYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotICAgICAgdmFsICY9fiBOTE1fSElCSVQ7Ci0gICAgfQotICAqc2VjcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQotICBpZiAoc3ltID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCh2YWwgJiAoTkxNX0hJQklUID4+IDEpKSA9PSAwKQotCW5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotCSAgdmFsICY9fiAoTkxNX0hJQklUID4+IDEpOwotCX0KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSktPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotICByZWwtPmhvd3RvID0gJm5sbV9wb3dlcnBjX2hvd3RvOwotCi0gIHJlbC0+YWRkcmVzcyA9IHZhbCA8PCAyOwotICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbHNlIC8qIE9MREZPUk1BVCAqLwotCi0vKiBUaGlzIHJlbG9jIGhhbmRsaW5nIGlzIG9ubHkgYXBwbGljYWJsZSB0byB0aGUgb2xkIGZvcm1hdC4gICovCi0KLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgUG93ZXJQQyBOTE1zIHVzZSBYQ09GRgotICAgcmVsb2MgdHlwZXMsIGFuZCBJIGhhdmUganVzdCBjb3BpZWQgdGhlIFhDT0ZGIHJlbG9jIHRhYmxlIGhlcmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1fcG93ZXJwY19ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RPQyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoaXMgaXMuICAqLwotICBIT1dUTyAoNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlRCIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEV4dGVybmFsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfR0wiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2NhbCBUT0MgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKDYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RDTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyA3IH0sCi0gIAotICAvKiBOb24gbW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQkEiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDkgfSwKLQotICAvKiBOb24gbW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHhhLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9CUiIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHhiIH0sCi0KLSAgLyogSW5kaXJlY3QgbG9hZC4gICovCi0gIEhPV1RPICgweGMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JMIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4ZCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkxBIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4ZSB9LAotICAKLSAgLyogTm9uLXJlbG9jYXRpbmcgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKDB4ZiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVGIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsICAgICAJICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHgxMCB9LAotICB7IDB4MTEgfSwKLSAgCi0gIC8qIFRPQyByZWxhdGl2ZSBpbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4MTIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogVE9DIHJlbGF0aXZlIGxvYWQgYWRkcmVzcy4gICovCi0gIEhPV1RPICgweDEzLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UUkxBIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJJIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGFic29sdXRlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweDE1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SUlRCQSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBjYWxsIGFic29sdXRlIGluZGlyZWN0LiAgKi8KLSAgSE9XVE8gKDB4MTYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0NBSSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBjYWxsIHJlbGF0aXZlLiAgKi8KLSAgSE9XVE8gKDB4MTcsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJBIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE5LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkFDIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIHJlbGF0aXZlLiAgKi8KLSAgSE9XVE8gKDB4MWEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MWIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSkgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2RlZmluZSBIT1dUT19DT1VOVCAoc2l6ZW9mIG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlCQlcCi0JCSAgICAgLyBzaXplb2YgbmxtX3Bvd2VycGNfaG93dG9fdGFibGVbMF0pCi0KLS8qIFJlYWQgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcmVsb2MgZXh0OwotICBiZmRfdm1hIGxfdmFkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbF9zeW1uZHg7Ci0gIGludCBsX3J0eXBlOwotICBpbnQgbF9yc2Vjbm07Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjLCAqYnNzX3NlYzsKLQotICAvKiBSZWFkIHRoZSByZWxvYyBmcm9tIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTd2FwIGluIHRoZSBmaWVsZHMuICAqLwotICBsX3ZhZGRyID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQubF92YWRkcik7Ci0gIGxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQubF9zeW1uZHgpOwotICBsX3J0eXBlID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQubF9ydHlwZSk7Ci0gIGxfcnNlY25tID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQubF9yc2Vjbm0pOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbnMgbm93LCBmb3IgY29udmVuaWVuY2UuICAqLwotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQotICAvKiBXb3JrIG91dCB0aGUgYXJlbGVudCBmaWVsZHMuICAqLwotICBpZiAoc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBpbXBvcnQuICBzeW1fcHRyX3B0ciBpcyBmaWxsZWQgaW4gYnkKLQkgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYy4gICovCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBpZiAobF9zeW1uZHggPT0gMCkKLQlzZWMgPSBjb2RlX3NlYzsKLSAgICAgIGVsc2UgaWYgKGxfc3ltbmR4ID09IDEpCi0Jc2VjID0gZGF0YV9zZWM7Ci0gICAgICBlbHNlIGlmIChsX3N5bW5keCA9PSAyKQotCXNlYyA9IGJzc19zZWM7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLSAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIEJGRF9BU1NFUlQgKChsX3J0eXBlICYgMHhmZikgPCBIT1dUT19DT1VOVCk7Ci0KLSAgcmVsLT5ob3d0byA9IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlICsgKGxfcnR5cGUgJiAweGZmKTsKLQotICBCRkRfQVNTRVJUIChyZWwtPmhvd3RvLT5uYW1lICE9IE5VTEwKLQkgICAgICAmJiAoKGxfcnR5cGUgJiAweDgwMDApICE9IDAKLQkJICA/IChyZWwtPmhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdwotCQkgICAgID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLQkJICA6IChyZWwtPmhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdwotCQkgICAgID09IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLQkgICAgICAmJiAoKGxfcnR5cGUgPj4gOCkgJiAweDFmKSA9PSByZWwtPmhvd3RvLT5iaXRzaXplIC0gMSk7Ci0KLSAgaWYgKGxfcnNlY25tID09IDApCi0gICAgKnNlY3AgPSBjb2RlX3NlYzsKLSAgZWxzZSBpZiAobF9yc2Vjbm0gPT0gMSkKLSAgICB7Ci0gICAgICAqc2VjcCA9IGRhdGFfc2VjOwotICAgICAgbF92YWRkciAtPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJlbC0+YWRkcmVzcyA9IGxfdmFkZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogTWFuZ2xlIFBvd2VyUEMgTkxNIHJlbG9jcyBmb3Igb3V0cHV0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgUG93ZXJQQyBOTE0gaW1wb3J0IHJlY29yZCAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5hbWVbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gIHN5bSAtPiBzeW1ib2wubmFtZSA9IG5hbWU7Ci0gIHN5bSAtPiBzeW1ib2wuZmxhZ3MgPSAwOwotICBzeW0gLT4gc3ltYm9sLnZhbHVlID0gMDsKLSAgc3ltIC0+IHN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotICByY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHRlbXApOwotICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7Ci0gIGlmIChubG1fcmVsb2NzID09IChzdHJ1Y3QgbmxtX3JlbGVudCAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX3Bvd2VycGNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCAmc2VjdGlvbiwKLQkJCQkgICZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmbmRlZiBPTERGT1JNQVQKLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYXN5bWJvbCAqc3ltOwotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLQotICAvKiBQb3dlclBDIE5ldFdhcmUgb25seSBzdXBwb3J0cyBvbmUga2luZCBvZiByZWxvYy4gICovCi0gIGlmIChyZWwtPmFkZGVuZCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvID09IE5VTEwKLSAgICAgIHx8IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+c2l6ZSAhPSAyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRzaXplICE9IDMyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRwb3MgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLSAgICAgIHx8IChyZWwtPmhvd3RvLT5zcmNfbWFzayAhPSAweGZmZmZmZmZmICYmIHJlbC0+YWRkZW5kICE9IDApCi0gICAgICB8fCByZWwtPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gIC8qIFRoZSB2YWx1ZSB3ZSB3cml0ZSBvdXQgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBhcHByb3ByaWF0ZQotICAgICBzZWdtZW50LCByaWdodHNoaWZ0ZWQgYnkgdHdvLiAgVGhpcyBvZmZzZXQgaXMgdGhlIHNlY3Rpb24gdm1hLAotICAgICBhZGp1c3RlZCBieSB0aGUgdm1hIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBpbiB0aGF0IHNlZ21lbnQsIHBsdXMKLSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpICsgcmVsLT5hZGRyZXNzOwotICBpZiAoKHZhbCAmIDMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB2YWwgPj49IDI7Ci0KLSAgLyogVGhlIGhpZ2ggYml0IGlzIDAgaWYgdGhlIHJlbG9jIGlzIGluIHRoZSBkYXRhIHNlY3Rpb24sIG9yIDEgaWYKLSAgICAgdGhlIHJlbG9jIGlzIGluIHRoZSBjb2RlIHNlY3Rpb24uICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RBVEEpCi0gICAgdmFsIC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotICBlbHNlCi0gICAgewotICAgICAgdmFsIC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICAgICAgdmFsIHw9IE5MTV9ISUJJVDsKLSAgICB9Ci0gICAgCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIGludGVybmFsIHJlbG9jYXRpb24gZml4dXAuICBUaGUgc2Vjb25kIG1vc3QKLQkgc2lnbmlmaWNhbnQgYml0IGlzIDAgaWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGRhdGEKLQkgc2VnbWVudCwgb3IgMSBpZiBpdCBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudC4gICovCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpICYgU0VDX0NPREUpCi0JdmFsIHw9IE5MTV9ISUJJVCA+PiAxOwotICAgIH0KLQotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2Vsc2UgLyogT0xERk9STUFUICovCi0KLS8qIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHJlbG9jIGhhbmRsaW5nIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwsIGluZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotICAgICBpbnQgaW5keDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcmVsb2MgZXh0OwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYywgKmJzc19zZWM7Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYXNlY3Rpb24gKnN5bXNlYzsKLSAgdW5zaWduZWQgbG9uZyBsX3N5bW5keDsKLSAgaW50IGxfcnR5cGU7Ci0gIGludCBsX3JzZWNubTsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb25zIG5vdywgZm9yIGNvbnZlbmllbmNlLiAgKi8KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0KLSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0gIHN5bXNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLSAgaWYgKGluZHggIT0gLTEpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1zZWMpKTsKLSAgICAgIGxfc3ltbmR4ID0gaW5keCArIDM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN5bXNlYyA9PSBjb2RlX3NlYykKLQlsX3N5bW5keCA9IDA7Ci0gICAgICBlbHNlIGlmIChzeW1zZWMgPT0gZGF0YV9zZWMpCi0JbF9zeW1uZHggPSAxOwotICAgICAgZWxzZSBpZiAoc3ltc2VjID09IGJzc19zZWMpCi0JbF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgbF9zeW1uZHgsIGV4dC5sX3N5bW5keCk7Ci0KLSAgZm9yIChob3d0byA9IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlOwotICAgICAgIGhvd3RvIDwgbmxtX3Bvd2VycGNfaG93dG9fdGFibGUgKyBIT1dUT19DT1VOVDsKLSAgICAgICBob3d0bysrKQotICAgIHsKLSAgICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA9PSByZWwtPmhvd3RvLT5yaWdodHNoaWZ0Ci0JICAmJiBob3d0by0+c2l6ZSA9PSByZWwtPmhvd3RvLT5zaXplCi0JICAmJiBob3d0by0+Yml0c2l6ZSA9PSByZWwtPmhvd3RvLT5iaXRzaXplCi0JICAmJiBob3d0by0+cGNfcmVsYXRpdmUgPT0gcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmIGhvd3RvLT5iaXRwb3MgPT0gcmVsLT5ob3d0by0+Yml0cG9zCi0JICAmJiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSByZWwtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgICAgICB8fCAoISByZWwtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkJICAmJiByZWwtPmFkZGVuZCA9PSAwKSkKLQkgICYmIChob3d0by0+c3JjX21hc2sgPT0gcmVsLT5ob3d0by0+c3JjX21hc2sKLQkgICAgICB8fCAocmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMAotCQkgICYmIHJlbC0+YWRkZW5kID09IDApKQotCSAgJiYgaG93dG8tPmRzdF9tYXNrID09IHJlbC0+aG93dG8tPmRzdF9tYXNrCi0JICAmJiBob3d0by0+cGNyZWxfb2Zmc2V0ID09IHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCkKLQlicmVhazsKLSAgICB9Ci0gIGlmIChob3d0byA+PSBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIEhPV1RPX0NPVU5UKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBsX3J0eXBlID0gaG93dG8tPnR5cGU7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotICAgIGxfcnR5cGUgfD0gMHg4MDAwOwotICBsX3J0eXBlIHw9IChob3d0by0+Yml0c2l6ZSAtIDEpIDw8IDg7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIGxfcnR5cGUsIGV4dC5sX3J0eXBlKTsKLQotICBhZGRyZXNzID0gcmVsLT5hZGRyZXNzOwotCi0gIGlmIChzZWMgPT0gY29kZV9zZWMpCi0gICAgbF9yc2Vjbm0gPSAwOwotICBlbHNlIGlmIChzZWMgPT0gZGF0YV9zZWMpCi0gICAgewotICAgICAgbF9yc2Vjbm0gPSAxOwotICAgICAgYWRkcmVzcyArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIGxfcnNlY25tLCBleHQubF9yc2Vjbm0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBhZGRyZXNzLCBleHQubF92YWRkcik7Ci0KLSAgaWYgKGJmZF93cml0ZSAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gaW1wb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICByZXR1cm4gbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsLCAtMSk7Ci19Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSBleHRlcm5hbCBzeW1ib2wuICBUaGlzIHJvdXRpbmUga2VlcHMgYSBzdGF0aWMKLSAgIGNvdW50IG9mIHRoZSBzeW1ib2wgaW5kZXguICBGSVhNRTogSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgIG5lY2Vzc2FyeSwgYW5kIHRoZSBpbmRleCBuZXZlciBnZXRzIHJlc2V0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotI2lmZGVmIE9MREZPUk1BVAotICBzdGF0aWMgaW50IGluZHg7Ci0jZW5kaWYKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSNpZm5kZWYgT0xERk9STUFUCi0gICAgICBpZiAoISBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHJlbG9jc1tpXS5zZWMsIHJlbG9jc1tpXS5yZWwpKQotCXJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgICBpZiAoISBubG1fcG93ZXJwY193cml0ZV9yZWxvYyAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgICAgIHJlbG9jc1tpXS5yZWwsIGluZHgpKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIE9MREZPUk1BVAotICArK2luZHg7Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNpZm5kZWYgT0xERk9STUFUCi0KLS8qIFBvd2VyUEMgTmV0d2FyZSB1c2VzIGEgd29yZCBvZmZzZXQsIG5vdCBhIGJ5dGUgb2Zmc2V0LCBmb3IgcHVibGljCi0gICBzeW1ib2xzLiAgKi8KLQotLyogU2V0IHRoZSBzZWN0aW9uIGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgaWYgKHN5bS0+c3ltYm9sLnZhbHVlICYgTkxNX0hJQklUKQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH5OTE1fSElCSVQ7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICAgIH0KLQotICBzeW0tPnN5bWJvbC52YWx1ZSA8PD0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBvZmZzZXQgdG8gd3JpdGUgb3V0IGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBhc2VjdGlvbiAqc2VjOwotCi0gIG9mZnNldCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSk7Ci0gIGlmIChzZWMtPmZsYWdzICYgU0VDX0NPREUpCi0gICAgewotICAgICAgb2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICAgICAgb2Zmc2V0IHw9IE5MTV9ISUJJVDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlYy0+ZmxhZ3MgJiAoU0VDX0RBVEEgfCBTRUNfQUxMT0MpKQotICAgIHsKLSAgICAgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCi0gICAgICBvZmZzZXQgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgY2FuJ3QgaGFuZGxlIGFuIGV4cG9ydGVkIHN5bWJvbCB0aGF0IGlzIG5vdCBpbiB0aGUgY29kZSBvcgotCSBkYXRhIHNlZ21lbnQuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0OwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChPTERGT1JNQVQpICovCi0MCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfcG93ZXJwY19iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgUG93ZXJQQyBNb2R1bGUgXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfcG93ZXJwY19FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotI2lmbmRlZiBPTERGT1JNQVQKLSAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KLSNlbHNlCi0gIHNpemVvZiAoc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciksCi0jZW5kaWYKLSAgYmZkX2FyY2hfcG93ZXJwYywKLSAgMCwKLSAgZmFsc2UsCi0jaWZuZGVmIE9MREZPUk1BVAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeCAqLwotI2Vsc2UKLSAgbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcCwKLSAgbmxtX3Bvd2VycGNfd3JpdGVfcHJlZml4LAotI2VuZGlmCi0gIG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MsCi0gIG5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MsCi0gIG5sbV9wb3dlcnBjX3JlYWRfaW1wb3J0LAotICBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQsCi0jaWZuZGVmIE9MREZPUk1BVAotICBubG1fcG93ZXJwY19zZXRfcHVibGljX3NlY3Rpb24sCi0gIG5sbV9wb3dlcnBjX2dldF9wdWJsaWNfb2Zmc2V0LAotI2Vsc2UKLSAgMCwJLyogc2V0X3B1YmxpY19zZWN0aW9uICovCi0gIDAsCS8qIGdldF9wdWJsaWNfb2Zmc2V0ICovCi0jZW5kaWYKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1fcG93ZXJwY193cml0ZV9leHRlcm5hbCwKLSAgMCwJLyogd3JpdGVfZXhwb3J0ICovCi19OwotCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJubG0zMi1wb3dlcnBjIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCW5sbU5BTUUocG93ZXJwY192ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9wb3dlcnBjX2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1zcGFyYy5jIGIvYmZkL25sbTMyLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjNhZGIuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgMzItYml0IFNQQVJDIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL3NwYXJjMzItZXh0LmgiCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSX1NQQVJDX05PTkUgPSAwLAotICAgIFJfU1BBUkNfOCwJCVJfU1BBUkNfMTYsCQlSX1NQQVJDXzMyLCAKLSAgICBSX1NQQVJDX0RJU1A4LAlSX1NQQVJDX0RJU1AxNiwJCVJfU1BBUkNfRElTUDMyLCAKLSAgICBSX1NQQVJDX1dESVNQMzAsCVJfU1BBUkNfV0RJU1AyMiwKLSAgICBSX1NQQVJDX0hJMjIsCVJfU1BBUkNfMjIsCi0gICAgUl9TUEFSQ18xMywJCVJfU1BBUkNfTE8xMCwKLSAgICBSX1NQQVJDX0dPVDEwLAlSX1NQQVJDX0dPVDEzLAkJUl9TUEFSQ19HT1QyMiwKLSAgICBSX1NQQVJDX1BDMTAsCVJfU1BBUkNfUEMyMiwKLSAgICBSX1NQQVJDX1dQTFQzMCwKLSAgICBSX1NQQVJDX0NPUFksCi0gICAgUl9TUEFSQ19HTE9CX0RBVCwJUl9TUEFSQ19KTVBfU0xPVCwKLSAgICBSX1NQQVJDX1JFTEFUSVZFLAotICAgIFJfU1BBUkNfVUEzMiwKLSAgICBSX1NQQVJDX21heAotICB9OwotCi0jaWYgMAotc3RhdGljIENPTlNUIGNoYXIgKkNPTlNUIHJlbG9jX3R5cGVfbmFtZXNbXSA9Ci17Ci0gICJSX1NQQVJDX05PTkUiLAotICAiUl9TUEFSQ184IiwJCSJSX1NQQVJDXzE2IiwJCSJSX1NQQVJDXzMyIiwKLSAgIlJfU1BBUkNfRElTUDgiLAkiUl9TUEFSQ19ESVNQMTYiLAkiUl9TUEFSQ19ESVNQMzIiLAotICAiUl9TUEFSQ19XRElTUDMwIiwJIlJfU1BBUkNfV0RJU1AyMiIsCi0gICJSX1NQQVJDX0hJMjIiLAkiUl9TUEFSQ18yMiIsCi0gICJSX1NQQVJDXzEzIiwJCSJSX1NQQVJDX0xPMTAiLAotICAiUl9TUEFSQ19HT1QxMCIsCSJSX1NQQVJDX0dPVDEzIiwJIlJfU1BBUkNfR09UMjIiLAotICAiUl9TUEFSQ19QQzEwIiwJIlJfU1BBUkNfUEMyMiIsCi0gICJSX1NQQVJDX1dQTFQzMCIsCi0gICJSX1NQQVJDX0NPUFkiLAotICAiUl9TUEFSQ19HTE9CX0RBVCIsCSJSX1NQQVJDX0pNUF9TTE9UIiwKLSAgIlJfU1BBUkNfUkVMQVRJVkUiLAotICAiUl9TUEFSQ19VQTMyIiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ184LCAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzgiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTYsICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18xNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQOCwgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX0RJU1A4IiwgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDE2LCAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19ESVNQMTYiLCAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AzMiwgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfRElTUDMyIiwgIGZhbHNlLDAsMHgwMGZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDMwLCAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX1dESVNQMzAiLCBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AyMiwgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19XRElTUDIyIiwgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hJMjIsICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfSEkyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18yMiwgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzIyIiwgICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTMsICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18xMyIsICAgICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfTE8xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMCwgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX0dPVDEwIiwgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTMsICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19HT1QxMyIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDIyLCAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfR09UMjIiLCAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX1BDMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMyMiwgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19QQzIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dQTFQzMCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfV1BMVDMwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19DT1BZLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0NPUFkiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR0xPQl9EQVQsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19HTE9CX0RBVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0pNUF9TTE9ULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfSk1QX1NMT1QiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUxBVElWRSwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX1JFTEFUSVZFIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUEzMiwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19VQTMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotfTsKLQotLyogUmVhZCBhIE5ldFdhcmUgc3BhcmMgcmVsb2MuICAqLwotCi1zdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHsKLSAgdW5zaWduZWQgY2hhciBvZmZzZXRbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYWRkZW5kWzRdOwotICB1bnNpZ25lZCBjaGFyIHR5cGVbMV07Ci0gIHVuc2lnbmVkIGNoYXIgcGFkMVszXTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF92bWEgdmFsLCBhZGRlbmQ7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIHN0cnVjdCBubG0zMl9zcGFyY19yZWxvY19leHQgdG1wX3JlbG9jOwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYzsKLQotICBpZiAoYmZkX3JlYWQgKCZ0bXBfcmVsb2MsIDEyLCAxLCBhYmZkKSAhPSAxMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCi0gICpzZWNwID0gY29kZV9zZWM7Ci0KLSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgdG1wX3JlbG9jLm9mZnNldCk7Ci0gIGFkZGVuZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRtcF9yZWxvYy5hZGRlbmQpOwotICB0eXBlID0gYmZkX2dldF84IChhYmZkLCB0bXBfcmVsb2MudHlwZSk7Ci0KLSAgcmVsLT5hZGRyZXNzID0gdmFsOwotICByZWwtPmFkZGVuZCA9IGFkZGVuZDsKLSAgcmVsLT5ob3d0byA9IE5VTEw7Ci0KLSAgZm9yIChpbmRleCA9IDA7Ci0gICAgICAgaW5kZXggPCBzaXplb2YobmxtMzJfc3BhcmNfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHJlbG9jX2hvd3RvX3R5cGUpOwotICAgICAgIGluZGV4KyspCi0gICAgaWYgKG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW2luZGV4XS50eXBlID09IHR5cGUpIHsKLSAgICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbaW5kZXhdOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICBhZGRyZXNzID0gJTA4bHgsIGFkZGVuZCA9ICUwOGx4LCB0eXBlID0gJWQsIGhvd3RvID0gJTA4bHhcbiIsCi0JICAgX19GVU5DVElPTl9fLCByZWwtPmFkZHJlc3MsIHJlbC0+YWRkZW5kLCB0eXBlLCByZWwtPmhvd3RvKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLQotfQotCi0vKiBXcml0ZSBhIE5ldFdhcmUgc3BhcmMgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF92bWEgdmFsOwotICBzdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHRtcF9yZWxvYzsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBpbnQgdHlwZSA9IC0xOwotICByZWxvY19ob3d0b190eXBlICp0bXA7Ci0KLSAgCi0gIGZvciAoaW5kZXggPSAwOwotICAgICAgIGluZGV4IDwgc2l6ZW9mIChubG0zMl9zcGFyY19ob3d0b190YWJsZSkgLyBzaXplb2YocmVsb2NfaG93dG9fdHlwZSk7Ci0gICAgICAgaW5kZXgrKykgewotICAgIHRtcCA9ICZubG0zMl9zcGFyY19ob3d0b190YWJsZVtpbmRleF07Ci0KLSAgICBpZiAodG1wLT5yaWdodHNoaWZ0ID09IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQKLQkmJiB0bXAtPnNpemUgPT0gcmVsLT5ob3d0by0+c2l6ZQotCSYmIHRtcC0+Yml0c2l6ZSA9PSByZWwtPmhvd3RvLT5iaXRzaXplCi0JJiYgdG1wLT5wY19yZWxhdGl2ZSA9PSByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSYmIHRtcC0+Yml0cG9zID09IHJlbC0+aG93dG8tPmJpdHBvcwotCSYmIHRtcC0+c3JjX21hc2sgPT0gcmVsLT5ob3d0by0+c3JjX21hc2sKLQkmJiB0bXAtPmRzdF9tYXNrID09IHJlbC0+aG93dG8tPmRzdF9tYXNrKSB7Ci0gICAgICB0eXBlID0gdG1wLT50eXBlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmICh0eXBlID09IC0xKQotICAgIGFib3J0KCk7Ci0KLSAgLyoKLSAgICogTmV0d2FyZSB3YW50cyBhIGxpc3Qgb2YgcmVsb2NzIGZvciBlYWNoIGFkZHJlc3MuCi0gICAqIEZvcm1hdCBpczoKLSAgICoJbG9uZwlvZmZzZXQKLSAgICoJbG9uZwlhZGRlbmQKLSAgICoJY2hhcgl0eXBlCi0gICAqIFRoYXQgc2hvdWxkIGJlIGl0LgotICAgKi8KLQotICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKLSAgICAgc2VnbWVudC4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZgotICAgICB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICByZWxvY2F0aW9uLiAgKi8KLSNpZiAwCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsICgqcmVsLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pICsgcmVsLT5hZGRyZXNzOwotI2Vsc2UKLSAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICB2YWwgPSAlMDhseCwgYWRkZW5kID0gJTA4bHgsIHR5cGUgPSAlZFxuIiwKLQkgICBfX0ZVTkNUSU9OX18sIHZhbCwgcmVsLT5hZGRlbmQsIHJlbC0+aG93dG8tPnR5cGUpOwotI2VuZGlmCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgdG1wX3JlbG9jLm9mZnNldCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHJlbC0+YWRkZW5kLCB0bXBfcmVsb2MuYWRkZW5kKTsKLSAgYmZkX3B1dF84IChhYmZkLCAoc2hvcnQpKHJlbC0+aG93dG8tPnR5cGUpLCB0bXBfcmVsb2MudHlwZSk7Ci0KLSAgaWYgKGJmZF93cml0ZSAoJnRtcF9yZWxvYywgMTIsIDEsIGFiZmQpICE9IDEyKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFuZ2xlIHJlbG9jcyBmb3IgU1BBUkMgTmV0V2FyZS4gIFdlIGNhbiBqdXN0IHVzZSB0aGUgc3RhbmRhcmQKLSAgIFNQQVJDIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBOZXRXYXJlIHNwYXJjIGltcG9ydCByZWNvcmQgKi8KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotICAKLSAgLyoKLSAgICogRmlyc3QsIHJlYWQgaW4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9uCi0gICAqIGVudHJpZXMgZm9yIHRoaXMgc3ltYm9sCi0gICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgcmNvdW50ID0gYmZkX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIAotICAvKgotICAgKiBOZXh0LCByZWFkIGluIHRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbAotICAgKi8KLSAgCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyoKLSAgICogVGhlbiByZWFkIGluIHRoZSBzeW1ib2wKLSAgICovCi0gIAotICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKLSAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOwotICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAKLSAgLyoKLSAgICogTmV4dCwgc3RhcnQgcmVhZGluZyBpbiB0aGUgcmVsb2NzLgotICAgKi8KLSAgCi0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKCFubG1fcmVsb2NzKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX3NwYXJjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCi0JCQkgICAgICAmbmxtX3JlbG9jcyAtPiByZWxvYykKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBubG1fcmVsb2NzKys7Ci0gICAgICBzeW0gLT4gcmNudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGNoYXIgdGVtcFs0XTsKLSAgYXNlY3Rpb24gKmNvZGUsICpkYXRhLCAqYnNzLCAqc3ltc2VjOwotICBiZmRfdm1hIGJhc2U7Ci0KLSAgY29kZSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgYnNzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIHN5bXNlYyA9ICgqcmVsLT5zeW1fcHRyX3B0ciktPnNlY3Rpb247Ci0KLSAgaWYgKHN5bXNlYyA9PSBjb2RlKSB7Ci0gICAgYmFzZSA9IDA7Ci0gIH0gZWxzZSBpZiAoc3ltc2VjID09IGRhdGEpIHsKLSAgICBiYXNlID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZSk7Ci0gIH0gZWxzZSBpZiAoc3ltc2VjID09IGJzcykgewotICAgIGJhc2UgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlKSArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRhdGEpOwotICB9IGVsc2UKLSAgICBiYXNlID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgPCV4LCAxPlxuXHQiLAotCSAgIF9fRlVOQ1RJT05fXywgYmFzZSArICgqcmVsLT5zeW1fcHRyX3B0ciktPnZhbHVlKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCBiYXNlICsgKCpyZWwtPnN5bV9wdHJfcHRyKS0+dmFsdWUsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKXRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfcHV0XzMyIChhYmZkLCAxLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUil0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKG5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9leHBvcnQgKGFiZmQsIHN5bSwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBiZmRfYnl0ZSBsZW47Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICIlczogPCV4LCAlZCwgJXM+XG4iLAotCSAgIF9fRlVOQ1RJT05fXywgdmFsdWUsIHN0cmxlbiAoc3ltLT5uYW1lKSwgc3ltLT5uYW1lKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgdGVtcCk7Ci0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLQotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0Ci0gICAgICB8fCBiZmRfd3JpdGUgKCZsZW4sIDEsIDEsIGFiZmQpICE9IDEKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSN1bmRlZiBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4KLSN1bmRlZiBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0Ci0KLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9zcGFyY19iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgU1BBUkMgTW9kdWxlICAgXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKLSAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KLSAgYmZkX2FyY2hfc3BhcmMsCi0gIDAsCi0gIGZhbHNlLAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeF9mdW5jICovCi0gIG5sbV9zcGFyY19yZWFkX3JlbG9jLAotICBubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcywKLSAgbmxtX3NwYXJjX3JlYWRfaW1wb3J0LAotICBubG1fc3BhcmNfd3JpdGVfaW1wb3J0LAotICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KLSAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwsCi0gIG5sbV9zcGFyY193cml0ZV9leHBvcnQKLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkibmxtMzItc3BhcmMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQlubG1OQU1FKHNwYXJjX3ZlYykKLSNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX3NwYXJjX2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi5jIGIvYmZkL25sbTMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzBlNGYuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSAzMi1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLSNpbmNsdWRlICJubG1jb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtNjQuYyBiL2JmZC9ubG02NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNkOTZhLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG02NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDY0Ci0jaW5jbHVkZSAibmxtY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbWNvZGUuaCBiL2JmZC9ubG1jb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWMwYzMuLjAwMDAwMDAKLS0tIGEvYmZkL25sbWNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNTYgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgdXNpbmcgRUxGIHN1cHBvcnQgYXMgdGhlCi0gICB0ZW1wbGF0ZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLS8qIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGRvIG5vdCB1c2UgdGhlIG5hbWVzIHRoZXkgYXBwZWFyIHRvIHVzZS4KLSAgIFRoaXMgZmlsZSBpcyBhY3R1YWxseSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBzaXplCi0gICBvZiBOTE0gdGFyZ2V0IHdlIGFyZSB1c2luZy4gIEF0IGVhY2ggc2l6ZSB3ZSB1c2UgYSBkaWZmZXJlbnQgbmFtZSwKLSAgIGNvbnN0cnVjdGVkIGJ5IHRoZSBtYWNybyBubG1OQU1FLiAgRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiB3aGljaAotICAgaXMgbmFtZWQgbmxtX3N5bWJvbF90eXBlIGJlbG93IGlzIGFjdHVhbGx5IG5hbWVkIG5sbTMyX3N5bWJvbF90eXBlCi0gICBpbiB0aGUgZmluYWwgZXhlY3V0YWJsZS4gICovCi0KLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0ZpeGVkX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikKLQotI2RlZmluZSBubG1fc3ltYm9sX3R5cGUJCQlubG1OQU1FKHN5bWJvbF90eXBlKQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiCQkJbmxtTkFNRShnZXRfc3ltdGFiKQotI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wJCW5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0jZGVmaW5lIG5sbV9wcmludF9zeW1ib2wJCW5sbU5BTUUocHJpbnRfc3ltYm9sKQotI2RlZmluZSBubG1fZ2V0X3N5bWJvbF9pbmZvCQlubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZAlubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIG5sbV9vYmplY3RfcAkJCW5sbU5BTUUob2JqZWN0X3ApCi0jZGVmaW5lIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cwlubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2RlZmluZSBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzCW5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbihhYmZkLHNyYyxkc3QpIFwKLSAgKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jKGFiZmQpKShhYmZkLHNyYyxkc3QpCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQoYWJmZCxzcmMsZHN0KSBcCi0gIChubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMoYWJmZCkpKGFiZmQsc3JjLGRzdCkKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RhdGljIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGZpbmRfbm9uemVybwotICBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZQotICBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotCi0vKiBTaG91bGQgcGVyaGFwcyB1c2UgcHV0X29mZnNldCwgcHV0X3dvcmQsIGV0Yy4gIEZvciBub3csIHRoZSB0d28gdmVyc2lvbnMKLSAgIGNhbiBiZSBoYW5kbGVkIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyAzMiBiaXRzIG9yICJ0aGUgbG9uZyB0eXBlIi4gICovCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF82NAotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfNjQKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLQotY29uc3QgYmZkX3RhcmdldCAqCi1ubG1fb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IG5sbV90ZGF0YSAoYWJmZCk7Ci0gIGJvb2xlYW4gKCpiYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotICBQVFIgeF9meGRoZHIgPSBOVUxMOwotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7Ci0gIHN0cnVjdCBubG1fb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOwotICBjb25zdCBjaGFyICpzaWduYXR1cmU7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgaGF2ZSBhIHByZWZpeCBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTSBmaXhlZAotICAgICBoZWFkZXIuICAqLwotICBiYWNrZW5kX29iamVjdF9wID0gbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYyAoYWJmZCk7Ci0gIGlmIChiYWNrZW5kX29iamVjdF9wKQotICAgIHsKLSAgICAgIGlmICghKCpiYWNrZW5kX29iamVjdF9wKSAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgIH0KLQotICAvKiBSZWFkIGluIHRoZSBmaXhlZCBsZW5ndGggcG9ydGlvbiBvZiB0aGUgTkxNIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLwotCi0gIHhfZnhkaGRyID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSk7Ci0gIGlmICh4X2Z4ZGhkciA9PSBOVUxMKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgeF9meGRoZHIsIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpICE9Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBlbHNlCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBubG1fb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bwotICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KLQotICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBubG1fb2JqX3RkYXRhICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5sbV9vYmpfdGRhdGEpKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBubG1fdGRhdGEgKGFiZmQpID0gbmV3X3RkYXRhOwotCi0gIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gKGFiZmQsIHhfZnhkaGRyLCBpX2Z4ZGhkcnApOwotICBmcmVlICh4X2Z4ZGhkcik7Ci0gIHhfZnhkaGRyID0gTlVMTDsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbiBOTE0gZmlsZSBmb3IgdGhpcyBiYWNrZW5kIGJ5IG1hdGNoaW5nCi0gICAgIHRoZSBOTE0gc2lnbmF0dXJlLiAqLwotCi0gIHNpZ25hdHVyZSA9IG5sbV9zaWduYXR1cmUgKGFiZmQpOwotICBpZiAoc2lnbmF0dXJlICE9IE5VTEwKLSAgICAgICYmICpzaWduYXR1cmUgIT0gJ1wwJwotICAgICAgJiYgc3RybmNtcCAoKGNoYXIgKikgaV9meGRoZHJwLT5zaWduYXR1cmUsIHNpZ25hdHVyZSwKLQkJICBOTE1fU0lHTkFUVVJFX1NJWkUpICE9IDApCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIFRoZXJlJ3Mgbm8gc3VwcG9ydGVkIHdheSB0byBkaXNjb3ZlciB0aGUgZW5kaWFuZXNzIG9mIGFuIE5MTSwgc28gdGVzdCBmb3IKLSAgICAgYSBzYW5lIHZlcnNpb24gbnVtYmVyIGFmdGVyIGRvaW5nIGJ5dGUgc3dhcHBpbmcgYXBwcm9wcmlhdGUgZm9yIHRoaXMKLSAgICAgWFZFQy4gIChIYWNrIGFsZXJ0ISkgKi8KLQotICBpZiAoaV9meGRoZHJwLT52ZXJzaW9uID4gMHhGRkZGKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBUaGVyZSdzIG5vIHN1cHBvcnRlZCB3YXkgdG8gY2hlY2sgZm9yIDMyIGJpdCB2ZXJzdXMgNjQgYml0IGFkZHJlc3NlcywKLSAgICAgc28gaWdub3JlIHRoaXMgZGlzdGluY3Rpb24gZm9yIG5vdy4gIChGSVhNRSkgKi8KLQotICAvKiBTd2FwIGluIHRoZSByZXN0IG9mIHRoZSByZXF1aXJlZCBoZWFkZXIuICAqLwotICBpZiAoIW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9pbiAoYWJmZCkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSBzZWN0aW9ucyBzdXBwbGllZCBieSBhbGwgTkxNJ3MsIGFuZCB0aGVuIHJlYWQgaW4gdGhlCi0gICAgIGF1eGlsaWFyeSBoZWFkZXJzLiAgUmVhZGluZyB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMgbWF5IGNyZWF0ZQotICAgICBhZGRpdGlvbmFsIHNlY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUgY3lnbnVzX2V4dCBoZWFkZXIuCi0gICAgIEZyb20gdGhpcyBwb2ludCBvbiB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFuIE5MTSwgYW5kIGRvIG5vdAotICAgICB0cmVhdCBlcnJvcnMgYXMgaW5kaWNhdGluZyB0aGUgd3JvbmcgZm9ybWF0LiAgKi8KLQotICBpZiAoIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0NPREVfTkFNRSwKLQkJCWlfZnhkaGRycC0+Y29kZUltYWdlT2Zmc2V0LAotCQkJaV9meGRoZHJwLT5jb2RlSW1hZ2VTaXplLAotCQkJKFNFQ19DT0RFIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgfCBTRUNfUkVMT0MpKQotICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSwKLQkJCSAgIGlfZnhkaGRycC0+ZGF0YUltYWdlT2Zmc2V0LAotCQkJICAgaV9meGRoZHJwLT5kYXRhSW1hZ2VTaXplLAotCQkJICAgKFNFQ19EQVRBIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgICAgfCBTRUNfUkVMT0MpKQotICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FLAotCQkJICAgKGZpbGVfcHRyKSAwLAotCQkJICAgaV9meGRoZHJwLT51bmluaXRpYWxpemVkRGF0YVNpemUsCi0JCQkgICBTRUNfQUxMT0MpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmICghbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlB1YmxpY3MgIT0gMAotICAgICAgfHwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIGFyY2ggPSBubG1fYXJjaGl0ZWN0dXJlIChhYmZkKTsKLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCAodW5zaWduZWQgbG9uZykgMCk7Ci0KLSAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVTdGFydE9mZnNldDsKLQotICByZXR1cm4gKGFiZmQtPnh2ZWMpOwotCi1nb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLWdvdF9ub19tYXRjaDoKLSAgbmxtX3RkYXRhIChhYmZkKSA9IHByZXNlcnZlZF90ZGF0YTsKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEpOwotICBpZiAoeF9meGRoZHIgIT0gTlVMTCkKLSAgICBmcmVlICh4X2Z4ZGhkcik7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qIEFkZCBhIHNlY3Rpb24gdG8gdGhlIGJmZC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgbmFtZSwgb2Zmc2V0LCBzaXplLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICB9Ci0gIG5ld3NlY3QtPnZtYSA9IDA7CQkvKiBOTE0ncyBhcmUgcmVsb2NhdGFibGUuICovCi0gIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IHNpemU7Ci0gIG5ld3NlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7Ci0gIG5ld3NlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IGJmZF9sb2cyICgwKTsJLyogRklYTUUgKi8KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCBpbiB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlci4gIEFsbCB0aGUgZmllbGRzIG11c3QKLSAgIGV4aXN0IGluIHRoZSBOTE0sIGFuZCBtdXN0IGV4aXN0IGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWFkIGhlcmUuICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uVGV4dCwKLQkJbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHN0YWNrU2l6ZSBmaWVsZC4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zdGFja1NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRlbXApOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHJlc2VydmVkIGZpZWxkLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnJlc2VydmVkID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLQotICAvKiBSZWFkIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBSZWFkIHRoZSBzY3JlZW4gbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgsCi0JCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWUsCi0JCW5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogUmVhZCB0aGUgdGhyZWFkIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAotCQlubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEsCi0JCTEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBTd2FwIGFuZCB3cml0ZSBvdXQgdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIuICBBbGwgdGhlIGZpZWxkcyBtdXN0Ci0gICBleGlzdCBpbiB0aGUgTkxNLCBhbmQgbXVzdCBleGlzdCBpbiB0aGlzIG9yZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBXcml0ZSB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25UZXh0LAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBDb252ZXJ0IGFuZCB3cml0ZSB0aGUgc3RhY2tTaXplIGZpZWxkLiAqLwotCi0gIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnN0YWNrU2l6ZSwKLQkgICAgKGJmZF9ieXRlICopIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIENvbnZlcnQgYW5kIHdyaXRlIHRoZSByZXNlcnZlZCBmaWVsZC4gKi8KLQotICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZCwKLQkgICAgKGJmZF9ieXRlICopIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBXcml0ZSB0aGUgc2NyZWVuIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCwKLQkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZSwKLQkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSB0aHJlYWQgbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJlYWQgYW5kIHN3YXAgaW4gdGhlIGNvbnRlbnRzIG9mIGFsbCB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMuICBCZWNhdXNlIG9mCi0gICB0aGUgYnJhaW5kZWFkIGRlc2lnbiwgd2UgaGF2ZSB0byBkbyBzdHJjbXBzIG9uIHN0cmluZ3Mgb2YgaW5kZXRlcm1pbmF0ZQotICAgbGVuZ3RoIHRvIGZpZ3VyZSBvdXQgd2hhdCBlYWNoIGF1eGlsaWFyeSBoZWFkZXIgaXMuICBFdmVuIHdvcnNlLCB3ZSBoYXZlCi0gICBubyB3YXkgb2Yga25vd2luZyBob3cgbWFueSBhdXhpbGlhcnkgaGVhZGVycyB0aGVyZSBhcmUgb3Igd2hlcmUgdGhlIGVuZAotICAgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzIGFyZSwgZXhjZXB0IGJ5IGZpbmRpbmcgc29tZXRoaW5nIHRoYXQgZG9lc24ndAotICAgbG9vayBsaWtlIGEga25vd24gYXV4aWxpYXJ5IGhlYWRlci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlyc3QgbmV3IHR5cGUKLSAgIG9mIGF1eGlsaWFyeSBoZWFkZXIgYWRkZWQgd2lsbCBicmVhayBhbGwgZXhpc3RpbmcgdG9vbHMgdGhhdCBkb24ndAotICAgcmVjb2duaXplIGl0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciB0ZW1wc3RyWzE2XTsKLSAgbG9uZyBwb3NpdGlvbjsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHBvc2l0aW9uID0gYmZkX3RlbGwgKGFiZmQpOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wc3RyLCBzaXplb2YgKHRlbXBzdHIpLCAxLCBhYmZkKSAhPQotCSAgc2l6ZW9mICh0ZW1wc3RyKSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcG9zaXRpb24sIFNFRUtfU0VUKSA9PSAtMSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiVmVSc0lvTiMiLCA4KSA9PSAwKQotCXsKLQkgIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlciB0aGRyOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgbWVtY3B5IChubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tYWpvclZlcnNpb24pOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1pbm9yVmVyc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXZpc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnllYXIpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubW9udGgpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRheSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIk1lU3NBZ0VzIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICBtZW1jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlEID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmxhbmd1YWdlSUQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc09mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZENvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucHJvZHVjdElEKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQwKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQxKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQyKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQzKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ1KTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiQ29QeVJpR2hUPSIsIDEwKSA9PSAwKQotCXsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwKLQkJCXNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCksCi0JCQkxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCkpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIChubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCkKLQkJCQkgLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoKSwKLQkJCTEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgLyogVGhlIGNvcHlyaWdodCBtZXNzYWdlIGlzIGEgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4gKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlLAotCQkgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKLQkJCTEsIGFiZmQpICE9Ci0JICAgICAgKChiZmRfc2l6ZV90eXBlKQotCSAgICAgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIkN1U3RIZUFkIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlciB0aGRyOwotCSAgYmZkX3NpemVfdHlwZSBoZHJMZW5ndGg7Ci0JICBmaWxlX3B0ciBkYXRhT2Zmc2V0OwotCSAgYmZkX3NpemVfdHlwZSBkYXRhTGVuZ3RoOwotCSAgY2hhciBkYXRhU3RhbXBbOF07Ci0JICBQVFIgaGRyOwotCi0JICAvKiBSZWFkIHRoZSBzdGFtcCAoIkN1U3RIZUFkIikuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLnN0YW1wLCAxLCBzaXplb2YgKHRoZHIuc3RhbXApLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkci5zdGFtcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGlzIGN1c3RvbSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLmxlbmd0aCwgMSwgc2l6ZW9mICh0aGRyLmxlbmd0aCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mICh0aGRyLmxlbmd0aCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGhkckxlbmd0aCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5sZW5ndGgpOwotCSAgLyogUmVhZCBmdXJ0aGVyIGZpZWxkcyBpZiB3ZSBoYXZlIHRoZW0uICAqLwotCSAgaWYgKGhkckxlbmd0aCA8IE5MTV9UQVJHRVRfTE9OR19TSVpFKQotCSAgICBkYXRhT2Zmc2V0ID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhT2Zmc2V0LCAxLAotCQkJICAgIHNpemVvZiAodGhkci5kYXRhT2Zmc2V0KSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHRoZHIuZGF0YU9mZnNldCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkYXRhT2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFPZmZzZXQpOwotCSAgICB9Ci0JICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFKQotCSAgICBkYXRhTGVuZ3RoID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhTGVuZ3RoLCAxLAotCQkJICAgIHNpemVvZiAodGhkci5kYXRhTGVuZ3RoKSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHRoZHIuZGF0YUxlbmd0aCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkYXRhTGVuZ3RoID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFMZW5ndGgpOwotCSAgICB9Ci0JICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKLQkgICAgbWVtc2V0IChkYXRhU3RhbXAsIDAsIHNpemVvZiAoZGF0YVN0YW1wKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGRhdGFTdGFtcCwgMSwgc2l6ZW9mIChkYXRhU3RhbXApLCBhYmZkKQotCQkgICE9IHNpemVvZiAoZGF0YVN0YW1wKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwgaWYgYW55LiAgKi8KLQkgIGlmIChoZHJMZW5ndGggPD0gMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKLQkgICAgewotCSAgICAgIGhkciA9IE5VTEw7Ci0JICAgICAgaGRyTGVuZ3RoID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaGRyTGVuZ3RoIC09IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDg7Ci0JICAgICAgaGRyID0gYmZkX2FsbG9jIChhYmZkLCBoZHJMZW5ndGgpOwotCSAgICAgIGlmIChoZHIgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCBoZHJMZW5ndGgsIGFiZmQpICE9IGhkckxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgZm91bmQgYSBDeWdudXMgaGVhZGVyLCBwcm9jZXNzIGl0LiAgT3RoZXJ3aXNlLAotCSAgICAganVzdCBzYXZlIHRoZSBhc3NvY2lhdGVkIGRhdGEgd2l0aG91dCB0cnlpbmcgdG8gaW50ZXJwcmV0Ci0JICAgICBpdC4gICovCi0JICBpZiAoc3RybmNtcCAoZGF0YVN0YW1wLCAiQ3lHblVzRXgiLCA4KSA9PSAwKQotCSAgICB7Ci0JICAgICAgZmlsZV9wdHIgcG9zOwotCSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQkgICAgICBiZmRfYnl0ZSAqcCwgKnBlbmQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChoZHJMZW5ndGggPT0gMCAmJiBoZHIgPT0gTlVMTCk7Ci0KLQkgICAgICBwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhT2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YUxlbmd0aCk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3JlYWQgKGNvbnRlbnRzLCAxLCBkYXRhTGVuZ3RoLCBhYmZkKSAhPSBkYXRhTGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBwb3MsIFNFRUtfU0VUKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBtZW1jcHkgKG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCksICJDeUduVXNFeCIsIDgpOwotCSAgICAgIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPm9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0JICAgICAgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoID0gZGF0YUxlbmd0aDsKLQotCSAgICAgIC8qIFRoaXMgZGF0YSB0aGlzIGhlYWRlciBwb2ludHMgdG8gcHJvdmlkZXMgYSBsaXN0IG9mCi0JCSB0aGUgc2VjdGlvbnMgd2hpY2ggd2VyZSBpbiB0aGUgb3JpZ2luYWwgb2JqZWN0IGZpbGUKLQkJIHdoaWNoIHdhcyBjb252ZXJ0ZWQgdG8gYmVjb21lIGFuIE5MTS4gIFdlIGxvY2F0ZQotCQkgdGhvc2Ugc2VjdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBCRkQuICBOb3RlIHRoYXQKLQkJIHRoaXMgaXMgbGlrZWx5IHRvIGNyZWF0ZSBhIHNlY29uZCAudGV4dCwgLmRhdGEgYW5kCi0JCSAuYnNzIHNlY3Rpb247IHJldHJpZXZpbmcgdGhlIHNlY3Rpb25zIGJ5IG5hbWUgd2lsbAotCQkgZ2V0IHRoZSBhY3R1YWwgTkxNIHNlY3Rpb25zLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgdG8KLQkJIGhhcHBlbi4gIFRoZSBzZWN0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCB3aGljaAotCQkgbWF5IGJlIHN1YnNldHMgb2YgdGhlIE5MTSBzZWN0aW9uLCBjYW4gb25seSBiZSBmb3VuZAotCQkgdXNpbmcgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQkgICAgICBwID0gY29udGVudHM7Ci0JICAgICAgcGVuZCA9IHAgKyBkYXRhTGVuZ3RoOwotCSAgICAgIHdoaWxlIChwIDwgcGVuZCkKLQkJewotCQkgIGNoYXIgKm5hbWU7Ci0JCSAgc2l6ZV90IGw7Ci0JCSAgZmlsZV9wdHIgZmlsZXBvczsKLQkJICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JCSAgYXNlY3Rpb24gKm5ld3NlYzsKLQotCQkgIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcwotCQkgICAgIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIG5hbWUKLQkJICAgICB6ZXJvZXMgdG8gYWRqdXN0IHRvIDQgYnl0ZSBib3VuZGFyeQotCQkgICAgIDQgYnl0ZSBzZWN0aW9uIGRhdGEgZmlsZSBwb2ludGVyCi0JCSAgICAgNCBieXRlIHNlY3Rpb24gc2l6ZQotCQkgICAgICovCi0KLQkJICBuYW1lID0gKGNoYXIgKikgcDsKLQkJICBsID0gc3RybGVuIChuYW1lKSArIDE7Ci0JCSAgbCA9IChsICsgMykgJn4gMzsKLQkJICBwICs9IGw7Ci0JCSAgZmlsZXBvcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcCk7Ci0JCSAgcCArPSA0OwotCQkgIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCQkgIHAgKz0gNDsKLQotCQkgIG5ld3NlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLQkJICBpZiAobmV3c2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIG5ld3NlYy0+X3Jhd19zaXplID0gc2l6ZTsKLQkJICBpZiAoZmlsZXBvcyAhPSAwKQotCQkgICAgewotCQkgICAgICBuZXdzZWMtPmZpbGVwb3MgPSBmaWxlcG9zOwotCQkgICAgICBuZXdzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPnN0YW1wLCB0aGRyLnN0YW1wLAotCQkgICAgICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCA9IGhkckxlbmd0aDsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQgPSBkYXRhT2Zmc2V0OwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGg7Ci0JICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwgZGF0YVN0YW1wLAotCQkgICAgICBzaXplb2YgKGRhdGFTdGFtcCkpOwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyID0gaGRyOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGEgbm9uLXplcm8gYnl0ZSBpbiBhIG1lbW9yeSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1maW5kX25vbnplcm8gKGJ1Ziwgc2l6ZSkKLSAgICAgUFRSIGJ1ZjsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIGNoYXIgKnAgPSAoY2hhciAqKSBidWY7Ci0KLSAgd2hpbGUgKHNpemUtLSAhPSAwKQotICAgIGlmICgqcCsrICE9IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTd2FwIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzLiAgV2UgY3JlYXRlIHRob3NlCi0gICBhdXhpbGlhcnkgaGVhZGVycyB3aGljaCBoYXZlIGJlZW4gc2V0IG5vbi16ZXJvLiAgV2UgZG8gbm90IHJlcXVpcmUKLSAgIHRoZSBjYWxsZXIgdG8gc2V0IHVwIHRoZSBzdGFtcCBmaWVsZHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIFdyaXRlIG91dCB0aGUgdmVyc2lvbiBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIlZlUnNJb04jIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIubWFqb3JWZXJzaW9uKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgdGhkci5taW5vclZlcnNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIucmV2aXNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyLAotCQkoYmZkX2J5dGUgKikgdGhkci55ZWFyKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1vbnRoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5LAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlbmRlZCBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKSkKLSAgICB7Ci0gICAgICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlELAotCQkoYmZkX2J5dGUgKikgdGhkci5sYW5ndWFnZUlEKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnByb2R1Y3RJRCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMSk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMyk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIC8qIFdyaXRlIG91dCB0aGUgY29weXJpZ2h0IGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ29QeVJpR2hUPSIsIDEwKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRoZHIuc3RhbXAsIHNpemVvZiAodGhkci5zdGFtcCksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHRoZHIuc3RhbXApKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHRoZHIuY29weXJpZ2h0TWVzc2FnZUxlbmd0aFswXSA9Ci0JbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGhkci5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFRoZSBjb3B5cmlnaHQgbWVzc2FnZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2UsCi0JCSAgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKLQkJICAgICAxLCBhYmZkKSAhPQotCSAgKChiZmRfc2l6ZV90eXBlKQotCSAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBjdXN0b20gaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLSAgICAgIGJvb2xlYW4gZHM7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKLQotICAgICAgZHMgPSBmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wLAotCQkJIHNpemVvZiAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXApKTsKLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkN1U3RIZUFkIiwgOCk7Ci0gICAgICBoZHJMZW5ndGggPSAoMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgKGRzID8gOCA6IDApCi0JCSAgICsgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIGhkckxlbmd0aCwgdGhkci5sZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQsCi0JCXRoZHIuZGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCwKLQkJdGhkci5kYXRhTGVuZ3RoKTsKLSAgICAgIGlmICghIGRzKQotCXsKLQkgIEJGRF9BU1NFUlQgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoID09IDApOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIDEsCi0JCQkgc2l6ZW9mICh0aGRyKSAtIHNpemVvZiAodGhkci5kYXRhU3RhbXApLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkcikgLSBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKHRoZHIuZGF0YVN0YW1wLCBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGJmZF93cml0ZSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHIsIDEsCi0JCQkgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgsIGFiZmQpCi0JICAgICAgIT0gbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgQ3lnbnVzIGRlYnVnZ2luZyBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ3VTdEhlQWQiLCA4KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCwKLQkJKGJmZF9ieXRlICopIHRoZHIubGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+b2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhTGVuZ3RoKTsKLSAgICAgIG1lbWNweSAodGhkci5kYXRhU3RhbXAsICJDeUduVXNFeCIsIDgpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgcmVhZCB0aGUgTkxNJ3MgcHVibGljIHN5bWJvbHMgYW5kIHVzZSBpdCB0byBnZW5lcmF0ZSBhIGJmZCBzeW1ib2wKLSAgIHRhYmxlIChoZXksIGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZykgb24gYSBvbmUtZm9yLW9uZSBiYXNpcy4gIFRodXMKLSAgIHVzZSB0aGUgbnVtYmVyIG9mIHB1YmxpYyBzeW1ib2xzIGFzIHRoZSBudW1iZXIgb2YgYmZkIHN5bWJvbHMgd2Ugd2lsbAotICAgaGF2ZSBvbmNlIHdlIGFjdHVhbGx5IGdldCBhcm91bmQgdG8gcmVhZGluZyB0aGVtIGluLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLCBiYXNlZCBvbgotICAgdGhlIGNvdW50IHBsdXMgMSwgc2luY2Ugd2Ugd2lsbCBOVUxMIHRlcm1pbmF0ZSB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZAotICAgb24gdGhpcyBzaXplLiAqLwotCi1sb25nCi1ubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CS8qIE5sbSBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplID0gMDsKLQotICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKLSAgc3ltY291bnQgPSAoaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3MKLQkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMKLQkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCArIDEpICogKHNpemVvZiAoYXN5bWJvbCkpOwotICByZXR1cm4gKHN5bXRhYl9zaXplKTsKLX0KLQotLyogTm90ZSB0aGF0IGJmZF9nZXRfc3ltY291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIGlmIHNsdXJwaW5nIHRoZQotICAgc3ltYm9sIHRhYmxlIGZhaWxzLiAqLwotCi1sb25nCi1ubG1fZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIG5sbV9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLSAgYmZkX3NpemVfdHlwZSBjb3VudGVyID0gMDsKLQotICBpZiAobmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIC0xOwotICBzeW1iYXNlID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgd2hpbGUgKGNvdW50ZXIgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICAqYWxvY2F0aW9uKysgPSAmc3ltYmFzZS0+c3ltYm9sOwotICAgICAgc3ltYmFzZSsrOwotICAgICAgY291bnRlcisrOwotICAgIH0KLSAgKmFsb2NhdGlvbiA9IChhc3ltYm9sICopIE5VTEw7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogTWFrZSBhbiBOTE0gc3ltYm9sLiAgVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuICAqLwotCi1hc3ltYm9sICoKLW5sbV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBubG1fc3ltYm9sX3R5cGUgKm5ldzsKLQotICBuZXcgPSAobmxtX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAobmxtX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIEdldCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi12b2lkCi1ubG1fZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFByaW50IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0KLXZvaWQKLW5sbV9wcmludF9zeW1ib2wgKGFiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGlmIChzeW1ib2wtPm5hbWUpCi0JZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzIiwgc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGlmIChzeW1ib2wtPm5hbWUpCi0JZnByaW50ZiAoZmlsZSwgIiAlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFNsdXJwIGluIG5sbSBzeW1ib2wgdGFibGUuCi0KLSAgIEluIHRoZSBleHRlcm5hbCAoaW4tZmlsZSkgZm9ybSwgTkxNIGV4cG9ydCByZWNvcmRzIGFyZSB2YXJpYWJsZSBsZW5ndGgsCi0gICB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotCTEgYnl0ZQkJbGVuZ3RoIG9mIHRoZSBzeW1ib2wgbmFtZSAoTikKLQlOIGJ5dGVzCQl0aGUgc3ltYm9sIG5hbWUKLQk0IGJ5dGVzCQl0aGUgc3ltYm9sIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGl0J3Mgc2VjdGlvbgotCi0gICBXZSBhbHNvIHJlYWQgaW4gdGhlIGRlYnVnZ2luZyBzeW1ib2xzIGFuZCBpbXBvcnQgcmVjb3Jkcy4gIEltcG9ydAotICAgcmVjb3JkcyBhcmUgdHJlYXRlZCBhcyB1bmRlZmluZWQgc3ltYm9scy4gIEFzIHdlIHJlYWQgdGhlIGltcG9ydAotICAgcmVjb3JkcyB3ZSBhbHNvIHJlYWQgaW4gdGhlIGFzc29jaWF0ZWQgcmVsb2MgaW5mb3JtYXRpb24sIHdoaWNoIGlzCi0gICBhdHRhY2hlZCB0byB0aGUgc3ltYm9sLgotCi0gICBUaGUgYmZkIHN5bWJvbHMgYXJlIGNvcGllZCB0byBTWU1QVFJTLgotCi0gICBXaGVuIHdlIHJldHVybiwgdGhlIGJmZCBzeW1jb3VudCBpcyBlaXRoZXIgemVybyBvciBjb250YWlucyB0aGUgY29ycmVjdAotICAgbnVtYmVyIG9mIHN5bWJvbHMuCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CS8qIE5sbSBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBiZmRfc2l6ZV90eXBlIHRvdHN5bWNvdW50OwkvKiBOdW1iZXIgb2YgTkxNIHN5bWJvbHMgKi8KLSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsJLyogQ291bnRlciBvZiBOTE0gc3ltYm9scyAqLwotICBubG1fc3ltYm9sX3R5cGUgKnN5bTsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBiZmQgc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkvKiBTeW1ib2wgbGVuZ3RoIHJlYWQgaW50byBoZXJlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltdHlwZTsJLyogVHlwZSBvZiBkZWJ1Z2dpbmcgc3ltYm9sICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiBTeW1ib2wgb2Zmc2V0cyByZWFkIGludG8gaGVyZSAqLwotICBib29sZWFuICgqcmVhZF9pbXBvcnRfZnVuYykgUEFSQU1TICgoYmZkICosIG5sbV9zeW1ib2xfdHlwZSAqKSk7Ci0gIGJvb2xlYW4gKCpzZXRfcHVibGljX3NlY3Rpb25fZnVuYykgUEFSQU1TICgoYmZkICosIG5sbV9zeW1ib2xfdHlwZSAqKSk7Ci0KLSAgaWYgKG5sbV9nZXRfc3ltYm9scyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gKHRydWUpOwotCi0gIC8qIFJlYWQgZWFjaCByYXcgTkxNIHN5bWJvbCwgdXNpbmcgdGhlIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBiZmQKLSAgICAgc3ltYm9sIHRhYmxlIGVudHJ5LgotCi0gICAgIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSB0aGUgaW5pdGlhbCBiZmQgY2Fub25pY2FsIHN5bWJvbCBidWZmZXIgYmFzZWQgb24gYQotICAgICBvbmUtdG8tb25lIG1hcHBpbmcgb2YgdGhlIE5MTSBzeW1ib2xzIHRvIGNhbm9uaWNhbCBzeW1ib2xzLiAgV2UgYWN0dWFsbHkKLSAgICAgdXNlIGFsbCB0aGUgTkxNIHN5bWJvbHMsIHNvIHRoZXJlIHdpbGwgYmUgbm8gc3BhY2UgbGVmdCBvdmVyIGF0IHRoZSBlbmQuCi0gICAgIFdoZW4gd2UgaGF2ZSBhbGwgdGhlIHN5bWJvbHMsIHdlIGJ1aWxkIHRoZSBjYWxsZXIncyBwb2ludGVyIHZlY3Rvci4gKi8KLQotICBhYmZkLT5zeW1jb3VudCA9IDA7Ci0gIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOwotICB0b3RzeW1jb3VudCA9IChpX2Z4ZGhkcnAtPm51bWJlck9mUHVibGljcwotCQkgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzCi0JCSArIGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBpZiAodG90c3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+cHVibGljc09mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIHN5bSA9ICgobmxtX3N5bWJvbF90eXBlICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIHRvdHN5bWNvdW50ICogc2l6ZW9mIChubG1fc3ltYm9sX3R5cGUpKSk7Ci0gIGlmICghc3ltKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmxtX3NldF9zeW1ib2xzIChhYmZkLCBzeW0pOwotCi0gIC8qIFdlIHVzZSB0aGUgYmZkJ3Mgc3ltY291bnQgZGlyZWN0bHkgYXMgdGhlIGNvbnRyb2wgY291bnQsIHNvIHRoYXQgZWFybHkKLSAgICAgdGVybWluYXRpb24gb2YgdGhlIGxvb3AgbGVhdmVzIHRoZSBzeW1jb3VudCBjb3JyZWN0IGZvciB0aGUgc3ltYm9scyB0aGF0Ci0gICAgIHdlcmUgcmVhZC4gKi8KLQotICBzZXRfcHVibGljX3NlY3Rpb25fZnVuYyA9IG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYyAoYWJmZCk7Ci0gIHN5bWNvdW50ID0gaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3M7Ci0gIHdoaWxlIChhYmZkLT5zeW1jb3VudCA8IHN5bWNvdW50KQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICAgICAgc3ltLT5zeW1ib2wubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gICAgICBpZiAoIXN5bS0+c3ltYm9sLm5hbWUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBzeW0tPnN5bWJvbC5uYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpCi0JICAhPSBzeW1sZW5ndGgpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICAvKiBDYXN0IGF3YXkgY29uc3QuICAqLwotICAgICAgKChjaGFyICopIChzeW0tPnN5bWJvbC5uYW1lKSlbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyA9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOwotICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgdGVtcCk7Ci0gICAgICBpZiAoc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMpCi0JewotCSAgLyogTW9zdCBiYWNrZW5kcyBjYW4gdXNlIHRoZSBjb2RlIGJlbG93LCBidXQgdW5mb3J0dW5hdGVseQotCSAgICAgc29tZSB1c2UgYSBkaWZmZXJlbnQgc2NoZW1lLiAgKi8KLQkgIGlmICgoKnNldF9wdWJsaWNfc2VjdGlvbl9mdW5jKSAoYWJmZCwgc3ltKSA9PSBmYWxzZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc3ltLT5zeW1ib2wudmFsdWUgJiBOTE1fSElCSVQpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+TkxNX0hJQklUOwotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCSAgICB9Ci0JfQotICAgICAgc3ltLT5yY250ID0gMDsKLSAgICAgIGFiZmQtPnN5bWNvdW50Kys7Ci0gICAgICBzeW0rKzsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgZGVidWdnaW5nIHJlY29yZHMuICAqLwotCi0gIGlmIChpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+ZGVidWdJbmZvT2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIChmYWxzZSk7Ci0KLSAgICAgIHN5bWNvdW50ICs9IGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHM7Ci0gICAgICB3aGlsZSAoYWJmZC0+c3ltY291bnQgPCBzeW1jb3VudCkKLQl7Ci0JICBpZiAoKGJmZF9yZWFkICgoUFRSKSAmIHN5bXR5cGUsIHNpemVvZiAoc3ltdHlwZSksIDEsIGFiZmQpCi0JICAgICAgICE9IHNpemVvZiAoc3ltdHlwZSkpCi0JICAgfHwgYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkKLQkgICAgICB8fCAoYmZkX3JlYWQgKChQVFIpICYgc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0JCSAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW0tPnN5bWJvbC5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLQkgIGlmICghc3ltLT5zeW1ib2wubmFtZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSBzeW0tPnN5bWJvbC5uYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpCi0JICAgICAgIT0gc3ltbGVuZ3RoKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIC8qIENhc3QgYXdheSBjb25zdC4gICovCi0JICAoKGNoYXIgKikgKHN5bS0+c3ltYm9sLm5hbWUpKVtzeW1sZW5ndGhdID0gJ1wwJzsKLQkgIHN5bS0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgc3ltLT5zeW1ib2wudmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgdGVtcCk7Ci0JICBpZiAoc3ltdHlwZSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3ltdHlwZSA9PSAxKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0JICBzeW0tPnJjbnQgPSAwOwotCSAgYWJmZC0+c3ltY291bnQrKzsKLQkgIHN5bSsrOwotCX0KLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgaW1wb3J0IHJlY29yZHMuICBXZSBjYW4gb25seSBkbyB0aGlzIGlmIHdlIGtub3cgaG93Ci0gICAgIHRvIHJlYWQgcmVsb2NzIGZvciB0aGlzIHRhcmdldC4gICovCi0KLSAgcmVhZF9pbXBvcnRfZnVuYyA9IG5sbV9yZWFkX2ltcG9ydF9mdW5jIChhYmZkKTsKLSAgaWYgKHJlYWRfaW1wb3J0X2Z1bmMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0LCBTRUVLX1NFVCkKLQkgID09IC0xKQotCXJldHVybiAoZmFsc2UpOwotCi0gICAgICBzeW1jb3VudCArPSBpX2Z4ZGhkcnAtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOwotICAgICAgd2hpbGUgKGFiZmQtPnN5bWNvdW50IDwgc3ltY291bnQpCi0JewotCSAgaWYgKCgqcmVhZF9pbXBvcnRfZnVuYykgKGFiZmQsIHN5bSkgPT0gZmFsc2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN5bSsrOwotCSAgYWJmZC0+c3ltY291bnQrKzsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0MCi0vKiBHZXQgdGhlIHJlbG9jcyBmb3IgYW4gTkxNIGZpbGUuICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHJlbG9jcy4KLSAgIEltcG9ydHMgYXJlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBvdGhlciBOTE0gZmlsZXMuICBXZQotICAgdHJlYXQgdGhlc2UgYXMgcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMuICBSZWxvY2F0aW9uIGZpeHVwcwotICAgYXJlIGludGVybmFsIHJlbG9jcy4KLQotICAgVGhlIGFjdHVhbCBmb3JtYXQgdXNlZCB0byBzdG9yZSB0aGUgcmVsb2NzIGlzIG1hY2hpbmUgc3BlY2lmaWMuICAqLwotCi0vKiBSZWFkIGluIHRoZSByZWxvY2F0aW9uIGZpeHVwIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBzdG9yZWQgaW4KLSAgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcywgYW4gYXJyYXkgb2YgYXJlbGVudCBzdHJ1Y3R1cmVzLCBhbmQKLSAgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MsIGFuIGFycmF5IG9mIHNlY3Rpb24gcG9pbnRlcnMuICBUaGUKLSAgIHNlY3Rpb24gcG9pbnRlcnMgYXJlIG5lZWRlZCBiZWNhdXNlIHRoZSByZWxvY3MgYXJlIG5vdCBzb3J0ZWQgYnkKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuICgqcmVhZF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgbmxtX3N5bWJvbF90eXBlICosIGFzZWN0aW9uICoqLAotCQkJCWFyZWxlbnQgKikpOwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICBhcmVsZW50ICpyZWxzOwotICBhc2VjdGlvbiAqKnNlY3M7Ci0KLSAgaWYgKG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmVhZF9mdW5jID0gbmxtX3JlYWRfcmVsb2NfZnVuYyAoYWJmZCk7Ci0gIGlmIChyZWFkX2Z1bmMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQsCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb3VudCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0gIHJlbHMgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHNlY3MgPSAoYXNlY3Rpb24gKiopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKChyZWxzID09IE5VTEwgfHwgc2VjcyA9PSBOVUxMKSAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKSA9IHJlbHM7Ci0gIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MgKGFiZmQpID0gc2VjczsKLQotICAvKiBXZSBoYXZlIHRvIHJlYWQgcGllY2UgYnkgcGllY2UsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgbGFyZ2UKLSAgICAgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcmVsb2MgaW5mb3JtYXRpb24gaXMuICAqLwotICB3aGlsZSAoY291bnQtLSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoKnJlYWRfZnVuYykgKGFiZmQsIChubG1fc3ltYm9sX3R5cGUgKikgTlVMTCwgc2VjcywgcmVscykgPT0gZmFsc2UpCi0JewotCSAgbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKSA9IE5VTEw7Ci0JICBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzIChhYmZkKSA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKytzZWNzOwotICAgICAgKytyZWxzOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBudW1iZXIgb2YgcmVsb2NzLiAgVGhpcyByZWFsbHkganVzdCByZXR1cm5zIGFuIHVwcGVyIGJvdW5kLAotICAgc2luY2UgaXQgZG9lcyBub3QgYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB0aGVtIGJhc2VkIG9uIHRoZSBzZWN0aW9uLgotICAgVGhhdCB3aWxsIGJlIGhhbmRsZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseSByZWFkLiAgKi8KLQotbG9uZwotbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIG5sbV9zeW1ib2xfdHlwZSAqc3ltczsKLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgdW5zaWduZWQgaW50IHJldDsKLQotICAvKiBJZiB3ZSBkb24ndCBrbm93IGhvdyB0byByZWFkIHJlbG9jcywganVzdCByZXR1cm4gMC4gICovCi0gIGlmIChubG1fcmVhZF9yZWxvY19mdW5jIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgZWl0aGVyIHRoZSBjb2RlIG9yIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIChTRUNfQ09ERSB8IFNFQ19EQVRBKSkgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBzeW1zID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0JcmV0dXJuIC0xOwotICAgICAgc3ltcyA9IG5sbV9nZXRfc3ltYm9scyAoYWJmZCk7Ci0gICAgfQotCi0gIHJldCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0KLSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgd2hpbGUgKGNvdW50LS0gIT0gMCkKLSAgICB7Ci0gICAgICByZXQgKz0gc3ltcy0+cmNudDsKLSAgICAgICsrc3ltczsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZXQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotLyogR2V0IHRoZSByZWxvY3MgdGhlbXNlbHZlcy4gICovCi0KLWxvbmcKLW5sbV9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlYywgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICpyZWxzOwotICBhc2VjdGlvbiAqKnNlY3M7Ci0gIGJmZF9zaXplX3R5cGUgY291bnQsIGk7Ci0gIHVuc2lnbmVkIGludCByZXQ7Ci0KLSAgLyogR2V0IHRoZSByZWxvY2F0aW9uIGZpeHVwcy4gICovCi0gIHJlbHMgPSBubG1fcmVsb2NhdGlvbl9maXh1cHMgKGFiZmQpOwotICBpZiAocmVscyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChubG1fc2x1cnBfcmVsb2NfZml4dXBzIChhYmZkKSA9PSBmYWxzZSkKLQlyZXR1cm4gLTE7Ci0gICAgICByZWxzID0gbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKTsKLSAgICB9Ci0gIHNlY3MgPSBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzIChhYmZkKTsKLQotICByZXQgPSAwOwotICBjb3VudCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByZWxzKyssIHNlY3MrKykKLSAgICB7Ci0gICAgICBpZiAoKnNlY3MgPT0gc2VjKQotCXsKLQkgICpyZWxwdHIrKyA9IHJlbHM7Ci0JICArK3JldDsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgaW1wb3J0IHN5bWJvbHMuICAqLwotICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltYm9scysrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLQotICAgICAgc3ltID0gKnN5bWJvbHM7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltKSA9PSBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyKQotCXsKLQkgIG5sbV9zeW1ib2xfdHlwZSAqbmxtX3N5bTsKLQkgIGJmZF9zaXplX3R5cGUgajsKLQotCSAgbmxtX3N5bSA9IChubG1fc3ltYm9sX3R5cGUgKikgc3ltOwotCSAgZm9yIChqID0gMDsgaiA8IG5sbV9zeW0tPnJjbnQ7IGorKykKLQkgICAgewotCSAgICAgIGlmIChubG1fc3ltLT5yZWxvY3Nbal0uc2VjdGlvbiA9PSBzZWMpCi0JCXsKLQkJICAqcmVscHRyID0gJm5sbV9zeW0tPnJlbG9jc1tqXS5yZWxvYzsKLQkJICAoKnJlbHB0ciktPnN5bV9wdHJfcHRyID0gc3ltYm9sczsKLQkJICArK3JlbHB0cjsKLQkJICArK3JldDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAqcmVscHRyID0gTlVMTDsKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogQ29tcHV0ZSB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucyBmb3IgYW4gTkxNIGZpbGUuICBBbGwgdmFyaWFibGUKLSAgIGxlbmd0aCBkYXRhIGluIHRoZSBmaWxlIGhlYWRlcnMgbXVzdCBiZSBzZXQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMKLSAgIGNhbGxlZC4gIElmIHRoZSB2YXJpYWJsZSBsZW5ndGggZGF0YSBpcyBjaGFuZ2VkIGxhdGVyLCB0aGUKLSAgIHJlc3VsdGluZyBvYmplY3QgZmlsZSB3aWxsIGJlIGluY29ycmVjdC4gIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzCi0gICBubyB3YXkgdG8gY2hlY2sgdGhpcy4KLQotICAgVGhpcyByb3V0aW5lIGFsc28gc2V0cyB0aGUgU2l6ZSBhbmQgT2Zmc2V0IGZpZWxkcyBpbiB0aGUgZml4ZWQKLSAgIGhlYWRlci4KLQotICAgSXQgYWxzbyBsb29rcyBvdmVyIHRoZSBzeW1ib2xzIGFuZCBtb3ZlcyBhbnkgY29tbW9uIHN5bWJvbHMgaW50bwotICAgdGhlIC5ic3Mgc2VjdGlvbjsgTkxNIGhhcyBubyB3YXkgdG8gcmVwcmVzZW50IGEgY29tbW9uIHN5bWJvbC4KLSAgIFRoaXMgYXBwcm9hY2ggbWVhbnMgdGhhdCBlaXRoZXIgdGhlIHN5bWJvbHMgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbgotICAgc2V0IGF0IHRoaXMgcG9pbnQsIG9yIHRoZXJlIG11c3QgYmUgbm8gY29tbW9uIHN5bWJvbHMuICBXZSBuZWVkIHRvCi0gICBtb3ZlIHRoZSBzeW1ib2xzIGF0IHRoaXMgcG9pbnQgc28gdGhhdCBtYW5nbGVfcmVsb2NzIGNhbiBzZWUgdGhlCi0gICBmaW5hbCB2YWx1ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmaWxlX3B0ciBzb2ZhcjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSB0ZXh0LCBkYXRhLCBic3M7Ci0gIGJmZF92bWEgdGV4dF9sb3csIGRhdGFfbG93OwotICB1bnNpZ25lZCBpbnQgdGV4dF9hbGlnbiwgZGF0YV9hbGlnbiwgb3RoZXJfYWxpZ247Ci0gIGZpbGVfcHRyIHRleHRfcHRyLCBkYXRhX3B0ciwgb3RoZXJfcHRyOwotICBhc2VjdGlvbiAqYnNzX3NlYzsKLSAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IHRydWUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzZWN0aW9uIHRvIGhvbGQgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLSAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAoYnNzX3NlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghYWRkX2JmZF9zZWN0aW9uIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUsCi0JCQkgICAgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSkgMCwKLQkJCSAgICBTRUNfQUxMT0MpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgICB9Ci0KLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0KLSAgLyogVGhlIGZpeGVkIGhlYWRlci4gICovCi0gIHNvZmFyID0gbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplIChhYmZkKSArIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCk7Ci0KLSAgLyogVGhlIHZhcmlhYmxlIGhlYWRlci4gICovCi0gIHNvZmFyICs9IChzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkKLQkgICAgKyBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxCi0JICAgICsgTkxNX1RBUkdFVF9MT05HX1NJWkUJLyogc3RhY2tTaXplICovCi0JICAgICsgTkxNX1RBUkdFVF9MT05HX1NJWkUJLyogcmVzZXJ2ZWQgKi8KLQkgICAgKyBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKQotCSAgICArIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpCi0JICAgICsgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxCi0JICAgICsgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkKLQkgICAgKyBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpOwotCi0gIC8qIFRoZSBhdXhpbGlhcnkgaGVhZGVycy4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcikpKQotICAgIHNvZmFyICs9IHNpemVvZiAoTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyKTsKLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSBzaXplb2YgKE5sbV9FeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpOwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKSkpCi0gICAgc29mYXIgKz0gKHNpemVvZiAoTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIpCi0JICAgICAgKyBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKTsKLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcikpKQotICAgIHNvZmFyICs9IChzaXplb2YgKE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyKQotCSAgICAgICsgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpOwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSBzaXplb2YgKE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyKTsKLQotICAvKiBDb21wdXRlIHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zIGluIHR3byBwYXNzZXMuICBGaXJzdCBnZXQgdGhlCi0gICAgIHNpemVzIG9mIHRoZSB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLCBhbmQgdGhlbiBzZXQgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zLiAgVGhpcyBjb2RlIGFsaWducyB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgdXNpbmcgdGhlCi0gICAgIHNhbWUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyB0aGF0IGFwcGx5IHRvIHRoZSBzZWN0aW9ucyBpbiBtZW1vcnk7Ci0gICAgIHRoaXMgbWF5IG5vdCBiZSBuZWNlc3NhcnkuICAqLwotICB0ZXh0ID0gMDsKLSAgdGV4dF9sb3cgPSAoYmZkX3ZtYSkgLSAxOwotICB0ZXh0X2FsaWduID0gMDsKLSAgZGF0YSA9IDA7Ci0gIGRhdGFfbG93ID0gKGJmZF92bWEpIC0gMTsKLSAgZGF0YV9hbGlnbiA9IDA7Ci0gIGJzcyA9IDA7Ci0gIG90aGVyX2FsaWduID0gMDsKLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZjsKLQotICAgICAgc2VjLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHNlYy0+X3Jhd19zaXplLCAxIDw8IHNlYy0+YWxpZ25tZW50X3Bvd2VyKTsKLQotICAgICAgZiA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLSAgICAgIGlmIChmICYgU0VDX0NPREUpCi0JewotCSAgdGV4dCArPSBzZWMtPl9yYXdfc2l6ZTsKLQkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpIDwgdGV4dF9sb3cpCi0JICAgIHRleHRfbG93ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKLQkgIGlmIChzZWMtPmFsaWdubWVudF9wb3dlciA+IHRleHRfYWxpZ24pCi0JICAgIHRleHRfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChmICYgU0VDX0RBVEEpCi0JewotCSAgZGF0YSArPSBzZWMtPl9yYXdfc2l6ZTsKLQkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpIDwgZGF0YV9sb3cpCi0JICAgIGRhdGFfbG93ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKLQkgIGlmIChzZWMtPmFsaWdubWVudF9wb3dlciA+IGRhdGFfYWxpZ24pCi0JICAgIGRhdGFfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChmICYgU0VDX0hBU19DT05URU5UUykKLQl7Ci0JICBpZiAoc2VjLT5hbGlnbm1lbnRfcG93ZXIgPiBvdGhlcl9hbGlnbikKLQkgICAgb3RoZXJfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChmICYgU0VDX0FMTE9DKQotCWJzcyArPSBzZWMtPl9yYXdfc2l6ZTsKLSAgICB9Ci0KLSAgbmxtX3NldF90ZXh0X2xvdyAoYWJmZCwgdGV4dF9sb3cpOwotICBubG1fc2V0X2RhdGFfbG93IChhYmZkLCBkYXRhX2xvdyk7Ci0KLSAgaWYgKG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgTmV0V2FyZSBmb3JtYXQgZG9lcyBub3QgdXNlIHVuaW5pdGlhbGl6ZWQgZGF0YS4gIFdlIG11c3QKLQkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGRhdGEgc2VjdGlvbi4gIFdlIHdpbGwgbmV2ZXIgd2luZCB1cAotCSB3cml0aW5nIHRob3NlIGZpbGUgbG9jYXRpb25zLCBzbyB0aGV5IHdpbGwgcmVtYWluIHplcm8uICAqLwotICAgICAgZGF0YSArPSBic3M7Ci0gICAgICBic3MgPSAwOwotICAgIH0KLQotICB0ZXh0X3B0ciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgdGV4dF9hbGlnbik7Ci0gIGRhdGFfcHRyID0gQkZEX0FMSUdOICh0ZXh0X3B0ciArIHRleHQsIDEgPDwgZGF0YV9hbGlnbik7Ci0gIG90aGVyX3B0ciA9IEJGRF9BTElHTiAoZGF0YV9wdHIgKyBkYXRhLCAxIDw8IG90aGVyX2FsaWduKTsKLQotICAvKiBGaWxsIGluIHNvbWUgZmllbGRzIGluIHRoZSBoZWFkZXIgZm9yIHdoaWNoIHdlIG5vdyBoYXZlIHRoZQotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQgPSB0ZXh0X3B0cjsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZVNpemUgPSB0ZXh0OwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlT2Zmc2V0ID0gZGF0YV9wdHI7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VTaXplID0gZGF0YTsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSA9IGJzczsKLQotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBmOwotCi0gICAgICBmID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOwotCi0gICAgICBpZiAoZiAmIFNFQ19DT0RFKQotCXsKLQkgIHNlYy0+ZmlsZXBvcyA9IHRleHRfcHRyOwotCSAgdGV4dF9wdHIgKz0gc2VjLT5fcmF3X3NpemU7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19EQVRBKQotCXsKLQkgIHNlYy0+ZmlsZXBvcyA9IGRhdGFfcHRyOwotCSAgZGF0YV9wdHIgKz0gc2VjLT5fcmF3X3NpemU7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JewotCSAgc2VjLT5maWxlcG9zID0gb3RoZXJfcHRyOwotCSAgb3RoZXJfcHRyICs9IHNlYy0+X3Jhd19zaXplOwotCX0KLSAgICB9Ci0KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCA9IG90aGVyX3B0cjsKLQotICAvKiBNb3ZlIGFsbCBjb21tb24gc3ltYm9scyBpbnRvIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCi0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bV9wdHJfcHRyICE9IE5VTEwpCi0gICAgewotICAgICAgYXN5bWJvbCAqKnN5bV9lbmQ7Ci0gICAgICBiZmRfdm1hIGFkZDsKLQotICAgICAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgICBhZGQgPSAwOwotICAgICAgZm9yICg7IHN5bV9wdHJfcHRyIDwgc3ltX2VuZDsgc3ltX3B0cl9wdHIrKykKLQl7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBiZmRfdm1hIHNpemU7Ci0KLQkgIHN5bSA9ICpzeW1fcHRyX3B0cjsKLQotCSAgaWYgKCFiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBQdXQgdGhlIGNvbW1vbiBzeW1ib2wgaW4gdGhlIC5ic3Mgc2VjdGlvbiwgYW5kIGluY3JlYXNlCi0JICAgICB0aGUgc2l6ZSBvZiB0aGUgLmJzcyBzZWN0aW9uIGJ5IHRoZSBzaXplIG9mIHRoZSBjb21tb24KLQkgICAgIHN5bWJvbCAod2hpY2ggaXMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sKS4gICovCi0JICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgc2l6ZSA9IHN5bS0+dmFsdWU7Ci0JICBzeW0tPnZhbHVlID0gYnNzX3NlYy0+X3Jhd19zaXplICsgYWRkOwotCSAgYWRkICs9IHNpemU7Ci0JICBhZGQgPSBCRkRfQUxJR04gKGFkZCwgMSA8PCBic3Nfc2VjLT5hbGlnbm1lbnRfcG93ZXIpOwotCX0KLSAgICAgIGlmIChhZGQgIT0gMCkKLQl7Ci0JICBpZiAobmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YSAoYWJmZCkpCi0JICAgIHsKLQkgICAgICAvKiBXZSBjb3VsZCBoYW5kbGUgdGhpcyBjYXNlLCBidXQgc28gZmFyIGl0IGhhc24ndCBiZWVuCi0JCSBuZWNlc3NhcnkuICAqLwotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+dW5pbml0aWFsaXplZERhdGFTaXplICs9IGFkZDsKLQkgIGJzc19zZWMtPl9yYXdfc2l6ZSArPSBhZGQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUbyBkbyB0aGlzIHdlIG5lZWQgdG8ga25vdyB3aGVyZQotICAgdGhlIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgbG9jYXRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuICBUaGF0IG1lYW5zCi0gICB0aGF0IHRoZSBzaXplcyBvZiBhbGwgdGhlIHNlY3Rpb25zIG11c3QgYmUgc2V0LCBhbmQgYWxsIHRoZQotICAgdmFyaWFibGUgc2l6ZSBoZWFkZXIgaW5mb3JtYXRpb24gbXVzdCBiZSBrbm93bi4gICovCi0KLWJvb2xlYW4KLW5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZQotICAgICAgJiYgbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIGkzODYgTmV0V2FyZSBoYXMgYSB2ZXJ5IHJlc3RyaWN0ZWQgc2V0IG9mIHJlbG9jcy4gIEluIG9yZGVyIGZvcgotICAgICBvYmpjb3B5IHRvIHdvcmssIHRoZSBOTE0gaTM4NiBiYWNrZW5kIG5lZWRzIGEgY2hhbmNlIHRvIHJld29yawotICAgICB0aGUgc2VjdGlvbiBjb250ZW50cyBzbyB0aGF0IGl0cyBzZXQgb2YgcmVsb2NzIHdpbGwgd29yay4gIElmIGFsbAotICAgICB0aGUgcmVsb2NzIGFyZSBhbHJlYWR5IGFjY2VwdGFibGUsIHRoaXMgd2lsbCBub3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBib29sZWFuICgqbWFuZ2xlX3JlbG9jc19mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLAotCQkJCQkgICAgIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLQotICAgICAgbWFuZ2xlX3JlbG9jc19mdW5jID0gbmxtX21hbmdsZV9yZWxvY3NfZnVuYyAoYWJmZCk7Ci0gICAgICBpZiAobWFuZ2xlX3JlbG9jc19mdW5jICE9IE5VTEwpCi0JewotCSAgaWYgKCEoKm1hbmdsZV9yZWxvY3NfZnVuYykgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAotCQkJCSAgICAgIChiZmRfdm1hKSBvZmZzZXQsIGNvdW50KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gc29ydCBhIGxpc3Qgb2YgcmVsb2NzIGFzc29jaWF0ZWQgd2l0aCBzZWN0aW9ucyB3aGVuIHdlCi0gICB3cml0ZSBvdXQgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0KLXN0YXRpYyBpbnQKLW5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlIChwMSwgcDIpCi0gICAgIGNvbnN0IHZvaWQgKnAxOwotICAgICBjb25zdCB2b2lkICpwMjsKLXsKLSAgY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnIxID0gKGNvbnN0IHN0cnVjdCByZWxvY19hbmRfc2VjICopIHAxOwotICBjb25zdCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcjIgPSAoY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgcDI7Ci0gIGludCBjbXA7Ci0KLSAgY21wID0gc3RyY21wICgoKnIxLT5yZWwtPnN5bV9wdHJfcHRyKS0+bmFtZSwKLQkJKCpyMi0+cmVsLT5zeW1fcHRyX3B0ciktPm5hbWUpOwotICBpZiAoY21wICE9IDApCi0gICAgcmV0dXJuIGNtcDsKLQotICAvKiBXZSBzb3J0IGJ5IGFkZHJlc3Mgd2l0aGluIHN5bWJvbCB0byBtYWtlIHRoZSBzb3J0IG1vcmUgc3RhYmxlIGFuZAotICAgICBpbmNyZWFzZSB0aGUgY2hhbmNlcyB0aGF0IGRpZmZlcmVudCBob3N0cyB3aWxsIGdlbmVyYXRlIGJpdCBmb3IKLSAgICAgYml0IGVxdWl2YWxlbnQgcmVzdWx0cy4gICovCi0gIHJldHVybiAoaW50KSAocjEtPnJlbC0+YWRkcmVzcyAtIHIyLT5yZWwtPmFkZHJlc3MpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gTkxNIGZpbGUuICBXZSB3cml0ZSBvdXQgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgb3JkZXI6Ci0gICAgIGZpeGVkIGhlYWRlcgotICAgICB2YXJpYWJsZSBoZWFkZXIKLSAgICAgYXV4aWxpYXJ5IGhlYWRlcnMKLSAgICAgY29kZSBzZWN0aW9ucwotICAgICBkYXRhIHNlY3Rpb25zCi0gICAgIG90aGVyIHNlY3Rpb25zIChjdXN0b20gZGF0YSwgbWVzc2FnZXMsIGhlbHAsIHNoYXJlZCBOTE0sIFJQQywKLSAgICAgCQkgICAgIG1vZHVsZSBkZXBlbmRlbmNpZXMpCi0gICAgIHJlbG9jYXRpb24gZml4dXBzCi0gICAgIGV4dGVybmFsIHJlZmVyZW5jZXMgKGltcG9ydHMpCi0gICAgIHB1YmxpYyBzeW1ib2xzIChleHBvcnRzKQotICAgICBkZWJ1Z2dpbmcgcmVjb3JkcwotICAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBvcmRlciB1c2VkIGJ5IHRoZSBOZXRXYXJlIHRvb2xzOyB0aGUKLSAgIGRpZmZlcmVuY2UgaXMgdGhhdCBOZXRXYXJlIHB1dHMgdGhlIHNlY3Rpb25zIG90aGVyIHRoYW4gY29kZSwgZGF0YQotICAgYW5kIGN1c3RvbSBkYXRhIGF0IHRoZSBlbmQgb2YgdGhlIE5MTS4gIEl0IGlzIGNvbnZlbmllbnQgZm9yIHVzIHRvCi0gICBrbm93IHdoZXJlIHRoZSBzZWN0aW9ucyBhcmUgZ29pbmcgdG8gYmUgYmVmb3JlIHdvcnJ5aW5nIGFib3V0IHRoZQotICAgc2l6ZSBvZiB0aGUgb3RoZXIgaW5mb3JtYXRpb24uCi0KLSAgIEJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIHNlY3Rpb24gZGF0YSBzaG91bGQKLSAgIGhhdmUgYmVlbiBvdXRwdXQgdXNpbmcgc2V0X3NlY3Rpb25fY29udGVudHMuICBOb3RlIHRoYXQgY3VzdG9tCi0gICBkYXRhLCB0aGUgbWVzc2FnZSBmaWxlLCB0aGUgaGVscCBmaWxlLCB0aGUgc2hhcmVkIE5MTSBmaWxlLCB0aGUgUlBDCi0gICBkYXRhLCBhbmQgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlCi0gICBzZWN0aW9uczsgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiB0aGUgb2Zmc2V0IGFuZAotICAgbGVuZ3RoIGZpZWxkcyBpbiB0aGUgTkxNIGhlYWRlcnMuICBUaGUgcmVsb2NhdGlvbiBmaXh1cHMgYW5kCi0gICBpbXBvcnRzIGFyZSBib3RoIG9idGFpbmVkIGZyb20gdGhlIGxpc3Qgb2YgcmVsb2NzIGF0dGFjaGVkIHRvIGVhY2gKLSAgIHNlY3Rpb24uICBUaGUgZXhwb3J0cyBhbmQgZGVidWdnaW5nIHJlY29yZHMgYXJlIG9idGFpbmVkIGZyb20gdGhlCi0gICBsaXN0IG9mIG91dHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1ubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJvb2xlYW4gKCp3cml0ZV9pbXBvcnRfZnVuYykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX2NvdW50LCBpbnRlcm5hbF9yZWxvY19jb3VudCwgaSwgYzsKLSAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKmV4dGVybmFsX3JlbG9jczsKLSAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOwotICBmaWxlX3B0ciBsYXN0OwotICBib29sZWFuICgqd3JpdGVfcHJlZml4X2Z1bmMpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIHVuc2lnbmVkIGNoYXIgKmZpeGVkX2hlYWRlciA9IE5VTEw7Ci0KLSAgZml4ZWRfaGVhZGVyID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCSAgYmZkX21hbGxvYyAoKHNpemVfdCkgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSkpOwotICBpZiAoZml4ZWRfaGVhZGVyID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UKLSAgICAgICYmIG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpID09IGZhbHNlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlcnMuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JICAgICBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUgKGFiZmQpICsgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0IChhYmZkKSA9PSBmYWxzZQotICAgICAgfHwgbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0IChhYmZkKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIEEgd2VhayBjaGVjayBvbiB3aGV0aGVyIHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zIHdlcmUKLSAgICAgcmVhc29uYWJsZS4gICovCi0gIGlmIChiZmRfdGVsbCAoYWJmZCkgPiBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlT2Zmc2V0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogQWR2YW5jZSB0byB0aGUgcmVsb2NzLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgZm9ybWF0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgaXMgZGVwZW5kZW50IHVwb24gdGhlCi0gICAgIHBhcnRpY3VsYXIgdGFyZ2V0LiAgV2UgdXNlIGFuIGV4dGVybmFsIHJvdXRpbmUgdG8gd3JpdGUgdGhlIHJlbG9jCi0gICAgIG91dC4gICovCi0gIHdyaXRlX2ltcG9ydF9mdW5jID0gbmxtX3dyaXRlX2ltcG9ydF9mdW5jIChhYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGludGVybmFsIHJlbG9jYXRpb24gZml4dXBzLiAgV2hpbGUgd2UncmUgbG9vcGluZwotICAgICBvdmVyIHRoZSByZWxvY3MsIHdlIGFsc28gY291bnQgdGhlIGV4dGVybmFsIHJlbG9jcywgd2hpY2ggaXMKLSAgICAgbmVlZGVkIHdoZW4gdGhleSBhcmUgd3JpdHRlbiBvdXQgYmVsb3cuICAqLwotICBpbnRlcm5hbF9yZWxvY19jb3VudCA9IDA7Ci0gIGV4dGVybmFsX3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbF9wdHJfcHRyLCAqKnJlbF9lbmQ7Ci0KLSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGNhbiBvbmx5IHJlcHJlc2VudCByZWxvY3Mgd2l0aGluIGEgY29kZSBvciBkYXRhCi0JIHNlY3Rpb24uICBXZSBpZ25vcmUgdGhlbSBmb3IgYSBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCi0gICAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIChTRUNfQ09ERSB8IFNFQ19EQVRBKSkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgbmVlZCB0byBrbm93IGhvdyB0byB3cml0ZSBvdXQgaW1wb3J0cyAqLwotICAgICAgaWYgKHdyaXRlX2ltcG9ydF9mdW5jID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgcmVsX3B0cl9wdHIgPSBzZWMtPm9yZWxvY2F0aW9uOwotICAgICAgcmVsX2VuZCA9IHJlbF9wdHJfcHRyICsgc2VjLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoOyByZWxfcHRyX3B0ciA8IHJlbF9lbmQ7IHJlbF9wdHJfcHRyKyspCi0JewotCSAgYXJlbGVudCAqcmVsOwotCSAgYXN5bWJvbCAqc3ltOwotCi0JICByZWwgPSAqcmVsX3B0cl9wdHI7Ci0JICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICB7Ci0JICAgICAgKytpbnRlcm5hbF9yZWxvY19jb3VudDsKLQkgICAgICBpZiAoKCp3cml0ZV9pbXBvcnRfZnVuYykgKGFiZmQsIHNlYywgcmVsKSA9PSBmYWxzZSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgKytleHRlcm5hbF9yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzID0gaW50ZXJuYWxfcmVsb2NfY291bnQ7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbXBvcnRzIChyZWxvY3MgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzKS4gIFRoZXNlCi0gICAgIGFyZSBvdXRwdXQgYXMgYSBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBhbGwgdGhlIHJlbG9jcyBmb3IgdGhhdAotICAgICBzeW1ib2wsIHNvIHdlIG11c3QgZmlyc3QgZ2F0aGVyIHRvZ2V0aGVyIGFsbCB0aGUgcmVsb2NzIGFnYWluc3QKLSAgICAgZXh0ZXJuYWwgc3ltYm9scyBhbmQgc29ydCB0aGVtLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2NzID0KLSAgICAoc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkoZXh0ZXJuYWxfcmVsb2NfY291bnQKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NfYW5kX3NlYykpKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSAoc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaSA9IDA7Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipyZWxfcHRyX3B0ciwgKipyZWxfZW5kOwotCi0gICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxfcHRyX3B0ciA9IHNlYy0+b3JlbG9jYXRpb247Ci0gICAgICByZWxfZW5kID0gcmVsX3B0cl9wdHIgKyBzZWMtPnJlbG9jX2NvdW50OwotICAgICAgZm9yICg7IHJlbF9wdHJfcHRyIDwgcmVsX2VuZDsgcmVsX3B0cl9wdHIrKykKLQl7Ci0JICBhcmVsZW50ICpyZWw7Ci0JICBhc3ltYm9sICpzeW07Ci0KLQkgIHJlbCA9ICpyZWxfcHRyX3B0cjsKLQkgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICBleHRlcm5hbF9yZWxvY3NbaV0ucmVsID0gcmVsOwotCSAgZXh0ZXJuYWxfcmVsb2NzW2ldLnNlYyA9IHNlYzsKLQkgICsraTsKLQl9Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGkgPT0gZXh0ZXJuYWxfcmVsb2NfY291bnQpOwotCi0gIC8qIFNvcnQgdGhlIGV4dGVybmFsIHJlbG9jcyBieSBuYW1lLiAgKi8KLSAgcXNvcnQgKChQVFIpIGV4dGVybmFsX3JlbG9jcywgKHNpemVfdCkgZXh0ZXJuYWxfcmVsb2NfY291bnQsCi0JIHNpemVvZiAoc3RydWN0IHJlbG9jX2FuZF9zZWMpLCBubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlcm5hbCByZWxvY3MuICAqLwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBjID0gMDsKLSAgaSA9IDA7Ci0gIHdoaWxlIChpIDwgZXh0ZXJuYWxfcmVsb2NfY291bnQpCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYmZkX3NpemVfdHlwZSBqLCBjbnQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgcmVsID0gZXh0ZXJuYWxfcmVsb2NzW2ldLnJlbDsKLSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gICAgICBjbnQgPSAwOwotICAgICAgZm9yIChqID0gaTsKLQkgICAoaiA8IGV4dGVybmFsX3JlbG9jX2NvdW50Ci0JICAgICYmICpleHRlcm5hbF9yZWxvY3Nbal0ucmVsLT5zeW1fcHRyX3B0ciA9PSBzeW0pOwotCSAgIGorKykKLQkrK2NudDsKLQotICAgICAgaWYgKCgqbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMgKGFiZmQpKSAoYWJmZCwgY250LCBzeW0sCi0JCQkJCSAgICAgJmV4dGVybmFsX3JlbG9jc1tpXSkKLQkgID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpICs9IGNudDsKLSAgICB9Ci0KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzID0gYzsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHB1YmxpYyBzeW1ib2xzIChleHBvcnRzKS4gICovCi0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bV9wdHJfcHRyICE9IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgKCpnZXRfcHVibGljX29mZnNldF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0gICAgICBib29sZWFuICgqd3JpdGVfZXhwb3J0X2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZF92bWEpKTsKLQotICAgICAgYXN5bWJvbCAqKnN5bV9lbmQ7Ci0KLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5wdWJsaWNzT2Zmc2V0ID0gYmZkX3RlbGwgKGFiZmQpOwotICAgICAgZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyA9IG5sbV9nZXRfcHVibGljX29mZnNldF9mdW5jIChhYmZkKTsKLSAgICAgIHdyaXRlX2V4cG9ydF9mdW5jID0gbmxtX3dyaXRlX2V4cG9ydF9mdW5jIChhYmZkKTsKLSAgICAgIGMgPSAwOwotICAgICAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgICBmb3IgKDsgc3ltX3B0cl9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyX3B0cisrKQotCXsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIGJmZF9ieXRlIGxlbjsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLQkgIHN5bSA9ICpzeW1fcHRyX3B0cjsKLQotCSAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKSkgPT0gMAotCSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgY29udGludWU7Ci0KLQkgICsrYzsKLQotCSAgaWYgKGdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMpCi0JICAgIHsKLQkgICAgICAvKiBNb3N0IGJhY2tlbmRzIGNhbiB1c2UgdGhlIGNvZGUgYmVsb3csIGJ1dAotCQkgdW5mb3J0dW5hdGVseSBzb21lIHVzZSBhIGRpZmZlcmVudCBzY2hlbWUuICAqLwotCSAgICAgIG9mZnNldCA9ICgqZ2V0X3B1YmxpY19vZmZzZXRfZnVuYykgKGFiZmQsIHN5bSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9mZnNldCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIHNlYyA9IHN5bS0+c2VjdGlvbjsKLQkgICAgICBpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCQl7Ci0JCSAgb2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotCQkgIG9mZnNldCB8PSBOTE1fSElCSVQ7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKLQkJewotCQkgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCi0JCSAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UgY2FuJ3QgaGFuZGxlIGFuIGV4cG9ydGVkIHN5bWJvbCB0aGF0IGlzIG5vdCBpbgotCQkgICAgIHRoZSBjb2RlIG9yIGRhdGEgc2VnbWVudC4gICovCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICh3cml0ZV9leHBvcnRfZnVuYykKLQkgICAgewotCSAgICAgIGlmICgoKndyaXRlX2V4cG9ydF9mdW5jKSAoYWJmZCwgc3ltLCBvZmZzZXQpID09IGZhbHNlKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotCSAgICAgIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkKLQkJICAgIT0gc2l6ZW9mIChiZmRfYnl0ZSkpCi0JCSAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIHB1dF93b3JkIChhYmZkLCBvZmZzZXQsIHRlbXApOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUHVibGljcyA9IGM7Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIHJlY29yZHMuICBUaGUgTkxNIGNvbnZlcnNpb24gcHJvZ3JhbQotCSB3YW50cyB0byBiZSBhYmxlIHRvIGluaGliaXQgdGhpcywgc28gYXMgYSBzcGVjaWFsIGhhY2sgaWYKLQkgZGVidWdJbmZvT2Zmc2V0IGlzIHNldCB0byAtMSB3ZSBkb24ndCB3cml0ZSBhbnkgZGVidWdnaW5nCi0JIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gbm90IGJlIGhhbmRsZWQgYnkgZmlkZGxpbmcgd2l0aCB0aGUKLQkgc3ltYm9sIHRhYmxlLCBiZWNhdXNlIGV4cG9ydGVkIHN5bWJvbHMgYXBwZWFyIGluIGJvdGggdGhlCi0JIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGFuZCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID09IChmaWxlX3B0cikgLSAxKQotCXsKLQkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSAwOwotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9IGJmZF90ZWxsIChhYmZkKTsKLQkgIGMgPSAwOwotCSAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotCSAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0JICBmb3IgKDsgc3ltX3B0cl9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyX3B0cisrKQotCSAgICB7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCSAgICAgIGJmZF9ieXRlIHR5cGUsIGxlbjsKLQkgICAgICBiZmRfdm1hIG9mZnNldDsKLQkgICAgICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotCSAgICAgIHN5bSA9ICpzeW1fcHRyX3B0cjsKLQotCSAgICAgIC8qIFRoZSBOTE0gbm90aW9uIG9mIGEgZGVidWdnaW5nIHN5bWJvbCBpcyBhY3R1YWxseSB3aGF0Ci0JCSBCRkQgY2FsbHMgYSBsb2NhbCBvciBnbG9iYWwgc3ltYm9sLiAgV2hhdCBCRkQgY2FsbHMgYQotCQkgZGVidWdnaW5nIHN5bWJvbCBOTE0gZG9lcyBub3QgdW5kZXJzdGFuZCBhdCBhbGwuICAqLwotCSAgICAgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfTE9DQUwgfCBCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCkpID09IDAKLQkJICB8fCAoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKLQkJICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgKytjOwotCi0JICAgICAgb2Zmc2V0ID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICAgICAgc2VjID0gc3ltLT5zZWN0aW9uOwotCSAgICAgIGlmIChzZWMtPmZsYWdzICYgU0VDX0NPREUpCi0JCXsKLQkJICBvZmZzZXQgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0JCSAgdHlwZSA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKLQkJewotCQkgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCi0JCSAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotCQkgIHR5cGUgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl0eXBlID0gMjsKLQotCSAgICAgIC8qIFRoZSB0eXBlIGlzIDAgZm9yIGRhdGEsIDEgZm9yIGNvZGUsIDIgZm9yIGFic29sdXRlLiAgKi8KLQkgICAgICBpZiAoYmZkX3dyaXRlICgmdHlwZSwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpCi0JCSAgIT0gc2l6ZW9mIChiZmRfYnl0ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgcHV0X3dvcmQgKGFiZmQsIG9mZnNldCwgdGVtcCk7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0JICAgICAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKQotCQkgICAhPSBzaXplb2YgKGJmZF9ieXRlKSkKLQkJICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMgPSBjOwotCX0KLSAgICB9Ci0KLSAgLyogTkxNTElOSyBmaWxscyBpbiBvZmZzZXQgdmFsdWVzIGV2ZW4gaWYgdGhlcmUgaXMgbm8gZGF0YSwgc28gd2UgZG8KLSAgICAgdGhlIHNhbWUuICAqLwotICBsYXN0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZU9mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZU9mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmN1c3RvbURhdGFPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y3VzdG9tRGF0YU9mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5wdWJsaWNzT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnB1YmxpY3NPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSBsYXN0OwotCi0gIC8qIEF0IHRoaXMgcG9pbnQgZXZlcnl0aGluZyBoYXMgYmVlbiB3cml0dGVuIG91dCBleGNlcHQgdGhlIGZpeGVkCi0gICAgIGhlYWRlci4gICovCi0gIG1lbWNweSAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnNpZ25hdHVyZSwgbmxtX3NpZ25hdHVyZSAoYWJmZCksCi0JICBOTE1fU0lHTkFUVVJFX1NJWkUpOwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+dmVyc2lvbiA9IE5MTV9IRUFERVJfVkVSU0lPTjsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVTdGFydE9mZnNldCA9Ci0gICAgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkKLSAgICAgLSBubG1fZ2V0X3RleHRfbG93IChhYmZkKSk7Ci0KLSAgLyogV2UgaGF2ZSBubyBjb252ZW5pZW50IHdheSBmb3IgdGhlIGNhbGxlciB0byBwYXNzIGluIHRoZSBleGl0Ci0gICAgIHByb2NlZHVyZSBvciB0aGUgY2hlY2sgdW5sb2FkIHByb2NlZHVyZSwgc28gdGhlIGNhbGxlciBtdXN0IHNldAotICAgICB0aGUgdmFsdWVzIGluIHRoZSBoZWFkZXIgdG8gdGhlIHZhbHVlcyBvZiB0aGUgc3ltYm9scy4gICovCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5leGl0UHJvY2VkdXJlT2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0ICE9IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0IC09Ci0gICAgICBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdyaXRlX3ByZWZpeF9mdW5jID0gbmxtX3dyaXRlX3ByZWZpeF9mdW5jIChhYmZkKTsKLSAgaWYgKHdyaXRlX3ByZWZpeF9mdW5jKQotICAgIHsKLSAgICAgIGlmICgoKndyaXRlX3ByZWZpeF9mdW5jKSAoYWJmZCkgPT0gZmFsc2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSBiZmRfdGVsbCAoYWJmZCkKLQkgICAgICA9PSBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUgKGFiZmQpKTsKLQotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0IChhYmZkLCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKSwgZml4ZWRfaGVhZGVyKTsKLSAgaWYgKGJmZF93cml0ZSAoZml4ZWRfaGVhZGVyLCBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpLCAxLCBhYmZkKQotICAgICAgIT0gbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoZml4ZWRfaGVhZGVyICE9IE5VTEwpCi0gICAgZnJlZSAoZml4ZWRfaGVhZGVyKTsKLSAgcmV0dXJuIHRydWU7Ci0KLWVycm9yX3JldHVybjoKLSAgaWYgKGZpeGVkX2hlYWRlciAhPSBOVUxMKQotICAgIGZyZWUgKGZpeGVkX2hlYWRlcik7Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9ubG1zd2FwLmggYi9iZmQvbmxtc3dhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTljZTcyLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG1zd2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3dhcHBpbmcgcm91dGluZXMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgdXNpbmcgRUxGIHN1cHBvcnQgYXMgdGhlCi0gICB0ZW1wbGF0ZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbHRob3VnaCB0aGlzIGlzIGEgaGVhZGVyIGZpbGUsIGl0IGRlZmluZXMgZnVuY3Rpb25zLiAgSXQgaXMKLSAgIGluY2x1ZGVkIGJ5IE5MTSBiYWNrZW5kcyB0byBkZWZpbmUgc3dhcHBpbmcgZnVuY3Rpb25zIHRoYXQgdmFyeQotICAgZnJvbSBvbmUgTkxNIHRvIGFub3RoZXIuICBUaGUgYmFja2VuZCBjb2RlIG11c3QgYXJyYW5nZSBmb3IKLSAgIE5sbV9FeHRlcm5hbF94eHh4IHRvIGJlIGRlZmluZWQgYXBwcm9wcmlhdGVseSwgYW5kIGNhbiB0aGVuIGluY2x1ZGUKLSAgIHRoaXMgZmlsZSB0byBnZXQgdGhlIHN3YXBwaW5nIHJvdXRpbmVzLgotCi0gICBBdCB0aGUgbW9tZW50IHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIG9uZSBzdHJ1Y3R1cmUsIHRoZSBmaXhlZCBOTE0KLSAgIGZpbGUgaGVhZGVyLiAgKi8KLQotc3RhdGljIHZvaWQgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKikpOwotc3RhdGljIHZvaWQgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKiwKLQkJCQkJICAgICAgIFBUUikpOwotCi0vKiBUcmFuc2xhdGUgYW4gTkxNIGZpeGVkIGxlbmd0aCBmaWxlIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbiBOTE0KLSAgIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLW5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiAoYWJmZCwgcmVhbHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiByZWFsc3JjOwotICAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICpkc3Q7Ci17Ci0gIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIgKnNyYyA9IChObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyICopIHJlYWxzcmM7Ci0gIG1lbWNweSAoZHN0LT5zaWduYXR1cmUsIHNyYy0+c2lnbmF0dXJlLCBOTE1fU0lHTkFUVVJFX1NJWkUpOwotICBtZW1jcHkgKGRzdC0+bW9kdWxlTmFtZSwgc3JjLT5tb2R1bGVOYW1lLCBOTE1fTU9EVUxFX05BTUVfU0laRSk7Ci0gIGRzdC0+dmVyc2lvbiA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT52ZXJzaW9uKTsKLSAgZHN0LT5jb2RlSW1hZ2VPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y29kZUltYWdlT2Zmc2V0KTsKLSAgZHN0LT5jb2RlSW1hZ2VTaXplID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmNvZGVJbWFnZVNpemUpOwotICBkc3QtPmRhdGFJbWFnZU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5kYXRhSW1hZ2VPZmZzZXQpOwotICBkc3QtPmRhdGFJbWFnZVNpemUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZGF0YUltYWdlU2l6ZSk7Ci0gIGRzdC0+dW5pbml0aWFsaXplZERhdGFTaXplID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSk7Ci0gIGRzdC0+Y3VzdG9tRGF0YU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jdXN0b21EYXRhT2Zmc2V0KTsKLSAgZHN0LT5jdXN0b21EYXRhU2l6ZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jdXN0b21EYXRhU2l6ZSk7Ci0gIGRzdC0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0KTsKLSAgZHN0LT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyk7Ci0gIGRzdC0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJlbG9jYXRpb25GaXh1cE9mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyk7Ci0gIGRzdC0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBkc3QtPnB1YmxpY3NPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cHVibGljc09mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZQdWJsaWNzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mUHVibGljcyk7Ci0gIGRzdC0+ZGVidWdJbmZvT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmRlYnVnSW5mb09mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMpOwotICBkc3QtPmNvZGVTdGFydE9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jb2RlU3RhcnRPZmZzZXQpOwotICBkc3QtPmV4aXRQcm9jZWR1cmVPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZXhpdFByb2NlZHVyZU9mZnNldCk7Ci0gIGRzdC0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQpOwotICBkc3QtPm1vZHVsZVR5cGUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bW9kdWxlVHlwZSk7Ci0gIGRzdC0+ZmxhZ3MgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZmxhZ3MpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gTkxNIGZpeGVkIGxlbmd0aCBmaWxlIGhlYWRlciBpbiBpbnRlcm5hbCBmb3JtYXQgaW50bwotICAgYW4gTkxNIGZpbGUgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLW5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQgKGFiZmQsIHNyYywgcmVhbGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICpzcmM7Ci0gICAgIFBUUiByZWFsZHN0OwotewotICBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyICpkc3QgPSAoTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlciAqKSByZWFsZHN0OwotICBtZW1zZXQgKGRzdCwgMCwgc2l6ZW9mICpkc3QpOwotICBtZW1jcHkgKGRzdC0+c2lnbmF0dXJlLCBzcmMtPnNpZ25hdHVyZSwgTkxNX1NJR05BVFVSRV9TSVpFKTsKLSAgbWVtY3B5IChkc3QtPm1vZHVsZU5hbWUsIHNyYy0+bW9kdWxlTmFtZSwgTkxNX01PRFVMRV9OQU1FX1NJWkUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPnZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBkc3QtPnZlcnNpb24pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmNvZGVJbWFnZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y29kZUltYWdlT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jb2RlSW1hZ2VTaXplLAotCQkoYmZkX2J5dGUgKikgZHN0LT5jb2RlSW1hZ2VTaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5kYXRhSW1hZ2VPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmRhdGFJbWFnZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZGF0YUltYWdlU2l6ZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+ZGF0YUltYWdlU2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+dW5pbml0aWFsaXplZERhdGFTaXplLAotCQkoYmZkX2J5dGUgKikgZHN0LT51bmluaXRpYWxpemVkRGF0YVNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmN1c3RvbURhdGFPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmN1c3RvbURhdGFPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmN1c3RvbURhdGFTaXplLAotCQkoYmZkX2J5dGUgKikgZHN0LT5jdXN0b21EYXRhU2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPnJlbG9jYXRpb25GaXh1cE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcywKLQkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPnB1YmxpY3NPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPnB1YmxpY3NPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mUHVibGljcywKLQkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZQdWJsaWNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5kZWJ1Z0luZm9PZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmRlYnVnSW5mb09mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mRGVidWdSZWNvcmRzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jb2RlU3RhcnRPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmNvZGVTdGFydE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZXhpdFByb2NlZHVyZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+ZXhpdFByb2NlZHVyZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5tb2R1bGVUeXBlLAotCQkoYmZkX2J5dGUgKikgZHN0LT5tb2R1bGVUeXBlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5mbGFncywKLQkJKGJmZF9ieXRlICopIGRzdC0+ZmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL25zMzJrLmggYi9iZmQvbnMzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzYmEwOS4uMDAwMDAwMAotLS0gYS9iZmQvbnMzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIEhlYWRlciBmaWxlIGZvciBuczMyayByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZG9fbnMzMmtfcmVsb2NfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKiwKLQkgICBsb25nICgqKSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSksCi0JICAgaW50ICgqKSBQQVJBTVMgKChsb25nLCBiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSkpKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwKLQkgICBiZmRfdm1hLCBiZmRfdm1hKSk7Ci0KLWV4dGVybiBsb25nIF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudCBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci1leHRlcm4gbG9uZyBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGUgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGludCBfYmZkX25zMzJrX3B1dF9kaXNwbGFjZW1lbnQgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGludCBfYmZkX25zMzJrX3B1dF9pbW1lZGlhdGUgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NfZGlzcAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19yZWxvY19pbW0KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CmRpZmYgLS1naXQgYS9iZmQvbnMzMmtuZXRic2QuYyBiL2JmZC9uczMya25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjIzNTZkLi4wMDAwMDAwCi0tLSBhL2JmZC9uczMya25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbnMzMmsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJNDA5NgotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9uczMyawotI2RlZmluZQlERUZBVUxUX01JRCAJTV81MzJfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChwYzUzMm5ldGJzZF8sT1ApCi0KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbnMzMmstbmV0YnNkIgotCi0jZGVmaW5lIG5zMzJrYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQotCi0vKiBXZSBjYW5gdCB1c2UgdGhlIE1ZTlMgbWFjcm8gaGVyZSBmb3IgY3BwIHJlYXNvbnMgdG9vIHN1YnRsZQotICogZm9yIG1lIC0tIElXRAotICovCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBuczMya2FvdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpbmNsdWRlICJiZmQuaCIJCS8qIFRvIGVuc3VyZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gaXMgT0sgKi8KLQotQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCi1NWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TKChiZmQgKmFiZmQgQU5ECi0JICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9vYXN5cy5jIGIvYmZkL29hc3lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTU2MGUuLjAwMDAwMDAKLS0tIGEvYmZkL29hc3lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igb2FzeXMgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVU5ERVJTQ09SRV9IQUNLIDEKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm9hc3lzLmgiCi0jaW5jbHVkZSAibGlib2FzeXMuaCIKLQotLyogWFhYIC0gRklYTUUuICBvZmZzZXRvZiBiZWxvbmdzIGluIHRoZSBzeXN0ZW0tc3BlY2lmaWMgZmlsZXMgaW4KLSAgIC4uL2luY2x1ZGUvc3lzLiAqLwotLyogRGVmaW5lIG9mZnNldG9mIGZvciB0aG9zZSBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQgKi8KLQotI2lmbmRlZiBvZmZzZXRvZgotI2RlZmluZSBvZmZzZXRvZih0eXBlLCBpZGVudGlmaWVyKSAoc2l6ZV90KSAmKCgodHlwZSAqKSAwKS0+aWRlbnRpZmllcikKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBvYXN5c19yZWFkX3JlY29yZCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICBvYXN5c19yZWNvcmRfZW51bV90eXBlLAotCQkJCQkgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqLAotCQkJCQkgICBzaXplX3QpKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX3N5bXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfZW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFJlYWQgaW4gYWxsIHRoZSBzZWN0aW9uIGRhdGEgYW5kIHJlbG9jYXRpb24gc3R1ZmYgdG9vICovCi1QUk9UTyAoc3RhdGljIGJvb2xlYW4sIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSwgKGJmZCAqIENPTlNUIGFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCByZWNvcmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKnJlY29yZDsKLXsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByZWNvcmQsIDEsIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoc2l6ZV90KSByZWNvcmQtPmhlYWRlci5sZW5ndGggPD0gKHNpemVfdCkgc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgKCgoY2hhciAqKSByZWNvcmQpICsgc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpLAotCQkxLCByZWNvcmQtPmhlYWRlci5sZW5ndGggLSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSwKLQkJYWJmZCkKLSAgICAgICE9IHJlY29yZC0+aGVhZGVyLmxlbmd0aCAtIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1zdGF0aWMgc2l6ZV90Ci1vYXN5c19zdHJpbmdfbGVuZ3RoIChyZWNvcmQpCi0gICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICpyZWNvcmQ7Ci17Ci0gIHJldHVybiByZWNvcmQtPmhlYWRlci5sZW5ndGgKLSAgICAtICgoY2hhciAqKSByZWNvcmQtPnN5bWJvbC5uYW1lIC0gKGNoYXIgKikgcmVjb3JkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotCi1TbHVycCB0aGUgc3ltYm9sIHRhYmxlIGJ5IHJlYWRpbmcgaW4gYWxsIHRoZSByZWNvcmRzIGF0IHRoZSBzdGFydCBmaWxlCi10aWxsIHdlIGdldCB0byB0aGUgZmlyc3Qgc2VjdGlvbiByZWNvcmQuCi0KLVdlJ2xsIHNvcnQgdGhlIHN5bWJvbHNzIGludG8gIHR3byBsaXN0cywgZGVmaW5lZCBhbmQgdW5kZWZpbmVkLiBUaGUKLXVuZGVmaW5lZCBzeW1ib2xzIHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIHRhYmxlIGFjY29yZGluZyB0byB0aGVpcgotcmVmbm8uCi0KLVdlIGRvIHRoaXMgYnkgcGxhY2luZyBhbGwgdW5kZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGZyb250IG9mIHRoZSB0YWJsZQotbW92aW5nIGluLCBhbmQgdGhlIGRlZmluZWQgc3ltYm9scyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBtb3ZpbmcgYmFjay4KLQotKi8KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICpDT05TVCBhYmZkOwotewotICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSByZWNvcmQ7Ci0gIG9hc3lzX2RhdGFfdHlwZSAqZGF0YSA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBib29sZWFuIGxvb3AgPSB0cnVlOwotICBhc3ltYm9sICpkZXN0X2RlZmluZWQ7Ci0gIGFzeW1ib2wgKmRlc3Q7Ci0gIGNoYXIgKnN0cmluZ19wdHI7Ci0KLQotICBpZiAoZGF0YS0+c3ltYm9scyAhPSAoYXN5bWJvbCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgLyogQnV5IGVub3VnaCBtZW1vcnkgZm9yIGFsbCB0aGUgc3ltYm9scyBhbmQgYWxsIHRoZSBuYW1lcyAqLwotICBkYXRhLT5zeW1ib2xzID0KLSAgICAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkgKiBhYmZkLT5zeW1jb3VudCk7Ci0jaWZkZWYgVU5ERVJTQ09SRV9IQUNLCi0gIC8qIGJ1eSAxIG1vcmUgY2hhciBmb3IgZWFjaCBzeW1ib2wgdG8ga2VlcCB0aGUgdW5kZXJzY29yZSBpbiovCi0gIGRhdGEtPnN0cmluZ3MgPSBiZmRfYWxsb2MgKGFiZmQsIGRhdGEtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoICsKLQkJCSAgICAgYWJmZC0+c3ltY291bnQpOwotI2Vsc2UKLSAgZGF0YS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgZGF0YS0+c3ltYm9sX3N0cmluZ19sZW5ndGgpOwotI2VuZGlmCi0gIGlmICghZGF0YS0+c3ltYm9scyB8fCAhZGF0YS0+c3RyaW5ncykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZGVzdF9kZWZpbmVkID0gZGF0YS0+c3ltYm9scyArIGFiZmQtPnN5bWNvdW50IC0gMTsKLQotICBzdHJpbmdfcHRyID0gZGF0YS0+c3RyaW5nczsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgd2hpbGUgKGxvb3ApCi0gICAgewotCi0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3dpdGNoIChyZWNvcmQuaGVhZGVyLnR5cGUpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bToKLQkgIHsKLQkgICAgaW50IGZsYWcgPSByZWNvcmQuaGVhZGVyLnR5cGUgPT0gKGludCkgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0gPwotCSAgICAoQlNGX0xPQ0FMKSA6IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7Ci0KLQotCSAgICBzaXplX3QgbGVuZ3RoID0gb2FzeXNfc3RyaW5nX2xlbmd0aCAoJnJlY29yZCk7Ci0JICAgIHN3aXRjaCAocmVjb3JkLnN5bWJvbC5yZWxiICYgUkVMT0NBVElPTl9UWVBFX0JJVFMpCi0JICAgICAgewotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJZGVzdC0+ZmxhZ3MgPSAwOwotCi0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1JFTDoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5zZWN0aW9uID0KLQkJICBPQVNZU19EQVRBIChhYmZkKS0+c2VjdGlvbnNbcmVjb3JkLnN5bWJvbC5yZWxiICYKLQkJCQkJICAgICAgUkVMT0NBVElPTl9TRUNUX0JJVFNdOwotCQlpZiAocmVjb3JkLmhlYWRlci50eXBlID09IChpbnQpIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtKQotCQkgIHsKLQkJICAgIGRlc3QtPmZsYWdzID0gQlNGX0xPQ0FMOwotCQkgICAgaWYgKGRlc3QtPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopICh+MCkpCi0JCSAgICAgIHsKLQkJCS8qIEl0IHNlZW1zIHRoYXQgc29tZXRpbWVzIGludGVybmFsIHN5bWJvbHMgYXJlIHRpZWQgdXAsIGJ1dAotCQkgICAgICAgc3RpbGwgZ2V0IG91dHB1dCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8KLQkJICAgICAgIHNlY3Rpb24gKi8KLQkJCWRlc3QtPnNlY3Rpb24gPSAwOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCi0JCSAgICBkZXN0LT5mbGFncyA9IGZsYWc7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9VTkQ6Ci0JCWRlc3QgPSBkYXRhLT5zeW1ib2xzICsgYmZkX2hfZ2V0XzE2IChhYmZkLCByZWNvcmQuc3ltYm9sLnJlZm5vKTsKLQkJZGVzdC0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0NPTToKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5uYW1lID0gc3RyaW5nX3B0cjsKLQkJZGVzdC0+dGhlX2JmZCA9IGFiZmQ7Ci0KLQkJZGVzdC0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlCRkRfQVNTRVJUICgwKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBkZXN0LT5uYW1lID0gc3RyaW5nX3B0cjsKLQkgICAgZGVzdC0+dGhlX2JmZCA9IGFiZmQ7Ci0JICAgIGRlc3QtPnVkYXRhLnAgPSAoUFRSKSBOVUxMOwotCSAgICBkZXN0LT52YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLnN5bWJvbC52YWx1ZSk7Ci0KLSNpZmRlZiBVTkRFUlNDT1JFX0hBQ0sKLQkgICAgaWYgKHJlY29yZC5zeW1ib2wubmFtZVswXSAhPSAnXycpCi0JICAgICAgewotCQlzdHJpbmdfcHRyWzBdID0gJ18nOwotCQlzdHJpbmdfcHRyKys7Ci0JICAgICAgfQotI2VuZGlmCi0JICAgIG1lbWNweSAoc3RyaW5nX3B0ciwgcmVjb3JkLnN5bWJvbC5uYW1lLCBsZW5ndGgpOwotCi0KLQkgICAgc3RyaW5nX3B0cltsZW5ndGhdID0gMDsKLQkgICAgc3RyaW5nX3B0ciArPSBsZW5ndGggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGxvbmcKLW9hc3lzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgaWYgKCEgb2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAob2FzeXNfc3ltYm9sX3R5cGUgKikpOwotfQotCi0vKgotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgb2FzeXNfdmVjOwotCi1sb25nCi1vYXN5c19nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gIGFzeW1ib2wgKnN5bWJhc2U7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBpZiAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBzeW1iYXNlID0gT0FTWVNfREFUQSAoYWJmZCktPnN5bWJvbHM7Ci0gIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBhYmZkLT5zeW1jb3VudDsgY291bnRlcisrKQotICAgIHsKLSAgICAgICoobG9jYXRpb24rKykgPSBzeW1iYXNlKys7Ci0gICAgfQotICAqbG9jYXRpb24gPSAwOwotICByZXR1cm4gYWJmZC0+c3ltY291bnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgYXJjaGl2ZSBzdHVmZgotKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb2FzeXNfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG9hc3lzX2FyY2hpdmVfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBvYXN5c19leHRhcmNoaXZlX2hlYWRlcl90eXBlIGhlYWRlcl9leHQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaWxlX3B0ciBmaWxlcG9zOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBmYWxzZSkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSAmIGhlYWRlcl9leHQsIDEsIHNpemVvZiAoaGVhZGVyX2V4dCksIGFiZmQpCi0JICAhPSBzaXplb2YgKGhlYWRlcl9leHQpKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaGVhZGVyLnZlcnNpb24gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQudmVyc2lvbik7Ci0gIGhlYWRlci5tb2RfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQubW9kX2NvdW50KTsKLSAgaGVhZGVyLm1vZF90Ymxfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0Lm1vZF90Ymxfb2Zmc2V0KTsKLSAgaGVhZGVyLnN5bV90Ymxfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5zeW1fdGJsX3NpemUpOwotICBoZWFkZXIuc3ltX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV9jb3VudCk7Ci0gIGhlYWRlci5zeW1fdGJsX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5zeW1fdGJsX29mZnNldCk7Ci0gIGhlYWRlci54cmVmX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnhyZWZfY291bnQpOwotICBoZWFkZXIueHJlZl9sc3Rfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnhyZWZfbHN0X29mZnNldCk7Ci0KLSAgLyoKLSAgICBUaGVyZSBpc24ndCBhIG1hZ2ljIG51bWJlciBpbiBhbiBPYXN5cyBhcmNoaXZlLCBzbyB0aGUgYmVzdCB3ZQotICAgIGNhbiBkbyB0byB2ZXJpZnkgcmVhc25hYmxlbmVzcyBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGluCi0gICAgdGhlIGhlYWRlciBhcmUgdG9vIHdlaXJkCi0gICAgKi8KLQotICBpZiAoaGVhZGVyLnZlcnNpb24gPiAxMDAwMCB8fAotICAgICAgaGVhZGVyLm1vZF9jb3VudCA+IDEwMDAwIHx8Ci0gICAgICBoZWFkZXIuc3ltX2NvdW50ID4gMTAwMDAwIHx8Ci0gICAgICBoZWFkZXIueHJlZl9jb3VudCA+IDEwMDAwMCkKLSAgICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLQotICAvKgotICAgIFRoYXQgYWxsIHdvcmtlZCwgbGV0J3MgYnV5IHRoZSBzcGFjZSBmb3IgdGhlIGhlYWRlciBhbmQgcmVhZCBpbgotICAgIHRoZSBoZWFkZXJzLgotICAgICovCi0gIHsKLSAgICBvYXN5c19hcl9kYXRhX3R5cGUgKmFyID0KLSAgICAob2FzeXNfYXJfZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19hcl9kYXRhX3R5cGUpKTsKLQotICAgIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKm1vZHVsZSA9Ci0gICAgKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSkgKiBoZWFkZXIubW9kX2NvdW50KTsKLSAgICBvYXN5c19tb2R1bGVfdGFibGVfdHlwZSByZWNvcmQ7Ci0KLSAgICBpZiAoIWFyIHx8ICFtb2R1bGUpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGFiZmQtPnRkYXRhLm9hc3lzX2FyX2RhdGEgPSBhcjsKLSAgICBhci0+bW9kdWxlID0gbW9kdWxlOwotICAgIGFyLT5tb2R1bGVfY291bnQgPSBoZWFkZXIubW9kX2NvdW50OwotCi0gICAgZmlsZXBvcyA9IGhlYWRlci5tb2RfdGJsX29mZnNldDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVyLm1vZF9jb3VudDsgaSsrKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gTlVMTDsKLQotCS8qIFRoZXJlIGFyZSB0d28gd2F5cyBvZiBzcGVjaWZ5aW5nIHRoZSBhcmNoaXZlIGhlYWRlciAqLwotCi0JaWYgKDApCi0JICB7Ci0JICAgIG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2FfdHlwZSByZWNvcmRfZXh0OwotCSAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgcmVjb3JkX2V4dCwgMSwgc2l6ZW9mIChyZWNvcmRfZXh0KSwgYWJmZCkKLQkJIT0gc2l6ZW9mIChyZWNvcmRfZXh0KSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQotCSAgICByZWNvcmQubW9kX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQubW9kX3NpemUpOwotCSAgICByZWNvcmQuZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZmlsZV9vZmZzZXQpOwotCi0JICAgIHJlY29yZC5kZXBfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwX2NvdW50KTsKLQkgICAgcmVjb3JkLmRlcGVlX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcGVlX2NvdW50KTsKLQkgICAgcmVjb3JkLnNlY3RfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuc2VjdF9jb3VudCk7Ci0KLQkgICAgbW9kdWxlW2ldLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIDMzKTsKLQkgICAgaWYgKCFtb2R1bGVbaV0ubmFtZSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQotCSAgICBtZW1jcHkgKG1vZHVsZVtpXS5uYW1lLCByZWNvcmRfZXh0Lm1vZF9uYW1lLCAzMyk7Ci0JICAgIGZpbGVwb3MgKz0KLQkgICAgICBzaXplb2YgKHJlY29yZF9leHQpICsKLQkgICAgICByZWNvcmQuZGVwX2NvdW50ICogNCArCi0JICAgICAgcmVjb3JkLmRlcGVlX2NvdW50ICogNCArCi0JICAgICAgcmVjb3JkLnNlY3RfY291bnQgKiA4ICsgMTg3OwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYl90eXBlIHJlY29yZF9leHQ7Ci0JICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiByZWNvcmRfZXh0LCAxLCBzaXplb2YgKHJlY29yZF9leHQpLCBhYmZkKQotCQkhPSBzaXplb2YgKHJlY29yZF9leHQpKQotCSAgICAgIHJldHVybiBOVUxMOwotCi0JICAgIHJlY29yZC5tb2Rfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2Rfc2l6ZSk7Ci0JICAgIHJlY29yZC5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5maWxlX29mZnNldCk7Ci0KLQkgICAgcmVjb3JkLmRlcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBfY291bnQpOwotCSAgICByZWNvcmQuZGVwZWVfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwZWVfY291bnQpOwotCSAgICByZWNvcmQuc2VjdF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5zZWN0X2NvdW50KTsKLQkgICAgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQubW9kX25hbWVfbGVuZ3RoKTsKLQotCSAgICBtb2R1bGVbaV0ubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgKyAxKTsKLQkgICAgaWYgKCFtb2R1bGVbaV0ubmFtZSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBtb2R1bGVbaV0ubmFtZSwgMSwgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUsCi0JCQkgIGFiZmQpCi0JCSE9IHJlY29yZC5tb2R1bGVfbmFtZV9zaXplKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICBtb2R1bGVbaV0ubmFtZVtyZWNvcmQubW9kdWxlX25hbWVfc2l6ZV0gPSAwOwotCSAgICBmaWxlcG9zICs9Ci0JICAgICAgc2l6ZW9mIChyZWNvcmRfZXh0KSArCi0JICAgICAgcmVjb3JkLmRlcF9jb3VudCAqIDQgKwotCSAgICAgIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplICsgMTsKLQotCSAgfQotCi0KLQltb2R1bGVbaV0uc2l6ZSA9IHJlY29yZC5tb2Rfc2l6ZTsKLQltb2R1bGVbaV0ucG9zID0gcmVjb3JkLmZpbGVfb2Zmc2V0OwotCW1vZHVsZVtpXS5hYmZkID0gMDsKLSAgICAgIH0KLQotICB9Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLQotICBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA9IChvYXN5c19kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX2RhdGFfdHlwZSkpOwotICByZXR1cm4gYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLSNkZWZpbmUgTUFYX1NFQ1MgMTYKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9hc3lzX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG9hc3lzX2RhdGFfdHlwZSAqb2FzeXM7Ci0gIG9hc3lzX2RhdGFfdHlwZSAqc2F2ZSA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBib29sZWFuIGxvb3AgPSB0cnVlOwotICBib29sZWFuIGhhZF91c2VmdWxsID0gZmFsc2U7Ci0KLSAgYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPSAwOwotICBvYXN5c19ta29iamVjdCAoYWJmZCk7Ci0gIG9hc3lzID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIG1lbXNldCAoKFBUUikgb2FzeXMtPnNlY3Rpb25zLCAweGZmLCBzaXplb2YgKG9hc3lzLT5zZWN0aW9ucykpOwotCi0gIC8qIFBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBmYWlsOwotICBvYXN5cy0+c3ltYm9sX3N0cmluZ19sZW5ndGggPSAwOwotICAvKiBJbnNwZWN0IHRoZSByZWNvcmRzLCBidXQgb25seSBrZWVwIHRoZSBzZWN0aW9uIGluZm8gLQotICAgICByZW1lbWJlciB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9scwotICAgICAqLwotICBvYXN5cy0+Zmlyc3RfZGF0YV9yZWNvcmQgPSAwOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSByZWNvcmQ7Ci0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JZ290byBmYWlsOwotICAgICAgaWYgKChzaXplX3QpIHJlY29yZC5oZWFkZXIubGVuZ3RoIDwgKHNpemVfdCkgc2l6ZW9mIChyZWNvcmQuaGVhZGVyKSkKLQlnb3RvIGZhaWw7Ci0KLQotICAgICAgc3dpdGNoICgob2FzeXNfcmVjb3JkX2VudW1fdHlwZSkgKHJlY29yZC5oZWFkZXIudHlwZSkpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgaGFkX3VzZWZ1bGwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bToKLQkgIC8qIENvdW50IHN5bWJvbHMgYW5kIHJlbWVtYmVyIHRoZWlyIHNpemUgZm9yIGEgZnV0dXJlIG1hbGxvYyAgICovCi0JICBhYmZkLT5zeW1jb3VudCsrOwotCSAgb2FzeXMtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoICs9IDEgKyBvYXN5c19zdHJpbmdfbGVuZ3RoICgmcmVjb3JkKTsKLQkgIGhhZF91c2VmdWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3NlY3Rpb25fZW51bToKLQkgIHsKLQkgICAgYXNlY3Rpb24gKnM7Ci0JICAgIGNoYXIgKmJ1ZmZlcjsKLQkgICAgdW5zaWduZWQgaW50IHNlY3Rpb25fbnVtYmVyOwotCSAgICBpZiAocmVjb3JkLnNlY3Rpb24uaGVhZGVyLmxlbmd0aCAhPSBzaXplb2YgKHJlY29yZC5zZWN0aW9uKSkKLQkgICAgICB7Ci0JCWdvdG8gZmFpbDsKLQkgICAgICB9Ci0JICAgIGJ1ZmZlciA9IGJmZF9hbGxvYyAoYWJmZCwgMyk7Ci0JICAgIGlmICghYnVmZmVyKQotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgc2VjdGlvbl9udW1iZXIgPSByZWNvcmQuc2VjdGlvbi5yZWxiICYgUkVMT0NBVElPTl9TRUNUX0JJVFM7Ci0JICAgIHNwcmludGYgKGJ1ZmZlciwgIiV1Iiwgc2VjdGlvbl9udW1iZXIpOwotCSAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgYnVmZmVyKTsKLQkgICAgb2FzeXMtPnNlY3Rpb25zW3NlY3Rpb25fbnVtYmVyXSA9IHM7Ci0JICAgIHN3aXRjaCAocmVjb3JkLnNlY3Rpb24ucmVsYiAmIFJFTE9DQVRJT05fVFlQRV9CSVRTKQotCSAgICAgIHsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9BQlM6Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfUkVMOgotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9VTkQ6Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQlCRkRfRkFJTCAoKTsKLQkgICAgICB9Ci0KLQkgICAgcy0+X3Jhd19zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc2VjdGlvbi52YWx1ZSk7Ci0JICAgIHMtPnZtYSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLnNlY3Rpb24udm1hKTsKLQkgICAgcy0+ZmxhZ3MgPSAwOwotCSAgICBoYWRfdXNlZnVsbCA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19kYXRhX2VudW06Ci0JICBvYXN5cy0+Zmlyc3RfZGF0YV9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCkgLSByZWNvcmQuaGVhZGVyLmxlbmd0aDsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19kZWJ1Z19lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX21vZHVsZV9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX25hbWVkX3NlY3Rpb25fZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19lbmRfZW51bToKLQkgIGlmIChoYWRfdXNlZnVsbCA9PSBmYWxzZSkKLQkgICAgZ290byBmYWlsOwotCSAgbG9vcCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGdvdG8gZmFpbDsKLQl9Ci0gICAgfQotICBvYXN5cy0+c3ltYm9scyA9IChhc3ltYm9sICopIE5VTEw7Ci0gIC8qCi0gICAgT2FzeXMgc3VwcG9ydCBzZXZlcmFsIGFyY2hpdGVjdHVyZXMsIGJ1dCBJIGNhbid0IHNlZSBhIHNpbXBsZSB3YXkKLSAgICB0byBkaXNjb3ZlciB3aGljaCBvbmUgaXMgaW4gYSBwYXJ0aWN1bGFyIGZpbGUgLSB3ZSdsbCBndWVzcwotICAgICovCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX202OGssIDApOwotICBpZiAoYWJmZC0+c3ltY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLSAgICB9Ci0KLSAgLyoKLSAgICBXZSBkb24ndCBrbm93IGlmIGEgc2VjdGlvbiBoYXMgZGF0YSB1bnRpbCB3ZSd2ZSByZWFkIGl0Li4KLSAgICAqLwotCi0gIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCk7Ci0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotZmFpbDoKLSAgKHZvaWQpIGJmZF9yZWxlYXNlIChhYmZkLCBvYXN5cyk7Ci0gIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID0gc2F2ZTsKLSAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW9hc3lzX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoIXN5bWJvbC0+c2VjdGlvbikKLSAgICByZXQtPnR5cGUgPSAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkgPyAnYScgOiAnQSc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYXN5c19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMID8KLQkoQ09OU1QgY2hhciAqKSAiKmFicyIgOiBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkJIHNlY3Rpb25fbmFtZSwKLQkJIHN5bWJvbC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0vKgotIFRoZSBob3d0byB0YWJsZSBpcyBidWlsZCB1c2luZyB0aGUgdG9wIHR3byBiaXRzIG9mIGEgcmVsb2MgYnl0ZSB0bwotIGluZGV4IGludG8gaXQuIFRoZSBiaXRzIGFyZSBQQ1JFTCxXT1JEL0xPTkcKLSovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KLXsKLQotICBIT1dUTyAoMCwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInBjcmVsMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPICgwLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicGNyZWwzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKQotfTsKLQotLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgcmVjb3JkOwotICBvYXN5c19kYXRhX3R5cGUgKmRhdGEgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLQotICBvYXN5c19wZXJfc2VjdGlvbl90eXBlICpwZXI7Ci0KLSAgYXNlY3Rpb24gKnM7Ci0KLSAgLyogU2VlIGlmIHRoZSBkYXRhIGhhcyBiZWVuIHNsdXJwZWQgYWxyZWFkeSAuLiAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgcGVyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHMpOwotICAgICAgaWYgKHBlci0+aW5pdGlhbGl6ZWQgPT0gdHJ1ZSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGRhdGEtPmZpcnN0X2RhdGFfcmVjb3JkID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhLT5maXJzdF9kYXRhX3JlY29yZCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3dpdGNoIChyZWNvcmQuaGVhZGVyLnR5cGUpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZGF0YV9lbnVtOgotCSAgewotCi0JICAgIGJmZF9ieXRlICpzcmMgPSByZWNvcmQuZGF0YS5kYXRhOwotCSAgICBiZmRfYnl0ZSAqZW5kX3NyYyA9ICgoYmZkX2J5dGUgKikgJiByZWNvcmQpICsgcmVjb3JkLmhlYWRlci5sZW5ndGg7Ci0JICAgIGJmZF9ieXRlICpkc3RfcHRyOwotCSAgICBiZmRfYnl0ZSAqZHN0X2Jhc2VfcHRyOwotCSAgICB1bnNpZ25lZCBpbnQgcmVsYml0OwotCSAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uID0KLQkgICAgZGF0YS0+c2VjdGlvbnNbcmVjb3JkLmRhdGEucmVsYiAmIFJFTE9DQVRJT05fU0VDVF9CSVRTXTsKLQkgICAgYmZkX3ZtYSBkc3Rfb2Zmc2V0OwotCi0JICAgIHBlciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKTsKLQotCSAgICBpZiAocGVyLT5pbml0aWFsaXplZCA9PSBmYWxzZSkKLQkgICAgICB7Ci0JCXBlci0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCQlpZiAoIXBlci0+ZGF0YSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXBlci0+cmVsb2NfdGFpbF9wdHIgPSAob2FzeXNfcmVsb2NfdHlwZSAqKikgJiAoc2VjdGlvbi0+cmVsb2NhdGlvbik7Ci0JCXBlci0+aGFkX3ZtYSA9IGZhbHNlOwotCQlwZXItPmluaXRpYWxpemVkID0gdHJ1ZTsKLQkJc2VjdGlvbi0+cmVsb2NfY291bnQgPSAwOwotCQlzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgICB9Ci0KLQkgICAgZHN0X29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLmRhdGEuYWRkcik7Ci0JICAgIGlmIChwZXItPmhhZF92bWEgPT0gZmFsc2UpCi0JICAgICAgewotCQkvKiBUYWtlIHRoZSBmaXJzdCB2bWEgd2Ugc2VlIGFzIHRoZSBiYXNlICovCi0JCXNlY3Rpb24tPnZtYSA9IGRzdF9vZmZzZXQ7Ci0JCXBlci0+aGFkX3ZtYSA9IHRydWU7Ci0JICAgICAgfQotCi0JICAgIGRzdF9vZmZzZXQgLT0gc2VjdGlvbi0+dm1hOwotCi0JICAgIGRzdF9iYXNlX3B0ciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YTsKLQkgICAgZHN0X3B0ciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArCi0JICAgICAgZHN0X29mZnNldDsKLQotCSAgICBpZiAoc3JjIDwgZW5kX3NyYykKLQkgICAgICB7Ci0JCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLQkgICAgICB9Ci0JICAgIHdoaWxlIChzcmMgPCBlbmRfc3JjKQotCSAgICAgIHsKLQkJdW5zaWduZWQgY2hhciBtb2RfYnl0ZSA9ICpzcmMrKzsKLQkJc2l6ZV90IGdhcCA9IGVuZF9zcmMgLSBzcmM7Ci0KLQkJY291bnQgPSA4OwotCQlpZiAobW9kX2J5dGUgPT0gMCAmJiBnYXAgPj0gOCkKLQkJICB7Ci0JCSAgICBkc3RfcHRyWzBdID0gc3JjWzBdOwotCQkgICAgZHN0X3B0clsxXSA9IHNyY1sxXTsKLQkJICAgIGRzdF9wdHJbMl0gPSBzcmNbMl07Ci0JCSAgICBkc3RfcHRyWzNdID0gc3JjWzNdOwotCQkgICAgZHN0X3B0cls0XSA9IHNyY1s0XTsKLQkJICAgIGRzdF9wdHJbNV0gPSBzcmNbNV07Ci0JCSAgICBkc3RfcHRyWzZdID0gc3JjWzZdOwotCQkgICAgZHN0X3B0cls3XSA9IHNyY1s3XTsKLQkJICAgIGRzdF9wdHIgKz0gODsKLQkJICAgIHNyYyArPSA4OwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGZvciAocmVsYml0ID0gMTsgY291bnQtLSAhPSAwICYmIHNyYyA8IGVuZF9zcmM7IHJlbGJpdCA8PD0gMSkKLQkJICAgICAgewotCQkJaWYgKHJlbGJpdCAmIG1vZF9ieXRlKQotCQkJICB7Ci0JCQkgICAgdW5zaWduZWQgY2hhciByZWxvYyA9ICpzcmM7Ci0JCQkgICAgLyogVGhpcyBpdGVtIG5lZWRzIHRvIGJlIHJlbG9jYXRlZCAqLwotCQkJICAgIHN3aXRjaCAocmVsb2MgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQotCQkJCWJyZWFrOwotCi0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6Ci0JCQkJewotCQkJCSAgLyogUmVsb2NhdGUgdGhlIGl0ZW0gcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24gKi8KLQkJCQkgIG9hc3lzX3JlbG9jX3R5cGUgKnIgPQotCQkJCSAgKG9hc3lzX3JlbG9jX3R5cGUgKikKLQkJCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgICBzaXplb2YgKG9hc3lzX3JlbG9jX3R5cGUpKTsKLQkJCQkgIGlmICghcikKLQkJCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJCSAgKihwZXItPnJlbG9jX3RhaWxfcHRyKSA9IHI7Ci0JCQkJICBwZXItPnJlbG9jX3RhaWxfcHRyID0gJnItPm5leHQ7Ci0JCQkJICByLT5uZXh0ID0gKG9hc3lzX3JlbG9jX3R5cGUgKikgTlVMTDsKLQkJCQkgIC8qIFJlZmVyZW5jZSB0byB1bmRlZmluZWQgc3ltYm9sICovCi0JCQkJICBzcmMrKzsKLQkJCQkgIC8qIFRoZXJlIGlzIG5vIHN5bWJvbCAqLwotCQkJCSAgci0+c3ltYm9sID0gMDsKLQkJCQkgIC8qIFdvcmsgb3V0IHRoZSBob3d0byAqLwotCQkJCSAgYWJvcnQgKCk7Ci0jaWYgMAotCQkJCSAgci0+cmVsZW50LnNlY3Rpb24gPQotCQkJCSAgICBkYXRhLT5zZWN0aW9uc1tyZWxvYyAmCi0JCQkJCQkgICBSRUxPQ0FUSU9OX1NFQ1RfQklUU107Ci0KLQkJCQkgIHItPnJlbGVudC5hZGRlbmQgPSAtCi0JCQkJICAgIHItPnJlbGVudC5zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQkJCQkgIHItPnJlbGVudC5hZGRyZXNzID0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgIHItPnJlbGVudC5ob3d0byA9ICZob3d0b190YWJsZVtyZWxvYyA+PiA2XTsKLQkJCQkgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCQkJCSAgc2VjdGlvbi0+cmVsb2NfY291bnQrKzsKLQotCQkJCSAgLyogRmFrZSB1cCB0aGUgZGF0YSB0byBsb29rIGxpa2UgaXQncyBnb3QgdGhlIC12ZSBwYyBpbiBpdCwgdGhpcyBtYWtlcwotCQkJCSAgICAgICBpdCBtdWNoIGVhc2llciB0byBjb252ZXJ0IGludG8gb3RoZXIgZm9ybWF0cy4gVGhpcyBpcyBkb25lIGJ5Ci0JCQkJICAgICAgIGhpdHRpbmcgdGhlIGFkZGVuZC4KLQkJCQkgICAgICAgKi8KLQkJCQkgIGlmIChyLT5yZWxlbnQuaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0JCQkJICAgIHsKLQkJCQkgICAgICByLT5yZWxlbnQuYWRkZW5kIC09IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7Ci0JCQkJICAgIH0KLQotCi0JCQkJfQotCQkJCWJyZWFrOwotCi0KLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKLQkJCQl7Ci0JCQkJICBvYXN5c19yZWxvY190eXBlICpyID0KLQkJCQkgIChvYXN5c19yZWxvY190eXBlICopCi0JCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgc2l6ZW9mIChvYXN5c19yZWxvY190eXBlKSk7Ci0JCQkJICBpZiAoIXIpCi0JCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCQkgICoocGVyLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkJCSAgcGVyLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkJCSAgci0+bmV4dCA9IChvYXN5c19yZWxvY190eXBlICopIE5VTEw7Ci0JCQkJICAvKiBSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIHN5bWJvbCAqLwotCQkJCSAgc3JjKys7Ci0JCQkJICAvKiBHZXQgc3ltYm9sIG51bWJlciAqLwotCQkJCSAgci0+c3ltYm9sID0gKHNyY1swXSA8PCA4KSB8IHNyY1sxXTsKLQkJCQkgIC8qIFdvcmsgb3V0IHRoZSBob3d0byAqLwotCQkJCSAgYWJvcnQgKCk7Ci0KLSNpZiAwCi0JCQkJICByLT5yZWxlbnQuc2VjdGlvbiA9IChhc2VjdGlvbgotCQkJCQkJICAgICAgICopIE5VTEw7Ci0jZW5kaWYKLQkJCQkgIHItPnJlbGVudC5hZGRlbmQgPSAwOwotCQkJCSAgci0+cmVsZW50LmFkZHJlc3MgPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmhvd3RvX3RhYmxlW3JlbG9jID4+IDZdOwotCQkJCSAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0JCQkJICBzZWN0aW9uLT5yZWxvY19jb3VudCsrOwotCi0JCQkJICBzcmMgKz0gMjsKLQkJCQkgIC8qIEZha2UgdXAgdGhlIGRhdGEgdG8gbG9vayBsaWtlIGl0J3MgZ290IHRoZSAtdmUgcGMgaW4gaXQsIHRoaXMgbWFrZXMKLQkJCQkgICAgICAgaXQgbXVjaCBlYXNpZXIgdG8gY29udmVydCBpbnRvIG90aGVyIGZvcm1hdHMuIFRoaXMgaXMgZG9uZSBieQotCQkJCSAgICAgICBoaXR0aW5nIHRoZSBhZGRlbmQuCi0JCQkJICAgICAgICovCi0JCQkJICBpZiAoci0+cmVsZW50Lmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotCQkJCSAgICB7Ci0JCQkJICAgICAgci0+cmVsZW50LmFkZGVuZCAtPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgICB9Ci0KLQotCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQkJCUJGRF9GQUlMICgpOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQkqZHN0X3B0cisrID0gKnNyYysrOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9IChQVFIpCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUpKTsKLSAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPnNlY3Rpb24gPSBuZXdzZWN0OwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPm9mZnNldCA9IDA7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+aW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMTsKLSAgLyogVHVybiB0aGUgc2VjdGlvbiBzdHJpbmcgaW50byBhbiBpbmRleCAqLwotCi0gIHNzY2FuZiAobmV3c2VjdC0+bmFtZSwgIiV1IiwgJm5ld3NlY3QtPnRhcmdldF9pbmRleCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGxvbmcKLW9hc3lzX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKCEgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgb2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChvYXN5c19wZXJfc2VjdGlvbl90eXBlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpOwotICBpZiAocC0+aW5pdGlhbGl6ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgKHZvaWQpIG1lbXNldCAobG9jYXRpb24sIDAsIChpbnQpIGNvdW50KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAodm9pZCkgbWVtY3B5IChsb2NhdGlvbiwgKFBUUikgKHAtPmRhdGEgKyBvZmZzZXQpLCAoaW50KSBjb3VudCk7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1sb25nCi1vYXN5c19jYW5vbmljYWxpemVfcmVsb2MgKGlnbm9yZV9hYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCByZWxvY19jb3VudCA9IDA7Ci0gIG9hc3lzX3JlbG9jX3R5cGUgKnNyYyA9IChvYXN5c19yZWxvY190eXBlICopIChzZWN0aW9uLT5yZWxvY2F0aW9uKTsKLSAgd2hpbGUgKHNyYyAhPSAob2FzeXNfcmVsb2NfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFib3J0ICgpOwotCi0jaWYgMAotICAgICAgaWYgKHNyYy0+cmVsZW50LnNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgc3JjLT5zeW1ib2w7Ci0JfQotI2VuZGlmCi0KLSAgICAgICpyZWxwdHIrKyA9ICZzcmMtPnJlbGVudDsKLSAgICAgIHNyYyA9IHNyYy0+bmV4dDsKLSAgICAgIHJlbG9jX2NvdW50Kys7Ci0gICAgfQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50ID0gcmVsb2NfY291bnQ7Ci19Ci0KLQotCi0KLS8qIFdyaXRpbmcgKi8KLQotCi0vKiBDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGFuZCB3cml0ZSBvbmUgcmVjb3JkICovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLCB0eXBlLCByZWNvcmQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgb2FzeXNfcmVjb3JkX2VudW1fdHlwZSB0eXBlOwotICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqcmVjb3JkOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgaW50IGNoZWNrc3VtOwotICBzaXplX3QgaTsKLSAgdW5zaWduZWQgY2hhciAqcHRyOwotCi0gIHJlY29yZC0+aGVhZGVyLmxlbmd0aCA9IHNpemU7Ci0gIHJlY29yZC0+aGVhZGVyLnR5cGUgPSAoaW50KSB0eXBlOwotICByZWNvcmQtPmhlYWRlci5jaGVja19zdW0gPSAwOwotICByZWNvcmQtPmhlYWRlci5maWxsID0gMDsKLSAgcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgJnJlY29yZC0+cGFkWzBdOwotICBjaGVja3N1bSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgY2hlY2tzdW0gKz0gKnB0cisrOwotICAgIH0KLSAgcmVjb3JkLT5oZWFkZXIuY2hlY2tfc3VtID0gMHhmZiAmICgtY2hlY2tzdW0pOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSByZWNvcmQsIDEsIHNpemUsIGFiZmQpICE9IHNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBXcml0ZSBvdXQgYWxsIHRoZSBzeW1ib2xzICovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfc3ltcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGFzeW1ib2wgKipnZW5lcmljID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7IGNvdW50KyspCi0gICAgewotCi0gICAgICBvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUgc3ltYm9sOwotICAgICAgYXN5bWJvbCAqQ09OU1QgZyA9IGdlbmVyaWNbY291bnRdOwotCi0gICAgICBDT05TVCBjaGFyICpzcmMgPSBnLT5uYW1lOwotICAgICAgY2hhciAqZHN0ID0gc3ltYm9sLm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbCA9IDA7Ci0KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGctPnNlY3Rpb24pKQotCXsKLQkgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX0NPTTsKLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW5kZXgsIHN5bWJvbC5yZWZubyk7Ci0JICBpbmRleCsrOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoZy0+c2VjdGlvbikpCi0JewotCSAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfQUJTOwotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCAwLCBzeW1ib2wucmVmbm8pOwotCi0JfQotICAgICAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChnLT5zZWN0aW9uKSkKLQl7Ci0JICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9VTkQ7Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluZGV4LCBzeW1ib2wucmVmbm8pOwotCSAgLyogT3ZlcmxvYWQgdGhlIHZhbHVlIGZpZWxkIHdpdGggdGhlIG91dHB1dCBpbmRleCBudW1iZXIgKi8KLQkgIGluZGV4Kys7Ci0JfQotICAgICAgZWxzZSBpZiAoZy0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotCXsKLQkgIC8qIHRocm93IGl0IGF3YXkgKi8KLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZy0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFNvbWV0aW1lLCB0aGUgb2FzeXMgdG9vbHMgZ2l2ZSBvdXQgYSBzeW1ib2wgd2l0aCBpbGxlZ2FsCi0JICAgYml0cyBpbiBpdCwgd2UnbGwgb3V0cHV0IGl0IGluIHRoZSBzYW1lIGJyb2tlbiB3YXkgKi8KLQotCSAgICAgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX1JFTCB8IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX1JFTCB8IGctPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgIH0KLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMCwgc3ltYm9sLnJlZm5vKTsKLQl9Ci0jaWZkZWYgVU5ERVJTQ09SRV9IQUNLCi0gICAgICBpZiAoc3JjW2xdID09ICdfJykKLQlkc3RbbCsrXSA9ICcuJzsKLSNlbmRpZgotICAgICAgd2hpbGUgKHNyY1tsXSkKLQl7Ci0JICBkc3RbbF0gPSBzcmNbbF07Ci0JICBsKys7Ci0JfQotCi0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGctPnZhbHVlLCBzeW1ib2wudmFsdWUpOwotCi0KLSAgICAgIGlmIChnLT5mbGFncyAmIEJTRl9MT0NBTCkKLQl7Ci0JICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkJICAgIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtLAotCQkJCSAgICAob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiBzeW1ib2wsCi0JCQkJICAgIG9mZnNldG9mIChvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUsCi0JCQkJCSAgICAgIG5hbWVbMF0pICsgbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJCSAgICBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW0sCi0JCQkJICAgIChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIHN5bWJvbCwKLQkJCQkgICAgb2Zmc2V0b2YgKG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSwKLQkJCQkJICAgICAgbmFtZVswXSkgKyBsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGctPnZhbHVlID0gaW5kZXggLSAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0gLyogV3JpdGUgYSBzZWN0aW9uIGhlYWRlciBmb3IgZWFjaCBzZWN0aW9uICovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfc2VjdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIHN0YXRpYyBvYXN5c19zZWN0aW9uX3JlY29yZF90eXBlIG91dDsKLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgcy0+bmFtZVswXSkpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIG9hc3lzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgcy0+bmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBvdXQucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9SRUwgfCBzLT50YXJnZXRfaW5kZXg7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHMtPl9jb29rZWRfc2l6ZSwgb3V0LnZhbHVlKTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcy0+dm1hLCBvdXQudm1hKTsKLQotICAgICAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJCW9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW0sCi0JCQkJKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgb3V0LAotCQkJCXNpemVvZiAob3V0KSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQ3JlYXRlIGFuZCB3cml0ZSB0aGUgaGVhZGVyICovCi0gIG9hc3lzX2hlYWRlcl9yZWNvcmRfdHlwZSByOwotICBzaXplX3QgbGVuZ3RoID0gc3RybGVuIChhYmZkLT5maWxlbmFtZSk7Ci0gIGlmIChsZW5ndGggPiAoc2l6ZV90KSBzaXplb2YgKHIubW9kdWxlX25hbWUpKQotICAgIHsKLSAgICAgIGxlbmd0aCA9IHNpemVvZiAoci5tb2R1bGVfbmFtZSk7Ci0gICAgfQotCi0gICh2b2lkKSBtZW1jcHkgKHIubW9kdWxlX25hbWUsCi0JCSBhYmZkLT5maWxlbmFtZSwKLQkJIGxlbmd0aCk7Ci0gICh2b2lkKSBtZW1zZXQgKHIubW9kdWxlX25hbWUgKyBsZW5ndGgsCi0JCSAnICcsCi0JCSBzaXplb2YgKHIubW9kdWxlX25hbWUpIC0gbGVuZ3RoKTsKLQotICByLnZlcnNpb25fbnVtYmVyID0gT0FTWVNfVkVSU0lPTl9OVU1CRVI7Ci0gIHIucmV2X251bWJlciA9IE9BU1lTX1JFVl9OVU1CRVI7Ci0gIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCSAgICBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW0sCi0JCQkgICAgKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgciwKLQkJCSAgICBvZmZzZXRvZiAob2FzeXNfaGVhZGVyX3JlY29yZF90eXBlLAotCQkJCSAgICAgIGRlc2NyaXB0aW9uWzBdKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfZW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG9hc3lzX2VuZF9yZWNvcmRfdHlwZSBlbmQ7Ci0gIHVuc2lnbmVkIGNoYXIgbnVsbCA9IDA7Ci0gIGVuZC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX0FCUzsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBhYmZkLT5zdGFydF9hZGRyZXNzLCBlbmQuZW50cnkpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIDAsIGVuZC5maWxsKTsKLSAgZW5kLnplcm8gPSAwOwotICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkgICAgb2FzeXNfcmVjb3JkX2lzX2VuZF9lbnVtLAotCQkJICAgIChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIGVuZCwKLQkJCSAgICBzaXplb2YgKGVuZCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBudWxsLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbXAgKGFwLCBicCkKLSAgICAgQ09OU1QgUFRSIGFwOwotICAgICBDT05TVCBQVFIgYnA7Ci17Ci0gIGFyZWxlbnQgKmEgPSAqKChhcmVsZW50ICoqKSBhcCk7Ci0gIGFyZWxlbnQgKmIgPSAqKChhcmVsZW50ICoqKSBicCk7Ci0gIHJldHVybiBhLT5hZGRyZXNzIC0gYi0+YWRkcmVzczsKLX0KLQotLyoKLSBXcml0aW5nIGRhdGEuLgotCi0qLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKLQl7Ci0JICBiZmRfYnl0ZSAqcmF3X2RhdGEgPSBvYXN5c19wZXJfc2VjdGlvbiAocyktPmRhdGE7Ci0JICBvYXN5c19kYXRhX3JlY29yZF90eXBlIHByb2Nlc3NlZF9kYXRhOwotCSAgYmZkX3NpemVfdHlwZSBjdXJyZW50X2J5dGVfaW5kZXggPSAwOwotCSAgdW5zaWduZWQgaW50IHJlbG9jc190b19nbyA9IHMtPnJlbG9jX2NvdW50OwotCSAgYXJlbGVudCAqKnAgPSBzLT5vcmVsb2NhdGlvbjsKLQkgIGlmIChzLT5yZWxvY19jb3VudCAhPSAwKQotCSAgICB7Ci0vKiBTb3J0IHRoZSByZWxvYyByZWNvcmRzIHNvIGl0J3MgZWFzeSB0byBpbnNlcnQgdGhlIHJlbG9jcyBpbnRvIHRoZQotCSAgIGRhdGEgKi8KLQotCSAgICAgIHFzb3J0IChzLT5vcmVsb2NhdGlvbiwKLQkJICAgICBzLT5yZWxvY19jb3VudCwKLQkJICAgICBzaXplb2YgKGFyZWxlbnQgKiopLAotCQkgICAgIGNvbXApOwotCSAgICB9Ci0JICBjdXJyZW50X2J5dGVfaW5kZXggPSAwOwotCSAgcHJvY2Vzc2VkX2RhdGEucmVsYiA9IHMtPnRhcmdldF9pbmRleCB8IFJFTE9DQVRJT05fVFlQRV9SRUw7Ci0KLQkgIHdoaWxlIChjdXJyZW50X2J5dGVfaW5kZXggPCBzLT5fY29va2VkX3NpemUpCi0JICAgIHsKLQkgICAgICAvKiBTY2FuIGZvcndhcmRzIGJ5IGVpZ2h0IGJ5dGVzIG9yIGhvd2V2ZXIgbXVjaCBpcyBsZWZ0IGFuZCBzZWUgaWYKLQkgICAgICAgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9ucyBnb2luZyBvbiAqLwotCSAgICAgIGJmZF9ieXRlICptb2QgPSAmcHJvY2Vzc2VkX2RhdGEuZGF0YVswXTsKLQkgICAgICBiZmRfYnl0ZSAqZHN0ID0gJnByb2Nlc3NlZF9kYXRhLmRhdGFbMV07Ci0KLQkgICAgICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0JICAgICAgKm1vZCA9IDA7Ci0KLQotCSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcy0+dm1hICsgY3VycmVudF9ieXRlX2luZGV4LAotCQkJICAgIHByb2Nlc3NlZF9kYXRhLmFkZHIpOwotCi0JICAgICAgLyogRG9uJ3Qgc3RhcnQgYSByZWxvY2F0aW9uIHVubGVzcyB5b3UncmUgc3VyZSB5b3UgY2FuIGZpbmlzaCBpdAotIAkgICAgICAgd2l0aGluIHRoZSBzYW1lIGRhdGEgcmVjb3JkLiAgVGhlIHdvcnN0IGNhc2UgcmVsb2NhdGlvbiBpcyBhCi0gCSAgICAgICA0LWJ5dGUgcmVsb2NhdGFibGUgdmFsdWUgd2hpY2ggaXMgc3BsaXQgYWNyb3NzIHR3byBtb2RpZmljYXRpb24KLSAJICAgICAgIGJ5dGVzICgxIHJlbG9jYXRpb24gYnl0ZSArIDIgc3ltYm9sIHJlZmVyZW5jZSBieXRlcyArIDIgZGF0YSArCi0gCSAgICAgICAxIG1vZGlmaWNhdGlvbiBieXRlICsgMiBkYXRhID0gOCBieXRlcyB0b3RhbCkuICBUaGF0J3Mgd2hlcmUKLSAJICAgICAgIHRoZSBtYWdpYyBudW1iZXIgOCBjb21lcyBmcm9tLgotIAkgICAgKi8KLQkgICAgICB3aGlsZSAoY3VycmVudF9ieXRlX2luZGV4IDwgcy0+X3Jhd19zaXplICYmIGRzdCA8PQotCQkgICAgICZwcm9jZXNzZWRfZGF0YS5kYXRhW3NpemVvZiAocHJvY2Vzc2VkX2RhdGEuZGF0YSkgLSA4XSkKLQkJewotCi0KLQkJICBpZiAocmVsb2NzX3RvX2dvICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGFyZWxlbnQgKnIgPSAqcDsKLQkJICAgICAgcmVsb2NfaG93dG9fdHlwZSAqY29uc3QgaG93ID0gci0+aG93dG87Ci0JCSAgICAgIC8qIFRoZXJlIGlzIGEgcmVsb2NhdGlvbiwgaXMgaXQgZm9yIHRoaXMgYnl0ZSA/ICovCi0JCSAgICAgIGlmIChyLT5hZGRyZXNzID09IGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkJCXsKLQkJCSAgdW5zaWduZWQgY2hhciByZWxfYnl0ZTsKLQotCQkJICBwKys7Ci0JCQkgIHJlbG9jc190b19nby0tOwotCi0JCQkgICptb2QgfD0gKDEgPDwgaSk7Ci0JCQkgIGlmIChob3ctPnBjX3JlbGF0aXZlKQotCQkJICAgIHsKLQkJCSAgICAgIHJlbF9ieXRlID0gUkVMT0NBVElPTl9QQ1JFTF9CSVQ7Ci0KLQkJCSAgICAgIC8qIEFsc28gcGF0Y2ggdGhlIHJhdyBkYXRhIHNvIHRoYXQgaXQgZG9lc24ndCBoYXZlCi0JCQkgdGhlIC12ZSBzdHVmZiBhbnkgbW9yZSAqLwotCQkJICAgICAgaWYgKGhvdy0+c2l6ZSAhPSAyKQotCQkJCXsKLQkJCQkgIGJmZF9wdXRfMTYgKGFiZmQsCi0JCQkJCSAgICAgIGJmZF9nZXRfMTYgKGFiZmQsIHJhd19kYXRhKSArCi0JCQkJCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCwgcmF3X2RhdGEpOwotCQkJCX0KLQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGJmZF9wdXRfMzIgKGFiZmQsCi0JCQkJCSAgICAgIGJmZF9nZXRfMzIgKGFiZmQsIHJhd19kYXRhKSArCi0JCQkJCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCwgcmF3X2RhdGEpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICByZWxfYnl0ZSA9IDA7Ci0JCQkgICAgfQotCQkJICBpZiAoaG93LT5zaXplID09IDIpCi0JCQkgICAgewotCQkJICAgICAgcmVsX2J5dGUgfD0gUkVMT0NBVElPTl8zMkJJVF9CSVQ7Ci0JCQkgICAgfQotCi0JCQkgIC8qIElzIHRoaXMgYSBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24sIG9yIGEgc3ltYm9sCi0JCSAgICAgICByZWxhdGl2ZSByZWxvY2F0aW9uID8gKi8KLQkJCSAgYWJvcnQgKCk7Ci0KLSNpZiAwCi0JCQkgIGlmIChyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFRoZSByZWxlbnQgaGFzIGEgc2VjdGlvbiBhdHRhY2hlZCwgc28gaXQgbXVzdCBiZSBzZWN0aW9uCi0JCQkgICAgIHJlbGF0aXZlICovCi0JCQkgICAgICByZWxfYnl0ZSB8PSBSRUxPQ0FUSU9OX1RZUEVfUkVMOwotCQkJICAgICAgcmVsX2J5dGUgfD0gci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJCSAgICAgICpkc3QrKyA9IHJlbF9ieXRlOwotCQkJICAgIH0KLQkJCSAgZWxzZQotI2VuZGlmCi0JCQkgICAgewotCQkJICAgICAgYXN5bWJvbCAqcCA9ICooci0+c3ltX3B0cl9wdHIpOwotCi0JCQkgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYSBzZWN0aW9uIGF0dGFjaGVkLCB0aGVuIGl0Ci0JCQkgICAgIGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuICBDaGFuZ2UgZnJvbSBhIHN5bWJvbAotCQkJICAgICByZWYgdG8gYSBzZWN0aW9uIHJlZiAqLwotCQkJICAgICAgaWYgKHAtPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCQkJewotCQkJCSAgcmVsX2J5dGUgfD0gUkVMT0NBVElPTl9UWVBFX1JFTDsKLQkJCQkgIHJlbF9ieXRlIHw9Ci0JCQkJICAgIHAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JCQkJICAqZHN0KysgPSByZWxfYnl0ZTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgcmVsX2J5dGUgfD0gUkVMT0NBVElPTl9UWVBFX1VORDsKLQkJCQkgICpkc3QrKyA9IHJlbF9ieXRlOwotCQkJCSAgLyogTmV4dCB0d28gYnl0ZXMgYXJlIGEgc3ltYm9sIGluZGV4IC0gd2UgY2FuIGdldAotCQkJICAgICAgIHRoaXMgZnJvbSB0aGUgc3ltYm9sIHZhbHVlIHdoaWNoIGhhcyBiZWVuIHphcHBlZAotCQkJICAgICAgIGludG8gdGhlIHN5bWJvbCBpbmRleCBpbiB0aGUgdGFibGUgd2hlbiB0aGUKLQkJCSAgICAgICBzeW1ib2wgdGFibGUgd2FzIHdyaXR0ZW4KLQkJCSAgICAgICAqLwotCQkJCSAgKmRzdCsrID0gcC0+dmFsdWUgPj4gODsKLQkJCQkgICpkc3QrKyA9IHAtPnZhbHVlOwotCQkJCX0KLQkJCSAgICB9Ci0jZGVmaW5lIEFEVkFOQ0UgeyBpZiAoKytpID49IDgpIHsgaSA9IDA7IG1vZCA9IGRzdCsrOyAqbW9kID0gMDsgfSBjdXJyZW50X2J5dGVfaW5kZXgrKzsgfQotCQkJICAvKiByZWxvY2F0aW9ucyBuZXZlciBvY2N1ciBmcm9tIGFuIHVubG9hZGFibGUgc2VjdGlvbiwKLQkJICAgICAgIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCByYXdfZGF0YSBpcyBub3QgTlVMTAotCQkgICAgICovCi0JCQkgICpkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkJICBBRFZBTkNFCi0JCQkgICAgKiBkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkJICBBRFZBTkNFCi0JCQkgICAgaWYgKGhvdy0+c2l6ZSA9PSAyKQotCQkJICAgIHsKLQkJCSAgICAgICpkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkJICAgICAgQURWQU5DRQotCQkJCSogZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJCSAgICAgIEFEVkFOQ0UKLQkJCSAgICB9Ci0JCQkgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgfQotCQkgIC8qIElmIHRoaXMgaXMgY29taW5nIGZyb20gYW4gdW5sb2FkYWJsZSBzZWN0aW9uIHRoZW4gY29weQotCQkgICB6ZXJvcyAqLwotCQkgIGlmIChyYXdfZGF0YSA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICAqZHN0KysgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKmRzdCsrID0gKnJhd19kYXRhKys7Ci0JCSAgICB9Ci0JCSAgQURWQU5DRQotCQl9Ci0KLQkgICAgICAvKiBEb24ndCB3cml0ZSBhIHVzZWxlc3MgbnVsbCBtb2RpZmljYXRpb24gYnl0ZSAqLwotCSAgICAgIGlmIChkc3QgPT0gbW9kICsgMSkKLQkJewotCQkgIC0tZHN0OwotCQl9Ci0KLQkgICAgICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkJCW9hc3lzX3JlY29yZF9pc19kYXRhX2VudW0sCi0JCQkJCSgob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikKLQkJCQkJICYgcHJvY2Vzc2VkX2RhdGEpLAotCQkJCQlkc3QgLSAoYmZkX2J5dGUgKikgJiBwcm9jZXNzZWRfZGF0YSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfaGVhZGVyIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIG9hc3lzX3dyaXRlX3N5bXMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfZGF0YSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBvYXN5c193cml0ZV9lbmQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0KLS8qKiBleGVjIGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KLQotLyogc2V0IHNlY3Rpb24gY29udGVudHMgaXMgY29tcGxpY2F0ZWQgd2l0aCBPQVNZUyBzaW5jZSB0aGUgZm9ybWF0IGlzCi0qIG5vdCBhIGJ5dGUgaW1hZ2UsIGJ1dCBhIHJlY29yZCBzdHJlYW0uCi0qLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAob2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCXsKLQkgIG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSA9Ci0JICAgIChiZmRfYnl0ZSAqKSAoYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fY29va2VkX3NpemUpKTsKLQkgIGlmICghb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKHZvaWQpIG1lbWNweSAoKFBUUikgKG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArIG9mZnNldCksCi0JCSAgICAgbG9jYXRpb24sCi0JCSAgICAgKHNpemVfdCkgY291bnQpOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0vKiBOYXRpdmUtbGV2ZWwgaW50ZXJmYWNlIHRvIHN5bWJvbHMuICovCi0KLS8qIFdlIHJlYWQgdGhlIHN5bWJvbHMgaW50byBhIGJ1ZmZlciwgd2hpY2ggaXMgZGlzY2FyZGVkIHdoZW4gdGhpcwotZnVuY3Rpb24gZXhpdHMuICBXZSByZWFkIHRoZSBzdHJpbmdzIGludG8gYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvCi1ob2xkIHRoZW0gYWxsIHBsdXMgYWxsIHRoZSBjYWNoZWQgc3ltYm9sIGVudHJpZXMuICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLW9hc3lzX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0KLSAgb2FzeXNfc3ltYm9sX3R5cGUgKm5ldyA9Ci0gIChvYXN5c19zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQwKLQotCi0KLS8qIFVzZXIgc2hvdWxkIGhhdmUgY2hlY2tlZCB0aGUgZmlsZSBmbGFnczsgcGVyaGFwcyB3ZSBzaG91bGQgcmV0dXJuCi1CRkRfTk9fTU9SRV9TWU1CT0xTIGlmIHRoZXJlIGFyZSBub25lPyAqLwotCi1zdGF0aWMgYmZkICoKLW9hc3lzX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgcHJldikKLSAgICAgYmZkICphcmNoOwotICAgICBiZmQgKnByZXY7Ci17Ci0gIG9hc3lzX2FyX2RhdGFfdHlwZSAqYXIgPSBPQVNZU19BUl9EQVRBIChhcmNoKTsKLSAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqcDsKLSAgLyogdGFrZSB0aGUgbmV4dCBvbmUgZnJvbSB0aGUgYXJjaCBzdGF0ZSwgb3IgcmVzZXQgKi8KLSAgaWYgKHByZXYgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBpbmRleCAtIHRoZSBmaXJzdCB0d28gZW50cmllcyBhcmUgYm9ndXMqLwotICAgICAgYXItPm1vZHVsZV9pbmRleCA9IDA7Ci0gICAgfQotCi0gIHAgPSBhci0+bW9kdWxlICsgYXItPm1vZHVsZV9pbmRleDsKLSAgYXItPm1vZHVsZV9pbmRleCsrOwotCi0gIGlmIChhci0+bW9kdWxlX2luZGV4IDw9IGFyLT5tb2R1bGVfY291bnQpCi0gICAgewotICAgICAgaWYgKHAtPmFiZmQgPT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIHAtPmFiZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2gpOwotCSAgcC0+YWJmZC0+b3JpZ2luID0gcC0+cG9zOwotCSAgcC0+YWJmZC0+ZmlsZW5hbWUgPSBwLT5uYW1lOwotCi0JICAvKiBGaXh1cCBhIHBvaW50ZXIgdG8gdGhpcyBlbGVtZW50IGZvciB0aGUgbWVtYmVyICovCi0JICBwLT5hYmZkLT5hcmVsdF9kYXRhID0gKFBUUikgcDsKLQl9Ci0gICAgICByZXR1cm4gcC0+YWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0gICAgICByZXR1cm4gKGJmZCAqKSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJIHNlY3Rpb24sCi0JCQkgc3ltYm9scywKLQkJCSBvZmZzZXQsCi0JCQkgZmlsZW5hbWVfcHRyLAotCQkJIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIHJldHVybiBmYWxzZTsKLQotfQotCi1zdGF0aWMgaW50Ci1vYXN5c19nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2QgPSAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKSBhYmZkLT5hcmVsdF9kYXRhOwotICBpZiAobW9kID09IChvYXN5c19tb2R1bGVfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYtPnN0X3NpemUgPSBtb2QtPnNpemU7Ci0gICAgICBidWYtPnN0X21vZGUgPSAwNjY2OwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1vYXN5c19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGV4ZWM7Ci17Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lCW9hc3lzX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBvYXN5c19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBvYXN5c19zbHVycF9hcm1hcCBiZmRfdHJ1ZQotI2RlZmluZSBvYXN5c19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF90cnVlCi0jZGVmaW5lIG9hc3lzX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBvYXN5c190cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIG9hc3lzX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgb2FzeXNfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIG9hc3lzX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgb2FzeXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0jZGVmaW5lIG9hc3lzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgb2FzeXNfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG9hc3lzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgb2FzeXNfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBvYXN5c19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBvYXN5c19iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBvYXN5c19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQotI2RlZmluZSBvYXN5c19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgb2FzeXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBvYXN5c19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIG9hc3lzX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBvYXN5c19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBvYXN5c19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBvYXN5c19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBvYXN5c19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLypTVVBQUkVTUyA0NjAgKi8KLWNvbnN0IGJmZF90YXJnZXQgb2FzeXNfdmVjID0KLXsKLSAgIm9hc3lzIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LAotICAgb2FzeXNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBvYXN5c19hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBvYXN5c19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL29wbmNscy5jIGIvYmZkL29wbmNscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjEwMTM1Li4wMDAwMDAwCi0tLSBhL2JmZC9vcG5jbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKiBvcG5jbHMuYyAtLSBvcGVuIGFuZCBjbG9zZSBhIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZm5kZWYgU19JWFVTUgotI2RlZmluZSBTX0lYVVNSIDAxMDAJLyogRXhlY3V0ZSBieSBvd25lci4gICovCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotI2RlZmluZSBTX0lYR1JQIDAwMTAJLyogRXhlY3V0ZSBieSBncm91cC4gICovCi0jZW5kaWYKLSNpZm5kZWYgU19JWE9USAotI2RlZmluZSBTX0lYT1RIIDAwMDEJLyogRXhlY3V0ZSBieSBvdGhlcnMuICAqLwotI2VuZGlmCi0KLS8qIGZkb3BlbiBpcyBhIGxvc2VyIC0tIHdlIHNob3VsZCB1c2Ugc3RkaW8gZXhjbHVzaXZlbHkuICBVbmZvcnR1bmF0ZWx5Ci0gICBpZiB3ZSBkbyB0aGF0IHdlIGNhbid0IHVzZSBmY250bC4gICovCi0KLS8qIEZJWE1FOiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLWxvbmcgX2JmZF9jaHVua3NpemUgPSAtMTsKLQotLyogUmV0dXJuIGEgbmV3IEJGRC4gIEFsbCBCRkQncyBhcmUgYWxsb2NhdGVkIHRocm91Z2ggdGhpcyByb3V0aW5lLiAgKi8KLQotYmZkICoKLV9iZmRfbmV3X2JmZCAoKQotewotICBiZmQgKm5iZmQ7Ci0KLSAgbmJmZCA9IChiZmQgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkKSk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmJmZC0+bWVtb3J5ID0gKFBUUikgb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAobmJmZC0+bWVtb3J5ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+YXJjaF9pbmZvID0gJmJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotCi0gIG5iZmQtPmRpcmVjdGlvbiA9IG5vX2RpcmVjdGlvbjsKLSAgbmJmZC0+aW9zdHJlYW0gPSBOVUxMOwotICBuYmZkLT53aGVyZSA9IDA7Ci0gIG5iZmQtPnNlY3Rpb25zID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG5iZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotICBuYmZkLT5teV9hcmNoaXZlID0gKGJmZCAqKSBOVUxMOwotICBuYmZkLT5vcmlnaW4gPSAwOwkJCQkKLSAgbmJmZC0+b3BlbmVkX29uY2UgPSBmYWxzZTsKLSAgbmJmZC0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICBuYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgbmJmZC0+dXNyZGF0YSA9IChQVFIpIE5VTEw7Ci0gIG5iZmQtPmNhY2hlYWJsZSA9IGZhbHNlOwotICBuYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgbmJmZC0+bXRpbWVfc2V0ID0gZmFsc2U7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IEJGRCBhcyBhIG1lbWJlciBvZiBhcmNoaXZlIE9CRkQuICAqLwotCi1iZmQgKgotX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiAob2JmZCkKLSAgICAgYmZkICpvYmZkOwotewotICBiZmQgKm5iZmQ7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgbmJmZC0+eHZlYyA9IG9iZmQtPnh2ZWM7Ci0gIG5iZmQtPm15X2FyY2hpdmUgPSBvYmZkOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLSAgbmJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IG9iZmQtPnRhcmdldF9kZWZhdWx0ZWQ7Ci0gIHJldHVybiBuYmZkOwotfQotCi0vKgotU0VDVElPTgotCU9wZW5pbmcgYW5kIGNsb3NpbmcgQkZEcwotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbnIKLQotU1lOT1BTSVMKLSAgICAgICAgYmZkICpiZmRfb3BlbnIoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCk7Ci0KLURFU0NSSVBUSU9OCi0JT3BlbiB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfSAodXNpbmcgPDxmb3Blbj4+KSB3aXRoIHRoZSB0YXJnZXQKLQlAdmFye3RhcmdldH0uICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIEJGRC4KLQotCUNhbGxzIDw8YmZkX2ZpbmRfdGFyZ2V0Pj4sIHNvIEB2YXJ7dGFyZ2V0fSBpcyBpbnRlcnByZXRlZCBhcyBieQotCXRoYXQgZnVuY3Rpb24uCi0KLQlJZiA8PE5VTEw+PiBpcyByZXR1cm5lZCB0aGVuIGFuIGVycm9yIGhhcyBvY2N1cmVkLiAgIFBvc3NpYmxlIGVycm9ycwotCWFyZSA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiBvciA8PHN5c3RlbV9jYWxsPj4gZXJyb3IuCi0qLwotCi1iZmQgKgotYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLQotICBpZiAoYmZkX29wZW5fZmlsZSAobmJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGaWxlIGRpZG4ndCBleGlzdCwgb3Igc29tZSBzdWNoICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qIERvbid0IHRyeSB0byBgb3B0aW1pemUnIHRoaXMgZnVuY3Rpb246Ci0KLSAgIG8gLSBXZSBsb2NrIHVzaW5nIHN0YWNrIHNwYWNlIHNvIHRoYXQgaW50ZXJydXB0aW5nIHRoZSBsb2NraW5nCi0gICAgICAgd29uJ3QgY2F1c2UgYSBzdG9yYWdlIGxlYWsuCi0gICBvIC0gV2Ugb3BlbiB0aGUgZmlsZSBzdHJlYW0gbGFzdCwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvCi0gICAgICAgY2xvc2UgaXQgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4gIENsb3NpbmcgdGhlIHN0cmVhbSBtZWFucyBjbG9zaW5nCi0gICAgICAgdGhlIGZpbGUgZGVzY3JpcHRvciB0b28sIGV2ZW4gdGhvdWdoIHdlIGRpZG4ndCBvcGVuIGl0LgotICovCi0vKgotRlVOQ1RJT04KLSAgICAgICAgIGJmZF9mZG9wZW5yCi0KLVNZTk9QU0lTCi0gICAgICAgICBiZmQgKmJmZF9mZG9wZW5yKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQsIGludCBmZCk7Ci0KLURFU0NSSVBUSU9OCi0gICAgICAgICA8PGJmZF9mZG9wZW5yPj4gaXMgdG8gPDxiZmRfZm9wZW5yPj4gbXVjaCBsaWtlIDw8ZmRvcGVuPj4gaXMgdG8gPDxmb3Blbj4+LgotCSBJdCBvcGVucyBhIEJGRCBvbiBhIGZpbGUgYWxyZWFkeSBkZXNjcmliZWQgYnkgdGhlIEB2YXJ7ZmR9Ci0JIHN1cHBsaWVkLgotCi0JIFdoZW4gdGhlIGZpbGUgaXMgbGF0ZXIgPDxiZmRfY2xvc2U+PmQsIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSBjbG9zZWQuCi0KLQkgSWYgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhpcyBmaWxlIGRlc2NyaXB0b3IgYmUgY2FjaGVkIGJ5IEJGRAotCSAob3BlbmVkIGFzIG5lZWRlZCwgY2xvc2VkIGFzIG5lZWRlZCB0byBmcmVlIGRlc2NyaXB0b3JzIGZvcgotCSBvdGhlciBvcGVucyksIHdpdGggdGhlIHN1cHBsaWVkIEB2YXJ7ZmR9IHVzZWQgYXMgYW4gaW5pdGlhbAotCSBmaWxlIGRlc2NyaXB0b3IgKGJ1dCBzdWJqZWN0IHRvIGNsb3N1cmUgYXQgYW55IHRpbWUpLCBjYWxsCi0JIGJmZF9zZXRfY2FjaGVhYmxlKGJmZCwgMSkgb24gdGhlIHJldHVybmVkIEJGRC4gIFRoZSBkZWZhdWx0IGlzIHRvCi0JIGFzc3VtZSBubyBjYWNoZWluZzsgdGhlIGZpbGUgZGVzY3JpcHRvciB3aWxsIHJlbWFpbiBvcGVuIHVudGlsCi0JIDw8YmZkX2Nsb3NlPj4sIGFuZCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBCRkQgb3BlcmF0aW9ucyBvbiBvdGhlcgotCSBmaWxlcy4KLQotICAgICAgICAgUG9zc2libGUgZXJyb3JzIGFyZSA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiBhbmQgPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+Pi4KLSovCi0KLWJmZCAqCi1iZmRfZmRvcGVuciAoZmlsZW5hbWUsIHRhcmdldCwgZmQpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci0gICAgIGludCBmZDsKLXsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotICBpbnQgZmRmbGFnczsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotI2lmICEgZGVmaW5lZChIQVZFX0ZDTlRMKSB8fCAhIGRlZmluZWQoRl9HRVRGTCkKLSAgZmRmbGFncyA9IE9fUkRXUjsJCQkvKiBBc3N1bWUgZnVsbCBhY2Nlc3MgKi8KLSNlbHNlCi0gIGZkZmxhZ3MgPSBmY250bCAoZmQsIEZfR0VURkwsIE5VTEwpOwotI2VuZGlmCi0gIGlmIChmZGZsYWdzID09IC0xKSByZXR1cm4gTlVMTDsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWZuZGVmIEhBVkVfRkRPUEVOCi0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0jZWxzZQotICAvKiAoT19BQ0NNT0RFKSBwYXJlbnMgYXJlIHRvIGF2b2lkIFVsdHJpeCBoZWFkZXIgZmlsZSBidWcgKi8KLSAgc3dpdGNoIChmZGZsYWdzICYgKE9fQUNDTU9ERSkpCi0gICAgewotICAgIGNhc2UgT19SRE9OTFk6IG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUkIpOyAgIGJyZWFrOwotICAgIGNhc2UgT19XUk9OTFk6IG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUlVCKTsgIGJyZWFrOwotICAgIGNhc2UgT19SRFdSOiAgIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUlVCKTsgIGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChuYmZkLT5pb3N0cmVhbSA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCBwdXQgZXZlcnl0aGluZyB3aGVyZSBpdCBiZWxvbmdzICovCi0KLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICAvKiBBcyBhIHNwZWNpYWwgY2FzZSB3ZSBhbGxvdyBhIEZEIG9wZW4gZm9yIHJlYWQvd3JpdGUgdG8KLSAgICAgYmUgd3JpdHRlbiB0aHJvdWdoLCBhbHRob3VnaCBkb2luZyBzbyByZXF1aXJlcyB0aGF0IHdlIGVuZAotICAgICB0aGUgcHJldmlvdXMgY2xhdXNlIHdpdGggYSBwcmVwb3NpdGlvbi4gICovCi0gIC8qIChPX0FDQ01PREUpIHBhcmVucyBhcmUgdG8gYXZvaWQgVWx0cml4IGhlYWRlciBmaWxlIGJ1ZyAqLwotICBzd2l0Y2ggKGZkZmxhZ3MgJiBPX0FDQ01PREUpCi0gICAgewotICAgIGNhc2UgT19SRE9OTFk6IG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOyBicmVhazsKLSAgICBjYXNlIE9fV1JPTkxZOiBuYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247IGJyZWFrOwotICAgIGNhc2UgT19SRFdSOiBuYmZkLT5kaXJlY3Rpb24gPSBib3RoX2RpcmVjdGlvbjsgYnJlYWs7Ci0gICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmICghIGJmZF9jYWNoZV9pbml0IChuYmZkKSkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgbmJmZC0+b3BlbmVkX29uY2UgPSB0cnVlOwotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbnN0cmVhbXIKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9vcGVuc3RyZWFtcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUFRSKTsKLQotREVTQ1JJUFRJT04KLQotCU9wZW4gYSBCRkQgZm9yIHJlYWQgYWNjZXNzIG9uIGFuIGV4aXN0aW5nIHN0ZGlvIHN0cmVhbS4gIFdoZW4KLQl0aGUgQkZEIGlzIHBhc3NlZCB0byA8PGJmZF9jbG9zZT4+LCB0aGUgc3RyZWFtIHdpbGwgYmUgY2xvc2VkLgotKi8KLQotYmZkICoKLWJmZF9vcGVuc3RyZWFtciAoZmlsZW5hbWUsIHRhcmdldCwgc3RyZWFtYXJnKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotICAgICBQVFIgc3RyZWFtYXJnOwotewotICBGSUxFICpzdHJlYW0gPSAoRklMRSAqKSBzdHJlYW1hcmc7Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgc3RyZWFtOwotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLQkJCQkKLSAgaWYgKCEgYmZkX2NhY2hlX2luaXQgKG5iZmQpKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBuYmZkOwotfQotDAotLyoqIGJmZF9vcGVudyAtLSBvcGVuIGZvciB3cml0aW5nLgotICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGZyZXNobHktYWxsb2NhdGVkIEJGRCBvbiBzdWNjZXNzLCBvciBOVUxMLgotCi0gIFNlZSBjb21tZW50IGJ5IGJmZF9mZG9wZW5yIGJlZm9yZSB5b3UgdHJ5IHRvIG1vZGlmeSB0aGlzIGZ1bmN0aW9uLiAqLwotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbncKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9vcGVudyhDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0KTsKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBCRkQsIGFzc29jaWF0ZWQgd2l0aCBmaWxlIEB2YXJ7ZmlsZW5hbWV9LCB1c2luZyB0aGUKLQlmaWxlIGZvcm1hdCBAdmFye3RhcmdldH0sIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotCi0JUG9zc2libGUgZXJyb3JzIGFyZSA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LCA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwKLQk8PGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldD4+LgotKi8KLQotYmZkICoKLWJmZF9vcGVudyAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogbmJmZCBoYXMgdG8gcG9pbnQgdG8gaGVhZCBvZiBtYWxsb2MnZWQgYmxvY2sgc28gdGhhdCBiZmRfY2xvc2UgbWF5Ci0gICAgIHJlY2xhaW0gaXQgY29ycmVjdGx5LiAqLwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247Ci0KLSAgaWYgKGJmZF9vcGVuX2ZpbGUgKG5iZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsJLyogRmlsZSBub3Qgd3JpdGVhYmxlLCBldGMgKi8KLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLQotRlVOQ1RJT04KLQliZmRfY2xvc2UKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jbG9zZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCi0JQ2xvc2UgYSBCRkQuIElmIHRoZSBCRkQgd2FzIG9wZW4gZm9yIHdyaXRpbmcsCi0JdGhlbiBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlZCBhbmQgdGhlIGZpbGUgd3JpdHRlbiBvdXQKLQlhbmQgY2xvc2VkLiBJZiB0aGUgY3JlYXRlZCBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZW4KLQk8PGNobW9kPj4gaXMgY2FsbGVkIHRvIG1hcmsgaXQgYXMgc3VjaC4KLQotCUFsbCBtZW1vcnkgYXR0YWNoZWQgdG8gdGhlIEJGRCBpcyByZWxlYXNlZC4KLQotCVRoZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBCRkQgaXMgY2xvc2VkIChldmVuCi0JaWYgaXQgd2FzIHBhc3NlZCBpbiB0byBCRkQgYnkgPDxiZmRfZmRvcGVucj4+KS4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4KLSovCi0KLQotYm9vbGVhbgotYmZkX2Nsb3NlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmICghYmZkX3JlYWRfcCAoYWJmZCkpCi0gICAgewotICAgICAgaWYgKCEgQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3dyaXRlX2NvbnRlbnRzLCAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgQkZEX1NFTkQgKGFiZmQsIF9jbG9zZV9hbmRfY2xlYW51cCwgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0ID0gYmZkX2NhY2hlX2Nsb3NlIChhYmZkKTsKLQotICAvKiBJZiB0aGUgZmlsZSB3YXMgb3BlbiBmb3Igd3JpdGluZyBhbmQgaXMgbm93IGV4ZWN1dGFibGUsCi0gICAgIG1ha2UgaXQgc28gKi8KLSAgaWYgKHJldAotICAgICAgJiYgYWJmZC0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbgotICAgICAgJiYgYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotCi0gICAgICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDApCi0JewotIAkgIGludCBtYXNrID0gdW1hc2sgKDApOwotCSAgdW1hc2sgKG1hc2spOwotCSAgY2htb2QgKGFiZmQtPmZpbGVuYW1lLAotCQkgKDA3NzcKLQkJICAmIChidWYuc3RfbW9kZSB8ICgoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSAmfiBtYXNrKSkpKTsKLQl9Ci0gICAgfQotCi0gIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgYWJmZC0+bWVtb3J5KTsKLSAgZnJlZSAoYWJmZCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Nsb3NlX2FsbF9kb25lCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2xvc2VfYWxsX2RvbmUoYmZkICopOwotCi1ERVNDUklQVElPTgotCUNsb3NlIGEgQkZELiAgRGlmZmVycyBmcm9tIDw8YmZkX2Nsb3NlPj4KLQlzaW5jZSBpdCBkb2VzIG5vdCBjb21wbGV0ZSBhbnkgcGVuZGluZyBvcGVyYXRpb25zLiAgVGhpcwotCXJvdXRpbmUgd291bGQgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gaGFkIGp1c3QgdXNlZCBCRkQgZm9yCi0Jc3dhcHBpbmcgYW5kIGRpZG4ndCB3YW50IHRvIHVzZSBhbnkgb2YgdGhlIHdyaXRpbmcgY29kZS4KLQotCUlmIHRoZSBjcmVhdGVkIGZpbGUgaXMgZXhlY3V0YWJsZSwgdGhlbiA8PGNobW9kPj4gaXMgY2FsbGVkCi0JdG8gbWFyayBpdCBhcyBzdWNoLgotCi0JQWxsIG1lbW9yeSBhdHRhY2hlZCB0byB0aGUgQkZEIGlzIHJlbGVhc2VkLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LgotCi0qLwotCi1ib29sZWFuCi1iZmRfY2xvc2VfYWxsX2RvbmUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgcmV0ID0gYmZkX2NhY2hlX2Nsb3NlIChhYmZkKTsKLQotICAvKiBJZiB0aGUgZmlsZSB3YXMgb3BlbiBmb3Igd3JpdGluZyBhbmQgaXMgbm93IGV4ZWN1dGFibGUsCi0gICAgIG1ha2UgaXQgc28gKi8KLSAgaWYgKHJldAotICAgICAgJiYgYWJmZC0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbgotICAgICAgJiYgYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotCi0gICAgICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDApCi0JewotCSAgaW50IG1hc2sgPSB1bWFzayAoMCk7Ci0JICB1bWFzayAobWFzayk7Ci0JICBjaG1vZCAoYWJmZC0+ZmlsZW5hbWUsCi0JCSAoMHg3NzcKLQkJICAmIChidWYuc3RfbW9kZSB8ICgoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSAmfiBtYXNrKSkpKTsKLQl9Ci0gICAgfQotCi0gIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgYWJmZC0+bWVtb3J5KTsKLSAgZnJlZSAoYWJmZCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NyZWF0ZQotCi1TWU5PUFNJUwotCWJmZCAqYmZkX2NyZWF0ZShDT05TVCBjaGFyICpmaWxlbmFtZSwgYmZkICp0ZW1wbCk7Ci0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgbmV3IEJGRCBpbiB0aGUgbWFubmVyIG9mCi0JPDxiZmRfb3Blbnc+PiwgYnV0IHdpdGhvdXQgb3BlbmluZyBhIGZpbGUuIFRoZSBuZXcgQkZECi0JdGFrZXMgdGhlIHRhcmdldCBmcm9tIHRoZSB0YXJnZXQgdXNlZCBieSBAdmFye3RlbXBsYXRlfS4gVGhlCi0JZm9ybWF0IGlzIGFsd2F5cyBzZXQgdG8gPDxiZmRfb2JqZWN0Pj4uCi0KLSovCi0KLWJmZCAqCi1iZmRfY3JlYXRlIChmaWxlbmFtZSwgdGVtcGwpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBiZmQgKnRlbXBsOwotewotICBiZmQgKm5iZmQ7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgaWYgKHRlbXBsKQotICAgIG5iZmQtPnh2ZWMgPSB0ZW1wbC0+eHZlYzsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gbm9fZGlyZWN0aW9uOwotICBiZmRfc2V0X2Zvcm1hdCAobmJmZCwgYmZkX29iamVjdCk7Ci0gIHJldHVybiBuYmZkOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV93cml0YWJsZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX21ha2Vfd3JpdGFibGUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlUYWtlcyBhIEJGRCBhcyBjcmVhdGVkIGJ5IDw8YmZkX2NyZWF0ZT4+IGFuZCBjb252ZXJ0cyBpdAotCWludG8gb25lIGxpa2UgYXMgcmV0dXJuZWQgYnkgPDxiZmRfb3Blbnc+Pi4gIEl0IGRvZXMgdGhpcwotCWJ5IGNvbnZlcnRpbmcgdGhlIEJGRCB0byBCRkRfSU5fTUVNT1JZLiAgSXQncyBhc3N1bWVkIHRoYXQKLQl5b3Ugd2lsbCBjYWxsIDw8YmZkX21ha2VfcmVhZGFibGU+PiBvbiB0aGlzIGJmZCBsYXRlci4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4KLSovCi0KLWJvb2xlYW4KLWJmZF9tYWtlX3dyaXRhYmxlKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbTsKLQotICBpZiAoYWJmZC0+ZGlyZWN0aW9uICE9IG5vX2RpcmVjdGlvbikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2luX21lbW9yeSkpOwotICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGJpbTsKLSAgLyogYmZkX3dyaXRlIHdpbGwgZ3JvdyB0aGVzZSBhcyBuZWVkZWQgKi8KLSAgYmltLT5zaXplID0gMDsKLSAgYmltLT5idWZmZXIgPSAwOwotCi0gIGFiZmQtPmZsYWdzIHw9IEJGRF9JTl9NRU1PUlk7Ci0gIGFiZmQtPmRpcmVjdGlvbiA9IHdyaXRlX2RpcmVjdGlvbjsKLSAgYWJmZC0+d2hlcmUgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV9yZWFkYWJsZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX21ha2VfcmVhZGFibGUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlUYWtlcyBhIEJGRCBhcyBjcmVhdGVkIGJ5IDw8YmZkX2NyZWF0ZT4+IGFuZAotCTw8YmZkX21ha2Vfd3JpdGFibGU+PiBhbmQgY29udmVydHMgaXQgaW50byBvbmUgbGlrZSBhcwotCXJldHVybmVkIGJ5IDw8YmZkX29wZW5yPj4uICBJdCBkb2VzIHRoaXMgYnkgd3JpdGluZyB0aGUKLQljb250ZW50cyBvdXQgdG8gdGhlIG1lbW9yeSBidWZmZXIsIHRoZW4gcmV2ZXJzaW5nIHRoZQotCWRpcmVjdGlvbi4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4gICovCi0KLWJvb2xlYW4KLWJmZF9tYWtlX3JlYWRhYmxlKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmRpcmVjdGlvbiAhPSB3cml0ZV9kaXJlY3Rpb24gfHwgIShhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF93cml0ZV9jb250ZW50cywgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgQkZEX1NFTkQgKGFiZmQsIF9jbG9zZV9hbmRfY2xlYW51cCwgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLQotICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0KLSAgYWJmZC0+d2hlcmUgPSAwOwotICBhYmZkLT5zZWN0aW9ucyA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgYWJmZC0+bXlfYXJjaGl2ZSA9IChiZmQgKikgTlVMTDsKLSAgYWJmZC0+b3JpZ2luID0gMDsJCQkJCi0gIGFiZmQtPm9wZW5lZF9vbmNlID0gZmFsc2U7Ci0gIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDA7Ci0gIGFiZmQtPnVzcmRhdGEgPSAoUFRSKSBOVUxMOwotICBhYmZkLT5jYWNoZWFibGUgPSBmYWxzZTsKLSAgYWJmZC0+ZmxhZ3MgPSBCRkRfSU5fTUVNT1JZOwotICBhYmZkLT5tdGltZV9zZXQgPSBmYWxzZTsKLQotICBhYmZkLT50YXJnZXRfZGVmYXVsdGVkID0gdHJ1ZTsKLSAgYWJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247Ci0gIGFiZmQtPnNlY3Rpb25zID0gMDsKLSAgYWJmZC0+c3ltY291bnQgPSAwOwotICBhYmZkLT5vdXRzeW1ib2xzID0gMDsKLSAgYWJmZC0+dGRhdGEuYW55ID0gMDsKLQotICBiZmRfY2hlY2tfZm9ybWF0KGFiZmQsIGJmZF9vYmplY3QpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfYWxsb2MKLQotU1lOT1BTSVMKLQlQVFIgYmZkX2FsbG9jIChiZmQgKmFiZmQsIHNpemVfdCB3YW50ZWQpOwotCi1ERVNDUklQVElPTgotCUFsbG9jYXRlIGEgYmxvY2sgb2YgQHZhcnt3YW50ZWR9IGJ5dGVzIG9mIG1lbW9yeSBhdHRhY2hlZCB0bwotCTw8YWJmZD4+IGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotKi8KLQotCi1QVFIKLWJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJldDsKLQotICByZXQgPSBvYmphbGxvY19hbGxvYyAoYWJmZC0+bWVtb3J5LCAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgcmV0dXJuIHJldDsKLX0KLQotUFRSCi1iZmRfemFsbG9jIChhYmZkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcmVzOwotCi0gIHJlcyA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmIChyZXMpCi0gICAgbWVtc2V0IChyZXMsIDAsIHNpemUpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBGcmVlIGEgYmxvY2sgYWxsb2NhdGVkIGZvciBhIEJGRC4gICovCi0KLXZvaWQKLWJmZF9yZWxlYXNlIChhYmZkLCBibG9jaykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgYmxvY2s7Ci17Ci0gIG9iamFsbG9jX2ZyZWVfYmxvY2sgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgYWJmZC0+bWVtb3J5LCBibG9jayk7Ci19CmRpZmYgLS1naXQgYS9iZmQvb3NmLWNvcmUuYyBiL2JmZC9vc2YtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzFmNGFmLi4wMDAwMDAwCi0tLSBhL2JmZC9vc2YtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgT1NGLzEgY29yZSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjYW4gb25seSBiZSBjb21waWxlZCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBPU0YvMSBzdHlsZQotICAgY29yZSBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgPHN5cy91c2VyLmg+Ci0jaW5jbHVkZSA8c3lzL2NvcmUuaD4KLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotCQkJICAgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKLXN0YXRpYyBhc3ltYm9sICoKLW9zZl9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKgotb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludAotb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbgotb3NmX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi1zdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0IAotewotICBpbnQgc2lnOwotICBjaGFyIGNtZFtNQVhDT01MRU4gKyAxXTsKLX07Ci0KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLm9zZl9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSA4OwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotb3NmX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3NmX2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHZhbDsKLSAgaW50IGk7Ci0gIGNoYXIgKnNlY25hbWU7Ci0gIHN0cnVjdCBjb3JlX2ZpbGVoZHIgY29yZV9oZWFkZXI7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVfaGVhZGVyLCAxLCBzaXplb2YgY29yZV9oZWFkZXIsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiBjb3JlX2hlYWRlcikKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoc3RybmNtcCAoY29yZV9oZWFkZXIubWFnaWMsICJDb3JlIiwgNCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IG9zZl9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG9zZl9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBjb3JlX2hlYWRlci5uYW1lLCBNQVhDT01MRU4gKyAxKTsKLSAgY29yZV9zaWduYWwgKGFiZmQpID0gY29yZV9oZWFkZXIuc2lnbm87Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvcmVfaGVhZGVyLm5zY25zOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGNvcmVfc2NuaGRyIGNvcmVfc2NuaGRyOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZjb3JlX3NjbmhkciwgMSwgc2l6ZW9mIGNvcmVfc2NuaGRyLCBhYmZkKTsKLSAgICAgIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVfc2NuaGRyKQotCWJyZWFrOwotCi0gICAgICAvKiBTa2lwIGVtcHR5IHNlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChjb3JlX3Njbmhkci5zaXplID09IDAgfHwgY29yZV9zY25oZHIuc2NucHRyID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoY29yZV9zY25oZHIuc2NudHlwZSkKLQl7Ci0JY2FzZSBTQ05SR046Ci0JICBzZWNuYW1lID0gIi5kYXRhIjsKLQkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ05TVEFDSzoKLQkgIHNlY25hbWUgPSAiLnN0YWNrIjsKLQkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ05SRUdTOgotCSAgc2VjbmFtZSA9ICIucmVnIjsKLQkgIGZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaGFuZGxlZCBPU0YvMSBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iKSwKLQkJCQkgY29yZV9zY25oZHIuc2NudHlwZSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsIGZsYWdzLAotCQkJICAgICAgKGJmZF9zaXplX3R5cGUpIGNvcmVfc2NuaGRyLnNpemUsCi0JCQkgICAgICAoYmZkX3ZtYSkgY29yZV9zY25oZHIudmFkZHIsCi0JCQkgICAgICAoZmlsZV9wdHIpIGNvcmVfc2NuaGRyLnNjbnB0cikpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGludAotb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotb3NmX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzIHBvaW50ICovCi19Ci0MCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBvc2ZfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgb3NmX2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBvc2ZfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIG9zZl9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBvc2ZfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBvc2ZfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIG9zZl9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBvc2ZfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBvc2ZfY29yZV92ZWMgPQotICB7Ci0gICAgIm9zZi1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIG9zZl9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAob3NmX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChvc2ZfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9wYzUzMi1tYWNoLmMgYi9iZmQvcGM1MzItbWFjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Y0YWM0Li4wMDAwMDAwCi0tLSBhL2JmZC9wYzUzMi1tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNYWNoMy81MzIgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIERhbGwKLSAqICAgICAgICAgICAgMTktQXByLTk0Ci0gKgotICogRm9ybWVybHkgcGFydCBvZiBhb3V0LXBjNTMyLW1hY2guYy4gU3BsaXQgb3V0IHRvIGFsbG93IG1vcmUKLSAqIGZsZXhpYmlsaXR5IHdpdGggbXVsdGlwbGUgZm9ybWF0cy4KLSAqCi0gKi8KLS8qIFRoaXMgYXJjaGl0ZWN0dXJlIGhhcyBOX1RYVE9GRiBhbmQgTl9UWFRBRERSIGRlZmluZWQgYXMgaWYKLSAqIE5fSEVBREVSX0lOX1RFWFQsIGJ1dCB0aGUgYV90ZXh0IGVudHJ5ICh0ZXh0IHNpemUpIGRvZXMgbm90IGluY2x1ZGUgdGhlCi0gKiBzcGFjZSBmb3IgdGhlIGhlYWRlci4gU28gd2UgaGF2ZSBOX0hFQURFUl9JTl9URVhUIGRlZmluZWQgdG8KLSAqIDEgYW5kIHNwZWNpYWxseSBkZWZpbmUgb3VyIG93biBOX1RYVFNJWkUKLSAqLwotCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMQotI2RlZmluZSBOX1RYVFNJWkUoeCkgKCh4KS5hX3RleHQpCi0KLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMHgxMDAwMCAgICAgICAvKiBmcm9tIG9sZCBsZCAqLwotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4MTAwMCAgICAgICAvKiBmcm9tIG9sZCBsZCwgIDAzMiAmIDUzMiBhcmUgcmVhbGx5IDUxMi80ayAqLwotCi0vKiBVc2UgYV9lbnRyeSBvZiAwIHRvIGRpc3Rpbmd1aXNoIG9iamVjdCBmaWxlcyBmcm9tIE9NQUdJQyBleGVjdXRhYmxlcyAqLwotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAoTl9NQUdJQyh4KSA9PSBPTUFHSUMgPyBcCi0gICAoKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFI/IDA6IFRFWFRfU1RBUlRfQUREUik6IFwKLSAgIChOX01BR0lDKHgpID09IE5NQUdJQz8gVEVYVF9TVEFSVF9BRERSOiBcCi0gICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFKSkKLQotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9uczMyawotICAKLSNkZWZpbmUgTVkoT1ApIENBVChwYzUzMm1hY2hhb3V0XyxPUCkKLQotLyogTXVzdCBiZSB0aGUgc2FtZSBhcyBhb3V0LW5zMzJrLmMgKi8KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1wYzUzMi1tYWNoIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLS8qIFdlIGNhbmB0IHVzZSB0aGUgTVlOUyBtYWNybyBoZXJlIGZvciBjcHAgcmVhc29ucyB0b28gc3VidGxlIGZvciBtZSAtLSBJV0QgKi8KLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbnMzMmthb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBsaWJhb3V0IGRvZXNuJ3QgdXNlIE5BTUUgZm9yIHRoZXNlIC4uLiAqLwotCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAxCi0KLSNkZWZpbmUgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQgMQotICAgICAKLSNkZWZpbmUgTVlOU1goT1ApIENBVChuczMya2FvdXRfLE9QKQotcmVsb2NfaG93dG9fdHlwZSAqCi1NWU5TWChiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotYm9vbGVhbgotTVlOU1god3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICBQQVJBTVMoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLWJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICAKLSNpZiBDSE9PU0VfUkVMT0NfU0laRQotICBDSE9PU0VfUkVMT0NfU0laRShhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0gIAotICBCRkRfQVNTRVJUIChiZmRfZ2V0X2FyY2ggKGFiZmQpID09IGJmZF9hcmNoX25zMzJrKTsKLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIDMyMDMyOgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9OUzMyMDMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI1MzI6Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fTlMzMjUzMik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIE5fU0VUX0ZMQUdTICgqZXhlY3AsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotICAKLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9wZS1hcm0uYyBiL2JmZC9wZS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhMDQ4MS4uMDAwMDAwMAotLS0gYS9iZmQvcGUtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0xJVFRMRV9TWU0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgYXJtcGVfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGUtYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgYXJtcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGUtYXJtLWJpZyIKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCAgICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpZm5kZWYgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgCi0jZGVmaW5lIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfYXJtX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSNlbmRpZgotCQotI2luY2x1ZGUgImNvZmYtYXJtLmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtaTM4Ni5jIGIvYmZkL3BlLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkYmU0NC4uMDAwMDAwMAotLS0gYS9iZmQvcGUtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNkZWZpbmUgVEFSR0VUX1NZTSBpMzg2cGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJwZS1pMzg2IgotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLW1jb3JlLmMgYi9iZmQvcGUtbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExOWY4MS4uMDAwMDAwMAotLS0gYS9iZmQvcGUtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUNvcmUgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9CSUdfU1lNCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIG1jb3JlX3BlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlLW1jb3JlLWJpZyIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgbWNvcmVfcGVfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGUtbWNvcmUtbGl0dGxlIgotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICAgIHRydWUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2RlZmluZSBNQ09SRV9QRQotCi0jaW5jbHVkZSAiY29mZi1tY29yZS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLXBwYy5jIGIvYmZkL3BlLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJhYzA0Li4wMDAwMDAwCi0tLSBhL2JmZC9wZS1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUG93ZXJQQyBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNkZWZpbmUgRV9GSUxFTk1MRU4gICAgIDE4Ci0KLSNkZWZpbmUgUFBDX1BFCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICBiZmRfcG93ZXJwY2xlX3BlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlLXBvd2VycGNsZSIKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgIGJmZF9wb3dlcnBjX3BlX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlLXBvd2VycGMiCi0KLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotLyogRklYTUU6IHZlcmlmeSBQQ1JFTE9GRlNFVCBpcyBhbHdheXMgZmFsc2UgKi8KLQotI2luY2x1ZGUgImNvZmYtcHBjLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLWFybS5jIGIvYmZkL3BlaS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MjE0YS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhcm0gUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfTElUVExFX1NZTQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgYXJtcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZWktYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgIGFybXBlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBJTUFHRV9CQVNFICAgICAgICAgTlRfSU1BR0VfQkFTRQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpZm5kZWYgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgCi0jZGVmaW5lIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfYXJtX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSNlbmRpZgotCQotI2luY2x1ZGUgImNvZmYtYXJtLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLWkzODYuYyBiL2JmZC9wZWktaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUyOTY4Li4wMDAwMDAwCi0tLSBhL2JmZC9wZWktaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBUQVJHRVRfU1lNIGkzODZwZWlfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJwZWktaTM4NiIKLSNkZWZpbmUgSU1BR0VfQkFTRSBOVF9JTUFHRV9CQVNFCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1tY29yZS5jIGIvYmZkL3BlaS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGE4NzJjLi4wMDAwMDAwCi0tLSBhL2JmZC9wZWktbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUNvcmUgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9CSUdfU1lNCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIG1jb3JlX3BlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICJwZWktbWNvcmUtYmlnIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGVpLW1jb3JlLWxpdHRsZSIKLSNlbmRpZgotCi0jZGVmaW5lIElNQUdFX0JBU0UgICAgICAgICBOVF9JTUFHRV9CQVNFCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgIHRydWUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2RlZmluZSBNQ09SRV9QRQotCi0jaW5jbHVkZSAiY29mZi1tY29yZS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1wcGMuYyBiL2JmZC9wZWktcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWJjMGYuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUG93ZXJQQyBQRSBJTUFHRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotLyogc2V0dGluZyB1cCBmb3IgYSBQRSBlbnZpcm9ubWVudCBzdG9sZW4gZGlyZWN0bHkgZnJvbSB0aGUgaTM4NiBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0KLSNkZWZpbmUgUFBDX1BFCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICBiZmRfcG93ZXJwY2xlX3BlaV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZWktcG93ZXJwY2xlIgotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgYmZkX3Bvd2VycGNfcGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlaS1wb3dlcnBjIgotCi0jZGVmaW5lIElNQUdFX0JBU0UgICAgICAgICAgTlRfSU1BR0VfQkFTRQotCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0vKiBGSVhNRTogVmVyaWZ5IFBDUkVMT0ZGU0VUIGlzIGFsd2F5cyBmYWxzZSAqLwotCi0jaW5jbHVkZSAiY29mZi1wcGMuYyIKLQotCi0KZGlmZiAtLWdpdCBhL2JmZC9wZWljb2RlLmggYi9iZmQvcGVpY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U3ZWY2Li4wMDAwMDAwCi0tLSBhL2JmZC9wZWljb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTk5ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIG1vc3QgQ09GRiB2YXJpYW50cywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotKi8KLQotLyogSGV5IGxvb2ssIHNvbWUgZG9jdW1lbnRhdGlvbiBbYW5kIGluIGEgcGxhY2UgeW91IGV4cGVjdCB0byBmaW5kIGl0XSEKLQotICAgVGhlIG1haW4gcmVmZXJlbmNlIGZvciB0aGUgcGVpIGZvcm1hdCBpcyAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gNC4xIi4gIEdldCBpdCBpZiB5b3UgbmVlZCB0bwotICAgZG8gc29tZSBzZXJpb3VzIGhhY2tpbmcgb24gdGhpcyBjb2RlLgotCi0gICBBbm90aGVyIHJlZmVyZW5jZToKLSAgICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkuCi0KLSAgIFRoZSAqc29sZSogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwZSBmb3JtYXQgYW5kIHRoZSBwZWkgZm9ybWF0IGlzIHRoYXQgdGhlCi0gICBsYXR0ZXIgaGFzIGFuIE1TRE9TIDIuMCAuZXhlIGhlYWRlciBvbiB0aGUgZnJvbnQgdGhhdCBwcmludHMgdGhlIG1lc3NhZ2UKLSAgICJUaGlzIGFwcCBtdXN0IGJlIHJ1biB1bmRlciBXaW5kb3dzLiIgKG9yIHNvbWUgc3VjaCkuCi0gICAoRklYTUU6IFdoZXRoZXIgdGhhdCBzdGF0ZW1lbnQgaXMgKnJlYWxseSogdHJ1ZSBvciBub3QgaXMgdW5rbm93bi4KLSAgIEFyZSB0aGVyZSBtb3JlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBlIGFuZCBwZWkgZm9ybWF0cz8KLSAgIEZvciBub3cgYXNzdW1lIHRoZXJlIGFyZW4ndC4gIElmIHlvdSBmaW5kIG9uZSwgdGhlbiBmb3IgR29kIHNha2VzCi0gICBkb2N1bWVudCBpdCBoZXJlISkKLQotICAgVGhlIE1pY3Jvc29mdCBkb2NzIHVzZSB0aGUgd29yZCAiaW1hZ2UiIGluc3RlYWQgb2YgImV4ZWN1dGFibGUiIGJlY2F1c2UKLSAgIHRoZSBmb3JtZXIgY2FuIGFsc28gcmVmZXIgdG8gYSBETEwgKHNoYXJlZCBsaWJyYXJ5KS4gIENvbmZ1c2lvbiBjYW4gYXJpc2UKLSAgIGJlY2F1c2UgdGhlIGBpJyBpbiBgcGVpJyBhbHNvIHJlZmVycyB0byAiaW1hZ2UiLiAgVGhlIGBwZScgZm9ybWF0IGNhbgotICAgYWxzbyBjcmVhdGUgaW1hZ2VzIChpLmUuIGV4ZWN1dGFibGVzKSwgaXQncyBqdXN0IHRoYXQgdG8gcnVuIG9uIGEgd2luMzIKLSAgIHN5c3RlbSB5b3UgbmVlZCB0byB1c2UgdGhlIHBlaSBmb3JtYXQuCi0KLSAgIEZJWE1FOiBQbGVhc2UgYWRkIG1vcmUgZG9jcyBoZXJlIHNvIHRoZSBuZXh0IHBvb3IgZm9vbCB0aGF0IGhhcyB0byBoYWNrCi0gICBvbiB0aGlzIGNvZGUgaGFzIGEgY2hhbmNlIG9mIGdldHRpbmcgc29tZXRoaW5nIGFjY29tcGxpc2hlZCB3aXRob3V0Ci0gICB3YXN0aW5nIHRvbyBtdWNoIHRpbWUuCi0qLwotCi0jaWZkZWYgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKQotICAgICBQQVJBTVMgKChiZmQgKiwgUFRSKSkKLSAgICAgPSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbHNlCi1zdGF0aWMgYm9vbGVhbiAoKnBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIpKQotICAgICA9IE5VTEw7Ci0jZW5kaWYKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgY29mZl9ta29iamVjdCAgICAgIHBlX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfbWtvYmplY3RfaG9vayBwZV9ta29iamVjdF9ob29rCi0KLSNpZm5kZWYgR0VUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpIFwKLSAgICAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotCi0jaWZuZGVmIEdFVF9GQ05fRU5ETkRYCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIFwKLQliZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLQotI2lmbmRlZiBQVVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9MTk5PCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfU0laRQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX0xOTk8KLSNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfU0laRQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX1NDTkxFTgotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OTElOTk8KLSNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9TQ05MRU4KLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTkxJTk5PCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8xNihhYmZkLGluLCAoYmZkX2J5dGUgICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xJTkVOT19MTk5PCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX0xJTkVOT19MTk5PCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLQotLyogVGhlIGZfc3ltcHRyIGZpZWxkIGluIHRoZSBmaWxlaGRyIGlzIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBhb3V0aGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIEdFVF9BT1VUSERSX0VOVFJZIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgc2NuaGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9QQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9WQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9WQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgR0VUX1NDTkhEUl9TSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0laRQotI2RlZmluZSBQVVRfU0NOSERSX1NJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9SRUxQVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9maWxlaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9hdXhfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2F1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9saW5lbm9faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9saW5lbm9fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2FvdXRoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhZGRfZGF0YV9lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKiwgaW50LCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2FvdXRoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3Njbmhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3Njbmhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9pZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9lZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9wZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9yZWxvYyBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHBlX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgUFRSIHBlX21rb2JqZWN0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7Ci0KLSAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7Ci0gIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKLQotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOwotCi0jaWZkZWYgU1dBUF9JTl9SRUxPQ19PRkZTRVQKLSAgcmVsb2NfZHN0LT5yX29mZnNldCA9IFNXQVBfSU5fUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQkJCSAgICAgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9vZmZzZXQpOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCXNyYzsKLSAgICAgUFRSCWRzdDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopCi0JICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotICBTV0FQX09VVF9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCXJlbG9jX3NyYy0+cl9vZmZzZXQsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX29mZnNldCk7Ci0jZW5kaWYKLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19FWFRSQQotICBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHJlbG9jX3NyYywgcmVsb2NfZHN0KTsKLSNlbmRpZgotICByZXR1cm4gUkVMU1o7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIHNyYzsKLSAgICAgUFRSCSAgICAgZHN0OwotewotICBGSUxIRFIgKmZpbGVoZHJfc3JjID0gKEZJTEhEUiAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBkc3Q7Ci0gIGZpbGVoZHJfZHN0LT5mX21hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9tYWdpYyk7Ci0gIGZpbGVoZHJfZHN0LT5mX25zY25zID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc2Nucyk7Ci0gIGZpbGVoZHJfZHN0LT5mX3RpbWRhdCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGltZGF0KTsKLQotICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnN5bXMpOwotICBmaWxlaGRyX2RzdC0+Zl9mbGFncyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfZmxhZ3MpOwotICBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9zeW1wdHIpOwotCi0gIC8qIE90aGVyIHBlb3BsZSdzIHRvb2xzIHNvbWV0aW1lcyBnZW5lcmF0ZSBoZWFkZXJzIHdpdGggYW4gbnN5bXMgYnV0Ci0gICAgIGEgemVybyBzeW1wdHIuICAqLwotICBpZiAoZmlsZWhkcl9kc3QtPmZfbnN5bXMgIT0gMCAmJiBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPT0gMCkKLSAgICB7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IDA7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9mbGFncyB8PSBGX0xTWU1TOwotICAgIH0KLQotICBmaWxlaGRyX2RzdC0+Zl9vcHRoZHIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgCi0JCQkJICAgICAgIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9vcHRoZHIpOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLXN0YXRpYyAgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBpbnQgaWR4OwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKW91dDsKLQotICBpZiAocGVfZGF0YSAoYWJmZCktPmhhc19yZWxvY19zZWN0aW9uKQotICAgIGZpbGVoZHJfaW4tPmZfZmxhZ3MgJj0gfkZfUkVMRkxHOwotCi0gIGlmIChwZV9kYXRhIChhYmZkKS0+ZGxsKQotICAgIGZpbGVoZHJfaW4tPmZfZmxhZ3MgfD0gRl9ETEw7Ci0KLSAgZmlsZWhkcl9pbi0+cGUuZV9tYWdpYyAgICA9IERPU01BR0lDOwotICBmaWxlaGRyX2luLT5wZS5lX2NibHAgICAgID0gMHg5MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcCAgICAgICA9IDB4MzsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcmxjICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcGFyaGRyICA9IDB4NDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9taW5hbGxvYyA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9tYXhhbGxvYyA9IDB4ZmZmZjsKLSAgZmlsZWhkcl9pbi0+cGUuZV9zcyAgICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9zcCAgICAgICA9IDB4Yjg7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3N1bSAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfaXAgICAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3MgICAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfbGZhcmxjICAgPSAweDQwOwotICBmaWxlaGRyX2luLT5wZS5lX292bm8gICAgID0gMHgwOwotCi0gIGZvciAoaWR4PTA7IGlkeCA8IDQ7IGlkeCsrKQotICAgIGZpbGVoZHJfaW4tPnBlLmVfcmVzW2lkeF0gPSAweDA7Ci0KLSAgZmlsZWhkcl9pbi0+cGUuZV9vZW1pZCAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX29lbWluZm8gPSAweDA7Ci0KLSAgZm9yIChpZHg9MDsgaWR4IDwgMTA7IGlkeCsrKQotICAgIGZpbGVoZHJfaW4tPnBlLmVfcmVzMltpZHhdID0gMHgwOwotCi0gIGZpbGVoZHJfaW4tPnBlLmVfbGZhbmV3ID0gMHg4MDsKLQotICAvKiB0aGlzIG5leHQgY29sbGVjdGlvbiBvZiBkYXRhIGFyZSBtb3N0bHkganVzdCBjaGFyYWN0ZXJzLiAgSXQgYXBwZWFycwotICAgICB0byBiZSBjb25zdGFudCB3aXRoaW4gdGhlIGhlYWRlcnMgcHV0IG9uIE5UIGV4ZXMgKi8KLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMF0gID0gMHgwZWJhMWYwZTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMV0gID0gMHhjZDA5YjQwMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMl0gID0gMHg0YzAxYjgyMTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbM10gID0gMHg2ODU0MjFjZDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNF0gID0gMHg3MDIwNzM2OTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNV0gID0gMHg3MjY3NmY3MjsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNl0gID0gMHg2MzIwNmQ2MTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbN10gID0gMHg2ZjZlNmU2MTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbOF0gID0gMHg2NTYyMjA3NDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbOV0gID0gMHg2ZTc1NzIyMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTBdID0gMHgyMDZlNjkyMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTFdID0gMHgyMDUzNGY0NDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTJdID0gMHg2NTY0NmY2ZDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTNdID0gMHgwYTBkMGQyZTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTRdID0gMHgyNDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTVdID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5udF9zaWduYXR1cmUgPSBOVF9TSUdOQVRVUkU7Ci0KLQotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgdGltZSAoMCksIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl90aW1kYXQpOwotICBQVVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfdm1hKSBmaWxlaGRyX2luLT5mX3N5bXB0ciwKLQkJICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3N5bXB0cik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX25zeW1zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnN5bXMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9vcHRoZHIsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9vcHRoZHIpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9mbGFncywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX2ZsYWdzKTsKLQotICAvKiBwdXQgaW4gZXh0cmEgZG9zIGhlYWRlciBzdHVmZi4gIFRoaXMgZGF0YSByZW1haW5zIGVzc2VudGlhbGx5Ci0gICAgIGNvbnN0YW50LCBpdCBqdXN0IGhhcyB0byBiZSB0YWNrZWQgb24gdG8gdGhlIGJlZ2lubmluZyBvZiBhbGwgZXhlcyAKLSAgICAgZm9yIE5UICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jYmxwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY2JscCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3ApOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcmxjLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3JsYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwYXJoZHIsIAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3Bhcmhkcik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21pbmFsbG9jLCAKLQkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX21pbmFsbG9jKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbWF4YWxsb2MsIAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWF4YWxsb2MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9zcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3NzKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfc3AsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9zcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzdW0sIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jc3VtKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfaXAsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9pcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9sZmFybGMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9sZmFybGMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vdm5vLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb3Zubyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDQ7IGlkeCsrKQotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfcmVzW2lkeF0sIAotCQkgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfcmVzW2lkeF0pOwotICB9Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX29lbWlkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb2VtaWQpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vZW1pbmZvLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb2VtaW5mbyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDEwOyBpZHgrKykKLSAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3JlczJbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3JlczJbaWR4XSk7Ci0gIH0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbGZhbmV3LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbGZhbmV3KTsKLQotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5kb3NfbWVzc2FnZVtpZHhdKTsKLSAgfQotCi0gIC8qIGFsc28gcHV0IGluIHRoZSBOVCBzaWduYXR1cmUgKi8KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLm50X3NpZ25hdHVyZSwgCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+bnRfc2lnbmF0dXJlKTsKLQotCi0KLQotICByZXR1cm4gRklMSFNaOwotfQotI2Vsc2UKLQotc3RhdGljICB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfdGltZGF0LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0KLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBTWU1FTlQgKmV4dCA9IChTWU1FTlQgKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYoIGV4dC0+ZS5lX25hbWVbMF0gPT0gMCkgewotICAgIGluLT5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgaW4tPl9uLl9uX24uX25fb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX29mZnNldCk7Ci0gIH0KLSAgZWxzZSB7Ci0jaWYgU1lNTk1MRU4gIT0gRV9TWU1OTUxFTgotICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBTWU1OTUxFTiE7Ci0jZWxzZQotICAgIG1lbWNweShpbi0+X24uX25fbmFtZSwgZXh0LT5lLmVfbmFtZSwgU1lNTk1MRU4pOwotI2VuZGlmCi0gIH0KLQotICBpbi0+bl92YWx1ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsgCi0gIGluLT5uX3NjbnVtID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKXsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGluLT5uX3NjbGFzcyA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9zY2xhc3MpOwotICBpbi0+bl9udW1hdXggPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfbnVtYXV4KTsKLQotICAvKiBUaGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgLmlkYXRhJCBzZWN0aW9ucyBoYXZlIGNsYXNzIDB4NjgKLSAgICAgKENfU0VDVElPTiksIHdoaWNoIE1TIGRvY3VtZW50YXRpb24gaW5kaWNhdGVzIGlzIGEgc2VjdGlvbgotICAgICBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5LCB0aGUgdmFsdWUgZmllbGQgaW4gdGhlIHN5bWJvbCBpcyBzaW1wbHkgYQotICAgICBjb3B5IG9mIHRoZSAuaWRhdGEgc2VjdGlvbidzIGZsYWdzIHJhdGhlciB0aGFuIHNvbWV0aGluZyB1c2VmdWwuCi0gICAgIFdoZW4gdGhlc2Ugc3ltYm9scyBhcmUgZW5jb3VudGVyZWQsIGNoYW5nZSB0aGUgdmFsdWUgdG8gMCBzbyB0aGF0Ci0gICAgIHRoZXkgd2lsbCBiZSBoYW5kbGVkIHNvbWV3aGF0IGNvcnJlY3RseSBpbiB0aGUgYmZkIGNvZGUuICAqLwotICBpZiAoaW4tPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICBpbi0+bl92YWx1ZSA9IDB4MDsKLQotI2lmIDAKLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNsZWFybHkgd3JvbmcuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBiZSB0aGF0Ci0gICAgICAgICB1bmRlZmluZWQgQ19TRUNUSU9OIHN5bWJvbHMgYXBwZWFyIGluIHRoZSBmaXJzdCBvYmplY3Qgb2YgYQotICAgICAgICAgTVMgZ2VuZXJhdGVkIC5saWIgZmlsZSwgYW5kIHRoZSBzeW1ib2xzIGFyZSBub3QgZGVmaW5lZAotICAgICAgICAgYW55d2hlcmUuICAqLwotICAgICAgaW4tPm5fc2NudW0gPSAxOwotCi0gICAgICAvKiBJIGhhdmUgdHJpZWQgc2V0dGluZyB0aGUgY2xhc3MgdG8gMyBhbmQgdXNpbmcgdGhlIGZvbGxvd2luZwotCSB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyLiAgVGhpcyB3aWxsIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUKLQkgcG9pbnRlciB0byB0aGUgc3RyaW5nIGtlcm5lbDMyLmRsbCBhdCBhZGRyZXNzZXMgMCBhbmQgMHgxMAotCSBvZmYgc3RhcnQgb2YgaWRhdGEgc2VjdGlvbiB3aGljaCBpcyBub3QgY29ycmVjdCAqLwotICAgICAgLyogICAgaWYgKHN0cmNtcCAoaW4tPl9uLl9uX25hbWUsICIuaWRhdGEkNCIpID09IDApICovCi0gICAgICAvKiAgICAgIGluLT5uX3NjbnVtID0gMzsgKi8KLSAgICAgIC8qICAgIGVsc2UgKi8KLSAgICAgIC8qICAgICAgaW4tPm5fc2NudW0gPSAyOyAqLwotI2Vsc2UKLSAgICAgIC8qIENyZWF0ZSBzeW50aGV0aWMgZW1wdHkgc2VjdGlvbnMgYXMgbmVlZGVkLiAgREogKi8KLSAgICAgIGlmIChpbi0+bl9zY251bSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBmb3IgKHNlYz1hYmZkLT5zZWN0aW9uczsgc2VjOyBzZWM9c2VjLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCBpbi0+bl9uYW1lKSA9PSAwKQotCQl7Ci0JCSAgaW4tPm5fc2NudW0gPSBzZWMtPnRhcmdldF9pbmRleDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKGluLT5uX3NjbnVtID09IDApCi0JewotCSAgaW50IHVudXNlZF9zZWN0aW9uX251bWJlciA9IDA7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgY2hhciAqbmFtZTsKLQkgIGZvciAoc2VjPWFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYz1zZWMtPm5leHQpCi0JICAgIGlmICh1bnVzZWRfc2VjdGlvbl9udW1iZXIgPD0gc2VjLT50YXJnZXRfaW5kZXgpCi0JICAgICAgdW51c2VkX3NlY3Rpb25fbnVtYmVyID0gc2VjLT50YXJnZXRfaW5kZXgrMTsKLQotCSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChpbi0+bl9uYW1lKSArIDEwKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybjsKLQkgIHN0cmNweSAobmFtZSwgaW4tPm5fbmFtZSk7Ci0JICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0KLQkgIHNlYy0+dm1hID0gMDsKLQkgIHNlYy0+bG1hID0gMDsKLQkgIHNlYy0+X2Nvb2tlZF9zaXplID0gMDsKLQkgIHNlYy0+X3Jhd19zaXplID0gMDsKLQkgIHNlYy0+ZmlsZXBvcyA9IDA7Ci0JICBzZWMtPnJlbF9maWxlcG9zID0gMDsKLQkgIHNlYy0+cmVsb2NfY291bnQgPSAwOwotCSAgc2VjLT5saW5lX2ZpbGVwb3MgPSAwOwotCSAgc2VjLT5saW5lbm9fY291bnQgPSAwOwotCSAgc2VjLT51c2VyZGF0YSA9IE5VTEw7Ci0JICBzZWMtPm5leHQgPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgIHNlYy0+ZmxhZ3MgPSAwOwotCSAgc2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCSAgc2VjLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfREFUQSB8IFNFQ19MT0FEOwotCi0JICBzZWMtPnRhcmdldF9pbmRleCA9IHVudXNlZF9zZWN0aW9uX251bWJlcjsKLQotCSAgaW4tPm5fc2NudW0gPSB1bnVzZWRfc2VjdGlvbl9udW1iZXI7Ci0JfQotICAgICAgaW4tPm5fc2NsYXNzID0gQ19TVEFUOwotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgY29mZl9zd2FwX3N5bV9pbl9ob29rCi0gIGNvZmZfc3dhcF9zeW1faW5faG9vayhhYmZkLCBleHQxLCBpbjEpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLSAgaWYoaW4tPl9uLl9uX25hbWVbMF0gPT0gMCkgewotICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV96ZXJvZXMpOwotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+X24uX25fbi5fbl9vZmZzZXQsIChiZmRfYnl0ZSAqKSAgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotI2lmIFNZTU5NTEVOICE9IEVfU1lNTk1MRU4KLSAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOwotI2Vsc2UKLSAgICBtZW1jcHkoZXh0LT5lLmVfbmFtZSwgaW4tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSNlbmRpZgotICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl92YWx1ZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3NjbnVtICwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpCi0gICAgewotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgIH0KLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX3NjbGFzcyAsIGV4dC0+ZV9zY2xhc3MpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fbnVtYXV4ICwgZXh0LT5lX251bWF1eCk7Ci0KLSAgcmV0dXJuIFNZTUVTWjsKLX0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiAJICAgICAgZXh0MTsKLSAgICAgaW50ICAgICAgICAgICAgIHR5cGU7Ci0gICAgIGludCAgICAgICAgICAgICBjbGFzczsKLSAgICAgaW50CSAgICAgIGluZHg7Ci0gICAgIGludAkgICAgICBudW1hdXg7Ci0gICAgIFBUUiAJICAgICAgaW4xOwotewotICBBVVhFTlQgICAgKmV4dCA9IChBVVhFTlQgKilleHQxOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWluMTsKLQotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gIGNhc2UgQ19GSUxFOgotICAgIGlmIChleHQtPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGluLT54X2ZpbGUueF9uLnhfemVyb2VzID0gMDsKLSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gCi0JYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0jaWYgRklMTk1MRU4gIT0gRV9GSUxOTUxFTgotICAgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIEZJTE5NTEVOITsKLSNlbHNlCi0gICAgICBtZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotI2VuZGlmCi0gICAgfQotICAgIHJldHVybjsKLQotCi0gIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBpbi0+eF9zY24ueF9zY25sZW4gPSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc2NuLnhfbnJlbG9jID0gR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3Njbi54X25saW5ubyA9IEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwKLQkJCQkJICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jaGVja3N1bSk7Ci0gICAgICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfYXNzb2NpYXRlZCk7Ci0gICAgICBpbi0+eF9zY24ueF9jb21kYXQgPSBiZmRfaF9nZXRfOCAoYWJmZCwKLQkJCQkJKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jb21kYXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGluLT54X3N5bS54X3RhZ25keC5sID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgaW4tPnhfc3ltLnhfdHZuZHggPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gR0VUX0ZDTl9MTk5PUFRSIChhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBHRVRfRkNOX0VORE5EWCAoYWJmZCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgRElNTlVNICE9IEVfRElNTlVNCi0gI2Vycm9yIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIERJTU5VTQotI2VuZGlmCi0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOKHR5cGUpKSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gPSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCk7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gR0VUX0xOU1pfU0laRShhYmZkLCBleHQpOwotICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9hdXhfb3V0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAgICphYmZkOwotICAgICBQVFIgCWlucDsKLSAgICAgaW50ICAgdHlwZTsKLSAgICAgaW50ICAgY2xhc3M7Ci0gICAgIGludCAgIGluZHg7Ci0gICAgIGludCAgIG51bWF1eDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW5wOwotICBBVVhFTlQgKmV4dCA9IChBVVhFTlQgKilleHRwOwotCi0gIG1lbXNldCgoUFRSKWV4dCwgMCwgQVVYRVNaKTsKLSAgc3dpdGNoIChjbGFzcykgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoaW4tPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfemVyb2VzKTsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0gICAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRklMTk1MRU4hOwotI2Vsc2UKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuIEFVWEVTWjsKLQotCi0gIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBQVVRfU0NOX1NDTkxFTihhYmZkLCBpbi0+eF9zY24ueF9zY25sZW4sIGV4dCk7Ci0gICAgICBQVVRfU0NOX05SRUxPQyhhYmZkLCBpbi0+eF9zY24ueF9ucmVsb2MsIGV4dCk7Ci0gICAgICBQVVRfU0NOX05MSU5OTyhhYmZkLCBpbi0+eF9zY24ueF9ubGlubm8sIGV4dCk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT54X3Njbi54X2NoZWNrc3VtLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jaGVja3N1bSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3Njbi54X2Fzc29jaWF0ZWQsCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2Fzc29jaWF0ZWQpOwotICAgICAgYmZkX2hfcHV0XzggKGFiZmQsIGluLT54X3Njbi54X2NvbWRhdCwKLQkJICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jb21kYXQpOwotICAgICAgcmV0dXJuIEFVWEVTWjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPnhfc3ltLnhfdGFnbmR4LmwsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X3R2bmR4ICwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIGV4dCk7Ci0gICAgICBQVVRfRkNOX0VORE5EWChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04gKHR5cGUpKQotICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplLAotCSAgICAgKGJmZF9ieXRlICopICBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9MTlNaX0xOTk8gKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywgZXh0KTsKLSAgICAgIFBVVF9MTlNaX1NJWkUgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSwgZXh0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIEFVWEVTWjsKLX0KLQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIExJTkVOTyAqZXh0ID0gKExJTkVOTyAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWluMTsKLQotICBpbi0+bF9hZGRyLmxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0gIGluLT5sX2xubm8gPSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsIGlucCwgb3V0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJb3V0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWlucDsKLSAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqZXh0ID0gKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKilvdXRwOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopCi0JICBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0KLSAgUFVUX0xJTkVOT19MTk5PIChhYmZkLCBpbi0+bF9sbm5vLCBleHQpOwotICByZXR1cm4gTElORVNaOwotfQotCi0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBhb3V0aGRyX2V4dDEsIGFvdXRoZHJfaW50MSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBhb3V0aGRyX2V4dDE7Ci0gICAgIFBUUiBhb3V0aGRyX2ludDE7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICphOwotICBQRUFPVVRIRFIgKnNyYyA9IChQRUFPVVRIRFIgKikoYW91dGhkcl9leHQxKTsKLSAgQU9VVEhEUiAgICAgICAgKmFvdXRoZHJfZXh0ID0gKEFPVVRIRFIgKikgYW91dGhkcl9leHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilhb3V0aGRyX2ludDE7Ci0KLSAgYW91dGhkcl9pbnQtPm1hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+bWFnaWMpOwotICBhb3V0aGRyX2ludC0+dnN0YW1wID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dnN0YW1wKTsKLSAgYW91dGhkcl9pbnQtPnRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50c2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5kc2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZHNpemUpOwotICBhb3V0aGRyX2ludC0+YnNpemUgPQotICAgIEdFVF9BT1VUSERSX0JTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmJzaXplKTsKLSAgYW91dGhkcl9pbnQtPmVudHJ5ID0KLSAgICBHRVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5lbnRyeSk7Ci0gIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRleHRfc3RhcnQpOwotICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kYXRhX3N0YXJ0KTsKLQotICBhID0gJmFvdXRoZHJfaW50LT5wZTsKLSAgYS0+SW1hZ2VCYXNlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5JbWFnZUJhc2UpOwotICBhLT5TZWN0aW9uQWxpZ25tZW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TZWN0aW9uQWxpZ25tZW50KTsKLSAgYS0+RmlsZUFsaWdubWVudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+RmlsZUFsaWdubWVudCk7Ci0gIGEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IAotICAgIGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gCi0gICAgYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBhLT5NYWpvckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBhLT5NaW5vckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWlub3JJbWFnZVZlcnNpb24pOwotICBhLT5NYWpvclN1YnN5c3RlbVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk1ham9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGEtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYS0+UmVzZXJ2ZWQxID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5SZXNlcnZlZDEpOwotICBhLT5TaXplT2ZJbWFnZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mSW1hZ2UpOwotICBhLT5TaXplT2ZIZWFkZXJzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TaXplT2ZIZWFkZXJzKTsKLSAgYS0+Q2hlY2tTdW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPkNoZWNrU3VtKTsKLSAgYS0+U3Vic3lzdGVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TdWJzeXN0ZW0pOwotICBhLT5EbGxDaGFyYWN0ZXJpc3RpY3MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGEtPlNpemVPZlN0YWNrUmVzZXJ2ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mU3RhY2tDb21taXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgYS0+U2l6ZU9mSGVhcFJlc2VydmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mSGVhcENvbW1pdCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mSGVhcENvbW1pdCk7Ci0gIGEtPkxvYWRlckZsYWdzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5Mb2FkZXJGbGFncyk7Ci0gIGEtPk51bWJlck9mUnZhQW5kU2l6ZXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotCi0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDE2OyBpZHgrKykKLSAgICAgIHsKLQlhLT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPQotCSAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5EYXRhRGlyZWN0b3J5W2lkeF1bMF0pOwotCWEtPkRhdGFEaXJlY3RvcnlbaWR4XS5TaXplID0KLQkgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIGlmIChhb3V0aGRyX2ludC0+ZW50cnkpCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPmVudHJ5ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT5lbnRyeSAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW50LT50c2l6ZSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgKz0gYS0+SW1hZ2VCYXNlOwotICAgICAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gIGlmIChhb3V0aGRyX2ludC0+ZHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG5vcm1hbGx5IHNldCB1cCBieSBwcGNfcmVsb2NhdGVfc2VjdGlvbi4KLSAgICAgSW4gdGhlIGNhc2Ugb2YgcmVhZGluZyBhIGZpbGUgaW4sIHdlIGNhbiBwaWNrIHRoZW0gdXAgZnJvbQotICAgICB0aGUgRGF0YURpcmVjdG9yeS4KLSAgKi8KLSAgZmlyc3RfdGh1bmtfYWRkcmVzcyA9IGEtPkRhdGFEaXJlY3RvcnlbMTJdLlZpcnR1YWxBZGRyZXNzIDsKLSAgdGh1bmtfc2l6ZSA9IGEtPkRhdGFEaXJlY3RvcnlbMTJdLlNpemU7Ci0gIGltcG9ydF90YWJsZV9zaXplID0gYS0+RGF0YURpcmVjdG9yeVsxXS5TaXplOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHZvaWQgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGFvdXQsIGlkeCwgbmFtZSwgYmFzZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqYW91dDsKLSAgICAgaW50IGlkeDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBiYXNlOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCi0gIC8qIGFkZCBpbXBvcnQgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGlmIGl0IGV4aXN0cyAqLwotICBpZiAoKHNlYyAhPSBOVUxMKQotICAgICAgJiYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpCi0gICAgICAmJiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBhb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPSAoc2VjLT52bWEgLSBiYXNlKSAmIDB4ZmZmZmZmZmY7Ci0gICAgICBhb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF0uU2l6ZSA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnZpcnRfc2l6ZTsKLSAgICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWluOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkcjsKLSAgUEVBT1VUSERSICphb3V0aGRyX291dCA9IChQRUFPVVRIRFIgKilvdXQ7Ci0KLSAgYmZkX3ZtYSBzYSA9IGV4dHJhLT5TZWN0aW9uQWxpZ25tZW50OwotICBiZmRfdm1hIGZhID0gZXh0cmEtPkZpbGVBbGlnbm1lbnQ7Ci0gIGJmZF92bWEgaWIgPSBleHRyYS0+SW1hZ2VCYXNlIDsKLQotICBpZiAoYW91dGhkcl9pbi0+dHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbi0+ZHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbi0+ZW50cnkpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPmVudHJ5IC09IGliOwotICAgICAgYW91dGhkcl9pbi0+ZW50cnkgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0KLSNkZWZpbmUgRkEoeCkgICgoKHgpICsgZmEgLTEgKSAmICgtIGZhKSkKLSNkZWZpbmUgU0EoeCkgICgoKHgpICsgc2EgLTEgKSAmICgtIHNhKSkKLQotICAvKiBXZSBsaWtlIHRvIGhhdmUgdGhlIHNpemVzIGFsaWduZWQgKi8KLQotICBhb3V0aGRyX2luLT5ic2l6ZSA9IEZBIChhb3V0aGRyX2luLT5ic2l6ZSk7Ci0KLQotICBleHRyYS0+TnVtYmVyT2ZSdmFBbmRTaXplcyA9IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOwotCi0gIC8qIGZpcnN0IG51bGwgb3V0IGFsbCBkYXRhIGRpcmVjdG9yeSBlbnRyaWVzIC4uICovCi0gIG1lbXNldCAoZXh0cmEtPkRhdGFEaXJlY3RvcnksIHNpemVvZiAoZXh0cmEtPkRhdGFEaXJlY3RvcnkpLCAwKTsKLQotICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDAsICIuZWRhdGEiLCBpYik7Ci0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMSwgIi5pZGF0YSIsIGliKTsKLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAyLCAiLnJzcmMiICxpYik7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIC8qIEZJWE1FOiBkbyBvdGhlciBQRSBwbGF0Zm9ybXMgdXNlIHRoaXM/ICovCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMywgIi5wZGF0YSIgLGliKTsKLSNlbmRpZgotCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgNSwgIi5yZWxvYyIsIGliKTsKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgLyogT24gdGhlIFBQQyBOVCBzeXN0ZW0sIHRoaXMgZmllbGQgaXMgc2V0IHVwIGFzIGZvbGxvd3MuIEl0IGlzCi0gICAgIG5vdCBhbiAib2ZmaWNpYWxseSIgcmVzZXJ2ZWQgZmllbGQsIHNvIGl0IGN1cnJlbnRseSBoYXMgbm8gdGl0bGUuCi0gICAgIGZpcnN0X3RodW5rX2FkZHJlc3MgaXMgaWRhdGEkNSwgYW5kIHRoZSB0aHVua19zaXplIGlzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBpZGF0YSQ1IGNodW5rIG9mIHRoZSBpZGF0YSBzZWN0aW9uLgotICAqLwotICBleHRyYS0+RGF0YURpcmVjdG9yeVsxMl0uVmlydHVhbEFkZHJlc3MgPSBmaXJzdF90aHVua19hZGRyZXNzOwotICBleHRyYS0+RGF0YURpcmVjdG9yeVsxMl0uU2l6ZSA9IHRodW5rX3NpemU7Ci0KLSAgLyogT24gdGhlIFBQQyBOVCBzeXN0ZW0sIHRoZSBzaXplIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkgaXMgbm90IHRoZQotICAgICBzaXplIG9mIHRoZSBlbnRpcmUgc2VjdGlvbi4gSXQncyBhY3R1YWxseSBvZmZzZXQgdG8gdGhlIGVuZCBvZiAKLSAgICAgdGhlIGlkYXRhJDMgY29tcG9uZW50IG9mIHRoZSBpZGF0YSBzZWN0aW9uLiBUaGlzIGlzIHRoZSBzaXplIG9mCi0gICAgIHRoZSBlbnRpcmUgaW1wb3J0IHRhYmxlLiAoYWxzbyBrbm93biBhcyB0aGUgc3RhcnQgb2YgaWRhdGEkNCkKLSAgKi8KLSAgZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZSA9IGltcG9ydF90YWJsZV9zaXplOwotI2VuZGlmCi0KLSAgewotICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgYmZkX3ZtYSBkc2l6ZT0gMDsKLSAgICBiZmRfdm1hIGlzaXplID0gU0EoYWJmZC0+c2VjdGlvbnMtPmZpbGVwb3MpOwotICAgIGJmZF92bWEgdHNpemU9IDA7Ci0KLSAgICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICAgIHsKLQlpbnQgcm91bmRlZCA9IEZBKHNlYy0+X3Jhd19zaXplKTsKLQotCWlmIChzZWMtPmZsYWdzICYgU0VDX0RBVEEpIAotCSAgZHNpemUgKz0gcm91bmRlZDsKLQlpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCSAgdHNpemUgKz0gcm91bmRlZDsKLQlpc2l6ZSArPSBTQShyb3VuZGVkKTsKLSAgICAgIH0KLQotICAgIGFvdXRoZHJfaW4tPmRzaXplID0gZHNpemU7Ci0gICAgYW91dGhkcl9pbi0+dHNpemUgPSB0c2l6ZTsKLSAgICBleHRyYS0+U2l6ZU9mSW1hZ2UgPSBpc2l6ZTsKLSAgfQotCi0gIGV4dHJhLT5TaXplT2ZIZWFkZXJzID0gYWJmZC0+c2VjdGlvbnMtPmZpbGVwb3M7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT5tYWdpYywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5tYWdpYyk7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIC8qIHRoaXMgbGl0dGxlIHBpZWNlIG9mIG1hZ2ljIHNldHMgdGhlICJsaW5rZXIgdmVyc2lvbiIgZmllbGQgdG8gMi42MCAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMiAgKyA2MCAqIDI1NiwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC52c3RhbXApOwotI2Vsc2UKLSAgLyogdGhpcyBsaXR0bGUgcGllY2Ugb2YgbWFnaWMgc2V0cyB0aGUgImxpbmtlciB2ZXJzaW9uIiBmaWVsZCB0byAyLjU1ICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAyICArIDU1ICogMjU2LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnZzdGFtcCk7Ci0jZW5kaWYKLQotICBQVVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+dHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQudHNpemUpOwotICBQVVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+ZHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZHNpemUpOwotICBQVVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+YnNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuYnNpemUpOwotICBQVVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgYW91dGhkcl9pbi0+ZW50cnksIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZW50cnkpOwotICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0LAotCQkJICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnRleHRfc3RhcnQpOwotCi0gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZGF0YV9zdGFydCk7Ci0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5JbWFnZUJhc2UsIAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkltYWdlQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNlY3Rpb25BbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkZpbGVBbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RmlsZUFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWFqb3JJbWFnZVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vckltYWdlVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NaW5vckltYWdlVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yU3Vic3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vclN1YnN5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+UmVzZXJ2ZWQxLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlJlc2VydmVkMSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkltYWdlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkltYWdlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhZGVycywKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFkZXJzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+Q2hlY2tTdW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Q2hlY2tTdW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5TdWJzeXN0ZW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U3Vic3lzdGVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+RGxsQ2hhcmFjdGVyaXN0aWNzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZlN0YWNrUmVzZXJ2ZSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZTdGFja1Jlc2VydmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZTdGFja0NvbW1pdCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZTdGFja0NvbW1pdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYXBSZXNlcnZlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhcENvbW1pdCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+TG9hZGVyRmxhZ3MsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TG9hZGVyRmxhZ3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5OdW1iZXJPZlJ2YUFuZFNpemVzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICB7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzLAotCQkgICAgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRhdGFEaXJlY3RvcnlbaWR4XVswXSk7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiBBT1VUU1o7Ci19Ci0KLXN0YXRpYyB2b2lkCi0gICAgY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICBQVFIJICAgICBleHQ7Ci0gIFBUUgkgICAgIGluOwotewotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopIGV4dDsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotICBzY25oZHJfaW50LT5zX3NjbnB0ciA9Ci0gICAgR0VUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7Ci0gIHNjbmhkcl9pbnQtPnNfcmVscHRyID0KLSAgICBHRVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgc2NuaGRyX2ludC0+c19sbm5vcHRyID0KLSAgICBHRVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBzY25oZHJfaW50LT5zX2ZsYWdzID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLQotICBzY25oZHJfaW50LT5zX25yZWxvYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLQotICBpZiAoc2NuaGRyX2ludC0+c192YWRkciAhPSAwKSAKLSAgICB7Ci0gICAgICBzY25oZHJfaW50LT5zX3ZhZGRyICs9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgICAgc2NuaGRyX2ludC0+c192YWRkciAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCBfQlNTKSA9PSAwKSAKLSAgICB7Ci0gICAgICBzY25oZHJfaW50LT5zX3NpemUgPSBzY25oZHJfaW50LT5zX3BhZGRyOwotICAgICAgc2NuaGRyX2ludC0+c19wYWRkciA9IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKWluOwotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopb3V0OwotICB1bnNpZ25lZCBpbnQgcmV0ID0gU0NOSFNaOwotICBiZmRfdm1hIHBzOwotICBiZmRfdm1hIHNzOwotCi0gIG1lbWNweShzY25oZHJfZXh0LT5zX25hbWUsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotCi0gIFBVVF9TQ05IRFJfVkFERFIgKGFiZmQsIAotCQkgICAgKChzY25oZHJfaW50LT5zX3ZhZGRyIAotCQkgICAgICAtIHBlX2RhdGEoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpCi0JCSAgICAgJiAweGZmZmZmZmZmKSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLQotICAvKiBOVCB3YW50cyB0aGUgc2l6ZSBkYXRhIHRvIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgTlRfRklMRV9BTElHTk1FTlQKLSAgICAgdmFsdWUgZXhjZXB0IGZvciB0aGUgQlNTIHNlY3Rpb24sIGl0cyBzX3NpemUgc2hvdWxkIGJlIDAgKi8KLQotCi0gIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgX0JTUykgPT0gMCkgCi0gICAgewotICAgICAgcHMgPSBzY25oZHJfaW50LT5zX3NpemU7Ci0gICAgICBzcyA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHMgPSBzY25oZHJfaW50LT5zX3BhZGRyOwotICAgICAgc3MgPSBzY25oZHJfaW50LT5zX3NpemU7Ci0gICAgfQotCi0gIFBVVF9TQ05IRFJfU0laRSAoYWJmZCwgc3MsCi0JCSAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0KLSAgUFVUX1NDTkhEUl9QQUREUiAoYWJmZCwgcHMsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLQotICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLQotICAvKiBFeHRyYSBmbGFncyBtdXN0IGJlIHNldCB3aGVuIGRlYWxpbmcgd2l0aCBOVC4gIEFsbCBzZWN0aW9ucyBzaG91bGQgYWxzbwotICAgICBoYXZlIHRoZSBJTUFHRV9TQ05fTUVNX1JFQUQgKDB4NDAwMDAwMDApIGZsYWcgc2V0LiAgSW4gYWRkaXRpb24sIHRoZQotICAgICAudGV4dCBzZWN0aW9uIG11c3QgaGF2ZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgKDB4MjAwMDAwMDApIGFuZCB0aGUgZGF0YQotICAgICBzZWN0aW9ucyAoLmlkYXRhLCAuZGF0YSwgLmJzcywgLkNSVCkgbXVzdCBoYXZlIElNQUdFX1NDTl9NRU1fV1JJVEUgc2V0Ci0gICAgICh0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4gZGVhbGluZyB3aXRoIHRoZSAuaWRhdGEgc2VjdGlvbiBzaW5jZQotICAgICB0aGUgYWRkcmVzc2VzIGZvciByb3V0aW5lcyBmcm9tIC5kbGxzIG11c3QgYmUgb3ZlcndyaXR0ZW4pLiAgSWYgLnJlbG9jCi0gICAgIHNlY3Rpb24gZGF0YSBpcyBldmVyIGdlbmVyYXRlZCwgd2UgbXVzdCBhZGQgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRQotICAgICAoMHgwMjAwMDAwMCkuICBBbHNvLCB0aGUgcmVzb3VyY2UgZGF0YSBzaG91bGQgYWxzbyBiZSByZWFkIGFuZAotICAgICB3cml0YWJsZS4gICovCi0KLSAgLyogRklYTUU6IGFsaWdubWVudCBpcyBhbHNvIGVuY29kZWQgaW4gdGhpcyBmaWVsZCwgYXQgbGVhc3Qgb24gcHBjIChrcmspICovCi0gIC8qIEZJWE1FOiBldmVuIHdvcnNlLCBJIGRvbid0IHNlZSBob3cgdG8gZ2V0IHRoZSBvcmlnaW5hbCBhbGlnbm1lbnQgZmllbGQqLwotICAvKiAgICAgICAgYmFjay4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBGSVhNRTogQmFzaW5nIHRoaXMgb24gc2VjdGlvbiBuYW1lcyBpcyBib2d1cy4gIEFsc28sIHRoaXMgc2hvdWxkCi0gICAgIGJlIGluIHNlY190b19zdHlwX2ZsYWdzLiAgKi8KLQotICB7Ci0gICAgaW50IGZsYWdzID0gc2NuaGRyX2ludC0+c19mbGFnczsKLSAgICBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuZGF0YSIpICA9PSAwIHx8Ci0Jc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuQ1JUIikgICA9PSAwIHx8Ci0Jc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuYnNzIikgICA9PSAwKQotICAgICAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9SRUFEIHwgSU1BR0VfU0NOX01FTV9XUklURTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICAgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fRVhFQ1VURTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZWxvYyIpID09IDApCi0gICAgICBmbGFncyA9IChTRUNfREFUQSB8IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUKLQkgICAgICAgfCBJTUFHRV9TQ05fTUVNX1NIQVJFRCk7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuaWRhdGEiKSA9PSAwKQotICAgICAgZmxhZ3MgPSBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX1dSSVRFIHwgU0VDX0RBVEE7ICAgICAKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZGF0YSIpID09IDAKLQkgICAgIHx8IHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmVkYXRhIikgPT0gMCkKLSAgICAgIGZsYWdzID0gIElNQUdFX1NDTl9NRU1fUkVBRCB8IFNFQ19EQVRBOyAgICAgCi0gICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIucGRhdGEiKSA9PSAwKQotICAgICAgZmxhZ3MgPSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfCBJTUFHRV9TQ05fQUxJR05fNEJZVEVTIHwKLQkJCSAgSU1BR0VfU0NOX01FTV9SRUFEIDsKLSAgICAvKiBSZW1lbWJlciB0aGlzIGZpZWxkIGlzIGEgbWF4IG9mIDggY2hhcnMsIHNvIHRoZSBudWxsIGlzIF9ub3RfIHRoZXJlCi0gICAgICAgZm9yIGFuIDggY2hhcmFjdGVyIG5hbWUgbGlrZSAiLnJlbGRhdGEiLiAoeWVwLiBTdHVwaWQgYnVnKSAqLwotICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZWxkYXRhIiwgOCkgPT0gMCkKLSAgICAgIGZsYWdzID0gIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSB8IElNQUdFX1NDTl9BTElHTl84QllURVMgfAotCSAgICAgICBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX1dSSVRFIDsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi55ZGF0YSIpID09IDApCi0gICAgICBmbGFncyA9ICBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfCBJTUFHRV9TQ05fQUxJR05fOEJZVEVTIHwKLQkgICAgICAgSU1BR0VfU0NOX01FTV9SRUFEIHwgSU1BR0VfU0NOX01FTV9XUklURSA7Ci0gICAgZWxzZSBpZiAoc3RybmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmRyZWN0dmUiLCA4KSA9PSAwKQotICAgICAgZmxhZ3MgPSAgSU1BR0VfU0NOX0xOS19JTkZPIHwgSU1BR0VfU0NOX0xOS19SRU1PVkUgOwotICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICAgIGZsYWdzIHw9IChJTUFHRV9TQ05fTE5LX0lORk8gfCBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCi0JCXwgSU1BR0VfU0NOX01FTV9TSEFSRUQgfCBJTUFHRV9TQ05fTUVNX1JFQUQpOwotICAgIGVsc2UgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLnJzcmMiKSAgPT0gMCkKLSAgICAgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fU0hBUkVEOwotICAgIGVsc2UKLSAgICAgIHsKLQlmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1JFQUQ7Ci0JaWYgKCEgKGZsYWdzICYgU0VDX1JFQURPTkxZKSkKLQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fV1JJVEU7Ci0gICAgICB9Ci0KLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmxhZ3MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgfQotCi0gIGlmIChzY25oZHJfaW50LT5zX25sbm5vIDw9IDB4ZmZmZikKLSAgICBiZmRfaF9wdXRfMTYoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICBlbHNlCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJICAgICBzY25oZHJfaW50LT5zX25sbm5vKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICAgICAgcmV0ID0gMDsKLSAgICB9Ci0gIGlmIChzY25oZHJfaW50LT5zX25yZWxvYyA8PSAweGZmZmYpCi0gICAgYmZkX2hfcHV0XzE2KGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBlbHNlCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJICAgICBzY25oZHJfaW50LT5zX25yZWxvYyk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gICAgICByZXQgPSAwOwotICAgIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNoYXIgKiBkaXJfbmFtZXNbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdID0gCi17Ci0gIE5fICgiRXhwb3J0IERpcmVjdG9yeSBbLmVkYXRhIChvciB3aGVyZSBldmVyIHdlIGZvdW5kIGl0KV0iKSwKLSAgTl8gKCJJbXBvcnQgRGlyZWN0b3J5IFtwYXJ0cyBvZiAuaWRhdGFdIiksCi0gIE5fICgiUmVzb3VyY2UgRGlyZWN0b3J5IFsucnNyY10iKSwKLSAgTl8gKCJFeGNlcHRpb24gRGlyZWN0b3J5IFsucGRhdGFdIiksCi0gIE5fICgiU2VjdXJpdHkgRGlyZWN0b3J5IiksCi0gIE5fICgiQmFzZSBSZWxvY2F0aW9uIERpcmVjdG9yeSBbLnJlbG9jXSIpLAotICBOXyAoIkRlYnVnIERpcmVjdG9yeSIpLAotICBOXyAoIkRlc2NyaXB0aW9uIERpcmVjdG9yeSIpLAotICBOXyAoIlNwZWNpYWwgRGlyZWN0b3J5IiksCi0gIE5fICgiVGhyZWFkIFN0b3JhZ2UgRGlyZWN0b3J5IFsudGxzXSIpLAotICBOXyAoIkxvYWQgQ29uZmlndXJhdGlvbiBEaXJlY3RvcnkiKSwKLSAgTl8gKCJCb3VuZCBJbXBvcnQgRGlyZWN0b3J5IiksCi0gIE5fICgiSW1wb3J0IEFkZHJlc3MgVGFibGUgRGlyZWN0b3J5IiksCi0gIE5fICgiUmVzZXJ2ZWQiKSwKLSAgTl8gKCJSZXNlcnZlZCIpLAotICBOXyAoIlJlc2VydmVkIikKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X2lkYXRhKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaWRhdGEiKTsKLSAgdW5zaWduZWQgbG9uZyBhZGo7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIGFzZWN0aW9uICpyZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbGRhdGEiKTsKLSNlbmRpZgotCi0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemU7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YW9mZjsKLSAgYmZkX3NpemVfdHlwZSBzZWNzaXplOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGJmZF9zaXplX3R5cGUgc3RhcnQsIHN0b3A7Ci0gIGludCBvbmFsaW5lID0gMjA7Ci0KLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGUtPnBlX29wdGhkcjsKLQotICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBkYXRhb2ZmID0gMDsKLQotICAgICAgaWYgKGRhdGFzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyLCBzaXplOwotCi0gICAgICBhZGRyID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uVmlydHVhbEFkZHJlc3M7Ci0gICAgICBzaXplID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZTsKLQotICAgICAgaWYgKGFkZHIgPT0gMCB8fCBzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgIGlmIChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlIDw9IGFkZHIKLQkgICAgICAmJiAoKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UKLQkJICAgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSkKLQkJICA+PSBhZGRyICsgc2l6ZSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiB0aGUgaW1wb3J0IHRhYmxlIHNpemUgaXMgbm90IHJlbGlhYmxlLiAgVGhlCi0gICAgICAgICBpbXBvcnQgZGF0YSB3aWxsIGV4dGVuZCBwYXN0IHRoZSBpbmRpY2F0ZWQgc2l6ZSwgYW5kIGJlZm9yZQotICAgICAgICAgdGhlIGluZGljYXRlZCBhZGRyZXNzLiAgKi8KLSAgICAgIGRhdGFvZmYgPSBhZGRyIC0gKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UpOwotICAgICAgZGF0YXNpemUgPSBzaXplOwotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgaWYgKHJlbF9zZWN0aW9uICE9IDAgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pICE9IDApCi0gICAgewotICAgICAgLyogVGhlIHRvYyBhZGRyZXNzIGNhbiBiZSBmb3VuZCBieSB0YWtpbmcgdGhlIHN0YXJ0aW5nIGFkZHJlc3MsCi0JIHdoaWNoIG9uIHRoZSBQUEMgbG9jYXRlcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuIFRoZSBkZXNjcmlwdG9yCi0JIGNvbnNpc3RzIG9mIHRoZSBmdW5jdGlvbiBjb2RlIHN0YXJ0aW5nIGFkZHJlc3MgZm9sbG93ZWQgYnkgdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHRvYy4gVGhlIHN0YXJ0aW5nIGFkZHJlc3Mgd2UgZ2V0IGZyb20gdGhlIGJmZCwKLQkgYW5kIHRoZSBkZXNjcmlwdG9yIGlzIHN1cHBvc2VkIHRvIGJlIGluIHRoZSAucmVsZGF0YSBzZWN0aW9uLiAKLSAgICAgICovCi0KLSAgICAgIGJmZF92bWEgbG9hZGFibGVfdG9jX2FkZHJlc3M7Ci0gICAgICBiZmRfdm1hIHRvY19hZGRyZXNzOwotICAgICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotICAgICAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICAgICAgaW50IG9mZnNldDsKLSAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgCi0JCQkJCQkJCSByZWxfc2VjdGlvbikpOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCAmJiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pOwotICAKLSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgCi0JCQkJcmVsX3NlY3Rpb24sIAotCQkJCShQVFIpIGRhdGEsIDAsIAotCQkJCWJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKSk7Ci0KLSAgICAgIG9mZnNldCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3MgLSByZWxfc2VjdGlvbi0+dm1hOwotCi0gICAgICBzdGFydF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK29mZnNldCk7Ci0gICAgICBsb2FkYWJsZV90b2NfYWRkcmVzcyA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStvZmZzZXQrNCk7Ci0gICAgICB0b2NfYWRkcmVzcyA9IGxvYWRhYmxlX3RvY19hZGRyZXNzIC0gMzI3Njg7Ci0KLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICBfKCJcbkZ1bmN0aW9uIGRlc2NyaXB0b3IgbG9jYXRlZCBhdCB0aGUgc3RhcnQgYWRkcmVzczogJTA0bHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGFiZmQtPnN0YXJ0X2FkZHJlc3MpKTsKLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgIF8oIlx0Y29kZS1iYXNlICUwOGx4IHRvYyAobG9hZGFibGUvYWN0dWFsKSAlMDhseC8lMDhseFxuIiksIAotCSAgICAgICBzdGFydF9hZGRyZXNzLCBsb2FkYWJsZV90b2NfYWRkcmVzcywgdG9jX2FkZHJlc3MpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgXygiXG5ObyByZWxkYXRhIHNlY3Rpb24hIEZ1bmN0aW9uIGRlc2NyaXB0b3Igbm90IGRlY29kZWQuXG4iKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5UaGUgSW1wb3J0IFRhYmxlcyAoaW50ZXJwcmV0ZWQgLmlkYXRhIHNlY3Rpb24gY29udGVudHMpXG4iKSk7Ci0gIGZwcmludGYoZmlsZSwKLQkgIF8oIiB2bWE6ICAgICAgICAgICAgSGludCAgICBUaW1lICAgICAgRm9yd2FyZCAgRExMICAgICAgIEZpcnN0XG4iKSk7Ci0gIGZwcmludGYoZmlsZSwKLQkgIF8oIiAgICAgICAgICAgICAgICAgVGFibGUgICBTdGFtcCAgICAgQ2hhaW4gICAgTmFtZSAgICAgIFRodW5rXG4iKSk7Ci0KLSAgc2Vjc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlY3NpemUpOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIHNlY3NpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCAwLCBzZWNzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWRqID0gKGV4dHJhLT5JbWFnZUJhc2UgLSBzZWN0aW9uLT52bWEpICYgMHhmZmZmZmZmZjsKLQotICBzdGFydCA9IGRhdGFvZmY7Ci0gIHN0b3AgPSBkYXRhb2ZmICsgZGF0YXNpemU7Ci0gIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBvbmFsaW5lKQotICAgIHsKLSAgICAgIGJmZF92bWEgaGludF9hZGRyOwotICAgICAgYmZkX3ZtYSB0aW1lX3N0YW1wOwotICAgICAgYmZkX3ZtYSBmb3J3YXJkX2NoYWluOwotICAgICAgYmZkX3ZtYSBkbGxfbmFtZTsKLSAgICAgIGJmZF92bWEgZmlyc3RfdGh1bms7Ci0gICAgICBpbnQgaWR4ID0gMDsKLSAgICAgIGJmZF9zaXplX3R5cGUgajsKLSAgICAgIGNoYXIgKmRsbDsKLQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgIiAlMDhseFx0IiwgCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGkgKyBzZWN0aW9uLT52bWEgKyBkYXRhb2ZmKSk7Ci0gICAgICAKLSAgICAgIGlmIChpKzIwID4gc3RvcCkKLQl7Ci0JICAvKiBjaGVjayBzdHVmZiAqLwotCSAgOwotCX0KLSAgICAgIAotICAgICAgaGludF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOwotICAgICAgdGltZV9zdGFtcCA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOwotICAgICAgZm9yd2FyZF9jaGFpbiA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzgpOwotICAgICAgZGxsX25hbWUgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSsxMik7Ci0gICAgICBmaXJzdF90aHVuayA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzE2KTsKLSAgICAgIAotICAgICAgZnByaW50ZihmaWxlLCAiJTA4bHggJTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsCi0JICAgICAgaGludF9hZGRyLAotCSAgICAgIHRpbWVfc3RhbXAsCi0JICAgICAgZm9yd2FyZF9jaGFpbiwKLQkgICAgICBkbGxfbmFtZSwKLQkgICAgICBmaXJzdF90aHVuayk7Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgPT0gMCAmJiBmaXJzdF90aHVuayA9PSAwKQotCWJyZWFrOwotCi0gICAgICAvKiB0aGUgaW1hZ2UgYmFzZSBpcyBwcmVzZW50IGluIHRoZSBzZWN0aW9uLT52bWEgKi8KLSAgICAgIGRsbCA9IChjaGFyICopIGRhdGEgKyBkbGxfbmFtZSArIGFkajsKLSAgICAgIGZwcmludGYoZmlsZSwgXygiXG5cdERMTCBOYW1lOiAlc1xuIiksIGRsbCk7Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCBfKCJcdHZtYTogIEhpbnQvT3JkIE1lbWJlci1OYW1lXG4iKSk7Ci0KLQkgIGlkeCA9IGhpbnRfYWRkciArIGFkajsKLQotCSAgZm9yIChqID0gMDsgaiA8IHN0b3A7IGogKz0gNCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeCArIGopOwotCi0JICAgICAgaWYgKG1lbWJlciA9PSAwKQotCQlicmVhazsKLQkgICAgICBpZiAobWVtYmVyICYgMHg4MDAwMDAwMCkKLQkJZnByaW50ZiAoZmlsZSwgIlx0JTA0bHhcdCAlNGx1IiwgbWVtYmVyLAotCQkJIG1lbWJlciAmIDB4N2ZmZmZmZmYpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGludCBvcmRpbmFsOwotCQkgIGNoYXIgKm1lbWJlcl9uYW1lOwotCi0JCSAgb3JkaW5hbCA9IGJmZF9nZXRfMTYgKGFiZmQsIGRhdGEgKyBtZW1iZXIgKyBhZGopOwotCQkgIG1lbWJlcl9uYW1lID0gKGNoYXIgKikgZGF0YSArIG1lbWJlciArIGFkaiArIDI7Ci0JCSAgZnByaW50ZiAoZmlsZSwgIlx0JTA0bHhcdCAlNGQgICVzIiwKLQkJCSAgIG1lbWJlciwgb3JkaW5hbCwgbWVtYmVyX25hbWUpOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGUgdGltZSBzdGFtcCBpcyBub3QgemVybywgdGhlIGltcG9ydCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgIHRhYmxlIGhvbGRzIGFjdHVhbCBhZGRyZXNzZXMuICAqLwotCSAgICAgIGlmICh0aW1lX3N0YW1wICE9IDAKLQkJICAmJiBmaXJzdF90aHVuayAhPSAwCi0JCSAgJiYgZmlyc3RfdGh1bmsgIT0gaGludF9hZGRyKQotCQlmcHJpbnRmIChmaWxlLCAiXHQlMDRseCIsCi0JCQkgYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGZpcnN0X3RodW5rICsgYWRqICsgaikpOwotCi0JICAgICAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgIT0gZmlyc3RfdGh1bmsgJiYgdGltZV9zdGFtcCA9PSAwKQotCXsKLQkgIGludCBkaWZmZXIgPSAwOwotCSAgaW50IGlkeDI7Ci0KLQkgIGlkeDIgPSBmaXJzdF90aHVuayArIGFkajsKLQotCSAgZm9yIChqPTA7ajxzdG9wO2orPTQpCi0JICAgIHsKLQkgICAgICBpbnQgb3JkaW5hbDsKLQkgICAgICBjaGFyICptZW1iZXJfbmFtZTsKLQkgICAgICBiZmRfdm1hIGhpbnRfbWVtYmVyID0gMDsKLQkgICAgICBiZmRfdm1hIGlhdF9tZW1iZXI7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyICE9IDApCi0JCWhpbnRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeCArIGopOwotCSAgICAgIGlhdF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4MiArIGopOwotCi0JICAgICAgaWYgKGhpbnRfYWRkciA9PSAwICYmIGlhdF9tZW1iZXIgPT0gMCkKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyID09IDAgfHwgaGludF9tZW1iZXIgIT0gaWF0X21lbWJlcikKLQkJewotCQkgIGlmIChkaWZmZXIgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZmlsZSwgCi0JCQkgICAgICAgXygiXHRUaGUgSW1wb3J0IEFkZHJlc3MgVGFibGUgKGRpZmZlcmVuY2UgZm91bmQpXG4iKSk7Ci0JCSAgICAgIGZwcmludGYoZmlsZSwgXygiXHR2bWE6ICBIaW50L09yZCBNZW1iZXItTmFtZVxuIikpOwotCQkgICAgICBkaWZmZXIgPSAxOwotCQkgICAgfQotCQkgIGlmIChpYXRfbWVtYmVyID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYoZmlsZSwKLQkJCSAgICAgIF8oIlx0Pj4+IFJhbiBvdXQgb2YgSUFUIG1lbWJlcnMhXG4iKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSAKLQkJICAgIHsKLQkJICAgICAgb3JkaW5hbCA9IGJmZF9nZXRfMTYoYWJmZCwKLQkJCQkJICAgZGF0YSArIGlhdF9tZW1iZXIgKyBhZGopOwotCQkgICAgICBtZW1iZXJfbmFtZSA9IChjaGFyICopIGRhdGEgKyBpYXRfbWVtYmVyICsgYWRqICsgMjsKLQkJICAgICAgZnByaW50ZihmaWxlLCAiXHQlMDRseFx0ICU0ZCAgJXNcbiIsCi0JCQkgICAgICBpYXRfbWVtYmVyLCBvcmRpbmFsLCBtZW1iZXJfbmFtZSk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCAmJiBoaW50X21lbWJlciA9PSAwKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKGRpZmZlciA9PSAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZihmaWxlLAotCQkgICAgICBfKCJcdFRoZSBJbXBvcnQgQWRkcmVzcyBUYWJsZSBpcyBpZGVudGljYWxcbiIpKTsKLQkgICAgfQotCX0KLQotICAgICAgZnByaW50ZihmaWxlLCAiXG4iKTsKLQotICAgIH0KLQotICBmcmVlIChkYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X2VkYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmVkYXRhIik7Ci0KLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhb2ZmOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgaW50IGFkajsKLSAgc3RydWN0IEVEVF90eXBlIAotICAgIHsKLSAgICAgIGxvbmcgZXhwb3J0X2ZsYWdzOyAgICAgICAgICAgICAvKiByZXNlcnZlZCAtIHNob3VsZCBiZSB6ZXJvICovCi0gICAgICBsb25nIHRpbWVfc3RhbXA7Ci0gICAgICBzaG9ydCBtYWpvcl92ZXI7Ci0gICAgICBzaG9ydCBtaW5vcl92ZXI7Ci0gICAgICBiZmRfdm1hIG5hbWU7ICAgICAgICAgICAgICAgICAgLyogcnZhIC0gcmVsYXRpdmUgdG8gaW1hZ2UgYmFzZSAqLwotICAgICAgbG9uZyBiYXNlOyAgICAgICAgICAgICAgICAgICAgIC8qIG9yZGluYWwgYmFzZSAqLwotICAgICAgdW5zaWduZWQgbG9uZyBudW1fZnVuY3Rpb25zOyAgIC8qIE51bWJlciBpbiB0aGUgZXhwb3J0IGFkZHJlc3MgdGFibGUgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX25hbWVzOyAgICAgICAvKiBOdW1iZXIgaW4gdGhlIG5hbWUgcG9pbnRlciB0YWJsZSAqLwotICAgICAgYmZkX3ZtYSBlYXRfYWRkcjsgICAgLyogcnZhIHRvIHRoZSBleHBvcnQgYWRkcmVzcyB0YWJsZSAqLwotICAgICAgYmZkX3ZtYSBucHRfYWRkcjsgICAgICAgIC8qIHJ2YSB0byB0aGUgRXhwb3J0IE5hbWUgUG9pbnRlciBUYWJsZSAqLwotICAgICAgYmZkX3ZtYSBvdF9hZGRyOyAvKiBydmEgdG8gdGhlIE9yZGluYWwgVGFibGUgKi8KLSAgICB9IGVkdDsKLQotICBwZV9kYXRhX3R5cGUgKnBlID0gcGVfZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICpleHRyYSA9ICZwZS0+cGVfb3B0aGRyOwotCi0gIGlmIChzZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgIGRhdGFvZmYgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkciwgc2l6ZTsKLQotICAgICAgYWRkciA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlZpcnR1YWxBZGRyZXNzOwotICAgICAgc2l6ZSA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlNpemU7Ci0KLSAgICAgIGlmIChhZGRyID09IDAgfHwgc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpZiAoc2VjdGlvbi0+dm1hIC0gZXh0cmEtPkltYWdlQmFzZSA8PSBhZGRyCi0JICAgICAgJiYgKChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlCi0JCSAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpCi0JCSAgPj0gYWRkciArIHNpemUpKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotCi0gICAgICBkYXRhc2l6ZSA9IHNpemU7Ci0gICAgICBkYXRhb2ZmID0gYWRkciAtIChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlKTsKLSAgICB9Ci0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChkYXRhc2l6ZSk7Ci0gIGlmIChkYXRhID09IE5VTEwgJiYgZGF0YXNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgZGF0YXNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHbyBnZXQgRXhwb3J0IERpcmVjdG9yeSBUYWJsZSAqLwotICBlZHQuZXhwb3J0X2ZsYWdzICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMCk7IAotICBlZHQudGltZV9zdGFtcCAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErNCk7Ci0gIGVkdC5tYWpvcl92ZXIgICAgICA9IGJmZF9nZXRfMTYoYWJmZCwgZGF0YSs4KTsKLSAgZWR0Lm1pbm9yX3ZlciAgICAgID0gYmZkX2dldF8xNihhYmZkLCBkYXRhKzEwKTsKLSAgZWR0Lm5hbWUgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzEyKTsKLSAgZWR0LmJhc2UgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzE2KTsKLSAgZWR0Lm51bV9mdW5jdGlvbnMgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzIwKTsgCi0gIGVkdC5udW1fbmFtZXMgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsyNCk7IAotICBlZHQuZWF0X2FkZHIgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMjgpOwotICBlZHQubnB0X2FkZHIgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMzIpOyAKLSAgZWR0Lm90X2FkZHIgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzM2KTsKLQotICBhZGogPSAoZXh0cmEtPkltYWdlQmFzZSAtIChzZWN0aW9uLT52bWEgKyBkYXRhb2ZmKSkgJiAweGZmZmZmZmZmOwotCi0KLSAgLyogRHVtcCB0aGUgRURUIGZpcnN0IGZpcnN0ICovCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuVGhlIEV4cG9ydCBUYWJsZXMgKGludGVycHJldGVkIC5lZGF0YSBzZWN0aW9uIGNvbnRlbnRzKVxuXG4iKSk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiRXhwb3J0IEZsYWdzIFx0XHRcdCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlZHQuZXhwb3J0X2ZsYWdzKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJUaW1lL0RhdGUgc3RhbXAgXHRcdCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlZHQudGltZV9zdGFtcCk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiTWFqb3IvTWlub3IgXHRcdFx0JWQvJWRcbiIpLCBlZHQubWFqb3JfdmVyLCBlZHQubWlub3JfdmVyKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIk5hbWUgXHRcdFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQubmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsCi0JICAgIiAlc1xuIiwgZGF0YSArIGVkdC5uYW1lICsgYWRqKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJPcmRpbmFsIEJhc2UgXHRcdFx0JWxkXG4iKSwgZWR0LmJhc2UpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIk51bWJlciBpbjpcbiIpKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQlbHhcbiIpLAotCSAgZWR0Lm51bV9mdW5jdGlvbnMpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlx0W05hbWUgUG9pbnRlci9PcmRpbmFsXSBUYWJsZVx0JWx1XG4iKSwgZWR0Lm51bV9uYW1lcyk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiVGFibGUgQWRkcmVzc2VzXG4iKSk7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQuZWF0X2FkZHIpOwotICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgXygiXHROYW1lIFBvaW50ZXIgVGFibGUgXHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5ucHRfYWRkcik7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiXHRPcmRpbmFsIFRhYmxlIFx0XHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5vdF9hZGRyKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgCi0gIC8qIFRoZSBuZXh0IHRhYmxlIHRvIGZpbmQgc2kgdGhlIEV4cG9ydCBBZGRyZXNzIFRhYmxlLiBJdCdzIGJhc2ljYWxseQotICAgICBhIGxpc3Qgb2YgcG9pbnRlcnMgdGhhdCBlaXRoZXIgbG9jYXRlIGEgZnVuY3Rpb24gaW4gdGhpcyBkbGwsIG9yCi0gICAgIGZvcndhcmQgdGhlIGNhbGwgdG8gYW5vdGhlciBkbGwuIFNvbWV0aGluZyBsaWtlOgotICAgICAgdHlwZWRlZiB1bmlvbiAKLSAgICAgIHsKLSAgICAgICAgbG9uZyBleHBvcnRfcnZhOwotICAgICAgICBsb25nIGZvcndhcmRlcl9ydmE7Ci0gICAgICB9IGV4cG9ydF9hZGRyZXNzX3RhYmxlX2VudHJ5OwotICAqLwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuRXhwb3J0IEFkZHJlc3MgVGFibGUgLS0gT3JkaW5hbCBCYXNlICVsZFxuIiksCi0JICBlZHQuYmFzZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGVkdC5udW1fZnVuY3Rpb25zOyArK2kpCi0gICAgewotICAgICAgYmZkX3ZtYSBlYXRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgCi0JCQkJICAgICAgIGRhdGEgKyBlZHQuZWF0X2FkZHIgKyAoaSAqIDQpICsgYWRqKTsKLSAgICAgIGJmZF92bWEgZWF0X2FjdHVhbCA9IChleHRyYS0+SW1hZ2VCYXNlICsgZWF0X21lbWJlcikgJiAweGZmZmZmZmZmOwotICAgICAgYmZkX3ZtYSBlZGF0YV9zdGFydCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsc2VjdGlvbikgKyBkYXRhb2ZmOwotICAgICAgYmZkX3ZtYSBlZGF0YV9lbmQgPSBlZGF0YV9zdGFydCArIGRhdGFzaXplOwotCi0gICAgICBpZiAoZWF0X21lbWJlciA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZWRhdGFfc3RhcnQgPCBlYXRfYWN0dWFsICYmIGVhdF9hY3R1YWwgPCBlZGF0YV9lbmQpIAotCXsKLQkgIC8qIHRoaXMgcnZhIGlzIHRvIGEgbmFtZSAoZm9yd2FyZGluZyBmdW5jdGlvbikgaW4gb3VyIHNlY3Rpb24gKi8KLQkgIC8qIFNob3VsZCBsb2NhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yICovCi0JICBmcHJpbnRmKGZpbGUsCi0JCSAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzIC0tICVzXG4iLCAKLQkJICAobG9uZykgaSwgKGxvbmcpIChpICsgZWR0LmJhc2UpLCBlYXRfbWVtYmVyLAotCQkgICJGb3J3YXJkZXIgUlZBIiwgZGF0YSArIGVhdF9tZW1iZXIgKyBhZGopOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBTaG91bGQgbG9jYXRlIGEgZnVuY3Rpb24gZGVzY3JpcHRvciBpbiB0aGUgcmVsZGF0YSBzZWN0aW9uICovCi0JICBmcHJpbnRmKGZpbGUsCi0JCSAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzXG4iLCAKLQkJICAobG9uZykgaSwgKGxvbmcpIChpICsgZWR0LmJhc2UpLCBlYXRfbWVtYmVyLCAiRXhwb3J0IFJWQSIpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGUgaXMgcGFpcmVkIHdpdGggdGhlIEV4cG9ydCBPcmRpbmFsIFRhYmxlICovCi0gIC8qIER1bXAgdGhlbSBpbiBwYXJhbGxlbCBmb3IgY2xhcml0eSAqLwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcbltPcmRpbmFsL05hbWUgUG9pbnRlcl0gVGFibGVcbiIpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZWR0Lm51bV9uYW1lczsgKytpKQotICAgIHsKLSAgICAgIGJmZF92bWEgbmFtZV9wdHIgPSBiZmRfZ2V0XzMyKGFiZmQsIAotCQkJCSAgICBkYXRhICsgCi0JCQkJICAgIGVkdC5ucHRfYWRkcgotCQkJCSAgICArIChpKjQpICsgYWRqKTsKLSAgICAgIAotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIGRhdGEgKyBuYW1lX3B0ciArIGFkajsKLQotICAgICAgYmZkX3ZtYSBvcmQgPSBiZmRfZ2V0XzE2KGFiZmQsIAotCQkJCSAgICBkYXRhICsgCi0JCQkJICAgIGVkdC5vdF9hZGRyCi0JCQkJICAgICsgKGkqMikgKyBhZGopOwotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgICJcdFslNGxkXSAlc1xuIiwgKGxvbmcpIG9yZCwgbmFtZSk7Ci0KLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9wZGF0YSAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucGRhdGEiKTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLSAgaW50IG9uYWxpbmUgPSAyMDsKLQotICBpZiAoc2VjdGlvbiA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKChzdG9wICUgb25hbGluZSkgIT0gMCkKLSAgICBmcHJpbnRmIChmaWxlLCBfKCJXYXJuaW5nLCAucGRhdGEgc2VjdGlvbiBzaXplICglbGQpIGlzIG5vdCBhIG11bHRpcGxlIG9mICVkXG4iKSwKLQkgICAgIChsb25nKXN0b3AsIG9uYWxpbmUpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuVGhlIEZ1bmN0aW9uIFRhYmxlIChpbnRlcnByZXRlZCAucGRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIpKTsKLSAgZnByaW50ZihmaWxlLAotCSAgXygiIHZtYTpcdFx0QmVnaW4gICAgRW5kICAgICAgRUggICAgICAgRUggICAgICAgUHJvbG9nRW5kXG4iKSk7Ci0gIGZwcmludGYoZmlsZSwKLQkgIF8oIiAgICAgXHRcdEFkZHJlc3MgIEFkZHJlc3MgIEhhbmRsZXIgIERhdGEgICAgIEFkZHJlc3NcbiIpKTsKLQotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCAmJiBkYXRhc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIAotCQkJICAgIHNlY3Rpb24sIAotCQkJICAgIChQVFIpIGRhdGEsIDAsIAotCQkJICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLQotICBzdGFydCA9IDA7Ci0KLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCi0gICAgewotICAgICAgYmZkX3ZtYSBiZWdpbl9hZGRyOwotICAgICAgYmZkX3ZtYSBlbmRfYWRkcjsKLSAgICAgIGJmZF92bWEgZWhfaGFuZGxlcjsKLSAgICAgIGJmZF92bWEgZWhfZGF0YTsKLSAgICAgIGJmZF92bWEgcHJvbG9nX2VuZF9hZGRyOwotCi0gICAgICBpZiAoaSsyMCA+IHN0b3ApCi0JICBicmVhazsKLSAgICAgIAotICAgICAgYmVnaW5fYWRkciA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKTsKLSAgICAgIGVuZF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krNCk7Ci0gICAgICBlaF9oYW5kbGVyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krOCk7Ci0gICAgICBlaF9kYXRhID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTIpOwotICAgICAgcHJvbG9nX2VuZF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTYpOwotICAgICAgCi0gICAgICBpZiAoYmVnaW5fYWRkciA9PSAwICYmIGVuZF9hZGRyID09IDAgJiYgZWhfaGFuZGxlciA9PSAwCi0JICAmJiBlaF9kYXRhID09IDAgJiYgcHJvbG9nX2VuZF9hZGRyID09IDApCi0JewotCSAgLyogV2UgYXJlIHByb2JhYmx5IGludG8gdGhlIHBhZGRpbmcgb2YgdGhlCi0JICAgICBzZWN0aW9uIG5vdyAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICAiICUwOGx4XHQiLCAKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSkpOwotCi0gICAgICBmcHJpbnRmKGZpbGUsICIlMDhseCAlMDhseCAlMDhseCAlMDhseCAlMDhseCIsCi0JICAgICAgYmVnaW5fYWRkciwKLQkgICAgICBlbmRfYWRkciwKLQkgICAgICBlaF9oYW5kbGVyLAotCSAgICAgIGVoX2RhdGEsCi0JICAgICAgcHJvbG9nX2VuZF9hZGRyKTsKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgICAgIGlmIChlaF9oYW5kbGVyID09IDAgJiYgZWhfZGF0YSAhPSAwKQotCXsKLQkgIC8qIFNwZWNpYWwgYml0cyBoZXJlLCBhbHRob3VnaCB0aGUgbWVhbmluZyBtYXkgKi8KLQkgIC8qIGJlIGEgbGl0dGxlIG15c3RlcmlvdXMuIFRoZSBvbmx5IG9uZSBJIGtub3cgKi8KLQkgIC8qIGZvciBzdXJlIGlzIDB4MDMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIENvZGUgU2lnbmlmaWNhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDEgUmVnaXN0ZXIgU2F2ZSBNaWxsaWNvZGUgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDIgUmVnaXN0ZXIgUmVzdG9yZSBNaWxsaWNvZGUgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDMgR2x1ZSBDb2RlIFNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIHN3aXRjaCAoZWhfZGF0YSkKLQkgICAgewotCSAgICBjYXNlIDB4MDE6Ci0JICAgICAgZnByaW50ZihmaWxlLCBfKCIgUmVnaXN0ZXIgc2F2ZSBtaWxsaWNvZGUiKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHgwMjoKLQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIiBSZWdpc3RlciByZXN0b3JlIG1pbGxpY29kZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDAzOgotCSAgICAgIGZwcmludGYoZmlsZSwgXygiIEdsdWUgY29kZSBzZXF1ZW5jZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSNlbmRpZgkgICAKLSAgICAgIGZwcmludGYoZmlsZSwgIlxuIik7Ci0gICAgfQotCi0gIGZyZWUgKGRhdGEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdGJsWzZdID0KLXsKLSJBQlNPTFVURSIsCi0iSElHSCIsCi0iTE9XIiwKLSJISUdITE9XIiwKLSJISUdIQURKIiwKLSJNSVBTX0pNUEFERFIiCi19OwotCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfcmVsb2MgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsb2MiKTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLQotICBpZiAoc2VjdGlvbiA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuXG5QRSBGaWxlIEJhc2UgUmVsb2NhdGlvbnMgKGludGVycHJldGVkIC5yZWxvYyBzZWN0aW9uIGNvbnRlbnRzKVxuIikpOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgCi0JCQkgICAgc2VjdGlvbiwgCi0JCQkgICAgKFBUUikgZGF0YSwgMCwgCi0JCQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0gIHN0YXJ0ID0gMDsKLQotICBzdG9wID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0KLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOykKLSAgICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGJmZF92bWEgdmlydHVhbF9hZGRyZXNzOwotICAgICAgbG9uZyBudW1iZXIsIHNpemU7Ci0KLSAgICAgIC8qIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBhIHNlcXVlbmNlIG9mIGJsb2Nrcywgd2l0aCBhIGhlYWRlciBjb25zaXN0aW5nCi0JIG9mIHR3byAzMiBiaXQgcXVhbnRpdGllcywgZm9sbG93ZWQgYnkgYSBudW1iZXIgb2YgMTYgYml0IGVudHJpZXMgKi8KLQotICAgICAgdmlydHVhbF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOwotICAgICAgc2l6ZSA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOwotICAgICAgbnVtYmVyID0gKHNpemUgLSA4KSAvIDI7Ci0KLSAgICAgIGlmIChzaXplID09IDApIAotCXsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgXygiXG5WaXJ0dWFsIEFkZHJlc3M6ICUwOGx4IENodW5rIHNpemUgJWxkICgweCVseCkgTnVtYmVyIG9mIGZpeHVwcyAlbGRcbiIpLAotCSAgICAgICB2aXJ0dWFsX2FkZHJlc3MsIHNpemUsIHNpemUsIG51bWJlcik7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXI7ICsraikKLQl7Ci0JICB1bnNpZ25lZCBzaG9ydCBlID0gYmZkX2dldF8xNihhYmZkLCBkYXRhICsgaSArIDggKyBqKjIpOwotCSAgaW50IHQgPSAgIChlICYgMHhGMDAwKSA+PiAxMjsKLQkgIGludCBvZmYgPSBlICYgMHgwRkZGOwotCi0JICBpZiAodCA+IDUpIAotCSAgICBhYm9ydCgpOwotCi0JICBmcHJpbnRmKGZpbGUsCi0JCSAgXygiXHRyZWxvYyAlNGQgb2Zmc2V0ICU0eCBbJTRseF0gJXNcbiIpLCAKLQkJICBqLCBvZmYsIChsb25nKSAob2ZmICsgdmlydHVhbF9hZGRyZXNzKSwgdGJsW3RdKTsKLQkgIAotCX0KLSAgICAgIGkgKz0gc2l6ZTsKLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgaW50IGo7Ci0gIHBlX2RhdGFfdHlwZSAqcGUgPSBwZV9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmkgPSAmcGUtPnBlX29wdGhkcjsKLQotICAvKiBUaGUgTVMgZHVtcGJpbiBwcm9ncmFtIHJlcG9ydGVkbHkgYW5kcyB3aXRoIDB4ZmYwZiBiZWZvcmUKLSAgICAgcHJpbnRpbmcgdGhlIGNoYXJhY3RlcmlzdGljcyBmaWVsZC4gIE5vdCBzdXJlIHdoeS4gIE5vIHJlYXNvbiB0bwotICAgICBlbXVsYXRlIGl0IGhlcmUuICAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJcbkNoYXJhY3RlcmlzdGljcyAweCV4XG4iKSwgcGUtPnJlYWxfZmxhZ3MpOwotI3VuZGVmIFBGCi0jZGVmaW5lIFBGKHgsIHkpICAgIGlmIChwZS0+cmVhbF9mbGFncyAmIHgpIHsgZnByaW50ZiAoZmlsZSwgIlx0JXNcbiIsIHkpOyB9Ci0gIFBGIChGX1JFTEZMRywgInJlbG9jYXRpb25zIHN0cmlwcGVkIik7Ci0gIFBGIChGX0VYRUMsICJleGVjdXRhYmxlIik7Ci0gIFBGIChGX0xOTk8sICJsaW5lIG51bWJlcnMgc3RyaXBwZWQiKTsKLSAgUEYgKEZfTFNZTVMsICJzeW1ib2xzIHN0cmlwcGVkIik7Ci0gIFBGICgweDgwLCAibGl0dGxlIGVuZGlhbiIpOwotICBQRiAoRl9BUjMyV1IsICIzMiBiaXQgd29yZHMiKTsKLSAgUEYgKDB4MjAwLCAiZGVidWdnaW5nIGluZm9ybWF0aW9uIHJlbW92ZWQiKTsKLSAgUEYgKDB4MTAwMCwgInN5c3RlbSBmaWxlIik7Ci0gIFBGIChGX0RMTCwgIkRMTCIpOwotICBQRiAoMHg4MDAwLCAiYmlnIGVuZGlhbiIpOwotI3VuZGVmIFBGCi0KLSAgZnByaW50ZiAoZmlsZSwiXG5JbWFnZUJhc2VcdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5JbWFnZUJhc2UpOwotICBmcHJpbnRmIChmaWxlLCJcblNlY3Rpb25BbGlnbm1lbnRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuRmlsZUFsaWdubWVudFx0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPkZpbGVBbGlnbm1lbnQpOwotICBmcHJpbnRmIChmaWxlLCJcbk1ham9yT1N5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNaW5vck9TeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWFqb3JJbWFnZVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvckltYWdlVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1pbm9ySW1hZ2VWZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JJbWFnZVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNYWpvclN1YnN5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNaW5vclN1YnN5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NaW5vclN1YnN5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJSZXNlcnZlZDFcdFx0JTA4bHhcbiIsIGktPlJlc2VydmVkMSk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZkltYWdlXHRcdCUwOGx4XG4iLCBpLT5TaXplT2ZJbWFnZSk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZkhlYWRlcnNcdFx0JTA4bHhcbiIsIGktPlNpemVPZkhlYWRlcnMpOwotICBmcHJpbnRmIChmaWxlLCJDaGVja1N1bVx0XHQlMDhseFxuIiwgaS0+Q2hlY2tTdW0pOwotICBmcHJpbnRmIChmaWxlLCJTdWJzeXN0ZW1cdFx0JTA4eFxuIiwgaS0+U3Vic3lzdGVtKTsKLSAgZnByaW50ZiAoZmlsZSwiRGxsQ2hhcmFjdGVyaXN0aWNzXHQlMDh4XG4iLCBpLT5EbGxDaGFyYWN0ZXJpc3RpY3MpOwotICBmcHJpbnRmIChmaWxlLCJTaXplT2ZTdGFja1Jlc2VydmVcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TaXplT2ZTdGFja0NvbW1pdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZTdGFja0NvbW1pdCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2l6ZU9mSGVhcFJlc2VydmVcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mSGVhcFJlc2VydmUpOwotICBmcHJpbnRmIChmaWxlLCJcblNpemVPZkhlYXBDb21taXRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mSGVhcENvbW1pdCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuTG9hZGVyRmxhZ3NcdFx0JTA4bHhcbiIsIGktPkxvYWRlckZsYWdzKTsKLSAgZnByaW50ZiAoZmlsZSwiTnVtYmVyT2ZSdmFBbmRTaXplc1x0JTA4bHhcbiIsIGktPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotCi0gIGZwcmludGYgKGZpbGUsIlxuVGhlIERhdGEgRGlyZWN0b3J5XG4iKTsKLSAgZm9yIChqID0gMDsgaiA8IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOyBqKyspIAotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICJFbnRyeSAlMXggIiwgaik7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+RGF0YURpcmVjdG9yeVtqXS5WaXJ0dWFsQWRkcmVzcyk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUwOGx4ICIsIGktPkRhdGFEaXJlY3Rvcnlbal0uU2l6ZSk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXNcbiIsIGRpcl9uYW1lc1tqXSk7Ci0gICAgfQotCi0gIHBlX3ByaW50X2lkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X2VkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X3BkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X3JlbG9jIChhYmZkLCB2ZmlsZSk7Ci0KLSAgaWYgKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0gIAotICAgICAgcmV0dXJuIHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHZmaWxlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgcGVfZGF0YV90eXBlICpwZTsKLSAgYWJmZC0+dGRhdGEucGVfb2JqX2RhdGEgPSAKLSAgICAoc3RydWN0IHBlX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAocGVfZGF0YV90eXBlKSk7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLnBlX29ial9kYXRhID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBlID0gcGVfZGF0YSAoYWJmZCk7Ci0KLSAgcGUtPmNvZmYucGUgPSAxOwotICBwZS0+aW5fcmVsb2NfcCA9IGluX3JlbG9jX3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIENPRkYgYmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi1zdGF0aWMgUFRSCi1wZV9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKiBhYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHBlX2RhdGFfdHlwZSAqcGU7Ci0KLSAgaWYgKHBlX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBwZS0+Y29mZi5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbAotICAgICB0YWJsZSB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycKLSAgICAgdW5mb3J0dW5hdGVseSB2YXJ5IGFtb25nIGNvZmYgaW1wbGVtZW50YXRpb25zLi4uICAqLwotICBwZS0+Y29mZi5sb2NhbF9uX2J0bWFzayA9IE5fQlRNQVNLOwotICBwZS0+Y29mZi5sb2NhbF9uX2J0c2hmdCA9IE5fQlRTSEZUOwotICBwZS0+Y29mZi5sb2NhbF9uX3RtYXNrID0gTl9UTUFTSzsKLSAgcGUtPmNvZmYubG9jYWxfbl90c2hpZnQgPSBOX1RTSElGVDsKLSAgcGUtPmNvZmYubG9jYWxfc3ltZXN6ID0gU1lNRVNaOwotICBwZS0+Y29mZi5sb2NhbF9hdXhlc3ogPSBBVVhFU1o7Ci0gIHBlLT5jb2ZmLmxvY2FsX2xpbmVzeiA9IExJTkVTWjsKLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPQotICAgIG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpID0KLSAgICAgIGludGVybmFsX2YtPmZfbnN5bXM7Ci0KLSAgcGUtPnJlYWxfZmxhZ3MgPSBpbnRlcm5hbF9mLT5mX2ZsYWdzOwotCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRExMKSAhPSAwKQotICAgIHBlLT5kbGwgPSAxOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIGlmIChhb3V0aGRyKSAKLSAgICBwZS0+cGVfb3B0aGRyID0gKChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHIpLT5wZTsKLSNlbmRpZgotCi0jaWZkZWYgQVJNIAotICBpZiAoISBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBpbnRlcm5hbF9mLT5mX2ZsYWdzKSkKLSAgICBjb2ZmX2RhdGEgKGFiZmQpIC0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gIAotICByZXR1cm4gKFBUUikgcGU7Ci19Ci0KLQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKLSAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQotI2lmZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpCi0gICAgID0gY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2Vsc2UKLXN0YXRpYyBib29sZWFuICgqcGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKQotICAgICBQQVJBTVMgKChiZmQgKiwgYmZkICopKQotICAgICA9IE5VTEw7Ci0jZW5kaWYKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLQotc3RhdGljIGJvb2xlYW4KLXBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIHBlX2RhdGEgKG9iZmQpLT5wZV9vcHRoZHIgPSBwZV9kYXRhIChpYmZkKS0+cGVfb3B0aGRyOwotICBwZV9kYXRhIChvYmZkKS0+ZGxsID0gcGVfZGF0YSAoaWJmZCktPmRsbDsKLQotICBpZiAocGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKQotICAgIHJldHVybiBwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi1zdGF0aWMgYm9vbGVhbiBwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKLQotc3RhdGljIGJvb2xlYW4KLXBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpICE9IE5VTEwKLSAgICAgICYmIHBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKSA9PSBOVUxMKQotCXsKLQkgIG9zZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAob3NlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKSA9PSBOVUxMKQotCXsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dGRhdGEgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT52aXJ0X3NpemUgPQotCXBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpLT52aXJ0X3NpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9wby9NYWtlLWluIGIvYmZkL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL3BvL1BPVEZJTEVTLmluIGIvYmZkL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDhmOTg3Li4wMDAwMDAwCi0tLSBhL2JmZC9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi1haXgzODYtY29yZS5jCi1hb3V0LWFkb2JlLmMKLWFvdXQtYXJtLmMKLWFvdXQtbnMzMmsuYwotYW91dC1zcGFyY2xlLmMKLWFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAuYwotYW91dDAuYwotYW91dDMyLmMKLWFvdXQ2NC5jCi1hb3V0ZjEuaAotYW91dHguaAotYXJjaGl2ZS5jCi1hcmNodXJlcy5jCi1iZmQuYwotYmluYXJ5LmMKLWJvdXQuYwotY2FjaGUuYwotY2YtaTM4Nmx5bnguYwotY2YtbTY4a2x5bnguYwotY2Ytc3BhcmNseW54LmMKLWNpc2NvLWNvcmUuYwotY29mZi1hMjlrLmMKLWNvZmYtYWxwaGEuYwotY29mZi1hcG9sbG8uYwotY29mZi1hcm0uYwotY29mZi1hdXguYwotY29mZi1nbzMyLmMKLWNvZmYtaDgzMDAuYwotY29mZi1oODUwMC5jCi1jb2ZmLWkzODYuYwotY29mZi1pODYwLmMKLWNvZmYtaTk2MC5jCi1jb2ZmLW02OGsuYwotY29mZi1tODhrLmMKLWNvZmYtbWlwcy5jCi1jb2ZmLXBtYWMuYwotY29mZi1yczYwMDAuYwotY29mZi1zaC5jCi1jb2ZmLXNwYXJjLmMKLWNvZmYtc3RnbzMyLmMKLWNvZmYtc3ZtNjhrLmMKLWNvZmYtdGljMzAuYwotY29mZi10aWM4MC5jCi1jb2ZmLXU2OGsuYwotY29mZi13NjUuYwotY29mZi13ZTMyay5jCi1jb2ZmLXo4ay5jCi1jb2ZmY29kZS5oCi1jb2ZmZ2VuLmMKLWNvZmZsaW5rLmMKLWNvZmZzd2FwLmgKLWNvcmVmaWxlLmMKLWNwdS1hMjlrLmMKLWNwdS1hbHBoYS5jCi1jcHUtYXJjLmMKLWNwdS1hcm0uYwotY3B1LWQxMHYuYwotY3B1LWQzMHYuYwotY3B1LWZyMzAuYwotY3B1LWg4MzAwLmMKLWNwdS1oODUwMC5jCi1jcHUtaHBwYS5jCi1jcHUtaTM4Ni5jCi1jcHUtaTg2MC5jCi1jcHUtaTk2MC5jCi1jcHUtbTEwMjAwLmMKLWNwdS1tMTAzMDAuYwotY3B1LW0zMnIuYwotY3B1LW02OGsuYwotY3B1LW04OGsuYwotY3B1LW1jb3JlLmMKLWNwdS1taXBzLmMKLWNwdS1uczMyay5jCi1jcHUtcG93ZXJwYy5jCi1jcHUtcnM2MDAwLmMKLWNwdS1zaC5jCi1jcHUtc3BhcmMuYwotY3B1LXRpYzMwLmMKLWNwdS10aWM4MC5jCi1jcHUtdjg1MC5jCi1jcHUtdmF4LmMKLWNwdS13NjUuYwotY3B1LXdlMzJrLmMKLWNwdS16OGsuYwotZGVtbzY0LmMKLWR3YXJmMi5jCi1lY29mZi5jCi1lY29mZmxpbmsuYwotZWNvZmZzd2FwLmgKLWVsZi1iZmQuaAotZWxmLW0xMDIwMC5jCi1lbGYtbTEwMzAwLmMKLWVsZi5jCi1lbGYzMi1hcmMuYwotZWxmMzItZDEwdi5jCi1lbGYzMi1kMzB2LmMKLWVsZjMyLWZyMzAuYwotZWxmMzItZ2VuLmMKLWVsZjMyLWhwcGEuYwotZWxmMzItaHBwYS5oCi1lbGYzMi1pMzg2LmMKLWVsZjMyLWk4NjAuYwotZWxmMzItaTk2MC5jCi1lbGYzMi1tMzJyLmMKLWVsZjMyLW02OGsuYwotZWxmMzItbTg4ay5jCi1lbGYzMi1tY29yZS5jCi1lbGYzMi1taXBzLmMKLWVsZjMyLXBwYy5jCi1lbGYzMi1zaC5jCi1lbGYzMi1zcGFyYy5jCi1lbGYzMi12ODUwLmMKLWVsZjMyLmMKLWVsZjY0LWFscGhhLmMKLWVsZjY0LWdlbi5jCi1lbGY2NC1taXBzLmMKLWVsZjY0LXNwYXJjLmMKLWVsZjY0LmMKLWVsZmFybS1uYWJpLmMKLWVsZmFybS1vYWJpLmMKLWVsZmNvZGUuaAotZWxmbGluay5jCi1mb3JtYXQuYwotZ2VubGluay5oCi1nbzMyc3R1Yi5oCi1oYXNoLmMKLWhwMzAwYnNkLmMKLWhwMzAwaHB1eC5jCi1ocHBhX3N0dWJzLmgKLWhwdXgtY29yZS5jCi1pMzg2YW91dC5jCi1pMzg2YnNkLmMKLWkzODZkeW5peC5jCi1pMzg2ZnJlZWJzZC5jCi1pMzg2bGludXguYwotaTM4Nmx5bnguYwotaTM4Nm1hY2gzLmMKLWkzODZtc2Rvcy5jCi1pMzg2bmV0YnNkLmMKLWkzODZvczlrLmMKLWllZWUuYwotaWhleC5jCi1pbml0LmMKLWlyaXgtY29yZS5jCi1saWJhb3V0LmgKLWxpYmJmZC5jCi1saWJiZmQuaAotbGliY29mZi5oCi1saWJlY29mZi5oCi1saWJocHBhLmgKLWxpYmllZWUuaAotbGlibmxtLmgKLWxpYm9hc3lzLmgKLWxpbmtlci5jCi1seW54LWNvcmUuYwotbTY4azRrbmV0YnNkLmMKLW02OGtsaW51eC5jCi1tNjhrbHlueC5jCi1tNjhrbmV0YnNkLmMKLW04OGttYWNoMy5jCi1taXBzYnNkLmMKLW5ldGJzZC5oCi1uZXdzb3MzLmMKLW5sbS10YXJnZXQuaAotbmxtLmMKLW5sbTMyLWFscGhhLmMKLW5sbTMyLWkzODYuYwotbmxtMzItcHBjLmMKLW5sbTMyLXNwYXJjLmMKLW5sbTMyLmMKLW5sbTY0LmMKLW5sbWNvZGUuaAotbnMzMmsuaAotbnMzMmtuZXRic2QuYwotb2FzeXMuYwotb3BuY2xzLmMKLW9zZi1jb3JlLmMKLXBjNTMyLW1hY2guYwotcGUtYXJtLmMKLXBlLWkzODYuYwotcGUtbWNvcmUuYwotcGUtcHBjLmMKLXBlaS1hcm0uYwotcGVpLWkzODYuYwotcGVpLW1jb3JlLmMKLXBlaS1wcGMuYwotcHBjYm9vdC5jCi1yZWxvYy5jCi1yZWxvYzE2LmMKLXJpc2NpeC5jCi1zY281LWNvcmUuYwotc2VjdGlvbi5jCi1zb20uYwotc29tLmgKLXNwYXJjbGludXguYwotc3BhcmNseW54LmMKLXNwYXJjbmV0YnNkLmMKLXNyZWMuYwotc3RhYi1zeW1zLmMKLXN0YWJzLmMKLXN1bm9zLmMKLXN5bXMuYwotdGFyZ2V0cy5jCi10ZWtoZXguYwotdHJhZC1jb3JlLmMKLXZheG5ldGJzZC5jCi12ZXJzYWRvcy5jCi12bXMtZ3NkLmMKLXZtcy1oZHIuYwotdm1zLW1pc2MuYwotdm1zLXRpci5jCi12bXMuYwotdm1zLmgKLXhjb2ZmbGluay5jCmRpZmYgLS1naXQgYS9iZmQvcG8vYmZkLnBvdCBiL2JmZC9wby9iZmQucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNkYTE5Li4wMDAwMDAwCi0tLSBhL2JmZC9wby9iZmQucG90CisrKyAvZGV2L251bGwKQEAgLTEsMTQ4OSArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wNi0wMyAwMjo1NS0wNzAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogYW91dC1hZG9iZS5jOjE4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5rbm93biBzZWN0aW9uIHR5cGUgaW4gYS5vdXQuYWRvYmUgZmlsZTogJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjEyMzcgYW91dHguaDoxNjUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTYyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gZm9yIHN5bWJvbCBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjE2MjMKLW1zZ2lkICIqdW5rbm93bioiCi1tc2dzdHIgIiIKLQotIzogYW91dHguaDozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWxvY2F0ZWFibGUgbGluayBmcm9tICVzIHRvICVzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXJjaGl2ZS5jOjE3MjQKLW1zZ2lkICJXYXJuaW5nOiB3cml0aW5nIGFyY2hpdmUgd2FzIHNsb3c6IHJld3JpdGluZyB0aW1lc3RhbXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcmNoaXZlLmM6MTk5MAotbXNnaWQgIlJlYWRpbmcgYXJjaGl2ZSBmaWxlIG1vZCB0aW1lc3RhbXAiCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IGJmZCBjYW4ndCBjYWxsIHBlcnJvci4KLSM6IGFyY2hpdmUuYzoyMDE0Ci1tc2dpZCAiV3JpdGluZyB1cGRhdGVkIGFybWFwIHRpbWVzdGFtcCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzQKLW1zZ2lkICJObyBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzUKLW1zZ2lkICJTeXN0ZW0gY2FsbCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzYKLW1zZ2lkICJJbnZhbGlkIGJmZCB0YXJnZXQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc3Ci1tc2dpZCAiRmlsZSBpbiB3cm9uZyBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc4Ci1tc2dpZCAiSW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc5Ci1tc2dpZCAiTWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODAKLW1zZ2lkICJObyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MQotbXNnaWQgIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjgyCi1tc2dpZCAiTm8gbW9yZSBhcmNoaXZlZCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODMKLW1zZ2lkICJNYWxmb3JtZWQgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODQKLW1zZ2lkICJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODUKLW1zZ2lkICJGaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjg2Ci1tc2dpZCAiU2VjdGlvbiBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjg3Ci1tc2dpZCAiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODgKLW1zZ2lkICJTeW1ib2wgbmVlZHMgZGVidWcgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODkKLW1zZ2lkICJCYWQgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkwCi1tc2dpZCAiRmlsZSB0cnVuY2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkxCi1tc2dpZCAiRmlsZSB0b28gYmlnIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI5MgotbXNnaWQgIiM8SW52YWxpZCBlcnJvciBjb2RlPiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzo2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkIGFzc2VydGlvbiBmYWlsICVzOiVkIgotbXNnc3RyICIiCi0KLSM6IGJpbmFyeS5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBXcml0aW5nIHNlY3Rpb24gYCVzJyB0byBodWdlIChpZSBuZWdhdGl2ZSkgZmlsZSBvZmZzZXQgMHglbHguIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjEyMQotbXNnaWQgIk1pc3NpbmcgSUhDT05TVCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzoxODEKLW1zZ2lkICJNaXNzaW5nIElISUhBTEYiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hMjlrLmM6MjEzCi1tc2dpZCAiVW5yZWNvZ25pemVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjQwNgotbXNnaWQgIm1pc3NpbmcgSUhDT05TVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzo0OTcKLW1zZ2lkICJtaXNzaW5nIElISUhBTEYgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjg4MCBjb2ZmLWFscGhhLmM6OTE3Ci1tc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjE0ODYgZWxmNjQtYWxwaGEuYzo0MDUxCi1tc2dpZCAidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYWxwaGEuYzoxOTkyIGNvZmYtbWlwcy5jOjE0MzUgZWxmMzItbWlwcy5jOjQ5MjQKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzo4ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBmaW5kIFRIVU1CIGdsdWUgJyVzJyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjkxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjExODggY29mZi1hcm0uYzoxMjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjExOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxMjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTI4OQotbXNnaWQgIiAgY29uc2lkZXIgcmVsaW5raW5nIHdpdGggLS1zdXBwb3J0LW9sZC1jb2RlIGVuYWJsZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxNTc1IGNvZmYtdGljODAuYzo2ODIgY29mZmxpbmsuYzoyNzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBFUlJPUjogY29tcGlsZWQgZm9yIEFQQ1MtJWQgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBBUENTLSVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjA1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGZsb2F0IHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGludGVnZXIgIgotInJlZ2lzdGVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGZsb2F0ICIKLSJyZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogRVJST1I6IGNvbXBpbGVkIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzICIKLSJhYnNvbHV0ZSBwb3NpdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgYWJzb2x1dGUgcG9zaXRpb24gY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgcG9zaXRpb24gIgotImluZGVwZW5kZW50IgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIHN1cHBvcnRzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzIG5vdC4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcy4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAleDoiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQwCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGZsb2F0IHJlZ2lzdGVyc10iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQyCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDUKLW1zZ2lkICIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDcKLW1zZ2lkICIgW2Fic29sdXRlIHBvc2l0aW9uXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTEKLW1zZ2lkICIgW2ludGVyd29ya2luZyBmbGFnIG5vdCBpbml0aWFsaXNlZF0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTUzCi1tc2dpZCAiIFtpbnRlcndvcmtpbmcgc3VwcG9ydGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTUKLW1zZ2lkICIgW2ludGVyd29ya2luZyBub3Qgc3VwcG9ydGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIldhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29ya2luZyBmbGFnIG9mICVzLCBzaW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuICIKLSJzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiCi1tc2dzdHIgIiIKLQotIzogY29mZi1pOTYwLmM6MTM1IGNvZmYtaTk2MC5jOjQ4NAotbXNnaWQgInVuY2VydGFpbiBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIG5vbi1DT0ZGIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLW1pcHMuYzo4NzUgZWxmMzItbWlwcy5jOjExMzYKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gX2dwIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjI0MzMKLW1zZ2lkICJ1bnN1cHBvcnRlZCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSMuIE5vIG90aGVyIHNlY3Rpb25zIHNob3VsZCBhcHBlYXIgaW4gLW1lbWJlZGRlZC1waWMKLSMuIGNvZGUuCi0jOiBjb2ZmLW1pcHMuYzoyNDcwCi1tc2dpZCAicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjI0NzgKLW1zZ2lkICJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLXRpYzgwLmM6NDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCByZWxvYyB0eXBlIDB4JXgiCi1tc2dzdHIgIiIKLQotIzogY29mZi13NjUuYzozODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgcmVsb2MgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjM0NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiBsaW5lIG51bWJlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozNDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBkdXBsaWNhdGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozNzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbnJlY29nbml6ZWQgc3RvcmFnZSBjbGFzcyAlZCBmb3IgJXMgc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozOTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6NDAwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZ2VuLmM6MTYwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIHN0cmluZyB0YWJsZSBzaXplICVsdSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjIwOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jcyBpbiBzZWN0aW9uIGAlcycsIGJ1dCBpdCBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogY29mZnN3YXAuaDo4ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6ICVzOiBsaW5lIG51bWJlciBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogY29mZnN3YXAuaDo5MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6NDIwCi1tc2dpZCAiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEFiYnJldiBvZmZzZXQgKCV1KSBiaWdnZXIgdGhhbiBhYmJyZXYgc2l6ZSAoJXUpLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo2MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEludmFsaWQgb3IgdW5oYW5kbGVkIEZPUk0gdmFsdWU6ICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo2ODcKLW1zZ2lkICJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uIChiYWQgZmlsZSBudW1iZXIpLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo3MzgKLW1zZ2lkICJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfbGluZSBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo5MDMKLW1zZ2lkICJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzoxMDk3IGR3YXJmMi5jOjEyNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IENvdWxkIG5vdCBmaW5kIGFiYnJldiBudW1iZXIgJWQuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjEyMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkR3YXJmIEVycm9yOiBmb3VuZCBkd2FyZiB2ZXJzaW9uICclaHUnLCB0aGlzIHJlYWRlciBvbmx5IGhhbmRsZXMgdmVyc2lvbiAyICIKLSJpbmZvcm1hdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRHdhcmYgRXJyb3I6IGZvdW5kIGFkZHJlc3Mgc2l6ZSAnJXUnLCB0aGlzIHJlYWRlciBjYW4gbm90IGhhbmRsZSBzaXplcyAiCi0iZ3JlYXRlciB0aGFuICcldScuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjEyMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEJhZCBhYmJyZXYgbnVtYmVyOiAlZC4iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxMzA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gYmFzaWMgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE1ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTU4NyBlY29mZi5jOjE1OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIExvY2FsIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgc3RydWN0OyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIHVuaW9uOyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIGVudW07IEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgVHlwZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ1NSBlbGYtbTEwMzAwLmM6NjY3IGVsZjMyLWQxMHYuYzo0OTAgZWxmMzItZnIzMC5jOjY1MAotIzogZWxmMzItbTMyci5jOjExNTcgZWxmMzItdjg1MC5jOjE2NzQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NTkgZWxmLW0xMDMwMC5jOjY3MSBlbGYzMi1kMTB2LmM6NDk0IGVsZjMyLWZyMzAuYzo2NTQKLSM6IGVsZjMyLW0zMnIuYzoxMTYxIGVsZjMyLXY4NTAuYzoxNjc4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ2MyBlbGYtbTEwMzAwLmM6Njc1IGVsZjMyLWQxMHYuYzo0OTggZWxmMzItbTMyci5jOjExNjUKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NjcgZWxmLW0xMDMwMC5jOjY3OSBlbGYzMi1kMTB2LmM6NTAyIGVsZjMyLWZyMzAuYzo2NjIKLSM6IGVsZjMyLW0zMnIuYzoxMTY5IGVsZjMyLXY4NTAuYzoxNjk4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIHN0cmluZyBvZmZzZXQgJXUgPj0gJWx1IGZvciBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NTQzCi1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjU5MQotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIFNlY3Rpb246XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NjkzCi1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NzE2Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gUmVmZXJlbmNlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo3MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICByZXF1aXJlZCBmcm9tICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjE4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImNyZWF0aW5nIHNlY3Rpb24gc3ltYm9sLCBuYW1lID0gJXMsIHZhbHVlID0gMHglLjhseCwgaW5kZXggPSAlZCwgc2VjdGlvbiA9ICIKLSIweCUuOGx4XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjQ5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMgKGFsbG9jYXRlZCAldSwgbmVlZCAldSkiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjU5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMsIHRyeSBsaW5raW5nIHdpdGggLU4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjcxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcjogRmlyc3Qgc2VjdGlvbiBpbiBzZWdtZW50ICglcykgc3RhcnRzIGF0IDB4JXgiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjcyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgd2hlcmVhcyBzZWdtZW50IHN0YXJ0cyBhdCAweCV4IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjI5OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGFsbG9jYXRlZCBzZWN0aW9uIGAlcycgbm90IGluIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzM2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjMzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIDB4JS44bHgsIG5hbWUgPSAlcywgc3ltIG51bSA9ICVkLCBmbGFncyA9ICIKLSIweCUuOGx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozNTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NDc5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWZyMzAuYzo2NTggZWxmMzItdjg1MC5jOjE2ODIKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItaHBwYS5jOjEyMTUKLW1zZ2lkICJVbnN1cHBvcnRlZCBjYWxsIHRvIGhwcGFfZWxmX3JlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWkzODYuYzoxMjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjgwOAotbXNnaWQgIlNEQSByZWxvY2F0aW9uIHdoZW4gX1NEQV9CQVNFXyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6ODkyIGVsZjMyLXBwYy5jOjMwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxMTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYW4gJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgc2VjdGlvbiAoJXMpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJbnN0cnVjdGlvbiBzZXQgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHgiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjE5MjgKLW1zZ2lkICI6IG0zMnIgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSMuIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLgotIzogZWxmMzItbTY4ay5jOjQzMiBlbGYzMi1taXBzLmM6MjMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJwcml2YXRlIGZsYWdzID0gJWx4OiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tNjhrLmM6NDM1Ci1tc2dpZCAiIFtjcHUzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWNvcmUuYzozMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4uXG4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWNvcmUuYzozNzQgZWxmMzItbWNvcmUuYzo1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjQ2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MTI5NgotbXNnaWQgIjMyYml0cyBncCByZWxhdGl2ZSByZWxvY2F0aW9uIG9jY3VycyBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoxNDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpbmtpbmcgbWlwczE2IG9iamVjdHMgaW50byAlcyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjE0MSBlbGYzMi1wcGMuYzoxNDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIxNDMgZWxmMzItcHBjLmM6MTQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBiaWcgZW5kaWFuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsaW5raW5nIFBJQyBmaWxlcyB3aXRoIG5vbi1QSUMgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgYWJpY2FsbHMgZmlsZXMgd2l0aCBub24tYWJpY2FsbHMgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IElTQSBtaXNtYXRjaCAoLW1pcHMlZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICgtbWlwcyVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSVNBIG1pc21hdGNoICglZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICglZCkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEFCSSBtaXNtYXRjaDogbGlua2luZyAlcyBtb2R1bGUgd2l0aCBwcmV2aW91cyAlcyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMjcyIGVsZjMyLXBwYy5jOjE0NzkgZWxmNjQtc3BhcmMuYzoyMTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzAzCi1tc2dpZCAiIFthYmk9TzMyXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMwNQotbXNnaWQgIiBbYWJpPU82NF0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMDcKLW1zZ2lkICIgW2FiaT1FQUJJMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzA5Ci1tc2dpZCAiIFthYmk9RUFCSTY0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMxMQotbXNnaWQgIiBbYWJpIHVua25vd25dIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzEzCi1tc2dpZCAiIFtubyBhYmkgc2V0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMxNgotbXNnaWQgIiBbbWlwczFdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzE4Ci1tc2dpZCAiIFttaXBzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjAKLW1zZ2lkICIgW21pcHMzXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMyMgotbXNnaWQgIiBbbWlwczRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzI0Ci1tc2dpZCAiIFt1bmtub3duIElTQV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjcKLW1zZ2lkICIgWzMyYml0bW9kZV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjkKLW1zZ2lkICIgW25vdCAzMmJpdG1vZGVdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzozODk3Ci1tc2dpZCAic3RhdGljIHByb2NlZHVyZSAobm8gbmFtZSkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjQ0NzAgZWxmNjQtYWxwaGEuYzo0NDI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo0Nzc3Ci1tc2dpZCAibW9yZSBnb3QgZW50cmllcyBhcmUgbmVlZGVkIGZvciBoaXBhZ2UgcmVsb2NhdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjUwODEKLW1zZ2lkICJfZ3BfZGlzcCB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjU0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzKzB4JWx4OiBqdW1wIHRvIG1pcHMxNiByb3V0aW5lIHdoaWNoIGlzIG5vdCBqYWwiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjYyNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENBTEwxNiByZWxvYyBhdCAweCVseCBub3QgYWdhaW5zdCBnbG9iYWwgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjE0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgbm9ybWFsbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MTQ1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNvbXBpbGVkIG5vcm1hbGx5IGFuZCBsaW5rZWQgd2l0aCBtb2R1bGVzIGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoxNTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHNwZWNpYWwgbGlua2VyIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MjMxMSBlbGYzMi1wcGMuYzoyMzQ1IGVsZjMyLXBwYy5jOjIzODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjMyMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIGZvciBzeW1ib2wgJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzU4MyBlbGYzMi1wcGMuYzozNjA1IGVsZjMyLXBwYy5jOjM2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjM3MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFJlbG9jYXRpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHN5bWJvbCAlcy4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo2NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjY4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IFJfU0hfVVNFUyBwb2ludHMgdG8gdW5yZWNvZ25pemVkIGluc24gMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjcwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo3MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjc1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo4NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCBDT1VOVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjEyNzEgZWxmMzItc2guYzoxNjA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTUwMiBlbGY2NC1zcGFyYy5jOjE1NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHByb2JhYmx5IGNvbXBpbGVkIHdpdGhvdXQgLWZQSUM/IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTkyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTkzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzYSBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OHBsdXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxOTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSA2NCBiaXQgc3lzdGVtIGFuZCB0YXJnZXQgaXMgMzIgYml0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTk1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBsaXR0bGUgZW5kaWFuIGZpbGVzIHdpdGggYmlnIGVuZGlhbiBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlZhcmlhYmxlIGAlcycgY2Fubm90IG9jY3VweSBpbiBtdWx0aXBsZSBzbWFsbCBkYXRhIHJlZ2lvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW4gb25seSBiZSBpbiBvbmUgb2YgdGhlIHNtYWxsLCB6ZXJvLCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgemVybyBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCB6ZXJvIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTA3MQotbXNnaWQgIkZBSUxFRCB0byBmaW5kIHByZXZpb3VzIEhJMTYgcmVsb2NcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTY4NgotbXNnaWQgImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZ3AiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE2OTAKLW1zZ2lkICJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2VwIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxNjk0Ci1tc2dpZCAiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19jdGJwIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxODk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHg6ICIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTkwNAotbXNnaWQgInY4NTAgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTA1Ci1tc2dpZCAidjg1MGUgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTA2Ci1tc2dpZCAidjg1MGVhIGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1hbHBoYS5jOjk0OQotbXNnaWQgIkdQRElTUCByZWxvY2F0aW9uIGRpZCBub3QgZmluZCBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LWFscGhhLmM6Mjk5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogLmdvdCBzdWJzZWdtZW50IGV4Y2VlZHMgNjRLIChzaXplICVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2hlY2tfcmVsb2NzOiB1bmhhbmRsZWQgcmVsb2MgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjIxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgVWx0cmFTUEFSQyBzcGVjaWZpYyB3aXRoIEhBTCBzcGVjaWZpYyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGVsZmNvZGUuaDoxMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB2ZXJzaW9uIGNvdW50ICglbGQpIGRvZXMgbm90IG1hdGNoIHN5bWJvbCBjb3VudCAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGZsaW5rLmM6MzE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBTZWN0aW9uICVzIGlzIGFscmVhZHkgdG8gbGFyZ2UgdG8gcHV0IGhvbGUgb2YgJWxkIGJ5dGVzIGluIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjQ0OSBtNjhrbGludXguYzo0NTMgc3BhcmNsaW51eC5jOjQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NDU3IG02OGtsaW51eC5jOjQ2MSBzcGFyY2xpbnV4LmM6NDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBpMzg2bGludXguYzo2NDUgaTM4NmxpbnV4LmM6Njk1IG02OGtsaW51eC5jOjY1MiBtNjhrbGludXguYzo3MDAKLSM6IHNwYXJjbGludXguYzo2NDggc3BhcmNsaW51eC5jOjY5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjcxOSBtNjhrbGludXguYzo3MjQgc3BhcmNsaW51eC5jOjcyMgotbXNnaWQgIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE2NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3RyaW5nIHRvbyBsb25nICglZCBjaGFycywgbWF4IDY1NTM1KSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlY29nbml6ZWQgc3ltYm9sIGAlcycgZmxhZ3MgMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmltcGxlbWVudGVkIEFUSSByZWNvcmQgICV1IGZvciBzeW1ib2wgJXUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjgxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBBVE4gdHlwZSAlZCBpbiBleHRlcm5hbCBwYXJ0IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo4NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgdHlwZSBhZnRlciBBVE4iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogdW5leHBlY3RlZCBjaGFyYWN0ZXIgYCVzJyBpbiBJbnRlbCBIZXggZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzozNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBjaGVja3N1bSBpbiBJbnRlbCBIZXggZmlsZSAoZXhwZWN0ZWQgJXUsIGZvdW5kICV1KSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBzdGFydCBhZGRyZXNzIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IHVucmVjb2duaXplZCBpaGV4IHR5cGUgJXUgaW4gSW50ZWwgSGV4IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnRlcm5hbCBlcnJvciBpbiBpaGV4X3JlYWRfc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgc2VjdGlvbiBsZW5ndGggaW4gaWhleF9yZWFkX3NlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjg1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYWRkcmVzcyAweCVzIG91dCBvZiByYW5nZSBmb3IgSW50ZXggSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliYmZkLmM6NDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vdCBtYXBwaW5nOiBkYXRhPSVseCBtYXBwZWQ9JWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJiZmQuYzo0ODQKLW1zZ2lkICJub3QgbWFwcGluZzogZW52IHZhciBub3Qgc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogbGlua2VyLmM6MjY3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIGRvIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggJXMgaW5wdXQgYW5kICVzIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBvYXN5cy5jOjEwMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYCVzJyBpbiBvYXN5cyIKLW1zZ3N0ciAiIgotCi0jOiBvc2YtY29yZS5jOjE0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmhhbmRsZWQgT1NGLzEgY29yZSBmaWxlIHNlY3Rpb24gdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MTgKLW1zZ2lkICIiCi0iXG4iCi0icHBjYm9vdCBoZWFkZXI6XG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJFbnRyeSBvZmZzZXQgICAgICAgID0gMHglLjhseCAoJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoICAgICAgICAgICAgICA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZsYWcgZmllbGQgICAgICAgICAgPSAweCUuMnhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvbiBuYW1lICAgICAgPSBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJQYXJ0aXRpb25bJWRdIHN0YXJ0ICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvblslZF0gZW5kICAgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUGFydGl0aW9uWyVkXSBzZWN0b3IgPSAweCUuOGx4ICglbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQ2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJQYXJ0aXRpb25bJWRdIGxlbmd0aCA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb20uYzo1Mjc2Ci1tc2dpZCAic29tX3NpemVvZl9oZWFkZXJzIHVuaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JlYy5jOjI5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogVW5leHBlY3RlZCBjaGFyYWN0ZXIgYCVzJyBpbiBTLXJlY29yZCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3ltcy5jOjkyMgotbXNnaWQgIlVuc3VwcG9ydGVkIC5zdGFiIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogdm1zLWdzZC5jOjY5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGdzZC9lZ3NkIHN1YnR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLWhkci5jOjQwNwotbXNnaWQgIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6NTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN0YWNrIG92ZXJmbG93ICglZCkgaW4gX2JmZF92bXNfcHVzaCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjU1OAotbXNnaWQgIlN0YWNrIHVuZGVyZmxvdyBpbiBfYmZkX3Ztc19wb3AiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzo5MjkKLW1zZ2lkICJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB6ZXJvIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6OTM0Ci1tc2dpZCAiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggdG9vIG1hbnkgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzoxMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyByZXBsYWNlZCBieSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6MTEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gZW50ZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY5Ci1tc2dpZCAiTm8gTWVtICEiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMwOQotbXNnaWQgIkJhZCBzZWN0aW9uIGluZGV4IGluIEVUSVJfU19DX1NUQV9QUSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuc3VwcG9ydGVkIFNUQSBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMyOSB2bXMtdGlyLmM6MTI4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBTVEEgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRVRJUl9TX0NfU1RPX0dCTDogbm8gc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVUSVJfU19DX1NUT19DQTogbm8gc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDcwCi1tc2dpZCAiRVRJUl9TX0NfU1RPX1JCL0FCOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1MjgKLW1zZ2lkICJFVElSX1NfQ19TVE9fTFBfUFNCOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1MzQKLW1zZ2lkICJFVElSX1NfQ19TVE9fSElOVF9HQkw6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTQwCi1tc2dpZCAiRVRJUl9TX0NfU1RPX0hJTlRfUFM6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTQ0IHZtcy10aXIuYzoxNDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIFNUTyBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY1NwotbXNnaWQgIkVUSVJfU19DX09QUl9JTlNWOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2NzUKLW1zZ2lkICJFVElSX1NfQ19PUFJfVVNIOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2ODEKLW1zZ2lkICJFVElSX1NfQ19PUFJfUk9UOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo3MDAKLW1zZ2lkICJFVElSX1NfQ19PUFJfUkVERUY6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjcwNgotbXNnaWQgIkVUSVJfU19DX09QUl9ERkxJVDogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NzEwIHZtcy10aXIuYzoxNjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIE9QUiBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjc3OSB2bXMtdGlyLmM6MTcyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBDVEwgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo4MDgKLW1zZ2lkICJFVElSX1NfQ19TVENfTFA6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgyNgotbXNnaWQgIkVUSVJfU19DX1NUQ19HQkw6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgzNAotbXNnaWQgIkVUSVJfU19DX1NUQ19HQ0E6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjg0MwotbXNnaWQgIkVUSVJfU19DX1NUQ19QUzogbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKiBzdGFjayBieXRlIGZyb20gaW1hZ2UKLSMuICogYXJnOiAtCi0jLiAqCi0jLgotIzogdm1zLXRpci5jOjExODkKLW1zZ2lkICJTdGFjay1mcm9tLWltYWdlIG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTIwOQotbXNnaWQgIlN0YWNrLWVudHJ5LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqIGNvbXBhcmUgcHJvY2VkdXJlIGFyZ3VtZW50Ci0jLiAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLSMuICoJYnkJYXJndW1lbnQgaW5kZXgKLSMuICoJZGEJYXJndW1lbnQgZGVzY3JpcHRvcgotIy4gKgotIy4gKiBjb21wYXJlIGFyZ3VtZW50IGRlc2NyaXB0b3Igd2l0aCBzeW1ib2wgYXJndW1lbnQgKEFSRyRWX1BBU1NNRUNIKQotIy4gKiBhbmQgc3RhY2sgVFJVRSAoYXJncyBtYXRjaCkgb3IgRkFMU0UgKGFyZ3MgZG9udCBtYXRjaCkgdmFsdWUKLSMuCi0jOiB2bXMtdGlyLmM6MTIyNQotbXNnaWQgIlBBU1NNRUNIIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI0NQotbXNnaWQgIlN0YWNrLWxvY2FsLXN5bWJvbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjEyNjAKLW1zZ2lkICJTdGFjay1saXRlcmFsIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI4MgotbXNnaWQgIlN0YWNrLWxvY2FsLXN5bWJvbC1lbnRyeS1wb2ludC1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmltcGxlbWVudGVkIFNUTyBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE1OTgKLW1zZ2lkICJUSVJfU19DX09QUl9BU0ggaW5jb21wbGV0ZSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTYxMgotbXNnaWQgIlRJUl9TX0NfT1BSX1VTSCBpbmNvbXBsZXRlIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNjI2Ci1tc2dpZCAiVElSX1NfQ19PUFJfUk9UIGluY29tcGxldGUiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogcmVkZWZpbmUgc3ltYm9sIHRvIGN1cnJlbnQgbG9jYXRpb24KLSMuCi0jOiB2bXMtdGlyLmM6MTY0NwotbXNnaWQgIlRJUl9TX0NfT1BSX1JFREVGIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogZGVmaW5lIGEgbGl0ZXJhbAotIy4KLSM6IHZtcy10aXIuYzoxNjU0Ci1tc2dpZCAiVElSX1NfQ19PUFJfREZMSVQgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcwOQotbXNnaWQgIlRJUl9TX0NfQ1RMX0RGTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcxNwotbXNnaWQgIlRJUl9TX0NfQ1RMX1NUTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcyNQotbXNnaWQgIlRJUl9TX0NfQ1RMX1NUS0RMIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTc4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJPYmogY29kZSAlZCBub3QgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjIxMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU0VDX1JFTE9DIHdpdGggbm8gcmVsb2NzIGluIHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjI0MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5oYW5kbGVkIHJlbG9jYXRpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTY2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYCVzJyBoYXMgbGluZSBudW1iZXJzIGJ1dCBubyBlbmNsb3Npbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjbGFzcyAlZCBzeW1ib2wgYCVzJyBoYXMgbm8gYXV4IGVudHJpZXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTczNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBjc2VjdCB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE3NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBYVFlfRVIgc3ltYm9sIGAlcyc6IGNsYXNzICVkIHNjbnVtICVkIHNjbmxlbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBYTUNfVEMwIHN5bWJvbCBgJXMnIGlzIGNsYXNzICVkIHNjbmxlbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxOTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIHNtY2xhcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxOTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjc2VjdCBgJXMnIG5vdCBpbiBlbmNsb3Npbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBtaXNwbGFjZWQgWFRZX0xEIGAlcyciCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MjM0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2MgJXM6JWQgbm90IGluIGNzZWN0IgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjI0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFhDT0ZGIHNoYXJlZCBvYmplY3Qgd2hlbiBub3QgcHJvZHVjaW5nIFhDT0ZGIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyNTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkeW5hbWljIG9iamVjdCB3aXRoIG5vIC5sb2FkZXIgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzozMTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBzdWNoIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzozNzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndhcm5pbmc6IGF0dGVtcHQgdG8gZXhwb3J0IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo0NzA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRPQyBvdmVyZmxvdzogMHglbHggPiAweDEwMDAwOyB0cnkgLW1taW5pbWFsLXRvYyB3aGVuIGNvbXBpbGluZyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTI5IHhjb2ZmbGluay5jOjU4ODUgeGNvZmZsaW5rLmM6NTkyMiB4Y29mZmxpbmsuYzo2MjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTUxIHhjb2ZmbGluay5jOjYyNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGAlcycgaW4gbG9hZGVyIHJlbG9jIGJ1dCBub3QgbG9hZGVyIHN5bSIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsb2FkZXIgcmVsb2MgaW4gcmVhZC1vbmx5IHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NjQ0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo2NDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBUT0MgcmVsb2MgYXQgMHgleCB0byBzeW1ib2wgYCVzJyB3aXRoIG5vIFRPQyBlbnRyeSIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvYmZkL3BwY2Jvb3QuYyBiL2JmZC9wcGNib290LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGE0MDcuLjAwMDAwMDAKLS0tIGEvYmZkL3BwY2Jvb3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFBQQ2J1ZyBib290IHJlY29yZHMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQsIDxtZWlzc25lckBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBCRkQgYmFja2VuZCB3aGljaCBtYXkgYmUgdXNlZCB0byB3cml0ZSBQb3dlclBDQnVnIGJvb3Qgb2JqZWN0cy4KLSAgIEl0IG1heSBvbmx5IGJlIHVzZWQgZm9yIG91dHB1dCwgbm90IGlucHV0LiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHRoaXMgbWF5Ci0gICBiZSB1c2VkIGFzIGFuIG91dHB1dCBmb3JtYXQgZm9yIG9iamNvcHkgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgcmF3IGJpbmFyeQotICAgZGF0YS4KLQotICAgVGhpcyBpcyB2ZXJ5IHNpbXBsZS4gIFRoZSBvbmx5IGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSByZWFsIGRhdGEKLSAgIHdpbGwgc3RhcnQgYXQgc29tZSBhZGRyZXNzIFgsIGFuZCBpbiBzb21lIGNhc2VzIHdlIHdpbGwgbm90IHdhbnQgdG8KLSAgIGluY2x1ZGUgWCB6ZXJvZXMganVzdCB0byBnZXQgdG8gdGhhdCBwb2ludC4gIFNpbmNlIHRoZSBzdGFydAotICAgYWRkcmVzcyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQsIHdlIHVzZSBpdAotICAgaW5zdGVhZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBzdGFydCBvZgotICAgdGhlIGZpbGUuICBvYmpjb3B5IGNvb3BlcmF0ZXMgYnkgc3BlY2lhbGx5IHNldHRpbmcgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIHRvIHplcm8gYnkgZGVmYXVsdC4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFBQQ2J1ZyBsb2NhdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfbG9jYXRpb24gewotICBiZmRfYnl0ZQlpbmQ7Ci0gIGJmZF9ieXRlCWhlYWQ7Ci0gIGJmZF9ieXRlCXNlY3RvcjsKLSAgYmZkX2J5dGUJY3lsaW5kZXI7Ci19IHBwY2Jvb3RfbG9jYXRpb25fdDsKLQotLyogUFBDYnVnIHBhcnRpdGlvbiB0YWJsZSBsYXlvdXQgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfcGFydGl0aW9uIHsKLSAgcHBjYm9vdF9sb2NhdGlvbl90CXBhcnRpdGlvbl9iZWdpbjsJLyogcGFydGl0aW9uIGJlZ2luICovCi0gIHBwY2Jvb3RfbG9jYXRpb25fdAlwYXJ0aXRpb25fZW5kOwkJLyogcGFydGl0aW9uIGVuZCAqLwotICBiZmRfYnl0ZQkJc2VjdG9yX2JlZ2luWzRdOwkvKiAzMi1iaXQgc3RhcnQgUkJBICh6ZXJvLWJhc2VkKSwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJc2VjdG9yX2xlbmd0aFs0XTsJLyogMzItYml0IFJCQSBjb3VudCAob25lLWJhc2VkKSwgbGl0dGxlIGVuZGlhbiAqLwotfSBwcGNib290X3BhcnRpdGlvbl90OwotCi0vKiBQUENidWcgYm9vdCBsYXlvdXQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9oZHIgewotICBiZmRfYnl0ZQkJcGNfY29tcGF0aWJpbGl0eVs0NDZdOwkvKiB4ODYgaW5zdHJ1Y3Rpb24gZmllbGQgKi8KLSAgcHBjYm9vdF9wYXJ0aXRpb25fdAlwYXJ0aXRpb25bNF07CQkvKiBwYXJ0aXRpb24gaW5mb3JtYXRpb24gKi8KLSAgYmZkX2J5dGUJCXNpZ25hdHVyZVsyXTsJCS8qIDB4NTUgYW5kIDB4YWEgKi8KLSAgYmZkX2J5dGUJCWVudHJ5X29mZnNldFs0XTsJLyogZW50cnkgcG9pbnQgb2Zmc2V0LCBsaXR0bGUgZW5kaWFuICovCi0gIGJmZF9ieXRlCQlsZW5ndGhbNF07CQkvKiBsb2FkIGltYWdlIGxlbmd0aCwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJZmxhZ3M7CQkJLyogZmxhZyBmaWVsZCAqLwotICBiZmRfYnl0ZQkJb3NfaWQ7CQkJLyogT1NfSUQgKi8KLSAgY2hhcgkJCXBhcnRpdGlvbl9uYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUgKi8KLSAgYmZkX2J5dGUJCXJlc2VydmVkMVs0NzBdOwkJLyogcmVzZXJ2ZWQgKi8KLX0gcHBjYm9vdF9oZHJfdDsKLQotLyogU2lnbmF0dXJlIGJ5dGVzIGZvciBsYXN0IDIgYnl0ZXMgb2YgdGhlIDUxMiBieXRlIHJlY29yZCAqLwotI2RlZmluZSBTSUdOQVRVUkUwIDB4NTUKLSNkZWZpbmUgU0lHTkFUVVJFMSAweGFhCi0KLS8qIFBvd2VyUEMgYm9vdCB0eXBlICovCi0jZGVmaW5lIFBQQ19JTkQgMHg0MQotCi0vKiBJbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHBwY2Jvb3QgaGVhZGVyICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X2RhdGEgewotICBwcGNib290X2hkcl90CWhlYWRlcjsJCQkJLyogcmF3IGhlYWRlciAqLwotICBhc2VjdGlvbiAqc2VjOwkJCQkvKiBzaW5nbGUgc2VjdGlvbiAqLwotfSBwcGNib290X2RhdGFfdDsKLQotLyogQW55IGJmZCB3ZSBjcmVhdGUgYnkgcmVhZGluZyBhIHBwY2Jvb3QgZmlsZSBoYXMgdGhyZWUgc3ltYm9sczoKLSAgIGEgc3RhcnQgc3ltYm9sLCBhbiBlbmQgc3ltYm9sLCBhbmQgYW4gYWJzb2x1dGUgbGVuZ3RoIHN5bWJvbC4gICovCi0jZGVmaW5lIFBQQ0JPT1RfU1lNUyAzCi0KLXN0YXRpYyBib29sZWFuIHBwY2Jvb3RfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpwcGNib290X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGxvbmcgcHBjYm9vdF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqbWFuZ2xlX25hbWUgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotc3RhdGljIGxvbmcgcHBjYm9vdF9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqcHBjYm9vdF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgcHBjYm9vdF9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGludCBwcGNib290X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotI2RlZmluZSBwcGNib290X3NldF90ZGF0YShhYmZkLCBwdHIpICgoYWJmZCktPnRkYXRhLmFueSA9IChQVFIpIChwdHIpKQotI2RlZmluZSBwcGNib290X2dldF90ZGF0YShhYmZkKSAoKHBwY2Jvb3RfZGF0YV90ICopICgoYWJmZCktPnRkYXRhLmFueSkpCi0MCi0vKiBDcmVhdGUgYSBwcGNib290IG9iamVjdC4gIEludm9rZWQgdmlhIGJmZF9zZXRfZm9ybWF0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFwcGNib290X2dldF90ZGF0YSAoYWJmZCkpCi0gICAgcHBjYm9vdF9zZXRfdGRhdGEgKGFiZmQsIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAocHBjYm9vdF9kYXRhX3QpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIHRvIFBvd2VyUEMgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNib290X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQotICBlbHNlIGlmIChhcmNoICE9IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotDAotLyogQW55IGZpbGUgbWF5IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBwcGNib290IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKLSAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcwotICAgYmVpbmcgcHBjYm9vdC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXBwY2Jvb3Rfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgcHBjYm9vdF9oZHJfdCBoZHI7Ci0gIHNpemVfdCBpOwotICBwcGNib290X2RhdGFfdCAqdGRhdGE7Ci0KLSAgQkZEX0FTU0VSVCAoc2l6ZW9mIChwcGNib290X2hkcl90KSA9PSAxMDI0KTsKLQotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoKHNpemVfdCkgc3RhdGJ1Zi5zdF9zaXplIDwgc2l6ZW9mIChwcGNib290X2hkcl90KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIHNpemVvZiAoaGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mIChoZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyBzb21lIGJhc2ljIGNoZWNrcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGhkci5wY19jb21wYXRpYmlsaXR5KTsgaSsrKQotICAgIGlmIChoZHIucGNfY29tcGF0aWJpbGl0eVtpXSkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICBpZiAoaGRyLnNpZ25hdHVyZVswXSAhPSBTSUdOQVRVUkUwIHx8IGhkci5zaWduYXR1cmVbMV0gIT0gU0lHTkFUVVJFMSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoaGRyLnBhcnRpdGlvblswXS5wYXJ0aXRpb25fZW5kLmluZCAhPSBQUENfSU5EKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFiZmQtPnN5bWNvdW50ID0gUFBDQk9PVF9TWU1TOwotCi0gIC8qIE9uZSBkYXRhIHNlY3Rpb24uICAqLwotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRhdGEiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzZWMtPmZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUzsKLSAgc2VjLT52bWEgPSAwOwotICBzZWMtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZSAtIHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci0gIHNlYy0+ZmlsZXBvcyA9IHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci0KLSAgcHBjYm9vdF9ta29iamVjdCAoYWJmZCk7Ci0gIHRkYXRhID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpOwotICB0ZGF0YS0+c2VjID0gc2VjOwotICBtZW1jcHkgKChQVFIpICZ0ZGF0YS0+aGVhZGVyLCAoUFRSKSAmaGRyLCBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpKTsKLQotICBwcGNib290X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Bvd2VycGMsIDApOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2RlZmluZSBwcGNib290X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBwcGNib290X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBwcGNib290X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotDAotLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCArIHNpemVvZihwcGNib290X2hkcl90KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXBwY2Jvb3RfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKFBQQ0JPT1RfU1lNUyArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0MCi0vKiBDcmVhdGUgYSBzeW1ib2wgbmFtZSBiYXNlZCBvbiB0aGUgYmZkJ3MgZmlsZW5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1tYW5nbGVfbmFtZSAoYWJmZCwgc3VmZml4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKnN1ZmZpeDsKLXsKLSAgaW50IHNpemU7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqcDsKLQotICBzaXplID0gKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpCi0JICArIHN0cmxlbiAoc3VmZml4KQotCSAgKyBzaXplb2YgIl9wcGNib290X18iKTsKLQotICBidWYgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoYnVmID09IE5VTEwpCi0gICAgcmV0dXJuICIiOwotCi0gIHNwcmludGYgKGJ1ZiwgIl9wcGNib290XyVzXyVzIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN1ZmZpeCk7Ci0KLSAgLyogQ2hhbmdlIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gdW5kZXJzY29yZXMuICAqLwotICBmb3IgKHAgPSBidWY7ICpwOyBwKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwKSkKLSAgICAgICpwID0gJ18nOwotCi0gIHJldHVybiBidWY7Ci19Ci0KLQwKLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXBwY2Jvb3RfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBwcGNib290X2dldF90ZGF0YSAoYWJmZCktPnNlYzsKLSAgYXN5bWJvbCAqc3ltczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3ltcyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgUFBDQk9PVF9TWU1TICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN0YXJ0IHN5bWJvbC4gICovCi0gIHN5bXNbMF0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMF0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic3RhcnQiKTsKLSAgc3ltc1swXS52YWx1ZSA9IDA7Ci0gIHN5bXNbMF0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzBdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMF0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogRW5kIHN5bWJvbC4gICovCi0gIHN5bXNbMV0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMV0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAiZW5kIik7Ci0gIHN5bXNbMV0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1sxXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMV0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1sxXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBTaXplIHN5bWJvbC4gICovCi0gIHN5bXNbMl0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMl0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic2l6ZSIpOwotICBzeW1zWzJdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMl0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzJdLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBzeW1zWzJdLnVkYXRhLnAgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBQUENCT09UX1NZTVM7IGkrKykKLSAgICAqYWxvY2F0aW9uKysgPSBzeW1zKys7Ci0gICphbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBQUENCT09UX1NZTVM7Ci19Ci0KLQwKLS8qIE1ha2UgYW4gZW1wdHkgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotcHBjYm9vdF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLX0KLQotDAotI2RlZmluZSBwcGNib290X3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLQotLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY2Jvb3RfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLSNkZWZpbmUgcHBjYm9vdF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHBwY2Jvb3RfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHBwY2Jvb3RfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBwcGNib290X21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfMGwpCi0jZGVmaW5lIHBwY2Jvb3RfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0MCi0vKiBXcml0ZSBzZWN0aW9uIGNvbnRlbnRzIG9mIGEgcHBjYm9vdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3Rfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxvdzsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBUaGUgbG93ZXN0IHNlY3Rpb24gVk1BIHNldHMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQKLSAgICAgICAgIG9mIHRoZSBmaWxlLiAgV2UgdXNlIHRoZSBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQotICAgICAgICAgc2VjdGlvbnMuICAqLwotICAgICAgbG93ID0gYWJmZC0+c2VjdGlvbnMtPnZtYTsKLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zLT5uZXh0OyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmIChzLT52bWEgPCBsb3cpCi0JICBsb3cgPSBzLT52bWE7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXMtPmZpbGVwb3MgPSBzLT52bWEgLSBsb3c7Ci0KLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLQwKLXN0YXRpYyBpbnQKLXBwY2Jvb3Rfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gc2l6ZW9mIChwcGNib290X2hkcl90KTsKLX0KLQotDAotLyogUHJpbnQgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgZmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmFyZzsKLXsKLSAgRklMRSAqZiA9IChGSUxFICopZmFyZzsKLSAgcHBjYm9vdF9kYXRhX3QgKnRkYXRhID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpOwotICBsb25nIGVudHJ5X29mZnNldCA9IGJmZF9nZXRsX3NpZ25lZF8zMiAoKFBUUikgdGRhdGEtPmhlYWRlci5lbnRyeV9vZmZzZXQpOwotICBsb25nIGxlbmd0aCA9IGJmZF9nZXRsX3NpZ25lZF8zMiAoKFBUUikgdGRhdGEtPmhlYWRlci5sZW5ndGgpOwotICBpbnQgaTsKLQotICBmcHJpbnRmIChmLCBfKCJcbnBwY2Jvb3QgaGVhZGVyOlxuIikpOwotICBmcHJpbnRmIChmLCBfKCJFbnRyeSBvZmZzZXQgICAgICAgID0gMHglLjhseCAoJWxkKVxuIiksIGVudHJ5X29mZnNldCwgZW50cnlfb2Zmc2V0KTsKLSAgZnByaW50ZiAoZiwgXygiTGVuZ3RoICAgICAgICAgICAgICA9IDB4JS44bHggKCVsZClcbiIpLCBsZW5ndGgsIGxlbmd0aCk7Ci0KLSAgaWYgKHRkYXRhLT5oZWFkZXIuZmxhZ3MpCi0gICAgZnByaW50ZiAoZiwgXygiRmxhZyBmaWVsZCAgICAgICAgICA9IDB4JS4yeFxuIiksIHRkYXRhLT5oZWFkZXIuZmxhZ3MpOwotCi0gIGlmICh0ZGF0YS0+aGVhZGVyLm9zX2lkKQotICAgIGZwcmludGYgKGYsICJPU19JRCAgICAgICAgICAgICAgID0gMHglLjJ4XG4iLCB0ZGF0YS0+aGVhZGVyLm9zX2lkKTsKLQotICBpZiAodGRhdGEtPmhlYWRlci5wYXJ0aXRpb25fbmFtZSkKLSAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb24gbmFtZSAgICAgID0gXCIlc1wiXG4iKSwgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25fbmFtZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICBsb25nIHNlY3Rvcl9iZWdpbiAgPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnNlY3Rvcl9iZWdpbik7Ci0gICAgICBsb25nIHNlY3Rvcl9sZW5ndGggPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnNlY3Rvcl9sZW5ndGgpOwotCi0gICAgICAvKiBTa2lwIGFsbCAwIGVudHJpZXMgKi8KLSAgICAgIGlmICghdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmluZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5oZWFkCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLnNlY3RvcgotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5jeWxpbmRlcgotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaW5kCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5oZWFkCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5zZWN0b3IKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmN5bGluZGVyCi0JICAmJiAhc2VjdG9yX2JlZ2luICYmICFzZWN0b3JfbGVuZ3RoKQotCWNvbnRpbnVlOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJcblBhcnRpdGlvblslZF0gc3RhcnQgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIiksIGksCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5pbmQsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5oZWFkLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uc2VjdG9yLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uY3lsaW5kZXIpOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIGVuZCAgICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIpLCBpLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmluZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5oZWFkLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLnNlY3RvciwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5jeWxpbmRlcik7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlBhcnRpdGlvblslZF0gc2VjdG9yID0gMHglLjhseCAoJWxkKVxuIiksIGksIHNlY3Rvcl9iZWdpbiwgc2VjdG9yX2JlZ2luKTsKLSAgICAgIGZwcmludGYgKGYsIF8oIlBhcnRpdGlvblslZF0gbGVuZ3RoID0gMHglLjhseCAoJWxkKVxuIiksIGksIHNlY3Rvcl9sZW5ndGgsIHNlY3Rvcl9sZW5ndGgpOwotICAgIH0KLQotICBmcHJpbnRmIChmLCAiXG4iKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNkZWZpbmUgcHBjYm9vdF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBwcGNib290X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBwcGNib290X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgcHBjYm9vdF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBwcGNib290X2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBwcGNib290X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBwcGNib290X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0IHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotY29uc3QgYmZkX3RhcmdldCBwcGNib290X3ZlYyA9Ci17Ci0gICJwcGNib290IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAkvKiBmbGF2b3VyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogYnl0ZW9yZGVyIGlzIGJpZyBlbmRpYW4gZm9yIGNvZGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXJfYnl0ZW9yZGVyICovCi0gIEVYRUNfUCwJCQkvKiBvYmplY3RfZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUyksIC8qIHNlY3Rpb25fZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLSAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgcHBjYm9vdF9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBwcGNib290X21rb2JqZWN0LAotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF90cnVlLAotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3B0cmFjZS1jb3JlLmMgYi9iZmQvcHRyYWNlLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0ZmRiYi4uMDAwMDAwMAotLS0gYS9iZmQvcHRyYWNlLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgY29yZSBmaWxlcyB3aGljaCB1c2UgdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZQotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGUgc3RydWN0dXJlIG9mIHRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0cmFkLWNvcmUuYyB3cml0dGVuIGJ5IEpvaG4gR2lsbW9yZQotICAgb2YgQ3lnbnVzIFN1cHBvcnQuCi0gICBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSBieSBLZXZpbiBBLiBCdWV0dG5lci4KLSAgIChMb25ndGVybSBpdCBtYXkgYmUgYmV0dGVyIHRvIG1lcmdlIHRoaXMgZmlsZSB3aXRoIHRyYWQtY29yZS5jKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBQVFJBQ0VfQ09SRQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotCi0KLXN0cnVjdCB0cmFkX2NvcmVfc3RydWN0Ci0gIHsKLSAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgICBzdHJ1Y3QgcHRyYWNlX3VzZXIgdTsKLSAgfTsKLQotI2RlZmluZSBjb3JlX3VwYWdlKGJmZCkgKCYoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51KSkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5yZWdfc2VjdGlvbikKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqcHRyYWNlX3VuaXhfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jaGFyICoJCXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1pbnQJCXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JCXB0cmFjZV91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotCi17Ci0gIGludCB2YWw7Ci0gIHN0cnVjdCBwdHJhY2VfdXNlciB1OwotICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqcmF3cHRyOwotCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZ1LCAxLCBzaXplb2YgdSwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHUgfHwgdS5wdF9tYWdpYyAhPSBfQkNTX1BUUkFDRV9NQUdJQyAKLSAgICAgIHx8IHUucHRfcmV2ICE9IF9CQ1NfUFRSQUNFX1JFVikKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJvdGggdGhlIHVwYWdlIGFuZCB0aGUgc3RydWN0IGNvcmVfZGF0YSBhdCBvbmNlLCBzbwotICAgICBhIHNpbmdsZSBmcmVlKCkgd2lsbCBmcmVlIHRoZW0gYm90aC4gICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0KSk7Ci0KLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLSAgcmF3cHRyLT51ID0gdTsgLypDb3B5IHRoZSB1YXJlYSBpbnRvIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBiZmQgKi8KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIGZyZWUKLSAgICAgdGhlbSBzZXBhcmF0ZWx5LiAgKi8KLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3N0YWNrc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfZGF0YXNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uYW1lID0gIi5zdGFjayI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5hbWUgPSAiLmRhdGEiOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0KLSAgLyogRklYTUU6ICBOZWVkIHRvIHdvcnJ5IGFib3V0IHNoYXJlZCBtZW1vcnksIGxpYnJhcnkgZGF0YSwgYW5kIGxpYnJhcnkKLSAgICAgdGV4dC4gIEkgZG9uJ3QgdGhpbmsgdGhhdCBhbnkgb2YgdGhlc2UgdGhpbmdzIGFyZSBzdXBwb3J0ZWQgb24gdGhlCi0gICAgIHN5c3RlbSBvbiB3aGljaCBJIGFtIGRldmVsb3BpbmcgdGhpcyBmb3IgdGhvdWdoLiAqLwotCi0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gIHUucHRfZHNpemU7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSB1LnB0X3NzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZih1KTsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSB1LnB0X29fZGF0YV9zdGFydDsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IFVTUlNUQUNLIC0gdS5wdF9zc2l6ZTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwIC0gc2l6ZW9mKHUpOwkvKiBzZWUgdHJhZC1jb3JlLmMgKi8KLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gKGludCkgdS5wdF9kYXRhcHRyOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChpbnQpICh1LnB0X2RhdGFwdHIgKyB1LnB0X2RzaXplKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gMDsgLyogUmVnaXN0ZXIgc2VnbWVudCBpcyBwdHJhY2VfdXNlciAqLwotCi0gIC8qIEFsaWduIHRvIHdvcmQgYXQgbGVhc3QgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfc3RhY2tzZWMgKGFiZmQpOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfZGF0YXNlYyAoYWJmZCk7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAzOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1jaGFyICoKLXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUucHRfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBBUkdTVVNFRCAqLwotaW50Ci1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnB0X3NpZ2ZyYW1lLnNpZ19udW07Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgLyogRklYTUU6IFVzZSBwdF90aW1kYXQgZmllbGQgb2YgdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSB0byBtYXRjaCAKLSAgICAgdGhlIGRhdGUgb2YgdGhlIGV4ZWN1dGFibGUgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBwdHJhY2VfY29yZV92ZWMgPQotICB7Ci0gICAgInRyYWQtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIHB0cmFjZV91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAocHRyYWNlX3VuaXgpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKLQotI2VuZGlmIC8qIFBUUkFDRV9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvcmVsb2MuYyBiL2JmZC9yZWxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTFiNzNhLi4wMDAwMDAwCi0tLSBhL2JmZC9yZWxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg2MyArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgcmVsb2NhdGlvbiBlbnRyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCVJlbG9jYXRpb25zCi0KLQlCRkQgbWFpbnRhaW5zIHJlbG9jYXRpb25zIGluIG11Y2ggdGhlIHNhbWUgd2F5IGl0IG1haW50YWlucwotCXN5bWJvbHM6IHRoZXkgYXJlIGxlZnQgYWxvbmUgdW50aWwgcmVxdWlyZWQsIHRoZW4gcmVhZCBpbgotCWVuLW1hc3MgYW5kIHRyYW5zbGF0ZWQgaW50byBhbiBpbnRlcm5hbCBmb3JtLiAgQSBjb21tb24KLQlyb3V0aW5lIDw8YmZkX3BlcmZvcm1fcmVsb2NhdGlvbj4+IGFjdHMgdXBvbiB0aGUKLQljYW5vbmljYWwgZm9ybSB0byBkbyB0aGUgZml4dXAuCi0KLQlSZWxvY2F0aW9ucyBhcmUgbWFpbnRhaW5lZCBvbiBhIHBlciBzZWN0aW9uIGJhc2lzLAotCXdoaWxlIHN5bWJvbHMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgQkZEIGJhc2lzLgotCi0JQWxsIHRoYXQgYSBiYWNrIGVuZCBoYXMgdG8gZG8gdG8gZml0IHRoZSBCRkQgaW50ZXJmYWNlIGlzIHRvIGNyZWF0ZQotCWEgPDxzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnk+PiBmb3IgZWFjaCByZWxvY2F0aW9uCi0JaW4gYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIGFuZCBmaWxsIGluIHRoZSByaWdodCBiaXRzIG9mIHRoZSBzdHJ1Y3R1cmVzLgotCi1AbWVudQotQCogdHlwZWRlZiBhcmVsZW50OjoKLUAqIGhvd3RvIG1hbmFnZXI6OgotQGVuZCBtZW51Ci0KLSovCi0KLS8qIERPIGNvbXBpbGUgaW4gdGhlIHJlbG9jX2NvZGUgbmFtZSB0YWJsZSBmcm9tIGxpYmJmZC5oLiAgKi8KLSNkZWZpbmUgX0JGRF9NQUtFX1RBQkxFX2JmZF9yZWxvY19jb2RlX3JlYWwKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLS8qCi1ET0NERAotSU5PREUKLQl0eXBlZGVmIGFyZWxlbnQsIGhvd3RvIG1hbmFnZXIsIFJlbG9jYXRpb25zLCBSZWxvY2F0aW9ucwotCi1TVUJTRUNUSU9OCi0JdHlwZWRlZiBhcmVsZW50Ci0KLQlUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgYSByZWxvY2F0aW9uIGVudHJ5OgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMKLS57Ci0uICAgICAgIHsqIE5vIGVycm9ycyBkZXRlY3RlZCAqfQotLiAgYmZkX3JlbG9jX29rLAotLgotLiAgICAgICB7KiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgdGhlcmUgd2FzIGFuIG92ZXJmbG93LiAqfQotLiAgYmZkX3JlbG9jX292ZXJmbG93LAotLgotLiAgICAgICB7KiBUaGUgYWRkcmVzcyB0byByZWxvY2F0ZSB3YXMgbm90IHdpdGhpbiB0aGUgc2VjdGlvbiBzdXBwbGllZC4gKn0KLS4gIGJmZF9yZWxvY19vdXRvZnJhbmdlLAotLgotLiAgICAgICB7KiBVc2VkIGJ5IHNwZWNpYWwgZnVuY3Rpb25zICp9Ci0uICBiZmRfcmVsb2NfY29udGludWUsCi0uCi0uICAgICAgIHsqIFVuc3VwcG9ydGVkIHJlbG9jYXRpb24gc2l6ZSByZXF1ZXN0ZWQuICp9Ci0uICBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkLAotLgotLiAgICAgICB7KiBVbnVzZWQgKn0KLS4gIGJmZF9yZWxvY19vdGhlciwKLS4KLS4gICAgICAgeyogVGhlIHN5bWJvbCB0byByZWxvY2F0ZSBhZ2FpbnN0IHdhcyB1bmRlZmluZWQuICp9Ci0uICBiZmRfcmVsb2NfdW5kZWZpbmVkLAotLgotLiAgICAgICB7KiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgbWF5IG5vdCBiZSBvayAtIHByZXNlbnRseQotLiAgICAgICAgICBnZW5lcmF0ZWQgb25seSB3aGVuIGxpbmtpbmcgaTk2MCBjb2ZmIGZpbGVzIHdpdGggaTk2MCBiLm91dAotLiAgICAgICAgICBzeW1ib2xzLiAgSWYgdGhpcyB0eXBlIGlzIHJldHVybmVkLCB0aGUgZXJyb3JfbWVzc2FnZSBhcmd1bWVudAotLiAgICAgICAgICB0byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHdpbGwgYmUgc2V0LiAgKn0KLS4gIGJmZF9yZWxvY19kYW5nZXJvdXMKLS4gfQotLiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGU7Ci0uCi0uCi0udHlwZWRlZiBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkKLS57Ci0uICAgICAgIHsqIEEgcG9pbnRlciBpbnRvIHRoZSBjYW5vbmljYWwgdGFibGUgb2YgcG9pbnRlcnMgICp9Ci0uICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltX3B0cl9wdHI7Ci0uCi0uICAgICAgIHsqIG9mZnNldCBpbiBzZWN0aW9uICp9Ci0uICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0uCi0uICAgICAgIHsqIGFkZGVuZCBmb3IgcmVsb2NhdGlvbiB2YWx1ZSAqfQotLiAgYmZkX3ZtYSBhZGRlbmQ7Ci0uCi0uICAgICAgIHsqIFBvaW50ZXIgdG8gaG93IHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIHJlbG9jYXRpb24gKn0KLS4gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotLgotLn0gYXJlbGVudDsKLQotKi8KLQotLyoKLURFU0NSSVBUSU9OCi0KLSAgICAgICAgSGVyZSBpcyBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggb2YgdGhlIGZpZWxkcyB3aXRoaW4gYW4gPDxhcmVsZW50Pj46Ci0KLSAgICAgICAgbyA8PHN5bV9wdHJfcHRyPj4KLQotICAgICAgICBUaGUgc3ltYm9sIHRhYmxlIHBvaW50ZXIgcG9pbnRzIHRvIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sCi0gICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2NhdGlvbiByZXF1ZXN0LiAgSXQgaXMKLSAgICAgICAgdGhlIHBvaW50ZXIgaW50byB0aGUgdGFibGUgcmV0dXJuZWQgYnkgdGhlIGJhY2sgZW5kJ3MKLSAgICAgICAgPDxnZXRfc3ltdGFiPj4gYWN0aW9uLiBAeHJlZntTeW1ib2xzfS4gVGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkCi0gICAgICAgIHRocm91Z2ggYSBwb2ludGVyIHRvIGEgcG9pbnRlciBzbyB0aGF0IHRvb2xzIGxpa2UgdGhlIGxpbmtlcgotICAgICAgICBjYW4gZml4IHVwIGFsbCB0aGUgc3ltYm9scyBvZiB0aGUgc2FtZSBuYW1lIGJ5IG1vZGlmeWluZyBvbmx5Ci0gICAgICAgIG9uZSBwb2ludGVyLiBUaGUgcmVsb2NhdGlvbiByb3V0aW5lIGxvb2tzIGluIHRoZSBzeW1ib2wgYW5kCi0gICAgICAgIHVzZXMgdGhlIGJhc2Ugb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbCBpcyBhdHRhY2hlZCB0byBhbmQgdGhlCi0gICAgICAgIHZhbHVlIG9mIHRoZSBzeW1ib2wgYXMgdGhlIGluaXRpYWwgcmVsb2NhdGlvbiBvZmZzZXQuIElmIHRoZQotICAgICAgICBzeW1ib2wgcG9pbnRlciBpcyB6ZXJvLCB0aGVuIHRoZSBzZWN0aW9uIHByb3ZpZGVkIGlzIGxvb2tlZCB1cC4KLQotICAgICAgICBvIDw8YWRkcmVzcz4+Ci0KLSAgICAgICAgVGhlIDw8YWRkcmVzcz4+IGZpZWxkIGdpdmVzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmFzZSBvZgotICAgICAgICB0aGUgc2VjdGlvbiBkYXRhIHdoaWNoIG93bnMgdGhlIHJlbG9jYXRpb24gcmVjb3JkIHRvIHRoZSBmaXJzdAotICAgICAgICBieXRlIG9mIHJlbG9jYXRhYmxlIGluZm9ybWF0aW9uLiBUaGUgYWN0dWFsIGRhdGEgcmVsb2NhdGVkCi0gICAgICAgIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyBwb2ludDsgZm9yIGV4YW1wbGUsIGEgcmVsb2NhdGlvbgotICAgICAgICB0eXBlIHdoaWNoIG1vZGlmaWVzIHRoZSBib3R0b20gdHdvIGJ5dGVzIG9mIGEgZm91ciBieXRlIHdvcmQKLSAgICAgICAgd291bGQgbm90IHRvdWNoIHRoZSBmaXJzdCBieXRlIHBvaW50ZWQgdG8gaW4gYSBiaWcgZW5kaWFuCi0gICAgICAgIHdvcmxkLgotCi0JbyA8PGFkZGVuZD4+Ci0KLQlUaGUgPDxhZGRlbmQ+PiBpcyBhIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBiYWNrIGVuZCB0byBiZSBhZGRlZCAoISkKLQl0byB0aGUgcmVsb2NhdGlvbiBvZmZzZXQuIEl0cyBpbnRlcnByZXRhdGlvbiBpcyBkZXBlbmRlbnQgdXBvbgotCXRoZSBob3d0by4gRm9yIGV4YW1wbGUsIG9uIHRoZSA2OGsgdGhlIGNvZGU6Ci0KLQotfCAgICAgICAgY2hhciBmb29bXTsKLXwgICAgICAgIG1haW4oKQotfCAgICAgICAgICAgICAgICB7Ci18ICAgICAgICAgICAgICAgIHJldHVybiBmb29bMHgxMjM0NTY3OF07Ci18ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBDb3VsZCBiZSBjb21waWxlZCBpbnRvOgotCi18ICAgICAgICBsaW5rdyBmcCwjLTQKLXwgICAgICAgIG1vdmViIEBAIzEyMzQ1Njc4LGQwCi18ICAgICAgICBleHRibCBkMAotfCAgICAgICAgdW5sayBmcAotfCAgICAgICAgcnRzCi0KLQotICAgICAgICBUaGlzIGNvdWxkIGNyZWF0ZSBhIHJlbG9jIHBvaW50aW5nIHRvIDw8Zm9vPj4sIGJ1dCBsZWF2ZSB0aGUKLSAgICAgICAgb2Zmc2V0IGluIHRoZSBkYXRhLCBzb21ldGhpbmcgbGlrZToKLQotCi18UkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbLnRleHRdOgotfG9mZnNldCAgIHR5cGUgICAgICB2YWx1ZQotfDAwMDAwMDA2IDMyICAgICAgICBfZm9vCi18Ci18MDAwMDAwMDAgNGU1NiBmZmZjICAgICAgICAgIDsgbGlua3cgZnAsIy00Ci18MDAwMDAwMDQgMTAzOSAxMjM0IDU2NzggICAgIDsgbW92ZWIgQEAjMTIzNDU2NzgsZDAKLXwwMDAwMDAwYSA0OWMwICAgICAgICAgICAgICAgOyBleHRibCBkMAotfDAwMDAwMDBjIDRlNWUgICAgICAgICAgICAgICA7IHVubGsgZnAKLXwwMDAwMDAwZSA0ZTc1ICAgICAgICAgICAgICAgOyBydHMKLQotCi0gICAgICAgIFVzaW5nIGNvZmYgYW5kIGFuIDg4aywgc29tZSBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSBlbm91Z2gKLSAgICAgICAgc3BhY2UgaW4gdGhlbSB0byByZXByZXNlbnQgdGhlIGZ1bGwgYWRkcmVzcyByYW5nZSwgYW5kCi0gICAgICAgIHBvaW50ZXJzIGhhdmUgdG8gYmUgbG9hZGVkIGluIHR3byBwYXJ0cy4gU28geW91J2QgZ2V0IHNvbWV0aGluZyBsaWtlOgotCi0KLXwgICAgICAgIG9yLnUgICAgIHIxMyxyMCxoaTE2KF9mb28rMHgxMjM0NTY3OCkKLXwgICAgICAgIGxkLmIgICAgIHIyLHIxMyxsbzE2KF9mb28rMHgxMjM0NTY3OCkKLXwgICAgICAgIGptcCAgICAgIHIxCi0KLQotICAgICAgICBUaGlzIHNob3VsZCBjcmVhdGUgdHdvIHJlbG9jcywgYm90aCBwb2ludGluZyB0byA8PF9mb28+PiwgYW5kIHdpdGgKLSAgICAgICAgMHgxMjM0MDAwMCBpbiB0aGVpciBhZGRlbmQgZmllbGQuIFRoZSBkYXRhIHdvdWxkIGNvbnNpc3Qgb2Y6Ci0KLQotfFJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWy50ZXh0XToKLXxvZmZzZXQgICB0eXBlICAgICAgdmFsdWUKLXwwMDAwMDAwMiBIVlJUMTYgICAgX2ZvbysweDEyMzQwMDAwCi18MDAwMDAwMDYgTFZSVDE2ICAgIF9mb28rMHgxMjM0MDAwMAotfAotfDAwMDAwMDAwIDVkYTA1Njc4ICAgICAgICAgICA7IG9yLnUgcjEzLHIwLDB4NTY3OAotfDAwMDAwMDA0IDFjNGQ1Njc4ICAgICAgICAgICA7IGxkLmIgcjIscjEzLDB4NTY3OAotfDAwMDAwMDA4IGY0MDBjMDAxICAgICAgICAgICA7IGptcCByMQotCi0KLSAgICAgICAgVGhlIHJlbG9jYXRpb24gcm91dGluZSBkaWdzIG91dCB0aGUgdmFsdWUgZnJvbSB0aGUgZGF0YSwgYWRkcwotICAgICAgICBpdCB0byB0aGUgYWRkZW5kIHRvIGdldCB0aGUgb3JpZ2luYWwgb2Zmc2V0LCBhbmQgdGhlbiBhZGRzIHRoZQotICAgICAgICB2YWx1ZSBvZiA8PF9mb28+Pi4gTm90ZSB0aGF0IGFsbCAzMiBiaXRzIGhhdmUgdG8gYmUga2VwdCBhcm91bmQKLSAgICAgICAgc29tZXdoZXJlLCB0byBjb3BlIHdpdGggY2FycnkgZnJvbSBiaXQgMTUgdG8gYml0IDE2LgotCi0gICAgICAgIE9uZSBmdXJ0aGVyIGV4YW1wbGUgaXMgdGhlIHNwYXJjIGFuZCB0aGUgYS5vdXQgZm9ybWF0LiBUaGUKLSAgICAgICAgc3BhcmMgaGFzIGEgc2ltaWxhciBwcm9ibGVtIHRvIHRoZSA4OGssIGluIHRoYXQgc29tZQotICAgICAgICBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSByb29tIGZvciBhbiBlbnRpcmUgb2Zmc2V0LCBidXQgb24gdGhlCi0gICAgICAgIHNwYXJjIHRoZSBwYXJ0cyBhcmUgY3JlYXRlZCBpbiBvZGQgc2l6ZWQgbHVtcHMuIFRoZSBkZXNpZ25lcnMgb2YKLSAgICAgICAgdGhlIGEub3V0IGZvcm1hdCBjaG9zZSB0byBub3QgdXNlIHRoZSBkYXRhIHdpdGhpbiB0aGUgc2VjdGlvbgotICAgICAgICBmb3Igc3RvcmluZyBwYXJ0IG9mIHRoZSBvZmZzZXQ7IGFsbCB0aGUgb2Zmc2V0IGlzIGtlcHQgd2l0aGluCi0gICAgICAgIHRoZSByZWxvYy4gQW55dGhpbmcgaW4gdGhlIGRhdGEgc2hvdWxkIGJlIGlnbm9yZWQuCi0KLXwgICAgICAgIHNhdmUgJXNwLC0xMTIsJXNwCi18ICAgICAgICBzZXRoaSAlaGkoX2ZvbysweDEyMzQ1Njc4KSwlZzIKLXwgICAgICAgIGxkc2IgWyVnMislbG8oX2ZvbysweDEyMzQ1Njc4KV0sJWkwCi18ICAgICAgICByZXQKLXwgICAgICAgIHJlc3RvcmUKLQotICAgICAgICBCb3RoIHJlbG9jcyBjb250YWluIGEgcG9pbnRlciB0byA8PGZvbz4+LCBhbmQgdGhlIG9mZnNldHMKLSAgICAgICAgY29udGFpbiBqdW5rLgotCi0KLXxSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFsudGV4dF06Ci18b2Zmc2V0ICAgdHlwZSAgICAgIHZhbHVlCi18MDAwMDAwMDQgSEkyMiAgICAgIF9mb28rMHgxMjM0NTY3OAotfDAwMDAwMDA4IExPMTAgICAgICBfZm9vKzB4MTIzNDU2NzgKLXwKLXwwMDAwMDAwMCA5ZGUzYmY5MCAgICAgOyBzYXZlICVzcCwtMTEyLCVzcAotfDAwMDAwMDA0IDA1MDAwMDAwICAgICA7IHNldGhpICVoaShfZm9vKzApLCVnMgotfDAwMDAwMDA4IGYwNDhhMDAwICAgICA7IGxkc2IgWyVnMislbG8oX2ZvbyswKV0sJWkwCi18MDAwMDAwMGMgODFjN2UwMDggICAgIDsgcmV0Ci18MDAwMDAwMTAgODFlODAwMDAgICAgIDsgcmVzdG9yZQotCi0KLSAgICAgICAgbyA8PGhvd3RvPj4KLQotICAgICAgICBUaGUgPDxob3d0bz4+IGZpZWxkIGNhbiBiZSBpbWFnaW5lZCBhcyBhCi0gICAgICAgIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb24uIEl0IGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aGljaAotICAgICAgICBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB3aGF0IHRvIGRvIHdpdGggYWxsIG9mIHRoZSBvdGhlcgotICAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGUgcmVsb2MgcmVjb3JkIGFuZCBkYXRhIHNlY3Rpb24uIEEgYmFjayBlbmQKLSAgICAgICAgd291bGQgbm9ybWFsbHkgaGF2ZSBhIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb24gc2V0IGFuZCB0dXJuCi0gICAgICAgIHJlbG9jYXRpb25zIGludG8gcG9pbnRlcnMgdG8gdGhlIGNvcnJlY3Qgc3RydWN0dXJlIG9uIGlucHV0IC0KLSAgICAgICAgYnV0IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSBlYWNoIGhvd3RvIGZpZWxkIG9uIGRlbWFuZC4KLQotKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQk8PGVudW0gY29tcGxhaW5fb3ZlcmZsb3c+PgotCi0JSW5kaWNhdGVzIHdoYXQgc29ydCBvZiBvdmVyZmxvdyBjaGVja2luZyBzaG91bGQgYmUgZG9uZSB3aGVuCi0JcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uCi0KLUNPREVfRlJBR01FTlQKLS4KLS5lbnVtIGNvbXBsYWluX292ZXJmbG93Ci0uewotLgl7KiBEbyBub3QgY29tcGxhaW4gb24gb3ZlcmZsb3cuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd19kb250LAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgYml0ZmllbGQgb3ZlcmZsb3dzLCB3aGV0aGVyIGl0IGlzIGNvbnNpZGVyZWQKLS4JICAgYXMgc2lnbmVkIG9yIHVuc2lnbmVkLiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0uCi0uCXsqIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIHNpZ25lZAotLgkgICBudW1iZXIuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0uCi0uCXsqIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIGFuCi0uCSAgIHVuc2lnbmVkIG51bWJlci4gKn0KLS4gIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkCi0ufTsKLQotKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLSAgICAgICAgPDxyZWxvY19ob3d0b190eXBlPj4KLQotICAgICAgICBUaGUgPDxyZWxvY19ob3d0b190eXBlPj4gaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYWxsIHRoZQotICAgICAgICBpbmZvcm1hdGlvbiB0aGF0IGxpYmJmZCBuZWVkcyB0byBrbm93IHRvIHRpZSB1cCBhIGJhY2sgZW5kJ3MgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLnN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7CQl7KiBGb3J3YXJkIGRlY2xhcmF0aW9uICp9Ci0uCi0uc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAotLnsKLS4gICAgICAgeyogIFRoZSB0eXBlIGZpZWxkIGhhcyBtYWlubHkgYSBkb2N1bWVudGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCi0uICAgICAgICAgICBkbyB3aGF0IGl0IHdhbnRzIHdpdGggaXQsIHRob3VnaCBub3JtYWxseSB0aGUgYmFjayBlbmQncwotLiAgICAgICAgICAgZXh0ZXJuYWwgaWRlYSBvZiB3aGF0IGEgcmVsb2MgbnVtYmVyIGlzIHN0b3JlZAotLiAgICAgICAgICAgaW4gdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgUEMgcmVsYXRpdmUgd29yZCByZWxvY2F0aW9uCi0uICAgICAgICAgICBpbiBhIGNvZmYgZW52aXJvbm1lbnQgaGFzIHRoZSB0eXBlIDAyMyAtIGJlY2F1c2UgdGhhdCdzCi0uICAgICAgICAgICB3aGF0IHRoZSBvdXRzaWRlIHdvcmxkIGNhbGxzIGEgUl9QQ1JXT1JEIHJlbG9jLiAqfQotLiAgdW5zaWduZWQgaW50IHR5cGU7Ci0uCi0uICAgICAgIHsqICBUaGUgdmFsdWUgdGhlIGZpbmFsIHJlbG9jYXRpb24gaXMgc2hpZnRlZCByaWdodCBieS4gVGhpcyBkcm9wcwotLiAgICAgICAgICAgdW53YW50ZWQgZGF0YSBmcm9tIHRoZSByZWxvY2F0aW9uLiAgKn0KLS4gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotLgotLgl7KiAgVGhlIHNpemUgb2YgdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyAqbm90KiBhCi0uCSAgICBwb3dlci1vZi10d28gbWVhc3VyZS4gIFRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkCi0uCSAgICBvbiBieSBhIHR5cGUgb2YgcmVsb2NhdGlvbiwgdXNlIGJmZF9nZXRfcmVsb2Nfc2l6ZS4gICp9Ci0uICBpbnQgc2l6ZTsKLS4KLS4gICAgICAgeyogIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzIHVzZWQKLS4JICAgIHdoZW4gZG9pbmcgb3ZlcmZsb3cgY2hlY2tpbmcuICAqfQotLiAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0uCi0uICAgICAgIHsqICBOb3RlcyB0aGF0IHRoZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUKLS4gICAgICAgICAgIGRhdGEgc2VjdGlvbiBvZiB0aGUgYWRkZW5kLiBUaGUgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aWxsCi0uICAgICAgICAgICBzdWJ0cmFjdCBmcm9tIHRoZSByZWxvY2F0aW9uIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgotLiAgICAgICAgICAgYmVpbmcgcmVsb2NhdGVkLiAqfQotLiAgYm9vbGVhbiBwY19yZWxhdGl2ZTsKLS4KLS4JeyogIFRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIHJlbG9jIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbi4KLS4JICAgIFRoZSByZWxvY2F0ZWQgdmFsdWUgaXMgbGVmdCBzaGlmdGVkIGJ5IHRoaXMgYW1vdW50LiAqfQotLiAgdW5zaWduZWQgaW50IGJpdHBvczsKLS4KLS4JeyogV2hhdCB0eXBlIG9mIG92ZXJmbG93IGVycm9yIHNob3VsZCBiZSBjaGVja2VkIGZvciB3aGVuCi0uCSAgIHJlbG9jYXRpbmcuICp9Ci0uICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGNvbXBsYWluX29uX292ZXJmbG93OwotLgotLiAgICAgICB7KiBJZiB0aGlzIGZpZWxkIGlzIG5vbiBudWxsLCB0aGVuIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBpcwotLiAgICAgICAgICBjYWxsZWQgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgcmVhbGx5Ci0uICAgICAgICAgIHN0cmFuZ2UgcmVsb2NhdGlvbiBtZXRob2RzIHRvIGJlIGFjY29tb2RhdGVkIChlLmcuLCBpOTYwIGNhbGxqCi0uICAgICAgICAgIGluc3RydWN0aW9ucykuICp9Ci0uICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgKCpzcGVjaWFsX2Z1bmN0aW9uKQotLgkJCQkgICAgUEFSQU1TICgoYmZkICphYmZkLAotLgkJCQkJICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotLgotLiAgICAgICB7KiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICp9Ci0uICBjaGFyICpuYW1lOwotLgotLiAgICAgICB7KiBXaGVuIHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmssIHNvbWUgZm9ybWF0cyBtdXN0IG1vZGlmeSB0aGUKLS4gICAgICAgICAgcmVsb2NhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRhdGEgLSB0aGlzIGZsYWcgc2lnbmFscyB0aGlzLip9Ci0uICBib29sZWFuIHBhcnRpYWxfaW5wbGFjZTsKLS4KLS4gICAgICAgeyogVGhlIHNyY19tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIHJlYWQgaW4gZGF0YQotLiAgICAgICAgICBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbiBzdW0uICBFLmcuLCBpZiB0aGlzIHdhcyBhbiA4IGJpdAotLiAgICAgICAgICBiaXQgb2YgZGF0YSB3aGljaCB3ZSByZWFkIGFuZCByZWxvY2F0ZWQsIHRoaXMgd291bGQgYmUKLS4gICAgICAgICAgMHgwMDAwMDBmZi4gV2hlbiB3ZSBoYXZlIHJlbG9jcyB3aGljaCBoYXZlIGFuIGFkZGVuZCwgc3VjaCBhcwotLiAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCi0uICAgICAgICAgIHJlbG9jYXRpbmcgZmllbGQgaXMgZ2FyYmFnZSBzbyB3ZSBuZXZlciB1c2UgaXQuIEluIHRoaXMgY2FzZQotLiAgICAgICAgICB0aGUgbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAqfQotLiAgYmZkX3ZtYSBzcmNfbWFzazsKLS4KLS4gICAgICAgeyogVGhlIGRzdF9tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSByZXBsYWNlZAotLiAgICAgICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gSW4gbW9zdCBjYXNlcyBzcmNfbWFzayA9PSBkc3RfbWFzaywKLS4gICAgICAgICAgZXhjZXB0IGluIHRoZSBhYm92ZSBzcGVjaWFsIGNhc2UsIHdoZXJlIGRzdF9tYXNrIHdvdWxkIGJlCi0uICAgICAgICAgIDB4MDAwMDAwZmYsIGFuZCBzcmNfbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAgICp9Ci0uICBiZmRfdm1hIGRzdF9tYXNrOwotLgotLiAgICAgICB7KiBXaGVuIHNvbWUgZm9ybWF0cyBjcmVhdGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zLCB0aGV5IGxlYXZlCi0uICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcGMgb2YgdGhlIHBsYWNlIGJlaW5nIHJlbG9jYXRlZCBpbiB0aGUgb2Zmc2V0Ci0uICAgICAgICAgIHNsb3Qgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB0aGF0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBjYW4KLS4gICAgICAgICAgYmUgbWFkZSBqdXN0IGJ5IGFkZGluZyBpbiBhbiBvcmRpbmFyeSBvZmZzZXQgKGUuZy4sIHN1bjMgYS5vdXQpLgotLiAgICAgICAgICBTb21lIGZvcm1hdHMgbGVhdmUgdGhlIGRpc3BsYWNlbWVudCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uCi0uICAgICAgICAgIGVtcHR5IChlLmcuLCBtODhrIGJjcyk7IHRoaXMgZmxhZyBzaWduYWxzIHRoZSBmYWN0Lip9Ci0uICBib29sZWFuIHBjcmVsX29mZnNldDsKLS4KLS59OwotCi0qLwotCi0vKgotRlVOQ1RJT04KLQlUaGUgSE9XVE8gTWFjcm8KLQotREVTQ1JJUFRJT04KLQlUaGUgSE9XVE8gZGVmaW5lIGlzIGhvcnJpYmxlIGFuZCB3aWxsIGdvIGF3YXkuCi0KLQotLiNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBPLCBTRiwgTkFNRSwgSU5QTEFDRSwgTUFTS1NSQywgTUFTS0RTVCwgUEMpIFwKLS4gIHsodW5zaWduZWQpQyxSLFMsQiwgUCwgQkksIE8sU0YsTkFNRSxJTlBMQUNFLE1BU0tTUkMsTUFTS0RTVCxQQ30KLQotREVTQ1JJUFRJT04KLQlBbmQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b3RhbGx5IG1hZ2ljIHdheS4gQnV0IGZvciB0aGUKLQltb21lbnQsIHdlIGFyZSBjb21wYXRpYmxlLCBzbyBkbyBpdCB0aGlzIHdheS4KLQotCi0uI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCxGVU5DVElPTiwgTkFNRSxmYWxzZSwwLDAsSU4pCi0uCi1ERVNDUklQVElPTgotCUhlbHBlciByb3V0aW5lIHRvIHR1cm4gYSBzeW1ib2wgaW50byBhIHJlbG9jYXRpb24gdmFsdWUuCi0KLS4jZGVmaW5lIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sKSAgICAgIFwKLS4gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gIGlmIChzeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKSB7ICAgICAgICAgICAgIFwKLS4gICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkgeyBcCi0uICAgICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7ICAgICAgICAgICAgICBcCi0uICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0ufQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3JlbG9jX3NpemUKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0b190eXBlICopOwotCi1ERVNDUklQVElPTgotCUZvciBhIHJlbG9jX2hvd3RvX3R5cGUgdGhhdCBvcGVyYXRlcyBvbiBhIGZpeGVkIG51bWJlciBvZiBieXRlcywKLQl0aGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZCBvbi4KLSAqLwotCi11bnNpZ25lZCBpbnQKLWJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6IHJldHVybiAxOwotICAgIGNhc2UgMTogcmV0dXJuIDI7Ci0gICAgY2FzZSAyOiByZXR1cm4gNDsKLSAgICBjYXNlIDM6IHJldHVybiAwOwotICAgIGNhc2UgNDogcmV0dXJuIDg7Ci0gICAgY2FzZSA4OiByZXR1cm4gMTY7Ci0gICAgY2FzZSAtMjogcmV0dXJuIDQ7Ci0gICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKgotVFlQRURFRgotCWFyZWxlbnRfY2hhaW4KLQotREVTQ1JJUFRJT04KLQotCUhvdyByZWxvY3MgYXJlIHRpZWQgdG9nZXRoZXIgaW4gYW4gPDxhc2VjdGlvbj4+OgotCi0udHlwZWRlZiBzdHJ1Y3QgcmVsZW50X2NoYWluIHsKLS4gIGFyZWxlbnQgcmVsZW50OwotLiAgc3RydWN0ICAgcmVsZW50X2NoYWluICpuZXh0OwotLn0gYXJlbGVudF9jaGFpbjsKLQotKi8KLQotLyogTl9PTkVTIHByb2R1Y2VzIE4gb25lIGJpdHMsIHdpdGhvdXQgb3ZlcmZsb3dpbmcgbWFjaGluZSBhcml0aG1ldGljLiAgKi8KLSNkZWZpbmUgTl9PTkVTKG4pICgoKCgoYmZkX3ZtYSkgMSA8PCAoKG4pIC0gMSkpIC0gMSkgPDwgMSkgfCAxKQotCi0vKgotRlVOQ1RJT04KLQliZmRfY2hlY2tfb3ZlcmZsb3cKLQotU1lOT1BTSVMKLQliZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQkJYmZkX2NoZWNrX292ZXJmbG93Ci0JCQkoZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3csCi0JCQkgdW5zaWduZWQgaW50IGJpdHNpemUsCi0JCQkgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQsCi0JCQkgdW5zaWduZWQgaW50IGFkZHJzaXplLAotCQkJIGJmZF92bWEgcmVsb2NhdGlvbik7Ci0KLURFU0NSSVBUSU9OCi0JUGVyZm9ybSBvdmVyZmxvdyBjaGVja2luZyBvbiBAdmFye3JlbG9jYXRpb259IHdoaWNoIGhhcwotCUB2YXJ7Yml0c2l6ZX0gc2lnbmlmaWNhbnQgYml0cyBhbmQgd2lsbCBiZSBzaGlmdGVkIHJpZ2h0IGJ5Ci0JQHZhcntyaWdodHNoaWZ0fSBiaXRzLCBvbiBhIG1hY2hpbmUgd2l0aCBhZGRyZXNzZXMgY29udGFpbmluZwotCUB2YXJ7YWRkcnNpemV9IHNpZ25pZmljYW50IGJpdHMuICBUaGUgcmVzdWx0IGlzIGVpdGhlciBvZgotCUBjb2Rle2JmZF9yZWxvY19va30gb3IgQGNvZGV7YmZkX3JlbG9jX292ZXJmbG93fS4KLQotKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfY2hlY2tfb3ZlcmZsb3cgKGhvdywgYml0c2l6ZSwgcmlnaHRzaGlmdCwgYWRkcnNpemUsIHJlbG9jYXRpb24pCi0gICAgIGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgaG93OwotICAgICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLSAgICAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQ7Ci0gICAgIHVuc2lnbmVkIGludCBhZGRyc2l6ZTsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotewotICBiZmRfdm1hIGZpZWxkbWFzaywgYWRkcm1hc2ssIHNpZ25tYXNrLCBzcywgYTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0KLSAgYSA9IHJlbG9jYXRpb247Ci0KLSAgLyogTm90ZTogQklUU0laRSBzaG91bGQgYWx3YXlzIGJlIDw9IEFERFJTSVpFLCBidXQgaW4gY2FzZSBpdCdzIG5vdCwKLSAgICAgd2UnbGwgYmUgcGVybWlzc2l2ZTogZXh0cmEgYml0cyBpbiB0aGUgZmllbGQgbWFzayB3aWxsCi0gICAgIGF1dG9tYXRpY2FsbHkgZXh0ZW5kIHRoZSBhZGRyZXNzIG1hc2sgZm9yIHB1cnBvc2VzIG9mIHRoZQotICAgICBvdmVyZmxvdyBjaGVjay4gICovCi0gIGZpZWxkbWFzayA9IE5fT05FUyAoYml0c2l6ZSk7Ci0gIGFkZHJtYXNrID0gTl9PTkVTIChhZGRyc2l6ZSkgfCBmaWVsZG1hc2s7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfZG9udDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0gICAgICAvKiBJZiBhbnkgc2lnbiBiaXRzIGFyZSBzZXQsIGFsbCBzaWduIGJpdHMgbXVzdCBiZSBzZXQuICBUaGF0Ci0gICAgICAgICBpcywgQSBtdXN0IGJlIGEgdmFsaWQgbmVnYXRpdmUgYWRkcmVzcyBhZnRlciBzaGlmdGluZy4gICovCi0gICAgICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKLSAgICAgIHNpZ25tYXNrID0gfiAoZmllbGRtYXNrID4+IDEpOwotICAgICAgc3MgPSBhICYgc2lnbm1hc2s7Ci0gICAgICBpZiAoc3MgIT0gMCAmJiBzcyAhPSAoKGFkZHJtYXNrID4+IHJpZ2h0c2hpZnQpICYgc2lnbm1hc2spKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0gICAgICAvKiBXZSBoYXZlIGFuIG92ZXJmbG93IGlmIHRoZSBhZGRyZXNzIGRvZXMgbm90IGZpdCBpbiB0aGUgZmllbGQuICAqLwotICAgICAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0gICAgICBpZiAoKGEgJiB+IGZpZWxkbWFzaykgIT0gMCkKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotICAgICAgLyogQml0ZmllbGRzIGFyZSBzb21ldGltZXMgc2lnbmVkLCBzb21ldGltZXMgdW5zaWduZWQuICBXZQotICAgICAgICAgb3ZlcmZsb3cgaWYgdGhlIHZhbHVlIGhhcyBzb21lLCBidXQgbm90IGFsbCwgYml0cyBzZXQgb3V0c2lkZQotICAgICAgICAgdGhlIGZpZWxkLCBvciBpZiBpdCBoYXMgYW55IGJpdHMgc2V0IG91dHNpZGUgdGhlIGZpZWxkIGJ1dAotICAgICAgICAgdGhlIHNpZ24gYml0IGlzIG5vdCBzZXQuICAqLwotICAgICAgYSA+Pj0gcmlnaHRzaGlmdDsKLSAgICAgIGlmICgoYSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCXsKLQkgIHNpZ25tYXNrID0gKGZpZWxkbWFzayA+PiAxKSArIDE7Ci0JICBzcyA9IChzaWdubWFzayA8PCByaWdodHNoaWZ0KSAtIDE7Ci0JICBpZiAoKHNzIHwgcmVsb2NhdGlvbikgIT0gfiAoYmZkX3ZtYSkgMCkKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24KLQotU1lOT1BTSVMKLQliZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLSAgICAgICAgICAgICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCSBjaGFyICoqZXJyb3JfbWVzc2FnZSk7Ci0KLURFU0NSSVBUSU9OCi0JSWYgQHZhcntvdXRwdXRfYmZkfSBpcyBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uLCB0aGUKLQlnZW5lcmF0ZWQgaW1hZ2Ugd2lsbCBiZSByZWxvY2F0YWJsZTsgdGhlIHJlbG9jYXRpb25zIGFyZQotCWNvcGllZCB0byB0aGUgb3V0cHV0IGZpbGUgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gY2hhbmdlZCB0bwotCXJlZmxlY3QgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgd29ybGQuIFRoZXJlIGFyZSB0d28gd2F5cyBvZgotCXJlZmxlY3RpbmcgdGhlIHJlc3VsdHMgb2YgcGFydGlhbCBsaW5rYWdlIGluIGFuIG91dHB1dCBmaWxlOgotCWJ5IG1vZGlmeWluZyB0aGUgb3V0cHV0IGRhdGEgaW4gcGxhY2UsIGFuZCBieSBtb2RpZnlpbmcgdGhlCi0JcmVsb2NhdGlvbiByZWNvcmQuICBTb21lIG5hdGl2ZSBmb3JtYXRzIChlLmcuLCBiYXNpYyBhLm91dCBhbmQKLQliYXNpYyBjb2ZmKSBoYXZlIG5vIHdheSBvZiBzcGVjaWZ5aW5nIGFuIGFkZGVuZCBpbiB0aGUKLQlyZWxvY2F0aW9uIHR5cGUsIHNvIHRoZSBhZGRlbmQgaGFzIHRvIGdvIGluIHRoZSBvdXRwdXQgZGF0YS4KLQlUaGlzIGlzIG5vIGJpZyBkZWFsIHNpbmNlIGluIHRoZXNlIGZvcm1hdHMgdGhlIG91dHB1dCBkYXRhCi0Jc2xvdCB3aWxsIGFsd2F5cyBiZSBiaWcgZW5vdWdoIGZvciB0aGUgYWRkZW5kLiBDb21wbGV4IHJlbG9jCi0JdHlwZXMgd2l0aCBhZGRlbmRzIHdlcmUgaW52ZW50ZWQgdG8gc29sdmUganVzdCB0aGlzIHByb2JsZW0uCi0JVGhlIEB2YXJ7ZXJyb3JfbWVzc2FnZX0gYXJndW1lbnQgaXMgc2V0IHRvIGFuIGVycm9yIG1lc3NhZ2UgaWYKLQl0aGlzIHJldHVybiBAY29kZXtiZmRfcmVsb2NfZGFuZ2Vyb3VzfS4KLQotKi8KLQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBhc3ltYm9sICpzeW1ib2w7Ci0KLSAgc3ltYm9sID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgcmV0dXJuIGFuIGVycm9yIGlmCi0gICAgIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQuICBBbiB1bmRlZmluZWQgd2VhayBzeW1ib2wgaXMKLSAgICAgY29uc2lkZXJlZCB0byBoYXZlIGEgdmFsdWUgb2YgemVybyAoU1ZSNCBBQkksIHAuIDQtMjcpLiAgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBmdW5jdGlvbiBzdXBwbGllZCB0byBoYW5kbGUgdGhpcyByZWxvY2F0aW9uIHR5cGUsCi0gICAgIGNhbGwgaXQuICBJdCdsbCByZXR1cm4gYGJmZF9yZWxvY19jb250aW51ZScgaWYgZnVydGhlciBwcm9jZXNzaW5nCi0gICAgIGNhbiBiZSBkb25lLiAgKi8KLSAgaWYgKGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uKQotICAgIHsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb250OwotICAgICAgY29udCA9IGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCQkJICAgICAgZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBpZiAoY29udCAhPSBiZmRfcmVsb2NfY29udGludWUpCi0JcmV0dXJuIGNvbnQ7Ci0gICAgfQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICBXZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OCi0JIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYW5kIHRoZQotCSBsb2NhdGlvbi4gIFJFTE9DQVRJT04gaXMgYWxyZWFkeSB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLgotCi0JIFdlIHN0YXJ0IGJ5IHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcKLQkgdGhlIGxvY2F0aW9uLgotCi0JIElmIHBjcmVsX29mZnNldCBpcyBzZXQsIHdlIG11c3QgZnVydGhlciBzdWJ0cmFjdCB0aGUgcG9zaXRpb24KLQkgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFNvbWUgdGFyZ2V0cyBhcnJhbmdlIGZvcgotCSB0aGUgYWRkZW5kIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uCi0JIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIGV4YW1wbGUsIGkzODYtYW91dCBkb2VzIHRoaXMuICBGb3IKLQkgaTM4Ni1hb3V0LCBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBTb21lIG90aGVyIHRhcmdldHMgZG8gbm90Ci0JIGluY2x1ZGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbjsgZm9yIGV4YW1wbGUsIG04OGtiY3MsCi0JIG9yIEVMRi4gIEZvciB0aG9zZSB0YXJnZXRzLCBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4KLQotCSBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZW4gd2UgbXVzdCBlbnN1cmUKLQkgdGhhdCB0aGlzIHJlbG9jIHdpbGwgYmUgY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gdGhlIGZpbmFsCi0JIHJlbG9jYXRpb24gaXMgZG9uZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSB3YW50IHRvIHdpbmQKLQkgdXAgd2l0aCB0aGUgbmVnYXRpdmUgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwKLQkgd2hpY2ggbWVhbnMgd2UgbXVzdCBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBieSB0aGUgY2hhbmdlCi0JIGluIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBJZiBwY3JlbF9vZmZzZXQgaXMgdHJ1ZQotCSB3ZSBkbyBub3Qgd2FudCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBhdCBhbGwuCi0KLQkgRklYTUU6IFRoaXMgc2VlbXMgbG9naWNhbCB0byBtZSwgYnV0IGZvciB0aGUgY2FzZSBvZgotCSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBpdCBpcyBub3Qgd2hhdCB0aGUgY29kZQotCSBhY3R1YWxseSBkb2VzLiAgSSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBzZWVtcwotCSBmYXIgdG9vIGxpa2VseSB0aGF0IHNvbWV0aGluZyB3aWxsIGJyZWFrLiAgKi8KLQotICAgICAgcmVsb2NhdGlvbiAtPQotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUgcmVsb2NhdGlvbgotCSAgICAgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSAgICAgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGZsYWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGJ1dCBpbnBsYWNlLCBzbyBtb2RpZnkgdGhlCi0JICAgICByZWxvYyByZWNvcmQgYSBiaXQuCi0KLQkgICAgIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgICAgIGludG8gYSByZWYgdG8gdGhlIHNlY3Rpb24gYmVsb25naW5nIHRvIHRoZSBzeW1ib2wuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0JICAvKiBXVEY/PyAqLwotCSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmLXJzNjAwMCIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWxpdHRsZSIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWJpZyIpICE9IDApCi0JICAgIHsKLSNpZiAxCi0JICAgICAgLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLQkJIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotCQkgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250Ci0gICAgICAmJiBmbGFnID09IGJmZF9yZWxvY19vaykKLSAgICBmbGFnID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkgICAgICAgaG93dG8tPmJpdHNpemUsCi0JCQkgICAgICAgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkgICAgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCksCi0JCQkgICAgICAgcmVsb2NhdGlvbik7Ci0KLSAgLyoKLSAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKLSAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKLSAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKLSAgICAqLwotCi0gIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCi0gICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKLSAgICAgZm9sbG93aW5nIHByb2dyYW06Ci0KLSAgICAgc3RydWN0IHN0cgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgaW50IGkwOwotICAgICB9IHMgPSB7IDAgfTsKLQotICAgICBpbnQKLSAgICAgbWFpbiAoKQotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgeCA9IDB4MTAwMDAwMDAwOwotICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOwotICAgICAgIGlmICh4ID09IDApCi0JIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICAgZWxzZQotCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOwotICAgICB9Ci0gICAgICovCi0KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0gIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KLQotICAvKiBXaGF0IHdlIGRvOgotICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKLSAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCi0gICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKLSAgICAgUyBzcmMgbWFzawotICAgICBEIGRzdCBtYXNrCi0gICAgIE4gfmRzdCBtYXNrCi0gICAgIEEgcGFydCAxCi0gICAgIEIgcGFydCAyCi0gICAgIFIgcmVzdWx0Ci0KLSAgICAgRG8gdGhpczoKLSAgICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgICAgICAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgICAgICAgICAgUyBTIFMgUyBTICAgIHRvIGdldCB0aGUgc2l6ZSBvZmZzZXQgd2Ugd2FudAotICAgICArICAgciByIHIgciByIHIgciByIHIgciAgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZSB0byBwbGFjZQotICAgICBhbmQgICAgICAgICAgIEQgRCBEIEQgRCAgdG8gY2hvcCB0byByaWdodCBzaXplCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIEEgQSBBIEEgQQotICAgICBBbmQgdGhpczoKLSAgICAgLi4uICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgIE4gTiBOIE4gTiAgICAgICAgICAgIGdldCBpbnN0cnVjdGlvbgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAuLi4gICBCIEIgQiBCIEIKLQotICAgICBBbmQgdGhlbjoKLSAgICAgQiBCIEIgQiBCCi0gICAgIG9yICAgICAgICAgICAgICBBIEEgQSBBIEEKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgUiBSIFIgUiBSIFIgUiBSIFIgUiAgICAgICAgcHV0IGludG8gYmZkX3B1dDxzaXplPgotICAgICAqLwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyAgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHsKLQljaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIChjaGFyICopIGRhdGEgKyBhZGRyKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzggKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgewotCXNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMTYgKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIC0yOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgLTE6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogRG8gbm90aGluZyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0jaWZkZWYgQkZENjQKLSAgICAgIHsKLQliZmRfdm1hIHggPSBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfNjQgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotICAgIH0KLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2luc3RhbGxfcmVsb2NhdGlvbgotCi1TWU5PUFNJUwotCWJmZF9yZWxvY19zdGF0dXNfdHlwZQotICAgICAgICAgICAgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsIGJmZF92bWEgZGF0YV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCSBjaGFyICoqZXJyb3JfbWVzc2FnZSk7Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyBsb29rcyByZW1hcmthYmx5IGxpa2UgPDxiZmRfcGVyZm9ybV9yZWxvY2F0aW9uPj4sIGV4Y2VwdCBpdAotCWRvZXMgbm90IGV4cGVjdCB0aGF0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiBmaWxsZWQgaW4uCi0JSS5lLiwgaXQncyBzdWl0YWJsZSBmb3IgdXNlIHdoZW4gY3JlYXRpbmcsIHJhdGhlciB0aGFuIGFwcGx5aW5nCi0JYSByZWxvY2F0aW9uLgotCi0JRm9yIG5vdywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCByZXNlcnZlZCBmb3IgdGhlCi0JYXNzZW1ibGVyLgotCi0qLwotCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2luc3RhbGxfcmVsb2NhdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIGRhdGFfc3RhcnQsIGRhdGFfc3RhcnRfb2Zmc2V0LAotCQkJaW5wdXRfc2VjdGlvbiwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIGRhdGFfc3RhcnQ7Ci0gICAgIGJmZF92bWEgZGF0YV9zdGFydF9vZmZzZXQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICBiZmRfYnl0ZSAqZGF0YTsKLQotICBzeW1ib2wgPSAqKHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0cik7Ci0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgZnVuY3Rpb24gc3VwcGxpZWQgdG8gaGFuZGxlIHRoaXMgcmVsb2NhdGlvbiB0eXBlLAotICAgICBjYWxsIGl0LiAgSXQnbGwgcmV0dXJuIGBiZmRfcmVsb2NfY29udGludWUnIGlmIGZ1cnRoZXIgcHJvY2Vzc2luZwotICAgICBjYW4gYmUgZG9uZS4gICovCi0gIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29udDsKLSAgCi0gICAgICAvKiBYWFggLSBUaGUgc3BlY2lhbF9mdW5jdGlvbiBjYWxscyBoYXZlbid0IGJlZW4gZml4ZWQgdXAgdG8gZGVhbAotCSB3aXRoIGNyZWF0aW5nIG5ldyByZWxvY2F0aW9ucyBhbmQgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBjb250ID0gaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsCi0JCQkJICAgICAgLyogWFhYIC0gTm9uLXBvcnRhYmxlISAqLwotCQkJCSAgICAgICgoYmZkX2J5dGUgKikgZGF0YV9zdGFydAotCQkJCSAgICAgICAtIGRhdGFfc3RhcnRfb2Zmc2V0KSwKLQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBhYmZkLCBlcnJvcl9tZXNzYWdlKTsKLSAgICAgIGlmIChjb250ICE9IGJmZF9yZWxvY19jb250aW51ZSkKLQlyZXR1cm4gY29udDsKLSAgICB9Ci0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgV2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTgotCSB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFuZCB0aGUKLQkgbG9jYXRpb24uICBSRUxPQ0FUSU9OIGlzIGFscmVhZHkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KLQotCSBXZSBzdGFydCBieSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nCi0JIHRoZSBsb2NhdGlvbi4KLQotCSBJZiBwY3JlbF9vZmZzZXQgaXMgc2V0LCB3ZSBtdXN0IGZ1cnRoZXIgc3VidHJhY3QgdGhlIHBvc2l0aW9uCi0JIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBTb21lIHRhcmdldHMgYXJyYW5nZSBmb3IKLQkgdGhlIGFkZGVuZCB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbgotCSB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBleGFtcGxlLCBpMzg2LWFvdXQgZG9lcyB0aGlzLiAgRm9yCi0JIGkzODYtYW91dCwgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgU29tZSBvdGhlciB0YXJnZXRzIGRvIG5vdAotCSBpbmNsdWRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb247IGZvciBleGFtcGxlLCBtODhrYmNzLAotCSBvciBFTEYuICBGb3IgdGhvc2UgdGFyZ2V0cywgcGNyZWxfb2Zmc2V0IGlzIHRydWUuCi0KLQkgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGVuIHdlIG11c3QgZW5zdXJlCi0JIHRoYXQgdGhpcyByZWxvYyB3aWxsIGJlIGNvcnJlY3RseSBjb21wdXRlZCB3aGVuIHRoZSBmaW5hbAotCSByZWxvY2F0aW9uIGlzIGRvbmUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2Ugd2FudCB0byB3aW5kCi0JIHVwIHdpdGggdGhlIG5lZ2F0aXZlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sCi0JIHdoaWNoIG1lYW5zIHdlIG11c3QgYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYnkgdGhlIGNoYW5nZQotCSBpbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIHRydWUKLQkgd2UgZG8gbm90IHdhbnQgdG8gYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYXQgYWxsLgotCi0JIEZJWE1FOiBUaGlzIHNlZW1zIGxvZ2ljYWwgdG8gbWUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLQkgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgaXQgaXMgbm90IHdoYXQgdGhlIGNvZGUKLQkgYWN0dWFsbHkgZG9lcy4gIEkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgc2VlbXMKLQkgZmFyIHRvbyBsaWtlbHkgdGhhdCBzb21ldGhpbmcgd2lsbCBicmVhay4gICovCi0KLSAgICAgIHJlbG9jYXRpb24gLT0KLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSAmJiBob3d0by0+cGFydGlhbF9pbnBsYWNlID09IHRydWUpCi0JcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gZmxhZzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBidXQgaW5wbGFjZSwgc28gbW9kaWZ5IHRoZQotCSByZWxvYyByZWNvcmQgYSBiaXQuCi0KLQkgSWYgd2UndmUgcmVsb2NhdGVkIHdpdGggYSBzeW1ib2wgd2l0aCBhIHNlY3Rpb24sIGNoYW5nZQotCSBpbnRvIGEgcmVmIHRvIHRoZSBzZWN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3ltYm9sLiAgKi8KLQotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgLyogV1RGPz8gKi8KLSAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmLXJzNjAwMCIpICE9IDAKLQkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgInhjb2ZmLXBvd2VybWFjIikgIT0gMAotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1saXR0bGUiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWJpZyIpICE9IDApCi0JewotI2lmIDEKLS8qIEZvciBtNjhrLWNvZmYsIHRoZSBhZGRlbmQgd2FzIGJlaW5nIHN1YnRyYWN0ZWQgdHdpY2UgZHVyaW5nCi0gICByZWxvY2F0aW9uIHdpdGggLXIuICBSZW1vdmluZyB0aGUgbGluZSBiZWxvdyB0aGlzIGNvbW1lbnQKLSAgIGZpeGVzIHRoYXQgcHJvYmxlbTsgc2VlIFBSIDI5NTMuCi0KLUhvd2V2ZXIsIElhbiB3cm90ZSB0aGUgZm9sbG93aW5nLCByZWdhcmRpbmcgcmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3csCi13aGljaCBleHBsYWlucyB3aHkgaXQgaXMgc3RpbGwgZW5hYmxlZDogIC0tZGptCi0KLUlmIHlvdSBwdXQgYSBwYXRjaCBsaWtlIHRoYXQgaW50byBCRkQgeW91IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBDT0ZGCi1saW5rZXJzLiAgSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHBhdGNoIHdpbGwgYnJlYWsgY29mZi1pMzg2IChlLmcuLAotU0NPKTsgc2VlIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYyB3aGVyZSBJIHdvcmtlZCBhcm91bmQgdGhlCi1wcm9ibGVtIGluIGEgZGlmZmVyZW50IHdheS4gIFRoZXJlIG1heSB2ZXJ5IHdlbGwgYmUgYSByZWFzb24gdGhhdCB0aGUKLWNvZGUgd29ya3MgYXMgaXQgZG9lcy4KLQotSG1tbS4gIFRoZSBmaXJzdCBvYnZpb3VzIHBvaW50IGlzIHRoYXQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBzaG91bGQKLW5vdCBoYXZlIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBmbGF2b3VyLiAgSXQncyBzZWVtIGxpa2UKLWVudGlyZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3Igc3VjaCBhIHRoaW5nLiAgVGhlIHNlY29uZCBvYnZpb3VzIHBvaW50Ci1pcyB0aGF0IHRoZSBjdXJyZW50IGNvZGUgaWdub3JlcyB0aGUgcmVsb2MgYWRkZW5kIHdoZW4gcHJvZHVjaW5nCi1yZWxvY2F0ZWFibGUgb3V0cHV0IGZvciBDT0ZGLiAgVGhhdCdzIHBlY3VsaWFyLiAgSW4gZmFjdCwgSSByZWFsbHkKLWhhdmUgbm8gaWRlYSB3aGF0IHRoZSBwb2ludCBvZiB0aGUgbGluZSB5b3Ugd2FudCB0byByZW1vdmUgaXMuCi0KLUEgdHlwaWNhbCBDT0ZGIHJlbG9jIHN1YnRyYWN0cyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIGFkZHMgaW4KLXRoZSBuZXcgdmFsdWUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZSAoaWYgaXQncyBhIHBjCi1yZWxhdGl2ZSByZWxvYyBpdCBhZGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlCi1sb2NhdGlvbikuICBXaGVuIHJlbG9jYXRpbmcgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGF0IHByb3BlcnR5LgotCi1CRkQgaGFuZGxlcyB0aGlzIGJ5IHNldHRpbmcgdGhlIGFkZGVuZCB0byB0aGUgbmVnYXRpdmUgb2YgdGhlIG9sZAotdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFVuZm9ydHVuYXRlbHkgaXQgaGFuZGxlcyBjb21tb24gc3ltYm9scyBpbiBhCi1ub24tc3RhbmRhcmQgd2F5IChpdCBkb2Vzbid0IHN1YnRyYWN0IHRoZSBvbGQgdmFsdWUpIGJ1dCB0aGF0J3MgYQotZGlmZmVyZW50IHN0b3J5ICh3ZSBjYW4ndCBjaGFuZ2UgaXQgd2l0aG91dCBsb3NpbmcgYmFja3dhcmQKLWNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb2JqZWN0IGZpbGVzKSAoY29mZi1pMzg2IGRvZXMgc3VidHJhY3QgdGhlIG9sZAotdmFsdWUsIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBjb2ZmLWkzODYgdGFyZ2V0cywgbGlrZSBTQ08pLgotCi1TbyBldmVyeXRoaW5nIHdvcmtzIGZpbmUgd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBXaGVuCi13ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGxvZ2ljYWxseSB3ZSBzaG91bGQgZG8gZXhhY3RseQotd2hhdCB3ZSBkbyB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoZXJlZm9yZSwgeW91cgotcGF0Y2ggaXMgY29ycmVjdC4gIEluIGZhY3QsIGl0IHNob3VsZCBwcm9iYWJseSBhbHdheXMganVzdCBzZXQKLXJlbG9jX2VudHJ5LT5hZGRlbmQgdG8gMCBmb3IgYWxsIGNhc2VzLCBzaW5jZSBpdCBpcywgaW4gZmFjdCwgZ29pbmcgdG8KLWFkZCB0aGUgdmFsdWUgaW50byB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIHdvbid0IGh1cnQgdGhlIENPRkYgY29kZSwKLXdoaWNoIGRvZXNuJ3QgdXNlIHRoZSBhZGRlbmQ7IEknbSBub3Qgc3VyZSB3aGF0IGl0IHdpbGwgZG8gdG8gb3RoZXIKLWZvcm1hdHMgKHRoZSB0aGluZyB0byBjaGVjayBmb3Igd291bGQgYmUgd2hldGhlciBhbnkgZm9ybWF0cyBib3RoIHVzZQotdGhlIGFkZGVuZCBhbmQgc2V0IHBhcnRpYWxfaW5wbGFjZSkuCi0KLVdoZW4gSSB3YW50ZWQgdG8gbWFrZSBjb2ZmLWkzODYgcHJvZHVjZSByZWxvY2F0ZWFibGUgb3V0cHV0LCBJIHJhbgotaW50byB0aGUgcHJvYmxlbSB0aGF0IHlvdSBhcmUgcnVubmluZyBpbnRvOiBJIHdhbnRlZCB0byByZW1vdmUgdGhhdAotbGluZS4gIFJhdGhlciB0aGFuIHJpc2sgaXQsIEkgbWFkZSB0aGUgY29mZi1pMzg2IHJlbG9jcyB1c2UgYSBzcGVjaWFsCi1mdW5jdGlvbjsgaXQncyBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMuICBUaGUgZnVuY3Rpb24KLXNwZWNpZmljYWxseSBhZGRzIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgb2JqZWN0IGZpbGUsIGtub3dpbmcgdGhhdAotYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBpcyBub3QgZ29pbmcgdG8uICBJZiB5b3UgcmVtb3ZlIHRoYXQgbGluZSwgdGhlbgotY29mZi1pMzg2LmMgd2lsbCB3aW5kIHVwIGFkZGluZyB0aGUgYWRkZW5kIGZpZWxkIGluIHR3aWNlLiAgSXQncwotdHJpdmlhbCB0byBmaXg7IGl0IGp1c3QgbmVlZHMgdG8gYmUgZG9uZS4KLQotVGhlIHByb2JsZW0gd2l0aCByZW1vdmluZyB0aGUgbGluZSBpcyBqdXN0IHRoYXQgaXQgbWF5IGJyZWFrIHNvbWUKLXdvcmtpbmcgY29kZS4gIFdpdGggQkZEIGl0J3MgaGFyZCB0byBiZSBzdXJlIG9mIGFueXRoaW5nLiAgVGhlIHJpZ2h0Ci13YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgc2ltcGx5IHRvIGJ1aWxkIGFuZCB0ZXN0IGF0IGxlYXN0IGFsbCB0aGUKLXN1cHBvcnRlZCBDT0ZGIHRhcmdldHMuICBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIGlmIHRpbWUgYW5kIGRpc2sKLXNwYWNlIGNvbnN1bWluZy4gIEZvciBlYWNoIHRhcmdldDoKLSAgICAxKSBidWlsZCB0aGUgbGlua2VyCi0gICAgMikgZ2VuZXJhdGUgc29tZSBleGVjdXRhYmxlLCBhbmQgbGluayBpdCB1c2luZyAtciAoSSB3b3VsZAotICAgICAgIHByb2JhYmx5IHVzZSBwYXJhbm9pYS5vIGFuZCBsaW5rIGFnYWluc3QgbmV3bGliL2xpYmMuYSwgd2hpY2gKLSAgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cyB3b3VsZCBiZSBhdmFpbGFibGUgaW4KLSAgICAgICAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9ILWhvc3QvdGFyZ2V0L2xpYi9saWJjLmEpLgotICAgIDMpIG1ha2UgdGhlIGNoYW5nZSB0byByZWxvYy5jCi0gICAgNCkgcmVidWlsZCB0aGUgbGlua2VyCi0gICAgNSkgcmVwZWF0IHN0ZXAgMgotICAgIDYpIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGVzIGFyZSB0aGUgc2FtZSwgeW91IGhhdmUgYXQgbGVhc3QKLSAgICAgICBtYWRlIGl0IG5vIHdvcnNlCi0gICAgNykgaWYgdGhleSBhcmUgZGlmZmVyZW50IHlvdSBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmVyc2lvbiBpcwotICAgICAgIHJpZ2h0Ci0qLwotCSAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JfQotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIGZsYWcgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCSAgICAgICBob3d0by0+Yml0c2l6ZSwKLQkJCSAgICAgICBob3d0by0+cmlnaHRzaGlmdCwKLQkJCSAgICAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKSwKLQkJCSAgICAgICByZWxvY2F0aW9uKTsKLQotICAvKgotICAgIEVpdGhlciB3ZSBhcmUgcmVsb2NhdGluZyBhbGwgdGhlIHdheSwgb3Igd2UgZG9uJ3Qgd2FudCB0byBhcHBseQotICAgIHRoZSByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSAocHJvYmFibHkgYmVjYXVzZSB0aGVyZSBpc24ndAotICAgIGFueSByb29tIGluIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGRlc2NyaWJlIGFkZGVuZHMgdG8gcmVsb2NzKQotICAgICovCi0KLSAgLyogVGhlIGNhc3QgdG8gYmZkX3ZtYSBhdm9pZHMgYSBidWcgaW4gdGhlIEFscGhhIE9TRi8xIEMgY29tcGlsZXIKLSAgICAgKE9TRiB2ZXJzaW9uIDEuMywgY29tcGlsZXIgdmVyc2lvbiAzLjExKS4gIEl0IG1pc2NvbXBpbGVzIHRoZQotICAgICBmb2xsb3dpbmcgcHJvZ3JhbToKLQotICAgICBzdHJ1Y3Qgc3RyCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBpbnQgaTA7Ci0gICAgIH0gcyA9IHsgMCB9OwotCi0gICAgIGludAotICAgICBtYWluICgpCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIHg7Ci0KLSAgICAgICB4ID0gMHgxMDAwMDAwMDA7Ci0gICAgICAgeCA8PD0gKHVuc2lnbmVkIGxvbmcpIHMuaTA7Ci0gICAgICAgaWYgKHggPT0gMCkKLQkgcHJpbnRmICgiZmFpbGVkXG4iKTsKLSAgICAgICBlbHNlCi0JIHByaW50ZiAoInN1Y2NlZWRlZCAoJWx4KVxuIiwgeCk7Ci0gICAgIH0KLSAgICAgKi8KLQotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKLQotICAvKiBXYWl0IGZvciB0aGUgZGF5IHdoZW4gYWxsIGhhdmUgdGhlIG1hc2sgaW4gdGhlbSAqLwotCi0gIC8qIFdoYXQgd2UgZG86Ci0gICAgIGkgaW5zdHJ1Y3Rpb24gdG8gYmUgbGVmdCBhbG9uZQotICAgICBvIG9mZnNldCB3aXRoaW4gaW5zdHJ1Y3Rpb24KLSAgICAgciByZWxvY2F0aW9uIG9mZnNldCB0byBhcHBseQotICAgICBTIHNyYyBtYXNrCi0gICAgIEQgZHN0IG1hc2sKLSAgICAgTiB+ZHN0IG1hc2sKLSAgICAgQSBwYXJ0IDEKLSAgICAgQiBwYXJ0IDIKLSAgICAgUiByZXN1bHQKLQotICAgICBEbyB0aGlzOgotICAgICBpIGkgaSBpIGkgbyBvIG8gbyBvICAgICAgICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgICAgICAgICBTIFMgUyBTIFMgICAgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByICB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgQSBBIEEgQSBBCi0gICAgIEFuZCB0aGlzOgotICAgICAuLi4gICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgTiBOIE4gTiBOICAgICAgICAgICAgZ2V0IGluc3RydWN0aW9uCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIC4uLiAgIEIgQiBCIEIgQgotCi0gICAgIEFuZCB0aGVuOgotICAgICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICAgIEEgQSBBIEEgQQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBSIFIgUiBSIFIgUiBSIFIgUiBSICAgICAgICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBkYXRhX3N0YXJ0ICsgKGFkZHIgLSBkYXRhX3N0YXJ0X29mZnNldCk7Ci0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGNoYXIgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF84IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgewotCXNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIERvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgewotCWJmZF92bWEgeCA9IGJmZF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzY0IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qIFRoaXMgcmVsb2NhdGlvbiByb3V0aW5lIGlzIHVzZWQgYnkgc29tZSBvZiB0aGUgYmFja2VuZCBsaW5rZXJzLgotICAgVGhleSBkbyBub3QgY29uc3RydWN0IGFzeW1ib2wgb3IgYXJlbGVudCBzdHJ1Y3R1cmVzLCBzbyB0aGVyZSBpcyBubwotICAgcmVhc29uIGZvciB0aGVtIHRvIHVzZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgQWxzbywKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgc28gaGFja2VkIHVwIGl0IGlzIGVhc2llciB0byB3cml0ZSBhIG5ldwotICAgZnVuY3Rpb24gdGhhbiB0byB0cnkgdG8gZGVhbCB3aXRoIGl0LgotCi0gICBUaGlzIHJvdXRpbmUgZG9lcyBhIGZpbmFsIHJlbG9jYXRpb24uICBXaGV0aGVyIGl0IGlzIHVzZWZ1bCBmb3IgYQotICAgcmVsb2NhdGVhYmxlIGxpbmsgZGVwZW5kcyB1cG9uIGhvdyB0aGUgb2JqZWN0IGZvcm1hdCBkZWZpbmVzCi0gICByZWxvY2F0aW9ucy4KLQotICAgRklYTUU6IFRoaXMgcm91dGluZSBpZ25vcmVzIGFueSBzcGVjaWFsX2Z1bmN0aW9uIGluIHRoZSBIT1dUTywKLSAgIHNpbmNlIHRoZSBleGlzdGluZyBzcGVjaWFsX2Z1bmN0aW9uIHZhbHVlcyBoYXZlIGJlZW4gd3JpdHRlbiBmb3IKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCi0KLSAgIEhPV1RPIGlzIHRoZSByZWxvYyBob3d0byBpbmZvcm1hdGlvbi4KLSAgIElOUFVUX0JGRCBpcyB0aGUgQkZEIHdoaWNoIHRoZSByZWxvYyBhcHBsaWVzIHRvLgotICAgSU5QVVRfU0VDVElPTiBpcyB0aGUgc2VjdGlvbiB3aGljaCB0aGUgcmVsb2MgYXBwbGllcyB0by4KLSAgIENPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbi4KLSAgIEFERFJFU1MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jIHdpdGhpbiBJTlBVVF9TRUNUSU9OLgotICAgVkFMVUUgaXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgdGhlIHJlbG9jIHJlZmVycyB0by4KLSAgIEFEREVORCBpcyB0aGUgYWRkZW5kIG9mIHRoZSByZWxvYy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRkcmVzcywKLQkJCSAgdmFsdWUsIGFkZGVuZCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzLiAgKi8KLSAgaWYgKGFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYSBiYXNpYyByZWxvY2F0aW9uCi0gICAgIGFnYWluc3QgYSBzeW1ib2wuICBXZSB3YW50IHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgdG8KLSAgICAgcmVsb2NhdGUgdG8uICBUaGlzIGlzIGp1c3QgVkFMVUUsIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCBwbHVzCi0gICAgIEFEREVORCwgYW55IGFkZGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbG9jLiAgKi8KLSAgcmVsb2NhdGlvbiA9IHZhbHVlICsgYWRkZW5kOwotCi0gIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIFBDIHJlbGF0aXZlLCB3ZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OIHRvCi0gICAgIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgKGN1cnJlbnRseSBpbiBSRUxPQ0FUSU9OKSBhbmQgdGhlCi0gICAgIGxvY2F0aW9uIHdlIGFyZSByZWxvY2F0aW5nLiAgU29tZSB0YXJnZXRzIChlLmcuLCBpMzg2LWFvdXQpCi0gICAgIGFycmFuZ2UgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlCi0gICAgIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uOyBmb3Igc3VjaCB0YXJnZXRzCi0gICAgIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIE90aGVyIHRhcmdldHMgKGUuZy4sIG04OGtiY3Mgb3IgRUxGKQotICAgICBzaW1wbHkgbGVhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFzIHplcm87IGZvciBzdWNoCi0gICAgIHRhcmdldHMgcGNyZWxfb2Zmc2V0IGlzIHRydWUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2UgZG8gbm90Ci0gICAgIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUKLSAgICAgc2VjdGlvbiAod2hpY2ggaXMganVzdCBBRERSRVNTKS4gICovCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCkKLQlyZWxvY2F0aW9uIC09IGFkZHJlc3M7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSBjb250ZW50cyArIGFkZHJlc3MpOwotfQotCi0vKiBSZWxvY2F0ZSBhIGdpdmVuIGxvY2F0aW9uIHVzaW5nIGEgZ2l2ZW4gdmFsdWUgYW5kIGhvd3RvLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLXsKLSAgaW50IHNpemU7Ci0gIGJmZF92bWEgeDsKLSAgYm9vbGVhbiBvdmVyZmxvdzsKLSAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQgPSBob3d0by0+cmlnaHRzaGlmdDsKLSAgdW5zaWduZWQgaW50IGJpdHBvcyA9IGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogSWYgdGhlIHNpemUgaXMgbmVnYXRpdmUsIG5lZ2F0ZSBSRUxPQ0FUSU9OLiAgVGhpcyBpc24ndCB2ZXJ5Ci0gICAgIGdlbmVyYWwuICAqLwotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICAvKiBHZXQgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZWxvY2F0ZS4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICAgIHggPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmZGVmIEJGRDY0Ci0gICAgICB4ID0gYmZkX2dldF82NCAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICBGSVhNRTogV2UgbWF5IGRyb3AgYml0cyBkdXJpbmcgdGhlIGFkZGl0aW9uCi0gICAgIHdoaWNoIHdlIGRvbid0IGNoZWNrIGZvci4gIFdlIG11c3QgZWl0aGVyIGNoZWNrIGF0IGV2ZXJ5IHNpbmdsZQotICAgICBvcGVyYXRpb24sIHdoaWNoIHdvdWxkIGJlIHRlZGlvdXMsIG9yIHdlIG11c3QgZG8gdGhlIGNvbXB1dGF0aW9ucwotICAgICBpbiBhIHR5cGUgbGFyZ2VyIHRoYW4gYmZkX3ZtYSwgd2hpY2ggd291bGQgYmUgaW5lZmZpY2llbnQuICAqLwotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRybWFzaywgZmllbGRtYXNrLCBzaWdubWFzaywgc3M7Ci0gICAgICBiZmRfdm1hIGEsIGIsIHN1bTsKLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZXMgdG8gYmUgYWRkZWQgdG9nZXRoZXIuICBGb3Igc2lnbmVkIGFuZCB1bnNpZ25lZAotICAgICAgICAgcmVsb2NhdGlvbnMsIHdlIGFzc3VtZSB0aGF0IGFsbCB2YWx1ZXMgc2hvdWxkIGJlIHRydW5jYXRlZCB0bwotICAgICAgICAgdGhlIHNpemUgb2YgYW4gYWRkcmVzcy4gIEZvciBiaXRmaWVsZHMsIGFsbCB0aGUgYml0cyBtYXR0ZXIuCi0gICAgICAgICBTZWUgYWxzbyBiZmRfY2hlY2tfb3ZlcmZsb3cuICAqLwotICAgICAgZmllbGRtYXNrID0gTl9PTkVTIChob3d0by0+Yml0c2l6ZSk7Ci0gICAgICBhZGRybWFzayA9IE5fT05FUyAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSkgfCBmaWVsZG1hc2s7Ci0gICAgICBhID0gcmVsb2NhdGlvbjsKLSAgICAgIGIgPSB4ICYgaG93dG8tPnNyY19tYXNrOwotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKLQotCSAgLyogSWYgYW55IHNpZ24gYml0cyBhcmUgc2V0LCBhbGwgc2lnbiBiaXRzIG11c3QgYmUgc2V0LgotCSAgICAgVGhhdCBpcywgQSBtdXN0IGJlIGEgdmFsaWQgbmVnYXRpdmUgYWRkcmVzcyBhZnRlcgotCSAgICAgc2hpZnRpbmcuICAqLwotCSAgc2lnbm1hc2sgPSB+IChmaWVsZG1hc2sgPj4gMSk7Ci0JICBzcyA9IGEgJiBzaWdubWFzazsKLQkgIGlmIChzcyAhPSAwICYmIHNzICE9ICgoYWRkcm1hc2sgPj4gcmlnaHRzaGlmdCkgJiBzaWdubWFzaykpCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQotCSAgLyogV2Ugb25seSBuZWVkIHRoaXMgbmV4dCBiaXQgb2YgY29kZSBpZiB0aGUgc2lnbiBiaXQgb2YgQgotICAgICAgICAgICAgIGlzIGJlbG93IHRoZSBzaWduIGJpdCBvZiBBLiAgVGhpcyB3b3VsZCBvbmx5IGhhcHBlbiBpZgotICAgICAgICAgICAgIFNSQ19NQVNLIGhhZCBmZXdlciBiaXRzIHRoYW4gQklUU0laRS4gIE5vdGUgdGhhdCBpZgotICAgICAgICAgICAgIFNSQ19NQVNLIGhhcyBtb3JlIGJpdHMgdGhhbiBCSVRTSVpFLCB3ZSBjYW4gZ2V0IGludG8KLSAgICAgICAgICAgICB0cm91YmxlOyB3ZSB3b3VsZCBuZWVkIHRvIHZlcmlmeSB0aGF0IEIgaXMgaW4gcmFuZ2UsIGFzCi0gICAgICAgICAgICAgd2UgZG8gZm9yIEEgYWJvdmUuICAqLwotCSAgc2lnbm1hc2sgPSAoKH4gaG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzazsKLQkgIGlmICgoYiAmIHNpZ25tYXNrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogU2V0IGFsbCB0aGUgYml0cyBhYm92ZSB0aGUgc2lnbiBiaXQuICAqLwotCSAgICAgIGIgLT0gc2lnbm1hc2sgPDw9IDE7Ci0JICAgIH0KLQotCSAgYiA9IChiICYgYWRkcm1hc2spID4+IGJpdHBvczsKLQotCSAgLyogTm93IHdlIGNhbiBkbyB0aGUgYWRkaXRpb24uICAqLwotCSAgc3VtID0gYSArIGI7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgcmVzdWx0IGhhcyB0aGUgY29ycmVjdCBzaWduLiAgQml0cyBhYm92ZSB0aGUKLSAgICAgICAgICAgICBzaWduIGJpdCBhcmUganVuayBub3c7IGlnbm9yZSB0aGVtLiAgSWYgdGhlIHN1bSBpcwotICAgICAgICAgICAgIHBvc2l0aXZlLCBtYWtlIHN1cmUgd2UgZGlkIG5vdCBoYXZlIGFsbCBuZWdhdGl2ZSBpbnB1dHM7Ci0gICAgICAgICAgICAgaWYgdGhlIHN1bSBpcyBuZWdhdGl2ZSwgbWFrZSBzdXJlIHdlIGRpZCBub3QgaGF2ZSBhbGwKLSAgICAgICAgICAgICBwb3NpdGl2ZSBpbnB1dHMuICBUaGUgdGVzdCBiZWxvdyBsb29rcyBvbmx5IGF0IHRoZSBzaWduCi0gICAgICAgICAgICAgYml0cywgYW5kIGl0IHJlYWxseSBqdXN0Ci0JICAgICAgICAgU0lHTiAoQSkgPT0gU0lHTiAoQikgJiYgU0lHTiAoQSkgIT0gU0lHTiAoU1VNKQotCSAgICAgKi8KLQkgIHNpZ25tYXNrID0gKGZpZWxkbWFzayA+PiAxKSArIDE7Ci0JICBpZiAoKCh+IChhIF4gYikpICYgKGEgXiBzdW0pKSAmIHNpZ25tYXNrKQotCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLQkgIC8qIENoZWNraW5nIGZvciBhbiB1bnNpZ25lZCBvdmVyZmxvdyBpcyByZWxhdGl2ZWx5IGVhc3k6Ci0gICAgICAgICAgICAgdHJpbSB0aGUgYWRkcmVzc2VzIGFuZCBhZGQsIGFuZCB0cmltIHRoZSByZXN1bHQgYXMgd2VsbC4KLSAgICAgICAgICAgICBPdmVyZmxvdyBpcyBub3JtYWxseSBpbmRpY2F0ZWQgd2hlbiB0aGUgcmVzdWx0IGRvZXMgbm90Ci0gICAgICAgICAgICAgZml0IGluIHRoZSBmaWVsZC4gIEhvd2V2ZXIsIHdlIGFsc28gbmVlZCB0byBjb25zaWRlciB0aGUKLSAgICAgICAgICAgICBjYXNlIHdoZW4sIGUuZy4sIGZpZWxkbWFzayBpcyAweDdmZmZmZmZmIG9yIHNtYWxsZXIsIGFuCi0gICAgICAgICAgICAgaW5wdXQgaXMgMHg4MDAwMDAwMCwgYW5kIGJmZF92bWEgaXMgb25seSAzMiBiaXRzOyB0aGVuIHdlCi0gICAgICAgICAgICAgd2lsbCBnZXQgc3VtID09IDAsIGJ1dCB0aGVyZSBpcyBhbiBvdmVyZmxvdywgc2luY2UgdGhlCi0gICAgICAgICAgICAgaW5wdXRzIGRpZCBub3QgZml0IGluIHRoZSBmaWVsZC4gIEluc3RlYWQgb2YgZG9pbmcgYQotICAgICAgICAgICAgIHNlcGFyYXRlIHRlc3QsIHdlIGNhbiBjaGVjayBmb3IgdGhpcyBieSBvci1pbmcgaW4gdGhlCi0gICAgICAgICAgICAgb3BlcmFuZHMgd2hlbiB0ZXN0aW5nIGZvciB0aGUgc3VtIG92ZXJmbG93aW5nIGl0cyBmaW5hbAotICAgICAgICAgICAgIGZpZWxkLiAgKi8KLQkgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotCSAgYiA9IChiICYgYWRkcm1hc2spID4+IGJpdHBvczsKLQkgIHN1bSA9IChhICsgYikgJiBhZGRybWFzazsKLQkgIGlmICgoYSB8IGIgfCBzdW0pICYgfiBmaWVsZG1hc2spCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgLyogTXVjaCBsaWtlIHVuc2lnbmVkLCBleGNlcHQgbm8gdHJpbW1pbmcgd2l0aCBhZGRybWFzay4gIEluCi0gICAgICAgICAgICAgYWRkaXRpb24sIHRoZSBzdW0gb3ZlcmZsb3dzIGlmIHRoZXJlIGlzIGEgY2Fycnkgb3V0IG9mCi0gICAgICAgICAgICAgdGhlIGJmZF92bWEsIGkuZS4sIHRoZSBzdW0gaXMgbGVzcyB0aGFuIGVpdGhlciBpbnB1dAotICAgICAgICAgICAgIG9wZXJhbmQuICAqLwotCSAgYSA+Pj0gcmlnaHRzaGlmdDsKLQkgIGIgPj49IGJpdHBvczsKLQotCSAgLyogQml0ZmllbGRzIGFyZSBzb21ldGltZXMgdXNlZCBmb3Igc2lnbmVkIG51bWJlcnM7IGZvcgotICAgICAgICAgICAgIGV4YW1wbGUsIGEgMTMtYml0IGZpZWxkIHNvbWV0aW1lcyByZXByZXNlbnRzIHZhbHVlcyBpbgotICAgICAgICAgICAgIDAuLjgxOTEgYW5kIHNvbWV0aW1lcyByZXByZXNlbnRzIHZhbHVlcyBpbiAtNDA5Ni4uNDA5NS4KLSAgICAgICAgICAgICBJZiB0aGUgZmllbGQgaXMgc2lnbmVkIGFuZCBhIGlzIC00MDk1ICgweDEwMDEpIGFuZCBiIGlzCi0gICAgICAgICAgICAgLTEgKDB4MWZmZiksIHRoZSBzdW0gaXMgLTQwOTYgKDB4MTAwMCksIGJ1dCAoMHgxMDAxICsKLSAgICAgICAgICAgICAweDFmZmYgaXMgMHgzMDAwKS4gIEl0J3Mgbm90IGNsZWFyIGhvdyB0byBoYW5kbGUgdGhpcwotICAgICAgICAgICAgIGV2ZXJ5d2hlcmUsIHNpbmNlIHRoZXJlIGlzIG5vdCB3YXkgdG8ga25vdyBob3cgbWFueSBiaXRzCi0gICAgICAgICAgICAgYXJlIHNpZ25pZmljYW50IGluIHRoZSByZWxvY2F0aW9uLCBidXQgdGhlIG9yaWdpbmFsIGNvZGUKLSAgICAgICAgICAgICBhc3N1bWVkIHRoYXQgaXQgd2FzIGZ1bGx5IHNpZ24gZXh0ZW5kZWQsIGFuZCB3ZSB3aWxsIGtlZXAKLSAgICAgICAgICAgICB0aGF0IGFzc3VtcHRpb24uICAqLwotCSAgc2lnbm1hc2sgPSAoZmllbGRtYXNrID4+IDEpICsgMTsKLQotCSAgaWYgKChhICYgfiBmaWVsZG1hc2spICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBTb21lIGJpdHMgb3V0IG9mIHRoZSBmaWVsZCBhcmUgc2V0LiAgVGhpcyBtaWdodCBub3QKLSAgICAgICAgICAgICAgICAgYmUgYSBwcm9ibGVtOiBpZiB0aGlzIGlzIGEgc2lnbmVkIGJpdGZpZWxkLCBpdCBpcyBPSwotICAgICAgICAgICAgICAgICBpZmYgYWxsIHRoZSBoaWdoIGJpdHMgYXJlIHNldCwgaW5jbHVkaW5nIHRoZSBzaWduCi0gICAgICAgICAgICAgICAgIGJpdC4gIFdlJ2xsIHRyeSBzZXR0aW5nIGFsbCBidXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgICAgICAgICAgICAgICAgYml0IGluIHRoZSBvcmlnaW5hbCByZWxvY2F0aW9uIHZhbHVlOiBpZiB0aGlzIGlzIGFsbAotICAgICAgICAgICAgICAgICBvbmVzLCB3ZSBhcmUgT0ssIGFzc3VtaW5nIGEgc2lnbmVkIGJpdGZpZWxkLiAgKi8KLQkgICAgICBzcyA9IChzaWdubWFzayA8PCByaWdodHNoaWZ0KSAtIDE7Ci0JICAgICAgaWYgKChzcyB8IHJlbG9jYXRpb24pICE9IH4gKGJmZF92bWEpIDApCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBhICY9IGZpZWxkbWFzazsKLQkgICAgfQotCi0JICAvKiBXZSBqdXN0IGFzc3VtZSAoYiAmIH4gZmllbGRtYXNrKSA9PSAwLiAgKi8KLQotCSAgLyogV2UgZXhwbGljaXRseSBwZXJtaXQgd3JhcCBhcm91bmQgaWYgdGhpcyByZWxvY2F0aW9uCi0JICAgICBjb3ZlcnMgdGhlIGhpZ2ggYml0IG9mIGFuIGFkZHJlc3MuICBUaGUgTGludXgga2VybmVsCi0JICAgICByZWxpZXMgb24gaXQsIGFuZCBpdCBpcyB0aGUgb25seSB3YXkgdG8gd3JpdGUgYXNzZW1ibGVyCi0JICAgICBjb2RlIHdoaWNoIGNhbiBydW4gd2hlbiBsb2FkZWQgYXQgYSBsb2NhdGlvbiAweDgwMDAwMDAwCi0JICAgICBhd2F5IGZyb20gdGhlIGxvY2F0aW9uIGF0IHdoaWNoIGl0IGlzIGxpbmtlZC4gICovCi0JICBpZiAoaG93dG8tPmJpdHNpemUgKyByaWdodHNoaWZ0Ci0JICAgICAgPT0gYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSkKLQkgICAgYnJlYWs7Ci0KLQkgIHN1bSA9IGEgKyBiOwotCSAgaWYgKHN1bSA8IGEgfHwgKHN1bSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgd2FzIGEgY2Fycnkgb3V0LCBvciB0aGUgZmllbGQgb3ZlcmZsb3cuICBUZXN0Ci0gICAgICAgICAgICAgICAgIGZvciBzaWduZWQgb3BlcmFuZHMgYWdhaW4uICBIZXJlIGlzIHRoZSBvdmVyZmxvdyB0ZXN0Ci0gICAgICAgICAgICAgICAgIGlzIGFzIGZvciBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuICAqLwotCSAgICAgIGlmICgoKH4gKGEgXiBiKSkgJiAoYSBeIHN1bSkpICYgc2lnbm1hc2spCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIFB1dCBSRUxPQ0FUSU9OIGluIHRoZSByaWdodCBiaXRzLiAgKi8KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIHJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBiaXRwb3M7Ci0KLSAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIHJpZ2h0IGJpdHMgb2YgWC4gICovCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKQotICAgICAgIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpOwotCi0gIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmZGVmIEJGRDY0Ci0gICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotLyoKLURPQ0RECi1JTk9ERQotCWhvd3RvIG1hbmFnZXIsICAsIHR5cGVkZWYgYXJlbGVudCwgUmVsb2NhdGlvbnMKLQotU0VDVElPTgotCVRoZSBob3d0byBtYW5hZ2VyCi0KLQlXaGVuIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNyZWF0ZSBhIHJlbG9jYXRpb24sIGJ1dCBkb2Vzbid0Ci0Ja25vdyB3aGF0IHRoZSB0YXJnZXQgbWFjaGluZSBtaWdodCBjYWxsIGl0LCBpdCBjYW4gZmluZCBvdXQgYnkKLQl1c2luZyB0aGlzIGJpdCBvZiBjb2RlLgotCi0qLwotCi0vKgotVFlQRURFRgotCWJmZF9yZWxvY19jb2RlX3R5cGUKLQotREVTQ1JJUFRJT04KLQlUaGUgaW5zaWRlcyBvZiBhIHJlbG9jIGNvZGUuICBUaGUgaWRlYSBpcyB0aGF0LCBldmVudHVhbGx5LCB0aGVyZQotCXdpbGwgYmUgb25lIGVudW1lcmF0b3IgZm9yIGV2ZXJ5IHR5cGUgb2YgcmVsb2NhdGlvbiB3ZSBldmVyIGRvLgotCVBhc3Mgb25lIG9mIHRoZXNlIHZhbHVlcyB0byA8PGJmZF9yZWxvY190eXBlX2xvb2t1cD4+LCBhbmQgaXQnbGwKLQlyZXR1cm4gYSBob3d0byBwb2ludGVyLgotCi0JVGhpcyBkb2VzIG1lYW4gdGhhdCB0aGUgYXBwbGljYXRpb24gbXVzdCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QKLQllbnVtZXJhdG9yIHZhbHVlOyB5b3UgY2FuJ3QgZ2V0IGEgaG93dG8gcG9pbnRlciBmcm9tIGEgcmFuZG9tIHNldAotCW9mIGF0dHJpYnV0ZXMuCi0KLVNFTlVNCi0gICBiZmRfcmVsb2NfY29kZV9yZWFsCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY0Ci1FTlVNWAotICBCRkRfUkVMT0NfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yNgotRU5VTVgKLSAgQkZEX1JFTE9DXzI0Ci1FTlVNWAotICBCRkRfUkVMT0NfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNAotRU5VTVgKLSAgQkZEX1JFTE9DXzgKLUVOVU1ET0MKLSAgQmFzaWMgYWJzb2x1dGUgcmVsb2NhdGlvbnMgb2YgTiBiaXRzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182NF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMjRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzEyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9QQ1JFTAotRU5VTURPQwotICBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X1BMVE9GRgotRU5VTURPQwotICBGb3IgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182OEtfR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfUkVMQVRJVkUKLUVOVU1ET0MKLSAgUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ18zMl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfUlZBCi1FTlVNRE9DCi0gIExpbmthZ2UtdGFibGUgcmVsYXRpdmUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzhfRkZubgotRU5VTURPQwotICBBYnNvbHV0ZSA4LWJpdCByZWxvY2F0aW9uLCBidXQgdXNlZCB0byBmb3JtIGFuIGFkZHJlc3MgbGlrZSAweEZGbm4uCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMgotRU5VTURPQwotICBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4KLQotRU5VTQotICBCRkRfUkVMT0NfSEkyMgotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTAKLUVOVU1ET0MKLSAgSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4KLQotRU5VTQotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTVgKLSAgQkZEX1JFTE9DX0dQUkVMMzIKLUVOVU1ET0MKLSAgRm9yIHN5c3RlbXMgdGhhdCBhbGxvY2F0ZSBhIEdsb2JhbCBQb2ludGVyIHJlZ2lzdGVyLCB0aGVzZSBhcmUKLWRpc3BsYWNlbWVudHMgb2ZmIHRoYXQgcmVnaXN0ZXIuICBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZQotaGFuZGxlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhlIHZhbHVlIHRoZSByZWdpc3RlciB3aWxsIGhhdmUgaXMKLWRlY2lkZWQgcmVsYXRpdmVseSBsYXRlLgotCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEoKLUVOVU1ET0MKLSAgUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4KLQotRU5VTQotICBCRkRfUkVMT0NfTk9ORQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkMxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTMKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1VBMzIKLUVOVU1ET0MKLSAgU1BBUkMgRUxGIHJlbG9jYXRpb25zLiAgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBvdmVybGFwIHdpdGggb3RoZXIKLSAgcmVsb2NhdGlvbiB0eXBlcyBhbHJlYWR5IGRlZmluZWQuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMgotRU5VTURPQwotICBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLgotCi1FTlVNRVEKLSAgQkZEX1JFTE9DX1NQQVJDXzY0Ci0gIEJGRF9SRUxPQ182NAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfMTEKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfNwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ181Ci1FTlVNRVFYCi0gIEJGRF9SRUxPQ19TUEFSQ19ESVNQNjQKLSAgQkZEX1JFTE9DXzY0X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIKLUVOVU1ET0MKLSAgU1BBUkM2NCByZWxvY2F0aW9ucwotCi1FTlVNCi0gIEJGRF9SRUxPQ19TUEFSQ19SRVYzMgotRU5VTURPQwotICBTUEFSQyBsaXR0bGUgZW5kaWFuIHJlbG9jYXRpb24KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYKLUVOVU1ET0MKLSAgQWxwaGEgRUNPRkYgYW5kIEVMRiByZWxvY2F0aW9ucy4gIFNvbWUgb2YgdGhlc2UgdHJlYXQgdGhlIHN5bWJvbCBvcgotICAgICAiYWRkZW5kIiBpbiBzb21lIHNwZWNpYWwgd2F5LgotICBGb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLSAgICAgd3JpdGluZzsgd2hlbiByZWFkaW5nLCBpdCB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gIFRoZQotICAgICBhZGRlbmQgaXMgdGhlIGRpc3BsYWNlbWVudCBpbiBieXRlcyBvZiB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZnJvbQotICAgICB0aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4KLUVOVU0KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2Ci1FTlVNRE9DCi0gIEZvciBHUERJU1BfTE8xNiAoImlnbm9yZSIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGhhbmRsZWQgYXMKLSAgICAgd2l0aCBHUERJU1BfSEkxNiByZWxvY3MuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nIHRoZQotICAgICByZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi0gICAgIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZS4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQCi1FTlVNRE9DCi0gIFRoZSBFTEYgR1BESVNQIHJlbG9jYXRpb24gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgR1BESVNQX0hJMTYKLSAgICAgcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLSAgICAgcmVsb2NhdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFCi1FTlVNRE9DCi0gIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLSAgICAgdGhlIGFzc2VtYmxlciB0dXJucyBpdCBpbnRvIGEgTERRIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIHN5bWJvbCwgYW5kIHRoZW4gZmlsbHMgaW4gYSByZWdpc3RlciBpbiB0aGUgcmVhbCBpbnN0cnVjdGlvbi4KLQotICAgICBUaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotICAgICBzZWN0aW9uIHN5bWJvbC4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcsIGJ1dCBpcyBmaWxsZWQKLSAgICAgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZSwgYXMgd2l0aCB0aGUKLSAgICAgR1BESVNQX0xPMTYgcmVsb2MuCi0KLSAgICAgVGhlIEVMRl9MSVRFUkFMIHJlbG9jIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDE2X0dPVE9GRiBhbmQgR1BESVNQX0xPMTYuCi0gICAgIEl0IHNob3VsZCByZWZlciB0byB0aGUgc3ltYm9sIHRvIGJlIHJlZmVyZW5jZWQsIGFzIHdpdGggMTZfR09UT0ZGLAotICAgICBidXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotICAgICBzZWN0aW9uLCBidXQgcmVsYXRpdmUgdG8gdGhlIEdQIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZpbGUgZHVyaW5nIHRoZQotICAgICBmaW5hbCBsaW5rIHN0YWdlLgotCi0gICAgIFRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi0gICAgIGluZm9ybWF0aW9uIHRvIHRoZSBsaW5rZXIgdGhhdCBpdCBtaWdodCBiZSBhYmxlIHRvIHVzZSB0byBvcHRpbWl6ZQotICAgICBhd2F5IHNvbWUgbGl0ZXJhbCBzZWN0aW9uIHJlZmVyZW5jZXMuICBUaGUgc3ltYm9sIGlzIGlnbm9yZWQgKHJlYWQKLSAgICAgYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLSAgICAgb2YgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHJlZ2lzdGVyOgotICAgICAgICAgICAgICAxIC0gIm1lbW9yeSIgZm10IGluc24KLSAgICAgICAgICAgICAgMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0gICAgICAgICAgICAgIDMgLSBqc3IgKHRhcmdldCBvZiBicmFuY2gpCi0KLSAgICAgVGhlIEdOVSBsaW5rZXIgY3VycmVudGx5IGRvZXNuJ3QgZG8gYW55IG9mIHRoaXMgb3B0aW1pemluZy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfSElOVAotRU5VTURPQwotICBUaGUgSElOVCByZWxvY2F0aW9uIGluZGljYXRlcyBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCBpbnRvIHRoZQotICAgICAiaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLSAgICAgcHJlZGljdGlvbiBsb2dpYyB3aGljaCBtYXkgYmUgcHJvdmlkZWQgb24gc29tZSBwcm9jZXNzb3JzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFCi1FTlVNRE9DCi0gIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUgotRU5VTURPQwotICBUaGUgQ09ERUFERFIgcmVsb2NhdGlvbiBvdXRwdXRzIGEgU1RPX0NBIGluIHRoZSBvYmplY3QgZmlsZSwKLSAgICAgd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFNfSk1QCi1FTlVNRE9DCi0gIEJpdHMgMjcuLjIgb2YgdGhlIHJlbG9jYXRpb24gYWRkcmVzcyBzaGlmdGVkIHJpZ2h0IDIgYml0czsKLSAgICAgc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQUzE2X0pNUAotRU5VTURPQwotICBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFMxNl9HUFJFTAotRU5VTURPQwotICBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0hJMTYKLUVOVU1ET0MKLSAgSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZTsgc2ltcGxlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfSEkxNl9TCi1FTlVNRE9DCi0gIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLSAgICAgZXh0ZW5kZWQgYW5kIGFkZGVkIHRvIGZvcm0gdGhlIGZpbmFsIHJlc3VsdC4gIElmIHRoZSBsb3cgMTYKLSAgICAgYml0cyBmb3JtIGEgbmVnYXRpdmUgbnVtYmVyLCB3ZSBuZWVkIHRvIGFkZCBvbmUgdG8gdGhlIGhpZ2ggdmFsdWUKLSAgICAgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19MTzE2Ci1FTlVNRE9DCi0gIExvdyAxNiBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfSEkxNl9TCi1FTlVNRE9DCi0gIExpa2UgQkZEX1JFTE9DX0hJMTZfUywgYnV0IFBDIHJlbGF0aXZlLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfTE8xNgotRU5VTURPQwotICBMaWtlIEJGRF9SRUxPQ19MTzE2LCBidXQgUEMgcmVsYXRpdmUuCi0KLUVOVU1FUQotICBCRkRfUkVMT0NfTUlQU19HUFJFTAotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTURPQwotICBSZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBnbG9iYWwgcG9pbnRlci4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQU19MSVRFUkFMCi1FTlVNRE9DCi0gIFJlbG9jYXRpb24gYWdhaW5zdCBhIE1JUFMgbGl0ZXJhbCBzZWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYKLUVOVU1FUVgKLSAgQkZEX1JFTE9DX01JUFNfR1BSRUwzMgotICBCRkRfUkVMT0NfR1BSRUwzMgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfU1VCCi1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRQotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX09GU1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQCi1DT01NRU5UCi1FTlVNRE9DCi0gIE1JUFMgRUxGIHJlbG9jYXRpb25zLgotCi1DT01NRU5UCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzM4Nl9HT1QzMgotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9QTFQzMgotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfR09UUEMKLUVOVU1ET0MKLSAgaTM4Ni9lbGYgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfTlMzMktfSU1NXzgKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwKLUVOVU1ET0MKLSAgbnMzMmsgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfUFBDX0IyNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CQTI2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX1RPQzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0IxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0pNUF9TTE9UCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX1JFTEFUSVZFCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQwotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTwotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBCi1FTlVNRE9DCi0gIFBvd2VyKHJzNjAwMCkgYW5kIFBvd2VyUEMgcmVsb2NhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0NUT1IKLUVOVU1ET0MKLSAgVGhlIHR5cGUgb2YgcmVsb2MgdXNlZCB0byBidWlsZCBhIGNvbnRydWN0b3IgdGFibGUgLSBhdCB0aGUgbW9tZW50Ci0gIHByb2JhYmx5IGEgMzIgYml0IHdpZGUgYWJzb2x1dGUgcmVsb2NhdGlvbiwgYnV0IHRoZSB0YXJnZXQgY2FuIGNob29zZS4KLSAgSXQgZ2VuZXJhbGx5IGRvZXMgbWFwIHRvIG9uZSBvZiB0aGUgb3RoZXIgcmVsb2NhdGlvbiB0eXBlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotRU5VTURPQwotICBBUk0gMjYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLSAgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1NXSQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9NVUxUSQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0FEUl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTERSX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0lOX1BPT0wKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTgKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVDEyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVDMyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1BMVDMyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1JFTEFUSVZFCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1RQQwotRU5VTURPQwotICBUaGVzZSByZWxvY3MgYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGhlIEFSTSBhc3NlbWJsZXIuICBUaGV5IGFyZSBub3QKLSAgKGF0IHByZXNlbnQpIHdyaXR0ZW4gdG8gYW55IG9iamVjdCBmaWxlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfU0hfUENESVNQOEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU00Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NOAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfU1dJVENIMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gzMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1VTRVMKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9DT1VOVAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0FMSUdOCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfQ09ERQotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0RBVEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9MQUJFTAotRU5VTURPQwotICBIaXRhY2hpIFNIIHJlbG9jcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOQotRU5VTVgKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyCi1FTlVNWAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMKLUVOVU1ET0MKLSAgVGh1bWIgMjMtLCAxMi0gYW5kIDktYml0IHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgVGhlIGxvd2VzdCBiaXQgbXVzdAotICBiZSB6ZXJvIGFuZCBpcyBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTAotRU5VTURPQwotICBBcmdvbmF1dCBSSVNDIENvcmUgKEFSQykgcmVsb2NzLgotICBBUkMgMjIgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLSAgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyMCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyNgotICB0aHJvdWdoIDcgb2YgdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfQVJDX0IyNgotRU5VTURPQwotICBBUkMgMjYgYml0IGFic29sdXRlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUgbm90Ci0gIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyNCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyMwotICB0aHJvdWdoIDAuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUgotRU5VTURPQwotICBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgotICBUaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgcmVsb2MKLSAgZXhjZXB0IGl0IGlzIGluIHRoZSBsZWZ0IGNvbnRhaW5lciwgaS5lLiwKLSAgc2hpZnRlZCBsZWZ0IDE1IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzE4Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfNgotRU5VTURPQwotICBNaXRzdWJpc2hpIEQzMFYgcmVsb2NzLgotICBUaGlzIGlzIGEgNi1iaXQgYWJzb2x1dGUgcmVsb2MuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUgotRU5VTURPQwotICBUaGlzIGlzIGEgNi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLSAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotICBvZiB0aGUgY29udGFpbmVyLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzE1Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMi1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCB0aGUgCi0gIHJpZ2h0IDMgYml0c2Fzc3VtZWQgdG8gYmUgMC4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotICBhcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi0gIG9mIHRoZSBjb250YWluZXIuICAKLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMjEKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCAKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi0gIGFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLSAgb2YgdGhlIGNvbnRhaW5lci4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMzIKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyLWJpdCBhYnNvbHV0ZSByZWxvYy4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYy4KLQotRU5VTQotICBCRkRfUkVMT0NfTTMyUl8yNAotRU5VTURPQwotICBNaXRzdWJpc2hpIE0zMlIgcmVsb2NzLgotICBUaGlzIGlzIGEgMjQgYml0IGFic29sdXRlIGFkZHJlc3MuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMThfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDI2LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTwotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCi0gIHVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyB1bnNpZ25lZC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotICB1c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgc2lnbmVkLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9MTzE2Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgbG93ZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9TREExNgotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIHNtYWxsIGRhdGEgYXJlYSBvZmZzZXQgZm9yIHVzZSBpbgotICBhZGQzLCBsb2FkLCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDktYml0IHJlbG9jCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAyMi1iaXQgcmVsb2MKLQotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi0gIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLSAgemVybyBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiA4IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNiBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotICB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGFuIDhiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDcgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotICBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDcgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi1DT01NRU5UCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA1IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNCBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci0gIGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi0gIGJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLSAgYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuCi1DT01NRU5UCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyYml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLSAgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzE2X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi0gIGluc3RydWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19USUMzMF9MRFAKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDhiaXQgRFAgcmVsb2MgZm9yIHRoZSB0bXMzMjBjMzAsIHdoZXJlIHRoZSBtb3N0Ci0gIHNpZ25pZmljYW50IDggYml0cyBvZiBhIDI0IGJpdCB3b3JkIGFyZSBwbGFjZWQgaW50byB0aGUgbGVhc3QKLSAgc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSBvcGNvZGUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfNDgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDQ4IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMzIgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMjAKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyIGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMjAgYml0cyBzcGxpdCB1cCBpbnRvCi0gIHR3byBzZWN0aW9ucy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfNl9JTl80Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgNiBiaXQgd29yZCBvZmZzZXQgaW4KLSAgNCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF84X0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYW4gOCBiaXQgYnl0ZSBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzlfSU5fOAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHNob3J0IG9mZnNldAotICBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEwIGJpdCB3b3JkIG9mZnNldAotICBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHBjIHJlbGF0aXZlCi0gIHNob3J0IG9mZnNldCBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMiBiaXQgcGMgcmVsYXRpdmUKLSAgc2hvcnQgb2Zmc2V0IGludG8gMTEgYml0cy4KLSAgCi1FTlVNCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9SVkEKLUVOVU1ET0MKLSAgTW90b3JvbGEgTWNvcmUgcmVsb2NhdGlvbnMuCi0gIAotRU5VTQotICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLUVOVU1ET0MKLSAgVGhlc2UgdHdvIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mIAotICB0aGUgZW50cmllcyBpbiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGFyZSBhY3R1YWxseSB1c2VkLiAgV2hlbgotICB0aGUgLS1nYy1zZWN0aW9ucyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rZXIgd2lsbCB6ZXJvIG91dCB0aGUgZW50cmllcwotICB0aGF0IGFyZSBub3QgdXNlZCwgc28gdGhhdCB0aGUgY29kZSBmb3IgdGhvc2UgZnVuY3Rpb25zIG5lZWQgbm90IGJlCi0gIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLSAgVlRBQkxFX0lOSEVSSVQgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdXNlZCB0byBkZXNjcmliZSB0byB0aGUKLSAgbGlua2VyIHRoZSBpbmhlcml0ZW5jZSB0cmVlIG9mIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICBUaGUKLSAgcmVsb2NhdGlvbidzIHN5bWJvbCBzaG91bGQgYmUgdGhlIHBhcmVudCBjbGFzcycgdnRhYmxlLCBhbmQgdGhlCi0gIHJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2F0ZWQgYXQgdGhlIGNoaWxkIHZ0YWJsZS4KLQotICBWVEFCTEVfRU5UUlkgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdGhhdCBkZXNjcmliZXMgdGhlIHVzZSBvZiBhCi0gIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkuICBUaGUgcmVsb2MncyBzeW1ib2wgc2hvdWxkIHJlZmVyIHRvIHRoZQotICB0YWJsZSBvZiB0aGUgY2xhc3MgbWVudGlvbmVkIGluIHRoZSBjb2RlLiAgT2ZmIG9mIHRoYXQgYmFzZSwgYW4gb2Zmc2V0Ci0gIGRlc2NyaWJlcyB0aGUgZW50cnkgdGhhdCBpcyBiZWluZyB1c2VkLiAgRm9yIFJlbGEgaG9zdHMsIHRoaXMgb2Zmc2V0IAotICBpcyBzdG9yZWQgaW4gdGhlIHJlbG9jJ3MgYWRkZW5kLiAgRm9yIFJlbCBob3N0cywgd2UgYXJlIGZvcmNlZCB0byBwdXQKLSAgdGhpcyBvZmZzZXQgaW4gdGhlIHJlbG9jJ3Mgc2VjdGlvbiBvZmZzZXQuCi0KLUVORFNFTlVNCi0gIEJGRF9SRUxPQ19VTlVTRUQKLUNPREVfRlJBR01FTlQKLS4KLS50eXBlZGVmIGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGU7Ci0qLwotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9yZWxvY190eXBlX2xvb2t1cAotCi1TWU5PUFNJUwotCXJlbG9jX2hvd3RvX3R5cGUgKgotCWJmZF9yZWxvY190eXBlX2xvb2t1cCAoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCwgd2hlbgotCWludm9rZWQsIHdpbGwgcGVyZm9ybSB0aGUgcmVsb2NhdGlvbiBAdmFye2NvZGV9IG9uIGRhdGEgZnJvbSB0aGUKLQlhcmNoaXRlY3R1cmUgbm90ZWQuCi0KLSovCi0KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgcmVsb2NfdHlwZV9sb29rdXAsIChhYmZkLCBjb2RlKSk7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGJmZF9ob3d0b18zMiA9Ci1IT1dUTyAoMCwgMDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJWUlQzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKTsKLQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCi1TWU5PUFNJUwotCXJlbG9jX2hvd3RvX3R5cGUgKmJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0JKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBhIGRlZmF1bHQgcmVsb2NhdGlvbiBsb29rdXAgcm91dGluZSBmb3IgYW55IGFyY2hpdGVjdHVyZS4KLQotCi0qLwotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICAvKiBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIGluIGEgY3Rvciwgd2hpY2ggd2lsbCBiZSBhcyB3aWRlIGFzIHRoZQotCSBhZGRyZXNzIC0gc28gZWl0aGVyIGEgNjQsIDMyLCBvciAxNiBiaXR0ZXIuICAqLwotICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0JewotCWNhc2UgNjQ6Ci0JICBCRkRfRkFJTCAoKTsKLQljYXNlIDMyOgotCSAgcmV0dXJuICZiZmRfaG93dG9fMzI7Ci0JY2FzZSAxNjoKLQkgIEJGRF9GQUlMICgpOwotCWRlZmF1bHQ6Ci0JICBCRkRfRkFJTCAoKTsKLQl9Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9GQUlMICgpOwotICAgIH0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBhIHByaW50YWJsZSBuYW1lIGZvciB0aGUgc3VwcGxpZWQgcmVsb2NhdGlvbiBjb2RlLgotCVVzZWZ1bCBtYWlubHkgZm9yIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzLgotKi8KLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGlmIChjb2RlID4gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXNbKGludCljb2RlXTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotCSAoYmZkICphYmZkLAotCSAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgYm9vbGVhbiAqKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIGZvciByZWxheGluZyBmb3IgYmFjayBlbmRzIHdoaWNoCi0JZG9uJ3QgZG8gcmVsYXhpbmcgLS0gaS5lLiwgZG9lcyBub3RoaW5nLgotKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgKmFnYWluID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQkgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIGZvciByZWxheGluZyBmb3IgYmFjayBlbmRzIHdoaWNoCi0JZG9uJ3QgZG8gc2VjdGlvbiBnYyAtLSBpLmUuLCBkb2VzIG5vdGhpbmcuCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9nZW5lcmljX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi1TWU5PUFNJUwotCWJmZF9ieXRlICoKLQkgICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGJmZCAqYWJmZCwKLQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0JICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0JICAgICBiZmRfYnl0ZSAqZGF0YSwKLQkgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotCSAgICAgYXN5bWJvbCAqKnN5bWJvbHMpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgb2YgcmVsb2NhdGlvbiBlZmZvcnQgZm9yIGJhY2sgZW5kcwotCXdoaWNoIGNhbid0IGJlIGJvdGhlcmVkIHRvIGRvIGl0IGVmZmljaWVudGx5LgotCi0qLwotCi1iZmRfYnl0ZSAqCi1iZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJICAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiByZWFkIGluIHRoZSBzZWN0aW9uICovCi0gIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJIChQVFIpIGRhdGEsCi0JCQkJIDAsCi0JCQkJIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2UncmUgbm90IHJlbGF4aW5nIHRoZSBzZWN0aW9uLCBzbyBqdXN0IGNvcHkgdGhlIHNpemUgaW5mbyAqLwotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudDsKLSAgICAgIGZvciAocGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50ICE9IChhcmVsZW50ICopIE5VTEw7Ci0JICAgcGFyZW50KyspCi0JewotCSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgciA9Ci0JICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwKLQkJCQkgICAgKnBhcmVudCwKLQkJCQkgICAgKFBUUikgZGF0YSwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTCwKLQkJCQkgICAgJmVycm9yX21lc3NhZ2UpOwotCi0JICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzICovCi0JICAgICAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSAqcGFyZW50OwotCSAgICAgIG9zLT5yZWxvY19jb3VudCsrOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkJICBCRkRfQVNTRVJUIChlcnJvcl9tZXNzYWdlICE9IChjaGFyICopIE5VTEwpOwotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJCShsaW5rX2luZm8sIGVycm9yX21lc3NhZ2UsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSAoKnBhcmVudCktPmhvd3RvLT5uYW1lLCAoKnBhcmVudCktPmFkZGVuZCwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9yZWxvYzE2LmMgYi9iZmQvcmVsb2MxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc5NTJlLi4wMDAwMDAwCi0tLSBhL2JmZC9yZWxvYzE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyogOCBhbmQgMTYgYml0IENPRkYgcmVsb2NhdGlvbiBmdW5jdGlvbnMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20gCi0qLwotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCBieSBjb2ZmLWg4MzAwIGFuZCBjb2ZmLXo4ayB0byBkbwotICAgcmVsb2NhdGlvbi4KLQotICAgRklYTUU6IFRoaXMgY29kZSBzaG91bGQgYmUgcmV3cml0dGVuIHRvIHN1cHBvcnQgdGhlIG5ldyBDT0ZGCi0gICBsaW5rZXIuICBCYXNpY2FsbHksIHRoZXkgbmVlZCB0byBkZWFsIHdpdGggQ09GRiByZWxvY3MgcmF0aGVyIHRoYW4KLSAgIEJGRCBnZW5lcmljIHJlbG9jcy4gIFRoZXkgc2hvdWxkIHN0b3JlIHRoZSByZWxvY3MgaW4gc29tZSBsb2NhdGlvbgotICAgd2hlcmUgY29mZl9saW5rX2lucHV0X2JmZCBjYW4gZmluZCB0aGVtIChhbmQgY29mZl9saW5rX2lucHV0X2JmZAotICAgc2hvdWxkIGJlIGNoYW5nZWQgdG8gdXNlIHRoaXMgbG9jYXRpb24gcmF0aGVyIHRoYW4gcmVyZWFkaW5nIHRoZQotICAgZmlsZSkgKHVubGVzcyBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNob3VsZAotICAgZnJlZSB1cCB0aGUgcmVsb2NzIGFmdGVyIGRlYWxpbmcgd2l0aCB0aGVtKS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLWJmZF92bWEKLWJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLSAgLyogQSBzeW1ib2wgaG9sZHMgYSBwb2ludGVyIHRvIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldCBmcm9tIHRoZQotICAgICBiYXNlIG9mIHRoZSBzZWN0aW9uLiAgVG8gcmVsb2NhdGUsIHdlIGZpbmQgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbAotICAgICBsaXZlIGluIHRoZSBvdXRwdXQgYW5kIGFkZCB0aGF0IGluICovCi0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIEJGRC4gIExvb2sgaXQgdXAgaW4gdGhlCi0JIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4KLQkgd2UgY29udmVydCB0aGlzIHN0dWZmIHRvIHVzZSBhIHNwZWNpZmljIGZpbmFsX2xpbmsgZnVuY3Rpb24KLQkgYW5kIGNoYW5nZSB0aGUgaW50ZXJmYWNlIHRvIGJmZF9yZWxheF9zZWN0aW9uIHRvIG5vdCByZXF1aXJlCi0JIHRoZSBnZW5lcmljIHN5bWJvbHMuICAqLwotICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGlucHV0X3NlY3Rpb24tPm93bmVyLCBsaW5rX2luZm8sCi0JCQkJCWJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCQkJCWZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXZhbHVlID0gKGgtPnUuZGVmLnZhbHVlCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JdmFsdWUgPSBoLT51LmMuc2l6ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCSAgaW5wdXRfc2VjdGlvbi0+b3duZXIsIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCSAgdmFsdWUgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgdmFsdWUgPSBzeW1ib2wtPnZhbHVlICsKLQlzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCSAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgIH0KLSAgCi0gIC8qIEFkZCB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZWxvY2F0aW9uICovCi0gIHZhbHVlICs9IHJlbG9jLT5hZGRlbmQ7Ci0gIAotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXZvaWQKLWJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgc2xpcCwgaW5wdXRfc2VjdGlvbiwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNsaXA7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBhc3ltYm9sICoqczsKLQotICBzID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpOwotICBCRkRfQVNTRVJUIChzICE9IChhc3ltYm9sICoqKSBOVUxMKTsKLQotICAvKiBGaW5kIGFsbCBzeW1ib2xzIHBhc3QgdGhpcyBwb2ludCwgYW5kIG1ha2UgdGhlbSBrbm93Ci0gICAgIHdoYXQncyBoYXBwZW5lZCAqLwotICB3aGlsZSAoKnMpIAotICAgIHsKLSAgICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24pIAotCXsKLQkgIC8qIFRoaXMgd2FzIHBvaW50aW5nIGludG8gdGhpcyBzZWN0aW9uLCBzbyBtYW5nbGUgaXQgKi8KLQkgIGlmIChwLT52YWx1ZSA+IHZhbHVlKQotCSAgICB7Ci0JICAgICAgcC0+dmFsdWUgLT0gc2xpcDsKLQkgICAgICBpZiAocC0+dWRhdGEucCAhPSBOVUxMKQotCQl7Ci0JCSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgcC0+dWRhdGEucDsKLQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLQkJICBoLT5yb290LnUuZGVmLnZhbHVlIC09IHNsaXA7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC51LmRlZi52YWx1ZSA9PSBwLT52YWx1ZSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHMrKzsKLSAgICB9ICAgIAotfQotCi1ib29sZWFuIAotYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uIChhYmZkLCBpLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBpLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBpOwotICBpbnQgKnNocmlua3M7Ci0gIGludCBzaHJpbmsgPSAwOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICAvKiBXZSBvbmx5IGRvIGdsb2JhbCByZWxheGF0aW9uIG9uY2UuICBJdCBpcyBub3Qgc2FmZSB0byBkbyBpdCBtdWx0aXBsZQotICAgICB0aW1lcyAoc2VlIGRpc2N1c3Npb24gb2YgdGhlICJzaHJpbmtzIiBhcnJheSBiZWxvdykuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY192ZWN0b3IgJiYgcmVsb2Nfc2l6ZSA+IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCB0aGUgcmVsb2NzIGFuZCB0aGluayBhYm91dCB0aGVtICovCi0gIHJlbG9jX2NvdW50ID0KLSAgICBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX3ZlY3RvciwKLQkJCSAgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgewotICAgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHJlbG9jMTYuYyBhbmQgcmVsYXRlZCByZWxheGluZyBjb2RlIGlzIHZlcnkgc2ltcGxlLCB0aGUgcHJpY2UKLSAgICAgZm9yIHRoYXQgc2ltcGxpY2l0eSBpcyB3ZSBjYW4gb25seSBjYWxsIHRoaXMgZnVuY3Rpb24gb25jZSBmb3IKLSAgICAgZWFjaCBzZWN0aW9uLgotCi0gICAgIFNvLCB0byBnZXQgdGhlIGJlc3QgcmVzdWx0cyB3aXRoaW4gdGhhdCBsaW1pdGF0aW9uLCB3ZSBkbyBtdWx0aXBsZQotICAgICByZWxheGluZyBwYXNzZXMgb3ZlciBlYWNoIHNlY3Rpb24gaGVyZS4gIFRoYXQgaW52b2x2ZXMga2VlcGluZyB0cmFjawotICAgICBvZiB0aGUgInNocmluayIgYXQgZWFjaCByZWxvYyBpbiB0aGUgc2VjdGlvbi4gIFRoaXMgYWxsb3dzIHVzIHRvCi0gICAgIGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSBsb2NhdGlvbiBvZiB0d28gcmVsb2NzIHdpdGhpbgotICAgICB0aGlzIHNlY3Rpb24uCi0KLSAgICAgSW4gdGhlb3J5LCBpZiB3ZSBrZXB0IHRoZSAic2hyaW5rcyIgYXJyYXkgZm9yIGVhY2ggc2VjdGlvbiBmb3IgdGhlCi0gICAgIGVudGlyZSBsaW5rLCB3ZSBjb3VsZCB1c2UgdGhlIGdlbmVyaWMgcmVsYXhpbmcgY29kZSBpbiB0aGUgbGlua2VyCi0gICAgIGFuZCBnZXQgYmV0dGVyIHJlc3VsdHMsIHBhcnRpY3VsYXJseSBmb3IganNyLT5ic3IgYW5kIDI0LT4xNiBiaXQKLSAgICAgbWVtb3J5IHJlZmVyZW5jZSByZWxheGF0aW9ucy4gICovCi0gICAgIAotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGludCBhbm90aGVyX3Bhc3MgPSAwOwotCi0gICAgICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc2hyaW5rcyBhcnJheSBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIHNocmlua3MgPSAoaW50ICopIGJmZF9tYWxsb2MgKHJlbG9jX2NvdW50ICogc2l6ZW9mIChpbnQpKTsKLSAgICAgIG1lbXNldCAoc2hyaW5rcywgMCwgcmVsb2NfY291bnQgKiBzaXplb2YgKGludCkpOwotCi0gICAgICAvKiBMb29wIHVudGlsIG5vdGhpbmcgY2hhbmdlcyBpbiB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZG8gewotCWFyZWxlbnQgKipwYXJlbnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0JbG9uZyBqOwotCi0JYW5vdGhlcl9wYXNzID0gMDsKLQotCWZvciAoaSA9IDAsIHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudDsgcGFyZW50KyssIGkrKykgCi0JICB7Ci0JICAgIC8qIExldCB0aGUgdGFyZ2V0L21hY2hpbmUgZGVwZW5kZW50IGNvZGUgZXhhbWluZSBlYWNoIHJlbG9jCi0JICAgICAgIGluIHRoaXMgc2VjdGlvbiBhbmQgYXR0ZW1wdCB0byBzaHJpbmsgaXQuICAqLwotCSAgICBzaHJpbmsgPSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCAqcGFyZW50LAotCQkJCQkJc2hyaW5rc1tpXSwgbGlua19pbmZvKTsKLQotCSAgICAvKiBJZiBpdCBzaHJ1bmssIG5vdGUgaXQgaW4gdGhlIHNocmlua3MgYXJyYXkgYW5kIHNldCB1cCBmb3IKLQkgICAgICAgYW5vdGhlciBwYXNzLiAgKi8KLQkgICAgaWYgKHNocmluayAhPSBzaHJpbmtzW2ldKQotCSAgICAgIHsKLQkgICAgICAgIGFub3RoZXJfcGFzcyA9IDE7Ci0JCWZvciAoaiA9IGkgKyAxOyBqIDwgcmVsb2NfY291bnQ7IGorKykKLQkJICBzaHJpbmtzW2pdICs9IHNocmluayAtIHNocmlua3NbaV07Ci0JICAgICAgfQotCSAgfQotICAKLSAgICAgIH0gd2hpbGUgKGFub3RoZXJfcGFzcyk7Ci0KLSAgICAgIGZyZWUoKGNoYXIgKilzaHJpbmtzKTsKLSAgICB9Ci0KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplIC09IHNocmluazsgIAotICBmcmVlKChjaGFyICopcmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJmZF9ieXRlICoKLWJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKGluX2FiZmQsCi0JCQkJCQlsaW5rX2luZm8sCi0JCQkJCQlsaW5rX29yZGVyLAotCQkJCQkJZGF0YSwKLQkJCQkJCXJlbG9jYXRlYWJsZSwKLQkJCQkJCXN5bWJvbHMpCi0gICAgIGJmZCAqaW5fYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgZG9uJ3QgYm90aGVyIHRvIHJlbGF4LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChpbl9hYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwKLQkJCQkJCSAgICAgICBkYXRhLCByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMoaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLAotCQkJCSBkYXRhLAotCQkJCSAwLAotCQkJCSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jKChzaXplX3QpIHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jX3ZlY3RvciAmJiByZWxvY19zaXplICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgewotICAgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAKLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcGFyZW50ID0gcmVsb2NfdmVjdG9yOwotICAgICAgYXJlbGVudCAqcmVsb2MgOwotICAgICAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgcnVuOwotICAgICAgdW5zaWduZWQgaW50IGlkeDsKLSAgICAKLSAgICAgIC8qIEZpbmQgaG93IGxvbmcgYSBydW4gd2UgY2FuIGRvICovCi0gICAgICB3aGlsZSAoZHN0X2FkZHJlc3MgPCBsaW5rX29yZGVyLT5zaXplKSAKLQl7Ci0JICByZWxvYyA9ICpwYXJlbnQ7Ci0JICBpZiAocmVsb2MpIAotCSAgICB7Ci0JICAgICAgLyogTm90ZSB0aGF0IHRoZSByZWxheGluZyBkaWRuJ3QgdGllIHVwIHRoZSBhZGRyZXNzZXMgaW4gdGhlCi0JCSByZWxvY2F0aW9uLCBzbyB3ZSB1c2UgdGhlIG9yaWdpbmFsIGFkZHJlc3MgdG8gd29yayBvdXQgdGhlCi0JCSBydW4gb2Ygbm9uLXJlbG9jYXRlZCBkYXRhICovCi0JICAgICAgcnVuID0gcmVsb2MtPmFkZHJlc3MgLSBzcmNfYWRkcmVzczsKLQkgICAgICBwYXJlbnQrKzsKLQkgICAgfQotCSAgZWxzZSAKLQkgICAgewotCSAgICAgIHJ1biA9IGxpbmtfb3JkZXItPnNpemUgLSBkc3RfYWRkcmVzczsKLQkgICAgfQotCSAgLyogQ29weSB0aGUgYnl0ZXMgKi8KLQkgIGZvciAoaWR4ID0gMDsgaWR4IDwgcnVuOyBpZHgrKykKLQkgICAgewotCSAgICAgIGRhdGFbZHN0X2FkZHJlc3MrK10gPSBkYXRhW3NyY19hZGRyZXNzKytdOwotCSAgICB9Ci0gICAgCi0JICAvKiBOb3cgZG8gdGhlIHJlbG9jYXRpb24gKi8KLSAgICAKLQkgIGlmIChyZWxvYykgCi0JICAgIHsKLQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIHJlbG9jLCBkYXRhLCAmc3JjX2FkZHJlc3MsCi0JCQkJCSAgICAmZHN0X2FkZHJlc3MpOwotCSAgICB9ICAgIAotCX0KLSAgICB9Ci0gIGZyZWUoKGNoYXIgKilyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZGF0YTsKLX0KLQpkaWZmIC0tZ2l0IGEvYmZkL3Jpc2NpeC5jIGIvYmZkL3Jpc2NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWFiNDlhLi4wMDAwMDAwCi0tLSBhL2JmZC9yaXNjaXguYworKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFJJU0MgaVggKEFjb3JuLCBhcm0pIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFJJU0MgaVggb3ZlcmxvYWRzIHRoZSBNQUdJQyBmaWVsZCB0byBpbmRpY2F0ZSBtb3JlIHRoYW4ganVzdCB0aGUgdXN1YWwKLSAgIFtaTk9dTUFHSUMgdmFsdWVzLiAgQWxzbyBpbmNsdWRlZCBhcmUgc3F1ZWV6aW5nIGluZm9ybWF0aW9uIGFuZAotICAgc2hhcmVkIGxpYnJhcnkgdXNhZ2UuICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGNvbWUgZnJvbSB0aGUgbWFuIHBhZ2UuICAqLwotI2RlZmluZSBTSExJQkxFTiA2MAotCi0jZGVmaW5lIE1GX0lNUFVSRSAgICAgICAwMDIwMAotI2RlZmluZSBNRl9TUVVFRVpFRCAgICAgMDEwMDAKLSNkZWZpbmUgTUZfVVNFU19TTCAgICAgIDAyMDAwCi0jZGVmaW5lIE1GX0lTX1NMICAgICAgICAwNDAwMAotCi0vKiBDb21tb24gY29tYmluYXRpb25zLiAgKi8KLSNkZWZpbmUgSU1BR0lDICAgICAgICAgIChNRl9JTVBVUkV8Wk1BR0lDKSAgICAgIC8qIERlbWFuZCBsb2FkIChpbXB1cmUgdGV4dCkgKi8KLSNkZWZpbmUgU1BPTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfE9NQUdJQykgICAgIC8qIE9NQUdJQyB3aXRoIGxhcmdlIGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIG1heSBjb250YWluIGEgcmVmIHRvIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFyZWQgbGliIHJlcXVpcmVkIGJ5IHRoZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iamVjdC4gKi8KLSNkZWZpbmUgU0xPTUFHSUMgICAgICAgIChNRl9JU19TTHxPTUFHSUMpIC8qIEEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0ZXh0IHBvcnRpb24gb2YgdGhlIG9iamVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGFpbnMgIm92ZXJmbG93IHRleHQiIGZyb20gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzaGFyZWQgbGlicmFyeSB0byBiZSBsaW5rZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHdpdGggYW4gb2JqZWN0ICovCi0jZGVmaW5lIFFNQUdJQyAgICAgICAgICAoTUZfU1FVRUVaRUR8Wk1BR0lDKSAgICAvKiBTcWVlemVkIGRlbWFuZCBwYWdlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IFRoaXMgaW50ZXJwcmV0YXRpb24gb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNQUdJQyBzZWVtcyB0byBiZSBhdCB2YXJpYW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2l0aCB0aGF0IHVzZWQgb24gb3RoZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyY2hpdGVjdHVyZXMuICovCi0jZGVmaW5lIFNQWk1BR0lDICAgICAgICAoTUZfVVNFU19TTHxaTUFHSUMpICAgICAvKiBwcm9ncmFtIHdoaWNoIHVzZXMgc2wgKi8KLSNkZWZpbmUgU1BRTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfFFNQUdJQykgICAgIC8qIHNxZWV6ZWQgZGl0dG8gKi8KLSNkZWZpbmUgU0xaTUFHSUMgICAgICAgIChNRl9JU19TTHxaTUFHSUMpICAgICAgIC8qIHNoYXJlZCBsaWIgcGFydCBvZiBwcm9nICovCi0jZGVmaW5lIFNMUFpNQUdJQyAgICAgICAoTUZfVVNFU19TTHxTTFpNQUdJQykgICAvKiBzbCB3aGljaCB1c2VzIGFub3RoZXIgKi8KLQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2luZm8gJiBNRl9VU0VTX1NMKQotCi0vKiBPbmx5IGEgcHVyZSBPTUFHSUMgZmlsZSBoYXMgdGhlIG1pbmltYWwgaGVhZGVyICovCi0jZGVmaW5lIE5fVFhUT0ZGKHgpICAgICAgICAgICAgICAgICAgICAgXAotICgoeCkuYV9pbmZvID09IE9NQUdJQyA/IDMyICAgICAgICAgICAgIFwKLSAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMpID8gVEFSR0VUX1BBR0VfU0laRSAgXAotICA6IDk5OSkKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIC8qIFByb2dyYW1zIHdpdGggc2hhcmVkIGxpYnMgYXJlIGxvYWRlZCBhdCB0aGUgZmlyc3QgcGFnZSBhZnRlciBhbGwgdGhlICAgXAotICAgICAgdGV4dCBzZWdtZW50cyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgcHJvZ3JhbXMuICBXaXRob3V0IGxvb2tpbmcgdGhpcyAgICBcCi0gICAgICB1cCB3ZSBjYW4ndCBrbm93IGV4YWN0bHkgd2hhdCB0aGUgYWRkcmVzcyB3aWxsIGJlLiAgQSByZWFzb25hYmxlIGd1ZXNzIFwKLSAgICAgIGlzIHRoYXQgYV9lbnRyeSB3aWxsIGJlIGluIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBleGVjdXRhYmxlLiAgKi8gICAgICAgXAotICAgOiBOX1NIQVJFRF9MSUIoeCkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgOiBURVhUX1NUQVJUX0FERFIpCi0KLSNkZWZpbmUgTl9TWU1PRkYoeCkgXAotICAoTl9UWFRPRkYgKHgpICsgKHgpLmFfdGV4dCArICh4KS5hX2RhdGEgKyAoeCkuYV90cnNpemUgKyAoeCkuYV9kcnNpemUpCi0KLSNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGICh4KSArICh4KS5hX3N5bXMpCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDMyNzY4Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMzI3NjgKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2FybQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQocmlzY2l4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcmlzY2l4IgotI2RlZmluZSBOX0JBRE1BRyh4KSAoKCgoeCkuYV9pbmZvICYgfjAwNzIwMCkgIT0gWk1BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKCh4KS5hX2luZm8gJiB+MDA2MDAwKSAhPSBPTUFHSUMpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICgoeCkuYV9pbmZvICE9IE5NQUdJQykpCi0jZGVmaW5lIE5fTUFHSUMoeCkgKCh4KS5hX2luZm8gJiB+MDcyMDApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgXAotICB7CQkJCQkJCQkJICAgXAotICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJCSAgIFwKLSAgICBmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkJICAgXAotICAgIGlmIChhZGF0YShhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCQkJCSAgIFwKLSAgICAgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwkgICBcCi0gICAgCQkJCQkJCQkJICAgXAotICAgIGV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CSAgIFwKLSAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CQkJICAgXAotICAgIAkJCQkJCQkJCSAgIFwKLSAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgIFwKLQkJICAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkJICAgXAotICAgIGV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgXAotCQkgICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCQkgICBcCi0gICAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJCSAgIFwKLSAgICAJCQkJCQkJCQkgICBcCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgIFwKLSAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkJICAgXAotCSE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICBcCi0gICAgICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLSAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgXAotCQkJCQkJCQkJICAgXAotICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkJICAgXAotCSYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCQkJCSAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fU1lNT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmICghIE5BTUUoYW91dCx3cml0ZV9zeW1zKShhYmZkKSkgcmV0dXJuIGZhbHNlOwkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoISByaXNjaXhfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCSAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkJICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0gICAgICB9CQkJCQkJCQkJICAgXAotICB9Ci0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNiBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCSAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tdID0gewotICAvKiB0eXBlICAgICAgICAgICAgICBycyBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgIHNldG1hc2sgICAgcGNkb25lICovCi0gIEhPV1RPKCAwLCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwgICAgICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyggMSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLCAgICAgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCAyLCAgICAgICAgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDMsICAgICAgICAgICAgICAyLCAgMywgICAyNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgcmlzY2l4X2ZpeF9wY3JlbF8yNiAsICJBUk0yNiIsICAgICAgdHJ1ZSwgMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCA0LCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsICAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyggNSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8oIDYsICAgICAgICAgICAgICAwLCAgMiwgICAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AzMiIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPKCA3LCAgICAgICAgICAgICAgMiwgIDMsICAgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICByaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUsICJBUk0yNkQiLHRydWUsMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCi0gIHstMX0sCi0gIEhPV1RPKCA5LCAgICAgICAgICAgICAgMCwgLTEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUcxNiIsICAgICAgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDEwLCAgICAgICAgICAgICAgMCwgLTIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUczMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKQotfTsKLQotI2RlZmluZSBSSVNDSVhfVEFCTEVfU0laRSBcCi0gIChzaXplb2YgKHJpc2NpeF9zdGRfcmVsb2NfaG93dG8pIC8gc2l6ZW9mIChyZWxvY19ob3d0b190eXBlKSkKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICBpZiAocmVsb2NhdGlvbiAmIDMpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKLSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKLSAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZyaXNjaXhfc3RkX3JlbG9jX2hvd3RvWzddOwotICAKLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotREVGVU4ocmlzY2l4X3JlbG9jX3R5cGVfbG9va3VwLChhYmZkLGNvZGUpLAotICAgICAgYmZkICphYmZkIEFORAotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpCi17Ci0jZGVmaW5lIEFTVEQoaSxqKSAgICAgICBjYXNlIGk6IHJldHVybiAmcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tqXQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNiwgMSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzIsIDIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsIDMpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzhfUENSRUwsIDQpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCA1KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgNik7Ci0gICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgc2hvdWxkX25vdF9iZV91c2VkCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHJpc2NpeF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgcmlzY2l4X2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2RlZmluZSBNWV9vYmplY3RfcCByaXNjaXhfb2JqZWN0X3AKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnJpc2NpeF9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotCi12b2lkCi1yaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnID0gMDsJLyogTmVnYXRpdmUgcmVsb2NzIHVzZSB0aGUgQkFTRVJFTCBiaXQuICAqLwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX2xlbmd0aCA9IGctPmhvd3RvLT5zaXplIDsgICAvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIGlmIChyX2xlbmd0aCA8IDApCi0gICAgewotICAgICAgcl9sZW5ndGggPSAtcl9sZW5ndGg7Ci0gICAgICByX25lZyA9IDE7Ci0gICAgfQotCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLQotICAvKiBGb3IgUklTQyBpWCwgaW4gcGMtcmVsYXRpdmUgcmVsb2NzIHRoZSByX3BjcmVsIGJpdCBtZWFucyB0aGF0IHRoZQotICAgICByZWxvY2F0aW9uIGhhcyBiZWVuIGRvbmUgYWxyZWFkeSAoT25seSBmb3IgdGhlIDI2LWJpdCBvbmUgSSB0aGluayk/Pz8hISEKLSAgICAgKi8KLSAgCi0gIGlmIChyX2xlbmd0aCA9PSAzKQotICAgIHJfcGNyZWwgPSByX3BjcmVsID8gMCA6IDE7Ci0gIAotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUc6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEU6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0gICAgfQotfQotCi1ib29sZWFuCi1yaXNjaXhfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICB1bnNpZ25lZCBjaGFyICpuYXRpdmUsICpuYXRwdHI7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0gIAotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc2l6ZV90IG5hdHNpemU7Ci0KLSAgaWYgKGNvdW50ID09IDApIHJldHVybiB0cnVlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OwotICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKLSAgaWYgKCFuYXRpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQotICBmb3IgKG5hdHB0ciA9IG5hdGl2ZTsKLSAgICAgICBjb3VudCAhPSAwOwotICAgICAgIC0tY291bnQsIG5hdHB0ciArPSBlYWNoX3NpemUsICsrZ2VuZXJpYykKLSAgICByaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCAqZ2VuZXJpYywKLQkJCSAgICAgICAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBuYXRwdHIpOwotCi0gIGlmICggYmZkX3dyaXRlICgoUFRSKSBuYXRpdmUsIDEsIG5hdHNpemUsIGFiZmQpICE9IG5hdHNpemUpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UoYWJmZCwgbmF0aXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi0gKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgYW91dHguaCB2ZXJzaW9uIGJ1dCB3ZSBuZWVkIHRvIGRvIG91cgotICogb3duIG1hcHBpbmcgb2YgZXh0ZXJuYWwgcmVsb2MgdHlwZSB2YWx1ZXMgdG8gaG93dG8gZW50cmllcy4KLSAqLwotbG9uZwotTVkoY2Fub25pY2FsaXplX3JlbG9jKShhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgICBiZmQgKmFiZmQ7Ci0gICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCwgYzsKLSAgZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgTkFNRShhb3V0LHN0ZF9ob3d0b190YWJsZSlbXTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZSwgcmV0dXJuIHRoZSB2YWx1ZXMuICovCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykgewotICAgICAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OwotICAgIH0KLSAgICAqcmVscHRyID0gMDsKLSAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIH0KLSAgaWYgKHRibHB0ciAmJiBzZWN0aW9uLT5yZWxvY19jb3VudCkgewotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgKnJlbHB0ciA9IDA7Ci0gICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB9Ci0KLSAgaWYgKCFOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQotICAgIHJldHVybiAtMTsKLSAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAvKiBmaXggdXAgaG93dG8gZW50cmllcyAqLwotICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLSAgICB7Ci0gICAgICBjID0gdGJscHRyLT5ob3d0byAtIE5BTUUoYW91dCxzdGRfaG93dG9fdGFibGUpOwotICAgICAgQkZEX0FTU0VSVCAoYyA8IFJJU0NJWF9UQUJMRV9TSVpFKTsKLSAgICAgIHRibHB0ci0+aG93dG8gPSAmcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tjXTsKLQotICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgfQotICAqcmVscHRyID0gMDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi0vKiBUaGlzIGlzIHRoZSBzYW1lIGFzIE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApLCBidXQgaGFzIGRpZmZlcmVudCAKLSAgIGV4cGFuc2lvbnMgb2YgdGhlIG1hY3JvIGRlZmluaXRpb25zLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1yaXNjaXhfc29tZV9hb3V0X29iamVjdF9wIChhYmZkLCBleGVjcCwgY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLXsKLSAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0ciwgKm9sZHJhd3B0cjsKLSAgY29uc3QgYmZkX3RhcmdldCAqcmVzdWx0OwotCi0gIHJhd3B0ciA9ICgoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICopIAotCSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICkpKTsKLQotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgb2xkcmF3cHRyID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhOwotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0KLSAgLyogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIG9sZCB0ZGF0YSBzdHJ1Y3QuCi0gICAgIEluIHBhcnRpY3VsYXIsIHdlIHdhbnQgdGhlIHN1YmZvcm1hdCwgc2luY2UgZm9yIGhwdXggaXQgd2FzIHNldCBpbgotICAgICBocDMwMGhwdXguYzpzd2FwX2V4ZWNfaGVhZGVyX2luIGFuZCB3aWxsIGJlIHVzZWQgaW4KLSAgICAgaHAzMDBocHV4LmM6Y2FsbGJhY2suICAqLwotICBpZiAob2xkcmF3cHRyICE9IE5VTEwpCi0gICAgKmFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9ICpvbGRyYXdwdHI7Ci0KLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkciA9ICZyYXdwdHItPmU7Ci0gICooYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcikgPSAqZXhlY3A7ICAgICAvKiBDb3B5IGluIHRoZSBpbnRlcm5hbF9leGVjCi0JCQkJCQkgICBzdHJ1Y3QgKi8KLSAgZXhlY3AgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyOwotCi0gIC8qIFNldCB0aGUgZmlsZSBmbGFncyAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGV4ZWNwLT5hX2Ryc2l6ZSB8fCBleGVjcC0+YV90cnNpemUpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICAvKiBTZXR0aW5nIG9mIEVYRUNfUCBoYXMgYmVlbiBkZWZlcnJlZCB0byB0aGUgYm90dG9tIG9mIHRoaXMgZnVuY3Rpb24gKi8KLSAgaWYgKGV4ZWNwLT5hX3N5bXMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKLSAgaWYgKE5fRFlOQU1JQygqZXhlY3ApKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLQkJCQkJCQkJICAKLSAgaWYgKChleGVjcC0+YV9pbmZvICYgTUZfU1FVRUVaRUQpICE9IDApIC8qIFNxdWVlemVkIGZpbGVzIGFyZW4ndCBzdXBwb3J0ZWQgCi0JCQkJCSAgICAgKHlldCkhICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChleGVjcC0+YV9pbmZvICYgTUZfSVNfU0wpICE9IDApCS8qIE5vciBhcmUgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IFpNQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEIHwgV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE5NQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gbl9tYWdpYzsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gT01BR0lDKQotICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG9fbWFnaWM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaG91bGQgaGF2ZSBiZWVuIGNoZWNrZWQgd2l0aCBOX0JBRE1BRyBiZWZvcmUgdGhpcyByb3V0aW5lCi0gICAgICAgICB3YXMgY2FsbGVkLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gZXhlY3AtPmFfZW50cnk7Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSAoYW91dF9zeW1ib2xfdHlwZSAqKU5VTEw7Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZXhlY3AtPmFfc3ltcyAvIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLQotICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBWNyBVbml4LiAgKi8KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgLyogVGhlIGRlZmF1bHQgc3ltYm9sIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBVbml4LiAqLwotICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gTlVMTDsKLSAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBOVUxMOwotCi0gIGlmICghIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9kYXRhOwotICBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfYnNzOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmxhZ3MgPQotICAgIChleGVjcC0+YV90cnNpemUgIT0gMAotICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKLSAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9Ci0gICAgKGV4ZWNwLT5hX2Ryc2l6ZSAhPSAwCi0gICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQotICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUykpOwotICBvYmpfYnNzc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0KLSAgcmVzdWx0ID0gKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKShhYmZkKTsKLQotI2lmIGRlZmluZWQoTUFDSCkgfHwgZGVmaW5lZChTVEFUX0ZPUl9FWEVDKQotICAvKiBUaGUgb3JpZ2luYWwgaGV1cmlzdGljIGRvZXNuJ3Qgd29yayBpbiBzb21lIGltcG9ydGFudCBjYXNlcy4gVGhlCi0gICAqIGEub3V0IGZpbGUgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXh0IHN0YXJ0IGFkZHJlc3MuIEZvcgotICAgKiBmaWxlcyAobGlrZSBrZXJuZWxzKSBsaW5rZWQgdG8gbm9uLXN0YW5kYXJkIGFkZHJlc3NlcyAobGQgLVR0ZXh0Ci0gICAqIG5ubikgdGhlIGVudHJ5IHBvaW50IG1heSBub3QgYmUgYmV0d2VlbiB0aGUgZGVmYXVsdCB0ZXh0IHN0YXJ0Ci0gICAqIChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSBhbmQgKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpICsgdGV4dCBzaXplCi0gICAqIFRoaXMgaXMgbm90IGp1c3QgYSBtYWNoIGlzc3VlLiBNYW55IGtlcm5lbHMgYXJlIGxvYWRlZCBhdCBub24KLSAgICogc3RhbmRhcmQgYWRkcmVzc2VzLgotICAgKi8KLSAgewotICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOwotICAgIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMCi0JJiYgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgPT0gMAotICAgICAgICAmJiAoZnN0YXQoZmlsZW5vKChGSUxFICopIChhYmZkLT5pb3N0cmVhbSkpLCAmc3RhdF9idWYpID09IDApCi0gICAgICAgICYmICgoc3RhdF9idWYuc3RfbW9kZSAmIDAxMTEpICE9IDApKQotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICB9Ci0jZWxzZSAvKiAhIE1BQ0ggKi8KLSAgLyogTm93IHRoYXQgdGhlIHNlZ21lbnQgYWRkcmVzc2VzIGhhdmUgYmVlbiB3b3JrZWQgb3V0LCB0YWtlIGEgYmV0dGVyCi0gICAgIGd1ZXNzIGF0IHdoZXRoZXIgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZS4gIElmIHRoZSBlbnRyeSBwb2ludAotICAgICBpcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYXNzdW1lIGl0IGlzLiAgKFRoaXMgbWFrZXMgZmlsZXMKLSAgICAgZXhlY3V0YWJsZSBldmVuIGlmIHRoZWlyIGVudHJ5IHBvaW50IGFkZHJlc3MgaXMgMCwgYXMgbG9uZyBhcwotICAgICB0aGVpciB0ZXh0IHN0YXJ0cyBhdCB6ZXJvLikKLQotICAgICBBdCBzb21lIHBvaW50IHdlIHNob3VsZCBwcm9iYWJseSBicmVhayBkb3duIGFuZCBzdGF0IHRoZSBmaWxlIGFuZAotICAgICBkZWNsYXJlIGl0IGV4ZWN1dGFibGUgaWYgKG9uZSBvZikgaXRzICd4JyBiaXRzIGFyZSBvbi4uLiAgKi8KLSAgaWYgKChleGVjcC0+YV9lbnRyeSA+PSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSAmJgotICAgICAgKGV4ZWNwLT5hX2VudHJ5IDwgb2JqX3RleHRzZWMoYWJmZCktPnZtYSArIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSNlbmRpZiAvKiBNQUNIICovCi0gIGlmIChyZXN1bHQpCi0gICAgewotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZyZWUgKHJhd3B0cik7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSBvbGRyYXdwdHI7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLU1ZKG9iamVjdF9wKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOyAgICAgIC8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsgICAgICAgICAgICAvKiBDbGVhbmVkLXVwIGV4ZWMgaGVhZGVyICovCi0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleGVjX2J5dGVzLmVfaW5mbyk7Ci0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkgcmV0dXJuIDA7Ci0jaWZkZWYgTUFDSFRZUEVfT0sKLSAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpIHJldHVybiAwOwotI2VuZGlmCi0KLSAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pKGFiZmQsICZleGVjX2J5dGVzLCAmZXhlYyk7Ci0KLSAgdGFyZ2V0ID0gcmlzY2l4X3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmV4ZWMsIE1ZKGNhbGxiYWNrKSk7Ci0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9yczYwMDAtY29yZS5jIGIvYmZkL3JzNjAwMC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDU1NWYuLjAwMDAwMDAKLS0tIGEvYmZkL3JzNjAwMC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLyogSUJNIFJTLzYwMDAgIlhDT0ZGIiBiYWNrLWVuZCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEZJWE1FOiBDYW4gc29tZW9uZSBwcm92aWRlIGEgdHJhbnNsaXRlcmF0aW9uIG9mIHRoaXMgbmFtZSBpbnRvIEFTQ0lJPwotICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFycyBjYXVzZWQgYSBjb21waWxlciB3YXJuaW5nIG9uIEhJVVggKHNvIEkgcmVwbGFjZWQKLSAgIHRoZW0gd2l0aCBvY3RhbCBlc2NhcGVzKSwgYW5kIGlzbid0IHVzZWZ1bCB3aXRob3V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdAotICAgY2hhcmFjdGVyIHNldCBpdCBpcy4KLSAgIFdyaXR0ZW4gYnkgTWV0aW4gRy4gT3ppc2lrLCBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1LCAKLSAgICAgYW5kIEpvaG4gR2lsbW9yZS4KLSAgIEFyY2hpdmUgc3VwcG9ydCBmcm9tIERhbW9uIEEuIFBlcm1lemVsLgotICAgQ29udHJpYnV0ZWQgYnkgSUJNIENvcnBvcmF0aW9uIGFuZCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHBvcnQgY3VycmVudGx5IG9ubHkgaGFuZGxlcyByZWFkaW5nIG9iamVjdCBmaWxlcywgZXhjZXB0IHdoZW4KLSAgIGNvbXBpbGVkIG9uIGFuIFJTLzYwMDAgaG9zdC4gIC0tIG5vIGFyY2hpdmUgc3VwcG9ydCwgbm8gY29yZSBmaWxlcy4KLSAgIEluIGFsbCBjYXNlcywgaXQgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nLgotCi0gICBGSVhNRW1nbyBjb21tZW50cyBhcmUgbGVmdCBmcm9tIE1ldGluIE96aXNpaydzIG9yaWdpbmFsIHBvcnQuCi0KLSAgIFRoaXMgaXMgaW4gYSBzZXBhcmF0ZSBmaWxlIGZyb20gY29mZi1yczYwMDAuYywgYmVjYXVzZSBpdCBpbmNsdWRlcwotICAgc3lzdGVtIGluY2x1ZGUgZmlsZXMgdGhhdCBjb25mbGljdCB3aXRoIGNvZmYvcnM2MDAwLmguCi0gICovCi0KLS8qIEludGVybmFsY29mZi5oIGFuZCBjb2ZmY29kZS5oIG1vZGlmeSB0aGVtc2VsdmVzIGJhc2VkIG9uIHRoaXMgZmxhZy4gICovCi0jZGVmaW5lIFJTNjAwMENPRkZfQyAxCi0KLS8qIFRoZSBBSVggNC4xIGtlcm5lbCBpcyBvYnZpb3VzbHkgY29tcGlsZWQgd2l0aCAtRF9MT05HX0xPTkcsIHNvCi0gICB3ZSBoYXZlIHRvIGRlZmluZSBfTE9OR19MT05HIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBnY2MgdG8gZ2V0IHRoZQotICAgcHJvcGVyIGFsaWdubWVudHMgaW4gdGhlIHVzZXIgc3RydWN0dXJlLiAgKi8KLSNpZiBkZWZpbmVkKF9BSVg0MSkgJiYgIWRlZmluZWQoX0xPTkdfTE9ORykKLSNkZWZpbmUgX0xPTkdfTE9ORwotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmZGVmIEFJWF9DT1JFCi0KLS8qIEFPVVRIRFIgaXMgZGVmaW5lZCBieSB0aGUgYWJvdmUuICBXZSBuZWVkIGFub3RoZXIgZGVmbiBvZiBpdCwgZnJvbSB0aGUKLSAgIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgUHVudCB0aGUgb2xkIG9uZSBhbmQgZ2V0IHVzIGEgbmV3IG5hbWUgZm9yIHRoZQotICAgdHlwZWRlZiBpbiB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAqLwotI2lmZGVmIEFPVVRIRFIKLSN1bmRlZiBBT1VUSERSCi0jZW5kaWYKLSNkZWZpbmUJQU9VVEhEUglzZWNvbmRfQU9VVEhEUgotCi0jdW5kZWYJU0NOSERSCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKglTdXBwb3J0IGZvciBjb3JlIGZpbGUgc3R1ZmYuLiAJCQkJCSAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgotI2luY2x1ZGUgPHN5cy9sZHIuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0KLS8qIE51bWJlciBvZiBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzIHN1cHBvcnRlZCBieSBnZGIuICBUaGlzIHZhbHVlCi0gICBzaG91bGQgbWF0Y2ggYHRtLmgnIGluIGdkYiBkaXJlY3RvcnkuICBDbGVhbiB0aGlzIG1lc3MgdXAgYW5kIHVzZQotICAgdGhlIG1hY3JvcyBpbiBzeXMvcmVnLmguICBGSVhNRW1nby4gKi8KLQotI2RlZmluZQlOVU1fT0ZfU1BFQ19SRUdTICA3Ci0KLSNkZWZpbmUJY29yZV9oZHIoYmZkKQkJKCgoUnM2a0NvckRhdGEqKShiZmQtPnRkYXRhLmFueSkpLT5oZHIpCi0KLS8qIEFJWCA0LjEgQ2hhbmdlZCB0aGUgbmFtZXMgYW5kIGxvY2F0aW9ucyBvZiBhIGZldyBpdGVtcyBpbiB0aGUgY29yZSBmaWxlLAotICAgdGhpcyBzZWVtcyB0byBiZSB0aGUgcXVpY2tlc3QgZWFzaWV0IHdheSB0byBkZWFsIHdpdGggaXQuIAotCi0gICBOb3RlIGhvd2V2ZXIgdGhhdCBlbmNvZGluZyBtYWdpYyBhZGRyZXNzZXMgKFNUQUNLX0VORF9BRERSKSBpcyBnb2luZwotICAgdG8gYmUgX3ZlcnlfIGZyYWdpbGUuICBCdXQgSSBkb24ndCBzZWUgYW55IGVhc3kgd2F5IHRvIGdldCB0aGF0IGluZm8KLSAgIHJpZ2h0IG5vdy4gICovCi0jaWZkZWYgQ09SRV9WRVJTSU9OXzEKLSNkZWZpbmUgQ09SRV9EQVRBX1NJWkVfRklFTEQgY191LlVfZHNpemUKLSNkZWZpbmUgQ09SRV9DT01NX0ZJRUxEIGNfdS5VX2NvbW0KLSNkZWZpbmUgU0FWRV9GSUVMRCBjX21zdAotI2RlZmluZQlTVEFDS19FTkRfQUREUiAweDJmZjIzMDAwCi0jZWxzZQotI2RlZmluZSBDT1JFX0RBVEFfU0laRV9GSUVMRCBjX3UudV9kc2l6ZQotI2RlZmluZSBDT1JFX0NPTU1fRklFTEQgY191LnVfY29tbQotI2RlZmluZSBTQVZFX0ZJRUxEIGNfdS51X3NhdmUKLSNkZWZpbmUJU1RBQ0tfRU5EX0FERFIgMHgyZmY4MDAwMAotI2VuZGlmCi0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBjb3JlX2R1bXAgaGRyOwkJLyogY29yZSBmaWxlIGhlYWRlciAqLwotfSBSczZrQ29yRGF0YTsKLQotc3RhdGljIGFzZWN0aW9uICptYWtlX2JmZF9hc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBmbGFnd29yZCwKLQkJCQkJICAgIGJmZF9zaXplX3R5cGUsIGJmZF92bWEsIGZpbGVfcHRyKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gODsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLS8qIERlY2lkZSBpZiBhIGdpdmVuIGJmZCByZXByZXNlbnRzIGEgYGNvcmUnIGZpbGUgb3Igbm90LiBUaGVyZSByZWFsbHkgaXMgbm8KLSAgIG1hZ2ljIG51bWJlciBvciBhbnl0aGluZyBsaWtlLCBpbiByczYwMDBjb2ZmLiAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXJzNjAwMGNvZmZfY29yZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBjb3JlX2R1bXAgY29yZWRhdGE7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIGJmZF9zaXplX3R5cGUgbnJlYWQ7Ci0gIGNoYXIgKnRtcHB0cjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5yZWFkID0gYmZkX3JlYWQgKCZjb3JlZGF0YSwgMSwgc2l6ZW9mIChzdHJ1Y3QgY29yZV9kdW1wKSwgYWJmZCk7Ci0gIGlmIChucmVhZCAhPSBzaXplb2YgKHN0cnVjdCBjb3JlX2R1bXApKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGUgY29yZSBmaWxlIHVsaW1pdCBpcyB0b28gc21hbGwsIHRoZSBzeXN0ZW0gd2lsbCBmaXJzdAotICAgICBvbWl0IHRoZSBkYXRhIHNlZ21lbnQsIHRoZW4gb21pdCB0aGUgc3RhY2ssIHRoZW4gZGVjbGluZSB0bwotICAgICBkdW1wIGNvcmUgYWx0b2dldGhlciAoYXMgZmFyIGFzIEkga25vdyBVQkxPQ0tfVkFMSUQgYW5kIExFX1ZBTElECi0gICAgIGFyZSBhbHdheXMgc2V0KSAodGhpcyBpcyBiYXNlZCBvbiBleHBlcmltZW50YXRpb24gb24gQUlYIDMuMikuCi0gICAgIE5vdywgdGhlIHRoaW5nIGlzIHRoYXQgR0RCIHVzZXJzIHdpbGwgYmUgc3VycHJpc2VkCi0gICAgIGlmIHNlZ21lbnRzIGp1c3Qgc2lsZW50bHkgZG9uJ3QgYXBwZWFyICh3ZWxsLCBtYXliZSB0aGV5IHdvdWxkCi0gICAgIHRoaW5rIHRvIGNoZWNrICJpbmZvIGZpbGVzIiwgSSBkb24ndCBrbm93KS4KLQotICAgICBGb3IgdGhlIGRhdGEgc2VnbWVudCwgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGtlZXAgZ29pbmcgaWYgaXQncwotICAgICBub3QgdGhlcmUsIHNpbmNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG5vdCB0byBkdW1wIGl0IChyZWdhcmRsZXNzCi0gICAgIG9mIHRoZSB1bGltaXQsIGl0J3MgYmFzZWQgb24gU0FfRlVMTERVTVApLiAgQnV0IGZvciB0aGUgc3RhY2sgc2VnbWVudCwKLSAgICAgaWYgaXQncyBub3QgdGhlcmUsIHdlIHJlZnVzZSB0byBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhpcyBjb3JlCi0gICAgIGZpbGUuICBUaGUgdXNlZnVsbmVzcyBvZiBhIGNvcmUgZHVtcCB3aXRob3V0IGEgc3RhY2sgc2VnbWVudCBpcyBwcmV0dHkKLSAgICAgbGltaXRlZCBhbnl3YXkuICAqLwotICAgICAKLSAgaWYgKCEoY29yZWRhdGEuY19mbGFnICYgVUJMT0NLX1ZBTElEKQotICAgICAgfHwgIShjb3JlZGF0YS5jX2ZsYWcgJiBMRV9WQUxJRCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEoY29yZWRhdGEuY19mbGFnICYgVVNUQUNLX1ZBTElEKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIERvbid0IGNoZWNrIHRoZSBjb3JlIGZpbGUgc2l6ZSBmb3IgYSBmdWxsIGNvcmUsIEFJWCA0LjEgaW5jbHVkZXMKLSAgICAgYWRkaXRpb25hbCBzaGFyZWQgbGlicmFyeSBzZWN0aW9ucyBpbiBhIGZ1bGwgY29yZS4gICovCi0gIGlmICghKGNvcmVkYXRhLmNfZmxhZyAmIChGVUxMX0NPUkUgfCBDT1JFX1RSVU5DKSkKLSAgICAgICYmICgoYmZkX3ZtYSljb3JlZGF0YS5jX3N0YWNrICsgY29yZWRhdGEuY19zaXplKSAhPSBzdGF0YnVmLnN0X3NpemUpCi0gICAgewotICAgICAgLyogSWYgdGhlIHNpemUgaXMgd3JvbmcsIGl0IG1lYW5zIHdlJ3JlIG1pc2ludGVycHJldGluZyBzb21ldGhpbmcuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIG9uIHRoZSBjX3RhYiBmaWVsZC4gICovCi0gIGlmICgodV9sb25nKSBjb3JlZGF0YS5jX3RhYiA8IHNpemVvZiBjb3JlZGF0YSB8fAotICAgICAgKHVfbG9uZykgY29yZWRhdGEuY190YWIgPj0gc3RhdGJ1Zi5zdF9zaXplIHx8Ci0gICAgICAobG9uZykgY29yZWRhdGEuY190YWIgPj0gKGxvbmcpY29yZWRhdGEuY19zdGFjaykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJc3N1ZSB3YXJuaW5nIGlmIHRoZSBjb3JlIGZpbGUgd2FzIHRydW5jYXRlZCBkdXJpbmcgd3JpdGluZy4gICovCi0gIGlmIChjb3JlZGF0YS5jX2ZsYWcgJiBDT1JFX1RSVU5DKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHdhcm5pbmcgY29yZSBmaWxlIHRydW5jYXRlZCIpLAotCQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIC8qIEFsbG9jYXRlIGNvcmUgZmlsZSBoZWFkZXIuICAqLwotICB0bXBwdHIgPSAoY2hhciopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoUnM2a0NvckRhdGEpKTsKLSAgaWYgKCF0bXBwdHIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgICAKLSAgc2V0X3RkYXRhIChhYmZkLCB0bXBwdHIpOwotCi0gIC8qIENvcHkgY29yZSBmaWxlIGhlYWRlci4gICovCi0gIGNvcmVfaGRyIChhYmZkKSA9IGNvcmVkYXRhOwotCi0gIC8qIC5zdGFjayBzZWN0aW9uLiAqLwotICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwKLSAgCQkJICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgIChiZmRfc2l6ZV90eXBlKSBjb3JlZGF0YS5jX3NpemUsCi0JCQkgIChiZmRfdm1hKSAoU1RBQ0tfRU5EX0FERFIgLSBjb3JlZGF0YS5jX3NpemUpLAotCQkJICAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfc3RhY2spKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIC5yZWcgc2VjdGlvbiBmb3IgR1BScyBhbmQgc3BlY2lhbCByZWdpc3RlcnMuICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgKCgzMiArIE5VTV9PRl9TUEVDX1JFR1MpICogNCksCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoZmlsZV9wdHIpICgoY2hhciAqKSAmY29yZWRhdGEuU0FWRV9GSUVMRAotCQkJCSAgICAgIC0gKGNoYXIgKikgJmNvcmVkYXRhKSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogLnJlZzIgc2VjdGlvbiBmb3IgRlBScyAoZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKS4gKi8KLSAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWcyIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgOCAqIDMyLAkvKiAzMiBGUFJzLiAqLwotCQkJICAoYmZkX3ZtYSkgMCwKLQkJCSAgKGZpbGVfcHRyKSAoKGNoYXIgKikgJmNvcmVkYXRhLlNBVkVfRklFTEQuZnByWzBdCi0JCQkJICAgICAgLSAoY2hhciAqKSAmY29yZWRhdGEpKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiAubGRpbmZvIHNlY3Rpb24uCi0gICAgIFRvIGFjdHVhbGx5IGZpbmQgb3V0IGhvdyBsb25nIHRoaXMgc2VjdGlvbiBpcyBpbiB0aGlzIHBhcnRpY3VsYXIKLSAgICAgY29yZSBkdW1wIHdvdWxkIHJlcXVpcmUgZ29pbmcgZG93biB0aGUgd2hvbGUgbGlzdCBvZiBzdHJ1Y3QgbGRfaW5mbydzLgotICAgICBTZWUgaWYgd2UgY2FuIGp1c3QgZmFrZSBpdC4gICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIubGRpbmZvIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgMHg3ZmZmZmZmZiwKLQkJCSAgKGJmZF92bWEpIDAsCi0JCQkgIChmaWxlX3B0cikgY29yZWRhdGEuY190YWIpKQotICAgIHJldHVybiBOVUxMOwotCi0jaWZuZGVmIENPUkVfVkVSU0lPTl8xCi0gIC8qIC5kYXRhIHNlY3Rpb24gaWYgcHJlc2VudC4KLSAgICAgQUlYIDMgZHVtcHMgdGhlIGNvbXBsZXRlIGRhdGEgc2VjdGlvbiBhbmQgc2V0cyBGVUxMX0NPUkUgaWYgdGhlCi0gICAgIHVsaW1pdCBpcyBsYXJnZSBlbm91Z2gsIG90aGVyd2lzZSB0aGUgZGF0YSBzZWN0aW9uIGlzIG9taXR0ZWQuCi0gICAgIEFJWCA0IHNldHMgRlVMTF9DT1JFIGV2ZW4gaWYgdGhlIGNvcmUgZmlsZSBpcyB0cnVuY2F0ZWQsIHdlIGhhdmUKLSAgICAgdG8gZXhhbWluZSBjb3JlZGF0YS5jX2RhdGFzaXplIGJlbG93IHRvIGZpbmQgb3V0IHRoZSBhY3R1YWwgc2l6ZSBvZgotICAgICB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0gIGlmIChjb3JlZGF0YS5jX2ZsYWcgJiBGVUxMX0NPUkUpCi0gICAgewotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCSAgICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgIChiZmRfc2l6ZV90eXBlKSBjb3JlZGF0YS5DT1JFX0RBVEFfU0laRV9GSUVMRCwKLQkJCSAgICAgIChiZmRfdm1hKQotCQkJCUNEQVRBX0FERFIgKGNvcmVkYXRhLkNPUkVfREFUQV9TSVpFX0ZJRUxEKSwKLQkJCSAgICAgIChmaWxlX3B0cikgY29yZWRhdGEuY19zdGFjayArIGNvcmVkYXRhLmNfc2l6ZSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT1JFX1ZFUlNJT05fMQotICAvKiBBSVggNCBhZGRzIGRhdGEgc2VjdGlvbnMgZnJvbSBsb2FkZWQgb2JqZWN0cyB0byB0aGUgY29yZSBmaWxlLAotICAgICB3aGljaCBjYW4gYmUgZm91bmQgYnkgZXhhbWluaW5nIGxkaW5mbywgYW5kIGFub255bW91c2x5IG1tYXBwZWQKLSAgICAgcmVnaW9ucy4gICovCi0gIHsKLSAgICBzdHJ1Y3QgbGRfaW5mbyBsZGluZm87Ci0gICAgYmZkX3NpemVfdHlwZSBsZGluZm9fc2l6ZTsKLSAgICBmaWxlX3B0ciBsZGluZm9fb2Zmc2V0ID0gKGZpbGVfcHRyKSBjb3JlZGF0YS5jX3RhYjsKLQotICAgIC8qIC5kYXRhIHNlY3Rpb24gZnJvbSBleGVjdXRhYmxlLiAgKi8KLSAgICBpZiAoY29yZWRhdGEuY19kYXRhc2l6ZSkKLSAgICAgIHsKLQlpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCVNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCQkoYmZkX3NpemVfdHlwZSkgY29yZWRhdGEuY19kYXRhc2l6ZSwKLQkJCQkoYmZkX3ZtYSkKLQkJCQkgIENEQVRBX0FERFIgKGNvcmVkYXRhLkNPUkVfREFUQV9TSVpFX0ZJRUxEKSwKLQkJCQkoZmlsZV9wdHIpIGNvcmVkYXRhLmNfZGF0YSkpCi0JICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgIC8qIC5kYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMuICAqLwotICAgIGxkaW5mb19zaXplID0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fZmlsZW5hbWVbMF0KLQkJICAtIChjaGFyICopICZsZGluZm8ubGRpbmZvX25leHQ7Ci0gICAgd2hpbGUgKDEpCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCBsZGluZm9fb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBOVUxMOwotCWlmIChiZmRfcmVhZCAoJmxkaW5mbywgbGRpbmZvX3NpemUsIDEsIGFiZmQpICE9IGxkaW5mb19zaXplKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGxkaW5mby5sZGluZm9fY29yZSkKLQkgIHsKLQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCQkgICAgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgbGRpbmZvLmxkaW5mb19kYXRhc2l6ZSwKLQkJCQkgICAgKGJmZF92bWEpIGxkaW5mby5sZGluZm9fZGF0YW9yZywKLQkJCQkgICAgKGZpbGVfcHRyKSBsZGluZm8ubGRpbmZvX2NvcmUpKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgfQotCWlmIChsZGluZm8ubGRpbmZvX25leHQgPT0gMCkKLQkgIGJyZWFrOwotCWxkaW5mb19vZmZzZXQgKz0gbGRpbmZvLmxkaW5mb19uZXh0OwotICAgICAgfQotCi0gICAgLyogLnZtZGF0YSBzZWN0aW9ucyBmcm9tIGFub255bW91c2x5IG1tYXBwZWQgcmVnaW9ucy4gICovCi0gICAgaWYgKGNvcmVkYXRhLmNfdm1yZWdpb25zKQotICAgICAgewotCWludCBpOwotCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfdm1tLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IGNvcmVkYXRhLmNfdm1yZWdpb25zOyBpKyspCi0JICB7Ci0JICAgIHN0cnVjdCB2bV9pbmZvIHZtaW5mbzsKLQotCSAgICBpZiAoYmZkX3JlYWQgKCZ2bWluZm8sIHNpemVvZiAodm1pbmZvKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh2bWluZm8pKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICBpZiAodm1pbmZvLnZtaW5mb19vZmZzZXQpCi0JICAgICAgewotCQlpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnZtZGF0YSIsCi0JCQkJCVNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCQkJKGJmZF9zaXplX3R5cGUpIHZtaW5mby52bWluZm9fc2l6ZSwKLQkJCQkJKGJmZF92bWEpIHZtaW5mby52bWluZm9fYWRkciwKLQkJCQkJKGZpbGVfcHRyKSB2bWluZm8udm1pbmZvX29mZnNldCkpCi0JCSAgcmV0dXJuIE5VTEw7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gYWJmZC0+eHZlYzsJCQkJLyogdGhpcyBpcyBnYXJiYWdlIGZvciBub3cuICovCi19Ci0KLQotCi0vKiByZXR1cm4gYHRydWUnIGlmIGdpdmVuIGNvcmUgaXMgZnJvbSB0aGUgZ2l2ZW4gZXhlY3V0YWJsZS4uICovCi1ib29sZWFuCi1yczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICBzdHJ1Y3QgY29yZV9kdW1wIGNvcmVkYXRhOwotICBzdHJ1Y3QgbGRfaW5mbyBsZGluZm87Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgY2hhciAqcGF0aCwgKnM7Ci0gIHNpemVfdCBhbGxvYzsKLSAgY29uc3QgY2hhciAqc3RyMSwgKnN0cjI7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmIChiZmRfc2VlayAoY29yZV9iZmQsIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoJmNvcmVkYXRhLCBzaXplb2YgY29yZWRhdGEsIDEsIGNvcmVfYmZkKSAhPSBzaXplb2YgY29yZWRhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoY29yZV9iZmQsIChsb25nKSBjb3JlZGF0YS5jX3RhYiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNpemUgPSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19maWxlbmFtZVswXSAtIChjaGFyICopICZsZGluZm8ubGRpbmZvX25leHQ7Ci0gIGlmIChiZmRfcmVhZCAoJmxkaW5mbywgc2l6ZSwgMSwgY29yZV9iZmQpICE9IHNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFsbG9jID0gMTAwOwotICBwYXRoID0gYmZkX21hbGxvYyAoYWxsb2MpOwotICBpZiAocGF0aCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcyA9IHBhdGg7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkIChzLCAxLCAxLCBjb3JlX2JmZCkgIT0gMSkKLQl7Ci0JICBmcmVlIChwYXRoKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoKnMgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgICsrczsKLSAgICAgIGlmIChzID09IHBhdGggKyBhbGxvYykKLQl7Ci0JICBjaGFyICpuOwotCi0JICBhbGxvYyAqPSAyOwotCSAgbiA9IGJmZF9yZWFsbG9jIChwYXRoLCBhbGxvYyk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAocGF0aCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBzID0gbiArIChwYXRoIC0gcyk7Ci0JICBwYXRoID0gbjsKLQl9Ci0gICAgfQotICAKLSAgc3RyMSA9IHN0cnJjaHIgKHBhdGgsICcvJyk7Ci0gIHN0cjIgPSBzdHJyY2hyIChleGVjX2JmZC0+ZmlsZW5hbWUsICcvJyk7Ci0KLSAgLyogc3RlcCBvdmVyIGNoYXJhY3RlciAnLycgKi8KLSAgc3RyMSA9IHN0cjEgIT0gTlVMTCA/IHN0cjEgKyAxIDogcGF0aDsKLSAgc3RyMiA9IHN0cjIgIT0gTlVMTCA/IHN0cjIgKyAxIDogZXhlY19iZmQtPmZpbGVuYW1lOwotCi0gIGlmIChzdHJjbXAgKHN0cjEsIHN0cjIpID09IDApCi0gICAgcmV0ID0gdHJ1ZTsKLSAgZWxzZQotICAgIHJldCA9IGZhbHNlOwotCi0gIGZyZWUgKHBhdGgpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLWNoYXIgKgotcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbSA9IGNvcmVfaGRyIChhYmZkKS5DT1JFX0NPTU1fRklFTEQ7Ci0gIGlmICgqY29tKQotICAgIHJldHVybiBjb207Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1yczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLmNfc2lnbm87Ci19Ci0KLQotYm9vbGVhbgotcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgICBpZiAoY291bnQgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgIC8qIFJlYWRpbmcgYSBjb3JlIGZpbGUncyBzZWN0aW9ucyB3aWxsIGJlIHNsaWdodGx5IGRpZmZlcmVudC4gRm9yIHRoZQotICAgICAgIHJlc3Qgb2YgdGhlbSB3ZSBjYW4gdXNlIGJmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzICgpIEkgc3VwcG9zZS4gKi8KLSAgICAvKiBNYWtlIHN1cmUgdGhpcyByb3V0aW5lIHdvcmtzIGZvciBhbnkgYmZkIGFuZCBhbnkgc2VjdGlvbi4gRklYTUVtZ28uICovCi0KLSAgICBpZiAoYWJmZC0+Zm9ybWF0ID09IGJmZF9jb3JlICYmIHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5yZWciKSA9PSAwKSB7Ci0KLSAgICAgIHN0cnVjdCBtc3RzYXZlIG1zdGF0dXM7Ci0gICAgICBpbnQgICAgcmVnb2Zmc2V0ID0gKGNoYXIqKSZtc3RhdHVzLmdwclswXSAtIChjaGFyKikmbXN0YXR1czsKLQotICAgICAgLyogQXNzZXJ0IHRoYXQgdGhlIG9ubHkgd2F5IHRoaXMgY29kZSB3aWxsIGJlIGV4ZWN1dGVkIGlzIHJlYWRpbmcgdGhlCi0gICAgICAgICB3aG9sZSBzZWN0aW9uLiAqLwotICAgICAgaWYgKG9mZnNldCB8fCBjb3VudCAhPSAoc2l6ZW9mKG1zdGF0dXMuZ3ByKSArICg0ICogTlVNX09GX1NQRUNfUkVHUykpKQotICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgIChfKCJFUlJPUiEgaW4gcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cygpXG4iKSk7Ci0KLSAgICAgIC8qIGZvciBgLnJlZycgc2VjdGlvbiwgYGZpbGVwb3MnIGlzIGEgcG9pbnRlciB0byB0aGUgYG1zdHNhdmUnIHN0cnVjdHVyZQotICAgICAgICAgaW4gdGhlIGNvcmUgZmlsZS4gKi8KLQotICAgICAgLyogcmVhZCBHUFIncyBpbnRvIHRoZSBsb2NhdGlvbi4gKi8KLSAgICAgIGlmICggYmZkX3NlZWsoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIHJlZ29mZnNldCwgU0VFS19TRVQpID09IC0xCi0JfHwgYmZkX3JlYWQobG9jYXRpb24sIHNpemVvZiAobXN0YXR1cy5ncHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKG1zdGF0dXMuZ3ByKSkKLQlyZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLQotICAgICAgLyogaW5jcmVtZW50IGxvY2F0aW9uIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc3BlY2lhbCByZWdpc3RlcnMgaW4gdGhlIHNlY3Rpb24sCi0gICAgICAgICByZXNldCByZWdpc3RlciBvZmZzZXQgdmFsdWUgdG8gdGhlIGJlZ2lubmluZyBvZiBmaXJzdCBzcGVjaWFsIHJlZ2lzdGVyCi0JIGluIG1zdHNhdmUgc3RydWN0dXJlLCBhbmQgcmVhZCBzcGVjaWFsIHJlZ2lzdGVycy4gKi8KLQotICAgICAgbG9jYXRpb24gPSAoUFRSKSAoKGNoYXIqKWxvY2F0aW9uICsgc2l6ZW9mIChtc3RhdHVzLmdwcikpOwotICAgICAgcmVnb2Zmc2V0ID0gKGNoYXIqKSZtc3RhdHVzLmlhciAtIChjaGFyKikmbXN0YXR1czsKLQotICAgICAgaWYgKCBiZmRfc2VlayhhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgcmVnb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEKLQl8fCBiZmRfcmVhZChsb2NhdGlvbiwgNCAqIE5VTV9PRl9TUEVDX1JFR1MsIDEsIGFiZmQpICE9IAotCQkJCQkJCTQgKiBOVU1fT0ZfU1BFQ19SRUdTKQotCXJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLwotICAgICAgCi0gICAgICAvKiBpbmNyZW1lbnQgbG9jYXRpb24gYWRkcmVzcywgYW5kIHJlYWQgdGhlIHNwZWNpYWwgcmVnaXN0ZXJzLi4gKi8KLSAgICAgIC8qIEZJWE1FbWdvICovCi0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLQotICAgIC8qIGVsc2UsIHVzZSBkZWZhdWx0IGJmZCBzZWN0aW9uIGNvbnRlbnQgdHJhbnNmZXIuICovCi0gICAgZWxzZQotICAgICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAKLSAgICAgIAkJCShhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCk7Ci19Ci0KLSNlbmRpZiAvKiBBSVhfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NjbzUtY29yZS5jIGIvYmZkL3NjbzUtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTBjOGYxLi4wMDAwMDAwCi0tLSBhL2JmZC9zY281LWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIFNDTzUgY29yZSBmaWxlcyAoVS1hcmVhIGFuZCByYXcgc2VjdGlvbnMpCi0gICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSm91a2UgTnVtYW4gPGpudW1hbkBoaXNjb20ubmw+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4gICAgICAgICAgIC8qIEFmdGVyIGEub3V0LmggICovCi0jaW5jbHVkZSA8c3lzL3BhY2Nlc3MuaD4KLSNpbmNsdWRlIDxzeXMvcmVnaW9uLmg+Ci0KLXN0cnVjdCBzY281X2NvcmVfc3RydWN0Ci17Ci0gIHN0cnVjdCB1c2VyIHU7Ci19OwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGFzeW1ib2wgKnNjbzVfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHN0cnVjdCB1c2VyICpyZWFkX3VhcmVhIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKnNjbzVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jaGFyICpzY281X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1pbnQgc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIHNjbzVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsCi0JCQkJCQkgICAgIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotc2NvNV9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0gCi1zdGF0aWMgc3RydWN0IHVzZXIgKgotcmVhZF91YXJlYShhYmZkLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBmaWxlcG9zOwotCi17Ci0gIHN0cnVjdCBzY281X2NvcmVfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKChzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqKQotCSAgICBiZmRfem1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCkpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhID0gcmF3cHRyOwotCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZyYXdwdHItPnUsIDEsIHNpemVvZiByYXdwdHItPnUsIGFiZmQpCi0JICAhPSBzaXplb2YgcmF3cHRyLT51KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBTYW5pdHkgY2hlY2sgcGVyaGFwcz8/PyAqLwotICBpZiAocmF3cHRyLT51LnVfZHNpemUgPiAweDEwMDAwMDApICAgIC8qIFJlbWVtYmVyLCBpdCdzIGluIHBhZ2VzLi4uICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChyYXdwdHItPnUudV9zc2l6ZSA+IDB4MTAwMDAwMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyYXdwdHItPnU7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXNjbzVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvZmZzZXRfc2l6LCB2YWwsIG5zZWNzLCBjaGVhZG9mZnM7Ci0gIGludCBjb3Jlc2l6ZTsKLSAgc3RydWN0IHVzZXIgKnU7Ci0gIHN0cnVjdCBjb3Jlb2Zmc2V0cyBjb2Zmc2V0czsKLSAgc3RydWN0IGNvcmVzZWN0aGVhZCBjaGVhZDsKLSAgY2hhciAqc2VjbmFtZTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgLyogUmVhZCBjb3Jlb2Zmc2V0cyByZWdpb24gYXQgZW5kIG9mIGNvcmUgKHNlZSBjb3JlKEZQKSkgKi8KLQotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLSAgICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgY29yZXNpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIH0KLSAgLyogTGFzdCBsb25nIGluIGNvcmUgaXMgc2l6ZW9mIHN0cnVjdCBjb3Jlb2Zmc2V0cywgcmVhZCBpdCAqLwotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjb3Jlc2l6ZS1zaXplb2YgY29mZnNldF9zaXosIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZjb2Zmc2V0X3NpeiwgMSwgc2l6ZW9mIGNvZmZzZXRfc2l6LCBhYmZkKQotCSAgIT0gc2l6ZW9mIGNvZmZzZXRfc2l6KSApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFVzZSBpdCB0byBzZWVrIHN0YXJ0IG9mIGNvcmVvZmZzZXRzIHJlZ2lvbiwgcmVhZCBpdCBhbmQgZGV0ZXJtaW5lCi0gICAgIHZhbGlkaXR5ICovCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIGNvcmVzaXplLWNvZmZzZXRfc2l6LCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY29mZnNldHMsIDEsIHNpemVvZiBjb2Zmc2V0cywgYWJmZCkKLQkgICE9IHNpemVvZiBjb2Zmc2V0cykKLSAgICAgIHx8ICgoY29mZnNldHMudV9pbmZvICE9IDEpICYmIChjb2Zmc2V0cy51X2luZm8gIT0gQ19WRVJTSU9OKSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0KLSAgaWYgKGNvZmZzZXRzLnVfaW5mbyA9PSAxKSAKLSAgICB7IAotICAgICAgLyogT2xkIHZlcnNpb24sIG5vIHNlY3Rpb24gaGVhZHMsIHJlYWQgaW5mbyBmcm9tIHVzZXIgc3RydWN0ICovCi0KLSAgICAgIHUgPSByZWFkX3VhcmVhKGFiZmQsIGNvZmZzZXRzLnVfdXNlcik7Ci0gICAgICBpZiAoISB1KQotICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsIFNFQ19IQVNfQ09OVEVOVFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9zaXplX3R5cGUpIGNvZmZzZXRzLnVfdXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gKGJmZF92bWEpIHUtPnVfYXIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfcHRyKSBjb2Zmc2V0cy51X3VzZXIpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAKLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsIAotCQkJICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiZmRfc2l6ZV90eXBlKSB1LT51X2V4ZGF0YS51eF9kc2l6ZQotCQkJICAgICAgICsgdS0+dV9leGRhdGEudXhfYnNpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF92bWEpIHUtPnVfZXhkYXRhLnV4X2RhdG9yZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV9kYXRhKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwgCi0JCQkgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9zaXplX3R5cGUpIHUtPnVfc3NpemUgKiBOQlBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF92bWEpIHUtPnVfc3ViLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfcHRyKSBjb2Zmc2V0cy51X3N0YWNrKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHJldHVybiBhYmZkLT54dmVjOwkJLyogRG9uZSBmb3IgdmVyc2lvbiAxICovCi0gICAgfSAgICAgIAotCi0gIC8qIEltbWVkaWF0ZWx5IGJlZm9yZSBjb3Jlb2Zmc2V0cyByZWdpb24gaXMgYSBsb25nIHdpdGggb2Zmc2V0IGluIGNvcmUKLSAgICAgdG8gZmlyc3QgY29yZXNlY3RoZWFkIChDT1JFU19PRkZTRVRTKSwgdGhlIGxvbmcgYmVmb3JlIHRoaXMgaXMgdGhlCi0gICAgIG51bWJlciBvZiBzZWN0aW9uIGhlYWRzIGluIHRoZSBsaXN0LiBSZWFkIGJvdGggbG9uZ3MgYW5kIHJlYWQgdGhlCi0gICAgIGNvcmVzZWN0aGVhZCBhbmQgY2hlY2sgaXRzIHZhbGlkaXR5ICovCi0gICAgCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIAotCQkgY29yZXNpemUgLSBjb2Zmc2V0X3NpeiAtIDIgKiBzaXplb2YgY29mZnNldF9zaXosIAotCQkgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJm5zZWNzLCAxLCBzaXplb2YgbnNlY3MsIGFiZmQpICE9IHNpemVvZiBuc2VjcykKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWRvZmZzLCAxLCBzaXplb2YgY2hlYWRvZmZzLCBhYmZkKQotCSAgIT0gc2l6ZW9mIGNoZWFkb2ZmcykKLSAgICAgIHx8IChiZmRfc2VlayAoYWJmZCwgY2hlYWRvZmZzLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWQsIDEsIHNpemVvZiBjaGVhZCwgYWJmZCkgIT0gc2l6ZW9mIGNoZWFkKQotICAgICAgfHwgKGNoZWFkLmNzX3N0eXBlICE9IENPUkVTX09GRlNFVFMpCi0gICAgICB8fCAoY2hlYWQuY3NfeC5jc3hfbWFnaWMgIT0gQ09SRU1BR0lDX05VTUJFUikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgLyogTm93IGxvb3Agb3ZlciBhbGwgcmVnaW9ucyBhbmQgbWFwIHRoZW0gKi8KLSAgbnNlY3MtLTsJCQkJLyogV2UndmUgc2VlbiBDT1JFU19PRkZTRVRTIGFscmVhZHkgKi8KLSAgZm9yICg7IG5zZWNzOyBuc2Vjcy0tKSAKLSAgICB7Ci0gICAgICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjaGVhZC5jc19oc2VlaywgU0VFS19TRVQpICE9IDApCi0JICB8fCBiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWQsIDEsIHNpemVvZiBjaGVhZCwgYWJmZCkgIT0gc2l6ZW9mIGNoZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgIHN3aXRjaCAoY2hlYWQuY3Nfc3R5cGUpIAotCXsKLQljYXNlIENPUkVTX01BR0lDOgkJCS8qIENvcmUgaGVhZGVyLCBjaGVjayBtYWdpYyAqLwotCSAgaWYgKGNoZWFkLmNzX3guY3N4X21hZ2ljICE9IENPUkVNQUdJQ19OVU1CRVIpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgc2VjbmFtZSA9IE5VTEw7Ci0JICBuc2VjcysrOwkJCQkvKiBNQUdJQyBub3QgaW4gc2VjdGlvbiBjbnQhKi8KLQkgIGJyZWFrOwotCWNhc2UgQ09SRVNfVUFSRUE6CQkJLyogVS1hcmVhLCByZWFkIGluIHRkYXRhICovCi0JICB1ID0gcmVhZF91YXJlYShhYmZkLCBjaGVhZC5jc19zc2Vlayk7Ci0JICBpZiAoISB1KQotCSAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICAgIC8qIFRoaXMgaXMgdHJpY2t5LiAgQXMgdGhlICJyZWdpc3RlciBzZWN0aW9uIiwgd2UgZ2l2ZSB0aGVtCi0JICAgICB0aGUgZW50aXJlIHVwYWdlIGFuZCBzdGFjay4gIHUudV9hcjAgcG9pbnRzIHRvIHdoZXJlCi0JICAgICAicmVnaXN0ZXIgMCIgaXMgc3RvcmVkLiAgVGhlcmUgYXJlIHR3byB0cmlja3Mgd2l0aCB0aGlzLAotCSAgICAgdGhvdWdoLiAgT25lIGlzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIHJlZ2lzdGVycyBtaWdodCBiZQotCSAgICAgYXQgcG9zaXRpdmUgb3IgbmVnYXRpdmUgKG9yIGJvdGgpIGRpc3BsYWNlbWVudHMgZnJvbQotCSAgICAgKnVfYXIwLiAgVGhlIG90aGVyIGlzIHRoYXQgdV9hcjAgaXMgc29tZXRpbWVzIGFuIGFic29sdXRlCi0JICAgICBhZGRyZXNzIGluIGtlcm5lbCBtZW1vcnksIGFuZCBvbiBvdGhlciBzeXN0ZW1zIGl0IGlzIGFuCi0JICAgICBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBgc3RydWN0IHVzZXInLgotCQotCSAgICAgQXMgYSBwcmFjdGljYWwgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSByZWdpc3RlcnMKLQkgICAgIGFjdHVhbGx5IGFyZSwgc28gd2UgaGF2ZSB0byBwYXNzIHRoZSB3aG9sZSBhcmVhIHRvIEdEQi4KLQkgICAgIFdlIGVuY29kZSB0aGUgdmFsdWUgb2YgdV9hcjAgYnkgc2V0dGluZyB0aGUgLnJlZ3Mgc2VjdGlvbgotCSAgICAgdXAgc28gdGhhdCBpdHMgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyAwIGlzIGF0IHRoZSBwbGFjZQotCSAgICAgcG9pbnRlZCB0byBieSB1X2FyMCAoYnkgc2V0dGluZyB0aGUgdm1hIG9mIHRoZSBzdGFydCBvZgotCSAgICAgdGhlIHNlY3Rpb24gdG8gLXVfYXIwKS4gIEdEQiB1c2VzIHRoaXMgaW5mbyB0byBsb2NhdGUgdGhlCi0JICAgICByZWdzLCB1c2luZyBtaW5vciB0cmlja2VyeSB0byBnZXQgYXJvdW5kIHRoZQotCSAgICAgb2Zmc2V0LW9yLWFic29sdXRlLWFkZHIgcHJvYmxlbS4gKi8KLQotCSAgY2hlYWQuY3NfdmFkZHIgPSAwIC0gKGJmZF92bWEpIHUtPnVfYXIwOwotCi0KLSAgICAgICAgICBzZWNuYW1lID0gIi5yZWciOwotICAgICAgICAgIGZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgICAgIGJyZWFrOwotCWNhc2UgQ09SRVNfUFJFR0lPTjoJCQkvKiBBIHByb2dyYW0gcmVnaW9uLCBtYXAgaXQgKi8KLQkgIHN3aXRjaCAoY2hlYWQuY3NfeC5jc3hfcHJlZy5jc3hwX3J0eXApCi0JICAgIHsKLQkgICAgY2FzZSBQVF9EQVRBOgotCSAgICAgIHNlY25hbWUgPSAiLmRhdGEiOyAgCS8qIERhdGEgcmVnaW9uLiAgICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NUQUNLOgotCSAgICAgIHNlY25hbWUgPSAiLnN0YWNrIjsgCS8qIFN0YWNrIHJlZ2lvbi4gICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NITUVNOgotCSAgICAgIHNlY25hbWUgPSAiLnNobWVtIjsgCS8qIFNoYXJlZCBtZW1vcnkgICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX0xJQkRBVDoKLQkgICAgICBzZWNuYW1lID0gIi5saWJkYXQiOwkvKiBTaGFyZWQgbGlicmFyeSBkYXRhICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9WODY6Ci0JICAgICAgc2VjbmFtZSA9ICIudmlydDg2IjsJLyogVmlydHVhbCA4MDg2IG1vZGUgICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU0hGSUw6Ci0JICAgICAgc2VjbmFtZSA9ICIubW1maWxlIjsJLyogTWVtb3J5IG1hcHBlZCBmaWxlICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfWERBVEEwOgotCSAgICAgIHNlY25hbWUgPSAiLlhkYXQwIjsgCS8qIFhFTklYIGRhdGEgcmVnaW9uLCB2aXJ0dWFsIDAgKi8KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzZWNuYW1lID0gIiI7Ci0JICAgIH0KLQkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFU19QUk9DOgkJCS8qIHN0cnVjdCBwcm9jICovCi0JY2FzZSBDT1JFU19JVElNRVI6CQkJLyogaW50ZXJ2YWwgdGltZXJzICovCi0JY2FzZSBDT1JFU19TQ09VVFNOQU1FOgkJCS8qIHN0cnVjdCBzY291dHNuYW1lICovCi0JICBzZWNuYW1lID0gTlVMTDsJLyogSWdub3JlIHRoZXNlICovCi0JICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJVbmhhbmRsZWQgU0NPIGNvcmUgZmlsZSBzZWN0aW9uIHR5cGUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVhZC5jc19zdHlwZSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKHNlY25hbWUKLQkgICYmICFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwgZmxhZ3MsCi0JCQkJIChiZmRfc2l6ZV90eXBlKSBjaGVhZC5jc192c2l6ZSwKLQkJCQkgKGJmZF92bWEpIGNoZWFkLmNzX3ZhZGRyLAotCQkJCSAoZmlsZV9wdHIpIGNoZWFkLmNzX3NzZWVrKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLX0KLQotY2hhciAqCi1zY281X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEtPnUudV9jb21tOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLXNjbzVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLXsKLSAgcmV0dXJuICgoaWdub3JlX2FiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhLT51LnVfc3lzYWJvcnQgIT0gMCkgCi0JICA/IGlnbm9yZV9hYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YS0+dS51X3N5c2Fib3J0IAotCSAgOiAtMSk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1zY281X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsgICAgICAgICAgLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBzY281X2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBzY281X2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBzY281X2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBzY281X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgc2NvNV9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgc2NvNV9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzY281X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUgTk9fR0VUICAoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lIE5PX1BVVCAgKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZSBOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBzY281X2NvcmVfdmVjID0KLSAgewotICAgICJzY281LWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgIC8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfCAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiBhcmNoaXZlICovCi0gICAgIHNjbzVfY29yZV9maWxlX3AgICAgICAJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLQotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChzY281KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc2NvNV9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICAoUFRSKSAwICAgICAgICAgICAgICAgICAgICAgLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3NlY3Rpb24uYyBiL2JmZC9zZWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNGE5Y2QuLjAwMDAwMDAKLS0tIGEvYmZkL3NlY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDEwODEgKzAsMCBAQAotLyogT2JqZWN0IGZpbGUgInNlY3Rpb24iIHN1cHBvcnQgZm9yIHRoZSBCRkQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JU2VjdGlvbnMKLQotCVRoZSByYXcgZGF0YSBjb250YWluZWQgd2l0aGluIGEgQkZEIGlzIG1haW50YWluZWQgdGhyb3VnaCB0aGUKLQlzZWN0aW9uIGFic3RyYWN0aW9uLiAgQSBzaW5nbGUgQkZEIG1heSBoYXZlIGFueSBudW1iZXIgb2YKLQlzZWN0aW9ucy4gIEl0IGtlZXBzIGhvbGQgb2YgdGhlbSBieSBwb2ludGluZyB0byB0aGUgZmlyc3Q7Ci0JZWFjaCBvbmUgcG9pbnRzIHRvIHRoZSBuZXh0IGluIHRoZSBsaXN0LgotCi0JU2VjdGlvbnMgYXJlIHN1cHBvcnRlZCBpbiBCRkQgaW4gPDxzZWN0aW9uLmM+Pi4KLQotQG1lbnUKLUAqIFNlY3Rpb24gSW5wdXQ6OgotQCogU2VjdGlvbiBPdXRwdXQ6OgotQCogdHlwZWRlZiBhc2VjdGlvbjo6Ci1AKiBzZWN0aW9uIHByb3RvdHlwZXM6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1TZWN0aW9uIElucHV0LCBTZWN0aW9uIE91dHB1dCwgU2VjdGlvbnMsIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBpbnB1dAotCi0JV2hlbiBhIEJGRCBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoZSBzZWN0aW9uIHN0cnVjdHVyZXMgYXJlCi0JY3JlYXRlZCBhbmQgYXR0YWNoZWQgdG8gdGhlIEJGRC4KLQotCUVhY2ggc2VjdGlvbiBoYXMgYSBuYW1lIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2VjdGlvbiBpbiB0aGUKLQlvdXRzaWRlIHdvcmxkLS0tZm9yIGV4YW1wbGUsIDw8YS5vdXQ+PiB3b3VsZCBjb250YWluIGF0IGxlYXN0Ci0JdGhyZWUgc2VjdGlvbnMsIGNhbGxlZCA8PC50ZXh0Pj4sIDw8LmRhdGE+PiBhbmQgPDwuYnNzPj4uCi0KLQlOYW1lcyBuZWVkIG5vdCBiZSB1bmlxdWU7IGZvciBleGFtcGxlIGEgQ09GRiBmaWxlIG1heSBoYXZlIHNldmVyYWwKLQlzZWN0aW9ucyBuYW1lZCA8PC5kYXRhPj4uCi0KLQlTb21ldGltZXMgYSBCRkQgd2lsbCBjb250YWluIG1vcmUgdGhhbiB0aGUgYGBuYXR1cmFsJycgbnVtYmVyIG9mCi0Jc2VjdGlvbnMuIEEgYmFjayBlbmQgbWF5IGF0dGFjaCBvdGhlciBzZWN0aW9ucyBjb250YWluaW5nCi0JY29uc3RydWN0b3IgZGF0YSwgb3IgYW4gYXBwbGljYXRpb24gbWF5IGFkZCBhIHNlY3Rpb24gKHVzaW5nCi0JPDxiZmRfbWFrZV9zZWN0aW9uPj4pIHRvIHRoZSBzZWN0aW9ucyBhdHRhY2hlZCB0byBhbiBhbHJlYWR5IG9wZW4KLQlCRkQuIEZvciBleGFtcGxlLCB0aGUgbGlua2VyIGNyZWF0ZXMgYW4gZXh0cmEgc2VjdGlvbgotCTw8Q09NTU9OPj4gZm9yIGVhY2ggaW5wdXQgZmlsZSdzIEJGRCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0Ci0JY29tbW9uIHN0b3JhZ2UuCi0KLQlUaGUgcmF3IGRhdGEgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgaW4gd2hlbgotCXRoZSBzZWN0aW9uIGRlc2NyaXB0b3IgaXMgY3JlYXRlZC4gU29tZSB0YXJnZXRzIG1heSBsZWF2ZSB0aGUKLQlkYXRhIGluIHBsYWNlIHVudGlsIGEgPDxiZmRfZ2V0X3NlY3Rpb25fY29udGVudHM+PiBjYWxsIGlzCi0JbWFkZS4gT3RoZXIgYmFjayBlbmRzIG1heSByZWFkIGluIGFsbCB0aGUgZGF0YSBhdCBvbmNlLiAgRm9yCi0JZXhhbXBsZSwgYW4gUy1yZWNvcmQgZmlsZSBoYXMgdG8gYmUgcmVhZCBvbmNlIHRvIGRldGVybWluZSB0aGUKLQlzaXplIG9mIHRoZSBkYXRhLiBBbiBJRUVFLTY5NSBmaWxlIGRvZXNuJ3QgY29udGFpbiByYXcgZGF0YSBpbgotCXNlY3Rpb25zLCBidXQgZGF0YSBhbmQgcmVsb2NhdGlvbiBleHByZXNzaW9ucyBpbnRlcm1peGVkLCBzbwotCXRoZSBkYXRhIGFyZWEgaGFzIHRvIGJlIHBhcnNlZCB0byBnZXQgb3V0IHRoZSBkYXRhIGFuZAotCXJlbG9jYXRpb25zLgotCi1JTk9ERQotU2VjdGlvbiBPdXRwdXQsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb24gSW5wdXQsIFNlY3Rpb25zCi0KLVNVQlNFQ1RJT04KLQlTZWN0aW9uIG91dHB1dAotCi0JVG8gd3JpdGUgYSBuZXcgb2JqZWN0IHN0eWxlIEJGRCwgdGhlIHZhcmlvdXMgc2VjdGlvbnMgdG8gYmUKLQl3cml0dGVuIGhhdmUgdG8gYmUgY3JlYXRlZC4gVGhleSBhcmUgYXR0YWNoZWQgdG8gdGhlIEJGRCBpbgotCXRoZSBzYW1lIHdheSBhcyBpbnB1dCBzZWN0aW9uczsgZGF0YSBpcyB3cml0dGVuIHRvIHRoZQotCXNlY3Rpb25zIHVzaW5nIDw8YmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzPj4uCi0KLQlBbnkgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMgb3IgY29tYmluZXMgc2VjdGlvbnMgKGUuZy4sIHRoZSBhc3NlbWJsZXIKLQlhbmQgbGlua2VyKSBtdXN0IHVzZSB0aGUgPDxhc2VjdGlvbj4+IGZpZWxkcyA8PG91dHB1dF9zZWN0aW9uPj4gYW5kCi0JPDxvdXRwdXRfb2Zmc2V0Pj4gdG8gaW5kaWNhdGUgdGhlIGZpbGUgc2VjdGlvbnMgdG8gd2hpY2ggZWFjaAotCXNlY3Rpb24gbXVzdCBiZSB3cml0dGVuLiAgKElmIHRoZSBzZWN0aW9uIGlzIGJlaW5nIGNyZWF0ZWQgZnJvbQotCXNjcmF0Y2gsIDw8b3V0cHV0X3NlY3Rpb24+PiBzaG91bGQgcHJvYmFibHkgcG9pbnQgdG8gdGhlIHNlY3Rpb24KLQlpdHNlbGYgYW5kIDw8b3V0cHV0X29mZnNldD4+IHNob3VsZCBwcm9iYWJseSBiZSB6ZXJvLikKLQotCVRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gY29tZXMgZnJvbSBpbnB1dCBzZWN0aW9ucyBhdHRhY2hlZAotCSh2aWEgPDxvdXRwdXRfc2VjdGlvbj4+IHBvaW50ZXJzKSB0bwotCXRoZSBvdXRwdXQgc2VjdGlvbnMuICBUaGUgb3V0cHV0IHNlY3Rpb24gc3RydWN0dXJlIGNhbiBiZQotCWNvbnNpZGVyZWQgYSBmaWx0ZXIgZm9yIHRoZSBpbnB1dCBzZWN0aW9uOiB0aGUgb3V0cHV0IHNlY3Rpb24KLQlkZXRlcm1pbmVzIHRoZSB2bWEgb2YgdGhlIG91dHB1dCBkYXRhIGFuZCB0aGUgbmFtZSwgYnV0IHRoZQotCWlucHV0IHNlY3Rpb24gZGV0ZXJtaW5lcyB0aGUgb2Zmc2V0IGludG8gdGhlIG91dHB1dCBzZWN0aW9uIG9mCi0JdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KLQotCUUuZy4sIHRvIGNyZWF0ZSBhIHNlY3Rpb24gIk8iLCBzdGFydGluZyBhdCAweDEwMCwgMHgxMjMgbG9uZywKLQljb250YWluaW5nIHR3byBzdWJzZWN0aW9ucywgIkEiIGF0IG9mZnNldCAweDAgKGkuZS4sIGF0IHZtYQotCTB4MTAwKSBhbmQgIkIiIGF0IG9mZnNldCAweDIwIChpLmUuLCBhdCB2bWEgMHgxMjApIHRoZSA8PGFzZWN0aW9uPj4KLQlzdHJ1Y3R1cmVzIHdvdWxkIGxvb2sgbGlrZToKLQotfCAgIHNlY3Rpb24gbmFtZSAgICAgICAgICAiQSIKLXwgICAgIG91dHB1dF9vZmZzZXQgICAweDAwCi18ICAgICBzaXplICAgICAgICAgICAgMHgyMAotfCAgICAgb3V0cHV0X3NlY3Rpb24gLS0tLS0tLS0tLS0+ICBzZWN0aW9uIG5hbWUgICAgIk8iCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHZtYSAgICAgICAgICAgICAweDEwMAotfCAgIHNlY3Rpb24gbmFtZSAgICAgICAgICAiQiIgfCAgICBzaXplICAgICAgICAgICAgMHgxMjMKLXwgICAgIG91dHB1dF9vZmZzZXQgICAweDIwICAgIHwKLXwgICAgIHNpemUgICAgICAgICAgICAweDEwMyAgIHwKLXwgICAgIG91dHB1dF9zZWN0aW9uICAtLS0tLS0tLXwKLQotCi1TVUJTRUNUSU9OCi0JTGluayBvcmRlcnMKLQotCVRoZSBkYXRhIHdpdGhpbiBhIHNlY3Rpb24gaXMgc3RvcmVkIGluIGEgQGRmbntsaW5rX29yZGVyfS4KLQlUaGVzZSBhcmUgbXVjaCBsaWtlIHRoZSBmaXh1cHMgaW4gPDxnYXM+Pi4gIFRoZSBsaW5rX29yZGVyCi0JYWJzdHJhY3Rpb24gYWxsb3dzIGEgc2VjdGlvbiB0byBncm93IGFuZCBzaHJpbmsgd2l0aGluIGl0c2VsZi4KLQotCUEgbGlua19vcmRlciBrbm93cyBob3cgYmlnIGl0IGlzLCBhbmQgd2hpY2ggaXMgdGhlIG5leHQKLQlsaW5rX29yZGVyIGFuZCB3aGVyZSB0aGUgcmF3IGRhdGEgZm9yIGl0IGlzOyBpdCBhbHNvIHBvaW50cyB0bwotCWEgbGlzdCBvZiByZWxvY2F0aW9ucyB3aGljaCBhcHBseSB0byBpdC4KLQotCVRoZSBsaW5rX29yZGVyIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBwZXJmb3JtIHJlbGF4aW5nIG9uCi0JZmluYWwgY29kZS4gIFRoZSBjb21waWxlciBjcmVhdGVzIGNvZGUgd2hpY2ggaXMgYXMgYmlnIGFzCi0JbmVjZXNzYXJ5IHRvIG1ha2UgaXQgd29yayB3aXRob3V0IHJlbGF4aW5nLCBhbmQgdGhlIHVzZXIgY2FuCi0Jc2VsZWN0IHdoZXRoZXIgdG8gcmVsYXguICBTb21ldGltZXMgcmVsYXhpbmcgdGFrZXMgYSBsb3Qgb2YKLQl0aW1lLiAgVGhlIGxpbmtlciBydW5zIGFyb3VuZCB0aGUgcmVsb2NhdGlvbnMgdG8gc2VlIGlmIGFueQotCWFyZSBhdHRhY2hlZCB0byBkYXRhIHdoaWNoIGNhbiBiZSBzaHJ1bmssIGlmIHNvIGl0IGRvZXMgaXQgb24KLQlhIGxpbmtfb3JkZXIgYnkgbGlua19vcmRlciBiYXNpcy4KLQotKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKgotRE9DREQKLUlOT0RFCi10eXBlZGVmIGFzZWN0aW9uLCBzZWN0aW9uIHByb3RvdHlwZXMsIFNlY3Rpb24gT3V0cHV0LCBTZWN0aW9ucwotU1VCU0VDVElPTgotCXR5cGVkZWYgYXNlY3Rpb24KLQotCUhlcmUgaXMgdGhlIHNlY3Rpb24gc3RydWN0dXJlOgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBzdHJ1Y3Qgc2VjCi0uewotLiAgICAgICAgeyogVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb247IHRoZSBuYW1lIGlzbid0IGEgY29weSwgdGhlIHBvaW50ZXIgaXMKLS4gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICp9Ci0uCi0uICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0uCi0uICAgICAgICB7KiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKn0KLS4KLS4gICBpbnQgaW5kZXg7Ci0uCi0uICAgICAgICB7KiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqfQotLgotLiAgICBzdHJ1Y3Qgc2VjICpuZXh0OwotLgotLiAgICAgICAgeyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKLS4gICAgICAgICAgIGZsYWdzIGFyZSByZWFkIGluIGZyb20gdGhlIG9iamVjdCBmaWxlLCBhbmQgc29tZSBhcmUKLS4gICAgICAgICAgIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgaW5mb3JtYXRpb24uICAqfQotLgotLiAgICBmbGFnd29yZCBmbGFnczsKLS4KLS4jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCi0uCi0uICAgICAgICB7KiBUZWxscyB0aGUgT1MgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgc2VjdGlvbiB3aGVuIGxvYWRpbmcuCi0uICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIHNlY3Rpb24gY29udGFpbmluZyBkZWJ1ZyBpbmZvcm1hdGlvbgotLiAgICAgICAgICAgb25seS4gKn0KLS4jZGVmaW5lIFNFQ19BTExPQyAgICAgIDB4MDAxCi0uCi0uICAgICAgICB7KiBUZWxscyB0aGUgT1MgdG8gbG9hZCB0aGUgc2VjdGlvbiBmcm9tIHRoZSBmaWxlIHdoZW4gbG9hZGluZy4KLS4gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqfQotLiNkZWZpbmUgU0VDX0xPQUQgICAgICAgMHgwMDIKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgc3RpbGwgdG8gYmUgcmVsb2NhdGVkLCBzbyB0aGVyZSBpcwotLiAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKn0KLS4jZGVmaW5lIFNFQ19SRUxPQyAgICAgIDB4MDA0Ci0uCi0uI2lmIDAgICB7KiBPYnNvbGV0ZSA/ICp9Ci0uI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAotLiNlbmRpZgotLgotLiAgICAgICAgeyogQSBzaWduYWwgdG8gdGhlIE9TIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgcmVhZCBvbmx5Ci0uICAgICAgICAgIGRhdGEuICp9Ci0uI2RlZmluZSBTRUNfUkVBRE9OTFkgICAweDAxMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29kZSBvbmx5LiAqfQotLiNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgb25seS4gKn0KLS4jZGVmaW5lIFNFQ19EQVRBICAgICAgIDB4MDQwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICp9Ci0uI2RlZmluZSBTRUNfUk9NICAgICAgICAweDA4MAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29uc3RydWN0b3IgaW5mb3JtYXRpb24uIFRoaXMgc2VjdGlvbgotLiAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKLS4gICAgICAgICAgIGRlc3RydWN0b3JzIHVzZWQgYnkgPDxnKys+Pi4gV2hlbiBhIGJhY2sgZW5kIHNlZXMgYSBzeW1ib2wKLS4gICAgICAgICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGEgY29uc3RydWN0b3IgbGlzdCwgaXQgY3JlYXRlcyBhIG5ldwotLiAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcwotLiAgICAgICAgICAgdGhlIHN5bWJvbCB0byBpdCwgYW5kIGJ1aWxkcyBhIHJlbG9jYXRpb24uIFRvIGJ1aWxkIHRoZSBsaXN0cwotLiAgICAgICAgICAgb2YgY29uc3RydWN0b3JzLCBhbGwgdGhlIGxpbmtlciBoYXMgdG8gZG8gaXMgY2F0ZW5hdGUgYWxsIHRoZQotLiAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQotLiAgICAgICAgICAgY29udGFpbmVkIHdpdGhpbiAtIGV4YWN0bHkgdGhlIG9wZXJhdGlvbnMgaXQgd291bGQgcGVmb3JtIG9uCi0uICAgICAgICAgICBzdGFuZGFyZCBkYXRhLiAqfQotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBpcyBhIGNvbnN0cnVjdG9yLCBhbmQgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUKLS4gICAgICAgICAgZW5kIG9mIHRoZSB0ZXh0LCBkYXRhLCBvciBic3Mgc2VjdGlvbig/KS4gKn0KLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0RBVEEgMHgyMTAwCi0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfQlNTICAweDMxMDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCi0uICAgICAgICAgICA8PFNFQ19BTExPQz4+IHwgPDxTRUNfSEFTX0NPTlRFTlRTPj47IGEgZGVidWcgc2VjdGlvbiBjb3VsZCBiZQotLiAgICAgICAgICAgPDxTRUNfSEFTX0NPTlRFTlRTPj4gKn0KLS4jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKLS4KLS4gICAgICAgIHsqIEFuIGluc3RydWN0aW9uIHRvIHRoZSBsaW5rZXIgdG8gbm90IG91dHB1dCB0aGUgc2VjdGlvbgotLiAgICAgICAgICAgZXZlbiBpZiBpdCBoYXMgaW5mb3JtYXRpb24gd2hpY2ggd291bGQgbm9ybWFsbHkgYmUgd3JpdHRlbi4gKn0KLS4jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBpcyBhIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gIFRoaXMgZmxhZyBpcwotLiAgICAgICAgICAgb25seSBmb3IgdGhlIGxpbmtlci4gIElmIHRoaXMgdHlwZSBvZiBzZWN0aW9uIGFwcGVhcnMgaW4KLS4gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKLS4gICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZtYSBvciBzaXplLiAgRklYTUU6IEFsdGhvdWdoIHRoaXMKLS4gICAgICAgICAgIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIGdlbmVyYWwsIGl0IHJlYWxseSBpcyBDT0ZGCi0uICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKLS4gICAgICAgICAgIG1pZ2h0IGJlIGNsZWFuZXIgdG8gaGF2ZSBzb21lIG1vcmUgZ2VuZXJhbCBtZWNoYW5pc20gdG8KLS4gICAgICAgICAgIGFsbG93IHRoZSBiYWNrIGVuZCB0byBjb250cm9sIHdoYXQgdGhlIGxpbmtlciBkb2VzIHdpdGgKLS4gICAgICAgICAgIHNlY3Rpb25zLiAqfQotLiNkZWZpbmUgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgMHg4MDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbW1vbiBzeW1ib2xzIChzeW1ib2xzIG1heSBiZSBkZWZpbmVkCi0uICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKLS4gICAgICAgICAgIHNwYWNlIGl0IHJlcXVpcmVzLCBhbmQgdGhlIGxhcmdlc3Qgc3ltYm9sIHZhbHVlIGlzIHRoZSBvbmUKLS4gICAgICAgICAgIHVzZWQpLiAgTW9zdCB0YXJnZXRzIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlc2UgKHdoaWNoIHdlCi0uCSAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqfQotLiNkZWZpbmUgU0VDX0lTX0NPTU1PTiAweDgwMDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIG9ubHkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRm9yCi0uICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCi0uICAgICAgICAgICBzdHJpcCB0ZXN0cyB0aGlzIGZsYWcgdG8gc2VlIGlmIGEgc2VjdGlvbiBjYW4gYmUKLS4gICAgICAgICAgIGRpc2NhcmRlZC4gKn0KLS4jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAotLgotLiAgICAgICAgeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgaGVsZCBpbiBtZW1vcnkgcG9pbnRlZCB0bwotLiAgICAgICAgICAgYnkgdGhlIGNvbnRlbnRzIGZpZWxkLiAgVGhpcyBpcyBjaGVja2VkIGJ5Ci0uICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQotLiAgICAgICAgICAgbWVtb3J5IGlmIGFwcHJvcHJpYXRlLiAgKn0KLS4jZGVmaW5lIFNFQ19JTl9NRU1PUlkgMHgyMDAwMAotLgotLiAgICAgICAgeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCi0uCSAgICBsaW5rZXIgZm9yIGV4ZWN1dGFibGUgYW5kIHNoYXJlZCBvYmplY3RzIHVubGVzcyB0aG9zZQotLgkgICAgb2JqZWN0cyBhcmUgdG8gYmUgZnVydGhlciByZWxvY2F0ZWQuICAqfQotLiNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAotLgotLgl7KiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBzb3J0ZWQgYnkgdGhlCi0uCSAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBzeW1ib2wKLS4JICAgdGFibGUuICAqfQotLiNkZWZpbmUgU0VDX1NPUlRfRU5UUklFUyAweDgwMDAwCi0uCi0uCXsqIFdoZW4gbGlua2luZywgZHVwbGljYXRlIHNlY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgc2hvdWxkIGJlCi0uCSAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCi0uCSAgIGlzIHVzdWFsbHkgZG9uZS4gIFRoaXMgaXMgc2ltaWxhciB0byBob3cgY29tbW9uIHN5bWJvbHMgYXJlCi0uCSAgIGhhbmRsZWQuICBTZWUgU0VDX0xJTktfRFVQTElDQVRFUyBiZWxvdy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCi0uCi0uCXsqIElmIFNFQ19MSU5LX09OQ0UgaXMgc2V0LCB0aGlzIGJpdGZpZWxkIGRlc2NyaWJlcyBob3cgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZSBzZWN0aW9ucy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCBkdXBsaWNhdGUKLS4JICAgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHNob3VsZCBzaW1wbHkgYmUgZGlzY2FyZGVkLiAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgd2FybiBpZiB0aGVyZSBhcmUgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucywgYWx0aG91Z2gKLS4JICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZIDB4MjAwMDAwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUgMHg0MDAwMDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAotLgkgICBjb250ZW50cy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMgMHg2MDAwMDAKLS4KLS4JeyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCi0uCSAgIHJlbG9jYXRpb24gb3Igb3RoZXIgYXJjYW5lIHByb2Nlc3NpbmcuICBJdCBpcyBza2lwcGVkIHdoZW4KLS4JICAgZ29pbmcgdGhyb3VnaCB0aGUgZmlyc3QtcGFzcyBvdXRwdXQsIHRydXN0aW5nIHRoYXQgc29tZW9uZQotLgkgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LRVJfQ1JFQVRFRCAweDgwMDAwMAotLgotLgl7KiBUaGlzIHNlY3Rpb24gc2hvdWxkIG5vdCBiZSBzdWJqZWN0IHRvIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKLS4KLS4JeyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zICJzaG9ydCIgZGF0YSwgYW5kIHNob3VsZCBiZSBwbGFjZWQKLS4JICAgIm5lYXIiIHRoZSBHUC4gICp9Ci0uI2RlZmluZSBTRUNfU0hPUlQgMHgyMDAwMDAwCi0uCi0uCXsqICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICp9Ci0uCi0uCXsqIFNvbWUgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKn0KLS4KLS4JeyogU2VlIHRoZSB2bWEgZmllbGQuICAqfQotLgl1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKLS4KLS4JeyogV2hldGhlciByZWxvY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKn0KLS4JdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotLgotLgl7KiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICp9Ci0uCXVuc2lnbmVkIGludCBsaW5rZXJfbWFyayA6IDE7Ci0uCi0uCXsqIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uCXVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKLS4KLS4JeyogRW5kIG9mIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICp9Ci0uCi0uICAgICAgIHsqICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLS4gICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKLS4JICAgIHVzZXJfc2V0X3ZtYSBmbGFnIGlzIG1haW50YWluZWQgYnkgYmZkOyBpZiBpdCdzIG5vdCBzZXQsIHRoZQotLgkgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLS4JICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCi0uCSAgICB0YXJnZXQgYW5kIHZhcmlvdXMgZmxhZ3MpLiAgKn0KLS4KLS4gICBiZmRfdm1hIHZtYTsKLS4KLS4gICAgICAgeyogIFRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3b3VsZCBiZSBpbiBhCi0uICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLS4JICAgIGluZm9ybWF0aW9uLiAqfQotLgotLiAgIGJmZF92bWEgbG1hOwotLgotLiAgICAgICAgeyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gYnl0ZXMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgotLiAgICAgICAgICAgY29udGFpbnMgYSB2YWx1ZSBldmVuIGlmIHRoZSBzZWN0aW9uIGhhcyBubyBjb250ZW50cyAoZS5nLiwgdGhlCi0uICAgICAgICAgICBzaXplIG9mIDw8LmJzcz4+KS4gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiBhZnRlciByZWxvY2F0aW9uICp9Ci0uCi0uICAgYmZkX3NpemVfdHlwZSBfY29va2VkX3NpemU7Ci0uCi0uICAgICAgICB7KiBUaGUgb3JpZ2luYWwgc2l6ZSBvbiBkaXNrIG9mIHRoZSBzZWN0aW9uLCBpbiBieXRlcy4gIE5vcm1hbGx5IHRoaXMKLS4JICAgIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplLCBidXQgaWYgc29tZSByZWxheGluZyBoYXMKLS4JICAgIGJlZW4gZG9uZSwgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgYmlnZ2VyLiAgKn0KLS4KLS4gICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLS4KLS4gICAgICAgIHsqIElmIHRoaXMgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBvdXRwdXQsIHRoZW4gdGhpcyB2YWx1ZSBpcyB0aGUKLS4gICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaW5wdXQKLS4gICAgICAgICAgIHNlY3Rpb24uIEUuZy4sIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZSAxMDB0aCBieXRlIGluCi0uICAgICAgICAgICB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoaXMgdmFsdWUgd291bGQgYmUgMTAwLiAqfQotLgotLiAgIGJmZF92bWEgb3V0cHV0X29mZnNldDsKLS4KLS4gICAgICAgIHsqIFRoZSBvdXRwdXQgc2VjdGlvbiB0aHJvdWdoIHdoaWNoIHRvIG1hcCBvbiBvdXRwdXQuICp9Ci0uCi0uICAgc3RydWN0IHNlYyAqb3V0cHV0X3NlY3Rpb247Ci0uCi0uICAgICAgICB7KiBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHRoZSBzZWN0aW9uLCBhcyBhbiBleHBvbmVudCBvZiAyIC0KLS4gICAgICAgICAgIGUuZy4sIDMgYWxpZ25zIHRvIDJeMyAob3IgOCkuICp9Ci0uCi0uICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLS4KLS4gICAgICAgIHsqIElmIGFuIGlucHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiByZWxvY2F0aW9uCi0uICAgICAgICAgICByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICp9Ci0uCi0uICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICpyZWxvY2F0aW9uOwotLgotLiAgICAgICAgeyogSWYgYW4gb3V0cHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0bwotLiAgICAgICAgICAgcmVsb2NhdGlvbiByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICp9Ci0uCi0uICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICoqb3JlbG9jYXRpb247Ci0uCi0uICAgICAgICB7KiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gcmVjb3JkcyBpbiBvbmUgb2YgdGhlIGFib3ZlICAqfQotLgotLiAgIHVuc2lnbmVkIHJlbG9jX2NvdW50OwotLgotLiAgICAgICAgeyogSW5mb3JtYXRpb24gYmVsb3cgaXMgYmFjayBlbmQgc3BlY2lmaWMgLSBhbmQgbm90IGFsd2F5cyB1c2VkCi0uICAgICAgICAgICBvciB1cGRhdGVkLiAgKn0KLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2Ygc2VjdGlvbiBkYXRhICAgICp9Ci0uCi0uICAgZmlsZV9wdHIgZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvICp9Ci0uCi0uICAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0uCi0uICAgICAgICB7KiBGaWxlIHBvc2l0aW9uIG9mIGxpbmUgZGF0YSAgICAgICAqfQotLgotLiAgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFBvaW50ZXIgdG8gZGF0YSBmb3IgYXBwbGljYXRpb25zICp9Ci0uCi0uICAgUFRSIHVzZXJkYXRhOwotLgotLiAgICAgICAgeyogSWYgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoaXMgcG9pbnRzIHRvIHRoZSBhY3R1YWwKLS4gICAgICAgICAgIGNvbnRlbnRzLiAgKn0KLS4gICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLS4KLS4gICAgICAgIHsqIEF0dGFjaGVkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uICp9Ci0uCi0uICAgYWxlbnQgKmxpbmVubzsKLS4KLS4gICAgICAgIHsqIE51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzICAgKn0KLS4KLS4gICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotLgotLiAgICAgICAgeyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotLiAgICAgICAgICAgbGluZW51bWJlcnMgYXJlIHdyaXR0ZW4gb3V0ICp9Ci0uCi0uICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFdoYXQgdGhlIHNlY3Rpb24gbnVtYmVyIGlzIGluIHRoZSB0YXJnZXQgd29ybGQgICp9Ci0uCi0uICAgaW50IHRhcmdldF9pbmRleDsKLS4KLS4gICBQVFIgdXNlZF9ieV9iZmQ7Ci0uCi0uICAgICAgICB7KiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotLiAgICAgICAgICAgcmVsb2NhdGlvbnMgY3JlYXRlZCB0byByZWxvY2F0ZSBpdGVtcyB3aXRoaW4gaXQuICp9Ci0uCi0uICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0uCi0uICAgICAgICB7KiBUaGUgQkZEIHdoaWNoIG93bnMgdGhlIHNlY3Rpb24uICp9Ci0uCi0uICAgYmZkICpvd25lcjsKLS4KLS4JIHsqIEEgc3ltYm9sIHdoaWNoIHBvaW50cyBhdCB0aGlzIHNlY3Rpb24gb25seSAqfQotLiAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLS4gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0uCi0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci0ufSBhc2VjdGlvbiA7Ci0uCi0uICAgIHsqIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLS4gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotLgl0aGVzZSBzZWN0aW9ucy4gIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIHNlY3Rpb25fcHRyIG1hY3JvcyByYXRoZXIKLS4gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0uICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICp9Ci0uI2RlZmluZSBCRkRfQUJTX1NFQ1RJT05fTkFNRSAiKkFCUyoiCi0uI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0uI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0uI2RlZmluZSBCRkRfSU5EX1NFQ1RJT05fTkFNRSAiKklORCoiCi0uCi0uICAgIHsqIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9hYnNfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2Fic19zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF91bmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9jb21fc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2NvbV9zZWN0aW9uKQotLiAgICB7KiBQb2ludGVyIHRvIHRoZSBpbmRpcmVjdCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2luZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9pbmRfc2VjdGlvbl9wdHIpCi0uCi0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLS5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9jb21fc3ltYm9sOwotLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhzZWN0aW9uKSBcCi0uICAgICAoc2VjdGlvbi0+cmVsb2NfZG9uZSA/IChhYm9ydCgpLDEpOiAoc2VjdGlvbiktPl9yYXdfc2l6ZSkKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLS4gICAgICgoc2VjdGlvbi0+cmVsb2NfZG9uZSkgPyAoc2VjdGlvbiktPl9jb29rZWRfc2l6ZTogKGFib3J0KCksMSkpCi0qLwotCi0vKiBUaGVzZSBzeW1ib2xzIGFyZSBnbG9iYWwsIG5vdCBzcGVjaWZpYyB0byBhbnkgQkZELiAgVGhlcmVmb3JlLCBhbnl0aGluZwotICAgdGhhdCB0cmllcyB0byBjaGFuZ2UgdGhlbSBpcyBicm9rZW4sIGFuZCBzaG91bGQgYmUgcmVwYWlyZWQuICAqLwotc3RhdGljIGNvbnN0IGFzeW1ib2wgZ2xvYmFsX3N5bXNbXSA9Ci17Ci0gLyogdGhlX2JmZCwgbmFtZSwgdmFsdWUsIGF0dHIsIHNlY3Rpb24gWywgdWRhdGFdICovCi0gIHswLCBCRkRfQ09NX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9jb21fc2VjdGlvbn0sCi0gIHswLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbn0sCi0gIHswLCBCRkRfQUJTX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9hYnNfc2VjdGlvbn0sCi0gIHswLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9pbmRfc2VjdGlvbn0sCi19OwotCi0jZGVmaW5lIFNURF9TRUNUSU9OKFNFQywgRkxBR1MsIFNZTSwgTkFNRSwgSURYKQlcCi0gIGNvbnN0IGFzeW1ib2wgKiBjb25zdCBTWU0gPSAoYXN5bWJvbCAqKSAmZ2xvYmFsX3N5bXNbSURYXTsgXAotICBjb25zdCBhc2VjdGlvbiBTRUMgPSBcCi0gICAgeyBOQU1FLCAwLCAwLCBGTEFHUywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgKGFzZWN0aW9uICopICZTRUMsIFwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBcCi0gICAgICAoYXN5bWJvbCAqKSAmZ2xvYmFsX3N5bXNbSURYXSwgKGFzeW1ib2wgKiopICZTWU0sIDAsIDAgfQotCi1TVERfU0VDVElPTiAoYmZkX2NvbV9zZWN0aW9uLCBTRUNfSVNfQ09NTU9OLCBiZmRfY29tX3N5bWJvbCwKLQkgICAgIEJGRF9DT01fU0VDVElPTl9OQU1FLCAwKTsKLVNURF9TRUNUSU9OIChiZmRfdW5kX3NlY3Rpb24sIDAsIGJmZF91bmRfc3ltYm9sLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMSk7Ci1TVERfU0VDVElPTiAoYmZkX2Fic19zZWN0aW9uLCAwLCBiZmRfYWJzX3N5bWJvbCwgQkZEX0FCU19TRUNUSU9OX05BTUUsIDIpOwotU1REX1NFQ1RJT04gKGJmZF9pbmRfc2VjdGlvbiwgMCwgYmZkX2luZF9zeW1ib2wsIEJGRF9JTkRfU0VDVElPTl9OQU1FLCAzKTsKLSN1bmRlZiBTVERfU0VDVElPTgotCi0vKgotRE9DREQKLUlOT0RFCi1zZWN0aW9uIHByb3RvdHlwZXMsICAsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBwcm90b3R5cGVzCi0KLVRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBzZWN0aW9uIGhhbmRsaW5nIHBhcnQgb2YgQkZELgotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlSdW4gdGhyb3VnaCBAdmFye2FiZmR9IGFuZCByZXR1cm4gdGhlIG9uZSBvZiB0aGUKLQk8PGFzZWN0aW9uPj5zIHdob3NlIG5hbWUgbWF0Y2hlcyBAdmFye25hbWV9LCBvdGhlcndpc2UgPDxOVUxMPj4uCi0JQHhyZWZ7U2VjdGlvbnN9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCVRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBzcGVjaWFsIGNhc2VzOyB0aGUgbm9ybWFsIHdheSB0byBwcm9jZXNzCi0JYWxsIHNlY3Rpb25zIG9mIGEgZ2l2ZW4gbmFtZSBpcyB0byB1c2UgPDxiZmRfbWFwX292ZXJfc2VjdGlvbnM+PiBhbmQKLQk8PHN0cmNtcD4+IG9uIHRoZSBuYW1lIChvciBiZXR0ZXIgeWV0LCBiYXNlIGl0IG9uIHRoZSBzZWN0aW9uIGZsYWdzCi0Jb3Igc29tZXRoaW5nIGVsc2UpIGZvciBlYWNoIHNlY3Rpb24uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjdDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdCAhPSBOVUxMOyBzZWN0ID0gc2VjdC0+bmV4dCkKLSAgICBpZiAoIXN0cmNtcCAoc2VjdC0+bmFtZSwgbmFtZSkpCi0gICAgICByZXR1cm4gc2VjdDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5Ci0KLVNZTk9QU0lTCi0JYXNlY3Rpb24gKmJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9Ci0JYW5kIGF0dGFjaCBpdCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiBvZiBzZWN0aW9ucyBmb3IgdGhlCi0JQkZEIEB2YXJ7YWJmZH0uIEFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgc2VjdGlvbiB3aXRoIGEgbmFtZSB3aGljaAotCWlzIGFscmVhZHkgaW4gdXNlIHJldHVybnMgaXRzIHBvaW50ZXIgd2l0aG91dCBjaGFuZ2luZyB0aGUKLQlzZWN0aW9uIGNoYWluLgotCi0JSXQgaGFzIHRoZSBmdW5ueSBuYW1lIHNpbmNlIHRoaXMgaXMgdGhlIHdheSBpdCB1c2VkIHRvIGJlCi0JYmVmb3JlIGl0IHdhcyByZXdyaXR0ZW4uLi4uCi0KLQlQb3NzaWJsZSBlcnJvcnMgYXJlOgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JSWYgb3V0cHV0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgZm9yIHRoaXMgQkZELgotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCUlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgotCi0qLwotCi0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgIH0KLSAgcmV0dXJuIHNlYzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIENyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9IGFuZCBhdHRhY2ggaXQgdG8gdGhlIGVuZCBvZgotICAgdGhlIGNoYWluIG9mIHNlY3Rpb25zIGZvciBAdmFye2FiZmR9LiAgQ3JlYXRlIGEgbmV3IHNlY3Rpb24gZXZlbiBpZiB0aGVyZQotICAgaXMgYWxyZWFkeSBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUuCi0KLSAgIFJldHVybiA8PE5VTEw+PiBhbmQgc2V0IDw8YmZkX2Vycm9yPj4gb24gZXJyb3I7IHBvc3NpYmxlIGVycm9ycyBhcmU6Ci0gICBvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLSBJZiBvdXRwdXQgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgQHZhcnthYmZkfS4KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLSBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KLSovCi0KLXNlY19wdHIKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBhc2VjdGlvbiAqKnByZXYgPSAmYWJmZC0+c2VjdGlvbnM7Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB3aGlsZSAoc2VjdCkKLSAgICB7Ci0gICAgICBwcmV2ID0gJnNlY3QtPm5leHQ7Ci0gICAgICBzZWN0ID0gc2VjdC0+bmV4dDsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmV3c2VjdC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPmluZGV4ID0gYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotICBuZXdzZWN0LT5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBuZXdzZWN0LT51c2VyZGF0YSA9IE5VTEw7Ci0gIG5ld3NlY3QtPmNvbnRlbnRzID0gTlVMTDsKLSAgbmV3c2VjdC0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuZXdzZWN0LT5yZWxvY2F0aW9uID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgbmV3c2VjdC0+cmVsb2NfY291bnQgPSAwOwotICBuZXdzZWN0LT5saW5lX2ZpbGVwb3MgPSAwOwotICBuZXdzZWN0LT5vd25lciA9IGFiZmQ7Ci0KLSAgLyogQ3JlYXRlIGEgc3ltYm9sIHdob3Mgb25seSBqb2IgaXMgdG8gcG9pbnQgdG8gdGhpcyBzZWN0aW9uLiBUaGlzIGlzCi0gICAgIHVzZWZ1bCBmb3IgdGhpbmdzIGxpa2UgcmVsb2NzIHdoaWNoIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiBhCi0gICAgIHNlY3Rpb24uICAqLwotICBuZXdzZWN0LT5zeW1ib2wgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAobmV3c2VjdC0+c3ltYm9sID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+dmFsdWUgPSAwOwotICBuZXdzZWN0LT5zeW1ib2wtPnNlY3Rpb24gPSBuZXdzZWN0OwotICBuZXdzZWN0LT5zeW1ib2wtPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCi0gIG5ld3NlY3QtPnN5bWJvbF9wdHJfcHRyID0gJm5ld3NlY3QtPnN5bWJvbDsKLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9uZXdfc2VjdGlvbl9ob29rLCAoYWJmZCwgbmV3c2VjdCkpICE9IHRydWUpCi0gICAgewotICAgICAgZnJlZSAobmV3c2VjdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgKnByZXYgPSBuZXdzZWN0OwotICByZXR1cm4gbmV3c2VjdDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbgotCi1TWU5PUFNJUwotCWFzZWN0aW9uICpiZmRfbWFrZV9zZWN0aW9uKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIExpa2UgPDxiZmRfbWFrZV9zZWN0aW9uX2FueXdheT4+LCBidXQgcmV0dXJuIDw8TlVMTD4+ICh3aXRob3V0IGNhbGxpbmcKLSAgIGJmZF9zZXRfZXJyb3IgKCkpIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlY3Rpb24gY2hhaW4gaWYgdGhlcmUgaXMgYWxyZWFkeSBhCi0gICBzZWN0aW9uIG5hbWVkIEB2YXJ7bmFtZX0uICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgcmV0dXJuIDw8TlVMTD4+IGFuZCBzZXQKLSAgIDw8YmZkX2Vycm9yPj4uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX0FCU19TRUNUSU9OX05BTUUpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfQ09NX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9VTkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgIH0KLQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2luZF9zZWN0aW9uX3B0cjsKLSAgICB9Ci0KLSAgd2hpbGUgKHNlY3QpCi0gICAgewotICAgICAgaWYgKCFzdHJjbXAgKHNlY3QtPm5hbWUsIG5hbWUpKQotCXJldHVybiBOVUxMOwotICAgICAgc2VjdCA9IHNlY3QtPm5leHQ7Ci0gICAgfQotCi0gIC8qIFRoZSBuYW1lIGlzIG5vdCBhbHJlYWR5IHVzZWQ7IGdvIGFoZWFkIGFuZCBtYWtlIGEgbmV3IHNlY3Rpb24uICAqLwotICByZXR1cm4gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zZWN0aW9uX2ZsYWdzKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbiBAdmFye3NlY30gaW4gdGhlIEJGRAotCUB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LiBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywKLQk8PGZhbHNlPj4gb24gZXJyb3IuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlUaGUgc2VjdGlvbiBjYW5ub3QgaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGUgYXR0cmlidXRlcwotCXJlcXVlc3RlZC4gRm9yIGV4YW1wbGUsIGEgLmJzcyBzZWN0aW9uIGluIDw8YS5vdXQ+PiBtYXkgbm90Ci0JaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4gZmllbGQgc2V0LgotCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSNpZiAwCi0gIC8qIElmIHlvdSB0cnkgdG8gY29weSBhIHRleHQgc2VjdGlvbiBmcm9tIGFuIGlucHV0IGZpbGUgKHdoZXJlIGl0Ci0gICAgIGhhcyB0aGUgU0VDX0NPREUgZmxhZyBzZXQpIHRvIGFuIG91dHB1dCBmaWxlLCB0aGlzIGxvc2VzIGJpZyBpZgotICAgICB0aGUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoYWJmZCkgZG9lc24ndCBoYXZlIHRoZSBTRUNfQ09ERQotICAgICBzZXQgLSB3aGljaCBpdCBkb2Vzbid0LCBhdCBsZWFzdCBub3QgZm9yIGEub3V0LiAgRklYTUUgKi8KLQotICBpZiAoKGZsYWdzICYgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoYWJmZCkpICE9IGZsYWdzKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgc2VjdGlvbi0+ZmxhZ3MgPSBmbGFnczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21hcF9vdmVyX3NlY3Rpb25zCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfbWFwX292ZXJfc2VjdGlvbnMoYmZkICphYmZkLAotCQkJCSAgIHZvaWQgKCpmdW5jKShiZmQgKmFiZmQsCi0JCQkJCQlhc2VjdGlvbiAqc2VjdCwKLQkJCQkJCVBUUiBvYmopLAotCQkJCSAgIFBUUiBvYmopOwotCi1ERVNDUklQVElPTgotCUNhbGwgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIEB2YXJ7ZnVuY30gZm9yIGVhY2ggc2VjdGlvbgotCWF0dGFjaGVkIHRvIHRoZSBCRkQgQHZhcnthYmZkfSwgcGFzc2luZyBAdmFye29ian0gYXMgYW4KLQlhcmd1bWVudC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFzIGlmIGJ5Ci0KLXwJZnVuYyhhYmZkLCB0aGVfc2VjdGlvbiwgb2JqKTsKLQotCVRoaXMgaXMgdGhlIHByZWZlcmVkIG1ldGhvZCBmb3IgaXRlcmF0aW5nIG92ZXIgc2VjdGlvbnM7IGFuCi0JYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gdXNlIGEgbG9vcDoKLQotfAkgICBzZWN0aW9uICpwOwotfAkgICBmb3IgKHAgPSBhYmZkLT5zZWN0aW9uczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLXwJICAgICAgZnVuYyhhYmZkLCBwLCAuLi4pCi0KLQotKi8KLQotLypWQVJBUkdTMiovCi12b2lkCi1iZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIG9wZXJhdGlvbiwgdXNlcl9zdG9yYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHZvaWQgKCpvcGVyYXRpb24pIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGFzZWN0aW9uICogc2VjdCwgUFRSIG9iaikpOwotICAgICBQVFIgdXNlcl9zdG9yYWdlOwotewotICBhc2VjdGlvbiAqc2VjdDsKLSAgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0ICE9IE5VTEw7IGkrKywgc2VjdCA9IHNlY3QtPm5leHQpCi0gICAgKCpvcGVyYXRpb24pIChhYmZkLCBzZWN0LCB1c2VyX3N0b3JhZ2UpOwotCi0gIGlmIChpICE9IGFiZmQtPnNlY3Rpb25fY291bnQpCS8qIERlYnVnZ2luZyAqLwotICAgIGFib3J0ICgpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9zaXplCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3NlY3Rpb25fc2l6ZShiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGJmZF9zaXplX3R5cGUgdmFsKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgQHZhcntzZWN9IHRvIHRoZSBzaXplIEB2YXJ7dmFsfS4gSWYgdGhlIG9wZXJhdGlvbiBpcwotCW9rLCB0aGVuIDw8dHJ1ZT4+IGlzIHJldHVybmVkLCBlbHNlIDw8ZmFsc2U+Pi4KLQotCVBvc3NpYmxlIGVycm9yIHJldHVybnM6Ci0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlXcml0aW5nIGhhcyBzdGFydGVkIHRvIHRoZSBCRkQsIHNvIHNldHRpbmcgdGhlIHNpemUgaXMgaW52YWxpZC4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHB0ciwgdmFsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgcHRyOwotICAgICBiZmRfc2l6ZV90eXBlIHZhbDsKLXsKLSAgLyogT25jZSB5b3UndmUgc3RhcnRlZCB3cml0aW5nIHRvIGFueSBzZWN0aW9uIHlvdSBjYW5ub3QgY3JlYXRlIG9yIGNoYW5nZQotICAgICB0aGUgc2l6ZSBvZiBhbnkgb3RoZXJzLiAqLwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHB0ci0+X2Nvb2tlZF9zaXplID0gdmFsOwotICBwdHItPl9yYXdfc2l6ZSA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICAgICAgIFBUUiBkYXRhLAotICAgICAgICAgZmlsZV9wdHIgb2Zmc2V0LAotICAgICAgICAgYmZkX3NpemVfdHlwZSBjb3VudCk7Ci0KLQotREVTQ1JJUFRJT04KLQlTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBAdmFye3NlY3Rpb259IGluIEJGRAotCUB2YXJ7YWJmZH0gdG8gdGhlIGRhdGEgc3RhcnRpbmcgaW4gbWVtb3J5IGF0IEB2YXJ7ZGF0YX0uIFRoZQotCWRhdGEgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24gc3RhcnRpbmcgYXQgb2Zmc2V0Ci0JQHZhcntvZmZzZXR9IGZvciBAdmFye2NvdW50fSBieXRlcy4KLQotCi0KLQlOb3JtYWxseSA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZSA8PGZhbHNlPj4uIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl9ub19jb250ZW50cz4+IC0KLQlUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4KLQlhdHRyaWJ1dGUsIHNvIG5vdGhpbmcgY2FuIGJlIHdyaXR0ZW4gdG8gaXQuCi0JbyBhbmQgc29tZSBtb3JlIHRvbwotCi0JVGhpcyByb3V0aW5lIGlzIGZyb250IGVuZCB0byB0aGUgYmFjayBlbmQgZnVuY3Rpb24KLQk8PF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHM+Pi4KLQotCi0qLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX25vdyhhYmZkLHNlYykgXAotKHNlYy0+cmVsb2NfZG9uZSBcCi0gPyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9hZnRlcl9yZWxvYyAoc2VjKSBcCi0gOiBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykpCi0KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzejsKLQotICBpZiAoIShiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLSAgICAgIHJldHVybiAoZmFsc2UpOwotICAgIH0KLQotICBpZiAob2Zmc2V0IDwgMCkKLSAgICB7Ci0gICAgYmFkX3ZhbDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc3ogPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIG9mZnNldCA+IHN6Ci0gICAgICB8fCBjb3VudCA+IHN6Ci0gICAgICB8fCBvZmZzZXQgKyBjb3VudCA+IHN6KQotICAgIGdvdG8gYmFkX3ZhbDsKLQotICBzd2l0Y2ggKGFiZmQtPmRpcmVjdGlvbikKLSAgICB7Ci0gICAgY2FzZSByZWFkX2RpcmVjdGlvbjoKLSAgICBjYXNlIG5vX2RpcmVjdGlvbjoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIHdyaXRlX2RpcmVjdGlvbjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBib3RoX2RpcmVjdGlvbjoKLSAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGZvciB1cGRhdGUuIGBvdXRwdXRfaGFzX2JlZ3VuJyBzb21lIHRpbWUgYWdvIHdoZW4KLQkgICB0aGUgZmlsZSB3YXMgY3JlYXRlZC4gIERvIG5vdCByZWNvbXB1dGUgc2VjdGlvbnMgc2l6ZXMgb3IgYWxpZ25tZW50cwotCSAgIGluIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudC4gICovCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMsCi0JCShhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpKQotICAgIHsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgICAgICAgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBsb2NhdGlvbiwKLSAgICAgICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JUmVhZCBkYXRhIGZyb20gQHZhcntzZWN0aW9ufSBpbiBCRkQgQHZhcnthYmZkfQotCWludG8gbWVtb3J5IHN0YXJ0aW5nIGF0IEB2YXJ7bG9jYXRpb259LiBUaGUgZGF0YSBpcyByZWFkIGF0IGFuCi0Jb2Zmc2V0IG9mIEB2YXJ7b2Zmc2V0fSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgc2VjdGlvbiwKLQlhbmQgaXMgcmVhZCBmb3IgQHZhcntjb3VudH0gYnl0ZXMuCi0KLQlJZiB0aGUgY29udGVudHMgb2YgYSBjb25zdHJ1Y3RvciB3aXRoIHRoZSA8PFNFQ19DT05TVFJVQ1RPUj4+Ci0JZmxhZyBzZXQgYXJlIHJlcXVlc3RlZCBvciBpZiB0aGUgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQotCTw8U0VDX0hBU19DT05URU5UUz4+IGZsYWcgc2V0LCB0aGVuIHRoZSBAdmFye2xvY2F0aW9ufSBpcyBmaWxsZWQKLQl3aXRoIHplcm9lcy4gSWYgbm8gZXJyb3JzIG9jY3VyLCA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZQotCTw8ZmFsc2U+Pi4KLQotCi0KLSovCi1ib29sZWFuCi1iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3o7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIG1lbXNldCAobG9jYXRpb24sIDAsICh1bnNpZ25lZCkgY291bnQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChvZmZzZXQgPCAwKQotICAgIHsKLSAgICBiYWRfdmFsOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBFdmVuIGlmIHJlbG9jX2RvbmUgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiByZWFkcyB1bnJlbG9jYXRlZAotICAgICBjb250ZW50cywgc28gd2Ugd2FudCB0aGUgcmF3IHNpemUuICAqLwotICBzeiA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBvZmZzZXQgPiBzeiB8fCBjb3VudCA+IHN6IHx8IG9mZnNldCArIGNvdW50ID4gc3opCi0gICAgZ290byBiYWRfdmFsOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIC8qIERvbid0IGJvdGhlci4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0gICAgewotICAgICAgbWVtc2V0IChsb2NhdGlvbiwgMCwgKHVuc2lnbmVkKSBjb3VudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgbWVtY3B5IChsb2NhdGlvbiwgc2VjdGlvbi0+Y29udGVudHMgKyBvZmZzZXQsIChzaXplX3QpIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsCi0JCSAgIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYyk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzZWN9IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzZWN0aW9uIEB2YXJ7b3NlY30gaW4gdGhlIEJGRCBAdmFye29iZmR9LgotCVJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotCXJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b3NlY30uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwgXAotLgkJKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikpCi0qLwotCi0vKgotRlVOQ1RJT04KLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLQotU1lOT1BTSVMKLQl2b2lkIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAotCShhc2VjdGlvbiAqc2VjdGlvbik7Ci0KLURFU0NSSVBUSU9OCi0JUmVtb3ZlIEB2YXJ7c2VjdGlvbn0gZnJvbSB0aGUgb3V0cHV0LiAgSWYgdGhlIG91dHB1dCBzZWN0aW9uIGJlY29tZXMKLQllbXB0eSwgcmVtb3ZlIGl0IGZyb20gdGhlIG91dHB1dCBiZmQuCi0qLwotdm9pZAotX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKQotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgYXNlY3Rpb24gKipzcHAsICpvczsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwLCAqcHA7Ci0KLSAgLyogRXhjaXNlIHRoZSBpbnB1dCBzZWN0aW9uIGZyb20gdGhlIGxpbmsgb3JkZXIuICAqLwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmb3IgKHAgPSBvcy0+bGlua19vcmRlcl9oZWFkLCBwcCA9IE5VTEw7IHAgIT0gTlVMTDsgcHAgPSBwLCBwID0gcC0+bmV4dCkKLSAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSYmIHAtPnUuaW5kaXJlY3Quc2VjdGlvbiA9PSBzKQotICAgICAgewotCWlmIChwcCkKLQkgIHBwLT5uZXh0ID0gcC0+bmV4dDsKLQllbHNlCi0JICBvcy0+bGlua19vcmRlcl9oZWFkID0gcC0+bmV4dDsKLQlpZiAoIXAtPm5leHQpCi0JICBvcy0+bGlua19vcmRlcl90YWlsID0gcHA7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgLyogSWYgdGhlIG91dHB1dCBzZWN0aW9uIGlzIGVtcHR5LCByZW1vdmUgaXQgdG9vLiAgQ2FyZWZ1bCBhYm91dCBzZWN0aW9ucwotICAgICB0aGF0IGhhdmUgYmVlbiBkaXNjYXJkZWQgaW4gdGhlIGxpbmsgc2NyaXB0IC0tIHRoZXkgYXJlIG1hcHBlZCB0byAKLSAgICAgYmZkX2Fic19zZWN0aW9uLCB3aGljaCBoYXMgbm8gb3duZXIuICAqLwotICBpZiAoIW9zLT5saW5rX29yZGVyX2hlYWQgJiYgb3MtPm93bmVyKQotICAgIHsKLSAgICAgIGZvciAoc3BwID0gJm9zLT5vd25lci0+c2VjdGlvbnM7ICpzcHA7IHNwcCA9ICYoKnNwcCktPm5leHQpCi0JaWYgKCpzcHAgPT0gb3MpCi0JICB7Ci0JICAgICpzcHAgPSBvcy0+bmV4dDsKLQkgICAgb3MtPm93bmVyLT5zZWN0aW9uX2NvdW50LS07Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JmZC9zb20uYyBiL2JmZC9zb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxZmFjMC4uMDAwMDAwMAotLS0gYS9iZmQvc29tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYzICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgSFAgUEEtUklTQyBTT00gb2JqZWN0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKSB8fCBkZWZpbmVkKEhPU1RfSFBQQU1QRUlYKQotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAic29tLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogTWFnaWMgbm90IGRlZmluZWQgaW4gc3RhbmRhcmQgSFAtVVggaGVhZGVyIGZpbGVzIHVudGlsIDguMCAqLwotCi0jaWZuZGVmIENQVV9QQV9SSVNDMV8wCi0jZGVmaW5lIENQVV9QQV9SSVNDMV8wIDB4MjBCCi0jZW5kaWYgLyogQ1BVX1BBX1JJU0MxXzAgKi8KLQotI2lmbmRlZiBDUFVfUEFfUklTQzFfMQotI2RlZmluZSBDUFVfUEFfUklTQzFfMSAweDIxMAotI2VuZGlmIC8qIENQVV9QQV9SSVNDMV8xICovCi0KLSNpZm5kZWYgQ1BVX1BBX1JJU0MyXzAKLSNkZWZpbmUgQ1BVX1BBX1JJU0MyXzAgMHgyMTQKLSNlbmRpZiAvKiBDUFVfUEFfUklTQzJfMCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDMV8wX0lECi0jZGVmaW5lIF9QQV9SSVNDMV8wX0lEIENQVV9QQV9SSVNDMV8wCi0jZW5kaWYgLyogX1BBX1JJU0MxXzBfSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQzFfMV9JRAotI2RlZmluZSBfUEFfUklTQzFfMV9JRCBDUFVfUEFfUklTQzFfMQotI2VuZGlmIC8qIF9QQV9SSVNDMV8xX0lEICovCi0KLSNpZm5kZWYgX1BBX1JJU0MyXzBfSUQKLSNkZWZpbmUgX1BBX1JJU0MyXzBfSUQgQ1BVX1BBX1JJU0MyXzAKLSNlbmRpZiAvKiBfUEFfUklTQzJfMF9JRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDX01BWElECi0jZGVmaW5lIF9QQV9SSVNDX01BWElECTB4MkZGCi0jZW5kaWYgLyogX1BBX1JJU0NfTUFYSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQ19JRAotI2RlZmluZSBfUEFfUklTQ19JRChfX21fbnVtKQkJXAotICAgICgoKF9fbV9udW0pID09IF9QQV9SSVNDMV8wX0lEKSB8fAlcCi0gICAgICgoX19tX251bSkgPj0gX1BBX1JJU0MxXzFfSUQgJiYgKF9fbV9udW0pIDw9IF9QQV9SSVNDX01BWElEKSkKLSNlbmRpZiAvKiBfUEFfUklTQ19JRCAqLwotCi0KLS8qIEhJVVggaW4gaXQncyBpbmZpbml0ZSBzdHVwaWRpdHkgY2hhbmdlZCB0aGUgbmFtZXMgZm9yIHNldmVyYWwgIndlbGwKLSAgIGtub3duIiBjb25zdGFudHMuICBXb3JrIGFyb3VuZCBzdWNoIGJyYWluZGFtYWdlLiAgVHJ5IHRoZSBIUFVYIHZlcnNpb24KLSAgIGZpcnN0LCB0aGVuIHRoZSBISVVYIHZlcnNpb24sIGFuZCBmaW5hbGx5IHByb3ZpZGUgYSBkZWZhdWx0LiAgKi8KLSNpZmRlZiBIUFVYX0FVWF9JRAotI2RlZmluZSBFWEVDX0FVWF9JRCBIUFVYX0FVWF9JRAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoRVhFQ19BVVhfSUQpICYmIGRlZmluZWQgKEhJVVhfQVVYX0lEKQotI2RlZmluZSBFWEVDX0FVWF9JRCBISVVYX0FVWF9JRAotI2VuZGlmCi0KLSNpZm5kZWYgRVhFQ19BVVhfSUQKLSNkZWZpbmUgRVhFQ19BVVhfSUQgMAotI2VuZGlmCi0KLS8qIFNpemUgKGluIGNoYXJzKSBvZiB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgdXNlZCBkdXJpbmcgZml4dXAgYW5kIHN0cmluZwotICAgdGFibGUgd3JpdGVzLiAgICovCi0gICAKLSNkZWZpbmUgU09NX1RNUF9CVUZTSVpFIDgxOTIKLQotLyogU2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBpbiBhcmNoaXZlcy4gICovCi0jZGVmaW5lIFNPTV9MU1RfSEFTSF9TSVpFIDMxCi0KLS8qIE1heCBudW1iZXIgb2YgU09NcyB0byBiZSBmb3VuZCBpbiBhbiBhcmNoaXZlLiAgKi8KLSNkZWZpbmUgU09NX0xTVF9NT0RVTEVfTElNSVQgMTAyNAotCi0vKiBHZW5lcmljIGFsaWdubWVudCBtYWNyby4gICovCi0jZGVmaW5lIFNPTV9BTElHTih2YWwsIGFsaWdubWVudCkgXAotICAoKCh2YWwpICsgKGFsaWdubWVudCkgLSAxKSAmIH4oKGFsaWdubWVudCkgLSAxKSkKLQotLyogU09NIGFsbG93cyBhbnkgb25lIG9mIHRoZSBmb3VyIHByZXZpb3VzIHJlbG9jYXRpb25zIHRvIGJlIHJldXNlZAotICAgd2l0aCBhICJSX1BSRVZfRklYVVAiIHJlbG9jYXRpb24gZW50cnkuICBTaW5jZSBSX1BSRVZfRklYVVAKLSAgIHJlbG9jYXRpb25zIGFyZSBhbHdheXMgYSBzaW5nbGUgYnl0ZSwgdXNpbmcgYSBSX1BSRVZfRklYVVAgaW5zdGVhZAotICAgb2Ygc29tZSBtdWx0aS1ieXRlIHJlbG9jYXRpb24gbWFrZXMgb2JqZWN0IGZpbGVzIHNtYWxsZXIuIAotCi0gICBOb3RlIG9uZSBzaWRlIGVmZmVjdCBvZiB1c2luZyBhIFJfUFJFVl9GSVhVUCBpcyB0aGUgcmVsb2NhdGlvbiB0aGF0Ci0gICBpcyBiZWluZyByZXBlYXRlZCBtb3ZlcyB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAgKi8KLXN0cnVjdCByZWxvY19xdWV1ZQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqcmVsb2M7Ci0gICAgdW5zaWduZWQgaW50IHNpemU7Ci0gIH0gcmVsb2NfcXVldWVbNF07Ci0KLS8qIFRoaXMgZnVsbHkgZGVzY3JpYmVzIHRoZSBzeW1ib2wgdHlwZXMgd2hpY2ggbWF5IGJlIGF0dGFjaGVkIHRvCi0gICBhbiBFWFBPUlQgb3IgSU1QT1JUIGRpcmVjdGl2ZS4gIE9ubHkgU09NIHVzZXMgdGhpcyBmb3JtYXRpb24KLSAgIChFTEYgaGFzIG5vIG5lZWQgZm9yIGl0KS4gICovCi10eXBlZGVmIGVudW0KLXsKLSAgU1lNQk9MX1RZUEVfVU5LTk9XTiwKLSAgU1lNQk9MX1RZUEVfQUJTT0xVVEUsCi0gIFNZTUJPTF9UWVBFX0NPREUsCi0gIFNZTUJPTF9UWVBFX0RBVEEsCi0gIFNZTUJPTF9UWVBFX0VOVFJZLAotICBTWU1CT0xfVFlQRV9NSUxMSUNPREUsCi0gIFNZTUJPTF9UWVBFX1BMQUJFTCwKLSAgU1lNQk9MX1RZUEVfUFJJX1BST0csCi0gIFNZTUJPTF9UWVBFX1NFQ19QUk9HLAotfSBwYV9zeW1ib2xfdHlwZTsKLQotc3RydWN0IHNlY3Rpb25fdG9fdHlwZQotewotICBjaGFyICpzZWN0aW9uOwotICBjaGFyIHR5cGU7Ci19OwotCi0vKiBBc3NvcnRlZCBzeW1ib2wgaW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlIEJGRCBzeW1ib2wKLSAgIGFuZC9vciB0aGUgQkZEIGJhY2tlbmQgcHJpdmF0ZSBzeW1ib2wgZGF0YS4gICovCi1zdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8KLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF90eXBlOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3Njb3BlOwotICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2luZm87Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfdmFsdWU7Ci0gIHVuc2lnbmVkIGludCBwcml2X2xldmVsOwotfTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGJvb2xlYW4gc29tX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3Rfc2V0dXAgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgc3RydWN0IGhlYWRlciAqLAotCQkJCQkJICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzZXR1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGhlYWRlciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzb21fc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLQkJCQkJICAgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc29tX3NldF9yZWxvY19pbmZvIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzeW1ib2wgKiBzb21fbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkgICAgICBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc29tX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkJICBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIHNvbV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgc29tX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0JCQkJCQkgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYXN5bWJvbCAqKiwgYmZkX3ZtYSwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyB2b2lkIHNvbV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGFzZWN0aW9uICogYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCAKLQkJCQkJc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqKSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGhwcGFfc29tX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCQkgICAgIGFzeW1ib2wgKiwgUFRSLAotCQkJCQkJICAgICBhc2VjdGlvbiAqLCBiZmQgKiwKLQkJCQkJCSAgICAgY2hhciAqKikpOwotc3RhdGljIHZvaWQgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgUEFSQU1TICgoc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB2b2lkIHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotc3RhdGljIHZvaWQgc29tX3JlbG9jX3F1ZXVlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgcmVsb2NfcXVldWUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IHNvbV9yZWxvY19xdWV1ZV9maW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogdHJ5X3ByZXZfZml4dXAgUEFSQU1TICgoYmZkICosIGludCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19za2lwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogc29tX3JlbG9jX2FkZGVuZCBQQVJBTVMgKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICAgIHVuc2lnbmVkIGludCAqLAotCQkJCQkJIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19jYWxsIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJICAgICAgIGFyZWxlbnQgKiwgaW50LAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zdWJzcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9zeW1zIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc3Vic3BhY2VzIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY29tcHV0ZV9jaGVja3N1bSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3ByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzb21fc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5pc2hfd3JpdGluZyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmVwX2Zvcl9maXh1cHMgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9maXh1cHMgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywKLQkJCQkJCXVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQkgYXN5bWJvbCAqKiwgdW5zaWduZWQgaW50LAotCQkJCQkJIHVuc2lnbmVkICosCi0JCQkJCQkgQ09NUFVOSVQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JlZ2luX3dyaXRpbmcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBjaGFyIHNvbV9zZWN0aW9uX3R5cGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IHNvbV9kZWNvZGVfc3ltY2xhc3MgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBsc3RfaGVhZGVyICosCi0JCQkJCQkgc3ltaW5kZXggKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGxzdF9oZWFkZXIgKiwKLQkJCQkJCSAgIGNhcnN5bSAqKnN5bXMpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwKLQkJCQkJdW5zaWduZWQgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50ICosCi0JCQkJCQkgIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNvbV9iZmRfYXJfc3ltYm9sX2hhc2ggUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgc3RydWN0IGxzdF9oZWFkZXIsCi0JCQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9pc19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21faXNfc3Vic3BhY2UgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2lzX2NvbnRhaW5lciBQQVJBTVMgKChhc2VjdGlvbiAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0JCi0vKiBNYXAgU09NIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotCi0gICBUaGlzIHRhYmxlIGluY2x1ZGVzIGFsbCB0aGUgc3RhbmRhcmQgc3Vic3BhY2VzIGFzIGRlZmluZWQgaW4gdGhlIAotICAgY3VycmVudCAiUFJPIEFCSSBmb3IgUEEtUklTQyBTeXN0ZW1zIiwgJFVOV0lORCQgd2hpY2ggZm9yIAotICAgc29tZSByZWFzb24gd2FzIGxlZnQgb3V0LCBhbmQgc2VjdGlvbnMgc3BlY2lmaWMgdG8gZW1iZWRkZWQgc3RhYnMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSBzdHRbXSA9IHsKLSAgeyIkVEVYVCQiLCAndCd9LAotICB7IiRTSExJQl9JTkZPJCIsICd0J30sCi0gIHsiJE1JTExJQ09ERSQiLCAndCd9LAotICB7IiRMSVQkIiwgJ3QnfSwKLSAgeyIkQ09ERSQiLCAndCd9LAotICB7IiRVTldJTkRfU1RBUlQkIiwgJ3QnfSwKLSAgeyIkVU5XSU5EJCIsICd0J30sCi0gIHsiJFBSSVZBVEUkIiwgJ2QnfSwKLSAgeyIkUExUJCIsICdkJ30sCi0gIHsiJFNITElCX0RBVEEkIiwgJ2QnfSwKLSAgeyIkREFUQSQiLCAnZCd9LAotICB7IiRTSE9SVERBVEEkIiwgJ2cnfSwKLSAgeyIkRExUJCIsICdkJ30sCi0gIHsiJEdMT0JBTCQiLCAnZyd9LAotICB7IiRTSE9SVEJTUyQiLCAncyd9LAotICB7IiRCU1MkIiwgJ2InfSwKLSAgeyIkR0RCX1NUUklOR1MkIiwgJ04nfSwKLSAgeyIkR0RCX1NZTUJPTFMkIiwgJ04nfSwKLSAgezAsIDB9Ci19OwotCi0vKiBBYm91dCB0aGUgcmVsb2NhdGlvbiBmb3JtYXR0aW5nIHRhYmxlLi4uCi0KLSAgIFRoZXJlIGFyZSAyNTYgZW50cmllcyBpbiB0aGUgdGFibGUsIG9uZSBmb3IgZWFjaCBwb3NzaWJsZQotICAgcmVsb2NhdGlvbiBvcGNvZGUgYXZhaWxhYmxlIGluIFNPTS4gIFdlIGluZGV4IHRoZSB0YWJsZSBieQotICAgdGhlIHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlIG5hbWVzIGFuZCBvcGVyYXRpb25zIGFyZSB0aG9zZQotICAgZGVmaW5lZCBieSBhLm91dF84MDAgKDQpLgotCi0gICBSaWdodCBub3cgdGhpcyB0YWJsZSBpcyBvbmx5IHVzZWQgdG8gY291bnQgYW5kIHBlcmZvcm0gbWluaW1hbAotICAgcHJvY2Vzc2luZyBvbiByZWxvY2F0aW9uIHN0cmVhbXMgc28gdGhhdCB0aGV5IGNhbiBiZSBpbnRlcm5hbGl6ZWQKLSAgIGludG8gQkZEIGFuZCBzeW1ib2xpY2FsbHkgcHJpbnRlZCBieSB1dGlsaXRpZXMuICBUbyBtYWtlIGFjdHVhbCB1c2UgCi0gICBvZiB0aGVtIHdvdWxkIGJlIG11Y2ggbW9yZSBkaWZmaWN1bHQsIEJGRCdzIGNvbmNlcHQgb2YgcmVsb2NhdGlvbnMKLSAgIGlzIGZhciB0b28gc2ltcGxlIHRvIGhhbmRsZSBTT00gcmVsb2NhdGlvbnMuICBUaGUgYmFzaWMgYXNzdW1wdGlvbgotICAgdGhhdCBhIHJlbG9jYXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgcHJvY2Vzc2VkIGluZGVwZW5kZW50IG9mIG90aGVyCi0gICByZWxvY2F0aW9ucyBiZWZvcmUgYW4gb2JqZWN0IGZpbGUgaXMgd3JpdHRlbiBpcyBpbnZhbGlkIGZvciBTT00uCi0KLSAgIFRoZSBTT00gcmVsb2NhdGlvbnMgYXJlIG1lYW50IHRvIGJlIHByb2Nlc3NlZCBhcyBhIHN0cmVhbSwgdGhleQotICAgc3BlY2lmeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24KLSAgIHdoaWxlIHBvc3NpYmx5IG1vZGlmeWluZyB0aGUgZGF0YSBpbiBzb21lIG1hbm5lci4gIFRoZXkgYWxzbyBjYW4gCi0gICBzcGVjaWZ5IHRoYXQgYSB2YXJpYWJsZSBudW1iZXIgb2YgemVyb3Mgb3IgdW5pbml0aWFsaXplZCBkYXRhIGJlCi0gICBpbnNlcnRlZCBvbiBpbiB0aGUgb3V0cHV0IHNlZ21lbnQgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0LiAgU29tZQotICAgcmVsb2NhdGlvbnMgc3BlY2lmeSB0aGF0IHNvbWUgcHJldmlvdXMgcmVsb2NhdGlvbiBiZSByZS1hcHBsaWVkIGF0Ci0gICB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaW5wdXQvb3V0cHV0IHNlY3Rpb25zLiAgQW5kIGZpbmFsbHkgYSBudW1iZXIKLSAgIG9mIHJlbG9jYXRpb25zIGhhdmUgZWZmZWN0cyBvbiBvdGhlciBzZWN0aW9ucyAoUl9FTlRSWSwgUl9FWElULAotICAgUl9VTldJTkRfQVVYIGFuZCBhIHZhcmlldHkgb2Ygb3RoZXJzKS4gIFRoZXJlIGlzbid0IGV2ZW4gZW5vdWdoIHJvb20KLSAgIGluIHRoZSBCRkQgcmVsb2NhdGlvbiBkYXRhIHN0cnVjdHVyZSB0byBzdG9yZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8KLSAgIHBlcmZvcm0gYWxsIHRoZSByZWxvY2F0aW9ucy4KLQotICAgRWFjaCBlbnRyeSBpbiB0aGUgdGFibGUgaGFzIHRocmVlIGZpZWxkcy4gCi0KLSAgIFRoZSBmaXJzdCBlbnRyeSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgImNsYXNzIiBvZiByZWxvY2F0aW9ucy4gIFRoaXMKLSAgIGluZGV4IGNhbiB0aGVuIGJlIHVzZWQgYXMgYSB2YXJpYWJsZSB3aXRoaW4gdGhlIHJlbG9jYXRpb24gaXRzZWxmLgotCi0gICBUaGUgc2Vjb25kIGZpZWxkIGlzIGEgZm9ybWF0IHN0cmluZyB3aGljaCBhY3R1YWxseSBjb250cm9scyBwcm9jZXNzaW5nCi0gICBvZiB0aGUgcmVsb2NhdGlvbi4gIEl0IHVzZXMgYSBzaW1wbGUgcG9zdGZpeCBtYWNoaW5lIHRvIGRvIGNhbGN1bGF0aW9ucwotICAgYmFzZWQgb24gdmFyaWFibGVzL2NvbnN0YW50cyBmb3VuZCBpbiB0aGUgc3RyaW5nIGFuZCB0aGUgcmVsb2NhdGlvbgotICAgc3RyZWFtLiAgCi0KLSAgIFRoZSB0aGlyZCBmaWVsZCBzcGVjaWZ5cyB3aGV0aGVyIG9yIG5vdCB0aGlzIHJlbG9jYXRpb24gbWF5IHVzZSAKLSAgIGEgY29uc3RhbnQgKFYpIGZyb20gdGhlIHByZXZpb3VzIFJfREFUQV9PVkVSUklERSByYXRoZXIgdGhhbiBhIGNvbnN0YW50Ci0gICBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotCi0gICBWYXJpYWJsZXM6ICAKLSAgCi0gICBMID0gaW5wdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgRCA9IGluZGV4IGludG8gY2xhc3Mgb2YgcmVsb2NhdGlvbnMKLSAgIE0gPSBvdXRwdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgTiA9IHN0YXRlbWVudCBudW1iZXIgKHVudXNlZD8pCi0gICBPID0gc3RhY2sgb3BlcmF0aW9uCi0gICBSID0gcGFyYW1ldGVyIHJlbG9jYXRpb24gYml0cwotICAgUyA9IHN5bWJvbCBpbmRleAotICAgVCA9IGZpcnN0IDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBVID0gc2Vjb25kIDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBWID0gYSBsaXRlcmFsIGNvbnN0YW50ICh1c3VhbGx5IHVzZWQgaW4gdGhlIG5leHQgcmVsb2NhdGlvbikKLSAgIFAgPSBhIHByZXZpb3VzIHJlbG9jYXRpb24KLSAgCi0gICBMb3dlciBjYXNlIGxldHRlcnMgKHN0YXJ0aW5nIHdpdGggJ2InKSByZWZlciB0byBmb2xsb3dpbmcgCi0gICBieXRlcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0uICAnYicgaXMgdGhlIG5leHQgMSBieXRlLAotICAgYyBpcyB0aGUgbmV4dCAyIGJ5dGVzLCBkIGlzIHRoZSBuZXh0IDMgYnl0ZXMsIGV0Yy4uLiAgCi0gICBUaGlzIGlzIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgdGhhdAotICAgbWFrZXMgb3VyIGxpZmUgYSBsaXZpbmcgaGVsbC4KLQotICAgbnVtZXJpY2FsIGNvbnN0YW50cyBhcmUgYWxzbyB1c2VkIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgTm90ZQotICAgdGhlIGNvbnN0YW50cyBhcmUgcmVwcmVzZW50ZWQgaW4gZGVjaW1hbC4gCi0KLSAgICcrJywgIioiIGFuZCAiPSIgcmVwcmVzZW50cyB0aGUgb2J2aW91cyBwb3N0Zml4IG9wZXJhdG9ycy4KLSAgICc8JyByZXByZXNlbnRzIGEgbGVmdCBzaGlmdC4gCi0KLSAgIFN0YWNrIE9wZXJhdGlvbnM6Ci0KLSAgIFBhcmFtZXRlciBSZWxvY2F0aW9uIEJpdHM6Ci0KLSAgIFVud2luZCBFbnRyaWVzOiAgCi0gICAKLSAgIFByZXZpb3VzIFJlbG9jYXRpb25zOiAgVGhlIGluZGV4IGZpZWxkIHJlcHJlc2VudHMgd2hpY2ggaW4gdGhlIHF1ZXVlCi0gICBvZiA0IHByZXZpb3VzIGZpeHVwcyBzaG91bGQgYmUgcmUtYXBwbGllZC4KLQotICAgTGl0ZXJhbCBDb25zdGFudHM6ICBUaGVzZSBhcmUgZ2VuZXJhbGx5IHVzZWQgdG8gcmVwcmVzZW50IGFkZGVuZAotICAgcGFydHMgb2YgcmVsb2NhdGlvbnMgd2hlbiB0aGVzZSBjb25zdGFudHMgYXJlIG5vdCBzdG9yZWQgaW4gdGhlCi0gICBmaWVsZHMgb2YgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUgdGhlIGluc3RydWN0aW9uCi0gICBhZGRpbCBmb28tJGdsb2JhbCQtMHgxMjM0IHdvdWxkIHVzZSBhbiBvdmVycmlkZSBmb3IgIjB4MTIzNCIgcmF0aGVyCi0gICB0aGFuIHN0b3JpbmcgaXQgaW50byB0aGUgYWRkaWwgaXRzZWxmLiAgKi8KLQotc3RydWN0IGZpeHVwX2Zvcm1hdAotewotICBpbnQgRDsKLSAgY2hhciAqZm9ybWF0OwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaXh1cF9mb3JtYXQgc29tX2ZpeHVwX2Zvcm1hdHNbMjU2XSA9Ci17Ci0gIC8qIFJfTk9fUkVMT0NBVElPTiAqLwotICAwLCAgICJMRDErNCo9IiwgICAgICAgLyogMHgwMCAqLwotICAxLCAgICJMRDErNCo9IiwJLyogMHgwMSAqLwotICAyLCAgICJMRDErNCo9IiwJLyogMHgwMiAqLwotICAzLCAgICJMRDErNCo9IiwJLyogMHgwMyAqLwotICA0LCAgICJMRDErNCo9IiwJLyogMHgwNCAqLwotICA1LCAgICJMRDErNCo9IiwJLyogMHgwNSAqLwotICA2LCAgICJMRDErNCo9IiwJLyogMHgwNiAqLwotICA3LCAgICJMRDErNCo9IiwJLyogMHgwNyAqLwotICA4LCAgICJMRDErNCo9IiwJLyogMHgwOCAqLwotICA5LCAgICJMRDErNCo9IiwJLyogMHgwOSAqLwotICAxMCwgICJMRDErNCo9IiwJLyogMHgwYSAqLwotICAxMSwgICJMRDErNCo9IiwJLyogMHgwYiAqLwotICAxMiwgICJMRDErNCo9IiwJLyogMHgwYyAqLwotICAxMywgICJMRDErNCo9IiwJLyogMHgwZCAqLwotICAxNCwgICJMRDErNCo9IiwJLyogMHgwZSAqLwotICAxNSwgICJMRDErNCo9IiwJLyogMHgwZiAqLwotICAxNiwgICJMRDErNCo9IiwJLyogMHgxMCAqLwotICAxNywgICJMRDErNCo9IiwJLyogMHgxMSAqLwotICAxOCwgICJMRDErNCo9IiwJLyogMHgxMiAqLwotICAxOSwgICJMRDErNCo9IiwJLyogMHgxMyAqLwotICAyMCwgICJMRDErNCo9IiwJLyogMHgxNCAqLwotICAyMSwgICJMRDErNCo9IiwJLyogMHgxNSAqLwotICAyMiwgICJMRDErNCo9IiwJLyogMHgxNiAqLwotICAyMywgICJMRDErNCo9IiwJLyogMHgxNyAqLwotICAwLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MTggKi8KLSAgMSwgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDE5ICovCi0gIDIsICAgIkxEODxiKzErNCo9IiwJLyogMHgxYSAqLwotICAzLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MWIgKi8KLSAgMCwgICAiTEQxNjxjKzErNCo9IiwJLyogMHgxYyAqLwotICAxLCAgICJMRDE2PGMrMSs0Kj0iLAkvKiAweDFkICovCi0gIDIsICAgIkxEMTY8YysxKzQqPSIsCS8qIDB4MWUgKi8KLSAgMCwgICAiTGQxKz0iLCAgICAgICAgIC8qIDB4MWYgKi8KLSAgLyogUl9aRVJPRVMgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIwICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjEgKi8KLSAgLyogUl9VTklOSVQgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIyICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjMgKi8KLSAgLyogUl9SRUxPQ0FUSU9OICovCi0gIDAsICAgICJMND0iLCAgICAgICAgICAvKiAweDI0ICovCi0gIC8qIFJfREFUQV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweDI1ICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweDI2ICovCi0gIC8qIFJfREFUQV9QTEVCRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4MjcgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4MjggKi8KLSAgLyogUl9TUEFDRV9SRUYgKi8KLSAgMCwgICAgIkw0PSIsICAgICAgICAgIC8qIDB4MjkgKi8KLSAgLyogUl9SRVBFQVRFRF9JTklUICovCi0gIDAsICAgICJMND1NYjErNCo9IiwJLyogMHgyYSAqLwotICAxLCAgICAiTGI0Kj1NYjErTCo9IiwJLyogMHgyYiAqLwotICAyLCAgICAiTGI0Kj1NZDErNCo9IiwJLyogMHgyYyAqLwotICAzLCAgICAiTGQxKz1NZTErPSIsCS8qIDB4MmQgKi8KLSAgMCwgICAJIiIsCSAgICAgICAgLyogMHgyZSAqLwotICAwLCAgIAkiIiwJICAgICAgICAvKiAweDJmICovCi0gIC8qIFJfUENSRUxfQ0FMTCAqLwotICAwLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMCAqLwotICAxLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMSAqLwotICAyLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMiAqLwotICAzLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMyAqLwotICA0LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNCAqLwotICA1LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNSAqLwotICA2LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNiAqLwotICA3LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNyAqLwotICA4LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOCAqLwotICA5LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOSAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYSAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYiAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzYyAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzZCAqLwotICAvKiBSX1NIT1JUX1BDUkVMX01PREUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHgzZSAqLwotICAvKiBSX0xPTkdfUENSRUxfTU9ERSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDNmICovCi0gIC8qIFJfQUJTX0NBTEwgKi8KLSAgMCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDAgKi8KLSAgMSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDEgKi8KLSAgMiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDIgKi8KLSAgMywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDMgKi8KLSAgNCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDQgKi8KLSAgNSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDUgKi8KLSAgNiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDYgKi8KLSAgNywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDcgKi8KLSAgOCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDggKi8KLSAgOSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDkgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGEgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGIgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGMgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGQgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZSAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZiAqLwotICAvKiBSX0RQX1JFTEFUSVZFICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDUwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDUxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDUyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDUzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDU0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDU1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDU2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDU3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDU4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDU5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDVhICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDViICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDVjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDVkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDVlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDVmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDYwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDYxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDYyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDYzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDY0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDY1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDY2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDY3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDY4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDY5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDZhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDZiICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDZjICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDZkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDZlICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDZmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweDcwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweDcxICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3MiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDczICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3NSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDc2ICovCi0gIDAsICAgICIiLCAgICAgIAkvKiAweDc3ICovCi0gIC8qIFJfRExUX1JFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHg3OCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHg3OSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLCAgICAgICAgCS8qIDB4N2EgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3YiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2QgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3ZSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdmICovCi0gIC8qIFJfQ09ERV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDgwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDgxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDgyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDgzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDg0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDg1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDg2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDg3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDg4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDg5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDhxICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDhiICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDhjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDhkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDhlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDhmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDkwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDkxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDkyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDkzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDk0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDk1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDk2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDk3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDk4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDk5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDlhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDliICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDljICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDlkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDllICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDlmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweGEwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweGExICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhMiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGEzICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhNSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE2ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTcgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhOCAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE5ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWEgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhYiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWQgKi8KLSAgLyogUl9NSUxMSV9SRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4YWUgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4YWYgKi8KLSAgLyogUl9DT0RFX1BMQUJFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHhiMCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHhiMSAqLwotICAvKiBSX0JSRUFLUE9JTlQgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhiMiAqLwotICAvKiBSX0VOVFJZICovCi0gIDAsICAgICJUZT1VZT0iLCAgICAgICAvKiAweGIzICovCi0gIDEsICAgICJVZj0iLAkgICAgICAgIC8qIDB4YjQgKi8KLSAgLyogUl9BTFRfRU5UUlkgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiNSAqLwotICAvKiBSX0VYSVQgKi8KLSAgMCwgICAgIiIsCQkvKiAweGI2ICovCi0gIC8qIFJfQkVHSU5fVFJZICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YjcgKi8KLSAgLyogUl9FTkRfVFJZICovCi0gIDAsICAgICJSMD0iLAkgICAgICAgIC8qIDB4YjggKi8KLSAgMSwgICAgIlJiNCo9IiwJLyogMHhiOSAqLwotICAyLCAgICAiUmQ0Kj0iLAkvKiAweGJhICovCi0gIC8qIFJfQkVHSU5fQlJUQUIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiYiAqLwotICAvKiBSX0VORF9CUlRBQiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGJjICovCi0gIC8qIFJfU1RBVEVNRU5UICovCi0gIDAsICAgICJOYj0iLAkgICAgICAgIC8qIDB4YmQgKi8KLSAgMSwgICAgIk5jPSIsCSAgICAgICAgLyogMHhiZSAqLwotICAyLCAgICAiTmQ9IiwJICAgICAgICAvKiAweGJmICovCi0gIC8qIFJfREFUQV9FWFBSICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YzAgKi8KLSAgLyogUl9DT0RFX0VYUFIgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhjMSAqLwotICAvKiBSX0ZTRUwgKi8KLSAgMCwgICAgIiIsCQkvKiAweGMyICovCi0gIC8qIFJfTFNFTCAqLwotICAwLCAgICAiIiwJCS8qIDB4YzMgKi8KLSAgLyogUl9SU0VMICovCi0gIDAsICAgICIiLAkJLyogMHhjNCAqLwotICAvKiBSX05fTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzUgKi8KLSAgLyogUl9TX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM2ICovCi0gIC8qIFJfRF9NT0RFICovCi0gIDAsICAgICIiLAkJLyogMHhjNyAqLwotICAvKiBSX1JfTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzggKi8KLSAgLyogUl9EQVRBX09WRVJSSURFICovCi0gIDAsICAgICJWMD0iLAkgICAgICAgIC8qIDB4YzkgKi8KLSAgMSwgICAgIlZiPSIsCSAgICAgICAgLyogMHhjYSAqLwotICAyLCAgICAiVmM9IiwJICAgICAgICAvKiAweGNiICovCi0gIDMsICAgICJWZD0iLAkgICAgICAgIC8qIDB4Y2MgKi8KLSAgNCwgICAgIlZlPSIsCSAgICAgICAgLyogMHhjZCAqLwotICAvKiBSX1RSQU5TTEFURUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhjZSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4Y2YgKi8KLSAgLyogUl9DT01QMSAqLwotICAwLCAgICAiT2I9IiwJICAgICAgICAvKiAweGQwICovCi0gIC8qIFJfQ09NUDIgKi8KLSAgMCwgICAgIk9iPVNkPSIsCS8qIDB4ZDEgKi8KLSAgLyogUl9DT01QMyAqLwotICAwLCAgICAiT2I9VmU9IiwJLyogMHhkMiAqLwotICAvKiBSX1BSRVZfRklYVVAgKi8KLSAgMCwgICAgIlAiLCAgIAkgICAgICAgIC8qIDB4ZDMgKi8KLSAgMSwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDQgKi8KLSAgMiwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDUgKi8KLSAgMywgICAgIlAiLAkgICAgICAgIC8qIDB4ZDYgKi8KLSAgLyogUl9TRUNfU1RNVCAqLwotICAwLAkiIiwJCS8qIDB4ZDcgKi8KLSAgLyogUl9OMFNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDggKi8KLSAgLyogUl9OMVNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDkgKi8KLSAgLyogUl9MSU5FVEFCICovCi0gIDAsCSIiLAkJLyogMHhkYSAqLwotICAvKiBSX0xJTkVUQUJfRVNDICovCi0gIDAsCSIiLAkJLyogMHhkYiAqLwotICAvKiBSX0xUUF9PVkVSUklERSAqLwotICAwLAkiIiwJCS8qIDB4ZGMgKi8KLSAgLyogUl9DT01NRU5UICovCi0gIDAsCSIiLAkJLyogMHhkZCAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsCSIiLAkJLyogMHhkZSAqLwotICAwLAkiIiwJCS8qIDB4ZGYgKi8KLSAgMCwJIiIsCQkvKiAweGUwICovCi0gIDAsCSIiLAkJLyogMHhlMSAqLwotICAwLAkiIiwJCS8qIDB4ZTIgKi8KLSAgMCwJIiIsCQkvKiAweGUzICovCi0gIDAsCSIiLAkJLyogMHhlNCAqLwotICAwLAkiIiwJCS8qIDB4ZTUgKi8KLSAgMCwJIiIsCQkvKiAweGU2ICovCi0gIDAsCSIiLAkJLyogMHhlNyAqLwotICAwLAkiIiwJCS8qIDB4ZTggKi8KLSAgMCwJIiIsCQkvKiAweGU5ICovCi0gIDAsCSIiLAkJLyogMHhlYSAqLwotICAwLAkiIiwJCS8qIDB4ZWIgKi8KLSAgMCwJIiIsCQkvKiAweGVjICovCi0gIDAsCSIiLAkJLyogMHhlZCAqLwotICAwLAkiIiwJCS8qIDB4ZWUgKi8KLSAgMCwJIiIsCQkvKiAweGVmICovCi0gIDAsCSIiLAkJLyogMHhmMCAqLwotICAwLAkiIiwJCS8qIDB4ZjEgKi8KLSAgMCwJIiIsCQkvKiAweGYyICovCi0gIDAsCSIiLAkJLyogMHhmMyAqLwotICAwLAkiIiwJCS8qIDB4ZjQgKi8KLSAgMCwJIiIsCQkvKiAweGY1ICovCi0gIDAsCSIiLAkJLyogMHhmNiAqLwotICAwLAkiIiwJCS8qIDB4ZjcgKi8KLSAgMCwJIiIsCQkvKiAweGY4ICovCi0gIDAsCSIiLAkJLyogMHhmOSAqLwotICAwLAkiIiwJCS8qIDB4ZmEgKi8KLSAgMCwJIiIsCQkvKiAweGZiICovCi0gIDAsCSIiLAkJLyogMHhmYyAqLwotICAwLAkiIiwJCS8qIDB4ZmQgKi8KLSAgMCwJIiIsCQkvKiAweGZlICovCi0gIDAsCSIiLAkJLyogMHhmZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMV9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDQwLAotICAweDQxLAotICAweDQyLAotICAweDQzLAotICAweDQ0LAotICAweDQ1LAotICAweDQ2LAotICAweDQ3LAotICAweDQ4LAotICAweDQ5LAotICAweDRhLAotICAweDRiLAotICAweDYwLAotICAweDgwLAotICAweGEwLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMl9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDgwLAotICAweDgyLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wM19vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDAyLAotICAtMQotfTsKLQotLyogVGhlc2UgYXBwYXJlbnRseSBhcmUgbm90IGluIG9sZGVyIHZlcnNpb25zIG9mIGhwdXggcmVsb2MuaCAoaHB1eDcpLiAgKi8KLSNpZm5kZWYgUl9ETFRfUkVMCi0jZGVmaW5lIFJfRExUX1JFTCAweDc4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0FVWF9VTldJTkQKLSNkZWZpbmUgUl9BVVhfVU5XSU5EIDB4Y2YKLSNlbmRpZgotCi0jaWZuZGVmIFJfU0VDX1NUTVQKLSNkZWZpbmUgUl9TRUNfU1RNVCAweGQ3Ci0jZW5kaWYKLQotLyogQW5kIHRoZXNlIGZpcnN0IGFwcGVhcmVkIGluIGhwdXgxMC4gICovCi0jaWZuZGVmIFJfU0hPUlRfUENSRUxfTU9ERQotI2RlZmluZSBSX1NIT1JUX1BDUkVMX01PREUgMHgzZQotI2VuZGlmCi0KLSNpZm5kZWYgUl9MT05HX1BDUkVMX01PREUKLSNkZWZpbmUgUl9MT05HX1BDUkVMX01PREUgMHgzZgotI2VuZGlmCi0KLSNpZm5kZWYgUl9OMFNFTAotI2RlZmluZSBSX04wU0VMIDB4ZDgKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjFTRUwKLSNkZWZpbmUgUl9OMVNFTCAweGQ5Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0xJTkVUQUIKLSNkZWZpbmUgUl9MSU5FVEFCIDB4ZGEKLSNlbmRpZgotCi0jaWZuZGVmIFJfTElORVRBQl9FU0MKLSNkZWZpbmUgUl9MSU5FVEFCX0VTQyAweGRiCi0jZW5kaWYKLQotI2lmbmRlZiBSX0xUUF9PVkVSUklERQotI2RlZmluZSBSX0xUUF9PVkVSUklERSAweGRjCi0jZW5kaWYKLQotI2lmbmRlZiBSX0NPTU1FTlQKLSNkZWZpbmUgUl9DT01NRU5UIDB4ZGQKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzb21faHBwYV9ob3d0b190YWJsZVtdID0KLXsKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX1pFUk9FUywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfWkVST0VTIn0sCi0gIHtSX1pFUk9FUywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfWkVST0VTIn0sCi0gIHtSX1VOSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfVU5JTklUIn0sCi0gIHtSX1VOSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfVU5JTklUIn0sCi0gIHtSX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFTE9DQVRJT04ifSwKLSAge1JfREFUQV9PTkVfU1lNQk9MLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09ORV9TWU1CT0wifSwKLSAge1JfREFUQV9PTkVfU1lNQk9MLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09ORV9TWU1CT0wifSwKLSAge1JfREFUQV9QTEFCRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfUExBQkVMIn0sCi0gIHtSX0RBVEFfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX1BMQUJFTCJ9LAotICB7Ul9TUEFDRV9SRUYsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1NQQUNFX1JFRiJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9TSE9SVF9QQ1JFTF9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TSE9SVF9QQ1JFTF9NT0RFIn0sCi0gIHtSX0xPTkdfUENSRUxfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTE9OR19QQ1JFTF9NT0RFIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfRExUX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRExUX1JFTCJ9LAotICB7Ul9ETFRfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9ETFRfUkVMIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfTUlMTElfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9NSUxMSV9SRUwifSwKLSAge1JfTUlMTElfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9NSUxMSV9SRUwifSwKLSAge1JfQ09ERV9QTEFCRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfUExBQkVMIn0sCi0gIHtSX0NPREVfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX1BMQUJFTCJ9LAotICB7Ul9CUkVBS1BPSU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9CUkVBS1BPSU5UIn0sCi0gIHtSX0VOVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTlRSWSJ9LAotICB7Ul9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5UUlkifSwKLSAge1JfQUxUX0VOVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BTFRfRU5UUlkifSwKLSAge1JfRVhJVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRVhJVCJ9LAotICB7Ul9CRUdJTl9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0JFR0lOX1RSWSJ9LAotICB7Ul9FTkRfVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfVFJZIn0sCi0gIHtSX0VORF9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VORF9UUlkifSwKLSAge1JfRU5EX1RSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX1RSWSJ9LAotICB7Ul9CRUdJTl9CUlRBQiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQkVHSU5fQlJUQUIifSwKLSAge1JfRU5EX0JSVEFCLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfQlJUQUIifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfREFUQV9FWFBSLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX0VYUFIifSwKLSAge1JfQ09ERV9FWFBSLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX0VYUFIifSwKLSAge1JfRlNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRlNFTCJ9LAotICB7Ul9MU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MU0VMIn0sCi0gIHtSX1JTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JTRUwifSwKLSAge1JfTl9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OX01PREUifSwKLSAge1JfU19NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TX01PREUifSwKLSAge1JfRF9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EX01PREUifSwKLSAge1JfUl9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SX01PREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX1RSQU5TTEFURUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1RSQU5TTEFURUQifSwKLSAge1JfQVVYX1VOV0lORCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQVVYX1VOV0lORCJ9LAotICB7Ul9DT01QMSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09NUDEifSwKLSAge1JfQ09NUDIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTVAyIn0sCi0gIHtSX0NPTVAzLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01QMyJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1BSRVZfRklYVVAsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BSRVZfRklYVVAifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1NFQ19TVE1ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TRUNfU1RNVCJ9LAotICB7Ul9OMFNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTjBTRUwifSwKLSAge1JfTjFTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX04xU0VMIn0sCi0gIHtSX0xJTkVUQUIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xJTkVUQUIifSwKLSAge1JfTElORVRBQl9FU0MsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xJTkVUQUJfRVNDIn0sCi0gIHtSX0xUUF9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTFRQX09WRVJSSURFIn0sCi0gIHtSX0NPTU1FTlQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTU1FTlQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn19OwotICAKLS8qIEluaXRpYWxpemUgdGhlIFNPTSByZWxvY2F0aW9uIHF1ZXVlLiAgQnkgZGVmaW5pdGlvbiB0aGUgcXVldWUgaG9sZHMKLSAgIHRoZSBsYXN0IGZvdXIgbXVsdGlieXRlIGZpeHVwcy4gICovCi0gIAotc3RhdGljIHZvaWQKLXNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChxdWV1ZSkKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgcXVldWVbMF0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVswXS5zaXplID0gMDsKLSAgcXVldWVbMV0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVsxXS5zaXplID0gMDsKLSAgcXVldWVbMl0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVsyXS5zaXplID0gMDsKLSAgcXVldWVbM10ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVszXS5zaXplID0gMDsKLX0KLQotLyogSW5zZXJ0IGEgbmV3IHJlbG9jYXRpb24gaW50byB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcmVsb2NfcXVldWVfaW5zZXJ0IChwLCBzaXplLCBxdWV1ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIHF1ZXVlWzNdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gIHF1ZXVlWzNdLnNpemUgPSBxdWV1ZVsyXS5zaXplOwotICBxdWV1ZVsyXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgcXVldWVbMV0ucmVsb2MgPSBxdWV1ZVswXS5yZWxvYzsKLSAgcXVldWVbMV0uc2l6ZSA9IHF1ZXVlWzBdLnNpemU7Ci0gIHF1ZXVlWzBdLnJlbG9jID0gcDsKLSAgcXVldWVbMF0uc2l6ZSA9IHNpemU7Ci19Ci0KLS8qIFdoZW4gYW4gZW50cnkgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUgaXMgcmV1c2VkLCB0aGUgZW50cnkgbW92ZXMKLSAgIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3JlbG9jX3F1ZXVlX2ZpeCAocXVldWUsIGluZGV4KQotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoaW5kZXggPT0gMSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICp0bXAxID0gcXVldWVbMF0ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG1wMiA9IHF1ZXVlWzBdLnNpemU7Ci0gICAgICBxdWV1ZVswXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICAgICAgcXVldWVbMF0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gICAgICBxdWV1ZVsxXS5yZWxvYyA9IHRtcDE7Ci0gICAgICBxdWV1ZVsxXS5zaXplID0gdG1wMjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluZGV4ID09IDIpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqdG1wMSA9IHF1ZXVlWzBdLnJlbG9jOwotICAgICAgdW5zaWduZWQgaW50IHRtcDIgPSBxdWV1ZVswXS5zaXplOwotICAgICAgcXVldWVbMF0ucmVsb2MgPSBxdWV1ZVsyXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzBdLnNpemUgPSBxdWV1ZVsyXS5zaXplOwotICAgICAgcXVldWVbMl0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzJdLnNpemUgPSBxdWV1ZVsxXS5zaXplOwotICAgICAgcXVldWVbMV0ucmVsb2MgPSB0bXAxOwotICAgICAgcXVldWVbMV0uc2l6ZSA9IHRtcDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmRleCA9PSAzKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDEgPSBxdWV1ZVswXS5yZWxvYzsKLSAgICAgIHVuc2lnbmVkIGludCB0bXAyID0gcXVldWVbMF0uc2l6ZTsKLSAgICAgIHF1ZXVlWzBdLnJlbG9jID0gcXVldWVbM10ucmVsb2M7Ci0gICAgICBxdWV1ZVswXS5zaXplID0gcXVldWVbM10uc2l6ZTsKLSAgICAgIHF1ZXVlWzNdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gICAgICBxdWV1ZVszXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgICAgIHF1ZXVlWzJdLnJlbG9jID0gcXVldWVbMV0ucmVsb2M7Ci0gICAgICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgICAgIHF1ZXVlWzFdLnJlbG9jID0gdG1wMTsKLSAgICAgIHF1ZXVlWzFdLnNpemUgPSB0bXAyOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYWJvcnQoKTsKLX0KLQotLyogU2VhcmNoIGZvciBhIHBhcnRpY3VsYXIgcmVsb2NhdGlvbiBpbiB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gICovCi0KLXN0YXRpYyBpbnQKLXNvbV9yZWxvY19xdWV1ZV9maW5kIChwLCBzaXplLCBxdWV1ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIGlmIChxdWV1ZVswXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVswXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbMF0uc2l6ZSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHF1ZXVlWzFdLnJlbG9jICYmICFtZW1jbXAgKHAsIHF1ZXVlWzFdLnJlbG9jLCBzaXplKQotICAgICAgJiYgc2l6ZSA9PSBxdWV1ZVsxXS5zaXplKQotICAgIHJldHVybiAxOwotICBpZiAocXVldWVbMl0ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbMl0ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzJdLnNpemUpCi0gICAgcmV0dXJuIDI7Ci0gIGlmIChxdWV1ZVszXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVszXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbM10uc2l6ZSkKLSAgICByZXR1cm4gMzsKLSAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi10cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIHNpemUsIHF1ZXVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpbnQgcXVldWVfaW5kZXggPSBzb21fcmVsb2NfcXVldWVfZmluZCAocCwgc2l6ZSwgcXVldWUpOwotCi0gIGlmIChxdWV1ZV9pbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICAvKiBGb3VuZCB0aGlzIGluIGEgcHJldmlvdXMgZml4dXAuICBVbmRvIHRoZSBmaXh1cCB3ZQotCSBqdXN0IGJ1aWx0IGFuZCB1c2UgUl9QUkVWX0ZJWFVQIGluc3RlYWQuICBXZSBzYXZlZCAKLQkgYSB0b3RhbCBvZiBzaXplIC0gMSBieXRlcyBpbiB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9QUkVWX0ZJWFVQICsgcXVldWVfaW5kZXgsIHApOwotICAgICAgcCArPSAxOwotICAgICAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0gICAgICBzb21fcmVsb2NfcXVldWVfZml4IChxdWV1ZSwgcXVldWVfaW5kZXgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgKHAsIHNpemUsIHF1ZXVlKTsKLSAgICAgICpzdWJzcGFjZV9yZWxvY19zaXplcCArPSBzaXplOwotICAgICAgcCArPSBzaXplOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEVtaXQgdGhlIHByb3BlciBSX05PX1JFTE9DQVRJT04gZml4dXBzIHRvIG1hcCB0aGUgbmV4dCBTS0lQCi0gICBieXRlcyB3aXRob3V0IGFueSByZWxvY2F0aW9uLiAgVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBzdWJzcGFjZQotICAgcmVsb2NhdGlvbiBzdHJlYW0gdmlhIFNVQlNQQUNFX1JFTE9DX1NJWkVfUDsgYWxzbyByZXR1cm4gdGhlIAotICAgY3VycmVudCBwb2ludGVyIGludG8gdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotc29tX3JlbG9jX3NraXAgKGFiZmQsIHNraXAsIHAsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2tpcDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgLyogVXNlIGEgNCBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeSB3aXRoIGEgbWF4aW1hbCB2YWx1ZQotICAgICB0aGVuIFJfUFJFVl9GSVhVUHMgdG8gZ2V0IHRoZSBkaWZmZXJlbmNlIGRvd24gdG8gYQotICAgICByZWFzb25hYmxlIHNpemUuICAqLwotICBpZiAoc2tpcCA+PSAweDEwMDAwMDApCi0gICAgewotICAgICAgc2tpcCAtPSAweDEwMDAwMDA7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIDMxLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgcCArIDEpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgMHhmZmZmLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgICB3aGlsZSAoc2tpcCA+PSAweDEwMDAwMDApCi0JewotCSAgc2tpcCAtPSAweDEwMDAwMDA7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfUFJFVl9GSVhVUCwgcCk7Ci0JICBwKys7Ci0JICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gMTsKLQkgIC8qIE5vIG5lZWQgdG8gYWRqdXN0IHF1ZXVlIGhlcmUgc2luY2Ugd2UgYXJlIHJlcGVhdGluZyB0aGUKLQkgICAgIG1vc3QgcmVjZW50IGZpeHVwLiAgKi8KLQl9Ci0gICAgfQotICAKLSAgLyogVGhlIGRpZmZlcmVuY2UgbXVzdCBiZSBsZXNzIHRoYW4gMHgxMDAwMDAwLiAgVXNlIG9uZSAKLSAgICAgbW9yZSBSX05PX1JFTE9DQVRJT04gZW50cnkgdG8gZ2V0IHRvIHRoZSByaWdodCBkaWZmZXJlbmNlLiAgKi8KLSAgaWYgKChza2lwICYgMykgPT0gMCAmJiBza2lwIDw9IDB4YzAwMDAgJiYgc2tpcCA+IDApCi0gICAgewotICAgICAgLyogRGlmZmVyZW5jZSBjYW4gYmUgaGFuZGxlZCBpbiBhIHNpbXBsZSBzaW5nbGUtYnl0ZQotCSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgaWYgKHNraXAgPD0gMHg2MCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIChza2lwID4+IDIpIC0gMSwgcCk7Ci0JICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gMTsKLQkgIHArKzsKLQl9Ci0gICAgICAvKiBIYW5kbGUgaXQgd2l0aCBhIHR3byBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeS4gICovCi0gICAgICBlbHNlIGlmIChza2lwIDw9IDB4MTAwMCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIDI0ICsgKCgoc2tpcCA+PiAyKSAtIDEpID4+IDgpLCBwKTsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgKHNraXAgPj4gMikgLSAxLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7Ci0JfQotICAgICAgLyogSGFuZGxlIGl0IHdpdGggYSB0aHJlZSBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeS4gICovCi0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAyOCArICgoKHNraXAgPj4gMikgLSAxKSA+PiAxNiksIHApOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgKHNraXAgPj4gMikgLSAxLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0JfQotICAgIH0KLSAgLyogVWdoLiAgUHVudCBhbmQgdXNlIGEgNCBieXRlIGVudHJ5LiAgKi8KLSAgZWxzZSBpZiAoc2tpcCA+IDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAzMSwgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIChza2lwIC0gMSkgPj4gMTYsIHAgKyAxKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHNraXAgLSAxLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgfQotICByZXR1cm4gcDsKLX0KLQotLyogRW1pdCB0aGUgcHJvcGVyIFJfREFUQV9PVkVSUklERSBmaXh1cHMgdG8gaGFuZGxlIGEgbm9uemVybyBhZGRlbmQKLSAgIGZyb20gYSBCRkQgcmVsb2NhdGlvbi4gIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3BhY2UgcmVsb2NhdGlvbgotICAgc3RyZWFtIHZpYSBTVUJTUEFDRV9SRUxPQ19TSVpFX1A7IGFsc28gcmV0dXJuIHRoZSBjdXJyZW50IHBvaW50ZXIKLSAgIGludG8gdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotc29tX3JlbG9jX2FkZGVuZCAoYWJmZCwgYWRkZW5kLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGFkZGVuZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaWYgKCh1bnNpZ25lZCkoYWRkZW5kKSArIDB4ODAgPCAweDEwMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDEsIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBhZGRlbmQsIHAgKyAxKTsKLSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDIsIHF1ZXVlKTsgCi0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQpIChhZGRlbmQpICsgMHg4MDAwIDwgMHgxMDAwMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDIsIHApOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQpIChhZGRlbmQpICsgMHg4MDAwMDAgPCAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAzLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kID4+IDE2LCBwICsgMSk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBhZGRlbmQsIHAgKyAyKTsKLSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDQsIHF1ZXVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDQsIHApOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA1LCBxdWV1ZSk7Ci0gICAgfQotICByZXR1cm4gcDsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19jYWxsIChhYmZkLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgYmZkX3JlbG9jLCBzeW1fbnVtLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBpbnQgKnN1YnNwYWNlX3JlbG9jX3NpemVwOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIGludCBzeW1fbnVtOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpbnQgYXJnX2JpdHMgPSBIUFBBX1JfQVJHX1JFTE9DIChiZmRfcmVsb2MtPmFkZGVuZCk7Ci0gIGludCBydG5fYml0cyA9IGFyZ19iaXRzICYgMHgzOwotICBpbnQgdHlwZSwgZG9uZSA9IDA7Ci0gIAotICAvKiBZb3UnbGwgbmV2ZXIgYmVsaWV2ZSBhbGwgdGhpcyBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHJlbG9jYXRpb25zCi0gICAgIGZvciBmdW5jdGlvbiBjYWxscy4gIEhhdmluZyB0byBjb21wdXRlIGFuZCBwYWNrIHRoZSBhcmd1bWVudAotICAgICByZWxvY2F0aW9uIGJpdHMgaXMgdGhlIHJlYWwgbmlnaHRtYXJlLgotICAgICAKLSAgICAgSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gaG93IHRoaXMgd29ya3MsIGp1c3QgZm9yZ2V0IGl0LiAgWW91IHJlYWxseQotICAgICBkbyBub3Qgd2FudCB0byBrbm93IGFib3V0IHRoaXMgYnJhaW5kYW1hZ2UuICAqLwotCi0gIC8qIEZpcnN0IHNlZSBpZiB0aGlzIGNhbiBiZSBkb25lIHdpdGggYSAic2ltcGxlIiByZWxvY2F0aW9uLiAgU2ltcGxlCi0gICAgIHJlbG9jYXRpb25zIGhhdmUgYSBzeW1ib2wgbnVtYmVyIDwgMHgxMDAgYW5kIGhhdmUgc2ltcGxlIGVuY29kaW5ncwotICAgICBvZiBhcmd1bWVudCByZWxvY2F0aW9ucy4gICovCi0KLSAgaWYgKHN5bV9udW0gPCAweDEwMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ19iaXRzKQotCXsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCSAgdHlwZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgODoKLQljYXNlIDEgPDwgOCB8IDE6Ci0JICB0eXBlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgMSA8PCA4IHwgMSA8PCA2OgotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMToKLQkgIHR5cGUgPSAyOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQ6Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxOgotCSAgdHlwZSA9IDM7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNCB8IDEgPDwgMjoKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNCB8IDEgPDwgMiB8IDE6Ci0JICB0eXBlID0gNDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiBOb3Qgb25lIG9mIHRoZSBlYXN5IGVuY29kaW5ncy4gIFRoaXMgd2lsbCBoYXZlIHRvIGJlCi0JICAgICBoYW5kbGVkIGJ5IHRoZSBtb3JlIGNvbXBsZXggY29kZSBiZWxvdy4gICovCi0JICB0eXBlID0gLTE7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAodHlwZSAhPSAtMSkKLQl7Ci0JICAvKiBBY2NvdW50IGZvciB0aGUgcmV0dXJuIHZhbHVlIHRvby4gICovCi0JICBpZiAocnRuX2JpdHMpCi0JICAgIHR5cGUgKz0gNTsKLQotCSAgLyogRW1pdCBhIDIgYnl0ZSByZWxvY2F0aW9uLiAgVGhlbiBzZWUgaWYgaXQgY2FuIGJlIGhhbmRsZWQKLQkgICAgIHdpdGggYSByZWxvY2F0aW9uIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgdHlwZSwgcCk7Ci0JICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDIsIHF1ZXVlKTsKLQkgIGRvbmUgPSAxOwotCX0KLSAgICB9Ci0gIAotICAvKiBJZiB0aGlzIGNvdWxkIG5vdCBiZSBoYW5kbGVkIHdpdGggYSBzaW1wbGUgcmVsb2NhdGlvbiwgdGhlbiBkbyBhIGhhcmQKLSAgICAgb25lLiAgSGFyZCByZWxvY2F0aW9ucyBvY2N1ciBpZiB0aGUgc3ltYm9sIG51bWJlciB3YXMgdG9vIGhpZ2ggb3IgaWYKLSAgICAgdGhlIGVuY29kaW5nIG9mIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBpcyB0b28gY29tcGxleC4gICovCi0gIGlmICghIGRvbmUpCi0gICAgewotICAgICAgLyogRG9uJ3QgYXNrIGFib3V0IHRoZXNlIG1hZ2ljIHNlcXVlbmNlcy4gIEkgdG9vayB0aGVtIHN0cmFpZ2h0Ci0JIGZyb20gZ2FzLTEuMzYgd2hpY2ggdG9vayB0aGVtIGZyb20gdGhlIGEub3V0IG1hbiBwYWdlLiAgKi8KLSAgICAgIHR5cGUgPSBydG5fYml0czsKLSAgICAgIGlmICgoYXJnX2JpdHMgPj4gNiAmIDB4ZikgPT0gMHhlKQotCXR5cGUgKz0gOSAqIDQwOwotICAgICAgZWxzZQotCXR5cGUgKz0gKDMgKiAoYXJnX2JpdHMgPj4gOCAmIDMpICsgKGFyZ19iaXRzID4+IDYgJiAzKSkgKiA0MDsKLSAgICAgIGlmICgoYXJnX2JpdHMgPj4gMiAmIDB4ZikgPT0gMHhlKQotCXR5cGUgKz0gOSAqIDQ7Ci0gICAgICBlbHNlCi0JdHlwZSArPSAoMyAqIChhcmdfYml0cyA+PiA0ICYgMykgKyAoYXJnX2JpdHMgPj4gMiAmIDMpKSAqIDQ7Ci0gICAgICAKLSAgICAgIC8qIE91dHB1dCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSByZWxvY2F0aW9uLiAgVGhlc2UgZGVzY3JpYmUKLQkgdGhlIGxlbmd0aCBvZiB0aGUgcmVsb2NhdGlvbiBhbmQgZW5jb2Rpbmcgc3R5bGUuICAqLwotICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMTAKLQkJICsgMiAqIChzeW1fbnVtID49IDB4MTAwKSArICh0eXBlID49IDB4MTAwKSwKLQkJIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCB0eXBlLCBwICsgMSk7Ci0gICAgICAKLSAgICAgIC8qIE5vdyBvdXRwdXQgdGhlIHN5bWJvbCBpbmRleCBhbmQgc2VlIGlmIHRoaXMgYml6YXJyZSByZWxvY2F0aW9uCi0JIGp1c3QgaGFwcGVuZWQgdG8gYmUgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotICAgICAgaWYgKHN5bV9udW0gPCAweDEwMCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAyKTsKLQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDMsIHF1ZXVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMik7Ci0JICBiZmRfcHV0XzE2IChhYmZkLCBzeW1fbnVtLCBwICsgMyk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA1LCBxdWV1ZSk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLQotLyogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgWCwgYmFzZSAyLCBjb25zaWRlcmluZyBYIHVuc2lnbmVkLiAKLSAgIEFib3J0IC0xIGlmIFggaXMgbm90IGEgcG93ZXIgb3IgdHdvIG9yIGlzIHplcm8uICAqLwotCi1zdGF0aWMgaW50Ci1sb2cyICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgaW50IGxvZyA9IDA7Ci0KLSAgLyogVGVzdCBmb3IgMCBvciBhIHBvd2VyIG9mIDIuICAqLwotICBpZiAoeCA9PSAwIHx8IHggIT0gKHggJiAteCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlICgoeCA+Pj0gMSkgIT0gMCkKLSAgICBsb2crKzsKLSAgcmV0dXJuIGxvZzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaHBwYV9zb21fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCWlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEdpdmVuIGEgZ2VuZXJpYyBIUFBBIHJlbG9jYXRpb24gdHlwZSwgdGhlIGluc3RydWN0aW9uIGZvcm1hdCwKLSAgIGFuZCBhIGZpZWxkIHNlbGVjdG9yLCByZXR1cm4gb25lIG9yIG1vcmUgYXBwcm9wcmlhdGUgU09NIHJlbG9jYXRpb25zLiAgKi8KLQotaW50ICoqCi1ocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSAoYWJmZCwgYmFzZV90eXBlLCBmb3JtYXQsIGZpZWxkLCBzeW1fZGlmZiwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBiYXNlX3R5cGU7Ci0gICAgIGludCBmb3JtYXQ7Ci0gICAgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCBmaWVsZDsKLSAgICAgaW50IHN5bV9kaWZmOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGludCAqZmluYWxfdHlwZSwgKipmaW5hbF90eXBlczsKLQotICBmaW5hbF90eXBlcyA9IChpbnQgKiopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQgKikgKiA2KTsKLSAgZmluYWxfdHlwZSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotICBpZiAoIWZpbmFsX3R5cGVzIHx8ICFmaW5hbF90eXBlKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFRoZSBmaWVsZCBzZWxlY3RvciBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIHJlbG9jYXRpb25zIHRvIGJlIAotICAgICBnZW5lcmF0ZWQuICBJdCdzIGltcG9zc2libGUgdG8ga25vdyBhdCB0aGlzIG1vbWVudCBpZiBhZGRpdGlvbmFsCi0gICAgIHJlbG9jYXRpb25zIHdpbGwgYmUgbmVlZGVkLCBzbyB3ZSBtYWtlIHRoZW0uICBUaGUgY29kZSB0byBhY3R1YWxseQotICAgICB3cml0ZSB0aGUgcmVsb2NhdGlvbi9maXh1cCBzdHJlYW0gaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nCi0gICAgIGFueSByZWR1bmRhbnQgcmVsb2NhdGlvbnMuICAqLwotICBzd2l0Y2ggKGZpZWxkKQotICAgIHsKLSAgICAgIGNhc2UgZV9mc2VsOgotICAgICAgY2FzZSBlX3BzZWw6Ci0gICAgICBjYXNlIGVfbHBzZWw6Ci0gICAgICBjYXNlIGVfcnBzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzFdID0gTlVMTDsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV90c2VsOgotICAgICAgY2FzZSBlX2x0c2VsOgotICAgICAgY2FzZSBlX3J0c2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCWlmIChmaWVsZCA9PSBlX3RzZWwpCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0ZTRUw7Ci0JZWxzZSBpZiAoZmllbGQgPT0gZV9sdHNlbCkKLQkgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX2xzc2VsOgotICAgICAgY2FzZSBlX3Jzc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfU19NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sc2VsOgotICAgICAgY2FzZSBlX3JzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OX01PREU7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX2xkc2VsOgotICAgICAgY2FzZSBlX3Jkc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfRF9NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9scnNlbDoKLSAgICAgIGNhc2UgZV9ycnNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX1JfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbnNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX04xU0VMOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9ubHNlbDoKLSAgICAgIGNhc2UgZV9ubHJzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OMFNFTDsKLQlmaW5hbF90eXBlc1sxXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMV0pCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoZmllbGQgPT0gZV9ubHNlbCkKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfTl9NT0RFOwotCWVsc2UKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfUl9NT0RFOwotCWZpbmFsX3R5cGVzWzJdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1szXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0gICAgfQotICAKLSAgc3dpdGNoIChiYXNlX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9IUFBBOgotICAgICAgLyogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgbmVlZHMgKnZlcnkqIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICAgICAgaWYgKHN5bV9kaWZmKQotCXsKLQkgIGZpbmFsX3R5cGVzWzBdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzFdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzJdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzNdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGlmICghZmluYWxfdHlwZXNbMF0gfHwgIWZpbmFsX3R5cGVzWzFdIHx8ICFmaW5hbF90eXBlc1syXSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgaWYgKGZpZWxkID09IGVfZnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9yc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JICBlbHNlIGlmIChmaWVsZCA9PSBlX2xzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfQ09NUDI7Ci0JICAqZmluYWxfdHlwZXNbMl0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzNdID0gUl9DT01QMTsKLQkgIGZpbmFsX3R5cGVzWzRdID0gZmluYWxfdHlwZTsKLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlc1s0XSA9IFJfREFUQV9FWFBSOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0NPREVfRVhQUjsKLQkgIGZpbmFsX3R5cGVzWzVdID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIFBMQUJFTHMgZ2V0IHRoZWlyIG93biByZWxvY2F0aW9uIHR5cGUuICAqLwotICAgICAgZWxzZSBpZiAoZmllbGQgPT0gZV9wc2VsCi0JICB8fCBmaWVsZCA9PSBlX2xwc2VsCi0JICB8fCBmaWVsZCA9PSBlX3Jwc2VsKQotCXsKLQkgIC8qIEEgUExBQkVMIHJlbG9jYXRpb24gdGhhdCBoYXMgYSBzaXplIG9mIDMyIGJpdHMgbXVzdAotCSAgICAgYmUgYSBSX0RBVEFfUExBQkVMLiAgQWxsIG90aGVycyBhcmUgUl9DT0RFX1BMQUJFTHMuICAqLwotCSAgaWYgKGZvcm1hdCA9PSAzMikKLQkgICAgKmZpbmFsX3R5cGUgPSBSX0RBVEFfUExBQkVMOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZSA9IFJfQ09ERV9QTEFCRUw7Ci0JfQotICAgICAgLyogUElDIHN0dWZmLiAgKi8KLSAgICAgIGVsc2UgaWYgKGZpZWxkID09IGVfdHNlbAotCSAgfHwgZmllbGQgPT0gZV9sdHNlbAotCSAgfHwgZmllbGQgPT0gZV9ydHNlbCkKLQkqZmluYWxfdHlwZSA9IFJfRExUX1JFTDsKLSAgICAgIC8qIEEgcmVsb2NhdGlvbiBpbiB0aGUgZGF0YSBzcGFjZSBpcyBhbHdheXMgYSBmdWxsIDMyYml0cy4gICovCi0gICAgICBlbHNlIGlmIChmb3JtYXQgPT0gMzIpCi0JewotCSAgKmZpbmFsX3R5cGUgPSBSX0RBVEFfT05FX1NZTUJPTDsKLQotCSAgLyogSWYgdGhlcmUncyBubyBTT00gc3ltYm9sIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQkZECi0JICAgICBzeW1ib2wsIHRoZW4gc2V0IHRoZSBzeW1ib2wgdHlwZSB0byBTVF9EQVRBLgotCi0JICAgICBPbmx5IGRvIHRoaXMgaWYgdGhlIHR5cGUgaXMgZ29pbmcgdG8gZGVmYXVsdCBsYXRlciB3aGVuCi0JICAgICB3ZSB3cml0ZSB0aGUgb2JqZWN0IGZpbGUuCi0KLQkgICAgIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSBsaW5rZXIgbmV2ZXIgZW5jb3VudGVycyBhbgotCSAgICAgUl9EQVRBX09ORV9TWU1CT0wgcmVsb2MgaW52b2x2aW5nIGFuIFNUX0NPREUgc3ltYm9sLgotCi0JICAgICBUaGlzIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0JICAgICB0YWJsZXMuCi0KLQkgICAgIE5vdGUgdGhhdCBvbmUgZGF5IHdlIG1heSBuZWVkIHRvIGFsc28gZW1pdCBCRUdJTl9CUlRBQiBhbmQKLQkgICAgIEVORF9CUlRBQiB0byBwcmV2ZW50IHRoZSBsaW5rZXIgZnJvbSBvcHRpbWl6aW5nIGF3YXkgaW5zbnMKLQkgICAgIGluIGV4Y2VwdGlvbiBoYW5kbGluZyByZWdpb25zLiAgKi8KLQkgIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotCSAgICAgICYmIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwCi0JICAgICAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JICAgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9HT1RPRkY6Ci0gICAgICAvKiBNb3JlIFBMQUJFTCBzcGVjaWFsIGNhc2VzLiAgKi8KLSAgICAgIGlmIChmaWVsZCA9PSBlX3BzZWwKLQkgIHx8IGZpZWxkID09IGVfbHBzZWwKLQkgIHx8IGZpZWxkID09IGVfcnBzZWwpCi0JKmZpbmFsX3R5cGUgPSBSX0RBVEFfUExBQkVMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSFBQQV9DT01QTEVYOgotICAgICAgLyogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgbmVlZHMgKnZlcnkqIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICAgICAgaWYgKHN5bV9kaWZmKQotCXsKLQkgIGZpbmFsX3R5cGVzWzBdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzFdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzJdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzNdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGlmICghZmluYWxfdHlwZXNbMF0gfHwgIWZpbmFsX3R5cGVzWzFdIHx8ICFmaW5hbF90eXBlc1syXSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgaWYgKGZpZWxkID09IGVfZnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9yc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JICBlbHNlIGlmIChmaWVsZCA9PSBlX2xzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfQ09NUDI7Ci0JICAqZmluYWxfdHlwZXNbMl0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzNdID0gUl9DT01QMTsKLQkgIGZpbmFsX3R5cGVzWzRdID0gZmluYWxfdHlwZTsKLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlc1s0XSA9IFJfREFUQV9FWFBSOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0NPREVfRVhQUjsKLQkgIGZpbmFsX3R5cGVzWzVdID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQlicmVhazsKLQotICAgIGNhc2UgUl9IUFBBX05PTkU6Ci0gICAgY2FzZSBSX0hQUEFfQUJTX0NBTEw6Ci0gICAgY2FzZSBSX0hQUEFfUENSRUxfQ0FMTDoKLSAgICAgIC8qIFJpZ2h0IG5vdyB3ZSBjYW4gZGVmYXVsdCBhbGwgdGhlc2UuICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gZmluYWxfdHlwZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVjdCBlbnRyeSBpbiB0aGUgUEEgU09NIHJlbG9jYXRpb24KLSAgIGhvd3RvIHRhYmxlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoKGludCkgY29kZSA8IChpbnQpIFJfTk9fUkVMT0NBVElPTiArIDI1NSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgoaW50KSBzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXS50eXBlID09IChpbnQpIGNvZGUpOwotICAgICAgcmV0dXJuICZzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXTsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIDA7Ci19Ci0KLS8qIFBlcmZvcm0gc29tZSBpbml0aWFsaXphdGlvbiBmb3IgYW4gb2JqZWN0LiAgU2F2ZSByZXN1bHRzIG9mIHRoaXMKLSAgIGluaXRpYWxpemF0aW9uIGluIHRoZSBCRkQuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zb21fb2JqZWN0X3NldHVwIChhYmZkLCBmaWxlX2hkcnAsIGF1eF9oZHJwLCBjdXJyZW50X29mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcnA7Ci0gICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmF1eF9oZHJwOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IGZvdW5kOwotCi0gIC8qIHNvbV9ta29iamVjdCB3aWxsIHNldCBiZmRfZXJyb3IgaWYgc29tX21rb2JqZWN0IGZhaWxzLiAgKi8KLSAgaWYgKHNvbV9ta29iamVjdCAoYWJmZCkgIT0gdHJ1ZSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZXQgQkZEIGZsYWdzIGJhc2VkIG9uIHdoYXQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBTT00uICAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGZpbGVfaGRycC0+c3ltYm9sX3RvdGFsKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0KLSAgc3dpdGNoIChmaWxlX2hkcnAtPmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgREVNQU5EX01BR0lDOgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gKERfUEFHRUQgfCBXUF9URVhUIHwgRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoV1BfVEVYVCB8IEVYRUNfUCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVYRUNfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gICAgICBicmVhazsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICBjYXNlIFNITF9NQUdJQzoKLSNlbmRpZgotI2lmZGVmIERMX01BR0lDCi0gICAgY2FzZSBETF9NQUdJQzoKLSNlbmRpZgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBob2xkIHRoZSBzYXZlZCBleGVjIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIG9ial9zb21fZXhlY19kYXRhIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEgKSk7Ci0gIGlmIChvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgYnJhaW5kYW1hZ2VkIE9TRjEgbGlua2VyIHN3aXRjaGVkIGV4ZWNfZmxhZ3MgYW5kIGV4ZWNfZW50cnkhCi0KLSAgICAgV2UgdXNlZCB0byBpZGVudGlmeSBPU0YxIGJpbmFyaWVzIGJhc2VkIG9uIE5FV19WRVJTSU9OX0lELCBidXQKLSAgICAgYXBwYXJlbnRseSB0aGUgbGF0ZXN0IEhQVVggbGlua2VyIGlzIHVzaW5nIE5FV19WRVJTSU9OX0lEIG5vdy4KLQotICAgICBJdCdzIGFib3V0IHRpbWUsIE9TRiBoYXMgdXNlZCB0aGUgbmV3IGlkIHNpbmNlIGF0IGxlYXN0IDE5OTI7Ci0gICAgIEhQVVggZGlkbid0IHN0YXJ0IHRpbGwgbmVhcmx5IDE5OTUhLgotICAgIAotICAgICBUaGUgbmV3IGFwcHJvYWNoIGV4YW1pbmVzIHRoZSBlbnRyeSBmaWVsZC4gIElmIGl0J3MgemVybyBvciBub3QgNAotICAgICBieXRlIGFsaWduZWQgdGhlbiBpdCdzIG5vdCBhIHByb3BlciBjb2RlIGFkZHJlc3MgYW5kIHdlIGd1ZXNzIGl0J3MKLSAgICAgcmVhbGx5IHRoZSBleGVjdXRhYmxlIGZsYWdzLiAgKi8KLSAgZm91bmQgPSAwOwotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID49IHNlY3Rpb24tPnZtYQotCSAgJiYgYXV4X2hkcnAtPmV4ZWNfZW50cnkgPCBzZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5fY29va2VkX3NpemUpCi0JZm91bmQgPSAxOwotICAgIH0KLSAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID09IDAKLSAgICAgIHx8IChhdXhfaGRycC0+ZXhlY19lbnRyeSAmIDB4MykgIT0gMAotICAgICAgfHwgISBmb3VuZCkKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZmxhZ3M7Ci0gICAgICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3MgPSBhdXhfaGRycC0+ZXhlY19lbnRyeTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZW50cnkgKyBjdXJyZW50X29mZnNldDsKLSAgICAgIG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFncyA9IGF1eF9oZHJwLT5leGVjX2ZsYWdzOwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9ocHBhLCBwYTEwKTsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF90b3RhbDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBzYXZlZCBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSB0byBOVUxMLiAgCi0gICAgIFNhdmUgaW1wb3J0YW50IG9mZnNldHMgYW5kIHNpemVzIGZyb20gdGhlIFNPTSBoZWFkZXIgaW50bwotICAgICB0aGUgQkZELiAgKi8KLSAgb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpID0gKGNoYXIgICopIE5VTEw7Ci0gIG9ial9zb21fc3ltdGFiIChhYmZkKSA9IChzb21fc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSA9IGZpbGVfaGRycC0+c3ltYm9sX3N0cmluZ3Nfc2l6ZTsKLSAgb2JqX3NvbV9zeW1fZmlsZXBvcyAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF9sb2NhdGlvbiArIGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX3N0cl9maWxlcG9zIChhYmZkKSA9IChmaWxlX2hkcnAtPnN5bWJvbF9zdHJpbmdzX2xvY2F0aW9uCi0JCQkJKyBjdXJyZW50X29mZnNldCk7Ci0gIG9ial9zb21fcmVsb2NfZmlsZXBvcyAoYWJmZCkgPSAoZmlsZV9oZHJwLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uCi0JCQkJICArIGN1cnJlbnRfb2Zmc2V0KTsKLSAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5zeXN0ZW1faWQgPSBmaWxlX2hkcnAtPnN5c3RlbV9pZDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogQ29udmVydCBhbGwgb2YgdGhlIHNwYWNlIGFuZCBzdWJzcGFjZSBpbmZvIGludG8gQkZEIHNlY3Rpb25zLiAgRWFjaCBzcGFjZQotICAgY29udGFpbnMgYSBudW1iZXIgb2Ygc3Vic3BhY2VzLCB3aGljaCBpbiB0dXJuIGRlc2NyaWJlIHRoZSBtYXBwaW5nIGJldHdlZW4KLSAgIHJlZ2lvbnMgb2YgdGhlIGV4ZWMgZmlsZSwgYW5kIHRoZSBhZGRyZXNzIHNwYWNlIHRoYXQgdGhlIHByb2dyYW0gcnVucyBpbi4KLSAgIEJGRCBzZWN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvIHNwYWNlcyB3aWxsIG92ZXJsYXAgdGhlIHNlY3Rpb25zIGZvciB0aGUKLSAgIGFzc29jaWF0ZWQgc3Vic3BhY2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNldHVwX3NlY3Rpb25zIChhYmZkLCBmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci17Ci0gIGNoYXIgKnNwYWNlX3N0cmluZ3M7Ci0gIHVuc2lnbmVkIGludCBzcGFjZV9pbmRleCwgaTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3N1YnNwYWNlcyA9IDA7Ci0gIGFzZWN0aW9uICoqc3Vic3BhY2Vfc2VjdGlvbnMsICpzZWN0aW9uOwotCi0gIC8qIEZpcnN0LCByZWFkIGluIHNwYWNlIG5hbWVzICovCi0KLSAgc3BhY2Vfc3RyaW5ncyA9IGJmZF9tYWxsb2MgKGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUpOwotICBpZiAoIXNwYWNlX3N0cmluZ3MgJiYgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19sb2NhdGlvbiwgCi0gIAkJU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9yZWFkIChzcGFjZV9zdHJpbmdzLCAxLCBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplLCBhYmZkKQotICAgICAgIT0gZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBMb29wIG92ZXIgYWxsIG9mIHRoZSBzcGFjZSBkaWN0aW9uYXJpZXMsIGJ1aWxkaW5nIHVwIHNlY3Rpb25zICovCi0gIGZvciAoc3BhY2VfaW5kZXggPSAwOyBzcGFjZV9pbmRleCA8IGZpbGVfaGRyLT5zcGFjZV90b3RhbDsgc3BhY2VfaW5kZXgrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3BhY2U7Ci0gICAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3Vic3BhY2UsIHNhdmVfc3Vic3BhY2U7Ci0gICAgICBpbnQgc3Vic3BhY2VfaW5kZXg7Ci0gICAgICBhc2VjdGlvbiAqc3BhY2VfYXNlY3Q7Ci0gICAgICBjaGFyICpuZXduYW1lOwotCi0gICAgICAvKiBSZWFkIHRoZSBzcGFjZSBkaWN0aW9uYXJ5IGVsZW1lbnQgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zcGFjZV9sb2NhdGlvbgotCQkgICAgICsgc3BhY2VfaW5kZXggKiBzaXplb2Ygc3BhY2UpLAotCQkgICAgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfcmVhZCAoJnNwYWNlLCAxLCBzaXplb2Ygc3BhY2UsIGFiZmQpICE9IHNpemVvZiBzcGFjZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogU2V0dXAgdGhlIHNwYWNlIG5hbWUgc3RyaW5nICovCi0gICAgICBzcGFjZS5uYW1lLm5fbmFtZSA9IHNwYWNlLm5hbWUubl9zdHJ4ICsgc3BhY2Vfc3RyaW5nczsKLQotICAgICAgLyogTWFrZSBhIHNlY3Rpb24gb3V0IG9mIGl0ICovCi0gICAgICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotICAgICAgaWYgKCFuZXduYW1lKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBzcGFjZS5uYW1lLm5fbmFtZSk7Ci0JCQkgICAKLSAgICAgIHNwYWNlX2FzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICAgICAgaWYgKCFzcGFjZV9hc2VjdCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgIGlmIChzcGFjZS5pc19sb2FkYWJsZSA9PSAwKQotCXNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gICAgICAvKiBTZXQgdXAgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgc3BhY2UuICAqLwotICAgICAgaWYgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc3BhY2VfYXNlY3QsIHNwYWNlLmlzX2RlZmluZWQsCi0JCQkJCSAgc3BhY2UuaXNfcHJpdmF0ZSwgc3BhY2Uuc29ydF9rZXksCi0JCQkJCSAgc3BhY2Uuc3BhY2VfbnVtYmVyKSA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSWYgdGhlIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMsIHRoZW4gd2UncmUgZG9uZS4gICovCi0gICAgICBpZiAoc3BhY2Uuc3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogTm93LCByZWFkIGluIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnN1YnNwYWNlX2xvY2F0aW9uCi0JCSAgICAgKyBzcGFjZS5zdWJzcGFjZV9pbmRleCAqIHNpemVvZiBzdWJzcGFjZSksCi0JCSAgICBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkgIT0gc2l6ZW9mIHN1YnNwYWNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgLyogU2VlayBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic3BhY2VzIGZvciBsb29wIGJlbG93ICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAoY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3Vic3BhY2VfbG9jYXRpb24KLQkJICAgICArIHNwYWNlLnN1YnNwYWNlX2luZGV4ICogc2l6ZW9mIHN1YnNwYWNlKSwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFNldHVwIHRoZSBzdGFydCBhZGRyZXNzIGFuZCBmaWxlIGxvYyBmcm9tIHRoZSBmaXJzdCBzdWJzcGFjZSByZWNvcmQgKi8KLSAgICAgIHNwYWNlX2FzZWN0LT52bWEgPSBzdWJzcGFjZS5zdWJzcGFjZV9zdGFydDsKLSAgICAgIHNwYWNlX2FzZWN0LT5maWxlcG9zID0gc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSArIGN1cnJlbnRfb2Zmc2V0OwotICAgICAgc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0gICAgICBpZiAoc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSW5pdGlhbGl6ZSBzYXZlX3N1YnNwYWNlIHNvIHdlIGNhbiByZWxpYWJseSBkZXRlcm1pbmUgaWYgdGhpcwotCSBsb29wIHBsYWNlZCBhbnkgdXNlZnVsIHZhbHVlcyBpbnRvIGl0LiAgKi8KLSAgICAgIG1lbXNldCAoJnNhdmVfc3Vic3BhY2UsIDAsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0KLSAgICAgIC8qIExvb3Agb3ZlciB0aGUgcmVzdCBvZiB0aGUgc3Vic3BhY2VzLCBidWlsZGluZyB1cCBtb3JlIHNlY3Rpb25zICovCi0gICAgICBmb3IgKHN1YnNwYWNlX2luZGV4ID0gMDsgc3Vic3BhY2VfaW5kZXggPCBzcGFjZS5zdWJzcGFjZV9xdWFudGl0eTsKLQkgICBzdWJzcGFjZV9pbmRleCsrKQotCXsKLQkgIGFzZWN0aW9uICpzdWJzcGFjZV9hc2VjdDsKLQotCSAgLyogUmVhZCBpbiB0aGUgbmV4dCBzdWJzcGFjZSAqLwotCSAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2Ygc3Vic3BhY2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBTZXR1cCB0aGUgc3Vic3BhY2UgbmFtZSBzdHJpbmcgKi8KLQkgIHN1YnNwYWNlLm5hbWUubl9uYW1lID0gc3Vic3BhY2UubmFtZS5uX3N0cnggKyBzcGFjZV9zdHJpbmdzOwotCi0JICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN1YnNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotCSAgaWYgKCFuZXduYW1lKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHN0cmNweSAobmV3bmFtZSwgc3Vic3BhY2UubmFtZS5uX25hbWUpOwotCi0JICAvKiBNYWtlIGEgc2VjdGlvbiBvdXQgb2YgdGhpcyBzdWJzcGFjZSAqLwotCSAgc3Vic3BhY2VfYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmV3bmFtZSk7Ci0JICBpZiAoIXN1YnNwYWNlX2FzZWN0KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogU3RvcmUgcHJpdmF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzdWJzcGFjZV9hc2VjdCwgc3BhY2VfYXNlY3QsCi0JCQkJCQkgc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cywKLQkJCQkJCSBzdWJzcGFjZS5zb3J0X2tleSwKLQkJCQkJCSBzdWJzcGFjZS5xdWFkcmFudCkgPT0gZmFsc2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBLZWVwIGFuIGVhc3kgbWFwcGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBhbmQgc2VjdGlvbnMuIAotCSAgICAgTm90ZSB3ZSBkbyBub3QgbmVjZXNzYXJpbHkgcmVhZCB0aGUgc3Vic3BhY2VzIGluIHRoZQotCSAgICAgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLQkgICAgIFNvIHRvIG1ha2UgdGhlIHRhcmdldCBpbmRleCBjb21lIG91dCBjb3JyZWN0bHksIHdlCi0JICAgICBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN1YnNwYWNlIGhlYWRlciBpbiB0YXJnZXQKLQkgICAgIGluZGV4LCB0aGVuIHNvcnQgdXNpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdWJzcGFjZQotCSAgICAgaGVhZGVyIGFzIHRoZSBrZXkuICBUaGVuIHdlIGNhbiBhc3NpZ24gY29ycmVjdAotCSAgICAgc3Vic3BhY2UgaW5kaWNlcy4gICovCi0JICB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIHN1YnNwYWNlX2FzZWN0LT50YXJnZXRfaW5kZXggPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN1YnNwYWNlKTsKLQotCSAgLyogU2V0IFNFQ19SRUFET05MWSBhbmQgU0VDX0NPREUvU0VDX0RBVEEgYXMgc3BlY2lmaWVkCi0JICAgICBieSB0aGUgYWNjZXNzX2NvbnRyb2xfYml0cyBpbiB0aGUgc3Vic3BhY2UgaGVhZGVyLiAgKi8KLQkgIHN3aXRjaCAoc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cyA+PiA0KQotCSAgICB7Ci0JICAgIC8qIFJlYWRvbmx5IGRhdGEuICAqLyAgCi0JICAgIGNhc2UgMHgwOgotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19SRUFET05MWTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBOb3JtYWwgZGF0YS4gICovICAKLQkgICAgY2FzZSAweDE6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19EQVRBOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIFJlYWRvbmx5IGNvZGUgYW5kIHRoZSBnYXRld2F5cy4KLQkgICAgICAgR2F0ZXdheXMgaGF2ZSBvdGhlciBhdHRyaWJ1dGVzIHdoaWNoIGRvIG5vdCBtYXAKLQkgICAgICAgaW50byBhbnl0aGluZyBCRkQga25vd3MgYWJvdXQuICAqLwotCSAgICBjYXNlIDB4MjoKLQkgICAgY2FzZSAweDQ6Ci0JICAgIGNhc2UgMHg1OgotCSAgICBjYXNlIDB4NjoKLQkgICAgY2FzZSAweDc6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIGR5bmFtaWMgKHdyaXRhYmxlKSBjb2RlLiAgKi8KLQkgICAgY2FzZSAweDM6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAKLQkgIGlmIChzdWJzcGFjZS5kdXBfY29tbW9uIHx8IHN1YnNwYWNlLmlzX2NvbW1vbikgCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgZWxzZSBpZiAoc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoID4gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLQkgIGlmIChzdWJzcGFjZS5pc19sb2FkYWJsZSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCSAgZWxzZQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLQotCSAgaWYgKHN1YnNwYWNlLmNvZGVfb25seSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCi0JICAvKiBCb3RoIGZpbGVfbG9jX2luaXRfdmFsdWUgYW5kIGluaXRpYWxpemF0aW9uX2xlbmd0aCB3aWxsCi0JICAgICBiZSB6ZXJvIGZvciBhIEJTUyBsaWtlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlID09IDAKLQkgICAgICAmJiBzdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGggPT0gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzICY9IH4oU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotCi0JICAvKiBUaGlzIHN1YnNwYWNlIGhhcyByZWxvY2F0aW9ucy4KLQkgICAgIFRoZSBmaXh1cF9yZXF1ZXN0X3F1YW50aXR5IGlzIGEgYnl0ZSBjb3VudCBmb3IgdGhlIG51bWJlciBvZgotCSAgICAgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW07IGl0IGlzIG5vdCB0aGUgYWN0dWFsIG51bWJlcgotCSAgICAgb2YgcmVsb2NhdGlvbnMgaW4gdGhlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maXh1cF9yZXF1ZXN0X3F1YW50aXR5ICE9IDApCi0JICAgIHsKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5yZWxfZmlsZXBvcyA9IHN1YnNwYWNlLmZpeHVwX3JlcXVlc3RfaW5kZXg7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2VfYXNlY3QpLT5yZWxvY19zaXplCi0JCT0gc3Vic3BhY2UuZml4dXBfcmVxdWVzdF9xdWFudGl0eTsKLQkgICAgICAvKiBXZSBjYW4gbm90IGRldGVybWluZSB0aGlzIHlldC4gIFdoZW4gd2UgcmVhZCBpbiB0aGUgCi0JCSByZWxvY2F0aW9uIHRhYmxlIHRoZSBjb3JyZWN0IHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluLiAgKi8KLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+cmVsb2NfY291bnQgPSAtMTsKLQkgICAgfQotCi0JICAvKiBVcGRhdGUgc2F2ZV9zdWJzcGFjZSBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBpZiAoc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSA+IHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSkKLQkgICAgc2F2ZV9zdWJzcGFjZSA9IHN1YnNwYWNlOwotCi0JICBzdWJzcGFjZV9hc2VjdC0+dm1hID0gc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQ7Ci0JICBzdWJzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoOwotCSAgc3Vic3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aDsKLQkgIHN1YnNwYWNlX2FzZWN0LT5maWxlcG9zID0gKHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJCQkgICAgICsgY3VycmVudF9vZmZzZXQpOwotCSAgc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0JICBpZiAoc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIGEgLm8gd2hpY2ggZGVmaW5lcyBzeW1ib2xzIGluIG90aGVyd2lzZQotICAgICAgICAgZW1wdHkgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGlmICghc2F2ZV9zdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlKQotCXsKLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAwOwotCSAgc3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNldHVwIHRoZSBzaXplcyBmb3IgdGhlIHNwYWNlIHNlY3Rpb24gYmFzZWQgdXBvbiB0aGUgaW5mbyBpbiB0aGUKLQkgICAgIGxhc3Qgc3Vic3BhY2Ugb2YgdGhlIHNwYWNlLiAgKi8KLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAoc2F2ZV9zdWJzcGFjZS5zdWJzcGFjZV9zdGFydAotCQkJCSAgICAgICAtIHNwYWNlX2FzZWN0LT52bWEKLQkJCQkgICAgICAgKyBzYXZlX3N1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aCk7Ci0JICBzcGFjZV9hc2VjdC0+X3Jhd19zaXplID0gKHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZQotCQkJCSAgICAtIHNwYWNlX2FzZWN0LT5maWxlcG9zCi0JCQkJICAgICsgc2F2ZV9zdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGgpOwotCX0KLSAgICB9Ci0gIC8qIE5vdyB0aGF0IHdlJ3ZlIHJlYWQgaW4gYWxsIHRoZSBzdWJzcGFjZSByZWNvcmRzLCB3ZSBuZWVkIHRvIGFzc2lnbgotICAgICBhIHRhcmdldCBpbmRleCB0byBlYWNoIHN1YnNwYWNlLiAgKi8KLSAgc3Vic3BhY2Vfc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHRvdGFsX3N1YnNwYWNlcwotCQkJCQkJKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldID0gc2VjdGlvbjsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIHFzb3J0IChzdWJzcGFjZV9zZWN0aW9ucywgdG90YWxfc3Vic3BhY2VzLAotCSBzaXplb2YgKGFzZWN0aW9uICopLCBjb21wYXJlX3N1YnNwYWNlcyk7Ci0gIAotICAvKiBzdWJzcGFjZV9zZWN0aW9ucyBpcyBub3cgc29ydGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc3Vic3BhY2VzCi0gICAgIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICBBc3NpZ24gYW4gaW5kZXggdG8gZWFjaCBvbmUgbm93LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3N1YnNwYWNlczsgaSsrKQotICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldLT50YXJnZXRfaW5kZXggPSBpOwotCi0gIGlmIChzcGFjZV9zdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2Vfc3RyaW5ncyk7Ci0KLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc3Vic3BhY2Vfc2VjdGlvbnMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3BhY2Vfc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlX3N0cmluZ3MpOwotCi0gIGlmIChzdWJzcGFjZV9zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHN1YnNwYWNlX3NlY3Rpb25zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGEgU09NIG9iamVjdCBhbmQgbWFrZSBpdCBpbnRvIGEgQkZELiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc29tX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBoZWFkZXIgZmlsZV9oZHI7Ci0gIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgYXV4X2hkcjsKLSAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldCA9IDA7Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBzb21fZW50cnkgc29tX2VudHJ5OwotI2RlZmluZSBFTlRSWV9TSVpFIHNpemVvZihzdHJ1Y3Qgc29tX2VudHJ5KQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBmaWxlX2hkciwgMSwgRklMRV9IRFJfU0laRSwgYWJmZCkgIT0gRklMRV9IRFJfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCFfUEFfUklTQ19JRCAoZmlsZV9oZHIuc3lzdGVtX2lkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzd2l0Y2ggKGZpbGVfaGRyLmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgY2FzZSBFWEVDX01BR0lDOgotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgY2FzZSBERU1BTkRfTUFHSUM6Ci0jaWZkZWYgRExfTUFHSUMKLSAgICBjYXNlIERMX01BR0lDOgotI2VuZGlmCi0jaWZkZWYgU0hMX01BR0lDCi0gICAgY2FzZSBTSExfTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBTSEFSRURfTUFHSUNfQ05YCi0gICAgY2FzZSBTSEFSRURfTUFHSUNfQ05YOgotI2VuZGlmCi0gICAgICBicmVhazsKLQotI2lmZGVmIEVYRUNMSUJNQUdJQwotICAgIGNhc2UgRVhFQ0xJQk1BR0lDOgotICAgICAgLyogUmVhZCB0aGUgbHN0IGhlYWRlciBhbmQgZGV0ZXJtaW5lIHdoZXJlIHRoZSBTT00gZGlyZWN0b3J5IGJlZ2lucyAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9oZWFkZXIsIDEsIFNMU1RIRFIsIGFiZmQpICE9IFNMU1RIRFIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIFBvc2l0aW9uIHRvIGFuZCByZWFkIHRoZSBmaXJzdCBkaXJlY3RvcnkgZW50cnkgKi8KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfaGVhZGVyLmRpcl9sb2MsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBzb21fZW50cnksIDEsIEVOVFJZX1NJWkUsIGFiZmQpICE9IEVOVFJZX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIE5vdyBwb3NpdGlvbiB0byB0aGUgZmlyc3QgU09NICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc29tX2VudHJ5LmxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBjdXJyZW50X29mZnNldCA9IHNvbV9lbnRyeS5sb2NhdGlvbjsKLQotICAgICAgLyogQW5kIGZpbmFsbHksIHJlLXJlYWQgdGhlIHNvbSBoZWFkZXIgKi8KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGZpbGVfaGRyLCAxLCBGSUxFX0hEUl9TSVpFLCBhYmZkKSAhPSBGSUxFX0hEUl9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChmaWxlX2hkci52ZXJzaW9uX2lkICE9IFZFUlNJT05fSUQKLSAgICAgICYmIGZpbGVfaGRyLnZlcnNpb25faWQgIT0gTkVXX1ZFUlNJT05fSUQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGF1eF9oZWFkZXJfc2l6ZSBmaWVsZCBpbiB0aGUgZmlsZSBoZWFkZXIgaXMgemVybywgdGhlbiB0aGlzCi0gICAgIG9iamVjdCBpcyBhbiBpbmNvbXBsZXRlIGV4ZWN1dGFibGUgKGEgLm8gZmlsZSkuICBEbyBub3QgdHJ5IHRvIHJlYWQKLSAgICAgYSBub24tZXhpc3RhbnQgYXV4aWxpYXJ5IGhlYWRlci4gICovCi0gIG1lbXNldCAoJmF1eF9oZHIsIDAsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcikpOwotICBpZiAoZmlsZV9oZHIuYXV4X2hlYWRlcl9zaXplICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGF1eF9oZHIsIDEsIEFVWF9IRFJfU0laRSwgYWJmZCkgIT0gQVVYX0hEUl9TSVpFKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIGlmICghc2V0dXBfc2VjdGlvbnMgKGFiZmQsICZmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpKQotICAgIHsKLSAgICAgIC8qIHNldHVwX3NlY3Rpb25zIGRvZXMgbm90IGJ1YmJsZSB1cCBhIGJmZCBlcnJvciBjb2RlLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbGlkIFNPTSBvYmplY3QuICBEbyBzb21lIGluaXRpYWxpemF0aW9uLiAgKi8KLSAgcmV0dXJuIHNvbV9vYmplY3Rfc2V0dXAgKGFiZmQsICZmaWxlX2hkciwgJmF1eF9oZHIsIGN1cnJlbnRfb2Zmc2V0KTsKLX0KLQotLyogQ3JlYXRlIGEgU09NIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0gIGFiZmQtPnRkYXRhLnNvbV9kYXRhID0gKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnNvbV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5pdGlhbGl6ZSBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBmaWxlIGhlYWRlci4gIFRoaXMgcm91dGluZSBtYWtlcwotICAgbm90IGF0dGVtcHQgYXQgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGZvciBhIGZ1bGwgZXhlY3V0YWJsZTsgaXQKLSAgIGlzIG9ubHkgbWVhbnQgdG8gaGFuZGxlIHJlbG9jYXRhYmxlIG9iamVjdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3ByZXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogTWFrZSBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gIGZpbGVfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSk7Ci0gIGlmIChmaWxlX2hkciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCkgPSBmaWxlX2hkcjsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotCi0gICAgICAvKiBNYWtlIGFuZCBhdHRhY2ggYW4gZXhlYyBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gICAgICBvYmpfc29tX2V4ZWNfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICopCi0JYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKSk7Ci0gICAgICBpZiAob2JqX3NvbV9leGVjX2hkciAoYWJmZCkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBERU1BTkRfTUFHSUM7Ci0gICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBTSEFSRV9NQUdJQzsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykKLQlmaWxlX2hkci0+YV9tYWdpYyA9IFNITF9NQUdJQzsKLSNlbmRpZgotICAgICAgZWxzZQotCWZpbGVfaGRyLT5hX21hZ2ljID0gRVhFQ19NQUdJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICBmaWxlX2hkci0+YV9tYWdpYyA9IFJFTE9DX01BR0lDOwotCi0gIC8qIE9ubHkgbmV3IGZvcm1hdCBTT00gaXMgc3VwcG9ydGVkLiAgKi8KLSAgZmlsZV9oZHItPnZlcnNpb25faWQgPSBORVdfVkVSU0lPTl9JRDsKLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsLCBhbmQgZW1iZWRkaW5nIHRpbWVzdGFtcHMgaXMgbm90IGFsd2F5cwotICAgICBhIHdpc2UgdGhpbmcgdG8gZG8sIGl0IG1ha2VzIGNvbXBhcmluZyBvYmplY3RzIGR1cmluZyBhIG11bHRpLXN0YWdlCi0gICAgIGJvb3RzdHJhcCBkaWZmaWN1bHQuICAqLwotICBmaWxlX2hkci0+ZmlsZV90aW1lLnNlY3MgPSAwOwotICBmaWxlX2hkci0+ZmlsZV90aW1lLm5hbm9zZWNzID0gMDsgCi0KLSAgZmlsZV9oZHItPmVudHJ5X3NwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X3N1YnNwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X29mZnNldCA9IDA7Ci0gIGZpbGVfaGRyLT5wcmVzdW1lZF9kcCA9IDA7Ci0KLSAgLyogTm93IGl0ZXJhdGUgb3ZlciB0aGUgc2VjdGlvbnMgdHJhbnNsYXRpbmcgaW5mb3JtYXRpb24gZnJvbQotICAgICBCRkQgc2VjdGlvbnMgdG8gU09NIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIElnbm9yZSBhbnl0aGluZyB3aGljaCBoYXMgbm90IGJlZW4gbWFya2VkIGFzIGEgc3BhY2Ugb3IKLQkgc3Vic3BhY2UuICAqLwotICAgICAgaWYgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICBpZiAoc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQl7Ci0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNwYWNlIGRpY3Rpb25hcnkuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QKLQkgICAgPSAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICopCi0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKTsKLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBTZXQgc3BhY2UgYXR0cmlidXRlcy4gIE5vdGUgbW9zdCBhdHRyaWJ1dGVzIG9mIFNPTSBzcGFjZXMKLQkgICAgIGFyZSBzZXQgYmFzZWQgb24gdGhlIHN1YnNwYWNlcyBpdCBjb250YWlucy4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+bG9hZGVyX2ZpeF9pbmRleCA9IC0xOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmluaXRfcG9pbnRlcl9pbmRleCA9IC0xOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zb3J0X2tleSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19kZWZpbmVkID0gCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX2RlZmluZWQ7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfcHJpdmF0ZSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19wcml2YXRlOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnNwYWNlX251bWJlciA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNwYWNlX251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5LiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0Ci0JICAgID0gKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqKQotCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTZXQgc3Vic3BhY2UgYXR0cmlidXRlcy4gIEJhc2ljIHN0dWZmIGlzIGRvbmUgaGVyZSwgYWRkaXRpb25hbAotCSAgICAgYXR0cmlidXRlcyBhcmUgZmlsbGVkIGluIGxhdGVyIGFzIG1vcmUgaW5mb3JtYXRpb24gYmVjb21lcwotCSAgICAgYXZhaWxhYmxlLiAgKi8KLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19JU19DT01NT04pCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZHVwX2NvbW1vbiA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmlzX2NvbW1vbiA9IDE7Ci0JICAgIH0KLQotCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAxOwotCi0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmNvZGVfb25seSA9IDE7Ci0KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zdWJzcGFjZV9zdGFydCA9IAotCSAgICBzZWN0aW9uLT52bWE7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3Vic3BhY2VfbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aW5pdGlhbGl6YXRpb25fbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+YWxpZ25tZW50ID0gCi0JICAgIDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zb3J0X2tleSA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5OwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmFjY2Vzc19jb250cm9sX2JpdHMgPQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5hY2Nlc3NfY29udHJvbF9iaXRzOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnF1YWRyYW50ID0KLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+cXVhZHJhbnQ7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZWN0aW9uIGlzIGEgU09NIHNwYWNlLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2lzX3NwYWNlIChzZWN0aW9uKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgLyogSWYgbm8gY29weSBkYXRhIGlzIGF2YWlsYWJsZSwgdGhlbiBpdCdzIG5laXRoZXIgYSBzcGFjZSBub3IgYQotICAgICBzdWJzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZSBjb250YWluaW5nIHNwYWNlIGlzbid0IHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBzZWN0aW9uLAotICAgICB0aGVuIHRoaXMgaXNuJ3QgYSBzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgIT0gc2VjdGlvbgotICAgICAgJiYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb24KLQkgICE9IHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPSy4gIE11c3QgYmUgYSBzcGFjZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VjdGlvbiBpcyBhIFNPTSBzdWJzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIC8qIElmIG5vIGNvcHkgZGF0YSBpcyBhdmFpbGFibGUsIHRoZW4gaXQncyBuZWl0aGVyIGEgc3BhY2Ugbm9yIGEKLSAgICAgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGUgY29udGFpbmluZyBzcGFjZSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gc2VjdGlvbiwKLSAgICAgdGhlbiB0aGlzIGlzbid0IGEgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID09IHNlY3Rpb24KLSAgICAgIHx8IChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICA9PSBzZWN0aW9uKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT0suICBNdXN0IGJlIGEgc3Vic3BhY2UuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNwYWNlIGNvbnRhaW5pbnMgdGhlIGdpdmVuIHN1YnNwYWNlLiAgSXQKLSAgIGlzIHNhZmUgdG8gYXNzdW1lIHNwYWNlIHJlYWxseSBpcyBhIHNwYWNlLCBhbmQgc3Vic3BhY2UgcmVhbGx5Ci0gICBpcyBhIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19jb250YWluZXIgKHNwYWNlLCBzdWJzcGFjZSkKLSAgICAgYXNlY3Rpb24gKnNwYWNlLCAqc3Vic3BhY2U7Ci17Ci0gIHJldHVybiAoc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2UpLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9PSBzcGFjZQotCSAgfHwgKHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICAgICAgPT0gc3BhY2UpKTsKLX0KLQotLyogQ291bnQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHNwYWNlcyBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNvbV9jb3VudF9zcGFjZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvdW50ID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgICBjb3VudCArPSBzb21faXNfc3BhY2UgKHNlY3Rpb24pOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFjZXMgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY291bnRfc3Vic3BhY2VzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb3VudCA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIGNvdW50ICs9IHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbik7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXR1cm4gLTEsIDAsIDEgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2Ygc3ltMSBhbmQgc3ltMi4KLQotICAgV2UgZGVzaXJlIHN5bWJvbHMgdG8gYmUgb3JkZXJlZCBzdGFydGluZyB3aXRoIHRoZSBzeW1ib2wgd2l0aCB0aGUKLSAgIGhpZ2hlc3QgcmVsb2NhdGlvbiBjb3VudCBkb3duIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgbG93ZXN0IHJlbG9jYXRpb24KLSAgIGNvdW50LiAgRG9pbmcgc28gY29tcGFjdHMgdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zeW1zIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci0KLXsKLSAgYXN5bWJvbCAqKnN5bTEgPSAoYXN5bWJvbCAqKikgYXJnMTsKLSAgYXN5bWJvbCAqKnN5bTIgPSAoYXN5bWJvbCAqKikgYXJnMjsKLSAgdW5zaWduZWQgaW50IGNvdW50MSwgY291bnQyOwotICAKLSAgLyogR2V0IHJlbG9jYXRpb24gY291bnQgZm9yIGVhY2ggc3ltYm9sLiAgTm90ZSB0aGF0IHRoZSBjb3VudAotICAgICBpcyBzdG9yZWQgaW4gdGhlIHVkYXRhIHBvaW50ZXIgZm9yIHNlY3Rpb24gc3ltYm9scyEgICovCi0gIGlmICgoKnN5bTEpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDEgPSAoKnN5bTEpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQxID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMSktPnJlbG9jX2NvdW50OwotCi0gIGlmICgoKnN5bTIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDIgPSAoKnN5bTIpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQyID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMiktPnJlbG9jX2NvdW50OwotCi0gIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuICAqLwotICBpZiAoY291bnQxIDwgY291bnQyKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChjb3VudDEgPiBjb3VudDIpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIC0xLCAwLCAxIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHN1YnNwYWNlMQotICAgYW5kIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zdWJzcGFjZXMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLQotewotICBhc2VjdGlvbiAqKnN1YnNwYWNlMSA9IChhc2VjdGlvbiAqKikgYXJnMTsKLSAgYXNlY3Rpb24gKipzdWJzcGFjZTIgPSAoYXNlY3Rpb24gKiopIGFyZzI7Ci0gIHVuc2lnbmVkIGludCBjb3VudDEsIGNvdW50MjsKLSAgCi0gIGlmICgoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCA8ICgqc3Vic3BhY2UyKS0+dGFyZ2V0X2luZGV4KQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpzdWJzcGFjZTIpLT50YXJnZXRfaW5kZXggPCAoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQZXJmb3JtIHZhcmlvdXMgd29yayBpbiBwcmVwYXJhdGlvbiBmb3IgZW1pdHRpbmcgdGhlIGZpeHVwIHN0cmVhbS4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcHJlcF9mb3JfZml4dXBzIChhYmZkLCBzeW1zLCBudW1fc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1fc3ltczsKLXsKLSAgaW50IGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBhc3ltYm9sICoqc29ydGVkX3N5bXM7Ci0KLSAgLyogTW9zdCBTT00gcmVsb2NhdGlvbnMgaW52b2x2aW5nIGEgc3ltYm9sIGhhdmUgYSBsZW5ndGggd2hpY2ggaXMKLSAgICAgZGVwZW5kZW50IG9uIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sLiAgU28gc3ltYm9scyB3aGljaCBhcmUKLSAgICAgdXNlZCBvZnRlbiBpbiByZWxvY2F0aW9ucyBzaG91bGQgaGF2ZSBhIHNtYWxsIGluZGV4LiAgKi8KLQotICAvKiBGaXJzdCBpbml0aWFsaXplIHRoZSBjb3VudGVycyBmb3IgZWFjaCBzeW1ib2wuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgYSBzZWN0aW9uIHN5bWJvbDsgdGhlc2UgaGF2ZSBubyBwb2ludGVycyBiYWNrIHRvIHRoZQotCSBTT00gc3ltYm9sIGluZm8uICBTbyB3ZSBqdXN0IHVzZSB0aGUgdWRhdGEgZmllbGQgdG8gaG9sZCB0aGUKLQkgcmVsb2NhdGlvbiBjb3VudC4gICovCi0gICAgICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKSA9PSBOVUxMCi0JICB8fCBzeW1zW2ldLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQl7Ci0JICBzeW1zW2ldLT5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0JICBzeW1zW2ldLT51ZGF0YS5pID0gMDsKLQl9Ci0gICAgICBlbHNlCi0Jc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKS0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB0aGUgY291bnRlcnMgYXJlIGluaXRpYWxpemVkLCBtYWtlIGEgd2VpZ2h0ZWQgY291bnQKLSAgICAgb2YgaG93IG9mdGVuIGEgZ2l2ZW4gc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIERvZXMgdGhpcyBzZWN0aW9uIGhhdmUgYW55IHJlbG9jYXRpb25zPyAgKi8KLSAgICAgIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXYWxrIHRocm91Z2ggZWFjaCByZWxvY2F0aW9uIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZm9yIChpID0gMTsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgYXJlbGVudCAqcmVsb2MgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbltpXTsKLQkgIGludCBzY2FsZTsKLQotCSAgLyogQSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlICpBQlMqIHNlY3Rpb24gcmVhbGx5Ci0JICAgICBkb2VzIG5vdCBoYXZlIGEgc3ltYm9sLiAgTGlrZXdpc2UgaWYgdGhlIHN5bWJvbCBpc24ndCBhc3NvY2lhdGVkCi0JICAgICB3aXRoIGFueSBzZWN0aW9uLiAgKi8KLQkgIGlmIChyZWxvYy0+c3ltX3B0cl9wdHIgPT0gTlVMTAotCSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNjYWxpbmcgdG8gZW5jb3VyYWdlIHN5bWJvbHMgaW52b2x2ZWQgaW4gUl9EUF9SRUxBVElWRSAKLQkgICAgIGFuZCBSX0NPREVfT05FX1NZTUJPTCByZWxvY2F0aW9ucyB0byBjb21lIGZpcnN0LiAgVGhlc2UKLQkgICAgIHR3byByZWxvY2F0aW9ucyBoYXZlIHNpbmdsZSBieXRlIHZlcnNpb25zIGlmIHRoZSBzeW1ib2wKLQkgICAgIGluZGV4IGlzIHZlcnkgc21hbGwuICAqLwotCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0RQX1JFTEFUSVZFCi0JICAgICAgfHwgcmVsb2MtPmhvd3RvLT50eXBlID09IFJfQ09ERV9PTkVfU1lNQk9MKQotCSAgICBzY2FsZSA9IDI7Ci0JICBlbHNlCi0JICAgIHNjYWxlID0gMTsKLQotCSAgLyogSGFuZGxlIHNlY3Rpb24gc3ltYm9scyBieSBzdG9yaW5nIHRoZSBjb3VudCBpbiB0aGUgdWRhdGEKLQkgICAgIGZpZWxkLiAgSXQgd2lsbCBub3QgYmUgdXNlZCBhbmQgdGhlIGNvdW50IGlzIHZlcnkgaW1wb3J0YW50Ci0JICAgICBmb3IgdGhlc2Ugc3ltYm9scy4gICovCi0JICBpZiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgICAgewotCSAgICAgICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSA9Ci0JCSgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSArIHNjYWxlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEEgbm9ybWFsIHN5bWJvbC4gIEluY3JlbWVudCB0aGUgY291bnQuICAqLwotCSAgc29tX3N5bWJvbF9kYXRhICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+cmVsb2NfY291bnQgKz0gc2NhbGU7Ci0JfQotICAgIH0KLQotICAvKiBTb3J0IGEgY29weSBvZiB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIgdGhhbiB0aGUgY2Fub25pY2FsCi0gICAgIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotICBzb3J0ZWRfc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBudW1fc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG1lbWNweSAoc29ydGVkX3N5bXMsIHN5bXMsIG51bV9zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgcXNvcnQgKHNvcnRlZF9zeW1zLCBudW1fc3ltcywgc2l6ZW9mIChhc3ltYm9sICopLCBjb21wYXJlX3N5bXMpOwotICBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKSA9IHNvcnRlZF9zeW1zOwotCi0gIC8qIENvbXB1dGUgdGhlIHN5bWJvbCBpbmRleGVzLCB0aGV5IHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSByZWxvY2F0aW9uCi0gICAgIGNvZGUuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBBIHNlY3Rpb24gc3ltYm9sLiAgQWdhaW4sIHRoZXJlIGlzIG5vIHBvaW50ZXIgdG8gYmFja2VuZCBzeW1ib2wKLQkgaW5mb3JtYXRpb24sIHNvIHdlIHJldXNlIHRoZSB1ZGF0YSBmaWVsZCBhZ2Fpbi4gICovCi0gICAgICBpZiAoc29ydGVkX3N5bXNbaV0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCXNvcnRlZF9zeW1zW2ldLT51ZGF0YS5pID0gaTsKLSAgICAgIGVsc2UKLSAgICAgICAgc29tX3N5bWJvbF9kYXRhIChzb3J0ZWRfc3ltc1tpXSktPmluZGV4ID0gaTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfZml4dXBzIChhYmZkLCBjdXJyZW50X29mZnNldCwgdG90YWxfcmVsb2Nfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9yZWxvY19zaXplcDsKLXsKLSAgdW5zaWduZWQgaW50IGksIGo7Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgdG90YWxfcmVsb2Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBzdWJzcGFjZV9yZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IG51bV9zcGFjZXMgPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfdG90YWw7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogQWxsIHRoZSBmaXh1cHMgZm9yIGEgcGFydGljdWxhciBzdWJzcGFjZSBhcmUgZW1pdHRlZCBpbiBhIHNpbmdsZQotICAgICBzdHJlYW0uICBBbGwgdGhlIHN1YnNwYWNlcyBmb3IgYSBwYXJ0aWN1bGFyIHNwYWNlIGFyZSBlbWl0dGVkCi0gICAgIGFzIGEgc2luZ2xlIHN0cmVhbS4KLQotICAgICBTbywgdG8gZ2V0IGFsbCB0aGUgbG9jYXRpb25zIGNvcnJlY3Qgb25lIG11c3QgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUKLSAgICAgc3BhY2VzLCBmb3IgZWFjaCBzcGFjZSBpdGVyYXRlIHRocm91Z2ggaXRzIHN1YnNwYWNlcyBhbmQgb3V0cHV0IGEKLSAgICAgZml4dXBzIHN0cmVhbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpbnQgcmVsb2Nfb2Zmc2V0LCBjdXJyZW50X3JvdW5kaW5nX21vZGU7Ci0KLQkgIC8qIEZpbmQgYSBzdWJzcGFjZSBvZiB0aGlzIHNwYWNlLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgc3Vic3BhY2UgZG9lcyBub3QgaGF2ZSByZWFsIGRhdGEsIHRoZW4gd2UgYXJlCi0JICAgICBmaW5pc2VkIHdpdGggaXQuICAqLwotCSAgaWYgKChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9pbmRleAotCQk9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFRoaXMgc3Vic3BhY2UgaGFzIHNvbWUgcmVsb2NhdGlvbnMuICBQdXQgdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0JICAgICBpbmRleCBpbnRvIHRoZSBzdWJzcGFjZSByZWNvcmQuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfaW5kZXgKLQkgICAgPSB0b3RhbF9yZWxvY19zaXplOwotCi0JICAvKiBUbyBtYWtlIGxpZmUgZWFzaWVyIHN0YXJ0IG92ZXIgd2l0aCBhIGNsZWFuIHNsYXRlIGZvciAKLQkgICAgIGVhY2ggc3Vic3BhY2UuICBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0KLQkgICAgIGZvciB0aGlzIHN1YnNwYWNlIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIG91dCBpdHMgZml4dXAKLQkgICAgIHN0cmVhbS4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0ICsgdG90YWxfcmVsb2Nfc2l6ZSwgU0VFS19TRVQpIDwgMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBCdWZmZXIgc3BhY2UgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuICBKdXN0IHBlcmZvcm0gc29tZQotCSAgICAgaW5pdGlhbGl6YXRpb24gaGVyZS4gICovCi0JICBwID0gdG1wX3NwYWNlOwotCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSA9IDA7Ci0JICByZWxvY19vZmZzZXQgPSAwOwotCSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLQkgIGN1cnJlbnRfcm91bmRpbmdfbW9kZSA9IFJfTl9NT0RFOwotCi0JICAvKiBUcmFuc2xhdGUgZWFjaCBCRkQgcmVsb2NhdGlvbiBpbnRvIG9uZSBvciBtb3JlIFNPTSAKLQkgICAgIHJlbG9jYXRpb25zLiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBzdWJzZWN0aW9uLT5yZWxvY19jb3VudDsgaisrKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqYmZkX3JlbG9jID0gc3Vic2VjdGlvbi0+b3JlbG9jYXRpb25bal07Ci0JICAgICAgdW5zaWduZWQgaW50IHNraXA7Ci0JICAgICAgaW50IHN5bV9udW07Ci0KLQkgICAgICAvKiBHZXQgdGhlIHN5bWJvbCBudW1iZXIuICBSZW1lbWJlciBpdCdzIHN0b3JlZCBpbiBhIAotCQkgc3BlY2lhbCBwbGFjZSBmb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KLQkgICAgICBpZiAoKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JCXN5bV9udW0gPSAoKmJmZF9yZWxvYy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pOwotCSAgICAgIGVsc2UKLQkJc3ltX251bSA9IHNvbV9zeW1ib2xfZGF0YSAoKmJmZF9yZWxvYy0+c3ltX3B0cl9wdHIpLT5pbmRleDsKLQkgICAgICAKLQkgICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGNvdXBsZSByZWxvY2F0aW9ucywKLQkJIHRoZW4gZHVtcCB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgQWxzbyByZWluaXRpYWxpemUKLQkJIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAKLQotCQkgTm8gc2luZ2xlIEJGRCByZWxvY2F0aW9uIGNvdWxkIGV2ZXIgdHJhbnNsYXRlIGludG8gbW9yZQotCQkgdGhhbiAxMDAgYnl0ZXMgb2YgU09NIHJlbG9jYXRpb25zICgyMGJ5dGVzIGlzIHByb2JhYmx5IHRoZQotCQkgdXBwZXIgbGltaXQsIGJ1dCBsZWF2ZSBsb3RzIG9mIHNwYWNlIGZvciBncm93dGgpLiAgKi8KLQkgICAgICBpZiAocCAtIHRtcF9zcGFjZSArIDEwMCA+IFNPTV9UTVBfQlVGU0laRSkKLQkJewotCQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRtcF9zcGFjZSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkJICAgICAgIT0gcCAtIHRtcF9zcGFjZSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIHAgPSB0bXBfc3BhY2U7Ci0JCSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLQkJfQotCi0JICAgICAgLyogRW1pdCBSX05PX1JFTE9DQVRJT04gZml4dXBzIHRvIG1hcCBhbnkgYnl0ZXMgd2hpY2ggd2VyZQotCQkgc2tpcHBlZC4gICovCi0JICAgICAgc2tpcCA9IGJmZF9yZWxvYy0+YWRkcmVzcyAtIHJlbG9jX29mZnNldDsKLQkgICAgICBwID0gc29tX3JlbG9jX3NraXAgKGFiZmQsIHNraXAsIHAsCi0JCQkJICAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JICAgICAgLyogVXBkYXRlIHJlbG9jX29mZnNldCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgotCi0JCSBNYW55IHJlbG9jYXRpb25zIGRvIG5vdCBjb25zdW1lIGlucHV0IGJ5dGVzLiAgVGhleQotCQkgYXJlIG1hcmtlcnMsIG9yIHNldCBzdGF0ZSBuZWNlc3NhcnkgdG8gcGVyZm9ybSBzb21lCi0JCSBsYXRlciByZWxvY2F0aW9uLiAgKi8KLQkgICAgICBzd2l0Y2ggKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUpCi0JCXsKLQkJY2FzZSBSX0VOVFJZOgotCQljYXNlIFJfQUxUX0VOVFJZOgotCQljYXNlIFJfRVhJVDoKLQkJY2FzZSBSX05fTU9ERToKLQkJY2FzZSBSX1NfTU9ERToKLQkJY2FzZSBSX0RfTU9ERToKLQkJY2FzZSBSX1JfTU9ERToKLQkJY2FzZSBSX0ZTRUw6Ci0JCWNhc2UgUl9MU0VMOgotCQljYXNlIFJfUlNFTDoKLQkJY2FzZSBSX0NPTVAxOgotCQljYXNlIFJfQ09NUDI6Ci0JCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQkJY2FzZSBSX0VORF9CUlRBQjoKLQkJY2FzZSBSX0JFR0lOX1RSWToKLQkJY2FzZSBSX0VORF9UUlk6Ci0JCWNhc2UgUl9OMFNFTDoKLQkJY2FzZSBSX04xU0VMOgotCQkgIHJlbG9jX29mZnNldCA9IGJmZF9yZWxvYy0+YWRkcmVzczsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIHJlbG9jX29mZnNldCA9IGJmZF9yZWxvYy0+YWRkcmVzcyArIDQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIE5vdyB0aGUgYWN0dWFsIHJlbG9jYXRpb24gd2UgY2FyZSBhYm91dC4gICovCi0JICAgICAgc3dpdGNoIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgUl9QQ1JFTF9DQUxMOgotCQljYXNlIFJfQUJTX0NBTEw6Ci0JCSAgcCA9IHNvbV9yZWxvY19jYWxsIChhYmZkLCBwLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBiZmRfcmVsb2MsIHN5bV9udW0sIHJlbG9jX3F1ZXVlKTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfQ09ERV9PTkVfU1lNQk9MOgotCQljYXNlIFJfRFBfUkVMQVRJVkU6Ci0JCSAgLyogQWNjb3VudCBmb3IgYW55IGFkZGVuZC4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+YWRkZW5kKQotCQkgICAgcCA9IHNvbV9yZWxvY19hZGRlbmQgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kLCBwLCAKLQkJCQkJICAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JCSAgaWYgKHN5bV9udW0gPCAweDIwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgKyBzeW1fbnVtLCBwKTsKLQkJICAgICAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgICAgICBwICs9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgKyAzMiwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSwgcCArIDEpOwotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLCBwLAotCQkJCQkgIDIsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzeW1fbnVtIDwgMHgxMDAwMDAwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMzMsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDIpOyAKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0RBVEFfT05FX1NZTUJPTDoKLQkJY2FzZSBSX0RBVEFfUExBQkVMOgotCQljYXNlIFJfQ09ERV9QTEFCRUw6Ci0JCWNhc2UgUl9ETFRfUkVMOgotCQkgIC8qIEFjY291bnQgZm9yIGFueSBhZGRlbmQgdXNpbmcgUl9EQVRBX09WRVJSSURFLiAgKi8KLQkJICBpZiAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSAhPSBSX0RBVEFfT05FX1NZTUJPTAotCQkgICAgICAmJiBiZmRfcmVsb2MtPmFkZGVuZCkKLQkJICAgIHAgPSBzb21fcmVsb2NfYWRkZW5kIChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCwgcCwgCi0JCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCQkgIGlmIChzeW1fbnVtIDwgMHgxMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSwgcCArIDEpOwotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLCBwLAotCQkJCQkgIDIsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzeW1fbnVtIDwgMHgxMDAwMDAwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDEpOwotCQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBzeW1fbnVtLCBwICsgMik7IAotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCQkgIHAsIDQsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfRU5UUlk6Ci0JCSAgewotCQkgICAgaW50IHRtcDsKLQkJICAgIGFyZWxlbnQgKnRtcF9yZWxvYyA9IE5VTEw7Ci0JCSAgICBiZmRfcHV0XzggKGFiZmQsIFJfRU5UUlksIHApOwotCi0JCSAgICAvKiBSX0VOVFJZIHJlbG9jYXRpb25zIGhhdmUgNjQgYml0cyBvZiBhc3NvY2lhdGVkCi0JCSAgICAgICBkYXRhLiAgVW5mb3J0dW5hdGVseSB0aGUgYWRkZW5kIGZpZWxkIG9mIGEgYmZkCi0JCSAgICAgICByZWxvY2F0aW9uIGlzIG9ubHkgMzIgYml0cy4gIFNvLCB3ZSBzcGxpdCB1cAotCQkgICAgICAgdGhlIDY0Yml0IHVud2luZCBpbmZvcm1hdGlvbiBhbmQgc3RvcmUgcGFydCBpbgotCQkgICAgICAgdGhlIFJfRU5UUlkgcmVsb2NhdGlvbiwgYW5kIHRoZSByZXN0IGluIHRoZSBSX0VYSVQKLQkJICAgICAgIHJlbG9jYXRpb24uICAqLwotCQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQsIHAgKyAxKTsKLQkJCi0JCSAgICAvKiBGaW5kIHRoZSBuZXh0IFJfRVhJVCByZWxvY2F0aW9uLiAgKi8KLQkJICAgIGZvciAodG1wID0gajsgdG1wIDwgc3Vic2VjdGlvbi0+cmVsb2NfY291bnQ7IHRtcCsrKQotCQkgICAgICB7Ci0JCSAgICAgICAgdG1wX3JlbG9jID0gc3Vic2VjdGlvbi0+b3JlbG9jYXRpb25bdG1wXTsKLQkJCWlmICh0bXBfcmVsb2MtPmhvd3RvLT50eXBlID09IFJfRVhJVCkKLQkJCSAgYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgaWYgKHRtcCA9PSBzdWJzZWN0aW9uLT5yZWxvY19jb3VudCkKLQkJICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIHRtcF9yZWxvYy0+YWRkZW5kLCBwICsgNSk7Ci0JCSAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCQlwLCA5LCByZWxvY19xdWV1ZSk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCSAgCi0JCWNhc2UgUl9OX01PREU6Ci0JCWNhc2UgUl9TX01PREU6Ci0JCWNhc2UgUl9EX01PREU6Ci0JCWNhc2UgUl9SX01PREU6Ci0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHJlcXVlc3RzIHRoZSBjdXJyZW50IHJvdW5kaW5nCi0JCSAgICAgbW9kZSwgdGhlbiBpdCBpcyByZWR1bmRhbnQuICAqLwotCQkgIGlmIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlICE9IGN1cnJlbnRfcm91bmRpbmdfbW9kZSkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICAgICAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgICAgICBwICs9IDE7Ci0JCSAgICAgIGN1cnJlbnRfcm91bmRpbmdfbW9kZSA9IGJmZF9yZWxvYy0+aG93dG8tPnR5cGU7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9BTFRfRU5UUlk6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQkJY2FzZSBSX0VORF9CUlRBQjoKLQkJY2FzZSBSX0JFR0lOX1RSWToKLQkJY2FzZSBSX04wU0VMOgotCQljYXNlIFJfTjFTRUw6Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9FTkRfVFJZOgotCQkgIC8qIFRoZSBlbmQgb2YgYSBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9uLiAgVGhlIHJlbG9jJ3MKLQkJICAgICBhZGRlbmQgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0JCSAgICAgY29kZS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+YWRkZW5kID09IDApCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIGVsc2UgaWYgKGJmZF9yZWxvYy0+YWRkZW5kIDwgMTAyNCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMSk7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgMiwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMiwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgKGJmZF9yZWxvYy0+YWRkZW5kIC8gNCkgPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMik7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgICAgICAKLQkJY2FzZSBSX0NPTVAxOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDQ0LCBwICsgMSk7Ci0JCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBwLCAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPTVAyOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDgwLCBwICsgMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMik7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgcCwgNSwgcmVsb2NfcXVldWUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9DT0RFX0VYUFI6Ci0JCWNhc2UgUl9EQVRBX0VYUFI6Ci0JCSAgLyogVGhlIG9ubHkgdGltZSB3ZSBnZW5lcmF0ZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCAKLQkJICAgICBSX0NPREVfRVhQUiByZWxvY3MgaXMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgICAgIHN5bWJvbHMuICBIZW5jZSB3ZSBjYW4gY2hlYXQgaGVyZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCS8qIFB1dCBhICJSX1JFU0VSVkVEIiByZWxvY2F0aW9uIGluIHRoZSBzdHJlYW0gaWYKLQkJICAgd2UgaGl0IHNvbWV0aGluZyB3ZSBkbyBub3QgdW5kZXJzdGFuZC4gIFRoZSBsaW5rZXIKLQkJICAgd2lsbCBjb21wbGFpbiBsb3VkbHkgaWYgdGhpcyBldmVyIGhhcHBlbnMuICAqLwotCQlkZWZhdWx0OgotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgcCk7Ci0JCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgIHAgKz0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIExhc3QgQkZEIHJlbG9jYXRpb24gZm9yIGEgc3Vic3BhY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCSAgICAgTWFwIHRoZSByZXN0IG9mIHRoZSBzdWJzcGFjZSB3aXRoIFJfTk9fUkVMT0NBVElPTiBmaXh1cHMuICAqLwotCSAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKSAKLQkJCSAgICAgICAgICAgICAgLSByZWxvY19vZmZzZXQsCi0JCQkgICAgICBwLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JICAvKiBTY3JpYmJsZSBvdXQgdGhlIHJlbG9jYXRpb25zLiAgKi8KLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRtcF9zcGFjZSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkgICAgICAhPSBwIC0gdG1wX3NwYWNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBwID0gdG1wX3NwYWNlOwotCi0JICB0b3RhbF9yZWxvY19zaXplICs9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9xdWFudGl0eQotCSAgICA9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JfQotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotICAqdG90YWxfcmVsb2Nfc2l6ZXAgPSB0b3RhbF9yZWxvY19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBzdHJpbmdfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICpzdHJpbmdfc2l6ZXA7Ci17Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXYWxrIHRocm91Z2ggYWxsIHRoZSBzcGFjZXMgYW5kIHN1YnNwYWNlcyAob3JkZXIgaXMgbm90IGltcG9ydGFudCkKLSAgICAgYnVpbGRpbmcgdXAgYW5kIHdyaXRpbmcgc3RyaW5nIHRhYmxlIGVudHJpZXMgZm9yIHRoZWlyIG5hbWVzLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgLyogT25seSB3b3JrIHdpdGggc3BhY2Uvc3Vic3BhY2VzOyBhdm9pZCBhbnkgb3RoZXIgc2VjdGlvbnMKLQkgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIG1hZGUgKC50ZXh0IGZvciBleGFtcGxlKS4gICovCi0gICAgICBpZiAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikgJiYgIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lLiAgKi8KLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoc2VjdGlvbi0+bmFtZSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIG5leHQgZW50cnksIHRoZW4gZHVtcCB0aGUKLQkgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgRWFjaCBlbnRyeSB3aWxsIHRha2UgNCBieXRlcyB0bwotCSBob2xkIHRoZSBzdHJpbmcgbGVuZ3RoICsgdGhlIHN0cmluZyBpdHNlbGYgKyBudWxsIHRlcm1pbmF0b3IuICAqLwotICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JICAgICAgIT0gcCAtIHRtcF9zcGFjZSkgCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIEFsaWdubWVudCBpc3N1ZXMgYXJlIGFscmVhZHkgaGFuZGxlZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgcCArPSA0OwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgaW5kZXggaW4gdGhlIHNwYWNlL3N1YnNwYWNlIHJlY29yZHMuICAqLwotICAgICAgaWYgKHNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPm5hbWUubl9zdHJ4ID0gc3RyaW5nc19zaXplOwotICAgICAgZWxzZQotCXNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5uYW1lLm5fc3RyeCA9IHN0cmluZ3Nfc2l6ZTsKLQotICAgICAgLyogTmV4dCBjb21lcyB0aGUgc3RyaW5nIGl0c2VsZiArIGEgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KLSAgICAgIHN0cmNweSAocCwgc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgIHArKzsKLQkgIHN0cmluZ3Nfc2l6ZSsrOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uZSB3aXRoIHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmdzLiAgV3JpdGUgb3V0IGFueSBpbmZvcm1hdGlvbgotICAgICBjb250YWluZWQgaW4gYSBwYXJ0aWFsIGJsb2NrLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkgIT0gcCAtIHRtcF9zcGFjZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpzdHJpbmdfc2l6ZXAgPSBzdHJpbmdzX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgc3ltcywgbnVtX3N5bXMsIHN0cmluZ19zaXplcCwKLQkJCSAgY29tcGlsYXRpb25fdW5pdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgaW50IG51bV9zeW1zOwotICAgICB1bnNpZ25lZCBpbnQgKnN0cmluZ19zaXplcDsKLSAgICAgQ09NUFVOSVQgKmNvbXBpbGF0aW9uX3VuaXQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSAgLyogQ2h1bmsgb2YgbWVtb3J5IHRoYXQgd2UgY2FuIHVzZSBhcyBidWZmZXIgc3BhY2UsIHRoZW4gdGhyb3cKLSAgICAgYXdheS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdG1wX3NwYWNlW1NPTV9UTVBfQlVGU0laRV07Ci0gIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzX3NpemUgPSAwOwotICB1bnNpZ25lZCBjaGFyICpjb21wWzRdOwotCi0gIC8qIFRoaXMgZ2V0cyBhIGJpdCBncnVlc29tZSBiZWNhdXNlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAgVGhlCi0gICAgIHN0cmluZ3Mgd2l0aGluIHRoZSBjb21waWxhdGlvbiB1bml0IGFyZSBwYXJ0IG9mIHRoZSBzeW1ib2wKLSAgICAgc3RyaW5ncywgYnV0IGRvbid0IGhhdmUgc3ltYm9sX2RpY3Rpb25hcnkgZW50cmllcy4gIFNvLCBtYW51YWxseQotICAgICB3cml0ZSB0aGVtIGFuZCB1cGRhdGUgdGhlIGNvbXBsaWF0aW9uIHVuaXQgaGVhZGVyLiAgT24gaW5wdXQsIHRoZQotICAgICBjb21waWxhdGlvbiB1bml0IGhlYWRlciBjb250YWlucyBsb2NhbCBjb3BpZXMgb2YgdGhlIHN0cmluZ3MuCi0gICAgIE1vdmUgdGhlbSBhc2lkZS4gICovCi0gIGlmIChjb21waWxhdGlvbl91bml0KQotICAgIHsKLSAgICAgIGNvbXBbMF0gPSBjb21waWxhdGlvbl91bml0LT5uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMV0gPSBjb21waWxhdGlvbl91bml0LT5sYW5ndWFnZV9uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMl0gPSBjb21waWxhdGlvbl91bml0LT5wcm9kdWN0X2lkLm5fbmFtZTsKLSAgICAgIGNvbXBbM10gPSBjb21waWxhdGlvbl91bml0LT52ZXJzaW9uX2lkLm5fbmFtZTsKLSAgICB9Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29tcGlsYXRpb25fdW5pdCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkgIGludCBsZW5ndGggPSBzdHJsZW4gKGNvbXBbaV0pOwotCi0JICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAKLQkgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBub3cuICAqLwotCSAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkJICAhPSBwIC0gdG1wX3NwYWNlKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogUmVzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc3BhY2UuICAqLwotCSAgICAgIHAgPSB0bXBfc3BhY2U7Ci0JICAgIH0KLQotCSAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mCi0JICAgICB0aGUgc3RyaW5nLiAgVGhpcyBtdXN0IGFsd2F5cyBiZSA0IGJ5dGUgYWxpZ25lZC4gIFRoaXMgaXMKLQkgICAgIGFsc28gYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXgKLQkgICAgIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKLQkgIHN0cmluZ3Nfc2l6ZSArPSA0OwotCSAgcCArPSA0OwotCi0JICAvKiBOZXh0IGNvbWVzIHRoZSBzdHJpbmcgaXRzZWxmICsgYSBudWxsIHRlcm1pbmF0b3IuICAqLwotCSAgc3RyY3B5IChwLCBjb21wW2ldKTsKLQotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgMDoJCi0JICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+bmFtZS5uX3N0cnggPSBzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5sYW5ndWFnZV9uYW1lLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5wcm9kdWN0X2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT52ZXJzaW9uX2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgcCArPSBsZW5ndGggKyAxOwotCSAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7Ci0KLQkgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KLQkgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgICAgICBzdHJpbmdzX3NpemUrKzsKLQkgICAgICBwKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQotICAgIHsKLSAgICAgIGludCBsZW5ndGggPSBzdHJsZW4gKHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAgdGhlCi0JIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gICovCi0gICAgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQotCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIFRoaXMgbXVzdCBhbHdheXMgYmUgNCBieXRlIGFsaWduZWQuICBUaGlzIGlzIGFsc28KLQkgYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXggZmllbGQgaW4gdGhlCi0JIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIE5leHQgY29tZXMgdGhlIHN0cmluZyBpdHNlbGYgKyBhIG51bGwgdGVybWluYXRvci4gICovCi0gICAgICBzdHJjcHkgKHAsIHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICBzb21fc3ltYm9sX2RhdGEoc3ltc1tpXSktPnN0cmluZ3RhYl9vZmZzZXQgPSBzdHJpbmdzX3NpemU7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0gICAgICAgIHsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICBzdHJpbmdzX3NpemUrKzsKLQkgIHArKzsKLSAgICAgICAgfQotICAgIH0KLQotICAvKiBTY3JpYmJsZSBvdXQgYW55IHBhcnRpYWwgYmxvY2suICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKSAhPSBwIC0gdG1wX3NwYWNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc3RyaW5nX3NpemVwID0gc3RyaW5nc19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29tcHV0ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBiZSBwbGFjZWQgaW4gdGhlIFNPTSBoZWFkZXJzLCAKLSAgIHNwYWNlL3N1YnNwYWNlIGRpY3Rpb25hcmllcywgcmVsb2NhdGlvbiBzdHJlYW1zLCBldGMuICBCZWdpbgotICAgd3JpdGluZyBwYXJ0cyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNvbV9iZWdpbl93cml0aW5nIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQgPSAwOwotICBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIG51bV9zcGFjZXMsIG51bV9zdWJzcGFjZXMsIGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgdG90YWxfc3Vic3BhY2VzID0gMDsKLSAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXIgPSBOVUxMOwotCi0gIC8qIFRoZSBmaWxlIGhlYWRlciB3aWxsIGFsd2F5cyBiZSBmaXJzdCBpbiBhbiBvYmplY3QgZmlsZSwgCi0gICAgIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgaW4gcmFuZG9tIGxvY2F0aW9ucy4gIFRvIGtlZXAgdGhpbmdzCi0gICAgICJzaW1wbGUiIEJGRCB3aWxsIGxheSBvdXQgdGhlIG9iamVjdCBmaWxlIGluIHRoZSBtYW5uZXIgc3VnZ2VzdGVkCi0gICAgIGJ5IHRoZSBQUk8gQUJJIGZvciBQQS1SSVNDIFN5c3RlbXMuICAqLwotCi0gIC8qIEJlZm9yZSBhbnkgb3V0cHV0IGNhbiByZWFsbHkgYmVnaW4gb2Zmc2V0cyBmb3IgYWxsIHRoZSBtYWpvcgotICAgICBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZSBjb21wdXRlZC4gIFNvLCBzdGFydGluZwotICAgICB3aXRoIHRoZSBpbml0aWFsIGZpbGUgaGVhZGVyIGNvbXB1dGUgKGFuZCBzb21ldGltZXMgd3JpdGUpCi0gICAgIGVhY2ggcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGZpbGUgaGVhZGVyLCBpdCdzIGNvbnRlbnRzIGFyZSBub3QgY29tcGxldGUKLSAgICAgeWV0LCBzbyBpdCBjYW4gbm90IGJlIHdyaXR0ZW4gYXQgdGhpcyB0aW1lLiAgKi8KLSAgY3VycmVudF9vZmZzZXQgKz0gc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKTsgIAotCi0gIC8qIEFueSBhdXhpbGlhcnkgaGVhZGVycyB3aWxsIGZvbGxvdyB0aGUgZmlsZSBoZWFkZXIuICBSaWdodCBub3cKLSAgICAgd2Ugc3VwcG9ydCBvbmx5IHRoZSBjb3B5cmlnaHQgYW5kIHZlcnNpb24gaGVhZGVycy4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgPSAwOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotICAgICAgLyogUGFydHMgb2YgdGhlIGV4ZWMgaGVhZGVyIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyLCBzbwotCSBkZWxheSB3cml0aW5nIHRoZSBoZWFkZXIgaXRzZWxmLiAgRmlsbCBpbiB0aGUgZGVmYXVsdHMsCi0JIGFuZCB3cml0ZSBpdCBsYXRlci4gICovCi0gICAgICBjdXJyZW50X29mZnNldCArPSBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZQotCSs9IHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcik7Ci0gICAgICBleGVjX2hlYWRlciA9IG9ial9zb21fZXhlY19oZHIgKGFiZmQpOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIudHlwZSA9IEVYRUNfQVVYX0lEOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIubGVuZ3RoID0gNDA7Ci0gICAgfQotICBpZiAob2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gICovCi0gICAgICBsZW4gPSBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnVzZXJfc3RyaW5nLAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCksIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGNvcHlyaWdodCBzdHJpbmcuICAqLwotICAgICAgbGVuID0gb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+Y29weXJpZ2h0LAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTmV4dCBjb21lcyB0aGUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnM7IHdlIGhhdmUgbm8gaW5pdGlhbGl6YXRpb24KLSAgICAgcG9pbnRlcnMsIHNvIGN1cnJlbnQgb2Zmc2V0IGRvZXMgbm90IGNoYW5nZS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X3RvdGFsID0gMDsKLQotICAvKiBOZXh0IGFyZSB0aGUgc3BhY2UgcmVjb3Jkcy4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3BhY2UgcmVjb3Jkcy4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHNwYWNlcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgc3RyaW5nIHRhYmxlLAotICAgICBhbmQgdGhlIGluZGV4IGZvciBlYWNoIHNwYWNlIGludG8gdGhlIHN0cmluZyB0YWJsZSBpcyBjb21wdXRlZAotICAgICBiZWxvdy4gIFRoZXJlZm9yZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIHRoZSBzcGFjZSBoZWFkZXJzCi0gICAgIGF0IHRoaXMgdGltZS4gICovCi0gIG51bV9zcGFjZXMgPSBzb21fY291bnRfc3BhY2VzIChhYmZkKTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV90b3RhbCA9IG51bV9zcGFjZXM7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IG51bV9zcGFjZXMgKiBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0KLSAgLyogTmV4dCBhcmUgdGhlIHN1YnNwYWNlIHJlY29yZHMuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCi0KLSAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3Vic3BhY2UgcmVjb3Jkcy4KLQotICAgICBBIHZhcmlldHkgaWYgZmllbGRzIGluIHRoZSBzdWJzcGFjZSByZWNvcmQgYXJlIHN0aWxsIHVua25vd24gYXQKLSAgICAgdGhpcyB0aW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSwgZml4dXAgc3RyZWFtIGxvY2F0aW9uL3NpemUsIGV0YykuICAqLwotICBudW1fc3Vic3BhY2VzID0gc29tX2NvdW50X3N1YnNwYWNlcyAoYWJmZCk7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zdWJzcGFjZV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3Vic3BhY2VfdG90YWwgPSBudW1fc3Vic3BhY2VzOwotICBjdXJyZW50X29mZnNldCArPSBudW1fc3Vic3BhY2VzICogc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgaXMgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWVzLiAgV2Ugd2lsbAotICAgICBidWlsZCBhbmQgd3JpdGUgdGhlIHN0cmluZyB0YWJsZSBvbiB0aGUgZmx5LiAgQXQgdGhlIHNhbWUgdGltZQotICAgICB3ZSB3aWxsIGZpbGwgaW4gdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWUgaW5kZXggZmllbGRzLiAgKi8KLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsKLQotICAvKiBNYXJrIHRoZSBvZmZzZXQgb2YgdGhlIHNwYWNlL3N1YnNwYWNlIHN0cmluZyB0YWJsZSBpbiB0aGUgCi0gICAgIGZpbGUgaGVhZGVyLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHNwYWNlIHN0cmluZ3MuICAqLwotICBpZiAoc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmc3RyaW5nc19zaXplKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVjb3JkIHRvdGFsIHN0cmluZyB0YWJsZSBzaXplIGluIHRoZSBoZWFkZXIgYW5kIHVwZGF0ZSB0aGUKLSAgICAgY3VycmVudCBvZmZzZXQuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2Vfc3RyaW5nc19zaXplID0gc3RyaW5nc19zaXplOwotICBjdXJyZW50X29mZnNldCArPSBzdHJpbmdzX3NpemU7Ci0KLSAgLyogTmV4dCBpcyB0aGUgY29tcGlsYXRpb24gdW5pdC4gKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl90b3RhbCA9IDA7Ci0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKSAKLSAgICB7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfdG90YWwgPSAxOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gQ09NUFVOSVRTWjsgCi0gICAgfQotCi0gIC8qIE5vdyBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIGxvYWRhYmxlIHN1YnNwYWNlcywgdGFraW5nCi0gICAgIGNhcmUgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgc3RheXMgcHJvcGVybHkgYWxpZ25lZC4gICovCi0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotICAgICAgaW50IGZpcnN0X3N1YnNwYWNlOwotICAgICAgdW5zaWduZWQgaW50IHN1YnNwYWNlX29mZnNldCA9IDA7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMTsKLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBpbiB0aGUgc3BhY2UsIGFuZCB3ZSBhcmUKLQkgICAgIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHRoZW4gdGFrZSBjYXJlIHRvIG1ha2Ugc3VyZSBhbGwKLQkgICAgIHRoZSBhbGlnbm1lbnRzIGFyZSBjb3JyZWN0IGFuZCB1cGRhdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLQkgIGlmIChmaXJzdF9zdWJzcGFjZQotCSAgICAgICYmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkpCi0JICAgIHsKLQkgICAgICAvKiBEZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMgaGF2ZSBlYWNoIHNwYWNlIGFsaWduZWQgdG8gYQotCQkgcGFnZSBib3VuZGFyeS4gIFNoYXJhYmxlIGV4ZWN1dGFibGVzICh3cml0ZS1wcm90ZWN0ZWQKLQkJIHRleHQpIGhhdmUganVzdCB0aGUgcHJpdmF0ZSAoYWthIGRhdGEgJiBic3MpIHNwYWNlIGFsaWduZWQKLQkJIHRvIGEgcGFnZSBib3VuZGFyeS4gIFVnaC4gIE5vdCB0cnVlIGZvciBIUFVYLgotCi0JCSBUaGUgSFBVWCBrZXJuZWwgcmVxdWlyZXMgdGhlIHRleHQgdG8gYWx3YXlzIGJlIHBhZ2UgYWxpZ25lZAotCQkgd2l0aGluIHRoZSBmaWxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGV4ZWN1dGFibGUncyB0eXBlLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRF9QQUdFRCB8IERZTkFNSUMpCi0JCSAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JCSAgfHwgKChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JCSAgICAgICYmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKSkpCi0JCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0JICAgICAgLyogVXBkYXRlIHRoZSBleGVjIGhlYWRlci4gICovCi0JICAgICAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUgJiYgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPT0gMCkKLQkJewotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX3RtZW0gPSBzZWN0aW9uLT52bWE7Ci0JCSAgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPSBjdXJyZW50X29mZnNldDsKLQkJfQotCSAgICAgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBICYmIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID09IDApCi0JCXsKLQkJICBleGVjX2hlYWRlci0+ZXhlY19kbWVtID0gc2VjdGlvbi0+dm1hOwotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID0gY3VycmVudF9vZmZzZXQ7Ci0JCX0KLQotCSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgZXhhY3RseSB3aGVyZSB3ZSBhcmUgd2l0aGluIGEgcGFydGljdWxhcgotCQkgc3BhY2UuICBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGUgYnJhaW5kYW1hZ2VkIEhQVVgKLQkJIGxvYWRlciB3aWxsIGNyZWF0ZSBob2xlcyBiZXR3ZWVuIHN1YnNwYWNlcyAqYW5kKiAKLQkJIHN1YnNwYWNlIGFsaWdubWVudHMgYXJlICpOT1QqIHByZXNlcnZlZC4gIFdoYXQgYSBjcm9jay4gICovCi0JICAgICAgc3Vic3BhY2Vfb2Zmc2V0ID0gc3Vic2VjdGlvbi0+dm1hOwotCi0JICAgICAgLyogT25seSBkbyB0aGlzIGZvciB0aGUgZmlyc3Qgc3Vic3BhY2Ugd2l0aGluIGVhY2ggc3BhY2UuICAqLwotCSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgYnJhaW5kYW1hZ2VkIEhQVVggbG9hZGVyIG1heSBoYXZlIGNyZWF0ZWQgYSBob2xlCi0JCSBiZXR3ZWVuIHR3byBzdWJzcGFjZXMuICBJdCBpcyAqbm90KiBzdWZmaWNpZW50IHRvIHVzZQotCQkgdGhlIGFsaWdubWVudCBzcGVjaWZpY2F0aW9ucyB3aXRoaW4gdGhlIHN1YnNwYWNlcyB0bwotCQkgYWNjb3VudCBmb3IgdGhlc2UgaG9sZXMgLS0gSSd2ZSBydW4gaW50byBhdCBsZWFzdCBvbmUKLQkJIGNhc2Ugd2hlcmUgdGhlIGxvYWRlciBsZWZ0IG9uZSBjb2RlIHN1YnNwYWNlIHVuYWxpZ25lZAotCQkgaW4gYSBmaW5hbCBleGVjdXRhYmxlLgotCi0JCSBUbyBjb21iYXQgdGhpcyB3ZSBrZWVwIGEgY3VycmVudCBvZmZzZXQgd2l0aGluIGVhY2ggc3BhY2UsCi0JCSBhbmQgdXNlIHRoZSBzdWJzcGFjZSB2bWEgZmllbGRzIHRvIGRldGVjdCBhbmQgcHJlc2VydmUKLQkJIGhvbGVzLiAgV2hhdCBhIGNyb2NrIQotCi0JCSBwcy4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdW5sb2FkYWJsZSBzcGFjZS9zdWJzcGFjZXMuICAqLwotCSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKLQkgICAgICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7Ci0JICAgIH0KLQotCi0JICBzdWJzZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIC8qIFRoaXMgaXMgcmVhbCBkYXRhIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBmaWxlLiAgKi8KLQkgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBjb2RlICYgZGF0YS4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgJiYgc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgICAgICAmJiBzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKQotCQlleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBzdWJzZWN0aW9uLT5maWxlcG9zID0gY3VycmVudF9vZmZzZXQ7Ci0JICAgICAgY3VycmVudF9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7IAotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsKLQkgICAgfQotCSAgLyogTG9va3MgbGlrZSB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBic3Mgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCQlleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0KLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IDA7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPgotCQlpbml0aWFsaXphdGlvbl9sZW5ndGggPSAwOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogRmluYWxseSBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCi0gICAgIElmIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHN0YXJ0IHRoZSB1bmxvYWRhYmxlIHN0dWZmIG9uIGl0cwotICAgICBvd24gcGFnZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQkgIAotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCi0JICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3Vic2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdG90YWxfc3Vic3BhY2VzKys7Ci0JICAvKiBUaGlzIGlzIHJlYWwgZGF0YSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgZmlsZS4gICovCi0JICBpZiAoKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IGN1cnJlbnRfb2Zmc2V0OwotCSAgICAgIHN1YnNlY3Rpb24tPmZpbGVwb3MgPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBjdXJyZW50X29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsgCi0JICAgIH0KLQkgIC8qIExvb2tzIGxpa2UgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCi0JCT0gMDsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Ci0JCWluaXRpYWxpemF0aW9uX2xlbmd0aCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogSWYgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgdGhlbiBtYWtlIHN1cmUgdG8gc2VlayB0byBhbmQgd3JpdGUKLSAgICAgb25lIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBtYWtlIHN1cmUgYW55IG5lY2Vzc2FyeQotICAgICB6ZXJvcyBhcmUgZmlsbGVkIGluLiAgVWdoLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0IC0gMSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICIiLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9zaXplCi0gICAgPSBjdXJyZW50X29mZnNldCAtIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uOwotCi0gIC8qIExvYWRlciBmaXh1cHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYW55IHdheSBzaGFwZSBvciBmb3JtLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmxvYWRlcl9maXh1cF9sb2NhdGlvbiA9IDA7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5sb2FkZXJfZml4dXBfdG90YWwgPSAwOwotCi0gIC8qIERvbmUuICBTdG9yZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgU09NIHNvIGZhci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmFsbHksIHNjcmliYmxlIG91dCB0aGUgdmFyaW91cyBoZWFkZXJzIHRvIHRoZSBkaXNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9maW5pc2hfd3JpdGluZyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnVtX3NwYWNlcyA9IHNvbV9jb3VudF9zcGFjZXMgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGludCBpLCBudW1fc3ltcywgc3RyaW5nc19zaXplOwotICBpbnQgc3Vic3BhY2VfaW5kZXggPSAwOwotICBmaWxlX3B0ciBsb2NhdGlvbjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9yZWxvY19zaXplOwotCi0gIC8qIE5leHQgaXMgdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCi0gICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHN5bWJvbHMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIHN0cmluZyB0YWJsZSwKLSAgICAgYW5kIHRoZSBpbmRleCBmb3IgZWFjaCBzeW1ib2wgbmFtZSBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaXMgY29tcHV0ZWQKLSAgICAgYmVsb3cuICBUaGVyZWZvcmUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIGF0IHRoaXMgdGltZS4gCi0KLSAgICAgVGhlc2UgdXNlZCB0byBiZSBvdXRwdXQgYmVmb3JlIHRoZSBzdWJzcGFjZSBjb250ZW50cywgYnV0IHRoZXkKLSAgICAgd2VyZSBtb3ZlZCBoZXJlIHRvIHdvcmsgYXJvdW5kIGEgc3R1cGlkIGJ1ZyBpbiB0aGUgaHB1eCBsaW5rZXIKLSAgICAgKGZpeGVkIGluIGhwdXgxMCkuICAqLwotICBjdXJyZW50X29mZnNldCA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOyAKLQotICBudW1fc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfdG90YWwgPSBudW1fc3ltczsKLSAgY3VycmVudF9vZmZzZXQgKz0gbnVtX3N5bXMgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgYXJlIHRoZSBzeW1ib2wgc3RyaW5ncy4KLSAgICAgQWxpZ24gdGhlbSB0byBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmdzLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHN5bXMsCi0JCQkJbnVtX3N5bXMsICZzdHJpbmdzX3NpemUsCi0JCQkJb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWNvcmQgdG90YWwgc3RyaW5nIHRhYmxlIHNpemUgaW4gaGVhZGVyIGFuZCB1cGRhdGUgdGhlCi0gICAgIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9zdHJpbmdzX3NpemUgPSBzdHJpbmdzX3NpemU7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IHN0cmluZ3Nfc2l6ZTsKLQotICAvKiBEbyBwcmVwIHdvcmsgYmVmb3JlIGhhbmRsaW5nIGZpeHVwcy4gICovCi0gIHNvbV9wcmVwX2Zvcl9maXh1cHMgKGFiZmQsCi0JCSAgICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpLAotCQkgICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCi0gIC8qIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgdGhlIGZpeHVwIHN0cmVhbSB3aGljaCBzdGFydHMgb24gYQotICAgICB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsgCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgLyogV3JpdGUgdGhlIGZpeHVwcyBhbmQgdXBkYXRlIGZpZWxkcyBpbiBzdWJzcGFjZSBoZWFkZXJzIHdoaWNoCi0gICAgIHJlbGF0ZSB0byB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9maXh1cHMgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmdG90YWxfcmVsb2Nfc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlY29yZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZml4dXAgc3RyZWFtIGluIHRoZSBmaWxlIGhlYWRlci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X3RvdGFsID0gdG90YWxfcmVsb2Nfc2l6ZTsKLQotICAvKiBEb25lLiAgU3RvcmUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIFNPTS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQgKyB0b3RhbF9yZWxvY19zaXplOwotIAotICAvKiBOb3cgdGhhdCB0aGUgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGlzIGNvbXBsZXRlLCBidWlsZCBhbmQKLSAgICAgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN1YnNwYWNlcyBhcmUgd3JpdHRlbiBmaXJzdCBzbyB0aGF0IHdlIGNhbiBzZXQgdXAgaW5mb3JtYXRpb24KLSAgICAgYWJvdXQgdGhlbSBpbiB0aGVpciBjb250YWluaW5nIHNwYWNlcyBhcyB0aGUgc3Vic3BhY2UgaXMgd3JpdHRlbi4gICovCi0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4gICovCi0gIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN1YnNwYWNlX2xvY2F0aW9uOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBsb2FkYWJsZSBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZQotCSAgICAgb3Igc3Vic3BhY2UuICBPciBkb2VzIG5vdCBoYXZlIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUKLQkgICAgIGhhcyBubyByZWFsIGJpdHMgb24gdGhlIGRpc2spLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQotCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlLCB0aGVuIHNhdmUKLQkgICAgIHRoZSBpbmRleCBvZiB0aGUgc3Vic3BhY2UgaW4gaXRzIGNvbnRhaW5pbmcgc3BhY2UuICBBbHNvCi0JICAgICBzZXQgImlzX2xvYWRhYmxlIiBpbiB0aGUgY29udGFpbmluZyBzcGFjZS4gICovCi0KLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19sb2FkYWJsZSA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX2luZGV4Ci0JCT0gc3Vic3BhY2VfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhY2VzIHNlZW4gYW5kIHRoZSBudW1iZXIgb2YKLQkgICAgIHN1YnNwYWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQkgIHN1YnNwYWNlX2luZGV4Kys7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQotCSAgLyogTWFyayB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3BhY2Ugd2l0aGluIHRoZSBzdWJzcGFjZSdzCi0JICAgICBkaWN0aW9uYXJ5IHJlY29yZC4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3BhY2VfaW5kZXggPSBpOwotCSAgCi0JICAvKiBEdW1wIHRoZSBjdXJyZW50IHN1YnNwYWNlIGhlYWRlci4gICovCi0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdCwKLQkJCSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCksIDEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogTm93IHJlcGVhdCB0aGUgcHJvY2VzcyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuICAqLwotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZSBvcgotCSAgICAgc3Vic3BhY2UsIG9yIHdoaWNoIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUgaGFuZGxlZAotCSAgICAgaW4gdGhlIGxvYWRhYmxlIHNwYWNlcy9zdWJzcGFjZXMgY29kZSBhYm92ZSkuICAqLwotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSwgdGhlbiBzYXZlCi0JICAgICB0aGUgaW5kZXggb2YgdGhlIHN1YnNwYWNlIGluIGl0cyBjb250YWluaW5nIHNwYWNlLiAgQ2xlYXIKLQkgICAgICJpc19sb2FkYWJsZSIuICAqLwotCi0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5ID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAwOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9pbmRleAotCQk9IHN1YnNwYWNlX2luZGV4OwotCSAgICB9Ci0KLQkgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWNlcyBzZWVuIGFuZCB0aGUgbnVtYmVyIG9mCi0JICAgICBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudCBzcGFjZS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQkgIHN1YnNwYWNlX2luZGV4Kys7IAotCi0JICAvKiBNYXJrIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzcGFjZSB3aXRoaW4gdGhlIHN1YnNwYWNlJ3MKLQkgICAgIGRpY3Rpb25hcnkgcmVjb3JkLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zcGFjZV9pbmRleCA9IGk7Ci0JICAKLQkgIC8qIER1bXAgdGhpcyBzdWJzcGFjZSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QsCi0JCQkgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCi0gICAgfQotCi0gIC8qIEFsbCB0aGUgc3Vic3BhY2UgZGljdGlvbmRhcnkgcmVjb3JkcyBhcmUgd3JpdHRlbiwgYW5kIGFsbCB0aGUKLSAgICAgZmllbGRzIGFyZSBzZXQgdXAgaW4gdGhlIHNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4KLQotICAgICBTZWVrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBhbmQgc3RhcnQgd3JpdGluZyB0aGUgc3BhY2UKLSAgICAgZGljdGlvbmFyeSByZWNvcmRzLiAgKi8KLSAgbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfbG9jYXRpb247Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgbG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIER1bXAgaXRzIGhlYWRlciAgKi8KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LAotCQkgICAgIHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVjb3JkIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLAotCQkgICAgIENPTVBVTklUU1osIDEsIGFiZmQpICE9IENPTVBVTklUU1opCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2V0dGluZyBvZiB0aGUgc3lzdGVtX2lkIGhhcyB0byBoYXBwZW4gdmVyeSBsYXRlIG5vdyB0aGF0IGNvcHlpbmcgb2YKLSAgICAgQkZEIHByaXZhdGUgZGF0YSBoYXBwZW5zICphZnRlciogc2VjdGlvbiBjb250ZW50cyBhcmUgc2V0LiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+c3lzdGVtX2lkOwotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IHBhMjApCi0gICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MyXzA7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gcGExMSkKLSAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMTsKLSAgZWxzZQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtIGZvciB0aGUgZmlsZSBoZWFkZXIganVzdCBiZWZvcmUgd3JpdGluZwotICAgICB0aGUgaGVhZGVyIHRvIGRpc2suICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y2hlY2tzdW0gPSBzb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCk7Ci0KLSAgLyogT25seSB0aGluZyBsZWZ0IHRvIGRvIGlzIHdyaXRlIG91dCB0aGUgZmlsZSBoZWFkZXIuICBJdCBpcyBhbHdheXMKLSAgICAgYXQgbG9jYXRpb24gemVyby4gIFNlZWsgdGhlcmUgYW5kIHdyaXRlIGl0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKSwKLQkJIHNpemVvZiAoc3RydWN0IGhlYWRlciksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIHsKLSAgICAgIGxvbmcgdG1wLCBzb21fbGVuZ3RoOwotICAgICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXI7Ci0KLSAgICAgIGV4ZWNfaGVhZGVyID0gb2JqX3NvbV9leGVjX2hkciAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19mbGFncyA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFnczsKLQotICAgICAgLyogT2ggam95cy4gIFJhbSBzb21lIG9mIHRoZSBCU1MgZGF0YSBpbnRvIHRoZSBEQVRBIHNlY3Rpb24KLQkgdG8gYmUgY29tcGF0YWJsZSB3aXRoIGhvdyB0aGUgaHAgbGlua2VyIG1ha2VzIG9iamVjdHMKLQkgKHNhdmVzIG1lbW9yeSBzcGFjZSkuICAqLwotICAgICAgdG1wID0gZXhlY19oZWFkZXItPmV4ZWNfZHNpemU7Ci0gICAgICB0bXAgPSBTT01fQUxJR04gKHRtcCwgUEFfUEFHRVNJWkUpOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgLT0gKHRtcCAtIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplKTsKLSAgICAgIGlmIChleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSA8IDApCi0JZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgPSAwOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPSB0bXA7Ci0KLSAgICAgIC8qIE5vdyBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gIFRoZSBpZGVhIGlzIHRvIGNhdGNoIGJvZ29ucyBub3cgYW5kCi0JIGluZm9ybSB0aGUgdXNlciwgaW5zdGVhZCBvZiBzaWxlbnRseSBnZW5lcmF0aW5nIGEgYm9ndXMgZmlsZS4gICovCi0gICAgICBzb21fbGVuZ3RoID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNvbV9sZW5ndGg7Ci0gICAgICBpZiAoZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgKyBleGVjX2hlYWRlci0+ZXhlY190c2l6ZSA+IHNvbV9sZW5ndGgKLQkgIHx8IGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlICsgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPiBzb21fbGVuZ3RoKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9sb2NhdGlvbiwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBleGVjX2hlYWRlciwgQVVYX0hEUl9TSVpFLCAxLCBhYmZkKQotCSAgIT0gQVVYX0hEUl9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGNoZWNrc3VtIGZvciBhIFNPTSBmaWxlIGhlYWRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIGNoZWNrc3VtLCBjb3VudCwgaTsKLSAgdW5zaWduZWQgbG9uZyAqYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcgKikgb2JqX3NvbV9maWxlX2hkciAoYWJmZCk7Ci0KLSAgY2hlY2tzdW0gPSAwOwotICBjb3VudCA9IHNpemVvZiAoc3RydWN0IGhlYWRlcikgLyBzaXplb2YgKHVuc2lnbmVkIGxvbmcpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICBjaGVja3N1bSBePSAqKGJ1ZmZlciArIGkpOwotCi0gIHJldHVybiBjaGVja3N1bTsKLX0KLQotc3RhdGljIHZvaWQKLXNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGFiZmQsIHN5bSwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyAqaW5mbzsKLXsKLSAgLyogSW5pdGlhbGl6ZS4gICovCi0gIG1lbXNldCAoaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pKTsKLQotICAvKiBUaGUgSFAgU09NIGxpbmtlciByZXF1aXJlcyBkZXRhaWxlZCB0eXBlIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgIGFsbCBzeW1ib2xzIChpbmNsdWRpbmcgdW5kZWZpbmVkIHN5bWJvbHMhKS4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSB0eXBlIHNwZWNpZmllZCBpbiBhbiBpbXBvcnQvZXhwb3J0IHN0YXRlbWVudCBkb2VzIG5vdAotICAgICBhbHdheXMgbWF0Y2ggd2hhdCB0aGUgbGlua2VyIHdhbnRzLiAgU2V2ZXJlIGJyYWluZGFtYWdlLiAgKi8KLQkgCi0gIC8qIFNlY3Rpb24gc3ltYm9scyB3aWxsIG5vdCBoYXZlIGEgU09NIHN5bWJvbCB0eXBlIGFzc2lnbmVkIHRvCi0gICAgIHRoZW0geWV0LiAgQXNzaWduIGFsbCBzZWN0aW9uIHN5bWJvbHMgdHlwZSBTVF9EQVRBLiAgKi8KLSAgaWYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICBlbHNlCi0gICAgewotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbXVzdCBoYXZlIHNjb3BlIFNTX1VOU0FUIGFuZCB0eXBlCi0JIFNUX1NUT1JBR0Ugb3IgdGhlIGxpbmtlciB3aWxsIGNob2tlLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JewotCSAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfVU5TQVQ7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1NUT1JBR0U7Ci0JfQotCi0gICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3ltYm9sIHdpdGhvdXQgYW4gYXNzb2NpYXRlZAotCSB0eXBlLiAgVGhpcyBoYXBwZW5zIGlmIHRoZSB1c2VyIGltcG9ydGVkIHRoZSBzeW1ib2wKLQkgd2l0aG91dCBhIHR5cGUgYW5kIHRoZSBzeW1ib2wgd2FzIG5ldmVyIGRlZmluZWQKLQkgbG9jYWxseS4gIElmIEJTRl9GVU5DVElPTiBpcyBzZXQgZm9yIHRoaXMgc3ltYm9sLCB0aGVuCi0JIGFzc2lnbiBpdCB0eXBlIFNUX0NPREUgKHRoZSBIUCBsaW5rZXIgcmVxdWlyZXMgdW5kZWZpbmVkCi0JIGV4dGVybmFsIGZ1bmN0aW9ucyB0byBoYXZlIHR5cGUgU1RfQ09ERSByYXRoZXIgdGhhbiBTVF9FTlRSWSkuICAqLwotICAgICAgZWxzZSBpZiAoKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTgotCQl8fCBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUpCi0JICAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgICAgICAmJiBzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfQ09ERTsKLQotICAgICAgLyogSGFuZGxlIGZ1bmN0aW9uIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4KLQkgVGhleSBzaG91bGQgaGF2ZSB0eXBlIFNUX0VOVFJZLiAgQWxzbyByZXRyaWV2ZSB0aGUgYXJndW1lbnQKLQkgcmVsb2NhdGlvbiBiaXRzIGZyb20gdGhlIFNPTSBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfRU5UUlkKLQkgICAgICAgfHwgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERQotCQkgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikpCi0JICAgICAgIHx8IChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkJICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKSkKLQl7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0VOVFJZOwotCSAgaW5mby0+YXJnX3JlbG9jID0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jOwotCSAgaW5mby0+cHJpdl9sZXZlbD0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbDsKLQl9Ci0KLSAgICAgIC8qIEZvciB1bmtub3duIHN5bWJvbHMgc2V0IHRoZSBzeW1ib2wncyB0eXBlIGJhc2VkIG9uIHRoZSBzeW1ib2wncwotCSBzZWN0aW9uIChTVF9EQVRBIGZvciBEQVRBIHNlY3Rpb25zLCBTVF9DT0RFIGZvciBDT0RFIHNlY3Rpb25zKS4gICovCi0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04pCi0JewotCSAgaWYgKHN5bS0+c2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9DT0RFOwotCSAgZWxzZQotCSAgICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0JfQotICAKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTikKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0KLSAgICAgIC8qIEZyb20gbm93IG9uIGl0J3MgYSB2ZXJ5IHNpbXBsZSBtYXBwaW5nLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9BQlNPTFVURTsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERSkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0NPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0RBVEEpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9NSUxMSUNPREUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9NSUxMSUNPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1BMQUJFTCkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1BMQUJFTDsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfUFJJX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9QUklfUFJPRzsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfU0VDX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9TRUNfUFJPRzsKLSAgICB9Ci0JCi0gIC8qIE5vdyBoYW5kbGUgdGhlIHN5bWJvbCdzIHNjb3BlLiAgRXhwb3J0ZWQgZGF0YSB3aGljaCBpcyBub3QKLSAgICAgaW4gdGhlIGNvbW1vbiBzZWN0aW9uIGhhcyBzY29wZSBTU19VTklWRVJTQUwuICBOb3RlIHNjb3BlCi0gICAgIG9mIGNvbW1vbiBzeW1ib2xzIHdhcyBoYW5kbGVkIGVhcmxpZXIhICAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotICAgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX1VOU0FUOwotICBlbHNlIGlmIChzeW0tPmZsYWdzICYgQlNGX0VYUE9SVCAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19VTklWRVJTQUw7Ci0gIC8qIEFueXRoaW5nIGVsc2Ugd2hpY2ggaXMgbm90IGluIHRoZSBjb21tb24gc2VjdGlvbiBoYXMgc2NvcGUKLSAgICAgU1NfTE9DQUwuICAqLwotICBlbHNlIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19MT0NBTDsKLQotICAvKiBOb3cgc2V0IHRoZSBzeW1ib2xfaW5mbyBmaWVsZC4gIEl0IGhhcyBubyByZWFsIG1lYW5pbmcKLSAgICAgZm9yIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9scywgYnV0IHRoZSBIUCBsaW5rZXIgd2lsbAotICAgICBjaG9rZSBpZiBpdCdzIG5vdCBzZXQgdG8gc29tZSAicmVhc29uYWJsZSIgdmFsdWUuICBXZQotICAgICB1c2UgemVybyBhcyBhIHJlYXNvbmFibGUgdmFsdWUuICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IDA7Ci0gIC8qIEZvciBhbGwgb3RoZXIgc3ltYm9scywgdGhlIHN5bWJvbF9pbmZvIGZpZWxkIGNvbnRhaW5zIHRoZSAKLSAgICAgc3Vic3BhY2UgaW5kZXggb2YgdGhlIHNwYWNlIHRoaXMgc3ltYm9sIGlzIGNvbnRhaW5lZCBpbi4gICovCi0gIGVsc2UKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IHN5bS0+c2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCi0gIC8qIFNldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICAqLwotICBpbmZvLT5zeW1ib2xfdmFsdWUgPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWE7Ci19Ci0KLS8qIEJ1aWxkIGFuZCB3cml0ZSwgaW4gb25lIGJpZyBjaHVuaywgdGhlIGVudGlyZSBzeW1ib2wgdGFibGUgZm9yCi0gICB0aGlzIEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgbnVtX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgZmlsZV9wdHIgc3ltdGFiX2xvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9sb2NhdGlvbjsKLSAgYXN5bWJvbCAqKmJmZF9zeW1zID0gb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCk7Ci0gIHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKnNvbV9zeW10YWIgPSBOVUxMOwotICBpbnQgaSwgc3ltdGFiX3NpemU7Ci0KLSAgLyogQ29tcHV0ZSB0b3RhbCBzeW1ib2wgdGFibGUgc2l6ZSBhbmQgYWxsb2NhdGUgYSBjaHVuayBvZiBtZW1vcnkKLSAgICAgdG8gaG9sZCB0aGUgc3ltYm9sIHRhYmxlIGFzIHdlIGJ1aWxkIGl0LiAgKi8KLSAgc3ltdGFiX3NpemUgPSBudW1fc3ltcyAqIHNpemVvZiAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0gIHNvbV9zeW10YWIgPSAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqKSBiZmRfbWFsbG9jIChzeW10YWJfc2l6ZSk7Ci0gIGlmIChzb21fc3ltdGFiID09IE5VTEwgJiYgc3ltdGFiX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0IChzb21fc3ltdGFiLCAwLCBzeW10YWJfc2l6ZSk7Ci0KLSAgLyogV2FsayBvdmVyIGVhY2ggc3ltYm9sLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1zOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87Ci0KLSAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCBzdHJpbmdzIHRhYmxlLiAgCi0JIEJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlLCB0aGUgaW5kZXggaGFzIGFscmVhZHkgYmVlbiAKLQkgY29tcHV0ZWQgYW5kIHN0b3JlZCBpbnRvIHRoZSBuYW1lIGZpZWxkIGluIHRoZSBCRkQgc3ltYm9sLiAgKi8KLSAgICAgIHNvbV9zeW10YWJbaV0ubmFtZS5uX3N0cnggPSBzb21fc3ltYm9sX2RhdGEoYmZkX3N5bXNbaV0pLT5zdHJpbmd0YWJfb2Zmc2V0OwotCi0gICAgICAvKiBEZXJpdmUgU09NIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBzeW1ib2wuICAqLwotICAgICAgc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyAoYWJmZCwgYmZkX3N5bXNbaV0sICZpbmZvKTsKLQotICAgICAgLyogTm93IHVzZSBpdC4gICovCi0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF90eXBlID0gaW5mby5zeW1ib2xfdHlwZTsKLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3Njb3BlID0gaW5mby5zeW1ib2xfc2NvcGU7Ci0gICAgICBzb21fc3ltdGFiW2ldLmFyZ19yZWxvYyA9IGluZm8uYXJnX3JlbG9jOwotICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfaW5mbyA9IGluZm8uc3ltYm9sX2luZm87Ci0gICAgICBzb21fc3ltdGFiW2ldLnhsZWFzdCA9IDM7Ci0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF92YWx1ZSA9IGluZm8uc3ltYm9sX3ZhbHVlIHwgaW5mby5wcml2X2xldmVsOwotICAgIH0KLQotICAvKiBFdmVyeXRoaW5nIGlzIHJlYWR5LCBzZWVrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBhbmQKLSAgICAgc2NyaWJibGUgb3V0IHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9sb2NhdGlvbiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zeW10YWIsIHN5bXRhYl9zaXplLCAxLCBhYmZkKSAhPSBzeW10YWJfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoc29tX3N5bXRhYiAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9zeW10YWIpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzb21fc3ltdGFiICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX3N5bXRhYik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGluIFNPTSBmb3JtYXQuICAqLyAgCi0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFNldCB1cCBmaXhlZCBwYXJ0cyBvZiB0aGUgZmlsZSwgc3BhY2UsIGFuZCBzdWJzcGFjZSBoZWFkZXJzLgotCSBOb3RpZnkgdGhlIHdvcmxkIHRoYXQgb3V0cHV0IGhhcyBiZWd1bi4gICovCi0gICAgICBzb21fcHJlcF9oZWFkZXJzIChhYmZkKTsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgLyogU3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGluY2x1ZGUgYWxsIHRoZSBzdHJpbmcKLQkgdGFibGVzLCBmaXh1cCBzdHJlYW1zLCBhbmQgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHNvbV9iZWdpbl93cml0aW5nIChhYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzb21fZmluaXNoX3dyaXRpbmcgKGFiZmQpKTsKLX0KLQotDAotLyogUmVhZCBhbmQgc2F2ZSB0aGUgc3RyaW5nIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9zbHVycF9zdHJpbmdfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqc3RyaW5ndGFiOwotCi0gIC8qIFVzZSB0aGUgc2F2ZWQgdmVyc2lvbiBpZiBpdHMgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEkgZG9uJ3QgdGhpbmsgdGhpcyBjYW4gY3VycmVudGx5IGhhcHBlbiwgYW5kIEknbSBub3Qgc3VyZSBpdCBzaG91bGQKLSAgICAgcmVhbGx5IGJlIGFuIGVycm9yLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBnZXR0aW5nIHVucHJlZGljdGFibGUgcmVzdWx0cwotICAgICBmcm9tIHRoZSBob3N0J3MgbWFsbG9jIHdoZW4gcGFzc2VkIGEgc2l6ZSBvZiB6ZXJvLiAgKi8KLSAgaWYgKG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBhbmQgcmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RyaW5ndGFiID0gYmZkX21hbGxvYyAob2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpOwotICBpZiAoc3RyaW5ndGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHN0cmluZ3RhYiwgMCwgb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3NvbV9zdHJfZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaWYgKGJmZF9yZWFkIChzdHJpbmd0YWIsIG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpLCAxLCBhYmZkKQotICAgICAgIT0gb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNhdmUgb3VyIHJlc3VsdHMgYW5kIHJldHVybiBzdWNjZXNzLiAqLwotICBvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCkgPSBzdHJpbmd0YWI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIChpbiBieXRlcykgcmVxdWlyZWQgdG8gaG9sZCB0aGUgc3ltYm9sCi0gICB0YWJsZSBmb3IgdGhpcyBvYmplY3QuICAqLwotCi1zdGF0aWMgbG9uZwotc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci19Ci0KLS8qIENvbnZlcnQgZnJvbSBhIFNPTSBzdWJzcGFjZSBpbmRleCB0byBhIEJGRCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKnN5bWJvbDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogVGhlIG1lYW5pbmcgb2YgdGhlIHN5bWJvbF9pbmZvIGZpZWxkIGNoYW5nZXMgZm9yIGZ1bmN0aW9ucwotICAgICB3aXRoaW4gZXhlY3V0YWJsZXMuICBTbyBvbmx5IHVzZSB0aGUgcXVpY2sgc3ltYm9sX2luZm8gbWFwcGluZyBmb3IKLSAgICAgaW5jb21wbGV0ZSBvYmplY3RzIGFuZCBub24tZnVuY3Rpb24gc3ltYm9scyBpbiBleGVjdXRhYmxlcy4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAKLSAgICAgIHx8IChzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX0VOVFJZCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX1BSSV9QUk9HCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX1NFQ19QUk9HCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX01JTExJQ09ERSkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gc3ltYm9sLT5zeW1ib2xfaW5mbzsKLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCWlmIChzZWN0aW9uLT50YXJnZXRfaW5kZXggPT0gaW5kZXggJiYgc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQkgIHJldHVybiBzZWN0aW9uOwotCi0gICAgICAvKiBDb3VsZCBiZSBhIHN5bWJvbCBmcm9tIGFuIGV4dGVybmFsIGxpYnJhcnkgKHN1Y2ggYXMgYW4gT01PUwotCSBzaGFyZWQgbGlicmFyeSkuICBEb24ndCBhYm9ydC4gICovCi0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IHN5bWJvbC0+c3ltYm9sX3ZhbHVlOwotCi0gICAgICAvKiBGb3IgZXhlY3V0YWJsZXMgd2Ugd2lsbCBoYXZlIHRvIHVzZSB0aGUgc3ltYm9sJ3MgYWRkcmVzcyBhbmQKLQkgZmluZCBvdXQgd2hhdCBzZWN0aW9uIHdvdWxkIGNvbnRhaW4gdGhhdCBhZGRyZXNzLiAgIFl1ay4gICovCi0gICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgaWYgKHZhbHVlID49IHNlY3Rpb24tPnZtYQotCSAgICAgICYmIHZhbHVlIDw9IHNlY3Rpb24tPnZtYSArIHNlY3Rpb24tPl9jb29rZWRfc2l6ZQotCSAgICAgICYmIHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JICAgIHJldHVybiBzZWN0aW9uOwotCX0KLQotICAgICAgLyogQ291bGQgYmUgYSBzeW1ib2wgZnJvbSBhbiBleHRlcm5hbCBsaWJyYXJ5IChzdWNoIGFzIGFuIE9NT1MKLQkgc2hhcmVkIGxpYnJhcnkpLiAgRG9uJ3QgYWJvcnQuICAqLwotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0KLSAgICB9Ci19Ci0KLS8qIFJlYWQgYW5kIHNhdmUgdGhlIHN5bWJvbCB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBpbnQgc3ltc2l6ZSA9IHNpemVvZiAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0gIGNoYXIgKnN0cmluZ3RhYjsKLSAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqYnVmID0gTlVMTCwgKmJ1ZnAsICplbmRidWZwOwotICBzb21fc3ltYm9sX3R5cGUgKnN5bSwgKnN5bWJhc2U7Ci0KLSAgLyogUmV0dXJuIHNhdmVkIHZhbHVlIGlmIGl0IGV4aXN0cy4gICovCi0gIGlmIChvYmpfc29tX3N5bXRhYiAoYWJmZCkgIT0gTlVMTCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIC8qIFNwZWNpYWwgY2FzZS4gIFRoaXMgaXMgKm5vdCogYW4gZXJyb3IuICAqLwotICBpZiAoc3ltYm9sX2NvdW50ID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICBpZiAoIXNvbV9zbHVycF9zdHJpbmdfdGFibGUgKGFiZmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHN0cmluZ3RhYiA9IG9ial9zb21fc3RyaW5ndGFiIChhYmZkKTsKLQotICBzeW1iYXNlID0gKChzb21fc3ltYm9sX3R5cGUgKikKLQkgICAgIGJmZF9tYWxsb2MgKHN5bWJvbF9jb3VudCAqIHNpemVvZiAoc29tX3N5bWJvbF90eXBlKSkpOwotICBpZiAoc3ltYmFzZSA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKHN5bWJhc2UsIDAsIHN5bWJvbF9jb3VudCAqIHNpemVvZiAoc29tX3N5bWJvbF90eXBlKSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgU09NIHJlcHJlc2VudGF0aW9uLiAgKi8KLSAgYnVmID0gYmZkX21hbGxvYyAoc3ltYm9sX2NvdW50ICogc3ltc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCAmJiBzeW1ib2xfY291bnQgKiBzeW1zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3NvbV9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChiZmRfcmVhZCAoYnVmLCBzeW1ib2xfY291bnQgKiBzeW1zaXplLCAxLCBhYmZkKSAKLSAgICAgICE9IHN5bWJvbF9jb3VudCAqIHN5bXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgc3ltYm9scyBhbmQgaW50ZXJuYWxpemUgdGhlbS4gICovCi0gIGVuZGJ1ZnAgPSBidWYgKyBzeW1ib2xfY291bnQ7Ci0gIGZvciAoYnVmcCA9IGJ1Ziwgc3ltID0gc3ltYmFzZTsgYnVmcCA8IGVuZGJ1ZnA7ICsrYnVmcCkKLSAgICB7Ci0KLSAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgd2UgY2FyZSBhYm91dCB0aGVzZS4gICovCi0gICAgICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfU1lNX0VYVAotCSAgfHwgYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfQVJHX0VYVCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2V0IHNvbWUgcHJpdmF0ZSBkYXRhIHdlIGNhcmUgYWJvdXQuICAqLwotICAgICAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX05VTEwpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9BQlNPTFVURSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfQUJTT0xVVEU7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9EQVRBKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfQ09ERSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfQ09ERTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1BSSV9QUk9HKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9QUklfUFJPRzsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1NFQ19QUk9HKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9TRUNfUFJPRzsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0VOVFJZKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9FTlRSWTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX01JTExJQ09ERSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfTUlMTElDT0RFOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfUExBQkVMKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9QTEFCRUw7Ci0gICAgICBlbHNlCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047Ci0gICAgICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MgPSBidWZwLT5hcmdfcmVsb2M7Ci0KLSAgICAgIC8qIFNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cy4gICovCi0gICAgICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgICAgIHN5bS0+c3ltYm9sLm5hbWUgPSBidWZwLT5uYW1lLm5fc3RyeCArIHN0cmluZ3RhYjsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlID0gYnVmcC0+c3ltYm9sX3ZhbHVlOwotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IDA7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyA9IDA7Ci0KLSAgICAgIHN3aXRjaCAoYnVmcC0+c3ltYm9sX3R5cGUpCi0JewotCWNhc2UgU1RfRU5UUlk6Ci0JY2FzZSBTVF9NSUxMSUNPREU6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9wcml2X2xldmVsID0KLQkgICAgc3ltLT5zeW1ib2wudmFsdWUgJiAweDM7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+MHgzOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNUX1NUVUI6Ci0JY2FzZSBTVF9DT0RFOgotCWNhc2UgU1RfUFJJX1BST0c6Ci0JY2FzZSBTVF9TRUNfUFJPRzoKLQkgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWwgPQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAmIDB4MzsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH4weDM7Ci0JICAvKiBJZiB0aGUgc3ltYm9sJ3Mgc2NvcGUgaXMgU1RfVU5TQVQsIHRoZW4gdGhlc2UgYXJlCi0JICAgICB1bmRlZmluZWQgZnVuY3Rpb24gc3ltYm9scy4gICovCi0JICBpZiAoYnVmcC0+c3ltYm9sX3Njb3BlID09IFNTX1VOU0FUKQotCSAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICAgICAKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEhhbmRsZSBzY29waW5nIGFuZCBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoYnVmcC0+c3ltYm9sX3Njb3BlKQotCXsKLQkvKiBzeW1ib2xfaW5mbyBmaWVsZCBpcyB1bmRlZmluZWQgZm9yIFNTX0VYVEVSTkFMIGFuZCBTU19VTlNBVCBzeW1ib2xzLAotCSAgIHNvIHRoZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN5bWJvbCBjYW4ndCBiZSBrbm93bi4gICovCi0JY2FzZSBTU19FWFRFUk5BTDoKLQkgIGlmIChidWZwLT5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSAoQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNTX1VOU0FUOgotCSAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCi0JY2FzZSBTU19VTklWRVJTQUw6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSAoQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUwpOwotCSAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgYnVmcCk7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQotI2lmIDAKLQkvKiBTU19HTE9CQUwgYW5kIFNTX0xPQ0FMIGFyZSB0d28gbmFtZXMgZm9yIHRoZSBzYW1lIHRoaW5nLgotCSAgIFNvdW5kIGR1bWI/ICBJdCBpcy4gICovCi0JY2FzZSBTU19HTE9CQUw6Ci0jZW5kaWYKLQljYXNlIFNTX0xPQ0FMOgotCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0xPQ0FMOwotCSAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgYnVmcCk7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIE1hcmsgc2VjdGlvbiBzeW1ib2xzIGFuZCBzeW1ib2xzIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLgotCSBOb3RlICRTVEFSVCQgaXMgYSBtYWdpYyBjb2RlIHN5bWJvbCwgTk9UIGEgc2VjdGlvbiBzeW1ib2wuICAqLwotICAgICAgaWYgKHN5bS0+c3ltYm9sLm5hbWVbMF0gPT0gJyQnCi0JICAmJiBzeW0tPnN5bWJvbC5uYW1lW3N0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgLSAxXSA9PSAnJCcKLQkgICYmICFzdHJjbXAgKHN5bS0+c3ltYm9sLm5hbWUsIHN5bS0+c3ltYm9sLnNlY3Rpb24tPm5hbWUpKQotCXN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLSAgICAgIGVsc2UgaWYgKCFzdHJuY21wIChzeW0tPnN5bWJvbC5uYW1lLCAiTCQwXDAwMiIsIDQpKQotCXsKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHN5bS0+c3ltYm9sLm5hbWUgPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT5uYW1lOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJuY21wIChzeW0tPnN5bWJvbC5uYW1lLCAiTCQwXDAwMSIsIDQpKQotCXN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgICAgIC8qIE5vdGUgaW5jcmVtZW50IGF0IGJvdHRvbSBvZiBsb29wLCBzaW5jZSB3ZSBza2lwIHNvbWUgc3ltYm9scwotICAgICAgICAgd2UgY2FuIG5vdCBpbmNsdWRlIGl0IGFzIHBhcnQgb2YgdGhlIGZvciBzdGF0ZW1lbnQuICAqLwotICAgICAgc3ltKys7Ci0gICAgfQotCi0gIC8qIFdlIG1vZGlmeSB0aGUgc3ltYm9sIGNvdW50IHRvIHJlY29yZCB0aGUgbnVtYmVyIG9mIEJGRCBzeW1ib2xzIHdlCi0gICAgIGNyZWF0ZWQuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bSAtIHN5bWJhc2U7Ci0KLSAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICAqLwotICBvYmpfc29tX3N5bXRhYiAoYWJmZCkgPSBzeW1iYXNlOwotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuICh0cnVlKTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2Fub25pY2FsaXplIGEgU09NIHN5bWJvbCB0YWJsZS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMKLSAgIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotc29tX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgaW50IGk7Ci0gIHNvbV9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLQotICBpZiAoIXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBpID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHN5bWJhc2UgPSBvYmpfc29tX3N5bXRhYiAoYWJmZCk7Ci0KLSAgZm9yICg7IGkgPiAwOyBpLS0sIGxvY2F0aW9uKyssIHN5bWJhc2UrKykKLSAgICAqbG9jYXRpb24gPSAmc3ltYmFzZS0+c3ltYm9sOwotCi0gIC8qIEZpbmFsIG51bGwgcG9pbnRlci4gICovCi0gICpsb2NhdGlvbiA9IDA7Ci0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotfQotCi0vKiBNYWtlIGEgU09NIHN5bWJvbC4gIFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotc29tX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNvbV9zeW1ib2xfdHlwZSAqbmV3ID0KLSAgKHNvbV9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIFByaW50IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAic29tICIpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHN5bWJvbC0+dmFsdWUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlbHgiLCAobG9uZykgc3ltYm9sLT5mbGFncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZTsKLQlzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPyBzeW1ib2wtPnNlY3Rpb24tPm5hbWUgOiAiKCpub25lKikiOwotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0JZnByaW50ZiAoZmlsZSwgIiAlc1x0JXMiLCBzZWN0aW9uX25hbWUsIHN5bWJvbC0+bmFtZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnJCcpOwotfQotCi0vKiBDb3VudCBvciBwcm9jZXNzIHZhcmlhYmxlLWxlbmd0aCBTT00gZml4dXAgcmVjb3Jkcy4KLQotICAgVG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiB3ZSB1c2UgdGhpcyBjb2RlIGJvdGggdG8gY29tcHV0ZSB0aGUgbnVtYmVyCi0gICBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgYSBzdHJlYW0sIGFuZCB0byBpbnRlcm5hbGl6ZSB0aGUgc3RyZWFtLgotCi0gICBXaGVuIGNvbXB1dGluZyB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHJlcXVlc3RlZCBieSBhIHN0cmVhbSB0aGUKLSAgIHZhcmlhYmxlcyBycHRyLCBzZWN0aW9uLCBhbmQgc3ltYm9scyBoYXZlIG5vIG1lYW5pbmcuCi0KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHJlcXVlc3RlZCBieSB0aGUgZml4dXAgc3RyZWFtLiAgV2hlbgotICAgbm90IGp1c3QgY291bnRpbmcgCi0KLSAgIFRoaXMgbmVlZHMgYXQgbGVhc3QgdHdvIG9yIHRocmVlIG1vcmUgcGFzc2VzIHRvIGdldCBpdCBjbGVhbmVkIHVwLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotc29tX3NldF9yZWxvY19pbmZvIChmaXh1cCwgZW5kLCBpbnRlcm5hbF9yZWxvY3MsIHNlY3Rpb24sIHN5bWJvbHMsIGp1c3RfY291bnQpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmZpeHVwOwotICAgICB1bnNpZ25lZCBpbnQgZW5kOwotICAgICBhcmVsZW50ICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBqdXN0X2NvdW50OwotewotICB1bnNpZ25lZCBpbnQgb3AsIHZhcm5hbWUsIGRlYWxsb2NhdGVfY29udGVudHMgPSAwOwotICB1bnNpZ25lZCBjaGFyICplbmRfZml4dXBzID0gJmZpeHVwW2VuZF07Ci0gIGNvbnN0IHN0cnVjdCBmaXh1cF9mb3JtYXQgKmZwOwotICBjaGFyICpjcDsKLSAgdW5zaWduZWQgY2hhciAqc2F2ZV9maXh1cDsKLSAgaW50IHZhcmlhYmxlc1syNl0sIHN0YWNrWzIwXSwgYywgdiwgY291bnQsIHByZXZfZml4dXAsICpzcCwgc2F2ZWRfdW53aW5kX2JpdHM7Ci0gIGNvbnN0IGludCAqc3Vib3A7Ci0gIGFyZWxlbnQgKnJwdHI9IGludGVybmFsX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0KLSNkZWZpbmUJdmFyKGMpCQl2YXJpYWJsZXNbKGMpIC0gJ0EnXQotI2RlZmluZQlwdXNoKHYpCQkoKnNwKysgPSAodikpCi0jZGVmaW5lCXBvcCgpCQkoKi0tc3ApCi0jZGVmaW5lCWVtcHR5c3RhY2soKQkoc3AgPT0gc3RhY2spCi0KLSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLSAgbWVtc2V0ICh2YXJpYWJsZXMsIDAsIHNpemVvZiAodmFyaWFibGVzKSk7Ci0gIG1lbXNldCAoc3RhY2ssIDAsIHNpemVvZiAoc3RhY2spKTsKLSAgY291bnQgPSAwOwotICBwcmV2X2ZpeHVwID0gMDsKLSAgc2F2ZWRfdW53aW5kX2JpdHMgPSAwOwotICBzcCA9IHN0YWNrOwotCi0gIHdoaWxlIChmaXh1cCA8IGVuZF9maXh1cHMpCi0gICAgewotCi0gICAgICAvKiBTYXZlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgZml4dXAuICBXZSdsbCB1c2UKLQkgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBwdXQgdGhpcyBmaXh1cAotCSBvbiB0aGUgcXVldWUuICAqLwotICAgICAgc2F2ZV9maXh1cCA9IGZpeHVwOwotCi0gICAgICAvKiBHZXQgdGhlIGZpeHVwIGNvZGUgYW5kIGl0cyBhc3NvY2lhdGVkIGZvcm1hdC4gICovCi0gICAgICBvcCA9ICpmaXh1cCsrOwotICAgICAgZnAgPSAmc29tX2ZpeHVwX2Zvcm1hdHNbb3BdOwotCi0gICAgICAvKiBIYW5kbGUgYSByZXF1ZXN0IGZvciBhIHByZXZpb3VzIGZpeHVwLiAgKi8KLSAgICAgIGlmICgqZnAtPmZvcm1hdCA9PSAnUCcpCi0JewotCSAgLyogR2V0IHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJldiBmaXh1cCwgbW92ZQotCSAgICAgdGhlIHJlcGVhdGVkIGZpeHVwIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4gICovCi0JICBmaXh1cCA9IHJlbG9jX3F1ZXVlW2ZwLT5EXS5yZWxvYzsKLQkgIHNvbV9yZWxvY19xdWV1ZV9maXggKHJlbG9jX3F1ZXVlLCBmcC0+RCk7Ci0JICBwcmV2X2ZpeHVwID0gMTsKLQotCSAgLyogR2V0IHRoZSBmaXh1cCBjb2RlIGFuZCBpdHMgYXNzb2NpYXRlZCBmb3JtYXQuICAqLwotCSAgb3AgPSAqZml4dXArKzsKLQkgIGZwID0gJnNvbV9maXh1cF9mb3JtYXRzW29wXTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgZml4dXAgd2lsbCBiZSBwYXNzZWQgdG8gQkZELCBzZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgICAgIGlmICghIGp1c3RfY291bnQKLQkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfTk9fUkVMT0NBVElPTgotCSAgJiYgc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgIT0gUl9EQVRBX09WRVJSSURFKQotCXsKLQkgIHJwdHItPmFkZHJlc3MgPSBvZmZzZXQ7Ci0JICBycHRyLT5ob3d0byA9ICZzb21faHBwYV9ob3d0b190YWJsZVtvcF07Ci0JICBycHRyLT5hZGRlbmQgPSAwOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIC8qIFNldCBkZWZhdWx0IGlucHV0IGxlbmd0aCB0byAwLiAgR2V0IHRoZSBvcGNvZGUgY2xhc3MgaW5kZXgKLQkgaW50byBELiAgKi8KLSAgICAgIHZhciAoJ0wnKSA9IDA7Ci0gICAgICB2YXIgKCdEJykgPSBmcC0+RDsKLSAgICAgIHZhciAoJ1UnKSA9IHNhdmVkX3Vud2luZF9iaXRzOwotCi0gICAgICAvKiBHZXQgdGhlIG9wY29kZSBmb3JtYXQuICAqLwotICAgICAgY3AgPSBmcC0+Zm9ybWF0OwotCi0gICAgICAvKiBQcm9jZXNzIHRoZSBmb3JtYXQgc3RyaW5nLiAgUGFyc2luZyBoYXBwZW5zIGluIHR3byBwaGFzZXMsCi0JIHBhcnNlIFJIUywgdGhlbiBhc3NpZ24gdG8gTEhTLiAgUmVwZWF0IHVudGlsIG5vIG1vcmUgCi0JIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICAqLwotICAgICAgd2hpbGUgKCpjcCkKLQl7Ci0JICAvKiBUaGUgdmFyaWFibGUgdGhpcyBwYXNzIGlzIGdvaW5nIHRvIGNvbXB1dGUgYSB2YWx1ZSBmb3IuICAqLwotCSAgdmFybmFtZSA9ICpjcCsrOwotCi0JICAvKiBTdGFydCBwcm9jZXNzaW5nIFJIUy4gIENvbnRpbnVlIHVudGlsIGEgTlVMTCBvciAnPScgaXMgZm91bmQuICAqLwotCSAgZG8KLQkgICAgewotCSAgICAgIGMgPSAqY3ArKzsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSB2YXJpYWJsZSwgcHVzaCBpdCBvbiB0aGUgc3RhY2suICAqLwotCSAgICAgIGlmIChpc3VwcGVyIChjKSkKLQkJcHVzaCAodmFyIChjKSk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgbG93ZXIgY2FzZSBsZXR0ZXIsIHRoZW4gaXQgcmVwcmVzZW50cwotCQkgYWRkaXRpb25hbCBkYXRhIGZyb20gdGhlIGZpeHVwIHN0cmVhbSB0byBiZSBwdXNoZWQgb250bwotCQkgdGhlIHN0YWNrLiAgKi8KLQkgICAgICBlbHNlIGlmIChpc2xvd2VyIChjKSkKLQkJewotCQkgIGludCBiaXRzID0gKGMgLSAnYScpICogODsKLQkJICBmb3IgKHYgPSAwOyBjID4gJ2EnOyAtLWMpCi0JCSAgICB2ID0gKHYgPDwgOCkgfCAqZml4dXArKzsKLQkJICBpZiAodmFybmFtZSA9PSAnVicpCi0JCSAgICB2ID0gc2lnbl9leHRlbmQgKHYsIGJpdHMpOwotCQkgIHB1c2ggKHYpOwotCQl9Ci0KLQkgICAgICAvKiBBIGRlY2ltYWwgY29uc3RhbnQuICBQdXNoIGl0IG9uIHRoZSBzdGFjay4gICovCi0JICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoYykpCi0JCXsKLQkJICB2ID0gYyAtICcwJzsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKmNwKSkKLQkJICAgIHYgPSAodiAqIDEwKSArICgqY3ArKyAtICcwJyk7Ci0JCSAgcHVzaCAodik7Ci0JCX0KLQkgICAgICBlbHNlCi0KLQkJLyogQW4gb3BlcmF0b3IuICBQb3AgdHdvIHR3byB2YWx1ZXMgZnJvbSB0aGUgc3RhY2sgYW5kCi0JCSAgIHVzZSB0aGVtIGFzIG9wZXJhbmRzIHRvIHRoZSBnaXZlbiBvcGVyYXRpb24uICBQdXNoCi0JCSAgIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBiYWNrIG9uIHRoZSBzdGFjay4gICovCi0JCXN3aXRjaCAoYykKLQkJICB7Ci0JCSAgY2FzZSAnKyc6Ci0JCSAgICB2ID0gcG9wICgpOwotCQkgICAgdiArPSBwb3AgKCk7Ci0JCSAgICBwdXNoICh2KTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJyonOgotCQkgICAgdiA9IHBvcCAoKTsKLQkJICAgIHYgKj0gcG9wICgpOwotCQkgICAgcHVzaCAodik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICc8JzoKLQkJICAgIHYgPSBwb3AgKCk7Ci0JCSAgICB2ID0gcG9wICgpIDw8IHY7Ci0JCSAgICBwdXNoICh2KTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgIH0KLQkgIHdoaWxlICgqY3AgJiYgKmNwICE9ICc9Jyk7Ci0KLQkgIC8qIE1vdmUgb3ZlciB0aGUgZXF1YWwgb3BlcmF0b3IuICAqLwotCSAgY3ArKzsKLQotCSAgLyogUG9wIHRoZSBSSFMgb2ZmIHRoZSBzdGFjay4gICovCi0JICBjID0gcG9wICgpOwotCi0JICAvKiBQZXJmb3JtIHRoZSBhc3NpZ25tZW50LiAgKi8KLQkgIHZhciAodmFybmFtZSkgPSBjOwotCi0JICAvKiBIYW5kbGUgc2lkZSBlZmZlY3RzLiBhbmQgc3BlY2lhbCAnTycgc3RhY2sgY2FzZXMuICAqLwotCSAgc3dpdGNoICh2YXJuYW1lKQotCSAgICB7Ci0JICAgIC8qIENvbnN1bWUgc29tZSBieXRlcyBmcm9tIHRoZSBpbnB1dCBzcGFjZS4gICovCi0JICAgIGNhc2UgJ0wnOgotCSAgICAgIG9mZnNldCArPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICAvKiBBIHN5bWJvbCB0byB1c2UgaW4gdGhlIHJlbG9jYXRpb24uICBNYWtlIGEgbm90ZQotCSAgICAgICBvZiB0aGlzIGlmIHdlIGFyZSBub3QganVzdCBjb3VudGluZy4gICovCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIGlmICghIGp1c3RfY291bnQpCi0JCXJwdHItPnN5bV9wdHJfcHRyID0gJnN5bWJvbHNbY107Ci0JICAgICAgYnJlYWs7Ci0JICAgIC8qIEFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBmb3IgYSBmdW5jdGlvbiBjYWxsLiAgKi8KLQkgICAgY2FzZSAnUic6Ci0JICAgICAgaWYgKCEganVzdF9jb3VudCkKLQkJewotCQkgIHVuc2lnbmVkIGludCB0bXAgPSB2YXIgKCdSJyk7Ci0JCSAgcnB0ci0+YWRkZW5kID0gMDsKLQotCQkgIGlmICgoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9QQ1JFTF9DQUxMCi0JCSAgICAgICAmJiBSX1BDUkVMX0NBTEwgKyAxMCA+IG9wKQotCQkgICAgICB8fCAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9BQlNfQ0FMTAotCQkJICAmJiBSX0FCU19DQUxMICsgMTAgPiBvcCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFNpbXBsZSBlbmNvZGluZy4gICovCi0JCSAgICAgIGlmICh0bXAgPiA0KQotCQkJewotCQkJICB0bXAgLT0gNTsKLQkJCSAgcnB0ci0+YWRkZW5kIHw9IDE7Ci0JCQl9Ci0JCSAgICAgIGlmICh0bXAgPT0gNCkKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDI7Ci0JCSAgICAgIGVsc2UgaWYgKHRtcCA9PSAzKQotCQkJcnB0ci0+YWRkZW5kIHw9IDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNDsKLQkJICAgICAgZWxzZSBpZiAodG1wID09IDIpCi0JCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4IHwgMSA8PCA2OwotCQkgICAgICBlbHNlIGlmICh0bXAgPT0gMSkKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDg7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgdG1wMSwgdG1wMjsKLQotCQkgICAgICAvKiBGaXJzdCBwYXJ0IGlzIGVhc3kgLS0gbG93IG9yZGVyIHR3byBiaXRzIGFyZQotCQkJIGRpcmVjdGx5IGNvcGllZCwgdGhlbiBzaGlmdGVkIGF3YXkuICAqLwotCQkgICAgICBycHRyLT5hZGRlbmQgPSB0bXAgJiAweDM7Ci0JCSAgICAgIHRtcCA+Pj0gMjsKLQotCQkgICAgICAvKiBEaXZpbmcgdGhlIHJlc3VsdCBieSAxMCBnaXZlcyB1cyB0aGUgc2Vjb25kCi0JCQkgcGFydC4gIElmIGl0IGlzIDksIHRoZW4gdGhlIGZpcnN0IHR3byB3b3JkcwotCQkJIGFyZSBhIGRvdWJsZSBwcmVjaXNpb24gcGFyYW1hdGVyLCBlbHNlIGl0IGlzCi0JCQkgMyAqIHRoZSBmaXJzdCBhcmcgYml0cyArIHRoZSAybmQgYXJnIGJpdHMuICAqLwotCQkgICAgICB0bXAxID0gdG1wIC8gMTA7Ci0JCSAgICAgIHRtcCAtPSB0bXAxICogMTA7Ci0JCSAgICAgIGlmICh0bXAxID09IDkpCi0JCQlycHRyLT5hZGRlbmQgKz0gKDB4ZSA8PCA2KTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBHZXQgdGhlIHR3byBwaWVjZXMuICAqLwotCQkJICB0bXAyID0gdG1wMSAvIDM7Ci0JCQkgIHRtcDEgLT0gdG1wMiAqIDM7Ci0JCQkgIC8qIFB1dCB0aGVtIGluIHRoZSBhZGRlbmQuICAqLwotCQkJICBycHRyLT5hZGRlbmQgKz0gKHRtcDIgPDwgOCkgKyAodG1wMSA8PCA2KTsKLQkJCX0KLQotCQkgICAgICAvKiBXaGF0J3MgbGVmdCBpcyB0aGUgdGhpcmQgcGFydC4gIEl0J3MgdW5wYWNrZWQKLQkJCSBqdXN0IGxpa2UgdGhlIHNlY29uZC4gICovCi0JCSAgICAgIGlmICh0bXAgPT0gOSkKLQkJCXJwdHItPmFkZGVuZCArPSAoMHhlIDw8IDIpOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHRtcDIgPSB0bXAgLyAzOwotCQkJICB0bXAgLT0gdG1wMiAqIDM7Ci0JCQkgIHJwdHItPmFkZGVuZCArPSAodG1wMiA8PCA0KSArICh0bXAgPDwgMik7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgcnB0ci0+YWRkZW5kID0gSFBQQV9SX0FEREVORCAocnB0ci0+YWRkZW5kLCAwKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICAvKiBIYW5kbGUgdGhlIGxpbmtlciBleHByZXNzaW9uIHN0YWNrLiAgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgICAgc3dpdGNoIChvcCkKLQkJewotCQljYXNlIFJfQ09NUDE6Ci0JCSAgc3Vib3AgPSBjb21wMV9vcGNvZGVzOwotCQkgIGJyZWFrOwotCQljYXNlIFJfQ09NUDI6Ci0JCSAgc3Vib3AgPSBjb21wMl9vcGNvZGVzOwotCQkgIGJyZWFrOwotCQljYXNlIFJfQ09NUDM6Ci0JCSAgc3Vib3AgPSBjb21wM19vcGNvZGVzOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgd2hpbGUgKCpzdWJvcCA8PSAodW5zaWduZWQgY2hhcikgYykKLQkJKytzdWJvcDsKLQkgICAgICAtLXN1Ym9wOwotCSAgICAgIGJyZWFrOwotCSAgICAvKiBUaGUgbG93ZXIgMzJ1bndpbmQgYml0cyBtdXN0IGJlIHBlcnNpc3RlbnQuICAqLwotCSAgICBjYXNlICdVJzoKLQkgICAgICBzYXZlZF91bndpbmRfYml0cyA9IHZhciAoJ1UnKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSB1c2VkIGEgcHJldmlvdXMgZml4dXAsIGNsZWFuIHVwIGFmdGVyIGl0LiAgKi8KLSAgICAgIGlmIChwcmV2X2ZpeHVwKQotCXsKLQkgIGZpeHVwID0gc2F2ZV9maXh1cCArIDE7Ci0JICBwcmV2X2ZpeHVwID0gMDsKLQl9Ci0gICAgICAvKiBRdWV1ZSBpdC4gICovCi0gICAgICBlbHNlIGlmIChmaXh1cCA+IHNhdmVfZml4dXAgKyAxKQotCXNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgKHNhdmVfZml4dXAsIGZpeHVwIC0gc2F2ZV9maXh1cCwgcmVsb2NfcXVldWUpOwotCi0gICAgICAvKiBXZSBkbyBub3QgcGFzcyBSX0RBVEFfT1ZFUlJJREUgb3IgUl9OT19SRUxPQ0FUSU9OIAotCSBmaXh1cHMgdG8gQkZELiAgKi8KLSAgICAgIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX0RBVEFfT1ZFUlJJREUKLQkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfTk9fUkVMT0NBVElPTikKLQl7Ci0JICAvKiBEb25lIHdpdGggYSBzaW5nbGUgcmVsb2N0aW9uLiBMb29wIGJhY2sgdG8gdGhlIHRvcC4gICovCi0JICBpZiAoISBqdXN0X2NvdW50KQotCSAgICB7Ci0JICAgICAgaWYgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfRU5UUlkpCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1QnKTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0VYSVQpCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1UnKTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX1BDUkVMX0NBTEwKLQkJICAgICAgIHx8IHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfQUJTX0NBTEwpCi0JCTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0RBVEFfT05FX1NZTUJPTCkKLQkJewotCQkgIHVuc2lnbmVkIGFkZGVuZCA9IHZhciAoJ1YnKTsKLQotCQkgIC8qIFRyeSB3aGF0IHdhcyBzcGVjaWZpZWQgaW4gUl9EQVRBX09WRVJSSURFIGZpcnN0Ci0JCSAgICAgKGlmIGFueXRoaW5nKS4gIFRoZW4gdGhlIGhhcmQgd2F5IHVzaW5nIHRoZQotCQkgICAgIHNlY3Rpb24gY29udGVudHMuICAqLwotCQkgIHJwdHItPmFkZGVuZCA9IHZhciAoJ1YnKTsKLQotCQkgIGlmIChycHRyLT5hZGRlbmQgPT0gMCAmJiAhc2VjdGlvbi0+Y29udGVudHMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEdvdCB0byByZWFkIHRoZSBkYW1uIGNvbnRlbnRzIGZpcnN0LiAgV2UgZG9uJ3QKLQkJICAgICAgICAgYm90aGVyIHNhdmluZyB0aGUgY29udGVudHMgKHlldCkuICBBZGQgaXQgb25lCi0JCQkgZGF5IGlmIHRoZSBuZWVkIGFyaXNlcy4gICovCi0JCSAgICAgIHNlY3Rpb24tPmNvbnRlbnRzID0gYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJICAgICAgZGVhbGxvY2F0ZV9jb250ZW50cyA9IDE7Ci0JCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoc2VjdGlvbi0+b3duZXIsCi0JCQkJCQlzZWN0aW9uLAotCQkJCQkJc2VjdGlvbi0+Y29udGVudHMsCi0JCQkJCQkwLAotCQkJCQkJc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChycHRyLT5hZGRlbmQgPT0gMCkKLQkJICAgIHJwdHItPmFkZGVuZCA9IGJmZF9nZXRfMzIgKHNlY3Rpb24tPm93bmVyLAotCQkJCQkgICAgICAgKHNlY3Rpb24tPmNvbnRlbnRzCi0JCQkJCQkrIG9mZnNldCAtIHZhciAoJ0wnKSkpOwotCQkJCi0JCX0KLQkgICAgICBlbHNlCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1YnKTsKLQkgICAgICBycHRyKys7Ci0JICAgIH0KLQkgIGNvdW50Kys7Ci0JICAvKiBOb3cgdGhhdCB3ZSd2ZSBoYW5kbGVkIGEgImZ1bGwiIHJlbG9jYXRpb24sIHJlc2V0Ci0JICAgICBzb21lIHN0YXRlLiAgKi8KLQkgIG1lbXNldCAodmFyaWFibGVzLCAwLCBzaXplb2YgKHZhcmlhYmxlcykpOwotCSAgbWVtc2V0IChzdGFjaywgMCwgc2l6ZW9mIChzdGFjaykpOwotCX0KLSAgICB9Ci0gIGlmIChkZWFsbG9jYXRlX2NvbnRlbnRzKQotICAgIGZyZWUgKHNlY3Rpb24tPmNvbnRlbnRzKTsKLQotICByZXR1cm4gY291bnQ7Ci0KLSN1bmRlZiB2YXIKLSN1bmRlZiBwdXNoCi0jdW5kZWYgcG9wCi0jdW5kZWYgZW1wdHlzdGFjawotfQotCi0vKiBSZWFkIGluIHRoZSByZWxvY3MgKGFrYSBmaXh1cHMgaW4gU09NIHRlcm1zKSBmb3IgYSBzZWN0aW9uLiAKLQotICAgc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCBjYWxscyB0aGlzIHJvdXRpbmUgd2l0aCBKVVNUX0NPVU5UIAotICAgc2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgaXQgb25seSBuZWVkcyBhIGNvdW50IG9mIHRoZSBudW1iZXIKLSAgIG9mIGFjdHVhbCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIGp1c3RfY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGp1c3RfY291bnQ7Ci17Ci0gIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IGZpeHVwX3N0cmVhbV9zaXplOwotICBhcmVsZW50ICppbnRlcm5hbF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBudW1fcmVsb2NzOwotCi0gIGZpeHVwX3N0cmVhbV9zaXplID0gc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3NpemU7Ci0gIC8qIElmIHRoZXJlIHdlcmUgbm8gcmVsb2NhdGlvbnMsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4gICovCi0gIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHJlbG9jX2NvdW50IGlzIC0xLCB0aGVuIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBoYXMgbm90IGJlZW4gCi0gICAgIHBhcnNlZC4gIFdlIG11c3QgZG8gc28gbm93IHRvIGtub3cgaG93IG1hbnkgcmVsb2NhdGlvbnMgZXhpc3QuICAqLwotICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gLTEpCi0gICAgewotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoZml4dXBfc3RyZWFtX3NpemUpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIGZvcm1zLiAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgb2JqX3NvbV9yZWxvY19maWxlcG9zIChhYmZkKSArIHNlY3Rpb24tPnJlbF9maWxlcG9zLAotCQkgICAgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBmaXh1cF9zdHJlYW1fc2l6ZSwgYWJmZCkKLQkgICE9IGZpeHVwX3N0cmVhbV9zaXplKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogTGV0IGNhbGxlcnMga25vdyBob3cgbWFueSByZWxvY2F0aW9ucyBmb3VuZC4KLQkgYWxzbyBzYXZlIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBhcyB3ZSB3aWxsCi0JIG5lZWQgaXQgYWdhaW4uICAqLwotICAgICAgc2VjdGlvbi0+cmVsb2NfY291bnQgPSBzb21fc2V0X3JlbG9jX2luZm8gKGV4dGVybmFsX3JlbG9jcywKLQkJCQkJCSBmaXh1cF9zdHJlYW1fc2l6ZSwKLQkJCQkJCSBOVUxMLCBOVUxMLCBOVUxMLCB0cnVlKTsKLQotICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3N0cmVhbSA9IGV4dGVybmFsX3JlbG9jczsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGNhbGxlciBvbmx5IHdhbnRlZCBhIGNvdW50LCB0aGVuIHJldHVybiBub3cuICAqLwotICBpZiAoanVzdF9jb3VudCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBudW1fcmVsb2NzID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGV4dGVybmFsX3JlbG9jcyA9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zdHJlYW07Ci0gIC8qIFJldHVybiBzYXZlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVsb2NhdGlvbnMgaWYgaXQgaXMgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnRlcm5hbF9yZWxvY3MgPSAoYXJlbGVudCAqKSAKLSAgICBiZmRfemFsbG9jIChhYmZkLCAobnVtX3JlbG9jcyAqIHNpemVvZiAoYXJlbGVudCkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSAoYXJlbGVudCAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQcm9jZXNzIGFuZCBpbnRlcm5hbGl6ZSB0aGUgcmVsb2NhdGlvbnMuICAqLwotICBzb21fc2V0X3JlbG9jX2luZm8gKGV4dGVybmFsX3JlbG9jcywgZml4dXBfc3RyZWFtX3NpemUsCi0JCSAgICAgIGludGVybmFsX3JlbG9jcywgc2VjdGlvbiwgc3ltYm9scywgZmFsc2UpOwotCi0gIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgZXh0ZXJuYWwgcmVsb2NhdGlvbnMuICBGcmVlIHRoZW0uICAqLwotICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2Nfc3RyZWFtID0gTlVMTDsKLQotICAvKiBTYXZlIG91ciByZXN1bHRzIGFuZCByZXR1cm4gc3VjY2Vzcy4gICovCi0gIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSByZWxvY2F0aW9uCi0gICBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNlY3Rpb24uICAqLyAKLQotc3RhdGljIGxvbmcKLXNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIC8qIElmIHNlY3Rpb24gaGFzIHJlbG9jYXRpb25zLCB0aGVuIHJlYWQgaW4gdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0gICAgIGFuZCBwYXJzZSBpdCB0byBkZXRlcm1pbmUgaG93IG1hbnkgcmVsb2NhdGlvbnMgZXhpc3QuICAqLwotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKQotICAgIHsKLSAgICAgIGlmICghIHNvbV9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIE5VTEwsIHRydWUpKQotCXJldHVybiAtMTsKLSAgICAgIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci0gICAgfQotICAvKiBUaGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMuICAqLwotICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydCByZWxvY2F0aW9ucyBmcm9tIFNPTSAoZXh0ZXJuYWwpIGZvcm0gaW50byBCRkQgaW50ZXJuYWwKLSAgIGZvcm0uICBSZXR1cm4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBsb25nCi1zb21fY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyOwotICBpbnQgY291bnQ7Ci0KLSAgaWYgKHNvbV9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgZmFsc2UpID09IGZhbHNlKQotICAgIHJldHVybiAtMTsKLQotICBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gIHdoaWxlIChjb3VudC0tKQotICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0gICpyZWxwdHIgPSAoYXJlbGVudCAqKSBOVUxMOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNvbV92ZWM7Ci0KLS8qIEEgaG9vayB0byBzZXQgdXAgb2JqZWN0IGZpbGUgZGVwZW5kZW50IHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIG5ld3NlY3QtPnVzZWRfYnlfYmZkID0KLSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotICBpZiAoIW5ld3NlY3QtPnVzZWRfYnlfYmZkKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMzsKLQotICAvKiBXZSBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgc2VjdGlvbnMgaW50ZXJuYWxseSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBhbnkgcHJpdmF0ZSBpbmZvIHdlIHVuZGVyc3RhbmQgZnJvbSB0aGUgaW5wdXQgc3ltYm9sCi0gICB0byB0aGUgb3V0cHV0IHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkKLSAgICAgYmZkICppYmZkOwotICAgICBhc3ltYm9sICppc3ltYm9sOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKm9zeW1ib2w7Ci17Ci0gIHN0cnVjdCBzb21fc3ltYm9sICppbnB1dF9zeW1ib2wgPSAoc3RydWN0IHNvbV9zeW1ib2wgKikgaXN5bWJvbDsKLSAgc3RydWN0IHNvbV9zeW1ib2wgKm91dHB1dF9zeW1ib2wgPSAoc3RydWN0IHNvbV9zeW1ib2wgKikgb3N5bWJvbDsKLQotICAvKiBPbmUgZGF5IHdlIG1heSB0cnkgdG8gZ3JvayBvdGhlciBwcml2YXRlIGRhdGEuICAqLwotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBvbmx5IHByaXZhdGUgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBjb3B5IGlzIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0gICAgIGJpdHMuICAqLwotICBvdXRwdXRfc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jID0KLSAgICBpbnB1dF9zeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2M7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IHNlY3Rpb24KLSAgIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWN0aW9uOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjdGlvbjsKLXsKLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCAoIXNvbV9pc19zcGFjZSAoaXNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKGlzZWN0aW9uKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEKLSAgICA9IChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKLSAgICAgIGJmZF96YWxsb2MgKG9iZmQsIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtZW1jcHkgKHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLAotCSAgc29tX3NlY3Rpb25fZGF0YSAoaXNlY3Rpb24pLT5jb3B5X2RhdGEsCi0JICBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotCi0gIC8qIFJlcGFyZW50IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyKQotICAgIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgPQotICAgICAgc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IGJmZAotICAgdG8gdGhlIG91dHB1dCBiZmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSB0byBob2xkIHRoZSBkYXRhIHdlIG5lZWQuICAqLwotICBvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCkgPSAoc3RydWN0IHNvbV9leGVjX2RhdGEgKikKLSAgICBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19kYXRhKSk7Ci0gIGlmIChvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IGNvcHkgdGhlIGRhdGEuICAqLwotICBtZW1jcHkgKG9ial9zb21fZXhlY19kYXRhIChvYmZkKSwgb2JqX3NvbV9leGVjX2RhdGEgKGliZmQpLAotCSAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgYmFja2VuZCBpbmZvIGZvciBzZWN0aW9ucyB3aGljaCBjYW4gbm90IGJlIGRlc2NyaWJlZAotICAgaW4gdGhlIEJGRCBkYXRhIHN0cnVjdHVyZXMuICAqLwotCi1ib29sZWFuCi1iZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNlY3Rpb24sIGRlZmluZWQsIHByaXZhdGUsIHNvcnRfa2V5LCBzcG51bSkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGludCBkZWZpbmVkOwotICAgICBpbnQgcHJpdmF0ZTsKLSAgICAgdW5zaWduZWQgaW50IHNvcnRfa2V5OwotICAgICBpbnQgc3BudW07Ci17Ci0gIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBtYWdpYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YQotCT0gKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgYmZkX3phbGxvYyAoc2VjdGlvbi0+b3duZXIsCi0JCSAgICAgIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gICAgICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5ID0gc29ydF9rZXk7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX2RlZmluZWQgPSBkZWZpbmVkOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19wcml2YXRlID0gcHJpdmF0ZTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0gc2VjdGlvbjsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c3BhY2VfbnVtYmVyID0gc3BudW07Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgYmFja2VuZCBpbmZvIGZvciBzdWJzZWN0aW9ucyB3aGljaCBjYW4gbm90IGJlIGRlc2NyaWJlZCAKLSAgIGluIHRoZSBCRkQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLQotYm9vbGVhbgotYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWN0aW9uLCBjb250YWluZXIsIGFjY2VzcywKLQkJCQkgICBzb3J0X2tleSwgcXVhZHJhbnQpCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc2VjdGlvbiAqY29udGFpbmVyOwotICAgICBpbnQgYWNjZXNzOwotICAgICB1bnNpZ25lZCBpbnQgc29ydF9rZXk7Ci0gICAgIGludCBxdWFkcmFudDsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG1hZ2ljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhCi0JPSAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0ICopCi0JICBiZmRfemFsbG9jIChzZWN0aW9uLT5vd25lciwKLQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLSAgICAgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c29ydF9rZXkgPSBzb3J0X2tleTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+YWNjZXNzX2NvbnRyb2xfYml0cyA9IGFjY2VzczsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+cXVhZHJhbnQgPSBxdWFkcmFudDsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0gY29udGFpbmVyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBmdWxsIFNPTSBzeW1ib2wgdHlwZS4gIFNPTSBuZWVkcyBmYXIgbW9yZSBzeW1ib2wgaW5mb3JtYXRpb24KLSAgIHRoYW4gYW55IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdCBJJ20gYXdhcmUgb2YuICBJdCBpcyBtYW5kYXRvcnkKLSAgIHRvIGJlIGFibGUgdG8ga25vdyBpZiBhIHN5bWJvbCBpcyBhbiBlbnRyeSBwb2ludCwgbWlsbGljb2RlLCBkYXRhLAotICAgY29kZSwgYWJzb2x1dGUsIHN0b3JhZ2UgcmVxdWVzdCwgb3IgcHJvY2VkdXJlIGxhYmVsLiAgSWYgeW91IGdldAotICAgdGhlIHN5bWJvbCB0eXBlIHdyb25nIHlvdXIgcHJvZ3JhbSB3aWxsIG5vdCBsaW5rLiAgKi8KLQotdm9pZAotYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUgKHN5bWJvbCwgdHlwZSkKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLXsKLSAgc29tX3N5bWJvbF9kYXRhIChzeW1ib2wpLT5zb21fdHlwZSA9IHR5cGU7Ci19Ci0KLS8qIEF0dGFjaCBhbiBhdXhpbGlhcnkgaGVhZGVyIHRvIHRoZSBCRkQgYmFja2VuZCBzbyB0aGF0IGl0IG1heSBiZQotICAgd3JpdHRlbiBpbnRvIHRoZSBvYmplY3QgZmlsZS4gICovCi1ib29sZWFuCi1iZmRfc29tX2F0dGFjaF9hdXhfaGRyIChhYmZkLCB0eXBlLCBzdHJpbmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHR5cGUgPT0gVkVSU0lPTl9BVVhfSUQpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgICAgIGludCBwYWQgPSAwOwotCi0gICAgICBpZiAobGVuICUgNCkKLQlwYWQgPSAoNCAtIChsZW4gJSA0KSk7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKSA9IChzdHJ1Y3QgdXNlcl9zdHJpbmdfYXV4X2hkciAqKQotCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGF1eF9pZCkKLQkJCSAgICAgICsgc2l6ZW9mICh1bnNpZ25lZCBpbnQpICsgbGVuICsgcGFkKTsKLSAgICAgIGlmICghb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC50eXBlID0gVkVSU0lPTl9BVVhfSUQ7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCA9IGxlbiArIHBhZDsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoICs9IHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5zdHJpbmdfbGVuZ3RoID0gbGVuOwotICAgICAgc3RybmNweSAob2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnVzZXJfc3RyaW5nLCBzdHJpbmcsIGxlbik7Ci0gICAgfQotICBlbHNlIGlmICh0eXBlID09IENPUFlSSUdIVF9BVVhfSUQpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgICAgIGludCBwYWQgPSAwOwotCi0gICAgICBpZiAobGVuICUgNCkKLQlwYWQgPSAoNCAtIChsZW4gJSA0KSk7Ci0gICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpID0gKHN0cnVjdCBjb3B5cmlnaHRfYXV4X2hkciAqKQotCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGF1eF9pZCkKLQkJCSAgICArIHNpemVvZiAodW5zaWduZWQgaW50KSArIGxlbiArIHBhZCk7Ci0gICAgICBpZiAoIW9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLnR5cGUgPSBDT1BZUklHSFRfQVVYX0lEOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCA9IGxlbiArIHBhZDsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggKz0gc2l6ZW9mIChpbnQpOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+c3RyaW5nX2xlbmd0aCA9IGxlbjsKLSAgICAgIHN0cmNweSAob2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+Y29weXJpZ2h0LCBzdHJpbmcpOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEF0dGFjaCBhbiBjb21waWxhdGlvbiB1bml0IGhlYWRlciB0byB0aGUgQkZEIGJhY2tlbmQgc28gdGhhdCBpdCBtYXkgYmUKLSAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1ib29sZWFuCi1iZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0IChhYmZkLCBuYW1lLCBsYW5ndWFnZV9uYW1lLCBwcm9kdWN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9pZCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZV9uYW1lOwotICAgICBjb25zdCBjaGFyICpwcm9kdWN0X2lkOwotICAgICBjb25zdCBjaGFyICp2ZXJzaW9uX2lkOwotewotICBDT01QVU5JVCAqbiA9IChDT01QVU5JVCAqKSBiZmRfemFsbG9jIChhYmZkLCBDT01QVU5JVFNaKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNkZWZpbmUgU1RSRFVQKGYpIFwKLSAgaWYgKGYgIT0gTlVMTCkgXAotICAgIHsgXAotICAgICAgbi0+Zi5uX25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoZikgKyAxKTsgXAotICAgICAgaWYgKG4tPmYubl9uYW1lID09IE5VTEwpIFwKLQlyZXR1cm4gZmFsc2U7IFwKLSAgICAgIHN0cmNweSAobi0+Zi5uX25hbWUsIGYpOyBcCi0gICAgfQotCi0gIFNUUkRVUCAobmFtZSk7Ci0gIFNUUkRVUCAobGFuZ3VhZ2VfbmFtZSk7Ci0gIFNUUkRVUCAocHJvZHVjdF9pZCk7Ci0gIFNUUkRVUCAodmVyc2lvbl9pZCk7Ci0KLSN1bmRlZiBTVFJEVVAKLQotICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGNvdW50ID09IDAgfHwgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGJmZF9zaXplX3R5cGUpKG9mZnNldCtjb3VudCkgPiBzZWN0aW9uLT5fcmF3X3NpemUKLSAgICAgIHx8IGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgIHx8IGJmZF9yZWFkIChsb2NhdGlvbiwgKGJmZF9zaXplX3R5cGUpMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLwotICByZXR1cm4gKHRydWUpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBTZXQgdXAgZml4ZWQgcGFydHMgb2YgdGhlIGZpbGUsIHNwYWNlLCBhbmQgc3Vic3BhY2UgaGVhZGVycy4KLQkgTm90aWZ5IHRoZSB3b3JsZCB0aGF0IG91dHB1dCBoYXMgYmVndW4uICAqLwotICAgICAgc29tX3ByZXBfaGVhZGVycyAoYWJmZCk7Ci0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIC8qIFN0YXJ0IHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpbmNsdWRlIGFsbCB0aGUgc3RyaW5nCi0JIHRhYmxlcywgZml4dXAgc3RyZWFtcywgYW5kIG90aGVyIHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gICAgICBzb21fYmVnaW5fd3JpdGluZyAoYWJmZCk7Ci0gICAgfQotCi0gIC8qIE9ubHkgd3JpdGUgc3Vic3BhY2VzIHdoaWNoIGhhdmUgInJlYWwiIGNvbnRlbnRzIChlZy4gdGhlIGNvbnRlbnRzCi0gICAgIGFyZSBub3QgZ2VuZXJhdGVkIGF0IHJ1biB0aW1lIGJ5IHRoZSBPUykuICAqLwotICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikKLSAgICAgIHx8ICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWVrIHRvIHRoZSBwcm9wZXIgb2Zmc2V0IHdpdGhpbiB0aGUgb2JqZWN0IGZpbGUgYW5kIHdyaXRlIHRoZQotICAgICBkYXRhLiAgKi8KLSAgb2Zmc2V0ICs9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlOyAKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgLyogQWxsb3cgYW55IGFyY2hpdGVjdHVyZSB0byBiZSBzdXBwb3J0ZWQgYnkgdGhlIFNPTSBiYWNrZW5kICovCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNvbV9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJzb21fc2l6ZW9mX2hlYWRlcnMgdW5pbXBsZW1lbnRlZCIpKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotICBhYm9ydCAoKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8KLSAgIFNPTSBzZWN0aW9uIFMsIG9yICc/JyBmb3IgYW4gdW5rbm93biBTT00gc2VjdGlvbi4gICovCi0KLXN0YXRpYyBjaGFyCi1zb21fc2VjdGlvbl90eXBlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlICp0OwotCi0gIGZvciAodCA9ICZzdHRbMF07IHQtPnNlY3Rpb247IHQrKykKLSAgICBpZiAoIXN0cmNtcCAocywgdC0+c2VjdGlvbikpCi0gICAgICByZXR1cm4gdC0+dHlwZTsKLSAgcmV0dXJuICc/JzsKLX0KLQotc3RhdGljIGludAotc29tX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGNoYXIgYzsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnQyc7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdVJzsKLSAgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0knOwotICBpZiAoIShzeW1ib2wtPmZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX0xPQ0FMKSkpCi0gICAgcmV0dXJuICc/JzsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICB8fCAoc29tX3N5bWJvbF9kYXRhIChzeW1ib2wpICE9IE5VTEwKLQkgICYmIHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpKQotICAgIGMgPSAnYSc7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKLSAgICBjID0gc29tX3NlY3Rpb25fdHlwZSAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLSAgZWxzZQotICAgIHJldHVybiAnPyc7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0dMT0JBTCkKLSAgICBjID0gdG91cHBlciAoYyk7Ci0gIHJldHVybiBjOwotfQotCi0vKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgU09NIHN5bWJvbCBTWU1CT0wgaW4gUkVULiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICByZXQtPnR5cGUgPSBzb21fZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpOwotICBpZiAocmV0LT50eXBlICE9ICdVJykKLSAgICByZXQtPnZhbHVlID0gc3ltYm9sLT52YWx1ZStzeW1ib2wtPnNlY3Rpb24tPnZtYTsKLSAgZWxzZQotICAgIHJldC0+dmFsdWUgPSAwOwotICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Ci19Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBOZWNlc3NhcnkKLSAgIHNvIHRoYXQgd2UgY2FuIGFsbG9jYXRlIHNwYWNlIGZvciBhbGwgdGhlIGNhcnN5bXMgYXQgb25jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgKGFiZmQsIGxzdF9oZWFkZXIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBsc3RfaGVhZGVyICpsc3RfaGVhZGVyOwotICAgICBzeW1pbmRleCAqY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBmaWxlX3B0ciBsc3RfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCi0gIGhhc2hfdGFibGUgPSAKLSAgICAodW5zaWduZWQgaW50ICopIGJmZF9tYWxsb2MgKGxzdF9oZWFkZXItPmhhc2hfc2l6ZQotCQkJCSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0X2hlYWRlci0+aGFzaF9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogRG9uJ3QgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIGNvdW50ZXIhICAqLwotICAqY291bnQgPSAwOwotCi0gIC8qIFJlYWQgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUgaGFzIHRhYmxlIGlzIGFuIGFycmF5IG9mIDMyYml0IGZpbGUgb2Zmc2V0cwotICAgICB3aGljaCBwb2ludCB0byB0aGUgaGFzaCBjaGFpbnMuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhhc2hfdGFibGUsIGxzdF9oZWFkZXItPmhhc2hfc2l6ZSwgNCwgYWJmZCkKLSAgICAgICE9IGxzdF9oZWFkZXItPmhhc2hfc2l6ZSAqIDQpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2FsayBlYWNoIGNoYWluIGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3VuZCBvbiB0aGF0IHBhcnRpY3VsYXIKLSAgICAgY2hhaW4uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbHN0X2hlYWRlci0+aGFzaF9zaXplOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkIGxzdF9zeW1ib2w7Ci0KLSAgICAgIC8qIEFuIGVtcHR5IGNoYWluIGhhcyB6ZXJvIGFzIGl0J3MgZmlsZSBvZmZzZXQuICAqLwotICAgICAgaWYgKGhhc2hfdGFibGVbaV0gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlayB0byB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoaXMgaGFzaCBjaGFpbi4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgaGFzaF90YWJsZVtpXSwgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogUmVhZCBpbiB0aGlzIHN5bWJvbCBhbmQgdXBkYXRlIHRoZSBjb3VudGVyLiAgKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgKCpjb3VudCkrKzsKLQotICAgICAgLyogTm93IGl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgc3ltYm9scyBvbiB0aGlzIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChsc3Rfc3ltYm9sLm5leHRfZW50cnkpCi0JewotCi0JICAvKiBTZWVrIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X3N5bWJvbC5uZXh0X2VudHJ5LCBTRUVLX1NFVCkKLQkgICAgICA8IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBSZWFkIHRoZSBzeW1ib2wgaW4gYW5kIHVwZGF0ZSB0aGUgY291bnRlci4gICovCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKGxzdF9zeW1ib2wpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgKCpjb3VudCkrKzsKLQl9Ci0gICAgfQotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBGaWxsIGluIHRoZSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzIChTWU1TKSBmcm9tIHRoZSBhcmNoaXZlIGRlc2NyaWJlZAotICAgYnkgQUJGRCBhbmQgTFNUX0hFQURFUi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyAoYWJmZCwgbHN0X2hlYWRlciwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgbHN0X2hlYWRlciAqbHN0X2hlYWRlcjsKLSAgICAgY2Fyc3ltICoqc3ltczsKLXsKLSAgdW5zaWduZWQgaW50IGksIGxlbjsKLSAgY2Fyc3ltICpzZXQgPSBzeW1zWzBdOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBzdHJ1Y3Qgc29tX2VudHJ5ICpzb21fZGljdCA9IE5VTEw7Ci0gIGZpbGVfcHRyIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgaGFzaF90YWJsZSA9IAotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+aGFzaF9zaXplCi0JCQkJICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKLSAgaWYgKGhhc2hfdGFibGUgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5oYXNoX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzb21fZGljdCA9Ci0gICAgKHN0cnVjdCBzb21fZW50cnkgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+bW9kdWxlX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpOwotICBpZiAoc29tX2RpY3QgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBSZWFkIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGhhcyB0YWJsZSBpcyBhbiBhcnJheSBvZiAzMmJpdCBmaWxlIG9mZnNldHMKLSAgICAgd2hpY2ggcG9pbnQgdG8gdGhlIGhhc2ggY2hhaW5zLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBoYXNoX3RhYmxlLCBsc3RfaGVhZGVyLT5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5oYXNoX3NpemUgKiA0KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFNlZWsgdG8gYW5kIHJlYWQgaW4gdGhlIFNPTSBkaWN0aW9uYXJ5LiAgV2Ugd2lsbCBuZWVkIHRoaXMgdG8gZmlsbAotICAgICBpbiB0aGUgY2Fyc3ltJ3MgZmlsZXBvcyBmaWVsZC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3RfaGVhZGVyLT5kaXJfbG9jLCBTRUVLX1NFVCkgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgc29tX2RpY3QsIGxzdF9oZWFkZXItPm1vZHVsZV9jb3VudCwgCi0JCXNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSksIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdhbGsgZWFjaCBjaGFpbiBmaWxsaW5nIGluIHRoZSBjYXJzeW1zIGFzIHdlIGdvIGFsb25nLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGxzdF9oZWFkZXItPmhhc2hfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCBsc3Rfc3ltYm9sOwotCi0gICAgICAvKiBBbiBlbXB0eSBjaGFpbiBoYXMgemVybyBhcyBpdCdzIGZpbGUgb2Zmc2V0LiAgKi8KLSAgICAgIGlmIChoYXNoX3RhYmxlW2ldID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZWsgdG8gYW5kIHJlYWQgdGhlIGZpcnN0IHN5bWJvbCBvbiB0aGUgY2hhaW4uICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGhhc2hfdGFibGVbaV0sIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGZpcnN0IGdldCB0aGUgbGVuZ3RoIHdoaWNoIGlzIHN0b3JlZAotCSBhcyBhIDMyYml0IGludGVnZXIganVzdCBiZWZvcmUgdGhlIHN5bWJvbC4KLQotCSBPbmUgbWlnaHQgYXNrIHdoeSB3ZSBkb24ndCBqdXN0IHJlYWQgaW4gdGhlIGVudGlyZSBzdHJpbmcgdGFibGUKLQkgYW5kIGluZGV4IGludG8gaXQuICBXZWxsLCBhY2NvcmRpbmcgdG8gdGhlIFNPTSBBQkkgdGhlIHN0cmluZwotCSBpbmRleCBjYW4gcG9pbnQgKmFueXdoZXJlKiBpbiB0aGUgYXJjaGl2ZSB0byBzYXZlIHNwYWNlLCBzbyBqdXN0Ci0JIHVzaW5nIHRoZSBzdHJpbmcgdGFibGUgd291bGQgbm90IGJlIHNhZmUuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPnN0cmluZ19sb2MKLQkJCSAgICArIGxzdF9zeW1ib2wubmFtZS5uX3N0cnggLSA0LCBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDQsIGFiZmQpICE9IDQpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZSBhbmQgbnVsbCB0ZXJtaW5hdGUgaXQgdG9vLiAgKi8KLSAgICAgIHNldC0+bmFtZSA9IGJmZF96YWxsb2MgKGFiZmQsIGxlbiArIDEpOwotICAgICAgaWYgKCFzZXQtPm5hbWUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKHNldC0+bmFtZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNldC0+bmFtZVtsZW5dID0gMDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlsZSBvZmZzZXQuICBOb3RlIHRoYXQgdGhlICJsb2NhdGlvbiIgZmllbGQgcG9pbnRzCi0JIHRvIHRoZSBTT00gaXRzZWxmLCBub3QgdGhlIGFyX2hkciBpbiBmcm9udCBvZiBpdC4gICovCi0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gc29tX2RpY3RbbHN0X3N5bWJvbC5zb21faW5kZXhdLmxvY2F0aW9uCi0JCQkgIC0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLQotICAgICAgLyogR28gdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KLSAgICAgIHNldCsrOwotCi0gICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChsc3Rfc3ltYm9sLm5leHRfZW50cnkpCi0JewotCSAgLyogU2VlayB0byB0aGUgbmV4dCBzeW1ib2wgYW5kIHJlYWQgaXQgaW4uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9zeW1ib2wubmV4dF9lbnRyeSwgU0VFS19TRVQpIDwwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9zeW1ib2wsIDEsIHNpemVvZiAobHN0X3N5bWJvbCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFNlZWsgdG8gdGhlIG5hbWUgbGVuZ3RoICYgc3RyaW5nIGFuZCByZWFkIHRoZW0gaW4uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPnN0cmluZ19sb2MgCi0JCQkJKyBsc3Rfc3ltYm9sLm5hbWUubl9zdHJ4IC0gNCwgU0VFS19TRVQpIDwgMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChiZmRfcmVhZCAoJmxlbiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZSBhbmQgbnVsbCB0ZXJtaW5hdGUgaXQgdG9vLiAgKi8KLQkgIHNldC0+bmFtZSA9IGJmZF96YWxsb2MgKGFiZmQsIGxlbiArIDEpOwotCSAgaWYgKCFzZXQtPm5hbWUpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKHNldC0+bmFtZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgc2V0LT5uYW1lW2xlbl0gPSAwOwotCi0JICAvKiBGaWxsIGluIHRoZSBmaWxlIG9mZnNldC4gIE5vdGUgdGhhdCB0aGUgImxvY2F0aW9uIiBmaWVsZCBwb2ludHMKLQkgICAgIHRvIHRoZSBTT00gaXRzZWxmLCBub3QgdGhlIGFyX2hkciBpbiBmcm9udCBvZiBpdC4gICovCi0JICBzZXQtPmZpbGVfb2Zmc2V0ID0gc29tX2RpY3RbbHN0X3N5bWJvbC5zb21faW5kZXhdLmxvY2F0aW9uCi0JCQkgICAgICAgLSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCi0JICAvKiBHbyBvbiB0byB0aGUgbmV4dCBzeW1ib2wuICAqLwotCSAgc2V0Kys7Ci0JfQotICAgIH0KLSAgLyogSWYgd2UgaGF2ZW4ndCBkaWVkIGJ5IG5vdywgdGhlbiB3ZSBzdWNjZXNzZnVsbHkgcmVhZCB0aGUgZW50aXJlIAotICAgICBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIHRoZSBMU1QgZnJvbSB0aGUgYXJjaGl2ZS4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBhcl9oZHIgYXJfaGVhZGVyOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgLyogU3BlY2lhbCBjYXNlcy4gICovCi0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRm9yIGFyY2hpdmVzIHdpdGhvdXQgLm8gZmlsZXMgdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZWFkIGluIGFuZCBzYW5pdHkgY2hlY2sgdGhlIGFyY2hpdmUgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmYXJfaGVhZGVyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN0cm5jbXAgKGFyX2hlYWRlci5hcl9mbWFnLCBBUkZNQUcsIDIpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEhvdyBiaWcgaXMgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGVudHJ5PyAgKi8KLSAgZXJybm8gPSAwOwotICBwYXJzZWRfc2l6ZSA9IHN0cnRvbCAoYXJfaGVhZGVyLmFyX3NpemUsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2F2ZSBvZmYgdGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWFsIHVzZXIgZGF0YS4gICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpICsgcGFyc2VkX3NpemU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgbGlicmFyeSBzeW1ib2wgdGFibGUuICBXZSdsbCBtYWtlIGhlYXZ5IHVzZSBvZiB0aGlzCi0gICAgIGluIGp1c3QgYSBtaW51dGUuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X2hlYWRlciwgMSwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgaWYgKGxzdF9oZWFkZXIuYV9tYWdpYyAhPSBMSUJNQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyAoYWJmZCwgJmxzdF9oZWFkZXIsICZhcmRhdGEtPnN5bWRlZl9jb3VudCkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyAtIHBhcnNlZF9zaXplIAotCQkJKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW5pdGlhbGl6YWUgdGhlIGNhY2hlIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpYnJhcnkgc3ltYm9scy4gICovCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKLQkJCQkJICAgKiBzaXplb2YgKGNhcnN5bSkpKTsKLSAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyBmaWxsIGluIHRoZSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzLiAgKi8KLSAgaWYgKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzIChhYmZkLCAmbHN0X2hlYWRlciwgJmFyZGF0YS0+c3ltZGVmcykKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTZWVrIGJhY2sgdG8gdGhlICJmaXJzdCIgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIE5vdGUgdGhlICJmaXJzdCIKLSAgICAgZmlsZSBtYXkgYmUgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3RpZnkgdGhlIGdlbmVyaWMgYXJjaGl2ZSBjb2RlIHRoYXQgd2UgaGF2ZSBhIHN5bWJvbCBtYXAuICAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQmVnaW4gcHJlcGFyaW5nIHRvIHdyaXRlIGEgU09NIGxpYnJhcnkgc3ltYm9sIHRhYmxlLgotCi0gICBBcyBwYXJ0IG9mIHRoZSBwcmVwIHdvcmsgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzeW1ib2xzCi0gICBhbmQgdGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSAoYWJmZCwgbnVtX3N5bXMsIHN0cmluZ3NpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50ICpudW1fc3ltcywgKnN0cmluZ3NpemU7Ci17Ci0gIGJmZCAqY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0KLSAgLyogU29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gICpudW1fc3ltcyA9IDA7Ci0gICpzdHJpbmdzaXplID0gMDsKLQotICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBCRkQgd2l0aGluIHRoaXMgYXJjaGl2ZS4gICovCi0gIHdoaWxlIChjdXJyX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBpOwotICAgICAgc29tX3N5bWJvbF90eXBlICpzeW07Ci0KLSAgICAgIC8qIERvbid0IGJvdGhlciBmb3Igbm9uLVNPTSBvYmplY3RzLiAgKi8KLSAgICAgIGlmIChjdXJyX2JmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QKLQkgIHx8IGN1cnJfYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0JewotCSAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gcmVhZCwgdGhlbiBzbmFnIGEgcG9pbnRlcgotCSB0byBpdC4gIEl0J3MgYSBsaXR0bGUgc2xpbWV5IHRvIGdyYWIgdGhlIHN5bWJvbHMgdmlhIG9ial9zb21fc3ltdGFiLAotCSBidXQgZG9pbmcgc28gYXZvaWRzIGFsbG9jYXRpbmcgbG90cyBvZiBleHRyYSBtZW1vcnkuICAqLwotICAgICAgaWYgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGN1cnJfYmZkKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN5bSA9IG9ial9zb21fc3ltdGFiIChjdXJyX2JmZCk7Ci0gICAgICBjdXJyX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoY3Vycl9iZmQpOwotCi0gICAgICAvKiBFeGFtaW5lIGVhY2ggc3ltYm9sIHRvIGRldGVybWluZSBpZiBpdCBiZWxvbmdzIGluIHRoZQotCSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY3Vycl9jb3VudDsgaSsrLCBzeW0rKykKLQl7Ci0JICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gaW5mbzsKLQotCSAgLyogRGVyaXZlIFNPTSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgc3ltYm9sLiAgKi8KLQkgIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGN1cnJfYmZkLCAmc3ltLT5zeW1ib2wsICZpbmZvKTsKLQotCSAgLyogU2hvdWxkIHdlIGluY2x1ZGUgdGhpcyBzeW1ib2w/ICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfTlVMTAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfU1lNX0VYVAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfQVJHX0VYVCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE9ubHkgZ2xvYmFsIHN5bWJvbHMgYW5kIHVuc2F0aXNmaWVkIGNvbW1vbnMuICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3Njb3BlICE9IFNTX1VOSVZFUlNBTAotCSAgICAgICYmIGluZm8uc3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIERvIG5vIGluY2x1ZGUgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBCdW1wIHRoZSB2YXJpb3VzIGNvdW50ZXJzLCBiZWluZyBjYXJlZnVsIHRvIGhvbm9yCi0JICAgICBhbGlnbm1lbnQgY29uc2lkZXJhdGlvbnMgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICAoKm51bV9zeW1zKSsrOwotCSAgKnN0cmluZ3NpemUgPSAqc3RyaW5nc2l6ZSArIHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgKyA1OwotCSAgd2hpbGUgKCpzdHJpbmdzaXplICUgNCkKLQkgICAgKCpzdHJpbmdzaXplKSsrOwotCX0KLQotICAgICAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYXNoIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHByZXNlbnRlZCBpbiB0aGUKLSAgIFNPTSBBQkkuICAqLwotc3RhdGljIHVuc2lnbmVkIGludAotc29tX2JmZF9hcl9zeW1ib2xfaGFzaCAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4gKHN5bWJvbC0+bmFtZSk7Ci0KLSAgLyogTmFtZXMgd2l0aCBsZW5ndGggMSBhcmUgc3BlY2lhbC4gICovCi0gIGlmIChsZW4gPT0gMSkKLSAgICByZXR1cm4gMHgxMDAwMTAwIHwgKHN5bWJvbC0+bmFtZVswXSA8PCAxNikgfCBzeW1ib2wtPm5hbWVbMF07Ci0KLSAgcmV0dXJuICgobGVuICYgMHg3ZikgPDwgMjQpIHwgKHN5bWJvbC0+bmFtZVsxXSA8PCAxNikKLQkgIHwgKHN5bWJvbC0+bmFtZVtsZW4tMl0gPDwgOCkgfCBzeW1ib2wtPm5hbWVbbGVuLTFdOwotfQotCi0vKiBEbyB0aGUgYnVsayBvZiB0aGUgd29yayByZXF1aXJlZCB0byB3cml0ZSB0aGUgU09NIGxpYnJhcnkKLSAgIHN5bWJvbCB0YWJsZS4gICovCi0gICAKLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiAoYWJmZCwgbnN5bXMsIHN0cmluZ19zaXplLCBsc3QsIGVsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG5zeW1zLCBzdHJpbmdfc2l6ZTsKLSAgICAgc3RydWN0IGxzdF9oZWFkZXIgbHN0OwotICAgICB1bnNpZ25lZCBlbGVuZ3RoOwotewotICBmaWxlX3B0ciBsc3RfZmlsZXBvczsKLSAgY2hhciAqc3RyaW5ncyA9IE5VTEwsICpwOwotICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKmxzdF9zeW1zID0gTlVMTCwgKmN1cnJfbHN0X3N5bTsKLSAgYmZkICpjdXJyX2JmZDsKLSAgdW5zaWduZWQgaW50ICpoYXNoX3RhYmxlID0gTlVMTDsKLSAgc3RydWN0IHNvbV9lbnRyeSAqc29tX2RpY3QgPSBOVUxMOwotICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKipsYXN0X2hhc2hfZW50cnkgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgY3Vycl9zb21fb2Zmc2V0LCBzb21faW5kZXggPSAwOwotCi0gIGhhc2hfdGFibGUgPQotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0Lmhhc2hfc2l6ZSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0Lmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBzb21fZGljdCA9Ci0gICAgKHN0cnVjdCBzb21fZW50cnkgKikgYmZkX21hbGxvYyAobHN0Lm1vZHVsZV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKTsKLSAgaWYgKHNvbV9kaWN0ID09IE5VTEwgJiYgbHN0Lm1vZHVsZV9jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGxhc3RfaGFzaF9lbnRyeSA9Ci0gICAgKChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKiopCi0gICAgIGJmZF9tYWxsb2MgKGxzdC5oYXNoX3NpemUgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqKSkpOwotICBpZiAobGFzdF9oYXNoX2VudHJ5ID09IE5VTEwgJiYgbHN0Lmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvdHMgb2YgZmllbGRzIGFyZSBmaWxlIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQKLSAgICAgb2YgdGhlIGxzdCByZWNvcmQuICBTbyBzYXZlIGl0cyBsb2NhdGlvbi4gICovCi0gIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgLyogU29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gIG1lbXNldCAoaGFzaF90YWJsZSwgMCwgNCAqIGxzdC5oYXNoX3NpemUpOwotICBtZW1zZXQgKHNvbV9kaWN0LCAwLCBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSk7Ci0gIG1lbXNldCAobGFzdF9oYXNoX2VudHJ5LCAwLCAJCi0JICBsc3QuaGFzaF9zaXplICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKikpOwotCi0gIC8qIFN5bWJvbHMgaGF2ZSBzb21faW5kZXggZmllbGRzLCBzbyB3ZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIGluZGV4IG9mIGVhY2ggU09NIGluIHRoZSBhcmNoaXZlLgotCi0gICAgIFRoZSBTT00gZGljdGlvbmFyeSBoYXMgKGFtb25nIG90aGVyIHRoaW5ncykgdGhlIGFic29sdXRlIGZpbGUKLSAgICAgcG9zaXRpb24gZm9yIHRoZSBTT00gd2hpY2ggYSBwYXJ0aWN1bGFyIGRpY3Rpb25hcnkgZW50cnkKLSAgICAgZGVzY3JpYmVzLiAgV2UgaGF2ZSB0byBjb21wdXRlIHRoYXQgaW5mb3JtYXRpb24gYXMgd2UgaXRlcmF0ZQotICAgICB0aHJvdWdoIHRoZSBTT01zL3N5bWJvbHMuICAqLwotICBzb21faW5kZXggPSAwOwotCi0gIC8qIFdlIGFkZCBpbiB0aGUgc2l6ZSBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgdHdpY2UgYXMgdGhlIGxvY2F0aW9uCi0gICAgIGluIHRoZSBTT00gZGljdGlvbmFyeSBpcyB0aGUgYWN0dWFsIG9mZnNldCBvZiB0aGUgU09NLCBub3QgdGhlCi0gICAgIGFyY2hpdmUgaGVhZGVyIGJlZm9yZSB0aGUgU09NLiAgKi8KLSAgY3Vycl9zb21fb2Zmc2V0ID0gOCArIDIgKiBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgbHN0LmZpbGVfZW5kOwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGFyY2hpdmUgaGVhZGVyIGFuZCB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgIGV4dGVuZGVkIHN0cmluZyB0YWJsZS4gIE5vdGUgdGhhdCBlbGVuZ3RoIGluY2x1ZGVzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUhICAqLwotICBpZiAoZWxlbmd0aCkKLSAgICBjdXJyX3NvbV9vZmZzZXQgKz0gZWxlbmd0aDsKLQotICAvKiBNYWtlIHN1cmUgd2UncmUgcHJvcGVybHkgYWxpZ25lZC4gICovCi0gIGN1cnJfc29tX29mZnNldCA9IChjdXJyX3NvbV9vZmZzZXQgKyAweDEpICYgfjB4MTsKLQotICAvKiBGSVhNRSBzaG91bGQgYmUgZG9uZSB3aXRoIGJ1ZmZlcnMganVzdCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZS4uLiAqLwotICBsc3Rfc3ltcyA9IGJmZF9tYWxsb2MgKG5zeW1zICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpKTsKLSAgaWYgKGxzdF9zeW1zID09IE5VTEwgJiYgbnN5bXMgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgc3RyaW5ncyA9IGJmZF9tYWxsb2MgKHN0cmluZ19zaXplKTsKLSAgaWYgKHN0cmluZ3MgPT0gTlVMTCAmJiBzdHJpbmdfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHAgPSBzdHJpbmdzOwotICBjdXJyX2xzdF9zeW0gPSBsc3Rfc3ltczsKLQotICBjdXJyX2JmZCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgd2hpbGUgKGN1cnJfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGN1cnJfY291bnQsIGk7Ci0gICAgICBzb21fc3ltYm9sX3R5cGUgKnN5bTsKLQotICAgICAgLyogRG9uJ3QgYm90aGVyIGZvciBub24tU09NIG9iamVjdHMuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdAotCSAgfHwgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQl7Ci0JICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbiByZWFkLCB0aGVuIHNuYWcgYSBwb2ludGVyCi0JIHRvIGl0LiAgSXQncyBhIGxpdHRsZSBzbGltZXkgdG8gZ3JhYiB0aGUgc3ltYm9scyB2aWEgb2JqX3NvbV9zeW10YWIsCi0JIGJ1dCBkb2luZyBzbyBhdm9pZHMgYWxsb2NhdGluZyBsb3RzIG9mIGV4dHJhIG1lbW9yeS4gICovCi0gICAgICBpZiAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoY3Vycl9iZmQpID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzeW0gPSBvYmpfc29tX3N5bXRhYiAoY3Vycl9iZmQpOwotICAgICAgY3Vycl9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGN1cnJfYmZkKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJfY291bnQ7IGkrKywgc3ltKyspCi0JewotCSAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87Ci0KLQkgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCi0JICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChjdXJyX2JmZCwgJnN5bS0+c3ltYm9sLCAmaW5mbyk7Ci0KLQkgIC8qIFNob3VsZCB3ZSBpbmNsdWRlIHRoaXMgc3ltYm9sPyAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF90eXBlID09IFNUX05VTEwKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX1NZTV9FWFQKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX0FSR19FWFQpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBPbmx5IGdsb2JhbCBzeW1ib2xzIGFuZCB1bnNhdGlzZmllZCBjb21tb25zLiAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF9zY29wZSAhPSBTU19VTklWRVJTQUwKLQkgICAgICAmJiBpbmZvLnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBEbyBubyBpbmNsdWRlIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c3ltYm9sLnNlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3ltYm9sIGZyb20gdGhpcyBTT00sIHRoZW4gdXBkYXRlCi0JICAgICB0aGUgU09NIGRpY3Rpb25hcnkgdG9vLiAgKi8KLQkgIGlmIChzb21fZGljdFtzb21faW5kZXhdLmxvY2F0aW9uID09IDApCi0JICAgIHsKLQkgICAgICBzb21fZGljdFtzb21faW5kZXhdLmxvY2F0aW9uID0gY3Vycl9zb21fb2Zmc2V0OwotCSAgICAgIHNvbV9kaWN0W3NvbV9pbmRleF0ubGVuZ3RoID0gYXJlbHRfc2l6ZSAoY3Vycl9iZmQpOwotCSAgICB9Ci0KLQkgIC8qIEZpbGwgaW4gdGhlIGxzdCBzeW1ib2wgcmVjb3JkLiAgKi8KLQkgIGN1cnJfbHN0X3N5bS0+aGlkZGVuID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+c2Vjb25kYXJ5X2RlZiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF90eXBlID0gaW5mby5zeW1ib2xfdHlwZTsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3Njb3BlID0gaW5mby5zeW1ib2xfc2NvcGU7Ci0JICBjdXJyX2xzdF9zeW0tPmNoZWNrX2xldmVsID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+bXVzdF9xdWFsaWZ5ID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+aW5pdGlhbGx5X2Zyb3plbiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPm1lbW9yeV9yZXNpZGVudCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPmlzX2NvbW1vbiA9IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbik7Ci0JICBjdXJyX2xzdF9zeW0tPmR1cF9jb21tb24gPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT54bGVhc3QgPSAzOwotCSAgY3Vycl9sc3Rfc3ltLT5hcmdfcmVsb2MgPSBpbmZvLmFyZ19yZWxvYzsKLQkgIGN1cnJfbHN0X3N5bS0+bmFtZS5uX3N0cnggPSBwIC0gc3RyaW5ncyArIDQ7Ci0JICBjdXJyX2xzdF9zeW0tPnF1YWxpZmllcl9uYW1lLm5fc3RyeCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9pbmZvID0gaW5mby5zeW1ib2xfaW5mbzsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3ZhbHVlID0gaW5mby5zeW1ib2xfdmFsdWUgfCBpbmZvLnByaXZfbGV2ZWw7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9kZXNjcmlwdG9yID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+cmVzZXJ2ZWQgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5zb21faW5kZXggPSBzb21faW5kZXg7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgPSBzb21fYmZkX2FyX3N5bWJvbF9oYXNoICgmc3ltLT5zeW1ib2wpOwotCSAgY3Vycl9sc3Rfc3ltLT5uZXh0X2VudHJ5ID0gMDsKLQotCSAgLyogSW5zZXJ0IGludG8gdGhlIGhhc2ggdGFibGUuICAqLwotCSAgaWYgKGhhc2hfdGFibGVbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0pCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKnRtcDsKLQotCSAgICAgIC8qIFRoZXJlIGlzIGFscmVhZHkgc29tZXRoaW5nIGF0IHRoZSBoZWFkIG9mIHRoaXMgaGFzaCBjaGFpbiwKLQkJIHNvIHRhY2sgdGhpcyBzeW1ib2wgb250byB0aGUgZW5kIG9mIHRoZSBjaGFpbi4gICovCi0JICAgICAgdG1wID0gbGFzdF9oYXNoX2VudHJ5W2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdOwotCSAgICAgIHRtcC0+bmV4dF9lbnRyeQotCQk9IChjdXJyX2xzdF9zeW0gLSBsc3Rfc3ltcykgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkKLQkJICArIGxzdC5oYXNoX3NpemUgKiA0IAotCQkgICsgbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkKLQkJICArIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGaXJzdCBlbnRyeSBpbiB0aGlzIGhhc2ggY2hhaW4uICAqLwotCSAgICAgIGhhc2hfdGFibGVbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0KLQkJPSAoY3Vycl9sc3Rfc3ltIC0gbHN0X3N5bXMpICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpCi0JCSAgKyBsc3QuaGFzaF9zaXplICogNCAKLQkJICArIGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQkgICAgfQotCi0JICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN5bWJvbCB3ZSBhZGRlZCB0byB0aGlzIGNoYWluIHNvIHdlIGNhbgotCSAgICAgZWFzaWx5IHVwZGF0ZSBpdHMgbmV4dF9lbnRyeSBwb2ludGVyLiAgKi8KLQkgIGxhc3RfaGFzaF9lbnRyeVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXQotCSAgICA9IGN1cnJfbHN0X3N5bTsKLQotCi0JICAvKiBVcGRhdGUgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICBiZmRfcHV0XzMyIChhYmZkLCBzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpLCBwKTsKLQkgIHAgKz0gNDsKLQkgIHN0cmNweSAocCwgc3ltLT5zeW1ib2wubmFtZSk7Ci0JICBwICs9IHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgKyAxOwotCSAgd2hpbGUgKChpbnQpcCAlIDQpCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDAsIHApOwotCSAgICAgIHArKzsKLQkgICAgfQotCi0JICAvKiBIZWFkIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBjdXJyX2xzdF9zeW0rKzsKLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2Ygd2hlcmUgZWFjaCBTT00gd2lsbCBmaW5hbGx5IHJlc2lkZTsgdGhlbiBsb29rCi0JIGF0IHRoZSBuZXh0IEJGRC4gICovCi0gICAgICBjdXJyX3NvbV9vZmZzZXQgKz0gYXJlbHRfc2l6ZSAoY3Vycl9iZmQpICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLSAKLSAgICAgIC8qIEEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGFyY2hpdmUgbWF5IGhhdmUgYW4gb2RkIGxlbmd0aDsgdGhlCi0JIGxpbmtlciByZXF1aXJlcyBvYmplY3RzIGJlZ2luIG9uIGFuIGV2ZW4gYm91bmRhcnkuICBTbyByb3VuZAotCSB1cCB0aGUgY3VycmVudCBvZmZzZXQgYXMgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGN1cnJfc29tX29mZnNldCA9IChjdXJyX3NvbV9vZmZzZXQgKyAweDEpICYgfjB4MTsKLSAgICAgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0gICAgICBzb21faW5kZXgrKzsKLSAgICB9Ci0KLSAgLyogTm93IHNjcmliYmxlIG91dCB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2hfdGFibGUsIGxzdC5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3QuaGFzaF9zaXplICogNCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGVuIHRoZSBTT00gZGljdGlvbmFyeS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9kaWN0LCBsc3QubW9kdWxlX2NvdW50LAotCQkgc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSwgYWJmZCkKLSAgICAgICE9IGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBsaWJyYXJ5IHN5bWJvbHMuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBsc3Rfc3ltcywgbnN5bXMsIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSwgYWJmZCkKLSAgICAgICE9IG5zeW1zICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEFuZCBmaW5hbGx5IHRoZSBzdHJpbmdzLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc3RyaW5ncywgc3RyaW5nX3NpemUsIDEsIGFiZmQpICE9IHN0cmluZ19zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSAhPSBOVUxMKQotICAgIGZyZWUgKGxhc3RfaGFzaF9lbnRyeSk7Ci0gIGlmIChsc3Rfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGxzdF9zeW1zKTsKLSAgaWYgKHN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzdHJpbmdzKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSAhPSBOVUxMKQotICAgIGZyZWUgKGxhc3RfaGFzaF9lbnRyeSk7Ci0gIGlmIChsc3Rfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGxzdF9zeW1zKTsKLSAgaWYgKHN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzdHJpbmdzKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgTFNUIGZvciB0aGUgYXJjaGl2ZS4KLQotICAgWW91J2xsIG5ldmVyIGJlbGlldmUgdGhpcyBpcyByZWFsbHkgaG93IGFybWFwcyBhcmUgaGFuZGxlZCBpbiBTT00uLi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBiZmQgKmN1cnJfYmZkOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaSwgbHN0X3NpemUsIG5zeW1zLCBzdHJpbmdzaXplOwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IGxzdF9oZWFkZXIgbHN0OwotICBpbnQgKnA7Ci0gCi0gIC8qIFdlJ2xsIHVzZSB0aGlzIGZvciB0aGUgYXJjaGl2ZSdzIGRhdGUgYW5kIG1vZGUgbGF0ZXIuICAqLwotICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBGdWRnZSBmYWN0b3IuICAqLwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIDYwOwotCi0gIC8qIEFjY291bnQgZm9yIHRoZSBsc3QgaGVhZGVyIGZpcnN0LiAgKi8KLSAgbHN0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQotICAvKiBTdGFydCBidWlsZGluZyB0aGUgTFNUIGhlYWRlci4gICovCi0gIC8qIEZJWE1FOiAgRG8gd2UgbmVlZCB0byBleGFtaW5lIGVhY2ggZWxlbWVudCB0byBkZXRlcm1pbmUgdGhlCi0gICAgIGxhcmdlc3QgaWQgbnVtYmVyPyAgKi8KLSAgbHN0LnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotICBsc3QuYV9tYWdpYyA9IExJQk1BR0lDOwotICBsc3QudmVyc2lvbl9pZCA9IFZFUlNJT05fSUQ7Ci0gIGxzdC5maWxlX3RpbWUuc2VjcyA9IDA7Ci0gIGxzdC5maWxlX3RpbWUubmFub3NlY3MgPSAwOwotCi0gIGxzdC5oYXNoX2xvYyA9IGxzdF9zaXplOwotICBsc3QuaGFzaF9zaXplID0gU09NX0xTVF9IQVNIX1NJWkU7Ci0KLSAgLyogSGFzaCB0YWJsZSBpcyBhIFNPTV9MU1RfSEFTSF9TSVpFIDMyYml0IG9mZnNldHMuICAqLwotICBsc3Rfc2l6ZSArPSA0ICogU09NX0xTVF9IQVNIX1NJWkU7Ci0KLSAgLyogV2UgbmVlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIFNPTXMgaW4gdGhpcyBhcmNoaXZlLiAgKi8KLSAgY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIGxzdC5tb2R1bGVfY291bnQgPSAwOwotICB3aGlsZSAoY3Vycl9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBPbmx5IHRydWUgU09NIG9iamVjdHMgY291bnQuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdAotCSAgJiYgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQlsc3QubW9kdWxlX2NvdW50Kys7Ci0gICAgICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotICAgIH0KLSAgbHN0Lm1vZHVsZV9saW1pdCA9IGxzdC5tb2R1bGVfY291bnQ7Ci0gIGxzdC5kaXJfbG9jID0gbHN0X3NpemU7Ci0gIGxzdF9zaXplICs9IHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkgKiBsc3QubW9kdWxlX2NvdW50OwotCi0gIC8qIFdlIGRvbid0IHN1cHBvcnQgaW1wb3J0L2V4cG9ydCB0YWJsZXMsIGF1eGlsaWFyeSBoZWFkZXJzLAotICAgICBvciBmcmVlIGxpc3RzIHlldC4gIE1ha2UgdGhlIGxpbmtlciB3b3JrIGEgbGl0dGxlIGhhcmRlcgotICAgICB0byBtYWtlIG91ciBsaWZlIGVhc2llci4gICovCi0KLSAgbHN0LmV4cG9ydF9sb2MgPSAwOwotICBsc3QuZXhwb3J0X2NvdW50ID0gMDsKLSAgbHN0LmltcG9ydF9sb2MgPSAwOwotICBsc3QuYXV4X2xvYyA9IDA7Ci0gIGxzdC5hdXhfc2l6ZSA9IDA7Ci0KLSAgLyogQ291bnQgaG93IG1hbnkgc3ltYm9scyB3ZSB3aWxsIGhhdmUgb24gdGhlIGhhc2ggY2hhaW5zIGFuZCB0aGUKLSAgICAgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSAoYWJmZCwgJm5zeW1zLCAmc3RyaW5nc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxzdF9zaXplICs9IHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSAqIG5zeW1zOwotCi0gIC8qIEZvciB0aGUgc3RyaW5nIHRhYmxlLiAgT25lIGRheSB3ZSBtaWdodCBhY3R1YWxseSB1c2UgdGhpcyBpbmZvCi0gICAgIHRvIGF2b2lkIHNtYWxsIHNlZWtzL3JlYWRzIHdoZW4gcmVhZGluZyBhcmNoaXZlcy4gICovCi0gIGxzdC5zdHJpbmdfbG9jID0gbHN0X3NpemU7Ci0gIGxzdC5zdHJpbmdfc2l6ZSA9IHN0cmluZ3NpemU7Ci0gIGxzdF9zaXplICs9IHN0cmluZ3NpemU7Ci0KLSAgLyogU09NIEFCSSBzYXlzIHRoaXMgbXVzdCBiZSB6ZXJvLiAgKi8KLSAgbHN0LmZyZWVfbGlzdCA9IDA7Ci0gIGxzdC5maWxlX2VuZCA9IGxzdF9zaXplOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtLiAgTXVzdCBoYXBwZW4gYWZ0ZXIgdGhlIGVudGlyZSBsc3QgaGVhZGVyCi0gICAgIGhhcyBmaWxsZWQgaW4uICAqLwotICBwID0gKGludCAqKSZsc3Q7Ci0gIGxzdC5jaGVja3N1bSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKS9zaXplb2YgKGludCkgLSAxOyBpKyspCi0gICAgbHN0LmNoZWNrc3VtIF49ICpwKys7Ci0KLSAgc3ByaW50ZiAoaGRyLmFyX25hbWUsICIvICAgICAgICAgICAgICAgIik7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYWJmZCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgZ2V0dWlkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSBnZXRnaWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfbW9kZSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0YnVmLnN0X21vZGUpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbHN0X3NpemUpOwotICBoZHIuYXJfZm1hZ1swXSA9ICdgJzsKLSAgaGRyLmFyX2ZtYWdbMV0gPSAnXDAxMic7Ci0KLSAgLyogVHVybiBhbnkgbnVsbHMgaW50byBzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIGFyIGhlYWRlci4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgc2NyaWJibGUgb3V0IHRoZSBsc3QgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmxzdCwgMSwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQnVpbGQgYW5kIHdyaXRlIHRoZSBhcm1hcC4gICovCi0gIGlmIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiAoYWJmZCwgbnN5bXMsIHN0cmluZ3NpemUsIGxzdCwgZWxlbmd0aCkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIERvbmUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnJlZSBhbGwgaW5mb3JtYXRpb24gd2UgaGF2ZSBjYWNoZWQgZm9yIHRoaXMgQkZELiAgV2UgY2FuIGFsd2F5cwotICAgcmVhZCBpdCBhZ2FpbiBsYXRlciBpZiB3ZSBuZWVkIGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbzsKLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNkZWZpbmUgRlJFRSh4KSBpZiAoeCAhPSBOVUxMKSB7IGZyZWUgKHgpOyB4ID0gTlVMTDsgfQotICAvKiBGcmVlIHRoZSBuYXRpdmUgc3RyaW5nIGFuZCBzeW1ib2wgdGFibGVzLiAgKi8KLSAgRlJFRSAob2JqX3NvbV9zeW10YWIgKGFiZmQpKTsKLSAgRlJFRSAob2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIEZyZWUgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IC0xOwotICAgICAgRlJFRSAoc29tX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jX3N0cmVhbSk7Ci0gICAgICAvKiBGcmVlIHRoZSBnZW5lcmljIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIEZSRUUgKG8tPnJlbG9jYXRpb24pOwotICAgIH0KLSN1bmRlZiBGUkVFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBvZiBtaXNjZWxsYW5lb3VzIHN1cHBvcnQgZnVuY3Rpb25zLiAqLwotCi0vKiBMaW5rZXIgc3VwcG9ydCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIChzb21faXNfc3Vic3BhY2UgKHNlYykgJiYgc2VjLT5fcmF3X3NpemUgPiAyNDAwMDApOwotfQotCi0jZGVmaW5lCXNvbV9jbG9zZV9hbmRfY2xlYW51cAkJc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgc29tX3JlYWRfYXJfaGRyCQkJX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIHNvbV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIHNvbV9nZXRfZWx0X2F0X2luZGV4CQlfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBzb21fZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgc29tX3RydW5jYXRlX2FybmFtZQkJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgc29tX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIHNvbV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIHNvbV91cGRhdGVfYXJtYXBfdGltZXN0YW1wCWJmZF90cnVlCi0jZGVmaW5lIHNvbV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgc29tX2dldF9saW5lbm8gICAgICAgICAgICAgICAgICBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHNvbV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wJX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNvbV9yZWFkX21pbmlzeW1ib2xzCQlfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzb21fbWluaXN5bWJvbF90b19zeW1ib2wJX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgc29tX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBzb21fYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBzb21fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgc29tX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHNvbV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIHNvbV9iZmRfZ2Nfc2VjdGlvbnMJCWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLQotY29uc3QgYmZkX3RhcmdldCBzb21fdmVjID0KLXsKLSAgInNvbSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCB8IERZTkFNSUMpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLQotLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIDAsCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTQsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBzb21fb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNvbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNvbV93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSN1bmRlZiBzb20KLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwotCi0jZW5kaWYgLyogSE9TVF9IUFBBSFBVWCB8fCBIT1NUX0hQUEFCU0QgfHwgSE9TVF9IUFBBT1NGICovCmRpZmYgLS1naXQgYS9iZmQvc29tLmggYi9iZmQvc29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzc4MDQuLjAwMDAwMDAKLS0tIGEvYmZkL3NvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfU09NX0gKLSNkZWZpbmUgX1NPTV9ICi0KLSNpbmNsdWRlICJsaWJocHBhLmgiCi0KLSNpbmNsdWRlIDxhLm91dC5oPgotI2luY2x1ZGUgPGxzdC5oPgotI2luY2x1ZGUgPGFyLmg+Ci0KLS8qIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBjdXJyZW50bHkgdXNlIGFueXRoaW5nIGZyb20gdGhlc2UKLSAgIHR3byBpbmNsdWRlIGZpbGVzLCBidXQgaXQncyBsaWtlbHkgdG8gbmVlZCB0aGVtIGluIHRoZSBmdXR1cmUuICAqLwotI2lmZGVmIFJfRExUX1JFTAotI2luY2x1ZGUgPHNobC5oPgotI2luY2x1ZGUgPGRsLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpCi0vKiBCU0QgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNjaGVtZSBmb3Igb2JqZWN0IGZpbGUgaWRlbnRpZmljYXRpb24uCi0gICBzbyBmb3Igbm93LCBkZWZpbmUgX1BBX1JJU0NfSUQgdG8gYWNjZXB0IGFueSByYW5kb20gdmFsdWUgZm9yIGEgbW9kZWwKLSAgIG51bWJlci4gICovCi0jdW5kZWYgX1BBX1JJU0NfSUQKLSNkZWZpbmUgX1BBX1JJU0NfSUQoX19tX251bSkgMQotI2VuZGlmIC8qIEhPU1RfSFBQQUJTRCAqLwotCi0jZGVmaW5lIEZJTEVfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpCi0jZGVmaW5lIEFVWF9IRFJfU0laRSBzaXplb2Yoc3RydWN0IHNvbV9leGVjX2F1eGhkcikKLQotdHlwZWRlZiBzdHJ1Y3Qgc29tX3N5bWJvbAotICB7Ci0gICAgYXN5bWJvbCBzeW1ib2w7Ci0gICAgdW5zaWduZWQgaW50IHNvbV90eXBlOwotCi0gICAgLyogU3RydWN0dXJlZCBsaWtlIHRoZSBFTEYgdGNfZGF0YSB1bmlvbi4gIEFsbG93cyBtb3JlIGNvZGUgc2hhcmluZwotICAgICAgIGluIEdBUyB0aGlzIHdheS4gICovCi0gICAgdW5pb24KLSAgICAgIHsKLQlzdHJ1Y3QKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaHBwYV9hcmdfcmVsb2M7Ci0JICB1bnNpZ25lZCBpbnQgaHBwYV9wcml2X2xldmVsOwotCX0gYXA7Ci0JUFRSIGFueTsKLSAgICAgIH0KLSAgICB0Y19kYXRhOwotCi0gICAgLyogSW5kZXggb2YgdGhpcyBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIE9ubHkgdXNlZCB3aGVuCi0gICAgICAgYnVpbGRpbmcgcmVsb2NhdGlvbiBzdHJlYW1zIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLwotICAgIGludCBpbmRleDsKLQotICAgIC8qIEhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgQnkgc29ydGluZwotICAgICAgIHRoZSBzeW1ib2xzIGZyb20gbW9zdCB1c2VkIHRvIGxlYXN0IHVzZWQgd2UgY2FuIHNpZ25pZmljYW50bHkKLSAgICAgICByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLwotICAgIGludCByZWxvY19jb3VudDsKLQotICAgIC8qIER1cmluZyBvYmplY3QgZmlsZSB3cml0aW5nLCB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lIG9mIHRoaXMgc3ltYm9sCi0gICAgICAgaW4gdGhlIFNPTSBzdHJpbmcgdGFibGUuICovCi0gICAgaW50IHN0cmluZ3RhYl9vZmZzZXQ7Ci0gIH0KLXNvbV9zeW1ib2xfdHlwZTsKLQotLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgdGhlIG1hZ2ljIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhIEJGRCdzCi0gICBwcml2YXRlIGRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBhbiBvYmpjb3B5L3N0cmlwIHJ1bi4gICovCi1zdHJ1Y3Qgc29tX2V4ZWNfZGF0YQotICB7Ci0gICAgLyogU29ydC1vZiBhIG1hZ2ljIG51bWJlci4gIEJTRCB1c2VzIGl0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgICAgICBuYXRpdmUgZXhlY3V0YWJsZXMgYW5kIGhwdXggZXhlY3V0YWJsZXMuICAqLwotICAgIHNob3J0IHN5c3RlbV9pZDsKLQotICAgIC8qIE1hZ2ljIGV4ZWMgZmxhZ3MuICBUaGVzZSBjb250cm9sIHRoaW5ncyBsaWtlIHdoZXRoZXIgb3Igbm90Ci0gICAgICAgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNpbmcgaXMgYWxsb3dlZCBhbmQgdGhlIGxpa2UuICAqLwotICAgIGxvbmcgZXhlY19mbGFnczsKLQotICAgIC8qIEFkZCBtb3JlIHN0dWZmIGhlcmUgYXMgbmVlZGVkLiAgR29vZCBleGFtcGxlcyBvZiBpbmZvcm1hdGlvbgotICAgICAgIHdlIG1pZ2h0IHdhbnQgdG8gcGFzcyB3b3VsZCBiZSBwcmVzdW1lZF9kcCwgZW50cnlfKiBhbmQgbWF5YmUKLSAgICAgICBvdGhlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXIuICAqLwotICB9OwotCi1zdHJ1Y3Qgc29tZGF0YQotICB7Ci0gICAgLyogQWxsIHRoZSBtYWdpYyBpbmZvcm1hdGlvbiBhYm91dCBhbiBleGVjdXRhYmxlIHdoaWNoIGxpdmVzCi0gICAgICAgaW4gdGhlIHByaXZhdGUgQkZEIHN0cnVjdHVyZSBhbmQgbmVlZHMgdG8gYmUgY29waWVkIGZyb20KLSAgICAgICB0aGUgaW5wdXQgYmZkIHRvIHRoZSBvdXRwdXQgYmZkIGR1cmluZyBhIG9iamNvcHkvc3RyaXAuICAqLwotICAgIHN0cnVjdCBzb21fZXhlY19kYXRhICpleGVjX2RhdGE7Ci0KLSAgICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG9ubHkgdXNlZCB3aGVuIHdyaXRpbmcgZmlsZXMgYW5kIGFyZQotICAgICAgIGdlbmVyYXRlZCBmcm9tIHNjcmF0Y2guICBUaGV5IG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weQotICAgICAgIG9yIHN0cmlwIHRvIHdvcmsuICAqLwotICAgIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRyOwotICAgIHN0cnVjdCBjb3B5cmlnaHRfYXV4X2hkciAqY29weXJpZ2h0X2F1eF9oZHI7Ci0gICAgc3RydWN0IHVzZXJfc3RyaW5nX2F1eF9oZHIgKnZlcnNpb25fYXV4X2hkcjsKLSAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICpleGVjX2hkcjsKLSAgICBDT01QVU5JVCAqY29tcF91bml0OwotCi0gICAgLyogUG9pbnRlcnMgdG8gYSBzYXZlZCBjb3B5IG9mIHRoZSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZXMuICBUaGVzZQotICAgICAgIG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weSBvciBzdHJpcCB0byB3b3JrLiAgKi8KLSAgICBzb21fc3ltYm9sX3R5cGUgKnN5bXRhYjsKLSAgICBjaGFyICpzdHJpbmd0YWI7Ci0gICAgYXN5bWJvbCAqKnNvcnRlZF9zeW1zOwotCi0gICAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgICAgbm8gZGVwZW5kZW5jaWVzIG9uIHRoZSBwYXJ0aWN1bGFyIGZvcm1hdCBvZiB0aGUgZXhlY19oZHIuCi0gICAgICAgVGhlc2Ugb2Zmc2V0cyBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkgb3Igc3RyaXAgdG8gd29yay4gICovCi0KLSAgICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKLSAgICBmaWxlX3B0ciBzdHJfZmlsZXBvczsKLSAgICBmaWxlX3B0ciByZWxvY19maWxlcG9zOwotICAgIHVuc2lnbmVkIHN0cmluZ3RhYl9zaXplOwotICB9OwotCi1zdHJ1Y3Qgc29tX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc29tZGF0YSBhOwotICB9OwotCi0vKiBTdWJzdHJ1Y3R1cmUgb2Ygc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uCi0gICB3aGljaCBjYW4ndCBiZSByZXByZXNlbnRlZCBieSB0aGUgZ2VuZXJpYyBCRkQgc2VjdGlvbiBzdHJ1Y3R1cmUsCi0gICBidXQgd2hpY2ggbXVzdCBiZSBjb3BpZWQgZHVyaW5nIG9iamNvcHkgb3Igc3RyaXAuICAqLwotc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0Ci0gIHsKLSAgICAvKiBWYXJpb3VzIGZpZWxkcyBpbiBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycyB0aGF0IHdlIG5lZWQKLSAgICAgICB0byBwYXNzIGFyb3VuZC4gICovCi0gICAgdW5zaWduZWQgaW50IHNvcnRfa2V5IDogODsKLSAgICB1bnNpZ25lZCBpbnQgYWNjZXNzX2NvbnRyb2xfYml0cyA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGlzX2RlZmluZWQgOiAxOwotICAgIHVuc2lnbmVkIGludCBpc19wcml2YXRlIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgcXVhZHJhbnQgOiAyOwotCi0gICAgLyogRm9yIHN1YnNwYWNlcywgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUKLSAgICAgICBzcGFjZSBpbiB3aGljaCB0aGUgc3Vic3BhY2UgaXMgY29udGFpbmVkLiAgRm9yIHNwYWNlcyBpdCBwb2ludHMKLSAgICAgICBiYWNrIHRvIHRoZSBzZWN0aW9uIGZvciB0aGlzIHNwYWNlLiAgKi8KLSAgICBhc2VjdGlvbiAqY29udGFpbmVyOwotCi0gICAgLyogVGhlIHVzZXItc3BlY2lmaWVkIHNwYWNlIG51bWJlci4gIEl0IGlzIHdyb25nIHRvIHVzZSB0aGlzIGFzCi0gICAgICAgYW4gaW5kZXggc2luY2UgZHVwbGljYXRlcyBhbmQgaG9sZXMgYXJlIGFsbG93ZWQuICAqLwotICAgIGludCBzcGFjZV9udW1iZXI7Ci0KLSAgICAvKiBBZGQgbW9yZSBzdHVmZiBoZXJlIGFzIG5lZWRlZC4gIEdvb2QgZXhhbXBsZXMgb2YgaW5mb3JtYXRpb24KLSAgICAgICB3ZSBtaWdodCB3YW50IHRvIHBhc3Mgd291bGQgYmUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnMsIAotICAgICAgIGFuZCB0aGUgbWFueSBzdWJzcGFjZSBmbGFncyB3ZSBkbyBub3QgcmVwcmVzZW50IHlldC4gICovCi0gIH07Ci0KLS8qIFVzZWQgdG8ga2VlcCBleHRyYSBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gc2VjdGlvbi4KLQotICAgcmVsb2Nfc2l6ZSBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0sIG5vdGUgdGhpcwotICAgaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIGFzIFNPTSByZWxvY2F0aW9ucwotICAgYXJlIHZhcmlhYmxlIGxlbmd0aC4gCi0KLSAgIHJlbG9jX3N0cmVhbSBpcyB0aGUgYWN0dWFsIHN0cmVhbSBvZiByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotCi1zdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqY29weV9kYXRhOwotICAgIHVuc2lnbmVkIGludCByZWxvY19zaXplOwotICAgIGNoYXIgKnJlbG9jX3N0cmVhbTsKLSAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgKnNwYWNlX2RpY3Q7Ci0gICAgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICpzdWJzcGFjZV9kaWN0OwotICB9OwotCi0jZGVmaW5lIHNvbWRhdGEoYmZkKQkJCSgoYmZkKS0+dGRhdGEuc29tX2RhdGEtPmEpCi0jZGVmaW5lIG9ial9zb21fZXhlY19kYXRhKGJmZCkJCShzb21kYXRhKGJmZCkuZXhlY19kYXRhKQotI2RlZmluZSBvYmpfc29tX2ZpbGVfaGRyKGJmZCkJCShzb21kYXRhKGJmZCkuZmlsZV9oZHIpCi0jZGVmaW5lIG9ial9zb21fZXhlY19oZHIoYmZkKQkJKHNvbWRhdGEoYmZkKS5leGVjX2hkcikKLSNkZWZpbmUgb2JqX3NvbV9jb3B5cmlnaHRfaGRyKGJmZCkJKHNvbWRhdGEoYmZkKS5jb3B5cmlnaHRfYXV4X2hkcikKLSNkZWZpbmUgb2JqX3NvbV92ZXJzaW9uX2hkcihiZmQpCShzb21kYXRhKGJmZCkudmVyc2lvbl9hdXhfaGRyKQotI2RlZmluZSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQoYmZkKQkoc29tZGF0YShiZmQpLmNvbXBfdW5pdCkKLSNkZWZpbmUgb2JqX3NvbV9zeW10YWIoYmZkKQkJKHNvbWRhdGEoYmZkKS5zeW10YWIpCi0jZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiKGJmZCkJCShzb21kYXRhKGJmZCkuc3RyaW5ndGFiKQotI2RlZmluZSBvYmpfc29tX3N5bV9maWxlcG9zKGJmZCkJKHNvbWRhdGEoYmZkKS5zeW1fZmlsZXBvcykKLSNkZWZpbmUgb2JqX3NvbV9zdHJfZmlsZXBvcyhiZmQpCShzb21kYXRhKGJmZCkuc3RyX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiX3NpemUoYmZkKQkoc29tZGF0YShiZmQpLnN0cmluZ3RhYl9zaXplKQotI2RlZmluZSBvYmpfc29tX3JlbG9jX2ZpbGVwb3MoYmZkKQkoc29tZGF0YShiZmQpLnJlbG9jX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc29ydGVkX3N5bXMoYmZkKQkoc29tZGF0YShiZmQpLnNvcnRlZF9zeW1zKQotI2RlZmluZSBzb21fc2VjdGlvbl9kYXRhKHNlYykgXAotICAoKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCAqKXNlYy0+dXNlZF9ieV9iZmQpCi0jZGVmaW5lIHNvbV9zeW1ib2xfZGF0YShzeW1ib2wpCQkoKHNvbV9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpCi0KLQotLyogRGVmaW5lcyBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAotICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAotICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KLQotICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgotICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2F0aW9uIGFzCi0gICBhcHByb3ByaWF0ZS4gIFRoaXMgYWxsb3dzIEdBUyB0byBzaGFyZSBtdWNoIG1vcmUgY29kZSAKLSAgIGJldHdlZW4gdGhlIHR3byBvYmplY3QgZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgUl9IUFBBX05PTkUJCQlSX05PX1JFTE9DQVRJT04KLSNkZWZpbmUJUl9IUFBBCQkJCVJfQ09ERV9PTkVfU1lNQk9MCi0jZGVmaW5lCVJfSFBQQV9QQ1JFTF9DQUxMCQlSX1BDUkVMX0NBTEwKLSNkZWZpbmUgUl9IUFBBX0FCU19DQUxMCQkJUl9BQlNfQ0FMTAotI2RlZmluZQlSX0hQUEFfR09UT0ZGCQkJUl9EUF9SRUxBVElWRQotI2RlZmluZSBSX0hQUEFfRU5UUlkJCQlSX0VOVFJZCi0jZGVmaW5lIFJfSFBQQV9FWElUCQkJUl9FWElUCi0jZGVmaW5lIFJfSFBQQV9DT01QTEVYCQkJUl9DT01QMQotI2RlZmluZSBSX0hQUEFfQkVHSU5fQlJUQUIJCVJfQkVHSU5fQlJUQUIKLSNkZWZpbmUgUl9IUFBBX0VORF9CUlRBQgkJUl9FTkRfQlJUQUIKLSNkZWZpbmUgUl9IUFBBX0JFR0lOX1RSWQkJUl9CRUdJTl9UUlkKLSNkZWZpbmUgUl9IUFBBX0VORF9UUlkJCQlSX0VORF9UUlkKLQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zLCBtb3N0bHkgZm9yIHVzZSBieSBHQVMuICAqLwotYm9vbGVhbiBiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBpbnQsCi0JCQkJCQl1bnNpZ25lZCBpbnQsIGludCkpOwotYm9vbGVhbiBiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgIGludCwgdW5zaWduZWQgaW50LCBpbnQpKTsKLXZvaWQgYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUgUEFSQU1TICgoYXN5bWJvbCAqLCB1bnNpZ25lZCBpbnQpKTsKLWJvb2xlYW4gYmZkX3NvbV9hdHRhY2hfYXV4X2hkciBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKLWludCAqKiBocHBhX3NvbV9nZW5fcmVsb2NfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBpbnQsIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKLQkgICBpbnQsIGFzeW1ib2wgKikpOwotYm9vbGVhbiBiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotI2VuZGlmIC8qIF9TT01fSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbGludXguYyBiL2JmZC9zcGFyY2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZDRlN2UuLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc3MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIHNwYXJjIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFICAgICAgICA0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgICAgICAgIDB4MAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9TUEFSQyB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWxpbnV4IgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOwotCi0vKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKLSAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgotICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjbGludXhfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OwotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBzcGFyY2xpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuIHNwYXJjbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkMpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBzcGFyY2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZSAgICAgICAgR09UX1JFRl9QUkVGSVggICJfX0dPVF8iCi0jZW5kaWYKLQotI2RlZmluZSBJU19HT1RfU1lNKG5hbWUpIFwKLSAgKHN0cm5jbXAgKG5hbWUsIEdPVF9SRUZfUFJFRklYLCBzaXplb2YgR09UX1JFRl9QUkVGSVggLSAxKSA9PSAwKQotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICovCi0KLSNpZm5kZWYgUExUX1JFRl9QUkVGSVgKLSNkZWZpbmUgICAgICAgIFBMVF9SRUZfUFJFRklYICAiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0gICAgICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLSAgICAgICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0gICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgICBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotICAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmZpeHVwX2NvdW50ID0gMDsKLSAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7Ci0gIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotICAgICAgICAgICAgICAgICAgICAgICAgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykgICAgICAgICAgICAgICAgICAgIFwKLSAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgKCYodGFibGUpLT5yb290LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLCBcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBMaW51eCBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgbGludXhfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXcgZml4dXAuICAqLwotCi1zdGF0aWMgc3RydWN0IGZpeHVwICoKLW5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsIGJ1aWx0aW4pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBpbnQgYnVpbHRpbjsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotCi0gIGYgPSAoc3RydWN0IGZpeHVwICopIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGluc2VydDsKLQotICAvKiBMb29rIHVwIGFuZCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLgotICAgICBJZiB3ZSBkbywgYW5kIHRoZSBkZWZpbmluZyBlbnRyeSBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHdlCi0gICAgIG5lZWQgdG8gY3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zLgotCi0gICAgIEZJWE1FOiBXaGF0IGlmIGFiZmQtPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcj8gIFdlIG1heSB3YW50IHRvCi0gICAgIGJlIGFibGUgdG8gbGluayBMaW51eCBhLm91dCBhbmQgRUxGIG9iamVjdHMgdG9nZXRoZXIsIGJ1dCBzZXJpb3VzCi0gICAgIGNvbmZ1c2lvbiBpcyBwb3NzaWJsZS4gICovCi0KLSAgaW5zZXJ0ID0gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgU0hBUkFCTEVfQ09ORkxJQ1RTKSA9PSAwCi0gICAgICAmJiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBpZiAoISBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgICAgIGluc2VydCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0gICAgICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICAgICB7Ci0gICAgICAgICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLSAgICAgICAgIGlmIChoYXNocCAhPSBOVUxMKQotICAgICAgICAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotICAgICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsICEgSVNfUExUX1NZTSAobmFtZSkpOwotICAgICAgICAgaWYgKGYgPT0gTlVMTCkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgZi0+anVtcCA9IElTX1BMVF9TWU0gKG5hbWUpOwotCi0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICB9Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotICAgICAgICBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICAgICAgICAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLSAgICAgICAgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotICAgICAgICAgICAgICAgICBzaXplb2YgTkVFRFNfU0hSTElCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciAqcDsKLSAgICAgIGNoYXIgKmFsbG9jID0gTlVMTDsKLQotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyArIHNpemVvZiBORUVEU19TSFJMSUIgLSAxOwotICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICdfJyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotICAgICAgIGFsbG9jID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICBpZiAocCA9PSBOVUxMIHx8IGFsbG9jID09IE5VTEwpCi0gICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotICAgICAgICAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotICAgICAgICAgKnArKyA9ICdcMCc7Ci0gICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotICAgICAgICAgICAgYWxsb2MsIHApOwotICAgICAgICAgZnJlZSAoYWxsb2MpOwotICAgICAgIH0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdAotICAgICBpdC4gICovCi0gIGlzX3BsdCA9IElTX1BMVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgaWYgKGlzX3BsdCB8fCBJU19HT1RfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpKQotICAgIHsKLSAgICAgIC8qIExvb2sgdXAgdGhpcyBzeW1ib2wgdHdpY2UuICBPbmNlIGp1c3QgYXMgYSByZWd1bGFyIGxvb2t1cCwKLSAgICAgICAgYW5kIHRoZW4gYWdhaW4gZm9sbG93aW5nIGFsbCBvZiB0aGUgaW5kaXJlY3QgbGlua3MgdW50aWwgd2UKLSAgICAgICAgcmVhY2ggYSByZWFsIHN5bWJvbC4gICovCi0gICAgICBoMSA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgLyogaDIgZG9lcyBub3QgZm9sbG93IGluZGlyZWN0IHN5bWJvbHMuICovCi0gICAgICBoMiA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogVGhlIHJlYWwgc3ltYm9sIG11c3QgZXhpc3QgYnV0IGlmIGl0IGlzIGFsc28gYW4gQUJTIHN5bWJvbCwKLSAgICAgICAgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgZml4dXAuICBUaGlzIGlzIGJlY2F1c2UgdGhleSBib3RoCi0gICAgICAgIGNhbWUgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LiAgSWYgb24gdGhlIG90aGVyIGhhbmQsIHdlIGhhZCB0bwotICAgICAgICB1c2UgYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGdldCB0byB0aGUgcmVhbCBzeW1ib2wsIHdlIGFkZCB0aGUKLSAgICAgICAgZml4dXAgYW55d2F5LCBzaW5jZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlc2Ugc3ltYm9scyBjb21lCi0gICAgICAgIGZyb20gZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICAgIGlmIChoMSAhPSBOVUxMCi0gICAgICAgICAmJiAoKChoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgICB8fCBoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgICAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaDEtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLSAgICAgICAgICAgICB8fCBoMi0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkpCi0gICAgICAgewotICAgICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGEgImJ1aWx0aW4iIGZpeHVwIGFscmVhZHkgcHJlc2VudAotICAgICAgICAgICAgaW52b2x2aW5nIHRoaXMgc3ltYm9sLiAgSWYgc28sIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyCi0gICAgICAgICAgICBmaXh1cC4gIEluIHRoZSBlbmQsIHRoaXMgcmVsYXhlcyBzb21lIG9mIHRoZSByZXF1aXJlbWVudHMKLSAgICAgICAgICAgIGFib3V0IHRoZSBvcmRlciBvZiBwZXJmb3JtaW5nIGZpeHVwcy4gICovCi0gICAgICAgICBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgIGZvciAoZjEgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgICAgICAgICAgICAgZjEgIT0gTlVMTDsKLSAgICAgICAgICAgICAgZjEgPSBmMS0+bmV4dCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGlmICgoZjEtPmggIT0gaCAmJiBmMS0+aCAhPSBoMSkKLSAgICAgICAgICAgICAgICAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICBpZiAoZjEtPmggPT0gaDEpCi0gICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgaWYgKCEgZXhpc3RzCi0gICAgICAgICAgICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgZjEtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0gICAgICAgICAgICAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZjEtPmggPSBoMTsKLSAgICAgICAgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLSAgICAgICAgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0gICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgICAgaWYgKCEgZXhpc3RzCi0gICAgICAgICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLSAgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0gICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgIC8qIFF1aWNrIGFuZCBkaXJ0eSB3YXkgb2Ygc3RyaXBwaW5nIHRoZXNlIHN5bWJvbHMgZnJvbSB0aGUKLSAgICAgICAgc3ltdGFiLiAqLwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgIGgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIC5saW51eC1keW5hbWljIHNlY3Rpb24gaXMuCi0gICBJdCBpcyBjYWxsZWQgYnkgdGhlIExpbnV4IGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24KLSAgIHJvdXRpbmUuICBXZSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgYW5kIG5vdwotICAgd2UganVzdCBzY2FuIHRoZSBoYXNoIHRhYmxlcyB0byBmaW5kIG91dCBob3cgbWFueSBhZGRpdGlvbmFsIGZpeHVwcwotICAgYXJlIHJlcXVpcmVkLiAgKi8KLQotYm9vbGVhbgotYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0IGZpbmQgdGhlIGZpeHVwcy4uLiAqLwotICBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXhfdGFsbHlfc3ltYm9scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLSAgICAgICB7Ci0gICAgICAgICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgICAgICAgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZml4dXAgdGFibGUuICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT5fcmF3X3NpemUgPSA4ICsgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICogODsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSBhcmUgcmVhZHkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGZpeHVwIHRhYmxlIHRvCi0gICB0aGUgb3V0cHV0IGZpbGUuICBTY2FuIHRoZSBmaXh1cCB0YWJsZXMgYW5kIHNvIGZvcnRoIGFuZCBnZW5lcmF0ZQotICAgdGhlIHN0dWZmIHdlIG5lZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfZmluaXNoX2R5bmFtaWNfbGluayAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnMsICpvcywgKmlzOwotICBiZmRfYnl0ZSAqZml4dXBfdGFibGU7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgdW5zaWduZWQgaW50IG5ld19hZGRyOwotICBpbnQgc2VjdGlvbl9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBmaXh1cHNfd3JpdHRlbjsKLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwKLSAgICAgICAgIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLSAgICAgICAgIG9zLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGZpeHVwX3RhYmxlID0gcy0+Y29udGVudHM7Ci0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCwgZml4dXBfdGFibGUpOwotICBmaXh1cF90YWJsZSArPSA0OwotCi0gIC8qIEZpbGwgaW4gZml4dXAgdGFibGUuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLSAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgIHsKLSAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotICAgICAgICAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgIH0KLQotICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJGaXh1cCglZCkgJXM6ICV4ICV4XG4iLGYtPmp1bXAsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICBpZiAoZi0+anVtcCkKLSAgICAgICB7Ci0gICAgICAgICAvKiBSZWxhdGl2ZSBhZGRyZXNzICovCi0gICAgICAgICBuZXdfYWRkciA9IG5ld19hZGRyIC0gKGYtPnZhbHVlICsgNSk7Ci0JIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUgKyAxLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgIH0KLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIG1hcmtlciBzbyB3ZSBrbm93IHRvIHN3aXRjaCB0byB0aGUgb3RoZXIgdHlwZSBvZiBmaXh1cCAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgICAgewotICAgICAgICAgaWYgKCEgZi0+YnVpbHRpbikKLSAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0gICAgICAgICAgICAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgICAgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLSAgICAgICAgICAgICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgICB9Ci0gIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICE9IGZpeHVwc193cml0dGVuKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIpKTsKLSAgICAgIHdoaWxlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiBmaXh1cHNfd3JpdHRlbikKLSAgICAgICB7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICAgfQotICAgIH0KLQotICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGlzID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiQnVpbHRpbiBmaXh1cCB0YWJsZSBhdCAleFxuIiwgbmV3X2FkZHIpOwotI2VuZGlmCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbHlueC5jIGIvYmZkL3NwYXJjbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZjYWU1Li4wMDAwMDAwCi0tLSBhL2JmZC9zcGFyY2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgU3BhcmMgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0KLSNlbmRpZgotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1seW54IgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJhb3V0L3N1bjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLS8qIFRoaXMgaXMgbmVlZGVkIHRvIHJlamVjdCBhIE5ld3NPUyBmaWxlLCBlLmcuIGluCi0gICBnZGIvdGVzdHN1aXRlL2dkYi50MTAvY3Jvc3Nsb2FkLmV4cC4gPGtpbmdkb25AY3lnbnVzLmNvbT4KLSAgIEkgbmVlZGVkIHRvIGFkZCBNX1VOS05PV04gdG8gcmVjb2duaXplIGEgNjgwMDAgb2JqZWN0LCBzbyB0aGlzIHdpbGwKLSAgIHByb2JhYmx5IG5vIGxvbmdlciByZWplY3QgYSBOZXdzT1Mgb2JqZWN0LiAgPGlhbkBjeWdudXMuY29tPi4gKi8KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fVU5LTk9XTiBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNXzY4MDEwIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fNjgwMjAgXAotCQkJICAgIHx8IChtdHlwZSkgPT0gTV9TUEFSQykKLQotLyoKLVRoZSBmaWxlIEBjb2Rle2FvdXRmMS5ofSBjb250YWlucyB0aGUgY29kZSBmb3IgQkZEJ3MKLWEub3V0IGJhY2sgZW5kLiBDb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBiYWNrIGVuZCBpcyBnaXZlbiBieSB0aGVzZQotdHdvIHByZXByb2Nlc3NvciBuYW1lczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gQVJDSF9TSVpFCi1UaGlzIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgMzIgb3IgNjQsIGRlcGVuZGluZyB1cG9uIHRoZSBzaXplIG9mIGFuCi1pbnQgaW4gdGhlIHRhcmdldCBmb3JtYXQuIEl0IGNoYW5nZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3RzIHdoaWNoCi1wZXJmb3JtIHRoZSBtZW1vcnkvZGlzayBtYXBwaW5nIG9mIHN0cnVjdHVyZXMuCi0KLVRoZSA2NCBiaXQgYmFja2VuZCBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBob3N0IGNvbXBpbGVyIHN1cHBvcnRzIDY0Ci1pbnRzIChlZyBsb25nIGxvbmcgd2l0aCBnY2MpLCBieSBkZWZpbmluZyB0aGUgbmFtZSBAY29kZXtCRkRfSE9TVF82NF9CSVR9IGluIEBjb2Rle2JmZC5ofS4KLVdpdGggdGhpcyBuYW1lIGRlZmluZWQsIEBlbXBoe2FsbH0gYmZkIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoIDY0Yml0Ci1hcml0aG1ldGljLCBub3QganVzdCB0aG9zZSB0byBhIDY0Yml0IHRhcmdldC4KLQotQGl0ZW0gVEFSR0VUTkFNRQotVGhlIG5hbWUgcHV0IGludG8gdGhlIHRhcmdldCB2ZWN0b3IuCi1AaXRlbQotQGVuZCB0YWJsZQotCi0qLwotCi0vKlNVUFBSRVNTNTU4Ki8KLS8qU1VQUFJFU1M1MjkqLwotCi12b2lkCi1OQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkgKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgbG9uZyBtYWNoaW5lOwotICBzd2l0Y2ggKG1hY2h0eXBlKQotICAgIHsKLQotICAgIGNhc2UgTV9VTktOT1dOOgotICAgICAgLyogU29tZSBTdW4zcyBtYWtlIG1hZ2ljIG51bWJlcnMgd2l0aG91dCBjcHUgdHlwZXMgaW4gdGhlbSwgc28KLQkgd2UnbGwgZGVmYXVsdCB0byB0aGUgNjgwMDAuICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAxMDoKLSAgICBjYXNlIE1fSFAyMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAyMDoKLSAgICBjYXNlIE1fSFAzMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMzg2OgotICAgIGNhc2UgTV8zODZfRFlOSVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMjlLOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2EyOWs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0hQVVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAotICBOQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIGNob29zZV9yZWxvY19zaXplKEFCRkQpOwotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZSBpbiBMeW54T1MgZm9ybWF0LgotICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDEwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMjlLKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIH0KLQotICBjaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCk7Ci0KLSAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7Ci0KLSAgV1JJVEVfSEVBREVSUyAoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3NldF9zaXplcyBzcGFyY2x5bnhfc2V0X3NpemVzCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNseW54X3NldF9zaXplcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgc3BhcmNseW54X2FvdXRfYmFja2VuZCA9Ci17Ci0gIDAsIDEsIDAsIDEsIDAsIHNwYXJjbHlueF9zZXRfc2l6ZXMsIDAsCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQwKLQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCU5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEJCQkmc3BhcmNseW54X2FvdXRfYmFja2VuZAotCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcGFyY25ldGJzZC5jIGIvYmZkL3NwYXJjbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzdiYjguLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9zcGFyYyBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLS8qIFNQQVJDIGNoaXBzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCi0gICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gZWl0aGVyIG9uZS4gKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDIwMDAKLQotI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfc3BhcmMKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fU1BBUkNfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY25ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcmVjLmMgYi9iZmQvc3JlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQyZjk2Li4wMDAwMDAwCi0tLSBhL2JmZC9zcmVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzc3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igcy1yZWNvcmQgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TVUJTRUNUSU9OCi0JUy1SZWNvcmQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQkKLQlPcmRpbmFyeSBTLVJlY29yZHMgY2Fubm90IGhvbGQgYW55dGhpbmcgYnV0IGFkZHJlc3NlcyBhbmQKLQlkYXRhLCBzbyB0aGF0J3MgYWxsIHRoYXQgd2UgaW1wbGVtZW50LgotCi0JVGhlIG9ubHkgaW50ZXJlc3RpbmcgdGhpbmcgaXMgdGhhdCBTLVJlY29yZHMgbWF5IGNvbWUgb3V0IG9mCi0Jb3JkZXIgYW5kIHRoZXJlIGlzIG5vIGhlYWRlciwgc28gYW4gaW5pdGlhbCBzY2FuIGlzIHJlcXVpcmVkCi0JdG8gZGlzY292ZXIgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWRkcmVzc2VzIHVzZWQgdG8gY3JlYXRlCi0JdGhlIHZtYSBhbmQgc2l6ZSBvZiB0aGUgb25seSBzZWN0aW9uIHdlIGNyZWF0ZS4gIFdlCi0JYXJiaXRyYXJpbHkgY2FsbCB0aGlzIHNlY3Rpb24gIi50ZXh0Ii4KLQotCVdoZW4gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIGlzIGNhbGxlZCB0aGUgZmlsZSBpcyByZWFkCi0JYWdhaW4sIGFuZCB0aGlzIHRpbWUgdGhlIGRhdGEgaXMgcGxhY2VkIGludG8gYSBiZmRfYWxsb2MnZAotCWFyZWEuCi0KLQlBbnkgbnVtYmVyIG9mIHNlY3Rpb25zIG1heSBiZSBjcmVhdGVkIGZvciBvdXRwdXQsIHdlIHNhdmUgdGhlbQotCXVwIGFuZCBvdXRwdXQgdGhlbSB3aGVuIGl0J3MgdGltZSB0byBjbG9zZSB0aGUgYmZkLgotCi0JQW4gcyByZWNvcmQgbG9va3MgbGlrZToKLQkKLUVYQU1QTEUKLQlTPHR5cGU+PGxlbmd0aD48YWRkcmVzcz48ZGF0YT48Y2hlY2tzdW0+Ci0JCi1ERVNDUklQVElPTgotCVdoZXJlCi0JbyBsZW5ndGgKLQlpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvbGxvd2luZyB1cHRvIHRoZSBjaGVja3N1bS4gTm90ZSB0aGF0Ci0JdGhpcyBpcyBub3QgdGhlIG51bWJlciBvZiBjaGFycyBmb2xsb3dpbmcsIHNpbmNlIGl0IHRha2VzIHR3bwotCWNoYXJzIHRvIHJlcHJlc2VudCBhIGJ5dGUuCi0JbyB0eXBlCi0JaXMgb25lIG9mOgotCTApIGhlYWRlciByZWNvcmQKLQkxKSB0d28gYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JMikgdGhyZWUgYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JMykgZm91ciBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKLQk3KSBmb3VyIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQk4KSB0aHJlZSBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCi0JOSkgdHdvIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQkKLQlvIGFkZHJlc3MKLQlpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBmb2xsb3dpbmcsIG9yIGluIHRoZSBjYXNlIG9mCi0JYSB0ZXJtaW5hdGlvbiByZWNvcmQsIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBpbWFnZQotCW8gZGF0YQotCWlzIHRoZSBkYXRhLgotCW8gY2hlY2tzdW0KLQlpcyB0aGUgc3VtIG9mIGFsbCB0aGUgcmF3IGJ5dGUgZGF0YSBpbiB0aGUgcmVjb3JkLCBmcm9tIHRoZSBsZW5ndGgKLQl1cHdhcmRzLCBtb2R1bG8gMjU2IGFuZCBzdWJ0cmFjdGVkIGZyb20gMjU1LgotCi0KLVNVQlNFQ1RJT04KLQlTeW1ib2wgUy1SZWNvcmQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQlTb21lIElDRSBlcXVpcG1lbnQgdW5kZXJzdGFuZHMgYW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCi0JUy1SZWNvcmQgZm9ybWF0OyBzeW1ib2xzIGFuZCB0aGVpciBhZGRyZXNzZXMgY2FuIGJlIHNlbnQKLQliZWZvcmUgdGhlIGRhdGEuCi0KLQlUaGUgZm9ybWF0IG9mIHRoaXMgaXM6Ci0JKCQkIDxtb2R1bGVuYW1lPgotCQkoPHNwYWNlPiA8c3ltYm9sPiA8YWRkcmVzcz4pKikKLQkkJAotCi0Jc28gYSBzaG9ydCBzeW1ib2wgdGFibGUgY291bGQgbG9vayBsaWtlOgotCi1FWEFNUExFCi0JJCQgZmxhc2gueAotCSQkIGZsYXNoLmMKLQkgIF9wb3J0NiAkMAotCSAgX2RlbGF5ICQ0Ci0JICBfc3RhcnQgJDE0Ci0JICBfZXRleHQgJDgwMzYKLQkgIF9lZGF0YSAkODAzNgotIAkgIF9lbmQgJDgwMzYKLQkkJAotCi1ERVNDUklQVElPTgotCVdlIGFsbG93IHN5bWJvbHMgdG8gYmUgYW55d2hlcmUgaW4gdGhlIGRhdGEgc3RyZWFtIC0gdGhlIG1vZHVsZSBuYW1lcwotCWFyZSBhbHdheXMgaWdub3JlZC4KLQkJCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIHZvaWQgc3JlY19nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIHZvaWQgc3JlY19wcmludF9zeW1ib2wKLSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIHZvaWQgc3JlY19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc3JlY19nZXRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBzcmVjX2JhZF9ieXRlIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zY2FuIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3JlY19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnN5bWJvbHNyZWNfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGJmZF92bWEsCi0JCQkJCSAgY29uc3QgYmZkX2J5dGUgKiwKLQkJCQkJICBjb25zdCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX25ld19zeW1ib2wgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzcmVjX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYXN5bWJvbCAqc3JlY19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzcmVjX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLQotLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gaGV4IGFuZCBiaW5hcnkuICovCi0KLXN0YXRpYyBDT05TVCBjaGFyIGRpZ3NbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotI2RlZmluZSBOSUJCTEUoeCkgaGV4X3ZhbHVlKHgpCi0jZGVmaW5lIEhFWChidWZmZXIpICgoTklCQkxFKChidWZmZXIpWzBdKTw8NCkgKyBOSUJCTEUoKGJ1ZmZlcilbMV0pKQotI2RlZmluZSBUT0hFWChkLCB4LCBjaCkgXAotCWRbMV0gPSBkaWdzWyh4KSAmIDB4Zl07IFwKLQlkWzBdID0gZGlnc1soKHgpPj40KSYweGZdOyBcCi0JY2ggKz0gKCh4KSAmIDB4ZmYpOwotI2RlZmluZQlJU0hFWCh4KSAgaGV4X3AoeCkKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gKi8KLQotc3RhdGljIHZvaWQKLXNyZWNfaW5pdCAoKQotewotICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQgPSBmYWxzZTsKLQotICBpZiAoaW5pdGVkID09IGZhbHNlKQotICAgIHsKLSAgICAgIGluaXRlZCA9IHRydWU7Ci0gICAgICBoZXhfaW5pdCAoKTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvbiBhIGxpbmUgaXMgRkYgKi8KLSNkZWZpbmUgTUFYQ0hVTksgMHhmZgotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBmaXQgb250byBhIGxpbmUgb24gb3V0cHV0ICovCi0jZGVmaW5lIENIVU5LIDIxCi0KLS8qIFdoZW4gd3JpdGluZyBhbiBTLXJlY29yZCBmaWxlLCB0aGUgUy1yZWNvcmRzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIHRoZW0gaW4gbWVtb3J5LiAgKi8KLQotc3RydWN0IHNyZWNfZGF0YV9saXN0X3N0cnVjdAotewotICBzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0ICpuZXh0OwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSB3aGVyZTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0IHNyZWNfZGF0YV9saXN0X3R5cGU7Ci0KLS8qIFdoZW4gc2Nhbm5pbmcgdGhlIFMtcmVjb3JkIGZpbGUsIGEgbGlua2VkIGxpc3Qgb2Ygc3JlY19zeW1ib2wKLSAgIHN0cnVjdHVyZXMgaXMgYnVpbHQgdG8gcmVwcmVzZW50IHRoZSBzeW1ib2wgdGFibGUgKGlmIHRoZXJlIGlzCi0gICBvbmUpLiAgKi8KLQotc3RydWN0IHNyZWNfc3ltYm9sCi17Ci0gIHN0cnVjdCBzcmVjX3N5bWJvbCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBUaGUgUy1yZWNvcmQgdGRhdGEgaW5mb3JtYXRpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzcmVjX2RhdGFfbGlzdF90eXBlICpoZWFkOwotICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKnRhaWw7Ci0gICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgc3RydWN0IHNyZWNfc3ltYm9sICpzeW1ib2xzOwotICAgIHN0cnVjdCBzcmVjX3N5bWJvbCAqc3ltdGFpbDsKLSAgICBhc3ltYm9sICpjc3ltYm9sczsKLSAgfQotdGRhdGFfdHlwZTsKLQotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCB0ZGF0YV90eXBlICosCi0JCQkJCSAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV90ZXJtaW5hdG9yIFBBUkFNUyAoKGJmZCAqLCB0ZGF0YV90eXBlICopKTsKLQotLyogU2V0IHVwIHRoZSBTLXJlY29yZCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYWJmZC0+dGRhdGEuc3JlY19kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+dHlwZSA9IDE7Ci0gICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+c3ltYm9scyA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+c3ltdGFpbCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+Y3N5bWJvbHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIGJ5dGUgZnJvbSBhbiBTIHJlY29yZCBmaWxlLiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvcgotICAgb2NjdXJyZWQuICBSZXR1cm4gRU9GIG9uIGVycm9yIG9yIGVuZCBvZiBmaWxlLiAgKi8KLQotc3RhdGljIGludAotc3JlY19nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Ci17Ci0gIGJmZF9ieXRlIGM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JKmVycm9ycHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotCi0gIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOwotfQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIFMgcmVjb3JkIGZpbGUuICBGSVhNRTogVGhpcyBwcm9iYWJseSBzaG91bGQKLSAgIG5vdCBjYWxsIGZwcmludGYsIGJ1dCB3ZSByZWFsbHkgZG8gbmVlZCBzb21lIG1lY2hhbmlzbSBmb3IgcHJpbnRpbmcKLSAgIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgaW50IGM7Ci0gICAgIGJvb2xlYW4gZXJyb3I7Ci17Ci0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBpZiAoISBlcnJvcikKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKCEgaXNwcmludCAoYykpCi0Jc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYzsKLQkgIGJ1ZlsxXSA9ICdcMCc7Ci0JfQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiVkOiBVbmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIFMtcmVjb3JkIGZpbGVcbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCBidWYpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgfQotfQotCi0vKiBBZGQgYSBuZXcgc3ltYm9sIGZvdW5kIGluIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19uZXdfc3ltYm9sIChhYmZkLCBuYW1lLCB2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzcmVjX3N5bWJvbCAqbjsKLQotICBuID0gKHN0cnVjdCBzcmVjX3N5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNyZWNfc3ltYm9sKSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT52YWwgPSB2YWw7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scyA9PSBOVUxMKQotICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scyA9IG47Ci0gIGVsc2UKLSAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bXRhaWwtPm5leHQgPSBuOwotICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bXRhaWwgPSBuOwotICBuLT5uZXh0ID0gTlVMTDsKLQotICArK2FiZmQtPnN5bWNvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIHRoZSBTIHJlY29yZCBmaWxlIGFuZCB0dXJuIGl0IGludG8gc2VjdGlvbnMuICBXZSBjcmVhdGUgYSBuZXcKLSAgIHNlY3Rpb24gZm9yIGVhY2ggY29udGlndW91cyBzZXQgb2YgYnl0ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19zY2FuIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjOwotICB1bnNpZ25lZCBpbnQgbGluZW5vID0gMTsKLSAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemUgPSAwOwotICBhc2VjdGlvbiAqc2VjID0gTlVMTDsKLSAgY2hhciAqc3ltYnVmID0gTlVMTDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIC8qIFdlIG9ubHkgYnVpbGQgc2VjdGlvbnMgZnJvbSBjb250aWd1b3VzIFMtcmVjb3Jkcywgc28gaWYgdGhpcwotICAgICAgICAgaXMgbm90IGFuIFMtcmVjb3JkLCB0aGVuIHN0b3AgYnVpbGRpbmcgYSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChjICE9ICdTJyAmJiBjICE9ICdccicgJiYgYyAhPSAnXG4nKQotCXNlYyA9IE5VTEw7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JZGVmYXVsdDoKLQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQljYXNlICdcbic6Ci0JICArK2xpbmVubzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXHInOgotCSAgYnJlYWs7Ci0KLQljYXNlICckJzoKLQkgIC8qIFN0YXJ0aW5nIGEgbW9kdWxlIG5hbWUsIHdoaWNoIHdlIGlnbm9yZS4gICovCi0JICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSAnXG4nCi0JCSAmJiBjICE9IEVPRikKLQkgICAgOwotCSAgaWYgKGMgPT0gRU9GKQotCSAgICB7Ci0JICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgKytsaW5lbm87Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSAnICc6Ci0JICBkbwotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFsYzsKLQkgICAgICBjaGFyICpwLCAqc3ltbmFtZTsKLQkgICAgICBiZmRfdm1hIHN5bXZhbDsKLQotCSAgICAgIC8qIFN0YXJ0aW5nIGEgc3ltYm9sIGRlZmluaXRpb24uICAqLwotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQotCQk7Ci0KLQkgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgYWxjID0gMTA7Ci0JICAgICAgc3ltYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoYWxjICsgMSk7Ci0JICAgICAgaWYgKHN5bWJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIHAgPSBzeW1idWY7Ci0KLQkgICAgICAqcCsrID0gYzsKLQkgICAgICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YKLQkJICAgICAmJiAhIGlzc3BhY2UgKGMpKQotCQl7Ci0JCSAgaWYgKCh1bnNpZ25lZCBpbnQpIChwIC0gc3ltYnVmKSA+PSBhbGMpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKm47Ci0KLQkJICAgICAgYWxjICo9IDI7Ci0JCSAgICAgIG4gPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAoc3ltYnVmLCBhbGMgKyAxKTsKLQkJICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBwID0gbiArIChwIC0gc3ltYnVmKTsKLQkJICAgICAgc3ltYnVmID0gbjsKLQkJICAgIH0KLQotCQkgICpwKysgPSBjOwotCQl9Ci0KLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgKnArKyA9ICdcMCc7Ci0JICAgICAgc3ltbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgcCAtIHN5bWJ1Zik7Ci0JICAgICAgaWYgKHN5bW5hbWUgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgc3RyY3B5IChzeW1uYW1lLCBzeW1idWYpOwotCSAgICAgIGZyZWUgKHN5bWJ1Zik7Ci0JICAgICAgc3ltYnVmID0gTlVMTDsKLQotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQotCQk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQl7Ci0JCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIFNraXAgYSBkb2xsYXIgc2lnbiBiZWZvcmUgdGhlIGhleCB2YWx1ZS4gICovCi0JICAgICAgaWYgKGMgPT0gJyQnKQotCQl7Ci0JCSAgYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcik7Ci0JCSAgaWYgKGMgPT0gRU9GKQotCQkgICAgewotCQkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHN5bXZhbCA9IDA7Ci0JICAgICAgd2hpbGUgKElTSEVYIChjKSkKLQkJewotCQkgIHN5bXZhbCA8PD0gNDsKLQkJICBzeW12YWwgKz0gTklCQkxFIChjKTsKLQkJICBjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKTsKLQkJfQotCi0JICAgICAgaWYgKCEgc3JlY19uZXdfc3ltYm9sIChhYmZkLCBzeW1uYW1lLCBzeW12YWwpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7Ci0KLQkgIGlmIChjID09ICdcbicpCi0JICAgICsrbGluZW5vOwotCSAgZWxzZSBpZiAoYyAhPSAnXHInKQotCSAgICB7Ci0JICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0gICAgCi0JY2FzZSAnUyc6Ci0JICB7Ci0JICAgIGZpbGVfcHRyIHBvczsKLQkgICAgY2hhciBoZHJbM107Ci0JICAgIHVuc2lnbmVkIGludCBieXRlczsKLQkgICAgYmZkX3ZtYSBhZGRyZXNzOwotCSAgICBiZmRfYnl0ZSAqZGF0YTsKLQotCSAgICAvKiBTdGFydGluZyBhbiBTLXJlY29yZC4gICovCi0KLQkgICAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKLQotCSAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgMywgYWJmZCkgIT0gMykKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICBpZiAoISBJU0hFWCAoaGRyWzFdKSB8fCAhIElTSEVYIChoZHJbMl0pKQotCSAgICAgIHsKLQkJaWYgKCEgSVNIRVggKGhkclsxXSkpCi0JCSAgYyA9IGhkclsxXTsKLQkJZWxzZQotCQkgIGMgPSBoZHJbMl07Ci0JCXNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgYnl0ZXMgPSBIRVggKGhkciArIDEpOwotCSAgICBpZiAoYnl0ZXMgKiAyID4gYnVmc2l6ZSkKLQkgICAgICB7Ci0JCWlmIChidWYgIT0gTlVMTCkKLQkJICBmcmVlIChidWYpOwotCQlidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoYnl0ZXMgKiAyKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQlidWZzaXplID0gYnl0ZXMgKiAyOwotCSAgICAgIH0KLQotCSAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgYnl0ZXMgKiAyLCBhYmZkKSAhPSBieXRlcyAqIDIpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgLyogSWdub3JlIHRoZSBjaGVja3N1bSBieXRlLiAgKi8KLQkgICAgLS1ieXRlczsKLQotCSAgICBhZGRyZXNzID0gMDsKLQkgICAgZGF0YSA9IGJ1ZjsKLQkgICAgc3dpdGNoIChoZHJbMF0pCi0JICAgICAgewotCSAgICAgIGNhc2UgJzAnOgotCSAgICAgIGNhc2UgJzUnOgotCQkvKiBQcm9sb2d1ZS0taWdub3JlIHRoZSBmaWxlIG5hbWUsIGJ1dCBzdG9wIGJ1aWxkaW5nIGEKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGF0IHRoaXMgcG9pbnQuICAqLwotCQlzZWMgPSBOVUxMOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgotCQlhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQktLWJ5dGVzOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzInOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS0tYnl0ZXM7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnMSc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQlieXRlcyAtPSAyOwotCi0JCWlmIChzZWMgIT0gTlVMTAotCQkgICAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBhZGRyZXNzKQotCQkgIHsKLQkJICAgIC8qIFRoaXMgZGF0YSBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBidWlsZGluZy4gICovCi0JCSAgICBzZWMtPl9yYXdfc2l6ZSArPSBieXRlczsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBjaGFyIHNlY2J1ZlsyMF07Ci0JCSAgICBjaGFyICpzZWNuYW1lOwotCi0JCSAgICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7Ci0JCSAgICBzZWNuYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNlY2J1ZikgKyAxKTsKLQkJICAgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKLQkJICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY25hbWUpOwotCQkgICAgaWYgKHNlYyA9PSBOVUxMKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIHNlYy0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JCSAgICBzZWMtPnZtYSA9IGFkZHJlc3M7Ci0JCSAgICBzZWMtPmxtYSA9IGFkZHJlc3M7Ci0JCSAgICBzZWMtPl9yYXdfc2l6ZSA9IGJ5dGVzOwotCQkgICAgc2VjLT5maWxlcG9zID0gcG9zOwotCQkgIH0KLQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzcnOgotCQlhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzgnOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnOSc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCi0JCS8qIFRoaXMgaXMgYSB0ZXJtaW5hdGlvbiByZWNvcmQuICAqLwotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcmVzczsKLQotCQlpZiAoYnVmICE9IE5VTEwpCi0JCSAgZnJlZSAoYnVmKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlcnJvcikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN5bWJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKHN5bWJ1Zik7Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc3JlY19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBiWzRdOwotCi0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICdTJyB8fCAhSVNIRVggKGJbMV0pIHx8ICFJU0hFWCAoYlsyXSkgfHwgIUlTSEVYIChiWzNdKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBzcmVjX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgISBzcmVjX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhbiBTLXJlY29yZCBmaWxlIHdpdGggc3ltYm9scy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXN5bWJvbHNyZWNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBiWzJdOwotCi0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCAyLCBhYmZkKSAhPSAyKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICckJyB8fCBiWzFdICE9ICckJykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBzcmVjX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgISBzcmVjX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBpbnQgYzsKLSAgYmZkX3NpemVfdHlwZSBzb2ZhciA9IDA7Ci0gIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplID0gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRikKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBoZHJbM107Ci0gICAgICB1bnNpZ25lZCBpbnQgYnl0ZXM7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICBiZmRfYnl0ZSAqZGF0YTsKLQotICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNyZWNfc2NhbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCwgc28gd2UKLSAgICAgICAgIG91Z2h0IHRvIGtub3cgdGhlIGV4YWN0IGZvcm1hdC4gICovCi0gICAgICBCRkRfQVNTRVJUIChjID09ICdTJyk7Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCAzLCBhYmZkKSAhPSAzKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBCRkRfQVNTRVJUIChJU0hFWCAoaGRyWzFdKSAmJiBJU0hFWCAoaGRyWzJdKSk7Ci0KLSAgICAgIGJ5dGVzID0gSEVYIChoZHIgKyAxKTsKLQotICAgICAgaWYgKGJ5dGVzICogMiA+IGJ1ZnNpemUpCi0JewotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGJ5dGVzICogMik7Ci0JICBpZiAoYnVmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgYnVmc2l6ZSA9IGJ5dGVzICogMjsKLQl9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoYnVmLCAxLCBieXRlcyAqIDIsIGFiZmQpICE9IGJ5dGVzICogMikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRkcmVzcyA9IDA7Ci0gICAgICBkYXRhID0gYnVmOwotICAgICAgc3dpdGNoIChoZHJbMF0pCi0JewotCWRlZmF1bHQ6Ci0JICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgcmV0dXJuIHRydWU7Ci0KLQljYXNlICczJzoKLQkgIGFkZHJlc3MgPSBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgLS1ieXRlczsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnMic6Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgLS1ieXRlczsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnMSc6Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkgIGRhdGEgKz0gMjsKLQkgIGJ5dGVzIC09IDI7Ci0KLQkgIGlmIChhZGRyZXNzICE9IHNlY3Rpb24tPnZtYSArIHNvZmFyKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgY29tZSB0byB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgY29uc2lkZXIgY2hlY2tzdW0uICAqLwotCSAgLS1ieXRlczsKLQotCSAgd2hpbGUgKGJ5dGVzLS0gIT0gMCkKLQkgICAgewotCSAgICAgIGNvbnRlbnRzW3NvZmFyXSA9IEhFWCAoZGF0YSk7Ci0JICAgICAgZGF0YSArPSAyOwotCSAgICAgICsrc29mYXI7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyb3IpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24gaW4gYW4gUy1yZWNvcmQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChzZWN0aW9uLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0gYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwKLQkgICYmIHNlY3Rpb24tPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgc3JlY19yZWFkX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnVzZWRfYnlfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG1lbWNweSAobG9jYXRpb24sIChiZmRfYnl0ZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZCArIG9mZnNldCwKLQkgIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUuICBXZSBhY2NlcHQgYW4gdW5rbm93biBhcmNoaXRlY3R1cmUgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKTsKLX0KLQotLyogd2UgaGF2ZSB0byBzYXZlIHVwIGFsbCB0aGUgU3JlY29yZHMgZm9yIGEgc3BsdXJnZSBiZWZvcmUgb3V0cHV0ICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvOwotewotICB0ZGF0YV90eXBlICp0ZGF0YSA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YTsKLSAgcmVnaXN0ZXIgc3JlY19kYXRhX2xpc3RfdHlwZSAqZW50cnk7Ci0KLSAgZW50cnkgPSAoKHNyZWNfZGF0YV9saXN0X3R5cGUgKikKLQkgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3JlY19kYXRhX2xpc3RfdHlwZSkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChieXRlc190b19kbwotICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgYnl0ZXNfdG9fZG8pOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1jcHkgKChQVFIpIGRhdGEsIGxvY2F0aW9uLCAoc2l6ZV90KSBieXRlc190b19kbyk7Ci0KLSAgICAgIGlmICgoc2VjdGlvbi0+bG1hICsgb2Zmc2V0ICsgYnl0ZXNfdG9fZG8gLSAxKSA8PSAweGZmZmYpCi0JewotCi0JfQotICAgICAgZWxzZSBpZiAoKHNlY3Rpb24tPmxtYSArIG9mZnNldCArIGJ5dGVzX3RvX2RvIC0gMSkgPD0gMHhmZmZmZmYKLQkgICAgICAgJiYgdGRhdGEtPnR5cGUgPD0gMikKLQl7Ci0JICB0ZGF0YS0+dHlwZSA9IDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRkYXRhLT50eXBlID0gMzsKLQl9Ci0KLSAgICAgIGVudHJ5LT5kYXRhID0gZGF0YTsKLSAgICAgIGVudHJ5LT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKLSAgICAgIGVudHJ5LT5zaXplID0gYnl0ZXNfdG9fZG87Ci0KLSAgICAgIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKLSAgICAgICAgIGFkZGluZyBhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8KLSAgICAgIGlmICh0ZGF0YS0+dGFpbCAhPSBOVUxMCi0JICAmJiBlbnRyeS0+d2hlcmUgPj0gdGRhdGEtPnRhaWwtPndoZXJlKQotCXsKLQkgIHRkYXRhLT50YWlsLT5uZXh0ID0gZW50cnk7Ci0JICBlbnRyeS0+bmV4dCA9IE5VTEw7Ci0JICB0ZGF0YS0+dGFpbCA9IGVudHJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdpc3RlciBzcmVjX2RhdGFfbGlzdF90eXBlICoqbG9vazsKLQotCSAgZm9yIChsb29rID0gJnRkYXRhLT5oZWFkOwotCSAgICAgICAqbG9vayAhPSBOVUxMICYmICgqbG9vayktPndoZXJlIDwgZW50cnktPndoZXJlOwotCSAgICAgICBsb29rID0gJigqbG9vayktPm5leHQpCi0JICAgIDsKLQkgIGVudHJ5LT5uZXh0ID0gKmxvb2s7Ci0JICAqbG9vayA9IGVudHJ5OwotCSAgaWYgKGVudHJ5LT5uZXh0ID09IE5VTEwpCi0JICAgIHRkYXRhLT50YWlsID0gZW50cnk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgcmVjb3JkIG9mIHR5cGUsIG9mIHRoZSBzdXBwbGllZCBudW1iZXIgb2YgYnl0ZXMuIFRoZQotICAgc3VwcGxpZWQgYnl0ZXMgYW5kIGxlbmd0aCBkb24ndCBoYXZlIGEgY2hlY2tzdW0uIFRoYXQncyB3b3JrZWQgb3V0Ci0gICBoZXJlCi0qLwotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLCB0eXBlLCBhZGRyZXNzLCBkYXRhLCBlbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgY29uc3QgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGNvbnN0IGJmZF9ieXRlICplbmQ7Ci17Ci0gIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgdW5zaWduZWQgaW50IGNoZWNrX3N1bSA9IDA7Ci0gIENPTlNUIGJmZF9ieXRlICpzcmMgPSBkYXRhOwotICBjaGFyICpkc3QgPSBidWZmZXI7Ci0gIGNoYXIgKmxlbmd0aDsKLSAgYmZkX3NpemVfdHlwZSB3cmxlbjsKLQotICAqZHN0KysgPSAnUyc7Ci0gICpkc3QrKyA9ICcwJyArIHR5cGU7Ci0KLSAgbGVuZ3RoID0gZHN0OwotICBkc3QgKz0gMjsJCQkvKiBsZWF2ZSByb29tIGZvciBkc3QqLwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNzoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDI0KSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIGNhc2UgODoKLSAgICBjYXNlIDI6Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyA+PiAxNiksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICBjYXNlIDk6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMDoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDgpLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICBmb3IgKHNyYyA9IGRhdGE7IHNyYyA8IGVuZDsgc3JjKyspCi0gICAgewotICAgICAgVE9IRVggKGRzdCwgKnNyYywgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBsZW5ndGggKi8KLSAgVE9IRVggKGxlbmd0aCwgKGRzdCAtIGxlbmd0aCkgLyAyLCBjaGVja19zdW0pOwotICBjaGVja19zdW0gJj0gMHhmZjsKLSAgY2hlY2tfc3VtID0gMjU1IC0gY2hlY2tfc3VtOwotICBUT0hFWCAoZHN0LCBjaGVja19zdW0sIGNoZWNrX3N1bSk7Ci0gIGRzdCArPSAyOwotCi0gICpkc3QrKyA9ICdccic7Ci0gICpkc3QrKyA9ICdcbic7Ci0gIHdybGVuID0gZHN0IC0gYnVmZmVyOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIHdybGVuLCBhYmZkKSAhPSB3cmxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcltNQVhDSFVOS107Ci0gIGJmZF9ieXRlICpkc3QgPSBidWZmZXI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEknbGwgcHV0IGFuIGFyYml0YXJ5IDQwIGNoYXIgbGltaXQgb24gaGVhZGVyIHNpemUgKi8KLSAgZm9yIChpID0gMDsgaSA8IDQwICYmIGFiZmQtPmZpbGVuYW1lW2ldOyBpKyspCi0gICAgewotICAgICAgKmRzdCsrID0gYWJmZC0+ZmlsZW5hbWVbaV07Ci0gICAgfQotICByZXR1cm4gc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIDAsIDAsIGJ1ZmZlciwgZHN0KTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfc2VjdGlvbiAoYWJmZCwgdGRhdGEsIGxpc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdGRhdGFfdHlwZSAqdGRhdGE7Ci0gICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKmxpc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCBieXRlc193cml0dGVuID0gMDsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uID0gbGlzdC0+ZGF0YTsKLQotICB3aGlsZSAoYnl0ZXNfd3JpdHRlbiA8IGxpc3QtPnNpemUpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyZXNzOwotCi0gICAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfdGhpc19jaHVuayA9IGxpc3QtPnNpemUgLSBieXRlc193cml0dGVuOwotCi0gICAgICBpZiAoYnl0ZXNfdGhpc19jaHVuayA+IENIVU5LKQotCXsKLQkgIGJ5dGVzX3RoaXNfY2h1bmsgPSBDSFVOSzsKLQl9Ci0KLSAgICAgIGFkZHJlc3MgPSBsaXN0LT53aGVyZSArIGJ5dGVzX3dyaXR0ZW47Ci0KLSAgICAgIGlmICghIHNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJICAgICAgIHRkYXRhLT50eXBlLAotCQkJICAgICAgIGFkZHJlc3MsCi0JCQkgICAgICAgbG9jYXRpb24sCi0JCQkgICAgICAgbG9jYXRpb24gKyBieXRlc190aGlzX2NodW5rKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJ5dGVzX3dyaXR0ZW4gKz0gYnl0ZXNfdGhpc19jaHVuazsKLSAgICAgIGxvY2F0aW9uICs9IGJ5dGVzX3RoaXNfY2h1bms7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV90ZXJtaW5hdG9yIChhYmZkLCB0ZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICB0ZGF0YV90eXBlICp0ZGF0YTsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotCi0gIHJldHVybiBzcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwgMTAgLSB0ZGF0YS0+dHlwZSwKLQkJCSAgICBhYmZkLT5zdGFydF9hZGRyZXNzLCBidWZmZXIsIGJ1ZmZlcik7Ci19Ci0KLQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgLyogRHVtcCBvdXQgdGhlIHN5bWJvbHMgb2YgYSBiZmQgKi8KLSAgaW50IGk7Ci0gIGludCBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gIGlmIChjb3VudCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgYXN5bWJvbCAqKnRhYmxlID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiQkICVzXHJcbiIsIGFiZmQtPmZpbGVuYW1lKTsKLQotICAgICAgbGVuID0gc3RybGVuIChidWZmZXIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCXsKLQkgIGFzeW1ib2wgKnMgPSB0YWJsZVtpXTsKLQkgIGlmICghIGJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgcykKLQkgICAgICAmJiAocy0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSnVzdCBkdW1wIG91dCBub24gZGVidWcgc3ltYm9scyAqLwotCSAgICAgIGJmZF9zaXplX3R5cGUgbDsKLQkgICAgICBjaGFyIGJ1ZjJbNDBdLCAqcDsKLQotCSAgICAgIHNwcmludGZfdm1hIChidWYyLAotCQkJICAgcy0+dmFsdWUgKyBzLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bG1hCi0JCQkgICArIHMtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIHAgPSBidWYyOwotCSAgICAgIHdoaWxlIChwWzBdID09ICcwJyAmJiBwWzFdICE9IDApCi0JCXArKzsKLQkgICAgICBzcHJpbnRmIChidWZmZXIsICIgICVzICQlc1xyXG4iLCBzLT5uYW1lLCBwKTsKLQkgICAgICBsID0gc3RybGVuIChidWZmZXIpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgbCwgMSwgYWJmZCkgIT0gbCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJCQgXHJcbiIpOwotICAgICAgbGVuID0gc3RybGVuIChidWZmZXIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHN5bWJvbHM7Ci17Ci0gIHRkYXRhX3R5cGUgKnRkYXRhID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhOwotICBzcmVjX2RhdGFfbGlzdF90eXBlICpsaXN0OwotCi0gIGlmIChzeW1ib2xzKQotICAgIHsKLSAgICAgIGlmICghIHNyZWNfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBzcmVjX3dyaXRlX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3YW5kZXIgdGhvdWdoIGFsbCB0aGUgc2VjdGlvbnMgcHJvdmlkZWQgYW5kIG91dHB1dCB0aGVtICovCi0gIGxpc3QgPSB0ZGF0YS0+aGVhZDsKLQotICB3aGlsZSAobGlzdCAhPSAoc3JlY19kYXRhX2xpc3RfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHNyZWNfd3JpdGVfc2VjdGlvbiAoYWJmZCwgdGRhdGEsIGxpc3QpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIHNyZWNfd3JpdGVfdGVybWluYXRvciAoYWJmZCwgdGRhdGEpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkLCAwKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCwgMSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotc3JlY19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGV4ZWM7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1zcmVjX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXNyZWNfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICpjc3ltYm9sczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgY3N5bWJvbHMgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPmNzeW1ib2xzOwotICBpZiAoY3N5bWJvbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpjOwotICAgICAgc3RydWN0IHNyZWNfc3ltYm9sICpzOwotCi0gICAgICBjc3ltYm9scyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wpKTsKLSAgICAgIGlmIChjc3ltYm9scyA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5jc3ltYm9scyA9IGNzeW1ib2xzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bWJvbHMsIGMgPSBjc3ltYm9sczsKLQkgICBzICE9IE5VTEw7Ci0JICAgcyA9IHMtPm5leHQsICsrYykKLQl7Ci0JICBjLT50aGVfYmZkID0gYWJmZDsKLQkgIGMtPm5hbWUgPSBzLT5uYW1lOwotCSAgYy0+dmFsdWUgPSBzLT52YWw7Ci0JICBjLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBjLT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGMtPnVkYXRhLnAgPSBOVUxMOwotCX0KLSAgICB9Ci0JCi0gIGZvciAoaSA9IDA7IGkgPCBzeW1jb3VudDsgaSsrKQotICAgICphbG9jYXRpb24rKyA9IGNzeW1ib2xzKys7Ci0gICphbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBzeW1jb3VudDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc3JlY19nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc3JlY19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JICAgICAgIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwKLQkgICAgICAgc3ltYm9sLT5uYW1lKTsKLQotICAgIH0KLX0KLQotI2RlZmluZQlzcmVjX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBzcmVjX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBzcmVjX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSBzcmVjX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgc3JlY19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgc3JlY19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBzcmVjX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgc3JlY19yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHNyZWNfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF8wbCkKLSNkZWZpbmUgc3JlY19jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgc3JlY19iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBzcmVjX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgc3JlY19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHNyZWNfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIHNyZWNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgc3JlY19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBzcmVjX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIHNyZWNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgc3JlY192ZWMgPQotewotICAic3JlYyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgc3JlY19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBzcmVjX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwotCi0KLQotY29uc3QgYmZkX3RhcmdldCBzeW1ib2xzcmVjX3ZlYyA9Ci17Ci0gICJzeW1ib2xzcmVjIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBzeW1ib2xzcmVjX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc3JlY19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9zdGFiLXN5bXMuYyBiL2JmZC9zdGFiLXN5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmZTZjOC4uMDAwMDAwMAotLS0gYS9iZmQvc3RhYi1zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBUYWJsZSBvZiBzdGFiIG5hbWVzIGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgkJLyogVmFsdWUgZG9lc24ndCBtYXR0ZXIuICovCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLS8qIElnbm9yZSBkdXBsaWNhdGUgc3RhYiBjb2RlczsganVzdCByZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIGZpcnN0Ci0gICBvbmUuICAqLwotI2RlZmluZSBfX2RlZmluZV9zdGFiKE5BTUUsIENPREUsIFNUUklORykgX19kZWZpbmVfbmFtZShDT0RFLCBTVFJJTkcpCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKE5BTUUsIENPREUsIFNUUklORykKLQotLyogVGhlc2UgYXJlIG5vdCByZWFsbHkgc3RhYiBzeW1ib2xzLCBidXQgaXQgaXMKLSAgIGNvbnZlbmllbnQgdG8gaGF2ZSB0aGVtIGhlcmUgZm9yIHRoZSBzYWtlIG9mIG5tLgotICAgRm9yIGNvbXBsZXRlbmVzcywgd2UgY291bGQgYWxzbyBhZGQgTl9URVhUIGV0YywgYnV0IHRob3NlCi0gICBhcmUgbmV2ZXIgbmVlZGVkLCBzaW5jZSBubSB0cmVhdHMgdGhvc2Ugc3BlY2lhbGx5LiAqLwotI2RlZmluZSBFWFRSQV9TWU1CT0xTIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRBLCAiU0VUQSIpLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRULCAiU0VUVCIpLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVEQsICJTRVREIikvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUQiwgIlNFVEIiKS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVFYsICJTRVRWIikvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fSU5EUiwgIklORFIiKSBcCi0gIF9fZGVmaW5lX25hbWUgKE5fV0FSTklORywgIldBUk5JTkciKQotCi1jb25zdCBjaGFyICoKLWJmZF9nZXRfc3RhYl9uYW1lIChjb2RlKQotICAgICBpbnQgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSNkZWZpbmUgX19kZWZpbmVfbmFtZSh2YWwsIHN0cikgY2FzZSB2YWw6IHJldHVybiBzdHI7Ci0jaW5jbHVkZSAiYW91dC9zdGFiLmRlZiIKLSAgICAgIEVYVFJBX1NZTUJPTFMKLSAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICopIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvc3RhYnMuYyBiL2JmZC9zdGFicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmMwMDBkLi4wMDAwMDAwCi0tLSBhL2JmZC9zdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLS8qIFN0YWJzIGluIHNlY3Rpb25zIGxpbmtpbmcgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3IgbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucywgYXMgdXNlZAotICAgb24gQ09GRiBhbmQgRUxGLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qIFN0YWJzIGVudHJpZXMgdXNlIGEgMTIgYnl0ZSBmb3JtYXQ6Ci0gICAgIDQgYnl0ZSBzdHJpbmcgdGFibGUgaW5kZXgKLSAgICAgMSBieXRlIHN0YWIgdHlwZQotICAgICAxIGJ5dGUgc3RhYiBvdGhlciBmaWVsZAotICAgICAyIGJ5dGUgc3RhYiBkZXNjIGZpZWxkCi0gICAgIDQgYnl0ZSBzdGFiIHZhbHVlCi0gICBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIGZvciBhIDY0IGJpdCBvYmplY3QgZm9ybWF0LgotCi0gICBUaGUgc3RhYnMgc3ltYm9scyBhcmUgZGl2aWRlZCBpbnRvIGNvbXBpbGF0aW9uIHVuaXRzLiAgRm9yIHRoZQotICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aCBvZgotICAgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhpcyB1bml0LCBhbmQgdGhlIGRlc2MgZmllbGQgaXMgdGhlIG51bWJlciBvZgotICAgc3RhYnMgc3ltYm9scyBmb3IgdGhpcyB1bml0LiAgKi8KLQotI2RlZmluZSBTVFJEWE9GRiAoMCkKLSNkZWZpbmUgVFlQRU9GRiAoNCkKLSNkZWZpbmUgT1RIRVJPRkYgKDUpCi0jZGVmaW5lIERFU0NPRkYgKDYpCi0jZGVmaW5lIFZBTE9GRiAoOCkKLSNkZWZpbmUgU1RBQlNJWkUgKDEyKQotCi0vKiBBIGhhc2ggdGFibGUgdXNlZCBmb3IgaGVhZGVyIGZpbGVzIHdpdGggTl9CSU5DTCBlbnRyaWVzLiAgKi8KLQotc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgdG90YWxzIHRoYXQgd2UgaGF2ZSBmb3VuZCBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlcgotICAgZmlsZS4gICovCi0KLXN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzCi17Ci0gIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICpuZXh0OwotICBiZmRfdm1hIHRvdGFsOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBMaXN0IG9mIHRvdGFscyB3ZSBoYXZlIGZvdW5kIGZvciB0aGlzIGZpbGUuICAqLwotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqdG90YWxzOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3RhYl9saW5rX2luY2x1ZGVzX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgbGlzdCBvZiBOX0JJTkNMIHN5bWJvbHMsIHNvbWUgb2YKLSAgIHdoaWNoIG1pZ2h0IGJlIGNvbnZlcnRlZCBpbnRvIE5fRVhDTCBzeW1ib2xzLiAgKi8KLQotc3RydWN0IHN0YWJfZXhjbF9saXN0Ci17Ci0gIC8qIFRoZSBuZXh0IHN5bWJvbCB0byBjb252ZXJ0LiAgKi8KLSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpuZXh0OwotICAvKiBUaGUgb2Zmc2V0IHRvIHRoaXMgc3ltYm9sIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBvZmZzZXQ7Ci0gIC8qIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBzeW1ib2wuICAqLwotICBiZmRfdm1hIHZhbDsKLSAgLyogVGhlIHR5cGUgb2YgdGhpcyBzeW1ib2wgKE5fQklOQ0wgb3IgTl9FWENMKS4gICovCi0gIGludCB0eXBlOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgc3RvcmVkIHdpdGggZWFjaCAuc3RhYiBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoaXMgaXMgYSBsaW5rZWQgbGlzdCBvZiBOX0JJTkNMIHN5bWJvbHMgd2hpY2ggc2hvdWxkIGJlCi0gICAgIGNvbnZlcnRlZCBpbnRvIE5fRVhDTCBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpleGNsczsKLQotICAvKiBUaGlzIGlzIHVzZWQgdG8gbWFwIGlucHV0IHN0YWIgb2Zmc2V0cyB3aXRoaW4gdGhlaXIgc2VjdGlvbnMKLSAgICAgdG8gb3V0cHV0IHN0YWIgb2Zmc2V0cywgdG8gdGFrZSBpbnRvIGFjY291bnQgc3RhYnMgdGhhdCBoYXZlCi0gICAgIGJlZW4gZGVsZXRlZC4gIElmIGl0IGlzIE5VTEwsIHRoZSBvdXRwdXQgb2Zmc2V0cyBhcmUgdGhlIHNhbWUKLSAgICAgYXMgdGhlIGlucHV0IG9mZnNldHMsIGJlY2F1c2Ugbm8gc3RhYnMgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbQotICAgICB0aGlzIHNlY3Rpb24uICBPdGhlcndpc2UgdGhlIGkndGggZW50cnkgaXMgdGhlIG51bWJlciBvZgotICAgICBieXRlcyBvZiBzdGFicyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIHByaW9yIHRvIHRoZSBpJ3RoCi0gICAgIHN0YWIuICovCi0gIGJmZF9zaXplX3R5cGUgKmN1bXVsYXRpdmVfc2tpcHM7Ci0KLSAgLyogVGhpcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgaW5kaWNlcy4gIEZvciBlYWNoIHN0YWIgc3ltYm9sLCB3ZQotICAgICBzdG9yZSB0aGUgc3RyaW5nIGluZGV4IGhlcmUuICBJZiBhIHN0YWIgc3ltYm9sIHNob3VsZCBub3QgYmUKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIG91dHB1dCwgdGhlIHN0cmluZyBpbmRleCBpcyAtMS4gICovCi0gIGJmZF9zaXplX3R5cGUgc3RyaWR4c1sxXTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBzdGFicyBpbiBzZWN0aW9ucwotICAgaW5mb3JtYXRpb24gd2hpbGUgbGlua2luZy4gICovCi0KLXN0cnVjdCBzdGFiX2luZm8KLXsKLSAgLyogQSBoYXNoIHRhYmxlIHVzZWQgdG8gaG9sZCBzdGFicyBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RyaW5nczsKLSAgLyogVGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RhYmxlIGluY2x1ZGVzOwotICAvKiBUaGUgZmlyc3QgLnN0YWJzdHIgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpzdGFic3RyOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RhYl9saW5rX2luY2x1ZGVzX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQwKLS8qIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnRvdGFscyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGlucHV0IGZpbGUgZnJvbSB0aGUgYWRkX3N5bWJvbHMKLSAgIHBhc3Mgb2YgdGhlIGxpbmtlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfbGlua19zZWN0aW9uX3N0YWJzIChhYmZkLCBwc2luZm8sIHN0YWJzZWMsIHN0YWJzdHJzZWMsIHBzZWNpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgICAgYXNlY3Rpb24gKnN0YWJzdHJzZWM7Ci0gICAgIFBUUiAqcHNlY2luZm87Ci17Ci0gIGJvb2xlYW4gZmlyc3Q7Ci0gIHN0cnVjdCBzdGFiX2luZm8gKnNpbmZvOwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnNlY2luZm87Ci0gIGJmZF9ieXRlICpzdGFiYnVmID0gTlVMTDsKLSAgYmZkX2J5dGUgKnN0YWJzdHJidWYgPSBOVUxMOwotICBiZmRfYnl0ZSAqc3ltLCAqc3ltZW5kOwotICBiZmRfc2l6ZV90eXBlIHN0cm9mZiwgbmV4dF9zdHJvZmYsIHNraXA7Ci0gIGJmZF9zaXplX3R5cGUgKnBzdHJpZHg7Ci0KLSAgaWYgKHN0YWJzZWMtPl9yYXdfc2l6ZSA9PSAwCi0gICAgICB8fCBzdGFic3Ryc2VjLT5fcmF3X3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGZpbGUgZG9lcyBub3QgY29udGFpbiBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChzdGFic2VjLT5fcmF3X3NpemUgJSBTVEFCU0laRSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBmb3JtYXQgb2YgdGhlc2Ugc3RhYiBzeW1ib2xzLgotICAgICAgICAgRG9uJ3QgdHJ5IHRvIG9wdGltaXplIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICgoc3RhYnN0cnNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0gICAgewotICAgICAgLyogV2Ugc2hvdWxkbid0IHNlZSByZWxvY2F0aW9ucyBpbiB0aGUgc3RyaW5ncywgYW5kIHdlIGFyZW4ndAotICAgICAgICAgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICgoc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24pKQotICAgICAgfHwgKHN0YWJzdHJzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3RhYnN0cnNlYy0+b3V0cHV0X3NlY3Rpb24pKSkKLSAgICB7Ci0gICAgICAvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHNlY3Rpb25zIGlzIGJlaW5nIGRpc2NhcmRlZCBmcm9tIHRoZQotICAgICAgICAgbGluaywgc28gd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGZpcnN0ID0gZmFsc2U7Ci0KLSAgaWYgKCpwc2luZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBzdGFicyBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YuICAqLwotICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgKnBzaW5mbyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9pbmZvKSk7Ci0gICAgICBpZiAoKnBzaW5mbyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotICAgICAgc2luZm8tPnN0cmluZ3MgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICAgICAgaWYgKHNpbmZvLT5zdHJpbmdzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKCZzaW5mby0+aW5jbHVkZXMucm9vdCwKLQkJCQkgICBzdGFiX2xpbmtfaW5jbHVkZXNfbmV3ZnVuYywKLQkJCQkgICAyNTEpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc2luZm8tPnN0YWJzdHIgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zdGFic3RyIik7Ci0gICAgICBzaW5mby0+c3RhYnN0ci0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSB8IFNFQ19ERUJVR0dJTkc7Ci0gICAgfQotCi0gIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLQotICAvKiBJbml0aWFsaXplIHRoZSBpbmZvcm1hdGlvbiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgZm9yIHRoaXMgLnN0YWIKLSAgICAgc2VjdGlvbi4gICovCi0KLSAgY291bnQgPSBzdGFic2VjLT5fcmF3X3NpemUgLyBTVEFCU0laRTsKLQotICAqcHNlY2luZm8gPSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgKHNpemVvZiAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvKQotCQkJICArIChjb3VudCAtIDEpICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSkpOwotICBpZiAoKnBzZWNpbmZvID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc2VjaW5mbyA9IChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKikgKnBzZWNpbmZvOwotICBzZWNpbmZvLT5leGNscyA9IE5VTEw7Ci0gIHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgPSBOVUxMOwotICBtZW1zZXQgKHNlY2luZm8tPnN0cmlkeHMsIDAsIGNvdW50ICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgLyogUmVhZCB0aGUgc3RhYnMgaW5mb3JtYXRpb24gZnJvbSBhYmZkLiAgKi8KLQotICBzdGFiYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0gIHN0YWJzdHJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3RhYnN0cnNlYy0+X3Jhd19zaXplKTsKLSAgaWYgKHN0YWJidWYgPT0gTlVMTCB8fCBzdGFic3RyYnVmID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic2VjLCBzdGFiYnVmLCAwLAotCQkJCSAgc3RhYnNlYy0+X3Jhd19zaXplKQotICAgICAgfHwgISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzdHJzZWMsIHN0YWJzdHJidWYsIDAsCi0JCQkJICAgICBzdGFic3Ryc2VjLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3RhYnMgc3ltYm9scywgd29yayBvdXQgdGhlIG5ldyBzdHJpbmcgaW5kaWNlcywKLSAgICAgYW5kIGlkZW50aWZ5IE5fQklOQ0wgc3ltYm9scyB3aGljaCBjYW4gYmUgZWxpbWluYXRlZC4gICovCi0KLSAgc3Ryb2ZmID0gMDsKLSAgbmV4dF9zdHJvZmYgPSAwOwotICBza2lwID0gMDsKLQotICBzeW1lbmQgPSBzdGFiYnVmICsgc3RhYnNlYy0+X3Jhd19zaXplOwotICBmb3IgKHN5bSA9IHN0YWJidWYsIHBzdHJpZHggPSBzZWNpbmZvLT5zdHJpZHhzOwotICAgICAgIHN5bSA8IHN5bWVuZDsKLSAgICAgICBzeW0gKz0gU1RBQlNJWkUsICsrcHN0cmlkeCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotICAgICAgaWYgKCpwc3RyaWR4ICE9IDApCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkIGJ5IGFuIE5fQklOQ0wgcGFzcy4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHR5cGUgPSBzeW1bVFlQRU9GRl07Ci0KLSAgICAgIGlmICh0eXBlID09IDApCi0JewotCSAgLyogU3BlY2lhbCB0eXBlIDAgc3RhYnMgaW5kaWNhdGUgdGhlIG9mZnNldCB0byB0aGUgbmV4dAotICAgICAgICAgICAgIHN0cmluZyB0YWJsZS4gIFdlIG9ubHkgY29weSB0aGUgdmVyeSBmaXJzdCBvbmUuICAqLwotCSAgc3Ryb2ZmID0gbmV4dF9zdHJvZmY7Ci0JICBuZXh0X3N0cm9mZiArPSBiZmRfZ2V0XzMyIChhYmZkLCBzeW0gKyA4KTsKLQkgIGlmICghIGZpcnN0KQotCSAgICB7Ci0JICAgICAgKnBzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JICAgICAgKytza2lwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBmaXJzdCA9IGZhbHNlOwotCX0KLQotICAgICAgLyogU3RvcmUgdGhlIHN0cmluZyBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIHJlY29yZCB0aGUgaW5kZXguICAqLwotICAgICAgc3RyaW5nID0gKChjaGFyICopIHN0YWJzdHJidWYKLQkJKyBzdHJvZmYKLQkJKyBiZmRfZ2V0XzMyIChhYmZkLCBzeW0gKyBTVFJEWE9GRikpOwotICAgICAgKnBzdHJpZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHNpbmZvLT5zdHJpbmdzLCBzdHJpbmcsIHRydWUsIHRydWUpOwotCi0gICAgICAvKiBBbiBOX0JJTkNMIHN5bWJvbCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBzdGFicyBlbnRyaWVzCi0JIGZvciBhIGhlYWRlciBmaWxlLiAgV2UgbmVlZCB0byBzY2FuIGFoZWFkIHRvIHRoZSBuZXh0IE5fRUlOQ0wKLQkgc3ltYm9sLCBpZ25vcmluZyBuZXN0aW5nLCBhZGRpbmcgdXAgYWxsIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQotCSBzeW1ib2wgbmFtZXMsIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUgbnVtYmVycyBpbiB0eXBlcyAodGhlCi0JIGZpcnN0IG51bWJlciBhZnRlciBhbiBvcGVuIHBhcmVudGhlc2lzKS4gICovCi0gICAgICBpZiAodHlwZSA9PSBOX0JJTkNMKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCSAgaW50IG5lc3Q7Ci0JICBiZmRfYnl0ZSAqaW5jbF9zeW07Ci0JICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICppbmNsX2VudHJ5OwotCSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKnQ7Ci0JICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKm5lOwotCi0JICB2YWwgPSAwOwotCSAgbmVzdCA9IDA7Ci0JICBmb3IgKGluY2xfc3ltID0gc3ltICsgU1RBQlNJWkU7Ci0JICAgICAgIGluY2xfc3ltIDwgc3ltZW5kOwotCSAgICAgICBpbmNsX3N5bSArPSBTVEFCU0laRSkKLQkgICAgewotCSAgICAgIGludCBpbmNsX3R5cGU7Ci0KLQkgICAgICBpbmNsX3R5cGUgPSBpbmNsX3N5bVtUWVBFT0ZGXTsKLQkgICAgICBpZiAoaW5jbF90eXBlID09IDApCi0JCWJyZWFrOwotCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQl7Ci0JCSAgaWYgKG5lc3QgPT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIC0tbmVzdDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkrK25lc3Q7Ci0JICAgICAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqc3RyOwotCi0JCSAgc3RyID0gKChjaGFyICopIHN0YWJzdHJidWYKLQkJCSArIHN0cm9mZgotCQkJICsgYmZkX2dldF8zMiAoYWJmZCwgaW5jbF9zeW0gKyBTVFJEWE9GRikpOwotCQkgIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKQotCQkgICAgewotCQkgICAgICB2YWwgKz0gKnN0cjsKLQkJICAgICAgaWYgKCpzdHIgPT0gJygnKQotCQkJewotCQkJICAvKiBTa2lwIHRoZSBmaWxlIG51bWJlci4gICovCi0JCQkgICsrc3RyOwotCQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzdHIpKQotCQkJICAgICsrc3RyOwotCQkJICAtLXN0cjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIGhlYWRlciBmaWxlIHdpdGggdGhlIHNhbWUKLQkgICAgIHZhbHVlLCB0aGVuIHJlcGxhY2VkIHRoaXMgb25lIHdpdGggYW4gTl9FWENMIHN5bWJvbC4gICovCi0JICBpbmNsX2VudHJ5ID0gc3RhYl9saW5rX2luY2x1ZGVzX2xvb2t1cCAoJnNpbmZvLT5pbmNsdWRlcywgc3RyaW5nLAotCQkJCQkJICB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmNsX2VudHJ5ID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBmb3IgKHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JICAgIGlmICh0LT50b3RhbCA9PSB2YWwpCi0JICAgICAgYnJlYWs7Ci0KLQkgIC8qIFJlY29yZCB0aGlzIHN5bWJvbCwgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSB2YWx1ZQotICAgICAgICAgICAgIGNvcnJlY3RseS4gICovCi0JICBuZSA9IChzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKm5lKTsKLQkgIGlmIChuZSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG5lLT5vZmZzZXQgPSBzeW0gLSBzdGFiYnVmOwotCSAgbmUtPnZhbCA9IHZhbDsKLQkgIG5lLT50eXBlID0gTl9CSU5DTDsKLQkgIG5lLT5uZXh0ID0gc2VjaW5mby0+ZXhjbHM7Ci0JICBzZWNpbmZvLT5leGNscyA9IG5lOwotCi0JICBpZiAodCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHNlZW4gdGhpcyBoZWFkZXIgZmlsZQotCQkgd2l0aCB0aGlzIHNldCBvZiBzdGFicyBzdHJpbmdzLiAgKi8KLQkgICAgICB0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqKQotCQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJnNpbmZvLT5pbmNsdWRlcy5yb290LCBzaXplb2YgKnQpKTsKLQkgICAgICBpZiAodCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB0LT50b3RhbCA9IHZhbDsKLQkgICAgICB0LT5uZXh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOwotCSAgICAgIGluY2xfZW50cnktPnRvdGFscyA9IHQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgKmluY2xfcHN0cmlkeDsKLQotCSAgICAgIC8qIFdlIGhhdmUgc2VlbiB0aGlzIGhlYWRlciBmaWxlIGJlZm9yZS4gIFRlbGwgdGhlIGZpbmFsCi0JCSBwYXNzIHRvIGNoYW5nZSB0aGUgdHlwZSB0byBOX0VYQ0wuICAqLwotCSAgICAgIG5lLT50eXBlID0gTl9FWENMOwotCi0JICAgICAgLyogTWFyayB0aGUgc2tpcHBlZCBzeW1ib2xzLiAgKi8KLQotCSAgICAgIG5lc3QgPSAwOwotCSAgICAgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyBTVEFCU0laRSwgaW5jbF9wc3RyaWR4ID0gcHN0cmlkeCArIDE7Ci0JCSAgIGluY2xfc3ltIDwgc3ltZW5kOwotCQkgICBpbmNsX3N5bSArPSBTVEFCU0laRSwgKytpbmNsX3BzdHJpZHgpCi0JCXsKLQkJICBpbnQgaW5jbF90eXBlOwotCi0JCSAgaW5jbF90eXBlID0gaW5jbF9zeW1bVFlQRU9GRl07Ci0KLQkJICBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChuZXN0ID09IDApCi0JCQl7Ci0JCQkgICppbmNsX3BzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JCQkgICsrc2tpcDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIC0tbmVzdDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJICAgICsrbmVzdDsKLQkJICBlbHNlIGlmIChuZXN0ID09IDApCi0JCSAgICB7Ci0JCSAgICAgICppbmNsX3BzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JCSAgICAgICsrc2tpcDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBmcmVlIChzdGFiYnVmKTsKLSAgc3RhYmJ1ZiA9IE5VTEw7Ci0gIGZyZWUgKHN0YWJzdHJidWYpOwotICBzdGFic3RyYnVmID0gTlVMTDsKLQotICAvKiBXZSBuZWVkIHRvIHNldCB0aGUgc2VjdGlvbiBzaXplcyBzdWNoIHRoYXQgdGhlIGxpbmtlciB3aWxsCi0gICAgIGNvbXB1dGUgdGhlIG91dHB1dCBzZWN0aW9uIHNpemVzIGNvcnJlY3RseS4gIFdlIHNldCB0aGUgLnN0YWIKLSAgICAgc2l6ZSB0byBub3QgaW5jbHVkZSB0aGUgZW50cmllcyB3ZSBkb24ndCB3YW50LiAgV2Ugc2V0Ci0gICAgIFNFQ19FWENMVURFIGZvciB0aGUgLnN0YWJzdHIgc2VjdGlvbiwgc28gdGhhdCBpdCB3aWxsIGJlIGRyb3BwZWQKLSAgICAgZnJvbSB0aGUgbGluay4gIFdlIHJlY29yZCB0aGUgc2l6ZSBvZiB0aGUgc3RydGFiIGluIHRoZSBmaXJzdAotICAgICAuc3RhYnN0ciBzZWN0aW9uIHdlIHNhdywgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBzZXQgU0VDX0VYQ0xVREUKLSAgICAgZm9yIHRoYXQgc2VjdGlvbi4gICovCi0gIHN0YWJzZWMtPl9jb29rZWRfc2l6ZSA9IChjb3VudCAtIHNraXApICogU1RBQlNJWkU7Ci0gIGlmIChzdGFic2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzdGFic2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgc3RhYnN0cnNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gIHNpbmZvLT5zdGFic3RyLT5fY29va2VkX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChzaW5mby0+c3RyaW5ncyk7Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBgY3VtdWxhdGl2ZV9za2lwcycgYXJyYXkgbm93IHRoYXQgc3RhYnMgaGF2ZSBiZWVuCi0gICAgIGRlbGV0ZWQgZm9yIHRoaXMgc2VjdGlvbi4gKi8KLQotICBpZiAoc2tpcCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgaSwgb2Zmc2V0OwotICAgICAgYmZkX3NpemVfdHlwZSAqcHNraXBzOwotCi0gICAgICBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzID0KLQkoYmZkX3NpemVfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0gICAgICBpZiAoc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBwc2tpcHMgPSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzOwotICAgICAgcHN0cmlkeCA9IHNlY2luZm8tPnN0cmlkeHM7Ci0gICAgICBvZmZzZXQgPSAwOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcHNraXBzKyssIHBzdHJpZHgrKykKLQl7Ci0JICAqcHNraXBzID0gb2Zmc2V0OwotCSAgaWYgKCpwc3RyaWR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkgICAgb2Zmc2V0ICs9IFNUQUJTSVpFOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAob2Zmc2V0ICE9IDApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN0YWJidWYgIT0gTlVMTCkKLSAgICBmcmVlIChzdGFiYnVmKTsKLSAgaWYgKHN0YWJzdHJidWYgIT0gTlVMTCkKLSAgICBmcmVlIChzdGFic3RyYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHN0YWIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIHJlbG9jYXRlZAotICAgY29udGVudHMuICAqLwotCi1ib29sZWFuCi1fYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMgKG91dHB1dF9iZmQsIHBzaW5mbywgc3RhYnNlYywgcHNlY2luZm8sIGNvbnRlbnRzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgICAgUFRSICpwc2VjaW5mbzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKmU7Ci0gIGJmZF9ieXRlICpzeW0sICp0b3N5bSwgKnN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSAqcHN0cmlkeDsKLQotICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLQotICBpZiAoc2VjaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgICAgY29udGVudHMsIHN0YWJzZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICAgICBzdGFic2VjLT5fcmF3X3NpemUpOwotCi0gIC8qIEhhbmRsZSBlYWNoIE5fQklOQ0wgZW50cnkuICAqLwotICBmb3IgKGUgPSBzZWNpbmZvLT5leGNsczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqZXhjbF9zeW07Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGUtPm9mZnNldCA8IHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBleGNsX3N5bSA9IGNvbnRlbnRzICsgZS0+b2Zmc2V0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZS0+dmFsLCBleGNsX3N5bSArIFZBTE9GRik7Ci0gICAgICBleGNsX3N5bVtUWVBFT0ZGXSA9IGUtPnR5cGU7Ci0gICAgfQotCi0gIC8qIENvcHkgb3ZlciBhbGwgdGhlIHN0YWJzIHN5bWJvbHMsIG9taXR0aW5nIHRoZSBvbmVzIHdlIGRvbid0IHdhbnQsCi0gICAgIGFuZCBjb3JyZWN0aW5nIHRoZSBzdHJpbmcgaW5kaWNlcyBmb3IgdGhvc2Ugd2UgZG8gd2FudC4gICovCi0gIHRvc3ltID0gY29udGVudHM7Ci0gIHN5bWVuZCA9IGNvbnRlbnRzICsgc3RhYnNlYy0+X3Jhd19zaXplOwotICBmb3IgKHN5bSA9IGNvbnRlbnRzLCBwc3RyaWR4ID0gc2VjaW5mby0+c3RyaWR4czsKLSAgICAgICBzeW0gPCBzeW1lbmQ7Ci0gICAgICAgc3ltICs9IFNUQUJTSVpFLCArK3BzdHJpZHgpCi0gICAgewotICAgICAgaWYgKCpwc3RyaWR4ICE9IChiZmRfc2l6ZV90eXBlKSAtMSkKLQl7Ci0JICBpZiAodG9zeW0gIT0gc3ltKQotCSAgICBtZW1jcHkgKHRvc3ltLCBzeW0sIFNUQUJTSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsICpwc3RyaWR4LCB0b3N5bSArIFNUUkRYT0ZGKTsKLQotCSAgaWYgKHN5bVtUWVBFT0ZGXSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgaGVhZGVyIHN5bWJvbCBmb3IgdGhlIHN0YWJzIHNlY3Rpb24uICBXZQotICAgICAgICAgICAgICAgICBkb24ndCByZWFsbHkgbmVlZCBvbmUsIHNpbmNlIHdlIGhhdmUgbWVyZ2VkIGFsbCB0aGUKLSAgICAgICAgICAgICAgICAgaW5wdXQgc3RhYnMgc2VjdGlvbnMgaW50byBvbmUsIGJ1dCB3ZSBnZW5lcmF0ZSBvbmUKLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBiZW5lZml0IG9mIHJlYWRlcnMgd2hpY2ggZXhwZWN0IHRvIHNlZSBvbmUuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHN5bSA9PSBjb250ZW50cyk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc2luZm8tPnN0cmluZ3MpLAotCQkJICB0b3N5bSArIFZBTE9GRik7Ci0JICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwKLQkJCSAgc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSAvIFNUQUJTSVpFIC0gMSwKLQkJCSAgdG9zeW0gKyBERVNDT0ZGKTsKLQkgICAgfQotCi0JICB0b3N5bSArPSBTVEFCU0laRTsKLQl9Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAodG9zeW0gLSBjb250ZW50cykgPT0gc3RhYnNlYy0+X2Nvb2tlZF9zaXplKTsKLQotICByZXR1cm4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBzdGFic2VjLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICBjb250ZW50cywgc3RhYnNlYy0+b3V0cHV0X29mZnNldCwKLQkJCQkgICBzdGFic2VjLT5fY29va2VkX3NpemUpOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAob3V0cHV0X2JmZCwgcHNpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotewotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLQotICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0KLSAgaWYgKHNpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc2VjdGlvbiB3YXMgZGlzY2FyZGVkIGZyb20gdGhlIGxpbmsuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChzaW5mby0+c3RhYnN0ci0+b3V0cHV0X29mZnNldAotCSAgICAgICArIF9iZmRfc3RyaW5ndGFiX3NpemUgKHNpbmZvLT5zdHJpbmdzKSkKLQkgICAgICA8PSBzaW5mby0+c3RhYnN0ci0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkoc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zCi0JCSArIHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfb2Zmc2V0KSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKG91dHB1dF9iZmQsIHNpbmZvLT5zdHJpbmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHN0YWJzIGluZm9ybWF0aW9uLiAgKi8KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc2luZm8tPnN0cmluZ3MpOwotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmc2luZm8tPmluY2x1ZGVzLnJvb3QpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYW4gYWRkcmVzcyBpbiB0aGUgLnN0YWIgc2VjdGlvbi4gIEdpdmVuIE9GRlNFVCB3aXRoaW4KLSAgIFNUQUJTRUMsIHRoaXMgcmV0dXJucyB0aGUgbmV3IG9mZnNldCBpbiB0aGUgYWRqdXN0ZWQgc3RhYiBzZWN0aW9uLAotICAgb3IgLTEgaWYgdGhlIGFkZHJlc3MgcmVmZXJzIHRvIGEgc3RhYiB3aGljaCBoYXMgYmVlbiByZW1vdmVkLiAgKi8KLQotYmZkX3ZtYQotX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0IChvdXRwdXRfYmZkLCBwc2luZm8sIHN0YWJzZWMsIHBzZWNpbmZvLCBvZmZzZXQpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgUFRSICpwc2luZm87Ci0gICAgIGFzZWN0aW9uICpzdGFic2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotICAgICBiZmRfdm1hIG9mZnNldDsKLXsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotCi0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLQotICBpZiAoc2VjaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiBvZmZzZXQ7Ci0KLSAgaWYgKG9mZnNldCA+PSBzdGFic2VjLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIG9mZnNldCAtIChzdGFic2VjLT5fY29va2VkX3NpemUgLSBzdGFic2VjLT5fcmF3X3NpemUpOwotCi0gIGlmIChzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzKQotICAgIHsKLSAgICAgIGJmZF92bWEgaTsKLQotICAgICAgaSA9IG9mZnNldCAvIFNUQUJTSVpFOwotCi0gICAgICBpZiAoc2VjaW5mby0+c3RyaWR4cyBbaV0gPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiAoYmZkX3ZtYSkgLTE7Ci0KLSAgICAgIHJldHVybiBvZmZzZXQgLSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzIFtpXTsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zdGFtcC1oLmluIGIvYmZkL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvYmZkL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2JmZC9zdW5vcy5jIGIvYmZkL3N1bm9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNGY4NzguLjAwMDAwMDAKLS0tIGEvYmZkL3N1bm9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQ4ICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBTdW5PUyBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXN1bm9zLWJpZyIKLSNkZWZpbmUgTVkoT1ApIENBVChzdW5vc19iaWdfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogU3RhdGljIHJvdXRpbmVzIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gc3Vub3NfcmVhZF9keW5hbWljX2luZm8gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGxvbmcgc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdW5vc19saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAotCSAgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19zY2FuX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9leHRfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfbGlua19keW5hbWljX29iamVjdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19jaGVja19keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIsIGJmZF9ieXRlICosIGJvb2xlYW4gKiwKLQkgICBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgc3Vub3NfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2Mgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgc3Vub3NfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCBzdW5vc19saW5rX2R5bmFtaWNfb2JqZWN0Ci0jZGVmaW5lIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sIHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2Mgc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmsKLQotLyogPz8/IFdoZXJlIHNob3VsZCB0aGlzIGdvPyAgKi8KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpIFwKLSAgKCgobXR5cGUpID09IE1fU1BBUkMgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgMCkgIT0gTlVMTCkgXAotICAgfHwgKChtdHlwZSkgPT0gTV9TUEFSQ0xFVCBcCi0gICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpICE9IE5VTEwpIFwKLSAgIHx8ICgobXR5cGUpID09IE1fU1BBUkNMSVRFX0xFIFwKLSAgICAgICAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCkgIT0gTlVMTCkgXAotICAgfHwgKCgobXR5cGUpID09IE1fVU5LTk9XTiB8fCAobXR5cGUpID09IE1fNjgwMTAgfHwgKG10eXBlKSA9PSBNXzY4MDIwKSBcCi0gICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9tNjhrLCAwKSAhPSBOVUxMKSkKLQotLyogSW5jbHVkZSB0aGUgdXN1YWwgYS5vdXQgc3VwcG9ydC4gICovCi0jaW5jbHVkZSAiYW91dGYxLmgiCi0KLS8qIFRoZSBTdW5PUyA0LjEuNCAvdXNyL2luY2x1ZGUvbG9jYWxlLmggZGVmaW5lcyB2YWxpZCBhcyBhIG1hY3JvLiAgKi8KLSN1bmRlZiB2YWxpZAotCi0vKiBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiAgV2Ugc3RvcmUgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlCi0gICBpbiBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpLiAgKi8KLQotc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbwotewotICAvKiBXaGV0aGVyIHdlIGZvdW5kIGFueSBkeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KLSAgYm9vbGVhbiB2YWxpZDsKLSAgLyogRHluYW1pYyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluayBkeW5pbmZvOwotICAvKiBOdW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5zeW1fY291bnQ7Ci0gIC8qIFJlYWQgaW4gbmxpc3RzIGZvciBkeW5hbWljIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmR5bnN5bTsKLSAgLyogYXN5bWJvbCBzdHJ1Y3R1cmVzIGZvciBkeW5hbWljIHN5bWJvbHMuICAqLwotICBhb3V0X3N5bWJvbF90eXBlICpjYW5vbmljYWxfZHluc3ltOwotICAvKiBSZWFkIGluIGR5bmFtaWMgc3RyaW5nIHRhYmxlLiAgKi8KLSAgY2hhciAqZHluc3RyOwotICAvKiBOdW1iZXIgb2YgZHluYW1pYyByZWxvY3MuICAqLwotICB1bnNpZ25lZCBsb25nIGR5bnJlbF9jb3VudDsKLSAgLyogUmVhZCBpbiBkeW5hbWljIHJlbG9jcy4gIFRoaXMgbWF5IGJlIHJlbG9jX3N0ZF9leHRlcm5hbCBvcgotICAgICByZWxvY19leHRfZXh0ZXJuYWwuICAqLwotICBQVFIgZHlucmVsOwotICAvKiBhcmVsZW50IHN0cnVjdHVyZXMgZm9yIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgYXJlbGVudCAqY2Fub25pY2FsX2R5bnJlbDsKLX07Ci0KLS8qIFRoZSBoYXNoIHRhYmxlIG9mIGR5bmFtaWMgc3ltYm9scyBpcyBjb21wb3NlZCBvZiB0d28gd29yZCBlbnRyaWVzLgotICAgU2VlIGluY2x1ZGUvYW91dC9zdW40LmggZm9yIGRldGFpbHMuICAqLwotCi0jZGVmaW5lIEhBU0hfRU5UUllfU0laRSAoMiAqIEJZVEVTX0lOX1dPUkQpCi0KLS8qIFJlYWQgaW4gdGhlIGJhc2ljIGR5bmFtaWMgaW5mb3JtYXRpb24uICBUaGlzIGxvY2F0ZXMgdGhlIF9fRFlOQU1JQwotICAgc3RydWN0dXJlIGFuZCB1c2VzIGl0IHRvIGZpbmQgdGhlIGR5bmFtaWNfbGluayBzdHJ1Y3R1cmUuICBJdAotICAgY3JlYXRlcyBhbmQgc2F2ZXMgYSBzdW5vc19keW5hbWljX2luZm8gc3RydWN0dXJlLiAgSWYgaXQgY2FuJ3QgZmluZAotICAgX19EWU5BTUlDLCBpdCBzZXRzIHRoZSB2YWxpZCBmaWVsZCBvZiB0aGUgc3Vub3NfZHluYW1pY19pbmZvCi0gICBzdHJ1Y3R1cmUgdG8gZmFsc2UgdG8gYXZvaWQgZG9pbmcgdGhpcyB3b3JrIGFnYWluLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0gIGFzZWN0aW9uICpkeW5zZWM7Ci0gIGJmZF92bWEgZHlub2ZmOwotICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljIGR5bmluZm87Ci0gIHVuc2lnbmVkIGxvbmcgZHludmVyOwotICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsgbGlua2luZm87Ci0KLSAgaWYgKG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgIT0gKFBUUikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvID0gKChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopCi0JICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8pKSk7Ci0gIGlmICghaW5mbykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnZhbGlkID0gZmFsc2U7Ci0gIGluZm8tPmR5bnN5bSA9IE5VTEw7Ci0gIGluZm8tPmR5bnN0ciA9IE5VTEw7Ci0gIGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPSBOVUxMOwotICBpbmZvLT5keW5yZWwgPSBOVUxMOwotICBpbmZvLT5jYW5vbmljYWxfZHlucmVsID0gTlVMTDsKLSAgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKSA9IChQVFIpIGluZm87Ci0KLSAgLyogVGhpcyBjb2RlIHVzZWQgdG8gbG9vayBmb3IgdGhlIF9fRFlOQU1JQyBzeW1ib2wgdG8gbG9jYXRlIHRoZSBkeW5hbWljCi0gICAgIGxpbmtpbmcgaW5mb3JtYXRpb24uCi0gICAgIEhvd2V2ZXIgdGhpcyBpbmhpYml0cyByZWNvdmVyaW5nIHRoZSBkeW5hbWljIHN5bWJvbHMgZnJvbSBhCi0gICAgIHN0cmlwcGVkIG9iamVjdCBmaWxlLCBzbyBibGluZGx5IGFzc3VtZSB0aGF0IHRoZSBkeW5hbWljIGxpbmtpbmcKLSAgICAgaW5mb3JtYXRpb24gaXMgbG9jYXRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VjdGlvbi4KLSAgICAgV2UgY291bGQgdmVyaWZ5IHRoaXMgYXNzdW1wdGlvbiBsYXRlciBieSBsb29raW5nIHRocm91Z2ggdGhlIGR5bmFtaWMKLSAgICAgc3ltYm9scyBmb3IgdGhlIF9fRFlOQU1JQyBzeW1ib2wuICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCksIChQVFIpICZkeW5pbmZvLAotCQkJCSAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZHluaW5mbykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHludmVyID0gR0VUX1dPUkQgKGFiZmQsIGR5bmluZm8ubGRfdmVyc2lvbik7Ci0gIGlmIChkeW52ZXIgIT0gMiAmJiBkeW52ZXIgIT0gMykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vZmYgPSBHRVRfV09SRCAoYWJmZCwgZHluaW5mby5sZCk7Ci0KLSAgLyogZHlub2ZmIGlzIGEgdmlydHVhbCBhZGRyZXNzLiAgSXQgaXMgcHJvYmFibHkgYWx3YXlzIGluIHRoZSAuZGF0YQotICAgICBzZWN0aW9uLCBidXQgdGhpcyBjb2RlIHNob3VsZCB3b3JrIGV2ZW4gaWYgaXQgbW92ZXMuICAqLwotICBpZiAoZHlub2ZmIDwgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLSAgICBkeW5zZWMgPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBkeW5zZWMgPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gIGR5bm9mZiAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBkeW5zZWMpOwotICBpZiAoZHlub2ZmID4gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgZHluc2VjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBUaGlzIGV4ZWN1dGFibGUgYXBwZWFycyB0byBiZSBkeW5hbWljYWxseSBsaW5rZWQgaW4gYSB3YXkgdGhhdCB3ZQotICAgICBjYW4gdW5kZXJzdGFuZC4gICovCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZHluc2VjLCAoUFRSKSAmbGlua2luZm8sIGR5bm9mZiwKLQkJCQkgIChiZmRfc2l6ZV90eXBlKSBzaXplb2YgbGlua2luZm8pKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFN3YXAgaW4gdGhlIGR5bmFtaWMgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIGluZm8tPmR5bmluZm8ubGRfbG9hZGVkID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX2xvYWRlZCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfbmVlZCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9uZWVkKTsKLSAgaW5mby0+ZHluaW5mby5sZF9ydWxlcyA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9ydWxlcyk7Ci0gIGluZm8tPmR5bmluZm8ubGRfZ290ID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX2dvdCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfcGx0ID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3BsdCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfcmVsID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3JlbCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfaGFzaCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9oYXNoKTsKLSAgaW5mby0+ZHluaW5mby5sZF9zdGFiID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3N0YWIpOwotICBpbmZvLT5keW5pbmZvLmxkX3N0YWJfaGFzaCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9zdGFiX2hhc2gpOwotICBpbmZvLT5keW5pbmZvLmxkX2J1Y2tldHMgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfYnVja2V0cyk7Ci0gIGluZm8tPmR5bmluZm8ubGRfc3ltYm9scyA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9zeW1ib2xzKTsKLSAgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3ltYl9zaXplKTsKLSAgaW5mby0+ZHluaW5mby5sZF90ZXh0ID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3RleHQpOwotICBpbmZvLT5keW5pbmZvLmxkX3BsdF9zeiA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9wbHRfc3opOwotCi0gIC8qIFJlcG9ydGVkbHkgdGhlIGFkZHJlc3NlcyBuZWVkIHRvIGJlIG9mZnNldCBieSB0aGUgc2l6ZSBvZiB0aGUKLSAgICAgZXhlYyBoZWFkZXIgaW4gYW4gTk1BR0lDIGZpbGUuICAqLwotICBpZiAoYWRhdGEgKGFiZmQpLm1hZ2ljID09IG5fbWFnaWMpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBleGVjX2J5dGVzX3NpemUgPSBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOwotCi0gICAgICBpbmZvLT5keW5pbmZvLmxkX25lZWQgKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9ydWxlcyArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgICBpbmZvLT5keW5pbmZvLmxkX3JlbCArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgICBpbmZvLT5keW5pbmZvLmxkX2hhc2ggKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9zdGFiICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICAgIGluZm8tPmR5bmluZm8ubGRfc3ltYm9scyArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgfQotCi0gIC8qIFRoZSBvbmx5IHdheSB0byBnZXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiBhcHBlYXJzIHRvCi0gICAgIGJlIHRvIGRldGVybWluZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBpdCBhbmQgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGluZm8tPmR5bnN5bV9jb3VudCA9ICgoaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzIC0gaW5mby0+ZHluaW5mby5sZF9zdGFiKQotCQkJLyBFWFRFUk5BTF9OTElTVF9TSVpFKTsKLSAgQkZEX0FTU0VSVCAoaW5mby0+ZHluc3ltX2NvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRQotCSAgICAgID09ICh1bnNpZ25lZCBsb25nKSAoaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzCi0JCQkJICAtIGluZm8tPmR5bmluZm8ubGRfc3RhYikpOwotCi0gIC8qIFNpbWlsYXJseSwgdGhlIHJlbG9jcyBlbmQgYXQgdGhlIGhhc2ggdGFibGUuICAqLwotICBpbmZvLT5keW5yZWxfY291bnQgPSAoKGluZm8tPmR5bmluZm8ubGRfaGFzaCAtIGluZm8tPmR5bmluZm8ubGRfcmVsKQotCQkJLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICBCRkRfQVNTRVJUIChpbmZvLT5keW5yZWxfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkKLQkgICAgICA9PSAodW5zaWduZWQgbG9uZykgKGluZm8tPmR5bmluZm8ubGRfaGFzaAotCQkJCSAgLSBpbmZvLT5keW5pbmZvLmxkX3JlbCkpOwotCi0gIGluZm8tPnZhbGlkID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotCi0gIGlmICghIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gIGlmICghIGluZm8tPnZhbGlkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChpbmZvLT5keW5zeW1fY291bnQgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogUmVhZCB0aGUgZXh0ZXJuYWwgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0KLSAgLyogR2V0IHRoZSBnZW5lcmFsIGR5bmFtaWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAob2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gIGlmICghIGluZm8tPnZhbGlkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBkeW5hbWljIG5saXN0IHN0cnVjdHVyZXMuICAqLwotICBpZiAoaW5mby0+ZHluc3ltID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5keW5zeW0gPSAoKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKQotCQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJIChpbmZvLT5keW5zeW1fY291bnQKLQkJCQkgICogRVhURVJOQUxfTkxJU1RfU0laRSkpKTsKLSAgICAgIGlmIChpbmZvLT5keW5zeW0gPT0gTlVMTCAmJiBpbmZvLT5keW5zeW1fY291bnQgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfc3RhYiwgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfcmVhZCAoKFBUUikgaW5mby0+ZHluc3ltLCBpbmZvLT5keW5zeW1fY291bnQsCi0JCQlFWFRFUk5BTF9OTElTVF9TSVpFLCBhYmZkKQotCSAgICAgICE9IGluZm8tPmR5bnN5bV9jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKQotCXsKLQkgIGlmIChpbmZvLT5keW5zeW0gIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpbmZvLT5keW5zeW0pOwotCSAgICAgIGluZm8tPmR5bnN5bSA9IE5VTEw7Ci0JICAgIH0KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgZHluYW1pYyBzdHJpbmdzLiAgKi8KLSAgaWYgKGluZm8tPmR5bnN0ciA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGluZm8tPmR5bnN0ciA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUpOwotICAgICAgaWYgKGluZm8tPmR5bnN0ciA9PSBOVUxMICYmIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKChQVFIpIGluZm8tPmR5bnN0ciwgMSwgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUsCi0JCQlhYmZkKQotCSAgICAgICE9IGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplKSkKLQl7Ci0JICBpZiAoaW5mby0+ZHluc3RyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaW5mby0+ZHluc3RyKTsKLQkgICAgICBpbmZvLT5keW5zdHIgPSBOVUxMOwotCSAgICB9Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3RvcmFnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3RvcmFnZTsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLSAgdW5zaWduZWQgbG9uZyBpOwotCi0gIGlmICghIHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0KLSNpZmRlZiBDSEVDS19EWU5BTUlDX0hBU0gKLSAgLyogQ2hlY2sgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZHluYW1pYyBoYXNoIHRhYmxlIGJ5IG1ha2luZyBzdXJlCi0gICAgIHRoYXQgZWFjaCBzeW1ib2wgY2FuIGJlIGxvY2F0ZWQgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB7Ci0gICAgYmZkX3NpemVfdHlwZSB0YWJsZV9zaXplOwotICAgIGJmZF9ieXRlICp0YWJsZTsKLSAgICBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgICBpZiAoaW5mby0+ZHluaW5mby5sZF9idWNrZXRzID4gaW5mby0+ZHluc3ltX2NvdW50KQotICAgICAgYWJvcnQgKCk7Ci0gICAgdGFibGVfc2l6ZSA9IGluZm8tPmR5bmluZm8ubGRfc3RhYiAtIGluZm8tPmR5bmluZm8ubGRfaGFzaDsKLSAgICB0YWJsZSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICh0YWJsZV9zaXplKTsKLSAgICBpZiAodGFibGUgPT0gTlVMTCAmJiB0YWJsZV9zaXplICE9IDApCi0gICAgICBhYm9ydCAoKTsKLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfaGFzaCwgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoKFBUUikgdGFibGUsIDEsIHRhYmxlX3NpemUsIGFiZmQpICE9IHRhYmxlX3NpemUpCi0gICAgICBhYm9ydCAoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZHluc3ltX2NvdW50OyBpKyspCi0gICAgICB7Ci0JdW5zaWduZWQgY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBsb25nIGhhc2g7Ci0KLQluYW1lID0gKCh1bnNpZ25lZCBjaGFyICopIGluZm8tPmR5bnN0cgotCQkrIEdFVF9XT1JEIChhYmZkLCBpbmZvLT5keW5zeW1baV0uZV9zdHJ4KSk7Ci0JaGFzaCA9IDA7Ci0Jd2hpbGUgKCpuYW1lICE9ICdcMCcpCi0JICBoYXNoID0gKGhhc2ggPDwgMSkgKyAqbmFtZSsrOwotCWhhc2ggJj0gMHg3ZmZmZmZmZjsKLQloYXNoICU9IGluZm8tPmR5bmluZm8ubGRfYnVja2V0czsKLQl3aGlsZSAoR0VUX1dPUkQgKGFiZmQsIHRhYmxlICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSkgIT0gaSkKLQkgIHsKLQkgICAgaGFzaCA9IEdFVF9XT1JEIChhYmZkLAotCQkJICAgICB0YWJsZSArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUgKyBCWVRFU19JTl9XT1JEKTsKLQkgICAgaWYgKGhhc2ggPT0gMCB8fCBoYXNoID49IHRhYmxlX3NpemUgLyBIQVNIX0VOVFJZX1NJWkUpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgZnJlZSAodGFibGUpOwotICB9Ci0jZW5kaWYgLyogQ0hFQ0tfRFlOQU1JQ19IQVNIICovCi0KLSAgLyogR2V0IHRoZSBhc3ltYm9sIHN0cnVjdHVyZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZHluYW1pYyBubGlzdAotICAgICBzdHJ1Y3R1cmVzLiAgKi8KLSAgaWYgKGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5jYW5vbmljYWxfZHluc3ltID0gKChhb3V0X3N5bWJvbF90eXBlICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaW5mby0+ZHluc3ltX2NvdW50Ci0JCQkJCSAgICAqIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpKSk7Ci0gICAgICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9PSBOVUxMICYmIGluZm8tPmR5bnN5bV9jb3VudCAhPSAwKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKCEgYW91dF8zMl90cmFuc2xhdGVfc3ltYm9sX3RhYmxlIChhYmZkLCBpbmZvLT5jYW5vbmljYWxfZHluc3ltLAotCQkJCQkgICAgaW5mby0+ZHluc3ltLCBpbmZvLT5keW5zeW1fY291bnQsCi0JCQkJCSAgICBpbmZvLT5keW5zdHIsCi0JCQkJCSAgICBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSwKLQkJCQkJICAgIHRydWUpKQotCXsKLQkgIGlmIChpbmZvLT5jYW5vbmljYWxfZHluc3ltICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSk7Ci0JICAgICAgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9IE5VTEw7Ci0JICAgIH0KLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIFJldHVybiBwb2ludGVycyB0byB0aGUgZHluYW1pYyBhc3ltYm9sIHN0cnVjdHVyZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZHluc3ltX2NvdW50OyBpKyspCi0gICAgKnN0b3JhZ2UrKyA9IChhc3ltYm9sICopIChpbmZvLT5jYW5vbmljYWxfZHluc3ltICsgaSk7Ci0gICpzdG9yYWdlID0gTlVMTDsKLQotICByZXR1cm4gaW5mby0+ZHluc3ltX2NvdW50OwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLXN0YXRpYyBsb25nCi1zdW5vc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotCi0gIGlmICghIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gIGlmICghIGluZm8tPnZhbGlkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChpbmZvLT5keW5yZWxfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHN0b3JhZ2UsIHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqKnN0b3JhZ2U7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgLyogR2V0IHRoZSBnZW5lcmFsIGR5bmFtaWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAob2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKSA9PSAoUFRSKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKSkKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICBpZiAoISBpbmZvLT52YWxpZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgZHluYW1pYyByZWxvYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChpbmZvLT5keW5yZWwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5keW5yZWwgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICAgKGluZm8tPmR5bnJlbF9jb3VudAotCQkJCSAgICAgICAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSkpOwotICAgICAgaWYgKGluZm8tPmR5bnJlbCA9PSBOVUxMICYmIGluZm8tPmR5bnJlbF9jb3VudCAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9yZWwsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKChQVFIpIGluZm8tPmR5bnJlbCwgaW5mby0+ZHlucmVsX2NvdW50LAotCQkJb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpLCBhYmZkKQotCSAgICAgICE9IGluZm8tPmR5bnJlbF9jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSkpCi0JewotCSAgaWYgKGluZm8tPmR5bnJlbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmR5bnJlbCk7Ci0JICAgICAgaW5mby0+ZHlucmVsID0gTlVMTDsKLQkgICAgfQotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBhcmVsZW50IHN0cnVjdHVyZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZHluYW1pYyByZWxvYwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChpbmZvLT5jYW5vbmljYWxfZHlucmVsID09IChhcmVsZW50ICopIE5VTEwpCi0gICAgewotICAgICAgYXJlbGVudCAqdG87Ci0KLSAgICAgIGluZm8tPmNhbm9uaWNhbF9keW5yZWwgPSAoKGFyZWxlbnQgKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChpbmZvLT5keW5yZWxfY291bnQKLQkJCQkJICAgICogc2l6ZW9mIChhcmVsZW50KSkpKTsKLSAgICAgIGlmIChpbmZvLT5jYW5vbmljYWxfZHlucmVsID09IE5VTEwgJiYgaW5mby0+ZHlucmVsX2NvdW50ICE9IDApCi0JcmV0dXJuIC0xOwotICAgICAgCi0gICAgICB0byA9IGluZm8tPmNhbm9uaWNhbF9keW5yZWw7Ci0KLSAgICAgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPT0gUkVMT0NfRVhUX1NJWkUpCi0JewotCSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcDsKLQkgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnBlbmQ7Ci0KLQkgIHAgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBpbmZvLT5keW5yZWw7Ci0JICBwZW5kID0gcCArIGluZm8tPmR5bnJlbF9jb3VudDsKLQkgIGZvciAoOyBwIDwgcGVuZDsgcCsrLCB0bysrKQotCSAgICBOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pIChhYmZkLCBwLCB0bywgc3ltcywKLQkJCQkJICBpbmZvLT5keW5zeW1fY291bnQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpwOwotCSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcGVuZDsKLQotCSAgcCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIGluZm8tPmR5bnJlbDsKLQkgIHBlbmQgPSBwICsgaW5mby0+ZHlucmVsX2NvdW50OwotCSAgZm9yICg7IHAgPCBwZW5kOyBwKyssIHRvKyspCi0JICAgIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIHAsIHRvLCBzeW1zLAotCQkJCQkgIGluZm8tPmR5bnN5bV9jb3VudCk7Ci0JfQotICAgIH0KLQotICAvKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIGR5bmFtaWMgYXJlbGVudCBzdHJ1Y3R1cmVzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGluZm8tPmR5bnJlbF9jb3VudDsgaSsrKQotICAgICpzdG9yYWdlKysgPSBpbmZvLT5jYW5vbmljYWxfZHlucmVsICsgaTsKLSAgKnN0b3JhZ2UgPSBOVUxMOwotCi0gIHJldHVybiBpbmZvLT5keW5yZWxfY291bnQ7Ci19Ci0MCi0vKiBDb2RlIHRvIGhhbmRsZSBsaW5raW5nIG9mIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBBIFNQQVJDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5IGlzIDEyIGJ5dGVzLiAgVGhlIGZpcnN0IGVudHJ5Ci0gICBpbiB0aGUgdGFibGUgaXMgYSBqdW1wIHdoaWNoIGlzIGZpbGxlZCBpbiBieSB0aGUgcnVudGltZSBsaW5rZXIuCi0gICBUaGUgcmVtYWluaW5nIGVudHJpZXMgYXJlIGJyYW5jaGVzIGJhY2sgdG8gdGhlIGZpcnN0IGVudHJ5LAotICAgZm9sbG93ZWQgYnkgYW4gaW5kZXggaW50byB0aGUgcmVsb2NhdGlvbiB0YWJsZSBlbmNvZGVkIHRvIGxvb2sgbGlrZQotICAgYSBzZXRoaSBvZiAlZzAuICAqLwotCi0jZGVmaW5lIFNQQVJDX1BMVF9FTlRSWV9TSVpFICgxMikKLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIHNwYXJjX3BsdF9maXJzdF9lbnRyeVtTUEFSQ19QTFRfRU5UUllfU0laRV0gPQotewotICAvKiBzZXRoaSAlaGkoMCksJWcxOyBhZGRyZXNzIGZpbGxlZCBpbiBieSBydW50aW1lIGxpbmtlci4gICovCi0gIDB4MywgMCwgMCwgMCwKLSAgLyogam1wICVnMTsgb2Zmc2V0IGZpbGxlZCBpbiBieSBydW50aW1lIGxpbmtlci4gICovCi0gIDB4ODEsIDB4YzAsIDB4NjAsIDAsCi0gIC8qIG5vcCAqLwotICAweDEsIDAsIDAsIDAKLX07Ci0KLS8qIHNhdmUgJXNwLCAtOTYsICVzcCAqLwotI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfV09SRDAgMHg5ZGUzYmZhMAotLyogY2FsbDsgYWRkcmVzcyBmaWxsZWQgaW4gbGF0ZXIuICAqLwotI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfV09SRDEgMHg0MDAwMDAwMAotLyogc2V0aGk7IHJlbG9jIGluZGV4IGZpbGxlZCBpbiBsYXRlci4gICovCi0jZGVmaW5lIFNQQVJDX1BMVF9FTlRSWV9XT1JEMiAweDAxMDAwMDAwCi0KLS8qIFRoaXMgc2VxdWVuY2UgaXMgdXNlZCB3aGVuIGZvciB0aGUganVtcCB0YWJsZSBlbnRyeSB0byBhIGRlZmluZWQKLSAgIHN5bWJvbCBpbiBhIGNvbXBsZXRlIGV4ZWN1dGFibGUuICBJdCBpcyB1c2VkIHdoZW4gbGlua2luZyBQSUMKLSAgIGNvbXBpbGVkIGNvZGUgd2hpY2ggaXMgbm90IGJlaW5nIHB1dCBpbnRvIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotLyogc2V0aGkgPGFkZHJlc3MgdG8gYmUgZmlsbGVkIGluIGxhdGVyPiwgJWcxICovCi0jZGVmaW5lIFNQQVJDX1BMVF9QSUNfV09SRDAgMHgwMzAwMDAwMAotLyogam1wICVnMSArIDxhZGRyZXNzIHRvIGJlIGZpbGxlZCBpbiBsYXRlcj4gKi8KLSNkZWZpbmUgU1BBUkNfUExUX1BJQ19XT1JEMSAweDgxYzA2MDAwCi0vKiBub3AgKi8KLSNkZWZpbmUgU1BBUkNfUExUX1BJQ19XT1JEMiAweDAxMDAwMDAwCi0KLS8qIEFuIG02OGsgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgaXMgOCBieXRlcy4gIFRoZSBmaXJzdCBlbnRyeQotICAgaW4gdGhlIHRhYmxlIGlzIGEganVtcCB3aGljaCBpcyBmaWxsZWQgaW4gdGhlIGJ5IHRoZSBydW50aW1lCi0gICBsaW5rZXIuICBUaGUgcmVtYWluaW5nIGVudHJpZXMgYXJlIGJyYW5jaGVzIGJhY2sgdG8gdGhlIGZpcnN0Ci0gICBlbnRyeSwgZm9sbG93ZWQgYnkgYSB0d28gYnl0ZSBpbmRleCBpbnRvIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLQotI2RlZmluZSBNNjhLX1BMVF9FTlRSWV9TSVpFICg4KQotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgbTY4a19wbHRfZmlyc3RfZW50cnlbTTY4S19QTFRfRU5UUllfU0laRV0gPQotewotICAvKiBqbXBzIEAjICovCi0gIDB4NGUsIDB4ZjksCi0gIC8qIEZpbGxlZCBpbiBieSBydW50aW1lIGxpbmtlciB3aXRoIGEgbWFnaWMgYWRkcmVzcy4gICovCi0gIDAsIDAsIDAsIDAsCi0gIC8qIE5vdCB1c2VkPyAgKi8KLSAgMCwgMAotfTsKLQotLyogYnNybCAqLwotI2RlZmluZSBNNjhLX1BMVF9FTlRSWV9XT1JEMCAoMHg2MWZmKQotLyogUmVtYWluaW5nIHdvcmRzIGZpbGxlZCBpbiBsYXRlci4gICovCi0KLS8qIEFuIGVudHJ5IGluIHRoZSBTdW5PUyBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLCB0aGlzIGlzIGl0cyBpbmRleCBpbnRvIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gLTEuICBBcyB0aGUgbGlua2VyIGxvb2tzIGF0Ci0gICAgIHRoZSBpbnB1dCBmaWxlcywgaXQgY2hhbmdlcyB0aGlzIHRvIC0yIGlmIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0gICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgQWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiwKLSAgICAgdGhlIGxpbmtlciB3aWxsIGtub3cgd2hldGhlciB0byBidWlsZCBhIGR5bmFtaWMgc3ltYm9sIHRhYmxlOyBpZgotICAgICBpdCBkb2VzIGJ1aWxkIG9uZSwgdGhpcyBiZWNvbWVzIHRoZSBpbmRleCBpbnRvIHRoZSB0YWJsZS4gICovCi0gIGxvbmcgZHluaW5keDsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBzeW1ib2wsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBuYW1lIGluIHRoZQotICAgICBkeW5hbWljIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotICBsb25nIGR5bnN0cl9pbmRleDsKLQotICAvKiBUaGUgb2Zmc2V0IGludG8gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdXNlZCBmb3IgdGhpcyBzeW1ib2wuICBJZgotICAgICB0aGUgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBHT1QgZW50cnksIHRoaXMgaXMgMC4gICovCi0gIGJmZF92bWEgZ290X29mZnNldDsKLQotICAvKiBUaGUgb2Zmc2V0IGludG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHVzZWQgZm9yIHRoaXMgc3ltYm9sLgotICAgICBJZiB0aGUgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBQTFQgZW50cnksIHRoaXMgaXMgMC4gICovCi0gIGJmZF92bWEgcGx0X29mZnNldDsKLQotICAvKiBTb21lIGxpbmtlciBmbGFncy4gICovCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19SRUZfUkVHVUxBUiAwMQotICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfREVGX1JFR1VMQVIgMDIKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIFNVTk9TX1JFRl9EWU5BTUlDIDA0Ci0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19ERUZfRFlOQU1JQyAwMTAKLSAgLyogU3ltYm9sIGlzIGEgY29uc3RydWN0b3Igc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19DT05TVFJVQ1RPUiAwMjAKLX07Ci0KLS8qIFRoZSBTdW5PUyBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogVGhlIG9iamVjdCB3aGljaCBob2xkcyB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0gIGJmZCAqZHlub2JqOwotCi0gIC8qIFdoZXRoZXIgd2UgaGF2ZSBjcmVhdGVkIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQ7Ci0KLSAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX3NlY3Rpb25zX25lZWRlZDsKLQotICAvKiBXaGV0aGVyIHdlIG5lZWQgdGhlIC5nb3QgdGFibGUuICAqLwotICBib29sZWFuIGdvdF9uZWVkZWQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMuICAqLwotICBzaXplX3QgZHluc3ltY291bnQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgc2l6ZV90IGJ1Y2tldGNvdW50OwotCi0gIC8qIFRoZSBsaXN0IG9mIGR5bmFtaWMgb2JqZWN0cyBuZWVkZWQgYnkgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluCi0gICAgIHRoZSBsaW5rLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0KLSAgLyogVGhlIG9mZnNldCBvZiBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGludG8gdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgZ290X2Jhc2U7Ci19OwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBTdW5PUyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopCi0JIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+ZHluaW5keCA9IC0xOwotICAgICAgcmV0LT5keW5zdHJfaW5kZXggPSAtMTsKLSAgICAgIHJldC0+Z290X29mZnNldCA9IDA7Ci0gICAgICByZXQtPnBsdF9vZmZzZXQgPSAwOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIHN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IGZhbHNlOwotICByZXQtPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkID0gZmFsc2U7Ci0gIHJldC0+Z290X25lZWRlZCA9IGZhbHNlOwotICByZXQtPmR5bnN5bWNvdW50ID0gMDsKLSAgcmV0LT5idWNrZXRjb3VudCA9IDA7Ci0gIHJldC0+bmVlZGVkID0gTlVMTDsKLSAgcmV0LT5nb3RfYmFzZSA9IDA7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBTdW5PUyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN1bm9zX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGFvdXRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLQkJCSAgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIFN1bk9TIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3Vub3NfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBTdW5PUyBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgc3Vub3NfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogQ3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zIG5lZWRlZCBpZiB3ZSBhcmUgbGlua2luZyBhZ2FpbnN0IGEKLSAgIGR5bmFtaWMgb2JqZWN0LCBvciBpZiB3ZSBhcmUgbGlua2luZyBQSUMgY29tcGlsZWQgY29kZS4gIEFCRkQgaXMgYQotICAgYmZkIHdlIGNhbiBhdHRhY2ggdGhlIGR5bmFtaWMgc2VjdGlvbnMgdG8uICBUaGUgbGlua2VyIHNjcmlwdCB3aWxsCi0gICBsb29rIGZvciB0aGVzZSBzcGVjaWFsIHNlY3Rpb25zIG5hbWVzIGFuZCBwdXQgdGhlbSBpbiB0aGUgcmlnaHQKLSAgIHBsYWNlIGluIHRoZSBvdXRwdXQgZmlsZS4gIFNlZSBpbmNsdWRlL2FvdXQvc3VuNC5oIGZvciBtb3JlIGRldGFpbHMKLSAgIG9mIHRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBuZWVkZWQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotCi0gICAgICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICAgICAgLyogVGhlIC5keW5hbWljIHNlY3Rpb24gaG9sZHMgdGhlIGJhc2ljIGR5bmFtaWMgaW5mb3JtYXRpb246IHRoZQotCSBzdW40X2R5bmFtaWMgc3RydWN0dXJlLCB0aGUgZHluYW1pYyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiwgYW5kCi0JIHRoZSBzdW40X2R5bmFtaWNfbGluayBzdHJ1Y3R1cmUuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluYW1pYyIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAuZ290IHNlY3Rpb24gaG9sZHMgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBUaGUgYWRkcmVzcwotCSBpcyBwdXQgaW4gdGhlIGxkX2dvdCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nb3QiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLnBsdCBzZWN0aW9uIGhvbGRzIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFRoZQotCSBhZGRyZXNzIGlzIHB1dCBpbiB0aGUgbGRfcGx0IGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX0NPREUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5keW5yZWwgc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyByZWxvY3MuICBUaGUgYWRkcmVzcyBpcwotCSBwdXQgaW4gdGhlIGxkX3JlbCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5yZWwiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLmhhc2ggc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyBoYXNoIHRhYmxlLiAgVGhlIGFkZHJlc3MKLQkgaXMgcHV0IGluIHRoZSBsZF9oYXNoIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmhhc2giKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLmR5bnN5bSBzZWN0aW9uIGhvbGRzIHRoZSBkeW5hbWljIHN5bWJvbHMuICBUaGUgYWRkcmVzcwotCSBpcyBwdXQgaW4gdGhlIGxkX3N0YWIgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3ltIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5keW5zdHIgc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyBzeW1ib2wgc3RyaW5nIHRhYmxlLgotCSBUaGUgYWRkcmVzcyBpcyBwdXQgaW4gdGhlIGxkX3N5bWJvbHMgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3RyIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmICgobmVlZGVkICYmICEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkKQotICAgICAgfHwgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGJmZCAqZHlub2JqOwotCi0gICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQgPSB0cnVlOwotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQgPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGR5bmFtaWMgc3ltYm9scyBkdXJpbmcgYSBsaW5rLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGEub3V0Ci0gICBiYWNrZW5kIGxpbmtlciBmb3IgZWFjaCBvYmplY3QgaXQgZW5jb3VudGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvLCBzeW1zcCwgc3ltX2NvdW50cCwgc3RyaW5nc3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKnN5bXNwOwotICAgICBiZmRfc2l6ZV90eXBlICpzeW1fY291bnRwOwotICAgICBjaGFyICoqc3RyaW5nc3A7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqZGluZm87Ci0gIHVuc2lnbmVkIGxvbmcgbmVlZDsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbGwgdGhlIHJlcXVpcmVkIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywKLQkJCQkJICAgKCgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JCQkJCSAgICAgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCQkJCSAgICA/IHRydWUKLQkJCQkJICAgIDogZmFsc2UpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkbyBmb3IgYSBub3JtYWwgb2JqZWN0LiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBXZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoZSBzZWN0aW9ucyBpbiBhIGR5bmFtaWMgb2JqZWN0IGluIHRoZQotICAgICBvdXRwdXQgZmlsZS4gIFdlIGhhY2sgYnkgc2ltcGx5IGNsb2JiZXJpbmcgdGhlIGxpc3Qgb2Ygc2VjdGlvbnMKLSAgICAgaW4gdGhlIEJGRC4gIFRoaXMgY291bGQgYmUgaGFuZGxlZCBtb3JlIGNsZWFubHkgYnksIHNheSwgYSBuZXcKLSAgICAgc2VjdGlvbiBmbGFnOyB0aGUgZXhpc3RpbmcgU0VDX05FVkVSX0xPQUQgZmxhZyBpcyBub3QgdGhlIG9uZSB3ZQotICAgICB3YW50LCBiZWNhdXNlIHRoYXQgb25lIHN0aWxsIGltcGxpZXMgdGhhdCB0aGUgc2VjdGlvbiB0YWtlcyB1cAotICAgICBzcGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBJZiB0aGlzIGlzIHRoZSBmaXJzdCBvYmplY3Qgd2UgaGF2ZQotICAgICBzZWVuLCB3ZSBtdXN0IHByZXNlcnZlIHRoZSBkeW5hbWljIHNlY3Rpb25zIHdlIGp1c3QgY3JlYXRlZC4gICovCi0gIGlmIChhYmZkICE9IGR5bm9iaikKLSAgICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwOwotCSAgIHMgPSBzLT5uZXh0KQotCTsKLSAgICAgIGFiZmQtPnNlY3Rpb25zID0gczsKLSAgICB9Ci0KLSAgLyogVGhlIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8ganVzdCBpZ25vcmUgZHluYW1pYyBvYmplY3RzIHdoZW4gLXIgaXMKLSAgICAgdXNlZC4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhlcmUncyBubyBob3BlIG9mIHVzaW5nIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggZG9lcyBub3QgZXhhY3RseQotICAgICBtYXRjaCB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSAubmVlZCBhbmQgYSAucnVsZXMgc2VjdGlvbnMuICBUaGVzZSBhcmUgb25seQotICAgICBuZWVkZWQgaWYgdGhlcmUgcmVhbGx5IGlzIGEgZHluYW1pYyBvYmplY3QgaW4gdGhlIGxpbmssIHNvIHRoZXkKLSAgICAgYXJlIG5vdCBhZGRlZCBieSBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSAubmVlZCBzZWN0aW9uIGhvbGRzIHRoZSBsaXN0IG9mIG5hbWVzIG9mIHNoYXJlZCBvYmpldHMKLQkgd2hpY2ggbXVzdCBiZSBpbmNsdWRlZCBhdCBydW50aW1lLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcwotCSBzZWN0aW9uIGlzIHB1dCBpbiB0aGUgbGRfbmVlZCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLm5lZWQiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHMsCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSAucnVsZXMgc2VjdGlvbiBob2xkcyB0aGUgcGF0aCB0byBzZWFyY2ggZm9yIHNoYXJlZAotCSBvYmplY3RzLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcyBzZWN0aW9uIGlzIHB1dCBpbiB0aGUgbGRfcnVsZXMKLQkgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5ydWxlcyIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgcywKLQkJCQkgICAgICAoU0VDX0FMTE9DCi0JCQkJICAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBQaWNrIHVwIHRoZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJldHVybiB0aGVtIHRvIHRoZSBjYWxsZXIuICAqLwotICBpZiAoISBzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKLSAgKnN5bXNwID0gZGluZm8tPmR5bnN5bTsKLSAgKnN5bV9jb3VudHAgPSBkaW5mby0+ZHluc3ltX2NvdW50OwotICAqc3RyaW5nc3AgPSBkaW5mby0+ZHluc3RyOwotCi0gIC8qIFJlY29yZCBpbmZvcm1hdGlvbiBhYm91dCBhbnkgb3RoZXIgb2JqZWN0cyBuZWVkZWQgYnkgdGhpcyBvbmUuICAqLwotICBuZWVkID0gZGluZm8tPmR5bmluZm8ubGRfbmVlZDsKLSAgd2hpbGUgKG5lZWQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBidWZbMTZdOwotICAgICAgdW5zaWduZWQgbG9uZyBuYW1lLCBmbGFnczsKLSAgICAgIHVuc2lnbmVkIHNob3J0IG1ham9yX3ZubywgbWlub3Jfdm5vOwotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICoqcHA7Ci0gICAgICBjaGFyICpuYW1lYnVmLCAqcDsKLSAgICAgIHNpemVfdCBhbGM7Ci0gICAgICBiZmRfYnl0ZSBiOwotICAgICAgY2hhciAqbmFtZWNvcHk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbmVlZCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF9yZWFkIChidWYsIDEsIDE2LCBhYmZkKSAhPSAxNikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZvciB0aGUgZm9ybWF0IG9mIGFuIGxkX25lZWQgZW50cnksIHNlZSBhb3V0L3N1bjQuaC4gIFdlCi0gICAgICAgICBzaG91bGQgcHJvYmFibHkgZGVmaW5lIHN0cnVjdHMgZm9yIHRoaXMgbWFuaXB1bGF0aW9uLiAgKi8KLQotICAgICAgbmFtZSA9IGJmZF9nZXRfMzIgKGFiZmQsIGJ1Zik7Ci0gICAgICBmbGFncyA9IGJmZF9nZXRfMzIgKGFiZmQsIGJ1ZiArIDQpOwotICAgICAgbWFqb3Jfdm5vID0gKHVuc2lnbmVkIHNob3J0KWJmZF9nZXRfMTYgKGFiZmQsIGJ1ZiArIDgpOwotICAgICAgbWlub3Jfdm5vID0gKHVuc2lnbmVkIHNob3J0KWJmZF9nZXRfMTYgKGFiZmQsIGJ1ZiArIDEwKTsKLSAgICAgIG5lZWQgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYgKyAxMik7Ci0KLSAgICAgIG5lZWRlZCA9ICgoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QpKSk7Ci0gICAgICBpZiAobmVlZGVkID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmVlZGVkLT5ieSA9IGFiZmQ7Ci0KLSAgICAgIC8qIFdlIHJldHVybiB0aGUgbmFtZSBhcyBbLWxdbmFtZVsubWFqXVsubWluXS4gICovCi0gICAgICBhbGMgPSAzMDsKLSAgICAgIG5hbWVidWYgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChhbGMgKyAxKTsKLSAgICAgIGlmIChuYW1lYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcCA9IG5hbWVidWY7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiAweDgwMDAwMDAwKSAhPSAwKQotCXsKLQkgICpwKysgPSAnLSc7Ci0JICAqcCsrID0gJ2wnOwotCX0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbmFtZSwgU0VFS19TRVQpICE9IDApCi0JewotCSAgZnJlZSAobmFtZWJ1Zik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBkbwotCXsKLQkgIGlmIChiZmRfcmVhZCAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHsKLQkgICAgICBmcmVlIChuYW1lYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKChzaXplX3QpIChwIC0gbmFtZWJ1ZikgPj0gYWxjKQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIGFsYyAqPSAyOwotCSAgICAgIG4gPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAobmFtZWJ1ZiwgYWxjICsgMSk7Ci0JICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKG5hbWVidWYpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIHAgPSBuICsgKHAgLSBuYW1lYnVmKTsKLQkgICAgICBuYW1lYnVmID0gbjsKLQkgICAgfQotCi0JICAqcCsrID0gYjsKLQl9Ci0gICAgICB3aGlsZSAoYiAhPSAnXDAnKTsKLQotICAgICAgaWYgKG1ham9yX3ZubyA9PSAwKQotCSpwID0gJ1wwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyIG1hamJ1ZlszMF07Ci0JICBjaGFyIG1pbmJ1ZlszMF07Ci0KLQkgIHNwcmludGYgKG1hamJ1ZiwgIi4lZCIsIG1ham9yX3Zubyk7Ci0JICBpZiAobWlub3Jfdm5vID09IDApCi0JICAgIG1pbmJ1ZlswXSA9ICdcMCc7Ci0JICBlbHNlCi0JICAgIHNwcmludGYgKG1pbmJ1ZiwgIi4lZCIsIG1pbm9yX3Zubyk7Ci0KLQkgIGlmICgocCAtIG5hbWVidWYpICsgc3RybGVuIChtYWpidWYpICsgc3RybGVuIChtaW5idWYpID49IGFsYykKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBhbGMgPSAocCAtIG5hbWVidWYpICsgc3RybGVuIChtYWpidWYpICsgc3RybGVuIChtaW5idWYpOwotCSAgICAgIG4gPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAobmFtZWJ1ZiwgYWxjICsgMSk7Ci0JICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKG5hbWVidWYpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIHAgPSBuICsgKHAgLSBuYW1lYnVmKTsKLQkgICAgICBuYW1lYnVmID0gbjsKLQkgICAgfQotCi0JICBzdHJjcHkgKHAsIG1hamJ1Zik7Ci0JICBzdHJjYXQgKHAsIG1pbmJ1Zik7Ci0JfQotCi0gICAgICBuYW1lY29weSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lYnVmKSArIDEpOwotICAgICAgaWYgKG5hbWVjb3B5ID09IE5VTEwpCi0JewotCSAgZnJlZSAobmFtZWJ1Zik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgc3RyY3B5IChuYW1lY29weSwgbmFtZWJ1Zik7Ci0gICAgICBmcmVlIChuYW1lYnVmKTsKLSAgICAgIG5lZWRlZC0+bmFtZSA9IG5hbWVjb3B5OwotCi0gICAgICBuZWVkZWQtPm5leHQgPSBOVUxMOwotCi0gICAgICBmb3IgKHBwID0gJnN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci0JICAgKnBwICE9IE5VTEw7Ci0JICAgcHAgPSAmKCpwcCktPm5leHQpCi0JOwotICAgICAgKnBwID0gbmVlZGVkOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCi0gICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCi0gICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKLQkJICAgICAgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgaW50IG5ld19mbGFnOwotCi0gIGlmICgoZmxhZ3MgJiAoQlNGX0lORElSRUNUIHwgQlNGX1dBUk5JTkcgfCBCU0ZfQ09OU1RSVUNUT1IpKSAhPSAwCi0gICAgICB8fCAhIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCBjb3B5LAotCQkJCWZhbHNlKTsKLSAgZWxzZQotICAgIGggPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikKLQkgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGhhc2hwICE9IE5VTEwpCi0gICAgKmhhc2hwID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLSAgLyogVHJlYXQgYSBjb21tb24gc3ltYm9sIGluIGEgZHluYW1pYyBvYmplY3QgYXMgZGVmaW5lZCBpbiB0aGUgLmJzcwotICAgICBzZWN0aW9uIG9mIHRoZSBkeW5hbWljIG9iamVjdC4gIFdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgc3BhY2UKLSAgICAgZm9yIGl0IGluIG91ciBwcm9jZXNzIGltYWdlLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfbmV3Ci0gICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSBkZWZpbmluZyB0aGUgc3ltYm9sLCBhbmQgaXQgaXMgYWxyZWFkeSBkZWZpbmVkLiAgVGhpcwotCSBpcyBhIHBvdGVudGlhbCBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCXsKLQkgIC8qIFRoZSBkZWZpbml0aW9uIHdlIGFyZSBhZGRpbmcgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LgotCSAgICAgV2UgZG8gbm90IHdhbnQgdGhpcyBuZXcgZGVmaW5pdGlvbiB0byBvdmVycmlkZSB0aGUKLQkgICAgIGV4aXN0aW5nIGRlZmluaXRpb24sIHNvIHdlIHByZXRlbmQgaXQgaXMganVzdCBhCi0JICAgICByZWZlcmVuY2UuICAqLwotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgICAgICYmIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQl7Ci0JICAvKiBUaGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBXZQotCSAgICAgd2FudCB0byBvdmVycmlkZSBpdCB3aXRoIHRoZSBkZWZpbml0aW9uIHdlIGp1c3QgZm91bmQuCi0JICAgICBDbG9iYmVyIHRoZSBleGlzdGluZyBkZWZpbml0aW9uLiAgKi8KLQkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgICYmIChoLT5yb290LnJvb3QudS5jLnAtPnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JewotCSAgLyogVGhlIGV4aXN0aW5nIGRlZmluaXRpb24gaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LiAgV2UKLQkgICAgIHdhbnQgdG8gb3ZlcnJpZGUgaXQgd2l0aCB0aGUgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLgotCSAgICAgQ2xvYmJlciB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbi4gIFdlIGNhbid0IHNldCBpdCB0byBuZXcsCi0JICAgICBiZWNhdXNlIGl0IGlzIG9uIHRoZSB1bmRlZmluZWQgbGlzdC4gICovCi0JICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3Qucm9vdC51LmMucC0+c2VjdGlvbi0+b3duZXI7Ci0JfQotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19DT05TVFJVQ1RPUikgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZXhpc3Rpbmcgc3ltYm9sIGlzIGEgY29uc3RydWN0b3Igc3ltYm9sLCBhbmQgdGhpcyBzeW1ib2wKLSAgICAgICAgIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIEEgY29uc3RydWN0b3Igc3ltYm9sIGlzIGFjdHVhbGx5IGEKLSAgICAgICAgIGRlZmluaXRpb24sIGFsdGhvdWdoIHRoZSB0eXBlIHdpbGwgYmUgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICAgIGF0IHRoaXMgcG9pbnQuICBXZSB3YW50IHRvIGlnbm9yZSB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZQotICAgICAgICAgZHluYW1pYyBvYmplY3QuICAqLwotICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgfQotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLQkgICAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwCi0JICAgJiYgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgJiYgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAmJiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGFuZCB0aGlzCi0gICAgICAgICBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbC4gIEFzIGFib3ZlLCB3ZSB3YW50IHRvIGZvcmNlIHRoZSB1c2UKLSAgICAgICAgIG9mIHRoZSBjb25zdHJ1Y3RvciBzeW1ib2wgZnJvbSB0aGUgcmVndWxhciBvYmplY3QuICAqLwotICAgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX25ldzsKLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIC8qIFNldCBhIGZsYWcgaW4gdGhlIGhhc2ggdGFibGUgZW50cnkgaW5kaWNhdGluZyB0aGUgdHlwZSBvZgotCSByZWZlcmVuY2Ugb3IgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLiAgS2VlcCBhIGNvdW50IG9mIHRoZQotCSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzIHdlIGZpbmQuICBBIGR5bmFtaWMgc3ltYm9sIGlzIG9uZQotCSB3aGljaCBpcyByZWZlcmVuY2VkIG9yIGRlZmluZWQgYnkgYm90aCBhIHJlZ3VsYXIgb2JqZWN0IGFuZCBhCi0JIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JewotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0JICAgIG5ld19mbGFnID0gU1VOT1NfUkVGX1JFR1VMQVI7Ci0JICBlbHNlCi0JICAgIG5ld19mbGFnID0gU1VOT1NfREVGX1JFR1VMQVI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotCSAgICBuZXdfZmxhZyA9IFNVTk9TX1JFRl9EWU5BTUlDOwotCSAgZWxzZQotCSAgICBuZXdfZmxhZyA9IFNVTk9TX0RFRl9EWU5BTUlDOwotCX0KLSAgICAgIGgtPmZsYWdzIHw9IG5ld19mbGFnOwotCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMQotCSAgJiYgKGgtPmZsYWdzICYgKFNVTk9TX0RFRl9SRUdVTEFSIHwgU1VOT1NfUkVGX1JFR1VMQVIpKSAhPSAwKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLQotICAgICAgaWYgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQloLT5mbGFncyB8PSBTVU5PU19DT05TVFJVQ1RPUjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgbGlzdCBvZiBvYmplY3RzIG5lZWRlZCBieSBCRkQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqCi1iZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0IChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci19Ci0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IG1hZGUgdG8gYSBzeW1ib2wgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBleGFtaW5lZCBhbGwgdGhlIGlucHV0IG9iamVjdHMuICBJZgotICAgICB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0LCBpdCBtZXJlbHkgbWVhbnMgdGhhdCBubyBvYmplY3QgcmVmZXJzCi0gICAgIHRvIGl0LCBhbmQgd2UgY2FuIGp1c3QgaWdub3JlIGl0IGF0IHRoaXMgcG9pbnQuICAqLwotICBoID0gc3Vub3NfbGlua19oYXNoX2xvb2t1cCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJbiBhIHNoYXJlZCBsaWJyYXJ5LCB0aGUgX19EWU5BTUlDIHN5bWJvbCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlCi0gICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkIHx8IHN0cmNtcCAobmFtZSwgIl9fRFlOQU1JQyIpICE9IDApCi0gICAgewotICAgICAgaC0+ZmxhZ3MgfD0gU1VOT1NfREVGX1JFR1VMQVI7Ci0KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB1cCB0aGUgc2l6ZXMgYW5kIGNvbnRlbnRzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zIGNyZWF0ZWQgaW4KLSAgIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgU3VuT1MgbGlua2VyCi0gICBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplcyBvZiB0aGUKLSAgIHNlY3Rpb25zIGJlZm9yZSB0aGUgbGlua2VyIHNldHMgdGhlIGFkZHJlc3NlcyBvZiB0aGUgdmFyaW91cwotICAgc2VjdGlvbnMuICBUaGlzIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgcmVhZGluZyBhbGwgdGhlIHJlbG9jcyBzbwotICAgdGhhdCB3ZSBjYW4gd29yayBvdXQgd2hpY2ggb25lcyBuZWVkIHRvIGJlY29tZSBkeW5hbWljIHJlbG9jcy4gIElmCi0gICBpbmZvLT5rZWVwX21lbW9yeSBpcyB0cnVlLCB3ZSBrZWVwIHRoZSByZWxvY3MgaW4gbWVtb3J5OyBvdGhlcndpc2UsCi0gICB3ZSBkaXNjYXJkIHRoZW0sIGFuZCB3aWxsIHJlYWQgdGhlbSBhZ2FpbiBsYXRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8sIHNkeW5wdHIsIHNuZWVkcHRyLAotCQkJCSBzcnVsZXNwdHIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICoqc2R5bnB0cjsKLSAgICAgYXNlY3Rpb24gKipzbmVlZHB0cjsKLSAgICAgYXNlY3Rpb24gKipzcnVsZXNwdHI7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBzaXplX3QgZHluc3ltY291bnQ7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGFzZWN0aW9uICpzOwotICBzaXplX3QgYnVja2V0Y291bnQ7Ci0gIHNpemVfdCBoYXNoYWxsb2M7Ci0gIHNpemVfdCBpOwotICBiZmQgKnN1YjsKLQotICAqc2R5bnB0ciA9IE5VTEw7Ci0gICpzbmVlZHB0ciA9IE5VTEw7Ci0gICpzcnVsZXNwdHIgPSBOVUxMOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEJ3MgYW5kIHJlYWQgdGhlaXIgcmVsb2NzLiAgSXQgd291bGQKLSAgICAgYmUgYmV0dGVyIGlmIHdlIGRpZG4ndCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCB0aGVyZSBpcyBubyBvdGhlciB3YXkKLSAgICAgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZHluYW1pYyByZWxvY3Mgd2UgbmVlZCwgYW5kLCBtb3JlCi0gICAgIGltcG9ydGFudGx5LCB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8ga25vdyB3aGljaCBzeW1ib2xzIHNob3VsZAotICAgICBnZXQgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgaWYgKChzdWItPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgJiYgc3ViLT54dmVjID09IG91dHB1dF9iZmQtPnh2ZWMpCi0JewotCSAgaWYgKCEgc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIHN1Yiwgb2JqX3RleHRzZWMgKHN1YiksCi0JCQkJICAgZXhlY19oZHIgKHN1YiktPmFfdHJzaXplKQotCSAgICAgIHx8ICEgc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIHN1Yiwgb2JqX2RhdGFzZWMgKHN1YiksCi0JCQkJICAgICAgZXhlY19oZHIgKHN1YiktPmFfZHJzaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZHluc3ltY291bnQgPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0KLSAgLyogSWYgdGhlcmUgd2VyZSBubyBkeW5hbWljIG9iamVjdHMgaW4gdGhlIGxpbmssIGFuZCB3ZSBkb24ndCBuZWVkCi0gICAgIHRvIGJ1aWxkIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgaWYgKCEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkCi0gICAgICAmJiAhIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gd2FzIG1lbnRpb25lZCwgZGVmaW5lIGl0LiAgKi8KLSAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGggIT0gTlVMTCAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCkKLSAgICB7Ci0gICAgICBoLT5mbGFncyB8PSBTVU5PU19ERUZfUkVHVUxBUjsKLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLSAgICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCi0gICAgICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIHNldAotICAgICAgICAgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byBiZSAweDEwMDAgYnl0ZXMgaW50byB0aGUgc2VjdGlvbiwKLSAgICAgICAgIHNvIHRoYXQgMTMgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gMHgxMDAwKQotCWgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLSAgICAgIGVsc2UKLQloLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSAwOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X2Jhc2UgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGFyZSBhbnkgc2hhcmVkIG9iamVjdHMgaW4gdGhlIGxpbmssIHRoZW4gd2UgbmVlZCB0byBzZXQKLSAgICAgdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQpCi0gICAgewotICAgICAgKnNkeW5wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICAgICAgLyogVGhlIC5keW5hbWljIHNlY3Rpb24gaXMgYWx3YXlzIHRoZSBzYW1lIHNpemUuICAqLwotICAgICAgcyA9ICpzZHlucHRyOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IChzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMpCi0JCSAgICAgICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUKLQkJICAgICAgKyBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWNfbGluaykpOwotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBhcyB3ZSByZWFkIHRoZSBpbnB1dCBmaWxlcy4gIFdlCi0JIHdpbGwgYnVpbGQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlICguZHluc3ltKSBhbmQgdGhlIGhhc2gKLQkgdGFibGUgKC5oYXNoKSB3aGVuIHdlIGJ1aWxkIHRoZSBmaW5hbCBzeW1ib2wgdGFibGUsIGJlY2F1c2UKLQkgdW50aWwgdGhlbiB3ZSBkbyBub3Qga25vdyB0aGUgY29ycmVjdCB2YWx1ZSB0byBnaXZlIHRoZQotCSBzeW1ib2xzLiAgV2UgYnVpbGQgdGhlIGR5bmFtaWMgc3ltYm9sIHN0cmluZyB0YWJsZSAoLmR5bnN0cikKLQkgaW4gYSB0cmF2ZXJzYWwgb2YgdGhlIHN5bWJvbCB0YWJsZSB1c2luZwotCSBzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaXMganVzdCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZGl2aWRlZAotCSBieSBmb3VyLiAgVG8gY29tcHV0ZSB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSwgd2UKLQkgbXVzdCBhY3R1YWxseSBjb21wdXRlIHRoZSBoYXNoIHRhYmxlLiAgTm9ybWFsbHkgd2UgbmVlZAotCSBleGFjdGx5IGFzIG1hbnkgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBhcyB0aGVyZSBhcmUKLQkgZHluYW1pYyBzeW1ib2xzLCBidXQgaWYgc29tZSBvZiB0aGUgYnVja2V0cyBhcmUgbm90IHVzZWQgd2UKLQkgd2lsbCBuZWVkIGFkZGl0aW9uYWwgZW50cmllcy4gIEluIHRoZSB3b3JzdCBjYXNlLCBldmVyeQotCSBzeW1ib2wgd2lsbCBoYXNoIHRvIHRoZSBzYW1lIGJ1Y2tldCwgYW5kIHdlIHdpbGwgbmVlZAotCSBCVUNLRVRDT1VOVCAtIDEgZXh0cmEgZW50cmllcy4gICovCi0gICAgICBpZiAoZHluc3ltY291bnQgPj0gNCkKLQlidWNrZXRjb3VudCA9IGR5bnN5bWNvdW50IC8gNDsKLSAgICAgIGVsc2UgaWYgKGR5bnN5bWNvdW50ID4gMCkKLQlidWNrZXRjb3VudCA9IGR5bnN5bWNvdW50OwotICAgICAgZWxzZQotCWJ1Y2tldGNvdW50ID0gMTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBoYXNoYWxsb2MgPSAoZHluc3ltY291bnQgKyBidWNrZXRjb3VudCAtIDEpICogSEFTSF9FTlRSWV9TSVpFOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIGhhc2hhbGxvYyk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBkeW5zeW1jb3VudCA+IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgaGFzaGFsbG9jKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBidWNrZXRjb3VudDsgaSsrKQotCVBVVF9XT1JEIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgLTEsIHMtPmNvbnRlbnRzICsgaSAqIEhBU0hfRU5UUllfU0laRSk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBidWNrZXRjb3VudCAqIEhBU0hfRU5UUllfU0laRTsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIC8qIFNjYW4gYWxsIHRoZSBzeW1ib2xzLCBwbGFjZSB0aGVtIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwKLQkgYW5kIGJ1aWxkIHRoZSBkeW5hbWljIGhhc2ggdGFibGUuICBXZSByZXVzZSBkeW5zeW1jb3VudCBhcyBhCi0JIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB3ZSBoYXZlIGFkZGVkIHNvIGZhci4gICovCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgPSAwOwotICAgICAgc3Vub3NfbGlua19oYXNoX3RyYXZlcnNlIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQlzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sLAotCQkJCShQVFIpIGluZm8pOwotICAgICAgQkZEX0FTU0VSVCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID09IGR5bnN5bWNvdW50KTsKLQotICAgICAgLyogVGhlIFN1bk9TIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8gYWxpZ24gdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0JIHN5bWJvbCBzdHJpbmdzIHRvIGEgbXVsdGlwbGUgb2YgOC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0JIGltcG9ydGFudCwgYnV0IGl0IGNhbid0IGh1cnQgbXVjaC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAoKHMtPl9yYXdfc2l6ZSAmIDcpICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0JICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLQkgIGFkZCA9IDggLSAocy0+X3Jhd19zaXplICYgNyk7Ci0JICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAocy0+Y29udGVudHMsCi0JCQkJCSAgICAgICAoc2l6ZV90KSAocy0+X3Jhd19zaXplICsgYWRkKSk7Ci0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbWVtc2V0IChjb250ZW50cyArIHMtPl9yYXdfc2l6ZSwgMCwgKHNpemVfdCkgYWRkKTsKLQkgIHMtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBzLT5fcmF3X3NpemUgKz0gYWRkOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSB3b3JrZWQgb3V0IHRoZSBzaXplcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgdGFibGUgYW5kIHRoZSBkeW5hbWljIHJlbG9jcywgYWxsb2NhdGUgc3RvcmFnZSBmb3IgdGhlbS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZS4gICovCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoZHlub2JqKSkKLQl7Ci0JY2FzZSBiZmRfYXJjaF9zcGFyYzoKLQkgIG1lbWNweSAocy0+Y29udGVudHMsIHNwYXJjX3BsdF9maXJzdF9lbnRyeSwgU1BBUkNfUExUX0VOVFJZX1NJWkUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9hcmNoX202OGs6Ci0JICBtZW1jcHkgKHMtPmNvbnRlbnRzLCBtNjhrX3BsdF9maXJzdF9lbnRyeSwgTTY4S19QTFRfRU5UUllfU0laRSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgdGhlCi0gICAgIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICBzLT5yZWxvY19jb3VudCA9IDA7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc25lZWRwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKTsKLSAgKnNydWxlc3B0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2NhbiB0aGUgcmVsb2NzIGZvciBhbiBpbnB1dCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBQVFIgcmVsb2NzOwotICBQVFIgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0gIGlmIChyZWxfc2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIHJlbG9jcyA9IGZyZWVfcmVsb2NzID0gYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX3NpemUpOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqbjsKLQotICAgICAgbiA9ICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0KSkpOwotICAgICAgaWYgKG4gPT0gTlVMTCkKLQlyZWxvY3MgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHNldF9hb3V0X3NlY3Rpb25fZGF0YSAoc2VjLCBuKTsKLQkgIHJlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9zaXplKTsKLQkgIGFvdXRfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSByZWxvY3M7Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlYy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxfc2l6ZSwgYWJmZCkgIT0gcmVsX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19zY2FuX3N0ZF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywKLQkJCQkgICAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJICAgcmVsX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3NjYW5fZXh0X3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLAotCQkJCSAgIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkgICByZWxfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbiB1c2luZyBzdGFuZGFyZCByZWxvY3MuICBXZQotICAgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGR5bmFtaWMKLSAgIHN5bWJvbC4gIElmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGFuIGVudHJ5IGlzIG1hZGUgaW4KLSAgIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgZG8gdGhlIHdyb25nCi0gICB0aGluZyBpZiB0aGUgc3ltYm9sIGlzIGFjdHVhbGx5IGRhdGE7IEkgZG9uJ3QgdGhpbmsgdGhlIFN1biAzCi0gICBuYXRpdmUgbGlua2VyIGhhbmRsZXMgdGhpcyBjYXNlIGNvcnJlY3RseSBlaXRoZXIuICBJZiB0aGUgc3ltYm9sIGlzCi0gICBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIHdlIG11c3QgcHJlc2VydmUgdGhlIHJlbG9jIGFzIGEgZHluYW1pYwotICAgcmVsb2MuICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gaGFuZGxlIHRoZSBQSUMgcmVsb2NzIGhlcmUgYnkKLSAgIGJ1aWxkaW5nIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX3N0ZF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywgcmVsb2NzLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3Qgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNwbHQgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbCA9IE5VTEw7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWwsICpyZWxlbmQ7Ci0KLSAgLyogV2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgbTY4ayBwbHQgZW50cmllcy4gICovCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGFiZmQpICE9IGJmZF9hcmNoX202OGspCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZHlub2JqID0gTlVMTDsKLQotICBzeW1faGFzaGVzID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKiopIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHJlbF9zaXplIC8gUkVMT0NfU1REX1NJWkU7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX2luZGV4OwotICAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogV2Ugb25seSB3YW50IHJlbG9jcyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgaWYgKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpID09IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkgPT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLQlyX2luZGV4ID0gKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0gICAgICBlbHNlCi0Jcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgfCByZWwtPnJfaW5kZXhbMF0pOwotCi0gICAgICAvKiBHZXQgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBoYXBwZW4sIGJ1dCBpdCB3aWxsIGluIGFueSBjYXNlCi0JICAgICBiZSBjYXVnaHQgaW4gdGhlIHJlbG9jYXRpb24gcGhhc2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBdCB0aGlzIHBvaW50IGNvbW1vbiBzeW1ib2xzIGhhdmUgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgc28KLQkgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGVtLiAgV2UgbmVlZCB0byBjb25zaWRlciB0aGF0Ci0JIHdlIG1heSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIHN5bWJvbCBhbmQgbWFya2VkIGl0IHVuZGVmaW5lZDsKLQkgaWYgdGhlIHN5bWJvbCBpcyByZWFsbHkgdW5kZWZpbmVkLCB0aGVuIFNVTk9TX0RFRl9EWU5BTUlDCi0JIHdpbGwgYmUgemVyby4gICovCi0gICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNnb3Q7Ci0KLQkgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0JICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCSAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLQkgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPT0gMCkKLQkgICAgc2dvdC0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKLQkgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKTsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPnBsdF9vZmZzZXQgIT0gMAotCQkgIHx8ICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICAgID8gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAmIERZTkFNSUMpICE9IDAKLQkJICAgICAgOiAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKSk7Ci0KLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIG9ubHkgYnkgYSBkeW5hbWljCi0JIG9iamVjdC4gICovCi0KLSAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICAvKiBQcmVzdW1hYmx5IHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgYXMgYmVpbmcgdW5kZWZpbmVkIGJ5Ci0JICAgICBhbiBlYXJsaWVyIHJlbG9jLiAgKi8KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKLQl9Ci0gICAgICBlbHNlIGlmICgoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0JewotCSAgYmZkICpzdWI7Ci0KLQkgIC8qIFRoaXMgcmVsb2MgaXMgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLiAgSXQgbXVzdCBiZQotCSAgICAgY29waWVkIGludG8gdGhlIGR5bmFtaWMgcmVsb2NzLiAgV2UgbWFyayB0aGUgc3ltYm9sIGFzCi0JICAgICBiZWluZyB1bmRlZmluZWQuICAqLwotCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX1NURF9TSVpFOwotCSAgc3ViID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBzdWI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgV2UgbXVzdCBnaXZlIGl0IGFuCi0JICAgICBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGlmIHdlIGhhdmUgbm90Ci0JICAgICBhbHJlYWR5IGRvbmUgc28uICBXZSBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbAotCSAgICAgdG8gdGhlIC5wbHQgc2VjdGlvbjsgdGhpcyB3aWxsIGNhdXNlIHJlbG9jcyBhZ2FpbnN0IGl0IHRvCi0JICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0JICBpZiAoaC0+cGx0X29mZnNldCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA9PSAwKQotCQlzcGx0LT5fcmF3X3NpemUgPSBNNjhLX1BMVF9FTlRSWV9TSVpFOwotCSAgICAgIGgtPnBsdF9vZmZzZXQgPSBzcGx0LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXsKLQkJICBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9IHNwbHQ7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gc3BsdC0+X3Jhd19zaXplOwotCQl9Ci0KLQkgICAgICBzcGx0LT5fcmF3X3NpemUgKz0gTTY4S19QTFRfRU5UUllfU0laRTsKLQotCSAgICAgIC8qIFdlIG1heSBhbHNvIG5lZWQgYSBkeW5hbWljIHJlbG9jIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbiB1c2luZyBleHRlbmRlZCByZWxvY3MuICBXZQotICAgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGR5bmFtaWMKLSAgIHN5bWJvbC4gIElmIHRoZSByZWxvYyBpcyBhIFdESVNQMzAsIGFuZCB0aGUgc3ltYm9sIGlzIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiwgYW4gZW50cnkgaXMgbWFkZSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICBPdGhlcndpc2UsIHdlIG11c3QgcHJlc2VydmUgdGhlIHJlbG9jIGFzIGEgZHluYW1pYyByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX2V4dF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywgcmVsb2NzLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3Qgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbCwgKnJlbGVuZDsKLSAgYXNlY3Rpb24gKnNwbHQgPSBOVUxMOwotICBhc2VjdGlvbiAqc2dvdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzcmVsID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IGtub3cgaG93IHRvIGhhbmRsZSBTUEFSQyBwbHQgZW50cmllcy4gICovCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGFiZmQpICE9IGJmZF9hcmNoX3NwYXJjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bm9iaiA9IE5VTEw7Ci0KLSAgc3ltX2hhc2hlcyA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqKSBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyByZWxfc2l6ZSAvIFJFTE9DX0VYVF9TSVpFOwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgcl9pbmRleDsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQotICAgICAgLyogU3dhcCBpbiB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLQkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotCSAgcl90eXBlID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotCQkgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByX2luZGV4ID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgICAgfCByZWwtPnJfaW5kZXhbMF0pOwotCSAgcl9leHRlcm4gPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFKSk7Ci0JICByX3R5cGUgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0JfQotCi0gICAgICBpZiAocl9leHRlcm4pCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbiwgYnV0IGl0IHdpbGwgaW4gYW55Ci0JCSBjYXNlIGJlIGNhdWdodCBpbiB0aGUgcmVsb2NhdGlvbiBwaGFzZS4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLCB3ZSBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4KLSAgICAgICAgIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JewotCSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIGZhbHNlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5pdGlhbCBlbnRyeSBpbiB0aGUgLmdvdCB0YWJsZS4gICovCi0JICAgICAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA9PSAwKQotCQlzZ290LT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOwotCSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKLQkgICAgfQotCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290X29mZnNldCAhPSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIGgtPmdvdF9vZmZzZXQgPSBzZ290LT5fcmF3X3NpemU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChyX2luZGV4ID49IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhYm5vcm1hbCwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gdGhlCi0JCSAgICAgcmVsb2NhdGlvbiBwaGFzZS4gICovCi0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGlmIChhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyA9Ci0JCSAgICAoYmZkX3ZtYSAqKSBiZmRfemFsbG9jIChhYmZkLAotCQkJCQkgICAgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpCi0JCQkJCSAgICAgKiBzaXplb2YgKGJmZF92bWEpKSk7Ci0JCSAgaWYgKGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzW3JfaW5kZXhdICE9IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzW3JfaW5kZXhdID0gc2dvdC0+X3Jhd19zaXplOwotCSAgICB9Ci0KLQkgIHNnb3QtPl9yYXdfc2l6ZSArPSBCWVRFU19JTl9XT1JEOwotCi0JICAvKiBJZiB3ZSBhcmUgbWFraW5nIGEgc2hhcmVkIGxpYnJhcnksIG9yIGlmIHRoZSBzeW1ib2wgaXMKLQkgICAgIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgd2Ugd2lsbCBuZWVkIGEgZHluYW1pYyByZWxvYwotCSAgICAgZW50cnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgIHx8IChoICE9IE5VTEwKLQkJICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgIT0gMAotCQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkgICAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE90aGVyd2lzZSwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiByZWxvY3MgYWdhaW5zdCBzeW1ib2xzCi0gICAgICAgICBkZWZpbmVkIGluIGR5bmFtaWMgb2JqZWN0cyBidXQgbm90IGluIHJlZ3VsYXIgb2JqZWN0cy4gIFdlCi0gICAgICAgICBvbmx5IG5lZWQgdG8gY29uc2lkZXIgcmVsb2NzIGFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoISByX2V4dGVybikKLQl7Ci0JICAvKiBCdXQsIGlmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgZ2VuZXJhdGUgYW4gYWJzb2x1dGUgcmVsb2MuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJewotCQkgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCB0cnVlKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCQkgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCQkgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCQkgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQXQgdGhpcyBwb2ludCBjb21tb24gc3ltYm9scyBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIHNvCi0JIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlbS4gIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhhdAotCSB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyBzeW1ib2wgYW5kIG1hcmtlZCBpdCB1bmRlZmluZWQ7Ci0JIGlmIHRoZSBzeW1ib2wgaXMgcmVhbGx5IHVuZGVmaW5lZCwgdGhlbiBTVU5PU19ERUZfRFlOQU1JQwotCSB3aWxsIGJlIHplcm8uICAqLwotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHJfdHlwZSAhPSBSRUxPQ19KTVBfVEJMCi0JICAmJiAhIGluZm8tPnNoYXJlZAotCSAgJiYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAgICAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDApKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAocl90eXBlID09IFJFTE9DX0pNUF9UQkwKLQkgICYmICEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaXMgYXBwYXJlbnRseSB1bmRlZmluZWQuICBEb24ndCBkbyBhbnl0aGluZwotICAgICAgICAgICAgIGhlcmU7IGp1c3QgbGV0IHRoZSByZWxvY2F0aW9uIHJvdXRpbmUgcmVwb3J0IGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIGZhbHNlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQkgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQkgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotCSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5pdGlhbCBlbnRyeSBpbiB0aGUgLmdvdCB0YWJsZS4gICovCi0JICBpZiAoc2dvdC0+X3Jhd19zaXplID09IDApCi0JICAgIHNnb3QtPl9yYXdfc2l6ZSA9IEJZVEVTX0lOX1dPUkQ7Ci0JICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPT0gUkVMT0NfSk1QX1RCTAotCQkgIHx8IGluZm8tPnNoYXJlZAotCQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKTsKLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA9PSBSRUxPQ19KTVBfVEJMCi0JCSAgfHwgaW5mby0+c2hhcmVkCi0JCSAgfHwgaC0+cGx0X29mZnNldCAhPSAwCi0JCSAgfHwgKChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgICAgPyAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICYgRFlOQU1JQykgIT0gMAotCQkgICAgICA6IChoLT5yb290LnJvb3QudS51bmRlZi5hYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApKTsKLQotICAgICAgLyogVGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgb25seSBieSBhIGR5bmFtaWMKLQkgb2JqZWN0LCBvciBpdCBpcyBhIGp1bXAgdGFibGUgcmVsb2MgZnJvbSBQSUMgY29tcGlsZWQgY29kZS4gICovCi0KLSAgICAgIGlmIChyX3R5cGUgIT0gUkVMT0NfSk1QX1RCTAotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgLyogUHJlc3VtYWJseSB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIGFzIGJlaW5nIHVuZGVmaW5lZCBieQotCSAgICAgYW4gZWFybGllciByZWxvYy4gICovCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0JfQotICAgICAgZWxzZSBpZiAocl90eXBlICE9IFJFTE9DX0pNUF9UQkwKLQkgICAgICAgJiYgKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXsKLQkgIGJmZCAqc3ViOwotCi0JICAvKiBUaGlzIHJlbG9jIGlzIG5vdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIEl0IG11c3QgYmUKLQkgICAgIGNvcGllZCBpbnRvIHRoZSBkeW5hbWljIHJlbG9jcy4gIFdlIG1hcmsgdGhlIHN5bWJvbCBhcwotCSAgICAgYmVpbmcgdW5kZWZpbmVkLiAgKi8KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQkgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkgICAgewotCSAgICAgIHN1YiA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgICAgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBzdWI7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBXZSBtdXN0IGdpdmUgaXQgYW4KLQkgICAgIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgaWYgd2UgaGF2ZSBub3QKLQkgICAgIGFscmVhZHkgZG9uZSBzby4gIFdlIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3ltYm9sCi0JICAgICB0byB0aGUgLnBsdCBzZWN0aW9uOyB0aGlzIHdpbGwgY2F1c2UgcmVsb2NzIGFnYWluc3QgaXQgdG8KLQkgICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLQkgIGlmIChoLT5wbHRfb2Zmc2V0ID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID09IDApCi0JCXNwbHQtPl9yYXdfc2l6ZSA9IFNQQVJDX1BMVF9FTlRSWV9TSVpFOwotCSAgICAgIGgtPnBsdF9vZmZzZXQgPSBzcGx0LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXsKLQkJICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JCSAgICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkJICBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9IHNwbHQ7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gc3BsdC0+X3Jhd19zaXplOwotCQl9Ci0KLQkgICAgICBzcGx0LT5fcmF3X3NpemUgKz0gU1BBUkNfUExUX0VOVFJZX1NJWkU7Ci0KLQkgICAgICAvKiBXZSB3aWxsIGFsc28gbmVlZCBhIGR5bmFtaWMgcmVsb2MgZW50cnksIHVubGVzcyB0aGlzCi0gICAgICAgICAgICAgICAgIGlzIGEgSk1QX1RCTCByZWxvYyBwcm9kdWNlZCBieSBsaW5raW5nIFBJQyBjb21waWxlZAotICAgICAgICAgICAgICAgICBjb2RlLCBhbmQgd2UgYXJlIG5vdCBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeS4gICovCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkJc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBuZWVkIHRvIGNvcHkgb3ZlcgotICAgICAgICAgICAgIGFueSByZWxvYyBvdGhlciB0aGFuIGEganVtcCB0YWJsZSByZWxvYy4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkICYmIHJfdHlwZSAhPSBSRUxPQ19KTVBfVEJMKQotCSAgICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQnVpbGQgdGhlIGhhc2ggdGFibGUgb2YgZHluYW1pYyBzeW1ib2xzLCBhbmQgdG8gbWFyayBhcyB3cml0dGVuIGFsbAotICAgc3ltYm9scyBmcm9tIGR5bmFtaWMgb2JqZWN0cyB3aGljaCB3ZSBkbyBub3QgcGxhbiB0byB3cml0ZSBvdXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0KLSAgLyogU2V0IHRoZSB3cml0dGVuIGZsYWcgZm9yIHN5bWJvbHMgd2UgZG8gbm90IHdhbnQgdG8gd3JpdGUgb3V0IGFzCi0gICAgIHBhcnQgb2YgdGhlIHJlZ3VsYXIgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBhbGwgc3ltYm9scyB3aGljaCBhcmUKLSAgICAgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLiAgRm9yIHNvbWUgcmVhc29uIHN5bWJvbHMKLSAgICAgd2hpY2ggYXJlIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIG9iamVjdCBhbmQgZGVmaW5lZCBieSBhIGR5bmFtaWMKLSAgICAgb2JqZWN0IGRvIG5vdCBzZWVtIHRvIHNob3cgdXAgaW4gdGhlIHJlZ3VsYXIgc3ltYm9sIHRhYmxlLiAgSXQgaXMKLSAgICAgcG9zc2libGUgZm9yIGEgc3ltYm9sIHRvIGhhdmUgb25seSBTVU5PU19SRUZfUkVHVUxBUiBzZXQgaGVyZSwgaXQKLSAgICAgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCB3aGljaCB3YXMgdHVybmVkIGludG8gYSBjb21tb24gc3ltYm9sCi0gICAgIGJlY2F1c2UgaXQgd2FzIGZvdW5kIGluIGFuIGFyY2hpdmUgb2JqZWN0IHdoaWNoIHdhcyBub3QgaW5jbHVkZWQKLSAgICAgaW4gdGhlIGxpbmsuICAqLwotICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgIl9fRFlOQU1JQyIpICE9IDApCi0gICAgaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgICByZWd1bGFyIG9iamVjdCwgc2VlIHdoZXRoZXIgd2UgZ2F2ZSBpdCBhIHJlYXNvbmFibGUgdmFsdWUgd2hpbGUKLSAgICAgc2Nhbm5pbmcgdGhlIHJlbG9jcy4gICovCi0KLSAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfUkVGX1JFR1VMQVIpICE9IDApCi0gICAgewotICAgICAgaWYgKChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCSAgJiYgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYmZkICpzdWI7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGN1cnJlbnRseSBkZWZpbmVkIGluIGEgZHluYW1pYyBzZWN0aW9uCi0JICAgICB3aGljaCBpcyBub3QgYmVpbmcgcHV0IGludG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotCSAgICAgaW1wbGllcyB0aGF0IHRoZXJlIGlzIG5vIHJlbG9jIGFnYWluc3QgdGhlIHN5bWJvbC4gIEknbQotCSAgICAgbm90IHN1cmUgd2h5IHRoaXMgY2FzZSB3b3VsZCBldmVyIG9jY3VyLiAgSW4gYW55IGNhc2UsIHdlCi0JICAgICBjaGFuZ2UgdGhlIHN5bWJvbCB0byBiZSB1bmRlZmluZWQuICAqLwotCSAgc3ViID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBzdWI7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIG9yIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIGZpbGUsIGFkZCBpdAotICAgICB0byB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIChTVU5PU19ERUZfUkVHVUxBUiB8IFNVTk9TX1JFRl9SRUdVTEFSKSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpuYW1lOwotICAgICAgdW5zaWduZWQgbG9uZyBoYXNoOwotICAgICAgYmZkICpkeW5vYmo7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggPT0gLTIpOwotCi0gICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gICAgICBoLT5keW5pbmR4ID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQotICAgICAgLyogV2UgZG9uJ3QgYm90aGVyIHRvIGNvbnN0cnVjdCBhIEJGRCBoYXNoIHRhYmxlIGZvciB0aGUgc3RyaW5ncwotCSB3aGljaCBhcmUgdGhlIG5hbWVzIG9mIHRoZSBkeW5hbWljIHN5bWJvbHMuICBVc2luZyBhIGhhc2gKLQkgdGFibGUgZm9yIHRoZSByZWd1bGFyIHN5bWJvbHMgaXMgYmVuZWZpY2lhbCwgYmVjYXVzZSB0aGUKLQkgcmVndWxhciBzeW1ib2xzIGluY2x1ZGVzIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scywgd2hpY2ggaGF2ZQotCSBsb25nIG5hbWVzIGFuZCBhcmUgb2Z0ZW4gZHVwbGljYXRlZCBpbiBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQkgVGhlcmUgYXJlIG5vIGRlYnVnZ2luZyBzeW1ib2xzIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3RyIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKHMtPmNvbnRlbnRzLAotCQkJCQkgICBzLT5fcmF3X3NpemUgKyBsZW4gKyAxKTsKLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gY29udGVudHM7Ci0KLSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IHMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cmNweSAoKGNoYXIgKikgY29udGVudHMgKyBzLT5fcmF3X3NpemUsIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gbGVuICsgMTsKLQotICAgICAgLyogQWRkIGl0IHRvIHRoZSBkeW5hbWljIGhhc2ggdGFibGUuICAqLwotICAgICAgbmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLSAgICAgIGhhc2ggPSAwOwotICAgICAgd2hpbGUgKCpuYW1lICE9ICdcMCcpCi0JaGFzaCA9IChoYXNoIDw8IDEpICsgKm5hbWUrKzsKLSAgICAgIGhhc2ggJj0gMHg3ZmZmZmZmZjsKLSAgICAgIGhhc2ggJT0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50OwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBpZiAoR0VUX1NXT1JEIChkeW5vYmosIHMtPmNvbnRlbnRzICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSkgPT0gLTEpCi0JUFVUX1dPUkQgKGR5bm9iaiwgaC0+ZHluaW5keCwgcy0+Y29udGVudHMgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfdm1hIG5leHQ7Ci0KLQkgIG5leHQgPSBHRVRfV09SRCAoZHlub2JqLAotCQkJICAgKHMtPmNvbnRlbnRzCi0JCQkgICAgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFCi0JCQkgICAgKyBCWVRFU19JTl9XT1JEKSk7Ci0JICBQVVRfV09SRCAoZHlub2JqLCBzLT5fcmF3X3NpemUgLyBIQVNIX0VOVFJZX1NJWkUsCi0JCSAgICBzLT5jb250ZW50cyArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUgKyBCWVRFU19JTl9XT1JEKTsKLQkgIFBVVF9XT1JEIChkeW5vYmosIGgtPmR5bmluZHgsIHMtPmNvbnRlbnRzICsgcy0+X3Jhd19zaXplKTsKLQkgIFBVVF9XT1JEIChkeW5vYmosIG5leHQsIHMtPmNvbnRlbnRzICsgcy0+X3Jhd19zaXplICsgQllURVNfSU5fV09SRCk7Ci0JICBzLT5fcmF3X3NpemUgKz0gSEFTSF9FTlRSWV9TSVpFOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExpbmsgYSBkeW5hbWljIG9iamVjdC4gIFdlIGFjdHVhbGx5IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gYXQKLSAgIHRoaXMgcG9pbnQuICBUaGlzIGVudHJ5IHBvaW50IGV4aXN0cyB0byBwcmV2ZW50IHRoZSByZWd1bGFyIGxpbmtlcgotICAgY29kZSBmcm9tIGRvaW5nIGFueXRoaW5nIHdpdGggdGhlIG9iamVjdC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2xpbmtfZHluYW1pY19vYmplY3QgKGluZm8sIGFiZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBkeW5hbWljIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBmaW5hbCB0cmF2ZXJzYWwKLSAgIG92ZXIgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgaGFyZzsKLSAgaW50IHR5cGU7Ci0gIGJmZF92bWEgdmFsOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRzeW07Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBmaWxsIGluIHRoZQotICAgICB0YWJsZSBlbnRyeS4gICovCi0gIGlmIChoLT5wbHRfb2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBiZmRfdm1hIHJfYWRkcmVzczsKLQotICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgcCA9IHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0X29mZnNldDsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0KLSAgICAgIHJfYWRkcmVzcyA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICArIGgtPnBsdF9vZmZzZXQpOwotCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAob3V0cHV0X2JmZCkpCi0JewotCWNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0JICBpZiAoaW5mby0+c2hhcmVkIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1BBUkNfUExUX0VOVFJZX1dPUkQwLCBwKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICAoU1BBUkNfUExUX0VOVFJZX1dPUkQxCi0JCQkgICArICgoKC0gKGgtPnBsdF9vZmZzZXQgKyA0KSA+PiAyKQotCQkJICAgICAgICYgMHgzZmZmZmZmZikpKSwKLQkJCSAgcCArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9FTlRSWV9XT1JEMiArIHMtPnJlbG9jX2NvdW50LAotCQkJICBwICsgOCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgICsgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBTUEFSQ19QTFRfUElDX1dPUkQwICsgKCh2YWwgPj4gMTApICYgMHgzZmZmZmYpLAotCQkJICBwKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBTUEFSQ19QTFRfUElDX1dPUkQxICsgKHZhbCAmIDB4M2ZmKSwKLQkJCSAgcCArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9QSUNfV09SRDIsIHAgKyA4KTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9hcmNoX202OGs6Ci0JICBpZiAoISBpbmZvLT5zaGFyZWQgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDApCi0JICAgIGFib3J0ICgpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgTTY4S19QTFRfRU5UUllfV09SRDAsIHApOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKC0gKGgtPnBsdF9vZmZzZXQgKyAyKSksIHAgKyAyKTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHMtPnJlbG9jX2NvdW50LCBwICsgNik7Ci0JICByX2FkZHJlc3MgKz0gMjsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIGFkZCBhIGp1bXAgdGFibGUgcmVsb2MsIHVubGVzcyB0aGlzIGlzIHRoZQotICAgICAgICAgcmVzdWx0IG9mIGEgSk1QX1RCTCByZWxvYyBmcm9tIFBJQyBjb21waWxlZCBjb2RlLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCA+PSAwKTsKLQkgIEJGRF9BU1NFUlQgKHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikKLQkJICAgICAgPCBzLT5fcmF3X3NpemUpOwotCSAgcCA9IHMtPmNvbnRlbnRzICsgcy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAob3V0cHV0X2JmZCk7Ci0JICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKG91dHB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQotCSAgICAgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOwotCSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCByX2FkZHJlc3MsIHNyZWwtPnJfYWRkcmVzcyk7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHgpOwotCQkgIHNyZWwtPnJfdHlwZVswXSA9IChSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCi0JCQkJICAgICB8IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaC0+ZHluaW5keDsKLQkJICBzcmVsLT5yX3R5cGVbMF0gPSAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQotCQkJCSAgICAgfCBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7Ci0KLQkgICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcDsKLQkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRyZXNzLCBlcmVsLT5yX2FkZHJlc3MpOwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQl7Ci0JCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWgtPmR5bmluZHg7Ci0JCSAgZXJlbC0+cl90eXBlWzBdID0KLQkJICAgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCi0JCSAgICAgfCAoUkVMT0NfSk1QX1NMT1QgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSloLT5keW5pbmR4OwotCQkgIGVyZWwtPnJfdHlwZVswXSA9Ci0JCSAgICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQotCQkgICAgIHwgKFJFTE9DX0pNUF9TTE9UIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKSk7Ci0JCX0KLQkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIGVyZWwtPnJfYWRkZW5kKTsKLQkgICAgfQotCi0JICArK3MtPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBub3QgYSBkeW5hbWljIHN5bWJvbCwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZwotICAgICBlbHNlLiAgV2Ugb25seSBjaGVjayB0aGlzIGFmdGVyIGhhbmRsaW5nIHRoZSBQTFQgZW50cnksIGJlY2F1c2UKLSAgICAgd2UgY2FuIGhhdmUgYSBQTFQgZW50cnkgZm9yIGEgbm9uZHluYW1pYyBzeW1ib2wgd2hlbiBsaW5raW5nIFBJQwotICAgICBjb21waWxlZCBjb2RlIGZyb20gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmIChoLT5keW5pbmR4IDwgMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGgtPnJvb3Qucm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIC8qIEF2b2lkIHZhcmlhYmxlIG5vdCBpbml0aWFsaXplZCB3YXJuaW5ncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWFzZWN0aW9uICpzZWM7Ci0JYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0Jc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0Jb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCUJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JCSAgICB8fCBvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0JaWYgKGgtPnBsdF9vZmZzZXQgIT0gMAotCSAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkgIHsKLQkgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotCSAgICB2YWwgPSAwOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fVEVYVAotCQkgICAgICA6IE5fV0VBS1QpOwotCSAgICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0RBVEEKLQkJICAgICAgOiBOX1dFQUtEKTsKLQkgICAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0JTUwotCQkgICAgICA6IE5fV0VBS0IpOwotCSAgICBlbHNlCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0FCUwotCQkgICAgICA6IE5fV0VBS0EpOwotCSAgICB0eXBlIHw9IE5fRVhUOwotCSAgICB2YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCSAgICsgb3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gaC0+cm9vdC5yb290LnUuYy5zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIHR5cGUgPSBOX1dFQUtVOwotICAgICAgdmFsID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgIi5keW5zeW0iKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgb3V0c3ltID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkgICAgKHMtPmNvbnRlbnRzICsgaC0+ZHluaW5keCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKTsKLQotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgdHlwZSwgb3V0c3ltLT5lX3R5cGUpOwotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX290aGVyKTsKLQotICAvKiBGSVhNRTogVGhlIG5hdGl2ZSBsaW5rZXIgZG9lc24ndCB1c2UgMCBmb3IgZGVzYy4gIEl0IHNlZW1zIHRvIHVzZQotICAgICBvbmUgbGVzcyB0aGFuIHRoZSBkZXNjIHZhbHVlIGluIHRoZSBzaGFyZWQgbGlicmFyeSwgYWx0aG91Z2ggdGhhdAotICAgICBzZWVtcyB1bmxpa2VseS4gICovCi0gIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX2Rlc2MpOwotCi0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBoLT5keW5zdHJfaW5kZXgsIG91dHN5bS0+ZV9zdHJ4KTsKLSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLT5lX3ZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wuICBJZiB0aGlzCi0gICBpcyBhIHJlbG9jIHdoaWNoIGFyZSBhcmUgZ29pbmcgdG8gY29weSBhcyBhIGR5bmFtaWMgcmVsb2MsIHRoZW4KLSAgIGNvcHkgaXQgb3ZlciwgYW5kIHRlbGwgdGhlIGNhbGxlciB0byBub3QgYm90aGVyIHByb2Nlc3NpbmcgdGhpcwotICAgcmVsb2MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdW5vc19jaGVja19keW5hbWljX3JlbG9jIChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGhhcmcsIHJlbG9jLAotCQkJICAgY29udGVudHMsIHNraXAsIHJlbG9jYXRpb25wKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIFBUUiByZWxvYzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICpza2lwOwotICAgICBiZmRfdm1hICpyZWxvY2F0aW9ucDsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0gIGJmZCAqZHlub2JqOwotICBib29sZWFuIGJhc2VyZWw7Ci0gIGJvb2xlYW4gam1wdGJsOwotICBib29sZWFuIHBjcmVsOwotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKnA7Ci0gIGxvbmcgaW5keDsKLQotICAqc2tpcCA9IGZhbHNlOwotCi0gIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgaC0+cGx0X29mZnNldCAhPSAwCi0gICAgICAmJiAoaW5mby0+c2hhcmVkCi0JICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0KLSAgICAgIC8qIFJlZGlyZWN0IHRoZSByZWxvY2F0aW9uIHRvIHRoZSBQTFQgZW50cnkuICAqLwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICAqcmVsb2NhdGlvbnAgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBoLT5wbHRfb2Zmc2V0KTsKLSAgICB9Ci0KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSAgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvYzsKLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JewotCSAgYmFzZXJlbCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRykpOwotCSAgam1wdGJsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotCSAgcGNyZWwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJhc2VyZWwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpKTsKLQkgIGptcHRibCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKLQkgIHBjcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotICAgICAgaW50IHJfdHlwZTsKLQotICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jOwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQlyX3R5cGUgPSAoKGVyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotCQkgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTsKLSAgICAgIGVsc2UKLQlyX3R5cGUgPSAoKGVyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKQotCQkgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLSAgICAgIGJhc2VyZWwgPSAocl90eXBlID09IFJFTE9DX0JBU0UxMAotCQkgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMik7Ci0gICAgICBqbXB0YmwgPSByX3R5cGUgPT0gUkVMT0NfSk1QX1RCTDsKLSAgICAgIHBjcmVsID0gKHJfdHlwZSA9PSBSRUxPQ19ESVNQOAotCSAgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfRElTUDE2Ci0JICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19ESVNQMzIKLQkgICAgICAgfHwgcl90eXBlID09IFJFTE9DX1dESVNQMzAKLQkgICAgICAgfHwgcl90eXBlID09IFJFTE9DX1dESVNQMjIpOwotICAgICAgLyogV2UgZG9uJ3QgY29uc2lkZXIgdGhlIFBDMTAgYW5kIFBDMjIgdHlwZXMgdG8gYmUgUEMgcmVsYXRpdmUsCi0gICAgICAgICBiZWNhdXNlIHRoZXkgYXJlIHBjcmVsX29mZnNldC4gICovCi0gICAgfQotCi0gIGlmIChiYXNlcmVsKQotICAgIHsKLSAgICAgIGJmZF92bWEgKmdvdF9vZmZzZXRwOwotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JZ290X29mZnNldHAgPSAmaC0+Z290X29mZnNldDsKLSAgICAgIGVsc2UgaWYgKGFkYXRhIChpbnB1dF9iZmQpLmxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JZ290X29mZnNldHAgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0JICBpbnQgcl9pbmRleDsKLQotCSAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHJlbG9jOwotCSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJcl9pbmRleCA9ICgoc3JlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJCSAgIHwgKHNyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgIHwgc3JlbC0+cl9pbmRleFsyXSk7Ci0JICAgICAgZWxzZQotCQlyX2luZGV4ID0gKChzcmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkJICAgfCAoc3JlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICAgfCBzcmVsLT5yX2luZGV4WzBdKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLQotCSAgICAgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvYzsKLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCQlyX2luZGV4ID0gKChlcmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkJICAgfCAoZXJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICAgfCBlcmVsLT5yX2luZGV4WzJdKTsKLQkgICAgICBlbHNlCi0JCXJfaW5kZXggPSAoKGVyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCQkgICB8IChlcmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgICB8IGVyZWwtPnJfaW5kZXhbMF0pOwotCSAgICB9Ci0KLQkgIGdvdF9vZmZzZXRwID0gYWRhdGEgKGlucHV0X2JmZCkubG9jYWxfZ290X29mZnNldHMgKyByX2luZGV4OwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAoZ290X29mZnNldHAgIT0gTlVMTCAmJiAqZ290X29mZnNldHAgIT0gMCk7Ci0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCi0gICAgICAvKiBXZSBzZXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGhhdmUKLQkgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgR09UIGVudHJ5LiAgKi8KLSAgICAgIGlmICgoKmdvdF9vZmZzZXRwICYgMSkgPT0gMCkKLQl7Ci0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgKCEgaW5mby0+c2hhcmVkCi0JCSAgJiYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JCSAgICAgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKSkpCi0JICAgIFBVVF9XT1JEIChkeW5vYmosICpyZWxvY2F0aW9ucCwgc2dvdC0+Y29udGVudHMgKyAqZ290X29mZnNldHApOwotCSAgZWxzZQotCSAgICBQVVRfV09SRCAoZHlub2JqLCAwLCBzZ290LT5jb250ZW50cyArICpnb3Rfb2Zmc2V0cCk7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICB8fCAoaCAhPSBOVUxMCi0JCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKLQkJICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkpCi0JICAgIHsKLQkgICAgICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIEdMT0JfREFUIG9yIDMyIHJlbG9jIHRvIHRlbGwgdGhlCi0gICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIHRvIGZpbGwgaW4gdGhpcyBlbnRyeSBpbiB0aGUgdGFibGUuICAqLwotCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopCi0JCQkgIDwgcy0+X3Jhd19zaXplKTsKLQotCSAgICAgIHAgPSAocy0+Y29udGVudHMKLQkJICAgKyBzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopKTsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCWluZHggPSBoLT5keW5pbmR4OwotCSAgICAgIGVsc2UKLQkJaW5keCA9IDA7Ci0KLQkgICAgICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikgPT0gUkVMT0NfU1REX1NJWkUpCi0JCXsKLQkJICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCi0JCSAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHA7Ci0JCSAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJCSAgICAoKmdvdF9vZmZzZXRwCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQpLAotCQkJICAgIHNyZWwtPnJfYWRkcmVzcyk7Ci0JCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKLQkJICAgIHsKLQkJICAgICAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaW5keDsKLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNyZWwtPnJfdHlwZVswXSA9IDIgPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLQkJICAgICAgZWxzZQotCQkJc3JlbC0+cl90eXBlWzBdID0KLQkJCSAgKFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcKLQkJCSAgIHwgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcKLQkJCSAgIHwgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCi0JCQkgICB8ICgyIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCQkgICAgICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCQkgICAgICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWluZHg7Ci0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzcmVsLT5yX3R5cGVbMF0gPSAyIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEU7Ci0JCSAgICAgIGVsc2UKLQkJCXNyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIChSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCi0JCQkgICB8IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCi0JCQkgICB8IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQotCQkJICAgfCAoMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotCi0JCSAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHA7Ci0JCSAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJCSAgICAoKmdvdF9vZmZzZXRwCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQpLAotCQkJICAgIGVyZWwtPnJfYWRkcmVzcyk7Ci0JCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKLQkJICAgIHsKLQkJICAgICAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaW5keDsKLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCWVyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIFJFTE9DXzMyIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHOwotCQkgICAgICBlbHNlCi0JCQllcmVsLT5yX3R5cGVbMF0gPQotCQkJICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwotCQkJICAgfCAoUkVMT0NfR0xPQl9EQVQgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCQkgICAgICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCQkgICAgICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWluZHg7Ci0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQllcmVsLT5yX3R5cGVbMF0gPQotCQkJICBSRUxPQ18zMiA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRTsKLQkJICAgICAgZWxzZQotCQkJZXJlbC0+cl90eXBlWzBdID0KLQkJCSAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUKLQkJCSAgIHwgKFJFTE9DX0dMT0JfREFUCi0JCQkgICAgICA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSkpOwotCQkgICAgfQotCQkgIFBVVF9XT1JEIChkeW5vYmosIDAsIGVyZWwtPnJfYWRkZW5kKTsKLQkJfQotCi0JICAgICAgKytzLT5yZWxvY19jb3VudDsKLQkgICAgfQotCi0JICAqZ290X29mZnNldHAgfD0gMTsKLQl9Ci0KLSAgICAgICpyZWxvY2F0aW9ucCA9IChzZ290LT52bWEKLQkJICAgICAgKyAoKmdvdF9vZmZzZXRwICZ+IDEpCi0JCSAgICAgIC0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9iYXNlKTsKLQotICAgICAgLyogVGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIGRvIGZvciBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGlmIChoID09IE5VTEwKLQkgIHx8IGgtPmR5bmluZHggPT0gLTEKLQkgIHx8IGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMAotCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkgIHx8IChoLT5yb290LnJvb3QudS51bmRlZi5hYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPmR5bmluZHggPT0gLTEKLQkgICAgICB8fCBqbXB0YmwKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCSAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJdCBsb29rcyBsaWtlIHRoaXMgaXMgYSByZWxvYyB3ZSBhcmUgc3VwcG9zZWQgdG8gY29weS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikgPCBzLT5fcmF3X3NpemUpOwotCi0gIHAgPSBzLT5jb250ZW50cyArIHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaik7Ci0KLSAgLyogQ29weSB0aGUgcmVsb2Mgb3Zlci4gICovCi0gIG1lbWNweSAocCwgcmVsb2MsIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopKTsKLQotICBpZiAoaCAhPSBOVUxMKQotICAgIGluZHggPSBoLT5keW5pbmR4OwotICBlbHNlCi0gICAgaW5keCA9IDA7Ci0KLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLwotICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQotICAgICAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHA7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQkoR0VUX1dPUkQgKGR5bm9iaiwgc3JlbC0+cl9hZGRyZXNzKQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpLAotCQlzcmVsLT5yX2FkZHJlc3MpOwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKLQl7Ci0JICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaW5keDsKLQl9Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZSBhZGRlbmQgZm9yIGEgUEMgcmVsYXRpdmUKLSAgICAgICAgIHJlbG9jLiAgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotCi0gICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcDsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCShHRVRfV09SRCAoZHlub2JqLCBlcmVsLT5yX2FkZHJlc3MpCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCWVyZWwtPnJfYWRkcmVzcyk7Ci0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChkeW5vYmopKQotCXsKLQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaW5keDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OwotCX0KLSAgICAgIGlmIChwY3JlbCAmJiBoICE9IE5VTEwpCi0JewotCSAgLyogQWRqdXN0IHRoZSBhZGRlbmQgZm9yIHRoZSBjaGFuZ2UgaW4gYWRkcmVzcy4gICovCi0JICBQVVRfV09SRCAoZHlub2JqLAotCQkgICAgKEdFVF9XT1JEIChkeW5vYmosIGVyZWwtPnJfYWRkZW5kKQotCQkgICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJLSBpbnB1dF9zZWN0aW9uLT52bWEpKSwKLQkJICAgIGVyZWwtPnJfYWRkZW5kKTsKLQl9Ci0gICAgfQotCi0gICsrcy0+cmVsb2NfY291bnQ7Ci0KLSAgaWYgKGggIT0gTlVMTCkKLSAgICAqc2tpcCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqbzsKLSAgYXNlY3Rpb24gKnM7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZAotICAgICAgJiYgISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLSAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLQotICAvKiBGaW5pc2ggdXAgdGhlIC5uZWVkIHNlY3Rpb24uICBUaGUgbGlua2VyIGVtdWxhdGlvbiBjb2RlIGZpbGxlZCBpdAotICAgICBpbiwgYnV0IHdpdGggb2Zmc2V0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBpbnN0ZWFkIG9mCi0gICAgIHJlYWwgYWRkcmVzc2VzLiAgTm93IHRoYXQgd2Uga25vdyB0aGUgc2VjdGlvbiBsb2NhdGlvbiwgd2UgY2FuCi0gICAgIGZpbGwgaW4gdGhlIGZpbmFsIHZhbHVlcy4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmaWxlX3B0ciBmaWxlcG9zOwotICAgICAgYmZkX2J5dGUgKnA7Ci0KLSAgICAgIGZpbGVwb3MgPSBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBwID0gcy0+Y29udGVudHM7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgUFVUX1dPUkQgKGR5bm9iaiwgR0VUX1dPUkQgKGR5bm9iaiwgcCkgKyBmaWxlcG9zLCBwKTsKLQkgIHZhbCA9IEdFVF9XT1JEIChkeW5vYmosIHAgKyAxMik7Ci0JICBpZiAodmFsID09IDApCi0JICAgIGJyZWFrOwotCSAgUFVUX1dPUkQgKGR5bm9iaiwgdmFsICsgZmlsZXBvcywgcCArIDEyKTsKLQkgIHAgKz0gMTY7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIC5nb3Qgc2VjdGlvbiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgZHluYW1pYyBpbmZvcm1hdGlvbiwgdW5sZXNzIHRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBpZiAoaW5mby0+c2hhcmVkIHx8IHNkeW4tPl9yYXdfc2l6ZSA9PSAwKQotICAgIFBVVF9XT1JEIChkeW5vYmosIDAsIHMtPmNvbnRlbnRzKTsKLSAgZWxzZQotICAgIFBVVF9XT1JEIChkeW5vYmosIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCSAgICAgIHMtPmNvbnRlbnRzKTsKLQotICBmb3IgKG8gPSBkeW5vYmotPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JICAmJiBvLT5jb250ZW50cyAhPSBOVUxMKQotCXsKLQkgIEJGRF9BU1NFUlQgKG8tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkJICAgICAgJiYgby0+b3V0cHV0X3NlY3Rpb24tPm93bmVyID09IGFiZmQpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICBvLT5jb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICBvLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoc2R5bi0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljIGVzZDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWNfbGluayBlc2RsOwotCi0gICAgICAvKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgbGluayBpbmZvcm1hdGlvbi4gICovCi0gICAgICBQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMywgZXNkLmxkX3ZlcnNpb24pOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQgKyBzaXplb2YgZXNkLAotCQllc2QubGRkKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCShzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIHNkeW4tPm91dHB1dF9vZmZzZXQKLQkJICsgc2l6ZW9mIGVzZAotCQkgKyBFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSksCi0JCWVzZC5sZCk7Ci0KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2R5bi0+b3V0cHV0X3NlY3Rpb24sICZlc2QsCi0JCQkJICAgICAgc2R5bi0+b3V0cHV0X29mZnNldCwgc2l6ZW9mIGVzZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMCwgZXNkbC5sZF9sb2FkZWQpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIik7Ci0gICAgICBpZiAocyA9PSBOVUxMIHx8IHMtPl9yYXdfc2l6ZSA9PSAwKQotCVBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSAwLCBlc2RsLmxkX25lZWQpOwotICAgICAgZWxzZQotCVBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJICBlc2RsLmxkX25lZWQpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ydWxlcyIpOwotICAgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5fcmF3X3NpemUgPT0gMCkKLQlQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMCwgZXNkbC5sZF9ydWxlcyk7Ci0gICAgICBlbHNlCi0JUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQkgIGVzZGwubGRfcnVsZXMpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9nb3QpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9wbHQpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+X3Jhd19zaXplLCBlc2RsLmxkX3BsdF9zeik7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikKLQkJICA9PSBzLT5fcmF3X3NpemUpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX3JlbCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfaGFzaCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9zdGFiKTsKLQotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfc3RhYl9oYXNoKTsKLQotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudCwKLQkJZXNkbC5sZF9idWNrZXRzKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3RyIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX3N5bWJvbHMpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+X3Jhd19zaXplLCBlc2RsLmxkX3N5bWJfc2l6ZSk7Ci0KLSAgICAgIC8qIFRoZSBzaXplIG9mIHRoZSB0ZXh0IGFyZWEgaXMgdGhlIHNpemUgb2YgdGhlIC50ZXh0IHNlY3Rpb24KLQkgcm91bmRlZCB1cCB0byBhIHBhZ2UgYm91bmRhcnkuICBGSVhNRTogU2hvdWxkIHRoZSBwYWdlIHNpemUgYmUKLQkgY29uZGl0aW9uYWwgb24gc29tZXRoaW5nPyAgKi8KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCUJGRF9BTElHTiAob2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUsIDB4MjAwMCksCi0JCWVzZGwubGRfdGV4dCk7Ci0gIAotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZHluLT5vdXRwdXRfc2VjdGlvbiwgJmVzZGwsCi0JCQkJICAgICAgKHNkeW4tPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICAgKyBzaXplb2YgZXNkCi0JCQkJICAgICAgICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpLAotCQkJCSAgICAgIHNpemVvZiBlc2RsKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N5bXMuYyBiL2JmZC9zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OWQxZjIuLjAwMDAwMDAKLS0tIGEvYmZkL3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTMgKzAsMCBAQAotLyogR2VuZXJpYyBzeW1ib2wtdGFibGUgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JU3ltYm9scwotCi0JQkZEIHRyaWVzIHRvIG1haW50YWluIGFzIG11Y2ggc3ltYm9sIGluZm9ybWF0aW9uIGFzIGl0IGNhbiB3aGVuCi0JaXQgbW92ZXMgaW5mb3JtYXRpb24gZnJvbSBmaWxlIHRvIGZpbGUuIEJGRCBwYXNzZXMgaW5mb3JtYXRpb24KLQl0byBhcHBsaWNhdGlvbnMgdGhvdWdoIHRoZSA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUuIFdoZW4gdGhlCi0JYXBwbGljYXRpb24gcmVxdWVzdHMgdGhlIHN5bWJvbCB0YWJsZSwgQkZEIHJlYWRzIHRoZSB0YWJsZSBpbgotCXRoZSBuYXRpdmUgZm9ybSBhbmQgdHJhbnNsYXRlcyBwYXJ0cyBvZiBpdCBpbnRvIHRoZSBpbnRlcm5hbAotCWZvcm1hdC4gVG8gbWFpbnRhaW4gbW9yZSB0aGFuIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8KLQlhcHBsaWNhdGlvbnMsIHNvbWUgdGFyZ2V0cyBrZWVwIHNvbWUgaW5mb3JtYXRpb24gYGBiZWhpbmQgdGhlCi0Jc2NlbmVzJycgaW4gYSBzdHJ1Y3R1cmUgb25seSB0aGUgcGFydGljdWxhciBiYWNrIGVuZCBrbm93cwotCWFib3V0LiBGb3IgZXhhbXBsZSwgdGhlIGNvZmYgYmFjayBlbmQga2VlcHMgdGhlIG9yaWdpbmFsCi0Jc3ltYm9sIHRhYmxlIHN0cnVjdHVyZSBhcyB3ZWxsIGFzIHRoZSBjYW5vbmljYWwgc3RydWN0dXJlIHdoZW4KLQlhIEJGRCBpcyByZWFkIGluLiBPbiBvdXRwdXQsIHRoZSBjb2ZmIGJhY2sgZW5kIGNhbiByZWNvbnN0cnVjdAotCXRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlIHNvIHRoYXQgbm8gaW5mb3JtYXRpb24gaXMgbG9zdCwgZXZlbgotCWluZm9ybWF0aW9uIHVuaXF1ZSB0byBjb2ZmIHdoaWNoIEJGRCBkb2Vzbid0IGtub3cgb3IKLQl1bmRlcnN0YW5kLiBJZiBhIGNvZmYgc3ltYm9sIHRhYmxlIHdlcmUgcmVhZCwgYnV0IHdlcmUgd3JpdHRlbgotCXRocm91Z2ggYW4gYS5vdXQgYmFjayBlbmQsIGFsbCB0aGUgY29mZiBzcGVjaWZpYyBpbmZvcm1hdGlvbgotCXdvdWxkIGJlIGxvc3QuIFRoZSBzeW1ib2wgdGFibGUgb2YgYSBCRkQKLQlpcyBub3QgbmVjZXNzYXJpbHkgcmVhZCBpbiB1bnRpbCBhIGNhbm9uaWNhbGl6ZSByZXF1ZXN0IGlzCi0JbWFkZS4gVGhlbiB0aGUgQkZEIGJhY2sgZW5kIGZpbGxzIGluIGEgdGFibGUgcHJvdmlkZWQgYnkgdGhlCi0JYXBwbGljYXRpb24gd2l0aCBwb2ludGVycyB0byB0aGUgY2Fub25pY2FsIGluZm9ybWF0aW9uLiAgVG8KLQlvdXRwdXQgc3ltYm9scywgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIEJGRCB3aXRoIGEgdGFibGUgb2YKLQlwb2ludGVycyB0byBwb2ludGVycyB0byA8PGFzeW1ib2w+PnMuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucwotCWxpa2UgdGhlIGxpbmtlciB0byBvdXRwdXQgYSBzeW1ib2wgYXMgaXQgd2FzIHJlYWQsIHNpbmNlIHRoZSBgYGJlaGluZAotCXRoZSBzY2VuZXMnJyBpbmZvcm1hdGlvbiB3aWxsIGJlIHN0aWxsIGF2YWlsYWJsZS4KLUBtZW51Ci1AKiBSZWFkaW5nIFN5bWJvbHM6OgotQCogV3JpdGluZyBTeW1ib2xzOjoKLUAqIE1pbmkgU3ltYm9sczo6Ci1AKiB0eXBlZGVmIGFzeW1ib2w6OgotQCogc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9uczo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLVJlYWRpbmcgU3ltYm9scywgV3JpdGluZyBTeW1ib2xzLCBTeW1ib2xzLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JUmVhZGluZyBzeW1ib2xzCi0KLQlUaGVyZSBhcmUgdHdvIHN0YWdlcyB0byByZWFkaW5nIGEgc3ltYm9sIHRhYmxlIGZyb20gYSBCRkQ6Ci0JYWxsb2NhdGluZyBzdG9yYWdlLCBhbmQgdGhlIGFjdHVhbCByZWFkaW5nIHByb2Nlc3MuIFRoaXMgaXMgYW4KLQlleGNlcnB0IGZyb20gYW4gYXBwbGljYXRpb24gd2hpY2ggcmVhZHMgdGhlIHN5bWJvbCB0YWJsZToKLQotfAkgIGxvbmcgc3RvcmFnZV9uZWVkZWQ7Ci18CSAgYXN5bWJvbCAqKnN5bWJvbF90YWJsZTsKLXwJICBsb25nIG51bWJlcl9vZl9zeW1ib2xzOwotfAkgIGxvbmcgaTsKLXwKLXwJICBzdG9yYWdlX25lZWRlZCA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLXwKLXwgICAgICAgICBpZiAoc3RvcmFnZV9uZWVkZWQgPCAwKQotfCAgICAgICAgICAgRkFJTAotfAotfAkgIGlmIChzdG9yYWdlX25lZWRlZCA9PSAwKSB7Ci18CSAgICAgcmV0dXJuIDsKLXwJICB9Ci18CSAgc3ltYm9sX3RhYmxlID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2VfbmVlZGVkKTsKLXwJICAgIC4uLgotfAkgIG51bWJlcl9vZl9zeW1ib2xzID0KLXwJICAgICBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltYm9sX3RhYmxlKTsKLXwKLXwgICAgICAgICBpZiAobnVtYmVyX29mX3N5bWJvbHMgPCAwKQotfCAgICAgICAgICAgRkFJTAotfAotfAkgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2Zfc3ltYm9sczsgaSsrKSB7Ci18CSAgICAgcHJvY2Vzc19zeW1ib2wgKHN5bWJvbF90YWJsZVtpXSk7Ci18CSAgfQotCi0JQWxsIHN0b3JhZ2UgZm9yIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaXMgaW4gYW4gb2JqYWxsb2MKLQljb25uZWN0ZWQgdG8gdGhlIEJGRDsgaXQgaXMgZnJlZWQgd2hlbiB0aGUgQkZEIGlzIGNsb3NlZC4KLQotCi1JTk9ERQotV3JpdGluZyBTeW1ib2xzLCBNaW5pIFN5bWJvbHMsIFJlYWRpbmcgU3ltYm9scywgU3ltYm9scwotU1VCU0VDVElPTgotCVdyaXRpbmcgc3ltYm9scwotCi0JV3JpdGluZyBvZiBhIHN5bWJvbCB0YWJsZSBpcyBhdXRvbWF0aWMgd2hlbiBhIEJGRCBvcGVuIGZvcgotCXdyaXRpbmcgaXMgY2xvc2VkLiBUaGUgYXBwbGljYXRpb24gYXR0YWNoZXMgYSB2ZWN0b3Igb2YKLQlwb2ludGVycyB0byBwb2ludGVycyB0byBzeW1ib2xzIHRvIHRoZSBCRkQgYmVpbmcgd3JpdHRlbiwgYW5kCi0JZmlsbHMgaW4gdGhlIHN5bWJvbCBjb3VudC4gVGhlIGNsb3NlIGFuZCBjbGVhbnVwIGNvZGUgcmVhZHMKLQl0aHJvdWdoIHRoZSB0YWJsZSBwcm92aWRlZCBhbmQgcGVyZm9ybXMgYWxsIHRoZSBuZWNlc3NhcnkKLQlvcGVyYXRpb25zLiBUaGUgQkZEIG91dHB1dCBjb2RlIG11c3QgYWx3YXlzIGJlIHByb3ZpZGVkIHdpdGggYW4KLQlgYG93bmVkJycgc3ltYm9sOiBvbmUgd2hpY2ggaGFzIGNvbWUgZnJvbSBhbm90aGVyIEJGRCwgb3Igb25lCi0Jd2hpY2ggaGFzIGJlZW4gY3JlYXRlZCB1c2luZyA8PGJmZF9tYWtlX2VtcHR5X3N5bWJvbD4+LiAgSGVyZSBpcyBhbgotCWV4YW1wbGUgc2hvd2luZyB0aGUgY3JlYXRpb24gb2YgYSBzeW1ib2wgdGFibGUgd2l0aCBvbmx5IG9uZSBlbGVtZW50OgotCi18CSNpbmNsdWRlICJiZmQuaCIKLXwJbWFpbigpCi18CXsKLXwJICBiZmQgKmFiZmQ7Ci18CSAgYXN5bWJvbCAqcHRyc1syXTsKLXwJICBhc3ltYm9sICpuZXc7Ci18Ci18CSAgYWJmZCA9IGJmZF9vcGVudygiZm9vIiwiYS5vdXQtc3Vub3MtYmlnIik7Ci18CSAgYmZkX3NldF9mb3JtYXQoYWJmZCwgYmZkX29iamVjdCk7Ci18CSAgbmV3ID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotfAkgIG5ldy0+bmFtZSA9ICJkdW1teV9zeW1ib2wiOwotfAkgIG5ldy0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShhYmZkLCAiLnRleHQiKTsKLXwJICBuZXctPmZsYWdzID0gQlNGX0dMT0JBTDsKLXwJICBuZXctPnZhbHVlID0gMHgxMjM0NTsKLXwKLXwJICBwdHJzWzBdID0gbmV3OwotfAkgIHB0cnNbMV0gPSAoYXN5bWJvbCAqKTA7Ci18Ci18CSAgYmZkX3NldF9zeW10YWIoYWJmZCwgcHRycywgMSk7Ci18CSAgYmZkX2Nsb3NlKGFiZmQpOwotfAl9Ci18Ci18CS4vbWFrZXN5bQotfAlubSBmb28KLXwJMDAwMTIzNDUgQSBkdW1teV9zeW1ib2wKLQotCU1hbnkgZm9ybWF0cyBjYW5ub3QgcmVwcmVzZW50IGFyYml0YXJ5IHN5bWJvbCBpbmZvcm1hdGlvbjsgZm9yCi0gCWluc3RhbmNlLCB0aGUgPDxhLm91dD4+IG9iamVjdCBmb3JtYXQgZG9lcyBub3QgYWxsb3cgYW4KLQlhcmJpdGFyeSBudW1iZXIgb2Ygc2VjdGlvbnMuIEEgc3ltYm9sIHBvaW50aW5nIHRvIGEgc2VjdGlvbgotCXdoaWNoIGlzIG5vdCBvbmUgIG9mIDw8LnRleHQ+PiwgPDwuZGF0YT4+IG9yIDw8LmJzcz4+IGNhbm5vdAotCWJlIGRlc2NyaWJlZC4KLQotSU5PREUKLU1pbmkgU3ltYm9scywgdHlwZWRlZiBhc3ltYm9sLCBXcml0aW5nIFN5bWJvbHMsIFN5bWJvbHMKLVNVQlNFQ1RJT04KLQlNaW5pIFN5bWJvbHMKLQotCU1pbmkgc3ltYm9scyBwcm92aWRlIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQlUaGV5IHVzZSBsZXNzIG1lbW9yeSBzcGFjZSwgYnV0IHJlcXVpcmUgbW9yZSB0aW1lIHRvIGFjY2Vzcy4KLQlUaGV5IGNhbiBiZSB1c2VmdWwgZm9yIHRvb2xzIGxpa2Ugbm0gb3Igb2JqZHVtcCwgd2hpY2ggbWF5Ci0JaGF2ZSB0byBoYW5kbGUgc3ltYm9sIHRhYmxlcyBvZiBleHRyZW1lbHkgbGFyZ2UgZXhlY3V0YWJsZXMuCi0KLQlUaGUgPDxiZmRfcmVhZF9taW5pc3ltYm9scz4+IGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgc3ltYm9scwotCWludG8gbWVtb3J5IGluIGFuIGludGVybmFsIGZvcm0uICBJdCB3aWxsIHJldHVybiBhIDw8dm9pZCAqPj4KLQlwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5LCBhIHN5bWJvbCBjb3VudCwgYW5kIHRoZSBzaXplIG9mCi0JZWFjaCBzeW1ib2wuICBUaGUgcG9pbnRlciBpcyBhbGxvY2F0ZWQgdXNpbmcgPDxtYWxsb2M+PiwgYW5kCi0Jc2hvdWxkIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgotCi0JVGhlIGZ1bmN0aW9uIDw8YmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sPj4gd2lsbCB0YWtlIGEgcG9pbnRlcgotCXRvIGEgbWluaXN5bWJvbCwgYW5kIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSByZXR1cm5lZCBieQotCTw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4sIGFuZCByZXR1cm4gYSA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUuCi0JVGhlIHJldHVybiB2YWx1ZSBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgZnJvbQotCTw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4gd2hpY2ggd2FzIHBhc3NlZCBpbi4KLQotKi8KLQotCi0KLS8qCi1ET0NERAotSU5PREUKLXR5cGVkZWYgYXN5bWJvbCwgc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgTWluaSBTeW1ib2xzLCBTeW1ib2xzCi0KLSovCi0vKgotU1VCU0VDVElPTgotCXR5cGVkZWYgYXN5bWJvbAotCi0JQW4gPDxhc3ltYm9sPj4gaGFzIHRoZSBmb3JtOgotCi0qLwotCi0vKgotQ09ERV9GUkFHTUVOVAotCi0uCi0udHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Ci0uewotLgl7KiBBIHBvaW50ZXIgdG8gdGhlIEJGRCB3aGljaCBvd25zIHRoZSBzeW1ib2wuIFRoaXMgaW5mb3JtYXRpb24KLS4JICAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgYSBiYWNrIGVuZCBjYW4gd29yayBvdXQgd2hhdCBhZGRpdGlvbmFsCi0uICAgCSAgIGluZm9ybWF0aW9uIChpbnZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uIHdyaXRlcikgaXMgY2FycmllZAotLgkgICB3aXRoIHRoZSBzeW1ib2wuCi0uCi0uCSAgIFRoaXMgZmllbGQgaXMgKmFsbW9zdCogcmVkdW5kYW50LCBzaW5jZSB5b3UgY2FuIHVzZSBzZWN0aW9uLT5vd25lcgotLgkgICBpbnN0ZWFkLCBleGNlcHQgdGhhdCBzb21lIHN5bWJvbHMgcG9pbnQgdG8gdGhlIGdsb2JhbCBzZWN0aW9ucwotLgkgICBiZmRfe2Ficyxjb20sdW5kfV9zZWN0aW9uLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBtYWtpbmcKLS4JICAgdGhlc2UgZ2xvYmFscyBiZSBwZXItYmZkIChvciBwZXItdGFyZ2V0LWZsYXZvcikuICBGSVhNRS4gKn0KLS4KLS4gIHN0cnVjdCBfYmZkICp0aGVfYmZkOyB7KiBVc2UgYmZkX2FzeW1ib2xfYmZkKHN5bSkgdG8gYWNjZXNzIHRoaXMgZmllbGQuICp9Ci0uCi0uCXsqIFRoZSB0ZXh0IG9mIHRoZSBzeW1ib2wuIFRoZSBuYW1lIGlzIGxlZnQgYWxvbmUsIGFuZCBub3QgY29waWVkOyB0aGUKLS4JICAgYXBwbGljYXRpb24gbWF5IG5vdCBhbHRlciBpdC4gKn0KLS4gIENPTlNUIGNoYXIgKm5hbWU7Ci0uCi0uCXsqIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgdW5pb24gb2YgYQotLiAgICAgICAgICBudW1lcmljIHZhbHVlIHdpdGggYSBwb2ludGVyLCBzaW5jZSBzb21lIGZsYWdzIGluZGljYXRlIHRoYXQKLS4gICAgICAgICAgYSBwb2ludGVyIHRvIGFub3RoZXIgc3ltYm9sIGlzIHN0b3JlZCBoZXJlLiAgKn0KLS4gIHN5bXZhbHVlIHZhbHVlOwotLgotLgl7KiBBdHRyaWJ1dGVzIG9mIGEgc3ltYm9sOiAqfQotLgotLiNkZWZpbmUgQlNGX05PX0ZMQUdTICAgIDB4MDAKLS4KLS4JeyogVGhlIHN5bWJvbCBoYXMgbG9jYWwgc2NvcGU7IDw8c3RhdGljPj4gaW4gPDxDPj4uIFRoZSB2YWx1ZQotLiAJICAgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQotLiNkZWZpbmUgQlNGX0xPQ0FMCTB4MDEKLS4KLS4JeyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlOyBpbml0aWFsaXplZCBkYXRhIGluIDw8Qz4+LiBUaGUKLS4JICAgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQotLiNkZWZpbmUgQlNGX0dMT0JBTAkweDAyCi0uCi0uCXsqIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZSBhbmQgaXMgZXhwb3J0ZWQuIFRoZSB2YWx1ZSBpcwotLgkgICB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICp9Ci0uI2RlZmluZSBCU0ZfRVhQT1JUCUJTRl9HTE9CQUwgeyogbm8gcmVhbCBkaWZmZXJlbmNlICp9Ci0uCi0uCXsqIEEgbm9ybWFsIEMgc3ltYm9sIHdvdWxkIGJlIG9uZSBvZjoKLS4JICAgPDxCU0ZfTE9DQUw+PiwgPDxCU0ZfRk9SVF9DT01NPj4sICA8PEJTRl9VTkRFRklORUQ+PiBvcgotLgkgICA8PEJTRl9HTE9CQUw+PiAqfQotLgotLgl7KiBUaGUgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHJlY29yZC4gVGhlIHZhbHVlIGhhcyBhbiBhcmJpdGFyeQotLgkgICBtZWFuaW5nLiAqfQotLiNkZWZpbmUgQlNGX0RFQlVHR0lORwkweDA4Ci0uCi0uCXsqIFRoZSBzeW1ib2wgZGVub3RlcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgVXNlZCBpbiBFTEYsCi0uCSAgIHBlcmhhcHMgb3RoZXJzIHNvbWVkYXkuICAqfQotLiNkZWZpbmUgQlNGX0ZVTkNUSU9OICAgIDB4MTAKLS4KLS4JeyogVXNlZCBieSB0aGUgbGlua2VyLiAqfQotLiNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MjAKLS4jZGVmaW5lIEJTRl9LRUVQX0cgICAgICAweDQwCi0uCi0uCXsqIEEgd2VhayBnbG9iYWwgc3ltYm9sLCBvdmVycmlkYWJsZSB3aXRob3V0IHdhcm5pbmdzIGJ5Ci0uCSAgIGEgcmVndWxhciBnbG9iYWwgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICAqfQotLiNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4ODAKLS4KLS4gICAgICAgeyogVGhpcyBzeW1ib2wgd2FzIGNyZWF0ZWQgdG8gcG9pbnQgdG8gYSBzZWN0aW9uLCBlLmcuIEVMRidzCi0uCSAgIFNUVF9TRUNUSU9OIHN5bWJvbHMuICAqfQotLiNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4MTAwCi0uCi0uCXsqIFRoZSBzeW1ib2wgdXNlZCB0byBiZSBhIGNvbW1vbiBzeW1ib2wsIGJ1dCBub3cgaXQgaXMKLS4JICAgYWxsb2NhdGVkLiAqfQotLiNkZWZpbmUgQlNGX09MRF9DT01NT04gIDB4MjAwCi0uCi0uCXsqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBjb21tb24gZGF0YS4gKn0KLS4jZGVmaW5lIEJGRF9GT1JUX0NPTU1fREVGQVVMVF9WQUxVRSAwCi0uCi0uCXsqIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKLS4JICAgbG9jYXRpb24gaW4gYW4gb3V0cHV0IGZpbGUgLSBpZSBpbiBjb2ZmIGEgPDxJU0ZDTj4+IHN5bWJvbAotLgkgICB3aGljaCBpcyBhbHNvIDw8Q19FWFQ+PiBzeW1ib2wgYXBwZWFycyB3aGVyZSBpdCB3YXMKLS4JICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAotLiAgCSAgIGJ5IHRoZSB0YXJnZXQgQkZEIHBhcnQgdG8gY29udmV5IHRoaXMgaW5mb3JtYXRpb24uICp9Ci0uCi0uI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMAotLgotLgl7KiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIHRoZSBsYWJlbCBvZiBjb25zdHJ1Y3RvciBzZWN0aW9uLiAqfQotLiNkZWZpbmUgQlNGX0NPTlNUUlVDVE9SICAgMHg4MDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5hbWUgaXMgYQotLgkgICB3YXJuaW5nLiAgVGhlIG5hbWUgb2YgdGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dDsKLS4JICAgaWYgYSByZWZlcmVuY2UgaXMgbWFkZSB0byBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQKLS4JICAgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkIGJ5IHRoZSBsaW5rZXIuICp9Ci0uI2RlZmluZSBCU0ZfV0FSTklORyAgICAgICAweDEwMDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBpbmRpcmVjdC4gIFRoaXMgc3ltYm9sIGlzIGFuIGluZGlyZWN0Ci0uCSAgIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQgc3ltYm9sLiAqfQotLiNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHgyMDAwCi0uCi0uCXsqIEJTRl9GSUxFIG1hcmtzIHN5bWJvbHMgdGhhdCBjb250YWluIGEgZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkCi0uCSAgIGZvciBFTEYgU1RUX0ZJTEUgc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDQwMDAKLS4KLS4JeyogU3ltYm9sIGlzIGZyb20gZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKn0KLS4jZGVmaW5lIEJTRl9EWU5BTUlDCSAgIDB4ODAwMAotLgotLiAgICAgICB7KiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBkYXRhIG9iamVjdC4gIFVzZWQgaW4gRUxGLCBhbmQgcGVyaGFwcwotLiAgICAgICAgICBvdGhlcnMgc29tZWRheS4gICp9Ci0uI2RlZmluZSBCU0ZfT0JKRUNUCSAgIDB4MTAwMDAKLS4KLS4gIGZsYWd3b3JkIGZsYWdzOwotLgotLgl7KiBBIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhpcyBzeW1ib2wgaXMKLS4JICAgcmVsYXRpdmUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIG5vbiBOVUxMLCB0aGVyZSBhcmUgc3BlY2lhbAotLiAgICAgICAgICBzZWN0aW9ucyBmb3IgdW5kZWZpbmVkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzLiAgKn0KLS4gIHN0cnVjdCBzZWMgKnNlY3Rpb247Ci0uCi0uCXsqIEJhY2sgZW5kIHNwZWNpYWwgZGF0YS4gICp9Ci0uICB1bmlvbgotLiAgICB7Ci0uICAgICAgUFRSIHA7Ci0uICAgICAgYmZkX3ZtYSBpOwotLiAgICB9IHVkYXRhOwotLgotLn0gYXN5bWJvbDsKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi1zdGF0aWMgY2hhciBjb2ZmX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyoKLURPQ0RECi1JTk9ERQotc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgICwgdHlwZWRlZiBhc3ltYm9sLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JU3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucwotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIHZlY3RvciBvZiBwb2ludGVycwotCXRvIDw8YXN5bWJvbHM+PiBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBCRkQgQHZhcnthYmZkfSwKLQlpbmNsdWRpbmcgYSB0ZXJtaW5hbCBOVUxMIHBvaW50ZXIuIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzIGluCi0JdGhlIEJGRCwgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLgotCi0uI2RlZmluZSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9pc19sb2NhbF9sYWJlbAotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGJmZF9pc19sb2NhbF9sYWJlbChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN5bWJvbCBAdmFye3N5bX0gaW4gdGhlIEJGRCBAdmFye2FiZmR9IGlzCi0JYSBjb21waWxlciBnZW5lcmF0ZWQgbG9jYWwgbGFiZWwsIGVsc2UgcmV0dXJuIGZhbHNlLgotKi8KLQotYm9vbGVhbgotYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzeW0tPm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgc3ltLT5uYW1lKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0cnVlIGlmIGEgc3ltYm9sIHdpdGggdGhlIG5hbWUgQHZhcntuYW1lfSBpbiB0aGUgQkZECi0JQHZhcnthYmZkfSBpcyBhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4KLQlmYWxzZS4gIFRoaXMganVzdCBjaGVja3Mgd2hldGhlciB0aGUgbmFtZSBoYXMgdGhlIGZvcm0gb2YgYQotCWxvY2FsIGxhYmVsLgotCi0uI2RlZmluZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShhYmZkLCBuYW1lKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCAoYWJmZCwgbmFtZSkpCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYgotCi1ERVNDUklQVElPTgotCVJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIEB2YXJ7YWJmZH0sIGFuZCBmaWxscyBpbgotCXRoZSB2ZWN0b3IgQHZhcntsb2NhdGlvbn0gd2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBhbmQKLQlhIHRyYWlsaW5nIE5VTEwuCi0JUmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHN5bWJvbCBwb2ludGVycywgbm90Ci0JaW5jbHVkaW5nIHRoZSBOVUxMLgotCi0KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiLFwKLS4gICAgICAgICAgICAgICAgICAoYWJmZCwgbG9jYXRpb24pKQotCi0qLwotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc3ltdGFiCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3N5bXRhYiAoYmZkICphYmZkLCBhc3ltYm9sICoqbG9jYXRpb24sIHVuc2lnbmVkIGludCBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JQXJyYW5nZSB0aGF0IHdoZW4gdGhlIG91dHB1dCBCRkQgQHZhcnthYmZkfSBpcyBjbG9zZWQsCi0JdGhlIHRhYmxlIEB2YXJ7bG9jYXRpb259IG9mIEB2YXJ7Y291bnR9IHBvaW50ZXJzIHRvIHN5bWJvbHMKLQl3aWxsIGJlIHdyaXR0ZW4uCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24sIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLSAgICAgdW5zaWduZWQgaW50IHN5bWNvdW50OwotewotICBpZiAoKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB8fCAoYmZkX3JlYWRfcCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSBsb2NhdGlvbjsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCk7Ci0KLURFU0NSSVBUSU9OCi0JUHJpbnQgdGhlIHZhbHVlIGFuZCBmbGFncyBvZiB0aGUgQHZhcntzeW1ib2x9IHN1cHBsaWVkIHRvIHRoZQotCXN0cmVhbSBAdmFye2ZpbGV9LgotKi8KLXZvaWQKLWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKGFyZywgc3ltYm9sKQotICAgICBQVFIgYXJnOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhcmc7Ci0gIGZsYWd3b3JkIHR5cGUgPSBzeW1ib2wtPmZsYWdzOwotICBpZiAoc3ltYm9sLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICB9Ci0KLSAgLyogVGhpcyBwcmVzdW1lcyB0aGF0IGEgc3ltYm9sIGNhbiBub3QgYmUgYm90aCBCU0ZfREVCVUdHSU5HIGFuZAotICAgICBCU0ZfRFlOQU1JQywgbm9yIG1vcmUgdGhhbiBvbmUgb2YgQlNGX0ZVTkNUSU9OLCBCU0ZfRklMRSwgYW5kCi0gICAgIEJTRl9PQkpFQ1QuICAqLwotICBmcHJpbnRmIChmaWxlLCAiICVjJWMlYyVjJWMlYyVjIiwKLQkgICAoKHR5cGUgJiBCU0ZfTE9DQUwpCi0JICAgID8gKHR5cGUgJiBCU0ZfR0xPQkFMKSA/ICchJyA6ICdsJwotCSAgICA6ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnZycgOiAnICcpLAotCSAgICh0eXBlICYgQlNGX1dFQUspID8gJ3cnIDogJyAnLAotCSAgICh0eXBlICYgQlNGX0NPTlNUUlVDVE9SKSA/ICdDJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9XQVJOSU5HKSA/ICdXJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9JTkRJUkVDVCkgPyAnSScgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfREVCVUdHSU5HKSA/ICdkJyA6ICh0eXBlICYgQlNGX0RZTkFNSUMpID8gJ0QnIDogJyAnLAotCSAgICgodHlwZSAmIEJTRl9GVU5DVElPTikKLQkgICAgPyAnRicKLQkgICAgOiAoKHR5cGUgJiBCU0ZfRklMRSkKLQkgICAgICAgPyAnZicKLQkgICAgICAgOiAoKHR5cGUgJiBCU0ZfT0JKRUNUKSA/ICdPJyA6ICcgJykpKSk7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2VfZW1wdHlfc3ltYm9sCi0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgbmV3IDw8YXN5bWJvbD4+IHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBAdmFye2FiZmR9Ci0JYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0KLQlUaGlzIHJvdXRpbmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZWFjaCBiYWNrIGVuZCBoYXMgcHJpdmF0ZQotCWluZm9ybWF0aW9uIHN1cnJvdW5kaW5nIHRoZSA8PGFzeW1ib2w+Pi4gQnVpbGRpbmcgeW91ciBvd24KLQk8PGFzeW1ib2w+PiBhbmQgcG9pbnRpbmcgdG8gaXQgd2lsbCBub3QgY3JlYXRlIHRoZSBwcml2YXRlCi0JaW5mb3JtYXRpb24sIGFuZCB3aWxsIGNhdXNlIHByb2JsZW1zIGxhdGVyIG9uLgotCi0uI2RlZmluZSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX2RlYnVnX3N5bWJvbAotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgQHZhcnthYmZkfSwKLQl0byBiZSB1c2VkIGFzIGEgZGVidWdnaW5nIHN5bWJvbC4gIEZ1cnRoZXIgZGV0YWlscyBvZiBpdHMgdXNlIGhhdmUKLQl5ZXQgdG8gYmUgd29ya2VkIG91dC4KLQotLiNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoYWJmZCwgcHRyLCBzaXplKSkKLSovCi0KLXN0cnVjdCBzZWN0aW9uX3RvX3R5cGUKLXsKLSAgQ09OU1QgY2hhciAqc2VjdGlvbjsKLSAgY2hhciB0eXBlOwotfTsKLQotLyogTWFwIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotICAgVGhpcyB0YWJsZSBpcyBwcm9iYWJseSBpbmNvbXBsZXRlLiAgSXQgaXMgc29ydGVkIGZvciBjb252ZW5pZW5jZSBvZgotICAgYWRkaW5nIGVudHJpZXMuICBTaW5jZSBpdCBpcyBzbyBzaG9ydCwgYSBsaW5lYXIgc2VhcmNoIGlzIHVzZWQuICAqLwotc3RhdGljIENPTlNUIHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgc3R0W10gPQotewotICB7IipERUJVRyoiLCAnTid9LAotICB7Ii5ic3MiLCAnYid9LAotICB7Inplcm92YXJzIiwgJ2InfSwJCS8qIE1SSSAuYnNzICovCi0gIHsiLmRhdGEiLCAnZCd9LAotICB7InZhcnMiLCAnZCd9LAkJLyogTVJJIC5kYXRhICovCi0gIHsiLnJkYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KLSAgeyIucm9kYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KLSAgeyIuc2JzcyIsICdzJ30sCQkvKiBTbWFsbCBCU1MgKHVuaW5pdGlhbGl6ZWQgZGF0YSkuICAqLwotICB7Ii5zY29tbW9uIiwgJ2MnfSwJCS8qIFNtYWxsIGNvbW1vbi4gICovCi0gIHsiLnNkYXRhIiwgJ2cnfSwJCS8qIFNtYWxsIGluaXRpYWxpemVkIGRhdGEuICAqLwotICB7Ii50ZXh0IiwgJ3QnfSwKLSAgeyJjb2RlIiwgJ3QnfSwJCS8qIE1SSSAudGV4dCAqLwotICB7MCwgMH0KLX07Ci0KLS8qIFJldHVybiB0aGUgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZSBjb3JyZXNwb25kaW5nIHRvCi0gICBzZWN0aW9uIFMsIG9yICc/JyBmb3IgYW4gdW5rbm93biBDT0ZGIHNlY3Rpb24uICAKLQotICAgQ2hlY2sgZm9yIGFueSBsZWFkaW5nIHN0cmluZyB3aGljaCBtYXRjaGVzLCBzbyAudGV4dDUgcmV0dXJucwotICAgJ3QnIGFzIHdlbGwgYXMgLnRleHQgKi8KLQotc3RhdGljIGNoYXIKLWNvZmZfc2VjdGlvbl90eXBlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBDT05TVCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlICp0OwotCi0gIGZvciAodCA9ICZzdHRbMF07IHQtPnNlY3Rpb247IHQrKykgCi0gICAgaWYgKCFzdHJuY21wIChzLCB0LT5zZWN0aW9uLCBzdHJsZW4gKHQtPnNlY3Rpb24pKSkKLSAgICAgIHJldHVybiB0LT50eXBlOwotCi0gIHJldHVybiAnPyc7Ci19Ci0KLSNpZm5kZWYgaXNsb3dlcgotI2RlZmluZSBpc2xvd2VyKGMpICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpCi0jZW5kaWYKLSNpZm5kZWYgdG91cHBlcgotI2RlZmluZSB0b3VwcGVyKGMpIChpc2xvd2VyKGMpID8gKChjKSAmIH4weDIwKSA6IChjKSkKLSNlbmRpZgotCi0vKgotRlVOQ1RJT04KLQliZmRfZGVjb2RlX3N5bWNsYXNzCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN5bWJvbAotCWNsYXNzIG9mIEB2YXJ7c3ltYm9sfSwgb3IgJz8nIGZvciBhbiB1bmtub3duIGNsYXNzLgotCi1TWU5PUFNJUwotCWludCBiZmRfZGVjb2RlX3N5bWNsYXNzKGFzeW1ib2wgKnN5bWJvbCk7Ci0qLwotaW50Ci1iZmRfZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgY2hhciBjOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdDJzsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ1UnOwotICBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnSSc7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0gICAgcmV0dXJuICdXJzsKLSAgaWYgKCEoc3ltYm9sLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX0xPQ0FMKSkpCi0gICAgcmV0dXJuICc/JzsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIGMgPSAnYSc7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKLSAgICBjID0gY29mZl9zZWN0aW9uX3R5cGUgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gJz8nOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0gICAgYyA9IHRvdXBwZXIgKGMpOwotICByZXR1cm4gYzsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGVzZSBjYXNlcyBqdXN0IHlldCwgYnV0IHdlIHdpbGwgc29vbjoKLSAgICAgTl9TRVRWOiAndic7Ci0gICAgIE5fU0VUQTogJ2wnOwotICAgICBOX1NFVFQ6ICd4JzsKLSAgICAgTl9TRVREOiAneic7Ci0gICAgIE5fU0VUQjogJ3MnOwotICAgICBOX0lORFI6ICdpJzsKLSAgICAgKi8KLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3N5bWJvbF9pbmZvCi0KLURFU0NSSVBUSU9OCi0JRmlsbCBpbiB0aGUgYmFzaWMgaW5mbyBhYm91dCBzeW1ib2wgdGhhdCBubSBuZWVkcy4KLQlBZGRpdGlvbmFsIGluZm8gbWF5IGJlIGFkZGVkIGJ5IHRoZSBiYWNrLWVuZHMgYWZ0ZXIKLQljYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc3ltYm9sX2luZm8oYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KTsKLSovCi0KLXZvaWQKLWJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgcmV0LT50eXBlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKTsKLSAgaWYgKHJldC0+dHlwZSAhPSAnVScpCi0gICAgcmV0LT52YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYTsKLSAgZWxzZQotICAgIHJldC0+dmFsdWUgPSAwOwotICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pOwotCi1ERVNDUklQVElPTgotCUNvcHkgcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzeW19IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzeW1ib2wgQHZhcntvc3ltfSBpbiB0aGUgQkZEIEB2YXJ7b2JmZH0uCi0JUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvc2VjfS4KLQotLiNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCi0uICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsIFwKLS4JCShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSkKLQotKi8KLQotLyogVGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBtaW5pIHN5bWJvbHMuCi0gICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYmFja2VuZCBkb2VzIG5vdCBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKLSAgIHZlcnNpb24uICBJdCBqdXN0IHVzZXMgQkZEIGFzeW1ib2wgc3RydWN0dXJlcyBhcyBtaW5pIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiAqbWluaXN5bXNwOwotICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOwotewotICBsb25nIHN0b3JhZ2U7Ci0gIGFzeW1ib2wgKipzeW1zID0gTlVMTDsKLSAgbG9uZyBzeW1jb3VudDsKLQotICBpZiAoZHluYW1pYykKLSAgICBzdG9yYWdlID0gYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzdG9yYWdlKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoZHluYW1pYykKLSAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5bXMpOwotICBlbHNlCi0gICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgKm1pbmlzeW1zcCA9IChQVFIpIHN5bXM7Ci0gICpzaXplcCA9IHNpemVvZiAoYXN5bWJvbCAqKTsKLSAgcmV0dXJuIHN5bWNvdW50OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKHN5bXMpOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIFRoZSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGEgbWluaXN5bWJvbCB0bwotICAgYW4gYXN5bWJvbC4gIFdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBzeW0gYXJndW1lbnQgd2UgYXJlIHBhc3NlZDsKLSAgIHdlIGp1c3QgcmV0dXJuIHRoZSBhc3ltYm9sIHRoZSBtaW5pc3ltYm9sIHBvaW50cyB0by4gICovCi0KLS8qQVJHU1VTRUQqLwotYXN5bWJvbCAqCi1fYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIHJldHVybiAqKGFzeW1ib2wgKiopIG1pbmlzeW07Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gLnN0YWIgYW5kIC5zdGFic3RyCi0gICBzZWN0aW9ucyB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZSBhbmQgbGluZSBjbG9zZXN0IHRvIGEgZGVzaXJlZAotICAgbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgYnkgQ09GRiBhbmQgRUxGIHRhcmdldHMuICBJdCBzZXRzICpwZm91bmQKLSAgIHRvIHRydWUgaWYgaXQgZmluZHMgc29tZSBpbmZvcm1hdGlvbi4gIFRoZSAqcGluZm8gZmllbGQgaXMgdXNlZCB0bwotICAgcGFzcyBjYWNoZWQgaW5mb3JtYXRpb24gaW4gYW5kIG91dCBvZiB0aGlzIHJvdXRpbmU7IHRoaXMgZmlyc3QgdGltZQotICAgdGhlIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBhIEJGRCwgKnBpbmZvIHNob3VsZCBiZSBOVUxMLiAgVGhlIHZhbHVlCi0gICBwbGFjZWQgaW4gKnBpbmZvIHNob3VsZCBiZSBzYXZlZCB3aXRoIHRoZSBCRkQsIGFuZCBwYXNzZWQgYmFjayBlYWNoCi0gICB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KLQotLyogV2UgdXNlIGEgY2FjaGUgYnkgZGVmYXVsdC4gICovCi0KLSNkZWZpbmUgRU5BQkxFX0NBQ0hJTkcKLQotLyogV2Uga2VlcCBhbiBhcnJheSBvZiBpbmRleGVudHJ5IHN0cnVjdHVyZXMgdG8gcmVjb3JkIHdoZXJlIGluIHRoZQotICAgc3RhYnMgc2VjdGlvbiB3ZSBzaG91bGQgbG9vayB0byBmaW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBhCi0gICBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLwotCi1zdHJ1Y3QgaW5kZXhlbnRyeQotewotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgKnN0YWI7Ci0gIGJmZF9ieXRlICpzdHI7Ci0gIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICBjaGFyICpmaWxlX25hbWU7Ci0gIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci19OwotCi0vKiBDb21wYXJlIHR3byBpbmRleGVudHJ5IHN0cnVjdHVyZXMuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBpbmRleGVudHJ5IChhLCBiKQotICAgICBjb25zdCBQVFIgKmE7Ci0gICAgIGNvbnN0IFBUUiAqYjsKLXsKLSAgY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKmNvbnRlc3RhbnRBID0gKGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICopIGE7Ci0gIGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICpjb250ZXN0YW50QiA9IChjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqKSBiOwotCi0gIGlmIChjb250ZXN0YW50QS0+dmFsIDwgY29udGVzdGFudEItPnZhbCkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGNvbnRlc3RhbnRBLT52YWwgPiBjb250ZXN0YW50Qi0+dmFsKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBpcyBzdG9yZWQgaW4gKnBpbmZvLiAgKi8KLQotc3RydWN0IHN0YWJfZmluZF9pbmZvCi17Ci0gIC8qIFRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gIC8qIFRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKnN0YWJzOwotICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqc3RyczsKLQotICAvKiBBIHRhYmxlIHRoYXQgaW5kZXhlcyBzdGFicyBieSBtZW1vcnkgYWRkcmVzcy4gICovCi0gIHN0cnVjdCBpbmRleGVudHJ5ICppbmRleHRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kZXh0YWJsZS4gICovCi0gIGludCBpbmRleHRhYmxlc2l6ZTsKLQotI2lmZGVmIEVOQUJMRV9DQUNISU5HCi0gIC8qIENhY2hlZCB2YWx1ZXMgdG8gcmVzdGFydCBxdWlja2x5LiAgKi8KLSAgc3RydWN0IGluZGV4ZW50cnkgKmNhY2hlZF9pbmRleGVudHJ5OwotICBiZmRfdm1hIGNhY2hlZF9vZmZzZXQ7Ci0gIGJmZF9ieXRlICpjYWNoZWRfc3RhYjsKLSAgY2hhciAqY2FjaGVkX2ZpbGVfbmFtZTsKLSNlbmRpZgotCi0gIC8qIFNhdmVkIHB0ciB0byBtYWxsb2MnZWQgZmlsZW5hbWUuICAqLwotICBjaGFyICpmaWxlbmFtZTsKLX07Ci0KLWJvb2xlYW4KLV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsIHBmb3VuZCwKLQkJCQkgICAgIHBmaWxlbmFtZSwgcGZubmFtZSwgcGxpbmUsIHBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gKnBmb3VuZDsKLSAgICAgY29uc3QgY2hhciAqKnBmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBmbm5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCAqcGxpbmU7Ci0gICAgIFBUUiAqcGluZm87Ci17Ci0gIHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBzdGFic2l6ZSwgc3Ryc2l6ZTsKLSAgYmZkX2J5dGUgKnN0YWIsICpzdHIsICpsYXN0X3N0YWI7Ci0gIGJmZF9zaXplX3R5cGUgc3Ryb2ZmOwotICBzdHJ1Y3QgaW5kZXhlbnRyeSAqaW5kZXhlbnRyeTsKLSAgY2hhciAqZGlyZWN0b3J5X25hbWUsICpmaWxlX25hbWU7Ci0gIGludCBzYXdfZnVuOwotCi0gICpwZm91bmQgPSBmYWxzZTsKLSAgKnBmaWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAqcGZubmFtZSA9IE5VTEw7Ci0gICpwbGluZSA9IDA7Ci0KLSAgLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKLSAgICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgICAgMSBieXRlIHN0YWIgdHlwZQotICAgICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCi0gICAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICAgIDQgYnl0ZSBzdGFiIHZhbHVlCi0gICAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuCi0KLSAgICAgVGhlIHN0YWJzIHN5bWJvbHMgYXJlIGRpdmlkZWQgaW50byBjb21waWxhdGlvbiB1bml0cy4gIEZvciB0aGUKLSAgICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aAotICAgICBvZiB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGlzIHVuaXQsIGFuZCB0aGUgZGVzYyBmaWVsZCBpcyB0aGUKLSAgICAgbnVtYmVyIG9mIHN0YWJzIHN5bWJvbHMgZm9yIHRoaXMgdW5pdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotICBpbmZvID0gKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqKSAqcGluZm87Ci0gIGlmIChpbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzdGFic2l6ZSA9IGluZm8tPnN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cnNpemUgPSBpbmZvLT5zdHJzZWMtPl9yYXdfc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX3NpemUsIHJlbG9jX2NvdW50OwotICAgICAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvcjsKLSAgICAgIGludCBpOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKmZpbGVfbmFtZTsKLSAgICAgIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICAgICAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLQotICAgICAgaW5mbyA9IChzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICppbmZvKTsKLSAgICAgIGlmIChpbmZvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogV2hlbiB1c2luZyB0aGUgbGlua2VyIC0tc3BsaXQtYnktZmlsZSBvcgotCSAtLXNwbGl0LWJ5LXJlbG9jIG9wdGlvbnMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgLnN0YWIgYW5kCi0JIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIHNwbGl0LiAgV2Ugc2hvdWxkIGhhbmRsZSB0aGF0LiAgKi8KLQotICAgICAgaW5mby0+c3RhYnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGluZm8tPnN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTZXQgKnBpbmZvIHNvIHRoYXQgd2UKLSAgICAgICAgICAgICBjYW4gcmV0dXJuIHF1aWNrbHkgaW4gdGhlIGluZm8gIT0gTlVMTCBjYXNlIGFib3ZlLiAgKi8KLQkgICpwaW5mbyA9IChQVFIpIGluZm87Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHN0YWJzaXplID0gaW5mby0+c3RhYnNlYy0+X3Jhd19zaXplOwotICAgICAgc3Ryc2l6ZSA9IGluZm8tPnN0cnNlYy0+X3Jhd19zaXplOwotCi0gICAgICBpbmZvLT5zdGFicyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0YWJzaXplKTsKLSAgICAgIGluZm8tPnN0cnMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJzaXplKTsKLSAgICAgIGlmIChpbmZvLT5zdGFicyA9PSBOVUxMIHx8IGluZm8tPnN0cnMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3RhYnNlYywgaW5mby0+c3RhYnMsIDAsCi0JCQkJICAgICAgc3RhYnNpemUpCi0JICB8fCAhIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3Ryc2VjLCBpbmZvLT5zdHJzLCAwLAotCQkJCQkgc3Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLCB3ZSBoYXZlIHRvIHJlbG9jYXRlCi0JIHRoZSBlbnRyaWVzIGluIC5zdGFiLiAgVGhpcyBzaG91bGQgYWx3YXlzIGJlIHNpbXBsZSAzMiBiaXQKLQkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBvYmplY3QgZmlsZSwgc28KLQkgdGhpcyBzaG91bGQgYmUgbm8gYmlnIGRlYWwuICAqLwotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGluZm8tPnN0YWJzZWMpOwotICAgICAgaWYgKHJlbG9jX3NpemUgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgICAgIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBpbmZvLT5zdGFic2VjLCByZWxvY192ZWN0b3IsCi0JCQkJCSAgICBzeW1ib2xzKTsKLSAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCi0JewotCSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChyZWxvY19jb3VudCA+IDApCi0JewotCSAgYXJlbGVudCAqKnByOwotCi0JICBmb3IgKHByID0gcmVsb2NfdmVjdG9yOyAqcHIgIT0gTlVMTDsgcHIrKykKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnI7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCi0JICAgICAgciA9ICpwcjsKLQkgICAgICBpZiAoci0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotCQkgIHx8IHItPmhvd3RvLT5zaXplICE9IDIKLQkJICB8fCByLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgotCQkgIHx8IHItPmhvd3RvLT5wY19yZWxhdGl2ZQotCQkgIHx8IHItPmhvd3RvLT5iaXRwb3MgIT0gMAotCQkgIHx8IHItPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiVW5zdXBwb3J0ZWQgLnN0YWIgcmVsb2NhdGlvbiIpKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLQkJICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOwotCSAgICAgIHZhbCAmPSByLT5ob3d0by0+c3JjX21hc2s7Ci0JICAgICAgc3ltID0gKnItPnN5bV9wdHJfcHRyOwotCSAgICAgIHZhbCArPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWEgKyByLT5hZGRlbmQ7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0JZnJlZSAocmVsb2NfdmVjdG9yKTsKLQotICAgICAgLyogRmlyc3QgdGltZSB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIGJ1aWxkIGEgdGFibGUgbWF0Y2hpbmcKLQkgZnVuY3Rpb24gVk0gYWRkcmVzc2VzIHRvIHN0YWJzLCB0aGVuIHNvcnQgYmFzZWQgb24gc3RhcnRpbmcKLQkgVk0gYWRkcmVzcy4gIERvIHRoaXMgaW4gdHdvIHBhc3Nlczogb25jZSB0byBjb3VudCBob3cgbWFueQotCSB0YWJsZSBlbnRyaWVzIHdlJ2xsIG5lZWQsIGFuZCBhIHNlY29uZCB0byBhY3R1YWxseSBidWlsZCB0aGUKLQkgdGFibGUuICAqLwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlc2l6ZSA9IDA7Ci0gICAgICBzYXdfZnVuID0gMTsKLSAgICAgIGZvciAoc3RhYiA9IGluZm8tPnN0YWJzOyBzdGFiIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSBTVEFCU0laRSkKLQl7Ci0JICBpZiAoc3RhYltUWVBFT0ZGXSA9PSBOX1NPKQotCSAgICB7Ci0JICAgICAgLyogTl9TTyB3aXRoIG51bGwgbmFtZSBpbmRpY2F0ZXMgRU9GICovCi0JICAgICAgaWYgKGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBTVFJEWE9GRikgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBpZiB3ZSBkaWQgbm90IHNlZSBhIGZ1bmN0aW9uIGRlZiwgbGVhdmUgc3BhY2UgZm9yIG9uZS4gKi8KLQkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCQkrK2luZm8tPmluZGV4dGFibGVzaXplOwotCi0JICAgICAgc2F3X2Z1biA9IDA7Ci0KLQkgICAgICAvKiB0d28gTl9TTydzIGluIGEgcm93IGlzIGEgZmlsZW5hbWUgYW5kIGRpcmVjdG9yeS4gU2tpcCAqLwotCSAgICAgIGlmIChzdGFiICsgU1RBQlNJWkUgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplCi0JCSAgJiYgKihzdGFiICsgU1RBQlNJWkUgKyBUWVBFT0ZGKSA9PSBOX1NPKQotCQl7Ci0JCSAgc3RhYiArPSBTVEFCU0laRTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzdGFiW1RZUEVPRkZdID09IE5fRlVOKQotCSAgICB7Ci0JICAgICAgc2F3X2Z1biA9IDE7Ci0JICAgICAgKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkrK2luZm8tPmluZGV4dGFibGVzaXplOwotICAgICAgCi0gICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZXNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgICsraW5mby0+aW5kZXh0YWJsZXNpemU7Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGUgPSAoKHN0cnVjdCBpbmRleGVudHJ5ICopCi0JCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgIChzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KQotCQkJCSAgICAgICogaW5mby0+aW5kZXh0YWJsZXNpemUpKSk7Ci0gICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIHNhd19mdW4gPSAxOwotCi0gICAgICBmb3IgKGkgPSAwLCBzdHJvZmYgPSAwLCBzdGFiID0gaW5mby0+c3RhYnMsIHN0ciA9IGluZm8tPnN0cnM7Ci0JICAgaSA8IGluZm8tPmluZGV4dGFibGVzaXplICYmIHN0YWIgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplOwotCSAgIHN0YWIgKz0gU1RBQlNJWkUpCi0JewotCSAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbnRyeSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCSAgICAgIGlmICgoYmZkX3NpemVfdHlwZSkgKChpbmZvLT5zdHJzICsgc3Ryc2l6ZSkgLSBzdHIpIDwgc3Ryb2ZmKQotCQlicmVhazsKLQkgICAgICBzdHIgKz0gc3Ryb2ZmOwotCSAgICAgIHN0cm9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TTzoKLQkgICAgICAvKiBUaGUgbWFpbiBmaWxlIG5hbWUuICAqLwotCi0JICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGNyZWF0ZXMgYSBuZXcgaW5kZXh0YWJsZSBlbnRyeSB3aXRoCi0JICAgICAgICAgYSBOVUxMIGZ1bmN0aW9uIG5hbWUgaWYgdGhlcmUgd2VyZSBubyBOX0ZVTnMgaW4gYSBmaWxlLgotCSAgICAgICAgIE5vdGUgdGhhdCBhIE5fU08gd2l0aG91dCBhIGZpbGUgbmFtZSBpcyBhbiBFT0YgYW5kCi0JICAgICAgICAgdGhlcmUgY291bGQgYmUgMiBOX1NPIGZvbGxvd2luZyBpdCB3aXRoIHRoZSBuZXcgZmlsZW5hbWUgCi0JICAgICAgICAgYW5kIGRpcmVjdG9yeS4gKi8KLQkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCQl7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBsYXN0X3N0YWIgKyBWQUxPRkYpOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0ciA9IHN0cjsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gZGlyZWN0b3J5X25hbWU7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5mdW5jdGlvbl9uYW1lID0gTlVMTDsKLQkJICArK2k7Ci0JCX0KLQkgICAgICBzYXdfZnVuID0gMDsKLQkgICAgICAKLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgIGlmICgqZmlsZV9uYW1lID09ICdcMCcpCi0JCXsKLQkJICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0JCSAgZmlsZV9uYW1lID0gTlVMTDsKLQkJICBzYXdfZnVuID0gMTsKLQkJfQotCSAgICAgIGVsc2UgewotCQlsYXN0X3N0YWIgPSBzdGFiOwotCQlpZiAoc3RhYiArIFNUQUJTSVpFID49IGluZm8tPnN0YWJzICsgc3RhYnNpemUKLQkJICAgIHx8ICooc3RhYiArIFNUQUJTSVpFICsgVFlQRU9GRikgIT0gTl9TTykKLQkJICB7Ci0JCSAgICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogVHdvIGNvbnNlY3V0aXZlIE5fU09zIGFyZSBhIGRpcmVjdG9yeSBhbmQgYSBmaWxlCi0JCSAgICAgICBuYW1lLiAgKi8KLQkJICAgIHN0YWIgKz0gU1RBQlNJWkU7Ci0JCSAgICBkaXJlY3RvcnlfbmFtZSA9IGZpbGVfbmFtZTsKLQkJICAgIGZpbGVfbmFtZSA9ICgoY2hhciAqKSBzdHIKLQkJCQkgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TT0w6Ci0JICAgICAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9GVU46Ci0JICAgICAgLyogQSBmdW5jdGlvbiBuYW1lLiAgKi8KLQkgICAgICBzYXdfZnVuID0gMTsKLQkgICAgICBuYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gTlVMTDsKLQotCSAgICAgIGZ1bmN0aW9uX25hbWUgPSBuYW1lOwotCi0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IHN0YWI7Ci0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IGZ1bmN0aW9uX25hbWU7Ci0JICAgICAgKytpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCXsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gYmZkX2dldF8zMiAoYWJmZCwgbGFzdF9zdGFiICsgVkFMT0ZGKTsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBOVUxMOwotCSAgKytpOwotCX0KLQotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBpbmZvLT5zdGFicyArIHN0YWJzaXplOwotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0gICAgICArK2k7Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGVzaXplID0gaTsKLSAgICAgIHFzb3J0IChpbmZvLT5pbmRleHRhYmxlLCBpLCBzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KSwgY21waW5kZXhlbnRyeSk7Ci0KLSAgICAgICpwaW5mbyA9IChQVFIpIGluZm87Ci0gICAgfQotCi0gIC8qIFdlIGFyZSBwYXNzZWQgYSBzZWN0aW9uIHJlbGF0aXZlIG9mZnNldC4gIFRoZSBvZmZzZXRzIGluIHRoZQotICAgICBzdGFicyBpbmZvcm1hdGlvbiBhcmUgYWJzb2x1dGUuICAqLwotICBvZmZzZXQgKz0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0KLSNpZmRlZiBFTkFCTEVfQ0FDSElORwotICBpZiAoaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgIT0gTlVMTAotICAgICAgJiYgb2Zmc2V0ID49IGluZm8tPmNhY2hlZF9vZmZzZXQKLSAgICAgICYmIG9mZnNldCA8IChpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSArIDEpLT52YWwpCi0gICAgewotICAgICAgc3RhYiA9IGluZm8tPmNhY2hlZF9zdGFiOwotICAgICAgaW5kZXhlbnRyeSA9IGluZm8tPmNhY2hlZF9pbmRleGVudHJ5OwotICAgICAgZmlsZV9uYW1lID0gaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIC8qIENhY2hlIG5vbi1leGlzdGFudCBvciBpbnZhbGlkLiAgRG8gYmluYXJ5IHNlYXJjaCBvbgotICAgICAgICAgaW5kZXh0YWJsZS4gICovCi0KLSAgICAgIGxvbmcgbG93LCBoaWdoOwotICAgICAgbG9uZyBtaWQgPSAtMTsKLQotICAgICAgaW5kZXhlbnRyeSA9IE5VTEw7Ci0KLSAgICAgIGxvdyA9IDA7Ci0gICAgICBoaWdoID0gaW5mby0+aW5kZXh0YWJsZXNpemUgLSAxOwotICAgICAgd2hpbGUgKGxvdyAhPSBoaWdoKQotCXsKLQkgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0JICBpZiAob2Zmc2V0ID49IGluZm8tPmluZGV4dGFibGVbbWlkXS52YWwKLQkgICAgICAmJiBvZmZzZXQgPCBpbmZvLT5pbmRleHRhYmxlW21pZCArIDFdLnZhbCkKLQkgICAgewotCSAgICAgIGluZGV4ZW50cnkgPSAmaW5mby0+aW5kZXh0YWJsZVttaWRdOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5pbmRleHRhYmxlW21pZF0udmFsID4gb2Zmc2V0KQotCSAgICBoaWdoID0gbWlkOwotCSAgZWxzZQotCSAgICBsb3cgPSBtaWQgKyAxOwotCX0KLQotICAgICAgaWYgKGluZGV4ZW50cnkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgc3RhYiA9IGluZGV4ZW50cnktPnN0YWIgKyBTVEFCU0laRTsKLSAgICAgIGZpbGVfbmFtZSA9IGluZGV4ZW50cnktPmZpbGVfbmFtZTsKLSAgICB9Ci0KLSAgZGlyZWN0b3J5X25hbWUgPSBpbmRleGVudHJ5LT5kaXJlY3RvcnlfbmFtZTsKLSAgc3RyID0gaW5kZXhlbnRyeS0+c3RyOwotCi0gIGZvciAoOyBzdGFiIDwgKGluZGV4ZW50cnkrMSktPnN0YWI7IHN0YWIgKz0gU1RBQlNJWkUpCi0gICAgewotICAgICAgYm9vbGVhbiBkb25lOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIGRvbmUgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQotCXsKLQljYXNlIE5fU09MOgotCSAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgaWYgKHZhbCA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgICpwbGluZSA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBOX1NMSU5FOgotCWNhc2UgTl9EU0xJTkU6Ci0JY2FzZSBOX0JTTElORToKLQkgIC8qIEEgbGluZSBudW1iZXIuICBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQotICAgICAgICAgICAgIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCSAgdmFsID0gaW5kZXhlbnRyeS0+dmFsICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFZBTE9GRik7Ci0JICBpZiAodmFsIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgICpwbGluZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHN0YWIgKyBERVNDT0ZGKTsKLQotI2lmZGVmIEVOQUJMRV9DQUNISU5HCi0JICAgICAgaW5mby0+Y2FjaGVkX3N0YWIgPSBzdGFiOwotCSAgICAgIGluZm8tPmNhY2hlZF9vZmZzZXQgPSB2YWw7Ci0JICAgICAgaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKLQkgICAgICBpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSA9IGluZGV4ZW50cnk7Ci0jZW5kaWYKLQkgICAgfQotCSAgaWYgKHZhbCA+IG9mZnNldCkKLQkgICAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgTl9GVU46Ci0JY2FzZSBOX1NPOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChkb25lKQotCWJyZWFrOwotICAgIH0KLQotICAqcGZvdW5kID0gdHJ1ZTsKLQotICBpZiAoZmlsZV9uYW1lWzBdID09ICcvJyB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotICAgICpwZmlsZW5hbWUgPSBmaWxlX25hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgZGlybGVuOwotCi0gICAgICBkaXJsZW4gPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKTsKLSAgICAgIGlmIChpbmZvLT5maWxlbmFtZSA9PSBOVUxMCi0JICB8fCBzdHJuY21wIChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUsIGRpcmxlbikgIT0gMAotCSAgfHwgc3RyY21wIChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKSAhPSAwKQotCXsKLQkgIGlmIChpbmZvLT5maWxlbmFtZSAhPSBOVUxMKQotCSAgICBmcmVlIChpbmZvLT5maWxlbmFtZSk7Ci0JICBpbmZvLT5maWxlbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKGRpcmxlbiArCi0JCQkJCQlzdHJsZW4gKGZpbGVfbmFtZSkKLQkJCQkJCSsgMSk7Ci0JICBpZiAoaW5mby0+ZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUpOwotCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKTsKLQl9Ci0KLSAgICAgICpwZmlsZW5hbWUgPSBpbmZvLT5maWxlbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotCi0gICAgICAvKiBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWV0aGluZyBsaWtlIG1haW46RigwLDEpLCBzbyB3ZSB3YW50Ci0gICAgICAgICB0byBjbG9iYmVyIHRoZSBjb2xvbi4gIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSBuYW1lLCBzaW5jZSB0aGUKLSAgICAgICAgIHN0cmluZyBpcyBpbiBvdXIgb3duIGxvY2FsIHN0b3JhZ2UgYW55aG93LiAgKi8KLQotICAgICAgcyA9IHN0cmNociAoaW5kZXhlbnRyeS0+ZnVuY3Rpb25fbmFtZSwgJzonKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JKnMgPSAnXDAnOwotCi0gICAgICAqcGZubmFtZSA9IGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N5c2RlcC5oIGIvYmZkL3N5c2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTU4OTgzLi4wMDAwMDAwCi0tLSBhL2JmZC9zeXNkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKiBzeXNkZXAuaCAtLSBoYW5kbGUgaG9zdCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBCRkQgbGlicmFyeQotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQkZEX1NZU0RFUF9ICi0jZGVmaW5lIEJGRF9TWVNERVBfSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9TVERERUZfSAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmICEoZGVmaW5lZChlcnJubykgfHwgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfSU5DX0VSUk5PKSkKLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9CSU5BUllfRk9QRU4KLSNpbmNsdWRlICJmb3Blbi1iaW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAiZm9wZW4tc2FtZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBPX1JET05MWQotI2RlZmluZSBPX1JET05MWSAwCi0jZW5kaWYKLSNpZm5kZWYgT19XUk9OTFkKLSNkZWZpbmUgT19XUk9OTFkgMQotI2VuZGlmCi0jaWZuZGVmIE9fUkRXUgotI2RlZmluZSBPX1JEV1IgMgotI2VuZGlmCi0jaWZuZGVmIE9fQUNDTU9ERQotI2RlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZIHwgT19XUk9OTFkgfCBPX1JEV1IpCi0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAotI2RlZmluZSBTRUVLX1NFVCAwCi0jZW5kaWYKLSNpZm5kZWYgU0VFS19DVVIKLSNkZWZpbmUgU0VFS19DVVIgMQotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLWV4dGVybiBQVFIgbWFsbG9jICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MKLWV4dGVybiBQVFIgcmVhbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCi0jaWZkZWYgZ2V0dGV4dF9ub29wCi0jZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jZWxzZQotI2RlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotI2RlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSNkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSNkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotI2RlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotI2RlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSNkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9TWVNERVBfSCkgKi8KZGlmZiAtLWdpdCBhL2JmZC90YXJnZXRzLmMgYi9iZmQvdGFyZ2V0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRjMjY4Li4wMDAwMDAwCi0tLSBhL2JmZC90YXJnZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgxICswLDAgQEAKLS8qIEdlbmVyaWMgdGFyZ2V0LWZpbGUtdHlwZSBzdXBwb3J0IGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImZubWF0Y2guaCIKLQotLyoKLVNFQ1RJT04gCi0JVGFyZ2V0cwotCi1ERVNDUklQVElPTgotCUVhY2ggcG9ydCBvZiBCRkQgdG8gYSBkaWZmZXJlbnQgbWFjaGluZSByZXF1cmllcyB0aGUgY3JlYXRpb24KLQlvZiBhIHRhcmdldCBiYWNrIGVuZC4gQWxsIHRoZSBiYWNrIGVuZCBwcm92aWRlcyB0byB0aGUgcm9vdAotCXBhcnQgb2YgQkZEIGlzIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCi0Jd2hpY2ggcGVyZm9ybSBjZXJ0YWluIGxvdyBsZXZlbCBvcGVyYXRpb25zIG9uIGZpbGVzLiBCRkQKLQl0cmFuc2xhdGVzIHRoZSBhcHBsaWNhdGlvbnMncyByZXF1ZXN0cyB0aHJvdWdoIGEgcG9pbnRlciBpbnRvCi0JY2FsbHMgdG8gdGhlIGJhY2sgZW5kIHJvdXRpbmVzLiAKLQotCVdoZW4gYSBmaWxlIGlzIG9wZW5lZCB3aXRoIDw8YmZkX29wZW5yPj4sIGl0cyBmb3JtYXQgYW5kCi0JdGFyZ2V0IGFyZSB1bmtub3duLiBCRkQgdXNlcyB2YXJpb3VzIG1lY2hhbmlzbXMgdG8gZGV0ZXJtaW5lCi0JaG93IHRvIGludGVycHJldCB0aGUgZmlsZS4gVGhlIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGFyZToKLQotCW8gQ3JlYXRlIGEgQkZEIGJ5IGNhbGxpbmcgdGhlIGludGVybmFsIHJvdXRpbmUKLQk8PF9iZmRfbmV3X2JmZD4+LCB0aGVuIGNhbGwgPDxiZmRfZmluZF90YXJnZXQ+PiB3aXRoIHRoZQotCXRhcmdldCBzdHJpbmcgc3VwcGxpZWQgdG8gPDxiZmRfb3BlbnI+PiBhbmQgdGhlIG5ldyBCRkQgcG9pbnRlci4gCi0KLQlvIElmIGEgbnVsbCB0YXJnZXQgc3RyaW5nIHdhcyBwcm92aWRlZCB0byA8PGJmZF9maW5kX3RhcmdldD4+LAotCWxvb2sgdXAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDw8R05VVEFSR0VUPj4gYW5kIHVzZQotCXRoYXQgYXMgdGhlIHRhcmdldCBzdHJpbmcuIAotCi0JbyBJZiB0aGUgdGFyZ2V0IHN0cmluZyBpcyBzdGlsbCA8PE5VTEw+Piwgb3IgdGhlIHRhcmdldCBzdHJpbmcgaXMKLQk8PGRlZmF1bHQ+PiwgdGhlbiB1c2UgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHRhcmdldCB2ZWN0b3IKLQlhcyB0aGUgdGFyZ2V0IHR5cGUsIGFuZCBzZXQgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaW4gdGhlIEJGRCB0bwotCWNhdXNlIDw8YmZkX2NoZWNrX2Zvcm1hdD4+IHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHMuCi0JQHhyZWZ7YmZkX3RhcmdldH0uICBAeHJlZntGb3JtYXRzfS4KLQotCW8gT3RoZXJ3aXNlLCBpbnNwZWN0IHRoZSBlbGVtZW50cyBpbiB0aGUgdGFyZ2V0IHZlY3RvcgotCW9uZSBieSBvbmUsIHVudGlsIGEgbWF0Y2ggb24gdGFyZ2V0IG5hbWUgaXMgZm91bmQuIFdoZW4gZm91bmQsCi0JdXNlIGl0LiAKLQotCW8gT3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiB0bwotCTw8YmZkX29wZW5yPj4uCi0KLQlvIDw8YmZkX29wZW5yPj4gYXR0ZW1wdHMgdG8gb3BlbiB0aGUgZmlsZSB1c2luZwotCTw8YmZkX29wZW5fZmlsZT4+LCBhbmQgcmV0dXJucyB0aGUgQkZELgotCi0JT25jZSB0aGUgQkZEIGhhcyBiZWVuIG9wZW5lZCBhbmQgdGhlIHRhcmdldCBzZWxlY3RlZCwgdGhlIGZpbGUKLQlmb3JtYXQgbWF5IGJlIGRldGVybWluZWQuIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCi0JPDxiZmRfY2hlY2tfZm9ybWF0Pj4gb24gdGhlIEJGRCB3aXRoIGEgc3VnZ2VzdGVkIGZvcm1hdC4gCi0JSWYgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaGFzIGJlZW4gc2V0LCBlYWNoIHBvc3NpYmxlIHRhcmdldAotCXR5cGUgaXMgdHJpZWQgdG8gc2VlIGlmIGl0IHJlY29nbml6ZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQuCi0JPDxiZmRfY2hlY2tfZm9ybWF0Pj4gcmV0dXJucyA8PHRydWU+PiB3aGVuIHRoZSBjYWxsZXIgZ3Vlc3NlcyByaWdodC4KLUBtZW51Ci1AKiBiZmRfdGFyZ2V0OjoKLUBlbmQgbWVudQotKi8KLQotCi0vKgotCi1JTk9ERQotCWJmZF90YXJnZXQsICAsIFRhcmdldHMsIFRhcmdldHMKLURPQ0RECi1TVUJTRUNUSU9OCi0JYmZkX3RhcmdldAotCi1ERVNDUklQVElPTgotCVRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYQotCXRhcmdldC4gSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIGFuZCB3aGljaAotCXJvdXRpbmVzIHRvIGNhbGwgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLiAgIAotCi0JRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUgd2l0aCBpdHMgPDx4dmVjPj4KLQltZW1iZXIuIAotCi0JVGhlIG1hY3JvcyBiZWxvdyBhcmUgdXNlZCB0byBkaXNwYXRjaCB0byBmdW5jdGlvbnMgdGhyb3VnaCB0aGUKLQk8PGJmZF90YXJnZXQ+PiB2ZWN0b3IuIFRoZXkgYXJlIHVzZWQgaW4gYSBudW1iZXIgb2YgbWFjcm9zIGZ1cnRoZXIKLQlkb3duIGluIEBmaWxle2JmZC5ofSwgYW5kIGFyZSBhbHNvIHVzZWQgd2hlbiBjYWxsaW5nIHZhcmlvdXMKLQlyb3V0aW5lcyBieSBoYW5kIGluc2lkZSB0aGUgQkZEIGltcGxlbWVudGF0aW9uLiAgVGhlIEB2YXJ7YXJnbGlzdH0KLQlhcmd1bWVudCBtdXN0IGJlIHBhcmVudGhlc2l6ZWQ7IGl0IGNvbnRhaW5zIGFsbCB0aGUgYXJndW1lbnRzCi0JdG8gdGhlIGNhbGxlZCBmdW5jdGlvbi4gCi0KLQlUaGV5IG1ha2UgdGhlIGRvY3VtZW50YXRpb24gKG1vcmUpIHVucGxlYXNhbnQgdG8gcmVhZCwgc28gaWYKLQlzb21lb25lIHdhbnRzIHRvIGZpeCB0aGlzIGFuZCBub3QgYnJlYWsgdGhlIGFib3ZlLCBwbGVhc2UgZG8uCi0KLS4jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgICAgICAgICAgICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpCi0uCi0uI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0uI3VuZGVmIEJGRF9TRU5ECi0uI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotLiAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KSA6IFwKLS4gICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0uI2VuZGlmCi0KLQlGb3Igb3BlcmF0aW9ucyB3aGljaCBpbmRleCBvbiB0aGUgQkZEIGZvcm1hdDoKLQotLiNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgICAgICAgICAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KQotLgotLiNpZmRlZiBERUJVR19CRkRfU0VORAotLiN1bmRlZiBCRkRfU0VORF9GTVQKLS4jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotLiAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KSA6IFwKLS4gICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLS4jZW5kaWYKLQotCVRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZSB0eXBlIG9mIEJGRCB0aGlzIGlzLiAgVGhlCi0JPDx4dmVjPj4gbWVtYmVyIG9mIHRoZSBzdHJ1Y3QgPDxiZmQ+PiBpdHNlbGYgcG9pbnRzIGhlcmUuICBFYWNoCi0JbW9kdWxlIHRoYXQgaW1wbGVtZW50cyBhY2Nlc3MgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHVuZGVyIEJGRCwKLQlkZWZpbmVzIG9uZSBvZiB0aGVzZS4KLQotCi0JRklYTUUsIHRoZXNlIG5hbWVzIHNob3VsZCBiZSByYXRpb25hbGlzZWQgd2l0aCB0aGUgbmFtZXMgb2YKLQl0aGUgZW50cnkgcG9pbnRzIHdoaWNoIGNhbGwgdGhlbS4gVG9vIGJhZCB3ZSBjYW4ndCBoYXZlIG9uZQotCW1hY3JvIHRvIGRlZmluZSB0aGVtIGJvdGghIAotCi0uZW51bSBiZmRfZmxhdm91ciB7Ci0uICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCi0ufTsKLS4KLS5lbnVtIGJmZF9lbmRpYW4geyBCRkRfRU5ESUFOX0JJRywgQkZEX0VORElBTl9MSVRUTEUsIEJGRF9FTkRJQU5fVU5LTk9XTiB9OwotLgotLnsqIEZvcndhcmQgZGVjbGFyYXRpb24uICAqfQotLnR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87Ci0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX3RhcmdldAotLnsKLQotSWRlbnRpZmllcyB0aGUga2luZCBvZiB0YXJnZXQsIGUuZy4sIFN1bk9TNCwgVWx0cml4LCBldGMuCi0KLS4gIGNoYXIgKm5hbWU7Ci0KLVRoZSAiZmxhdm91ciIgb2YgYSBiYWNrIGVuZCBpcyBhIGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCB0aGUgY29udGVudHMKLW9mIGEgZmlsZS4KLQotLiAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotCi1UaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBkYXRhIGFyZWEgb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOwotCi1UaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBoZWFkZXIgcGFydHMgb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKLQotQSBtYXNrIG9mIGFsbCB0aGUgZmxhZ3Mgd2hpY2ggYW4gZXhlY3V0YWJsZSBtYXkgaGF2ZSBzZXQgLQotZnJvbSB0aGUgc2V0IDw8QkZEX05PX0ZMQUdTPj4sIDw8SEFTX1JFTE9DPj4sIC4uLjw8RF9QQUdFRD4+LgotCi0uICBmbGFnd29yZCBvYmplY3RfZmxhZ3M7ICAgICAgIAotCi1BIG1hc2sgb2YgYWxsIHRoZSBmbGFncyB3aGljaCBhIHNlY3Rpb24gbWF5IGhhdmUgc2V0IC0gZnJvbQotdGhlIHNldCA8PFNFQ19OT19GTEFHUz4+LCA8PFNFQ19BTExPQz4+LCAuLi48PFNFVF9ORVZFUl9MT0FEPj4uCi0KLS4gIGZsYWd3b3JkIHNlY3Rpb25fZmxhZ3M7Ci0KLVRoZSBjaGFyYWN0ZXIgbm9ybWFsbHkgZm91bmQgYXQgdGhlIGZyb250IG9mIGEgc3ltYm9sIAotKGlmIGFueSksIHBlcmhhcHMgYF8nLgotCi0uICBjaGFyIHN5bWJvbF9sZWFkaW5nX2NoYXI7Ci0KLVRoZSBwYWQgY2hhcmFjdGVyIGZvciBmaWxlIG5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlci4KLQotLiAgY2hhciBhcl9wYWRfY2hhcjsgICAgICAgICAgICAKLQotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIuCi0KLS4gIHVuc2lnbmVkIHNob3J0IGFyX21heF9uYW1lbGVuOwotCi1FbnRyaWVzIGZvciBieXRlIHN3YXBwaW5nIGZvciBkYXRhLiBUaGVzZSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyCi1lbnRyeSBwb2ludHMsIHNpbmNlIHRoZXkgZG9uJ3QgdGFrZSBhIEJGRCBhc3RoZSBmaXJzdCBhcmd1bWVudC4KLUNlcnRhaW4gb3RoZXIgaGFuZGxlcnMgY291bGQgZG8gdGhlIHNhbWUuCi0KLS4gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotQnl0ZSBzd2FwcGluZyBmb3IgdGhlIGhlYWRlcnMKLQotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLS4gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi1Gb3JtYXQgZGVwZW5kZW50IHJvdXRpbmVzOiB0aGVzZSBhcmUgdmVjdG9ycyBvZiBlbnRyeSBwb2ludHMKLXdpdGhpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUsIG9uZSBmb3IgZWFjaCBmb3JtYXQgdG8gY2hlY2suCi0KLUNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQuICBSZXR1cm4gYSA8PGJmZF90YXJnZXQgKj4+IG9yIHplcm8uIAotCi0uICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqKCpfYmZkX2NoZWNrX2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi1TZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbi4gIAotCi0uICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF9zZXRfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLVdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuLCBhdCA8PGJmZF9jbG9zZT4+LiAKLQotLiAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfd3JpdGVfY29udGVudHNbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotVGhlIGdlbmVyYWwgdGFyZ2V0IHZlY3Rvci4KLQotLgotLiAgeyogR2VuZXJpYyBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyhOQU1FKVwKLS5DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKLS5DQVQoTkFNRSxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pLFwKLS5DQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0uCi0uICB7KiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKLS4gIHsqIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICp9Ci0uICBib29sZWFuICgqX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIHsqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotLiAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdG8gY29weSBwcml2YXRlIGRhdGEuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKLS5DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSxcCi0uQ0FUKE5BTUUsX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyksXAotLkNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCi0uICB7KiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLS4gICAgIHRvIGFub3RoZXIuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uICB7KiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhIGNvbW1vbiBvdXRwdXQgZmlsZSB3aGVuIGxpbmtpbmcuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhbm90aGVyLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAotLiAgICAgdG8gYW5vdGhlci4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0uCQkJCQkJCSAgIGJmZCAqLCBhc3ltYm9sICopKTsKLS4gIHsqIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICp9Ci0uICBib29sZWFuCSAoKl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotLgotLiAgeyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLS4KLS4gIHsqIENvcmUgZmlsZSBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKLS5DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCksXAotLkNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpLFwKLS5DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotLiAgY2hhciAqICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGludCAgICAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uCi0uICB7KiBBcmNoaXZlIGVudHJ5IHBvaW50cy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKE5BTUUpXAotLkNBVChOQU1FLF9zbHVycF9hcm1hcCksXAotLkNBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAotLkNBVChOQU1FLF93cml0ZV9hcm1hcCksXAotLkNBVChOQU1FLF9yZWFkX2FyX2hkciksXAotLkNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKLS5DQVQoTkFNRSxfZ2V0X2VsdF9hdF9pbmRleCksXAotLkNBVChOQU1FLF9nZW5lcmljX3N0YXRfYXJjaF9lbHQpLFwKLS5DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9hcm1hcCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSBQQVJBTVMgKChiZmQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQotLiAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0uICB2b2lkICAgICAoKl9iZmRfdHJ1bmNhdGVfYXJuYW1lKSBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKLS4gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9ybCAqbWFwLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZHgpKTsKLS4gIFBUUiAoKl9iZmRfcmVhZF9hcl9oZHJfZm4pIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLS4jZGVmaW5lIGJmZF9nZXRfZWx0X2F0X2luZGV4KGIsaSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfZWx0X2F0X2luZGV4LCAoYixpKSkKLS4gIGJmZCAqICAgICgqX2JmZF9nZXRfZWx0X2F0X2luZGV4KSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLS4gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdXNlZCBmb3Igc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW10YWIpLFwKLS5DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKLS5DQVQoTkFNRSxfcHJpbnRfc3ltYm9sKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW1ib2xfaW5mbyksXAotLkNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAotLkNBVChOQU1FLF9nZXRfbGluZW5vKSxcCi0uQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCi0uQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAotLkNBVChOQU1FLF9yZWFkX21pbmlzeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX21pbmlzeW1ib2xfdG9fc3ltYm9sKQotLiAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3N5bXRhYikgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgotLiAgICAgICAgICAgICAgICAoKl9iZmRfbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB2b2lkICAgICAgICAgICgqX2JmZF9wcmludF9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLS4jZGVmaW5lIGJmZF9wcmludF9zeW1ib2woYixwLHMsZSkgQkZEX1NFTkQoYiwgX2JmZF9wcmludF9zeW1ib2wsIChiLHAscyxlKSkKLS4gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfaW5mbyAqKSk7Ci0uI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKLS4gIGJvb2xlYW4JICgqX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0uCi0uICBhbGVudCAqICAgICgqX2dldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopKTsKLS4gIGJvb2xlYW4gICAgKCpfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKLS4gICAgICAgICAgICAgICAgICAgIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZSwgQ09OU1QgY2hhciAqKmZ1bmMsCi0uICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLS4geyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLS4gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0uICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICp9Ci0uICBhc3ltYm9sICogICgqX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgdm9pZCAqcHRyLAotLiAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKLS4jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKLS4gIEJGRF9TRU5EIChiLCBfcmVhZF9taW5pc3ltYm9scywgKGIsIGQsIG0sIHMpKQotLiAgbG9uZyAgKCpfcmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKLS4jZGVmaW5lIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbChiLCBkLCBtLCBmKSBcCi0uICBCRkRfU0VORCAoYiwgX21pbmlzeW1ib2xfdG9fc3ltYm9sLCAoYiwgZCwgbSwgZikpCi0uICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICopKTsKLS4KLS4gIHsqIFJvdXRpbmVzIGZvciByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpLFwKLS5DQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKLS4gIGxvbmcgICgqX2dldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBhcmVsZW50ICoqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgeyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqfQotLiAgcmVsb2NfaG93dG9fdHlwZSAqCi0uICAgICAgICgqcmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1dSSVRFKE5BTUUpXAotLkNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCi0uQ0FUKE5BTUUsX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotLiAgYm9vbGVhbiAgICAoKl9iZmRfc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLS4gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9MSU5LKE5BTUUpXAotLkNBVChOQU1FLF9zaXplb2ZfaGVhZGVycyksXAotLkNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxheF9zZWN0aW9uKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX2JmZF9maW5hbF9saW5rKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pLFwKLS5DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQotLiAgaW50ICAgICAgICAoKl9iZmRfc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0uICBiZmRfYnl0ZSAqICgqX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0uICAgICAgICAgICAgICAgICAgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uCi0uICBib29sZWFuICAgICgqX2JmZF9yZWxheF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqYWdhaW4pKTsKLS4KLS4gIHsqIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLS4gICAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKn0KLS4gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLS4KLS4gIHsqIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2xpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0uICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLS4KLS4gIHsqIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICp9Ci0uICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLS4KLS4gIHsqIFJlbW92ZSBzZWN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIHRoZSBvdXRwdXQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZ2Nfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyhOQU1FKVwKLS5DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAotLkNBVChOQU1FLF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCksXAotLkNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLS4gIHsqIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICp9Ci0uICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKn0KLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0uICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uICB7KiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotLiAgICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLgotCi1EYXRhIGZvciB1c2UgYnkgYmFjay1lbmQgcm91dGluZXMsIHdoaWNoIGlzbid0IGdlbmVyaWMgZW5vdWdoIHRvIGJlbG9uZwotaW4gdGhpcyBzdHJ1Y3R1cmUuCi0KLS4gUFRSIGJhY2tlbmRfZGF0YTsKLS59IGJmZF90YXJnZXQ7Ci0KLSovCi0KLS8qIEFsbCBrbm93biB4dmVjcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMpLgotICAgQWxwaGFiZXRpemVkIGZvciBlYXN5IHJlZmVyZW5jZS4KLSAgIFRoZXkgYXJlIGxpc3RlZCBhIHNlY29uZCB0aW1lIGJlbG93LCBzaW5jZQotICAgd2UgY2FuJ3QgaW50ZXJtaXggZXh0ZXJuJ3MgYW5kIGluaXRpYWxpemVycy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhMjlrY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dDBfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFwb2xsb2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2JpZ19ob3N0OwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0OwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2FscGhhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ2FybV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QxMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QzMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2hwcGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k4NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k5NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tMzJyX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tNjhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tODhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMjAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMzAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NoX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zaGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NwYXJjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl92ODUwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9mcjMwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9zcGFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBkZW1vXzY0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZWNvZmZfYmlnbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGg4MzAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBoODUwMGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaG9zdF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwYnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwaHB1eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmFvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2ZHluaXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmZyZWVic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNfcGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfcG93ZXJwY19wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NnBlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZwZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMnN0dWJiZWRjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bHlueF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZseW54X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm1hY2gzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZtc2Rvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGk4NjBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrYXV4X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZ1bl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbHlueF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a3N5c3Zjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGs0a25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtODhrYmNzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG04OGttYWNoM192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXdzb3MzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfc3BhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfcG93ZXJwY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm1hY2hhb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBwY2Jvb3RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcmlzY2l4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBtYWNfeGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcnM2MDAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfc21hbGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2xlX2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3Vub3NfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRla2hleF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWMzMF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdGljODBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHZheG5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2bXNfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdm1zX3ZheF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB3ZTMya2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdzY1X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHo4a2NvZmZfdmVjOwotCi0vKiBzcmVjIGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcmVjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHN5bWJvbHNyZWNfdmVjOwotCi0vKiBiaW5hcnkgaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWM7Ci0KLS8qIGloZXggaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGloZXhfdmVjOwotCi0vKiBBbGwgb2YgdGhlIHh2ZWNzIGZvciBjb3JlIGZpbGVzLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFpeDM4Nl9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwcGFic2RfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpcml4X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmV0YnNkX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgb3NmX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2NvNV9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRyYWRfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwdHJhY2VfY29yZV92ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCBiZmRfdGFyZ2V0X3ZlY3RvcltdID0gewotCi0jaWZkZWYgU0VMRUNUX1ZFQ1MKLQotCVNFTEVDVF9WRUNTLAotCi0jZWxzZSAvKiBub3QgU0VMRUNUX1ZFQ1MgKi8KLQotI2lmZGVmIERFRkFVTFRfVkVDVE9SCi0JJkRFRkFVTFRfVkVDVE9SLAotI2VuZGlmCi0JLyogVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQotCSAgIHdpdGggb3RoZXIgdmVjdG9yIGxpc3RzIC0tIHRoZSBkZWNscyBhYm92ZSBhbmQKLQkgICB0aGUgY2FzZSBzdGF0ZW1lbnQgaW4gY29uZmlndXJlLmluLgotCSAgIFZlY3RvcnMgdGhhdCBkb24ndCBjb21waWxlIG9uIGFsbCBzeXN0ZW1zLCBvciBhcmVuJ3QgZmluaXNoZWQsCi0JICAgc2hvdWxkIGhhdmUgYW4gZW50cnkgaGVyZSB3aXRoICNpZiAwIGFyb3VuZCBpdCwgdG8gc2hvdyB0aGF0Ci0JICAgaXQgd2Fzbid0IG9taXR0ZWQgYnkgbWlzdGFrZS4gICovCi0JJmEyOWtjb2ZmX2JpZ192ZWMsCi0JJmFfb3V0X2Fkb2JlX3ZlYywKLSNpZiAwCQkJCS8qIE5vIG9uZSBzZWVtcyB0byB1c2UgdGhpcy4gICovCi0JJmFvdXRfbWlwc19iaWdfdmVjLAotI2VuZGlmCi0JJmFvdXRfbWlwc19saXR0bGVfdmVjLAotCSZiX291dF92ZWNfYmlnX2hvc3QsCi0JJmJfb3V0X3ZlY19saXR0bGVfaG9zdCwKLQotCS8qIFRoaXMsIGFuZCBvdGhlciB2ZWN0b3JzLCBtYXkgbm90IGJlIHVzZWQgaW4gYW55ICoubXQgY29uZmlndXJhdGlvbi4KLQkgICBCdXQgdGhhdCBkb2VzIG5vdCBtZWFuIHRoZXkgYXJlIHVubmVjZXNzYXJ5LiAgSWYgY29uZmlndXJlZCB3aXRoCi0JICAgLS1lbmFibGUtdGFyZ2V0cz1hbGwsIG9iamR1bXAgb3IgZ2RiIHNob3VsZCBiZSBhYmxlIHRvIGV4YW1pbmUKLQkgICB0aGUgZmlsZSBldmVuIGlmIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgbWFjaGluZSB0eXBlLiAgKi8KLQkmYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZiZmRfZWxmNjRfYWxwaGFfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9iaWdhcmNfdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2JpZ2FybV92ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjLAotCSZiZmRfZWxmMzJfYmlnbWlwc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2JpZ21pcHNfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9kMTB2X3ZlYywKLQkmYmZkX2VsZjMyX2QzMHZfdmVjLAotCSZiZmRfZWxmMzJfaHBwYV92ZWMsCi0JJmJmZF9lbGYzMl9pMzg2X3ZlYywKLQkmYmZkX2VsZjMyX2k4NjBfdmVjLAotCSZiZmRfZWxmMzJfaTk2MF92ZWMsCi0JJmJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMsCi0JJmJmZF9lbGYzMl9saXR0bGVhcmNfdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjLAotCSZiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9tMzJyX3ZlYywKLQkmYmZkX2VsZjMyX21uMTAyMDBfdmVjLAotCSZiZmRfZWxmMzJfbW4xMDMwMF92ZWMsCi0JJmJmZF9lbGYzMl9tNjhrX3ZlYywKLQkmYmZkX2VsZjMyX204OGtfdmVjLAotCSZiZmRfZWxmMzJfc3BhcmNfdmVjLAotCSZiZmRfZWxmMzJfcG93ZXJwY192ZWMsCi0JJmJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjLAotCSZiZmRfZWxmMzJfdjg1MF92ZWMsCi0JJmJmZF9lbGYzMl9mcjMwX3ZlYywKLQkmYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMsCi0JJmJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjLAotI2lmZGVmIEJGRDY0CQkJLyogTm8gb25lIHNlZW1zIHRvIHVzZSB0aGlzLiAgKi8KLQkmYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYywKLQkmYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYywKLSNlbmRpZgotI2lmIDAKLQkmYmZkX2VsZjY0X3NwYXJjX3ZlYywKLSNlbmRpZgotCS8qIFdlIGRvbid0IGluY2x1ZGUgY2lzY29fY29yZV92ZWMuICBBbHRob3VnaCBpdCBoYXMgYSBtYWdpYyBudW1iZXIsCi0JICAgdGhlIG1hZ2ljIG51bWJlciBpc24ndCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBhbmQgdGh1cwotCSAgIG1pZ2h0IHNwdXJpb3VzbHkgbWF0Y2ggb3RoZXIga2luZHMgb2YgZmlsZXMuICAqLwotI2lmZGVmIEJGRDY0Ci0JJmRlbW9fNjRfdmVjLAkvKiBPbmx5IGNvbXBpbGVkIGlmIGhvc3QgaGFzIGxvbmctbG9uZyBzdXBwb3J0ICovCi0jZW5kaWYKLQkmZWNvZmZfYmlnX3ZlYywKLQkmZWNvZmZfbGl0dGxlX3ZlYywKLQkmZWNvZmZfYmlnbGl0dGxlX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZlY29mZmFscGhhX2xpdHRsZV92ZWMsCi0jZW5kaWYKLQkmaDgzMDBjb2ZmX3ZlYywKLQkmaDg1MDBjb2ZmX3ZlYywKLSNpZiAwCi0JLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQotCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCi0JJmhvc3RfYW91dF92ZWMsCi0jZW5kaWYKLSNpZiAwCQkJCS8qIENsYXNoZXMgd2l0aCBzdW5vc19iaWdfdmVjIG1hZ2ljIG5vLiAgKi8KLQkmaHAzMDBic2RfdmVjLAotI2VuZGlmCi0JJmhwMzAwaHB1eF92ZWMsCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpCi0gICAgICAgICZzb21fdmVjLAotI2VuZGlmCi0JJmkzODZhb3V0X3ZlYywKLQkmaTM4NmJzZF92ZWMsCi0JJmkzODZjb2ZmX3ZlYywKLQkmaTM4NmZyZWVic2RfdmVjLAotCSZpODYwY29mZl92ZWMsCi0JJmJmZF9wb3dlcnBjX3BlX3ZlYywKLQkmYmZkX3Bvd2VycGNsZV9wZV92ZWMsCi0JJmJmZF9wb3dlcnBjX3BlaV92ZWMsCi0JJmJmZF9wb3dlcnBjbGVfcGVpX3ZlYywKLQkmZ28zMmNvZmZfdmVjLAotCSZnbzMyc3R1YmJlZGNvZmZfdmVjLAotI2lmIDAKLQkvKiBTaW5jZSBhLm91dCBmaWxlcyBsYWNrIGRlY2VudCBtYWdpYyBudW1iZXJzLCBubyB3YXkgdG8gcmVjb2duaXplCi0JICAgd2hpY2gga2luZCBvZiBhLm91dCBmaWxlIGl0IGlzLiAgKi8KLQkmaTM4NmxpbnV4X3ZlYywKLSNlbmRpZgotCSZpMzg2bHlueF9hb3V0X3ZlYywKLQkmaTM4Nmx5bnhfY29mZl92ZWMsCi0jaWYgMAotCS8qIE5vIGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmVzIGZvciBNYWNoIDMgZXhlY3V0YWJsZXMuICAqLwotCSZpMzg2bWFjaDNfdmVjLAotI2VuZGlmCi0JJmkzODZtc2Rvc192ZWMsCi0JJmkzODZuZXRic2RfdmVjLAotCSZpMzg2b3M5a192ZWMsCi0JJmkzODZwZV92ZWMsCi0JJmkzODZwZWlfdmVjLAotCSZhcm1jb2ZmX2xpdHRsZV92ZWMsCi0JJmFybWNvZmZfYmlnX3ZlYywKLQkmYXJtcGVfbGl0dGxlX3ZlYywKLQkmYXJtcGVfYmlnX3ZlYywKLQkmYXJtcGVpX2xpdHRsZV92ZWMsCi0JJmFybXBlaV9iaWdfdmVjLAotCSZhcm1fZXBvY19wZV9saXR0bGVfdmVjLAotCSZhcm1fZXBvY19wZV9iaWdfdmVjLAotCSZhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYywKLQkmYXJtX2Vwb2NfcGVpX2JpZ192ZWMsCi0JJmljb2ZmX2JpZ192ZWMsCi0JJmljb2ZmX2xpdHRsZV92ZWMsCi0JJmllZWVfdmVjLAotCSZtNjhrY29mZl92ZWMsCi0JJm02OGtjb2ZmdW5fdmVjLAotI2lmIDAKLQkvKiBTaW5jZSBhLm91dCBmaWxlcyBsYWNrIGRlY2VudCBtYWdpYyBudW1iZXJzLCBubyB3YXkgdG8gcmVjb2duaXplCi0JICAgd2hpY2gga2luZCBvZiBhLm91dCBmaWxlIGl0IGlzLiAgKi8KLQkmbTY4a2xpbnV4X3ZlYywKLSNlbmRpZgotCSZtNjhrbHlueF9hb3V0X3ZlYywKLQkmbTY4a2x5bnhfY29mZl92ZWMsCi0JJm02OGtuZXRic2RfdmVjLAotCSZtNjhrc3lzdmNvZmZfdmVjLAotCSZtODhrYmNzX3ZlYywKLQkmbTg4a21hY2gzX3ZlYywKLQkmbWNvcmVfcGVfYmlnX3ZlYywKLQkmbWNvcmVfcGVfbGl0dGxlX3ZlYywKLQkmbWNvcmVfcGVpX2JpZ192ZWMsCi0JJm1jb3JlX3BlaV9saXR0bGVfdmVjLAotCSZuZXdzb3MzX3ZlYywKLQkmbmxtMzJfaTM4Nl92ZWMsCi0JJm5sbTMyX3NwYXJjX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZubG0zMl9hbHBoYV92ZWMsCi0jZW5kaWYKLQkmcGM1MzJuZXRic2RfdmVjLAotI2lmIDAKLQkvKiBXZSBoYXZlIG5vIG9hc3lzIHRvb2xzIGFueW1vcmUsIHNvIHdlIGNhbid0IHRlc3QgYW55IG9mIHRoaXMKLQkgICBhbnltb3JlLiBJZiB5b3Ugd2FudCB0byB0ZXN0IHRoZSBzdHVmZiB5b3Vyc2VsZiwgZ28gYWhlYWQuLi4KLQkgICBzdGV2ZUBjeWdudXMuY29tCi0JICAgV29yc2UsIHNpbmNlIHRoZXJlIGlzIG5vIG1hZ2ljIG51bWJlciBmb3IgYXJjaGl2ZXMsIHRoZXJlCi0JICAgY2FuIGJlIGFubm95aW5nIHRhcmdldCBtaXMtbWF0Y2hlcy4gICovCi0JJm9hc3lzX3ZlYywKLSNlbmRpZgotCSZwYzUzMm1hY2hhb3V0X3ZlYywKLSNpZiAwCi0JLyogV2UgaGF2ZSBubyB3YXkgb2YgZGlzdGluZ3Vpc2hpbmcgdGhlc2UgZnJvbSBvdGhlciBhLm91dCB2YXJpYW50cyAqLwotCSZhb3V0X2FybV9iaWdfdmVjLAotCSZhb3V0X2FybV9saXR0bGVfdmVjLAotCSZyaXNjaXhfdmVjLAotI2VuZGlmCi0jaWYgMAotCS8qIFRoaXMgaGFzIHRoZSBzYW1lIG1hZ2ljIG51bWJlciBhcyBSUy82MDAwLiAqLwotCSZwbWFjX3hjb2ZmX3ZlYywKLSNlbmRpZgotCSZyczYwMDBjb2ZmX3ZlYywKLQkmcHBjYm9vdF92ZWMsCi0JJnNoY29mZl92ZWMsCi0JJnNobGNvZmZfdmVjLAotCSZzaGNvZmZfc21hbGxfdmVjLAotCSZzaGxjb2ZmX3NtYWxsX3ZlYywKLQkmc3BhcmNsZV9hb3V0X3ZlYywKLQkmc3BhcmNsaW51eF92ZWMsCi0JJnNwYXJjbHlueF9hb3V0X3ZlYywKLQkmc3BhcmNseW54X2NvZmZfdmVjLAotCSZzcGFyY25ldGJzZF92ZWMsCi0JJnN1bm9zX2JpZ192ZWMsCi0JJmFvdXQwX2JpZ192ZWMsCi0JJnRpYzMwX2FvdXRfdmVjLAotCSZ0aWMzMF9jb2ZmX3ZlYywKLQkmdGljODBjb2ZmX3ZlYywKLQkmdmF4bmV0YnNkX3ZlYywKLQkmdmVyc2Fkb3NfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJnZtc19hbHBoYV92ZWMsCi0jZW5kaWYKLQkmdm1zX3ZheF92ZWMsCi0JJndlMzJrY29mZl92ZWMsCi0JJno4a2NvZmZfdmVjLAotCi0jZW5kaWYgLyogbm90IFNFTEVDVF9WRUNTICovCi0KLS8qIEFsd2F5cyBzdXBwb3J0IFMtcmVjb3JkcywgZm9yIGNvbnZlbmllbmNlLiAgKi8KLQkmc3JlY192ZWMsCi0JJnN5bWJvbHNyZWNfdmVjLAotLyogQW5kIHRla2hleCAqLwotCSZ0ZWtoZXhfdmVjLAotLyogTGlrZXdpc2UgZm9yIGJpbmFyeSBvdXRwdXQuICAqLwotCSZiaW5hcnlfdmVjLAotLyogTGlrZXdpc2UgZm9yIGloZXguICAqLwotCSZpaGV4X3ZlYywKLQotLyogQWRkIGFueSByZXF1aXJlZCB0cmFkaXRpb25hbC1jb3JlLWZpbGUtaGFuZGxlci4gICovCi0KLSNpZmRlZiBBSVgzODZfQ09SRQotCSZhaXgzODZfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBIUFVYX0NPUkUKLQkmaHB1eF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIEhQUEFCU0RfQ09SRQotCSZocHBhYnNkX2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgSVJJWF9DT1JFCi0JJmlyaXhfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBORVRCU0RfQ09SRQotCSZuZXRic2RfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBPU0ZfQ09SRQotCSZvc2ZfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBTQ081X0NPUkUKLQkmc2NvNV9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmCVRSQURfQ09SRQotCSZ0cmFkX2NvcmVfdmVjLAotI2VuZGlmCi0KLSNpZmRlZglQVFJBQ0VfQ09SRQotCSZwdHJhY2VfY29yZV92ZWMsCi0jZW5kaWYKLQotCU5VTEwgLyogZW5kIG9mIGxpc3QgbWFya2VyICovCi19OwotCi0vKiBiZmRfZGVmYXVsdF92ZWN0b3JbMF0gY29udGFpbnMgZWl0aGVyIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWZhdWx0IHZlY3RvciwKLSAgIGlmIHRoZXJlIGlzIG9uZSwgb3IgemVybyBpZiB0aGVyZSBpc24ndC4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKmJmZF9kZWZhdWx0X3ZlY3RvcltdID0gewotI2lmZGVmIERFRkFVTFRfVkVDVE9SCi0JJkRFRkFVTFRfVkVDVE9SLAotI2VuZGlmCi0JTlVMTAotfTsKLQotLyogV2hlbiB0aGVyZSBpcyBhbiBhbWJpZ3VvdXMgbWF0Y2gsIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyBwdXRzIHRoZQotICAgbmFtZXMgb2YgdGhlIG1hdGNoaW5nIHRhcmdldHMgaW4gYW4gYXJyYXkuICBUaGlzIHZhcmlhYmxlIGlzIHRoZSBtYXhpbXVtCi0gICBudW1iZXIgb2YgZW50cmllcyB0aGF0IHRoZSBhcnJheSBjb3VsZCBwb3NzaWJseSBuZWVkLiAgKi8KLWNvbnN0IHNpemVfdCBfYmZkX3RhcmdldF92ZWN0b3JfZW50cmllcyA9IHNpemVvZihiZmRfdGFyZ2V0X3ZlY3Rvcikvc2l6ZW9mKCpiZmRfdGFyZ2V0X3ZlY3Rvcik7Ci0MCi0vKiBUaGlzIGFycmF5IG1hcHMgY29uZmlndXJhdGlvbiB0cmlwbGV0cyBvbnRvIEJGRCB2ZWN0b3JzLiAgKi8KLQotc3RydWN0IHRhcmdtYXRjaAotewotICAvKiBUaGUgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgKi8KLSAgY29uc3QgY2hhciAqdHJpcGxldDsKLSAgLyogVGhlIEJGRCB2ZWN0b3IuICBJZiB0aGlzIGlzIE5VTEwsIHRoZW4gdGhlIHZlY3RvciBpcyBmb3VuZCBieQotICAgICBzZWFyY2hpbmcgZm9yd2FyZCBmb3IgdGhlIG5leHQgc3RydWN0dXJlIHdpdGggYSBub24gTlVMTCB2ZWN0b3IKLSAgICAgZmllbGQuICAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp2ZWN0b3I7Ci19OwotCi0vKiB0YXJnbWF0Y2guaCBpcyBidWlsdCBieSBNYWtlZmlsZSBvdXQgb2YgY29uZmlnLmJmZC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhcmdtYXRjaCBiZmRfdGFyZ2V0X21hdGNoW10gPSB7Ci0jaW5jbHVkZSAidGFyZ21hdGNoLmgiCi0gIHsgTlVMTCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqZmluZF90YXJnZXQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIEZpbmQgYSB0YXJnZXQgdmVjdG9yLCBnaXZlbiBhIG5hbWUgb3IgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotZmluZF90YXJnZXQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0OwotICBjb25zdCBzdHJ1Y3QgdGFyZ21hdGNoICptYXRjaDsKLQotICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKLSAgICBpZiAoc3RyY21wIChuYW1lLCAoKnRhcmdldCktPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gKnRhcmdldDsKLQotICAvKiBJZiB3ZSBjb3VsZG4ndCBtYXRjaCBvbiB0aGUgZXhhY3QgbmFtZSwgdHJ5IG1hdGNoaW5nIG9uIHRoZQotICAgICBjb25maWd1cmF0aW9uIHRyaXBsZXQuICBGSVhNRTogV2Ugc2hvdWxkIHJ1biB0aGUgdHJpcGxldCB0aHJvdWdoCi0gICAgIGNvbmZpZy5zdWIgZmlyc3QsIGJ1dCB0aGF0IGlzIGhhcmQuICAqLwotICBmb3IgKG1hdGNoID0gJmJmZF90YXJnZXRfbWF0Y2hbMF07IG1hdGNoLT50cmlwbGV0ICE9IE5VTEw7IG1hdGNoKyspCi0gICAgewotICAgICAgaWYgKGZubWF0Y2ggKG1hdGNoLT50cmlwbGV0LCBuYW1lLCAwKSA9PSAwKQotCXsKLQkgIHdoaWxlIChtYXRjaC0+dmVjdG9yID09IE5VTEwpCi0JICAgICsrbWF0Y2g7Ci0JICByZXR1cm4gbWF0Y2gtPnZlY3RvcjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZGVmYXVsdF90YXJnZXQKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKGNvbnN0IGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgZGVmYXVsdCB0YXJnZXQgdmVjdG9yIHRvIHVzZSB3aGVuIHJlY29nbml6aW5nIGEgQkZELgotCVRoaXMgdGFrZXMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCwgd2hpY2ggbWF5IGJlIGEgQkZEIHRhcmdldAotCW5hbWUgb3IgYSBjb25maWd1cmF0aW9uIHRyaXBsZXQuCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2RlZmF1bHRfdGFyZ2V0IChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9kZWZhdWx0X3ZlY3RvclswXSAhPSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIGJmZF9kZWZhdWx0X3ZlY3RvclswXS0+bmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICB0YXJnZXQgPSBmaW5kX3RhcmdldCAobmFtZSk7Ci0gIGlmICh0YXJnZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2RlZmF1bHRfdmVjdG9yWzBdID0gdGFyZ2V0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2ZpbmRfdGFyZ2V0Ci0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX3RhcmdldCAqYmZkX2ZpbmRfdGFyZ2V0KENPTlNUIGNoYXIgKnRhcmdldF9uYW1lLCBiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHRyYW5zZmVyIHZlY3RvciBmb3IgdGhlIG9iamVjdCB0YXJnZXQKLQluYW1lZCBAdmFye3RhcmdldF9uYW1lfS4gIElmIEB2YXJ7dGFyZ2V0X25hbWV9IGlzIDw8TlVMTD4+LCBjaG9vc2UgdGhlCi0Jb25lIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8PEdOVVRBUkdFVD4+OyBpZiB0aGF0IGlzIG51bGwgb3Igbm90Ci0JZGVmaW5lZCwgdGhlbiBjaG9vc2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YXJnZXQgbGlzdC4KLQlQYXNzaW5nIGluIHRoZSBzdHJpbmcgImRlZmF1bHQiIG9yIHNldHRpbmcgdGhlIGVudmlyb25tZW50Ci0JdmFyaWFibGUgdG8gImRlZmF1bHQiIHdpbGwgY2F1c2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YXJnZXQKLQlsaXN0IHRvIGJlIHJldHVybmVkLCBhbmQgInRhcmdldF9kZWZhdWx0ZWQiIHdpbGwgYmUgc2V0IGluIHRoZQotCUJGRC4gIFRoaXMgY2F1c2VzIDw8YmZkX2NoZWNrX2Zvcm1hdD4+IHRvIGxvb3Agb3ZlciBhbGwgdGhlCi0JdGFyZ2V0cyB0byBmaW5kIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHRoZSBmaWxlIGJlaW5nIHJlYWQuICAgCi0qLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9maW5kX3RhcmdldCAodGFyZ2V0X25hbWUsIGFiZmQpCi0gICAgIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGNoYXIgKnRhcmduYW1lOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKHRhcmdldF9uYW1lICE9IE5VTEwpCi0gICAgdGFyZ25hbWUgPSB0YXJnZXRfbmFtZTsKLSAgZWxzZQotICAgIHRhcmduYW1lID0gZ2V0ZW52ICgiR05VVEFSR0VUIik7Ci0KLSAgLyogVGhpcyBpcyBzYWZlOyB0aGUgdmVjdG9yIGNhbm5vdCBiZSBudWxsICovCi0gIGlmICh0YXJnbmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAodGFyZ25hbWUsICJkZWZhdWx0IikgPT0gMCkKLSAgICB7Ci0gICAgICBhYmZkLT50YXJnZXRfZGVmYXVsdGVkID0gdHJ1ZTsKLSAgICAgIGlmIChiZmRfZGVmYXVsdF92ZWN0b3JbMF0gIT0gTlVMTCkKLQlhYmZkLT54dmVjID0gYmZkX2RlZmF1bHRfdmVjdG9yWzBdOwotICAgICAgZWxzZQotCWFiZmQtPnh2ZWMgPSBiZmRfdGFyZ2V0X3ZlY3RvclswXTsKLSAgICAgIHJldHVybiBhYmZkLT54dmVjOwotICAgIH0KLQotICBhYmZkLT50YXJnZXRfZGVmYXVsdGVkID0gZmFsc2U7Ci0KLSAgdGFyZ2V0ID0gZmluZF90YXJnZXQgKHRhcmduYW1lKTsKLSAgaWYgKHRhcmdldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFiZmQtPnh2ZWMgPSB0YXJnZXQ7Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF90YXJnZXRfbGlzdAotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKipiZmRfdGFyZ2V0X2xpc3Qodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgZnJlc2hseSBtYWxsb2NlZCBOVUxMLXRlcm1pbmF0ZWQKLQl2ZWN0b3Igb2YgdGhlIG5hbWVzIG9mIGFsbCB0aGUgdmFsaWQgQkZEIHRhcmdldHMuIERvIG5vdAotCW1vZGlmeSB0aGUgbmFtZXMuCi0KLSovCi0KLWNvbnN0IGNoYXIgKioKLWJmZF90YXJnZXRfbGlzdCAoKQotewotICBpbnQgdmVjX2xlbmd0aD0gMDsKLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSAmJiAhIGRlZmluZWQgKF9fU1REQ19fKQotICAvKiBUaGUgbmF0aXZlIGNvbXBpbGVyIG9uIHRoZSBIUDkwMDAvNzAwIGhhcyBhIGJ1ZyB3aGljaCBjYXVzZXMgaXQKLSAgICAgdG8gbG9vcCBlbmRsZXNzbHkgd2hlbiBjb21waWxpbmcgdGhpcyBmaWxlLiAgVGhpcyBhdm9pZHMgaXQuICAqLwotICB2b2xhdGlsZQotI2VuZGlmCi0gICAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXQ7Ci0gIENPTlNUICBjaGFyICoqbmFtZV9saXN0LCAqKm5hbWVfcHRyOwotCi0gIGZvciAodGFyZ2V0ID0gJmJmZF90YXJnZXRfdmVjdG9yWzBdOyAqdGFyZ2V0ICE9IE5VTEw7IHRhcmdldCsrKQotICAgIHZlY19sZW5ndGgrKzsKLQotICBuYW1lX3B0ciA9IG5hbWVfbGlzdCA9IChDT05TVCBjaGFyICoqKQotICAgIGJmZF96bWFsbG9jICgodmVjX2xlbmd0aCArIDEpICogc2l6ZW9mIChjaGFyICoqKSk7Ci0KLSAgaWYgKG5hbWVfbGlzdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGZvciAodGFyZ2V0ID0gJmJmZF90YXJnZXRfdmVjdG9yWzBdOyAqdGFyZ2V0ICE9IE5VTEw7IHRhcmdldCsrKQotICAgICoobmFtZV9wdHIrKykgPSAoKnRhcmdldCktPm5hbWU7Ci0KLSAgcmV0dXJuIG5hbWVfbGlzdDsKLX0KZGlmZiAtLWdpdCBhL2JmZC90YXJnbWF0Y2guc2VkIGIvYmZkL3RhcmdtYXRjaC5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNDBlNzIuLjAwMDAwMDAKLS0tIGEvYmZkL3RhcmdtYXRjaC5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0xLC9TVEFSVCBPRiB0YXJnbWF0Y2guaC8JZAotL0VORCBPRiB0YXJnbWF0Y2guaC8sJAkJZAotcy9eI2lmL0tFRVAgI2lmLwotcy9eI2VuZGlmL0tFRVAgI2VuZGlmLwotcy9eWyAJXSojLiokLy8KLXMvXktFRVAgIy8jLwotcy9bIAldKlxcJC8vCi10IGxhYjEKLQk6bGFiMQotcy9bfCAJXVt8IAldKlwoW158KCkgCV1bXnwoKSAJXSpcKVsgCV0qfC97ICJcMSIsIE5VTEwgfSwvZwotcy9bfCAJXVt8IAldKlwoW158KCkgCV1bXnwoKSAJXSpcKVsgCV0qKS97ICJcMSIsL2cKLXQgbGFiMgotcy9eWyAJXSp0YXJnX2RlZnZlYz1cKFteIAldKlwpLyNpZiAhZGVmaW5lZCAoU0VMRUNUX1ZFQ1MpIHx8IGRlZmluZWQgKEhBVkVfXDEpLwotdCBsYWIzCi1zLy4qPS4qLy8KLXMvOzsvLwotYgotCTpsYWIyCi1ICi1kCi0JOmxhYjMKLUcKLXMvXG4vJUVPTCUvZwotcy9cKGRlZmluZWQgKEhBVkVfXClcKFteKV0qXClcKC4qXCkvXDFcMlwzXAotXCZcMiB9LFwKLSNlbmRpZi8KLXMvJUVPTCUvXAotL2cKLXAKLXMvLiovL2cKLXMvXG4vL2cKLWgKZGlmZiAtLWdpdCBhL2JmZC90ZWtoZXguYyBiL2JmZC90ZWtoZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZmUyZC4uMDAwMDAwMAotLS0gYS9iZmQvdGVraGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY1ICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBFeHRlbmRlZCBUZWt0cm9uaXggSGV4IEZvcm1hdCAgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNVQlNFQ1RJT04KLQlUZWt0cm9uaXggSGV4IEZvcm1hdCBoYW5kbGluZwotCi1ERVNDUklQVElPTgotCQotCVRlayBIZXggcmVjb3JkcyBjYW4gaG9sZCBzeW1ib2xzIGFuZCBkYXRhLCBidXQgbm90Ci0JcmVsb2NhdGlvbnMuIFRoZWlyIG1haW4gYXBwbGljYXRpb24gaXMgY29tbXVuaWNhdGlvbiB3aXRoCi0JZGV2aWNlcyBsaWtlIFBST00gcHJvZ3JhbW1lcnMgYW5kIElDRSBlcXVpcG1lbnQuCi0JCi0JSXQgc2VlbXMgdGhhdCB0aGUgc2VjdGlvbnMgYXJlIGRlc2NpYmVkIGFzIGJlaW5nIHJlYWxseSBiaWcsCi0gICAgICAgIHRoZSBleGFtcGxlIEkgaGF2ZSBzYXlzIHRoYXQgdGhlIHRleHQgc2VjdGlvbiBpcyAwLi5mZmZmZmZmZi4KLQlCRkQgd291bGQgYmFyZiB3aXRoIHRoaXMsIG1hbnkgYXBwcyB3b3VsZCB0cnkgdG8gYWxsb2MgNEdCIHRvCi0JcmVhZCBpbiB0aGUgZmlsZS4KLQotCVRleCBIZXggbWF5IGNvbnRhaW4gbWFueSBzZWN0aW9ucywgYnV0IHRoZSBkYXRhIHdoaWNoIGNvbWVzIGluCi0JaGFzIG5vIHRhZyBzYXlpbmcgd2hpY2ggc2VjdGlvbiBpdCBiZWxvbmdzIHRvLCBzbyB3ZSBjcmVhdGUKLQlvbmUgc2VjdGlvbiBmb3IgZWFjaCBibG9jayBvZiBkYXRhLCBjYWxsZWQgImJsa25ubm4iIHdoaWNoIHdlCi0Jc3RpY2sgYWxsIHRoZSBkYXRhIGludG8uCi0KLQlUZWtIZXggbWF5IGNvbWUgb3V0IG9mIAlvcmRlciBhbmQgdGhlcmUgaXMgbm8gaGVhZGVyLCBzbyBhbgotCWluaXRpYWwgc2NhbiBpcyByZXF1aXJlZCAgdG8gZGlzY292ZXIgdGhlIG1pbmltdW0gYW5kIG1heGltdW0KLQlhZGRyZXNzZXMgdXNlZCB0byBjcmVhdGUgdGhlIHZtYSBhbmQgc2l6ZSBvZiB0aGUgc2VjdGlvbnMgd2UKLQljcmVhdGUuCi0JV2UgcmVhZCBpbiB0aGUgZGF0YSBpbnRvIHBhZ2VzIG9mIENIVU5LX01BU0srMSBzaXplIGFuZCByZWFkCi0JdGhlbSBvdXQgZnJvbSB0aGF0IHdoZW5ldmVyIHdlIG5lZWQgdG8uCi0KLQlBbnkgbnVtYmVyIG9mIHNlY3Rpb25zIG1heSBiZSBjcmVhdGVkIGZvciBvdXRwdXQsIHdlIHNhdmUgdGhlbQotCXVwIGFuZCBvdXRwdXQgdGhlbSB3aGVuIGl0J3MgdGltZSB0byBjbG9zZSB0aGUgYmZkLgotCi0KLQlBIFRla0hleCByZWNvcmQgbG9va3MgbGlrZToKLUVYQU1QTEUKLQklPGJsb2NrIGxlbmd0aD48dHlwZT48Y2hlY2tzdW0+PHN0dWZmPjxjcj4KLQkKLURFU0NSSVBUSU9OCi0JV2hlcmUKLQlvIGxlbmd0aAotCWlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlY29yZCBub3QgaW5jbHVkaW5nIHRoZSAlIHNpZ24uCi0JbyB0eXBlCi0JaXMgb25lIG9mOgotCTMpIHN5bWJvbCByZWNvcmQKLQk2KSBkYXRhIHJlY29yZAotCTgpIHRlcm1pbmF0aW9uIHJlY29yZAotCQotCi1UaGUgZGF0YSBjYW4gY29tZSBvdXQgb2Ygb3JkZXIsIGFuZCBtYXkgYmUgZGlzY29udGlnb3VzLiBUaGlzIGlzIGEKLXNlcmlhbCBwcm90b2NvbCwgc28gYmlnIGZpbGVzIGFyZSB1bmxpa2VseSwgc28gd2Uga2VlcCBhIGxpc3Qgb2YgOGsgY2h1bmtzCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBiZmRfdm1hIGxvdzsKLSAgICBiZmRfdm1hIGhpZ2g7Ci0gIH0gYWRkcl9yYW5nZV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdAotICB7Ci0KLSAgICBhc3ltYm9sIHN5bWJvbDsKLSAgICBzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKnByZXY7Ci0KLSAgfSB0ZWtoZXhfc3ltYm9sX3R5cGU7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGRpZ3NbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotc3RhdGljIGNoYXIgc3VtX2Jsb2NrWzI1Nl07Ci0KLSNkZWZpbmUgTk9UX0hFWCAyMAotI2RlZmluZSBOSUJCTEUoeCkgaGV4X3ZhbHVlKHgpCi0jZGVmaW5lIEhFWChidWZmZXIpICgoTklCQkxFKChidWZmZXIpWzBdKTw8NCkgKyBOSUJCTEUoKGJ1ZmZlcilbMV0pKQotI2RlZmluZSBUT0hFWChkLHgpIFwKLShkKVsxXSA9IGRpZ3NbKHgpICYgMHhmXTsgXAotKGQpWzBdID0gZGlnc1soKHgpPj40KSYweGZdOwotI2RlZmluZQlJU0hFWCh4KSAgaGV4X3AoeCkKLQotc3RhdGljIHZvaWQgdGVraGV4X2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJmZF92bWEgZ2V0dmFsdWUgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgdGVraGV4X3ByaW50X3N5bWJvbAotIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCB0ZWtoZXhfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBhc3ltYm9sICp0ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgdGVraGV4X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBvdXQgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlc3ltIFBBUkFNUyAoKGNoYXIgKiosIENPTlNUIGNoYXIgKikpOwotc3RhdGljIHZvaWQgd3JpdGV2YWx1ZSBQQVJBTVMgKChjaGFyICoqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQqLCBzZWNfcHRyLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfc2V0X2FyY2hfbWFjaAotIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgdm9pZCBtb3ZlX3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgYm9vbGVhbikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnRla2hleF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyB0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgdGVraGV4X2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyB2b2lkIHBhc3Nfb3ZlciBQQVJBTVMgKChiZmQgKiwgdm9pZCAoKikoYmZkKiwgaW50LCBjaGFyICopKSk7Ci1zdGF0aWMgdm9pZCBmaXJzdF9waGFzZSBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGluc2VydF9ieXRlIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGJmZF92bWEpKTsKLXN0YXRpYyBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmZpbmRfY2h1bmsgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0c3ltIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOwotCi0vKgotSGVyZSdzIGFuIGV4YW1wbGUKLSUzQTZDNjQ4MDAwNEU1NkZGRkM0RTcxNzA2M0IwQUVGRkZDNkQwNjUyQUVGRkZDNjBGMjRFNUU0RTc1Ci0lMUIzNzA5VF9TRUdNRU5UMTEwOEZGRkZGRkZGCi0lMkIzQUI5VF9TRUdNRU5UN0RnY2NfY29tcGlsZWQkMTA4N2hlbGxvJGMxMAotJTM3MzgyOVRfU0VHTUVOVDgwaW50JHQxJHIxJCQyMTQ3NDEwODBjaGFyJHQyJHIyJDAkMTI3MTAKLSUzNzM3NjlUX1NFR01FTlQ4MGxvbmckaW50JHQzJHIxJCQxMDgwdW5zaWduZWQkaW50JHQ0JDEwCi0lMzczQ0E5VF9TRUdNRU5UODBsb25nJHVuc2lnbmVkJGluMTA4MHNob3J0JGludCR0NiRyMSQxMAotJTM3MzA0OVRfU0VHTUVOVDgwbG9uZyRsb25nJGludCR0NzEwODBzaG9ydCR1bnNpZ25lZCRpMTAKLSUzNzNBMjlUX1NFR01FTlQ4MGxvbmckbG9uZyR1bnNpZ24xMDgwc2lnbmVkJGNoYXIkdDEwJDEwCi0lMzczRDY5VF9TRUdNRU5UODB1bnNpZ25lZCRjaGFyJHQxMTA4MGZsb2F0JHQxMiRyMSQ0JDAxMAotJTM3M0QxOVRfU0VHTUVOVDgwZG91YmxlJHQxMyRyMSQ4JDEwODBsb25nJGRvdWJsZSR0MTQkMTAKLSUyNzM0RDlUX1NFR01FTlQ4QnZvaWQkdDE1JDE1MTAzNV9tYWluMTAKLSUyRjNDQTlUX1NFR01FTlQ4MSQxMDgxJDE2ODEkMUU4MSQyMTQ4N21haW4kRjExMAotJTI4MzJGOVRfU0VHTUVOVDgzaSQxOEZGRkZGRkZDODEkMTQ4MSQyMTQKLSUwNyA4IDEwIDEwCi0KLWV4cGxhbmF0aW9uOgotJTNBNkM2NDgwMDA0RTU2RkZGQzRFNzE3MDYzQjBBRUZGRkM2RDA2NTJBRUZGRkM2MEYyNEU1RTRFNzUKLSBeIF5eIF4gICAgIF4tZGF0YQotIHwgfHwgKy0tLS0tLSA0IGNoYXIgaW50ZWdlciAweDgwMDAKLSB8IHwrLS0tLS0tLS0gY2hlY2tzdW0KLSB8ICstLS0tLS0tLS0gdHlwZSA2IChkYXRhIHJlY29yZCkKLSArLS0tLS0tLS0tLS0gbGVuZ3RoIDNhIGNoYXJzCi0gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gM2EgKDU4IGNoYXJzKSAtLS0tLS0tLS0tLS0tLS0tLS0tPgotCi0lMUIzNzA5VF9TRUdNRU5UMTEwOEZGRkZGRkZGCi0gICAgICBeICAgICAgICAgXl4gXi0gOCBjaGFyYWN0ZXIgaW50ZWdlciAweGZmZmZmZmZmCi0gICAgICB8ICAgICAgICAgfCstICAgMSBjaGFyYWN0ZXIgaW50ZWdlciAwCi0gICAgICB8ICAgICAgICAgKy0tICAgdHlwZSAxIHN5bWJvbCAoc2VjdGlvbiBkZWZpbml0aW9uKQotICAgICAgKy0tLS0tLS0tLS0tLSAgIDkgY2hhciBzeW1ib2wgVF9TRUdNRU5UCi0KLSUyQjNBQjlUX1NFR01FTlQ3RGdjY19jb21waWxlZCQxMDg3aGVsbG8kYzEwCi0lMzczODI5VF9TRUdNRU5UODBpbnQkdDEkcjEkJDIxNDc0MTA4MGNoYXIkdDIkcjIkMCQxMjcxMAotJTM3Mzc2OVRfU0VHTUVOVDgwbG9uZyRpbnQkdDMkcjEkJDEwODB1bnNpZ25lZCRpbnQkdDQkMTAKLSUzNzNDQTlUX1NFR01FTlQ4MGxvbmckdW5zaWduZWQkaW4xMDgwc2hvcnQkaW50JHQ2JHIxJDEwCi0lMzczMDQ5VF9TRUdNRU5UODBsb25nJGxvbmckaW50JHQ3MTA4MHNob3J0JHVuc2lnbmVkJGkxMAotJTM3M0EyOVRfU0VHTUVOVDgwbG9uZyRsb25nJHVuc2lnbjEwODBzaWduZWQkY2hhciR0MTAkMTAKLSUzNzNENjlUX1NFR01FTlQ4MHVuc2lnbmVkJGNoYXIkdDExMDgwZmxvYXQkdDEyJHIxJDQkMDEwCi0lMzczRDE5VF9TRUdNRU5UODBkb3VibGUkdDEzJHIxJDgkMTA4MGxvbmckZG91YmxlJHQxNCQxMAotJTI3MzREOVRfU0VHTUVOVDhCdm9pZCR0MTUkMTUxMDM1X21haW4xMAotJTJGM0NBOVRfU0VHTUVOVDgxJDEwODEkMTY4MSQxRTgxJDIxNDg3bWFpbiRGMTEwCi0lMjgzMkY5VF9TRUdNRU5UODNpJDE4RkZGRkZGRkM4MSQxNDgxJDIxNAotJTA3ODEwMTAKLQotVHVybnMgaW50bwotc2FjQHRoZXB1YiQgLi9vYmpkdW1wIC1keCAtbSBtNjhrIGYKLQotZjogICAgIGZpbGUgZm9ybWF0IHRla2hleAotLS0tLS14LS0tIDkvNTU3MjggLTEzNDIxOTQxNiBTZXAgMjkgMTU6MTMgMTk5NSBmCi1hcmNoaXRlY3R1cmU6IFVOS05PV04hLCBmbGFncyAweDAwMDAwMDEwOgotSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMAotU0VDVElPTiAwIFtEMDAwMDAwMDBdCTogc2l6ZSAwMDAyMDAwMCB2bWEgMDAwMDAwMDAgYWxpZ24gMioqMAotIEFMTE9DLCBMT0FECi1TRUNUSU9OIDEgW0QwMDAwODAwMF0JOiBzaXplIDAwMDAyMDAxIHZtYSAwMDAwODAwMCBhbGlnbiAyKiowCi0KLVNFQ1RJT04gMiBbVF9TRUdNRU5UXQk6IHNpemUgZmZmZmZmZmYgdm1hIDAwMDAwMDAwIGFsaWduIDIqKjAKLQotU1lNQk9MIFRBQkxFOgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGdjY19jb21waWxlZCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBoZWxsbyRjCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgaW50JHQxJHIxJCQyMTQ3NAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGNoYXIkdDIkcjIkMCQxMjcKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGludCR0MyRyMSQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgdW5zaWduZWQkaW50JHQ0JAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckdW5zaWduZWQkaW4KLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBzaG9ydCRpbnQkdDYkcjEkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRsb25nJGludCR0NwotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHNob3J0JHVuc2lnbmVkJGkKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGxvbmckdW5zaWduCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgc2lnbmVkJGNoYXIkdDEwJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHVuc2lnbmVkJGNoYXIkdDEKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBmbG9hdCR0MTIkcjEkNCQwCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgZG91YmxlJHQxMyRyMSQ4JAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckZG91YmxlJHQxNCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCB2b2lkJHQxNSQxNQotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIF9tYWluCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAxMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIG1haW4kRjEKLWZjZmZmZmZmICBnICAgICAgIFRfU0VHTUVOVCBpJDEKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAxMCAgZyAgICAgICBUX1NFR01FTlQgJAotCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgW0QwMDAwMDAwMF06IChub25lKQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFtEMDAwMDgwMDBdOiAobm9uZSkKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbVF9TRUdNRU5UXTogKG5vbmUpCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gRDAwMDAwMDAwOgotLi4uCi0wMDAwODAwMCAoJCspN2ZmMCBsaW5rdyBmcCwjLTQKLTAwMDA4MDA0ICgkKyk3ZmY0IG5vcAotMDAwMDgwMDYgKCQrKTdmZjYgbW92ZWwgIzk5LGQwCi0wMDAwODAwOCAoJCspN2ZmOCBjbXBsIGZwQCgtNCksZDAKLTAwMDA4MDBjICgkKyk3ZmZjIGJsdHMgMDAwMDgwMTQgKCQrKTgwMDQKLTAwMDA4MDBlICgkKyk3ZmZlIGFkZHFsICMxLGZwQCgtNCkKLTAwMDA4MDEyICgkKyk4MDAyIGJyYXMgMDAwMDgwMDYgKCQrKTdmZjYKLTAwMDA4MDE0ICgkKyk4MDA0IHVubGsgZnAKLTAwMDA4MDE2ICgkKyk4MDA2IHJ0cwotLi4uCi0KLSovCi0KLXN0YXRpYyB2b2lkCi10ZWtoZXhfaW5pdCAoKQotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGVkID0gZmFsc2U7Ci0gIGludCB2YWw7Ci0KLSAgaWYgKGluaXRlZCA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSB0cnVlOwotICAgICAgaGV4X2luaXQgKCk7Ci0gICAgICB2YWwgPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCi0JewotCSAgc3VtX2Jsb2NrW2kgKyAnMCddID0gdmFsKys7Ci0JfQotICAgICAgZm9yIChpID0gJ0EnOyBpIDw9ICdaJzsgaSsrKQotCXsKLQkgIHN1bV9ibG9ja1tpXSA9IHZhbCsrOwotCX0KLSAgICAgIHN1bV9ibG9ja1snJCddID0gdmFsKys7Ci0gICAgICBzdW1fYmxvY2tbJyUnXSA9IHZhbCsrOwotICAgICAgc3VtX2Jsb2NrWycuJ10gPSB2YWwrKzsKLSAgICAgIHN1bV9ibG9ja1snXyddID0gdmFsKys7Ci0gICAgICBmb3IgKGkgPSAnYSc7IGkgPD0gJ3onOyBpKyspCi0JewotCSAgc3VtX2Jsb2NrW2ldID0gdmFsKys7Ci0JfQotICAgIH0KLX0KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9uIGEgbGluZSBpcyBGRiAqLwotI2RlZmluZSBNQVhDSFVOSyAweGZmCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGZpdCBvbnRvIGEgbGluZSBvbiBvdXRwdXQgKi8KLSNkZWZpbmUgQ0hVTksgMjEKLQotLyogV2UgY2Fubm90IG91dHB1dCBvdXIgdGVraGV4b3JkcyBhcyB3ZSBzZWUgdGhlbSwgd2UgaGF2ZSB0byBnbHVlIHRoZW0KLSAgIHRvZ2V0aGVyLCB0aGlzIGlzIGRvbmUgaW4gdGhpcyBzdHJ1Y3R1cmUgOiAqLwotCi1zdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF9zdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgYmZkX3ZtYSB3aGVyZTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBzdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF9zdHJ1Y3QgKm5leHQ7Ci0KLX07Ci10eXBlZGVmIHN0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3N0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3R5cGU7Ci0KLSNkZWZpbmUgQ0hVTktfTUFTSyAweDFmZmYKLQotc3RydWN0IGRhdGFfc3RydWN0Ci0gIHsKLSAgICBjaGFyIGNodW5rX2RhdGFbQ0hVTktfTUFTSyArIDFdOwotICAgIGNoYXIgY2h1bmtfaW5pdFtDSFVOS19NQVNLICsgMV07Ci0gICAgYmZkX3ZtYSB2bWE7Ci0gICAgc3RydWN0IGRhdGFfc3RydWN0ICpuZXh0OwotICB9OwotCi10eXBlZGVmIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QKLXsKLSAgdGVraGV4X2RhdGFfbGlzdF90eXBlICpoZWFkOwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmRhdGE7Ci19IHRkYXRhX3R5cGU7Ci0KLSNkZWZpbmUgZW5kYSh4KSAoeC0+dm1hICsgeC0+c2l6ZSkKLQotc3RhdGljIGJmZF92bWEKLWdldHZhbHVlIChzcmNwKQotICAgICBjaGFyICoqc3JjcDsKLXsKLSAgY2hhciAqc3JjID0gKnNyY3A7Ci0gIGJmZF92bWEgdmFsdWUgPSAwOwotICB1bnNpZ25lZCBpbnQgbGVuID0gaGV4X3ZhbHVlKCpzcmMrKyk7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIGxlbiA9IDE2OwotICB3aGlsZSAobGVuLS0pCi0gICAgewotICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA0IHwgaGV4X3ZhbHVlKCpzcmMrKyk7Ci0gICAgfQotICAqc3JjcCA9IHNyYzsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1nZXRzeW0gKGRzdHAsIHNyY3ApCi0gICAgIGNoYXIgKmRzdHA7Ci0gICAgIGNoYXIgKipzcmNwOwotewotICBjaGFyICpzcmMgPSAqc3JjcDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBsZW4gPSBoZXhfdmFsdWUoKnNyYysrKTsKLQotICBpZiAobGVuID09IDApCi0gICAgbGVuID0gMTY7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICBkc3RwW2ldID0gc3JjW2ldOwotICBkc3RwW2ldID0gMDsKLSAgKnNyY3AgPSBzcmMgKyBpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3RydWN0IGRhdGFfc3RydWN0ICoKLWZpbmRfY2h1bmsgKGFiZmQsIHZtYSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZtYTsKLXsKLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGE7Ci0KLSAgdm1hICY9IH5DSFVOS19NQVNLOwotICB3aGlsZSAoZCAmJiAoZC0+dm1hKSAhPSB2bWEpCi0gICAgewotICAgICAgZCA9IGQtPm5leHQ7Ci0gICAgfQotICBpZiAoIWQpCi0gICAgewotICAgICAgY2hhciAqc25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIDEyKTsKLQotICAgICAgLyogTm8gY2h1bmsgZm9yIHRoaXMgYWRkcmVzcywgc28gbWFrZSBvbmUgdXAgKi8KLSAgICAgIGQgPSAoc3RydWN0IGRhdGFfc3RydWN0ICopCi0JYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkYXRhX3N0cnVjdCkpOwotCi0gICAgICBpZiAoIXNuYW1lIHx8ICFkKQotCXJldHVybiBOVUxMOwotCi0gICAgICBtZW1zZXQgKGQtPmNodW5rX2luaXQsIDAsIENIVU5LX01BU0sgKyAxKTsKLSAgICAgIG1lbXNldCAoZC0+Y2h1bmtfZGF0YSwgMCwgQ0hVTktfTUFTSyArIDEpOwotICAgICAgZC0+bmV4dCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhOwotICAgICAgZC0+dm1hID0gdm1hOwotICAgICAgYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGEgPSBkOwotICAgIH0KLSAgcmV0dXJuIGQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfYnl0ZSAoYWJmZCwgdmFsdWUsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHZhbHVlOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIC8qIEZpbmQgdGhlIGNodW5rIHRoYXQgdGhpcyBieXRlIG5lZWRzIGFuZCBwdXQgaXQgaW4gKi8KLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkID0gZmluZF9jaHVuayAoYWJmZCwgYWRkcik7Ci0KLSAgZC0+Y2h1bmtfZGF0YVthZGRyICYgQ0hVTktfTUFTS10gPSB2YWx1ZTsKLSAgZC0+Y2h1bmtfaW5pdFthZGRyICYgQ0hVTktfTUFTS10gPSAxOwotfQotCi0vKiBUaGUgZmlyc3QgcGFzcyBpcyB0byBmaW5kIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHNlY3Rpb25zLCBhbmQgc2VlCi0gIGhvdyBiaWcgdGhlIGRhdGEgaXMgKi8KLXN0YXRpYyB2b2lkCi1maXJzdF9waGFzZSAoYWJmZCwgdHlwZSwgc3JjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpzcmM7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgaW50IGxlbjsKLSAgY2hhciBzeW1bMTddOwkJCS8qIEEgc3ltYm9sIGNhbiBvbmx5IGJlIDE2Y2hhcnMgbG9uZyAqLwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnNic6Ci0gICAgICAvKiBEYXRhIHJlY29yZCAtIHJlYWQgaXQgYW5kIHN0b3JlIGl0ICovCi0gICAgICB7Ci0JYmZkX3ZtYSBhZGRyID0gZ2V0dmFsdWUgKCZzcmMpOwotCi0Jd2hpbGUgKCpzcmMpCi0JICB7Ci0JICAgIGluc2VydF9ieXRlIChhYmZkLCBIRVggKHNyYyksIGFkZHIpOwotCSAgICBzcmMgKz0gMjsKLQkgICAgYWRkcisrOwotCSAgfQotICAgICAgfQotCi0gICAgICByZXR1cm47Ci0gICAgY2FzZSAnMyc6Ci0gICAgICAvKiBTeW1ib2wgcmVjb3JkLCByZWFkIHRoZSBzZWdtZW50ICovCi0gICAgICBsZW4gPSBnZXRzeW0gKHN5bSwgJnNyYyk7Ci0gICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN5bSk7Ci0gICAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQl7Ci0JICBjaGFyICpuID0gYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKTsKLQotCSAgaWYgKCFuKQotCSAgICBhYm9ydCgpOwkJLyogRklYTUUgKi8KLQkgIG1lbWNweSAobiwgc3ltLCBsZW4gKyAxKTsKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuKTsKLQl9Ci0gICAgICB3aGlsZSAoKnNyYykKLQl7Ci0JICBzd2l0Y2ggKCpzcmMpCi0JICAgIHsKLQkgICAgY2FzZSAnMSc6CQkvKiBzZWN0aW9uIHJhbmdlICovCi0JICAgICAgc3JjKys7Ci0JICAgICAgc2VjdGlvbi0+dm1hID0gZ2V0dmFsdWUgKCZzcmMpOwotCSAgICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGdldHZhbHVlICgmc3JjKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMCc6Ci0JICAgIGNhc2UgJzInOgotCSAgICBjYXNlICczJzoKLQkgICAgY2FzZSAnNCc6Ci0JICAgIGNhc2UgJzYnOgotCSAgICBjYXNlICc3JzoKLQkgICAgY2FzZSAnOCc6Ci0JICAgICAgLyogU3ltYm9scywgYWRkIHRvIHNlY3Rpb24gKi8KLQkgICAgICB7Ci0JCXRla2hleF9zeW1ib2xfdHlwZSAqbmV3ID0KLQkJKHRla2hleF9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgICBzaXplb2YgKHRla2hleF9zeW1ib2xfdHlwZSkpOwotCQljaGFyIHR5cGUgPSAoKnNyYyk7Ci0KLQkJaWYgKCFuZXcpCi0JCSAgYWJvcnQoKTsJLyogRklYTUUgKi8KLQkJbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JCXNyYysrOwotCQlhYmZkLT5zeW1jb3VudCsrOwotCQlhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQkJbmV3LT5wcmV2ID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPnN5bWJvbHM7Ci0JCWFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5zeW1ib2xzID0gbmV3OwotCQlsZW4gPSBnZXRzeW0gKHN5bSwgJnNyYyk7Ci0JCW5ldy0+c3ltYm9sLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOwotCQlpZiAoIW5ldy0+c3ltYm9sLm5hbWUpCi0JCSAgYWJvcnQoKTsJLyogRklYTUUgKi8KLQkJbWVtY3B5ICgoY2hhciAqKSAobmV3LT5zeW1ib2wubmFtZSksIHN5bSwgbGVuICsgMSk7Ci0JCW5ldy0+c3ltYm9sLnNlY3Rpb24gPSBzZWN0aW9uOwotCQlpZiAodHlwZSA8PSAnNCcpCi0JCSAgbmV3LT5zeW1ib2wuZmxhZ3MgPSAoQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQpOwotCQllbHNlCi0JCSAgbmV3LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JCW5ldy0+c3ltYm9sLnZhbHVlID0gZ2V0dmFsdWUgKCZzcmMpIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIH0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFBhc3Mgb3ZlciBhbiB0ZWtoZXgsIGNhbGxpbmcgb25lIG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMgb24gZWFjaAotICAgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhc3Nfb3ZlciAoYWJmZCwgZnVuYykKLSAgICAgYmZkICphYmZkOwotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqKSk7Ci17Ci0gIHVuc2lnbmVkIGludCBjaGFyc19vbl9saW5lOwotICBib29sZWFuIGVvZiA9IGZhbHNlOwotCi0gIC8qIFRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIHdoaWxlIChlb2YgPT0gZmFsc2UpCi0gICAgewotICAgICAgY2hhciBidWZmZXJbTUFYQ0hVTktdOwotICAgICAgY2hhciAqc3JjID0gYnVmZmVyOwotICAgICAgY2hhciB0eXBlOwotCi0gICAgICAvKiBGaW5kIGZpcnN0ICclJyAqLwotICAgICAgZW9mID0gKGJvb2xlYW4pIChiZmRfcmVhZCAoc3JjLCAxLCAxLCBhYmZkKSAhPSAxKTsKLSAgICAgIHdoaWxlICgqc3JjICE9ICclJyAmJiAhZW9mKQotCXsKLQkgIGVvZiA9IChib29sZWFuKSAoYmZkX3JlYWQgKHNyYywgMSwgMSwgYWJmZCkgIT0gMSk7Ci0JfQotICAgICAgaWYgKGVvZikKLQlicmVhazsKLSAgICAgIHNyYysrOwotCi0gICAgICAvKiBGZXRjaCB0aGUgdHlwZSBhbmQgdGhlIGxlbmd0aCBhbmQgdGhlIGNoZWNrc3VtICovCi0gICAgICBpZiAoYmZkX3JlYWQgKHNyYywgMSwgNSwgYWJmZCkgIT0gNSkKLQlhYm9ydCAoKTsgLyogRklYTUUgKi8KLQotICAgICAgdHlwZSA9IHNyY1syXTsKLQotICAgICAgaWYgKCFJU0hFWCAoc3JjWzBdKSB8fCAhSVNIRVggKHNyY1sxXSkpCi0JYnJlYWs7Ci0KLSAgICAgIGNoYXJzX29uX2xpbmUgPSBIRVggKHNyYykgLSA1OwkvKiBBbHJlYWR5IHJlYWQgZml2ZSBjaGFyICovCi0KLSAgICAgIGlmIChiZmRfcmVhZCAoc3JjLCAxLCBjaGFyc19vbl9saW5lLCBhYmZkKSAhPSBjaGFyc19vbl9saW5lKQotCWFib3J0ICgpOyAvKiBGSVhNRSAqLwotICAgICAgc3JjW2NoYXJzX29uX2xpbmVdID0gMDsJLyogcHV0IGEgbnVsbCBhdCB0aGUgZW5kICovCi0KLSAgICAgIGZ1bmMgKGFiZmQsIHR5cGUsIHNyYyk7Ci0gICAgfQotCi19Ci0KLXN0YXRpYyBsb25nCi10ZWtoZXhfZ2V0X3N5bXRhYiAoYWJmZCwgdGFibGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnRhYmxlOwotewotICB0ZWtoZXhfc3ltYm9sX3R5cGUgKnAgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+c3ltYm9sczsKLSAgdW5zaWduZWQgaW50IGMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQotICB0YWJsZVtjXSA9IDA7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYmxlWy0tY10gPSAmKHAtPnN5bWJvbCk7Ci0gICAgICBwID0gcC0+cHJldjsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi1zdGF0aWMgbG9uZwotdGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAoc3RydWN0IHRla2hleF9hc3ltYm9sX3N0cnVjdCAqKSk7Ci0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXRla2hleF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB0ZGF0YV90eXBlICp0ZGF0YSA9ICh0ZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICh0ZGF0YV90eXBlKSk7Ci0KLSAgaWYgKCF0ZGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGFiZmQtPnRkYXRhLnRla2hleF9kYXRhID0gdGRhdGE7Ci0gIHRkYXRhLT50eXBlID0gMTsKLSAgdGRhdGEtPmhlYWQgPSAodGVraGV4X2RhdGFfbGlzdF90eXBlICopIE5VTEw7Ci0gIHRkYXRhLT5zeW1ib2xzID0gKHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqKSBOVUxMOwotICB0ZGF0YS0+ZGF0YSA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGxvb2tzIGxpa2UgaXQncyBpbiBUZWtIZXggZm9ybWF0LiBKdXN0IGxvb2sKLSAgZm9yIGEgcGVyY2VudCBzaWduIGFuZCBzb21lIGhleCBkaWdpdHMgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotdGVraGV4X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgYls0XTsKLQotICB0ZWtoZXhfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICclJyB8fCAhSVNIRVggKGJbMV0pIHx8ICFJU0hFWCAoYlsyXSkgfHwgIUlTSEVYIChiWzNdKSkKLSAgICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLQotICB0ZWtoZXhfbWtvYmplY3QgKGFiZmQpOwotCi0gIHBhc3Nfb3ZlciAoYWJmZCwgZmlyc3RfcGhhc2UpOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIHZvaWQKLW1vdmVfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGNvdW50LCBnZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYm9vbGVhbiBnZXQ7Ci17Ci0gIGJmZF92bWEgYWRkcjsKLSAgY2hhciAqbG9jYXRpb24gPSAoY2hhciAqKSBsb2NhdGlvbnA7Ci0gIGJmZF92bWEgcHJldl9udW1iZXIgPSAxOwkvKiBOb3RoaW5nIGNhbiBoYXZlIHRoaXMgYXMgYSBoaWdoIGJpdCovCi0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLQotICBmb3IgKGFkZHIgPSBzZWN0aW9uLT52bWE7IGNvdW50ICE9IDA7IGNvdW50LS0sIGFkZHIrKykKLSAgICB7Ci0KLSAgICAgIGJmZF92bWEgY2h1bmtfbnVtYmVyID0gYWRkciAmIH5DSFVOS19NQVNLOwkvKiBHZXQgaGlnaCBiaXRzIG9mIGFkZHJlc3MgKi8KLSAgICAgIGJmZF92bWEgbG93X2JpdHMgPSBhZGRyICYgQ0hVTktfTUFTSzsKLQotICAgICAgaWYgKGNodW5rX251bWJlciAhPSBwcmV2X251bWJlcikKLQl7Ci0JICAvKiBEaWZmZXJlbnQgY2h1bmssIHNvIG1vdmUgcG9pbnRlciAqLwotCSAgZCA9IGZpbmRfY2h1bmsgKGFiZmQsIGNodW5rX251bWJlcik7Ci0JfQotCi0gICAgICBpZiAoZ2V0KQotCXsKLQkgIGlmIChkLT5jaHVua19pbml0W2xvd19iaXRzXSkKLQkgICAgewotCSAgICAgICpsb2NhdGlvbiA9IGQtPmNodW5rX2RhdGFbbG93X2JpdHNdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGQtPmNodW5rX2RhdGFbbG93X2JpdHNdID0gKmxvY2F0aW9uOwotCSAgZC0+Y2h1bmtfaW5pdFtsb3dfYml0c10gPSAoKmxvY2F0aW9uICE9IDApOwotCX0KLQotICAgICAgbG9jYXRpb24rKzsKLQotICAgIH0KLQotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLSAgICB7Ci0gICAgICBtb3ZlX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBjb3VudCwgdHJ1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLS8qIHdlIGhhdmUgdG8gc2F2ZSB1cCBhbGwgdGhlIFRla2hleG9yZHMgZm9yIGEgc3BsdXJnZSBiZWZvcmUgb3V0cHV0LAotICAgICovCi0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBieXRlc190b19kbzsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBUaGUgZmlyc3QgdGltZSBhcm91bmQsIGFsbG9jYXRlIGVub3VnaCBzZWN0aW9ucyB0byBob2xkIGFsbCB0aGUgY2h1bmtzICovCi0gICAgICBhc2VjdGlvbiAqcyA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgYmZkX3ZtYSB2bWE7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKLQkgICAgewotCSAgICAgIGZvciAodm1hID0gcy0+dm1hICYgfkNIVU5LX01BU0s7Ci0JCSAgIHZtYSA8IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgdm1hICs9IENIVU5LX01BU0spCi0JCWZpbmRfY2h1bmsgKGFiZmQsIHZtYSk7Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGlmIChzZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgYnl0ZXNfdG9fZG8sIGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotfQotCi1zdGF0aWMgdm9pZAotd3JpdGV2YWx1ZSAoZHN0LCB2YWx1ZSkKLSAgICAgY2hhciAqKmRzdDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgY2hhciAqcCA9ICpkc3Q7Ci0gIGludCBsZW47Ci0gIGludCBzaGlmdDsKLQotICBmb3IgKGxlbiA9IDgsIHNoaWZ0ID0gMjg7IHNoaWZ0OyBzaGlmdCAtPSA0LCBsZW4tLSkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlID4+IHNoaWZ0KSAmIDB4ZikKLQl7Ci0JICAqcCsrID0gbGVuICsgJzAnOwotCSAgd2hpbGUgKGxlbikKLQkgICAgewotCSAgICAgICpwKysgPSBkaWdzWyh2YWx1ZSA+PiBzaGlmdCkgJiAweGZdOwotCSAgICAgIHNoaWZ0IC09IDQ7Ci0JICAgICAgbGVuLS07Ci0JICAgIH0KLQkgICpkc3QgPSBwOwotCSAgcmV0dXJuOwotCi0JfQotICAgIH0KLSAgKnArKyA9ICcxJzsKLSAgKnArKyA9ICcwJzsKLSAgKmRzdCA9IHA7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZXN5bSAoZHN0LCBzeW0pCi0gICAgIGNoYXIgKipkc3Q7Ci0gICAgIENPTlNUIGNoYXIgKnN5bTsKLXsKLSAgY2hhciAqcCA9ICpkc3Q7Ci0gIGludCBsZW4gPSAoc3ltID8gc3RybGVuIChzeW0pIDogMCk7Ci0KLSAgaWYgKGxlbiA+PSAxNikKLSAgICB7Ci0gICAgICAqcCsrID0gJzAnOwotICAgICAgbGVuID0gMTY7Ci0gICAgfQotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGVuID09IDApCi0JewotCSAgKnArKyA9ICcxJzsKLQkgIHN5bSA9ICIkIjsKLQkgIGxlbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpwKysgPSBkaWdzW2xlbl07Ci0JfQotICAgIH0KLQotICB3aGlsZSAobGVuLS0pCi0gICAgewotICAgICAgKnArKyA9ICpzeW0rKzsKLSAgICB9Ci0gICpkc3QgPSBwOwotfQotCi1zdGF0aWMgdm9pZAotb3V0IChhYmZkLCB0eXBlLCBzdGFydCwgZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpzdGFydDsKLSAgICAgY2hhciAqZW5kOwotewotICBpbnQgc3VtID0gMDsKLSAgY2hhciAqczsKLSAgY2hhciBmcm9udFs2XTsKLSAgYmZkX3NpemVfdHlwZSB3cmxlbjsKLQotICBmcm9udFswXSA9ICclJzsKLSAgVE9IRVggKGZyb250ICsgMSwgZW5kIC0gc3RhcnQgKyA1KTsKLSAgZnJvbnRbM10gPSB0eXBlOwotCi0gIGZvciAocyA9IHN0YXJ0OyBzIDwgZW5kOyBzKyspCi0gICAgewotICAgICAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgKnNdOwotICAgIH0KLQotICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFsxXV07CS8qICBsZW5ndGggKi8KLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbMl1dOwotICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFszXV07CS8qIHR5cGUgKi8KLSAgVE9IRVggKGZyb250ICsgNCwgc3VtKTsKLSAgaWYgKGJmZF93cml0ZSAoZnJvbnQsIDEsIDYsIGFiZmQpICE9IDYpCi0gICAgYWJvcnQgKCk7Ci0gIGVuZFswXSA9ICdcbic7Ci0gIHdybGVuID0gZW5kIC0gc3RhcnQgKyAxOwotICBpZiAoYmZkX3dyaXRlIChzdGFydCwgMSwgd3JsZW4sIGFiZmQpICE9IHdybGVuKQotICAgIGFib3J0ICgpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgYnl0ZXNfd3JpdHRlbjsKLSAgY2hhciBidWZmZXJbMTAwXTsKLSAgYXN5bWJvbCAqKnA7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQ7Ci0KLSAgdGVraGV4X2luaXQgKCk7Ci0KLSAgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0KLSAgLyogQW5kIHRoZSByYXcgZGF0YSAqLwotICBmb3IgKGQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLSAgICAgICBkICE9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLSAgICAgICBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgbG93OwotCi0gICAgICBDT05TVCBpbnQgc3BhbiA9IDMyOwotICAgICAgaW50IGFkZHI7Ci0KLSAgICAgIC8qIFdyaXRlIGl0IGluIGJsb2NrcyBvZiAzMiBieXRlcyAqLwotCi0gICAgICBmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQ0hVTktfTUFTSyArIDE7IGFkZHIgKz0gc3BhbikKLQl7Ci0JICBpbnQgbmVlZCA9IDA7Ci0KLQkgIC8qIENoZWNrIHRvIHNlZSBpZiBuZWNlc3NhcnkgKi8KLQkgIGZvciAobG93ID0gMDsgIW5lZWQgJiYgbG93IDwgc3BhbjsgbG93KyspCi0JICAgIHsKLQkgICAgICBpZiAoZC0+Y2h1bmtfaW5pdFthZGRyICsgbG93XSkKLQkJbmVlZCA9IDE7Ci0JICAgIH0KLQkgIGlmIChuZWVkKQotCSAgICB7Ci0JICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOwotCi0JICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgYWRkciArIGQtPnZtYSk7Ci0JICAgICAgZm9yIChsb3cgPSAwOyBsb3cgPCBzcGFuOyBsb3crKykKLQkJewotCQkgIFRPSEVYIChkc3QsIGQtPmNodW5rX2RhdGFbYWRkciArIGxvd10pOwotCQkgIGRzdCArPSAyOwotCQl9Ci0JICAgICAgb3V0IChhYmZkLCAnNicsIGJ1ZmZlciwgZHN0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIHdyaXRlIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzIGZvciB0aGUgc2VjdGlvbnMgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPm5hbWUpOwotICAgICAgKmRzdCsrID0gJzEnOwotICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgcy0+dm1hKTsKLSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIHMtPnZtYSArIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBvdXQgKGFiZmQsICczJywgYnVmZmVyLCBkc3QpOwotICAgIH0KLQotICAvKiBBbmQgdGhlIHN5bWJvbHMgKi8KLSAgaWYgKGFiZmQtPm91dHN5bWJvbHMpCi0gICAgewotICAgICAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9sczsgKnA7IHArKykKLQl7Ci0JICBpbnQgc2VjdGlvbl9jb2RlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoKnApOwotCi0JICBpZiAoc2VjdGlvbl9jb2RlICE9ICc/JykKLQkgICAgewkJCS8qIGRvIG5vdCBpbmNsdWRlIGRlYnVnIHN5bWJvbHMgKi8KLQkgICAgICBhc3ltYm9sICpzID0gKnA7Ci0JICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOwotCi0JICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPnNlY3Rpb24tPm5hbWUpOwotCi0JICAgICAgc3dpdGNoIChzZWN0aW9uX2NvZGUpCi0JCXsKLQkJY2FzZSAnQSc6Ci0JCSAgKmRzdCsrID0gJzInOwotCQkgIGJyZWFrOwotCQljYXNlICdhJzoKLQkJICAqZHN0KysgPSAnNic7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0QnOgotCQljYXNlICdCJzoKLQkJY2FzZSAnTyc6Ci0JCSAgKmRzdCsrID0gJzQnOwotCQkgIGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAnYic6Ci0JCWNhc2UgJ28nOgotCQkgICpkc3QrKyA9ICc4JzsKLQkJICBicmVhazsKLQkJY2FzZSAnVCc6Ci0JCSAgKmRzdCsrID0gJzMnOwotCQkgIGJyZWFrOwotCQljYXNlICd0JzoKLQkJICAqZHN0KysgPSAnNyc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0MnOgotCQljYXNlICdVJzoKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5uYW1lKTsKLQkgICAgICB3cml0ZXZhbHVlICgmZHN0LCBzLT52YWx1ZSArIHMtPnNlY3Rpb24tPnZtYSk7Ci0JICAgICAgb3V0IChhYmZkLCAnMycsIGJ1ZmZlciwgZHN0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQW5kIHRoZSB0ZXJtaW5hdG9yICovCi0gIGlmIChiZmRfd3JpdGUgKCIlMDc4MTAxMFxuIiwgMSwgOSwgYWJmZCkgIT0gOSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXRla2hleF9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGV4ZWM7Ci0KLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB0ZWtoZXhfc3ltYm9sX3R5cGUgKm5ldyA9Ci0gICh0ZWtoZXhfc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QpKTsKLQotICBpZiAoIW5ldykKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5ldy0+cHJldiA9IChzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKikgTlVMTDsKLSAgcmV0dXJuICYobmV3LT5zeW1ib2wpOwotfQotCi1zdGF0aWMgdm9pZAotdGVraGV4X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi1zdGF0aWMgdm9pZAotdGVraGV4X3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0JYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCWZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JCSBzZWN0aW9uX25hbWUsCi0JCSBzeW1ib2wtPm5hbWUpOwotICAgICAgfQotICAgIH0KLX0KLQotI2RlZmluZQl0ZWtoZXhfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHRla2hleF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgdGVraGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSB0ZWtoZXhfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSB0ZWtoZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHRla2hleF9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSB0ZWtoZXhfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSB0ZWtoZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSB0ZWtoZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgdGVraGV4X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgdGVraGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgdGVraGV4X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgdGVraGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHRla2hleF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLSNkZWZpbmUgdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCB0ZWtoZXhfdmVjID0KLXsKLSAgInRla2hleCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChFWEVDX1AgfAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX1NZTVMgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1JFTE9DIHwgSEFTX0xPQ0FMUyB8Ci0gICBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgdGVraGV4X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHRla2hleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHRla2hleCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvdHJhZC1jb3JlLmMgYi9iZmQvdHJhZC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDkyMGIuLjAwMDAwMDAKLS0tIGEvYmZkL3RyYWQtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgdHJhZGl0aW9uYWwgVW5peCBjb3JlIGZpbGVzIChVLWFyZWEgYW5kIHJhdyBzZWN0aW9ucykKLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4JCS8qIEFmdGVyIGEub3V0LmggICovCi0KLSNpZmRlZiBUUkFEX0hFQURFUgotI2luY2x1ZGUgVFJBRF9IRUFERVIKLSNlbmRpZgotCi0gIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IAotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247Ci0gICAgICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKLSAgICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgICAgIHN0cnVjdCB1c2VyIHU7Ci0gICAgfTsKLQotI2RlZmluZSBjb3JlX3VwYWdlKGJmZCkgKCYoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51KSkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5yZWdfc2VjdGlvbikKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqdHJhZF91bml4X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY2hhciAqCQl0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWludAkJdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JCXRyYWRfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJCSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZAlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSGFuZGxlIDQuMi1zdHlsZSAoYW5kIHBlcmhhcHMgYWxzbyBzeXNWLXN0eWxlKSBjb3JlIGR1bXAgZmlsZS4gICovCi0KLS8qIEFSR1NVU0VEICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXRyYWRfdW5peF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotCi17Ci0gIGludCB2YWw7Ci0gIHN0cnVjdCB1c2VyIHU7Ci0gIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICpyYXdwdHI7Ci0KLSNpZmRlZiBUUkFEX0NPUkVfVVNFUl9PRkZTRVQKLSAgLyogSWYgZGVmaW5lZCwgdGhpcyBtYWNybyBpcyB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGUgdXNlciBzdHJ1Y3QuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIFRSQURfQ09SRV9VU0VSX09GRlNFVCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICAKLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnUsIDEsIHNpemVvZiB1LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgdSkKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayBwZXJoYXBzPz8/ICovCi0gIGlmICh1LnVfZHNpemUgPiAweDEwMDAwMDApCS8qIFJlbWVtYmVyLCBpdCdzIGluIHBhZ2VzLi4uICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmICh1LnVfc3NpemUgPiAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgc2l6ZSBjbGFpbWVkIGlzIG5vIGdyZWF0ZXIgdGhhbiB0aGUgZmlsZSBzaXplLiAgKi8KLSAgewotICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICBpZiAoTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUKLSNpZmRlZiBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKLQkJLSB1LnVfdHNpemUKLSNlbmRpZgotCQkrIHUudV9zc2l6ZSkgPiBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSNpZm5kZWYgVFJBRF9DT1JFX0FMTE9XX0FOWV9FWFRSQV9TSVpFCi0gICAgaWYgKE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplICsgdS51X3NzaXplKQotI2lmZGVmIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQKLQkvKiBTb21lIHN5c3RlbXMgd3JpdGUgdGhlIGZpbGUgdG9vIGJpZy4gICovCi0JKyBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECi0jZW5kaWYKLQk8IHN0YXRidWYuc3Rfc2l6ZSkKLSAgICAgIHsKLQkvKiBUaGUgZmlsZSBpcyB0b28gYmlnLiAgTWF5YmUgaXQncyBub3QgYSBjb3JlIGZpbGUKLQkgICBvciB3ZSBvdGhlcndpc2UgaGF2ZSBiYWQgdmFsdWVzIGZvciB1X2RzaXplIGFuZCB1X3NzaXplKS4gICovCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jZW5kaWYKLSAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJvdGggdGhlIHVwYWdlIGFuZCB0aGUgc3RydWN0IGNvcmVfZGF0YSBhdCBvbmNlLCBzbwotICAgICBhIHNpbmdsZSBmcmVlKCkgd2lsbCBmcmVlIHRoZW0gYm90aC4gICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfem1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YSA9IHJhd3B0cjsKLQotICByYXdwdHItPnUgPSB1OyAvKkNvcHkgdGhlIHVhcmVhIGludG8gdGhlIHRkYXRhIHBhcnQgb2YgdGhlIGJmZCAqLwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gZnJlZQotICAgICB0aGVtIHNlcGFyYXRlbHkuICAqLwotCi0gIGNvcmVfc3RhY2tzZWMoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9zdGFja3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX2RhdGFzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmFtZSA9ICIuc3RhY2siOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uYW1lID0gIi5kYXRhIjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9ICBOQlBHICogdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0gICAgLSBOQlBHICogdS51X3RzaXplCi0jZW5kaWYKLSAgICAgIDsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5CUEcgKiB1LnVfc3NpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gTkJQRyAqIFVQQUdFUzsgLyogTGFyZ2VyIHRoYW4gc2l6ZW9mIHN0cnVjdCB1ICovCi0KLSAgLyogV2hhdCBhIGhhY2suLi4gd2UnZCBsaWtlIHRvIHN0ZWFsIGl0IGZyb20gdGhlIGV4ZWMgZmlsZSwKLSAgICAgc2luY2UgdGhlIHVwYWdlIGRvZXMgbm90IHNlZW0gdG8gcHJvdmlkZSBpdC4gIEZJWE1FLiAgKi8KLSNpZmRlZiBIT1NUX0RBVEFfU1RBUlRfQUREUgotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBIT1NUX0RBVEFfU1RBUlRfQUREUjsKLSNlbHNlCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEhPU1RfVEVYVF9TVEFSVF9BRERSICsgKE5CUEcgKiB1LnVfdHNpemUpOwotI2VuZGlmCi0KLSNpZmRlZiBIT1NUX1NUQUNLX1NUQVJUX0FERFIKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IEhPU1RfU1RBQ0tfU1RBUlRfQUREUjsKLSNlbHNlCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1NUQUNLX0VORF9BRERSIC0gKE5CUEcgKiB1LnVfc3NpemUpOwotI2VuZGlmCi0KLSAgLyogVGhpcyBpcyB0cmlja3kuICBBcyB0aGUgInJlZ2lzdGVyIHNlY3Rpb24iLCB3ZSBnaXZlIHRoZW0gdGhlIGVudGlyZQotICAgICB1cGFnZSBhbmQgc3RhY2suICB1LnVfYXIwIHBvaW50cyB0byB3aGVyZSAicmVnaXN0ZXIgMCIgaXMgc3RvcmVkLgotICAgICBUaGVyZSBhcmUgdHdvIHRyaWNrcyB3aXRoIHRoaXMsIHRob3VnaC4gIE9uZSBpcyB0aGF0IHRoZSByZXN0IG9mIHRoZQotICAgICByZWdpc3RlcnMgbWlnaHQgYmUgYXQgcG9zaXRpdmUgb3IgbmVnYXRpdmUgKG9yIGJvdGgpIGRpc3BsYWNlbWVudHMKLSAgICAgZnJvbSAqdV9hcjAuICBUaGUgb3RoZXIgaXMgdGhhdCB1X2FyMCBpcyBzb21ldGltZXMgYW4gYWJzb2x1dGUgYWRkcmVzcwotICAgICBpbiBrZXJuZWwgbWVtb3J5LCBhbmQgb24gb3RoZXIgc3lzdGVtcyBpdCBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBgc3RydWN0IHVzZXInLgotICAgICAKLSAgICAgQXMgYSBwcmFjdGljYWwgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSByZWdpc3RlcnMgYWN0dWFsbHkgYXJlLAotICAgICBzbyB3ZSBoYXZlIHRvIHBhc3MgdGhlIHdob2xlIGFyZWEgdG8gR0RCLiAgV2UgZW5jb2RlIHRoZSB2YWx1ZSBvZiB1X2FyMAotICAgICBieSBzZXR0aW5nIHRoZSAucmVncyBzZWN0aW9uIHVwIHNvIHRoYXQgaXRzIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MKLSAgICAgMCBpcyBhdCB0aGUgcGxhY2UgcG9pbnRlZCB0byBieSB1X2FyMCAoYnkgc2V0dGluZyB0aGUgdm1hIG9mIHRoZSBzdGFydAotICAgICBvZiB0aGUgc2VjdGlvbiB0byAtdV9hcjApLiAgR0RCIHVzZXMgdGhpcyBpbmZvIHRvIGxvY2F0ZSB0aGUgcmVncywKLSAgICAgdXNpbmcgbWlub3IgdHJpY2tlcnkgdG8gZ2V0IGFyb3VuZCB0aGUgb2Zmc2V0LW9yLWFic29sdXRlLWFkZHIgcHJvYmxlbS4gKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwIC0gKGJmZF92bWEpIHUudV9hcjA7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5CUEcgKiBVUEFHRVM7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5maWxlcG9zID0gKE5CUEcgKiBVUEFHRVMpICsgTkJQRyAqIHUudV9kc2l6ZQotI2lmZGVmIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQotICAgIC0gTkJQRyAqIHUudV90c2l6ZQotI2VuZGlmCi0gICAgICA7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IDA7IC8qIFJlZ2lzdGVyIHNlZ21lbnQgaXMgdGhlIHVwYWdlICovCi0KLSAgLyogQWxpZ24gdG8gd29yZCBhdCBsZWFzdCAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9zdGFja3NlYyAoYWJmZCk7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9kYXRhc2VjIChhYmZkKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWNoYXIgKgotdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZm5kZWYgTk9fQ09SRV9DT01NQU5ECi0gIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotewotI2lmZGVmIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwKLSAgcmV0dXJuIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoaWdub3JlX2FiZmQpOwotI2Vsc2UKLSAgcmV0dXJuIC0xOwkJLyogRklYTUUsIHdoZXJlIGlzIGl0PyAqLwotI2VuZGlmCi19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi10cmFkX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgdHJhZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgdHJhZF91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodHJhZF91bml4KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvdmF4bmV0YnNkLmMgYi9iZmQvdmF4bmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzdkMDkuLjAwMDAwMDAKLS0tIGEvYmZkL3ZheG5ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvVkFYIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF92YXgKLSNkZWZpbmUJREVGQVVMVF9NSUQgCU1fVkFYX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQodmF4bmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXZheC1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC92ZXJzYWRvcy5jIGIvYmZkL3ZlcnNhZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkY2QxMDguLjAwMDAwMDAKLS0tIGEvYmZkL3ZlcnNhZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBWRVJTQWRvcy1FIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IDxzYWNAY3lnbnVzLmNvbT4uCi0KLSAgIFZlcnNhZG9zIGlzIGEgTW90b3JvbGEgdHJhZGVtYXJrLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gICBTVUJTRUNUSU9OCi0gICBWRVJTQWRvcy1FIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSBmb3JtYXQKLQotICAgREVTQ1JJUFRJT04KLQotICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgcmVhZGluZyBvZiBWRVJTQWRvcyByZWxvY2F0ZWFibGUKLSAgIG9iamVjdCBmaWxlcy4KLQotICAgQSBWRVJTQWRvcyBmaWxlIGxvb2tzIGxpa2UgY29udGFpbnMKLQotICAgbyBJbmRlbnRpZmljYXRpb24gUmVjb3JkCi0gICBvIEV4dGVybmFsIFN5bWJvbCBEZWZpbml0aW9uIFJlY29yZAotICAgbyBPYmplY3QgVGV4dCBSZWNyb2QKLSAgIG8gRW5kIFJlY29yZAotCi0KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLQotc3RhdGljIGJvb2xlYW4gdmVyc2Fkb3NfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHZlcnNhZG9zX3NjYW4gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp2ZXJzYWRvc19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotCi0KLSNkZWZpbmUgVkhFQURFUiAnMScKLSNkZWZpbmUgVkVTVERFRiAnMicKLSNkZWZpbmUgVk9UUiAnMycKLSNkZWZpbmUgVkVORCAnNCcKLQotCi0jZGVmaW5lIEVTX0JBU0UgMTcJCS8qIGZpcnN0IHN5bWJvbCBoYXMgZXNkaWQgMTcgKi8KLQotLyogUGVyIGZpbGUgdGFyZ2V0IGRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotCi0vKiBvbmUgZm9yIGVhY2ggc2VjdGlvbiAqLwotc3RydWN0IGVzZGlkCi0gIHsKLSAgICBhc2VjdGlvbiAqc2VjdGlvbjsJCS8qIHB0ciB0byBiZmQgdmVyc2lvbiAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwkvKiB1c2VkIHRvIGJ1aWxkIGltYWdlICovCi0gICAgaW50IHBjOwotICAgIGludCByZWxvY3M7CQkJLyogcmVsb2MgY291bnQsIHZhbGlkIGVuZCBvZiBwYXNzIDEgKi8KLSAgICBpbnQgZG9uZXJlbDsJCS8qIGhhdmUgcmVsb2NzIGJlZW4gdHJhbnNsYXRlZCAqLwotICB9OwotCi10eXBlZGVmIHN0cnVjdCB2ZXJzYWRvc19kYXRhX3N0cnVjdAotICB7Ci0gICAgaW50IGVzX2RvbmU7CQkvKiBjb3VudCBvZiBzeW1ib2wgaW5kZXgsIHN0YXJ0cyBhdCBFU19CQVNFICovCi0gICAgYXN5bWJvbCAqc3ltYm9sczsJCS8qIHBvaW50ZXIgdG8gbG9jYWwgc3ltYm9scyAqLwotICAgIGNoYXIgKnN0cmluZ3M7CQkvKiBzdHJpbmdzIG9mIGFsbCB0aGUgYWJvdmUgKi8KLSAgICBpbnQgc3RyaW5nbGVuOwkJLyogbGVuIG9mIHN0cmluZyB0YWJsZSAodmFsaWQgZW5kIG9mIHBhc3MxKSAqLwotICAgIGludCBuc2Vjc3ltczsJCS8qIG51bWJlciBvZiBzZWN0aW9ucyAqLwotCi0gICAgaW50IG5kZWZzOwkJCS8qIG51bWJlciBvZiBleHBvcnRlZCBzeW1ib2xzICh0aGV5IGRvbnQgZ2V0IGVzZGlkcykgKi8KLSAgICBpbnQgbnJlZnM7CQkJLyogbnVtYmVyIG9mIGltcG9ydGVkIHN5bWJvbHMgICh2YWxpZCBlbmQgb2YgcGFzczEpICovCi0KLSAgICBpbnQgcmVmX2lkeDsJCS8qIGN1cnJlbnQgcHJvY2Vzc2VkIHZhbHVlIG9mIHRoZSBhYm92ZSAqLwotICAgIGludCBkZWZfaWR4OwotCi0gICAgaW50IHBhc3NfMl9kb25lOwotCi0gICAgc3RydWN0IGVzZGlkIGVbMTZdOwkJLyogcGVyIHNlY3Rpb24gaW5mbyAqLwotICAgIGludCBhbGVydDsJCQkvKiB0byBzZWUgaWYgd2UncmUgdHJhbXBsaW5nICovCi0gICAgYXN5bWJvbCAqcmVzdFsyNTYgLSAxNl07CS8qIHBlciBzeW1ib2wgaW5mbyAqLwotCi0gIH0KLXRkYXRhX3R5cGU7Ci0KLSNkZWZpbmUgVkRBVEEoYWJmZCkgICAgICAgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEpCi0jZGVmaW5lIEVEQVRBKGFiZmQsIG4pICAgIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhLT5lW25dKQotI2RlZmluZSBSREFUQShhYmZkLCBuKSAgICAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YS0+cmVzdFtuXSkKLQotc3RydWN0IGV4dF9vdHIKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgICBjaGFyIHR5cGU7Ci0gICAgdW5zaWduZWQgY2hhciBtYXBbNF07Ci0gICAgdW5zaWduZWQgY2hhciBlc2RpZDsKLSAgICB1bnNpZ25lZCBjaGFyIGRhdGFbMjAwXTsKLSAgfTsKLQotc3RydWN0IGV4dF92aGVhZGVyCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gICAgY2hhciB0eXBlOwkJCS8qIHJlY29yZCB0eXBlICovCi0gICAgY2hhciBuYW1lWzEwXTsJCS8qIG1vZHVsZSBuYW1lICovCi0gICAgY2hhciByZXY7CQkJLyogbW9kdWxlIHJldiBudW1iZXIgKi8KLSAgICBjaGFyIGxhbmc7Ci0gICAgY2hhciB2b2xbNF07Ci0gICAgY2hhciB1c2VyWzJdOwotICAgIGNoYXIgY2F0WzhdOwotICAgIGNoYXIgZm5hbWVbOF07Ci0gICAgY2hhciBleHRbMl07Ci0gICAgY2hhciB0aW1lWzNdOwotICAgIGNoYXIgZGF0ZVszXTsKLSAgICBjaGFyIHJlc3RbMjExXTsKLSAgfTsKLQotc3RydWN0IGV4dF9lc2QKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgICBjaGFyIHR5cGU7Ci0gICAgdW5zaWduZWQgY2hhciBlc2RfZW50cmllc1sxXTsKLSAgfTsKLSNkZWZpbmUgRVNEX0FCUyAJMAotI2RlZmluZSBFU0RfQ09NTU9OIAkxCi0jZGVmaW5lIEVTRF9TVERfUkVMX1NFQyAyCi0jZGVmaW5lIEVTRF9TSFJUX1JFTF9TRUMgMwotI2RlZmluZSBFU0RfWERFRl9JTl9TRUMgNAotI2RlZmluZSBFU0RfWFJFRl9TWU0gICAgNwotI2RlZmluZSBFU0RfWFJFRl9TRUMJNgotI2RlZmluZSBFU0RfWERFRl9JTl9BQlMgNQotdW5pb24gZXh0X2FueQotICB7Ci0gICAgdW5zaWduZWQgY2hhciBzaXplOwotICAgIHN0cnVjdCBleHRfdmhlYWRlciBoZWFkZXI7Ci0gICAgc3RydWN0IGV4dF9lc2QgZXNkOwotICAgIHN0cnVjdCBleHRfb3RyIG90cjsKLSAgfTsKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gKi8KLQotCi0KLQotCi0vKiBTZXQgdXAgdGhlIHRkYXRhIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YSA9IHRkYXRhOwotICAgICAgdGRhdGEtPnN5bWJvbHMgPSBOVUxMOwotICAgICAgVkRBVEEgKGFiZmQpLT5hbGVydCA9IDB4MTIzNDU2Nzg7Ci0gICAgfQotCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX202OGssIDApOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIFMgcmVjb3JkIGZpbGUuICBGSVhNRTogVGhpcyBwcm9iYWJseSBzaG91bGQKLSAgIG5vdCBjYWxsIGZwcmludGYsIGJ1dCB3ZSByZWFsbHkgZG8gbmVlZCBzb21lIG1lY2hhbmlzbSBmb3IgcHJpbnRpbmcKLSAgIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotCi0KLXN0YXRpYyBhc3ltYm9sICoKLXZlcnNhZG9zX25ld19zeW1ib2wgKGFiZmQsIHNudW0sIG5hbWUsIHZhbCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzbnVtOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgYXN5bWJvbCAqbiA9IFZEQVRBIChhYmZkKS0+c3ltYm9scyArIHNudW07Ci0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT52YWx1ZSA9IHZhbDsKLSAgbi0+c2VjdGlvbiA9IHNlYzsKLSAgbi0+dGhlX2JmZCA9IGFiZmQ7Ci0gIG4tPmZsYWdzID0gMDsKLSAgcmV0dXJuIG47Ci19Ci0KLQotc3RhdGljIGludAotZ2V0X3JlY29yZCAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuaW9uIGV4dF9hbnkgKnB0cjsKLXsKLSAgYmZkX3JlYWQgKCZwdHItPnNpemUsIDEsIDEsIGFiZmQpOwotICBpZiAoYmZkX3JlYWQgKChjaGFyICopIHB0ciArIDEsIDEsIHB0ci0+c2l6ZSwgYWJmZCkgIT0gcHRyLT5zaXplKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1nZXRfNCAocHApCi0gICAgIHVuc2lnbmVkIGNoYXIgKipwcDsKLXsKLSAgdW5zaWduZWQgY2hhciAqcCA9ICpwcDsKLSAgKnBwICs9IDQ7Ci0gIHJldHVybiAocFswXSA8PCAyNCkgfCAocFsxXSA8PCAxNikgfCAocFsyXSA8PCA4KSB8IChwWzNdIDw8IDApOwotfQotCi12b2lkCi1nZXRfMTAgKHBwLCBuYW1lKQotICAgICB1bnNpZ25lZCBjaGFyICoqcHA7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKnAgPSAoY2hhciAqKSAqcHA7Ci0gIGludCBsZW4gPSAxMDsKLSAgKnBwICs9IGxlbjsKLSAgd2hpbGUgKCpwICE9ICcgJwotCSAmJiBsZW4pCi0gICAgewotICAgICAgKm5hbWUrKyA9ICpwKys7Ci0gICAgICBsZW4tLTsKLSAgICB9Ci0gICpuYW1lID0gMDsKLX0KLQotc3RhdGljIGNoYXIgKgotbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqbiA9IFZEQVRBIChhYmZkKS0+c3RyaW5nczsKLSAgc3RyY3B5IChWREFUQSAoYWJmZCktPnN0cmluZ3MsIG5hbWUpOwotICBWREFUQSAoYWJmZCktPnN0cmluZ3MgKz0gc3RybGVuIChWREFUQSAoYWJmZCktPnN0cmluZ3MpICsgMTsKLSAgcmV0dXJuIG47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZXNkIChhYmZkLCBlc2QsIHBhc3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dF9lc2QgKmVzZDsKLSAgICAgaW50IHBhc3M7Ci17Ci0gIC8qIFJlYWQgdGhyb3VnaCB0aGUgZXh0IGRlZiBmb3IgdGhlIGVzdCBlbnRyaWVzICovCi0gIGludCB0b2dvID0gZXNkLT5zaXplIC0gMjsKLSAgYmZkX3ZtYSBzaXplOwotICBiZmRfdm1hIHN0YXJ0OwotICBhc2VjdGlvbiAqc2VjOwotICBjaGFyIG5hbWVbMTFdOwotICB1bnNpZ25lZCBjaGFyICpwdHIgPSBlc2QtPmVzZF9lbnRyaWVzOwotICB1bnNpZ25lZCBjaGFyICplbmQgPSBwdHIgKyB0b2dvOwotICB3aGlsZSAocHRyIDwgZW5kKQotICAgIHsKLSAgICAgIGludCBzY24gPSAqcHRyICYgMHhmOwotICAgICAgaW50IHR5cCA9ICgqcHRyID4+IDQpICYgMHhmOwotCi0gICAgICAvKiBEZWNsYXJlIHRoaXMgc2VjdGlvbiAqLwotICAgICAgc3ByaW50ZiAobmFtZSwgIiVkIiwgc2NuKTsKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgc3RyZHVwIChuYW1lKSk7Ci0gICAgICBzZWMtPnRhcmdldF9pbmRleCA9IHNjbjsKLSAgICAgIEVEQVRBIChhYmZkLCBzY24pLnNlY3Rpb24gPSBzZWM7Ci0gICAgICBwdHIrKzsKLSAgICAgIHN3aXRjaCAodHlwKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBFU0RfWFJFRl9TRUM6Ci0JY2FzZSBFU0RfWFJFRl9TWU06Ci0JICB7Ci0JICAgIGludCBzbnVtID0gVkRBVEEgKGFiZmQpLT5yZWZfaWR4Kys7Ci0JICAgIGdldF8xMCAoJnB0ciwgbmFtZSk7Ci0JICAgIGlmIChwYXNzID09IDEpCi0JICAgICAgewotCQlWREFUQSAoYWJmZCktPnN0cmluZ2xlbiArPSBzdHJsZW4gKG5hbWUpICsgMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBlc2lkeDsKLQkJYXN5bWJvbCAqczsKLQkJY2hhciAqbiA9IG5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBuYW1lKTsKLQkJcyA9IHZlcnNhZG9zX25ld19zeW1ib2wgKGFiZmQsIHNudW0sIG4sIDAsCi0JCQkJCSAmYmZkX3VuZF9zZWN0aW9uLCBzY24pOwotCQllc2lkeCA9IFZEQVRBIChhYmZkKS0+ZXNfZG9uZSsrOwotCQlSREFUQSAoYWJmZCwgZXNpZHggLSBFU19CQVNFKSA9IHM7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQotCWNhc2UgRVNEX0FCUzoKLQkgIHNpemUgPSBnZXRfNCAoJnB0cik7Ci0JICBzdGFydCA9IGdldF80ICgmcHRyKTsKLQkgIGJyZWFrOwotCWNhc2UgRVNEX1NURF9SRUxfU0VDOgotCWNhc2UgRVNEX1NIUlRfUkVMX1NFQzoKLQkgIHsKLQkgICAgc2VjLT5fcmF3X3NpemUgPSBnZXRfNCAoJnB0cik7Ci0JICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBFU0RfWERFRl9JTl9BQlM6Ci0JICBzZWMgPSAoYXNlY3Rpb24gKikgJiBiZmRfYWJzX3NlY3Rpb247Ci0JY2FzZSBFU0RfWERFRl9JTl9TRUM6Ci0JICB7Ci0JICAgIGludCBzbnVtID0gVkRBVEEgKGFiZmQpLT5kZWZfaWR4Kys7Ci0JICAgIGxvbmcgdmFsOwotCSAgICBnZXRfMTAgKCZwdHIsIG5hbWUpOwotCSAgICB2YWwgPSBnZXRfNCAoJnB0cik7Ci0JICAgIGlmIChwYXNzID09IDEpCi0JICAgICAgewotCQkvKiBKdXN0IHJlbWVtYmVyIHRoZSBzeW1ib2wgKi8KLQkJVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4gKz0gc3RybGVuIChuYW1lKSArIDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlhc3ltYm9sICpzOwotCQljaGFyICpuID0gbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIG5hbWUpOwotCQlzID0gdmVyc2Fkb3NfbmV3X3N5bWJvbCAoYWJmZCwgc251bSArIFZEQVRBIChhYmZkKS0+bnJlZnMsIG4sIHZhbCwgc2VjLCBzY24pOwotCQlzLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNkZWZpbmUgUl9SRUxXT1JEIDEKLSNkZWZpbmUgUl9SRUxMT05HIDIKLSNkZWZpbmUgUl9SRUxXT1JEX05FRyAzCi0jZGVmaW5lIFJfUkVMTE9OR19ORUcgNAotCi1yZWxvY19ob3d0b190eXBlIHZlcnNhZG9zX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9SRUxXT1JELCAwLCAxLCAxNiwgZmFsc2UsCi0JIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JICIrdjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9SRUxMT05HLCAwLCAyLCAzMiwgZmFsc2UsCi0JIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JICIrdjMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX1JFTFdPUkRfTkVHLCAwLCAtMSwgMTYsIGZhbHNlLAotCSAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSAiLXYxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMTE9OR19ORUcsIDAsIC0yLCAzMiwgZmFsc2UsCi0JIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JICItdjMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotCi1zdGF0aWMgaW50Ci1nZXRfb2Zmc2V0IChsZW4sIHB0cikKLSAgICAgaW50IGxlbjsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICBpbnQgdmFsID0gMDsKLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHZhbCA9ICpwdHIrKzsKLSAgICAgIGlmICh2YWwgJiAweDgwKQotCXZhbCB8PSB+MHhmZjsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykKLQl2YWwgPSAodmFsIDw8IDgpIHwgKnB0cisrOwotICAgIH0KLQotICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19vdHIgKGFiZmQsIG90ciwgcGFzcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0X290ciAqb3RyOwotICAgICBpbnQgcGFzczsKLXsKLSAgdW5zaWduZWQgbG9uZyBzaGlmdDsKLSAgdW5zaWduZWQgY2hhciAqc3JjcCA9IG90ci0+ZGF0YTsKLSAgdW5zaWduZWQgY2hhciAqZW5kcCA9ICh1bnNpZ25lZCBjaGFyICopIG90ciArIG90ci0+c2l6ZTsKLSAgdW5zaWduZWQgaW50IGJpdHMgPSAob3RyLT5tYXBbMF0gPDwgMjQpCi0gIHwgKG90ci0+bWFwWzFdIDw8IDE2KQotICB8IChvdHItPm1hcFsyXSA8PCA4KQotICB8IChvdHItPm1hcFszXSA8PCAwKTsKLQotICBzdHJ1Y3QgZXNkaWQgKmVzZGlkID0gJkVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSk7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzID0gZXNkaWQtPmNvbnRlbnRzOwotICBpbnQgbmVlZF9jb250ZW50cyA9IDA7Ci0gIHVuc2lnbmVkIGludCBkc3RfaWR4ID0gZXNkaWQtPnBjOwotCi0gIGZvciAoc2hpZnQgPSAoMSA8PCAzMSk7IHNoaWZ0ICYmIHNyY3AgPCBlbmRwOyBzaGlmdCA+Pj0gMSkKLSAgICB7Ci0gICAgICBpZiAoYml0cyAmIHNoaWZ0KQotCXsKLQkgIGludCBmbGFnID0gKnNyY3ArKzsKLQkgIGludCBlc2RpZHMgPSAoZmxhZyA+PiA1KSAmIDB4NzsKLQkgIGludCBzaXplaW53b3JkcyA9ICgoZmxhZyA+PiAzKSAmIDEpID8gMiA6IDE7Ci0JICBpbnQgb2Zmc2V0bGVuID0gZmxhZyAmIDB4NzsKLQkgIGludCBqOwotCi0KLQkgIGlmIChlc2RpZHMgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEEgemVybyBlc2RpZCBtZWFucyB0aGUgbmV3IHBjIGlzIHRoZSBvZmZzZXQgZ2l2ZW4gKi8KLQkgICAgICBkc3RfaWR4ICs9IGdldF9vZmZzZXQgKG9mZnNldGxlbiwgc3JjcCk7Ci0JICAgICAgc3JjcCArPSBvZmZzZXRsZW47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCB2YWwgPSBnZXRfb2Zmc2V0IChvZmZzZXRsZW4sIHNyY3AgKyBlc2RpZHMpOwotCSAgICAgIGlmIChwYXNzID09IDEpCi0JCW5lZWRfY29udGVudHMgPSAxOwotCSAgICAgIGVsc2UKLQkJZm9yIChqID0gMDsgaiA8IHNpemVpbndvcmRzICogMjsgaisrKQotCQkgIHsKLQkJICAgIGNvbnRlbnRzW2RzdF9pZHggKyAoc2l6ZWlud29yZHMgKiAyKSAtIGogLSAxXSA9IHZhbDsKLQkJICAgIHZhbCA+Pj0gODsKLQkJICB9Ci0KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgZXNkaWRzOyBqKyspCi0JCXsKLQkJICBpbnQgZXNkaWQgPSAqc3JjcCsrOwotCi0JCSAgaWYgKGVzZGlkKQotCQkgICAgewotCQkgICAgICBpbnQgcm4gPSBFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpLnJlbG9jcysrOwotCQkgICAgICBpZiAocGFzcyA9PSAxKQotCQkJewotCQkJICAvKiB0aGlzIGlzIHRoZSBmaXJzdCBwYXNzIG92ZXIgdGhlIGRhdGEsIAotCQkJICAgICBqdXN0IHJlbWVtYmVyIHRoYXQgd2UgbmVlZCBhIHJlbG9jICovCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXJlbGVudCAqbiA9Ci0JCQkgIEVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSkuc2VjdGlvbi0+cmVsb2NhdGlvbiArIHJuOwotCQkJICBuLT5hZGRyZXNzID0gZHN0X2lkeDsKLQotCQkJICBuLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBlc2RpZDsKLQkJCSAgbi0+YWRkZW5kID0gMDsKLQkJCSAgbi0+aG93dG8gPSB2ZXJzYWRvc19ob3d0b190YWJsZSArICgoaiAmIDEpICogMikgKyAoc2l6ZWlud29yZHMgLSAxKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIHNyY3AgKz0gb2Zmc2V0bGVuOwotCSAgICAgIGRzdF9pZHggKz0gc2l6ZWlud29yZHMgKiAyOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5lZWRfY29udGVudHMgPSAxOwotCSAgaWYgKGRzdF9pZHggPCBlc2RpZC0+c2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICBpZiAocGFzcyA9PSAyKQotCSAgICAgIHsKLQkJLyogYWJzb2x1dGUgY29kZSwgY29tZXMgaW4gMTYgYml0IGx1bXBzICovCi0JCWNvbnRlbnRzW2RzdF9pZHhdID0gc3JjcFswXTsKLQkJY29udGVudHNbZHN0X2lkeCArIDFdID0gc3JjcFsxXTsKLQkgICAgICB9Ci0JICBkc3RfaWR4ICs9IDI7Ci0JICBzcmNwICs9IDI7Ci0JfQotICAgIH0KLSAgRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKS5wYyA9IGRzdF9pZHg7Ci0KLSAgaWYgKCFjb250ZW50cyAmJiBuZWVkX2NvbnRlbnRzKQotICAgIGVzZGlkLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgZXNkaWQtPnNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQotfQotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3Nfc2NhbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbG9vcCA9IDE7Ci0gIGludCBpOwotICBpbnQgajsKLSAgaW50IG5zZWNzID0gMDsKLQotICBWREFUQSAoYWJmZCktPm5yZWZzID0gMDsKLSAgVkRBVEEgKGFiZmQpLT5uZGVmcyA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+cmVmX2lkeCA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+ZGVmX2lkeCA9IDA7Ci0KLSAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgdW5pb24gZXh0X2FueSBhbnk7Ci0gICAgICBpZiAoIWdldF9yZWNvcmQgKGFiZmQsICZhbnkpKQotCXJldHVybiB0cnVlOwotICAgICAgc3dpdGNoIChhbnkuaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgVkhFQURFUjoKLQkgIGJyZWFrOwotCWNhc2UgVkVORDoKLQkgIGxvb3AgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBWRVNUREVGOgotCSAgcHJvY2Vzc19lc2QgKGFiZmQsICZhbnkuZXNkLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgVk9UUjoKLQkgIHByb2Nlc3Nfb3RyIChhYmZkLCAmYW55Lm90ciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlbG9jcyBhbmQgc2VjdGlvbnMgKi8KLQotICBWREFUQSAoYWJmZCktPm5yZWZzID0gVkRBVEEgKGFiZmQpLT5yZWZfaWR4OwotICBWREFUQSAoYWJmZCktPm5kZWZzID0gVkRBVEEgKGFiZmQpLT5kZWZfaWR4OwotICBWREFUQSAoYWJmZCktPnJlZl9pZHggPSAwOwotICBWREFUQSAoYWJmZCktPmRlZl9pZHggPSAwOwotCi0gIGFiZmQtPnN5bWNvdW50ID0gVkRBVEEgKGFiZmQpLT5ucmVmcyArIFZEQVRBIChhYmZkKS0+bmRlZnM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGVzZGlkICplc2RpZCA9ICZFREFUQSAoYWJmZCwgaSk7Ci0gICAgICBpZiAoZXNkaWQtPnNlY3Rpb24pCi0JewotCSAgZXNkaWQtPnNlY3Rpb24tPnJlbG9jYXRpb24KLQkgICAgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXJlbGVudCkgKiBlc2RpZC0+cmVsb2NzKTsKLQotCSAgZXNkaWQtPnBjID0gMDsKLQotCSAgaWYgKGVzZGlkLT5jb250ZW50cykKLQkgICAgZXNkaWQtPnNlY3Rpb24tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRDsKLQotCSAgZXNkaWQtPnNlY3Rpb24tPnJlbG9jX2NvdW50ID0gZXNkaWQtPnJlbG9jczsKLQkgIGlmIChlc2RpZC0+cmVsb2NzKQotCSAgICBlc2RpZC0+c2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCi0JICBlc2RpZC0+cmVsb2NzID0gMDsKLQotCSAgLyogQWRkIGFuIGVudHJ5IGludG8gdGhlIHN5bWJvbCB0YWJsZSBmb3IgaXQgKi8KLQkgIG5zZWNzKys7Ci0JICBWREFUQSAoYWJmZCktPnN0cmluZ2xlbiArPSBzdHJsZW4gKGVzZGlkLT5zZWN0aW9uLT5uYW1lKSArIDE7Ci0JfQotICAgIH0KLQotICBhYmZkLT5zeW1jb3VudCArPSBuc2VjczsKLQotICBWREFUQSAoYWJmZCktPnN5bWJvbHMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICAgIHNpemVvZiAoYXN5bWJvbCkgKiAoYWJmZC0+c3ltY291bnQpKTsKLQotICBWREFUQSAoYWJmZCktPnN0cmluZ3MgPSBiZmRfYWxsb2MgKGFiZmQsIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuKTsKLQotICBpZiAoKFZEQVRBIChhYmZkKS0+c3ltYm9scyA9PSBOVUxMICYmIGFiZmQtPnN5bWNvdW50ID4gMCkKLSAgICAgIHx8IChWREFUQSAoYWJmZCktPnN0cmluZ3MgPT0gTlVMTCAmJiBWREFUQSAoYWJmZCktPnN0cmluZ2xlbiA+IDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBY3R1YWxseSBmaWxsIGluIHRoZSBzZWN0aW9uIHN5bWJvbHMsCi0gICAgIHdlIHN0aWNrIHRoZW0gYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUgKi8KLQotICBmb3IgKGogPSBWREFUQSAoYWJmZCktPm5yZWZzICsgVkRBVEEgKGFiZmQpLT5uZGVmcywgaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlc2RpZCAqZXNkaWQgPSAmRURBVEEgKGFiZmQsIGkpOwotICAgICAgYXNlY3Rpb24gKnNlYyA9IGVzZGlkLT5zZWN0aW9uOwotICAgICAgaWYgKHNlYykKLQl7Ci0JICBhc3ltYm9sICpzID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzICsgajsKLQkgIHMtPm5hbWUgPSBuZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgc2VjLT5uYW1lKTsKLQkgIHMtPnNlY3Rpb24gPSBzZWM7Ci0JICBzLT5mbGFncyA9IEJTRl9MT0NBTDsKLQkgIHMtPnZhbHVlID0gMDsKLQkgIHMtPnRoZV9iZmQgPSBhYmZkOwotCSAgaisrOwotCX0KLSAgICB9Ci0gIGlmIChhYmZkLT5zeW1jb3VudCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICAvKiBTZXQgdGhpcyB0byBuc2VjcyAtIHNpbmNlIHdlJ3ZlIGFscmVhZHkgcGxhbnRlZCB0aGUgc2VjdGlvbgotICAgICBzeW1ib2xzICovCi0gIFZEQVRBIChhYmZkKS0+bnNlY3N5bXMgPSBuc2VjczsKLQotICBWREFUQSAoYWJmZCktPnJlZl9pZHggPSAwOwotCi0gIHJldHVybiAxOwotfQotCi0KLQotLyogQ2hlY2sgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIGlzIGEgdmVyc2Fkb3MgIGZpbGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi12ZXJzYWRvc19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0X3ZoZWFkZXIgZXh0OwotICB1bnNpZ25lZCBjaGFyIGxlbjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9yZWFkICgmbGVuLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKCZleHQudHlwZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGd1ZXNzIHRoYXQgdGhlIGxhbmd1YWdlIGZpZWxkIHdpbGwgbmV2ZXIgYmUgbGFyZ2VyIHRoYW4gMTAuCi0gICAgIEluIHNhbXBsZSBmaWxlcywgaXQgaXMgYWx3YXlzIGVpdGhlciAwIG9yIDEuICBDaGVja2luZyBmb3IgdGhpcwotICAgICBwcmV2ZW50cyBjb25mdXNpb24gd2l0aCBJbnRlbCBIZXggZmlsZXMuICAqLwotICBpZiAoZXh0LnR5cGUgIT0gVkhFQURFUgotICAgICAgfHwgZXh0LmxhbmcgPiAxMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgbG9va3MgbGlrZSBhIHJlY29yZCwgYnVpbGQgdGhlIHRkYXRhIGFuZCByZWFkIGluLiAgKi8KLQotICBpZiAoIXZlcnNhZG9zX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgIXZlcnNhZG9zX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19wYXNzXzIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5pb24gZXh0X2FueSBhbnk7Ci0KLSAgaWYgKFZEQVRBIChhYmZkKS0+cGFzc18yX2RvbmUpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBWREFUQSAoYWJmZCktPmVzX2RvbmUgPSBFU19CQVNFOwotCi0KLSAgLyogcmVhZCByZWNvcmRzIHRpbGwgd2UgZ2V0IHRvIHdoZXJlIHdlIHdhbnQgdG8gYmUgKi8KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBnZXRfcmVjb3JkIChhYmZkLCAmYW55KTsKLSAgICAgIHN3aXRjaCAoYW55LmhlYWRlci50eXBlKQotCXsKLQljYXNlIFZFTkQ6Ci0JICBWREFUQSAoYWJmZCktPnBhc3NfMl9kb25lID0gMTsKLQkgIHJldHVybiAxOwotCWNhc2UgVkVTVERFRjoKLQkgIHByb2Nlc3NfZXNkIChhYmZkLCAmYW55LmVzZCwgMik7Ci0JICBicmVhazsKLQljYXNlIFZPVFI6Ci0JICBwcm9jZXNzX290ciAoYWJmZCwgJmFueS5vdHIsIDIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmICghdmVyc2Fkb3NfcGFzc18yIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbWVtY3B5IChsb2NhdGlvbiwKLQkgIEVEQVRBIChhYmZkLCBzZWN0aW9uLT50YXJnZXRfaW5kZXgpLmNvbnRlbnRzICsgb2Zmc2V0LAotCSAgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIHZlcnNhZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvOwotewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGludAotdmVyc2Fkb3Nfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotdmVyc2Fkb3NfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotdmVyc2Fkb3NfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXZlcnNhZG9zX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGFzeW1ib2wgKnM7Ci0KLSAgdmVyc2Fkb3NfcGFzc18yIChhYmZkKTsKLQotICBmb3IgKGkgPSAwLCBzID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzOwotICAgICAgIGkgPCBzeW1jb3VudDsKLSAgICAgICBzKyssIGkrKykKLSAgICB7Ci0gICAgICAqYWxvY2F0aW9uKysgPSBzOwotICAgIH0KLQotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLS8qQVJHU1VTRUQgKi8KLXZvaWQKLXZlcnNhZG9zX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi12ZXJzYWRvc19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JICAgICAgIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwKLQkgICAgICAgc3ltYm9sLT5uYW1lKTsKLQotICAgIH0KLX0KLQotbG9uZwotdmVyc2Fkb3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0KLWxvbmcKLXZlcnNhZG9zX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYXJlbGVudCAqc3JjOwotCi0gIHZlcnNhZG9zX3Bhc3NfMiAoYWJmZCk7Ci0gIHNyYyA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIGlmICghRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuZG9uZXJlbCkKLSAgICB7Ci0gICAgICBFREFUQSAoYWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4KS5kb25lcmVsID0gMTsKLSAgICAgIC8qIHRyYW5zbGF0ZSBmcm9tIGluZGV4ZXMgdG8gc3ltcHRyIHB0cnMgKi8KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgIGludCBlc2RpZCA9IChpbnQpIHNyY1tjb3VudF0uc3ltX3B0cl9wdHI7Ci0KLQkgIGlmIChlc2RpZCA9PSAwKQotCSAgICB7Ci0JICAgICAgc3JjW2NvdW50XS5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbi5zeW1ib2xfcHRyX3B0cjsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXNkaWQgPCBFU19CQVNFKQkvKiBTZWN0aW9uIHJlbGF0aXZlIHRoaW5nICovCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZXNkaWQgKmUgPSAmRURBVEEgKGFiZmQsIGVzZGlkIC0gMSk7Ci0JICAgICAgaWYgKCFzZWN0aW9uKQotCQl7Ci0JCSAvKiogcmVsb2NhdGlvbiByZWxhdGl2ZSB0byBzZWN0aW9uIHdoaWNoIHdhcwotCQkgICBuZXZlciBkZWNsYXJlZCAhICovCi0JCX0KLQkgICAgICBzcmNbY291bnRdLnN5bV9wdHJfcHRyID0gZS0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNyY1tjb3VudF0uc3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgZXNkaWQgLSBFU19CQVNFOwotCSAgICB9Ci0KLQl9Ci0gICAgfQotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgICpyZWxwdHIrKyA9IHNyYysrOwotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2RlZmluZQl2ZXJzYWRvc19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIHZlcnNhZG9zX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSB2ZXJzYWRvc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHZlcnNhZG9zX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSB2ZXJzYWRvc19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSB2ZXJzYWRvc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHZlcnNhZG9zX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgdmVyc2Fkb3NfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgdmVyc2Fkb3Nfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSB2ZXJzYWRvc19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSB2ZXJzYWRvc19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWMgPQotewotICAidmVyc2Fkb3MiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHZlcnNhZG9zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHZlcnNhZG9zX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy1nc2QuYyBiL2JmZC92bXMtZ3NkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTI0NjIuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy1nc2QuYworKysgL2Rldi9udWxsCkBAIC0xLDkyMCArMCwwIEBACi0vKiB2bXMtZ3NkLmMgLS0gQkZEIGJhY2stZW5kIGZvciBWQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEluYy4KLQotICAgZ28gYW5kIHJlYWQgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAoZXNwLiBhcHBlbmRpeCBCKQotICAgaWYgeW91IGRvbid0IGtub3cgd2hhdCdzIGdvaW5nIG9uIGhlcmUgOi0pCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogdHlwaWNhbCBzZWN0aW9ucyBmb3IgdmF4IG9iamVjdCBmaWxlcyAgKi8KLQotI2RlZmluZSBWQVhfQ09ERV9OQU1FCQkiJENPREUiCi0jZGVmaW5lIFZBWF9EQVRBX05BTUUJCSIkREFUQSIKLSNkZWZpbmUgVkFYX0FERFJFU1NfREFUQV9OQU1FCSIkQUREUkVTU19EQVRBIgotCi0vKiB0eXBpY2FsIHNlY3Rpb25zIGZvciBldmF4IG9iamVjdCBmaWxlcyAgKi8KLQotI2RlZmluZSBFVkFYX0FCU19OQU1FCQkiJEFCUyQiCi0jZGVmaW5lIEVWQVhfQ09ERV9OQU1FCQkiJENPREUkIgotI2RlZmluZSBFVkFYX0xJTktfTkFNRQkJIiRMSU5LJCIKLSNkZWZpbmUgRVZBWF9EQVRBX05BTUUJCSIkREFUQSQiCi0jZGVmaW5lIEVWQVhfQlNTX05BTUUJCSIkQlNTJCIKLSNkZWZpbmUgRVZBWF9SRUFET05MWUFERFJfTkFNRQkiJFJFQURPTkxZX0FERFIkIgotI2RlZmluZSBFVkFYX1JFQURPTkxZX05BTUUJIiRSRUFET05MWSQiCi0jZGVmaW5lIEVWQVhfTElURVJBTF9OQU1FCSIkTElURVJBTCQiCi0jZGVmaW5lIEVWQVhfQ09NTU9OX05BTUUJIiRDT01NT04kIgotI2RlZmluZSBFVkFYX0xPQ0FMX05BTUUJCSIkTE9DQUwkIgotCi1zdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7CQkJLyogbmFtZSBvZiBzZWN0aW9uICovCi0gIGludCB2ZmxhZ3NfYWx3YXlzOwotICBmbGFnd29yZCBmbGFnc19hbHdheXM7CS8qIGZsYWdzIHdlIHNldCBhbHdheXMgKi8KLSAgaW50IHZmbGFnc19oYXNzaXplOwotICBmbGFnd29yZCBmbGFnc19oYXNzaXplOwkvKiBmbGFncyB3ZSBzZXQgaWYgdGhlIHNlY3Rpb24gaGFzIGEgc2l6ZSA+IDAgKi8KLX07Ci0KLS8qIFRoZXNlIGZsYWdzIGFyZSBkZWNjcnRsL3ZheGNydGwgKG9wZW5WTVMgNi4yIFZBWCkgY29tcGF0aWJsZSAgKi8KLQotc3RhdGljIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0IHZheF9zZWN0aW9uX2ZsYWdzW10gPSB7Ci0gIHsgVkFYX0NPREVfTkFNRSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9TSFJ8R1BTX1NfTV9FWEV8R1BTX1NfTV9SRCksCi0JKFNFQ19DT0RFKSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9TSFJ8R1BTX1NfTV9FWEV8R1BTX1NfTV9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0NPREV8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgVkFYX0RBVEFfTkFNRSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCksCi0JKFNFQ19EQVRBKSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgVkFYX0FERFJFU1NfREFUQV9OQU1FLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IE5VTEwsCi0JKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfREFUQSksCi0JKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9Ci19OwotCi0KLS8qIFRoZXNlIGZsYWdzIGFyZSBkZWNjcnRsL3ZheGNydGwgKG9wZW5WTVMgNi4yIEFscGhhKSBjb21wYXRpYmxlICAqLwotCi1zdGF0aWMgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgZXZheF9zZWN0aW9uX2ZsYWdzW10gPSB7Ci0gIHsgRVZBWF9BQlNfTkFNRSwKLQkoRUdQU19TX1ZfU0hSKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9TSFIpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfQ09ERV9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9FWEUpLAotCShTRUNfQ09ERSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX0VYRSksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0NPREV8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9MSVRFUkFMX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0xJTktfTkFNRSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9EQVRBX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfQlNTX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfTk9fRkxBR1MpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX1JFQURPTkxZQUREUl9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfUkVBRE9OTFlfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfTE9DQUxfTkFNRSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgTlVMTCwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0KLX07Ci0KLS8qIFJldHJpZXZlIGJmZCBzZWN0aW9uIGZsYWdzIGJ5IG5hbWUgYW5kIHNpemUgICovCi0KLXN0YXRpYyBmbGFnd29yZAotdm1zX3NlY2ZsYWdfYnlfbmFtZSAoYWJmZCwgc2VjdGlvbl9mbGFncywgbmFtZSwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCAqc2VjdGlvbl9mbGFnczsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpID0gMDsKLQotICB3aGlsZSAoc2VjdGlvbl9mbGFnc1tpXS5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKChQUklWKGlzX3ZheCk/Ci0JICAgIHN0cmNhc2VjbXAgKG5hbWUsIHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSk6Ci0JICAgIHN0cmNtcCAobmFtZSwgc2VjdGlvbl9mbGFnc1tpXS5uYW1lKSkgPT0gMCkKLQl7Ci0JICBpZiAoc2l6ZSA+IDApCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2hhc3NpemU7Ci0JICBlbHNlCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2Fsd2F5czsKLQl9Ci0gICAgICBpKys7Ci0gICAgfQotICBpZiAoc2l6ZSA+IDApCi0gICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0uZmxhZ3NfaGFzc2l6ZTsKLSAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0uZmxhZ3NfYWx3YXlzOwotfQotCi0KLS8qIFJldHJpZXZlIHZtcyBzZWN0aW9uIGZsYWdzIGJ5IG5hbWUgYW5kIHNpemUgICovCi0KLXN0YXRpYyBmbGFnd29yZAotdm1zX2VzZWNmbGFnX2J5X25hbWUgKHNlY3Rpb25fZmxhZ3MsIG5hbWUsIHNpemUpCi0gICAgIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0ICpzZWN0aW9uX2ZsYWdzOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGkgPSAwOwotCi0gIHdoaWxlIChzZWN0aW9uX2ZsYWdzW2ldLm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBzZWN0aW9uX2ZsYWdzW2ldLm5hbWUpID09IDApCi0JewotCSAgaWYgKHNpemUgPiAwKQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfaGFzc2l6ZTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2Fsd2F5czsKLQl9Ci0gICAgICBpKys7Ci0gICAgfQotICBpZiAoc2l6ZSA+IDApCi0gICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2hhc3NpemU7Ci0gIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19hbHdheXM7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIFZNU19ERUJVRwotLyogZGVidWcgKi8KLQotc3RydWN0IGZsYWdkZXNjc3RydWN0IHsgY2hhciAqbmFtZTsgZmxhZ3dvcmQgdmFsdWU7IH07Ci0KLS8qIENvbnZlcnQgZmxhZyB0byBwcmludGFibGUgc3RyaW5nICAqLwotCi1zdGF0aWMgY2hhciAqCi1mbGFnMnN0cihmbGFnZGVzYywgZmxhZ3MpCi0gICAgIHN0cnVjdCBmbGFnZGVzY3N0cnVjdCAqZmxhZ2Rlc2M7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotCi0gIHN0YXRpYyBjaGFyIHJlc1s2NF07Ci0gIGludCBuZXh0ID0gMDsKLQotICByZXNbMF0gPSAwOwotICB3aGlsZSAoZmxhZ2Rlc2MtPm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzICYgZmxhZ2Rlc2MtPnZhbHVlKSAhPSAwKQotCXsKLQkgIGlmIChuZXh0KQotCSAgICBzdHJjYXQocmVzLCAiLCIpOwotCSAgZWxzZQotCSAgICBuZXh0ID0gMTsKLQkgIHN0cmNhdCAocmVzLCBmbGFnZGVzYy0+bmFtZSk7Ci0JfQotICAgICAgZmxhZ2Rlc2MrKzsKLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBpbnB1dCByb3V0aW5lcyAqLwotCi0vKiBQcm9jZXNzIEdTRC9FR1NEIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfZ3NkIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICBzdGF0aWMgc3RydWN0IGZsYWdkZXNjc3RydWN0IGdwc2ZsYWdkZXNjW10gPQotICB7Ci0gICAgeyAiUElDIiwgMHgwMDAxIH0sCi0gICAgeyAiTElCIiwgMHgwMDAyIH0sCi0gICAgeyAiT1ZSIiwgMHgwMDA0IH0sCi0gICAgeyAiUkVMIiwgMHgwMDA4IH0sCi0gICAgeyAiR0JMIiwgMHgwMDEwIH0sCi0gICAgeyAiU0hSIiwgMHgwMDIwIH0sCi0gICAgeyAiRVhFIiwgMHgwMDQwIH0sCi0gICAgeyAiUkQiLCAgMHgwMDgwIH0sCi0gICAgeyAiV1JUIiwgMHgwMTAwIH0sCi0gICAgeyAiVkVDIiwgMHgwMjAwIH0sCi0gICAgeyAiTk9NT0QiLCAweDA0MDAgfSwKLSAgICB7ICJDT00iLCAweDA4MDAgfSwKLSAgICB7IE5VTEwsIDAgfQotICB9OwotCi0gIHN0YXRpYyBzdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgZ3N5ZmxhZ2Rlc2NbXSA9Ci0gIHsKLSAgICB7ICJXRUFLIiwgMHgwMDAxIH0sCi0gICAgeyAiREVGIiwgIDB4MDAwMiB9LAotICAgIHsgIlVOSSIsICAweDAwMDQgfSwKLSAgICB7ICJSRUwiLCAgMHgwMDA4IH0sCi0gICAgeyAiQ09NTSIsIDB4MDAxMCB9LAotICAgIHsgIlZFQ0VQIiwgMHgwMDIwIH0sCi0gICAgeyAiTk9STSIsIDB4MDA0MCB9LAotICAgIHsgTlVMTCwgMCB9Ci0gIH07Ci0jZW5kaWYKLQotICBpbnQgZ3NkX3R5cGUsIGdzZF9zaXplOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzLCBvbGRfZmxhZ3M7Ci0gIGNoYXIgKm5hbWU7Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0gIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOwotICB1bnNpZ25lZCBsb25nIGFsaWduX2FkZHI7Ci0gIHN0YXRpYyBpbnQgcHNlY3RfaWR4ID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJHU0QvRUdTRCAoJWQvJXgpXG4iLCBvYmp0eXBlLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAob2JqdHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIEVPQkpfU19DX0VHU0Q6Ci0gCVBSSVYodm1zX3JlYykgKz0gODsJLyogc2tpcCB0eXBlLCBzaXplLCBsX3RlbXAgKi8KLQlQUklWKHJlY19zaXplKSAtPSA4OwotCWJyZWFrOwotICAgICAgY2FzZSBPQkpfU19DX0dTRDoKLQlQUklWKHZtc19yZWMpICs9IDE7Ci0JUFJJVihyZWNfc2l6ZSkgLT0gMTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBjYWxjdWxhdGUgYmFzZSBhZGRyZXNzIGZvciBlYWNoIHNlY3Rpb24gICovCi0gIGJhc2VfYWRkciA9IDBMOwotCi0gIGFiZmQtPnN5bWNvdW50ID0gMDsKLQotICB3aGlsZSAoUFJJVihyZWNfc2l6ZSkgPiAwKQotICAgIHsKLSAgICAgIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwotCi0gICAgICBpZiAob2JqdHlwZSA9PSBPQkpfU19DX0dTRCkKLQl7Ci0JICBnc2RfdHlwZSA9ICp2bXNfcmVjOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgdm1zX3JlYywgJmdzZF90eXBlLCAmZ3NkX3NpemUpOwotCSAgZ3NkX3R5cGUgKz0gRVZBWF9PRkZTRVQ7Ci0JfQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgImdzZF90eXBlICVkXG4iLCBnc2RfdHlwZSk7Ci0jZW5kaWYKLQotICAgICAgc3dpdGNoIChnc2RfdHlwZSkKLQl7Ci0JICBjYXNlIEdTRF9TX0NfUFNDOgotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBwcm9ncmFtIHNlY3Rpb24gZGVmaW5pdGlvbgotCSAgICAgICAqLwotCi0JICAgICAgYXNlY3Rpb24gKm9sZF9zZWN0aW9uID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICJHU0RfU19DX1BTQ1xuIik7Ci0jZW5kaWYKLQkgICAgICAvKiBJZiB0aGlzIHNlY3Rpb24gaXNuJ3QgYSBiZmQgc2VjdGlvbi4gICovCi0KLQkgICAgICBpZiAoUFJJVihpc192YXgpICYmIChwc2VjdF9pZHggPCAoYWJmZC0+c2VjdGlvbl9jb3VudC0xKSkpCi0JCXsKLQkJICAvKiBjaGVjayBmb3IgdGVtcG9yYXJ5IHNlY3Rpb24gZnJvbSBUSVIgcmVjb3JkLiAgKi8KLQotCQkgIGlmIChwc2VjdF9pZHggPCBQUklWKHNlY3Rpb25fY291bnQpKQotCQkgICAgb2xkX3NlY3Rpb24gPSBQUklWKHNlY3Rpb25zKVtwc2VjdF9pZHhdOwotCQkgIGVsc2UKLQkJICAgIG9sZF9zZWN0aW9uID0gMDsKLQkJfQotCi0JICAgICAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA4KTsKLQkgICAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0JICAgICAgaWYgKCFzZWN0aW9uKQotCQl7Ci0JCSAgZnByaW50ZiAoc3RkZXJyLCAiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZFxuIiwgbmFtZSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgb2xkX2ZsYWdzID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDIpOwotCSAgICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGJmZF9nZXRsMzIodm1zX3JlYyArIDQpOwkvKiBhbGxvY2F0aW9uICovCi0JICAgICAgbmV3X2ZsYWdzID0gdm1zX3NlY2ZsYWdfYnlfbmFtZSAoYWJmZCwgdmF4X3NlY3Rpb25fZmxhZ3MsIG5hbWUsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKG9sZF9mbGFncyAmIEVHUFNfU19WX1JFTCkKLQkJbmV3X2ZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1BTX1NfTV9PVlIpCi0JCW5ld19mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uLCBuZXdfZmxhZ3MpKQotCQl7Ci0JCSAgZnByaW50ZiAoc3RkZXJyLCAiYmZkX3NldF9zZWN0aW9uX2ZsYWdzICglcywgJXgpIGZhaWxlZFxuIiwgbmFtZSwgbmV3X2ZsYWdzKTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQkgICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB2bXNfcmVjWzFdOwotCSAgICAgIGFsaWduX2FkZHIgPSAoMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgICAgIGlmICgoYmFzZV9hZGRyICUgYWxpZ25fYWRkcikgIT0gMCkKLQkJYmFzZV9hZGRyICs9IChhbGlnbl9hZGRyIC0gKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpKTsKLQkgICAgICBzZWN0aW9uLT52bWEgPSAoYmZkX3ZtYSliYXNlX2FkZHI7Ci0JICAgICAgYmFzZV9hZGRyICs9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIGdsb2JhbCBzZWN0aW9uIGlzIGNvbW1vbiBzeW1ib2wgICovCi0KLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1BTX1NfTV9HQkwpCi0JCXsKLQkJICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBzeW1ib2wgPSBlbnRyeS0+c3ltYm9sOwotCi0JCSAgc3ltYm9sLT52YWx1ZSA9IDA7Ci0JCSAgc3ltYm9sLT5zZWN0aW9uID0gc2VjdGlvbjsKLQkJICBzeW1ib2wtPmZsYWdzID0gKEJTRl9HTE9CQUx8QlNGX1NFQ1RJT05fU1lNfEJTRl9PTERfQ09NTU9OKTsKLQkJfQotCi0JICAgICAgLyogY29weSBzYXZlZCBjb250ZW50cyBpZiBvbGRfc2VjdGlvbiBzZXQgICovCi0KLQkgICAgICBpZiAob2xkX3NlY3Rpb24gIT0gMCkKLQkJewotCQkgIHNlY3Rpb24tPmNvbnRlbnRzID0gb2xkX3NlY3Rpb24tPmNvbnRlbnRzOwotCQkgIGlmIChzZWN0aW9uLT5fcmF3X3NpemUgPCBvbGRfc2VjdGlvbi0+X3Jhd19zaXplKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJTaXplIG1pc21hdGNoIHNlY3Rpb24gJXM9JWQsICVzPSVkXG4iLCBvbGRfc2VjdGlvbi0+bmFtZSwgb2xkX3NlY3Rpb24tPl9yYXdfc2l6ZSwgc2VjdGlvbi0+bmFtZSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgICAgcmV0dXJuIC0xOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNlY3Rpb24tPl9yYXdfc2l6ZSA+IG9sZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JCSAgICB7Ci0JCSAgICAgIHNlY3Rpb24tPmNvbnRlbnRzID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCQkJICAgIGJmZF9yZWFsbG9jIChvbGRfc2VjdGlvbi0+Y29udGVudHMsIHNlY3Rpb24tPl9yYXdfc2l6ZSkpOwotCQkgICAgICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQkgIHJldHVybiAtMTsKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCQliZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkJICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBtZW1zZXQgKHNlY3Rpb24tPmNvbnRlbnRzLCAwLCAoc2l6ZV90KXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCX0KLQkgICAgICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0jaWYgVk1TX0RFQlVHCi0JICAgICAgdm1zX2RlYnVnICg0LCAiZ3NkIHBzYyAlZCAoJXMsIGZsYWdzICUwNHg9JXMpICIsCi0JCQkgc2VjdGlvbi0+aW5kZXgsIG5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIgKGdwc2ZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLQkgICAgICB2bXNfZGVidWcgKDQsICIlZCBieXRlcyBhdCAweCUwOGx4IChtZW0gJXApXG4iLAotCQkJIHNlY3Rpb24tPl9yYXdfc2l6ZSwgc2VjdGlvbi0+dm1hLCBzZWN0aW9uLT5jb250ZW50cyk7Ci0jZW5kaWYKLQotCSAgICAgIGdzZF9zaXplID0gdm1zX3JlY1s4XSArIDk7Ci0KLQkgICAgICBwc2VjdF9pZHgrKzsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkgIGNhc2UgR1NEX1NfQ19FUE06Ci0JICBjYXNlIEdTRF9TX0NfRVBNVzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZXBtXG4iKTsKLSNlbmRpZgotCSAgLypGQUxMVEhSVSovCi0JICBjYXNlIEdTRF9TX0NfU1lNOgotCSAgY2FzZSBHU0RfU19DX1NZTVc6Ci0JICAgIHsKLQkgICAgICBpbnQgbmFtZV9vZmZzZXQsIHZhbHVlX29mZnNldDsKLQotCSAgICAgIC8qCi0JICAgICAgICogc3ltYm9sIHNwZWNpZmljYXRpb24gKGRlZmluaXRpb24gb3IgcmVmZXJlbmNlKQotCSAgICAgICAqLwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIkdTRF9TX0NfU1lNKFcpXG4iKTsKLSNlbmRpZgotCSAgICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAyKTsKLQkgICAgICBuZXdfZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0KLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9XRUFLKQotCQluZXdfZmxhZ3MgfD0gQlNGX1dFQUs7Ci0KLQkgICAgICBzd2l0Y2ggKGdzZF90eXBlKQotCQl7Ci0JCSAgY2FzZSBHU0RfU19DX0VQTToKLQkJICAgIG5hbWVfb2Zmc2V0ID0gMTE7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA1OwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19FUE1XOgotCQkgICAgbmFtZV9vZmZzZXQgPSAxMjsKLQkJICAgIHZhbHVlX29mZnNldCA9IDY7Ci0JCSAgICBuZXdfZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBHU0RfU19DX1NZTToKLQkJICAgIGlmIChvbGRfZmxhZ3MgJiBHU1lfU19NX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkJICAgICAgbmFtZV9vZmZzZXQgPSA5OwotCQkgICAgZWxzZQotCQkgICAgICBuYW1lX29mZnNldCA9IDQ7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA1OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBHU0RfU19DX1NZTVc6Ci0JCSAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gMTA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gNTsKLQkJICAgIHZhbHVlX29mZnNldCA9IDY7Ci0JCSAgICBicmVhazsKLQkJfQotCi0JICAgICAgLyogc2F2ZSBzeW1ib2wgaW4gdm1zX3N5bWJvbF90YWJsZSAqLwotCi0JICAgICAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsCi0JCQlfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgbmFtZV9vZmZzZXQpKTsKLQkgICAgICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCQl7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgc3ltYm9sID0gZW50cnktPnN5bWJvbDsKLQotCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBHU1lfU19NX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkJewotCQkgIGludCBwc2VjdDsKLQotCQkgIHN5bWJvbC0+dmFsdWUgPSBiZmRfZ2V0bDMyICh2bXNfcmVjK3ZhbHVlX29mZnNldCk7Ci0JCSAgaWYgKChnc2RfdHlwZSA9PSBHU0RfU19DX1NZTVcpCi0JCSAgICAgIHx8IChnc2RfdHlwZSA9PSBHU0RfU19DX0VQTVcpKQotCQkgICAgcHNlY3QgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgdmFsdWVfb2Zmc2V0IC0gMik7Ci0JCSAgZWxzZQotCQkgICAgcHNlY3QgPSB2bXNfcmVjW3ZhbHVlX29mZnNldC0xXTsKLQotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKXBzZWN0OwotI2lmIFZNU19ERUJVRwotCQkgIHZtc19kZWJ1Zyg0LCAiZ3NkIHN5bSBkZWYgIyVkICglcywgJWQgWyVwXSwgJTA0eD0lcylcbiIsIGFiZmQtPnN5bWNvdW50LAotCQkJCXN5bWJvbC0+bmFtZSwgKGludClzeW1ib2wtPnNlY3Rpb24sIHN5bWJvbC0+c2VjdGlvbiwgb2xkX2ZsYWdzLCBmbGFnMnN0cihnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGVsc2UJLyogc3ltYm9sIHJlZmVyZW5jZSAqLwotCQl7Ci0JCSAgc3ltYm9sLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQkZEX1VORF9TRUNUSU9OX05BTUUpOwotI2lmIFZNU19ERUJVRwotCQkgIHZtc19kZWJ1ZyAoNCwgImdzZCBzeW0gcmVmICMlZCAoJXMsICVzIFslcF0sICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCQlzeW1ib2wtPm5hbWUsIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwgc3ltYm9sLT5zZWN0aW9uLCBvbGRfZmxhZ3MsIGZsYWcyc3RyIChnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkJfQotCi0JICAgICAgZ3NkX3NpemUgPSB2bXNfcmVjW25hbWVfb2Zmc2V0XSArIG5hbWVfb2Zmc2V0ICsgMTsKLQkgICAgICBzeW1ib2wtPmZsYWdzID0gbmV3X2ZsYWdzOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JICBjYXNlIEdTRF9TX0NfUFJPOgotCSAgY2FzZSBHU0RfU19DX1BST1c6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHByb1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0lEQzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgaWRjXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfRU5WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBlbnZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MU1k6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGxzeVxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0xFUE06Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGxlcG1cbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MUFJPOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBscHJvXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfU1BTQzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2Qgc3BzY1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1NZTVY6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHN5bXZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19FUE1WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBlcG12XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfUFJPVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgcHJvdlxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JY2FzZSBFR1NEX1NfQ19QU0MgKyBFVkFYX09GRlNFVDoKLQkgIHsKLQkgICAgLyogcHJvZ3JhbSBzZWN0aW9uIGRlZmluaXRpb24gICovCi0KLQkgICAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrMTIpOwotCSAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0JICAgIGlmICghc2VjdGlvbikKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA2KTsKLQkgICAgc2VjdGlvbi0+X3Jhd19zaXplID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDgpOwkvKiBhbGxvY2F0aW9uICovCi0JICAgIG5ld19mbGFncyA9IHZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIGV2YXhfc2VjdGlvbl9mbGFncywgbmFtZSwgKGludCkgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgaWYgKG9sZF9mbGFncyAmIEVHUFNfU19WX1JFTCkKLQkgICAgICBuZXdfZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgbmV3X2ZsYWdzKSkKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHZtc19yZWNbNF07Ci0JICAgIGFsaWduX2FkZHIgPSAoMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgICBpZiAoKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpICE9IDApCi0JICAgICAgYmFzZV9hZGRyICs9IChhbGlnbl9hZGRyIC0gKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpKTsKLQkgICAgc2VjdGlvbi0+dm1hID0gKGJmZF92bWEpYmFzZV9hZGRyOwotCSAgICBiYXNlX2FkZHIgKz0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCSBiZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBtZW1zZXQgKHNlY3Rpb24tPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0jaWYgVk1TX0RFQlVHCi0JICAgIHZtc19kZWJ1Zyg0LCAiZWdzZCBwc2MgJWQgKCVzLCBmbGFncyAlMDR4PSVzKSAiLAotCQkgICAgICAgc2VjdGlvbi0+aW5kZXgsIG5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIoZ3BzZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotCSAgICB2bXNfZGVidWcoNCwgIiVkIGJ5dGVzIGF0IDB4JTA4bHggKG1lbSAlcClcbiIsCi0JCSAgICAgICBzZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+Y29udGVudHMpOwotI2VuZGlmCi0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfU1lNICsgRVZBWF9PRkZTRVQ6Ci0JICB7Ci0JICAgIC8qIHN5bWJvbCBzcGVjaWZpY2F0aW9uIChkZWZpbml0aW9uIG9yIHJlZmVyZW5jZSkgICovCi0KLQkgICAgc3ltYm9sID0gX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotCSAgICBpZiAoc3ltYm9sID09IDApCi0JICAgICAgcmV0dXJuIC0xOwotCi0JICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA2KTsKLQkgICAgbmV3X2ZsYWdzID0gQlNGX05PX0ZMQUdTOwotCi0JICAgIGlmIChvbGRfZmxhZ3MgJiBFR1NZX1NfVl9XRUFLKQotCSAgICAgIG5ld19mbGFncyB8PSBCU0ZfV0VBSzsKLQotCSAgICBpZiAodm1zX3JlY1s2XSAmIEVHU1lfU19WX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkgICAgICB7Ci0JCXN5bWJvbC0+bmFtZSA9Ci0JCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyszMik7Ci0JCWlmIChvbGRfZmxhZ3MgJiBFR1NZX1NfVl9OT1JNKQotCQkgIHsgICAgICAgICAvKiBwcm9jIGRlZiAqLwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICB9Ci0JCXN5bWJvbC0+dmFsdWUgPSBiZmRfZ2V0bDY0ICh2bXNfcmVjKzgpOwotCQlzeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikoKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRsMzIgKHZtc19yZWMrMjgpKTsKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJlZ3NkIHN5bSBkZWYgIyVkICglcywgJWQsICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCSAgIHN5bWJvbC0+bmFtZSwgKGludClzeW1ib2wtPnNlY3Rpb24sIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JICAgICAgfQotCSAgICBlbHNlCS8qIHN5bWJvbCByZWZlcmVuY2UgKi8KLQkgICAgICB7Ci0JICAgICAgICBzeW1ib2wtPm5hbWUgPQotCQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrOCk7Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZWdzZCBzeW0gcmVmICMlZCAoJXMsICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCSAgIHN5bWJvbC0+bmFtZSwgb2xkX2ZsYWdzLCBmbGFnMnN0cihnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkgICAgICAgIHN5bWJvbC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEJGRF9VTkRfU0VDVElPTl9OQU1FKTsKLQkgICAgICB9Ci0KLQkgICAgc3ltYm9sLT5mbGFncyA9IG5ld19mbGFnczsKLQotCSAgICAvKiBzYXZlIHN5bWJvbCBpbiB2bXNfc3ltYm9sX3RhYmxlICAqLwotCi0JICAgIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKikgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBzeW1ib2wtPm5hbWUsIHRydWUsIGZhbHNlKTsKLQkgICAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgICB7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQlyZXR1cm4gLTE7Ci0JICAgICAgfQotCSAgICBpZiAoZW50cnktPnN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpCi0JICAgICAgewkJCQkJLyogRklYTUUgPywgREVDIEMgZ2VuZXJhdGVzIHRoaXMgKi8KLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJFR1NEX1NfQ19TWU06IGR1cGxpY2F0ZSBcIiVzXCJcbiIsIHN5bWJvbC0+bmFtZSk7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWVudHJ5LT5zeW1ib2wgPSBzeW1ib2w7Ci0JCVBSSVYoZ3NkX3N5bV9jb3VudCkrKzsKLQkJYWJmZC0+c3ltY291bnQrKzsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfSURDICsgRVZBWF9PRkZTRVQ6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oInVua25vd24gZ3NkL2Vnc2Qgc3VidHlwZSAlZCIpLCBnc2RfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAtMTsKLQotCX0gLyogc3dpdGNoICovCi0KLSAgICAgIFBSSVYocmVjX3NpemUpIC09IGdzZF9zaXplOwotICAgICAgUFJJVih2bXNfcmVjKSArPSBnc2Rfc2l6ZTsKLQotICAgIH0gLyogd2hpbGUgKHJlY3NpemUgPiAwKSAqLwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogb3V0cHV0IHJvdXRpbmVzICovCi0KLS8qIFdyaXRlIHNlY3Rpb24gYW5kIHN5bWJvbCBkaXJlY3Rvcnkgb2YgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICBpbnQgc3ltbnVtOwotICBpbnQgbGFzdF9pbmRleCA9IC0xOwotICBjaGFyIGR1bW15X25hbWVbMTBdOwotICBjaGFyICpzbmFtZTsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzLCBvbGRfZmxhZ3M7Ci0gIGNoYXIgKm5wdHIsICp1cHRyOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9nc2QgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgLyogb3V0cHV0IHNlY3Rpb25zICAqLwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiJWQgc2VjdGlvbnMgZm91bmRcbiIsIGFiZmQtPnNlY3Rpb25fY291bnQpOwotI2VuZGlmCi0KLSAgLyogZWdzZCBpcyBxdWFkd29yZCBhbGlnbmVkICAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIDgpOwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRUdTRCwgLTEpOwotICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0gIF9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKTsJCS8qIHByZXBhcmUgb3V0cHV0IGZvciBzdWJyZWNvcmRzICovCi0KLSAgd2hpbGUgKHNlY3Rpb24gIT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgIlNlY3Rpb24gIyVkICVzLCAlZCBieXRlc1xuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIChpbnQpc2VjdGlvbi0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0JLyogMTMgYnl0ZXMgZWdzZCwgbWF4IDMxIGNoYXJzIG5hbWUgLT4gc2hvdWxkIGJlIDQ0IGJ5dGVzICovCi0gICAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCA2NCkgPCAwKQotCXsKLQkgIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VHU0QsIC0xKTsKLQkgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLQkgIF9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKTsJCS8qIHByZXBhcmUgb3V0cHV0IGZvciBzdWJyZWNvcmRzICovCi0JfQotCi0JLyogQ3JlYXRlIGR1bW15IHNlY3Rpb25zIHRvIGtlZXAgY29uc2VjdXRpdmUgaW5kaWNlcyAqLwotCi0gICAgICB3aGlsZSAoc2VjdGlvbi0+aW5kZXggLSBsYXN0X2luZGV4ID4gMSkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDMsICJpbmRleCAlZCwgbGFzdCAlZFxuIiwgc2VjdGlvbi0+aW5kZXgsIGxhc3RfaW5kZXgpOwotI2VuZGlmCi0JICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVHU0RfU19DX1BTQywgLTEpOwotCSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKLQkgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0JICBzcHJpbnRmIChkdW1teV9uYW1lLCAiLkRVTU1ZJTAyZCIsIGxhc3RfaW5kZXgpOwotCSAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIGR1bW15X25hbWUpOwotCSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkgIGxhc3RfaW5kZXgrKzsKLQl9Ci0KLSAgICAgIC8qIERvbid0IGtub3cgaWYgdGhpcyBpcyBuZWNjZXNhcnkgZm9yIHRoZSBsaW5rZXIgYnV0IGZvciBub3cgaXQga2VlcHMKLQkgdm1zX3NsdXJwX2dzZCBoYXBweSAgKi8KLQotICAgICAgc25hbWUgPSAoY2hhciAqKXNlY3Rpb24tPm5hbWU7Ci0gICAgICBpZiAoKnNuYW1lID09ICcuJykKLQl7Ci0JICBzbmFtZSsrOwotCSAgaWYgKCgqc25hbWUgPT0gJ3QnKSAmJiAoc3RyY21wIChzbmFtZSwgInRleHQiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBQUklWKGlzX3ZheCk/VkFYX0NPREVfTkFNRTpFVkFYX0NPREVfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2QnKSAmJiAoc3RyY21wIChzbmFtZSwgImRhdGEiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBQUklWKGlzX3ZheCk/VkFYX0RBVEFfTkFNRTpFVkFYX0RBVEFfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2InKSAmJiAoc3RyY21wIChzbmFtZSwgImJzcyIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfQlNTX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdsJykgJiYgKHN0cmNtcCAoc25hbWUsICJsaW5rIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9MSU5LX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdyJykgJiYgKHN0cmNtcCAoc25hbWUsICJyZGF0YSIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfUkVBRE9OTFlfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2wnKSAmJiAoc3RyY21wIChzbmFtZSwgImxpdGVyYWwiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0xJVEVSQUxfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2MnKSAmJiAoc3RyY21wIChzbmFtZSwgImNvbW0iKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0NPTU1PTl9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnbCcpICYmIChzdHJjbXAgKHNuYW1lLCAibGNvbW0iKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0xPQ0FMX05BTUU7Ci0JfQotICAgICAgZWxzZQotCXNuYW1lID0gX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzbmFtZSwgRU9CSl9TX0NfU0VDU0laKTsKLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19QU0MsIC0xKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyICYgMHhmZik7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLQl7Ci0JICBuZXdfZmxhZ3MgPSAoRUdQU19TX1ZfT1ZSfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9HQkx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EfEVHUFNfU19WX0NPTSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5ld19mbGFncyA9IHZtc19lc2VjZmxhZ19ieV9uYW1lIChldmF4X3NlY3Rpb25fZmxhZ3MsIHNuYW1lLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgbmV3X2ZsYWdzKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIHNuYW1lKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgICAgIGxhc3RfaW5kZXggPSBzZWN0aW9uLT5pbmRleDsKLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotICAgIH0KLQotICAvKiBvdXRwdXQgc3ltYm9scyAgKi8KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICIlZCBzeW1ib2xzIGZvdW5kXG4iLCBhYmZkLT5zeW1jb3VudCk7Ci0jZW5kaWYKLQotICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKS0xKTsKLQotICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IGFiZmQtPnN5bWNvdW50OyBzeW1udW0rKykKLSAgICB7Ci0KLSAgICAgIHN5bWJvbCA9IGFiZmQtPm91dHN5bWJvbHNbc3ltbnVtXTsKLSAgICAgIGlmICgqKHN5bWJvbC0+bmFtZSkgPT0gJ18nKQotCXsKLQkgIGlmIChzdHJjbXAgKHN5bWJvbC0+bmFtZSwgIl9fbWFpbiIpID09IDApCi0JICAgIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCwgKGJmZF92bWEpc3ltYm9sLT52YWx1ZSk7Ci0JfQotICAgICAgb2xkX2ZsYWdzID0gc3ltYm9sLT5mbGFnczsKLQotICAgICAgaWYgKG9sZF9mbGFncyAmIEJTRl9GSUxFKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKChvbGRfZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfV0VBSykpID09IDApCS8qIG5vdCB4ZGVmICovCi0JICAmJiAoIWJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkpCS8qIGFuZCBub3QgeHJlZiAqLwotCWNvbnRpbnVlOwkJCQkJLyogZG9udCBvdXRwdXQgKi8KLQotICAgICAgLyogMTMgYnl0ZXMgZWdzZCwgbWF4IDY0IGNoYXJzIG5hbWUgLT4gc2hvdWxkIGJlIDc3IGJ5dGVzICAqLwotCi0gICAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCA4MCkgPCAwKQotCXsKLQkgIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VHU0QsIC0xKTsKLQkgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLQkgIF9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKTsJCS8qIHByZXBhcmUgb3V0cHV0IGZvciBzdWJyZWNvcmRzICovCi0JfQotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVHU0RfU19DX1NZTSwgLTEpOwotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwkJCS8qIGRhdGEgdHlwZSwgYWxpZ25tZW50ICovCi0KLSAgICAgIG5ld19mbGFncyA9IDA7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfV0VBSykKLQluZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfV0VBSzsKLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCQkvKiAuY29tbSAgKi8KLQluZXdfZmxhZ3MgfD0gKEVHU1lfU19WX1dFQUt8RUdTWV9TX1ZfQ09NTSk7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCi0JewotCSAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX05PUk07Ci0JICBuZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfUkVMOwotCX0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfV0VBSykpCi0JewotCSAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX0RFRjsKLQkgIGlmICghYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICBuZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfUkVMOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgbmV3X2ZsYWdzKTsKLQotICAgICAgaWYgKG9sZF9mbGFncyAmIChCU0ZfR0xPQkFMfEJTRl9XRUFLKSkJCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JewotCSAgaWYgKG9sZF9mbGFncyAmIEJTRl9GVU5DVElPTikKLQkgICAgewotCSAgICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCBzeW1ib2wtPnZhbHVlKTsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkgICAgICgoYXN5bWJvbCAqKShzeW1ib2wtPnVkYXRhLnApKS0+dmFsdWUpOwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCSAgICAgKCgoYXN5bWJvbCAqKShzeW1ib2wtPnVkYXRhLnApKQotCQkJCSAgICAgIC0+c2VjdGlvbi0+aW5kZXgpKTsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc3ltYm9sLT5zZWN0aW9uLT5pbmRleCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCBzeW1ib2wtPnZhbHVlKTsJLyogTF9WQUxVRSAqLwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCAwKTsJCQkvKiBMX0NPREVfQUREUkVTUyAqLwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsJCQkvKiBMX0NBX1BTSU5EWCAqLwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBzeW1ib2wtPnNlY3Rpb24tPmluZGV4KTsvKiBMX1BTSU5EWCAqLwotCSAgICB9Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltYm9sLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA4KTsKLSAgX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCk7Ci0gIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOyAKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMtaGRyLmMgYi9iZmQvdm1zLWhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQyMGFhLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMtaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgSERSIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIEVNSCByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gICBhbmQKLSAgIEVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gICBFRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyogUmVhZCAmIHByb2Nlc3MgZW1oIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfaGRyIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7Ci0gIGludCBzdWJ0eXBlOwotCi0gIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZygyLCAiSERSL0VNSFxuIik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBPQkpfU19DX0hEUjoKLQlzdWJ0eXBlID0gdm1zX3JlY1sxXTsKLQlicmVhazsKLSAgICAgIGNhc2UgRU9CSl9TX0NfRU1IOgotCXN1YnR5cGUgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNCkgKyBFVkFYX09GRlNFVDsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3VidHlwZSA9IC0xOwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoMywgInN1YnR5cGUgJWRcbiIsIHN1YnR5cGUpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChzdWJ0eXBlKQotICAgIHsKLQotICAgICAgY2FzZSBNSERfU19DX01IRDoKLQkvKgotCSAqIG1vZHVsZSBoZWFkZXIKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzJdOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAzKTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDUpOwotCXB0ciA9IHZtc19yZWMgKyA1ICsgdm1zX3JlY1s1XSArIDE7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JcHRyICs9ICpwdHIgKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfTE5NOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfU1JDOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfVFRMOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfQ1BSOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfTVRDOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfR1RYOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfTUhEICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKiBtb2R1bGUgaGVhZGVyCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1s2XTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0KLQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyAyMCk7Ci0JcHRyID0gdm1zX3JlYyArIDIwICsgdm1zX3JlY1syMF0gKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPQotCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQlwdHIgKz0gKnB0ciArIDE7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9Ci0JICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfTE5NICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9Ci0JICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfU1JDICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9Ci0JICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9Ci0JICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfQ1BSICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19NVEMgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX0dUWCArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIC0xOwotCi0gICAgfSAvKiBzd2l0Y2ggKi8KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE91dHB1dCByb3V0aW5lcy4gICovCi0KLQotLyogTWFudWZhY3VyZSBhIFZNUyBsaWtlIHRpbWUgb24gYSB1bml4IGJhc2VkIHN5c3RlbS4KLSAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotZ2V0X3Ztc190aW1lX3N0cmluZyAoKQotewotICBzdGF0aWMgdW5zaWduZWQgY2hhciB0YnVmWzE4XTsKLSNpZm5kZWYgVk1TCi0jaW5jbHVkZSA8dGltZS5oPgotCi0gIGNoYXIgKnBudDsKLSAgdGltZV90IHRpbWViOwotICB0aW1lICgmdGltZWIpOwotICBwbnQgPSBjdGltZSAoJnRpbWViKTsKLSAgcG50WzNdID0gMDsKLSAgcG50WzddID0gMDsKLSAgcG50WzEwXSA9IDA7Ci0gIHBudFsxNl0gPSAwOwotICBwbnRbMjRdID0gMDsKLSAgc3ByaW50ZiAodGJ1ZiwgIiUycy0lM3MtJXMgJXMiLCBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwotI2Vsc2UKLSNpbmNsdWRlIDxzdGFybGV0Lmg+Ci0gIHN0cnVjdAotICB7Ci0gICAgaW50IFNpemU7Ci0gICAgdW5zaWduZWQgY2hhciAqUHRyOwotICB9IERlc2NyaXB0b3I7Ci0gIERlc2NyaXB0b3IuU2l6ZSA9IDE3OwotICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7Ci0gIFNZUyRBU0NUSU0gKDAsICZEZXNjcmlwdG9yLCAwLCAwKTsKLSNlbmRpZiAvKiBub3QgVk1TICovCi0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zdGltZXN0cmluZzonJXMnXG4iLCB0YnVmKTsKLSNlbmRpZgotCi0gIHJldHVybiB0YnVmOwotfQotCi0KLS8qIHdyaXRlIG9iamVjdCBoZWFkZXIgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICBpbnQgc3ltbnVtOwotICBpbnQgaGFkX2Nhc2UgPSAwOwotICBpbnQgaGFkX2ZpbGUgPSAwOwotCi0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2hkciAoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIDIpOwotCi0gIC8qIE1IRCAqLwotCi0gIGlmIChvYmp0eXBlID09IE9CSl9TX0NfSERSKQotICAgIHsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19NSEQpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBFT0JKX1NfQ19TVFJMVkwpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIE1BWF9PVVRSRUNfU0laRSk7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIHN0cmlwIHBhdGggYW5kIHN1ZmZpeCBpbmZvcm1hdGlvbiAqLwotCi0gICAgICBjaGFyICpmbmFtZSwgKmZvdXQsICpmcHRyOwotCi0gICAgICBmcHRyID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gICAgICBmbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChmcHRyKSArIDEpOwotICAgICAgc3RyY3B5IChmbmFtZSwgZnB0cik7Ci0gICAgICBmb3V0ID0gc3RycmNociAoZm5hbWUsICddJyk7Ci0gICAgICBpZiAoZm91dCA9PSAwKQotCWZvdXQgPSBzdHJjaHIgKGZuYW1lLCAnOicpOwotICAgICAgaWYgKGZvdXQgIT0gMCkKLQlmb3V0Kys7Ci0gICAgICBlbHNlCi0JZm91dCA9IGZuYW1lOwotCi0gICAgICAvKiBzdHJpcCAub2JqIHN1ZmZpeCAgKi8KLQotICAgICAgZnB0ciA9IHN0cnJjaHIgKGZuYW1lLCAnLicpOwotICAgICAgaWYgKChmcHRyICE9IDApCi0JICAmJiAoc3RyY2FzZWNtcCAoZnB0ciwgIi5PQkoiKSA9PSAwKSkKLQkqZnB0ciA9IDA7Ci0KLSAgICAgIGZwdHIgPSBmb3V0OwotICAgICAgd2hpbGUgKCpmcHRyICE9IDApCi0JewotCSAgaWYgKGlzbG93ZXIgKCpmcHRyKSkKLQkgICAgKmZwdHIgPSB0b3VwcGVyICgqZnB0cik7Ci0JICBmcHRyKys7Ci0JICBpZiAoKCpmcHRyID09ICc7JykKLQkgICAgIHx8ICgoZnB0ciAtIGZvdXQpID4gMzEpKQotCSAgICAqZnB0ciA9IDA7Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIGZvdXQpOwotICAgIH0KLSAgZWxzZQotICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCAiTk9OQU1FIik7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGdldF92bXNfdGltZV9zdHJpbmcgKCksIDE3KTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZpbGwgKGFiZmQsIDAsIDE3KTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBMTU4gKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19MTk0pOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiR0FTIHByb0dJUyIsIDEwKTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBTUkMgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19TUkMpOwotCi0gIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQotICAgIHsKLSAgICAgIHN5bWJvbCA9IGFiZmQtPm91dHN5bWJvbHNbc3ltbnVtXTsKLQotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfRklMRSkKLQl7Ci0JICBjaGFyICpzOwotCi0JICBpZiAoc3RybmNtcCAoKGNoYXIgKilzeW1ib2wtPm5hbWUsICI8Q0FTRToiLCA2KSA9PSAwKQotCSAgICB7Ci0JICAgICAgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykgPSBzeW1ib2wtPm5hbWVbNl0gLSAnMCc7Ci0JICAgICAgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpID0gc3ltYm9sLT5uYW1lWzddIC0gJzAnOwotCi0JICAgICAgaWYgKGhhZF9maWxlKQotCQlicmVhazsKLQkgICAgICBoYWRfY2FzZSA9IDE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopc3ltYm9sLT5uYW1lLCBzdHJsZW4gKHN5bWJvbC0+bmFtZSkpOwotCSAgaWYgKGhhZF9jYXNlKQotCSAgICBicmVhazsKLQkgIGhhZF9maWxlID0gMTsKLQl9Ci0gICAgfQotCi0gIGlmIChzeW1udW0gPT0gYWJmZC0+c3ltY291bnQpCi0gICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIm5vbmFtZSIsIDYpOwotCi0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogVFRMICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfVFRMKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIlRUTCIsIDMpOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIENQUiAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0NQUik7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLAotCQkJICh1bnNpZ25lZCBjaGFyICopIkdOVSBCRkQgcG9ydGVkIGJ5IEtsYXVzIEvkbXBmIDE5OTQtMTk5NiIsCi0JCQkgMzkpOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUHJvY2VzcyBFT00vRUVPTSByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2VvbSAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoMiwgIkVPTS9FRU9NXG4iKTsKLSNlbmRpZgotCi0gIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwotCi0gIGlmICgob2JqdHlwZSA9PSBPQkpfU19DX0VPTSkgCi0gICAgIHx8IChvYmp0eXBlID09IE9CSl9TX0NfRU9NVykpCi0gICAgewotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RvdGFsX2xwcyA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA0KTsKLSAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA9ICoodm1zX3JlYyArIDgpOwotICAgICAgaWYgKFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA+IDEpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPYmplY3QgbW9kdWxlIE5PVCBlcnJvci1mcmVlICFcbiIpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBmYWxzZTsKLSAgICAgIGlmIChQUklWKHJlY19zaXplKSA+IDEwKQotCXsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gdHJ1ZTsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21fYl90ZnJmbGcgPSAqKHZtc19yZWMgKyA5KTsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21fbF9wc2luZHggPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwotCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkciA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7Ci0KLQkgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gUFJJVihlb21fZGF0YSkuZW9tX2xfdGZyYWRyOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFdyaXRlIGVvbSByZWNvcmQgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2VvbSAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIG9ianR5cGUsIC0xKTsKLSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShQUklWKHZtc19saW5rYWdlX2luZGV4KSA+PiAxKSk7Ci0gIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogY29tcGxldGlvbiBjb2RlICovCi0gIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogZmlsbCBieXRlICovCi0KLSAgaWYgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgIT0gKGJmZF92bWEpLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5saW5rIik7Ci0gICAgICBpZiAoc2VjdGlvbiA9PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNlY3Rpb24tPmluZGV4KSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLW1pc2MuYyBiL2JmZC92bXMtbWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWIxZmM4Li4wMDAwMDAwCi0tLSBhL2JmZC92bXMtbWlzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NiArMCwwIEBACi0vKiB2bXMtbWlzYy5jIC0tIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIGZvciBWQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIFZNU19ERUJVRwotLyogZGVidWcgZnVuY3Rpb25zICovCi0KLS8qIGRlYnVnIGZ1bmN0aW9uIGZvciBhbGwgdm1zIGV4dGVuc2lvbnMKLSAgIGV2YWx1YXRlcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBWTVNfREVCVUcgZm9yIGEKLSAgIG51bWVyaWNhbCB2YWx1ZSBvbiB0aGUgZmlyc3QgY2FsbAotICAgYWxsIGVycm9yIGxldmVscyBiZWxvdyB0aGlzIHZhbHVlIGFyZSBwcmludGVkCi0gIAotICAgbGV2ZWxzOgotICAgMQl0b3BsZXZlbCBiZmQgY2FsbHMgKGZ1bmN0aW9ucyBmcm9tIHRoZSBiZmQgdmVjdG9yKQotICAgMglmdW5jdGlvbnMgY2FsbGVkIGJ5IGJmZCBjYWxscwotICAgLi4uCi0gICA5CWFsbW9zdCBldmVyeXRoaW5nCi0KLSAgIGxldmVsIGlzIGFsc28gaWRlbnRhdGlvbiBsZXZlbC4gSW5kZW50YXRpb24gaXMgcGVyZm9ybWVkCi0gICBpZiBsZXZlbCA+IDAKLQkqLwotCi0jaWYgX19TVERDX18KLXZvaWQKLV9iZmRfdm1zX2RlYnVnIChpbnQgbGV2ZWwsIGNoYXIgKmZvcm1hdCwgLi4uKQotewotICBzdGF0aWMgaW50IG1pbl9sZXZlbCA9IC0xOwotICBzdGF0aWMgRklMRSAqb3V0cHV0ID0gTlVMTDsKLSAgY2hhciAqZXB0cjsKLSAgdmFfbGlzdCBhcmdzOwotICBpbnQgYWJzbHZsID0gKGxldmVsID4gMCk/bGV2ZWw6LWxldmVsOwotCi0gIGlmIChtaW5fbGV2ZWwgPT0gLTEpCi0gICAgewotICAgICAgaWYgKChlcHRyID0gZ2V0ZW52KCJWTVNfREVCVUciKSkgIT0gTlVMTCkKLQl7Ci0JICBtaW5fbGV2ZWwgPSBhdG9pKGVwdHIpOwotCSAgb3V0cHV0ID0gc3RkZXJyOwotCX0KLSAgICAgIGVsc2UKLQltaW5fbGV2ZWwgPSAwOwotICAgIH0KLSAgaWYgKG91dHB1dCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgaWYgKGFic2x2bCA+IG1pbl9sZXZlbCkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUoLS1sZXZlbD4wKQotICAgIGZwcmludGYob3V0cHV0LCAiICIpOwotICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotICB2ZnByaW50ZihvdXRwdXQsIGZvcm1hdCwgYXJncyk7Ci0gIGZmbHVzaChvdXRwdXQpOwotICB2YV9lbmQoYXJncyk7Ci0KLSAgcmV0dXJuOwotfQotCi0jZWxzZSAvKiBub3QgX19TVERDX18gKi8KLQotdm9pZAotX2JmZF92bXNfZGVidWcgKGxldmVsLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpCi0gICAgIGludCBsZXZlbDsKLSAgICAgY2hhciAqZm9ybWF0OwotICAgICBsb25nIGExOyBsb25nIGEyOyBsb25nIGEzOwotICAgICBsb25nIGE0OyBsb25nIGE1OyBsb25nIGE2OwotewotICBzdGF0aWMgaW50IG1pbl9sZXZlbCA9IC0xOwotICBzdGF0aWMgRklMRSAqb3V0cHV0ID0gTlVMTDsKLSAgY2hhciAqZXB0cjsKLQotICBpZiAobWluX2xldmVsID09IC0xKQotICAgIHsKLSAgICAgIGlmICgoZXB0ciA9IGdldGVudigiVk1TX0RFQlVHIikpICE9IE5VTEwpCi0JewotCSAgbWluX2xldmVsID0gYXRvaShlcHRyKTsKLQkgIG91dHB1dCA9IHN0ZGVycjsKLQl9Ci0gICAgICBlbHNlCi0JbWluX2xldmVsID0gMDsKLSAgICB9Ci0gIGlmIChvdXRwdXQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChsZXZlbCA+IG1pbl9sZXZlbCkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUoLS1sZXZlbD4wKQotICAgIGZwcmludGYob3V0cHV0LCAiICIpOwotICBmcHJpbnRmKG91dHB1dCwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKLSAgZmZsdXNoKG91dHB1dCk7Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmIC8qIF9fU1REQ19fICovCi0KLQotLyogYSBkZWJ1ZyBmdW5jdGlvbgotICAgaGV4IGR1bXAgJ3NpemUnIGJ5dGVzIHN0YXJ0aW5nIGF0ICdwdHInICAqLwotCi12b2lkCi1fYmZkX2hleGR1bXAgKGxldmVsLCBwdHIsIHNpemUsIG9mZnNldCkKLSAgICAgaW50IGxldmVsOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgb2Zmc2V0OwotewotICB1bnNpZ25lZCBjaGFyICpscHRyID0gcHRyOwotICBpbnQgY291bnQgPSAwOwotICBsb25nIHN0YXJ0ID0gb2Zmc2V0OwotCi0gIHdoaWxlIChzaXplLS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgoY291bnQlMTYpID09IDApCi0Jdm1zX2RlYnVnIChsZXZlbCwgIiUwOGx4OiIsIHN0YXJ0KTsKLSAgICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiICUwMngiLCAqcHRyKyspOwotICAgICAgY291bnQrKzsKLSAgICAgIHN0YXJ0Kys7Ci0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXsKLQkgIHdoaWxlICgoY291bnQlMTYpICE9IDApCi0JICAgIHsKLQkgICAgICB2bXNfZGVidWcgKC1sZXZlbCwgIiAgICIpOwotCSAgICAgIGNvdW50Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoKGNvdW50JTE2KSA9PSAwKQotCXsKLQkgIHZtc19kZWJ1ZyAoLWxldmVsLCAiICIpOwotCSAgd2hpbGUgKGxwdHIgPCBwdHIpCi0JICAgIHsKLQkgICAgICB2bXNfZGVidWcgKC1sZXZlbCwgIiVjIiwgKCpscHRyIDwgMzIpPycuJzoqbHB0cik7Ci0JICAgICAgbHB0cisrOwotCSAgICB9Ci0JICB2bXNfZGVidWcgKC1sZXZlbCwgIlxuIik7Ci0JfQotICAgIH0KLSAgaWYgKChjb3VudCUxNikgIT0gMCkKLSAgICB2bXNfZGVidWcgKC1sZXZlbCwgIlxuIik7Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLQwKLS8qIGhhc2ggZnVuY3Rpb25zCi0KLSAgIFRoZXNlIGFyZSBuZWVkZWQgd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgKi8KLQotLyogYWxsb2NhdGUgbmV3IHZtc19oYXNoX2VudHJ5Ci0gICBrZWVwIHRoZSBzeW1ib2wgbmFtZSBhbmQgYSBwb2ludGVyIHRvIHRoZSBiZmQgc3ltYm9sIGluIHRoZSB0YWJsZSAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfdm1zX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgdm1zX3N5bWJvbF9lbnRyeSAqcmV0OwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNSwgIl9iZmRfdm1zX2hhc2hfbmV3ZnVuYyglcCwgJXAsICVzKVxuIiwgZW50cnksIHRhYmxlLCBzdHJpbmcpOwotI2VuZGlmCi0KLSAgaWYgKGVudHJ5ID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilOVUxMKQotICAgIHsKLSAgICAgIHJldCA9ICh2bXNfc3ltYm9sX2VudHJ5ICopCi0JICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHZtc19zeW1ib2xfZW50cnkpKTsKLSAgICAgIGlmIChyZXQgPT0gKHZtc19zeW1ib2xfZW50cnkgKikgTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopTlVMTDsKLQl9Ci0gICAgICBlbnRyeSA9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotICAgIH0KLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgYmFzZSBjbGFzcy4gICovCi0KLSAgcmV0ID0gKHZtc19zeW1ib2xfZW50cnkgKikgYmZkX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpOwotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19oYXNoX25ld2Z1bmMgcmV0ICVwXG4iLCByZXQpOwotI2VuZGlmCi0KLSAgcmV0LT5zeW1ib2wgPSAoYXN5bWJvbCAqKU5VTEw7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilyZXQ7Ci19Ci0KLQwKLS8qIG9iamVjdCBmaWxlIGlucHV0IGZ1bmN0aW9ucyAqLwotCi0vKiBSZXR1cm4gdHlwZSBhbmQgbGVuZ3RoIGZyb20gcmVjb3JkIGhlYWRlciAoYnVmKSBvbiBBbHBoYS4gICovCi0KLXZvaWQKLV9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCBidWYsIHR5cGUsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCAqdHlwZTsKLSAgICAgaW50ICpsZW5ndGg7Ci17Ci0gIGlmICh0eXBlICE9IDApCi0gICAgKnR5cGUgPSBiZmRfZ2V0bDE2IChidWYpOwotICBidWYgKz0gMjsKLSAgaWYgKGxlbmd0aCAhPSAwKQotICAgICpsZW5ndGggPSBiZmRfZ2V0bDE2IChidWYpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMTAsICJfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyB0eXBlICV4LCBsZW5ndGggJXhcbiIsICh0eXBlPyp0eXBlOjApLCAobGVuZ3RoPypsZW5ndGg6MCkpOwotI2VuZGlmCi0KLQotICByZXR1cm47Ci19Ci0KLQotLyogR2V0IG5leHQgcmVjb3JkIGZyb20gb2JqZWN0IGZpbGUgdG8gdm1zX2J1ZgotICAgc2V0IFBSSVYoYnVmX3NpemUpIGFuZCByZXR1cm4gaXQKLSAgCi0gICB0aGlzIGlzIGEgbGl0dGxlIHRyaWNreSBzaW5jZSBpdCBzaG91bGQgYmUgcG9ydGFibGUuCi0gIAotICAgdGhlIG9wZW5WTVMgb2JqZWN0IGZpbGUgaGFzICd2YXJpYWJsZSBsZW5ndGgnIHdoaWNoIG1lYW5zIHRoYXQKLSAgIHJlYWQoKSByZXR1cm5zIGRhdGEgaW4gY2h1bmtzIG9mIChob3BlZnVsbHkpIGNvcnJlY3QgYW5kIGV4cGVjdGVkCi0gICBzaXplLiBUaGUgbGlua2VyIChhbmQgb3RoZXIgdG9vbHMgb24gdm1zKSBkZXBlbmQgb24gdGhhdC4gVW5peCBkb2Vzbid0Ci0gICBrbm93IGFib3V0ICdmb3JtYXR0ZWQnIGZpbGVzLCBzbyByZWFkaW5nIGFuZCB3cml0aW5nIHN1Y2ggYW4gb2JqZWN0Ci0gICBmaWxlIGluIGEgdW5peCBlbnZpcm9ubWVudCBpcyBub3QgdHJpdmlhbC4KLSAgCi0gICBXaXRoIHRoZSB0b29sICdmaWxlJyAoYXZhaWxhYmxlIG9uIGFsbCB2bXMgZnRwIHNpdGVzKSwgb25lCi0gICBjYW4gdmlldyBhbmQgY2hhbmdlIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZmlsZS4gQ2hhbmdpbmcgZnJvbQotICAgJ3ZhcmlhYmxlIGxlbmd0aCcgdG8gJ2ZpeGVkIGxlbmd0aCwgNTEyIGJ5dGVzJyByZXZlYWxzIHRoZQotICAgcmVjb3JkIGxlbmd0aCBhdCB0aGUgZmlyc3QgMiBieXRlcyBvZiBldmVyeSByZWNvcmQuIFRoZSBzYW1lCi0gICBoYXBwZW5zIGR1cmluZyB0aGUgdHJhbnNmZXIgb2Ygb2JqZWN0IGZpbGVzIGZyb20gdm1zIHRvIHVuaXgsCi0gICBhdCBsZWFzdCB3aXRoIHVjeCwgZGVjJ3MgaW1wbGVtZW50YXRpb24gb2YgdGNwL2lwLgotICAKLSAgIFRoZSB2bXMgZm9ybWF0IHJlcGVhdHMgdGhlIGxlbmd0aCBhdCBieXRlcyAyICYgMyBvZiBldmVyeSByZWNvcmQuCi0gIAotICAgT24gdGhlIGZpcnN0IGNhbGwgKGZpbGVfZm9ybWF0ID09IEZGX1VOS05PV04pIHdlIGNoZWNrIGlmCi0gICB0aGUgZmlyc3QgYW5kIHRoZSB0aGlyZCBieXRlIHBhaXIgKCEpIG9mIHRoZSByZWNvcmQgbWF0Y2guCi0gICBJZiB0aGV5IGRvIGl0J3MgYW4gb2JqZWN0IGZpbGUgaW4gYW4gdW5peCBlbnZpcm9ubWVudCBvciB3aXRoCi0gICB3cm9uZyBhdHRyaWJ1dGVzIChGRl9GT1JFSUdOKSwgZWxzZSB3ZSBzaG91bGQgYmUgaW4gYSB2bXMKLSAgIGVudmlyb25tZW50IHdoZXJlIHJlYWQoKSByZXR1cm5zIHRoZSByZWNvcmQgc2l6ZSAoRkZfTkFUSVZFKS4KLSAgCi0gICByZWFkaW5nIGlzIGFsd2F5cyBkb25lIGluIDIgc3RlcHMuCi0gICBmaXJzdCBqdXN0IHRoZSByZWNvcmQgaGVhZGVyIGlzIHJlYWQgYW5kIHRoZSBsZW5ndGggZXh0cmFjdGVkCi0gICBieSBnZXRfaGVhZGVyX3ZhbHVlcwotICAgdGhlbiB0aGUgcmVhZCBidWZmZXIgaXMgYWRqdXN0ZWQgYW5kIHRoZSByZW1haW5pbmcgYnl0ZXMgYXJlCi0gICByZWFkIGluLgotICAKLSAgIGFsbCBmaWxlIGkvbyBpcyBhbHdheXMgZG9uZSBvbiBldmVuIGZpbGUgcG9zaXRpb25zICAqLwotCi1pbnQKLV9iZmRfdm1zX2dldF9yZWNvcmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHRlc3RfbGVuLCB0ZXN0X3N0YXJ0LCByZW1haW5pbmc7Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19idWY7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfZ2V0X3JlY29yZFxuIik7Ci0jZW5kaWYKLQotICAvKiBtaW5pbXVtIGlzIDYgYnl0ZXMgb24gQWxwaGEKLSAgICAgKDIgYnl0ZXMgbGVuZ3RoLCAyIGJ5dGVzIHJlY29yZCBpZCwgMiBieXRlcyBsZW5ndGggcmVwZWF0ZWQpCi0KLSAgICAgb24gVkFYIHRoZXJlJ3Mgbm8gbGVuZ3RoIGluZm9ybWF0aW9uIGluIHRoZSByZWNvcmQKLSAgICAgc28gc3RhcnQgd2l0aCBPQkpfU19DX01BWFJFQ1NJWiAgKi8KLQotICBpZiAoUFJJVihidWZfc2l6ZSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoUFJJVihpc192YXgpKQotCXsKLQkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9CSl9TX0NfTUFYUkVDU0laKTsKLQkgIFBSSVYoYnVmX3NpemUpID0gT0JKX1NfQ19NQVhSRUNTSVo7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX1ZBWDsKLQl9Ci0gICAgICBlbHNlCi0JUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyAoNik7Ci0gICAgfQotCi0gIHZtc19idWYgPSBQUklWKHZtc19idWYpOwotCi0gIGlmICh2bXNfYnVmID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN3aXRjaCAoUFJJVihmaWxlX2Zvcm1hdCkpCi0gICAgewotICAgICAgY2FzZSBGRl9VTktOT1dOOgotICAgICAgY2FzZSBGRl9GT1JFSUdOOgotCXRlc3RfbGVuID0gNjsJCQkvKiBwcm9iZSA2IGJ5dGVzICovCi0JdGVzdF9zdGFydCA9IDI7CQkJLyogd2hlcmUgdGhlIHJlY29yZCBzdGFydHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZGX05BVElWRToKLQl0ZXN0X2xlbiA9IDQ7Ci0JdGVzdF9zdGFydCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBGRl9WQVg6Ci0JdGVzdF9sZW4gPSAwOwotCXRlc3Rfc3RhcnQgPSAwOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvKiBza2lwIG9kZCBhbGlnbm1lbnQgYnl0ZSAgKi8KLQotICBpZiAoYmZkX3RlbGwgKGFiZmQpICYgMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKFBSSVYodm1zX2J1ZiksIDEsIDEsIGFiZmQpICE9IDEpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgLyogcmVhZCB0aGUgcmVjb3JkIGhlYWRlciBvbiBBbHBoYS4gICovCi0KLSAgaWYgKCh0ZXN0X2xlbiAhPSAwKQotICAgICAgJiYgKGJmZF9yZWFkIChQUklWKHZtc19idWYpLCAxLCB0ZXN0X2xlbiwgYWJmZCkgIT0gdGVzdF9sZW4pKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogY2hlY2sgZmlsZSBmb3JtYXQgb24gZmlyc3QgY2FsbCAgKi8KLQotICBpZiAoUFJJVihmaWxlX2Zvcm1hdCkgPT0gRkZfVU5LTk9XTikKLSAgICB7CQkJCQkJLyogcmVjb3JkIGxlbmd0aCByZXBlYXRzID8gKi8KLSAgICAgIGlmICggKHZtc19idWZbMF0gPT0gdm1zX2J1Zls0XSkKLSAgICAgICAgJiYgKHZtc19idWZbMV0gPT0gdm1zX2J1Zls1XSkpCi0JewotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9GT1JFSUdOOwkvKiBZOiBmb3JlaWduIGVudmlyb25tZW50ICovCi0JICB0ZXN0X3N0YXJ0ID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9OQVRJVkU7CS8qIE46IG5hdGl2ZSBlbnZpcm9ubWVudCAqLwotCSAgdGVzdF9zdGFydCA9IDA7Ci0JfQotICAgIH0KLQotICBpZiAoUFJJVihpc192YXgpKQotICAgIHsKLSAgICAgIFBSSVYocmVjX2xlbmd0aCkgPSBiZmRfcmVhZCAodm1zX2J1ZiwgMSwgUFJJVihidWZfc2l6ZSksIGFiZmQpOwotICAgICAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPD0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgUFJJVih2bXNfcmVjKSA9IHZtc19idWY7Ci0gICAgfQotICBlbHNlCQkvKiBBbHBoYSAgKi8KLSAgICB7Ci0gICAgICAvKiBleHRyYWN0IHZtcyByZWNvcmQgbGVuZ3RoICAqLwotCi0gICAgICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgdm1zX2J1Zit0ZXN0X3N0YXJ0LCBOVUxMLAotCQkJCSAgJlBSSVYocmVjX2xlbmd0aCkpOwotCi0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA8PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIHRoYXQncyB3aGF0IHRoZSBsaW5rZXIgbWFudWFsIHNheXMgICovCi0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpID4gRU9CSl9TX0NfTUFYUkVDU0laKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIGFkanVzdCB0aGUgYnVmZmVyICAqLwotCi0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA+IFBSSVYoYnVmX3NpemUpKQotCXsKLQkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSByZWFsbG9jICh2bXNfYnVmLCBQUklWKHJlY19sZW5ndGgpKTsKLQkgIHZtc19idWYgPSBQUklWKHZtc19idWYpOwotCSAgaWYgKHZtc19idWYgPT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgUFJJVihidWZfc2l6ZSkgPSBQUklWKHJlY19sZW5ndGgpOwotCX0KLQotICAgICAgLyogcmVhZCB0aGUgcmVtYWluaW5nIHJlY29yZCAgKi8KLQotICAgICAgcmVtYWluaW5nID0gUFJJVihyZWNfbGVuZ3RoKSAtIHRlc3RfbGVuICsgdGVzdF9zdGFydDsKLQotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgxMCwgImJmZF9yZWFkIHJlbWFpbmluZyAlZFxuIiwgcmVtYWluaW5nKTsKLSNlbmRpZgotICAgICAgaWYgKGJmZF9yZWFkICh2bXNfYnVmICsgdGVzdF9sZW4sIDEsIHJlbWFpbmluZywgYWJmZCkgIT0gcmVtYWluaW5nKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBQUklWKHZtc19yZWMpID0gdm1zX2J1ZiArIHRlc3Rfc3RhcnQ7Ci0gICAgfQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMTEsICJiZmRfcmVhZCByZWNfbGVuZ3RoICVkXG4iLCBQUklWKHJlY19sZW5ndGgpKTsKLSNlbmRpZgotCi0gIHJldHVybiBQUklWKHJlY19sZW5ndGgpOwotfQotCi0KLS8qIGdldCBuZXh0IHZtcyByZWNvcmQgZnJvbSBmaWxlCi0gICB1cGRhdGUgdm1zX3JlYyBhbmQgcmVjX2xlbmd0aCB0byBuZXcgKHJlbWFpbmluZykgdmFsdWVzICAqLwotCi1pbnQKLV9iZmRfdm1zX25leHRfcmVjb3JkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX25leHRfcmVjb3JkIChsZW4gJWQsIHNpemUgJWQpXG4iLAotCSAgICAgIFBSSVYocmVjX2xlbmd0aCksIFBSSVYocmVjX3NpemUpKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKHJlY19sZW5ndGgpID4gMCkKLSAgICB7Ci0gICAgICBQUklWKHZtc19yZWMpICs9IFBSSVYocmVjX3NpemUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChfYmZkX3Ztc19nZXRfcmVjb3JkIChhYmZkKSA8PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKFBSSVYoaXNfdmF4KSkKLSAgICB7Ci0gICAgICBQUklWKHJlY190eXBlKSA9ICooUFJJVih2bXNfcmVjKSk7Ci0gICAgICBQUklWKHJlY19zaXplKSA9IFBSSVYocmVjX2xlbmd0aCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIFBSSVYodm1zX3JlYyksICZQUklWKHJlY190eXBlKSwKLQkJCQkgICZQUklWKHJlY19zaXplKSk7Ci0gICAgfQotICBQUklWKHJlY19sZW5ndGgpIC09IFBSSVYocmVjX3NpemUpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX25leHRfcmVjb3JkOiByZWMgJXAsIHNpemUgJWQsIGxlbmd0aCAlZCwgdHlwZSAlZFxuIiwKLQkgICAgICBQUklWKHZtc19yZWMpLCBQUklWKHJlY19zaXplKSwgUFJJVihyZWNfbGVuZ3RoKSwKLQkgICAgICBQUklWKHJlY190eXBlKSk7Ci0jZW5kaWYKLQotICByZXR1cm4gUFJJVihyZWNfdHlwZSk7Ci19Ci0KLQotDAotLyogQ29weSBzaXplZCBzdHJpbmcgKHN0cmluZyB3aXRoIGZpeGVkIGxlbmd0aCkgdG8gbmV3IGFsbG9jYXRlZCBhcmVhCi0gICBzaXplIGlzIHN0cmluZyBsZW5ndGggKHNpemUgb2YgcmVjb3JkKSAgKi8KLQotY2hhciAqCi1fYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAoc3RyLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICpzdHI7Ci0gICAgIGludCBzaXplOwotewotICBjaGFyICpuZXdzdHIgPSBiZmRfbWFsbG9jIChzaXplICsgMSk7Ci0KLSAgaWYgKG5ld3N0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBzdHJuY3B5IChuZXdzdHIsIChjaGFyICopc3RyLCBzaXplKTsKLSAgbmV3c3RyW3NpemVdID0gMDsKLQotICByZXR1cm4gbmV3c3RyOwotfQotCi0vKiBDb3B5IGNvdW50ZWQgc3RyaW5nIChzdHJpbmcgd2l0aCBsZW5ndGggYXQgZmlyc3QgYnl0ZSkgdG8gbmV3IGFsbG9jYXRlZCBhcmVhCi0gICBwdHIgcG9pbnRzIHRvIGxlbmd0aCBieXRlIG9uIGVudHJ5ICAqLwotCi1jaGFyICoKLV9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cikKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICBpbnQgbGVuID0gKnB0cisrOwotCi0gIHJldHVybiBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCBsZW4pOwotfQotCi0MCi0vKiBzdGFjayByb3V0aW5lcyBmb3Igdm1zIEVUSVIgY29tbWFuZHMgKi8KLQotLyogUHVzaCB2YWx1ZSBhbmQgc2VjdGlvbiBpbmRleCAgKi8KLQotdm9pZAotX2JmZF92bXNfcHVzaCAoYWJmZCwgdmFsLCBwc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1cXVhZCB2YWw7Ci0gICAgIGludCBwc2VjdDsKLXsKLSAgc3RhdGljIGludCBsYXN0X3BzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIjxwdXNoICUwMTZseCglZCkgYXQgJWQ+XG4iLCB2YWwsIHBzZWN0LCBQUklWKHN0YWNrcHRyKSk7Ci0jZW5kaWYKLQotICBpZiAocHNlY3QgPj0gMCkKLSAgICBsYXN0X3BzZWN0ID0gcHNlY3Q7Ci0KLSAgUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnZhbHVlID0gdmFsOwotICBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3QgPSBsYXN0X3BzZWN0OwotICBQUklWKHN0YWNrcHRyKSsrOwotICBpZiAoUFJJVihzdGFja3B0cikgPj0gU1RBQ0tTSVpFKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjayBvdmVyZmxvdyAoJWQpIGluIF9iZmRfdm1zX3B1c2giKSwgUFJJVihzdGFja3B0cikpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyogUG9wIHZhbHVlIGFuZCBzZWN0aW9uIGluZGV4ICAqLwotCi11cXVhZAotX2JmZF92bXNfcG9wIChhYmZkLCBwc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgKnBzZWN0OwotewotICB1cXVhZCB2YWx1ZTsKLQotICBpZiAoUFJJVihzdGFja3B0cikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2sgdW5kZXJmbG93IGluIF9iZmRfdm1zX3BvcCIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgUFJJVihzdGFja3B0ciktLTsKLSAgdmFsdWUgPSBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkudmFsdWU7Ci0gIGlmICgocHNlY3QgIT0gTlVMTCkgJiYgKFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCA+PSAwKSkKLSAgICAqcHNlY3QgPSBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg0LCAiPHBvcCAlMDE2bHgoJWQpPlxuIiwgdmFsdWUsIFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLQwKLS8qIG9iamVjdCBmaWxlIG91dHB1dCBmdW5jdGlvbnMgKi8KLQotLyogR0FTIHRlbmRzIHRvIHdyaXRlIHNlY3Rpb25zIGluIGxpdHRsZSBjaHVua3MgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cykKLSAgIHdoaWNoIHdlIGNhbid0IHVzZSBkaXJlY3RseS4gU28gd2Ugc2F2ZSB0aGUgbGl0dGxlIGNodW5rcyBpbiBsaW5rZWQKLSAgIGxpc3RzIChvbmUgcGVyIHNlY3Rpb24pIGFuZCB3cml0ZSB0aGVtIGxhdGVyLiAgKi8KLQotLyogQWRkIGEgbmV3IHZtc19zZWN0aW9uIHN0cnVjdHVyZSB0byB2bXNfc2VjdGlvbl90YWJsZQotICAgLSBmb3J3YXJkIGNoYWluaW5nIC0gICovCi0KLXN0YXRpYyB2bXNfc2VjdGlvbiAqCi1hZGRfbmV3X2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLXsKLSAgdm1zX3NlY3Rpb24gKnNwdHIsICpuZXdwdHI7Ci0KLSAgc3B0ciA9IFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW3NlY3Rpb24tPmluZGV4XTsKLSAgaWYgKHNwdHIgIT0gTlVMTCkKLSAgICByZXR1cm4gc3B0cjsKLQotICBuZXdwdHIgPSAodm1zX3NlY3Rpb24gKikgYmZkX21hbGxvYyAoc2l6ZW9mICh2bXNfc2VjdGlvbikpOwotICBpZiAobmV3cHRyID09ICh2bXNfc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuZXdwdHItPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gIGlmIChuZXdwdHItPmNvbnRlbnRzID09ICh1bnNpZ25lZCBjaGFyICopTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3cHRyLT5vZmZzZXQgPSAwOwotICBuZXdwdHItPnNpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0gIG5ld3B0ci0+bmV4dCA9IDA7Ci0gIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW3NlY3Rpb24tPmluZGV4XSA9IG5ld3B0cjsKLSAgcmV0dXJuIG5ld3B0cjsKLX0KLQotCi0vKiBTYXZlIHNlY3Rpb24gZGF0YSAmIG9mZnNldCB0byBhbiB2bXNfc2VjdGlvbiBzdHJ1Y3R1cmUKLSAgIHZtc19zZWN0aW9uX3RhYmxlW10gaG9sZHMgdGhlIHZtc19zZWN0aW9uIGNoYWluICAqLwotCi1ib29sZWFuCi1fYmZkX3NhdmVfdm1zX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgZGF0YTsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICB2bXNfc2VjdGlvbiAqc3B0cjsKLQotICBpZiAoc2VjdGlvbi0+aW5kZXggPj0gVk1TX1NFQ1RJT05fQ09VTlQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoY291bnQgPT0gKGJmZF9zaXplX3R5cGUpMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgc3B0ciA9IGFkZF9uZXdfY29udGVudHMgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoc3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtY3B5IChzcHRyLT5jb250ZW50cyArIG9mZnNldCwgZGF0YSwgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEdldCB2bXNfc2VjdGlvbiBwb2ludGVyIHRvIHNhdmVkIGNvbnRlbnRzIGZvciBzZWN0aW9uICMgaW5kZXggICovCi0KLXZtc19zZWN0aW9uICoKLV9iZmRfZ2V0X3Ztc19zZWN0aW9uIChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA+PSAgVk1TX1NFQ1RJT05fQ09VTlQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtpbmRleF07Ci19Ci0KLQwKLS8qIE9iamVjdCBvdXRwdXQgcm91dGluZXMgICovCi0KLS8qIEJlZ2luIG5ldyByZWNvcmQgb3IgcmVjb3JkIGhlYWRlcgotICAgd3JpdGUgMiBieXRlcyByZWN0eXBlCi0gICB3cml0ZSAyIGJ5dGVzIHJlY29yZCBsZW5ndGggKGZpbGxlZCBpbiBhdCBmbHVzaCkKLSAgIHdyaXRlIDIgYnl0ZXMgaGVhZGVyIHR5cGUgKG9tbWl0dGVkIGlmIHJlY2hlYWQgPT0gLTEpICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIHJlY3R5cGUsIHJlY2hlYWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHJlY3R5cGU7Ci0gICAgIGludCByZWNoZWFkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYmVnaW4odHlwZSAlZCwgaGVhZCAlZClcbiIsIHJlY3R5cGUsCi0JICAgICAgcmVjaGVhZCk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQscmVjdHlwZSk7Ci0KLSAgLyogc2F2ZSBjdXJyZW50IG91dHB1dCBwb3NpdGlvbiB0byBmaWxsIGluIGxlbmdodCBsYXRlciAgKi8KLQotICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCi0gICAgUFJJVihsZW5ndGhfcG9zKSA9IFBSSVYob3V0cHV0X3NpemUpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9iZWdpbjogbGVuZ3RoX3BvcyA9ICVkXG4iLAotCSAgICAgIFBSSVYobGVuZ3RoX3BvcykpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLDApOwkJLyogcGxhY2Vob2xkZXIgZm9yIGxlbmd0aCAqLwotCi0gIGlmIChyZWNoZWFkICE9IC0xKQotICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCxyZWNoZWFkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogU2V0IHJlY29yZC9zdWJyZWNvcmQgYWxpZ25tZW50ICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCBhbGlnbnRvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBhbGlnbnRvOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50KCVkKVxuIiwgYWxpZ250byk7Ci0jZW5kaWYKLQotICBQUklWKG91dHB1dF9hbGlnbm1lbnQpID0gYWxpZ250bzsKLSAgcmV0dXJuOwotfQotCi0KLS8qIFByZXBhcmUgZm9yIHN1YnJlY29yZCBmaWVsZHMgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc19vdXRwdXRfcHVzaChwdXNoZWRfc2l6ZSA9ICVkKVxuIiwgUFJJVihvdXRwdXRfc2l6ZSkpOwotI2VuZGlmCi0KLSAgUFJJVihwdXNoX2xldmVsKSsrOwotICBQUklWKHB1c2hlZF9zaXplKSA9IFBSSVYob3V0cHV0X3NpemUpOwotICByZXR1cm47Ci19Ci0KLQotLyogRW5kIG9mIHN1YnJlY29yZCBmaWVsZHMgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wb3AocHVzaGVkX3NpemUgPSAlZClcbiIsIFBSSVYocHVzaGVkX3NpemUpKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0gIFBSSVYobGVuZ3RoX3BvcykgPSAyOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc19vdXRwdXRfcG9wOiBsZW5ndGhfcG9zID0gJWRcbiIsIFBSSVYobGVuZ3RoX3BvcykpOwotI2VuZGlmCi0KLSAgUFJJVihwdXNoZWRfc2l6ZSkgPSAwOwotICBQUklWKHB1c2hfbGV2ZWwpLS07Ci0gIHJldHVybjsKLX0KLQotCi0vKiBGbHVzaCB1bndyaXR0ZW4gb3V0cHV0LCBlbmRzIGN1cnJlbnQgcmVjb3JkICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHJlYWxfc2l6ZSA9IFBSSVYob3V0cHV0X3NpemUpOwotICBpbnQgYWxpZ25jb3VudDsKLSAgaW50IGxlbmd0aDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZmx1c2gocmVhbF9zaXplID0gJWQsIHB1c2hlZF9zaXplICVkIGF0IGxlbnBvcyAlZClcbiIsCi0JICAgICAgcmVhbF9zaXplLCBQUklWKHB1c2hlZF9zaXplKSwgUFJJVihsZW5ndGhfcG9zKSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCi0gICAgbGVuZ3RoID0gcmVhbF9zaXplIC0gUFJJVihwdXNoZWRfc2l6ZSk7Ci0gIGVsc2UKLSAgICBsZW5ndGggPSByZWFsX3NpemU7Ci0KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybjsKLSAgYWxpZ25jb3VudCA9IChQUklWKG91dHB1dF9hbGlnbm1lbnQpCi0JCS0gKGxlbmd0aCAlIFBSSVYob3V0cHV0X2FsaWdubWVudCkpKSAlIFBSSVYob3V0cHV0X2FsaWdubWVudCk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiYWxpZ246IGFkZGluZyAlZCBieXRlc1xuIiwgYWxpZ25jb3VudCk7Ci0jZW5kaWYKLQotICB3aGlsZShhbGlnbmNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIFBSSVYob3V0cHV0X2J1ZilbcmVhbF9zaXplKytdID0gMDsKLSNpZiAwCi0gICAgICAvKiB0aGlzIGlzIHdoeSBJICpsb3ZlKiB2bXM6IGluY29uc2lzdGVuY3kgOi19Ci0JIGFsaWdubWVudCBpcyBhZGRlZCB0byB0aGUgc3VicmVjb3JkIGxlbmd0aAotCSBidXQgbm90IHRvIHRoZSByZWNvcmQgbGVuZ3RoICAqLwotICAgICAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPiAwKQotI2VuZGlmCi0JbGVuZ3RoKys7Ci0gICAgfQotCi0gIC8qIHB1dCBsZW5ndGggdG8gYnVmZmVyICAqLwotICBQUklWKG91dHB1dF9zaXplKSA9IFBSSVYobGVuZ3RoX3Bvcyk7Ci0gIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgKHVuc2lnbmVkIGludClsZW5ndGgpOwotCi0gIGlmIChQUklWKHB1c2hfbGV2ZWwpID09IDApCi0gICAgewotI2lmbmRlZiBWTVMKLQkvKiB3cml0ZSBsZW5ndGggZmlyc3QsIHNlZSBGRl9GT1JFSUdOIGluIHRoZSBpbnB1dCByb3V0aW5lcyAqLwotICAgICAgZndyaXRlIChQUklWKG91dHB1dF9idWYpKzIsIDIsIDEsIChGSUxFICopYWJmZC0+aW9zdHJlYW0pOwotI2VuZGlmCi0gICAgICBmd3JpdGUgKFBSSVYob3V0cHV0X2J1ZiksIHJlYWxfc2l6ZSwgMSwgKEZJTEUgKilhYmZkLT5pb3N0cmVhbSk7Ci0KLSAgICAgIFBSSVYob3V0cHV0X3NpemUpID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQUklWKG91dHB1dF9zaXplKSA9IHJlYWxfc2l6ZTsKLSAgICAgIFBSSVYocHVzaGVkX3NpemUpID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybjsKLX0KLQotCi0vKiBFbmQgcmVjb3JkIG91dHB1dCAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZW5kXG4iKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIGNoZWNrIHJlbWFpbmluZyBidWZmZXIgc2l6ZQotCi0gICByZXR1cm4gd2hhdCdzIGxlZnQuICAqLwotCi1pbnQKLV9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgc2l6ZSkKLSAgICBiZmQgKmFiZmQ7Ci0gICAgaW50IHNpemU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9jaGVjayglZClcbiIsIHNpemUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIChNQVhfT1VUUkVDX1NJWkUgLSAoUFJJVihvdXRwdXRfc2l6ZSkgKyBzaXplICsgTUlOX09VVFJFQ19MVUZUKSk7Ci19Ci0KLQotLyogT3V0cHV0IGJ5dGUgKDggYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2J5dGUoJTAyeClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSAxOwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IHNob3J0ICgxNiBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X3Nob3J0ICglMDR4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF8xNiAoYWJmZCwgdmFsdWUgJiAweGZmZmYsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDI7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgbG9uZyAoMzIgYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9sb25nICglMDhseClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSA0OwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IHF1YWQgKDY0IGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1cXVhZCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X3F1YWQoJTAxNmx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF82NChhYmZkLCB2YWx1ZSwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gODsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBjLXN0cmluZyBhcyBjb3VudGVkIHN0cmluZyAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKnZhbHVlOwotewotaW50IGxlbjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCglcylcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGxlbiA9IHN0cmxlbiAodmFsdWUpOwotICBpZiAobGVuID09IDApCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB6ZXJvIGJ5dGVzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKGxlbiA+IDI1NSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIl9iZmRfdm1zX291dHB1dF9jb3VudGVkIGNhbGxlZCB3aXRoIHRvbyBtYW55IGJ5dGVzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIGxlbiAmIDB4ZmYpOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKil2YWx1ZSwgbGVuKTsKLX0KLQotCi0vKiBPdXRwdXQgY2hhcmFjdGVyIGFyZWEgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBkYXRhLCBsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2R1bXAoJWQpXG4iLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybjsKLQotICBtZW1jcHkgKFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSwgZGF0YSwgbGVuZ3RoKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gbGVuZ3RoOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgY291bnQgYnl0ZXMgb2YgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCB2YWx1ZSwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHZhbHVlOwotICAgICBpbnQgY291bnQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9maWxsKHZhbCAlMDJ4IHRpbWVzICVkKVxuIiwgdmFsdWUsIGNvdW50KTsKLSNlbmRpZgotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybjsKLSAgbWVtc2V0IChQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSksIHZhbHVlLCBjb3VudCk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IGNvdW50OwotCi0gIHJldHVybjsKLX0KLQotLyogdGhpcyBoYXNoIHJvdXRpbmUgYm9ycm93ZWQgZnJvbSBHTlUtRU1BQ1MsIGFuZCBzdHJlbmd0aGVuZWQgc2xpZ2h0bHkgIEVSWSovCi0KLXN0YXRpYyBpbnQKLWhhc2hfc3RyaW5nIChwdHIpCi0gICAgIGNvbnN0IGNoYXIgKnB0cjsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gcCArIHN0cmxlbiAocHRyKTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOwotICByZWdpc3RlciBpbnQgaGFzaCA9IDA7Ci0KLSAgd2hpbGUgKHAgIT0gZW5kKQotICAgIHsKLSAgICAgIGMgPSAqcCsrOwotICAgICAgaGFzaCA9ICgoaGFzaCA8PCAzKSArIChoYXNoIDw8IDE1KSArIChoYXNoID4+IDI4KSArIGMpOwotICAgIH0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgbGVuZ3RoLWhhc2hlZCBWTVMgc3ltYm9sIG5hbWUgKGxpbWl0ZWQgdG8gbWF4bGVuIGNoYXJzKS4gICovCi0KLWNoYXIgKgotX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBpbiwgbWF4bGVuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmluOwotICAgICBpbnQgbWF4bGVuOwotewotICBsb25nIGludCBpbml0OwotICBsb25nIGludCByZXN1bHQ7Ci0gIGludCBpbl9sZW47Ci0gIGNoYXIgKnBudCA9IDA7Ci0gIGNoYXIgKm5ld19uYW1lOwotICBjb25zdCBjaGFyICpvbGRfbmFtZTsKLSAgaW50IGk7Ci0gIHN0YXRpYyBjaGFyIG91dGJ1ZltFT0JKX1NfQ19TWU1TSVorMV07Ci0gIGNoYXIgKm91dCA9IG91dGJ1ZjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoNCwgIl9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCBcIiVzXCJcbiIsIGluKTsKLSNlbmRpZgotCi0gIGlmIChtYXhsZW4gPiBFT0JKX1NfQ19TWU1TSVopCi0gICAgbWF4bGVuID0gRU9CSl9TX0NfU1lNU0laOwotCi0gIG5ld19uYW1lID0gb3V0OwkJLyogc2F2ZSB0aGlzIGZvciBsYXRlci4gICovCi0KLSAgLyogV2UgbWF5IG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHN5bWJvbCwgc2F2ZSB0aGUgaGFzaCBmb3IgbGF0ZXIuICAqLwotCi0gIGluX2xlbiA9IHN0cmxlbiAoaW4pOwotCi0gIHJlc3VsdCA9IChpbl9sZW4gPiBtYXhsZW4pID8gaGFzaF9zdHJpbmcgKGluKSA6IDA7Ci0KLSAgb2xkX25hbWUgPSBpbjsKLQotICAvKiBEbyB0aGUgbGVuZ3RoIGNoZWNraW5nLiAgKi8KLQotICBpZiAoaW5fbGVuIDw9IG1heGxlbikKLSAgICB7Ci0gICAgICBpID0gaW5fbGVuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSkKLQlpID0gbWF4bGVuLTk7Ci0gICAgICBlbHNlCi0JaSA9IG1heGxlbjsKLSAgICB9Ci0KLSAgc3RybmNweSAob3V0LCBpbiwgaSk7Ci0gIGluICs9IGk7Ci0gIG91dCArPSBpOwotCi0gIGlmICgoaW5fbGVuID4gbWF4bGVuKQotICAgICAgJiYgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykpCi0gICAgc3ByaW50ZiAob3V0LCAiXyUwOHgiLCByZXN1bHQpOwotICBlbHNlCi0gICAgKm91dCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDQsICItLT4gWyVkXVwiJXNcIlxuIiwgc3RybGVuIChvdXRidWYpLCBvdXRidWYpOwotI2VuZGlmCi0KLSAgaWYgKGluX2xlbiA+IG1heGxlbgotCSYmIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JJiYgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpKQotICAgIHByaW50ZiAoXygiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iKSwgb2xkX25hbWUsIG5ld19uYW1lKTsKLQotICByZXR1cm4gb3V0YnVmOwotfQotCi0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLW5ld19zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXN5bWJvbCAqc3ltYm9sOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg3LCAgIm5ld19zeW1ib2wgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0KLSAgc3ltYm9sID0gX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3ltYm9sID09IDApCi0gICAgcmV0dXJuIHN5bWJvbDsKLSAgc3ltYm9sLT5uYW1lID0gbmFtZTsKLSAgc3ltYm9sLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQkZEX1VORF9TRUNUSU9OX05BTUUpOwotCi0gIHJldHVybiBzeW1ib2w7Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGVudGVyIGEgbmV3IHByaXZhdGUgc3ltYm9sLiAgKi8KLQotdm1zX3N5bWJvbF9lbnRyeSAqCi1fYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDYsICAiX2JmZF92bXNfZW50ZXJfc3ltYm9sICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotCi0gIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKikKLQkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGVudHJ5ID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDgsICAiY3JlYXRpbmcgaGFzaCBlbnRyeSBmb3IgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0gICAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoZW50cnkgIT0gMCkKLQl7Ci0JICBhc3ltYm9sICpzeW1ib2w7Ci0JICBzeW1ib2wgPSBuZXdfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzeW1ib2wgIT0gMCkKLQkgICAgewotCSAgICAgIGVudHJ5LT5zeW1ib2wgPSBzeW1ib2w7Ci0JICAgICAgUFJJVihnc2Rfc3ltX2NvdW50KSsrOwotCSAgICAgIGFiZmQtPnN5bWNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZW50cnkgPSAwOwotCX0KLSAgICAgIGVsc2UKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oImZhaWxlZCB0byBlbnRlciAlcyIpLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoOCwgICJmb3VuZCBoYXNoIGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDcsICItPiBlbnRyeSAlcCwgZW50cnktPnN5bWJvbCAlcFxuIiwgZW50cnksIGVudHJ5LT5zeW1ib2wpOwotI2VuZGlmCi0gIHJldHVybiBlbnRyeTsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMtdGlyLmMgYi9iZmQvdm1zLXRpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODJmNTJiLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMtdGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDg5ICswLDAgQEAKLS8qIHZtcy10aXIuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVElSIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIEVUSVIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotCi0gICBnbyBhbmQgcmVhZCB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsIChlc3AuIGFwcGVuZGl4IEIpCi0gICBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0J3MgZ29pbmcgb24gaGVyZSA6LSkKLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHlwZSBhYmJyZXZpYXRpb25zIGFyZSB1c2VkOgotCi0JY3MJY291bnRlZCBzdHJpbmcgKGFzY2lpIHN0cmluZyB3aXRoIGxlbmd0aCBieXRlKQotCWJ5CWJ5dGUgKDEgYnl0ZSkKLQlzaAlzaG9ydCAoMiBieXRlLCAxNiBiaXQpCi0JbHcJbG9uZ3dvcmQgKDQgYnl0ZSwgMzIgYml0KQotCXF3CXF1YWR3b3JkICg4IGJ5dGUsIDY0IGJpdCkKLQlkYQlkYXRhIHN0cmVhbSAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotc3RhdGljIHZvaWQgaW1hZ2Vfc2V0X3B0ciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBwc2VjdCwgdXF1YWQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV9pbmNfcHRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgdXF1YWQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV9kdW1wIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfYiBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfdyBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfbCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgdmFsdWUpKTsKLXN0YXRpYyB2b2lkIGltYWdlX3dyaXRlX3EgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCB2YWx1ZSkpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotY2hlY2tfc2VjdGlvbiAoYWJmZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IG9mZnNldDsKLQotICBvZmZzZXQgPSBQUklWKGltYWdlX3B0cikgLSBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50czsKLSAgaWYgKChvZmZzZXQgKyBzaXplKSA+IFBSSVYoaW1hZ2Vfc2VjdGlvbiktPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyA9IGJmZF9yZWFsbG9jIChQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cywgb2Zmc2V0ICsgc2l6ZSk7Ci0gICAgICBpZiAoUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMgPT0gMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk5vIE1lbSAhIikpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPl9yYXdfc2l6ZSA9IG9mZnNldCArIHNpemU7Ci0gICAgICBQUklWKGltYWdlX3B0cikgPSBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyArIG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHJvdXRpbmVzIHRvIGZpbGwgc2VjdGlvbnMgY29udGVudHMgZHVyaW5nIHRpci9ldGlyIHJlYWQgKi8KLQotLyogSW5pdGlhbGl6ZSBpbWFnZSBidWZmZXIgcG9pbnRlciB0byBiZSBmaWxsZWQgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgb2Zmc2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBwc2VjdDsKLSAgICAgdXF1YWQgb2Zmc2V0OwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImltYWdlX3NldF9wdHIgKCVkPSVzLCAlZClcbiIsCi0JCXBzZWN0LCBQUklWKHNlY3Rpb25zKVtwc2VjdF0tPm5hbWUsIG9mZnNldCk7Ci0jZW5kaWYKLQotICBQUklWKGltYWdlX3B0cikgPSBQUklWKHNlY3Rpb25zKVtwc2VjdF0tPmNvbnRlbnRzICsgb2Zmc2V0OwotICBQUklWKGltYWdlX3NlY3Rpb24pID0gUFJJVihzZWN0aW9ucylbcHNlY3RdOwotICByZXR1cm47Ci19Ci0KLQotLyogSW5jcmVtZW50IGltYWdlIGJ1ZmZlciBwb2ludGVyIGJ5IG9mZnNldCAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX2luY19wdHIgKGFiZmQsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICB1cXVhZCBvZmZzZXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiaW1hZ2VfaW5jX3B0ciAoJWQpXG4iLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgUFJJVihpbWFnZV9wdHIpICs9IG9mZnNldDsKLQotICByZXR1cm47Ci19Ci0KLQotLyogRHVtcCBtdWx0aXBsZSBieXRlcyB0byBzZWN0aW9uIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBzaXplLCBvZmZzZXQpCi0gICAgYmZkICphYmZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICBpbnQgc2l6ZTsKLSAgICBpbnQgb2Zmc2V0OwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoOCwgImltYWdlX2R1bXAgZnJvbSAoJXAsICVkKSB0byAoJXApXG4iLCBwdHIsIHNpemUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIF9iZmRfaGV4ZHVtcCAoOSwgcHRyLCBzaXplLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCBzaXplKSkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUgKHNpemUtLSA+IDApCi0gICAgKlBSSVYoaW1hZ2VfcHRyKSsrID0gKnB0cisrOwotICByZXR1cm47Ci19Ci0KLQotLyogV3JpdGUgYnl0ZSB0byBzZWN0aW9uIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX2IoJTAyeClcbiIsIChpbnQpdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCAxKSkKLSAgICByZXR1cm47Ci0KLSAgKlBSSVYoaW1hZ2VfcHRyKSsrID0gKHZhbHVlICYgMHhmZik7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSAyLWJ5dGUgd29yZCB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX3cgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDYsICJpbWFnZV93cml0ZV93KCUwNHgpXG4iLCAoaW50KXZhbHVlKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKGlzX3ZheCkgJiYgY2hlY2tfc2VjdGlvbiAoYWJmZCwgMikpCi0gICAgcmV0dXJuOwotCi0gIGJmZF9wdXRsMTYgKHZhbHVlLCBQUklWKGltYWdlX3B0cikpOwotICBQUklWKGltYWdlX3B0cikgKz0gMjsKLQotICByZXR1cm47Ci19Ci0KLQotLyogV3JpdGUgNC1ieXRlIGxvbmcgdG8gaW1hZ2UgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV93cml0ZV9sIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX2wgKCUwOGx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCA0KSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGwzMiAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSA0OwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSA4LWJ5dGUgcXVhZCB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX3EgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX3EgKCUwMTZseClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKGlzX3ZheCkgJiYgY2hlY2tfc2VjdGlvbiAoYWJmZCwgOCkpCi0gICAgcmV0dXJuOwotCi0gIGJmZF9wdXRsNjQgKHZhbHVlLCBQUklWKGltYWdlX3B0cikpOwotICBQUklWKGltYWdlX3B0cikgKz0gODsKLQotICByZXR1cm47Ci19Ci0MCi0KLSNkZWZpbmUgSElHSEJJVChvcCkgKChvcCAmIDB4ODAwMDAwMDBMKSA9PSAweDgwMDAwMDAwTCkKLQotLyogZXRpcl9zdGEKLSAgCi0gICB2bXMgc3RhY2sgY29tbWFuZHMKLSAgCi0gICBoYW5kbGUgc3RhX3h4eCBjb21tYW5kcyBpbiBldGlyIHNlY3Rpb24KLSAgIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICAKLSAgIHNlZSB0YWJsZSBCLTggb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RhIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YSAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIHN0YWNrICovCi0KLSAgICAgIC8qIHN0YWNrIGdsb2JhbAotCSAgIGFyZzogY3MJc3ltYm9sIG5hbWUKLQotCSAgIHN0YWNrIDMyIGJpdCB2YWx1ZSBvZiBzeW1ib2wgKGhpZ2ggYml0cyBzZXQgdG8gMCkgICovCi0KLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX0dCTDoKLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCQkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgIkVUSVJfU19DX1NUQV9HQkw6IG5vIHN5bWJvbCBcIiVzXCJcbiIsIG5hbWUpOwotI2VuZGlmCi0JICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKTAsIC0xKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSksIC0xKTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0JLyogc3RhY2sgbG9uZ3dvcmQKLQkgICBhcmc6IGx3CXZhbHVlCi0KLQkgICBzdGFjayAzMiBiaXQgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDY0IGJpdCAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfTFc6Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKWJmZF9nZXRsMzIgKHB0ciksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0JLyogc3RhY2sgZ2xvYmFsCi0JICAgYXJnOiBxdwl2YWx1ZQotCi0JICAgc3RhY2sgNjQgYml0IHZhbHVlIG9mIHN5bWJvbAkgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfUVc6Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKWJmZF9nZXRsNjQocHRyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0Ci0JICAgYXJnOiBsdwlzZWN0aW9uIGluZGV4Ci0JICAJcXcJc2lnbmVkIHF1YWR3b3JkIG9mZnNldCAobG93IDMyIGJpdHMpCi0KLQkgICBzdGFjayBxdyBhcmd1bWVudCBhbmQgc2VjdGlvbiBpbmRleAotCSAgIChzZWUgRVRJUl9TX0NfU1RPX09GRiwgRVRJUl9TX0NfQ1RMX1NFVFJCKSAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfUFE6Ci0gIAl7Ci0JICB1cXVhZCBkdW1teTsKLQkgIGludCBwc2VjdDsKLQotCSAgcHNlY3QgPSBiZmRfZ2V0bDMyIChwdHIpOwotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkJhZCBzZWN0aW9uIGluZGV4IGluIEVUSVJfU19DX1NUQV9QUSIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGR1bW15ID0gYmZkX2dldGw2NCAocHRyKzQpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQkvKiBhbGwgbm90IHN1cHBvcnRlZCAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfTEk6Ci0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9NT0Q6Ci0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9DS0FSRzoKLQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5zdXBwb3J0ZWQgU1RBIGNtZCAlZCIpLCBjbWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RBIGNtZCAlZCIpLCBjbWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YSB0cnVlXG4iKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotICAgZXRpcl9zdG8KLSAgCi0gICB2bXMgc3RvcmUgY29tbWFuZHMKLSAgCi0gICBoYW5kbGUgc3RvX3h4eCBjb21tYW5kcyBpbiBldGlyIHNlY3Rpb24KLSAgIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICAKLSAgIHNlZSB0YWJsZSBCLTkgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RvIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHVxdWFkIGR1bW15OwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0byAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLQotICAgICAgLyogc3RvcmUgYnl0ZTogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0I6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSNpZiAwCi0gICAgICBpZiAoaXNfc2hhcmUpCQkvKiBGSVhNRSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUT19COiBieXRlIGZpeHVwcyBub3Qgc3VwcG9ydGVkIik7Ci0jZW5kaWYKLSAgICAgIGltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIHdvcmQ6IHBvcCBzdGFjaywgd3JpdGUgd29yZAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19XOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0jaWYgMAotICAgICAgaWYgKGlzX3NoYXJlKQkJLyogRklYTUUgKi8KLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJFVElSX1NfQ19TVE9fQjogd29yZCBmaXh1cHMgbm90IHN1cHBvcnRlZCIpOwotI2VuZGlmCi0gICAgICBpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGxvbmd3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIGxvbmd3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0xXOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotICAgICAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdG9yZSBxdWFkd29yZDogcG9wIHN0YWNrLCB3cml0ZSBxdWFkd29yZAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19RVzoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLSAgICAgIGltYWdlX3dyaXRlX3EgKGFiZmQsIGR1bW15KTsJCS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGltbWVkaWF0ZSByZXBlYXRlZDogcG9wIHN0YWNrIGZvciByZXBlYXQgY291bnQKLQkgYXJnOiBsdwlieXRlIGNvdW50Ci0JIGRhCWRhdGEgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19JTU1SOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCXNpemUgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoZHVtbXktLSA+IDBMKQotCSAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyKzQsIHNpemUsIDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGdsb2JhbDogd3JpdGUgc3ltYm9sIHZhbHVlCi0JIGFyZzogY3MJZ2xvYmFsIHN5bWJvbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fR0JMOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCWlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICB7Ci0JICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0dCTDogbm8gc3ltYm9sIFwiJXNcIiIpLAotCQkJCSAgIG5hbWUpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdG9yZSBjb2RlIGFkZHJlc3M6IHdyaXRlIGFkZHJlc3Mgb2YgZW50cnkgcG9pbnQKLQkgYXJnOiBjcwlnbG9iYWwgc3ltYm9sIG5hbWUgKHByb2NlZHVyZSkgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19DQToKLSAgICAgIHsKLQl2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQljaGFyICpuYW1lOwotCi0JbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKSBiZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fQ0E6IG5vIHN5bWJvbCBcIiVzXCIiKSwKLQkJCQkgICBuYW1lKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCWVsc2UKLQkgIGltYWdlX3dyaXRlX3EgKGFiZmQsICh1cXVhZCkoZW50cnktPnN5bWJvbC0+dmFsdWUpKTsJLyogRklYTUUsIHJlbG9jICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbm90IHN1cHBvcnRlZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1JCOgotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0FCOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fUkIvQUI6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIHN0b3JlIG9mZnNldCB0byBwc2VjdDogcG9wIHN0YWNrLCBhZGQgbG93IDMyIGJpdHMgdG8gYmFzZSBvZiBwc2VjdAotICAgICAgIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX09GRjoKLSAgICAgIHsKLQl1cXVhZCBxOwotCWludCBwc2VjdDsKLQotCXEgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JcSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCWltYWdlX3dyaXRlX3EgKGFiZmQsIHEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGltbWVkaWF0ZQotCSBhcmc6IGx3CWNvdW50IG9mIGJ5dGVzCi0JIGRhCWRhdGEgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19JTU06Ci0gICAgICB7Ci0JaW50IHNpemU7Ci0KLQlzaXplID0gYmZkX2dldGwzMiAocHRyKTsKLQlpbWFnZV9kdW1wIChhYmZkLCBwdHIrNCwgc2l6ZSwgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogdGhpcyBjb2RlIGlzICdyZXNlcnZlZCB0byBkaWdpdGFsJyBhY2NvcmRpbmcgdG8gdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCwKLQkgaG93ZXZlciBpdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIERFQyBDIGNvbXBpbGVyIGFuZCBkZWZpbmVkIGluIHRoZSBpbmNsdWRlIGZpbGUuCi0JIEZJWE1FLCBzaW5jZSB0aGUgZm9sbG93aW5nIGlzIGp1c3QgYSBndWVzcwotCSBzdG9yZSBnbG9iYWwgbG9uZ3dvcmQ6IHN0b3JlIDMyYml0IHZhbHVlIG9mIHN5bWJvbAotCSBhcmc6IGNzCXN5bWJvbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fR0JMX0xXOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCWlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICB7Ci0jaWYgVk1TX0RFQlVHCi0JICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiRVRJUl9TX0NfU1RPX0dCTF9MVzogbm8gc3ltYm9sIFwiJXNcIlxuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpMCk7CS8qIEZJWE1FLCByZWxvYyAqLwotCSAgfQotCWVsc2UKLQkgIGltYWdlX3dyaXRlX2wgKGFiZmQsICh1bnNpZ25lZCBsb25nKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fTFBfUFNCOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fTFBfUFNCOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fSElOVF9HQkw6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19ISU5UX0dCTDogbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fSElOVF9QUzoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0hJTlRfUFM6IG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBzdGFjayBvcGVyYXRvciBjb21tYW5kcwotICAgYWxsIDMyIGJpdCBzaWduZWQgYXJpdGhtZXRpYwotICAgYWxsIHdvcmQganVzdCBsaWtlIGEgc3RhY2sgY2FsY3VsYXRvcgotICAgYXJndW1lbnRzIGFyZSBwb3BwZWQgZnJvbSBzdGFjaywgcmVzdWx0cyBhcmUgcHVzaGVkIG9uIHN0YWNrCi0gIAotICAgc2VlIHRhYmxlIEItMTAgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfb3ByIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIGxvbmcgb3AxLCBvcDI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX29wciAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIG9wZXJhdGlvbiAqLwotCi0gICAgICAvKiBuby1vcCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX05PUDoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBhZGQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9BREQ6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxICsgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN1YnRyYWN0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfU1VCOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMiAtIG9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBtdWx0aXBseSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX01VTDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgKiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZGl2aWRlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfRElWOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBpZiAob3AyID09IDApCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKTBMLCAtMSk7Ci0gICAgICBlbHNlCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDIgLyBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbG9naWNhbCBhbmQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9BTkQ6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxICYgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGxvZ2ljYWwgaW5jbHVzaXZlIG9yCSAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfSU9SOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSB8IG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBsb2dpY2FsIGV4Y2x1c2l2ZSBvciAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0VPUjoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgXiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbmVnYXRlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfTkVHOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkoLW9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBjb21wbGVtZW50ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQ09NOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxIF4gLTFMKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGluc2VydCBmaWVsZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0lOU1Y6Ci0gICAgICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfSU5TVjogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogYXJpdGhtZXRpYyBzaGlmdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FTSDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgaWYgKG9wMiA8IDApCQkvKiBzaGlmdCByaWdodCAqLwotCW9wMSA+Pj0gLW9wMjsKLSAgICAgIGVsc2UJCQkvKiBzaGlmdCBsZWZ0ICovCi0Jb3AxIDw8PSBvcDI7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpb3AxLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogdW5zaWduZWQgc2hpZnQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9VU0g6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9VU0g6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogcm90YXRlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfUk9UOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfUk9UOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHNlbGVjdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1NFTDoKLSAgICAgIGlmICgobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpICYgMHgwMUwpCi0JKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZClvcDEsIC0xKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogcmVkZWZpbmUgc3ltYm9sIHRvIGN1cnJlbnQgbG9jYXRpb24gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9SRURFRjoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX1JFREVGOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGRlZmluZSBhIGxpdGVyYWwgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ERkxJVDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX0RGTElUOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBPUFIgY21kICVkIiksIGNtZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogY29udHJvbCBjb21tYW5kcwotICAKLSAgIHNlZSB0YWJsZSBCLTExIG9mIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgICovCi0KLXN0YXRpYyBib29sZWFuCi1ldGlyX2N0bCAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICB1cXVhZAkgZHVtbXk7Ci0gIGludCBwc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfY3RsICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogc2V0IHJlbG9jYXRpb24gYmFzZTogcG9wIHN0YWNrLCBzZXQgaW1hZ2UgbG9jYXRpb24gY291bnRlcgotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9TRVRSQjoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgaW1hZ2Vfc2V0X3B0ciAoYWJmZCwgcHNlY3QsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBhdWdtZW50IHJlbG9jYXRpb24gYmFzZTogaW5jcmVtZW50IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIgYnkgb2Zmc2V0Ci0JIGFyZzogbHcJb2Zmc2V0IHZhbHVlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfQVVHUkI6Ci0gICAgICBkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7Ci0gICAgICBpbWFnZV9pbmNfcHRyIChhYmZkLCBkdW1teSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZGVmaW5lIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHNhdmUgbG9jYXRpb24gY291bnRlciB1bmRlciBpbmRleAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9ERkxPQzoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc2V0IGxvY2F0aW9uOiBwb3AgaW5kZXgsIHJlc3RvcmUgbG9jYXRpb24gY291bnRlciBmcm9tIGluZGV4Ci0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX1NUTE9DOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0YWNrIGRlZmluZWQgbG9jYXRpb246IHBvcCBpbmRleCwgcHVzaCBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfU1RLREw6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIENUTCBjbWQgJWQiKSwgY21kKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogc3RvcmUgY29uZGl0aW9uYWwgY29tbWFuZHMKLSAgCi0gICBzZWUgdGFibGUgQi0xMiBhbmQgQi0xMyBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9zdGMgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RjICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogMjAwIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpcgotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTFA6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19MUDogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDEgU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZQotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgY3MJcHJvY2VkdXJlIG5hbWUKLQkgYnkJc2lnbmF0dXJlIGxlbmd0aAotCSBkYQlzaWduYXR1cmUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MUF9QU0I6Ci0gICAgICBpbWFnZV9pbmNfcHRyIChhYmZkLCAxNik7CS8qIHNraXAgZW50cnkscHJvY3ZhbCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIDIwMiBTdG9yZS1jb25kaXRpb25hbCBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlnbG9iYWwgbmFtZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0dCTDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0dCTDogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDMgU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlwcm9jZWR1cmUgbmFtZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0dDQToKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0dDQTogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDQgU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBwc2VjdCArIG9mZnNldAotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgbHcJcHNlY3QgaW5kZXgKLQkgcXcJb2Zmc2V0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfUFM6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19QUzogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDUgU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IGFkZHJlc3Mgb2YgZ2xvYmFsCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OT1BfR0JMOgotCi0gICAgICAvKiAyMDYgU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX05PUF9QUzoKLQotICAgICAgLyogMjA3IFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQlNSX0dCTDoKLQotICAgICAgLyogMjA4IFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBwZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CU1JfUFM6Ci0KLSAgICAgIC8qIDIwOSBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xEQV9HQkw6Ci0KLSAgICAgIC8qIDIxMCBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgcHNlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xEQV9QUzoKLQotICAgICAgLyogMjExIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBvciBIaW50IGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CT0hfR0JMOgotCi0gICAgICAvKiAyMTIgU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQk9IX1BTOgotCi0gICAgICAvKiAyMTMgU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OQkhfR0JMOgotCi0gICAgICAvKiAyMTQgU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IHBzZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OQkhfUFM6Ci0vKiBGSVhNRSAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRVRJUl9TX0NfU1RDX3h4OiAoJWQpIG5vdCBzdXBwb3J0ZWQiLCBjbWQpOyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDMsICAiUmVzZXJ2ZWQgU1RDIGNtZCAlZCIsIGNtZCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGFzZWN0aW9uICoKLW5ld19zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGlkeDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGNoYXIgc25hbWVbMTZdOwotICBjaGFyICpuYW1lOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAgIm5ld19zZWN0aW9uICVkXG4iLCBpZHgpOwotI2VuZGlmCi0gIHNwcmludGYgKHNuYW1lLCBTRUNUSU9OX05BTUVfVEVNUExBVEUsIGlkeCk7Ci0KLSAgbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc25hbWUpICsgMSk7Ci0gIGlmIChuYW1lID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIHN0cmNweSAobmFtZSwgc25hbWUpOwotCi0gIHNlY3Rpb24gPSBiZmRfbWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChzZWN0aW9uID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDYsICAiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZCIsIG5hbWUpOwotI2VuZGlmCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc2VjdGlvbi0+X3Jhd19zaXplID0gMDsKLSAgc2VjdGlvbi0+dm1hID0gMDsKLSAgc2VjdGlvbi0+Y29udGVudHMgPSAwOwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSAwOwotICBzZWN0aW9uLT5uYW1lID0gbmFtZTsKLSAgc2VjdGlvbi0+aW5kZXggPSBpZHg7Ci0KLSAgcmV0dXJuIHNlY3Rpb247Ci19Ci0KLQotc3RhdGljIGludAotYWxsb2Nfc2VjdGlvbiAoYWJmZCwgaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpZHg7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAgImFsbG9jX3NlY3Rpb24gJWRcbiIsIGlkeCk7Ci0jZW5kaWYKLQotICBQUklWKHNlY3Rpb25zKSA9ICgoYXNlY3Rpb24gKiopCi0JCSAgICBiZmRfcmVhbGxvYyAoUFJJVihzZWN0aW9ucyksIChpZHgrMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gIGlmIChQUklWKHNlY3Rpb25zKSA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoUFJJVihzZWN0aW9uX2NvdW50KSA8PSBpZHgpCi0gICAgewotICAgICAgUFJJVihzZWN0aW9ucylbUFJJVihzZWN0aW9uX2NvdW50KV0gPSBuZXdfc2VjdGlvbiAoYWJmZCwgUFJJVihzZWN0aW9uX2NvdW50KSk7Ci0gICAgICBpZiAoUFJJVihzZWN0aW9ucylbUFJJVihzZWN0aW9uX2NvdW50KV0gPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBQUklWKHNlY3Rpb25fY291bnQpKys7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiB0aXJfc3RhCi0gKgotICogdmF4IHN0YWNrIGNvbW1hbmRzCi0gKgotICogaGFuZGxlIHN0YV94eHggY29tbWFuZHMgaW4gdGlyIHNlY3Rpb24KLSAqIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICoKLSAqIHNlZSB0YWJsZSA3LTMgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9zdGEgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBpbnQgY21kID0gKnB0cisrOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX3N0YSAlZFxuIiwgY21kKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgLyogc3RhY2sgKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfR0JMOgotCS8qCi0JICogc3RhY2sgZ2xvYmFsCi0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgMzIgYml0IHZhbHVlIG9mIHN5bWJvbCAoaGlnaCBiaXRzIHNldCB0byAwKQotCSAqLwotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0KLSAgICAgICAgICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLQotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSwgLTEpOwotCSAgcHRyICs9ICpwdHIgKyAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1NCOgotCS8qCi0JICogc3RhY2sgc2lnbmVkIGJ5dGUKLQkgKiBhcmc6IGJ5CXZhbHVlCi0JICoKLQkgKiBzdGFjayBieXRlIHZhbHVlLCBzaWduIGV4dGVuZCB0byAzMiBiaXQKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAobG9uZykqcHRyKyssIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1NXOgotCS8qCi0JICogc3RhY2sgc2lnbmVkIHNob3J0IHdvcmQKLQkgKiBhcmc6IHNoCXZhbHVlCi0JICoKLQkgKiBzdGFjayAxNiBiaXQgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDMyIGJpdAotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKWJmZF9nZXRsMTYocHRyKSwgLTEpOwotCXB0ciArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTFc6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgbG9uZ3dvcmQKLQkgKiBhcmc6IGx3CXZhbHVlCi0JICoKLQkgKiBzdGFjayAzMiBiaXQgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAobG9uZyliZmRfZ2V0bDMyIChwdHIpLCAtMSk7Ci0JcHRyICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9QQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV1BCOgotCS8qCi0JICogc3RhY2sgcHNlY3QgYmFzZSBwbHVzIGJ5dGUgb2Zmc2V0ICh3b3JkIGluZGV4KQotCSAqIGFyZzogYnkJc2VjdGlvbiBpbmRleAotCSAqCShzaAlzZWN0aW9uIGluZGV4KQotCSAqCWJ5CXNpZ25lZCBieXRlIG9mZnNldAotCSAqCi0JICovCi0gIAl7Ci0JICB1bnNpZ25lZCBsb25nIGR1bW15OwotCSAgaW50IHBzZWN0OwotCi0JICBpZiAoY21kID09IFRJUl9TX0NfU1RBX1BCKQotCSAgICBwc2VjdCA9ICpwdHIrKzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBzZWN0ID0gYmZkX2dldGwxNihwdHIpOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0KLQkgIGlmIChwc2VjdCA+PSBQUklWKHNlY3Rpb25fY291bnQpKQotCSAgICB7Ci0JICAgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgICB9Ci0KLQkgIGR1bW15ID0gKGxvbmcpKnB0cisrOwotCSAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIGR1bW15LCBwc2VjdCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1BXOgotICAgICAgY2FzZSBUSVJfU19DX1NUQV9XUFc6Ci0JLyoKLQkgKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgd29yZCBvZmZzZXQgKHdvcmQgaW5kZXgpCi0JICogYXJnOiBieQlzZWN0aW9uIGluZGV4Ci0JICoJKHNoCXNlY3Rpb24gaW5kZXgpCi0JICoJc2gJc2lnbmVkIHNob3J0IG9mZnNldAotCSAqCi0JICovCi0gIAl7Ci0JICB1bnNpZ25lZCBsb25nIGR1bW15OwotCSAgaW50IHBzZWN0OwotCi0JICBpZiAoY21kID09IFRJUl9TX0NfU1RBX1BXKQotCSAgICBwc2VjdCA9ICpwdHIrKzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBzZWN0ID0gYmZkX2dldGwxNihwdHIpOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0KLQkgIGlmIChwc2VjdCA+PSBQUklWKHNlY3Rpb25fY291bnQpKQotCSAgICB7Ci0JICAgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgICB9Ci0KLQkgIGR1bW15ID0gYmZkX2dldGwxNihwdHIpOyBwdHIrPTI7Ci0JICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfUEw6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dQTDoKLQkvKgotCSAqIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyBsb25nIG9mZnNldCAod29yZCBpbmRleCkKLQkgKiBhcmc6IGJ5CXNlY3Rpb24gaW5kZXgKLQkgKgkoc2gJc2VjdGlvbiBpbmRleCkKLQkgKglsdwlzaWduZWQgbG9uZ3dvcmQgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUEwpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOyBwdHIgKz0gNDsKLQkgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9VQjoKLQkvKgotCSAqIHN0YWNrIHVuc2lnbmVkIGJ5dGUKLQkgKiBhcmc6IGJ5CXZhbHVlCi0JICoKLQkgKiBzdGFjayBieXRlIHZhbHVlCi0JICovCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKnB0cisrLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9VVzoKLQkvKgotCSAqIHN0YWNrIHVuc2lnbmVkIHNob3J0IHdvcmQKLQkgKiBhcmc6IHNoCXZhbHVlCi0JICoKLQkgKiBzdGFjayAxNiBiaXQgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZyliZmRfZ2V0bDE2KHB0ciksIC0xKTsKLQlwdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0JGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0JLypGQUxMVEhSVSovCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0JLypGQUxMVEhSVSovCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2stZnJvbS1pbWFnZSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfRVBNOgotCS8qCi0JICogc3RhY2sgZW50cnkgcG9pbnQgbWFzawotCSAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLQkgKgotCSAqIHN0YWNrICh1bnNpZ25lZCkgZW50cnkgcG9pbnQgbWFzayBvZiBzeW1ib2wKLQkgKiBlcnIgaWYgc3ltYm9sIGlzIG5vIGVudHJ5IHBvaW50Ci0JICovCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQkgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHJldHVybiAwOwotCi0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1lbnRyeS1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfQ0tBUkc6Ci0JLyoKLQkgKiBjb21wYXJlIHByb2NlZHVyZSBhcmd1bWVudAotCSAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLQkgKglieQlhcmd1bWVudCBpbmRleAotCSAqCWRhCWFyZ3VtZW50IGRlc2NyaXB0b3IKLQkgKgotCSAqIGNvbXBhcmUgYXJndW1lbnQgZGVzY3JpcHRvciB3aXRoIHN5bWJvbCBhcmd1bWVudCAoQVJHJFZfUEFTU01FQ0gpCi0JICogYW5kIHN0YWNrIFRSVUUgKGFyZ3MgbWF0Y2gpIG9yIEZBTFNFIChhcmdzIGRvbnQgbWF0Y2gpIHZhbHVlCi0JICovCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUEFTU01FQ0ggbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIDFMLCAtMSk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTFNZOgotCS8qCi0JICogc3RhY2sgbG9jYWwgc3ltYm9sIHZhbHVlCi0JICogYXJnOglzaAllbnZpcm9ubWVudCBpbmRleAotCSAqCWNzCXN5bWJvbCBuYW1lCi0JICovCi0JewotCSAgaW50IGVudmlkeDsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgZW52aWR4ID0gYmZkX2dldGwxNihwdHIpOyBwdHIgKz0gMjsKLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1sb2NhbC1zeW1ib2wgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MSVQ6Ci0JLyoKLQkgKiBzdGFjayBsaXRlcmFsCi0gCSAqIGFyZzoJYnkJbGl0ZXJhbCBpbmRleAotCSAqCi0JICogc3RhY2sgbGl0ZXJhbAotCSAqLwotCXB0cisrOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1saXRlcmFsIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MRVBNOgotCS8qCi0JICogc3RhY2sgbG9jYWwgc3ltYm9sIGVudHJ5IHBvaW50IG1hc2sKLQkgKiBhcmc6CXNoCWVudmlyb25tZW50IGluZGV4Ci0JICoJY3MJc3ltYm9sIG5hbWUKLQkgKgotCSAqIHN0YWNrICh1bnNpZ25lZCkgZW50cnkgcG9pbnQgbWFzayBvZiBzeW1ib2wKLQkgKiBlcnIgaWYgc3ltYm9sIGlzIG5vIGVudHJ5IHBvaW50Ci0JICovCi0JewotCSAgaW50IGVudmlkeDsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgZW52aWR4ID0gYmZkX2dldGwxNihwdHIpOyBwdHIgKz0gMjsKLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxvY2FsLXN5bWJvbC1lbnRyeS1wb2ludC1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVEEgY21kICVkIiksIHB0clstMV0pOwotCXJldHVybiBOVUxMOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiB0aXJfc3RvCi0gKgotICogdmF4IHN0b3JlIGNvbW1hbmRzCi0gKgotICogaGFuZGxlIHN0b194eHggY29tbWFuZHMgaW4gdGlyIHNlY3Rpb24KLSAqIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICoKLSAqIHNlZSB0YWJsZSA3LTQgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9zdG8gKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICB1bnNpZ25lZCBsb25nIGR1bW15OwotICBpbnQgc2l6ZTsKLSAgaW50IHBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX3N0byAlZFxuIiwgKnB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKCpwdHIrKykKLSAgICB7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1NCOgotCS8qCi0JICogc3RvcmUgc2lnbmVkIGJ5dGU6IHBvcCBzdGFjaywgd3JpdGUgYnl0ZQotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fU1c6Ci0JLyoKLQkgKiBzdG9yZSBzaWduZWQgd29yZDogcG9wIHN0YWNrLCB3cml0ZSB3b3JkCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOwkvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xXOgotCS8qCi0JICogc3RvcmUgbG9uZ3dvcmQ6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fQkQ6Ci0JLyoKLQkgKiBzdG9yZSBieXRlIGRpc3BsYWNlZDogcG9wIHN0YWNrLCBzdWIgbGMrMSwgd3JpdGUgYnl0ZQotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWR1bW15IC09ICgoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hICsgMSk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1dEOgotCS8qCi0JICogc3RvcmUgd29yZCBkaXNwbGFjZWQ6IHBvcCBzdGFjaywgc3ViIGxjKzIsIHdyaXRlIHdvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlkdW1teSAtPSAoKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYSArIDIpOwotCWltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19MRDoKLQkvKgotCSAqIHN0b3JlIGxvbmcgZGlzcGxhY2VkOiBwb3Agc3RhY2ssIHN1YiBsYys0LCB3cml0ZSBsb25nCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JZHVtbXkgLT0gKChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWEgKyA0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xJOgotCS8qCi0JICogc3RvcmUgc2hvcnQgbGl0ZXJhbDogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSURSOgotCS8qCi0JICogc3RvcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQgZGF0YSByZWZlcmVuY2U6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKiBGSVhNRTogaW5jb21wbGV0ZSAhCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSUNSOgotCS8qCi0JICogc3RvcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSByZWZlcmVuY2U6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKiBGSVhNRTogaW5jb21wbGV0ZSAhCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgMHg5Zik7Ci0JaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SSVZCOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgaW1tZWRpYXRlIHZhcmlhYmxlIGJ5dGVzCi0JICogMS1ieXRlIGNvdW50IG4gZmllbGQgZm9sbG93ZWQgYnkgbiBieXRlcyBvZiBkYXRhCi0JICogcG9wIHN0YWNrLCB3cml0ZSBuIGJ5dGVzIDxzdGFjaz4gdGltZXMKLQkgKi8KLQlzaXplID0gKnB0cisrOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoZHVtbXktLSA+IDBMKQotCSAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBzaXplLCAwKTsKLQlwdHIgKz0gc2l6ZTsKLQlicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fQjoKLQkvKgotCSAqIHN0b3JlIGJ5dGUgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVzoKLQkvKgotCSAqIHN0b3JlIHdvcmQgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SQjoKLQkvKgotCSAqIHN0b3JlIHJlcGVhdGVkIGJ5dGUgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlzaXplID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JICBpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SVzoKLQkvKgotCSAqIHN0b3JlIHJlcGVhdGVkIHdvcmQgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlzaXplID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JICBpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUlNCOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19SU1c6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JMOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19WUFM6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1VTQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVVNXOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19SVUI6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JVVzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUElSUjoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaW1wbGVtZW50ZWQgU1RPIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKgotICogc3RhY2sgb3BlcmF0b3IgY29tbWFuZHMKLSAqIGFsbCAzMiBiaXQgc2lnbmVkIGFyaXRobWV0aWMKLSAqIGFsbCB3b3JkIGp1c3QgbGlrZSBhIHN0YWNrIGNhbGN1bGF0b3IKLSAqIGFyZ3VtZW50cyBhcmUgcG9wcGVkIGZyb20gc3RhY2ssIHJlc3VsdHMgYXJlIHB1c2hlZCBvbiBzdGFjawotICoKLSAqIHNlZSB0YWJsZSA3LTUgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9vcHIgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBsb25nIG9wMSwgb3AyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX29wciAlZFxuIiwgKnB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKCpwdHIrKykKLSAgICB7Ci0gIC8qIG9wZXJhdGlvbiAqLwotICAgICAgY2FzZSBUSVJfU19DX09QUl9OT1A6Ci0JLyoKLQkgKiBuby1vcAotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQUREOgotCS8qCi0JICogYWRkCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgKyBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9TVUI6Ci0JLyoKLQkgKiBzdWJ0cmFjdAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AyIC0gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfTVVMOgotCS8qCi0JICogbXVsdGlwbHkKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSAqIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0RJVjoKLQkvKgotCSAqIGRpdmlkZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAob3AyID09IDApCi0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykwTCwgLTEpOwotCWVsc2UKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDIgLyBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9BTkQ6Ci0JLyoKLQkgKiBsb2dpY2FsIGFuZAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxICYgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfSU9SOgotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JLyoKLQkgKiBsb2dpY2FsIGluY2x1c2l2ZSBvcgotCSAqLwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSB8IG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0VPUjoKLQkvKgotCSAqIGxvZ2ljYWwgZXhjbHVzaXZlIG9yCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgXiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9ORUc6Ci0JLyoKLQkgKiBuZWdhdGUKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKSgtb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQ09NOgotCS8qCi0JICogY29tcGxlbWVudAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSBeIC0xTCksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0lOU1Y6Ci0JLyoKLQkgKiBpbnNlcnQgZmllbGQKLQkgKi8KLQkodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAgKCJUSVJfU19DX09QUl9JTlNWIGluY29tcGxldGUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0FTSDoKLQkvKgotCSAqIGFyaXRobWV0aWMgc2hpZnQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQob3AxKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9BU0ggaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1VTSDoKLQkvKgotCSAqIHVuc2lnbmVkIHNoaWZ0Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWlmIChISUdIQklUKG9wMSkpCQkvKiBzaGlmdCByaWdodCAqLwotCSAgb3AyID4+PSBvcDE7Ci0JZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQkgIG9wMiA8PD0gb3AxOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMiwgLTEpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfVVNIIGluY29tcGxldGUiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9ST1Q6Ci0JLyoKLQkgKiByb3RhdGUKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQoMCkpCQkvKiBzaGlmdCByaWdodCAqLwotCSAgb3AyID4+PSBvcDE7Ci0JZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQkgIG9wMiA8PD0gb3AxOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMiwgLTEpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfUk9UIGluY29tcGxldGUiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9TRUw6Ci0JLyoKLQkgKiBzZWxlY3QKLQkgKi8KLQlpZiAoKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKSAmIDB4MDFMKQotCSAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQllbHNlCi0JICB7Ci0JICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMSwgLTEpOwotCSAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfUkVERUY6Ci0JLyoKLQkgKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbgotCSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfUkVERUYgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0RGTElUOgotCS8qCi0JICogZGVmaW5lIGEgbGl0ZXJhbAotCSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfREZMSVQgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgT1BSIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9jdGwgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotLyoKLSAqIGNvbnRyb2wgY29tbWFuZHMKLSAqCi0gKiBzZWUgdGFibGUgNy02IG9mIHRoZSBWQVgvVk1TIGxpbmtlciBtYW51YWwKLSAqLwotewotICB1bnNpZ25lZCBsb25nIGR1bW15OwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfY3RsICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfU0VUUkI6Ci0JLyoKLQkgKiBzZXQgcmVsb2NhdGlvbiBiYXNlOiBwb3Agc3RhY2ssIHNldCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICB7Ci0JICAgIGFsbG9jX3NlY3Rpb24gKGFiZmQsIHBzZWN0KTsKLQkgIH0KLQlpbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfQ1RMX0FVR1JCOgotCS8qCi0JICogYXVnbWVudCByZWxvY2F0aW9uIGJhc2U6IGluY3JlbWVudCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyIGJ5IG9mZnNldAotCSAqIGFyZzogbHcJb2Zmc2V0IHZhbHVlCi0JICovCi0JZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWltYWdlX2luY19wdHIgKGFiZmQsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX0NUTF9ERkxPQzoKLQkvKgotCSAqIGRlZmluZSBsb2NhdGlvbjogcG9wIGluZGV4LCBzYXZlIGxvY2F0aW9uIGNvdW50ZXIgdW5kZXIgaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX0NUTF9ERkxPQyBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfU1RMT0M6Ci0JLyoKLQkgKiBzZXQgbG9jYXRpb246IHBvcCBpbmRleCwgcmVzdG9yZSBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX1NUTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVElSX1NfQ19DVExfU1RLREw6Ci0JLyoKLQkgKiBzdGFjayBkZWZpbmVkIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHB1c2ggbG9jYXRpb24gY291bnRlciBmcm9tIGluZGV4Ci0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX0NUTF9TVEtETCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIENUTCBjbWQgJWQiKSwgcHRyWy0xXSk7Ci0JYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKgotICogaGFuZGxlIGNvbW1hbmQgZnJvbSBUSVIgc2VjdGlvbgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9jbWQgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBzdHJ1Y3QgewotICAgIGludCBtaW5jb2Q7Ci0gICAgaW50IG1heGNvZDsKLSAgICB1bnNpZ25lZCBjaGFyICogKCpleHBsYWluKShiZmQgKiwgdW5zaWduZWQgY2hhciAqKTsKLSAgfSB0aXJfdGFibGVbXSA9IHsKLSAgICB7IDAsCQkgVElSX1NfQ19NQVhTVEFDT0QsIHRpcl9zdGEgfQotICAgLHsgVElSX1NfQ19NSU5TVE9DT0QsIFRJUl9TX0NfTUFYU1RPQ09ELCB0aXJfc3RvIH0KLSAgICx7IFRJUl9TX0NfTUlOT1BSQ09ELCBUSVJfU19DX01BWE9QUkNPRCwgdGlyX29wciB9Ci0gICAseyBUSVJfU19DX01JTkNUTENPRCwgVElSX1NfQ19NQVhDVExDT0QsIHRpcl9jdGwgfQotICAgLHsgLTEsIC0xLCBOVUxMIH0KLSAgfTsKLSAgaW50IGkgPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAidGlyX2NtZCAlZC8leFxuIiwgKnB0ciwgKnB0cik7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgaWYgKCpwdHIgJiAweDgwKQkJCQkvKiBzdG9yZSBpbW1lZGlhdGUgKi8KLSAgICB7Ci0gICAgICBpID0gMTI4IC0gKCpwdHIrKyAmIDB4N2YpOwotICAgICAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBpLCAwKTsKLSAgICAgIHB0ciArPSBpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICh0aXJfdGFibGVbaV0ubWluY29kID49IDApCi0JewotCSAgaWYgKCAodGlyX3RhYmxlW2ldLm1pbmNvZCA8PSAqcHRyKSAKLQkgICAgJiYgKCpwdHIgPD0gdGlyX3RhYmxlW2ldLm1heGNvZCkpCi0JICAgIHsKLQkgICAgICBwdHIgPSB0aXJfdGFibGVbaV0uZXhwbGFpbiAoYWJmZCwgcHRyKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaSsrOwotCX0KLSAgICAgIGlmICh0aXJfdGFibGVbaV0ubWluY29kIDwgMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iaiBjb2RlICVkIG5vdCBmb3VuZCIpLCAqcHRyKTsKLQkgIHB0ciA9IDA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qIGhhbmRsZSBjb21tYW5kIGZyb20gRVRJUiBzZWN0aW9uICAqLwotCi1zdGF0aWMgaW50Ci1ldGlyX2NtZCAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICBzdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgbWluY29kOwotICAgIGludCBtYXhjb2Q7Ci0gICAgYm9vbGVhbiAoKmV4cGxhaW4pIFBBUkFNUygoYmZkICosIGludCwgdW5zaWduZWQgY2hhciAqKSk7Ci0gIH0gZXRpcl90YWJsZVtdID0gewotICAgIHsgRVRJUl9TX0NfTUlOU1RBQ09ELCBFVElSX1NfQ19NQVhTVEFDT0QsIGV0aXJfc3RhIH0sCi0gICAgeyBFVElSX1NfQ19NSU5TVE9DT0QsIEVUSVJfU19DX01BWFNUT0NPRCwgZXRpcl9zdG8gfSwKLSAgICB7IEVUSVJfU19DX01JTk9QUkNPRCwgRVRJUl9TX0NfTUFYT1BSQ09ELCBldGlyX29wciB9LAotICAgIHsgRVRJUl9TX0NfTUlOQ1RMQ09ELCBFVElSX1NfQ19NQVhDVExDT0QsIGV0aXJfY3RsIH0sCi0gICAgeyBFVElSX1NfQ19NSU5TVENDT0QsIEVUSVJfU19DX01BWFNUQ0NPRCwgZXRpcl9zdGMgfSwKLSAgICB7IC0xLCAtMSwgTlVMTCB9Ci0gIH07Ci0KLSAgaW50IGkgPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiZXRpcl9jbWQgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICB3aGlsZSAoZXRpcl90YWJsZVtpXS5taW5jb2QgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAoIChldGlyX3RhYmxlW2ldLm1pbmNvZCA8PSBjbWQpIAotCSYmIChjbWQgPD0gZXRpcl90YWJsZVtpXS5tYXhjb2QpKQotCXsKLQkgIGlmICghZXRpcl90YWJsZVtpXS5leHBsYWluIChhYmZkLCBjbWQsIHB0cikpCi0JICAgIHJldHVybiAtMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGkrKzsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJldGlyX2NtZDogPSAwXG4iKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIFJlY29yZHMgKE9CSiRDX1RJUikKLSAgIGhhbmRsZSB0aXIgcmVjb3JkICAqLwotCi1zdGF0aWMgaW50Ci1hbmFseXplX3RpciAoYWJmZCwgcHRyLCBsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotewotICB1bnNpZ25lZCBjaGFyICptYXhwdHI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX3RpcjogJWQgYnl0ZXNcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBtYXhwdHIgPSBwdHIgKyBsZW5ndGg7Ci0KLSAgd2hpbGUgKHB0ciA8IG1heHB0cikKLSAgICB7Ci0gICAgICBwdHIgPSB0aXJfY21kIChhYmZkLCBwdHIpOwotICAgICAgaWYgKHB0ciA9PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiBSZWNvcmRzIChFT0JKJENfRVRJUikKLSAgIGhhbmRsZSBldGlyIHJlY29yZCAgKi8KLQotc3RhdGljIGludAotYW5hbHl6ZV9ldGlyIChhYmZkLCBwdHIsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci17Ci0gIGludCBjbWQ7Ci0gIHVuc2lnbmVkIGNoYXIgKm1heHB0cjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX2V0aXI6ICVkIGJ5dGVzXG4iLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgbWF4cHRyID0gcHRyICsgbGVuZ3RoOwotCi0gIHdoaWxlIChwdHIgPCBtYXhwdHIpCi0gICAgewotICAgICAgY21kID0gYmZkX2dldGwxNiAocHRyKTsKLSAgICAgIGxlbmd0aCA9IGJmZF9nZXRsMTYgKHB0ciArIDIpOwotICAgICAgcmVzdWx0ID0gZXRpcl9jbWQgKGFiZmQsIGNtZCwgcHRyKzQpOwotICAgICAgaWYgKHJlc3VsdCAhPSAwKQotCWJyZWFrOwotICAgICAgcHRyICs9IGxlbmd0aDsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX2V0aXI6ID0gJWRcbiIsIHJlc3VsdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHByb2Nlc3MgRVRJUiByZWNvcmQKLSAgCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF90aXIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIGludCByZXN1bHQ7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJUSVIvRVRJUlxuIik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBFT0JKX1NfQ19FVElSOgotCVBSSVYodm1zX3JlYykgKz0gNDsJLyogc2tpcCB0eXBlLCBzaXplICovCi0JUFJJVihyZWNfc2l6ZSkgLT0gNDsKLQlyZXN1bHQgPSBhbmFseXplX2V0aXIgKGFiZmQsIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT0JKX1NfQ19USVI6Ci0JUFJJVih2bXNfcmVjKSArPSAxOwkvKiBza2lwIHR5cGUgKi8KLQlQUklWKHJlY19zaXplKSAtPSAxOwotCXJlc3VsdCA9IGFuYWx5emVfdGlyIChhYmZkLCBQUklWKHZtc19yZWMpLCBQUklWKHJlY19zaXplKSk7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJlc3VsdCA9IC0xOwotCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHByb2Nlc3MgRURCRyByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0gIAotICAgbm90IGltcGxlbWVudGVkIHlldCAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9kYmcgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAiREJHL0VEQkdcbiIpOwotI2VuZGlmCi0KLSAgYWJmZC0+ZmxhZ3MgfD0gKEhBU19ERUJVRyB8IEhBU19MSU5FTk8pOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBwcm9jZXNzIEVUQlQgcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgotICAKLSAgIG5vdCBpbXBsZW1lbnRlZCB5ZXQgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfdGJ0IChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIlRCVC9FVEJUXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIHByb2Nlc3MgTE5LIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2xuayAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJMTktcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoJCQkJCQkJCQkqLwotLyoJV1JJVEUgRVRJUiBTRUNUSU9OCQkJCQkJKi8KLS8qCQkJCQkJCQkJKi8KLS8qCXRoaXMgaXMgc3RpbGwgdW5kZXIgY29uc3RydWN0aW9uIGFuZCB0aGVyZWZvcmUgbm90IGRvY3VtZW50ZWQJKi8KLS8qCQkJCQkJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHN0YXJ0X2V0aXJfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IGluZGV4LCB1cXVhZCBvZmZzZXQsIGJvb2xlYW4ganVzdG9mZnNldCkpOwotc3RhdGljIHZvaWQgc3RvX2ltbSBQQVJBTVMgKChiZmQgKmFiZmQsIHZtc19zZWN0aW9uICpzcHRyLCBiZmRfdm1hIHZhZGRyLCBpbnQgaW5kZXgpKTsKLXN0YXRpYyB2b2lkIGVuZF9ldGlyX3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICB2bXNfc2VjdGlvbiAqc3B0cjsKLSAgICAgYmZkX3ZtYSB2YWRkcjsKLSAgICAgaW50IGluZGV4OwotewotICBpbnQgc2l6ZTsKLSAgaW50IHNzaXplOwotICB1bnNpZ25lZCBjaGFyICpjcHRyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg4LCAic3RvX2ltbSAlZCBieXRlc1xuIiwgc3B0ci0+c2l6ZSk7Ci0gIF9iZmRfaGV4ZHVtcCAoOSwgc3B0ci0+Y29udGVudHMsIChpbnQpc3B0ci0+c2l6ZSwgKGludCl2YWRkcik7Ci0jZW5kaWYKLQotICBzc2l6ZSA9IHNwdHItPnNpemU7Ci0gIGNwdHIgPSBzcHRyLT5jb250ZW50czsKLQotICB3aGlsZSAoc3NpemUgPiAwKQotICAgIHsKLQotICAgICAgc2l6ZSA9IHNzaXplOwkJCQkvKiB0cnkgYWxsIHRoZSByZXN0ICovCi0KLSAgICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIHNpemUpIDwgMCkKLQl7CQkJCQkvKiBkb2Vzbid0IGZpdCwgc3BsaXQgISAqLwotCSAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBpbmRleCwgdmFkZHIsIGZhbHNlKTsKLQkgIHNpemUgPSBfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDApOwkvKiBnZXQgbWF4IHNpemUgKi8KLQkgIGlmIChzaXplID4gc3NpemUpCQkJLyogbW9yZSB0aGFuIHdoYXQncyBsZWZ0ID8gKi8KLQkgICAgc2l6ZSA9IHNzaXplOwotCX0KLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19TVE9fSU1NLCAtMSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNpemUpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBjcHRyLCBzaXplKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICgxMCwgImR1bXBlZCAlZCBieXRlc1xuIiwgc2l6ZSk7Ci0gICAgICBfYmZkX2hleGR1bXAgKDEwLCBjcHRyLCAoaW50KXNpemUsIChpbnQpdmFkZHIpOwotI2VuZGlmCi0KLSAgICAgIHZhZGRyICs9IHNpemU7Ci0gICAgICBzc2l6ZSAtPSBzaXplOwotICAgICAgY3B0ciArPSBzaXplOwotICAgIH0KLQotICByZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHN0YXJ0IEVUSVIgcmVjb3JkIGZvciBzZWN0aW9uICNpbmRleCBhdCB2aXJ0dWFsIGFkZHIgb2Zmc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBpbmRleCwgb2Zmc2V0LCBqdXN0b2Zmc2V0KQotICAgIGJmZCAqYWJmZDsKLSAgICBpbnQgaW5kZXg7Ci0gICAgdXF1YWQgb2Zmc2V0OwotICAgIGJvb2xlYW4ganVzdG9mZnNldDsKLXsKLSAgaWYgKCFqdXN0b2Zmc2V0KQotICAgIHsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRVRJUiwgLTEpOwkvKiBvbmUgRVRJUiBwZXIgc2VjdGlvbiAqLwotICAgICAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVUSVJfU19DX1NUQV9QUSwgLTEpOwkvKiBwdXNoIHN0YXJ0IG9mZnNldCAqLwotICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpaW5kZXgpOwotICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgKHVxdWFkKW9mZnNldCk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19DVExfU0VUUkIsIC0xKTsJLyogc3RhcnQgPSBwb3AgKCkgKi8KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogZW5kIGV0aXIgcmVjb3JkICAqLwotc3RhdGljIHZvaWQKLWVuZF9ldGlyX3JlY29yZCAoYWJmZCkKLSAgICBiZmQgKmFiZmQ7Ci17Ci0gIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsgCi19Ci0KLS8qIHdyaXRlIHNlY3Rpb24gY29udGVudHMgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHZtc19zZWN0aW9uICpzcHRyOwotICBpbnQgbmV4dG9mZnNldDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90aXIgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgNCk7Ci0KLSAgbmV4dG9mZnNldCA9IDA7Ci0gIFBSSVYodm1zX2xpbmthZ2VfaW5kZXgpID0gMTsKLQotICAvKiBkdW1wIGFsbCBvdGhlciBzZWN0aW9ucyAgKi8KLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgd2hpbGUgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0KLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICg0LCAid3JpdGluZyAlZC4gc2VjdGlvbiAnJXMnICglZCBieXRlcylcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCAoaW50KShzZWN0aW9uLT5fcmF3X3NpemUpKTsNCi0jZW5kaWYKLQotICAgICAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoKGkgPSBzZWN0aW9uLT5yZWxvY19jb3VudCkgPD0gMCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU0VDX1JFTE9DIHdpdGggbm8gcmVsb2NzIGluIHNlY3Rpb24gJXMiKSwKLQkJCQkgICAgIHNlY3Rpb24tPm5hbWUpOwotCSAgICB9Ci0jaWYgVk1TX0RFQlVHCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICoqcnB0cjsKLQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIiVkIHJlbG9jYXRpb25zOlxuIiwgaSk7Ci0JICAgICAgcnB0ciA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCSAgICAgIHdoaWxlIChpLS0gPiAwKQotCQl7Ci0JCSAgX2JmZF92bXNfZGVidWcgKDQsICJzeW0gJXMgaW4gc2VjICVzLCB2YWx1ZSAlMDhseCwgYWRkciAlMDhseCwgb2ZmICUwOGx4LCBsZW4gJWQ6ICVzXG4iLAotCQkJICAgICAgKCooKnJwdHIpLT5zeW1fcHRyX3B0ciktPm5hbWUsCi0JCQkgICAgICAoKigqcnB0ciktPnN5bV9wdHJfcHRyKS0+c2VjdGlvbi0+bmFtZSwKLQkJCSAgICAgIChsb25nKSgqKCpycHRyKS0+c3ltX3B0cl9wdHIpLT52YWx1ZSwKLQkJCSAgICAgICgqcnB0ciktPmFkZHJlc3MsICgqcnB0ciktPmFkZGVuZCwKLQkJCSAgICAgIGJmZF9nZXRfcmVsb2Nfc2l6ZSgoKnJwdHIpLT5ob3d0byksCi0JCQkgICAgICAoKnJwdHIpLT5ob3d0by0+bmFtZSk7Ci0JCSAgcnB0cisrOwotCQl9Ci0JICAgIH0KLSNlbmRpZgotCX0KLQotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkpCi0JewotCSAgYmZkX3ZtYSB2YWRkcjsJCS8qIHZpcnR1YWwgYWRkciBpbiBzZWN0aW9uICovCi0KLQkgIHNwdHIgPSBfYmZkX2dldF92bXNfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbi0+aW5kZXgpOwotCSAgaWYgKHNwdHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIHZhZGRyID0gKGJmZF92bWEpKHNwdHItPm9mZnNldCk7Ci0KLQkgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBzZWN0aW9uLT5pbmRleCwgKHVxdWFkKSBzcHRyLT5vZmZzZXQsCi0JCQkgICAgIGZhbHNlKTsKLQotCSAgd2hpbGUgKHNwdHIgIT0gTlVMTCkJCQkJLyogb25lIFNUQV9QUSwgQ1RMX1NFVFJCIHBlciB2bXNfc2VjdGlvbiAqLwotCSAgICB7Ci0KLQkgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpCQkJLyogY2hlY2sgZm9yIHJlbG9jcyAqLwotCQl7Ci0JCSAgYXJlbGVudCAqKnJwdHIgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQkJICBpbnQgaSA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCQkgIGZvciAoOzspCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgYWRkciA9ICgqcnB0ciktPmFkZHJlc3M7Ci0JCSAgICAgIGludCBsZW4gPSBiZmRfZ2V0X3JlbG9jX3NpemUgKCgqcnB0ciktPmhvd3RvKTsKLQkJICAgICAgaWYgKHNwdHItPm9mZnNldCA8IGFkZHIpCQkvKiBzcHRyIHN0YXJ0cyBiZWZvcmUgcmVsb2MgKi8KLQkJCXsKLQkJCSAgaW50IGJlZm9yZSA9IGFkZHIgLSBzcHRyLT5vZmZzZXQ7Ci0JCQkgIGlmIChzcHRyLT5zaXplIDw9IGJlZm9yZSkJCS8qIGNvbXBsZXRlIGJlZm9yZSAqLwotCQkJICAgIHsKLQkJCSAgICAgIHN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7Ci0JCQkgICAgICB2YWRkciArPSBzcHRyLT5zaXplOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICBlbHNlCQkJCS8qIHBhcnRseSBiZWZvcmUgKi8KLQkJCSAgICB7Ci0JCQkgICAgICBpbnQgYWZ0ZXIgPSBzcHRyLT5zaXplIC0gYmVmb3JlOwotCQkJICAgICAgc3B0ci0+c2l6ZSA9IGJlZm9yZTsKLQkJCSAgICAgIHN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7Ci0JCQkgICAgICB2YWRkciArPSBzcHRyLT5zaXplOwotCQkJICAgICAgc3B0ci0+Y29udGVudHMgKz0gYmVmb3JlOwotCQkJICAgICAgc3B0ci0+b2Zmc2V0ICs9IGJlZm9yZTsKLQkJCSAgICAgIHNwdHItPnNpemUgPSBhZnRlcjsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNwdHItPm9mZnNldCA9PSBhZGRyKQkvKiBzcHRyIHN0YXJ0cyBhdCByZWxvYyAqLwotCQkJewotCQkJICBhc3ltYm9sICpzeW0gPSAqKCpycHRyKS0+c3ltX3B0cl9wdHI7Ci0JCQkgIGFzZWN0aW9uICpzZWMgPSBzeW0tPnNlY3Rpb247Ci0KLQkJCSAgc3dpdGNoICgoKnJwdHIpLT5ob3d0by0+dHlwZSkKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSBBTFBIQV9SX0lHTk9SRToKLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX1JFRkxPTkc6Ci0JCQkgICAgICB7Ci0JCQkJaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwKLQkJCQkJCQkJc3RybGVuKChjaGFyICopc3ltLT5uYW1lKSkKLQkJCQkJPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0dCTF9MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgICAgICBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAxNikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICh1cXVhZClzeW0tPnZhbHVlKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDMyKSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfUFEsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKHNlYy0+aW5kZXgpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKCh1cXVhZCkoKnJwdHIpLT5hZGRlbmQKLQkJCQkJCQkgICAgKyAodXF1YWQpc3ltLT52YWx1ZSkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfUkVGUVVBRDoKLQkJCSAgICAgIHsKLQkJCQlpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLAotCQkJCQkJCQlzdHJsZW4oKGNoYXIgKilzeW0tPm5hbWUpKQotCQkJCQk8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fR0JMLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgICAgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDE2KSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfUVcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKHVxdWFkKXN5bS0+dmFsdWUpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19RVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMzIpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9QUSwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkJCQkgICAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAoKHVxdWFkKSgqcnB0ciktPmFkZGVuZAotCQkJCQkJCSAgICArICh1cXVhZClzeW0tPnZhbHVlKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX09GRiwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfSElOVDoKLQkJCSAgICAgIHsKLQkJCQlpbnQgaGludF9zaXplOwotCi0JCQkJaGludF9zaXplID0gc3B0ci0+c2l6ZTsKLQkJCQlzcHRyLT5zaXplID0gbGVuOwotCQkJCXN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7Ci0JCQkJc3B0ci0+c2l6ZSA9IGhpbnRfc2l6ZTsKLSNpZiAwCi0JCQkJdm1zX291dHB1dF9iZWdpbihhYmZkLCBFVElSX1NfQ19TVE9fSElOVF9HQkwsIC0xKTsKLQkJCQl2bXNfb3V0cHV0X2xvbmcoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNlYy0+aW5kZXgpKTsKLQkJCQl2bXNfb3V0cHV0X3F1YWQoYWJmZCwgKHVxdWFkKWFkZHIpOwotCi0JCQkJdm1zX291dHB1dF9jb3VudGVkKGFiZmQsIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQl2bXNfb3V0cHV0X2ZsdXNoKGFiZmQpOwotI2VuZGlmCi0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIEFMUEhBX1JfTElOS0FHRToKLQkJCSAgICAgIHsKLQkJCQlpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCA2NCkgPCAwKQotCQkJCSAgewotCQkJCSAgICBlbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCSAgICBzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkgICAgICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgIH0KLQkJCQlfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJRVRJUl9TX0NfU1RDX0xQX1BTQiwKLQkJCQkJCQktMSk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpUFJJVih2bXNfbGlua2FnZV9pbmRleCkpOwotCQkJCVBSSVYodm1zX2xpbmthZ2VfaW5kZXgpICs9IDI7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwotCQkJCV9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9DT0RFQUREUjoKLQkJCSAgICAgIHsKLQkJCQlpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLAotCQkJCQkJCSAgICBzdHJsZW4oKGNoYXIgKilzeW0tPm5hbWUpKQotCQkJCSAgICA8IDApCi0JCQkJICB7Ci0JCQkJICAgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJICAgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJICAgICAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJICAgICAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICB9Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCUVUSVJfU19DX1NUT19DQSwKLQkJCQkJCQktMSk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgZGVmYXVsdDoKLQkJCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5oYW5kbGVkIHJlbG9jYXRpb24gJXMiKSwKLQkJCQkJCSAgICAgKCpycHRyKS0+aG93dG8tPm5hbWUpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCi0JCQkgIHZhZGRyICs9IGxlbjsKLQotCQkJICBpZiAobGVuID09IHNwdHItPnNpemUpCi0JCQkgICAgewotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgc3B0ci0+Y29udGVudHMgKz0gbGVuOwotCQkJICAgICAgc3B0ci0+b2Zmc2V0ICs9IGxlbjsKLQkJCSAgICAgIHNwdHItPnNpemUgLT0gbGVuOwotCQkJICAgICAgaS0tOwotCQkJICAgICAgcnB0cisrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQkJCQkJLyogc3B0ciBzdGFydHMgYWZ0ZXIgcmVsb2MgKi8KLQkJCXsKLQkJCSAgaS0tOwkJCQkvKiBjaGVjayBuZXh0IHJlbG9jICovCi0JCQkgIHJwdHIrKzsKLQkJCX0KLQotCQkgICAgICBpZiAoaT09MCkJCQkJLyogYWxsIHJlbG9jIGNoZWNrZWQgKi8KLQkJCXsKLQkJCSAgaWYgKHNwdHItPnNpemUgPiAwKQotCQkJICAgIHsKLQkJCSAgICAgIHN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7CS8qIGR1bXAgcmVzdCAqLwotCQkJICAgICAgdmFkZHIgKz0gc3B0ci0+c2l6ZTsKLQkJCSAgICB9Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfSAvKiBmb3IgKDs7KSAqLwotCQl9IC8qIGlmIFNFQ19SRUxPQyAqLwotCSAgICAgIGVsc2UJCQkJCQkvKiBubyByZWxvY3MsIGp1c3QgZHVtcCAqLwotCQl7Ci0JCSAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJICB2YWRkciArPSBzcHRyLT5zaXplOwotCQl9Ci0KLQkgICAgICBzcHRyID0gc3B0ci0+bmV4dDsKLQotCSAgICB9IC8qIHdoaWxlIChzcHRyICE9IDApICovCi0KLQkgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0KLQl9IC8qIGhhc19jb250ZW50cyAqLwotCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudChhYmZkLCAyKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogd3JpdGUgdHJhY2ViYWNrIGRhdGEgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX3RidCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfdGJ0ICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIHdyaXRlIGRlYnVnIGluZm8gZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2RiZyAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZGJnICglcCwgb2JqdHlwZSlcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLmMgYi9iZmQvdm1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmMxM2EuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0NyArMCwwIEBACi0vKiB2bXMuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLXN0YXRpYyBib29sZWFuIHZtc19pbml0aWFsaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHByaXZfc2VjdGlvbl9jb3VudDsKLXN0YXRpYyBib29sZWFuIGZpbGxfc2VjdGlvbl9wdHIgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2ZpeHVwX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb3B5X3N5bWJvbHMgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZWxvY19uaWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnZtc19vYmplY3RfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqdm1zX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19ta29iamVjdCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY2xvc2VfYW5kX2NsZWFudXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIHgxLCBmaWxlX3B0ciB4MiwKLQkgICBiZmRfc2l6ZV90eXBlIHgzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF93aW5kb3cgKncsIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKnNyYywgYmZkICpkZXN0KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICpzcmNiZmQsIGFzZWN0aW9uICpzcmNzZWMsIGJmZCAqZHN0YmZkLCBhc2VjdGlvbiAqZHN0c2VjKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotICBQQVJBTVMgKChiZmQgKmliZmQsIGFzeW1ib2wgKmlzeW0sIGJmZCAqb2JmZCwgYXN5bWJvbCAqb3N5bSkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqZmlsZSkpOwotc3RhdGljIGNoYXIgKnZtc19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCB2bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZCAqYmJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICoqdGFibG9jLCBiZmRfc2l6ZV90eXBlICp0YWJsZW4sCi0JICAgY29uc3QgY2hhciAqKm5hbWUpKTsKLXN0YXRpYyB2b2lkIHZtc190cnVuY2F0ZV9hcm5hbWUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpwYXRobmFtZSwgY2hhciAqYXJoZHIpKTsKLXN0YXRpYyBib29sZWFuIHZtc193cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLCBzdHJ1Y3Qgb3JsICptYXAsCi0JICAgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotc3RhdGljIFBUUiB2bXNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYmZkICp2bXNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKmFiZmQsIHN5bWluZGV4IGluZGV4KSk7Ci1zdGF0aWMgYmZkICp2bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaCwgYmZkICpwcmV2KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgdm1zX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICpzdGF0KSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyB2b2lkIHZtc19wcmludF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZSwgYXN5bWJvbCAqc3ltYm9sLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93KSk7Ci1zdGF0aWMgdm9pZCB2bXNfZ2V0X3N5bWJvbF9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBhbGVudCAqdm1zX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICpzeW1ib2wpKTsKLXN0YXRpYyBib29sZWFuIHZtc19maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsCi0JICAgY29uc3QgY2hhciAqKmZpbGUsIGNvbnN0IGNoYXIgKipmdW5jLCB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLXN0YXRpYyBhc3ltYm9sICp2bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpKTsKLXN0YXRpYyBsb25nIHZtc19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBkeW5hbWljLCBQVFIgKm1pbmlzeW1zcCwgdW5zaWduZWQgaW50ICpzaXplcCkpOwotc3RhdGljIGFzeW1ib2wgKnZtc19taW5pc3ltYm9sX3RvX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYywgY29uc3QgUFRSIG1pbmlzeW0sIGFzeW1ib2wgKnN5bSkpOwotc3RhdGljIGxvbmcgdm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KSk7Ci1zdGF0aWMgbG9uZyB2bXNfY2Fub25pY2FsaXplX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNyY3NlYywgYXJlbGVudCAqKmxvY2F0aW9uLAotCSAgIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqdm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2gpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1zdGF0aWMgaW50IHZtc19zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKLXN0YXRpYyBiZmRfYnl0ZSAqdm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwgYmZkX2J5dGUgKmRhdGEsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgICBib29sZWFuICphZ2FpbikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdm1zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotc3RhdGljIGxvbmcgdm1zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGxvbmcgdm1zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGxvbmcgdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqKmFyZWwsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi0jZGVmaW5lIHZtc19tYWtlX2VtcHR5X3N5bWJvbCBfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbAotDAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1jb25zdCBiZmRfdGFyZ2V0IHZtc19hbHBoYV92ZWMgPQotewotCi0gICJ2bXMtYWxwaGEiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIsCi0gIGZhbHNlLAkJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgZmFsc2UsCQkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEhBU19TWU1TCi0gICB8IFdQX1RFWFQgfCBEX1BBR0VEKSwJLyogb2JqZWN0IGZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZKSwJCS8qIHNlY3QgZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgdm1zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgdm1zX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCB2bXNfbWtvYmplY3QsCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIHZtc193cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKHZtcyksCi0KLSAgKFBUUikgMAotfTsKLQotY29uc3QgYmZkX3RhcmdldCB2bXNfdmF4X3ZlYyA9Ci17Ci0KLSAgInZtcy12YXgiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9vdmF4X2ZsYXZvdXIsCi0gIGZhbHNlLAkJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgZmFsc2UsCQkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEhBU19TWU1TIAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIHwgV1BfVEVYVCB8IERfUEFHRUQKLSAgIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19MT0NBTFMpLAotCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZKSwJCS8qIHNlY3QgZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIHZtc19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIHZtc19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgdm1zX21rb2JqZWN0LAkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCB2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDICh2bXMpLAotCi0gIChQVFIpIDAKLX07Ci0MCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIEluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2luaXRpYWxpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLmFueSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCwgKGJmZF92bWEpLTEpOwotCi0gIGFiZmQtPnRkYXRhLmFueSA9ICgoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0KikKLQkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmFueSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmZGVmIF9fQUxQSEEKLSAgUFJJVihpc192YXgpID0gMDsKLSNlbHNlCi0gIFBSSVYoaXNfdmF4KSA9IDE7Ci0jZW5kaWYKLSAgUFJJVih2bXNfYnVmKSA9IDA7Ci0gIFBSSVYoYnVmX3NpemUpID0gMDsKLSAgUFJJVihyZWNfbGVuZ3RoKSA9IDA7Ci0gIFBSSVYoZmlsZV9mb3JtYXQpID0gRkZfVU5LTk9XTjsKLSAgUFJJVihmaXh1cF9kb25lKSA9IGZhbHNlOwotICBQUklWKHNlY3Rpb25zKSA9IE5VTEw7Ci0KLSAgUFJJVihzdGFjaykgPSAoKHN0cnVjdCBzdGFja19zdHJ1Y3QgKikKLQkJIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0YWNrX3N0cnVjdCkgKiBTVEFDS1NJWkUpKTsKLSAgaWYgKFBSSVYoc3RhY2spID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0xOgotICAgICAgZnJlZSAoYWJmZC0+dGRhdGEuYW55KTsKLSAgICAgIGFiZmQtPnRkYXRhLmFueSA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBQUklWKHN0YWNrcHRyKSA9IDA7Ci0KLSAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICBpZiAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9PSAwKQotICAgIHsKLSAgICAgdm1zX2luaXRfbm9fbWVtMjoKLSAgICAgIGZyZWUgKFBSSVYoc3RhY2spKTsKLSAgICAgIFBSSVYoc3RhY2spID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMTsKLSAgICB9Ci0KLSAgaWYgKCFiZmRfaGFzaF90YWJsZV9pbml0IChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBfYmZkX3Ztc19oYXNoX25ld2Z1bmMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9ICgoc3RydWN0IGxvY2F0aW9uX3N0cnVjdCAqKQotCQkJICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2NhdGlvbl9zdHJ1Y3QpCi0JCQkJICAgICAgKiBMT0NBVElPTl9TQVZFX1NJWkUpKTsKLSAgaWYgKFBSSVYobG9jYXRpb25fc3RhY2spID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0zOgotICAgICAgZnJlZSAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSk7Ci0gICAgICBQUklWKHZtc19zeW1ib2xfdGFibGUpID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IFZNU19TRUNUSU9OX0NPVU5UOyBpKyspCi0gICAgUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV0gPSBOVUxMOwotCi0gIFBSSVYob3V0cHV0X2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE1BWF9PVVRSRUNfU0laRSk7Ci0gIGlmIChQUklWKG91dHB1dF9idWYpID09IDApCi0gICAgewotICAgICAgZnJlZSAoUFJJVihsb2NhdGlvbl9zdGFjaykpOwotICAgICAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAwOwotICAgICAgZ290byB2bXNfaW5pdF9ub19tZW0zOwotICAgIH0KLSAgUFJJVihwdXNoX2xldmVsKSA9IDA7Ci0gIFBSSVYocHVzaGVkX3NpemUpID0gMDsKLSAgUFJJVihsZW5ndGhfcG9zKSA9IDI7Ci0gIFBSSVYob3V0cHV0X3NpemUpID0gMDsKLSAgUFJJVihvdXRwdXRfYWxpZ25tZW50KSA9IDE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRmlsbCBzeW1ib2wtPnNlY3Rpb24gd2l0aCBzZWN0aW9uIHB0cgotICAgc3ltYm9sLT5zZWN0aW9uIGlzIGZpbGxlZCB3aXRoIHRoZSBzZWN0aW9uIGluZGV4IGZvciBkZWZpbmVkIHN5bWJvbHMKLSAgIGR1cmluZyByZWFkaW5nIHRoZSBHU0QvRUdTRCBzZWN0aW9uLiBCdXQgd2UgbmVlZCB0aGUgcG9pbnRlciB0byB0aGUKLSAgIGJmZCBzZWN0aW9uIGxhdGVyLgotCi0gICBJdCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHJlZmVyZW5jZWQgKHVuZGVmaW5lZCBzZWN0aW9uKSBzeW1ib2xzCi0KLSAgIGNhbGxlZCBmcm9tIGJmZF9oYXNoX3RyYXZlcnNlIGluIHZtc19maXh1cF9zZWN0aW9ucyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZpbGxfc2VjdGlvbl9wdHIgKGVudHJ5LCBzZWN0aW9ucykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgUFRSIHNlY3Rpb25zOwotewotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0KLSAgc3ltID0gICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sOwotICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiZmlsbF9zZWN0aW9uX3B0cjogc3ltICVwLCBzZWMgJXBcbiIsIHN5bSwgc2VjKTsKLSNlbmRpZgotCi0gIC8qIGZpbGwgZm9yd2FyZCByZWZlcmVuY2VzICh0aGVzZSBjb250YWluIHNlY3Rpb24gbnVtYmVyLCBub3Qgc2VjdGlvbiBwdHIpLiAgKi8KLQotICBpZiAoKGludClzZWMgPCBwcml2X3NlY3Rpb25fY291bnQpCi0gICAgewotICAgICAgc2VjID0gKCh2bXNfc3ltYm9sX2VudHJ5ICopZW50cnkpLT5zeW1ib2wtPnNlY3Rpb24gPQotCSgoYXNlY3Rpb24gKiopc2VjdGlvbnMpWyhpbnQpc2VjXTsKLSAgICB9Ci0KLSAgaWYgKHN0cmNtcCAoc3ltLT5uYW1lLCBzZWMtPm5hbWUpID09IDApCi0gICAgc3ltLT5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRml4dXAgc2VjdGlvbnMKLSAgIHNldCB1cCBhbGwgcG9pbnRlcnMgYW5kIGFycmF5cywgY291bnRlcnMgYW5kIHNpemVzIGFyZSBmaXhlZCBub3cKLQotICAgd2UgYnVpbGQgYSBwcml2YXRlIHNlY3Rpb25zIHZlY3RvciBmb3IgZWFzeSBhY2Nlc3Mgc2luY2Ugc2VjdGlvbnMKLSAgIGFyZSBhbHdheXMgcmVmZXJlbmNlZCBieSBhbiBpbmRleCBudW1iZXIuCi0KLSAgIGFsbG9jIFBSSVYoc2VjdGlvbnMpIGFjY29yZGluZyB0byBhYmZkLT5zZWN0aW9uX2NvdW50Ci0JY29weSBhYmZkLT5zZWN0aW9ucyB0byBQUklWKHNlY3Rpb25zKSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19maXh1cF9zZWN0aW9ucyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAoUFJJVihmaXh1cF9kb25lKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKgotICAgKiB0cmF2ZXJzZSBzeW1ib2wgdGFibGUgYW5kIGZpbGwgaW4gYWxsIHNlY3Rpb24gcG9pbnRlcnMKLSAgICovCi0KLSAgLyogY2FuJ3QgcHJvdmlkZSBzZWN0aW9uIGNvdW50IGFzIGFyZ3VtZW50IHRvIGZpbGxfc2VjdGlvbl9wdHIoKS4gICovCi0gIHByaXZfc2VjdGlvbl9jb3VudCA9IFBSSVYoc2VjdGlvbl9jb3VudCk7Ci0gIGJmZF9oYXNoX3RyYXZlcnNlIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBmaWxsX3NlY3Rpb25fcHRyLAotCQkgICAgKFBUUikoUFJJVihzZWN0aW9ucykpKTsKLQotICBQUklWKGZpeHVwX2RvbmUpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiBDaGVjayB0aGUgZm9ybWF0IGZvciBhIGZpbGUgYmVpbmcgcmVhZC4KLSAgIFJldHVybiBhIChiZmRfdGFyZ2V0ICopIGlmIGl0J3MgYW4gb2JqZWN0IGZpbGUgb3IgemVybyBpZiBub3QuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKgotdm1zX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBlcnIgPSAwOwotICBpbnQgcHJldl90eXBlOwotICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlY3RvciA9IDA7Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX29iamVjdF9wKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBpZiAoIXZtc19pbml0aWFsaXplIChhYmZkKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJ2bXNfaW5pdGlhbGl6ZSAoKSBmYWlsZWQgISFcbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMEwsIFNFRUtfU0VUKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHByZXZfdHlwZSA9IC0xOwotCi0gIGRvCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICg3LCAicmVhZGluZyBhdCAlMDhseFxuIiwgYmZkX3RlbGwoYWJmZCkpOwotI2VuZGlmCi0gICAgICBpZiAoX2JmZF92bXNfbmV4dF9yZWNvcmQgKGFiZmQpIDwgMCkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDIsICJuZXh0X3JlY29yZCBmYWlsZWRcbiIpOyAgICAgIAotI2VuZGlmCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKChwcmV2X3R5cGUgPT0gRU9CSl9TX0NfRUdTRCkKLQkgICAmJiAoUFJJVihyZWNfdHlwZSkgIT0gRU9CSl9TX0NfRUdTRCkpCi0JewotCSAgaWYgKHZtc19maXh1cF9zZWN0aW9ucyAoYWJmZCkgPT0gZmFsc2UpCi0JICAgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgICB2bXNfZGVidWcgKDIsICJ2bXNfZml4dXBfc2VjdGlvbnMgZmFpbGVkXG4iKTsKLSNlbmRpZgotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0gICAgICBwcmV2X3R5cGUgPSBQUklWKHJlY190eXBlKTsKLQotICAgICAgaWYgKHRhcmdldF92ZWN0b3IgPT0gMCkKLQl7Ci0JICBpZiAocHJldl90eXBlIDw9IE9CSl9TX0NfTUFYUkVDVFlQKQotCSAgICB0YXJnZXRfdmVjdG9yID0gJnZtc192YXhfdmVjOwotCSAgZWxzZQotCSAgICB0YXJnZXRfdmVjdG9yID0gJnZtc19hbHBoYV92ZWM7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHByZXZfdHlwZSkKLQl7Ci0JICBjYXNlIE9CSl9TX0NfSERSOgotCSAgY2FzZSBFT0JKX1NfQ19FTUg6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2hkciAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfRU9NOgotCSAgY2FzZSBPQkpfU19DX0VPTVc6Ci0JICBjYXNlIEVPQkpfU19DX0VFT006Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2VvbSAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfR1NEOgotCSAgY2FzZSBFT0JKX1NfQ19FR1NEOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9nc2QgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX1RJUjoKLQkgIGNhc2UgRU9CSl9TX0NfRVRJUjoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfdGlyIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19EQkc6Ci0JICBjYXNlIEVPQkpfU19DX0VEQkc6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2RiZyAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfVEJUOgotCSAgY2FzZSBFT0JKX1NfQ19FVEJUOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF90YnQgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0xOSzoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfbG5rIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGVyciA9IC0xOwotCX0KLSAgICAgIGlmIChlcnIgIT0gMCkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDIsICJzbHVycCB0eXBlICVkIGZhaWxlZCB3aXRoICVkXG4iLCBwcmV2X3R5cGUsIGVycik7Ci0jZW5kaWYKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgd2hpbGUgKChwcmV2X3R5cGUgIT0gRU9CSl9TX0NfRUVPTSkgJiYgKHByZXZfdHlwZSAhPSBPQkpfU19DX0VPTSkgJiYgKHByZXZfdHlwZSAhPSBPQkpfU19DX0VPTVcpKTsKLQotICBpZiAodGFyZ2V0X3ZlY3RvciA9PSAmdm1zX3ZheF92ZWMpCi0gICAgewotICAgICAgaWYgKHZtc19maXh1cF9zZWN0aW9ucyAoYWJmZCkgPT0gZmFsc2UpCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgyLCAidm1zX2ZpeHVwX3NlY3Rpb25zIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBzZXQgYXJjaF9pbmZvIHRvIHZheCAgKi8KLSAKLSAgICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoICgidmF4Iik7Ci0gICAgICBQUklWIChpc192YXgpID0gMTsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoMiwgImFyY2ggaXMgdmF4XG4iKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAodGFyZ2V0X3ZlY3RvciA9PSAmdm1zX2FscGhhX3ZlYykKLSAgICB7Ci0gICAgICAvKiBzZXQgYXJjaF9pbmZvIHRvIGFscGhhICAqLwotIAotICAgICAgYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJhbHBoYSIpOwotICAgICAgUFJJViAoaXNfdmF4KSA9IDA7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDIsICJhcmNoIGlzIGFscGhhXG4iKTsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoYXJjaCA9PSAwKQotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoMiwgImFyY2ggbm90IGZvdW5kXG4iKTsKLSNlbmRpZgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7Ci0KLSAgcmV0dXJuIHRhcmdldF92ZWN0b3I7Ci19Ci0KLQotLyogQ2hlY2sgdGhlIGZvcm1hdCBmb3IgYSBmaWxlIGJlaW5nIHJlYWQuCi0gICBSZXR1cm4gYSAoYmZkX3RhcmdldCAqKSBpZiBpdCdzIGFuIGFyY2hpdmUgZmlsZSBvciB6ZXJvLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICoKLXZtc19hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2FyY2hpdmVfcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogU2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19ta29iamVjdCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKCF2bXNfaW5pdGlhbGl6ZSAoYWJmZCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAidm1zX2luaXRpYWxpemUgKCkgZmFpbGVkICEhXG4iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICB7Ci0jaWZkZWYgX19WQVgKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoICgidmF4Iik7Ci0jZWxzZQotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJhbHBoYSIpOwotI2VuZGlmCi0gICAgaWYgKGFyY2ggPT0gMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBXcml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiwgYXQgYmZkX2Nsb3NlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3dyaXRlX29iamVjdF9jb250ZW50cyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiAwKQkJCS8qIHdlIGhhdmUgc2VjdGlvbnMgKi8KLSAgICB7Ci0gICAgICBpZiAoUFJJVihpc192YXgpKQotCXsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIE9CSl9TX0NfSERSKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBPQkpfU19DX0dTRCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgT0JKX1NfQ19USVIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIE9CSl9TX0NfVEJUKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBPQkpfU19DX0RCRykgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiAyNTUpCi0JICAgIHsKLQkgICAgICBpZiAoX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBPQkpfU19DX0VPTVcpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKF9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgT0JKX1NfQ19FT00pICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBFT0JKX1NfQ19FTUgpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9nc2QgKGFiZmQsIEVPQkpfU19DX0VHU0QpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIEVPQkpfU19DX0VUSVIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIEVPQkpfU19DX0VUQlQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9kYmcgKGFiZmQsIEVPQkpfU19DX0VEQkcpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIEVPQkpfU19DX0VFT00pICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyotLSA0LjEsIGdlbmVyaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHZtc19zZWN0aW9uICplcywgKmVzMTsKLSAgdm1zX3JlbG9jICplciwgKmVyMTsKLSAgaW50IGk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nsb3NlX2FuZF9jbGVhbnVwKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgaWYgKGFiZmQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoUFJJVih2bXNfYnVmKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYodm1zX2J1ZikpOwotICAgICAgUFJJVih2bXNfYnVmKSA9IE5VTEw7Ci0gICAgfQotICBQUklWKGJ1Zl9zaXplKSA9IDA7Ci0KLSAgaWYgKFBSSVYob3V0cHV0X2J1ZikgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKG91dHB1dF9idWYpKTsKLSAgICAgIFBSSVYob3V0cHV0X2J1ZikgPSAwOwotICAgIH0KLQotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLSAgd2hpbGUgKHNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzKQotCWZyZWUgKHNlYy0+Y29udGVudHMpOwotICAgICAgc2VjID0gc2VjLT5uZXh0OwotICAgIH0KLQotICBpZiAoUFJJVihzZWN0aW9ucykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHNlY3Rpb25zKSk7Ci0gICAgICBQUklWKHNlY3Rpb25zKSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChQUklWKHZtc19zeW1ib2xfdGFibGUpKQotICAgIHsKLSAgICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkpOwotICAgICAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9IDA7Ci0gICAgfQotCi0gIGlmIChQUklWKHN0YWNrKSkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHN0YWNrKSk7Ci0gICAgICBQUklWKHN0YWNrKSA9IDA7Ci0gICAgfQotCi0gIGlmIChQUklWKGxvY2F0aW9uX3N0YWNrKSkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKGxvY2F0aW9uX3N0YWNrKSk7Ci0gICAgICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9IDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBWTVNfU0VDVElPTl9DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGVzID0gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV07Ci0gICAgICB3aGlsZSAoZXMgIT0gTlVMTCkKLQl7Ci0JICBlczEgPSBlcy0+bmV4dDsKLQkgIGZyZWUgKGVzKTsKLQkgIGVzID0gZXMxOwotCX0KLSAgICAgIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldID0gTlVMTDsKLSAgIH0KLQotICBmcmVlIChhYmZkLT50ZGF0YS5hbnkpOwotICBhYmZkLT50ZGF0YS5hbnkgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZnJlZV9jYWNoZWRfaW5mbyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENhbGxlZCB3aGVuIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX25ld19zZWN0aW9uX2hvb2sgKCVwLCBbJWRdJXMpLCBjb3VudCAlZFxuIiwgYWJmZCwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIGFiZmQtPnNlY3Rpb25fY291bnQpOwotI2VuZGlmCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYWJmZCwgc2VjdGlvbiwgNCk7Ci0KLSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiBQUklWKHNlY3Rpb25fY291bnQpKQotICAgIHsKLSAgICAgIFBSSVYoc2VjdGlvbnMpID0gKChhc2VjdGlvbiAqKikKLQkJCSAgICBiZmRfcmVhbGxvYyAoUFJJVihzZWN0aW9ucyksIGFiZmQtPnNlY3Rpb25fY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gICAgICBpZiAoUFJJVihzZWN0aW9ucykgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBQUklWKHNlY3Rpb25fY291bnQpID0gYWJmZC0+c2VjdGlvbl9jb3VudDsKLSAgICB9Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInNlY3Rpb25fY291bnQ6ICVkXG4iLCBQUklWKHNlY3Rpb25fY291bnQpKTsKLSNlbmRpZgotICBQUklWKHNlY3Rpb25zKVtzZWN0aW9uLT5pbmRleF0gPSBzZWN0aW9uOwotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDcsICIlZDogJXNcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4KLSAgIGJ1ZiBwb2ludHMgdG8gYSBidWZmZXIgb2YgYnVmX3NpemUgYnl0ZXMgdG8gYmUgZmlsbGVkIHdpdGgKLSAgIHNlY3Rpb24gZGF0YSAoc3RhcnRpbmcgYXQgb2Zmc2V0IGludG8gc2VjdGlvbikgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGJ1Ziwgb2Zmc2V0LCBidWZfc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGJ1ZjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ1Zl9zaXplOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3NlY3Rpb25fY29udGVudHMoJXAsICVzLCAlcCwgb2ZmICVsZCwgc2l6ZSAlZClcbiIsCi0JCSBhYmZkLCBzZWN0aW9uLT5uYW1lLCBidWYsIG9mZnNldCwgKGludClidWZfc2l6ZSk7Ci0jZW5kaWYKLQotICAvKiBzaG91bGRuJ3QgYmUgY2FsbGVkLCBzaW5jZSBhbGwgc2VjdGlvbnMgYXJlIElOX01FTU9SWSAgKi8KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4KLSAgIGJ1ZiBwb2ludHMgdG8gYSBidWZmZXIgb2YgYnVmX3NpemUgYnl0ZXMgdG8gYmUgZmlsbGVkIHdpdGgKLSAgIHNlY3Rpb24gZGF0YSAoc3RhcnRpbmcgYXQgb2Zmc2V0IGludG8gc2VjdGlvbikgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IChhYmZkLCBzZWN0aW9uLCB3LCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfd2luZG93ICp3OwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3coJXAsICVzLCAlcCwgb2ZmICVsZCwgY291bnQgJWQpXG4iLAotCQkgYWJmZCwgc2VjdGlvbi0+bmFtZSwgdywgb2Zmc2V0LCAoaW50KWNvdW50KTsKLSNlbmRpZgotCi0gIC8qIHNob3VsZG4ndCBiZSBjYWxsZWQsIHNpbmNlIGFsbCBzZWN0aW9ucyBhcmUgSU5fTUVNT1JZICAqLwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuMiwgY29weSBwcml2YXRlIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKHNyYywgZGVzdCkKLSAgICAgYmZkICpzcmM7Ci0gICAgIGJmZCAqZGVzdDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoJXAsICVwKVxuIiwgc3JjLCBkZXN0KTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBNZXJnZSBwcml2YXRlIEJGRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgQHZhcntpYmZkfSB0byB0aGUKLSAgIHRoZSBvdXRwdXQgZmlsZSBCRkQgQHZhcntvYmZkfSB3aGVuIGxpbmtpbmcuICBSZXR1cm4gPDx0cnVlPj4KLSAgIG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0gICBvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLSAgICAgTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCJ2bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoJXAsICVwKVxuIiwgaWJmZCwgb2JmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogU2V0IHByaXZhdGUgQkZEIGZsYWcgaW5mb3JtYXRpb24gaW4gdGhlIEJGRCBAdmFye2FiZmR9LgotICAgUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0gICByZXR1cm5zIGFyZToKLQotICAgbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0gICAgIE5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsInZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MoJXAsICVseClcbiIsIGFiZmQsIChsb25nKWZsYWdzKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChzcmNiZmQsIHNyY3NlYywgZHN0YmZkLCBkc3RzZWMpCi0gICAgIGJmZCAqc3JjYmZkOwotICAgICBhc2VjdGlvbiAqc3Jjc2VjOwotICAgICBiZmQgKmRzdGJmZDsKLSAgICAgYXNlY3Rpb24gKmRzdHNlYzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKCVwLCAlcywgJXAsICVzKVxuIiwKLQkJIHNyY2JmZCwgc3Jjc2VjLT5uYW1lLCBkc3RiZmQsIGRzdHNlYy0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHN5bWJvbCBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bSwgb2JmZCwgb3N5bSkKLSAgICAgYmZkICppYmZkOwotICAgICBhc3ltYm9sICppc3ltOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKm9zeW07Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKCVwLCAlcywgJXAsICVzKVxuIiwKLQkJIGliZmQsIGlzeW0tPm5hbWUsIG9iZmQsIG9zeW0tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKi0tIFBhcnQgNC4zLCBjb3JlIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiBhIHJlYWQtb25seSBzdHJpbmcgZXhwbGFpbmluZyB3aGljaCBwcm9ncmFtIHdhcyBydW5uaW5nCi0gICB3aGVuIGl0IGZhaWxlZCBhbmQgcHJvZHVjZWQgdGhlIGNvcmUgZmlsZSBhYmZkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotdm1zX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIHdoaWNoIGNhdXNlZCB0aGUgY29yZSBkdW1wIHdoaWNoCi0gICBnZW5lcmF0ZWQgdGhlIGZpbGUgdGhlIEJGRCBhYmZkIGlzIGF0dGFjaGVkIHRvLiAgKi8KLQotc3RhdGljIGludAotdm1zX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBjb3JlX2JmZCB3YXMgZ2VuZXJhdGVkCi0gICBieSBhIHJ1biBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIGF0dGFjaGVkIHRvIGV4ZWNfYmZkLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoYWJmZCwgYmJmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKmJiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AoJXAsICVwKVxuIiwgYWJmZCwgYmJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tIFBhcnQgNC40LCBhcmNoaXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qID8/PwlkbyBzb21ldGhpbmcgd2l0aCBhbiBhcmNoaXZlIG1hcC4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19zbHVycF9hcm1hcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0gICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotICAgICBjb25zdCBjaGFyICoqbmFtZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIFRydW5jYXRlIHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgdG8gbWF0Y2ggc3lzdGVtLWRlcGVuZGVudCByZXN0cmljdGlvbnMgICovCi0KLXN0YXRpYyB2b2lkCi12bXNfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfdHJ1bmNhdGVfYXJuYW1lKCVwLCAlcywgJXMpXG4iLCBhYmZkLCBwYXRobmFtZSwgYXJoZHIpOwotI2VuZGlmCi0gIHJldHVybjsKLX0KLQotCi0vKiA/Pz8Jd3JpdGUgYXJjaGl2ZSBtYXAgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3dyaXRlX2FybWFwKCVwLCAlZCwgJXAsICVkICVkKVxuIiwKLQlhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhcmNoaXZlIGhlYWRlciA/Pz8gICovCi0KLXN0YXRpYyBQVFIKLXZtc19yZWFkX2FyX2hkciAoYWJmZCkKLSAgICBiZmQgKiBhYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcmVhZF9hcl9oZHIoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gKFBUUikwOwotfQotCi0KLS8qIFByb3ZpZGVkIGEgQkZELCBAdmFye2FyY2hpdmV9LCBjb250YWluaW5nIGFuIGFyY2hpdmUgYW5kIE5VTEwsIG9wZW4KLSAgIGFuIGlucHV0IEJGRCBvbiB0aGUgZmlyc3QgY29udGFpbmVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhhdC4KLSAgIFN1YnNlcXVlbnQgY2FsbHMgc2hvdWxkIHBhc3MgdGhlIGFyY2hpdmUgYW5kIHRoZSBwcmV2aW91cyByZXR1cm4gdmFsdWUKLSAgIHRvIHJldHVybiBhIGNyZWF0ZWQgQkZEIHRvIHRoZSBuZXh0IGNvbnRhaW5lZCBlbGVtZW50LgotICAgTlVMTCBpcyByZXR1cm5lZCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlLiAgKi8KLQotc3RhdGljIGJmZCAqCi12bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBwcmV2KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSglcCwgJXApXG4iLCBhcmNoLCBwcmV2KTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogUmV0dXJuIHRoZSBCRkQgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ltYm9sIGluIEFCRkQgaW5kZXhlZCBieQotICAgSU5ERVguICBJTkRFWCBzaG91bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGJmZF9nZXRfbmV4dF9tYXBlbnQuICAqLwotCi1zdGF0aWMgYmZkICoKLXZtc19nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9lbHRfYXRfaW5kZXgoJXAsICVwKVxuIiwgYWJmZCwgaW5kZXgpOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleChhYmZkLCBpbmRleCk7Ci19Ci0KLQotLyogPz8/Ci0gICAtPiBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0ICAqLwotCi1zdGF0aWMgaW50Ci12bXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBzdGF0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpzdGF0OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KCVwLCAlcClcbiIsIGFiZmQsIHN0YXQpOwotI2VuZGlmCi0gIHJldHVybiBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KGFiZmQsIHN0YXQpOwotfQotCi0KLS8qIFRoaXMgaXMgYSBuZXcgZnVuY3Rpb24gaW4gYmZkIDIuNSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc191cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc191cGRhdGVfYXJtYXBfdGltZXN0YW1wKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qLS0gUGFydCA0LjUsIHN5bWJvbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIHZlY3RvciBvZiBwb2ludGVycwotICAgdG8gYXN5bWJvbHMgZm9yIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgQkZEIGFiZmQsIGluY2x1ZGluZyBhCi0gICB0ZXJtaW5hbCBOVUxMIHBvaW50ZXIuIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzIGluIHRoZSBCRkQsCi0gICB0aGVuIHJldHVybiAwLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zeW10YWJfdXBwZXJfYm91bmQoJXApLCAlZCBzeW1ib2xzXG4iLCBhYmZkLCBQUklWKGdzZF9zeW1fY291bnQpKTsKLSNlbmRpZgotICByZXR1cm4gKFBSSVYoZ3NkX3N5bV9jb3VudCkrMSkgKiBzaXplb2YoYXN5bWJvbCAqKTsKLX0KLQotCi0vKiBDb3B5IHN5bWJvbHMgZnJvbSBoYXNoIHRhYmxlIHRvIHN5bWJvbCB2ZWN0b3IKLQotICAgY2FsbGVkIGZyb20gYmZkX2hhc2hfdHJhdmVyc2UgaW4gdm1zX2dldF9zeW10YWIKLSAgIGluaXQgY291bnRlciB0byAwIGlmIGVudHJ5ID09IDAgICovCi0KLXN0YXRpYyBib29sZWFuCi1jb3B5X3N5bWJvbHMgKGVudHJ5LCBhcmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIFBUUiBhcmc7Ci17Ci0gIGJmZCAqYWJmZCA9IChiZmQgKikgYXJnOwotCi0gIGlmIChlbnRyeSA9PSBOVUxMKQkvKiBpbml0IGNvdW50ZXIgKi8KLSAgICBQUklWKHN5bW51bSkgPSAwOwotICBlbHNlCQkJLyogZmlsbCB2ZWN0b3IsIGluYyBjb3VudGVyICovCi0gICAgUFJJVihzeW1jYWNoZSlbUFJJVihzeW1udW0pKytdID0gKCh2bXNfc3ltYm9sX2VudHJ5ICopZW50cnkpLT5zeW1ib2w7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogUmVhZCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQgYWJmZCwgYW5kIGZpbGxzIGluIHRoZSB2ZWN0b3IKLSAgIGxvY2F0aW9uIHdpdGggcG9pbnRlcnMgdG8gdGhlIHN5bWJvbHMgYW5kIGEgdHJhaWxpbmcgTlVMTC4KLQotICAgcmV0dXJuICMgb2Ygc3ltYm9scyByZWFkICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9zeW10YWIgKGFiZmQsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltdGFiKCVwLCA8cmV0PilcbiIsIGFiZmQpOwotI2VuZGlmCi0KLQkvKiBpbml0IGNvdW50ZXIgKi8KLSAgKHZvaWQpY29weV9zeW1ib2xzKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikwLCBhYmZkKTsKLQotCS8qIHRyYXZlcnNlIHRhYmxlIGFuZCBmaWxsIHN5bWJvbHMgdmVjdG9yICovCi0KLSAgUFJJVihzeW1jYWNoZSkgPSBzeW1ib2xzOwotICBiZmRfaGFzaF90cmF2ZXJzZShQUklWKHZtc19zeW1ib2xfdGFibGUpLCBjb3B5X3N5bWJvbHMsIChQVFIpYWJmZCk7Ci0KLSAgc3ltYm9sc1tQUklWKGdzZF9zeW1fY291bnQpXSA9IE5VTEw7Ci0KLSAgcmV0dXJuIFBSSVYoZ3NkX3N5bV9jb3VudCk7Ci19Ci0KLQotLyogQ3JlYXRlIGEgbmV3IGFzeW1ib2wgc3RydWN0dXJlIGZvciB0aGUgQkZEIGFiZmQgYW5kIHJldHVybiBhIHBvaW50ZXIKLSAgIHRvIGl0LgotICAgVGhpcyByb3V0aW5lIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGVhY2ggYmFjayBlbmQgaGFzIHByaXZhdGUgaW5mb3JtYXRpb24KLSAgIHN1cnJvdW5kaW5nIHRoZSBhc3ltYm9sLiBCdWlsZGluZyB5b3VyIG93biBhc3ltYm9sIGFuZCBwb2ludGluZyB0byBpdAotICAgd2lsbCBub3QgY3JlYXRlIHRoZSBwcml2YXRlIGluZm9ybWF0aW9uLCBhbmQgd2lsbCBjYXVzZSBwcm9ibGVtcyBsYXRlciBvbi4gICovCi0KLWFzeW1ib2wgKgotX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqc3ltYm9sID0gKGFzeW1ib2wgKiliZmRfemFsbG9jKGFiZmQsIHNpemVvZihhc3ltYm9sKSk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAiX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2woJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmIChzeW1ib2wgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgc3ltYm9sLT50aGVfYmZkID0gYWJmZDsKLQotICByZXR1cm4gc3ltYm9sOwotfQotCi0KLS8qIFByaW50IHN5bWJvbCB0byBmaWxlIGFjY29yZGluZyB0byBob3cuIGhvdyBpcyBvbmUgb2YKLSAgIGJmZF9wcmludF9zeW1ib2xfbmFtZQlqdXN0IHByaW50IHRoZSBuYW1lCi0gICBiZmRfcHJpbnRfc3ltYm9sX21vcmUJcHJpbnQgbW9yZSAoPz8/KQotICAgYmZkX3ByaW50X3N5bWJvbF9hbGwJcHJpbnQgYWxsIHdlIGtub3csIHdoaWNoIGlzIG5vdCBtdWNoIHJpZ2h0IG5vdyA6LSkgICovCi0KLXN0YXRpYyB2b2lkCi12bXNfcHJpbnRfc3ltYm9sIChhYmZkLCBmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcHJpbnRfc3ltYm9sKCVwLCAlcCwgJXAsICVkKVxuIiwgYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLQlmcHJpbnRmKChGSUxFICopZmlsZSwiICVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLQl7Ci0JICBDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQkgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoKFBUUilmaWxlLHN5bWJvbCk7Ci0KLQkgIGZwcmludGYoKEZJTEUgKilmaWxlLCIgJS04cyAlcyIsIHNlY3Rpb25fbmFtZSwgc3ltYm9sLT5uYW1lKTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCBpbiByZXQuCi0KLSAgIGZpbGwgdHlwZSwgdmFsdWUgYW5kIG5hbWUKLSAgIHR5cGU6Ci0JQQlhYnNvbHV0ZQotCUIJYnNzIHNlZ21lbnQgc3ltYm9sCi0JQwljb21tb24gc3ltYm9sCi0JRAlkYXRhIHNlZ21lbnQgc3ltYm9sCi0JZglmaWxlbmFtZQotCXQJYSBzdGF0aWMgZnVuY3Rpb24gc3ltYm9sCi0JVAl0ZXh0IHNlZ21lbnQgc3ltYm9sCi0JVQl1bmRlZmluZWQKLQktCWRlYnVnICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBhc2VjdGlvbiAqc2VjOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltYm9sX2luZm8oJXAsICVwLCAlcClcbiIsIGFiZmQsIHN5bWJvbCwgcmV0KTsKLSNlbmRpZgotCi0gIHNlYyA9IHN5bWJvbC0+c2VjdGlvbjsKLQotICBpZiAocmV0ID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0MnOwotICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0EnOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ1UnOwotICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0knOwotICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkKLSAgICByZXQtPnR5cGUgPSAnVCc7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKQotICAgIHJldC0+dHlwZSA9ICdEJzsKLSAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0FMTE9DKQotICAgIHJldC0+dHlwZSA9ICdCJzsKLSAgZWxzZQotICAgIHJldC0+dHlwZSA9ICctJzsKLQotICBpZiAocmV0LT50eXBlICE9ICdVJykKLSAgICByZXQtPnZhbHVlID0gc3ltYm9sLT52YWx1ZSArIHN5bWJvbC0+c2VjdGlvbi0+dm1hOwotICBlbHNlCi0gICAgcmV0LT52YWx1ZSA9IDA7Ci0gIHJldC0+bmFtZSA9IHN5bWJvbC0+bmFtZTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN5bWJvbCBzeW0gaW4gdGhlIEJGRCBhYmZkIGlzCi0gICBhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4gZmFsc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSglcCwgJXMpXG4iLCBhYmZkLCBuYW1lKTsKLSNlbmRpZgotICByZXR1cm4gbmFtZVswXSA9PSAnJCc7Ci19Ci0KLQotLyogR2V0IHNvdXJjZSBsaW5lIG51bWJlciBmb3Igc3ltYm9sICAqLwotCi1zdGF0aWMgYWxlbnQgKgotdm1zX2dldF9saW5lbm8gKGFiZmQsIHN5bWJvbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfbGluZW5vKCVwLCAlcClcbiIsIGFiZmQsIHN5bWJvbCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUHJvdmlkZWQgYSBCRkQsIGEgc2VjdGlvbiBhbmQgYW4gb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24sIGNhbGN1bGF0ZSBhbmQKLSAgIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlIHdhbnRlZAotICAgbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGUsIGZ1bmMsIGxpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGU7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19maW5kX25lYXJlc3RfbGluZSglcCwgJXMsICVwLCAlbGQsIDxyZXQ+LCA8cmV0PiwgPHJldD4pXG4iLAotCSAgICAgIGFiZmQsIHNlY3Rpb24tPm5hbWUsIHN5bWJvbHMsIChsb25nIGludClvZmZzZXQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBCYWNrLWRvb3IgdG8gYWxsb3cgZm9ybWF0LWF3YXJlIGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgZGVidWcgc3ltYm9scwotICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0gICB3aGVuIGNyZWF0aW5nIENPRkYgZmlsZXMuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi12bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sIChhYmZkLCBwdHIsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm9pZCAqcHRyOwotICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2woJXAsICVwLCAlbGQpXG4iLCBhYmZkLCBwdHIsIHNpemUpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFJlYWQgbWluaXN5bWJvbHMuICBGb3IgbWluaXN5bWJvbHMsIHdlIHVzZSB0aGUgdW5tb2RpZmllZCBhLm91dAotICAgc3ltYm9scy4gIFRoZSBtaW5pc3ltYm9sX3RvX3N5bWJvbCBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZXNlIGludG8KLSAgIEJGRCBhc3ltYm9sIHN0cnVjdHVyZXMuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgKm1pbmlzeW1zcDsKLSAgICAgdW5zaWduZWQgaW50ICpzaXplcDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3JlYWRfbWluaXN5bWJvbHMoJXAsICVkLCAlcCwgJWQpXG4iLCBhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsICpzaXplcCk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKTsKLX0KLQotLyogQ29udmVydCBhIG1pbmlzeW1ib2wgdG8gYSBCRkQgYXN5bWJvbC4gIEEgbWluaXN5bWJvbCBpcyBqdXN0IGFuCi0gICB1bm1vZGlmaWVkIGEub3V0IHN5bWJvbC4gIFRoZSBTWU0gYXJndW1lbnQgaXMgYSBzdHJ1Y3R1cmUgcmV0dXJuZWQKLSAgIGJ5IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCwgd2hpY2ggd2UgZmlsbCBpbiBoZXJlLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotdm1zX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBjb25zdCBQVFIgbWluaXN5bTsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfbWluaXN5bWJvbF90b19zeW1ib2woJXAsICVkLCAlcCwgJXApXG4iLCBhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSk7Ci19Ci0KLS8qLS0gUGFydCA0LjYsIHJlbG9jYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24KLSAgIGFzc29jaWF0ZWQgd2l0aCBzZWN0aW9uIHNlY3QgYXR0YWNoZWQgdG8gYmZkIGFiZmQuCi0gICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKCVwLCAlcylcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiAtMUw7Ci19Ci0KLQotLyogQ2FsbCB0aGUgYmFjayBlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGVuIEJGRCBhYmZkIGFuZCB0cmFuc2xhdGUgdGhlCi0gICBleHRlcm5hbCBmb3JtIG9mIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHNlYyBpbnRvIHRoZQotICAgaW50ZXJuYWwgY2Fub25pY2FsIGZvcm0uICBQbGFjZSB0aGUgdGFibGUgaW50byBtZW1vcnkgYXQgbG9jLCB3aGljaCBoYXMKLSAgIGJlZW4gcHJlYWxsb2NhdGVkLCB1c3VhbGx5IGJ5IGEgY2FsbCB0byBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLgotICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlbG9jcywgb3IgLTEgb24gZXJyb3IuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipsb2NhdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jYW5vbmljYWxpemVfcmVsb2MoJXAsICVzLCA8cmV0PiwgPHJldD4pXG4iLCBhYmZkLCBzZWN0aW9uLT5uYW1lKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIHRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBlY29mZi1hbHBoYSwgbmVlZHMgdG8gYmUgZml4ZWQgcHJvYmFibHkgKi8KLQotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2MgdHlwZXMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAicmVsb2NfbmlsKGFiZmQgJXAsIG91dHB1dF9iZmQgJXApXG4iLCBhYmZkLCBvdXRwdXRfYmZkKTsKLSAgdm1zX2RlYnVnICgyLCAiSW4gc2VjdGlvbiAlcywgc3ltYm9sICVzXG4iLAotCXNlYy0+bmFtZSwgc3ltLT5uYW1lKTsKLSAgdm1zX2RlYnVnICgyLCAicmVsb2Mgc3ltICVzLCBhZGRyICUwOGx4LCBhZGRlbmQgJTA4bHgsIHJlbG9jIGlzIGEgJXNcbiIsCi0JCXJlbG9jLT5zeW1fcHRyX3B0clswXS0+bmFtZSwKLQkJKHVuc2lnbmVkIGxvbmcpcmVsb2MtPmFkZHJlc3MsCi0JCSh1bnNpZ25lZCBsb25nKXJlbG9jLT5hZGRlbmQsIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gIHZtc19kZWJ1ZyAoMiwgImRhdGEgYXQgJXBcbiIsIGRhdGEpOwotLyogIF9iZmRfaGV4ZHVtcCAoMiwgZGF0YSwgYmZkX2dldF9yZWxvY19zaXplKHJlbG9jLT5ob3d0byksMCk7ICovCi0jZW5kaWYKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIYWNrLiBMaW5rYWdlIGlzIGRvbmUgYnkgbGlua2VyLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElOS0FHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgOCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjU2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElOS0FHRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgcHJvY2VkdXJlLCB3cml0dGVuIGFzIDMyIGJpdCB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0NPREVBRERSLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJDT0RFQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgaG93dG8gc3RydWN0dXJlIHdoaWNoLCB3aGVuIGludm9rZWQsIHdpbGwgcGVyZm9ybQotICAgdGhlIHJlbG9jYXRpb24gY29kZSBvbiBkYXRhIGZyb20gdGhlIGFyY2hpdGVjdHVyZSBub3RlZC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLXZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGludCBhbHBoYV90eXBlOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAoJXAsICVkKVx0IiwgYWJmZCwgY29kZSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgY2FzZSBCRkRfUkVMT0NfMTY6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMzI6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZMT05HOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DXzY0OgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGUVVBRDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGUVVBRDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfQlJBRERSOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6CWFscGhhX3R5cGUgPSBBTFBIQV9SX0hJTlQ7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMzI7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfNjRfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMNjQ7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToJYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElOS0FHRTsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfQ09ERUFERFI7CWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJyZWxvYyAoJWQpIGlzICpVTktOT1dOKiIsIGNvZGUpOwotCXJldHVybiAoY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSBOVUxMOwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAicmVsb2MgaXMgJXNcbiIsIGFscGhhX2hvd3RvX3RhYmxlW2FscGhhX3R5cGVdLm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiAmYWxwaGFfaG93dG9fdGFibGVbYWxwaGFfdHlwZV07Ci19Ci0KLQotLyotLSBQYXJ0IDQuNywgd3JpdGluZyBhbiBvYmplY3QgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGluIEJGRCBhYmZkIHRvIGFyY2ggYW5kIG1hY2guCi0gICBGaW5kIHRoZSBjb3JyZWN0IHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBhcmNoX2luZm8KLSAgIHBvaW50ZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9hcmNoX21hY2goJXAsICVkLCAlbGQpXG4iLCBhYmZkLCBhcmNoLCBtYWNoKTsKLSNlbmRpZgotICBhYmZkLT5hcmNoX2luZm8gPSBiZmRfc2Nhbl9hcmNoKCJhbHBoYSIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHNlY3Rpb24gaW4gQkZEIGFiZmQgdG8gdGhlIGRhdGEgc3RhcnRpbmcKLSAgIGluIG1lbW9yeSBhdCBkYXRhLiBUaGUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGFydGluZyBhdAotICAgb2Zmc2V0IG9mZnNldCBmb3IgY291bnQgYnl0ZXMuCi0KLSAgIE5vcm1hbGx5IHRydWUgaXMgcmV0dXJuZWQsIGVsc2UgZmFsc2UuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotICAgbyBiZmRfZXJyb3Jfbm9fY29udGVudHMgLSBUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUKLQlTRUNfSEFTX0NPTlRFTlRTIGF0dHJpYnV0ZSwgc28gbm90aGluZyBjYW4gYmUgd3JpdHRlbiB0byBpdC4KLSAgIG8gYW5kIHNvbWUgbW9yZSB0b28gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9zZWN0aW9uX2NvbnRlbnRzKCVwLCBzZWMgJXMsIGxvYyAlcCwgb2ZmICVsZCwgY291bnQgJWQpXG4iLAotCQkJCQlhYmZkLCBzZWN0aW9uLT5uYW1lLCBsb2NhdGlvbiwgKGxvbmcgaW50KW9mZnNldCwgKGludCljb3VudCk7Ci0gIHZtc19kZWJ1ZyAoMiwgInNlY3JhdyAlZCwgc2VjY29va2VkICVkXG4iLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSwgKGludClzZWN0aW9uLT5fY29va2VkX3NpemUpOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpOwotfQotCi0KLS8qLS0gUGFydCA0LjgsIGxpbmtlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgaW50Ci12bXNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19zaXplb2ZfaGVhZGVycyglcCwgJXMpXG4iLCBhYmZkLCAocmVsb2MpPyJUcnVlIjoiRmFsc2UiKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIG9mIHJlbG9jYXRpb24gZWZmb3J0IGZvciBiYWNrIGVuZHMKLSAgIHdoaWNoIGNhbid0IGJlIGJvdGhlcmVkIHRvIGRvIGl0IGVmZmljaWVudGx5LiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLXZtc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCSByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyglcCwgJXAsICVwLCAlcCwgJXMsICVwKVxuIiwKLQkJCWFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwgKHJlbG9jYXRlYWJsZSk/IlRydWUiOiJGYWxzZSIsIHN5bWJvbHMpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qID8/PyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcmVsYXhfc2VjdGlvbiglcCwgJXMsICVwLCA8cmV0PilcbiIsCi0JCQkJCWFiZmQsIHNlY3Rpb24tPm5hbWUsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9nY19zZWN0aW9ucyglcCwgJXApXG4iLCBhYmZkLCBsaW5rX2luZm8pOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLSAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXZtc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMoJXAsICVwKVxuIiwgYWJmZCwgbGlua19pbmZvKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogRG8gYSBsaW5rIGJhc2VkIG9uIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaAotICAgc2VjdGlvbiBvZiB0aGUgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfZmluYWxfbGluayAoYWJmZCwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZmluYWxfbGluayglcCwgJXApXG4iLCBhYmZkLCBsaW5rX2luZm8pOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTaG91bGQgdGhpcyBzZWN0aW9uIGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBwaWVjZXMgZHVyaW5nIGxpbmtpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbGlua19zcGxpdF9zZWN0aW9uKCVwLCAlcylcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuOSwgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBmaWxlKQotICAgIGJmZCAqYWJmZDsKLSAgICB2b2lkICpmaWxlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiglcCwgPHJldD4pXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMEw7Ci19Ci0KLQotLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMEw7Ci19Ci0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBhcmVsLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKiphcmVsOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy5oIGIvYmZkL3Ztcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJkZDAyLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0jdW5kZWYgdm1zCi0vKiB2bXMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVk1TIChBbHBoYSBhbmQgVmF4KSBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFZNU19ICi0jZGVmaW5lIFZNU19ICi0KLQotLyogQ29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggJ0V4eHhfJyBhcmUgZm9yIG9wZW5WTVMvQWxwaGEgKEVWQVggb2JqZWN0IGxhbmd1YWdlKSAgKi8KLQotLyogVk1TIFRleHQsIGluZm9ybWF0aW9uIGFuZCByZWxvY2F0aW9uIHJlY29yZCAoVElSL0VUSVIpIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBUSVJfU19DX1NUQV9HQkwJCTAKLSNkZWZpbmUgVElSX1NfQ19TVEFfU0IJCTEKLSNkZWZpbmUgVElSX1NfQ19TVEFfU1cJCTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFcJCTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEIJCTQKLSNkZWZpbmUgVElSX1NfQ19TVEFfUFcJCTUKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEwJCTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfVUIgIAk3Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1VXICAJOAotI2RlZmluZSBUSVJfU19DX1NUQV9CRkkgCTkKLSNkZWZpbmUgVElSX1NfQ19TVEFfV0ZJIAkxMAotI2RlZmluZSBUSVJfU19DX1NUQV9MRkkgCTExCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0VQTSAJMTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfQ0tBUkcgICAgICAgMTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfV1BCIAkxNAotI2RlZmluZSBUSVJfU19DX1NUQV9XUFcgCTE1Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1dQTCAJMTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFNZIAkxNwotI2RlZmluZSBUSVJfU19DX1NUQV9MSVQgCTE4Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX0xFUE0gICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUFYU1RBQ09EICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUlOU1RPQ09EICAgICAgIDIwCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1NCICAJMjAKLSNkZWZpbmUgVElSX1NfQ19TVE9fU1cgIAkyMQotI2RlZmluZSBUSVJfU19DX1NUT19MICAgCTIyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX0xXICAJMjIKLSNkZWZpbmUgVElSX1NfQ19TVE9fQkQgIAkyMwotI2RlZmluZSBUSVJfU19DX1NUT19XRCAgCTI0Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX0xEICAJMjUKLSNkZWZpbmUgVElSX1NfQ19TVE9fTEkgIAkyNgotI2RlZmluZSBUSVJfU19DX1NUT19QSURSICAgICAgICAyNwotI2RlZmluZSBUSVJfU19DX1NUT19QSUNSICAgICAgICAyOAotI2RlZmluZSBUSVJfU19DX1NUT19SU0IgCTI5Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JTVyAJMzAKLSNkZWZpbmUgVElSX1NfQ19TVE9fUkwgIAkzMQotI2RlZmluZSBUSVJfU19DX1NUT19WUFMgCTMyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1VTQiAJMzMKLSNkZWZpbmUgVElSX1NfQ19TVE9fVVNXIAkzNAotI2RlZmluZSBUSVJfU19DX1NUT19SVUIgCTM1Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JVVyAJMzYKLSNkZWZpbmUgVElSX1NfQ19TVE9fQiAgIAkzNwotI2RlZmluZSBUSVJfU19DX1NUT19XICAgCTM4Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JCICAJMzkKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlcgIAk0MAotI2RlZmluZSBUSVJfU19DX1NUT19SSVZCICAgICAgICA0MQotI2RlZmluZSBUSVJfU19DX1NUT19QSVJSICAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01BWFNUT0NPRCAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01JTk9QUkNPRCAgICAgICA1MAotI2RlZmluZSBUSVJfU19DX09QUl9OT1AgCTUwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FERCAJNTEKLSNkZWZpbmUgVElSX1NfQ19PUFJfU1VCIAk1MgotI2RlZmluZSBUSVJfU19DX09QUl9NVUwgCTUzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0RJViAJNTQKLSNkZWZpbmUgVElSX1NfQ19PUFJfQU5EIAk1NQotI2RlZmluZSBUSVJfU19DX09QUl9JT1IgCTU2Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0VPUiAJNTcKLSNkZWZpbmUgVElSX1NfQ19PUFJfTkVHIAk1OAotI2RlZmluZSBUSVJfU19DX09QUl9DT00gCTU5Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0lOU1YgICAgICAgIDYwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FTSCAJNjEKLSNkZWZpbmUgVElSX1NfQ19PUFJfVVNIIAk2MgotI2RlZmluZSBUSVJfU19DX09QUl9ST1QgCTYzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX1NFTCAJNjQKLSNkZWZpbmUgVElSX1NfQ19PUFJfUkVERUYgICAgICAgNjUKLSNkZWZpbmUgVElSX1NfQ19PUFJfREZMSVQgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NQVhPUFJDT0QgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NSU5DVExDT0QgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfU0VUUkIgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfQVVHUkIgICAgICAgODEKLSNkZWZpbmUgVElSX1NfQ19DVExfREZMT0MgICAgICAgODIKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RMT0MgICAgICAgODMKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RLREwgICAgICAgODQKLSNkZWZpbmUgVElSX1NfQ19NQVhDVExDT0QgICAgICAgODQKLQotI2RlZmluZSBFVElSX1NfQ19NSU5TVEFDT0QgMAkJLyogTWluaW11bSBzdG9yZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfR0JMIDAJCS8qIFN0YWNrIGdsb2JhbCBzeW1ib2wgdmFsdWUJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX0xXIDEJCS8qIFN0YWNrIGxvbmd3b3JkCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfUVcgMgkJLyogU3RhY2sgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9QUSAzCQkvKiBTdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0ICAqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfTEkgNAkJLyogU3RhY2sgbGl0ZXJhbAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX01PRCA1CQkvKiBTdGFjayBtb2R1bGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfQ0tBUkcgNgkJLyogQ2hlY2sgQXJndW1lbnRzCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhTVEFDT0QgNgkJLyogTWF4aW11bSBzdGFjayBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19NSU5TVE9DT0QgNTAJCS8qIE1pbmltdW0gc3RvcmUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0IgNTAJCS8qIFN0b3JlIGJ5dGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fVyA1MQkJLyogU3RvcmUgd29yZAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19MVyA1MgkJLyogU3RvcmUgbG9uZ3dvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19RVyA1MwkJLyogU3RvcmUgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19JTU1SIDU0CQkvKiBTdG9yZSBpbW1lZGlhdGUgUmVwZWF0ZWQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0dCTCA1NQkJLyogU3RvcmUgZ2xvYmFsCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0NBIDU2CQkvKiBTdG9yZSBjb2RlIGFkZHJlc3MJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19SQiA1NwkJLyogU3RvcmUgcmVsYXRpdmUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19BQiA1OAkJLyogU3RvcmUgYWJzb2x1dGUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19PRkYgNTkJCS8qIFN0b3JlIG9mZnNldCB3aXRoaW4gcHNlY3QJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0lNTSA2MQkJLyogU3RvcmUgaW1tZWRpYXRlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fR0JMX0xXIDYyCQkvKiBTdG9yZSBnbG9iYWwgTG9uZ3dvcmQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0xQX1BTQiA2MwkJLyogU1RPX0xQX1BTQiBub3QgdmFsaWQgaW4gbGV2ZWwgMiB1c2UgU1RDX0xQX1BTQgkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19ISU5UX0dCTCA2NAkvKiBTdG9yZSAxNCBiaXQgSElOVCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fSElOVF9QUyA2NQkJLyogU3RvcmUgMTQgYml0IEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RPQ09EIDY1CQkvKiBNYXhpbXVtIHN0b3JlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX01JTk9QUkNPRCAxMDAJCS8qIE1pbmltdW0gb3BlcmF0ZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfTk9QIDEwMAkJLyogTm8tb3AJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQUREIDEwMQkJLyogQWRkCQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9TVUIgMTAyCQkvKiBTdWJ0cmFjdAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9NVUwgMTAzCQkvKiBNdWx0aXBseQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9ESVYgMTA0CQkvKiBEaXZpZGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQU5EIDEwNQkJLyogTG9naWNhbCBBTkQJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfSU9SIDEwNgkJLyogTG9naWNhbCBpbmNsdXNpdmUgT1IJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9FT1IgMTA3CQkvKiBMb2dpY2FsIGV4Y2x1c2l2ZSBPUgkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX05FRyAxMDgJCS8qIE5lZ2F0ZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9DT00gMTA5CQkvKiBDb21wbGVtZW50CQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0lOU1YgMTEwCQkvKiBJbnNlcnQgYml0IGZpZWxkCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQVNIIDExMQkJLyogQXJpdGhtZXRpYyBzaGlmdAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1VTSCAxMTIJCS8qIFVuc2lnbmVkIHNoaWZ0CQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfUk9UIDExMwkJLyogUm90YXRlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1NFTCAxMTQJCS8qIFNlbGVjdCBvbmUgb2YgdGhyZWUgbG9uZ3dvcmRzIG9uIHRvcCBvZiBzdGFjayAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1JFREVGIDExNQkJLyogUmVkZWZpbmUgdGhpcyBzeW1ib2wgYWZ0ZXIgcGFzcyAyICAqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfREZMSVQgMTE2CQkvKiBEZWZpbmUgYSBsaXRlcmFsCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhPUFJDT0QgMTE2CQkvKiBNYXhpbXVtIG9wZXJhdGUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOQ1RMQ09EIDE1MAkJLyogTWluaW11bSBjb250cm9sIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TRVRSQiAxNTAJCS8qIFNldCByZWxvY2F0aW9uIGJhc2UJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9BVUdSQiAxNTEJCS8qIEF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9ERkxPQyAxNTIJCS8qIERlZmluZSBkZWJ1ZyBsb2NhdGlvbgkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfU1RMT0MgMTUzCQkvKiBTZXQgZGVidWcgbG9jYXRpb24JCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TVEtETCAxNTQJCS8qIFN0YWNrIGRlYnVnIGxvY2F0aW9uCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhDVExDT0QgMTU0CQkvKiBNYXhpbXVtIGNvbnRyb2wgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOU1RDQ09EIDIwMAkJLyogTWluaW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19MUCAyMDAJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciAgICAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTFBfUFNCIDIwMQkJLyogU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZSAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0JMIDIwMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0NBIDIwMwkJLyogU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19QUyAyMDQJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX05PUF9HQkwgMjA1CS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBhZGRyZXNzIG9mIGdsb2JhbCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTk9QX1BTIDIwNgkJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0JTUl9HQkwgMjA3CS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQlNSX1BTIDIwOAkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0xEQV9HQkwgMjA5CS8qIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTERBX1BTIDIxMAkJLyogU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IHBzZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19CT0hfR0JMIDIxMQkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQk9IX1BTIDIxMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTkJIX0dCTCAyMTMJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19OQkhfUFMgMjE0CQkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RDQ09EIDIxNAkJLyogTWF4aW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0KLS8qIFZNUyBHbG9iYWwgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkIChHU0QvRUdTRCkuICAqLwotCi0jZGVmaW5lIEdTRF9TX0tfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfUFNDICAgICAwCi0jZGVmaW5lIEdTRF9TX0NfU1lNICAgICAxCi0jZGVmaW5lIEdTRF9TX0NfRVBNICAgICAyCi0jZGVmaW5lIEdTRF9TX0NfUFJPICAgICAzCi0jZGVmaW5lIEdTRF9TX0NfU1lNVyAgICA0Ci0jZGVmaW5lIEdTRF9TX0NfRVBNVyAgICA1Ci0jZGVmaW5lIEdTRF9TX0NfUFJPVyAgICA2Ci0jZGVmaW5lIEdTRF9TX0NfSURDICAgICA3Ci0jZGVmaW5lIEdTRF9TX0NfRU5WICAgICA4Ci0jZGVmaW5lIEdTRF9TX0NfTFNZICAgICA5Ci0jZGVmaW5lIEdTRF9TX0NfTEVQTSAgICAxMAotI2RlZmluZSBHU0RfU19DX0xQUk8gICAgMTEKLSNkZWZpbmUgR1NEX1NfQ19TUFNDICAgIDEyCi0jZGVmaW5lIEdTRF9TX0NfU1lNViAgICAxMwotI2RlZmluZSBHU0RfU19DX0VQTVYgICAgMTQKLSNkZWZpbmUgR1NEX1NfQ19QUk9WICAgIDE1Ci0jZGVmaW5lIEdTRF9TX0NfTUFYUkVDVFlQICAgICAgIDE1Ci0KLSNkZWZpbmUgRUdTRF9TX0tfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfUFNDIDAJCS8qIFBzZWN0IGRlZmluaXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19TWU0gMQkJLyogU3ltYm9sIHNwZWNpZmljYXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19JREMgMgkJLyogUmFuZG9tIGVudGl0eSBjaGVjawkJCSovCi0jZGVmaW5lIEVHU0RfU19DX1NQU0MgNQkJLyogU2hhcmVhYmxlIGltYWdlIHBzZWN0IGRlZmluaXRpb24JKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNViA2CQkvKiBWZWN0b3JlZCAoZHVhbC12YWx1ZWQpIHZlcnNpb25zIG9mIFNZTSwgKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNTSA3CQkvKiBNYXNrZWQgdmVyc2lvbnMgb2YgU1lNLAkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNRyA4CQkvKiBFR1NUIC0gZ3N0IHZlcnNpb24gb2YgU1lNCQkqLwotI2RlZmluZSBFR1NEX1NfQ19NQVhSRUNUWVAgOAkvKiBNYXhpbXVtIGVudHJ5IHR5cGUgZGVmaW5lZAkJKi8KLQotI2RlZmluZSBHUFNfU19NX1BJQyAgICAgMQotI2RlZmluZSBHUFNfU19NX0xJQiAgICAgMgotI2RlZmluZSBHUFNfU19NX09WUiAgICAgNAotI2RlZmluZSBHUFNfU19NX1JFTCAgICAgOAotI2RlZmluZSBHUFNfU19NX0dCTCAgICAgMTYKLSNkZWZpbmUgR1BTX1NfTV9TSFIgICAgIDMyCi0jZGVmaW5lIEdQU19TX01fRVhFICAgICA2NAotI2RlZmluZSBHUFNfU19NX1JEICAgICAgMTI4Ci0jZGVmaW5lIEdQU19TX01fV1JUICAgICAyNTYKLSNkZWZpbmUgR1BTX1NfTV9WRUMgICAgIDUxMgotI2RlZmluZSBHUFNfU19LX05BTUUgICAgOQotI2RlZmluZSBHUFNfU19DX05BTUUgICAgOQotCi0jZGVmaW5lIEVHUFNfU19WX1BJQwkweDAwMDEKLSNkZWZpbmUgRUdQU19TX1ZfTElCCTB4MDAwMgotI2RlZmluZSBFR1BTX1NfVl9PVlIJMHgwMDA0Ci0jZGVmaW5lIEVHUFNfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdQU19TX1ZfR0JMCTB4MDAxMAotI2RlZmluZSBFR1BTX1NfVl9TSFIJMHgwMDIwCi0jZGVmaW5lIEVHUFNfU19WX0VYRQkweDAwNDAKLSNkZWZpbmUgRUdQU19TX1ZfUkQJMHgwMDgwCi0jZGVmaW5lIEVHUFNfU19WX1dSVAkweDAxMDAKLSNkZWZpbmUgRUdQU19TX1ZfVkVDCTB4MDIwMAotI2RlZmluZSBFR1BTX1NfVl9OT01PRAkweDA0MDAKLSNkZWZpbmUgRUdQU19TX1ZfQ09NCTB4MDgwMAotCi0jZGVmaW5lIEdTWV9TX01fV0VBSyAgICAxCi0jZGVmaW5lIEdTWV9TX01fREVGICAgICAyCi0jZGVmaW5lIEdTWV9TX01fVU5JICAgICA0Ci0jZGVmaW5lIEdTWV9TX01fUkVMICAgICA4Ci0KLSNkZWZpbmUgRUdTWV9TX1ZfV0VBSwkweDAwMDEKLSNkZWZpbmUgRUdTWV9TX1ZfREVGCTB4MDAwMgotI2RlZmluZSBFR1NZX1NfVl9VTkkJMHgwMDA0Ci0jZGVmaW5lIEVHU1lfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdTWV9TX1ZfQ09NTQkweDAwMTAKLSNkZWZpbmUgRUdTWV9TX1ZfVkVDRVAJMHgwMDIwCi0jZGVmaW5lIEVHU1lfU19WX05PUk0JMHgwMDQwCi0KLSNkZWZpbmUgTFNZX1NfTV9ERUYgICAgIDIKLSNkZWZpbmUgTFNZX1NfTV9SRUwgICAgIDgKLQotI2RlZmluZSBFTlZfU19NX0RFRiAgICAgMQotI2RlZmluZSBFTlZfU19NX05FU1RFRCAgMgotCi0vKgotICoJRGVidWdnZXIgc3ltYm9sIGRlZmluaXRpb25zOiAgVGhlc2UgYXJlIGRvbmUgYnkgaGFuZCwgYXMgbm8KLSAqCQkJCQltYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gc2VlbXMKLSAqCQkJCQl0byBiZSBhdmFpbGFibGUuCi0gKi8KLSNkZWZpbmUgRFNUX1NfQ19DCQkgIDcJLyogTGFuZ3VhZ2UgPT0gIkMiCSovCi0jZGVmaW5lIERTVF9TX0NfQ1hYCQkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCQkxNTMKLSNkZWZpbmUJRFNUX1NfQ19TT1VSQ0UJCTE1NQkvKiBTb3VyY2UgZmlsZQkJKi8KLSNkZWZpbmUgRFNUX1NfQ19QUk9MT0cJCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkJMTc2CS8qIEJlZ2lubmluZyBvZiBibG9jawkqLwotI2RlZmluZQlEU1RfU19DX0JMS0VORAkJMTc3CS8qIEVuZCBvZiBibG9jawkqLwotI2RlZmluZSBEU1RfU19DX0VOVFJZCQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkJMTg0Ci0jZGVmaW5lCURTVF9TX0NfTElORV9OVU0JMTg1CS8qIExpbmUgTnVtYmVyCQkqLwotI2RlZmluZSBEU1RfU19DX0xCTE9STElUCTE4NgotI2RlZmluZSBEU1RfU19DX0xBQkVMCQkxODcKLSNkZWZpbmUJRFNUX1NfQ19NT0RCRUcJCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECQkxODkJLyogRW5kIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkJFRwkJMTkwCS8qIEJlZ2lubmluZyBvZiByb3V0aW5lCSovCi0jZGVmaW5lCURTVF9TX0NfUlRORU5ECQkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cgNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IgNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJMTEKLSNkZWZpbmUgRFNUX1NfQ19TRVRfUENfTAkxMgotI2RlZmluZSBEU1RfU19DX1NFVF9TVE1UTlVNCTEzCi0jZGVmaW5lIERTVF9TX0NfVEVSTQkJMTQJLyogRW5kIG9mIGxpbmVzCSovCi0jZGVmaW5lIERTVF9TX0NfVEVSTV9XCQkxNQkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUJRFNUX1NfQ19TRVRfQUJTX1BDCTE2CS8qIFNldCBQQwkqLwotI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX0wJMTcJLyogSW5jciBQQwkqLwotI2RlZmluZSBEU1RfU19DX0lOQ1JfTElOVU1fTAkxOAkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9CCTE5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fTAkyMAkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lCURTVF9TX0NfVEVSTV9MCQkyMQkvKiBFbmQgb2YgbGluZXMJKi8KLS8qIHRoZXNlIGFyZSB1c2VkIHdpdGggRFNUX1NfQ19TT1VSQ0UgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVDTEZJTEUJIDEJLyogRGVjbGFyZSBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRGSUxFCSAyCS8qIFNldCBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfTAkgMwkvKiBTZXQgcmVjb3JkLCBsb25nd29yZCB2YWx1ZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfVwkgNAkvKiBTZXQgcmVjb3JkLCB3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX1cJMTAJLyogIyBvZiBsaW5lLCB3b3JkIGNvdW50ZXIgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfQgkxMQkvKiAjIG9mIGxpbmUsIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19GT1JNRkVFRAkxNgkvKiBeTCBjb3VudHMgYXMgYSByZWNvcmQgKi8KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgZGF0YSB0eXBlcy4gIEFueXRoaW5nIG5vdCBvbgotICogdGhlIGxpc3QgaXMgaW5jbHVkZWQgdW5kZXIgJ2FkdmFuY2VkX3R5cGUnCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQ0hBUgkJMHgwMgotI2RlZmluZSBEQkdfU19DX1VTSU5UCQkweDAzCi0jZGVmaW5lIERCR19TX0NfVUxJTlQJCTB4MDQKLSNkZWZpbmUgREJHX1NfQ19VUVVBRAkJMHgwNQotI2RlZmluZSBEQkdfU19DX1NDSEFSCQkweDA2Ci0jZGVmaW5lIERCR19TX0NfU1NJTlQJCTB4MDcKLSNkZWZpbmUgREJHX1NfQ19TTElOVAkJMHgwOAotI2RlZmluZSBEQkdfU19DX1NRVUFECQkweDA5Ci0jZGVmaW5lIERCR19TX0NfUkVBTDQJCTB4MGEKLSNkZWZpbmUgREJHX1NfQ19SRUFMOAkJMHgwYgkJLyogRF9mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg0CQkweDBjCQkvKiAyeEZfZmxvYXQgY29tcGxleCBmbG9hdCAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDgJCTB4MGQJCS8qIDJ4RF9mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX1JFQUw4X0cJCTB4MWIJCS8qIEdfZmxvYXQgZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOF9HCTB4MWQJCS8qIDJ4R19mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0ZVTkNUSU9OX0FERFIJMHgxNwotI2RlZmluZSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUJMHhhMwotLyogIFNvbWUgb2YgdGhlc2UgYXJlIGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICBbcHJdCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUQQkJMHgwMQkvKiB1bnNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUVQkJMHgyMgkvKiB1bnNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRBCQkweDI5CS8qIHNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19TQklUVQkJMHgyYQkvKiBzaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19DU1RSSU5HCQkweDJlCS8qIGFzY2l6ICgnXDAnIHRlcm1pbmF0ZWQpIHN0cmluZyAqLwotI2RlZmluZSBEQkdfU19DX1dDSEFSCQkweDM4CS8qIHdjaGFyX3QgKi8KLS8qICBUaGVzZSBhcmUgZGVzY3JpcHRvciBjbGFzcyBjb2Rlcy4KLSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19TCQkweDAxCS8qIHN0YXRpYyAoZml4ZWQgbGVuZ3RoKSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19ECQkweDAyCS8qIGR5bmFtaWMgc3RyaW5nIChub3QgdmlhIG1hbGxvYyEpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0EJCTB4MDQJLyogYXJyYXkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfVUJTCQkweDBkCS8qIHVuYWxpZ25lZCBiaXQgc3RyaW5nICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBvZiBzdHJ1Y3QKLSAqICB1bmlvbiBhbmQgZW51bSByZWNvcmRzCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19FTlVNX0lURU0JCTB4YTQKLSNkZWZpbmUgREJHX1NfQ19FTlVNX1NUQVJUCQkweGE1Ci0jZGVmaW5lIERCR19TX0NfRU5VTV9FTkQJCTB4YTYKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfSVRFTQkJRFNUX0tfVkZMQUdTX0JJVE9GRlMJLyogMHhmZiAqLwotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9TVEFSVAkJMHhhYgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9FTkQJCTB4YWMKLSNkZWZpbmUgRFNUX0tfVFlQU1BFQwkJCTB4YWYJCS8qIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotLyogVGhlc2UgY29kZXMgYXJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZHMKLSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfTk9WQUwJCTB4ODAJLyogc3RydWN0IGRlZmluaXRpb24gb25seSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfRFNDCQkweGZhCS8qIGRlc2NyaXB0b3IgdXNlZCAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfVFZTCQkweGZiCS8qIHRyYWlsaW5nIHZhbHVlIHNwZWNpZmllZCAqLwotI2RlZmluZSBEU1RfS19WU19GT0xMT1dTCQkweGZkCS8qIHZhbHVlIHNwZWMgZm9sbG93cyAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfQklUT0ZGUwkJMHhmZgkvKiB2YWx1ZSBjb250YWlucyBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfTElURVJBTAkwCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfQUREUgkxCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfREVTQwkyCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfUkVHCTMKLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9BUAkweDBjCS8qIFIxMiAqLwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0ZQCTB4MGQJLyogUjEzICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfU1AJMHgwZQkvKiBSMTQgKi8KLSNkZWZpbmUgRFNUX1ZfVkFMS0lORAkJMAkvKiBvZmZzZXQgb2YgdmFsa2luZCBmaWVsZCAqLwotI2RlZmluZSBEU1RfVl9JTkRJUkVDVAkJMgkvKiBvZmZzZXQgdG8gaW5kaXJlY3QgYml0ICovCi0jZGVmaW5lIERTVF9WX0RJU1AJCTMJLyogb2Zmc2V0IHRvIGRpc3BsYWNlbWVudCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfUkVHTlVNCQk0CS8qIG9mZnNldCB0byByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgRFNUX01fSU5ESVJFQ1QJCSgxPDxEU1RfVl9JTkRJUkVDVCkKLSNkZWZpbmUgRFNUX01fRElTUAkJKDE8PERTVF9WX0RJU1ApCi0jZGVmaW5lIERCR19DX0ZVTkNUSU9OX1BBUkFNCS8qIDB4YzkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9BUDw8RFNUX1ZfUkVHTlVNKSkKLSNkZWZpbmUgREJHX0NfTE9DQUxfU1lNCQkvKiAweGQ5ICovCVwKLQkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfRlA8PERTVF9WX1JFR05VTSkpCi0vKiBLaW5kcyBvZiB2YWx1ZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1ZTX0FMTE9DX1NQTElUCTMJLyogc3BsaXQgbGlmZXRpbWUgKi8KLS8qIEtpbmRzIG9mIHR5cGUgc3BlY2lmaWNhdGlvbnMKLSAqLwotI2RlZmluZSBEU1RfS19UU19BVE9NCQkweDAxCS8qIGF0b21pYyB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfRFNDCQkweDAyCS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX0lORAkJMHgwMwkvKiBpbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfVFBUUgkJMHgwNAkvKiB0eXBlZCBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19QVFIJCTB4MDUJLyogcG9pbnRlciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfQVJSQVkJCTB4MDcJLyogYXJyYXkgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX05PVl9MRU5HCTB4MGUJLyogbm92ZWwgbGVuZ3RoIHR5cGUgc3BlYyAqLwotLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VmZml4IHJlY29yZHMgdG8gZGV0ZXJtaW5lIHRoZQotICogIGFjdHVhbCBkYXRhIHR5cGUKLSAqLwotI2RlZmluZSBEQkdfU19DX0JBU0lDCQkJRFNUX0tfVFNfQVRPTQotI2RlZmluZSBEQkdfU19DX0JBU0lDX0FSUkFZCQlEU1RfS19UU19EU0MKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1QJCQlEU1RfS19UU19JTkQKLSNkZWZpbmUgREJHX1NfQ19QT0lOVEVSCQkJRFNUX0tfVFNfVFBUUgotI2RlZmluZSBEQkdfU19DX1ZPSUQJCQlEU1RfS19UU19QVFIKLSNkZWZpbmUgREJHX1NfQ19DT01QTEVYX0FSUkFZCQlEU1RfS19UU19BUlJBWQotCi0vKiBWTVMgTW9kdWxlIGhlYWRlciByZWNvcmQgKEVNSCkgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIE1IRF9TX0NfTUhEIDAKLSNkZWZpbmUgTUhEX1NfQ19MTk0gMQotI2RlZmluZSBNSERfU19DX1NSQyAyCi0jZGVmaW5lIE1IRF9TX0NfVFRMIDMKLSNkZWZpbmUgTUhEX1NfQ19DUFIgNAotI2RlZmluZSBNSERfU19DX01UQyA1Ci0jZGVmaW5lIE1IRF9TX0NfR1RYIDYKLSNkZWZpbmUgTUhEX1NfQ19NQVhIRFJUWVAgNgotCi0jZGVmaW5lIEVNSF9TX0NfTUhEIDAJCS8qIE1haW4gaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgRU1IX1NfQ19MTk0gMQkJLyogTGFuZ3VhZ2UgbmFtZSBhbmQgdmVyc2lvbgkqLwotI2RlZmluZSBFTUhfU19DX1NSQyAyCQkvKiBTb3VyY2UgZmlsZSBzcGVjaWZpY2F0aW9uCSovCi0jZGVmaW5lIEVNSF9TX0NfVFRMIDMJCS8qIFRpdGxlIHRleHQgb2YgbW9kdWxlCQkqLwotI2RlZmluZSBFTUhfU19DX0NQUiA0CQkvKiBDb3B5cmlnaHQgbm90aWNlCQkqLwotI2RlZmluZSBFTUhfU19DX01UQyA1CQkvKiBNYWludGVuYW5jZSBzdGF0dXMJCSovCi0jZGVmaW5lIEVNSF9TX0NfR1RYIDYJCS8qIEdlbmVyYWwgdGV4dAkJCSovCi0jZGVmaW5lIEVNSF9TX0NfTUFYSERSVFlQIDYJLyogTWF4aW11bSBhbGxvd2FibGUgdHlwZQkqLwotCi0vKiB2bXMuYy4gICovCi0KLWV4dGVybiBhc3ltYm9sICpfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogdm1zLWdzZC5jLiAgKi8KLQotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiB2bXMtbWhkLmMuICAqLwotCi1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci0KLS8qIHZtcy10aXIuYy4gICovCi0KLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGlyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfZGJnIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGJ0IFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfbG5rIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLQotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90aXIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90YnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9kYmcgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkxCi0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQkyCi0jZGVmaW5lIEFMUEhBX1JfSElOVAkJMwotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJNAotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkJNQotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkJNgotI2RlZmluZSBBTFBIQV9SX09QX1BVU0gJCTcKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRQk4Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkJOQotI2RlZmluZSBBTFBIQV9SX09QX1BSU0hJRlQJMTAKLSNkZWZpbmUgQUxQSEFfUl9MSU5LQUdFCQkxMQotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEyCi0jZGVmaW5lIEFMUEhBX1JfQ09ERUFERFIJMTMKLQotLyogT2JqZWN0IGxhbmd1YWdlIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBPQkpfU19DX0hEUiAwCQkvKlZBWCBtb2R1bGUgaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19HU0QgMQkJLypWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RJUiAyCQkvKlZBWCB0ZXh0IGluZm9ybWF0aW9uIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT00gMwkJLypWQVggZW5kIG9mIG1vZHVsZSByZWNvcmQJCSovCi0jZGVmaW5lIE9CSl9TX0NfREJHIDQJCS8qVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RCVCA1CQkvKlZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIE9CSl9TX0NfTE5LIDYJCS8qVkFYIGxpbmtlciBvcHRpb25zIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT01XIDcJCS8qVkFYIGVuZCBvZiBtb2R1bGUgd29yZC1wc2VjdCByZWNvcmQJKi8KLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNUWVAgNwkvKlZBWCBMYXN0IGFzc2lnbmVkIHJlY29yZCB0eXBlCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FTUggOAkJLypFVkFYIG1vZHVsZSBoZWFkZXIgcmVjb3JkCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FRU9NIDkJCS8qRVZBWCBlbmQgb2YgbW9kdWxlIHJlY29yZAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRUdTRCAxMAkvKkVWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZCAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfRVRJUiAxMQkvKkVWQVggdGV4dCBpbmZvcm1hdGlvbiByZWNvcmQJCSovCi0jZGVmaW5lIEVPQkpfU19DX0VEQkcgMTIJLypFVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBFT0JKX1NfQ19FVEJUIDEzCS8qRVZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIEVPQkpfU19DX01BWFJFQ1RZUCAxMwkvKkVWQVggTGFzdCBhc3NpZ25lZCByZWNvcmQgdHlwZQkqLwotI2RlZmluZSBPQkpfU19LX1NVQlRZUCAxCi0jZGVmaW5lIE9CSl9TX0NfU1VCVFlQIDEKLSNkZWZpbmUgRU9CSl9TX0tfU1VCVFlQIDQKLSNkZWZpbmUgRU9CSl9TX0NfU1VCVFlQIDQKLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNTSVogMjA0OAkvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBFT0JKX1NfQ19NQVhSRUNTSVogODE5MiAvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBPQkpfU19DX1NUUkxWTCAwCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVPQkpfU19DX1NUUkxWTCAyCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9CSl9TX0NfU1lNU0laIDMxCS8qTWF4aW11bSBzeW1ib2wgbGVuZ3RoCQkqLwotI2RlZmluZSBFT0JKX1NfQ19TWU1TSVogNjQJLypNYXhpbXVtIHN5bWJvbCBsZW5ndGgJCSovCi0jZGVmaW5lIEVPQkpfU19DX1NFQ1NJWiAzMQkvKk1heGltdW0gc2VjdGlvbiBuYW1lIGxlbmd0aAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19TVE9SRVBMSU0gLTEJLypNYXhpbXVtIHJlcGVhdCBjb3VudCBvbiBzdG9yZSBjb21tYW5kcyAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfU1RPUkVQTElNIC0xCS8qTWF4aW11bSByZXBlYXQgY291bnQgb24gc3RvcmUgY29tbWFuZHMgICovCi0jZGVmaW5lIE9CSl9TX0NfUFNDQUxJTElNIDkJLypNYXhpbXVtIHAtc2VjdCBhbGlnbm1lbnQgICAgICAgICAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfUFNDQUxJTElNIDE2CS8qTWF4aW11bSBwLXNlY3QgYWxpZ25tZW50ICAgICAgICAgICovCi0KLSNkZWZpbmUgRVZBWF9PRkZTRVQJMjU2CS8qdHlwZSBvZmZzZXQgZm9yIEVWQVggY29kZXMgaW4gc3dpdGNoICAqLwotLyogTWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucy4gICovCi0KLSNpZiBfX0dOVUNfXwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdXF1YWQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVxdWFkOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX09VVFJFQ19TSVpFIDQwOTYKLSNkZWZpbmUgTUlOX09VVFJFQ19MVUZUIDY0Ci0KLXR5cGVkZWYgc3RydWN0IF92bXNfc2VjdGlvbiB7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBzdHJ1Y3QgX3Ztc19zZWN0aW9uICpuZXh0OwotfSB2bXNfc2VjdGlvbjsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zYXZlX3Ztc19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBkYXRhLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIHZtc19zZWN0aW9uICpfYmZkX2dldF92bXNfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpbmRleCkpOwotCi10eXBlZGVmIHN0cnVjdCBfdm1zX3JlbG9jIHsKLSAgc3RydWN0IF92bXNfcmVsb2MgKm5leHQ7Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLX0gdm1zX3JlbG9jOwotCi0vKiB2bXMgbW9kdWxlIGhlYWRlciAgKi8KLQotc3RydWN0IGhkcl9zdHJ1YyB7Ci0gIGludCBoZHJfYl9zdHJsdmw7Ci0gIGxvbmcgaGRyX2xfYXJjaDE7Ci0gIGxvbmcgaGRyX2xfYXJjaDI7Ci0gIGxvbmcgaGRyX2xfcmVjc2l6OwotICBjaGFyICpoZHJfdF9uYW1lOwotICBjaGFyICpoZHJfdF92ZXJzaW9uOwotICBjaGFyICpoZHJfdF9kYXRlOwotICBjaGFyICpoZHJfY19sbm07Ci0gIGNoYXIgKmhkcl9jX3NyYzsKLSAgY2hhciAqaGRyX2NfdHRsOwotfTsKLQotCi0vKiB2bXMgZW5kIG9mIG1vZHVsZSAgKi8KLQotc3RydWN0IGVvbV9zdHJ1YyB7Ci0gIGxvbmcgZW9tX2xfdG90YWxfbHBzOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX2NvbWNvZDsKLSAgYm9vbGVhbiBlb21faGFzX3RyYW5zZmVyOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX3RmcmZsZzsKLSAgbG9uZyBlb21fbF9wc2luZHg7Ci0gIGxvbmcgZW9tX2xfdGZyYWRyOwotfTsKLQotZW51bSBmaWxlX2Zvcm1hdF9lbnVtIHsgRkZfVU5LTk9XTiwgRkZfRk9SRUlHTiwgRkZfTkFUSVZFLCBGRl9WQVggfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgdm1zX3N5bWJvbF9zdHJ1Y3QgewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgYmZkX2hhc2g7Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLX0gdm1zX3N5bWJvbF9lbnRyeTsKLQotLyogc3RhY2sgdmFsdWUgZm9yIHB1c2gvcG9wIGNvbW1hbmRzICAqLwotCi1zdHJ1Y3Qgc3RhY2tfc3RydWN0IHsKLSAgdXF1YWQgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIFNUQUNLU0laRSA4MTkyCi0KLS8qIGxvY2F0aW9uIHN0YWNrIGRlZmluaXRpb25zIGZvciBDVExfREZMT0MsIENUTF9TVExPQywgYW5kIENUTF9TVEtETCAgKi8KLQotc3RydWN0IGxvY2F0aW9uX3N0cnVjdCB7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIExPQ0FUSU9OX1NBVkVfU0laRSAzMgotCi0jZGVmaW5lIFZNU19TRUNUSU9OX0NPVU5UIDEwMjQKLQotc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0IHsKLSAgaW50IGlzX3ZheDsKLSAgYm9vbGVhbiBmaXh1cF9kb25lOwkJCS8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgYWxsCi0JCQkJCSAgIHNlY3Rpb24gcG9pbnRlcnMgYW5kIFBSSVYoc2VjdGlvbnMpCi0JCQkJCSAgIGFyZSBzZXQgdXAgY29ycmVjdGx5ICAqLwotICB1bnNpZ25lZCBjaGFyICp2bXNfYnVmOwkJLyogYnVmZmVyIHRvIHJlY29yZCAgKi8KLSAgaW50IGJ1Zl9zaXplOwkJCQkvKiBtYXggc2l6ZSBvZiBidWZmZXIgICovCi0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CQkvKiBhY3R1YWwgcmVjb3JkIHB0ciAgKi8KLSAgaW50IHJlY19sZW5ndGg7CQkJLyogcmVtYWluaW5nIHJlY29yZCBsZW5ndGggICovCi0gIGludCByZWNfc2l6ZTsJCQkJLyogYWN0dWFsIHJlY29yZCBzaXplICAqLwotICBpbnQgcmVjX3R5cGU7CQkJCS8qIGFjdHVhbCByZWNvcmQgdHlwZSAgKi8KLSAgZW51bSBmaWxlX2Zvcm1hdF9lbnVtIGZpbGVfZm9ybWF0OwotCi0gIHN0cnVjdCBoZHJfc3RydWMgaGRyX2RhdGE7CQkvKiBkYXRhIGZyb20gSERSL0VNSCByZWNvcmQgICovCi0gIHN0cnVjdCBlb21fc3RydWMgZW9tX2RhdGE7CQkvKiBkYXRhIGZyb20gRU9NL0VFT00gcmVjb3JkICAqLwotICBpbnQgc2VjdGlvbl9jb3VudDsJCQkvKiAjIG9mIHNlY3Rpb25zIGluIGZvbGxvd2luZyBhcnJheSAgKi8KLSAgYXNlY3Rpb24gKipzZWN0aW9uczsJCQkvKiBhcnJheSBvZiBHU0QvRUdTRCBzZWN0aW9ucyAgKi8KLSAgaW50IGdzZF9zeW1fY291bnQ7CQkJLyogIyBvZiBHU0QvRUdTRCBzeW1ib2xzICAqLwotICBhc3ltYm9sICoqc3ltYm9sczsJCQkvKiB2ZWN0b3Igb2YgR1NEL0VHU0Qgc3ltYm9scyAgKi8KLSAgc3RydWN0IHByb2NfdmFsdWUgKnByb2NlZHVyZTsKLQotICBzdHJ1Y3Qgc3RhY2tfc3RydWN0ICpzdGFjazsKLSAgaW50IHN0YWNrcHRyOwotCi0gIHZtc19zZWN0aW9uICp2bXNfc2VjdGlvbl90YWJsZVtWTVNfU0VDVElPTl9DT1VOVF07Ci0KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp2bXNfc3ltYm9sX3RhYmxlOwotICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltY2FjaGU7Ci0gIGludCBzeW1udW07Ci0KLSAgc3RydWN0IGxvY2F0aW9uX3N0cnVjdCAqbG9jYXRpb25fc3RhY2s7Ci0KLSAgYXNlY3Rpb24gKmltYWdlX3NlY3Rpb247CQkvKiBzZWN0aW9uIGZvciBpbWFnZV9wdHIgICovCi0gIHVuc2lnbmVkIGNoYXIgKmltYWdlX3B0cjsJCS8qIGEgcG9pbnRlciB0byBzZWN0aW9uLT5jb250ZW50cyAqLwotCi0gIHVuc2lnbmVkIGNoYXIgcGRzY1s4XTsJCS8qIHByb2NlZHVyZSBkZXNjcmlwdG9yICovCi0KLSAgLyogT3V0cHV0IHJvdXRpbmUgc3RvcmFnZSAgKi8KLQotICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfYnVmOwkJLyogb3V0cHV0IGRhdGEgICovCi0gIGludCBwdXNoX2xldmVsOwotICBpbnQgcHVzaGVkX3NpemU7Ci0gIGludCBsZW5ndGhfcG9zOwotICBpbnQgb3V0cHV0X3NpemU7Ci0gIGludCBvdXRwdXRfYWxpZ25tZW50OwotCi0gIC8qIGxpbmthZ2UgaW5kZXggY291bnRlcgotICAgdXNlZCBieSBjb25kaXRpb25hbCBzdG9yZSBjb21tYW5kcyAoRVRJUl9TX0NfU1RDXykgICovCi0KLSAgaW50IHZtc19saW5rYWdlX2luZGV4OwotCi0gIC8qIHNlZSB0Yy1hbHBoYS5jIG9mIGdhcyBmb3IgYSBkZXNjcmlwdGlvbi4gICovCi0gIGludCBmbGFnX2hhc2hfbG9uZ19uYW1lczsJLyogLSssIGhhc2ggaW5zdGVhZCBvZiB0cnVuY2F0ZSAqLwotICBpbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCwgc2hvdyBoYXNoaW5nL3RydW5jYXRpb24gKi8KLX07Ci0KLSNkZWZpbmUgUFJJVihuYW1lKQkoKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCAqKWFiZmQtPnRkYXRhLmFueSktPm5hbWUKLQotI2RlZmluZSBTRUNUSU9OX05BTUVfVEVNUExBVEUgIl9fU0VDX18lZCIKLQotI2lmIFZNU19ERUJVRwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfZGVidWcgUEFSQU1TKChpbnQgbGV2ZWwsIGNoYXIgKmZvcm1hdCwgLi4uKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2hleGR1bXAKLSAgUEFSQU1TICgoaW50IGxldmVsLCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KSk7Ci0KLSNkZWZpbmUgdm1zX2RlYnVnIF9iZmRfdm1zX2RlYnVnCi0jZW5kaWYKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF92bXNfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50ICp0eXBlLCBpbnQgKmxlbmd0aCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19nZXRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19uZXh0X3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IHNpemUpKTsKLWV4dGVybiBjaGFyICpfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnB0cikpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfcHVzaCBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbCwgaW50IHBzZWN0KSk7Ci1leHRlcm4gdXF1YWQgX2JmZF92bXNfcG9wIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50ICpwc2VjdCkpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGRhdGEsIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfYmVnaW4KLSAgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgcmVjdHlwZSwgaW50IHJlY2hlYWQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgYWxpZ250bykpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X3B1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcG9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfb3V0cHV0X2NoZWNrIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHNpemUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgdmFsdWUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9sb25nIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X3F1YWQgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICp2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2R1bXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpkYXRhLAotCQkJCQkgICBpbnQgbGVuZ3RoKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZmlsbCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCB2YWx1ZSwgaW50IGxlbmd0aCkpOwotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKmluLCBpbnQgbWF4bGVuKSk7Ci0KLWV4dGVybiB2bXNfc3ltYm9sX2VudHJ5ICpfYmZkX3Ztc19lbnRlcl9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICpuYW1lKSk7Ci0KLSNlbmRpZiAvKiBWTVNfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3hjb2ZmbGluay5jIGIvYmZkL3hjb2ZmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjVjMGM2Li4wMDAwMDAwCi0tLSBhL2JmZC94Y29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NDAgKzAsMCBAQAotLyogUE9XRVIvUG93ZXJQQyBYQ09GRiBsaW5rZXIgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4sIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBYQ09GRiBsaW5rZXIgY29kZS4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogSW4gb3JkZXIgdG8gc3VwcG9ydCBsaW5raW5nIGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIGludG8gYW4KLSAgIFhDT0ZGIGZvcm1hdCwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIGEgcGFydGljdWxhcgotICAgYmZkX3RhcmdldCBpcyBhbiBYQ09GRiB2ZWN0b3IuICBGSVhNRTogV2UgbmVlZCB0byByZXRoaW5rIHRoaXMKLSAgIHdob2xlIGFwcHJvYWNoLiAgKi8KLSNkZWZpbmUgWENPRkZfWFZFQ1AoeHYpIFwKLSAgKHN0cmNtcCAoKHh2KS0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgPT0gMCBcCi0gICB8fCBzdHJjbXAgKCh4diktPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpID09IDApCi0KLS8qIEdldCB0aGUgWENPRkYgaGFzaCB0YWJsZSBlbnRyaWVzIGZvciBhIEJGRC4gICovCi0jZGVmaW5lIG9ial94Y29mZl9zeW1faGFzaGVzKGJmZCkgXAotICAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKiopIG9ial9jb2ZmX3N5bV9oYXNoZXMgKGJmZCkpCi0KLS8qIFhDT0ZGIHJlbG9jYXRpb24gdHlwZXMuICBUaGVzZSBwcm9iYWJseSBiZWxvbmcgaW4gYSBoZWFkZXIgZmlsZQotICAgc29tZXdoZXJlLiAgVGhlIHJlbG9jYXRpb25zIGFyZSBkZXNjcmliZWQgaW4gdGhlIGZ1bmN0aW9uCi0gICBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uIGluIHRoaXMgZmlsZS4gICovCi0KLSNkZWZpbmUgUl9QT1MgICAoMHgwMCkKLSNkZWZpbmUgUl9ORUcgICAoMHgwMSkKLSNkZWZpbmUgUl9SRUwgICAoMHgwMikKLSNkZWZpbmUgUl9UT0MgICAoMHgwMykKLSNkZWZpbmUgUl9SVEIgICAoMHgwNCkKLSNkZWZpbmUgUl9HTCAgICAoMHgwNSkKLSNkZWZpbmUgUl9UQ0wgICAoMHgwNikKLSNkZWZpbmUgUl9CQSAgICAoMHgwOCkKLSNkZWZpbmUgUl9CUiAgICAoMHgwYSkKLSNkZWZpbmUgUl9STCAgICAoMHgwYykKLSNkZWZpbmUgUl9STEEgICAoMHgwZCkKLSNkZWZpbmUgUl9SRUYgICAoMHgwZikKLSNkZWZpbmUgUl9UUkwgICAoMHgxMikKLSNkZWZpbmUgUl9UUkxBICAoMHgxMykKLSNkZWZpbmUgUl9SUlRCSSAoMHgxNCkKLSNkZWZpbmUgUl9SUlRCQSAoMHgxNSkKLSNkZWZpbmUgUl9DQUkgICAoMHgxNikKLSNkZWZpbmUgUl9DUkVMICAoMHgxNykKLSNkZWZpbmUgUl9SQkEgICAoMHgxOCkKLSNkZWZpbmUgUl9SQkFDICAoMHgxOSkKLSNkZWZpbmUgUl9SQlIgICAoMHgxYSkKLSNkZWZpbmUgUl9SQlJDICAoMHgxYikKLQotLyogVGhlIGZpcnN0IHdvcmQgb2YgZ2xvYmFsIGxpbmthZ2UgY29kZS4gIFRoaXMgbXVzdCBiZSBtb2RpZmllZCBieQotICAgZmlsbGluZyBpbiB0aGUgY29ycmVjdCBUT0Mgb2Zmc2V0LiAgKi8KLQotI2RlZmluZSBYQ09GRl9HTElOS19GSVJTVCAoMHg4MTgyMDAwMCkJLyogbHd6IHIxMiwwKHIyKSAqLwotCi0vKiBUaGUgcmVtYWluaW5nIHdvcmRzIG9mIGdsb2JhbCBsaW5rYWdlIGNvZGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB4Y29mZl9nbGlua19jb2RlW10gPQotewotICAweDkwNDEwMDE0LAkvKiBzdHcgcjIsMjAocjEpICovCi0gIDB4ODAwYzAwMDAsCS8qIGx3eiByMCwwKHIxMikgKi8KLSAgMHg4MDRjMDAwNCwJLyogbHd6IHIyLDQocjEyKSAqLwotICAweDdjMDkwM2E2LAkvKiBtdGN0ciByMCAqLwotICAweDRlODAwNDIwLAkvKiBiY3RyICovCi0gIDB4MCwJCS8qIHN0YXJ0IG9mIHRyYWNlYmFjayB0YWJsZSAqLwotICAweDAwMGM4MDAwLAkvKiB0cmFjZWJhY2sgdGFibGUgKi8KLSAgMHgwCQkvKiB0cmFjZWJhY2sgdGFibGUgKi8KLX07Ci0KLSNkZWZpbmUgWENPRkZfR0xJTktfU0laRSBcCi0gICgoKHNpemVvZiB4Y29mZl9nbGlua19jb2RlIC8gc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGVbMF0pICogNCkgKyA0KQotCi0vKiBXZSByZXVzZSB0aGUgU0VDX1JPTSBmbGFnIGFzIGEgbWFyayBmbGFnIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCi0gICBUaGlzIGZsYWcgd2lsbCBvbmx5IGJlIHVzZWQgb24gaW5wdXQgc2VjdGlvbnMuICAqLwotCi0jZGVmaW5lIFNFQ19NQVJLIChTRUNfUk9NKQotCi0vKiBUaGUgbGRoZHIgc3RydWN0dXJlLiAgVGhpcyBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlcgotICAgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZGhkcgotewotICAvKiBUaGUgdmVyc2lvbiBudW1iZXI6IGN1cnJlbnRseSBhbHdheXMgMS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF92ZXJzaW9uOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbCB0YWJsZSBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25zeW1zOwotICAvKiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gdGFibGUgZW50cmllcy4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9ucmVsb2M7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIGltcG9ydCBmaWxlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9pc3RsZW47Ci0gIC8qIFRoZSBudW1iZXIgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25pbXBpZDsKLSAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlciBzZWN0aW9uIHRvIHRoZSBmaXJzdAotICAgICBlbnRyeSBpbiB0aGUgaW1wb3J0IGZpbGUgdGFibGUuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfaW1wb2ZmOwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfc3RsZW47Ci0gIC8qIFRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIC5sb2FkZXIgc2VjdGlvbiB0byB0aGUgZmlyc3QKLSAgICAgZW50cnkgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zdG9mZjsKLX07Ci0KLXN0cnVjdCBleHRlcm5hbF9sZGhkcgotewotICBiZmRfYnl0ZSBsX3ZlcnNpb25bNF07Ci0gIGJmZF9ieXRlIGxfbnN5bXNbNF07Ci0gIGJmZF9ieXRlIGxfbnJlbG9jWzRdOwotICBiZmRfYnl0ZSBsX2lzdGxlbls0XTsKLSAgYmZkX2J5dGUgbF9uaW1waWRbNF07Ci0gIGJmZF9ieXRlIGxfaW1wb2ZmWzRdOwotICBiZmRfYnl0ZSBsX3N0bGVuWzRdOwotICBiZmRfYnl0ZSBsX3N0b2ZmWzRdOwotfTsKLQotI2RlZmluZSBMREhEUlNaICg4ICogNCkKLQotLyogVGhlIGxkc3ltIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgYSBzeW1ib2wgaW4gdGhlCi0gICAubG9hZGVyIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfbGRzeW0KLXsKLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIG5hbWUgaWYgPD0gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0gICAgICBjaGFyIF9sX25hbWVbU1lNTk1MRU5dOwotICAgICAgc3RydWN0Ci0JewotCSAgLyogWmVybyBpZiB0aGUgc3ltYm9sIG5hbWUgaXMgbW9yZSB0aGFuIFNZTU5NTEVOIGNoYXJhY3RlcnMuICAqLwotCSAgbG9uZyBfbF96ZXJvZXM7Ci0JICAvKiBUaGUgb2Zmc2V0IGluIHRoZSBzdHJpbmcgdGFibGUgaWYgdGhlIHN5bWJvbCBuYW1lIGlzIG1vcmUKLSAgICAgICAgICAgICB0aGFuIFNZTU5NTEVOIGNoYXJhY3RlcnMuICAqLwotCSAgbG9uZyBfbF9vZmZzZXQ7Ci0JfSBfbF9sOwotICAgIH0gX2w7Ci0gIC8qIFRoZSBzeW1ib2wgdmFsdWUuICAqLwotICBiZmRfdm1hIGxfdmFsdWU7Ci0gIC8qIFRoZSBzeW1ib2wgc2VjdGlvbiBudW1iZXIuICAqLwotICBzaG9ydCBsX3NjbnVtOwotICAvKiBUaGUgc3ltYm9sIHR5cGUgYW5kIGZsYWdzLiAgKi8KLSAgY2hhciBsX3NtdHlwZTsKLSAgLyogVGhlIHN5bWJvbCBzdG9yYWdlIGNsYXNzLiAgKi8KLSAgY2hhciBsX3NtY2xhczsKLSAgLyogVGhlIGltcG9ydCBmaWxlIElELiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX2lmaWxlOwotICAvKiBPZmZzZXQgdG8gdGhlIHBhcmFtZXRlciB0eXBlIGNoZWNrIHN0cmluZy4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9wYXJtOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkc3ltCi17Ci0gIHVuaW9uCi0gICAgewotICAgICAgYmZkX2J5dGUgX2xfbmFtZVtTWU1OTUxFTl07Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBiZmRfYnl0ZSBfbF96ZXJvZXNbNF07Ci0JICBiZmRfYnl0ZSBfbF9vZmZzZXRbNF07Ci0JfSBfbF9sOwotICAgIH0gX2w7Ci0gIGJmZF9ieXRlIGxfdmFsdWVbNF07Ci0gIGJmZF9ieXRlIGxfc2NudW1bMl07Ci0gIGJmZF9ieXRlIGxfc210eXBlWzFdOwotICBiZmRfYnl0ZSBsX3NtY2xhc1sxXTsKLSAgYmZkX2J5dGUgbF9pZmlsZVs0XTsKLSAgYmZkX2J5dGUgbF9wYXJtWzRdOwotfTsKLQotI2RlZmluZSBMRFNZTVNaICg4ICsgMyAqIDQgKyAyICsgMikKLQotLyogVGhlc2UgZmxhZ3MgYXJlIGZvciB0aGUgbF9zbXR5cGUgZmllbGQgKHRoZSBsb3dlciB0aHJlZSBiaXRzIGFyZSBhbgotICAgWFRZXyogdmFsdWUpLiAgKi8KLQotLyogSW1wb3J0ZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTF9JTVBPUlQgKDB4NDApCi0vKiBFbnRyeSBwb2ludC4gICovCi0jZGVmaW5lIExfRU5UUlkgKDB4MjApCi0vKiBFeHBvcnRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBMX0VYUE9SVCAoMHgxMCkKLQotLyogVGhlIGxkcmVsIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgYSByZWxvYyBpbiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZHJlbAotewotICAvKiBUaGUgcmVsb2MgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgbF92YWRkcjsKLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBpbmRleCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uIHN5bWJvbCB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zeW1uZHg7Ci0gIC8qIFRoZSByZWxvY2F0aW9uIHR5cGUgYW5kIHNpemUuICAqLwotICBzaG9ydCBsX3J0eXBlOwotICAvKiBUaGUgc2VjdGlvbiBudW1iZXIgdGhpcyByZWxvY2F0aW9uIGFwcGxpZXMgdG8uICAqLwotICBzaG9ydCBsX3JzZWNubTsKLX07Ci0KLXN0cnVjdCBleHRlcm5hbF9sZHJlbAotewotICBiZmRfYnl0ZSBsX3ZhZGRyWzRdOwotICBiZmRfYnl0ZSBsX3N5bW5keFs0XTsKLSAgYmZkX2J5dGUgbF9ydHlwZVsyXTsKLSAgYmZkX2J5dGUgbF9yc2Vjbm1bMl07Ci19OwotCi0jZGVmaW5lIExEUkVMU1ogKDIgKiA0ICsgMiAqIDIpCi0KLS8qIFRoZSBsaXN0IG9mIGltcG9ydCBmaWxlcy4gICovCi0KLXN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZQotewotICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgbGlzdC4gICovCi0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbmV4dDsKLSAgLyogVGhlIHBhdGguICAqLwotICBjb25zdCBjaGFyICpwYXRoOwotICAvKiBUaGUgZmlsZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZTsKLSAgLyogVGhlIG1lbWJlciBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbWVtYmVyOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIFhDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIElmIHdlIGhhdmUgY3JlYXRlZCBhIFRPQyBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIHRoaXMgaXMgdGhlIC50YwotICAgICBzZWN0aW9uIHdoaWNoIGhvbGRzIGl0LiAgKi8KLSAgYXNlY3Rpb24gKnRvY19zZWN0aW9uOwotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGEgVE9DIGVudHJ5ICh0aGUgWENPRkZfU0VUX1RPQyBmbGFnIGlzCi0JIHNldCksIHRoaXMgaXMgdGhlIG9mZnNldCBpbiB0b2Nfc2VjdGlvbi4gICovCi0gICAgICBiZmRfdm1hIHRvY19vZmZzZXQ7Ci0gICAgICAvKiBJZiB0aGUgVE9DIGVudHJ5IGNvbWVzIGZyb20gYW4gaW5wdXQgZmlsZSwgdGhpcyBpcyBzZXQgdG8gdGhlCi0gICAgICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIENfSElERVhUIFhNQ19UQyBvciBYTUNfVEQgc3ltYm9sLiAgKi8KLSAgICAgIGxvbmcgdG9jX2luZHg7Ci0gICAgfSB1OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgd2hpY2ggaXMgY2FsbGVkLCB0aGlzCi0gICAgIGZpZWxkIGhvbGRzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4gIElmIHRoaXMgc3ltYm9sCi0gICAgIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgdGhpcyBmaWVsZCBob2xkcyBhIHBvaW50ZXIgdG8gdGhlCi0gICAgIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqZGVzY3JpcHRvcjsKLQotICAvKiBUaGUgLmxvYWRlciBzeW1ib2wgdGFibGUgZW50cnksIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqbGRzeW07Ci0KLSAgLyogSWYgWENPRkZfQlVJTFRfTERTWU0gaXMgc2V0LCB0aGlzIGlzIHRoZSAubG9hZGVyIHN5bWJvbCB0YWJsZQotICAgICBpbmRleC4gIElmIFhDT0ZGX0JVSUxEX0xEU1lNIGlzIGNsZWFyLCBhbmQgWENPRkZfSU1QT1JUIGlzIHNldCwKLSAgICAgdGhpcyBpcyB0aGUgbF9pZmlsZSB2YWx1ZS4gICovCi0gIGxvbmcgbGRpbmR4OwotCi0gIC8qIFNvbWUgbGlua2VyIGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9SRUZfUkVHVUxBUiAoMDEpCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9ERUZfUkVHVUxBUiAoMDIpCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9ERUZfRFlOQU1JQyAoMDQpCi0gIC8qIFN5bWJvbCBpcyB1c2VkIGluIGEgcmVsb2MgYmVpbmcgY29waWVkIGludG8gdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0jZGVmaW5lIFhDT0ZGX0xEUkVMICgwMTApCi0gIC8qIFN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQuICAqLwotI2RlZmluZSBYQ09GRl9FTlRSWSAoMDIwKQotICAvKiBTeW1ib2wgaXMgY2FsbGVkOyB0aGlzIGlzLCBpdCBhcHBlYXJzIGluIGEgUl9CUiByZWxvYy4gICovCi0jZGVmaW5lIFhDT0ZGX0NBTExFRCAoMDQwKQotICAvKiBTeW1ib2wgbmVlZHMgdGhlIFRPQyBlbnRyeSBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYQ09GRl9TRVRfVE9DICgwMTAwKQotICAvKiBTeW1ib2wgaXMgZXhwbGljaXRseSBpbXBvcnRlZC4gICovCi0jZGVmaW5lIFhDT0ZGX0lNUE9SVCAoMDIwMCkKLSAgLyogU3ltYm9sIGlzIGV4cGxpY2l0bHkgZXhwb3J0ZWQuICAqLwotI2RlZmluZSBYQ09GRl9FWFBPUlQgKDA0MDApCi0gIC8qIFN5bWJvbCBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgeGNvZmZfYnVpbGRfbGRzeW1zLiAgKi8KLSNkZWZpbmUgWENPRkZfQlVJTFRfTERTWU0gKDAxMDAwKQotICAvKiBTeW1ib2wgaXMgbWVudGlvbmVkIGJ5IGEgc2VjdGlvbiB3aGljaCB3YXMgbm90IGdhcmJhZ2UgY29sbGVjdGVkLiAgKi8KLSNkZWZpbmUgWENPRkZfTUFSSyAoMDIwMDApCi0gIC8qIFN5bWJvbCBzaXplIGlzIHJlY29yZGVkIGluIHNpemVfbGlzdCBsaXN0IGZyb20gaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIFhDT0ZGX0hBU19TSVpFICgwNDAwMCkKLSAgLyogU3ltYm9sIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIFhDT0ZGX0RFU0NSSVBUT1IgKDAxMDAwMCkKLSAgLyogTXVsdGlwbGUgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIGZvciB0aGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgWENPRkZfTVVMVElQTFlfREVGSU5FRCAoMDIwMDAwKQotCi0gIC8qIFRoZSBzdG9yYWdlIG1hcHBpbmcgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIHNtY2xhczsKLX07Ci0KLS8qIFRoZSBYQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgLmRlYnVnIHN0cmluZyBoYXNoIHRhYmxlLiAgV2UgbmVlZCB0byBjb21wdXRlIHRoaXMgd2hpbGUKLSAgICAgcmVhZGluZyB0aGUgaW5wdXQgZmlsZXMsIHNvIHRoYXQgd2Uga25vdyBob3cgbGFyZ2UgdGhlIC5kZWJ1ZwotICAgICBzZWN0aW9uIHdpbGwgYmUgYmVmb3JlIHdlIGFzc2lnbiBzZWN0aW9uIHBvc2l0aW9ucy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLQotICAvKiBUaGUgLmRlYnVnIHNlY3Rpb24gd2Ugd2lsbCB1c2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQuICAqLwotICBhc2VjdGlvbiAqZGVidWdfc2VjdGlvbjsKLQotICAvKiBUaGUgLmxvYWRlciBzZWN0aW9uIHdlIHdpbGwgdXNlIGZvciB0aGUgZmluYWwgb3V0cHV0LiAgKi8KLSAgYXNlY3Rpb24gKmxvYWRlcl9zZWN0aW9uOwotCi0gIC8qIEEgY291bnQgb2Ygbm9uIFRPQyByZWxhdGl2ZSByZWxvY3Mgd2hpY2ggd2lsbCBuZWVkIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSAgc2l6ZV90IGxkcmVsX2NvdW50OwotCi0gIC8qIFRoZSAubG9hZGVyIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotCi0gIC8qIFRoZSAuZ2wgc2VjdGlvbiB3ZSB1c2UgdG8gaG9sZCBnbG9iYWwgbGlua2FnZSBjb2RlLiAgKi8KLSAgYXNlY3Rpb24gKmxpbmthZ2Vfc2VjdGlvbjsKLQotICAvKiBUaGUgLnRjIHNlY3Rpb24gd2UgdXNlIHRvIGhvbGQgdG9jIGVudHJpZXMgd2UgYnVpbGQgZm9yIGdsb2JhbAotICAgICBsaW5rYWdlIGNvZGUuICAqLwotICBhc2VjdGlvbiAqdG9jX3NlY3Rpb247Ci0KLSAgLyogVGhlIC5kcyBzZWN0aW9uIHdlIHVzZSB0byBob2xkIGZ1bmN0aW9uIGRlc2NyaXB0b3JzIHdoaWNoIHdlCi0gICAgIGNyZWF0ZSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4gICovCi0gIGFzZWN0aW9uICpkZXNjcmlwdG9yX3NlY3Rpb247Ci0KLSAgLyogVGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICppbXBvcnRzOwotCi0gIC8qIFJlcXVpcmVkIGFsaWdubWVudCBvZiBzZWN0aW9ucyB3aXRoaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotCi0gIC8qIFdoZXRoZXIgdGhlIC50ZXh0IHNlY3Rpb24gbXVzdCBiZSByZWFkLW9ubHkuICAqLwotICBib29sZWFuIHRleHRybzsKLQotICAvKiBXaGV0aGVyIGdhcmJhZ2UgY29sbGVjdGlvbiB3YXMgZG9uZS4gICovCi0gIGJvb2xlYW4gZ2M7Ci0KLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBzeW1ib2xzIGZvciB3aGljaCB3ZSBoYXZlIHNpemUgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QKLSAgICB7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKm5leHQ7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgIH0gKnNpemVfbGlzdDsKLQotICAvKiBNYWdpYyBzZWN0aW9uczogX3RleHQsIF9ldGV4dCwgX2RhdGEsIF9lZGF0YSwgX2VuZCwgZW5kLiAgKi8KLSAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIGR1cmluZyB0aGUKLSAgIGZpbmFsIGxpbmsgcGhhc2UuICAqLwotCi1zdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8KLXsKLSAgLyogVGhlIHJlbG9jcyB0byBiZSBvdXRwdXQuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogRm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgd2hvc2UgaW5kZXggd2FzIG5vdCBrbm93bgotICAgICB3aGVuIHRoZSByZWxvYyB3YXMgaGFuZGxlZCwgdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci0gIC8qIElmIHRoZXJlIGlzIGEgVE9DIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBhbmQgdGhlCi0gICAgIGluZGV4IG9mIHRoZSBUT0Mgc3ltYm9sIGlzIG5vdCBrbm93biB3aGVuIHRoZSByZWxvYyB3YXMgaGFuZGxlZCwKLSAgICAgYW4gZW50cnkgaXMgYWRkZWQgdG8gdGhpcyBsaW5rZWQgbGlzdC4gIFRoaXMgaXMgbm90IGFuIGFycmF5LAotICAgICBsaWtlIHJlbF9oYXNoZXMsIGJlY2F1c2UgdGhpcyBjYXNlIGlzIHF1aXRlIHVuY29tbW9uLiAgKi8KLSAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaAotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2ggKm5leHQ7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgfSAqdG9jX3JlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogQXJyYXkgb2YgaW5mb3JtYXRpb24ga2VwdCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbiwgaW5kZXhlZCBieSB0aGUKLSAgICAgdGFyZ2V0X2luZGV4IGZpZWxkLiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgVE9DIHN5bWJvbC4gICovCi0gIGxvbmcgdG9jX3N5bWluZHg7Ci0gIC8qIFN0YXJ0IG9mIC5sb2FkZXIgc3ltYm9scy4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqbGRzeW07Ci0gIC8qIE5leHQgLmxvYWRlciByZWxvYyB0byBzd2FwIG91dC4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqbGRyZWw7Ci0gIC8qIEZpbGUgcG9zaXRpb24gb2Ygc3RhcnQgb2YgbGluZSBudW1iZXJzLiAgKi8KLSAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBpbmRpY2VzIG9mIHN5bWJvbHMgb2YgYW55Ci0gICAgIGlucHV0IGZpbGUuICAqLwotICBsb25nICpzeW1faW5kaWNlczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBzeW1ib2xzIGZvciBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGJmZF9ieXRlICpvdXRzeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgbGluZSBudW1iZXJzIGZvciBhbnkgaW5wdXQKLSAgICAgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpsaW5lbm9zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzOwotfTsKLQotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZGhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkaGRyICosIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkaGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX2xkaGRyICosIHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkc3ltX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKiwgc3RydWN0IGludGVybmFsX2xkc3ltICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRzeW1fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKiwgc3RydWN0IGV4dGVybmFsX2xkc3ltICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRyZWxfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqLCBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHJlbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqeGNvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3RydWN0IGludGVybmFsX3JlbG9jICp4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSB4Y29mZl9maW5kX3JlbG9jCi0gIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX21hcmtfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbWFyayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2VlcCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9idWlsZF9sZHN5bXMKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotc3RhdGljIGludCB4Y29mZl9zb3J0X3JlbG9jcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotDAotLyogUm91dGluZXMgdG8gc3dhcCBpbmZvcm1hdGlvbiBpbiB0aGUgWENPRkYgLmxvYWRlciBzZWN0aW9uLiAgSWYgd2UKLSAgIGV2ZXIgbmVlZCB0byB3cml0ZSBhbiBYQ09GRiBsb2FkZXIsIHRoaXMgc3R1ZmYgd2lsbCBuZWVkIHRvIGJlCi0gICBtb3ZlZCB0byBhbm90aGVyIGZpbGUgc2hhcmVkIGJ5IHRoZSBsaW5rZXIgKHdoaWNoIFhDT0ZGIGNhbGxzIHRoZQotICAgYGBiaW5kZXInJykgYW5kIHRoZSBsb2FkZXIuICAqLwotCi0vKiBTd2FwIGluIHRoZSBsZGhkciBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkaGRyICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqZHN0OwotewotICBkc3QtPmxfdmVyc2lvbiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF92ZXJzaW9uKTsKLSAgZHN0LT5sX25zeW1zID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX25zeW1zKTsKLSAgZHN0LT5sX25yZWxvYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9ucmVsb2MpOwotICBkc3QtPmxfaXN0bGVuID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2lzdGxlbik7Ci0gIGRzdC0+bF9uaW1waWQgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfbmltcGlkKTsKLSAgZHN0LT5sX2ltcG9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9pbXBvZmYpOwotICBkc3QtPmxfc3RsZW4gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfc3RsZW4pOwotICBkc3QtPmxfc3RvZmYgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfc3RvZmYpOwotfQotCi0vKiBTd2FwIG91dCB0aGUgbGRoZHIgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3YXBfbGRoZHJfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKnNyYzsKLSAgICAgc3RydWN0IGV4dGVybmFsX2xkaGRyICpkc3Q7Ci17Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF92ZXJzaW9uLCBkc3QtPmxfdmVyc2lvbik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9uc3ltcywgZHN0LT5sX25zeW1zKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX25yZWxvYywgZHN0LT5sX25yZWxvYyk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9pc3RsZW4sIGRzdC0+bF9pc3RsZW4pOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfbmltcGlkLCBkc3QtPmxfbmltcGlkKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2ltcG9mZiwgZHN0LT5sX2ltcG9mZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9zdGxlbiwgZHN0LT5sX3N0bGVuKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3N0b2ZmLCBkc3QtPmxfc3RvZmYpOwotfQotCi0vKiBTd2FwIGluIHRoZSBsZHN5bSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkc3ltICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqZHN0OwotewotICBpZiAoYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5fbC5fbF9sLl9sX3plcm9lcykgIT0gMCkKLSAgICBtZW1jcHkgKGRzdC0+X2wuX2xfbmFtZSwgc3JjLT5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkc3QtPl9sLl9sX2wuX2xfemVyb2VzID0gMDsKLSAgICAgIGRzdC0+X2wuX2xfbC5fbF9vZmZzZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPl9sLl9sX2wuX2xfb2Zmc2V0KTsKLSAgICB9Ci0gIGRzdC0+bF92YWx1ZSA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF92YWx1ZSk7Ci0gIGRzdC0+bF9zY251bSA9IGJmZF9nZXRfMTYgKGFiZmQsIHNyYy0+bF9zY251bSk7Ci0gIGRzdC0+bF9zbXR5cGUgPSBiZmRfZ2V0XzggKGFiZmQsIHNyYy0+bF9zbXR5cGUpOwotICBkc3QtPmxfc21jbGFzID0gYmZkX2dldF84IChhYmZkLCBzcmMtPmxfc21jbGFzKTsKLSAgZHN0LT5sX2lmaWxlID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2lmaWxlKTsKLSAgZHN0LT5sX3Bhcm0gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfcGFybSk7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZHN5bSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHN5bV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmRzdDsKLXsKLSAgaWYgKHNyYy0+X2wuX2xfbC5fbF96ZXJvZXMgIT0gMCkKLSAgICBtZW1jcHkgKGRzdC0+X2wuX2xfbmFtZSwgc3JjLT5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCAwLCBkc3QtPl9sLl9sX2wuX2xfemVyb2VzKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+X2wuX2xfbC5fbF9vZmZzZXQsIGRzdC0+X2wuX2xfbC5fbF9vZmZzZXQpOwotICAgIH0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZhbHVlLCBkc3QtPmxfdmFsdWUpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfc2NudW0sIGRzdC0+bF9zY251bSk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgc3JjLT5sX3NtdHlwZSwgZHN0LT5sX3NtdHlwZSk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgc3JjLT5sX3NtY2xhcywgZHN0LT5sX3NtY2xhcyk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9pZmlsZSwgZHN0LT5sX2lmaWxlKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3Bhcm0sIGRzdC0+bF9wYXJtKTsKLX0KLQotLyogU3dhcCBpbiB0aGUgbGRyZWwgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3YXBfbGRyZWxfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqc3JjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgKmRzdDsKLXsKLSAgZHN0LT5sX3ZhZGRyID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZhZGRyKTsKLSAgZHN0LT5sX3N5bW5keCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zeW1uZHgpOwotICBkc3QtPmxfcnR5cGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBzcmMtPmxfcnR5cGUpOwotICBkc3QtPmxfcnNlY25tID0gYmZkX2dldF8xNiAoYWJmZCwgc3JjLT5sX3JzZWNubSk7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZHJlbCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHJlbF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwgKmRzdDsKLXsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZhZGRyLCBkc3QtPmxfdmFkZHIpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfc3ltbmR4LCBkc3QtPmxfc3ltbmR4KTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgc3JjLT5sX3J0eXBlLCBkc3QtPmxfcnR5cGUpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfcnNlY25tLCBkc3QtPmxfcnNlY25tKTsKLX0KLQwKLS8qIFJvdXRpbmVzIHRvIHJlYWQgWENPRkYgZHluYW1pYyBpbmZvcm1hdGlvbi4gIFRoaXMgZG9uJ3QgcmVhbGx5Ci0gICBiZWxvbmcgaGVyZSwgYnV0IHdlIGFscmVhZHkgaGF2ZSB0aGUgbGRzeW0gbWFuaXB1bGF0aW9uIHJvdXRpbmVzCi0gICBoZXJlLiAgKi8KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0gICAgewotICAgICAgc2VjLT51c2VkX2J5X2JmZCA9IGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0KLQkoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsCi0JCQkJICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKCEgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxzZWMpKQotICAgIHJldHVybiAtMTsKLSAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzOwotCi0gIHhjb2ZmX3N3YXBfbGRoZHJfaW4gKGFiZmQsIChzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgY29udGVudHMsICZsZGhkcik7Ci0KLSAgcmV0dXJuIChsZGhkci5sX25zeW1zICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIEdldCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotbG9uZwotX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipwc3ltczsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmVsc3ltLCAqZWxzeW1lbmQ7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKnN5bWJ1ZjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHN0cmluZ3MgPSAoY2hhciAqKSBjb250ZW50cyArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgc3ltYnVmID0gKChjb2ZmX3N5bWJvbF90eXBlICopCi0JICAgIGJmZF96YWxsb2MgKGFiZmQsIGxkaGRyLmxfbnN5bXMgKiBzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUpKSk7Ci0gIGlmIChzeW1idWYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChjb250ZW50cyArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyssIHN5bWJ1ZisrLCBwc3ltcysrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSBsZHN5bTsKLQotICAgICAgeGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgZWxzeW0sICZsZHN5bSk7Ci0KLSAgICAgIHN5bWJ1Zi0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQlzeW1idWYtPnN5bWJvbC5uYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgU1lNTk1MRU47IGkrKykKLQkgICAgaWYgKGxkc3ltLl9sLl9sX25hbWVbaV0gPT0gJ1wwJykKLQkgICAgICBicmVhazsKLQkgIGlmIChpIDwgU1lNTk1MRU4pCi0JICAgIHN5bWJ1Zi0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSBlbHN5bS0+X2wuX2xfbmFtZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmM7Ci0KLQkgICAgICBjID0gYmZkX2FsbG9jIChhYmZkLCBTWU1OTUxFTiArIDEpOwotCSAgICAgIGlmIChjID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkgICAgICBtZW1jcHkgKGMsIGxkc3ltLl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLQkgICAgICBjW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICAgICAgc3ltYnVmLT5zeW1ib2wubmFtZSA9IGM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsZHN5bS5sX3NtY2xhcyA9PSBYTUNfWE8pCi0Jc3ltYnVmLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlCi0Jc3ltYnVmLT5zeW1ib2wuc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCQkgICAgICBsZHN5bS5sX3NjbnVtKTsKLSAgICAgIHN5bWJ1Zi0+c3ltYm9sLnZhbHVlID0gbGRzeW0ubF92YWx1ZSAtIHN5bWJ1Zi0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQotICAgICAgc3ltYnVmLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0gICAgICBpZiAoKGxkc3ltLmxfc210eXBlICYgTF9FWFBPUlQpICE9IDApCi0Jc3ltYnVmLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQotICAgICAgLyogRklYTUU6IFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgb3RoZXIgaW5mb3JtYXRpb24gc3RvcmVkCi0gICAgICAgICB3aXRoIHRoZSBsb2FkZXIgc3ltYm9sLiAgKi8KLQotICAgICAgKnBzeW1zID0gKGFzeW1ib2wgKikgc3ltYnVmOwotICAgIH0KLQotICAqcHN5bXMgPSBOVUxMOwotCi0gIHJldHVybiBsZGhkci5sX25zeW1zOwotfQotCi0vKiBHZXQgdGhlIHNpemUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZXR1cm4gKGxkaGRyLmxfbnJlbG9jICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIFRoZSB0eXBpY2FsIGR5bmFtaWMgcmVsb2MuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9keW5hbWljX3JlbG9jID0KLSAgSE9XVE8gKDAsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1BPUyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdldCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBwcmVsb2NzLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipwcmVsb2NzOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBhcmVsZW50ICpyZWxidWY7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqZWxyZWwsICplbHJlbGVuZDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZWxidWYgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIGxkaGRyLmxfbnJlbG9jICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gIGlmIChyZWxidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZWxyZWwgPSAoKHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqKQotCSAgIChjb250ZW50cyArIExESERSU1ogKyBsZGhkci5sX25zeW1zICogTERTWU1TWikpOwotICBlbHJlbGVuZCA9IGVscmVsICsgbGRoZHIubF9ucmVsb2M7Ci0gIGZvciAoOyBlbHJlbCA8IGVscmVsZW5kOyBlbHJlbCsrLCByZWxidWYrKywgcHJlbG9jcysrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCBsZHJlbDsKLQotICAgICAgeGNvZmZfc3dhcF9sZHJlbF9pbiAoYWJmZCwgZWxyZWwsICZsZHJlbCk7Ci0KLSAgICAgIGlmIChsZHJlbC5sX3N5bW5keCA+PSAzKQotCXJlbGJ1Zi0+c3ltX3B0cl9wdHIgPSBzeW1zICsgKGxkcmVsLmxfc3ltbmR4IC0gMyk7Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIHN3aXRjaCAobGRyZWwubF9zeW1uZHgpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIG5hbWUgPSAiLnRleHQiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgbmFtZSA9ICIuZGF0YSI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBuYW1lID0gIi5ic3MiOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzZWMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICByZWxidWYtPnN5bV9wdHJfcHRyID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIHJlbGJ1Zi0+YWRkcmVzcyA9IGxkcmVsLmxfdmFkZHI7Ci0gICAgICByZWxidWYtPmFkZGVuZCA9IDA7Ci0KLSAgICAgIC8qIE1vc3QgZHluYW1pYyByZWxvY3MgaGF2ZSB0aGUgc2FtZSB0eXBlLiAgRklYTUU6IFRoaXMgaXMgb25seQotICAgICAgICAgY29ycmVjdCBpZiBsZHJlbC5sX3J0eXBlID09IDAuICBJbiBvdGhlciBjYXNlcywgd2Ugc2hvdWxkIHVzZQotICAgICAgICAgYSBkaWZmZXJlbnQgaG93dG8uICAqLwotICAgICAgcmVsYnVmLT5ob3d0byA9ICZ4Y29mZl9keW5hbWljX3JlbG9jOwotCi0gICAgICAvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBsX3JzZWNubSBmaWVsZC4gICovCi0KLSAgICAgICpwcmVsb2NzID0gcmVsYnVmOwotICAgIH0KLQotICAqcHJlbG9jcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIGxkaGRyLmxfbnJlbG9jOwotfQotDAotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gWENPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi14Y29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmluZHggPSAtMTsKLSAgICAgIHJldC0+dG9jX3NlY3Rpb24gPSBOVUxMOwotICAgICAgcmV0LT51LnRvY19pbmR4ID0gLTE7Ci0gICAgICByZXQtPmRlc2NyaXB0b3IgPSBOVUxMOwotICAgICAgcmV0LT5sZHN5bSA9IE5VTEw7Ci0gICAgICByZXQtPmxkaW5keCA9IC0xOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgICByZXQtPnNtY2xhcyA9IFhNQ19VQTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsIHhjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5kZWJ1Z19zdHJ0YWIgPSBfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0ICgpOwotICByZXQtPmRlYnVnX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmxvYWRlcl9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5sZHJlbF9jb3VudCA9IDA7Ci0gIG1lbXNldCAoJnJldC0+bGRoZHIsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2xkaGRyKSk7Ci0gIHJldC0+bGlua2FnZV9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT50b2Nfc2VjdGlvbiA9IE5VTEw7Ci0gIHJldC0+ZGVzY3JpcHRvcl9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5pbXBvcnRzID0gTlVMTDsKLSAgcmV0LT5maWxlX2FsaWduID0gMDsKLSAgcmV0LT50ZXh0cm8gPSBmYWxzZTsKLSAgcmV0LT5nYyA9IGZhbHNlOwotICBtZW1zZXQgKHJldC0+c3BlY2lhbF9zZWN0aW9ucywgMCwgc2l6ZW9mIHJldC0+c3BlY2lhbF9zZWN0aW9ucyk7Ci0KLSAgLyogVGhlIGxpbmtlciB3aWxsIGFsd2F5cyBnZW5lcmF0ZSBhIGZ1bGwgYS5vdXQgaGVhZGVyLiAgV2UgbmVlZCB0bwotICAgICByZWNvcmQgdGhhdCBmYWN0IG5vdywgYmVmb3JlIHRoZSBzaXplb2ZfaGVhZGVycyByb3V0aW5lIGNvdWxkIGJlCi0gICAgIGNhbGxlZC4gICovCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIgPSB0cnVlOwotCi0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHhjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSB4Y29mZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIFJlYWQgaW50ZXJuYWwgcmVsb2NzIGZvciBhbiBYQ09GRiBjc2VjdC4gIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZAotICAgX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIHdoaWNoIHRyaWVzIHRvIHRha2UgYWR2YW50YWdlIG9mIGFueQotICAgcmVsb2NzIHdoaWNoIG1heSBoYXZlIGJlZW4gY2FjaGVkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IGludGVybmFsX3JlbG9jICoKLXhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgcmVxdWlyZV9pbnRlcm5hbCwgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJvb2xlYW4gY2FjaGU7Ci0gICAgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9pbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID09IE5VTEwKLSAgICAgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0KLSAgICAgIGVuY2xvc2luZyA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+ZW5jbG9zaW5nOwotCi0gICAgICBpZiAoZW5jbG9zaW5nICE9IE5VTEwKLQkgICYmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKSA9PSBOVUxMCi0JICAgICAgfHwgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGVuY2xvc2luZyktPnJlbG9jcyA9PSBOVUxMKQotCSAgJiYgY2FjaGUKLQkgICYmIGVuY2xvc2luZy0+cmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGlmIChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIGVuY2xvc2luZywgdHJ1ZSwKLQkJCQkJICAgICAgZXh0ZXJuYWxfcmVsb2NzLCBmYWxzZSwKLQkJCQkJICAgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKQotCSAgICAgID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgaWYgKGVuY2xvc2luZyAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKSAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICE9IE5VTEwpCi0JewotCSAgc2l6ZV90IG9mZjsKLQotCSAgb2ZmID0gKChzZWMtPnJlbF9maWxlcG9zIC0gZW5jbG9zaW5nLT5yZWxfZmlsZXBvcykKLQkJIC8gYmZkX2NvZmZfcmVsc3ogKGFiZmQpKTsKLQkgIGlmICghIHJlcXVpcmVfaW50ZXJuYWwpCi0JICAgIHJldHVybiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICsgb2ZmOwotCSAgbWVtY3B5IChpbnRlcm5hbF9yZWxvY3MsCi0JCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGVuY2xvc2luZyktPnJlbG9jcyArIG9mZiwKLQkJICBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLQkgIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0JfQotICAgIH0KLQotICByZXR1cm4gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJCSByZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpOwotfQotDAotLyogR2l2ZW4gYW4gWENPRkYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiB4Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0KLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgLyogSWYgdGhlIGFyY2hpdmUgaGFzIGEgbWFwLCBkbyB0aGUgdXN1YWwgc2VhcmNoLiAgV2UgdGhlbiBuZWVkCi0gICAgICAgICB0byBjaGVjayB0aGUgYXJjaGl2ZSBmb3Igc3RyaXBwZWQgZHluYW1pYyBvYmplY3RzLCBiZWNhdXNlCi0gICAgICAgICB0aGV5IHdpbGwgbm90IGFwcGVhciBpbiB0aGUgYXJjaGl2ZSBtYXAgZXZlbiB0aG91Z2ggdGhleQotICAgICAgICAgc2hvdWxkLCBwZXJoYXBzLCBiZSBpbmNsdWRlZC4gIElmIHRoZSBhcmNoaXZlIGhhcyBubyBtYXAsIHdlCi0gICAgICAgICBqdXN0IGNvbnNpZGVyIGVhY2ggb2JqZWN0IGZpbGUgaW4gdHVybiwgc2luY2UgdGhhdCBhcHBhcmVudGx5Ci0gICAgICAgICBpcyB3aGF0IHRoZSBBSVggbmF0aXZlIGxpbmtlciBkb2VzLiAgKi8KLSAgICAgIGlmIChiZmRfaGFzX21hcCAoYWJmZCkpCi0JewotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkJIChhYmZkLCBpbmZvLCB4Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB7Ci0JYmZkICptZW1iZXI7Ci0KLQltZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpOwotCXdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQkgIHsKLQkgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKG1lbWJlciwgYmZkX29iamVjdCkKLQkJJiYgKCEgYmZkX2hhc19tYXAgKGFiZmQpCi0JCSAgICB8fCAoKG1lbWJlci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JCQkmJiAobWVtYmVyLT5mbGFncyAmIEhBU19TWU1TKSA9PSAwKSkpCi0JICAgICAgewotCQlib29sZWFuIG5lZWRlZDsKLQotCQlpZiAoISB4Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAobWVtYmVyLCBpbmZvLCAmbmVlZGVkKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmIChuZWVkZWQpCi0JCSAgbWVtYmVyLT5hcmNoaXZlX3Bhc3MgPSAtMTsKLQkgICAgICB9Ci0JICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIG1lbWJlcik7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBYQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiAhIGluZm8tPnN0YXRpY19saW5rCi0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCAmJiBzeW0ubl9zY251bSAhPSBOX1VOREVGKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGV4dGVybmFsbHkgdmlzaWJsZSwgYW5kIGlzIGRlZmluZWQgYnkgdGhpcwotICAgICAgICAgICAgIG9iamVjdCBmaWxlLiAgKi8KLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCSAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQotCSAgICAgdW5kZWZpbmVkLiAgSWYgYSBzeW1ib2wgaXMgY3VycmVudGx5IGtub3duIHRvIGJlIGNvbW1vbiwKLQkgICAgIFhDT0ZGIGxpbmtlcnMgZG8gbm90IGJyaW5nIGluIGFuIG9iamVjdCBmaWxlIHdoaWNoCi0JICAgICBkZWZpbmVzIGl0LiAgV2UgYWxzbyBkb24ndCBicmluZyBpbiBzeW1ib2xzIHRvIHNhdGlzZnkKLQkgICAgIHVuZGVmaW5lZCByZWZlcmVuY2VzIGluIHNoYXJlZCBvYmplY3RzLiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMKLQkJICB8fCAoKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5mbGFncwotCQkgICAgICAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgbG9hZGVyIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgZHluYW1pYyBvYmplY3QKLSAgIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFRoZSBuYXRpdmUgbGlua2VyIHVzZXMgdGhlIGxvYWRlcgotICAgc3ltYm9scywgbm90IHRoZSBub3JtYWwgc3ltYm9sIHRhYmxlLCBzbyB3ZSBkbyB0b28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqYnVmOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZWxzeW0sICplbHN5bWVuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgbm8gc3ltYm9scywgc28gZG9uJ3QgdHJ5IHRvIGluY2x1ZGUgaXQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJ1ZiA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBidWYsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJ1ZiArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChidWYgKyBMREhEUlNaKTsKLSAgZWxzeW1lbmQgPSBlbHN5bSArIGxkaGRyLmxfbnN5bXM7Ci0gIGZvciAoOyBlbHN5bSA8IGVsc3ltZW5kOyBlbHN5bSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSBsZHN5bTsKLSAgICAgIGNoYXIgbmFtYnVmW1NZTU5NTEVOICsgMV07Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHhjb2ZmX3N3YXBfbGRzeW1faW4gKGFiZmQsIGVsc3ltLCAmbGRzeW0pOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGV4cG9ydGVkIHN5bWJvbHMuICAqLwotICAgICAgaWYgKChsZHN5bS5sX3NtdHlwZSAmIExfRVhQT1JUKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQluYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAobmFtYnVmLCBsZHN5bS5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0JICBuYW1idWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkgIG5hbWUgPSBuYW1idWY7Ci0JfQotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkKLSAgICAgICAgIHVuZGVmaW5lZC4gIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHdlIGFyZSB1c2luZyBhbiBYQ09GRgotICAgICAgICAgaGFzaCB0YWJsZS4gICovCi0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAmJiAoKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5mbGFncwotCSAgICAgICYgWENPRkZfREVGX0RZTkFNSUMpID09IDApCi0JewotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKnBuZWVkZWQgPSB0cnVlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIHNoYXJlZCBvYmplY3QuICAqLwotCi0gIGlmIChidWYgIT0gTlVMTCAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+a2VlcF9jb250ZW50cykKLSAgICB7Ci0gICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzKTsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyB0aGUgaW5kZXggb2YgcmVsb2MgaW4gUkVMT0NTIHdpdGggdGhlIGxlYXN0IGFkZHJlc3MgZ3JlYXRlcgotICAgdGhhbiBvciBlcXVhbCB0byBBRERSRVNTLiAgVGhlIHJlbG9jcyBhcmUgc29ydGVkIGJ5IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZQoteGNvZmZfZmluZF9yZWxvYyAocmVsb2NzLCBjb3VudCwgYWRkcmVzcykKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgYmZkX3NpemVfdHlwZSBtaW4sIG1heCwgdGhpczsKLQotICBpZiAoY291bnQgPCAyKQotICAgIHsKLSAgICAgIGlmIChjb3VudCA9PSAxICYmIHJlbG9jc1swXS5yX3ZhZGRyIDwgYWRkcmVzcykKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgbWluID0gMDsKLSAgbWF4ID0gY291bnQ7Ci0KLSAgLyogRG8gYSBiaW5hcnkgc2VhcmNoIG92ZXIgKG1pbixtYXhdLiAgKi8KLSAgd2hpbGUgKG1pbiArIDEgPCBtYXgpCi0gICAgewotICAgICAgYmZkX3ZtYSByYWRkcjsKLQotICAgICAgdGhpcyA9IChtYXggKyBtaW4pIC8gMjsKLSAgICAgIHJhZGRyID0gcmVsb2NzW3RoaXNdLnJfdmFkZHI7Ci0gICAgICBpZiAocmFkZHIgPiBhZGRyZXNzKQotCW1heCA9IHRoaXM7Ci0gICAgICBlbHNlIGlmIChyYWRkciA8IGFkZHJlc3MpCi0JbWluID0gdGhpczsKLSAgICAgIGVsc2UKLQl7Ci0JICBtaW4gPSB0aGlzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAocmVsb2NzW21pbl0ucl92YWRkciA8IGFkZHJlc3MpCi0gICAgcmV0dXJuIG1pbiArIDE7Ci0KLSAgd2hpbGUgKG1pbiA+IDAKLQkgJiYgcmVsb2NzW21pbiAtIDFdLnJfdmFkZHIgPT0gYWRkcmVzcykKLSAgICAtLW1pbjsKLQotICByZXR1cm4gbWluOwotfQotCi0vKiBBZGQgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIFhDT0ZGIGlzIGEgd2VpcmQgZm9ybWF0LiAgQSBub3JtYWwgWENPRkYgLm8gZmlsZXMgd2lsbCBoYXZlIHRocmVlCi0gICBDT0ZGIHNlY3Rpb25zLS0udGV4dCwgLmRhdGEsIGFuZCAuYnNzLS1idXQgZWFjaCBDT0ZGIHNlY3Rpb24gd2lsbAotICAgY29udGFpbiBtYW55IGNzZWN0cy4gIFRoZXNlIGNzZWN0cyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzeW1ib2wKLSAgIHRhYmxlLiAgRnJvbSB0aGUgbGlua2VyJ3MgcG9pbnQgb2YgdmlldywgZWFjaCBjc2VjdCBtdXN0IGJlCi0gICBjb25zaWRlcmVkIGEgc2VjdGlvbiBpbiBpdHMgb3duIHJpZ2h0LiAgRm9yIGV4YW1wbGUsIGEgVE9DIGVudHJ5IGlzCi0gICBoYW5kbGVkIGFzIGEgc21hbGwgWE1DX1RDIGNzZWN0LiAgVGhlIGxpbmtlciBtdXN0IGJlIGFibGUgdG8gbWVyZ2UKLSAgIGRpZmZlcmVudCBUT0MgZW50cmllcyB0b2dldGhlciwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtdXN0IGJlIGFibGUgdG8KLSAgIGV4dHJhY3QgdGhlIFhNQ19UQyBjc2VjdHMgZnJvbSB0aGUgLmRhdGEgc2VjdGlvbiBvZiB0aGUgaW5wdXQgLm8KLSAgIGZpbGUuCi0KLSAgIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2Ygb3VyIGxpbmtlciwgdGhpcyBpcywgb2YgY291cnNlLCBhIGhpZGVvdXMKLSAgIG5pZ2h0bWFyZS4gIFdlIGNvcGUgYnkgYWN0dWFsbHkgY3JlYXRpbmcgc2VjdGlvbnMgZm9yIGVhY2ggY3NlY3QsCi0gICBhbmQgZGlzY2FyZGluZyB0aGUgb3JpZ2luYWwgc2VjdGlvbnMuICBXZSB0aGVuIGhhdmUgdG8gaGFuZGxlIHRoZQotICAgcmVsb2NhdGlvbiBlbnRyaWVzIGNhcmVmdWxseSwgc2luY2UgdGhlIG9ubHkgd2F5IHRvIHRlbGwgd2hpY2gKLSAgIGNzZWN0IHRoZXkgYmVsb25nIHRvIGlzIHRvIGV4YW1pbmUgdGhlIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IG5fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdDsKLSAgYm9vbGVhbiBkZWZhdWx0X2NvcHk7Ci0gIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKipjc2VjdF9jYWNoZTsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGFzZWN0aW9uICpvOwotICBhc2VjdGlvbiAqbGFzdF9yZWFsOwotICBib29sZWFuIGtlZXBfc3ltczsKLSAgYXNlY3Rpb24gKmNzZWN0OwotICB1bnNpZ25lZCBpbnQgY3NlY3RfaW5kZXg7Ci0gIGFzZWN0aW9uICpmaXJzdF9jc2VjdDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdAotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICAgYXNlY3Rpb24gKipjc2VjdHM7Ci0gICAgICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgICB9ICpyZWxvY19pbmZvID0gTlVMTDsKLQotICBrZWVwX3N5bXMgPSBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiAhIGluZm8tPnN0YXRpY19saW5rKQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gYnVpbGQgYSAubG9hZGVyIHNlY3Rpb24sIHNvIHdlIGRvIGl0IGhlcmUuICBUaGlzCi0JIHdvbid0IHdvcmsgaWYgd2UncmUgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlIHdpdGggbm8KLQkgWENPRkYgaW5wdXQgZmlsZXMuICBGSVhNRS4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmxzZWM7Ci0KLQkgIGxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5sb2FkZXIiKTsKLQkgIGlmIChsc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uID0gbHNlYzsKLQkgIGxzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgbGlua2FnZSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmxzZWM7Ci0KLQkgIGxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5nbCIpOwotCSAgaWYgKGxzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uID0gbHNlYzsKLQkgIGxzZWMtPmZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgfCBTRUNfSU5fTUVNT1JZKTsKLQkgIGxzZWMtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSBUT0Mgc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnRzZWM7Ci0KLQkgIHRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi50YyIpOwotCSAgaWYgKHRzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24gPSB0c2VjOwotCSAgdHNlYy0+ZmxhZ3MgfD0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJICB8IFNFQ19JTl9NRU1PUlkpOwotCSAgdHNlYy0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQl9Ci0gICAgICAvKiBMaWtld2lzZSBmb3IgdGhlIGRlc2NyaXB0b3Igc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuZHMiKTsKLQkgIGlmIChkc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbiA9IGRzZWM7Ci0JICBkc2VjLT5mbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgIHwgU0VDX0lOX01FTU9SWSk7Ci0JICBkc2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uID09IE5VTEwKLQkgICYmIGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQl7Ci0JICBhc2VjdGlvbiAqZHNlYzsKLQotCSAgZHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmRlYnVnIik7Ci0JICBpZiAoZHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uID0gZHNlYzsKLQkgIGRzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCX0KLSAgICB9Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmspCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbl90bWFzayA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdG1hc2s7Ci0gIG5fYnRzaGZ0ID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl9idHNoZnQ7Ci0KLSAgLyogRGVmaW5lIG1hY3JvcyBzbyB0aGF0IElTRkNOLCBldC4gYWwuLCBtYWNyb3Mgd29yayBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBOX1RNQVNLIG5fdG1hc2sKLSNkZWZpbmUgTl9CVFNIRlQgbl9idHNoZnQKLQotICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZGVmYXVsdF9jb3B5ID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBkZWZhdWx0X2NvcHkgPSB0cnVlOwotCi0gIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotCi0gIC8qIFdlIGtlZXAgYSBsaXN0IG9mIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZAotICAgICB0byBlYWNoIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoc3ltY291bnQKLQkJCSAgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXMgPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaDsKLSAgbWVtc2V0IChzeW1faGFzaCwgMCwKLQkgIChzaXplX3QpIHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICAvKiBCZWNhdXNlIG9mIHRoZSB3ZWlyZCBzdHVmZiB3ZSBhcmUgZG9pbmcgd2l0aCBYQ09GRiBjc2VjdHMsIHdlIGNhbgotICAgICBub3QgZWFzaWx5IGRldGVybWluZSB3aGljaCBzZWN0aW9uIGEgc3ltYm9sIGlzIGluLCBzbyB3ZSBzdG9yZQotICAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHRkYXRhIGZvciB0aGUgaW5wdXQgZmlsZS4gICovCi0gIGNzZWN0X2NhY2hlID0gKChhc2VjdGlvbiAqKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gIGlmIChjc2VjdF9jYWNoZSA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHMgPSBjc2VjdF9jYWNoZTsKLSAgbWVtc2V0IChjc2VjdF9jYWNoZSwgMCwgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQotICAvKiBXaGlsZSBzcGxpdHRpbmcgc2VjdGlvbnMgaW50byBjc2VjdHMsIHdlIG5lZWQgdG8gYXNzaWduIHRoZQotICAgICByZWxvY3MgY29ycmVjdGx5LiAgVGhlIHJlbG9jcyBhbmQgdGhlIGNzZWN0cyBtdXN0IGJvdGggYmUgaW4KLSAgICAgb3JkZXIgYnkgVk1BIHdpdGhpbiBhIGdpdmVuIHNlY3Rpb24sIHNvIHdlIGhhbmRsZSB0aGlzIGJ5Ci0gICAgIHNjYW5uaW5nIGFsb25nIHRoZSByZWxvY3MgYXMgd2UgcHJvY2VzcyB0aGUgY3NlY3RzLiAgV2UgaW5kZXgKLSAgICAgaW50byByZWxvY19pbmZvIHVzaW5nIHRoZSBzZWN0aW9uIHRhcmdldF9pbmRleC4gICovCi0gIHJlbG9jX2luZm8gPSAoKHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdCAqKQotCQliZmRfbWFsbG9jICgoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpCi0JCQkgICAgKiBzaXplb2YgKHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdCkpKTsKLSAgaWYgKHJlbG9jX2luZm8gPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0ICgoUFRSKSByZWxvY19pbmZvLCAwLAotCSAgKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKSAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0KSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzIGFuZCBsaW5lIG51bWJlcnMgZm9yIGVhY2ggc2VjdGlvbi4gICovCi0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIGxhc3RfcmVhbCA9IE5VTEw7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGxhc3RfcmVhbCA9IG87Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPQotCSAgICB4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgbywgdHJ1ZSwgKGJmZF9ieXRlICopIE5VTEwsCi0JCQkJCWZhbHNlLCAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyA9Ci0JICAgIChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbWVtc2V0IChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzLCAwLAotCQkgIG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0JfQotCi0gICAgICBpZiAoKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkgICYmIG8tPmxpbmVub19jb3VudCA+IDApCi0JewotCSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0KLQkgIGxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQkgIGlmIChsaW5lbm9zID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgPSBsaW5lbm9zOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5saW5lX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChsaW5lbm9zLCBsaW5lc3osIG8tPmxpbmVub19jb3VudCwgYWJmZCkKLQkJICAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIERvbid0IGxldCB0aGUgbGlua2VyIHJlbG9jYXRpb24gcm91dGluZXMgZGlzY2FyZCB0aGUgc3ltYm9scy4gICovCi0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gIGNzZWN0ID0gTlVMTDsKLSAgY3NlY3RfaW5kZXggPSAwOwotICBmaXJzdF9jc2VjdCA9IE5VTEw7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgQkZEX0FTU0VSVCAoc3ltZXN6ID09IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCkpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGludCBzbXR5cDsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqc2V0X3RvYzsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICAvKiBJbiB0aGlzIHBhc3Mgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHdpdGggY3NlY3QKLSAgICAgICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQgJiYgc3ltLm5fc2NsYXNzICE9IENfSElERVhUKQotCXsKLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19GSUxFICYmIGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgICBjc2VjdCA9IE5VTEw7Ci0JICAgIH0KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgICpjc2VjdF9jYWNoZSA9IGNzZWN0OwotCSAgZWxzZSBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCB8fCBzeW0ubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICAqY3NlY3RfY2FjaGUgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgIGVsc2UKLQkgICAgKmNzZWN0X2NhY2hlID0gTlVMTDsKLQkgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotCSAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQkgIGNzZWN0X2NhY2hlICs9IHN5bS5uX251bWF1eCArIDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gaXQsCi0gICAgICAgICBhbmQgd2UncmUgbm90IHN0cmlwcGluZyBpdCwgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGFuZAotICAgICAgICAgYWRkIHRoZW0gdG8gdGhlIGNvdW50IGZvciB0aGlzIGNzZWN0LiAgSW4gdGhlIGZpbmFsIGxpbmsgcGFzcwotICAgICAgICAgd2UgYXJlIGdvaW5nIHRvIGF0dGFjaCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBieSBzeW1ib2wsCi0gICAgICAgICByYXRoZXIgdGhhbiBieSBzZWN0aW9uLCBpbiBvcmRlciB0byBtb3JlIGVhc2lseSBoYW5kbGUKLSAgICAgICAgIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgICBpZiAoKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkgICYmIHN5bS5uX251bWF1eCA+IDEKLQkgICYmIGNzZWN0ICE9IE5VTEwKLQkgICYmIElTRkNOIChzeW0ubl90eXBlKSkKLQl7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4bGluOwotCi0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgKGVzeW0gKyBzeW1lc3opLAotCQkJCXN5bS5uX3R5cGUsIHN5bS5uX3NjbGFzcywKLQkJCQkwLCBzeW0ubl9udW1hdXgsIChQVFIpICZhdXhsaW4pOwotCSAgaWYgKGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgIT0gMCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBsaW5vZmY7Ci0KLQkgICAgICBlbmNsb3NpbmcgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+ZW5jbG9zaW5nOwotCSAgICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiBgJXMnIGhhcyBsaW5lIG51bWJlcnMgYnV0IG5vIGVuY2xvc2luZyBzZWN0aW9uIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgICAgbGlub2ZmID0gKGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIKLQkJCS0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MpOwotCSAgICAgIGlmIChsaW5vZmYgPCBlbmNsb3NpbmctPmxpbmVub19jb3VudCAqIGxpbmVzeikKLQkJewotCQkgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gbGluOwotCQkgIGJmZF9ieXRlICpsaW5wc3RhcnQ7Ci0KLQkJICBsaW5wc3RhcnQgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ubGluZW5vcwotCQkJICAgICAgICsgbGlub2ZmKTsKLQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgKFBUUikgbGlucHN0YXJ0LCAoUFRSKSAmbGluKTsKLQkJICBpZiAobGluLmxfbG5ubyA9PSAwCi0JCSAgICAgICYmICgoYmZkX3NpemVfdHlwZSkgbGluLmxfYWRkci5sX3N5bW5keAotCQkJICA9PSAoKGVzeW0KLQkJCSAgICAgICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAgICAgIC8gc3ltZXN6KSkpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9ieXRlICpsaW5wZW5kLCAqbGlucDsKLQotCQkgICAgICBsaW5wZW5kID0gKHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmxpbmVub3MKLQkJCQkgKyBlbmNsb3NpbmctPmxpbmVub19jb3VudCAqIGxpbmVzeik7Ci0JCSAgICAgIGZvciAobGlucCA9IGxpbnBzdGFydCArIGxpbmVzejsKLQkJCSAgIGxpbnAgPCBsaW5wZW5kOwotCQkJICAgbGlucCArPSBsaW5lc3opCi0JCQl7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCAoUFRSKSBsaW5wLAotCQkJCQkJICAgKFBUUikgJmxpbik7Ci0JCQkgIGlmIChsaW4ubF9sbm5vID09IDApCi0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGNzZWN0LT5saW5lbm9fY291bnQgKz0gKGxpbnAgLSBsaW5wc3RhcnQpIC8gbGluZXN6OwotCQkgICAgICAvKiBUaGUgc2V0dGluZyBvZiBsaW5lX2ZpbGVwb3Mgd2lsbCBvbmx5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlZnVsIGlmIGFsbCB0aGUgbGluZSBudW1iZXIgZW50cmllcyBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgIGNzZWN0IGFyZSBjb250aWd1b3VzOyB0aGlzIG9ubHkgbWF0dGVycyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciByZXBvcnRpbmcuICAqLwotCQkgICAgICBpZiAoY3NlY3QtPmxpbmVfZmlsZXBvcyA9PSAwKQotCQkJY3NlY3QtPmxpbmVfZmlsZXBvcyA9Ci0JCQkgIGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogUGljayB1cCB0aGUgY3NlY3QgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLiAgKi8KLQotICAgICAgaWYgKHN5bS5uX251bWF1eCA9PSAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNsYXNzICVkIHN5bWJvbCBgJXMnIGhhcyBubyBhdXggZW50cmllcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN5bS5uX3NjbGFzcywgbmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsCi0JCQkgICAgKFBUUikgKGVzeW0gKyBzeW1lc3ogKiBzeW0ubl9udW1hdXgpLAotCQkJICAgIHN5bS5uX3R5cGUsIHN5bS5uX3NjbGFzcywKLQkJCSAgICBzeW0ubl9udW1hdXggLSAxLCBzeW0ubl9udW1hdXgsCi0JCQkgICAgKFBUUikgJmF1eCk7Ci0KLSAgICAgIHNtdHlwID0gU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApOwotCi0gICAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBzZWN0aW9uID0gTlVMTDsKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIHNldF90b2MgPSBOVUxMOwotCi0gICAgICBzd2l0Y2ggKHNtdHlwKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBjc2VjdCB0eXBlICVkIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgc210eXApOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQotCWNhc2UgWFRZX0VSOgotCSAgLyogVGhpcyBpcyBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0hJREVYVAotCSAgICAgIHx8IHN5bS5uX3NjbnVtICE9IE5fVU5ERUYKLQkgICAgICB8fCBhdXgueF9jc2VjdC54X3Njbmxlbi5sICE9IDApCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBiYWQgWFRZX0VSIHN5bWJvbCBgJXMnOiBjbGFzcyAlZCBzY251bSAlZCBzY25sZW4gJWQiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzeW0ubl9zY2xhc3MsIHN5bS5uX3NjbnVtLAotCQkgYXV4LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogQW4gWE1DX1hPIGV4dGVybmFsIHJlZmVyZW5jZSBpcyBhY3R1YWxseSBhIHJlZmVyZW5jZSB0bwotICAgICAgICAgICAgIGFuIGFic29sdXRlIGxvY2F0aW9uLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyAhPSBYTUNfWE8pCi0JICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsdWUgPSBzeW0ubl92YWx1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFhUWV9TRDoKLQkgIC8qIFRoaXMgaXMgYSBjc2VjdCBkZWZpbml0aW9uLiAgKi8KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgfQotCi0JICBjc2VjdCA9IE5VTEw7Ci0JICBjc2VjdF9pbmRleCA9IC0xOwotCi0JICAvKiBXaGVuIHdlIHNlZSBhIFRPQyBhbmNob3IsIHdlIHJlY29yZCB0aGUgVE9DIHZhbHVlLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMwKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0hJREVYVAotCQkgIHx8IGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgIT0gMCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiBYTUNfVEMwIHN5bWJvbCBgJXMnIGlzIGNsYXNzICVkIHNjbmxlbiAlZCIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzeW0ubl9zY2xhc3MsCi0JCSAgICAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICB4Y29mZl9kYXRhIChhYmZkKS0+dG9jID0gc3ltLm5fdmFsdWU7Ci0JICAgIH0KLQotCSAgLyogV2UgbXVzdCBtZXJnZSBUT0MgZW50cmllcyBmb3IgdGhlIHNhbWUgc3ltYm9sLiAgV2UgY2FuCi0JICAgICBtZXJnZSB0d28gVE9DIGVudHJpZXMgaWYgdGhleSBhcmUgYm90aCBDX0hJREVYVCwgdGhleQotCSAgICAgYm90aCBoYXZlIHRoZSBzYW1lIG5hbWUsIHRoZXkgYXJlIGJvdGggNCBieXRlcyBsb25nLCBhbmQKLQkgICAgIHRoZXkgYm90aCBoYXZlIGEgcmVsb2NhdGlvbiB0YWJsZSBlbnRyeSBmb3IgYW4gZXh0ZXJuYWwKLQkgICAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCi0JICAgICB0aGF0IHdlIG11c3QgbG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucy4gIEljay4gICovCi0JICBpZiAoYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDCi0JICAgICAgJiYgc3ltLm5fc2NsYXNzID09IENfSElERVhUCi0JICAgICAgJiYgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9PSA0Ci0JICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHJlbGluZHg7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0KLQkgICAgICBlbmNsb3NpbmcgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBpZiAoZW5jbG9zaW5nID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgcmVsb2NzID0gcmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ucmVsb2NzOwotCSAgICAgIHJlbGluZHggPSB4Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGVuY2xvc2luZy0+cmVsb2NfY291bnQsCi0JCQkJCSAgc3ltLm5fdmFsdWUpOwotCSAgICAgIHJlbCA9IHJlbG9jcyArIHJlbGluZHg7Ci0JICAgICAgaWYgKHJlbGluZHggPCBlbmNsb3NpbmctPnJlbG9jX2NvdW50Ci0JCSAgJiYgcmVsLT5yX3ZhZGRyID09IChiZmRfdm1hKSBzeW0ubl92YWx1ZQotCQkgICYmIHJlbC0+cl9zaXplID09IDMxCi0JCSAgJiYgcmVsLT5yX3R5cGUgPT0gUl9QT1MpCi0JCXsKLQkJICBiZmRfYnl0ZSAqZXJlbHN5bTsKLQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHJlbHN5bTsKLQotCQkgIGVyZWxzeW0gPSAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkgICAgICsgcmVsLT5yX3N5bW5keCAqIHN5bWVzeik7Ci0JCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVyZWxzeW0sIChQVFIpICZyZWxzeW0pOwotCQkgIGlmIChyZWxzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKnJlbG5hbWU7Ci0JCSAgICAgIGNoYXIgcmVsYnVmW1NZTU5NTEVOICsgMV07Ci0JCSAgICAgIGJvb2xlYW4gY29weTsKLQkJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGUgVE9DIGVudHJ5IGlzCi0JCQkgZm9yIGFuIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2wuICAqLwotCQkgICAgICByZWxuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmcmVsc3ltLAotCQkJCQkJCQlyZWxidWYpOwotCQkgICAgICBpZiAocmVsbmFtZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogV2Ugb25seSBtZXJnZSBUT0MgZW50cmllcyBpZiB0aGUgVEMgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGFzIHRoZSBzeW1ib2wgbmFtZS4gIFRoaXMgaGFuZGxlcwotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBub3JtYWwgY2FzZSwgYnV0IG5vdCBjb21tb24gY2FzZXMgbGlrZQotICAgICAgICAgICAgICAgICAgICAgICAgIFNZTS5QNCB3aGljaCBnY2MgZ2VuZXJhdGVzIHRvIHN0b3JlIFNZTSArIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgVE9DLiAgRklYTUUuICAqLwotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCByZWxuYW1lKSA9PSAwKQotCQkJewotCQkJICBjb3B5ID0gKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkJCQkgIHx8IHJlbHN5bS5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0JCQkJICB8fCByZWxzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCk7Ci0JCQkgIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIHJlbG5hbWUsIHRydWUsIGNvcHksCi0JCQkJCQkgICAgICBmYWxzZSk7Ci0JCQkgIGlmIChoID09IE5VTEwpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgLyogQXQgdGhpcyBwb2ludCBoLT5yb290LnR5cGUgY291bGQgYmUKLQkJCSAgICAgYmZkX2xpbmtfaGFzaF9uZXcuICBUaGF0IHNob3VsZCBiZSBPSywKLQkJCSAgICAgc2luY2Ugd2Uga25vdyBmb3Igc3VyZSB0aGF0IHdlIHdpbGwgY29tZQotCQkJICAgICBhY3Jvc3MgdGhpcyBzeW1ib2wgYXMgd2Ugc3RlcCB0aHJvdWdoIHRoZQotCQkJICAgICBmaWxlLiAgKi8KLQotCQkJICAvKiBXZSBzdG9yZSBoIGluICpzeW1faGFzaCBmb3IgdGhlCi0JCQkgICAgIGNvbnZlbmllbmNlIG9mIHRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JCQkgICAgIGZ1bmN0aW9uLiAgKi8KLQkJCSAgKnN5bV9oYXNoID0gaDsKLQotCQkJICBpZiAoaC0+dG9jX3NlY3Rpb24gIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBhc2VjdGlvbiAqKnJlbF9jc2VjdHM7Ci0KLQkJCSAgICAgIC8qIFdlIGFscmVhZHkgaGF2ZSBhIFRPQyBlbnRyeSBmb3IgdGhpcwotCQkJCSBzeW1ib2wsIHNvIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGlzCi0JCQkJIG9uZS4gICovCi0JCQkgICAgICByZWxfY3NlY3RzID0KLQkJCQlyZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5jc2VjdHM7Ci0JCQkgICAgICByZWxfY3NlY3RzW3JlbGluZHhdID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQotCQkJICAvKiBXZSBhcmUgYWJvdXQgdG8gY3JlYXRlIGEgVE9DIGVudHJ5IGZvcgotCQkJICAgICB0aGlzIHN5bWJvbC4gICovCi0JCQkgIHNldF90b2MgPSBoOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgc2VjdGlvbi4gIFdlIGdldCB0aGUgbmFtZSBmcm9tCi0JICAgICB0aGUgY3NlY3Qgc3RvcmFnZSBtYXBwaW5nIGNsYXNzLCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0JICAgICBhY2N1bXVsYXRlIHNpbWlsYXIgY3NlY3RzIHRvZ2V0aGVyLiAgKi8KLQkgIHsKLQkgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNzZWN0X25hbWVfYnlfY2xhc3NbXSA9Ci0JICAgICAgewotCQkiLnByIiwgIi5ybyIsICIuZGIiLCAiLnRjIiwgIi51YSIsICIucnciLCAiLmdsIiwgIi54byIsCi0JCSIuc3YiLCAiLmJzIiwgIi5kcyIsICIudWMiLCAiLnRpIiwgIi50YiIsIE5VTEwsICIudGMwIiwKLQkJIi50ZCIKLQkgICAgICB9OwotCSAgICBjb25zdCBjaGFyICpjc2VjdF9uYW1lOwotCSAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotCi0JICAgIGlmICgoYXV4LnhfY3NlY3QueF9zbWNsYXMgPj0KLQkJIHNpemVvZiBjc2VjdF9uYW1lX2J5X2NsYXNzIC8gc2l6ZW9mIGNzZWN0X25hbWVfYnlfY2xhc3NbMF0pCi0JCXx8IGNzZWN0X25hbWVfYnlfY2xhc3NbYXV4LnhfY3NlY3QueF9zbWNsYXNdID09IE5VTEwpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IHN5bWJvbCBgJXMnIGhhcyB1bnJlY29nbml6ZWQgc21jbGFzICVkIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBhdXgueF9jc2VjdC54X3NtY2xhcyk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgY3NlY3RfbmFtZSA9IGNzZWN0X25hbWVfYnlfY2xhc3NbYXV4LnhfY3NlY3QueF9zbWNsYXNdOwotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBjc2VjdF9uYW1lKTsKLQkgICAgaWYgKGNzZWN0ID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGVuY2xvc2luZyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICBpZiAoZW5jbG9zaW5nID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAoZW5jbG9zaW5nKQotCQkmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDwgZW5jbG9zaW5nLT52bWEKLQkJICAgIHx8ICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgKyBhdXgueF9jc2VjdC54X3Njbmxlbi5sCi0JCQk+IGVuY2xvc2luZy0+dm1hICsgZW5jbG9zaW5nLT5fcmF3X3NpemUpKSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogY3NlY3QgYCVzJyBub3QgaW4gZW5jbG9zaW5nIHNlY3Rpb24iKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgfQotCSAgICBjc2VjdC0+dm1hID0gc3ltLm5fdmFsdWU7Ci0JICAgIGNzZWN0LT5maWxlcG9zID0gKGVuY2xvc2luZy0+ZmlsZXBvcwotCQkJICAgICAgKyBzeW0ubl92YWx1ZQotCQkJICAgICAgLSBlbmNsb3NpbmctPnZtYSk7Ci0JICAgIGNzZWN0LT5fcmF3X3NpemUgPSBhdXgueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gU01UWVBfQUxJR04gKGF1eC54X2NzZWN0Lnhfc210eXApOwotCi0JICAgIC8qIFJlY29yZCB0aGUgZW5jbG9zaW5nIHNlY3Rpb24gaW4gdGhlIHRkYXRhIGZvciB0aGlzIG5ldwotCSAgICAgICBzZWN0aW9uLiAgKi8KLQkgICAgY3NlY3QtPnVzZWRfYnlfYmZkID0KLQkgICAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgICAgaWYgKGNzZWN0LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9Ci0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmVuY2xvc2luZyA9IGVuY2xvc2luZzsKLQkgICAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmxpbmVub19jb3VudCA9Ci0JICAgICAgZW5jbG9zaW5nLT5saW5lbm9fY291bnQ7Ci0KLQkgICAgaWYgKGVuY2xvc2luZy0+b3duZXIgPT0gYWJmZCkKLQkgICAgICB7Ci0JCXN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotCQliZmRfc2l6ZV90eXBlIHJlbGluZHg7Ci0JCXN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotCQlhc2VjdGlvbiAqKnJlbF9jc2VjdDsKLQotCQlyZWxvY3MgPSByZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JCXJlbGluZHggPSB4Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGVuY2xvc2luZy0+cmVsb2NfY291bnQsCi0JCQkJCSAgICBjc2VjdC0+dm1hKTsKLQkJcmVsID0gcmVsb2NzICsgcmVsaW5keDsKLQkJcmVsX2NzZWN0ID0gKHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmNzZWN0cwotCQkJICAgICArIHJlbGluZHgpOwotCQljc2VjdC0+cmVsX2ZpbGVwb3MgPSAoZW5jbG9zaW5nLT5yZWxfZmlsZXBvcwotCQkJCSAgICAgICsgcmVsaW5keCAqIGJmZF9jb2ZmX3JlbHN6IChhYmZkKSk7Ci0JCXdoaWxlIChyZWxpbmR4IDwgZW5jbG9zaW5nLT5yZWxvY19jb3VudAotCQkgICAgICAgJiYgKnJlbF9jc2VjdCA9PSBOVUxMCi0JCSAgICAgICAmJiByZWwtPnJfdmFkZHIgPCBjc2VjdC0+dm1hICsgY3NlY3QtPl9yYXdfc2l6ZSkKLQkJICB7Ci0JCSAgICAqcmVsX2NzZWN0ID0gY3NlY3Q7Ci0JCSAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCQkgICAgKytjc2VjdC0+cmVsb2NfY291bnQ7Ci0JCSAgICArK3JlbGluZHg7Ci0JCSAgICArK3JlbDsKLQkJICAgICsrcmVsX2NzZWN0OwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIGZpZWxkcyBhbmQgc2VjdGlvbiBmbGFncwotCSAgICAgICB3aGljaCB3ZSBkbyBub3QgYm90aGVyIHRvIHNldC4gICovCi0KLQkgICAgY3NlY3RfaW5kZXggPSAoKGVzeW0KLQkJCSAgICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAgIC8gc3ltZXN6KTsKLQotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+Zmlyc3Rfc3ltbmR4ID0gY3NlY3RfaW5kZXg7Ci0KLQkgICAgaWYgKGZpcnN0X2NzZWN0ID09IE5VTEwpCi0JICAgICAgZmlyc3RfY3NlY3QgPSBjc2VjdDsKLQotCSAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBDX0VYVCwgd2UgdHJlYXQgaXQgYXMgc3RhcnRpbmcgYXQgdGhlCi0JICAgICAgIGJlZ2lubmluZyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBzZWN0aW9uLiAgKi8KLQkgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgICB7Ci0JCXNlY3Rpb24gPSBjc2VjdDsKLQkJdmFsdWUgPSAwOwotCSAgICAgIH0KLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgVE9DIHNlY3Rpb24gZm9yIGEgc3ltYm9sLCByZWNvcmQgaXQuICAqLwotCSAgICBpZiAoc2V0X3RvYyAhPSBOVUxMKQotCSAgICAgIHNldF90b2MtPnRvY19zZWN0aW9uID0gY3NlY3Q7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX0xEOgotCSAgLyogVGhpcyBpcyBhIGxhYmVsIGRlZmluaXRpb24uICBUaGUgeF9zY25sZW4gZmllbGQgaXMgdGhlCi0gICAgICAgICAgICAgc3ltYm9sIGluZGV4IG9mIHRoZSBjc2VjdC4gIEkgYmVsaWV2ZSB0aGF0IHRoaXMgbXVzdAotICAgICAgICAgICAgIGFsd2F5cyBmb2xsb3cgdGhlIGFwcHJvcHJpYXRlIFhUWV9TRCBzeW1ib2wsIHNvIEkgd2lsbAotICAgICAgICAgICAgIGluc2lzdCBvbiBpdC4gICovCi0JICB7Ci0JICAgIGJvb2xlYW4gYmFkOwotCi0JICAgIGJhZCA9IGZhbHNlOwotCSAgICBpZiAoYXV4LnhfY3NlY3QueF9zY25sZW4ubCA8IDAKLQkJfHwgKGF1eC54X2NzZWN0Lnhfc2NubGVuLmwKLQkJICAgID49IGVzeW0gLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpKQotCSAgICAgIGJhZCA9IHRydWU7Ci0JICAgIGlmICghIGJhZCkKLQkgICAgICB7Ci0JCXNlY3Rpb24gPSB4Y29mZl9kYXRhIChhYmZkKS0+Y3NlY3RzW2F1eC54X2NzZWN0Lnhfc2NubGVuLmxdOwotCQlpZiAoc2VjdGlvbiA9PSBOVUxMCi0JCSAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotCQkgIGJhZCA9IHRydWU7Ci0JICAgICAgfQotCSAgICBpZiAoYmFkKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBtaXNwbGFjZWQgWFRZX0xEIGAlcyciKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgfQotCi0JICAgIHZhbHVlID0gc3ltLm5fdmFsdWUgLSBjc2VjdC0+dm1hOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFhUWV9DTToKLQkgIC8qIFRoaXMgaXMgYW4gdW5pdGlhbGl6ZWQgY3NlY3QuICBXZSBjb3VsZCBiYXNlIHRoZSBuYW1lIG9uCi0gICAgICAgICAgICAgdGhlIHN0b3JhZ2UgbWFwcGluZyBjbGFzcywgYnV0IHdlIGRvbid0IGJvdGhlciBleGNlcHQgZm9yCi0gICAgICAgICAgICAgYW4gWE1DX1REIHN5bWJvbC4gIElmIHRoaXMgY3NlY3QgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLAotICAgICAgICAgICAgIGl0IGlzIGEgY29tbW9uIHN5bWJvbC4gIFdlIHB1dCBYTUNfVEQgc3ltYm9scyBpbiBzZWN0aW9ucwotICAgICAgICAgICAgIG5hbWVkIC50b2Nic3MsIGFuZCByZWx5IG9uIHRoZSBsaW5rZXIgc2NyaXB0IHRvIHB1dCB0aGF0Ci0gICAgICAgICAgICAgaW4gdGhlIFRPQyBhcmVhLiAgKi8KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgfQotCi0JICBpZiAoYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1REKQotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnRvY2JzcyIpOwotCSAgZWxzZQotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmJzcyIpOwotCSAgaWYgKGNzZWN0ID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgY3NlY3QtPnZtYSA9IHN5bS5uX3ZhbHVlOwotCSAgY3NlY3QtPl9yYXdfc2l6ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgY3NlY3QtPmFsaWdubWVudF9wb3dlciA9IFNNVFlQX0FMSUdOIChhdXgueF9jc2VjdC54X3NtdHlwKTsKLQkgIC8qIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciBmaWVsZHMgYW5kIHNlY3Rpb24gZmxhZ3MKLQkgICAgIHdoaWNoIHdlIGRvIG5vdCBib3RoZXIgdG8gc2V0LiAgKi8KLQotCSAgY3NlY3RfaW5kZXggPSAoKGVzeW0KLQkJCSAgLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpCi0JCQkgLyBzeW1lc3opOwotCi0JICBjc2VjdC0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjc2VjdC0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9Ci0JICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5maXJzdF9zeW1uZHggPSBjc2VjdF9pbmRleDsKLQotCSAgaWYgKGZpcnN0X2NzZWN0ID09IE5VTEwpCi0JICAgIGZpcnN0X2NzZWN0ID0gY3NlY3Q7Ci0KLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JICAgIHsKLQkgICAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBjc2VjdC0+X3Jhd19zaXplID0gMDsKLQkgICAgICBzZWN0aW9uID0gY3NlY3Q7Ci0JICAgICAgdmFsdWUgPSBhdXgueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIG1hZ2ljIHN5bWJvbCBuYW1lcy4gICovCi0gICAgICBpZiAoKHNtdHlwID09IFhUWV9TRCB8fCBzbXR5cCA9PSBYVFlfQ00pCi0JICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyAhPSBYTUNfVEMKLQkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19URCkKLQl7Ci0JICBpbnQgaTsKLQotCSAgaSA9IC0xOwotCSAgaWYgKG5hbWVbMF0gPT0gJ18nKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIl90ZXh0IikgPT0gMCkKLQkJaSA9IDA7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2V0ZXh0IikgPT0gMCkKLQkJaSA9IDE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2RhdGEiKSA9PSAwKQotCQlpID0gMjsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZWRhdGEiKSA9PSAwKQotCQlpID0gMzsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZW5kIikgPT0gMCkKLQkJaSA9IDQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ2UnICYmIHN0cmNtcCAobmFtZSwgImVuZCIpID09IDApCi0JICAgIGkgPSA1OwotCi0JICBpZiAoaSAhPSAtMSkKLQkgICAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNwZWNpYWxfc2VjdGlvbnNbaV0gPSBjc2VjdDsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhZGQgdGhlIHN5bWJvbCB0byB0aGUKLSAgICAgICAgIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQl7Ci0JICBib29sZWFuIGNvcHk7Ci0KLQkgIEJGRF9BU1NFUlQgKHNlY3Rpb24gIT0gTlVMTCk7Ci0KLQkgIC8qIFdlIG11c3QgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeSBpZiB3ZSBnb3QgaXQgZnJvbSB0aGUKLSAgICAgICAgICAgICBzeW1lbnQgaXRzZWxmLCByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGNvcHkgPSBkZWZhdWx0X2NvcHk7Ci0JICBpZiAoc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkgICAgICB8fCBzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgY29weSA9IHRydWU7Ci0KLQkgIC8qIFRoZSBBSVggbGlua2VyIGFwcGVhcnMgdG8gb25seSBkZXRlY3QgbXVsdGlwbGUgc3ltYm9sCi0JICAgICBkZWZpbml0aW9ucyB3aGVuIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2wuICBJZgotCSAgICAgYSBzeW1ib2wgaXMgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcywgYW5kIHRoZSBvbmx5Ci0JICAgICByZWZlcmVuY2VzIGFyZSBmcm9tIHRoZSBzYW1lIG9iamVjdCBmaWxlLCB0aGUgQUlYIGxpbmtlcgotCSAgICAgYXBwZWFycyB0byBwZXJtaXQgaXQuICBJdCBkb2VzIG5vdCBtZXJnZSB0aGUgZGlmZmVyZW50Ci0JICAgICBkZWZpbml0aW9ucywgYnV0IGhhbmRsZXMgdGhlbSBpbmRlcGVuZGVudGx5LiAgT24gdGhlCi0JICAgICBvdGhlciBoYW5kLCBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSwgdGhlIGxpbmtlciByZXBvcnRzCi0JICAgICBhbiBlcnJvci4KLQotCSAgICAgVGhpcyBtYXR0ZXJzIGJlY2F1c2UgdGhlIEFJWCA8bmV0L25ldF9nbG9iYWxzLmg+IGhlYWRlcgotCSAgICAgZmlsZSBhY3R1YWxseSBkZWZpbmVzIGFuIGluaXRpYWxpemVkIGFycmF5LCBzbyB3ZSBoYXZlIHRvCi0JICAgICBhY3R1YWxseSBwZXJtaXQgdGhhdCB0byB3b3JrLgotCi0JICAgICBKdXN0IHRvIG1ha2UgbWF0dGVycyBldmVuIG1vcmUgY29uZnVzaW5nLCB0aGUgQUlYIGxpbmtlcgotCSAgICAgYXBwZWFycyB0byBwZXJtaXQgbXVsdGlwbGUgc3ltYm9sIGRlZmluaXRpb25zIHdoZW5ldmVyCi0JICAgICB0aGUgc2Vjb25kIGRlZmluaXRpb24gaXMgaW4gYW4gYXJjaGl2ZSByYXRoZXIgdGhhbiBhbgotCSAgICAgb2JqZWN0IGZpbGUuICBUaGlzIG1heSBiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSBtYW5uZXIgaW4KLQkgICAgIHdoaWNoIGl0IGhhbmRsZXMgYXJjaGl2ZXM6IEkgdGhpbmsgaXQgbWF5IGxvYWQgdGhlIGVudGlyZQotCSAgICAgYXJjaGl2ZSBpbiBhcyBzZXBhcmF0ZSBjc2VjdHMsIGFuZCB0aGVuIGxldCBnYXJiYWdlCi0JICAgICBjb2xsZWN0aW9uIGRpc2NhcmQgc3ltYm9scy4KLQotCSAgICAgV2UgYWxzbyBoYXZlIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBzdGF0aWNhbGx5IGxpbmtpbmcgYQotCSAgICAgc2hhcmVkIG9iamVjdCwgd2hpY2ggd2lsbCBjYXVzZSBzeW1ib2wgcmVkZWZpbml0aW9ucywKLQkgICAgIGFsdGhvdWdoIHRoaXMgaXMgYW4gZWFzaWVyIGNhc2UgdG8gZGV0ZWN0LiAgKi8KLQotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0JCSpzeW1faGFzaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLQkgICAgICBlbHNlCi0JCSpzeW1faGFzaCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLAotCQkJCQkJCSAgIHRydWUsIGNvcHksIGZhbHNlKSk7Ci0JICAgICAgaWYgKCpzeW1faGFzaCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQotCQkgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSBzZWNvbmQgZGVmaW5pdGlvbiBvZiBhIGRlZmluZWQgc3ltYm9sLiAgKi8KLQkJICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoKCpzeW1faGFzaCktPnNtY2xhcyAhPSBYTUNfR0wKLQkJCSAgfHwgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX0dMCi0JCQkgIHx8ICgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAgICAgICYgRFlOQU1JQykgPT0gMCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBuZXcgc3ltYm9sIGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRoZSBleGlzdGluZyBzeW1ib2wgaXMgbm90IGdsb2JhbAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UgY29kZSBvciB0aGlzIHN5bWJvbCBpcyBnbG9iYWwgbGlua2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuICBJZiB0aGUgZXhpc3Rpbmcgc3ltYm9sIGlzIGdsb2JhbAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UgY29kZSBhbmQgdGhlIG5ldyBzeW1ib2wgaXMgbm90LCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2Ugd2FudCB0byB1c2UgdGhlIG5ldyBzeW1ib2wuICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAgICAmIERZTkFNSUMpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBleGlzdGluZyBzeW1ib2wgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgaXQuICAqLwotCQkgICAgICAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnUudW5kZWYuYWJmZCA9Ci0JCQkoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSByZWRlZmluaXRpb24gaW4gYW4gb2JqZWN0IGNvbnRhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuIGFyY2hpdmUuICBKdXN0IGlnbm9yZSBpdC4gIFNlZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50IGFib3ZlLiAgKi8KLQkJICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIHZhbHVlID0gMDsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgoKnN5bV9oYXNoKS0+cm9vdC5uZXh0ICE9IE5VTEwKLQkJCSAgIHx8IGluZm8tPmhhc2gtPnVuZGVmc190YWlsID09ICYoKnN5bV9oYXNoKS0+cm9vdCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZC4gIEluIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlLCB3ZSBqdXN0IGNvbnRpbnVlIGFuZCBwZXJtaXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIFNlZSB0aGUgY29tbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGFib3V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFJWCBsaW5rZXIuICAqLwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgqc3ltX2hhc2gpLT5zbWNsYXMgPT0gYXV4LnhfY3NlY3QueF9zbWNsYXMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBzeW1ib2xzIGFyZSBib3RoIGNzZWN0cyBvZiB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiAgVGhlcmUgaXMgYXQgbGVhc3QgYSBjaGFuY2UgdGhhdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXMgYSBzZW1pLWxlZ2l0aW1hdGUgcmVkZWZpbml0aW9uLiAgKi8KLQkJICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIHZhbHVlID0gMDsKLQkJICAgICAgKCpzeW1faGFzaCktPmZsYWdzIHw9IFhDT0ZGX01VTFRJUExZX0RFRklORUQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoKCpzeW1faGFzaCktPmZsYWdzICYgWENPRkZfTVVMVElQTFlfREVGSU5FRCkgIT0gMAotCQkgICAgICAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgICAgICYmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCQkgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbC4KLQkJICAgICBSZXBvcnQgdGhlIGVycm9yIG5vdy4gIFNlZSB0aGUgY29tbWVudCBhYm92ZQotCQkgICAgIGFib3V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFJWCBsaW5rZXIuICBXZSBjb3VsZAotCQkgICAgIGFsc28gZG8gdGhpcyB3aXRoIHdhcm5pbmcgc3ltYm9scywgYnV0IEknbSBub3QKLQkJICAgICBzdXJlIHRoZSBYQ09GRiBsaW5rZXIgaXMgd2hvbGx5IHByZXBhcmVkIHRvCi0JCSAgICAgaGFuZGxlIHRoZW0sIGFuZCB0aGF0IHdvdWxkIG9ubHkgYmUgYSB3YXJuaW5nLAotCQkgICAgIG5vdCBhbiBlcnJvci4gICovCi0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQotCQkJIChpbmZvLCAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgMCwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24sCi0JCQkgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAvKiBUcnkgbm90IHRvIGdpdmUgdGhpcyBlcnJvciB0b28gbWFueSB0aW1lcy4gICovCi0JCSAgKCpzeW1faGFzaCktPmZsYWdzICY9IH5YQ09GRl9NVUxUSVBMWV9ERUZJTkVEOwotCQl9Ci0JICAgIH0KLQotCSAgLyogX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgbWF5IGNhbGwgdGhlIGxpbmtlciB0bwotCSAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIHRoZSBsaW5rZXIgbWF5IHRyeSB0byByZWFkCi0JICAgICB0aGUgc3ltYm9sIHRhYmxlIHRvIGdpdmUgYSBnb29kIGVycm9yLiAgUmlnaHQgbm93LCB0aGUKLQkgICAgIGxpbmUgbnVtYmVycyBhcmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzaW5jZSB0aGV5IGFyZQotCSAgICAgY291bnRlZCBib3RoIGluIHRoZSByZWFsIHNlY3Rpb25zIGFuZCBpbiB0aGUgbmV3IGNzZWN0cy4KLQkgICAgIFdlIG5lZWQgdG8gbGVhdmUgdGhlIGNvdW50IGluIHRoZSByZWFsIHNlY3Rpb25zIHNvIHRoYXQKLQkgICAgIHRoZSBsaW5rZXIgY2FuIHJlcG9ydCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGVycm9yCi0JICAgICBjb3JyZWN0bHksIHNvIHRlbXBvcmFyaWx5IGNsb2JiZXIgdGhlIGxpbmsgdG8gdGhlIGNzZWN0cwotCSAgICAgc28gdGhhdCB0aGUgbGlua2VyIHdpbGwgbm90IHRyeSB0byByZWFkIHRoZSBsaW5lIG51bWJlcnMKLQkgICAgIGEgc2Vjb25kIHRpbWUgZnJvbSB0aGUgY3NlY3RzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGxhc3RfcmVhbC0+bmV4dCA9PSBmaXJzdF9jc2VjdCk7Ci0JICBsYXN0X3JlYWwtPm5leHQgPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkgIChjb25zdCBjaGFyICopIE5VTEwsIGNvcHksIHRydWUsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGxhc3RfcmVhbC0+bmV4dCA9IGZpcnN0X2NzZWN0OwotCi0JICBpZiAoc210eXAgPT0gWFRZX0NNKQotCSAgICB7Ci0JICAgICAgaWYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkJICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+c2VjdGlvbiAhPSBjc2VjdCkKLQkJewotCQkgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGNvbW1vbiBjc2VjdCB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotCQkgIGNzZWN0LT5fcmF3X3NpemUgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCQkgICAgID0gY3NlY3QtPmFsaWdubWVudF9wb3dlcjsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBpbnQgZmxhZzsKLQotCSAgICAgIGlmIChzbXR5cCA9PSBYVFlfRVIgfHwgc210eXAgPT0gWFRZX0NNKQotCQlmbGFnID0gWENPRkZfUkVGX1JFR1VMQVI7Ci0JICAgICAgZWxzZQotCQlmbGFnID0gWENPRkZfREVGX1JFR1VMQVI7Ci0JICAgICAgKCpzeW1faGFzaCktPmZsYWdzIHw9IGZsYWc7Ci0KLQkgICAgICBpZiAoKCpzeW1faGFzaCktPnNtY2xhcyA9PSBYTUNfVUEKLQkJICB8fCBmbGFnID09IFhDT0ZGX0RFRl9SRUdVTEFSKQotCQkoKnN5bV9oYXNoKS0+c21jbGFzID0gYXV4LnhfY3NlY3QueF9zbWNsYXM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgICpjc2VjdF9jYWNoZSA9IGNzZWN0OwotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICAgIHN5bV9oYXNoICs9IHN5bS5uX251bWF1eCArIDE7Ci0gICAgICBjc2VjdF9jYWNoZSArPSBzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChsYXN0X3JlYWwgPT0gTlVMTCB8fCBsYXN0X3JlYWwtPm5leHQgPT0gZmlyc3RfY3NlY3QpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgc2VlbiBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IGZpcnN0X2NzZWN0OyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBSZXNldCB0aGUgc2VjdGlvbiBzaXplIGFuZCB0aGUgbGluZSBudW1iZXIgY291bnQsIHNpbmNlIHRoZQotCSBkYXRhIGlzIG5vdyBhdHRhY2hlZCB0byB0aGUgY3NlY3RzLiAgRG9uJ3QgcmVzZXQgdGhlIHNpemUgb2YKLQkgdGhlIC5kZWJ1ZyBzZWN0aW9uLCBzaW5jZSB3ZSBuZWVkIHRvIHJlYWQgaXQgYmVsb3cgaW4KLQkgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucy4gICovCi0gICAgICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksICIuZGVidWciKSAhPSAwKQotCW8tPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgaTsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotCSAgYXNlY3Rpb24gKipyZWxfY3NlY3Q7Ci0KLQkgIHJlbCA9IHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICByZWxfY3NlY3QgPSByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzOwotCSAgZm9yIChpID0gMDsgaSA8IG8tPnJlbG9jX2NvdW50OyBpKyssIHJlbCsrLCByZWxfY3NlY3QrKykKLQkgICAgewotCSAgICAgIGlmICgqcmVsX2NzZWN0ID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogcmVsb2MgJXM6JWQgbm90IGluIGNzZWN0IiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUsIGkpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBXZSBpZGVudGlmeSBhbGwgc3ltYm9scyB3aGljaCBhcmUgY2FsbGVkLCBzbyB0aGF0IHdlCi0JCSBjYW4gY3JlYXRlIGdsdWUgY29kZSBmb3IgY2FsbHMgdG8gZnVuY3Rpb25zIGltcG9ydGVkCi0JCSBmcm9tIGR5bmFtaWMgb2JqZWN0cy4gICovCi0JICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYwotCQkgICYmICpyZWxfY3NlY3QgIT0gYmZkX3VuZF9zZWN0aW9uX3B0cgotCQkgICYmIChyZWwtPnJfdHlwZSA9PSBSX0JSCi0JCSAgICAgIHx8IHJlbC0+cl90eXBlID09IFJfUkJSKQotCQkgICYmIG9ial94Y29mZl9zeW1faGFzaGVzIChhYmZkKVtyZWwtPnJfc3ltbmR4XSAhPSBOVUxMKQotCQl7Ci0JCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoYWJmZClbcmVsLT5yX3N5bW5keF07Ci0JCSAgaC0+ZmxhZ3MgfD0gWENPRkZfQ0FMTEVEOwotCQkgIC8qIElmIHRoZSBzeW1ib2wgbmFtZSBzdGFydHMgd2l0aCBhIHBlcmlvZCwgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBjb2RlIG9mIGEgZnVuY3Rpb24uICBJZiB0aGUgc3ltYm9sIGlzCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgdW5kZWZpbmVkLCB0aGVuIGFkZCBhbiB1bmRlZmluZWQgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBUaGlzIHNob3VsZCBkbyBubwotICAgICAgICAgICAgICAgICAgICAgaGFybSwgYmVjYXVzZSBhbnkgcmVndWxhciBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGFsc28gZGVmaW5lIHRoZSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci4gIEl0IGhlbHBzLCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAgICAgIHdpbGwgaWRlbnRpZnkgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3Igd2l0aCBhCi0gICAgICAgICAgICAgICAgICAgICBkeW5hbWljIG9iamVjdCBpZiBhIGR5bmFtaWMgb2JqZWN0IGRlZmluZXMgaXQuICAqLwotCQkgIGlmIChoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotCQkgICAgICAmJiBoLT5kZXNjcmlwdG9yID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotCQkgICAgICBoZHMgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICBoLT5yb290LnJvb3Quc3RyaW5nICsgMSwKLQkJCQkJCSAgICB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCSAgICAgIGlmIChoZHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JCQl7Ci0JCQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkJCSAoaW5mbywgYWJmZCwgaGRzLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgKGZsYWd3b3JkKSAwLCBiZmRfdW5kX3NlY3Rpb25fcHRyLAotCQkJCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkJCSAgdHJ1ZSwKLQkJCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmhkcykpKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQkgICAgICBoZHMtPmZsYWdzIHw9IFhDT0ZGX0RFU0NSSVBUT1I7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKChoZHMtPmZsYWdzICYgWENPRkZfQ0FMTEVEKSA9PSAwCi0JCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSA9PSAwKTsKLQkJICAgICAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkJICAgICAgaC0+ZGVzY3JpcHRvciA9IGhkczsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyA9IE5VTEw7Ci0KLQkgIC8qIFJlc2V0IFNFQ19SRUxPQyBhbmQgdGhlIHJlbG9jX2NvdW50LCBzaW5jZSB0aGUgcmVsb2MKLQkgICAgIGluZm9ybWF0aW9uIGlzIG5vdyBhdHRhY2hlZCB0byB0aGUgY3NlY3RzLiAgKi8KLQkgIG8tPmZsYWdzICY9fiBTRUNfUkVMT0M7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0KLQkgIC8qIElmIHdlIGFyZSBub3Qga2VlcGluZyBtZW1vcnksIGZyZWUgdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5Ci0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPnJlbG9jcyAhPSBOVUxMCi0JICAgICAgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmtlZXBfcmVsb2NzKQotCSAgICB7Ci0JICAgICAgZnJlZSAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5yZWxvY3MpOwotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRnJlZSB1cCB0aGUgbGluZSBudW1iZXJzLiAgRklYTUU6IFdlIGNvdWxkIGNhY2hlIHRoZXNlCi0gICAgICAgICBzb21ld2hlcmUgZm9yIHRoZSBmaW5hbCBsaW5rLCB0byBhdm9pZCByZWFkaW5nIHRoZW0gYWdhaW4uICAqLwotICAgICAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zICE9IE5VTEwpCi0JewotCSAgZnJlZSAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocmVsb2NfaW5mbyk7Ci0KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzKTsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyk7Ci0JfQotICAgIGZyZWUgKHJlbG9jX2luZm8pOwotICAgIH0KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jdW5kZWYgTl9UTUFTSwotI3VuZGVmIE5fQlRTSEZUCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgc3ltYm9scyBmcm9tIGEgZHluYW1pYyBvYmplY3QgdG8gdGhlCi0gICBnbG9iYWwgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpidWY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICplbHN5bSwgKmVsc3ltZW5kOwotICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKm47Ci0gIGNvbnN0IGNoYXIgKmJuYW1lOwotICBjb25zdCBjaGFyICptbmFtZTsKLSAgY29uc3QgY2hhciAqczsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqKnBwOwotCi0gIC8qIFdlIGNhbiBvbmx5IGhhbmRsZSBhIGR5bmFtaWMgb2JqZWN0IGlmIHdlIGFyZSBnZW5lcmF0aW5nIGFuIFhDT0ZGCi0gICAgIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IFhDT0ZGIHNoYXJlZCBvYmplY3Qgd2hlbiBub3QgcHJvZHVjaW5nIFhDT0ZGIG91dHB1dCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3ltYm9scyB3ZSB1c2UgZnJvbSBhIGR5bmFtaWMgb2JqZWN0IGFyZSBub3QgdGhlIHN5bWJvbHMgaW4KLSAgICAgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUsIGJ1dCwgcmF0aGVyLCB0aGUgc3ltYm9scyBpbiB0aGUgZXhwb3J0Ci0gICAgIHRhYmxlLiAgSWYgdGhlcmUgaXMgYSBnbG9iYWwgc3ltYm9sIGluIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggaXMKLSAgICAgbm90IGluIHRoZSBleHBvcnQgdGFibGUsIHRoZSBsb2FkZXIgd2lsbCBub3QgYmUgYWJsZSB0byBmaW5kIGl0LAotICAgICBzbyB3ZSBkb24ndCB3YW50IHRvIGZpbmQgaXQgZWl0aGVyLiAgQWxzbywgb24gQUlYIDQuMS4zLCBzaHIubyBpbgotICAgICBsaWJjLmEgaGFzIHN5bWJvbHMgaW4gdGhlIGV4cG9ydCB0YWJsZSB3aGljaCBhcmUgbm90IGluIHRoZQotICAgICBzeW1ib2wgdGFibGUuICAqLwotCi0gIC8qIFJlYWQgaW4gdGhlIC5sb2FkZXIgc2VjdGlvbi4gIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IHVzZSB0aGUKLSAgICAgb19zbmxvYWRlciBmaWVsZCBpbiB0aGUgYS5vdXQgaGVhZGVyLCByYXRoZXIgdGhhbiBncmFiYmluZyB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lLiAgKi8KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogZHluYW1pYyBvYmplY3Qgd2l0aCBubyAubG9hZGVyIHNlY3Rpb24iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBidWYgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzOwotCi0gIC8qIFJlbW92ZSB0aGUgc2VjdGlvbnMgZnJvbSB0aGlzIG9iamVjdCwgc28gdGhhdCB0aGV5IGRvIG5vdCBnZXQKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBidWYsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJ1ZiArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChidWYgKyBMREhEUlNaKTsKLSAgZWxzeW1lbmQgPSBlbHN5bSArIGxkaGRyLmxfbnN5bXM7Ci0gIEJGRF9BU1NFUlQgKHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkc3ltKSA9PSBMRFNZTVNaKTsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotICAgICAgY2hhciBuYW1idWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICB4Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBlbHN5bSwgJmxkc3ltKTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBleHBvcnRlZCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICgobGRzeW0ubF9zbXR5cGUgJiBMX0VYUE9SVCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGxkc3ltLl9sLl9sX2wuX2xfemVyb2VzID09IDApCi0JbmFtZSA9IHN0cmluZ3MgKyBsZHN5bS5fbC5fbF9sLl9sX29mZnNldDsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKG5hbWJ1ZiwgbGRzeW0uX2wuX2xfbmFtZSwgU1lNTk1MRU4pOwotCSAgbmFtYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICBuYW1lID0gbmFtYnVmOwotCX0KLQotICAgICAgLyogTm9ybWFsbHkgd2UgY291bGQgbm90IGNhbGwgeGNvZmZfbGlua19oYXNoX2xvb2t1cCBpbiBhbiBhZGQKLQkgc3ltYm9scyByb3V0aW5lLCBzaW5jZSB3ZSBtaWdodCBub3QgYmUgdXNpbmcgYW4gWENPRkYgaGFzaAotCSB0YWJsZS4gIEhvd2V2ZXIsIHdlIHZlcmlmaWVkIGFib3ZlIHRoYXQgd2UgYXJlIHVzaW5nIGFuIFhDT0ZGCi0JIGhhc2ggdGFibGUuICAqLwotCi0gICAgICBoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsCi0JCQkJICB0cnVlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfRFlOQU1JQzsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIGFuZCB0aGUgQkZEIGl0IHdhcyBmb3VuZCBpbiBpcwotCSBub3QgYSBkeW5hbWljIG9iamVjdCwgY2hhbmdlIHRoZSBCRkQgdG8gdGhpcyBkeW5hbWljIG9iamVjdCwKLQkgc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBjb3JyZWN0IGltcG9ydCBmaWxlIElELiAgKi8KLSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgJiYgKGgtPnJvb3QudS51bmRlZi5hYmZkID09IE5VTEwKLQkgICAgICB8fCAoaC0+cm9vdC51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkpCi0JaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCXsKLQkgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCSAgLyogV2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoaXMgdG8gdGhlIHVuZGVmaW5lZCBzeW1ib2wgbGlzdC4gICovCi0JfQotCi0gICAgICBpZiAoaC0+c21jbGFzID09IFhNQ19VQQotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JaC0+c21jbGFzID0gbGRzeW0ubF9zbWNsYXM7Ci0KLSAgICAgIC8qIFVubGVzcyB0aGlzIGlzIGFuIFhNQ19YTyBzeW1ib2wsIHdlIGRvbid0IGJvdGhlciB0byBhY3R1YWxseQotICAgICAgICAgZGVmaW5lIGl0LCBzaW5jZSB3ZSBkb24ndCBoYXZlIGEgc2VjdGlvbiB0byBwdXQgaXQgaW4gYW55aG93LgotICAgICAgICAgSW5zdGVhZCwgdGhlIHJlbG9jYXRpb24gcm91dGluZXMgaGFuZGxlIHRoZSBERUZfRFlOQU1JQyBmbGFnCi0gICAgICAgICBjb3JyZWN0bHkuICAqLwotCi0gICAgICBpZiAoaC0+c21jbGFzID09IFhNQ19YTwotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGFic29sdXRlIHZhbHVlLiAgKi8KLQkgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gbGRzeW0ubF92YWx1ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGRlZmluZXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCB0aGVuIGl0Ci0JIGltcGxpY2l0bHkgZGVmaW5lcyB0aGUgZnVuY3Rpb24gY29kZSBhcyB3ZWxsLiAgKi8KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX0RTCi0JICB8fCAoaC0+c21jbGFzID09IFhNQ19YTyAmJiBuYW1lWzBdICE9ICcuJykpCi0JaC0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwKQotCXsKLQkgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotCSAgaGRzID0gaC0+ZGVzY3JpcHRvcjsKLQkgIGlmIChoZHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNoYXIgKmRzbm07Ci0KLQkgICAgICBkc25tID0gYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDIpOwotCSAgICAgIGlmIChkc25tID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkc25tWzBdID0gJy4nOwotCSAgICAgIHN0cmNweSAoZHNubSArIDEsIG5hbWUpOwotCSAgICAgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBkc25tLAotCQkJCQkgICAgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgICAgZnJlZSAoZHNubSk7Ci0JICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JCXsKLQkJICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCQkgIGhkcy0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCQkgIC8qIFdlIGRvIG5vdCB3YW50IHRvIGFkZCB0aGlzIHRvIHRoZSB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCBsaXN0LiAgKi8KLQkJfQotCi0JICAgICAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkgICAgICBoLT5kZXNjcmlwdG9yID0gaGRzOwotCSAgICB9Ci0KLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVGX0RZTkFNSUM7Ci0JICBpZiAoaGRzLT5zbWNsYXMgPT0gWE1DX1VBKQotCSAgICBoZHMtPnNtY2xhcyA9IFhNQ19QUjsKLQotCSAgLyogQW4gYWJzb2x1dGUgc3ltYm9sIGFwcGVhcnMgdG8gYWN0dWFsbHkgZGVmaW5lIGNvZGUsIG5vdCBhCi0JICAgICBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgVGhpcyBpcyBob3cgc29tZSBtYXRoIGZ1bmN0aW9ucyBhcmUKLQkgICAgIGltcGxlbWVudGVkIG9uIEFJWCA0LjEuICAqLwotCSAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfWE8KLQkgICAgICAmJiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICB8fCBoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0JICAgIHsKLQkgICAgICBoZHMtPnNtY2xhcyA9IFhNQ19YTzsKLQkgICAgICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgICAgICBoZHMtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgaGRzLT5yb290LnUuZGVmLnZhbHVlID0gbGRzeW0ubF92YWx1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMICYmICEgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMpOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFJlY29yZCB0aGlzIGZpbGUgaW4gdGhlIGltcG9ydCBmaWxlcy4gICovCi0KLSAgbiA9ICgoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICopCi0gICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSkpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG4tPm5leHQgPSBOVUxMOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIHBhdGggZW50cnkgaW4gdGhlIGltcG9ydCBmaWxlIGxpc3QgZm9yIGEKLSAgICAgc2hhcmVkIG9iamVjdCBhcHBlYXJzIHRvIGFsd2F5cyBiZSBlbXB0eS4gIFRoZSBmaWxlIG5hbWUgaXMgdGhlCi0gICAgIGJhc2UgbmFtZS4gICovCi0gIG4tPnBhdGggPSAiIjsKLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBibmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgbW5hbWUgPSAiIjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBibmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQtPm15X2FyY2hpdmUpOwotICAgICAgbW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICB9Ci0gIHMgPSBzdHJyY2hyIChibmFtZSwgJy8nKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICBibmFtZSA9IHMgKyAxOwotICBuLT5maWxlID0gYm5hbWU7Ci0gIG4tPm1lbWJlciA9IG1uYW1lOwotCi0gIC8qIFdlIHN0YXJ0IGMgYXQgMSBiZWNhdXNlIHRoZSBmaXJzdCBpbXBvcnQgZmlsZSBudW1iZXIgaXMgcmVzZXJ2ZWQKLSAgICAgZm9yIExJQlBBVEguICAqLwotICBmb3IgKHBwID0gJnhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5pbXBvcnRzLCBjID0gMTsKLSAgICAgICAqcHAgIT0gTlVMTDsKLSAgICAgICBwcCA9ICYoKnBwKS0+bmV4dCwgKytjKQotICAgIDsKLSAgKnBwID0gbjsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+aW1wb3J0X2ZpbGVfaWQgPSBjOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUm91dGluZXMgdGhhdCBhcmUgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuCi0gICBoYW5kbGVkLCBidXQgYmVmb3JlIHRoZSBzZWN0aW9ucyBhcmUgbGFpZCBvdXQgaW4gbWVtb3J5LiAgKi8KLQotLyogTWFyayBhIHN5bWJvbCBhcyBub3QgYmVpbmcgZ2FyYmFnZSwgaW5jbHVkaW5nIHRoZSBzZWN0aW9uIGluIHdoaWNoCi0gICBpdCBpcyBkZWZpbmVkLiAgKi8KLQotc3RhdGljIElOTElORSBib29sZWFuCi14Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX01BUks7Ci0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpoc2VjOwotCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChoc2VjKQotCSAgJiYgKGhzZWMtPmZsYWdzICYgU0VDX01BUkspID09IDApCi0JewotCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgaHNlYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT50b2Nfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiAoaC0+dG9jX3NlY3Rpb24tPmZsYWdzICYgU0VDX01BUkspID09IDApCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgaC0+dG9jX3NlY3Rpb24pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBtYXJrIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEZvciBhIGdpdmVuIHNlY3Rpb24sIG1hcmsKLSAgIGl0LCBhbmQgYWxsIHRoZSBzZWN0aW9ucyB3aGljaCBkZWZpbmUgc3ltYm9scyB0byB3aGljaCBpdCByZWZlcnMuCi0gICBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gbG9vayBhdCB0aGUgcmVsb2NzLCB3ZSBhbHNvIGNvdW50Ci0gICB0aGUgbnVtYmVyIG9mIHJlbG9jcyB3aGljaCBuZWVkIHRvIGJlIGNvcGllZCBpbnRvIHRoZSAubG9hZGVyCi0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX21hcmsgKGluZm8sIHNlYykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX01BUkspICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjLT5mbGFncyB8PSBTRUNfTUFSSzsKLQotICBpZiAoc2VjLT5vd25lci0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqaHAsICoqaHBlbmQ7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwgKnJlbGVuZDsKLQotICAgICAgLyogTWFyayBhbGwgdGhlIHN5bWJvbHMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLQotICAgICAgaHAgPSAob2JqX3hjb2ZmX3N5bV9oYXNoZXMgKHNlYy0+b3duZXIpCi0JICAgICsgeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5maXJzdF9zeW1uZHgpOwotICAgICAgaHBlbmQgPSAob2JqX3hjb2ZmX3N5bV9oYXNoZXMgKHNlYy0+b3duZXIpCi0JICAgICAgICsgeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5sYXN0X3N5bW5keCk7Ci0gICAgICBmb3IgKDsgaHAgPCBocGVuZDsgaHArKykKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKmhwOwotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9uIHJlbG9jcy4gICovCi0KLSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgcmVsID0geGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKHNlYy0+b3duZXIsIHNlYywgdHJ1ZSwKLQkJCQkJICAgIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKLQkJCQkJICAgIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCk7Ci0JICBpZiAocmVsID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbGVuZCA9IHJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0JICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpyc2VjOwotCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpZiAoKHVuc2lnbmVkIGludCkgcmVsLT5yX3N5bW5keAotCQkgID4gb2JqX3Jhd19zeW1lbnRfY291bnQgKHNlYy0+b3duZXIpKQotCQljb250aW51ZTsKLQotCSAgICAgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcilbcmVsLT5yX3N5bW5keF07Ci0JICAgICAgaWYgKGggIT0gTlVMTAotCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0JCXsKLQkJICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHJzZWMgPSB4Y29mZl9kYXRhIChzZWMtPm93bmVyKS0+Y3NlY3RzW3JlbC0+cl9zeW1uZHhdOwotCSAgICAgIGlmIChyc2VjICE9IE5VTEwKLQkJICAmJiAocnNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQkJewotCQkgIGlmICghIHhjb2ZmX21hcmsgKGluZm8sIHJzZWMpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICAvKiBTZWUgaWYgdGhpcyByZWxvYyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgLmxvYWRlcgotICAgICAgICAgICAgICAgICBzZWN0aW9uLiAgKi8KLQkgICAgICBzd2l0Y2ggKHJlbC0+cl90eXBlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCSAgaWYgKGggPT0gTlVMTAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JCSAgICAgIHx8ICgoaC0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpICE9IDAKLQkJCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkJICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotCQkJICAmJiBoLT5kZXNjcmlwdG9yICE9IE5VTEwKLQkJCSAgJiYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JCQkgICAgICB8fCAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwCi0JCQkJICAmJiAoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MKLQkJCQkgICAgICAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCQkgICAgYnJlYWs7Ci0JCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJY2FzZSBSX1BPUzoKLQkJY2FzZSBSX05FRzoKLQkJY2FzZSBSX1JMOgotCQljYXNlIFJfUkxBOgotCQkgICsreGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkcmVsX2NvdW50OwotCQkgIGlmIChoICE9IE5VTEwpCi0JCSAgICBoLT5mbGFncyB8PSBYQ09GRl9MRFJFTDsKLQkJICBicmVhazsKLQkJY2FzZSBSX1RPQzoKLQkJY2FzZSBSX0dMOgotCQljYXNlIFJfVENMOgotCQljYXNlIFJfVFJMOgotCQljYXNlIFJfVFJMQToKLQkJICAvKiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgVE9DCi0JCSAgICAgcmVsYXRpdmUgcmVsb2MuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPnJlbG9jcyAhPSBOVUxMCi0JICAgICAgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+a2VlcF9yZWxvY3MpCi0JICAgIHsKLQkgICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzKTsKLQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBzd2VlcCBwaGFzZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uICBSZW1vdmUgYWxsIGdhcmJhZ2UKLSAgIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3ZWVwIChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpzdWI7Ci0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0KLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogS2VlcCBhbGwgc2VjdGlvbnMgZnJvbSBub24tWENPRkYgaW5wdXQgZmlsZXMuICBLZWVwCi0gICAgICAgICAgICAgICAgIHNwZWNpYWwgc2VjdGlvbnMuICBLZWVwIC5kZWJ1ZyBzZWN0aW9ucyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgIG1vbWVudC4gICovCi0JICAgICAgaWYgKHN1Yi0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc2VjdGlvbgotCQkgIHx8IG8gPT0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb24KLQkJICB8fCBzdHJjbXAgKG8tPm5hbWUsICIuZGVidWciKSA9PSAwKQotCQlvLT5mbGFncyB8PSBTRUNfTUFSSzsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBvLT5fcmF3X3NpemUgPSAwOwotCQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkJICBvLT5saW5lbm9fY291bnQgPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBSZWNvcmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHNldC4gIFRoaXMgaXMgdXNlZCB0byBvdXRwdXQgdGhlCi0gICBjb3JyZWN0IGNzZWN0IGxlbmd0aC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcsIHNpemUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKm47Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoaXMgd2lsbCBoYXJkbHkgZXZlciBiZSBjYWxsZWQuICBJIGRvbid0IHdhbnQgdG8gYnVybiBmb3VyIGJ5dGVzCi0gICAgIHBlciBnbG9iYWwgc3ltYm9sLCBzbyBpbnN0ZWFkIHRoZSBzaXplIGlzIGtlcHQgb24gYSBsaW5rZWQgbGlzdAotICAgICBhdHRhY2hlZCB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSAgbiA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0ICopCi0gICAgICAgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCkpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG4tPm5leHQgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c2l6ZV9saXN0OwotICBuLT5oID0gaDsKLSAgbi0+c2l6ZSA9IHNpemU7Ci0gIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zaXplX2xpc3QgPSBuOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0hBU19TSVpFOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbXBvcnQgYSBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZywgdmFsLCBpbXBwYXRoLCBpbXBmaWxlLAotCQkJIGltcG1lbWJlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIGJmZF92bWEgdmFsOwotICAgICBjb25zdCBjaGFyICppbXBwYXRoOwotICAgICBjb25zdCBjaGFyICppbXBmaWxlOwotICAgICBjb25zdCBjaGFyICppbXBtZW1iZXI7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBIHN5bWJvbCBuYW1lIHdoaWNoIHN0YXJ0cyB3aXRoIGEgcGVyaW9kIGlzIHRoZSBjb2RlIGZvciBhCi0gICAgIGZ1bmN0aW9uLiAgSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIHRoZW4gYWRkIGFuIHVuZGVmaW5lZAotICAgICBzeW1ib2wgZm9yIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBhbmQgaW1wb3J0IHRoYXQgaW5zdGVhZC4gICovCi0gIGlmIChoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiB2YWwgPT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotICAgICAgaGRzID0gaC0+ZGVzY3JpcHRvcjsKLSAgICAgIGlmIChoZHMgPT0gTlVMTCkKLQl7Ci0JICBoZHMgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJaC0+cm9vdC5yb290LnN0cmluZyArIDEsCi0JCQkJCXRydWUsIGZhbHNlLCB0cnVlKTsKLQkgIGlmIChoZHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICB7Ci0JICAgICAgaGRzLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgICAgICBoZHMtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JICAgIH0KLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLQkgIEJGRF9BU1NFUlQgKChoZHMtPmZsYWdzICYgWENPRkZfQ0FMTEVEKSA9PSAwCi0JCSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDApOwotCSAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkgIGgtPmRlc2NyaXB0b3IgPSBoZHM7Ci0JfQotCi0gICAgICAvKiBOb3csIGlmIHRoZSBkZXNjcmlwdG9yIGlzIHVuZGVmaW5lZCwgaW1wb3J0IHRoZSBkZXNjcmlwdG9yCi0gICAgICAgICByYXRoZXIgdGhhbiB0aGUgc3ltYm9sIHdlIHdlcmUgdG9sZCB0byBpbXBvcnQuICBGSVhNRTogSXMKLSAgICAgICAgIHRoaXMgY29ycmVjdCBpbiBhbGwgY2FzZXM/ICAqLwotICAgICAgaWYgKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCWggPSBoZHM7Ci0gICAgfQotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0lNUE9SVDsKLQotICBpZiAodmFsICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JICAgICAgfHwgaC0+cm9vdC51LmRlZi52YWx1ZSAhPSB2YWwpKQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfZGVmaW5pdGlvbikKLQkJIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiwgaC0+cm9vdC51LmRlZi52YWx1ZSwKLQkJICBvdXRwdXRfYmZkLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB2YWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSB2YWw7Ci0gICAgfQotCi0gIC8qIFdlIG92ZXJsb2FkIHRoZSBsZGluZHggZmllbGQgdG8gaG9sZCB0aGUgbF9pZmlsZSB2YWx1ZSBmb3IgdGhpcwotICAgICBzeW1ib2wuICAqLwotICBCRkRfQVNTRVJUIChoLT5sZHN5bSA9PSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfQlVJTFRfTERTWU0pID09IDApOwotICBpZiAoaW1wcGF0aCA9PSBOVUxMKQotICAgIGgtPmxkaW5keCA9IC0xOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGM7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKipwcDsKLQotICAgICAgLyogV2Ugc3RhcnQgYyBhdCAxIGJlY2F1c2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBpbXBvcnQgbGlzdCBpcwotICAgICAgICAgcmVzZXJ2ZWQgZm9yIHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgKi8KLSAgICAgIGZvciAocHAgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHMsIGMgPSAxOwotCSAgICpwcCAhPSBOVUxMOwotCSAgIHBwID0gJigqcHApLT5uZXh0LCArK2MpCi0JewotCSAgaWYgKHN0cmNtcCAoKCpwcCktPnBhdGgsIGltcHBhdGgpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKCgqcHApLT5maWxlLCBpbXBmaWxlKSA9PSAwCi0JICAgICAgJiYgc3RyY21wICgoKnBwKS0+bWVtYmVyLCBpbXBtZW1iZXIpID09IDApCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCpwcCA9PSBOVUxMKQotCXsKLQkgIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbjsKLQotCSAgbiA9ICgoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICopCi0JICAgICAgIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUpKSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBuLT5uZXh0ID0gTlVMTDsKLQkgIG4tPnBhdGggPSBpbXBwYXRoOwotCSAgbi0+ZmlsZSA9IGltcGZpbGU7Ci0JICBuLT5tZW1iZXIgPSBpbXBtZW1iZXI7Ci0JICAqcHAgPSBuOwotCX0KLQotICAgICAgaC0+bGRpbmR4ID0gYzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEV4cG9ydCBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9leHBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnLCBzeXNjYWxsKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLSAgICAgYm9vbGVhbiBzeXNjYWxsOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoID0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaGFyZzsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfRVhQT1JUOwotCi0gIC8qIEZJWE1FOiBJJ20gbm90IGF0IGFsbCBzdXJlIHdoYXQgc3lzY2FsbCBpcyBzdXBwb3NlZCB0byBtZWFuLCBzbwotICAgICBJJ20ganVzdCBnb2luZyB0byBpZ25vcmUgaXQgdW50aWwgc29tZWJvZHkgZXhwbGFpbnMgaXQuICAqLwotCi0gIC8qIFNlZSBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gIEl0IG1heSBiZSBvbmUgZXZlbiB0aG91Z2gKLSAgICAgaXQgaXMgbm90IHNvIG1hcmtlZC4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSA9PSAwCi0gICAgICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdICE9ICcuJykKLSAgICB7Ci0gICAgICBjaGFyICpmbm5hbWU7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZm47Ci0KLSAgICAgIGZubmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgKyAyKTsKLSAgICAgIGlmIChmbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbm5hbWVbMF0gPSAnLic7Ci0gICAgICBzdHJjcHkgKGZubmFtZSArIDEsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgaGZuID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgIGZubmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGZyZWUgKGZubmFtZSk7Ci0gICAgICBpZiAoaGZuICE9IE5VTEwKLQkgICYmIGhmbi0+c21jbGFzID09IFhNQ19QUgotCSAgJiYgKGhmbi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGhmbi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgaC0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLQkgIGgtPmRlc2NyaXB0b3IgPSBoZm47Ci0JICBoZm4tPmRlc2NyaXB0b3IgPSBoOwotCX0KLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGdhcmJhZ2UgY29sbGVjdCB0aGlzIHN5bWJvbC4gICovCi0gIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIG1ha2Ugc3VyZSB3ZSBkb24ndCBnYXJiYWdlCi0gICAgIGNvbGxlY3QgdGhlIGFzc29jaWF0ZWQgZnVuY3Rpb24gY29kZS4gIFdlIG5vcm1hbGx5IGRvbid0IGhhdmUgdG8KLSAgICAgd29ycnkgYWJvdXQgdGhpcywgYmVjYXVzZSB0aGUgZGVzY3JpcHRvciB3aWxsIGJlIGF0dGFjaGVkIHRvIGEKLSAgICAgc2VjdGlvbiB3aXRoIHJlbG9jcywgYnV0IGlmIHdlIGFyZSBjcmVhdGluZyB0aGUgZGVzY3JpcHRvcgotICAgICBvdXJzZWx2ZXMgdGhvc2UgcmVsb2NzIHdpbGwgbm90IGJlIHZpc2libGUgdG8gdGhlIG1hcmsgY29kZS4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoLT5kZXNjcmlwdG9yKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3VudCBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wuICBUaGlzIGlzIGNhbGxlZCBmb3IgcmVsb2NzCi0gICBnZW5lcmF0ZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsIHR5cGljYWxseSBmb3IgZ2xvYmFsIGNvbnN0cnVjdG9ycwotICAgYW5kIGRlc3RydWN0b3JzLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgICBmYWxzZSkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IG5vIHN1Y2ggc3ltYm9sIiksIG5hbWUpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBoLT5mbGFncyB8PSBYQ09GRl9SRUZfUkVHVUxBUiB8IFhDT0ZGX0xEUkVMOwotICArK3hjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZHJlbF9jb3VudDsKLSAgCi0gIC8qIE1hcmsgdGhlIHN5bWJvbCB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgdG8gd2hpY2ggdGhlIGxpbmtlciBzY3JpcHQKLSAgIGFzc2lnbnMgYSB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIHRydWUsCi0JCQkgICAgICBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9SRUdVTEFSOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdGhyb3VnaAotICAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvCi17Ci0gIC8qIFNldCBpZiBhIHByb2JsZW0gb2NjdXJyZWQuICAqLwotICBib29sZWFuIGZhaWxlZDsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogTGluayBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogV2hldGhlciBhbGwgZGVmaW5lZCBzeW1ib2xzIHNob3VsZCBiZSBleHBvcnRlZC4gICovCi0gIGJvb2xlYW4gZXhwb3J0X2RlZmluZWRzOwotICAvKiBOdW1iZXIgb2YgbGRzeW0gc3RydWN0dXJlcy4gICovCi0gIHNpemVfdCBsZHN5bV9jb3VudDsKLSAgLyogU2l6ZSBvZiBzdHJpbmcgdGFibGUuICAqLwotICBzaXplX3Qgc3RyaW5nX3NpemU7Ci0gIC8qIFN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9ieXRlICpzdHJpbmdzOwotICAvKiBBbGxvY2F0ZWQgc2l6ZSBvZiBzdHJpbmcgdGFibGUuICAqLwotICBzaXplX3Qgc3RyaW5nX2FsYzsKLX07Ci0KLS8qIEJ1aWxkIHRoZSAubG9hZGVyIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgWENPRkYgbGlua2VyCi0gICBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplIG9mIHRoZQotICAgLmxvYWRlciBzZWN0aW9uIGJlZm9yZSB0aGUgbGlua2VyIGxheXMgb3V0IHRoZSBvdXRwdXQgZmlsZS4KLSAgIExJQlBBVEggaXMgdGhlIGxpYnJhcnkgcGF0aCB0byBzZWFyY2ggZm9yIHNoYXJlZCBvYmplY3RzOyB0aGlzIGlzCi0gICBub3JtYWxseSBidWlsdCBmcm9tIHRoZSAtTCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBsaW5rZXIuICBFTlRSWQotICAgaXMgdGhlIG5hbWUgb2YgdGhlIGVudHJ5IHBvaW50IHN5bWJvbCAodGhlIC1lIGxpbmtlciBvcHRpb24pLgotICAgRklMRV9BTElHTiBpcyB0aGUgYWxpZ25tZW50IHRvIHVzZSBmb3Igc2VjdGlvbnMgd2l0aGluIHRoZSBmaWxlCi0gICAodGhlIC1IIGxpbmtlciBvcHRpb24pLiAgTUFYU1RBQ0sgaXMgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSAodGhlCi0gICAtYm1heHN0YWNrIGxpbmtlciBvcHRpb24pLiAgTUFYREFUQSBpcyB0aGUgbWF4aW11bSBkYXRhIHNpemUgKHRoZQotICAgLWJtYXhkYXRhIGxpbmtlciBvcHRpb24pLiAgR0MgaXMgd2hldGhlciB0byBkbyBnYXJiYWdlIGNvbGxlY3Rpb24KLSAgICh0aGUgLWJnYyBsaW5rZXIgb3B0aW9uKS4gIE1PRFRZUEUgaXMgdGhlIG1vZHVsZSB0eXBlICh0aGUKLSAgIC1ibW9kdHlwZSBsaW5rZXIgb3B0aW9uKS4gIFRFWFRSTyBpcyB3aGV0aGVyIHRoZSB0ZXh0IHNlY3Rpb24gbXVzdAotICAgYmUgcmVhZCBvbmx5ICh0aGUgLWJ0ZXh0cm8gbGlua2VyIG9wdGlvbikuICBFWFBPUlRfREVGSU5FRFMgaXMKLSAgIHdoZXRoZXIgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQgKHRoZSAtdW5peCBsaW5rZXIKLSAgIG9wdGlvbikuICBTUEVDSUFMX1NFQ1RJT05TIGlzIHNldCBieSB0aGlzIHJvdXRpbmUgdG8gY3NlY3RzIHdpdGgKLSAgIG1hZ2ljIG5hbWVzIGxpa2UgX2VuZC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8sIGxpYnBhdGgsIGVudHJ5LAotCQkJCSBmaWxlX2FsaWduLCBtYXhzdGFjaywgbWF4ZGF0YSwgZ2MsCi0JCQkJIG1vZHR5cGUsIHRleHRybywgZXhwb3J0X2RlZmluZWRzLAotCQkJCSBzcGVjaWFsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpsaWJwYXRoOwotICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICAgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotICAgICB1bnNpZ25lZCBsb25nIG1heHN0YWNrOwotICAgICB1bnNpZ25lZCBsb25nIG1heGRhdGE7Ci0gICAgIGJvb2xlYW4gZ2M7Ci0gICAgIGludCBtb2R0eXBlOwotICAgICBib29sZWFuIHRleHRybzsKLSAgICAgYm9vbGVhbiBleHBvcnRfZGVmaW5lZHM7Ci0gICAgIGFzZWN0aW9uICoqc3BlY2lhbF9zZWN0aW9uczsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGVudHJ5OwotICBhc2VjdGlvbiAqbHNlYzsKLSAgc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvIGxkaW5mbzsKLSAgaW50IGk7Ci0gIHNpemVfdCBpbXBzaXplLCBpbXBjb3VudDsKLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpmbDsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyICpsZGhkcjsKLSAgYmZkX3NpemVfdHlwZSBzdG9mZjsKLSAgcmVnaXN0ZXIgY2hhciAqb3V0OwotICBhc2VjdGlvbiAqc2VjOwotICBiZmQgKnN1YjsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZGVidWdfc3RydGFiOwotICBiZmRfYnl0ZSAqZGVidWdfY29udGVudHMgPSBOVUxMOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCXNwZWNpYWxfc2VjdGlvbnNbaV0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGxkaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgbGRpbmZvLm91dHB1dF9iZmQgPSBvdXRwdXRfYmZkOwotICBsZGluZm8uaW5mbyA9IGluZm87Ci0gIGxkaW5mby5leHBvcnRfZGVmaW5lZHMgPSBleHBvcnRfZGVmaW5lZHM7Ci0gIGxkaW5mby5sZHN5bV9jb3VudCA9IDA7Ci0gIGxkaW5mby5zdHJpbmdfc2l6ZSA9IDA7Ci0gIGxkaW5mby5zdHJpbmdzID0gTlVMTDsKLSAgbGRpbmZvLnN0cmluZ19hbGMgPSAwOwotCi0gIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5tYXhzdGFjayA9IG1heHN0YWNrOwotICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+bWF4ZGF0YSA9IG1heGRhdGE7Ci0gIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5tb2R0eXBlID0gbW9kdHlwZTsKLQotICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZmlsZV9hbGlnbiA9IGZpbGVfYWxpZ247Ci0gIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50ZXh0cm8gPSB0ZXh0cm87Ci0KLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgaGVudHJ5ID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGhlbnRyeSA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBlbnRyeSwKLQkJCQkgICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoZW50cnkgIT0gTlVMTCkKLQloZW50cnktPmZsYWdzIHw9IFhDT0ZGX0VOVFJZOwotICAgIH0KLQotICAvKiBHYXJiYWdlIGNvbGxlY3QgdW51c2VkIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgISBnYwotICAgICAgfHwgaGVudHJ5ID09IE5VTEwKLSAgICAgIHx8IChoZW50cnktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGhlbnRyeS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgZ2MgPSBmYWxzZTsKLSAgICAgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5nYyA9IGZhbHNlOwotCi0gICAgICAvKiBXZSBzdGlsbCBuZWVkIHRvIGNhbGwgeGNvZmZfbWFyaywgaW4gb3JkZXIgdG8gc2V0IGxkcmVsX2NvdW50Ci0gICAgICAgICBjb3JyZWN0bHkuICAqLwotICAgICAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKm87Ci0KLQkgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX01BUkspID09IDApCi0JCXsKLQkJICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBvKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgaGVudHJ5LT5yb290LnUuZGVmLnNlY3Rpb24pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgeGNvZmZfc3dlZXAgKGluZm8pOwotICAgICAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmdjID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogUmV0dXJuIHNwZWNpYWwgc2VjdGlvbnMgdG8gdGhlIGNhbGxlci4gICovCi0gIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNwZWNpYWxfc2VjdGlvbnNbaV07Ci0gICAgICBpZiAoc2VjICE9IE5VTEwKLQkgICYmIGdjCi0JICAmJiAoc2VjLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCXNlYyA9IE5VTEw7Ci0gICAgICBzcGVjaWFsX3NlY3Rpb25zW2ldID0gc2VjOwotICAgIH0KLQotICBpZiAoaW5mby0+aW5wdXRfYmZkcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEknbSBub3Qgc3VyZSB3aGF0IHRvIGRvIGluIHRoaXMgYml6YXJyZSBjYXNlLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICB4Y29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB4Y29mZl9idWlsZF9sZHN5bXMsCi0JCQkgICAgKFBUUikgJmxkaW5mbyk7Ci0gIGlmIChsZGluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSBpbXBvcnQgZmlsZSBuYW1lcy4gIEVhY2ggaW1wb3J0IGZpbGUgSUQKLSAgICAgY29uc2lzdHMgb2YgdGhyZWUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3M6IHRoZSBwYXRoLCB0aGUgZmlsZQotICAgICBuYW1lLCBhbmQgdGhlIGFyY2hpdmUgbWVtYmVyIG5hbWUuICBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIGxpc3QKLSAgICAgb2YgbmFtZXMgaXMgdGhlIHBhdGggdG8gdXNlIHRvIGZpbmQgb2JqZWN0cywgd2hpY2ggdGhlIGxpbmtlciBoYXMKLSAgICAgcGFzc2VkIGluIGFzIHRoZSBsaWJwYXRoIGFyZ3VtZW50LiAgRm9yIHNvbWUgcmVhc29uLCB0aGUgcGF0aAotICAgICBlbnRyeSBpbiB0aGUgb3RoZXIgaW1wb3J0IGZpbGUgbmFtZXMgYXBwZWFycyB0byBhbHdheXMgYmUgZW1wdHkuICAqLwotICBpbXBzaXplID0gc3RybGVuIChsaWJwYXRoKSArIDM7Ci0gIGltcGNvdW50ID0gMTsKLSAgZm9yIChmbCA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5pbXBvcnRzOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5uZXh0KQotICAgIHsKLSAgICAgICsraW1wY291bnQ7Ci0gICAgICBpbXBzaXplICs9IChzdHJsZW4gKGZsLT5wYXRoKQotCQkgICsgc3RybGVuIChmbC0+ZmlsZSkKLQkJICArIHN0cmxlbiAoZmwtPm1lbWJlcikKLQkJICArIDMpOwotICAgIH0KLQotICAvKiBTZXQgdXAgdGhlIC5sb2FkZXIgc2VjdGlvbiBoZWFkZXIuICAqLwotICBsZGhkciA9ICZ4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRoZHI7Ci0gIGxkaGRyLT5sX3ZlcnNpb24gPSAxOwotICBsZGhkci0+bF9uc3ltcyA9IGxkaW5mby5sZHN5bV9jb3VudDsKLSAgbGRoZHItPmxfbnJlbG9jID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkcmVsX2NvdW50OwotICBsZGhkci0+bF9pc3RsZW4gPSBpbXBzaXplOwotICBsZGhkci0+bF9uaW1waWQgPSBpbXBjb3VudDsKLSAgbGRoZHItPmxfaW1wb2ZmID0gKExESERSU1oKLQkJICAgICArIGxkaGRyLT5sX25zeW1zICogTERTWU1TWgotCQkgICAgICsgbGRoZHItPmxfbnJlbG9jICogTERSRUxTWik7Ci0gIGxkaGRyLT5sX3N0bGVuID0gbGRpbmZvLnN0cmluZ19zaXplOwotICBzdG9mZiA9IGxkaGRyLT5sX2ltcG9mZiArIGltcHNpemU7Ci0gIGlmIChsZGluZm8uc3RyaW5nX3NpemUgPT0gMCkKLSAgICBsZGhkci0+bF9zdG9mZiA9IDA7Ci0gIGVsc2UKLSAgICBsZGhkci0+bF9zdG9mZiA9IHN0b2ZmOwotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAubG9hZGVyIHNlY3Rpb24uICBBbGxvY2F0ZQotICAgICBzcGFjZSBmb3IgaXQuICAqLwotICBsc2VjID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uOwotICBsc2VjLT5fcmF3X3NpemUgPSBzdG9mZiArIGxkaGRyLT5sX3N0bGVuOwotICBsc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBsc2VjLT5fcmF3X3NpemUpOwotICBpZiAobHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBTZXQgdXAgdGhlIGhlYWRlci4gICovCi0gIHhjb2ZmX3N3YXBfbGRoZHJfb3V0IChvdXRwdXRfYmZkLCBsZGhkciwKLQkJCShzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgbHNlYy0+Y29udGVudHMpOwotCi0gIC8qIFNldCB1cCB0aGUgaW1wb3J0IGZpbGUgbmFtZXMuICAqLwotICBvdXQgPSAoY2hhciAqKSBsc2VjLT5jb250ZW50cyArIGxkaGRyLT5sX2ltcG9mZjsKLSAgc3RyY3B5IChvdXQsIGxpYnBhdGgpOwotICBvdXQgKz0gc3RybGVuIChsaWJwYXRoKSArIDE7Ci0gICpvdXQrKyA9ICdcMCc7Ci0gICpvdXQrKyA9ICdcMCc7Ci0gIGZvciAoZmwgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0czsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+bmV4dCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotCi0gICAgICBzID0gZmwtPnBhdGg7Ci0gICAgICB3aGlsZSAoKCpvdXQrKyA9ICpzKyspICE9ICdcMCcpCi0JOwotICAgICAgcyA9IGZsLT5maWxlOwotICAgICAgd2hpbGUgKCgqb3V0KysgPSAqcysrKSAhPSAnXDAnKQotCTsKLSAgICAgIHMgPSBmbC0+bWVtYmVyOwotICAgICAgd2hpbGUgKCgqb3V0KysgPSAqcysrKSAhPSAnXDAnKQotCTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoKGJmZF9zaXplX3R5cGUpICgoYmZkX2J5dGUgKikgb3V0IC0gbHNlYy0+Y29udGVudHMpID09IHN0b2ZmKTsKLQotICAvKiBTZXQgdXAgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotICBpZiAobGRpbmZvLnN0cmluZ19zaXplID4gMCkKLSAgICB7Ci0gICAgICBtZW1jcHkgKG91dCwgbGRpbmZvLnN0cmluZ3MsIGxkaW5mby5zdHJpbmdfc2l6ZSk7Ci0gICAgICBmcmVlIChsZGluZm8uc3RyaW5ncyk7Ci0gICAgICBsZGluZm8uc3RyaW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IHNldCB1cCB0aGUgc3ltYm9sIHRhYmxlIG9yIHRoZSByZWxvY3MgeWV0LCBiZWNhdXNlIHdlCi0gICAgIGRvbid0IHlldCBrbm93IHRoZSBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgdmFyaW91cyBzZWN0aW9ucy4gIFRoZQotICAgICAubG9hZGVyIHN5bWJvbHMgYXJlIHdyaXR0ZW4gb3V0IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbm9ybWFsCi0gICAgIHN5bWJvbHMgYXJlIHdyaXR0ZW4gb3V0IGluIHhjb2ZmX2xpbmtfaW5wdXRfYmZkIG9yCi0gICAgIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wuICBUaGUgLmxvYWRlciByZWxvY3MgYXJlIHdyaXR0ZW4gb3V0Ci0gICAgIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIHJlbG9jcyBhcmUgaGFuZGxlZCBpbgotICAgICB4Y29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBtYWdpYyBzZWN0aW9ucy4gICovCi0gIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb247Ci0gIGlmIChzZWMtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjLT5jb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uOwotICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb247Ci0gIGlmIChzZWMtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjLT5jb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSd2ZSBkb25lIGdhcmJhZ2UgY29sbGVjdGlvbiwgZmlndXJlIG91dCB0aGUgY29udGVudHMKLSAgICAgb2YgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgZGVidWdfc3RydGFiID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3N0cnRhYjsKLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3ViZGViOwotICAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgKmRlYnVnX2luZGV4OwotICAgICAgYXNlY3Rpb24gKipjc2VjdHBwOwotICAgICAgYmZkX2J5dGUgKmVzeW0sICplc3ltZW5kOwotICAgICAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0KLSAgICAgIGlmIChzdWItPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLQljb250aW51ZTsKLSAgICAgIHN1YmRlYiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdWIsICIuZGVidWciKTsKLSAgICAgIGlmIChzdWJkZWIgPT0gTlVMTCB8fCBzdWJkZWItPl9yYXdfc2l6ZSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcgotCSAgfHwgaW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbCkKLQl7Ci0JICBzdWJkZWItPl9yYXdfc2l6ZSA9IDA7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoc3ViKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKLSAgICAgIGRlYnVnX2luZGV4ID0gKCh1bnNpZ25lZCBsb25nICopCi0JCSAgICAgYmZkX3phbGxvYyAoc3ViLCBzeW1jb3VudCAqIHNpemVvZiAodW5zaWduZWQgbG9uZykpKTsKLSAgICAgIGlmIChkZWJ1Z19pbmRleCA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgeGNvZmZfZGF0YSAoc3ViKS0+ZGVidWdfaW5kaWNlcyA9IGRlYnVnX2luZGV4OwotCi0gICAgICAvKiBHcmFiIHRoZSBjb250ZW50cyBvZiB0aGUgLmRlYnVnIHNlY3Rpb24uICBXZSB1c2UgbWFsbG9jIGFuZAotCSBjb3B5IHRoZSBuYW1lcyBpbnRvIHRoZSBkZWJ1ZyBzdHJpbmd0YWIsIHJhdGhlciB0aGFuCi0JIGJmZF9hbGxvYywgYmVjYXVzZSBJIGV4cGVjdCB0aGF0LCB3aGVuIGxpbmtpbmcgbWFueSBmaWxlcwotCSB0b2dldGhlciwgbWFueSBvZiB0aGUgc3RyaW5ncyB3aWxsIGJlIHRoZSBzYW1lLiAgU3RvcmluZyB0aGUKLQkgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBzaG91bGQgc2F2ZSBzcGFjZSBpbiB0aGlzIGNhc2UuICAqLwotICAgICAgZGVidWdfY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3ViZGViLT5fcmF3X3NpemUpOwotICAgICAgaWYgKGRlYnVnX2NvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHN1Yiwgc3ViZGViLCAoUFRSKSBkZWJ1Z19jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHN1YmRlYi0+X3Jhd19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY3NlY3RwcCA9IHhjb2ZmX2RhdGEgKHN1YiktPmNzZWN0czsKLQotICAgICAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChzdWIpOwotICAgICAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChzdWIpOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgICAgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKHN1YiwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7Ci0KLQkgICpkZWJ1Z19pbmRleCA9ICh1bnNpZ25lZCBsb25nKSAtMTsKLQotCSAgaWYgKHN5bS5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JICAgICAgJiYgKmNzZWN0cHAgIT0gTlVMTAotCSAgICAgICYmICghIGdjCi0JCSAgfHwgKCgqY3NlY3RwcCktPmZsYWdzICYgU0VDX01BUkspICE9IDAKLQkJICB8fCAqY3NlY3RwcCA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCSAgICAgICYmIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKHN1YiwgJnN5bSkpCi0JICAgIHsKLQkgICAgICBjaGFyICpuYW1lOwotCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgICAgIG5hbWUgPSAoY2hhciAqKSBkZWJ1Z19jb250ZW50cyArIHN5bS5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkZWJ1Z19zdHJ0YWIsIG5hbWUsIHRydWUsIHRydWUpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgKmRlYnVnX2luZGV4ID0gaW5keDsKLQkgICAgfQotCi0JICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLQkgIGNzZWN0cHAgKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQkgIGRlYnVnX2luZGV4ICs9IHN5bS5uX251bWF1eCArIDE7Ci0JfQotCi0gICAgICBmcmVlIChkZWJ1Z19jb250ZW50cyk7Ci0gICAgICBkZWJ1Z19jb250ZW50cyA9IE5VTEw7Ci0KLSAgICAgIC8qIENsZWFyIHRoZSBzaXplIG9mIHN1YmRlYiwgc28gdGhhdCBpdCBpcyBub3QgaW5jbHVkZWQgZGlyZWN0bHkKLQkgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIHN1YmRlYi0+X3Jhd19zaXplID0gMDsKLQotICAgICAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0JewotCSAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoc3ViKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotICAgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uLT5fcmF3X3NpemUgPQotICAgICAgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZGVidWdfc3RydGFiKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGxkaW5mby5zdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAobGRpbmZvLnN0cmluZ3MpOwotICBpZiAoZGVidWdfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Z19jb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSAubG9hZGVyIHN5bWJvbHMsIGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9idWlsZF9sZHN5bXMgKGgsIHApCi0gICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8gKmxkaW5mbyA9IChzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8gKikgcDsKLSAgc2l6ZV90IGxlbjsKLQotICAvKiBJZiB0aGlzIGlzIGEgZmluYWwgbGluaywgYW5kIHRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYXMgYSBjb21tb24KLSAgICAgc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QgZmlsZSwgYW5kIHRoZXJlIHdhcyBubyBkZWZpbml0aW9uIGluCi0gICAgIGFueSBkeW5hbWljIG9iamVjdCwgdGhlbiB0aGUgbGlua2VyIHdpbGwgaGF2ZSBhbGxvY2F0ZWQgc3BhY2UgZm9yCi0gICAgIHRoZSBzeW1ib2wgaW4gYSBjb21tb24gc2VjdGlvbiBidXQgdGhlIFhDT0ZGX0RFRl9SRUdVTEFSIGZsYWcKLSAgICAgd2lsbCBub3QgaGF2ZSBiZWVuIHNldC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfUkVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JICB8fCAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKSkKLSAgICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfUkVHVUxBUjsKLQotICAvKiBJZiBhbGwgZGVmaW5lZCBzeW1ib2xzIHNob3VsZCBiZSBleHBvcnRlZCwgbWFyayB0aGVtIG5vdy4gIFdlCi0gICAgIGRvbid0IHdhbnQgdG8gZXhwb3J0IHRoZSBhY3R1YWwgZnVuY3Rpb25zLCBqdXN0IHRoZSBmdW5jdGlvbgotICAgICBkZXNjcmlwdG9ycy4gICovCi0gIGlmIChsZGluZm8tPmV4cG9ydF9kZWZpbmVkcwotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gIT0gJy4nKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZXhwb3J0OwotCi0gICAgICAvKiBXZSBkb24ndCBleHBvcnQgYSBzeW1ib2wgd2hpY2ggaXMgYmVpbmcgZGVmaW5lZCBieSBhbiBvYmplY3QKLQkgaW5jbHVkZWQgZnJvbSBhbiBhcmNoaXZlIHdoaWNoIGNvbnRhaW5zIGEgc2hhcmVkIG9iamVjdC4gIFRoZQotCSByYXRpb25hbGUgaXMgdGhhdCBpZiBhbiBhcmNoaXZlIGNvbnRhaW5zIGJvdGggYW4gdW5zaGFyZWQgYW5kCi0JIGEgc2hhcmVkIG9iamVjdCwgdGhlbiB0aGVyZSBtdXN0IGJlIHNvbWUgcmVhc29uIHRoYXQgdGhlCi0JIHVuc2hhcmVkIG9iamVjdCBpcyB1bnNoYXJlZCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQKLQkgcHJvdmlkaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgaXQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHNvbHZlcwotCSBhIGJ1ZyBpbnZvbHZpbmcgdGhlIF9zYXZlZk5OIHNldCBvZiBmdW5jdGlvbnMuICBnY2Mgd2lsbCBjYWxsCi0JIHRob3NlIGZ1bmN0aW9ucyB3aXRob3V0IHByb3ZpZGluZyBhIHNsb3QgdG8gcmVzdG9yZSB0aGUgVE9DLAotCSBzbyBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYmUgbGlua2VkIGluIGRpcmVjdGx5Ci0JIGFuZCBub3QgZnJvbSBhIHNoYXJlZCBvYmplY3QsIHdoaWNoIG1lYW5zIHRoYXQgYSBzaGFyZWQKLQkgb2JqZWN0IHdoaWNoIGFsc28gaGFwcGVucyB0byBsaW5rIHRoZW0gaW4gbXVzdCBub3QgZXhwb3J0Ci0JIHRoZW0uICBUaGlzIGlzIGNvbmZ1c2luZywgYnV0IEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdGhpbmsgb2YKLQkgYSBkaWZmZXJlbnQgYXBwcm9hY2guICBOb3RlIHRoYXQgdGhlIHN5bWJvbHMgY2FuLCBvZiBjb3Vyc2UsCi0JIGJlIGV4cG9ydGVkIGV4cGxpY2l0bHkuICAqLwotICAgICAgZXhwb3J0ID0gdHJ1ZTsKLSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPm15X2FyY2hpdmUgIT0gTlVMTCkKLQl7Ci0JICBiZmQgKmFyYmZkLCAqbWVtYmVyOwotCi0JICBhcmJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPm15X2FyY2hpdmU7Ci0JICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmJmZCwgKGJmZCAqKSBOVUxMKTsKLQkgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgobWVtYmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JCXsKLQkJICBleHBvcnQgPSBmYWxzZTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyYmZkLCBtZW1iZXIpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZXhwb3J0KQotCWgtPmZsYWdzIHw9IFhDT0ZGX0VYUE9SVDsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBnYXJiYWdlIGNvbGxlY3Qgc3ltYm9scyB3aGljaCBhcmUgbm90IGRlZmluZWQgaW4KLSAgICAgWENPRkYgZmlsZXMuICBUaGlzIGlzIGEgY29udmVuaWVudCBwbGFjZSB0byBtYXJrIHRoZW0uICAqLwotICBpZiAoeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDAKLSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgPT0gTlVMTAotCSAgfHwgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPnh2ZWMKLQkgICAgICAhPSBsZGluZm8tPmluZm8tPmhhc2gtPmNyZWF0b3IpKSkKLSAgICBoLT5mbGFncyB8PSBYQ09GRl9NQVJLOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGNhbGxlZCBhbmQgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0LCBvciBpdAotICAgICBpcyBpbXBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHNldCB1cCBnbG9iYWwgbGlua2FnZSBjb2RlIGZvciBpdC4KLSAgICAgKFVubGVzcyB3ZSBkaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCB3ZSBkaWRuJ3QgbmVlZCB0aGlzCi0gICAgIHN5bWJvbC4pICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfQ0FMTEVEKSAhPSAwCi0gICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0gICAgICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotICAgICAgJiYgaC0+ZGVzY3JpcHRvciAhPSBOVUxMCi0gICAgICAmJiAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDAKLQkgIHx8ICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDAKLQkgICAgICAmJiAoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMCkpCi0gICAgICAmJiAoISB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYwotCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgIT0gMCkpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotICAgICAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+bGlua2FnZV9zZWN0aW9uOwotICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gc2VjOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICAgICAgaC0+c21jbGFzID0gWE1DX0dMOwotICAgICAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0gICAgICBzZWMtPl9yYXdfc2l6ZSArPSBYQ09GRl9HTElOS19TSVpFOwotCi0gICAgICAvKiBUaGUgZ2xvYmFsIGxpbmthZ2UgY29kZSByZXF1aXJlcyBhIFRPQyBlbnRyeSBmb3IgdGhlCi0gICAgICAgICBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGhkcyA9IGgtPmRlc2NyaXB0b3I7Ci0gICAgICBCRkRfQVNTRVJUICgoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICAgfHwgaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCSAgJiYgKGhkcy0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMCk7Ci0gICAgICBoZHMtPmZsYWdzIHw9IFhDT0ZGX01BUks7Ci0gICAgICBpZiAoaGRzLT50b2Nfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGhkcy0+dG9jX3NlY3Rpb24gPSB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT50b2Nfc2VjdGlvbjsKLQkgIGhkcy0+dS50b2Nfb2Zmc2V0ID0gaGRzLT50b2Nfc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgaGRzLT50b2Nfc2VjdGlvbi0+X3Jhd19zaXplICs9IDQ7Ci0JICArK3hjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmxkcmVsX2NvdW50OwotCSAgKytoZHMtPnRvY19zZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgIGhkcy0+aW5keCA9IC0yOwotCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9TRVRfVE9DIHwgWENPRkZfTERSRUw7Ci0KLQkgIC8qIFdlIG5lZWQgdG8gY2FsbCB4Y29mZl9idWlsZF9sZHN5bXMgcmVjdXJzaXZlbHkgaGVyZSwKLSAgICAgICAgICAgICBiZWNhdXNlIHdlIG1heSBhbHJlYWR5IGhhdmUgcGFzc2VkIGhkcyBvbiB0aGUgdHJhdmVyc2FsLiAgKi8KLQkgIHhjb2ZmX2J1aWxkX2xkc3ltcyAoaGRzLCBwKTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGV4cG9ydGVkLCBidXQgbm90IGRlZmluZWQsIHdlIG5lZWQgdG8gdHJ5IHRvCi0gICAgIGRlZmluZSBpdC4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpICE9IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspKQotICAgIHsKLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwCi0JICAmJiAoaC0+ZGVzY3JpcHRvci0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPmRlc2NyaXB0b3ItPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIC8qIFRoaXMgaXMgYW4gdW5kZWZpbmVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAgICAgYSBkZWZpbmVkIGVudHJ5IHBvaW50LiAgV2UgY2FuIGJ1aWxkIHVwIGEgZnVuY3Rpb24KLSAgICAgICAgICAgICBkZXNjcmlwdG9yIG91cnNlbHZlcy4gIEJlbGlldmUgaXQgb3Igbm90LCB0aGUgQUlYIGxpbmtlcgotICAgICAgICAgICAgIGFjdHVhbGx5IGRvZXMgdGhpcywgYW5kIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgZG8gaXQgYXMgd2VsbC4gICovCi0JICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb247Ci0JICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzZWM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0JICBoLT5zbWNsYXMgPSBYTUNfRFM7Ci0JICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfUkVHVUxBUjsKLQkgIHNlYy0+X3Jhd19zaXplICs9IDEyOwotCi0JICAvKiBBIGZ1bmN0aW9uIGRlc2NyaXB0b3IgdXNlcyB0d28gcmVsb2NzOiBvbmUgZm9yIHRoZQotICAgICAgICAgICAgIGFzc29jaWF0ZWQgY29kZSwgYW5kIG9uZSBmb3IgdGhlIFRPQyBhZGRyZXNzLiAgKi8KLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmxkcmVsX2NvdW50ICs9IDI7Ci0JICBzZWMtPnJlbG9jX2NvdW50ICs9IDI7Ci0KLQkgIC8qIFdlIGhhbmRsZSB3cml0aW5nIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGRlc2NyaXB0b3IgaW4KLSAgICAgICAgICAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJ3YXJuaW5nOiBhdHRlbXB0IHRvIGV4cG9ydCB1bmRlZmluZWQgc3ltYm9sIGAlcyciKSwKLQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgaC0+bGRzeW0gPSBOVUxMOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIHN0aWxsIGEgY29tbW9uIHN5bWJvbCwgYW5kIGl0IHdhc24ndCBnYXJiYWdlCi0gICAgIGNvbGxlY3RlZCwgd2UgbmVlZCB0byBhY3R1YWxseSBhbGxvY2F0ZSBzcGFjZSBmb3IgaXQgaW4gdGhlIC5ic3MKLSAgICAgc2VjdGlvbi4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLSAgICAgICYmICghIHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmdjCi0JICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSAhPSAwKQotICAgICAgJiYgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYmZkX2lzX2NvbV9zZWN0aW9uIChoLT5yb290LnUuYy5wLT5zZWN0aW9uKSk7Ci0gICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5fcmF3X3NpemUgPSBoLT5yb290LnUuYy5zaXplOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGFkZCBhIHN5bWJvbCB0byB0aGUgLmxvYWRlciBzZWN0aW9uIGlmIGl0IGlzIG1lbnRpb25lZAotICAgICBpbiBhIHJlbG9jIHdoaWNoIHdlIGFyZSBjb3B5aW5nIHRvIHRoZSAubG9hZGVyIHNlY3Rpb24gYW5kIGl0IHdhcwotICAgICBub3QgZGVmaW5lZCBvciBjb21tb24sIG9yIGlmIGl0IGlzIHRoZSBlbnRyeSBwb2ludCwgb3IgaWYgaXQgaXMKLSAgICAgYmVpbmcgZXhwb3J0ZWQuICAqLwotCi0gIGlmICgoKGgtPmZsYWdzICYgWENPRkZfTERSRUwpID09IDAKLSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpID09IDApCi0gICAgewotICAgICAgaC0+bGRzeW0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IG5lZWQgdG8gYWRkIHRoaXMgc3ltYm9sIGlmIHdlIGRpZCBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kCi0gICAgIHdlIGRpZCBub3QgbWFyayB0aGlzIHN5bWJvbC4gICovCi0gIGlmICh4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYwotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLSAgICB7Ci0gICAgICBoLT5sZHN5bSA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgbWF5IGhhdmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBzeW1ib2wgZHVlIHRvIHRoZSByZWN1cnNpdmUKLSAgICAgY2FsbCBhYm92ZS4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9CVUlMVF9MRFNZTSkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBuZWVkIHRvIGFkZCB0aGlzIHN5bWJvbCB0byB0aGUgLmxvYWRlciBzeW1ib2xzLiAgKi8KLQotICBCRkRfQVNTRVJUIChoLT5sZHN5bSA9PSBOVUxMKTsKLSAgaC0+bGRzeW0gPSAoKHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqKQotCSAgICAgIGJmZF96YWxsb2MgKGxkaW5mby0+b3V0cHV0X2JmZCwKLQkJCSAgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0pKSk7Ci0gIGlmIChoLT5sZHN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxkaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLSAgICBoLT5sZHN5bS0+bF9pZmlsZSA9IGgtPmxkaW5keDsKLQotICAvKiBUaGUgZmlyc3QgMyBzeW1ib2wgdGFibGUgaW5kaWNlcyBhcmUgcmVzZXJ2ZWQgdG8gaW5kaWNhdGUgdGhlCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgaC0+bGRpbmR4ID0gbGRpbmZvLT5sZHN5bV9jb3VudCArIDM7Ci0KLSAgKytsZGluZm8tPmxkc3ltX2NvdW50OwotCi0gIGxlbiA9IHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gIGlmIChsZW4gPD0gU1lNTk1MRU4pCi0gICAgc3RybmNweSAoaC0+bGRzeW0tPl9sLl9sX25hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChsZGluZm8tPnN0cmluZ19zaXplICsgbGVuICsgMyA+IGxkaW5mby0+c3RyaW5nX2FsYykKLQl7Ci0JICBzaXplX3QgbmV3YWxjOwotCSAgYmZkX2J5dGUgKm5ld3N0cmluZ3M7Ci0KLQkgIG5ld2FsYyA9IGxkaW5mby0+c3RyaW5nX2FsYyAqIDI7Ci0JICBpZiAobmV3YWxjID09IDApCi0JICAgIG5ld2FsYyA9IDMyOwotCSAgd2hpbGUgKGxkaW5mby0+c3RyaW5nX3NpemUgKyBsZW4gKyAzID4gbmV3YWxjKQotCSAgICBuZXdhbGMgKj0gMjsKLQotCSAgbmV3c3RyaW5ncyA9ICgoYmZkX2J5dGUgKikKLQkJCWJmZF9yZWFsbG9jICgoUFRSKSBsZGluZm8tPnN0cmluZ3MsIG5ld2FsYykpOwotCSAgaWYgKG5ld3N0cmluZ3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxkaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGxkaW5mby0+c3RyaW5nX2FsYyA9IG5ld2FsYzsKLQkgIGxkaW5mby0+c3RyaW5ncyA9IG5ld3N0cmluZ3M7Ci0JfQotCi0gICAgICBiZmRfcHV0XzE2IChsZGluZm8tPm91dHB1dF9iZmQsIGxlbiArIDEsCi0JCSAgbGRpbmZvLT5zdHJpbmdzICsgbGRpbmZvLT5zdHJpbmdfc2l6ZSk7Ci0gICAgICBzdHJjcHkgKGxkaW5mby0+c3RyaW5ncyArIGxkaW5mby0+c3RyaW5nX3NpemUgKyAyLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgIGgtPmxkc3ltLT5fbC5fbF9sLl9sX3plcm9lcyA9IDA7Ci0gICAgICBoLT5sZHN5bS0+X2wuX2xfbC5fbF9vZmZzZXQgPSBsZGluZm8tPnN0cmluZ19zaXplICsgMjsKLSAgICAgIGxkaW5mby0+c3RyaW5nX3NpemUgKz0gbGVuICsgMzsKLSAgICB9Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfQlVJTFRfTERTWU07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBEbyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotYm9vbGVhbgotX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gZmluZm87Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCByZWxzejsKLSAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgbGluZXN6OwotICBiZmQgKnN1YjsKLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGNoYXIgc3RyYnVmW1NUUklOR19TSVpFX1NJWkVdOwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotCi0gIGZpbmZvLmluZm8gPSBpbmZvOwotICBmaW5mby5vdXRwdXRfYmZkID0gYWJmZDsKLSAgZmluZm8uc3RydGFiID0gTlVMTDsKLSAgZmluZm8uc2VjdGlvbl9pbmZvID0gTlVMTDsKLSAgZmluZm8ubGFzdF9maWxlX2luZGV4ID0gLTE7Ci0gIGZpbmZvLnRvY19zeW1pbmR4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotCi0gIGZpbmZvLmxkc3ltID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikKLQkJICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24tPmNvbnRlbnRzCi0JCSAgKyBMREhEUlNaKSk7Ci0gIGZpbmZvLmxkcmVsID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwgKikKLQkJICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24tPmNvbnRlbnRzCi0JCSAgKyBMREhEUlNaCi0JCSAgKyB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRoZHIubF9uc3ltcyAqIExEU1lNU1opKTsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+Y29mZi5saW5rX2luZm8gPSBpbmZvOwotCi0gIGZpbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChmaW5mby5zdHJ0YWIgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBDb3VudCB0aGUgbGluZSBudW1iZXIgYW5kIHJlbG9jYXRpb24gZW50cmllcyByZXF1aXJlZCBmb3IgdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgRGV0ZXJtaW5lIGEgZmV3IG1heGltdW0gc2l6ZXMuICAqLwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9saW5lbm9fY291bnQgPSAwOwotICBtYXhfcmVsb2NfY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTAotCQkgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0JCSAgJiYgKHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+bGluZW5vX2NvdW50Ci0JCSAgICAgID4gbWF4X2xpbmVub19jb3VudCkpCi0JCW1heF9saW5lbm9fY291bnQgPQotCQkgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+bGluZW5vX2NvdW50OwotCSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID4gbWF4X3JlbG9jX2NvdW50KQotCQltYXhfcmVsb2NfY291bnQgPSBzZWMtPnJlbG9jX2NvdW50OwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICAvKiBDb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZmlsZV9hbGlnbiAhPSAwKQotCWFib3J0ICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF92bWEgZmlsZV9hbGlnbjsKLQotICAgICAgZmlsZV9hbGlnbiA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5maWxlX2FsaWduOwotICAgICAgaWYgKGZpbGVfYWxpZ24gIT0gMCkKLQl7Ci0JICBib29sZWFuIHNhd19jb250ZW50czsKLQkgIGludCBpbmR4OwotCSAgYXNlY3Rpb24gKipvcDsKLQkgIGZpbGVfcHRyIHNvZmFyOwotCi0JICAvKiBJbnNlcnQgLnBhZCBzZWN0aW9ucyBiZWZvcmUgZXZlcnkgc2VjdGlvbiB3aGljaCBoYXMKLSAgICAgICAgICAgICBjb250ZW50cyBhbmQgaXMgbG9hZGVkLCBpZiBpdCBpcyBwcmVjZWRlZCBieSBzb21lIG90aGVyCi0gICAgICAgICAgICAgc2VjdGlvbiB3aGljaCBoYXMgY29udGVudHMgYW5kIGlzIGxvYWRlZC4gICovCi0JICBzYXdfY29udGVudHMgPSB0cnVlOwotCSAgZm9yIChvcCA9ICZhYmZkLT5zZWN0aW9uczsgKm9wICE9IE5VTEw7IG9wID0gJigqb3ApLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoKCpvcCktPm5hbWUsICIucGFkIikgPT0gMCkKLQkJc2F3X2NvbnRlbnRzID0gZmFsc2U7Ci0JICAgICAgZWxzZSBpZiAoKCgqb3ApLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKLQkJICAgICAgICYmICgoKm9wKS0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJewotCQkgIGlmICghIHNhd19jb250ZW50cykKLQkJICAgIHNhd19jb250ZW50cyA9IHRydWU7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqbiwgKmhvbGQ7Ci0KLQkJICAgICAgaG9sZCA9ICpvcDsKLQkJICAgICAgKm9wID0gTlVMTDsKLQkJICAgICAgbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnBhZCIpOwotCQkgICAgICBCRkRfQVNTRVJUICgqb3AgPT0gbik7Ci0JCSAgICAgIG4tPm5leHQgPSBob2xkOwotCQkgICAgICBuLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICAgIG4tPmFsaWdubWVudF9wb3dlciA9IDA7Ci0JCSAgICAgIHNhd19jb250ZW50cyA9IGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogUmVzZXQgdGhlIHNlY3Rpb24gaW5kaWNlcyBhZnRlciBpbnNlcnRpbmcgdGhlIG5ldwotICAgICAgICAgICAgIHNlY3Rpb25zLiAgKi8KLQkgIGluZHggPSAwOwotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICArK2luZHg7Ci0JICAgICAgby0+dGFyZ2V0X2luZGV4ID0gaW5keDsKLQkgICAgfQotCSAgQkZEX0FTU0VSVCAoKHVuc2lnbmVkIGludCkgaW5keCA9PSBhYmZkLT5zZWN0aW9uX2NvdW50KTsKLQotCSAgLyogV29yayBvdXQgYXBwcm9wcmlhdGUgc2l6ZXMgZm9yIHRoZSAucGFkIHNlY3Rpb25zIHRvIGZvcmNlCi0gICAgICAgICAgICAgZWFjaCBzZWN0aW9uIHRvIGxhbmQgb24gYSBwYWdlIGJvdW5kYXJ5LiAgVGhpcyBiaXQgb2YKLSAgICAgICAgICAgICBjb2RlIGtub3dzIHdoYXQgY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIGlzIGdvaW5nCi0gICAgICAgICAgICAgdG8gZG8uICAqLwotCSAgc29mYXIgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpOwotCSAgc29mYXIgKz0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLQkgIHNvZmFyICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIGlmIChvLT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgby0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLQkgICAgICBzb2ZhciArPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotCi0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIucGFkIikgPT0gMCkKLQkJewotCQkgIGJmZF92bWEgcGFnZW9mZjsKLQotCQkgIEJGRF9BU1NFUlQgKG8tPl9yYXdfc2l6ZSA9PSAwKTsKLQkJICBwYWdlb2ZmID0gc29mYXIgJiAoZmlsZV9hbGlnbiAtIDEpOwotCQkgIGlmIChwYWdlb2ZmICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIG8tPl9yYXdfc2l6ZSA9IGZpbGVfYWxpZ24gLSBwYWdlb2ZmOwotCQkgICAgICBzb2ZhciArPSBmaWxlX2FsaWduIC0gcGFnZW9mZjsKLQkJICAgICAgby0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCQkgICAgc29mYXIgKz0gQkZEX0FMSUdOIChvLT5fcmF3X3NpemUsCi0JCQkJCTEgPDwgby0+YWxpZ25tZW50X3Bvd2VyKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlIG5lZWQgdG8ga2VlcCBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQotICAgICAgIHRoZSB0YXJnZXRfaW5kZXggZmllbGRzIGFyZSAxIGJhc2VkLiAgKi8KLSAgICBmaW5mby5zZWN0aW9uX2luZm8gPQotICAgICAgKChzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8gKikKLSAgICAgICBiZmRfbWFsbG9jICgoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpCi0JCSAgICogc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7Ci0gICAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyA9PSBOVUxMKQotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgZm9yIChpID0gMDsgaSA8PSBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0gICAgICB7Ci0JZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyA9IE5VTEw7Ci0JZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgPSBOVUxMOwotCWZpbmZvLnNlY3Rpb25faW5mb1tpXS50b2NfcmVsX2hhc2hlcyA9IE5VTEw7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBTZXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgcmVsX2ZpbGVwb3MgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0gIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBzdHJpcHBlZCBmaWxlIGhhcyBubyByZWxvY3MuICBIb3dldmVyLCB3ZSBzdGlsbAotICAgICAgICAgICAgIGFsbG9jYXRlIHRoZSBidWZmZXJzLCBzbyB0aGF0IGxhdGVyIGNvZGUgZG9lc24ndCBoYXZlIHRvCi0gICAgICAgICAgICAgd29ycnkgYWJvdXQgd2hldGhlciB3ZSBhcmUgc3RyaXBwaW5nIG9yIG5vdC4gICovCi0JICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCSAgICBvLT5yZWxfZmlsZXBvcyA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICAgICAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgICAgICByZWxfZmlsZXBvcyArPSBvLT5yZWxvY19jb3VudCAqIHJlbHN6OwotCSAgICB9Ci0KLQkgIC8qIFdlIGRvbid0IGtub3cgdGhlIGluZGljZXMgb2YgZ2xvYmFsIHN5bWJvbHMgdW50aWwgd2UgaGF2ZQotICAgICAgICAgICAgIHdyaXR0ZW4gb3V0IGFsbCB0aGUgbG9jYWwgc3ltYm9scy4gIEZvciBlYWNoIHNlY3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgb3V0cHV0IGZpbGUsIHdlIGtlZXAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGFzaAotICAgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhCi0gICAgICAgICAgICAgcmVsb2MuICBXaGVuIHdlIGZpbmQgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgd2UKLSAgICAgICAgICAgICBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGNhbgotICAgICAgICAgICAgIGZpeCB1cCB0aGUgc3ltYm9sIGluZGV4IGFmdGVyIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZQotICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuCi0KLQkgICAgIEJlY2F1c2Ugb2YgdGhpcyBwcm9ibGVtLCB3ZSBhbHNvIGtlZXAgdGhlIHJlbG9jcyBpbgotCSAgICAgbWVtb3J5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIHdhc3RlcyBtZW1vcnkuCi0JICAgICBXZSBjb3VsZCBiYWNrcGF0Y2ggdGhlIGZpbGUgbGF0ZXIsIEkgc3VwcG9zZSwgYWx0aG91Z2ggaXQKLQkgICAgIHdvdWxkIGJlIHNsb3cuICAqLwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KLQkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KLQkgICAgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9PSBOVUxMCi0JICAgICAgfHwgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID4gbWF4X291dHB1dF9yZWxvY19jb3VudCkKLQkgICAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IG8tPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHNpemUgb2YgdGhlIHJlbG9jcywgc28gd2UgY2FuIGRldGVybWluZSB0aGUgZmlsZQotICAgICBwb3NpdGlvbnMgb2YgdGhlIGxpbmUgbnVtYmVycy4gICovCi0gIGxpbmVfZmlsZXBvcyA9IHJlbF9maWxlcG9zOwotICBmaW5mby5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKLQlvLT5saW5lX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLQkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7Ci0JfQotCi0gICAgICAvKiBSZXNldCB0aGUgcmVsb2MgYW5kIGxpbmVubyBjb3VudHMsIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIHRvCi0JIGNvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IGxpbmVfZmlsZXBvczsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBsYXJnZXN0IG51bWJlciBvZiBzeW1ib2xzIGluIGFuIGlucHV0IEJGRC4gIFRha2UKLSAgICAgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFyIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkcyBvZiBhbGwgdGhlCi0gICAgIGlucHV0IEJGRCdzLiAgV2Ugd2FudCBhdCBsZWFzdCA2IHN5bWJvbHMsIHNpbmNlIHRoYXQgaXMgdGhlCi0gICAgIG51bWJlciB3aGljaCB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sIG1heSBuZWVkLiAgKi8KLSAgbWF4X3N5bV9jb3VudCA9IDY7Ci0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHNpemVfdCBzejsKLQotICAgICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gICAgICBzeiA9IG9ial9yYXdfc3ltZW50X2NvdW50IChzdWIpOwotICAgICAgaWYgKHN6ID4gbWF4X3N5bV9jb3VudCkKLQltYXhfc3ltX2NvdW50ID0gc3o7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNvbWUgYnVmZmVycyB1c2VkIHdoaWxlIGxpbmtpbmcuICAqLwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gKChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gKGxvbmcgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAobG9uZykpOwotICBmaW5mby5vdXRzeW1zID0gKChiZmRfYnl0ZSAqKQotCQkgICBiZmRfbWFsbG9jICgoc2l6ZV90KSAoKG1heF9zeW1fY291bnQgKyAxKSAqIHN5bWVzeikpKTsKLSAgZmluZm8ubGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfbGluZW5vX2NvdW50Ci0JCQkJCSAgICogYmZkX2NvZmZfbGluZXN6IChhYmZkKSk7Ci0gIGZpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgaWYgKChmaW5mby5pbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAotICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOwotICB4Y29mZl9kYXRhIChhYmZkKS0+dG9jID0gKGJmZF92bWEpIC0xOwotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBwb3NpdGlvbiBvZiBldmVyeXRoaW5nIGluIHRoZSBmaWxlLCBleGNlcHQgdGhhdAotICAgICB3ZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUgYW5kIHRoZXJlZm9yZSB3ZSBkb24ndAotICAgICBrbm93IHdoZXJlIHRoZSBzdHJpbmcgdGFibGUgc3RhcnRzLiAgV2UganVzdCBidWlsZCB0aGUgc3RyaW5nCi0gICAgIHRhYmxlIGluIG1lbW9yeSBhcyB3ZSBnbyBhbG9uZy4gIFdlIHByb2Nlc3MgYWxsIHRoZSByZWxvY2F0aW9ucwotICAgICBmb3IgYSBzaW5nbGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lci0+eHZlYyA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgc3ViID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBzdWItPm91dHB1dF9oYXNfYmVndW4pCi0JCXsKLQkJICBpZiAoISB4Y29mZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBzdWIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISB4Y29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCAmZmluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IHhjb2ZmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICAgICAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gICAgICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICAgICAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gICAgICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sIGlzIHN1cHBvc2VkIHRvIGJlIC0xLiAgV3JpdGUKLSAgICAgaXQgb3V0IGFnYWluLiAgKi8KLSAgaWYgKGZpbmZvLmxhc3RfZmlsZV9pbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IC0xOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmZmluZm8ubGFzdF9maWxlLAotCQkJICAgICAoUFRSKSBmaW5mby5vdXRzeW1zKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBmaW5mby5sYXN0X2ZpbGVfaW5kZXggKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoZmluZm8ub3V0c3ltcywgc3ltZXN6LCAxLCBhYmZkKSAhPSBzeW1lc3opCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCBhbGwgdGhlIGdsb2JhbCBzeW1ib2xzIHdoaWNoIGRvIG5vdCBjb21lIGZyb20gWENPRkYKLSAgICAgaW5wdXQgZmlsZXMuICAqLwotICB4Y29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wsCi0JCQkgICAgKFBUUikgJmZpbmZvKTsKLQotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICAgICAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdyB0aGUKLSAgICAgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuIGZpbmFsbHkKLSAgICAgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICBleHRlcm5hbF9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X291dHB1dF9yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9vdXRwdXRfcmVsb2NfY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoICp0b2NfcmVsX2hhc2g7Ci0gICAgICBiZmRfYnl0ZSAqZXJlbDsKLQotICAgICAgLyogQSBzdHJpcHBlZCBmaWxlIGhhcyBubyByZWxvY3MuICAqLwotICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQl7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpcmVsID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzOwotICAgICAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIHJlbF9oYXNoID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlczsKLSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCXsKLQkgIGlmICgqcmVsX2hhc2ggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgoKnJlbF9oYXNoKS0+aW5keCA8IDApCi0JCXsKLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgKGluZm8sICgqcmVsX2hhc2gpLT5yb290LnJvb3Quc3RyaW5nLAotCQkJICAoYmZkICopIE5VTEwsIG8sIGlyZWwtPnJfdmFkZHIpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICgqcmVsX2hhc2gpLT5pbmR4ID0gMDsKLQkJfQotCSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gKCpyZWxfaGFzaCktPmluZHg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZvciAodG9jX3JlbF9oYXNoID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0udG9jX3JlbF9oYXNoZXM7Ci0JICAgdG9jX3JlbF9oYXNoICE9IE5VTEw7Ci0JICAgdG9jX3JlbF9oYXNoID0gdG9jX3JlbF9oYXNoLT5uZXh0KQotCXsKLQkgIGlmICh0b2NfcmVsX2hhc2gtPmgtPnUudG9jX2luZHggPCAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgICAgIChpbmZvLCB0b2NfcmVsX2hhc2gtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgICAgIChiZmQgKikgTlVMTCwgbywgdG9jX3JlbF9oYXNoLT5yZWwtPnJfdmFkZHIpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgdG9jX3JlbF9oYXNoLT5oLT51LnRvY19pbmR4ID0gMDsKLQkgICAgfQotCSAgdG9jX3JlbF9oYXNoLT5yZWwtPnJfc3ltbmR4ID0gdG9jX3JlbF9oYXNoLT5oLT51LnRvY19pbmR4OwotCX0KLQotICAgICAgLyogWENPRkYgcmVxdWlyZXMgdGhhdCB0aGUgcmVsb2NzIGJlIHNvcnRlZCBieSBhZGRyZXNzLiAgV2UgdGVuZAotICAgICAgICAgdG8gcHJvZHVjZSB0aGVtIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGVpciBjb250YWluaW5nIGNzZWN0cwotICAgICAgICAgYXBwZWFyIGluIHRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSBieQotICAgICAgICAgYWRkcmVzcy4gIFNvIHdlIHNvcnQgdGhlbSBoZXJlLiAgVGhlcmUgbWF5IGJlIGEgYmV0dGVyIHdheSB0bwotICAgICAgICAgZG8gdGhpcy4gICovCi0gICAgICBxc29ydCAoKFBUUikgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzLAotCSAgICAgby0+cmVsb2NfY291bnQsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSwKLQkgICAgIHhjb2ZmX3NvcnRfcmVsb2NzKTsKLQotICAgICAgaXJlbCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLSAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICBlcmVsID0gZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyssIHJlbF9oYXNoKyssIGVyZWwgKz0gcmVsc3opCi0JYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIChQVFIpIGlyZWwsIChQVFIpIGVyZWwpOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlICgoUFRSKSBleHRlcm5hbF9yZWxvY3MsIHJlbHN6LCBvLT5yZWxvY19jb3VudCwKLQkJCWFiZmQpICE9IHJlbHN6ICogby0+cmVsb2NfY291bnQpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgbG9hZGVyIHNlY3Rpb24gY29udGVudHMuICAqLwotICBCRkRfQVNTRVJUICgoYmZkX2J5dGUgKikgZmluZm8ubGRyZWwKLQkgICAgICA9PSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cwotCQkgICsgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyLmxfaW1wb2ZmKSk7Ci0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb247Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICBvLT5jb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkgIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBtYWdpYyBzZWN0aW9ucy4gICovCi0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uOwotICBpZiAoby0+X3Jhd19zaXplID4gMAotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKLQkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb247Ci0gIGlmIChvLT5fcmF3X3NpemUgPiAwCi0gICAgICAmJiAhIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sIG8tPmNvbnRlbnRzLAotCQkJCSAgICAgby0+b3V0cHV0X29mZnNldCwgby0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb247Ci0gIGlmIChvLT5fcmF3X3NpemUgPiAwCi0gICAgICAmJiAhIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sIG8tPmNvbnRlbnRzLAotCQkJCSAgICAgby0+b3V0cHV0X29mZnNldCwgby0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKLQkJICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6KSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwKLQkJX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3RydGFiKSArIFNUUklOR19TSVpFX1NJWkUsCi0JCShiZmRfYnl0ZSAqKSBzdHJidWYpOwotICBpZiAoYmZkX3dyaXRlIChzdHJidWYsIDEsIFNUUklOR19TSVpFX1NJWkUsIGFiZmQpICE9IFNUUklOR19TSVpFX1NJWkUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN0cnRhYikpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBzdHJpbmcgdGFibGUuICAqLwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb247Ci0gIGlmIChvICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZGVidWdfc3RydGFiOwotCi0gICAgICBkZWJ1Z19zdHJ0YWIgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc3RydGFiOwotICAgICAgQkZEX0FTU0VSVCAoby0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSAtIG8tPm91dHB1dF9vZmZzZXQKLQkJICA+PSBfYmZkX3N0cmluZ3RhYl9zaXplIChkZWJ1Z19zdHJ0YWIpKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIG8tPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgby0+b3V0cHV0X29mZnNldCwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZGVidWdfc3RydGFiKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogU2V0dGluZyBiZmRfZ2V0X3N5bWNvdW50IHRvIDAgd2lsbCBjYXVzZSB3cml0ZV9vYmplY3RfY29udGVudHMgdG8KLSAgICAgbm90IHRyeSB0byB3cml0ZSBvdXQgdGhlIHN5bWJvbHMuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmaW5mby5zdHJ0YWIgIT0gTlVMTCkKLSAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgfQotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIExpbmsgYW4gaW5wdXQgZmlsZSBpbnRvIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuICBUaGlzIGZ1bmN0aW9uCi0gICBoYW5kbGVzIGFsbCB0aGUgc2VjdGlvbnMgYW5kIHJlbG9jYXRpb25zIG9mIHRoZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBiZmRfc2l6ZV90eXBlIHN5bWVudF9iYXNlOwotICB1bnNpZ25lZCBpbnQgbl90bWFzazsKLSAgdW5zaWduZWQgaW50IG5fYnRzaGZ0OwotICBib29sZWFuIGNvcHksIGhhc2g7Ci0gIGJmZF9zaXplX3R5cGUgaXN5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBvc3ltZXN6OwotICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc3ltcDsKLSAgYXNlY3Rpb24gKipjc2VjdHBwOwotICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRleDsKLSAgbG9uZyAqaW5kZXhwOwotICB1bnNpZ25lZCBsb25nIG91dHB1dF9pbmRleDsKLSAgYmZkX2J5dGUgKm91dHN5bTsKLSAgdW5zaWduZWQgaW50IGluY2xzOwotICBhc2VjdGlvbiAqb2xpbmU7Ci0gIGJvb2xlYW4ga2VlcF9zeW1zOwotICBhc2VjdGlvbiAqbzsKLQotICAvKiBXZSBjYW4ganVzdCBza2lwIERZTkFNSUMgZmlsZXMsIHVubGVzcyB0aGlzIGlzIGEgc3RhdGljIGxpbmsuICAqLwotICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiAhIGZpbmZvLT5pbmZvLT5zdGF0aWNfbGluaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBNb3ZlIGFsbCB0aGUgc3ltYm9scyB0byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgc3RyaW5ncyA9IE5VTEw7Ci0gIHN5bWVudF9iYXNlID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotICBpc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotICBvc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChpbnB1dF9iZmQpOwotICBCRkRfQVNTRVJUIChsaW5lc3ogPT0gYmZkX2NvZmZfbGluZXN6IChvdXRwdXRfYmZkKSk7Ci0KLSAgbl90bWFzayA9IGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfbl90bWFzazsKLSAgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fYnRzaGZ0OwotCi0gIC8qIERlZmluZSBtYWNyb3Mgc28gdGhhdCBJU0ZDTiwgZXQuIGFsLiwgbWFjcm9zIHdvcmsgY29ycmVjdGx5LiAgKi8KLSNkZWZpbmUgTl9UTUFTSyBuX3RtYXNrCi0jZGVmaW5lIE5fQlRTSEZUIG5fYnRzaGZ0Ci0KLSAgY29weSA9IGZhbHNlOwotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgY29weSA9IHRydWU7Ci0gIGhhc2ggPSB0cnVlOwotICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICBoYXNoID0gZmFsc2U7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgc3ltX2hhc2ggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgY3NlY3RwcCA9IHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0czsKLSAgZGVidWdfaW5kZXggPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmRpY2VzOwotICBpc3ltcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIG91dHB1dF9pbmRleCA9IHN5bWVudF9iYXNlOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLSAgaW5jbHMgPSAwOwotICBvbGluZSA9IE5VTEw7Ci0KLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotICAgICAgaW50IHNtdHlwID0gMDsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJvb2xlYW4gcmVxdWlyZTsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIChQVFIpIGlzeW1wKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIENfRVhUIG9yIENfSElERVhUIHN5bWJvbCwgd2UgbmVlZCB0aGUgY3NlY3QKLSAgICAgICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19FWFQgfHwgaXN5bXAtPm5fc2NsYXNzID09IENfSElERVhUKQotCXsKLQkgIEJGRF9BU1NFUlQgKGlzeW1wLT5uX251bWF1eCA+IDApOwotCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwKLQkJCQkoUFRSKSAoZXN5bSArIGlzeW1lc3ogKiBpc3ltcC0+bl9udW1hdXgpLAotCQkJCWlzeW1wLT5uX3R5cGUsIGlzeW1wLT5uX3NjbGFzcywKLQkJCQlpc3ltcC0+bl9udW1hdXggLSAxLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJKFBUUikgJmF1eCk7Ci0JICBzbXR5cCA9IFNNVFlQX1NNVFlQIChhdXgueF9jc2VjdC54X3NtdHlwKTsKLQl9Ci0KLSAgICAgIC8qIE1ha2UgYSBjb3B5IG9mICppc3ltcCBzbyB0aGF0IHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uCi0JIGFsd2F5cyBzZWVzIHRoZSBvcmlnaW5hbCB2YWx1ZXMuICBUaGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbgotCSBhbHdheXMgcmVjb21wdXRpbmcgdGhlIHN5bWJvbCB2YWx1ZSBldmVuIGlmIHdlIGFyZSBzdHJpcHBpbmcKLQkgdGhlIHN5bWJvbC4gICovCi0gICAgICBpc3ltID0gKmlzeW1wOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLCBzd2FwIG91dCB0aGUKLSAgICAgICAgIC5sb2FkZXIgc3ltYm9sIGluZm9ybWF0aW9uLiAgSWYgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wKLSAgICAgICAgIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc3ltYm9sLCB0aG91Z2gsIHRoZW4gd2FpdCB1bnRpbCB3ZSBnZXQKLSAgICAgICAgIHRvIHRoZSBkZWZpbml0aW9uLiAgKi8KLSAgICAgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAmJiAqc3ltX2hhc2ggIT0gTlVMTAotCSAgJiYgKCpzeW1faGFzaCktPmxkc3ltICE9IE5VTEwKLQkgICYmIChzbXR5cCAhPSBYVFlfRVIKLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKSkKLQl7Ci0JICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKLQotCSAgaCA9ICpzeW1faGFzaDsKLQkgIGxkc3ltID0gaC0+bGRzeW07Ci0JICBpZiAoaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgewotCSAgICAgIGxkc3ltLT5sX3NjbnVtID0gKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgICBsZHN5bS0+bF92YWx1ZSA9IChpc3ltLm5fdmFsdWUKLQkJCQkrICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrICgqY3NlY3RwcCktPm91dHB1dF9vZmZzZXQKLQkJCQktICgqY3NlY3RwcCktPnZtYSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxkc3ltLT5sX3NjbnVtID0gaXN5bS5uX3NjbnVtOwotCSAgICAgIGxkc3ltLT5sX3ZhbHVlID0gaXN5bS5uX3ZhbHVlOwotCSAgICB9Ci0KLQkgIGxkc3ltLT5sX3NtdHlwZSA9IHNtdHlwOwotCSAgaWYgKCgoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMAotCSAgICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKLQkgICAgICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDApCi0JICAgIGxkc3ltLT5sX3NtdHlwZSB8PSBMX0lNUE9SVDsKLQkgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpICE9IDAKLQkgICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICAgICAgfHwgKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSAhPSAwKQotCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9FWFBPUlQ7Ci0JICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRU5UUlkpICE9IDApCi0JICAgIGxkc3ltLT5sX3NtdHlwZSB8PSBMX0VOVFJZOwotCi0JICBsZHN5bS0+bF9zbWNsYXMgPSBhdXgueF9jc2VjdC54X3NtY2xhczsKLQotCSAgaWYgKGxkc3ltLT5sX2lmaWxlID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkgICAgbGRzeW0tPmxfaWZpbGUgPSAwOwotCSAgZWxzZSBpZiAobGRzeW0tPmxfaWZpbGUgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICgobGRzeW0tPmxfc210eXBlICYgTF9JTVBPUlQpID09IDApCi0JCWxkc3ltLT5sX2lmaWxlID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmQgKmltcGJmZDsKLQotCQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICBpbXBiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkgICAgaW1wYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JCSAgZWxzZQotCQkgICAgaW1wYmZkID0gTlVMTDsKLQotCQkgIGlmIChpbXBiZmQgPT0gTlVMTCkKLQkJICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGltcGJmZC0+eHZlYyA9PSBmaW5mby0+b3V0cHV0X2JmZC0+eHZlYyk7Ci0JCSAgICAgIGxkc3ltLT5sX2lmaWxlID0geGNvZmZfZGF0YSAoaW1wYmZkKS0+aW1wb3J0X2ZpbGVfaWQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBsZHN5bS0+bF9wYXJtID0gMDsKLQotCSAgQkZEX0FTU0VSVCAoaC0+bGRpbmR4ID49IDApOwotCSAgQkZEX0FTU0VSVCAoTERTWU1TWiA9PSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9sZHN5bSkpOwotCSAgeGNvZmZfc3dhcF9sZHN5bV9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCBsZHN5bSwKLQkJCQlmaW5mby0+bGRzeW0gKyBoLT5sZGluZHggLSAzKTsKLQkgIGgtPmxkc3ltID0gTlVMTDsKLQotCSAgLyogRmlsbCBpbiBzbmVudHJ5IG5vdyB0aGF0IHdlIGtub3cgdGhlIHRhcmdldF9pbmRleC4gICovCi0JICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRU5UUlkpICE9IDAKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCSAgICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+c25lbnRyeSA9Ci0JICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCX0KLQotICAgICAgKmluZGV4cCA9IC0xOwotCi0gICAgICBza2lwID0gZmFsc2U7Ci0gICAgICByZXF1aXJlID0gZmFsc2U7Ci0gICAgICBhZGQgPSAxICsgaXN5bS5uX251bWF1eDsKLQotICAgICAgLyogSWYgd2UgYXJlIHNraXBwaW5nIHRoaXMgY3NlY3QsIHdlIHdhbnQgdG8gc2tpcCB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAoKmNzZWN0cHAgPT0gTlVMTCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2UgZ2FyYmFnZSBjb2xsZWN0ZWQgdGhpcyBjc2VjdCwgd2Ugd2FudCB0byBza2lwIHRoaXMKLSAgICAgICAgIHN5bWJvbC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiB4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmdjCi0JICAmJiAoKCpjc2VjdHBwKS0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMAotCSAgJiYgKmNzZWN0cHAgIT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogQW4gWENPRkYgbGlua2VyIGFsd2F5cyBza2lwcyBDX1NUQVQgc3ltYm9scy4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBpc3ltcC0+bl9zY2xhc3MgPT0gQ19TVEFUKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBXZSBza2lwIGFsbCBidXQgdGhlIGZpcnN0IFRPQyBhbmNob3IuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfSElERVhUCi0JICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMwKQotCXsKLQkgIGlmIChmaW5mby0+dG9jX3N5bWluZHggIT0gLTEpCi0JICAgIHNraXAgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB0b2N2YWwsIHRvY2VuZDsKLQotCSAgICAgIHRvY3ZhbCA9ICgoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrICgqY3NlY3RwcCktPm91dHB1dF9vZmZzZXQKLQkJCSsgaXN5bS5uX3ZhbHVlCi0JCQktICgqY3NlY3RwcCktPnZtYSk7Ci0JICAgICAgLyogV2Ugd2FudCB0byBmaW5kIG91dCBpZiB0b2N2YWwgaXMgYSBnb29kIHZhbHVlIHRvIHVzZQotICAgICAgICAgICAgICAgICBhcyB0aGUgVE9DIGFuY2hvci0tdGhhdCBpcywgd2hldGhlciB3ZSBjYW4gYWNjZXNzIGFsbAotICAgICAgICAgICAgICAgICBvZiB0aGUgVE9DIHVzaW5nIGEgMTYgYml0IG9mZnNldCBmcm9tIHRvY3ZhbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgdGVzdCBhc3N1bWVzIHRoYXQgdGhlIFRPQyBjb21lcyBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAgICAgICAgICAgICBvdXRwdXQgc2VjdGlvbiwgYXMgaXQgZG9lcyBpbiB0aGUgZGVmYXVsdCBsaW5rZXIKLSAgICAgICAgICAgICAgICAgc2NyaXB0LiAgRklYTUU6IFRoaXMgZG9lc24ndCBoYW5kbGUgLnRvY2JzcyBzZWN0aW9ucwotICAgICAgICAgICAgICAgICBjcmVhdGVkIGZyb20gWE1DX1REIGNvbW1vbiBzeW1ib2xzIGNvcnJlY3RseS4gICovCi0KLQkgICAgICB0b2NlbmQgPSAoKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIGlmICh0b2N2YWwgKyAweDEwMDAwIDwgdG9jZW5kKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiVE9DIG92ZXJmbG93OiAweCVseCA+IDB4MTAwMDA7IHRyeSAtbW1pbmltYWwtdG9jIHdoZW4gY29tcGlsaW5nIiksCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpICh0b2NlbmQgLSB0b2N2YWwpKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmICh0b2N2YWwgKyAweDgwMDAgPCB0b2NlbmQpCi0JCXsKLQkJICBiZmRfdm1hIHRvY2FkZDsKLQotCQkgIHRvY2FkZCA9IHRvY2VuZCAtICh0b2N2YWwgKyAweDgwMDApOwotCQkgIHRvY3ZhbCArPSB0b2NhZGQ7Ci0JCSAgaXN5bS5uX3ZhbHVlICs9IHRvY2FkZDsKLQkJfQotCi0JICAgICAgZmluZm8tPnRvY19zeW1pbmR4ID0gb3V0cHV0X2luZGV4OwotCSAgICAgIHhjb2ZmX2RhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKS0+dG9jID0gdG9jdmFsOwotCSAgICAgIHhjb2ZmX2RhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKS0+c250b2MgPQotCQkoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgICAgIHJlcXVpcmUgPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgc3RyaXBwaW5nIGFsbCBzeW1ib2xzLCB3ZSB3YW50IHRvIHNraXAgdGhpcyBvbmUuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogV2UgY2FuIHNraXAgcmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAmJiBzbXR5cCA9PSBYVFlfRVIKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIFdlIGNhbiBza2lwIGNvbW1vbiBzeW1ib2xzIGlmIHRoZXkgZ290IGRlZmluZWQgc29tZXdoZXJlCi0gICAgICAgICBlbHNlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkgICYmIHNtdHlwID09IFhUWV9DTQotCSAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+c2VjdGlvbiAhPSAqY3NlY3RwcCkKLQkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gIT0gKmNzZWN0cHApKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBTa2lwIGxvY2FsIHN5bWJvbHMgaWYgd2UgYXJlIGRpc2NhcmRpbmcgdGhlbS4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbAotCSAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgJiYgKGlzeW0ubl9zY2xhc3MgIT0gQ19ISURFWFQKLQkgICAgICB8fCBzbXR5cCAhPSBYVFlfU0QpKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBJZiB3ZSBzdHJpcHBpbmcgZGVidWdnaW5nIHN5bWJvbHMsIGFuZCB0aGlzIGlzIGEgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2wsIHRoZW4gc2tpcCBpdC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIKLQkgICYmIGlzeW0ubl9zY251bSA9PSBOX0RFQlVHKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBJZiBzb21lIHN5bWJvbHMgYXJlIHN0cmlwcGVkIGJhc2VkIG9uIHRoZSBuYW1lLCB3b3JrIG91dCB0aGUKLQkgbmFtZSBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gc2tpcCB0aGlzIHN5bWJvbC4gIFdlIGRvbid0IGhhbmRsZQotCSB0aGlzIGNvcnJlY3RseSBmb3Igc3ltYm9scyB3aG9zZSBuYW1lcyBhcmUgaW4gdGhlIC5kZWJ1ZwotCSBzZWN0aW9uOyB0byBnZXQgaXQgcmlnaHQgd2Ugd291bGQgbmVlZCBhIG5ldyBiZmRfc3RydGFiX2hhc2gKLQkgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBzdHJpbmcgZ2l2ZW4gdGhlIGluZGV4LiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbCkKLQkgICYmIChkZWJ1Z19pbmRleCA9PSBOVUxMIHx8ICpkZWJ1Z19pbmRleCA9PSAodW5zaWduZWQgbG9uZykgLTEpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLAotCQkJCSAgICBmYWxzZSkgPT0gTlVMTCkpCi0JICAgICAgfHwgKGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbAotCQkgICYmIChpc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JCSAgICAgICYmIChpc3ltLm5fc2NsYXNzICE9IENfSElERVhUCi0JCQkgIHx8IHNtdHlwICE9IFhUWV9TRCkpCi0JCSAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpKQotCSAgICBza2lwID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGNhbiBub3Qgc2tpcCB0aGUgZmlyc3QgVE9DIGFuY2hvci4gICovCi0gICAgICBpZiAoc2tpcAotCSAgJiYgcmVxdWlyZQotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQlza2lwID0gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIG5vdyBrbm93IHdoZXRoZXIgd2UgYXJlIHRvIHNraXAgdGhpcyBzeW1ib2wgb3Igbm90LiAgKi8KLSAgICAgIGlmICghIHNraXApCi0JewotCSAgLyogQWRqdXN0IHRoZSBzeW1ib2wgaW4gb3JkZXIgdG8gb3V0cHV0IGl0LiAgKi8KLQotCSAgaWYgKGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPT0gMAotCSAgICAgICYmIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIGxvbmcgbmFtZS4gIEVudGVyIGl0IGluIHRoZSBzdHJpbmcKLQkJIHRhYmxlIHdlIGFyZSBidWlsZGluZy4gIElmICpkZWJ1Z19pbmRleCAhPSAtMSwgdGhlCi0JCSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZW50ZXJlZCBpbiB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChkZWJ1Z19pbmRleCAhPSBOVUxMICYmICpkZWJ1Z19pbmRleCAhPSAodW5zaWduZWQgbG9uZykgLTEpCi0JCWlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSAqZGVidWdfaW5kZXg7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLAotCQkJCQkJCSAoY2hhciAqKSBOVUxMKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIG5hbWUsIGhhc2gsIGNvcHkpOwotCQkgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaXN5bS5uX3NjbGFzcyAhPSBDX0JTVEFUCi0JICAgICAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX0VTVEFUCi0JICAgICAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX0RFQ0wKLQkgICAgICAmJiBpc3ltLm5fc2NudW0gPiAwKQotCSAgICB7Ci0JICAgICAgaXN5bS5uX3NjbnVtID0gKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgICBpc3ltLm5fdmFsdWUgKz0gKCgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArICgqY3NlY3RwcCktPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICAtICgqY3NlY3RwcCktPnZtYSk7Ci0JICAgIH0KLQotCSAgLyogVGhlIHZhbHVlIG9mIGEgQ19GSUxFIHN5bWJvbCBpcyB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZQotCSAgICAgbmV4dCBDX0ZJTEUgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wKLQkgICAgIGlzIC0xLiAgV2UgdHJ5IHRvIGdldCB0aGlzIHJpZ2h0LCBiZWxvdywganVzdCBiZWZvcmUgd2UKLQkgICAgIHdyaXRlIHRoZSBzeW1ib2xzIG91dCwgYnV0IGluIHRoZSBnZW5lcmFsIGNhc2Ugd2UgbWF5Ci0JICAgICBoYXZlIHRvIHdyaXRlIHRoZSBzeW1ib2wgb3V0IHR3aWNlLiAgKi8KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRklMRSkKLQkgICAgewotCSAgICAgIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0JCSAgJiYgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlICE9IChsb25nKSBvdXRwdXRfaW5kZXgpCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNvcnJlY3QgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBlbnRyeS4gICovCi0JCSAgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlID0gb3V0cHV0X2luZGV4OwotCQkgIGlmICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBpbiB0aGlzIGlucHV0IGZpbGUuICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkJCSAgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCQkgICAgKyAoKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXgKLQkJCQkJCQktIHN5bWVudF9iYXNlKQotCQkJCQkJICAgICAgICogb3N5bWVzeikpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUgbGFzdCBDX0ZJTEUKLQkJCSBzeW1ib2wuICBXZSBuZWVkIHRvIHdyaXRlIGl0IG91dCBhZ2Fpbi4gIFdlCi0JCQkgYm9ycm93ICpvdXRzeW0gdGVtcG9yYXJpbHkuICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLQkJICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJCSAgICAgKyBmaW5mby0+bGFzdF9maWxlX2luZGV4ICogb3N5bWVzeiksCi0JCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCQkgIHx8IChiZmRfd3JpdGUgKG91dHN5bSwgb3N5bWVzeiwgMSwgb3V0cHV0X2JmZCkKLQkJCSAgICAgICE9IG9zeW1lc3opKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmaW5mby0+bGFzdF9maWxlX2luZGV4ID0gb3V0cHV0X2luZGV4OwotCSAgICAgIGZpbmZvLT5sYXN0X2ZpbGUgPSBpc3ltOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB2YWx1ZSBvZiBhIENfQklOQ0wgb3IgQ19FSU5DTCBzeW1ib2wgaXMgYSBmaWxlIG9mZnNldAotICAgICAgICAgICAgIGludG8gdGhlIGxpbmUgbnVtYmVycy4gIFdlIHVwZGF0ZSB0aGUgc3ltYm9sIHZhbHVlcyB3aGVuCi0gICAgICAgICAgICAgd2UgaGFuZGxlIHRoZSBsaW5lIG51bWJlcnMuICAqLwotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19CSU5DTAotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19FSU5DTCkKLQkgICAgewotCSAgICAgIGlzeW0ubl92YWx1ZSA9IGZpbmZvLT5saW5lX2ZpbGVwb3M7Ci0JICAgICAgKytpbmNsczsKLQkgICAgfQotCi0JICAvKiBPdXRwdXQgdGhlIHN5bWJvbC4gICovCi0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIG91dHN5bSk7Ci0KLQkgICppbmRleHAgPSBvdXRwdXRfaW5kZXg7Ci0KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRVhUKQotCSAgICB7Ci0JICAgICAgbG9uZyBpbmR4OwotCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpbmR4ID0gKChlc3ltIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCi0JCSAgICAgIC8gaXN5bWVzeik7Ci0JICAgICAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZHhdOwotCSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICAgICAgaC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgfQotCi0JICAvKiBJZiB0aGlzIGlzIGEgc3ltYm9sIGluIHRoZSBUT0Mgd2hpY2ggd2UgbWF5IGhhdmUgbWVyZ2VkCi0gICAgICAgICAgICAgKGNsYXNzIFhNQ19UQyksIHJlbWVtYmVyIHRoZSBzeW1ib2wgaW5kZXggb2YgdGhlIFRPQwotICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0hJREVYVAotCSAgICAgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzID09IFhNQ19UQwotCSAgICAgICYmICpzeW1faGFzaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoKCgqc3ltX2hhc2gpLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpID09IDApOwotCSAgICAgIEJGRF9BU1NFUlQgKCgqc3ltX2hhc2gpLT50b2Nfc2VjdGlvbiAhPSBOVUxMKTsKLQkgICAgICAoKnN5bV9oYXNoKS0+dS50b2NfaW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgfQotCi0JICBvdXRwdXRfaW5kZXggKz0gYWRkOwotCSAgb3V0c3ltICs9IGFkZCAqIG9zeW1lc3o7Ci0JfQotCi0gICAgICBlc3ltICs9IGFkZCAqIGlzeW1lc3o7Ci0gICAgICBpc3ltcCArPSBhZGQ7Ci0gICAgICBjc2VjdHBwICs9IGFkZDsKLSAgICAgIHN5bV9oYXNoICs9IGFkZDsKLSAgICAgIGlmIChkZWJ1Z19pbmRleCAhPSBOVUxMKQotCWRlYnVnX2luZGV4ICs9IGFkZDsKLSAgICAgICsraW5kZXhwOwotICAgICAgZm9yICgtLWFkZDsgYWRkID4gMDsgLS1hZGQpCi0JKmluZGV4cCsrID0gLTE7Ci0gICAgfQotCi0gIC8qIEZpeCB1cCB0aGUgYXV4IGVudHJpZXMgYW5kIHRoZSBDX0JTVEFUIHN5bWJvbHMuICBUaGlzIG11c3QgYmUKLSAgICAgZG9uZSBpbiBhIHNlcGFyYXRlIHBhc3MsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29ycmVjdCBzeW1ib2wKLSAgICAgaW5kaWNlcyB1bnRpbCB3ZSBoYXZlIGFscmVhZHkgZGVjaWRlZCB3aGljaCBzeW1ib2xzIHdlIGFyZSBnb2luZwotICAgICB0byBrZWVwLiAgKi8KLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBjc2VjdHBwID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICBhZGQgPSAxICsgaXN5bXAtPm5fbnVtYXV4OwotCi0gICAgICBpZiAoKmluZGV4cCA8IDApCi0JZXN5bSArPSBhZGQgKiBpc3ltZXN6OwotICAgICAgZWxzZQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoaXN5bXAtPm5fc2NsYXNzID09IENfQlNUQVQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0JICAgICAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JICAgICAgLyogVGhlIHZhbHVlIG9mIGEgQ19CU1RBVCBzeW1ib2wgaXMgdGhlIHN5bWJvbCB0YWJsZQotICAgICAgICAgICAgICAgICBpbmRleCBvZiB0aGUgY29udGFpbmluZyBjc2VjdC4gICovCi0JICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKG91dHB1dF9iZmQsIChQVFIpIG91dHN5bSwgKFBUUikgJmlzeW0pOwotCSAgICAgIGluZHggPSBpc3ltLm5fdmFsdWU7Ci0JICAgICAgaWYgKGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJewotCQkgIGxvbmcgc3ltaW5keDsKLQotCQkgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCSAgaWYgKHN5bWluZHggPCAwKQotCQkgICAgaXN5bS5uX3ZhbHVlID0gMDsKLQkJICBlbHNlCi0JCSAgICBpc3ltLm5fdmFsdWUgPSBzeW1pbmR4OwotCQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sCi0JCQkJCSAoUFRSKSBvdXRzeW0pOwotCQl9Ci0JICAgIH0KLQotCSAgZXN5bSArPSBpc3ltZXN6OwotCSAgb3V0c3ltICs9IG9zeW1lc3o7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBpc3ltcC0+bl9udW1hdXggJiYgZXN5bSA8IGVzeW1fZW5kOyBpKyspCi0JICAgIHsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgaXN5bXAtPm5fdHlwZSwKLQkJCQkgICAgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJICAgIChQVFIpICZhdXgpOwotCi0JICAgICAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCXsKLQkJICAvKiBUaGlzIGlzIHRoZSBmaWxlIG5hbWUgKG9yIHNvbWUgY29tbWVudCBwdXQgaW4gYnkKLQkJICAgICB0aGUgY29tcGlsZXIpLiAgSWYgaXQgaXMgbG9uZywgd2UgbXVzdCBwdXQgaXQgaW4KLQkJICAgICB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkJICBpZiAoYXV4LnhfZmlsZS54X24ueF96ZXJvZXMgPT0gMAotCQkgICAgICAmJiBhdXgueF9maWxlLnhfbi54X29mZnNldCAhPSAwKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JCSAgICAgIEJGRF9BU1NFUlQgKGF1eC54X2ZpbGUueF9uLnhfb2Zmc2V0Ci0JCQkJICA+PSBTVFJJTkdfU0laRV9TSVpFKTsKLQkJICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkJCXsKLQkJCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoaW5wdXRfYmZkKTsKLQkJCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGZpbGVuYW1lID0gc3RyaW5ncyArIGF1eC54X2ZpbGUueF9uLnhfb2Zmc2V0OwotCQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBmaWxlbmFtZSwKLQkJCQkJCSBoYXNoLCBjb3B5KTsKLQkJICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBhdXgueF9maWxlLnhfbi54X29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0VYVAotCQkJfHwgaXN5bXAtPm5fc2NsYXNzID09IENfSElERVhUKQotCQkgICAgICAgJiYgaSArIDEgPT0gaXN5bXAtPm5fbnVtYXV4KQotCQl7Ci0JCSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCB0eXBlIGNoZWNraW5nLiAgSSBkb24ndCBrbm93IGlmCi0gICAgICAgICAgICAgICAgICAgICBhbnlib2R5IGRvZXMuICAqLwotCQkgIGF1eC54X2NzZWN0LnhfcGFybWhhc2ggPSAwOwotCQkgIC8qIEkgZG9uJ3QgdGhpbmsgYW55Ym9keSB1c2VzIHRoZXNlIGZpZWxkcywgYnV0IHdlJ2QKLSAgICAgICAgICAgICAgICAgICAgIGJldHRlciBjbG9iYmVyIHRoZW0ganVzdCBpbiBjYXNlLiAgKi8KLQkJICBhdXgueF9jc2VjdC54X3N0YWIgPSAwOwotCQkgIGF1eC54X2NzZWN0Lnhfc25zdGFiID0gMDsKLQkJICBpZiAoU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApID09IFhUWV9MRCkKLQkJICAgIHsKLQkJICAgICAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JCSAgICAgIGluZHggPSBhdXgueF9jc2VjdC54X3Njbmxlbi5sOwotCQkgICAgICBpZiAoaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJewotCQkJICBsb25nIHN5bWluZHg7Ci0KLQkJCSAgc3ltaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJCSAgaWYgKHN5bWluZHggPCAwKQotCQkJICAgIGF1eC54X3N5bS54X3RhZ25keC5sID0gMDsKLQkJCSAgZWxzZQotCQkJICAgIGF1eC54X3N5bS54X3RhZ25keC5sID0gc3ltaW5keDsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGlzeW1wLT5uX3NjbGFzcyAhPSBDX1NUQVQgfHwgaXN5bXAtPm5fdHlwZSAhPSBUX05VTEwpCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGluZHg7Ci0KLQkJICBpZiAoSVNGQ04gKGlzeW1wLT5uX3R5cGUpCi0JCSAgICAgIHx8IElTVEFHIChpc3ltcC0+bl9zY2xhc3MpCi0JCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JMT0NLCi0JCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZDTikKLQkJICAgIHsKLQkJICAgICAgaW5keCA9IGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCQkgICAgICBpZiAoaW5keCA+IDAKLQkJCSAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJewotCQkJICAvKiBXZSBsb29rIGZvcndhcmQgdGhyb3VnaCB0aGUgc3ltYm9sIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3ltYm9sIHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmNsdWRlLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlbHkgcmlnaHQuICAqLwotCQkJICB3aGlsZSAoZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdIDwgMAotCQkJCSAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQkgICAgKytpbmR4OwotCQkJICBpZiAoaW5keCA+PSBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCSAgICBpbmR4ID0gb3V0cHV0X2luZGV4OwotCQkJICBlbHNlCi0JCQkgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJCSAgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBpbmR4OwotCQkJfQotCQkgICAgfQotCi0JCSAgaW5keCA9IGF1eC54X3N5bS54X3RhZ25keC5sOwotCQkgIGlmIChpbmR4ID4gMCAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgc3ltaW5keDsKLQotCQkgICAgICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgICAgICBpZiAoc3ltaW5keCA8IDApCi0JCQlhdXgueF9zeW0ueF90YWduZHgubCA9IDA7Ci0JCSAgICAgIGVsc2UKLQkJCWF1eC54X3N5bS54X3RhZ25keC5sID0gc3ltaW5keDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ29weSBvdmVyIHRoZSBsaW5lIG51bWJlcnMsIHVubGVzcyB3ZSBhcmUgc3RyaXBwaW5nCi0JCSB0aGVtLiAgV2UgZG8gdGhpcyBvbiBhIHN5bWJvbCBieSBzeW1ib2wgYmFzaXMgaW4KLQkJIG9yZGVyIHRvIG1vcmUgZWFzaWx5IGhhbmRsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotCSAgICAgIGlmICgoaXN5bXAtPm5fc2NsYXNzID09IENfRVhUCi0JCSAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQkJICAmJiBpID09IDAKLQkJICAmJiBpc3ltcC0+bl9udW1hdXggPiAxCi0JCSAgJiYgSVNGQ04gKGlzeW1wLT5uX3R5cGUpCi0JCSAgJiYgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciAhPSAwKQotCQl7Ci0JCSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9ub25lCi0JCSAgICAgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9zb21lKQotCQkgICAgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9IDA7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotCQkgICAgICB1bnNpZ25lZCBpbnQgZW5jX2NvdW50OwotCQkgICAgICBiZmRfc2l6ZV90eXBlIGxpbm9mZjsKLQkJICAgICAgc3RydWN0IGludGVybmFsX2xpbmVubyBsaW47Ci0KLQkJICAgICAgbyA9ICpjc2VjdHBwOwotCQkgICAgICBlbmNsb3NpbmcgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5lbmNsb3Npbmc7Ci0JCSAgICAgIGVuY19jb3VudCA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmxpbmVub19jb3VudDsKLQkJICAgICAgaWYgKG9saW5lICE9IGVuY2xvc2luZykKLQkJCXsKLQkJCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsCi0JCQkJCWVuY2xvc2luZy0+bGluZV9maWxlcG9zLAotCQkJCQlTRUVLX1NFVCkgIT0gMAotCQkJICAgICAgfHwgKGJmZF9yZWFkIChmaW5mby0+bGluZW5vcywgbGluZXN6LAotCQkJCQkgICAgZW5jX2NvdW50LCBpbnB1dF9iZmQpCi0JCQkJICAhPSBsaW5lc3ogKiBlbmNfY291bnQpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgb2xpbmUgPSBlbmNsb3Npbmc7Ci0JCQl9Ci0KLQkJICAgICAgbGlub2ZmID0gKGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIKLQkJCQktIGVuY2xvc2luZy0+bGluZV9maWxlcG9zKTsKLQotCQkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19pbiAoaW5wdXRfYmZkLAotCQkJCQkgICAgICAgKFBUUikgKGZpbmZvLT5saW5lbm9zICsgbGlub2ZmKSwKLQkJCQkJICAgICAgIChQVFIpICZsaW4pOwotCQkgICAgICBpZiAobGluLmxfbG5ubyAhPSAwCi0JCQkgIHx8ICgoYmZkX3NpemVfdHlwZSkgbGluLmxfYWRkci5sX3N5bW5keAotCQkJICAgICAgIT0gKChlc3ltCi0JCQkJICAgLSBpc3ltZXN6Ci0JCQkJICAgLSAoKGJmZF9ieXRlICopCi0JCQkJICAgICAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkpCi0JCQkJICAvIGlzeW1lc3opKSkKLQkJCWF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSAwOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9ieXRlICpsaW5wZW5kLCAqbGlucDsKLQkJCSAgYmZkX3ZtYSBvZmZzZXQ7Ci0JCQkgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0KLQkJCSAgbGluLmxfYWRkci5sX3N5bW5keCA9ICppbmRleHA7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmxpbiwKLQkJCQkJCSAgICAoUFRSKSAoZmluZm8tPmxpbmVub3MKLQkJCQkJCQkgICArIGxpbm9mZikpOwotCi0JCQkgIGxpbnBlbmQgPSAoZmluZm8tPmxpbmVub3MKLQkJCQkgICAgICsgZW5jX2NvdW50ICogbGluZXN6KTsKLQkJCSAgb2Zmc2V0ID0gKG8tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgKyBvLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgIC0gby0+dm1hKTsKLQkJCSAgZm9yIChsaW5wID0gZmluZm8tPmxpbmVub3MgKyBsaW5vZmYgKyBsaW5lc3o7Ci0JCQkgICAgICAgbGlucCA8IGxpbnBlbmQ7Ci0JCQkgICAgICAgbGlucCArPSBsaW5lc3opCi0JCQkgICAgewotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwgKFBUUikgbGlucCwKLQkJCQkJCSAgICAgICAoUFRSKSAmbGluKTsKLQkJCSAgICAgIGlmIChsaW4ubF9sbm5vID09IDApCi0JCQkJYnJlYWs7Ci0JCQkgICAgICBsaW4ubF9hZGRyLmxfcGFkZHIgKz0gb2Zmc2V0OwotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkJCShQVFIpICZsaW4sCi0JCQkJCQkJKFBUUikgbGlucCk7Ci0JCQkgICAgfQotCi0JCQkgIGNvdW50ID0gKGxpbnAgLSAoZmluZm8tPmxpbmVub3MgKyBsaW5vZmYpKSAvIGxpbmVzejsKLQotCQkJICBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0KLQkJCSAgICAoby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVfZmlsZXBvcwotCQkJICAgICArIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKiBsaW5lc3opOwotCi0JCQkgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkJYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwKLQkJCQkJU0VFS19TRVQpICE9IDAKLQkJCSAgICAgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5saW5lbm9zICsgbGlub2ZmLAotCQkJCQkgICAgIGxpbmVzeiwgY291bnQsIG91dHB1dF9iZmQpCi0JCQkJICAhPSBsaW5lc3ogKiBjb3VudCkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKz0gY291bnQ7Ci0KLQkJCSAgaWYgKGluY2xzID4gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppaXNwLCAqaWlzcGVuZDsKLQkJCSAgICAgIGxvbmcgKmlpbmRwOwotCQkJICAgICAgYmZkX2J5dGUgKm9vczsKLQkJCSAgICAgIGludCBpaWFkZDsKLQotCQkJICAgICAgLyogVXBkYXRlIGFueSBDX0JJTkNMIG9yIENfRUlOQ0wgc3ltYm9scwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCByZWZlciB0byBhIGxpbmUgbnVtYmVyIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Ugd2UganVzdCBvdXRwdXQuICAqLwotCQkJICAgICAgaWlzcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotCQkJICAgICAgaWlzcGVuZCA9IChpaXNwCi0JCQkJCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKTsKLQkJCSAgICAgIGlpbmRwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotCQkJICAgICAgb29zID0gZmluZm8tPm91dHN5bXM7Ci0JCQkgICAgICB3aGlsZSAoaWlzcCA8IGlpc3BlbmQpCi0JCQkJewotCQkJCSAgaWYgKCppaW5kcCA+PSAwCi0JCQkJICAgICAgJiYgKGlpc3AtPm5fc2NsYXNzID09IENfQklOQ0wKLQkJCQkJICB8fCBpaXNwLT5uX3NjbGFzcyA9PSBDX0VJTkNMKQotCQkJCSAgICAgICYmICgoYmZkX3NpemVfdHlwZSkgaWlzcC0+bl92YWx1ZQotCQkJCQkgID49IGVuY2xvc2luZy0+bGluZV9maWxlcG9zICsgbGlub2ZmKQotCQkJCSAgICAgICYmICgoYmZkX3NpemVfdHlwZSkgaWlzcC0+bl92YWx1ZQotCQkJCQkgIDwgKGVuY2xvc2luZy0+bGluZV9maWxlcG9zCi0JCQkJCSAgICAgKyBlbmNfY291bnQgKiBsaW5lc3opKSkKLQkJCQkgICAgewotCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaWlzOwotCi0JCQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKG91dHB1dF9iZmQsCi0JCQkJCQkJICAgIChQVFIpIG9vcywKLQkJCQkJCQkgICAgKFBUUikgJmlpcyk7Ci0JCQkJICAgICAgaWlzLm5fdmFsdWUgPQotCQkJCQkoaWlzcC0+bl92YWx1ZQotCQkJCQkgLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcwotCQkJCQkgLSBsaW5vZmYKLQkJCQkJICsgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cik7Ci0JCQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAgKFBUUikgJmlpcywKLQkJCQkJCQkgICAgIChQVFIpIG9vcyk7Ci0JCQkJICAgICAgLS1pbmNsczsKLQkJCQkgICAgfQotCi0JCQkJICBpaWFkZCA9IDEgKyBpaXNwLT5uX251bWF1eDsKLQkJCQkgIGlmICgqaWluZHAgPj0gMCkKLQkJCQkgICAgb29zICs9IGlpYWRkICogb3N5bWVzejsKLQkJCQkgIGlpc3AgKz0gaWlhZGQ7Ci0JCQkJICBpaW5kcCArPSBpaWFkZDsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZhdXgsIGlzeW1wLT5uX3R5cGUsCi0JCQkJICAgICBpc3ltcC0+bl9zY2xhc3MsIGksIGlzeW1wLT5uX251bWF1eCwKLQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JICAgICAgb3V0c3ltICs9IG9zeW1lc3o7Ci0JICAgICAgZXN5bSArPSBpc3ltZXN6OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmRleHAgKz0gYWRkOwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgY3NlY3RwcCArPSBhZGQ7Ci0gICAgfQotCi0gIC8qIElmIHdlIHN3YXBwZWQgb3V0IGEgQ19GSUxFIHN5bWJvbCwgZ3Vlc3MgdGhhdCB0aGUgbmV4dCBDX0ZJTEUKLSAgICAgc3ltYm9sIHdpbGwgYmUgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgbmV4dCBpbnB1dCBmaWxlLiAgSW4gdGhlCi0gICAgIG5vcm1hbCBjYXNlLCB0aGlzIHdpbGwgc2F2ZSB1cyBmcm9tIHdyaXRpbmcgb3V0IHRoZSBDX0ZJTEUgc3ltYm9sCi0gICAgIGFnYWluLiAgKi8KLSAgaWYgKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmIChiZmRfc2l6ZV90eXBlKSBmaW5mby0+bGFzdF9maWxlX2luZGV4ID49IHN5bWVudF9iYXNlKQotICAgIHsKLSAgICAgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotIAkJCQkgICAgKyAoKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggLSBzeW1lbnRfYmFzZSkKLSAJCQkJICAgICAgICogb3N5bWVzeikpKTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgdGhlIG1vZGlmaWVkIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKG91dHN5bSA+IGZpbmZvLT5vdXRzeW1zKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJICAgIG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkgKyBzeW1lbnRfYmFzZSAqIG9zeW1lc3osCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLAotCQkJb3V0cHV0X2JmZCkKLQkgICAgICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBCRkRfQVNTRVJUICgob2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpCi0JCSAgICsgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIG9zeW1lc3opCi0JCSAgPT0gb3V0cHV0X2luZGV4KTsKLQotICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpID0gb3V0cHV0X2luZGV4OwotICAgIH0KLQotICAvKiBEb24ndCBsZXQgdGhlIGxpbmtlciByZWxvY2F0aW9uIHJvdXRpbmVzIGRpc2NhcmQgdGhlIHN5bWJvbHMuICAqLwotICBrZWVwX3N5bXMgPSBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCk7Ci0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoaW5wdXRfYmZkKSA9IHRydWU7Ci0KLSAgLyogUmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc2VjdGlvbi4gICovCi0gIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCi0gICAgICBpZiAoISBvLT5saW5rZXJfbWFyaykKLQl7Ci0JICAvKiBUaGlzIHNlY3Rpb24gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICB8fCBvLT5fcmF3X3NpemUgPT0gMAotCSAgfHwgKG8tPmZsYWdzICYgU0VDX0lOX01FTU9SWSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgaGF2ZSBzZXQgZmlsZXBvcyBjb3JyZWN0bHkgZm9yIHRoZSBzZWN0aW9ucyB3ZSBjcmVhdGVkIHRvCi0gICAgICAgICByZXByZXNlbnQgY3NlY3RzLCBzbyBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgc2hvdWxkIHdvcmsuICAqLwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pICE9IE5VTEwKLQkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pLT5jb250ZW50cyAhPSBOVUxMKQotCWNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgbyktPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBvLCBmaW5mby0+Y29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBvLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBjb250ZW50cyA9IGZpbmZvLT5jb250ZW50czsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgaW50IHRhcmdldF9pbmRleDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCSAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0JICBsb25nIHJfc3ltbmR4OwotCi0JICAvKiBSZWFkIGluIHRoZSByZWxvY3MuICAqLwotCSAgdGFyZ2V0X2luZGV4ID0gby0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIGludGVybmFsX3JlbG9jcyA9ICh4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkJICAgICAoaW5wdXRfYmZkLCBvLCBmYWxzZSwgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkJCSAgICAgIHRydWUsCi0JCQkgICAgICAoZmluZm8tPnNlY3Rpb25faW5mb1t0YXJnZXRfaW5kZXhdLnJlbG9jcwotCQkJICAgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIENhbGwgcHJvY2Vzc29yIHNwZWNpZmljIGNvZGUgdG8gcmVsb2NhdGUgdGhlIHNlY3Rpb24KLSAgICAgICAgICAgICBjb250ZW50cy4gICovCi0JICBpZiAoISBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJICAgaW5wdXRfYmZkLCBvLAotCQkJCQkgICBjb250ZW50cywKLQkJCQkJICAgaW50ZXJuYWxfcmVsb2NzLAotCQkJCQkgICBmaW5mby0+aW50ZXJuYWxfc3ltcywKLQkJCQkJICAgeGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBvZmZzZXQgPSBvLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgby0+b3V0cHV0X29mZnNldCAtIG8tPnZtYTsKLQkgIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSAoZmluZm8tPnNlY3Rpb25faW5mb1t0YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMKLQkJICAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyssIHJlbF9oYXNoKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0JICAgICAgYm9vbGVhbiBxdWlldDsKLQotCSAgICAgICpyZWxfaGFzaCA9IE5VTEw7Ci0KLQkgICAgICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3MgYW5kIHN5bWJvbCBpbmRleC4gICovCi0KLQkgICAgICBpcmVsLT5yX3ZhZGRyICs9IG9mZnNldDsKLQotCSAgICAgIHJfc3ltbmR4ID0gaXJlbC0+cl9zeW1uZHg7Ci0KLQkgICAgICBpZiAocl9zeW1uZHggPT0gLTEpCi0JCWggPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3Jfc3ltbmR4XTsKLQotCSAgICAgIGlmIChyX3N5bW5keCAhPSAtMSAmJiBmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCQl7Ci0JCSAgaWYgKGggIT0gTlVMTAotCQkgICAgICAmJiBoLT5zbWNsYXMgIT0gWE1DX1RECi0JCSAgICAgICYmIChpcmVsLT5yX3R5cGUgPT0gUl9UT0MKLQkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfR0wKLQkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfVENMCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX1RSTAotCQkJICB8fCBpcmVsLT5yX3R5cGUgPT0gUl9UUkxBKSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIFRPQyByZWxhdGl2ZSByZWxvYyB3aXRoIGEgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWQuICBUaGUgc3ltYm9sIHNob3VsZCBiZSB0aGUgb25lIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyByZWxvYyBpcyBmb3IuICBXZSB3YW50IHRvIG1ha2UgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jIGFnYWluc3QgdGhlIFRPQyBhZGRyZXNzIG9mIHRoZSBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbm90IHRoZSBzeW1ib2wgaXRzZWxmLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAoaC0+dG9jX3NlY3Rpb24gIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKChoLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpID09IDApOwotCQkgICAgICBpZiAoaC0+dS50b2NfaW5keCAhPSAtMSkKLQkJCWlyZWwtPnJfc3ltbmR4ID0gaC0+dS50b2NfaW5keDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoICpuOwotCQkJICBzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8gKnNpOwotCi0JCQkgIG4gPSAoKHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2ggKikKLQkJCSAgICAgICBiZmRfYWxsb2MgKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCkpKTsKLQkJCSAgaWYgKG4gPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIHNpID0gZmluZm8tPnNlY3Rpb25faW5mbyArIHRhcmdldF9pbmRleDsKLQkJCSAgbi0+bmV4dCA9IHNpLT50b2NfcmVsX2hhc2hlczsKLQkJCSAgbi0+aCA9IGg7Ci0JCQkgIG4tPnJlbCA9IGlyZWw7Ci0JCQkgIHNpLT50b2NfcmVsX2hhc2hlcyA9IG47Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gICovCi0JCSAgICAgIGlmIChoLT5pbmR4ID49IDApCi0JCQlpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogVGhpcyBzeW1ib2wgaXMgYmVpbmcgd3JpdHRlbiBhdCB0aGUgZW5kCi0JCQkgICAgIG9mIHRoZSBmaWxlLCBhbmQgd2UgZG8gbm90IHlldCBrbm93IHRoZQotCQkJICAgICBzeW1ib2wgaW5kZXguICBXZSBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZQotCQkJICAgICBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZSByZWxfaGFzaCBsaXN0LgotCQkJICAgICBXZSBzZXQgdGhlIGluZHggZmllbGQgdG8gLTIgdG8gaW5kaWNhdGUKLQkJCSAgICAgdGhhdCB0aGlzIHN5bWJvbCBtdXN0IG5vdCBiZSBzdHJpcHBlZC4gICovCi0JCQkgICpyZWxfaGFzaCA9IGg7Ci0JCQkgIGgtPmluZHggPSAtMjsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW3Jfc3ltbmR4XTsKLQotCQkgICAgICBpZiAoaW5keCA9PSAtMSkKLQkJCXsKLQkJCSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXM7Ci0KLQkJCSAgLyogUmVsb2NhdGlvbnMgYWdhaW5zdCBhIFRDMCBUT0MgYW5jaG9yIGFyZQotCQkJICAgICBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkIHRvIGJlIGFnYWluc3QKLQkJCSAgICAgdGhlIFRPQyBhbmNob3IgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJCSAgaXMgPSBmaW5mby0+aW50ZXJuYWxfc3ltcyArIHJfc3ltbmR4OwotCQkJICBpZiAoaXMtPm5fc2NsYXNzID09IENfSElERVhUCi0JCQkgICAgICAmJiBpcy0+bl9udW1hdXggPiAwKQotCQkJICAgIHsKLQkJCSAgICAgIFBUUiBhdXhwdHI7Ci0JCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0JCQkgICAgICBhdXhwdHIgPSAoKFBUUikKLQkJCQkJKCgoYmZkX2J5dGUgKikKLQkJCQkJICBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQotCQkJCQkgKyAoKHJfc3ltbmR4ICsgaXMtPm5fbnVtYXV4KQotCQkJCQkgICAgKiBpc3ltZXN6KSkpOwotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgYXV4cHRyLAotCQkJCQkJICAgIGlzLT5uX3R5cGUsIGlzLT5uX3NjbGFzcywKLQkJCQkJCSAgICBpcy0+bl9udW1hdXggLSAxLAotCQkJCQkJICAgIGlzLT5uX251bWF1eCwKLQkJCQkJCSAgICAoUFRSKSAmYXV4KTsKLQkJCSAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCkgPT0gWFRZX1NECi0JCQkJICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMwKQotCQkJCWluZHggPSBmaW5mby0+dG9jX3N5bWluZHg7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIGlmIChpbmR4ICE9IC0xKQotCQkJaXJlbC0+cl9zeW1uZHggPSBpbmR4OwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzOwotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkJICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JCQkgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCB3ZSBhcmUKLQkJCSAgICAgc3RyaXBwaW5nLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaGFuZGxlCi0JCQkgICAgIHRoaXMgY2FzZSwgYnV0IEkgZG9uJ3QgdGhpbmsgaXQncyB3b3J0aCBpdC4gICovCi0JCQkgIGlzID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKLQotCQkJICBuYW1lID0gKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQotCQkJCSAgKGlucHV0X2JmZCwgaXMsIGJ1ZikpOwotCQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgbywKLQkJCQkgIGlyZWwtPnJfdmFkZHIpKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHF1aWV0ID0gZmFsc2U7Ci0JICAgICAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBpZiAoaCA9PSBOVUxMCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JCSAgICBicmVhazsKLQkJICAvKiBGYWxsIHRocm91Z2guICAqLwotCQljYXNlIFJfUE9TOgotCQljYXNlIFJfTkVHOgotCQljYXNlIFJfUkw6Ci0JCWNhc2UgUl9STEE6Ci0JCSAgLyogVGhpcyByZWxvYyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgLmxvYWRlcgotCQkgICAgIHNlY3Rpb24uICAqLwotCQkgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotCQkgIGlmIChyX3N5bW5keCA9PSAtMSkKLQkJICAgIGxkcmVsLmxfc3ltbmR4ID0gLTE7Ci0JCSAgZWxzZSBpZiAoaCA9PSBOVUxMCi0JCQkgICB8fCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzZWMgPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5jc2VjdHNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JCQlzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCQkgICAgICBlbHNlCi0JCQlzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgICAgIHNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0KLQkJICAgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotCQkJbGRyZWwubF9zeW1uZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJCWxkcmVsLmxfc3ltbmR4ID0gMTsKLQkJICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWMtPm5hbWUsICIuYnNzIikgPT0gMCkKLQkJCWxkcmVsLmxfc3ltbmR4ID0gMjsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkgICAgIHNlYy0+bmFtZSk7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwCi0JCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgPT0gMCkKLQkJCXsKLQkJCSAgLyogV2UgYWxyZWFkeSBjYWxsZWQgdGhlIHVuZGVmaW5lZF9zeW1ib2wKLQkJCSAgICAgY2FsbGJhY2sgZm9yIHRoaXMgcmVsb2NhdGlvbiwgaW4KLQkJCSAgICAgX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbi4gIERvbid0Ci0JCQkgICAgIGlzc3VlIGFueSBtb3JlIHdhcm5pbmdzLiAgKi8KLQkJCSAgcXVpZXQgPSB0cnVlOwotCQkJfQotCQkgICAgICBpZiAoaC0+bGRpbmR4IDwgMCAmJiAhIHF1aWV0KQotCQkJewotCQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgICAoXygiJXM6IGAlcycgaW4gbG9hZGVyIHJlbG9jIGJ1dCBub3QgbG9hZGVyIHN5bSIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgbGRyZWwubF9zeW1uZHggPSBoLT5sZGluZHg7Ci0JCSAgICB9Ci0JCSAgbGRyZWwubF9ydHlwZSA9IChpcmVsLT5yX3NpemUgPDwgOCkgfCBpcmVsLT5yX3R5cGU7Ci0JCSAgbGRyZWwubF9yc2Vjbm0gPSBvLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnRleHRybwotCQkgICAgICAmJiBzdHJjbXAgKG8tPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLnRleHQiKSA9PSAwCi0JCSAgICAgICYmICEgcXVpZXQpCi0JCSAgICB7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gcmVhZC1vbmx5IHNlY3Rpb24gJXMiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkJICAgICAgIG8tPm91dHB1dF9zZWN0aW9uKSk7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLAotCQkJCQlmaW5mby0+bGRyZWwpOwotCQkgIEJGRF9BU1NFUlQgKHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkcmVsKSA9PSBMRFJFTFNaKTsKLQkJICArK2ZpbmZvLT5sZHJlbDsKLQkJICBicmVhazsKLQotCQljYXNlIFJfVE9DOgotCQljYXNlIFJfR0w6Ci0JCWNhc2UgUl9UQ0w6Ci0JCWNhc2UgUl9UUkw6Ci0JCWNhc2UgUl9UUkxBOgotCQkgIC8qIFdlIHNob3VsZCBuZXZlciBuZWVkIGEgLmxvYWRlciByZWxvYyBmb3IgYSBUT0MKLQkJICAgICByZWxhdGl2ZSByZWxvYy4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gby0+cmVsb2NfY291bnQ7Ci0JfQotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIG1vZGlmaWVkIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkgICAgICAoby0+X2Nvb2tlZF9zaXplICE9IDAKLQkJCQkgICAgICAgPyBvLT5fY29va2VkX3NpemUKLQkJCQkgICAgICAgOiBvLT5fcmF3X3NpemUpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoaW5wdXRfYmZkKSA9IGtlZXBfc3ltczsKLQotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jdW5kZWYgTl9UTUFTSwotI3VuZGVmIE5fQlRTSEZUCi0KLS8qIFdyaXRlIG91dCBhIG5vbi1YQ09GRiBnbG9iYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wgKGgsIHApCi0gICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICopIHA7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgYmZkX2J5dGUgKm91dHN5bTsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgd2FzIGdhcmJhZ2UgY29sbGVjdGVkLCBqdXN0IHNraXAgaXQuICAqLwotICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5nYwotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSBuZWVkIGEgLmxvYWRlciBzZWN0aW9uIGVudHJ5LCB3cml0ZSBpdCBvdXQuICAqLwotICBpZiAoaC0+bGRzeW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKmxkc3ltOwotICAgICAgYmZkICppbXBiZmQ7Ci0KLSAgICAgIGxkc3ltID0gaC0+bGRzeW07Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQl7Ci0JICBsZHN5bS0+bF92YWx1ZSA9IDA7Ci0JICBsZHN5bS0+bF9zY251bSA9IE5fVU5ERUY7Ci0JICBsZHN5bS0+bF9zbXR5cGUgPSBYVFlfRVI7Ci0JICBpbXBiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgbGRzeW0tPmxfdmFsdWUgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICArIGgtPnJvb3QudS5kZWYudmFsdWUpOwotCSAgbGRzeW0tPmxfc2NudW0gPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBsZHN5bS0+bF9zbXR5cGUgPSBYVFlfU0Q7Ci0JICBpbXBiZmQgPSBzZWMtPm93bmVyOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKCgoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMAotCSAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwKQotCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQotCWxkc3ltLT5sX3NtdHlwZSB8PSBMX0lNUE9SVDsKLSAgICAgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpICE9IDAKLQkgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0VYUE9SVCkgIT0gMCkKLQlsZHN5bS0+bF9zbXR5cGUgfD0gTF9FWFBPUlQ7Ci0gICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRU5UUlkpICE9IDApCi0JbGRzeW0tPmxfc210eXBlIHw9IExfRU5UUlk7Ci0KLSAgICAgIGxkc3ltLT5sX3NtY2xhcyA9IGgtPnNtY2xhczsKLQotICAgICAgaWYgKGxkc3ltLT5sX2lmaWxlID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlsZHN5bS0+bF9pZmlsZSA9IDA7Ci0gICAgICBlbHNlIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAwKQotCXsKLQkgIGlmICgobGRzeW0tPmxfc210eXBlICYgTF9JTVBPUlQpID09IDApCi0JICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKLQkgIGVsc2UgaWYgKGltcGJmZCA9PSBOVUxMKQotCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChpbXBiZmQtPnh2ZWMgPT0gb3V0cHV0X2JmZC0+eHZlYyk7Ci0JICAgICAgbGRzeW0tPmxfaWZpbGUgPSB4Y29mZl9kYXRhIChpbXBiZmQpLT5pbXBvcnRfZmlsZV9pZDsKLQkgICAgfQotCX0KLQotICAgICAgbGRzeW0tPmxfcGFybSA9IDA7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmxkaW5keCA+PSAwKTsKLSAgICAgIEJGRF9BU1NFUlQgKExEU1lNU1ogPT0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pKTsKLSAgICAgIHhjb2ZmX3N3YXBfbGRzeW1fb3V0IChvdXRwdXRfYmZkLCBsZHN5bSwgZmluZm8tPmxkc3ltICsgaC0+bGRpbmR4IC0gMyk7Ci0gICAgICBoLT5sZHN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIG5lZWRzIGdsb2JhbCBsaW5rYWdlIGNvZGUsIHdyaXRlIGl0IG91dC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uCi0JICA9PSB4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmxpbmthZ2Vfc2VjdGlvbikpCi0gICAgewotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBiZmRfdm1hIHRvY29mZjsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBwID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5jb250ZW50cyArIGgtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGUgZ2xvYmFsIGxpbmthZ2UgY29kZSBsb2FkcyBhCi0gICAgICAgICBzcGVjaWZpYyBUT0MgZWxlbWVudC4gICovCi0gICAgICB0b2NvZmYgPSAoaC0+ZGVzY3JpcHRvci0+dG9jX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBoLT5kZXNjcmlwdG9yLT50b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQktIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2MpOwotICAgICAgaWYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpICE9IDApCi0JdG9jb2ZmICs9IGgtPmRlc2NyaXB0b3ItPnUudG9jX29mZnNldDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFhDT0ZGX0dMSU5LX0ZJUlNUIHwgKHRvY29mZiAmIDB4ZmZmZiksIHApOwotICAgICAgZm9yIChpID0gMCwgcCArPSA0OwotCSAgIGkgPCBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZSAvIHNpemVvZiB4Y29mZl9nbGlua19jb2RlWzBdOwotCSAgIGkrKywgcCArPSA0KQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHhjb2ZmX2dsaW5rX2NvZGVbaV0sIHApOwotICAgIH0KLQotICAvKiBJZiB3ZSBjcmVhdGVkIGEgVE9DIGVudHJ5IGZvciB0aGlzIHN5bWJvbCwgd3JpdGUgb3V0IHRoZSByZXF1aXJlZAotICAgICByZWxvY3MuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfU0VUX1RPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqdG9jc2VjOwotICAgICAgYXNlY3Rpb24gKm9zZWM7Ci0gICAgICBpbnQgb2luZHg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlyc3ltOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGlyYXV4OwotCi0gICAgICB0b2NzZWMgPSBoLT50b2Nfc2VjdGlvbjsKLSAgICAgIG9zZWMgPSB0b2NzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgICAgb2luZHggPSBvc2VjLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpcmVsID0gZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsb2NzICsgb3NlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBpcmVsLT5yX3ZhZGRyID0gKG9zZWMtPnZtYQotCQkgICAgICAgKyB0b2NzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+dS50b2Nfb2Zmc2V0KTsKLSAgICAgIGlmIChoLT5pbmR4ID49IDApCi0JaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotICAgICAgZWxzZQotCXsKLQkgIGgtPmluZHggPSAtMjsKLQkgIGlyZWwtPnJfc3ltbmR4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotCX0KLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfUE9TOwotICAgICAgaXJlbC0+cl9zaXplID0gMzE7Ci0gICAgICBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxfaGFzaGVzW29zZWMtPnJlbG9jX2NvdW50XSA9IE5VTEw7Ci0gICAgICArK29zZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5sZGluZHggPj0gMCk7Ci0gICAgICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLSAgICAgIGxkcmVsLmxfc3ltbmR4ID0gaC0+bGRpbmR4OwotICAgICAgbGRyZWwubF9ydHlwZSA9ICgzMSA8PCA4KSB8IFJfUE9TOwotICAgICAgbGRyZWwubF9yc2Vjbm0gPSBvaW5keDsKLSAgICAgIHhjb2ZmX3N3YXBfbGRyZWxfb3V0IChvdXRwdXRfYmZkLCAmbGRyZWwsIGZpbmZvLT5sZHJlbCk7Ci0gICAgICArK2ZpbmZvLT5sZHJlbDsKLQotICAgICAgLyogV2UgbmVlZCB0byBlbWl0IGEgc3ltYm9sIHRvIGRlZmluZSBhIGNzZWN0IHdoaWNoIGhvbGRzIHRoZQotICAgICAgICAgcmVsb2MuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0JewotCSAgaWYgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgPD0gU1lNTk1MRU4pCi0JICAgIHN0cm5jcHkgKGlyc3ltLl9uLl9uX25hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIFNZTU5NTEVOKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJvb2xlYW4gaGFzaDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBoYXNoID0gdHJ1ZTsKLQkgICAgICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLQkJaGFzaCA9IGZhbHNlOwotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCSBoYXNoLCBmYWxzZSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaXJzeW0uX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgICAgIGlyc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JICAgIH0KLQotCSAgaXJzeW0ubl92YWx1ZSA9IGlyZWwtPnJfdmFkZHI7Ci0JICBpcnN5bS5uX3NjbnVtID0gb3NlYy0+dGFyZ2V0X2luZGV4OwotCSAgaXJzeW0ubl9zY2xhc3MgPSBDX0hJREVYVDsKLQkgIGlyc3ltLm5fdHlwZSA9IFRfTlVMTDsKLQkgIGlyc3ltLm5fbnVtYXV4ID0gMTsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXJzeW0sIChQVFIpIG91dHN5bSk7Ci0JICBvdXRzeW0gKz0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotCSAgbWVtc2V0ICgmaXJhdXgsIDAsIHNpemVvZiBpcmF1eCk7Ci0JICBpcmF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfU0Q7Ci0JICBpcmF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSA0OwotCSAgaXJhdXgueF9jc2VjdC54X3NtY2xhcyA9IFhNQ19UQzsKLQotCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXJhdXgsIFRfTlVMTCwgQ19ISURFWFQsCi0JCQkJIDAsIDEsIChQVFIpIG91dHN5bSk7Ci0JICBvdXRzeW0gKz0gYmZkX2NvZmZfYXV4ZXN6IChvdXRwdXRfYmZkKTsKLQotCSAgaWYgKGgtPmluZHggPj0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZW4ndCBnb2luZyB0byB3cml0ZSBvdXQgdGhlIHN5bWJvbHMgYmVsb3csIHNvIHdlCi0JCSBuZWVkIHRvIHdyaXRlIHRoZW0gb3V0IG5vdy4gICovCi0JICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCQkgICAgICsgKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkJCSogYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKSkpLAotCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLAotCQkJCSBvdXRwdXRfYmZkKQotCQkgICAgICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgKz0KLQkJKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLQkgICAgICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgYSBzcGVjaWFsbHkgZGVmaW5lZCBmdW5jdGlvbiBkZXNjcmlwdG9yLCB3cml0ZQotICAgICBpdCBvdXQuICBUaGUgZmlyc3Qgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gY29kZQotICAgICBpdHNlbGYsIHRoZSBzZWNvbmQgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgVE9DLCBhbmQgdGhlIHRoaXJkCi0gICAgIHdvcmQgaXMgemVyby4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uCi0JICA9PSB4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbikpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGFzZWN0aW9uICpvc2VjOwotICAgICAgaW50IG9pbmR4OwotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZW50cnk7Ci0gICAgICBhc2VjdGlvbiAqZXNlYzsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCBsZHJlbDsKLSAgICAgIGFzZWN0aW9uICp0c2VjOwotCi0gICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgICAgIG9pbmR4ID0gb3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgcCA9IHNlYy0+Y29udGVudHMgKyBoLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICBoZW50cnkgPSBoLT5kZXNjcmlwdG9yOwotICAgICAgQkZEX0FTU0VSVCAoaGVudHJ5ICE9IE5VTEwKLQkJICAmJiAoaGVudHJ5LT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGhlbnRyeS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotICAgICAgZXNlYyA9IGhlbnRyeS0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIGVzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBoZW50cnktPnJvb3QudS5kZWYudmFsdWUpLAotCQkgIHApOwotCi0gICAgICBpcmVsID0gZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsb2NzICsgb3NlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBpcmVsLT5yX3ZhZGRyID0gKG9zZWMtPnZtYQotCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IGVzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpcmVsLT5yX3R5cGUgPSBSX1BPUzsKLSAgICAgIGlyZWwtPnJfc2l6ZSA9IDMxOwotICAgICAgZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsX2hhc2hlc1tvc2VjLT5yZWxvY19jb3VudF0gPSBOVUxMOwotICAgICAgKytvc2VjLT5yZWxvY19jb3VudDsKLQotICAgICAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0gICAgICBpZiAoc3RyY21wIChlc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDA7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIuYnNzIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCSAgICAgZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbGRyZWwubF9ydHlwZSA9ICgzMSA8PCA4KSB8IFJfUE9TOwotICAgICAgbGRyZWwubF9yc2Vjbm0gPSBvaW5keDsKLSAgICAgIHhjb2ZmX3N3YXBfbGRyZWxfb3V0IChvdXRwdXRfYmZkLCAmbGRyZWwsIGZpbmZvLT5sZHJlbCk7Ci0gICAgICArK2ZpbmZvLT5sZHJlbDsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnRvYywgcCArIDQpOwotCi0gICAgICB0c2VjID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChvdXRwdXRfYmZkLAotCQkJCQkgIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5zbnRvYyk7Ci0KLSAgICAgICsraXJlbDsKLSAgICAgIGlyZWwtPnJfdmFkZHIgPSAob3NlYy0+dm1hCi0JCSAgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIDQpOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSB0c2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgaXJlbC0+cl90eXBlID0gUl9QT1M7Ci0gICAgICBpcmVsLT5yX3NpemUgPSAzMTsKLSAgICAgIGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbF9oYXNoZXNbb3NlYy0+cmVsb2NfY291bnRdID0gTlVMTDsKLSAgICAgICsrb3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgICAgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotICAgICAgaWYgKHN0cmNtcCAodHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIudGV4dCIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wICh0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmJzcyIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkgICAgIHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKLSAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7Ci0gICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICAgICAgKytmaW5mby0+bGRyZWw7Ci0gICAgfQotCi0gIGlmIChoLT5pbmR4ID49IDAgfHwgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChvdXRzeW0gPT0gZmluZm8tPm91dHN5bXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLCBmYWxzZSwgZmFsc2UpCi0JCSAgPT0gTlVMTCkpKSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChvdXRzeW0gPT0gZmluZm8tPm91dHN5bXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiAoWENPRkZfUkVGX1JFR1VMQVIgfCBYQ09GRl9ERUZfUkVHVUxBUikpID09IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBtZW1zZXQgKCZhdXgsIDAsIHNpemVvZiBhdXgpOwotCi0gIGgtPmluZHggPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgaWYgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgPD0gU1lNTk1MRU4pCi0gICAgc3RybmNweSAoaXN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIGhhc2g7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIGhhc2ggPSB0cnVlOwotICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JaGFzaCA9IGZhbHNlOwotICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgaC0+cm9vdC5yb290LnN0cmluZywgaGFzaCwKLQkJCQkgZmFsc2UpOwotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPSAwOwotICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotICAgIH0KLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0gICAgewotICAgICAgaXN5bS5uX3ZhbHVlID0gMDsKLSAgICAgIGlzeW0ubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOwotICAgIH0KLSAgZWxzZSBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAmJiBoLT5zbWNsYXMgPT0gWE1DX1hPKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKSk7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfRVI7Ci0gICAgfQotICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKmw7Ci0KLSAgICAgIGlzeW0ubl92YWx1ZSA9IChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlKTsKLSAgICAgIGlzeW0ubl9zY251bSA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0hJREVYVDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfU0Q7Ci0KLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9IQVNfU0laRSkgIT0gMCkKLQl7Ci0JICBmb3IgKGwgPSB4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnNpemVfbGlzdDsKLQkgICAgICAgbCAhPSBOVUxMOwotCSAgICAgICBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChsLT5oID09IGgpCi0JCXsKLQkJICBhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gbC0+c2l6ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IChoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9DTTsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSBoLT5yb290LnUuYy5zaXplOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIGlzeW0ubl90eXBlID0gVF9OVUxMOwotICBpc3ltLm5fbnVtYXV4ID0gMTsKLQotICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOwotICBvdXRzeW0gKz0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICBhdXgueF9jc2VjdC54X3NtY2xhcyA9IGgtPnNtY2xhczsKLQotICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZhdXgsIFRfTlVMTCwgaXN5bS5uX3NjbGFzcywgMCwgMSwKLQkJCSAoUFRSKSBvdXRzeW0pOwotICBvdXRzeW0gKz0gYmZkX2NvZmZfYXV4ZXN6IChvdXRwdXRfYmZkKTsKLQotICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgaC0+c21jbGFzICE9IFhNQ19YTykKLSAgICB7Ci0gICAgICAvKiBXZSBqdXN0IG91dHB1dCBhbiBTRCBzeW1ib2wuICBOb3cgb3V0cHV0IGFuIExEIHN5bWJvbC4gICovCi0KLSAgICAgIGgtPmluZHggKz0gMjsKLQotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLSAgICAgIG91dHN5bSArPSBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0xEOwotICAgICAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBUX05VTEwsIENfRVhULCAwLCAxLAotCQkJICAgICAoUFRSKSBvdXRzeW0pOwotICAgICAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJICsgKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpKSksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgb3V0c3ltIC0gZmluZm8tPm91dHN5bXMsIDEsIG91dHB1dF9iZmQpCi0JICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgKz0KLSAgICAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpIC8gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgbGluayBvcmRlciB3aGljaCBpcyBzdXBwb3NlZCB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIGZpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICBhc2VjdGlvbiAqaHNlYzsKLSAgYmZkX3ZtYSBodmFsOwotICBiZmRfdm1hIGFkZGVuZDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hfcHRyOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHNvbWVob3cgbG9jYXRlIGEgc3ltYm9sIGluIHRoZSByaWdodCBzZWN0aW9uLiAgVGhlCi0gICAgICAgICBzeW1ib2wgbXVzdCBlaXRoZXIgaGF2ZSBhIHZhbHVlIG9mIHplcm8sIG9yIHdlIG11c3QgYWRqdXN0Ci0gICAgICAgICB0aGUgYWRkZW5kIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgRklYTUU6IFdyaXRlIHRoaXMKLSAgICAgICAgIHdoZW4gd2UgbmVlZCBpdC4gIFRoZSBvbGQgbGlua2VyIGNvdWxkbid0IGhhbmRsZSB0aGlzIGFueWhvdy4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAoaG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCSAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCSAgICAgKGZpbmZvLT5pbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwgKGJmZCAqKSBOVUxMLAotCSAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHsKLSAgICAgIGhzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgaHZhbCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaHZhbCA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHNlYyA9IE5VTEw7Ci0gICAgICBodmFsID0gMDsKLSAgICB9Ci0KLSAgYWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7Ci0gIGlmIChoc2VjICE9IE5VTEwpCi0gICAgYWRkZW5kICs9IChoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgICsgaHNlYy0+b3V0cHV0X29mZnNldAotCSAgICAgICArIGh2YWwpOwotCi0gIGlmIChhZGRlbmQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChmaW5mby0+aW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCSAgaG93dG8tPm5hbWUsIGFkZGVuZCwgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJICAoYmZkX3ZtYSkgMCkpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbiwgKFBUUikgYnVmLAotCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsIHNpemUpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGlmICghIG9rKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIHJlbG9jIGluZm9ybWF0aW9uIGluIHRoZSByaWdodCBwbGFjZS4gIEl0IHdpbGwgZ2V0Ci0gICAgIHN3YXBwZWQgYW5kIHdyaXR0ZW4gb3V0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbmFsX2xpbmsgcm91dGluZS4gICovCi0KLSAgaXJlbCA9IChmaW5mby0+c2VjdGlvbl9pbmZvW291dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXhdLnJlbG9jcwotCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotICByZWxfaGFzaF9wdHIgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCi0JCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCi0gIG1lbXNldCAoaXJlbCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLSAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0KLSAgaXJlbC0+cl92YWRkciA9IG91dHB1dF9zZWN0aW9uLT52bWEgKyBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0KLSAgaWYgKGgtPmluZHggPj0gMCkKLSAgICBpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIC0yIHRvIGZvcmNlIHRoaXMgc3ltYm9sIHRvIGdldCB3cml0dGVuIG91dC4gICovCi0gICAgICBoLT5pbmR4ID0gLTI7Ci0gICAgICAqcmVsX2hhc2hfcHRyID0gaDsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLSAgICB9Ci0KLSAgaXJlbC0+cl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIGlyZWwtPnJfc2l6ZSA9IGhvd3RvLT5iaXRzaXplIC0gMTsKLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0gICAgaXJlbC0+cl9zaXplIHw9IDB4ODA7Ci0KLSAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgLyogTm93IG91dHB1dCB0aGUgcmVsb2MgdG8gdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0KLSAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0KLSAgaWYgKGhzZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzZWNuYW1lOwotCi0gICAgICBzZWNuYW1lID0gaHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWU7Ci0KLSAgICAgIGlmIChzdHJjbXAgKHNlY25hbWUsICIudGV4dCIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWNuYW1lLCAiLmRhdGEiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjbmFtZSwgIi5ic3MiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMjsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksIHNlY25hbWUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChoLT5sZGluZHggPCAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGAlcycgaW4gbG9hZGVyIHJlbG9jIGJ1dCBub3QgbG9hZGVyIHN5bSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksCi0JICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGxkcmVsLmxfc3ltbmR4ID0gaC0+bGRpbmR4OwotICAgIH0KLQotICBsZHJlbC5sX3J0eXBlID0gKGlyZWwtPnJfc2l6ZSA8PCA4KSB8IGlyZWwtPnJfdHlwZTsKLSAgbGRyZWwubF9yc2Vjbm0gPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICArK2ZpbmZvLT5sZHJlbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU29ydCByZWxvY3MgYnkgVk1BLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAoteGNvZmZfc29ydF9yZWxvY3MgKHAxLCBwMikKLSAgICAgY29uc3QgUFRSIHAxOwotICAgICBjb25zdCBQVFIgcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcjEgPSAoY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICopIHAxOwotICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnIyID0gKGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBwMjsKLQotICBpZiAocjEtPnJfdmFkZHIgPiByMi0+cl92YWRkcikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAocjEtPnJfdmFkZHIgPCByMi0+cl92YWRkcikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyB0aGUgcmVsb2NhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIFJTLzYwMDAvUE9XRVIvUG93ZXJQQy4KLSAgIFRoaXMgaXMgY3VycmVudGx5IHRoZSBvbmx5IHByb2Nlc3NvciB3aGljaCB1c2VzIFhDT0ZGOyBJIGhvcGUgdGhhdAotICAgd2lsbCBuZXZlciBjaGFuZ2UuICAqLwotCi1ib29sZWFuCi1fYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCi0JCQkJIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCBob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgLyogUmVsb2NhdGlvbiB0eXBlIFJfUkVGIGlzIGEgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGUgd2hpY2ggaXMKLSAgICAgICAgIG1lcmVseSB1c2VkIHRvIHByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZyb20gb2NjdXJyaW5nIGZvcgotICAgICAgICAgdGhlIGNzZWN0IGluY2x1ZGluZyB0aGUgc3ltYm9sIHdoaWNoIGl0IHJlZmVyZW5jZXMuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlID09IFJfUkVGKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQkgIGFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JICBhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGJ1aWxkIHRoZSBob3d0byBpbmZvcm1hdGlvbiBvbiB0aGUgZmx5LiAgKi8KLQotICAgICAgaG93dG8udHlwZSA9IHJlbC0+cl90eXBlOwotICAgICAgaG93dG8ucmlnaHRzaGlmdCA9IDA7Ci0gICAgICBob3d0by5zaXplID0gMjsKLSAgICAgIGhvd3RvLmJpdHNpemUgPSAocmVsLT5yX3NpemUgJiAweDFmKSArIDE7Ci0gICAgICBob3d0by5wY19yZWxhdGl2ZSA9IGZhbHNlOwotICAgICAgaG93dG8uYml0cG9zID0gMDsKLSAgICAgIGlmICgocmVsLT5yX3NpemUgJiAweDgwKSAhPSAwKQotCWhvd3RvLmNvbXBsYWluX29uX292ZXJmbG93ID0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOwotICAgICAgZWxzZQotCWhvd3RvLmNvbXBsYWluX29uX292ZXJmbG93ID0gY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ7Ci0gICAgICBob3d0by5zcGVjaWFsX2Z1bmN0aW9uID0gTlVMTDsKLSAgICAgIGhvd3RvLm5hbWUgPSAiaW50ZXJuYWwiOwotICAgICAgaG93dG8ucGFydGlhbF9pbnBsYWNlID0gdHJ1ZTsKLSAgICAgIGlmIChob3d0by5iaXRzaXplID09IDMyKQotCWhvd3RvLnNyY19tYXNrID0gaG93dG8uZHN0X21hc2sgPSAweGZmZmZmZmZmOwotICAgICAgZWxzZQotCXsKLQkgIGhvd3RvLnNyY19tYXNrID0gaG93dG8uZHN0X21hc2sgPSAoMSA8PCBob3d0by5iaXRzaXplKSAtIDE7Ci0JICBpZiAoaG93dG8uYml0c2l6ZSA9PSAxNikKLQkgICAgaG93dG8uc2l6ZSA9IDE7Ci0JfQotICAgICAgaG93dG8ucGNyZWxfb2Zmc2V0ID0gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLQkgICAgICAvKiBIYWNrIHRvIG1ha2Ugc3VyZSB3ZSB1c2UgdGhlIHJpZ2h0IFRPQyBhbmNob3IgdmFsdWUKLSAgICAgICAgICAgICAgICAgaWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IHRoZSBUT0MgYW5jaG9yLiAgKi8KLQkgICAgICBpZiAoc2VjLT5uYW1lWzNdID09ICcwJwotCQkgICYmIHN0cmNtcCAoc2VjLT5uYW1lLCAiLnRjMCIpID09IDApCi0JCXZhbCA9IHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2M7Ci0JICAgICAgZWxzZQotCQl2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBzeW0tPm5fdmFsdWUKLQkJICAgICAgIC0gc2VjLT52bWEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgfHwgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogRXZlcnkgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdCBpcyBkZWZpbmVkIHNvbWV3aGVyZS4gICovCi0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIERvbid0IHRyeSB0byBwcm9jZXNzIHRoZSByZWxvYy4gIEl0IGNhbid0IGhlbHAsIGFuZAotICAgICAgICAgICAgICAgICBpdCBtYXkgZ2VuZXJhdGUgYW5vdGhlciBlcnJvci4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEkgdG9vayB0aGUgcmVsb2NhdGlvbiB0eXBlIGRlZmluaXRpb25zIGZyb20gdHdvIGRvY3VtZW50czoKLQkgdGhlIFBvd2VyUEMgQUlYIFZlcnNpb24gNCBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlLCBGaXJzdAotCSBFZGl0aW9uIChBcHJpbCAxOTkyKSwgYW5kIHRoZSBQb3dlck9wZW4gQUJJLCBCaWctRW5kaWFuCi0JIDMyLUJpdCBIYXJkd2FyZSBJbXBsZW1lbnRhdGlvbiAoSnVuZSAzMCwgMTk5NCkuICBEaWZmZXJlbmNlcwotCSBiZXR3ZWVuIHRoZSBkb2N1bWVudHMgYXJlIG5vdGVkIGJlbG93LiAgKi8KLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JY2FzZSBSX1JUQjoKLQljYXNlIFJfUlJUQkk6Ci0JY2FzZSBSX1JSVEJBOgotCSAgLyogVGhlc2UgcmVsb2NzIGFyZSBkZWZpbmVkIGJ5IHRoZSBQb3dlclBDIEFCSSB0byBiZQotICAgICAgICAgICAgIHJlbGF0aXZlIGJyYW5jaGVzIHdoaWNoIHVzZSBoYWxmIG9mIHRoZSBkaWZmZXJlbmNlCi0gICAgICAgICAgICAgYmV0d2VlbiB0aGUgc3ltYm9sIGFuZCB0aGUgcHJvZ3JhbSBjb3VudGVyLiAgSSBjYW4ndAotICAgICAgICAgICAgIHF1aXRlIGZpZ3VyZSBvdXQgd2hlbiB0aGlzIGlzIHVzZWZ1bC4gIFRoZXNlIHJlbG9jcyBhcmUKLSAgICAgICAgICAgICBub3QgZGVmaW5lZCBieSB0aGUgUG93ZXJPcGVuIEFCSS4gICovCi0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksICh1bnNpZ25lZCBpbnQpIHJlbC0+cl90eXBlKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgUl9QT1M6Ci0JICAvKiBTaW1wbGUgcG9zaXRpdmUgcmVsb2NhdGlvbi4gICovCi0JICBicmVhazsKLQljYXNlIFJfTkVHOgotCSAgLyogU2ltcGxlIG5lZ2F0aXZlIHJlbG9jYXRpb24uICAqLwotCSAgdmFsID0gLSB2YWw7Ci0JICBicmVhazsKLQljYXNlIFJfUkVMOgotCSAgLyogU2ltcGxlIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotCSAgaG93dG8ucGNfcmVsYXRpdmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBSX1RPQzoKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgVGhlIHZhbHVlIGluIHRoZSBpbnN0cnVjdGlvbiBpbgotICAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgaW5wdXQgZmlsZSBUT0MgdG8KLSAgICAgICAgICAgICB0aGUgZGVzaXJlZCBsb2NhdGlvbi4gIFdlIHdhbnQgdGhlIG9mZnNldCBmcm9tIHRoZSBmaW5hbAotICAgICAgICAgICAgIFRPQyB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbi4gIFdlIGhhdmU6Ci0JICAgICAgICAgaXN5bSA9IGlUT0MgKyBpbgotCQkgaWluc24gPSBpbiArIG8KLQkJIG9zeW0gPSBvVE9DICsgb24KLQkJIG9pbnNuID0gb24gKyBvCi0JICAgICBzbyB3ZSBtdXN0IGNoYW5nZSBpbnNuIGJ5IG9uIC0gaW4uCi0JICAgICAqLwotCWNhc2UgUl9HTDoKLQkgIC8qIEdsb2JhbCBsaW5rYWdlIHJlbG9jYXRpb24uICBUaGUgdmFsdWUgb2YgdGhpcyByZWxvY2F0aW9uCi0gICAgICAgICAgICAgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5IGluIHRoZSBUT0Mgc2VjdGlvbi4gICovCi0JY2FzZSBSX1RDTDoKLQkgIC8qIExvY2FsIG9iamVjdCBUT0MgYWRkcmVzcy4gIEkgY2FuJ3QgZmlndXJlIG91dCB0aGUKLSAgICAgICAgICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgY2FzZSBSX0dMLiAgKi8KLQljYXNlIFJfVFJMOgotCSAgLyogVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICBBIFRPQyByZWxhdGl2ZSBsb2FkIGluc3RydWN0aW9uCi0gICAgICAgICAgICAgd2hpY2ggbWF5IGJlIGNoYW5nZWQgdG8gYSBsb2FkIGFkZHJlc3MgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICAgRklYTUU6IFdlIGRvbid0IGN1cnJlbnRseSBpbXBsZW1lbnQgdGhpcyBvcHRpbWl6YXRpb24uICAqLwotCWNhc2UgUl9UUkxBOgotCSAgLyogVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgVE9DIHJlbGF0aXZlIGxvYWQKLSAgICAgICAgICAgICBhZGRyZXNzIGluc3RydWN0aW9uIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZAotICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICAqLwotCSAgaWYgKGggIT0gTlVMTCAmJiBoLT5zbWNsYXMgIT0gWE1DX1REKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnRvY19zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogVE9DIHJlbG9jIGF0IDB4JXggdG8gc3ltYm9sIGAlcycgd2l0aCBubyBUT0MgZW50cnkiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByZWwtPnJfdmFkZHIsCi0JCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKLQkgICAgICB2YWwgPSAoaC0+dG9jX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGgtPnRvY19zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCi0JICB2YWwgPSAoKHZhbCAtIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2MpCi0JCSAtIChzeW0tPm5fdmFsdWUgLSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT50b2MpKTsKLQkgIGFkZGVuZCA9IDA7Ci0JICBicmVhazsKLQljYXNlIFJfQkE6Ci0JICAvKiBBYnNvbHV0ZSBicmFuY2guICBXZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGUgbG93ZXIKLSAgICAgICAgICAgICB0d28gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCWNhc2UgUl9DQUk6Ci0JICAvKiBUaGUgUG93ZXJQQyBBQkkgZGVmaW5lcyB0aGlzIGFzIGFuIGFic29sdXRlIGNhbGwgd2hpY2gKLSAgICAgICAgICAgICBtYXkgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGEgcmVsYXRpdmUgY2FsbC4gIFRoZSBQb3dlck9wZW4KLSAgICAgICAgICAgICBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQljYXNlIFJfUkJBOgotCSAgLyogQWJzb2x1dGUgYnJhbmNoIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBiZWNvbWUgYQotICAgICAgICAgICAgIHJlbGF0aXZlIGJyYW5jaC4gICovCi0JY2FzZSBSX1JCQUM6Ci0JICAvKiBUaGUgUG93ZXJQQyBBQkkgZGVmaW5lcyB0aGlzIGFzIGFuIGFic29sdXRlIGJyYW5jaCB0byBhCi0gICAgICAgICAgICAgZml4ZWQgYWRkcmVzcyB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYW4gYWJzb2x1dGUgYnJhbmNoCi0gICAgICAgICAgICAgdG8gYSBzeW1ib2wuICBUaGUgUG93ZXJPcGVuIEFCSSBkb2VzIG5vdCBkZWZpbmUgdGhpcwotICAgICAgICAgICAgIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCUkM6Ci0JICAvKiBUaGUgUG93ZXJQQyBBQkkgZGVmaW5lcyB0aGlzIGFzIGFuIGFic29sdXRlIGJyYW5jaCB0byBhCi0gICAgICAgICAgICAgZml4ZWQgYWRkcmVzcyB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYSByZWxhdGl2ZSBicmFuY2guCi0gICAgICAgICAgICAgVGhlIFBvd2VyT3BlbiBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQkgIGhvd3RvLnNyY19tYXNrICY9IH4zOwotCSAgaG93dG8uZHN0X21hc2sgPSBob3d0by5zcmNfbWFzazsKLQkgIGJyZWFrOwotCWNhc2UgUl9CUjoKLQkgIC8qIFJlbGF0aXZlIGJyYW5jaC4gIFdlIGRvbid0IHdhbnQgdG8gbWVzcyB3aXRoIHRoZSBsb3dlcgotICAgICAgICAgICAgIHR3byBiaXRzIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JY2FzZSBSX0NSRUw6Ci0JICAvKiBUaGUgUG93ZXJQQyBBQkkgZGVmaW5lcyB0aGlzIGFzIGEgcmVsYXRpdmUgY2FsbCB3aGljaCBtYXkKLSAgICAgICAgICAgICBiZSBtb2RpZmllZCB0byBiZWNvbWUgYW4gYWJzb2x1dGUgY2FsbC4gIFRoZSBQb3dlck9wZW4KLSAgICAgICAgICAgICBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQljYXNlIFJfUkJSOgotCSAgLyogQSByZWxhdGl2ZSBicmFuY2ggd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhbgotICAgICAgICAgICAgIGFic29sdXRlIGJyYW5jaC4gIEZJWE1FOiBXZSBkb24ndCBpbXBsZW1lbnQgdGhpcywKLSAgICAgICAgICAgICBhbHRob3VnaCB3ZSBzaG91bGQgZm9yIHN5bWJvbHMgb2Ygc3RvcmFnZSBtYXBwaW5nIGNsYXNzCi0gICAgICAgICAgICAgWE1DX1hPLiAgKi8KLQkgIGhvd3RvLnBjX3JlbGF0aXZlID0gdHJ1ZTsKLQkgIGhvd3RvLnNyY19tYXNrICY9IH4zOwotCSAgaG93dG8uZHN0X21hc2sgPSBob3d0by5zcmNfbWFzazsKLQkgIGJyZWFrOwotCWNhc2UgUl9STDoKLQkgIC8qIFRoZSBQb3dlclBDIEFJWCBBQkkgZGVzY3JpYmVzIHRoaXMgYXMgYSBsb2FkIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgIGNoYW5nZWQgdG8gYSBsb2FkIGFkZHJlc3MuICBUaGUgUG93ZXJPcGVuIEFCSSBzYXlzIHRoaXMKLSAgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyBjYXNlIFJfUE9TLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgUl9STEE6Ci0JICAvKiBUaGUgUG93ZXJQQyBBSVggQUJJIGRlc2NyaWJlcyB0aGlzIGFzIGEgbG9hZCBhZGRyZXNzCi0gICAgICAgICAgICAgd2hpY2ggbWF5IGJlIGNoYW5nZWQgdG8gYSBsb2FkLiAgVGhlIFBvd2VyT3BlbiBBQkkgc2F5cwotICAgICAgICAgICAgIHRoaXMgaXMgdGhlIHNhbWUgYXMgUl9QT1MuICAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBzZWUgYW4gUl9CUiBvciBSX1JCUiByZWxvYyB3aGljaCBpcyBqdW1waW5nIHRvIGdsb2JhbAotICAgICAgICAgbGlua2FnZSBjb2RlLCBhbmQgaXQgaXMgZm9sbG93ZWQgYnkgYW4gYXBwcm9wcmlhdGUgY3JvciBub3AKLSAgICAgICAgIGluc3RydWN0aW9uLCB3ZSByZXBsYWNlIHRoZSBjcm9yIHdpdGggbHd6IHIyLDIwKHIxKS4gIFRoaXMKLSAgICAgICAgIHJlc3RvcmVzIHRoZSBUT0MgYWZ0ZXIgdGhlIGdsaW5rIGNvZGUuICBDb250cmFyaXdpc2UsIGlmIHRoZQotICAgICAgICAgY2FsbCBpcyBmb2xsb3dlZCBieSBhIGx3eiByMiwyMChyMSksIGJ1dCB0aGUgY2FsbCBpcyBub3QKLSAgICAgICAgIGdvaW5nIHRvIGdsb2JhbCBsaW5rYWdlIGNvZGUsIHdlIGNhbiByZXBsYWNlIHRoZSBsb2FkIHdpdGggYQotICAgICAgICAgY3Jvci4gICovCi0gICAgICBpZiAoKHJlbC0+cl90eXBlID09IFJfQlIgfHwgcmVsLT5yX3R5cGUgPT0gUl9SQlIpCi0JICAmJiBoICE9IE5VTEwKLQkgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyA4Ci0JICAgICAgPD0gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKSkKLQl7Ci0JICBiZmRfYnl0ZSAqcG5leHQ7Ci0JICB1bnNpZ25lZCBsb25nIG5leHQ7Ci0KLQkgIHBuZXh0ID0gY29udGVudHMgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSArIDQ7Ci0JICBuZXh0ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBwbmV4dCk7Ci0KLQkgIC8qIFRoZSBfcHRyZ2wgZnVuY3Rpb24gaXMgbWFnaWMuICBJdCBpcyB1c2VkIGJ5IHRoZSBBSVgKLSAgICAgICAgICAgICBjb21waWxlciB0byBjYWxsIGEgZnVuY3Rpb24gdGhyb3VnaCBhIHBvaW50ZXIuICAqLwotCSAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfR0wKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICIuX3B0cmdsIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChuZXh0ID09IDB4NGRlZjdiODIJCS8qIGNyb3IgMTUsMTUsMTUgKi8KLQkJICB8fCBuZXh0ID09IDB4NGZmZmZiODIpCS8qIGNyb3IgMzEsMzEsMzEgKi8KLQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDgwNDEwMDE0LCBwbmV4dCk7IC8qIGx3eiByMSwyMChyMSkgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG5leHQgPT0gMHg4MDQxMDAxNCkJCS8qIGx3eiByMSwyMChyMSkgKi8KLQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDRmZmZmYjgyLCBwbmV4dCk7IC8qIGNyb3IgMzEsMzEsMzEgKi8KLQkgICAgfQotCX0KLQotICAgICAgLyogQSBQQyByZWxhdGl2ZSByZWxvYyBpbmNsdWRlcyB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgKi8KLSAgICAgIGlmIChob3d0by5wY19yZWxhdGl2ZSkKLQlhZGRlbmQgKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoJmhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLAotCQkJCQlyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCXZhbCwgYWRkZW5kKTsKLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICAgIGNoYXIgaG93dG9fbmFtZVsxMF07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICBzcHJpbnRmIChob3d0b19uYW1lLCAiMHglMDJ4IiwgcmVsLT5yX3R5cGUpOwotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0b19uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9DaGFuZ2VMb2cgYi9iaW51dGlscy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNTkyMTQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjcwOSArMCwwIEBACi0xOTk5LTA2LTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRsbHRvb2xfU09VUkNFUyk6IEFkZCBkeW4tc3RyaW5nLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0yMyAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoSEFWRV9FWEVDVVRBQkxFX1NVRkZJWCk6IERlZmluZS4KLQkqIGRsbHRvb2wuYyAobG9va19mb3JfcHJvZyk6IFVzZSBIQVZFX0VYRUNVVEFCTEVfU1VGRklYLgotCSogZGxsd3JhcC5jIChsb29rX2Zvcl9wcm9nKTogTGlrZXdpc2UuCi0JKiByZXNyYy5jIChsb29rX2Zvcl9kZWZhdWx0KTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gTXVtaXQgS2hhbiA8a2hhbkB4cmF5bGl0aC53aXNjLkVEVT46Ci0JKiBjb25maWd1cmUuaW46IERlZmluZSBFWEVDVVRBQkxFX1NVRkZJWC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSAiZHluLXN0cmluZy5oIi4gIEluY2x1ZGUgPHN0ZGFyZy5oPiBiYXNlZCBvbgotCUFOU0lfUFJPVE9UWVBFUywgbm90IF9fU1REQ19fLgotCShvdXRmaWxlKTogUmVtb3ZlLgotCShnZW5fZXhwX2ZpbGUpOiBDaGFuZ2UgdXNlcyBvZiBvdXRmaWxlIHRvIHVzZSBhbGxvY2EuCi0JKG1ha2Vfb25lX2xpYl9maWxlLCBtYWtlX2hlYWQsIG1ha2VfdGFpbCk6IExpa2V3aXNlLgotCShnZW5fbGliX2ZpbGUpOiBMaWtld2lzZS4KLQkobG9va19mb3JfcHJvZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlZHVjZV9uYW1lKTogUmV3cml0ZSB0byB1c2UgbG9va19mb3JfcHJvZy4KLQkobWNvcmVfZWxmX2dlbl9vdXRfZmlsZSk6IFVzZSBkeW5fc3RyaW5nX3QgcmF0aGVyIHRoYW4gb3V0ZmlsZS4KLQkqIGRsbHdyYXAuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4sIDxlcnJuby5oPiwgPHN0cmluZy5oPiwKLQk8c3RkbGliLmg+LCBvciA8dW5pc3RkLmg+LiAgSW5jbHVkZSA8c3lzL3N0YXQuaD4gYW5kIGVpdGhlcgotCTxzdGRhcmcuaD4gb3IgPHZhcmFyZ3MuaD4uCi0JKGRyaXZlcl9uYW1lKTogSW5pdGlhbGl6ZSB0byBOVUxMLCBub3QgImdjYyIuCi0JKGRsbHRvb2xfbmFtZSk6IEluaXRpYWxpemUgdG8gTlVMTCwgbm90ICJkbGx0b29sIi4KLQkoZGlzcGxheSwgaW5mb3JtLCBsb29rX2Zvcl9wcm9nLCBkZWR1Y2VfbmFtZSk6IE5ldyBzdGF0aWMKLQlmdW5jdGlvbnMuCi0JKHVzYWdlKTogTWVudGlvbiAtbW5vLWN5Z3dpbi4KLQkoT1BUSU9OX01OT19DWUdXSU4pOiBEZWZpbmUuCi0JKG1haW4pOiBIYW5kbGUgLW1uby1jeWd3aW4uICBEZWR1Y2UgZHJpdmVyX25hbWUgYW5kIGRsbHRvb2xfbmFtZS4KLQkqIHJlc3JjLmMgKGxvb2tfZm9yX2RlZmF1bHQpOiBNYWtlIHN0YXRpYy4gIFJlbW92ZSB1bnVzZWQgbG9jYWwKLQlwYXRoLiAgQ2hlY2sgdXNpbmcgRVhFQ1VUQUJMRV9TVUZGSVguCi0JKHJlYWRfcmNfZmlsZSk6IEFsbG9jYXRlIGVub3VnaCBzcGFjZSB0byBob2xkIEVYRUNVVEFCTEVfU1VGRklYLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShkbGx3cmFwX0xEQUREKTogQWRkICQoSU5UTExJQlMpLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVuIDIxIDE2OjQ5OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IFVzZSBlbGZfaHBwYV9yZWxvY190eXBlIGluc3RlYWQgb2YKLSAgICAgICAgZWxmMzJfaHBwYV9yZWxvY190eXBlLgotCi0xOTk5LTA2LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUpOiBMaW5rIG9iamVjdCBmaWxlcyB3aXRoIHRoZQotCS5leHAgZmlsZSwgbm90IHRoZSAubGliIGZpbGUuCi0KLUZyaSBKdW4gMTggMjA6MTc6NTEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRlZmxleC5sOiBBY2NlcHQgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgbmFtZXMuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3N5bWJvbF90eXBlKTogRGV0ZWN0IEFSTSBzeW1ib2xzIHR5cGVkIGFzIFRodW1iCi0JZnVuY3Rpb25zLiAKLQotMTk5OS0wNi0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZXJfb3B0aW9ucyk6IE5ldyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgLU0vLS1kaXNhc3NlbWJsZXItb3B0aW9ucyBvcHRpb24uCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWRpc2Fzc2VtYmxlci1vcHRpb25zLgotCShkaXNhc3NlbWJsZV9kYXRhKTogSW5pdGlhbGlzZSBkaXNhc3NlbWJsZXJfb3B0aW9ucyBmaWVsZCBvZgotCWRpc2Fzc2VtYmxlcl9pbmZvIHN0cnVjdHVyZS4KLQkobWFpbik6IEFkZCBwYXJzaW5nIG9mIC1NIG9wdGlvbi4KLQkKLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIHRvIG9iamR1bXAuCi0KLQkqIE5FV1M6IERlc2NyaWJlIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIHRvIG9iamR1bXAuCi0KLQotTW9uIEp1biAxNCAxMDoyNzo1NCAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IEZpeCB0eXBvcy4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBJZiB0aGUgZGlzYXNzZW1ibGVyIHJldHVybnMgYW4KLQllcnJvciwgcHJpbnQgb3V0IGFueXRoaW5nIGl0IG1heSBoYXZlIHByaW50ZWQgdG8gdGhlIGJ1ZmZlci4gIEZyb20KLQlILkouIEx1IDxoamxAZ251Lm9yZz4uCi0KLQkqIGRlZnBhcnNlLnkgKGV4cGxpc3QpOiBSZW1vdmUgc2VwYXJhdGUgZXhwbGluZSB0byBlbGltaW5hdGUKLQlzaGlmdC9yZWR1Y2UgY29uZmxpY3QuCi0KLQlGcm9tIEthaS1Vd2UgUm9tbWVsIDxyb21tZWxAYXJzLmRlPjoKLQkqIGRlZnBhcnNlLnk6IEFkZCB0b2tlbnMgTk9OU0hBUkVELCBTSU5HTEUsIE1VTFRJUExFLAotCUlOSVRJTlNUQU5DRSwgSU5JVEdMT0JBTCwgVEVSTUlOU1RBTkNFLCBhbmQgVEVSTUdMT0JBTC4KLQkoY29tbWFuZCk6IEFkZCBvcHRpb25fbGlzdCBhZnRlciBMSUJSQVJZLgotCShhdHRyKTogQWNjZXB0IGFuZCBpZ25vcmUgTk9OU0hBUkVELCBTSU5HTEUsIGFuZCBNVUxUSVBMRS4KLQkob3B0aW9uX2xpc3QsIG9wdGlvbik6IE5ldyBub250ZXJtaW5hbHMuCi0JKiBkZWZsZXgubDogUmVjb2duaXplIE5PTlNIQVJFRCwgU0lOR0xFLCBNVUxUSVBMRSwgSU5JVElOU1RBTkNFLAotCUlOSVRHTE9CQUwsIFRFUk1JTlNUQU5DRSwgYW5kIFRFUk1HTE9CQUwuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhci5jIChPX0JJTkFSWSk6IERlZmluZSBhcyAwIGlmIG5vdCBkZWZpbmVkLgotCShyYW5saWJfdG91Y2gpOiBPcGVuIGZpbGUgd2l0aCBPX0JJTkFSWS4KLQotCSogcmVuYW1lLmMgKE9fQklOQVJZKTogRGVmaW5lIGFzIDAgaWYgbm90IGRlZmluZWQuCi0JKHNpbXBsZV9jb3B5KTogT3BlbiBmaWxlcyB3aXRoIE9fQklOQVJZLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILiBQZXRlciBBbnZpbiA8aHBhQHRyYW5zbWV0YS5jb20+OgotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGNvcHkgZmllbGQuCi0JKHNlY3Rpb25zX2NvcGllZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAib25seS1zZWN0aW9uIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLWogYW5kIC0tb25seS1zZWN0aW9uLgotCShmaW5kX3NlY3Rpb25fbGlzdCk6IEluaXRpYWxpemUgY29weSBmaWVsZC4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IENoZWNrIGZvciBjb3B5aW5nIHNlY3Rpb25zLgotCShjb3B5X29iamVjdCk6IENoZWNrIHNlY3Rpb25zX2NvcGllZCB3aGVuIGNhbGxpbmcgZmlsdGVyX3N5bWJvbHMuCi0JKHNldHVwX3NlY3Rpb24pOiBDaGVjayBmb3IgY29weWluZyBzZWN0aW9ucy4KLQkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtai8tLW9ubHktc2VjdGlvbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLWovLS1vbmx5LXNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgZnJleHAgaXMgbm90IGF2YWlsYWJsZSwgY2hlY2sgaW4gLWxtLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiByZWFkZWxmLmMgKGdldF9lbGZfY2xhc3MpOiBVc2UgY29ycmVjdCBwcmludGYgZm9ybWF0IGZvciB0eXBlLgotCShnZXRfZGF0YV9lbmNvZGluZyk6IExpa2V3aXNlLgotCShnZXRfb3NhYmlfbmFtZSk6IExpa2V3aXNlLgotCShwcm9jZXNzX2ZpbGVfaGVhZGVyKTogRG9uJ3QgcGFzcyBhbiBleHRyYSBhcmd1bWVudCB0byBwcmludGYuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogQ2FzdCBkeW5hbWljX3NpemUgdG8gbG9uZyBiZWZvcmUKLQlwcmludGluZy4KLQkoZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24pOiBDYXN0IGJ5dGVfZ2V0IHRvIGxvbmcgYmVmb3JlCi0JcHJpbnRpbmcuCi0KLVdlZCBKdW4gIDkgMTE6NDA6MTYgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfc2VjdGlvbik6IENhc3QgdmFsdWVzIGZyb20gYnl0ZV9nZXQgdG8KLSAJW3Vuc2lnbmVkXSBsb25nIGZvciBwcmludGluZywgaW4gY2FzZSBpdCBpcyB3aWRlciB0aGFuIGxvbmcuCi0JKGRpc3BsYXlfYmxvY2spOiBMaWtld2lzZS4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogTGlrZXdpc2UuCi0JKGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uKTogTGlrZXdpc2UuICBEb24ndCBkZXBlbmQgb24KLSAJZXZhbHVhdGlvbiBvcmRlci4KLQotTW9uIEp1biAgNyAxMjoxNDo1NyAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHdpbmRyZXMuYyAodXNhZ2UpOiBGaXggdHlwby4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBVc2UgNjRiaXQgd2lkZSBmaWVsZHMgaW4gaW50ZXJuYWwgc3RyY3V0dXJlcyBldmVuIGlmCi0JdGFyZ2V0dGluZyBhIDMyYml0IGFyY2hpdGVjdHVyZS4KLQkoZHVtcF9yZWxvY2F0aW9ucyk6IFRha2UgYSBuZXcgcGFyYW1ldGVyIC0gdGhlIG51bWJlciBvZiBzeW1ib2xzCi0JaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgNjRiaXQgRUxGIGZpbGVzLgotCi0xOTk5LTA2LTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUpOiBVc2UgY29uc3RhbnRzIGZvciB0ZW1wb3JhcnkKLQlmaWxlIG5hbWVzLiAKLQotV2VkIEp1biAgMiAxMjozNDozNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IFJldmVydCAxOTk5MDQxMSBjaGFuZ2UuCi0KLU1vbiBNYXkgMzEgMDk6NTY6MjIgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfcmVsb2NzKTogRGV0ZXJtaW5lIHR5cGUgb2YgcmVsb2MgZnJvbQotCURUX1BMVFJFTCBhbmQgZnJvbSBzZWN0aW9uIHR5cGUuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2VsZl9jbGFzcyk6IERpc3BsYXkgdW5rbm93biBjbGFzcyBudW1iZXIuCi0JKGdldF9kYXRhX2VuY29kaW5nKTogRGlzcGxheSB1bmtub3duIGVuY29kaW5nIG51bWJlci4KLQkoZ2V0X29zYWJpX25hbWUpOiBEaXNwbGF5IHVua25vd24gQUJJIG51bWJlci4KLQkocHJvY2Vzc19maWxlX2hlYWRlcik6IERpc3BsYXkgdW5rbm93biB2ZXJzaW9uIG51bWJlci4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogRml4IHR5cG8uCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFkZCBleHRyYSBwYXJhbWV0ZXI6IGlzX3JlbGEgdG8KLQlzcGVjaWZ5IHRoZSBraW5kIG9mIHJlbG9jYXRpb25zIHRvIGJlIGR1bXBlZC4gIENhbGwgZ3Vlc3NfaXNfcmVsYQotCWlmIHRoaXMgcGFyYW1ldGVyIGhhcyBhIHZhbHVlIG9mIFVOS05PV04uCi0JKGd1ZXNzX2lzX3JlbGEpOiBOZXcgZnVuY3Rpb246ICBHdWVzcyB0aGUga2luZCBvZiByZWxvYyBiZWluZyB1c2VkCi0JYmFjZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgotCShwcm9jZXNzX3JlbG9jcyk6IERldGVybWluZSB0eXBlIG9mIHJlbG9jIGJlZm9yZSBjYWxsaW5nCi0JZHVtcF9yZWxvY2F0aW9ucy4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlYWRlbGYuYzogSW5jbHVkZSAiZWxmL2k5NjAuaCIuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBIYW5kbGUgRU1fOTYwLgotCi1UaHUgTWF5IDI3IDExOjU4OjMzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBQcmVzZXJ2ZSBkYXRlcyBvZiBhcmNoaXZlIG1lbWJlcnMgaWYKLQlyZXF1ZXN0ZWQuCi0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFsd2F5cyBwcmludCB0aGUgYWRkZW5kIG9uIFJFTEEKLQlzeXN0ZW1zIGV2ZW4gaWYgdGhlcmUgaXMgbm8gc3ltYm9sLgotCShwcm9jZXNzX3Byb2dyYW1faGVhZGVycyk6IFJlc2V0IGR5bmFtaWNfc2l6ZSBiZWZvcmUgbG9vcGluZwotCXRocm91Z2ggdGhlIHByb2dyYW0gaGVhZGVycy4KLQkocHJvY2Vzc192ZXJzaW9uX3NlY3Rpb25zKTogQ2FzdCBzaF9vZmZzZXQgdG8gdW5zaWduZWQgbG9uZyBmb3IKLQlwcmludGluZyBpbiBjYXNlIGJmZF92bWEgaXMgd2lkZXIuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogVXNlIGdldF9zeW1ib2xfaW5kZXhfdHlwZSB3aGVuIHByaW50aW5nCi0Jc3Rfc2huZHguCi0KLTE5OTktMDUtMTcgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmM6IGFkZCB2ZXJib3NlIG9wdGlvbgotCShtYWluKTogcHJvY2VzcyB2ZXJib3NlIG9wdGlvbgotCSogcmVzcmMuYyAobG9va19mb3JfZGVmYXVsdCk6IG5ldy4gIExvb2sgZm9yIHRoZSBkZWZhdWx0Ci0JcHJlcHJvY2Vzc29yIGluIGEgZ2l2ZW4gbG9jYXRpb24uCi0JKHJlYWRfcmNfZmlsZSk6IGZvciBmb28vYmFyLXdpbmRyZXMsIGxvb2sgZm9yIGZvby9iYXItZ2NjLAotCWZvby9nY2MgKGluIGNhc2Ugb2YgZm9vL3dpbmRyZXMpLCBhbmQgdGhlbiBnY2MgKHRoZSBvbGQgZGVmYXVsdCkuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZGVkdWNlX25hbWUpOiBOZXcgZnVuY3Rpb246IERlZHVjZSBuYW1lIG9mIHByb2dyYW0gdG8KLQlydW4uCi0JKG1jb3JlX2VsZl9vdXRfZmlsZSk6IE5ldyB2YXJpYWJsZTogTmFtZSBvZiBtY29yZS1lbGYgb3V0cHV0IGZpbGUuCi0JKG1jb3JlX2VsZl9saW5rZXIpOiBOZXcgdmFyaWFibGU6IE5hbWUgb2YgbGlua2VyIHRvIHVzZS4KLQkobWNvcmVfZWxmX2xpbmtlcl9mbGFncyk6IE5ldyB2YXJpYWJsZTogTGlua2VyIGZsYWdzIHRvIHBhc3MuCi0JKHNjYW5fb2JqX2ZpbGUpOiBDYWNoZSBmaWxlbmFtZXMgaWYgbmVjZXNzYXJ5LgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkobWFpbik6IFN1cHBvcnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtTSAoZ2VuZXJhdGUgYW4KLQltY29yZS1lbGYgb3V0cHV0IGZpbGUpIC1MIChuYW1lIG9mIGxpbmtlciB0byB1c2UpIC1GIChmbGFncyB0bwotCXBhc3MgdG8gbGlua2VyKS4gCi0JKG1jb3JlX2VsZl9jYWNoZV9maWxlbmFtZSk6IFN0b3JlIGEgZmlsZW5hbWUgaW4gYSBjYWNoZS4KLQkobWNvcmVfZWxmX2dlbl9vdXRfZmlsZSk6IE5ldyBmdW5jdGlvbjogR2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUKLQlwZXIgdGhlIG1jb3JlLWVsZiBzcGVjLgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKEJVSUxEX01JU0MpOiBCdWlsZCBkbGx0b29sIGZvciBtY29yZQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogZGxsdG9vbC5jOiBVcGRhdGUgZXhhbXBsZSBpbiBjb21tZW50LgotCShETExUT09MX01DT1JFKTogRGVmaW5lLgotCShETExUT09MX01DT1JFX0VMRik6IERlZmluZS4KLQkoRFJFQ1RWRV9TRUNUSU9OX05BTUUpOiBEZWZpbmUuCi0JKG1jb3JlX2JlX2p0YWIsIG1jb3JlX2xlX2p0YWIpOiBCaW5hcnkgZm9yIHBlcmZvcm1pbmcgYW4gbWNvcmUKLQlqdW1wIHRvIGFkZHJlc3MuCi0JKG10YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBtY29yZSB2YXJpYW50cy4KLQkocnZhYWZ0ZXIsIHJ2YWJlZm9yZSwgYXNtX3ByZWZpeCk6IEFkZCBtY29yZSBzdXBwcG9ydC4KLQkoc2Nhbl9kcmVjdHZlX3N5bWJvbHMpOiBVc2UgRFJFQ1RWRV9TRUNUSU9OX05BTUUuCi0JKG1ha2VfaGVhZCwgbWFrZV90YWlsKTogQ29wZSBpZiBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLgotCSh1c2FnZSk6IEltcHJvdmUgbGF5b3V0LgotCQotMTk5OS0wNS0xMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IGFkZCBjb2RlIHRvIHN1cHByZXNzIGNlcnRhaW4gb3V0cHV0IGZyb20gY3BwLCByZXBsYWNlCi0JYWxsIHJldHVybnMgd2l0aCBNQVlCRV9SRVRVUk4KLQkoTUFZQkVfUkVUVVJOKTogbmV3LCBpbXBsZW1lbnQgdGhlIHN1cHByZXNzaW9uIGJ5IHJldHVybmluZwotCUlHTk9SRURfVE9LRU4gYXMgbmVlZGVkLgotCShjcHBfbGluZSk6IHJlbWVtYmVyIHdoaWNoIGZpbGUgd2UncmUgaW4sIG1hcmsgZGF0YSBmcm9tIGluY2x1ZGVkCi0JKi5oIGZpbGVzIGZvciBzdXBwcmVzc2lvbi4KLQkqIHJjcGFyc2UueSAoaW5wdXQpOiBhbGxvdyBJR05PUkVEX1RPS0VOIG91dHNpZGUgb2Yga25vd24gY29uc3RydWN0cwotCi0xOTk5LTA1LTEwICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogd2luZHJlcy5jIChxdW90KTogUXVvdGUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgaW4gYSBzdHJpbmcKLQkobWFpbik6IHF1b3RlIHBhcmFtZXRlcnMgdG8gY3BwIHRoYXQgbWlnaHQgaGF2ZSBtZXRhY2hhcmFjdGVycyBpbgotCXRoZW0uICBBbGxvdyAtRCBhcyBhbiBhbGlhcyBmb3IgLS1kZWZpbmUgdG8gYWxsb3cgZm9yIHNoYXJpbmcgbWFrZQotCW1hY3JvcyB3aXRoIGdjYy4KLQotCSogb2JqZHVtcC5jIChkdW1wX3JlbG9jX3NldCk6IGRvbid0IGNvcmUgaWYgaG93dG8tPm5hbWUgaXMgTlVMTAotCi0JKiBNYWtlZmlsZS5hbTogR2l2ZSByZXNjb2ZmLmMgYSBjcHUtc3BlY2lmaWMgLUQgc28gaXQgY2FuIHNldAotCXRoZSBjb3JyZWN0IEJGRC4KLQkqIE1ha2VmaWxlLmluOiBkaXR0bwotCSogcmVzY29mZi5jICh3cml0ZV9jb2ZmX2ZpbGUpOiBTZXQgdGhlIGNvcnJlY3QgQkZECi0KLTE5OTktMDUtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiByZW5hbWUuYyAoc21hcnRfcmVuYW1lKTogRml4IHRlc3Qgb2Ygd2hldGhlciBmaWxlIGV4aXN0cy4KLQotMTk5OS0wNS0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGRpc3BsYXlfZW5kaWFuIGJhc2VkIG9uIHRhcmdldAotCWVuZGlhbmlzbS4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoaW50ZXJ3b3JrKTogUmVtb3ZlLgotCShhcm1faW50ZXJ3b3JrX2p0YWIpOiBVc2UgYnggaW5zbi4KLQkodGh1bWJfanRhYik6IExpa2V3aXNlLgotCShNQVJNX0lOVEVSV09SSyk6IE5ldyBtYWNoaW5lIHR5cGUuCi0JKHJ2YWFmdGVyKTogSGFuZGxlIGl0LgotCShydmFiZWZvcmUpIExpa2V3aXNlLgotCShhc21fcHJlZml4KTogTGlrZXdpc2UuCi0JKGdlbl9leHBfdHlwZSk6IENoZWNrIG1hY2hpbmUgdHlwZSBpbnN0ZWFkIG9mCi0JaW50ZXJ3b3JrIGZsYWcuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogTGlrZXdpc2UuCi0JKG1ha2VfaGVhZCk6IExpa2V3aXNlLgotCShtYWtlX3RhaWwpOiBMaWtld2lzZS4KLQkodXNhZ2UpOiBVcGRhdGUgbWFjaGluZSB0eXBlcy4KLQkobWFpbik6IFJlbW92ZSAtaW50ZXJ3b3JrIHN1cHBvcnQuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIHJlYWRlbGYuYyAoZ2V0X21hY2hpbmVfZmxhZ3MpOiAgQ2hlY2sgZm9yIEVGX0NQVTMyLgotICAgICAgICAoZ2V0X2RhdGFfZW5jb2RpbmcpOiBGaXggdHlwby4KLSAKLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9yYW5nZV90eXBlKTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIGluCi0JQkZENjQgY2FzZS4KLQotCSogcmVhZGVsZi5jIChnZXRfc2VjdGlvbl90eXBlX25hbWUpOiBVc2UgY29ycmVjdCB0eXBlcyBpbiBwcmludGYKLQlmb3JtYXRzLgotCShwcm9jZXNzX3JlbG9jcyk6IExpa2V3aXNlLgotCShwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IExpa2V3aXNlLgotCShwcm9jZXNzX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCShwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBMaWtld2lzZS4KLQotVHVlIEFwciAxMyAyMToyMjowMCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IE1hcmsgdGh1bWIgZnVuY3Rpb25zIGFzCi0JQ19USFVNQkVYVEZVTkMuCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5oIChlbnZpcm9uKTogRGVjbGFyZSBpdCwgaWYgbmVlZGVkLgotCShhbGxvY2EpIFtDX0FMTE9DQV06IERvbid0IHVzZSBnY2MncyBidWlsdGluIG9yIDxhbGxvY2EuaD4uCi0JKiBjb25maWd1cmUuaW4gKGVudmlyb24pOiBEZXRlY3QgZGVjbGFyYXRpb24uCi0JKiBubS5jIChtYWluKTogRG9uJ3QgZGVjbGFyZSBlbnZpcm9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLQkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogUGFkIG91dCB0aGUgLnJlbG9jIHNlY3Rpb24gdG8gYQotCTMyLWJ5dGUgYm91bmRhcnkgd2l0aCBkdW1teSByZWxvY2F0aW9ucywgdG8gbWFrZSB0aGUgQmVPUyBsb2FkZXIKLQloYXBweS4gIFBhdGNoIGZyb20gQm9iIE1hbnNvbiA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4uCi0KLTE5OTktMDQtMDggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoYysrZmlsdCk6IFVwZGF0ZWQgZm9yIC1qLy0tamF2YSwgYW5kIGhwL2VkZwotCWZvcm1hdHMuCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQWRkIGFiaWxpdHkgdG8gZGVjb2RlIG5ldyBjb25zdGFudHMgZm91bmQgaW4gQXByaWwgMjUKLQkxOTk4IERyYWZ0IG9mIFN5c3RlbSBWIEFCSSBzcGVjLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYnVjb21tLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCSogYWRkcjJsaW5lLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUKLQlzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIGl0LgotCSogYXIuYyAobWFpbik6IExpa2V3aXNlLgotCSogY29mZmR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogZGxsdG9vbC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubG1jb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5tLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNyY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN5c2R1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogd2luZHJlcy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiByZWFkZWxmLmMgKG1haW4pOiBDYWxsIGxvY2FsZSBzZXR0aW5nIGZ1bmN0aW9ucy4KLQotMTk5OS0wNC0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbik6IEZpeCBEV19PUF9jb25zdDh7c3x1fQotCWRlY29kZXMuIAotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVuYW1lLmM6IE5ldyBmaWxlLCBjb3BpZWQgb3V0IG9mIG9iamNvcHkuYyB3aXRoIGEgZmV3IGNoYW5nZXMuCi0JKiBidWNvbW0uaCAoc2V0X3RpbWVzLCBzbWFydF9yZW5hbWUpOiBEZWNsYXJlLgotCSogYXIuYzogRG9uJ3QgaW5jbHVkZSA8dXRpbWUuaD4uCi0JKGV4dHJhY3RfZmlsZSk6IENhbGwgc2V0X3RpbWVzIHJhdGhlciB0aGFuIHV0aW1lLgotCSh3cml0ZV9hcmNoaXZlKTogQ2FsbCBzbWFydF9yZW5hbWUgcmF0aGVyIHRoYW4gdW5saW5rIGFuZCByZW5hbWUuCi0JKiBvYmpjb3B5LmM6IERvbid0IGluY2x1ZGUgPHV0aW1lLmg+LgotCShzaW1wbGVfY29weSwgc21hcnRfcmVuYW1lLCBzZXRfdGltZXMpOiBNb3ZlIHRvIHJlbmFtZS5jLgotCShzdHJpcF9tYWluKTogVXBkYXRlIHNtYXJ0X3JlbmFtZSBjYWxsIGZvciBuZXcgcGFyYW1ldGVyLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHJlbmFtZS5jLgotCShvYmpjb3B5X1NPVVJDRVMsIHN0cmlwX25ld19TT1VSQ0VTKTogQWRkIHJlbmFtZS5jLgotCShhcl9TT1VSQ0VTLCByYW5saWJfU09VUkNFUyk6IEFkZCByZW5hbWUuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEVYVFJBX1BST0dSQU1TKTogUmVtb3ZlIGJhY2tzbGFzaCB3aGljaCB0cm91YmxlcyBjdXJyZW50IHZlcnNpb24KLQlvZiBhdXRvbWFrZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBkbGx3cmFwLmMgKG1haW4pOiBFeHBlY3QgY29ycmVjdCB0eXBlIGluIGZvcm1hdCBzdHJpbmcuCi0JKiByZXNyZXMuYzogSW5jbHVkZSAiYmZkLmgiLCAiYnVjb21tLmgiLCAibGliaWJlcnR5LmgiLCBhbmQKLQk8dGltZS5oPi4gIERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+IGFuZCA8ZXJybm8uaD4uCi0JKHdyaXRlX3Jlc19maWxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgZSBhbmQgaS4KLQkocmVhZF9yZXNvdXJjZV9lbnRyeSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIHJ0eXBlIGFuZCBuLgotCShyZWFkX3VuaXN0cmluZyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgbi4KLQotMTk5OS0wNC0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFycGFyc2UueTogRGVjbGFyZSB5eWxleC4KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBJbml0aWFsaXplIGJ5dGVzLiAgQWRkIGNvbW1lbnQKLQlmb3IgaW5jb3JyZWN0IHVzZSBvZiBieXRlcy4KLQkqIHJlYWRlbGYuYzogQ2hhbmdlIG1hbnkgZm9ybWF0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotMTk5OS0wNC0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChyZXNldF9zdGF0ZV9tYWNoaW5lKTogTmV3IGZ1bmN0aW9uLiAgUmVzZXRzIHRoZQotCXJlZ2lzdGVycyBvZiB0aGUgc291cmNlIGxpbmUgbnVtYmVyIHN0YXRlIG1hY2hpbmUuCi0JKHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCk6IFVzZSBzdGF0ZSBtYWNoaW5lLgotCShkaXNwbGF5X2RlYnVnX2xpbmVzKTogVXNlIHN0YXRlIG1hY2hpbmUuICBIYW5kbGUgbXVsdGlwbGUgbGluZQotCW51bWJlciBibG9ja3Mgd2l0aGluIHRoZSBzYW1lIHNlY3Rpb24uCi0KLTE5OTktMDMtMjkgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3ApOiBlbmRfc2VxdWVuY2UgYWxzbyByZXNldHMKLQl0aGUgbGluZSBudW1iZXIuCi0JKGRpc3BsYXlfZGVidWdfbGluZXMpOiBhZHZhbmNlX2xpbmUgdGFrZXMgYSBzaWduZWQgb3BlcmFuZC4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogUHJpbnQgcmVmcyBhcyA8JXg+LCBhZGRyZXNzZXMgYXMgJSN4LAotCW90aGVycyBhcyAlZC4gIEhhbmRsZSBvdGhlciBsb2NhdGlvbiBleHByZXNzaW9uIGF0dHJpYnV0ZXMuCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IEhhbmRsZSBuZXN0aW5nLiAgQWx3YXlzIHByaW50IHRoZQlvZmZzZXQuCi0KLTE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogV2hlbiBjaGVja2luZyB3aGV0aGVyIHRvIGtlZXAgYQotCXN5bWJvbCwgY2hlY2sgdGhlIEJGRCBzZWN0aW9uIHN5bWJvbCBmb3IgYSBzeW1ib2wgd2l0aAotCUJTRl9TRUNUSU9OX1NZTSBzZXQuCi0KLTE5OTktMDMtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUHJpbnQgbmV3IFNvbGFyaXMgZHluYW1pYwotCXNlY3Rpb24gZW50cmllcy4gIENvcnJlY3QgcHJpbnRpbmcgb2YgRFRfUE9TRkxBR18xIGFuZCBEVF9GTEFHU18xLgotCi0xOTk5LTAzLTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlcXVlc3RfZHVtcCk6IE5ldyBmdW5jdGlvbi4KLQlSZW1vdmVkIGFyYml0YXJ5IGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgdGhhdCBjYW4gYmUKLQlkdW1wZWQuCi0KLVdlZCBNYXIgMTAgMTU6MTA6MTQgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UgJTA1ZCB0byBvdXRwdXQgdGhlIHN0dWIgbmFtZSBzbwotCW9yZGVyIGluIHRoZSBpbXBvcnQgbGlicmFyeSBpcyBwcmVzZXJ2ZWQuCi0KLTE5OTktMDItMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogRml4IGNvbXBpbGUgdGltZSB3YXJpbmdzLgotCi0xOTk5LTAyLTE3ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHJlc2Jpbi5jIChyZXNfdG9fYmluX3ZlcnNpb25pbmZvKTogSW5zdGVhZCBvZiBlbnRlcmluZyBhIHZhbHVlCi0JbGVuZ3RoIG9mIHplcm8gaW4gYSB2ZXJzaW9uIGluZm8gc3RyaW5nLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUKLQlsZW5ndGguCi0KLVR1ZSBGZWIgMTYgMTY6MDA6MzMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMy4gIENoYW5nZSBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuICBBZGQgY29tbWVudHMgZm9yIEFDX0RFRklORSBjYWxscy4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChyZWFkX2FuZF9kaXNwbGF5X2F0dHIpOiBBZGQgZGlzcGxheSBvZiBiYXNpYyB0eXBlCi0JZW5jb2RpbmdzLgotCShkaXNwbGF5X2RlYnVnX2FyYW5nZXMpOiBOZXcgZnVuY3Rpb246IERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIGEKLQkuZGVidWdfYXJhbmdlcyBzZWN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2luZm8pOiBEdW1wIHRhZ3MgZm91bmQgYWZ0ZXIgY29tcHVuaXQgZW50cnkuCi0KLQkqIGJpbnV0aWxzLnRleGk6IEZpeGVkIGJ1ZyBpbiByZWFkZWxmIGRvY3VtZW50YXRpb24uCi0KLU1vbiBGZWIgIDEgMTI6Mzg6MDEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiAgSGFuZGxlIEVNX0FSTSBhcyBSRUwuCi0KLTE5OTktMDEtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBEbyBub3QgcHJvZHVjZSBhIGhpc3RvZ3JhbSBvZgotCWJ1Y2tldCBjaGFpbnMgaWYgbm9uZSB3ZXJlIGZvdW5kLgotCi0xOTk5LTAxLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ZXJzaW9uLmM6IEFkZCAxOTk5IGNvcHlyaWdodC4KLQotCSogYmludXRpbHMudGV4aSAocmVhZGVsZik6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucwotCS0tZGVidWctZHVtcCBhbmQgLS1oaXN0b2dyYW0uCi0KLQkqIHJlYWRlbGYuYzogQWRkIGFiaWxpdHkgdG8gZGlzcGxheSBjb250ZW50cyBvZiBzb21lIG9yIGFsbCBvZiB0aGUKLQlEd2FyZjIgZGVidWcgc2VjdGlvbnMuICB7V29yayBvbmx5IHBhcnRpYWxseSBjb21wbGV0ZWR9LgotCShkaXNwbGF5X2RlYnVnX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfYWJicmV2KTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2FiYnJldl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShyZWFkX2xlYjEyOCk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfVEFHX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9BVF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfRk9STV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShmcmVlX2FiYnJldnMpOiBOZXcgZnVuY3Rpb24uCi0JKGFkZF9hYmJyZXYpOiBOZXcgZnVuY3Rpb24uCi0JKGFkZF9hYmJyZXZfYXR0cik6IE5ldyBmdW5jdGlvbi4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2Jsb2NrKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgSmFuIDE0IDIzOjM2OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZmR1bXAuYyAoeGNhbGxvYyk6IFJlbW92ZSwgaW4gbGliaWJlcnR5IG5vdy4KLQkqIHNyY29udi5jICh4Y2FsbG9jKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKHhjYWxsb2MpOiBMaWtld2lzZS4KLQotMTk5OS0wMS0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3NlY3Rpb25faGVhZGVycyk6IE9taXQgdHJhaWxpbmcgc3BhY2UgYXQgZW5kCi0Jb2Ygc2VjdGlvbiBoZWFkZXIgY29udGVudHMgbGluZS4KLQotV2VkIERlYyAxNiAxNzoyMDowNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlLgotCi1Nb24gRGVjIDE0IDEyOjU1OjM2IDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZGxsd3JhcC5jOiBJbmNsdWRlIGJmZC5oIGFuZCBidWNvbW0uaC4gIE1vdmUgZ2V0b3B0LmggaW5jbHVkZQotCWFmdGVyIGxpYmliZXJ0eS5oIGluY2x1ZGUuCi0KLVR1ZSBEZWMgIDggMTY6Mjk6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLjE6IEZpeCB0eXBvICgtZCB0byAtRCkuICBGcm9tIE5va3ViaSBIaXJvdGFrYQotCTxobm9rdWJpQHl5eS5vci5qcD4uCi0KLVN1biBEZWMgIDYgMTM6Mjg6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKFNGSUxFKTogQWRkIHNpemUgZmllbGQuCi0JKG9iamR1bXBfc3ByaW50Zik6IE1lcmdlIGJvdGggdmVyc2lvbnMgaW50byBvbmUuICBJbmNyZWFzZSBidWZmZXIKLQlzaXplIGFzIG5lZWRlZCB0byBhdm9pZCBvdmVyZmxvdy4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBDaGFuZ2UgYnVmIGZyb20gMTAwMCBieXRlcyB0byA1MC4gIENoYW5nZQotCWluaXRpYWxpemF0aW9uIGFuZCB1c2Ugb2Ygc2ZpbGUgdG8gbWF0Y2ggY2hhbmdlcyB0bwotCW9iamR1bXBfc3ByaW50Zi4KLQotCSogc3RyaXAuMTogRml4IHR5cG8gKC1WIHRvIC12KS4gIEZyb20gSXNzZWkgSGlyYXlhbWEKLQk8aXNzQG1haWwud2JzLm9yLmpwPi4KLQotMTk5OC0xMi0wMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBJbXByb3ZlIG91dHB1dCBmb3JtYXQgZm9yCi0JdmFyaW91cyBEVF8qIHZhbHVlcy4KLQotMTk5OC0xMi0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19taXBzX3NwZWNpZmljKTogUHJpbnQgLmNvbmZsaWN0IHNlY3Rpb24KLQljb250ZW50LgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IFByaW50IGxfZmxhZ3MgaW4gbGlibGlzdCBpbgotCXRleHR1YWwgZm9ybS4KLQotMTk5OC0xMS0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXIuYyAoZXh0cmFjdF9maWxlKTogQWRkIHNvbWUgcGFyYW5vaWEgY2hlY2tzIGZvciBuZWdhdGl2ZWx5Ci0Jc2l6ZWQgZmlsZXMuCi0KLVR1ZSBOb3YgMjQgMDk6Mzk6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoRElSX1NFUEFSQVRPUik6IERlZmluZSBhcyAnXFwnIGlmIFdJTjMyIGlzIGRlZmluZWQuCi0KLVR1ZSBOb3YgMTcgMTA6MjU6MjYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLU1vbiBOb3YgMTYgMTk6MTc6MjMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9iaW51dGlscy5wb3Q6IFJlZ2VuZXJhdGUuCi0KLU1vbiBOb3YgMTYgMTA6MTg6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlZ2VybmF0ZWQgZGVwZW5kZW5jaWVzLgotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1TYXQgTm92IDE0IDE0OjUwOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVidWcuYyAoZGVidWdfbmFtZV90eXBlKTogQ29ycmVjdCByZXR1cm4gdHlwZSBmcm9tIGZhbHNlIHRvCi0JREVCVUdfVFlQRV9OVUxMLgotCi1TYXQgTm92IDE0IDE0OjQ4OjIxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2tpcCBvdmVyIHJlbG9jcyBiZWxvdyBzdGFydAotCWFkZHJlc3MuCi0KLVR1ZSBOb3YgMTAgMTU6MzE6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBkZXBlbmRlbmN5IG9mIHJlYWRlbGYuYyBvbiBlbGYvZnIzMC5oCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotV2VkIE5vdiAgNCAxNjoyNTo1NSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgRlIzMC4KLQotTW9uIE5vdiAgMiAxNDo1OTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1GcmkgT2N0IDMwIDE1OjE0OjQ5IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmM6IGNoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBjeWd3aW4zMl8gdG8gY3lnd2luXywKLQljaGFuZ2UgQ3lnd2luIHRhcmdldCBkZWYgdG8gQ1lHV0lOLgotCi1XZWQgT2N0IDI4IDEwOjMxOjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFJlcGxhY2UgJ3Vuc2lnbmVkIGxvbmcnIHdpdGgKLQknYmZkX3ZtYScuCi0KLVR1ZSBPY3QgMjcgMTQ6Mzk6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IEFwcGxpZWQgdGhpcyBwYXRjaCBmcm9tIFBoaWxpcAotCUJsdW5kZWxsIDxwYkBuZXh1cy5jby51az46ICBNYWtlIGFkZHJlc3MgdmFyaWFibGVzIHVuc2lnbmVkIHRvCi0JYXZvaWQgcHJvYmxlbXMgd2hlbiBkaXNhc3NlbWJsaW5nIGNvZGUgYXQgaGlnaC1iaXQtc2V0IGFkZHJlc3Nlcy4KLQotTW9uIE9jdCAyNiAxNDowNzo1OSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHdyYXAuYyAoc3RyaGFzaCk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1haW4pOiBVc2UgaXQgdG8gc3VwcGx5IGltYWdlIGJhc2UgaWYgbm90IHN1cHBsaWVkIGJ5IHVzZXIuCi0gICAgICAgIChwcm9ncmFtX3ZlcnNpb24pOiBVcCB0byAwLjIuNC4KLQotTW9uIE9jdCAyNiAxNDowNzo1OSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHRvb2wuYyAoYWRkX3N0ZGNhbGxfYWxpYXMpOiBOZXcgZ2xvYmFsLgotICAgICAgICAobG9uZ19vcHRpb25zKTogQWRkIC0tYWRkLXN0ZGNhbGwtYWxpYXMgb3B0aW9uLgotICAgICAgICAobWFpbik6IEhhbmRsZSBpdC4KLSAgICAgICAgKHNjYW5fZHJlY3R2ZV9zeW1ib2xzKTogQWRkIGFsaWFzIGlmIC0tYWRkLXN0ZGNhbGwtYWxpYXMgaXMKLSAgICAgICAgc3BlY2lmaWVkLgotICAgICAgICAoc2Nhbl9maWx0ZXJlZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0gICAgICAgIChnZW5fZGVmX2ZpbGUpOiBPdXRwdXQgYWxpYXMgZm9yIHN0ZGNhbGwgc3ltcyBpZiBhcHByb3ByaWF0ZS4KLQotICAgICAgICAqIGJpbnV0aWxzLnRleGkgKGRsbHRvb2wpOiBEb2N1bWVudCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KLQotICAgICAgICAqIGRsbHdyYXAuYyAobG9uZ19vcHRpb25zKTogQWRkIC0tYWRkLXN0ZGNhbGwtYWxpYXMgb3B0aW9uLgotICAgICAgICAobWFpbik6IEhhbmRsZSBpdC4KLQotICAgICAgICAqIGRlZnBhcnNlLnkgKG9wdF9uYW1lKTogQWxsb3cgIi4iIGluIG5hbWUuCi0gICAgICAgICogZGxsdG9vbC5jIChkZWZfbmFtZSk6IFNldCBkbGxfbmFtZSBmcm9tIE5BTUUgZW50cnkgaW4gZGVmIGZpbGUuCi0gICAgICAgIChkZWZfbGlicmFyeSk6IFNldCBkbGxfbmFtZSBmcm9tIExJQlJBUlkgZW50cnkgaW4gZGVmIGZpbGUuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmMgKGxvbmdfb3B0aW9ucyk6IC0taW1wbGliIHN5bm9ueW0gZm9yIC0tb3V0cHV0LWxpYi4KLSAgICAgICAgKG1haW4pOiBQYXNzIC0tZXhwb3J0LWFsbCB0byBkbGx0b29sIG9ubHkgaWYgc3BlY2lmaWVkLgotICAgICAgICAocHJvZ3JhbV92ZXJzaW9uKTogVXAgdG8gMC4yLjMuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmMgKG15YmFzZW5hbWUpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtYWluKTogUnVuIGRsbHRvb2wgdG8gY3JlYXRlIGV4cG9ydCBkZWZpbml0aW9uIGZpbGUgYW5kIGltcG9ydAotICAgICAgICBsaWJyYXJ5IGZpbGUgaWYgbmVjZXNzYXJ5LgotICAgICAgICBDaGFuZ2UgZXhwX2ZpbGVfbmFtZSBzbyB0aGF0IGl0J3MgYmFzZWQgb24gdGhlIGRsbCBuYW1lLgotCi1TdW4gT2N0IDI1IDEwOjM3OjQ1IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsdG9vbC5jIChzY2FuX2FsbF9zeW1ib2xzKTogRml4IHBhdGNoIGVycm9yLgotCi1GcmkgT2N0IDE2IDIyOjU2OjIwIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogbm0uYyAoZGlzcGxheV9yZWxfZmlsZSk6IGZpeCAibm8gc3ltYm9scyIgbWVzc2FnZXMuCi0JKiBvYmpkdW1wLmMgKHNsdXJwX3N5bXRhYik6IGRpdHRvLgotCSogcG8vUE9URklMRVMuaW4sIHBvL2JpbnV0aWxzLnBvdDogcmVidWlsdAotCi1Nb24gT2N0IDEyIDE0OjI4OjAzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IFJlbmFtZSBmaWVsZCBmcm9tIFZhbHVlIHRvIEluZm8gdG8KLQltYXRjaCBuYW1lIG9mIGZpZWxkIGluIEVMRiBzdHJ1Y3R1cmVzLgotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogY2FsbCBBQ19FWEVFWFQgaW5zdGVhZCBvZiBBTV9FWEVFWFQgYW5kCi0JQU1fQ1lHV0lOMzIuCi0JKiBhY2xvY2FsLm00OiByZW1vdmUgbG9jYWwgQU1fRVhFRVhUL0FNX0NZR1dJTjMyIG1hY3Jvcy4KLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQlGcm9tIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PjoKLSAgICAgICAgKiBkbGx0b29sLmMgKHNjYW5fYWxsX3N5bWJvbHMpOiBEb24ndCByZS1leHBvcnQgc3ltYm9scyBleHBvcnRlZAotICAgICAgICBieSBvdGhlciBETExzLgotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChCVUlMRF9ETExXUkFQKTogQWRkLgotCShCVUlMRF9ETExXUkFQLCBETExXUkFQX1BST0cpOiBBZGQuCi0JKGJpbl9QUk9HUkFNUyk6IEFkZCBkbGx3cmFwLgotCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUgd2l0aCBhdXRvbWFrZQotCi0JRnJvbSBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT46Ci0gICAgICAgICogZGxsd3JhcC5jOiBOZXcgZmlsZSBmcm9tIGRsbGhlbHBlcnMgdjAuMi4xLgotCShwcmludF92ZXJzaW9uKTogTmV3IGZ1bmN0aW9uLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS12ZXJzaW9uLgotCShtYWluKTogSGFuZGxlLgotICAgICAgICAqIGR5bi1zdHJpbmcuaCwgZHluLXN0cmluZy5jOiBOZXcgZmlsZXMgZnJvbSBlZ2NzLTEuMS9nY2MuCi0gICAgICAgICogY29uZmlndXJlLmluIChCVUlMRF9ETExXUkFQKTogQWRkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVHVlIE9jdCAgNiAxODoyMDoxMCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAod2luZHJlc19TT1VSQ0VTKTogQWRkIHJlc3Jlcy5jLgotCSh3aW5kcmVzX09CSkVDVFMpOiBBZGQgcmVzcmVzLm8uCi0JKiBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZSB3aXRoIGF1dG9tYWtlCi0KLSAgICAgICAgRnJvbSBBbmRlcnMgTm9ybGFuZGVyIDxhbm9ybGFuZEBoZW0yLnBhc3NhZ2VuLnNlPi4KLSAgICAgICAgKiByZXNyZXMuYzogTmV3IGZpbGUuICBJbXBsZW1lbnRhdGlvbiBvZiByZWFkX3Jlc19maWxlIGFuZAotICAgICAgICB3cml0ZV9yZXNfZmlsZSBmdW5jdGlvbnMgZm9yIHdpbmRyZXMuCi0gICAgICAgICogcmNwYXJzZS55OiBIYW5kbGUgQ09OVFJPTCdzIHdpdGggbmFtZWQgY2xhc3Nlcy4KLSAgICAgICAgKiByZXNiaW4uYzogQnVnIGluIHJlc190b19iaW5fZGlhbG9nIGFuZCBiaW5fdG9fcmVzX2RpYWxvZwotICAgICAgICB3aGVuIGRpYWxvZyBpcyBleHRlbmRlZDogVGhlIHZlcnNpb24gYW5kIHNpZ25hdHVyZSBmaWVsZHMgc2hvdWxkCi0gICAgICAgIGJlIHJldmVyc2VkIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4gSWQgaXMgMzIgYml0cyBsb25nIGluCi0gICAgICAgIGV4dGVuZGVkIGRpYWxvZ3MuCi0gICAgICAgICogcmVzcmMuYyAod3JpdGVfcmNfZGlhbG9nKTogcHJvcGVybHkgcHJpbnQgY29udHJvbHMgd2l0aCBuYW1lZAotICAgICAgICBjbGFzc2VzLgotICAgICAgICAqIHdpbmRyZXMuYyAocmVhZF9yZXNfZmlsZSwgd3JpdGVfcmVzX2ZpbGUpOiBSZW1vdmUgc3R1YnMuCi0gICAgICAgICogcmVzcmVzLmMgKHdyaXRlX3Jlcyk6IFJlbmFtZSBSVF9BQ0NFTEVSQVRPUlMgdG8gUlRfQUNDRUxFUkFUT1IuCi0KLVN1biBPY3QgIDQgMjA6MzQ6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBOb2t1YmkgSGlyb3Rha2EgPGhub2t1YmlAeXl5Lm9yLmpwPjoKLQkqIG9iamNvcHkuMTogRml4IHR5cG8gaW4gLS1yZW1vdmUtbGVhZGluZy1jaGFyIGRvY3MuCi0JKiBvYmpkdW1wLjE6IEZpeCBmb3JtYXR0aW5nIGluIC0tc3RhYnMgZG9jcy4KLQotU2F0IFNlcCAxOSAyMzozMzo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjcGFyc2UueSAobWVtZmxhZ3NfbW92ZSk6IENvcnJlY3QgcmVjdXJzaW9uLgotCi0xOTk4LTA5LTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWJvbF90YWJsZSk6IFByaW50IGluIGhpc3RvZ3JhbSBob3cgbWFueQotCXN5bWJvbHMgYXJlIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgY2hhaW4gbGVuZ3RoLgotCi1TdW4gU2VwICA2IDE2OjE1OjQ3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzKTogRG8gbm90IHRyeSB0byBkdW1wIGVtcHR5Ci0Jc2VjdGlvbnMuCi0KLVNhdCBTZXAgIDUgMTk6MTc6MTAgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRsbHRvb2wuYyAoc2Nhbl9hbGxfc3ltYm9scyk6IERvbid0IHJlLWV4cG9ydCBzeW1ib2xzIGV4cG9ydGVkCi0JYnkgb3RoZXIgRExMcy4KLQotMTk5OC0wOS0wMiAxNDo1MCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBQcmludCBEVF8qIHZhbHVlIG9ubHkgaWYKLQlkb19keW5hbWljLgotCShkb19oaXN0b2dyYW0pOiBOZXcgdmFyaWFibGUuCi0JKG9wdGlvbnMpOiBOZXcgbG9uZyBvcHRpb24gaGlzdG9ncmFtLiAgU2V0IGRvX2hpc3RvZ3JhbSBpZiB0aGlzCi0Jb3B0aW9uIGlzIHVzZWQuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1oaXN0b2dyYW0uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgMCByZXR1cm4gdmFsdWUgZnJvbSBnZXRvcHRfbG9uZy4gIEVuYWJsZQotCWRvX2hpc3RvZ3JhbSBmb3IgLWEuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogUmVhZCBoYXNoIHRhYmxlIGFsc28gaWYgb25seSBkb19oaXN0b2dyYW0uCi0JQWRkIGNvZGUgdG8gcHJpbnQgaGFzaCB0YWJsZSBoaXN0b2dyYW0uCi0KLTE5OTgtMDgtMjUgMTY6NDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUmVhZCBzeW1pbmZvIHNlY3Rpb24gaWYKLQlhdmFpbGFibGUuCi0JKHByb2Nlc3Nfc3ltaW5mbyk6IE5ldyBmdW5jdGlvbi4gIFByaW50IHN5bWluZm8gaW5mb3JtYXRpb24uCi0JKHByb2Nlc3NfZmlsZSk6IENhbGwgcHJvY2Vzc19zeW1pbmZvIGFuZCBmcmVlIHN5bWluZm8gZGF0YSBhdCB0aGUgZW5kLgotCi1XZWQgQXVnIDE5IDE2OjE5OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jICh1c2FnZSk6IEFkZCBmaWxlIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWFpbik6IERvbid0IHRyZWF0ICc/JyBhcyBhIHNwZWNpYWwgY2FzZSBpbiBnZXRvcHQgcmV0dXJuLgotCi0JKiBiaW51dGlscy50ZXhpIChkbGx0b29sKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuICBBZGQgc29tZSB1c2VzIG9mCi0JQHZhci4KLQotV2VkIEF1ZyAxOSAxNjoxOTowNyAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGxsdG9vbC5jIChnZW5fZGVmX2ZpbGUpOiBQbHVnIG1lbW9yeSBsZWFrLiAgRG9uJ3QgcHJpbnQKLQlkZW1hbmdsZWQgbmFtZSBpZiBpdCBpcyBOVUxMLgotCi0JU3VwcG9ydCBmb3IgZXhwb3J0aW5nIGFsbCBzeW1ib2xzIHRvIGFuIG91dHB1dCBleHBvcnQgZGVmIGZpbGU6Ci0JKiBkbGx0b29sLmMgKHtleHBvcnRfYWxsX3N5bWJvbHMsIG5vX2RlZmF1bHRfZXhjbHVkZXMsCi0Jbm9fZGVmYXVsdF9leGNsdWRlcywgZXhjbHVkZXN9KTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IHN0cmluZ19saXN0KTogVHlwZSB0byBob2xkIGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLgotCShzY2FuX2RyZWN0dmVfc3ltYm9scyk6IFJlbmFtZWQgZnJvbSBzY2FuX29wZW5fb2JqX2ZpbGUuCi0JKHNjYW5fZmlsdGVyZWRfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFkZF9leGNsdWRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hdGNoX2V4Y2x1ZGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzZXRfZGVmYXVsdF9leGNsdWRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbHRlcl9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2Nhbl9hbGxfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNjYW5fb3Blbl9vYmpfZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCBuZXcgb3B0aW9ucy4KLQkobWFpbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQotMTk5OC0wNy0zMSAyMToyNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMpOiBQcmludCBwX29mZnNldCB2YWx1ZSB3aXRoCi0Jc2l4IGhleCBkaWdpdHMuCi0JKGR5bmFtaWNfc2VnbWVudF9taXBzX3ZhbCk6IEFkZCBzdXBwb3J0IGZvciBEVF9NSVBTX0ZMQUdTLAotCURUX01JUFNfSVZFUlNJT04sIGFuZCBEVF9NSVBTX1RJTUVfU1RBTVAuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IEFsc28gcHJpbnQgc2Vjb25kcyBvZiB0aW1lIHN0YW1wLgotCi1GcmkgSnVsIDMxIDEwOjA0OjIzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogIEVNX0FSTSB1c2VzIHJlbGEgcmVsb2NzLgotCi0xOTk4LTA3LTMwIDE2OjI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfZHluYW1pY190eXBlKTogRG9uJ3QgdXNlZCBnZXR0ZXh0IG9uIHRoZSBuYW1lcy4KLQlBZGQgbmV3IERUXyogdmFsdWVzIGZyb20gU29sYXJpcy4gIERvbid0IHByaW50IG51ZW1yaWMgdmFsdWUgaW4KLQljYXNlIG9mIGFuIHVua25vd24gZW50cnkuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogSGFuZGxlIG5ldyBEVF8qIGVudHJpZXMuICBQcmludCBudW1lcmljCi0JdmFsdWVzIGluIGRlY2ltYWwsIG5vdCBoZXguCi0KLUZyaSBKdWwgMjQgMTY6Mjg6NTcgMTk5OCAgSmVmZiBIb2xjb21iICA8amVmZmhAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfZHluYW1pY190eXBlKTogUmVtb3ZlIGVtcHR5IGRlZmF1bHQgZnJvbSBzd2l0Y2gKLQlzdGF0ZW1lbnQuCi0KLUZyaSBKdWwgMjQgMTY6Mjg6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDI0IDA5OjM4OjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogUmVtb3ZlZCBzcHVyaW91cyBpbmNsdXNpb24gb2YgZWxmL2ludGVybmFsLmggYW5kCi0JZWxmLWJmZC5oLgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBDb25zaXN0YW50bHkgdXNlIGVsZl8gcHJlZml4IGZvciAqX3JlbG9jX3R5cGUKLQlmdW5jdGlvbnMuCi0KLVdlZCBKdWwgMjIgMTY6Mjk6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogQWRkIGR1bXBzIG9mIEhQUEEgYW5kIEFSQwotCXJlbG9jYXRpb25zLgotCi0JKHByb2Nlc3NfcmVsb2NzKTogRG8gbm90IGFib3J0IGlmIG5vIHN0cmluZyB0YWJsZSBjYW4gYmUgZm91bmQuCi0KLTE5OTgtMDctMjIgMTQ6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFJlbW92ZSBkZWZpbml0aW9uIG9mIGZ1bmN0aW9ucyB0byByZXR1cm4gcmVsb2NhdGlvbgotCXN5bWJvbCBzdHJpbmdzLiAgVGhleSBub3cgZ2V0IGltcGxpY2l0bHkgZGVmaW5lZCB3aGVuIGluY2x1ZGUgdGhlCi0Jc3lzdGVtIHNwZWNpZmljIEVMRiBoZWFkZXIuCi0KLTE5OTgtMDctMjIgMTM6NTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEJlZm9yZSBpbmNsdWRlIHN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyIGRlZmluZQotCVNUQVJUX1JFTE9DX05VTUJFUlMsIFJFTE9DX05VTUJFUiwgYW5kIEVORF9SRUxPQ19OVU1CRVJTLiAgRm9yIG5vdwotCXVzZWQgZm9yIHBwYywgbWlwcywgYW5kIG1uMTAzMDAuCi0KLVdlZCBKdWwgMjIgMTA6MjY6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogRGlzcGxheSBudW1iZXIgb2YgdW5yZWNvZ25pc2VkCi0JcmVsb2NhdGlvbnMuCi0KLTE5OTgtMDctMjEgMTM6MTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFVzZSBzeW1ib2xpYyBuYW1lcyBvZiByZWxvY2F0aW9uIGVudHJpZXMgZm9yIHRoZSB2YXJpb3VzCi0JYXJjaGl0ZWN0dXJlcy4gIENvcnJlY3QgbW9yZSBsYXlvdXQgZGV0YWlscy4KLQlQcmludCBuYW1lcyBvZiBNSVBTIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICBQcmludCBBbHBoYSwgQVJNLCBhbmQKLQlNSVBTIHJlbG9jYXRpb24gdHlwZSBuYW1lcy4KLQotMTk5OC0wNy0yMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBBZGQgY29kZSBmb3Igc3RyaXAgYWxsIHN5bWJvbHMgY2FzZS4KLSAgICAgICAgKGNvcHlfb2JqZWN0cyk6IFN0cmlwIGFsbCBjYXNlIGlzIG5vdyBwcm9jZXNzZWQgYWxzbyB0aHJvdWdoCi0JZmlsdGVyX3N5bWJvbHMuICBObyBtYXJraW5nIHN5bWJvbHMgdXNlZCBpbiByZWxvY2F0aW9ucyB3aGVuIHN0cmlwCi0JYWxsIHN5bWJvbHMgY2FzZS4KLQkoY29weV9zZWN0aW9uKTogV2hlbiBzdHJpcCBhbGwgc3ltYm9scyBjYXNlLCByZW1vdmUgcmVsb2NhdGlvbnMKLQl3aGljaCBhcmUgbm90IGluIGtlZXAgc3RyaXAgc3BlY2lmaWMgbGlzdC4KLQkoc3RyaXBfbWFpbik6IFJlbW92ZSBndWFyZCBgc3RyaXBfc3BlY2lmaWNfbGlzdCA9PSBOVUxMJyBmb3IKLQlzZXR0aW5nIHVwIHN0cmlwIGFsbCBzeW1ib2xzIGJ5IGRlZmF1bHQuCi0KLU1vbiBKdWwgMjAgMTI6NTE6MTYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFkZHIybGluZS5jIChmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbik6IE9ubHkgY29uc2lkZXIgYSBzZWN0aW9uCi0JaWYgdGhlIHBjIHZhbHVlIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiBpdC4KLQkodHJhbnNsYXRlX2FkZHJlc3Nlcyk6IERvbid0IGNyYXNoIGlmIGZ1bmN0aW9ubmFtZSBvciBmaWxlbmFtZSBhcmUKLQludWxsLgotCi0xOTk4LTA3LTIwIDA3OjQ1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWJvbF90YWJsZSk6IEZpeCBsaXR0bGUgYWxpZ25tZW50IHByb2JsZW0KLQlpbiBwcmludGVkIHRhYmxlIGhlYWRlci4KLQotMTk5OC0wNy0yMCAwNzoxNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQ29ycmVjdCByZWFkaW5nIG9mIC5keW5hbWljIHNlY3Rpb24uCi0JKGR5bmFtaWNfc2VjdGlvbik6IE5vdyBhIGdsb2JhbCB2YXJpYWJsZS4KLQkocHJvY2Vzc19taXBzX2ZwZV9leGNlcHRpb24sIHByb2Nlc3NfbWlwc19zcGVjaWZpYywKLQlwcm9jZXNzX2FyY2hfc3BlY2lmaWMpOiBOZXcgZnVuY3Rpb25zLgotCShnZXRfZmlsZV9oZWFkZXIpOiBDYWxsIHByb2Nlc3NfYXJjaF9zcGVjaWZpYy4KLQotMTk5OC0wNy0xOSAxNToxNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogRml4IHNldmVyYWwgdmVyc2lvbmluZyByZWxhdGVkIGJ1Z3MuICBQcm9kdWNlIG5pY2VyCi0Jb3V0cHV0LgotCUFkZCBzdXBwb3J0IGZvciBwcm9jZXNzb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gTUlQUy4KLQotRnJpIEp1bCAxMCAxNTo1Nzo1OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFN3aXRjaCBwcm90b3R5cGVzIGZyb20gdW5zaWduZWQgc2hvcnQgdG8gdW5zaWduZWQKLQlpbnQuCi0KLUZyaSBKdWwgMTAgMTY6MTc6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBDaHJpc3RpYW4gSG9sbGFuZCA8Q0hvbGxhbmRAZGUubHVjZW50LmNvbT46Ci0JKiBpZWVlLmMgKHBhcnNlX2llZWUpOiBJbml0aWFsaXplIGluZm8uZ2xvYmFsX3ZhcnMgYW5kCi0JaW5mby5nbG9iYWxfdHlwZXMuCi0JKHBhcnNlX2llZWVfYXRuKTogSWdub3JlIHJlZ2lzdGVyIGxpZmV0aW1lIGluZm9ybWF0aW9uIHJlcG9ydGVkbHkKLQllbWl0dGVkIGJ5IE1SSSBjb21waWxlci4KLQotVGh1IEp1bCAgOSAxMzowODowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVsICA3IDIxOjQ4OjU0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcmVhZGVsZi5jIChieXRlX2dldCk6IFVzZSBQQVJBTVMgaW4gcHJvdG90eXBlLgotCShlcnJvcik6IE1ha2UgaXQgd29yayB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4KLQkod2Fybik6IExpa2V3aXNlLgotCShnZXRfdmVyX2ZsYWdzKTogRG9uJ3QgdXNlIGFuIEFOU0kgcHJvdG90eXBlIGluIHRoZSBkZWZpbml0aW9uLgotCi1UdWUgSnVsICA3IDEzOjI2OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBTZXQgc2l6ZSBjb3JyZWN0bHkgaWYgdGhlIHNpemUgb2YgdGhlCi0Jc2VjdGlvbiBpcyBub3QgYW4gZXZlbiBtdWx0aXBsZSBvZiB0aGUgaW50ZXJsZWF2ZS4gIEJhc2VkIG9uIHBhdGNoCi0JZnJvbSBCcmlvbiBTdG9uZSA8QnJpb24uU3RvbmVAYXR0d3MuY29tPi4KLQotVGh1IEp1bCAgMiAxNDowMTozNCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotCSogY29uZmlndXJlLmNvbTogQWRkIHZheC92bXMgc3VwcG9ydC4KLQkqIG1ha2VmaWxlLnZtcy1pbjogUmVuYW1lZCBmcm9tIG1ha2VmaWxlLnZtcy4gIEFkZCBzdWJzdGl0dXRpb25zCi0Jbm93IGRvbmUgYnkgY29uZmlndXJlLmNvbS4KLQotV2VkIEp1bCAgMSAyMDo0Mzo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEhhbmRsZSA0IGFuZCA4IGJ5dGUgc2lnbmVkCi0gCWludGVnZXJzIHdpdGggcmVhbCB1cHBlciBib3VuZHMuICBIYW5kbGUgYSBsb3dlciBib3VuZCBvbmUgbGFyZ2VyCi0gCXRoYW4gdGhlIHVwcGVyIGJvdW5kIGFzIGEgc2lnbmVkIGludGVnZXIuICBIYW5kbGUgOCBieXRlIHNpZ25lZAotCWludGVnZXJzLgotCShzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlKTogT3B0aW9uYWxseSByZXR1cm4gdGhlIGRlbWFuZ2xlZCBuYW1lIG9mCi0JdGhlIHRlbXBsYXRlLgotCShzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZCk6IFRyZWF0IGEgdGVtcGxhdGUgbmFtZSBhcyBhIHRhZ2dlZAotCXR5cGUuCi0JKHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlKTogTGlrZXdpc2UuCi0KLVdlZCBKdWwgIDEgMTY6Mjk6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jOiBNaW5vciBmb3JtYXR0aW5nIGltcHJvdmVtZW50cy4KLQkqIHJlYWRlbGYuYzogTWlub3Igb3V0cHV0IGZvcm1hdHRpbmcgaW1wcm92ZW1lbnQuCi0KLVdlZCBKdWwgIDEgMTQ6MjM6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByY2xleC5sOiBBZGQgY2FzdHMgYW5kIGNoYW5nZSB0eXBlcyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIHJjcGFyc2UueTogTGlrZXdpc2UuCi0JKiByZXNiaW4uYzogTGlrZXdpc2UuCi0JKiByZXNjb2ZmLmM6IExpa2V3aXNlLgotCSogcmVzcmMuYzogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEhGSUxFUyk6IFJlbW92ZSByZWFkZWxmLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBBbmRyZXcgS296aW4KLQk8QW5kcmV3LktvemluQHAxNC5mOTYwLm41MDIwLnoyLmZpZG9uZXQub3JnPjoKLQkqIHdpbmR1bmkuaDogTmV3IGZpbGUsIGZyb20gd2luZHJlcy5oLgotCSogd2luZHVuaS5jOiBOZXcgZmlsZSwgZnJvbSB3aW5kcmVzLmMuCi0JKiB3aW5kcmVzLmM6IE1vdmUgVW5pY29kZSBmdW5jdGlvbnMgaW50byB3aW5kdW5pLmMuCi0JKiB3aW5kcmVzLmg6IE1vdmUgVW5pY29kZSBkZWNsYXJhdGlvbnMgaW50byB3aW5kdW5pLmguICBJbmNsdWRlCi0Jd2luZHVuaS5oLgotIAkoUlRfQUNDRUxFUkFUT1IpOiBSZW5hbWUgZnJvbSBSVF9BQ0NFTEVSQVRPUlMgdG8gbWF0Y2ggV2luZG93cwotCW1hY3JvLiAgQ2hhbmdlIGFsbCB1c2VzLgotCShSVF9QTFVHUExBWSwgUlRfVlhEKTogQ29ycmVjdCB2YWx1ZXMuCi0JKiBNYWtlZmlsZS5hbSAoSEZJTEVTKTogQWRkIHdpbmRyZXMuaC4KLQkoQ0ZJTEVTKTogQWRkIHdpbmR1bmkuYy4KLQkod2luZHJlc19TT1VSQ0VTKTogQWRkIHdpbmR1bmkuYy4KLQotTW9uIEp1biAyOSAxNzowMToyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFVzZSBCRkQgSW50ZXJuYWwgYW5kIEV4dGVybmFsIEVsZiBzdHJ1Y3R1cmVzLgotCSogcmVhZGVsZi5oOiBSZW1vdmVkIC0gbm8gbG9uZ2VyIG5lZWRlZC4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVhZGVsZi5jJ3MgZGVwZW5kZW5jeSB1cG9uIHJlYWRlbGYuaC4KLQotMTk5OC0wNi0yNiAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IGtlZXBfc3BlY2lmaWNfbGlzdCA9PSBOVUxMIGFzIGFkZGl0aW9uYWwKLQljb25kaXRpb24gdG8gc2V0IHVwIHN0cmlwIGFsbCBzeW1ib2xzIGJ5IGRlZmF1bHQuCi0JKGNvcHlfYXJjaGl2ZSk6IGRvbid0IGNoYW5nZSBhcmNoaXZlIHdoZW4gZXJyb3IgaW4gb2JqZWN0IGZpbGVzIG9mCi0JdGhlIGFyY2hpdmUuCi0KLVdlZCBKdW4gMjQgMTc6NTM6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9udW1iZXIpOiBTaWduIGV4dGVuZCBuZWdhdGl2ZSB2YWx1ZXMgY29ycmVjdGx5IGlmCi0JYmZkX3ZtYSBpcyBsYXJnZXIgdGhhbiB1bnNpZ25lZCBsb25nLgotCi1UdWUgSnVuIDIzIDE0OjU1OjA1IDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IGxldCBFWEVFWFQgaW50ZXJmZXJlCi0Jd2l0aCB0aGUgcHJvZ3JhbSB0cmFuc2Zvcm0gbmFtZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVuIDIzIDExOjA4OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogUmV3cml0ZSB0byB1c2UgZm9wZW4vZnJlYWQgcmF0ZWhyIHRoYW4gbW1hcC4KLQotCUFkZCAtLXNlY3Rpb24taGVhZGVycyBjb21tYW5kIGxpbmUgc3dpdGNoLCB3aGljaCBpcyBhbiBhbGlhcyBmb3IKLQktLXNlY3Rpb25zLgotCi0JSW5jb3Jwb3JhdGUgaW1wcm92ZW1udHMgbWFkZSBieSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+IGluY2x1ZGluZyBvdXRwdXQKLQlmb3JtYXR0aW5nIGFuZCB2ZXJzaW9uIGluZm8gZGlzcGxheS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgLS1zZWN0aW9uLWhlYWRlcnMgc3dpdGNoIHRvIHJlYWRlbGYuCi0KLU1vbiBKdW4gMjIgMTg6Mjg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEluY2x1ZGUgYmZkLmggYW5kIGJ1Y29tbS5oIGJlZm9yZSBzeXN0ZW0gaGVhZGVyCi0JZmlsZXMuCi0JKHBhcnNlX2FyZ3MpOiBDaGFuZ2UgdHlwZSBvZiBjIGZyb20gY2hhciB0byBpbnQuCi0KLVN1biBKdW4gMTQgMTQ6MjY6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jICh1c2FnZSk6IFdyaXRlIHRvIHN0ZG91dCwgbm90IHN0ZGVyci4KLQotRnJpIEp1biAxMiAxMzozMzo1MSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBEZXBlbmQgb24gLnBvdCBmaWxlIGlmIG1haW50YWluZXIgbW9kZQotCWVuYWJsZWQuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotRnJpIEp1biAxMiAxNjowNjoxNSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfcHBjX3JlbF90eXBlKTogTmV3IFBvd2VyUEMgc3VwcG9ydC4KLQkoZHVtcF9yZWxvY2F0aW9ucyk6IFBvd2VyUEMgdXNlcyBSRUxBIHJlbG9jYXRpb25zLgotCShnZXRfbWFjaGluZV9uYW1lKTogU3BlbGwgUG93ZXJQQyBjb3JyZWN0bHkuCi0JKGdldF9maWxlX3R5cGUpOiBDaGFuZ2UgdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVyIHRvIHVuc2lnbmVkLgotCShnZXRfbWFjaGluZV9uYW1lKTogRGl0dG8uCi0JKGdldF9tYWNoaW5lX2RhdGEpOiBSZXR1cm4gd2hldGhlciBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4uCi0JKGdldF9tYWNoaW5lX2ZsYWdzKTogSW50ZXJwcmV0IFBvd2VyUEMsIE0zMlIsIGFuZCBNSVBTIGZsYWdzLgotCShwcm9jZXNzX2VsZl9oZWFkZXIpOiBQcmludCBlbmRpYW4tZXNzLiAgQ29udmVydCBhbGwgbnVtZXJpYwotCWZvcm1hdHMgdG8gbG9uZyBvciB1bnNpZ25lZCBsb25nLiAgUHJpbnQgb3V0IG1hY2hpbmUgc3BlY2lmaWMgZmxhZwotCWJpdHMuCi0JKHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzKTogSW5jcmVhc2UgbmFtZSBieSAzIGNvbHVtbnMgYW5kIGRlY3JlYXNlCi0JdHlwZSBieSB0aGUgc2FtZSBzbyB0aGF0IC5nY2NfZXhjZXB0X3RhYmxlIGZpdHMgaW4gdGhlIHNwYWNlLgotCi0JKiByZWFkZWxmLmg6IEluY2x1ZGUgZWxmL3BwYy5oLCBlbGYvbWlwcy5oLCBhbmQgZWxmL20zMnIuaCB0byBnZXQKLQltYWNoaW5lIHNwZWNpZmljIGZsYWcgYml0cy4KLQotVGh1IEp1biAxMSAxNzo1NDoyNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFJlbW92ZSBleHRyYW5lb3VzICNpbmNsdWRlcy4gIEZpeCB3YXJuaW5ncyBwcm9kdWNlZAotCWJ5IC1XYWxsIHdoZW4gY29tcGlsaW5nIHVuZGVyIExpbnV4LgotCi0JKiBNYWtlZmlsZS5hbSAocmVhZGVsZl9MREFERCk6IEFkZCAkKExJQklCRVJUWSkuCi0KLVRodSBKdW4gMTEgMTg6MzA6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgc2VsZl9jcm9zc3JlZiBmaWVsZC4KLQkocGFyc2Vfc3RhYl9zdHJpbmcpOiBJZiBhIHRhZyBpcyBhIGNyb3NzIHJlZmVyZW5jZSB0byBpdHNlbGYsCi0JZG9uJ3QgZGVmaW5lIGl0IGluIHRoZSB0YWdzIGxpc3QuCi0JKHBhcnNlX3N0YWJfdHlwZSk6IFNldCBpbmZvLT5zZWxmX2Nyb3NzcmVmLgotCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QpOiBEZWZpbmUuCi0JKGRlYnVnX2dldF9yZWFsX3R5cGUpOiBBZGQgbGlzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JQ2hlY2sgZm9yIGNpcmN1bGFyaXR5IHRvIGF2b2lkIGNyYXNoaW5nIHdoZW4gaXQgb2NjdXJzLgotCi1UaHUgSnVuIDExIDE0OjQ4OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogTmV3IGZpbGU6IERpc3BsYXkgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlLgotCSogcmVhZGVsZi5oOiBOZXcgZmlsZTogSGVhZGVyIGZpbGUgZm9yIHJlYWRlbGYuYwotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyB0byBidWlsZCByZWFkZWxmLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCByZWFkZWxmLgotCSogTkVXUzogTWVudGlvbiBpbmNsdXNpb24gb2YgcmVhZGVsZiBpbnRvIGJpbnV0aWxzLgotCSogcG8vUE9URklMRVMuaW47IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDUgMTg6NDM6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBBZGp1c3QgdGhlIHNlY3Rpb24gc2l6ZSBpZiBjb3B5X2J5dGUKLQlpcyA+PSAwLgotCShjb3B5X3NlY3Rpb24pOiBEbyBub3QgY2FsbCBiZmRfc2V0X3NlY3Rpb25fc2l6ZS4KLQotVGh1IEp1biAgNCAwOToxMjoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UpOiBBZGQgbWlzc2luZyBcblwgZnJvbSBoZWxwIGRlc2NyaXB0aW9uLgotCi1XZWQgSnVuICAzIDE5OjMxOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFlBQ0MpOiBDb3JyZWN0IGJpc29uIC1MIG9wdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1wLy0tcHJpdmF0ZS1oZWFkZXJzLgotCi1XZWQgSnVuICAzIDEyOjA5OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogQWRkIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uczogLS1jaGFuZ2Utc2VjdGlvbi1sbWEKLQlhbmQgLS1jaGFuZ2Utc2VjdGlvbi12bWEuICBSZW5hbWUgb2xkIGNvbW1hbmQgbGluZSBvcHRpb24KLQktLWFkanVzdC1zZWN0aW9uLXZtYSB0byAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MuICBSZW5hbWUKLQktLWFkanVzdC12bWEgdG8gLS1jaGFuZ2UtYWRkcmVzc2VzIGFuZCAtLWFkanVzdC1zdGFydCB0bwotCS0tY2hhbmdlLXN0YXJ0LiAgUHJvdmlkZSBhbGlhc2VzIHRvIHN1cHBvcnQgdGhlIG9sZCB2ZXJzaW9ucyBvZgotCXRoZXNlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi0JQ2hhbmdlIHRoZSBuYW1lcyBvZiBtYWNyb3MgYW5kIGVudW0gZWxlbWVudHMgdG8gdXBwZXIgY2FzZSB0bwotCW1hdGNoIHRoZSBHTlUgY29kaW5nIHN0YW5kYXJkLgotCi0JUmVwbGFjZSBjYWxscyB0byBmcHJpbnRmIChzdGRlcnIsLi4uKSB3aXRoIGNhbGxzIHRvIGZhdGFsICgpIG9yCi0Jbm9uX2ZhdGFsICgpIGFzIGFwcHJvcHJpYXRlLgotCi0JKiBvYmpjb3B5LjE6IERvY3VtZW50IGNvbW1hbmQgbGluZSBvcHRpb24gY2hhbmdlcy4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGNvbW1hbmQgbGluZSBvcHRpb24gY2hhbmdlcy4KLQotCSogYnVjb21tLmg6IE5ldyBleHBvcnRlZCBmdW50aW9uIGZyb20gYnVjb21tLmM6IG5vbl9mYXRhbCgpLgotCSogYnVjb21tLmMgKG5vbl9mYXRhbCk6IE5ldyBleHBvcnRlZCBmdW5jdGlvbi4gIEp1c3QgbGlrZSBmYXRhbCgpCi0JZXhjZXB0IHRoYXQgaXQgcmV0dXJucyByYXRoZXIgdGhhbiBjYWxsaW5nIHhleGl0KCkuCi0KLQkoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2FsbCBmYXRhbCgpIHJhdGhlciB0aGFuIGJmZF9mYXRhbCgpLgotCi0JKGNoZWNrX21hdGNoaW5nX2Zvcm1hdHMpOiBGaXggQyBmb3JtYXRpbmcuCi0KLQkocGFyc2Vfdm1hKTogQ2FsbCBmYXRhbCgpLgotCi1Nb24gSnVuICAxIDE4OjI2OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gWXVsaSBCYXJjb2hlbiA8eXVsaS5iYXJjb2hlbkB0ZWxyYWQuY28uaWw+OgotCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IEF2b2lkIGVuZGxlc3MgbG9vcHMgY29tcGFyaW5nCi0JZnVuY3Rpb24gYW5kIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuCi0KLUZyaSBNYXkgMjIgMTQ6MDI6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGR1bXBfaWF0KTogQ29tbWVudCBvdXQ7IG5vdCB1c2VkLgotCShkaXNwbGF5KTogUmVuYW1lIGZyb20gdGVsbC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotVGh1IE1heSAxNCAxNDowMDo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiBETExzLiAgQWRkIHN1cHBvcnQgZm9yCi0JaW50ZXJ3b3JraW5nIGJldHdlZW4gQVJNIGFuZCBUaHVtYiBwcm9ncmFtcyBhbmQgRExMcy4gIFRpZHkgdGhlCi0JY29kZS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgZGxsdG9vbC4KLQotCSogY29uZmlndXJlOiBCdWlsZCBkbGx0b29sIGZvciB0aHVtYi1wZSB0YXJnZXRzLgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBJbmNsdWRlIDE5OTggaW4gY29weXJpZ2h0IHN0cmluZ3MuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWIpOiBTdXBwb3J0IFdpbjMyIHN0eWxlIGRpcmVjdG9yeSBzZXBhcmF0b3JzLgotCi1TdW4gTWF5IDEwIDIyOjM0OjQ0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotRnJpIE1heSAgOCAxMDozMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhci5jICh1c2FnZSk6IEV4dGVuZCBpbmZvcm1hdGlvbiBwcm92aWRlZCBhYm91dCBjb21tYW5kIGxpbmUKLQlvcHRpb25zLgotCi1XZWQgTWF5ICA2IDE1OjI4OjUxIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLiAgUGFzcyBDQyB2YWx1ZSB3aGVuCi0JY2FsbGluZyBtYWtlLgotCi1UdWUgTWF5ICA1IDE1OjE5OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBCdWlsZCBkbGx0b29sIGZvciB0aHVtYi1wZSB0YXJnZXQuCi0KLVN1biBNYXkgIDMgMjI6MDQ6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfUFJPR1JBTVMpOiBDaGFuZ2UgJChTUkNPTlZfUFJPRykgdG8gc3lzY29uZgotCXN5c2R1bXAgY29mZmR1bXAgdG8gYXZvaWQgZXh0cmEgJChFWEVFWFQpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBcHIgMjkgMjI6MjI6NTUgMTk5OCAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0b3AgYXBwZW5kaW5nIEVYRUVYVCB0byB0aGUgZW5kIG9mCi0JU1JDT05WX1BST0cgKHdyb25nIGJlY2F1c2UgdGhhdCB2YXJpYWJsZSBtYXkgY29udGFpbiBtdWx0aXBsZQotCXByb2dyYW1zKQotCSogTWFrZWZpbGUuYW06IGluc3RlYWQsIGFkZCBFWEVFWFRzIHRvIGVhY2ggU1JDT05WX1BST0cKLQlwcm9ncmFtCi0JKiBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZQotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBBcHIgMjggMTk6MTQ6MzQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IENvbmRpdGlvbmFsbHkgY2FsbCBzZXRsb2NhbGUuCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN5c2R1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGNvZmZkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGFyLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGJ1Y29tbS5oOiBJbmNsdWRlIDxsb2NhbGUuaD4gaWYgSEFWRV9MT0NBTEVfSC4KLQkoTENfTUVTU0FHRVMpOiBOb3cgY2FuIGJlIGRlZmluZWQgZXZlbiB3aGVuIEVOQUJMRV9OTFMuCi0KLVR1ZSBBcHIgMjggMTA6MzM6MDcgMTk5OCAgQmlsbCBNb3llciAgPHR0a0BjeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIElNUE9SVFM6Ci0JKiBkZWZwYXJzZS55IChpbXBsaW5lKTogQWRkIElNUE9SVFMgc3ludGF4ZXMuCi0JKiBkbGx0b29sLmMgKGlmdW5jdHlwZSwgaWhlYWR0eXBlKTogTmV3IHR5cGVkZWZzLgotCShpbXBvcnRfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFwcGVuZF9pbXBvcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWZfaW1wb3J0KTogQWRkIGFuIGVudHJ5IHRvIGltcG9ydF9saXN0LgotCShnZW5lcmF0ZV9pZGF0YV9vZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdlbl9leHBfZmlsZSk6IENhbGwgZ2VuZXJhdGVfaWRhdGFfb2ZpbGUuCi0JKiBkbGx0b29sLmggKGRlZl9pbXBvcnQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLU1vbiBBcHIgMjcgMTY6Mzk6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjkuNAotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXByIDIyIDE2OjAwOjM1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAwMDozMzo1NiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBTZWFyY2ggaW50bCBkaXJzIGZvciBoZWFkZXJzOyBkZWZpbmUKLQlMT0NBTEVESVIuCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgdGV4dGRvbWFpbi4KLQkqIGFyLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGNvZmZkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGRsbHRvb2wuYyAobWFpbik6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHdpbmRyZXMuYyAobWFpbik6IExpa2V3aXNlLgotCi1UdWUgQXByIDIxIDIyOjEzOjA4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBidWNvbW0uaDogQWRkZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzLgotCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAotCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuICBDcmVhdGUgcG8vTWFrZWZpbGUuaW4gYW5kCi0JcG8vTWFrZWZpbGUuICBVc2UgQU1fUFJPR19MRVguCi0JKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IE5ldyBtYWNyby4KLQkoUE9URklMRVMpOiBMaWtld2lzZS4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCShMREFERCk6IEFkZGVkIElOVExMSUJTLgotCShvYmpkdW1wX0xEQUREKTogTGlrZXdpc2UuCi0JKGNfX2ZpbHRfTERBREQpOiBMaWtld2lzZS4KLQkoYXJfTERBREQpOiBMaWtld2lzZS4KLQkocmFubGliX0xEQUREKTogTGlrZXdpc2UuCi0JKGRsbHRvb2xfTERBREQpOiBMaWtld2lzZS4KLQkod2luZHJlc19MREFERCk6IExpa2V3aXNlLgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2JpbnV0aWxzLnBvdDogTmV3IGZpbGVzLgotCi1UdWUgQXByIDIxIDE2OjA3OjE4IDE5OTggIFN0YW5pc2xhdiBCcmFiZWMgIDx1dHhAazMzMi5mZWxkLmN2dXQuY3o+Ci0KLQkqIG9iamNvcHkuYyAocHJlc2VydmVfZGF0ZXMpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKHNtYXJ0X3JlbmFtZSk6IElmIHByZXNlcnZlX2RhdGVzLCBjYWxsIHNldF90aW1lcyB3aGVuIGNvcHlpbmcuCi0JKHN0cmlwX21haW4pOiBSZW1vdmUgcHJlc2VydmVfZGF0ZXMgbG9jYWwgdmFyaWFibGUuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCi1UdWUgQXByICA3IDE1OjQxOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IEFkZCBkZWZwYXJzZS5oLCBkZWZwYXJzZS5jLCByY2xleC5jLAotCXJjcGFyc2UuaCwgYW5kIHJjcGFyc2UuYwotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBcHIgIDYgMTY6MjQ6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoUFJPR1MpOiBNb3ZlICQoQUREUjJMSU5FX1BST0cpIHRvIGVuZCwgc28gdGhhdAotCU1ha2VmaWxlLmluIGRvZXNuJ3QgaGF2ZSBhbiBlbXB0eSBjb250aW51YXRpb24gbGluZS4KLQkoYmluX1BST0dSQU1TKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAgMyAxNDo0ODo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCi0JKE1PU1RMWUNMRUFORklMRVMpOiBBZGQgYmludXRpbHMubG9nLCBiaW51dGlscy5zdW0sIGFuZCBhYmNkZWZnaCouCi0JKG1vc3RseWNsZWFuLWxvY2FsKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgQXByICAxIDE1OjU0OjE2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gWmFjayBXZWluYmVyZyA8emFja0ByYWJpLnBoeXMuY29sdW1iaWEuZWR1PiBhbmQgSC5KLiBMdQotCTxoamxAZ251Lm9yZz46Ci0JKiBhci5jICh1c2FnZSk6IE1lbnRpb24gUyBtb2RpZmllci4KLQkobWFpbik6IEFkZCBTIG1vZGlmaWVyLgotCSogYXIuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgUyBtb2RpZmllci4KLQotV2VkIEFwciAgMSAxMzoxMToyMyAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYmludXRpbHMudGV4aTogVXNlIEBpdGVteCBmb3IgYSBzZWNvbmRhcnkgaXRlbSBpbiBhIHRhYmxlLgotCi1UdWUgTWFyIDMxIDE4OjQ0OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVwLWluLnNlZDogQWRkIHJ1bGUgdG8gcmVtb3ZlIEBPQkpESVJALgotCSogTWFrZWZpbGUuYW0gKGRlcC5zZWQpOiBTdWJzdGl0dXRlIGZvciBAT0JKRElSQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMwIDEyOjQ3OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi0JKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBSZW1vdmUgZGVmcGFyc2UuaCwgYXJwYXJzZS5oLAotCXJjcGFyc2UuaCwgYW5kIG5sbWhlYWRlci5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVNhdCBNYXIgMjggMTc6Mzk6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogbmxtY29udi5jIChtYWluKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShhbHBoYV9tYW5nbGVfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCSogc2l6ZS5jIChwcmludF9zeXN2X2Zvcm1hdCk6IExpa2V3aXNlLgotCSogc3JjY29udi5jICh3cl9vYik6IExpa2V3aXNlLgotCSogd3JzdGFicy5jIChzdGFiX21vZGlmeV90eXBlKTogTGlrZXdpc2UuCi0JKHN0YWJfdmFyaWFibGUpOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IEluaXRpYWxpemUgdmFyaWFibGVzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbm0uYyAoc29ydF9zeW1ib2xzX2J5X3NpemUpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkqIHdyc3RhYnMuYyAoc3RhYl9lbmRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDIpOiBDaGFuZ2UgaiB0byB1bnNpZ25lZCBpbnQuCi0JKGRvX2xpbmVzKTogQ2hhbmdlIGwgdG8gdW5zaWduZWQgaW50LgotCSogbmxtaGVhZGVyLnkgKHl5bGV4KTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCSogbm0uYyAocHJpbnRfc3ltYm9sKTogQ2hhbmdlIGogdG8gbG9uZy4KLQkqIHNpemUuYyAobHByaW50X251bWJlcik6IENvbW1lbnQgb3V0LgotCSogc3Jjb252LmMgKHdyX29iKTogQ2hhbmdlIGkgdG8gYmZkX3NpemVfdHlwZS4KLQkqIHN5c2R1bXAuYyAodW5pdF9pbmZvX2xpc3QpOiBDb21tZW50IG91dC4KLQkob2JqZWN0X2JvZHlfbGlzdCwgcHJvZ3JhbV9zdHJ1Y3R1cmUsIGRlYnVnX2xpc3QpOiBMaWtld2lzZS4KLQkqIHN5c2luZm8ueSAoeXllcnJvcik6IFJldHVybiB2YWx1ZS4KLQotVGh1IE1hciAyNiAxNzowNjo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkZWZwYXJzZS55IChleHBsaXN0KTogQWxsb3cgZXBzaWxvbi4KLQlTdWdnZXN0aW9uIGZyb20gSm9uYXRoYW4tSGFycmlzQHBzaW9uLmNvbS4KLQotVGh1IE1hciAyNiAxNjo1OTowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ3Jvay5jIChkb19zZWN0aW9uc19wMSk6IFVzZSB0aGUgc2VjdGlvbidzIGxtYSBpbnN0ZWFkIG9mIHZtYQotCWZvciB0aGUgYmVuZWZpdCBvZiBwcm9tIGxvYWRlcnMuCi0KLVdlZCBNYXIgMjUgMTM6MDU6MzkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkoRElTVENMRUFORklMRVMpOiBOZXcgdmFyaWFibGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIE1hciAyNCAxOTozMzowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IEFjY2VwdCB7IGFuZCB9IGFzIHN5bm9ueW1zIGZvciBCRUdJTiBhbmQgRU5ELgotCi1GcmkgTWFyIDIwIDE5OjE4OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVR1ZSBGZWIgMjQgMTM6MDc6NTAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRGVsZXRlICIrK3BsYWNlIiBhZnRlciBjYWxsIHRvCi0JZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MuICBTZXQgZGlzYXNtX2luZm8uc3ltYm9scyB0byBhcnJheSBvZgotCXN5bWJvbHMgYXQgdGhlIGN1cnJlbnQgYWRkcmVzcy4KLQotV2VkIEZlYiAxOCAyMzozOTo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogSW5zdGFsbCBwcm9wZXJseSB3aGVuIGxuCi0JZmFpbHMgb3IgdG9vbGRpciA9PSBwcmVmaXguCi0KLVR1ZSBGZWIgMTcgMTg6NDA6NTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb21wYXJlX3NlY3Rpb25fbG1hKTogUmVuYW1lIGZyb20gX3ZtYS4KLSAgICAgICAgKGNvcHlfb2JqZWN0KTogR2FwIGZpbGwgYmFzZWQgb24gTE1BIG5vdCBWTUEuCi0JKiBiaW51dGlscy50ZXhpOiBVcGRhdGUgYW5kIGNsYXJpZnkuCi0JKiBvYmpjb3B5LjE6IExpa2V3aXNlLgotCi1UdWUgRmViIDE3IDIwOjM0OjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChnZW5fZXhwX2ZpbGUpOiBHZW5lcmF0ZSBfaW1wX18lcyBhcyB3ZWxsIGFzIF9faW1wXyVzLAotCWZvciBNaWNyb3NvZnQgY29tcGF0aWJpbGl0eS4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBMaWtld2lzZS4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IERvbid0IGFkZCAxIHRvIGhpbnQuCi0KLUZyaSBGZWIgMTMgMTY6Mzc6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCi1UaHUgRmViIDEyIDE0OjEzOjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVmbGV4Lmw6IEFjY2VwdCAnPycgaW4gc3ltYm9sIG5hbWVzLCBmb3IgVkMrKyBtYW5nbGVkIG5hbWVzLgotCUZyb20gTWlrZXkgPGplZmZkYkBuZXR6b25lLmNvbT4uCi0KLQkqIGFkZHIybGluZS5jICh1c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0JKiBhci5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChzaG93X3VzYWdlKTogTGlrZXdpc2UuCi0JKiBubS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogTGlrZXdpc2UuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiB3aW5kcmVzLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCi0KLVNhdCBGZWIgIDcgMTU6MzY6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVGh1IEZlYiAgNSAxMjoyMToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotRnJpIEphbiAzMCAxOToxNjoyOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0NfRk9SX1RBUkdFVCxubG1jb212Lm8pOiBDaGFuZ2UgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotCXRvIHRyYW5zZm9ybS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1UaHUgSmFuIDI5IDE2OjI0OjA0IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBkbGx0b29sLmM6IERlZmluZSBleGl0IHN0YXR1cyBtYWNyb3MgZm9yIF9XSU4zMiBidXQgbm90Ci0JX19DWUdXSU4zMl9fLgotCShnZW5fbGliX2ZpbGUpOiBDaGVjayBmb3IgZXhpdCBzdGF0dXMgb2YgdW5saW5rLgotCSogcmVzcmMuYzogRGVmaW5lIHBvcGVuIGFuZCBwY2xvc2UgaWYgX1dJTjMyIGJ1dCBub3QKLQlfX0NZR1dJTjMyX18uCi0KLVdlZCBKYW4gMjggMTc6NDU6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSB2Zm9yayBjaGVjay4KLQkqIG5sbWNvbnYuYzogTmV2ZXIgaW5jbHVkZSB2Zm9yay5oLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDI4IDE3OjQzOjAyIDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogT25seSBwYXNzIG9uZSBhcmd1bWVudCB0byBta2RpciBpZgotCV9XSU4zMiBidXQgbm90IF9fQ1lHV0lOMzJfXy4KLQkoc21hcnRfcmVuYW1lKTogQWRkIGNvZGUgZm9yIF9XSU4zMiAobm90IF9fQ1lHV0lOMzJfXyksIHRvIGNvcGUKLQl3aXRoIGRpZmZlcmVudCByZW5hbWUgYmVoYXZpb3VyIGFuZCBsYWNrIG9mIGNob3duLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBtaW5ndzMyIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBidWlsZAotCWRsbHRvb2wuCi0JKiBkbGx0b29sLmM6IE5ldmVyIGluY2x1ZGUgdmZvcmsuaC4KLQkocnVuKTogVXNlIHBleGVjdXRlIHJhdGhlciB0aGFuIHZmb3JrLgotCShnZW5fbGliX2ZpbGUpOiBDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX3NldF9hcmNoaXZlX2hlYWQgYW5kCi0JYmZkX2Nsb3NlLiAgQ2xvc2UgYWxsIHRoZSBCRkRzIGluIHRoZSBhcmNoaXZlIGJlZm9yZSBkZWxldGluZyB0aGUKLQl0ZW1wb3JhcnkgZmlsZXMuCi0KLVRodSBKYW4gMjIgMTY6MjI6NTUgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBZGQgZmxhZyBJTlNOX0hBU19SRUxPQyB0byB0ZWxsCi0JZGlzYXNzZW1ibHkgZnVuY3Rpb24gdGhlcmUgaXMgYSByZWxvYyBvbiB0aGlzIGxpbmUuCi0KLVdlZCBKYW4gMTQgMTU6Mjk6NDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHNoLCBoODMwMCk6IERlbGV0ZSB2YXJpYWJsZXMuCi0JKGFkZHJzaXplLCB0b29sbmFtZSwgcm5hbWVzKTogTmV3IHZhcmlhYmxlcy4KLQkod3JpdGVJTlQpOiBVc2UgYWRkcnNpemUuCi0JKHdyX3VuKTogVXNlIHRvb2xuYW1lLgotCSh3cl9oZCk6IFNldCB1cCBhZGRyc2l6ZSBldCBhbCBwcm9wZXJseSBmb3IgaDgzMDBbaHNdLgotCSh3YWxrX3RyZWVfc3ltYm9sKTogWmVybyBkc3kuICBVc2Ugcm5hbWVzLgotCSh3cl91biwgd3JfaGQsIHdyX29iLCB3cl9kdSk6IFVzZSBwcm9wZXIgYmZkIGFjY2VzcyBtYWNyb3MuCi0JKiBzeXNkdW1wLmMgKHNoLCBoODMwMCk6IERlbGV0ZSB2YXJpYWJsZXMuCi0JKGFkZHJzaXplKTogTmV3IHZhcmlhYmxlLgotCShnZXRJTlQpOiBVc2UgaXQuCi0JKGdldG9uZSk6IEluaXRpYWxpemUgaXQuCi0JKGdldEJJVFMpOiBSYW5nZSBjaGVjayBvbiBNQVguCi0KLU1vbiBEZWMgMjkgMTY6NTg6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBNYXR0aGV3IEJlbGxhbnRvbmkgPG1hdHRoZXdAY2hyeXNhbGlzLmNvbT46Ci0JKiBhci5jIChnZXRfcG9zX2JmZCk6IEFkZCBkZWZhdWx0X3Bvc25hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHJlcGxhY2VfbWVtYmVycyk6IERlZmF1bHQgdG8gcmVwbGFjaW5nIGluIHRoZSBzYW1lIHBvc2l0aW9uLgotCi1Nb24gRGVjIDIyIDExOjI3OjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmNsZXgubDogRG9uJ3QgcGVybWl0IGEgY29tbWEgaW4gYSBTVFJJTkcuCi0JKiByY3BhcnNlLnkgKGFjY19lbnRyeSk6IFdhcm4gaWYgYW4gaW5hcHByb3ByaWF0ZSBtb2RpZmllciBpcyB1c2VkCi0Jd2l0aCBhIG5vbiBWSVJUS0VZLgotCShhY2NfZXZlbnQpOiBGb3IgYSBjb250cm9sIGNoYXJhY3Rlciwgc2V0IFZJUlRLRVksIGFuZCBmb3JjZSB0aGUKLQljaGFyYWN0ZXIgdG8gdXBwZXJjYXNlLgotCShhY2Nfb3B0aW9ucyk6IERvbid0IHJlcXVpcmUgYSBjb21tYSBzZXBhcmF0b3IuCi0KLVR1ZSBEZWMgIDkgMTM6MjU6NDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNpemUuYyAoc2l6ZV9udW1iZXIpOiBOZXcgZnVuY3Rpb24gdG8gcHJvdmlkZSBzaXplIG9mIGZpZWxkLgotCSh7bCxyfXByaW50X251bWJlcik6IEZvciBvY3RhbCBhbmQgaGV4IGZpZWxkcywgcHJpbnQgZmllbGQgdXNpbmcKLQknMCcgYW5kICcweCcgc3VmZml4ZXMuICBEbyBub3QgaW5jbHVkZSBmb2xsb3dpbmcgdGFiLgotCShzeXN2X2ludGVybmFsX3NpemVyKTogU2l6ZSBzZWN0aW9uIG5hbWUsIHNlY3Rpb24gc2l6ZSwgYW5kIHZtYQotCWFkZHJlc3MgZmllbGRzLgotCShzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBVc2UgY2FsY3VsYXRlZCBzaXplcyBmb3IgdGhlIGNvbHVtbnMuCi0JKHByaW50X3N5c3ZfZm9ybWF0KTogU2l6ZSBjb2x1bW5zIGJlZm9yZSBwcmludGluZy4KLQkocHJpbnRfYmVya2VsZXlfZm9ybWF0KTogUHJpbnQgdGFicyBiZXR3ZWVuIG51bWJlcnMgbm93IHRoYXQKLQl7bCxyfXByaW50X251bWJlciBkb2Vzbid0LiAgUHJpbnQgZmllbGRzIHJpZ2h0IGp1c3RpZmllZC4KLQotTW9uIERlYyAgOCAxMToyMjowNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IFJlbW92ZSBjYWxsIHRvCi0JZGlzYXNtX3N5bWFkZHIoKSBhcyB0aGlzIGZ1bmN0aW9uIG5vIGxvbmdlciBleGlzdHMuCi0KLVR1ZSBEZWMgIDIgMTA6MjM6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBDYWxsIGRpc2FzbV9zeW1hZGRyKCkKLQl0byBhbGxvdyBiYWNrZW5kIHRvIGtub3cgd2hpY2ggc3ltYm9sIGhhcyBqdXN0IGJlZW4gZGlzcGxheWVkLgotCi1UdWUgRGVjICAyIDEzOjA2OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd2luZHJlcy5oIChFU0NBUEVfKik6IERlZmluZSBzdGFuZGFyZCBlc2NhcGUgc2VxdWVuY2VzLgotCSogcmNsZXgubCAoaGFuZGxlX3F1b3Rlcyk6IEhhbmRsZSBzdGFuZGFyZCBlc2NhcGUgc2VxdWVuY2VzLiAgV2FybgotCWFib3V0IGFuIHVucmVjb2duaXplZCBlc2NhcGUgY2hhcmFjdGVyLgotCSogd2luZHJlcy5jICh1bmljb2RlX3ByaW50KTogUHJpbnQgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4KLQkqIHJjcGFyc2UueSAoYWNjX2V2ZW50KTogSW5pdGlhbGl6ZSAkJC5uZXh0LgotCSogcmVzYmluLmMgKGJpbl90b19yZXNfbWVudWl0ZW1zKTogRG9uJ3Qgc2V0IE1FTlVJVEVNX1BPUFVQIG9yCi0JTUVOVUlURU1fRU5ETUVOVSBpbiB0aGUgbWVudSBpdGVtIGZsYWdzLgotCShiaW5fdG9fcmVzX2FjY2VsZXJhdG9ycyk6IEFsbG9jYXRlIGEgc3RydWN0dXJlICh0aGUgb2xkIGNvZGUKLQluZXZlciB3b3JrZWQpLgotCShyZXNfdG9fYmluX2FjY2VsZXJhdG9yKTogQ29ycmVjdCB0aGUgdGVzdCBmb3Igc2V0dGluZyBBQ0NfTEFTVC4KLQkocmVzX3RvX2Jpbl9kaWFsb2cpOiBTYXZlIHRoZSBleHRlbmRlZCBzdHlsZSByYXRoZXIgdGhhbiBzYXZpbmcKLQl0aGUgc3R5bGUgdHdpY2UuICBSZW1vdmUgdXNlbGVzcyBzaGFkb3dpbmcgbGVuZ3RoIHZhcmlhYmxlLiAgU2V0Ci0JdGhlIGxlbmd0aCBvZiBjb250cm9sIGRhdGEgY29ycmVjdGx5LgotCSogcmVzcmMuYyAod3JpdGVfcmNfZGlhbG9nKTogRG9uJ3QgcHJpbnQgdGhlIGNsYXNzIG9yIG1lbnUgaWYgdGhlCi0Jc3RyaW5nIGxlbmd0aCBpcyB6ZXJvLgotCi1Nb24gTm92IDI0IDE4OjUyOjQzIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX2FyZ3R5cGVzKTogRG9uJ3QgdHJ5IHRvIHBhcnNlIHRoZSBuYW1lIG9mIGEKLQlkZXN0cnVjdG9yIGFzIG1hbmdsZWQgYXJndW1lbnQgdHlwZXMuCi0KLU1vbiBOb3YgMTAgMTc6NTE6NDEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGFkZHIybGluZS5jICh0cmFuc2xhdGVfYWRkcmVzc2VzKTogVXNlIGJmZF9zY2FuX3ZtYSByYXRoZXIKLQl0aGFuIHN0cnRvbCB0byBzY2FuIGFkZHJlc3Nlcy4KLQotU3VuIE5vdiAgOSAxMTowMTozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmFtIChiaW5fUFJPR1JBTVMpOiBEb24ndCB1c2UgbGluZSBjb250aW51YXRpb25zIGhlcmUuCi0KLVR1ZSBOb3YgIDQgMTE6NTY6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfc2VjdGlvbik6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIKLQlpbmZvcm1hdGlvbiBmb3IgYSBzZWN0aW9uLgotCi1Nb24gTm92ICAzIDEyOjM2OjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChwYXJzZV9mbGFncyk6IE1ha2UgZmxhZyBjaGVjayBjYXNlIGluc2Vuc2l0aXZlLgotCUNoZWNrIGZvciBgY29udGVudHMnIGZsYWcuICBHaXZlIGFuIGVycm9yIGZvciB1bnJlY29nbml6ZWQgZmxhZ3MuCi0JKGNvcHlfc2VjdGlvbik6IElmIHRoZSBjb250ZW50cyBmbGFnIHdhcyBzZXQgZm9yIGEgc2VjdGlvbiB0aGF0Ci0JaGFkIG5vIGNvbnRlbnRzLCB6ZXJvIG91dCB0aGUgbmV3IGNvbnRlbnRzLgotCSogYmludXRpbHMudGV4aSAob2JqY29weSk6IERvY3VtZW50IGNvbnRlbnRzIHNlY3Rpb24gZmxhZy4KLQotU3VuIE5vdiAgMiAxNDo0OTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogTW92ZSBuZXcgc3RydWN0IGFuZCB2YXJpYWJsZSBkZWZpbml0aW9ucyB0byB0b3Agb2YKLQlmaWxlLiAgUmVtb3ZlIG9ic29sZXRlIGFkZF9zdHJpcF9zeW1ib2wgYW5kIGlzX3N0cmlwX3N5bWJvbAotCWRlY2xhcmF0aW9ucy4gIEFkZCBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciBhZGRfc3BlY2lmaWNfc3ltYm9sCi0JYW5kIGlzX3NwZWNpZmllZF9zeW1ib2wuCi0KLU1vbiBPY3QgMjAgMTU6MzE6NDMgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb20gKEhBVkVfU0JSSyk6IFVuZGVmaW5lLgotCi1UdWUgT2N0IDE0IDE2OjE0OjM1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4gIFJldHVybnMKLQl0cnVlIGlmIGEgc3ltYm9sIGNhbiBiZSBmb3VuZCBhdCB0aGUgYWRkcmVzcyBwYXNzZWQgaW4uCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgdGhlIHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgZmllbGQgdG8gcG9pbnQKLQl0byBvYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzLgotCi1GcmkgT2N0IDEwIDE0OjEzOjA5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYywgb2JqY29weS4xLCBiaW51dGlscy50ZXhpOiAibG9jYWxpemUiIGlzIGEgYmV0dGVyIG5hbWUKLQl0aGFuICJwcml2YXRpemUiLiAgVXBkYXRlIGFsbCByZWZlcmVuY2VzLgotCi1UaHUgT2N0ICA5IDE1OjU3OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoc3RyaXApOiBSZW1vdmUgZHVwbGljYXRlIC0tdGFyZ2V0LiAgRnJvbSBNYXJ0eQotCUxlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgotCi0JKiBubS5jIChsaW5lbm9fY2FjaGVfYmZkKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShsaW5lbm9fY2FjaGVfcmVsX2JmZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZGlzcGxheV9hcmNoaXZlKTogQ2xlYXIgbGluZW5vX2NhY2hlX2JmZCBhbmQgbGluZW5vX2NhY2hlX3JlbF9iZmQKLQl3aGVuIGNsb3NpbmcgYSBCRkQuCi0JKGRpc3BsYXlfZmlsZSk6IExpa2V3aXNlLgotCShwcmludF9zeW1ib2wpOiBVc2UgbGluZW5vX2NhY2hlX2JmZCBhbmQgbGluZW5vX2NhY2hlX3JlbF9iZmQKLQlpbnN0ZWFkIG9mIGNhY2hlX2JmZCBhbmQgY2FjaGVfcmVsX2JmZC4gIE1ha2Ugc2VjY291bnQgc3RhdGljLCBhbmQKLQlvbmx5IHNldCBpdCB3aGVuIHNldHRpbmcgcmVsb2NzLgotCi1XZWQgT2N0ICA4IDIxOjE5OjExIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoa2VlcF9zcGVjaWZpY19saXN0LCBwcml2YXRpemVfc3BlY2lmaWNfbGlzdCwKLQl3ZWFrZW5fc3BlY2lmaWNfbGlzdCk6IE5ldyB2YXJpYWJsZXMuCi0JKGtlZXBfc3ltYm9scyk6IFJlbW92ZWQuCi0JKGFkZF9zcGVjaWZpY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24gZnJvbSB0aGUgY2FyY2FzIG9mCi0JYWRkX3N0cmlwX3N5bWJvbC4gIFRha2VzIGEgbGlzdCBhcyBhbiBhcmd1bWVudC4KLQkoaXNfc3BlY2lmaWVkX3N5bWJvbCk6IExpa2V3aXNlIGZyb20gaXNfc3RyaXBfc3ltYm9sLgotCShmaWx0ZXJfc3ltYm9scyk6IEhvbm9yIHRoZSBuZXcgcHJpdmF0aXplIGFuZCB3ZWFrZW4gbGlzdHMuCi0JT3B0aW1pemUgYmZkX2FzeW1ib2xfbmFtZSBoYW5kbGluZy4KLQkoY29weV9vYmplY3QsIGNvcHlfb3B0aW9ucywgY29weV91c2FnZSk6IEFkZCBwcml2YXRpemUtc3ltYm9sICYKLQl3ZWFrZW4tc3ltYm9sIG9wdGlvbnMuCi0KLQkqIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogVXBkYXRlIGRvY3MuCi0KLVN1biBPY3QgIDUgMDk6MDU6NDQgMTk5NyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTWFrZSAiLS1wcmVmaXgtYWRkcmVzc2VzIgotIAlkaXNhc3NlbWJseSBhZGp1c3QgdG8gbWl4ZWQtbGVuZ3RoIGluc3RydWN0aW9ucy4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogQWRkICIweCIgcHJlZml4IGZvciBoZXhhZGVjaW1hbAotIAlzeW1ib2wtb2Zmc2V0cyBpbiBkaXNhc3NlbWJseS4KLQotRnJpIE9jdCAgMyAxMjowNDoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc2V0X3RpbWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgcmVwbGFjaW5nCi0JbWFrZV9zYW1lX2RhdGVzLgotCShzdHJpcF9tYWluKTogSWYgcHJlc2VydmVfZGF0ZXMsIHN0YXQgdGhlIGlucHV0IGZpbGUgYmVmb3JlCi0JY29weWluZyBpdCwgYW5kIGNhbGwgc2V0X3RpbWVzIGFmdGVyd2FyZC4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0KLQkqIHdyc3RhYnMuYyAod3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8pOiBDYXN0IHAgdG8KLQljaGFyICogd2hlbiBjYWxsaW5nIHN0cmNweSBhbmQgc3RybGVuLgotCi1XZWQgU2VwIDI0IDExOjM0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aQkoYXIgY21kbGluZSk6IERvY3VtZW50IHRoYXQgcSBub3cgd29ya3MgbGlrZSByLgotCUZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCi0KLQkqIGJpbnV0aWxzLnRleGkgKHNpemUpOiBUaGUgb2JqZWN0IGZpbGUgYXJndW1lbnQgaXMgb3B0aW9uYWwuCi0JRnJvbSBNYXJ0eSBMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgQXVnIDI2IDE3OjQ4OjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYRUVYVF9GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUuICBVc2UgaXQgaW4gYWxsCi0JcmVmZXJlbmNlcyB0byB0aGUgc3lzaW5mbyBwcm9ncmFtLgotCSogY29uZmlndXJlLmluOiBSZWJ1aWxkIHdpdGggbmV3IGJmZC9hY2luY2x1ZGUubTQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgOCAxNTozMjo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYzogSW5jbHVkZSA8dGltZS5oPi4KLQkoZGVmaW5lX3Jlc291cmNlKTogU2V0IGEgdGltZXN0YW1wIGZvciB0aGUgcmVzb3VyY2UuCi0KLVdlZCBBdWcgIDYgMTM6Mzc6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBUQVJHRVQgaW4gaGVhZGVyIGZpbGUuCi0JKiBhY2NvbmZpZy5oIChUQVJHRVQpOiBBZGQgI3VuZGVmLgotCSogTWFrZWZpbGUuYW0gKHZlcnNpb24ubywgYnVjb21tLm8pOiBSZW1vdmUgc3BlY2lhbCB0YXJnZXRzLgotCSogYnVjb21tLmMgKHRhcmdldCk6IFJlbW92ZS4KLQkqIG5tLmMgKHByb2dyYW1fbmFtZSk6IERvbid0IGRlY2xhcmUuCi0JKHRhcmdldCk6IE1ha2Ugc3RhdGljLgotCSogc2l6ZS5jICh0YXJnZXQpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEF1ZyAgNSAwMDowMTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogRXhwb3J0IHIuCi0JKC5kZXAxKTogVXNlICQoSU5DTFVERVMpIHJhdGhlciB0aGFuICQoQUxMX0NGTEFHUykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogbmxtaGVhZGVyLnk6IFVzZSBWRVJTSU9OSyByYXRoZXIgdGhhbiBWRVJTSU9OLgotCi0JKiBNYWtlZmlsZS5hbSAoU1RSSVBfUFJPRyk6IENoYW5nZSBmcm9tIHN0cmlwLm5ldyB0byBzdHJpcC1uZXcuCi0JKE5NX1BST0cpOiBDaGFuZ2UgZnJvbSBubS5uZXcgdG8gbm0tbmV3LgotCShUT09MX1BST0dTLCBpbnN0YWxsLWV4ZWMtbG9jYWwpOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEF1ZyAgNCAxMTo0NzozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIEFDX0FSR19QUk9HUkFNOyBpdCdzIGludm9rZWQgYnkKLQlBTV9JTklUX0FVVE9NQUtFLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogQ3JlYXRlICQodG9vbGRpcikvYmluIGJlZm9yZQotCXRyeWluZyB0byBpbnN0YWxsIGFueXRoaW5nIGludG8gaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKFRPT0xfUFJPR1MpOiBVc2UgYW4gZXhwbGljaXQgJChFWEVFWFQpLgotCShpbnN0YWxsLWV4ZWMtbG9jYWwpOiBXaGVuIGhhbmRsaW5nICQobm9pbnN0X1BST0dSQU1TKSwgb25seSB1c2UKLQkkKEVYRUVYVCkgb24gdGhlIGluc3RhbGxlZCBmaWxlLiAgV2hlbiBoYW5kbGluZyAkKFRPT0xfUFJPR1MpLAotCWhhbmRsZSAkKEVYRUVYVCkgY29ycmVjdGx5LgotCSogY29uZmlndXJlLmluOiBBZGQgYW4gZXhwbGljaXQgJChFWEVFWFQpIHdoZW4gc3Vic3RpdHV0aW5nIGZvcgotCXRoZSBuYW1lIG9mIGEgcHJvZ3JhbSB0byBidWlsZC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UKLQlwYXRjaGVzLgotCi0JKiBkZWZsZXgubCwgZGVmcGFyc2UueTogVXNlIFZFUlNJT05LIHJhdGhlciB0aGFuIFZFUlNJT04uCi0JKiByY2xleC5sLCByY3BhcnNlLnk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKHdpbmRyZXNfU09VUkNFUyk6IEFkZCAkKEJVTElCUykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgMSAxMzowODozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogSW5jbHVkZSBiZmQvYWNpbmNsdWRlLm00LCBub3QgYmZkL2FjbWFjcm9zLm00LgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBKdWwgMzEgMTE6NTE6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUsIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlCi0Jc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFDX1BST0dfWUFDQywKLQlBQ19QUk9HX0xFWCwgQUNfREVDTF9ZWVRFU1QsIEFNX01BSU5UQUlORVJfTU9ERSwgQU1fQ1lHV0lOMzIsIGFuZAotCUFNX0VYRUVYVC4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGggQU1fUFJPR19JTlNUQUxMLiAgUmVtb3ZlCi0Jc3RhbXAtaCBoYW5kbGluZyBpbiBBQ19PVVRQVVQuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUZyb20gVG9uIHZhbiBPdmVyYmVlayA8dHZvdmVyYmVAd2suZXN0ZWMuZXNhLm5sPjoKLQkqIHJjcGFyc2UueSAoZGlhbG9nKTogRGVmYXVsdCBtZW51IGFuZCBjbGFzcyB0byBiZSBuYW1lZC4KLQkoc3R5bGVzKTogSWYgRk9OVCBpcyBzZWVuLCBzZXQgRFNfU0VURk9OVCBpbiBkaWFsb2cgc3R5bGUuCi0JKiByZXNiaW4uYyAocmVzX3RvX2Jpbl9kaWFsb2cpOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIGZvbnQKLQlpbmZvcm1hdGlvbiBsZW5ndGguCi0KLVdlZCBKdWwgMzAgMTE6MjE6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBUb24gdmFuIE92ZXJiZWVrIDx0dm92ZXJiZUB3ay5lc3RlYy5lc2Eubmw+OgotCSogcmVzYmluLmMgKHJlc190b19iaW5fbWVudSk6IENvcnJlY3QgY29tcHV0YXRpb24gb2YgbWVudQotCXZzLiBtZW51ZXggbGVuZ3RoLgotCSogcmVzcmMuYyAoZGVmaW5lX3N0cmluZ3RhYmxlKTogQWRkIDEgdG8gcmVzb3VyY2UgSUQuCi0KLVR1ZSBKdWwgMjkgMTE6MDY6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZXNiaW4uYyAoYmluX3RvX3Jlc19zdHJpbmcpOiBDb3JyZWN0IGFkanVzdG1lbnQgb2YgZGF0YSBhbmQKLQlsZW5ndGguICBGcm9tIFRvbiB2YW4gT3ZlcmJlZWsgPHR2b3ZlcmJlQHdrLmVzdGVjLmVzYS5ubD4uCi0KLVR1ZSBKdWwgMjIgMTg6MDE6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubG1jb252LmMgKGxpbmtfaW5wdXRzKTogQ2FsbCBsaWJpYmVydHkgcGV4ZWN1dGUgZnVuY3Rpb24uCi0JKHBleGVjdXRlKSBbbXVsdGlwbGUgdmVyc2lvbnNdOiBSZW1vdmUuCi0KLVR1ZSBKdWwgMjIgMTY6MTk6MzQgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBidWNvbW0uYyAobWFrZV90ZW1wbmFtZSk6IElmIHdlIG1pZ2h0IGJlIHVzaW5nIGEgRE9TIGZpbGVzeXN0ZW0sCi0JY2hlY2sgZm9yIGEgYmFja3NsYXNoIGFzIHdlbGwgYXMgYSBzbGFzaC4KLQotVGh1IEp1biAyNiAxMzo1MzoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYyAobWFpbik6IFF1aXQgaWYgd2UgZGlkbid0IGdldCBhbnkgcmVzb3VyY2VzLgotCSh1c2FnZSk6IEZpeCAtLXl5ZGVidWcgdXNhZ2UgbWVzc2FnZS4KLQkqIHJlc2NvZmYuYyAod3JpdGVfY29mZl9maWxlKTogRG9uJ3QgZnJlZSB0aGUgcmVsb2NhdGlvbiBhcnJheQotCXVudGlsIGFmdGVyIHdlJ3ZlIGNsb3NlZCB0aGUgQkZELgotCShyZWFkX2NvZmZfcnNyYyk6IFF1aXQgcmF0aGVyIHRoYW4gdHJ5IHRvIHJlYWQgc3RhbmRhcmQgaW5wdXQuCi0JKHdyaXRlX2NvZmZfZmlsZSk6IFF1aXQgcmF0aGVyIHRoYW4gdHJ5IHRvIHdyaXRlIHRvIHN0YW5kYXJkCi0Jb3V0cHV0LgotCSogcmNwYXJzZS55OiBBZGQgYSBjb3VwbGUgb2YgbWlzc2luZyBzZW1pY29sb25zIChhY2NlcHRlZCBieSBiaXNvbgotCWJ1dCBub3QgYnlhY2MpLgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgd2luZHJlcy4KLQotV2VkIEp1biAyNSAyMDo1NzowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlc2Jpbi5jOiBOZXcgZmlsZS4KLQkqIHJjbGV4LmwsIHJjcGFyc2UueSwgcmVzY29mZi5jLCByZXNyYy5jLCB3aW5kcmVzLmMsIHdpbmRyZXMuaDoKLQlOdW1lcm91cyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQ0ZJTEVTKTogQWRkIHJlc2Jpbi5jLgotCShXSU5EUkVTX09CSlMpOiBBZGQgcmVzYmluLm8uCi0KLVN1biBKdW4gMjIgMTc6Mjk6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRmlyc3Qgc3RhYiBhdCBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyOgotCSogd2luZHJlcy5oOiBOZXcgZmlsZS4KLQkqIHdpbmRyZXMuYzogTmV3IGZpbGUuCi0JKiByZXNyYy5jOiBOZXcgZmlsZS4KLQkqIHJjcGFyc2UueTogTmV3IGZpbGUuCi0JKiByY2xleC5sOiBOZXcgZmlsZS4KLQkqIHJlc2NvZmYuYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBCVUlMRF9XSU5EUkVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoV0lORFJFU19QUk9HKTogTmV3IHZhcmlhYmxlLgotCShQUk9HUyk6IEFkZCBAQlVJTERfV0lORFJFU0AuCi0JKEhGSUxFUyk6IEFkZCBkbGx0b29sLmggYW5kIHdpbmRyZXMuaC4KLQkoQ0ZJTEVTKTogQWRkIHdpbmRyZXMuYyBhbmQgcmVzcmMuYy4KLQkoR0VORVJBVEVEX0NGSUxFUyk6IEFkZCByY3BhcnNlLmMgYW5kIHJjbGV4LmMuCi0JKFdJTkRSRVNfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkkKFdJTkRSRVNfUFJPRyk6IE5ldyB0YXJnZXQuCi0JKHJjcGFyc2UuYywgcmNwYXJzZS5oLCByY2xleC5jKTogTmV3IHRhcmdldHMuCi0KLVRodSBKdW4gMTIgMTI6Mjc6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGV4cG9ydF90eXBlKTogQWRkIGRhdGEgZmllbGQuCi0JKGRlZl9leHBvcnRzKTogQWRkIGRhdGEgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShkdW1wX2RlZl9pbmZvKTogUHJpbnQgZGF0YSBmaWVsZC4KLQkoZ2VuX2RlZl9maWxlKTogTGlrZXdpc2UuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogSGFuZGxlIGRhdGEgZmllbGQgYnkgbm90IGVtaXR0aW5nIHNpbXBsZQotCWxhYmVsIGFuZCBub3QgZW1pdHRpbmcgYW55dGhpbmcgaW4gU0VDX1RFWFQuCi0JKGR0YWIpOiBQcmludCBkYXRhIGZpZWxkLgotCShwcm9jZXNzX2R1cGxpY2F0ZXMpOiBNZXJnZSBkYXRhIGZpZWxkLgotCSogZGxsdG9vbC5oIChkZWZfZXhwb3J0cyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGRlZnBhcnNlLnkgKGV4cGxpbmUpOiBBY2NlcHQgb3B0X0RBVEEuICBQYXNzIGl0IHRvIGRlZl9leHBvcnRzLgotCShvcHRfREFUQSk6IE5ldyBub24tdGVybWluYWwuCi0KLVdlZCBKdW4gMTEgMTc6MTU6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmg6IE5ldyBmaWxlLgotCSogZGVmbGV4Lmw6IEluY2x1ZGUgZGxsdG9vbC5oIGFuZCBsaWJpYmVydHkuaC4gIERvbid0IGRlY2xhcmUKLQlzdHJkdXAuICBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKiBkZWZwYXJzZS55OiBJbmNsdWRlIGJmZC5oLCBidWNvbW0uaCwgYW5kIGRsbHRvb2wuaC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSBkbGx0b29sLmggYW5kIHRpbWUuaC4gIE1ha2UgYSBsb3Qgb2YKLQl2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBzdGF0aWMuICBNYWtlIGEgbG90IG9mIGNoYXIgKiB2YXJpYWJsZXMKLQlhbmQgcGFyYW1ldGVycyBjb25zdC4gIEFkZCBkZWNsYXJhdGlvbnMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBEbwotCXNvbWUgcmVpbmRlbnRpbmcuICBIaWRlIG1vcmUgUG93ZXJQQyBzdHVmZiBpbnNpZGUgRExMVE9PTF9QUEMuCi0KLVdlZCBKdW4gMTEgMTI6MDU6NTIgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogYXIuYyAoYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUpOiBBZGQgY29uc3QuCi0KLU1vbiBNYXkgMTIgMjI6MDk6MzUgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFBhc3MgQ0NfRk9SX1RBUkdFVCBhbmQgQ0ZMQUdTX0ZPUl9UQVJHRVQKLQl0byBydW50ZXN0LgotCi1Nb24gTWF5IDEyIDEzOjE0OjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjbGVhciBPUENPREVTIHdoZW4gLS1lbmFibGUtY29tbW9uYmZkbGliIGlzCi0JdXNlZCBvbiBIUC9VWC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAyNSAxNDoyMjowOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBDaGFuZ2UgKi5pbmZvKgotCXRvIGJpbnV0aWxzLmluZm8qIHRvIHNhdmUgc3lzcm9mZi5pbmZvLgotCi1UdWUgQXByIDE1IDEzOjQyOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1hGT1JNLCBJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLQlkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcgJChJTlNUQUxMX1hGT1JNKSBhbmQKLQkkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsLWluZm8pOiBSdW4gbWtpbnN0YWxsZGlycy4KLQotTW9uIEFwciAxNCAxMTo1MjozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIE1ha2VmaWxlLmluOiBBbHdheXMgdXNlICQoU0hFTEwpIHdoZW4gcnVubmluZyBtb3ZlLWlmLWNoYW5nZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDQgMTM6Mjg6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19GVU5DX0FMTE9DQS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogYnVjb21tLmg6IEFkZCBhbGxvY2EgaGFuZGxpbmcsIGNvcGllZCBmcm9tIGdhcy9hcy5oLgotCSogZGxsdG9vbC5jOiBBZGQgI3ByYWdtYSBhbGxvY2EgZm9yIEFJWCB0byBzdGFydCBvZiBmaWxlLgotCSogbmxtY29udi5jOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuICBSZW1vdmUKLQlldmVyeXRoaW5nIHRoYXQgY2xlYW4gcmVtb3Zlcy4KLQotVGh1IEFwciAgMyAxMzoxODozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVR1ZSBBcHIgIDEgMTY6MjE6NDQgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IE5ldyBmaWxlLgotCSogY29uZmlnLmgtdm1zOiBSZW1vdmUgZmlsZS4KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBuZXcgY29uZmlndXJlIHNjaGVtZS4KLQotTW9uIE1hciAzMSAxNTozMDo0MyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBvYmpjb3B5LmMgKG1ha2Vfc2FtZV9kYXRlcyk6IFVzZSBzdGF0YnVmLCBub3QgYnVmLCBpZiBub3QKLQlIQVZFX0dPT0RfVVRJTUVfSC4KLQotRnJpIE1hciAyOCAxNzo1Nzo1MyAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBEb24ndCBsaW5rIGFnYWluc3QgQkZETElCIHR3aWNlLgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3IgY29tbW9uYmZkbGliLiAgSWYgaXQgaXMgc2V0LAotCXNldCBPUENPREVTIHRvIGVtcHR5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTWFyIDI3IDE2OjAzOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT46Ci0JKiBvYmpjb3B5LmM6IEluY2x1ZGUgPHV0aW1lLmg+IG9yIDxzeXMvdGltZS5oPi4KLQkoc3RyaXBfb3B0aW9ucyk6IEFkZCAicHJlc2VydmUtZGF0ZXMiLgotCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLXAgYW5kIC0tcHJlc2VydmUtZGF0ZXMuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKG1ha2Vfc2FtZV9kYXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cmlwX21haW4pOiBIYW5kbGUgLXAuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCSogYmludXRpbHMudGV4aSwgc3RyaXAuMSwgb2JqY29weS4xOiBEb2N1bWVudCBuZXcgb3B0aW9uLgotCi0JYWRkcjJsaW5lLmMgY29udHJpYnV0ZWQgYnkgVWxyaWNoIExhdXRoZXIKLQk8VWxyaWNoLkxhdXRoZXJAemZlLnNpZW1lbnMuZGU+OgotCSogYWRkcjJsaW5lLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUREUjJMSU5FX1BST0cpOiBOZXcgdmFyaWFibGUuCi0JKE1BTlBBR0VTKTogQWRkIGFkZHIybGluZS4KLQkoUFJPR1MpOiBBZGQgJChBRERSMkxJTkVfUFJPRykuCi0JKENGSUxFUyk6IEFkZCBhZGRyMmxpbmUuYy4KLQkoJChBRERSMkxJTkVfUFJPRykpOiBOZXcgdGFyZ2V0LgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgYWRkcjJsaW5lLgotCSogYWRkcjJsaW5lLjE6IE5ldyBmaWxlLgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUuCi0KLU1vbiBNYXIgMjQgMTA6NTI6NDUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGV4aXQgaWYgYSBmaWxlIGNhbm5vdCBiZQotCWRpc2Fzc2VtYmxlZCwgaW5zdGVhZCBqdXN0IHJldHVybi4KLQotVGh1IE1hciAyMCAyMToxNjo1MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpemUuYyAodXNhZ2UpOiBNYWtlIGRlZmluaXRpb24gbWF0Y2ggaXRzIHByb3RvdHlwZS4KLQkoZGlzcGxheV9iZmQsIGxwcmludF9udW1iZXIsIHJwcmludF9udW1iZXIpOiBMaWtld2lzZS4KLQkocHJpbnRfYmVya2VsZXlfZm9ybWF0LCBzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBMaWtld2lzZS4KLQkocHJpbnRfc3lzdl9mb3JtYXQpOiBMaWtld2lzZS4KLQkqIG5tLmMgKHNldF9wcmludF9yYWRpeCwgc2V0X291dHB1dF9mb3JtYXQpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMTggMTY6Mzk6NTUgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZCBmdW5jdGlvbiBwcm90b3R5cGVzLgotCSogYXIuYyAobXJpX2VtdWwsIGdldF9wb3NfYmZkKTogTWFrZSBzdGF0aWMuCi0JKiBhcmxleC5sOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuICBEb24ndCBkZWNsYXJlIHN0cmR1cC4gIFVzZQotCXhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCSogYXJwYXJzZS55ICh5eWVycm9yKTogTWFrZSBhcmd1bWVudCBjb25zdC4gIENvcnJlY3QgdHlwby4KLQkqIGFyc3VwLmMgKHN0cmR1cCk6IERvbid0IGRlY2xhcmUuCi0JKGFyX3NhdmUpOiBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKiBmaWxlbW9kZS5jOiBJbmNsdWRlICJidWNvbW0uaCIuCi0JKiBubS5jICh1c2FnZSk6IE1ha2Ugc3RhdGljLgotCShwcmludF9zeW1uYW1lKTogTWFrZSBmb3JtYXQgYW5kIG5hbWUgY29uc3QuCi0JKiBvYmpjb3B5LmMgKGNhdCk6IFJlbW92ZS4KLQkoY29weV9hcmNoaXZlKTogTWFrZSBvdXRwdXRfdGFyZ2V0IGNvbnN0LiAgVXNlIGNvbmNhdCwgbm90IGNhdC4KLQkoY29weV9maWxlLCBzaW1wbGVfY29weSwgc21hcnRfcmVuYW1lKTogTWFrZSBhcmd1bWVudHMgY29uc3QuCi0JKiBvYmpkdW1wLmMgKHJlYWRfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCShwcmludF9zZWN0aW9uX3N0YWJzKTogTGlrZXdpc2UuCi0JKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcyk6IERvbid0IGRlY2xhcmUgZ2V0ZW52LgotCSogc3RyaW5ncy5jIChzdHJpbmdzX29iamVjdF9maWxlKTogQ2hhbmdlIGZpbGUgdG8gY29uc3QuCi0JKHByaW50X3N0cmluZ3MpOiBDaGFuZ2UgZmlsZW5hbWUgdG8gY29uc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBNYXIgMTggMTE6Mzc6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBCRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpLgotCSogYWNjb25maWcuaDogQWRkIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogYnVjb21tLmggKGdldGVudik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIG5sbWNvbnYuYyAoZ2V0ZW52KTogRG9uJ3QgZGVjbGFyZS4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1TYXQgTWFyIDE1IDE1OjM1OjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBKYW1pZSBMb2tpZXIgPGphbWllQHJlYmVsbGlvbi5jby51az46Ci0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgImRlbWFuZ2xlLmgiLgotCShkb19kZW1hbmdsZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtQy8tLWRlbWFuZ2xlLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRlbWFuZ2xlIi4KLQkob2JqZHVtcF9wcmludF9zeW1uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogVXNlIG9iamR1bXBfcHJpbnRfc3ltbmFtZS4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkoZHVtcF9yZWxvY19zZXQpOiBMaWtld2lzZS4KLQkoZHVtcF9zeW1ib2xzKTogRGVtYW5nbGUgc3ltYm9sIG5hbWUuCi0JKG1haW4pOiBIYW5kbGUgLUMuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1DLy0tZGVtYW5nbGUuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBNZW50aW9uIC0tbm8tc2hvdy1yYXctaW5zbi4KLQkobG9uZ19vcHRpb25zKTogQWRkICJuby1zaG93LXJhdy1pbnNuIi4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBIYW5kbGUgLS1uby1zaG93LXJhdy1pbnNuLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtLW5vLXNob3ctcmF3LWluc24uCi0KLVdlZCBNYXIgMTIgMTE6NDI6MDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHJkZGJnLmMgKGZyZWVfc2F2ZWRfc3RhYnMpOiBTZXQgdGhlIHN0cmluZ3MgdG8gTlVMTCBhZnRlciBiZWluZwotCWZyZWVkLgotCi1GcmkgRmViIDI4IDE3OjE4OjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmMgKHNldF9kZWZhdWx0X2JmZF90YXJnZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBidWNvbW0uaCAoc2V0X2RlZmF1bHRfYmZkX3RhcmdldCk6IERlY2xhcmUuCi0JKiBhci5jIChtYWluKTogQ2FsbCBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0LgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChidWNvbW0ubyk6IE5ldyB0YXJnZXQsIHRvIGRlZmluZSBUQVJHRVQuCi0KLVR1ZSBGZWIgMjUgMjE6Mjg6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGFkanVzdF9zZWN0aW9uX3ZtYSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtLWFkanVzdC1zZWN0aW9uLXZtYS4KLQkoT1BUSU9OX0FESlVTVF9WTUEpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiYWRkanVzdC12bWEiLgotCShkaXNwbGF5X2JmZCk6IElmIGFkanVzdF9zZWN0aW9uX3ZtYSBpcyBub3QgMCwgYWRkIGl0IHRvIGFsbCB0aGUKLQlzZWN0aW9uIGFkZHJlc3Nlcy4KLQkobWFpbik6IEhhbmRsZSBPUFRJT05fQURKVVNUX1ZNQS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1hZGp1c3Qtdm1hLgotCi1GcmkgRmViIDE0IDE4OjQ2OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAocHJpbnRfc3ltYm9sKTogQ2FjaGUgdGhlIEJGRCBhcyB3ZWxsIGFzIHRoZSBzeW1ib2xzIGFuZAotIAlyZWxvY3MsIGFuZCBkb24ndCB0cnkgdG8gdXNlIHRoZSBzeW1ib2xzIG9yIHJlbG9jcyB3aXRoIGEKLSAJZGlmZmVyZW50IEJGRC4KLQotVGh1IEZlYiAxMyAyMTozNDo0MyAxOTk3ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogY29uZmlnLmgtdm1zOiBzYnJrKCkgaXMgcHJvdmlkZWQgb24gb3BlblZNUy9BbHBoYS4KLQkqIG1ha2VmaWxlLnZtczogYWxsb3cgY29tcGlsaW5nIHdpdGggY3VycmVudCBnY2Mgc25hcHNob3QuCi0KLVRodSBGZWIgMTMgMjA6MTQ6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcnN1cC5jLCBjb2ZmZ3Jvay5jLCBkbGx0b29sLmMsIG5sbWNvbnYuYzogVXNlIHhtYWxsb2MgcmF0aGVyCi0JdGhhbiBtYWxsb2MuCi0KLVdlZCBGZWIgMTIgMTY6MTI6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBDb3JyZWN0IFZNQSBhcmd1bWVudCB0bwotCWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzLiAgSW1wcm92ZSBoYW5kbGluZyBvZiBjb2RlIHdpdGggbm8gc3ltYm9sCi0JZm9sbG93ZWQgYnkgY29kZSB3aXRoIGEgc3ltYm9sLgotCi1XZWQgRmViIDEyIDEyOjE2OjQ3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogTWFrZSBvdXRwdXQgb2YgcmF3IGluc3RydWN0aW9ucwotCXdvcmsgYmV0dGVyIGZvciBub24tc3RhbmRhcmQgdmFsdWVzIG9mIGJ5dGVzX3Blcl9jaHVuayBhbmQKLQlieXRlc19wZXJfbGluZS4KLQotVGh1IEZlYiAgNiAxNDoxNDo1OSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IEFkZGVkIGNvZGUgdG8gYWxsb3cgc29tZSBjb250cm9sCi0gCW92ZXIgdGhlIHdheSByYXcgaW5zdHJ1Y3Rpb25zIGFyZSBkaXNwbGF5ZWQuCi0KLVRodSBGZWIgIDYgMTI6MzY6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3QgYmluY2xfZmlsZSk6IEFkZCBuZXh0X3N0YWNrIGZpZWxkLgotCShwdXNoX2JpbmNsKTogUHV0IHRoZSBuZXcgZmlsZSBvbiBib3RoIGJpbmNsX2xpc3QgYW5kCi0JYmluY2xfc3RhY2suICBDbGVhciB0aGUgZmlsZV90eXBlcyBmaWVsZC4KLQkocG9wX2JpbmNsKTogVXNlIHRoZSBuZXh0X3N0YWNrIGZpZWxkIHdoZW4gcG9wcGluZyB0aGUgc3RhY2suCi0JRG9uJ3QgcHV0IHRoZSBmaWxlIG9uIGJpbmNsX2xpc3QuCi0JKGZpbmRfZXhjbCk6IEluY2x1ZGUgdGhlIGZpbGUgbmFtZSB3aGVuIHdhcm5pbmcgYWJvdXQgYW4gdW5mb3VuZAotCU5fRVhDTC4KLQotCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IERvbid0IGNyYXNoIGlmIHdlIGFyZSBwYXNzZWQgTlVMTC4KLQotVGh1IEZlYiAgNiAxMTo1NDoyNCAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIG9iamNvcHkuMTogQWRkIG1pc3Npbmcgc3BhY2UgYWZ0ZXIgLkIuCi0KLUZyaSBKYW4gMzEgMTA6MzM6MDcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEluaXRpYWxpemUgYGF1eC5yZXF1aXJlX3NlYycuCi0KLVdlZCBKYW4gMjkgMTM6MjE6MjEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBBZGQgc2tpcF96ZXJvZXMgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogTGlrZXdpc2UuICBDYWxsIG9iamR1bXBfcHJpbnRfdmFsdWUKLQl0byBwcmludCBhZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBKdXN0IGNhbGwgb2JqZHVtcF9wcmludF9hZGRyLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IFByaW50IHJlYWwgYWRkcmVzcywgbm90IGZ1bmN0aW9uIG9mZnNldC4KLQlTa2lwIGEgY2VydGFpbiBudW1iZXIgb2YgbGVhZGluZyB6ZXJvZXMuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfemVyb2VzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tZGlzYXNzZW1ibGUtemVyb2VzLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRpc2Fzc2VtYmxlLXplcm9lcyIuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogQ2hlY2sgZGlzYXNzZW1ibGVfemVyb2VzLgotCi1UdWUgSmFuIDI4IDE2OjQ3OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IERvbid0IHNraXAgemVyb2VzIGlmIHRoZQotCWRpc2Fzc2VtYmxlciBoYXMgdG9sZCB1cyB0aGF0IHdlIGFyZSBpbiBhIGJyYW5jaCBkZWxheSBzbG90LgotCi1Nb24gSmFuIDIwIDE0OjI0OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2l6ZS5jIChiZXJrZWxleV9zdW0pOiBSZXdyaXRlLiAgU2tpcCBzZWN0aW9ucyB3aGljaCBhcmUgbm90Ci0JU0VDX0FMTE9DLiAgQ291bnQgU0VDX1JFQURPTkxZIHNlY3Rpb25zIGFzIHRleHQuCi0KLVR1ZSBKYW4gMTQgMTU6MTQ6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBSZW1vdmUgKi5pbmZvKiwgbm90Ci0JanVzdCAqLmluZm8uICBGcm9tIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+LgotCi1UdWUgRGVjIDMxIDE1OjQyOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotRnJpIERlYyAyNyAxMToxOToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogV29yayBhcm91bmQgYnVnIGluIEFDX0ZVTkNfVkZPUksgaW4gYXV0b2NvbmYgMi4xMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IERlYyAxOSAxMzoxMToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEFuZHJldyBKIEtsb3NzbmVyIDxhbmRyZXdAcG9nby53di50ZWsuY29tPjoKLQkqIG9iamNvcHkuYyAoT1BUSU9OX1dFQUtFTik6IERlZmluZS4KLQkoY29weV9vcHRpb25zKTogQWRkICJ3ZWFrZW4iLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXdlYWtlbi4KLQkod2Vha2VuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZmlsdGVyX3N5bWJvbHMpOiBIYW5kbGUgd2Vha2VuLgotCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgd2Vha2VuLgotCShjb3B5X21haW4pOiBIYW5kbGUgT1BUSU9OX1dFQUtFTi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS13ZWFrZW4uCi0KLVdlZCBEZWMgMTggMjI6NDk6MTMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVzZSBOZXdGb2xkZXJSZWN1cnNpdmUgZm9yIGluc3RhbGxhdGlvbi4KLQotU2F0IERlYyAgNyAxMDoxNzoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogQWRkICJlbHNlIHRydWUiIGNsYXVzZSB0byBjYXRlciB0bwotCWJyb2tlbiAibWFrZSIgb24gc29tZSBzeXN0ZW1zLgotCi1GcmkgRGVjICA2IDE3OjIxOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX2JiKTogQWx3YXlzIGluaXRpYWxpemUgbmFtY29weSB0byBhdm9pZCBnY2MKLQl3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUuCi0JKGllZWVfcmVhZF9jeHhfY2xhc3MpOiBMaWtld2lzZSwgZm9yIHBmLgotCShpZWVlX2VudW1fdHlwZSk6IExpa2V3aXNlLCBmb3IgaS4KLQotVHVlIE5vdiAyNiAxNzowMToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RhYl9hcnJheV90eXBlKTogQWRkIGNhc3RzIHdoZW4gcHJpbnRpbmcKLQliZmRfc2lnbmVkX3ZtYSB2YWx1ZXMuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLU1vbiBOb3YgMjUgMTY6NTM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBjcmFzaCBpZiB0aGVyZSBpcyBubwotCXN5bWJvbC4KLQotRnJpIE5vdiAyMiAxNzoyOToxNCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXIuYyAob3Blbl9pbmFyY2gpOiBEb24ndCBjYWxsIGJmZF9vcGVuciB3aXRoIGEgbnVsbCBuYW1lLgotCi1GcmkgTm92ICAxIDEyOjA4OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aTogQWRkIHNlY3Rpb24gb24gcmVwb3J0aW5nIGJ1Z3MuCi0KLVRodSBPY3QgMzEgMTg6MjA6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgYmluY2xfbGlzdCBmaWVsZC4KLQkocGFyc2Vfc3RhYik6IFBhc3MgdmFsdWUgdG8gcHVzaF9iaW5jbC4gIENhbGwgZmluZF9leGNsIGZvcgotCU5fRVhDTC4KLQkoc3RydWN0IGJpbmNsX2ZpbGUpOiBBZGQgaGFzaCwgZmlsZSBhbmQgZmlsZV90eXBlcyBmaWVsZHMuCi0JKHB1c2hfYmluY2wpOiBBZGQgaGFzaCBwYXJhbWV0ZXIuICBTYXZlIGl0IGluIHRoZSBuZXcgaGFzaCBmaWVsZC4KLQlTYXZlIHRoZSBmaWxlIG51bWJlciBpbiB0aGUgbmV3IGZpbGUgZmllbGQuCi0JKHBvcF9iaW5jbCk6IFB1dCB0aGUgYmluY2xfZmlsZSBvbiBiaW5jbF9saXN0LCByYXRoZXIgdGhhbiBmcmVlaW5nCi0JaXQuICBTYXZlIHRoZSBmaWxlIHR5cGVzIGluIHRoZSBuZXcgZmlsZV90eXBlcyBmaWVsZC4KLQkoZmluZF9leGNsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogaWVlZS5jIChpZWVlX2xpbmVubyk6IERvbid0IGNvbXBhcmUgbGluZSBudW1iZXIgYWRkcmVzc2VzIHRvCi0JaW5mby0+aGlnaGFkZHIgKHVuZG8gcGFydCBvZiBPY3RvYmVyIDI4IHBhdGNoKS4KLQotVHVlIE9jdCAyOSAxNjo0MDoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF92YWx1ZSk6IERvbid0IHByaW50IHRoZSBlbXB0eSBzdHJpbmcKLQlmb3IgemVyby4KLQotTW9uIE9jdCAyOCAxNjo1ODoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBmdW5jdGlvbl9lbmQgZmllbGQuCi0JKHN0YXJ0X3N0YWIpOiBJbml0aWFsaXplIGZ1bmN0aW9uX2VuZC4KLQkoZmluaXNoX3N0YWIpOiBQYXNzIGluZm8tPmZ1bmN0aW9uX2VuZCB0byBkZWJ1Z19lbmRfZnVuY3Rpb24uCi0JKHBhcnNlX3N0YWIpOiBJZiBpbmZvLT5mdW5jdGlvbl9lbmQgaXMgc2V0LCB1c2UgaXQgYXMgdGhlIGFkZHJlc3MKLQl3aGljaCBlbmRzIGEgZnVuY3Rpb24uCi0KLQkqIGllZWUuYyAoaWVlZV9hcnJheV90eXBlKTogUmVtZW1iZXIgdGhlIGNvcnJlY3Qgc2l6ZS4KLQotCSogaWVlZS5jIChpZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0KTogUGVybWl0IGNvYWxlc2NpbmcgcmFuZ2VzCi0JdGhhdCBhcmUgdXAgdG8gMHgxMDAwIGJ5dGVzIGFwYXJ0LCBub3QganVzdCA2NC4KLQkoaWVlZV9hZGRfYmIxMV9ibG9ja3MpOiBEb24ndCBib3RoZXIgdG8gZW1pdCBhIEJCMTEgdGhhdCBpcyBsZXNzCi0JdGhhbiAweDEwMCBieXRlcy4KLQkoaWVlZV9saW5lbm8pOiBPbmx5IGVtaXQgbGluZSBudW1iZXJzIHRoYXQgYXJlIGxlc3MgdGhhbgotCWluZm8tPmhpZ2hhZGRyLgotCi1GcmkgT2N0IDI1IDEyOjEyOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0pOiBBZGQgZGVmaW5lZCBmaWVsZC4KLQkoaWVlZV9lbnVtX3R5cGUpOiBJZiB0aGUgZW51bSB0YWcgaGFzIGJlZW4gc2VlbiBiZWZvcmUgYnV0IG5vdAotCWRlZmluZWQsIHJldXNlIHRoZSBzYW1lIHR5cGUgaW5kZXgsIGFuZCBkZWZpbmUgaXQuCi0JKGllZWVfdGFnX3R5cGUpOiBJZiB0aGlzIGVudW0gaGFzIG5vdCBiZWVuIGRlZmluZWQsIGFkZCBhbgotCXVuZGVmaW5lZCBlbnRyeSB0byB0aGUgbGlzdCBvZiBlbnVtcy4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IExldCB0aGUgZGlzYXNzZW1ibGVyIG92ZXJyaWRlIHRoZQotCW51bWJlciBvZiBieXRlcyBwcmludGVkIG9uIGEgbGluZS4KLQotVGh1IE9jdCAyNCAxNjo0MjoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAocHJlZml4X2FkZHJlc3Nlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAicHJlZml4LWFkZHJlc3NlcyIuCi0JKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgQlNGX0ZVTkNUSU9OIHN5bWJvbHMgYmVmb3JlIG90aGVyCi0Jc3ltYm9scy4KLQkoZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jb2JqZHVtcF9wcmludF9hZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jb2JqZHVtcF9wcmludF9hZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDYWxsIG5ldyBmdW5jdGlvbnMuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWRpc2Fzc2VtYmxlX2RhdGEuICBDaGFuZ2UgZGlzYXNzZW1ibHkgZm9ybWF0LCB1bmxlc3MKLQlwcmVmaXhfYWRkcmVzc2VzIGlzIHNldC4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENhbGwgZGlzYXNzZW1ibGVfYnl0ZXMuICBVbmxlc3MKLQlwcmVmaXhfYWRkcmVzc2VzIGlzIHNldCwgZGlzYXNzZW1ibGUgaW4gY2h1bmtzIGhlYWRlZCBieSBhCi0Jc3ltYm9sLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtLXByZWZpeC1hZGRyZXNzZXMuCi0KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IFByZXNlcnZlIHRoZQotCWJhY2tzbGFzaCB3aGVuIGNvbmNhdGVuYXRpbmcgbXVsdGlwbGUgc3RhYnMgc3RyaW5ncy4KLQotVGh1IE9jdCAxMCAxMTozNjozMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNjYW5fb3Blbl9vYmpfZmlsZSk6IEZpeCBsb29wIGV4aXQgdGVzdC4KLQlBZGQgbWlzc2luZyBwYXJhbWV0ZXIgdG8gZGVmX2V4cG9ydHMuCi0KLVR1ZSBPY3QgIDggMTI6MDY6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTEVYX09QVElPTlMpOiBTZXQgdG8gZW1wdHkgc3RyaW5nLiAgLUkgLUNlbSBpcyB0aGUKLQlkZWZhdWx0IGZvciBmbGV4LCBhbmQgaXMgbm90IHJlY29nbml6ZWQgYnkgbGV4LgotCi1UaHUgT2N0ICAzIDE3OjQxOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoVGFyZ2V0IFNlbGVjdGlvbik6IERvY3VtZW50IHRoYXQgeW91IGNhbiBub3cKLQlzcGVjaWZ5IHRhcmdldHMgdXNpbmcgY29uZmlndXJhdGlvbiB0cmlwbGV0cy4KLQotCSogYXIuYyAodXNhZ2UpOiBEZWNsYXJlLiAgTWFrZSBzdXJlIGFsbCBjYWxsZXJzIHBhc3MgYW4gYXJndW1lbnQuCi0KLVRodSBPY3QgIDMgMTU6Mzk6NDIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0KLVdlZCBPY3QgIDIgMTU6NDk6MTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogQnVtcCB2ZXJzaW9uIGRhdGUuCi0KLVR1ZSBPY3QgIDEgMTU6MDA6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBidWNvbW0uaCAocHJpbnRfdmVyc2lvbik6IERlY2xhcmUuCi0JKiBhci5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCShkb19zaG93X3ZlcnNpb24pOiBSZW1vdmUuCi0JKHVzYWdlKTogQWRkIGhlbHAgcGFyYW1ldGVyLiAgUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogU2V0IGlzX3JhbmxpYiBhdCBzdGFydC4gIENoZWNrIGZvciAtLWhlbHAgYW5kIC0tdmVyc2lvbi4KLQlDYWxsIHByaW50X3ZlcnNpb24sIG5vdCBkb19zaG93X3ZlcnNpb24uCi0JKiBubG1jb252LmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKHNob3dfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKiBubS5jIChwcm9ncmFtX3ZlcnNpb24sIHByaW50X3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkqIG9iamNvcHkuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkoY29weV91c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkoc3RyaXBfbWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCSogc2l6ZS5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkqIHN0cmluZ3MuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQotVGh1IFNlcCAxOSAxNDo1MzoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogUmV2ZXJ0IE1vbmRheSdzIHJlZmxvY2FscCBwYXRjaCwgYW5kIGFwcGx5IHRoaXMgcGF0Y2gKLQlpbnN0ZWFkOgotIAkod3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IFdyaXRlIGEgZHVtbXkgdHlwZSBhdCB0aGUgZW5kIG9mIHRoZQotCWdsb2JhbCB0eXBlIGJsb2NrLgotCi1Nb24gU2VwIDE2IDE1OjMwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV93cml0ZV90eXBlKTogQWRkIHJlZmxvY2FscCBmaWVsZC4KLQkoaWVlZV9wb2ludGVyX3R5cGUpOiBTZXQgcmVmbG9jYWxwIGFmdGVyIHB1c2hpbmcgdHlwZS4KLQkoaWVlZV9mdW5jdGlvbl90eXBlKTogSWYgcmVmbG9jYWxwIGlzIHNldCwgbWFrZSB0aGlzIHR5cGUgbG9jYWwuCi0JKGllZWVfcmFuZ2VfdHlwZSwgaWVlZV9hcnJheV90eXBlLCBpZWVlX3NldF90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfY29uc3RfdHlwZSwgaWVlZV92b2xhdGlsZV90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfc3RydWN0X2ZpZWxkLCBpZWVlX2NsYXNzX2Jhc2VjbGFzcyk6IExpa2V3aXNlLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2luZm8pOiBBZGQgZ2xvYmFsX3R5cGVzIGZpZWxkLgotCShwYXJzZV9pZWVlX2JiKTogV2hlbiBzdGFydGluZyBhIEJCMSwgaW5pdGlhbGl6ZSB0aGUgdHlwZXMgZmllbGQKLQl0byB0aGUgZ2xvYmFsX3R5cGVzIGZpZWxkLgotCShwYXJzZV9pZWVlX2JlKTogV2hlbiBlbmRpbmcgYSBCQjIsIGNvcHkgdGhlIHR5cGVzIGZpZWxkIHRvIHRoZQotCWdsb2JhbF90eXBlcyBmaWVsZC4KLQotRnJpIFNlcCAxMyAxNzozMjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY2hhbmdlX2xlYWRpbmdfY2hhcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSKTogRGVmaW5lLgotCShjb3B5X29wdGlvbnMpOiBBZGQgImNoYW5nZS1sZWFkaW5nLWNoYXIiLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWNoYW5nZS1sZWFkaW5nLWNoYXIuCi0JKGZpbHRlcl9zeW1ib2xzKTogQWRkIG9iZmQgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCUltcGxlbWVudCBjaGFuZ2VfbGVhZGluZ19jaGFyLgotCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgY2hhbmdlX2xlYWRpbmdfY2hhci4KLQkoY29weV9tYWluKTogSGFuZGxlIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLWNoYW5nZS1sZWFkaW5nLWNoYXIuCi0KLVR1ZSBTZXAgIDMgMTQ6MDU6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfZW51bV90eXBlKTogRG9uJ3QgY2hlY2sgaW5kZXggaW50byBhIE5VTEwgbmFtZXMKLQlhcnJheS4KLQkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogQWx3YXlzIGluaXRpYWxpemUgbmV4dC4KLQkqIHJkY29mZi5jIChwYXJzZV9jb2ZmX3R5cGUpOiBXYXJuIGFib3V0IGFuIGluY29tcHJlaGVuc2libGUKLQl0eXBlIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCSogcmRkYmcuYyAocmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8pOiBJbml0aWFsaXplIGYuCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX21lbWJlcnMpOiBTZXQgY29udGV4dCBpbiBhbGwgY2FzZXMuCi0KLVRodSBBdWcgMjkgMTY6NTY6NTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEF1ZyAyOSAxMToyOToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoTF90bXBuYW0pOiBOZXZlciBkZWZpbmUuCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBVc2UgY2hvb3NlX3RlbXBfYmFzZSBpbnN0ZWFkIG9mIHRtcG5hbS4KLQkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgMjcgMTg6MTU6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiKTogQW4gTl9GVU4gc3ltYm9sIHdpdGggYW4gZW1wdHkgc3RyaW5nCi0JaW5kaWNhdGVzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4KLQotVGh1IEF1ZyAyMiAxNzowODowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5KTogQWRkIG5leHQgZmllbGQuCi0JKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSk6IENoYW5nZSBzdHJpbmdzIHRvIGEgcG9pbnRlciB0bwotCXN0cmluZ19oYXNoX2VudHJ5LiAgQWRkIGxhc3Rfc3RyaW5ncyBmaWVsZC4gIFJlbW92ZSBzdHJpbmdzX2FsbG9jCi0JZmllbGQuCi0JKHN0cmluZ19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5leHQgZmllbGQuCi0JKHN0YWJfd3JpdGVfc3ltYm9sKTogQ29weSBzdHJpbmcgaW50byBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGludG8KLQlidWZmZXIuICBLZWVwIGEgbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMuCi0JKHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvKTogSW5pdGlhbGl6ZSBsYXN0X3N0cmluZy4KLQlDb3B5IHN0cmluZ3MgZnJvbSBsaXN0IG9mIGhhc2ggdGFibGUgZW50cmllcyBpbiBtZW1vcnkuCi0JKHN0YWJfbW9kaWZ5X3R5cGUpOiBJZiB0aGUgZW50cnkgb24gdGhlIHN0YWNrIGlzIGEgZGVmaW5pdGlvbiwKLQltYWtlIGEgbmV3IGRlZmluaXRpb24gcmF0aGVyIHRoYW4gZmFpbGluZyBhbiBhc3NlcnQuCi0JKHN0YWJfYXJyYXlfdHlwZSk6IFRoZSBzaXplIGlzIG9ubHkgemVybyBpZiBoaWdoIGlzIHN0cmljdGx5IGxlc3MKLQl0aGFuIGxvdy4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9pbmZvKTogQWRkIHNhd19maWxlbmFtZSBmaWVsZC4KLQkocGFyc2VfaWVlZSk6IEluaXRpYWxpemUgc2F3X2ZpbGVuYW1lLgotCShwYXJzZV9pZWVlX2JiKTogU2V0IHNhd19maWxlbmFtZSBmb3IgYSBCQjEgb3IgQkIyLiAgSW4gYSBCQjEsCi0JZGlzY2FyZCB0aGUgY3VycmVudCB2YXJpYWJsZXMgYW5kIHR5cGVzLiAgSW4gYSBCQjEwLCBpZiBubwotCWZpbGVuYW1lIGhhcyBiZWVuIHNlZW4sIGNhbGwgZGVidWdfc2V0X2ZpbGVuYW1lLgotCShwYXJzZV9pZWVlX3R5KTogSW4gY2FzZSAnZycsIHRoZSB0eXBlIGlzIG9wdGlvbmFsLgotCi0JKiBwcmRiZy5jIChwcl9maXhfdmlzaWJpbGl0eSk6IERvbid0IGFib3J0IG9uCi0JREVCVUdfVklTSUJJTElUWV9JR05PUkUuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX25hbWVfdHlwZSk6IENvcnJlY3QgZXJyb3IgbWVzc2FnZS4KLQotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuICBVc2UgaXQgd2hlbmV2ZXIgbGlua2luZyBhCi0JcHJvZ3JhbS4KLQotVGh1IEF1ZyAxNSAxOTozMDo0MSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIHN5bWJvbGljIGRvdWJsZXF1b3RlcyBhcm91bmQgdGhlIHZlcnNpb24KLQludW1iZXIuCi0KLVRodSBBdWcgIDggMTI6Mjc6NTIgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogQWRkIGJldHRlciBzdXBwb3J0IGZvciBERUMgQyBjb21waWxhdGlvbi4KLQlBZGQgbmV3IG1hY3JvcyBhcyBpbiBNYWtlZmlsZS5pbi4KLQotV2VkIEF1ZyAgNyAxNDoyNzozMyAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURfREVDTEFSQVRJT04gb24gc3Ryc3RyIGFuZCBzYnJrLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCi0JKE5FRURfREVDTEFSQVRJT05fU0JSSyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogYnVjb21tLmggKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKHNicmspOiBEZWNsYXJlIGlmIEhBVkVfU0JSSyBhbmQgTkVFRF9ERUNMQVJBVElPTl9TQlJLLgotCi0JKiBwcmRiZy5jIChwcl9lbmRfc3RydWN0X3R5cGUpOiBBdm9pZCB1c2luZyBhIHN0cmluZyBjb25zdGFudCBpbgotCWFzc2VydCwgZm9yIHRoZSBiZW5lZml0IG9mIGJyb2tlbiBhc3NlcnQgbWFjcm9zLgotCi1GcmkgSnVsIDI2IDE0OjA2OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGRpc2FzbV9pbmZvLmZsYXZvdXIgZnJvbQotCWFiZmQuCi0KLVR1ZSBKdWwgMjMgMTM6NTk6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNlY2RhdGEpOiBJbiBub24gRExMVE9PTF9QUEMgY2FzZSwgY2hhbmdlIGFsaWdubWVudAotCW9mIC50ZXh0IHNlY3Rpb24gdG8gMi4KLQotTW9uIEp1bCAyMiAwODo0NjoxNSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzKTogIEZpeCB0ZXN0IGZvciBzdGFicyBzZWN0aW9ucwotCWVuZGluZyB3aXRoIG51bWJlcnMuICBUaGlzIGZpeGVzIGEgcHJvYmxlbSB3aXRoIC5zdGFiIGJlaW5nCi0JY29uZnVzZWQgd2l0aCAuc3RhYi5pbmRleC4KLQotV2VkIEp1bCAxMCAxMzozMjoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlKTogUmV0dXJuIGEgdm9pZCAqIGZvciBhCi0JdGVtcGxhdGUsIHJhdGhlciB0aGFuIHNpbXBseSBhYm9ydGluZy4KLQotTW9uIEp1bCAgOCAxNToyODowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG9wZW5faW5hcmNoKTogQWRkIGZpbGUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYKLQl0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCBhcmNoaXZlLCBzZXQgdGhlIHRhcmdldCBiYXNlZCBvbiB0aGUKLQlmaWxlLgotCSogYXJzdXAuaCAob3Blbl9pbmFyY2gpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLVRodSBKdWwgIDQgMTI6MDA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byBjeWdudXMtMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotCSogcmRjb2ZmLmMgKHBhcnNlX2NvZmYpOiBHZXQgYWRkcmVzcyB0byBwYXNzIHRvIGRlYnVnX2VuZF9mdW5jdGlvbgotCWZyb20gZnVuY3Rpb24gc2l6ZSwgbm90IHZhbHVlIG9mIC5lZiBzeW1ib2wuICBGcm9tIE5pbmcKLQlNb3NiZXJnZXItVGFuZyA8bmluZ0BBWlN0YXJOZXQuY29tPi4KLQotU2F0IEp1biAyOSAyMToxODowOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IEFkZCAtbyBvcHRpb24sIGFuZCBoYW5kbGUgaXQuCi0JKHN0cmlwX3VzYWdlKTogTWVudGlvbiAtby4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmlwLjE6IE1lbnRpb24gLW8uCi0KLU1vbiBKdW4gMjQgMTc6MTk6MDIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0JSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYgc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogQXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQotTW9uIEp1biAyNCAxMTo1OToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZW5kaWFuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC1FQi8tRUwvLS1lbmRpYW4uCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZW5kaWFuIi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IElmIGVuZGlhbm5lc3Mgd2FzIHNwZWNpZmllZCwgcmVwbGFjZQotCWFiZmQtPnh2ZWMgd2l0aCBhIGNvcHkgb2YgaXRzZWxmIHdpdGggdGhlIGdpdmVuIGVuZGlhbm5lc3MuCi0JKG1haW4pOiBIYW5kbGUgLUVCLy1FTC8tLWVuZGlhbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogTWVudGlvbiAtRUIvLUVMLy0tZW5kaWFuLgotCi0JKiBvYmpkdW1wLmM6IE1ha2UgbW9zdCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBzdGF0aWMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAotCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi1TdW4gSnVuIDIzIDE0OjQ3OjM2IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNlY2RhdGEpOiBDaGFuZ2VkIC5yZGF0YSB0byAucmVsZGF0YSBzbyAucmVsb2Mgd2lsbCB3b3JrLgotCShtYWtlX29uZV9saWJfZmlsZSk6IFJlbW92ZWQgY3J1ZnQuICgjaWYgMSkKLQotV2VkIEp1biAxOSAxNDo0NjozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoc3RhYnMpOiBDaGFuZ2UgZnJvbSBzdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgKiB0bwotCWJmZF9ieXRlICouCi0JKHByaW50X3NlY3Rpb25fc3RhYnMpOiBGZXRjaCBzdGFicyBpbmZvcm1hdGlvbiBkaXJlY3RseSwgcmF0aGVyCi0JdGhhbiBhc3N1bWluZyB0aGF0IHN0cnVjdCBpbnRlcm5hbF9ubGlzdCBpcyB0aGUgcmlnaHQgc2l6ZS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgY2hhbmdlIHRvIGJpbmFyeSBmb3JtYXQ6IGZpbGUgcG9zaXRpb24KLQliYXNlZCBvbiBsb2FkIGFkZHJlc3MsIG5vdCBzZWN0aW9uIFZNQS4KLQotCSogYnVjb21tLmg6IERlZmluZSBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORCBpZiB0aGV5IGFyZQotCW5vdCBhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBKdW4gMTggMTg6MjU6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIGRlZmxleC5jLgotCi1UdWUgSnVuIDE4IDE1OjAzOjQ0IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWcuaC12bXMsIG1ha2VmaWxlLnZtczogTmV3IGZpbGVzLgotCi1Nb24gSnVuIDE3IDA5OjQ3OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IFVzZSBCRkRfUkVMT0NfUlZBIHJhdGhlciB0aGFuCi0JQkZEX1JFTE9DXzMyIGluIElEQVRBNy4KLQotV2VkIEp1biAxMiAxMTo1MjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHN0cnVjdCBnZXRfcmVsb2NzX2luZm8pOiBEZWZpbmUuCi0JKGxpbmVfbnVtYmVycyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAibGluZS1udW1iZXJzIi4KLQkodXNhZ2UpOiBNZW50aW9uIC1sIGFuZCAtLWxpbmUtbnVtYmVycy4KLQkobWFpbik6IEhhbmRsZSAtbC4KLQkocHJpbnRfc3ltYm9sKTogUHJpbnQgbGluZSBudW1iZXJzIGlmIHJlcXVlc3RlZC4KLQkoZ2V0X3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBiaW51dGlscy50ZXhpLCBubS4xOiBEb2N1bWVudCAtbC8tLWxpbmUtbnVtYmVycy4KLQotVHVlIEp1biAxMSAyMDoxMjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY19zZXQpOiBBZGQgc2VjIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgSWYgd2l0aF9saW5lX251bWJlcnMgaXMgc2V0LCBkaXNwbGF5IGxpbmUgbnVtYmVycyBvZgotCXJlbG9jYXRpb24gZW50cmllcy4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLWwgd2l0aCAtci4KLQotTW9uIEp1biAxMCAyMzo0Mjo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG9wZW5faW5hcmNoKTogUmVwb3J0IEJGRCBlcnJvciBtZXNzYWdlIGlmIGFuIGFyY2hpdmUgY2FuCi0Jbm90IGJlIHJlY29nbml6ZWQuICBMaXN0IG1hdGNoaW5nIGZvcm1hdHMgaWYgdGhlIGZpbGUgaXMKLQlhbWJpZ3VvdXNseSByZWNvZ25pemVkLgotCShyYW5saWJfdG91Y2gpOiBMaWtld2lzZS4KLQotVGh1IEp1biAgNiAxMzo1NjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogQWRkIG5vdGVzIG9uIGhvdyB0byBidWlsZCBpZiB5b3UgZG9uJ3QgaGF2ZSBhci4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBvbGQgaW5jb3JyZWN0IHNldHRpbmcgb2YgQ0MuCi0KLVR1ZSBKdW4gIDQgMTA6NTI6NDkgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgY2hlY2sgdG8gc2VlIGlmIHRvb2xkaXIgZXhpc3RzLgotCU1ha2UgJCh0b29sZGlyKSBhbmQgJCh0b29sZGlyKS9iaW4uCi0KLU1vbiBKdW4gIDMgMTc6NDA6MjMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBNYWtlIG1haW4gYW4gaW50IGZ1bmN0aW9uLCBub3Qgdm9pZC4KLQotRnJpIE1heSAzMSAxMzo1OToyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKGZpbHRlcl9zeW1ib2xzKTogQ2hlY2sgZm9yIEJTRl9XRUFLIGFzIHdlbGwgYXMKLQlCU0ZfR0xPQkFMLgotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgTWF5ICA4IDE2OjU3OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IE1ha2UgY2xlYXIgdGhhdCBpdCBpcyBvbmx5IGEgd2FybmluZwotCXdoZW4gdGhlIG91dHB1dCBmaWxlIGNhbiBub3QgcmVwcmVzZW50IHRoZSBhcmNoaXRlY3R1cmUuCi0KLUZyaSBNYXkgIDMgMTE6MzA6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCByZWZlciB0byBieXRlcyBwYXN0IHRoZSBlbmQKLQlvZiBkYXRhLgotCi1XZWQgQXByIDI0IDE0OjEwOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmRkYmcuYyAocmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8pOiBNb3ZlIGNhbGwgdG8KLQlmcmVlX3NhdmVkX3N0YWJzIG91dHNpZGUgdGhlIGxvb3Agb3ZlciB0aGUgc3ltYm9scy4KLQotVHVlIEFwciAyMyAxMjo1NjoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBzeW1ib2xzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGgKLSAJYC4nIGFmdGVyIG90aGVyIHN5bWJvbHMuICBJZiBubyBvdGhlciBkZWNpc2lvbiBjYW4gYmUgbWFkZSwgc29ydAotCXN5bWJvbHMgYnkgbmFtZS4KLQotVGh1IEFwciAxOCAxNjowMjoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlcC1pbi5zZWQ6IFN1YnN0aXR1dGUgJChCRkRESVIpIGZvciBAQkZERElSQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoZGVwLnNlZCk6IFN1YnN0aXR1dGUgJChCRkRESVIpIGZvciBAQkZERElSQC4KLQotVHVlIEFwciAxNiAxMzo1MDoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJkY29mZi5jOiBOZXcgZmlsZS4KLQkqIHJkZGJnLmMgKHJlYWRfZGVidWdnaW5nX2luZm8pOiBSZWFkIENPRkYgc3ltYm9scyBpZiBDT0ZGIGZsYXZvdXIKLQlhbmQgbm8gc3RhYnMgd2VyZSBmb3VuZC4KLQkqIGJ1ZGJnLmggKHBhcnNlX2NvZmYpOiBEZWNsYXJlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgcmRjb2ZmLmMuCi0JKERFQlVHX09CSlMpOiBBZGQgcmRjb2ZmLm8uCi0KLU1vbiBBcHIgMTUgMTU6NTU6MDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbmxtY29udi5jIChjaG9vc2VfdGVtcF9iYXNleyxfdHJ5fSk6IERlbGV0ZSwgaW4gbGliaWJlcnR5IG5vdy4KLQkobGlua19pbnB1dHMpOiBVcGRhdGUgY2FsbCB0byBjaG9vc2VfdGVtcF9iYXNlLgotCi1Nb24gQXByICA4IDE0OjQwOjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjkgMTY6MTE6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBQcmludCB0aGUgU0VDX0xJTktfT05DRSBmbGFnCi0JYW5kIHRoZSBTRUNfTElOS19EVVBMSUNBVEVTIGZpZWxkLgotCi1GcmkgTWFyIDI5IDExOjM1OjU1IDE5OTYgIEouVC4gQ29ua2xpbiAgKGp0Y0BsaXNhLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuMTogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgotCi1UaHUgTWFyIDI4IDE0OjE3OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JzdGFicy5jIChzdGFiX2VudW1fdHlwZSk6IFNldCBidWYgYmVmb3JlIHVzaW5nIGl0LgotCi1GcmkgTWFyIDIyIDE1OjQ5OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIGZpZWxkIGFiZmQuCi0JKHN0YXJ0X3N0YWIpOiBBZGQgYWJmZCBwYXJhbWV0ZXIuCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogU2tpcCB0aGUgc3ltYm9sIGxlYWRpbmcgY2hhciB3aGVuIHNlYXJjaGluZwotCWZvciB0aGUgdmFsdWUgb2YgYSBnbG9iYWwgc3ltYm9sLgotCSogYnVkYmcuaCAoc3RhcnRfc3RhYik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IFBhc3MgYWJmZCB0bwotCXN0YXJ0X3N0YWIuCi0JKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjEgMTI6NDA6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmMgKHN0YWJfZnVuY3Rpb25fdHlwZSk6IE91dHB1dCBhbiBlbXB0eSB0eXBlZGVmIGZvciBhbgotCXVudXNlZCBhcmd1bWVudCwgcmF0aGVyIHRoYW4gbWFraW5nIHVwIGEgbWVhbmluZ2xlc3MgbmFtZS4KLQkoc3RhYl92YXJpYWJsZSk6IFVzZSBOX1JTWU0gZm9yIGEgREVCVUdfUkVHSVNURVIgdmFyaWFibGUuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaW5mbyk6IEFkZCBnbG9iYWxfdmFycyBmaWVsZC4KLQkocGFyc2VfaWVlZV9iZSk6IFdoZW4gZW5kaW5nIHRoZSBnbG9iYWwgdHlwZWRlZiBibG9jaywgY29weSB0aGUKLQl2YXJpYWJsZXMgaW50byBpbmZvLT5nbG9iYWxfdmFycy4KLQkocGFyc2VfaWVlZV9hdG4pOiBEb24ndCByZXF1aXJlIGFuIE5OIHJlY29yZCBmb3IgYSBwbWlzYyBBVE4uCi0JKGllZWVfcmVhZF9yZWZlcmVuY2UpOiBTZWFyY2ggdGhlIGdsb2JhbCB2YXJpYWJsZXMgYWZ0ZXIgdGhlIGxvY2FsCi0JdmFyaWFibGVzLgotCi1XZWQgTWFyIDIwIDE4OjA4OjE5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBNYWtlIHN1cmUgc3ltX25hbWUgaXMgYWx3YXlzIHNldC4KLQkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IEFsd2F5cyBwdXQgYSBzcGFjZSBhZnRlciB0aGUgc2VjdGlvbiBuYW1lLgotCShkdW1wX2JmZF9oZWFkZXIpOiBUZXJtaW5hdGUgb3V0cHV0IHdpdGggbmV3bGluZS4KLQotV2VkIE1hciAyMCAxNjozNToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYzogTmV3IGZpbGUuCi0JKiBidWRiZy5oICh3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyk6IERlY2xhcmUuCi0JKiBvYmpjb3B5LmMgKHdyaXRlX2RlYnVnZ2luZ19pbmZvKTogRm9yIENPRkYgb3IgRUxGLCBvdXRwdXQgc3RhYnMKLQlpbiBzZWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHdyc3RhYnMuYy4KLQkoV1JJVEVfREVCVUdfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChPQkpDT1BZX1BST0cpKTogVXNlICQoV1JJVEVfREVCVUdfT0JKUyksIG5vdCAkKERFQlVHX09CSlMpLgotCSgkKFNUUklQX1BST0cpKTogTGlrZXdpc2UuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfbWVtYmVycyk6IE1ha2UgdHlwZSBzdHViIGRldGVjdGlvbiBtb3JlIGxpa2UKLQlnZGIuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaGFuZGxlKTogQWRkIGZpZWxkcyBjb21wbGV4X2Zsb2F0X2luZGV4IGFuZAotCWNvbXBsZXhfZG91YmxlX2luZGV4LgotCShpZWVlX2NvbXBsZXhfdHlwZSk6IENhY2hlIHR5cGUgaW5kZXggaW4gY29tcGxleF9mbG9hdF9pbmRleCBhbmQKLQljb21wbGV4X2RvdWJsZV9pbmRleCwgZGVwZW5kaW5nIHVwb24gc2l6ZS4gIFNldCBzaXplIG9uIHR5cGUgc3RhY2sKLQl0byBzaXplICogMi4KLQotCSogaWVlZS5jIChpZWVlX2VtcHR5X3R5cGUpOiBVc2UgYnVpbHRpbl91bmtub3duLCBub3QgMC4KLQkoaWVlZV92b2lkX3R5cGUpOiBVc2UgYnVpbHRpbl92b2lkLCBub3QgMS4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX3R5KTogSGFuZGxlICdWJyB0eXBlIGNvZGUuCi0JKHBhcnNlX2llZWVfYXRuKTogRG9uJ3QgcmVxdWlyZSB0d28gbnVtYmVycyBmb3IgdHlwZSAxMC4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX2JlKTogQWRkIG9uZSB0byBvZmZzZXQgYXQgZW5kIG9mIGZ1bmN0aW9uIG9yCi0JYmxvY2suCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfYmxvY2spOiBBZGQgZmllbGQgc2tpcC4KLQkocGFyc2VfaWVlZV9iYik6IERvbid0IGNhbGwgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIGZvciBfX1hSWUNQUAotCWZ1bmN0aW9uLCBhbmQgc2V0IHNraXAgZmllbGQuCi0JKHBhcnNlX2llZWVfYmUpOiBEb24ndCBjYWxsIGRlYnVnX2VuZF9mdW5jdGlvbiBpZiBza2lwIGlzIHNldC4KLQotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IEFkZCBmaWVsZHMgY3VycmVudF93cml0ZV9saW5lbm8KLQlhbmQgY3VycmVudF93cml0ZV9saW5lbm9faW5kZXguCi0JKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBjdXJyZW50X3dyaXRlX2xpbmVubyBhbmQKLQljdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCBmb3IgZWFjaCB1bml0LiAgQ2FsbAotCWRlYnVnX3dyaXRlX2xpbmVub3MgcmF0aGVyIHRoYW4gd3JpdGluZyBvdXQgdGhlIGxpbmUgbnVtYmVycwotCWRpcmVjdGx5LgotCShkZWJ1Z193cml0ZV9mdW5jdGlvbik6IENhbGwgZGVidWdfd3JpdGVfbGluZW5vcy4KLQkoZGVidWdfd3JpdGVfYmxvY2spOiBMaWtld2lzZS4KLQkoZGVidWdfd3JpdGVfbGluZW5vcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGRlYnVnLmMgKGRlYnVnX3dyaXRlX3R5cGUpOiBGb3IgREVCVUdfS0lORF9GVU5DVElPTiwgcHVzaCByZXR1cm4KLQl0eXBlIGJlZm9yZSBhcmd1bWVudHMuCi0KLU1vbiBNYXIgMTggMTg6MDU6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19GVU5DX1ZGT1JLLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBkbGx0b29sLmMsIG5sbWNvbnYuYzogSW5jbHVkZSA8dmZvcmsuaD4gaWYgSEFWRV9WRk9SS19IIGlzCi0JZGVmaW5lZC4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9yYW5nZV90eXBlKTogQSBjb21wbGV4IHR5cGUgaXMgZGVmaW5lZCBhcyBhCi0Jc3VicmFuZ2Ugb2YgaXRzZWxmIHdpdGggdGhlIGhpZ2ggYm91bmQgemVyby4KLQkqIGllZWUuYyAoaWVlZV9jb21wbGV4X3R5cGUpOiBEb24ndCBjcmFzaCBvbiBzaXplcyBvZiAxMiBvciAxNi4KLQotVHVlIE1hciAxMiAxMjowOTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV91bmRlZmluZWRfdGFnKTogU3dpdGNoIHRvIGdsb2JhbF90eXBlcyBldmVuCi0JaWYgaXQgaXMgbm90IGVtcHR5LgotCShpZWVlX3RhZ190eXBlKTogRm9yIGFuIGVudW0sIGxvb2sgdGhyb3VnaCBpbmZvLT5lbnVtcy4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z190eXBlX3NhbWVwKTogRG9uJ3QgbG9vcCBlbmRsZXNzbHkgaW4KLQlERUJVR19LSU5EX0VOVU0gY2FzZS4gIEZyb20gRXJpYyBCYXVyIDxlY2JAbmV4ZW4uY29tPi4KLQotTW9uIE1hciAxMSAxMjozNTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IENhbGwgc2F2ZV9zdGFiIGZvcgotCWVhY2ggc3RhYiBlbnRyeSwgY2FsbCBzdGFiX2NvbnRleHQgb24gYW4gZXJyb3IsIGFuZCBjYWxsCi0JZnJlZV9zYXZlZF9zdGFicyBiZWZvcmUgcnR1cm5pbmcuCi0JKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTGlrZXdpc2UuCi0JKFNBVkVfU1RBQlNfQ09VTlQpOiBEZWZpbmUuCi0JKHN0cnVjdCBzYXZlZF9zdGFiKTogRGVmaW5lLgotCShzYXZlZF9zdGFicywgc2F2ZWRfc3RhYnNfaW5kZXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc2F2ZV9zdGFiLCBzdGFiX2NvbnRleHQsIGZyZWVfc2F2ZWRfc3RhYnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9zLgotCi0JKiBvYmpkdW1wLmMgKHN0YWJfbmFtZSk6IFJlbW92ZS4KLQkoc3RydWN0IHN0YWJfcHJpbnQpOiBSZW1vdmUuCi0JKHN0YWJfcHJpbnQpOiBSZW1vdmUuCi0JKGR1bXBfc3RhYnMpOiBEb24ndCBpbml0aWFsaXplIHN0YWJfbmFtZS4KLQkocHJpbnRfc2VjdGlvbl9zdGFicyk6IENhbGwgYmZkX2dldF9zdGFiX25hbWUgcmF0aGVyIHRoYW4gdXNpbmcKLQl0aGUgc3RhYl9uYW1lIGFycmF5LgotCi1UdWUgRmViIDI3IDE5OjUyOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHJkYmcuYyAocHJfaW50X2NvbnN0YW50KTogSW5pdGlhbGl6ZSBpbmZvIGNvcnJlY3RseS4KLQkocHJfZmxvYXRfY29uc3RhbnQpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAyNiAxODoxMTozNyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIHRvIGhhbmRsZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCi1TYXQgRmViIDI0IDExOjIxOjQ5IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBTZWFyY2ggJChCRkRMSUIpIGJlZm9yZQotCSQoT1BDT0RFUykuCi0KLVRodSBGZWIgMTUgMTI6NDQ6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHRhbXBlciB3aXRoIExERkxBR1MuICBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlCi0JY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShjaGVjayk6IFVzZSAkKFJQQVRIX0VOVlZBUikgcmF0aGVyIHRoYW4gTERfTElCUkFSWV9QQVRILgotCi0JKiBvYmpjb3B5LmMgKHNtYXJ0X3JlbmFtZSk6IFJhdGhlciB0aGFuIGRvaW5nIGNobW9kIHRoZW4gY2hvd24sIGRvCi0JY2htb2Qgd2l0aG91dCBzZXR1aWQsIHRoZW4gY2hvd24sIHRoZW4gY2htb2Qgd2l0aCBzZXR1aWQuCi0KLVdlZCBGZWIgMTQgMTY6NDY6NDIgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogYXJzdXAuYyAobWFwX292ZXJfbGlzdCk6IFJlaW5kZW50LiAgRG9uJ3QgYXNzdW1lIHRoYXQgdGhlCi0JZnVuY3Rpb24gZG9lcyBub3QgZGVsZXRlIHRoZSBCRkQuCi0JKGFyX2FkZGxpYl9kb2VyKTogRG9uJ3Qgc2V0IHByZXYtPm5leHQgaWYgcHJldiBpcyBOVUxMLgotCi1XZWQgRmViIDE0IDE1OjEyOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3JlZ25vX3RvX2dlbnJlZyk6IENvbnZlcnQgcmVnaXN0ZXIgbnVtYmVycyBmb3IgbTY4awotCWFuZCBpOTYwLgotCShpZWVlX2dlbnJlZ190b19yZWdubyk6IExpa2V3aXNlLgotCi1Nb24gRmViIDEyIDE0OjE5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB3cml0ZSBjb2RlIHRvIHB1dCB0eXBlcyBpbiB0aGUKLQlnbG9iYWwgdHlwZSBibG9jayB3aGVuIHBvc3NpYmxlLCB0byBvdXRwdXQgcmFuZ2VzIGZvciBhbGwgbWVtb3J5Ci0Jb2NjdXBpZWQgYnkgdGhlIG1vZHVsZSwgYW5kIHRvIGltcHJvdmUgZWZmaWNpZW5jeS4KLQotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IFJlbW92ZSBjbGFzc19tYXJrIGZpZWxkLiAgQWRkCi0JaWRfbGlzdCBhbmQgY29tcGFyZV9saXN0IGZpZWxkcy4KLQkoc3RydWN0IGRlYnVnX2NsYXNzX2lkKTogRGVmaW5lLgotCShzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QpOiBEZWZpbmUuCi0JKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBpbmZvLT5pZF9saXN0Ci0JKGRlYnVnX3dyaXRlX25hbWUpOiBSZW1vdmUgcmVmZXJlbmNlIHRvIGluZm8tPmNsYXNzX21hcmsuCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBHZXQgaWQgZm9yIGFsbCBzdHJ1Y3RzIGFuZCBjbGFzc2VzLiAgU2ltcGxpZnkKLQl0ZXN0IGZvciB3aGV0aGVyIHN0cnVjdCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBHZXQgaWQgZm9yIGFsbCBjbGFzc2VzLiAgU2ltcGxpZnkgdGVzdAotCWZvciB3aGV0aGVyIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KLQkoZGVidWdfd3JpdGVfYmxvY2spOiBEb24ndCB3cml0ZSBvdXQgYmxvY2tzIG90aGVyIHRoYW4gdGhlIHRvcAotCWxldmVsIGJsb2NrIGlmIHRoZXkgaGF2ZSBubyBsb2NhbCB2YXJpYWJsZXMuCi0JKGRlYnVnX3NldF9jbGFzc19pZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlYnVnX3R5cGVfc2FtZXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWJ1Z19jbGFzc190eXBlX3NhbWVwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIHByZGJnLmMgKHByX3N0YXJ0X3N0cnVjdF90eXBlKTogQWx3YXlzIHByaW50IGlkLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX3RhZ190eXBlKTogTGlrZXdpc2UuCi0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBzeW1zIGFuZCBzeW1jb3VudCBmaWVsZHMuCi0JKHN0YXJ0X3N0YWIpOiBBZGQgc3ltcyBhbmQgc3ltY291bnQgcGFyYW1ldGVycy4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShwYXJzZV9zdGFiX3N0cmluZyk6IExvb2sgdXAgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgc3ltYm9sIHRhYmxlCi0JdG8gZ2V0IHRoZSByaWdodCB2YWx1ZS4KLQkqIGJ1ZGJnLmggKHN0YXJ0X3N0YWIpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBBZGQgc3ltcyBhbmQKLQlzeW1jb3VudCBwYXJhbWV0ZXJzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX2FycmF5X3R5cGUpOiBJZiB0aGUgaW5kZXggdHlwZSBpcyAwLCB1c2UKLQlpbnQuCi0KLVdlZCBGZWIgIDcgMTQ6MTc6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc3RhcnRfY29tcGlsYXRpb25fdW5pdCk6IENsZWFyIG1vZGlmaWVkIGFuZAotCW1vZGlmaWVkX2FsbG9jIGZpZWxkcyBvZiBpbmZvLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAtLWVuYWJsZS1zaGFyZWQuICBTdWJzdGl0dXRlIG5ldwotCXZhcmlhYmxlcyBCRkRMSUIgYW5kIE9QQ09ERVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQkZETElCKTogU2V0IHRvIEBCRkRMSUJALgotCShPUENPREVTKTogU2V0IHRvIEBPUENPREVTQC4KLQotTW9uIEZlYiAgNSAxNjoxODo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KLQlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluIChITERGTEFHUyk6IE5ldyBzdWJzdGl0dXRpb24uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERkxBR1MpOiBOZXcgdmFyaWFibGUuICBNYWtlIGFsbCBsaW5rcyB1c2UKLQkkKEhMREZMQUdTKSBiZWZvcmUgJChDRkxBR1MpIGFuZCAkKExERkxBR1MpLgotCShCRkRMSUJfREVQKTogTmV3IHZhcmlhYmxlLiAgUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgJChCRkQpIGFzCi0JYSBkZXBlbmRlbmN5IHdpdGggJChCRkRMSUJfREVQKS4gIFJlbW92ZSAkKEJGRCkgYXMgYSBkZXBlbmRlbmN5IGlmCi0JdGhlcmUgaXMgYWxzbyBhIGRlcGVuZGVuY3kgb24gJChBRERMX0RFUFMpLgotCShCRkRMSUIpOiBSZW5hbWUgZnJvbSBCRkQ7IGNoYW5nZSBhbGwgdXNlczsgc2V0IHRvIC1MLi4vYmZkIC1sYmZkLgotCShPUENPREVTX0RFUCk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuZHMgb2YgJChPUENPREVTKQotCWFzIGEgZGVwZW5kZW5jeSB3aXRoICQoT1BDT0RFU19ERVApLgotCShPUENPREVTKTogU2V0IHRvIC1MLi4vb3Bjb2RlcyAtbG9wY29kZXMuCi0JKEFERExfREVQUyk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mCi0JJChBRERMX0xJQlMpIGFzIGEgZGVwZW5kZW5jeSB3aXRoICQoQURETF9ERVBTKS4KLQkoY2hlY2spOiBTZXQgTERfTElCUkFSWV9QQVRIIGluIHRoZSBlbnZpcm9ubWVudC4KLQkoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEJGRCBjb25maWd1cmUuaG9zdCBhbmQgY29uZmlnLmJmZC4KLQotRnJpIEZlYiAgMiAxNzowMjo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jOiAjaW5jbHVkZSBzdGRhcmcuaCBvciB2YXJhcmdzLmguCi0JKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBDaGFuZ2UgRklMRSogYXJnIHRvIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKi4KLQlBbGwgY2FsbGVycyB1cGRhdGVkLiAgVXNlIGZwcmludGZfZnVuYy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ29uc2lzdGVudGx5IHVzZSBmcHJpbnRmX2Z1bmMuCi0JKG9iamR1bXBfc3ByaW50Zik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFByaW50IGluc24gaW50byBhIGJ1ZmZlciwgcHJpbnQgcmF3IGluc24gb3Vyc2VsdmVzLAotCXRoZW4gcHJpbnQgaW5zbiBtbmVtb25pYy4KLQotRnJpIEZlYiAgMiAxNjo0ODo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAgMSAwOTozODoxOCAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMy02XTg2LSotd2luMzIpOiBCZWNvbWVzIGlbMy02XTg2LSotY3lnd2luMzIuCi0JKHBvd2VycGMqLSotY3lnd2luMzIpOiBOZXcuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1XZWQgSmFuIDMxIDEzOjIyOjAzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLjEuCi0KLU1vbiBKYW4gMjkgMTc6MzY6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEggSiBMdSA8aGpsQHpvb20uY29tPjoKLQkqIG9iamNvcHkuYyAocmVtb3ZlX2xlYWRpbmdfY2hhcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSKTogRGVmaW5lLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXJlbW92ZS1sZWFkaW5nLWNoYXIuCi0JKGZpbHRlcl9zeW1ib2xzKTogSWYgcmVtb3ZlX2xlYWRpbmdfY2hhciwgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQlvZiBhIGdsb2JhbCBzeW1ib2wgbWF0Y2hlcyB0aGUgc3ltYm9sIGxlYWRpbmcgY2hhciBvZiB0aGUgQkZELAotCXJlbW92ZSB0aGUgZmlyc3QgY2hhcmFjdGVyLgotCShjb3B5X29iamVjdCk6IEZpbHRlciB0aGUgc3ltYm9scyBpZiByZW1vdmVfbGVhZGluZ19jaGFyIGlzIHNldC4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tcmVtb3ZlLWxlYWRpbmctY2hhci4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1yZW1vdmUtbGVhZGluZy1jaGFyLgotCi1TYXQgSmFuIDI3IDE1OjQwOjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogQWRkIHByb3RvdHlwZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIG9uCi0JU3VuT1MuCi0KLUZyaSBKYW4gMjYgMTE6NTM6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpIChubSk6IEltcHJvdmUgZG9jdW1lbnRhdGlvbiBvbiBzeW1ib2wgdHlwZXMuCi0JKG9iamR1bXApOiBSZWZlcmVuY2UgdGhlIHN0YWJzIG1hbnVhbCBmcm9tIHRoZSBkaXNjdXNzaW9uIG9mIHRoZQotCS0tc3RhYnMgb3B0aW9uLgotCi1UaHUgSmFuIDI1IDExOjIxOjQ2IDE5OTYgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIGEgInN0YW1wcyIgdGFyZ2V0LgotCi1UaHUgSmFuIDI1IDEzOjUxOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMsIGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBDaGFuZ2Ugb2JqZHVtcCAtaAotCW91dHB1dCB0byBiZSBzaW1wbGVyIGFuZCB0byBpbmNsdWRlIHNlY3Rpb24gZmlsZSBvZmZzZXRzLgotCi1XZWQgSmFuIDI0IDEyOjA2OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9tZW1iZXJzKTogRG9uJ3QgYWRqdXN0IHZvZmZzZXQuCi0KLQkqIGllZWUuYyAoaWVlZV9yZWFkX2N4eF9jbGFzcyk6IERvbid0IG11bHRpcGx5IHZvZmZzZXQgYnkgNC4KLQkoc3RydWN0IGllZWVfd3JpdGVfdHlwZSk6IEFkZCBuYW1lIGZpZWxkLgotCShzdHJ1Y3QgaWVlZV90eXBlX2NsYXNzKTogUmVtb3ZlIG5hbWUgZmllbGQuICBDaGFuZ2UgYWxsIHVzZXMgdG8KLQl1c2UgbmV3IG5hbWUgZmllbGQgaW4gdHlwZSBpbnN0ZWFkLgotCShzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSk6IEluaXRpYWxpemUgbmFtZSBmaWVsZCBvZiB0eXBlLgotCShpZWVlX3N0YXJ0X2NsYXNzX3R5cGUpOiBEb24ndCBpbml0aWFsaXplIGNsYXNzZGVmIGVudHJ5IG9mIHRhZy4KLQkoaWVlZV9jbGFzc19tZXRob2RfdmFyKTogRG9uJ3QgYWRqdXN0IHZvZmZzZXQuCi0JKGllZWVfZW5kX2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV90YWdfdHlwZSk6IEluaXRpYWxpemUgbmV3IG5hbWUgZmllbGQgb2YgdHlwZS4KLQkoaWVlZV90eXBkZWYpOiBTZXQgbmFtZSBhZnRlciBjb3B5aW5nIGluIHR5cGUgaW5mb3JtYXRpb24uCi0KLQkqIGRlYnVnLmMgKFZPRkZTRVRfU1RBVElDX01FVEhPRCk6IERlZmluZSBhcyAtMSwgbm90IDEuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSk6IERlZmluZS4KLQkoc3RydWN0IGllZWVfaGFuZGxlKTogQWRkIG1vZGlmaWVkIGFuZCBtb2RpZmllZF9hbGxvYyBmaWVsZHMuCi0JKGllZWVfZ2V0X21vZGlmaWVkX2luZm8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3BvaW50ZXJfdHlwZSk6IENhY2hlIHR5cGUgaW5kZXguCi0JKGllZWVfY29uc3RfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3ZvbGF0aWxlX3R5cGUpOiBMaWtld2lzZS4KLQotCSogaWVlZS5jIChpZWVlX2RlZmluZV9uYW1lZF90eXBlKTogV2hlbiBjcmVhdGluZyBhIHRhZyBmb3IgYW4KLQlhbm9ueW1vdXMgc3RydWN0LCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5LgotCShpZWVlX3RhZ190eXBlKTogTGlrZXdpc2UuCi0JKiBkZWJ1Zy5jIChkZWJ1Z193cml0ZV90eXBlKTogT25seSBjaGVjayBhbmQgc2V0IGlkIGZpZWxkIGZvciBhbgotCXVubmFtZWQgb2JqZWN0LgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0KLQkqIGllZWUuYzogVmFyaW91cyBjaGFuZ2VzIHRvIHdyaXRlIG91dCB0eXBlcyBmb3IgZnVuY3Rpb25zIGFuZAotCXJlZmVyZW5jZXMsIGFuZCB0byBub3Qgd3JpdGUgb3V0IHVubmVjZXNzYXJ5IGZ1bmN0aW9uIHR5cGVzLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX3Zhcik6IFJlbW92ZSB2YXJpYWJsZSBmaWVsZC4gIEFkZCBraW5kCi0JZmllbGQsIGFuZCBkZWZpbmUgc29tZSBlbnVtIGNvbnN0YW50cyBmb3IgaXQuCi0JKHBhcnNlX2llZWVfdHkpOiBTZXQga2luZCBmaWVsZCBvZiB2YXJpYWJsZSBmb3IgJ3gnIGFuZCAnWCcgdHlwZXMuCi0JKHBhcnNlX2llZWVfYXRuKTogTWFrZSBhbiBpbmRpcmVjdCBzbG90IGZvciBhbiBleHRlcm5hbCB2YXJpYWJsZSwKLQlhbHRob3VnaCB3ZSBvdGhlcndpc2UgZG9uJ3QgcmVjb3JkIGl0LiAgU2V0IGtpbmQgZmllbGQgcmF0aGVyIHRoYW4KLQl2YXJpYWJsZSBmaWVsZCBvZiBwdmFyLgotCShpZWVlX3JlYWRfY3h4X2NsYXNzKTogVHJ5IHRvIGdldCB0aGUgdHlwZSBvZiBhIHN0YXRpYyBtZW1iZXIuCi0JKGllZWVfcmVhZF9yZWZlcmVuY2UpOiBDaGVjayBraW5kIGZpZWxkIHJhdGhlciB0aGFuIHZhcmlhYmxlCi0JZmllbGQuCi0KLVR1ZSBKYW4gMjMgMTU6NTQ6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byBoYW5kbGUgcmVhZGluZyBDKysgcmVmZXJlbmNlIHR5cGUKLQlpbmZvcm1hdGlvbi4KLQotCSogZGVidWcuaCAoZW51bSBkZWJ1Z192YXJfa2luZCk6IEFkZCBERUJVR19WQVJfSUxMRUdBTC4KLQkoZW51bSBkZWJ1Z19wYXJtX2tpbmQpOiBBZGQgREVCVUdfUEFSTV9JTExFR0FMLgotCSogZGVidWcuYyAoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEhhbmRsZSBERUJVR19LSU5EX0ZVTkNUSU9OLgotCi0JKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byB3cml0ZSBvdXQgZGVmaW5pdGlvbnMgb2YgQysrIGNsYXNzZXMuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX2FwcGVuZF9maWxlbmFtZSk6IFJlbW92ZS4KLQkqIGRlYnVnLmggKGRlYnVnX2FwcGVuZF9maWxlbmFtZSk6IERvbid0IGRlY2xhcmUuCi0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IFJlbW92ZSBsYXN0X3R5cGUgZmllbGQuICBBZGQKLQlzb19zdHJpbmcgYW5kIHNvX3ZhbHVlIGZpZWxkcy4KLQkoZmluaXNoX3N0YWIpOiBDYWxsIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgYmVmb3JlIGNhbGxpbmcKLQlkZWJ1Z19lbmRfZnVuY3Rpb24uICBEb24ndCB3YXJuIGFib3V0IHBlbmRpbmcgdmFyaWFibGVzLgotCShwYXJzZV9zdGFiKTogQWNjdW11bGF0ZSBOX1NPIHN0cmluZ3MgdW50aWwgYSBub24gTl9TTyBzeW1ib2wgaXMKLQlzZWVuLCByYXRoZXIgdGhhbiBjYWxsaW5nIGRlYnVnX2FwcGVuZF9maWxlbmFtZS4gIENhbGwKLQlzdGFiX2VtaXRfcGVuZGluZ192YXJzIGJlZm9yZSBjYWxsaW5nIGRlYnVnX2VuZF9mdW5jdGlvbi4gIERvbid0Ci0Jc2V0IGluZm8tPmxhc3RfdHlwZS4KLQotVHVlIEphbiAyMyAwOTo1Mzo1NCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHVua25vd24gZW5kaWFubmVzcy4KLQlQYXNzIGZwcmludGYgdG8gSU5JVF9ESVNBU1NFTUJMRV9JTkZPLgotCi1Nb24gSmFuIDIyIDE2OjQ2OjQzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JQWRkIG5ldyBvcHRpb24gLS1zaG93LXJhdy1pbnNuLgotCSogb2JqZHVtcC5jIChzaG93X3Jhd19pbnNuKTogTmV3IGdsb2JhbC4KLQkodXNhZ2UpOiBVcGRhdGUuCi0JKGxvbmdfb3B0aW9ucyk6IFVwZGF0ZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBkaXNhc21faW5mby5mbGFncyBpZiAtLXNob3ctcmF3LWluc24uCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBuZXcgYXJjaCxtYWNoLGVuZGlhbiBmaWVsZHMgaW4KLQlkaXNhc21faW5mby4KLQotTW9uIEphbiAyMiAxOToyOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gcGFzcyBhIHNpbmdsZSBpbmZvIGFyZ3VtZW50IGFyb3VuZAotCWluIHRoZSByZWFkaW5nIHJvdXRpbmVzLCByYXRoZXIgdGhhbiBzZXZlcmFsIGFyZ3VtZW50cy4gIEFkZCBjb2RlCi0JdG8gcmVhZCBDKysgZGVidWdnaW5nIHJlY29yZHMuCi0KLQkqIGRlYnVnLmggKGRlYnVnX2dldF90eXBlX3NpemUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfbmFtZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF9iaXRwb3MpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5KTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lKTogRGVjbGFyZS4KLQkqIGRlYnVnLmMgKGRlYnVnX2dldF9yZWFsX3R5cGUpOiBIYW5kbGUgREVCVUdfS0lORF9UQUdHRUQuCi0JKGRlYnVnX2dldF90eXBlX3NpemUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfYml0cG9zKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF9waHlzbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IE1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByZWFsIGtpbmQsIG5vdCBJTkRJUkVDVCwKLQl0byB0YWdfdHlwZS4gIFBhc3MgdGhlIG5hbWUgcmVjdXJzaXZlbHkgZm9yIElORElSRUNULgotCi1GcmkgSmFuIDE5IDEyOjMxOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVidWcuaCAoc3RydWN0IGRlYnVnX3dyaXRlX2Zucyk6IFJlbW92ZSBlbGxpcHNpc190eXBlLiAgQWRkIGludAotCWFuZCBib29sZWFuIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25fdHlwZS4gIEFkZCBib29sZWFuIHBhcmFtZXRlciB0bwotCW1ldGhvZF90eXBlLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBEb24ndCBkZWNsYXJlLgotCShkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUpOiBBZGQgZGVidWdfdHlwZSAqIGFuZCBib29sZWFuCi0JcGFyYW1ldGVycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZGVidWdfbWFrZV9tZXRob2RfdHlwZSk6IEFkZCBib29sZWFuIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogQWRkIGJvb2xlYW4gKiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoZGVidWdfZ2V0X3RhcmdldF90eXBlKTogRGVjbGFyZS4KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlKTogQWRkIGZpZWxkcyBhcmdfdHlwZXMgYW5kCi0JdmFyYXJncy4KLQkoc3RydWN0IGRlYnVnX21ldGhvZF90eXBlKTogQWRkIGZpZWxkIHZhcmFyZ3MuCi0JKGRlYnVnX2VsbGlwc2lzX3R5cGUsIEVMTElQU0lTX1ApOiBSZW1vdmUuCi0JKGRlYnVnX21ha2VfZWxsaXBzaXNfdHlwZSk6IFJlbW92ZS4KLQkoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ190eXBlcyBhbmQgdmFyYXJncyBwYXJhbWV0ZXJzLgotCShkZWJ1Z19tYWtlX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogQWRkIHB2YXJhcmdzIHBhcmFtZXRlci4KLQkoZGVidWdfZ2V0X3RhcmdldF90eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z193cml0ZV90eXBlKTogSW4gY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OLCBwdXNoIGFyZ3VtZW50Ci0JdHlwZXMgYW5kIHBhc3MgY291bnQgdG8gZnVuY3Rpb25fdHlwZS4gIEluIERFQlVHX0tJTkRfTUVUSE9ELCB1c2UKLQlhIHNpZ25lZCBpbnQgZm9yIHRoZSBjb3VudCwgZG9uJ3QgY2FsbCBlbGxpcHNpc190eXBlLCBhbmQgcGFzcwotCXZhcmFyZ3MgdG8gbWV0aG9kX3R5cGUuCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvKTogQWRkIHZhcmFyZ3MgZmllbGQuCi0JKHN0YWJfZGVtYW5nbGVfYXJndHlwZXMpOiBBZGQgcHZhcmFyZ3MgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHN0YWJfZGVtYW5nbGVfYXJncyk6IExpa2V3aXNlLgotCShzdGFiX2RlbWFuZ2xlX3R5cGUpOiBJbiBjYXNlICdGJywgcGljayB1cCBhcmd1bWVudCB0eXBlcy4KLQkqIHByZGJnLmMgKHByX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCi0JKHByX2Z1bmN0aW9uX3R5cGUpOiBBZGQgYXJnY291bnQgYW5kIHZhcmFyZ3MgcGFyYW1ldGVycy4KLQkocHJfbWV0aG9kX3R5cGUpOiBBZGQgdmFyYXJncyBwYXJhbWV0ZXIuCi0JKiBpZWVlLmMgKGllZWVfZWxsaXBzaXNfdHlwZSk6IFJlbW92ZS4KLQkoaWVlZV9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ2NvdW50IGFuZCB2YXJhcmdzIHBhcmFtZXRlcnMuCi0JKGllZWVfbWV0aG9kX3R5cGUpOiBBZGQgdmFyYXJncyBwYXJhbWV0ZXIuICBSZW1vdmUgbW9zdCBvZgotCWZ1bmN0aW9uIGJvZHksIGFuZCBqdXN0IGNhbGwgaWVlZV9mdW5jdGlvbl90eXBlLgotCi0JKiBzdGFicy5jOiBJbmNsdWRlICJkZW1hbmdsZS5oIi4gIEFkZGVkIHNldmVyYWwgbmV3IHN0YXRpYwotCWZ1bmN0aW9ucyBub3QgbGlzdGVkIGJlbG93IHRvIGRlbWFuZ2xlIGFyZ3VtZW50IHR5cGVzOyB0aGV5IGFyZQotCWFsbCBjYWxsZWQgdmlhIHN0YWJfZGVtYW5nbGVfYXJndHlwZXMuCi0JKGZpbmlzaF9zdGFiKTogSWYgdGhlIGtpbmQgb2YgYW4gdW5kZWZpbmVkIHRhZyBpcwotCURFQlVHX0tJTkRfSUxMRUdBTCwgdXNlIERFQlVHX0tJTkRfU1RSVUNUIGluc3RlYWQuICBXYXJuIGlmIHRoZXJlCi0JYXJlIGFueSBwZW5kaW5nIHZhcmlhYmxlLgotCShwYXJzZV9zdGFiKTogRG9uJ3QgY2xvc2UgdGhlIGZ1bmN0aW9uIHdoZW4gdGhlIGJsb2NrIGRlcHRoIGdvZXMKLQl0byB6ZXJvLiAgUGFzcyB2YWx1ZSB0byBkZWJ1Z19lbmRfZnVuY3Rpb24uCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogSW4gY2FzZSAnVCcsIHBhc3MgdGhlIG5hbWUgdG8KLQlwYXJzZV9zdGFiX3R5cGUuCi0JKHBhcnNlX3N0YWJfdHlwZSk6IEluIGNhc2UgJ3gnLCB1c2Ugc3RhYl9maW5kX3RhZ2dlZF90eXBlLiAgSW4KLQljYXNlICcjJywgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIHZhcmlhYmxlIG51bWJlcnMgb2YgYXJndW1lbnRzLgotCShwYXJzZV9zdGFiX3N0cnVjdF90eXBlKTogQWRkIHRhZ25hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHBhcnNlX3N0YWJfbWVtYmVycyk6IEFkZCB0YWduYW1lIGFuZCB0eXBlbnVtcyBwYXJhbWV0ZXJzLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuICBJZiB0aGUgdHlwZSBvZiBhIG1ldGhvZCBpcyBhIHN0dWIsIGNhbGwKLQlwYXJzZV9zdGFiX2FyZ3R5cGVzIHRvIGRlbWFuZ2xlIHRoZSBhcmd1bWVudCB0eXBlcyBhbmQgZ2V0IHRoZQotCXBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgotCShwYXJzZV9zdGFiX2FyZ3R5cGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RhYl9yZWNvcmRfdmFyaWFibGUpOiBGb3IgYSBERUJVR19HTE9CQUwgb3IgREVCVUdfU1RBVElDCi0JdmFyaWFibGUsIGNhbGwgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIGltbWVkaWF0ZWx5LgotCShzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBkZWJ1Zy5oIChlbnVtIGRlYnVnX3R5cGVfa2luZCk6IEFkZCBERUJVR19LSU5EX0lMTEVHQUwuCi0JKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBBZGQgZmllbGQgZWxsaXBzaXNfdHlwZS4gIEFkZCBpZAotCXBhcmFtZXRlciB0byBzdGFydF9zdHJ1Y3RfdHlwZSwgc3RhcnRfY2xhc3NfdHlwZSwgYW5kIHRhZ190eXBlLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBEZWNsYXJlLgotCShkZWJ1Z19maW5kX25hbWVkX3R5cGUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfdHlwZV9raW5kKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X3JldHVybl90eXBlKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZHMpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfdHlwZSk6IERlY2xhcmUuCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfaGFuZGxlKTogQWRkIGZpZWxkcyBjbGFzc19pZCBhbmQgYmFzZV9pZC4KLQkoc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUpOiBBZGQgZmllbGQgaWQuCi0JKHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBhcmd0eXBlcyB0byBwaHlzbmFtZS4KLQlDaGFuZ2UgYWxsIHVzZXMuCi0JKGRlYnVnX2VsbGlwc2lzX3R5cGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShFTExJUFNJU19QKTogTmV3IG1hY3JvLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgYXJndHlwZXMgdG8gcGh5c25hbWUuCi0JKGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50KTogTGlrZXdpc2UuCi0JKGRlYnVnX25hbWVfdHlwZSk6IEFsd2F5cyBwdXQgdHlwZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0JKGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZmluZF90YWdnZWRfdHlwZSk6IFRyZWF0IERFQlVHX0tJTkRfSUxMRUdBTCBzcGVjaWFsbHksCi0JcmF0aGVyIHRoYW4gREVCVUdfS0lORF9WT0lELgotCShkZWJ1Z19nZXRfcmVhbF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X3R5cGVfa2luZCk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X3JldHVybl90eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRzKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfd3JpdGUpOiBJbml0aWFsaXplIGJhc2VfaWQuCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBQYXNzIG5ldyBpZCBhcmd1bWVudCB0byB0YWdfdHlwZS4gIEhhbmRsZQotCURFQlVHX0tJTkRfSUxMRUdBTC4gIFVzZSBpZCBmb3IJREVCVUdfS0lORF9TVFJVQ1QgYW5kCi0JREVCVUdfS0lORF9VTklPTi4gIEhhbmRsZSBlbGxpcHNpcyBmb3IgbWV0aG9kIGFyZ3VtZW50cy4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IERvbid0IGRlcmVmZXJlbmNlIGtjbGFzcyBpZiBpdCBpcyBOVUxMLgotCVVzZSBpZC4KLQkqIHByZGJnLmMgKHByX2Zucyk6IEFkZCBwcl9lbGxpcHNpc190eXBlLgotCShwcl9lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJfcG9pbnRlcl90eXBlKTogSWYgdGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXksIHBhcmVudGhlc2l6ZQotCWl0IGNvcnJlY3RseS4KLQkocHJfc3RhcnRfc3RydWN0X3R5cGUpOiBBZGQgaWQgcGFyYW1ldGVyLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX3RhZ190eXBlKTogTGlrZXdpc2UuCi0JKHByX2ZpeF92aXNpYmlsaXR5KTogQWRkIHRoZSB2aXNpYmlsaXR5IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLAotCW5vdCB0aGUgc2Vjb25kIGVsZW1lbnQgb24gdGhlIHN0YWNrLgotCShwcl9zdHJ1Y3RfZmllbGQpOiBQb3AgdGhlIHN0YWNrIGJlZm9yZSBjYWxsaW5nIHByX2ZpeF92aXNpYmlsaXR5LgotCShwcl9jbGFzc19zdGF0aWNfbWVtYmVyKTogTGlrZXdpc2UuCi0JKHByX2NsYXNzX3N0YXJ0X21ldGhvZCk6IERvbid0IHB1c2ggYSB0eXBlLCBqdXN0IHNldCB0aGUgbWV0aG9kCi0JbmFtZSBpbiB0aGUgdHlwZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkocHJfY2xhc3NfZW5kX21ldGhvZCk6IERvbid0IHBvcCB0aGUgc3RhY2suCi0JKHByX2NsYXNzX21ldGhvZF92YXJpYW50KTogUmVuYW1lIGFyZ3R5cGVzIHBhcmFtZXRlciB0byBwaHlzbmFtZS4KLQlBcHBlbmQgY29uc3QgYW5kIHZvbGF0aWxlIHJhdGhlciB0aGFuIHByZXBlbmRpbmcgdGhlbS4gIEFkZCBhCi0Jc3BhY2UgYWZ0ZXIgdGhlIHBoeXNuYW1lLgotCShwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoaWVlZV9mbnMpOiBBZGQgaWVlZV9lbGxpcHNpc190eXBlLgotCShpZWVlX2RlZmluZV9uYW1lZF90eXBlKTogVXNlIERFQlVHX0tJTkRfSUxMRUdBTCByYXRoZXIgdGhhbgotCURFQlVHX0tJTkRfVk9JRC4KLQkod3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgotCShpZWVlX3R5cGRlZik6IExpa2V3aXNlLgotCShpZWVlX2VsbGlwc2lzX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3N0YXJ0X3N0cnVjdF90eXBlKTogQWRkIGlkIHBhcmFtZXRlci4KLQkoaWVlZV9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfdGFnX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBuYW1lIHRvIHBoeXNuYW1lLgotCShpZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCk6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbiAoREVCVUdfT0JKUyk6IFJlbW92ZSBwcmRiZy5vLgotCSgkKE9CSkRVTVBfUFJPRykpOiBEZXBlbmQgdXBvbiwgYW5kIGxpbmsgYWdhaW5zdCwgcHJkYmcuby4KLQotVGh1IEphbiAxOCAxNzozNTowNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX3RhaWwpOiBDaGFuZ2VkIHRoZSBvcmRlciBvZiB0aGUgc2VjdGlvbnMgdG8gYXZvaWQKLQlhbiBhbGlnbm1lbnQgcHJvYmxlbS4KLQotV2VkIEphbiAxNyAxNDoyMzowMCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl9kdSk6IFNldCBkdS5zdGFja2ZybXQgdG8gMC4KLQkod3JfdW4sIHdyX3NjKTogRW1pdCBhbGwgc2VjdGlvbnMsIGV2ZW4gdGhvc2Ugd2l0aCAwIHNpemUuCi0KLVR1ZSBKYW4gMTYgMTY6MTU6NDkgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAod3JfaGQpOiBTcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IHdhcyBiZWluZwotCXN0b3JlZCBpbiBzZWdtZW50IGlkZW50aWZpZXIgZmllbGQuCi0KLVR1ZSBKYW4gMTYgMTI6MDc6MjUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChCVUlMRF9OTE1DT05WLCBCVUlMRF9TUkNPTlYsIFNZU0lORk9fUFJPRywKLQlCVUlMRF9ETExUT09MKTogUHV0IGRlZmluaXRpb25zIGZvciB0aGVzZSBpbnRvIG1ha2VmaWxlIHdoZW4KLQljb25maWd1cmluZywgaW5zdGVhZCBvZiBhbHdheXMgY2xlYXJpbmcgaW4gbXB3LW1ha2Uuc2VkLgotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBhbnkgaG9zdF9hbGlhcyBvciB0YXJnZXRfYWxpYXMgc2V0dGluZ3MsCi0JZml4IHBhdGhuYW1lIHRvIEJGRCBpbnRlcm5hbCBpbmNsdWRlIGZpbGVzLCByZW1vdmUgZGVwZW5kZW5jeQotCWNhbGN1bGF0aW9uIHJ1bGVzLgotCi1UaHUgSmFuIDExIDE3OjMxOjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogQWRkIG5ldyBzZWN0aW9uIGZsYWdzCi0JU0VDX3tFWENMVURFLFNPUlRfRU5UUklFU30uCi0KLVRodSBKYW4gMTEgMTE6NDU6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogTlVMTCB0ZXJtaW5hdGUgdGhlIG91dHB1dCBzeW1ib2xzLgotCShjb3B5X29iamVjdCk6IEFsbG9jYXRlIHNwYWNlIGZvciBhIHBvc3NpYmxlIGV4dHJhIE5VTEwgcG9pbnRlci4KLQotCSogZGVidWcuYyAoZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUpOiBNYWtlIHN1cmUgd2UgYXJlCi0JZ2l2ZW4gYSBraW5kIG9mIHR5cGUgd2UgY2FuIGhhbmRsZS4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IEhhbmRsZSB1bmRlZmluZWQgZW51bXMgYW5kIHN0cnVjdHMuCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBIYW5kbGUgdW5kZWZpbmVkIGNsYXNzZXMuCi0JKiBwcmRiZy5jIChwcl9lbnVtX3R5cGUpOiBIYW5kbGUgYW4gdW5kZWZpbmVkIGVudW0uCi0JKiBpZWVlLmMgKGllZWVfZW51bV90eXBlKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTAgMTU6MzM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCBkZXBlbmRlbmNpZXMuCi0JKEFMTE9DQSwgTUFMTE9DKTogUmVtb3ZlIHZhcmlhYmxlcy4KLQkoQURETF9MSUJTKTogUmVtb3ZlICQoTUFMTE9DKSBmcm9tIGRlZmluaXRpb24uCi0JKiBhbGxvY2EuYywgZ21hbGxvYy5jOiBSZW1vdmUuCi0KLU1vbiBKYW4gIDggMTg6MDI6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IEFkZCBnbG9iYWwgZnVuY3Rpb24gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyBhbmQgYQotCWJ1bmNoIG9mIHN0YXRpYyBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgdXNlZCB0byB3cml0ZSBvdXQgSUVFRQotCWRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGJ1ZGJnLmggKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBEZWNsYXJlLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX3R5cGUpOiBBZGQgcHNsb3QgZmllbGQuCi0JKGVudW0gYnVpbHRpbl90eXBlcyk6IERlZmluZS4KLQkoaWVlZV9idWlsdGluX3R5cGUpOiBGb3IgYSBwb2ludGVyLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuYW1lZAotCXR5cGUuICBVc2UgZW51bSB2YWx1ZXMgcmF0aGVyIHRoYW4gbnVtYmVycy4KLQkoaWVlZV9hbGxvY190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9yZWFkX3R5cGVfaW5kZXgpOiBVc2UgaWVlZV9hbGxvY190eXBlLgotCShwYXJzZV9pZWVlX2JiKTogTGlrZXdpc2UuCi0JKHBhcnNlX2llZWVfdHkpOiBMaWtld2lzZS4gIFVzZSBpZWVlX2J1aWx0aW5fdHlwZSBmb3IgYXJyYXkgcmFuZ2UsCi0JcmF0aGVyIHRoYW4gbWFraW5nIGEgbmV3IGludGVnZXIgdHlwZS4gIFN0b3JlIHRoZSBuZXcgdHlwZSBpbiB0aGUKLQlzbG90LCBpZiB0aGVyZSBpcyBvbmUuCi0JKHBhcnNlX2llZWVfYXRuKTogVHJlYXQgQVROMTAgYXMgZGVmaW5pbmcgYSByZWdpc3RlciB2YXJpYWJsZS4KLQkoaWVlZV9yZWdub190b19nZW5yZWcpOiBSZW5hbWUgZnJvbSBpZWVlX3JlZ25vX3RvX2dlbi4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShpZWVlX2dlbnJlZ190b19yZWdubyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfdHlwZSk6IEFkZCBuZXcgdHlwZW5hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuCi0JKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEFkZCBuZXcgdHlwZW5hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0KLQkqIGRlYnVnLmggKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBBZGQgdGFnIHBhcmFtZXRlciB0bwotCWVudW1fdHlwZSwgc3RhcnRfc3RydWN0X3R5cGUsIGFuZCBzdGFydF9jbGFzc190eXBlLgotCSogZGVidWcuYyAoZGVidWdfd3JpdGVfdHlwZSk6IFBhc3MgYW55IHRhZyBuYW1lIHRvCi0Jc3RhcnRfc3RydWN0X3R5cGUsIGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUsIGFuZCBlbnVtX3R5cGUuICBJZgotCURFQlVHX0tJTkRfVEFHR0VELCBwYXNzIHRoZSBuYW1lIGluIHRoZSByZWN1cnNpdmUgY2FsbC4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IEFjY2VwdCBhIG5ldyB0YWcgcGFyYW1ldGVyLCBhbmQgcGFzcyBpdAotCXRvIHN0YXJ0X2NsYXNzX3R5cGUuCi0JKiBwcmRiZy5jIChwb3BfdHlwZSk6IERvbid0IHJlbW92ZSAnKycgY2hhcmFjdGVyLgotCShwcl9lbnVtX3R5cGUpOiBBY2NlcHQgYW5kIHVzZSB0YWcgcGFyYW1ldGVyLgotCShwcl9zdGFydF9zdHJ1Y3RfdHlwZSk6IExpa2V3aXNlLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX2NsYXNzX2Jhc2VjbGFzcyk6IEFkanVzdCBhbGdvcml0aG0gdXNlZCB0byBmaW5kIHdoZXJlIHRvIHB1dAotCXRoZSBiYXNlY2xhc3MgbmFtZS4KLQkocHJfdGFnKTogRG9uJ3QgYm90aGVyIHRvIGluc2VydCB0aGUgdGFnIG5hbWUuCi0KLQkqIG9iamNvcHkuYzogSW5jbHVkZSBidWRiZy5oLgotCShjb252ZXJ0X2RlYnVnZ2luZyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9ERUJVR0dJTkcpOiBEZWZpbmUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAiZGVidWdnaW5nIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1kZWJ1Z2dpbmcuCi0JKGlzX3N0cmlwX3NlY3Rpb24pOiBTa2lwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBjb252ZXJ0X2RlYnVnZ2luZy4KLQkoc2V0dXBfc2VjdGlvbiwgY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGZpbHRlcl9zeW1ib2xzKTogU2tpcCBkZWJ1Z2dpbmcgc3ltYm9scyBpZiBjb252ZXJ0X2RlYnVnZ2luZy4KLQkoY29weV9vYmplY3QpOiBJZiBjb252ZXJ0X2RlYnVnZ2luZywgcmVhZCBhbmQgd3JpdGUgZGVidWdnaW5nCi0JaW5mb3JtYXRpb24uCi0JKHdyaXRlX2RlYnVnZ2luZ19pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tZGVidWdnaW5nLgotCSogTWFrZWZpbGUuaW4gKERFQlVHX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoT0JKQ09QWV9QUk9HKSk6IERlcGVuZCB1cG9uIGFuZCBsaW5rIGFnYWluc3QgJChERUJVR19PQkpTKS4KLQkoJChTVFJJUF9QUk9HKSk6IExpa2V3aXNlLgotCShPQkpEVU1QX09CSlMpOiBSZW1vdmUgdmFyaWFibGUuCi0JKCQoT0JKRFVNUF9QUk9HKSk6IFVzZSBvYmpkdW1wLm8gJChERUJVR19PQkpTKSByYXRoZXIgdGhhbgotCSQoT0JKRFVNUF9PQkpTKS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1kZWJ1Z2dpbmcuCi0KLVRodSBKYW4gIDQgMTY6MzE6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IE5ldyBmaWxlIHdpdGggY29kZSB0byByZWFkIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSogYnVkYmcuaCAocGFyc2VfaWVlZSk6IERlY2xhcmUuCi0JKiByZGRiZy5jIChyZWFkX2RlYnVnZ2luZ19pbmZvKTogSGFuZGxlIElFRUUgZmxhdm91ciBmaWxlcy4KLQkocmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIGllZWUuYy4KLQkoT0JKRFVNUF9PQkpTKTogQWRkIGllZWUuby4KLQotCSogYnVjb21tLmggKHhyZWFsbG9jKTogQ2hhbmdlIHR5cGUgb2YgZmlyc3QgcGFyYW1ldGVyIGZyb20gY2hhciAqCi0JdG8gUFRSLgotCi1UdWUgSmFuICAyIDE3OjQ0OjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCB0YXJnZXRzIHRvIGF1dG9tYXRpY2FsbHkgcmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JUmVtb3ZlIHRhcmdldHMgd2hpY2gganVzdCBsaXN0ZWQgZGVwZW5kZW5jaWVzIG9mIC5vIGZpbGVzLgotCShERVApOiBOZXcgdmFyaWFibGUuCi0JKEhGSUxFUywgR0VORVJBVEVEX0hGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENGSUxFUywgR0VORVJBVEVEX0NGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKHVuZGVyc2NvcmUuYyk6IERvbid0IGRvIGFueXRoaW5nLCBqdXN0IGRlcGVuZCB1cG9uIHN0YW1wLXVuZGVyLgotCShzdGFtcC11bmRlcik6IE5ldyB0YXJnZXQ7IGRvIHdoYXQgdW5kZXJzY29yZS5jIHVzZWQgdG8gZG8uCi0JKG5sbWNvbnYubyk6IERlcGVuZCB1cG9uIHN5bS5oIGFuZCBlY29mZi5oLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCwgZGVwLCBkZXAtaW4pOiBOZXcgdGFyZ2V0cy4KLQkoc3RhZ2UxLCBzdGFnZTIsIHN0YWdlMywgYWdhaW5zdCwgY29tcGFyaXNvbik6IFJlbW92ZS4KLQkoZGUtc3RhZ2UxLCBkZS1zdGFnZTIsIGRlLXN0YWdlMyk6IFJlbW92ZS4KLQkoY2xlYW4sIGRpc3RjbGVhbik6IFJlbW92ZSBzdGFtcC11bmRlciBhbmQgZGVwLnNlZC4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi0JSW1wbGVtZW50IGdlbmVyaWMgZGVidWdnaW5nIHN1cHBvcnQuICBJbXBsZW1lbnQgYSBzdGFicyByZWFkZXIgYW5kCi0JYSBnZW5lcmljIHByaW50ZXIuCi0JKiBidWRiZy5oLCBkZWJ1Zy5jLCBkZWJ1Zy5oLCBwcmRiZy5jLCByZGRiZy5jLCBzdGFicy5jOiBOZXcgZmlsZXMuCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgImRlYnVnLmgiIGFuZCAiYnVkYmcuaCIuCi0JKGR1bXBfZGVidWdnaW5nKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tZGVidWdnaW5nLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRlYnVnZ2luZyIuCi0JKGRpc3BsYXlfYmZkKTogSGFuZGxlIC0tZGVidWdnaW5nLgotCSogTWFrZWZpbGUuaW4gKE9CSkRVTVBfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChPQkpEVU1QX1BST0cpKTogVXNlICQoT0JKRFVNUF9PQkpTKS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1kZWJ1Z2dpbmcuCi0KLVNhdCBEZWMgMzAgMDk6NTk6NTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBubS5jICggbG9uZ19vcHRpb25zKTogQWRkICItLWRlZmluZWQtb25seSIgb3B0aW9uLgotCSh1c2FnZSk6IFVwZGF0ZSBmb3IgbmV3ICItLWRlZmluZWQtb25seSIgb3B0aW9uLgotCShmaWx0ZXJfc3ltYm9scyk6IEhhbmRsZSAiLS1kZWZpbmVkLW9ubHkiLgotCi1GcmkgRGVjIDI5IDE2OjA0OjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJwYXJzZS55OiBJbmNsdWRlICJidWNvbW0uaCIsIG5vdCA8c3lzZGVwLmg+LgotCSogbmxtaGVhZGVyLnk6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KLQotVHVlIERlYyAyNiAxODoyMzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHByaW50X3N5bWRlZl9lbnRyeSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9nZXRfZWx0X2F0X2luZGV4LgotCi1TYXQgRGVjIDIzIDExOjAzOjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY2d5bnN1LmNvbT4KLQotCSogY29uZmlndXJlLmluIChETExUT09MX0RFRlMpOiBCdWlsZCBkbGx0b29sIGZvciBQb3dlclBDIGlmIHRhcmdldAotCWlzIHBvd2VycGMqLSotd2luKiBpbiBhZGRpdGlvbiB0byBwb3dlcnBjKi0qLSpwZSouCi0KLUZyaSBEZWMgMTUgMTY6MzA6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGVuZGlhbl9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIGl0LgotCSogbmxtY29udi5jIChtYWluKTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KLQotRnJpIERlYyAxNSAwNzo1MTozNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBTdGFydCBmcm9tIDEgaWYgbm8gb3RoZXIgaW5zdHJ1Y3Rpb25zCi0gCWdpdmVuLgotCi1UdWUgRGVjIDEyIDEyOjA1OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLjEuICBGcm9tIFJvbmFsZAotCUYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotTW9uIERlYyAxMSAxNDozMzowNSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1hYy1iaW51dGlscy5yOiBGaXggY29weXJpZ2h0IGFuZCB2ZXJzaW9uIHN0cmluZ3MuCi0KLQkqIE1ha2VmaWxlLmluICh2ZXJzaW9uKTogUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KLQotRnJpIERlYyAgMSAxNDo0MTo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZCAoaW5zdGFsbCwgaW5zdGFsbC1vbmx5KTogRWRpdCBpbiBNYWMtc3BlY2lmaWMKLQlpbnN0YWxsIHByb2NlZHVyZS4KLQotVGh1IE5vdiAzMCAyMDoyNjowMiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChwcGNfanRhYik6IFRoZSBiaW5hcnkgZ2x1ZSBmb3IgUG93ZXJQQyBkbGwgbGlua2FnZSwKLQlpbmNsdWRpbmcgdGhlIHJldHVybiBpbnN0cnVjdGlvbi4KLQlzaW5mbzogYWRkZWQgYSBwcmVmZXJyZWQgYWxpZ25tZW50IGZpZWxkLgotCShzZWNkYXRhKTogc2VjdGlvbiBkYXRhIGZvciB0aGUgUG93ZXJQQyB2ZXJzaW9uLgotCShtYWtlX29uZV9saWJfZmlsZSk6IE1vcmUgc3ltYm9scywgTW9yZSBzZWN0aW9ucyAocGRhdGEsIHJkYXRhKQotCShtYWtlX3RhaWwpOiBVc2UgaWRhdGEkNiBpbnN0ZWFkIG9mIGlkYXRhJDcgZm9yIHBwYy4gQWxzbyBhZGRlZCBhCi0JTlVMTCBpZGF0YSQzIGRlc2NyaXB0b3IgKHRlbXBvcmFyeSkuCi0KLVR1ZSBOb3YgMjggMTc6MjM6NDQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogRG9uJ3QgcmVmZXJlbmNlIGRfZXhwb3J0X3ZlYyBpZgotCXRoZXJlIGFyZSBubyBleHBvcnRlZCBmdW5jdGlvbnMuCi0KLU1vbiBOb3YgMjcgMTM6MDU6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCi0KLVdlZCBOb3YgMjIgMTM6MTc6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBTdGFydCBhc3NpZ25pbmcgb3JkaW5hbHMgYXQgMS4KLQotCSogTWFrZWZpbGUuaW4gKEVYUEVDVCk6IFVzZSAkJHIsIG5vdCAkJHtyb290bWV9LgotCShjaGVjayk6IFNldCByLCBub3Qgcm9vdG1lLgotCi1UdWUgTm92IDIxIDE4OjA0OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX05FRURfREVDTEFSQVRJT04uCi0JKiBhY2NvbmZpZy5oOiBQdXQgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIGluIEBUT1BAIHNlY3Rpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotRnJpIE5vdiAxNyAxMDozNDozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogVXNlIEBob3N0QCBhbmQgQHRhcmdldEAsIG5vdAotCSQoaG9zdF9jYW5vbmljYWwpIGFuZCAkKHRhcmdldF9jYW5vbmljYWwpLgotCi1UaHUgTm92IDE2IDAzOjM5OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVmVyc2lvbiAyLjYgcmVsZWFzZWQuCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjYuCi0KLVdlZCBOb3YgMTUgMTI6MTQ6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IERlZmluZS4KLQkoY2hlY2spOiBQYXNzIENDIGFuZCBDRkxBR1MgdG8gcnVudGVzdC4KLQotCSogbm0uYyAoZGlzcGxheV9yZWxfZmlsZSk6IERvbid0IHJlcXVpcmUgYSBEWU5BTUlDIG9iamVjdCB3aGVuCi0JZHVtcGluZyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBnbG9iYWwgc3ltYm9scyBiZWZvcmUgbG9jYWwKLQlzeW1ib2xzIGJlZm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogRG9uJ3QgZnV0eiBhcm91bmQgbG9va2luZyBmb3IgYSBnbG9iYWwKLQlzeW1ib2wgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLQotVHVlIE5vdiAxNCAxNzoxOToxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogVXNlIEZPUEVOXyogbWFjcm9zIHJhdGhlciB0aGFuICJyIiBvciAidyIuCi0KLQkqIGRsbHRvb2wuYyAoZmlsbF9vcmRpbmFscyk6IENvcnJlY3QgbWVtc2V0IGNhbGwuCi0KLVN1biBOb3YgMTIgMTI6NTY6MDUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQgKERFTUFOR0xFUl9QUk9HKTogRWRpdCBvdXQgYXR0ZW1wdHMgdG8gZG8gYW55dGhpbmcKLSAJd2l0aCB0aGUgbWFuIHBhZ2UuCi0KLUZyaSBOb3YgMTAgMTE6NDE6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBDb3B5IHRoZSBzZWN0aW9uIGxtYSBpbmRlcGVuZGVudGx5IG9mCi0JdGhlIHZtYS4KLQotV2VkIE5vdiAgOCAxMTozMzowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyc3VwLmMgKGFyX29wZW4pOiBDYXN0IG1hbGxvYyByZXR1cm4gdmFsdWUuCi0KLVR1ZSBOb3YgIDcgMDk6MDE6MjYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlIChETExUT09MX0RFRlMpOiBBZGRlZCBwcGMgdGFyZ2V0LgotCSogZGxsdG9vbC5jIChNUFBDKTogQWRkZWQgYmFzaWMgUFBDIGRlZmluaXRpb25zLgotCi1UdWUgTm92ICA3IDE0OjAyOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCB0cmVhdCByczYwMDAtKi1seW54KiBzcGVjaWFsbHkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvcnNseW54OiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIEB0YXJnZXRfbWFrZWZpbGVfZnJhZ21lbnRALgotCi1Nb24gTm92ICA2IDE1OjAwOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmg6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQkqIGFyLmM6IERvbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPiBvciA8c3RkaW8uaD4uCi0JKiBidWNvbW0uYywgZGxsdG9vbC5jLCBubG1jb252LmMsIG9iamNvcHkuYywgb2JqZHVtcC5jOiBMaWtld2lzZS4KLQotRnJpIE5vdiAgMyAxMjozODowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCi0JUGVybWl0IHVzZXIgdG8gb3ZlcnJpZGUgREVNQU5HTEVSX1BST0cgZnJvbSBjb21tYW5kIGxpbmUuICBGcm9tCi0JTWFuZnJlZCBIb2xsc3RlaW4gPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPi4KLQkqIE1ha2VmaWxlLmluICgkKERFTUFOR0xFUl9QUk9HKSk6IERlcGVuZCB1cG9uCi0JJChERU1BTkdMRVJfUFJPRykuMS4KLQkoaW5zdGFsbCk6IERvbid0IGRlcGVuZCB1cG9uICQoREVNQU5HTEVSX1BST0cpLjEuICBPbmx5IGluc3RhbGwKLQkkKERFTUFOR0xFUl9QUk9HKS4xIGlmICQoREVNQU5HTEVSX1BST0cpIGlzIG5vdCBlbXB0eS4KLQotV2VkIE5vdiAgMSAxNTowNDo1NyAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKHN5c2xleC5vKTogYWRkIC1JJChzcmNkaXIpIGlmIGNvbXBpbGluZyBpbiBhCi0Jc2VwYXJhdGUgZGlyZWN0b3J5LgotCi1Nb24gT2N0IDMwIDE0OjI0OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X3ZhbHVlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIGl0LiAgSWYgd2UgbmVlZCB0aGUgcmlnaHQgc2VjdGlvbiBmb3IKLQl0aGUgc3ltYm9sLCBhbmQgd2UgY2FuJ3QgZmluZCBpdCwgcHJpbnQgYW4gb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24KLQlyYXRoZXIgdGhhbiB1c2luZyBhIHN5bWJvbCBmcm9tIHNvbWUgb3RoZXIgc2VjdGlvbi4KLQotVGh1IE9jdCAyNiAxMDoyMzoxNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG5vX2lkYXRhNCwgbm9faWRhdGE1KTogTmV3LgotCShhcm1fanRhYik6IFVzZSBjb3JyZWN0IGVuY29kaW5nIG9mIGp1bXAgaW5zdHJ1Y3Rpb24uCi0JKHVzYWdlLCBtYWluLCBtYWtlX2hlYWQsIG1ha2VfdGFpbCk6IEFjdCBvbiBub19pZGF0YTQsIG5vX2lkYXRhNS4KLQotV2VkIE9jdCAyNSAxMjoxMDowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBwYXRocyB0byBnZW5lcmF0ZWQgeS50YWIuW2NoXSBmaWxlcy4KLQotRnJpIE9jdCAyMCAxODo0MDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1UaHUgT2N0IDE5IDE3OjQ3OjQxIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZSBleHRyYW5lb3VzIHRhYiBvbiBvdGhlcndpc2UgZW1wdHkgbGluZSwKLQl3aGljaCBjb25mdXNlcyBtYW55IG5vbi1HTlUgdmVyc2lvbnMgb2YgIm1ha2UiLgotCi1XZWQgT2N0IDE4IDE2OjMxOjU4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoaTM4Nl9qdGFiLCBhcm1fanRhYik6IE5ldwotCShnZW5fbGliX2ZpbGUpOiBSZXdyaXR0ZW4gdG8gdXNlIGJmZC4KLQotRnJpIE9jdCAxMyAxNjoxMDowNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgZ2l2ZSBlcnJvciBtZXNzYWdlIGlmIGRsbHRvb2wKLQl3YXNuJ3QgYnVpbHQuCi0KLUZyaSBPY3QgMTMgMTE6MDQ6MzcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGVmbGV4Lmw6IEFsbG93IHF1b3Rpbmcgb2YgSURzLgotCSogZGVmcGFyc2UueSAoJXVuaW9uKTogc3RyaW5nIGRlbGV0ZWQuCi0JKGNvbW1hbmQpOiBERVNDUklQVElPTiB0YWtlcyBJRC4KLQkqIGRsbHRvb2wuYyAoZ2VuX2RlZl9maWxlKTogUXVvdGUgb3V0Z29pbmcgbmFtZSBpZgotCW5lY2Vzc2FyeS4gIFByZXNlcnZlIE5PTkFNRS4KLQkoZ2VuX2xpYl9maWxlKTogUnVuIHJhbmxpYi4KLQkod29ya291dF9wcmVmaXgpOiBEZWxldGVkLgotCShtYWluLCB1c2FnZSwgbG9uZ19vcHRpb25zKTogQWRkIC0tYXMsIC0tcmFubGliLCAtLWFyIG9wdGlvbnMuCi0KLVdlZCBPY3QgMTEgMTM6MzY6MTMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtdGFibGUpOiBIT1dfQUxJR05fTE9ORywgbmV3LgotCShkX29yZCk6IERlbGV0ZWQuCi0JKGRfbG93X29yZCwgZF9oaWdoX29yZCwgZF9uYW1lZF9mdW5jcyk6IE5ldy4KLQkoZ2VuX2V4cF9maWxlKTogQ3JlYXRlIG5vbmFtZSBlbnRyaWVzIGNvcnJlY3RseS4KLQkoZ2VuX2xpYl9maWxlKTogRHVtcCBleHBvcnRzIGFscGhhYmV0aWNhbGx5LgotCShwcm9jZXNzX2R1cGxpY2F0ZXMpOiAgQ291bnQgbm9uYW1lZCBmdW5jdGlvbnMuCi0JKGZpbGxfb3JkaW5hbHMpOiBLZWVwIHRyYWNrIG9mIGhpZ2hlc3Qgb3JkIHRvby4KLQkobWFuZ2xlX2RlZnMpOiBDcmVhdGUgYWxwaGFiZXRpY2FsbHkgb3JkZXJlZCBsaXN0IG9mIG5hbWVzLgotCi1UdWUgT2N0IDEwIDA5OjM5OjA5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUT09MX1BST0dTKTogSW5jbHVkZSBETExUT09MX1BST0cuCi0KLU1vbiBPY3QgIDkgMTM6MDY6MzEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChhZGRfdW5kZXJzY29yZSk6IE5ldy4KLQkoeGxhdGUpOiBVc2UgbmV3IG5hbWUuCi0JKG1haW4sIHVzYWdlKTogVXBkYXRlLgotCi1GcmkgT2N0ICA2IDE0OjA4OjUxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzeXNpbmZvLnk6IEVsaW1pbmF0ZSB1bnVzZWQgdGVybWluYWxzICJbIiBhbmQgIl0iIGFuZCB1bnVzZWQKLQlub250ZXJtaW5hbCAibmFtZSIuICBPbmUgcy9yIGNvbmZsaWN0IHJlbWFpbnMuCi0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBubS5jIChwcmludF9zeW1uYW1lKTogRG9uJ3QgdHJ5IHRvIGRlbWFuZ2xlIGFuIGVtcHR5Ci0JbmFtZS4KLQkqIG9iamR1bXAuYyAoc2x1cnBfc3ltdGFiKTogUmVzZXQgc3ltY291bnQgaWYgdGhlcmUgYXJlCi0Jbm8gc3ltYm9scy4KLQkoc2x1cnBfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZSwgZm9yIGR5bnN5bWNvdW50LgotCShkaXNhc3NlbWJsZV9kYXRhKTogRml4IG1lbW9yeSBsZWFrOiBmcmVlIHNvcnRlZF9zeW1zIHdoZW4gZG9uZS4KLQkoZGlzcGxheV9iZmQpOiBMaWtld2lzZSwgZm9yIHN5bXMgYW5kIGR5bnN5bXMuCi0JKGR1bXBfcmVsb2NzKTogRG9uJ3QgcHJpbnQgaGVhZGVyIGJlZm9yZSBwb3NzaWJseSBnZW5lcmF0aW5nIGFuCi0JZXJyb3IgbWVzc2FnZS4KLQkoZHVtcF9keW5hbWljX3JlbG9jcyk6IExpa2V3aXNlLgotCi0JKiBhci4xLCBubS4xLCBvYmpkdW1wLjEsIHNpemUuMSwgc3RyaW5ncy4xLCBzdHJpcC4xOiBGaXggdHlwb3MgYW5kCi0JZm9ybWF0dGluZyBidWdzLgotCi1GcmkgT2N0ICA2IDEyOjAwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXIuYyAoZG9fcXVpY2tfYXBwZW5kKTogQ29tbWVudCBvdXQuCi0JKHJlcGxhY2VfbWVtYmVycyk6IEFkZCBxdWljayBhcmd1bWVudC4KLQkobWFpbik6IERvbid0IGNhbGwgZG9fcXVpY2tfYXBwZW5kLgotCShvcGVuX2luYXJjaCk6IERvbid0IGNhbGwgcXVpY2tfYXBwZW5kIHRvIGNyZWF0ZSBhbiBlbXB0eSBhcmNoaXZlLgotCUluc3RlYWQgY2FsbCBiZmRfb3BlbncvYmZkX3NldF9mb3JtYXQvYmZkX2Nsb3NlLgotCi1UaHUgT2N0ICA1IDIwOjUzOjA4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uYzogQWx3YXlzIGluY2x1ZGUgdGltZS5oLgotCi1UaHUgT2N0ICA1IDE3OjI1OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3N5bWJvbHMpOiBTb3J0IGdudV9jb21waWxlZCBhbmQgZ2NjMl9jb21waWxlZAotCXN5bWJvbHMgYWZ0ZXIgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLiAgTGlrZXdpc2UgZm9yCi0Jc3ltYm9scyB3aGljaCBsb29rIGxpa2UgZmlsZSBuYW1lcy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQWx3YXlzIGNob3NlIHRoZSBmaXJzdCByZWFzb25hYmxlIHN5bWJvbAotCXdpdGggYSBnaXZlbiB2YWx1ZS4KLQotVHVlIE9jdCAgMyAyMjozODo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyc3VwLmMgKGFyX3NhdmUpOiBVc2UgcmVuYW1lLCBub3QgdW5saW5rL2xpbmsvdW5saW5rLgotCi1Nb24gT2N0ICAyIDEyOjEwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jIChtYWluKTogRXhpdCB3aXRoIHplcm8gc3RhdHVzIGlmIG5vIGZpbGVzIGFyZSBnaXZlbgotCWFuZCBzdGFuZGFyZCBpbnB1dCBpcyByZWFkLgotCi1UaHUgU2VwIDI4IDIwOjAzOjA3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQ2FsY3VsYXRlIHVuZGVyc2NvcmUgYW5kIHB1dCBpbnRvIG1ha2VmaWxlCi0JZnJhZ21lbnQsIGdlbmVyYXRlIGNvbmZpZy5oLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIGVkaXQgVW5peCBtYWtlZmlsZQotCWludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtYWMtYmludXRpbHMucjogTmV3IGZpbGUsIE1hYyByZXNvdXJjZXMuCi0KLVRodSBTZXAgMjggMTU6NDk6MDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiAoZ2VuX2V4cF9maWxlKTogQWx3YXlzIGVtaXQgYSAucmVsb2Mgc2VjdGlvbiBpZgotCXJlbG9jYXRhYmxlLgotCShpbXBfbmFtZV9sYWIpOiBOZXcuCi0JKGdlbl9kZWZfZmlsZSk6IE5ldy4KLQkoZ2VuX2xpYl9maWxlKTogVXNlIGltcF9uYW1lX2xhYi4KLQkobWFpbik6IEluaXRpYWxpemUgaW1wX25hbWVfbGFiLgotCi1Nb24gU2VwIDI1IDEyOjA1OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0hFQURFUl9TWVNfV0FJVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiIGFuZCAiYnVjb21tLmgiLiAgRG9uJ3QgaW5jbHVkZQotCTxzdGRpby5oPiwgPHN0ZGxpYi5oPiwgb3IgPHN0cmluZy5oPi4gIERvbid0IGluY2x1ZGUgPHdhaXQuaD4uCi0JSW5jbHVkZSA8c3lzL3R5cGVzLmg+LiAgVXNlIEhBVkVfU1lTX1dBSVRfSCB0byBjb250cm9sIHdoZXRoZXIgdG8KLQlpbmNsdWRlIDxzeXMvd2FpdC5oPiBvciBkZWZpbmUgdGhlIHdhaXQgbWFjcm9zIGJ5IGhhbmQuICBEb24ndAotCWRlY2xhcmUgeG1hbGxvYy4KLQkoZ2VuX2xpYl9maWxlKTogRG9uJ3QgYXNzdW1lIHRoYXQgc3ByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKLQljaGFyYWN0ZXJzOyB1c2Ugc3RybGVuIGluc3RlYWQuCi0KLUZyaSBTZXAgMjIgMTc6MTY6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCB1c2UgdGhlIG9sZCBCRkQgYmFzZWQKLQlkaXNhc3NlbWJsZXIgaW50ZXJmYWNlLiAgTWFrZSBpbmZvIGEgY29uc3QgcG9pbnRlci4KLQotV2VkIFNlcCAxMyAxODozMzo0NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoc3RhcnRfYWRkcmVzcyk6IE5ldyB2YXJpYWJsZS4KLQkoc3RvcF9hZGRyZXNzKTogTmV3IHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLS1zdGFydC1hZGRyZXNzIGFuZCAtLXN0b3AtYWRkcmVzcy4KLQkoT1BUSU9OX1NUQVJUX0FERFJFU1MsIE9QVElPTl9TVE9QX0FERFJFU1MpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAic3RhcnQtYWRkcmVzcyIgYW5kICJzdG9wLWFkZHJlc3MiLgotCShkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHN0YXJ0X2FkZHJlc3MgYW5kIHN0b3BfYWRkcmVzcy4KLQkoZHVtcF9kYXRhLCBkdW1wX3JlbG9jX3NldCk6IExpa2V3aXNlLgotCShtYWluKTogRG9uJ3Qgc2V0IHNlZW5mbGFnIGZvciAtbC4gIEhhbmRsZSBPUFRJT05fU1RBUlRfQUREUkVTUwotCWFuZCBPUFRJT05fU1RPUF9BRERSRVNTLgotCSogb2JqY29weS5jIChwYXJzZV92bWEpOiBNb3ZlIHRvIGJ1Y29tbS5jLgotCSogYnVjb21tLmMgKHBhcnNlX3ZtYSk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvYmpjb3B5LmMuCi0JKiBidWNvbW0uaCAocGFyc2Vfdm1hKTogRGVjbGFyZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgbmV3IG9iamR1bXAgb3B0aW9ucy4KLQotVHVlIFNlcCAxMiAxMjozNzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogRG9uJ3QgY2FsbCB3cml0ZV9hcmNoaXZlIGlmIG5vdGhpbmcKLQljaGFuZ2VkLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBBZGQgY2FzdHMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzLgotCi1UaHUgU2VwICA3IDEyOjEyOjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmluOiBSZW5hbWUgZnJvbSBjb25maWcuaC5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIHdpdGggY29uZmlnLmg6Y29uZmlnLmluLgotCUNoZWNrIGZvciBjb25maWcuaDpjb25maWcuaW4gd2hlbiBjcmVhdGluZyBzdGFtcC1oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBjb25maWcuaW4gcmF0aGVyIHRoYW4KLQljb25maWcuaC5pbi4gIFNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4gd2hlbgotCWNhbGxpbmcgY29uZmlnLnN0YXR1cy4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCwgc3RhbXAtaCwgYW5kCi0gICAgICAgIGNvbmZpZy5sb2cuCi0KLQkqIG5tLmMgKHZhbHVlX2Zvcm1hdCk6IEluaXRpYWxpemUgYmFzZWQgb24gQkZENjQgYW5kCi0JQkZEX0hPU1RfNjRCSVRfTE9ORy4KLQkocHJpbnRfcmFkaXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzZXRfcHJpbnRfcmFkaXgpOiBTZXQgcHJpbnRfcmFkaXguICBBZGp1c3QgY2hhbmdlcyB0bwotCXZhbHVlX2Zvcm1hdC4KLQkocHJpbnRfdmFsdWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCB0byBwcmludCA2NCBiaXQgb2N0YWwgYW5kCi0JZGVjaW1hbCB2YWx1ZXMgY29ycmVjdGx5LgotCShwcmludF9zeW1ib2xfaW5mb19ic2QpOiBDaGVjayBCRkQ2NCwgbm90IEJGRF9IT1NUXzY0X0JJVC4gIFVzZQotCXByaW50X3ZhbHVlLgotCShwcmludF9zeW1ib2xfaW5mb19zeXN2KTogVXNlIHByaW50X3ZhbHVlLgotCShwcmludF9zeW1ib2xfaW5mb19wb3NpeCk6IExpa2V3aXNlLgotCi1XZWQgU2VwICA2IDE1OjAyOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCoubyk6IFJlbW92ZSBpbmNvcnJlY3QgZGVwZW5kZW5jaWVzIG9uCi0JJChCRkRESVIpL2hvc3RzL3N0ZC1ob3N0LmguCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX0RBVEEpOiBBZGQgLW0gNjQ0LgotCShJTlNUQUxMX1hGT1JNMSk6IExpa2V3aXNlLgotCShDQ19GT1JfQlVJTEQpOiBTZXQgdG8gQENDX0ZPUl9CVUlMREAgcmF0aGVyIHRoYW4gJChDQykuCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfQ0NfRk9SX0JVSUxEIGFuZCBCRkRfQklOQVJZX0ZPUEVOLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwICA1IDIwOjIyOjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIHRvIHVzZSBhdXRvY29uZi4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2NvbmYuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLmluOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2hlYWRlci4KLQkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgZm9yIG5ldyBjb25maWd1cmUgc2NyaXB0LiAgQWxzbzoKLQkoUFJPR1MpOiBSZW1vdmUgJChTWVNJTkZPX1BST0cpLgotCShBTExfQ0ZMQUdTKTogUmVtb3ZlICQoVERFRklORVMpLgotCSh2ZXJzaW9uLm8pOiBVc2UgJChBTExfQ0ZMQUdTKS4KLQkoY3BsdXMtZGVtLm8sIGRsbHRvb2wubywgbmxtY29udi5vKTogTGlrZXdpc2UuCi0JKHN5c2R1bXAubyk6IERlcGVuZCB1cG9uIGJ1Y29tbS5oIGFuZCBjb25maWcuaC4KLQkoc3Jjb252Lm8sIGFyc3VwLm8sIHN0cmluZ3Mubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCShmaWxlbW9kZS5vKTogRG9uJ3QgZGVwZW5kIHVwb24gLi4vYmZkL3N5c2RlcC5oLgotCShidWNvbW0ubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLCBub3QgLi4vYmZkL3N5c2RlcC5oLgotCShzaXplLm8sIG9iamR1bXAubywgbm0ubywgYXIubywgb2JqY29weS5vKTogTGlrZXdpc2UuCi0JKG5sbWhlYWRlci5vLCBubG1jb252Lm8pOiBMaWtld2lzZS4KLQkoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIHN5c2RlcC5oLgotCSogYnVjb21tLmg6IEluY2x1ZGUgImFuc2lkZWNsLmgiLCA8c3RkaW8uaD4sIGFuZCAiY29uZmlnLmgiLgotICAJSW5jbHVkZSAiZm9wZW4tc2FtZS5oIiBvciAiZm9wZW4tYmluLmgiLCBiYXNlZCBvbgotIAlVU0VfQklOQVJZX0ZPUEVOLiAgSW5jbHVkZSA8ZXJybm8uaD4sIGFuZCBkZWNsYXJlIGVycm5vIGlmIGl0IGlzCi0gCW5vdCBhIG1hY3JvLiAgSW5jbHVkZSA8dW5pc3RkLmg+LCA8c3RyaW5nLmg+LCA8c3RyaW5ncy5oPiwKLSAJPHN0ZGxpYi5oPiwgYW5kIDxmY250bC5oPiBpZiB0aGV5IGFyZSBwcmVzZW50LiAgRGVjbGFyZSBzdHJjaHIsCi0gCXN0cnJjaHIsIGFuZCBzdHJzdHIgaWYgbm8gc3RyaW5nIGhlYWRlciBmaWxlIGV4aXN0cy4gIEluY2x1ZGUKLQk8c3lzL2ZpbGUuaD4gaWYgaXQgZXhpc3RzIGFuZCA8ZmNudGwuaD4gZG9lcyBub3QuICBEZWZpbmUKLQlPX1JET05MWSBhbmQgT19SRFdSIGlmIG5lY2Vzc2FyeS4KLQkqIGFyLmM6ICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBEbyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gYW5kCi0JPHN5cy9zdGF0Lmg+LiAgVXNlIEhBVkVfR09PRF9VVElNRV9IIHJhdGhlciB0aGFuIFBPU0lYX1VUSU1FLiAgVXNlCi0JSEFWRV9VVElNRVMgcmF0aGVyIHRoYW4gIVVTRV9VVElNRS4gIERvbid0IGluY2x1ZGUgPGVycm5vLmg+LCBhbmQKLQlkb24ndCBkZWNsYXJlIGVycm5vLgotCSogYXJzdXAuYzogRG9uJ3QgaW5jbHVkZSA8c3lzZGVwLmg+LgotCSogYnVjb21tLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIEluY2x1ZGUgPHN0ZGlvLmg+LAotCTxzeXMvdHlwZXMuaD4sIGFuZCA8c3lzL3N0YXQuaD4uICBJbmNsdWRlIDx0aW1lLmg+IGlmIGl0IGRlZmluZXMKLQl0aW1lX3QuICBEZWZpbmUgdGltZV90IGlmIG5lY2Vzc2FyeS4KLQkqIGNvZmZkdW1wLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KLQkqIGNvZmZncm9rLmMsIGZpbGVtb2RlLmMsIG5sbWNvbnYuYywgc2l6ZS5jOiBMaWtld2lzZS4KLQkqIHNyY29udi5jLCBzdHJpbmdzLmM6IExpa2V3aXNlLgotCSogbm0uYzogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgRG9uJ3QgdHJ5IHRvIGRlZmluZSBIQVZFX1NCUksuCi0JKiBvYmpjb3B5LmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIEluY2x1ZGUgPHN5cy90eXBlcy5oPiBhbmQKLQk8c3lzL3N0YXQuaD4uCi0JKHNpbXBsZV9jb3B5KTogVXNlIGNyZWF0IHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgT19DUkVBVCBpcwotCWRlZmluZWQuCi0JKiBvYmpkdW1wLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIFVzZQotCU5FRURfREVDTEFSQVRJT05fUFJJTlRGIHJhdGhlciB0aGFuICFGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQuCi0JKiBzeXNkdW1wLmM6IEluY2x1ZGUgImJmZC5oIiBhbmQgImJ1Y29tbS5oIi4gIERvbid0IGluY2x1ZGUKLQkic3lzZGVwLmgiIG9yIDxzdGRsaWIuaD4uCi0JKGR1bXBfc3ltYm9sX2luZm8pOiBSZW5hbWUgZnJvbSBzeW1ib2xfaW5mby4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotTW9uIFNlcCAgNCAxNDozMDowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogRG9uJ3Qgc2V0LiAgU3Vic3RpdHV0ZSBmb3IKLQlAQ0NALCBAQ0ZMQUdTQCwgQEhERUZJTkVTQCBhbmQgQExERkxBR1NAIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogU2V0IHRvIHJjIHJhdGhlciB0aGFuIHF2LgotCShDQyk6IERlZmluZSBhcyBAQ0NALgotCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCi0JKExERkxBR1MpOiBEZWZpbmUgYXMgQExERkxBR1NALgotCShBTExfQ0ZMQUdTKTogVXNlIEBIREVGSU5FU0AgcmF0aGVyIHRoYW4gJChIREVGSU5FUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYm90aGVyIHRvIGNhbGwgY29uZmlnLmJmZCBmb3IgZWFjaCB0YXJnZXQuCi0JSnVzdCBjYWxsIGl0IGZvciB0aGUgZGVmYXVsdCB0YXJnZXQsIGFuZCB1c2UgdGhlIHNoZWxsIHZhcmlhYmxlIHRvCi0JZGVjaWRlIHdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIHVzZWQuCi0KLVRodSBBdWcgMzEgMTk6MjE6NDggMTk5NSAgSmFzb24gTW9sZW5kYSAgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBtYXRjaCBpWzMtNl04Ni0qLXdpbjMyLCBub3QganVzdCBpMzg2LSotd2luMzIuCi0KLVRodSBBdWcgMzEgMTY6MzA6MjIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChhZGRfaW5kaXJlY3QpOiBOZXcuCi0JKGFzbV9wcmVmaXgpOiBOZXcKLQkoZ2VuX2V4cF9maWxlKTogVGltZXN0YW1wIHNob3VsZCBiZSAwLiBJbnNlcnQgcHJlZml4IHdoZW4KLQluZWVkZWQuIE5ldyBjb2RlIGZvciBpbmRpcmVjdGlvbi4KLQkoZ2VuX2xpYl9maWxlKTogVGltZXN0YW1wIHNob3VsZCBiZSAwLiBJbnNlcnQgcHJlZml4Ci0Jd2hlbiBuZWVkZWQuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1hZGQtaW5kaXJlY3QuCi0JKG1haW4pOiBDb3BlIHdpdGggbmV3IG9wdGlvbi4KLQotCSogb2JqZHVtcC5jIChkdW1wX3ByaXZhdGVfaGVhZGVycyk6IE5ldy4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9uLgotCShsb25nX29wdGlvbik6IEFkZCBwcml2YXRlLWhlYWRlcnMuCi0JKGR1bXBfYmZkX3ByaXZhdGVfaGVhZGVyKTogTmV3LgotCShtYWluKTogQ29wZSB3aXRoIG5ldyBvcHRpb24uCi0KLVRodSBBdWcgMzEgMDQ6MDk6MTYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChydW4pOiBBZGQgbWlzc2luZyAzcmQgYXJnIHRvIHdhaXRwaWQuCi0KLVdlZCBBdWcgMzAgMTE6MDI6MTEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRPT0xfUFJPR1MpOiBJbmNsdWRlIGRsbHRvb2wgaWYgbmVlZGVkLgotCi1UdWUgQXVnIDI5IDEzOjI1OjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAocnZhKTogRGVsZXRlZC4KLQkocnZhYWZ0ZXIsIHJ2YV9iZWZvcmUpOiBVc2UgbmV3IGFzc2VtYmxlciBwc2V1ZG8uCi0JKGZsdXNoX3BhZ2UsIGdlbl9leHBfZmlsZSwgZ2VuX2xpYl9maWxlKTogVXNlIG5ldyB3YXkgb2YgUlZBaW5nLgotCShnZW5fZXhwX2ZpbGUpOiBEb24ndCBnZW5lcmF0ZSAuZWRhdGEgaWYgbm8gbmVlZC4KLQkoZ2VuX2xpYl9maWxlKTogRG9uJ3QgbWFrZSB0aW1lc3RhbXAuCi0JUHV0IF9pbmFtZSBpbiBpZGF0YSQ3LgotCSh3b3Jrb3V0X3ByZWZpeCk6IEZpeCBtZW1vcnkgaW5pdGlhbGl6YXRpb24gYnVnLgotCSh1c2FnZSk6IFRpZHkgdXAsIGRlbGV0ZSBtYW55IHNpbmdsZSBjaGFyIG9wdGlvbnMuCi0JKG1haW4pOiBydmEgb3B0aW9uIGlzIGdvbmUuCi0KLU1vbiBBdWcgMjEgMTg6NDE6MjggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChvcHRpb25zKTogaW1hZ2UtYmFzZSBpcyBhIHN5bm9ueW0gZm9yIHJ2YS4KLQkoZ2VuX2xpYl9maWxlKTogUHV0IGRsbCBuYW1lIGludG8gaWJhc2UkNy4KLQotU3VuIEF1ZyAyMCAwOTo1OTowMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JTW9kaWZpZWQgdG8gZ2VuZXJhdGUgYXJjaGl2ZXMgYW5kIG9iamVjdHMgcmF0aGVyIHRoYW4gLnMgZmlsZXMuCi0JKiBkbGx0b29sLmMgKHJ1bikgTmV3IGZ1bmN0aW9uLgotIAkoZ2VuX2V4cF9maWxlLCBnZW5fbGliX2ZpbGUpOiBVc2UgcnVuLgotCSh3b3Jrb3V0X3ByZWZpeCk6IE5ldy4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQkobWFpbik6IFBhcnNlIG5ldyBvcHRpb25zLgotCi1XZWQgQXVnIDE2IDE2OjI2OjUyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogRml4IFJWQSBoYW5kbGluZy4KLQkocnZhX3MsIHJ2YV9uKTogRGVsZXRlLgotCi1GcmkgQXVnIDExIDE4OjI3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAobWFpbik6IElnbm9yZSAtZS4KLQotVGh1IEF1ZyAxMCAxNzozNTowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy50ZXhpKTogTmV3IHRhcmdldC4gIFdyaXRlIG91dCBhIHNldHRpbmcgZm9yCi0JdGV4aW5mbyB2YXJpYWJsZSBWRVJTSU9OLgotCShiaW51dGlscy5kdmksIGJpbnV0aWxzLmluZm8pOiBEZXBlbmQgb24gaXQuCi0JKiBiaW51dGlscy50ZXhpOiBJbmNsdWRlIGl0LCBhbmQgcmVmZXJlbmNlIEB2YWx1ZXtWRVJTSU9OfSBpbnN0ZWFkCi0Jb2YgZXhwbGljaXRseSBzcGVjaWZ5aW5nIDIuMighKS4KLQotVGh1IEF1ZyAxMCAxNjowNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZncm9rLmMgKGRvX3R5cGUpOiBIYW5kbGUgYXJyYXkgZGltZW5zaW9ucyB0aGUgc2FtZSB3YXkgZ2RiCi0JZG9lcy4KLQotVHVlIEF1ZyAgOCAxNzoxMDo0MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG10YWJsZSk6IE5ldyBmaWVsZHMuCi0JKEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSKTogTmV3LgotCShmbHVzaF9wYWdlKTogVXNlIG5ldyBtYWNyb3MuCi0KLVNhdCBBdWcgIDUgMDA6MTY6MzcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBIYW5kbGUgc2VjdGlvbnMKLQl3aXRoIG5vIHJlbG9jYXRpb25zLgotCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDEpOiBMaWtld2lzZS4KLQotTW9uIEp1bCAzMSAxMjo1MTowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcKLQlzdHJpbmdzIHByb2dyYW1zLCBwcmludCBzdHJpbmdzIHdoaWNoIGFyZSBub3QgdGVybWluYXRlZCB3aXRoIGEKLQludWxsIGJ5dGUgb3IgYSBuZXdsaW5lLgotCSogYmludXRpbHMudGV4aSwgc3RyaW5ncy4xOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhY2NvcmRpbmdseS4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhcgotCXByb2dyYW1zLCBwZXJtaXQgdXNlcnMgdG8gYWRkIHRoZSBzYW1lIGZpbGUgbXVsdGlwbGUgdGltZXMuCi0KLVR1ZSBKdWwgMjUgMTE6MjE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKERBVEFfRkxBR1MpOiBSZW1vdmUgU0VDX0RBVEEuCi0JKG1haW4pOiBJZiBubyBmaWxlIG5hbWVzIGFyZSBnaXZlbiwgc2NhbiBzdGFuZGFyZCBpbnB1dC4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmluZ3MuMTogc3RyaW5ncyBub3cgc2NhbnMgbm9uLWRhdGEgc2VjdGlvbnMgYnkKLQlkZWZhdWx0LgotCi1Nb24gSnVsIDI0IDEzOjUyOjI4IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHdyX2hkKTogU2V0IGFmbCBmaWVsZCB0byA0IGZvciBiZmRfYXJjaF9zaC4KLQkod3JpdGVJTlQpOiBXaGVuIHNpemUgPT0gLTIsIHVzZSAyIGJ5dGVzIGZvciB0aGUgaDgzMDAgYW5kIDQgYnl0ZXMKLQlmb3IgdGhlCXNoLgotCi0JKiBzeXNkdW1wLmMgKGZpbGx1cCk6IFJldHVybiBzaXplIC0gMSwgdGhlIGxhc3QgYnl0ZSBpcyBhIGNoZWNrc3VtCi0JYW5kIHNob3VsZG4ndCBiZSBjb3VudGVkLgotCSogc3lzcm9mZi5pbmZvIChoZCk6IENoYW5nZWQgc2VnbWVudCBpZGVudGlmaWVyIGZyb20gYSBieXRlIHRvIGEgMQotCWJpdCBmaWVsZC4gIFRoZSBzeXNyb2ZmIDIuMC0wMSBzcGVjaWZpY2F0aW9uIHNlZW1zIHRvIGJlIGluIGVycm9yCi0JaGVyZS4gIFJlZHVjZSB3aWR0aCBvZiBmb2xsb3dpbmcgInNwYXJlIiBmaWVsZCBmcm9tIDQgdG8gMyBiaXRzLgotCShybCk6IENoYW5nZWQgb3JkZXIgYW5kIHdpZHRoIG9mIGZpcnN0IDQgYml0ZmllbGRzIHRvIGNvcnJlc3BvbmQKLQl0byBzeXNyb2ZmIHNwZWNpZmljYXRpb24uCi0JKGRsbl9oZWFkLCBkbG5faW5zaWRlLCBkbG5fdGFpbCk6IFJlbW92ZWQuCi0KLVR1ZSBKdWwgMTggMjM6MDA6MDMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogIEVuY2xvc2UgZXhwcmVzc2lvbiBiZWluZyBjYXN0ZWQKLQlpbiBwYXJlbnMgc28gcmVzdWx0IGlzIGNhc3RlZCwgbm90IGp1c3QgZmlyc3Qgb3BlcmFuZC4gIENhbid0Ci0JZG8gcG9pbnRlciBhcml0aG1ldGljIG9uIHZvaWQqIHBvaW50ZXJzLgotCi1GcmkgSnVsIDE0IDEzOjQyOjQyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jIChkaCk6IENoYW5nZWQgZm9ybWF0IG9mIG91dHB1dCB0byBiZSAxNiBoZXggZGlnaXRzCi0JZm9sbG93ZWQgYnkgMTYgYXNjaWkgY2hhcmFjdGVycywgc2ltaWxhciB0byBFbWFjcycgaGV4bC1tb2RlLAotCXRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlYWQuCi0JKHhjYWxsb2MpOiBmaXggdHlwby4KLQotVGh1IEp1bCAxMyAxNToyNzo0NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl90cik6IFdyaXRlIG91dCBoYW5kY3JhZnRlZCB0ciBibG9jay4KLQkod2Fsa190cmVlX3N5bWJvbCk6IFVzZSBldmFsbGVuIGFuZCBldmFsdWUgaW5zdGVhZCBvZgotCXZhbGxlbiAmIHZhbHVlIGJlY2F1c2Ugb2YgY29ycmVzcG9uZGluZyBjaGFuZ2VzIGluCi0Jc3lzcm9mZi5pbmZvLgotCi0JKiBzeXNkdW1wLmMgKHN5c3JvZmZfc3dhcF90cl9pbiwgc3lzcm9mZl9wcmludF90cl9vdXQpOiBOZXcKLQlmdW5jdGlvbnMuCi0KLQkqIHN5c3JvZmYuaW5mbyAodHIpOiB0aGUgdHIgYmxvY2sgaXMgYSBzcGVjaWFsIGNhc2UgLS0tIGEgYmxvY2sKLQl3aXRob3V0IGNvbnRlbnRzIC0tLSB3aGljaCBjYW4ndCBiZSBoYW5kbGVkIGJ5IGdlbmVyYXRlZCBjb2RlLgotCShkZW4sIGRwcCk6IG9ubHkgZmlyc3QgYnl0ZSBpcyBwcmVzZW50IGZvciBERU5lbmQsIERQUGVuZC4KLQkoZHN5KTogZGVzY3JpYmUgYSBjb25kaXRpb25hbCBwb3J0aW9uIG9mIGJsb2NrLCByZW5hbWUgc29tZSBmaWVsZHMuCi0JKGRwcyk6IGRlc2NyaWJlIGEgY29uZGl0aW9uYWwgcG9ydGlvbiBvZiBibG9jay4KLQkoZGZsKTogcmVtb3ZlZC4KLQotCSogc3lzaW5mby55ICh5eWVycm9yKTogd3JpdGUgZXJyb3IgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KLQotVGh1IEp1bCAxMyAxMDo0Mzo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgYXJwYXJzZS5oIGFuZCBzeXNpbmZvLmguCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIHkub3V0cHV0LgotCShjbGVhbik6IFJlbW92ZSBzeXNyb2ZmLCBzeXNyb2ZmLmMsIHN5c3JvZmYuaCwgYW5kIHN5c2luZm8uCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogQ2FzdCBtZW1zZXQgYXJnIHRvIHNpemVfdC4KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBMaWtld2lzZS4KLQotCSogbm0uYyAoSEFWRV9TQlJLKTogRGVmaW5lIGV4ZWNwdCBvbiBhbWlnYWRvcyBhbmQgV0lORE9XU19OVC4KLQkoc3RydWN0IHNpemVfc3ltKTogRGVmaW5lLgotCShzaG93X3N0YXRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkIHVuZG9jdW1lbnRlZCBvcHRpb24gInN0YXRzIi4KLQkobWFpbik6IFByaW50IG1lbW9yeSBzdGF0cyBpZiByZXF1ZXN0ZWQuCi0JKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIHNvcnRfeCwgc29ydF95KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG51bWVyaWNfZm9yd2FyZCk6IFVzZSBtaW5pc3ltYm9scyByYXRoZXIgdGhhbiBhc3ltYm9scy4KLQkobm9uX251bWVyaWNfZm9yd2FyZCk6IExpa2V3aXNlLgotCShzaXplX2ZvcndhcmQxKTogUmVuYW1lIGZyb20gc2l6ZV9mb3J3YXJkLiAgVXNlIG1pbmlzeW1ib2xzLgotCShzaXplX2ZvcndhcmQyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc29ydF9zeW1ib2xzX2J5X3NpemUpOiBUYWtlIG5ldyBhcmd1bWVudHMgZHluYW1pYywgc2l6ZSwgYW5kCi0Jc3ltc2l6ZXAuICBVc2UgbWluaXN5bWJvbHMuICBEb24ndCBzdG9yZSB0aGUgc2l6ZSBiYWNrIGluIHRoZQotCXN5bWJvbDsgc3RvcmUgaW4gYSBuZXdseSBhbGxvY2F0ZSBzdHJ1Y3Qgc2l6ZV9zeW0gYXJyYXkuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBSZWFkIG1pbmlzeW1ib2xzIHJhdGhlciB0aGFuIGFzeW1ib2xzLiAgU2V0Ci0Jc29ydF8qIHZhcmlhYmxlcy4gIENhbGwgcHJpbnRfc2l6ZV9zeW1ib2xzIGlmIHNvcnRpbmcgYnkgc2l6ZS4KLQkoZmlsdGVyX3N5bWJvbHMpOiBUYWtlIG5ldyBhcmd1bWVudHMgZHluYW1pYyBhbmQgc2l6ZS4gIFVzZQotCW1pbmlzeW1ib2xzLgotCShwcmludF9zeW1ib2xzKTogTGlrZXdpc2UuICBDYWxsIHByaW50X3N5bWJvbCBmb3IgYWN0dWFsIHByaW50aW5nLgotCShwcmludF9zaXplX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1XZWQgSnVsIDEyIDEwOjQzOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiBPbmx5IHByaW50IGVhY2ggc3RhYnMgc2VjdGlvbgotCW9uY2UuCi0JKGNvbXBhcmVfcmVsb2NzKTogTWFrZSBpdCBjbGVhciB0byBnY2MgdGhhdCB0aGlzIGFsd2F5cyByZXR1cm5zIGEKLQl2YWx1ZS4KLQotV2VkIEp1bCAxMiAxMDo0MDoyMyAxOTk1ICBILkouIEx1ICA8aGpsQG55bmV4c3QuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNpbXBsZV9jb3B5KTogUHJlc2VydmUgZXJybm8gb24gZmFpbHVyZS4KLQkoc21hcnRfcmVuYW1lKTogUHJpbnQgZXJyb3IgbWVzYWdlIGlmIHNpbXBsZV9jb3B5IGZhaWxzLgotCi1UdWUgSnVsIDExIDEzOjEwOjUyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jOiByZS1pbmRlbnRlZCBmaWxlLgotCShtb2R1bGUpOiByZWFkIGJsb2NrcyBzZXF1ZW50aWFsbHkgaW5zdGVhZCBvZiB0cnlpbmcgdG8gcGFyc2UKLQl0aGVtLCBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgY2hhbmdpbmcgdGhlIHBhcnNlciByZWNvZ25pemUgdGhlCi0JZGlmZmVyZW5jZSBiZXR3ZWVuIGEgRFBTc3RhcnQgYW5kIERQU2VuZCBibG9jay4KLQkoZ2V0b25lKTogQWRkIGJyZWFrJ3MgYmV0d2VlbiBzd2l0Y2ggYmxvY2tzIGFzIGFwcHJvcHJpYXRlLgotCShvYmplY3RfYm9keV9saXN0KTogcGFyc2UgYmxvY2tzIGFjY29yZGluZyB0byBzeXNyb2ZmIHNwZWMuCi0KLU1vbiBKdWwgMTAgMTI6Mzc6MjUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHBvc2VpZG9uLmN5Z251cy5jb20+Ci0KLQkqIHN5c3JvZmYuaW5mbzogcmUtaW5kZW50ZWQgZmlsZSwgcHJpb3IgZm9ybWF0dGluZyB3YXMgY29uZnVzaW5nCi0JYmVjYXVzZSBpdCB3YXMgaW5kZW50YXRpb24gZGlkIG5vdCByZWZsZWN0IG5lc3Rpbmcgb2YgY29uZGl0aW9uYWwKLQlyZWNvcmRzLiAgQ2hhbmdlICJzcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IiByZWNvcmQgaW4gaGQgcmVjb3JkCi0JZnJvbSBiaXQgdG8gYnl0ZS4KLQotCSogc3lzaW5mby55IChjb25kX2l0X2ZpZWxkKTogVXNlIHhjYWxsb2MgaW5zdGVhZCBvZiBjYWxsb2MuCi0KLQkqIHNyY29udi5jICh3cl9jcyk6IFJlZm9ybWF0dGVkIGNzIGhlYWRlciBhcnJheSwgdGFnIGVhY2ggYnl0ZQotCXdpdGggYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGZpZWxkLgotCSh3cl91bml0X2luZm8pOiBVc2UgU0VFS19TRVQgbWFjcm8gaW5zdGVhZCBvZiBjb25zdGFudCAwLgotCShtYWluKTogVXNlIEZPUEVOX1dCIG1hY3JvIGluc3RlYWQgb2YgbGl0ZXJhbCAid2IiLgotCSogc3lzcm9mZi5pbmZvOiBSZW1vdmUgZmRsIChkZmwpIGZpZWxkIGZyb20gY3MgYmxvY2suICBDb21wYXJlCi0JcHRyLT50eXBlIHdpdGggRURfVFlQRV9DT05TVCBpbnN0ZWFkIG9mIGNvbnN0YW50IDIgaW4gZWQgYmxvY2suCi0KLVR1ZSBKdWwgIDQgMTQ6NDg6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChzaXplX2ZvcndhcmQpOiBDaGVjayB5ZiBhZ2FpbnN0IHluLCBub3QgeG4uCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogUmVjb3JkIGFsbCBvdXRwdXQgQkZEJ3MsIGFuZCBjbG9zZQotCXRoZW0gYmVmb3JlIHVubGlua2luZyB0aGVtIGFuZCByZW1vdmluZyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQl0byBhdm9pZCBORlMgcHJvYmxlbXMuCi0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IEluIHZlcmJvc2UgbWVzc2FnZXMsIHVzZSAncicgd2hlbgotICAgICAgICByZXBsYWNpbmcgYSBtZW1iZXIsIGFuZCAnYScgd2hlbiBhZGRpbmcgb25lLgotCi0JKiBhci5jIChhcl90cnVuY2F0ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG5vcm1hbGl6ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBjb25zdCBjaGFyICouICBBZGQgYWJmZAotCWFyZ3VtZW50LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYgYXJfdHJ1bmNhdGUsIGNob3AgdGhlIGZpbGVuYW1lCi0JdG8gYWJmZC0+YXJfbWF4X25hbWVsZW4uCi0JKG1haW4pOiBGb3IgdGhlICdmJyBtb2RpZmllciwgc2V0IGFyX3RydW5jYXRlIHRvIHRydWUuICBEb24ndAotCWNoYW5nZSBxdWlja19hcHBlbmQgdG8gcmVwbGFjZSBpZiBhcl90cnVuY2F0ZSBpcyB0cnVlLgotCShkb19xdWlja19hcHBlbmQpOiBJZiBhcl90cnVuY2F0ZSwgc2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQuCi0JKHdyaXRlX2FyY2hpdmUpOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIGFyLjE6IERvY3VtZW50ICdmJyBtb2RpZmllci4KLQotCSogb2JqY29weS5jIChlbnVtIHN0cmlwX2FjdGlvbik6IERlZmluZSBzdHJpcF91bm5lZWRlZC4KLQkoT1BUSU9OX1NUUklQX1VOTkVFREVEKTogRGVmaW5lLgotCShzdHJpcF9vcHRpb25zKTogQWRkICJzdHJpcC11bm5lZWRlZCIuCi0JKGNvcHlfb3B0aW9ucyk6IExpa2V3aXNlLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXN0cmlwLXVubmVlZGVkLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCShpc19zdHJpcF9zZWN0aW9uKTogU3RyaXAgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHN0cmlwX3VubmVlZGVkLgotCShmaWx0ZXJfc3ltYm9scyk6IElmIHN0cmlwX3VubmVlZGVkLCBvbmx5IGtlZXAgQlNGX0tFRVAgc3ltYm9scy4KLQkoY29weV9vYmplY3QpOiBJZiBzdHJpcF9hbGwsIGRpc2NhcmQgc3ltYm9scyB3aXRob3V0IGNoZWNraW5nCi0JZGlzY2FyZF9sb2NhbHMuCi0JKGNvcHlfb2JqZWN0KTogQ2FsbCBmaWx0ZXJfc3ltYm9scyBpZiBzdHJpcF91bm5lZWRlZC4KLQkoc2V0dXBfc2VjdGlvbik6IFN0cmlwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBzdHJpcF91bm5lZWRlZC4KLQkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4pOiBIYW5kbGUgT1BUSU9OX1NUUklQX1VOTkVFREVELgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgLS1zdHJpcC11bm5lZWRlZC4KLQotTW9uIEp1bCAgMyAxNDoxNjo0NyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi13aW4zMik6IE5ldyBjb25maWd1cmF0aW9uLgotCSogZGxsdG9vbC5jIChraWxsYXQsIHhsYXRlLCB1c2FnZSwgbG9uZ19vcHRpb25zLCBtYWluKToKLQlVbmRlcnN0YW5kIGFuZCBjb3BlIHdpdGggLWsgb3B0aW9uLgotCi1TYXQgSnVsICAxIDEyOjI1OjE1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBhci5jOiAoZXh0cmFjdF9maWxlKTogIENoYW5nZSAiI2lmIFBPU0lYX1VUSU1FIiB0bwotCSIjaWZkZWYgUE9TSVhfVVRJTUUiIHRvIG1hdGNoIG90aGVyIHRlc3RzIG9mIFBPU0lYX1VUSU1FCi0JYW5kIGF2b2lkIGxvc3NhZ2Ugd2hlbiBQT1NJWF9VVElNRSBpcyBub3QgZGVmaW5lZCBhdCBhbGwuCi0KLVdlZCBKdW4gMjggMTc6NTE6MjQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYXIuYzogKHByaW50X2NvbnRlbnRzLmMsIGV4dHJhY3RfZmlsZSwgZG9fcXVpY2tfYXBwZW5kKToKLQlNYWxsb2MgYnVmZmVycyByYXRoZXIgdGhhbiBhbGxvY2F0ZSBvbiBzdGFjayAoc28gaXQgd29ya3MKLQlvbiBOVCkuCi0JKiBkZWZsZXgubDogTmFtZXMgY2FuIGhhdmUgYW4gQCBpbiB0aGVtLgotCSogZGxsdG9vbC5jOiBMb2FkcyBvZiBzdHVmZi4gQ2FuIG5vdyBnZW5lcmF0ZSAuaW1wIGZpbGVzIHdoaWNoCi0Jd29yayB3aXRoIE5UIC5kbGxzLgotCi1UaHUgSnVuIDIyIDE5OjEwOjUwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2UuaW4gKGRlbWFuZ2xlLmMubyk6IFJlbW92ZS4KLQkoYXJwYXJzZS5oKTogRGVwZW5kIG9uIGFycGFyc2UuYyBpbnN0ZWFkIG9mIGFycGFyc2UueS4KLQotV2VkIEp1biAyMSAxNzozMjo0NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogRG9uJ3QgaW5jbHVkZSBpbmZvIGhlcmUuCi0JKGRpc3RzdHVmZik6IEluY2x1ZGUgaXQgaGVyZS4KLQkocmVhbGNsZWFuKTogUmVtb3ZlICouaW5mby4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3JlbG9jcyk6IElmIHJlbG9jYXRpb24gZW50cmllcyBoYXZlIHRoZSBzYW1lCi0JYWRkcmVzcywga2VlcCB0aGVtIGluIGZpbGUgb3JkZXIuCi0KLU1vbiBKdW4gMTkgMDk6MDY6NDkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiBDaGFuZ2UgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiAuKi5zLT4gLSoucwotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6ICBDaGVjayBmb3IgbmFtZXMKLQl3aGljaCBhcmUgc3VwZXJzZXRzIG9mIHNlbGVjdGVkIG5hbWVzLgotCi1XZWQgSnVuIDE0IDE5OjQzOjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobXRhYmxlLCBBUk0ganVtcCk6IE11c3QgcmVkaXJlY3QgdmlhIHBjIG9mZnNldGFibGUgcHRyLgotCi1XZWQgSnVuIDE0IDEzOjI3OjIyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRlZmxleC5sLCBkZWZwYXJzZS55LCBkbGx0b29sLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFN1cHBvcnQgZm9yIHRoZW0uCi0KLU1vbiBKdW4gMTIgMTE6Mjc6NTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jOiBJbmNsdWRlIHN5c2RlcC5oCi0JKG1haW4pOiBPcGVuIGlucHV0IHdpdGggRk9QRU5fUkIuCi0KLUZyaSBKdW4gIDkgMTc6MjY6MTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHdpZGVfb3V0cHV0KTogTmV3IGZsYWcgdmFyaWFibGUuCi0JKHVzYWdlKTogUHJpbnQgbmV3IC13LCAtLXdpZGUgb3B0aW9ucy4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0td2lkZSBzdXBwb3J0LgotCShkdW1wX3NlY3Rpb25faGVhZGVyKTogSWYgLS13aWRlLCBkb24ndCBwcmludCBhIG5ld2xpbmUgYmV0d2VlbgotCXRoZSBzZWN0aW9uJ3MgZmlyc3QgbGluZSBhbmQgdGhlIGZsYWdzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBVc2UgdW5zaWduZWQgY29tcGFyaXNvbnMgZm9yIHRoZSBiaW5hcnkKLQlzZWFyY2gsIG5vdCBzaWduZWQuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBJZiAtLXdpZGUsIGRvbid0IHB1dCBhIFxuIGJldHdlZW4gdGhlCi0JZGlzYXNzZW1ibHkgb3V0cHV0IGFuZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCShtYWluKTogU3VwcG9ydCAtdyBvcHRpb24gYmVpbmcgdGhlIHNhbWUgYXMgLS13aWRlLgotCi1UaHUgSnVuICAxIDE3OjA5OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTYXQgTWF5ICA2IDA4OjUyOjI0IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogb2JqY29weS5jIChzbWFydF9yZW5hbWUpOiBtYWtlIGl0IHNtYXJ0ZXIsIGNsZWFuIHVwCi0JICBpZiByZW5hbWUgKCkgZmFpbHMuCi0KLVR1ZSBNYXkgMzAgMTQ6MjQ6MTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IERlbGV0ZSBsaW5lcyB3aXRoIGxvdHMgb2YgIyMjIyBiZWNhdXNlIGZvdXIgb3IgbW9yZQotCWluZGljYXRlIGEgcG9pbnQgZm9yIG1ha2VmaWxlIGZyYWdtZW50IHN1YnN0aXR1dGlvbi4KLQotVHVlIE1heSAgOSAxNzoxNzowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmxtY29udiBvbiBQb3dlclBDIGVhYmkgYW55IG1vcmUsIGl0Ci0JaXMgbm90IG5lZWRlZC4KLQotVGh1IEFwciAyNyAyMDoyMToyNCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNUKTogRGVmaW5lLgotCShSVU5URVNUKTogVXNlIG9uZSBpbiBzb3VyY2UgdHJlZSBpZiBwcmVzZW50LgotCShjaGVjayk6IFNldCBgcm9vdG1lJyBmb3IgJChFWFBFQ1QpLgotCi1XZWQgQXByIDI2IDE4OjI2OjIxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jIChtYWluKTogQWRkIHN1cHBvcnQgZm9yIC1uIG9wdGlvbiB3aGljaCBkaXNhYmxlcwotCXByZXNjYW4gb2YgY29tbW9uIHN5bWJvbHMuCi0JKHdyX29iKTogSWYgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLCBmaWxsIHdpdGggemVyb3MuCi0KLVR1ZSBBcHIgMjUgMTk6MTQ6MzcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogRGlzcGxheSBsb2FkIGFkZHJlc3MgYWZ0ZXIKLQl2aXJ0dWFsIG1lbW9yeSAocnVuLXRpbWUpIGFkZHJlc3MuCi0KLVdlZCBBcHIgMTkgMDk6NDQ6MDYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjcGx1cy1kZW0ubyk6IFBhc3MgLURWRVJTSU9OPSciJChWRVJTSU9OKSInIHRvIHRoZQotICAgICAgICBjb21waWxlLgotCShERU1BTkdMRVJfUFJPRyk6IE5vIGxvbmdlciB1c2VzIHZlcnNpb24uby4KLQotTW9uIEFwciAxMCAxMzoyOTo0OSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KLQkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCi0JKiBtcHctY29uZmlnLmluIChUREVGSU5FUyk6IERlZmluZSBhcyBlbXB0eSBpbiBtYWtlZmlsZSBmcmFnLgotCi0JKiBtcHctY29uZmlnLmluOiBDcmVhdGUgbWsudG1wLCBkZWZpbmUgQVJDSERFRlMgaW4gaXQuCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgY29uZmlndXJlIGZyYWdtZW50IGZvciBiaW51dGlscy4KLQkqIG1wdy1tYWtlLmluIChpbnN0YWxsLW9ubHkpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogQWxzbyBkZXBlbmQgb24gaW5zdGFsbC1vbmx5LgotCi0JKiBtcHctbWFrZS5pbiAoY3BsdXNmaWx0KTogUmVuYW1lZCBmcm9tIGMrK2ZpbHQuCi0JKElOQ0xVREVTKTogQWRkIG1vcmUgcGF0aHMuCi0KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIG1ha2VmaWxlIGZyYWdtZW50IGZvciBiaW51dGlscy4KLQkoTm9ybWFsbHkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbi4pCi0KLU1vbiBNYXIgMjcgMTE6NTI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQ2FsbCBtYWtlX3RlbXBuYW1lIHRvIGdldCBvdXRwdXQgZmlsZQotCW5hbWUsIHJhdGhlciB0aGFuIHVzaW5nIGEgZml4ZWQgbmFtZSBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZS4KLQotCSogb2JqY29weS5jIChtYWtlX3RlbXBuYW1lKTogQ29weSBmcm9tIGhlcmUuLi4KLQkqIGJ1Y29tbS5jIChtYWtlX3RlbXBuYW1lKTogLi4udG8gaGVyZSwgYW5kIG1ha2UgZ2xvYmFsLgotCSogYnVjb21tLmggKG1ha2VfdGVtcG5hbWUpOiBEZWNsYXJlLgotCi1GcmkgTWFyIDI0IDExOjQ3OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jOiBJbmNsdWRlICJiZmQuaCIgYmVmb3JlIG90aGVyIGhlYWRlcnMuICBJbmNsdWRlCi0JInN5c2RlcC5oIi4KLQkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENhc3Qgc3RfdWlkIGFuZCBzdF9naWQgdG8gbG9uZywKLQlhbmQgcHJpbnQgdGhlbSB3aXRoICVsZC4KLQotRnJpIE1hciAxMCAxMzowOTo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfb3B0aW9ucyk6IEFkZCAtLWtlZXAtc3ltYm9sLgotCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1rZWVwLXN5bWJvbCBhbmQgLUsuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKGtlZXBfc3ltYm9scyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGlzX3N0cmlwX3N5bWJvbCk6IEFkanVzdCB0aGUgcmV0dXJuIHZhbHVlIGFjY29yZGluZyB0bwotCWtlZXBfc3ltYm9scy4KLQkoc3RyaXBfbWFpbik6IEhhbmRsZSAtSy4gIEZvciAtTiwgY2hlY2sgdGhhdCAtSyB3YXMgbm90IGdpdmVuLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgLUsuCi0KLU1vbiBNYXIgIDYgMTM6MzM6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IENoZWNrIHJlc3VsdCBvZiBta2Rpci4KLQkoY29weV9tYWluKTogQ2FzdCBhbiB4bWFsbG9jIHJlc3VsdC4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IEJyZWFrIGxvbmcgZm9ybWF0IHN0cmluZyBpbnRvIHNob3J0ZXIgb25lcy4KLQotTW9uIE1hciAgNiAxMzo0NjoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5jIChsaXN0X3N1cHBvcnRlZF90YXJnZXRzKTogTmV3IGZ1bmN0aW9uLgotCSogYnVjb21tLmggKGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMpOiBEZWNsYXJlLgotCSogYXIuYyAodXNhZ2UpOiBDYWxsIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMuCi0JKiBubS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChjb3B5X3VzYWdlLCBzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc2l6ZS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jICh1c2FnZSk6IExpa2V3aXNlLgotCi1UdWUgRmViIDI4IDE1OjEzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogQ2FzdCBzdF9zaXplIHRvIGxvbmcgYmVmb3JlCi0JcGFzc2luZyBpdCB0byBmcHJpbnRmLgotCi1GcmkgRmViIDE3IDEzOjM2OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGZpZWxkcyByZW1vdmUsIHNldF9mbGFncywKLQlhbmQgZmxhZ3MuICBDaGFuZ2UgYWRqdXN0IGZyb20gYm9vbGVhbiB0byBlbnVtLgotCShyZW1vdmVfc2VjdGlvbnMpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShzZWN0aW9uc19yZW1vdmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29weV9vcHRpb25zKTogQWRkIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKHBhcnNlX2ZsYWdzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZmluZF9zZWN0aW9uX2xpc3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpc19zdHJpcF9zeW1ib2wpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgZnJvbSBpbnQgdG8gYm9vbGVhbi4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbHRlcl9zeW1ib2xzKTogQ2FsbCBpc19zdHJpcF9zZWN0aW9uLgotCShjb3B5X29iamVjdCk6IFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBjaGVjayBmb3Igc3BlY2lmaWVkIGZsYWdzIG9yCi0JVk1BLiAgQ2FsbCBmaWx0ZXJfc3ltYm9scyBpZiBhbnkgc2VjdGlvbnMgYXJlIGJlaW5nIHJlbW92ZWQuCi0JKHNldHVwX3NlY3Rpb24pOiBVc2UgZmluZF9zZWN0aW9uX2xpc3QgZnVuY3Rpb24gcmF0aGVyIHRoYW4KLQlsb29raW5nIHRocm91Z2ggcmVtb3ZlX3NlY3Rpb25zIGFuZCBhZGp1c3Rfc2VjdGlvbnMuICBIYW5kbGUKLQktLXNldC1zZWN0aW9uLWZsYWdzLgotCShjb3B5X3NlY3Rpb24pOiBVc2UgZmluZF9zZWN0aW9uX2xpc3QgcmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoCi0JcmVtb3ZlX3NlY3Rpb25zLgotCShzdHJpcF9tYWluKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGluc3RlYWQgb2YgYWRkaW5nIGl0ZW1zIHRvCi0Jc2VjdGlvbnNfcmVtb3ZlZC4KLQkoY29weV9tYWluKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGluc3RlYWQgb2YgYWRkaW5nIGl0ZW1zIHRvCi0Jc2VjdGlvbnNfcmVtb3ZlZCBhbmQgYWRqdXN0X3NlY3Rpb25zLiAgSGFuZGxlIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0KLVR1ZSBGZWIgMTQgMTg6MDM6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHdpdGhfc291cmNlX2NvZGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLVMvLS1zb3VyY2UuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXNvdXJjZS4KLQkocHJldl9mdW5jdGlvbm5hbWUsIHByZXZfbGluZSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0KTogRGVmaW5lLgotCShwcmludF9maWxlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNraXBfdG9fbGluZSwgc2hvd19saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIHNob3dfbGluZSB0byBoYW5kbGUgLWwgYW5kIC1TLgotCShtYWluKTogSGFuZGxlIC1TLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtUy8tLXNvdXJjZS4KLQotVGh1IEZlYiAgOSAxNjoxMTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IFJlbmFtZSBwYXJhbWV0ZXIgdG8gYXZvaWQgc2hhZG93aW5nLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2FkZCk6IERlZmluZS4KLQkoYWRkX3NlY3Rpb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tYWRkLXNlY3Rpb24uCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tYWRkLXNlY3Rpb24uCi0JKGNvcHlfb2JqZWN0KTogQWRkIHNlY3Rpb25zIGZyb20gdGhlIGFkZF9zZWN0aW9ucyBsaXN0LgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1hZGQtc2VjdGlvbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1hZGQtc2VjdGlvbi4KLQotV2VkIEZlYiAgMSAxNTowNDo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBQYXNzIHNlY3Rpb24gb2Zmc2V0LCBub3QgYWJzb2x1dGUKLQlhZGRyZXNzLCB0byBiZmRfZmluZF9uZWFyZXN0X2xpbmUuCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogRG9uJ3QgdXNlIGNvbnN0IHdpdGgKLQlyZWxvY19ob3d0b190eXBlLgotCi1UaHUgSmFuIDI2IDE4OjUwOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3N5bWJvbHMpOiBVc2UgYmZkX2FzeW1ib2xfdmFsdWUgKFZBUikgcmF0aGVyCi0JdGhhbiBWQVItPnZhbHVlLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBMaWtld2lzZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGNoYW5nZSB0aGUgc3ltYm9sIHZhbHVlcy4gIEl0IGNhbgotCWNvbmZ1c2UgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQotVGh1IEphbiAyNiAxMjowMzo1NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYmFpLgotCi1XZWQgSmFuIDE4IDEwOjAyOjEyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBjb2ZmZHVtcC5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCShkdW1wX2NvZmZfdHlwZSk6IEhhbmRsZSBjb2ZmX3NlY2RlZl90eXBlLgotCSogY29mZmdyb2suYyA6IEluY2x1ZGUgc3lzZGVwLmguCi0JKiBzcmNvbnYuYzogSW5jbHVkZSBsaWJpYmVydHkuaAotCShhYnNvbHV0ZV9wLCBkdHlfc3RhcnQsIGR0eV9lbmQsIGR1bXBfdHJlZV9zdHJ1Y3R1cmUpOiBSZW1vdmUuCi0KLVdlZCBKYW4gMTggMTI6MjQ6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb2ZmZHVtcC5jIChkdW1wX2NvZmZfc2NvcGUpOiBDYXN0IHBvaW50ZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IKLQlwcmludGYuCi0JKiBjb2ZmZ3Jvay5jOiBJbmNsdWRlIGJ1Y29tbS5oLiAgRG9uJ3QgZGVjbGFyZSB4bWFsbG9jLgotCShwdXNoX3Njb3BlKTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBsaW5rLgotCSogc2l6ZS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSogc3Jjb252LmM6IEluY2x1ZGUgYnVjb21tLmguCi0JKGZpbmRfYmFzZSk6IERlY2xhcmUgYXQgdG9wIG9mIGZpbGUuCi0JKHdyX2hkKTogQWRkIGRlZmF1bHQgY2FzZSB0byBhcmNoaXRlY3R1cmUgc3dpdGNoLgotCSh3cl9kcHNfc3RhcnQpOiBEZWNsYXJlIHR5cGUgb2YgcGFyYW1ldGVyIG5lc3QuCi0JKHdyX2R1KTogQ29tbWVudCBvdXQgdmFyaWFibGVzIHVzZWQgb25seSBpbiBjb21tZW50ZWQgb3V0IGJsb2Nrcy4KLQkod3JfZHVzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCSh3cl9zYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIG15aW5mbywgbG93LCBhbmQgaGlnaC4KLQkqIHN0cmluZ3MuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkqIHN5c2R1bXAuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0KLVR1ZSBEZWMgMjAgMTk6MTM6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogSWdub3JlICdmJyBtb2RpZmllciB1c2VkIG9uIEhQL1VYIDkuCi0KLVRodSBEZWMgMTUgMTc6MzQ6MTIgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBhci5jLCBubS5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYzogSW5jbHVkZSBwcm9ncmVzcy5oLgotCSogYXIuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMgKG1haW4pOiBBZGQgU1RBUlRfUFJPR1JFU1MKLQlhbmQgRU5EX1BST0dSRVNTLgotCSogYXIuYyAobWFwX292ZXJfbWVtYmVycywgb3Blbl9pbmFyY2gpOiBDYWxsIFBST0dSRVNTLgotCSogbm0uYyAobWFpbiwgZGlzcGxheV9hcmNoaXZlLCBmaWx0ZXJfc3ltYm9scywgcHJpbnRfc3ltYm9scyk6Ci0JQ2FsbCBQUk9HUkVTUy4KLQotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogQnJlYWsgdXAgbG9uZyB1c2FnZSBzdHJpbmcuCi0KLVdlZCBEZWMgMTQgMTU6NTE6NTYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IERvbid0IGJvdGhlciBzZXR0aW5nIHN0YXR1cyBhZnRlcgotCW5vbmZhdGFsKCkgImNhbGwiLCBiZWNhdXNlIGl0IHdvbid0IHJldHVybi4KLQotRnJpIERlYyAgOSAwMDoyMjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogRG9uJ3Qgc3dpdGNoIGEgcmVsb2MgdG8gdXNlCi0JdGhlIHNlY3Rpb24gc3ltYm9sIGlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLgotCi1UaHUgRGVjICA4IDE0OjQ1OjUwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoYWRkX3N0cmlwX3N5bWJvbCk6IENhc3QgcmV0dXJuIHZhbHVlIG9mIHhtYWxsb2MuCi0KLVdlZCBOb3YgMzAgMTE6MDU6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogUGFzcyBjdXJyZW50LT5maWxlbmFtZSB0byBub3JtYWxpemUgd2hlbgotCWNoZWNraW5nIGZvciBkdXBsaWNhdGVzLCBiZWNhdXNlIHRoZSBmaWxlbmFtZSBvZiBhIG5ld2x5IGFkZGVkCi0JZmlsZSB3aWxsIG5vdCBoYXZlIGJlZW4gbm9ybWFsaXplZCB5ZXQuCi0KLVRodSBOb3YgMTcgMTU6MDA6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogRG9uJ3QgY2FsbCBkb19xdWlja19hcHBlbmQgaWYgYW55IG9mIHRoZSBhcmNoaXZlCi0JbmFtZXMgYXJlIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuCi0KLQkqIG9iamNvcHkuYyAobWFpbik6IEZpeCBpc19zdHJpcCB0ZXN0LiAgRnJvbQotCXBpcmtlckBlaXVuaXgudHV3aWVuLmFjLmF0IChNYXJ0aW4gUGlya2VyKS4KLQotVGh1IE5vdiAxNyAxNTozNzoxOSAxOTk0ICBNYXJrIFcuIEVpY2hpbiAgPGVpY2hpbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGFkZF9zdHJpcF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24sIGFkZHMgYSBuYW1lIHRvIGFuCi0JZXhwbGljaXQgbGlzdCBvZiBzeW1ib2xzIHRvIHN0cmlwLgotCShpc19zdHJpcF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24sIHJlcG9ydHMgd2hldGhlciB0aGUgbmFtZSBhcmd1bWVudAotCWlzIGluIHRoZSBleHBsaWNpdCBsaXN0LgotCShmaWx0ZXJfc3ltYm9scyk6IENoZWNrIGFnYWluc3QgaXNfc3RyaXBfc3ltYm9sIGFib3ZlIGFsbC4KLQkoc3RyaXBfbWFpbik6IFJlY29nbml6ZSAtTiBvcHRpb24uIElmIHVzZWQsIGRvbid0IGRlZmF1bHQgdG8KLQlzdHJpcF9hbGwuCi0JKGNvcHlfbWFpbik6IFJlY29nbml6ZSAtTiBvcHRpb24uCi0JKHN0cmlwX3VzYWdlKTogRG9jdW1lbnQgLU4gYW5kIC0tc3RyaXAtc3ltYm9sIG9wdGlvbnMuCi0JKGNvcHlfdXNhZ2UpOiBEaXR0by4KLQkqIG9iamNvcHkuMSwgc3RyaXAuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgLU4gYW5kCi0JLS1zdHJpcC1zeW1ib2wgb3B0aW9ucy4KLQotVHVlIE5vdiAgOCAxMzoxMjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCwgZGlzcGxheV9pbmZvX3RhYmxlKTogUGFzcyBhbgotCWFycmF5IHRvIHRtcGFyZywgcmF0aGVyIHRoYW4gTlVMTCwgc2luY2Ugc29tZSBzeXN0ZW1zIGNhbid0IGhhbmRsZQotCU5VTEwuCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogS2VlcCBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRoZQotICAgICAgICB0ZW1wb3JhcnkgZmlsZXMgd2UgY3JlYXRlZC4gIENsb3NlIGVhY2ggaW5wdXQgQkZEIGFmdGVyIHdlIG9wZW4KLSAgICAgICAgaXRzIHN1Y2Nlc3Nvci4KLQotTW9uIE5vdiAgNyAxNTo0ODozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdG8gMi41LjMuCi0KLVRodSBOb3YgIDMgMTk6MDQ6MzQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IEluc3RhbGwgaW5mbyBmaWxlcyBmcm9tIHdoYXRldmVyCi0JZGlyZWN0b3J5IHRoZXkgd2VyZSBmb3VuZCBpbi4KLQotCVBhdGNoIGZyb20gREogRGVsb3JpZToKLQkqIGNvbmZpZ3VyZS5iYXQ6IGRvIGMrK2ZpbHQgLT4gY3h4ZmlsdCByaWdodAotCi0JKiBzeXNpbmZvLnk6IEluY2x1ZGUgc3lzdGVtIGhlYWRlciBmaWxlcyBlYXJseSwgc28gYW55IHBvdGVudGlhbAotCWRlY2xhcmF0aW9uIG9mIGFib3J0KCkgb2NjdXJzIGJlZm9yZSBpdHMgdXNlLgotCi0JKiBzdHJpbmdzLmMgKHN0cmluZ3NfZmlsZSk6IFRyeSBvcGVuaW5nIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlCi0JZmlyc3QuCi0KLVdlZCBOb3YgIDIgMTU6NDQ6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogVHJlYXQgYXIgcXMgbGlrZSBhciBycy4KLQotVHVlIE9jdCAyNSAxNjoxOToyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZ2FwX2ZpbGwpOiBFeHBsaWNpdGx5IGluaXRpYWxpemUsIGZvciBjbGFyaXR5LgotCShwYWRfdG9fc2V0LCBwYWRfdG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tcGFkLXRvLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXBhZC10by4KLQkoY29weV9vYmplY3QpOiBTdXBwb3J0IC0tcGFkLXRvLgotCShjb21wYXJlX3NlY3Rpb25fdm1hKTogU29ydCBub24gbG9hZGFibGUgc2VjdGlvbnMgdG8gdGhlIGZyb250LgotCVNvcnQgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBWTUEgYnkgc2l6ZS4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tcGFkLXRvLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLXBhZC10by4KLQotVGh1IE9jdCAyMCAxMzo1MTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoZ2FwX2ZpbGxfc2V0LCBnYXBfZmlsbCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb3B5X29wdGlvbnMpOiBBY2NlcHQgLS1nYXAtZmlsbC4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1nYXAtZmlsbC4KLQkoY29weV9vYmplY3QpOiBTdXBwb3J0IC0tZ2FwLWZpbGwuCi0JKGdldF9zZWN0aW9ucywgY29tcGFyZV9zZWN0aW9uX3ZtYSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1nYXAtZmlsbC4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1nYXAtZmlsbC4KLQotV2VkIE9jdCAxOSAxNDowOToxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IEFkZCBhIGR1bW15IGVsc2UgY2xhdXNlIHRvIHRoZSBpZgotCXN0YXRlbWVudC4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IFJlbW92ZSBzcGVjaWFsIG1lbnRpb24gb2YgLS1zZXQtc3RhcnQKLQlhbmQgYGJpbmFyeScgb3V0cHV0IGZvcm1hdC4KLQotVHVlIE9jdCAxOCAxMToxMjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBJZiB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0IGlzIGBiaW5hcnknLAotCWFuZCB0aGUgc3RhcnQgYWRkcmVzcyB3YXMgbm90IHNldCB1c2luZyAtLXNldC1zdGFydCwgZGVmYXVsdCB0aGUKLQlzdGFydCBhZGRyZXNzIHRvIHplcm8uICBUaGlzIGhhY2sgaXMgYmVjYXVzZSB0aGUgYGJpbmFyeScgb3V0cHV0Ci0JZmlsZSBmb3JtYXQgdXNlcyB0aGUgc3RhcnQgYWRkcmVzcyB0byBzZXQgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZgotCXRoZSBmaXJzdCBieXRlIGluIHRoZSBmaWxlLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBBZGQgc29tZSBub3RlcyBvbiBnZW5lcmF0aW5nIFMtcmVjb3JkcwotCWFuZCBiaW5hcnkgZmlsZXMuCi0KLQkqIG5tLmMgKHByaW50X3N5bWRlZl9lbnRyeSk6IENhbGwgcHJpbnRfc3ltbmFtZSB0byBwcmludCB0aGUKLQlzeW1ib2wgbmFtZSwgc28gdGhhdCAtLWRlbWFuZ2xlIHdvcmtzLgotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBSZW1vdmUgdG1wZGlyLgotCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2xpc3QpOiBBZGQgZmllbGRzIHVzZWQsIGFkanVzdCwgdmFsLgotCShhZGp1c3Rfc3RhcnQsIHNldF9zdGFydF9zZXQsIHNldF9zdGFydCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShhZGp1c3Rfc2VjdGlvbl92bWEsIGFkanVzdF9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb3B5X29wdGlvbnMpOiBBZGQgLS1hZGp1c3Qtc3RhcnQsIC0tYWRqdXN0LXZtYSwKLQktLWFkanVzdC1zZWN0aW9uLXZtYSwgLS1hZGp1c3Qtd2FybmluZ3MsIC0tbm8tYWRqdXN0LXdhcm5pbmdzLAotCS0tc2V0LXN0YXJ0LgotCShwYXJzZV92bWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkoY29weV9vYmplY3QpOiBIYW5kbGUgLS1zZXQtc3RhcnQgYW5kIC0tYWRqdXN0LXN0YXJ0LgotCShzZXR1cF9zZWN0aW9uKTogQ29ycmVjdCB0eXBlIG9mIGxhc3QgYXJndW1lbnQgdG8gUFRSLiAgU2V0IHVzZWQKLQlmaWVsZCBpZiBzZWN0aW9uIGlzIHJlbW92ZWQuICBIYW5kbGUgLS1hZGp1c3Qtdm1hIGFuZAotCS0tYWRqdXN0LXNlY3Rpb24tdm1hLgotCShjb3B5X3NlY3Rpb24pOiBDb3JyZWN0IHR5cGUgb2YgbGFzdCBhcmd1bWVudCB0byBQVFIuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4pOiBDbGVhciB1c2VkIGZpZWxkIHdoZW4gaGFuZGxpbmcgLVIuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQkqIGJpbnV0aWxzLnRleGkgKG9iamNvcHkpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQkqIG9iamNvcHkuMTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLUZyaSBPY3QgMTQgMTQ6Mzg6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBSZW1vdmUgZGVmaW5pdGlvbi0tdGVzdHN1aXRlIGlzIG5vCi0JbG9uZ2VyIGNvbmZpZ3VyZWQuCi0JKiBNYWtlZmlsZS5pbiAodGVzdHN1aXRlKTogUmVtb3ZlIHRhcmdldC4KLQkoc2l0ZS5leHApOiBOZXcgdGFyZ2V0LgotCShjaGVjayk6IFJld3JpdGUuCi0JKGNsZWFuLCBkaXN0Y2xlYW4pOiBEb24ndCByZWN1ciBpbnRvIHRlc3RzdWl0ZSBkaXJlY3RvcnkuCi0KLVRodSBPY3QgMTMgMTk6MjQ6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNS4KLQkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgotCi1UdWUgT2N0IDExIDE1OjI2OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHN5c2R1bXAubyk6IERlcGVuZHMgdXBvbiBzeXNyb2ZmLmMuCi0KLU1vbiBPY3QgMTAgMTM6NTA6MzAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGxpbmtfaW5wdXRzKTogUGFzcyAtVXIgZmxhZyB0byBsZCBzbyB0aGF0IHRoZQotCSAgY3Rvci9kdG9yIHRhYmxlcyBuZWVkZWQgYnkgQysrIHByb2dyYW1zIGFyZSBidWlsdC4KLQotU3VuIE9jdCAgOSAxODowNDowMCAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzcmNvbnYubyk6IEFkZCBkZXBlbmRlbmNlIG9uIHN5c3JvZmYuYy4KLQotVHVlIE9jdCAgNCAxMjoxOTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgY29uZmlnLmJmZC4KLQotCSogTWFrZWZpbGUuaW4gKHN5c3JvZmYuaCk6IFNwbGl0IHRhcmdldCBhd2F5IGZyb20gc3lzcm9mZi5jLgotCShzcmNvbnYubywgc3lzZHVtcC5vKTogTmV3IHRhcmdldHMuCi0JKHNyY29udiwgc3lzZHVtcCk6IERvbid0IGRlcGVuZCB1cG9uIHN5c3JvZmYuYy4KLQotV2VkIFNlcCAyOCAxMzowNDozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcnBhcnNlLmMpOiBEb24ndCBpZ25vcmUgZXJyb3JzIGZyb20gbXYuCi0JKHN5c2luZm8uYyk6IExpa2V3aXNlLiAgQWxzbywgZGVwZW5kIHVwb24gYXJwYXJzZS5jLCB0byBwcmV2ZW50IGEKLQlwYXJhbGxlbCBtYWtlIGZyb20gdHJ5aW5nIHRvIGJ1aWxkIGJvdGggYXJwYXJzZS5jIGFuZCBzeXNpbmZvLmMKLQlzaW11bHRhbmVvdXNseS4KLQkobmxtaGVhZGVyLmMpOiBTaW1pbGFyIGNoYW5nZS4KLQkoYXJwYXJzZS5oKTogU2VwYXJhdGUgdGFyZ2V0IGZyb20gYXJwYXJzZS5jLCBzbyB0aGF0IGEgcGFyYWxsZWwKLQltYWtlIGRvZXMgbm90IHRyeSB0byBidWlsZCBib3RoIGF0IG9uY2UuICBEZXBlbmQgdXBvbiBhcnBhcnNlLmMuCi0JKHN5c2luZm8uaCk6IFNpbWlsYXIgY2hhbmdlLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBQYXNzIHRoZSByZWxvYyBidWZmZXIgdG8gZnJlZSwgbm90Ci0JdGhlIHBvaW50ZXIgdXNlZCB0byBsb29wIG92ZXIgdGhlIHJlbG9jcy4KLQotU2F0IFNlcCAyNCAxNjoxNjo1NyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IENhc3QgcmVzdWx0IG9mIHhtYWxsb2MuCi0KLVdlZCBTZXAgMjEgMTk6MzA6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHNvcnRlZF9zeW1zLCBzb3J0ZWRfc3ltY291bnQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIHNvcnRlZF9zeW1zIGFuZCBzb3J0ZWRfc3ltY291bnQKLQlpbnN0ZWFkIG9mIHN5bXMgYW5kIHN5bWNvdW50LgotCShkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgYm90aGVyIHRvIGdldCB0aGUgcmVsb2NzIGJlZm9yZSBsb29waW5nCi0Jb3ZlciB0aGUgc2VjdGlvbnMuICBCZWZvcmUgZmlsdGVyaW5nIGFuZCBzb3J0aW5nIHRoZSBzeW1ib2wgdGFibGUsCi0JY29weSBpdCBpbnRvIHNvcnRlZF9zeW1zLgotCi1GcmkgU2VwIDE2IDExOjI3OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyk6IEFkZCBmaWVsZCByZXF1aXJlX3NlYy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSWYgYXV4LT5yZXF1aXJlX3NlYywgcmVxdWlyZSB0aGF0IHRoZQotCXN5bWJvbCBiZSBpbiBhdXgtPnNlYyBldmVuIGlmIEhBU19SRUxPQyBpcyBub3Qgc2V0LiAgSWYgd2UgY2FuJ3QKLQlmaW5kIGEgc21hbGxlciBzeW1ib2wgaW4gdGhlIHJpZ2h0IHNlY3Rpb24sIGxvb2sgZm9yIGEgbGFyZ2VyIG9uZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBhdXgucmVxdWlyZV9zZWMgYXJvdW5kIHRoZQotCW9iamR1bXBfcHJpbnRfYWRkcmVzcyBjYWxsIGZvciB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KLQotVGh1IFNlcCAxNSAyMTo0MzoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmM6IENhbGwgeGV4aXQgcmF0aGVyIHRoYW4gZXhpdC4KLQkob3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfZmlsZSwgb3V0cHV0X2JmZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShyZW1vdmVfb3V0cHV0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgeGF0ZXhpdCAocmVtb3ZlX291dHB1dCkuICBDYWxsIHhleGl0IHJhdGhlciB0aGFuCi0JcmV0dXJuaW5nLgotCShleHRyYWN0X2ZpbGUpOiBTZXQgb3V0cHV0X2ZpbGVuYW1lIGFuZCBvdXRwdXRfZmlsZSB3aGlsZSBvdXRwdXQKLQlmaWxlIGlzIG9wZW4uCi0JKHdyaXRlX2FyY2hpdmUpOiBMaWtld2lzZSwgYnV0IHVzZSBvdXRwdXRfYmZkLCBub3Qgb3V0cHV0X2ZpbGUuCi0JKiBhcnN1cC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLiAgQ2FsbCB4ZXhpdCByYXRoZXIgdGhhbiBleGl0LgotCSogYnVjb21tLmM6IExpa2V3aXNlLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2FsbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1kaXNhc3NlbWJsZS1hbGwuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCBkaXNhc3NlbWJsZS1hbGwgYXMgYSBzeW5vbnltIGZvciAtRC4KLQkoY29tcGFyZV9zeW1ib2xzKTogTWFrZSBwb2ludGVycyBjb25zdC4KLQkoY29tcGFyZV9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkaXNhc3NlbWJsZV9kYXRhKTogUmVuYW1lIGRpc2Fzc2VtYmxlIHRvIGRpc2Fzc2VtYmxlX2ZuIHRvIGF2b2lkCi0Jc2hhZG93aW5nLiAgSWYgZHVtcF9yZWxvY19pbmZvLCBwcmludCByZWxvY3MgYWxvbmcgd2l0aAotCWRpc2Fzc2VtYmx5LiAgU2tpcCBzZWN0aW9ucyB3aGljaCBhcmUgbm90IFNFQ19DT0RFIHVubGVzcwotCWRpc2Fzc2VtYmxlX2FsbCBvciBvbmx5IGlzIHNldC4KLQkoZGlzcGxheV9iZmQpOiBEb24ndCBjYWxsIGR1bXBfcmVsb2NzIGlmIGRpc2Fzc2VtYmxlIGlzIHNldC4KLQkobWFpbik6IEFjY2VwdCBhbmQgaGFuZGxlIC1ELgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgLUQvLS1kaXNhc3NlbWJsZS1hbGwuCi0JKiBvYmpkdW1wLjE6IExpa2V3aXNlLgotCi1XZWQgU2VwIDE0IDEyOjE5OjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSW5pdGlhbGl6ZSBwcmV2bGluZSB0byAwLiAgTWFrZQotCXByZXZfZnVuY3Rpb24gbm9uIGNvbnN0LiAgQ29weSBmdW5jdGlvbm5hbWUgaW50byBhbiBtYWxsb2MgYnVmZmVyCi0Jd2hlbiBzZXR0aW5nIHByZXZfZnVuY3Rpb24sIGluc3RlYWQgb2YgYXNzdW1pbmcgdGhhdCB0aGUgc3RyaW5nCi0Jd2lsbCBsYXN0IGZvcmV2ZXIuCi0KLQkqIG5tLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHNvcnRfYnlfc2l6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXNpemUtc29ydC4KLQkodXNhZ2UpOiBNZW50aW9uIC0tc2l6ZS1zb3J0LgotCShudW1lcmljX2ZvcndhcmQpOiBNYWtlIHN0YXRpYy4gIENoYW5nZSBmcm9tIHZvaWQgKiB0byBQVFIuCi0JKG51bWVyaWNfcmV2ZXJzZSk6IExpa2V3aXNlLgotCShub25fbnVtZXJpY19mb3J3YXJkLCBub25fbnVtZXJpY19yZXZlcnNlKTogTGlrZXdpc2UuCi0JKHNvcnRlcnMpOiBDaGFuZ2UgZGVjbGFyYXRpb24gZnJvbSB2b2lkICogdG8gUFRSLgotCShzaXplX2ZvcndhcmQsIHNvcnRfc3ltYm9sX2J5X3NpemUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoZGlzcGxheV9yZWxfZmlsZSk6IEhhbmRsZSBzb3J0X2J5X3NpemUuCi0JKGZpbHRlcl9zeW1ib2xzKTogSWYgc29ydF9ieV9zaXplLCBkaXNjYXJkIGFic29sdXRlIGFuZCB1bmRlZmluZWQKLQlzeW1ib2xzLgotCSogYmludXRpbHMudGV4aSAobm0pOiBEb2N1bWVudCAtLXNpemUtc29ydC4KLQkqIG5tLjE6IERvY3VtZW50IC0tc2l6ZS1zb3J0LgotCi1UdWUgU2VwIDEzIDIxOjA2OjA2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfbWFpbik6IEluaXRpYWxpemUgaW5wdXRfZmlsZW5hbWUgYW5kCi0Jb3V0cHV0X2ZpbGVuYW1lIHRvIE5VTEwuCi0KLVR1ZSBTZXAgMTMgMTQ6MTc6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodmVyc2lvbi5vKTogRGVwZW5kIHVwb24gTWFrZWZpbGUsIHNvIHRoYXQgdmVyc2lvbi5vCi0JZ2V0cyByZWJ1aWx0IHdoZW4gbWFrZSB2YXJpYWJsZSBWRVJTSU9OIGlzIGNoYW5nZWQuCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IFByaW50IHRoZSBTRUNfTkVWRVJfTE9BRCBmbGFnLgotCi1XZWQgQXVnIDI0IDEyOjQwOjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQotVHVlIEF1ZyAyMyAxMTowMDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHJhbmxpYl90b3VjaCk6IERvbid0IHVwZGF0ZSB0aGUgYXJjaGl2ZSBtYXAgaWYgdGhlcmUgaXNuJ3QKLQlvbmUuCi0KLU1vbiBBdWcgMjIgMTY6MDI6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhci5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShpbmFyY2gpOiBSZW1vdmUgdmFyaWFibGUuCi0JKG1hcF9vdmVyX21lbWJlcnMpOiBNYWtlIHN0YXRpYy4gIEFkZCBhcmNoIGFyZ3VtZW50LCBhbmQgdXNlIGl0Ci0JaW5zdGVhZCBvZiBpbmFyY2guICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG1haW4pOiBUcmVhdCAtLXZlcnNpb24gYXMgLXYuICBBY2NlcHQgLXQgYXJndW1lbnQuICBBY2NlcHQgYW55Ci0JbnVtYmVyIG9mIGFyY2hpdmUgYXJndW1lbnRzLiAgQ2F0Y2ggYW5kIHVzZSBvcGVuX2luYXJjaCByZXR1cm4KLQl2YWx1ZSwgcmF0aGVyIHRoYW4gdXNpbmcgaW5hcmNoLgotCShvcGVuX2luYXJjaCk6IFJldHVybiBuZXdseSBvcGVuZWQgQkZELCByYXRoZXIgdGhhbiB1c2luZyBpbmFyY2guCi0JKGRvX3F1aWNrX2FwcGVuZCk6IE1ha2UgYXJjaGl2ZV9maWxlbmFtZSBjb25zdC4KLQkod3JpdGVfYXJjaGl2ZSk6IEFkZCBpYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGluYXJjaC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGRlbGV0ZV9tZW1iZXJzLCBtb3ZlX21lbWJlcnMsIHJlcGxhY2VfbWVtYmVycyk6IExpa2V3aXNlLgotCShyYW5saWJfb25seSk6IERvbid0IGV4aXQgb24gc3VjY2Vzcy4gIENhdGNoIGFuZCB1c2Ugb3Blbl9pbmFyY2gKLQlyZXR1cm4gdmFsdWUuCi0JKHJhbmxpYl90b3VjaCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFyc3VwLmggKG1hcF9vdmVyX21lbWJlcnMpOiBEb24ndCBkZWNsYXJlLgotCShhcl9lbmQsIGFyX2V4dHJhY3QpOiBEZWNsYXJlLgotCShvcGVuX2luYXJjaCk6IENoYW5nZSByZXR1cm4gdmFsdWUgaW4gZGVjbGFyYXRpb24gdG8gYmZkICouCi0JKiBhcnN1cC5jIChtYXBfb3Zlcl9saXN0KTogTWFrZSBzdGF0aWMuIEFsd2F5cyBwYXNzIHR3byBhcmd1bWVudHMKLQl0byBmdW5jdGlvbi4gIEFkZCBhcmNoIGFyZ3VtZW50LCBhbmQgdXNlIGl0IGluc3RlYWQgb2YgaW5hcmNoLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoYXJfZGlyZWN0b3J5X2RvZXIpOiBNYWtlIHN0YXRpYy4gIEFkZCBpZ25vcmVkIHNlY29uZCBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGFyX2RpcmVjdG9yeSk6IFVzZSBvcGVuX2luYXJjaCByZXR1cm4gdmFsdWUgcmF0aGVyIHRoYW4gaW5hcmNoLgotCShhcl9hZGRsaWJfZG9lcik6IE1ha2Ugc3RhdGljLgotCShhcl9hZGRsaWIpOiBVc2Ugb3Blbl9pbmFyY2ggcmV0dXJuIHZhbHVlIHJhdGhlciB0aGFuIGluYXJjaC4KLQkoYXJfZXh0cmFjdCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgYWJmZC4KLQotVGh1IEF1ZyAxMSAxNDo1NTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgcmVtb3ZpbmcgbmFtZWQgc2VjdGlvbnMgdG8gb2JqY29weSBhbmQgc3RyaXAuCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2xpc3QpOiBEZWZpbmUuCi0JKHJlbW92ZV9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHN0cmlwX29wdGlvbnMsIGNvcHlfb3B0aW9ucyk6IEFkZCByZW1vdmUtc2VjdGlvbi4KLQkoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBNZW50aW9uIC1SIGFuZCAtLXJlbW92ZS1zZWN0aW9uLgotCShzZXR1cF9zZWN0aW9uKTogSWYgc2VjdGlvbiBpcyBpbiByZW1vdmVfc2VjdGlvbnMgbGlzdCwgaWdub3JlIGl0LgotCShjb3B5X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc3RyaXBfbWFpbiwgY29weV9tYWluKTogSGFuZGxlIC1SLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xLCBzdHJpcC4xOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotV2VkIEF1ZyAxMCAxMDoxOTo1NSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogUmVuYW1lIHN5bXZhbHVlIHRvIHN5bV92YWx1ZSwKLQlzbyBhcyBub3QgdG8gY29uZmxpY3Qgd2l0aCB0aGUgc3ltdmFsdWUgdHlwZWRlZiBpbiBiZmQuaC4KLQotTW9uIEF1ZyAgMSAxMzoxOTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55OiBQZXIgY3VycmVudCBOZXRXYXJlIGRvY3MsIGFjY2VwdCBhIHJldmlzaW9uIG51bWJlcgotCW9mIDAgYW5kIHRyZWF0IGEgcmV2aXNpb24gbnVtYmVyIGdyZWF0ZXIgdGhhbiAyNiBhcyAwLgotCi1Nb24gSnVsIDI1IDEyOjU4OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGVuZCBvZgotCXN5bWJvbHMgd2hlbiBsb29raW5nIGZvciBuZXh0IHN5bWJvbCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLgotCi1GcmkgSnVsIDIyIDE2OjQ4OjM0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5tLmMgKG51bWVyaWNfZm9yd2FyZCk6IFRyZWF0IHVuZGVmaW5lZCBzeW1ib2xzIGFzICJsZXNzIHRoYW4iCi0JZGVmaW5lZCBzeW1ib2xzIHdpdGggemVybyB2YWx1ZXMuICBJZiBudW1lcmljIHZhbHVlcyBhcmUgZXF1YWwsIG9yCi0JYm90aCBzeW1ib2xzIGFyZSB1bmRlZmluZWQsIHNvcnQgYWxwaGFiZXRpY2FsbHkuICBEb24ndCBhc3N1bWUKLQl0aGF0IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBiZmRfdm1hIHZhbHVlcyB3aWxsIHRydW5jYXRlIHRvICJpbnQiCi0JYW5kIHN0aWxsIGhhdmUgdGhlIHNhbWUgc2lnbi4KLQkobnVtZXJpY19yZXZlcnNlKTogQ2FsbCBudW1lcmljX2ZvcndhcmQgYW5kIG5lZ2F0ZSB0aGUgcmVzdWx0LgotCShwcmludF9zeW1ib2xfaW5mb19ic2QpOiBGb3IgdW5kZWZpbmVkIHN5bWJvbHMsIHByaW50IGxlYWRpbmcKLQlzcGFjZXMgZXF1aXZhbGVudCB0byB0aGUgd2lkdGggb2YgYSBwcmludGVkIGJmZF92bWEsIHJhdGhlciB0aGFuCi0JYXNzdW1pbmcgdGhhdCA4IHdpbGwgbG9vayByaWdodC4KLQotRnJpIEp1bCAyMiAxMDozNjo1MCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5jIChkb2l0KTogIFplcm8gYWxsIGZpZWxkcyBvZiBuZXcgc3RydWN0dXJlLgotCSogc3Jjb252LmMgKHN5c3JvZmZfc3dhcF8qX291dCk6IFJlbW92ZSByZWR1bmRhbnQgdHJhaWxpbmcgYXJnLgotCSogc3lzaW5mby55OiBHZW5lcmF0ZSBzeXNyb2ZmX3N3YXBfKl9vdXQgd2l0aG91dCByZXF1aXJpbmcgZXh0cmEKLQlhcmcuCi0KLUZyaSBKdWwgMjIgMTA6MDk6NTMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueTogTWFrZSAic3RhY2siIGFuZCAic3RhY2tzaXplIiBzeW5vbnltcyBpbiB0aGUgbGV4ZXIKLQkgIHJhdGhlciB0aGFuIHRoZSBwYXJzZXIuCi0KLVRodSBKdWwgMjEgMTA6MjU6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYWxwaGFvc2YsIGNvbmZpZy9taC1hcG9sbG82OHYsIGNvbmZpZy9taC1kZWx0YTg4OgotCVJlbW92ZTsgb2Jzb2xldGUuCi0KLVNhdCBKdWwgMTYgMjI6MzQ6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHNsdXJwX2R5bmFtaWNfc3ltdGFiKTogVHJ5IHRvIGdldCB0aGUgZHluYW1pYyBzeW1ib2xzCi0JZXZlbiBpZiB0aGUgYmZkIGlzIG5vdCBtYXJrZWQgRFlOQU1JQy4gIEVMRiBleGVjdXRhYmxlcyBhcmUgbm90Ci0JbWFya2VkIERZTkFNSUMsIGJ1dCBkbyBoYXZlIGR5bmFtaWMgc3ltYm9scy4KLQotRnJpIEp1bCAxNSAwMTo0MTozNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5jIChkb193aGVyZSk6IE1ha2UgZGF0YSB3aXRoIG5vIHR5cGUgJ2ludCcuCi0JKGRvX2RlZmluZSk6ICBLZWVwIGluZm8gb24gc291cmNlIGZpbGUgb2YgYSBzeW1ib2wuCi0JKiBjb2ZmZ3Jvay5oIChjb2ZmX3N5bWJvbCk6IE5ldyBmaWVsZC4KLQkqIHNyY29udi5jIChQUk9HUkFNX1ZFUlNJT04pOiBOb3cgMS4zCi0JKHdyX3JsKTogVXNlIGV4dGVybmFsIHJlZiBudW1iZXIgZm9yIHN5bWJvbC4KLQkod3JfZHVzKTogT25seSBrZWVwIG9uZSBzb3VyY2UgZmlsZSBwZXIgZGVidWcgdW5pdC4KLQkod3JfZGxuKTogQWx3YXlzIGVtaXQgbGluZSBudW1iZXJzIGZvciBmaXJzdCBzb3VyY2UgZmlsZSwKLQkod3JfZ2xvYmFscyk6ICBFbWl0IGdsb2JhbHMgaW4gdGhlIGR1IG9mIHRoZWlyIG93bmluZyBzb3VyY2UgZmlsZS4KLQotTW9uIEp1bCAxMSAxNTo1OTowMyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55OiBOdWxsIHRlcm1pbmF0ZSB2YXJfaGRyLT50aHJlYWROYW1lLgotCi1GcmkgSnVsICA4IDE3OjMzOjIyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzeXNsZXgubywgc3lzaW5mby5vKTogUGVybWl0IEMgc291cmNlIGZpbGVzIHRvIGJlCi0JaW4gJChzcmNkaXIpLCBhcyB0aGV5IHdpbGwgYmUgZm9yIEZTRiByZWxlYXNlcy4KLQotV2VkIEp1bCAgNiAwMToxMzoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBQcmVzZXJ2ZSBleGlzdGluZyBzZWN0aW9uIGZsYWdzIHdoZW4KLQljb3B5aW5nIGluIGZsYWdzIGZyb20gYSBuZXcgc2VjdGlvbi4KLQotVHVlIEp1bCAgNSAxNTo1NjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoY29weV9maWxlKTogSWYgb3V0cHV0X3RhcmdldCBpcyBOVUxMLCBzZXQgaXQgdG8gdGhlIHRhcmdldCBvZiB0aGUKLQlpbnB1dCBmaWxlLgotCi1XZWQgSnVuIDI5IDE3OjE3OjE0IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IEZpeGVkIG1lbW9yeSBhbGxvY2F0aW9uIGJ1Zy4KLQotVGh1IEp1biAyMyAxMjo1Mjo0NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMuCi0KLVR1ZSBKdW4gMjEgMTI6NTM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3lzaW5mbyk6IERvZXMgbm90IGRlcGVuZCB1cG9uICQoQURETF9MSUJTKS4KLQotCSogbmxtY29udi5jIChwb3dlcnBjX2J1aWxkX3N0dWJzKTogRG9uJ3QgZ2VuZXJhdGUgdGhlIFBvd2VyUEMKLQlOZXRXYXJlIGN1c3RvbSBoZWFkZXI7IG5vIGxvbmdlciBuZWVkZWQuCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENvbnZlcnQgcmVsb2NzIGFnYWluc3QgdGhlIHVuaW5pdGlhbGl6ZWQKLQlkYXRhIHNlY3Rpb24gaW50byByZWxvY3MgYWdhaW5zdCB0aGUgZGF0YSBzZWN0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBubG1jb252X2RlZnMgdG8gLUROTE1DT05WX2NwdXR5cGUgZm9yIGFsbCB0aGUKLQluZXR3YXJlIHRhcmdldHMuICBXcml0ZSBpdCBpbnRvIE1ha2VmaWxlIGFzIE5MTUNPTlZfREVGUy4KLQkqIE1ha2VmaWxlLmluIChubG1jb252Lm8pOiBQYXNzICQoTkxNQ09OVl9ERUZTKSB0byAkKENDKS4KLQkqIG5sbWNvbnYuYzogT25seSBjb21waWxlIGNvZGUgZm9yIHNwZWNpZmljIENQVSB0eXBlcyBpZgotCU5MTUNPTlZfY3B1dHlwZSBpcyBkZWZpbmVkLgotCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgdXNlcyBvZiBiZmRfYWJzX3NlY3Rpb24sIGV0Yy4sIHRvIHVzZQotCWJmZF9hYnNfc2VjdGlvbl9wdHIgb3IgYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuCi0JKGkzODZfbWFuZ2xlX3JlbG9jcywgYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgotCShwb3dlcnBjX2J1aWxkX3N0dWJzKTogTGlrZXdpc2UuCi0JKiBubS5jIChmaWx0ZXJfc3ltYm9scywgcHJpbnRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChyZW1vdmVfdXNlbGVzc19zeW1ib2xzLCBkdW1wX3JlbG9jcyk6IExpa2V3aXNlLgotCSogc2l6ZS5jIChzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBMaWtld2lzZS4KLQotTW9uIEp1biAyMCAxNjo0MzowMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFOUEFHRVMpOiBSZW1vdmUgJChERU1BTkdMRVJfUFJPRykuCi0JKGluc3RhbGwpOiBJbnN0YWxsIGl0IGV4cGxpY2l0bHksIGZyb20gYnVpbGQgZGlyLCBub3Qgc3JjZGlyLgotCi1Nb24gSnVuIDIwIDE2OjI5OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBEb24ndCBpbmNsdWRlIGVsZi9pbnRlcm5hbC5oLgotCShiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IERvbid0IGRlY2xhcmUuCi0JKHJlYWRfc2VjdGlvbl9zdGFicyk6IE5vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEVMRi4gIEFsd2F5cyByZWFkCi0JdXNpbmcgQkZEIHNlY3Rpb25zLgotCi1UaHUgSnVuIDE2IDE3OjI1OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTZXQgVU5ERVJTQ09SRSBpbiBNYWtlZmlsZSBiYXNlZCBvbiByZXN1bHQgb2YKLQlpbnZva2luZyBjb25maWcuYmZkIHdpdGggYSBzZWNvbmQgYXJndW1lbnQgb2YgYGBfJycuCi0JKiBNYWtlZmlsZS5pbiAodW5kZXJzY29yZS5jKTogRGVwZW5kIHVwb24gTWFrZWZpbGUuICBEb24ndCB0cnkgdG8KLQlydW4gJChDQykgYW5kICQoTk0pLCBqdXN0IHVzZSAkKFVOREVSU0NPUkUpLiAgQ3JlYXRlIHZpYSB0ZW1wb3JhcnkKLQlmaWxlLgotCShkZW1hbmdsZS5vKTogUmVtb3ZlIHRhcmdldC4KLQkoJChOTV9QUk9HKSk6IERvbid0IGRlcGVuZCB1cG9uIGRlbWFuZ2xlLm8sIGFuZAlkb24ndCBsaW5rIGFnYWluc3QKLQlkZW1hbmdsZS5vLiAgSXQncyBpbiBsaWJpYmVydHkgYW55aG93LgotCShjcGx1cy1kZW0ubyk6IERvbid0IGRlcGVuZCB1cG9uIGRlbWFuZ2xlLm8uCi0JKiBiaW51dGlscy50ZXhpOiBNZW50aW9uIC1uIGFuZCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzIGFyZ3VtZW50cwotCXRvIGMrK2ZpbHQuCi0KLVdlZCBKdW4gMTUgMTI6MTA6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubS5jIChsb25nX29wdGlvbnMpOiBBZGQgLS1uby1kZW1hbmdsZSB0byB0dXJuIG9mZiAtLWRlbWFuZ2xlLAotCWFuZCAtLW5vLWNwbHVzIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCSh1c2FnZSk6IE1lbnRpb24gLS1uby1kZW1hbmdsZS4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC0tbm8tZGVtYW5nbGUuCi0KLUZyaSBKdW4gMTAgMTU6NDE6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubS5jOiBIT1NUXzY0X0JJVCB3YXMgcmVuYW1lZCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogTWFrZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB0aGUKLQlzYW1lIGRpcmVjdG9yeSBhcyB0aGUgb3V0cHV0IEJGRCwgc2luY2Ugd2UgbWF5IG5vdCBoYXZlIHdyaXRlCi0JcGVybWlzc2lvbiBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZQotCW5ldyBkaXJlY3RvcnkgdG8gMDcwMCwgbm90IDA3NzcuCi0KLU1vbiBKdW4gIDYgMjE6MzY6NDMgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGlmIHRoaXMgaXMgYW4gcnM2MDAwIChhbmQgd2UncmUgbm90IGJ1aWxkaW5nIGZvcgotCWFueSBvdGhlciBiZmQgdGFyZ2V0cykgdGhlbiBidWlsZCBvbmx5IG5tIChjb2xsZWN0IG5lZWRzIGl0IG9uCi0JcnM2MDAwLWx5bngpLgotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIFRPT0xfUFJPR1Mgd2hpY2ggdGhlIGxpc3Qgb2YgcHJvZ3JhbWVzIHRvCi0JaW5zdGFsbCBpbiAkdG9vbGRpciAtLSByZXBsYWNlcyBhIGhhcmQtY29kZWQgbGlzdC4KLQotRnJpIEp1biAgMyAxMDo1OToxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgb2suCi0KLVRodSBNYXkgMjYgMTg6MDU6NTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFscGhhb3NmIChDRkxBR1MpOiBEb24ndCBzcGVjaWZ5IGJvdGggLWcgYW5kIC1POwotCXRoZXkncmUgbm90IGNvbXBhdGlibGUgdW5kZXIgbmF0aXZlIGNjLiAgVXNlIC1PMSBpbnN0ZWFkLgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuNC4xLgotCi0JQ2hhbmdlcyBmcm9tIGJpbnV0aWxzLTIuNCBuZXQgcmVsZWFzZToKLQotCSogTWFrZWZpbGUuaW4gKE1BTlBBR0VTKTogVXNlICQoREVNQU5HTEVSX1BST0cpLgotCSgkKERFTUFOR0xFUl9QUk9HKS4xKTogQnVpbGQgZnJvbSBjeHhmaWx0Lm1hbiwgdXNpbmcgc2VkLgotCSogY3h4ZmlsdC5tYW46IFJlbmFtZWQgZnJvbSBjKytmaWx0LjEsIHJlcGxhY2VkICJjKytmaWx0IiB3aXRoCi0JbWFnaWMgdG9rZW4gdG8gYmUgcmVwbGFjZWQgYnkgc2VkLgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IG1ha2VmaWxlLmluCi0KLUZyaSBNYXkgMTMgMjM6MjU6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uYzogQ2hlY2sgQU5TSV9QUk9UT1RZUEVTIHJhdGhlciB0aGFuIF9fU1REQ19fLgotCi1UdWUgTWF5IDEwIDE4OjIyOjA2IDE5OTQgIEphc29uIE1vbGVuZGEgICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfc2VjdGlvbik6IFNldCBzZWN0aW9uIHNpemUgY29ycmVjdGx5IGlmIHVzaW5nCi0JaW50ZXJsZWF2ZS4KLQotU2F0IE1heSAgNyAxNjo0OTozNiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGUgZm9yIHN5c2luZm8uaAotCi1GcmkgTWF5ICA2IDEyOjE4OjMzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChTUkNPTlZfUFJPRyk6IERlZmluZS4KLQkoUFJPR1MpOiBVc2UgJChTUkNPTlZfUFJPRykgdG9vLgotCi1UaHUgTWF5ICA1IDE5OjQxOjQzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgc3lzaW5mby5jLCBzeXNsZXguYywgaW4gY2FzZQotCXNvbWVvbmUgY29uZmlndXJlcyB3aXRoIGB0YXJnZXRzPWFsbCcuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSB5LiouCi0JKHN5c2xleC5vKTogRGVwZW5kIG9uIHN5c2luZm8uaC4KLQkoc3lzaW5mby5jKTogUmVuYW1lIHkudGFiLmggdG8gc3lzaW5mby5oLgotCShpbnN0YWxsLWluZm8pOiBEb24ndCB0cnkgdG8gaW5zdGFsbCBpbnRvICQoaW5mb2RpcikvJChzcmNkaXIpLgotCSogc3lzbGV4Lmw6IEluY2x1ZGUgc3lzaW5mby5oLCBub3QgeS50YWIuaC4KLQotVGh1IE1heSAgNSAxMTo1MDo1NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogc3lzbGV4LmwgKHl5d3JhcCk6IERlZmluZSBhcyBmdW5jdGlvbiBpZiBub3QgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JKiBNYWtlZmlsZS5pbiAob2JqZHVtcC5vKTogRGVsZXRlZCBzcGVjaWFsIHJ1bGUuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciBidWlsZGluZyBBUkNIREVGUyB2YXJpYWJsZSBmb3IKLQlNYWtlZmlsZS4KLQkqIG9iamR1bXAuYyAoQVJDSF8qKTogRGVsZXRlZCBoYW5kbGluZy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENhbGwgYGRpc2Fzc2VtYmxlcicgZnJvbSBvcGNvZGVzIGxpYnJhcnkuCi0KLVRodSBNYXkgIDUgMTM6Mjg6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IENvcnJlY3QgaGFuZGxpbmcgb2YgJCh0b29sZGlyKSBhbmQKLQkkKGJpbmRpcikgYmVpbmcgb24gZGlmZmVyZW50IGRldmljZXMuCi0KLUZyaSBBcHIgMjkgMDk6NTA6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogc3lzZHVtcC5jIChoODMwMCwgc2gpOiBBZGQgZGVjbGFyYXRpb25zLgotCi1XZWQgQXByIDI3IDExOjI1OjE4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzeXNsZXgsIHN5c2luZm8pOiBVc2UgQ0NfRk9SX0JVSUxELgotCSogY29mZmR1bXAuYywgY29mZmdyb2MuYywgY29mZmdyb2cuaCwgc3Jjb252LmMsIHN5c2R1bXAuYywKLQlzeXNyb2ZmLmluZm86IE1ham9yIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMjYgMTg6MTg6MjQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHByaW50X3NlY3Rpb25fc3RhYnMpOiBJbmRpY2F0ZSB0aGUgc3RhYiBoZWFkZXIgc3ltYm9sCi0JbW9yZSBjbGVhcmx5LCBwcmludCBudW1iZXJzIG9mIHVucmVjb2duaXplZCBzdGFiIG5fdHlwZSB2YWx1ZXMuCi0KLVR1ZSBBcHIgMjYgMTY6MjI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGNvcHlfc2VjdGlvbnMpOiBDb3B5IGFyZWxlbnQgcG9pbnRlcnMsIG5vdCBhcmVsZW50cy4KLQotTW9uIEFwciAyNSAxNjoxNDozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgJChQUk9HUykgYW5kIHVuZGVyc2NvcmUuYy4KLQotRnJpIEFwciAyMiAxMToxNDoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiAucmVnaW5mbwotCXNlY3Rpb24uCi0JKGNvcHlfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IFVzZSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIHJhdGhlciB0aGFuIHRoZQotCXNwZWNpYWwgRUNPRkYgLnJlZ2luZm8gc2VjdGlvbi4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IENhbGwgYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhZnRlcgotCWNvcHlpbmcgZXZlcnl0aGluZyBlbHNlLCB0byBsZXQgaXQgZmlkZGxlIHdpdGggdGhlIGZpbGUgaW4gaXRzCi0JZmluYWwgc3RhdGUuCi0KLQkqIG9iamR1bXAuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCk6IElmIGEgZm9ybWF0IGZhaWxzLCBqdXN0IGdvIG9uIHRvIHRoZSBuZXh0Ci0Jb25lLiAgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZXRfZm9ybWF0LgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBMaWtld2lzZS4gIERvbid0IGluY3JlbWVudCBsb29wIHZhcmlhYmxlIGluCi0JZm9yIGxvb3AgdGVzdCwgc2luY2UgdGhhdCBza2lwcyB0aGUgZmlyc3QgZWxlbWVudC4KLQkoZGlzcGxheV90YXJnZXRfdGFibGVzKTogUmV3cml0ZSBsb29wIGZvciBjbGFyaXR5LiAgRW5zdXJlIHRoYXQgaXQKLQlhbHdheXMgcHJpbnRzIGF0IGxlYXN0IG9uZSBlbGVtZW50LgotCi0JKiBubG1jb252LmMgKG1haW4pOiBVc2UgQ3lHblVzRXggcmF0aGVyIHRoYW4gQ3lHblVzU2VDcyBmb3IKLQlzZWN0aW9ucyBoZWFkZXIuICBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbnMgdG8gY3lnbnVzX2V4dC4KLQotVGh1IEFwciAyMSAxMjoxMjoyNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoX0RVTU1ZX05BTUVfKTogRG9uJ3QgZGVmaW5lLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIHRtcG5hbSB0byBnZXQgYSBmaWxlIG5hbWUgcmF0aGVyIHRoYW4KLQl1c2luZyBfRFVNTVlfTkFNRV8uICBVbmxpbmsgaXQgd2hlbiBkb25lLgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBMaWtld2lzZS4KLQotCSogbmxtY29udi5jIChzZWNzZWMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtYWluKTogQ3JlYXRlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIGluIG91dHB1dCBCRkQuICBTdG9yZQotCWluZm9ybWF0aW9uIGFib3V0IGl0IGluIHNlY3Rpb25zIGhlYWRlci4KLQkoc2V0dXBfc2VjdGlvbnMpOiBBbGxvY2F0ZSBzcGFjZSBpbiBzZWN0aW9ucyBoZWFkZXIuCi0JKGNvcHlfc2VjdGlvbnMpOiBDb3B5IHplcm8gc2l6ZWQgc2VjdGlvbnMuICBQdXQgaW5mb3JtYXRpb24gYWJvdXQKLQllYWNoIHNlY3Rpb24gaW4gdGhlIHNlY3Rpb25zIGhlYWRlci4KLQotV2VkIEFwciAyMCAxNDozNDo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IFRha2UgbmV3IG91dGJmZCBhcmd1bWVudC4KLQlDaGFuZ2UgY2FsbGVyLiAgQ3JlYXRlIGN1c3RvbSBoZWFkZXIgZm9yIG5ldyBQb3dlclBDIE5ldFdhcmUKLQlmb3JtYXQuCi0KLQkqIE1ha2VmaWxlLmluIChubG1oZWFkZXIubywgbmxtY29udi5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIG5sbWNvbnYuYzogSW5jbHVkZSBiZmQuaCBhbmQgbGliaWJlcnR5Lmggd2l0aCAiIiwgbm90IDw+LgotCSogbmxtaGVhZGVyLnk6IEluY2x1ZGUgYmZkLmggd2l0aCAiIiwgbm90IDw+LgotCi1XZWQgQXByIDEzIDEwOjUyOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBEbyBhbiBpZmRlZiBvbiBfX0dPMzJfXywgbm90IHVuaXguCi0KLVdlZCBBcHIgIDYgMjE6NTQ6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkZWQgLUQgKC0tZHluYW1pYykgb3B0aW9uIHRvIG5tIGFuZCAtVCAoLS1keW5hbWljLXN5bXMpIGFuZCAtUgotCSgtLWR5bmFtaWMtcmVsb2MpIGFyZ3VtZW50cyB0byBvYmpkdW1wLgotCSogbm0uYyAoZHluYW1pYyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZGVkICJkeW5hbWljIi4KLQkodXNhZ2UpOiBNZW50aW9uIC1EIGFuZCAtLWR5bmFtaWMuCi0JKG1haW4pOiBBZGQgRCB0byBnZXRvcHQgc3RyaW5nLiAgSGFuZGxlIC1EIGJ5IHNldHRpbmcgZHluYW1pYy4KLQkoZGlzcGxheV9yZWxfZmlsZSk6IElmIGR5bmFtaWMgaXMgbm9uLXplcm8sIHJlYWQgZHluYW1pYyBzeW1ib2xzCi0JcmF0aGVyIHRoYW4gbm9ybWFsIHN5bWJvbHMuCi0JKiBubS4xOiBVcGRhdGVkIGZvciAtRCAoLS1keW5hbWljKSBvcHRpb24uCi0JKiBvYmpkdW1wLmMgKGR1bXBfZHluYW1pY19zeW10YWIpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGR5bnN5bXMsIGR5bnN5bWNvdW50KTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKHVzYWdlKTogTWVudGlvbiAtUiwgLVQsIC0tZHluYW1pYy1zeW1zIGFuZCAtLWR5bmFtaWMtcmVsb2MuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZGVkICJkeW5hbWljLXJlbG9jIiBhbmQgImR5bmFtaWMtc3ltcyIuCi0JKHNsdXJwX3N5bXRhYik6IElmIG5vIHN5bWJvbHMsIHJldHVybiByYXRoZXIgdGhhbiBleGl0LgotCShzbHVycF9keW5hbWljX3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9iZmQpOiBIYW5kbGUgZHVtcF9keW5hbWljX3N5bXRhYiBhbmQKLQlkdW1wX2R5bmFtaWNfcmVsb2NfaW5mby4KLQkoZHVtcF9zeW1ib2xzKTogVGFrZSBuZXcgZHluYW1pYyBhcmd1bWVudCwgaW5kaWNhdGluZyB3aGV0aGVyIHRvCi0JZGlzcGxheSBkeW5hbWljIHN5bWJvbHMuCi0JKGR1bXBfcmVsb2NzKTogTW92ZSBtb3N0IHByaW50aW5nIGludG8gZHVtcF9yZWxvY19zZXQuCi0JKGR1bXBfZHluYW1pY19yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGR1bXBfcmVsb2Nfc2V0KTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbSBkdW1wX3JlbG9jcy4KLQkobWFpbik6IEFkZCBSIGFuZCBUIHRvIGdldG9wdCBzdHJpbmcuICBIYW5kbGUgLVQgYnkgc2V0dGluZwotCWR1bXBfZHluYW1pY19zeW10YWIgYW5kIC1SIGJ5IHNldHRpbmcgZHVtcF9keW5hbWljX3JlbG9jX2luZm8uCi0JKiBvYmpkdW1wLjE6IFVwZGF0ZWQgZm9yIC1SICgtLWR5bmFtaWMtcmVsb2MpIGFuZCAtVAotCSgtLWR5bmFtaWMtc3ltcykgb3B0aW9ucy4KLQkqIGJpbnV0aWxzLnRleGk6IFVwZGF0ZWQgZm9yIG5ldyBubSBhbmQgb2JqZHVtcCBvcHRpb25zLgotCi1XZWQgTWFyIDMwIDE1OjUyOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVVwZGF0ZSBmb3IgcmVjZW50IEJGRCBjaGFuZ2VzIHRvIHN5bWJvbCBhbmQgcmVsb2MgcmVhZGluZy4gIFJlbmFtZQotCWFsbCB1c2VzIG9mIGdldF9zeW10YWJfdXBwZXJfYm91bmQgdG8gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQuCi0JQWxzbzoKLQkqIGNvZmZncm9rLmMgKHN5bWNvdW50KTogQ2hhbmdlIHRvIGxvbmcuCi0JKGRvX3NlY3Rpb25zX3AxKTogQ2hlY2sgZm9yIGVycm9yIHJldHVybiBmcm9tCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZC4gIENoYW5nZSByZWxjb3VudCB0byBsb25nLCBhbmQgY2hlY2sgZm9yCi0JZXJyb3IgZnJvbSBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShjb2ZmX2dyb2spOiBDaGFuZ2Ugc3RvcmFnZSB0byBsb25nLiAgQ2hlY2sgZm9yIGVycm9yIGZyb20KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2Ugc3ltY291bnQsIG5ld3N5bWFsbG9jLCBuZXdzeW1jb3VudCwgYW5kCi0JaSB0byBsb25nLiAgQ2hlY2sgZm9yIGVycm9yIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKGNvcHlfc2VjdGlvbnMpOiBDaGFuZ2UgcmVsb2Nfc2l6ZSBhbmQgcmVsb2NfY291bnQgdG8gbG9uZy4gIENoZWNrCi0JZm9yIGVycm9yIGZyb20gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShtYW5nbGVfcmVsb2NzLCBpMzg2X21hbmdsZV9yZWxvY3MsIGFscGhhX21hbmdsZV9yZWxvY3MpOiBDaGFuZ2UKLQlyZWxvY19jb3VudF9wdHIgYXJndW1lbnQgdG8gbG9uZyAqLiAgTWFrZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8KLQl2YXJpYWJsZXMgbG9hZGVkIGZyb20gKnJlbG9jX2NvdW50X3B0ci4KLQkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBDaGFuZ2Ugc3RvcmFnZSBhbmQgc3ltY291bnQgdG8gbG9uZy4KLQlDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogQ2hhbmdlIHN5bWNvdW50LCBzcmNfY291bnQgYW5kCi0JZHN0X2NvdW50IHRvIGxvbmcuCi0JKGNvcHlfb2JqZWN0KTogQ2hhbmdlIHN5bWNvdW50IHRvIGxvbmcuICBQYXNzIGFub3RoZXIgYXJndW1lbnQgdG8KLQlmcHJpbnRmLiAgQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCShjb3B5X3NlY3Rpb24pOiBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogQ2hhbmdlIHJlbGNvdW50IGFuZCBpIHRvIGxvbmcuCi0JQ2hlY2sgZm9yIGVycm9ycyBmb3JtIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkqIG9iamR1bXAuYyAoc3RvcmFnZSk6IFJlbW92ZSBnbG9iYWwgdmFyaWFibGUuCi0JKHN5bWNvdW50KTogQ2hhbmdlZCB0byBsb25nLgotCShzbHVycF9zeW10YWIpOiBOZXcgbG9jYWwgdmFyaWFibGUgc3RvcmFnZS4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6IENoYW5nZSByZXR1cm4gdmFsdWUgYW5kIGNvdW50IHRvIGxvbmcuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IENoYW5nZSBtaW4sIG1heCwgdGhpc3BsYWNlIGFuZCBpIHRvIGxvbmcuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDaGFuZ2UgaSB0byBsb25nLgotCShkdW1wX3N5bWJvbHMpOiBDaGFuZ2UgY291bnQgdG8gbG9uZy4KLQkoZHVtcF9yZWxvY3MpOiBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9yZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKGRpc3BsYXlfaW5mb190YWJsZSk6IEFkZCBjYXN0cyB3aGVuIHBhc3NpbmcgTE9OR0VTVF9BUkNIIGZvcgotCXByaW50ZiAlKiBhcmd1bWVudC4KLQotVHVlIE1hciAyOSAxNDo1OTowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5tLmMgKGRpc3BsYXlfYXJjaGl2ZSk6IENsb3NlIGVhY2ggYXJjaGl2ZSBlbGVtZW50IGFmdGVyIGl0IGhhcwotCWJlZW4gZGlzcGxheWVkLgotCSogb2JqZHVtcC5jIChkaXNwbGF5X2ZpbGUpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyOCAxMzowNDowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgdG8gcmVmZXIgdG8gYmZkL2NvbmZpZy5iZmQKLQlyYXRoZXIgdGhhbiBiZmQvY29uZmlndXJlLmluLgotCi1TdW4gTWFyIDI3IDE2OjIzOjM5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNb3JlIGZpeGVzIGZvciBvYmplY3QgZm9ybWF0cyB3aGljaCBhbGxvdyBtdWx0aXBsZSBzZWN0aW9ucwotCXdpdGggdGhlIHNhbWUgbmFtZToKLQkqIG9iamNvcHkuYyAoc2V0dXBfc2VjdGlvbik6IE1ha2UgYSBuZXcgb3V0cHV0IHNlY3Rpb24gZXZlbiBpZgotCW9uZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCShjb3B5X3NlY3Rpb24pOiBVc2UgaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uIHJhdGhlciB0aGFuIHRyeWluZwotCXRvIGxvb2sgdGhlIG91dHB1dCBzZWN0aW9uIHVwIGJ5IGl0cyAocG9zc2libHkgbm9uLXVuaXF1ZSkgbmFtZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IExvb2sgZm9yIGJpbnV0aWxzLmluZm8gaW4gdGhlCi0JY3VycmVudCBkaXJlY3RvcnksIHRoZW4gaW4gJChzcmNkaXIpLiAgRG9uJ3QgdXNlICQ8LgotCi1Nb24gTWFyIDIxIDEyOjU1OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUgd2l0aAotCXByb3RvdHlwZS4gIENoYW5nZSB2YXJkaWZmIGZyb20gaW50IHRvIGJmZF9zaWduZWRfdm1hLiAgQ29ycmVjdAotCWJpbmFyeSBzZWFyY2ggdGVybWluYXRpb24gY29uZGl0aW9uLiAgV2hlbiBsb29raW5nIGZvciBzYW1lCi0Jc2VjdGlvbiBzeW1ib2wgaW4gcmVsb2NhdGFibGUgZmlsZSwgaGFuZGxlIGZpbmFsIHN5bWJvbCBjb3JyZWN0bHkuCi0KLVN1biBNYXIgMjAgMTE6MjY6MzYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiBBdm9pZCBidWcgaW4gaHB1eCBzZWQuCi0KLQkqIG9iamNvcHkuYzogQ2hhbmdlcyB0byBrZWVwIGl0IGZyb20gc3RyaXBwaW5nIHN5bWJvbHMgdXNlZAotCWluIG91dHB1dCByZWxvY2F0aW9ucy4KLQkobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBNYXJrIHN5bWJvbHMKLQl1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyB3aXRoIEJTRl9LRUVQLgotCShmaWx0ZXJfc3ltYm9scyk6IERvIG5vdCBzdHJpcCBzeW1ib2xzIG1hcmtlZCB3aXRoIEJTRl9LRUVQLgotCShjb3B5X29iamVjdCk6IFJlb3JkZXIgYWN0aW9ucy4gIEZpcnN0IHNldHVwIHNlY3Rpb25zLCB0aGVuCi0JYnVpbGQgdGhlIG91dHB1dCBzeW1ib2wgdGFibGUsIHRoZW4gY29weSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQotRnJpIE1hciAxOCAxMDo1Mzo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG51bGwgYnl0ZS4gIEZyb20KLQlSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgotCi1UaHUgTWFyIDE3IDE2OjIwOjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEJ1aWx0IG5tLm5ldyBhbmQgc3RyaXAubmV3IHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKLQljb2xsZWN0IHdoZW4gLiBpcyBpbiBQQVRILgotCShTVFJJUF9QUk9HKTogQ2hhbmdlIGZyb20gc3RyaXAgdG8gc3RyaXAubmV3LgotCShOTV9QUk9HKTogQ2hhbmdlIGZyb20gbm0gdG8gbm0ubmV3LgotCShpbnN0YWxsKTogUmVtb3ZlIHRoZSAubmV3IHdoZW4gaW5zdGFsbGluZy4KLQotV2VkIE1hciAxNiAxNjoyNzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IFNldCBCU0ZfRFlOQU1JQyBmbGFnIGZvciBlYWNoCi0Jc3ltYm9sIGZvciB3aGljaCB3ZSBidWlsZCBhIHN0dWIuCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IE9ubHkgcmVzZXQgVE9DIHBvaW50ZXIgZm9yIGEgY2FsbCB0byBhCi0Jc3ltYm9sIHdpdGggQlNGX0RZTkFNSUMgZmxhZyBzZXQuCi0KLVR1ZSBNYXIgMTUgMjM6MDQ6MTMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsIHRvIGRldGVybWluZQotCWlmIGEgc3ltYm9sIHJlcHJlc2VudHMgYSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgbGFiZWwuCi0JKGNvcHlfb2JqZWN0KTogR2l2ZSB0aGUgQkZEIGJhY2tlbmRzIGEgY2hhbmNlIHRvIGNvcHkgYW55IHByaXZhdGUKLQliZmQgZGF0YSBmcm9tIHRoZSBpbnB1dCBCRkQgdG8gdGhlIG91dHB1dCBCRkQuCi0JKHNldHVwX3NlY3Rpb24pOiBHaXZlIHRoZSBCRkQgYmFja2VuZHMgYSBjaGFuY2UgdG8gY29weSBhbnkgcHJpdmF0ZQotCXNlY3Rpb24gZGF0YSBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4KLQotTW9uIE1hciAxNCAxMToxNTo1OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqY29weS5jIChtYW5nbGVfc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKHNldHVwX3NlY3Rpb24pOiBTZXQgb3NlY3Rpb24gaGVyZSBpbnN0ZWFkIG9mIGNhbGxpbmcKLQltYW5nbGUgc2VjdGlvbiB0byBkbyBpdC4KLQotTW9uIE1hciAxNCAxMjoxMTowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUpOiBDbG9zZSBpbmFyY2ggYmVmb3JlIHVubGlua2luZyBpdC4KLQotRnJpIE1hciAxMSAyMjoyMDo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvciBQb3dlclBDLCBjYWxsIHBvd2VycGNfYnVpbGRfc3R1YnMgYW5kCi0JcG93ZXJwY19yZXNvbHZlX3N0dWJzLiAgVXNlIF9fR09UMCwgbm90IF9fdG9jX3N0YXJ0LiAgSGFuZGxlIGl0IGlmCi0JdGhlIHN0YXJ0IGFuZCBlbmQgc3ltYm9scyBhcmUgbm90IGluIHRoZSB0ZXh0IHNlY3Rpb24uCi0JKHN0cnVjdCBwb3dlcnBjX3N0dWIpOiBOZXcgc3RydWN0IGRlZmluaXRpb24uCi0JKHBvd2VycGNfc3R1YnMsIHBvd2VycGNfc3R1Yl9pbnNucyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShwb3dlcnBjX2luaXRpYWxfZ290X3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwb3dlcnBjX2J1aWxkX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShwb3dlcnBjX3Jlc29sdmVfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENsZWFyIGV4dHJhbmVvdXMgZGF0YSBpbiAuZ290IHNlY3Rpb24uCi0JUmVhcnJhbmdlIHJlbG9jIGhhbmRsaW5nIHRvIGhhbmRsZSBFTEYgcmVsb2NzIHRoYXQgYXJlIG5vdAotCXBhcnRpYWxfaW5wbGFjZS4gIFJlc29sdmUgUEMgcmVsYXRpdmUgcmVsb2NzLgotCi1XZWQgTWFyICA5IDEzOjQ4OjExIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1vdmVfbWVtYmVycyk6IEZpeCBpdCBzbyB0aGF0IHRoZSBhYmkgcG9zaXRpb25hbCBtb2RpZmllcnMKLQlkb24ndCBkZWxldGUgYWxsIGFyY2hpdmUgbWVtYmVycyBmb2xsb3dpbmcgdGhlIGluc2VydCBwb2ludC4KLQotVHVlIE1hciAgOCAxMzoxNDo0MyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5bY2hdOiBOZXcgZmlsZXMsIHVuZGVyc3RhbmQgY29mZiBvYmplY3RzLgotCSogY29mZmR1bXAuYzogVXNlcyBjb2ZmZ3JvayB0byBkdW1wIG91dCB0aGUgZGVidWcgaW5mbyBvZiBhIGNvZmYKLQlmaWxlLgotCSogc3lzcm9mZi5pbmZvOiBEZXNjcmlwdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGUuCi0JKiBzeXNpbmZvLnksIHN5c2xleC5sOiBQYXJzZSBpbmZvIGZpbGUsIGdlbmVyYXRlIGEgcmVhZGVyLCB3cml0ZXIsCi0JaGVhZGVyIGZpbGVzIGFuZCBhIHByaW50ZXIuCi0JKiBzcmNvbnYuYzogVXNlcyBjb2ZmZ3Jvay5jIGFuZCBzeXNyb2ZmLmluZm8gdG8gY29udmVydCBhIGNvZmYKLQlmaWxlIHRvIGEgU1lTUk9GRiBmaWxlLgotCi1TYXQgRmViIDI2IDEzOjM1OjI2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAoZG9fcXVpY2tfYXBwZW5kKTogUGFkIHdpdGggYSBnZW51aW5lIGNoYXJhY3RlciAxMCwKLQlyYXRoZXIgdGhhbiB3aGF0ZXZlciAnXG4nIG1pZ2h0IGhhcHBlbiB0byBiZS4KLQotVHVlIEZlYiAyMiAxODoyNTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IElnbm9yZSBkZWJ1Z2dpbmcgc3ltYm9scyB3aGVuIGxvb2tpbmcgZm9yCi0Jc3BlY2lhbCBzeW1ib2xzIGJ5IG5hbWUuCi0KLVN1biBGZWIgMjAgMTg6NDc6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotCVN1cHBvcnQgZm9yIFBvd2VyUEMgTmV0V2FyZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvciBQb3dlclBDIE5ldFdhcmUsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHRoZQotCXNwZWNpYWwgc3ltYm9scyBfX3RvY19zdGFydC4KLQkoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBIYW5kbGUgYmZkX2FyY2hfcG93ZXJwYy4KLQkobWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBGZWIgMTcgMDk6Mjg6MjMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jLCBidWNvbW0uYywgbmxtY29udi5jLCBubS5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYywKLQlzaXplLmM6IFVzZSBiZmRfZ2V0X2Vycm9yIGFuZCBiZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCi0KLUZyaSBGZWIgMTEgMTU6NTQ6NTEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IEFkZCBtaXNzaW5nICdicmVhaycgaW4gc3dpdGNoLgotCi1Nb24gRmViICA3IDE5OjQ1OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIGJmZF9hcmNoX3Bvd2VycGMuCi0KLVN1biBGZWIgIDYgMjI6MDg6MjAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLmMgb2JqZHVtcC5jIG5sbWNvbnYuYyBvYmpjb3B5LmMgbm0uYyBhci5jIHNpemUuYyAobWFpbik6Ci0JQ2FsbCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUuCi0KLUZyaSBGZWIgIDQgMTA6NDY6MDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9ieXRlcyk6IE1ha2UgTUVNSFVOSyBhIGNoYXIgKiwgbm90IFBUUiwgc28gd2UKLQljYW4gZG8gYXJpdGhtZXRpYyBvbiBpdC4KLQotVGh1IEZlYiAgMyAxNDowNjo0MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzLCByZWFkX3NlY3Rpb25fc3RhYnMsCi0JcHJpbnRfc2VjdGlvbl9zdGFicyk6IEZ1bmN0aW9ucyBicm9rZW4gb3V0IG9mIGR1bXBfc3RhYnNfMS4KLQlGcmVlIHRoZSBzdGFicyBhbmQgc3RyaW5ncyB3aGVuIGRvbmUgd2l0aCB0aGVtLgotCi1XZWQgRmViICAyIDEzOjQyOjIzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogVXNlIGJmZF9nZXRfZmxhdm91ciBpbnN0ZWFkIG9mIHN0cnVjdCBtZW1iZXIuCi0JKiBhci5jIChwcmludF9jb250ZW50cywgZXh0cmFjdF9maWxlKSwgc2l6ZS5jCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCwgcHJpbnRfc3lzdl9mb3JtYXQpOiBVc2UgYmZkX2dldF9maWxlbmFtZSBhbmQKLQliZmRfbXlfYXJjaGl2ZSBpbnN0ZWFkIG9mIGRlcmVmZXJlbmNpbmcgdGhlIHN0cnVjdHMgZGlyZWN0bHkuCi0KLQkqIGFyLmM6IFVzZSBiZmRfZmF0YWwgYW5kIGJmZF9ub25mYXRhbCBpbnN0ZWFkIG9mIGJmZF9wZXJyb3IgYW5kIGV4aXQuCi0JSW5kZW50LiAgUmVtb3ZlIERFRlVOcy4KLQotCSogbmxtY29udi5jIChtYWluKSwgb2JqY29weS5jIChjb3B5X2ZpbGUpOiBQcmludCBtYXRjaGluZyBmb3JtYXRzCi0JaWYgYW1iaWd1b3VzIG1hdGNoLgotCSogbm0uYyAoZGlzcGxheV9maWxlLCBkaXNwbGF5X2FyY2hpdmUpLCBzaXplLmMgKGRpc3BsYXlfYmZkKToKLQlFbGltaW5hdGUgZ290b3MuCi0JUHJpbnQgbWF0Y2hpbmcgZm9ybWF0cyBpZiB0aGVyZSBpcyBhbiBhbWJpZ3VvdXMgbWF0Y2guICBVc2UKLQliZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBoYXJkY29kZWQgZXJyb3IgbWVzc2FnZSBpZiBub3RoaW5nIG1hdGNoZXMuCi0KLQkqIGFyc3VwLmMsIGFyLmMsIG9iamR1bXAuYzogVXNlIGJmZF9nZXRfZmlsZW5hbWUgaW5zdGVhZCBvZgotCWFiZmQtPmZpbGVuYW1lLgotCi0JKiBubS5jIChkaXNwbGF5X2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24sIGZyb20gY29kZSBpbiBkaXNwbGF5X2ZpbGUuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBSZW5hbWVkIGZyb20gZG9fb25lX3JlbF9maWxlLgotCi0JKiBzaXplLmM6IEluZGVudC4KLQkoZGlzcGxheV9hcmNoaXZlKTogTmV3IGZ1bmN0aW9uIGZyb20gY29kZSBpbiBkaXNwbGF5X2ZpbGUuCi0JKGRpc3BsYXlfZmlsZSk6IENoZWNrIGJmZF9jbG9zZSBlcnJvciByZXR1cm4uCi0KLQkqIHN0cmluZ3MuYyAoc3RyaW5nc19vYmplY3RfZmlsZSk6IENoZWNrIGJmZF9jaGVja19mb3JtYXQKLQllcnJvciByZXR1cm4uCi0KLQkqIHN0cmluZ3MuYywgb2JqZHVtcC5jLCBzaXplLmM6IFVzZSBiZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBiZmRfcGVycm9yLgotCi0JKiBidWNvbW0uYzogRGVsZXRlIHJlZmVyZW5jZXMgdG8gZXhpdF9oYW5kbGVyLiAgSXQgd2Fzbid0IHNldAotCWFueXdoZXJlLCBhbmQgbm93IHRoYXQgd2UncmUgdXNpbmcgdGhlIGxpYmliZXJ0eSB4bWFsbG9jLCBpdAotCXdvdWxkbid0IGFsd2F5cyBnZXQgY2FsbGVkIGJlZm9yZSBleGl0aW5nLgotCShsaXN0X21hdGNoaW5nX2Zvcm1hdHMpOiBGdW5jdGlvbiBtb3ZlZCBmcm9tIG9iamR1bXAuYy4KLQkqIGJ1Y29tbS5oOiBEZWNsYXJlIGl0LgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBNb3ZlIHNvbWUgdmFyaWFibGUgZGVjbHMgY2xvc2VyIHRvCi0JdGhlaXIgdXNlLiAgQWRkIHNvbWUgY29tbWVudHMuICBSZXBsYWNlIGEgbmVzdGVkIGJsb2NrIHdpdGggYQotCXJldHVybi4KLQotTW9uIEphbiAzMSAxODo1MDo0MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCwgZGlzcGxheV9pbmZvX3RhYmxlKTogQ2hlY2sgdGhhdAotCXRoZSBiZmQgb2YgdGhlIGR1bW15IG91dHB1dCBmaWxlIGlzIG5vdCBudWxsLgotCi1XZWQgSmFuIDI2IDEzOjEzOjE4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNvcHlfc2VjdGlvbik6IENhbGwgaXQuCi0JKGNvcHlfb3B0aW9ucywgY29weV91c2FnZSwgY29weV9tYWluKTogQWRkIC0tYnl0ZSBvcHRpb24gdG8KLQlhY3RpdmF0ZSBpdC4gIEFwcHJvcHJpYXRlIHRoZSAtYiBvcHRpb24gKHdoaWNoIHdhcyBhbiB1bmRvY3VtZW50ZWQKLQlzeW5vbnltIGZvciAtRikgZm9yIGl0LCBhbHNvLiAgQWRkIC0taW50ZXJsZWF2ZSwgLWkgb3B0aW9uIGZvcgotCWFkZGl0aW9uYWwgY29udHJvbC4KLQkoc2V0dXBfc2VjdGlvbiwgY29weV9zZWN0aW9uLCBtYW5nbGVfc2VjdGlvbik6IFJlbmFtZWQgd2l0aCBubyBgcycKLQlvbiB0aGUgZW5kLgotCSogb2JqY29weS4xLCBiaW51dGlscy50ZXhpOiBEb2N1bWVudCB0aGUgbmV3IG9wdGlvbnMuCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfdGFibGVzLCBkaXNwbGF5X3RhcmdldF9saXN0KToKLQlOZXcgZnVuY3Rpb25zIGJyb2tlbiBvdXQgb2YgZGlzcGxheV9pbmZvLgotCUVsaW1pbmF0ZSBzb21lIG1hZ2ljIGNvbnN0YW50cy4gIFVzZSBtb3JlIG1lYW5pbmdmdWwgdmFyaWFibGUgbmFtZXMuCi0JKGR1bXBfYmZkX2hlYWRlcik6IE5ldyBmdW5jdGlvbiBicm9rZW4gb3V0IG9mIGRpc3BsYXlfYmZkLgotCShkdW1wX3NlY3Rpb25faGVhZGVyKTogTmV3IGZ1bmN0aW9uIGJyb2tlbiBvdXQgb2YgZHVtcF9oZWFkZXJzLgotCShyZW1vdmVfdXNlbGVzc19zeW1ib2xzKTogRG9uJ3Qgc2hhZG93IGdsb2JhbCB2YXJpYWJsZSBuYW1lIHdpdGgKLQlwYXJhbWV0ZXIuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IEZpeCBiYWNrd2FyZCB0ZXN0LgotCi1UdWUgSmFuIDI1IDE5OjQwOjU0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogQ2hhbmdlIGRlY2wgb2YgYHdoZW4nIHRvIHRpbWVfdC4KLQkqIG9iamR1bXAuaDogUmVtb3ZlZC4KLQotTW9uIEphbiAyNCAxMzoyOTowMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9maWxlKTogUmVtb3ZlIGNhbGwgdG8gbGlzdF9tYXRjaGluZ19mb3JtYXRzLgotCUl0IHdvdWxkIG5ldmVyIGJlIGNhbGxlZC4KLQkobGlzdF9tYXRjaGluZ19mb3JtYXRzKTogVGFrZSBhbiBhcmcgZ2l2aW5nIHRoZSBsaXN0IG9mIG1hdGNoaW5nCi0JZm9ybWF0cy4KLQkoZGlzcGxheV9iZmQpOiBQYXNzIHRoZSBhcmcsIGFuZCBnZXQgaXQgZmlsbGVkIGluIGJ5IGNhbGxpbmcKLQliZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgaW5zdGVhZCBvZiBiZmRfY2hlY2tfZm9ybWF0LgotCShkaXNwbGF5X2luZm8sIGRpc3BsYXlfaW5mb190YWJsZSk6IHRhcmdldF92ZWN0b3Igd2FzIHJlbmFtZWQgdG8KLQliZmRfdGFyZ2V0X3ZlY3Rvci4KLQotCSogYmludXRpbHMudGV4aSAob2JqZHVtcCk6IE5vdGUgc29tZSBsaW1pdGF0aW9ucyBvZiAtaCBzZWN0aW9uCi0JYWRkcmVzcyBwcmludGluZy4KLQotU2F0IEphbiAyMiAxNjoyMDo0NiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUxMT0MpOiBTZXQgdG8gZW1wdGluZXNzIGJ5IGRlZmF1bHQuCi0JKEFMTF9DRkxBR1MpOiBBZGQgYW5kIHVzZS4KLQkoYXJwYXJzZS5oKTogTWFrZSBpdCBkZXBlbmQgb24gYXJwYXJzZS55LgotCSogYXIuYyAobGliYmZkLmgpOiBEb24ndCByZXF1aXJlIHRvIGJlIGluIC4uL2JmZC4KLQkqIG9iamR1bXAuYyAoY29tcCk6IFJlbmFtZSB0byBjb21wYXJlX3N5bWJvbHMuCi0KLUZyaSBKYW4gMjEgMjA6MjI6MzAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyk6IElmIHRoZSBmaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMsCi0JcHJpbnQgdGhlIG1hdGNoaW5nIG5hbWVzIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugb25lLgotCShkaXNwbGF5X2JmZCk6IENhbGwgaXQuCi0JKGRpc3BsYXlfZmlsZSk6IENhbGwgaXQuCi0KLUZyaSBKYW4gMjEgMTk6MTc6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTdXBwb3J0IGJmZF9hcmNoX3JzNjAwMC4KLQotTW9uIEphbiAxNyAxMzo1NzoyNSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc3RhYl9uYW1lKTogQWxsb2NhdGUgZHluYW1pY2FsbHkuCi0JKHN0YWJfcHJpbnQpOiBVc2UgcG9pbnRlcnMgdG8gc3RyaW5ncyBpbnN0ZWFkIG9mIGNoYXIgYXJyYXlzLgotCShkdW1wX3N0YWJzKTogQ2hhbmdlIGFsbG9jIGFuZCBpbml0IG9mIGFycmF5cyBhcHByb3ByaWF0ZWx5LgotCShkdW1wX3N0YWJzXzEpOiBBbHdheXMgZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQgc3RhYl9uYW1lIG9yCi0JdGhlIHN0YWIncyB0eXBlIG51bWJlciwgaWYgdW5uYW1lZC4KLQotRnJpIEphbiAxNCAxNDo0Mjo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbiwgY29weV9tYWluKTogRG9uJ3QgY2xvYmJlciB0aGUgaW5wdXQgZmlsZQotCWlmIGNvcHlfZmlsZSBmYWlscy4KLQotCSogbmxtY29udi5jIChtYWluKTogV2FybiBhYm91dCBhbiBhdHRlbXB0IHRvIHVzZSBhIHNoYXJlZCBsaWJyYXJ5Ci0Jd2l0aCB1bmluaXRpYWxpemVkIGRhdGEuCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBNYWtlIHN1cmUgdGhhdCB3ZSBhbGlnbiB0aGUKLQlvdXRwdXRfb2Zmc2V0IG9mIGVhY2ggaW5wdXQgc2VjdGlvbiBhcHByb3ByaWF0ZWx5LgotCi1UaHUgSmFuIDEzIDE3OjMyOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX3JlbG9jcyk6IERvbid0IGNyYXNoIGlmIHNlY3Rpb24gbmFtZSBpcyBOVUxMLgotCi1UdWUgSmFuIDExIDE5OjQ2OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZmlsZW1vZGUuYyAoZmlsZW1vZGVzdHJpbmcpOiBDb21tZW50ZWQgb3V0OyBub3QgdXNlZC4KLQkobW9kZV9zdHJpbmcpOiBVc2UgUE9TSVggZGVmaW5pdGlvbnMuCi0JKGZ0eXBlbGV0KTogTGlrZXdpc2UuCi0JKHJ3eCk6IFJlbW92ZWQ7IG5vIGxvbmdlciB1c2VkLgotCSogYnVjb21tLmM6IEluY2x1ZGUgYnVjb21tLmguCi0JKGJmZF9ub25mYXRhbCwgYmZkX2ZhdGFsKTogQXJndW1lbnQgaXMgY29uc3QuCi0JKGZhdGFsKTogTWFrZSBfX1NURENfXyB2ZXJzaW9uLgotCSogYnVjb21tLmggKG1vZGVfc3RyaW5nKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluIChidWNvbW0ubyk6IERlcGVuZCB1cG9uIGJ1Y29tbS5oCi0KLVN1biBKYW4gIDkgMTI6MDM6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBEZWxldGVkLgotCSogYnVjb21tLmggKHhtYWxsb2MsIHhyZWFsbG9jKTogRml4IHByb3RvdHlwZXMsIHRvIGNvcnJlc3BvbmQgdG8KLQlsaWJpYmVydHkgdmVyc2lvbiBvZiBmdW5jdGlvbnMuCi0KLVRodSBKYW4gIDYgMDY6MTg6MTUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpOiBBZGQgYSBjaGFwdGVyIHN1bW1hcml6aW5nIHRoZSB3YXlzIHRvIHNlbGVjdAotCWFzcGVjdHMgb2YgdGhlIHRhcmdldCBmb3IgZWFjaCBwcm9ncmFtLgotCi0JKiBvYmpkdW1wLmMgKGxvbmdfb3B0aW9ucywgdXNhZ2UpOiBBZGQgbG9uZyBlcXVpdmFsZW50cyBmb3IgYWxsCi0JcmVtYWluaW5nIHNob3J0IG9wdGlvbnMgdGhhdCBsYWNrZWQgdGhlbS4KLQkqIGJpbnV0aWxzLnRleGkgb2JqZHVtcC4xOiBEb2N1bWVudCB0aGVtLgotCi0JKiBzaXplLmMgKHVzYWdlKTogVHdlYWsgdXNhZ2UgbWVzc2FnZS4KLQkqIHNpemUuMTogQWRkIG1pc3NpbmcgYD0nIGluIGV4YW1wbGVzLgotCi0JKiBiaW51dGlscy50ZXhpIHN0cmlwLjEgb2JqY29weS4xIG5sbWNvbnYuMSBvYmpjb3B5LmMgbmxtY29udi5jOgotCVVzZSAiLS10YXJnZXQ9YmZkbmFtZSIgYXMgdGhlIG9wdGlvbiB0byBzZWxlY3QgdGhlIEJGRCB0YXJnZXQsCi0JbGlrZSBubSBhbmQgc2l6ZSBhbHJlYWR5IGRvLgotCVJlc2VydmUgIi0tZm9ybWF0PWZvcm1hdCIgZm9yIHRleHR1YWwgb3V0cHV0IHNlbGVjdGlvbiBvcHRpb25zLCBidXQKLQlmb3Igbm93IGtlZXAgb2xkIG9wdGlvbiBuYW1lcyBhcyBvYnNvbGV0ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQotCSogc3RyaW5ncy5jIChtYWluLCBzdHJpbmdzX29iamVjdF9maWxlLCB1c2FnZSk6IEFkZCAtLXRhcmdldCBvcHRpb24uCi0JKiBiaW51dGlscy50ZXhpIHN0cmluZ3MuMTogRG9jdW1lbnQgaXQuCi0KLVNhdCBKYW4gIDEgMTM6NTg6MjQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYWluKTogQWRkIFxuIGluIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBEZWMgMjMgMTI6MjM6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBhci5jIChtYWluKTogUHV0IHBhcmVucyBhcm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlLgotCSogb2JqY29weS5jIChzdHJpcF9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBSZXR1cm4gMC4KLQkoY29weV9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBSZXR1cm4gMC4KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9iZmQpOiBEZWNsYXJlIHJldHVybiB2YWx1ZSBhcyB2b2lkLgotCShzdGFiX3ByaW50KTogVXNlICIiIGluc3RlYWQgb2YgMCB0byBpbml0aWFsaXplIGFycmF5LgotCShkdW1wX3N0YWJzXzEpOiBQcmludCB2bWEgdXNpbmcgcHJpbnRmX3ZtYS4KLQkoZGlzcGxheV9pbmZvKTogUHV0IHBhcmVucyBhcm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlLgotCSogc3RyaW5ncy5jIChwcmludF9zdHJpbmdzKTogQ2FzdCBwcmludGYgYXJndW1lbnRzLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfbWFpbik6IFVzZSBjb3B5X29wdGlvbnMsIG5vdCBzdHJpcF9vcHRpb25zLgotCi0JKiBubG1oZWFkZXIueSAoY29tbWFuZCk6IFdhcm4gYWJvdXQgaWxsZWdhbCBkYXRlIHZhbHVlcy4KLQotV2VkIERlYyAxNSAxMToxODowMyAxOTkzICBEYXZpZCBKLiBNYWNLZW56aWUgIChkam1AZnJvc3R5LmVuZy51bWQuZWR1KQotCi0JKiBidWNvbW0uYyBidWNvbW0uaDogUnVuIHRocm91Z2ggaW5kZW50LiAgRGUtYW5zaWRlY2wtaWZ5LgotCShiZmRfbm9uZmF0YWwpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9mYXRhbCk6IENhbGwgaXQuCi0KLQkqIG9iamNvcHkuYyAoc21hcnRfcmVuYW1lKTogRG8gYSBjb3B5IGlmIHRoZSBkZXN0IGZpbGUgaGFzCi0JbXVsdGlwbGUgaGFyZCBsaW5rcy4gIFJlbW92ZSBzb3VyY2UgZmlsZSBvbiBzdWNjZXNzZnVsIGNvcHkuCi0JVHJ5IHRvIHByZXNlcnZlIG1vZGUgYW5kIG93bmVyIG9uIHN1Y2Nlc3NmdWwgcmVuYW1lLgotCi0JKiBvYmpjb3B5LmM6IFJ1biB0aHJvdWdoIGluZGVudC4gIENsZWFuIHVwIGEgYml0LgotCU1ha2UgZ2xvYmFsIHZhcmlhYmxlcyBzdGF0aWMuCi0JTWFrZSB7aW5wdXQsb3V0cHV0fV97dGFyZ2V0LGZpbGVuYW1lfSwgc2hvd192ZXJzaW9uIGxvY2FsCi0JdG8gdmFyaW91cyBmdW5jdGlvbnMuCi0JTmV3IGdsb2JhbCB2YXJpYWJsZSBgc3RhdHVzJyBmb3IgZXhpdCBzdGF0dXMuCi0JKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IE5ldyBmdW5jdGlvbnMgd2l0aCBjb2RlIGZyb20gbWFpbi4KLQkobm9uZmF0YWwpOiBOZXcgbWFjcm8uICBVc2UgaXQgZ2xvYmFsbHkgaW5zdGVhZCBvZiBiZmRfcGVycm9yIGFuZAotCWJmZF9mYXRhbC4KLQotCShjb3B5X29iamVjdCk6IENhbGwgbWFuZ2xlX3NlY3Rpb25zIHdpdGggYmZkX21hcF9vdmVyX3NlY3Rpb25zLgotCShtYW5nbGVfc2VjdGlvbnMpOiBBZGp1c3QgZm9yIG5ldyBjYWxsaW5nIGNvbnZlbnRpb24uCi0KLUZyaSBEZWMgMTAgMTE6Mjg6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueSAoY29tbWFuZCk6IEFjY2VwdCBNQVAgYW5kIEZVTExNQVAgd2l0aG91dCBhcmd1bWVudHMuCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSBmb3IgTUFQIGFuZCBGVUxMTUFQLgotCi1UaHUgRGVjICA5IDE3OjQ3OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogV2FybiBhYm91dCBpbXBvcnRlZCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBpbgotCXRoZSBJTVBPUlQgbGlzdCBldmVuIGlmIHRoZSBJTVBPUlQga2V5d29yZCBpcyBub3QgdXNlZC4KLQotCSogbmxtY29udi5jIChkZWJ1ZywgdW5saW5rX29uX2V4aXQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkZWJ1ZyIgYW5kICJsaW5rZXIiLgotCShtYWluKTogSGFuZGxlIC1kIGFuZCAtbCBhcmd1bWVudHMuICBNYWtlIGNvbW1hbmQgbGluZSBpbnB1dCBhbmQKLQlvdXRwdXQgZmlsZXMgb3B0aW9uYWwuICBQYXJzZSB0aGUgY29tbWFuZCBmaWxlIGJlZm9yZSBvcGVuaW5nIHRoZQotCUJGRCdzLCB3aGljaCByZXF1aXJlcyBzdG9yaW5nIG1vcmUgaW5mb3JtYXRpb24gaW4gbG9jYWwgdmFyaWFibGVzLgotCUlmIElOUFVUIG5hbWVzIG11bHRpcGxlIGZpbGVzLCBsaW5rIHRoZW0gdG9nZXRoZXIuICBVc2UgT1VUUFVUIGZvcgotCXRoZSBvdXRwdXQgZmlsZSBuYW1lIGlmIG5vdCBuYW1lZCBvbiBjb21tYW5kIGxpbmUuCi0JKHNob3dfdXNhZ2UpOiBDaGFuZ2VkIGZvciBuZXcgb3B0aW9ucy4KLQkobGlua19pbnB1dHMpOiBOZXcgZnVuY3Rpb24gdG8gYXV0b21hdGljYWxseSBpbnZva2UgbGlua2VyIHRvCi0JaGFuZGxlIG11bHRpcGxlIElOUFVUIGZpbGVzLgotCShjaG9vc2VfdGVtcF9iYXNlX3RyeSwgY2hvb3NlX3RlbXBfYmFzZSwgcGV4ZWN1dGUpOiBOZXcgZnVuY3Rpb25zLAotCW1vc3RseSBjb3BpZWQgZnJvbSBnY2MvZ2NjLmMuCi0JKiBubG1jb252LmggKGlucHV0X2ZpbGVzLCBvdXRwdXRfZmlsZSk6IERlY2xhcmUuCi0JKiBubG1oZWFkZXIueSAoaW5wdXRfZmlsZXMsIG91dHB1dF9maWxlKTogRGVmaW5lLgotCShjb21tYW5kKTogU3VwcG9ydCBJTlBVVCB3aXRoIGEgc3RyaW5nX2xpc3QgYXJndW1lbnQuICBTdXBwb3J0Ci0JT1VUUFVULgotCShzdHJpbmdfbGlzdCk6IFJlbmFtZWQgZnJvbSBtb2R1bGVfbGlzdC4KLQkqIE1ha2VmaWxlLmluIChubG1jb252Lm8pOiBEZWZpbmUgTERfTkFNRSBiYXNlZCBvbgotCXByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLVdlZCBEZWMgIDggMTA6MDk6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueSAobmxtaGVhZGVyX2lkZW50aWZ5KTogTmV3IGZ1bmN0aW9uLiAgVXNlIGl0IHRvIHByaW50Ci0JdGhlIHByb2dyYW0gbmFtZSBqdXN0IG9uY2UsIGluc3RlYWQgb2Ygd2l0aCBldmVyeSBlcnJvciBtZXNzYWdlLgotCi1Nb24gRGVjICA2IDE2OjExOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChsb25nX29wdGlvbnMpOiBDaGFuZ2VkIC0taGVhZGVyLWluZm8gdG8gLS1oZWFkZXItZmlsZQotCXRvIG1hdGNoIGRvY3VtZW50YXRpb24gYW5kIHVzYWdlIG1lc3NhZ2UuCi0KLVN1biBEZWMgIDUgMDE6MzE6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY3MpOiBBdm9pZCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBzeW1fcHRyX3B0cgotCWluIGEgcmVsb2NhdGlvbi4KLQotVGh1IERlYyAgMiAxNjowMDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IENoYW5nZSB2YXJpb3VzIHR5cGVzIGZyb20gYmZkX3NpemVfdHlwZSB0bwotCXNpemVfdCwgc2luY2UgdGhleSBoYXZlIHRvIGJlIGFyZ3VtZW50cyB0byBmcmVhZCBhbmQgZndyaXRlLgotCUNoYW5nZSBzZXQgZnJvbSBjaGFyICogdG8gdW5zaWduZWQgY2hhciAqLgotCShzZWxlY3Rfb3V0cHV0X2Zvcm1hdCk6IE1ha2UgbWFjaCBhcmd1bWVudCB1bnNpZ25lZC4gIEhhbmRsZQotCWJmZF9hcmNoX2FscGhhLgotCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGNvcHkgdGhlIC5yZWdpbmZvIHNlY3Rpb24gb2YgYW4gRUNPRkYKLQlmaWxlLiAgQ2FsbCBiZmRfc2V0X3JlbG9jIHRvIGluaXRpYWxpemUgdGhlIHJlbG9jYXRpb24gZmllbGRzLgotCShjb3B5X3NlY3Rpb25zKTogRG9uJ3QgY29weSB0aGUgLnJlZ2luZm8gc2VjdGlvbiBvZiBhbiBFQ09GRiBmaWxlLgotCUNvbWJpbmUgYWxsIHJlbG9jcyBmb3IgYSBzZWN0aW9uLgotCShtYW5nbGVfcmVsb2NzKTogQ2hhbmdlIHR5cGUgb2YgcmVsb2NzIHRvIHBlcm1pdCBzcGVjaWZpYwotCWZ1bmN0aW9ucyB0byBjaGFuZ2UgaXQuICBDYWxsIGFscGhhX21hbmdsZV9yZWxvY3MgZm9yIGFscGhhLAotCWRlZmF1bHRfbWFuZ2xlX3JlbG9jcyBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcy4KLQkoZGVmYXVsdF9tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLiAgQWRqdXN0IHRoZSBhZGRyZXNzIG9mIGFsbAotCXJlbG9jcyBieSB0aGUgb3V0cHV0X29mZnNldC4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogQ2hhbmdlIHR5cGUgb2YgcmVsb2NzIGFyZ3VtZW50LiAgQ2FzdCBsZW5ndGgKLQlhcmd1bWVudCB0byBtZW1tb3ZlIHRvIHNpemVfdC4KLQkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE5vdiAxNyAxNzozODo1OCAxOTkzICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChzZWxlY3Rfb3V0cHV0X2Zvcm1hdCk6IFVzZSBubG0zMi1zcGFyYyBmb3IKLQliZmRfYXJjaF9zcGFyYy4KLQotV2VkIE5vdiAxNyAxNDo0MTozNSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIG5sbWNvbnYuMTogICBhZGRlZCBtYW4gcGFnZQotCSogb2JqY29weS4xOiAgIGZpeGVkIGZvcm1hdCBlcnJvcnMKLQotV2VkIE5vdiAxNyAxMjowMzo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVc2UgQ0ZMQUdTIGFzIHdlbGwgYXMgTERGTEFHUyB3aGVuIGxpbmtpbmcuCi0KLVdlZCBOb3YgMTcgMDQ6NTA6NTUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLjE6IEZpeCB0eXBvLgotCi1Nb24gTm92IDE1IDEyOjAzOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEJ1aWxkICJpbmZvIi4KLQkoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuMy4xOyAyLjMgaGFzIGdvbmUgb3V0LgotCi1TdW4gTm92IDE0IDAwOjI3OjI0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc3RhYnMpOiBIYW5kbGUgc3RhYnMtaW4tc29tIGFzIGltcGxlbWVudGVkCi0JYnkgdGhlIG5ldyBCRkQgU09NIGFzc2VtYmxlci4KLQotU2F0IE5vdiAxMyAwNzoxNDowNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyLjEgYysrZmlsdC4xIG5tLjEgb2JqY29weS4xIG9iamR1bXAuMSByYW5saWIuMSBzaXplLjEKLQlzdHJpbmdzLjEgc3RyaXAuMTogUmVwbGFjZSBcKGVtIGluIE5BTUUgc2VjdGlvbiB3aXRoIFwtIHNvCi0JbWFrZXdoYXRpcyBjYW4gZ3JvayBpdC4KLQotVHVlIE5vdiAgOSAxNToyMjoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoaTM4Nl9tYW5nbGVfcmVsb2NzKTogQWRqdXN0IHJlbG9jIGFkZHJlc3MgYnkKLQlzZWN0aW9uIG91dHB1dF9vZmZzZXQuCi0KLUZyaSBOb3YgIDUgMTI6MTE6NTIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6ICBhZGRlZCBubG1jb252IGNoYXB0ZXIKLQotV2VkIE5vdiAgMyAxNjoxMDo1MCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVdlZCBOb3YgIDMgMTU6MDk6MjMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCBnZXQgcmlkIG9mIGR2aSBvciBpbmZvIGZpbGVzLgotCi1UdWUgTm92ICAyIDEzOjI5OjU5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChTX0lTTE5LKTogRGVmaW5lIGFzIDAgaWYgdGhlcmUncyBubyBTX0lGTE5LLgotCi1GcmkgT2N0IDI5IDE2OjAyOjM0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogTW92ZSBvYmpjb3B5IGRvY3MgaW50byBhbHBoYWJldGljYWwgb3JkZXIuCi0KLQkqIG9iamR1bXAuYzogVXNlIHhtYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuCi0KLUZyaSBPY3QgMjkgMTE6MTE6MTQgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGluZm8pOiBSZW5hbWUgdG8gZm9ybWF0c19pbmZvLgotCShkdW1wX3N0YWJzXzEpOiBCZXR0ZXIgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcuCi0KLVRodSBPY3QgMjggMTk6NDM6MTYgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYWluKTogQWx3YXlzIGNyZWF0ZSB0aGUgYXJjaGl2ZSB3aGVuIHF1aWNrIGFwcGVuZGluZywKLQlldmVuIGlmIG5vIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBnaXZlbi4KLQotV2VkIE9jdCAyNyAxMjowMzowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFNldCBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldCBhbmQKLQlzaGFyZWREZWJ1Z1JlY29yZENvdW50IGZpZWxkcyBpbiBleHRlbmRlZCBoZWFkZXIuCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvcmNlIG1vZHVsZU5hbWUgZmllbGQgdG8gdXBwZXIgY2FzZS4KLQotTW9uIE9jdCAyNSAxNjo0NTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAobWFpbik6IEdpdmUgYSB1c2FnZSBtZXNzYWdlIGlmIHRoZXJlIGFyZSB0b28gbWFueQotCWFyZ3VtZW50cy4KLQotTW9uIE9jdCAyNSAxMDozNzowOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFJld3JpdGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgVlBBVEgsCi0Jc28gRlNGIGRpc3RyaWJ1dGlvbnMgKHdpdGggaW5mbyBmaWxlcyBpbiAkKHNyY2RpcikpIGluc3RhbGwKLQlwcm9wZXJseS4KLQkoRElTVFNUVUZGKTogQnVpbGQgbmxtaGVhZGVyLmMgdG9vLgotCi1GcmkgT2N0IDIyIDExOjQzOjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBhci5jIChwcm9ncmFtX25hbWUpOiBEb24ndCBkZWZpbmUgaGVyZS4KLQkqIG9iamR1bXAuYzogSW5jbHVkZSAiYnVjb21tLmgiLgotCSh4bWFsbG9jKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgotCShwcm9ncmFtX25hbWUpOiBEb24ndCBkZWZpbmUgaGVyZS4KLQkocHJvZ3JhbV92ZXJzaW9uKTogRml4ZWQgdHlwZSBpbiBkZWNsYXJhdGlvbi4KLQkqIHNpemUuYzogSW5jbHVkZSAiYnVjb21tLmgiLgotCShwcm9ncmFtX25hbWUpOiBEb24ndCBkZWNsYXJlIGhlcmUuCi0KLUZyaSBPY3QgMjIgMTQ6MTA6NDEgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogaGlkZSBkZWNsYXJhdGlvbiBpbiBGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQKLQotRnJpIE9jdCAgMSAxMjo0MzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoaTM4Nl9tYW5nbGVfcmVsb2NzKTogUmVzb2x2ZSBhbmQgcmVtb3ZlIFBDIHJlbGF0aXZlCi0JcmVsb2NzIGFnYWluc3QgZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBzYW1lIHNlY3Rpb24uCi0KLVRodSBTZXAgMzAgMTY6NDY6MjYgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGJpbnV0aWxzLmR2aSk6IHVzZSBURVhJRElSIHRvIGZpbmQgdGV4aW5mby50ZXgKLQotU2F0IFNlcCAyNSAxODowOToyOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSk6IE5ldyBmdW5jdGlvbnMuCi0JKG1haW4pOiBVc2UgdGhlbS4KLQotRnJpIFNlcCAyNCAxNTozODoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVjdXJzZSBpbnRvIHRlc3RzdWl0ZS4KLQotVGh1IFNlcCAyMyAwMTowNTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc2V0dXBfc2VjdGlvbnMsIGNvcHlfc2VjdGlvbnMpOiBJZiBzdHJpcHBpbmcsIGRvbid0Ci0JY29weSBTRUNfREVCVUdHSU5HIHNlY3Rpb25zLgotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMpOiBQcmludCBTRUNfREVCVUdHSU5HIGZsYWcuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBNZW50aW9uIC0tc3RhYnMuCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBDb3B5IGFsbCBhcHBsaWNhYmxlIGZpbGUgZmxhZ3MuCi0JKGNvcHlfZmlsZSk6IERvbid0IGNvcHkgRVhFQ19QIHNwZWNpYWxseSBoZXJlLgotCi1Nb24gU2VwIDIwIDE5OjI4OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogQWRqdXN0IGRhdGEgc2VjdGlvbiBzaXplIHRvIGNvcnJlc3BvbmQgdG8gYnNzCi0JYWxpZ25tZW50IGFkanVzdG1lbnQuICBDbGVhciBCU0ZfU0VDVElPTl9TWU0gaWYgc3ltYm9sIGlzIG1vdmVkIHRvCi0JYSBkaWZmZXJlbnQgc2VjdGlvbi4gIFVzZSB0aW1lX3QgZm9yIHRpbWUgdmFyaWFibGUuCi0JKHNldHVwX3NlY3Rpb25zKTogT25seSBwdXQgc2VjdGlvbnMgd2l0aCBjb250ZW50cyBpbiBvdXRwdXQgTkxNLgotCShpMzg2X21hbmdsZV9yZWxvY3MpOiBObyBzeW1ib2xzIGFyZSBjb21tb24gYXQgdGhpcyBwb2ludC4gIEFkZAotCWNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1GcmkgU2VwIDEwIDExOjAwOjQwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBNYWRlIHRoZSAtLXN0YWJzIG9wdGlvbiB3b3JrIGZvciBzdGFicy1pbi1jb2ZmLgotCShFTEZfU1RBQl9ESVNQTEFZKTogUmVtb3ZlZC4KLQkoZHVtcF9lbGZfc3RhYnMpOiBSZW5hbWVkIHRvIGR1bXBfc3RhYnMsIGNoYW5nZWQgdG8gcnVuIGZvcgotCWFueSBvYmplY3QgZmlsZSBmb3JtYXQuCi0JKGR1bXBfZWxmX3N0YWJzXzEpOiBSZW5hbWVkIHRvIGR1bXBfc3RhYnNfMSwgYWRkZWQgY2FsbHMgdG8KLQlnZW5lcmljIEJGRCByb3V0aW5lcyBmb3Igbm9uLUVMRiBjYXNlLCBjaGFuZ2VkIGZvcm1hdCBvZiBtZXNzYWdlCi0JZm9yIG5vLXNlY3Rpb24tZm91bmQgY2FzZS4KLQkoZGlzcGxheV9iZmQpOiBBbHdheXMgY2FsbCBkdW1wX3N0YWJzIGlmIHJlcXVlc3RlZC4KLQkoZHVtcF9kYXRhKTogQ2FsbCBiZmRfc2VjdGlvbl9zaXplIHRvIGdldCBzZWN0aW9uIHNpemUuCi0KLUZyaSBTZXAgMTAgMDg6MTI6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IHB1dCBzdHJpbmdzIGluIHRvb2xkaXIvYmluLgotCi1Nb24gU2VwICA2IDE1OjM5OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jICh0b3RhbF9ic3Nfc2l6ZSk6IFJlbW92ZWQuCi0JKG1haW4pOiBTZXQgdGhlIGJzcyB2bWEgdG8gYWx3YXlzIGZvbGxvdyB0aGUgZGF0YSBzZWN0aW9uLiAgTW92ZQotCXN5bWJvbHMgaW50byBuZXcgc2VjdGlvbnMsIGFuZCBhZGp1c3QgdmFsdWVzIGJ5IG91dHB1dF9vZmZzZXQuCi0JKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgY29weSBhbGwgc2VjdGlvbnMsIGJ1dCBpbnN0ZWFkIHBvaW50IGFsbAotCXRleHQgc2VjdGlvbnMgdG8gLnRleHQsIGFsbCBkYXRhIHNlY3Rpb25zIHRvIC5kYXRhLCBhbmQgYWxsIGJzcwotCXNlY3Rpb25zIHRvIC5ic3MuCi0JKGNvcHlfc2VjdGlvbnMpOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVRodSBTZXAgIDIgMTI6MzQ6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JT25seSBidWlsZCBubG1jb252IGlmIGNvbmZpZ3VyZWQgZm9yIGEgTmV0V2FyZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IElmIHdlIGhhdmUgc29tZSAqLSotbmV0d2FyZSogdGFyZ2V0LCBvciBhcmUgdXNpbmcKLQlhbGwgdGFyZ2V0cywgc2V0IEJVSUxEX05MTUNPTlYgdG8gJChOTE1DT05WX1BST0cpIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKFBST0dTKTogVXNlICQoQlVJTERfTkxNQ09OVikgcmF0aGVyIHRoYW4KLQkkKE5MTUNPTlZfUFJPRykuCi0KLVR1ZSBBdWcgMzEgMTQ6MTM6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKEFSQ0hfYWxsKTogRGVmaW5lIEFSQ0hfaHBwYSB0b28uCi0JKGR1bXBfaGVhZGVycyk6IERvbid0IHRlc3QgZm9yIFNFQ19CQUxJR04gaWYgaXQncyBub3QgZGVmaW5lZCBieQotCWJmZC5oLgotCi1UdWUgQXVnIDMxIDEzOjI5OjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogRm9yY2UgY3JlYXRpb24gb2YgLmJzcyBzZWN0aW9uLiAgU2V0IHVwIHRoZQotCXNlY3Rpb25zIGJlZm9yZSBsb29raW5nIGF0IHRoZSBzeW1ib2xzLiAgTW92ZSBhbGwgY29tbW9uIHN5bWJvbHMKLQlpbnRvIC5ic3Mgc2VjdGlvbi4gIEF1dG9tYXRpY2FsbHkgZGVmaW5lIF9lZGF0YSBhbmQgX2VuZC4gIE9ubHkKLQlleHBvcnQgc3ltYm9scyBpbiB0aGUgZXhwb3J0IGxpc3QsIHdpdGggbXVsdGlwbGUgcHJlZml4ZXMgaWYKLQluZWNlc3NhcnkuICBXYXJuIGlmIG5vIHZlcnNpb24uICBBbHdheXMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlci4KLQlTZXQgZGF0ZSBhdXRvbWF0aWNhbGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KLQkoc2V0dXBfc2VjdGlvbnMpOiBDb3VudCBzaXplIG9mIGJzcyBzZWN0aW9ucy4KLQkobWFuZ2xlX3JlbG9jcywgaTM4Nl9tYW5nbGVfcmVsb2NzKTogQWNjZXB0IHNlY3Rpb24gYXJndW1lbnQsIGFuZAotCXRha2UgcmVsb2NfY291bnQgYXMgYSBjaGFuZ2VhYmxlIHBvaW50ZXI7IGNoYW5nZWQgY2FsbGVycy4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogUmVtb3ZlIFBDIHJlbGF0aXZlIHJlbG9jcyB3aXRoaW4gYSBzZWN0aW9uLAotCWFzIHRoZXkgcmVxdWlyZSBubyBhZGp1c3RtZW50LgotCSogbmxtaGVhZGVyLnk6IEZpeGVkIG1lbW9yeSBhbGxvY2F0aW9uIHRocm91Z2hvdXQ6IHRva2VuIFNUUklORyBpcwotCW5vdyBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGFuZCBmcmVlZCBpZiBub3QgbmVlZGVkLiAgTnVsbAotCXRlcm1pbmF0ZWQgY29weXJpZ2h0IG1lc3NhZ2UuICBBY2NlcHQgdmVyc2lvbiB3aXRoIG9ubHkgdHdvCi0Jc3RyaW5ncy4KLQkoc3ltYm9sX2xpc3Rfb3B0KTogTmV3IG5vbnRlcm1pbmFsLCBlaXRoZXIgc3ltYm9sX2xpc3Qgb3IgZW1wdHkuCi0JKHN5bWJvbF9saXN0KTogVXNlIGxlZnQgcmVjdXJzaW9uIHRvIGF2b2lkIG92ZXJmbG93aW5nIHBhcnNlcgotCXN0YWNrLgotCSh5eWxleCk6IFJlYXJyYW5nZWQgYmVnaW5uaW5nIG9mIGxpbmUgY2hlY2suICBBY2NlcHQgcXVvdGVkCi0Jc3RyaW5ncyB1c2luZyBzaW5nbGUgcXVvdGVzLiAgRW5kIGdlbmVyaWMgYXJndW1lbnQgYXQgY29tbWVudAotCWNoYXJhY3RlciBvciBwYXJlbnRoZXNlcy4KLQkoc3RyaW5nX2xpc3RfYXBwZW5kKTogRml4ZWQuCi0JKHN0cmluZ19saXN0X2FwcGVuZDEpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGJ1Y29tbS5oOiBUaGUgZmlyc3QgYXJndW1lbnQgdG8geHJlYWxsb2MgaXMgUFRSLCBub3QgY2hhciAqLgotCSogYnVjb21tLmMgKHhyZWFsbG9jKTogVXNlIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCi0JKiBNYWtlZmlsZS5pbiAob2JqZHVtcC5vKTogRGVwZW5kIHVwb24gY29uZmlnLnN0YXR1cyB0byBub3RpY2UKLQktLXdpdGgtdGFyZ2V0cyBjaGFuZ2VzLgotCShubG1jb252Lm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaC4KLQotVHVlIEF1ZyAxNyAwOTo0NjowMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcGFzcyBjcHUgdG8gY29uZmlnLmJmZC4KLQotVGh1IEF1ZyAxMiAxNjo0MzowNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgkKE5NX1BST0cpKTogRGVwZW5kIG9uIGRlbWFuZ2xlLm8uCi0JKGRlbWFuZ2xlLm8pOiBOZXcgdGFyZ2V0LgotCShjcGx1cy1kZW0ubyk6IERlcGVuZCBvbiBpdCwgdG8gZm9yY2UgY29tcGlsYXRpb24gb3JkZXIgd2hlbiBkb2luZwotCXBhcmFsbGVsIGNvbXBpbGVzLgotCi0JKiBubS5jIChwcmludF9zeW1ib2xfaW5mb197YnNkLHN5c3YscG9zaXh9KTogVGFrZSBhIGJmZCBhcmcuCi0JKHN0cnVjdCBvdXRwdXRfZm5zIHByaW50X3N5bWJvbF9pbmZvKTogRGl0dG8uCi0JKGxvbmdfb3B0aW9ucywgdXNhZ2UsIG1haW4pOiBBZGQgLUMgLS1kZW1hbmdsZSBvcHRpb24uCi0JKHByaW50X3N5bW5hbWUpOiBOZXcgZnVuY3Rpb24sIGRlbWFuZ2xpbmcgaWYgcmVxdWVzdGVkLgotCShwcmludF9zeW1ib2xzLCBwcmludF9zeW1ib2xfaW5mb197YnNkLHN5c3YscG9zaXh9KTogVXNlIGl0LgotCi1XZWQgQXVnIDExIDIyOjU3OjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFB1dCBDRkxBR1MgbGFzdCBpbiBjb21waWxhdGlvbiBydWxlcyBhbmQgb21pdCBmcm9tCi0JbGlua2luZyBydWxlcy4gIFVzZSBBUkNIREVGUyB0byBjb21waWxlIG9iamR1bXAuYy4KLQlVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLmluOiBDb25zdHJ1Y3QgQVJDSERFRlMgYmFzZWQgb24gdGhlIEJGRCB0YXJnZXQgbWFrZWZpbGUKLQlmcmFnbWVudHMuCi0JKiBvYmpkdW1wLmM6IENvbmRpdGlvbmFsaXplIGNhbGxzIHRvIHRoZSBwcmludF9pbnNuX0FSQ0ggZnVuY3Rpb25zCi0JYWNjb3JkaW5nIHRvIEFSQ0hERUZTLgotCi1UaHUgQXVnIDEyIDA4OjA2OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXIuYzogUmVtb3ZlZCBvYnNvbGV0ZSBhbmQgbm9uLWZ1bmN0aW9uYWwgR05VOTYwIGNvZGUuCi0KLVdlZCBBdWcgMTEgMTM6MDg6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzaXplLmMgKGJlcmtlbGV5X3N1bSk6IE5ldyBmdW5jdGlvbi4KLQkoYnNzc2l6ZSwgZGF0YXNpemUsIHRleHRzaXplKTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKGJzc19zZWN0aW9uX25hbWUsIGRhdGFfc2VjdGlvbl9uYW1lLCB0ZXh0X3NlY3Rpb25fbmFtZSk6IFJlbW92ZWQuCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCk6IE1hcCBiZXJrZWxleV9zdW0gb3ZlciBhbGwgdGhlIHNlY3Rpb25zLAotCXJhdGhlciB0aGFuIG9ubHkgcmVwb3J0aW5nIHNpemVzIG9mIHNwZWNpZmljYWxseSBuYW1lZCBzZWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBSZW1vdmVkIGRlcGVuZGVuY3kgb24gc2l6ZS5vLgotCi1UdWUgQXVnIDEwIDEwOjQ2OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jLCBubG1jb252LmgsIG5sbWhlYWRlci55OiBOZXcgZmlsZXMgZm9yIHByb2dyYW0gdG8KLQljb252ZXJ0IG9iamVjdCBmaWxlcyBpbnRvIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlcy4KLQkqIE1ha2VmaWxlLmluIChOTE1DT05WX1BST0cpOiBOZXcgbWFjcm8sIGRlZmluZSB0byBiZSBubG1jb252LgotCShQUk9HUyk6IEFkZCBOTE1DT05WX1BST0cuCi0JKG5sbWhlYWRlci5jLCBubG1oZWFkZXIubywgbmxtY29udi5vLCAkKE5MTUNPTlZfUFJPRykpOiBOZXcKLQl0YXJnZXRzLgotCi1UaHUgQXVnICA1IDE1OjQ4OjMyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBNQUtFT1ZFUlJJREVTIHRvIGFuIGVtcHR5IHN0cmluZwotCi1XZWQgQXVnICA0IDE3OjA4OjA4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChjb3B5X2ZpbGUpOiBNYWtlIGZhaWx1cmVzIHRvIHByb2Nlc3MgYSBmaWxlIG5vbmZhdGFsLgotCi1Nb24gQXVnICAyIDExOjI4OjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogQWRkIC1CIG9wdGlvbiwgbGlrZSAtLWZvcm1hdD1ic2QuCi0KLVR1ZSBKdWwgMjcgMTY6Mjk6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfZmlsZSk6IElmIHRoZSBmaWxlIGlzIG5laXRoZXIgYW4gb2JqZWN0IG5vciBhbgotCWFyY2hpdmUsIGdpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHN1Y2Nlc3MuCi0KLU1vbiBKdWwgMTkgMTY6MTM6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFByZWZlciBub24tbG9jYWwgc3ltYm9scyBvdmVyCi0JbG9jYWwgb25lcywgYW5kIGVzcGVjaWFsbHkgZGlzY3JpbWluYXRlIGFnYWluc3QgZGVidWdnaW5nIHN5bWJvbHMuCi0JQWxzbywgZm9yIHJlbG9jYXRlYWJsZSBmaWxlcywgdHJ5IHRvIGZpbmQgYSBzeW1ib2wgaW4gdGhlIGN1cnJlbnQKLQlzZWN0aW9uLCBpbnN0ZWFkIG9mIHBpY2tpbmcgb25lIGZyb20gc29tZSByYW5kb20gc2VjdGlvbiB3aXRoIGEKLQljb252ZW5pZW50IHZhbHVlIChyZWFkLCBzZWN0aW9uIG9mZnNldCkuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYXN0IGFyZ3VtZW50IHRvIG1hbGxvYyB0byBzaXplX3QgZmlyc3QuCi0JKGR1bXBfZGF0YSk6IExpa2V3aXNlLgotCShkdW1wX3JlbG9jcyk6IElmIGEgc2luZ2xlIHNlY3Rpb24gbmFtZSBpcyBzcGVjaWZpZWQsIHNob3cgcmVsb2NzCi0Jb25seSBmb3IgdGhhdCBzZWN0aW9uLiAgT3RoZXJ3aXNlLCBzaWxlbnRseSBvbWl0IHNlY3Rpb25zIHdpdGhvdXQKLQlyZWxvY3MuICBGb3JtYXQgdGFibGUgbmljZWx5IGV2ZW4gaWYgdmFsdWVzIGFyZSBwcmludGVkIHVzaW5nIDE2Ci0JZGlnaXRzIGluc3RlYWQgb2YgOC4KLQotRnJpIEp1bCAxNiAxNToxOTo1OSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IENoYW5nZXMgZm9yIGZpbmFsIHZlcnNpb24gb2YgUE9TSVguMi4KLQkocHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3tic2Qsc3lzdixwb3NpeH0pOiBOZXcgZnVuY3Rpb25zLgotCShmb3JtYXRzKTogQWRkIGFuIGVsZW1lbnQgZm9yIGEgcG9pbnRlciB0byB0aGVtLgotCShwcmludF9zeW1ib2xzKTogQ2FsbCBpdC4KLQkocHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4LCBwcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCk6IFByb2R1Y2UKLQlvdXRwdXQgYWNjb3JkaW5nIHRvIG5ldyBQT1NJWC4yIHNwZWMuCi0KLQkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IEhhbmRsZSBTVFJFQU0gYmVpbmcgTlVMTC4KLQkoc3RyaW5nc19hX3NlY3Rpb24pOiBQYXNzIGEgTlVMTC4KLQkobWFpbik6IERvbid0IG9wZW4gL2Rldi9udWxsLgotCi1UaHUgSnVsIDE1IDEyOjQ0OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHRoZSBtODhrLgotCShkaXNwbGF5X2JmZCk6IFVzZSBiZmRfZXJybXNnLCByYXRoZXIgdGhhbiBqdXN0IGNsYWltaW5nIHRoYXQgdGhlCi0JYmZkIGlzIG5vdCBhbiBvYmplY3QgZmlsZS4KLQotTW9uIEp1bCAxMiAxNzo1NTozNCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBtYWtlIHdvcmsgYWdhaW4gYnkgbmFtaW5nIGRpcmVjdG9yaWVzCi0JICBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGRlcGVuZGluZyBvbiB1bmRlZmluZWQgbWFjcm9zLgotCSAgKElOU1RBTExfWEZPUk0pOiBjb3JyZWN0IGJhZCBpbnN0YWxsIHRhcmdldC4KLQotRnJpIEp1bCAgMiAxNjo1ODozNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN0cmluZ3MuYzogRG9jIGZpeGVzLgotCi1TdW4gSnVuIDI3IDEzOjM1OjI0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IE5vdGUgZGVwZW5kZW5jaWVzIG9uIGJ1Y29tbS5oLgotCShjcGx1cy1kZW0ubyk6IExpbmsgYysrZmlsdCB3aXRoIHZlcnNpb24uby4KLQotCSogc3RyaW5ncy5jOiBJbmNsdWRlIGJ1Y29tbS5oIGFuZCBhZGQgcHJvdG90eXBlcyB0byBvdGhlciBkZWNscy4KLQlSZW1vdmUgLWggb3B0aW9uLgotCi0JKiBidWNvbW0uaDogRGVjbGFyZSB4cmVhbGxvYy4KLQotCSogbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMsIHNpemUuYywgc3RyaW5ncy5jIChtYWluLCB1c2FnZSk6IEFkZAotCS0taGVscCBvcHRpb24uICBQdXQgIkdOVSIgaW4gdGhlIHZlcnNpb24gbWVzc2FnZS4KLQkodXNhZ2UpOiBUYWtlIHN0cmVhbSBhbmQgZXhpdCBzdGF0dXMgYXMgYXJncy4KLQkobWFpbik6IFBhc3MgbmV3IGFyZ3MgdG8gdXNhZ2UuCi0KLUZyaSBKdW4gMjUgMjM6MTI6MTIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLmMsIHN0cmluZ3MuMTogTmV3IGZpbGVzLgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgc3RyaW5ncy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgcnVsZXMgZm9yIGl0LgotCi1GcmkgSnVuIDI1IDIwOjQ0OjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6IFVzZSBzaXplLWluZGVwZW5kZW50IGJmZCBlbGYgc2VjdGlvbiBuYW1lcy4KLQotU3VuIEp1biAyMCAyMzowOTowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBIYW5kbGUgd2lkZSBvZmZzZXRzIGJ5Ci0JY2FsbGluZyBzcHJpbnRmX3ZtYS4KLQotRnJpIEp1biAxOCAxNDoyOToxMiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzeW1zMik6ICBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZS4KLQkqIG9iamR1bXAuYyAocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6ICBOZXcgZnVuY3Rpb24uCi0JKiBvYmpkdW1wLmMgKGNvbXApOiAgU2ltcGxpZnkuCi0JKiBvYmpkdW1wLmMgKGRpcy1hc3NlbWJsZV9kYXRhKTogIE1ha2Ugc2ltcGxlciBhbmQgbW9yZQotCWVmZmljaWVudCBob3cgd2UgZmlsdGVyIG91dCB1c2VsZXNzIHN5bWJvbHM6ICBKdXN0IGZpbHRlcgotCUJFRk9SRSB0aGUgc29ydCAodXNpbmcgcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scykuCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6ICBTaW1wbGlmeS4KLQlDaGFuZ2Ugb3V0cHV0IHN5bnRheCB0byBtYXRjaCBnZGIuCi0KLVRodSBKdW4gMTcgMTY6NTM6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNhbm9uaWNhbGl6ZSBpbnN0YWxsLnNoOyBmb3IgdXNlIHdpdGhpbgotCXRoaXMgZGlyZWN0b3J5IChhbmQgc3ViZGlycykKLQotTW9uIEp1biAxNCAxMjoxMzoyMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLCBpbnN0YWxsLWluZm8pOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQsCi0JdXNlIElOU1RBTExfWEZPUk07IGRlZmluZSBJTlNUQUxMX1hGT1JNCi0KLVRodSBKdW4gMTAgMTc6Mjk6MjEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgRml4IGJhZCBzaXplIHBhc3NlZCB0byB4bWFsbG9jKCkuCi0KLU1vbiBKdW4gIDcgMTI6NDE6MTIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiAgQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6ICBGaXggc3ltYm9sIHRhYmxlIGhhbmRsaW5nLgotCi1GcmkgSnVuICA0IDE3OjIwOjAzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogIENhbm5vdCBmaWx0ZXIgdGhlIHN5bWJvbHMKLQlpbiBwbGFjZSwgYmVjYXVzZSB0aGF0IGNvbmZ1c2VzIHRoZSByZWxvY3MsIHNvIHRha2Ugc2VwYXJhdGUKLQlwYXJhbWV0ZXIgZm9yIG91dHB1dCBhcnJheS4KLQkqIG9iamNvcHkuYyAoc3ltcHApOiAgTWFrZSB0d28gdmFyaWFibGVzOiBpc3ltcHAgYW5kIG9zeW1wcC4KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgQWxsb2NhdGUgc2VwYXJhdGUgYXJyYXkgKG9zeW1wcCkKLQlmb3IgZmlsdGVyZWQgc3ltYm9scy4KLQotRnJpIEp1biAgNCAxMDo1MTo0NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGFuZ2UgcmVjdXJzaW9uIHRlc3QgdG8gcHJlc2VuY2Ugb2YgYSBjb25maWd1cmVkCi0JdGVzdHN1aXRlIGRpcmVjdG9yeQotCi1UaHUgSnVuICAzIDE0OjA1OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHVuZGVyc2NvcmUuYyk6IEhhY2sgdGhlIGJhY2txdW90ZWQgY29tbWFuZCBzbyBpdAotCWRvZXNuJ3QgY2F1c2UgU29sYXJpcyBtYWtlIHRvIGJvbWIuCi0KLVRodSBKdW4gIDMgMTA6NDA6MTkgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBhZGRlZCBjKytmaWx0IGFuZCBvYmpjb3B5IHRvIE1BTlBBR0VTIHZhcmlhYmxlCi0KLVRodSBKdW4gIDMgMDA6MzI6NTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVuYW1lIExPQURMSUJFUyB0byBFWFRSQUxJQlMKLQotV2VkIEp1biAgMiAxODozMDoyNCAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBjKytmaWx0LjEsIG9iamNvcHkuMTogIG5ldyBtYW4gcGFnZXMKLQotRnJpIE1heSAyOCAxNTowMToyNCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogIEFsc28gaW5zdGFsbCBhciBhbmQgcmFubGliIGluCi0JJCh0b29sZGlyKS9iaW47ICBuZWVkZWQgZm9yIGJ1aWxkaW5nIGxpYmdjYy5hLgotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiAgRml4IHRoZSBjaGVjawotCSJjb2luY2lkZW50YWwiIGxhYmVsIG1hdGNoZXMgYnkgZGlzLWFsbG93aW5nIHVuZGVmaW5lZAotCW9yIGNvbSBzeW1ib2xzLgotCi1UaHUgTWF5IDI3IDE2OjU4OjMxIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBiaXV0aWxzLnRleGk6ICByZXZpc2VkIGMrK2ZpbHQgY2hhcHRlcgotCi1XZWQgTWF5IDI2IDE3OjI0OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0MgYW5kIENGTEFHUy4KLQotVHVlIE1heSAyNSAwMDoyNjo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzbHVycF9zeW10YWIpOiBQcmludCB3YXJuaW5nIGZvciBiYWQgc3ltYm9sIHRhYmxlLgotCShiZmRfZWxmMzJfZmluZF9zZWN0aW9uLCBFbGYzMl9JbnRlcm5hbF9TaGRyKTogVXBkYXRlZAotCWRlY2xhcmF0aW9ucyBhbmQgdXNlcy4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IERvbid0IGJ1aWxkIGJpbnV0aWxzLm1tLgotCi1GcmkgTWF5IDIxIDEwOjUxOjE5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogQWRkIC1mLy0tZm9ybWF0LCAtUC8tLXBvcnRhYmlsaXR5LCAtdC8tLXJhZGl4IG9wdGlvbnMuCi0JTWFrZSBnbG9iYWwgdmFyaWFibGVzIHN0YXRpYy4KLQkobWFpbik6IE1ha2UgLXYgbGlrZSAtbiwgbm90IC1WLCBhbmQgbWFrZSAtQSBsaWtlIC1vLCBmb3IgUE9TSVguMi4KLQkoc2V0X3ByaW50X3JhZGl4LCBzZXRfb3V0cHV0X2Zvcm1hdCwKLQlwcmludF97b2JqZWN0X2ZpbGVuYW1lLGFyY2hpdmVfZmlsZW5hbWUsYXJjaGl2ZV9tZW1iZXIsc3ltYm9sX2luZm99Ci0Je2JzZCxzeXN2LHBvc2l4fSk6IE5ldyBmdW5jdGlvbnMuCi0JKGRpc3BsYXlfZmlsZSwgcHJpbnRfc3ltYm9scyk6IENhbGwgdGhlbS4KLQotCSogYXIuYzogSW1wcm92ZSBlcnJvciBtZXNzYWdlcy4KLQotCSogbm0uYyAobWFpbik6IEhhbmRsZSBsb25nIG9wdGlvbnMgdGhhdCBqdXN0IHNldCBhIGZsYWcuCi0KLQkqIG5tLmMgKG1haW4pLCBhci5jIChkb19zaG93X3ZlcnNpb24pLCBvYmpjb3B5LmMgKG1haW4pLCBzaXplLmMKLQkobWFpbik6IEV4aXQgYWZ0ZXIgcHJpbnRpbmcgdGhlIHZlcnNpb24gbnVtYmVyLCBwZXIgdGhlIEdOVSBjb2RpbmcKLQlzdGFuZGFyZHMuCi0KLU1vbiBNYXkgMTcgMTM6MjA6MjUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIFJFQURNRSwgTWFrZWZpbGUuaW46ICBNaW5vciB1cGRhdGVzIGZvciAyLjIuCi0KLUZyaSBNYXkgMTQgMTE6MTI6MjYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh1bmRlcnNjb3JlLmMpOiAgQXV0b21hdGljYWxseSBnZW5lcmF0ZQotCSh1c2luZyBubSkgYSBmaWxlIHdpdGggdGhlIHZhcmlhYmxlIHByZXBlbmRzX3VuZGVyc2NvcmUuCi0JKiBNYWtlZmlsZS5pbiAoYysrZmlsdCk6ICBMaW5rIHVuZGVyc2NvcmUubyB3aXRoIGNwbHVzLWRlbS5vCi0Jc28gdGhhdCBpbml0aWFsIHVuZGVyc2NvcmVzIGdldCByZW1vdmVkIGlmZiBhcHByb3ByaWF0ZS4KLQkqIGJpbnV0aWxzLnRleGk6ICBQcmVsaW1pbmFyeSBkb2N1bWVudGF0aW9uIGZvciBjKytmaWx0LgotCSogTWFrZWZpbGUuaW4sIGJpbnV0aWxzLnRleGk6ICBTZXQgdG8gdmVyc2lvbiAyLjIuCi0KLQkqIE5FV1M6ICBNZW50aW9uIGNvcHktPm9iamNvcHkgcmVuYW1pbmcgYW5kIG5ldyBjKytmaWx0IHByb2dyYW0uCi0KLVdlZCBNYXkgMTIgMTI6MDU6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY3BsdXMtZGVtLm8sICQoREVNQU5HTEVSX1BST0cpKTogQnVpbGQgdGhlCi0JZGVtYW5nbGVyIHZpYSBjcGx1cy1kZW0ubywgcmF0aGVyIHRoYW4gZGlyZWN0bHkgZnJvbSB0aGUgLmMgZmlsZS4KLQotCSogb2JqY29weS5jOiBSZW5hbWVkIGZyb20gY29weS5jLCB1cGRhdGVkIGNvbW1lbnRzIGFjY29yZGluZ2x5LgotCSogTWFrZWZpbGUuaW4sIGJpbnV0aWxzLnRleGk6IFJlbmFtZWQgY29weSB0byBvYmpjb3B5LgotCSogaXMtc3RyaXAuYywgbWF5YmUtc3RyaXAuYywgbm90LXN0cmlwLmM6IFVwZGF0ZWQgY29tbWVudHMgZm9yCi0JcmVuYW1lIG9mIGNvcHkgdG8gb2JqY29weS4KLQotTW9uIE1heSAxMCAxNzoyMDoxOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aSAoc3RyaXAsIC12IG9wdGlvbik6ICBGaXggdHlwby4KLQotRnJpIE1heSAgNyAxMzo1Nzo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogRGVmaW5lLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIFJVTlRFU1QuCi0KLVR1ZSBNYXkgIDQgMTA6MDY6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVNQU5HTEVSX1BST0cpOiBOYW1lIGl0IGMrK2ZpbHQuCi0JKFBST0cpOiBBbHNvIGJ1aWxkIGFuZCBpbnN0YWxsIENPUFlfUFJPRy4KLQotTW9uIE1heSAgMyAxOToxMTo0OCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgZGVmaW5pdGlvbiBvZiAkKHRvb2xkaXIpIHRvIG1hdGNoIEZTRi4KLQotV2VkIEFwciAyOCAyMzo0MTozMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHNpemUuYyAodXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCShtYWluKTogQ2xlYW4gdXAgb3B0aW9uIHBhcnNlci4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IEFkZCBtaXNzaW5nIG9wdGlvbnMuCi0JKGRpc3BsYXlfZmlsZSk6IFByaW50IHByb2dyYW0gbmFtZSBiZWZvcmUgY2FsbGluZwotCWJkZl9wZXJyb3IuCi0KLQkqIG5tLmMgKHVzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KLQkobWFpbik6IENsZWFuIHVwIG9wdGlvbiBwYXJzZXIuCi0JKGRpc3BsYXlfZmlsZSk6IFByaW50IHByb2dyYW0gbmFtZSBiZWZvcmUgY2FsbGluZwotCWJkZl9wZXJyb3IuCi0KLQkqIGNvcHkuYyAoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCi0JKiBhci5jICh1c2FnZSk6IE5ldyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgaXQuCi0JKG9wZW5faW5hcmNoLCBkb19xdWlja19hcHBlbmQpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQliZGZfcGVycm9yLgotCi1UaHUgQXByIDIyIDE1OjAxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbm0uYyAobWFpbik6IEFjY2VwdCBhbmQgaWdub3JlIC1BIGFuZCAtQiBmb3IgTUlQUyBjb21wYXRpYmlsaXR5LgotCi1Nb24gQXByIDE5IDE0OjA2OjU5IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIEZMQUdTX1RPX1BBU1Mgc28gdGVzdHMgZ2V0IHJ1biBvbiBmcmVzaGx5Ci0JYnVpbHQgYmluYXJpZXMgaWYgdGhleSBleGlzdC4gKG90aGVyd2lzZSB0aGUgcGF0aCkKLQotV2VkIEFwciAgNyAyMjoyMjo1MCAxOTkzICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGNoZWNrIHRhcmdldCB0byB1c2UgRGVqYUdudS4KLQotVGh1IEFwciAgMSAxMjozNzoxMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBhbTI5ay1waW5zbi5jLCBpOTYwLXBpbnNuLmMuCi0Jb2JqZHVtcC5jOiBhMjlrIGFuZCBpOTYwIGFyZSBgZGlzYXNzZW1ibGUnIG5vdCBgcHJpbnQnLgotCi0JKiBvYmpkdW1wLmM6IFJlbmFtZSBwcmludF9hZGRyZXNzIHRvIG9iamR1bXBfcHJpbnRfYWRkcmVzcwotCWFuZCBjaGFuZ2UgcGFyYW1ldGVycy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBvYmpkdW1wX3ByaW50X2FkZHJlc3MuCi0KLVdlZCBNYXIgMzEgMTA6MjU6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IHByaW50X2luc25fc3BhcmMgaXMgbm93IGEKLQlgZGlzYXNzZW1ibGUnIG5vdCBhIGBwcmludCcuCi0JTWFrZWZpbGUuaW46IFJlbW92ZSBzcGFyYy1waW5zbi5jIChub3cgaW4gbGlib3Bjb2Rlcy5hKS4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogVXNlIG5ldyByZWFkX21lbW9yeV9mdW5jIHN0dWZmLgotCi1UaHUgTWFyIDI1IDEwOjM4OjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogRGVjbGFyYXRpb24gb2YgdmFyaWFkaWMgZnVuY3Rpb24gaGFkIGJldHRlcgotCWJlIGEgcHJvdG90eXBlIGZvciBBTlNJIEMgc3lzdGVtcy4KLQotTW9uIE1hciAyMiAyMzoxOTo0NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW5hbWUgdGVzdC1pbnN0YWxsIHRvIGluc3RhbGwtY2hlY2sKLQotRnJpIE1hciAxOSAxNDo0MDowOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQWRkIEg4NTAwLgotCi1GcmkgTWFyIDE5IDEwOjU2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiBsb25nIG9wdGlvbnMuCi0KLVRodSBNYXIgMTggMTQ6MjI6MTcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBubS5jOiAgTW9kaWZ5IGJlaGF2aW9yIG9mIC1vIGZsYWcgZm9yIGFyY2hpdmVzIHRvIG1hdGNoCi0JQlNENC40IGFuZCBTdW5vcyA0OiAgUHJlZml4IGFyY2hpdmUgbmFtZSBiZWZvcmUgZWFjaCBsaW5lLgotCi0JKiBtNjhrLXBpbnNuLmM6ICBSZW1vdmVkLiAgU3Vic3VtZWQgYnkgLi4vb3Bjb2Rlcy9tNjhrLWRpcy5jLgotCSogaTM4Ni1waW5zbi5jOiAgUmVtb3ZlZC4gIFN1YnN1bWVkIGJ5IC4uL29wY29kZXMvaTM4Ni1kaXMuYy4KLQkqIE1ha2VmaWxlLmluOiAgQWRqdXN0IGFjY29yZGluZ2x5LgotCSogb2JqZHVtcC5jOiAgU3VwcG9ydCBuZXctc3R5bGUgZGlzYXNzZW1ibGVycyAob25lcyB0aGF0IHVzZQotCXRoZSBpbnRlcmZhY2Ugb2YgLi4vaW5jbHVkZS9kaXMtYXNtLmgpLgotCi1UaHUgRmViIDI1IDE1OjU3OjAwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBXaGVuIG1ha2luZyB0YXIgZmlsZSwgcmVtb3ZlIHRleGluZm8vKiwKLQlleGNlcHQgZm9yIHRleGluZm8vdGV4aW5mby50ZXguCi0JKiBhcmR1cC5jOiAgQWRkIGV4dGVybiBkZWNsYXJhdGlvbiBvZiBzdHJkdXAuCi0JKiBNYWtlZmlsZS5pbiAodGVzdHN1aXRlKTogIEFkZCAnZWxzZSB0cnVlJyBzaW5jZSBvdGhlcndpc2UKLQlVbHRyaXggL2Jpbi9zaCBjb21wbGFpbnMuCi0KLVdlZCBGZWIgMjQgMTk6NDQ6MTggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFNldCBWRVJTSU9OIHRvIDIuMS4KLQkqIFJFQURNRSwgTkVXUzogVXBkYXRlcy4KLQkqIG5tLmM6ICBBZGQgLXYgYXMgYSBzeW5vbnltIGZvciAtVi4KLQotVHVlIEZlYiAyMyAxOTowMDo1MCAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIHRlc3RzdWl0ZSB0byBjb25maWdkaXJzLgotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHRlc3RzdWl0ZS4KLQotTW9uIEZlYiAyMiAyMjo1MjoxMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6ICBQcmludCBmdW5jdGlvbiBuYW1lcyB3aGVuCi0JZ2l2ZW4gYnkgYmZkX2ZpbmRfbmVhcmVzdF9saW5lLiAgSWYgbm90IC0gc3RpbGwgcHJpbnQKLQlsaW5lIG51bWJlcnMuCi0KLU1vbiBGZWIgMjIgMDc6NTQ6MDMgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMvdGVzdHN1aXRlOiBtYWRlIG1vZGlmaWNhdGlvbnMgdG8gdGVzdGNhc2VzLCBldGMuLCB0byBhbGxvdwotICAgICAgICB0aGVtIHRvIHdvcmsgcHJvcGVybHkgIGdpdmVuIHRoZSByZW9yZ2FuaXphdGlvbiBvZiBkZWphLWdudSBhbmQgdGhlCi0JcmVsb2NhdGlvbiBvZiB0aGUgdGVzdGNhc2VzIGZyb20gZGVqYS1nbnUgdG8gYSAidG9vbCIgc3ViZGlyZWN0b3J5LgotCi1Nb24gRmViIDIyIDEwOjI3OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX2RhdGEpOiBGcmVlIHVwIHNlY3Rpb24gY29udGVudHMgZWFjaCB0aW1lCi0JdGhyb3VnaCB0aGUgbG9vcC4gIFJlcG9ydGVkIGJ5IG1pbnlhcmRAYm5yLmNhLgotCi1TdW4gRmViIDIxIDEwOjU1OjU1IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogSW5pdGlhbCBjcmVhdGlvbiBvZiBiaW51dGlscy90ZXN0c3VpdGUuCi0JTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgbm0gdG8KLQliaW51dGlscy90ZXN0c3VpdGUgZnJvbSBkZWphLWdudS4gIFRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgotCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4JVGhpcyBtaWdyYXRpb24gaXMgcGFydCBvZiBhIG1ham9yIG92ZXJoYXVsCi0Jb2YgZGVqYWdudS4gIFRoZSBtb2RpZmljYXRpb25zIHRvIHRoZXNlIHRlc3RjYXNlcywgZXRjLiwgd2hpY2gKLQl3aWxsIGFsbG93IHRoZW0gdG8gd29yayB3aXRoIHRoZSBuZXcgdmVyc2lvbiBvZiBkZWphZ251IHdpbGwgYmUKLQltYWRlIGluIGEgZnV0dXJlIHVwZGF0ZS4KLQotRnJpIEZlYiAxMiAxMDowNToyMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExJQklCRVJUWV9TUkNfRElSLCBMSUJJQkVSVFlfQklOX0RJUik6IE5ldyBtYWNyb3MuCi0JKiBNYWtlZmlsZS5pbiAoTElCSUJFUlRZKTogIFVzZSBMSUJJQkVSVFlfQklOX0RJUi4KLQkqIE1ha2VmaWxlLmluIChERU1BTkdMRVJfUFJPRyk6ICBOZXcgcHJvZ3JhbSB0byBidWlsZC4gIEFkZCBtYWNybwotCWFuZCBydWxlLgotCSogTWFrZWZpbGUuaW4gKFBST0dTKTogIEFkZCBERU1BTkdMRVJfUFJPRy4KLQotVHVlIEphbiAyNiAxMTo1NjozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvcHkuYywgbm0uYywgb2JqZHVtcC5jLCBzaXplLmM6IFVzZSBuZXcgYmZkX2lzX2NvbV9zZWN0aW9uCi0JbWFjcm8gcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIGVxdWFsaXR5IHRvIGJmZF9jb21fc2VjdGlvbi4KLQotRnJpIEphbiAgOCAxNTo1MDowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEZpeCBjb2RlIHRvIGZpbmQgZmlyc3QgdXNlbGVzcwotCXN5bWJvbC4KLQotVGh1IEphbiAgNyAxMzoxMzozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBtaXBzX3ByaW50X2luc24gZm9yIE1JUFMuCi0JRG9uJ3QgY29yZSBkdW1wIGlmIGJmZF9maW5kX25lYXJlc3RfbGluZSByZXR1cm5zIGZhbHNlLgotCi1XZWQgSmFuICA2IDE3OjE0OjAxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBrbm93IGhvdyB0byBkaXNhc3NlbWJsZSB6ODAwMHMKLQl0b28uCi0KLVdlZCBKYW4gIDYgMTU6MTY6MjcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyc3VwLmggKGludGVyYWN0aXZlKSwgYnVjb21tLmggKHByb2dyYW1fbmFtZSk6ICBQcmVmaXgKLQl3aXRoICdleHRlcm4nLCB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIHNvbWUgY29tcGlsZXJzLgotCi1XZWQgSmFuICA2IDE1OjE0OjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYXJwYXJzZS55OiBmaXggdW5uZWNlc3Nhcnkgc2hpZnQvcmVkdWNlCi0KLVR1ZSBEZWMgMjIgMTU6NDY6NTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1ha2UgY2hlY2sgZGVwZW5kIG9uIGFsbC4KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc3lzZGVwLmguCi0JKiBzaXplLmM6ICBVc2UgJXUgZm9ybWF0IHdoZXJlIGFwcHJvcHJpYXRlLgotCSogb2JqZHVtcC5jOiAgU3RhbmRhcmRpemU6ICBMX1NFVCAtPiBTRUVLX1NFVC4KLQkqIG9iamR1bXAuYzogIFVzZSBuZXcgbWFjcm8gYmZkX2FzeW1ib2xfYmZkLgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlIGRlZmF1bHQgJHtteXNfaG9zdH0uCi0KLVRodSBEZWMgMTcgMTk6Mzg6MTkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHZpIHRhcmdldCwgZGVmaW5lIGFuZCB1c2UgVEVYSTJEVkkKLQotVHVlIERlYyAxNSAxODowNTowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiAgRml4IHBlcm1pc3Npb25zIGJlZm9yZSByZWxlYXNlLgotCSogc2l6ZS5jOiAgVXNlIGJmZF9zaXplX3R5cGUgKGFuZCBsb25nKSB3aGVyZSBhcHByb3ByaWF0ZS4KLQkqIGFyLmM6ICBNYWtlIHdyaXRpbmcgYSBtYXAgdGhlIGRlZmF1bHQsIHRvIGJlIGNvbXBhdGlibGUKLQl3aXRoIFNZU1YgYW5kIFBvc2l4LjIuICBSZW1vdmUgc29tZSBib2d1cyBrbHVkZ2VzIHRoYXQKLQloYW5kbGVkIF9fLlNZTURFRiBkaXJlY3RseS4KLQkqIE5FV1M6ICBOZXcgZmlsZS4KLQotTW9uIE5vdiAgOSAxMzozNjo1MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmbGV4IG5vIGxvbmdlciBuZWVkcyB0aGUgLVMgZmxhZwotCi1TYXQgTm92ICA3IDE1OjA2OjEzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IHV0aW1lIG5lZWRzIGEgcG9pbnRlciB0byBhIHV0aW1idWYKLQotCSogTWFrZWZpbGUuaW46IGhhbmRsZSAtSSBpbmNsdWRlcyBiZXR0ZXIsIGFkZGluZyAkKEJBU0VESVIpL2JmZCB0bwotCXRoZSBsaXN0IChzaW5jZSBzb21lIG9mIHRoZSBiZmQvaG9zdHMvKi5oIGZpbGVzIGluY2x1ZGUgb3RoZXIKLQlmaWxlcyBmcm9tIHRoYXQgZGlyZWN0b3J5KQotCi1GcmkgTm92ICA2IDAwOjEyOjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBpOTYwLXBpbnNuLmMgKE1FTV9NQVgsIE1FTV9TSVopOiAgU2V0IHVwcGVyIGJvdW5kIHByb3Blcmx5LgotCi1UaHUgTm92ICA1IDAzOjM3OjE1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW4gdXAgc29tZSBvbGQgQkZEIGFuc2lmaWNhdGlvbiBtYWNyb3MuCi0KLQkqIGFyc3VwLmgsIGJ1Y29tbS5oLCBvYmpkdW1wLmg6ICBSZW1vdmUgRVhGVU4gZnJvbSBiaW51dGlscy4KLQlJdCBzdGlsbCByZW1haW5zIGFzIGEgbG9jYWwgbWFjcm8gaW4gZ21hbGxvYy5jLCB3aGljaCBpcyBkZXJpdmVkCi0JZnJvbSBzb21lIG90aGVyIGNvcHkgb2YgR05VIE1hbGxvYyBzb21ld2hlcmUgKEZJWE1FKS4KLQotCSogYXIuYywgb2JqZHVtcC5jLCBzaXplLmM6ICBSZXBsYWNlIEVYRlVOIHdpdGggUFJPVE8uICBNYWtlIHN0YXRpYwotCWZucyByZWFsbHkgc3RhdGljLgotCSogYXJzdXAuaDogIERlY2xhcmUgZXh0cmFjdF9maWxlcy4KLQotTW9uIE5vdiAgMiAxMjo0MjoxMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IGluc3RlYWQgb2YgY2hlY2tpbmcgVVNHOiBpZiBQT1NJWF9VVElNRSwKLQl1c2UgdXRpbWUgYW5kIHV0aW1idWYgc3RydWN0dXJlLCBvdGhlcndpc2UgaWYgVVNFX1VUSU1FIHVzZSB1dGltZQotCWFuZCBhcnJheSBvZiB0d28gbG9uZ3MsIG90aGVyd2lzZSB1c2UgdXRpbWVzLgotCi1UaHUgT2N0IDE1IDEzOjU3OjM1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXg6ICBEb2N1bWVudCB5ZXN0ZXJkYXkncyBjaGFuZ2VzIHRvIHN0cmlwIGFuZCBjb3B5LgotCi1XZWQgT2N0IDE0IDEzOjIyOjE0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb3B5LmM6ICBSZS1kbyBjb21tYW5kLWxpbmUgcGFyc2luZyB0byB1c2UgZ2V0b3B0X2xvbmcoKS4KLQlBZGQgbG9uZyBvcHRpb24gbmFtZXMuICBSZS10aGluayBvcHRpb24gbGV0dGVycyB0byBiZSBtb3JlCi0JY29uc2lzdGVudC4KLQkqIGNvcHkuYzogIE5ldyBmdW5jdGlvbiBmaWx0ZXJfc3ltYm9scygpIGZvciBzdHJpcHBpbmcgb25seQotCWRlYnVnLXN5bWJvbHMgYW5kL29yIGxvY2FsIHN5bWJvbHMuICBVc2UgdGhlc2UgdG8gc3VwcG9ydAotCXRoZSBwcmV2aW91c2x5LW1pc3Npbmcgb3B0aW9ucyBvZiB0aGUgb2xkIEZTRiBzdHJpcC4KLQotVHVlIE9jdCAxMyAwMToyNDoyMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0KTogIFVzZSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0IHJhdGhlcgotCXRoYW4gcmVwZWF0aW5nIGEgY29weSBvZiBpdCBoZXJlLgotCi1XZWQgT2N0ICA3IDEyOjUzOjUyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb3B5LmMgKG1haW4pOiBFdmVuIGlmIGlzX3N0cmlwLCBhY2NlcHQgLWQgYXJndW1lbnQgaW5kaWNhdGluZwotCWFsdGVybmF0ZSBvdXRwdXQgZm9ybWF0LiAgTmVlZGVkIGJ5IGdkYiBmb3IgTmluZHkuCi0KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3ICJgIiBvcGVyYW5kIHR5cGUuCi0KLVR1ZSBPY3QgIDYgMTY6MzM6NTYgMTk5MiAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogIGFkZGVkIGRvY3VtZW50YXRpb24gZm9yICJjb3B5IgotCi1UdWUgT2N0ICA2IDE0OjIyOjU2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBQZXJzU29ueSkKLQotCSogTWFrZWZpbGUuaW4gKCpjbGVhbiBydWxlcyk6IFNvbWUgY2xlYW5pbmcgdXAuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IE1ha2UgZGlzdHN0dWZmIGluIGdwcm9mIGZvciBhIGRpc3QuCi0KLQkqIGFyLmMgKGRvX3Nob3dfdmVyc2lvbik6ICBOZXcgZnVuY3Rpb24uCi0JKiBhci5jIChtYWluKTogIEZpeCBzbyAiYXIgLVYiIHdvcmtzLgotCi1UaHUgT2N0ICAxIDIyOjQ0OjQ1IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBub3cgdXNlcyB0aGUgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZgotCW5lc3RlZCBjYXNlcy4KLQotRnJpIFNlcCAyNSAyMjo0MTowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaTk2MC1waW5zbi5jOiAgQ2hhbmdlIGJ6ZXJvIHRvIG1lbXNldC4KLQkqIHNwYXJjLXBpbnNuLmM6ICBDaGFuZ2UgaW5kZXggdG8gc3RyY2hyLgotCi1Nb24gU2VwIDIxIDE0OjM5OjU2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1waW5zbiAocHJpbnRfaW5zbl9hcmcsIGZldGNoX2FyZyk6IGFkZGVkIHN1cHBvcnQgZm9yCi0Jb3BlcmFuZHMgdG8gbWVtb3J5IG1hbmFnZW1lbnQgaW5zdHJ1Y3Rpb25zLCBmcm9tIFdSUy4KLQotVHVlIFNlcCAxNSAxNToyNjozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaWYgJCh0b29sZGlyKSBleGlzdHMsIGluc3RhbGwgbm0gYW5kCi0Jc3RyaXAgaW4gJCh0b29sZGlyKS9iaW4uCi0KLVRodSBTZXAgIDMgMTE6NTc6NDAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIExldCdzIGNhbGwgaXQgdmVyc2lvbiAyLjAuCi0KLVdlZCBTZXAgIDIgMDA6MjU6MTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAwLjk4LgotCSogVE9ETywgUkVBRE1FOiAgTWlub3IgdXBkYXRlcy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBtb3N0bHljbGVhbiwgZGlzdGNsZWFuIHJ1bGVzLAotCWFuZCBjbGVhbmVkIHVwIGNsZWFuLCByZWFsY2xlYW4uCi0KLVN1biBBdWcgMzAgMjE6MTg6NTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFwIHByb2dyYW0gbmFtZXMgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0Jd2hlbiBpbnN0YWxsaW5nLgotCi1TdW4gQXVnIDMwIDE4OjA5OjAzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb25zIDEuOTcuOTAuCi0JKiBjcGx1cy1kZW0uYzogIFJlbW92ZWQuICBXYXMgbm93aGVyZSB1c2VkIC0gYW5kIGlmIHNvbWUKLQlwcm9ncmFtcyBhcmUgY2hhbmdlZCB0byB0byBkZW1hbmdsaW5nIHNob3VsZCBub3cgdXNlIHRoZQotCXZlcnNpb25zIGluIGxpYmliZXJ0eS4KLQotVGh1IEF1ZyAyNyAxMjo1ODowOSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCB3ZTMyawotCi1Nb24gQXVnIDI0IDE0OjUzOjQyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYXBfb3Zlcl9tZW1iZXJzKTogaWYgdGhlIGVsZW1lbnQgb2YgdGhlIGFyY2hpdmUgaGFzIGEKLQludWxsIG5hbWUsIGZpbGwgaXQgaW4uCi0KLQkqIG5tLmMgKGRvX29uZV9yZWxfZmlsZSk6IG9ubHkgd2FybiBpZiBhIGJmZCdzIGZsYWdzIHNheSB0aGVyZQotCXdpbGwgYmUgc3ltYm9scyBhbmQgdGhlcmUgYXJlbid0IGFueS4KLQotV2VkIEF1ZyAxOSAxMToyMDoyNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24uYzogaGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgJ3InLCBpbnRyb2R1Y2VkIGZvciBjYXMyLgotCi1UdWUgQXVnIDE4IDIwOjQ1OjQ4IDE5OTIgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogbm0uYyBvYmpkdW1wLmM6IEFkZGVkIHN1cHBvcnQgZm9yIGEgK3ZlcnNpb24gKC1WKQotCXRvIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlci4KLQotCSogYXIuYywgY29weS5jOiBBZGRlZCBzdXBwb3J0IGZvciBhIC1WIG9wdGlvbiB0byBwcmludAotCXRoZSB2ZXJzaW9uIG51bWJlci4KLQotVHVlIEF1ZyAxOCAxMzoyODo0NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1hcG9sbG82OHY6IHJlbW92ZWQgLWcgZnJvbSBDQyBkZWZpbml0aW9uLgotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLU1vbiBBdWcgMTcgMTg6MzM6NDEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtNjhrLXBpbnNuLmM6ICBNaW5vciBmaXggaW4gc3R5bGUgb2Ygb3V0cHV0IChkb24ndCB1c2UKLQlyYW5nZSB0byBpbmRpY2F0ZSBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVycykuCi0KLVR1ZSBBdWcgMTEgMjM6NDI6MjEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1haW4pOiAgRG9uJ3QgKmFsd2F5cyogc2V0IHRoZSB2ZXJib3NlIGZsYWchCi0KLVdlZCBBdWcgIDUgMTE6MjU6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb3B5LmM6ICBXaGVuIGlzX3N0cmlwIChiZWNhdXNlIGl0IGlzIGludm9rZWQgYXMgdGhlIHN0cmlwCi0JcHJvZ3JhbSksIGZvbGxvdyB0cmFkaXRpb25hbCBhcmd2IHByb2Nlc3Npbmc6Ci0JJ3N0cmlwIGZpbGUxIGZpbGUyJyBub3cgc3RyaXBzIGZpbGUxIGFuZCBmaWxlMiwgcmF0aGVyCi0JdGhhbiBzdHJpcHBpbmcgZmlsZTEgKGFzIGlucHV0KSwgbGVhdmluZyBvdXRwdXQgaW4gZmlsZTIuCi0KLU1vbiBKdWwgMjcgMTY6Mjg6MDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfaW5mbywgZGlzcGxheV9pbmZvX3RhYmxlKTogIENhbGwKLQliZmRfc2V0X2Zvcm1hdCgpIG9uIGR1bW15IGJmZCBiZWZvcmUgdXNpbmcgaXQgKHR3aWNlKS4KLQkqIGFyLmM6ICBNYWtlIHN1cmUgYXJjaGl2ZSBpcyBjcmVhdGVkIG9uIGNvbW1hbmQgJ3InCi0JZXZlbiB3aGVuIG5vIGVsZW1lbnRzIGFyZSBpbnNlcnRlZC4gIChDbGVhbiB1cCBhbmQKLQlzaW1wbGlmeSBzb21lIG5vbi13b3JraW5nIHJlbGF0ZWQgY29kZS4pCi0KLU1vbiBKdWwgMjAgMDI6NDg6MzggMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGhwcGEgc3VwcG9ydCBkb2Vzbid0IGFzc3VtZSBocCBPUyAoZnJvbSBzZWYpLgotCi1TYXQgSnVsIDE4IDE0OjM1OjIyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaHBwYSBob3N0cyAoYnNkICYgaHB1eCksIGVycm9yIG1lc3NhZ2VzCi0JdG8gc3RkZXJyLCBub3Qgc3Rkb3V0Ci0KLUZyaSBKdWwgMTcgMTg6Mzk6NDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhci4xLCBiaW51dGlscy50ZXhpLCBpOTYwLXBpbnNuLmMsIG5tLjEsIG9iamR1bXAuMSwgcmFubGliLjEsCi0JICBzaXplLjEsIHNwYXJjLXBpbnNuLmMsIHN0cmlwLjE6IHJlbW92ZWQgcmNzaWQncy4KLQotVGh1IEp1bCAxNiAxNjo1NToyNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmRvczogcmVtb3ZlZCByY3NpZC4KLQotVGh1IEp1bCAxNiAwODoyMzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2JmZCk6IHByaW50IHN0YXRlIG9mIEJGRF9JU19SRUxBWEFCTEUgdG9vCi0KLVR1ZSBKdW4gMzAgMjA6MjY6MTUgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKLQotVGh1IEp1biAyNSAwNDo1Mjo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbm0uYyAoc29ydGVycyk6ICBMaW50LiAgUmVtb3ZlIGV4Y2VzcyB3aGl0ZXNwYWNlLgotCi1XZWQgSnVuIDI0IDEzOjQ4OjA3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBubS5jICh2YWx1ZW9mIG1hY3JvKTogIEFkZCBtaXNzaW5nIHBhcmVudGhlc2VzLgotCShUaGVpciBsYWNrIHNjcmV3ZWQgdXAgbnVtZXJpY19mb3J3YXJkKCkuKQotCi1TdW4gSnVuIDE0IDEwOjMzOjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfZWxmX3N0YWJzKTogIEFsc28gZHVtcCAuc3RhYi5pbmRleCBhbmQKLQkuc3RhYi5leGNsIHNlY3Rpb25zLgotCShkdW1wX2VsZl9zdGFic18xKTogIFNwbGl0IG91dCBtYWluIGJvZHkgb2Ygb2xkIGR1bXBfZWxmX3N0YWJzLgotCSogb2JqZHVtcC4xLCBiaW51dGlscy50ZXhpOiAgRG9jdW1lbnQgbmV3IHNlY3Rpb25zIGR1bXBlZC4KLQotRnJpIEp1biAxMiAyMjoyMzozNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc2l6ZS5jLCBvYmpkdW1wLmMsIGJ1Y29tbS5jOiAgTGludC4KLQotVGh1IEp1biAxMSAwMToxOTowNiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX2VsZl9zdGFicyk6IE5ldyBmZWF0dXJlOiAtLXN0YWJzIHByaW50cyBvdXQgYQotCS5zdGFiIHNlY3Rpb24gZnJvbSBhbiBFTEYgZmlsZS4gIEluc3RhbGxlZCB1bmRlciAjaWZkZWYKLQlFTEZfU1RBQl9ESVNQTEFZIHNvIGl0IGNhbiBiZSBlYXNpbHkgZGlzYWJsZWQsIHNpbmNlIGl0IHJlcXVpcmVzCi0JYmZkLWludGVybmFscyBoZWFkZXIgZmlsZXMgYW5kIHN1Y2guCi0JKiBvYmpkdW1wLjEsIGJpbnV0aWxzLnRleGk6ICBVcGRhdGUgZm9yIC0tc3RhYnMuICBBbHNvIGZpeAotCW9iamR1bXAncyBkb2MgdG8gdXNlIC0tIHJhdGhlciB0aGFuICsgZm9yIGxvbmcgb3B0aW9ucy4KLQkoRklYTUU6ICBOb3QgeWV0IGZpeGVkIGV2ZXJ5d2hlcmUgaW4gYmludXRpbHMudGV4aW5mby4pCi0KLVdlZCBKdW4gMTAgMDc6NTM6MjQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyhkaXNwbGF5X2luZm8pLCBwYXRjaGVzIGZyb20KLQltb2hyaW5nQGluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUgdG8gcHJpbnQgdGhlIHRhYmxlIG11Y2ggbW9yZQotCW5pY2VseS4KLQotVGh1IE1heSAyOCAxMzozNjoxNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogIEFkZCBhbm90aGVyIGVudW0tPmludCBjYXN0LCBmb3IgdGhlIHNha2Ugb2YKLQlvbGQgY29tcGlsZXJzIChzdWNoIGFzIFBDQykuCi0KLVdlZCBNYXkgMjcgMTM6MDE6NDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcmxleC5sOiAgRG9uJ3QgaW5jbHVkZSA8c3lzZGVwLmg+ICh1bm5lZWRlZCBjb25mbGljdHMpLgotCUFkZCBkZWNsYXJhdGlvbiBvZiBzdHJkdXAoKS4KLQotRnJpIE1heSAyMiAxMzo0MDozNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBVc2Ugc3JjZGlyIGluc3RlYWQgb2YgVlBBVEggaW4gbGRncmFtL2xkbGV4Ci0JcnVsZXMsIHNpbmNlIHRoZXNlIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgYSBkaXN0cmlidXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoYXJsZXguYyk6ICBEb24ndCByZS1kaXJlY3Qgb3V0cHV0LCBzaW5jZSB0aGF0Ci0JbGVhdmVzIGEgYm9ndXMgb3V0cHV0IGZpbGVzIGlmIGl0IGZhaWxzLgotCi0JKiBhcmxleC5sOiAgTWFrZSB3b3JrIHdpdGggbGV4LCBmb3Igd2hhdCBpdCdzIHdvcnRoLgotCSogTWFrZWZpbGUuaW46ICBCZXR0ZXIgbGV4IHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6ICBHZW5lcmF0ZSBmbGV4IGFuZCBiaXNvbiBvdXRwdXRzCi0JZm9yIGRpc3RyaWJ1dGlvbi4KLQotVGh1IE1heSAxNCAxNzoxNzo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBnZXQgQklTT04gZGVmaW5pdGlvbiByaWdodC4KLQotRnJpIE1heSAgOCAwNzo0NzowOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogc2FuaXR5LnNoOiBkZWZhdWx0IFRNUERJUiB0byAiLiIuCi0KLVRodSBNYXkgIDcgMTI6MzQ6NTAgMTk5MiAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogYWRkIGRvYyBmb3IgYXIgY29tbWFuZCBsYW5ndWFnZS4KLQotV2VkIE1heSAgNiAxODowNTozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJwYXJzZS55OiBtYWtlIEVORCBjYWxsIGFyX2VuZAotCSogYXJzdXAuYyAoYXJfZW5kKTogYWRkZWQsIGRlbGV0ZXMgdGVtcCBmaWxlIGlmIGFyY2hpdmUgc2Vzc2lvbgotCWFib3J0ZWQuCi0KLQotV2VkIE1heSAgNiAxMTowODo1MyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgYmlzb24gJiBmbGV4IGZyb20gLi4vIGlmIHRoZXkgZXhpc3QuICBBbHNvLAotCSAgRkxFWC0+TEVYLgotCi0JKiBzYW5pdHkuc2g6IHJlbW92ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdoZW4gZmluaXNoZWQuCi0KLVR1ZSBNYXkgIDUgMTI6MDA6NTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjk3LgotCSogYXIuYzogIERlY2xhcmUgZXJybm8gZm9yIG1hY2hpbmVzIHRoYXQgbmVlZCBpdC4KLQotTW9uIE1heSAgNCAyMzoyOTo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8pOiAgSGFuZGxlIGVycm9yIGNhc2VzIHdpdGhvdXQgY29yZWR1bXAuCi0JQ2xvc2UgdGhlIGR1bW15IHRlbXBvcmFyeSBmaWxlIHdlIG9wZW4gaW4gdGhlIGxvb3AuCi0JKiBNYWtlZmlsZS5pbiAoYXJzdXAubyk6ICBBZGQga2x1ZGdlIHRvIGJ1aWxkIHdpdGggU3VuIE1ha2UuCi0KLUZyaSBNYXkgIDEgMTY6MjA6MjMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0ZXN0LWluc3RhbGwgdGFyZ2V0LgotCi0JKiBzYW5pdHkuc2g6IG5ldyBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbjogdXNlIHNhbml0eSB0ZXN0IG9uIG1ha2UgY2hlY2suCi0KLVR1ZSBBcHIgMjEgMTM6Mzg6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgdGhleSBjYW4gYmUgcGFzc2VkIG9uIHRoZQotCSAgY29tbWFuZCBsaW5lIHRvIG1ha2UuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1XZWQgQXByIDE1IDE0OjMzOjA3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcnN1cC5jLCBhcnN1cC5oLCBhcnBhcnNlLnksIGFybGV4Lmw6IHN1cHBvcnQgZm9yIGFyY2hpdmUKLQlzY3JpcHRpbmcgbGFuZ3VhZ2UuCi0KLUZyaSBNYXIgIDYgMjE6NTQ6NTMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVRodSBNYXIgIDUgMjE6MzU6NDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4KLQotVHVlIE1hciAgMyAxNTozNjozNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgJChDT1BZX1BST0cpIGZyb20gUFJPR1MuICBJdCBzaG91bGRuJ3QgYmUKLQkgIGluc3RhbGxlZC4gYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1TdW4gRmViIDE2IDEyOjUzOjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdmVyc2lvbiB0byAxLjk2LCBhbmQgcmVtb3ZlIC1iZXRhCi0Jc3VmZml4IGZyb20gZGlzdHJpYnV0aW9uIG5hbWUuCi0JKiBtNjhrLXBpbnNuLmM6ICBOZXcgbWFjcm8gQ09FUkNFX1NJR05FRF9DSEFSIHRvIGV4dHJhY3QKLQl0aGUgc2lnbmVkIHZhbHVlIG9mIGEgY2hhcmFjdGVyIChldmVuIGlmIGNoYXJzIGFyZSB1bnNpZ25lZCkuCi0JKiBzcGFyYy1waW5zbi5jOiAgQWRkIG5ldyBvcGVyYW5kIHR5cGVzLgotCi1UaHUgRmViICA2IDEyOjE0OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBkb24ndCBwcmludCBhIHNlY3Rpb24ncyBjb250ZW50cwotCWlmIGl0J3Mgbm90IGxvYWRhYmxlIChlZyBic3MpCi0KLVR1ZSBKYW4gMjggMTE6MTE6MDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiBmaXhlZCBzbyB0aGF0IC12ZSBicmFuY2gKLQlkaXNwbGFjZW1lbnRzIGRvbid0IGdldCBwcmludGVkIGFzIGxhcmdlICt2ZSBvbmVzLgotCi1GcmkgSmFuIDI0IDE0OjQ3OjUzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb3B5LmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jIDogY2hhbmdlZCB0byB1c2UgdGhlCi0JbmV3IHJlbG9jIHNjaGVtZS4KLQotCi1Nb24gRGVjIDMwIDE4OjM0OjQxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBidWNvbW0uYyAocHJpbnRfYXJlbHRfZGVzY3IpOiAgVHdlZWsgdGhlIG91dHB1dCBmb3JtYXQKLQlzbyB0aGF0ICdhciB0dicgb3V0cHV0IGZvbGxvd3MgUG9zaXggMTAwMy4yL0QxMS4KLQlPdXRwdXQgaXMgbm93IGFsc28gaWRlbnRpY2FsIHRvIFN1bidzIChleGNlcHQgX18uU1lNREVGKS4KLQotTW9uIERlYyAzMCAwNjowOTo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBNYWtlIGBtYWtlJyBvdXRwdXQgbW9yZSByZWFkYWJsZS4KLQotV2VkIERlYyAxOCAxNTowNDo0NSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMS45NC4KLQotV2VkIERlYyAxMSAxNjo0ODowOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBhci5jOiBhZGRlZCAiYiIgdG8gZm9wZW5zIGZvciBkb3MKLQkqIGNvbmZpZ2RqLmJhdCwgbWFrZWZpbGUuZG9zIG5ldyBmaWxlcyBmcm9tIERKCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLVNhdCBEZWMgIDcgMTc6MDk6MzcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGJ1Y29tbS5oOiBjcmVhdGVkIHRvIGhvbGQgcHJvdG90eXBlcyBvZiBidWNvbW0uYwotCSogb2JqZHVtcC5oOiBjcmVhdGVkIHRvIGhvbGQgcHJvdG90eWVzIG9mIG9iamR1bXAuYwotCSogYW0yOWstcGluc24uYzogaW5jbHVkZSBvYmpkdW1wLmgKLQkqIGFyLmM6IGluY2x1ZGUgYnVjb21tLmgsIGdldCBhci5oIGZyb20gdGhlIHJpZ2h0IHBsYWNlIGFuZAotCWluY2x1ZGUgbGliYmZkLmgKLQkqIGJ1Y29tbS5jOiBkZWZ1bml6ZSBiZmRfZmF0YWwKLQkqIGNvcHkuYzogaW5jbHVkZSBidWNvbW0uaCwgbGludC4KLQkqIGk5NjAtcGluc24uaDogaW5jbHVkZSBidWNvbW0uaAotCSogbTY4ay1waW5zbi5oOiBsaW50Ci0JKiBubS5jOiBpbmNsdWRlIGJ1Y29tbS5oLCBsaW50Ci0JKiBvYmpkdW1wLmM6IGxpbnQKLQkqIHNwYXJjLXBpbnNuLmM6IGluY2x1ZGUgb2JqZHVtcC5oCi0KLQotCi1GcmkgRGVjICA2IDIzOjAyOjE0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuICBpbnN0YWxsIHVzaW5nCi0JICBJTlNUQUxMX1BST0dSQU0gYW5kIElOU1RBTExfREFUQS4KLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgbm93IGRvZXMgYWxsIG9mIGl0J3Mgd29yayBmcm9tIG9iamRpciBzbwotCSAgbWFrZSBmaWxlIGV4aXN0ZW5jZSB0ZXN0cyBhZ2FpbnN0ICR7c3JjZGlyfS4KLQotVGh1IERlYyAgNSAyMjo0NjoyMiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLVdlZCBEZWMgIDQgMjI6NDI6MDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTMuCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBtYWtlLXN0cmlwLm86bWF5YmUtc3RyaXAuYyBkZXBlbmRlbmN5Ci0JZm9yIG1ha2UgdmVyc2lvbnMgdGhhdCBwcm92aWRlIGhhbGYtYmFrZWQgVlBBVEgtc3VwcG9ydCAoZS5nLiBTdW4ncykuCi0JKiBzaXplLmM6ICBJbXByb3ZlbWVudHMgc3VnZ2VzdGVkIGJ5Ci0JImRhdmlkIGQgW3pvb10genVobiIgPHpvb0BhcHMxLnNwYS51bW4uZWR1PjoKLQktIERvbid0IGVtaXQgKEJlcmtlbGV5KSBoZWFkZXJzIGlmIG5vIGZpbGVzIHdlcmUgZm91bmQuCi0JLSBSZXR1cm4gYSBub24temVybyByZXR1cm4gY29kZSBvbiBmYWlsdXJlLgotCi1TYXQgTm92IDMwIDIxOjM0OjE5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyBkdWUgdG8gaW5jbHVkZSBmaWxlIHJlbmFtaW5nOgotCSogYW0yOWstcGluc24uYzogYTI5ay1vcGNvZGUuaAktPiBvcGNvZGUvYTI5ay5oCi0JKiBzcGFyYy1waW5zbi5jOiBzcGFyYy1vcGNvZGUuaAktPiBvcGNvZGUvc3BhcmMuaAotCSogbTY4ay1waW5zbi5jOgkgbTY4ay1vcGNvZGUuaAktPiBvcGNvZGUvbTY4ay5oCi0JKiBubS5jOgkJIHN0YWIuZ251LmgJLT4gYW91dC9zdGFiX2dudS5oCi0KLVR1ZSBOb3YgMTkgMTk6MjA6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIE1lbnRpb24gTUlOSU1JWkUgZmxhZyBmb3IgYmZkJ3MgbWFrZS4KLQotTW9uIE5vdiAxOCAxMjowNTozNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgVmFyaW91cyBpbXByb3ZlbWVudHMuCi0KLVN1biBOb3YgMTcgMjM6NDA6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTIuCi0JKiB2ZXJzaW9uLmMsIE1ha2VmaWxlLmluOiAgR2V0IHZlcnNpb24gc3RyaW5nIGZyb20gTWFrZWZpbGUuCi0JKiBjb3B5LmMsIGlzLXN0cmlwLmMsIG5vdC1zdHJpcC5jLCBtYXliZS1zdHJpcC5jLCBNYWtlZmlsZS5pbjoKLQlNYWtlIHRoZSBzYW1lIGNoYW5nZSB0aGF0IHdlIGVhcmxpZXIgZGlkIGZvciBhci9yYW5saWI6Ci0JR2VuZXJhdGUgdHdvIGRpZmZlcmVudCBiaW5hcmllcyBmb3Igc3RyaXAgYW5kIGNvcHkgYW5kIHVzZQotCWEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggZGlmZmVyZW50IHZhbHVlcyB0byBkaXN0aW5ndWlzaAotCW9zdHJpcCBmcm9tIGNvcHkuICAoLTEgbWVhbnMgdG8gdXNlIGFyZ3ZbMF0gdG8gZGVjaWRlLAotCXNvIHlvdSBjYW4gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIGJ1dCBpdCBpcyBubyBsb25nZXIgdGhlIGRlZmF1bHQpLgotCSogY29weS5jIChjb3B5X2ZpbGUpOiAgU2V0IEVYRUNfUCBvZiBvdXRwdXQgYmZkIGlmIGlucHV0IGlzIHNvLgotCSogY29weS5jIChtYWluKTogIElmIGlzX3N0cmlwPT0tMSwgY29tcGFyZSBsYXN0IDUgY2hhcnMKLQlvZiBhcmd2WzBdLCBub3QgdGhlIHdob2xlIHBhdGguCi0JKiBjb3B5LmMgKG1haW4pOiBSZXR1cm4gMCwgbm90IDEuCi0JKiBjb3B5LmMgKHNldHVwX3NlY3Rpb25zKTogIEZpeCBkdWUgdG8gY2hhbmdlIGluIGJmZF9tYWtlX3NlY3Rpb24KLQlub3cgZmFpbGluZyBpZiBhc2tlZCBmb3IgYSBkdXBsaWNhdGUgc2VjdGlvbi4KLQkqIHN0cmlwLmMsIG9zdHJpcC5jOiAgUmVtb3ZlZCBvYnNvbGV0ZSBmaWxlcy4KLQkqIGFyLmMsIG5vdC1yYW5saWIuYywgbWF5YmUtcmFubGliLmM6Ci0JQ2hhbmdlIGVuY29kaW5nIG9mIGlzX3JhbmxpYiB2YXJpYWJsZSB0byBiZSBjb25zaXN0ZW50Ci0Jd2l0aCBpc19zdHJpcCBmb3Igc3RyaXAuY29weSAoaS5lIC0xIHRvIG1lYW5zIHVzZSBhcmd2WzBdKS4KLQotVGh1IE5vdiAxNCAyMDoxMTowMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jIChwcm9ncmFtX3ZlcnNpb24pOiBVcGRhdGUgdG8gdmVyc2lvbiAxLjkyLgotCi1UdWUgTm92IDEyIDE2OjE3OjUzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhci5jIChnZXRfcG9zX2JmZCk6ICBQcmV2aW91cyBmaXggd2FzIG1pc3NpbmcgYSAiYnJlYWsiLgotCi1UaHUgTm92ICA3IDA4OjU1OjU2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGFtMjlrLXBpbnNuLmM6IEZpeGVkIGJ1ZyBpbiBtdGFjYywgZG1hYyBhbmQgZm1hYyBpbnN0cnVjdGlvbgotCWVuY29kaW5ncy4gKFRoYWtzIHRvIERhdmlkIFdvb2QpCi0KLVN1biBOb3YgIDMgMTQ6NTA6MjMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgkKERJU1RfTkFNRSkudGFyLlopLCBUT0RPOiAgVmFyaW91cyBmaXhlcy4KLQkqIGFyLmMgKGdldF9wb3NfYmZkKTogRml4IHRvIGhhbmRsaW5nIG9mIGJlZm9yZS9hZnRlcgotCXBvc2l0aW9uaW5nIG9wdGlvbnMuCi0JKiBidWNvbW0uYyAoZmF0YWwpOiAgTUlTU0lOR19WRlBSSU5URiBpcyBubyBsb25nZXIgYW4gaXNzdWUsCi0Jc2luY2UgbGliaWJlcnR5IGNvbnRhaW5zIHZmcHJpbnRmIGV0YyBpZiBvdGhlcndpc2UgbWlzc2luZy4KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiAgU3VwcG9ydCBCQi9CVy9CTAotCXR5cGUgb3BlcmFuZHMsIGFzIHVzZWQgYnkgYnJhbmNoIGluc3RydWN0aW9ucy4KLQkqIG5tLmM6ICBEZWxlZ2F0ZSBwcmludGluZyBvZiBzeW1ib2xzIHRvIEJGRCwKLQlieSB1c2luZyBiZmRfcHJpbnRfc3ltYm9sIHRvIGRvIHRoZSBmb3JtYXR0aW5nLgotCi1Nb24gT2N0IDI4IDExOjIwOjQ3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYyAod3JpdGVfYXJjaGl2ZS5jKTogYWRkZWQgdW5saW5rIGJlZm9yZSByZW5hbWUgc2luY2Ugc29tZQotCXN5c3RlbXMgY2FuJ3QgcmVuYW1lIG9udG8gYW4gZXhpc3RhbnQgZmlsZS4KLQotTW9uIE9jdCAyMSAwOTo0NzoyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBubS5jOiBub3cgZG9lc24ndCBjcmFzaCBpZiBhIHN5bWJvbCB3aXRoIG5vIHNlY3Rpb24gYW5kIG5vCi0JU0VDX0FCUyBhcHBlYXJzLgotCi1UaHUgT2N0IDE3IDE1OjI1OjUwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgdmVyc2lvbi5jOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTEuCi0KLVdlZCBPY3QgMTYgMTE6NDU6MzYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhci5jLCBidWNvbW0uYywgY29weS5jLCBjcGx1cy1kZW0uYywgZmlsZW1vZGUuYywKLQlpOTYwLXBpbnNuLmMsIG02OGstcGluc24uYywgbm0uYywgb2JqZHVtcC5jLCBzaXplLmMsIHNwYXJjLXBpbnNuLmMsCi0JKiBzdHJpcC5jOiBBZGQgb3IgdXBkYXRlIENvcHlyaWdodCBub3RpY2UuCi0JKiBUT0RPOiAgQWRkIG5vdGUgb24gJ25tIC1hJy4KLQkqIHZlcnNpb24uYzogVXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTAuCi0JKiBNYWtlZmlsZS5pbjogRml4IG1ha2luZyBvZiBkb2N1bWVudGF0aW9uIGZvciBkaXN0LgotCi1UdWUgT2N0IDE1IDAwOjE3OjE3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IE5ldyBrbHVkZ3kgcnVsZXMgZm9yIG1ha2luZyBhIHRhcmZpbGUuCi0JKiBNYWtlZmlsZS5pbjogRml4IGJpbmRpciBwYXRoLgotCi1Nb24gT2N0IDE0IDE3OjM0OjI5IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgdGFyZ2V0cyBiaW51dGlscy5tbSwgYmludXRpbHMubWUKLQotRnJpIE9jdCAxMSAyMjo0NDoyMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCBTdW4gTWFrZSBWUEFUSCBidWdzIGJ5IGFkZGluZyBkZXBlbmRlbmNpZXMuCi0KLUZyaSBPY3QgMTEgMTI6NTE6MzMgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCB0YXJnZXQgImJpbnV0aWxzLm1zIgotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBtaW5vciByZXN0cnVjdHVyaW5nIGZvciB0ZXhpMnJvZmYgY29tZm9ydC4KLQotRnJpIE9jdCAxMSAwNDoxMjoyOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KLQotCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIC4uL2JmZC9ob3N0cy9oLXh4eC5oLgotCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgotCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCi0JZ2V0IGRlZmluZWQgZmlyc3QuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSAtSS4gdG8gZ2V0IHN5c2RlcC5oLgotCi1XZWQgT2N0ICA5IDIyOjQyOjU2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBubS5jIChwcmludF9zeW1ib2xzKTogIEhhbmRsZSBOVUxMIG5hbWUgZmllbGQgb2Ygc3ltYm9sLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZWQgc3B1cmlvdXMgY29tbWVudC4KLQotVHVlIE9jdCAgOCAxNjo1NTowMyAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBtaW5vciB0eXBvcywgcGhyYXNpbmcsIGZvcm1hdHRpbmcgZml4ZXMuCi0KLVR1ZSBPY3QgIDggMTU6MTM6MjAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IGhvc3QgZmlsZSBmcm9tIC4uL2JmZC9jb25maWcsIG5vdCBjb25maWcuCi0JKiBjb25maWcvKjogUmVtb3ZlIGNvbmZpZyBkaXJlY3RvcnkgYW5kIGl0cyBmaWxlcy4KLQotVHVlIE9jdCAgOCAxMzo1ODo1OSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgYmludXRpbHMuZHZpLCBiaW51dGlscy5pbmZvCi0KLQkqIGJpbnV0aWxzLnRleGluZm86IHJlbW92ZSBtb3N0IHJlbWFpbmluZyBGSVhNRSdzLCBkZWxldGUKLQlyZWZlcmVuY2VzIHRvIF9fLlNZTURFRiBieSBuYW1lCi0KLQotVHVlIE9jdCAgOCAxMDoyMzo0NCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAocHJpbnRfYWRkcmVzcykgUHJpbnQgYWRkcmVzc2VzIG5pY2VseS4KLQotTW9uIE9jdCAgNyAxMTozMTowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYywgTWFrZWZpbGUuaW4sIG5ldyBmaWxlcyB7aXMsbm90LG1heWJlfS1yYW5saWIuYzoKLQlNYWtlIHR3byBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIGFyIGFuZCByYW5saWIsIGluc3RlYWQgb2YKLQlkaXN0aW5ndWlzaGluZyB0aGVtIGF0IHJ1biB0aW1lIHVzaW5nIGFyZ3ZbMF0uCi0JKE9sZCBiZWhhdmlvciBpcyBzdGlsbCBhdmFpbGFibGUgaWYgeW91ICJtYWtlIGFyX3dpdGhfcmFubGliIiwKLQlidXQgaXQgaXMgbm90IHRoZSBkZWZhdWx0LikKLQkqIHJhbmxpYi5zaCAobmV3KTogIEFuIGFsdGVybmF0aXZlIG9uZS1saW5lCi0Jc2hlbGwgaW1wbGVtZW50YXRpb24gb2YgcmFubGliLgotCi1GcmkgT2N0ICA0IDIxOjQ5OjQ0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6ICBDb3BlIHdpdGggcmVuYW1lcyBvZiBhIGZldyBCRkQgdHlwZXMgJiBlbnVtcy4KLQotRnJpIE9jdCAgNCAxOTowODowOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBhZGQgbmV3IGZpbGUgKHJ1ZGltZW50YXJ5IGRvY24pCi0KLU1vbiBTZXAgMzAgMTI6MzA6MzkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9obWFrZS1uZXdzOiBBZGQgbmV3IGZpbGUgKGZvciBTb255IE5FV1NPUzMpLgotCSogYnVjb21tLmMgKGZhdGFsKTogIENvbmRpdGlvbmFsbHkgY29tcGlsZSBmYXRhbCgpIGRlcGVuZGluZyBvbgotCU1JU1NJTkdfVkZQUklOVEYsIGFuZCBkb24ndCBjb25mdXNlIHRoZSBpc3N1ZSB3aXRoIE5PX1ZBUkFSR1MuCi0JKiBvYmpkdW1wLmMgKGR1bXBfaGVhZGVycyk6ICBUcml2aWFsIG91dHB1dCBmb3JtYXQgY2hhbmdlLgotCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8pOiBMb29wIG92ZXIgaW50ZWdlcnMsIG5vdCBlbnVtcywKLQl0byBhcHBlYXNlIG9sZCBjb21waWxlcnMuCi0KLU1vbiBNYXkgMjAgMTY6MTQ6MDcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotICAgICAgICAqb2JqZHVtcC5jICpubS5jICpjb3B5LmMgOmhhbmdlZCBzb21lIHR5cGVzIHRvIHdvcmsgd2l0aCA2NCBiaXQgb2JqZWN0IGZpbGVzCi0KLVRodSBNYXkgMTYgMTY6MDY6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLSAgICAgZnJvbSBib3RoZXIKLQkqIG9iamR1bXAuYyAocHJpbnRfYWRkcmVzcyk6IE1ha2UgZGlzYXNlbWJsZWQgb3V0cHV0IG1vcmUKLQljb25zaXN0ZW50IHdpdGggZ2RiIGFuZCBhczogQWRkIDB4IHdoZW4gcHJpbnRpbmcgaGV4LgotCURvbid0IHByaW50IGV4dHJhIGxlYWRpbmcgemVyb3MuCi0JQXR0ZW1wdCB0byBub3QgcHJpbnQgImZpbGVuYW1lLm8iLgotCSogb2JqZHVtcC5jOiBBZGQgc29tZSBlbnVtLXRvLWludCBjYXN0cyB0byBhY2NvbW9kYXRlIG9sZCBjb21waWxlcnMuCi0KLQotRnJpIE1heSAgMyAyMjoyMTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvcHkuYzogIENoYW5nZSA9JiBjb25zdHJ1Y3RzIHRvID0gJiwgc2luY2UgdGhleSBjb25mdXNlIG9sZGVyCi0JQyBjb21waWxlcnMuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL01ha2VmaWxlLmFtIGIvYmludXRpbHMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWY5ZWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi0jIyBGSVhNRTogV29yayBhcm91bmQgYXBwYXJlbnQgYnVnIGluIGF1dG9tYWtlLgotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi0jIyBUaGVzZSBhcmVuJ3Qgc2V0IGJ5IGF1dG9tYWtlLCBiZWNhdXNlIHRoZXkgYXBwZWFyIGluCi0jIyBiZmQvYWNpbmNsdWRlLm00LCB3aGljaCBpcyBpbmNsdWRlZCBieSBiaW51dGlscy9hY2luY2x1ZGUubTQsIGFuZAotIyMgdGh1cyBpcyBub3Qgc2VlbiBieSBhdXRvbWFrZS4KLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRz1hcgotUkFOTElCX1BST0c9cmFubGliCi0KLSMgb2JqY29weSBhbmQgc3RyaXAgc2hvdWxkIGJlIHRoZSBzYW1lIHByb2dyYW0KLU9CSkNPUFlfUFJPRz1vYmpjb3B5Ci1TVFJJUF9QUk9HPXN0cmlwLW5ldwotCi1TVFJJTkdTX1BST0c9c3RyaW5ncwotCi1SRUFERUxGX1BST0c9cmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0c9c2l6ZQotTk1fUFJPRz1ubS1uZXcKLU9CSkRVTVBfUFJPRz1vYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0c9YysrZmlsdAotCi1BRERSMkxJTkVfUFJPRz1hZGRyMmxpbmUKLQotTkxNQ09OVl9QUk9HPW5sbWNvbnYKLURMTFRPT0xfUFJPRz1kbGx0b29sCi1XSU5EUkVTX1BST0c9d2luZHJlcwotRExMV1JBUF9QUk9HPWRsbHdyYXAKLQotU1JDT05WX1BST0c9c3Jjb252JChFWEVFWFQpIHN5c2R1bXAkKEVYRUVYVCkgY29mZmR1bXAkKEVYRUVYVCkgCi0KLW1hbl9NQU5TID0gYXIuMSBubS4xIG9iamR1bXAuMSByYW5saWIuMSBzaXplLjEgc3RyaW5ncy4xIHN0cmlwLjEgb2JqY29weS4xIFwKLQlhZGRyMmxpbmUuMSBubG1jb252LjEgJChERU1BTkdMRVJfUFJPRykuMQotCi1QUk9HUyA9ICQoU0laRV9QUk9HKSAkKE9CSkRVTVBfUFJPRykgJChOTV9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFNUUklQX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi1iaW5fUFJPR1JBTVMgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoQVJfUFJPRykgJChTVFJJTkdTX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi0jIyBXZSBuZWVkIGEgc3BlY2lhbCBydWxlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIHdoaWNoIGFyZSBidWlsdCB3aXRoIC1uZXcKLW5vaW5zdF9QUk9HUkFNUyA9ICQoTk1fUFJPRykgJChTVFJJUF9QUk9HKQotCi1FWFRSQV9QUk9HUkFNUyA9ICQoTkxNQ09OVl9QUk9HKSBzcmNvbnYgc3lzZHVtcCBjb2ZmZHVtcCAkKERMTFRPT0xfUFJPRykgJChXSU5EUkVTX1BST0cpICQoRExMV1JBUF9QUk9HKQotCi0jIFN0dWZmIHRoYXQgZ29lcyBpbiB0b29sZGlyLyBpZiBhcHByb3ByaWF0ZQotVE9PTF9QUk9HUyA9IG5tLW5ldyBzdHJpcC1uZXcgYXIgcmFubGliIGRsbHRvb2wKLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQotCi1ERVAgPSBta2RlcAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1IRklMRVMgPSBhcnN1cC5oIGJ1Y29tbS5oIGJ1ZGJnLmggY29mZmdyb2suaCBkZWJ1Zy5oIG5sbWNvbnYuaCBkbGx0b29sLmggXAotCXdpbmRyZXMuaCB3aW5kdW5pLmggZHluLXN0cmluZy5oCi0KLUdFTkVSQVRFRF9IRklMRVMgPSBhcnBhcnNlLmggc3lzcm9mZi5oIHN5c2luZm8uaCBkZWZwYXJzZS5oCi0KLUNGSUxFUyA9IGFkZHIybGluZS5jIGFyLmMgYXJzdXAuYyBidWNvbW0uYyBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgZGVidWcuYyBcCi0JZGxsdG9vbC5jIGZpbGVtb2RlLmMgaWVlZS5jIGlzLXJhbmxpYi5jIGlzLXN0cmlwLmMgbWF5YmUtcmFubGliLmMgXAotCW1heWJlLXN0cmlwLmMgbmxtY29udi5jIG5tLmMgbm90LXJhbmxpYi5jIG5vdC1zdHJpcC5jIFwKLQlvYmpjb3B5LmMgb2JqZHVtcC5jIHByZGJnLmMgcmRjb2ZmLmMgcmRkYmcuYyBzaXplLmMgc3Jjb252LmMgXAotCXN0YWJzLmMgc3RyaW5ncy5jIHN5c2R1bXAuYyB2ZXJzaW9uLmMgd3JzdGFicy5jIFwKLQl3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgd2luZHVuaS5jIHJlYWRlbGYuYyBcCi0JcmVzcmVzLmMgZHluLXN0cmluZy5jIGRsbHdyYXAuYyByZW5hbWUuYwotCi1HRU5FUkFURURfQ0ZJTEVTID0gXAotCXVuZGVyc2NvcmUuYyBhcnBhcnNlLmMgYXJsZXguYyBzeXNyb2ZmLmMgc3lzaW5mby5jIHN5c2xleC5jIFwKLQlkZWZwYXJzZS5jIGRlZmxleC5jIG5sbWhlYWRlci5jIHJjcGFyc2UuYyByY2xleC5jCi0KLURFQlVHX1NSQ1MgPSByZGRiZy5jIGRlYnVnLmMgc3RhYnMuYyBpZWVlLmMgcmRjb2ZmLmMKLVdSSVRFX0RFQlVHX1NSQ1MgPSAkKERFQlVHX1NSQ1MpIHdyc3RhYnMuYwotCi0jIENvZGUgc2hhcmVkIGJ5IGFsbCB0aGUgYmludXRpbHMuCi1CVUxJQlMgPSBidWNvbW0uYyB2ZXJzaW9uLmMgZmlsZW1vZGUuYwotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi0KLU9QQ09ERVMgPSAuLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKLQotTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLVBPVEZJTEVTID0gJChDRklMRVMpICQoREVCVUdfU1JDUykgJChIRklMRVMpCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi1SVU5URVNUID0gYGlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCi0gICAgICAgICAgIGVjaG8gJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLSAgICAgICAgICAgZWxzZSBlY2hvIHJ1bnRlc3QgOyAgZmlgCi0KLUNDX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDQyk7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0Jc3JjZGlyPWBjZCAkKHNyY2RpcikgJiYgcHdkYDsgZXhwb3J0IHNyY2RpcjsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3JjZGlyfS90ZXN0c3VpdGUgXAotCQlDQ19GT1JfVEFSR0VUPSIkKENDX0ZPUl9UQVJHRVQpIiBcCi0JCUNGTEFHU19GT1JfVEFSR0VUPSIkKENGTEFHUykiICQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotaW5zdGFsbGNoZWNrOgotCS9iaW4vc2ggJChzcmNkaXIpL3Nhbml0eS5zaCAkKGJpbmRpcikKLQotaW5mb19URVhJTkZPUyA9IGJpbnV0aWxzLnRleGkKLQotTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLXNpemVfU09VUkNFUyA9IHNpemUuYyAkKEJVTElCUykKLQotb2JqY29weV9TT1VSQ0VTID0gb2JqY29weS5jIG5vdC1zdHJpcC5jIHJlbmFtZS5jICQoV1JJVEVfREVCVUdfU1JDUykgJChCVUxJQlMpCi0KLXN0cmluZ3NfU09VUkNFUyA9IHN0cmluZ3MuYyAkKEJVTElCUykKLQotcmVhZGVsZl9TT1VSQ0VTID0gcmVhZGVsZi5jIHZlcnNpb24uYwotcmVhZGVsZl9MREFERCAgID0gJChJTlRMTElCUykgJChMSUJJQkVSVFkpCi0KLXN0cmlwX25ld19TT1VSQ0VTID0gb2JqY29weS5jIGlzLXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotbm1fbmV3X1NPVVJDRVMgPSBubS5jICQoQlVMSUJTKQotCi1vYmpkdW1wX1NPVVJDRVMgPSBvYmpkdW1wLmMgcHJkYmcuYyAkKERFQlVHX1NSQ1MpICQoQlVMSUJTKQotb2JqZHVtcF9MREFERCA9ICQoT1BDT0RFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi11bmRlcnNjb3JlLmM6IHN0YW1wLXVuZGVyIDsgQHRydWUKLQotc3RhbXAtdW5kZXI6IE1ha2VmaWxlCi0JZWNobyAnLypXQVJOSU5HOiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQhKi8nID51bmRlcnNjb3JlLnQKLQllY2hvICJpbnQgcHJlcGVuZHNfdW5kZXJzY29yZSA9IEBVTkRFUlNDT1JFQDsiID4+dW5kZXJzY29yZS50Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHVuZGVyc2NvcmUudCB1bmRlcnNjb3JlLmMKLQl0b3VjaCBzdGFtcC11bmRlcgotCi1jcGx1cy1kZW0ubzogJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMgJChJTkNESVIpL2dldG9wdC5oCi0JJChDT01QSUxFKSAtYyAtRE1BSU4gLURWRVJTSU9OPSciJChWRVJTSU9OKSInICQoQkFTRURJUikvbGliaWJlcnR5L2NwbHVzLWRlbS5jCi0KLWNfX2ZpbHRfU09VUkNFUyA9Ci1jX19maWx0X0xEQUREID0gY3BsdXMtZGVtLm8gdW5kZXJzY29yZS5vICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1hcl9TT1VSQ0VTID0gYXJwYXJzZS55IGFybGV4LmwgYXIuYyBub3QtcmFubGliLmMgYXJzdXAuYyByZW5hbWUuYyAkKEJVTElCUykKLWFyX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1yYW5saWJfU09VUkNFUyA9IGFyLmMgaXMtcmFubGliLmMgYXJwYXJzZS55IGFybGV4LmwgYXJzdXAuYyByZW5hbWUuYyAkKEJVTElCUykKLXJhbmxpYl9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotYWRkcjJsaW5lX1NPVVJDRVMgPSBhZGRyMmxpbmUuYyAkKEJVTElCUykKLQotIyBUaGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBjb252ZXJ0aW9uIHRvIGF1dG9tYWtlLgotIyBUaGlzIHJ1bGUgY3JlYXRlcyBhIHNpbmdsZSBiaW5hcnkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWIKLSMgYnkgbG9va2luZyBhdCBhcmd2WzBdLiAgVXNlIHRoaXMga2x1ZGdlIHRvIHNhdmUgc29tZSBkaXNrIHNwYWNlLgotIyBIb3dldmVyLCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoaW5ncyBieSBoYW5kLgotIyAoVGhhdCBpcyBhZnRlciAnbWFrZSBpbnN0YWxsJywgcmVwbGFjZSB0aGUgaW5zdGFsbGVkIHJhbmxpYiBieSBhIGxpbmsgdG8gYXIuKQotIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGluc3RhbGwgcmFubGliLnNoIGFzIHJhbmxpYi4KLSMgYXJfd2l0aF9yYW5saWI6ICQoQURETF9ERVBTKSBhci5vIG1heWJlLXJhbmxpYi5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKEFSX1BST0cpIGFyLm8gbWF5YmUtcmFubGliLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChSQU5MSUJfUFJPRykKLSMJLWxuICQoQVJfUFJPRykgJChSQU5MSUJfUFJPRykKLSMKLSMgb2JqY29weSBhbmQgc3RyaXAgaW4gb25lIGJpbmFyeSB0aGF0IHVzZXMgYXJndlswXSB0byBkZWNpZGUgaXRzIGFjdGlvbi4KLSMKLSNvYmpjb3B5X3dpdGhfc3RyaXA6ICQoQURETF9ERVBTKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChPQkpDT1BZX1BST0cpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoU1RSSVBfUFJPRykKLSMJLWxuICQoT0JKQ09QWV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLXN5c3JvZmYuYzogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvIAotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWMgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWkgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1nIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0KLXN5c3JvZmYuaDogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZCA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5oCi0KLXN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpOiBzeXNpbmZvLm8gc3lzbGV4Lm8KLQkkKENDX0ZPUl9CVUlMRCkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgc3lzaW5mby5vIHN5c2xleC5vIAotCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi0JaWYgWyAtciBzeXNsZXguYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNsZXguYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzbGV4LmMgO1wKLQlmaQotCi1zeXNpbmZvLm86IHN5c2luZm8uYwotCWlmIFsgLXIgc3lzaW5mby5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2luZm8uYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzaW5mby5jIDsgXAotCWZpCi0KLXNyY29udl9TT1VSQ0VTID0gc3Jjb252LmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotZGxsdG9vbF9TT1VSQ0VTID0gZGxsdG9vbC5jIGRlZnBhcnNlLnkgZGVmbGV4LmwgZHluLXN0cmluZy5jICQoQlVMSUJTKQotZGxsdG9vbF9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotZGxsdG9vbC5vOmRsbHRvb2wuYwotCSQoQ09NUElMRSkgLWMgJChETExUT09MX0RFRlMpICQoc3JjZGlyKS9kbGx0b29sLmMKLQotcmVzY29mZi5vOnJlc2NvZmYuYwotCSQoQ09NUElMRSkgLWMgJChETExUT09MX0RFRlMpICQoc3JjZGlyKS9yZXNjb2ZmLmMKLQotY29mZmR1bXBfU09VUkNFUyA9IGNvZmZkdW1wLmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotc3lzZHVtcF9TT1VSQ0VTID0gc3lzZHVtcC5jICQoQlVMSUJTKQotCi0jIGNvZmYvc3ltLmggYW5kIGNvZmYvZWNvZmYuaCB3b24ndCBiZSBmb3VuZCBieSB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kKLSMgc2NyaXB0cywgc2luY2UgdGhleSBhcmUgb25seSBpbmNsdWRlZCBjb25kaXRpb25hbGx5LgotbmxtY29udi5vOiBubG1jb252LmMgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCWxkbmFtZT1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQkkKENPTVBJTEUpIC1jIC1ETERfTkFNRT0iXCIkJHtsZG5hbWV9XCIiIEBOTE1DT05WX0RFRlNAICQoc3JjZGlyKS9ubG1jb252LmMKLQotbmxtY29udl9TT1VSQ0VTID0gbmxtY29udi5jIG5sbWhlYWRlci55ICQoQlVMSUJTKQotCi13aW5kcmVzX1NPVVJDRVMgPSB3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgcmNwYXJzZS55IHJjbGV4LmwgXAotCXdpbmR1bmkuYyByZXNyZXMuYyAkKEJVTElCUykKLXdpbmRyZXNfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWRsbHdyYXBfU09VUkNFUyA9IGRsbHdyYXAuYyBkeW4tc3RyaW5nLmMgCi1kbGx3cmFwX0xEQUREID0gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLQotRElTVFNUVUZGID0gYXJwYXJzZS5jIGFycGFyc2UuaCBhcmxleC5jIG5sbWhlYWRlci5jIHN5c2luZm8uYyBzeXNpbmZvLmggXAotCXN5c2xleC5jIGRlZmxleC5jIGRlZnBhcnNlLmggZGVmcGFyc2UuYyByY2xleC5jIHJjcGFyc2UuaCByY3BhcnNlLmMKLQotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi1ESVNUQ0xFQU5GSUxFUyA9IHN0YW1wLXVuZGVyIHN5c2luZm8gdW5kZXJzY29yZS5jIHN5c3JvZmYuYyBzeXNyb2ZmLmggXAotCXNpdGUuZXhwIHNpdGUuYmFrCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwuZGVwMSA+LmRlcAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgLmRlcDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JJChERVApIC1mIC5kZXAyICQoSU5DTFVERVMpICQ/Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCW9iamRpcj1gcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScJXAotCQktZSAicyFAT0JKRElSQCEkJHtvYmpkaXJ9ISIKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyMjCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotY29uZmlnLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgY29uZmlnLnRleGkKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiBjb25maWcudGV4aQotCi1iaW51dGlscy5kdmk6ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLWJpbnV0aWxzLmluZm86ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gY29uZmlnLnRleGkKLQotJChERU1BTkdMRVJfUFJPRykuMTogY3h4ZmlsdC5tYW4gTWFrZWZpbGUKLQlzZWQgLWUgJ3MvQFBST0dSQU1ALyQoREVNQU5HTEVSX1BST0cpLycgPCAkKHNyY2RpcikvY3h4ZmlsdC5tYW4gXAotCQk+ICQoREVNQU5HTEVSX1BST0cpLjEKLQotTU9TVExZQ0xFQU5GSUxFUyA9IHN5c2luZm8gJChERU1BTkdMRVJfUFJPRykuMSBiaW51dGlscy5sb2cgYmludXRpbHMuc3VtIFwKLQlhYmNkZWZnaCoKLW1vc3RseWNsZWFuLWxvY2FsOgotCS1ybSAtcmYgdG1wZGlyCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIC5kZXAgLmRlcDEKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiAkKGJpbl9QUk9HUkFNUykgJChub2luc3RfUFJPR1JBTVMpCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0JJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgotCWZvciBpIGluICQoVE9PTF9QUk9HUyk7IGRvIFwKLQkgIGlmIFsgLWYgJCRpJChFWEVFWFQpIF07IHRoZW4gXAotCSAgICBqPWBlY2hvICQkaSB8IHNlZCAtZSAncy8tbmV3Ly8nYDsgXAotCSAgICBrPWBlY2hvICQkaiB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQkgICAgaWYgWyAiJChiaW5kaXIpLyQkayQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKSIgXTsgdGhlbiBcCi0JICAgICAgcm0gLWYgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCi0JICAgICAgbG4gJChiaW5kaXIpLyQkayQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JCXx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkaSQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCk7IFwKLQkgICAgZmk7IFwKLQkgIGVsc2UgdHJ1ZTsgXAotCSAgZmk7IFwKLQlkb25lCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWFkZHIybGluZS5vOiBhZGRyMmxpbmUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotYXIubzogYXIuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggJChCRkRESVIpL2xpYmJmZC5oIGFyc3VwLmgKLWFyc3VwLm86IGFyc3VwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYXJzdXAuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotYnVjb21tLm86IGJ1Y29tbS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1jb2ZmZHVtcC5vOiBjb2ZmZHVtcC5jIGNvZmZncm9rLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1jb2ZmZ3Jvay5vOiBjb2ZmZ3Jvay5jIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZncm9rLmgKLWRlYnVnLm86IGRlYnVnLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oCi1kbGx0b29sLm86IGRsbHRvb2wuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBkeW4tc3RyaW5nLmggXAotICBkbGx0b29sLmgKLWZpbGVtb2RlLm86IGZpbGVtb2RlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotaWVlZS5vOiBpZWVlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9pZWVlLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotaXMtcmFubGliLm86IGlzLXJhbmxpYi5jCi1pcy1zdHJpcC5vOiBpcy1zdHJpcC5jCi1tYXliZS1yYW5saWIubzogbWF5YmUtcmFubGliLmMKLW1heWJlLXN0cmlwLm86IG1heWJlLXN0cmlwLmMKLW5sbWNvbnYubzogbmxtY29udi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChCRkRESVIpL2xpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbWNvbnYuaAotbm0ubzogbm0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL3Byb2dyZXNzLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9nZXRvcHQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvcmFubGliLmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLW5vdC1yYW5saWIubzogbm90LXJhbmxpYi5jCi1ub3Qtc3RyaXAubzogbm90LXN0cmlwLmMKLW9iamNvcHkubzogb2JqY29weS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1ZGJnLmgKLW9iamR1bXAubzogb2JqZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCBcCi0gICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCBkZWJ1Zy5oIGJ1ZGJnLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLXByZGJnLm86IHByZGJnLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLXJkY29mZi5vOiByZGNvZmYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBcCi0gIGJ1ZGJnLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1yZGRiZy5vOiByZGRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1zaXplLm86IHNpemUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2dldG9wdC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXNyY29udi5vOiBzcmNvbnYuYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgc3lzcm9mZi5oIGNvZmZncm9rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzeXNyb2ZmLmMKLXN0YWJzLm86IHN0YWJzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCBkZWJ1Zy5oIGJ1ZGJnLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdHJpbmdzLm86IHN0cmluZ3MuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3lzZHVtcC5vOiBzeXNkdW1wLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBzeXNyb2ZmLmggXAotICBzeXNyb2ZmLmMKLXZlcnNpb24ubzogdmVyc2lvbi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLXdyc3RhYnMubzogd3JzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotd2luZHJlcy5vOiB3aW5kcmVzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL29ic3RhY2suaCB3aW5kcmVzLmggXAotICB3aW5kdW5pLmgKLXJlc3JjLm86IHJlc3JjLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1yZXNjb2ZmLm86IHJlc2NvZmYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotcmVzYmluLm86IHJlc2Jpbi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotd2luZHVuaS5vOiB3aW5kdW5pLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCB3aW5kdW5pLmgKLXJlYWRlbGYubzogcmVhZGVsZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZHdhcmYyLmggJChJTkNESVIpL2VsZi9pMzg2LmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9taXBzLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL202OGsuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL20zMnIuaCAkKElOQ0RJUikvZWxmL2QxMHYuaCBcCi0gICQoSU5DRElSKS9lbGYvZDMwdi5oICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL21uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9lbGYvbW4xMDMwMC5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL2ZyMzAuaCAkKElOQ0RJUikvZWxmL21jb3JlLmggJChJTkNESVIpL2VsZi9pOTYwLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9nZXRvcHQuaAotcmVzcmVzLm86IHJlc3Jlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotZHluLXN0cmluZy5vOiBkeW4tc3RyaW5nLmMgY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBkeW4tc3RyaW5nLmgKLWRsbHdyYXAubzogZGxsd3JhcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oIGR5bi1zdHJpbmcuaAotcmVuYW1lLm86IHJlbmFtZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLXVuZGVyc2NvcmUubzogdW5kZXJzY29yZS5jCi1hcnBhcnNlLm86IGFycGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGFyc3VwLmgKLWFybGV4Lm86IGFybGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGFycGFyc2UuaAotc3lzcm9mZi5vOiBzeXNyb2ZmLmMKLXN5c2luZm8ubzogc3lzaW5mby5jCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi1kZWZwYXJzZS5vOiBkZWZwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggZGxsdG9vbC5oCi1kZWZsZXgubzogZGVmbGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgZGVmcGFyc2UuaCBkbGx0b29sLmgKLW5sbWhlYWRlci5vOiBubG1oZWFkZXIuYyAuLi9iZmQvYmZkLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgbmxtY29udi5oCi1yY3BhcnNlLm86IHJjcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXJjbGV4Lm86IHJjbGV4LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oIHJjcGFyc2UuaAotCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL01ha2VmaWxlLmluIGIvYmludXRpbHMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzQ4OGYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzYxICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFSID0gQEFSQAotQVMgPSBAQVNACi1CVUlMRF9ETExUT09MID0gQEJVSUxEX0RMTFRPT0xACi1CVUlMRF9ETExXUkFQID0gQEJVSUxEX0RMTFdSQVBACi1CVUlMRF9NSVNDID0gQEJVSUxEX01JU0NACi1CVUlMRF9OTE1DT05WID0gQEJVSUxEX05MTUNPTlZACi1CVUlMRF9TUkNPTlYgPSBAQlVJTERfU1JDT05WQAotQlVJTERfV0lORFJFUyA9IEBCVUlMRF9XSU5EUkVTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLURMTFRPT0xfREVGUyA9IEBETExUT09MX0RFRlNACi1FWEVFWFQgPSBARVhFRVhUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTkxNQ09OVl9ERUZTID0gQE5MTUNPTlZfREVGU0AKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVU5ERVJTQ09SRSA9IEBVTkRFUlNDT1JFQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRyA9IGFyCi1SQU5MSUJfUFJPRyA9IHJhbmxpYgotCi0jIG9iamNvcHkgYW5kIHN0cmlwIHNob3VsZCBiZSB0aGUgc2FtZSBwcm9ncmFtCi1PQkpDT1BZX1BST0cgPSBvYmpjb3B5Ci1TVFJJUF9QUk9HID0gc3RyaXAtbmV3Ci0KLVNUUklOR1NfUFJPRyA9IHN0cmluZ3MKLQotUkVBREVMRl9QUk9HID0gcmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0cgPSBzaXplCi1OTV9QUk9HID0gbm0tbmV3Ci1PQkpEVU1QX1BST0cgPSBvYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0cgPSBjKytmaWx0Ci0KLUFERFIyTElORV9QUk9HID0gYWRkcjJsaW5lCi0KLU5MTUNPTlZfUFJPRyA9IG5sbWNvbnYKLURMTFRPT0xfUFJPRyA9IGRsbHRvb2wKLVdJTkRSRVNfUFJPRyA9IHdpbmRyZXMKLURMTFdSQVBfUFJPRyA9IGRsbHdyYXAKLQotU1JDT05WX1BST0cgPSBzcmNvbnYkKEVYRUVYVCkgc3lzZHVtcCQoRVhFRVhUKSBjb2ZmZHVtcCQoRVhFRVhUKSAKLQotbWFuX01BTlMgPSBhci4xIG5tLjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMSBzdHJpbmdzLjEgc3RyaXAuMSBvYmpjb3B5LjEgXAotCWFkZHIybGluZS4xIG5sbWNvbnYuMSAkKERFTUFOR0xFUl9QUk9HKS4xCi0KLQotUFJPR1MgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoTk1fUFJPRykgJChBUl9QUk9HKSAkKFNUUklOR1NfUFJPRykgJChTVFJJUF9QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotYmluX1BST0dSQU1TID0gJChTSVpFX1BST0cpICQoT0JKRFVNUF9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotbm9pbnN0X1BST0dSQU1TID0gJChOTV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLUVYVFJBX1BST0dSQU1TID0gJChOTE1DT05WX1BST0cpIHNyY29udiBzeXNkdW1wIGNvZmZkdW1wICQoRExMVE9PTF9QUk9HKSAkKFdJTkRSRVNfUFJPRykgJChETExXUkFQX1BST0cpCi0KLSMgU3R1ZmYgdGhhdCBnb2VzIGluIHRvb2xkaXIvIGlmIGFwcHJvcHJpYXRlCi1UT09MX1BST0dTID0gbm0tbmV3IHN0cmlwLW5ldyBhciByYW5saWIgZGxsdG9vbAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLURFUCA9IG1rZGVwCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLUhGSUxFUyA9IGFyc3VwLmggYnVjb21tLmggYnVkYmcuaCBjb2ZmZ3Jvay5oIGRlYnVnLmggbmxtY29udi5oIGRsbHRvb2wuaCBcCi0Jd2luZHJlcy5oIHdpbmR1bmkuaCBkeW4tc3RyaW5nLmgKLQotCi1HRU5FUkFURURfSEZJTEVTID0gYXJwYXJzZS5oIHN5c3JvZmYuaCBzeXNpbmZvLmggZGVmcGFyc2UuaAotCi1DRklMRVMgPSBhZGRyMmxpbmUuYyBhci5jIGFyc3VwLmMgYnVjb21tLmMgY29mZmR1bXAuYyBjb2ZmZ3Jvay5jIGRlYnVnLmMgXAotCWRsbHRvb2wuYyBmaWxlbW9kZS5jIGllZWUuYyBpcy1yYW5saWIuYyBpcy1zdHJpcC5jIG1heWJlLXJhbmxpYi5jIFwKLQltYXliZS1zdHJpcC5jIG5sbWNvbnYuYyBubS5jIG5vdC1yYW5saWIuYyBub3Qtc3RyaXAuYyBcCi0Jb2JqY29weS5jIG9iamR1bXAuYyBwcmRiZy5jIHJkY29mZi5jIHJkZGJnLmMgc2l6ZS5jIHNyY29udi5jIFwKLQlzdGFicy5jIHN0cmluZ3MuYyBzeXNkdW1wLmMgdmVyc2lvbi5jIHdyc3RhYnMuYyBcCi0Jd2luZHJlcy5jIHJlc3JjLmMgcmVzY29mZi5jIHJlc2Jpbi5jIHdpbmR1bmkuYyByZWFkZWxmLmMgXAotCXJlc3Jlcy5jIGR5bi1zdHJpbmcuYyBkbGx3cmFwLmMgcmVuYW1lLmMKLQotCi1HRU5FUkFURURfQ0ZJTEVTID0gXAotCXVuZGVyc2NvcmUuYyBhcnBhcnNlLmMgYXJsZXguYyBzeXNyb2ZmLmMgc3lzaW5mby5jIHN5c2xleC5jIFwKLQlkZWZwYXJzZS5jIGRlZmxleC5jIG5sbWhlYWRlci5jIHJjcGFyc2UuYyByY2xleC5jCi0KLQotREVCVUdfU1JDUyA9IHJkZGJnLmMgZGVidWcuYyBzdGFicy5jIGllZWUuYyByZGNvZmYuYwotV1JJVEVfREVCVUdfU1JDUyA9ICQoREVCVUdfU1JDUykgd3JzdGFicy5jCi0KLSMgQ29kZSBzaGFyZWQgYnkgYWxsIHRoZSBiaW51dGlscy4KLUJVTElCUyA9IGJ1Y29tbS5jIHZlcnNpb24uYyBmaWxlbW9kZS5jCi0KLUJGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKLQotT1BDT0RFUyA9IC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChERUJVR19TUkNTKSAkKEhGSUxFUykKLQotRVhQRUNUID0gYGlmIFsgLWYgJCRyLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gJCRyLy4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCi0gICAgICAgICAgIGVjaG8gJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLSAgICAgICAgICAgZWxzZSBlY2hvIHJ1bnRlc3QgOyAgZmlgCi0KLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotCi1pbmZvX1RFWElORk9TID0gYmludXRpbHMudGV4aQotCi1MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotc2l6ZV9TT1VSQ0VTID0gc2l6ZS5jICQoQlVMSUJTKQotCi1vYmpjb3B5X1NPVVJDRVMgPSBvYmpjb3B5LmMgbm90LXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotc3RyaW5nc19TT1VSQ0VTID0gc3RyaW5ncy5jICQoQlVMSUJTKQotCi1yZWFkZWxmX1NPVVJDRVMgPSByZWFkZWxmLmMgdmVyc2lvbi5jCi1yZWFkZWxmX0xEQUREID0gJChJTlRMTElCUykgJChMSUJJQkVSVFkpCi0KLXN0cmlwX25ld19TT1VSQ0VTID0gb2JqY29weS5jIGlzLXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotbm1fbmV3X1NPVVJDRVMgPSBubS5jICQoQlVMSUJTKQotCi1vYmpkdW1wX1NPVVJDRVMgPSBvYmpkdW1wLmMgcHJkYmcuYyAkKERFQlVHX1NSQ1MpICQoQlVMSUJTKQotb2JqZHVtcF9MREFERCA9ICQoT1BDT0RFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1jX19maWx0X1NPVVJDRVMgPSAKLWNfX2ZpbHRfTERBREQgPSBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLWFyX1NPVVJDRVMgPSBhcnBhcnNlLnkgYXJsZXgubCBhci5jIG5vdC1yYW5saWIuYyBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotYXJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLXJhbmxpYl9TT1VSQ0VTID0gYXIuYyBpcy1yYW5saWIuYyBhcnBhcnNlLnkgYXJsZXgubCBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotcmFubGliX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1hZGRyMmxpbmVfU09VUkNFUyA9IGFkZHIybGluZS5jICQoQlVMSUJTKQotCi1zcmNvbnZfU09VUkNFUyA9IHNyY29udi5jIGNvZmZncm9rLmMgJChCVUxJQlMpCi0KLWRsbHRvb2xfU09VUkNFUyA9IGRsbHRvb2wuYyBkZWZwYXJzZS55IGRlZmxleC5sIGR5bi1zdHJpbmcuYyAkKEJVTElCUykKLWRsbHRvb2xfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWNvZmZkdW1wX1NPVVJDRVMgPSBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgJChCVUxJQlMpCi0KLXN5c2R1bXBfU09VUkNFUyA9IHN5c2R1bXAuYyAkKEJVTElCUykKLQotbmxtY29udl9TT1VSQ0VTID0gbmxtY29udi5jIG5sbWhlYWRlci55ICQoQlVMSUJTKQotCi13aW5kcmVzX1NPVVJDRVMgPSB3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgcmNwYXJzZS55IHJjbGV4LmwgXAotCXdpbmR1bmkuYyByZXNyZXMuYyAkKEJVTElCUykKLQotd2luZHJlc19MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotZGxsd3JhcF9TT1VSQ0VTID0gZGxsd3JhcC5jIGR5bi1zdHJpbmcuYyAKLWRsbHdyYXBfTERBREQgPSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotRElTVFNUVUZGID0gYXJwYXJzZS5jIGFycGFyc2UuaCBhcmxleC5jIG5sbWhlYWRlci5jIHN5c2luZm8uYyBzeXNpbmZvLmggXAotCXN5c2xleC5jIGRlZmxleC5jIGRlZnBhcnNlLmggZGVmcGFyc2UuYyByY2xleC5jIHJjcGFyc2UuaCByY3BhcnNlLmMKLQotCi1ESVNUQ0xFQU5GSUxFUyA9IHN0YW1wLXVuZGVyIHN5c2luZm8gdW5kZXJzY29yZS5jIHN5c3JvZmYuYyBzeXNyb2ZmLmggXAotCXNpdGUuZXhwIHNpdGUuYmFrCi0KLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBjb25maWcudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gc3lzaW5mbyAkKERFTUFOR0xFUl9QUk9HKS4xIGJpbnV0aWxzLmxvZyBiaW51dGlscy5zdW0gXAotCWFiY2RlZmdoKgotCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIC5kZXAgLmRlcDEKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1iaW5fUFJPR1JBTVMgPSAgc2l6ZSQoRVhFRVhUKSBvYmpkdW1wJChFWEVFWFQpIGFyJChFWEVFWFQpIFwKLXN0cmluZ3MkKEVYRUVYVCkgcmFubGliJChFWEVFWFQpIGMrK2ZpbHQkKEVYRUVYVCkgb2JqY29weSQoRVhFRVhUKSBcCi1AQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCBcCi1hZGRyMmxpbmUkKEVYRUVYVCkgcmVhZGVsZiQoRVhFRVhUKSBAQlVJTERfRExMV1JBUEAgQEJVSUxEX01JU0NACi1ub2luc3RfUFJPR1JBTVMgPSAgbm0tbmV3JChFWEVFWFQpIHN0cmlwLW5ldyQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChiaW5fUFJPR1JBTVMpICQobm9pbnN0X1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1ubG1jb252X09CSkVDVFMgPSAgbmxtY29udi5vIG5sbWhlYWRlci5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1ubG1jb252X0xEQUREID0gJChMREFERCkKLW5sbWNvbnZfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1ubG1jb252X0xERkxBR1MgPSAKLXNyY29udl9PQkpFQ1RTID0gIHNyY29udi5vIGNvZmZncm9rLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXNyY29udl9MREFERCA9ICQoTERBREQpCi1zcmNvbnZfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zcmNvbnZfTERGTEFHUyA9IAotc3lzZHVtcF9PQkpFQ1RTID0gIHN5c2R1bXAubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3lzZHVtcF9MREFERCA9ICQoTERBREQpCi1zeXNkdW1wX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3lzZHVtcF9MREZMQUdTID0gCi1jb2ZmZHVtcF9PQkpFQ1RTID0gIGNvZmZkdW1wLm8gY29mZmdyb2subyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotY29mZmR1bXBfTERBREQgPSAkKExEQUREKQotY29mZmR1bXBfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1jb2ZmZHVtcF9MREZMQUdTID0gCi1kbGx0b29sX09CSkVDVFMgPSAgZGxsdG9vbC5vIGRlZnBhcnNlLm8gZGVmbGV4Lm8gZHluLXN0cmluZy5vIGJ1Y29tbS5vIFwKLXZlcnNpb24ubyBmaWxlbW9kZS5vCi1kbGx0b29sX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZGxsdG9vbF9MREZMQUdTID0gCi13aW5kcmVzX09CSkVDVFMgPSAgd2luZHJlcy5vIHJlc3JjLm8gcmVzY29mZi5vIHJlc2Jpbi5vIHJjcGFyc2UubyBcCi1yY2xleC5vIHdpbmR1bmkubyByZXNyZXMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotd2luZHJlc19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXdpbmRyZXNfTERGTEFHUyA9IAotZGxsd3JhcF9PQkpFQ1RTID0gIGRsbHdyYXAubyBkeW4tc3RyaW5nLm8KLWRsbHdyYXBfREVQRU5ERU5DSUVTID0gIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZGxsd3JhcF9MREZMQUdTID0gCi1zaXplX09CSkVDVFMgPSAgc2l6ZS5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zaXplX0xEQUREID0gJChMREFERCkKLXNpemVfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zaXplX0xERkxBR1MgPSAKLW9iamR1bXBfT0JKRUNUUyA9ICBvYmpkdW1wLm8gcHJkYmcubyByZGRiZy5vIGRlYnVnLm8gc3RhYnMubyBpZWVlLm8gXAotcmRjb2ZmLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW9iamR1bXBfREVQRU5ERU5DSUVTID0gIC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYSAuLi9iZmQvbGliYmZkLmxhIFwKLS4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotb2JqZHVtcF9MREZMQUdTID0gCi1hcl9PQkpFQ1RTID0gIGFycGFyc2UubyBhcmxleC5vIGFyLm8gbm90LXJhbmxpYi5vIGFyc3VwLm8gcmVuYW1lLm8gXAotYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLWFyX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotYXJfTERGTEFHUyA9IAotc3RyaW5nc19PQkpFQ1RTID0gIHN0cmluZ3MubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3RyaW5nc19MREFERCA9ICQoTERBREQpCi1zdHJpbmdzX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3RyaW5nc19MREZMQUdTID0gCi1yYW5saWJfT0JKRUNUUyA9ICBhci5vIGlzLXJhbmxpYi5vIGFycGFyc2UubyBhcmxleC5vIGFyc3VwLm8gcmVuYW1lLm8gXAotYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXJhbmxpYl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXJhbmxpYl9MREZMQUdTID0gCi1jX19maWx0X09CSkVDVFMgPSAKLWNfX2ZpbHRfREVQRU5ERU5DSUVTID0gIGNwbHVzLWRlbS5vIHVuZGVyc2NvcmUubyBcCi0uLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWNfX2ZpbHRfTERGTEFHUyA9IAotb2JqY29weV9PQkpFQ1RTID0gIG9iamNvcHkubyBub3Qtc3RyaXAubyByZW5hbWUubyByZGRiZy5vIGRlYnVnLm8gXAotc3RhYnMubyBpZWVlLm8gcmRjb2ZmLm8gd3JzdGFicy5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1vYmpjb3B5X0xEQUREID0gJChMREFERCkKLW9iamNvcHlfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1vYmpjb3B5X0xERkxBR1MgPSAKLWFkZHIybGluZV9PQkpFQ1RTID0gIGFkZHIybGluZS5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1hZGRyMmxpbmVfTERBREQgPSAkKExEQUREKQotYWRkcjJsaW5lX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotYWRkcjJsaW5lX0xERkxBR1MgPSAKLXJlYWRlbGZfT0JKRUNUUyA9ICByZWFkZWxmLm8gdmVyc2lvbi5vCi1yZWFkZWxmX0RFUEVOREVOQ0lFUyA9ICAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXJlYWRlbGZfTERGTEFHUyA9IAotbm1fbmV3X09CSkVDVFMgPSAgbm0ubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotbm1fbmV3X0xEQUREID0gJChMREFERCkKLW5tX25ld19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLW5tX25ld19MREZMQUdTID0gCi1zdHJpcF9uZXdfT0JKRUNUUyA9ICBvYmpjb3B5Lm8gaXMtc3RyaXAubyByZW5hbWUubyByZGRiZy5vIGRlYnVnLm8gXAotc3RhYnMubyBpZWVlLm8gcmRjb2ZmLm8gd3JzdGFicy5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zdHJpcF9uZXdfTERBREQgPSAkKExEQUREKQotc3RyaXBfbmV3X0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3RyaXBfbmV3X0xERkxBR1MgPSAKLUxFWF9PVVRQVVRfUk9PVCA9IEBMRVhfT1VUUFVUX1JPT1RACi1MRVhMSUIgPSBATEVYTElCQAotWUxXUkFQID0gJCh0b3Bfc3JjZGlyKS8uLi95bHdyYXAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGJpbnV0aWxzLmluZm8KLURWSVMgPSBiaW51dGlscy5kdmkKLVRFWElORk9TID0gYmludXRpbHMudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotTkVXUyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBhcmxleC5jIGFycGFyc2UuYyBjb25maWcuaW4gY29uZmlndXJlIFwKLWNvbmZpZ3VyZS5pbiBkZWZsZXguYyBkZWZwYXJzZS5jIG5sbWhlYWRlci5jIHJjbGV4LmMgcmNwYXJzZS5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKG5sbWNvbnZfU09VUkNFUykgJChzcmNvbnZfU09VUkNFUykgJChzeXNkdW1wX1NPVVJDRVMpICQoY29mZmR1bXBfU09VUkNFUykgJChkbGx0b29sX1NPVVJDRVMpICQod2luZHJlc19TT1VSQ0VTKSAkKGRsbHdyYXBfU09VUkNFUykgJChzaXplX1NPVVJDRVMpICQob2JqZHVtcF9TT1VSQ0VTKSAkKGFyX1NPVVJDRVMpICQoc3RyaW5nc19TT1VSQ0VTKSAkKHJhbmxpYl9TT1VSQ0VTKSAkKGNfX2ZpbHRfU09VUkNFUykgJChvYmpjb3B5X1NPVVJDRVMpICQoYWRkcjJsaW5lX1NPVVJDRVMpICQocmVhZGVsZl9TT1VSQ0VTKSAkKG5tX25ld19TT1VSQ0VTKSAkKHN0cmlwX25ld19TT1VSQ0VTKQotT0JKRUNUUyA9ICQobmxtY29udl9PQkpFQ1RTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHN5c2R1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9PQkpFQ1RTKSAkKGRsbHRvb2xfT0JKRUNUUykgJCh3aW5kcmVzX09CSkVDVFMpICQoZGxsd3JhcF9PQkpFQ1RTKSAkKHNpemVfT0JKRUNUUykgJChvYmpkdW1wX09CSkVDVFMpICQoYXJfT0JKRUNUUykgJChzdHJpbmdzX09CSkVDVFMpICQocmFubGliX09CSkVDVFMpICQoY19fZmlsdF9PQkpFQ1RTKSAkKG9iamNvcHlfT0JKRUNUUykgJChhZGRyMmxpbmVfT0JKRUNUUykgJChyZWFkZWxmX09CSkVDVFMpICQobm1fbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1iaW5QUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKLQotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW5sbWNvbnYkKEVYRUVYVCk6ICQobmxtY29udl9PQkpFQ1RTKSAkKG5sbWNvbnZfREVQRU5ERU5DSUVTKQotCUBybSAtZiBubG1jb252JChFWEVFWFQpCi0JJChMSU5LKSAkKG5sbWNvbnZfTERGTEFHUykgJChubG1jb252X09CSkVDVFMpICQobmxtY29udl9MREFERCkgJChMSUJTKQotCi1zcmNvbnYkKEVYRUVYVCk6ICQoc3Jjb252X09CSkVDVFMpICQoc3Jjb252X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3Jjb252JChFWEVFWFQpCi0JJChMSU5LKSAkKHNyY29udl9MREZMQUdTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHNyY29udl9MREFERCkgJChMSUJTKQotCi1zeXNkdW1wJChFWEVFWFQpOiAkKHN5c2R1bXBfT0JKRUNUUykgJChzeXNkdW1wX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3lzZHVtcCQoRVhFRVhUKQotCSQoTElOSykgJChzeXNkdW1wX0xERkxBR1MpICQoc3lzZHVtcF9PQkpFQ1RTKSAkKHN5c2R1bXBfTERBREQpICQoTElCUykKLQotY29mZmR1bXAkKEVYRUVYVCk6ICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGNvZmZkdW1wJChFWEVFWFQpCi0JJChMSU5LKSAkKGNvZmZkdW1wX0xERkxBR1MpICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9MREFERCkgJChMSUJTKQotCi1kbGx0b29sJChFWEVFWFQpOiAkKGRsbHRvb2xfT0JKRUNUUykgJChkbGx0b29sX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZGxsdG9vbCQoRVhFRVhUKQotCSQoTElOSykgJChkbGx0b29sX0xERkxBR1MpICQoZGxsdG9vbF9PQkpFQ1RTKSAkKGRsbHRvb2xfTERBREQpICQoTElCUykKLQotd2luZHJlcyQoRVhFRVhUKTogJCh3aW5kcmVzX09CSkVDVFMpICQod2luZHJlc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHdpbmRyZXMkKEVYRUVYVCkKLQkkKExJTkspICQod2luZHJlc19MREZMQUdTKSAkKHdpbmRyZXNfT0JKRUNUUykgJCh3aW5kcmVzX0xEQUREKSAkKExJQlMpCi0KLWRsbHdyYXAkKEVYRUVYVCk6ICQoZGxsd3JhcF9PQkpFQ1RTKSAkKGRsbHdyYXBfREVQRU5ERU5DSUVTKQotCUBybSAtZiBkbGx3cmFwJChFWEVFWFQpCi0JJChMSU5LKSAkKGRsbHdyYXBfTERGTEFHUykgJChkbGx3cmFwX09CSkVDVFMpICQoZGxsd3JhcF9MREFERCkgJChMSUJTKQotCi1zaXplJChFWEVFWFQpOiAkKHNpemVfT0JKRUNUUykgJChzaXplX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc2l6ZSQoRVhFRVhUKQotCSQoTElOSykgJChzaXplX0xERkxBR1MpICQoc2l6ZV9PQkpFQ1RTKSAkKHNpemVfTERBREQpICQoTElCUykKLQotb2JqZHVtcCQoRVhFRVhUKTogJChvYmpkdW1wX09CSkVDVFMpICQob2JqZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG9iamR1bXAkKEVYRUVYVCkKLQkkKExJTkspICQob2JqZHVtcF9MREZMQUdTKSAkKG9iamR1bXBfT0JKRUNUUykgJChvYmpkdW1wX0xEQUREKSAkKExJQlMpCi0KLWFyJChFWEVFWFQpOiAkKGFyX09CSkVDVFMpICQoYXJfREVQRU5ERU5DSUVTKQotCUBybSAtZiBhciQoRVhFRVhUKQotCSQoTElOSykgJChhcl9MREZMQUdTKSAkKGFyX09CSkVDVFMpICQoYXJfTERBREQpICQoTElCUykKLQotc3RyaW5ncyQoRVhFRVhUKTogJChzdHJpbmdzX09CSkVDVFMpICQoc3RyaW5nc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHN0cmluZ3MkKEVYRUVYVCkKLQkkKExJTkspICQoc3RyaW5nc19MREZMQUdTKSAkKHN0cmluZ3NfT0JKRUNUUykgJChzdHJpbmdzX0xEQUREKSAkKExJQlMpCi0KLXJhbmxpYiQoRVhFRVhUKTogJChyYW5saWJfT0JKRUNUUykgJChyYW5saWJfREVQRU5ERU5DSUVTKQotCUBybSAtZiByYW5saWIkKEVYRUVYVCkKLQkkKExJTkspICQocmFubGliX0xERkxBR1MpICQocmFubGliX09CSkVDVFMpICQocmFubGliX0xEQUREKSAkKExJQlMpCi0KLWMrK2ZpbHQkKEVYRUVYVCk6ICQoY19fZmlsdF9PQkpFQ1RTKSAkKGNfX2ZpbHRfREVQRU5ERU5DSUVTKQotCUBybSAtZiBjKytmaWx0JChFWEVFWFQpCi0JJChMSU5LKSAkKGNfX2ZpbHRfTERGTEFHUykgJChjX19maWx0X09CSkVDVFMpICQoY19fZmlsdF9MREFERCkgJChMSUJTKQotCi1vYmpjb3B5JChFWEVFWFQpOiAkKG9iamNvcHlfT0JKRUNUUykgJChvYmpjb3B5X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgb2JqY29weSQoRVhFRVhUKQotCSQoTElOSykgJChvYmpjb3B5X0xERkxBR1MpICQob2JqY29weV9PQkpFQ1RTKSAkKG9iamNvcHlfTERBREQpICQoTElCUykKLQotYWRkcjJsaW5lJChFWEVFWFQpOiAkKGFkZHIybGluZV9PQkpFQ1RTKSAkKGFkZHIybGluZV9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGFkZHIybGluZSQoRVhFRVhUKQotCSQoTElOSykgJChhZGRyMmxpbmVfTERGTEFHUykgJChhZGRyMmxpbmVfT0JKRUNUUykgJChhZGRyMmxpbmVfTERBREQpICQoTElCUykKLQotcmVhZGVsZiQoRVhFRVhUKTogJChyZWFkZWxmX09CSkVDVFMpICQocmVhZGVsZl9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHJlYWRlbGYkKEVYRUVYVCkKLQkkKExJTkspICQocmVhZGVsZl9MREZMQUdTKSAkKHJlYWRlbGZfT0JKRUNUUykgJChyZWFkZWxmX0xEQUREKSAkKExJQlMpCi0KLW5tLW5ldyQoRVhFRVhUKTogJChubV9uZXdfT0JKRUNUUykgJChubV9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBubS1uZXckKEVYRUVYVCkKLQkkKExJTkspICQobm1fbmV3X0xERkxBR1MpICQobm1fbmV3X09CSkVDVFMpICQobm1fbmV3X0xEQUREKSAkKExJQlMpCi0KLXN0cmlwLW5ldyQoRVhFRVhUKTogJChzdHJpcF9uZXdfT0JKRUNUUykgJChzdHJpcF9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBzdHJpcC1uZXckKEVYRUVYVCkKLQkkKExJTkspICQoc3RyaXBfbmV3X0xERkxBR1MpICQoc3RyaXBfbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChMRVgpIiAkPCAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQCAtLSAkKEFNX0xGTEFHUykgJChMRkxBR1MpCi0ueS5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCi1hcnBhcnNlLmg6IGFycGFyc2UuYwotZGVmcGFyc2UuaDogZGVmcGFyc2UuYwotbmxtaGVhZGVyLmg6IG5sbWhlYWRlci5jCi1yY3BhcnNlLmg6IHJjcGFyc2UuYwotCi0KLWJpbnV0aWxzLmluZm86IGJpbnV0aWxzLnRleGkKLWJpbnV0aWxzLmR2aTogYmludXRpbHMudGV4aQotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBiaW51dGlscy5hdXggYmludXRpbHMuY3AgYmludXRpbHMuY3BzIGJpbnV0aWxzLmR2aSBiaW51dGlscy5mbiBcCi0JICBiaW51dGlscy5mbnMgYmludXRpbHMua3kgYmludXRpbHMua3lzIGJpbnV0aWxzLnBzIFwKLQkgIGJpbnV0aWxzLmxvZyBiaW51dGlscy5wZyBiaW51dGlscy50b2MgYmludXRpbHMudHAgXAotCSAgYmludXRpbHMudHBzIGJpbnV0aWxzLnZyIGJpbnV0aWxzLnZycyBiaW51dGlscy5vcCBiaW51dGlscy50ciBcCi0JICBiaW51dGlscy5jdiBiaW51dGlscy5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLQotUlVOVEVTVEZMQUdTID0KLQotREVKQVRPT0wgPSAkKFBBQ0tBR0UpCi0KLVJVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAotCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAotCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiYXJsZXhsZGVmbGV4bHJjbGV4bGFycGFyc2VoYXJwYXJzZWNkZWZwYXJzZWhkZWZwYXJzZWNubG1oZWFkZXJobmxtaGVhZGVyY3JjcGFyc2VocmNwYXJzZWMkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgYXJsZXhsIGRlZmxleGwgcmNsZXhsIGFycGFyc2VoIGFycGFyc2VjIGRlZnBhcnNlaCBkZWZwYXJzZWMgbmxtaGVhZGVyaCBubG1oZWFkZXJjIHJjcGFyc2VoIHJjcGFyc2VjICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCQltb3N0bHljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1sb2NhbAotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIGNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIFwKLQkJY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWJpblBST0dSQU1TIFwKLQkJZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCi0JCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tYmluUFJPR1JBTVMgXAotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5QUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKLW1vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAotdW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCi1pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY2Rpcj1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNkaXI7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJQ0NfRk9SX1RBUkdFVD0iJChDQ19GT1JfVEFSR0VUKSIgXAotCQlDRkxBR1NfRk9SX1RBUkdFVD0iJChDRkxBR1MpIiAkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLWluc3RhbGxjaGVjazoKLQkvYmluL3NoICQoc3JjZGlyKS9zYW5pdHkuc2ggJChiaW5kaXIpCi0KLXVuZGVyc2NvcmUuYzogc3RhbXAtdW5kZXIgOyBAdHJ1ZQotCi1zdGFtcC11bmRlcjogTWFrZWZpbGUKLQllY2hvICcvKldBUk5JTkc6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEqLycgPnVuZGVyc2NvcmUudAotCWVjaG8gImludCBwcmVwZW5kc191bmRlcnNjb3JlID0gQFVOREVSU0NPUkVAOyIgPj51bmRlcnNjb3JlLnQKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdW5kZXJzY29yZS50IHVuZGVyc2NvcmUuYwotCXRvdWNoIHN0YW1wLXVuZGVyCi0KLWNwbHVzLWRlbS5vOiAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyAkKElOQ0RJUikvZ2V0b3B0LmgKLQkkKENPTVBJTEUpIC1jIC1ETUFJTiAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMKLQotIyBUaGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBjb252ZXJ0aW9uIHRvIGF1dG9tYWtlLgotIyBUaGlzIHJ1bGUgY3JlYXRlcyBhIHNpbmdsZSBiaW5hcnkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWIKLSMgYnkgbG9va2luZyBhdCBhcmd2WzBdLiAgVXNlIHRoaXMga2x1ZGdlIHRvIHNhdmUgc29tZSBkaXNrIHNwYWNlLgotIyBIb3dldmVyLCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoaW5ncyBieSBoYW5kLgotIyAoVGhhdCBpcyBhZnRlciAnbWFrZSBpbnN0YWxsJywgcmVwbGFjZSB0aGUgaW5zdGFsbGVkIHJhbmxpYiBieSBhIGxpbmsgdG8gYXIuKQotIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGluc3RhbGwgcmFubGliLnNoIGFzIHJhbmxpYi4KLSMgYXJfd2l0aF9yYW5saWI6ICQoQURETF9ERVBTKSBhci5vIG1heWJlLXJhbmxpYi5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKEFSX1BST0cpIGFyLm8gbWF5YmUtcmFubGliLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChSQU5MSUJfUFJPRykKLSMJLWxuICQoQVJfUFJPRykgJChSQU5MSUJfUFJPRykKLSMKLSMgb2JqY29weSBhbmQgc3RyaXAgaW4gb25lIGJpbmFyeSB0aGF0IHVzZXMgYXJndlswXSB0byBkZWNpZGUgaXRzIGFjdGlvbi4KLSMKLSNvYmpjb3B5X3dpdGhfc3RyaXA6ICQoQURETF9ERVBTKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChPQkpDT1BZX1BST0cpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoU1RSSVBfUFJPRykKLSMJLWxuICQoT0JKQ09QWV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLXN5c3JvZmYuYzogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvIAotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWMgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWkgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1nIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0KLXN5c3JvZmYuaDogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZCA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5oCi0KLXN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpOiBzeXNpbmZvLm8gc3lzbGV4Lm8KLQkkKENDX0ZPUl9CVUlMRCkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgc3lzaW5mby5vIHN5c2xleC5vIAotCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi0JaWYgWyAtciBzeXNsZXguYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNsZXguYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzbGV4LmMgO1wKLQlmaQotCi1zeXNpbmZvLm86IHN5c2luZm8uYwotCWlmIFsgLXIgc3lzaW5mby5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2luZm8uYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzaW5mby5jIDsgXAotCWZpCi0KLWRsbHRvb2wubzpkbGx0b29sLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvZGxsdG9vbC5jCi0KLXJlc2NvZmYubzpyZXNjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvcmVzY29mZi5jCi0KLSMgY29mZi9zeW0uaCBhbmQgY29mZi9lY29mZi5oIHdvbid0IGJlIGZvdW5kIGJ5IHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeQotIyBzY3JpcHRzLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkuCi1ubG1jb252Lm86IG5sbWNvbnYuYyAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0JbGRuYW1lPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSQoQ09NUElMRSkgLWMgLURMRF9OQU1FPSJcIiQke2xkbmFtZX1cIiIgQE5MTUNPTlZfREVGU0AgJChzcmNkaXIpL25sbWNvbnYuYwotCi1kaXN0c3R1ZmY6ICQoRElTVFNUVUZGKSBpbmZvCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwuZGVwMSA+LmRlcAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgLmRlcDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JJChERVApIC1mIC5kZXAyICQoSU5DTFVERVMpICQ/Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCW9iamRpcj1gcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScJXAotCQktZSAicyFAT0JKRElSQCEkJHtvYmpkaXJ9ISIKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyMjCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotY29uZmlnLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgY29uZmlnLnRleGkKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiBjb25maWcudGV4aQotCi1iaW51dGlscy5kdmk6ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLWJpbnV0aWxzLmluZm86ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLSQoREVNQU5HTEVSX1BST0cpLjE6IGN4eGZpbHQubWFuIE1ha2VmaWxlCi0Jc2VkIC1lICdzL0BQUk9HUkFNQC8kKERFTUFOR0xFUl9QUk9HKS8nIDwgJChzcmNkaXIpL2N4eGZpbHQubWFuIFwKLQkJPiAkKERFTUFOR0xFUl9QUk9HKS4xCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6ICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCi0JZm9yIGkgaW4gJChUT09MX1BST0dTKTsgZG8gXAotCSAgaWYgWyAtZiAkJGkkKEVYRUVYVCkgXTsgdGhlbiBcCi0JICAgIGo9YGVjaG8gJCRpIHwgc2VkIC1lICdzLy1uZXcvLydgOyBcCi0JICAgIGs9YGVjaG8gJCRqIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSAgICBpZiBbICIkKGJpbmRpcikvJCRrJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgICAgICBybSAtZiAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCk7IFwKLQkgICAgICBsbiAkKGJpbmRpcikvJCRrJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKLQkJfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRpJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICBmaTsgXAotCSAgZWxzZSB0cnVlOyBcCi0JICBmaTsgXAotCWRvbmUKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotYWRkcjJsaW5lLm86IGFkZHIybGluZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2RlbWFuZ2xlLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1hci5vOiBhci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaCAkKEJGRERJUikvbGliYmZkLmggYXJzdXAuaAotYXJzdXAubzogYXJzdXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBhcnN1cC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1idWNvbW0ubzogYnVjb21tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWNvZmZkdW1wLm86IGNvZmZkdW1wLmMgY29mZmdyb2suaCBidWNvbW0uaCBjb25maWcuaCBcCi0gICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWNvZmZncm9rLm86IGNvZmZncm9rLmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmdyb2suaAotZGVidWcubzogZGVidWcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmgKLWRsbHRvb2wubzogZGxsdG9vbC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGR5bi1zdHJpbmcuaCBcCi0gIGRsbHRvb2wuaAotZmlsZW1vZGUubzogZmlsZW1vZGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1pZWVlLm86IGllZWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2llZWUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1pcy1yYW5saWIubzogaXMtcmFubGliLmMKLWlzLXN0cmlwLm86IGlzLXN0cmlwLmMKLW1heWJlLXJhbmxpYi5vOiBtYXliZS1yYW5saWIuYwotbWF5YmUtc3RyaXAubzogbWF5YmUtc3RyaXAuYwotbmxtY29udi5vOiBubG1jb252LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKEJGRERJUikvbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtY29udi5oCi1ubS5vOiBubS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2dldG9wdC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9yYW5saWIuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotbm90LXJhbmxpYi5vOiBub3QtcmFubGliLmMKLW5vdC1zdHJpcC5vOiBub3Qtc3RyaXAuYwotb2JqY29weS5vOiBvYmpjb3B5LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVkYmcuaAotb2JqZHVtcC5vOiBvYmpkdW1wLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotcHJkYmcubzogcHJkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotcmRjb2ZmLm86IHJkY29mZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBkZWJ1Zy5oIFwKLSAgYnVkYmcuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLXJkZGJnLm86IHJkZGJnLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLXNpemUubzogc2l6ZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3Jjb252Lm86IHNyY29udi5jIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBzeXNyb2ZmLmggY29mZmdyb2suaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN5c3JvZmYuYwotc3RhYnMubzogc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN0cmluZ3Mubzogc3RyaW5ncy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zeXNkdW1wLm86IHN5c2R1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIHN5c3JvZmYuaCBcCi0gIHN5c3JvZmYuYwotdmVyc2lvbi5vOiB2ZXJzaW9uLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotd3JzdGFicy5vOiB3cnN0YWJzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi13aW5kcmVzLm86IHdpbmRyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvb2JzdGFjay5oIHdpbmRyZXMuaCBcCi0gIHdpbmR1bmkuaAotcmVzcmMubzogcmVzcmMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXJlc2NvZmYubzogcmVzY29mZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1yZXNiaW4ubzogcmVzYmluLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi13aW5kdW5pLm86IHdpbmR1bmkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIHdpbmR1bmkuaAotcmVhZGVsZi5vOiByZWFkZWxmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9kd2FyZjIuaCAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2VsZi92ODUwLmggJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL21pcHMuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvZDEwdi5oIFwKLSAgJChJTkNESVIpL2VsZi9kMzB2LmggJChJTkNESVIpL2VsZi9zaC5oICQoSU5DRElSKS9lbGYvbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL2k5NjAuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2dldG9wdC5oCi1yZXNyZXMubzogcmVzcmVzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1keW4tc3RyaW5nLm86IGR5bi1zdHJpbmcuYyBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGR5bi1zdHJpbmcuaAotZGxsd3JhcC5vOiBkbGx3cmFwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggZHluLXN0cmluZy5oCi1yZW5hbWUubzogcmVuYW1lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotdW5kZXJzY29yZS5vOiB1bmRlcnNjb3JlLmMKLWFycGFyc2UubzogYXJwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggYXJzdXAuaAotYXJsZXgubzogYXJsZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmggYXJwYXJzZS5oCi1zeXNyb2ZmLm86IHN5c3JvZmYuYwotc3lzaW5mby5vOiBzeXNpbmZvLmMKLXN5c2xleC5vOiBzeXNsZXguYyBzeXNpbmZvLmgKLWRlZnBhcnNlLm86IGRlZnBhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBkbGx0b29sLmgKLWRlZmxleC5vOiBkZWZsZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBkZWZwYXJzZS5oIGRsbHRvb2wuaAotbmxtaGVhZGVyLm86IG5sbWhlYWRlci5jIC4uL2JmZC9iZmQuaCBidWNvbW0uaCBjb25maWcuaCBcCi0gICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICBubG1jb252LmgKLXJjcGFyc2UubzogcmNwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmNsZXgubzogcmNsZXguYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmggcmNwYXJzZS5oCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iaW51dGlscy9ORVdTIGIvYmludXRpbHMvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyN2FkNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ORVdTCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS0qLSB0ZXh0IC0qLQotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuMTA6Ci0KLSogTmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8gb2JqZHVtcCAtTSAob3IgLS1kaXNhc3NlbWJsZXItb3B0aW9ucykgd2hpY2ggdGFrZXMKLSAgYSBwYXJhbWV0ZXIgd2hpY2ggY2FuIHRoZW4gYmUgaW50ZXJwcmV0ZWQgb24gYSBwZXItdGFyZ2V0IGJhc2lzIGJ5IHRoZQotICBkaXNhc3NlbWJsZXIuICBVc2VkIGJ5IEFSTSB0YXJnZXRzIHRvIHNlbGVjdCByZWdpc3RlciBuYW1lIHNldHMsIElTQSwgQVBDUyBvcgotICByYXcgdmVyaW9ucy4KLSAgCi0qIG9iamR1bXAgc3VwcG9ydCBmb3IgLW1pMzg2OmludGVsIHdoaWNoIGNhdXNlcyBkaXNhc3NlbWJseSB0byBiZSBkaXNwbGF5ZWQKLSAgd2l0aCBpbnRlbCBzeW50YXguCi0KLSogTmV3IHByb2dyYW06IHJlYWRlbGYuICBUaGlzIGRpc3BsYXlzIHRoZSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGVzLAotICByZWdhcmRsZXNzIG9mIHRhcmdldCBtYWNoaW5lLgotCi0qIG9iamNvcHkgbm93IHRha2VzIC0tY2hhbmdlLXNlY3Rpb24tbG1hLCAtLWNoYW5nZS1zZWN0aW9uLXZtYSwgYW5kCi0gIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcyBvcHRpb25zLiAgVGhlIG9sZCAtLWFkanVzdC1zZWN0aW9uLXZtYSBvcHRpb24gaXMKLSAgZXF1aXZhbGVudCB0byAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MuICBUaGUgb3RoZXIgLS1hZGp1c3QtKiBvcHRpb25zIGFyZSBub3cKLSAgcmVuYW1lZCB0byAtLWNoYW5nZS0qLCBhbHRob3VnaCAtLWFkanVzdC0qIGNvbnRpbnVlcyB0byB3b3JrLgotCi0qIGRsbHRvb2wgbm93IHN1cHBvcnRzIHRoZSBJTVBPUlRTIGNvbW1hbmQuCi0KLSogZGxsdG9vbCBub3cgdGFrZXMgLS1leHBvcnQtYWxsLXN5bWJvbHMsIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzLAotICAtLWV4Y2x1ZGUtc3ltYm9scywgYW5kIC0tbm8tZGVmYXVsdC1leGNsdWRlcyBvcHRpb25zLgotCi0qIG9iamNvcHkgbm93IHRha2VzIGEgLWovLS1vbmx5LXNlY3Rpb24gb3B0aW9uIHRvIGNvcHkgb25seSB0aGUgc3BlY2lmaWVkCi0gIHNlY3Rpb25zLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuOToKLQotKiBBZGRlZCB3aW5kcmVzIHByb2dyYW0sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2VzIGluIFdJTjMyCi0gIGZpbGVzIGFzIHVzZWQgb24gV2luZG93cyA5NSBhbmQgV2luZG93cyBOVC4KLQotKiBUaGUgb2JqY29weSAtLWdhcC1maWxsIGFuZCAtLXBhZC10byBvcHRpb25zIG9wZXJhdGUgb24gdGhlIExNQSByYXRoZXIgdGhhbgotICB0aGUgVk1BIG9mIHRoZSBzZWN0aW9ucy4KLQotKiBBZGRlZCBTIG1vZGlmaWVyIHRvIGFyIHRvIG5vdCBidWlsZCBhIHN5bWJvbCB0YWJsZS4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjg6Ci0KLSogVGhlIG9iamR1bXAgZGlzYXNzZW1ibHkgZm9ybWF0IGhhcyBiZWVuIGNoYW5nZWQsIGFuZCBob3BlZnVsbHkgaW1wcm92ZWQuICBVc2UKLSAgdGhlIG5ldyAtLXByZWZpeC1hZGRyZXNzZXMgb3B0aW9uIHRvIGdldCB0aGUgb2xkIGZvcm1hdC4gIFRoZXJlIGFyZSBhbHNvIG5ldwotICAtLWRpc2Fzc2VtYmxlLXplcm9lcyBhbmQgLS1uby1zaG93LXJhdy1pbnNuIG9wdGlvbnMgd2hpY2ggYWZmZWN0IGRpc2Fzc2VtYmxlcgotICBvdXRwdXQuCi0KLSogRm9ybWF0cyBtYXkgbm93IGJlIHNwZWNpZmllZCBhcyBjb25maWd1cmF0aW9uIHRyaXBsZXRzLiAgRm9yIGV4YW1wbGUsCi0gIG9iamR1bXAgLWIgaTM4Ni1wYy1saW51eC4gIFRoZSB0cmlwbGV0cyBhcmUgbm90IHBhc3NlZCB0aHJvdWdoIGNvbmZpZy5zdWIsCi0gIHNvIHRoZXkgbXVzdCBiZSBpbiBjYW5vbmljYWwgZm9ybS4KLQotKiBBZGRlZCBuZXcgYWRkcjJsaW5lIHByb2dyYW0uICBUaGlzIHVzZXMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBjb252ZXJ0Ci0gIGFuIGFkZHJlc3MgaW50byBhIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgd2l0aGluIGEgcHJvZ3JhbS4KLQotKiBBZGRlZCAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgYXJndW1lbnQgdG8gb2JqY29weS4KLQotKiBBZGRlZCAtLXdlYWtlbiBhcmd1bWVudCB0byBvYmpjb3B5LgotCi0qIG9iamR1bXAgLS1keW5hbWljLXJlbG9jIG5vdyB3b3JrcyBvbiBFTEYgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBsaWJyYXJpZXMuCi0KLSogQWRkZWQgLS1hZGp1c3Qtdm1hIG9wdGlvbiB0byBvYmpkdW1wLgotCi0qIEFkZGVkIC1DLy0tZGVtYW5nbGUgb3B0aW9uIHRvIG9iamR1bXAuCi0KLSogQWRkZWQgLXAvLS1wcmVzZXJ2ZS1kYXRlcyBvcHRpb24gdG8gc3RyaXAgYW5kIG9iamNvcHkuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi43OgotCi0qIEFkZGVkIC0tZW5hYmxlLXNoYXJlZCBhbmQgLS1lbmFibGUtY29tbW9uYmZkbGliIG9wdGlvbnMgdG8gY29uZmlndXJlLgotCi0qIEFkZGVkIC0tZGVidWdnaW5nIGFyZ3VtZW50IHRvIG9iamR1bXAgYW5kIG9iamNvcHkuCi0KLSogQWRkZWQgLS1kZWZpbmVkLW9ubHkgYXJndW1lbnQgdG8gbm0uCi0KLSogQWRkZWQgLS1yZW1vdmUtbGVhZGluZy1jaGFyIGFyZ3VtZW50IHRvIG9iamNvcHkuCi0KLSogVGhlIG9iamR1bXAgLS1saW5lLW51bWJlcnMgb3B0aW9uIGlzIG5vdyBtZWFuaW5nZnVsIHdpdGggLS1yZWxvYy4KLQotKiBBZGRlZCAtLWxpbmUtbnVtYmVycyBvcHRpb24gdG8gbm0uCi0KLSogQWRkZWQgLS1lbmRpYW4vLUVCLy1FTCBvcHRpb24gdG8gb2JqZHVtcC4KLQotKiBBZGRlZCBzdXBwb3J0IGZvciBBbHBoYSBPcGVuVk1TL0FYUC4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjY6Ci0KLSogQWRkZWQgLU4vLS1zdHJpcC1zeW1ib2wgYW5kIC1LLy0ta2VlcC1zeW1ib2wgYXJndW1lbnRzIHRvIHN0cmlwIGFuZCBvYmpjb3B5LgotCi0qIEFkZGVkIHNldmVyYWwgYXJndW1lbnRzIHRvIG9iamNvcHkgdG8gcHJvdmlkZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgdGhlIG5ldwotICBmaWxlIGlzIGxhaWQgb3V0IGluIG1lbW9yeS4gIEFsc28gYWRkZWQgYmluYXJ5IG91dHB1dCBmb3JtYXQgdG8gQkZEIHRvIHBlcm1pdAotICBnZW5lcmF0aW5nIHBsYWluIGJpbmFyeSBmaWxlcy4KLQotKiBBZGRlZCAtLXN0YXJ0LWFkZHJlc3MgYW5kIC0tc3RvcC1hZGRyZXNzIG9wdGlvbnMgdG8gb2JqZHVtcC4KLQotKiBhciBhbmQgcmFubGliIG5vdyB3b3JrIG9uIEFJWC4gIFRoZSB0b29scyBhcmUgbm93IGJ1aWx0IGJ5IGRlZmF1bHQgb24gQUlYLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNToKLQotKiBDaGFuZ2VkIG9iamR1bXAgLWRyIHRvIGR1bXAgdGhlIHJlbG9jcyBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgYXNzZW1ibHkKLSAgbGlzdGluZywgZm9yIGEgbW9yZSB1c2VmdWwgbGlzdGluZyBvZiByZWxvY2F0ZWFibGUgZmlsZXMuCi0KLSogQ2hhbmdlZCBvYmpkdW1wIC1kLy0tZGlzYXNzZW1ibGUgdG8gb25seSBkaXNhc3NlbWJsZSBTRUNfQ09ERSBzZWN0aW9ucy4KLSAgQWRkZWQgLUQvLS1kaXNhc3NlbWJsZS1hbGwgb3B0aW9uIHRvIGRpc2Fzc2VtYmxlIGFsbCBzZWN0aW9ucy4KLQotKiBBZGRlZCAtLXNpemUtc29ydCBvcHRpb24gdG8gbm0uCi0KLSogc3RyaXAgYW5kIG9iamNvcHkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGhhbmRsZSBkeW5hbWljYWxseSBsaW5rZWQgRUxGCi0gIGV4ZWN1dGFibGVzLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNDoKLQotKiBTdXBwb3J0IGZvciBIUC1QQSAoYnkgSmVmZiBMYXcpLCBpMzg2IE1hY2ggKGJ5IERhdmlkIE1hY2tlbnppZSksIFJTLzYwMDAgYW5kCi0gIFBvd2VyUEMgKGV4Y2VwdCBhciBhbmQgcmFubGliOyBieSBJYW4gVGF5bG9yKS4KLQotKiBTdXBwb3J0IGZvciBJcml4IDUuCi0KLSogUHJvZ3JhbXMgYHN0cmlwJyBhbmQgYG9iamNvcHknIHdpbGwgbm90IGF0dGVtcHQgdG8gd3JpdGUgZHluYW1pY2FsbHkgbGlua2VkCi0gIEVMRiBvdXRwdXQgZmlsZXMsIHNpbmNlIEJGRCBjdXJyZW50bHkgY2FuJ3QgY3JlYXRlIHRoZW0gcHJvcGVybHkuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi4zOgotCi0qIEEgbmV3IC0tc3RhYnMgYXJndW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gb2JqZHVtcCB0byBkdW1wIHN0YWJzIHNlY3Rpb25zIGluCi0gIEVMRiBhbmQgQ09GRiBmaWxlcy4KLQotKiBBIG5ldyBwcm9ncmFtLCBubG1jb252LCBoYXMgYmVlbiBhZGRlZC4gIEl0IGNhbiBjb252ZXJ0IG9iamVjdCBmaWxlcyBpbnRvCi0gIE5vdmVsbCBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMuCi0KLSogVGhlIHN0cmluZ3MgcHJvZ3JhbSBoYXMgYmVlbiBhZGRlZC4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjI6Ci0KLSogVGhlICdjb3B5JyBwcm9ncmFtIGhhcyBiZWVuIHJlbmFtZWQgdG8gJ29iamNvcHknLCBmb3IgY29uc2lzdGVuY3kgd2l0aAotICAnb2JqZHVtcCcsIGFuZCBiZWNhdXNlICdjb3B5JyBtaWdodCBtb3JlIHBsYXVzaWJseSBiZSB1c2VkIGFzIGEgc3lub255bSBmb3IKLSAgJ2NwJy4KLQotKiBUaGUgbmV3IHN0YW5kLWFsb25lIHByb2dyYW0gYysrZmlsdCBpcyBhIGZpbHRlciB0aGF0IGNvbnZlcnRzIGVuY29kZWQKLSAgKG1hbmdsZWQpIEMrKyBhc3NlbWJseS1sZXZlbCBpZGVudGlmaWVycyB0byB1c2VyLWxldmVsIG5hbWVzLiAgKE5vdGU6IFRoaXMKLSAgbWF5IGdldCBtb3ZlZCB0byB0aGUgZ2NjIGRpc3RyaWJ1dGlvbi4pCi0KLSogbm0gLW8gb24gYW4gYXJjaGl2ZSBub3cgcHJlZml4ZXMgZWFjaCBsaW5lIHdpdGggdGhlIGFyY2hpdmUgbmFtZSwgbWF0Y2hpbmcKLSAgdGhlIG91dHB1dCBmcm9tIEJTRCBubS4KLQotKiBhciAoYW5kIGxkKSBjYW4gbm93IHJlYWQgKGJ1dCBub3Qgd3JpdGUpIEJTRDQuNC1zdHlsZSBhcmNoaXZlcy4KLQotKiBOZXcgc3VwcG9ydCBmb3IgSDg1MDAsIFo4MDAwLCBhbmQgdGhlIEhpdGFjaCBTSC4KLQotKiBEaXMtYXNzZW1ibGVyIGludGVyZmFjZSBjaGFuZ2VkIHRvIGFsbG93IHNoYXJpbmcgd2l0aCBnZGIuCi0KLSogVGhlcmUgaXMgbmV3IEVsZiBjb2RlLCBidXQgaXQgaXMgbm90IHlldCByZWFkeSBmb3IgZ2VuZXJhbCB1c2UuCi0KLSogVGhlcmUgaXMgdGhlIGJlZ2lubmluZ3Mgb2YgYSB0ZXN0IHN1aXRlLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuMToKLQotKiBUaGVyZSBpcyBub3cgc3VwcG9ydCBmb3Igd3JpdGluZyBFQ09GRiBmaWxlcywgc28gbGQgYW5kIHRoZSBvdGhlciB1dGlsaXRpZXMKLSAgc2hvdWxkIHdvcmsgb24gUmlzYy9VbHRyaXggYW5kIElyaXguICBQbGVhc2UgbGV0IHVzIGtub3cgaG93IHdlbGwgdGhpcyB3b3Jrcy4KLQotKiBhciBub3cgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgc3ltYm9sIHRhYmxlIChhIF9fLlNZTURFRiBtZW1iZXIsIGluIHRoZSBCU0QKLSAgdmVyc2lvbiksIGlmIHRoZXJlIGFyZSBhbnkgb2JqZWN0IGZpbGVzIGluIHRoZSBhcmNoaXZlLiAgU28gcnVubmluZyByYW5saWIgaXMKLSAgbm93IHJlZHVuZGFudCAodW5sZXNzIHRoZSBub24tc3RhbmRhcmQgcSBjb21tYW5kIGlzIHVzZWQpLiAgVGhpcyBpcyByZXF1aXJlZAotICBmb3IgUG9zaXguMiBjb25mb3JtYW5jZS4KLQotKiBUaGUgYXJjaGl2ZS1yZWFkaW5nIGNvZGUgbm93IHJlYWRzIGJvdGggQlNELXN0eWxlIGFuZCBTWVNWLXN0eWxlIGFyY2hpdmVzCi0gIGluZGVwZW5kZW50bHkgb2YgdGhlIHNlbGVjdGVkIHRhcmdldCBmb3JtYXQuICBUaGlzIGlzIHRvIGVuY291cmFnZSBwZW9wbGUgdG8KLSAgc3dpdGNoIHRvIFNZU1YtZm9ybWF0LCB3aGljaCBoYXMgYSBudW1iZXIgb2YgYWR2YW50YWdlcy4KLQotKiBUaGUgc3RyaXAgYW5kIGNvcHkgcHJvZ3JhbXMgbm93IGhhdmUgb3B0aW9ucyB0byByZW1vdmUgZGVidWctc3ltYm9scyBvbmx5Ci0gIGFuZC9vciBsb2NhbCBzeW1ib2xzIG9ubHkuICBUaGV5IG5vdyBhbHNvIHN1cHBvcnQgbG9uZyBvcHRpb25zLgotCi0MCi1Mb2NhbCB2YXJpYWJsZXM6Ci1maWxsLWNvbHVtbjogNzkKLUVuZDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL1JFQURNRSBiL2JpbnV0aWxzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyZDI3Ny4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotVGhlc2UgYXJlIHRoZSBHTlUgYmludXRpbHMuICBUaGVzZSBhcmUgdXRpbGl0aWVzIG9mIHVzZSB3aGVuIGRlYWxpbmcKLXdpdGggb2JqZWN0IGZpbGVzLgotCi1UaGUgbGlua2VyIChsZCkgaXMgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHdoaWNoIHNob3VsZCBiZSAuLi9sZC4KLUxpbmtlci1zcGVjaWZpYyBub3RlcyBhcmUgaW4gLi4vbGQvUkVBRE1FLgotCi1BcyBvZiB2ZXJzaW9uIDIuNSwgdGhlIGFzc2VtYmxlciAoYXMpIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCBpbgotLi4vZ2FzLiAgQXNzZW1ibGVyLXNwZWNpZmljIG5vdGVzIGNhbiBiZSBmb3VuZCBpbiAuLi9nYXMvUkVBRE1FLgotCi1SZWNlbnQgY2hhbmdlcyBhcmUgaW4gLi9ORVdTLCAuLi9sZC9ORVdTLCBhbmQgLi4vZ2FzL05FV1MuCi0KLVVucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0tIHF1aWNrIG92ZXJ2aWV3Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaGVuIHlvdSB1bnBhY2sgdGhlIGJpbnV0aWxzLTIuOS50YXIuZ3ogZmlsZSwgeW91J2xsIGdldCBhIGRpcmVjdG9yeQotY2FsbGVkIHNvbWV0aGluZyBsaWtlIGBiaW51dGlscy0yLjknLCB3aGljaCBjb250YWlucyB2YXJpb3VzIGZpbGVzIGFuZAotZGlyZWN0b3JpZXMuICBNb3N0IG9mIHRoZSBmaWxlcyBpbiB0aGUgdG9wIGRpcmVjdG9yeSBhcmUgZm9yCi1pbmZvcm1hdGlvbiBhbmQgZm9yIGNvbmZpZ3VyYXRpb24uICBUaGUgYWN0dWFsIHNvdXJjZSBjb2RlIGlzIGluCi1zdWJkaXJlY3Rvcmllcy4KLQotVG8gYnVpbGQgYmludXRpbHMsIHlvdSBjYW4ganVzdCBkbzoKLQotCWNkIGJpbnV0aWxzLTIuOQotCS4vY29uZmlndXJlIFtvcHRpb25zXQotCW1ha2UKLQltYWtlIGluc3RhbGwgIyBjb3BpZXMgdGhlIHByb2dyYW1zIGZpbGVzIGludG8gL3Vzci9sb2NhbC9iaW4KLQkJICAgICAjIGJ5IGRlZmF1bHQuCi0KLVRoaXMgd2lsbCBjb25maWd1cmUgYW5kIGJ1aWxkIGFsbCB0aGUgbGlicmFyaWVzIGFzIHdlbGwgYXMgdGhlCi1hc3NlbWJsZXIsIHRoZSBiaW51dGlscywgYW5kIHRoZSBsaW5rZXIuCi0KLUlmIHlvdSBoYXZlIEdOVSBtYWtlLCB3ZSByZWNvbW1lbmQgYnVpbGRpbmcgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5OgotCi0JbWtkaXIgb2JqZGlyCi0JY2Qgb2JqZGlyCi0JLi4vYmludXRpbHMtMi45L2NvbmZpZ3VyZSBbb3B0aW9uc10KLQltYWtlCi0JbWFrZSBpbnN0YWxsCi0KLVRoaXMgcmVsaWVzIG9uIHRoZSBWUEFUSCBmZWF0dXJlIG9mIEdOVSBtYWtlLgotCi1CeSBkZWZhdWx0LCB0aGUgYmludXRpbHMgd2lsbCBiZSBjb25maWd1cmVkIHRvIHN1cHBvcnQgdGhlIHN5c3RlbSBvbgotd2hpY2ggdGhleSBhcmUgYnVpbHQuICBXaGVuIGRvaW5nIGNyb3NzIGRldmVsb3BtZW50LCB1c2UgdGhlIC0tdGFyZ2V0Ci1jb25maWd1cmUgb3B0aW9uIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdGFyZ2V0LgotCi1UaGUgLS1lbmFibGUtdGFyZ2V0cyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBtb3JlIGJpbmFyeSBmaWxlIGZvcm1hdHMKLWJlc2lkZXMgdGhlIGRlZmF1bHQuICBMaXN0IHRoZW0gYXMgdGhlIGFyZ3VtZW50IHRvIC0tZW5hYmxlLXRhcmdldHMsCi1zZXBhcmF0ZWQgYnkgY29tbWFzLiAgRm9yIGV4YW1wbGU6Ci0KLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS10YXJnZXRzPXN1bjMscnM2MDAwLWFpeCxkZWNzdGF0aW9uCi0KLVRoZSBuYW1lICdhbGwnIGNvbXBpbGVzIGluIHN1cHBvcnQgZm9yIGFsbCB2YWxpZCBCRkQgdGFyZ2V0cyAodGhpcyB3YXMKLXRoZSBkZWZhdWx0IGluIHJlbGVhc2VzIGJlZm9yZSAyLjMpOgotCi0JLi9jb25maWd1cmUgLS1lbmFibGUtdGFyZ2V0cz1hbGwKLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIC0tZW5hYmxlLXNoYXJlZCBvcHRpb24gd2hlbiB5b3UgcnVuCi1jb25maWd1cmUuICBUaGlzIHdpbGwgYnVpbGQgdGhlIEJGRCBhbmQgb3Bjb2RlcyBsaWJyYXJpZXMgYXMgc2hhcmVkCi1saWJyYXJpZXMuICBZb3UgY2FuIHVzZSBhcmd1bWVudHMgd2l0aCB0aGUgLS1lbmFibGUtc2hhcmVkIG9wdGlvbiB0bwotaW5kaWNhdGUgdGhhdCBvbmx5IGNlcnRhaW4gbGlicmFyaWVzIHNob3VsZCBiZSBidWlsdCBzaGFyZWQ7IGZvcgotZXhhbXBsZSwgLS1lbmFibGUtc2hhcmVkPWJmZC4gIFRoZSBvbmx5IHBvdGVudGlhbCBzaGFyZWQgbGlicmFyaWVzIGluCi1hIGJpbnV0aWxzIHJlbGVhc2UgYXJlIGJmZCBhbmQgb3Bjb2Rlcy4KLQotVGhlIGJpbnV0aWxzIHdpbGwgYmUgbGlua2VkIGFnYWluc3QgdGhlIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgYnVpbGQKLXN0ZXAgd2lsbCBhdHRlbXB0IHRvIHBsYWNlIHRoZSBjb3JyZWN0IGxpYnJhcnkgaW4gdGhlIHJ1bnRpbWUgc2VhcmNoCi1wYXRoIGZvciB0aGUgYmluYXJpZXMuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCBhZnRlciB5b3UgaW5zdGFsbCB0aGUKLWJpbmFyaWVzLCB5b3UgbWF5IGhhdmUgdG8gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBub3JtYWxseQotTERfTElCUkFSWV9QQVRILCBzbyB0aGF0IHRoZSBzeXN0ZW0gY2FuIGZpbmQgdGhlIGluc3RhbGxlZCBsaWJiZmQKLXNoYXJlZCBsaWJyYXJ5LgotCi1UbyBidWlsZCB1bmRlciBvcGVuVk1TL0FYUCwgc2VlIHRoZSBmaWxlIG1ha2VmaWxlLnZtcyBpbiB0aGUgdG9wIGxldmVsCi1kaXJlY3RvcnkuCi0KLUlmIHlvdSBkb24ndCBoYXZlIGFyCi09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgYW4gYXIgcHJvZ3JhbSwgdGhlIG5vcm1hbAotYmludXRpbHMgYnVpbGQgcHJvY2VzcyB3aWxsIG5vdCB3b3JrLiAgSW4gdGhpcyBjYXNlLCBydW4gY29uZmlndXJlIGFzCi11c3VhbC4gIEJlZm9yZSBydW5uaW5nIG1ha2UsIHJ1biB0aGlzIHNjcmlwdDoKLQotIyEvYmluL3NoCi1NQUtFX1BST0c9IiR7TUFLRS1tYWtlfSIKLU1BS0U9IiR7TUFLRV9QUk9HfSBBUj10cnVlIExJTks9dHJ1ZSIKLWV4cG9ydCBNQUtFCi0ke01BS0V9ICQqIGFsbC1saWJpYmVydHkKLSR7TUFLRX0gJCogYWxsLWludGwKLSR7TUFLRX0gJCogYWxsLWJmZAotY2QgYmludXRpbHMKLU1BS0U9IiR7TUFLRV9QUk9HfSIKLWV4cG9ydCBNQUtFCi0ke01BS0V9ICQqIGFyX0RFUEVOREVOQ0lFUz0gYXJfTERBREQ9Jy4uL2JmZC8qLm8gYGNhdCAuLi9saWJpYmVydHkvcmVxdWlyZWQtbGlzdCAuLi9saWJpYmVydHkvbmVlZGVkLWxpc3QgfCBzZWQgLWUgInMsXChbXiBdW14gXSpcKSwuLi9saWJpYmVydHkvXDEsZyJgIGBpZiB0ZXN0IC1mIC4uL2ludGwvZ2V0dGV4dC5vOyB0aGVuIGVjaG8gJy4uL2ludGwvKi5vJzsgZmlgJyBhcgotCi1UaGlzIHNjcmlwdCB3aWxsIGJ1aWxkIGFuIGFyIHByb2dyYW0gaW4gYmludXRpbHMvYXIuICBNb3ZlIGJpbnV0aWxzL2FyCi1pbnRvIGEgZGlyZWN0b3J5IG9uIHlvdXIgUEFUSC4gIEFmdGVyIGRvaW5nIHRoaXMsIHlvdSBjYW4gcnVuIG1ha2UgYXMKLXVzdWFsIHRvIGJ1aWxkIHRoZSBjb21wbGV0ZSBiaW51dGlscyBkaXN0cmlidXRpb24uICBZb3UgZG8gbm90IG5lZWQKLXRoZSByYW5saWIgcHJvZ3JhbSBpbiBvcmRlciB0byBidWlsZCB0aGUgZGlzdHJpYnV0aW9uLgotCi1Qb3J0aW5nCi09PT09PT09Ci0KLUJpbnV0aWxzLTIuOSBzdXBwb3J0cyBtYW55IGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLCBidXQgdGhlcmUKLWFyZSBtYW55IG1vcmUgbm90IHN1cHBvcnRlZCwgaW5jbHVkaW5nIHNvbWUgdGhhdCB3ZXJlIHN1cHBvcnRlZAotYnkgZWFybGllciB2ZXJzaW9ucy4gIFdlIGFyZSBob3BpbmcgZm9yIHZvbHVudGVlcnMgdG8KLWltcHJvdmUgdGhpcyBzaXR1YXRpb24uCi0KLVRoZSBtYWpvciBlZmZvcnQgaW4gcG9ydGluZyBiaW51dGlscyB0byBhIG5ldyBob3N0IGFuZC9vciB0YXJnZXQKLWFyY2hpdGVjdHVyZSBpbnZvbHZlcyB0aGUgQkZEIGxpYnJhcnkuICBUaGVyZSBpcyBzb21lIGRvY3VtZW50YXRpb24KLWluIC4uL2JmZC9kb2MuICBUaGUgZmlsZSAuLi9nZGIvZG9jL2dkYmludC50ZXhpbmZvIChkaXN0cmlidXRlZAotd2l0aCBnZGItNC54KSBtYXkgYWxzbyBiZSBvZiBoZWxwLgotCi1SZXBvcnRpbmcgYnVncwotPT09PT09PT09PT09PT0KLQotU2VuZCBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcyB0byBidWctZ251LXV0aWxzQGdudS5vcmcuICBBbHdheXMgbWVudGlvbgotdGhlIHZlcnNpb24gbnVtYmVyIHlvdSBhcmUgcnVubmluZzsgdGhpcyBpcyBwcmludGVkIGJ5IHJ1bm5pbmcgYW55IG9mCi10aGUgYmludXRpbHMgd2l0aCB0aGUgLS12ZXJzaW9uIG9wdGlvbi4gIFdlIGFwcHJlY2lhdGUgcmVwb3J0cyBhYm91dAotYnVncywgYnV0IHdlIGRvIG5vdCBwcm9taXNlIHRvIGZpeCB0aGVtLgotCi1WTVMKLT09PQotCi1UaGlzIHNlY3Rpb24gd2FzIHdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIDxra2FlbXBmQHJtaS5kZT4uICBJdAotZGVzY3JpYmVzIGhvdyB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgYmludXRpbHMgb24gb3BlblZNUyAoQWxwaGEgYW5kCi1WYXgpLiAgKFRoZSBCRkQgbGlicmFyeSBvbmx5IHN1cHBvcnRzIHJlYWRpbmcgVmF4IG9iamVjdCBmaWxlcy4pCi0KLUNvbXBpbGluZyB0aGUgcmVsZWFzZToKLQotVG8gY29tcGlsZSB0aGUgZ251IGJpbmFyeSB1dGlsaXRpZXMgYW5kIHRoZSBnbnUgYXNzZW1ibGVyLCB5b3UnbGwKLW5lZWQgREVDIEMgb3IgR05VIEMgZm9yIG9wZW5WTVMvQWxwaGEuIFlvdSdsbCBuZWVkICpib3RoKiBjb21waWxlcnMKLW9uIG9wZW5WTVMvVmF4LgotCi1Db21waWxpbmcgd2l0aCBlaXRoZXIgREVDIEMgb3IgR05VIEMgd29ya3Mgb24gb3BlblZNUy9BbHBoYSBvbmx5LiBTb21lCi1vZiB0aGUgb3Bjb2RlcyBhbmQgYmludXRpbHMgZmlsZXMgdHJhcCBhIGJ1ZyBpbiB0aGUgREVDIEMgb3B0aW1pemVyLAotc28gdGhlc2UgZmlsZXMgbXVzdCBiZSBjb21waWxlZCB3aXRoIC9ub29wdC4KLQotQ29tcGlsaW5nIG9uIG9wZW5WTVMvVmF4IGlzIGEgYml0IGNvbXBsaWNhdGVkLCBhcyB0aGUgYmZkIGxpYnJhcnkgdHJhcHMKLWEgYnVnIGluIEdOVSBDIGFuZCB0aGUgZ251IGFzc2VtYmxlciBhIGJ1ZyBpbiAobXkgdmVyc2lvbiBvZikgREVDIEMuCi0KLUkgbmV2ZXIgdHJpZWQgY29tcGlsaW5nIHdpdGggVkFYIEMuCi0KLQotWW91IGZ1cnRoZXIgbmVlZCBHTlUgTWFrZSBWZXJzaW9uIDMuNzYgb3IgbGF0ZXIuIFRoaXMgaXMgYXZhaWxhYmxlCi1hdCBmdHAucHJvZ2lzLmRlIG9yIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiBUaGUgbWFrZWZpbGVzIGFzc3VtZSB0aGF0Ci1nbWFrZSBzdGFydHMgZ251IG1ha2UgYXMgYSBmb3JlaWduIGNvbW1hbmQuCi0KLUlmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBERUMgQyBvciBWQVggQywgeW91IG11c3QgcnVuCi0KLSAgJCBAc2V0dXAKLQotYmVmb3JlIHN0YXJ0aW5nIGdudS1tYWtlLiBUaGlzIGlzbid0IG5lZWRlZCB3aXRoIEdOVSBDLgotCi1PbiB0aGUgQWxwaGEgeW91IGNhbiBjaG9vc2UgdGhlIGNvbXBpbGVyIGJ5IGVkaXRpbmcgdGhlIHRvcGxldmVsCi1tYWtlZmlsZS52bXMuIEVpdGhlciBzZWxlY3QgQ0M9Y2MgKGZvciBERUMgQykgb3IgQ0M9Z2NjIChmb3IgR05VIEMpCi0KLQotSW5zdGFsbGluZyB0aGUgcmVsZWFzZQotCi1Qcm92aWRlZCB0aGF0IHlvdXIgZGlyZWN0b3J5IHNldHVwIGNvbmZvcm1zIHRvIHRoZSBHTlUgb24gb3BlblZNUwotc3RhbmRhcmQsIHlvdSBhbHJlYWR5IGhhdmUgYSBjb25jZWFsZWQgZGV2aWNlZCBuYW1lZCAnR05VX1JPT1QnLgotSW4gdGhpcyBjYXNlLCBhIHNpbXBsZQotCi0gJCBnbWFrZSBpbnN0YWxsCi0KLXN1ZmZpY2VzIHRvIGNvcHkgYWxsIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgdG8gdGhlIHByb3BlciBkaXJlY3Rvcmllcy4KLQotRGVmaW5lIHRoZSBwcm9ncmFtcyBhcyBmb3JlaWduIGNvbW1hbmRzIGJ5IGFkZGluZyB0aGVzZSBsaW5lcyB0byB5b3VyCi1sb2dpbi5jb206Ci0KLSAgJCBnYXMgOj09ICRHTlVfUk9PVDpbYmluXWFzLmV4ZQotICAkIHNpemUgOj09ICRHTlVfUk9PVDpbYmluXXNpemUuZXhlCi0gICQgbm0gOj09ICRHTlVfUk9PVDpbYmluXW5tLmV4ZQotICAkIG9iamR1bXAgOj09ICRHTlVfUk9PVDpbYmluXW9iamR1bXAuZXhlCi0gICQgc3RyaW5ncyA6PT0gJEdOVV9ST09UOltiaW5dc3RyaW5ncy5leGUKLQotSWYgeW91IGhhdmUgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHNldHVwLCBjb3B5IHRoZSBiaW5hcnkgdXRpbGl0aWVzCi0oWy5iaW51dGlsc11zaXplLmV4ZSwgWy5iaW51dGlsc11ubS5leGUsIFsuYmludXRpbHNdb2JqZHVtcC5leGUsCi1hbmQgWy5iaW51dGlsc11zdHJpbmdzLmV4ZSkgYW5kIHRoZSBnbnUgYXNzZW1ibGVyIGFuZCBwcmVwcm9jZXNzb3IKLShbLmdhc11hcy5leGUgYW5kIFsuZ2FzXWdhc3AuZXhlXSkgdG8gYSBkaXJlY3Rvcnkgb2YgeW91ciBjaG9pY2UKLWFuZCBkZWZpbmUgYWxsIHByb2dyYW1zIGFzIGZvcmVpZ24gY29tbWFuZHMuCi0KLQotSWYgeW91J3JlIHNhdGllc2ZpZWQgd2l0aCB0aGUgY29tcGlsYXRpb24sIHlvdSBtYXkgd2FudCB0byByZW1vdmUKLXVubmVlZGVkIG9iamVjdHMgYW5kIGxpYnJhcmllczoKLQotICAkIGdtYWtlIGNsZWFuCi0KLQotSWYgeW91IGhhdmUgYW55IHByb2JsZW1zIG9yIHF1ZXN0aW9ucyBhYm91dCB0aGUgYmludXRpbHMgb24gVk1TLCBmZWVsCi1mcmVlIHRvIG1haWwgbWUgYXQga2thZW1wZkBybWkuZGUuCmRpZmYgLS1naXQgYS9iaW51dGlscy9hY2luY2x1ZGUubTQgYi9iaW51dGlscy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FjbG9jYWwubTQgYi9iaW51dGlscy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGExNTY1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIwICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCi1bQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCi1bQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCi1bQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19TVUJTVChMRCkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1BQ19TVUJTVChOTSkKLV0pCi0KLSMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCi0jIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KLUFDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKLVsjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLWNoYW5nZXF1b3RlKCwpZG5sCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWNoYW5nZXF1b3RlKCwpZG5sCi1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLWNoYW5nZXF1b3RlKFssXSlkbmwKLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0JICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLUFDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKLV0pCi0KLSMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCi1BQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCi1bQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLUFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLV0pCi0KLSMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KLUFDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCi1bYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi1dKQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWwotQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKLUFDX0NIRUNLX0xJQihtLCBjb3MpCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKLSAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KLSAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7Ci0gICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OwotICAgIGVzYWMKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0KLWRubCBBTV9QUk9HX0xFWAotZG5sIExvb2sgZm9yIGZsZXgsIGxleCBvciBtaXNzaW5nLCB0aGVuIHJ1biBBQ19QUk9HX0xFWCBhbmQgQUNfREVDTF9ZWVRFWFQKLUFDX0RFRlVOKEFNX1BST0dfTEVYLAotW21pc3NpbmdfZGlyPWlmZWxzZShbJDFdLCxgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYCwkMSkKLUFDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsICIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IikKLUFDX1BST0dfTEVYCi1BQ19ERUNMX1lZVEVYVF0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYWRkcjJsaW5lLjEgYi9iaW51dGlscy9hZGRyMmxpbmUuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZTEwMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hZGRyMmxpbmUuMQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGFkZHIybGluZSAxICIyNyBNYXJjaCAxOTk3IiAiQ3lnbnVzIFNvbHV0aW9ucyIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1hZGRyMmxpbmUgXC0gY29udmVydCBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIGFkZHIybGluZQotLlJCICJbXHwiICJcLWJcICJcYwotLkkgYmZkbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC10YXJnZXQ9IlxjCi0uSSBiZmRuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1DIHwgXC1cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgIlwtZVwgIlxjCi0uSSBmaWxlbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC1leGU9IlxjCi0uSSBmaWxlbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtZiB8IFwtXC1mdW5jdGlvbnMgIlx8XSIKLS5SQiAiW1x8IiBcLXMgfCBcLVwtYmFzZW5hbWVzICJcfF0iCi0uUkIgIltcfCIgXC1IIHwgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLVYgfCBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIGFkZHIgYWRkciAuLi4gICJcfF0iCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotXGMKLS5CIGFkZHIybGluZQotdHJhbnNsYXRlcyBwcm9ncmFtIGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycy4gIEdpdmVuCi1hbiBhZGRyZXNzIGFuZCBhbiBleGVjdXRhYmxlLCBpdCB1c2VzIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi1leGVjdXRhYmxlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKLWFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFkZHJlc3MuCi0KLVRoZSBleGVjdXRhYmxlIHRvIHVzZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKLS5CIFwtZQotb3B0aW9uLiAgVGhlIGRlZmF1bHQgaXMKLS5CIGEub3V0XGMKLVwmLgotCi0uQiBhZGRyMmxpbmUKLWhhcyB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uLgotCi1JbiB0aGUgZmlyc3QsIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCi1hbmQKLS5CIGFkZHIybGluZQotZGlzcGxheXMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2ggYWRkcmVzcy4KLQotSW4gdGhlIHNlY29uZCwKLS5CIGFkZHIybGluZQotcmVhZHMgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGZyb20gc3RhbmRhcmQgaW5wdXQsIGFuZCBwcmludHMgdGhlIGZpbGUKLW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoIGFkZHJlc3Mgb24gc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcwotbW9kZSwKLS5CIGFkZHIybGluZQotbWF5IGJlIHVzZWQgaW4gYSBwaXBlIHRvIGNvbnZlcnQgZHluYW1pY2FsbHkgY2hvc2VuIGFkZHJlc3Nlcy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIEZJTEVOQU1FOkxJTkVOTy4gIFRoZSBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBmb3IgZWFjaCBhZGRyZXNzIGlzIHByaW50ZWQgb24gYSBzZXBhcmF0ZSBsaW5lLiAgSWYgdGhlCi0uQiBcLWYKLW9wdGlvbiBpcyB1c2VkLCB0aGVuIGVhY2ggRklMRU5BTUU6TElORU5PIGxpbmUgaXMgcHJlY2VkZWQgYnkgYQotRlVOQ1RJT05OQU1FIGxpbmUgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlCi1hZGRyZXNzLgotCi1JZiB0aGUgZmlsZSBuYW1lIG9yIGZ1bmN0aW9uIG5hbWUgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLAotLkIgYWRkcjJsaW5lCi13aWxsIHByaW50IHR3byBxdWVzdGlvbiBtYXJrcyBpbiB0aGVpciBwbGFjZS4gIElmIHRoZSBsaW5lIG51bWJlciBjYW4KLW5vdCBiZSBkZXRlcm1pbmVkLAotLkIgYWRkcjJsaW5lCi13aWxsIHByaW50IDAuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CSSAiXC1iICIgImJmZG5hbWUiXGMKLS5UUAotLkJJICJcLVwtdGFyZ2V0PSIgImJmZG5hbWUiCi1TcGVjaWZ5IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUKLVxjCi0uSSBiZmRuYW1lXGMKLVwmLgotCi0uVFAKLS5CIFwtQwotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLURlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCi0KLS5UUAotLkJJICJcLWUgIiAiZmlsZW5hbWUiXGMKLS5UUAotLkJJICJcLVwtZXhlPSIgImZpbGVuYW1lIgotU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBmb3Igd2hpY2ggYWRkcmVzc2VzIHNob3VsZCBiZQotdHJhbnNsYXRlZC4gIFRoZSBkZWZhdWx0IGZpbGUgaXMKLS5CIGEub3V0XGMKLVwmLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtZnVuY3Rpb25zCi1EaXNwbGF5IGZ1bmN0aW9uIG5hbWVzIGFzIHdlbGwgYXMgZmlsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1iYXNlbmFtZXMKLURpc3BsYXkgb25seSB0aGUgYmFzZSBvZiBlYWNoIGZpbGUgbmFtZS4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCmRpZmYgLS1naXQgYS9iaW51dGlscy9hZGRyMmxpbmUuYyBiL2JpbnV0aWxzL2FkZHIybGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2VlODY3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FkZHIybGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qIGFkZHIybGluZS5jIC0tIGNvbnZlcnQgYWRkcmVzc2VzIHRvIGxpbmUgbnVtYmVyIGFuZCBmdW5jdGlvbiBuYW1lCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBMYXV0aGVyIDxVbHJpY2guTGF1dGhlckB6ZmUuc2llbWVucy5kZT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBEZXJpdmVkIGZyb20gb2JqZHVtcC5jIGFuZCBubS5jIGJ5IFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlCi0KLSAgIFVzYWdlOiAKLSAgIGFkZHIybGluZSBbb3B0aW9uc10gYWRkciBhZGRyIC4uLgotICAgb3IKLSAgIGFkZHIybGluZSBbb3B0aW9uc10gCi0KLSAgIGJvdGggZm9ybXMgd3JpdGUgcmVzdWx0cyB0byBzdGRvdXQsIHRoZSBzZWNvbmQgZm9ybSByZWFkcyBhZGRyZXNzZXMKLSAgIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHN0ZGluLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV92ZXJzaW9uOwotCi1zdGF0aWMgYm9vbGVhbiB3aXRoX2Z1bmN0aW9uczsJLyogLWYsIHNob3cgZnVuY3Rpb24gbmFtZXMuICAqLwotc3RhdGljIGJvb2xlYW4gZG9fZGVtYW5nbGU7CS8qIC1DLCBkZW1hbmdsZSBuYW1lcy4gICovCi1zdGF0aWMgYm9vbGVhbiBiYXNlX25hbWVzOwkvKiAtcywgc3RyaXAgZGlyZWN0b3J5IG5hbWVzLiAgKi8KLQotc3RhdGljIGludCBuYWRkcjsJCS8qIE51bWJlciBvZiBhZGRyZXNzZXMgdG8gcHJvY2Vzcy4gICovCi1zdGF0aWMgY2hhciAqKmFkZHI7CQkvKiBIZXggYWRkcmVzc2VzIHRvIHByb2Nlc3MuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXM7CQkvKiBTeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiYmFzZW5hbWVzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ0MnfSwKLSAgeyJleGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKLSAgeyJmdW5jdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdIJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgc2x1cnBfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCB0cmFuc2xhdGVfYWRkcmVzc2VzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQwKLS8qIFByaW50IGEgdXNhZ2UgbWVzc2FnZSB0byBTVFJFQU0gYW5kIGV4aXQgd2l0aCBTVEFUVVMuICAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstQ2ZzSFZdIFstYiBiZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuXAotICAgICAgIFstLWJhc2VuYW1lc10gWy0tZnVuY3Rpb25zXSBbYWRkciBhZGRyIC4uLl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotc2x1cnBfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgbG9uZyBzeW1jb3VudDsKLQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0KLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0MCi0vKiBUaGVzZSBnbG9iYWwgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmV0d2VlbgotICAgdHJhbnNsYXRlX2FkZHJlc3NlcyBhbmQgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYSBwYzsKLXN0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGxpbmU7Ci1zdGF0aWMgYm9vbGVhbiBmb3VuZDsKLQotLyogTG9vayBmb3IgYW4gYWRkcmVzcyBpbiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1maW5kX2FkZHJlc3NfaW5fc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbikgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAocGMgPCB2bWEpCi0gICAgcmV0dXJuOwotCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOwotICBpZiAocGMgPj0gdm1hICsgc2l6ZSkKLSAgICByZXR1cm47Ci0KLSAgZm91bmQgPSBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bXMsIHBjIC0gdm1hLAotCQkJCSAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKTsKLX0KLQotLyogUmVhZCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbSBzdGRpbiwgdHJhbnNsYXRlIGludG8KLSAgIGZpbGVfbmFtZTpsaW5lX251bWJlciBhbmQgb3B0aW9uYWxseSBmdW5jdGlvbiBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLXRyYW5zbGF0ZV9hZGRyZXNzZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHJlYWRfc3RkaW4gPSAobmFkZHIgPT0gMCk7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAocmVhZF9zdGRpbikKLQl7Ci0JICBjaGFyIGFkZHJfaGV4WzEwMF07Ci0KLQkgIGlmIChmZ2V0cyAoYWRkcl9oZXgsIHNpemVvZiBhZGRyX2hleCwgc3RkaW4pID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgcGMgPSBiZmRfc2Nhbl92bWEgKGFkZHJfaGV4LCBOVUxMLCAxNik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChuYWRkciA8PSAwKQotCSAgICBicmVhazsKLQkgIC0tbmFkZHI7Ci0JICBwYyA9IGJmZF9zY2FuX3ZtYSAoKmFkZHIrKywgTlVMTCwgMTYpOwotCX0KLQotICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24sIChQVFIpIE5VTEwpOwotCi0gICAgICBpZiAoISBmb3VuZCkKLQl7Ci0JICBpZiAod2l0aF9mdW5jdGlvbnMpCi0JICAgIHByaW50ZiAoIj8/XG4iKTsKLQkgIHByaW50ZiAoIj8/OjBcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAod2l0aF9mdW5jdGlvbnMpCi0JICAgIHsKLQkgICAgICBpZiAoZnVuY3Rpb25uYW1lID09IE5VTEwgfHwgKmZ1bmN0aW9ubmFtZSA9PSAnXDAnKQotCQlwcmludGYgKCI/P1xuIik7Ci0JICAgICAgZWxzZSBpZiAoISBkb19kZW1hbmdsZSkKLQkJcHJpbnRmICgiJXNcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcmVzOwotCi0JCSAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKGZ1bmN0aW9ubmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotCQkgIGlmIChyZXMgPT0gTlVMTCkKLQkJICAgIHByaW50ZiAoIiVzXG4iLCBmdW5jdGlvbm5hbWUpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiJXNcbiIsIHJlcyk7Ci0JCSAgICAgIGZyZWUgKHJlcyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoYmFzZV9uYW1lcyAmJiBmaWxlbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqaDsKLQotCSAgICAgIGggPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlmaWxlbmFtZSA9IGggKyAxOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIj8/IiwgbGluZSk7Ci0JfQotCi0gICAgICAvKiBmZmx1c2goKSBpcyBlc3NlbnRpYWwgZm9yIHVzaW5nIHRoaXMgY29tbWFuZCBhcyBhIHNlcnZlcgotICAgICAgICAgY2hpbGQgcHJvY2VzcyB0aGF0IHJlYWRzIGFkZHJlc3NlcyBmcm9tIGEgcGlwZSBhbmQgcmVzcG9uZHMKLSAgICAgICAgIHdpdGggbGluZSBudW1iZXIgaW5mb3JtYXRpb24sIHByb2Nlc3Npbmcgb25lIGFkZHJlc3MgYXQgYQotICAgICAgICAgdGltZS4gICovCi0gICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gICAgfQotfQotCi0vKiBQcm9jZXNzIGEgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgZmF0YWwgKF8oIiVzOiBjYW4gbm90IGdldCBhZGRyZXNzZXMgZnJvbSBhcmNoaXZlIiksIGZpbGVuYW1lKTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2x1cnBfc3ltdGFiIChhYmZkKTsKLQotICB0cmFuc2xhdGVfYWRkcmVzc2VzIChhYmZkKTsKLQotICBpZiAoc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHN5bXMpOwotICAgICAgc3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIGJmZF9jbG9zZSAoYWJmZCk7Ci19Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnRhcmdldDsKLSAgaW50IGM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgdGFyZ2V0ID0gTlVMTDsKLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOkNlOnNmSFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnYic6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdDJzoKLQkgIGRvX2RlbWFuZ2xlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGJhc2VfbmFtZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICB3aXRoX2Z1bmN0aW9ucyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHByaW50X3ZlcnNpb24gKCJhZGRyMmxpbmUiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gImEub3V0IjsKLQotICBhZGRyID0gYXJndiArIG9wdGluZDsKLSAgbmFkZHIgPSBhcmdjIC0gb3B0aW5kOwotCi0gIHByb2Nlc3NfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hci4xIGIvYmludXRpbHMvYXIuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlOGNmZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hci4xCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBhciAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1hciBcLSBjcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQlIgYXIgIiBbXHwiICItIiAiXHxdIlxjCi0uSSB7ZG1wcXJ0eH1bYWJjaWxvc1N1dlZdIFxjCi1bXHxcYwotLkkgbWVtYmVybmFtZVxjCi1cJlx8XSBcYwotLkkgYXJjaGl2ZVxjCi1cJiBcYwotLkkgZmlsZXNcYwotXCYuXHwuXHwuCi0KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIFxjCi0uQiBhclxjCi1cJiBwcm9ncmFtIGNyZWF0ZXMsIG1vZGlmaWVzLCBhbmQgZXh0cmFjdHMgZnJvbQotYXJjaGl2ZXMuICBBbiBcYwotLkkgYXJjaGl2ZVxjCi1cJiBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIFxjCi0uSSBtZW1iZXJzXGMKLVwmIG9mIHRoZSBhcmNoaXZlKS4KLQotVGhlIG9yaWdpbmFsIGZpbGVzJyBjb250ZW50cywgbW9kZSAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBhbmQKLWdyb3VwIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIGFyY2hpdmUsIGFuZCBtYXkgYmUgcmVjb25zdGl0dXRlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1HTlUgXGMKLS5CIGFyXGMKLVwmIGNhbiBtYWludGFpbiBhcmNoaXZlcyB3aG9zZSBtZW1iZXJzIGhhdmUgbmFtZXMgb2YgYW55Ci1sZW5ndGg7IGhvd2V2ZXIsIGRlcGVuZGluZyBvbiBob3cgXGMKLS5CIGFyXGMKLVwmIGlzIGNvbmZpZ3VyZWQgb24geW91cgotc3lzdGVtLCBhIGxpbWl0IG9uIG1lbWJlci1uYW1lIGxlbmd0aCBtYXkgYmUgaW1wb3NlZCAoZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggYXJjaGl2ZSBmb3JtYXRzIG1haW50YWluZWQgd2l0aCBvdGhlciB0b29scykuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotXGMKLS5CIGFyXGMKLVwmIGlzIGNvbnNpZGVyZWQgYSBiaW5hcnkgdXRpbGl0eSBiZWNhdXNlIGFyY2hpdmVzIG9mIHRoaXMgc29ydAotYXJlIG1vc3Qgb2Z0ZW4gdXNlZCBhcyBcYwotLkkgbGlicmFyaWVzXGMKLVwmIGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotXGMKLS5CIGFyXGMKLVwmIHdpbGwgY3JlYXRlIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIGBcfFxjCi0uQiBzXGMKLVx8Jy4KLU9uY2UgY3JlYXRlZCwgdGhpcyBpbmRleCBpcyB1cGRhdGVkIGluIHRoZSBhcmNoaXZlIHdoZW5ldmVyIFxjCi0uQiBhclxjCi1cJgotbWFrZXMgYSBjaGFuZ2UgdG8gaXRzIGNvbnRlbnRzIChzYXZlIGZvciB0aGUgYFx8XGMKLS5CIHFcYwotXHwnIHVwZGF0ZSBvcGVyYXRpb24pLgotQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotCi1Zb3UgbWF5IHVzZSBgXHxcYwotLkIgbm0gXC1zXGMKLVx8JyBvciBgXHxcYwotLkIgbm0gXC1cLXByaW50XC1hcm1hcFxjCi1cfCcgdG8gbGlzdCB0aGlzIGluZGV4Ci10YWJsZS4gIElmIGFuIGFyY2hpdmUgbGFja3MgdGhlIHRhYmxlLCBhbm90aGVyIGZvcm0gb2YgXGMKLS5CIGFyXGMKLVwmIGNhbGxlZAotXGMKLS5CIHJhbmxpYlxjCi1cJiBjYW4gYmUgdXNlZCB0byBhZGQganVzdCB0aGUgdGFibGUuCi0KLVxjCi0uQiBhclxjCi1cJiBpbnNpc3RzIG9uIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgdG8gZXhlY3V0ZTogb25lCi1rZXlsZXR0ZXIgc3BlY2lmeWluZyB0aGUgXGMKLS5JIG9wZXJhdGlvblxjCi1cJiAob3B0aW9uYWxseSBhY2NvbXBhbmllZCBieSBvdGhlcgota2V5bGV0dGVycyBzcGVjaWZ5aW5nIFxjCi0uSSBtb2RpZmllcnNcYwotXCYpLCBhbmQgdGhlIGFyY2hpdmUgbmFtZSB0byBhY3Qgb24uCi0KLU1vc3Qgb3BlcmF0aW9ucyBjYW4gYWxzbyBhY2NlcHQgZnVydGhlciBcYwotLkkgZmlsZXNcYwotXCYgYXJndW1lbnRzLAotc3BlY2lmeWluZyBwYXJ0aWN1bGFyIGZpbGVzIHRvIG9wZXJhdGUgb24uCi0KLS5TSCBPUFRJT05TCi1HTlUgXGMKLS5CIGFyXGMKLVwmIGFsbG93cyB5b3UgdG8gbWl4IHRoZSBvcGVyYXRpb24gY29kZSBcYwotLkkgcFxjCi1cJiBhbmQgbW9kaWZpZXIKLWZsYWdzIFxjCi0uSSBtb2RcYwotXCYgaW4gYW55IG9yZGVyLCB3aXRoaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4KLQotSWYgeW91IHdpc2gsIHlvdSBtYXkgYmVnaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCB3aXRoIGEKLWRhc2guCi0KLVRoZSBcYwotLkkgcFxjCi1cJiBrZXlsZXR0ZXIgc3BlY2lmaWVzIHdoYXQgb3BlcmF0aW9uIHRvIGV4ZWN1dGU7IGl0IG1heSBiZQotYW55IG9mIHRoZSBmb2xsb3dpbmcsIGJ1dCB5b3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZW06Ci0KLS5UUAotLkIgZAotXGMKLS5JIERlbGV0ZVxjCi1cJiBtb2R1bGVzIGZyb20gdGhlIGFyY2hpdmUuICBTcGVjaWZ5IHRoZSBuYW1lcyBvZiBtb2R1bGVzIHRvCi1iZSBkZWxldGVkIGFzIFxjCi0uSSBmaWxlc1xjCi1cJjsgdGhlIGFyY2hpdmUgaXMgdW50b3VjaGVkIGlmIHlvdQotc3BlY2lmeSBubyBmaWxlcyB0byBkZWxldGUuCi0KLUlmIHlvdSBzcGVjaWZ5IHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIsIFxjCi0uQiBhclxjCi1cJiB3aWxsIGxpc3QgZWFjaCBtb2R1bGUKLWFzIGl0IGlzIGRlbGV0ZWQuCi0KLS5UUAotLkIgbQotVXNlIHRoaXMgb3BlcmF0aW9uIHRvIFxjCi0uSSBtb3ZlXGMKLVwmIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZS4KLQotVGhlIG9yZGVyaW5nIG9mIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZSBjYW4gbWFrZSBhIGRpZmZlcmVuY2UgaW4gaG93Ci1wcm9ncmFtcyBhcmUgbGlua2VkIHVzaW5nIHRoZSBsaWJyYXJ5LCBpZiBhIHN5bWJvbCBpcyBkZWZpbmVkIGluIG1vcmUKLXRoYW4gb25lIG1lbWJlci4gIAotCi1JZiBubyBtb2RpZmllcnMgYXJlIHVzZWQgd2l0aCBcYwotLkIgbVxjCi1cJiwgYW55IG1lbWJlcnMgeW91IG5hbWUgaW4gdGhlCi1cYwotLkkgZmlsZXNcYwotXCYgYXJndW1lbnRzIGFyZSBtb3ZlZCB0byB0aGUgXGMKLS5JIGVuZFxjCi1cJiBvZiB0aGUgYXJjaGl2ZTsKLXlvdSBjYW4gdXNlIHRoZSBgXHxcYwotLkIgYVxjCi1cfCcsIGBcfFxjCi0uQiBiXGMKLVx8Jywgb3IgYFx8XGMKLS5CIGlcYwotXHwnIG1vZGlmaWVycyB0byBtb3ZlIHRoZW0gdG8gYQotc3BlY2lmaWVkIHBsYWNlIGluc3RlYWQuCi0KLS5UUAotLkIgcAotXGMKLS5JIFByaW50XGMKLVwmIHRoZSBzcGVjaWZpZWQgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSwgdG8gdGhlIHN0YW5kYXJkCi1vdXRwdXQgZmlsZS4gIElmIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIgaXMgc3BlY2lmaWVkLCBzaG93IHRoZSBtZW1iZXIKLW5hbWUgYmVmb3JlIGNvcHlpbmcgaXRzIGNvbnRlbnRzIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotSWYgeW91IHNwZWNpZnkgbm8gXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIGFyZSBwcmludGVkLgotCi0uVFAKLS5CIHEKLVxjCi0uSSBRdWljayBhcHBlbmRcYwotXCY7IGFkZCBcYwotLkkgZmlsZXNcYwotXCYgdG8gdGhlIGVuZCBvZiBcYwotLkkgYXJjaGl2ZVxjCi1cJiwKLXdpdGhvdXQgY2hlY2tpbmcgZm9yIHJlcGxhY2VtZW50LiAgCi0KLVRoZSBtb2RpZmllcnMgYFx8XGMKLS5CIGFcYwotXHwnLCBgXHxcYwotLkIgYlxjCi1cfCcsIGFuZCBgXHxcYwotLkIgaVxjCi1cfCcgZG8gXGMKLS5JIG5vdFxjCi1cJiBhZmZlY3QgdGhpcwotb3BlcmF0aW9uOyBuZXcgbWVtYmVycyBhcmUgYWx3YXlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLgotCi1UaGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIG1ha2VzIFxjCi0uQiBhclxjCi1cJiBsaXN0IGVhY2ggZmlsZSBhcyBpdCBpcyBhcHBlbmRlZC4KLQotU2luY2UgdGhlIHBvaW50IG9mIHRoaXMgb3BlcmF0aW9uIGlzIHNwZWVkLCB0aGUgYXJjaGl2ZSdzIHN5bWJvbCB0YWJsZQotaW5kZXggaXMgbm90IHVwZGF0ZWQsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdGVkOyB5b3UgY2FuIHVzZSBgXHxcYwotLkIgYXIgc1xjCi1cfCcgb3IKLVxjCi0uQiByYW5saWJcYwotXCYgZXhwbGljaXRseSB0byB1cGRhdGUgdGhlIHN5bWJvbCB0YWJsZSBpbmRleC4KLQotSG93ZXZlciwgdG9vIG1hbnkgZGlmZmVyZW50IHN5c3RlbXMgYXNzdW1lIHF1aWNrIGFwcGVuZCByZWJ1aWxkcyB0aGUKLWluZGV4LCBzbyBHTlUKLS5CIGFyCi1pbXBsZW1lbnRzIGBcfFxjCi0uQiBxXGMKLVx8JyBhcyBhIHN5bm9ueW0gZm9yIGBcfFxjCi0uQiByXGMKLVx8Jy4KLQotLlRQCi0uQiByCi1JbnNlcnQgXGMKLS5JIGZpbGVzXGMKLVwmIGludG8gXGMKLS5JIGFyY2hpdmVcYwotXCYgKHdpdGggXGMKLS5JIHJlcGxhY2VtZW50XGMKLVwmKS4gVGhpcwotb3BlcmF0aW9uIGRpZmZlcnMgZnJvbSBgXHxcYwotLkIgcVxjCi1cfCcgaW4gdGhhdCBhbnkgcHJldmlvdXNseSBleGlzdGluZyBtZW1iZXJzCi1hcmUgZGVsZXRlZCBpZiB0aGVpciBuYW1lcyBtYXRjaCB0aG9zZSBiZWluZyBhZGRlZC4KLQotSWYgb25lIG9mIHRoZSBmaWxlcyBuYW1lZCBpbiBcYwotLkkgZmlsZXNcYwotXCYgZG9lc24ndCBleGlzdCwgXGMKLS5CIGFyXGMKLVwmCi1kaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlLCBhbmQgbGVhdmVzIHVuZGlzdHVyYmVkIGFueSBleGlzdGluZyBtZW1iZXJzCi1vZiB0aGUgYXJjaGl2ZSBtYXRjaGluZyB0aGF0IG5hbWUuCi0KLUJ5IGRlZmF1bHQsIG5ldyBtZW1iZXJzIGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBidXQgeW91IG1heQotdXNlIG9uZSBvZiB0aGUgbW9kaWZpZXJzIGBcfFxjCi0uQiBhXGMKLVx8JywgYFx8XGMKLS5CIGJcYwotXHwnLCBvciBgXHxcYwotLkIgaVxjCi1cfCcgdG8gcmVxdWVzdAotcGxhY2VtZW50IHJlbGF0aXZlIHRvIHNvbWUgZXhpc3RpbmcgbWVtYmVyLgotCi1UaGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIHVzZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBlbGljaXRzIGEgbGluZSBvZgotb3V0cHV0IGZvciBlYWNoIGZpbGUgaW5zZXJ0ZWQsIGFsb25nIHdpdGggb25lIG9mIHRoZSBsZXR0ZXJzIGBcfFxjCi0uQiBhXGMKLVx8JyBvcgotYFx8XGMKLS5CIHJcYwotXHwnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFwcGVuZGVkIChubyBvbGQgbWVtYmVyCi1kZWxldGVkKSBvciByZXBsYWNlZC4KLQotLlRQCi0uQiB0Ci1EaXNwbGF5IGEgXGMKLS5JIHRhYmxlXGMKLVwmIGxpc3RpbmcgdGhlIGNvbnRlbnRzIG9mIFxjCi0uSSBhcmNoaXZlXGMKLVwmLCBvciB0aG9zZQotb2YgdGhlIGZpbGVzIGxpc3RlZCBpbiBcYwotLkkgZmlsZXNcYwotXCYgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUKLWFyY2hpdmUuICBOb3JtYWxseSBvbmx5IHRoZSBtZW1iZXIgbmFtZSBpcyBzaG93bjsgaWYgeW91IGFsc28gd2FudCB0bwotc2VlIHRoZSBtb2RlcyAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBncm91cCwgYW5kIHNpemUsIHlvdSBjYW4KLXJlcXVlc3QgdGhhdCBieSBhbHNvIHNwZWNpZnlpbmcgdGhlIGBcfFxjCi0uQiB2XGMKLVx8JyBtb2RpZmllci4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBcYwotLkkgZmlsZXNcYwotXCYsIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotYXJlIGxpc3RlZC4KLQotSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAoc2F5LCBgXHxcYwotLkIgZmllXGMKLVx8JykgaW4KLWFuIGFyY2hpdmUgKHNheSBgXHxcYwotLkIgYi5hXGMKLVx8JyksIGBcfFxjCi0uQiBhciB0IGIuYSBmaWVcYwotXHwnIHdpbGwgbGlzdCBvbmx5IHRoZQotZmlyc3QgaW5zdGFuY2U7IHRvIHNlZSB0aGVtIGFsbCwgeW91IG11c3QgYXNrIGZvciBhIGNvbXBsZXRlCi1saXN0aW5nXChlbVwmaW4gb3VyIGV4YW1wbGUsIGBcfFxjCi0uQiBhciB0IGIuYVxjCi1cfCcuCi0KLS5UUAotLkIgeAotXGMKLS5JIEV4dHJhY3RcYwotXCYgbWVtYmVycyAobmFtZWQgXGMKLS5JIGZpbGVzXGMKLVwmKSBmcm9tIHRoZSBhcmNoaXZlLiAgWW91IGNhbgotdXNlIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIgd2l0aCB0aGlzIG9wZXJhdGlvbiwgdG8gcmVxdWVzdCB0aGF0Ci1cYwotLkIgYXJcYwotXCYgbGlzdCBlYWNoIG5hbWUgYXMgaXQgZXh0cmFjdHMgaXQuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbnkgXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBleHRyYWN0ZWQuCi0KLS5QUAotCi1BIG51bWJlciBvZiBtb2RpZmllcnMgKFxjCi0uSSBtb2RcYwotXCYpIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIFxjCi0uSSBwXGMKLVwmCi1rZXlsZXR0ZXIsIHRvIHNwZWNpZnkgdmFyaWF0aW9ucyBvbiBhbiBvcGVyYXRpb24ncyBiZWhhdmlvcjoKLQotLlRQCi0uQiBhCi1BZGQgbmV3IGZpbGVzIFxjCi0uSSBhZnRlclxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGFcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLgotCi0uVFAKLS5CIGIKLUFkZCBuZXcgZmlsZXMgXGMKLS5JIGJlZm9yZVxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGJcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgYFx8XGMKLS5CIGlcYwotXHwnKS4KLQotLlRQCi0uQiBjCi1cYwotLkkgQ3JlYXRlXGMKLVwmIHRoZSBhcmNoaXZlLiAgVGhlIHNwZWNpZmllZCBcYwotLkkgYXJjaGl2ZVxjCi1cJiBpcyBhbHdheXMKLWNyZWF0ZWQgaWYgaXQgZGlkbid0IGV4aXN0LCB3aGVuIHlvdSByZXF1ZXN0IGFuIHVwZGF0ZS4gIEJ1dCBhIHdhcm5pbmcgaXMKLWlzc3VlZCB1bmxlc3MgeW91IHNwZWNpZnkgaW4gYWR2YW5jZSB0aGF0IHlvdSBleHBlY3QgdG8gY3JlYXRlIGl0LCBieQotdXNpbmcgdGhpcyBtb2RpZmllci4KLQotLlRQCi0uQiBmCi1UcnVuY2F0ZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4gIAotLkIgYXIKLXdpbGwgbm9ybWFsbHkgcGVybWl0IGZpbGUgbmFtZXMgb2YgYW55IGxlbmd0aC4gIFRoaXMgd2lsbCBjYXVzZSBpdCB0bwotY3JlYXRlIGFyY2hpdmVzIHdoaWNoIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgCi0uQiBhcgotcHJvZ3JhbSBvbiBzb21lIHN5c3RlbXMuICBJZiB0aGlzIGlzIGEgY29uY2VybiwgdGhlIAotLkIgZgotbW9kaWZpZXIgbWF5IGJlIHVzZWQgdG8gdHJ1bmNhdGUgZmlsZSBuYW1lcyB3aGVuIHB1dHRpbmcgdGhlbSBpbiB0aGUKLWFyY2hpdmUuCi0KLS5UUAotLkIgaQotSW5zZXJ0IG5ldyBmaWxlcyBcYwotLkkgYmVmb3JlXGMKLVwmIGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBcYwotLkIgaVxjCi1cJiwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgXGMKLS5JIG1lbWJlcm5hbWVcYwotXCYgYXJndW1lbnQsIGJlZm9yZSB0aGUKLVxjCi0uSSBhcmNoaXZlXGMKLVwmIHNwZWNpZmljYXRpb24uICAoc2FtZSBhcyBgXHxcYwotLkIgYlxjCi1cfCcpLgotCi0uVFAKLS5CIGwKLVRoaXMgbW9kaWZpZXIgaXMgYWNjZXB0ZWQgYnV0IG5vdCB1c2VkLgotCi0uVFAKLS5CIG8KLVByZXNlcnZlIHRoZSBcYwotLkkgb3JpZ2luYWxcYwotXCYgZGF0ZXMgb2YgbWVtYmVycyB3aGVuIGV4dHJhY3RpbmcgdGhlbS4gIElmCi15b3UgZG8gbm90IHNwZWNpZnkgdGhpcyBtb2RpZmllciwgZmlsZXMgZXh0cmFjdGVkIGZyb20gdGhlIGFyY2hpdmUKLXdpbGwgYmUgc3RhbXBlZCB3aXRoIHRoZSB0aW1lIG9mIGV4dHJhY3Rpb24uCi0KLS5UUAotLkIgcwotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBgXHxcYwotLkIgYXIgc1xjCi1cfCcgb24gYW4KLWFyY2hpdmUgaXMgZXF1aXZhbGVudCB0byBydW5uaW5nIGBcfFxjCi0uQiByYW5saWJcYwotXHwnIG9uIGl0LgotCi0uVFAKLS5CIFMKLURvIG5vdCBnZW5lcmF0ZSBhbiBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY2FuIHNwZWVkIHVwIGJ1aWxkaW5nIGEKLWxhcmdlIGxpYnJhcnkgaW4gc2V2ZXJhbCBzdGVwcy4gIFRoZSByZXN1bHRpbmcgYXJjaGl2ZSBjYW4gbm90IGJlIHVzZWQKLXdpdGggdGhlIGxpbmtlci4gIEluIG9yZGVyIHRvIGJ1aWxkIGEgc3ltYm9sIHRhYmxlLCB5b3UgbXVzdCBvbWl0IHRoZQotYFx8XGMKLS5CIFNcYwotXHwnIG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBgXHxcYwotLkIgYXJcYwotXHwnLCBvciB5b3UgbXVzdCBydW4gYFx8XGMKLS5CIHJhbmxpYlxjCi1cfCcgb24gdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgdQotTm9ybWFsbHksIFxjCi0uQiBhciByXGMKLVwmLlx8Llx8LiBpbnNlcnRzIGFsbCBmaWxlcwotbGlzdGVkIGludG8gdGhlIGFyY2hpdmUuICBJZiB5b3Ugd291bGQgbGlrZSB0byBpbnNlcnQgXGMKLS5JIG9ubHlcYwotXCYgdGhvc2UKLW9mIHRoZSBmaWxlcyB5b3UgbGlzdCB0aGF0IGFyZSBuZXdlciB0aGFuIGV4aXN0aW5nIG1lbWJlcnMgb2YgdGhlIHNhbWUKLW5hbWVzLCB1c2UgdGhpcyBtb2RpZmllci4gIFRoZSBgXHxcYwotLkIgdVxjCi1cfCcgbW9kaWZpZXIgaXMgYWxsb3dlZCBvbmx5IGZvciB0aGUKLW9wZXJhdGlvbiBgXHxcYwotLkIgclxjCi1cfCcgKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIGBcfFxjCi0uQiBxdVxjCi1cfCcgaXMKLW5vdCBhbGxvd2VkLCBzaW5jZSBjaGVja2luZyB0aGUgdGltZXN0YW1wcyB3b3VsZCBsb3NlIGFueSBzcGVlZAotYWR2YW50YWdlIGZyb20gdGhlIG9wZXJhdGlvbiBgXHxcYwotLkIgcVxjCi1cfCcuCi0KLS5UUAotLkIgdgotVGhpcyBtb2RpZmllciByZXF1ZXN0cyB0aGUgXGMKLS5JIHZlcmJvc2VcYwotXCYgdmVyc2lvbiBvZiBhbiBvcGVyYXRpb24uICBNYW55Ci1vcGVyYXRpb25zIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgc3VjaCBhcyBmaWxlbmFtZXMgcHJvY2Vzc2VkLAotd2hlbiB0aGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIGlzIGFwcGVuZGVkLgotCi0uVFAKLS5CIFYKLVRoaXMgbW9kaWZpZXIgc2hvd3MgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQlIgYXIgLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLSwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpLgotLkJSIG5tICggMSApXGMKLVwmLAotLkJSIHJhbmxpYiAoIDEgKVxjCi1cJi4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXIuYyBiL2JpbnV0aWxzL2FyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOWRjZWYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNDQgKzAsMCBAQAotLyogYXIuYyAtIEFyY2hpdmUgbW9kaWZ5IGFuZCBleHRyYWN0LgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyoKLSAgIEJ1Z3M6IHNob3VsZCB1c2UgZ2V0b3B0IHRoZSB3YXkgdGFyIGRvZXMgKGNvbXBsZXRlIHcvb3B0aW9uYWwgLSkgYW5kCi0gICBzaG91bGQgaGF2ZSBsb25nIG9wdGlvbnMgdG9vLiBHTlUgYXIgdXNlZCB0byBjaGVjayBmaWxlIGFnYWluc3QgZmlsZXN5c3RlbQotICAgaW4gcXVpY2tfdXBkYXRlIGFuZCByZXBsYWNlIG9wZXJhdGlvbnMgKHdvdWxkIGNoZWNrIG10aW1lKS4gRG9lc24ndCB3YXJuCi0gICB3aGVuIG5hbWUgdHJ1bmNhdGVkLiBObyB3YXkgdG8gc3BlY2lmeSBwb3NfZW5kLiBFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUKLSAgIG1vcmUgY29uc2lzdGFudC4KLSovCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgX19HTzMyX19fCi0jZGVmaW5lIEVYVF9OQU1FX0xFTiAzCQkvKiBidWZmbGVuIG9mIGFkZGl0aW9uIHRvIG5hbWUgaWYgaXQncyBNUy1ET1MgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVF9OQU1FX0xFTiA2CQkvKiBkaXR0byBmb3IgKk5JWCAqLwotI2VuZGlmCi0KLS8qIFdlIG5lZWQgdG8gb3BlbiBmaWxlcyBpbiBiaW5hcnkgbW9kZXMgb24gc3lzdGVtIHdoZXJlIHRoYXQgbWFrZXMgYQotICAgZGlmZmVyZW5jZS4gICovCi0jaWZuZGVmIE9fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZIDAKLSNlbmRpZgotCi0jZGVmaW5lIEJVRlNJWkUgODE5MgotCi0vKiBLbHVkZ2UgZGVjbGFyYXRpb24gZnJvbSBCRkQhICBUaGlzIGlzIHVnbHkhICBGSVhNRSEgIFhYWCAqLwotCi1zdHJ1Y3QgYXJfaGRyICoKLSAgYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgUEFSQU1TICgoYmZkICogYWJmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotLyogU3RhdGljIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAotbXJpX2VtdWwgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqKShiZmQgKiksIGNoYXIgKiosIGludCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfY29udGVudHMgUEFSQU1TICgoYmZkICogbWVtYmVyKSk7Ci0KLXN0YXRpYyB2b2lkCi1kZWxldGVfbWVtYmVycyBQQVJBTVMgKChiZmQgKiwgY2hhciAqKmZpbGVzX3RvX2RlbGV0ZSkpOwotCi0jaWYgMAotc3RhdGljIHZvaWQKLWRvX3F1aWNrX2FwcGVuZCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lLAotCQkJIGNoYXIgKipmaWxlc190b19hcHBlbmQpKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotbW92ZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fbW92ZSkpOwotCi1zdGF0aWMgdm9pZAotcmVwbGFjZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fcmVwbGFjZSwgYm9vbGVhbiBxdWljaykpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVzY3IgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotd3JpdGVfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcmFubGliX29ubHkgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaG5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXJhbmxpYl90b3VjaCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNobmFtZSkpOwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgUEFSQU1TICgoaW50KSk7Ci0MCi0vKiogR2xvYmFscyBhbmQgZmxhZ3MgKi8KLQotaW50IG1yaV9tb2RlOwotCi0vKiBUaGlzIGZsYWcgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWI6Ci0gICAxIG1lYW5zIHRoaXMgaXMgJ3JhbmxpYic7IDAgbWVhbnMgdGhpcyBpcyAnYXInLgotICAgLTEgbWVhbnMgaWYgd2Ugc2hvdWxkIHVzZSBhcmd2WzBdIHRvIGRlY2lkZS4gICovCi1leHRlcm4gaW50IGlzX3JhbmxpYjsKLQotLyogTm9uemVybyBtZWFucyBkb24ndCB3YXJuIGFib3V0IGNyZWF0aW5nIHRoZSBhcmNoaXZlIGZpbGUgaWYgbmVjZXNzYXJ5LiAgKi8KLWludCBzaWxlbnRfY3JlYXRlID0gMDsKLQotLyogTm9uemVybyBtZWFucyBkZXNjcmliZSBlYWNoIGFjdGlvbiBwZXJmb3JtZWQuICAqLwotaW50IHZlcmJvc2UgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIHByZXNlcnZlIGRhdGVzIG9mIG1lbWJlcnMgd2hlbiBleHRyYWN0aW5nIHRoZW0uICAqLwotaW50IHByZXNlcnZlX2RhdGVzID0gMDsKLQotLyogTm9uemVybyBtZWFucyBkb24ndCByZXBsYWNlIGV4aXN0aW5nIG1lbWJlcnMgd2hvc2UgZGF0ZXMgYXJlIG1vcmUgcmVjZW50Ci0gICB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVzLiAgKi8KLWludCBuZXdlcl9vbmx5ID0gMDsKLQotLyogQ29udHJvbHMgdGhlIHdyaXRpbmcgb2YgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUgKGluIEJTRDogYSBfXy5TWU1ERUYKLSAgIG1lbWJlcikuICAtMSBtZWFucyB3ZSd2ZSBiZWVuIGV4cGxpY2l0bHkgYXNrZWQgdG8gbm90IHdyaXRlIGEgc3ltYm9sIHRhYmxlOwotICAgKzEgbWVhbnMgd2UndmUgYmVlbiBleHBsaWN0bHkgYXNrZWQgdG8gd3JpdGUgaXQ7Ci0gICAwIGlzIHRoZSBkZWZhdWx0LgotICAgVHJhZGl0aW9uYWxseSwgdGhlIGRlZmF1bHQgaW4gQlNEIGhhcyBiZWVuIHRvIG5vdCB3cml0ZSB0aGUgdGFibGUuCi0gICBIb3dldmVyLCBmb3IgUE9TSVguMiBjb21wbGlhbmNlIHRoZSBkZWZhdWx0IGlzIG5vdyB0byB3cml0ZSBhIHN5bWJvbCB0YWJsZQotICAgaWYgYW55IG9mIHRoZSBtZW1iZXJzIGFyZSBvYmplY3QgZmlsZXMuICAqLwotaW50IHdyaXRlX2FybWFwID0gMDsKLQotLyogTm9uemVybyBtZWFucyBpdCdzIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIG1lbWJlcjsgcG9zaXRpb24gbmV3IG9yIG1vdmVkCi0gICBmaWxlcyB3aXRoIHJlc3BlY3QgdG8gdGhpcyBvbmUuICAqLwotY2hhciAqcG9zbmFtZSA9IE5VTEw7Ci0KLS8qIFNleiBob3cgdG8gdXNlIGBwb3NuYW1lJzogcG9zX2JlZm9yZSBtZWFucyBwb3NpdGlvbiBiZWZvcmUgdGhhdCBtZW1iZXIuCi0gICBwb3NfYWZ0ZXIgbWVhbnMgcG9zaXRpb24gYWZ0ZXIgdGhhdCBtZW1iZXIuIHBvc19lbmQgbWVhbnMgYWx3YXlzIGF0IGVuZC4KLSAgIHBvc19kZWZhdWx0IG1lYW5zIGRlZmF1bHQgYXBwcm9wcmlhdGVseS4gRm9yIHRoZSBsYXR0ZXIgdHdvLCBgcG9zbmFtZScKLSAgIHNob3VsZCBhbHNvIGJlIHplcm8uICAqLwotZW51bSBwb3MKLSAgewotICAgIHBvc19kZWZhdWx0LCBwb3NfYmVmb3JlLCBwb3NfYWZ0ZXIsIHBvc19lbmQKLSAgfSBwb3N0eXBlID0gcG9zX2RlZmF1bHQ7Ci0KLXN0YXRpYyBiZmQgKioKLWdldF9wb3NfYmZkIFBBUkFNUyAoKGJmZCAqKiwgZW51bSBwb3MsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBXaGV0aGVyIHRvIHRydW5jYXRlIG5hbWVzIG9mIGZpbGVzIHN0b3JlZCBpbiB0aGUgYXJjaGl2ZS4gICovCi1zdGF0aWMgYm9vbGVhbiBhcl90cnVuY2F0ZSA9IGZhbHNlOwotCi1pbnQgaW50ZXJhY3RpdmUgPSAwOwotCi1zdGF0aWMgdm9pZAotbXJpX2VtdWwgKCkKLXsKLSAgaW50ZXJhY3RpdmUgPSBpc2F0dHkgKGZpbGVubyAoc3RkaW4pKTsKLSAgeXlwYXJzZSAoKTsKLX0KLQotLyogSWYgQ09VTlQgaXMgMCwgdGhlbiBGVU5DVElPTiBpcyBjYWxsZWQgb25jZSBvbiBlYWNoIGVudHJ5LiAgSWYgbm9uemVybywKLSAgIENPVU5UIGlzIHRoZSBsZW5ndGggb2YgdGhlIEZJTEVTIGNoYWluOyBGVU5DVElPTiBpcyBjYWxsZWQgb24gZWFjaCBlbnRyeQotICAgd2hvc2UgbmFtZSBtYXRjaGVzIG9uZSBpbiBGSUxFUy4gICovCi0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9tZW1iZXJzIChhcmNoLCBmdW5jdGlvbiwgZmlsZXMsIGNvdW50KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHZvaWQgKCpmdW5jdGlvbikgUEFSQU1TICgoYmZkICopKTsKLSAgICAgY2hhciAqKmZpbGVzOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGJmZCAqaGVhZDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKLQl7Ci0JICBQUk9HUkVTUyAoMSk7Ci0JICBmdW5jdGlvbiAoaGVhZCk7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyogVGhpcyBtYXkgYXBwZWFyIHRvIGJlIGEgYmFyb3F1ZSB3YXkgb2YgYWNjb21wbGlzaGluZyB3aGF0IHdlIHdhbnQuCi0gICAgIEhvd2V2ZXIgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGZpbGVuYW1lcyBpbiBvcmRlciB0byBub3RpY2Ugd2hlcmUKLSAgICAgYSBmaWxlbmFtZSBpcyByZXF1ZXN0ZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhcmNoaXZlLiAgRGl0dG8KLSAgICAgbWFwcGluZyBvdmVyIGVhY2ggZmlsZSBlYWNoIHRpbWUgLS0gd2Ugd2FudCB0byBoYWNrIG11bHRpcGxlCi0gICAgIHJlZmVyZW5jZXMuICAqLwotCi0gIGZvciAoOyBjb3VudCA+IDA7IGZpbGVzKyssIGNvdW50LS0pCi0gICAgewotICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0gICAgICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKLQl7Ci0JICBQUk9HUkVTUyAoMSk7Ci0JICBpZiAoaGVhZC0+ZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFNvbWUgYXJjaGl2ZSBmb3JtYXRzIGRvbid0IGdldCB0aGUgZmlsZW5hbWVzIGZpbGxlZCBpbgotCQkgdW50aWwgdGhlIGVsZW1lbnRzIGFyZSBvcGVuZWQuICAqLwotCSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLQkgICAgICBiZmRfc3RhdF9hcmNoX2VsdCAoaGVhZCwgJmJ1Zik7Ci0JICAgIH0KLQkgIGlmICgoaGVhZC0+ZmlsZW5hbWUgIT0gTlVMTCkgJiYKLQkgICAgICAoIXN0cmNtcCAoKmZpbGVzLCBoZWFkLT5maWxlbmFtZSkpKQotCSAgICB7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICAgIGZ1bmN0aW9uIChoZWFkKTsKLQkgICAgfQotCX0KLSAgICAgIGlmICghZm91bmQpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmcHJpbnRmIChzdGRlcnIsIF8oIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIpLCAqZmlsZXMpOwotICAgIH0KLX0KLQwKLWJvb2xlYW4gb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gZmFsc2U7Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoaGVscCkKLSAgICAgaW50IGhlbHA7Ci17Ci0gIEZJTEUgKnM7Ci0KLSAgcyA9IGhlbHAgPyBzdGRvdXQgOiBzdGRlcnI7Ci0gIAotICBpZiAoISBpc19yYW5saWIpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHMsIF8oIlVzYWdlOiAlcyBbLV17ZG1wcXJzdHh9W2FiY2lsb3NTdXZWXSBbbWVtYmVyLW5hbWVdIGFyY2hpdmUtZmlsZSBmaWxlLi4uXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzLCBfKCIgICAgICAgJXMgLU0gWzxtcmktc2NyaXB0XVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgY29tbWFuZHM6XG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIGQgICAgICAgICAgICAtIGRlbGV0ZSBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgbVthYl0gICAgICAgIC0gbW92ZSBmaWxlKHMpIGluIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIHAgICAgICAgICAgICAtIHByaW50IGZpbGUocykgZm91bmQgaW4gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgcVtmXSAgICAgICAgIC0gcXVpY2sgYXBwZW5kIGZpbGUocykgdG8gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgclthYl1bZl1bdV0gIC0gcmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUocykgaW50byB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICB0ICAgICAgICAgICAgLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgeFtvXSAgICAgICAgIC0gZXh0cmFjdCBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiBjb21tYW5kIHNwZWNpZmljIG1vZGlmaWVyczpcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW2FdICAgICAgICAgIC0gcHV0IGZpbGUocykgYWZ0ZXIgW21lbWJlci1uYW1lXVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbYl0gICAgICAgICAgLSBwdXQgZmlsZShzKSBiZWZvcmUgW21lbWJlci1uYW1lXSAoc2FtZSBhcyBbaV0pXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtmXSAgICAgICAgICAtIHRydW5jYXRlIGluc2VydGVkIGZpbGUgbmFtZXNcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW29dICAgICAgICAgIC0gcHJlc2VydmUgb3JpZ2luYWwgZGF0ZXNcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW3VdICAgICAgICAgIC0gb25seSByZXBsYWNlIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gY3VycmVudCBhcmNoaXZlIGNvbnRlbnRzXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgZ2VuZXJpYyBtb2RpZmllcnM6XG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtjXSAgICAgICAgICAtIGRvIG5vdCB3YXJuIGlmIHRoZSBsaWJyYXJ5IGhhZCB0byBiZSBjcmVhdGVkXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtzXSAgICAgICAgICAtIGNyZWF0ZSBhbiBhcmNoaXZlIGluZGV4IChjZi4gcmFubGliKVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbU10gICAgICAgICAgLSBkbyBub3QgYnVpbGQgYSBzeW1ib2wgdGFibGVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW3ZdICAgICAgICAgIC0gYmUgdmVyYm9zZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbVl0gICAgICAgICAgLSBkaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlclxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZnByaW50ZiAocywgXygiVXNhZ2U6ICVzIFstdlZdIGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotCi0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RkZXJyKTsKLQotICBpZiAoaGVscCkKLSAgICBmcHJpbnRmIChzLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLQotICB4ZXhpdCAoaGVscCA/IDAgOiAxKTsKLX0KLQotLyogTm9ybWFsaXplIGEgZmlsZSBuYW1lIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGludG8gYSBmaWxlCi0gICBuYW1lIHdoaWNoIHdlIHdpbGwgdXNlIGluIGFuIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgKGZpbGUsIGFiZmQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOwotICBpZiAoZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBmaWxlbmFtZSsrOwotICBlbHNlCi0gICAgZmlsZW5hbWUgPSBmaWxlOwotCi0gIGlmIChhcl90cnVuY2F0ZQotICAgICAgJiYgYWJmZCAhPSBOVUxMCi0gICAgICAmJiBzdHJsZW4gKGZpbGVuYW1lKSA+IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIC8qIFNwYWNlIGxlYWsuICAqLwotICAgICAgcyA9IChjaGFyICopIHhtYWxsb2MgKGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuICsgMSk7Ci0gICAgICBtZW1jcHkgKHMsIGZpbGVuYW1lLCBhYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbik7Ci0gICAgICBzW2FiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuXSA9ICdcMCc7Ci0gICAgICBmaWxlbmFtZSA9IHM7Ci0gICAgfQotCi0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyogUmVtb3ZlIGFueSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgb25seSBjYWxsZWQgdmlhIHhhdGV4aXQuICAqLwotCi1zdGF0aWMgY2hhciAqb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLXN0YXRpYyBGSUxFICpvdXRwdXRfZmlsZSA9IE5VTEw7Ci1zdGF0aWMgYmZkICpvdXRwdXRfYmZkID0gTlVMTDsKLQotc3RhdGljIHZvaWQKLXJlbW92ZV9vdXRwdXQgKCkKLXsKLSAgaWYgKG91dHB1dF9maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwgJiYgb3V0cHV0X2JmZC0+aW9zdHJlYW0gIT0gTlVMTCkKLQlmY2xvc2UgKChGSUxFICopIChvdXRwdXRfYmZkLT5pb3N0cmVhbSkpOwotICAgICAgaWYgKG91dHB1dF9maWxlICE9IE5VTEwpCi0JZmNsb3NlIChvdXRwdXRfZmlsZSk7Ci0gICAgICB1bmxpbmsgKG91dHB1dF9maWxlbmFtZSk7Ci0gICAgfQotfQotCi0vKiBUaGUgb3B0aW9uIHBhcnNpbmcgc2hvdWxkIGJlIGluIGl0cyBvd24gZnVuY3Rpb24uCi0gICBJdCB3aWxsIGJlIHdoZW4gSSBoYXZlIGdldG9wdCB3b3JraW5nLiAgKi8KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKmFyZ19wdHI7Ci0gIGNoYXIgYzsKLSAgZW51bQotICAgIHsKLSAgICAgIG5vbmUgPSAwLCBkZWxldGUsIHJlcGxhY2UsIHByaW50X3RhYmxlLAotICAgICAgcHJpbnRfZmlsZXMsIGV4dHJhY3QsIG1vdmUsIHF1aWNrX2FwcGVuZAotICAgIH0gb3BlcmF0aW9uID0gbm9uZTsKLSAgaW50IGFyZ19pbmRleDsKLSAgY2hhciAqKmZpbGVzOwotICBjaGFyICppbmFyY2hfZmlsZW5hbWU7Ci0gIGludCBzaG93X3ZlcnNpb247Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgaWYgKGlzX3JhbmxpYiA8IDApCi0gICAgewotICAgICAgY2hhciAqdGVtcDsKLQotICAgICAgdGVtcCA9IHN0cnJjaHIgKHByb2dyYW1fbmFtZSwgJy8nKTsKLSAgICAgIGlmICh0ZW1wID09IE5VTEwpCi0JdGVtcCA9IHByb2dyYW1fbmFtZTsKLSAgICAgIGVsc2UKLQkrK3RlbXA7Ci0gICAgICBpZiAoc3RybGVuICh0ZW1wKSA+PSA2Ci0JICAmJiBzdHJjbXAgKHRlbXAgKyBzdHJsZW4gKHRlbXApIC0gNiwgInJhbmxpYiIpID09IDApCi0JaXNfcmFubGliID0gMTsKLSAgICAgIGVsc2UKLQlpc19yYW5saWIgPSAwOwotICAgIH0KLQotICBpZiAoYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDApCi0JdXNhZ2UgKDEpOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAiLS12ZXJzaW9uIikgPT0gMCkKLQl7Ci0JICBpZiAoaXNfcmFubGliKQotCSAgICBwcmludF92ZXJzaW9uICgicmFubGliIik7Ci0JICBlbHNlCi0JICAgIHByaW50X3ZlcnNpb24gKCJhciIpOwotCX0KLSAgICB9Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSwgMCk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgc2hvd192ZXJzaW9uID0gMDsKLQotICB4YXRleGl0IChyZW1vdmVfb3V0cHV0KTsKLQotICBpZiAoaXNfcmFubGliKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdG91Y2ggPSBmYWxzZTsKLQotICAgICAgaWYgKGFyZ2MgPCAyIHx8IHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDApCi0JdXNhZ2UgKDApOwotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi1WIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmd2WzFdLCAiLXYiKSA9PSAwCi0JICB8fCBzdHJuY21wIChhcmd2WzFdLCAiLS12IiwgMykgPT0gMCkKLQlwcmludF92ZXJzaW9uICgicmFubGliIik7Ci0gICAgICBhcmdfaW5kZXggPSAxOwotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi10IikgPT0gMCkKLQl7Ci0JICArK2FyZ19pbmRleDsKLQkgIHRvdWNoID0gdHJ1ZTsKLQl9Ci0gICAgICB3aGlsZSAoYXJnX2luZGV4IDwgYXJnYykKLQl7Ci0JICBpZiAoISB0b3VjaCkKLQkgICAgcmFubGliX29ubHkgKGFyZ3ZbYXJnX2luZGV4XSk7Ci0JICBlbHNlCi0JICAgIHJhbmxpYl90b3VjaCAoYXJndlthcmdfaW5kZXhdKTsKLQkgICsrYXJnX2luZGV4OwotCX0KLSAgICAgIHhleGl0ICgwKTsKLSAgICB9Ci0KLSAgaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItTSIpID09IDApCi0gICAgewotICAgICAgbXJpX2VtdWwgKCk7Ci0gICAgICB4ZXhpdCAoMCk7Ci0gICAgfQotCi0gIGlmIChhcmdjIDwgMikKLSAgICB1c2FnZSAoMCk7Ci0KLSAgYXJnX3B0ciA9IGFyZ3ZbMV07Ci0KLSAgaWYgKCphcmdfcHRyID09ICctJykKLSAgICArK2FyZ19wdHI7CQkJLyogY29tcGF0aWJpbGl0eSAqLwotCi0gIHdoaWxlICgoYyA9ICphcmdfcHRyKyspICE9ICdcMCcpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdkJzoKLQljYXNlICdtJzoKLQljYXNlICdwJzoKLQljYXNlICdxJzoKLQljYXNlICdyJzoKLQljYXNlICd0JzoKLQljYXNlICd4JzoKLQkgIGlmIChvcGVyYXRpb24gIT0gbm9uZSkKLQkgICAgZmF0YWwgKF8oInR3byBkaWZmZXJlbnQgb3BlcmF0aW9uIG9wdGlvbnMgc3BlY2lmaWVkIikpOwotCSAgc3dpdGNoIChjKQotCSAgICB7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIG9wZXJhdGlvbiA9IGRlbGV0ZTsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdtJzoKLQkgICAgICBvcGVyYXRpb24gPSBtb3ZlOwotCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3AnOgotCSAgICAgIG9wZXJhdGlvbiA9IHByaW50X2ZpbGVzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdxJzoKLQkgICAgICBvcGVyYXRpb24gPSBxdWlja19hcHBlbmQ7Ci0JICAgICAgb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncic6Ci0JICAgICAgb3BlcmF0aW9uID0gcmVwbGFjZTsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd0JzoKLQkgICAgICBvcGVyYXRpb24gPSBwcmludF90YWJsZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAneCc6Ci0JICAgICAgb3BlcmF0aW9uID0gZXh0cmFjdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWNhc2UgJ2wnOgotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBzaWxlbnRfY3JlYXRlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgcHJlc2VydmVfZGF0ZXMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICB3cml0ZV9hcm1hcCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIHdyaXRlX2FybWFwID0gLTE7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIG5ld2VyX29ubHkgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgcG9zdHlwZSA9IHBvc19hZnRlcjsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgcG9zdHlwZSA9IHBvc19iZWZvcmU7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIHBvc3R5cGUgPSBwb3NfYmVmb3JlOwotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6Ci0JICBtcmlfbW9kZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGFyX3RydW5jYXRlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIpLCBwcm9ncmFtX25hbWUsIGMpOwotCSAgdXNhZ2UgKDApOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgiYXIiKTsKLQotICBpZiAoYXJnYyA8IDMpCi0gICAgdXNhZ2UgKDApOwotCi0gIGlmIChtcmlfbW9kZSkKLSAgICB7Ci0gICAgICBtcmlfZW11bCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmQgKmFyY2g7Ci0KLSAgICAgIC8qIFdlIGNhbid0IHdyaXRlIGFuIGFybWFwIHdoZW4gdXNpbmcgYXIgcSwgc28ganVzdCBkbyBhciByCi0gICAgICAgICBpbnN0ZWFkLiAgKi8KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kICYmIHdyaXRlX2FybWFwKQotCW9wZXJhdGlvbiA9IHJlcGxhY2U7Ci0KLSAgICAgIGlmICgob3BlcmF0aW9uID09IG5vbmUgfHwgb3BlcmF0aW9uID09IHByaW50X3RhYmxlKQotCSAgJiYgd3JpdGVfYXJtYXAgPT0gMSkKLQl7Ci0JICByYW5saWJfb25seSAoYXJndlsyXSk7Ci0JICB4ZXhpdCAoMCk7Ci0JfQotCi0gICAgICBpZiAob3BlcmF0aW9uID09IG5vbmUpCi0JZmF0YWwgKF8oIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiKSk7Ci0KLSAgICAgIGlmIChuZXdlcl9vbmx5ICYmIG9wZXJhdGlvbiAhPSByZXBsYWNlKQotCWZhdGFsIChfKCJgdScgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGByJyBvcHRpb24uIikpOwotCi0gICAgICBhcmdfaW5kZXggPSAyOwotCi0gICAgICBpZiAocG9zdHlwZSAhPSBwb3NfZGVmYXVsdCkKLQlwb3NuYW1lID0gYXJndlthcmdfaW5kZXgrK107Ci0KLSAgICAgIGluYXJjaF9maWxlbmFtZSA9IGFyZ3ZbYXJnX2luZGV4KytdOwotCi0gICAgICBmaWxlcyA9IGFyZ19pbmRleCA8IGFyZ2MgPyBhcmd2ICsgYXJnX2luZGV4IDogTlVMTDsKLQotI2lmIDAKLSAgICAgIC8qIFdlIGRvbid0IHVzZSBkb19xdWlja19hcHBlbmQgYW55IG1vcmUuICBUb28gbWFueSBzeXN0ZW1zCi0gICAgICAgICBleHBlY3QgYXIgdG8gYWx3YXlzIHJlYnVpbGQgdGhlIHN5bWJvbCB0YWJsZSBldmVuIHdoZW4gcSBpcwotICAgICAgICAgdXNlZC4gICovCi0KLSAgICAgIC8qIFdlIGNhbid0IGRvIGEgcXVpY2sgYXBwZW5kIGlmIHdlIG5lZWQgdG8gY29uc3RydWN0IGFuCi0JIGV4dGVuZGVkIG5hbWUgdGFibGUsIGJlY2F1c2UgZG9fcXVpY2tfYXBwZW5kIHdvbid0IGJlIGFibGUgdG8KLQkgcmVidWlsZCB0aGUgbmFtZSB0YWJsZS4gIFVuZm9ydHVuYXRlbHksIGF0IHRoaXMgcG9pbnQgd2UKLQkgZG9uJ3QgYWN0dWFsbHkga25vdyB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aCBwZXJtaXR0ZWQgYnkgdGhpcwotCSBvYmplY3QgZmlsZSBmb3JtYXQuICBTbywgd2UgZ3Vlc3MuICBGSVhNRS4gICovCi0gICAgICBpZiAob3BlcmF0aW9uID09IHF1aWNrX2FwcGVuZCAmJiAhIGFyX3RydW5jYXRlKQotCXsKLQkgIGNoYXIgKipjaGs7Ci0KLQkgIGZvciAoY2hrID0gZmlsZXM7IGNoayAhPSBOVUxMICYmICpjaGsgIT0gJ1wwJzsgY2hrKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybGVuIChub3JtYWxpemUgKCpjaGssIChiZmQgKikgTlVMTCkpID4gMTQpCi0JCXsKLQkJICBvcGVyYXRpb24gPSByZXBsYWNlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kKQotCXsKLQkgIC8qIE5vdGUgdGhhdCBxdWljayBhcHBlbmRpbmcgdG8gYSBub24tZXhpc3RlbnQgYXJjaGl2ZSBjcmVhdGVzIGl0LAotCSAgICAgZXZlbiBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgdG8gYXBwZW5kLiAqLwotCSAgZG9fcXVpY2tfYXBwZW5kIChpbmFyY2hfZmlsZW5hbWUsIGZpbGVzKTsKLQkgIHhleGl0ICgwKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgYXJjaCA9IG9wZW5faW5hcmNoIChpbmFyY2hfZmlsZW5hbWUsCi0JCQkgIGZpbGVzID09IE5VTEwgPyAoY2hhciAqKSBOVUxMIDogZmlsZXNbMF0pOwotCi0gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikKLQl7Ci0JY2FzZSBwcmludF90YWJsZToKLQkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIHByaW50X2Rlc2NyLCBmaWxlcywgYXJnYyAtIDMpOwotCSAgYnJlYWs7Ci0KLQljYXNlIHByaW50X2ZpbGVzOgotCSAgbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgcHJpbnRfY29udGVudHMsIGZpbGVzLCBhcmdjIC0gMyk7Ci0JICBicmVhazsKLQotCWNhc2UgZXh0cmFjdDoKLQkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIGV4dHJhY3RfZmlsZSwgZmlsZXMsIGFyZ2MgLSAzKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBkZWxldGU6Ci0JICBpZiAoZmlsZXMgIT0gTlVMTCkKLQkgICAgZGVsZXRlX21lbWJlcnMgKGFyY2gsIGZpbGVzKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBtb3ZlOgotCSAgaWYgKGZpbGVzICE9IE5VTEwpCi0JICAgIG1vdmVfbWVtYmVycyAoYXJjaCwgZmlsZXMpOwotCSAgYnJlYWs7Ci0KLQljYXNlIHJlcGxhY2U6Ci0JY2FzZSBxdWlja19hcHBlbmQ6Ci0JICBpZiAoZmlsZXMgIT0gTlVMTCB8fCB3cml0ZV9hcm1hcCA+IDApCi0JICAgIHJlcGxhY2VfbWVtYmVycyAoYXJjaCwgZmlsZXMsIG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFNob3VsZG4ndCBoYXBwZW4hICovCi0JZGVmYXVsdDoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnRlcm5hbCBlcnJvciAtLSB0aGlzIG9wdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIpLAotCQkgICBwcm9ncmFtX25hbWUpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICB9Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0gIHhleGl0ICgwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWJmZCAqCi1vcGVuX2luYXJjaCAoYXJjaGl2ZV9maWxlbmFtZSwgZmlsZSkKLSAgICAgY29uc3QgY2hhciAqYXJjaGl2ZV9maWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgY29uc3QgY2hhciAqdGFyZ2V0OwotICBiZmQgKipsYXN0X29uZTsKLSAgYmZkICpuZXh0X29uZTsKLSAgc3RydWN0IHN0YXQgc2J1ZjsKLSAgYmZkICphcmNoOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotICB0YXJnZXQgPSBOVUxMOwotCi0gIGlmIChzdGF0IChhcmNoaXZlX2ZpbGVuYW1lLCAmc2J1ZikgIT0gMCkKLSAgICB7Ci0jaWZuZGVmIF9fR08zMl9fCi0KLS8qIEtMVURHRSBBTEVSVCEgVGVtcG9yYXJ5IGZpeCB1bnRpbCBJIGZpZ2dlciB3aHkKLSAqIHN0YXQoKSBpcyB3cm9uZyAuLi4gdGhpbmsgaXQncyBidXJpZWQgaW4gR08zMidzIElEVAotICogLSBKYXgKLSAqLwotICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQliZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotI2VuZGlmCi0KLSAgICAgIGlmICghb3BlcmF0aW9uX2FsdGVyc19hcmNoKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgcGVycm9yIChhcmNoaXZlX2ZpbGVuYW1lKTsKLQkgIG1heWJlcXVpdCAoKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgLyogVHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIHRhcmdldCB0byB1c2UgZm9yIHRoZSBhcmNoaXZlIGZyb20gdGhlCi0gICAgICAgICBmaXJzdCBvYmplY3Qgb24gdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKLQl7Ci0JICBiZmQgKm9iajsKLQotCSAgb2JqID0gYmZkX29wZW5yIChmaWxlLCBOVUxMKTsKLQkgIGlmIChvYmogIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChvYmosIGJmZF9vYmplY3QpKQotCQl0YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAob2JqKTsKLQkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChvYmopOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZS4gICovCi0gICAgICBhcmNoID0gYmZkX29wZW53IChhcmNoaXZlX2ZpbGVuYW1lLCB0YXJnZXQpOwotICAgICAgaWYgKGFyY2ggPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X2Zvcm1hdCAoYXJjaCwgYmZkX2FyY2hpdmUpCi0JICB8fCAhIGJmZF9jbG9zZSAoYXJjaCkpCi0JYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgYXJjaCA9IGJmZF9vcGVuciAoYXJjaGl2ZV9maWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICB7Ci0gICAgYmxvc2VyOgotICAgICAgYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmNoLCBiZmRfYXJjaGl2ZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIGxhc3Rfb25lID0gJihhcmNoLT5uZXh0KTsKLSAgLyogUmVhZCBhbGwgdGhlIGNvbnRlbnRzIHJpZ2h0IGF3YXksIHJlZ2FyZGxlc3MuICAqLwotICBmb3IgKG5leHRfb25lID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgTlVMTCk7Ci0gICAgICAgbmV4dF9vbmU7Ci0gICAgICAgbmV4dF9vbmUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBuZXh0X29uZSkpCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotICAgICAgKmxhc3Rfb25lID0gbmV4dF9vbmU7Ci0gICAgICBsYXN0X29uZSA9ICZuZXh0X29uZS0+bmV4dDsKLSAgICB9Ci0gICpsYXN0X29uZSA9IChiZmQgKikgTlVMTDsKLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpCi0gICAgZ290byBibG9zZXI7Ci0gIHJldHVybiBhcmNoOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IG5jb3BpZWQgPSAwOwotICBjaGFyICpjYnVmID0geG1hbGxvYyAoQlVGU0laRSk7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgbG9uZyBzaXplOwotICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpICE9IDApCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBwcmludGYgKF8oIlxuPG1lbWJlciAlcz5cblxuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpOwotCi0gIHNpemUgPSBidWYuc3Rfc2l6ZTsKLSAgd2hpbGUgKG5jb3BpZWQgPCBzaXplKQotICAgIHsKLQotICAgICAgaW50IG5yZWFkOwotICAgICAgaW50IHRvY29weSA9IHNpemUgLSBuY29waWVkOwotICAgICAgaWYgKHRvY29weSA+IEJVRlNJWkUpCi0JdG9jb3B5ID0gQlVGU0laRTsKLQotICAgICAgbnJlYWQgPSBiZmRfcmVhZCAoY2J1ZiwgMSwgdG9jb3B5LCBhYmZkKTsJLyogb29wcyAtLSBicm9rZQotCQkJCQkJCSAgIGFic3RyYWN0aW9uISAgKi8KLSAgICAgIGlmIChucmVhZCAhPSB0b2NvcHkpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmYXRhbCAoXygiJXMgaXMgbm90IGEgdmFsaWQgYXJjaGl2ZSIpLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKTsKLSAgICAgIGZ3cml0ZSAoY2J1ZiwgMSwgbnJlYWQsIHN0ZG91dCk7Ci0gICAgICBuY29waWVkICs9IHRvY29weTsKLSAgICB9Ci0gIGZyZWUgKGNidWYpOwotfQotCi0vKiBFeHRyYWN0IGEgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGludG8gaXRzIG93biBmaWxlLgotCi0gICBXZSBkZWZlciBvcGVuaW5nIHRoZSBuZXcgZmlsZSB1bnRpbCBhZnRlciB3ZSBoYXZlIHJlYWQgYSBCVUZTSVogY2h1bmsgb2YgdGhlCi0gICBvbGQgb25lLCBzaW5jZSB3ZSBrbm93IHdlIGhhdmUganVzdCByZWFkIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhlIG9sZAotICAgb25lLiAgU2luY2UgbW9zdCBtZW1iZXJzIGFyZSBzaG9ydGVyIHRoYW4gQlVGU0laLCB0aGlzIG1lYW5zIHdlIHdpbGwgcmVhZAotICAgdGhlIG9sZCBoZWFkZXIsIHJlYWQgdGhlIG9sZCBkYXRhLCB3cml0ZSBhIG5ldyBpbm9kZSBmb3IgdGhlIG5ldyBmaWxlLCBhbmQKLSAgIHdyaXRlIHRoZSBuZXcgZGF0YSwgYW5kIGJlIGRvbmUuIFRoaXMgJ29wdGltaXphdGlvbicgaXMgd2hhdCBjb21lcyBmcm9tCi0gICBzaXR0aW5nIG5leHQgdG8gYSBiYXJlIGRpc2sgYW5kIGhlYXJpbmcgaXQgZXZlcnkgdGltZSBpdCBzZWVrcy4gIC0tIEdudQotICAgR2lsbW9yZSAgKi8KLQotdm9pZAotZXh0cmFjdF9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKm9zdHJlYW07Ci0gIGNoYXIgKmNidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKLSAgaW50IG5yZWFkLCB0b2NvcHk7Ci0gIGxvbmcgbmNvcGllZCA9IDA7Ci0gIGxvbmcgc2l6ZTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICAKLSAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChhYmZkLCAmYnVmKSAhPSAwKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICBzaXplID0gYnVmLnN0X3NpemU7Ci0KLSAgaWYgKHNpemUgPCAwKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oInN0YXQgcmV0dXJucyBuZWdhdGl2ZSBzaXplIGZvciAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIAotICBpZiAodmVyYm9zZSkKLSAgICBwcmludGYgKCJ4IC0gJXNcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpOwotCi0gIG9zdHJlYW0gPSBOVUxMOwotICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFNlZW1zIGxpa2UgYW4gYWJzdHJhY3Rpb24gdmlvbGF0aW9uLCBlaD8gIFdlbGwgaXQncyBPSyEgKi8KLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotCi0gICAgICBvc3RyZWFtID0gZm9wZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBGT1BFTl9XQik7Ci0gICAgICBpZiAob3N0cmVhbSA9PSBOVUxMKQotCXsKLQkgIHBlcnJvciAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgeGV4aXQgKDEpOwotCX0KLQotICAgICAgb3V0cHV0X2ZpbGUgPSBvc3RyZWFtOwotICAgIH0KLSAgZWxzZQotICAgIHdoaWxlIChuY29waWVkIDwgc2l6ZSkKLSAgICAgIHsKLQl0b2NvcHkgPSBzaXplIC0gbmNvcGllZDsKLQlpZiAodG9jb3B5ID4gQlVGU0laRSkKLQkgIHRvY29weSA9IEJVRlNJWkU7Ci0KLQlucmVhZCA9IGJmZF9yZWFkIChjYnVmLCAxLCB0b2NvcHksIGFiZmQpOwotCWlmIChucmVhZCAhPSB0b2NvcHkpCi0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZmF0YWwgKF8oIiVzIGlzIG5vdCBhIHZhbGlkIGFyY2hpdmUiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSkpOwotCi0JLyogU2VlIGNvbW1lbnQgYWJvdmU7IHRoaXMgc2F2ZXMgZGlzayBhcm0gbW90aW9uICovCi0JaWYgKG9zdHJlYW0gPT0gTlVMTCkKLQkgIHsKLQkgICAgLyogU2VlbXMgbGlrZSBhbiBhYnN0cmFjdGlvbiB2aW9sYXRpb24sIGVoPyAgV2VsbCBpdCdzIE9LISAqLwotCSAgICBvdXRwdXRfZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLQotCSAgICBvc3RyZWFtID0gZm9wZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBGT1BFTl9XQik7Ci0JICAgIGlmIChvc3RyZWFtID09IE5VTEwpCi0JICAgICAgewotCQlwZXJyb3IgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkJeGV4aXQgKDEpOwotCSAgICAgIH0KLQotCSAgICBvdXRwdXRfZmlsZSA9IG9zdHJlYW07Ci0JICB9Ci0JZndyaXRlIChjYnVmLCAxLCBucmVhZCwgb3N0cmVhbSk7Ci0JbmNvcGllZCArPSB0b2NvcHk7Ci0gICAgICB9Ci0KLSAgaWYgKG9zdHJlYW0gIT0gTlVMTCkKLSAgICBmY2xvc2UgKG9zdHJlYW0pOwotCi0gIG91dHB1dF9maWxlID0gTlVMTDsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQotICBjaG1vZCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGJ1Zi5zdF9tb2RlKTsKLQotICBpZiAocHJlc2VydmVfZGF0ZXMpCi0gICAgc2V0X3RpbWVzIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgJmJ1Zik7Ci0KLSAgZnJlZSAoY2J1Zik7Ci19Ci0KLSNpZiAwCi0KLS8qIFdlIGRvbid0IHVzZSB0aGlzIGFueW1vcmUuICBUb28gbWFueSBzeXN0ZW1zIGV4cGVjdCBhciB0byByZWJ1aWxkCi0gICB0aGUgc3ltYm9sIHRhYmxlIGV2ZW4gd2hlbiBxIGlzIHVzZWQuICAqLwotCi0vKiBKdXN0IGRvIGl0IHF1aWNrbHk7IGRvbid0IHdvcnJ5IGFib3V0IGR1cHMsIGFybWFwLCBvciBhbnl0aGluZyBsaWtlIHRoYXQgKi8KLQotc3RhdGljIHZvaWQKLWRvX3F1aWNrX2FwcGVuZCAoYXJjaGl2ZV9maWxlbmFtZSwgZmlsZXNfdG9fYXBwZW5kKQotICAgICBjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lOwotICAgICBjaGFyICoqZmlsZXNfdG9fYXBwZW5kOwotewotICBGSUxFICpvZmlsZSwgKmlmaWxlOwotICBjaGFyICpidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKLSAgbG9uZyB0b2NvcHksIHRoaXN0aW1lOwotICBiZmQgKnRlbXA7Ci0gIHN0cnVjdCBzdGF0IHNidWY7Ci0gIGJvb2xlYW4gbmV3ZmlsZSA9IGZhbHNlOwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotCi0gIGlmIChzdGF0IChhcmNoaXZlX2ZpbGVuYW1lLCAmc2J1ZikgIT0gMCkKLSAgICB7Ci0KLSNpZm5kZWYgX19HTzMyX18KLQotLyogS0xVREdFIEFMRVJUISBUZW1wb3JhcnkgZml4IHVudGlsIEkgZmlnZ2VyIHdoeQotICogc3RhdCgpIGlzIHdyb25nIC4uLiB0aGluayBpdCdzIGJ1cmllZCBpbiBHTzMyJ3MgSURUCi0gKiAtIEpheAotICovCi0KLSAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCi0JYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSNlbmRpZgotCi0gICAgICBuZXdmaWxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgb2ZpbGUgPSBmb3BlbiAoYXJjaGl2ZV9maWxlbmFtZSwgRk9QRU5fQVVCKTsKLSAgaWYgKG9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgcGVycm9yIChwcm9ncmFtX25hbWUpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICB0ZW1wID0gYmZkX29wZW5yIChhcmNoaXZlX2ZpbGVuYW1lLCBOVUxMKTsKLSAgaWYgKHRlbXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLSAgaWYgKG5ld2ZpbGUgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHRlbXAsIGJmZF9hcmNoaXZlKSAhPSB0cnVlKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZmF0YWwgKF8oIiVzIGlzIG5vdCBhbiBhcmNoaXZlIiksIGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZ3cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgb2ZpbGUpOwotICAgICAgaWYgKCFzaWxlbnRfY3JlYXRlKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY3JlYXRpbmcgJXNcbiIpLAotCQkgcHJvZ3JhbV9uYW1lLCBhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGFyX3RydW5jYXRlKQotICAgIHRlbXAtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci0KLSAgLyogYXNzdW1lIGl0J3MgYW4gYWNoaXZlLCBnbyBzdHJhaWdodCB0byB0aGUgZW5kLCBzYW5zICQyMDAgKi8KLSAgZnNlZWsgKG9maWxlLCAwLCAyKTsKLQotICBmb3IgKDsgZmlsZXNfdG9fYXBwZW5kICYmICpmaWxlc190b19hcHBlbmQ7ICsrZmlsZXNfdG9fYXBwZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlICh0ZW1wLCAqZmlsZXNfdG9fYXBwZW5kKTsKLSAgICAgIGlmIChoZHIgPT0gTlVMTCkKLQl7Ci0JICBiZmRfZmF0YWwgKCpmaWxlc190b19hcHBlbmQpOwotCX0KLQotICAgICAgQkZEX1NFTkQgKHRlbXAsIF9iZmRfdHJ1bmNhdGVfYXJuYW1lLCAodGVtcCwgKmZpbGVzX3RvX2FwcGVuZCwgKGNoYXIgKikgaGRyKSk7Ci0KLSAgICAgIGlmaWxlID0gZm9wZW4gKCpmaWxlc190b19hcHBlbmQsIEZPUEVOX1JCKTsKLSAgICAgIGlmIChpZmlsZSA9PSBOVUxMKQotCXsKLQkgIGJmZF9ub25mYXRhbCAoKmZpbGVzX3RvX2FwcGVuZCk7Ci0JfQotCi0gICAgICBpZiAoc3RhdCAoKmZpbGVzX3RvX2FwcGVuZCwgJnNidWYpICE9IDApCi0JewotCSAgYmZkX25vbmZhdGFsICgqZmlsZXNfdG9fYXBwZW5kKTsKLQl9Ci0KLSAgICAgIHRvY29weSA9IHNidWYuc3Rfc2l6ZTsKLQotICAgICAgLyogWFhYIHNob3VsZCBkbyBlcnJvci1jaGVja2luZyEgKi8KLSAgICAgIGZ3cml0ZSAoaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBvZmlsZSk7Ci0KLSAgICAgIHdoaWxlICh0b2NvcHkgPiAwKQotCXsKLQkgIHRoaXN0aW1lID0gdG9jb3B5OwotCSAgaWYgKHRoaXN0aW1lID4gQlVGU0laRSkKLQkgICAgdGhpc3RpbWUgPSBCVUZTSVpFOwotCSAgZnJlYWQgKGJ1ZiwgMSwgdGhpc3RpbWUsIGlmaWxlKTsKLQkgIGZ3cml0ZSAoYnVmLCAxLCB0aGlzdGltZSwgb2ZpbGUpOwotCSAgdG9jb3B5IC09IHRoaXN0aW1lOwotCX0KLSAgICAgIGZjbG9zZSAoaWZpbGUpOwotICAgICAgaWYgKChzYnVmLnN0X3NpemUgJSAyKSA9PSAxKQotCXB1dGMgKCdcMDEyJywgb2ZpbGUpOwotICAgIH0KLSAgZmNsb3NlIChvZmlsZSk7Ci0gIGJmZF9jbG9zZSAodGVtcCk7Ci0gIGZyZWUgKGJ1Zik7Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9hcmNoaXZlIChpYXJjaCkKLSAgICAgYmZkICppYXJjaDsKLXsKLSAgYmZkICpvYmZkOwotICBjaGFyICpvbGRfbmFtZSwgKm5ld19uYW1lOwotICBiZmQgKmNvbnRlbnRzX2hlYWQgPSBpYXJjaC0+bmV4dDsKLQotICBvbGRfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoaWFyY2gpKSArIDEpOwotICBzdHJjcHkgKG9sZF9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYXJjaCkpOwotICBuZXdfbmFtZSA9IG1ha2VfdGVtcG5hbWUgKG9sZF9uYW1lKTsKLQotICBvdXRwdXRfZmlsZW5hbWUgPSBuZXdfbmFtZTsKLQotICBvYmZkID0gYmZkX29wZW53IChuZXdfbmFtZSwgYmZkX2dldF90YXJnZXQgKGlhcmNoKSk7Ci0KLSAgaWYgKG9iZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKLQotICBvdXRwdXRfYmZkID0gb2JmZDsKLQotICBiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2FyY2hpdmUpOwotCi0gIC8qIFJlcXVlc3Qgd3JpdGluZyB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdW5sZXNzIHdlJ3ZlCi0gICAgIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgbm90IHRvLiAgKi8KLSAgb2JmZC0+aGFzX2FybWFwID0gd3JpdGVfYXJtYXAgPj0gMDsKLQotICBpZiAoYXJfdHJ1bmNhdGUpCi0gICAgewotICAgICAgLyogVGhpcyBzaG91bGQgcmVhbGx5IHVzZSBiZmRfc2V0X2ZpbGVfZmxhZ3MsIGJ1dCB0aGF0IHJlamVjdHMKLSAgICAgICAgIGFyY2hpdmVzLiAgKi8KLSAgICAgIG9iZmQtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci0gICAgfQotCi0gIGlmIChiZmRfc2V0X2FyY2hpdmVfaGVhZCAob2JmZCwgY29udGVudHNfaGVhZCkgIT0gdHJ1ZSkKLSAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKLQotICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCi0gICAgYmZkX2ZhdGFsIChvbGRfbmFtZSk7Ci0KLSAgb3V0cHV0X2JmZCA9IE5VTEw7Ci0gIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0KLSAgLyogV2UgZG9uJ3QgY2FyZSBpZiB0aGlzIGZhaWxzOyB3ZSBtaWdodCBiZSBjcmVhdGluZyB0aGUgYXJjaGl2ZS4gICovCi0gIGJmZF9jbG9zZSAoaWFyY2gpOwotCi0gIGlmIChzbWFydF9yZW5hbWUgKG5ld19uYW1lLCBvbGRfbmFtZSwgMCkgIT0gMCkKLSAgICB4ZXhpdCAoMSk7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGVudHJ5IHdoaWNoIHNob3VsZCBiZSBycGxhY2QnZAotICAgaW50byB3aGVuIGFsdGVyaW5nLiAgREVGQVVMVF9QT1Mgc2hvdWxkIGJlIGhvdyB0byBpbnRlcnByZXQgcG9zX2RlZmF1bHQsCi0gICBhbmQgc2hvdWxkIGJlIGEgcG9zIHZhbHVlLiAgKi8KLQotc3RhdGljIGJmZCAqKgotZ2V0X3Bvc19iZmQgKGNvbnRlbnRzLCBkZWZhdWx0X3BvcywgZGVmYXVsdF9wb3NuYW1lKQotICAgICBiZmQgKipjb250ZW50czsKLSAgICAgZW51bSBwb3MgZGVmYXVsdF9wb3M7Ci0gICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9zbmFtZTsKLXsKLSAgYmZkICoqYWZ0ZXJfYmZkID0gY29udGVudHM7Ci0gIGVudW0gcG9zIHJlYWxwb3M7Ci0gIGNvbnN0IGNoYXIgKnJlYWxwb3NuYW1lOwotCi0gIGlmIChwb3N0eXBlID09IHBvc19kZWZhdWx0KQotICAgIHsKLSAgICAgIHJlYWxwb3MgPSBkZWZhdWx0X3BvczsKLSAgICAgIHJlYWxwb3NuYW1lID0gZGVmYXVsdF9wb3NuYW1lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlYWxwb3MgPSBwb3N0eXBlOwotICAgICAgcmVhbHBvc25hbWUgPSBwb3NuYW1lOwotICAgIH0KLQotICBpZiAocmVhbHBvcyA9PSBwb3NfZW5kKQotICAgIHsKLSAgICAgIHdoaWxlICgqYWZ0ZXJfYmZkKQotCWFmdGVyX2JmZCA9ICYoKCphZnRlcl9iZmQpLT5uZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKDsgKmFmdGVyX2JmZDsgYWZ0ZXJfYmZkID0gJigqYWZ0ZXJfYmZkKS0+bmV4dCkKLQlpZiAoc3RyY21wICgoKmFmdGVyX2JmZCktPmZpbGVuYW1lLCByZWFscG9zbmFtZSkgPT0gMCkKLQkgIHsKLQkgICAgaWYgKHJlYWxwb3MgPT0gcG9zX2FmdGVyKQotCSAgICAgIGFmdGVyX2JmZCA9ICYoKmFmdGVyX2JmZCktPm5leHQ7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLSAgcmV0dXJuIGFmdGVyX2JmZDsKLX0KLQotc3RhdGljIHZvaWQKLWRlbGV0ZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19kZWxldGUpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgY2hhciAqKmZpbGVzX3RvX2RlbGV0ZTsKLXsKLSAgYmZkICoqY3VycmVudF9wdHJfcHRyOwotICBib29sZWFuIGZvdW5kOwotICBib29sZWFuIHNvbWV0aGluZ19jaGFuZ2VkID0gZmFsc2U7Ci0gIGZvciAoOyAqZmlsZXNfdG9fZGVsZXRlICE9IE5VTEw7ICsrZmlsZXNfdG9fZGVsZXRlKQotICAgIHsKLSAgICAgIC8qIEluIGEub3V0IHN5c3RlbXMsIHRoZSBhcm1hcCBpcyBvcHRpb25hbC4gIEl0J3MgYWxzbyBjYWxsZWQKLQkgX18uU1lNREVGLiAgU28gaWYgdGhlIHVzZXIgYXNrZWQgdG8gZGVsZXRlIGl0LCB3ZSBzaG91bGQgcmVtZW1iZXIKLQkgdGhhdCBmYWN0LiBUaGlzIGlzbid0IHF1aXRlIHJpZ2h0IGZvciBDT0ZGIHN5c3RlbXMgKHdoZXJlCi0JIF9fLlNZTURFRiBtaWdodCBiZSByZWd1bGFyIG1lbWJlciksIGJ1dCBpdCdzIHZlcnkgdW5saWtlbHkKLQkgdG8gYmUgYSBwcm9ibGVtLiAgRklYTUUgKi8KLQotICAgICAgaWYgKCFzdHJjbXAgKCpmaWxlc190b19kZWxldGUsICJfXy5TWU1ERUYiKSkKLQl7Ci0JICBhcmNoLT5oYXNfYXJtYXAgPSBmYWxzZTsKLQkgIHdyaXRlX2FybWFwID0gLTE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGZvdW5kID0gZmFsc2U7Ci0gICAgICBjdXJyZW50X3B0cl9wdHIgPSAmKGFyY2gtPm5leHQpOwotICAgICAgd2hpbGUgKCpjdXJyZW50X3B0cl9wdHIpCi0JewotCSAgaWYgKHN0cmNtcCAoKmZpbGVzX3RvX2RlbGV0ZSwgKCpjdXJyZW50X3B0cl9wdHIpLT5maWxlbmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IHRydWU7Ci0JICAgICAgaWYgKHZlcmJvc2UpCi0JCXByaW50ZiAoImQgLSAlc1xuIiwKLQkJCSpmaWxlc190b19kZWxldGUpOwotCSAgICAgICpjdXJyZW50X3B0cl9wdHIgPSAoKCpjdXJyZW50X3B0cl9wdHIpLT5uZXh0KTsKLQkgICAgICBnb3RvIG5leHRfZmlsZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY3VycmVudF9wdHJfcHRyID0gJigoKmN1cnJlbnRfcHRyX3B0ciktPm5leHQpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodmVyYm9zZSAmJiBmb3VuZCA9PSBmYWxzZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgcHJpbnRmIChfKCJObyBtZW1iZXIgbmFtZWQgYCVzJ1xuIiksICpmaWxlc190b19kZWxldGUpOwotCX0KLSAgICBuZXh0X2ZpbGU6Ci0gICAgICA7Ci0gICAgfQotCi0gIGlmIChzb21ldGhpbmdfY2hhbmdlZCA9PSB0cnVlKQotICAgIHsKLSAgICAgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotICAgIH0KLX0KLQotCi0vKiBSZXBvc2l0aW9uIGV4aXN0aW5nIG1lbWJlcnMgd2l0aGluIGFuIGFyY2hpdmUgKi8KLQotc3RhdGljIHZvaWQKLW1vdmVfbWVtYmVycyAoYXJjaCwgZmlsZXNfdG9fbW92ZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjaGFyICoqZmlsZXNfdG9fbW92ZTsKLXsKLSAgYmZkICoqYWZ0ZXJfYmZkOwkJLyogTmV3IGVudHJpZXMgZ28gYWZ0ZXIgdGhpcyBvbmUgKi8KLSAgYmZkICoqY3VycmVudF9wdHJfcHRyOwkvKiBjZHIgcG9pbnRlciBpbnRvIGNvbnRlbnRzICovCi0KLSAgZm9yICg7ICpmaWxlc190b19tb3ZlOyArK2ZpbGVzX3RvX21vdmUpCi0gICAgewotICAgICAgY3VycmVudF9wdHJfcHRyID0gJihhcmNoLT5uZXh0KTsKLSAgICAgIHdoaWxlICgqY3VycmVudF9wdHJfcHRyKQotCXsKLQkgIGJmZCAqY3VycmVudF9wdHIgPSAqY3VycmVudF9wdHJfcHRyOwotCSAgaWYgKHN0cmNtcCAobm9ybWFsaXplICgqZmlsZXNfdG9fbW92ZSwgYXJjaCksCi0JCSAgICAgIGN1cnJlbnRfcHRyLT5maWxlbmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIE1vdmUgdGhpcyBmaWxlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgLSBmaXJzdCBjdXQgZnJvbQotCQkgd2hlcmUgaXQgaXMuICAqLwotCSAgICAgIGJmZCAqbGluazsKLQkgICAgICAqY3VycmVudF9wdHJfcHRyID0gY3VycmVudF9wdHItPm5leHQ7Ci0KLQkgICAgICAvKiBOb3cgZ2x1ZSB0byBlbmQgKi8KLQkgICAgICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19lbmQsIE5VTEwpOwotCSAgICAgIGxpbmsgPSAqYWZ0ZXJfYmZkOwotCSAgICAgICphZnRlcl9iZmQgPSBjdXJyZW50X3B0cjsKLQkgICAgICBjdXJyZW50X3B0ci0+bmV4dCA9IGxpbms7Ci0KLQkgICAgICBpZiAodmVyYm9zZSkKLQkJcHJpbnRmICgibSAtICVzXG4iLCAqZmlsZXNfdG9fbW92ZSk7Ci0KLQkgICAgICBnb3RvIG5leHRfZmlsZTsKLQkgICAgfQotCi0JICBjdXJyZW50X3B0cl9wdHIgPSAmKCgqY3VycmVudF9wdHJfcHRyKS0+bmV4dCk7Ci0JfQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUgJXMhXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCAqZmlsZXNfdG9fbW92ZSwgYXJjaC0+ZmlsZW5hbWUpOwotICAgICAgeGV4aXQgKDEpOwotICAgIG5leHRfZmlsZTo7Ci0gICAgfQotCi0gIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotfQotCi0vKiBPdWdodCB0byBkZWZhdWx0IHRvIHJlcGxhY2luZyBpbiBwbGFjZSwgYnV0IHRoaXMgaXMgZXhpc3RpbmcgcHJhY3RpY2UhICAqLwotCi1zdGF0aWMgdm9pZAotcmVwbGFjZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19tb3ZlLCBxdWljaykKLSAgICAgYmZkICphcmNoOwotICAgICBjaGFyICoqZmlsZXNfdG9fbW92ZTsKLSAgICAgYm9vbGVhbiBxdWljazsKLXsKLSAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gIGJmZCAqKmFmdGVyX2JmZDsJCS8qIE5ldyBlbnRyaWVzIGdvIGFmdGVyIHRoaXMgb25lICovCi0gIGJmZCAqY3VycmVudDsKLSAgYmZkICoqY3VycmVudF9wdHI7Ci0gIGJmZCAqdGVtcDsKLQotICB3aGlsZSAoZmlsZXNfdG9fbW92ZSAmJiAqZmlsZXNfdG9fbW92ZSkKLSAgICB7Ci0gICAgICBpZiAoISBxdWljaykKLQl7Ci0JICBjdXJyZW50X3B0ciA9ICZhcmNoLT5uZXh0OwotCSAgd2hpbGUgKCpjdXJyZW50X3B0cikKLQkgICAgewotCSAgICAgIGN1cnJlbnQgPSAqY3VycmVudF9wdHI7Ci0KLQkgICAgICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGFyIHByb2dyYW1zLCB3ZQotCQkgcGVybWl0IHRoZSBzYW1lIGZpbGUgdG8gYmUgYWRkZWQgbXVsdGlwbGUgdGltZXMuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5vcm1hbGl6ZSAoKmZpbGVzX3RvX21vdmUsIGFyY2gpLAotCQkJICBub3JtYWxpemUgKGN1cnJlbnQtPmZpbGVuYW1lLCBhcmNoKSkgPT0gMAotCQkgICYmIGN1cnJlbnQtPmFyZWx0X2RhdGEgIT0gTlVMTCkKLQkJewotCQkgIGlmIChuZXdlcl9vbmx5KQotCQkgICAgewotCQkgICAgICBzdHJ1Y3Qgc3RhdCBmc2J1ZiwgYXNidWY7Ci0KLQkJICAgICAgaWYgKHN0YXQgKCpmaWxlc190b19tb3ZlLCAmZnNidWYpICE9IDApCi0JCQl7Ci0JCQkgIGlmIChlcnJubyAhPSBFTk9FTlQpCi0JCQkgICAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7Ci0JCQkgIGdvdG8gbmV4dF9maWxlOwotCQkJfQotCQkgICAgICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGN1cnJlbnQsICZhc2J1ZikgIT0gMCkKLQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQlmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBjdXJyZW50LT5maWxlbmFtZSk7Ci0KLQkJICAgICAgaWYgKGZzYnVmLnN0X210aW1lIDw9IGFzYnVmLnN0X210aW1lKQotCQkJZ290byBuZXh0X2ZpbGU7Ci0JCSAgICB9Ci0KLQkJICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19hZnRlciwKLQkJCQkJICAgY3VycmVudC0+ZmlsZW5hbWUpOwotCQkgIHRlbXAgPSAqYWZ0ZXJfYmZkOwotCi0JCSAgKmFmdGVyX2JmZCA9IGJmZF9vcGVuciAoKmZpbGVzX3RvX21vdmUsIE5VTEwpOwotCQkgIGlmICgqYWZ0ZXJfYmZkID09IChiZmQgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7Ci0JCSAgICB9Ci0JCSAgKCphZnRlcl9iZmQpLT5uZXh0ID0gdGVtcDsKLQotCQkgIC8qIHNuaXAgb3V0IHRoaXMgZW50cnkgZnJvbSB0aGUgY2hhaW4gKi8KLQkJICAqY3VycmVudF9wdHIgPSAoKmN1cnJlbnRfcHRyKS0+bmV4dDsKLQotCQkgIGlmICh2ZXJib3NlKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCJyIC0gJXNcbiIsICpmaWxlc190b19tb3ZlKTsKLQkJICAgIH0KLQotCQkgIGNoYW5nZWQgPSB0cnVlOwotCi0JCSAgZ290byBuZXh0X2ZpbGU7Ci0JCX0KLQkgICAgICBjdXJyZW50X3B0ciA9ICYoY3VycmVudC0+bmV4dCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFkZCB0byB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiAgKi8KLQotICAgICAgYWZ0ZXJfYmZkID0gZ2V0X3Bvc19iZmQgKCZhcmNoLT5uZXh0LCBwb3NfZW5kLCBOVUxMKTsKLSAgICAgIHRlbXAgPSAqYWZ0ZXJfYmZkOwotICAgICAgKmFmdGVyX2JmZCA9IGJmZF9vcGVuciAoKmZpbGVzX3RvX21vdmUsIE5VTEwpOwotICAgICAgaWYgKCphZnRlcl9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIGJmZF9mYXRhbCAoKmZpbGVzX3RvX21vdmUpOwotCX0KLSAgICAgIGlmICh2ZXJib3NlKQotCXsKLQkgIHByaW50ZiAoImEgLSAlc1xuIiwgKmZpbGVzX3RvX21vdmUpOwotCX0KLQotICAgICAgKCphZnRlcl9iZmQpLT5uZXh0ID0gdGVtcDsKLQotICAgICAgY2hhbmdlZCA9IHRydWU7Ci0KLSAgICBuZXh0X2ZpbGU6OwotCi0gICAgICBmaWxlc190b19tb3ZlKys7Ci0gICAgfQotCi0gIGlmIChjaGFuZ2VkKQotICAgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotfQotCi1zdGF0aWMgdm9pZAotcmFubGliX29ubHkgKGFyY2huYW1lKQotICAgICBjb25zdCBjaGFyICphcmNobmFtZTsKLXsKLSAgYmZkICphcmNoOwotCi0gIHdyaXRlX2FybWFwID0gMTsKLSAgYXJjaCA9IG9wZW5faW5hcmNoIChhcmNobmFtZSwgKGNoYXIgKikgTlVMTCk7Ci0gIGlmIChhcmNoID09IE5VTEwpCi0gICAgeGV4aXQgKDEpOwotICB3cml0ZV9hcmNoaXZlIChhcmNoKTsKLX0KLQotLyogVXBkYXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHN5bWJvbCBtYXAgb2YgYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1yYW5saWJfdG91Y2ggKGFyY2huYW1lKQotICAgICBjb25zdCBjaGFyICphcmNobmFtZTsKLXsKLSNpZmRlZiBfX0dPMzJfXwotICAvKiBJIGRvbid0IHRoaW5rIHVwZGF0aW5nIHdvcmtzIG9uIGdvMzIuICAqLwotICByYW5saWJfb25seSAoYXJjaG5hbWUpOwotI2Vsc2UKLSAgaW50IGY7Ci0gIGJmZCAqYXJjaDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGYgPSBvcGVuIChhcmNobmFtZSwgT19SRFdSIHwgT19CSU5BUlksIDApOwotICBpZiAoZiA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGJmZF9mYXRhbCAoYXJjaG5hbWUpOwotICAgIH0KLQotICBhcmNoID0gYmZkX2Zkb3BlbnIgKGFyY2huYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmKTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGFyY2huYW1lKTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmNoLCBiZmRfYXJjaGl2ZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGFyY2huYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoISBiZmRfaGFzX21hcCAoYXJjaCkpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiJXM6IG5vIGFyY2hpdmUgbWFwIHRvIHVwZGF0ZSIpLCBhcmNobmFtZSk7Ci0KLSAgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpOwotCi0gIGlmICghIGJmZF9jbG9zZSAoYXJjaCkpCi0gICAgYmZkX2ZhdGFsIChhcmNobmFtZSk7Ci0jZW5kaWYKLX0KLQotLyogVGhpbmdzIHdoaWNoIGFyZSBpbnRlcmVzdGluZyB0byBtYXAgb3ZlciBhbGwgb3Igc29tZSBvZiB0aGUgZmlsZXM6ICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9kZXNjciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBwcmludF9hcmVsdF9kZXNjciAoc3Rkb3V0LCBhYmZkLCB2ZXJib3NlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FybGV4LmwgYi9iaW51dGlscy9hcmxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUxM2QxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FybGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0lewotLyogYXJsZXgubCAtIFN0cmFuZ2Ugc2NyaXB0IGxhbmd1YWdlIGxleGVyICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJhcnBhcnNlLmgiCi0KLWludCBsaW5lbnVtYmVyOwotJX0KLSUlCi0KLSJBRERMSUIiICAgCXsgcmV0dXJuIEFERExJQjsgfQotIkFERE1PRCIgICAJeyByZXR1cm4gQURETU9EOyB9Ci0iQ0xFQVIiICAgCXsgcmV0dXJuIENMRUFSOyB9Ci0iQ1JFQVRFIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KLSJERUxFVEUiICAgCXsgcmV0dXJuIERFTEVURTsgfQotIkRJUkVDVE9SWSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9Ci0iRU5EIiAgIAl7IHJldHVybiBFTkQ7IH0KLSJFWFRSQUNUIiAgIAl7IHJldHVybiBFWFRSQUNUOyB9Ci0iRlVMTERJUiIgICAJeyByZXR1cm4gRlVMTERJUjsgfQotIkhFTFAiICAgCXsgcmV0dXJuIEhFTFA7IH0KLSJMSVNUIgkJeyByZXR1cm4gTElTVDsgfQotIk9QRU4iICAgCXsgcmV0dXJuIE9QRU47IH0KLSJSRVBMQUNFIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9Ci0iVkVSQk9TRSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQotIlNBVkUiICAgCXsgcmV0dXJuIFNBVkU7IH0KLSJhZGRsaWIiICAgCXsgcmV0dXJuIEFERExJQjsgfQotImFkZG1vZCIgICAJeyByZXR1cm4gQURETU9EOyB9Ci0iY2xlYXIiICAgCXsgcmV0dXJuIENMRUFSOyB9Ci0iY3JlYXRlIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KLSJkZWxldGUiICAgCXsgcmV0dXJuIERFTEVURTsgfQotImRpcmVjdG9yeSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9Ci0iZW5kIiAgIAl7IHJldHVybiBFTkQ7IH0KLSJleHRyYWN0IiAgIAl7IHJldHVybiBFWFRSQUNUOyB9Ci0iZnVsbGRpciIgICAJeyByZXR1cm4gRlVMTERJUjsgfQotImhlbHAiICAgCXsgcmV0dXJuIEhFTFA7IH0KLSJsaXN0IgkJeyByZXR1cm4gTElTVDsgfQotIm9wZW4iICAgCXsgcmV0dXJuIE9QRU47IH0KLSJyZXBsYWNlIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9Ci0idmVyYm9zZSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQotInNhdmUiICAgCXsgcmV0dXJuIFNBVkU7IH0KLSIrXG4iICAgICAgICAgICB7IGxpbmVudW1iZXIgKys7IH0KLSIoIiAgICAgICAgICAgICB7IHJldHVybiAnKCc7IH0KLSIpIiAgICAgICAgICAgICB7IHJldHVybiAnKSc7IH0KLSIsIiAgICAgICAgICAgICB7IHJldHVybiAnLCc7IH0KLVtBLVphLXowLTkvJDouXC1cX10rICB7IAkKLQkJeXlsdmFsLm5hbWUgPSAgeHN0cmR1cCAoeXl0ZXh0KTsKLQkJcmV0dXJuIEZJTEVOQU1FOwotCQl9Ci0iKiIuKiAJCXsgfQotIjsiLiogCQl7IH0KLSIgIgkJeyB9Ci0iXG4iCSAJIHsgbGluZW51bWJlciArKzsgcmV0dXJuIE5FV0xJTkU7IH0JCi0KLSUlCi0jaWZuZGVmIHl5d3JhcAotLyogTmVlZGVkIGZvciBsZXgsIHRob3VnaCBub3QgZmxleC4gKi8KLWludCB5eXdyYXAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FycGFyc2UueSBiL2JpbnV0aWxzL2FycGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjNzYwMC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotJXsKLS8qIGFycGFyc2UueSAtIFN0YW5nZSBzY3JpcHQgbGFuZ3VhZ2UgcGFyc2VyICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLWV4dGVybiBpbnQgdmVyYm9zZTsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqbmFtZTsKLXN0cnVjdCBsaXN0ICpsaXN0IDsKLQotfTsKLQotJXRva2VuIE5FV0xJTkUKLSV0b2tlbiBWRVJCT1NFCi0ldG9rZW4gPG5hbWU+IEZJTEVOQU1FCi0ldG9rZW4gQURETElCCi0ldG9rZW4gTElTVAotJXRva2VuIEFERE1PRAotJXRva2VuIENMRUFSCi0ldG9rZW4gQ1JFQVRFCi0ldG9rZW4gREVMRVRFCi0ldG9rZW4gRElSRUNUT1JZCi0ldG9rZW4gRU5ECi0ldG9rZW4gRVhUUkFDVAotJXRva2VuIEZVTExESVIKLSV0b2tlbiBIRUxQCi0ldG9rZW4gUVVJVAotJXRva2VuIFJFUExBQ0UKLSV0b2tlbiBTQVZFCi0ldG9rZW4gT1BFTgotCi0ldHlwZSA8bGlzdD4gbW9kdWxlbGlzdCAKLSV0eXBlIDxsaXN0PiBtb2R1bGVuYW1lCi0ldHlwZSA8bmFtZT4gb3B0aW9uYWxfZmlsZW5hbWUKLSUlCi0KLXN0YXJ0OgotCXsgcHJvbXB0KCk7IH0gc2Vzc2lvbgotCTsKLQotc2Vzc2lvbjoKLQkgICAgc2Vzc2lvbiBjb21tYW5kX2xpbmUKLQl8Ci0JOwotCi1jb21tYW5kX2xpbmU6Ci0JCWNvbW1hbmQgTkVXTElORSB7IHByb21wdCgpOyB9Ci0KLWNvbW1hbmQ6Ci0JCW9wZW5fY29tbWFuZAkKLQl8CWNyZWF0ZV9jb21tYW5kCQotCXwgCXZlcmJvc2VfY29tbWFuZAotCXwJZGlyZWN0b3J5X2NvbW1hbmQKLQl8CWFkZGxpYl9jb21tYW5kCi0JfAljbGVhcl9jb21tYW5kCi0JfAlhZGRtb2RfY29tbWFuZAotCXwgCXNhdmVfY29tbWFuZAotICAgICAgICB8ICAgICAgIGV4dHJhY3RfY29tbWFuZAotCXwJcmVwbGFjZV9jb21tYW5kCi0JfAlkZWxldGVfY29tbWFuZAotCXwJbGlzdF9jb21tYW5kCi0JfCAJRU5ECSB7IGFyX2VuZCgpOyByZXR1cm4gMDsgfQotCXwgCWVycm9yCi0JfCAgICAgICBGSUxFTkFNRSB7IHl5ZXJyb3IoImZvbyIpOyB9Ci0JfAotCTsKLQotCi1leHRyYWN0X2NvbW1hbmQ6Ci0gICAgICAgICAgICAgICAgRVhUUkFDVCBtb2R1bGVuYW1lCi0JCXsgYXJfZXh0cmFjdCgkMik7IH0KLQk7Ci0KLXJlcGxhY2VfY29tbWFuZDoJCi0JCVJFUExBQ0UgbW9kdWxlbmFtZQotCQl7IGFyX3JlcGxhY2UoJDIpOyB9Ci0JOwotCQotY2xlYXJfY29tbWFuZDoKLQkJQ0xFQVIKLQkJeyBhcl9jbGVhcigpOyB9Ci0JOwotCi1kZWxldGVfY29tbWFuZDoKLQkJREVMRVRFIG1vZHVsZW5hbWUKLQkJeyBhcl9kZWxldGUoJDIpOyB9Ci0JOwotYWRkbW9kX2NvbW1hbmQ6Ci0JQURETU9EIG1vZHVsZW5hbWUKLQkJeyBhcl9hZGRtb2QoJDIpOyB9Ci0JOwotCi1saXN0X2NvbW1hbmQ6CQotCQlMSVNUCi0JCXsgYXJfbGlzdCgpOyB9Ci0JOwotCi1zYXZlX2NvbW1hbmQ6CQotCQlTQVZFCi0JCXsgYXJfc2F2ZSgpOyB9Ci0JOwotCi0KLQotb3Blbl9jb21tYW5kOgotCQlPUEVOIEZJTEVOQU1FIAotCQl7IGFyX29wZW4oJDIsMCk7IH0KLQk7Ci0KLWNyZWF0ZV9jb21tYW5kOgotCQlDUkVBVEUgRklMRU5BTUUgCi0JCXsgYXJfb3BlbigkMiwxKTsgfQotCTsKLQotCi1hZGRsaWJfY29tbWFuZDoKLQkJQURETElCIEZJTEVOQU1FIG1vZHVsZWxpc3QKLQkJeyBhcl9hZGRsaWIoJDIsJDMpOyB9Ci0JOwotZGlyZWN0b3J5X2NvbW1hbmQ6Ci0JCURJUkVDVE9SWSBGSUxFTkFNRSBtb2R1bGVsaXN0IG9wdGlvbmFsX2ZpbGVuYW1lCi0JCXsgYXJfZGlyZWN0b3J5KCQyLCAkMywgJDQpOyB9Ci0JOwotCi0KLQotb3B0aW9uYWxfZmlsZW5hbWU6Ci0JCUZJTEVOQU1FCi0JCXsgJCQgPSAkMTsgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0KLW1vZHVsZWxpc3Q6Ci0JJygnIG1vZHVsZW5hbWUgJyknIAotCQl7ICQkID0gJDI7IH0KLQl8Ci0JCXsgJCQgPSAwOyB9Ci0JOwotCi1tb2R1bGVuYW1lOgotCQltb2R1bGVuYW1lIG9wdGNvbW1hIEZJTEVOQU1FCi0JCXsgCXN0cnVjdCBsaXN0ICpuICA9IChzdHJ1Y3QgbGlzdCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0KSk7Ci0JCQluLT5uZXh0ID0gJDE7IAotCQkJbi0+bmFtZSA9ICQzOwotCQkJJCQgPSBuOwotCQkgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0JCi0KLW9wdGNvbW1hOgotCQknLCcKLQl8Ci0JOwotCQotCQkKLXZlcmJvc2VfY29tbWFuZDoKLQlWRVJCT1NFIAotCQl7IHZlcmJvc2UgPSAhdmVyYm9zZTsgfQotCTsKLQotCi0lJQotCi1zdGF0aWMgaW50Ci15eWVycm9yICh4KQotICAgICBjb25zdCBjaGFyICp4OwotewotICBleHRlcm4gaW50IGxpbmVudW1iZXI7Ci0KLSAgcHJpbnRmIChfKCJTeW50YXggZXJyb3IgaW4gYXJjaGl2ZSBzY3JpcHQsIGxpbmUgJWRcbiIpLCBsaW5lbnVtYmVyICsgMSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXJzdXAuYyBiL2JpbnV0aWxzL2Fyc3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZmQ2OTUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXJzdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKiBhcnN1cC5jIC0gQXJjaGl2ZSBzdXBwb3J0IGZvciBNUkkgY29tcGF0aWJpbGl0eQotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGxvb2tzIGFmdGVyIHJlcXVlc3RzIGZyb20gYXJwYXJzZS55LCB0byBwcm92aWRlIHRoZSBNUkkKLXN0eWxlIGxpYnJhcmlhbiBjb21tYW5kIHN5bnRheCArIDEgd29yZCBMSVNUCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhcnN1cC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1zdGF0aWMgdm9pZCBtYXBfb3Zlcl9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqZnVuY3Rpb24pIChiZmQgKiwgYmZkICopLCBzdHJ1Y3QgbGlzdCAqKSk7Ci1zdGF0aWMgdm9pZCBhcl9kaXJlY3RvcnlfZG9lciBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIGFyX2FkZGxpYl9kb2VyIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1leHRlcm4gaW50IHZlcmJvc2U7Ci0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9saXN0IChhcmNoLCBmdW5jdGlvbiwgbGlzdCkKLSAgICAgYmZkICphcmNoOwotICAgICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgICBzdHJ1Y3QgbGlzdCAqbGlzdDsKLXsKLSAgYmZkICpoZWFkOwotCi0gIGlmIChsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuZXh0OwotCi0gICAgICBoZWFkID0gYXJjaC0+bmV4dDsKLSAgICAgIHdoaWxlIChoZWFkICE9IE5VTEwpCi0JewotCSAgbmV4dCA9IGhlYWQtPm5leHQ7Ci0JICBmdW5jdGlvbiAoaGVhZCwgKGJmZCAqKSBOVUxMKTsKLQkgIGhlYWQgPSBuZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbGlzdCAqcHRyOwotCi0gICAgICAvKiBUaGlzIG1heSBhcHBlYXIgdG8gYmUgYSBiYXJvcXVlIHdheSBvZiBhY2NvbXBsaXNoaW5nIHdoYXQgd2UKLQkgd2FudC4gIGhvd2V2ZXIgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGZpbGVuYW1lcyBpbiBvcmRlcgotCSB0byBub3RpY2Ugd2hlcmUgYSBmaWxlbmFtZSBpcyByZXF1ZXN0ZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluCi0JIHRoZSBhcmNoaXZlLiAgRGl0dG8gbWFwcGluZyBvdmVyIGVhY2ggZmlsZSBlYWNoIHRpbWUgLS0gd2UKLQkgd2FudCB0byBoYWNrIG11bHRpcGxlIHJlZmVyZW5jZXMuICAqLwotICAgICAgZm9yIChwdHIgPSBsaXN0OyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkKLQl7Ci0JICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JICBiZmQgKnByZXYgPSBhcmNoOwotCi0JICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkgCi0JICAgIHsKLQkgICAgICBpZiAoaGVhZC0+ZmlsZW5hbWUgIT0gTlVMTAotCQkgICYmIHN0cmNtcCAocHRyLT5uYW1lLCBoZWFkLT5maWxlbmFtZSkgPT0gMCkKLQkJewotCQkgIGZvdW5kID0gdHJ1ZTsKLQkJICBmdW5jdGlvbiAoaGVhZCwgcHJldik7Ci0JCX0KLQkgICAgICBwcmV2ID0gaGVhZDsKLQkgICAgfQotCSAgaWYgKCEgZm91bmQpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiTm8gZW50cnkgJXMgaW4gYXJjaGl2ZS5cbiIpLCBwdHItPm5hbWUpOwotCX0KLSAgICB9Ci19Ci0KLQotRklMRSAqb3V0ZmlsZTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotYXJfZGlyZWN0b3J5X2RvZXIgKGFiZmQsIGlnbm9yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgICBwcmludF9hcmVsdF9kZXNjcihvdXRmaWxlLCBhYmZkLCB2ZXJib3NlKTsKLX0KLQotdm9pZAotYXJfZGlyZWN0b3J5IChhcl9uYW1lLCBsaXN0LCBvdXRwdXQpCi0gICAgIGNoYXIgKmFyX25hbWU7Ci0gICAgIHN0cnVjdCBsaXN0ICpsaXN0OwotICAgICBjaGFyICpvdXRwdXQ7Ci17Ci0gIGJmZCAqYXJjaDsKLQotICBhcmNoID0gb3Blbl9pbmFyY2ggKGFyX25hbWUsIChjaGFyICopIE5VTEwpOwotICBpZiAob3V0cHV0KQotICAgIHsKLSAgICAgIG91dGZpbGUgPSBmb3BlbihvdXRwdXQsInciKTsKLSAgICAgIGlmIChvdXRmaWxlID09IDApCi0JewotCSAgb3V0ZmlsZSA9IHN0ZG91dDsKLQkgIGZwcmludGYgKHN0ZGVycixfKCJDYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBvdXRwdXQpOwotCSAgb3V0cHV0ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIG91dGZpbGUgPSBzdGRvdXQ7Ci0KLSAgbWFwX292ZXJfbGlzdCAoYXJjaCwgYXJfZGlyZWN0b3J5X2RvZXIsIGxpc3QpOwotCi0gIGJmZF9jbG9zZSAoYXJjaCk7Ci0KLSAgaWYgKG91dHB1dCkKLSAgIGZjbG9zZSAob3V0ZmlsZSk7Ci19Ci0KLXZvaWQKLURFRlVOX1ZPSUQocHJvbXB0KQotewotICBleHRlcm4gaW50IGludGVyYWN0aXZlOwotICBpZiAoaW50ZXJhY3RpdmUpIAotICB7Ci0gICAgcHJpbnRmKCJBUiA+Iik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7IAotICB9Ci19Ci0KLXZvaWQKLW1heWJlcXVpdCAoKQotewotICBpZiAoISBpbnRlcmFjdGl2ZSkgCi0gICAgeGV4aXQgKDkpOwotfQotCi0KLWJmZCAqb2JmZDsKLWNoYXIgKnJlYWxfbmFtZSA7IAotdm9pZAotREVGVU4oYXJfb3BlbiwobmFtZSwgdCksCi0gICAgICBjaGFyICpuYW1lIEFORAotICAgICAgaW50IHQpCi0KLXsKLSAgY2hhciAqdG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMTApOwotICByZWFsX25hbWUgPSBuYW1lOwotICBzcHJpbnRmKHRuYW1lLCAiJXMtdG1wIiwgbmFtZSk7Ci0gIG9iZmQgPSBiZmRfb3BlbncodG5hbWUsIE5VTEwpOwotCi0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLF8oIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBhcmNoaXZlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICB0bmFtZSk7Ci0KLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIHsKLSAgICBpZiAoIXQpIHsKLSAgICAgIGJmZCAqKnB0cjsKLSAgICAgIGJmZCAqZWxlbWVudDsKLSAgICAgIGJmZCAqaWJmZDsKLSAgICAgIGliZmQgPSBiZmRfb3BlbnIobmFtZSwgTlVMTCk7Ci0gICAgICBpZiAoIWliZmQpIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBhcmNoaXZlICVzXG4iKSwKLQkJcHJvZ3JhbV9uYW1lLCBuYW1lKTsKLQltYXliZXF1aXQoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdChpYmZkLCBiZmRfYXJjaGl2ZSkgIT0gdHJ1ZSkgewotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBmaWxlICVzIGlzIG5vdCBhbiBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQluYW1lKTsKLQltYXliZXF1aXQoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICBwdHIgPSAmKG9iZmQtPmFyY2hpdmVfaGVhZCk7Ci0gICAgICBlbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShpYmZkLCBOVUxMKTsKLQotICAgICAgd2hpbGUgKGVsZW1lbnQpIHsKLQkqcHRyID0gZWxlbWVudDsKLQlwdHIgPSAmZWxlbWVudC0+bmV4dDsKLQllbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShpYmZkLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBiZmRfc2V0X2Zvcm1hdChvYmZkLCBiZmRfYXJjaGl2ZSk7Ci0KLSAgICBvYmZkLT5oYXNfYXJtYXAgPSAxOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWFyX2FkZGxpYl9kb2VyIChhYmZkLCBwcmV2KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgLyogQWRkIHRoaXMgbW9kdWxlIHRvIHRoZSBvdXRwdXQgYmZkICovCi0gIGlmIChwcmV2ICE9IE5VTEwpCi0gICAgcHJldi0+bmV4dCA9IGFiZmQtPm5leHQ7Ci0gIGFiZmQtPm5leHQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIG9iZmQtPmFyY2hpdmVfaGVhZCA9IGFiZmQ7Ci19Ci0KLXZvaWQKLWFyX2FkZGxpYiAobmFtZSwgbGlzdCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGxpc3QgKmxpc3Q7Ci17Ci0gIGlmIChvYmZkID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gb3V0cHV0IGFyY2hpdmUgc3BlY2lmaWVkIHlldFxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgICBtYXliZXF1aXQgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkICphcmNoOwotCi0gICAgICBhcmNoID0gb3Blbl9pbmFyY2ggKG5hbWUsIChjaGFyICopIE5VTEwpOwotICAgICAgaWYgKGFyY2ggIT0gTlVMTCkKLQltYXBfb3Zlcl9saXN0IChhcmNoLCBhcl9hZGRsaWJfZG9lciwgbGlzdCk7Ci0KLSAgICAgIC8qIERvbid0IGNsb3NlIHRoZSBiZmQsIHNpbmNlIGl0IHdpbGwgbWFrZSB0aGUgZWxlbWVudHMgZGlzYXNwcGVhciAqLwotICAgIH0KLX0KLQotdm9pZAotREVGVU4oYXJfYWRkbW9kLCAobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCBOVUxMKTsKLSAgICAgIGlmICghYWJmZCkgIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQltYXliZXF1aXQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCWFiZmQtPm5leHQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0Jb2JmZC0+YXJjaGl2ZV9oZWFkID0gYWJmZDsKLSAgICAgIH0KLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgfQotfQotCi0KLQotdm9pZAotREVGVU5fVk9JRChhcl9jbGVhcikKLXsKLWlmIChvYmZkKSAKLSBvYmZkLT5hcmNoaXZlX2hlYWQgPSAwOwotfQotCi12b2lkCi1ERUZVTihhcl9kZWxldGUsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgYmZkICoqcHJldiA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyKSB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSB7Ci0JICAqcHJldiA9IG1lbWJlci0+bmV4dDsKLQkgIGZvdW5kID0gMTsKLQl9Ci0JZWxzZSB7Ci0JICBwcmV2ID0gJihtZW1iZXItPm5leHQpOwotCX0KLQkgIG1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCi0JCWxpc3QtPm5hbWUpOwotCW1heWJlcXVpdCgpOwotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZAotREVGVU5fVk9JRChhcl9zYXZlKQotewotCi0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2hhciAqb2ZpbGVuYW1lID0geHN0cmR1cCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotICAgIGJmZF9jbG9zZShvYmZkKTsKLSAgICAKLSAgICByZW5hbWUgKG9maWxlbmFtZSwgcmVhbF9uYW1lKTsKLSAgICBvYmZkID0gMDsKLSAgICBmcmVlKG9maWxlbmFtZSk7Ci0gIH0KLX0KLQotCi0KLXZvaWQKLURFRlVOKGFyX3JlcGxhY2UsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgYmZkICoqcHJldiA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyKSAKLSAgICAgIHsKLQlpZiAoc3RyY21wKG1lbWJlci0+ZmlsZW5hbWUsIGxpc3QtPm5hbWUpID09IDApIAotCXsKLQkgIC8qIEZvdW5kIHRoZSBvbmUgdG8gcmVwbGFjZSAqLwotCSAgYmZkICphYmZkID0gYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCSAgaWYgKCFhYmZkKSAKLQkgIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsIGxpc3QtPm5hbWUpOwotCSAgICBtYXliZXF1aXQoKTsKLQkgIH0KLQkgIGVsc2UgewotCSAgICAqcHJldiA9IGFiZmQ7Ci0JICAgIGFiZmQtPm5leHQgPSBtZW1iZXItPm5leHQ7Ci0JICAgIGZvdW5kID0gMTsKLQkgIH0KLQl9Ci0JZWxzZSB7Ci0JICBwcmV2ID0gJihtZW1iZXItPm5leHQpOwotCX0KLQltZW1iZXIgPSBtZW1iZXItPm5leHQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZvdW5kKSAgewotCWJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCAwKTsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKLQkJbGlzdC0+bmFtZSk7Ci0JaWYgKCFhYmZkKSAKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwgbGlzdC0+bmFtZSk7Ci0JICBtYXliZXF1aXQoKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAqcHJldiA9IGFiZmQ7Ci0JfQotICAgICAgfQotCi0gICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLS8qIEFuZCBJIGFkZGVkIHRoaXMgb25lICovCi12b2lkCi1ERUZVTl9WT0lEKGFyX2xpc3QpCi17Ci0gIGlmICghb2JmZCkgCi0gIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgewotICAgIGJmZCAqYWJmZDsKLSAgICBvdXRmaWxlID0gc3Rkb3V0OwotICAgIHZlcmJvc2UgPTEgOwotICAgIHByaW50ZihfKCJDdXJyZW50IG9wZW4gYXJjaGl2ZSBpcyAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgICBmb3IgKGFiZmQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0JIGFiZmQgIT0gKGJmZCAqKU5VTEw7Ci0JIGFiZmQgPSBhYmZkLT5uZXh0KSAKLSAgICB7Ci0gICAgICBhcl9kaXJlY3RvcnlfZG9lciAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotCi12b2lkIAotREVGVU5fVk9JRChhcl9lbmQpCi17Ci0gIGlmIChvYmZkKQotICB7Ci0gICAgZmNsb3NlKChGSUxFICopKG9iZmQtPmlvc3RyZWFtKSk7Ci0gICAgdW5saW5rKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgfQotfQotdm9pZAotREVGVU4oYXJfZXh0cmFjdCwobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSAKLSAgewotCi0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuICBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIC8qIEZpbmQgdGhpcyBuYW1lIGluIHRoZSBhcmNoaXZlICovCi0gICAgICBiZmQgKm1lbWJlciA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyICYmICFmb3VuZCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSAKLQl7Ci0JICBleHRyYWN0X2ZpbGUobWVtYmVyKTsKLQkgIGZvdW5kID0gMTsKLQkgIH0KLQotCW1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hcnN1cC5oIGIvYmludXRpbHMvYXJzdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0YTM0Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnN1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogYXJzdXAuaCAtIGFyY2hpdmUgc3VwcG9ydCBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGxpc3QgewotCWNoYXIgKm5hbWU7CQotCXN0cnVjdCBsaXN0ICpuZXh0OwotfTsKLQotdm9pZAotbWF5YmVxdWl0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotcHJvbXB0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotYXJfY2xlYXIgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9yZXBsYWNlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfZGVsZXRlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfc2F2ZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLWFyX2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9vcGVuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXZvaWQKLWFyX2RpcmVjdG9yeSBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBsaXN0ICosIGNoYXIgKikpOwotCi12b2lkCi1hcl9hZGRtb2QgUEFSQU1TICgoc3RydWN0IGxpc3QgKikpOwotCi12b2lkCi1hcl9hZGRsaWIgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbGlzdCAqKSk7Ci0KLXZvaWQgCi1hcl9lbmQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9leHRyYWN0IFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotYmZkICoKLW9wZW5faW5hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKikpOwotCi1pbnQKLXl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGdW5jdGlvbnMgZnJvbSBhci5jICovCi0KLXZvaWQKLWV4dHJhY3RfZmlsZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLWV4dGVybiBpbnQgaW50ZXJhY3RpdmU7CmRpZmYgLS1naXQgYS9iaW51dGlscy9iaW51dGlscy50ZXhpIGIvYmludXRpbHMvYmludXRpbHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1ZGYzZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9iaW51dGlscy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjkzMiArMCwwIEBACi1caW5wdXQgdGV4aW5mbyAgICAgICBAYyAgICAgICAgICAgICAgICAgICAgLSotIFRleGluZm8gLSotCi1Ac2V0ZmlsZW5hbWUgYmludXRpbHMuaW5mbwotQGluY2x1ZGUgY29uZmlnLnRleGkKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQmludXRpbHM6IChiaW51dGlscykuICAgICAgICAgVGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzICJhciIsICJvYmpjb3B5IiwKLQkJCQkib2JqZHVtcCIsICJubSIsICJubG1jb252IiwgInNpemUiLCAicmVhZGVsZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MiLCAic3RyaXAiLCAicmFubGliIiBhbmQgImRsbHRvb2wiLgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBhIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUBzeW5pbmRleCBreSBjcAotQGMKLUBjIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzICJhciIsICJsZCIsICJvYmpjb3B5IiwKLUBjICAib2JqZHVtcCIsICJubSIsICJzaXplIiwgInN0cmluZ3MiLCAic3RyaXAiLCAicmVhZGVsZiIgYW5kICJyYW5saWIiLgotQGMKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyAKLUBjIFRoaXMgdGV4dCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi1AYyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotQGMKLQotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIEBzY3tnbnV9IEJpbmFyeSBVdGlsaXRpZXMKLUB0aXRsZXBhZ2UKLUBmaW5hbG91dAotQHRpdGxlIFRoZSBAc2N7Z251fSBCaW5hcnkgVXRpbGl0aWVzCi1Ac3VidGl0bGUgVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0KLUBzcCAxCi1Ac3VidGl0bGUgTWF5IDE5OTMKLUBhdXRob3IgUm9sYW5kIEguIFBlc2NoCi1AYXV0aG9yIEplZmZyZXkgTS4gT3NpZXIKLUBhdXRob3IgQ3lnbnVzIFN1cHBvcnQKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQgXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhciBcaGZpbGwKLVxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhciB9Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQG5vZGUgVG9wCi1AdG9wIEludHJvZHVjdGlvbgotCi1AY2luZGV4IHZlcnNpb24KLVRoaXMgYnJpZWYgbWFudWFsIGNvbnRhaW5zIHByZWxpbWluYXJ5IGRvY3VtZW50YXRpb24gZm9yIHRoZSBAc2N7Z251fSBiaW5hcnkKLXV0aWxpdGllcyAoY29sbGVjdGl2ZWx5IHZlcnNpb24gQHZhbHVle1ZFUlNJT059KTogCi0KLUBpZnRleAotQHRhYmxlIEBjb2RlCi1AaXRlbSBhcgotQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMKLQotQGl0ZW0gbm0KLUxpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcwotCi1AaXRlbSBvYmpjb3B5Ci1Db3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCi0KLUBpdGVtIG9iamR1bXAKLURpc3BsYXkgaW5mb3JtYXRpb24gZnJvbSBvYmplY3QgZmlsZXMKLQotQGl0ZW0gcmFubGliCi1HZW5lcmF0ZSBpbmRleCB0byBhcmNoaXZlIGNvbnRlbnRzCi0KLUBpdGVtIHJlYWRlbGYKLURpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMuCi0KLUBpdGVtIHNpemUKLUxpc3QgZmlsZSBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0KLUBpdGVtIHN0cmluZ3MKLUxpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotCi1AaXRlbSBzdHJpcAotRGlzY2FyZCBzeW1ib2xzCi0KLUBpdGVtIGMrK2ZpbHQKLURlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMKLQotQGl0ZW0gYWRkcjJsaW5lCi1Db252ZXJ0IGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycwotCi1AaXRlbSBubG1jb252Ci1Db252ZXJ0IG9iamVjdCBjb2RlIGludG8gYSBOZXR3YXJlIExvYWRhYmxlIE1vZHVsZQotCi1AaXRlbSB3aW5kcmVzCi1NYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0KLUBpdGVtIGRsbHRvb2wKLUNyZWF0ZSB0aGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UgRHluYW1pYyBMaW5rIExpYnJhcmllcwotQGVuZCB0YWJsZQotQGVuZCBpZnRleAotCi1AbWVudQotKiBhcjo6ICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcwotKiBubTo6ICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLSogb2JqY29weTo6CQkJQ29weSBhbmQgdHJhbnNsYXRlIG9iamVjdCBmaWxlcwotKiBvYmpkdW1wOjogICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzCi0qIHJhbmxpYjo6ICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGluZGV4IHRvIGFyY2hpdmUgY29udGVudHMKLSogcmVhZGVsZjo6CQkJRGlzcGxheSB0aGUgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlcy4KLSogc2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0qIHN0cmluZ3M6OiAgICAgICAgICAgICAgICAgICAgIExpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotKiBzdHJpcDo6ICAgICAgICAgICAgICAgICAgICAgICBEaXNjYXJkIHN5bWJvbHMKLSogYysrZmlsdDo6CQkJRmlsdGVyIHRvIGRlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMKLSogYWRkcjJsaW5lOjoJCQlDb252ZXJ0IGFkZHJlc3NlcyB0byBmaWxlIGFuZCBsaW5lCi0qIG5sbWNvbnY6OiAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRzIG9iamVjdCBjb2RlIGludG8gYW4gTkxNCi0qIHdpbmRyZXM6OgkJCU1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKLSogZGxsdG9vbDo6CQkJQ3JlYXRlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIERMTHMKLSogU2VsZWN0aW5nIFRoZSBUYXJnZXQgU3lzdGVtOjogSG93IHRoZXNlIHV0aWxpdGllcyBkZXRlcm1pbmUgdGhlIHRhcmdldC4KLSogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotCi1Abm9kZSBhcgotQGNoYXB0ZXIgYXIKLQotQGtpbmRleCBhcgotQGNpbmRleCBhcmNoaXZlcwotQGNpbmRleCBjb2xsZWN0aW9ucyBvZiBmaWxlcwotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV1dIEB2YXJ7YXJjaGl2ZX0gW0B2YXJ7bWVtYmVyfUBkb3Rze31dCi1hciAtTSBbIDxtcmktc2NyaXB0IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2N7Z251fSBAY29kZXthcn0gcHJvZ3JhbSBjcmVhdGVzLCBtb2RpZmllcywgYW5kIGV4dHJhY3RzIGZyb20KLWFyY2hpdmVzLiAgQW4gQGRmbnthcmNoaXZlfSBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIEBkZm57bWVtYmVyc30gb2YgdGhlIGFyY2hpdmUpLgotCi1UaGUgb3JpZ2luYWwgZmlsZXMnIGNvbnRlbnRzLCBtb2RlIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGFuZAotZ3JvdXAgYXJlIHByZXNlcnZlZCBpbiB0aGUgYXJjaGl2ZSwgYW5kIGNhbiBiZSByZXN0b3JlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1AY2luZGV4IG5hbWUgbGVuZ3RoCi1Ac2N7Z251fSBAY29kZXthcn0gY2FuIG1haW50YWluIGFyY2hpdmVzIHdob3NlIG1lbWJlcnMgaGF2ZSBuYW1lcyBvZiBhbnkKLWxlbmd0aDsgaG93ZXZlciwgZGVwZW5kaW5nIG9uIGhvdyBAY29kZXthcn0gaXMgY29uZmlndXJlZCBvbiB5b3VyCi1zeXN0ZW0sIGEgbGltaXQgb24gbWVtYmVyLW5hbWUgbGVuZ3RoIG1heSBiZSBpbXBvc2VkIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGFyY2hpdmUgZm9ybWF0cyBtYWludGFpbmVkIHdpdGggb3RoZXIgdG9vbHMuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotQGNpbmRleCBsaWJyYXJpZXMKLUBjb2Rle2FyfSBpcyBjb25zaWRlcmVkIGEgYmluYXJ5IHV0aWxpdHkgYmVjYXVzZSBhcmNoaXZlcyBvZiB0aGlzIHNvcnQKLWFyZSBtb3N0IG9mdGVuIHVzZWQgYXMgQGRmbntsaWJyYXJpZXN9IGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotQGNpbmRleCBzeW1ib2wgaW5kZXgKLUBjb2Rle2FyfSBjcmVhdGVzIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIEBzYW1we3N9LgotT25jZSBjcmVhdGVkLCB0aGlzIGluZGV4IGlzIHVwZGF0ZWQgaW4gdGhlIGFyY2hpdmUgd2hlbmV2ZXIgQGNvZGV7YXJ9Ci1tYWtlcyBhIGNoYW5nZSB0byBpdHMgY29udGVudHMgKHNhdmUgZm9yIHRoZSBAc2FtcHtxfSB1cGRhdGUgb3BlcmF0aW9uKS4KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLQotWW91IG1heSB1c2UgQHNhbXB7bm0gLXN9IG9yIEBzYW1we25tIC0tcHJpbnQtYXJtYXB9IHRvIGxpc3QgdGhpcyBpbmRleAotdGFibGUuICBJZiBhbiBhcmNoaXZlIGxhY2tzIHRoZSB0YWJsZSwgYW5vdGhlciBmb3JtIG9mIEBjb2Rle2FyfSBjYWxsZWQKLUBjb2Rle3JhbmxpYn0gY2FuIGJlIHVzZWQgdG8gYWRkIGp1c3QgdGhlIHRhYmxlLgotCi1AY2luZGV4IGNvbXBhdGliaWxpdHksIEBjb2Rle2FyfQotQGNpbmRleCBAY29kZXthcn0gY29tcGF0aWJpbGl0eQotQHNje2dudX0gQGNvZGV7YXJ9IGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0d28gZGlmZmVyZW50Ci1mYWNpbGl0aWVzLiAgWW91IGNhbiBjb250cm9sIGl0cyBhY3Rpdml0eSB1c2luZyBjb21tYW5kLWxpbmUgb3B0aW9ucywKLWxpa2UgdGhlIGRpZmZlcmVudCB2YXJpZXRpZXMgb2YgQGNvZGV7YXJ9IG9uIFVuaXggc3lzdGVtczsgb3IsIGlmIHlvdQotc3BlY2lmeSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19LCB5b3UgY2FuIGNvbnRyb2wgaXQKLXdpdGggYSBzY3JpcHQgc3VwcGxpZWQgdmlhIHN0YW5kYXJkIGlucHV0LCBsaWtlIHRoZSBNUkkgYGBsaWJyYXJpYW4nJwotcHJvZ3JhbS4KLQotQG1lbnUKLSogYXIgY21kbGluZTo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLSogYXIgc2NyaXB0czo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IHdpdGggYSBzY3JpcHQKLUBlbmQgbWVudQotCi1AcGFnZQotQG5vZGUgYXIgY21kbGluZQotQHNlY3Rpb24gQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLQotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV1dIEB2YXJ7YXJjaGl2ZX0gW0B2YXJ7bWVtYmVyfUBkb3Rze31dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IFVuaXggY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1XaGVuIHlvdSB1c2UgQGNvZGV7YXJ9IGluIHRoZSBVbml4IHN0eWxlLCBAY29kZXthcn0gaW5zaXN0cyBvbiBhdCBsZWFzdCB0d28KLWFyZ3VtZW50cyB0byBleGVjdXRlOiBvbmUga2V5bGV0dGVyIHNwZWNpZnlpbmcgdGhlIEBlbXBoe29wZXJhdGlvbn0KLShvcHRpb25hbGx5IGFjY29tcGFuaWVkIGJ5IG90aGVyIGtleWxldHRlcnMgc3BlY2lmeWluZwotQGVtcGh7bW9kaWZpZXJzfSksIGFuZCB0aGUgYXJjaGl2ZSBuYW1lIHRvIGFjdCBvbi4KLQotTW9zdCBvcGVyYXRpb25zIGNhbiBhbHNvIGFjY2VwdCBmdXJ0aGVyIEB2YXJ7bWVtYmVyfSBhcmd1bWVudHMsCi1zcGVjaWZ5aW5nIHBhcnRpY3VsYXIgZmlsZXMgdG8gb3BlcmF0ZSBvbi4KLQotQHNje2dudX0gQGNvZGV7YXJ9IGFsbG93cyB5b3UgdG8gbWl4IHRoZSBvcGVyYXRpb24gY29kZSBAdmFye3B9IGFuZCBtb2RpZmllcgotZmxhZ3MgQHZhcnttb2R9IGluIGFueSBvcmRlciwgd2l0aGluIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQuCi0KLUlmIHlvdSB3aXNoLCB5b3UgbWF5IGJlZ2luIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQgd2l0aCBhCi1kYXNoLgotCi1AY2luZGV4IG9wZXJhdGlvbnMgb24gYXJjaGl2ZQotVGhlIEB2YXJ7cH0ga2V5bGV0dGVyIHNwZWNpZmllcyB3aGF0IG9wZXJhdGlvbiB0byBleGVjdXRlOyBpdCBtYXkgYmUKLWFueSBvZiB0aGUgZm9sbG93aW5nLCBidXQgeW91IG11c3Qgc3BlY2lmeSBvbmx5IG9uZSBvZiB0aGVtOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGQKLUBjaW5kZXggZGVsZXRpbmcgZnJvbSBhcmNoaXZlCi1AZW1waHtEZWxldGV9IG1vZHVsZXMgZnJvbSB0aGUgYXJjaGl2ZS4gIFNwZWNpZnkgdGhlIG5hbWVzIG9mIG1vZHVsZXMgdG8KLWJlIGRlbGV0ZWQgYXMgQHZhcnttZW1iZXJ9QGRvdHN7fTsgdGhlIGFyY2hpdmUgaXMgdW50b3VjaGVkIGlmIHlvdQotc3BlY2lmeSBubyBmaWxlcyB0byBkZWxldGUuCi0KLUlmIHlvdSBzcGVjaWZ5IHRoZSBAc2FtcHt2fSBtb2RpZmllciwgQGNvZGV7YXJ9IGxpc3RzIGVhY2ggbW9kdWxlCi1hcyBpdCBpcyBkZWxldGVkLgotCi1AaXRlbSBtCi1AY2luZGV4IG1vdmluZyBpbiBhcmNoaXZlCi1Vc2UgdGhpcyBvcGVyYXRpb24gdG8gQGVtcGh7bW92ZX0gbWVtYmVycyBpbiBhbiBhcmNoaXZlLgotCi1UaGUgb3JkZXJpbmcgb2YgbWVtYmVycyBpbiBhbiBhcmNoaXZlIGNhbiBtYWtlIGEgZGlmZmVyZW5jZSBpbiBob3cKLXByb2dyYW1zIGFyZSBsaW5rZWQgdXNpbmcgdGhlIGxpYnJhcnksIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgaW4gbW9yZQotdGhhbiBvbmUgbWVtYmVyLiAgCi0KLUlmIG5vIG1vZGlmaWVycyBhcmUgdXNlZCB3aXRoIEBjb2Rle219LCBhbnkgbWVtYmVycyB5b3UgbmFtZSBpbiB0aGUKLUB2YXJ7bWVtYmVyfSBhcmd1bWVudHMgYXJlIG1vdmVkIHRvIHRoZSBAZW1waHtlbmR9IG9mIHRoZSBhcmNoaXZlOwoteW91IGNhbiB1c2UgdGhlIEBzYW1we2F9LCBAc2FtcHtifSwgb3IgQHNhbXB7aX0gbW9kaWZpZXJzIHRvIG1vdmUgdGhlbSB0byBhCi1zcGVjaWZpZWQgcGxhY2UgaW5zdGVhZC4KLQotQGl0ZW0gcAotQGNpbmRleCBwcmludGluZyBmcm9tIGFyY2hpdmUKLUBlbXBoe1ByaW50fSB0aGUgc3BlY2lmaWVkIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUsIHRvIHRoZSBzdGFuZGFyZAotb3V0cHV0IGZpbGUuICBJZiB0aGUgQHNhbXB7dn0gbW9kaWZpZXIgaXMgc3BlY2lmaWVkLCBzaG93IHRoZSBtZW1iZXIKLW5hbWUgYmVmb3JlIGNvcHlpbmcgaXRzIGNvbnRlbnRzIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotSWYgeW91IHNwZWNpZnkgbm8gQHZhcnttZW1iZXJ9IGFyZ3VtZW50cywgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhcmUKLXByaW50ZWQuCi0KLUBpdGVtIHEKLUBjaW5kZXggcXVpY2sgYXBwZW5kIHRvIGFyY2hpdmUKLUBlbXBoe1F1aWNrIGFwcGVuZH07IEhpc3RvcmljYWxseSwgYWRkIHRoZSBmaWxlcyBAdmFye21lbWJlcn1AZG90c3t9IHRvIHRoZSBlbmQgb2YKLUB2YXJ7YXJjaGl2ZX0sIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHJlcGxhY2VtZW50LgotCi1UaGUgbW9kaWZpZXJzIEBzYW1we2F9LCBAc2FtcHtifSwgYW5kIEBzYW1we2l9IGRvIEBlbXBoe25vdH0gYWZmZWN0IHRoaXMKLW9wZXJhdGlvbjsgbmV3IG1lbWJlcnMgYXJlIGFsd2F5cyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4KLQotVGhlIG1vZGlmaWVyIEBzYW1we3Z9IG1ha2VzIEBjb2Rle2FyfSBsaXN0IGVhY2ggZmlsZSBhcyBpdCBpcyBhcHBlbmRlZC4KLQotU2luY2UgdGhlIHBvaW50IG9mIHRoaXMgb3BlcmF0aW9uIGlzIHNwZWVkLCB0aGUgYXJjaGl2ZSdzIHN5bWJvbCB0YWJsZQotaW5kZXggaXMgbm90IHVwZGF0ZWQsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdGVkOyB5b3UgY2FuIHVzZSBAc2FtcHthciBzfSBvcgotQGNvZGV7cmFubGlifSBleHBsaWNpdGx5IHRvIHVwZGF0ZSB0aGUgc3ltYm9sIHRhYmxlIGluZGV4LgotCi1Ib3dldmVyLCB0b28gbWFueSBkaWZmZXJlbnQgc3lzdGVtcyBhc3N1bWUgcXVpY2sgYXBwZW5kIHJlYnVpbGRzIHRoZQotaW5kZXgsIHNvIEdOVSBhciBpbXBsZW1lbnRzIEBjb2Rle3F9IGFzIGEgc3lub255bSBmb3IgQGNvZGV7cn0uCi0KLUBpdGVtIHIKLUBjaW5kZXggcmVwbGFjZW1lbnQgaW4gYXJjaGl2ZQotSW5zZXJ0IHRoZSBmaWxlcyBAdmFye21lbWJlcn1AZG90c3t9IGludG8gQHZhcnthcmNoaXZlfSAod2l0aAotQGVtcGh7cmVwbGFjZW1lbnR9KS4gVGhpcyBvcGVyYXRpb24gZGlmZmVycyBmcm9tIEBzYW1we3F9IGluIHRoYXQgYW55Ci1wcmV2aW91c2x5IGV4aXN0aW5nIG1lbWJlcnMgYXJlIGRlbGV0ZWQgaWYgdGhlaXIgbmFtZXMgbWF0Y2ggdGhvc2UgYmVpbmcKLWFkZGVkLgotCi1JZiBvbmUgb2YgdGhlIGZpbGVzIG5hbWVkIGluIEB2YXJ7bWVtYmVyfUBkb3Rze30gZG9lcyBub3QgZXhpc3QsIEBjb2Rle2FyfQotZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIGxlYXZlcyB1bmRpc3R1cmJlZCBhbnkgZXhpc3RpbmcgbWVtYmVycwotb2YgdGhlIGFyY2hpdmUgbWF0Y2hpbmcgdGhhdCBuYW1lLgotCi1CeSBkZWZhdWx0LCBuZXcgbWVtYmVycyBhcmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsgYnV0IHlvdSBtYXkKLXVzZSBvbmUgb2YgdGhlIG1vZGlmaWVycyBAc2FtcHthfSwgQHNhbXB7Yn0sIG9yIEBzYW1we2l9IHRvIHJlcXVlc3QKLXBsYWNlbWVudCByZWxhdGl2ZSB0byBzb21lIGV4aXN0aW5nIG1lbWJlci4KLQotVGhlIG1vZGlmaWVyIEBzYW1we3Z9IHVzZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBlbGljaXRzIGEgbGluZSBvZgotb3V0cHV0IGZvciBlYWNoIGZpbGUgaW5zZXJ0ZWQsIGFsb25nIHdpdGggb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we2F9IG9yCi1Ac2FtcHtyfSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhcHBlbmRlZCAobm8gb2xkIG1lbWJlcgotZGVsZXRlZCkgb3IgcmVwbGFjZWQuCi0KLUBpdGVtIHQKLUBjaW5kZXggY29udGVudHMgb2YgYXJjaGl2ZQotRGlzcGxheSBhIEBlbXBoe3RhYmxlfSBsaXN0aW5nIHRoZSBjb250ZW50cyBvZiBAdmFye2FyY2hpdmV9LCBvciB0aG9zZQotb2YgdGhlIGZpbGVzIGxpc3RlZCBpbiBAdmFye21lbWJlcn1AZG90c3t9IHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlCi1hcmNoaXZlLiAgTm9ybWFsbHkgb25seSB0aGUgbWVtYmVyIG5hbWUgaXMgc2hvd247IGlmIHlvdSBhbHNvIHdhbnQgdG8KLXNlZSB0aGUgbW9kZXMgKHBlcm1pc3Npb25zKSwgdGltZXN0YW1wLCBvd25lciwgZ3JvdXAsIGFuZCBzaXplLCB5b3UgY2FuCi1yZXF1ZXN0IHRoYXQgYnkgYWxzbyBzcGVjaWZ5aW5nIHRoZSBAc2FtcHt2fSBtb2RpZmllci4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgQHZhcnttZW1iZXJ9LCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBsaXN0ZWQuCi0KLUBjaW5kZXggcmVwZWF0ZWQgbmFtZXMgaW4gYXJjaGl2ZQotQGNpbmRleCBuYW1lIGR1cGxpY2F0aW9uIGluIGFyY2hpdmUKLUlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKHNheSwgQHNhbXB7ZmllfSkgaW4KLWFuIGFyY2hpdmUgKHNheSBAc2FtcHtiLmF9KSwgQHNhbXB7YXIgdCBiLmEgZmllfSBsaXN0cyBvbmx5IHRoZQotZmlyc3QgaW5zdGFuY2U7IHRvIHNlZSB0aGVtIGFsbCwgeW91IG11c3QgYXNrIGZvciBhIGNvbXBsZXRlCi1saXN0aW5nLS0taW4gb3VyIGV4YW1wbGUsIEBzYW1we2FyIHQgYi5hfS4KLUBjIFdSUyBvbmx5OyBwZXIgR3VtYnksIHRoaXMgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LCBhbmQgaW4gYSBtb3JlCi1AYyByZWNlbnQgY2FzZSBpbiBmYWN0IHdvcmtzIHRoZSBvdGhlciB3YXkuCi0KLUBpdGVtIHgKLUBjaW5kZXggZXh0cmFjdCBmcm9tIGFyY2hpdmUKLUBlbXBoe0V4dHJhY3R9IG1lbWJlcnMgKG5hbWVkIEB2YXJ7bWVtYmVyfSkgZnJvbSB0aGUgYXJjaGl2ZS4gIFlvdSBjYW4KLXVzZSB0aGUgQHNhbXB7dn0gbW9kaWZpZXIgd2l0aCB0aGlzIG9wZXJhdGlvbiwgdG8gcmVxdWVzdCB0aGF0Ci1AY29kZXthcn0gbGlzdCBlYWNoIG5hbWUgYXMgaXQgZXh0cmFjdHMgaXQuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIEB2YXJ7bWVtYmVyfSwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCi1hcmUgZXh0cmFjdGVkLgotCi1AZW5kIHRhYmxlCi0KLUEgbnVtYmVyIG9mIG1vZGlmaWVycyAoQHZhcnttb2R9KSBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBAdmFye3B9Ci1rZXlsZXR0ZXIsIHRvIHNwZWNpZnkgdmFyaWF0aW9ucyBvbiBhbiBvcGVyYXRpb24ncyBiZWhhdmlvcjoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBhCi1AY2luZGV4IHJlbGF0aXZlIHBsYWNlbWVudCBpbiBhcmNoaXZlCi1BZGQgbmV3IGZpbGVzIEBlbXBoe2FmdGVyfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7YX0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQotQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLgotCi1AaXRlbSBiCi1BZGQgbmV3IGZpbGVzIEBlbXBoe2JlZm9yZX0gYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIEBzYW1we2J9LCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBAdmFye3JlbHBvc30gYXJndW1lbnQsIGJlZm9yZSB0aGUKLUB2YXJ7YXJjaGl2ZX0gc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIEBzYW1we2l9KS4KLQotQGl0ZW0gYwotQGNpbmRleCBjcmVhdGluZyBhcmNoaXZlcwotQGVtcGh7Q3JlYXRlfSB0aGUgYXJjaGl2ZS4gIFRoZSBzcGVjaWZpZWQgQHZhcnthcmNoaXZlfSBpcyBhbHdheXMKLWNyZWF0ZWQgaWYgaXQgZGlkIG5vdCBleGlzdCwgd2hlbiB5b3UgcmVxdWVzdCBhbiB1cGRhdGUuICBCdXQgYSB3YXJuaW5nIGlzCi1pc3N1ZWQgdW5sZXNzIHlvdSBzcGVjaWZ5IGluIGFkdmFuY2UgdGhhdCB5b3UgZXhwZWN0IHRvIGNyZWF0ZSBpdCwgYnkKLXVzaW5nIHRoaXMgbW9kaWZpZXIuCi0KLUBpdGVtIGYKLVRydW5jYXRlIG5hbWVzIGluIHRoZSBhcmNoaXZlLiAgQHNje2dudX0gQGNvZGV7YXJ9IHdpbGwgbm9ybWFsbHkgcGVybWl0IGZpbGUKLW5hbWVzIG9mIGFueSBsZW5ndGguICBUaGlzIHdpbGwgY2F1c2UgaXQgdG8gY3JlYXRlIGFyY2hpdmVzIHdoaWNoIGFyZQotbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIEBjb2Rle2FyfSBwcm9ncmFtIG9uIHNvbWUgc3lzdGVtcy4gIElmCi10aGlzIGlzIGEgY29uY2VybiwgdGhlIEBzYW1we2Z9IG1vZGlmaWVyIG1heSBiZSB1c2VkIHRvIHRydW5jYXRlIGZpbGUKLW5hbWVzIHdoZW4gcHV0dGluZyB0aGVtIGluIHRoZSBhcmNoaXZlLgotCi1AaXRlbSBpCi1JbnNlcnQgbmV3IGZpbGVzIEBlbXBoe2JlZm9yZX0gYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIEBzYW1we2l9LCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBAdmFye3JlbHBvc30gYXJndW1lbnQsIGJlZm9yZSB0aGUKLUB2YXJ7YXJjaGl2ZX0gc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIEBzYW1we2J9KS4KLQotQGl0ZW0gbAotVGhpcyBtb2RpZmllciBpcyBhY2NlcHRlZCBidXQgbm90IHVzZWQuCi1AYyB3aGFmZm9yIGFyIGwgbW9kaWZpZXI/Pz8gcHJlc3VtYWJseSBjb21wYXQ7IHdpdGgKLUBjIHdoYXQ/Pz8tLS1kb2NAQGN5Z251cy5jb20sIDI1amFuOTEgCi0KLUBpdGVtIG8KLUBjaW5kZXggZGF0ZXMgaW4gYXJjaGl2ZQotUHJlc2VydmUgdGhlIEBlbXBoe29yaWdpbmFsfSBkYXRlcyBvZiBtZW1iZXJzIHdoZW4gZXh0cmFjdGluZyB0aGVtLiAgSWYKLXlvdSBkbyBub3Qgc3BlY2lmeSB0aGlzIG1vZGlmaWVyLCBmaWxlcyBleHRyYWN0ZWQgZnJvbSB0aGUgYXJjaGl2ZQotYXJlIHN0YW1wZWQgd2l0aCB0aGUgdGltZSBvZiBleHRyYWN0aW9uLgotCi1AaXRlbSBzCi1AY2luZGV4IHdyaXRpbmcgYXJjaGl2ZSBpbmRleAotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBAc2FtcHthciBzfSBvbiBhbgotYXJjaGl2ZSBpcyBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgQHNhbXB7cmFubGlifSBvbiBpdC4KLQotQGl0ZW0gUwotQGNpbmRleCBub3Qgd3JpdGluZyBhcmNoaXZlIGluZGV4Ci1EbyBub3QgZ2VuZXJhdGUgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBUaGlzIGNhbiBzcGVlZCB1cCBidWlsZGluZyBhCi1sYXJnZSBsaWJyYXJ5IGluIHNldmVyYWwgc3RlcHMuICBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgY2FuIG5vdCBiZSB1c2VkCi13aXRoIHRoZSBsaW5rZXIuICBJbiBvcmRlciB0byBidWlsZCBhIHN5bWJvbCB0YWJsZSwgeW91IG11c3Qgb21pdCB0aGUKLUBzYW1we1N9IG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBAc2FtcHthcn0sIG9yIHlvdSBtdXN0IHJ1bgotQHNhbXB7cmFubGlifSBvbiB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gdQotQGNpbmRleCB1cGRhdGluZyBhbiBhcmNoaXZlCi1Ob3JtYWxseSwgQHNhbXB7YXIgcn1AZG90c3t9IGluc2VydHMgYWxsIGZpbGVzCi1saXN0ZWQgaW50byB0aGUgYXJjaGl2ZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluc2VydCBAZW1waHtvbmx5fSB0aG9zZQotb2YgdGhlIGZpbGVzIHlvdSBsaXN0IHRoYXQgYXJlIG5ld2VyIHRoYW4gZXhpc3RpbmcgbWVtYmVycyBvZiB0aGUgc2FtZQotbmFtZXMsIHVzZSB0aGlzIG1vZGlmaWVyLiAgVGhlIEBzYW1we3V9IG1vZGlmaWVyIGlzIGFsbG93ZWQgb25seSBmb3IgdGhlCi1vcGVyYXRpb24gQHNhbXB7cn0gKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIEBzYW1we3F1fSBpcwotbm90IGFsbG93ZWQsIHNpbmNlIGNoZWNraW5nIHRoZSB0aW1lc3RhbXBzIHdvdWxkIGxvc2UgYW55IHNwZWVkCi1hZHZhbnRhZ2UgZnJvbSB0aGUgb3BlcmF0aW9uIEBzYW1we3F9LgotCi1AaXRlbSB2Ci1UaGlzIG1vZGlmaWVyIHJlcXVlc3RzIHRoZSBAZW1waHt2ZXJib3NlfSB2ZXJzaW9uIG9mIGFuIG9wZXJhdGlvbi4gIE1hbnkKLW9wZXJhdGlvbnMgZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZpbGVuYW1lcyBwcm9jZXNzZWQsCi13aGVuIHRoZSBtb2RpZmllciBAc2FtcHt2fSBpcyBhcHBlbmRlZC4KLQotQGl0ZW0gVgotVGhpcyBtb2RpZmllciBzaG93cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7YXJ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBhciBzY3JpcHRzCi1Ac2VjdGlvbiBDb250cm9sbGluZyBAY29kZXthcn0gd2l0aCBhIHNjcmlwdAotCi1Ac21hbGxleGFtcGxlCi1hciAtTSBbIDxAdmFye3NjcmlwdH0gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1AY2luZGV4IHNjcmlwdHMsIEBjb2Rle2FyfQotSWYgeW91IHVzZSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19IHdpdGggQGNvZGV7YXJ9LCB5b3UKLWNhbiBjb250cm9sIGl0cyBvcGVyYXRpb24gd2l0aCBhIHJ1ZGltZW50YXJ5IGNvbW1hbmQgbGFuZ3VhZ2UuICBUaGlzCi1mb3JtIG9mIEBjb2Rle2FyfSBvcGVyYXRlcyBpbnRlcmFjdGl2ZWx5IGlmIHN0YW5kYXJkIGlucHV0IGlzIGNvbWluZwotZGlyZWN0bHkgZnJvbSBhIHRlcm1pbmFsLiAgRHVyaW5nIGludGVyYWN0aXZlIHVzZSwgQGNvZGV7YXJ9IHByb21wdHMgZm9yCi1pbnB1dCAodGhlIHByb21wdCBpcyBAc2FtcHtBUiA+fSksIGFuZCBjb250aW51ZXMgZXhlY3V0aW5nIGV2ZW4gYWZ0ZXIKLWVycm9ycy4gIElmIHlvdSByZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCB0byBhIHNjcmlwdCBmaWxlLCBubyBwcm9tcHRzIGFyZQotaXNzdWVkLCBhbmQgQGNvZGV7YXJ9IGFiYW5kb25zIGV4ZWN1dGlvbiAod2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlKQotb24gYW55IGVycm9yLgotCi1UaGUgQGNvZGV7YXJ9IGNvbW1hbmQgbGFuZ3VhZ2UgaXMgQGVtcGh7bm90fSBkZXNpZ25lZCB0byBiZSBlcXVpdmFsZW50Ci10byB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnM7IGluIGZhY3QsIGl0IHByb3ZpZGVzIHNvbWV3aGF0IGxlc3MgY29udHJvbAotb3ZlciBhcmNoaXZlcy4gIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIGNvbW1hbmQgbGFuZ3VhZ2UgaXMgdG8gZWFzZSB0aGUKLXRyYW5zaXRpb24gdG8gQHNje2dudX0gQGNvZGV7YXJ9IGZvciBkZXZlbG9wZXJzIHdobyBhbHJlYWR5IGhhdmUgc2NyaXB0cwotd3JpdHRlbiBmb3IgdGhlIE1SSSBgYGxpYnJhcmlhbicnIHByb2dyYW0uCi0KLVRoZSBzeW50YXggZm9yIHRoZSBAY29kZXthcn0gY29tbWFuZCBsYW5ndWFnZSBpcyBzdHJhaWdodGZvcndhcmQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotY29tbWFuZHMgYXJlIHJlY29nbml6ZWQgaW4gdXBwZXIgb3IgbG93ZXIgY2FzZTsgZm9yIGV4YW1wbGUsIEBjb2Rle0xJU1R9Ci1pcyB0aGUgc2FtZSBhcyBAY29kZXtsaXN0fS4gIEluIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb25zLCBjb21tYW5kcyBhcmUKLXNob3duIGluIHVwcGVyIGNhc2UgZm9yIGNsYXJpdHkuCi0KLUBpdGVtCi1hIHNpbmdsZSBjb21tYW5kIG1heSBhcHBlYXIgb24gZWFjaCBsaW5lOyBpdCBpcyB0aGUgZmlyc3Qgd29yZCBvbiB0aGUKLWxpbmUuCi0KLUBpdGVtCi1lbXB0eSBsaW5lcyBhcmUgYWxsb3dlZCwgYW5kIGhhdmUgbm8gZWZmZWN0LgotCi1AaXRlbQotY29tbWVudHMgYXJlIGFsbG93ZWQ7IHRleHQgYWZ0ZXIgZWl0aGVyIG9mIHRoZSBjaGFyYWN0ZXJzIEBzYW1weyp9Ci1vciBAc2FtcHs7fSBpcyBpZ25vcmVkLgotCi1AaXRlbQotV2hlbmV2ZXIgeW91IHVzZSBhIGxpc3Qgb2YgbmFtZXMgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQgdG8gYW4gQGNvZGV7YXJ9Ci1jb21tYW5kLCB5b3UgY2FuIHNlcGFyYXRlIHRoZSBpbmRpdmlkdWFsIG5hbWVzIHdpdGggZWl0aGVyIGNvbW1hcyBvcgotYmxhbmtzLiAgQ29tbWFzIGFyZSBzaG93biBpbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LCBmb3IgY2xhcml0eS4KLQotQGl0ZW0KLUBzYW1weyt9IGlzIHVzZWQgYXMgYSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXI7IGlmIEBzYW1weyt9IGFwcGVhcnMKLWF0IHRoZSBlbmQgb2YgYSBsaW5lLCB0aGUgdGV4dCBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXMgY29uc2lkZXJlZCBwYXJ0Ci1vZiB0aGUgY3VycmVudCBjb21tYW5kLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHRoZSBjb21tYW5kcyB5b3UgY2FuIHVzZSBpbiBAY29kZXthcn0gc2NyaXB0cywgb3Igd2hlbiB1c2luZwotQGNvZGV7YXJ9IGludGVyYWN0aXZlbHkuICBUaHJlZSBvZiB0aGVtIGhhdmUgc3BlY2lhbCBzaWduaWZpY2FuY2U6Ci0KLUBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0gc3BlY2lmeSBhIEBkZm57Y3VycmVudCBhcmNoaXZlfSwgd2hpY2ggaXMKLWEgdGVtcG9yYXJ5IGZpbGUgcmVxdWlyZWQgZm9yIG1vc3Qgb2YgdGhlIG90aGVyIGNvbW1hbmRzLgotCi1AY29kZXtTQVZFfSBjb21taXRzIHRoZSBjaGFuZ2VzIHNvIGZhciBzcGVjaWZpZWQgYnkgdGhlIHNjcmlwdC4gIFByaW9yCi10byBAY29kZXtTQVZFfSwgY29tbWFuZHMgYWZmZWN0IG9ubHkgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBjdXJyZW50Ci1hcmNoaXZlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEFERExJQiBAdmFye2FyY2hpdmV9IAotQGl0ZW14IEFERExJQiBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pCi1BZGQgYWxsIHRoZSBjb250ZW50cyBvZiBAdmFye2FyY2hpdmV9IChvciwgaWYgc3BlY2lmaWVkLCBlYWNoIG5hbWVkCi1AdmFye21vZHVsZX0gZnJvbSBAdmFye2FyY2hpdmV9KSB0byB0aGUgY3VycmVudCBhcmNoaXZlLgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gQURETU9EIEB2YXJ7bWVtYmVyfSwgQHZhcnttZW1iZXJ9LCBAZG90c3t9IEB2YXJ7bWVtYmVyfQotQGMgRklYTUUhIHcvUmVwbGFjZW1lbnQ/PyAgSWYgc28sIGxpa2UgImFyIHIgQHZhcnthcmNoaXZlfSBAdmFye25hbWVzfSIKLUBjICAgICAgICBlbHNlIGxpa2UgImFyIHEuLi4iCi1BZGQgZWFjaCBuYW1lZCBAdmFye21lbWJlcn0gYXMgYSBtb2R1bGUgaW4gdGhlIGN1cnJlbnQgYXJjaGl2ZS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIENMRUFSCi1EaXNjYXJkIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcmNoaXZlLCBjYW5jZWxpbmcgdGhlIGVmZmVjdCBvZgotYW55IG9wZXJhdGlvbnMgc2luY2UgdGhlIGxhc3QgQGNvZGV7U0FWRX0uICBNYXkgYmUgZXhlY3V0ZWQgKHdpdGggbm8KLWVmZmVjdCkgZXZlbiBpZiAgbm8gY3VycmVudCBhcmNoaXZlIGlzIHNwZWNpZmllZC4KLQotQGl0ZW0gQ1JFQVRFIEB2YXJ7YXJjaGl2ZX0KLUNyZWF0ZXMgYW4gYXJjaGl2ZSwgYW5kIG1ha2VzIGl0IHRoZSBjdXJyZW50IGFyY2hpdmUgKHJlcXVpcmVkIGZvciBtYW55Ci1vdGhlciBjb21tYW5kcykuICBUaGUgbmV3IGFyY2hpdmUgaXMgY3JlYXRlZCB3aXRoIGEgdGVtcG9yYXJ5IG5hbWU7IGl0Ci1pcyBub3QgYWN0dWFsbHkgc2F2ZWQgYXMgQHZhcnthcmNoaXZlfSB1bnRpbCB5b3UgdXNlIEBjb2Rle1NBVkV9LgotWW91IGNhbiBvdmVyd3JpdGUgZXhpc3RpbmcgYXJjaGl2ZXM7IHNpbWlsYXJseSwgdGhlIGNvbnRlbnRzIG9mIGFueQotZXhpc3RpbmcgZmlsZSBuYW1lZCBAdmFye2FyY2hpdmV9IHdpbGwgbm90IGJlIGRlc3Ryb3llZCB1bnRpbCBAY29kZXtTQVZFfS4KLQotQGl0ZW0gREVMRVRFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRGVsZXRlIGVhY2ggbGlzdGVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmU7IGVxdWl2YWxlbnQgdG8KLUBzYW1we2FyIC1kIEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9IEBkb3Rze30gQHZhcnttb2R1bGV9fS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KQotQGl0ZW14IERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KSBAdmFye291dHB1dGZpbGV9Ci1MaXN0IGVhY2ggbmFtZWQgQHZhcnttb2R1bGV9IHByZXNlbnQgaW4gQHZhcnthcmNoaXZlfS4gIFRoZSBzZXBhcmF0ZQotY29tbWFuZCBAY29kZXtWRVJCT1NFfSBzcGVjaWZpZXMgdGhlIGZvcm0gb2YgdGhlIG91dHB1dDogd2hlbiB2ZXJib3NlCi1vdXRwdXQgaXMgb2ZmLCBvdXRwdXQgaXMgbGlrZSB0aGF0IG9mIEBzYW1we2FyIC10IEB2YXJ7YXJjaGl2ZX0KLUB2YXJ7bW9kdWxlfUBkb3Rze319LiAgV2hlbiB2ZXJib3NlIG91dHB1dCBpcyBvbiwgdGhlIGxpc3RpbmcgaXMgbGlrZQotQHNhbXB7YXIgLXR2IEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9QGRvdHN7fX0uCi0KLU91dHB1dCBub3JtYWxseSBnb2VzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtOyBob3dldmVyLCBpZiB5b3UKLXNwZWNpZnkgQHZhcntvdXRwdXRmaWxlfSBhcyBhIGZpbmFsIGFyZ3VtZW50LCBAY29kZXthcn0gZGlyZWN0cyB0aGUKLW91dHB1dCB0byB0aGF0IGZpbGUuCi0KLUBpdGVtIEVORAotRXhpdCBmcm9tIEBjb2Rle2FyfSwgd2l0aCBhIEBjb2RlezB9IGV4aXQgY29kZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsCi1jb21wbGV0aW9uLiAgVGhpcyBjb21tYW5kIGRvZXMgbm90IHNhdmUgdGhlIG91dHB1dCBmaWxlOyBpZiB5b3UgaGF2ZQotY2hhbmdlZCB0aGUgY3VycmVudCBhcmNoaXZlIHNpbmNlIHRoZSBsYXN0IEBjb2Rle1NBVkV9IGNvbW1hbmQsIHRob3NlCi1jaGFuZ2VzIGFyZSBsb3N0LgotCi1AaXRlbSBFWFRSQUNUIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRXh0cmFjdCBlYWNoIG5hbWVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmUsIHdyaXRpbmcgdGhlbQotaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgc2VwYXJhdGUgZmlsZXMuICBFcXVpdmFsZW50IHRvIEBzYW1we2FyIC14Ci1AdmFye2FyY2hpdmV9IEB2YXJ7bW9kdWxlfUBkb3Rze319LgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGlnbm9yZQotQGMgRklYTUUgVG9rZW5zIGJ1dCBubyBjb21tYW5kcz8/PwotQGl0ZW0gRlVMTERJUgotCi1AaXRlbSBIRUxQCi1AZW5kIGlnbm9yZQotCi1AaXRlbSBMSVNUCi1EaXNwbGF5IGZ1bGwgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJjaGl2ZSwgaW4gYGB2ZXJib3NlJycgc3R5bGUKLXJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIEBjb2Rle1ZFUkJPU0V9LiAgVGhlIGVmZmVjdCBpcyBsaWtlIEBzYW1we2FyCi10diBAdmFye2FyY2hpdmV9fS4gIChUaGlzIHNpbmdsZSBjb21tYW5kIGlzIGEgQHNje2dudX0gQGNvZGV7YXJ9Ci1lbmhhbmNlbWVudCwgcmF0aGVyIHRoYW4gcHJlc2VudCBmb3IgTVJJIGNvbXBhdGliaWxpdHkuKQotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gT1BFTiBAdmFye2FyY2hpdmV9Ci1PcGVucyBhbiBleGlzdGluZyBhcmNoaXZlIGZvciB1c2UgYXMgdGhlIGN1cnJlbnQgYXJjaGl2ZSAocmVxdWlyZWQgZm9yCi1tYW55IG90aGVyIGNvbW1hbmRzKS4gIEFueSBjaGFuZ2VzIGFzIHRoZSByZXN1bHQgb2Ygc3Vic2VxdWVudCBjb21tYW5kcwotd2lsbCBub3QgYWN0dWFsbHkgYWZmZWN0IEB2YXJ7YXJjaGl2ZX0gdW50aWwgeW91IG5leHQgdXNlIEBjb2Rle1NBVkV9LgotCi1AaXRlbSBSRVBMQUNFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotSW4gdGhlIGN1cnJlbnQgYXJjaGl2ZSwgcmVwbGFjZSBlYWNoIGV4aXN0aW5nIEB2YXJ7bW9kdWxlfSAobmFtZWQgaW4KLXRoZSBAY29kZXtSRVBMQUNFfSBhcmd1bWVudHMpIGZyb20gZmlsZXMgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi1UbyBleGVjdXRlIHRoaXMgY29tbWFuZCB3aXRob3V0IGVycm9ycywgYm90aCB0aGUgZmlsZSwgYW5kIHRoZSBtb2R1bGUgaW4KLXRoZSBjdXJyZW50IGFyY2hpdmUsIG11c3QgZXhpc3QuIAotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gVkVSQk9TRQotVG9nZ2xlIGFuIGludGVybmFsIGZsYWcgZ292ZXJuaW5nIHRoZSBvdXRwdXQgZnJvbSBAY29kZXtESVJFQ1RPUll9LgotV2hlbiB0aGUgZmxhZyBpcyBvbiwgQGNvZGV7RElSRUNUT1JZfSBvdXRwdXQgbWF0Y2hlcyBvdXRwdXQgZnJvbQotQHNhbXB7YXIgLXR2IH1AZG90c3t9LgotCi1AaXRlbSBTQVZFCi1Db21taXQgeW91ciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUsIGFuZCBhY3R1YWxseSBzYXZlIGl0IGFzIGEKLWZpbGUgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIGxhc3QgQGNvZGV7Q1JFQVRFfSBvciBAY29kZXtPUEVOfQotY29tbWFuZC4gCi0KLVJlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgotCi1AZW5kIHRhYmxlCi0KLUBpZnRleAotQG5vZGUgbGQKLUBjaGFwdGVyIGxkCi1AY2luZGV4IGxpbmtlcgotQGtpbmRleCBsZAotVGhlIEBzY3tnbnV9IGxpbmtlciBAY29kZXtsZH0gaXMgbm93IGRlc2NyaWJlZCBpbiBhIHNlcGFyYXRlIG1hbnVhbC4KLUB4cmVme1RvcCwsIE92ZXJ2aWV3LCwgVXNpbmcgTEQ6IHRoZSBAc2N7Z251fSBsaW5rZXJ9LgotQGVuZCBpZnRleAotCi1Abm9kZSBubQotQGNoYXB0ZXIgbm0KLUBjaW5kZXggc3ltYm9scwotQGtpbmRleCBubQotCi1Ac21hbGxleGFtcGxlCi1ubSBbIC1hIHwgLS1kZWJ1Zy1zeW1zIF0gIFsgLWcgfCAtLWV4dGVybi1vbmx5IF0KLSAgIFsgLUIgXSAgWyAtQyB8IC0tZGVtYW5nbGUgXSBbIC1EIHwgLS1keW5hbWljIF0KLSAgIFsgLXMgfCAtLXByaW50LWFybWFwIF0gIFsgLUEgfCAtbyB8IC0tcHJpbnQtZmlsZS1uYW1lIF0KLSAgIFsgLW4gfCAtdiB8IC0tbnVtZXJpYy1zb3J0IF0gIFsgLXAgfCAtLW5vLXNvcnQgXQotICAgWyAtciB8IC0tcmV2ZXJzZS1zb3J0IF0gIFsgLS1zaXplLXNvcnQgXSBbIC11IHwgLS11bmRlZmluZWQtb25seSBdCi0gICBbIC10IEB2YXJ7cmFkaXh9IHwgLS1yYWRpeD1AdmFye3JhZGl4fSBdIFsgLVAgfCAtLXBvcnRhYmlsaXR5IF0KLSAgIFsgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdIFsgLWYgQHZhcntmb3JtYXR9IHwgLS1mb3JtYXQ9QHZhcntmb3JtYXR9IF0KLSAgIFsgLS1kZWZpbmVkLW9ubHkgXSBbLWwgfCAtLWxpbmUtbnVtYmVycyBdCi0gICBbIC0tbm8tZGVtYW5nbGUgXSBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0gIFsgQHZhcntvYmpmaWxlfUBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQHNje2dudX0gQGNvZGV7bm19IGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIEB2YXJ7b2JqZmlsZX1AZG90c3t9LgotSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBsaXN0ZWQgYXMgYXJndW1lbnRzLCBAY29kZXtubX0gYXNzdW1lcwotQGZpbGV7YS5vdXR9LgotCi1Gb3IgZWFjaCBzeW1ib2wsIEBjb2Rle25tfSBzaG93czoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBzeW1ib2wgdmFsdWUsIGluIHRoZSByYWRpeCBzZWxlY3RlZCBieSBvcHRpb25zIChzZWUgYmVsb3cpLCBvcgotaGV4YWRlY2ltYWwgYnkgZGVmYXVsdC4KLQotQGl0ZW0KLVRoZSBzeW1ib2wgdHlwZS4gIEF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHVzZWQ7IG90aGVycyBhcmUsIGFzCi13ZWxsLCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIElmIGxvd2VyY2FzZSwgdGhlIHN5bWJvbCBpcwotbG9jYWw7IGlmIHVwcGVyY2FzZSwgdGhlIHN5bWJvbCBpcyBnbG9iYWwgKGV4dGVybmFsKS4KLQotQGMgU29tZSBtb3JlIGRldGFpbCBvbiBleGFjdGx5IHdoYXQgdGhlc2Ugc3ltYm9sIHR5cGVzIGFyZSB1c2VkIGZvcgotQGMgd291bGQgYmUgbmljZS4KLUB0YWJsZSBAY29kZQotQGl0ZW0gQQotVGhlIHN5bWJvbCdzIHZhbHVlIGlzIGFic29sdXRlLCBhbmQgd2lsbCBub3QgYmUgY2hhbmdlZCBieSBmdXJ0aGVyCi1saW5raW5nLgotCi1AaXRlbSBCCi1UaGUgc3ltYm9sIGlzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiAoa25vd24gYXMgQlNTKS4KLQotQGl0ZW0gQwotVGhlIHN5bWJvbCBpcyBjb21tb24uICBDb21tb24gc3ltYm9scyBhcmUgdW5pbml0aWFsaXplZCBkYXRhLiAgV2hlbgotbGlua2luZywgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgbWF5IGFwcGVhciB3aXRoIHRoZSBzYW1lIG5hbWUuICBJZiB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkIGFueXdoZXJlLCB0aGUgY29tbW9uIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgdW5kZWZpbmVkCi1yZWZlcmVuY2VzLiAgRm9yIG1vcmUgZGV0YWlscyBvbiBjb21tb24gc3ltYm9scywgc2VlIHRoZSBkaXNjdXNzaW9uIG9mCi0tLXdhcm4tY29tbW9uIGluIEByZWZ7T3B0aW9ucywsTGlua2VyIG9wdGlvbnMsbGQuaW5mbyxUaGUgR05VIGxpbmtlcn0uCi0KLUBpdGVtIEQKLVRoZSBzeW1ib2wgaXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4KLQotQGl0ZW0gRwotVGhlIHN5bWJvbCBpcyBpbiBhbiBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gZm9yIHNtYWxsIG9iamVjdHMuICBTb21lCi1vYmplY3QgZmlsZSBmb3JtYXRzIHBlcm1pdCBtb3JlIGVmZmljaWVudCBhY2Nlc3MgdG8gc21hbGwgZGF0YSBvYmplY3RzLAotc3VjaCBhcyBhIGdsb2JhbCBpbnQgdmFyaWFibGUgYXMgb3Bwb3NlZCB0byBhIGxhcmdlIGdsb2JhbCBhcnJheS4KLQotQGl0ZW0gSQotVGhlIHN5bWJvbCBpcyBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGlzIGlzIGEgR05VCi1leHRlbnNpb24gdG8gdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBpcyByYXJlbHkgdXNlZC4KLQotQGl0ZW0gTgotVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyBzeW1ib2wuCi0KLUBpdGVtIFIKLVRoZSBzeW1ib2wgaXMgaW4gYSByZWFkIG9ubHkgZGF0YSBzZWN0aW9uLgotCi1AaXRlbSBTCi1UaGUgc3ltYm9sIGlzIGluIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGZvciBzbWFsbCBvYmplY3RzLgotCi1AaXRlbSBUCi1UaGUgc3ltYm9sIGlzIGluIHRoZSB0ZXh0IChjb2RlKSBzZWN0aW9uLgotCi1AaXRlbSBVCi1UaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotQGl0ZW0gVwotVGhlIHN5bWJvbCBpcyB3ZWFrLiAgV2hlbiBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIHdpdGggYSBub3JtYWwKLWRlZmluZWQgc3ltYm9sLCB0aGUgbm9ybWFsIGRlZmluZWQgc3ltYm9sIGlzIHVzZWQgd2l0aCBubyBlcnJvci4gIFdoZW4gYQotd2VhayB1bmRlZmluZWQgc3ltYm9sIGlzIGxpbmtlZCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZCwgdGhlIHZhbHVlCi1vZiB0aGUgd2VhayBzeW1ib2wgYmVjb21lcyB6ZXJvIHdpdGggbm8gZXJyb3IuCi0KLUBpdGVtIC0KLVRoZSBzeW1ib2wgaXMgYSBzdGFicyBzeW1ib2wgaW4gYW4gYS5vdXQgb2JqZWN0IGZpbGUuICBJbiB0aGlzIGNhc2UsIHRoZQotbmV4dCB2YWx1ZXMgcHJpbnRlZCBhcmUgdGhlIHN0YWJzIG90aGVyIGZpZWxkLCB0aGUgc3RhYnMgZGVzYyBmaWVsZCwgYW5kCi10aGUgc3RhYiB0eXBlLiAgU3RhYnMgc3ltYm9scyBhcmUgdXNlZCB0byBob2xkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjsKLWZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQHJlZntUb3AsU3RhYnMsU3RhYnMgT3ZlcnZpZXcsc3RhYnMuaW5mbywgVGhlCi1gYHN0YWJzJycgZGVidWcgZm9ybWF0fS4KLQotQGl0ZW0gPwotVGhlIHN5bWJvbCB0eXBlIGlzIHVua25vd24sIG9yIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYy4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLVRoZSBzeW1ib2wgbmFtZS4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQQotQGl0ZW14IC1vCi1AaXRlbXggLS1wcmludC1maWxlLW5hbWUgCi1AY2luZGV4IGlucHV0IGZpbGUgbmFtZQotQGNpbmRleCBmaWxlIG5hbWUKLUBjaW5kZXggc291cmNlIGZpbGUgbmFtZQotUHJlY2VkZSBlYWNoIHN5bWJvbCBieSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSAob3IgYXJjaGl2ZSBlbGVtZW50KQotaW4gd2hpY2ggaXQgd2FzIGZvdW5kLCByYXRoZXIgdGhhbiBpZGVudGlmeWluZyB0aGUgaW5wdXQgZmlsZSBvbmNlIG9ubHksCi1iZWZvcmUgYWxsIG9mIGl0cyBzeW1ib2xzLgotCi1AaXRlbSAtYQotQGl0ZW14IC0tZGVidWctc3ltcyAKLUBjaW5kZXggZGVidWdnaW5nIHN5bWJvbHMKLURpc3BsYXkgYWxsIHN5bWJvbHMsIGV2ZW4gZGVidWdnZXItb25seSBzeW1ib2xzOyBub3JtYWxseSB0aGVzZSBhcmUgbm90Ci1saXN0ZWQuCi0KLUBpdGVtIC1CCi1AY2luZGV4IEBjb2Rle25tfSBmb3JtYXQKLUBjaW5kZXggQGNvZGV7bm19IGNvbXBhdGliaWxpdHkKLVRoZSBzYW1lIGFzIEBzYW1wey0tZm9ybWF0PWJzZH0gKGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JUFMgQGNvZGV7bm19KS4KLQotQGl0ZW0gLUMKLUBpdGVteCAtLWRlbWFuZ2xlCi1AY2luZGV4IGRlbWFuZ2xpbmcgaW4gbm0KLURlY29kZSAoQGRmbntkZW1hbmdsZX0pIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuICBAeHJlZntjKytmaWx0fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIGRlbWFuZ2xpbmcuCi0KLUBpdGVtIC0tbm8tZGVtYW5nbGUKLURvIG5vdCBkZW1hbmdsZSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLWR5bmFtaWMKLUBjaW5kZXggZHluYW1pYyBzeW1ib2xzCi1EaXNwbGF5IHRoZSBkeW5hbWljIHN5bWJvbHMgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBzeW1ib2xzLiAgVGhpcyBpcwotb25seSBtZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotQGl0ZW0gLWYgQHZhcntmb3JtYXR9Ci1AaXRlbXggLS1mb3JtYXQ9QHZhcntmb3JtYXR9Ci1AY2luZGV4IEBjb2Rle25tfSBmb3JtYXQKLUBjaW5kZXggQGNvZGV7bm19IGNvbXBhdGliaWxpdHkKLVVzZSB0aGUgb3V0cHV0IGZvcm1hdCBAdmFye2Zvcm1hdH0sIHdoaWNoIGNhbiBiZSBAY29kZXtic2R9LAotQGNvZGV7c3lzdn0sIG9yIEBjb2Rle3Bvc2l4fS4gIFRoZSBkZWZhdWx0IGlzIEBjb2Rle2JzZH0uCi1Pbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgQHZhcntmb3JtYXR9IGlzIHNpZ25pZmljYW50OyBpdCBjYW4gYmUKLWVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLgotCi1AaXRlbSAtZwotQGl0ZW14IC0tZXh0ZXJuLW9ubHkgCi1AY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKLURpc3BsYXkgb25seSBleHRlcm5hbCBzeW1ib2xzLgotCi1AaXRlbSAtbAotQGl0ZW14IC0tbGluZS1udW1iZXJzCi1AY2luZGV4IHN5bWJvbCBsaW5lIG51bWJlcnMKLUZvciBlYWNoIHN5bWJvbCwgdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0cnkgdG8gZmluZCBhIGZpbGVuYW1lIGFuZAotbGluZSBudW1iZXIuICBGb3IgYSBkZWZpbmVkIHN5bWJvbCwgbG9vayBmb3IgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZQotYWRkcmVzcyBvZiB0aGUgc3ltYm9sLiAgRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lCi1udW1iZXIgb2YgYSByZWxvY2F0aW9uIGVudHJ5IHdoaWNoIHJlZmVycyB0byB0aGUgc3ltYm9sLiAgSWYgbGluZSBudW1iZXIKLWluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCwgcHJpbnQgaXQgYWZ0ZXIgdGhlIG90aGVyIHN5bWJvbCBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLW4KLUBpdGVteCAtdgotQGl0ZW14IC0tbnVtZXJpYy1zb3J0IAotU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IHRoZWlyIGFkZHJlc3NlcywgcmF0aGVyIHRoYW4gYWxwaGFiZXRpY2FsbHkKLWJ5IHRoZWlyIG5hbWVzLiAKLQotQGl0ZW0gLXAKLUBpdGVteCAtLW5vLXNvcnQgCi1AY2luZGV4IHNvcnRpbmcgc3ltYm9scwotRG8gbm90IGJvdGhlciB0byBzb3J0IHRoZSBzeW1ib2xzIGluIGFueSBvcmRlcjsgcHJpbnQgdGhlbSBpbiB0aGUgb3JkZXIKLWVuY291bnRlcmVkLgotCi1AaXRlbSAtUAotQGl0ZW14IC0tcG9ydGFiaWxpdHkKLVVzZSB0aGUgUE9TSVguMiBzdGFuZGFyZCBvdXRwdXQgZm9ybWF0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9ybWF0LgotRXF1aXZhbGVudCB0byBAc2FtcHstZiBwb3NpeH0uCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1wcmludC1hcm1hcAotQGNpbmRleCBzeW1ib2wgaW5kZXgsIGxpc3RpbmcKLVdoZW4gbGlzdGluZyBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzLCBpbmNsdWRlIHRoZSBpbmRleDogYSBtYXBwaW5nCi0oc3RvcmVkIGluIHRoZSBhcmNoaXZlIGJ5IEBjb2Rle2FyfSBvciBAY29kZXtyYW5saWJ9KSBvZiB3aGljaCBtb2R1bGVzCi1jb250YWluIGRlZmluaXRpb25zIGZvciB3aGljaCBuYW1lcy4KLQotQGl0ZW0gLXIKLUBpdGVteCAtLXJldmVyc2Utc29ydCAKLVJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzb3J0ICh3aGV0aGVyIG51bWVyaWMgb3IgYWxwaGFiZXRpYyk7IGxldCB0aGUKLWxhc3QgY29tZSBmaXJzdC4KLQotQGl0ZW0gLS1zaXplLXNvcnQKLVNvcnQgc3ltYm9scyBieSBzaXplLiAgVGhlIHNpemUgaXMgY29tcHV0ZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHdpdGggdGhlIG5leHQgaGlnaGVyCi12YWx1ZS4gIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaXMgcHJpbnRlZCwgcmF0aGVyIHRoYW4gdGhlIHZhbHVlLgotCi1AaXRlbSAtdCBAdmFye3JhZGl4fQotQGl0ZW14IC0tcmFkaXg9QHZhcntyYWRpeH0KLVVzZSBAdmFye3JhZGl4fSBhcyB0aGUgcmFkaXggZm9yIHByaW50aW5nIHRoZSBzeW1ib2wgdmFsdWVzLiAgSXQgbXVzdCBiZQotQHNhbXB7ZH0gZm9yIGRlY2ltYWwsIEBzYW1we299IGZvciBvY3RhbCwgb3IgQHNhbXB7eH0gZm9yIGhleGFkZWNpbWFsLgotCi1AaXRlbSAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1AY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAotU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtdQotQGl0ZW14IC0tdW5kZWZpbmVkLW9ubHkgCi1AY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKLUBjaW5kZXggdW5kZWZpbmVkIHN5bWJvbHMKLURpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyAodGhvc2UgZXh0ZXJuYWwgdG8gZWFjaCBvYmplY3QgZmlsZSkuCi0KLUBpdGVtIC0tZGVmaW5lZC1vbmx5Ci1AY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKLUBjaW5kZXggdW5kZWZpbmVkIHN5bWJvbHMKLURpc3BsYXkgb25seSBkZWZpbmVkIHN5bWJvbHMgZm9yIGVhY2ggb2JqZWN0IGZpbGUuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtubX0gYW5kIGV4aXQuCi0KLUBpdGVtIC0taGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7bm19IGFuZCBleGl0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBvYmpjb3B5Ci1AY2hhcHRlciBvYmpjb3B5Ci0KLUBzbWFsbGV4YW1wbGUKLW9iamNvcHkgWyAtRiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLUkgQHZhcntiZmRuYW1lfSB8IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1PIEB2YXJ7YmZkbmFtZX0gfCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLVMgfCAtLXN0cmlwLWFsbCBdICBbIC1nIHwgLS1zdHJpcC1kZWJ1ZyBdCi0gICAgICAgIFsgLUsgQHZhcntzeW1ib2xuYW1lfSB8IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICAgIFsgLU4gQHZhcntzeW1ib2xuYW1lfSB8IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgICBbIC1MIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLWxvY2FsaXplLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAtVyBAdmFye3N5bWJvbG5hbWV9IHwgLS13ZWFrZW4tc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgICBbIC14IHwgLS1kaXNjYXJkLWFsbCBdICBbIC1YIHwgLS1kaXNjYXJkLWxvY2FscyBdCi0gICAgICAgIFsgLWIgQHZhcntieXRlfSB8IC0tYnl0ZT1AdmFye2J5dGV9IF0KLSAgICAgICAgWyAtaSBAdmFye2ludGVybGVhdmV9IHwgLS1pbnRlcmxlYXZlPUB2YXJ7aW50ZXJsZWF2ZX0gXQotICAgICAgICBbIC1qIEB2YXJ7c2VjdGlvbm5hbWV9IHwgLS1vbmx5LXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQotICAgICAgICBbIC1SIEB2YXJ7c2VjdGlvbm5hbWV9IHwgLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfSBdCi0gICAgICAgIFsgLXAgfCAtLXByZXNlcnZlLWRhdGVzIF0gWyAtLWRlYnVnZ2luZyBdCi0gICAgICAgIFsgLS1nYXAtZmlsbD1AdmFye3ZhbH0gXSBbIC0tcGFkLXRvPUB2YXJ7YWRkcmVzc30gXQotICAgICAgICBbIC0tc2V0LXN0YXJ0PUB2YXJ7dmFsfSBdIFsgLS1hZGp1c3Qtc3RhcnQ9QHZhcntpbmNyfSBdCi0gICAgICAgIFsgLS1jaGFuZ2UtYWRkcmVzc2VzPUB2YXJ7aW5jcn0gXQotICAgICAgICBbIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcz1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLWxtYT1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLXZtYT1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KLSAgICAgICAgWyAtLWNoYW5nZS13YXJuaW5ncyBdIFsgLS1uby1jaGFuZ2Utd2FybmluZ3MgXQotICAgICAgICBbIC0tc2V0LXNlY3Rpb24tZmxhZ3M9QHZhcntzZWN0aW9ufT1AdmFye2ZsYWdzfSBdCi0gICAgICAgIFsgLS1hZGQtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfT1AdmFye2ZpbGVuYW1lfSBdCi0gICAgICAgIFsgLS1jaGFuZ2UtbGVhZGluZy1jaGFyIF0gWyAtLXJlbW92ZS1sZWFkaW5nLWNoYXIgXQotICAgICAgICBbIC0td2Vha2VuIF0KLSAgICAgICAgWyAtdiB8IC0tdmVyYm9zZSBdIFsgLVYgfCAtLXZlcnNpb24gXSAgWyAtLWhlbHAgXQotICAgICAgICBAdmFye2luZmlsZX0gW0B2YXJ7b3V0ZmlsZX1dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQHNje2dudX0gQGNvZGV7b2JqY29weX0gdXRpbGl0eSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdAotZmlsZSB0byBhbm90aGVyLiAgQGNvZGV7b2JqY29weX0gdXNlcyB0aGUgQHNje2dudX0gQHNje2JmZH0gTGlicmFyeSB0bwotcmVhZCBhbmQgd3JpdGUgdGhlIG9iamVjdCBmaWxlcy4gIEl0IGNhbiB3cml0ZSB0aGUgZGVzdGluYXRpb24gb2JqZWN0Ci1maWxlIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YgdGhlIHNvdXJjZSBvYmplY3QgZmlsZS4gIFRoZQotZXhhY3QgYmVoYXZpb3Igb2YgQGNvZGV7b2JqY29weX0gaXMgY29udHJvbGxlZCBieSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KLQotQGNvZGV7b2JqY29weX0gY3JlYXRlcyB0ZW1wb3JhcnkgZmlsZXMgdG8gZG8gaXRzIHRyYW5zbGF0aW9ucyBhbmQKLWRlbGV0ZXMgdGhlbSBhZnRlcndhcmQuICBAY29kZXtvYmpjb3B5fSB1c2VzIEBzY3tiZmR9IHRvIGRvIGFsbCBpdHMKLXRyYW5zbGF0aW9uIHdvcms7IGl0IGhhcyBhY2Nlc3MgdG8gYWxsIHRoZSBmb3JtYXRzIGRlc2NyaWJlZCBpbiBAc2N7YmZkfQotYW5kIHRodXMgaXMgYWJsZSB0byByZWNvZ25pemUgbW9zdCBmb3JtYXRzIHdpdGhvdXQgYmVpbmcgdG9sZAotZXhwbGljaXRseS4gIEB4cmVme0JGRCwsQkZELGxkLmluZm8sVXNpbmcgTER9LgotCi1AY29kZXtvYmpjb3B5fSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBTLXJlY29yZHMgYnkgdXNpbmcgYW4gb3V0cHV0Ci10YXJnZXQgb2YgQHNhbXB7c3JlY30gKGUuZy4sIHVzZSBAc2FtcHstTyBzcmVjfSkuCi0KLUBjb2Rle29iamNvcHl9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcmF3IGJpbmFyeSBmaWxlIGJ5IHVzaW5nIGFuCi1vdXRwdXQgdGFyZ2V0IG9mIEBzYW1we2JpbmFyeX0gKGUuZy4sIHVzZSBAc2FtcHstTyBiaW5hcnl9KS4gIFdoZW4KLUBjb2Rle29iamNvcHl9IGdlbmVyYXRlcyBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgd2lsbCBlc3NlbnRpYWxseSBwcm9kdWNlCi1hIG1lbW9yeSBkdW1wIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgb2JqZWN0IGZpbGUuICBBbGwgc3ltYm9scyBhbmQKLXJlbG9jYXRpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBkaXNjYXJkZWQuICBUaGUgbWVtb3J5IGR1bXAgd2lsbCBzdGFydCBhdAotdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgbG93ZXN0IHNlY3Rpb24gY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLgotCi1XaGVuIGdlbmVyYXRpbmcgYW4gUy1yZWNvcmQgb3IgYSByYXcgYmluYXJ5IGZpbGUsIGl0IG1heSBiZSBoZWxwZnVsIHRvCi11c2UgQHNhbXB7LVN9IHRvIHJlbW92ZSBzZWN0aW9ucyBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluCi1zb21lIGNhc2VzIEBzYW1wey1SfSB3aWxsIGJlIHVzZWZ1bCB0byByZW1vdmUgc2VjdGlvbnMgd2hpY2ggY29udGFpbgotaW5mb3JtYXRpb24gd2hpY2ggaXMgbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntpbmZpbGV9Ci1AaXRlbXggQHZhcntvdXRmaWxlfQotVGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZpbGVzLCByZXNwZWN0aXZlbHkuCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgQHZhcntvdXRmaWxlfSwgQGNvZGV7b2JqY29weX0gY3JlYXRlcyBhCi10ZW1wb3JhcnkgZmlsZSBhbmQgZGVzdHJ1Y3RpdmVseSByZW5hbWVzIHRoZSByZXN1bHQgd2l0aAotdGhlIG5hbWUgb2YgQHZhcntpbmZpbGV9LgotCi1AaXRlbSAtSSBAdmFye2JmZG5hbWV9CQotQGl0ZW14IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUNvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgQHZhcntiZmRuYW1lfSwgcmF0aGVyIHRoYW4KLWF0dGVtcHRpbmcgdG8gZGVkdWNlIGl0LiAgQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtTyBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVdyaXRlIHRoZSBvdXRwdXQgZmlsZSB1c2luZyB0aGUgb2JqZWN0IGZvcm1hdCBAdmFye2JmZG5hbWV9LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtRiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotVXNlIEB2YXJ7YmZkbmFtZX0gYXMgdGhlIG9iamVjdCBmb3JtYXQgZm9yIGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0Ci1maWxlOyBpLmUuLCBzaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vCi10cmFuc2xhdGlvbi4gIEB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLWogQHZhcntzZWN0aW9ubmFtZX0KLUBpdGVteCAtLW9ubHktc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfQotQ29weSBvbmx5IHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGlucHV0IGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlLgotVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uCi1pbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dCBmaWxlIHVudXNhYmxlLgotCi1AaXRlbSAtUiBAdmFye3NlY3Rpb25uYW1lfQotQGl0ZW14IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0KLVJlbW92ZSBhbnkgc2VjdGlvbiBuYW1lZCBAdmFye3NlY3Rpb25uYW1lfSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24KLWluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUgb3V0cHV0IGZpbGUgdW51c2FibGUuCi0KLUBpdGVtIC1TCi1AaXRlbXggLS1zdHJpcC1hbGwKLURvIG5vdCBjb3B5IHJlbG9jYXRpb24gYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLQotQGl0ZW0gLWcKLUBpdGVteCAtLXN0cmlwLWRlYnVnCi1EbyBub3QgY29weSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLQotQGl0ZW0gLS1zdHJpcC11bm5lZWRlZAotU3RyaXAgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotCi1AaXRlbSAtSyBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1rZWVwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1Db3B5IG9ubHkgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkKLWJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtTiBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1zdHJpcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotRG8gbm90IGNvcHkgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuICBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtTCBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1sb2NhbGl6ZS1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotTWFrZSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBsb2NhbCB0byB0aGUgZmlsZSwgc28gdGhhdCBpdCBpcyBub3QKLXZpc2libGUgZXh0ZXJuYWxseS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLVcgQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0td2Vha2VuLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1NYWtlIHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IHdlYWsuIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWRpc2NhcmQtYWxsCi1EbyBub3QgY29weSBub24tZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCi1AYyBGSVhNRSBhbnkgcmVhc29uIHRvIHByZWZlciAibm9uLWdsb2JhbCIgdG8gImxvY2FsIiBoZXJlPwotCi1AaXRlbSAtWAotQGl0ZW14IC0tZGlzY2FyZC1sb2NhbHMKLURvIG5vdCBjb3B5IGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLgotKFRoZXNlIHVzdWFsbHkgc3RhcnQgd2l0aCBAc2FtcHtMfSBvciBAc2FtcHsufS4pCi0KLUBpdGVtIC1iIEB2YXJ7Ynl0ZX0KLUBpdGVteCAtLWJ5dGU9QHZhcntieXRlfQotS2VlcCBvbmx5IGV2ZXJ5IEB2YXJ7Ynl0ZX10aCBieXRlIG9mIHRoZSBpbnB1dCBmaWxlIChoZWFkZXIgZGF0YSBpcyBub3QKLWFmZmVjdGVkKS4gIEB2YXJ7Ynl0ZX0gY2FuIGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gQHZhcntpbnRlcmxlYXZlfS0xLAotd2hlcmUgQHZhcntpbnRlcmxlYXZlfSBpcyBnaXZlbiBieSB0aGUgQHNhbXB7LWl9IG9yIEBzYW1wey0taW50ZXJsZWF2ZX0KLW9wdGlvbiwgb3IgdGhlIGRlZmF1bHQgb2YgNC4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgZmlsZXMKLXRvIHByb2dyYW0gQHNje3JvbX0uICBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFuIEBjb2Rle3NyZWN9IG91dHB1dAotdGFyZ2V0LgotCi1AaXRlbSAtaSBAdmFye2ludGVybGVhdmV9Ci1AaXRlbXggLS1pbnRlcmxlYXZlPUB2YXJ7aW50ZXJsZWF2ZX0KLU9ubHkgY29weSBvbmUgb3V0IG9mIGV2ZXJ5IEB2YXJ7aW50ZXJsZWF2ZX0gYnl0ZXMuICBTZWxlY3Qgd2hpY2ggYnl0ZSB0bwotY29weSB3aXRoIHRoZSBAdmFyey1ifSBvciBAc2FtcHstLWJ5dGV9IG9wdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDQuCi1AY29kZXtvYmpjb3B5fSBpZ25vcmVzIHRoaXMgb3B0aW9uIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBlaXRoZXIgQHNhbXB7LWJ9IG9yCi1Ac2FtcHstLWJ5dGV9LgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJlc2VydmUtZGF0ZXMKLVNldCB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIG91dHB1dCBmaWxlIHRvIGJlIHRoZSBzYW1lCi1hcyB0aG9zZSBvZiB0aGUgaW5wdXQgZmlsZS4KLQotQGl0ZW0gLS1kZWJ1Z2dpbmcKLUNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpZiBwb3NzaWJsZS4gIFRoaXMgaXMgbm90IHRoZSBkZWZhdWx0Ci1iZWNhdXNlIG9ubHkgY2VydGFpbiBkZWJ1Z2dpbmcgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlCi1jb252ZXJzaW9uIHByb2Nlc3MgY2FuIGJlIHRpbWUgY29uc3VtaW5nLgotCi1AaXRlbSAtLWdhcC1maWxsIEB2YXJ7dmFsfQotRmlsbCBnYXBzIGJldHdlZW4gc2VjdGlvbnMgd2l0aCBAdmFye3ZhbH0uICBUaGlzIG9wZXJhdGlvbiBhcHBsaWVzIHRvCi10aGUgQGVtcGh7bG9hZCBhZGRyZXNzfSAoTE1BKSBvZiB0aGUgc2VjdGlvbnMuICBJdCBpcyBkb25lIGJ5IGluY3JlYXNpbmcKLXRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIHdpdGggdGhlIGxvd2VyIGFkZHJlc3MsIGFuZCBmaWxsaW5nIGluIHRoZSBleHRyYQotc3BhY2UgY3JlYXRlZCB3aXRoIEB2YXJ7dmFsfS4KLQotQGl0ZW0gLS1wYWQtdG8gQHZhcnthZGRyZXNzfQotUGFkIHRoZSBvdXRwdXQgZmlsZSB1cCB0byB0aGUgbG9hZCBhZGRyZXNzIEB2YXJ7YWRkcmVzc30uICBUaGlzIGlzCi1kb25lIGJ5IGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbi4gIFRoZSBleHRyYSBzcGFjZSBpcwotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZCBieSBAc2FtcHstLWdhcC1maWxsfSAoZGVmYXVsdCB6ZXJvKS4KLQotQGl0ZW0gLS1zZXQtc3RhcnQgQHZhcnt2YWx9Ci1TZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyBmaWxlIHRvIEB2YXJ7dmFsfS4gIE5vdCBhbGwgb2JqZWN0IGZpbGUKLWZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotCi1AaXRlbSAtLWNoYW5nZS1zdGFydCBAdmFye2luY3J9Ci1AaXRlbXggLS1hZGp1c3Qtc3RhcnQgQHZhcntpbmNyfQotQGNpbmRleCBjaGFuZ2luZyBzdGFydCBhZGRyZXNzCi1DaGFuZ2UgdGhlIHN0YXJ0IGFkZHJlc3MgYnkgYWRkaW5nIEB2YXJ7aW5jcn0uICBOb3QgYWxsIG9iamVjdCBmaWxlCi1mb3JtYXRzIHN1cHBvcnQgc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcy4KLQotQGl0ZW0gLS1jaGFuZ2UtYWRkcmVzc2VzIEB2YXJ7aW5jcn0KLUBpdGVteCAtLWFkanVzdC12bWEgQHZhcntpbmNyfQotQGNpbmRleCBjaGFuZ2luZyBvYmplY3QgYWRkcmVzc2VzCi1DaGFuZ2UgdGhlIFZNQSBhbmQgTE1BIGFkZHJlc3NlcyBvZiBhbGwgc2VjdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN0YXJ0Ci1hZGRyZXNzLCBieSBhZGRpbmcgQHZhcntpbmNyfS4gIFNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBkbyBub3QgcGVybWl0Ci1zZWN0aW9uIGFkZHJlc3NlcyB0byBiZSBjaGFuZ2VkIGFyYml0cmFyaWx5LiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKLXJlbG9jYXRlIHRoZSBzZWN0aW9uczsgaWYgdGhlIHByb2dyYW0gZXhwZWN0cyBzZWN0aW9ucyB0byBiZSBsb2FkZWQgYXQgYQotY2VydGFpbiBhZGRyZXNzLCBhbmQgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHNlY3Rpb25zIHN1Y2gKLXRoYXQgdGhleSBhcmUgbG9hZGVkIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MsIHRoZSBwcm9ncmFtIG1heSBmYWlsLiAKLQotQGl0ZW0gLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBpdGVteCAtLWFkanVzdC1zZWN0aW9uLXZtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gYWRkcmVzcwotU2V0IG9yIGNoYW5nZSBib3RoIHRoZSBWTUEgYWRkcmVzcyBhbmQgdGhlIExNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZAotQHZhcntzZWN0aW9ufS4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvCi1AdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlCi1zZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyIEBzYW1wey0tY2hhbmdlLWFkZHJlc3Nlc30sCi1hYm92ZS4gSWYgQHZhcntzZWN0aW9ufSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwKLWJlIGlzc3VlZCwgdW5sZXNzIEBzYW1wey0tbm8tY2hhbmdlLXdhcm5pbmdzfSBpcyB1c2VkLgotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLWxtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gTE1BCi1TZXQgb3IgY2hhbmdlIHRoZSBMTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFRoZSBMTUEKLWFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2FkZWQgaW50byBtZW1vcnkgYXQKLXByb2dyYW0gbG9hZCB0aW1lLiAgTm9ybWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgVk1BIGFkZHJlc3MsIHdoaWNoCi1pcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBhdCBwcm9ncmFtIHJ1biB0aW1lLCBidXQgb24gc29tZSBzeXN0ZW1zLAotZXNwZWNpYWxseSB0aG9zZSB3aGVyZSBhIHByb2dyYW0gaXMgaGVsZCBpbiBST00sIHRoZSB0d28gY2FuIGJlCi1kaWZmZXJlbnQuICBJZiBAc2FtcHs9fSBpcyB1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0bwotQHZhcnt2YWx9LiAgT3RoZXJ3aXNlLCBAdmFye3ZhbH0gaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZQotc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlciBAc2FtcHstLWNoYW5nZS1hZGRyZXNzZXN9LAotYWJvdmUuICBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcKLXdpbGwgYmUgaXNzdWVkLCB1bmxlc3MgQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuICAKLQotQGl0ZW0gLS1jaGFuZ2Utc2VjdGlvbi12bWEgQHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfQotQGNpbmRleCBjaGFuZ2luZyBzZWN0aW9uIFZNQQotU2V0IG9yIGNoYW5nZSB0aGUgVk1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGUgVk1BCi1hZGRyZXNzIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwgYmUgbG9jYXRlZCBvbmNlIHRoZQotcHJvZ3JhbSBoYXMgc3RhcnRlZCBleGVjdXRpbmcuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBMTUEKLWFkZHJlc3MsIHdoaWNoIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwgYmUgbG9hZGVkIGludG8KLW1lbW9yeSwgYnV0IG9uIHNvbWUgc3lzdGVtcywgZXNwZWNpYWxseSB0aG9zZSB3aGVyZSBhIHByb2dyYW0gaXMgaGVsZCBpbgotUk9NLCB0aGUgdHdvIGNhbiBiZSBkaWZmZXJlbnQuICBJZiBAc2FtcHs9fSBpcyB1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzCi1pcyBzZXQgdG8gQHZhcnt2YWx9LiAgT3RoZXJ3aXNlLCBAdmFye3ZhbH0gaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZAotZnJvbSB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlcgotQHNhbXB7LS1jaGFuZ2UtYWRkcmVzc2VzfSwgYWJvdmUuICBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluCi10aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKLUBzYW1wey0tbm8tY2hhbmdlLXdhcm5pbmdzfSBpcyB1c2VkLiAgIAotCi1AaXRlbSAtLWNoYW5nZS13YXJuaW5ncwotQGl0ZW14IC0tYWRqdXN0LXdhcm5pbmdzCi1JZiBAc2FtcHstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3N9IG9yIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tbG1hfSBvcgotQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi12bWF9IGlzIHVzZWQsIGFuZCB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdAotZXhpc3QsIGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuIAotCi1AaXRlbSAtLW5vLWNoYW5nZS13YXJuaW5ncwotQGl0ZW14IC0tbm8tYWRqdXN0LXdhcm5pbmdzCi1EbyBub3QgaXNzdWUgYSB3YXJuaW5nIGlmIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzc30gb3IKLUBzYW1wey0tYWRqdXN0LXNlY3Rpb24tbG1hfSBvciBAc2FtcHstLWFkanVzdC1zZWN0aW9uLXZtYX0gaXMgdXNlZCwgZXZlbgotaWYgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcyBub3QgZXhpc3QuIAotCi1AaXRlbSAtLXNldC1zZWN0aW9uLWZsYWdzIEB2YXJ7c2VjdGlvbn09QHZhcntmbGFnc30KLVNldCB0aGUgZmxhZ3MgZm9yIHRoZSBuYW1lZCBzZWN0aW9uLiAgVGhlIEB2YXJ7ZmxhZ3N9IGFyZ3VtZW50IGlzIGEKLWNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgZmxhZyBuYW1lcy4gIFRoZSByZWNvZ25pemVkIG5hbWVzIGFyZQotQHNhbXB7YWxsb2N9LCBAc2FtcHtjb250ZW50c30sIEBzYW1we2xvYWR9LCBAc2FtcHtyZWFkb25seX0sCi1Ac2FtcHtjb2RlfSwgQHNhbXB7ZGF0YX0sIGFuZCBAc2FtcHtyb219LiAgWW91IGNhbiBzZXQgdGhlCi1Ac2FtcHtjb250ZW50c30gZmxhZyBmb3IgYSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGhhdmUgY29udGVudHMsIGJ1dCBpdAotaXMgbm90IG1lYW5pbmdmdWwgdG8gY2xlYXIgdGhlIEBzYW1we2NvbnRlbnRzfSBmbGFnIG9mIGEgc2VjdGlvbiB3aGljaAotZG9lcyBoYXZlIGNvbnRlbnRzLS1qdXN0IHJlbW92ZSB0aGUgc2VjdGlvbiBpbnN0ZWFkLiAgTm90IGFsbCBmbGFncyBhcmUKLW1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AaXRlbSAtLWFkZC1zZWN0aW9uIEB2YXJ7c2VjdGlvbm5hbWV9PUB2YXJ7ZmlsZW5hbWV9Ci1BZGQgYSBuZXcgc2VjdGlvbiBuYW1lZCBAdmFye3NlY3Rpb25uYW1lfSB3aGlsZSBjb3B5aW5nIHRoZSBmaWxlLiAgVGhlCi1jb250ZW50cyBvZiB0aGUgbmV3IHNlY3Rpb24gYXJlIHRha2VuIGZyb20gdGhlIGZpbGUgQHZhcntmaWxlbmFtZX0uICBUaGUKLXNpemUgb2YgdGhlIHNlY3Rpb24gd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG9ubHkKLXdvcmtzIG9uIGZpbGUgZm9ybWF0cyB3aGljaCBjYW4gc3VwcG9ydCBzZWN0aW9ucyB3aXRoIGFyYml0cmFyeSBuYW1lcy4KLQotQGl0ZW0gLS1jaGFuZ2UtbGVhZGluZy1jaGFyCi1Tb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNlIHNwZWNpYWwgY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQgb2YKLXN5bWJvbHMuICBUaGUgbW9zdCBjb21tb24gc3VjaCBjaGFyYWN0ZXIgaXMgdW5kZXJzY29yZSwgd2hpY2ggY29tcGlsZXJzCi1vZnRlbiBhZGQgYmVmb3JlIGV2ZXJ5IHN5bWJvbC4gIFRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle29iamNvcHl9IHRvCi1jaGFuZ2UgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIG9mIGV2ZXJ5IHN5bWJvbCB3aGVuIGl0IGNvbnZlcnRzIGJldHdlZW4KLW9iamVjdCBmaWxlIGZvcm1hdHMuICBJZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2UgdGhlIHNhbWUgbGVhZGluZwotY2hhcmFjdGVyLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGFkZCBhCi1jaGFyYWN0ZXIsIG9yIHJlbW92ZSBhIGNoYXJhY3Rlciwgb3IgY2hhbmdlIGEgY2hhcmFjdGVyLCBhcwotYXBwcm9wcmlhdGUuCi0KLUBpdGVtIC0tcmVtb3ZlLWxlYWRpbmctY2hhcgotSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGdsb2JhbCBzeW1ib2wgaXMgYSBzcGVjaWFsIHN5bWJvbCBsZWFkaW5nCi1jaGFyYWN0ZXIgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCByZW1vdmUgdGhlIGNoYXJhY3Rlci4gIFRoZQotbW9zdCBjb21tb24gc3ltYm9sIGxlYWRpbmcgY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUuICBUaGlzIG9wdGlvbiB3aWxsCi1yZW1vdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSBhbGwgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGNhbiBiZSB1c2VmdWwKLWlmIHlvdSB3YW50IHRvIGxpbmsgdG9nZXRoZXIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzIHdpdGgKLWRpZmZlcmVudCBjb252ZW50aW9ucyBmb3Igc3ltYm9sIG5hbWVzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotQGNvZGV7LS1jaGFuZ2UtbGVhZGluZy1jaGFyfSBiZWNhdXNlIGl0IGFsd2F5cyBjaGFuZ2VzIHRoZSBzeW1ib2wgbmFtZQotd2hlbiBhcHByb3ByaWF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQKLWZpbGUuCi0KLUBpdGVtIC0td2Vha2VuCi1DaGFuZ2UgYWxsIGdsb2JhbCBzeW1ib2xzIGluIHRoZSBmaWxlIHRvIGJlIHdlYWsuICBUaGlzIGNhbiBiZSB1c2VmdWwKLXdoZW4gYnVpbGRpbmcgYW4gb2JqZWN0IHdoaWNoIHdpbGwgYmUgbGlua2VkIGFnYWluc3Qgb3RoZXIgb2JqZWN0cyB1c2luZwotdGhlIEBjb2Rley1SfSBvcHRpb24gdG8gdGhlIGxpbmtlci4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgZWZmZWN0aXZlIHdoZW4KLXVzaW5nIGFuIG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBzdXBwb3J0cyB3ZWFrIHN5bWJvbHMuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtvYmpjb3B5fS4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcmJvc2UKLVZlcmJvc2Ugb3V0cHV0OiBsaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWQuICBJbiB0aGUgY2FzZSBvZgotYXJjaGl2ZXMsIEBzYW1we29iamNvcHkgLVZ9IGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotCi1AaXRlbSAtLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle29iamNvcHl9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBvYmpkdW1wCi1AY2hhcHRlciBvYmpkdW1wCi0KLUBjaW5kZXggb2JqZWN0IGZpbGUgaW5mb3JtYXRpb24KLUBraW5kZXggb2JqZHVtcAotCi1Ac21hbGxleGFtcGxlCi1vYmpkdW1wIFsgLWEgfCAtLWFyY2hpdmUtaGVhZGVycyBdIAotICAgICAgICBbIC1iIEB2YXJ7YmZkbmFtZX0gfCAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0gWyAtLWRlYnVnZ2luZyBdCi0gICAgICAgIFsgLUMgfCAtLWRlbWFuZ2xlIF0gWyAtZCB8IC0tZGlzYXNzZW1ibGUgXQotICAgICAgICBbIC1EIHwgLS1kaXNhc3NlbWJsZS1hbGwgXSBbIC0tZGlzYXNzZW1ibGUtemVyb2VzIF0KLSAgICAgICAgWyAtRUIgfCAtRUwgfCAtLWVuZGlhbj1Ae2JpZyB8IGxpdHRsZSBAfSBdCi0gICAgICAgIFsgLWYgfCAtLWZpbGUtaGVhZGVycyBdCi0gICAgICAgIFsgLWggfCAtLXNlY3Rpb24taGVhZGVycyB8IC0taGVhZGVycyBdICBbIC1pIHwgLS1pbmZvIF0KLSAgICAgICAgWyAtaiBAdmFye3NlY3Rpb259IHwgLS1zZWN0aW9uPUB2YXJ7c2VjdGlvbn0gXQotICAgICAgICBbIC1sIHwgLS1saW5lLW51bWJlcnMgXSBbIC1TIHwgLS1zb3VyY2UgXQotICAgICAgICBbIC1tIEB2YXJ7bWFjaGluZX0gfCAtLWFyY2hpdGVjdHVyZT1AdmFye21hY2hpbmV9IF0KLSAgICAgICAgWyAtTSBAdmFye29wdGlvbnN9IHwgLS1kaXNhc3NlbWJsZXItb3B0aW9ucz1AdmFye29wdGlvbnN9XQotICAgICAgICBbIC1wIHwgLS1wcml2YXRlLWhlYWRlcnMgXQotICAgICAgICBbIC1yIHwgLS1yZWxvYyBdIFsgLVIgfCAtLWR5bmFtaWMtcmVsb2MgXQotICAgICAgICBbIC1zIHwgLS1mdWxsLWNvbnRlbnRzIF0gIFsgLS1zdGFicyBdCi0gICAgICAgIFsgLXQgfCAtLXN5bXMgXSBbIC1UIHwgLS1keW5hbWljLXN5bXMgXSBbIC14IHwgLS1hbGwtaGVhZGVycyBdCi0gICAgICAgIFsgLXcgfCAtLXdpZGUgXSBbIC0tc3RhcnQtYWRkcmVzcz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXN0b3AtYWRkcmVzcz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXByZWZpeC1hZGRyZXNzZXNdIFsgLS1bbm8tXXNob3ctcmF3LWluc24gXQotICAgICAgICBbIC0tYWRqdXN0LXZtYT1AdmFye29mZnNldH0gXQotICAgICAgICBbIC0tdmVyc2lvbiBdICBbIC0taGVscCBdCi0gICAgICAgIEB2YXJ7b2JqZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtvYmpkdW1wfSBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBvYmplY3QgZmlsZXMuCi1UaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LiAgVGhpcwotaW5mb3JtYXRpb24gaXMgbW9zdGx5IHVzZWZ1bCB0byBwcm9ncmFtbWVycyB3aG8gYXJlIHdvcmtpbmcgb24gdGhlCi1jb21waWxhdGlvbiB0b29scywgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWVycyB3aG8ganVzdCB3YW50IHRoZWlyCi1wcm9ncmFtIHRvIGNvbXBpbGUgYW5kIHdvcmsuCi0KLUB2YXJ7b2JqZmlsZX1AZG90c3t9IGFyZSB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlIGV4YW1pbmVkLiAgV2hlbiB5b3UKLXNwZWNpZnkgYXJjaGl2ZXMsIEBjb2Rle29iamR1bXB9IHNob3dzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIG1lbWJlcgotb2JqZWN0IGZpbGVzLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyBAc2FtcHstbH0gbXVzdCBiZSBnaXZlbi4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYQotQGl0ZW14IC0tYXJjaGl2ZS1oZWFkZXIKLUBjaW5kZXggYXJjaGl2ZSBoZWFkZXJzCi1JZiBhbnkgb2YgdGhlIEB2YXJ7b2JqZmlsZX0gZmlsZXMgYXJlIGFyY2hpdmVzLCBkaXNwbGF5IHRoZSBhcmNoaXZlCi1oZWFkZXIgaW5mb3JtYXRpb24gKGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gQHNhbXB7bHMgLWx9KS4gIEJlc2lkZXMgdGhlCi1pbmZvcm1hdGlvbiB5b3UgY291bGQgbGlzdCB3aXRoIEBzYW1we2FyIHR2fSwgQHNhbXB7b2JqZHVtcCAtYX0gc2hvd3MKLXRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgZWFjaCBhcmNoaXZlIG1lbWJlci4KLQotQGl0ZW0gLS1hZGp1c3Qtdm1hPUB2YXJ7b2Zmc2V0fQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3NlcyBpbiBvYmpkdW1wCi1AY2luZGV4IFZNQSBpbiBvYmpkdW1wCi1XaGVuIGR1bXBpbmcgaW5mb3JtYXRpb24sIGZpcnN0IGFkZCBAdmFye29mZnNldH0gdG8gYWxsIHRoZSBzZWN0aW9uCi1hZGRyZXNzZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgZG8gbm90IGNvcnJlc3BvbmQgdG8KLXRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBwdXR0aW5nIHNlY3Rpb25zIGF0IHBhcnRpY3VsYXIKLWFkZHJlc3NlcyB3aGVuIHVzaW5nIGEgZm9ybWF0IHdoaWNoIGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYWRkcmVzc2VzLAotc3VjaCBhcyBhLm91dC4KLQotQGl0ZW0gLWIgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IHRoYXQgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyBpcwotQHZhcntiZmRuYW1lfS4gIFRoaXMgb3B0aW9uIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBAdmFye29iamR1bXB9IGNhbgotYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLgotCi1Gb3IgZXhhbXBsZSwKLUBleGFtcGxlCi1vYmpkdW1wIC1iIG9hc3lzIC1tIHZheCAtaCBmdS5vCi1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotZGlzcGxheXMgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgKEBzYW1wey1ofSkgb2YKLUBmaWxle2Z1Lm99LCB3aGljaCBpcyBleHBsaWNpdGx5IGlkZW50aWZpZWQgKEBzYW1wey1tfSkgYXMgYSBWQVggb2JqZWN0Ci1maWxlIGluIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgT2FzeXMgY29tcGlsZXJzLiAgWW91IGNhbiBsaXN0IHRoZQotZm9ybWF0cyBhdmFpbGFibGUgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLUMKLUBpdGVteCAtLWRlbWFuZ2xlCi1AY2luZGV4IGRlbWFuZ2xpbmcgaW4gb2JqZHVtcAotRGVjb2RlIChAZGZue2RlbWFuZ2xlfSkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4gIEB4cmVme2MrK2ZpbHR9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotb24gZGVtYW5nbGluZy4KLQotQGl0ZW0gLS1kZWJ1Z2dpbmcKLURpc3BsYXkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBhdHRlbXB0cyB0byBwYXJzZSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgZmlsZSBhbmQgcHJpbnQgaXQgb3V0IHVzaW5nIGEgQyBsaWtlIHN5bnRheC4KLU9ubHkgY2VydGFpbiB0eXBlcyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZGlzYXNzZW1ibGUKLUBjaW5kZXggZGlzYXNzZW1ibGluZyBvYmplY3QgY29kZQotQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucwotRGlzcGxheSB0aGUgYXNzZW1ibGVyIG1uZW1vbmljcyBmb3IgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGZyb20KLUB2YXJ7b2JqZmlsZX0uICBUaGlzIG9wdGlvbiBvbmx5IGRpc2Fzc2VtYmxlcyB0aG9zZSBzZWN0aW9ucyB3aGljaCBhcmUKLWV4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSAtRAotQGl0ZW14IC0tZGlzYXNzZW1ibGUtYWxsCi1MaWtlIEBzYW1wey1kfSwgYnV0IGRpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMsIG5vdCBqdXN0Ci10aG9zZSBleHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLS1wcmVmaXgtYWRkcmVzc2VzCi1XaGVuIGRpc2Fzc2VtYmxpbmcsIHByaW50IHRoZSBjb21wbGV0ZSBhZGRyZXNzIG9uIGVhY2ggbGluZS4gIFRoaXMgaXMKLXRoZSBvbGRlciBkaXNhc3NlbWJseSBmb3JtYXQuCi0KLUBpdGVtIC0tZGlzYXNzZW1ibGUtemVyb2VzCi1Ob3JtYWxseSB0aGUgZGlzYXNzZW1ibHkgb3V0cHV0IHdpbGwgc2tpcCBibG9ja3Mgb2YgemVyb2VzLiAgVGhpcwotb3B0aW9uIGRpcmVjdHMgdGhlIGRpc2Fzc2VtYmxlciB0byBkaXNhc3NlbWJsZSB0aG9zZSBibG9ja3MsIGp1c3QgbGlrZQotYW55IG90aGVyIGRhdGEuCi0KLUBpdGVtIC1FQgotQGl0ZW14IC1FTAotQGl0ZW14IC0tZW5kaWFuPUB7YmlnfGxpdHRsZUB9Ci1AY2luZGV4IGVuZGlhbm5lc3MKLUBjaW5kZXggZGlzYXNzZW1ibHkgZW5kaWFubmVzcwotU3BlY2lmeSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBvbmx5IGFmZmVjdHMKLWRpc2Fzc2VtYmx5LiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBhIGZpbGUgZm9ybWF0IHdoaWNoCi1kb2VzIG5vdCBkZXNjcmliZSBlbmRpYW5uZXNzIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4KLQotQGl0ZW0gLWYKLUBpdGVteCAtLWZpbGUtaGVhZGVyCi1AY2luZGV4IG9iamVjdCBmaWxlIGhlYWRlcgotRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIG92ZXJhbGwgaGVhZGVyIG9mCi1lYWNoIG9mIHRoZSBAdmFye29iamZpbGV9IGZpbGVzLgotCi1AaXRlbSAtaAotQGl0ZW14IC0tc2VjdGlvbi1oZWFkZXIKLUBpdGVteCAtLWhlYWRlcgotQGNpbmRleCBzZWN0aW9uIGhlYWRlcnMKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgb2YgdGhlCi1vYmplY3QgZmlsZS4KLQotRmlsZSBzZWdtZW50cyBtYXkgYmUgcmVsb2NhdGVkIHRvIG5vbnN0YW5kYXJkIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYnkKLXVzaW5nIHRoZSBAc2FtcHstVHRleHR9LCBAc2FtcHstVGRhdGF9LCBvciBAc2FtcHstVGJzc30gb3B0aW9ucyB0bwotQGNvZGV7bGR9LiAgSG93ZXZlciwgc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBzdWNoIGFzIGEub3V0LCBkbyBub3QKLXN0b3JlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmaWxlIHNlZ21lbnRzLiAgSW4gdGhvc2Ugc2l0dWF0aW9ucywKLWFsdGhvdWdoIEBjb2Rle2xkfSByZWxvY2F0ZXMgdGhlIHNlY3Rpb25zIGNvcnJlY3RseSwgdXNpbmcgQHNhbXB7b2JqZHVtcAotLWh9IHRvIGxpc3QgdGhlIGZpbGUgc2VjdGlvbiBoZWFkZXJzIGNhbm5vdCBzaG93IHRoZSBjb3JyZWN0IGFkZHJlc3Nlcy4KLUluc3RlYWQsIGl0IHNob3dzIHRoZSB1c3VhbCBhZGRyZXNzZXMsIHdoaWNoIGFyZSBpbXBsaWNpdCBmb3IgdGhlCi10YXJnZXQuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle29iamR1bXB9IGFuZCBleGl0LgotCi1AaXRlbSAtaQotQGl0ZW14IC0taW5mbwotQGNpbmRleCBhcmNoaXRlY3R1cmVzIGF2YWlsYWJsZQotQGNpbmRleCBvYmplY3QgZm9ybWF0cyBhdmFpbGFibGUKLURpc3BsYXkgYSBsaXN0IHNob3dpbmcgYWxsIGFyY2hpdGVjdHVyZXMgYW5kIG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotZm9yIHNwZWNpZmljYXRpb24gd2l0aCBAc2FtcHstYn0gb3IgQHNhbXB7LW19LgotCi1AaXRlbSAtaiBAdmFye25hbWV9Ci1AaXRlbXggLS1zZWN0aW9uPUB2YXJ7bmFtZX0KLUBjaW5kZXggc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheSBpbmZvcm1hdGlvbiBvbmx5IGZvciBzZWN0aW9uIEB2YXJ7bmFtZX0uCi0KLUBpdGVtIC1sCi1AaXRlbXggLS1saW5lLW51bWJlcnMKLUBjaW5kZXggc291cmNlIGZpbGVuYW1lcyBmb3Igb2JqZWN0IGZpbGVzCi1MYWJlbCB0aGUgZGlzcGxheSAodXNpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uKSB3aXRoIHRoZSBmaWxlbmFtZSBhbmQKLXNvdXJjZSBsaW5lIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGNvZGUgb3IgcmVsb2NzIHNob3duLgotT25seSB1c2VmdWwgd2l0aCBAc2FtcHstZH0sIEBzYW1wey1EfSwgb3IgQHNhbXB7LXJ9LgotCi1AaXRlbSAtbSBAdmFye21hY2hpbmV9Ci1AaXRlbXggLS1hcmNoaXRlY3R1cmU9QHZhcnttYWNoaW5lfQotQGNpbmRleCBhcmNoaXRlY3R1cmUKLUBjaW5kZXggZGlzYXNzZW1ibHkgYXJjaGl0ZWN0dXJlCi1TcGVjaWZ5IHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMuICBUaGlzCi1jYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgd2hpY2ggZG8gbm90IGRlc2NyaWJlCi1hcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLQotQGl0ZW0gLU0gQHZhcntvcHRpb25zfQotQGl0ZW14IC0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9QHZhcntvcHRpb25zfQotUGFzcyB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdGhlIGRpc2Fzc2VtYmxlci4gIE9ubHkgc3VwcG9ydGVkIG9uCi1zb21lIHRhcmdldHMuCi0KLUlmIHRoZSB0YXJnZXQgaXMgYW4gQVJNIGFyY2hpdGVjdHVyZSB0aGVuIHRoaXMgc3dpdGNoIGNhbiBiZSB1c2VkIHRvCi1zZWxlY3Qgd2hpY2ggcmVnaXN0ZXIgbmFtZSBzZXQgaXMgdXNlZCBkdXJpbmcgZGlzYXNzZW1ibGVyLiAgU3BlY2lmeWluZwotQHNhbXB7LS1kaXNhc3NlbWJsZXItb3B0aW9ucz1yZWctbmFtZS1zdGR9ICh0aGUgZGVmYXVsdCkgd2lsbCBzZWxlY3QgdGhlCi1yZWdpc3RlciBuYW1lcyBhcyB1c2VkIGluIEFSTSdzIGluc3RydWN0aW9uIHNldCBkb2N1bWVudGF0aW9uLCBidXQgd2l0aAotcmVnaXN0ZXIgMTMgY2FsbGVkICdzcCcsIHJlZ2lzdGVyIDE0IGNhbGxlZCAnbHInIGFuZCByZWdpc3RlciAxNSBjYWxsZWQKLSdwYycuICBTcGVjaWZ5aW5nIEBzYW1wey0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9cmVnLW5hbWVzLWFwY3N9IHdpbGwKLXNlbGVjdCB0aGUgbmFtZSBzZXQgdXNlZCBieSB0aGUgQVJNIFByb2NlZHVyZSBDYWxsIFN0YW5kYXJkLCB3aGlsc3QKLXNwZWNpZnlpbmcgQHNhbXB7LS1kaXNhc3NlbWJsZXItb3B0aW9ucz1yZWctbmFtZXMtcmF3fSB3aWxsIGp1c3QgdXNlCi1Ac2FtcHtyfSBmb2xsb3dlZCBieSB0aGUgcmVnaXN0ZXIgbnVtYmVyLgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJpdmF0ZS1oZWFkZXJzCi1QcmludCBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUgZXhhY3QKLWluZm9ybWF0aW9uIHByaW50ZWQgZGVwZW5kcyB1cG9uIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBGb3Igc29tZQotb2JqZWN0IGZpbGUgZm9ybWF0cywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLgotCi1AaXRlbSAtcgotQGl0ZW14IC0tcmVsb2MKLUBjaW5kZXggcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQotUHJpbnQgdGhlIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIElmIHVzZWQgd2l0aCBAc2FtcHstZH0gb3IKLUBzYW1wey1EfSwgdGhlIHJlbG9jYXRpb25zIGFyZSBwcmludGVkIGludGVyc3BlcnNlZCB3aXRoIHRoZQotZGlzYXNzZW1ibHkuCi0KLUBpdGVtIC1SCi1AaXRlbXggLS1keW5hbWljLXJlbG9jCi1AY2luZGV4IGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQotUHJpbnQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLWZ1bGwtY29udGVudHMKLUBjaW5kZXggc2VjdGlvbnMsIGZ1bGwgY29udGVudHMKLUBjaW5kZXggb2JqZWN0IGZpbGUgc2VjdGlvbnMKLURpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYW55IHNlY3Rpb25zIHJlcXVlc3RlZC4KLQotQGl0ZW0gLVMKLUBpdGVteCAtLXNvdXJjZQotQGNpbmRleCBzb3VyY2UgZGlzYXNzZW1ibHkKLUBjaW5kZXggZGlzYXNzZW1ibHksIHdpdGggc291cmNlCi1EaXNwbGF5IHNvdXJjZSBjb2RlIGludGVybWl4ZWQgd2l0aCBkaXNhc3NlbWJseSwgaWYgcG9zc2libGUuICBJbXBsaWVzCi1Ac2FtcHstZH0uCi0KLUBpdGVtIC0tc2hvdy1yYXctaW5zbgotV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgcHJpbnQgdGhlIGluc3RydWN0aW9uIGluIGhleCBhcyB3ZWxsIGFzCi1pbiBzeW1ib2xpYyBmb3JtLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBleGNlcHQgd2hlbgotQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgotCi1AaXRlbSAtLW5vLXNob3ctcmF3LWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIGRvIG5vdCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IHdoZW4gQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgotCi1AaXRlbSAtLXN0YWJzCi1AY2luZGV4IHN0YWIKLUBjaW5kZXggLnN0YWIKLUBjaW5kZXggZGVidWcgc3ltYm9scwotQGNpbmRleCBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0Ci1EaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9ucyByZXF1ZXN0ZWQuICBEaXNwbGF5IHRoZQotY29udGVudHMgb2YgdGhlIC5zdGFiIGFuZCAuc3RhYi5pbmRleCBhbmQgLnN0YWIuZXhjbCBzZWN0aW9ucyBmcm9tIGFuCi1FTEYgZmlsZS4gIFRoaXMgaXMgb25seSB1c2VmdWwgb24gc3lzdGVtcyAoc3VjaCBhcyBTb2xhcmlzIDIuMCkgaW4gd2hpY2gKLUBjb2Rley5zdGFifSBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlIGNhcnJpZWQgaW4gYW4gRUxGCi1zZWN0aW9uLiAgSW4gbW9zdCBvdGhlciBmaWxlIGZvcm1hdHMsIGRlYnVnZ2luZyBzeW1ib2wtdGFibGUgZW50cmllcyBhcmUKLWludGVybGVhdmVkIHdpdGggbGlua2FnZSBzeW1ib2xzLCBhbmQgYXJlIHZpc2libGUgaW4gdGhlIEBzYW1wey0tc3ltc30KLW91dHB1dC4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN0YWJzIHN5bWJvbHMsIHNlZSBAcmVme1RvcCxTdGFicyxTdGFicwotT3ZlcnZpZXcsc3RhYnMuaW5mbywgVGhlIGBgc3RhYnMnJyBkZWJ1ZyBmb3JtYXR9LgotCi1AaXRlbSAtLXN0YXJ0LWFkZHJlc3M9QHZhcnthZGRyZXNzfQotQGNpbmRleCBzdGFydC1hZGRyZXNzCi1TdGFydCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZSBAY29kZXstZH0sIEBjb2Rley1yfSBhbmQgQGNvZGV7LXN9IG9wdGlvbnMuCi0KLUBpdGVtIC0tc3RvcC1hZGRyZXNzPUB2YXJ7YWRkcmVzc30KLUBjaW5kZXggc3RvcC1hZGRyZXNzCi1TdG9wIGRpc3BsYXlpbmcgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBUaGlzIGFmZmVjdHMgdGhlIG91dHB1dAotb2YgdGhlIEBjb2Rley1kfSwgQGNvZGV7LXJ9IGFuZCBAY29kZXstc30gb3B0aW9ucy4KLQotQGl0ZW0gLXQKLUBpdGVteCAtLXN5bXMKLUBjaW5kZXggc3ltYm9sIHRhYmxlIGVudHJpZXMsIHByaW50aW5nCi1QcmludCB0aGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuCi1UaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBAc2FtcHtubX0gcHJvZ3JhbS4KLQotQGl0ZW0gLVQKLUBpdGVteCAtLWR5bmFtaWMtc3ltcwotQGNpbmRleCBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBwcmludGluZwotUHJpbnQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuICBUaGlzIGlzIG9ubHkKLW1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAotbGlicmFyaWVzLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgQHNhbXB7bm19Ci1wcm9ncmFtIHdoZW4gZ2l2ZW4gdGhlIEBzYW1wey1EfSAoQHNhbXB7LS1keW5hbWljfSkgb3B0aW9uLgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtvYmpkdW1wfSBhbmQgZXhpdC4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWFsbC1oZWFkZXIKLUBjaW5kZXggYWxsIGhlYWRlciBpbmZvcm1hdGlvbiwgb2JqZWN0IGZpbGUKLUBjaW5kZXggaGVhZGVyIGluZm9ybWF0aW9uLCBhbGwKLURpc3BsYXkgYWxsIGF2YWlsYWJsZSBoZWFkZXIgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgc3ltYm9sIHRhYmxlIGFuZAotcmVsb2NhdGlvbiBlbnRyaWVzLiAgVXNpbmcgQHNhbXB7LXh9IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhbGwgb2YKLUBzYW1wey1hIC1mIC1oIC1yIC10fS4KLQotQGl0ZW0gLXcKLUBpdGVteCAtLXdpZGUKLUBjaW5kZXggd2lkZSBvdXRwdXQsIHByaW50aW5nCi1Gb3JtYXQgc29tZSBsaW5lcyBmb3Igb3V0cHV0IGRldmljZXMgdGhhdCBoYXZlIG1vcmUgdGhhbiA4MCBjb2x1bW5zLgotQGVuZCB0YWJsZQotCi1Abm9kZSByYW5saWIKLUBjaGFwdGVyIHJhbmxpYgotCi1Aa2luZGV4IHJhbmxpYgotQGNpbmRleCBhcmNoaXZlIGNvbnRlbnRzCi1AY2luZGV4IHN5bWJvbCBpbmRleAotCi1Ac21hbGxleGFtcGxlCi1yYW5saWIgWy12Vl0gQHZhcnthcmNoaXZlfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7cmFubGlifSBnZW5lcmF0ZXMgYW4gaW5kZXggdG8gdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgYW5kCi1zdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCi1tZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKLQotWW91IG1heSB1c2UgQHNhbXB7bm0gLXN9IG9yIEBzYW1we25tIC0tcHJpbnQtYXJtYXB9IHRvIGxpc3QgdGhpcyBpbmRleC4KLQotQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnkgYW5kCi1hbGxvd3Mgcm91dGluZXMgaW4gdGhlIGxpYnJhcnkgdG8gY2FsbCBlYWNoIG90aGVyIHdpdGhvdXQgcmVnYXJkIHRvCi10aGVpciBwbGFjZW1lbnQgaW4gdGhlIGFyY2hpdmUuCi0KLVRoZSBAc2N7Z251fSBAY29kZXtyYW5saWJ9IHByb2dyYW0gaXMgYW5vdGhlciBmb3JtIG9mIEBzY3tnbnV9IEBjb2Rle2FyfTsgcnVubmluZwotQGNvZGV7cmFubGlifSBpcyBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8gZXhlY3V0aW5nIEBzYW1we2FyIC1zfS4KLUB4cmVme2FyfS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtdgotQGl0ZW14IC1WCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtyYW5saWJ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBzaXplCi1AY2hhcHRlciBzaXplCi0KLUBraW5kZXggc2l6ZQotQGNpbmRleCBzZWN0aW9uIHNpemVzCi0KLUBzbWFsbGV4YW1wbGUKLXNpemUgWyAtQSB8IC1CIHwgLS1mb3JtYXQ9QHZhcntjb21wYXRpYmlsaXR5fSBdCi0gICAgIFsgLS1oZWxwIF0gIFsgLWQgfCAtbyB8IC14IHwgLS1yYWRpeD1AdmFye251bWJlcn0gXQotICAgICBbIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXSAgWyAtViB8IC0tdmVyc2lvbiBdICAKLSAgICAgWyBAdmFye29iamZpbGV9QGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQHNje2dudX0gQGNvZGV7c2l6ZX0gdXRpbGl0eSBsaXN0cyB0aGUgc2VjdGlvbiBzaXplcy0tLWFuZCB0aGUgdG90YWwKLXNpemUtLS1mb3IgZWFjaCBvZiB0aGUgb2JqZWN0IG9yIGFyY2hpdmUgZmlsZXMgQHZhcntvYmpmaWxlfSBpbiBpdHMKLWFyZ3VtZW50IGxpc3QuICBCeSBkZWZhdWx0LCBvbmUgbGluZSBvZiBvdXRwdXQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoCi1vYmplY3QgZmlsZSBvciBlYWNoIG1vZHVsZSBpbiBhbiBhcmNoaXZlLgotCi1AdmFye29iamZpbGV9QGRvdHN7fSBhcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4KLUlmIG5vbmUgYXJlIHNwZWNpZmllZCwgdGhlIGZpbGUgQGNvZGV7YS5vdXR9IHdpbGwgYmUgdXNlZC4KLQotVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQQotQGl0ZW14IC1CCi1AaXRlbXggLS1mb3JtYXQ9QHZhcntjb21wYXRpYmlsaXR5fQotQGNpbmRleCBAY29kZXtzaXplfSBkaXNwbGF5IGZvcm1hdAotVXNpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgdGhlIG91dHB1dCBmcm9tIEBzY3tnbnV9Ci1AY29kZXtzaXplfSByZXNlbWJsZXMgb3V0cHV0IGZyb20gU3lzdGVtIFYgQGNvZGV7c2l6ZX0gKHVzaW5nIEBzYW1wey1BfSwKLW9yIEBzYW1wey0tZm9ybWF0PXN5c3Z9KSwgb3IgQmVya2VsZXkgQGNvZGV7c2l6ZX0gKHVzaW5nIEBzYW1wey1CfSwgb3IKLUBzYW1wey0tZm9ybWF0PWJlcmtlbGV5fSkuICBUaGUgZGVmYXVsdCBpcyB0aGUgb25lLWxpbmUgZm9ybWF0IHNpbWlsYXIgdG8KLUJlcmtlbGV5J3MuICAKLUBjIEJvbnVzIGZvciBkb2Mtc291cmNlIHJlYWRlcnM6IHlvdSBjYW4gYWxzbyBzYXkgLS1mb3JtYXQ9c3RyYW5nZSAob3IKLUBjIGFueXRoaW5nIGVsc2UgdGhhdCBzdGFydHMgd2l0aCAncycpIGZvciBzeXN2LCBhbmQgLS1mb3JtYXQ9Ym9yaW5nIChvcgotQGMgYW55dGhpbmcgZWxzZSB0aGF0IHN0YXJ0cyB3aXRoICdiJykgZm9yIEJlcmtlbGV5LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIEJlcmtlbGV5IChkZWZhdWx0KSBmb3JtYXQgb2Ygb3V0cHV0IGZyb20KLUBjb2Rle3NpemV9OiAKLUBzbWFsbGV4YW1wbGUKLXNpemUgLS1mb3JtYXQ9QmVya2VsZXkgcmFubGliIHNpemUKLXRleHQgICAgZGF0YSAgICBic3MgICAgIGRlYyAgICAgaGV4ICAgICBmaWxlbmFtZQotMjk0ODgwICA4MTkyMCAgIDExNTkyICAgMzg4MzkyICA1ZWQyOCAgIHJhbmxpYgotMjk0ODgwICA4MTkyMCAgIDExODg4ICAgMzg4Njg4ICA1ZWU1MCAgIHNpemUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBpcyB0aGUgc2FtZSBkYXRhLCBidXQgZGlzcGxheWVkIGNsb3NlciB0byBTeXN0ZW0gViBjb252ZW50aW9uczoKLQotQHNtYWxsZXhhbXBsZQotc2l6ZSAtLWZvcm1hdD1TeXNWIHJhbmxpYiBzaXplCi1yYW5saWIgIDoKLXNlY3Rpb24gICAgICAgICBzaXplICAgICAgICAgYWRkcgotLnRleHQgICAgICAgICAyOTQ4ODAgICAgICAgICA4MTkyICAgICAgIAotLmRhdGEgICAgICAgICAgODE5MjAgICAgICAgMzAzMTA0ICAgICAgIAotLmJzcyAgICAgICAgICAgMTE1OTIgICAgICAgMzg1MDI0ICAgICAgIAotVG90YWwgICAgICAgICAzODgzOTIgICAgCi0KLQotc2l6ZSAgOgotc2VjdGlvbiAgICAgICAgIHNpemUgICAgICAgICBhZGRyCi0udGV4dCAgICAgICAgIDI5NDg4MCAgICAgICAgIDgxOTIgICAgICAgCi0uZGF0YSAgICAgICAgICA4MTkyMCAgICAgICAzMDMxMDQgICAgICAgCi0uYnNzICAgICAgICAgICAxMTg4OCAgICAgICAzODUwMjQgICAgICAgCi1Ub3RhbCAgICAgICAgIDM4ODY4OCAgICAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIC0taGVscAotU2hvdyBhIHN1bW1hcnkgb2YgYWNjZXB0YWJsZSBhcmd1bWVudHMgYW5kIG9wdGlvbnMuCi0KLUBpdGVtIC1kCi1AaXRlbXggLW8KLUBpdGVteCAteAotQGl0ZW14IC0tcmFkaXg9QHZhcntudW1iZXJ9Ci1AY2luZGV4IEBjb2Rle3NpemV9IG51bWJlciBmb3JtYXQKLUBjaW5kZXggcmFkaXggZm9yIHNlY3Rpb24gc2l6ZXMKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgc2l6ZSBvZiBlYWNoCi1zZWN0aW9uIGlzIGdpdmVuIGluIGRlY2ltYWwgKEBzYW1wey1kfSwgb3IgQHNhbXB7LS1yYWRpeD0xMH0pOyBvY3RhbAotKEBzYW1wey1vfSwgb3IgQHNhbXB7LS1yYWRpeD04fSk7IG9yIGhleGFkZWNpbWFsIChAc2FtcHsteH0sIG9yCi1Ac2FtcHstLXJhZGl4PTE2fSkuICBJbiBAc2FtcHstLXJhZGl4PUB2YXJ7bnVtYmVyfX0sIG9ubHkgdGhlIHRocmVlCi12YWx1ZXMgKDgsIDEwLCAxNikgYXJlIHN1cHBvcnRlZC4gIFRoZSB0b3RhbCBzaXplIGlzIGFsd2F5cyBnaXZlbiBpbiB0d28KLXJhZGljZXM7IGRlY2ltYWwgYW5kIGhleGFkZWNpbWFsIGZvciBAc2FtcHstZH0gb3IgQHNhbXB7LXh9IG91dHB1dCwgb3IKLW9jdGFsIGFuZCBoZXhhZGVjaW1hbCBpZiB5b3UncmUgdXNpbmcgQHNhbXB7LW99LgotCi1AaXRlbSAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1AY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAotU3BlY2lmeSB0aGF0IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIEB2YXJ7b2JqZmlsZX0gaXMKLUB2YXJ7YmZkbmFtZX0uICBUaGlzIG9wdGlvbiBtYXkgbm90IGJlIG5lY2Vzc2FyeTsgQGNvZGV7c2l6ZX0gY2FuCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtzaXplfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgc3RyaW5ncwotQGNoYXB0ZXIgc3RyaW5ncwotQGtpbmRleCBzdHJpbmdzCi1AY2luZGV4IGxpc3RpbmdzIHN0cmluZ3MKLUBjaW5kZXggcHJpbnRpbmcgc3RyaW5ncwotQGNpbmRleCBzdHJpbmdzLCBwcmludGluZwotCi1Ac21hbGxleGFtcGxlCi1zdHJpbmdzIFstYWZvdl0gWy1AdmFye21pbi1sZW59XSBbLW4gQHZhcnttaW4tbGVufV0gWy10IEB2YXJ7cmFkaXh9XSBbLV0KLSAgICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPUB2YXJ7bWluLWxlbn1dCi0gICAgICAgIFstLXJhZGl4PUB2YXJ7cmFkaXh9XSBbLS10YXJnZXQ9QHZhcntiZmRuYW1lfV0KLSAgICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl0gQHZhcntmaWxlfUBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLUZvciBlYWNoIEB2YXJ7ZmlsZX0gZ2l2ZW4sIEBzY3tnbnV9IEBjb2Rle3N0cmluZ3N9IHByaW50cyB0aGUgcHJpbnRhYmxlCi1jaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIGF0IGxlYXN0IDQgY2hhcmFjdGVycyBsb25nIChvciB0aGUgbnVtYmVyCi1naXZlbiB3aXRoIHRoZSBvcHRpb25zIGJlbG93KSBhbmQgYXJlIGZvbGxvd2VkIGJ5IGFuIHVucHJpbnRhYmxlCi1jaGFyYWN0ZXIuICBCeSBkZWZhdWx0LCBpdCBvbmx5IHByaW50cyB0aGUgc3RyaW5ncyBmcm9tIHRoZSBpbml0aWFsaXplZAotYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7IGZvciBvdGhlciB0eXBlcyBvZiBmaWxlcywgaXQgcHJpbnRzCi10aGUgc3RyaW5ncyBmcm9tIHRoZSB3aG9sZSBmaWxlLgotCi1AY29kZXtzdHJpbmdzfSBpcyBtYWlubHkgdXNlZnVsIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudHMgb2Ygbm9uLXRleHQKLWZpbGVzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hCi1AaXRlbXggLS1hbGwKLUBpdGVteCAtCi1EbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsKLXNjYW4gdGhlIHdob2xlIGZpbGVzLgotCi1AaXRlbSAtZgotQGl0ZW14IC0tcHJpbnQtZmlsZS1uYW1lCi1QcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwcm9ncmFtIHVzYWdlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi0KLUBpdGVtIC1AdmFye21pbi1sZW59Ci1AaXRlbXggLW4gQHZhcnttaW4tbGVufQotQGl0ZW14IC0tYnl0ZXM9QHZhcnttaW4tbGVufQotUHJpbnQgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYXQgbGVhc3QgQHZhcnttaW4tbGVufSBjaGFyYWN0ZXJzCi1sb25nLCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDQuCi0KLUBpdGVtIC1vCi1MaWtlIEBzYW1wey10IG99LiAgU29tZSBvdGhlciB2ZXJzaW9ucyBvZiBAY29kZXtzdHJpbmdzfSBoYXZlIEBzYW1wey1vfQotYWN0IGxpa2UgQHNhbXB7LXQgZH0gaW5zdGVhZC4gIFNpbmNlIHdlIGNhbiBub3QgYmUgY29tcGF0aWJsZSB3aXRoIGJvdGgKLXdheXMsIHdlIHNpbXBseSBjaG9zZSBvbmUuCi0KLUBpdGVtIC10IEB2YXJ7cmFkaXh9Ci1AaXRlbXggLS1yYWRpeD1AdmFye3JhZGl4fQotUHJpbnQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiAgVGhlIHNpbmdsZQotY2hhcmFjdGVyIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmFkaXggb2YgdGhlIG9mZnNldC0tLUBzYW1we299IGZvcgotb2N0YWwsIEBzYW1we3h9IGZvciBoZXhhZGVjaW1hbCwgb3IgQHNhbXB7ZH0gZm9yIGRlY2ltYWwuCi0KLUBpdGVtIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IGFuIG9iamVjdCBjb2RlIGZvcm1hdCBvdGhlciB0aGFuIHlvdXIgc3lzdGVtJ3MgZGVmYXVsdCBmb3JtYXQuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1QcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlciBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBzdHJpcAotQGNoYXB0ZXIgc3RyaXAKLQotQGtpbmRleCBzdHJpcAotQGNpbmRleCByZW1vdmluZyBzeW1ib2xzCi1AY2luZGV4IGRpc2NhcmRpbmcgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCBkaXNjYXJkaW5nCi0KLUBzbWFsbGV4YW1wbGUKLXN0cmlwIFsgLUYgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgWyAtSSBAdmFye2JmZG5hbWV9IHwgLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICBbIC1PIEB2YXJ7YmZkbmFtZX0gfCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICBbIC1zIHwgLS1zdHJpcC1hbGwgXSBbIC1TIHwgLWcgfCAtLXN0cmlwLWRlYnVnIF0KLSAgICAgIFsgLUsgQHZhcntzeW1ib2xuYW1lfSB8IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICBbIC1OIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgIFsgLXggfCAtLWRpc2NhcmQtYWxsIF0gWyAtWCB8IC0tZGlzY2FyZC1sb2NhbHMgXQotICAgICAgWyAtUiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQotICAgICAgWyAtbyBAdmFye2ZpbGV9IF0gWyAtcCB8IC0tcHJlc2VydmUtZGF0ZXMgXQotICAgICAgWyAtdiB8IC0tdmVyYm9zZSBdICBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0KLSAgICAgIEB2YXJ7b2JqZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ac2N7Z251fSBAY29kZXtzdHJpcH0gZGlzY2FyZHMgYWxsIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLUB2YXJ7b2JqZmlsZX0uICBUaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgbWF5IGluY2x1ZGUgYXJjaGl2ZXMuCi1BdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUgbXVzdCBiZSBnaXZlbi4KLQotQGNvZGV7c3RyaXB9IG1vZGlmaWVzIHRoZSBmaWxlcyBuYW1lZCBpbiBpdHMgYXJndW1lbnQsCi1yYXRoZXIgdGhhbiB3cml0aW5nIG1vZGlmaWVkIGNvcGllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUYgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVRyZWF0IHRoZSBvcmlnaW5hbCBAdmFye29iamZpbGV9IGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IEB2YXJ7YmZkbmFtZX0sIGFuZCByZXdyaXRlIGl0IGluIHRoZSBzYW1lIGZvcm1hdC4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLS1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtzdHJpcH0gYW5kIGV4aXQuCi0KLUBpdGVtIC1JIEB2YXJ7YmZkbmFtZX0JCi1AaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotVHJlYXQgdGhlIG9yaWdpbmFsIEB2YXJ7b2JqZmlsZX0gYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAotY29kZSBmb3JtYXQgQHZhcntiZmRuYW1lfS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLU8gQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1SZXBsYWNlIEB2YXJ7b2JqZmlsZX0gd2l0aCBhIGZpbGUgaW4gdGhlIG91dHB1dCBmb3JtYXQgQHZhcntiZmRuYW1lfS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLVIgQHZhcntzZWN0aW9ubmFtZX0KLUBpdGVteCAtLXJlbW92ZS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9Ci1SZW1vdmUgYW55IHNlY3Rpb24gbmFtZWQgQHZhcntzZWN0aW9ubmFtZX0gZnJvbSB0aGUgb3V0cHV0IGZpbGUuICBUaGlzCi1vcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uCi1pbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dCBmaWxlIHVudXNhYmxlLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tc3RyaXAtYWxsCi1SZW1vdmUgYWxsIHN5bWJvbHMuCi0KLUBpdGVtIC1nCi1AaXRlbXggLVMKLUBpdGVteCAtLXN0cmlwLWRlYnVnCi1SZW1vdmUgZGVidWdnaW5nIHN5bWJvbHMgb25seS4KLQotQGl0ZW0gLS1zdHJpcC11bm5lZWRlZAotUmVtb3ZlIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KLQotQGl0ZW0gLUsgQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotS2VlcCBvbmx5IHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGZyb20gdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBvcHRpb24gbWF5Ci1iZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLU4gQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLVJlbW92ZSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24gbWF5IGJlCi1naXZlbiBtb3JlIHRoYW4gb25jZSwgYW5kIG1heSBiZSBjb21iaW5lZCB3aXRoIHN0cmlwIG9wdGlvbnMgb3RoZXIgdGhhbgotQGNvZGV7LUt9LgotCi1AaXRlbSAtbyBAdmFye2ZpbGV9Ci1QdXQgdGhlIHN0cmlwcGVkIG91dHB1dCBpbiBAdmFye2ZpbGV9LCByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlCi1leGlzdGluZyBmaWxlLiAgV2hlbiB0aGlzIGFyZ3VtZW50IGlzIHVzZWQsIG9ubHkgb25lIEB2YXJ7b2JqZmlsZX0KLWFyZ3VtZW50IG1heSBiZSBzcGVjaWZpZWQuCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmVzZXJ2ZS1kYXRlcwotUHJlc2VydmUgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBmaWxlLgotCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLVJlbW92ZSBub24tZ2xvYmFsIHN5bWJvbHMuCi0KLUBpdGVtIC1YCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotUmVtb3ZlIGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLgotKFRoZXNlIHVzdWFsbHkgc3RhcnQgd2l0aCBAc2FtcHtMfSBvciBAc2FtcHsufS4pCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7c3RyaXB9LgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyYm9zZQotVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCi1hcmNoaXZlcywgQHNhbXB7c3RyaXAgLXZ9IGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBjKytmaWx0Ci1AY2hhcHRlciBjKytmaWx0Ci0KLUBraW5kZXggYysrZmlsdAotQGNpbmRleCBkZW1hbmdsaW5nIEMrKyBzeW1ib2xzCi0KLUBzbWFsbGV4YW1wbGUKLWMrK2ZpbHQgWyAtXyB8IC0tc3RyaXAtdW5kZXJzY29yZXMgXQotICAgICAgICBbIC1qIHwgLS1qYXZhIF0KLQlbIC1uIHwgLS1uby1zdHJpcC11bmRlcnNjb3JlcyBdCi0gICAgICAgIFsgLXMgQHZhcntmb3JtYXR9IHwgLS1mb3JtYXQ9QHZhcntmb3JtYXR9IF0KLSAgICAgICAgWyAtLWhlbHAgXSAgWyAtLXZlcnNpb24gXSAgWyBAdmFye3N5bWJvbH1AZG90c3t9IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBDKysgYW5kIEphdmEgbGFuZ3VhZ2VzIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucwotdGhhdCB5b3UgY2FuIHdyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2gKLXRha2VzIHBhcmFtZXRlcnMgb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgYW5kIEphdmEgZnVuY3Rpb24gbmFtZXMKLWFyZSBlbmNvZGVkIGludG8gYSBsb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcwotQGRmbnttYW5nbGluZ30pLiBUaGUgQGNvZGV7YysrZmlsdH0gcHJvZ3JhbSBkb2VzIHRoZSBpbnZlcnNlIG1hcHBpbmc6IGl0Ci1kZWNvZGVzIChAZGZue2RlbWFuZ2xlc30pIGxvdy1sZXZlbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMgc28gdGhhdAotdGhlIGxpbmtlciBjYW4ga2VlcCB0aGVzZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBmcm9tIGNsYXNoaW5nLgotCi1FdmVyeSBhbHBoYW51bWVyaWMgd29yZCAoY29uc2lzdGluZyBvZiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLAotZG9sbGFycywgb3IgcGVyaW9kcykgc2VlbiBpbiB0aGUgaW5wdXQgaXMgYSBwb3RlbnRpYWwgbGFiZWwuICBJZiB0aGUKLWxhYmVsIGRlY29kZXMgaW50byBhIEMrKyBuYW1lLCB0aGUgQysrIG5hbWUgcmVwbGFjZXMgdGhlIGxvdy1sZXZlbAotbmFtZSBpbiB0aGUgb3V0cHV0LgotCi1Zb3UgY2FuIHVzZSBAY29kZXtjKytmaWx0fSB0byBkZWNpcGhlciBpbmRpdmlkdWFsIHN5bWJvbHM6Ci0KLUBleGFtcGxlCi1jKytmaWx0IEB2YXJ7c3ltYm9sfQotQGVuZCBleGFtcGxlCi0KLUlmIG5vIEB2YXJ7c3ltYm9sfSBhcmd1bWVudHMgYXJlIGdpdmVuLCBAY29kZXtjKytmaWx0fSByZWFkcyBzeW1ib2wKLW5hbWVzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZXMgdGhlIGRlbWFuZ2xlZCBuYW1lcyB0byB0aGUKLXN0YW5kYXJkIG91dHB1dC4gIEFsbCByZXN1bHRzIGFyZSBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLV8KLUBpdGVteCAtLXN0cmlwLXVuZGVyc2NvcmVzCi1PbiBzb21lIHN5c3RlbXMsIGJvdGggdGhlIEMgYW5kIEMrKyBjb21waWxlcnMgcHV0IGFuIHVuZGVyc2NvcmUgaW4gZnJvbnQKLW9mIGV2ZXJ5IG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlIEMgbmFtZSBAY29kZXtmb299IGdldHMgdGhlIGxvdy1sZXZlbAotbmFtZSBAY29kZXtfZm9vfS4gIFRoaXMgb3B0aW9uIHJlbW92ZXMgdGhlIGluaXRpYWwgdW5kZXJzY29yZS4gIFdoZXRoZXIKLUBjb2Rle2MrK2ZpbHR9IHJlbW92ZXMgdGhlIHVuZGVyc2NvcmUgYnkgZGVmYXVsdCBpcyB0YXJnZXQgZGVwZW5kZW50LgotCi1AaXRlbSAtagotQGl0ZW14IC0tamF2YQotUHJpbnRzIGRlbWFuZ2xlZCBuYW1lcyB1c2luZyBKYXZhIHN5bnRheC4gIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSBDKysKLXN5bnRheC4KLQotQGl0ZW0gLW4KLUBpdGVteCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzCi1EbyBub3QgcmVtb3ZlIHRoZSBpbml0aWFsIHVuZGVyc2NvcmUuCi0KLUBpdGVtIC1zIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQHNje2dudX0gQGNvZGV7bm19IGNhbiBkZWNvZGUgdGhyZWUgZGlmZmVyZW50IG1ldGhvZHMgb2YgbWFuZ2xpbmcsIHVzZWQgYnkKLWRpZmZlcmVudCBDKysgY29tcGlsZXJzLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMgb3B0aW9uIHNlbGVjdHMgd2hpY2gKLW1ldGhvZCBpdCB1c2VzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGdudQotdGhlIG9uZSB1c2VkIGJ5IHRoZSBAc2N7Z251fSBjb21waWxlciAodGhlIGRlZmF1bHQgbWV0aG9kKQotQGl0ZW0gbHVjaWQKLXRoZSBvbmUgdXNlZCBieSB0aGUgTHVjaWQgY29tcGlsZXIKLUBpdGVtIGFybQotdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIEMrKyBBbm5vdGF0ZWQgUmVmZXJlbmNlIE1hbnVhbAotQGl0ZW0gaHAKLXRoZSBvbmUgdXNlZCBieSB0aGUgSFAgY29tcGlsZXIKLUBpdGVtIGVkZwotdGhlIG9uZSB1c2VkIGJ5IHRoZSBFREcgY29tcGlsZXIKLUBlbmQgdGFibGUKLQotQGl0ZW0gLS1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7YysrZmlsdH0gYW5kIGV4aXQuCi0KLUBpdGVtIC0tdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle2MrK2ZpbHR9IGFuZCBleGl0LgotQGVuZCB0YWJsZQotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gQGNvZGV7YysrZmlsdH0gaXMgYSBuZXcgdXRpbGl0eSwgYW5kIHRoZSBkZXRhaWxzIG9mIGl0cwotdXNlciBpbnRlcmZhY2UgYXJlIHN1YmplY3QgdG8gY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIEluIHBhcnRpY3VsYXIsCi1hIGNvbW1hbmQtbGluZSBvcHRpb24gbWF5IGJlIHJlcXVpcmVkIGluIHRoZSB0aGUgZnV0dXJlIHRvIGRlY29kZSBhIG5hbWUKLXBhc3NlZCBhcyBhbiBhcmd1bWVudCBvbiB0aGUgY29tbWFuZCBsaW5lOyBpbiBvdGhlciB3b3JkcywgCi0KLUBleGFtcGxlCi1jKytmaWx0IEB2YXJ7c3ltYm9sfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotbWF5IGluIGEgZnV0dXJlIHJlbGVhc2UgYmVjb21lCi0KLUBleGFtcGxlCi1jKytmaWx0IEB2YXJ7b3B0aW9ufSBAdmFye3N5bWJvbH0KLUBlbmQgZXhhbXBsZQotQGVuZCBxdW90YXRpb24KLQotQG5vZGUgYWRkcjJsaW5lCi1AY2hhcHRlciBhZGRyMmxpbmUKLQotQGtpbmRleCBhZGRyMmxpbmUKLUBjaW5kZXggYWRkcmVzcyB0byBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCi0KLUBzbWFsbGV4YW1wbGUKLWFkZHIybGluZSBbIC1iIEB2YXJ7YmZkbmFtZX0gfCAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgICBbIC1DIHwgLS1kZW1hbmdsZSBdCi0gICAgICAgICAgWyAtZSBAdmFye2ZpbGVuYW1lfSB8IC0tZXhlPUB2YXJ7ZmlsZW5hbWV9IF0KLSAgICAgICAgICBbIC1mIHwgLS1mdW5jdGlvbnMgXSBbIC1zIHwgLS1iYXNlbmFtZSBdCi0gICAgICAgICAgWyAtSCB8IC0taGVscCBdIFsgLVYgfCAtLXZlcnNpb24gXQotICAgICAgICAgIFsgYWRkciBhZGRyIC4uLiBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXthZGRyMmxpbmV9IHRyYW5zbGF0ZXMgcHJvZ3JhbSBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lCi1udW1iZXJzLiAgR2l2ZW4gYW4gYWRkcmVzcyBhbmQgYW4gZXhlY3V0YWJsZSwgaXQgdXNlcyB0aGUgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBpbiB0aGUgZXhlY3V0YWJsZSB0byBmaWd1cmUgb3V0IHdoaWNoIGZpbGUgbmFtZSBhbmQgbGluZQotbnVtYmVyIGFyZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBhZGRyZXNzLgotCi1UaGUgZXhlY3V0YWJsZSB0byB1c2UgaXMgc3BlY2lmaWVkIHdpdGggdGhlIEBjb2Rley1lfSBvcHRpb24uICBUaGUKLWRlZmF1bHQgaXMgQGZpbGV7YS5vdXR9LgotCi1AY29kZXthZGRyMmxpbmV9IGhhcyB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uLgotCi1JbiB0aGUgZmlyc3QsIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCi1hbmQgQGNvZGV7YWRkcjJsaW5lfSBkaXNwbGF5cyB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgZWFjaAotYWRkcmVzcy4KLQotSW4gdGhlIHNlY29uZCwgQGNvZGV7YWRkcjJsaW5lfSByZWFkcyBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbQotc3RhbmRhcmQgaW5wdXQsIGFuZCBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2gKLWFkZHJlc3Mgb24gc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcyBtb2RlLCBAY29kZXthZGRyMmxpbmV9IG1heSBiZSB1c2VkCi1pbiBhIHBpcGUgdG8gY29udmVydCBkeW5hbWljYWxseSBjaG9zZW4gYWRkcmVzc2VzLgotCi1UaGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgaXMgQHNhbXB7RklMRU5BTUU6TElORU5PfS4gIFRoZSBmaWxlIG5hbWUgYW5kCi1saW5lIG51bWJlciBmb3IgZWFjaCBhZGRyZXNzIGlzIHByaW50ZWQgb24gYSBzZXBhcmF0ZSBsaW5lLiAgSWYgdGhlCi1AY29kZXstZn0gb3B0aW9uIGlzIHVzZWQsIHRoZW4gZWFjaCBAc2FtcHtGSUxFTkFNRTpMSU5FTk99IGxpbmUgaXMKLXByZWNlZGVkIGJ5IGEgQHNhbXB7RlVOQ1RJT05OQU1FfSBsaW5lIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgotY29udGFpbmluZyB0aGUgYWRkcmVzcy4KLQotSWYgdGhlIGZpbGUgbmFtZSBvciBmdW5jdGlvbiBuYW1lIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwKLUBjb2Rle2FkZHIybGluZX0gd2lsbCBwcmludCB0d28gcXVlc3Rpb24gbWFya3MgaW4gdGhlaXIgcGxhY2UuICBJZiB0aGUKLWxpbmUgbnVtYmVyIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwgQGNvZGV7YWRkcjJsaW5lfSB3aWxsIHByaW50IDAuCi0KLVRoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCi1lcXVpdmFsZW50LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1iIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1AY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAotU3BlY2lmeSB0aGF0IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgaXMKLUB2YXJ7YmZkbmFtZX0uCi0KLUBpdGVtIC1DCi1AaXRlbXggLS1kZW1hbmdsZQotQGNpbmRleCBkZW1hbmdsaW5nIGluIG9iamR1bXAKLURlY29kZSAoQGRmbntkZW1hbmdsZX0pIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuICBAeHJlZntjKytmaWx0fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIGRlbWFuZ2xpbmcuCi0KLUBpdGVtIC1lIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1leGU9QHZhcntmaWxlbmFtZX0KLVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZm9yIHdoaWNoIGFkZHJlc3NlcyBzaG91bGQgYmUKLXRyYW5zbGF0ZWQuICBUaGUgZGVmYXVsdCBmaWxlIGlzIEBmaWxle2Eub3V0fS4KLQotQGl0ZW0gLWYKLUBpdGVteCAtLWZ1bmN0aW9ucwotRGlzcGxheSBmdW5jdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tYmFzZW5hbWVzCi1EaXNwbGF5IG9ubHkgdGhlIGJhc2Ugb2YgZWFjaCBmaWxlIG5hbWUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIG5sbWNvbnYKLUBjaGFwdGVyIG5sbWNvbnYKLQotQGNvZGV7bmxtY29udn0gY29udmVydHMgYSByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSBpbnRvIGEgTmV0V2FyZQotTG9hZGFibGUgTW9kdWxlLgotCi1AaWdub3JlCi1AY29kZXtubG1jb252fSBjdXJyZW50bHkgd29ya3Mgd2l0aCBAc2FtcHtpMzg2fSBvYmplY3QKLWZpbGVzIGluIEBjb2Rle2NvZmZ9LCBAc2N7ZWxmfSwgb3IgQGNvZGV7YS5vdXR9IGZvcm1hdCwgYW5kIEBzY3tTUEFSQ30KLW9iamVjdCBmaWxlcyBpbiBAc2N7ZWxmfSwgb3IgQGNvZGV7YS5vdXR9IGZvcm1hdEBmb290bm90ZXsKLUBjb2Rle25sbWNvbnZ9IHNob3VsZCB3b3JrIHdpdGggYW55IEBzYW1we2kzODZ9IG9yIEBzY3tzcGFyY30gb2JqZWN0Ci1mb3JtYXQgaW4gdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4gIEl0IGhhcyBvbmx5IGJlZW4gdGVzdGVkCi13aXRoIHRoZSBhYm92ZSBmb3JtYXRzLn0uCi1AZW5kIGlnbm9yZQotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gQGNvZGV7bmxtY29udn0gaXMgbm90IGFsd2F5cyBidWlsdCBhcyBwYXJ0IG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcywgc2luY2UgaXQgaXMgb25seSB1c2VmdWwgZm9yIE5MTSB0YXJnZXRzLgotQGVuZCBxdW90YXRpb24KLQotQHNtYWxsZXhhbXBsZQotbmxtY29udiBbIC1JIEB2YXJ7YmZkbmFtZX0gfCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtTyBAdmFye2JmZG5hbWV9IHwgLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1UIEB2YXJ7aGVhZGVyZmlsZX0gfCAtLWhlYWRlci1maWxlPUB2YXJ7aGVhZGVyZmlsZX0gXQotICAgICAgICBbIC1kIHwgLS1kZWJ1Z10gIFsgLWwgQHZhcntsaW5rZXJ9IHwgLS1saW5rZXI9QHZhcntsaW5rZXJ9IF0KLSAgICAgICAgWyAtaCB8IC0taGVscCBdICBbIC1WIHwgLS12ZXJzaW9uIF0KLSAgICAgICAgQHZhcntpbmZpbGV9IEB2YXJ7b3V0ZmlsZX0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle25sbWNvbnZ9IGNvbnZlcnRzIHRoZSByZWxvY2F0YWJsZSBAc2FtcHtpMzg2fSBvYmplY3QgZmlsZQotQHZhcntpbmZpbGV9IGludG8gdGhlIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlIEB2YXJ7b3V0ZmlsZX0sIG9wdGlvbmFsbHkKLXJlYWRpbmcgQHZhcntoZWFkZXJmaWxlfSBmb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMKLW9uIHdyaXRpbmcgdGhlIE5MTSBjb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZSB0aGUKLUBzYW1we2xpbmtlcnN9IHNlY3Rpb24sIEBzYW1we05MTUxJTkt9IGluIHBhcnRpY3VsYXIsIG9mIHRoZSBAY2l0ZXtOTE0KLURldmVsb3BtZW50IGFuZCBUb29scyBPdmVydmlld30sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIE5MTSBTb2Z0d2FyZQotRGV2ZWxvcGVyJ3MgS2l0IChgYE5MTSBTREsnJyksIGF2YWlsYWJsZSBmcm9tIE5vdmVsbCwgSW5jLgotQGNvZGV7bmxtY29udn0gdXNlcyB0aGUgQHNje2dudX0gQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5IHRvIHJlYWQKLUB2YXJ7aW5maWxlfTsgc2VlIEByZWZ7QkZELCxCRkQsbGQuaW5mbyxVc2luZyBMRH0sIGZvcgotbW9yZSBpbmZvcm1hdGlvbi4KLQotQGNvZGV7bmxtY29udn0gY2FuIHBlcmZvcm0gYSBsaW5rIHN0ZXAuICBJbiBvdGhlciB3b3JkcywgeW91IGNhbiBsaXN0Ci1tb3JlIHRoYW4gb25lIG9iamVjdCBmaWxlIGZvciBpbnB1dCBpZiB5b3UgbGlzdCB0aGVtIGluIHRoZSBkZWZpbml0aW9ucwotZmlsZSAocmF0aGVyIHRoYW4gc2ltcGx5IHNwZWNpZnlpbmcgb25lIGlucHV0IGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSkuCi1JbiB0aGlzIGNhc2UsIEBjb2Rle25sbWNvbnZ9IGNhbGxzIHRoZSBsaW5rZXIgZm9yIHlvdS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtSSBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotT2JqZWN0IGZvcm1hdCBvZiB0aGUgaW5wdXQgZmlsZS4gIEBjb2Rle25sbWNvbnZ9IGNhbiB1c3VhbGx5IGRldGVybWluZQotdGhlIGZvcm1hdCBvZiBhIGdpdmVuIGZpbGUgKHNvIG5vIGRlZmF1bHQgaXMgbmVjZXNzYXJ5KS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLU8gQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1PYmplY3QgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZS4gIEBjb2Rle25sbWNvbnZ9IGluZmVycyB0aGUgb3V0cHV0Ci1mb3JtYXQgYmFzZWQgb24gdGhlIGlucHV0IGZvcm1hdCwgZS5nLiBmb3IgYSBAc2FtcHtpMzg2fSBpbnB1dCBmaWxlIHRoZQotb3V0cHV0IGZvcm1hdCBpcyBAc2FtcHtubG0zMi1pMzg2fS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLVQgQHZhcntoZWFkZXJmaWxlfQotQGl0ZW14IC0taGVhZGVyLWZpbGU9QHZhcntoZWFkZXJmaWxlfQotUmVhZHMgQHZhcntoZWFkZXJmaWxlfSBmb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMgb24KLXdyaXRpbmcgdGhlIE5MTSBjb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZUAgc2VlIHRoZQotQHNhbXB7bGlua2Vyc30gc2VjdGlvbiwgb2YgdGhlIEBjaXRle05MTSBEZXZlbG9wbWVudCBhbmQgVG9vbHMKLU92ZXJ2aWV3fSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgTkxNIFNvZnR3YXJlIERldmVsb3BlcidzIEtpdCwgYXZhaWxhYmxlCi1mcm9tIE5vdmVsbCwgSW5jLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZGVidWcKLURpc3BsYXlzIChvbiBzdGFuZGFyZCBlcnJvcikgdGhlIGxpbmtlciBjb21tYW5kIGxpbmUgdXNlZCBieSBAY29kZXtubG1jb252fS4KLQotQGl0ZW0gLWwgQHZhcntsaW5rZXJ9Ci1AaXRlbXggLS1saW5rZXI9QHZhcntsaW5rZXJ9Ci1Vc2UgQHZhcntsaW5rZXJ9IGZvciBhbnkgbGlua2luZy4gIEB2YXJ7bGlua2VyfSBjYW4gYmUgYW4gYWJzb2x1dGUgb3IgYQotcmVsYXRpdmUgcGF0aG5hbWUuCi0KLUBpdGVtIC1oCi1AaXRlbXggLS1oZWxwCi1QcmludHMgYSB1c2FnZSBzdW1tYXJ5LgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7bmxtY29udn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIHdpbmRyZXMKLUBjaGFwdGVyIHdpbmRyZXMKLQotQGNvZGV7d2luZHJlc30gbWF5IGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBXaW5kb3dzIHJlc291cmNlcy4KLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle3dpbmRyZXN9IGlzIG5vdCBhbHdheXMgYnVpbHQgYXMgcGFydCBvZiB0aGUgYmluYXJ5Ci11dGlsaXRpZXMsIHNpbmNlIGl0IGlzIG9ubHkgdXNlZnVsIGZvciBXaW5kb3dzIHRhcmdldHMuCi1AZW5kIHF1b3RhdGlvbgotCi1Ac21hbGxleGFtcGxlCi13aW5kcmVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7d2luZHJlc30gcmVhZHMgcmVzb3VyY2VzIGZyb20gYW4gaW5wdXQgZmlsZSBhbmQgY29waWVzIHRoZW0gaW50bwotYW4gb3V0cHV0IGZpbGUuICBFaXRoZXIgZmlsZSBtYXkgYmUgaW4gb25lIG9mIHRocmVlIGZvcm1hdHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcmMKLUEgdGV4dCBmb3JtYXQgcmVhZCBieSB0aGUgUmVzb3VyY2UgQ29tcGlsZXIuCi0KLUBpdGVtIHJlcwotQSBiaW5hcnkgZm9ybWF0IGdlbmVyYXRlZCBieSB0aGUgUmVzb3VyY2UgQ29tcGlsZXIuCi0KLUBpdGVtIGNvZmYKLUEgQ09GRiBvYmplY3Qgb3IgZXhlY3V0YWJsZS4KLUBlbmQgdGFibGUKLQotVGhlIGV4YWN0IGRlc2NyaXB0aW9uIG9mIHRoZXNlIGRpZmZlcmVudCBmb3JtYXRzIGlzIGF2YWlsYWJsZSBpbgotZG9jdW1lbnRhdGlvbiBmcm9tIE1pY3Jvc29mdC4KLQotV2hlbiBAY29kZXt3aW5kcmVzfSBjb252ZXJ0cyBmcm9tIHRoZSBAY29kZXtyY30gZm9ybWF0IHRvIHRoZSBAY29kZXtyZXN9Ci1mb3JtYXQsIGl0IGlzIGFjdGluZyBsaWtlIHRoZSBXaW5kb3dzIFJlc291cmNlIENvbXBpbGVyLiAgV2hlbgotQGNvZGV7d2luZHJlc30gY29udmVydHMgZnJvbSB0aGUgQGNvZGV7cmVzfSBmb3JtYXQgdG8gdGhlIEBjb2Rle2NvZmZ9Ci1mb3JtYXQsIGl0IGlzIGFjdGluZyBsaWtlIHRoZSBXaW5kb3dzIEBjb2Rle0NWVFJFU30gcHJvZ3JhbS4KLQotV2hlbiBAY29kZXt3aW5kcmVzfSBnZW5lcmF0ZXMgYW4gQGNvZGV7cmN9IGZpbGUsIHRoZSBvdXRwdXQgaXMgc2ltaWxhcgotYnV0IG5vdCBpZGVudGljYWwgdG8gdGhlIGZvcm1hdCBleHBlY3RlZCBmb3IgdGhlIGlucHV0LiAgV2hlbiBhbiBpbnB1dAotQGNvZGV7cmN9IGZpbGUgcmVmZXJzIHRvIGFuIGV4dGVybmFsIGZpbGVuYW1lLCBhbiBvdXRwdXQgQGNvZGV7cmN9IGZpbGUKLXdpbGwgaW5zdGVhZCBpbmNsdWRlIHRoZSBmaWxlIGNvbnRlbnRzLgotCi1JZiB0aGUgaW5wdXQgb3Igb3V0cHV0IGZvcm1hdCBpcyBub3Qgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsCi1ndWVzcyBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lLCBvciwgZm9yIHRoZSBpbnB1dCBmaWxlLCB0aGUgZmlsZSBjb250ZW50cy4KLUEgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsucmN9IHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBAY29kZXtyY30KLWZpbGUsIGEgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsucmVzfSB3aWxsIGJlIHRyZWF0ZWQgYXMgYQotQGNvZGV7cmVzfSBmaWxlLCBhbmQgYSBmaWxlIHdpdGggYW4gZXh0ZW5zaW9uIG9mIEBmaWxley5vfSBvcgotQGZpbGV7LmV4ZX0gd2lsbCBiZSB0cmVhdGVkIGFzIGEgQGNvZGV7Y29mZn0gZmlsZS4KLQotSWYgbm8gb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsIHByaW50IHRoZSByZXNvdXJjZXMKLWluIEBjb2Rle3JjfSBmb3JtYXQgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi1UaGUgbm9ybWFsIHVzZSBpcyBmb3IgeW91IHRvIHdyaXRlIGFuIEBjb2Rle3JjfSBmaWxlLCB1c2UgQGNvZGV7d2luZHJlc30KLXRvIGNvbnZlcnQgaXQgdG8gYSBDT0ZGIG9iamVjdCBmaWxlLCBhbmQgdGhlbiBsaW5rIHRoZSBDT0ZGIGZpbGUgaW50bwoteW91ciBhcHBsaWNhdGlvbi4gIFRoaXMgd2lsbCBtYWtlIHRoZSByZXNvdXJjZXMgZGVzY3JpYmVkIGluIHRoZQotQGNvZGV7cmN9IGZpbGUgYXZhaWxhYmxlIHRvIFdpbmRvd3MuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWkgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWlucHV0IEB2YXJ7ZmlsZW5hbWV9Ci1UaGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGVuCi1AY29kZXt3aW5kcmVzfSB3aWxsIHVzZSB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudCBhcyB0aGUgaW5wdXQgZmlsZQotbmFtZS4gIElmIHRoZXJlIGFyZSBubyBub24tb3B0aW9uIGFyZ3VtZW50cywgdGhlbiBAY29kZXt3aW5kcmVzfSB3aWxsCi1yZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuICBAY29kZXt3aW5kcmVzfSBjYW4gbm90IHJlYWQgYSBDT0ZGIGZpbGUgZnJvbQotc3RhbmRhcmQgaW5wdXQuCi0KLUBpdGVtIC1vIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQgQHZhcntmaWxlbmFtZX0KLVRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGVuCi1AY29kZXt3aW5kcmVzfSB3aWxsIHVzZSB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudCwgYWZ0ZXIgYW55IHVzZWQKLWZvciB0aGUgaW5wdXQgZmlsZSBuYW1lLCBhcyB0aGUgb3V0cHV0IGZpbGUgbmFtZS4gIElmIHRoZXJlIGlzIG5vCi1ub24tb3B0aW9uIGFyZ3VtZW50LCB0aGVuIEBjb2Rle3dpbmRyZXN9IHdpbGwgd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0LgotQGNvZGV7d2luZHJlc30gY2FuIG5vdCB3cml0ZSBhIENPRkYgZmlsZSB0byBzdGFuZGFyZCBvdXRwdXQuCi0KLUBpdGVtIC1JIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0taW5wdXQtZm9ybWF0IEB2YXJ7Zm9ybWF0fQotVGhlIGlucHV0IGZvcm1hdCB0byByZWFkLiAgQHZhcntmb3JtYXR9IG1heSBiZSBAc2FtcHtyZXN9LCBAc2FtcHtyY30sIG9yCi1Ac2FtcHtjb2ZmfS4gIElmIG5vIGlucHV0IGZvcm1hdCBpcyBzcGVjaWZpZWQsIEBjb2Rle3dpbmRyZXN9IHdpbGwKLWd1ZXNzLCBhcyBkZXNjcmliZWQgYWJvdmUuCi0KLUBpdGVtIC1PIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0tb3V0cHV0LWZvcm1hdCBAdmFye2Zvcm1hdH0KLVRoZSBvdXRwdXQgZm9ybWF0IHRvIGdlbmVyYXRlLiAgQHZhcntmb3JtYXR9IG1heSBiZSBAc2FtcHtyZXN9LAotQHNhbXB7cmN9LCBvciBAc2FtcHtjb2ZmfS4gIElmIG5vIG91dHB1dCBmb3JtYXQgaXMgc3BlY2lmaWVkLAotQGNvZGV7d2luZHJlc30gd2lsbCBndWVzcywgYXMgZGVzY3JpYmVkIGFib3ZlLgotCi1AaXRlbSAtRiBAdmFye3RhcmdldH0KLUBpdGVteCAtLXRhcmdldCBAdmFye3RhcmdldH0KLVNwZWNpZnkgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIGZvciBhIENPRkYgZmlsZSBhcyBpbnB1dCBvciBvdXRwdXQuICBUaGlzCi1pcyBhIEJGRCB0YXJnZXQgbmFtZTsgeW91IGNhbiB1c2UgdGhlIEBjb2Rley0taGVscH0gb3B0aW9uIHRvIHNlZSBhIGxpc3QKLW9mIHN1cHBvcnRlZCB0YXJnZXRzLiAgTm9ybWFsbHkgQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGRlZmF1bHQKLWZvcm1hdCwgd2hpY2ggaXMgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgYnkgdGhlIEBjb2Rley0taGVscH0gb3B0aW9uLgotQHJlZntUYXJnZXQgU2VsZWN0aW9ufS4KLQotQGl0ZW0gLS1wcmVwcm9jZXNzb3IgQHZhcntwcm9ncmFtfQotV2hlbiBAY29kZXt3aW5kcmVzfSByZWFkcyBhbiBAY29kZXtyY30gZmlsZSwgaXQgcnVucyBpdCB0aHJvdWdoIHRoZSBDCi1wcmVwcm9jZXNzb3IgZmlyc3QuICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcmVwcm9jZXNzb3IKLXRvIHVzZSwgaW5jbHVkaW5nIGFueSBsZWFkaW5nIGFyZ3VtZW50cy4gIFRoZSBkZWZhdWx0IHByZXByb2Nlc3NvcgotYXJndW1lbnQgaXMgQGNvZGV7Z2NjIC1FIC14Yy1oZWFkZXIgLURSQ19JTlZPS0VEfS4KLQotQGl0ZW0gLS1pbmNsdWRlLWRpciBAdmFye2RpcmVjdG9yeX0KLVNwZWNpZnkgYW4gaW5jbHVkZSBkaXJlY3RvcnkgdG8gdXNlIHdoZW4gcmVhZGluZyBhbiBAY29kZXtyY30gZmlsZS4KLUBjb2Rle3dpbmRyZXN9IHdpbGwgcGFzcyB0aGlzIHRvIHRoZSBwcmVwcm9jZXNzb3IgYXMgYW4gQGNvZGV7LUl9Ci1vcHRpb24uICBAY29kZXt3aW5kcmVzfSB3aWxsIGFsc28gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IHdoZW4gbG9va2luZyBmb3IKLWZpbGVzIG5hbWVkIGluIHRoZSBAY29kZXtyY30gZmlsZS4KLQotQGl0ZW0gLUQgQHZhcnt0YXJnZXR9Ci1AaXRlbXggLS1kZWZpbmUgQHZhcntzeW1bPXZhbF19Ci1TcGVjaWZ5IGEgQGNvZGV7LUR9IG9wdGlvbiB0byBwYXNzIHRvIHRoZSBwcmVwcm9jZXNzb3Igd2hlbiByZWFkaW5nIGFuCi1AY29kZXtyY30gZmlsZS4KLQotQGl0ZW0gLXYKLUVuYWJsZSB2ZXJib3NlIG1vZGUuICBUaGlzIHRlbGxzIHlvdSB3aGF0IHRoZSBwcmVwcm9jZXNzb3IgaXMgaWYgeW91Ci1kaWRuJ3Qgc3BlY2lmeSBvbmUuCi0KLUBpdGVtIC0tbGFuZ3VhZ2UgQHZhcnt2YWx9Ci1TcGVjaWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIHRvIHVzZSB3aGVuIHJlYWRpbmcgYW4gQGNvZGV7cmN9IGZpbGUuCi1AdmFye3ZhbH0gc2hvdWxkIGJlIGEgaGV4YWRlY2ltYWwgbGFuZ3VhZ2UgY29kZS4gIFRoZSBsb3cgZWlnaHQgYml0cyBhcmUKLXRoZSBsYW5ndWFnZSwgYW5kIHRoZSBoaWdoIGVpZ2h0IGJpdHMgYXJlIHRoZSBzdWJsYW5ndWFnZS4KLQotQGl0ZW0gLS1oZWxwCi1QcmludHMgYSB1c2FnZSBzdW1tYXJ5LgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle3dpbmRyZXN9LgotCi1AaXRlbSAtLXl5ZGVidWcKLUlmIEBjb2Rle3dpbmRyZXN9IGlzIGNvbXBpbGVkIHdpdGggQGNvZGV7WVlERUJVR30gZGVmaW5lZCBhcyBAY29kZXsxfSwKLXRoaXMgd2lsbCB0dXJuIG9uIHBhcnNlciBkZWJ1Z2dpbmcuCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgZGxsdG9vbAotQGNoYXB0ZXIgQ3JlYXRlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIERMTHMKLUBjaW5kZXggRExMCi1Aa2luZGV4IGRsbHRvb2wKLQotQGNvZGV7ZGxsdG9vbH0gbWF5IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZQotZHluYW1pYyBsaW5rIGxpYnJhcmllcyAoRExMcykuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXtkbGx0b29sfSBpcyBub3QgYWx3YXlzIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIGJpbmFyeQotdXRpbGl0aWVzLCBzaW5jZSBpdCBpcyBvbmx5IHVzZWZ1bCBmb3IgdGhvc2UgdGFyZ2V0cyB3aGljaCBzdXBwb3J0IERMTHMuCi1AZW5kIHF1b3RhdGlvbgotCi1Ac21hbGxleGFtcGxlCi1kbGx0b29sIFstZHwtLWlucHV0LWRlZiBAdmFye2RlZi1maWxlLW5hbWV9XQotICAgICAgICBbLWJ8LS1iYXNlLWZpbGUgQHZhcntiYXNlLWZpbGUtbmFtZX1dCi0gICAgICAgIFstZXwtLW91dHB1dC1leHAgQHZhcntleHBvcnRzLWZpbGUtbmFtZX1dCi0gICAgICAgIFstenwtLW91dHB1dC1kZWYgQHZhcntkZWYtZmlsZS1uYW1lfV0KLSAgICAgICAgWy1sfC0tb3V0cHV0LWxpYiBAdmFye2xpYnJhcnktZmlsZS1uYW1lfV0gICAgICAgIAotICAgICAgICBbLS1leHBvcnQtYWxsLXN5bWJvbHNdIFstLW5vLWV4cG9ydC1hbGwtc3ltYm9sc10KLSAgICAgICAgWy0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7bGlzdH1dCi0gICAgICAgIFstLW5vLWRlZmF1bHQtZXhjbHVkZXNdCi0gICAgICAgIFstU3wtLWFzIEB2YXJ7cGF0aC10by1hc3NlbWJsZXJ9XSBbLWZ8LS1hcy1mbGFncyBAdmFye29wdGlvbnN9XQotICAgICAgICBbLUR8LS1kbGxuYW1lIEB2YXJ7bmFtZX1dIFstbXwtLW1hY2hpbmUgQHZhcnttYWNoaW5lfV0KLSAgICAgICAgWy1hfC0tYWRkLWluZGlyZWN0XSBbLVV8LS1hZGQtdW5kZXJzY29yZV0gWy1rfC0ta2lsbC1hdF0KLSAgICAgICAgWy1BfC0tYWRkLXN0ZGNhbGwtYWxpYXNdCi0gICAgICAgIFsteHwtLW5vLWlkYXRhNF0gWy1jfC0tbm8taWRhdGE1XSBbLWl8LS1pbnRlcndvcmtdCi0gICAgICAgIFstbnwtLW5vZGVsZXRlXSBbLXZ8LS12ZXJib3NlXSBbLWh8LS1oZWxwXSBbLVZ8LS12ZXJzaW9uXQotICAgICAgICBbb2JqZWN0LWZpbGUgQGRvdHN7fV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle2RsbHRvb2x9IHJlYWRzIGl0cyBpbnB1dHMsIHdoaWNoIGNhbiBjb21lIGZyb20gdGhlIEBzYW1wey1kfSBhbmQKLUBzYW1wey1ifSBvcHRpb25zIGFzIHdlbGwgYXMgb2JqZWN0IGZpbGVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZAotbGluZS4gIEl0IHRoZW4gcHJvY2Vzc2VzIHRoZXNlIGlucHV0cyBhbmQgaWYgdGhlIEBzYW1wey1lfSBvcHRpb24gaGFzCi1iZWVuIHNwZWNpZmllZCBpdCBjcmVhdGVzIGEgZXhwb3J0cyBmaWxlLiAgSWYgdGhlIEBzYW1wey1sfSBvcHRpb24KLWhhcyBiZWVuIHNwZWNpZmllZCBpdCBjcmVhdGVzIGEgbGlicmFyeSBmaWxlIGFuZCBpZiB0aGUgQHNhbXB7LXp9IG9wdGlvbgotaGFzIGJlZW4gc3BlY2lmaWVkIGl0IGNyZWF0ZXMgYSBkZWYgZmlsZS4gIEFueSBvciBhbGwgb2YgdGhlIC1lLCAtbAotYW5kIC16IG9wdGlvbnMgY2FuIGJlIHByZXNlbnQgaW4gb25lIGludm9jYXRpb24gb2YgZGxsdG9vbC4KLQotV2hlbiBjcmVhdGluZyBhIERMTCwgYWxvbmcgd2l0aCB0aGUgc291cmNlIGZvciB0aGUgRExMLCBpdCBpcyBuZWNlc3NhcnkKLXRvIGhhdmUgdGhyZWUgb3RoZXIgZmlsZXMuICBAY29kZXtkbGx0b29sfSBjYW4gaGVscCB3aXRoIHRoZSBjcmVhdGlvbiBvZgotdGhlc2UgZmlsZXMuCi0KLVRoZSBmaXJzdCBmaWxlIGlzIGEgQHNhbXB7LmRlZn0gZmlsZSB3aGljaCBzcGVjaWZpZXMgd2hpY2ggZnVuY3Rpb25zIGFyZQotZXhwb3J0ZWQgZnJvbSB0aGUgRExMLCB3aGljaCBmdW5jdGlvbnMgdGhlIERMTCBpbXBvcnRzLCBhbmQgc28gb24uICBUaGlzCi1pcyBhIHRleHQgZmlsZSBhbmQgY2FuIGJlIGNyZWF0ZWQgYnkgaGFuZCwgb3IgQGNvZGV7ZGxsdG9vbH0gY2FuIGJlIHVzZWQKLXRvIGNyZWF0ZSBpdCB1c2luZyB0aGUgQHNhbXB7LXp9IG9wdGlvbi4gIEluIHRoaXMgY2FzZSBAY29kZXtkbGx0b29sfQotd2lsbCBzY2FuIHRoZSBvYmplY3QgZmlsZXMgc3BlY2lmaWVkIG9uIGl0cyBjb21tYW5kIGxpbmUgbG9va2luZyBmb3IKLXRob3NlIGZ1bmN0aW9ucyB3aGljaCBoYXZlIGJlZW4gc3BlY2lhbGx5IG1hcmtlZCBhcyBiZWluZyBleHBvcnRlZCBhbmQKLXB1dCBlbnRyaWVzIGZvciB0aGVtIGluIHRoZSAuZGVmIGZpbGUgaXQgY3JlYXRlcy4KLQotSW4gb3JkZXIgdG8gbWFyayBhIGZ1bmN0aW9uIGFzIGJlaW5nIGV4cG9ydGVkIGZyb20gYSBETEwsIGl0IG5lZWRzIHRvCi1oYXZlIGFuIEBzYW1wey1leHBvcnQ6PG5hbWVfb2ZfZnVuY3Rpb24+fSBlbnRyeSBpbiB0aGUgQHNhbXB7LmRyZWN0dmV9Ci1zZWN0aW9uIG9mIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgY2FuIGJlIGRvbmUgaW4gQyBieSB1c2luZyB0aGUKLWFzbSgpIG9wZXJhdG9yOgotCi1Ac21hbGxleGFtcGxlCi0gIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlIik7ICAKLSAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpteV9mdW5jXCIiKTsKLQotICBpbnQgbXlfZnVuYyAodm9pZCkgQHsgQGRvdHN7fSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHNlY29uZCBmaWxlIG5lZWRlZCBmb3IgRExMIGNyZWF0aW9uIGlzIGFuIGV4cG9ydHMgZmlsZS4gIFRoaXMgZmlsZQotaXMgbGlua2VkIHdpdGggdGhlIG9iamVjdCBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIGJvZHkgb2YgdGhlIERMTCBhbmQgaXQKLWhhbmRsZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBETEwgYW5kIHRoZSBvdXRzaWRlIHdvcmxkLiAgVGhpcyBpcyBhCi1iaW5hcnkgZmlsZSBhbmQgaXQgY2FuIGJlIGNyZWF0ZWQgYnkgZ2l2aW5nIHRoZSBAc2FtcHstZX0gb3B0aW9uIHRvCi1AY29kZXtkbGx0b29sfSB3aGVuIGl0IGlzIGNyZWF0aW5nIG9yIHJlYWRpbmcgaW4gYSAuZGVmIGZpbGUuIAotCi1UaGUgdGhpcmQgZmlsZSBuZWVkZWQgZm9yIERMTCBjcmVhdGlvbiBpcyB0aGUgbGlicmFyeSBmaWxlIHRoYXQgcHJvZ3JhbXMKLXdpbGwgbGluayB3aXRoIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUgZnVuY3Rpb25zIGluIHRoZSBETEwuICBUaGlzIGZpbGUKLWNhbiBiZSBjcmVhdGVkIGJ5IGdpdmluZyB0aGUgQHNhbXB7LWx9IG9wdGlvbiB0byBkbGx0b29sIHdoZW4gaXQKLWlzIGNyZWF0aW5nIG9yIHJlYWRpbmcgaW4gYSAuZGVmIGZpbGUuCi0KLUBjb2Rle2RsbHRvb2x9IGJ1aWxkcyB0aGUgbGlicmFyeSBmaWxlIGJ5IGhhbmQsIGJ1dCBpdCBidWlsZHMgdGhlCi1leHBvcnRzIGZpbGUgYnkgY3JlYXRpbmcgdGVtcG9yYXJ5IGZpbGVzIGNvbnRhaW5pbmcgYXNzZW1ibGVyIHN0YXRlbWVudHMKLWFuZCB0aGVuIGFzc2VtYmxpbmcgdGhlc2UuICBUaGUgQHNhbXB7LVN9IGNvbW1hbmQgbGluZSBvcHRpb24gY2FuIGJlCi11c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIGFzc2VtYmxlciB0aGF0IGRsbHRvb2wgd2lsbCB1c2UsCi1hbmQgdGhlIEBzYW1wey1mfSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcGFzcyBzcGVjaWZpYyBmbGFncyB0byB0aGF0Ci1hc3NlbWJsZXIuICBUaGUgQHNhbXB7LW59IGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgZGxsdG9vbCBmcm9tIGRlbGV0aW5nCi10aGVzZSB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGVzIHdoZW4gaXQgaXMgZG9uZSwgYW5kIGlmIEBzYW1wey1ufSBpcwotc3BlY2lmaWVkIHR3aWNlIHRoZW4gdGhpcyB3aWxsIHByZXZlbnQgZGxsdG9vbCBmcm9tIGRlbGV0aW5nIHRoZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlcyBpdCB1c2VkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgY3JlYXRpbmcgYSBETEwgZnJvbSBhIHNvdXJjZSBmaWxlIEBzYW1we2RsbC5jfSBhbmQKLWFsc28gY3JlYXRpbmcgYSBwcm9ncmFtIChmcm9tIGFuIG9iamVjdCBmaWxlIGNhbGxlZCBAc2FtcHtwcm9ncmFtLm99KQotdGhhdCB1c2VzIHRoYXQgRExMOgotCi1Ac21hbGxleGFtcGxlCi0gIGdjYyAtYyBkbGwuYwotICBkbGx0b29sIC1lIGV4cG9ydHMubyAtbCBkbGwubGliIGRsbC5vCi0gIGdjYyBkbGwubyBleHBvcnRzLm8gLW8gZGxsLmRsbAotICBnY2MgcHJvZ3JhbS5vIGRsbC5saWIgLW8gcHJvZ3JhbQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1kIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1pbnB1dC1kZWYgQHZhcntmaWxlbmFtZX0KLUBjaW5kZXggaW5wdXQgLmRlZiBmaWxlCi1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbiBhbmQgcHJvY2Vzc2VkLgotCi1AaXRlbSAtYiBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tYmFzZS1maWxlIEB2YXJ7ZmlsZW5hbWV9Ci1AY2luZGV4IGJhc2UgZmlsZXMKLVNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGJhc2UgZmlsZSB0byBiZSByZWFkIGluIGFuZCBwcm9jZXNzZWQuICBUaGUKLWNvbnRlbnRzIG9mIHRoaXMgZmlsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gaW4gdGhlCi1leHBvcnRzIGZpbGUgZ2VuZXJhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC1lIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtZXhwIEB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGV4cG9ydCBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLXogQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLW91dHB1dC1kZWYgQHZhcntmaWxlbmFtZX0KLVNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgLmRlZiBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLWwgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLW91dHB1dC1saWIgQHZhcntmaWxlbmFtZX0KLVNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLS1leHBvcnQtYWxsLXN5bWJvbHMKLVRyZWF0IGFsbCBnbG9iYWwgYW5kIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGZvdW5kIGluIHRoZSBpbnB1dCBvYmplY3QKLWZpbGVzIGFzIHN5bWJvbHMgdG8gYmUgZXhwb3J0ZWQuICBUaGVyZSBpcyBhIHNtYWxsIGxpc3Qgb2Ygc3ltYm9scyB3aGljaAotYXJlIG5vdCBleHBvcnRlZCBieSBkZWZhdWx0OyBzZWUgdGhlIEBjb2Rley0tbm8tZGVmYXVsdC1leGNsdWRlc30KLW9wdGlvbi4gIFlvdSBtYXkgYWRkIHRvIHRoZSBsaXN0IG9mIHN5bWJvbHMgdG8gbm90IGV4cG9ydCBieSB1c2luZyB0aGUKLUBjb2Rley0tZXhjbHVkZS1zeW1ib2xzfSBvcHRpb24uCi0KLUBpdGVtIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzCi1Pbmx5IGV4cG9ydCBzeW1ib2xzIGV4cGxpY2l0bHkgbGlzdGVkIGluIGFuIGlucHV0IC5kZWYgZmlsZSBvciBpbgotQHNhbXB7LmRyZWN0dmV9IHNlY3Rpb25zIGluIHRoZSBpbnB1dCBvYmplY3QgZmlsZXMuICBUaGlzIGlzIHRoZSBkZWZhdWx0Ci1iZWhhdmlvdXIuICBUaGUgQHNhbXB7LmRyZWN0dmV9IHNlY3Rpb25zIGFyZSBjcmVhdGVkIGJ5IEBzYW1we2RsbGV4cG9ydH0KLWF0dHJpYnV0ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLgotCi1AaXRlbSAtLWV4Y2x1ZGUtc3ltYm9scyBAdmFye2xpc3R9Ci1EbyBub3QgZXhwb3J0IHRoZSBzeW1ib2xzIGluIEB2YXJ7bGlzdH0uICBUaGlzIGlzIGEgbGlzdCBvZiBzeW1ib2wgbmFtZXMKLXNlcGFyYXRlZCBieSBjb21tYSBvciBjb2xvbiBjaGFyYWN0ZXJzLiAgVGhlIHN5bWJvbCBuYW1lcyBzaG91bGQgbm90Ci1jb250YWluIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbgotQGNvZGV7LS1leHBvcnQtYWxsLXN5bWJvbHN9IGlzIHVzZWQuCi0KLUBpdGVtIC0tbm8tZGVmYXVsdC1leGNsdWRlcwotV2hlbiBAY29kZXstLWV4cG9ydC1hbGwtc3ltYm9sc30gaXMgdXNlZCwgaXQgd2lsbCBieSBkZWZhdWx0IGF2b2lkCi1leHBvcnRpbmcgY2VydGFpbiBzcGVjaWFsIHN5bWJvbHMuICBUaGUgY3VycmVudCBsaXN0IG9mIHN5bWJvbHMgdG8gYXZvaWQKLWV4cG9ydGluZyBpcyBAc2FtcHtEbGxNYWluQEAxMn0sIEBzYW1we0RsbEVudHJ5UG9pbnRAQDB9LAotQHNhbXB7aW1wdXJlX3B0cn0uICBZb3UgbWF5IHVzZSB0aGUgQGNvZGV7LS1uby1kZWZhdWx0LWV4Y2x1ZGVzfSBvcHRpb24KLXRvIGdvIGFoZWFkIGFuZCBleHBvcnQgdGhlc2Ugc3BlY2lhbCBzeW1ib2xzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwKLXdoZW4gQGNvZGV7LS1leHBvcnQtYWxsLXN5bWJvbHN9IGlzIHVzZWQuCi0KLUBpdGVtIC1TIEB2YXJ7cGF0aH0KLUBpdGVteCAtLWFzIEB2YXJ7cGF0aH0KLVNwZWNpZmllcyB0aGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBmaWxlbmFtZSwgb2YgdGhlIGFzc2VtYmxlciB0byBiZSB1c2VkCi10byBjcmVhdGUgdGhlIGV4cG9ydHMgZmlsZS4KLQotQGl0ZW0gLWYgQHZhcntzd2l0Y2hlc30KLUBpdGVteCAtLWFzLWZsYWdzIEB2YXJ7c3dpdGNoZXN9Ci1TcGVjaWZpZXMgYW55IHNwZWNpZmljIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyB0byBiZSBwYXNzZWQgdG8gdGhlCi1hc3NlbWJsZXIgd2hlbiBidWlsZGluZyB0aGUgZXhwb3J0cyBmaWxlLiAgVGhpcyBvcHRpb24gd2lsbCB3b3JrIGV2ZW4gaWYKLXRoZSBAc2FtcHstU30gb3B0aW9uIGlzIG5vdCB1c2VkLiAgVGhpcyBvcHRpb24gb25seSB0YWtlcyBvbmUgYXJndW1lbnQsCi1hbmQgaWYgaXQgb2NjdXJzIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gbGF0ZXIKLW9jY3VycmVuY2VzIHdpbGwgb3ZlcnJpZGUgZWFybGllciBvY2N1cnJlbmNlcy4gIFNvIGlmIGl0IGlzIG5lY2Vzc2FyeSB0bwotcGFzcyBtdWx0aXBsZSBzd2l0Y2hlcyB0byB0aGUgYXNzZW1ibGVyIHRoZXkgc2hvdWxkIGJlIGVuY2xvc2VkIGluCi1kb3VibGUgcXVvdGVzLgotCi1AaXRlbSAtRCBAdmFye25hbWV9Ci1AaXRlbXggLS1kbGwtbmFtZSBAdmFye25hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgdG8gYmUgc3RvcmVkIGluIHRoZSAuZGVmIGZpbGUgYXMgdGhlIG5hbWUgb2YgdGhlIERMTAotd2hlbiB0aGUgQHNhbXB7LWV9IG9wdGlvbiBpcyB1c2VkLiAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHByZXNlbnQsIHRoZW4KLXRoZSBmaWxlbmFtZSBnaXZlbiB0byB0aGUgQHNhbXB7LWV9IG9wdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YKLXRoZSBETEwuCi0KLUBpdGVtIC1tIEB2YXJ7bWFjaGluZX0KLUBpdGVteCAtbWFjaGluZSBAdmFye21hY2hpbmV9Ci1TcGVjaWZpZXMgdGhlIHR5cGUgb2YgbWFjaGluZSBmb3Igd2hpY2ggdGhlIGxpYnJhcnkgZmlsZSBzaG91bGQgYmUKLWJ1aWx0LiAgQGNvZGV7ZGxsdG9vbH0gaGFzIGEgYnVpbHQgaW4gZGVmYXVsdCB0eXBlLCBkZXBlbmRpbmcgdXBvbiBob3cKLWl0IHdhcyBjcmVhdGVkLCBidXQgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhhdC4gIFRoaXMgaXMKLW5vcm1hbGx5IG9ubHkgdXNlZnVsIHdoZW4gY3JlYXRpbmcgRExMcyBmb3IgYW4gQVJNIHByb2Nlc3Nvciwgd2hlbiB0aGUKLWNvbnRlbnRzIG9mIHRoZSBETEwgYXJlIGFjdHVhbGx5IGVuY29kZSB1c2luZyBUSFVNQiBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1hZGQtaW5kaXJlY3QKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIGFkZCBhIHNlY3Rpb24gd2hpY2ggYWxsb3dzIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgdG8gYmUKLXJlZmVyZW5jZWQgd2l0aG91dCB1c2luZyB0aGUgaW1wb3J0IGxpYnJhcnkuICBXaGF0ZXZlciB0aGUgaGVsbCB0aGF0Ci1tZWFucyEgCi0KLUBpdGVtIC1VCi1AaXRlbXggLS1hZGQtdW5kZXJzY29yZQotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0Ci1zaG91bGQgcHJlcGVuZCBhbiB1bmRlcnNjb3JlIHRvIHRoZSBuYW1lcyBvZiB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLiAKLQotQGl0ZW0gLWsKLUBpdGVteCAtLWtpbGwtYXQKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIG5vdCBhcHBlbmQgdGhlIHN0cmluZyBAc2FtcHtAQCA8bnVtYmVyPn0uICBUaGVzZSBudW1iZXJzIGFyZQotY2FsbGVkIG9yZGluYWwgbnVtYmVycyBhbmQgdGhleSByZXByZXNlbnQgYW5vdGhlciB3YXkgb2YgYWNjZXNzaW5nIHRoZQotZnVuY3Rpb24gaW4gYSBETEwsIG90aGVyIHRoYW4gYnkgbmFtZS4KLQotQGl0ZW0gLUEKLUBpdGVteCAtLWFkZC1zdGRjYWxsLWFsaWFzCi1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKLXNob3VsZCBhZGQgYWxpYXNlcyBmb3Igc3RkY2FsbCBzeW1ib2xzIHdpdGhvdXQgQHNhbXB7QEAgPG51bWJlcj59Ci1pbiBhZGRpdGlvbiB0byB0aGUgc3ltYm9scyB3aXRoIEBzYW1we0BAIDxudW1iZXI+fS4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLW5vLWlkYXRhNAotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBhbmQgbGlicmFyeQotZmlsZXMgaXQgc2hvdWxkIG9taXQgdGhlIC5pZGF0YTQgc2VjdGlvbi4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotQGl0ZW0gLWMKLUBpdGVteCAtLW5vLWlkYXRhNQotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBhbmQgbGlicmFyeQotZmlsZXMgaXQgc2hvdWxkIG9taXQgdGhlIC5pZGF0YTUgc2VjdGlvbi4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotQGl0ZW0gLWkKLUBpdGVteCAtLWludGVyd29yawotU3BlY2lmaWVzIHRoYXQgQGNvZGV7ZGxsdG9vbH0gc2hvdWxkIG1hcmsgdGhlIG9iamVjdHMgaW4gdGhlIGxpYnJhcnkKLWZpbGUgYW5kIGV4cG9ydHMgZmlsZSB0aGF0IGl0IHByb2R1Y2VzIGFzIHN1cHBvcnRpbmcgaW50ZXJ3b3JraW5nCi1iZXR3ZWVuIEFSTSBhbmQgVEhVTUIgY29kZS4KLQotQGl0ZW0gLW4KLUBpdGVteCAtLW5vZGVsZXRlCi1NYWtlcyBAY29kZXtkbGx0b29sfSBwcmVzZXJ2ZSB0aGUgdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlcyBpdCB1c2VkIHRvCi1jcmVhdGUgdGhlIGV4cG9ydHMgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIHJlcGVhdGVkIHRoZW4gZGxsdG9vbCB3aWxsCi1hbHNvIHByZXNlcnZlIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0IGZpbGVzIGl0IHVzZXMgdG8gY3JlYXRlIHRoZSBsaWJyYXJ5Ci1maWxlLiAKLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcmJvc2UKLU1ha2UgZGxsdG9vbCBkZXNjcmliZSB3aGF0IGl0IGlzIGRvaW5nLgotCi1AaXRlbSAtaAotQGl0ZW14IC0taGVscAotRGlzcGxheXMgYSBsaXN0IG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCB0aGVuIGV4aXRzLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotRGlzcGxheXMgZGxsdG9vbCdzIHZlcnNpb24gbnVtYmVyIGFuZCB0aGVuIGV4aXRzLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIHJlYWRlbGYKLUBjaGFwdGVyIHJlYWRlbGYKLQotQGNpbmRleCBFTEYgZmlsZSBpbmZvcm1hdGlvbgotQGtpbmRleCByZWFkZWxmCi0KLUBzbWFsbGV4YW1wbGUKLXJlYWRlbGYgWyAtYSB8IC0tYWxsIF0gCi0gICAgICAgIFsgLWggfCAtLWZpbGUtaGVhZGVyXQotICAgICAgICBbIC1sIHwgLS1wcm9ncmFtLWhlYWRlcnMgfCAtLXNlZ21lbnRzXQotICAgICAgICBbIC1TIHwgLS1zZWN0aW9uLWhlYWRlcnMgfCAtLXNlY3Rpb25zXQotICAgICAgICBbIC1lIHwgLS1oZWFkZXJzXQotICAgICAgICBbIC1zIHwgLS1zeW1zIHwgLS1zeW1ib2xzXQotICAgICAgICBbIC1yIHwgLS1yZWxvY3NdCi0gICAgICAgIFsgLWQgfCAtLWR5bmFtaWNdCi0gICAgICAgIFsgLVYgfCAtLXZlcnNpb24taW5mb10KLSAgICAgICAgWyAtRCB8IC0tdXNlLWR5bmFtaWNdCi0gICAgICAgIFsgLXggPG51bWJlcj4gfCAtLWhleC1kdW1wPTxudW1iZXI+XQotICAgICAgICBbIC13W2xpYXByXSB8IC0tZGVidWctZHVtcFs9aW5mbyw9bGluZSw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXV0KLSAgICAgICAgWyAgICAgIC0taGlzdG9ncmFtXQotICAgICAgICBbIC12IHwgLS12ZXJzaW9uXQotICAgICAgICBbIC1IIHwgLS1oZWxwXQotICAgICAgICBAdmFye2VsZmZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7cmVhZGVsZn0gZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgRUxGIGZvcm1hdCBvYmplY3QKLWZpbGVzLiAgVGhlIG9wdGlvbnMgY29udHJvbCB3aGF0IHBhcnRpY3VsYXIgaW5mb3JtYXRpb24gdG8gZGlzcGxheS4KLQotQHZhcntlbGZmaWxlfUBkb3Rze30gYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuICBBdCB0aGUKLW1vbWVudCwgQGNvZGV7cmVhZGVsZn0gZG9lcyBub3Qgc3VwcG9ydCBleGFtaW5pbmcgYXJjaGl2ZXMsIG5vciBkb2VzIGl0Ci1zdXBwb3J0IGV4YW1pbmcgNjQgYml0IEVMRiBmaWxlcy4KLQotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuICBBdCBsZWFzdCBvbmUgb3B0aW9uIGJlc2lkZXMgQHNhbXB7LXZ9IG9yIEBzYW1wey1IfSBtdXN0IGJlCi1naXZlbi4gCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWEKLUBpdGVteCAtLWFsbAotRXF1aXZhbGVudCB0byBzcGVjaWZpeWluZyBAc2FtcHstLWZpbGUtaGVhZGVyfSwKLUBzYW1wey0tcHJvZ3JhbS1oZWFkZXJzfSwgQHNhbXB7LS1zZWN0aW9uc30sIEBzYW1wey0tc3ltYm9sc30sCi1Ac2FtcHstLXJlbG9jc30sIEBzYW1wey0tZHluYW1pY30gYW5kIEBzYW1wey0tdmVyc2lvbi1pbmZvfS4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWZpbGUtaGVhZGVyCi1AY2luZGV4IEVMRiBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgRUxGIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgdGhlCi1maWxlLgotCi1AaXRlbSAtbAotQGl0ZW14IC0tcHJvZ3JhbS1oZWFkZXJzCi1AaXRlbXggLS1zZWdtZW50cwotQGNpbmRleCBFTEYgcHJvZ3JhbSBoZWFkZXIgaW5mb3JtYXRpb24KLUBjaW5kZXggRUxGIHNlZ21lbnQgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGZpbGUncyBzZWdtZW50IGhlYWRlcnMsIGlmIGl0Ci1oYXMgYW55LgotCi1AaXRlbSAtUwotQGl0ZW14IC0tc2VjdGlvbnMKLUBpdGVteCAtLXNlY3Rpb24taGVhZGVycwotQGNpbmRleCBFTEYgc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSdzIHNlY3Rpb24gaGVhZGVycywgaWYgaXQKLWhhcyBhbnkuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1zeW1ib2xzCi1AaXRlbXggLS1zeW1zCi1AY2luZGV4IEVMRiBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBlbnRyaWVzIGluIHN5bWJvbCB0YWJsZSBzZWN0aW9uIG9mIHRoZSBmaWxlLCBpZiBpdCBoYXMgb25lLgotCi1AaXRlbSAtZQotQGl0ZW14IC0taGVhZGVycwotRGlzcGxheSBhbGwgdGhlIGhlYWRlcnMgaW4gdGhlIGZpbGUuICBFcXVpdmFsZW50IHRvIEBzYW1wey1oIC1sIC1TfS4KLQotQGl0ZW0gLXIKLUBpdGVteCAtLXJlbG9jcwotQGNpbmRleCBFTEYgcmVsb2MgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSdzIHJlbG9jYXRpb24gc2VjdGlvbiwgaWYgaXQgaGEgb25lLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZHluYW1pYwotQGNpbmRleCBFTEYgZHluYW1pYyBzZWN0aW9uIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUncyBkeW5hbWljIHNlY3Rpb24sIGlmIGl0IGhhcyBvbmUuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uLWluZm8KLUBjaW5kZXggRUxGIHZlcnNpb24gc2VjdGlvbnMgaW5mb3JtYXRpb25zCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIHZlcnNpb24gc2VjdGlvbnMgaW4gdGhlIGZpbGUsIGl0IHRoZXkKLWV4aXN0LgotCi1AaXRlbSAtRAotQGl0ZW14IC0tdXNlLWR5bmFtaWMKLVdoZW4gZGlzcGxheWluZyBzeW1ib2xzLCB0aGlzIG9wdGlvbiBtYWtlcyBAY29kZXtyZWFkZWxmfSB1c2UgdGhlCi1zeW1ibG9sIHRhYmxlIGluIHRoZSBmaWxlJ3MgZHluYW1pYyBzZWN0aW9uLCByYXRoZXIgdGhhbiB0aGUgb25lIGluIHRoZQotc3ltYm9scyBzZWN0aW9uLgotCi1AaXRlbSAteCA8bnVtYmVyPgotQGl0ZW14IC0taGV4LWR1bXA9PG51bWJlcj4KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kaWNhdGVkIHNlY3Rpb24gYXMgYSBoZXhhZGVjaW1hbCBkdW1wLgotCi1AaXRlbSAtd1tsaWFwcl0KLUBpdGVteCAtLWRlYnVnLWR1bXBbPWxpbmUsPWluZm8sPWFiYnJldiw9cHVibmFtZXMsPXJhbmdlc10KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZGVidWcgc2VjdGlvbnMgaW4gdGhlIGZpbGUsIGlmIGFueSBhcmUKLXByZXNlbnQuICBJZiBvbmUgb2YgdGhlIG9wdGlvbmFsIGxldHRlcnMgb3Igd29yZHMgZm9sbG93cyB0aGUgc3dpdGNoCi10aGVuIG9ubHkgZGF0YSBmb3VuZCBpbiB0aG9zZSBzcGVjaWZpYyBzZWN0aW9ucyB3aWxsIGJlIGR1bXBlZC4KLQotQGl0ZW0gLS1oaXN0b2dyYW0KLURpc3BsYXkgYSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3RocyB3aGVuIGRpc3BsYXlpbmcgdGhlIGNvbnRlbnRzCi1vZiB0aGUgc3ltYm9sIHRhYmxlcy4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGYuCi0KLUBpdGVtIC1ICi1AaXRlbXggLS1oZWxwCi1EaXNwbGF5IHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB1bmRlcnN0b29kIGJ5IEBjb2Rle3JlYWRlbGZ9LgotCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgU2VsZWN0aW5nIFRoZSBUYXJnZXQgU3lzdGVtCi1AY2hhcHRlciBTZWxlY3RpbmcgdGhlIHRhcmdldCBzeXN0ZW0KLQotWW91IGNhbiBzcGVjaWZ5IHRocmVlIGFzcGVjdHMgb2YgdGhlIHRhcmdldCBzeXN0ZW0gdG8gdGhlIEBzY3tnbnV9Ci1iaW5hcnkgZmlsZSB1dGlsaXRpZXMsIGVhY2ggaW4gc2V2ZXJhbCB3YXlzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIHRhcmdldAotCi1AaXRlbQotdGhlIGFyY2hpdGVjdHVyZQotCi1AaXRlbQotdGhlIGxpbmtlciBlbXVsYXRpb24gKHdoaWNoIGFwcGxpZXMgdG8gdGhlIGxpbmtlciBvbmx5KQotQGVuZCBpdGVtaXplCi0KLUluIHRoZSBmb2xsb3dpbmcgc3VtbWFyaWVzLCB0aGUgbGlzdHMgb2Ygd2F5cyB0byBzcGVjaWZ5IHZhbHVlcyBhcmUgaW4KLW9yZGVyIG9mIGRlY3JlYXNpbmcgcHJlY2VkZW5jZS4gIFRoZSB3YXlzIGxpc3RlZCBmaXJzdCBvdmVycmlkZSB0aG9zZQotbGlzdGVkIGxhdGVyLgotCi1UaGUgY29tbWFuZHMgdG8gbGlzdCB2YWxpZCB2YWx1ZXMgb25seSBsaXN0IHRoZSB2YWx1ZXMgZm9yIHdoaWNoIHRoZQotcHJvZ3JhbXMgeW91IGFyZSBydW5uaW5nIHdlcmUgY29uZmlndXJlZC4gIElmIHRoZXkgd2VyZSBjb25maWd1cmVkIHdpdGgKLUBzYW1wey0tZW5hYmxlLXRhcmdldHM9YWxsfSwgdGhlIGNvbW1hbmRzIGxpc3QgbW9zdCBvZiB0aGUgYXZhaWxhYmxlCi12YWx1ZXMsIGJ1dCBhIGZldyBhcmUgbGVmdCBvdXQ7IG5vdCBhbGwgdGFyZ2V0cyBjYW4gYmUgY29uZmlndXJlZCBpbiBhdAotb25jZSBiZWNhdXNlIHNvbWUgb2YgdGhlbSBjYW4gb25seSBiZSBjb25maWd1cmVkIEBkZm57bmF0aXZlfSAob24gaG9zdHMKLXdpdGggdGhlIHNhbWUgdHlwZSBhcyB0aGUgdGFyZ2V0IHN5c3RlbSkuCi0KLUBtZW51Ci0qIFRhcmdldCBTZWxlY3Rpb246OiAgICAgICAgICAgIAotKiBBcmNoaXRlY3R1cmUgU2VsZWN0aW9uOjogICAgICAKLSogTGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb246OiAgCi1AZW5kIG1lbnUKLQotQG5vZGUgVGFyZ2V0IFNlbGVjdGlvbgotQHNlY3Rpb24gVGFyZ2V0IFNlbGVjdGlvbgotCi1BIEBkZm57dGFyZ2V0fSBpcyBhbiBvYmplY3QgZmlsZSBmb3JtYXQuICBBIGdpdmVuIHRhcmdldCBtYXkgYmUKLXN1cHBvcnRlZCBmb3IgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAoQHB4cmVme0FyY2hpdGVjdHVyZSBTZWxlY3Rpb259KS4KLUEgdGFyZ2V0IHNlbGVjdGlvbiBtYXkgYWxzbyBoYXZlIHZhcmlhdGlvbnMgZm9yIGRpZmZlcmVudCBvcGVyYXRpbmcKLXN5c3RlbXMgb3IgYXJjaGl0ZWN0dXJlcy4KLQotVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCB0YXJnZXQgdmFsdWVzIGlzIEBzYW1we29iamR1bXAgLWl9Ci0odGhlIGZpcnN0IGNvbHVtbiBvZiBvdXRwdXQgY29udGFpbnMgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uKS4KLQotU29tZSBzYW1wbGUgdmFsdWVzIGFyZTogQHNhbXB7YS5vdXQtaHAzMDBic2R9LCBAc2FtcHtlY29mZi1saXR0bGVtaXBzfSwKLUBzYW1we2Eub3V0LXN1bm9zLWJpZ30uCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgdGFyZ2V0IHVzaW5nIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgVGhpcyBpcwotdGhlIHNhbWUgc29ydCBvZiBuYW1lIHRoYXQgaXMgcGFzc2VkIHRvIGNvbmZpZ3VyZSB0byBzcGVjaWZ5IGEgdGFyZ2V0LgotV2hlbiB5b3UgdXNlIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0IGFzIGFuIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGZ1bGx5Ci1jYW5vbmljYWxpemVkLiAgWW91IGNhbiBzZWUgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgdHJpcGxldCBieQotcnVubmluZyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy5zdWJ9IHdoaWNoIGlzIGluY2x1ZGVkIHdpdGggdGhlCi1zb3VyY2VzLgotCi1Tb21lIHNhbXBsZSBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFyZTogQHNhbXB7bTY4ay1ocC1ic2R9LAotQHNhbXB7bWlwcy1kZWMtdWx0cml4fSwgQHNhbXB7c3BhcmMtc3VuLXN1bm9zfS4KLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqZHVtcH0gVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1ifSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbnM6IEBzYW1wey1JfSBvciBAc2FtcHstLWlucHV0LXRhcmdldH0sIG9yIEBzYW1wey1GfSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBPdXRwdXQgVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb25zOiBAc2FtcHstT30gb3IgQHNhbXB7LS1vdXRwdXQtdGFyZ2V0fSwgb3IgQHNhbXB7LUZ9IG9yIEBzYW1wey0tdGFyZ2V0fQotCi1AaXRlbQotdGhlIGlucHV0IHRhcmdldCAoc2VlIGBgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQnJyBhYm92ZSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7bm19LCBAY29kZXtzaXplfSwgYW5kIEBjb2Rle3N0cmluZ3N9IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIElucHV0IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstYn0gb3IgQHNhbXB7LS1mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtUQVJHRVR9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQotKEBweHJlZntFbnZpcm9ubWVudCwsRW52aXJvbm1lbnQsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi10aGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIHNlbGVjdGVkIGxpbmtlciBlbXVsYXRpb24KLShAcHhyZWZ7TGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LW9mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfQotKEBweHJlZntPcHRpb24gQ29tbWFuZHMsLE9wdGlvbiBDb21tYW5kcyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLXRoZSBsaW5rZXIgaW5wdXQgdGFyZ2V0IChzZWUgYGBMaW5rZXIgSW5wdXQgVGFyZ2V0JycgYWJvdmUpCi1AZW5kIGVudW1lcmF0ZQotCi1Abm9kZSBBcmNoaXRlY3R1cmUgU2VsZWN0aW9uCi1Ac2VjdGlvbiBBcmNoaXRlY3R1cmUgc2VsZWN0aW9uCi0KLUFuIEBkZm57YXJjaGl0ZWN0dXJlfSBpcyBhIHR5cGUgb2YgQHNje2NwdX0gb24gd2hpY2ggYW4gb2JqZWN0IGZpbGUgaXMKLXRvIHJ1bi4gIEl0cyBuYW1lIG1heSBjb250YWluIGEgY29sb24sIHNlcGFyYXRpbmcgdGhlIG5hbWUgb2YgdGhlCi1wcm9jZXNzb3IgZmFtaWx5IGZyb20gdGhlIG5hbWUgb2YgdGhlIHBhcnRpY3VsYXIgQHNje2NwdX0uCi0KLVRoZSBjb21tYW5kIHRvIGxpc3QgdmFsaWQgYXJjaGl0ZWN0dXJlIHZhbHVlcyBpcyBAc2FtcHtvYmpkdW1wIC1pfSAodGhlCi1zZWNvbmQgY29sdW1uIGNvbnRhaW5zIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbikuCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we202OGs6NjgwMjB9LCBAc2FtcHttaXBzOjMwMDB9LCBAc2FtcHtzcGFyY30uCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamR1bXB9IEFyY2hpdGVjdHVyZQotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0gb3IgQHNhbXB7LS1hcmNoaXRlY3R1cmV9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamNvcHl9LCBAY29kZXtubX0sIEBjb2Rle3NpemV9LCBAY29kZXtzdHJpbmdzfSBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCi1AZW5kIGVudW1lcmF0ZQotCi1Ac3ViaGVhZGluZyBMaW5rZXIgSW5wdXQgQXJjaGl0ZWN0dXJlCi0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7T1VUUFVUX0FSQ0h9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGZyb20gdGhlIGxpbmtlciBvdXRwdXQgdGFyZ2V0Ci0oQHB4cmVme1RhcmdldCBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgTGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb24KLUBzZWN0aW9uIExpbmtlciBlbXVsYXRpb24gc2VsZWN0aW9uCi0KLUEgbGlua2VyIEBkZm57ZW11bGF0aW9ufSBpcyBhIGBgcGVyc29uYWxpdHknJyBvZiB0aGUgbGlua2VyLCB3aGljaCBnaXZlcwotdGhlIGxpbmtlciBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG90aGVyIGFzcGVjdHMgb2YgdGhlIHRhcmdldCBzeXN0ZW0uCi1JbiBwYXJ0aWN1bGFyLCBpdCBjb25zaXN0cyBvZgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIGxpbmtlciBzY3JpcHQKLQotQGl0ZW0KLXRoZSB0YXJnZXQKLQotQGl0ZW0KLXNldmVyYWwgYGBob29rJycgZnVuY3Rpb25zIHRoYXQgYXJlIHJ1biBhdCBjZXJ0YWluIHN0YWdlcyBvZiB0aGUgbGlua2luZwotcHJvY2VzcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB0aGF0IHNvbWUgdGFyZ2V0cyByZXF1aXJlCi1AZW5kIGl0ZW1pemUKLQotVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCBsaW5rZXIgZW11bGF0aW9uIHZhbHVlcyBpcyBAc2FtcHtsZCAtVn0uCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we2hwMzAwYnNkfSwgQHNhbXB7bWlwc2xpdH0sIEBzYW1we3N1bjR9LgotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0KLShAcHhyZWZ7T3B0aW9ucywsT3B0aW9ucyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0xERU1VTEFUSU9OfQotCi1AaXRlbQotY29tcGlsZWQtaW4gQGNvZGV7REVGQVVMVF9FTVVMQVRJT059IGZyb20gQGZpbGV7TWFrZWZpbGV9LAotd2hpY2ggY29tZXMgZnJvbSBAY29kZXtFTVVMfSBpbiBAZmlsZXtjb25maWcvQHZhcnt0YXJnZXR9Lm10fQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgUmVwb3J0aW5nIEJ1Z3MKLUBjaGFwdGVyIFJlcG9ydGluZyBCdWdzCi1AY2luZGV4IGJ1Z3MKLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MKLQotWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyB0aGUgYmluYXJ5IHV0aWxpdGllcwotcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yCi1pdCBtYXkgbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzCi10byBoZWxwIHRoZSBlbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcyB3b3JrIGJldHRlci4gIEJ1ZyByZXBvcnRzIGFyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byB0aGVpcgotbWFpbnRlbmFuY2UuCi0KLUluIG9yZGVyIGZvciBhIGJ1ZyByZXBvcnQgdG8gc2VydmUgaXRzIHB1cnBvc2UsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1pbmZvcm1hdGlvbiB0aGF0IGVuYWJsZXMgdXMgdG8gZml4IHRoZSBidWcuCi0KLUBtZW51Ci0qIEJ1ZyBDcml0ZXJpYTo6ICAgICAgICAgICAgICAgIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotKiBCdWcgUmVwb3J0aW5nOjogICAgICAgICAgICAgICBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBlbmQgbWVudQotCi1Abm9kZSBCdWcgQ3JpdGVyaWEKLUBzZWN0aW9uIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotQGNpbmRleCBidWcgY3JpdGVyaWEKLQotSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdSBoYXZlIGZvdW5kIGEgYnVnLCBoZXJlIGFyZSBzb21lIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggZmF0YWwgc2lnbmFsCi1AY2luZGV4IGNyYXNoCi1AaXRlbQotSWYgYSBiaW5hcnkgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzCi1hIGJ1Zy4gIFJlbGlhYmxlIHV0aWxpdGllcyBuZXZlciBjcmFzaC4KLQotQGNpbmRleCBlcnJvciBvbiB2YWxpZCBpbnB1dAotQGl0ZW0KLUlmIGEgYmluYXJ5IHV0aWxpdHkgcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYQotYnVnLgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGJpbmFyeSB1dGlsaXRpZXMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yCi1pbXByb3ZlbWVudCBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIHRoZSBiaW5hcnkgdXRpbGl0aWVzIGZyb20gYSBzdXBwb3J0Ci1vcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UgY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KLQotWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCi1pbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCi1kaXN0cmlidXRpb24uCi0KLUluIGFueSBldmVudCwgd2UgYWxzbyByZWNvbW1lbmQgdGhhdCB5b3Ugc2VuZCBidWcgcmVwb3J0cyBmb3IgdGhlIGJpbmFyeQotdXRpbGl0aWVzIHRvIEBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgotCi1UaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6Ci1Ac3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCi1mYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCi0KLU9mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlCi1wcm9ibGVtIGFuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodAotYXNzdW1lIHRoYXQgdGhlIG5hbWUgb2YgYSBmaWxlIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuCi1XZWxsLCBwcm9iYWJseSBpdCBkb2VzIG5vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcwotYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoIGhhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUKLXRoYXQgcGF0aG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIHBhdGhuYW1lIHdlcmUKLWRpZmZlcmVudCwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbCB0aGUgdXRpbGl0eSBpbnRvCi1kb2luZyB0aGUgcmlnaHQgdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZCBnaXZlIGEKLXNwZWNpZmljLCBjb21wbGV0ZSBleGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLAotYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIHRoZSB1dGlsaXR5LiAgRWFjaCB1dGlsaXR5IGFubm91bmNlcyBpdCBpZiB5b3Ugc3RhcnQgaXQKLXdpdGggdGhlIEBzYW1wey0tdmVyc2lvbn0gYXJndW1lbnQuCi0KLVdpdGhvdXQgdGhpcywgd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHRoZXJlIGlzIGFueSBwb2ludCBpbiBsb29raW5nIGZvcgotdGhlIGJ1ZyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkgdXRpbGl0aWVzLgotCi1AaXRlbQotQW55IHBhdGNoZXMgeW91IG1heSBoYXZlIGFwcGxpZWQgdG8gdGhlIHNvdXJjZSwgaW5jbHVkaW5nIGFueSBwYXRjaGVzCi1tYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHV0aWxpdGllcy0tLWUuZy4KLWBgQGNvZGV7Z2NjLTIuN30nJy4KLQotQGl0ZW0KLVRoZSBjb21tYW5kIGFyZ3VtZW50cyB5b3UgZ2F2ZSB0aGUgdXRpbGl0eSB0byBvYnNlcnZlIHRoZSBidWcuICBUbwotZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbSBhbGwuICBBIGNvcHkKLW9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIElmIHRoZSB1dGlsaXR5IGlzIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUgb3IgZmlsZXMsIHRoZW4gaXQgaXMKLWdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywgdXVlbmNvZGVkIGlmCi1uZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBNYWtpbmcgdGhlbSBhdmFpbGFibGUKLWZvciBhbm9ueW1vdXMgRlRQIGlzIG5vdCBhcyBnb29kLCBidXQgbWF5IGJlIHRoZSBvbmx5IHJlYXNvbmFibGUgY2hvaWNlCi1mb3IgbGFyZ2Ugb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgcHJvZHVjZWQgZXhjbHVzaXZlbHkgdXNpbmcgQHNje2dudX0gcHJvZ3JhbXMKLShlLmcuLCBAY29kZXtnY2N9LCBAY29kZXtnYXN9LCBhbmQvb3IgdGhlIEBzY3tnbnV9IEBjb2Rle2xkfSksIHRoZW4gaXQKLW1heSBiZSBPSyB0byBzZW5kIHRoZSBzb3VyY2UgZmlsZXMgcmF0aGVyIHRoYW4gdGhlIG9iamVjdCBmaWxlcy4gIEluCi10aGlzIGNhc2UsIGJlIHN1cmUgdG8gc2F5IGV4YWN0bHkgd2hhdCB2ZXJzaW9uIG9mIEBjb2Rle2djY30sIG9yCi13aGF0ZXZlciwgd2FzIHVzZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0IGZpbGVzLiAgQWxzbyBzYXkgaG93Ci1AY29kZXtnY2N9LCBvciB3aGF0ZXZlciwgd2FzIGNvbmZpZ3VyZWQuCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCB0aGUgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCB0aGVuIHdlCi13aWxsIGNlcnRhaW5seSBub3RpY2UgaXQuICBCdXQgaWYgdGhlIGJ1ZyBpcyBpbmNvcnJlY3Qgb3V0cHV0LCB3ZSBtaWdodAotbm90IG5vdGljZSB1bmxlc3MgaXQgaXMgZ2xhcmluZ2x5IHdyb25nLiAgWW91IG1pZ2h0IGFzIHdlbGwgbm90IGdpdmUgdXMKLWEgY2hhbmNlIHRvIG1ha2UgYSBtaXN0YWtlLgotCi1FdmVuIGlmIHRoZSBwcm9ibGVtIHlvdSBleHBlcmllbmNlIGlzIGEgZmF0YWwgc2lnbmFsLCB5b3Ugc2hvdWxkIHN0aWxsCi1zYXkgc28gZXhwbGljaXRseS4gIFN1cHBvc2Ugc29tZXRoaW5nIHN0cmFuZ2UgaXMgZ29pbmcgb24sIHN1Y2ggYXMsIHlvdXIKLWNvcHkgb2YgdGhlIHV0aWxpdHkgaXMgb3V0IG9mIHN5bmNoLCBvciB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1ZyBpbgotdGhlIEMgbGlicmFyeSBvbiB5b3VyIHN5c3RlbS4gIChUaGlzIGhhcyBoYXBwZW5lZCEpICBZb3VyIGNvcHkgbWlnaHQKLWNyYXNoIGFuZCBvdXJzIHdvdWxkIG5vdC4gIElmIHlvdSB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdoZW4KLW91cnMgZmFpbHMgdG8gY3Jhc2gsIHdlIHdvdWxkIGtub3cgdGhhdCB0aGUgYnVnIHdhcyBub3QgaGFwcGVuaW5nIGZvcgotdXMuICBJZiB5b3UgaGFkIG5vdCB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdlIHdvdWxkIG5vdCBiZSBhYmxlCi10byBkcmF3IGFueSBjb25jbHVzaW9uIGZyb20gb3VyIG9ic2VydmF0aW9ucy4KLQotQGl0ZW0KLUlmIHlvdSB3aXNoIHRvIHN1Z2dlc3QgY2hhbmdlcyB0byB0aGUgc291cmNlLCBzZW5kIHVzIGNvbnRleHQgZGlmZnMsIGFzCi1nZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yIEBzYW1wey1wfQotb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgSWYgeW91Ci1ldmVuIGRpc2N1c3Mgc29tZXRoaW5nIGluIHRoZSBAY29kZXtsZH0gc291cmNlLCByZWZlciB0byBpdCBieSBjb250ZXh0LAotbm90IGJ5IGxpbmUgbnVtYmVyLgotCi1UaGUgbGluZSBudW1iZXJzIGluIG91ciBkZXZlbG9wbWVudCBzb3VyY2VzIHdpbGwgbm90IG1hdGNoIHRob3NlIGluIHlvdXIKLXNvdXJjZXMuICBZb3VyIGxpbmUgbnVtYmVycyB3b3VsZCBjb252ZXkgbm8gdXNlZnVsIGluZm9ybWF0aW9uIHRvIHVzLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgYXJlIG5vdCBuZWNlc3Nhcnk6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHRoZSBlbnZlbG9wZSBvZiB0aGUgYnVnLgotCi1PZnRlbiBwZW9wbGUgd2hvIGVuY291bnRlciBhIGJ1ZyBzcGVuZCBhIGxvdCBvZiB0aW1lIGludmVzdGlnYXRpbmcKLXdoaWNoIGNoYW5nZXMgdG8gdGhlIGlucHV0IGZpbGUgd2lsbCBtYWtlIHRoZSBidWcgZ28gYXdheSBhbmQgd2hpY2gKLWNoYW5nZXMgd2lsbCBub3QgYWZmZWN0IGl0LgotCi1UaGlzIGlzIG9mdGVuIHRpbWUgY29uc3VtaW5nIGFuZCBub3QgdmVyeSB1c2VmdWwsIGJlY2F1c2UgdGhlIHdheSB3ZQotd2lsbCBmaW5kIHRoZSBidWcgaXMgYnkgcnVubmluZyBhIHNpbmdsZSBleGFtcGxlIHVuZGVyIHRoZSBkZWJ1Z2dlcgotd2l0aCBicmVha3BvaW50cywgbm90IGJ5IHB1cmUgZGVkdWN0aW9uIGZyb20gYSBzZXJpZXMgb2YgZXhhbXBsZXMuCi1XZSByZWNvbW1lbmQgdGhhdCB5b3Ugc2F2ZSB5b3VyIHRpbWUgZm9yIHNvbWV0aGluZyBlbHNlLgotCi1PZiBjb3Vyc2UsIGlmIHlvdSBjYW4gZmluZCBhIHNpbXBsZXIgZXhhbXBsZSB0byByZXBvcnQgQGVtcGh7aW5zdGVhZH0KLW9mIHRoZSBvcmlnaW5hbCBvbmUsIHRoYXQgaXMgYSBjb252ZW5pZW5jZSBmb3IgdXMuICBFcnJvcnMgaW4gdGhlCi1vdXRwdXQgd2lsbCBiZSBlYXNpZXIgdG8gc3BvdCwgcnVubmluZyB1bmRlciB0aGUgZGVidWdnZXIgd2lsbCB0YWtlCi1sZXNzIHRpbWUsIGFuZCBzbyBvbi4KLQotSG93ZXZlciwgc2ltcGxpZmljYXRpb24gaXMgbm90IHZpdGFsOyBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcywKLXJlcG9ydCB0aGUgYnVnIGFueXdheSBhbmQgc2VuZCB1cyB0aGUgZW50aXJlIHRlc3QgY2FzZSB5b3UgdXNlZC4KLQotQGl0ZW0KLUEgcGF0Y2ggZm9yIHRoZSBidWcuCi0KLUEgcGF0Y2ggZm9yIHRoZSBidWcgZG9lcyBoZWxwIHVzIGlmIGl0IGlzIGEgZ29vZCBvbmUuICBCdXQgZG8gbm90IG9taXQKLXRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHRlc3QgY2FzZSwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAotYSBwYXRjaCBpcyBhbGwgd2UgbmVlZC4gIFdlIG1pZ2h0IHNlZSBwcm9ibGVtcyB3aXRoIHlvdXIgcGF0Y2ggYW5kIGRlY2lkZQotdG8gZml4IHRoZSBwcm9ibGVtIGFub3RoZXIgd2F5LCBvciB3ZSBtaWdodCBub3QgdW5kZXJzdGFuZCBpdCBhdCBhbGwuCi0KLVNvbWV0aW1lcyB3aXRoIHByb2dyYW1zIGFzIGNvbXBsaWNhdGVkIGFzIHRoZSBiaW5hcnkgdXRpbGl0aWVzIGl0IGlzCi12ZXJ5IGhhcmQgdG8gY29uc3RydWN0IGFuIGV4YW1wbGUgdGhhdCB3aWxsIG1ha2UgdGhlIHByb2dyYW0gZm9sbG93IGEKLWNlcnRhaW4gcGF0aCB0aHJvdWdoIHRoZSBjb2RlLiAgSWYgeW91IGRvIG5vdCBzZW5kIHVzIHRoZSBleGFtcGxlLCB3ZQotd2lsbCBub3QgYmUgYWJsZSB0byBjb25zdHJ1Y3Qgb25lLCBzbyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHZlcmlmeSB0aGF0Ci10aGUgYnVnIGlzIGZpeGVkLgotCi1BbmQgaWYgd2UgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBidWcgeW91IGFyZSB0cnlpbmcgdG8gZml4LCBvciB3aHkgeW91cgotcGF0Y2ggc2hvdWxkIGJlIGFuIGltcHJvdmVtZW50LCB3ZSB3aWxsIG5vdCBpbnN0YWxsIGl0LiAgQSB0ZXN0IGNhc2Ugd2lsbAotaGVscCB1cyB0byB1bmRlcnN0YW5kLgotCi1AaXRlbQotQSBndWVzcyBhYm91dCB3aGF0IHRoZSBidWcgaXMgb3Igd2hhdCBpdCBkZXBlbmRzIG9uLgotCi1TdWNoIGd1ZXNzZXMgYXJlIHVzdWFsbHkgd3JvbmcuICBFdmVuIHdlIGNhbm5vdCBndWVzcyByaWdodCBhYm91dCBzdWNoCi10aGluZ3Mgd2l0aG91dCBmaXJzdCB1c2luZyB0aGUgZGVidWdnZXIgdG8gZmluZCB0aGUgZmFjdHMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkIEluZGV4Ci0KLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYnVjb21tLmMgYi9iaW51dGlscy9idWNvbW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViMDA1NC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9idWNvbW0uYworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBidWNvbW0uYyAtLSBCaW4gVXRpbHMgQ09NbW9uIGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogV2UgbWlnaHQgcHV0IHRoaXMgaW4gYSBsaWJyYXJ5IHNvbWVkYXkgc28gaXQgY291bGQgYmUgZHluYW1pY2FsbHkKLSAgIGxvYWRlZCwgYnV0IGZvciBub3cgaXQncyBub3QgbmVjZXNzYXJ5LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+CQkvKiBjdGltZSwgbWF5YmUgdGltZV90ICovCi0KLSNpZm5kZWYgSEFWRV9USU1FX1RfSU5fVElNRV9ICi0jaWZuZGVmIEhBVkVfVElNRV9UX0lOX1RZUEVTX0gKLXR5cGVkZWYgbG9uZyB0aW1lX3Q7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotDAotLyogRXJyb3IgcmVwb3J0aW5nICovCi0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotdm9pZAotYmZkX25vbmZhdGFsIChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgQ09OU1QgY2hhciAqZXJybXNnID0gYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSk7Ci0KLSAgaWYgKHN0cmluZykKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cmluZywgZXJybXNnKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBlcnJtc2cpOwotfQotCi12b2lkCi1iZmRfZmF0YWwgKHN0cmluZykKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotewotICBiZmRfbm9uZmF0YWwgKHN0cmluZyk7Ci0gIHhleGl0ICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlcG9ydCAoZm9ybWF0LCBhcmdzKQotICAgICBjb25zdCBjaGFyICogZm9ybWF0OwotICAgICB2YV9saXN0IGFyZ3M7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICBwdXRjICgnXG4nLCBzdGRlcnIpOwotfQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi12b2lkCi1mYXRhbCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmVwb3J0IChmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLXZvaWQKLW5vbl9mYXRhbCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmVwb3J0IChmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotfQotI2Vsc2UKLXZvaWQgCi1mYXRhbCAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICBjaGFyICpGb3JtYXQ7Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncyk7Ci0gIEZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSAgcmVwb3J0IChGb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLXZvaWQgCi1ub25fZmF0YWwgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqRm9ybWF0OwotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBGb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0gIHJlcG9ydCAoRm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLX0KLSNlbmRpZgotCi0vKiBTZXQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCB0YXJnZXQuICBEb2luZwotICAgdGhpcyBwZXJtaXRzIHRoZSBiaW51dGlscyB0byBiZSBjb25maWd1cmVkIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0LAotICAgYW5kIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIEJGRCBsaWJyYXJ5IHdoaWNoIHdhcyBjb25maWd1cmVkIGZvciBhCi0gICBkaWZmZXJlbnQgdGFyZ2V0LiAgKi8KLQotdm9pZAotc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKQotewotICAvKiBUaGUgbWFjcm8gVEFSR0VUIGlzIGRlZmluZWQgYnkgTWFrZWZpbGUuICAqLwotICBjb25zdCBjaGFyICp0YXJnZXQgPSBUQVJHRVQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9kZWZhdWx0X3RhcmdldCAodGFyZ2V0KSkKLSAgICBmYXRhbCAoXygiY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlcyIpLAotCSAgIHRhcmdldCwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotfQotCi0vKiBBZnRlciBhIGZhbHNlIHJldHVybiBmcm9tIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyB3aXRoCi0gICBiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQsIHByaW50Ci0gICB0aGUgcG9zc2libGUgbWF0Y2hpbmcgdGFyZ2V0cy4gICovCi0KLXZvaWQKLWxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAocCkKLSAgICAgY2hhciAqKnA7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IE1hdGNoaW5nIGZvcm1hdHM6IiksIHByb2dyYW1fbmFtZSk7Ci0gIHdoaWxlICgqcCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgJXMiLCAqcCsrKTsKLSAgZnB1dGMgKCdcbicsIHN0ZGVycik7Ci19Ci0KLS8qIExpc3QgdGhlIHN1cHBvcnRlZCB0YXJnZXRzLiAgKi8KLQotdm9pZAotbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAobmFtZSwgZikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRklMRSAqZjsKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGludCB0OwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgZnByaW50ZiAoZiwgXygiU3VwcG9ydGVkIHRhcmdldHM6IikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZiwgXygiJXM6IHN1cHBvcnRlZCB0YXJnZXRzOiIpLCBuYW1lKTsKLSAgZm9yICh0ID0gMDsgYmZkX3RhcmdldF92ZWN0b3JbdF0gIT0gTlVMTDsgdCsrKQotICAgIGZwcmludGYgKGYsICIgJXMiLCBiZmRfdGFyZ2V0X3ZlY3Rvclt0XS0+bmFtZSk7Ci0gIGZwcmludGYgKGYsICJcbiIpOwotfQotDAotLyogRGlzcGxheSB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIGFuIGVsZW1lbnQgYXMgaWYgaXQgd2VyZSBhbiBscyAtbCBsaXN0aW5nOgotCi0gICBNb2RlICAgICAgIFVzZXJcdEdyb3VwXHRTaXplXHREYXRlICAgICAgICAgICAgICAgTmFtZSAqLwotCi12b2lkCi1wcmludF9hcmVsdF9kZXNjciAoZmlsZSwgYWJmZCwgdmVyYm9zZSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHZlcmJvc2U7Ci17Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpID09IDApCi0JewotCSAgY2hhciBtb2RlYnVmWzExXTsKLQkgIGNoYXIgdGltZWJ1Zls0MF07Ci0JICB0aW1lX3Qgd2hlbiA9IGJ1Zi5zdF9tdGltZTsKLQkgIENPTlNUIGNoYXIgKmN0aW1lX3Jlc3VsdCA9IChDT05TVCBjaGFyICopIGN0aW1lICgmd2hlbik7Ci0KLQkgIC8qIFBPU0lYIGZvcm1hdDogIHNraXAgd2Vla2RheSBhbmQgc2Vjb25kcyBmcm9tIGN0aW1lIG91dHB1dC4gICovCi0JICBzcHJpbnRmICh0aW1lYnVmLCAiJS4xMnMgJS40cyIsIGN0aW1lX3Jlc3VsdCArIDQsIGN0aW1lX3Jlc3VsdCArIDIwKTsKLQotCSAgbW9kZV9zdHJpbmcgKGJ1Zi5zdF9tb2RlLCBtb2RlYnVmKTsKLQkgIG1vZGVidWZbMTBdID0gJ1wwJzsKLQkgIC8qIFBPU0lYIDEwMDMuMi9EMTEgc2F5cyB0byBza2lwIGZpcnN0IGNoYXJhY3RlciAoZW50cnkgdHlwZSkuICAqLwotCSAgZnByaW50ZiAoZmlsZSwgIiVzICVsZC8lbGQgJTZsZCAlcyAiLCBtb2RlYnVmICsgMSwKLQkJICAgKGxvbmcpIGJ1Zi5zdF91aWQsIChsb25nKSBidWYuc3RfZ2lkLAotCQkgICAobG9uZykgYnVmLnN0X3NpemUsIHRpbWVidWYpOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsZSwgIiVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBGSUxFTkFNRS4gICovCi0KLWNoYXIgKgotbWFrZV90ZW1wbmFtZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzdGF0aWMgY2hhciB0ZW1wbGF0ZVtdID0gInN0WFhYWFhYIjsKLSAgY2hhciAqdG1wbmFtZTsKLSAgY2hhciAqc2xhc2ggPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQotI2lmIGRlZmluZWQgKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19HTzMyX18pIHx8IGRlZmluZWQgKF9XSU4zMikKLSAgaWYgKHNsYXNoID09IE5VTEwpCi0gICAgc2xhc2ggPSBzdHJyY2hyIChmaWxlbmFtZSwgJ1xcJyk7Ci0jZW5kaWYKLQotICBpZiAoc2xhc2ggIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGMgPSAqc2xhc2g7Ci0gICAgICAqc2xhc2ggPSAwOwotICAgICAgdG1wbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpICsgc2l6ZW9mICh0ZW1wbGF0ZSkgKyAxKTsKLSAgICAgIHN0cmNweSAodG1wbmFtZSwgZmlsZW5hbWUpOwotICAgICAgc3RyY2F0ICh0bXBuYW1lLCAiLyIpOwotICAgICAgc3RyY2F0ICh0bXBuYW1lLCB0ZW1wbGF0ZSk7Ci0gICAgICBta3RlbXAgKHRtcG5hbWUpOwotICAgICAgKnNsYXNoID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0bXBuYW1lID0geG1hbGxvYyAoc2l6ZW9mICh0ZW1wbGF0ZSkpOwotICAgICAgc3RyY3B5ICh0bXBuYW1lLCB0ZW1wbGF0ZSk7Ci0gICAgICBta3RlbXAgKHRtcG5hbWUpOwotICAgIH0KLSAgcmV0dXJuIHRtcG5hbWU7Ci19Ci0KLS8qIFBhcnNlIGEgc3RyaW5nIGludG8gYSBWTUEsIHdpdGggYSBmYXRhbCBlcnJvciBpZiBpdCBjYW4ndCBiZQotICAgcGFyc2VkLiAgKi8KLQotYmZkX3ZtYQotcGFyc2Vfdm1hIChzLCBhcmcpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKmFyZzsKLXsKLSAgYmZkX3ZtYSByZXQ7Ci0gIGNvbnN0IGNoYXIgKmVuZDsKLQotICByZXQgPSBiZmRfc2Nhbl92bWEgKHMsICZlbmQsIDApOwotICAKLSAgaWYgKCplbmQgIT0gJ1wwJykKLSAgICBmYXRhbCAoXygiJXM6IGJhZCBudW1iZXI6ICVzIiksIGFyZywgcyk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2J1Y29tbS5oIGIvYmludXRpbHMvYnVjb21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTZhNzkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYnVjb21tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyogYnVjb21tLmggLS0gYmludXRpbHMgY29tbW9uIGluY2x1ZGUgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLSNpZm5kZWYgX0JVQ09NTV9ICi0jZGVmaW5lIF9CVUNPTU1fSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi1leHRlcm4gY2hhciAqc3RyY2hyICgpOwotZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NCUksKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLWV4dGVybiBjaGFyICpzYnJrICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi1leHRlcm4gY2hhciAqZ2V0ZW52ICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLSNlbmRpZgotCi0jaWZuZGVmIE9fUkRPTkxZCi0jZGVmaW5lIE9fUkRPTkxZIDAKLSNlbmRpZgotCi0jaWZuZGVmIE9fUkRXUgotI2RlZmluZSBPX1JEV1IgMgotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0jaWZuZGVmIFNFRUtfQ1VSCi0jZGVmaW5lIFNFRUtfQ1VSIDEKLSNlbmRpZgotI2lmbmRlZiBTRUVLX0VORAotI2RlZmluZSBTRUVLX0VORCAyCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZiBkZWZpbmVkKEhBVkVfQUxMT0NBX0gpICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi0jICAgaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX19ocHV4KQotY2hhciAqYWxsb2NhICgpOwotIyAgIGVsc2UKLXZvaWQgKmFsbG9jYSAoKTsKLSMgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICBlbmRpZiAvKiBhbGxvY2EgKi8KLSMgZW5kaWYgLyogSEFWRV9BTExPQ0FfSCAqLwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLQotLyogYnVjb21tLmMgKi8KLXZvaWQgYmZkX25vbmZhdGFsIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwotCi12b2lkIGJmZF9mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKLQotdm9pZCBmYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICosIC4uLikpOwotCi12b2lkIG5vbl9mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICosIC4uLikpOwotCi12b2lkIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyBQQVJBTVMgKChjaGFyICoqcCkpOwotCi12b2lkIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBGSUxFICopKTsKLQotdm9pZCBwcmludF9hcmVsdF9kZXNjciBQQVJBTVMgKChGSUxFICpmaWxlLCBiZmQgKmFiZmQsIGJvb2xlYW4gdmVyYm9zZSkpOwotCi1jaGFyICptYWtlX3RlbXBuYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi1iZmRfdm1hIHBhcnNlX3ZtYSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBmaWxlbW9kZS5jICovCi12b2lkIG1vZGVfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbW9kZSwgY2hhciAqYnVmKSk7Ci0KLS8qIHZlcnNpb24uYyAqLwotZXh0ZXJuIHZvaWQgcHJpbnRfdmVyc2lvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogcmVuYW1lLmMgKi8KLWV4dGVybiB2b2lkIHNldF90aW1lcyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBzdGF0ICopKTsKLQotZXh0ZXJuIGludCBzbWFydF9yZW5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi0vKiBsaWJpYmVydHkgKi8KLVBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1QVFIgeHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLQotI2VuZGlmIC8qIF9CVUNPTU1fSCAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYnVkYmcuaCBiL2JpbnV0aWxzL2J1ZGJnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZWU4ODkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYnVkYmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIGJ1ZGJnLmMgLS0gSW50ZXJmYWNlcyB0byB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcm91dGluZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBCVURCR19ICi0jZGVmaW5lIEJVREJHX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFJvdXRpbmUgdXNlZCB0byByZWFkIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIFBUUiByZWFkX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nKSk7Ci0KLS8qIFJvdXRpbmUgdXNlZCB0byBwcmludCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIHByaW50X2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKEZJTEUgKiwgUFRSKSk7Ci0KLS8qIFJvdXRpbmVzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgc3RhYnMgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gUFRSIHN0YXJ0X3N0YWIgUEFSQU1TICgoUFRSLCBiZmQgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKiwgbG9uZykpOwotCi1leHRlcm4gYm9vbGVhbiBmaW5pc2hfc3RhYiBQQVJBTVMgKChQVFIsIFBUUikpOwotCi1leHRlcm4gYm9vbGVhbiBwYXJzZV9zdGFiIFBBUkFNUyAoKFBUUiwgUFRSLCBpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci0KLWV4dGVybiBib29sZWFuIHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGJmZF9ieXRlICoqLCBiZmRfc2l6ZV90eXBlICosIGJmZF9ieXRlICoqLAotCSAgIGJmZF9zaXplX3R5cGUgKikpOwotCi0vKiBSb3V0aW5lcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gcGFyc2VfaWVlZQotICBQQVJBTVMgKChQVFIsIGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLWV4dGVybiBib29sZWFuIHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0vKiBSb3V0aW5lIHVzZWQgdG8gcmVhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIHBhcnNlX2NvZmYgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGxvbmcsIFBUUikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvZmZkdW1wLmMgYi9iaW51dGlscy9jb2ZmZHVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzg0ZDUwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvZmZkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyogQ29mZiBmaWxlIGR1bXBlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBtb2R1bGUgcmVhZHMgYSB0eXBlIHRyZWUgZ2VuZXJhdGVkIGJ5IGNvZmZncm9rIGFuZCBwcmludHMKLSAgIGl0IG91dCBzbyB3ZSBjYW4gdGVzdCB0aGUgZ3Jva2tlci4KLSovCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLQotI2luY2x1ZGUgImNvZmZncm9rLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OICIxLjAiCi0KLXN0YXRpYyBpbnQgYXRubDsKLXN0YXRpYyB2b2lkIGR1bXBfY29mZl9zY29wZSAoKTsKLQotc3RhdGljIHZvaWQKLXRhYiAoeCkKLWludCB4OwotewotICBzdGF0aWMgaW50IGluZGVudDsKLSAgaW50IGk7Ci0KLSAgaWYgKGF0bmwpCi0gICAgewotICAgICAgaWYgKHggPCAwKQotCXsKLQkgIHByaW50ZiAoIikiKTsKLQkgIGluZGVudCArPSB4OwotCi0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIlxuIik7Ci0JICBhdG5sID0gMDsKLQl9Ci0gICAgfQotCi0gIGlmICh4ID09IC0xKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLQlwcmludGYgKCIgICAiKTsKLQotICAgICAgaW5kZW50ICs9IHg7Ci0gICAgICBwcmludGYgKCIpIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluZGVudCArPSB4OwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICBwcmludGYgKCIgICAiKTsKLQotICBpZiAoeCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIoIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBubCAoKQotewotICBhdG5sID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9saW5lcyAocCkKLSAgICAgc3RydWN0IGNvZmZfbGluZSAqcDsKLXsKLSAgaW50IGk7Ci0gIGludCBvbmxpbmUgPSAwOwotICB0YWIoMSk7Ci0gIHByaW50ZihfKCIjbGluZXMgJWQgIikscC0+bmxpbmVzKTsKLSAgZm9yIChpID0gMDsgaSA8IHAtPm5saW5lczsgaSsrKSAKLSAgICB7Ci0gICAgICBwcmludGYoIiglZCAweCV4KSIsIHAtPmxpbmVzW2ldLCBwLT5hZGRyZXNzZXNbaV0pOwotICAgICAgb25saW5lKys7Ci0gICAgICBpZiAob25saW5lID4gNikKLQl7Ci0JICBubCgpOwotCSAgdGFiKDApOwotCSAgb25saW5lID0gMDsKLQl9Ci0gICAgfQotICBubCgpOwotICB0YWIoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3R5cGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoInNpemUgJWQgIiwgcC0+c2l6ZSk7Ci0gIHN3aXRjaCAocC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3NlY2RlZl90eXBlOgotICAgICAgcHJpbnRmICgic2VjdGlvbiBkZWZpbml0aW9uIGF0ICV4IHNpemUgJXhcbiIsIAotCSAgICAgIHAtPnUuYXNlY2RlZi5hZGRyZXNzLAotCSAgICAgIHAtPnUuYXNlY2RlZi5zaXplKTsKLSAgICAgIG5sKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfcG9pbnRlcl90eXBlOgotICAgICAgcHJpbnRmICgicG9pbnRlciB0byIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5wb2ludGVyLnBvaW50c190byk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKLSAgICAgIHByaW50ZiAoImFycmF5IFslZF0gb2YiLCBwLT51LmFycmF5LmRpbSk7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl90eXBlIChwLT51LmFycmF5LmFycmF5X29mKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9mdW5jdGlvbl90eXBlOgotICAgICAgcHJpbnRmICgiZnVuY3Rpb24gcmV0dXJuaW5nIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl90eXBlIChwLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMpOwotICAgICAgZHVtcF9jb2ZmX2xpbmVzIChwLT51LmZ1bmN0aW9uLmxpbmVzKTsKLSAgICAgIHByaW50ZiAoImFyZ3VtZW50cyIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuZnVuY3Rpb24ucGFyYW1ldGVycyk7Ci0gICAgICB0YWIgKDApOwotICAgICAgcHJpbnRmICgiY29kZSIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuZnVuY3Rpb24uY29kZSk7Ci0gICAgICB0YWIoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0ZGVmX3R5cGU6Ci0gICAgICBwcmludGYgKCJzdHJ1Y3R1cmUgZGVmaW5pdGlvbiIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuYXN0cnVjdGRlZi5lbGVtZW50cyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0cmVmX3R5cGU6Ci0gICAgICBpZiAoIXAtPnUuYWVudW1yZWYucmVmKQotCXByaW50ZiAoInN0cnVjdHVyZSByZWYgdG8gVU5LTk9XTiBzdHJ1Y3QiKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCJzdHJ1Y3R1cmUgcmVmIHRvICVzIiwgcC0+dS5hZW51bXJlZi5yZWYtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1yZWZfdHlwZToKLSAgICAgIHByaW50ZiAoImVudW0gcmVmIHRvICVzIiwgcC0+dS5hc3RydWN0cmVmLnJlZi0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZW51bWRlZl90eXBlOgotICAgICAgcHJpbnRmICgiZW51bSBkZWZpbml0aW9uIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+dS5hZW51bWRlZi5lbGVtZW50cyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfYmFzaWNfdHlwZToKLSAgICAgIHN3aXRjaCAocC0+dS5iYXNpYykKLQl7Ci0JY2FzZSBUX05VTEw6Ci0JICBwcmludGYgKCJOVUxMIik7Ci0JICBicmVhazsKLQljYXNlIFRfVk9JRDoKLQkgIHByaW50ZiAoIlZPSUQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9DSEFSOgotCSAgcHJpbnRmICgiQ0hBUiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1NIT1JUOgotCSAgcHJpbnRmICgiU0hPUlQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9JTlQ6Ci0JICBwcmludGYgKCJJTlQgIik7Ci0JICBicmVhazsKLQljYXNlIFRfTE9ORzoKLQkgIHByaW50ZiAoIkxPTkciKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9GTE9BVDoKLQkgIHByaW50ZiAoIkZMT0FUIik7Ci0JICBicmVhazsKLQljYXNlIFRfRE9VQkxFOgotCSAgcHJpbnRmICgiRE9VQkxFIik7Ci0JICBicmVhazsKLQljYXNlIFRfU1RSVUNUOgotCSAgcHJpbnRmICgiU1RSVUNUIik7Ci0JICBicmVhazsKLQljYXNlIFRfVU5JT046Ci0JICBwcmludGYgKCJVTklPTiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0VOVU06Ci0JICBwcmludGYgKCJFTlVNIik7Ci0JICBicmVhazsKLQljYXNlIFRfTU9FOgotCSAgcHJpbnRmICgiTU9FICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VDSEFSOgotCSAgcHJpbnRmICgiVUNIQVIiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VU0hPUlQ6Ci0JICBwcmludGYgKCJVU0hPUlQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VSU5UOgotCSAgcHJpbnRmICgiVUlOVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VMT05HOgotCSAgcHJpbnRmICgiVUxPTkciKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9MTkdEQkw6Ci0JICBwcmludGYgKCJMTkdEQkwiKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBubCAoKTsKLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfd2hlcmUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3doZXJlICpwOwotewotICB0YWIgKDEpOwotICBzd2l0Y2ggKHAtPndoZXJlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RhY2s6Ci0gICAgICBwcmludGYgKCJTdGFjayBvZmZzZXQgJXgiLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbW9yeToKLSAgICAgIHByaW50ZiAoIk1lbW9yeSBzZWN0aW9uICVzKyV4IiwgcC0+c2VjdGlvbi0+bmFtZSwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9yZWdpc3RlcjoKLSAgICAgIHByaW50ZiAoIlJlZ2lzdGVyICVkIiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OgotICAgICAgcHJpbnRmICgiU3RydWN0IE1lbWJlciBvZmZzZXQgJXgiLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOgotICAgICAgcHJpbnRmICgiRW51bSBNZW1iZXIgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV91bmtub3duOgotICAgICAgcHJpbnRmICgiVW5kZWZpbmVkIHN5bWJvbCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0cnRhZzoKLSAgICAgIHByaW50ZiAoIlNUUlRBRyIpOwotICAgIGNhc2UgY29mZl93aGVyZV9lbnRhZzoKLSAgICAgIHByaW50ZiAoIkVOVEFHIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfdHlwZWRlZjoKLSAgICAgIHByaW50ZiAoIlRZUEVERUYiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl92aXNpYmxlIChwKQotICAgICBzdHJ1Y3QgY29mZl92aXNpYmxlICpwOwotewotICB0YWIgKDEpOwotICBzd2l0Y2ggKHAtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2V4dF9kZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfZXh0X3JlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2V4dF9yZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfaW50X2RlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2ludF9kZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfY29tbW9uOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfY29tbW9uIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG86Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19hdXRvIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG9wYXJhbToKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2F1dG9wYXJhbSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX3JlZ3BhcmFtIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ2lzdGVyOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfcmVnaXN0ZXIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfdGFnOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfdGFnIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfbWVtYmVyX29mX2VudW0iKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLQotCi12b2lkCi1kdW1wX2NvZmZfc3ltYm9sIChwKQotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoIkxpc3Qgb2Ygc3ltYm9scyIpOwotICBubCAoKTsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFiICgxKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJTeW1ib2wgICVzLCB0YWcgJWQsIG51bWJlciAlZCIsIHAtPm5hbWUsIHAtPnRhZywgcC0+bnVtYmVyKTsKLSAgICAgIG5sICgpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiVHlwZSIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dHlwZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJXaGVyZSIpOwotICAgICAgZHVtcF9jb2ZmX3doZXJlIChwLT53aGVyZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJWaXNpYmxlIik7Ci0gICAgICBkdW1wX2NvZmZfdmlzaWJsZSAocC0+dmlzaWJsZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgICAgdGFiICgtMSk7Ci0gICAgfQotICB0YWIgKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9zY29wZSAocCkKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnA7Ci17Ci1pZiAocCkgewotICB0YWIgKDEpOwotICBwcmludGYgKCJMaXN0IG9mIGJsb2NrcyAlbHggIiwodW5zaWduZWQgbG9uZykgcCk7Ci0KLSAgaWYgKHAtPnNlYykgewotICAgIHByaW50ZiggIiAgJXMgJXguLiV4IiwgIHAtPnNlYy0+bmFtZSxwLT5vZmZzZXQsIHAtPm9mZnNldCArIHAtPnNpemUgLTEpOwotICB9Ci0gIG5sICgpOwotICB0YWIgKDApOwotICBwcmludGYgKCIqKioqKioqKioqKioqKioqKiIpOwotICBubCAoKTsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFiICgwKTsKLSAgICAgIHByaW50ZiAoInZhcnMgJWQiLCBwLT5udmFycyk7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zeW1ib2wgKHAtPnZhcnNfaGVhZCk7Ci0gICAgICBwcmludGYgKCJibG9ja3MiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT5saXN0X2hlYWQpOwotICAgICAgbmwgKCk7Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0KLSAgdGFiICgwKTsKLSAgcHJpbnRmICgiKioqKioqKioqKioqKioqKioiKTsKLSAgbmwgKCk7Ci0gIHRhYiAoLTEpOwotfQotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3NmaWxlIChwKQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqcDsKLXsKLSAgdGFiICgxKTsKLSAgcHJpbnRmICgiTGlzdCBvZiBzb3VyY2UgZmlsZXMiKTsKLSAgbmwgKCk7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYiAoMCk7Ci0gICAgICBwcmludGYgKCJTb3VyY2UgZmlsZSAlcyIsIHAtPm5hbWUpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnNjb3BlKTsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfc2VjdGlvbihwdHIpCi1zdHJ1Y3QgY29mZl9zZWN0aW9uICpwdHI7Ci17Ci0gIGludCBpOwotICB0YWIoMSk7Ci0gIHByaW50Zigic2VjdGlvbiAlcyAlZCAlZCBhZGRyZXNzICV4IHNpemUgJXggbnVtYmVyICVkIG5yZWxvY3MgJWQiLCAKLQkgcHRyLT5uYW1lLCBwdHItPmNvZGUsIHB0ci0+ZGF0YSwgcHRyLT5hZGRyZXNzLHB0ci0+c2l6ZSwgcHRyLT5udW1iZXIsIHB0ci0+bnJlbG9jcyk7Ci0gIG5sKCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHB0ci0+bnJlbG9jczsgaSsrKSAKLSAgICB7Ci0gICAgICB0YWIoMCk7ICAgIAotICAgICAgcHJpbnRmKCIoJXggJXMgJXgpIiwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLm9mZnNldCwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLnN5bWJvbC0+bmFtZSwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLmFkZGVuZCk7Ci0gICAgICBubCgpOwotICAgIH0KLSAgdGFiKC0xKTsKLQotfQotCi12b2lkCi1jb2ZmX2R1bXAgKHB0cikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIHByaW50ZiAoIkNvZmYgZHVtcCIpOwotICBubCAoKTsKLSAgcHJpbnRmICgiI3NvdWNlcyAlZCIsIHB0ci0+bnNvdXJjZXMpOwotICBubCAoKTsKLSAgZHVtcF9jb2ZmX3NmaWxlIChwdHItPnNvdXJjZV9oZWFkKTsKLSAgZm9yIChpID0gMDsgaSA8IHB0ci0+bnNlY3Rpb25zOyBpKyspCi0gICAgZHVtcF9jb2ZmX3NlY3Rpb24ocHRyLT5zZWN0aW9ucyArIGkpOwotfQotCi0KLQotY2hhciAqIHByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgIlVzYWdlOiAlcyBbLWhWXSBpbi1maWxlXG4iLCAgIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogUHJpbnQgYSBodW1hbiByZWFkYWJsZSBpbnRlcnByZXRhdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICphdltdOwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0gIGNoYXIgKmlucHV0X2ZpbGUgPSBOVUxMOwotICBpbnQgb3B0OwotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci0gICAgewotICAgICAgeyAiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCcgfSwKLSAgICAgIHsgInZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnIH0sCi0gICAgICB7IE5VTEwsIG5vX2FyZ3VtZW50LCAwLCAwIH0KLSAgICB9OwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhYywgYXYsICJoViIsIGxvbmdfb3B0aW9ucywKLQkJCSAgICAgKGludCAqKSBOVUxMKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAnVic6Ci0JICBwcmludGYgKF8oIkdOVSAlcyB2ZXJzaW9uICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBQUk9HUkFNX1ZFUlNJT04pOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEKi8KLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlID0gYXZbb3B0aW5kXTsKLSAgICB9Ci0KLSAgaWYgKCFpbnB1dF9maWxlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVycixfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIGFiZmQgPSBiZmRfb3BlbnIgKGlucHV0X2ZpbGUsIDApOwotCi0gIGlmICghYWJmZCkKLSAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgdHJlZSA9IGNvZmZfZ3JvayAoYWJmZCk7Ci0KLSAgY29mZl9kdW1wKHRyZWUpOwotICBwcmludGYoIlxuIik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmdyb2suYyBiL2JpbnV0aWxzL2NvZmZncm9rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGU2YzkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29mZmdyb2suYworKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vKiBjb2ZmZ3Jvay5jCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLQotICAgVGhpcyBtb2R1bGUgcmVhZHMgYSBjb2ZmIGZpbGUgYW5kIGJ1aWxkcyBhIHJlYWxseSBzaW1wbGUgdHlwZSB0cmVlCi0gICB3aGljaCBjYW4gYmUgcmVhZCBieSBvdGhlciBwcm9ncmFtcy4gIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiBpcyBhCi0gICBjb2ZmLT5zeXNyb2ZmIGNvbnZlcnRlci4gIEl0IGNhbiBiZSB0ZXN0ZWQgd2l0aCBjb2ZmZHVtcC5jLgotCi0qLwotCi0jaW5jbHVkZSA8YmZkLmg+Ci0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmZ3Jvay5oIgotaW50IGxvZmlsZSA9IDE7Ci1zdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKnRvcF9zY29wZTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9zY29wZSAqZmlsZV9zY29wZTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9vZmlsZSAqb2ZpbGU7Ci0KLXN0cnVjdCBjb2ZmX3N5bWJvbCAqbGFzdF9mdW5jdGlvbl9zeW1ib2w7Ci1zdHJ1Y3QgY29mZl90eXBlICpsYXN0X2Z1bmN0aW9uX3R5cGU7Ci1zdHJ1Y3QgY29mZl90eXBlICpsYXN0X3N0cnVjdDsKLXN0cnVjdCBjb2ZmX3R5cGUgKmxhc3RfZW51bTsKLXN0cnVjdCBjb2ZmX3NmaWxlICpjdXJfc2ZpbGU7Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9zeW1ib2wgKip0aW5kZXg7Ci0KLQotc3RhdGljIGFzeW1ib2wgKipzeW1zOwotc3RhdGljIGxvbmcgc3ltY291bnQ7Ci0KLSNkZWZpbmUgTih4KSAoKHgpLT5fbi5fbl9ucHRyWzFdKQotCi1zdGF0aWMgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3c3ltczsKLXN0YXRpYyBpbnQgcmF3Y291bnQ7Ci1zdGF0aWMgYmZkICphYmZkOwotZXh0ZXJuIGNoYXIgKnhjYWxsb2MgKCk7Ci0jZGVmaW5lIFBUUl9TSVpFIAk0Ci0jZGVmaW5lIFNIT1JUX1NJWkUgCTIKLSNkZWZpbmUgSU5UX1NJWkUgCTQKLSNkZWZpbmUgTE9OR19TSVpFIAk0Ci0jZGVmaW5lIEZMT0FUX1NJWkUgCTQKLSNkZWZpbmUgRE9VQkxFX1NJWkUgCTgKLQotI2RlZmluZSBJTkRFWE9GKHApICAoKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikocCktKHJhd3N5bXMpKQotCi1zdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKgotZW1wdHlfc2NvcGUgKCkKLXsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKmw7Ci0gIGwgPSAoc3RydWN0IGNvZmZfc2NvcGUgKikgKHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc2NvcGUpLCAxKSk7Ci0gIHJldHVybiBsOwotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfc3ltYm9sICoKLWVtcHR5X3N5bWJvbCAoKQotewotICByZXR1cm4gKHN0cnVjdCBjb2ZmX3N5bWJvbCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1ib2wpLCAxKSk7Ci19Ci0KLS8qaW50IGw7Ki8KLXN0YXRpYyB2b2lkCi1wdXNoX3Njb3BlIChsaW5rKQotICAgICBpbnQgbGluazsKLXsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKm4gPSBlbXB0eV9zY29wZSAoKTsKLSAgaWYgKGxpbmspCi0gICAgewotICAgICAgaWYgKHRvcF9zY29wZSkKLQl7Ci0JICBpZiAodG9wX3Njb3BlLT5saXN0X3RhaWwpCi0JICAgIHsKLQkgICAgICB0b3Bfc2NvcGUtPmxpc3RfdGFpbC0+bmV4dCA9IG47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHRvcF9zY29wZS0+bGlzdF9oZWFkID0gbjsKLQkgICAgfQotCSAgdG9wX3Njb3BlLT5saXN0X3RhaWwgPSBuOwotCX0KLSAgICB9Ci0gIG4tPnBhcmVudCA9IHRvcF9zY29wZTsKLQotICB0b3Bfc2NvcGUgPSBuOwotfQotCi1zdGF0aWMgdm9pZAotcG9wX3Njb3BlICgpCi17Ci0gIHRvcF9zY29wZSA9IHRvcF9zY29wZS0+cGFyZW50OwotfQotCi1zdGF0aWMgdm9pZAotZG9fc2VjdGlvbnNfcDEgKGhlYWQpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IGlkeDsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqYWxsID0gKHN0cnVjdCBjb2ZmX3NlY3Rpb24gKikgKHhjYWxsb2MgKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxLAotCQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbikpKTsKLSAgaGVhZC0+bnNlY3Rpb25zID0gYWJmZC0+c2VjdGlvbl9jb3VudCArIDE7Ci0gIGhlYWQtPnNlY3Rpb25zID0gYWxsOwotCi0gIGZvciAoaWR4ID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCwgaWR4KyspCi0gICAgewotICAgICAgbG9uZyByZWxzaXplOwotICAgICAgaW50IGkgPSBzZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBhcmVsZW50ICoqcmVscHA7Ci0gICAgICBsb25nIHJlbGNvdW50OwotCi0gICAgICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBpZiAocmVsc2l6ZSA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBpZiAocmVsc2l6ZSA9PSAwKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwcCwgc3ltcyk7Ci0gICAgICBpZiAocmVsY291bnQgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5uYW1lID0gKGNoYXIgKikgKHNlY3Rpb24tPm5hbWUpOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uY29kZSA9IHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREU7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5kYXRhID0gc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQTsKLSAgICAgIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuYnNzIikgPT0gMCkKLQloZWFkLT5zZWN0aW9uc1tpXS5kYXRhID0gMTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmFkZHJlc3MgPSBzZWN0aW9uLT5sbWE7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubnVtYmVyID0gaWR4OwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubnJlbG9jcyA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ucmVsb2NzID0KLQkoc3RydWN0IGNvZmZfcmVsb2MgKikgKHhjYWxsb2MgKHNlY3Rpb24tPnJlbG9jX2NvdW50LAotCQkJCQlzaXplb2YgKHN0cnVjdCBjb2ZmX3JlbG9jKSkpOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uYmZkX3NlY3Rpb24gPSBzZWN0aW9uOwotICAgIH0KLSAgaGVhZC0+c2VjdGlvbnNbMF0ubmFtZSA9ICJBQlNPTFVURSI7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLmNvZGUgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5kYXRhID0gMDsKLSAgaGVhZC0+c2VjdGlvbnNbMF0uYWRkcmVzcyA9IDA7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLnNpemUgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5udW1iZXIgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotZG9fc2VjdGlvbnNfcDIgKGhlYWQpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKLQl7Ci0JICBpbnQgaWR4OwotCSAgaW50IGkgPSBzZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBzdHJ1Y3QgY29mZl9yZWxvYyAqciA9IGhlYWQtPnNlY3Rpb25zW2ldLnJlbG9jcyArIGo7Ci0JICBhcmVsZW50ICpzciA9IHNlY3Rpb24tPnJlbG9jYXRpb24gKyBqOwotCSAgci0+b2Zmc2V0ID0gc3ItPmFkZHJlc3M7Ci0JICByLT5hZGRlbmQgPSBzci0+YWRkZW5kOwotCSAgaWR4ID0gKChjb2ZmX3N5bWJvbF90eXBlICopIChzci0+c3ltX3B0cl9wdHJbMF0pKS0+bmF0aXZlIC0gcmF3c3ltczsKLQkgIHItPnN5bWJvbCA9IHRpbmRleFtpZHhdOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl93aGVyZSAqCi1kb193aGVyZSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotICBzdHJ1Y3QgY29mZl93aGVyZSAqd2hlcmUgPQotICAgIChzdHJ1Y3QgY29mZl93aGVyZSAqKSAoeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl93aGVyZSkpKTsKLSAgd2hlcmUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZTsKLQotICBpZiAoc3ltLT5uX3NjbnVtID09IC0xKQotICAgIHN5bS0+bl9zY251bSA9IDA7Ci0KLSAgc3dpdGNoIChzeW0tPm5fc2NsYXNzKQotICAgIHsKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q7Ci0gICAgICB3aGVyZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlIC8gODsKLSAgICAgIHdoZXJlLT5iaXRvZmZzZXQgPSBzeW0tPm5fdmFsdWUgJSA4OwotICAgICAgd2hlcmUtPmJpdHNpemUgPSByYXdzeW1zW2kgKyAxXS51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19NT0U6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX01PUzoKLSAgICBjYXNlIENfTU9VOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0FVVE86Ci0gICAgY2FzZSBDX0FSRzoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfc3RhY2s7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfRVhUOgotICAgIGNhc2UgQ19TVEFUOgotICAgIGNhc2UgQ19FWFRERUY6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1vcnk7Ci0gICAgICB3aGVyZS0+c2VjdGlvbiA9ICZvZmlsZS0+c2VjdGlvbnNbc3ltLT5uX3NjbnVtXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9lbnRhZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9zdHJ0YWc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3R5cGVkZWY7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB3aGVyZTsKLX0KLQotc3RhdGljCi1zdHJ1Y3QgY29mZl9saW5lICoKLWRvX2xpbmVzIChpLCBuYW1lKQotICAgICBpbnQgaTsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGNvZmZfbGluZSAqcmVzID0gKHN0cnVjdCBjb2ZmX2xpbmUgKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5lKSwgMSk7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgbDsKLQotICAvKiBGaW5kIG91dCBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhbnkgbGluZSBudW1iZXJzIGluIHRoZSB0YWJsZSAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgZm9yIChsID0gMDsgbCA8IHMtPmxpbmVub19jb3VudDsgbCsrKQotCXsKLQkgIGlmIChzLT5saW5lbm9bbF0ubGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChyYXdzeW1zICsgaSA9PSAoKGNvZmZfc3ltYm9sX3R5cGUgKikgKCYocy0+bGluZW5vW2xdLnUuc3ltWzBdKSkpLT5uYXRpdmUpCi0JCXsKLQkJICAvKiBUaGVzZSBsaW5lcyBhcmUgZm9yIHRoaXMgZnVuY3Rpb24gLSBzbyBjb3VudCB0aGVtIGFuZCBzdGljayB0aGVtIG9uICovCi0JCSAgaW50IGMgPSAwOwotCQkgIC8qIEZpbmQgdGhlIGxpbmVudW1iZXIgb2YgdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24sIHNpbmNlIGNvZmYgbGluZW51bWJlcnMKLQkJICAgICBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gKi8KLQkJICBpbnQgc3RhcnRfbGluZSA9IHJhd3N5bXNbaSArIDNdLnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOwotCi0JCSAgbCsrOwotCQkgIGZvciAoYyA9IDA7IHMtPmxpbmVub1tsICsgYyArIDFdLmxpbmVfbnVtYmVyOyBjKyspCi0JCSAgICA7Ci0KLQkJICAvKiBBZGQgdHdvIGV4dHJhIHJlY29yZHMsIG9uZSBmb3IgdGhlIHByb2xvZ3VlIGFuZCBvbmUgZm9yIHRoZSBlcGlsb2d1ZSAqLwotCQkgIGMgKz0gMTsKLQkJICByZXMtPm5saW5lcyA9IGM7Ci0JCSAgcmVzLT5saW5lcyA9IChpbnQgKikgKHhjYWxsb2MgKHNpemVvZiAoaW50KSwgYykpOwotCQkgIHJlcy0+YWRkcmVzc2VzID0gKGludCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChpbnQpLCBjKSk7Ci0JCSAgcmVzLT5saW5lc1swXSA9IHN0YXJ0X2xpbmU7Ci0JCSAgcmVzLT5hZGRyZXNzZXNbMF0gPSByYXdzeW1zW2ldLnUuc3ltZW50Lm5fdmFsdWUgLSBzLT52bWE7Ci0JCSAgZm9yIChjID0gMDsgcy0+bGluZW5vW2wgKyBjICsgMV0ubGluZV9udW1iZXI7IGMrKykKLQkJICAgIHsKLQkJICAgICAgcmVzLT5saW5lc1tjICsgMV0gPSBzLT5saW5lbm9bbCArIGNdLmxpbmVfbnVtYmVyICsgc3RhcnRfbGluZSAtIDE7Ci0JCSAgICAgIHJlcy0+YWRkcmVzc2VzW2MgKyAxXSA9IHMtPmxpbmVub1tsICsgY10udS5vZmZzZXQ7Ci0JCSAgICB9Ci0JCSAgcmV0dXJuIHJlczsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljCi1zdHJ1Y3QgY29mZl90eXBlICoKLWRvX3R5cGUgKGkpCi0gICAgIGludCBpOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXggPSAmcmF3c3ltc1tpICsgMV0udS5hdXhlbnQ7Ci0gIHN0cnVjdCBjb2ZmX3R5cGUgKnJlcyA9Ci0gICAgKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7Ci0gIGludCB0eXBlID0gc3ltLT5uX3R5cGU7Ci0gIGludCB3aGljaF9kdCA9IDA7Ci0gIGludCBkaW1pbmQgPSAwOwotCi0gIHJlcy0+dHlwZSA9IGNvZmZfYmFzaWNfdHlwZTsKLSAgcmVzLT51LmJhc2ljID0gdHlwZSAmIDB4ZjsKLQotICBzd2l0Y2ggKHR5cGUgJiAweGYpCi0gICAgewotICAgIGNhc2UgVF9OVUxMOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgaWYgKHN5bS0+bl9udW1hdXggJiYgc3ltLT5uX3NjbGFzcyA9PSBDX1NUQVQpCi0JewotCSAgLyogVGhpcyBpcyBwcm9iYWJseSBhIHNlY3Rpb24gZGVmaW5pdGlvbiAqLwotCSAgcmVzLT50eXBlID0gY29mZl9zZWNkZWZfdHlwZTsKLQkgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zY24ueF9zY25sZW47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICh0eXBlID09IDApCi0JICAgIHsKLQkgICAgICAvKiBEb24ndCBrbm93IHdoYXQgdGhpcyBpcywgbGV0J3MgbWFrZSBpdCBhIHNpbXBsZSBpbnQgKi8KLQkgICAgICByZXMtPnNpemUgPSBJTlRfU0laRTsKLQkgICAgICByZXMtPnUuYmFzaWMgPSBUX1VJTlQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEVsc2UgaXQgY291bGQgYmUgYSBmdW5jdGlvbiBvciBwb2ludGVyIHRvIHZvaWQgKi8KLQkgICAgICByZXMtPnNpemUgPSAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX1VDSEFSOgotICAgIGNhc2UgVF9DSEFSOgotICAgICAgcmVzLT5zaXplID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VU0hPUlQ6Ci0gICAgY2FzZSBUX1NIT1JUOgotICAgICAgcmVzLT5zaXplID0gU0hPUlRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VSU5UOgotICAgIGNhc2UgVF9JTlQ6Ci0gICAgICByZXMtPnNpemUgPSBJTlRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VTE9ORzoKLSAgICBjYXNlIFRfTE9ORzoKLSAgICAgIHJlcy0+c2l6ZSA9IExPTkdfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9GTE9BVDoKLSAgICAgIHJlcy0+c2l6ZSA9IEZMT0FUX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgcmVzLT5zaXplID0gRE9VQkxFX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfU1RSVUNUOgotICAgIGNhc2UgVF9VTklPTjoKLSAgICAgIGlmIChzeW0tPm5fbnVtYXV4KQotCXsKLQkgIGlmIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApCi0JICAgIHsKLQkgICAgICAvKiBSZWZlcmluZyB0byBhIHN0cnVjdCBkZWZpbmVkIGVsc2V3aGVyZSAqLwotCSAgICAgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0cmVmX3R5cGU7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RyZWYucmVmID0gdGluZGV4W0lOREVYT0YgKGF1eC0+eF9zeW0ueF90YWduZHgucCldOwotCSAgICAgIHJlcy0+c2l6ZSA9IHJlcy0+dS5hc3RydWN0cmVmLnJlZiA/Ci0JCXJlcy0+dS5hc3RydWN0cmVmLnJlZi0+dHlwZS0+c2l6ZSA6IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEEgZGVmaW5pdGlvbiBvZiBhIHN0cnVjdCAqLwotCSAgICAgIGxhc3Rfc3RydWN0ID0gcmVzOwotCSAgICAgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0ZGVmX3R5cGU7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMgPSBlbXB0eV9zY29wZSAoKTsKLQkgICAgICByZXMtPnUuYXN0cnVjdGRlZi5pZHggPSAwOwotCSAgICAgIHJlcy0+dS5hc3RydWN0ZGVmLmlzc3RydWN0ID0gKHR5cGUgJiAweGYpID09IFRfU1RSVUNUOwotCSAgICAgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gYXV4ZW50cyAtIGl0J3MgYW5vbnlubW91cyAqLwotCSAgcmVzLT50eXBlID0gY29mZl9zdHJ1Y3RyZWZfdHlwZTsKLQkgIHJlcy0+dS5hc3RydWN0cmVmLnJlZiA9IDA7Ci0JICByZXMtPnNpemUgPSAwOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9FTlVNOgotICAgICAgaWYgKGF1eC0+eF9zeW0ueF90YWduZHgucCkKLQl7Ci0JICAvKiBSZWZlcmluZyB0byBhIGVudW0gZGVmaW5lZCBlbHNld2hlcmUgKi8KLQkgIHJlcy0+dHlwZSA9IGNvZmZfZW51bXJlZl90eXBlOwotCSAgcmVzLT51LmFlbnVtcmVmLnJlZiA9IHRpbmRleFtJTkRFWE9GIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApXTsKLQkgIHJlcy0+c2l6ZSA9IHJlcy0+dS5hZW51bXJlZi5yZWYtPnR5cGUtPnNpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgZGVmaW5pdGlvbiBvZiBhbiBlbnVtICovCi0JICBsYXN0X2VudW0gPSByZXM7Ci0JICByZXMtPnR5cGUgPSBjb2ZmX2VudW1kZWZfdHlwZTsKLQkgIHJlcy0+dS5hZW51bWRlZi5lbGVtZW50cyA9IGVtcHR5X3Njb3BlICgpOwotCSAgcmVzLT5zaXplID0gYXV4LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfTU9FOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGZvciAod2hpY2hfZHQgPSA1OyB3aGljaF9kdCA+PSAwOyB3aGljaF9kdC0tKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKHR5cGUgPj4gKCh3aGljaF9kdCAqIDIpICsgNCkpICYgMHgzKQotCXsKLQljYXNlIDA6Ci0JICBicmVhazsKLQljYXNlIERUX0FSWToKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyID0gKChzdHJ1Y3QgY29mZl90eXBlICopCi0JCQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKSk7Ci0JICAgIGludCBlbHMgPSAoZGltaW5kIDwgRElNTlVNCi0JCSAgICAgICA/IGF1eC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbltkaW1pbmRdCi0JCSAgICAgICA6IDApOwotCSAgICArK2RpbWluZDsKLQkgICAgcHRyLT50eXBlID0gY29mZl9hcnJheV90eXBlOwotCSAgICBwdHItPnNpemUgPSBlbHMgKiByZXMtPnNpemU7Ci0JICAgIHB0ci0+dS5hcnJheS5kaW0gPSBlbHM7Ci0JICAgIHB0ci0+dS5hcnJheS5hcnJheV9vZiA9IHJlczsKLQkgICAgcmVzID0gcHRyOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIERUX1BUUjoKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyID0KLQkgICAgICAoc3RydWN0IGNvZmZfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKTsKLQkgICAgcHRyLT5zaXplID0gUFRSX1NJWkU7Ci0JICAgIHB0ci0+dHlwZSA9IGNvZmZfcG9pbnRlcl90eXBlOwotCSAgICBwdHItPnUucG9pbnRlci5wb2ludHNfdG8gPSByZXM7Ci0JICAgIHJlcyA9IHB0cjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBEVF9GQ046Ci0JICB7Ci0JICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnB0cgotCSAgICAgID0gKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7Ci0JICAgIHB0ci0+c2l6ZSA9IDA7Ci0JICAgIHB0ci0+dHlwZSA9IGNvZmZfZnVuY3Rpb25fdHlwZTsKLQkgICAgcHRyLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMgPSByZXM7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5wYXJhbWV0ZXJzID0gZW1wdHlfc2NvcGUgKCk7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5saW5lcyA9IGRvX2xpbmVzIChpLCBzeW0tPl9uLl9uX25wdHJbMV0pOwotCSAgICBwdHItPnUuZnVuY3Rpb24uY29kZSA9IDA7Ci0JICAgIGxhc3RfZnVuY3Rpb25fdHlwZSA9IHB0cjsKLQkgICAgcmVzID0gcHRyOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfdmlzaWJsZSAqCi1kb192aXNpYmxlIChpKQotICAgICBpbnQgaTsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0gIHN0cnVjdCBjb2ZmX3Zpc2libGUgKnZpc2libGUgPQotICAgIChzdHJ1Y3QgY29mZl92aXNpYmxlICopICh4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3Zpc2libGUpKSk7Ci0gIGVudW0gY29mZl92aXNfdHlwZSB0OwotICBzd2l0Y2ggKHN5bS0+bl9zY2xhc3MpCi0gICAgewotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PVToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICB0ID0gY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19NT0U6Ci0gICAgICB0ID0gY29mZl92aXNfbWVtYmVyX29mX2VudW07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgICAgdCA9IGNvZmZfdmlzX3JlZ3BhcmFtOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfUkVHOgotICAgICAgdCA9IGNvZmZfdmlzX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX1NUUlRBRzoKLSAgICBjYXNlIENfVU5UQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19UUERFRjoKLSAgICAgIHQgPSBjb2ZmX3Zpc190YWc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfQVVUT0FSRzoKLSAgICBjYXNlIENfQVJHOgotICAgICAgdCA9IGNvZmZfdmlzX2F1dG9wYXJhbTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19BVVRPOgotCi0KLSAgICAgIHQgPSBjb2ZmX3Zpc19hdXRvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgIGNhc2UgQ19TVEFUOgotICAgICAgdCA9IGNvZmZfdmlzX2ludF9kZWY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfRVhUOgotICAgICAgaWYgKHN5bS0+bl9zY251bSA9PSBOX1VOREVGKQotCXsKLQkgIGlmIChzeW0tPm5fdmFsdWUpCi0JICAgIHQgPSBjb2ZmX3Zpc19jb21tb247Ci0JICBlbHNlCi0JICAgIHQgPSBjb2ZmX3Zpc19leHRfcmVmOwotCX0KLSAgICAgIGVsc2UKLQl0ID0gY29mZl92aXNfZXh0X2RlZjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICB2aXNpYmxlLT50eXBlID0gdDsKLSAgcmV0dXJuIHZpc2libGU7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX2RlZmluZSAoaSwgYikKLSAgICAgaW50IGk7Ci0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpiOwotewotICBzdGF0aWMgaW50IHN5bWJvbF9pbmRleDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0KLSAgLyogRGVmaW5lIGEgc3ltYm9sIGFuZCBhdHRhY2ggdG8gYmxvY2sgYiAqLwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnMgPSBlbXB0eV9zeW1ib2wgKCk7Ci0KLSAgcy0+bnVtYmVyID0gKytzeW1ib2xfaW5kZXg7Ci0gIHMtPm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07Ci0gIHMtPnNmaWxlID0gY3VyX3NmaWxlOwotICAvKiBHbHVlIG9udG8gdGhlIG9maWxlIGxpc3QgKi8KLSAgaWYgKGxvZmlsZSA+PSAwKQotICAgIHsKLSAgICAgIGlmIChvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbCkKLQlvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbC0+bmV4dF9pbl9vZmlsZV9saXN0ID0gczsKLSAgICAgIGVsc2UKLQlvZmlsZS0+c3ltYm9sX2xpc3RfaGVhZCA9IHM7Ci0gICAgICBvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbCA9IHM7Ci0gICAgICAvKiBBbmQgdGhlIGJsb2NrIGxpc3QgKi8KLSAgICB9Ci0gIGlmIChiLT52YXJzX3RhaWwpCi0gICAgYi0+dmFyc190YWlsLT5uZXh0ID0gczsKLSAgZWxzZQotICAgIGItPnZhcnNfaGVhZCA9IHM7Ci0KLSAgYi0+dmFyc190YWlsID0gczsKLSAgYi0+bnZhcnMrKzsKLSAgcy0+dHlwZSA9IGRvX3R5cGUgKGkpOwotICBzLT53aGVyZSA9IGRvX3doZXJlIChpKTsKLSAgcy0+dmlzaWJsZSA9IGRvX3Zpc2libGUgKGkpOwotCi0gIHRpbmRleFtpXSA9IHM7Ci0KLSAgLyogV2UgcmVtZW1iZXIgdGhlIGxvd2VzdCBhZGRyZXNzIGluIGVhY2ggc2VjdGlvbiBmb3IgZWFjaCBzb3VyY2UgZmlsZSAqLwotCi0gIGlmIChzLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9tZW1vcnkKLSAgICAgICYmIHMtPnR5cGUtPnR5cGUgPT0gY29mZl9zZWNkZWZfdHlwZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9pc2VjdGlvbiAqaXMgPSBjdXJfc2ZpbGUtPnNlY3Rpb24gKyBzLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCi0gICAgICBpZiAoIWlzLT5pbml0KQotCXsKLQkgIGlzLT5sb3cgPSBzLT53aGVyZS0+b2Zmc2V0OwotCSAgaXMtPmhpZ2ggPSBzLT53aGVyZS0+b2Zmc2V0ICsgcy0+dHlwZS0+c2l6ZTsKLQkgIGlzLT5pbml0ID0gMTsKLQkgIGlzLT5wYXJlbnQgPSBzLT53aGVyZS0+c2VjdGlvbjsKLQl9Ci0KLSAgICB9Ci0KLSAgaWYgKHMtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotICAgIGxhc3RfZnVuY3Rpb25fc3ltYm9sID0gczsKLQotICByZXR1cm4gaSArIHN5bS0+bl9udW1hdXggKyAxOwotfQotCi0KLXN0YXRpYwotc3RydWN0IGNvZmZfb2ZpbGUgKgotZG9pdCAoKQotewotICBpbnQgaTsKLSAgaW50IGluZmlsZSA9IDA7Ci0gIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkID0KLSAgKHN0cnVjdCBjb2ZmX29maWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfb2ZpbGUpKTsKLSAgb2ZpbGUgPSBoZWFkOwotICBoZWFkLT5zb3VyY2VfaGVhZCA9IDA7Ci0gIGhlYWQtPnNvdXJjZV90YWlsID0gMDsKLSAgaGVhZC0+bnNvdXJjZXMgPSAwOwotICBoZWFkLT5zeW1ib2xfbGlzdF90YWlsID0gMDsKLSAgaGVhZC0+c3ltYm9sX2xpc3RfaGVhZCA9IDA7Ci0gIGRvX3NlY3Rpb25zX3AxIChoZWFkKTsKLSAgcHVzaF9zY29wZSAoMSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJhd2NvdW50OykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgICAgIHN3aXRjaCAoc3ltLT5uX3NjbGFzcykKLQl7Ci0JY2FzZSBDX0ZJTEU6Ci0JICB7Ci0JICAgIC8qIG5ldyBzb3VyY2UgZmlsZSBhbm5vdW5jZWQgKi8KLQkgICAgc3RydWN0IGNvZmZfc2ZpbGUgKm4gPQotCSAgICAgIChzdHJ1Y3QgY29mZl9zZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3NmaWxlKSk7Ci0JICAgIG4tPnNlY3Rpb24gPSAoc3RydWN0IGNvZmZfaXNlY3Rpb24gKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9pc2VjdGlvbiksIGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKTsKLQkgICAgY3VyX3NmaWxlID0gbjsKLQkgICAgbi0+bmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLQkgICAgbi0+bmV4dCA9IDA7Ci0KLQkgICAgaWYgKGluZmlsZSkKLQkgICAgICB7Ci0JCXBvcF9zY29wZSAoKTsKLQkgICAgICB9Ci0JICAgIGluZmlsZSA9IDE7Ci0JICAgIHB1c2hfc2NvcGUgKDEpOwotCSAgICBmaWxlX3Njb3BlID0gbi0+c2NvcGUgPSB0b3Bfc2NvcGU7Ci0KLQkgICAgaWYgKGhlYWQtPnNvdXJjZV90YWlsKQotCSAgICAgIGhlYWQtPnNvdXJjZV90YWlsLT5uZXh0ID0gbjsKLQkgICAgZWxzZQotCSAgICAgIGhlYWQtPnNvdXJjZV9oZWFkID0gbjsKLQkgICAgaGVhZC0+c291cmNlX3RhaWwgPSBuOwotCSAgICBoZWFkLT5uc291cmNlcysrOwotCSAgICBpICs9IHN5bS0+bl9udW1hdXggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDX0ZDTjoKLQkgIHsKLQkgICAgY2hhciAqbmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLQkgICAgaWYgKG5hbWVbMV0gPT0gJ2InKQotCSAgICAgIHsKLQkJLyogRnVuY3Rpb24gc3RhcnQgKi8KLQkJcHVzaF9zY29wZSAoMCk7Ci0JCWxhc3RfZnVuY3Rpb25fdHlwZS0+dS5mdW5jdGlvbi5jb2RlID0gdG9wX3Njb3BlOwotCQl0b3Bfc2NvcGUtPnNlYyA9IG9maWxlLT5zZWN0aW9ucyArIHN5bS0+bl9zY251bTsKLQkJdG9wX3Njb3BlLT5vZmZzZXQgPSBzeW0tPm5fdmFsdWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl0b3Bfc2NvcGUtPnNpemUgPSBzeW0tPm5fdmFsdWUgLSB0b3Bfc2NvcGUtPm9mZnNldCArIDE7Ci0JCXBvcF9zY29wZSAoKTsKLQotCSAgICAgIH0KLQkgICAgaSArPSBzeW0tPm5fbnVtYXV4ICsgMTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDX0JMT0NLOgotCSAgewotCSAgICBjaGFyICpuYW1lID0gc3ltLT5fbi5fbl9ucHRyWzFdOwotCSAgICBpZiAobmFtZVsxXSA9PSAnYicpCi0JICAgICAgewotCQkvKiBCbG9jayBzdGFydCAqLwotCQlwdXNoX3Njb3BlICgxKTsKLQkJdG9wX3Njb3BlLT5zZWMgPSBvZmlsZS0+c2VjdGlvbnMgKyBzeW0tPm5fc2NudW07Ci0JCXRvcF9zY29wZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlOwotCi0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl0b3Bfc2NvcGUtPnNpemUgPSBzeW0tPm5fdmFsdWUgLSB0b3Bfc2NvcGUtPm9mZnNldCArIDE7Ci0JCXBvcF9zY29wZSAoKTsKLQkgICAgICB9Ci0JICAgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIENfUkVHUEFSTToKLQljYXNlIENfQVJHOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9mdW5jdGlvbl9zeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24ucGFyYW1ldGVycyk7Ci0JICBicmVhazsKLQljYXNlIENfTU9TOgotCWNhc2UgQ19NT1U6Ci0JY2FzZSBDX0ZJRUxEOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9zdHJ1Y3QtPnUuYXN0cnVjdGRlZi5lbGVtZW50cyk7Ci0JICBicmVhazsKLQljYXNlIENfTU9FOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9lbnVtLT51LmFlbnVtZGVmLmVsZW1lbnRzKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19TVFJUQUc6Ci0JY2FzZSBDX0VOVEFHOgotCWNhc2UgQ19VTlRBRzoKLQkgIC8qIFZhcmlvdXMgZGVmaW5pdGlvbiAqLwotCSAgaSA9IGRvX2RlZmluZSAoaSwgdG9wX3Njb3BlKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19FWFQ6Ci0JY2FzZSBDX0xBQkVMOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgZmlsZV9zY29wZSk7Ci0JICBicmVhazsKLQljYXNlIENfU1RBVDoKLQljYXNlIENfVFBERUY6Ci0JY2FzZSBDX0FVVE86Ci0JY2FzZSBDX1JFRzoKLQkgIGkgPSBkb19kZWZpbmUgKGksIHRvcF9zY29wZSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBDX0VPUzoKLQkgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBkb19zZWN0aW9uc19wMiAoaGVhZCk7Ci0gIHJldHVybiBoZWFkOwotfQotCi1zdHJ1Y3QgY29mZl9vZmlsZSAqCi1jb2ZmX2dyb2sgKGluYWJmZCkKLSAgICAgYmZkICppbmFiZmQ7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gIGFiZmQgPSBpbmFiZmQ7Ci0gIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0KLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYWJmZC0+ZmlsZW5hbWUpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bXMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYWJmZC0+ZmlsZW5hbWUpOwotICByYXdzeW1zID0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLSAgcmF3Y291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7OwotICB0aW5kZXggPSAoc3RydWN0IGNvZmZfc3ltYm9sICoqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1ib2wgKiksIHJhd2NvdW50KSk7Ci0KLSAgcCA9IGRvaXQgKCk7Ci0gIHJldHVybiBwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmdyb2suaCBiL2JpbnV0aWxzL2NvZmZncm9rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWRlNDIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29mZmdyb2suaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0jZGVmaW5lIFRfTlVMTAkJMAotI2RlZmluZSBUX1ZPSUQJCTEJLyogZnVuY3Rpb24gYXJndW1lbnQgKG9ubHkgdXNlZCBieSBjb21waWxlcikgKi8KLSNkZWZpbmUgVF9DSEFSCQkyCS8qIGNoYXJhY3RlcgkJKi8KLSNkZWZpbmUgVF9TSE9SVAkJMwkvKiBzaG9ydCBpbnRlZ2VyCSovCi0jZGVmaW5lIFRfSU5UCQk0CS8qIGludGVnZXIJCSovCi0jZGVmaW5lIFRfTE9ORwkJNQkvKiBsb25nIGludGVnZXIJCSovCi0jZGVmaW5lIFRfRkxPQVQJCTYJLyogZmxvYXRpbmcgcG9pbnQJKi8KLSNkZWZpbmUgVF9ET1VCTEUJNwkvKiBkb3VibGUgd29yZAkJKi8KLSNkZWZpbmUgVF9TVFJVQ1QJOAkvKiBzdHJ1Y3R1cmUgCQkqLwotI2RlZmluZSBUX1VOSU9OCQk5CS8qIHVuaW9uIAkJKi8KLSNkZWZpbmUgVF9FTlVNCQkxMAkvKiBlbnVtZXJhdGlvbiAJCSovCi0jZGVmaW5lIFRfTU9FCQkxMQkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24qLwotI2RlZmluZSBUX1VDSEFSCQkxMgkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIJKi8KLSNkZWZpbmUgVF9VU0hPUlQJMTMJLyogdW5zaWduZWQgc2hvcnQJKi8KLSNkZWZpbmUgVF9VSU5UCQkxNAkvKiB1bnNpZ25lZCBpbnRlZ2VyCSovCi0jZGVmaW5lIFRfVUxPTkcJCTE1CS8qIHVuc2lnbmVkIGxvbmcJKi8KLSNkZWZpbmUgVF9MTkdEQkwJMTYJLyogbG9uZyBkb3VibGUJCSovCi0KLQotIHN0cnVjdCBjb2ZmX3JlbG9jCi0gewotICAgaW50IG9mZnNldDsKLSAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgaW50IGFkZGVuZDsKLSB9OwotCi0gc3RydWN0IGNvZmZfc2VjdGlvbiAKLSB7Ci0gICBjaGFyICpuYW1lOwotICAgaW50IGNvZGU7Ci0gICBpbnQgZGF0YTsKLSAgIGludCBhZGRyZXNzOwotICAgaW50IG51bWJlcjsgIC8qIDAuLm4sIC50ZXh0ID0gMCAqLwotICAgaW50IG5yZWxvY3M7Ci0gICBpbnQgc2l6ZTsKLSAgIHN0cnVjdCBjb2ZmX3JlbG9jICpyZWxvY3M7Ci0gICBzdHJ1Y3Qgc2VjICpiZmRfc2VjdGlvbjsKLSB9OwotCi1zdHJ1Y3QgY29mZl9vZmlsZQotewotICBpbnQgbnNvdXJjZXM7Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpzb3VyY2VfaGVhZDsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKnNvdXJjZV90YWlsOwotICBpbnQgbnNlY3Rpb25zOwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uczsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2xfbGlzdF9oZWFkOwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbF9saXN0X3RhaWw7Ci19OwotCi1zdHJ1Y3QgY29mZl9pc2VjdGlvbiB7Ci0gIGludCBsb3c7Ci0gIGludCBoaWdoOwotICBpbnQgaW5pdDsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqcGFyZW50OwotfTsKLQotc3RydWN0IGNvZmZfc2ZpbGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOwotICBzdHJ1Y3QgY29mZl9zZmlsZSAqbmV4dDsKLQotICAvKiBWZWN0b3Igd2hpY2ggbWFwcyB3aGVyZSBpbiBlYWNoIG91dHB1dCBzZWN0aW9uCi0gICAgIHRoZSBpbnB1dCBmaWxlIGhhcyBpdCdzIGRhdGEgKi8KLSAgc3RydWN0IGNvZmZfaXNlY3Rpb24gKnNlY3Rpb247IAotCi19OwotCi0KLSBzdHJ1Y3QgY29mZl90eXBlCi17Ci0gIGludCBzaXplOwotICBlbnVtCi0gICAgewotICAgICAgY29mZl9wb2ludGVyX3R5cGUsIGNvZmZfZnVuY3Rpb25fdHlwZSwgY29mZl9hcnJheV90eXBlLCBjb2ZmX3N0cnVjdGRlZl90eXBlLCBjb2ZmX2Jhc2ljX3R5cGUsCi0gICAgICBjb2ZmX3N0cnVjdHJlZl90eXBlLCBjb2ZmX2VudW1yZWZfdHlwZSwgY29mZl9lbnVtZGVmX3R5cGUsIGNvZmZfc2VjZGVmX3R5cGUKLSAgICAgIH0gdHlwZTsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QgCi0JewotCWludCBhZGRyZXNzOwotCWludCBzaXplOwotICAgICAgfSBhc2VjZGVmOwotCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBpbnQgaXNzdHJ1Y3Q7Ci0JICBzdHJ1Y3QgY29mZl9zY29wZSAqZWxlbWVudHM7Ci0JICBpbnQgaWR4OwotCX0KLSAgICAgIGFzdHJ1Y3RkZWY7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnJlZjsKLQl9IGFzdHJ1Y3RyZWY7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICplbGVtZW50czsKLQkgIGludCBpZHg7Ci0JfSBhZW51bWRlZjsKLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqcmVmOwotCX0gYWVudW1yZWY7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKnBvaW50c190bzsKLQl9IHBvaW50ZXI7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBpbnQgZGltOwotCSAgc3RydWN0IGNvZmZfdHlwZSAqYXJyYXlfb2Y7Ci0JfSBhcnJheTsKLQotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGNvZmZfdHlwZSAqZnVuY3Rpb25fcmV0dXJuczsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICpwYXJhbWV0ZXJzOwotCSAgc3RydWN0IGNvZmZfc2NvcGUgKmNvZGU7Ci0JICBzdHJ1Y3QgY29mZl9saW5lICpsaW5lczsKLQl9IGZ1bmN0aW9uOwotICAgICAgaW50IGJhc2ljOwkJLyogT25lIG9mIFRfVk9JRC4uIFRfVUlOVCAqLwotICAgIH0gIHU7Ci19OwotCi0KLSBzdHJ1Y3QgY29mZl9saW5lIAotIHsKLSAgIGludCBubGluZXM7Ci0gICBpbnQgKmxpbmVzOwotICAgaW50ICphZGRyZXNzZXM7Ci0gfTsKLQotCi0gc3RydWN0IGNvZmZfc2NvcGUKLSAgIHsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjOyAvKiBXaGF0IHNlY3Rpb24gKi8KLSAgICAgaW50IG9mZnNldDsgLyogd2hlcmUgKi8KLSAgICAgaW50IHNpemU7IC8qIEhvdyBiaWcgKi8KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnBhcmVudDsJLyogb25lIHVwICovCi0KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKm5leHQ7CS8qbmV4dCBhbG9uZyAqLwotCi0gICAgIGludCBudmFyczsKLQotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnNfaGVhZDsJLyogc3ltYm9scyAqLwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnNfdGFpbDsKLQotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqbGlzdF9oZWFkOwkvKiBjaGlsZHJlbiAqLwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqbGlzdF90YWlsOwotCi0gICB9OwotCi0KLSBzdHJ1Y3QgY29mZl92aXNpYmxlCi0gICB7Ci0gICAgIGVudW0gY29mZl92aXNfdHlwZQotICAgICAgIHsKLQkgY29mZl92aXNfZXh0X2RlZiwKLQkgY29mZl92aXNfZXh0X3JlZiwKLQkgY29mZl92aXNfaW50X2RlZiwKLQkgY29mZl92aXNfY29tbW9uLAotCSBjb2ZmX3Zpc19hdXRvLAotCSBjb2ZmX3Zpc19yZWdpc3RlciwKLQkgY29mZl92aXNfdGFnLAotCSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0LAotCSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bSwKLQkgY29mZl92aXNfYXV0b3BhcmFtLAkKLQkgY29mZl92aXNfcmVncGFyYW0sCi0gICAgICAgfSB0eXBlOwotICAgfTsKLQotIHN0cnVjdCBjb2ZmX3doZXJlCi0gICB7Ci0gICAgIGVudW0KLSAgICAgICB7Ci0JIGNvZmZfd2hlcmVfc3RhY2ssIGNvZmZfd2hlcmVfbWVtb3J5LCBjb2ZmX3doZXJlX3JlZ2lzdGVyLCBjb2ZmX3doZXJlX3Vua25vd24sCi0JIGNvZmZfd2hlcmVfc3RydGFnLCBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3QsCi0JIGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW0sIGNvZmZfd2hlcmVfZW50YWcsIGNvZmZfd2hlcmVfdHlwZWRlZgotCi0gICAgICAgfSB3aGVyZTsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGJpdG9mZnNldDsKLSAgICAgaW50IGJpdHNpemU7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICB9OwotCi0gc3RydWN0IGNvZmZfc3ltYm9sCi0gICB7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCB0YWc7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnR5cGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3doZXJlICp3aGVyZTsKLSAgICAgc3RydWN0IGNvZmZfdmlzaWJsZSAqdmlzaWJsZTsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpuZXh0OwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKm5leHRfaW5fb2ZpbGVfbGlzdDsgLyogRm9yIHRoZSBvZmlsZSBsaXN0ICovCi0gICAgIGludCBudW1iZXI7Ci0gICAgIGludCBlcl9udW1iZXI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgfTsKLQotc3RydWN0IGNvZmZfb2ZpbGUgKmNvZmZfZ3JvaygpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29uZmlnLmluIGIvYmludXRpbHMvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI2YzVjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfV0FJVF9ICi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgbGV4IGRlY2xhcmVzIHl5dGV4dCBhcyBhIGNoYXIgKiBieSBkZWZhdWx0LCBub3QgYSBjaGFyW10uICAqLwotI3VuZGVmIFlZVEVYVF9QT0lOVEVSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHV0aW1lcyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VVElNRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEb2VzIHRoZSBwbGF0Zm9ybSB1c2UgYW4gZXhlY3V0YWJsZSBzdWZmaXg/ICovCi0jdW5kZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotCi0vKiBTdWZmaXggdXNlZCBmb3IgZXhlY3V0YWJsZXMsIGlmIGFueS4gKi8KLSN1bmRlZiBFWEVDVVRBQkxFX1NVRkZJWAotCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj8gKi8KLSN1bmRlZiBIQVZFX1RJTUVfVF9JTl9USU1FX0gKLQotLyogSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPj8gKi8KLSN1bmRlZiBIQVZFX1RJTUVfVF9JTl9UWVBFU19ICi0KLS8qIERvZXMgPHV0aW1lLmg+IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1Zj8gKi8KLSN1bmRlZiBIQVZFX0dPT0RfVVRJTUVfSAotCi0vKiBEZWZpbmUgaWYgZnByaW50ZiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZQUklOVEYKLQotLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotCi0vKiBEZWZpbmUgaWYgZW52aXJvbiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLQotLyogVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gKi8KLSN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0KLS8qIENvbmZpZ3VyZWQgdGFyZ2V0IG5hbWUuICovCi0jdW5kZWYgVEFSR0VUCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZSBiL2JpbnV0aWxzL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDkxNTgyYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYxICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWFyLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA1OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyNjogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ0OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3OTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MzI6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzg5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1iaW51dGlscwotCi1WRVJTSU9OPTIuOS40Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODM1OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NjE6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODg3OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDAzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDMzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExNjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTEyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1ODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjM6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5MTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzQ6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1ODogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjYxOiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5NzogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxMzogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNTE6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTg6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1lY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUxNjogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTI4OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2Ci1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NTQ6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE1OTYgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYxODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfY2NfbmVlZHNfYmVsZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjUzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIERMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgbmVlZF9sb2Nrcz0kZW5hYmxldmFsCi1lbHNlCi0gIG5lZWRfbG9ja3M9eWVzCi1maQotCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi0KLQotCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1pZiB0ZXN0IC16ICIkaG9zdCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDIwNDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDQ2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDc3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDg2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYwotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ZQUNDPSIkYWNfY3ZfcHJvZ19ZQUNDIgotaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWUFDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRZQUNDIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTczOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxOTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWZvciBhY19wcm9nIGluIGZsZXggbGV4Ci1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI1ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJExFWCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRMRVgiIHx8IExFWD0iIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImZsZXgiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9ImZsZXgiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0xFWCIgJiYgYWNfY3ZfcHJvZ19MRVg9ImxleCIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRMRVhMSUIiCi10aGVuCi0gIGNhc2UgIiRMRVgiIGluCi0gIGZsZXgqKSBhY19saWI9ZmwgOzsKLSAgKikgYWNfbGliPWwgOzsKLSAgZXNhYwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMyNTogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQotYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbCRhY19saWIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHl5d3JhcCgpOwotCi1pbnQgbWFpbigpIHsKLXl5d3JhcCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTEVYTElCPSItbCRhY19saWIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjc6IGNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF9yb290JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGUgbWluaW1hbCBsZXggcHJvZ3JhbSBpcyBqdXN0IGEgc2luZ2xlIGxpbmU6ICUlLiAgQnV0IHNvbWUgYnJva2VuIGxleGVzCi0jIChTb2xhcmlzLCBJIHRoaW5rIGl0IHdhcykgd2FudCB0d28gJSUgbGluZXMsIHNvIGFjY29tbW9kYXRlIHRoZW0uCi1lY2hvICclJQotJSUnIHwgJExFWAotaWYgdGVzdCAtZiBsZXgueXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleC55eQotZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXh5eQotZWxzZQotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF9yb290IiAxPiY2Ci1MRVhfT1VUUFVUX1JPT1Q9JGFjX2N2X3Byb2dfbGV4X3Jvb3QKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzg4OiBjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBQT1NJWCBzYXlzIGxleCBjYW4gZGVjbGFyZSB5eXRleHQgZWl0aGVyIGFzIGEgcG9pbnRlciBvciBhbiBhcnJheTsgdGhlCi0jIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBGaWd1cmUgb3V0IHdoaWNoIGl0IGlzLCBzaW5jZQotIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KLWFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPW5vCi1lY2hvICdleHRlcm4gY2hhciAqeXl0ZXh0OycgPj4kTEVYX09VVFBVVF9ST09ULmMKLWFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSIkTElCUyAkTEVYTElCIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1gY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2AKLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLXJtIC1mICIke0xFWF9PVVRQVVRfUk9PVH0uYyIKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKLUVPRgotCi1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MzE6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NTI6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTU2OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYxMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjMxOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjQ1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY3MTogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY3NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzA0OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3Mzk6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3NTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzcyOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Mzc6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg2NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MjI6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk3NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5ODQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAxMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDQxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY2OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDc0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI0MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMyNTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMzk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDAxOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQzNDogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDU0OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NzM6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ4MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MDA6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTI4OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUzNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NjM6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjAzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjM3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3NjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgzNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NjA6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5ODg6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk5ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDYxOiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA4NDogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA4OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDEwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDExNzogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDEyOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTQ4OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVggMQotRU9GCi0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBFWEVDVVRBQkxFX1NVRkZJWCAiJHtFWEVFWFR9IgotRU9GCi0KLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi1IREVGSU5FUz0KLQotLiAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjAxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjQwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi0KLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMwNzogY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2J1aWxkX2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGFjX2NfdGVzdC5jIDw8ICdFT0YnCi1pbnQgbWFpbigpIHsKLS8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KLX0KLUVPRgotICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBhY19jX3Rlc3QgYW1fY190ZXN0LmMgMT4mNSAyPiY1Ci0gICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyBhY19jX3Rlc3QuKiB8IGdyZXAgLXYgYWNfY190ZXN0LmMgfCBzZWQgLWUgcy9hY19jX3Rlc3QvL2AKLSAgICBybSAtZiBhY19jX3Rlc3QqCi0gICAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iID0geCAmJiBiZmRfY3ZfYnVpbGRfZXhlZXh0PW5vCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9idWlsZF9leGVleHQiIDE+JjYKLSAgRVhFRVhUX0ZPUl9CVUlMRD0iIgotICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVF9GT1JfQlVJTEQ9JHtiZmRfY3ZfYnVpbGRfZXhlZXh0fQotZmkKLQotCi1mb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB1bmlzdGQuaCBmY250bC5oIHN5cy9maWxlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzMyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDMzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM0MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzY5OiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N5c193YWl0X2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Mzc0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCkoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWludCBzOwotd2FpdCAoJnMpOwotcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzOTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0MTM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDQ2OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0NTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MTE6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDU0MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1OTY6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjA0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfZnVuYyBpbiBzYnJrIHV0aW1lcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY0NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY1MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Njc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBzeXN0ZW1zIGhhdmUgZnJleHAgb25seSBpbiAtbG0sIG5vdCBpbiAtbGMuCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZnJleHAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MDM6IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZnJleHAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NlYXJjaF9mcmV4cCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0iJExJQlMiCi1hY19jdl9zZWFyY2hfZnJleHA9Im5vIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDcxMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGZyZXhwKCk7Ci0KLWludCBtYWluKCkgewotZnJleHAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3MjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3NlYXJjaF9mcmV4cD0ibm9uZSByZXF1aXJlZCIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi10ZXN0ICIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiA9ICJubyIgJiYgZm9yIGkgaW4gLWxtOyBkbwotTElCUz0iLWwkaSAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBmcmV4cCgpOwotCi1pbnQgbWFpbigpIHsKLWZyZXhwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzQzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9zZWFyY2hfZnJleHA9Ii1sJGkiCi1icmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLUxJQlM9IiRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3NlYXJjaF9mcmV4cCIgMT4mNgotaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9mcmV4cCIgIT0gIm5vIjsgdGhlbgotICB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfY3Zfc2VhcmNoX2ZyZXhwICRMSUJTIgotICAKLWVsc2UgOgotICAKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aW1lX3QgaW4gdGltZS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzY1OiBjaGVja2luZyBmb3IgdGltZV90IGluIHRpbWUuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc3MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotaW50IG1haW4oKSB7Ci10aW1lX3QgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Nzc3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc5ODogY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotaW50IG1haW4oKSB7Ci10aW1lX3QgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9UWVBFU19IIDEKLUVPRgotCi1maQotCi0jIFVuZGVyIE5leHQgMy4yIDx1dGltZS5oPiBhcHBhcmVudGx5IGRvZXMgbm90IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1ZgotIyBieSBkZWZhdWx0LgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHV0aW1lLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4MzM6IGNoZWNraW5nIGZvciB1dGltZS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydidV9jdl9oZWFkZXJfdXRpbWVfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dXRpbWUuaD4KLWludCBtYWluKCkgewotc3RydWN0IHV0aW1idWYgczsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODQ5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfaGVhZGVyX3V0aW1lX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2hlYWRlcl91dGltZV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJ1X2N2X2hlYWRlcl91dGltZV9oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9oZWFkZXJfdXRpbWVfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HT09EX1VUSU1FX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODcwOiBjaGVja2luZyB3aGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODc1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZwcmludGYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODk2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGY9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50ZiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTE3OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDkyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTQzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5NjQ6IGNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5NjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc2JyawotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5OTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwMTE6IGNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldGVudgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fR0VURU5WIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTA1ODogY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTA2MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBlbnZpcm9uCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA4NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTiAxCi1FT0YKLQotZmkKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cykKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9CSU5BUllfRk9QRU4gMQotRU9GCi0gOzsKLWVzYWMKLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIjsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1CVUlMRF9OTE1DT05WPQotTkxNQ09OVl9ERUZTPQotQlVJTERfU1JDT05WPQotQlVJTERfRExMVE9PTD0KLURMTFRPT0xfREVGUz0KLUJVSUxEX1dJTkRSRVM9Ci1CVUlMRF9ETExXUkFQPQotQlVJTERfTUlTQz0KLQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLQlCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScKLQlOTE1DT05WX0RFRlM9Ii1ETkxNQ09OVl9JMzg2IC1ETkxNQ09OVl9BTFBIQSAtRE5MTUNPTlZfUE9XRVJQQyAtRE5MTUNPTlZfU1BBUkMiCi0gICAgZWxzZQotCWNhc2UgJHRhcmcgaW4KLQlpWzM0NTZdODYqLSotbmV0d2FyZSopIAotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9JMzg2IgotCSAgOzsKLQlhbHBoYSotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfQUxQSEEiCi0JICA7OwotCXBvd2VycGMqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX1BPV0VSUEMiCi0JICA7OwotCXNwYXJjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9TUEFSQyIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQkqLSotaG1zKikgQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScgOzsKLQllc2FjCi0JY2FzZSAkdGFyZyBpbgotCWFybS0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQl0aHVtYi0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQlpWzMtNl04Ni0qcGUqIHwgaVszLTZdODYtKi1jeWd3aW4qIHwgaVszLTZdODYtKi1taW5ndzMyKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9JMzg2IgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgQlVJTERfRExMV1JBUD0nJChETExXUkFQX1BST0cpJChFWEVFWFQpJwotCSA7OwotCXBvd2VycGMqLSotKnBlKiB8IHBvd2VycGMqLSotY3lnd2luKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9QUEMiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JIDs7Ci0JbWNvcmUtKnBlKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01DT1JFIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSA7OwotCW1jb3JlLSplbGYpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfTUNPUkVfRUxGIgotCSA7OwotCWVzYWMKLSAgICBmaQotZG9uZQotCi0KLQotCi0KLQotCi0KLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVQgIiR7dGFyZ2V0fSIKLUVPRgotCi0KLXRhcmc9JHRhcmdldAotLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi1pZiB0ZXN0ICJ4JHRhcmdfdW5kZXJzY29yZSIgPSAieHllcyI7IHRoZW4KLSAgICBVTkRFUlNDT1JFPTEKLWVsc2UKLSAgICBVTkRFUlNDT1JFPTAKLWZpCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBDUFBAJSRDUFAlZwotcyVATEVYX09VVFBVVF9ST09UQCUkTEVYX09VVFBVVF9ST09UJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVARVhFRVhUX0ZPUl9CVUlMREAlJEVYRUVYVF9GT1JfQlVJTEQlZwotcyVATkxNQ09OVl9ERUZTQCUkTkxNQ09OVl9ERUZTJWcKLXMlQEJVSUxEX05MTUNPTlZAJSRCVUlMRF9OTE1DT05WJWcKLXMlQEJVSUxEX1NSQ09OVkAlJEJVSUxEX1NSQ09OViVnCi1zJUBCVUlMRF9ETExUT09MQCUkQlVJTERfRExMVE9PTCVnCi1zJUBETExUT09MX0RFRlNAJSRETExUT09MX0RFRlMlZwotcyVAQlVJTERfV0lORFJFU0AlJEJVSUxEX1dJTkRSRVMlZwotcyVAQlVJTERfRExMV1JBUEAlJEJVSUxEX0RMTFdSQVAlZwotcyVAQlVJTERfTUlTQ0AlJEJVSUxEX01JU0MlZwotcyVAVU5ERVJTQ09SRUAlJFVOREVSU0NPUkUlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi0KLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotKikgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlIDs7Ci1lc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuYmF0IGIvYmludXRpbHMvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdkNzBmMS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotQGVjaG8gb2ZmDQotaWYgIiUxIiA9PSAiaDgvMzAwIiBnb3RvIGg4MzAwDQotDQotZWNobyBDb25maWd1cmluZyBiaW51dGlscyBmb3IgZ28zMg0KLXVwZGF0ZSAuLi9iZmQvaG9zdHMvZ28zMi5oIHN5c2RlcC5oDQotZ290byBjb21tb24NCi0NCi06aDgzMDANCi1lY2hvIENvbmZpZ3VyaW5nIGJpbnV0aWxzIGZvciBIOC8zMDANCi11cGRhdGUgLi5cYmZkXGhvc3RzXGgtZ28zMi5oIHN5c2RlcC5oDQotDQotOmNvbW1vbg0KLQ0KLWVjaG8gIyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgImNvbmZpZ3VyZS5iYXQiPiBNYWtlZmlsZQ0KLQ0KLWlmIGV4aXN0IGNvbmZpZy5zZWQgZGVsIGNvbmZpZy5zZWQNCi0NCi1zZWQgLW4gIi9eVkVSU0lPTj0vIHAiIE1ha2VmaWxlLmluIHwgc2VkIC1lICJzL14vc14vIiAtZSAicy89L15cIi8iIC1lICJzLyQvXCJeLyIgPiBjb25maWcuc2VkDQotc2VkIC1mIGNvbmZpZy5zZWQgdmVyc2lvbi5jID4gdmVyc2lvbjIuYw0KLQ0KLWlmIGV4aXN0IGNvbmZpZy5zZWQgZGVsIGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL3ZlcnNpb25cLi92ZXJzaW9uMlwuL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLy1EVkVSU0lPTj1bXiBdKiAvLwkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvXglcJChzcmNkaXIpXC9tb3ZlLWlmLWNoYW5nZS8JdXBkYXRlLwkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIi9eIyMjJC8gaVwJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiQ0MgPSBnY2MJCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvOlwoW14gCV1cKS86IFwxL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL14JXCAqXC5cLy8JZ28zMiAvCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL2BlY2hvIFwkKHNyY2RpcilcLy8vZwkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvIHwgc2VkICdzLFxeXFxcLlwvLCwnYC8vZwkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9eCWNkIFwkKHNyY2RpcilbIAldKjsvLwkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL15hcnBhcnNlXC5jLyBpXAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJhcnBhcnNlLm86IGFycGFyc2UuY1wJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIJJChDQykgLWMgJChDRkxBR1MpICQoSU5DTFVERVMpICQoSERFRklORVMpICQoVERFRklORVMpIGFycGFyc2UuYyAiPj4gY29uZmlnLnNlZA0KLWVjaG8gIi9cJChCSVNPTikvIGNcCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIgliaXNvbiAkKEJJU09ORkxBR1MpIC1vICRAIGFycGFyc2UueQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIveVwudGFiXC4vIGQJCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL15hcmxleC5jLyB7CQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIiBpXAkJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiYXJsZXgubzogYXJsZXguYwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgaVwJCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIgkkKENDKSAtYyAkKENGTEFHUykgJChJTkNMVURFUykgJChIREVGSU5FUykgJChUREVGSU5FUykgYXJsZXguYyAiPj4gY29uZmlnLnNlZA0KLWVjaG8gIn0JCQkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIvXCQoTEVYKS8gY1wJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiCWZsZXggJChMRVhfT1BUSU9OUykgYXJsZXgubAkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9sZXhcLnl5XC4vbGV4eXkuL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzLyciL1xcIi9nCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvIicvXFwiL2cJCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAicy9jKytmaWx0L2N4eGZpbHQvZwkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLXNlZCAtZSAicy9eXCIvLyIgLWUgInMvXCIkLy8iIC1lICJzL1sgCV0qJC8vIiBjb25maWcuc2VkID4gY29uZmlnMi5zZWQNCi1zZWQgLWYgY29uZmlnMi5zZWQgTWFrZWZpbGUuaW4gPj4gTWFrZWZpbGUNCi1kZWwgY29uZmlnLnNlZA0KLWRlbCBjb25maWcyLnNlZA0KLQ0KLWVjaG8gaW50IHByZXBlbmRzX3VuZGVyc2NvcmUgPSAxOyA+IHVuZGVyc2NvcmUuYw0KLQ0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5jb20gYi9iaW51dGlscy9jb25maWd1cmUuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTQ2M2Q1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5jb20KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0kIQotJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgYmludXRpbHMgZm9yIHVzZSB3aXRoIG9wZW5WTVMvQWxwaGEKLSQhIFdlIGRvIG5vdCB1c2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNpbmNlIHdlIGRvIG5vdCBoYXZlIC9iaW4vc2gKLSQhIHRvIGV4ZWN1dGUgaXQuCi0kIQotJCEgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotJCEKLSRhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkgICAgICAhIHZheD09MSwgYWxwaGE9PTIKLSRhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQhCi0kIQotJCEgR2VuZXJhdGUgY29uZmlnLmgKLSQhCi0kIGNyZWF0ZSBbXWNvbmZpZy5oCi0vKiBjb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovCi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDx0aW1lLmg+PyAgKi8KLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVElNRV9IIDEKLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4/ICAqLwotI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9UWVBFU19IIDEKLS8qIERvZXMgPHV0aW1lLmg+IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1Zj8gICovCi0jZGVmaW5lIEhBVkVfR09PRF9VVElNRV9IIDEKLS8qIFdoZXRoZXIgZnByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGlvLmg+IGlzIGluY2x1ZGVkLiAgKi8KLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIDEKLS8qIFdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHVuaXN0ZC5oPiBpcyBpbmNsdWRlZC4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0vKiBEbyB3ZSBuZWVkIHRvIHVzZSB0aGUgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAgKi8KLS8qICN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotLyogI3VuZGVmIEhBVkVfU0JSSyAxICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHV0aW1lcyBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfVVRJTUVTIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NZU19GSUxFX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgY29uZmlnLmgnIgotJCEKLSQhCi0kISBFZGl0IFZFUlNJT04gaW4gbWFrZWZpbGUudm1zLWluCi0kIQotJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCi0gICAgICAgIFtdbWFrZWZpbGUudm1zLWluIC9vdXRwdXQ9W11tYWtlZmlsZS52bXMKLSRERUNLCi0hCi0hIEdldCBWRVJTSU9OIGZyb20gY29uZmlndXJlLmluCi0hCi0gICBtZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJtZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihtZmlsZSksIEVORF9PRihtZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJpbnV0aWxzLCAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKLSAgIEVMU0U7Ci0gICAgIHZlcnMgOj0gInVua25vd24iOwotICAgRU5ESUY7Ci0KLSAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgIENPUFlfVEVYVCh2ZXJzKTsKLSAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7Ci0gICBRVUlUCi0kICBFT0QKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRlZCBgbWFrZWZpbGUudm1zJyIKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5pbiBiL2JpbnV0aWxzL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzN2NlYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwKLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChhci5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UoYmludXRpbHMsIDIuOS40KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi0KLUFDX1BST0dfQ0MKLQotQUNfUFJPR19ZQUNDCi1BTV9QUk9HX0xFWAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi1pZiB0ZXN0IC1uICIkRVhFRVhUIjsgdGhlbgotICBBQ19ERUZJTkUoSEFWRV9FWEVDVVRBQkxFX1NVRkZJWCwgMSwKLQkgICAgW0RvZXMgdGhlIHBsYXRmb3JtIHVzZSBhbiBleGVjdXRhYmxlIHN1ZmZpeD9dKQotZmkKLUFDX0RFRklORV9VTlFVT1RFRChFWEVDVVRBQkxFX1NVRkZJWCwgIiR7RVhFRVhUfSIsCi0JCSAgIFtTdWZmaXggdXNlZCBmb3IgZXhlY3V0YWJsZXMsIGlmIGFueS5dKQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUhERUZJTkVTPQotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BUj0ke0FSLWFyfQotQUNfU1VCU1QoQVIpCi1BQ19QUk9HX1JBTkxJQgotQUNfUFJPR19JTlNUQUxMCi0KLUJGRF9DQ19GT1JfQlVJTEQKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmggZmNudGwuaCBzeXMvZmlsZS5oKQotQUNfSEVBREVSX1NZU19XQUlUCi1BQ19GVU5DX0FMTE9DQQotQUNfQ0hFQ0tfRlVOQ1Moc2JyayB1dGltZXMpCi0KLSMgU29tZSBzeXN0ZW1zIGhhdmUgZnJleHAgb25seSBpbiAtbG0sIG5vdCBpbiAtbGMuCi1BQ19TRUFSQ0hfTElCUyhmcmV4cCwgLWxtKQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRpbWVfdCBpbiB0aW1lLmgpCi1BQ19DQUNIRV9WQUwoYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8dGltZS5oPl0sIFt0aW1lX3QgaTtdLAotYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPXllcywgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2gpCi1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2ggPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtIQVZFX1RJTUVfVF9JTl9USU1FX0hdLCAxLAotCSAgICBbSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHRpbWUuaD4/XSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgdGltZV90IGluIHN5cy90eXBlcy5oKQotQUNfQ0FDSEVfVkFMKGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2gsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLCBbdGltZV90IGk7XSwKLWJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9eWVzLCBidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oKQotaWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW0hBVkVfVElNRV9UX0lOX1RZUEVTX0hdLCAxLAotCSAgICBbSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPj9dKQotZmkKLQotIyBVbmRlciBOZXh0IDMuMiA8dXRpbWUuaD4gYXBwYXJlbnRseSBkb2VzIG5vdCBkZWZpbmUgc3RydWN0IHV0aW1idWYKLSMgYnkgZGVmYXVsdC4KLUFDX01TR19DSEVDS0lORyhbZm9yIHV0aW1lLmhdKQotQUNfQ0FDSEVfVkFMKGJ1X2N2X2hlYWRlcl91dGltZV9oLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx1dGltZS5oPl0sCi1bc3RydWN0IHV0aW1idWYgcztdLAotYnVfY3ZfaGVhZGVyX3V0aW1lX2g9eWVzLCBidV9jdl9oZWFkZXJfdXRpbWVfaD1ubyldKQotQUNfTVNHX1JFU1VMVCgkYnVfY3ZfaGVhZGVyX3V0aW1lX2gpCi1pZiB0ZXN0ICRidV9jdl9oZWFkZXJfdXRpbWVfaCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoSEFWRV9HT09EX1VUSU1FX0gsIDEsIFtEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/XSkKLWZpCi0KLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGZwcmludGYpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzYnJrKQotQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KQotQkZEX05FRURfREVDTEFSQVRJT04oZW52aXJvbikKLQotQkZEX0JJTkFSWV9GT1BFTgotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLQllbHNlCi0JICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgotCWZpCi0gICAgZG9uZQotZmkKLQotYWxsX3RhcmdldHM9ZmFsc2UKLUJVSUxEX05MTUNPTlY9Ci1OTE1DT05WX0RFRlM9Ci1CVUlMRF9TUkNPTlY9Ci1CVUlMRF9ETExUT09MPQotRExMVE9PTF9ERUZTPQotQlVJTERfV0lORFJFUz0KLUJVSUxEX0RMTFdSQVA9Ci1CVUlMRF9NSVNDPQotCi1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotCUJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQlCVUlMRF9TUkNPTlY9JyQoU1JDT05WX1BST0cpJwotCU5MTUNPTlZfREVGUz0iLUROTE1DT05WX0kzODYgLUROTE1DT05WX0FMUEhBIC1ETkxNQ09OVl9QT1dFUlBDIC1ETkxNQ09OVl9TUEFSQyIKLSAgICBlbHNlCi0JY2FzZSAkdGFyZyBpbgotY2hhbmdlcXVvdGUoLClkbmwKLQlpWzM0NTZdODYqLSotbmV0d2FyZSopIAotY2hhbmdlcXVvdGUoWyxdKWRubAotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9JMzg2IgotCSAgOzsKLQlhbHBoYSotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfQUxQSEEiCi0JICA7OwotCXBvd2VycGMqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX1BPV0VSUEMiCi0JICA7OwotCXNwYXJjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9TUEFSQyIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQkqLSotaG1zKikgQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScgOzsKLQllc2FjCi0JY2FzZSAkdGFyZyBpbgotCWFybS0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQl0aHVtYi0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0JaVszLTZdODYtKnBlKiB8IGlbMy02XTg2LSotY3lnd2luKiB8IGlbMy02XTg2LSotbWluZ3czMiopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfSTM4NiIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIEJVSUxEX0RMTFdSQVA9JyQoRExMV1JBUF9QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQlwb3dlcnBjKi0qLSpwZSogfCBwb3dlcnBjKi0qLWN5Z3dpbiopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfUFBDIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSA7OwotCW1jb3JlLSpwZSkKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQltY29yZS0qZWxmKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01DT1JFX0VMRiIKLQkgOzsKLQllc2FjCi0gICAgZmkKLWRvbmUKLQotQUNfU1VCU1QoTkxNQ09OVl9ERUZTKQotQUNfU1VCU1QoQlVJTERfTkxNQ09OVikKLUFDX1NVQlNUKEJVSUxEX1NSQ09OVikKLUFDX1NVQlNUKEJVSUxEX0RMTFRPT0wpCi1BQ19TVUJTVChETExUT09MX0RFRlMpCi1BQ19TVUJTVChCVUlMRF9XSU5EUkVTKQotQUNfU1VCU1QoQlVJTERfRExMV1JBUCkKLUFDX1NVQlNUKEJVSUxEX01JU0MpCi0KLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVQsICIke3RhcmdldH0iLCBbQ29uZmlndXJlZCB0YXJnZXQgbmFtZS5dKQotCi10YXJnPSR0YXJnZXQKLS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAotaWYgdGVzdCAieCR0YXJnX3VuZGVyc2NvcmUiID0gInh5ZXMiOyB0aGVuCi0gICAgVU5ERVJTQ09SRT0xCi1lbHNlCi0gICAgVU5ERVJTQ09SRT0wCi1maQotQUNfU1VCU1QoVU5ERVJTQ09SRSkKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSopIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZSA7OwotZXNhYwotXSkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2N4eGZpbHQubWFuIGIvYmludXRpbHMvY3h4ZmlsdC5tYW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDVkNDUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY3h4ZmlsdC5tYW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIEBQUk9HUkFNQCAxICJKdW5lIDE5OTMiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1AUFJPR1JBTUAgXC0gZGVtYW5nbGUgQysrIHN5bWJvbHMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIEBQUk9HUkFNQAotLlJCICJbXHwiIFwtXyB8IFwtXC1zdHJpcC11bmRlcnNjb3JlcyAiXHxdIgotLlJCICJbXHwiICJcLXMge2dudSxsdWNpZCxhcm19ICIgfCAiIFwtXC1mb3JtYXQ9e2dudSxsdWNpZCxhcm19IiAiXHxdIgotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBzeW1ib2wgIi4uLlx8XSIKLS5TSCBERVNDUklQVElPTgotVGhlIEMrKyBsYW5ndWFnZSBwcm92aWRlcyBmdW5jdGlvbiBvdmVybG9hZGluZywgd2hpY2ggbWVhbnMgdGhhdCB5b3UgY2FuCi13cml0ZSBtYW55IGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgKHByb3ZpZGluZyBlYWNoIHRha2VzIHBhcmFtZXRlcnMKLW9mIGRpZmZlcmVudCB0eXBlcykuICBBbGwgQysrIGZ1bmN0aW9uIG5hbWVzIGFyZSBlbmNvZGVkIGludG8gYQotbG93LWxldmVsIGFzc2VtYmx5IGxhYmVsICh0aGlzIHByb2Nlc3MgaXMga25vd24gYXMKLS5JIG1hbmdsaW5nXGMKLSkuICBUaGUgCi0uQiBAUFJPR1JBTUAKLXByb2dyYW0gZG9lcyB0aGUgaW52ZXJzZSBtYXBwaW5nOiBpdCBkZWNvZGVzIChcZklkZW1hbmdsZXNcZlIpCi1sb3ctbGV2ZWwgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4ga2VlcAotdGhlc2Ugb3ZlcmxvYWRlZCBmdW5jdGlvbnMgZnJvbSBjbGFzaGluZy4KLS5QUAotRXZlcnkgYWxwaGFudW1lcmljIHdvcmQgKGNvbnNpc3Rpbmcgb2YgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywKLWRvbGxhcnMsIG9yIHBlcmlvZHMpIHNlZW4gaW4gdGhlIGlucHV0IGlzIGEgcG90ZW50aWFsIGxhYmVsLiAgSWYgdGhlCi1sYWJlbCBkZWNvZGVzIGludG8gYSBDKysgbmFtZSwgdGhlIEMrKyBuYW1lIHJlcGxhY2VzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgaW4gdGhlIG91dHB1dC4KLS5QUAotWW91IGNhbiB1c2UKLS5CIEBQUk9HUkFNQAotdG8gZGVjaXBoZXIgaW5kaXZpZHVhbCBzeW1ib2xzIGJ5IHNwZWNpZnlpbmcgdGhlc2Ugc3ltYm9scyBvbiB0aGUKLWNvbW1hbmQgbGluZS4KLS5QUAotSWYgbm8KLS5CIHN5bWJvbAotYXJndW1lbnRzIGFyZSBnaXZlbiwKLS5CIEBQUk9HUkFNQAotcmVhZHMgc3ltYm9sIG5hbWVzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZXMgdGhlIGRlbWFuZ2xlZAotbmFtZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gIEFsbCByZXN1bHRzIGFyZSBwcmludGVkIG9uIHRoZSBzdGFuZGFyZAotb3V0cHV0LgotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1fCi0uVFAKLS5CIFwtXC1zdHJpcFwtdW5kZXJzY29yZXMKLU9uIHNvbWUgc3lzdGVtcywgYm90aCB0aGUgQyBhbmQgQysrIGNvbXBpbGVycyBwdXQgYW4KLXVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgZXZlcnkgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgQyBuYW1lIAotLkIgZm9vCi1nZXRzIHRoZSBsb3ctbGV2ZWwgbmFtZSAKLS5CUiBfZm9vIC4KLVRoaXMgb3B0aW9uIHJlbW92ZXMgdGhlIGxlYWRpbmcgdW5kZXJzY29yZS4KLQotLlRQCi0uQiAiXC1zIHtnbnUsbHVjaWQsYXJtfSIKLS5UUAotLkIgXC1cLWZvcm1hdD17Z251LGx1Y2lkLGFybX0KLUdOVQotLkIgbm0KLWNhbiBkZWNvZGUgdGhyZWUgZGlmZmVyZW50IG1ldGhvZHMgb2YgbWFuZ2xpbmcsIHVzZWQgYnkgZGlmZmVyZW50IEMrKwotY29tcGlsZXJzLiAgVGhpcyBvcHRpb24gc2VsZWN0cyB3aGljaCBtZXRob2QgaXQgdXNlczogdGhlIG9uZSB1c2VkIGJ5Ci10aGUgR05VIGNvbXBpbGVyLCB0aGUgb25lIHVzZWQgYnkgdGhlIEx1Y2lkIGNvbXBpbGVyLCBvciB0aGUgb25lCi1zcGVjaWZpZWQgYnkgdGhlIEMrKyBBbm5vdGF0ZWQgUmVmZXJlbmNlIE1hbnVhbC4gIFRoZSBkZWZhdWx0IGlzIHRoZQotR05VIHN0eWxlLgotCi0uVFAKLS5CIFwtXC1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIEBQUk9HUkFNQAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC1cLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgQFBST0dSQU1ACi1hbmQgZXhpdC4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChKdW5lIDE5OTMpLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9kZWJ1Zy5jIGIvYmludXRpbHMvZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczZDYyNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU2OCArMCwwIEBACi0vKiBkZWJ1Zy5jIC0tIEhhbmRsZSBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGdlbmVyaWMgZGVidWdnaW5nIGZvcm1hdC4gIFdlIG1heSBldmVudHVhbGx5Ci0gICBoYXZlIHJlYWRlcnMgd2hpY2ggY29udmVydCBkaWZmZXJlbnQgZm9ybWF0cyBpbnRvIHRoaXMgZ2VuZXJpYwotICAgZm9ybWF0LCBhbmQgd3JpdGVycyB3aGljaCB3cml0ZSBpdCBvdXQuICBUaGUgaW5pdGlhbCBpbXBldHVzIGZvcgotICAgdGhpcyB3YXMgd3JpdGluZyBhIGNvbnZlcnRvciBmcm9tIHN0YWJzIHRvIEhQIElFRUUtNjk1IGRlYnVnZ2luZwotICAgZm9ybWF0LiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0vKiBHbG9iYWwgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZGVidWdnaW5nLiAgQSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZSBpcyB0aGUgZGVidWdnaW5nIGhhbmRsZSBwYXNzZWQgdG8gYWxsIHRoZSByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19oYW5kbGUKLXsKLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBjb21waWxhdGlvbiB1bml0cy4gICovCi0gIHN0cnVjdCBkZWJ1Z191bml0ICp1bml0czsKLSAgLyogVGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z191bml0ICpjdXJyZW50X3VuaXQ7Ci0gIC8qIFRoZSBjdXJyZW50IHNvdXJjZSBmaWxlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmN1cnJlbnRfZmlsZTsKLSAgLyogVGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmN1cnJlbnRfZnVuY3Rpb247Ci0gIC8qIFRoZSBjdXJyZW50IGJsb2NrLiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpjdXJyZW50X2Jsb2NrOwotICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmN1cnJlbnRfbGluZW5vOwotICAvKiBNYXJrLiAgVGhpcyBpcyB1c2VkIGJ5IGRlYnVnX3dyaXRlLiAgKi8KLSAgdW5zaWduZWQgaW50IG1hcms7Ci0gIC8qIEEgc3RydWN0L2NsYXNzIElEIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgY2xhc3NfaWQ7Ci0gIC8qIFRoZSBiYXNlIGZvciBjbGFzc19pZCBmb3IgdGhpcyBjYWxsIHRvIGRlYnVnX3dyaXRlLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2VfaWQ7Ci0gIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGluIGRlYnVnX3dyaXRlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqY3VycmVudF93cml0ZV9saW5lbm87Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X3dyaXRlX2xpbmVub19pbmRleDsKLSAgLyogQSBsaXN0IG9mIGNsYXNzZXMgd2hpY2ggaGF2ZSBhc3NpZ25lZCBJRCdzIGR1cmluZyBkZWJ1Z193cml0ZS4KLSAgICAgVGhpcyBpcyBsaW5rZWQgdGhyb3VnaCB0aGUgbmV4dF9pZCBmaWVsZCBvZiBkZWJ1Z19jbGFzc190eXBlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2NsYXNzX2lkICppZF9saXN0OwotICAvKiBBIGxpc3QgdXNlZCB0byBhdm9pZCByZWN1cnNpb24gZHVyaW5nIGRlYnVnX3R5cGVfc2FtZXAuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKmNvbXBhcmVfbGlzdDsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdHJ1Y3QgZGVidWdfdW5pdAotewotICAvKiBUaGUgbmV4dCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKm5leHQ7Ci0gIC8qIEEgbGlzdCBvZiBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICBUaGUgZmlyc3QKLSAgICAgZmlsZSBpcyBhbHdheXMgdGhlIG1haW4gb25lLCBhbmQgdGhhdCBpcyB3aGVyZSB0aGUgbWFpbiBmaWxlIG5hbWUKLSAgICAgaXMgc3RvcmVkLiAgKi8KLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmZpbGVzOwotICAvKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0LiAgVGhpcyBpcyBub3QKLSAgICAgc3RvcmVkIGJ5IGZ1bmN0aW9uLCBiZWNhdXNlIGFzc2VtYmxlciBjb2RlIG1heSBoYXZlIGxpbmUgbnVtYmVyCi0gICAgIGluZm9ybWF0aW9uIHdpdGhvdXQgZnVuY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpsaW5lbm9zOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBzaW5nbGUgc291cmNlIGZpbGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfZmlsZQotewotICAvKiBUaGUgbmV4dCBzb3VyY2UgZmlsZSBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqbmV4dDsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIEdsb2JhbCBmdW5jdGlvbnMsIHZhcmlhYmxlcywgdHlwZXMsIGV0Yy4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKmdsb2JhbHM7Ci19OwotCi0vKiBBIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZQotewotICAvKiBLaW5kIG9mIHR5cGUuICAqLwotICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAvKiBTaXplIG9mIHR5cGUgKDAgaWYgbm90IGtub3duKS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBUeXBlIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGlzIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHBvaW50ZXI7Ci0gIC8qIFRhZ2dlZCB1bmlvbiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIERFQlVHX0tJTkRfSU5ESVJFQ1QuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2luZGlyZWN0X3R5cGUgKmtpbmRpcmVjdDsKLSAgICAgIC8qIERFQlVHX0tJTkRfSU5ULiAgKi8KLSAgICAgIC8qIFdoZXRoZXIgdGhlIGludGVnZXIgaXMgdW5zaWduZWQuICAqLwotICAgICAgYm9vbGVhbiBraW50OwotICAgICAgLyogREVCVUdfS0lORF9TVFJVQ1QsIERFQlVHX0tJTkRfVU5JT04sIERFQlVHX0tJTkRfQ0xBU1MsCi0gICAgICAgICBERUJVR19LSU5EX1VOSU9OX0NMQVNTLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICprY2xhc3M7Ci0gICAgICAvKiBERUJVR19LSU5EX0VOVU0uICAqLwotICAgICAgc3RydWN0IGRlYnVnX2VudW1fdHlwZSAqa2VudW07Ci0gICAgICAvKiBERUJVR19LSU5EX1BPSU5URVIuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtwb2ludGVyOwotICAgICAgLyogREVCVUdfS0lORF9GVU5DVElPTi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSAqa2Z1bmN0aW9uOwotICAgICAgLyogREVCVUdfS0lORF9SRUZFUkVOQ0UuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtyZWZlcmVuY2U7Ci0gICAgICAvKiBERUJVR19LSU5EX1JBTkdFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlICprcmFuZ2U7Ci0gICAgICAvKiBERUJVR19LSU5EX0FSUkFZLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19hcnJheV90eXBlICprYXJyYXk7Ci0gICAgICAvKiBERUJVR19LSU5EX1NFVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfc2V0X3R5cGUgKmtzZXQ7Ci0gICAgICAvKiBERUJVR19LSU5EX09GRlNFVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUgKmtvZmZzZXQ7Ci0gICAgICAvKiBERUJVR19LSU5EX01FVEhPRC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUgKmttZXRob2Q7Ci0gICAgICAvKiBERUJVR19LSU5EX0NPTlNULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICprY29uc3Q7Ci0gICAgICAvKiBERUJVR19LSU5EX1ZPTEFUSUxFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICprdm9sYXRpbGU7Ci0gICAgICAvKiBERUJVR19LSU5EX05BTUVELCBERUJVR19LSU5EX1RBR0dFRC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqa25hbWVkOwotICAgIH0gdTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGluZGlyZWN0IHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZQotewotICAvKiBTbG90IHdoZXJlIHRoZSBmaW5hbCB0eXBlIHdpbGwgYXBwZWFyLiAgKi8KLSAgZGVidWdfdHlwZSAqc2xvdDsKLSAgLyogVGFnLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBzdHJ1Y3QsIHVuaW9uLCBvciBjbGFzcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19jbGFzc190eXBlCi17Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMuICAqLwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICAvKiBBIG1hcmsgZmllbGQgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cnVjdCBoYXMgYWxyZWFkeSBiZWVuCi0gICAgIHByaW50ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogVGhpcyBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHVubmFtZWQgc3RydWN0cyB3aGVuIHByaW50aW5nLiAgKi8KLSAgdW5zaWduZWQgaW50IGlkOwotICAvKiBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgb25seSB1c2VkIGZvciBERUJVR19LSU5EX0NMQVNTIGFuZAotICAgICBERUJVR19LSU5EX1VOSU9OX0NMQVNTLiAgKi8KLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGJhc2UgY2xhc3Nlcy4gICovCi0gIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBtZXRob2RzLiAgKi8KLSAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgcHJvdmlkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGZvcgotICAgICB0aGlzIGNsYXNzLiAgVGhpcyBtYXkgcG9pbnQgdG8gdGhlIHR5cGUgaXRzZWxmLiAgKi8KLSAgZGVidWdfdHlwZSB2cHRyYmFzZTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGVudW0uICAqLwotCi1zdHJ1Y3QgZGVidWdfZW51bV90eXBlCi17Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBuYW1lcy4gICovCi0gIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgLyogQXJyYXkgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuICAqLwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBmdW5jdGlvbi4gIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0bwotICAgcmVjb3JkIHRoZSBwYXJhbWV0ZXIgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZQotewotICAvKiBSZXR1cm4gdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLSAgLyogV2hldGhlciB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgYm9vbGVhbiB2YXJhcmdzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSByYW5nZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlCi17Ci0gIC8qIFJhbmdlIGJhc2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogTG93ZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgLyogVXBwZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGFycmF5LiAgKi8KLQotc3RydWN0IGRlYnVnX2FycmF5X3R5cGUKLXsKLSAgLyogRWxlbWVudCB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSBlbGVtZW50X3R5cGU7Ci0gIC8qIFJhbmdlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHJhbmdlX3R5cGU7Ci0gIC8qIExvd2VyIGJvdW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gIC8qIFVwcGVyIGJvdW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gIC8qIFdoZXRoZXIgdGhpcyBhcnJheSBpcyByZWFsbHkgYSBzdHJpbmcuICAqLwotICBib29sZWFuIHN0cmluZ3A7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHNldC4gICovCi0KLXN0cnVjdCBkZWJ1Z19zZXRfdHlwZQotewotICAvKiBCYXNlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZXQgaXMgcmVhbGx5IGEgYml0c3RyaW5nLiAgKi8KLSAgYm9vbGVhbiBiaXRzdHJpbmdwOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gb2Zmc2V0IHR5cGUgKGEgYmFzZWQgcG9pbnRlcikuICAqLwotCi1zdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUKLXsKLSAgLyogVGhlIHR5cGUgdGhlIHBvaW50ZXIgaXMgYW4gb2Zmc2V0IGZyb20uICAqLwotICBkZWJ1Z190eXBlIGJhc2VfdHlwZTsKLSAgLyogVGhlIHR5cGUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvLiAgKi8KLSAgZGVidWdfdHlwZSB0YXJnZXRfdHlwZTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgbWV0aG9kIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUKLXsKLSAgLyogVGhlIHJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogVGhlIG9iamVjdCB0eXBlIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGZvci4gICovCi0gIGRlYnVnX3R5cGUgZG9tYWluX3R5cGU7Ci0gIC8qIEEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAvKiBXaGV0aGVyIHRoZSBtZXRob2QgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgYm9vbGVhbiB2YXJhcmdzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBuYW1lZCB0eXBlLiAgKi8KLQotc3RydWN0IGRlYnVnX25hbWVkX3R5cGUKLXsKLSAgLyogTmFtZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuYW1lOwotICAvKiBSZWFsIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci19OwotCi0vKiBBIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX2ZpZWxkCi17Ci0gIC8qIE5hbWUgb2YgdGhlIGZpZWxkLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZSBvZiB0aGUgZmllbGQuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuICAqLwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGEgc3RhdGljIG1lbWJlci4gICovCi0gIGJvb2xlYW4gc3RhdGljX21lbWJlcjsKLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBJZiBzdGF0aWNfbWVtYmVyIGlzIGZhbHNlLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIEJpdCBwb3NpdGlvbiBvZiB0aGUgZmllbGQgaW4gdGhlIHN0cnVjdC4gICovCi0JICB1bnNpZ25lZCBpbnQgYml0cG9zOwotCSAgLyogU2l6ZSBvZiB0aGUgZmllbGQgaW4gYml0cy4gICovCi0JICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQl9IGY7Ci0gICAgICAvKiBJZiBzdGF0aWNfbWVtYmVyIGlzIHRydWUuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0JfSBzOwotICAgIH0gdTsKLX07Ci0KLS8qIEEgYmFzZSBjbGFzcyBmb3IgYW4gb2JqZWN0LiAgKi8KLQotc3RydWN0IGRlYnVnX2Jhc2VjbGFzcwotewotICAvKiBUeXBlIG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIEJpdCBwb3NpdGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBpbiB0aGUgb2JqZWN0LiAgKi8KLSAgdW5zaWduZWQgaW50IGJpdHBvczsKLSAgLyogV2hldGhlciB0aGUgYmFzZSBjbGFzcyBpcyB2aXJ0dWFsLiAgKi8KLSAgYm9vbGVhbiB2aXJ0dWFsOwotICAvKiBWaXNpYmlsaXR5IG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci19OwotCi0vKiBBIG1ldGhvZCBvZiBhbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgZGVidWdfbWV0aG9kCi17Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBBIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFudHMuICAqLwotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKip2YXJpYW50czsKLX07Ci0KLS8qIFRoZSB2YXJpYW50cyBvZiBhIG1ldGhvZCBmdW5jdGlvbiBvZiBhbiBvYmplY3QuICBUaGVzZSBpbmRpY2F0ZQotICAgd2hpY2ggbWV0aG9kIHRvIHJ1bi4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudAotewotICAvKiBUaGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgLyogVGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBjb25zdC4gICovCi0gIGJvb2xlYW4gY29uc3RwOwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyB2b2xhdGlsZS4gICovCi0gIGJvb2xlYW4gdm9sYXRpbGVwOwotICAvKiBUaGUgb2Zmc2V0IHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCi0gIGJmZF92bWEgdm9mZnNldDsKLSAgLyogSWYgdm9mZnNldCBpcyBWT0ZGU0VUX1NUQVRJQ19NRVRIT0QsIHRoaXMgaXMgYSBzdGF0aWMgbWV0aG9kLiAgKi8KLSNkZWZpbmUgVk9GRlNFVF9TVEFUSUNfTUVUSE9EICgoYmZkX3ZtYSkgLTEpCi0gIC8qIENvbnRleHQgb2YgYSB2aXJ0dWFsIG1ldGhvZCBmdW5jdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICpjb250ZXh0OwotfTsKLQotLyogQSB2YXJpYWJsZS4gIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgdmFyaWFibGUgb2JqZWN0LgotICAgVGhpcyBoYXMgbm8gbmFtZTsgYSBuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHZhcmlhYmxlIGluIGEKLSAgIGRlYnVnX25hbWUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGRlYnVnX3ZhcmlhYmxlCi17Ci0gIC8qIEtpbmQgb2YgdmFyaWFibGUuICAqLwotICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFZhbHVlLiAgVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIHVwb24ga2luZC4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogQSBmdW5jdGlvbi4gIFRoaXMgaGFzIG5vIG5hbWU7IGEgbmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBmdW5jdGlvbgotICAgaW4gYSBkZWJ1Z19uYW1lIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19mdW5jdGlvbgotewotICAvKiBSZXR1cm4gdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gIC8qIFBhcmFtZXRlciBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKnBhcmFtZXRlcnM7Ci0gIC8qIEJsb2NrIGluZm9ybWF0aW9uLiAgVGhlIGZpcnN0IHN0cnVjdHVyZSBvbiB0aGUgbGlzdCBpcyB0aGUgbWFpbgotICAgICBibG9jayBvZiB0aGUgZnVuY3Rpb24sIGFuZCBkZXNjcmliZXMgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpibG9ja3M7Ci19OwotCi0vKiBBIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0KLXN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIKLXsKLSAgLyogTmV4dCBwYXJhbWV0ZXIuICAqLwotICBzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogS2luZC4gICovCi0gIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gIC8qIFZhbHVlIChtZWFuaW5nIGRlcGVuZHMgdXBvbiBraW5kKS4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogQSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudAotewotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBWYWx1ZS4gIEZJWE1FOiBXZSBtYXkgZXZlbnR1YWxseSBuZWVkIHRvIHN1cHBvcnQgbm9uLWludGVncmFsCi0gICAgIHZhbHVlcy4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogSW5mb3JtYXRpb24gYWJvdXQgYSBibG9jayB3aXRoaW4gYSBmdW5jdGlvbi4gICovCi0KLXN0cnVjdCBkZWJ1Z19ibG9jawotewotICAvKiBOZXh0IGJsb2NrIHdpdGggdGhlIHNhbWUgcGFyZW50LiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpuZXh0OwotICAvKiBQYXJlbnQgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKnBhcmVudDsKLSAgLyogTGlzdCBvZiBjaGlsZCBibG9ja3MuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmNoaWxkcmVuOwotICAvKiBTdGFydCBhZGRyZXNzIG9mIHRoZSBibG9jay4gICovCi0gIGJmZF92bWEgc3RhcnQ7Ci0gIC8qIEVuZCBhZGRyZXNzIG9mIHRoZSBibG9jay4gICovCi0gIGJmZF92bWEgZW5kOwotICAvKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICpsb2NhbHM7Ci19OwotCi0vKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQuICBGSVhNRToKLSAgIFRoaXMgc3RydWN0dXJlIGlzIGVhc3kgdG8gY3JlYXRlLCBidXQgY2FuIGJlIHZlcnkgc3BhY2UKLSAgIGluZWZmaWNpZW50LiAgKi8KLQotc3RydWN0IGRlYnVnX2xpbmVubwotewotICAvKiBNb3JlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGJsb2NrLiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqbmV4dDsKLSAgLyogU291cmNlIGZpbGUuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZmlsZTsKLSAgLyogTGluZSBudW1iZXJzLCB0ZXJtaW5hdGVkIGJ5IGEgLTEgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXkuICAqLwotI2RlZmluZSBERUJVR19MSU5FTk9fQ09VTlQgMTAKLSAgdW5zaWduZWQgbG9uZyBsaW5lbm9zW0RFQlVHX0xJTkVOT19DT1VOVF07Ci0gIC8qIEFkZHJlc3NlcyBmb3IgdGhlIGxpbmUgbnVtYmVycy4gICovCi0gIGJmZF92bWEgYWRkcnNbREVCVUdfTElORU5PX0NPVU5UXTsKLX07Ci0KLS8qIEEgbmFtZXNwYWNlLiAgVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBvYmplY3RzLiAgRklYTUU6IFRoaXMKLSAgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZXNwYWNlCi17Ci0gIC8qIExpc3Qgb2YgaXRlbXMgaW4gdGhpcyBuYW1lc3BhY2UuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbGlzdDsKLSAgLyogUG9pbnRlciB0byB3aGVyZSB0aGUgbmV4dCBpdGVtIGluIHRoaXMgbmFtZXNwYWNlIHNob3VsZCBnby4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICoqdGFpbDsKLX07Ci0KLS8qIEtpbmRzIG9mIG9iamVjdHMgdGhhdCBhcHBlYXIgaW4gYSBuYW1lc3BhY2UuICAqLwotCi1lbnVtIGRlYnVnX29iamVjdF9raW5kCi17Ci0gIC8qIEEgdHlwZS4gICovCi0gIERFQlVHX09CSkVDVF9UWVBFLAotICAvKiBBIHRhZ2dlZCB0eXBlIChyZWFsbHkgYSBkaWZmZXJlbnQgc29ydCBvZiBuYW1lc3BhY2UpLiAgKi8KLSAgREVCVUdfT0JKRUNUX1RBRywKLSAgLyogQSB2YXJpYWJsZS4gICovCi0gIERFQlVHX09CSkVDVF9WQVJJQUJMRSwKLSAgLyogQSBmdW5jdGlvbi4gICovCi0gIERFQlVHX09CSkVDVF9GVU5DVElPTiwKLSAgLyogQW4gaW50ZWdlciBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQsCi0gIC8qIEEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotICBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQsCi0gIC8qIEEgdHlwZWQgY29uc3RhbnQuICAqLwotICBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQKLX07Ci0KLS8qIExpbmthZ2Ugb2YgYW4gb2JqZWN0IHRoYXQgYXBwZWFycyBpbiBhIG5hbWVzcGFjZS4gICovCi0KLWVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UKLXsKLSAgLyogTG9jYWwgdmFyaWFibGUuICAqLwotICBERUJVR19MSU5LQUdFX0FVVE9NQVRJQywKLSAgLyogU3RhdGljLS1laXRoZXIgZmlsZSBzdGF0aWMgb3IgZnVuY3Rpb24gc3RhdGljLCBkZXBlbmRpbmcgdXBvbiB0aGUKLSAgICAgbmFtZXNwYWNlIGlzLiAgKi8KLSAgREVCVUdfTElOS0FHRV9TVEFUSUMsCi0gIC8qIEdsb2JhbC4gICovCi0gIERFQlVHX0xJTktBR0VfR0xPQkFMLAotICAvKiBObyBsaW5rYWdlLiAgKi8KLSAgREVCVUdfTElOS0FHRV9OT05FCi19OwotCi0vKiBBIG5hbWUgaW4gYSBuYW1lc3BhY2UuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZQotewotICAvKiBOZXh0IG5hbWUgaW4gdGhpcyBuYW1lc3BhY2UuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbmV4dDsKLSAgLyogTmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIE1hcmsuICBUaGlzIGlzIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogS2luZCBvZiBvYmplY3QuICAqLwotICBlbnVtIGRlYnVnX29iamVjdF9raW5kIGtpbmQ7Ci0gIC8qIExpbmthZ2Ugb2Ygb2JqZWN0LiAgKi8KLSAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotICAvKiBUYWdnZWQgdW5pb24gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9UWVBFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAgICAgLyogREVCVUdfT0JKRUNUX1RBRy4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdGFnOwotICAgICAgLyogREVCVUdfT0JKRUNUX1ZBUklBQkxFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z192YXJpYWJsZSAqdmFyaWFibGU7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfRlVOQ1RJT04uICAqLwotICAgICAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICpmdW5jdGlvbjsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQuICAqLwotICAgICAgYmZkX3ZtYSBpbnRfY29uc3RhbnQ7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQuICAqLwotICAgICAgZG91YmxlIGZsb2F0X2NvbnN0YW50OwotICAgICAgLyogREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5ULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudCAqdHlwZWRfY29uc3RhbnQ7Ci0gICAgfSB1OwotfTsKLQotLyogRHVyaW5nIGRlYnVnX3dyaXRlLCBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgdXNlZCB0bwotICAga2VlcCB0cmFjayBvZiBJRCBudW1iZXJzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGNsYXNzZXMuICAqLwotCi1zdHJ1Y3QgZGVidWdfY2xhc3NfaWQKLXsKLSAgLyogTmV4dCBJRCBudW1iZXIuICAqLwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlIHdpdGggdGhlIElELiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIFRoZSB0YWc7IE5VTEwgaWYgbm8gdGFnLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotfTsKLQotLyogRHVyaW5nIGRlYnVnX3R5cGVfc2FtZXAsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBrZXB0Ci0gICBvbiB0aGUgc3RhY2sgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0Ci17Ci0gIC8qIE5leHQgdHlwZSBvbiBsaXN0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0ICpuZXh0OwotICAvKiBUaGUgdHlwZXMgd2UgYXJlIGNvbXBhcmluZy4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0MTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQyOwotfTsKLQotLyogRHVyaW5nIGRlYnVnX2dldF9yZWFsX3R5cGUsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcwotICAga2VwdCBvbiB0aGUgc3RhY2sgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0Ci17Ci0gIC8qIE5leHQgdHlwZSBvbiBsaXN0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICpuZXh0OwotICAvKiBUaGUgdHlwZSB3ZSBhcmUgY2hlY2tpbmcuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLX07Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGRlYnVnX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICpkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKiwgY29uc3QgY2hhciAqLAotCSAgIGVudW0gZGVidWdfb2JqZWN0X2tpbmQsIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UpKTsKLXN0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX29iamVjdF9raW5kLAotCSAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UpKTsKLXN0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqZGVidWdfbWFrZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgZW51bSBkZWJ1Z190eXBlX2tpbmQsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICpkZWJ1Z19nZXRfcmVhbF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX25hbWUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBzdHJ1Y3QgZGVidWdfbmFtZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX25hbWUgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfY2xhc3NfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z190eXBlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfZnVuY3Rpb24KLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBjb25zdCBjaGFyICosIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UsIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9ibG9jawotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z19ibG9jayAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9saW5lbm9zCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfc2V0X2NsYXNzX2lkCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z190eXBlX3NhbWVwCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfY2xhc3NfdHlwZV9zYW1lcAotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIHN0cnVjdCBkZWJ1Z190eXBlICosIHN0cnVjdCBkZWJ1Z190eXBlICopKTsKLQwKLS8qIElzc3VlIGFuIGVycm9yIG1lc3NhZ2UuICAqLwotCi1zdGF0aWMgdm9pZAotZGVidWdfZXJyb3IgKG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBtZXNzYWdlKTsKLX0KLQotLyogQWRkIGFuIG9iamVjdCB0byBhIG5hbWVzcGFjZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqCi1kZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCBuc3AsIG5hbWUsIGtpbmQsIGxpbmthZ2UpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKipuc3A7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2tpbmQga2luZDsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotewotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqbnM7Ci0KLSAgbiA9IChzdHJ1Y3QgZGVidWdfbmFtZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+bmFtZSA9IG5hbWU7Ci0gIG4tPmtpbmQgPSBraW5kOwotICBuLT5saW5rYWdlID0gbGlua2FnZTsKLQotICBucyA9ICpuc3A7Ci0gIGlmIChucyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5zID0gKHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKikgeG1hbGxvYyAoc2l6ZW9mICpucyk7Ci0gICAgICBtZW1zZXQgKG5zLCAwLCBzaXplb2YgKm5zKTsKLQotICAgICAgbnMtPnRhaWwgPSAmbnMtPmxpc3Q7Ci0KLSAgICAgICpuc3AgPSBuczsKLSAgICB9Ci0KLSAgKm5zLT50YWlsID0gbjsKLSAgbnMtPnRhaWwgPSAmbi0+bmV4dDsKLQotICByZXR1cm4gbjsKLX0KLQotLyogQWRkIGFuIG9iamVjdCB0byB0aGUgY3VycmVudCBuYW1lc3BhY2UuICAqLwotCi1zdGF0aWMgc3RydWN0IGRlYnVnX25hbWUgKgotZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBraW5kLCBsaW5rYWdlKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9raW5kIGtpbmQ7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKLXsKLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKm5zcDsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2U6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+Y3VycmVudF9ibG9jayAhPSBOVUxMKQotICAgIG5zcCA9ICZpbmZvLT5jdXJyZW50X2Jsb2NrLT5sb2NhbHM7Ci0gIGVsc2UKLSAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzOwotCi0gIHJldHVybiBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCBuc3AsIG5hbWUsIGtpbmQsIGxpbmthZ2UpOwotfQotDAotLyogUmV0dXJuIGEgaGFuZGxlIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1QVFIKLWRlYnVnX2luaXQgKCkKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgbWVtc2V0IChyZXQsIDAsIHNpemVvZiAqcmV0KTsKLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogU2V0IHRoZSBzb3VyY2UgZmlsZW5hbWUuICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgbmV3IGNvbXBpbGF0aW9uCi0gICB1bml0LiAgKi8KLQotYm9vbGVhbgotZGVidWdfc2V0X2ZpbGVuYW1lIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19maWxlICpuZmlsZTsKLSAgc3RydWN0IGRlYnVnX3VuaXQgKm51bml0OwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgbmFtZSA9ICIiOwotCi0gIG5maWxlID0gKHN0cnVjdCBkZWJ1Z19maWxlICopIHhtYWxsb2MgKHNpemVvZiAqbmZpbGUpOwotICBtZW1zZXQgKG5maWxlLCAwLCBzaXplb2YgKm5maWxlKTsKLQotICBuZmlsZS0+ZmlsZW5hbWUgPSBuYW1lOwotCi0gIG51bml0ID0gKHN0cnVjdCBkZWJ1Z191bml0ICopIHhtYWxsb2MgKHNpemVvZiAqbnVuaXQpOwotICBtZW1zZXQgKG51bml0LCAwLCBzaXplb2YgKm51bml0KTsKLQotICBudW5pdC0+ZmlsZXMgPSBuZmlsZTsKLSAgaW5mby0+Y3VycmVudF9maWxlID0gbmZpbGU7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCAhPSBOVUxMKQotICAgIGluZm8tPmN1cnJlbnRfdW5pdC0+bmV4dCA9IG51bml0OwotICBlbHNlCi0gICAgewotICAgICAgYXNzZXJ0IChpbmZvLT51bml0cyA9PSBOVUxMKTsKLSAgICAgIGluZm8tPnVuaXRzID0gbnVuaXQ7Ci0gICAgfQotCi0gIGluZm8tPmN1cnJlbnRfdW5pdCA9IG51bml0OwotCi0gIGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPSBOVUxMOwotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gTlVMTDsKLSAgaW5mby0+Y3VycmVudF9saW5lbm8gPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGFuZ2Ugc291cmNlIGZpbGVzIHRvIHRoZSBnaXZlbiBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQgZm9yCi0gICBpbmNsdWRlIGZpbGVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19zdGFydF9zb3VyY2UgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmYsICoqcGY7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19zdGFydF9zb3VyY2U6IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmb3IgKGYgPSBpbmZvLT5jdXJyZW50X3VuaXQtPmZpbGVzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5maWxlbmFtZVswXSA9PSBuYW1lWzBdCi0JICAmJiBmLT5maWxlbmFtZVsxXSA9PSBuYW1lWzFdCi0JICAmJiBzdHJjbXAgKGYtPmZpbGVuYW1lLCBuYW1lKSA9PSAwKQotCXsKLQkgIGluZm8tPmN1cnJlbnRfZmlsZSA9IGY7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKLSAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOwotCi0gIGYtPmZpbGVuYW1lID0gbmFtZTsKLQotICBmb3IgKHBmID0gJmluZm8tPmN1cnJlbnRfZmlsZS0+bmV4dDsKLSAgICAgICAqcGYgIT0gTlVMTDsKLSAgICAgICBwZiA9ICYoKnBmKS0+bmV4dCkKLSAgICA7Ci0gICpwZiA9IGY7Ci0KLSAgaW5mby0+Y3VycmVudF9maWxlID0gZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoaXMgaW1wbGljaXRseSBzdGFydHMgYSBmdW5jdGlvbgotICAgYmxvY2suICBUaGUgZGVidWdfdHlwZSBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLgotICAgVGhlIGJvb2xlYW4gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGdsb2JhbGx5IHZpc2libGUuCi0gICBUaGUgYmZkX3ZtYSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgQ3VycmVudGx5Ci0gICB0aGUgcGFyYW1ldGVyIHR5cGVzIGFyZSBzcGVjaWZpZWQgYnkgY2FsbHMgdG8KLSAgIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIuICBGSVhNRTogVGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgbmVzdGVkCi0gICBmdW5jdGlvbnMuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGhhbmRsZSwgbmFtZSwgcmV0dXJuX3R5cGUsIGdsb2JhbCwgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgICAgYm9vbGVhbiBnbG9iYWw7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICpmOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgbmFtZSA9ICIiOwotICBpZiAocmV0dXJuX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfZnVuY3Rpb246IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmID0gKHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+cmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZTsKLQotICBiID0gKHN0cnVjdCBkZWJ1Z19ibG9jayAqKSB4bWFsbG9jIChzaXplb2YgKmIpOwotICBtZW1zZXQgKGIsIDAsIHNpemVvZiAqYik7Ci0KLSAgYi0+c3RhcnQgPSBhZGRyOwotICBiLT5lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgZi0+YmxvY2tzID0gYjsKLQotICBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID0gZjsKLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IGI7Ci0KLSAgLyogRklYTUU6IElmIHdlIGNvdWxkIGhhbmRsZSBuZXN0ZWQgZnVuY3Rpb25zLCB0aGlzIHdvdWxkIGJlIHRoZQotICAgICBwbGFjZTogd2Ugd291bGQgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbmFtZXNwYWNlLiAgKi8KLSAgbiA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sCi0JCQkgICAgICAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzLAotCQkJICAgICAgbmFtZSwKLQkJCSAgICAgIERFQlVHX09CSkVDVF9GVU5DVElPTiwKLQkJCSAgICAgIChnbG9iYWwKLQkJCSAgICAgICA/IERFQlVHX0xJTktBR0VfR0xPQkFMCi0JCQkgICAgICAgOiBERUJVR19MSU5LQUdFX1NUQVRJQykpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuLT51LmZ1bmN0aW9uID0gZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgcGFyYW1ldGVyIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGhhbmRsZSwgbmFtZSwgdHlwZSwga2luZCwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICpwLCAqKnBwOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX3BhcmFtZXRlcjogbm8gY3VycmVudCBmdW5jdGlvbiIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcCA9IChzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICopIHhtYWxsb2MgKHNpemVvZiAqcCk7Ci0gIG1lbXNldCAocCwgMCwgc2l6ZW9mICpwKTsKLQotICBwLT5uYW1lID0gbmFtZTsKLSAgcC0+dHlwZSA9IHR5cGU7Ci0gIHAtPmtpbmQgPSBraW5kOwotICBwLT52YWwgPSB2YWw7Ci0KLSAgZm9yIChwcCA9ICZpbmZvLT5jdXJyZW50X2Z1bmN0aW9uLT5wYXJhbWV0ZXJzOwotICAgICAgICpwcCAhPSBOVUxMOwotICAgICAgIHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIGEgZnVuY3Rpb24uICBGSVhNRTogVGhpcyBzaG91bGQgaGFuZGxlIGZ1bmN0aW9uIG5lc3RpbmcuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19lbmRfZnVuY3Rpb24gKGhhbmRsZSwgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9mdW5jdGlvbjogbm8gY3VycmVudCBmdW5jdGlvbiIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfYmxvY2stPnBhcmVudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfZnVuY3Rpb246IHNvbWUgYmxvY2tzIHdlcmUgbm90IGNsb3NlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+Y3VycmVudF9ibG9jay0+ZW5kID0gYWRkcjsKLQotICBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID0gTlVMTDsKLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIEFsbCBsb2NhbCBpbmZvcm1hdGlvbiB3aWxsIGJlCi0gICByZWNvcmRlZCBpbiB0aGlzIGJsb2NrLCB1bnRpbCB0aGUgbWF0Y2hpbmcgY2FsbCB0byBkZWJ1Z19lbmRfYmxvY2suCi0gICBkZWJ1Z19zdGFydF9ibG9jayBhbmQgZGVidWdfZW5kX2Jsb2NrIG1heSBiZSBuZXN0ZWQuICBUaGUgYmZkX3ZtYQotICAgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jayBzdGFydHMuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19zdGFydF9ibG9jayAoaGFuZGxlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYiwgKipwYjsKLQotICAvKiBXZSBtdXN0IGFsd2F5cyBoYXZlIGEgY3VycmVudCBibG9jazogZGVidWdfcmVjb3JkX2Z1bmN0aW9uIHNldHMKLSAgICAgb25lIHVwLiAgKi8KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3N0YXJ0X2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiID0gKHN0cnVjdCBkZWJ1Z19ibG9jayAqKSB4bWFsbG9jIChzaXplb2YgKmIpOwotICBtZW1zZXQgKGIsIDAsIHNpemVvZiAqYik7Ci0KLSAgYi0+cGFyZW50ID0gaW5mby0+Y3VycmVudF9ibG9jazsKLSAgYi0+c3RhcnQgPSBhZGRyOwotICBiLT5lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgLyogVGhpcyBuZXcgYmxvY2sgaXMgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBibG9jay4gICovCi0gIGZvciAocGIgPSAmaW5mby0+Y3VycmVudF9ibG9jay0+Y2hpbGRyZW47Ci0gICAgICAgKnBiICE9IE5VTEw7Ci0gICAgICAgcGIgPSAmKCpwYiktPm5leHQpCi0gICAgOwotICAqcGIgPSBiOwotCi0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBiOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggYSBibG9jayBpbiBhIGZ1bmN0aW9uLiAgVGhpcyBtYXRjaGVzIHRoZSBjYWxsIHRvCi0gICBkZWJ1Z19zdGFydF9ibG9jay4gIFRoZSBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGlzIGJsb2NrCi0gICBlbmRzLiAgKi8KLQotYm9vbGVhbgotZGVidWdfZW5kX2Jsb2NrIChoYW5kbGUsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpwYXJlbnQ7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9ibG9jazogbm8gY3VycmVudCBibG9jayIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcGFyZW50ID0gaW5mby0+Y3VycmVudF9ibG9jay0+cGFyZW50OwotICBpZiAocGFyZW50ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9ibG9jazogYXR0ZW1wdCB0byBjbG9zZSB0b3AgbGV2ZWwgYmxvY2siKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPmN1cnJlbnRfYmxvY2stPmVuZCA9IGFkZHI7Ci0KLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IHBhcmVudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXNzb2NpYXRlIGEgbGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgYW5kIGZ1bmN0aW9uCi0gICB3aXRoIGEgZ2l2ZW4gYWRkcmVzcy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9saW5lIChoYW5kbGUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqbDsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfbGluZTogbm8gY3VycmVudCB1bml0IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBsID0gaW5mby0+Y3VycmVudF9saW5lbm87Ci0gIGlmIChsICE9IE5VTEwgJiYgbC0+ZmlsZSA9PSBpbmZvLT5jdXJyZW50X2ZpbGUpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IERFQlVHX0xJTkVOT19DT1VOVDsgaSsrKQotCXsKLQkgIGlmIChsLT5saW5lbm9zW2ldID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLQkgICAgewotCSAgICAgIGwtPmxpbmVub3NbaV0gPSBsaW5lbm87Ci0JICAgICAgbC0+YWRkcnNbaV0gPSBhZGRyOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiBlaXRoZXIgMSkgdGhlcmUgaXMgbm8gY3VycmVudF9saW5lbm8KLSAgICAgc3RydWN0dXJlLCB3aGljaCBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdCBsaW5lIG51bWJlciBpbiB0aGlzCi0gICAgIGNvbXBpbGF0aW9uIHVuaXQsIDIpIHRoZSBjdXJyZW50X2xpbmVubyBzdHJ1Y3R1cmUgaXMgZm9yIGEKLSAgICAgZGlmZmVyZW50IGZpbGUsIG9yIDMpIHRoZSBjdXJyZW50X2xpbmVubyBzdHJ1Y3R1cmUgaXMgZnVsbC4KLSAgICAgUmVnYXJkbGVzcywgd2Ugd2FudCB0byBhbGxvY2F0ZSBhIG5ldyBkZWJ1Z19saW5lbm8gc3RydWN0dXJlLCBwdXQKLSAgICAgaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLCBhbmQgbWFrZSBpdCB0aGUgbmV3IGN1cnJlbnRfbGluZW5vCi0gICAgIHN0cnVjdHVyZS4gICovCi0KLSAgbCA9IChzdHJ1Y3QgZGVidWdfbGluZW5vICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIG1lbXNldCAobCwgMCwgc2l6ZW9mICpsKTsKLQotICBsLT5maWxlID0gaW5mby0+Y3VycmVudF9maWxlOwotICBsLT5saW5lbm9zWzBdID0gbGluZW5vOwotICBsLT5hZGRyc1swXSA9IGFkZHI7Ci0gIGZvciAoaSA9IDE7IGkgPCBERUJVR19MSU5FTk9fQ09VTlQ7IGkrKykKLSAgICBsLT5saW5lbm9zW2ldID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X2xpbmVubyAhPSBOVUxMKQotICAgIGluZm8tPmN1cnJlbnRfbGluZW5vLT5uZXh0ID0gbDsKLSAgZWxzZQotICAgIGluZm8tPmN1cnJlbnRfdW5pdC0+bGluZW5vcyA9IGw7Ci0KLSAgaW5mby0+Y3VycmVudF9saW5lbm8gPSBsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIG5hbWVkIGNvbW1vbiBibG9jay4gIFRoaXMgaXMgYSBibG9jayBvZiB2YXJpYWJsZXMgdGhhdCBtYXkKLSAgIG1vdmUgaW4gbWVtb3J5LiAgKi8KLQotYm9vbGVhbgotZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIEZJWE1FICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19zdGFydF9jb21tb25fYmxvY2s6IG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBFbmQgYSBuYW1lZCBjb21tb24gYmxvY2suICAqLwotCi1ib29sZWFuCi1kZWJ1Z19lbmRfY29tbW9uX2Jsb2NrIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIEZJWE1FICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9pbnRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVCwKLQkJCQkgICAgICBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuLT51LmludF9jb25zdGFudCA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkb3VibGUgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+dS5mbG9hdF9jb25zdGFudCA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgdHlwZWQgY29uc3RhbnQgd2l0aCBhbiBpbnRlZ3JhbCB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF90eXBlZF9jb25zdCAoaGFuZGxlLCBuYW1lLCB0eXBlLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfdHlwZWRfY29uc3RhbnQgKnRjOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdGMgPSAoc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICopIHhtYWxsb2MgKHNpemVvZiAqdGMpOwotICBtZW1zZXQgKHRjLCAwLCBzaXplb2YgKnRjKTsKLQotICB0Yy0+dHlwZSA9IHR5cGU7Ci0gIHRjLT52YWwgPSB2YWw7Ci0KLSAgbi0+dS50eXBlZF9jb25zdGFudCA9IHRjOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBsYWJlbC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9sYWJlbCAoaGFuZGxlLCBuYW1lLCB0eXBlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgLyogRklYTUUuICAqLwotICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2xhYmVsIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWNvcmQgYSB2YXJpYWJsZS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF92YXJpYWJsZSAoaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKm5zcDsKLSAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLSAgc3RydWN0IGRlYnVnX3ZhcmlhYmxlICp2OwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGtpbmQgPT0gREVCVUdfR0xPQkFMIHx8IGtpbmQgPT0gREVCVUdfU1RBVElDKQotICAgIHsKLSAgICAgIG5zcCA9ICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHM7Ci0gICAgICBpZiAoa2luZCA9PSBERUJVR19HTE9CQUwpCi0JbGlua2FnZSA9IERFQlVHX0xJTktBR0VfR0xPQkFMOwotICAgICAgZWxzZQotCWxpbmthZ2UgPSBERUJVR19MSU5LQUdFX1NUQVRJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQotCXsKLQkgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgYmxvY2siKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbnNwID0gJmluZm8tPmN1cnJlbnRfYmxvY2stPmxvY2FsczsKLSAgICAgIGxpbmthZ2UgPSBERUJVR19MSU5LQUdFX0FVVE9NQVRJQzsKLSAgICB9Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sIG5zcCwgbmFtZSwgREVCVUdfT0JKRUNUX1ZBUklBQkxFLCBsaW5rYWdlKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdiA9IChzdHJ1Y3QgZGVidWdfdmFyaWFibGUgKikgeG1hbGxvYyAoc2l6ZW9mICp2KTsKLSAgbWVtc2V0ICh2LCAwLCBzaXplb2YgKnYpOwotCi0gIHYtPmtpbmQgPSBraW5kOwotICB2LT50eXBlID0gdHlwZTsKLSAgdi0+dmFsID0gdmFsOwotCi0gIG4tPnUudmFyaWFibGUgPSB2OwotCi0gIHJldHVybiB0cnVlOyAgCi19Ci0KLS8qIE1ha2UgYSB0eXBlIHdpdGggYSBnaXZlbiBraW5kIGFuZCBzaXplLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgc3RydWN0IGRlYnVnX3R5cGUgKgotZGVidWdfbWFrZV90eXBlIChpbmZvLCBraW5kLCBzaXplKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgdCA9IChzdHJ1Y3QgZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnQpOwotICBtZW1zZXQgKHQsIDAsIHNpemVvZiAqdCk7Ci0KLSAgdC0+a2luZCA9IGtpbmQ7Ci0gIHQtPnNpemUgPSBzaXplOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIGluZGlyZWN0IHR5cGUgd2hpY2ggbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgYSB0eXBlCi0gICB3aGljaCBpcyByZWZlcmVuY2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChoYW5kbGUsIHNsb3QsIHRhZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSAqc2xvdDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2luZGlyZWN0X3R5cGUgKmk7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9JTkRJUkVDVCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpID0gKHN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqaSk7Ci0gIG1lbXNldCAoaSwgMCwgc2l6ZW9mICppKTsKLQotICBpLT5zbG90ID0gc2xvdDsKLSAgaS0+dGFnID0gdGFnOwotCi0gIHQtPnUua2luZGlyZWN0ID0gaTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gIFRoZXJlIGlzIG9ubHkgb25lIG9mIHRoZXNlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV92b2lkX3R5cGUgKGhhbmRsZSkKLSAgICAgUFRSIGhhbmRsZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1ZPSUQsIDApOwotfQotCi0vKiBNYWtlIGFuIGludGVnZXIgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBUaGUgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlCi0gICBpZiB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfaW50X3R5cGUgKGhhbmRsZSwgc2l6ZSwgdW5zaWduZWRwKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfSU5ULCBzaXplKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua2ludCA9IHVuc2lnbmVkcDsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIGZsb2F0aW5nIHBvaW50IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgRklYTUU6IE9uIHNvbWUKLSAgIHBsYXRmb3JtcywgbGlrZSBhbiBBbHBoYSwgeW91IHByb2JhYmx5IG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5Ci0gICB0aGUgZm9ybWF0LiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9mbG9hdF90eXBlIChoYW5kbGUsIHNpemUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfRkxPQVQsIHNpemUpOwotfQotCi0vKiBNYWtlIGEgYm9vbGVhbiB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfYm9vbF90eXBlIChoYW5kbGUsIHNpemUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQk9PTCwgc2l6ZSk7Ci19Ci0KLS8qIE1ha2UgYSBjb21wbGV4IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGhhbmRsZSwgc2l6ZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9DT01QTEVYLCBzaXplKTsKLX0KLQotLyogTWFrZSBhIHN0cnVjdHVyZSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0cnVlIGZvciBhIHN0cnVjdCwKLSAgIGZhbHNlIGZvciBhIHVuaW9uLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QuCi0gICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIGJmZF92bWEgc2l6ZTsKLSAgICAgZGVidWdfZmllbGQgKmZpZWxkczsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sCi0JCSAgICAgICBzdHJ1Y3RwID8gREVCVUdfS0lORF9TVFJVQ1QgOiBERUJVR19LSU5EX1VOSU9OLAotCQkgICAgICAgc2l6ZSk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBjID0gKHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYyk7Ci0gIG1lbXNldCAoYywgMCwgc2l6ZW9mICpjKTsKLQotICBjLT5maWVsZHMgPSBmaWVsZHM7Ci0KLSAgdC0+dS5rY2xhc3MgPSBjOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIG9iamVjdCB0eXBlLiAgVGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBhZnRlciB0aGUgaGFuZGxlCi0gICBhcmUgdGhlIHNhbWUgYXMgZm9yIGRlYnVnX21ha2Vfc3RydWN0X3R5cGUuICBUaGUgbmV4dCBhcmd1bWVudHMgYXJlCi0gICBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBiYXNlIGNsYXNzZXMsIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mCi0gICBtZXRob2RzLCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGhvbGRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKLSAgIGlmIGl0IGlzIG5vdCB0aGlzIG9iamVjdCwgYW5kIGEgYm9vbGVhbiB3aGljaCBpcyB0cnVlIGlmIHRoaXMKLSAgIG9iamVjdCBoYXMgaXRzIG93biB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9vYmplY3RfdHlwZSAoaGFuZGxlLCBzdHJ1Y3RwLCBzaXplLCBmaWVsZHMsIGJhc2VjbGFzc2VzLAotCQkJbWV0aG9kcywgdnB0cmJhc2UsIG93bnZwdHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgYmZkX3ZtYSBzaXplOwotICAgICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICAgICBkZWJ1Z19iYXNlY2xhc3MgKmJhc2VjbGFzc2VzOwotICAgICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gICAgIGRlYnVnX3R5cGUgdnB0cmJhc2U7Ci0gICAgIGJvb2xlYW4gb3dudnB0cjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sCi0JCSAgICAgICBzdHJ1Y3RwID8gREVCVUdfS0lORF9DTEFTUyA6IERFQlVHX0tJTkRfVU5JT05fQ0xBU1MsCi0JCSAgICAgICBzaXplKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGMgPSAoc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpjKTsKLSAgbWVtc2V0IChjLCAwLCBzaXplb2YgKmMpOwotCi0gIGMtPmZpZWxkcyA9IGZpZWxkczsKLSAgYy0+YmFzZWNsYXNzZXMgPSBiYXNlY2xhc3NlczsKLSAgYy0+bWV0aG9kcyA9IG1ldGhvZHM7Ci0gIGlmIChvd252cHRyKQotICAgIGMtPnZwdHJiYXNlID0gdDsKLSAgZWxzZQotICAgIGMtPnZwdHJiYXNlID0gdnB0cmJhc2U7Ci0KLSAgdC0+dS5rY2xhc3MgPSBjOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIGVudW1lcmF0aW9uIHR5cGUuICBUaGUgYXJndW1lbnRzIGFyZSBhIG51bGwgdGVybWluYXRlZAotICAgYXJyYXkgb2Ygc3RyaW5ncywgYW5kIGFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9lbnVtX3R5cGUgKGhhbmRsZSwgbmFtZXMsIHZhbHVlcykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2VudW1fdHlwZSAqZTsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0VOVU0sIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgZSA9IChzdHJ1Y3QgZGVidWdfZW51bV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqZSk7Ci0gIG1lbXNldCAoZSwgMCwgc2l6ZW9mICplKTsKLQotICBlLT5uYW1lcyA9IG5hbWVzOwotICBlLT52YWx1ZXMgPSB2YWx1ZXM7Ci0KLSAgdC0+dS5rZW51bSA9IGU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBwb2ludGVyIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICh0eXBlLT5wb2ludGVyICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gdHlwZS0+cG9pbnRlcjsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1BPSU5URVIsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5rcG9pbnRlciA9IHR5cGU7Ci0KLSAgdHlwZS0+cG9pbnRlciA9IHQ7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBnaXZlbiB0eXBlLiAgRklYTUU6IFdlIHNob3VsZCBiZSBhYmxlCi0gICB0byByZWNvcmQgdGhlIHBhcmFtZXRlciB0eXBlcy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoaGFuZGxlLCB0eXBlLCBhcmdfdHlwZXMsIHZhcmFyZ3MpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSAqZjsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9GVU5DVElPTiwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBmID0gKHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5yZXR1cm5fdHlwZSA9IHR5cGU7Ci0gIGYtPmFyZ190eXBlcyA9IGFyZ190eXBlczsKLSAgZi0+dmFyYXJncyA9IHZhcmFyZ3M7Ci0KLSAgdC0+dS5rZnVuY3Rpb24gPSBmOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgcmVmZXJlbmNlIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9SRUZFUkVOQ0UsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5rcmVmZXJlbmNlID0gdHlwZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHJhbmdlIG9mIGEgZ2l2ZW4gdHlwZSBmcm9tIGEgbG93ZXIgdG8gYW4gdXBwZXIgYm91bmQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3JhbmdlX3R5cGUgKGhhbmRsZSwgdHlwZSwgbG93ZXIsIHVwcGVyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAgICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlICpyOwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1JBTkdFLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHIgPSAoc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKLSAgbWVtc2V0IChyLCAwLCBzaXplb2YgKnIpOwotCi0gIHItPnR5cGUgPSB0eXBlOwotICByLT5sb3dlciA9IGxvd2VyOwotICByLT51cHBlciA9IHVwcGVyOwotCi0gIHQtPnUua3JhbmdlID0gcjsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50Ci0gICBvZiB0aGUgYXJyYXkuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYSByYW5nZSBvZiB0aGUKLSAgIGFycmF5LiAgVGhlIGZvdXJ0aCBhbmQgZmlmdGggYXJndW1lbnQgYXJlIHRoZSBsb3dlciBhbmQgdXBwZXIKLSAgIGJvdW5kcywgcmVzcGVjdGl2ZWx5LiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcyBhcnJheSBpcwotICAgYWN0dWFsbHkgYSBzdHJpbmcsIGFzIGluIEMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGhhbmRsZSwgZWxlbWVudF90eXBlLCByYW5nZV90eXBlLCBsb3dlciwgdXBwZXIsCi0JCSAgICAgICBzdHJpbmdwKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIGVsZW1lbnRfdHlwZTsKLSAgICAgZGVidWdfdHlwZSByYW5nZV90eXBlOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19hcnJheV90eXBlICphOwotCi0gIGlmIChlbGVtZW50X3R5cGUgPT0gTlVMTCB8fCByYW5nZV90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0FSUkFZLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGEgPSAoc3RydWN0IGRlYnVnX2FycmF5X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICphKTsKLSAgbWVtc2V0IChhLCAwLCBzaXplb2YgKmEpOwotCi0gIGEtPmVsZW1lbnRfdHlwZSA9IGVsZW1lbnRfdHlwZTsKLSAgYS0+cmFuZ2VfdHlwZSA9IHJhbmdlX3R5cGU7Ci0gIGEtPmxvd2VyID0gbG93ZXI7Ci0gIGEtPnVwcGVyID0gdXBwZXI7Ci0gIGEtPnN0cmluZ3AgPSBzdHJpbmdwOwotCi0gIHQtPnUua2FycmF5ID0gYTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHNldCBvZiBhIGdpdmVuIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBQYXNjYWwgc2V0IHR5cGUuICBUaGUKLSAgIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIHNldCBpcyBhY3R1YWxseSBhIGJpdHN0cmluZywgYXMgaW4KLSAgIENISUxMLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9zZXRfdHlwZSAoaGFuZGxlLCB0eXBlLCBiaXRzdHJpbmdwKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJvb2xlYW4gYml0c3RyaW5ncDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19zZXRfdHlwZSAqczsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9TRVQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgcyA9IChzdHJ1Y3QgZGVidWdfc2V0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzKTsKLSAgbWVtc2V0IChzLCAwLCBzaXplb2YgKnMpOwotCi0gIHMtPnR5cGUgPSB0eXBlOwotICBzLT5iaXRzdHJpbmdwID0gYml0c3RyaW5ncDsKLQotICB0LT51LmtzZXQgPSBzOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBwb2ludGVyIHdoaWNoIGlzIHJlbGF0aXZlIHRvIGFuIG9iamVjdC4gIFRoZQotICAgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gd2hpY2ggdGhlIHBvaW50ZXIgaXMKLSAgIHJlbGF0aXZlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIHRoYXQgdGhlIHBvaW50ZXIgcG9pbnRzCi0gICB0by4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUgKGhhbmRsZSwgYmFzZV90eXBlLCB0YXJnZXRfdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSBiYXNlX3R5cGU7Ci0gICAgIGRlYnVnX3R5cGUgdGFyZ2V0X3R5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUgKm87Ci0KLSAgaWYgKGJhc2VfdHlwZSA9PSBOVUxMIHx8IHRhcmdldF90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX09GRlNFVCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBvID0gKHN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm8pOwotICBtZW1zZXQgKG8sIDAsIHNpemVvZiAqbyk7Ci0KLSAgby0+YmFzZV90eXBlID0gYmFzZV90eXBlOwotICBvLT50YXJnZXRfdHlwZSA9IHRhcmdldF90eXBlOwotCi0gIHQtPnUua29mZnNldCA9IG87Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSB0eXBlIGZvciBhIG1ldGhvZCBmdW5jdGlvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICByZXR1cm4gdHlwZSwgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBkb21haW4sIGFuZCB0aGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGhhbmRsZSwgcmV0dXJuX3R5cGUsIGRvbWFpbl90eXBlLCBhcmdfdHlwZXMsIHZhcmFyZ3MpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gICAgIGRlYnVnX3R5cGUgZG9tYWluX3R5cGU7Ci0gICAgIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX21ldGhvZF90eXBlICptOwotCi0gIGlmIChyZXR1cm5fdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9NRVRIT0QsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPnJldHVybl90eXBlID0gcmV0dXJuX3R5cGU7Ci0gIG0tPmRvbWFpbl90eXBlID0gZG9tYWluX3R5cGU7Ci0gIG0tPmFyZ190eXBlcyA9IGFyZ190eXBlczsKLSAgbS0+dmFyYXJncyA9IHZhcmFyZ3M7Ci0KLSAgdC0+dS5rbWV0aG9kID0gbTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfY29uc3RfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0NPTlNULCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua2NvbnN0ID0gdHlwZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1ZPTEFUSUxFLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua3ZvbGF0aWxlID0gdHlwZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiB1bmRlZmluZWQgdGFnZ2VkIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBzdHJ1Y3Qgd2hpY2ggaGFzCi0gICBiZWVuIG1lbnRpb25lZCwgYnV0IG5vdCBkZWZpbmVkLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUgKGhhbmRsZSwgbmFtZSwga2luZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfRU5VTToKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19tYWtlX3VuZGVmaW5lZF90eXBlOiB1bnN1cHBvcnRlZCBraW5kIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywga2luZCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICByZXR1cm4gZGVidWdfdGFnX3R5cGUgKGhhbmRsZSwgbmFtZSwgdCk7Ci19Ci0KLS8qIE1ha2UgYSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBiYXNlCi0gICBjbGFzcyB0eXBlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhpcyBiYXNlCi0gICBjbGFzcyBpbiB0aGUgb2JqZWN0IChhbHdheXMgMCB1bmxlc3MgZG9pbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2UpLgotICAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYSB2aXJ0dWFsIGNsYXNzLiAgVGhlIGZpZnRoCi0gICBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYmFzZSBjbGFzcy4gICovCi0KLS8qQVJHU1VTRUQqLwotZGVidWdfYmFzZWNsYXNzCi1kZWJ1Z19tYWtlX2Jhc2VjbGFzcyAoaGFuZGxlLCB0eXBlLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17ICAgICAKLSAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqYjsKLQotICBiID0gKHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKLSAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOwotCi0gIGItPnR5cGUgPSB0eXBlOwotICBiLT5iaXRwb3MgPSBiaXRwb3M7Ci0gIGItPnZpcnR1YWwgPSB2aXJ0dWFsOwotICBiLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gYjsKLX0KLQotLyogTWFrZSBhIGZpZWxkIGZvciBhIHN0cnVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUuICBUaGUKLSAgIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIGZpZWxkLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mCi0gICB0aGUgZmllbGQgKGl0IG1heSBiZSB6ZXJvKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eQotICAgb2YgdGhlIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19maWVsZAotZGVidWdfbWFrZV9maWVsZCAoaGFuZGxlLCBuYW1lLCB0eXBlLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJmZF92bWEgYml0c2l6ZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotICBmID0gKHN0cnVjdCBkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+bmFtZSA9IG5hbWU7Ci0gIGYtPnR5cGUgPSB0eXBlOwotICBmLT5zdGF0aWNfbWVtYmVyID0gZmFsc2U7Ci0gIGYtPnUuZi5iaXRwb3MgPSBiaXRwb3M7Ci0gIGYtPnUuZi5iaXRzaXplID0gYml0c2l6ZTsKLSAgZi0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWVtYmVyIG9mIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICBuYW1lLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIuICBUaGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgbWVtYmVyIChpLmUuLCB0aGUgbmFtZSBhcyBhCi0gICBnbG9iYWwgdmFyaWFibGUpLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQotICAgbWVtYmVyLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19maWVsZAotZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChoYW5kbGUsIG5hbWUsIHR5cGUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5uYW1lID0gbmFtZTsKLSAgZi0+dHlwZSA9IHR5cGU7Ci0gIGYtPnN0YXRpY19tZW1iZXIgPSB0cnVlOwotICBmLT51LnMucGh5c25hbWUgPSBwaHlzbmFtZTsKLSAgZi0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIE1ha2UgYSBtZXRob2QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLCBhbmQgdGhlIHRoaXJkCi0gICBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBtZXRob2QgdmFyaWFudHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX21ldGhvZAotZGVidWdfbWFrZV9tZXRob2QgKGhhbmRsZSwgbmFtZSwgdmFyaWFudHMpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX21ldGhvZF92YXJpYW50ICp2YXJpYW50czsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTsKLQotICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2QgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPm5hbWUgPSBuYW1lOwotICBtLT52YXJpYW50cyA9IHZhcmlhbnRzOwotCi0gIHJldHVybiBtOwotfQotCi0vKiBNYWtlIGEgbWV0aG9kIGFyZ3VtZW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcmVhbCBuYW1lIG9mCi0gICB0aGUgZnVuY3Rpb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhlCi0gICBmb3VydGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgd2hldGhlcgotICAgdGhpcyBpcyBhIGNvbnN0IGZ1bmN0aW9uLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhCi0gICB2b2xhdGlsZSBmdW5jdGlvbi4gIFRoZSBzZXZlbnRoIGFyZ3VtZW50IGlzIHRoZSBvZmZzZXQgaW4gdGhlCi0gICB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLCBpZiBhbnkuICBUaGUgZWlnaHRoIGFyZ3VtZW50IGlzIHRoZSB2aXJ0dWFsCi0gICBmdW5jdGlvbiBjb250ZXh0LiAgRklYTUU6IEFyZSB0aGUgY29uc3QgYW5kIHZvbGF0aWxlIGFyZ3VtZW50cwotICAgbmVjZXNzYXJ5PyAgQ291bGQgd2UganVzdCB1c2UgZGVidWdfbWFrZV9jb25zdF90eXBlPyAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19tZXRob2RfdmFyaWFudAotZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoaGFuZGxlLCBwaHlzbmFtZSwgdHlwZSwgdmlzaWJpbGl0eSwgY29uc3RwLAotCQkJICAgdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGRlYnVnX3R5cGUgY29udGV4dDsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICptOwotCi0gIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5waHlzbmFtZSA9IHBoeXNuYW1lOwotICBtLT50eXBlID0gdHlwZTsKLSAgbS0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0gIG0tPmNvbnN0cCA9IGNvbnN0cDsKLSAgbS0+dm9sYXRpbGVwID0gdm9sYXRpbGVwOwotICBtLT52b2Zmc2V0ID0gdm9mZnNldDsKLSAgbS0+Y29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgcmV0dXJuIG07Ci19Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWV0aG9kIGFyZ3VtZW50LiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yCi0gICBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50LCBleGNlcHQgdGhhdCB0aGUgbGFzdCB0d28gYXJlIG9taXR0ZWQKLSAgIHNpbmNlIGEgc3RhdGljIG1ldGhvZCBjYW4gbm90IGFsc28gYmUgdmlydHVhbC4gICovCi0KLWRlYnVnX21ldGhvZF92YXJpYW50Ci1kZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCAoaGFuZGxlLCBwaHlzbmFtZSwgdHlwZSwgdmlzaWJpbGl0eSwKLQkJCQkgIGNvbnN0cCwgdm9sYXRpbGVwKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotewotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKm07Ci0KLSAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPnBoeXNuYW1lID0gcGh5c25hbWU7Ci0gIG0tPnR5cGUgPSB0eXBlOwotICBtLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLSAgbS0+Y29uc3RwID0gY29uc3RwOwotICBtLT52b2xhdGlsZXAgPSB2b2xhdGlsZXA7Ci0gIG0tPnZvZmZzZXQgPSBWT0ZGU0VUX1NUQVRJQ19NRVRIT0Q7Ci0KLSAgcmV0dXJuIG07Ci19Ci0KLS8qIE5hbWUgYSB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbmFtZV90eXBlIChoYW5kbGUsIG5hbWUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICpuOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbm07Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19uYW1lX3R5cGU6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfTkFNRUQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgbiA9IChzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+dHlwZSA9IHR5cGU7Ci0KLSAgdC0+dS5rbmFtZWQgPSBuOwotCi0gIC8qIFdlIGFsd2F5cyBhZGQgdGhlIG5hbWUgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBUaGlzIGlzIHByb2JhYmx5Ci0gICAgIHdyb25nIGluIHNvbWUgY2FzZXMsIGJ1dCBpdCBzZWVtcyB0byBiZSByaWdodCBmb3Igc3RhYnMuICBGSVhNRS4gICovCi0KLSAgbm0gPSBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzLCBuYW1lLAotCQkJICAgICAgIERFQlVHX09CSkVDVF9UWVBFLCBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobm0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbm0tPnUudHlwZSA9IHQ7Ci0KLSAgbi0+bmFtZSA9IG5tOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBUYWcgYSB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfdGFnX3R5cGUgKGhhbmRsZSwgbmFtZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpubTsKLQotICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfdGFnX3R5cGU6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lLCBuYW1lKSA9PSAwKQotCXJldHVybiB0eXBlOwotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3RhZ190eXBlOiBleHRyYSB0YWcgYXR0ZW1wdGVkIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9UQUdHRUQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgbiA9IChzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+dHlwZSA9IHR5cGU7Ci0KLSAgdC0+dS5rbmFtZWQgPSBuOwotCi0gIC8qIFdlIGtlZXAgYSBnbG9iYWwgbmFtZXNwYWNlIG9mIHRhZ3MgZm9yIGVhY2ggY29tcGlsYXRpb24gdW5pdC4gIEkKLSAgICAgZG9uJ3Qga25vdyBpZiB0aGF0IGlzIHRoZSByaWdodCB0aGluZyB0byBkby4gICovCi0KLSAgbm0gPSBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzLCBuYW1lLAotCQkJICAgICAgIERFQlVHX09CSkVDVF9UQUcsIERFQlVHX0xJTktBR0VfTk9ORSk7Ci0gIGlmIChubSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBubS0+dS50YWcgPSB0OwotCi0gIG4tPm5hbWUgPSBubTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogUmVjb3JkIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotZGVidWdfcmVjb3JkX3R5cGVfc2l6ZSAoaGFuZGxlLCB0eXBlLCBzaXplKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBpZiAodHlwZS0+c2l6ZSAhPSAwICYmIHR5cGUtPnNpemUgIT0gc2l6ZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIldhcm5pbmc6IGNoYW5naW5nIHR5cGUgc2l6ZSBmcm9tICVkIHRvICVkXG4iKSwKLQkgICAgIHR5cGUtPnNpemUsIHNpemUpOwotCi0gIHR5cGUtPnNpemUgPSBzaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5kIGEgbmFtZWQgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7Ci0gIHN0cnVjdCBkZWJ1Z19maWxlICpmOwotCi0gIC8qIFdlIG9ubHkgc2VhcmNoIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICBJIGRvbid0IGtub3cgaWYKLSAgICAgdGhpcyBpcyByaWdodCBvciBub3QuICAqLwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZmluZF9uYW1lZF90eXBlOiBubyBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBmb3IgKGIgPSBpbmZvLT5jdXJyZW50X2Jsb2NrOyBiICE9IE5VTEw7IGIgPSBiLT5wYXJlbnQpCi0gICAgewotICAgICAgaWYgKGItPmxvY2FscyAhPSBOVUxMKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBmb3IgKG4gPSBiLT5sb2NhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAobi0+a2luZCA9PSBERUJVR19PQkpFQ1RfVFlQRQotCQkgICYmIG4tPm5hbWVbMF0gPT0gbmFtZVswXQotCQkgICYmIHN0cmNtcCAobi0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJcmV0dXJuIG4tPnUudHlwZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yIChmID0gaW5mby0+Y3VycmVudF91bml0LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+Z2xvYmFscyAhPSBOVUxMKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBmb3IgKG4gPSBmLT5nbG9iYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKG4tPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RZUEUKLQkJICAmJiBuLT5uYW1lWzBdID09IG5hbWVbMF0KLQkJICAmJiBzdHJjbXAgKG4tPm5hbWUsIG5hbWUpID09IDApCi0JCXJldHVybiBuLT51LnR5cGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBERUJVR19UWVBFX05VTEw7CSAgCi19Ci0KLS8qIEZpbmQgYSB0YWdnZWQgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGhhbmRsZSwgbmFtZSwga2luZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3VuaXQgKnU7Ci0KLSAgLyogV2Ugc2VhcmNoIHRoZSBnbG9iYWxzIG9mIGFsbCB0aGUgY29tcGlsYXRpb24gdW5pdHMuICBJIGRvbid0IGtub3cKLSAgICAgaWYgdGhpcyBpcyBjb3JyZWN0IG9yIG5vdC4gIEl0IHdvdWxkIGJlIGVhc3kgdG8gY2hhbmdlLiAgKi8KLQotICBmb3IgKHUgPSBpbmZvLT51bml0czsgdSAhPSBOVUxMOyB1ID0gdS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfZmlsZSAqZjsKLQotICAgICAgZm9yIChmID0gdS0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JewotCSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLQkgIGlmIChmLT5nbG9iYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKG4gPSBmLT5nbG9iYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQl7Ci0JCSAgaWYgKG4tPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RBRwotCQkgICAgICAmJiAoa2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwKLQkJCSAgfHwgbi0+dS50YWctPmtpbmQgPT0ga2luZCkKLQkJICAgICAgJiYgbi0+bmFtZVswXSA9PSBuYW1lWzBdCi0JCSAgICAgICYmIHN0cmNtcCAobi0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJICAgIHJldHVybiBuLT51LnRhZzsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotfQotCi0vKiBHZXQgYSBiYXNlIHR5cGUuICBXZSBidWlsZCBhIGxpbmtlZCBsaXN0IG9uIHRoZSBzdGFjayB0byBhdm9pZAotICAgY3Jhc2hpbmcgaWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBjaXJjdWxhcmx5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICoKLWRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgbGlzdCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKmxpc3Q7Ci17Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCAqbDsKLSAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0IHJsOwotCi0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0eXBlOwotCi0gICAgY2FzZSBERUJVR19LSU5EX0lORElSRUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGZvciAobCA9IGxpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnQgPT0gdHlwZSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgIF8oImRlYnVnX2dldF9yZWFsX3R5cGU6IGNpcmN1bGFyIGRlYnVnIGluZm9ybWF0aW9uIGZvciAlc1xuIiksCi0JCSAgIGRlYnVnX2dldF90eXBlX25hbWUgKGhhbmRsZSwgdHlwZSkpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICBybC5uZXh0ID0gbGlzdDsKLSAgcmwudCA9IHR5cGU7Ci0KLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICAgIC8qIFRoZSBkZWZhdWx0IGNhc2UgaXMganVzdCBoZXJlIHRvIGF2b2lkIHdhcm5pbmdzLiAgKi8KLSAgICBkZWZhdWx0OgotICAgIGNhc2UgREVCVUdfS0lORF9JTkRJUkVDVDoKLSAgICAgIGlmICgqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QgIT0gTlVMTCkKLQlyZXR1cm4gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCAqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QsICZybCk7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIHJldHVybiBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlLCAmcmwpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSBraW5kIG9mIGEgdHlwZS4gICovCi0KLWVudW0gZGVidWdfdHlwZV9raW5kCi1kZWJ1Z19nZXRfdHlwZV9raW5kIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfS0lORF9JTExFR0FMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfS0lORF9JTExFR0FMOwotICByZXR1cm4gdHlwZS0+a2luZDsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgdHlwZS4gICovCi0KLWNvbnN0IGNoYXIgKgotZGVidWdfZ2V0X3R5cGVfbmFtZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgaWYgKCp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCAhPSBOVUxMKQotCXJldHVybiBkZWJ1Z19nZXRfdHlwZV9uYW1lIChoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCk7Ci0gICAgICByZXR1cm4gdHlwZS0+dS5raW5kaXJlY3QtPnRhZzsKLSAgICB9Ci0gIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgcmV0dXJuIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIGEgdHlwZS4gICovCi0KLWJmZF92bWEKLWRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIGRvbid0IGNhbGwgZGVidWdfZ2V0X3JlYWxfdHlwZSwgYmVjYXVzZSBzb21lYm9keSBtaWdodCBoYXZlCi0gICAgIGNhbGxlZCBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIG9uIGEgbmFtZWQgb3IgaW5kaXJlY3QgdHlwZS4gICovCi0KLSAgaWYgKHR5cGUtPnNpemUgIT0gMCkKLSAgICByZXR1cm4gdHlwZS0+c2l6ZTsKLQotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6Ci0gICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ICE9IE5VTEwpCi0JcmV0dXJuIGRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgKnR5cGUtPnUua2luZGlyZWN0LT5zbG90KTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgcmV0dXJuIGRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfZ2V0X3JldHVybl90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgIHJldHVybiB0eXBlLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGU7Ci0gICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKLSAgICAgIHJldHVybiB0eXBlLT51LmttZXRob2QtPnJldHVybl90eXBlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8gICAgICAKLX0KLQotLyogR2V0IHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZSAoZXhjZXB0IHRoYXQKLSAgIHdlIGRvbid0IGN1cnJlbnRseSBzdG9yZSB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIGEgZnVuY3Rpb24pLiAgKi8KLQotY29uc3QgZGVidWdfdHlwZSAqCi1kZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIChoYW5kbGUsIHR5cGUsIHB2YXJhcmdzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJvb2xlYW4gKnB2YXJhcmdzOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OOgotICAgICAgKnB2YXJhcmdzID0gdHlwZS0+dS5rZnVuY3Rpb24tPnZhcmFyZ3M7Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlczsKLSAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgotICAgICAgKnB2YXJhcmdzID0gdHlwZS0+dS5rbWV0aG9kLT52YXJhcmdzOwotICAgICAgcmV0dXJuIHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSB0YXJnZXQgdHlwZSBvZiBhIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX1BPSU5URVI6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rcG9pbnRlcjsKLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgcmV0dXJuIHR5cGUtPnUua3JlZmVyZW5jZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rY29uc3Q7Ci0gICAgY2FzZSBERUJVR19LSU5EX1ZPTEFUSUxFOgotICAgICAgcmV0dXJuIHR5cGUtPnUua3ZvbGF0aWxlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzIGZvciBhIHN0cnVjdCwgdW5pb24sIG9yCi0gICBjbGFzcy4gICovCi0KLWNvbnN0IGRlYnVnX2ZpZWxkICoKLWRlYnVnX2dldF9maWVsZHMgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIHJldHVybiB0eXBlLT51LmtjbGFzcy0+ZmllbGRzOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSB0eXBlIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX3R5cGUKLWRlYnVnX2dldF9maWVsZF90eXBlIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBmaWVsZC0+dHlwZTsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWNvbnN0IGNoYXIgKgotZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGZpZWxkLT5uYW1lOwotfQotCi0vKiBHZXQgdGhlIGJpdCBwb3NpdGlvbiBvZiBhIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfdm1hCi1kZWJ1Z19nZXRfZmllbGRfYml0cG9zIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwgfHwgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSAgcmV0dXJuIGZpZWxkLT51LmYuYml0cG9zOwotfQotCi0vKiBHZXQgdGhlIGJpdCBzaXplIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJmZF92bWEKLWRlYnVnX2dldF9maWVsZF9iaXRzaXplIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwgfHwgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSAgcmV0dXJuIGZpZWxkLT51LmYuYml0c2l6ZTsKLX0KLQotLyogR2V0IHRoZSB2aXNpYmlsaXR5IG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWVudW0gZGVidWdfdmlzaWJpbGl0eQotZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVklTSUJJTElUWV9JR05PUkU7Ci0gIHJldHVybiBmaWVsZC0+dmlzaWJpbGl0eTsKLX0KLQotLyogR2V0IHRoZSBwaHlzaWNhbCBuYW1lIG9mIGEgZmllbGQuICAqLwotCi1jb25zdCBjaGFyICoKLWRlYnVnX2dldF9maWVsZF9waHlzbmFtZSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMIHx8ICEgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBmaWVsZC0+dS5zLnBoeXNuYW1lOwotfQotDAotLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGlzIGdpdmVuIGEgaGFuZGxlIHRvCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGFuZCBhIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyB0byBjYWxsLiAgKi8KLQotYm9vbGVhbgotZGVidWdfd3JpdGUgKGhhbmRsZSwgZm5zLCBmaGFuZGxlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqdTsKLQotICAvKiBXZSB1c2UgYSBtYXJrIHRvIHRlbGwgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgYQotICAgICBwYXJ0aWN1bGFyIG5hbWUuICBXZSB1c2UgYW4gaW50ZWdlciwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvCi0gICAgIGNsZWFyIHRoZSBtYXJrIGZpZWxkcyBpZiB3ZSBoYXBwZW4gdG8gd3JpdGUgb3V0IHRoZSBzYW1lCi0gICAgIGluZm9ybWF0aW9uIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgKytpbmZvLT5tYXJrOwotCi0gIC8qIFRoZSBiYXNlX2lkIGZpZWxkIGhvbGRzIGFuIElEIHZhbHVlIHdoaWNoIHdpbGwgbmV2ZXIgYmUgdXNlZCwgc28KLSAgICAgdGhhdCB3ZSBjYW4gdGVsbCB3aGV0aGVyIHdlIGhhdmUgYXNzaWduZWQgYW4gSUQgZHVyaW5nIHRoaXMgY2FsbAotICAgICB0byBkZWJ1Z193cml0ZS4gICovCi0gIGluZm8tPmJhc2VfaWQgPSBpbmZvLT5jbGFzc19pZDsKLQotICAvKiBXZSBrZWVwIGEgbGlua2VkIGxpc3Qgb2YgY2xhc3NlcyBmb3Igd2hpY2ggd2FzIGhhdmUgYXNzaWduZWQgSUQncwotICAgICBkdXJpbmcgdGhpcyBjYWxsIHRvIGRlYnVnX3dyaXRlLiAgKi8KLSAgaW5mby0+aWRfbGlzdCA9IE5VTEw7Ci0KLSAgZm9yICh1ID0gaW5mby0+dW5pdHM7IHUgIT0gTlVMTDsgdSA9IHUtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2ZpbGUgKmY7Ci0gICAgICBib29sZWFuIGZpcnN0X2ZpbGU7Ci0KLSAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vID0gdS0+bGluZW5vczsKLSAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4ID0gMDsKLQotICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X2NvbXBpbGF0aW9uX3VuaXQpIChmaGFuZGxlLCB1LT5maWxlcy0+ZmlsZW5hbWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZmlyc3RfZmlsZSA9IHRydWU7Ci0gICAgICBmb3IgKGYgPSB1LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotCSAgaWYgKGZpcnN0X2ZpbGUpCi0JICAgIGZpcnN0X2ZpbGUgPSBmYWxzZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgqZm5zLT5zdGFydF9zb3VyY2UpIChmaGFuZGxlLCBmLT5maWxlbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoZi0+Z2xvYmFscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChuID0gZi0+Z2xvYmFscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJewotCQkgIGlmICghIGRlYnVnX3dyaXRlX25hbWUgKGluZm8sIGZucywgZmhhbmRsZSwgbikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogT3V0cHV0IGFueSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aGljaCBoYXNuJ3QgYWxyZWFkeSBiZWVuCi0gICAgICAgICBoYW5kbGVkLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgKGJmZF92bWEpIC0xKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gZWxlbWVudCBpbiBhIG5hbWVzcGFjZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9uYW1lIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4pCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotewotICBzd2l0Y2ggKG4tPmtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RZUEU6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudHlwZSwgbikKLQkgIHx8ICEgKCpmbnMtPnR5cGRlZikgKGZoYW5kbGUsIG4tPm5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RBRzoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS50YWcsIG4pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+dGFnKSAoZmhhbmRsZSwgbi0+bmFtZSk7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVkFSSUFCTEU6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudmFyaWFibGUtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT52YXJpYWJsZSkgKGZoYW5kbGUsIG4tPm5hbWUsIG4tPnUudmFyaWFibGUtPmtpbmQsCi0JCQkgICAgICAgbi0+dS52YXJpYWJsZS0+dmFsKTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9GVU5DVElPTjoKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV9mdW5jdGlvbiAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT5uYW1lLAotCQkJCSAgIG4tPmxpbmthZ2UsIG4tPnUuZnVuY3Rpb24pOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVDoKLSAgICAgIHJldHVybiAoKmZucy0+aW50X2NvbnN0YW50KSAoZmhhbmRsZSwgbi0+bmFtZSwgbi0+dS5pbnRfY29uc3RhbnQpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX0ZMT0FUX0NPTlNUQU5UOgotICAgICAgcmV0dXJuICgqZm5zLT5mbG9hdF9jb25zdGFudCkgKGZoYW5kbGUsIG4tPm5hbWUsIG4tPnUuZmxvYXRfY29uc3RhbnQpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5UOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnR5cGVkX2NvbnN0YW50LT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+dHlwZWRfY29uc3RhbnQpIChmaGFuZGxlLCBuLT5uYW1lLAotCQkJCSAgICAgbi0+dS50eXBlZF9jb25zdGFudC0+dmFsKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBXcml0ZSBvdXQgYSB0eXBlLiAgSWYgdGhlIHR5cGUgaXMgREVCVUdfS0lORF9OQU1FRCBvcgotICAgREVCVUdfS0lORF9UQUdHRUQsIHRoZW4gdGhlIG5hbWUgYXJndW1lbnQgaXMgdGhlIG5hbWUgZm9yIHdoaWNoIHdlCi0gICBhcmUgYWJvdXQgdG8gY2FsbCB0eXBlZGVmIG9yIHRhZy4gIElmIHRoZSB0eXBlIGlzIGFueXRoaW5nIGVsc2UsCi0gICB0aGVuIHRoZSBuYW1lIGFyZ3VtZW50IGlzIGEgdGFnIGZyb20gYSBERUJVR19LSU5EX1RBR0dFRCB0eXBlIHdoaWNoCi0gICBwb2ludHMgdG8gdGhpcyBvbmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLCBuYW1lKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgICAgc3RydWN0IGRlYnVnX25hbWUgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgaXM7Ci0gIGNvbnN0IGNoYXIgKnRhZzsKLQotICAvKiBJZiB3ZSBoYXZlIGEgbmFtZSBmb3IgdGhpcyB0eXBlLCBqdXN0IG91dHB1dCBpdC4gIFdlIG9ubHkgb3V0cHV0Ci0gICAgIHR5cGVkZWYgbmFtZXMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZGVmaW5lZC4gIFdlIG91dHB1dCB0eXBlIHRhZ3MKLSAgICAgd2hlbmV2ZXIgd2UgYXJlIG5vdCBhY3R1YWxseSBkZWZpbmluZyB0aGVtLiAgKi8KLSAgaWYgKCh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgICAgJiYgKHR5cGUtPnUua25hbWVkLT5uYW1lLT5tYXJrID09IGluZm8tPm1hcmsKLQkgIHx8ICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VECi0JICAgICAgJiYgdHlwZS0+dS5rbmFtZWQtPm5hbWUgIT0gbmFtZSkpKQotICAgIHsKLSAgICAgIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQpCi0JcmV0dXJuICgqZm5zLT50eXBlZGVmX3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGRlYnVnX3R5cGUgKnJlYWw7Ci0JICB1bnNpZ25lZCBpbnQgaWQ7Ci0KLQkgIHJlYWwgPSBkZWJ1Z19nZXRfcmVhbF90eXBlICgoUFRSKSBpbmZvLCB0eXBlLCBOVUxMKTsKLQkgIGlmIChyZWFsID09IE5VTEwpCi0JICAgIHJldHVybiAoKmZucy0+ZW1wdHlfdHlwZSkgKGZoYW5kbGUpOwotCSAgaWQgPSAwOwotCSAgaWYgKChyZWFsLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNUCi0JICAgICAgIHx8IHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTgotCSAgICAgICB8fCByZWFsLT5raW5kID09IERFQlVHX0tJTkRfQ0xBU1MKLQkgICAgICAgfHwgcmVhbC0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OX0NMQVNTKQotCSAgICAgICYmIHJlYWwtPnUua2NsYXNzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAocmVhbC0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JCXsKLQkJICBpZiAoISBkZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sCi0JCQkJCSAgICB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwKLQkJCQkJICAgIHJlYWwpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaWQgPSByZWFsLT51LmtjbGFzcy0+aWQ7Ci0JICAgIH0KLQotCSAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lLCBpZCwKLQkJCQkgICByZWFsLT5raW5kKTsKLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgdGhlIG5hbWUgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IGxvb2tlZCBmb3IgYSBrbm93biBuYW1lLCBzbwotICAgICB0aGF0IHdlIGRvbid0IGp1c3QgZGVmaW5lIGEgdHlwZSBpbiB0ZXJtcyBvZiBpdHNlbGYuICBXZSBuZWVkIHRvCi0gICAgIG1hcmsgdGhlIG5hbWUgaGVyZSBzbyB0aGF0IGEgc3RydWN0IGNvbnRhaW5pbmcgYSBwb2ludGVyIHRvCi0gICAgIGl0c2VsZiB3aWxsIHdvcmsuICAqLwotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIG5hbWUtPm1hcmsgPSBpbmZvLT5tYXJrOwotCi0gIHRhZyA9IE5VTEw7Ci0gIGlmIChuYW1lICE9IE5VTEwKLSAgICAgICYmIHR5cGUtPmtpbmQgIT0gREVCVUdfS0lORF9OQU1FRAotICAgICAgJiYgdHlwZS0+a2luZCAhPSBERUJVR19LSU5EX1RBR0dFRCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKG5hbWUtPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RBRyk7Ci0gICAgICB0YWcgPSBuYW1lLT5uYW1lOwotICAgIH0KLQotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfS0lORF9JTExFR0FMOgotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3dyaXRlX3R5cGU6IGlsbGVnYWwgdHlwZSBlbmNvdW50ZXJlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6Ci0gICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gKCpmbnMtPmVtcHR5X3R5cGUpIChmaGFuZGxlKTsKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCwKLQkJCSAgICAgICBuYW1lKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfVk9JRDoKLSAgICAgIHJldHVybiAoKmZucy0+dm9pZF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lOVDoKLSAgICAgIHJldHVybiAoKmZucy0+aW50X3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplLCB0eXBlLT51LmtpbnQpOwotICAgIGNhc2UgREVCVUdfS0lORF9GTE9BVDoKLSAgICAgIHJldHVybiAoKmZucy0+ZmxvYXRfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUpOwotICAgIGNhc2UgREVCVUdfS0lORF9DT01QTEVYOgotICAgICAgcmV0dXJuICgqZm5zLT5jb21wbGV4X3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQk9PTDoKLSAgICAgIHJldHVybiAoKmZucy0+Ym9vbF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTCkKLQl7Ci0JICBpZiAodHlwZS0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sIHRhZywgdHlwZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoaW5mby0+bWFyayA9PSB0eXBlLT51LmtjbGFzcy0+bWFyaykKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBjdXJyZW50bHkgb3V0cHV0dGluZyB0aGlzIHN0cnVjdCwgb3Igd2UgaGF2ZQotCQkgYWxyZWFkeSBvdXRwdXQgaXQuICBJIGRvbid0IGtub3cgaWYgdGhpcyBjYW4gaGFwcGVuLAotCQkgYnV0IGl0IGNhbiBoYXBwZW4gZm9yIGEgY2xhc3MuICAqLwotCSAgICAgIGFzc2VydCAodHlwZS0+dS5rY2xhc3MtPmlkID4gaW5mby0+YmFzZV9pZCk7Ci0JICAgICAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rY2xhc3MtPmlkLAotCQkJCSAgICAgICB0eXBlLT5raW5kKTsKLQkgICAgfQotCSAgdHlwZS0+dS5rY2xhc3MtPm1hcmsgPSBpbmZvLT5tYXJrOwotCX0KLQotICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X3N0cnVjdF90eXBlKSAoZmhhbmRsZSwgdGFnLAotCQkJCSAgICAgICAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTAotCQkJCQk/IHR5cGUtPnUua2NsYXNzLT5pZAotCQkJCQk6IDApLAotCQkJCSAgICAgICB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNULAotCQkJCSAgICAgICB0eXBlLT5zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTAotCSAgJiYgdHlwZS0+dS5rY2xhc3MtPmZpZWxkcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV0gIT0gTlVMTDsgaSsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0JICAgICAgZiA9IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV07Ci0JICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBmLT50eXBlLAotCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCQkgIHx8ICEgKCpmbnMtPnN0cnVjdF9maWVsZCkgKGZoYW5kbGUsIGYtPm5hbWUsIGYtPnUuZi5iaXRwb3MsCi0JCQkJCSAgICAgZi0+dS5mLmJpdHNpemUsIGYtPnZpc2liaWxpdHkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gKCpmbnMtPmVuZF9zdHJ1Y3RfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfY2xhc3NfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLCB0YWcpOwotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgaWYgKHR5cGUtPnUua2VudW0gPT0gTlVMTCkKLQlyZXR1cm4gKCpmbnMtPmVudW1fdHlwZSkgKGZoYW5kbGUsIHRhZywgKGNvbnN0IGNoYXIgKiopIE5VTEwsCi0JCQkJICAoYmZkX3NpZ25lZF92bWEgKikgTlVMTCk7Ci0gICAgICByZXR1cm4gKCpmbnMtPmVudW1fdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rZW51bS0+bmFtZXMsCi0JCQkJdHlwZS0+dS5rZW51bS0+dmFsdWVzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfUE9JTlRFUjoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rcG9pbnRlciwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnBvaW50ZXJfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCSAgICAgIHR5cGUtPnUua2Z1bmN0aW9uLT5yZXR1cm5fdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCWlzID0gLTE7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpcyA9IDA7IHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXNbaXNdICE9IE5VTEw7IGlzKyspCi0JICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgICAgdHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlc1tpc10sCi0JCQkJICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcmV0dXJuICgqZm5zLT5mdW5jdGlvbl90eXBlKSAoZmhhbmRsZSwgaXMsCi0JCQkJICAgIHR5cGUtPnUua2Z1bmN0aW9uLT52YXJhcmdzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtyZWZlcmVuY2UsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5yZWZlcmVuY2VfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9SQU5HRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rcmFuZ2UtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5yYW5nZV90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rcmFuZ2UtPmxvd2VyLAotCQkJCSB0eXBlLT51LmtyYW5nZS0+dXBwZXIpOwotICAgIGNhc2UgREVCVUdfS0lORF9BUlJBWToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rYXJyYXktPmVsZW1lbnRfdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCSAgfHwgISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJIHR5cGUtPnUua2FycmF5LT5yYW5nZV90eXBlLAotCQkJCSAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5hcnJheV90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rYXJyYXktPmxvd2VyLAotCQkJCSB0eXBlLT51LmthcnJheS0+dXBwZXIsCi0JCQkJIHR5cGUtPnUua2FycmF5LT5zdHJpbmdwKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfU0VUOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtzZXQtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5zZXRfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua3NldC0+Yml0c3RyaW5ncCk7Ci0gICAgY2FzZSBERUJVR19LSU5EX09GRlNFVDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rb2Zmc2V0LT5iYXNlX3R5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKLQkgIHx8ICEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSB0eXBlLT51LmtvZmZzZXQtPnRhcmdldF90eXBlLAotCQkJCSAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5vZmZzZXRfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9NRVRIT0Q6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkgICAgICB0eXBlLT51LmttZXRob2QtPnJldHVybl90eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICh0eXBlLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKQotCWlzID0gLTE7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpcyA9IDA7IHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzW2lzXSAhPSBOVUxMOyBpcysrKQotCSAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJICAgIHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzW2lzXSwKLQkJCQkgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAodHlwZS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSAhPSBOVUxMKQotCXsKLQkgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgIHR5cGUtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUsCi0JCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gKCpmbnMtPm1ldGhvZF90eXBlKSAoZmhhbmRsZSwKLQkJCQkgIHR5cGUtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUgIT0gTlVMTCwKLQkJCQkgIGlzLAotCQkJCSAgdHlwZS0+dS5rbWV0aG9kLT52YXJhcmdzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua2NvbnN0LAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+Y29uc3RfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9WT0xBVElMRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rdm9sYXRpbGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT52b2xhdGlsZV90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUsCi0JCQkgICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpOwotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+dHlwZSwKLQkJCSAgICAgICB0eXBlLT51LmtuYW1lZC0+bmFtZSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IGEgY2xhc3MgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9jbGFzc190eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUsIHRhZykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBpZDsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnZwdHJiYXNlOwotCi0gIGlmICh0eXBlLT51LmtjbGFzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlkID0gMDsKLSAgICAgIHZwdHJiYXNlID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JewotCSAgaWYgKCEgZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLCB0YWcsIHR5cGUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+bWFyayA9PSB0eXBlLT51LmtjbGFzcy0+bWFyaykKLQl7Ci0JICAvKiBXZSBhcmUgY3VycmVudGx5IG91dHB1dHRpbmcgdGhpcyBjbGFzcywgb3Igd2UgaGF2ZQotCSAgICAgYWxyZWFkeSBvdXRwdXQgaXQuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGVyZSBhcmUKLQkgICAgIG1ldGhvZHMgZm9yIGFuIGFub255bW91cyBjbGFzcy4gICovCi0JICBhc3NlcnQgKHR5cGUtPnUua2NsYXNzLT5pZCA+IGluZm8tPmJhc2VfaWQpOwotCSAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rY2xhc3MtPmlkLAotCQkJCSAgIHR5cGUtPmtpbmQpOwotCX0KLSAgICAgIHR5cGUtPnUua2NsYXNzLT5tYXJrID0gaW5mby0+bWFyazsKLSAgICAgIGlkID0gdHlwZS0+dS5rY2xhc3MtPmlkOwotCi0gICAgICB2cHRyYmFzZSA9IHR5cGUtPnUua2NsYXNzLT52cHRyYmFzZTsKLSAgICAgIGlmICh2cHRyYmFzZSAhPSBOVUxMICYmIHZwdHJiYXNlICE9IHR5cGUpCi0JewotCSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB2cHRyYmFzZSwKLQkJCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgKCpmbnMtPnN0YXJ0X2NsYXNzX3R5cGUpIChmaGFuZGxlLCB0YWcsIGlkLAotCQkJCSAgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX0NMQVNTLAotCQkJCSAgdHlwZS0+c2l6ZSwKLQkJCQkgIHZwdHJiYXNlICE9IE5VTEwsCi0JCQkJICB2cHRyYmFzZSA9PSB0eXBlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5maWVsZHMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotCSAgICAgIGYgPSB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldOwotCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgZi0+dHlwZSwKLQkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoZi0+c3RhdGljX21lbWJlcikKLQkJewotCQkgIGlmICghICgqZm5zLT5jbGFzc19zdGF0aWNfbWVtYmVyKSAoZmhhbmRsZSwgZi0+bmFtZSwKLQkJCQkJCSAgICAgZi0+dS5zLnBoeXNuYW1lLAotCQkJCQkJICAgICBmLT52aXNpYmlsaXR5KSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgqZm5zLT5zdHJ1Y3RfZmllbGQpIChmaGFuZGxlLCBmLT5uYW1lLCBmLT51LmYuYml0cG9zLAotCQkJCQkgICAgICBmLT51LmYuYml0c2l6ZSwgZi0+dmlzaWJpbGl0eSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3Nlc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICpiOwotCi0JICAgICAgYiA9IHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3Nlc1tpXTsKLQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGItPnR5cGUsCi0JCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX2Jhc2VjbGFzcykgKGZoYW5kbGUsIGItPmJpdHBvcywgYi0+dmlydHVhbCwKLQkJCQkJICAgICBiLT52aXNpYmlsaXR5KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPm1ldGhvZHMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+bWV0aG9kc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kICptOwotCSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0JICAgICAgbSA9IHR5cGUtPnUua2NsYXNzLT5tZXRob2RzW2ldOwotCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19zdGFydF9tZXRob2QpIChmaGFuZGxlLCBtLT5uYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGZvciAoaiA9IDA7IG0tPnZhcmlhbnRzW2pdICE9IE5VTEw7IGorKykKLQkJewotCQkgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdjsKLQotCQkgIHYgPSBtLT52YXJpYW50c1tqXTsKLQkJICBpZiAodi0+Y29udGV4dCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHYtPmNvbnRleHQsCi0JCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHYtPnR5cGUsCi0JCQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGlmICh2LT52b2Zmc2V0ICE9IFZPRkZTRVRfU1RBVElDX01FVEhPRCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX21ldGhvZF92YXJpYW50KSAoZmhhbmRsZSwgdi0+cGh5c25hbWUsCi0JCQkJCQkJICB2LT52aXNpYmlsaXR5LAotCQkJCQkJCSAgdi0+Y29uc3RwLAotCQkJCQkJCSAgdi0+dm9sYXRpbGVwLAotCQkJCQkJCSAgdi0+dm9mZnNldCwKLQkJCQkJCQkgIHYtPmNvbnRleHQgIT0gTlVMTCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KSAoZmhhbmRsZSwKLQkJCQkJCQkJIHYtPnBoeXNuYW1lLAotCQkJCQkJCQkgdi0+dmlzaWJpbGl0eSwKLQkJCQkJCQkJIHYtPmNvbnN0cCwKLQkJCQkJCQkJIHYtPnZvbGF0aWxlcCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3NfZW5kX21ldGhvZCkgKGZoYW5kbGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAoKmZucy0+ZW5kX2NsYXNzX3R5cGUpIChmaGFuZGxlKTsKLX0KLQotLyogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZvciBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2Z1bmN0aW9uIChpbmZvLCBmbnMsIGZoYW5kbGUsIG5hbWUsIGxpbmthZ2UsIGZ1bmN0aW9uKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gICAgIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqZnVuY3Rpb247Ci17Ci0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKnA7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLQotICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGZ1bmN0aW9uLT5ibG9ja3MtPnN0YXJ0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBmdW5jdGlvbi0+cmV0dXJuX3R5cGUsCi0JCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgKCpmbnMtPnN0YXJ0X2Z1bmN0aW9uKSAoZmhhbmRsZSwgbmFtZSwKLQkJCQlsaW5rYWdlID09IERFQlVHX0xJTktBR0VfR0xPQkFMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChwID0gZnVuY3Rpb24tPnBhcmFtZXRlcnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBwLT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCi0JICB8fCAhICgqZm5zLT5mdW5jdGlvbl9wYXJhbWV0ZXIpIChmaGFuZGxlLCBwLT5uYW1lLCBwLT5raW5kLCBwLT52YWwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChiID0gZnVuY3Rpb24tPmJsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV9ibG9jayAoaW5mbywgZm5zLCBmaGFuZGxlLCBiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiAoKmZucy0+ZW5kX2Z1bmN0aW9uKSAoZmhhbmRsZSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9ibG9jayAoaW5mbywgZm5zLCBmaGFuZGxlLCBibG9jaykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX2Jsb2NrICpibG9jazsKLXsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLQotICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGJsb2NrLT5zdGFydCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEkgY2FuJ3Qgc2VlIGFueSBwb2ludCB0byB3cml0aW5nIG91dCBhIGJsb2NrIHdpdGggbm8gbG9jYWwKLSAgICAgdmFyaWFibGVzLCBzbyB3ZSBkb24ndCBib3RoZXIsIGV4Y2VwdCBmb3IgdGhlIHRvcCBsZXZlbCBibG9jay4gICovCi0gIGlmIChibG9jay0+bG9jYWxzICE9IE5VTEwgfHwgYmxvY2stPnBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgqZm5zLT5zdGFydF9ibG9jaykgKGZoYW5kbGUsIGJsb2NrLT5zdGFydCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmxvY2stPmxvY2FscyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAobiA9IGJsb2NrLT5sb2NhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JewotCSAgaWYgKCEgZGVidWdfd3JpdGVfbmFtZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZm9yIChiID0gYmxvY2stPmNoaWxkcmVuOyBiICE9IE5VTEw7IGIgPSBiLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX2Jsb2NrIChpbmZvLCBmbnMsIGZoYW5kbGUsIGIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBibG9jay0+ZW5kKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJsb2NrLT5sb2NhbHMgIT0gTlVMTCB8fCBibG9jay0+cGFyZW50ID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCpmbnMtPmVuZF9ibG9jaykgKGZoYW5kbGUsIGJsb2NrLT5lbmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB1cCB0byBBRERSRVNTLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgYWRkcmVzcykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICB3aGlsZSAoaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfbGluZW5vICpsOwotCi0gICAgICBsID0gaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm87Ci0KLSAgICAgIHdoaWxlIChpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCA8IERFQlVHX0xJTkVOT19DT1VOVCkKLQl7Ci0JICBpZiAobC0+bGluZW5vc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0KLQkgICAgICA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JICAgIGJyZWFrOwotCi0JICBpZiAobC0+YWRkcnNbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdID49IGFkZHJlc3MpCi0JICAgIHJldHVybiB0cnVlOwotCi0JICBpZiAoISAoKmZucy0+bGluZW5vKSAoZmhhbmRsZSwgbC0+ZmlsZS0+ZmlsZW5hbWUsCi0JCQkJbC0+bGluZW5vc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0sCi0JCQkJbC0+YWRkcnNbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICArK2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4OwotCX0KLQotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm8gPSBsLT5uZXh0OwotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXggPSAwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBJRCBudW1iZXIgZm9yIGEgY2xhc3MuICBJZiBkdXJpbmcgdGhlIHNhbWUgY2FsbCB0bwotICAgZGVidWdfd3JpdGUgd2UgZmluZCBhIHN0cnVjdCB3aXRoIHRoZSBzYW1lIGRlZmluaXRpb24gd2l0aCB0aGUgc2FtZQotICAgbmFtZSwgd2UgdXNlIHRoZSBzYW1lIElELiAgVGhpcyB0eXBlIG9mIHRoaW5ncyBoYXBwZW5zIGJlY2F1c2UgdGhlCi0gICBzYW1lIHN0cnVjdCB3aWxsIGJlIGRlZmluZWQgYnkgbXVsdGlwbGUgY29tcGlsYXRpb24gdW5pdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLCB0YWcsIHR5cGUpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjOwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKmw7Ci0KLSAgYXNzZXJ0ICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNUCi0JICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVU5JT04KLQkgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9DTEFTUwotCSAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OX0NMQVNTKTsKLQotICBjID0gdHlwZS0+dS5rY2xhc3M7Ci0KLSAgaWYgKGMtPmlkID4gaW5mby0+YmFzZV9pZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKGwgPSBpbmZvLT5pZF9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlLT5raW5kICE9IHR5cGUtPmtpbmQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICh0YWcgPT0gTlVMTCkKLQl7Ci0JICBpZiAobC0+dGFnICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobC0+dGFnID09IE5VTEwKLQkgICAgICB8fCBsLT50YWdbMF0gIT0gdGFnWzBdCi0JICAgICAgfHwgc3RyY21wIChsLT50YWcsIHRhZykgIT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgbC0+dHlwZSwgdHlwZSkpCi0JewotCSAgYy0+aWQgPSBsLT50eXBlLT51LmtjbGFzcy0+aWQ7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZXJlIGFyZSBubyBpZGVudGljYWwgdHlwZXMuICBVc2UgYSBuZXcgSUQsIGFuZCBhZGQgaXQgdG8gdGhlCi0gICAgIGxpc3QuICAqLwotICArK2luZm8tPmNsYXNzX2lkOwotICBjLT5pZCA9IGluZm8tPmNsYXNzX2lkOwotCi0gIGwgPSAoc3RydWN0IGRlYnVnX2NsYXNzX2lkICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIG1lbXNldCAobCwgMCwgc2l6ZW9mICpsKTsKLQotICBsLT50eXBlID0gdHlwZTsKLSAgbC0+dGFnID0gdGFnOwotCi0gIGwtPm5leHQgPSBpbmZvLT5pZF9saXN0OwotICBpbmZvLT5pZF9saXN0ID0gbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIHR3byB0eXBlcyBhcmUgdGhlIHNhbWUuICBBdCB0aGlzIHBvaW50LCB3ZSBkb24ndCBjYXJlIGFib3V0Ci0gICB0YWdzIGFuZCB0aGUgbGlrZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDIpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQyOwotewotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKmw7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCB0b3A7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmICh0MSA9PSBOVUxMKQotICAgIHJldHVybiB0MiA9PSBOVUxMOwotICBpZiAodDIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hpbGUgKHQxLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgdDEgPSAqdDEtPnUua2luZGlyZWN0LT5zbG90OwotICAgICAgaWYgKHQxID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgd2hpbGUgKHQyLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgdDIgPSAqdDItPnUua2luZGlyZWN0LT5zbG90OwotICAgICAgaWYgKHQyID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodDEgPT0gdDIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQXMgYSBzcGVjaWFsIGNhc2UsIHBlcm1pdCBhIHR5cGVkZWYgdG8gbWF0Y2ggYSB0YWcsIHNpbmNlIEMrKwotICAgICBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgc29tZXRpbWVzIGFkZCBhIHR5cGVkZWYgd2hlcmUgQyBkZWJ1Z2dpbmcKLSAgICAgb3V0cHV0IHdpbGwgbm90LiAgKi8KLSAgaWYgKHQxLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgICYmIHQyLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgIHJldHVybiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbmFtZWQtPnR5cGUsIHQyKTsKLSAgZWxzZSBpZiAodDEtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQKLQkgICAmJiB0Mi0+a2luZCA9PSBERUJVR19LSU5EX05BTUVEKQotICAgIHJldHVybiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDItPnUua25hbWVkLT50eXBlKTsKLQotICBpZiAodDEtPmtpbmQgIT0gdDItPmtpbmQKLSAgICAgIHx8IHQxLT5zaXplICE9IHQyLT5zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgcmlkIG9mIHRoZSB0cml2aWFsIGNhc2VzIGZpcnN0LiAgKi8KLSAgc3dpdGNoICh0MS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9WT0lEOgotICAgIGNhc2UgREVCVUdfS0lORF9GTE9BVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09NUExFWDoKLSAgICBjYXNlIERFQlVHX0tJTkRfQk9PTDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgREVCVUdfS0lORF9JTlQ6Ci0gICAgICByZXR1cm4gdDEtPnUua2ludCA9PSB0Mi0+dS5raW50OwotICAgIH0KLQotICAvKiBXZSBoYXZlIHRvIGF2b2lkIGFuIGluZmluaXRlIHJlY3Vyc2lvbi4gIFdlIGRvIHRoaXMgYnkga2VlcGluZyBhCi0gICAgIGxpc3Qgb2YgdHlwZXMgd2hpY2ggd2UgYXJlIGNvbXBhcmluZy4gIFdlIGp1c3Qga2VlcCB0aGUgbGlzdCBvbgotICAgICB0aGUgc3RhY2suICBJZiB3ZSBlbmNvdW50ZXIgYSBwYWlyIG9mIHR5cGVzIHdlIGFyZSBjdXJyZW50bHkKLSAgICAgY29tcGFyaW5nLCB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZXkgYXJlIGVxdWFsLiAgKi8KLSAgZm9yIChsID0gaW5mby0+Y29tcGFyZV9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50MSA9PSB0MSAmJiBsLT50MiA9PSB0MikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgdG9wLnQxID0gdDE7Ci0gIHRvcC50MiA9IHQyOwotICB0b3AubmV4dCA9IGluZm8tPmNvbXBhcmVfbGlzdDsKLSAgaW5mby0+Y29tcGFyZV9saXN0ID0gJnRvcDsKLQotICBzd2l0Y2ggKHQxLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXQgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIGlmICh0MS0+dS5rY2xhc3MgPT0gTlVMTCkKLQlyZXQgPSB0Mi0+dS5rY2xhc3MgPT0gTlVMTDsKLSAgICAgIGVsc2UgaWYgKHQyLT51LmtjbGFzcyA9PSBOVUxMKQotCXJldCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAodDEtPnUua2NsYXNzLT5pZCA+IGluZm8tPmJhc2VfaWQKLQkgICAgICAgJiYgdDEtPnUua2NsYXNzLT5pZCA9PSB0Mi0+dS5rY2xhc3MtPmlkKQotCXJldCA9IHRydWU7Ci0gICAgICBlbHNlCi0JcmV0ID0gZGVidWdfY2xhc3NfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICBpZiAodDEtPnUua2VudW0gPT0gTlVMTCkKLQlyZXQgPSB0Mi0+dS5rZW51bSA9PSBOVUxMOwotICAgICAgZWxzZSBpZiAodDItPnUua2VudW0gPT0gTlVMTCkKLQlyZXQgPSBmYWxzZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICoqcG4xLCAqKnBuMjsKLQkgIGJmZF9zaWduZWRfdm1hICpwdjEsICpwdjI7Ci0KLQkgIHBuMSA9IHQxLT51LmtlbnVtLT5uYW1lczsKLQkgIHBuMiA9IHQyLT51LmtlbnVtLT5uYW1lczsKLQkgIHB2MSA9IHQxLT51LmtlbnVtLT52YWx1ZXM7Ci0JICBwdjIgPSB0Mi0+dS5rZW51bS0+dmFsdWVzOwotCSAgd2hpbGUgKCpwbjEgIT0gTlVMTCAmJiAqcG4yICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKipwbjEgIT0gKipwbjIKLQkJICB8fCAqcHYxICE9ICpwdjIKLQkJICB8fCBzdHJjbXAgKCpwbjEsICpwbjIpICE9IDApCi0JCWJyZWFrOwotCSAgICAgICsrcG4xOwotCSAgICAgICsrcG4yOwotCSAgICAgICsrcHYxOwotCSAgICAgICsrcHYyOwotCSAgICB9Ci0JICByZXQgPSAqcG4xID09IE5VTEwgJiYgKnBuMiA9PSBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1BPSU5URVI6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rcG9pbnRlciwgdDItPnUua3BvaW50ZXIpOwotICAgICAgYnJlYWs7Ci0JICAgICAKLSAgICBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT046Ci0gICAgICBpZiAodDEtPnUua2Z1bmN0aW9uLT52YXJhcmdzICE9IHQyLT51LmtmdW5jdGlvbi0+dmFyYXJncwotCSAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlLAotCQkJCSB0Mi0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlKQotCSAgfHwgKCh0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCSAgICAgICE9ICh0Mi0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKSkpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICh0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCXJldCA9IHRydWU7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGRlYnVnX3R5cGUgKiphMSwgKiphMjsKLQotCSAgYTEgPSB0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlczsKLQkgIGEyID0gdDItPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXM7Ci0JICB3aGlsZSAoKmExICE9IE5VTEwgJiYgKmEyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCAqYTEsICphMikpCi0JCWJyZWFrOwotCSAgICAgICsrYTE7Ci0JICAgICAgKythMjsKLQkgICAgfQotCSAgcmV0ID0gKmExID09IE5VTEwgJiYgKmEyID09IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3JlZmVyZW5jZSwgdDItPnUua3JlZmVyZW5jZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9SQU5HRToKLSAgICAgIHJldCA9ICh0MS0+dS5rcmFuZ2UtPmxvd2VyID09IHQyLT51LmtyYW5nZS0+bG93ZXIKLQkgICAgICYmIHQxLT51LmtyYW5nZS0+dXBwZXIgPT0gdDItPnUua3JhbmdlLT51cHBlcgotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3JhbmdlLT50eXBlLAotCQkJCSAgdDItPnUua3JhbmdlLT50eXBlKSk7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfQVJSQVk6Ci0gICAgICByZXQgPSAodDEtPnUua2FycmF5LT5sb3dlciA9PSB0Mi0+dS5rYXJyYXktPmxvd2VyCi0JICAgICAmJiB0MS0+dS5rYXJyYXktPnVwcGVyID09IHQyLT51LmthcnJheS0+dXBwZXIKLQkgICAgICYmIHQxLT51LmthcnJheS0+c3RyaW5ncCA9PSB0Mi0+dS5rYXJyYXktPnN0cmluZ3AKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmthcnJheS0+ZWxlbWVudF90eXBlLAotCQkJCSAgdDItPnUua2FycmF5LT5lbGVtZW50X3R5cGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1NFVDoKLSAgICAgIHJldCA9ICh0MS0+dS5rc2V0LT5iaXRzdHJpbmdwID09IHQyLT51LmtzZXQtPmJpdHN0cmluZ3AKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtzZXQtPnR5cGUsIHQyLT51LmtzZXQtPnR5cGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX09GRlNFVDoKLSAgICAgIHJldCA9IChkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rb2Zmc2V0LT5iYXNlX3R5cGUsCi0JCQkgICAgICAgdDItPnUua29mZnNldC0+YmFzZV90eXBlKQotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua29mZnNldC0+dGFyZ2V0X3R5cGUsCi0JCQkJICB0Mi0+dS5rb2Zmc2V0LT50YXJnZXRfdHlwZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgotICAgICAgaWYgKHQxLT51LmttZXRob2QtPnZhcmFyZ3MgIT0gdDItPnUua21ldGhvZC0+dmFyYXJncwotCSAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZSwKLQkJCQkgdDItPnUua21ldGhvZC0+cmV0dXJuX3R5cGUpCi0JICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmttZXRob2QtPmRvbWFpbl90eXBlLAotCQkJCSB0Mi0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSkKLQkgIHx8ICgodDEtPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpCi0JICAgICAgIT0gKHQyLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKSkpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICh0MS0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQlyZXQgPSB0cnVlOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBkZWJ1Z190eXBlICoqYTEsICoqYTI7Ci0KLQkgIGExID0gdDEtPnUua21ldGhvZC0+YXJnX3R5cGVzOwotCSAgYTIgPSB0Mi0+dS5rbWV0aG9kLT5hcmdfdHlwZXM7Ci0JICB3aGlsZSAoKmExICE9IE5VTEwgJiYgKmEyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCAqYTEsICphMikpCi0JCWJyZWFrOwotCSAgICAgICsrYTE7Ci0JICAgICAgKythMjsKLQkgICAgfQotCSAgcmV0ID0gKmExID09IE5VTEwgJiYgKmEyID09IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rY29uc3QsIHQyLT51Lmtjb25zdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9WT0xBVElMRToKLSAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51Lmt2b2xhdGlsZSwgdDItPnUua3ZvbGF0aWxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICByZXQgPSAoc3RyY21wICh0MS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsIHQyLT51LmtuYW1lZC0+bmFtZS0+bmFtZSkgPT0gMAotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua25hbWVkLT50eXBlLAotCQkJCSAgdDItPnUua25hbWVkLT50eXBlKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaW5mby0+Y29tcGFyZV9saXN0ID0gdG9wLm5leHQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU2VlIGlmIHR3byBjbGFzc2VzIGFyZSB0aGUgc2FtZS4gIFRoaXMgaXMgYSBzdWJyb3V0aW5lIG9mCi0gICBkZWJ1Z190eXBlX3NhbWVwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX2NsYXNzX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0MikKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQxOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjMSwgKmMyOwotCi0gIGMxID0gdDEtPnUua2NsYXNzOwotICBjMiA9IHQyLT51LmtjbGFzczsKLQotICBpZiAoKGMxLT5maWVsZHMgPT0gTlVMTCkgIT0gKGMyLT5maWVsZHMgPT0gTlVMTCkKLSAgICAgIHx8IChjMS0+YmFzZWNsYXNzZXMgPT0gTlVMTCkgIT0gKGMyLT5iYXNlY2xhc3NlcyA9PSBOVUxMKQotICAgICAgfHwgKGMxLT5tZXRob2RzID09IE5VTEwpICE9IChjMi0+bWV0aG9kcyA9PSBOVUxMKQotICAgICAgfHwgKGMxLT52cHRyYmFzZSA9PSBOVUxMKSAhPSAoYzItPnZwdHJiYXNlID09IE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYzEtPmZpZWxkcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19maWVsZCAqKnBmMSwgKipwZjI7Ci0KLSAgICAgIGZvciAocGYxID0gYzEtPmZpZWxkcywgcGYyID0gYzItPmZpZWxkczsKLQkgICAqcGYxICE9IE5VTEwgJiYgKnBmMiAhPSBOVUxMOwotCSAgIHBmMSsrLCBwZjIrKykKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfZmllbGQgKmYxLCAqZjI7Ci0KLQkgIGYxID0gKnBmMTsKLQkgIGYyID0gKnBmMjsKLQkgIGlmIChmMS0+bmFtZVswXSAhPSBmMi0+bmFtZVswXQotCSAgICAgIHx8IGYxLT52aXNpYmlsaXR5ICE9IGYyLT52aXNpYmlsaXR5Ci0JICAgICAgfHwgZjEtPnN0YXRpY19tZW1iZXIgIT0gZjItPnN0YXRpY19tZW1iZXIpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChmMS0+c3RhdGljX21lbWJlcikKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKGYxLT51LnMucGh5c25hbWUsIGYyLT51LnMucGh5c25hbWUpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGYxLT51LmYuYml0cG9zICE9IGYyLT51LmYuYml0cG9zCi0JCSAgfHwgZjEtPnUuZi5iaXRzaXplICE9IGYyLT51LmYuYml0c2l6ZSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAvKiBXZSBkbyB0aGUgY2hlY2tzIHdoaWNoIHJlcXVpcmUgZnVuY3Rpb24gY2FsbHMgbGFzdC4gIFdlCi0gICAgICAgICAgICAgZG9uJ3QgcmVxdWlyZSB0aGF0IHRoZSB0eXBlcyBvZiBmaWVsZHMgaGF2ZSB0aGUgc2FtZQotICAgICAgICAgICAgIG5hbWVzLCBzaW5jZSB0aGF0IHNvbWV0aW1lcyBmYWlscyBpbiB0aGUgcHJlc2VuY2Ugb2YKLSAgICAgICAgICAgICB0eXBlZGVmcyBhbmQgd2UgcmVhbGx5IGRvbid0IGNhcmUuICAqLwotCSAgaWYgKHN0cmNtcCAoZjEtPm5hbWUsIGYyLT5uYW1lKSAhPSAwCi0JICAgICAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLAotCQkJCSAgICAgZGVidWdfZ2V0X3JlYWxfdHlwZSAoKFBUUikgaW5mbywKLQkJCQkJCQkgIGYxLT50eXBlLCBOVUxMKSwKLQkJCQkgICAgIGRlYnVnX2dldF9yZWFsX3R5cGUgKChQVFIpIGluZm8sCi0JCQkJCQkJICBmMi0+dHlwZSwgTlVMTCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpwZjEgIT0gTlVMTCB8fCAqcGYyICE9IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYzEtPnZwdHJiYXNlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgYzEtPnZwdHJiYXNlLCBjMi0+dnB0cmJhc2UpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGMxLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKipwYjEsICoqcGIyOwotCi0gICAgICBmb3IgKHBiMSA9IGMxLT5iYXNlY2xhc3NlcywgcGIyID0gYzItPmJhc2VjbGFzc2VzOwotCSAgICpwYjEgIT0gTlVMTCAmJiAqcGIyICE9IE5VTEw7Ci0JICAgKytwYjEsICsrcGIyKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmIxLCAqYjI7Ci0KLQkgIGIxID0gKnBiMTsKLQkgIGIyID0gKnBiMjsKLQkgIGlmIChiMS0+Yml0cG9zICE9IGIyLT5iaXRwb3MKLQkgICAgICB8fCBiMS0+dmlydHVhbCAhPSBiMi0+dmlydHVhbAotCSAgICAgIHx8IGIxLT52aXNpYmlsaXR5ICE9IGIyLT52aXNpYmlsaXR5Ci0JICAgICAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCBiMS0+dHlwZSwgYjItPnR5cGUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpwYjEgIT0gTlVMTCB8fCAqcGIyICE9IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYzEtPm1ldGhvZHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kICoqcG0xLCAqKnBtMjsKLQotICAgICAgZm9yIChwbTEgPSBjMS0+bWV0aG9kcywgcG0yID0gYzItPm1ldGhvZHM7Ci0JICAgKnBtMSAhPSBOVUxMICYmICpwbTIgIT0gTlVMTDsKLQkgICArK3BtMSwgKytwbTIpCi0JewotCSAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTEsICptMjsKLQotCSAgbTEgPSAqcG0xOwotCSAgbTIgPSAqcG0yOwotCSAgaWYgKG0xLT5uYW1lWzBdICE9IG0yLT5uYW1lWzBdCi0JICAgICAgfHwgc3RyY21wIChtMS0+bmFtZSwgbTItPm5hbWUpICE9IDAKLQkgICAgICB8fCAobTEtPnZhcmlhbnRzID09IE5VTEwpICE9IChtMi0+dmFyaWFudHMgPT0gTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChtMS0+dmFyaWFudHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKnB2MSwgKipwdjI7Ci0KLQkgICAgICBmb3IgKHB2MSA9IG0xLT52YXJpYW50cywgcHYyID0gbTItPnZhcmlhbnRzOwotCQkgICAqcHYxICE9IE5VTEwgJiYgKnB2MiAhPSBOVUxMOwotCQkgICArK3B2MSwgKytwdjIpCi0JCXsKLQkJICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnYxLCAqdjI7Ci0KLQkJICB2MSA9ICpwdjE7Ci0JCSAgdjIgPSAqcHYyOwotCQkgIGlmICh2MS0+cGh5c25hbWVbMF0gIT0gdjItPnBoeXNuYW1lWzBdCi0JCSAgICAgIHx8IHYxLT52aXNpYmlsaXR5ICE9IHYyLT52aXNpYmlsaXR5Ci0JCSAgICAgIHx8IHYxLT5jb25zdHAgIT0gdjItPmNvbnN0cAotCQkgICAgICB8fCB2MS0+dm9sYXRpbGVwICE9IHYyLT52b2xhdGlsZXAKLQkJICAgICAgfHwgdjEtPnZvZmZzZXQgIT0gdjItPnZvZmZzZXQKLQkJICAgICAgfHwgKHYxLT5jb250ZXh0ID09IE5VTEwpICE9ICh2Mi0+Y29udGV4dCA9PSBOVUxMKQotCQkgICAgICB8fCBzdHJjbXAgKHYxLT5waHlzbmFtZSwgdjItPnBoeXNuYW1lKSAhPSAwCi0JCSAgICAgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdjEtPnR5cGUsIHYyLT50eXBlKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpZiAodjEtPmNvbnRleHQgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdjEtPmNvbnRleHQsCi0JCQkJCSAgICAgIHYyLT5jb250ZXh0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmICgqcHYxICE9IE5VTEwgfHwgKnB2MiAhPSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoKnBtMSAhPSBOVUxMIHx8ICpwbTIgIT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVidWcuaCBiL2JpbnV0aWxzL2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODkwYjIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5OCArMCwwIEBACi0vKiBkZWJ1Zy5oIC0tIERlc2NyaWJlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgREVCVUdfSAotI2RlZmluZSBERUJVR19ICi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgZGVzY3JpYmVzIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotICAgV2UgbWF5IGV2ZW50dWFsbHkgaGF2ZSByZWFkZXJzIHdoaWNoIGNvbnZlcnQgZGlmZmVyZW50IGZvcm1hdHMgaW50bwotICAgdGhpcyBnZW5lcmljIGZvcm1hdCwgYW5kIHdyaXRlcnMgd2hpY2ggd3JpdGUgaXQgb3V0LiAgVGhlIGluaXRpYWwKLSAgIGltcGV0dXMgZm9yIHRoaXMgd2FzIHdyaXRpbmcgYSBjb252ZXJ0b3IgZnJvbSBzdGFicyB0byBIUCBJRUVFLTY5NQotICAgZGVidWdnaW5nIGZvcm1hdC4gICovCi0KLS8qIERpZmZlcmVudCBraW5kcyBvZiB0eXBlcy4gICovCi0KLWVudW0gZGVidWdfdHlwZV9raW5kCi17Ci0gIC8qIE5vdCB1c2VkLiAgKi8KLSAgREVCVUdfS0lORF9JTExFR0FMLAotICAvKiBJbmRpcmVjdCB2aWEgYSBwb2ludGVyLiAgKi8KLSAgREVCVUdfS0lORF9JTkRJUkVDVCwKLSAgLyogVm9pZC4gICovCi0gIERFQlVHX0tJTkRfVk9JRCwKLSAgLyogSW50ZWdlci4gICovCi0gIERFQlVHX0tJTkRfSU5ULAotICAvKiBGbG9hdGluZyBwb2ludC4gICovCi0gIERFQlVHX0tJTkRfRkxPQVQsCi0gIC8qIENvbXBsZXguICAqLwotICBERUJVR19LSU5EX0NPTVBMRVgsCi0gIC8qIEJvb2xlYW4uICAqLwotICBERUJVR19LSU5EX0JPT0wsCi0gIC8qIFN0cnVjdC4gICovCi0gIERFQlVHX0tJTkRfU1RSVUNULAotICAvKiBVbmlvbi4gICovCi0gIERFQlVHX0tJTkRfVU5JT04sCi0gIC8qIENsYXNzLiAgKi8KLSAgREVCVUdfS0lORF9DTEFTUywKLSAgLyogVW5pb24gY2xhc3MgKGNhbiB0aGlzIHJlYWxseSBoYXBwZW4/KS4gICovCi0gIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MsCi0gIC8qIEVudW1lcmF0aW9uIHR5cGUuICAqLwotICBERUJVR19LSU5EX0VOVU0sCi0gIC8qIFBvaW50ZXIuICAqLwotICBERUJVR19LSU5EX1BPSU5URVIsCi0gIC8qIEZ1bmN0aW9uLiAgKi8KLSAgREVCVUdfS0lORF9GVU5DVElPTiwKLSAgLyogUmVmZXJlbmNlLiAgKi8KLSAgREVCVUdfS0lORF9SRUZFUkVOQ0UsCi0gIC8qIFJhbmdlLiAgKi8KLSAgREVCVUdfS0lORF9SQU5HRSwKLSAgLyogQXJyYXkuICAqLwotICBERUJVR19LSU5EX0FSUkFZLAotICAvKiBTZXQuICAqLwotICBERUJVR19LSU5EX1NFVCwKLSAgLyogQmFzZWQgcG9pbnRlci4gICovCi0gIERFQlVHX0tJTkRfT0ZGU0VULAotICAvKiBNZXRob2QuICAqLwotICBERUJVR19LSU5EX01FVEhPRCwKLSAgLyogQ29uc3QgcXVhbGlmaWVkIHR5cGUuICAqLwotICBERUJVR19LSU5EX0NPTlNULAotICAvKiBWb2xhdGlsZSBxdWFsaWZpZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfVk9MQVRJTEUsCi0gIC8qIE5hbWVkIHR5cGUuICAqLwotICBERUJVR19LSU5EX05BTUVELAotICAvKiBUYWdnZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfVEFHR0VECi19OwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgdmFyaWFibGVzLiAgKi8KLQotZW51bSBkZWJ1Z192YXJfa2luZAotewotICAvKiBOb3QgdXNlZC4gICovCi0gIERFQlVHX1ZBUl9JTExFR0FMLAotICAvKiBBIGdsb2JhbCB2YXJpYWJsZS4gICovCi0gIERFQlVHX0dMT0JBTCwKLSAgLyogQSBzdGF0aWMgdmFyaWFibGUuICAqLwotICBERUJVR19TVEFUSUMsCi0gIC8qIEEgbG9jYWwgc3RhdGljIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfTE9DQUxfU1RBVElDLAotICAvKiBBIGxvY2FsIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfTE9DQUwsCi0gIC8qIEEgcmVnaXN0ZXIgdmFyaWFibGUuICAqLwotICBERUJVR19SRUdJU1RFUgotfTsKLQotLyogRGlmZmVyZW50IGtpbmRzIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1lbnVtIGRlYnVnX3Bhcm1fa2luZAotewotICAvKiBOb3QgdXNlZC4gICovCi0gIERFQlVHX1BBUk1fSUxMRUdBTCwKLSAgLyogQSBzdGFjayBiYXNlZCBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1NUQUNLLAotICAvKiBBIHJlZ2lzdGVyIHBhcmFtZXRlci4gICovCi0gIERFQlVHX1BBUk1fUkVHLAotICAvKiBBIHN0YWNrIGJhc2VkIHJlZmVyZW5jZSBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1JFRkVSRU5DRSwKLSAgLyogQSByZWdpc3RlciByZWZlcmVuY2UgcGFyYW1ldGVyLiAgKi8KLSAgREVCVUdfUEFSTV9SRUZfUkVHCi19OwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgdmlzaWJpbGl0eS4gICovCi0KLWVudW0gZGVidWdfdmlzaWJpbGl0eQotewotICAvKiBBIHB1YmxpYyBmaWVsZCAoZS5nLiwgYSBmaWVsZCBpbiBhIEMgc3RydWN0KS4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDLAotICAvKiBBIHByb3RlY3RlZCBmaWVsZC4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVELAotICAvKiBBIHByaXZhdGUgZmllbGQuICAqLwotICBERUJVR19WSVNJQklMSVRZX1BSSVZBVEUsCi0gIC8qIEEgZmllbGQgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICBERUJVR19WSVNJQklMSVRZX0lHTk9SRQotfTsKLQotLyogQSB0eXBlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfdHlwZSAqZGVidWdfdHlwZTsKLQotI2RlZmluZSBERUJVR19UWVBFX05VTEwgKChkZWJ1Z190eXBlKSBOVUxMKQotCi0vKiBBIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfZmllbGQgKmRlYnVnX2ZpZWxkOwotCi0jZGVmaW5lIERFQlVHX0ZJRUxEX05VTEwgKChkZWJ1Z19maWVsZCkgTlVMTCkKLQotLyogQSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmRlYnVnX2Jhc2VjbGFzczsKLQotI2RlZmluZSBERUJVR19CQVNFQ0xBU1NfTlVMTCAoKGRlYnVnX2Jhc2VjbGFzcykgTlVMTCkKLQotLyogQSBtZXRob2Qgb2YgYW4gb2JqZWN0LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfbWV0aG9kICpkZWJ1Z19tZXRob2Q7Ci0KLSNkZWZpbmUgREVCVUdfTUVUSE9EX05VTEwgKChkZWJ1Z19tZXRob2QpIE5VTEwpCi0KLS8qIFRoZSBhcmd1bWVudHMgdG8gYSBtZXRob2QgZnVuY3Rpb24gb2YgYW4gb2JqZWN0LiAgVGhlc2UgaW5kaWNhdGUKLSAgIHdoaWNoIG1ldGhvZCB0byBydW4uICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqZGVidWdfbWV0aG9kX3ZhcmlhbnQ7Ci0KLSNkZWZpbmUgREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTCAoKGRlYnVnX21ldGhvZF92YXJpYW50KSBOVUxMKQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gZGVidWdfd3JpdGUuICBJdCBob2xkcyBmdW5jdGlvbgotICAgcG9pbnRlcnMgdGhhdCBkZWJ1Z193cml0ZSB3aWxsIGNhbGwgYmFzZWQgb24gdGhlIGFjY3VtdWxhdGVkCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfd3JpdGVfZm5zCi17Ci0gIC8qIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIG5ldyBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlCi0gICAgIG5hbWUgb2YgdGhlIG1haW4gZmlsZSBpbiB0aGUgbmV3IHVuaXQuICAqLwotICBib29sZWFuICgqc3RhcnRfY29tcGlsYXRpb25fdW5pdCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB3aXRoaW4gYQotICAgICBjb21waWxhdGlvbiB1bml0LCBiZWZvcmUgb3V0cHV0dGluZyBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIGZvcgotICAgICB0aGF0IGZpbGUuICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBib29sZWFuICgqc3RhcnRfc291cmNlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIEVhY2ggd3JpdGVyIG11c3Qga2VlcCBhIHN0YWNrIG9mIHR5cGVzLiAgKi8KLQotICAvKiBQdXNoIGFuIGVtcHR5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoaXMgdHlwZSBjYW4gYXBwZWFyIGlmCi0gICAgIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSB3aGljaCBpcyBuZXZlciBkZWZpbmVkLiAgKi8KLSAgYm9vbGVhbiAoKmVtcHR5X3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYSB2b2lkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp2b2lkX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYW4gaW50ZWdlciB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplIGFuZAotICAgICB3aGV0aGVyIGl0IGlzIHVuc2lnbmVkLiAgKi8KLSAgYm9vbGVhbiAoKmludF90eXBlKSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotCi0gIC8qIFB1c2ggYSBmbG9hdGluZyB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplLiAgKi8KLSAgYm9vbGVhbiAoKmZsb2F0X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhIGNvbXBsZXggdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpjb21wbGV4X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhIGJvb2xlYW4gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpib29sX3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhbiBlbnVtIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHRhZywgYSBOVUxMCi0gICAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbmFtZXMgYW5kIHRoZSBhc3NvY2lhdGVkIHZhbHVlcy4gIElmIHRoZXJlIGlzCi0gICAgIG5vIHRhZywgdGhlIHRhZyBhcmd1bWVudCB3aWxsIGJlIE5VTEwuICBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZAotICAgICBlbnVtLCB0aGUgbmFtZXMgYW5kIHZhbHVlcyBhcmd1bWVudHMgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKmVudW1fdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCi0JCQkJYmZkX3NpZ25lZF92bWEgKikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgcG9pbnRlciB0byB0aGF0Ci0gICAgIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpwb2ludGVyX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYSBmdW5jdGlvbiB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IHR5cGVzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBvbnRvCi0gICAgIHRoZSBzdGFjay4gIElmIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXMgaXMgcGFzc2VkIGFzIC0xLCB0aGVuCi0gICAgIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgZnVuY3Rpb24gYXJlIHVua25vd24sIGFuZCBubyB0eXBlcyBoYXZlCi0gICAgIGJlZW4gcHVzaGVkIG9udG8gdGhlIHN0YWNrLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlCi0gICAgIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSByZXR1cm4gdHlwZQotICAgICBvZiB0aGUgZnVuY3Rpb24gaXMgcHVzaGVkIG9udG8gdGhlIHR5cGUgc3RhY2sgYmVsb3cgdGhlIGFyZ3VtZW50Ci0gICAgIHR5cGVzLCBpZiBhbnkuICAqLwotICBib29sZWFuICgqZnVuY3Rpb25fdHlwZSkgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHJlZmVyZW5jZSB0byB0aGF0Ci0gICAgIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpyZWZlcmVuY2VfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSByYW5nZSBvZiB0aGF0IHR5cGUKLSAgICAgd2l0aCB0aGUgZ2l2ZW4gbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnJhbmdlX3R5cGUpIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci0KLSAgLyogUHVzaCBhbiBhcnJheSB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgdG9wIHR5cGUgb24gdGhlIHR5cGUKLSAgICAgc3RhY2sgaXMgdGhlIHJhbmdlLCBhbmQgdGhlIG5leHQgdHlwZSBvbiB0aGUgdHlwZSBzdGFjayBpcyB0aGUKLSAgICAgZWxlbWVudCB0eXBlLiAgVGhlc2Ugc2hvdWxkIGJlIHBvcHBlZCBiZWZvcmUgdGhlIGFycmF5IHR5cGUgaXMKLSAgICAgcHVzaGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIGxvd2VyIGJvdW5kLCB0aGUgdXBwZXIgYm91bmQsIGFuZAotICAgICB3aGV0aGVyIHRoZSBhcnJheSBpcyBhIHN0cmluZy4gICovCi0gIGJvb2xlYW4gKCphcnJheV90eXBlKSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwKLQkJCQkgYm9vbGVhbikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgc2V0IG9mIHRoYXQgdHlwZQotICAgICBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgc2V0IGlzCi0gICAgIGEgYml0c3RyaW5nLiAgKi8KLSAgYm9vbGVhbiAoKnNldF90eXBlKSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLQotICAvKiBQdXNoIGFuIG9mZnNldCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgdG9wIHR5cGUgb24gdGhlCi0gICAgIHR5cGUgc3RhY2sgaXMgdGhlIHRhcmdldCB0eXBlLCBhbmQgdGhlIG5leHQgdHlwZSBvbiB0aGUgdHlwZQotICAgICBzdGFjayBpcyB0aGUgYmFzZSB0eXBlLiAgVGhlc2Ugc2hvdWxkIGJlIHBvcHBlZCBiZWZvcmUgdGhlIG9mZnNldAotICAgICB0eXBlIGlzIHB1c2hlZC4gICovCi0gIGJvb2xlYW4gKCpvZmZzZXRfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIG1ldGhvZCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgIGlzIHRydWUsIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZQotICAgICBtZXRob2QgYmVsb25nczsgb3RoZXJ3aXNlLCB0aGUgY2xhc3MgbXVzdCBiZSBkZXRlcm1pbmVkIGJ5IHRoZQotICAgICBjbGFzcyB0byB3aGljaCB0aGUgbWV0aG9kIGlzIGF0dGFjaGVkLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZQotICAgICBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXM7IHRoZXNlIGFyZSBwdXNoZWQgb250byB0aGUgdHlwZSBzdGFjayBpbgotICAgICByZXZlcnNlIG9yZGVyICh0aGUgZmlyc3QgdHlwZSBwb3BwZWQgaXMgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlCi0gICAgIG1ldGhvZCkuICBBIHZhbHVlIG9mIC0xIGZvciB0aGUgdGhpcmQgYXJndW1lbnQgbWVhbnMgdGhhdCBubwotICAgICBhcmd1bWVudCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUKLSAgICAgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSBuZXh0Ci0gICAgIHR5cGUgb24gdGhlIHR5cGUgc3RhY2sgYmVsb3cgdGhlIGRvbWFpbiBhbmQgdGhlIGFyZ3VtZW50IHR5cGVzIGlzCi0gICAgIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kLiAgQWxsIHRoZXNlIHR5cGVzIG11c3QgYmUgcG9wcGVkLAotICAgICBhbmQgdGhlbiB0aGUgbWV0aG9kIHR5cGUgbXVzdCBiZSBwdXNoZWQuICAqLwotICBib29sZWFuICgqbWV0aG9kX3R5cGUpIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgY29uc3QgcXVhbGlmaWVkCi0gICAgIHZlcnNpb24gb2YgdGhhdCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqY29uc3RfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgdm9sYXRpbGUKLSAgICAgcXVhbGlmaWVkIHZlcnNpb24gb2YgdGhhdCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqdm9sYXRpbGVfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBzdHJ1Y3QuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIHRoZQotICAgICBzdHJ1Y3RfZmllbGQgZnVuY3Rpb24sIGFuZCBmaW5pc2hlZCBieSBhIGNhbGwgdG8gdGhlCi0gICAgIGVuZF9zdHJ1Y3RfdHlwZSBmdW5jdGlvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHRhZzsgdGhpcwotICAgICB3aWxsIGJlIE5VTEwgaWYgdGhlcmUgaXNuJ3Qgb25lLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBOVUxMLAotICAgICB0aGUgdGhpcmQgYXJndW1lbnQgaXMgYSBjb25zdGFudCBpZGVudGlmeWluZyB0aGlzIHN0cnVjdCBmb3IgdXNlCi0gICAgIHdpdGggdGFnX3R5cGUuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LCBmYWxzZQotICAgICBmb3IgYSB1bmlvbi4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZS4gIElmIHRoaXMgaXMgYW4KLSAgICAgdW5kZWZpbmVkIHN0cnVjdCBvciB1bmlvbiwgdGhlIHNpemUgd2lsbCBiZSAwIGFuZCBzdHJ1Y3RfZmllbGQKLSAgICAgd2lsbCBub3QgYmUgY2FsbGVkIGJlZm9yZSBlbmRfc3RydWN0X3R5cGUgaXMgY2FsbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X3N0cnVjdF90eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQlib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBBZGQgYSBmaWVsZCB0byB0aGUgc3RydWN0IHR5cGUgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhlIHR5cGUKLSAgICAgb2YgdGhlIGZpZWxkIHNob3VsZCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50cwotICAgICBhcmUgdGhlIG5hbWUsIHRoZSBiaXQgcG9zaXRpb24sIHRoZSBiaXQgc2l6ZSAobWF5IGJlIHplcm8gaWYgdGhlCi0gICAgIGZpZWxkIGlzIG5vdCBwYWNrZWQpLCBhbmQgdGhlIHZpc2liaWxpdHkuICAqLwotICBib29sZWFuICgqc3RydWN0X2ZpZWxkKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwKLQkJCQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotICAvKiBGaW5pc2ggYnVpbGRpbmcgYSBzdHJ1Y3QsIGFuZCBwdXNoIGl0IG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqZW5kX3N0cnVjdF90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBTdGFydCBidWlsZGluZyBhIGNsYXNzLiAgVGhpcyBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBzZXZlcmFsCi0gICAgIGZ1bmN0aW9uczogc3RydWN0X2ZpZWxkLCBjbGFzc19zdGF0aWNfbWVtYmVyLCBjbGFzc19iYXNlY2xhc3MsCi0gICAgIGNsYXNzX3N0YXJ0X21ldGhvZCwgY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gICAgIGNsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwgYW5kIGNsYXNzX2VuZF9tZXRob2QuICBUaGUgY2xhc3MgaXMKLSAgICAgZmluaXNoZWQgYnkgYSBjYWxsIHRvIGVuZF9jbGFzc190eXBlLiAgVGhlIGZpcnN0IGZpdmUgYXJndW1lbnRzCi0gICAgIGFyZSB0aGUgc2FtZSBhcyBmb3Igc3RhcnRfc3RydWN0X3R5cGUuICBUaGUgc2l4dGggYXJndW1lbnQgaXMKLSAgICAgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZpcnR1YWwgZnVuY3Rpb24gdGFibGU7IGlmIHRoZXJlIGlzLCB0aGUKLSAgICAgc2V2ZW50aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGNhbiBiZQotICAgICBmb3VuZCBpbiB0aGUgdHlwZSBpdHNlbGYsIGFuZCBpcyBmYWxzZSBpZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Ci0gICAgIGhvbGRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgc2hvdWxkIGJlIHBvcHBlZCBmcm9tIHRoZSB0eXBlCi0gICAgIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X2NsYXNzX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJICAgICAgIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKLQkJCQkgICAgICAgYm9vbGVhbikpOwotCi0gIC8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZQotICAgICBhcmd1bWVudHMgYXJlIHRoZSBmaWVsZCBuYW1lLCB0aGUgcGh5c2ljYWwgbmFtZSwgYW5kIHRoZQotICAgICB2aXNpYmlsaXR5LiAgVGhlIHR5cGUgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX3N0YXRpY19tZW1iZXIpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0gIAotICAvKiBBZGQgYSBiYXNlY2xhc3MgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZSB0eXBlIG9mCi0gICAgIHRoZSBiYXNlY2xhc3MgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50cwotICAgICBhcmUgdGhlIGJpdCBwb3NpdGlvbiwgd2hldGhlciB0aGUgY2xhc3MgaXMgdmlydHVhbCwgYW5kIHRoZQotICAgICB2aXNpYmlsaXR5LiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX2Jhc2VjbGFzcykgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLAotCQkJCSAgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0gIC8qIFN0YXJ0IGFkZGluZyBhIG1ldGhvZCB0byB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhpcwotICAgICBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBjbGFzc19tZXRob2RfdmFyaWFudCBhbmQKLSAgICAgY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IHRvIGRlc2NyaWJlIGRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUKLSAgICAgbWV0aG9kIHdoaWNoIHRha2UgZGlmZmVyZW50IGFyZ3VtZW50cy4gIFRoZSBtZXRob2QgaXMgZmluaXNoZWQKLSAgICAgd2l0aCBhIGNhbGwgdG8gY2xhc3NfZW5kX21ldGhvZC4gIFRoZSBhcmd1bWVudCBpcyB0aGUgbWV0aG9kCi0gICAgIG5hbWUuICAqLwotICBib29sZWFuICgqY2xhc3Nfc3RhcnRfbWV0aG9kKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIERlc2NyaWJlIGEgdmFyaWFudCB0byB0aGUgY2xhc3MgbWV0aG9kIGN1cnJlbnRseSBiZWluZyBidWlsdC4KLSAgICAgVGhlIHR5cGUgb2YgdGhlIHZhcmlhbnQgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlCi0gICAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBUaGUKLSAgICAgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgdGhlIHZpc2liaWxpdHksIHdoZXRoZXIgdGhlIHZhcmlhbnQgaXMKLSAgICAgY29uc3QsIHdoZXRoZXIgdGhlIHZhcmlhbnQgaXMgdm9sYXRpbGUsIHRoZSBvZmZzZXQgaW4gdGhlIHZpcnR1YWwKLSAgICAgZnVuY3Rpb24gdGFibGUsIGFuZCB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIG9uIHRoZSB0eXBlIHN0YWNrCi0gICAgIChiZWxvdyB0aGUgdmFyaWFudCB0eXBlKS4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19tZXRob2RfdmFyaWFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JCQkJCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSwKLQkJCQkJICAgYm9vbGVhbiwgYm9vbGVhbiwKLQkJCQkJICAgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi0gIC8qIERlc2NyaWJlIGEgc3RhdGljIHZhcmlhbnQgdG8gdGhlIGNsYXNzIG1ldGhvZCBjdXJyZW50bHkgYmVpbmcKLSAgICAgYnVpbHQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gICAgIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmd1bWVudHMgYXJlIG9taXR0ZWQuICBUaGUgdHlwZSBvZiB0aGUKLSAgICAgdmFyaWFudCBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkJCQkJCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5LAotCQkJCQkJICBib29sZWFuLCBib29sZWFuKSk7Ci0KLSAgLyogRmluaXNoIGRlc2NyaWJpbmcgYSBjbGFzcyBtZXRob2QuICAqLwotICBib29sZWFuICgqY2xhc3NfZW5kX21ldGhvZCkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogRmluaXNoIGRlc2NyaWJpbmcgYSBjbGFzcywgYW5kIHB1c2ggaXQgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCplbmRfY2xhc3NfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHdoaWNoIHdhcyBnaXZlbiBhIG5hbWUgYnkgYW4gZWFybGllcgotICAgICBjYWxsIHRvIHR5cGRlZi4gICovCi0gIGJvb2xlYW4gKCp0eXBlZGVmX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogUHVzaCBhIHRhZ2dlZCB0eXBlIG9uIHRoZSBzdGFjayB3aGljaCB3YXMgZGVmaW5lZCBlYXJsaWVyLiAgSWYKLSAgICAgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlIHR5cGUgd2FzIGRlZmluZWQgYnkgYSBjYWxsCi0gICAgIHRvIHRhZy4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgTlVMTCwgdGhlIHR5cGUgd2FzIGRlZmluZWQgYnkKLSAgICAgYSBjYWxsIHRvIHN0YXJ0X3N0cnVjdF90eXBlIG9yIHN0YXJ0X2NsYXNzX3R5cGUgd2l0aCBhIHRhZyBvZgotICAgICBOVUxMIGFuZCB0aGUgbnVtYmVyIG9mIHRoZSB0aGlyZCBhcmd1bWVudC4gIEVpdGhlciB3YXksIHRoZQotICAgICBmb3VydGggYXJndW1lbnQgaXMgdGhlIHRhZyBraW5kLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGNhbGxlZAotICAgICBmb3IgYSBzdHJ1Y3QgKGNsYXNzKSBiZWluZyBkZWZpbmVkLCBpbiBiZXR3ZWVuIHRoZSBjYWxsIHRvCi0gICAgIHN0YXJ0X3N0cnVjdF90eXBlIChzdGFydF9jbGFzc190eXBlKSBhbmQgdGhlIGNhbGwgdG8KLSAgICAgZW5kX3N0cnVjdF90eXBlIChlbmRfY2xhc3NfdHlwZSkuICAqLwotICBib29sZWFuICgqdGFnX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLQotICAvKiBQb3AgdGhlIHR5cGUgc3RhY2ssIGFuZCB0eXBlZGVmIGl0IHRvIHRoZSBnaXZlbiBuYW1lLiAgKi8KLSAgYm9vbGVhbiAoKnR5cGRlZikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBQb3AgdGhlIHR5cGUgc3RhY2ssIGFuZCBkZWNsYXJlIGl0IGFzIGEgdGFnZ2VkIHN0cnVjdCBvciB1bmlvbiBvcgotICAgICBlbnVtIG9yIHdoYXRldmVyLiAgVGhlIHRhZyBwYXNzZWQgZG93biBoZXJlIGlzIHJlZHVuZGFudCwgc2luY2UKLSAgICAgd2FzIGFsc28gcGFzc2VkIHdoZW4gZW51bV90eXBlLCBzdGFydF9zdHJ1Y3RfdHlwZSwgb3IKLSAgICAgc3RhcnRfY2xhc3NfdHlwZSB3YXMgY2FsbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnRhZykgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSBuYW1lZCBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLSAgYm9vbGVhbiAoKmludF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSBuYW1lZCBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0gIGJvb2xlYW4gKCpmbG9hdF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIHR5cGVkIGludGVnZXIgY29uc3RhbnQuICBUaGUgdHlwZSBpcwotICAgICBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnR5cGVkX2NvbnN0YW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIHZhcmlhYmxlLiAgVGhlIHR5cGUgaXMgcG9wcGVkIG9mZiB0aGUKLSAgICAgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp2YXJpYWJsZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsCi0JCQkgICAgICAgYmZkX3ZtYSkpOwotCi0gIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgZnVuY3Rpb24uICBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBwb3BwZWQgb2ZmCi0gICAgIHRoZSBzdGFjay4gIFRoZSBib29sZWFuIGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGlzIGdsb2JhbC4gIFRoaXMKLSAgICAgaXMgZm9sbG93ZWQgYnkgY2FsbHMgdG8gZnVuY3Rpb25fcGFyYW1ldGVyLCBmb2xsb3dlZCBieSBibG9jawotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9mdW5jdGlvbikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLQotICAvKiBSZWNvcmQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIHR5cGUKLSAgICAgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpmdW5jdGlvbl9wYXJhbWV0ZXIpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotCQkJCQkgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLQotICAvKiBTdGFydCB3cml0aW5nIG91dCBhIGJsb2NrLiAgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRvcCBsZXZlbCBibG9jawotICAgICBwZXIgZnVuY3Rpb24uICBCbG9ja3MgbWF5IGJlIG5lc3RlZC4gIFRoZSBhcmd1bWVudCBpcyB0aGUKLSAgICAgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgYmxvY2suICAqLwotICBib29sZWFuICgqc3RhcnRfYmxvY2spIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotCi0gIC8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGJsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBlbmRpbmcgYWRkcmVzcwotICAgICBvZiB0aGUgYmxvY2suICAqLwotICBib29sZWFuICgqZW5kX2Jsb2NrKSBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotICAvKiBGaW5pc2ggd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gICovCi0gIGJvb2xlYW4gKCplbmRfZnVuY3Rpb24pIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFJlY29yZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIGJvb2xlYW4gKCpsaW5lbm8pIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7Ci19OwotCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMuICAqLwotCi0vKiBUaGUgZmlyc3QgYXJndW1lbnQgdG8gbW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgYSBoYW5kbGUuICBUaGlzCi0gICBoYW5kbGUgaXMgcmV0dXJuZWQgYnkgdGhlIGRlYnVnX2luaXQgZnVuY3Rpb24uICBUaGUgcHVycG9zZSBvZiB0aGUKLSAgIGhhbmRsZSBpcyB0byBwZXJtaXQgdGhlIGRlYnVnZ2luZyByb3V0aW5lcyB0byBub3QgdXNlIHN0YXRpYwotICAgdmFyaWFibGVzLCBhbmQgaGVuY2UgdG8gYmUgcmVlbnRyYW50LiAgVGhpcyB3b3VsZCBiZSB1c2VmdWwgZm9yIGEKLSAgIHByb2dyYW0gd2hpY2ggd2FudGVkIHRvIGhhbmRsZSB0d28gZXhlY3V0YWJsZXMgc2ltdWx0YW5lb3VzbHkuICAqLwotCi0vKiBSZXR1cm4gYSBkZWJ1Z2dpbmcgaGFuZGxlLiAgKi8KLQotZXh0ZXJuIFBUUiBkZWJ1Z19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogU2V0IHRoZSBzb3VyY2UgZmlsZW5hbWUuICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgbmV3IGNvbXBpbGF0aW9uCi0gICB1bml0LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc2V0X2ZpbGVuYW1lIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIENoYW5nZSBzb3VyY2UgZmlsZXMgdG8gdGhlIGdpdmVuIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGluY2x1ZGUgZmlsZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3N0YXJ0X3NvdXJjZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWNvcmQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIGZ1bmN0aW9uCi0gICBibG9jay4gIFRoZSBkZWJ1Z190eXBlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuCi0gICBUaGUgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgZ2xvYmFsbHkgdmlzaWJsZS4KLSAgIFRoZSBiZmRfdm1hIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICBDdXJyZW50bHkKLSAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHNwZWNpZmllZCBieSBjYWxscyB0bwotICAgZGVidWdfcmVjb3JkX3BhcmFtZXRlci4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9mdW5jdGlvbgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgYm9vbGVhbiwgYmZkX3ZtYSkpOwotCi0vKiBSZWNvcmQgYSBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLQotLyogRW5kIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZSBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUKLSAgIGZ1bmN0aW9uIGVuZHMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIFN0YXJ0IGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIEFsbCBsb2NhbCBpbmZvcm1hdGlvbiB3aWxsIGJlCi0gICByZWNvcmRlZCBpbiB0aGlzIGJsb2NrLCB1bnRpbCB0aGUgbWF0Y2hpbmcgY2FsbCB0byBkZWJ1Z19lbmRfYmxvY2suCi0gICBkZWJ1Z19zdGFydF9ibG9jayBhbmQgZGVidWdfZW5kX2Jsb2NrIG1heSBiZSBuZXN0ZWQuICBUaGUgYXJndW1lbnQKLSAgIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sgc3RhcnRzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIEZpbmlzaCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBUaGlzIG1hdGNoZXMgdGhlIGNhbGwgdG8KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sKLSAgIGVuZHMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIEFzc29jaWF0ZSBhIGxpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdpdGggYSBnaXZlbgotICAgYWRkcmVzcy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9saW5lIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi0vKiBTdGFydCBhIG5hbWVkIGNvbW1vbiBibG9jay4gIFRoaXMgaXMgYSBibG9jayBvZiB2YXJpYWJsZXMgdGhhdCBtYXkKLSAgIG1vdmUgaW4gbWVtb3J5LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEVuZCBhIG5hbWVkIGNvbW1vbiBibG9jay4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX2VuZF9jb21tb25fYmxvY2sgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogUmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9pbnRfY29uc3QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLQotLyogUmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotCi0vKiBSZWNvcmQgYSB0eXBlZCBjb25zdGFudCB3aXRoIGFuIGludGVncmFsIHZhbHVlLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3R5cGVkX2NvbnN0Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIGxhYmVsLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2xhYmVsCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci0KLS8qIE1ha2UgYW4gaW5kaXJlY3QgdHlwZS4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdGhlCi0gICBsb2NhdGlvbiB3aGVyZSB0aGUgcmVhbCB0eXBlIHdpbGwgYmUgcGxhY2VkLiAgVGhlIHNlY29uZCBhcmd1bWVudAotICAgaXMgdGhlIHR5cGUgdGFnLCBpZiB0aGVyZSBpcyBvbmU7IHRoaXMgbWF5IGJlIE5VTEw7IHRoZSBvbmx5Ci0gICBwdXJwb3NlIG9mIHRoaXMgYXJndW1lbnQgaXMgc28gdGhhdCBkZWJ1Z19nZXRfdHlwZV9uYW1lIGNhbiByZXR1cm4KLSAgIHNvbWV0aGluZyB1c2VmdWwuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHdoZW4gYSB0eXBlIGlzCi0gICByZWZlcmVuY2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSAqLCBjb25zdCBjaGFyICopKTsKLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOwotCi0vKiBNYWtlIGFuIGludGVnZXIgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBUaGUgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlCi0gICBpZiB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIGZsb2F0aW5nIHBvaW50IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgRklYTUU6IE9uIHNvbWUKLSAgIHBsYXRmb3JtcywgbGlrZSBhbiBBbHBoYSwgeW91IHByb2JhYmx5IG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5Ci0gICB0aGUgZm9ybWF0LiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9mbG9hdF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIE1ha2UgYSBib29sZWFuIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogTWFrZSBhIGNvbXBsZXggdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0vKiBNYWtlIGEgc3RydWN0dXJlIHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LAotICAgZmFsc2UgZm9yIGEgdW5pb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdC4KLSAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX2ZpZWxkICopKTsKLQotLyogTWFrZSBhbiBvYmplY3QgdHlwZS4gIFRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGhhbmRsZQotICAgYXJlIHRoZSBzYW1lIGFzIGZvciBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlLiAgVGhlIG5leHQgYXJndW1lbnRzIGFyZQotICAgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLCBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZgotICAgbWV0aG9kcywgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBob2xkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCi0gICBpZiBpdCBpcyBub3QgdGhpcyBvYmplY3QsIGFuZCBhIGJvb2xlYW4gd2hpY2ggaXMgdHJ1ZSBpZiB0aGlzCi0gICBvYmplY3QgaGFzIGl0cyBvd24gdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfb2JqZWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBib29sZWFuLCBiZmRfdm1hLCBkZWJ1Z19maWVsZCAqLCBkZWJ1Z19iYXNlY2xhc3MgKiwKLQkgICBkZWJ1Z19tZXRob2QgKiwgZGVidWdfdHlwZSwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGFuIGVudW1lcmF0aW9uIHR5cGUuICBUaGUgYXJndW1lbnRzIGFyZSBhIG51bGwgdGVybWluYXRlZAotICAgYXJyYXkgb2Ygc3RyaW5ncywgYW5kIGFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9lbnVtX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqLCBiZmRfc2lnbmVkX3ZtYSAqKSk7Ci0KLS8qIE1ha2UgYSBwb2ludGVyIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfcG9pbnRlcl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgZnVuY3Rpb24gdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJldHVybiB0eXBlLiAgVGhlCi0gICB0aGlyZCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gIFRoZQotICAgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0gICBhcmd1bWVudHMuICBJZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgTlVMTCwgdGhlbiB0aGUgYXJndW1lbnQgdHlwZXMKLSAgIGFyZSB1bmtub3duLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSAqLCBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYSByZWZlcmVuY2UgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHJhbmdlIG9mIGEgZ2l2ZW4gdHlwZSBmcm9tIGEgbG93ZXIgdG8gYW4gdXBwZXIgYm91bmQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3JhbmdlX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50Ci0gICBvZiB0aGUgYXJyYXkuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYSByYW5nZSBvZiB0aGUKLSAgIGFycmF5LiAgVGhlIGZvdXJ0aCBhbmQgZmlmdGggYXJndW1lbnQgYXJlIHRoZSBsb3dlciBhbmQgdXBwZXIKLSAgIGJvdW5kcywgcmVzcGVjdGl2ZWx5IChpZiB0aGUgYm91bmRzIGFyZSBub3Qga25vd24sIGxvd2VyIHNob3VsZCBiZQotICAgMCBhbmQgdXBwZXIgc2hvdWxkIGJlIC0xKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMKLSAgIGFycmF5IGlzIGFjdHVhbGx5IGEgc3RyaW5nLCBhcyBpbiBDLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLAotCSAgIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIHNldCBvZiBhIGdpdmVuIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBQYXNjYWwgc2V0IHR5cGUuICBUaGUKLSAgIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIHNldCBpcyBhY3R1YWxseSBhIGJpdHN0cmluZywgYXMgaW4KLSAgIENISUxMLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIHR5cGUgZm9yIGEgcG9pbnRlciB3aGljaCBpcyByZWxhdGl2ZSB0byBhbiBvYmplY3QuICBUaGUKLSAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBwb2ludGVyIGlzCi0gICByZWxhdGl2ZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSB0aGF0IHRoZSBwb2ludGVyIHBvaW50cwotICAgdG8uICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX29mZnNldF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBtZXRob2QgZnVuY3Rpb24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQotICAgcmV0dXJuIHR5cGUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGRvbWFpbi4gIFRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgVGhlIGZpZnRoCi0gICBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZgotICAgYXJndW1lbnRzLCBpbiB3aGljaCBjYXNlIHRoZSBhcnJheSBvZiBhcmd1bWVudCB0eXBlcyBpbmRpY2F0ZXMgdGhlCi0gICB0eXBlcyBvZiB0aGUgZmlyc3QgYXJndW1lbnRzLiAgVGhlIGRvbWFpbiBhbmQgdGhlIGFyZ3VtZW50IGFycmF5Ci0gICBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGlzIGlzIGEgc3R1YiBtZXRob2QgYW5kIHRoYXQKLSAgIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICBTdGFicyBkZWJ1Z2dpbmcgdXNlcyB0aGlzLCBhbmQgZ2V0cwotICAgdGhlIGFyZ3VtZW50IHR5cGVzIGZyb20gdGhlIG1hbmdsZWQgbmFtZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlICosIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfY29uc3RfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhbiB1bmRlZmluZWQgdGFnZ2VkIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBzdHJ1Y3Qgd2hpY2ggaGFzCi0gICBiZWVuIG1lbnRpb25lZCwgYnV0IG5vdCBkZWZpbmVkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci0KLS8qIE1ha2UgYSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBiYXNlCi0gICBjbGFzcyB0eXBlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhpcyBiYXNlCi0gICBjbGFzcyBpbiB0aGUgb2JqZWN0LiAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYQotICAgdmlydHVhbCBjbGFzcy4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYmFzZQotICAgY2xhc3MuICAqLwotCi1leHRlcm4gZGVidWdfYmFzZWNsYXNzIGRlYnVnX21ha2VfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLS8qIE1ha2UgYSBmaWVsZCBmb3IgYSBzdHJ1Y3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLiAgVGhlCi0gICB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzCi0gICB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZC4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZgotICAgdGhlIGZpZWxkIChpdCBtYXkgYmUgemVybykuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkKLSAgIG9mIHRoZSBmaWVsZC4gICovCi0KLWV4dGVybiBkZWJ1Z19maWVsZCBkZWJ1Z19tYWtlX2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hLCBiZmRfdm1hLAotCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0vKiBNYWtlIGEgc3RhdGljIG1lbWJlciBvZiBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQotICAgbmFtZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyLiAgVGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIG1lbWJlciAoaS5lLiwgdGhlIG5hbWUgYXMgYQotICAgZ2xvYmFsIHZhcmlhYmxlKS4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUKLSAgIG1lbWJlci4gICovCi0KLWV4dGVybiBkZWJ1Z19maWVsZCBkZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwKLQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotLyogTWFrZSBhIG1ldGhvZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUsIGFuZCB0aGUgdGhpcmQKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZCB2YXJpYW50cy4gIEVhY2gKLSAgIG1ldGhvZCB2YXJpYW50IGlzIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIGJ1dCB3aXRoIGRpZmZlcmVudAotICAgYXJndW1lbnQgdHlwZXMuICAqLwotCi1leHRlcm4gZGVidWdfbWV0aG9kIGRlYnVnX21ha2VfbWV0aG9kCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKSk7Ci0KLS8qIE1ha2UgYSBtZXRob2QgdmFyaWFudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YKLSAgIHRoZSBmdW5jdGlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24sCi0gICBwcm9iYWJseSBjb25zdHJ1Y3RlZCBieSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlLiAgVGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzCi0gICBhIGNvbnN0IGZ1bmN0aW9uLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhIHZvbGF0aWxlCi0gICBmdW5jdGlvbi4gIFRoZSBzZXZlbnRoIGFyZ3VtZW50IGlzIHRoZSBpbmRleCBpbiB0aGUgdmlydHVhbAotICAgZnVuY3Rpb24gdGFibGUsIGlmIGFueS4gIFRoZSBlaWdodGggYXJndW1lbnQgaXMgdGhlIHZpcnR1YWwKLSAgIGZ1bmN0aW9uIGNvbnRleHQuICAqLwotCi1leHRlcm4gZGVidWdfbWV0aG9kX3ZhcmlhbnQgZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLAotCSAgIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHN0YXRpYyBtZXRob2QgYXJndW1lbnQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IKLSAgIGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmUgb21pdHRlZAotICAgc2luY2UgYSBzdGF0aWMgbWV0aG9kIGNhbiBub3QgYWxzbyBiZSB2aXJ0dWFsLiAgKi8KLQotZXh0ZXJuIGRlYnVnX21ldGhvZF92YXJpYW50IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotCi0vKiBOYW1lIGEgdHlwZS4gIFRoaXMgcmV0dXJucyBhIG5ldyB0eXBlIHdpdGggYW4gYXR0YWNoZWQgbmFtZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX25hbWVfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSkpOwotCi0vKiBHaXZlIGEgdGFnIHRvIGEgdHlwZSwgc3VjaCBhcyBhIHN0cnVjdCBvciB1bmlvbi4gIFRoaXMgcmV0dXJucyBhCi0gICBuZXcgdHlwZSB3aXRoIGFuIGF0dGFjaGVkIHRhZy4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX3RhZ190eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIFJlY29yZCB0aGUgc2l6ZSBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEZpbmQgYSBuYW1lZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZmluZF9uYW1lZF90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEZpbmQgYSB0YWdnZWQgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci0KLS8qIEdldCB0aGUga2luZCBvZiBhIHR5cGUuICAqLwotCi1leHRlcm4gZW51bSBkZWJ1Z190eXBlX2tpbmQgZGVidWdfZ2V0X3R5cGVfa2luZCBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgdHlwZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpkZWJ1Z19nZXRfdHlwZV9uYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIHNpemUgb2YgYSB0eXBlLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X3R5cGVfc2l6ZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZ2V0X3JldHVybl90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBwYXJhbWV0ZXIgdHlwZXMgZm9yIGEgZnVuY3Rpb24gb3IKLSAgIG1ldGhvZCB0eXBlIChhY3R1YWxseSwgcGFyYW1ldGVyIHR5cGVzIGFyZSBub3QgY3VycmVudGx5IHN0b3JlZCBmb3IKLSAgIGZ1bmN0aW9uIHR5cGVzKS4gIFRoaXMgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtZXRob2QKLSAgIHR5cGUgaXMgYSBzdHViIG1ldGhvZCBvciBub3QuICBUaGUgbGFzdCBhcmd1bWVudCBwb2ludHMgdG8gYQotICAgYm9vbGVhbiB3aGljaCBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZQotICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0KLWV4dGVybiBjb25zdCBkZWJ1Z190eXBlICpkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIFBBUkFNUyAoKFBUUiwKLQkJCQkJCQkgICAgZGVidWdfdHlwZSwKLQkJCQkJCQkgICAgYm9vbGVhbiAqKSk7Ci0KLS8qIEdldCB0aGUgdGFyZ2V0IHR5cGUgb2YgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSBvciBjb25zdCBvciB2b2xhdGlsZQotICAgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2dldF90YXJnZXRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzIGZvciBhIHN0cnVjdCwgdW5pb24sIG9yCi0gICBjbGFzcy4gICovCi0KLWV4dGVybiBjb25zdCBkZWJ1Z19maWVsZCAqZGVidWdfZ2V0X2ZpZWxkcyBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSB0eXBlIG9mIGEgZmllbGQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19nZXRfZmllbGRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIGZpZWxkLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlYnVnX2dldF9maWVsZF9uYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBiaXQgcG9zaXRpb24gb2YgYSBmaWVsZCB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlLgotICAgSWYgdGhlIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciwgdGhpcyB3aWxsIHJldHVybiAoYmZkX3ZtYSkgLTEuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBiaXQgc2l6ZSBvZiBhIGZpZWxkLiAgSWYgdGhlIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciwgdGhpcwotICAgd2lsbCByZXR1cm4gKGJmZF92bWEpIC0xLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZC4gICovCi0KLWV4dGVybiBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgYSBmaWVsZCwgaWYgaXQgaXMgYSBzdGF0aWMgbWVtYmVyLiAgSWYgdGhlCi0gICBmaWVsZCBpcyBub3QgYSBzdGF0aWMgbWVtYmVyLCB0aGlzIHdpbGwgcmV0dXJuIE5VTEwuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogV3JpdGUgb3V0IHRoZSByZWNvcmRlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHRha2VzIGEgc2V0IG9mCi0gICBmdW5jdGlvbiBwb2ludGVycyB3aGljaCBhcmUgY2FsbGVkIHRvIGRvIHRoZSBhY3R1YWwgd3JpdGluZy4gIFRoZQotICAgZmlyc3QgUFRSIGlzIHRoZSBkZWJ1Z2dpbmcgaGFuZGxlLiAgVGhlIHNlY29uZCBQVFIgaXMgYSBoYW5kbGUKLSAgIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfd3JpdGUgUEFSQU1TICgoUFRSLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUikpOwotCi0jZW5kaWYgLyogREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVmbGV4LmwgYi9iaW51dGlscy9kZWZsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhNDNjMC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWZsZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSV7LyogZGVmbGV4LmwgLSBMZXhlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVmcGFyc2UuaCIKLSNpbmNsdWRlICJkbGx0b29sLmgiCi0KLWludCBsaW5lbnVtYmVyOwotCi0lfQotJSUKLSJOQU1FIiAJCXsgcmV0dXJuIE5BTUU7fQotIkxJQlJBUlkiCXsgcmV0dXJuIExJQlJBUlk7fQotIkRFU0NSSVBUSU9OIiAJeyByZXR1cm4gREVTQ1JJUFRJT047fQotIlNUQUNLU0laRSIJeyByZXR1cm4gU1RBQ0tTSVpFO30KLSJIRUFQU0laRSIgCXsgcmV0dXJuIEhFQVBTSVpFO30KLSJDT0RFIiAJCXsgcmV0dXJuIENPREU7fQotIkRBVEEiCQl7IHJldHVybiBEQVRBO30KLSJTRUNUSU9OUyIJeyByZXR1cm4gU0VDVElPTlM7fQotIkVYUE9SVFMiCXsgcmV0dXJuIEVYUE9SVFM7fQotIklNUE9SVFMiCXsgcmV0dXJuIElNUE9SVFM7fQotIlZFUlNJT04iCXsgcmV0dXJuIFZFUlNJT05LO30KLSJCQVNFIgkJeyByZXR1cm4gQkFTRTt9Ci0iQ09OU1RBTlQiCXsgcmV0dXJuIENPTlNUQU5UOyB9Ci0iTk9OQU1FIgl7IHJldHVybiBOT05BTUU7IH0KLSJSRUFEIgkJeyByZXR1cm4gUkVBRDt9Ci0iV1JJVEUiCQl7IHJldHVybiBXUklURTt9Ci0iRVhFQ1VURSIJeyByZXR1cm4gRVhFQ1VURTt9Ci0iU0hBUkVEIgl7IHJldHVybiBTSEFSRUQ7fQotIk5PTlNIQVJFRCIJeyByZXR1cm4gTk9OU0hBUkVEO30KLSJTSU5HTEUiCXsgcmV0dXJuIFNJTkdMRTt9Ci0iTVVMVElQTEUiCXsgcmV0dXJuIE1VTFRJUExFO30KLSJJTklUSU5TVEFOQ0UiCXsgcmV0dXJuIElOSVRJTlNUQU5DRTt9Ci0iSU5JVEdMT0JBTCIJeyByZXR1cm4gSU5JVEdMT0JBTDt9Ci0iVEVSTUlOU1RBTkNFIgl7IHJldHVybiBURVJNSU5TVEFOQ0U7fQotIlRFUk1HTE9CQUwiCXsgcmV0dXJuIFRFUk1HTE9CQUw7fQotCi1bMC05XVt4MC05QS1GYS1mXSogeyB5eWx2YWwubnVtYmVyID0gc3RydG9sICh5eXRleHQsMCwwKTsgCi0JCXJldHVybiBOVU1CRVI7IH0KLQotW0EtWmEteiQ6XC1cXz9dW0EtWmEtejAtOS8kOlwtXF9AP10qIHsgCQotCQl5eWx2YWwuaWQgPSAgeHN0cmR1cCAoeXl0ZXh0KTsKLQkJcmV0dXJuIElEOwotCQl9Ci0KLSJcIiJbXlwiXSoiXCIiIHsKLQkJeXlsdmFsLmlkID0geHN0cmR1cCAoeXl0ZXh0KzEpOwotCQl5eWx2YWwuaWRbeXlsZW5nLTJdID0gMDsKLQkJcmV0dXJuIElEOwotCQl9Ci0KLSJcJyJbXlwnXSoiXCciIHsKLQkJeXlsdmFsLmlkID0geHN0cmR1cCAoeXl0ZXh0KzEpOwotCQl5eWx2YWwuaWRbeXlsZW5nLTJdID0gMDsKLQkJcmV0dXJuIElEOwotCQl9Ci0iKiIuKiAJCXsgfQotIjsiLiogCQl7IH0KLSIgIgkJeyB9Ci0iXHQiCQl7IH0KLSJcbiIJIAl7IGxpbmVudW1iZXIgKysgO30KLSI9IiAJCXsgcmV0dXJuICc9Jzt9Ci0iLiIgCQl7IHJldHVybiAnLic7fQotIkAiCSAJeyByZXR1cm4gJ0AnO30KLSIsIgkJeyByZXR1cm4gJywnO30KLSUlCi0jaWZuZGVmIHl5d3JhcAotLyogTmVlZGVkIGZvciBsZXgsIHRob3VnaCBub3QgZmxleC4gKi8KLWludCB5eXdyYXAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlZnBhcnNlLnkgYi9iaW51dGlscy9kZWZwYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzE4ZDQ2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlZnBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotJXsgLyogZGVmcGFyc2UueSAtIHBhcnNlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiZGxsdG9vbC5oIgotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqaWQ7Ci0gIGludCBudW1iZXI7Ci19OwotCi0ldG9rZW4gTkFNRSwgTElCUkFSWSwgREVTQ1JJUFRJT04sIFNUQUNLU0laRSwgSEVBUFNJWkUsIENPREUsIERBVEEKLSV0b2tlbiBTRUNUSU9OUywgRVhQT1JUUywgSU1QT1JUUywgVkVSU0lPTkssIEJBU0UsIENPTlNUQU5UCi0ldG9rZW4gUkVBRCBXUklURSBFWEVDVVRFIFNIQVJFRCBOT05TSEFSRUQgTk9OQU1FCi0ldG9rZW4gU0lOR0xFIE1VTFRJUExFIElOSVRJTlNUQU5DRSBJTklUR0xPQkFMIFRFUk1JTlNUQU5DRSBURVJNR0xPQkFMCi0ldG9rZW4gPGlkPiBJRAotJXRva2VuIDxudW1iZXI+IE5VTUJFUgotJXR5cGUgIDxudW1iZXI+IG9wdF9iYXNlIG9wdF9vcmRpbmFsIG9wdF9OT05BTUUgb3B0X0NPTlNUQU5UIG9wdF9EQVRBCi0ldHlwZSAgPG51bWJlcj4gYXR0ciBhdHRyX2xpc3Qgb3B0X251bWJlcgotJXR5cGUgIDxpZD4gb3B0X25hbWUgb3B0X2VxdWFsX25hbWUgCi0KLSUlCi0KLXN0YXJ0OiBzdGFydCBjb21tYW5kCi0JfCBjb21tYW5kCi0JOwotCi1jb21tYW5kOiAKLQkJTkFNRSBvcHRfbmFtZSBvcHRfYmFzZSB7IGRlZl9uYW1lICgkMiwgJDMpOyB9Ci0JfAlMSUJSQVJZIG9wdF9uYW1lIG9wdF9iYXNlIG9wdGlvbl9saXN0IHsgZGVmX2xpYnJhcnkgKCQyLCAkMyk7IH0KLQl8CUVYUE9SVFMgZXhwbGlzdCAKLQl8CURFU0NSSVBUSU9OIElEIHsgZGVmX2Rlc2NyaXB0aW9uICgkMik7fQotCXwJU1RBQ0tTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX3N0YWNrc2l6ZSAoJDIsICQzKTt9Ci0JfAlIRUFQU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9oZWFwc2l6ZSAoJDIsICQzKTt9Ci0JfAlDT0RFIGF0dHJfbGlzdCB7IGRlZl9jb2RlICgkMik7fQotCXwJREFUQSBhdHRyX2xpc3QgIHsgZGVmX2RhdGEgKCQyKTt9Ci0JfAlTRUNUSU9OUyBzZWNsaXN0Ci0JfAlJTVBPUlRTIGltcGxpc3QKLQl8CVZFUlNJT05LIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwwKTt9Ci0JfAlWRVJTSU9OSyBOVU1CRVIgJy4nIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwkNCk7fQotCTsKLQotCi1leHBsaXN0OgotCQkvKiBFTVBUWSAqLwotCXwJZXhwbGlzdCBleHBsaW5lCi0JOwotCi1leHBsaW5lOgotCQlJRCBvcHRfZXF1YWxfbmFtZSBvcHRfb3JkaW5hbCBvcHRfTk9OQU1FIG9wdF9DT05TVEFOVCBvcHRfREFUQQotCQkJeyBkZWZfZXhwb3J0cyAoJDEsICQyLCAkMywgJDQsICQ1LCAkNik7fQotCTsKLWltcGxpc3Q6CQotCQlpbXBsaXN0IGltcGxpbmUKLQl8CWltcGxpbmUKLQk7Ci0KLWltcGxpbmU6Ci0gICAgICAgICAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBJRCAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywkNSwkNywgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgSUQgJy4nIE5VTUJFUiB7IGRlZl9pbXBvcnQgKCQxLCQzLCQ1LCAwLCQ3KTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsJDMsIDAsJDUsIDApOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywgMCwgMCwkNSk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBJRCAnLicgSUQgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCQzLCQ1LCAwKTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIElEICcuJyBOVU1CRVIgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsJDEsJDMsIDAsJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgICAgICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwgMCwkMywgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBOVU1CRVIgICAgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCAwLCAwLCQzKTsgfQotOwotCi1zZWNsaXN0OgotCQlzZWNsaXN0IHNlY2xpbmUKLQl8CXNlY2xpbmUKLQk7Ci0KLXNlY2xpbmU6Ci0JSUQgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCQxLCQyKTt9Ci0JOwotCi1hdHRyX2xpc3Q6Ci0JYXR0cl9saXN0IG9wdF9jb21tYSBhdHRyCi0JfCBhdHRyCi0JOwotCi1vcHRfY29tbWE6Ci0JJywnCi0JfCAKLQk7Ci1vcHRfbnVtYmVyOiAnLCcgTlVNQkVSIHsgJCQ9JDI7fQotCXwJICAgeyAkJD0tMTt9Ci0JOwotCQotYXR0cjoKLQkJUkVBRCB7ICQkID0gMTsgfQotCXwJV1JJVEUgeyAkJCA9IDI7IH0KLQl8CUVYRUNVVEUgeyAkJCA9IDQ7IH0KLQl8CVNIQVJFRCB7ICQkID0gODsgfQotCXwJTk9OU0hBUkVEIHsgJCQgPSAwOyB9Ci0JfAlTSU5HTEUgeyAkJCA9IDA7IH0KLQl8CU1VTFRJUExFIHsgJCQgPSAwOyB9Ci0JOwotCi1vcHRfQ09OU1RBTlQ6Ci0JCUNPTlNUQU5UIHskJD0xO30KLQl8CQkgeyQkPTA7fQotCTsKLQotb3B0X05PTkFNRToKLQkJTk9OQU1FIHskJD0xO30KLQl8CQkgeyQkPTA7fQotCTsKLQotb3B0X0RBVEE6Ci0JCURBVEEgeyAkJCA9IDE7IH0KLQl8CSAgICAgeyAkJCA9IDA7IH0KLQk7Ci0KLW9wdF9uYW1lOiBJRAkJeyAkJCA9JDE7IH0KLQl8IElEICcuJyBJRAkKLQkgIHsgCi0JICAgIGNoYXIgKm5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKCQxKSArIDEgKyBzdHJsZW4gKCQzKSArIDEpOwotCSAgICBzcHJpbnRmIChuYW1lLCAiJXMuJXMiLCAkMSwgJDMpOwotCSAgICAkJCA9IG5hbWU7Ci0JICB9Ci0JfAkJeyAkJD0iIjsgfQotCTsKLQotb3B0X29yZGluYWw6IAotCSAgJ0AnIE5VTUJFUiAgICAgeyAkJD0kMjt9Ci0JfCAgICAgICAgICAgICAgICB7ICQkPS0xO30KLQk7Ci0KLW9wdF9lcXVhbF9uYW1lOgotICAgICAgICAgICc9JyBJRAl7ICQkID0gJDI7IH0KLSAgICAgICAgfCAJCXsgJCQgPSAgMDsgfQkJCSAKLQk7Ci0KLW9wdF9iYXNlOiBCQVNFCSc9JyBOVU1CRVIJeyAkJD0gJDM7fQotCXwJeyAkJD0tMTt9Ci0JOwotCi1vcHRpb25fbGlzdDoKLQkJLyogZW1wdHkgKi8KLQl8CW9wdGlvbl9saXN0IG9wdF9jb21tYSBvcHRpb24KLQk7Ci0KLW9wdGlvbjoKLQkJSU5JVElOU1RBTkNFCi0JfAlJTklUR0xPQkFMCi0JfAlURVJNSU5TVEFOQ0UKLQl8CVRFUk1HTE9CQUwKLQk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9kZXAtaW4uc2VkIGIvYmludXRpbHMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxOTIxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC8hIWcKLXMhQE9CSkRJUkAvISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx0b29sLmMgYi9iaW51dGlscy9kbGx0b29sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGEyNmMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsdG9vbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU2NSArMCwwIEBACi0vKiBkbGx0b29sLmMgLS0gdG9vbCB0byBnZW5lcmF0ZSBzdHVmZiBmb3IgUEUgc3R5bGUgRExMcwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0gICBUaGlzIHByb2dyYW0gYWxsb3dzIHlvdSB0byBidWlsZCB0aGUgZmlsZXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZQotICAgRExMcyB0byBydW4gb24gYSBzeXN0ZW0gd2hpY2ggdW5kZXJzdGFuZHMgUEUgZm9ybWF0IGltYWdlIGZpbGVzLgotICAgKGVnLCBXaW5kb3dzIE5UKQotCi0gICBTZWUgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgIEFsc28gc2VlICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZSBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdCwKLSAgIFNwZWNpZmljYXRpb24gNC4xIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgQSBETEwgY29udGFpbnMgYW4gZXhwb3J0IHRhYmxlIHdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbgotICAgd2hpY2ggdGhlIHJ1bnRpbWUgbG9hZGVyIG5lZWRzIHRvIHRpZSB1cCByZWZlcmVuY2VzIGZyb20gYQotICAgcmVmZXJlbmNpbmcgcHJvZ3JhbS4KLQotICAgVGhlIGV4cG9ydCB0YWJsZSBpcyBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtIGJ5IHJlYWRpbmcKLSAgIGluIGEgLkRFRiBmaWxlIG9yIHNjYW5uaW5nIHRoZSAuYSBhbmQgLm8gZmlsZXMgd2hpY2ggd2lsbCBiZSBpbiB0aGUKLSAgIERMTC4gIEEgLm8gZmlsZSBjYW4gY29udGFpbiBpbmZvcm1hdGlvbiBpbiBzcGVjaWFsICAiLmRyZWN0dmUiIHNlY3Rpb25zCi0gICB3aXRoIGV4cG9ydCBpbmZvcm1hdGlvbi4KLQotICAgQSBERUYgZmlsZSBjb250YWlucyBhbnkgbnVtYmVyIG9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6Ci0KLQotICAgTkFNRSA8bmFtZT4gWyAsIDxiYXNlPiBdCi0gICBUaGUgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIDxuYW1lPi5FWEUKLQotICAgTElCUkFSWSA8bmFtZT4gWyAsIDxiYXNlPiBdCi0gICBUaGUgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIDxuYW1lPi5ETEwKLQotICAgRVhQT1JUUyAgKCA8bmFtZTE+IFsgPSA8bmFtZTI+IF0gWyBAIDxpbnRlZ2VyPiBdIFsgTk9OQU1FIF0gW0NPTlNUQU5UXSBbREFUQV0gKSAqCi0gICBEZWNsYXJlcyBuYW1lMSBhcyBhbiBleHBvcnRlZCBzeW1ib2wgZnJvbSB0aGUKLSAgIERMTCwgd2l0aCBvcHRpb25hbCBvcmRpbmFsIG51bWJlciA8aW50ZWdlcj4KLQotICAgSU1QT1JUUyAgKCAgKCAgIDxpbnRlcm5hbC1uYW1lPiA9ICAgPG1vZHVsZS1uYW1lPiAuIDxpbnRlZ2VyPiApCi0gICAgICAgICAgICAgfCAoIFsgPGludGVybmFsLW5hbWU+ID0gXSA8bW9kdWxlLW5hbWU+IC4gPGV4dGVybmFsLW5hbWU+ICkpICoKLSAgIERlY2xhcmVzIHRoYXQgPGV4dGVybmFsLW5hbWU+IG9yIHRoZSBleHBvcnRlZCBmdW5jdGlvbiB3aG9lcyBvcmRpbmFsIG51bWJlcgotICAgaXMgPGludGVnZXI+IGlzIHRvIGJlIGltcG9ydGVkIGZyb20gdGhlIGZpbGUgPG1vZHVsZS1uYW1lPi4gIElmCi0gICA8aW50ZXJuYWwtbmFtZT4gaXMgc3BlY2lmaWVkIHRoZW4gdGhpcyBpcyB0aGUgbmFtZSB0aGF0IHRoZSBpbXBvcnRlZAotICAgZnVuY3Rpb24gd2lsbCBiZSByZWZlcmVkIHRvIGluIHRoZSBib2R5IG9mIHRoZSBETEwuCi0KLSAgIERFU0NSSVBUSU9OIDxzdHJpbmc+Ci0gICBQdXRzIDxzdHJpbmc+IGludG8gb3V0cHV0IC5leHAgZmlsZSBpbiB0aGUgLnJkYXRhIHNlY3Rpb24KLQotICAgW1NUQUNLU0laRXxIRUFQU0laRV0gPG51bWJlci1yZXNlcnZlPiBbICwgPG51bWJlci1jb21taXQ+IF0KLSAgIEdlbmVyYXRlcyAtLXN0YWNrfC0taGVhcCA8bnVtYmVyLXJlc2VydmU+LDxudW1iZXItY29tbWl0PgotICAgaW4gdGhlIG91dHB1dCAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGxpbmtlciB3aWxsCi0gICBzZWUgdGhpcyBhbmQgYWN0IHVwb24gaXQuCi0KLSAgIFtDT0RFfERBVEFdIDxhdHRyPisKLSAgIFNFQ1RJT05TICggPHNlY3Rpb25uYW1lPiA8YXR0cj4rICkqCi0gICA8YXR0cj4gPSBSRUFEIHwgV1JJVEUgfCBFWEVDVVRFIHwgU0hBUkVECi0gICBHZW5lcmF0ZXMgLS1hdHRyIDxzZWN0aW9ubmFtZT4gPGF0dHI+IGluIHRoZSBvdXRwdXQKLSAgIC5kcmVjdHZlIHNlY3Rpb24uICBUaGUgbGlua2VyIHdpbGwgc2VlIHRoaXMgYW5kIGFjdAotICAgdXBvbiBpdC4KLQotCi0gICBBIC1leHBvcnQ6PG5hbWU+IGluIGEgLmRyZWN0dmUgc2VjdGlvbiBpbiBhbiBpbnB1dCAubyBvciAuYQotICAgZmlsZSB0byB0aGlzIHByb2dyYW0gaXMgZXF1aXZhbGVudCB0byBhIEVYUE9SVFMgPG5hbWU+Ci0gICBpbiBhIC5ERUYgZmlsZS4KLQotCi0KLSAgIFRoZSBwcm9ncmFtIGdlbmVyYXRlcyBvdXRwdXQgZmlsZXMgd2l0aCB0aGUgcHJlZml4IHN1cHBsaWVkCi0gICBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciBpbiB0aGUgZGVmIGZpbGUsIG9yIHRha2VuIGZyb20gdGhlIGZpcnN0Ci0gICBzdXBwbGllZCBhcmd1bWVudC4KLQotICAgVGhlIC5leHAucyBmaWxlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZXhwb3J0Ci0gICB0aGUgcm91dGluZXMgaW4gdGhlIERMTC4gIFRoZSAubGliLnMgZmlsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KLSAgIG5lY2Vzc2FyeSB0byB1c2UgdGhlIERMTCdzIHJvdXRpbmVzIGZyb20gYSByZWZlcmVuY2luZyBwcm9ncmFtLgotCi0KLQotICAgRXhhbXBsZToKLQotIGZpbGUxLmM6Ci0gICBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZSIpOwotICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDphZGVmXCIiKTsKLQotICAgdm9pZCBhZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsICVzXG4iLCBzKTsKLSAgIH0KLQotICAgdm9pZCBiZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsIGFuZCB0aGUgb3RoZXIgZW50cnkgcG9pbnQgJXNcbiIsIHMpOwotICAgfQotCi0gZmlsZTIuYzoKLSAgIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlIik7Ci0gICBhc20gKCIuYXNjaWkgXCItZXhwb3J0OmNkZWZcIiIpOwotICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpkZGVmXCIiKTsKLSAgIAotICAgdm9pZCBjZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsICVzXG4iLCBzKTsKLSAgIH0KLQotICAgdm9pZCBkZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsIGFuZCB0aGUgb3RoZXIgZW50cnkgcG9pbnQgJXNcbiIsIHMpOwotICAgfQotCi0gICBpbnQgcHJpbnRmICh2b2lkKQotICAgewotICAgICByZXR1cm4gOTsKLSAgIH0KLQotIHRoZW1haW4uYzoKLSAgIGludCBtYWluICh2b2lkKQotICAgewotICAgICBjZGVmICgpOwotICAgICByZXR1cm4gMDsKLSAgIH0KLQotIHRoZWRsbC5kZWYKLQotICAgTElCUkFSWSB0aGVkbGwKLSAgIEhFQVBTSVpFIDB4NDAwMDAsIDB4MjAwMAotICAgRVhQT1JUUyBiZGVmIEAgMjAKLSAgICAgICAgICAgY2RlZiBAIDMwIE5PTkFNRQotCi0gICBTRUNUSU9OUyBkb25rZXkgUkVBRCBXUklURQotICAgYWFyZHZhcmsgRVhFQ1VURQotCi0gIyBjb21waWxlIHVwIHRoZSBwYXJ0cyBvZiB0aGUgZGxsCi0KLSAgIGdjYyAtYyBmaWxlMS5jCi0gICBnY2MgLWMgZmlsZTIuYwotCi0gIyBwdXQgdGhlbSBpbiBhIGxpYnJhcnkgKHlvdSBkb24ndCBoYXZlIHRvLCB5b3UKLSAjIGNvdWxkIG5hbWUgYWxsIHRoZSAub3Mgb24gdGhlIGRsbHRvb2wgbGluZSkKLQotICAgYXIgIHFjdiB0aGVkbGwuaW4gZmlsZTEubyBmaWxlMi5vCi0gICByYW5saWIgdGhlZGxsLmluCi0KLSAjIHJ1biB0aGlzIHRvb2wgb3ZlciB0aGUgbGlicmFyeSBhbmQgdGhlIGRlZiBmaWxlCi0gICAuL2RsbHRvb2wgLS1kZWYgdGhlZGxsLmRlZiAtLW91dHB1dC1leHAgdGhlZGxsLm8gLS1vdXRwdXQtbGliIHRoZWRsbC5hCi0KLSAjIGJ1aWxkIHRoZSBkbGwgd2l0aCB0aGUgbGlicmFyeSB3aXRoIGZpbGUxLm8sIGZpbGUyLm8gYW5kIHRoZSBleHBvcnQgdGFibGUKLSAgIGxkIC1vIHRoZWRsbC5kbGwgdGhlZGxsLm8gdGhlZGxsLmluCi0KLSAjIGJ1aWxkIHRoZSBtYWlubGluZQotICAgZ2NjIC1jIHRoZW1haW4uYwotCi0gIyBsaW5rIHRoZSBleGVjdXRhYmxlIHdpdGggdGhlIGltcG9ydCBsaWJyYXJ5Ci0gICBnY2MgLW8gdGhlbWFpbi5leGUgdGhlbWFpbi5vIHRoZWRsbC5hCi0KLSAqLwotCi0vKiAuaWRhdGEgc2VjdGlvbiBkZXNjcmlwdGlvbgotCi0gICBUaGUgLmlkYXRhIHNlY3Rpb24gaXMgdGhlIGltcG9ydCB0YWJsZS4gIEl0IGlzIGEgY29sbGVjdGlvbiBvZiBzZXZlcmFsCi0gICBzdWJzZWN0aW9ucyB1c2VkIHRvIGtlZXAgdGhlIHBpZWNlcyBmb3IgZWFjaCBkbGwgdG9nZXRoZXI6IC5pZGF0YSRbMjM0NTY3XS4KLSAgIElFOiBFYWNoIGRsbCdzIC5pZGF0YSQyJ3MgYXJlIGNhdGVuYXRlZCB0b2dldGhlciwgZWFjaCAuaWRhdGEkMydzLCBldGMuCi0KLSAgIC5pZGF0YSQyID0gSW1wb3J0IERpcmVjdG9yeSBUYWJsZQotICAgPSBhcnJheSBvZiBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUidzLgotCi0JRFdPUkQgICBJbXBvcnQgTG9va3VwIFRhYmxlOyAgLSBwb2ludGVyIHRvIC5pZGF0YSQ0Ci0JRFdPUkQgICBUaW1lRGF0ZVN0YW1wOyAgICAgICAgLSBjdXJyZW50bHkgYWx3YXlzIDAKLQlEV09SRCAgIEZvcndhcmRlckNoYWluOyAgICAgICAtIGN1cnJlbnRseSBhbHdheXMgMAotCURXT1JEICAgTmFtZTsgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBkbGwncyBuYW1lCi0JUElNQUdFX1RIVU5LX0RBVEEgRmlyc3RUaHVuazsgLSBwb2ludGVyIHRvIC5pZGF0YSQ1Ci0KLSAgIC5pZGF0YSQzID0gbnVsbCB0ZXJtaW5hdGluZyBlbnRyeSBmb3IgLmlkYXRhJDIuCi0KLSAgIC5pZGF0YSQ0ID0gSW1wb3J0IExvb2t1cCBUYWJsZQotICAgPSBhcnJheSBvZiBhcnJheSBvZiBwb2ludGVycyB0byBoaW50IG5hbWUgdGFibGUuCi0gICBUaGVyZSBpcyBvbmUgZm9yIGVhY2ggZGxsIGJlaW5nIGltcG9ydGVkIGZyb20sIGFuZCBlYWNoIGRsbCdzIHNldCBpcwotICAgdGVybWluYXRlZCBieSBhIHRyYWlsaW5nIE5VTEwuCi0KLSAgIC5pZGF0YSQ1ID0gSW1wb3J0IEFkZHJlc3MgVGFibGUKLSAgID0gYXJyYXkgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGludCBuYW1lIHRhYmxlLgotICAgVGhlcmUgaXMgb25lIGZvciBlYWNoIGRsbCBiZWluZyBpbXBvcnRlZCBmcm9tLCBhbmQgZWFjaCBkbGwncyBzZXQgaXMKLSAgIHRlcm1pbmF0ZWQgYnkgYSB0cmFpbGluZyBOVUxMLgotICAgSW5pdGlhbGx5LCB0aGlzIHRhYmxlIGlzIGlkZW50aWNhbCB0byB0aGUgSW1wb3J0IExvb2t1cCBUYWJsZS4gIEhvd2V2ZXIsCi0gICBhdCBsb2FkIHRpbWUsIHRoZSBsb2FkZXIgb3ZlcndyaXRlcyB0aGUgZW50cmllcyB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgZnVuY3Rpb24uCi0KLSAgIC5pZGF0YSQ2ID0gSGludCBOYW1lIFRhYmxlCi0gICA9IEFycmF5IG9mIHsgc2hvcnQsIGFzY2l6IH0gZW50cmllcywgb25lIGZvciBlYWNoIGltcG9ydGVkIGZ1bmN0aW9uLgotICAgVGhlIGBzaG9ydCcgaXMgdGhlIGZ1bmN0aW9uJ3Mgb3JkaW5hbCBudW1iZXIuCi0KLSAgIC5pZGF0YSQ3ID0gZGxsIG5hbWUgKGVnOiAia2VybmVsMzIuZGxsIikuICguaWRhdGEkNiBmb3IgcHBjKQotKi8KLQotLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KLSNpZm5kZWYgX19HTlVDX18KLSMgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIHNob3dfYWxsbmFtZXMgMAotCi0jZGVmaW5lIFBBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFBBR0VfTUFTSyAoLVBBR0VfU0laRSkKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLSNpbmNsdWRlICJkbGx0b29sLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSNpbmNsdWRlICJjb2ZmL2FybS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNlbmRpZgotCi0vKiBGb3J3YXJkIHJlZmVyZW5jZXMuICAqLwotc3RhdGljIGNoYXIgKmxvb2tfZm9yX3Byb2cgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGNoYXIgKmRlZHVjZV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9jYWNoZV9maWxlbmFtZSAoY2hhciAqKTsKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUgKHZvaWQpOwotI2VuZGlmCi0gICAgIAotI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jZWxzZSAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQodykJKCgodykmMDM3NykgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSYwMzc3KSAhPSAwMTc3ICYmICgodykmfjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDAxNzcpCi0jZW5kaWYKLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgPj4gOCkgJiAwMzc3KQotI2VuZGlmCi0jZWxzZSAvKiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSAqLwotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpICYgMHhmZikgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSAmIDB4ZmYpICE9IDAgJiYgKCh3KSAmIDB4ZmYpICE9IDB4N2YpCi0jZW5kaWYKLSNpZm5kZWYgV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDB4N2YpCi0jZW5kaWYKLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgJiAweGZmMDApID4+IDgpCi0jZW5kaWYKLSNlbmRpZiAvKiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSAqLwotI2VuZGlmIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCi0KLS8qIGlmdW5jIGFuZCBpaGVhZCBkYXRhIHN0cnVjdHVyZXM6IHR0a0BjeWdudXMuY29tIDE5OTcKLQotICAgV2hlbiBJTVBPUlQgZGVjbGFyYXRpb25zIGFyZSBlbmNvdW50ZXJlZCBpbiBhIC5kZWYgZmlsZSB0aGUKLSAgIGZ1bmN0aW9uIGltcG9ydCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieQotICAgdGhlIGdsb2JhbCB2YXJpYWJsZSBJTVBPUlRfTElTVC4gIFRoZSBzdHJ1Y3R1cmUgaXMgYSBsaW5rZWQgbGlzdAotICAgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGRsbCBmaWxlcyBlYWNoIGZ1bmN0aW9uIGlzIGltcG9ydGVkCi0gICBmcm9tIGFuZCBhIGxpbmtlZCBsaXN0IG9mIGZ1bmN0aW9ucyBiZWluZyBpbXBvcnRlZCBmcm9tIHRoYXQgZGxsCi0gICBmaWxlLiAgVGhpcyByb3VnaGx5IHBhcmFsbGVscyB0aGUgc3RydWN0dXJlIG9mIHRoZSAuaWRhdGEgc2VjdGlvbgotICAgaW4gdGhlIFBFIG9iamVjdCBmaWxlLgotCi0gICBUaGUgY29udGVudHMgb2YgLmRlZiBmaWxlIGFyZSBpbnRlcnByZXRlZCBmcm9tIHdpdGhpbiB0aGUKLSAgIHByb2Nlc3NfZGVmX2ZpbGUgZnVuY3Rpb24uICBFdmVyeSB0aW1lIGFuIElNUE9SVCBkZWNsYXJhdGlvbiBpcwotICAgZW5jb3VudGVyZWQsIGl0IGlzIGJyb2tlbiB1cCBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMgYW5kIHBhc3NlZCB0bwotICAgZGVmX2ltcG9ydC4gIElNUE9SVF9MSVNUIGlzIGluaXRpYWxpemVkIHRvIE5VTEwgaW4gZnVuY3Rpb24gbWFpbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGlmdW5jdAotewotICBjaGFyICAgICAgICAgICpuYW1lOyAgIC8qIG5hbWUgb2YgZnVuY3Rpb24gYmVpbmcgaW1wb3J0ZWQgKi8KLSAgaW50ICAgICAgICAgICAgb3JkOyAgICAvKiB0d28tYnl0ZSBvcmRpbmFsIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBmdW5jdGlvbiAqLwotICBzdHJ1Y3QgaWZ1bmN0ICpuZXh0OwotfSBpZnVuY3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGloZWFkdAotewotICBjaGFyICAgICAgICAgICpkbGxuYW1lOyAgLyogbmFtZSBvZiBkbGwgZmlsZSBpbXBvcnRlZCBmcm9tICovCi0gIGxvbmcgICAgICAgICAgIG5mdW5jczsgICAvKiBudW1iZXIgb2YgZnVuY3Rpb25zIGluIGxpc3QgKi8KLSAgc3RydWN0IGlmdW5jdCAqZnVuY2hlYWQ7IC8qIGZpcnN0IGZ1bmN0aW9uIGluIGxpc3QgKi8KLSAgc3RydWN0IGlmdW5jdCAqZnVuY3RhaWw7IC8qIGxhc3QgIGZ1bmN0aW9uIGluIGxpc3QgKi8KLSAgc3RydWN0IGloZWFkdCAqbmV4dDsgICAgIC8qIG5leHQgZGxsIGZpbGUgaW4gbGlzdCAqLwotfSBpaGVhZHR5cGU7Ci0KLS8qIFN0cnVjdHVyZSBjb250YWluaW5nIGFsbCBpbXBvcnQgaW5mb3JtYXRpb24gYXMgZGVmaW5lZCBpbiAuZGVmIGZpbGUKLSAgIChxdiAiaWhlYWQgc3RydWN0dXJlIikuICAqLwotCi1zdGF0aWMgaWhlYWR0eXBlICppbXBvcnRfbGlzdCA9IE5VTEw7Ci0KLXN0YXRpYyBjaGFyICphc19uYW1lID0gTlVMTDsKLXN0YXRpYyBjaGFyICogYXNfZmxhZ3MgPSAiIjsKLQotc3RhdGljIGludCBub19pZGF0YTQ7Ci1zdGF0aWMgaW50IG5vX2lkYXRhNTsKLXN0YXRpYyBjaGFyICpleHBfbmFtZTsKLXN0YXRpYyBjaGFyICppbXBfbmFtZTsKLXN0YXRpYyBjaGFyICpoZWFkX2xhYmVsOwotc3RhdGljIGNoYXIgKmltcF9uYW1lX2xhYjsKLXN0YXRpYyBjaGFyICpkbGxfbmFtZTsKLQotc3RhdGljIGludCBhZGRfaW5kaXJlY3QgPSAwOwotc3RhdGljIGludCBhZGRfdW5kZXJzY29yZSA9IDA7Ci1zdGF0aWMgaW50IGRvbnRkZWx0ZW1wcyA9IDA7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGV4cG9ydCBhbGwgc3ltYm9scy4gIE90aGVyd2lzZSwgd2Ugb25seSBleHBvcnQKLSAgIHN5bWJvbHMgbGlzdGVkIGluIC5kcmVjdHZlIHNlY3Rpb25zIG9yIGluIHRoZSBkZWYgZmlsZS4gICovCi1zdGF0aWMgYm9vbGVhbiBleHBvcnRfYWxsX3N5bWJvbHM7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgaW4gREVGQVVMVF9FWENMVURFUyB3aGVuCi0gICBleHBvcnRpbmcgYWxsIHN5bWJvbHMuICAqLwotc3RhdGljIGJvb2xlYW4gZG9fZGVmYXVsdF9leGNsdWRlczsKLQotLyogRGVmYXVsdCBzeW1ib2xzIHRvIGV4Y2x1ZGUgd2hlbiBleHBvcnRpbmcgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X2V4Y2x1ZGVzID0gIkRsbE1haW5AMTIsRGxsRW50cnlQb2ludEAwLGltcHVyZV9wdHIiOwotCi1zdGF0aWMgY2hhciAqZGVmX2ZpbGU7Ci0KLWV4dGVybiBjaGFyICogcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgaW50IG1hY2hpbmU7Ci1zdGF0aWMgaW50IGtpbGxhdDsKLXN0YXRpYyBpbnQgYWRkX3N0ZGNhbGxfYWxpYXM7Ci1zdGF0aWMgaW50IHZlcmJvc2U7Ci1zdGF0aWMgRklMRSAqb3V0cHV0X2RlZjsKLXN0YXRpYyBGSUxFICpiYXNlX2ZpbGU7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gImFybSI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfSTM4Ngotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gImkzODYiOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX1BQQwotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gInBwYyI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfTUNPUkUKLXN0YXRpYyBjb25zdCBjaGFyICogbW5hbWUgPSAibWNvcmUiOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotc3RhdGljIGNvbnN0IGNoYXIgKiBtbmFtZSA9ICJtY29yZS1lbGYiOwotc3RhdGljIGNoYXIgKiBtY29yZV9lbGZfb3V0X2ZpbGUgPSBOVUxMOwotc3RhdGljIGNoYXIgKiBtY29yZV9lbGZfbGlua2VyICAgPSBOVUxMOwotc3RhdGljIGNoYXIgKiBtY29yZV9lbGZfbGlua2VyX2ZsYWdzID0gTlVMTDsKLQotI2RlZmluZSBEUkVDVFZFX1NFQ1RJT05fTkFNRSAoKG1hY2hpbmUgPT0gTU1DT1JFX0VMRiB8fCBtYWNoaW5lID09IE1NQ09SRV9FTEZfTEUpID8gIi5leHBvcnRzIiA6ICIuZHJlY3R2ZSIpCi0jZW5kaWYKLQotI2lmbmRlZiBEUkVDVFZFX1NFQ1RJT05fTkFNRQotI2RlZmluZSBEUkVDVFZFX1NFQ1RJT05fTkFNRSAiLmRyZWN0dmUiCi0jZW5kaWYKLQotI2RlZmluZSBQQVRITUFYIDI1MAkJLyogV2hhdCdzIHRoZSByaWdodCBuYW1lIGZvciB0aGlzID8gKi8KLQotI2RlZmluZSBUTVBfQVNNCQkiZGMucyIKLSNkZWZpbmUgVE1QX0hFQURfUwkiZGgucyIKLSNkZWZpbmUgVE1QX0hFQURfTwkiZGgubyIKLSNkZWZpbmUgVE1QX1RBSUxfUwkiZHQucyIKLSNkZWZpbmUgVE1QX1RBSUxfTwkiZHQubyIKLSNkZWZpbmUgVE1QX1NUVUIJImRzIgotCi0vKiBUaGlzIGJpdCBvZiBhc3NlbWx5IGRvZXMgam1wICogLi4uLiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaTM4Nl9qdGFiW10gPQotewotICAweGZmLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDkwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhcm1fanRhYltdID0KLXsKLSAgMHgwMCwgMHhjMCwgMHg5ZiwgMHhlNSwJLyogbGRyICBpcCwgW3BjXSAqLwotICAweDAwLCAweGYwLCAweDljLCAweGU1LAkvKiBsZHIgIHBjLCBbaXBdICovCi0gIDAsICAgIDAsICAgIDAsICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFybV9pbnRlcndvcmtfanRhYltdID0KLXsKLSAgMHgwNCwgMHhjMCwgMHg5ZiwgMHhlNSwJLyogbGRyICBpcCwgW3BjXSAqLwotICAweDAwLCAweGMwLCAweDljLCAweGU1LAkvKiBsZHIgIGlwLCBbaXBdICovCi0gIDB4MWMsIDB4ZmYsIDB4MmYsIDB4ZTEsCS8qIGJ4ICAgaXAgICAgICAgKi8KLSAgMCwgICAgMCwgICAgMCwgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGh1bWJfanRhYltdID0KLXsKLSAgMHg0MCwgMHhiNCwgICAgICAgICAgIC8qIHB1c2gge3I2fSAgICAgICAgICovCi0gIDB4MDIsIDB4NGUsICAgICAgICAgICAvKiBsZHIgIHI2LCBbcGMsICM4XSAqLwotICAweDM2LCAweDY4LCAgICAgICAgICAgLyogbGRyICByNiwgW3I2XSAgICAgKi8KLSAgMHhiNCwgMHg0NiwgICAgICAgICAgIC8qIG1vdiAgaXAsIHI2ICAgICAgICovCi0gIDB4NDAsIDB4YmMsICAgICAgICAgICAvKiBwb3AgIHtyNn0gICAgICAgICAqLwotICAweDYwLCAweDQ3LCAgICAgICAgICAgLyogYnggICBpcCAgICAgICAgICAgKi8KLSAgMCwgICAgMCwgICAgMCwgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWNvcmVfYmVfanRhYltdID0KLXsKLSAgMHg3MCwgMHgwMSwgICAgICAgICAgICAvKiBqbXBpIDEgICAgICovCi0gIDB4MTIsIDB4MTEsICAgICAgICAgICAgLyogbm9wICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgLyogPGFkZHJlc3M+ICAqLyAgCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtY29yZV9sZV9qdGFiW10gPQotewotICAweDAxLCAweDcwLCAgICAgICAgICAgIC8qIGptcGkgMSAgICAgKi8KLSAgMHgxMSwgMHgxMiwgICAgICAgICAgICAvKiBub3AgKi8KLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAvKiA8YWRkcmVzcz4gICovICAKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGdsdWUgc2VxdWVuY2UgZm9yIFBvd2VyUEMgUEUuIFRoZXJlIGlzIGEgICovCi0vKiB0b2NyZWwxNi10b2NkZWZuIHJlbG9jIGFnYWluc3QgdGhlIGZpcnN0IGluc3RydWN0aW9uLiAqLwotLyogV2UgYWxzbyBuZWVkIGEgSU1HTFVFIHJlbG9jIGFnYWluc3QgdGhlIGdsdWUgZnVuY3Rpb24gKi8KLS8qIHRvIHJlc3RvcmUgdGhlIHRvYyBzYXZlZCBieSB0aGUgdGhpcmQgaW5zdHJ1Y3Rpb24gaW4gICovCi0vKiB0aGUgZ2x1ZS4gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBwY19qdGFiW10gPQotewotICAweDAwLCAweDAwLCAweDYyLCAweDgxLCAvKiBsd3ogcjExLDAocjIpICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBSZWxvYyBUT0NSRUwxNiBfX2ltcF94eHggICovCi0gIDB4MDAsIDB4MDAsIDB4OEIsIDB4ODEsIC8qIGx3eiByMTIsMChyMTEpICAgICAgICAgICAgICAqLwotICAweDA0LCAweDAwLCAweDQxLCAweDkwLCAvKiBzdHcgcjIsNChyMSkgICAgICAgICAgICAgICAgKi8KLSAgMHhBNiwgMHgwMywgMHg4OSwgMHg3RCwgLyogbXRjdHIgcjEyICAgICAgICAgICAgICAgICAgICovCi0gIDB4MDQsIDB4MDAsIDB4NEIsIDB4ODAsIC8qIGx3eiByMiw0KHIxMSkgICAgICAgICAgICAgICAqLwotICAweDIwLCAweDA0LCAweDgwLCAweDRFICAvKiBiY3RyICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLSNpZmRlZiBETExUT09MX1BQQwotLyogdGhlIGdsdWUgaW5zdHJ1Y3Rpb24sIHBpY2tzIHVwIHRoZSB0b2MgZnJvbSB0aGUgc3R3IGluICovCi0vKiB0aGUgYWJvdmUgY29kZTogImx3eiByMiw0KHIxKSIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBiZmRfdm1hIHBwY19nbHVlX2luc24gPSAweDgwNDEwMDA0OwotI2VuZGlmCi0KLXN0cnVjdCBtYWMKLSAgewotICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci0gICAgY29uc3QgY2hhciAqaG93X2J5dGU7Ci0gICAgY29uc3QgY2hhciAqaG93X3Nob3J0OwotICAgIGNvbnN0IGNoYXIgKmhvd19sb25nOwotICAgIGNvbnN0IGNoYXIgKmhvd19hc2NpejsKLSAgICBjb25zdCBjaGFyICpob3dfY29tbWVudDsKLSAgICBjb25zdCBjaGFyICpob3dfanVtcDsKLSAgICBjb25zdCBjaGFyICpob3dfZ2xvYmFsOwotICAgIGNvbnN0IGNoYXIgKmhvd19zcGFjZTsKLSAgICBjb25zdCBjaGFyICpob3dfYWxpZ25fc2hvcnQ7Ci0gICAgY29uc3QgY2hhciAqaG93X2FsaWduX2xvbmc7Ci0gICAgY29uc3QgY2hhciAqaG93X2JmZF90YXJnZXQ7Ci0gICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGhvd19iZmRfYXJjaDsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpob3dfanRhYjsKLSAgICBpbnQgaG93X2p0YWJfc2l6ZTsgLyogc2l6ZSBvZiB0aGUganRhYiBlbnRyeSAqLwotICAgIGludCBob3dfanRhYl9yb2ZmOyAvKiBvZmZzZXQgaW50byBpdCBmb3IgdGhlIGluZCAzMiByZWxvYyBpbnRvIGlkYXRhIDUgKi8KLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtYWMKLW10YWJsZVtdID0KLXsKLSAgewotI2RlZmluZSBNQVJNIDAKLSAgICAiYXJtIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdHBjLFtpcF1cblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCJwZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAotICAgIGFybV9qdGFiLCBzaXplb2YgKGFybV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNMzg2IDEKLSAgICAiaTM4NiIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIiMiLCAiam1wICoiLCAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtaTM4NiIsYmZkX2FyY2hfaTM4NiwKLSAgIGkzODZfanRhYiwgc2l6ZW9mIChpMzg2X2p0YWIpLCAyCi0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1QUEMgMgotICAgICJwcGMiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIjIiwgImptcCAqIiwgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsInBlLXBvd2VycGNsZSIsYmZkX2FyY2hfcG93ZXJwYywKLSAgIHBwY19qdGFiLCBzaXplb2YgKHBwY19qdGFiKSwgMAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNVEhVTUIgMwotICAgICJ0aHVtYiIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIkAiLAotICAgICJwdXNoXHR7cjZ9XG5cdGxkclx0cjYsIFtwYywgIzhdXG5cdGxkclx0cjYsIFtyNl1cblx0bW92XHRpcCwgcjZcblx0cG9wXHR7cjZ9XG5cdGJ4XHRpcCIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsInBlLWFybS1saXR0bGUiLCBiZmRfYXJjaF9hcm0sCi0gICAgdGh1bWJfanRhYiwgc2l6ZW9mICh0aHVtYl9qdGFiKSwgMTIKLSAgfQotICAsCi0jZGVmaW5lIE1BUk1fSU5URVJXT1JLIDQKLSAgewotICAgICJhcm1faW50ZXJ3b3JrIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdGlwLFtpcF1cblx0YnhcdGlwXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtYXJtLWxpdHRsZSIsIGJmZF9hcmNoX2FybSwKLSAgICBhcm1faW50ZXJ3b3JrX2p0YWIsIHNpemVvZiAoYXJtX2ludGVyd29ya19qdGFiKSwgMTIKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTU1DT1JFX0JFIDUKLSAgICAibWNvcmUiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImptcGlcdDFcblx0bm9wXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtbWNvcmUtYmlnIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfYmVfanRhYiwgc2l6ZW9mIChtY29yZV9iZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfTEUgNgotICAgICJtY29yZS1sZSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIi8vIiwKLSAgICAiam1waVx0MVxuXHRub3Bcblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCJwZS1tY29yZS1saXR0bGUiLCBiZmRfYXJjaF9tY29yZSwKLSAgICBtY29yZV9sZV9qdGFiLCBzaXplb2YgKG1jb3JlX2xlX2p0YWIpLCA4Ci0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1NQ09SRV9FTEYgNwotICAgICJtY29yZS1lbGYiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImptcGlcdDFcblx0bm9wXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwiZWxmMzItbWNvcmUtYmlnIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfYmVfanRhYiwgc2l6ZW9mIChtY29yZV9iZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfRUxGX0xFIDgKLSAgICAibWNvcmUtZWxmLWxlIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiLy8iLAotICAgICJqbXBpXHQxXG5cdG5vcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsImVsZjMyLW1jb3JlLWxpdHRsZSIsIGJmZF9hcmNoX21jb3JlLAotICAgIG1jb3JlX2xlX2p0YWIsIHNpemVvZiAobWNvcmVfbGVfanRhYiksIDgKLSAgfQotICAsCi0geyAgICAwfQotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZGxpc3QKLXsKLSAgY2hhciAqdGV4dDsKLSAgc3RydWN0IGRsaXN0ICpuZXh0OwotfQotZGxpc3RfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgZXhwb3J0Ci0gIHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgaW50IG9yZGluYWw7Ci0gICAgaW50IGNvbnN0YW50OwotICAgIGludCBub25hbWU7Ci0gICAgaW50IGRhdGE7Ci0gICAgaW50IGhpbnQ7Ci0gICAgc3RydWN0IGV4cG9ydCAqbmV4dDsKLSAgfQotZXhwb3J0X3R5cGU7Ci0KLS8qIEEgbGlzdCBvZiBzeW1ib2xzIHdoaWNoIHdlIHNob3VsZCBub3QgZXhwb3J0LiAgKi8KLSAKLXN0cnVjdCBzdHJpbmdfbGlzdAotewotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKnN0cmluZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmV4Y2x1ZGVzOwotCi1zdGF0aWMgY29uc3QgY2hhciAqcnZhYWZ0ZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqcnZhYmVmb3JlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKmFzbV9wcmVmaXggUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfaW1wb3J0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHJ1biBQQVJBTVMgKChjb25zdCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgc2Nhbl9kcmVjdHZlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fZmlsdGVyZWRfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGFkZF9leGNsdWRlcyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIG1hdGNoX2V4Y2x1ZGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9leGNsdWRlcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgbG9uZyBmaWx0ZXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNjYW5fYWxsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fb3Blbl9vYmpfZmlsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc2Nhbl9vYmpfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGR1bXBfZGVmX2luZm8gUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50IHNmdW5jIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBmbHVzaF9wYWdlIFBBUkFNUyAoKEZJTEUgKiwgbG9uZyAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZ2VuX2RlZl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX2lkYXRhX29maWxlIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgZ2VuX2V4cF9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICp4bGF0ZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLSNpZiAwCi1zdGF0aWMgdm9pZCBkdW1wX2lhdCBQQVJBTVMgKChGSUxFICosIGV4cG9ydF90eXBlICopKTsKLSNlbmRpZgotc3RhdGljIGNoYXIgKm1ha2VfbGFiZWwgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBiZmQgKm1ha2Vfb25lX2xpYl9maWxlIFBBUkFNUyAoKGV4cG9ydF90eXBlICosIGludCkpOwotc3RhdGljIGJmZCAqbWFrZV9oZWFkIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBiZmQgKm1ha2VfdGFpbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnZW5fbGliX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBwZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIGludCBuZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIHZvaWQgcmVtb3ZlX251bGxfbmFtZXMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyB2b2lkIGR0YWIgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfZHVwbGljYXRlcyBQQVJBTVMgKChleHBvcnRfdHlwZSAqKikpOwotc3RhdGljIHZvaWQgZmlsbF9vcmRpbmFscyBQQVJBTVMgKChleHBvcnRfdHlwZSAqKikpOwotc3RhdGljIGludCBhbHBoYWZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyB2b2lkIG1hbmdsZV9kZWZzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotc3RhdGljIHZvaWQgaW5mb3JtIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1zdGF0aWMgdm9pZCB3YXJuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5IChtZXNzYWdlLCBhcmdzKQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfbGlzdCAgICAgIGFyZ3M7Ci17Ci0gIGlmIChwcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLQotICBpZiAobWVzc2FnZSBbc3RybGVuIChtZXNzYWdlKSAtIDFdICE9ICdcbicpCi0gICAgZnB1dGMgKCdcbicsIHN0ZGVycik7Ci19ICAKLQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fU1REQ19fCi1pbmZvcm0gKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi0jZWxzZQotaW5mb3JtIChtZXNzYWdlLCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgCi0gIGlmICghdmVyYm9zZSkKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLQotICBkaXNwbGF5IChtZXNzYWdlLCBhcmdzKTsKLSAgCi0gIHZhX2VuZCAoYXJncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi0jaWZkZWYgX19TVERDX18KLXdhcm4gKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi0jZWxzZQotd2FybiAobWVzc2FnZSwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0gIAotI2lmZGVmIF9fU1REQ19fCi0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSNlbmRpZgotICAKLSAgZGlzcGxheSAobWVzc2FnZSwgYXJncyk7Ci0KLSAgdmFfZW5kIChhcmdzKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcnZhYWZ0ZXIgKG1hY2hpbmUpCi0gICAgIGludCBtYWNoaW5lOwotewotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgTUFSTToKLSAgICBjYXNlIE0zODY6Ci0gICAgY2FzZSBNUFBDOgotICAgIGNhc2UgTVRIVU1COgotICAgIGNhc2UgTUFSTV9JTlRFUldPUks6Ci0gICAgY2FzZSBNTUNPUkVfQkU6Ci0gICAgY2FzZSBNTUNPUkVfTEU6Ci0gICAgY2FzZSBNTUNPUkVfRUxGOgotICAgIGNhc2UgTU1DT1JFX0VMRl9MRToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmtub3duIG1hY2hpbmUgdHlwZTogJWRcbiIpLCBtYWNoaW5lKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuICIiOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ydmFiZWZvcmUgKG1hY2hpbmUpCi0gICAgIGludCBtYWNoaW5lOwotewotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgTUFSTToKLSAgICBjYXNlIE0zODY6Ci0gICAgY2FzZSBNUFBDOgotICAgIGNhc2UgTVRIVU1COgotICAgIGNhc2UgTUFSTV9JTlRFUldPUks6Ci0gICAgY2FzZSBNTUNPUkVfQkU6Ci0gICAgY2FzZSBNTUNPUkVfTEU6Ci0gICAgY2FzZSBNTUNPUkVfRUxGOgotICAgIGNhc2UgTU1DT1JFX0VMRl9MRToKLSAgICAgIHJldHVybiAiLnJ2YVx0IjsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotYXNtX3ByZWZpeCAobWFjaGluZSkKLSAgICAgaW50IG1hY2hpbmU7Ci17Ci0gIHN3aXRjaCAobWFjaGluZSkKLSAgICB7Ci0gICAgY2FzZSBNQVJNOgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zODY6Ci0gICAgICByZXR1cm4gIl8iOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmtub3duIG1hY2hpbmUgdHlwZTogJWRcbiIpLCBtYWNoaW5lKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuICIiOwotfQotCi0jZGVmaW5lIEFTTV9CWVRFIAltdGFibGVbbWFjaGluZV0uaG93X2J5dGUKLSNkZWZpbmUgQVNNX1NIT1JUIAltdGFibGVbbWFjaGluZV0uaG93X3Nob3J0Ci0jZGVmaW5lIEFTTV9MT05HCW10YWJsZVttYWNoaW5lXS5ob3dfbG9uZwotI2RlZmluZSBBU01fVEVYVAltdGFibGVbbWFjaGluZV0uaG93X2FzY2l6Ci0jZGVmaW5lIEFTTV9DIAkJbXRhYmxlW21hY2hpbmVdLmhvd19jb21tZW50Ci0jZGVmaW5lIEFTTV9KVU1QIAltdGFibGVbbWFjaGluZV0uaG93X2p1bXAKLSNkZWZpbmUgQVNNX0dMT0JBTAltdGFibGVbbWFjaGluZV0uaG93X2dsb2JhbAotI2RlZmluZSBBU01fU1BBQ0UJbXRhYmxlW21hY2hpbmVdLmhvd19zcGFjZQotI2RlZmluZSBBU01fQUxJR05fU0hPUlQgbXRhYmxlW21hY2hpbmVdLmhvd19hbGlnbl9zaG9ydAotI2RlZmluZSBBU01fUlZBX0JFRk9SRSAJcnZhYmVmb3JlKG1hY2hpbmUpCi0jZGVmaW5lIEFTTV9SVkFfQUZURVIgIAlydmFhZnRlcihtYWNoaW5lKQotI2RlZmluZSBBU01fUFJFRklYCWFzbV9wcmVmaXgobWFjaGluZSkKLSNkZWZpbmUgQVNNX0FMSUdOX0xPTkcgIG10YWJsZVttYWNoaW5lXS5ob3dfYWxpZ25fbG9uZwotI2RlZmluZSBIT1dfQkZEX1RBUkdFVCAgMCAgLyogYWx3YXlzIGRlZmF1bHQqLwotI2RlZmluZSBIT1dfQkZEX0FSQ0ggICAgbXRhYmxlW21hY2hpbmVdLmhvd19iZmRfYXJjaAotI2RlZmluZSBIT1dfSlRBQiAgICAgICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiCi0jZGVmaW5lIEhPV19KVEFCX1NJWkUgICBtdGFibGVbbWFjaGluZV0uaG93X2p0YWJfc2l6ZQotI2RlZmluZSBIT1dfSlRBQl9ST0ZGICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiX3JvZmYKLXN0YXRpYyBjaGFyICoqb2F2OwotCi12b2lkCi1wcm9jZXNzX2RlZl9maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBGSUxFICpmID0gZm9wZW4gKG5hbWUsIEZPUEVOX1JUKTsKLSAgCi0gIGlmICghZikKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJDYW4ndCBvcGVuIGRlZiBmaWxlOiAlcyIpLCBuYW1lKTsKLQotICB5eWluID0gZjsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIlByb2Nlc3NpbmcgZGVmIGZpbGU6ICVzIiksIG5hbWUpOwotICAKLSAgeXlwYXJzZSAoKTsKLQotICBpbmZvcm0gKF8oIlByb2Nlc3NlZCBkZWYgZmlsZSIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENvbW11bmljYXRpb25zIHdpdGggdGhlIHBhcnNlciAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqZF9uYW1lOwkvKiBBcmcgdG8gTkFNRSBvciBMSUJSQVJZICovCi1zdGF0aWMgaW50IGRfbmZ1bmNzOwkJLyogTnVtYmVyIG9mIGZ1bmN0aW9ucyBleHBvcnRlZCAqLwotc3RhdGljIGludCBkX25hbWVkX25mdW5jczsJLyogTnVtYmVyIG9mIG5hbWVkIGZ1bmN0aW9ucyBleHBvcnRlZCAqLwotc3RhdGljIGludCBkX2xvd19vcmQ7CQkvKiBMb3dlc3Qgb3JkaW5hbCBpbmRleCAqLwotc3RhdGljIGludCBkX2hpZ2hfb3JkOwkJLyogSGlnaGVzdCBvcmRpbmFsIGluZGV4ICovCi1zdGF0aWMgZXhwb3J0X3R5cGUgKmRfZXhwb3J0czsJLypsaXN0IG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotc3RhdGljIGV4cG9ydF90eXBlICoqZF9leHBvcnRzX2xleGljYWxseTsJLyogdmVjdG9yIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBhbHBoYSBvcmRlciAqLwotc3RhdGljIGRsaXN0X3R5cGUgKmRfbGlzdDsJLyogRGVzY3JpcHRpb25zICovCi1zdGF0aWMgZGxpc3RfdHlwZSAqYV9saXN0OwkvKiBTdHVmZiB0byBnbyBpbiBkaXJlY3RpdmVzICovCi0KLXN0YXRpYyBpbnQgZF9pc19kbGw7Ci1zdGF0aWMgaW50IGRfaXNfZXhlOwotCi1pbnQKLXl5ZXJyb3IgKGVycikKLSAgICAgY29uc3QgY2hhciAqZXJyOwotewotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICB3YXJuIChfKCJTeW50YXggZXJyb3IgaW4gZGVmIGZpbGUgJXM6JWRcbiIpLCBkZWZfZmlsZSwgbGluZW51bWJlcik7Ci0gIAotICByZXR1cm4gMDsKLX0KLQotdm9pZAotZGVmX2V4cG9ydHMgKG5hbWUsIGludGVybmFsX25hbWUsIG9yZGluYWwsIG5vbmFtZSwgY29uc3RhbnQsIGRhdGEpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotICAgICBpbnQgbm9uYW1lOwotICAgICBpbnQgY29uc3RhbnQ7Ci0gICAgIGludCBkYXRhOwotewotICBzdHJ1Y3QgZXhwb3J0ICpwID0gKHN0cnVjdCBleHBvcnQgKikgeG1hbGxvYyAoc2l6ZW9mICgqcCkpOwotCi0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT5pbnRlcm5hbF9uYW1lID0gaW50ZXJuYWxfbmFtZSA/IGludGVybmFsX25hbWUgOiBuYW1lOwotICBwLT5vcmRpbmFsID0gb3JkaW5hbDsKLSAgcC0+Y29uc3RhbnQgPSBjb25zdGFudDsKLSAgcC0+bm9uYW1lID0gbm9uYW1lOwotICBwLT5kYXRhID0gZGF0YTsKLSAgcC0+bmV4dCA9IGRfZXhwb3J0czsKLSAgZF9leHBvcnRzID0gcDsKLSAgZF9uZnVuY3MrKzsKLX0KLQotdm9pZAotZGVmX25hbWUgKG5hbWUsIGJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBiYXNlOwotewotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIk5BTUU6ICVzIGJhc2U6ICV4IiksIG5hbWUsIGJhc2UpOwotICAKLSAgaWYgKGRfaXNfZGxsKQotICAgIHdhcm4gKF8oIkNhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIikpOwotICAKLSAgZF9uYW1lID0gbmFtZTsKLSAgLyogaWYgLS1kbGxuYW1lIG5vdCBwcm92aWRlZCwgdXNlIHRoZSBvbmUgaW4gdGhlIERFRiBmaWxlLgotICAgICBGSVhNRTogSXMgdGhpcyBhcHByb3ByaWF0ZSBmb3IgZXhlY3V0YWJsZXM/ICovCi0gIGlmICghIGRsbF9uYW1lKQotICAgIGRsbF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRfaXNfZXhlID0gMTsKLX0KLQotdm9pZAotZGVmX2xpYnJhcnkgKG5hbWUsIGJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBiYXNlOwotewotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkxJQlJBUlk6ICVzIGJhc2U6ICV4IiksIG5hbWUsIGJhc2UpOwotICAKLSAgaWYgKGRfaXNfZXhlKQotICAgIHdhcm4gKF8oIiVzOiBDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAKLSAgZF9uYW1lID0gbmFtZTsKLSAgLyogaWYgLS1kbGxuYW1lIG5vdCBwcm92aWRlZCwgdXNlIHRoZSBvbmUgaW4gdGhlIERFRiBmaWxlLiAqLwotICBpZiAoISBkbGxfbmFtZSkKLSAgICBkbGxfbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBkX2lzX2RsbCA9IDE7Ci19Ci0KLXZvaWQKLWRlZl9kZXNjcmlwdGlvbiAoZGVzYykKLSAgICAgY29uc3QgY2hhciAqZGVzYzsKLXsKLSAgZGxpc3RfdHlwZSAqZCA9IChkbGlzdF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoZGxpc3RfdHlwZSkpOwotICBkLT50ZXh0ID0geHN0cmR1cCAoZGVzYyk7Ci0gIGQtPm5leHQgPSBkX2xpc3Q7Ci0gIGRfbGlzdCA9IGQ7Ci19Ci0KLXZvaWQKLW5ld19kaXJlY3RpdmUgKGRpcikKLSAgICAgY2hhciAqZGlyOwotewotICBkbGlzdF90eXBlICpkID0gKGRsaXN0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkbGlzdF90eXBlKSk7Ci0gIGQtPnRleHQgPSB4c3RyZHVwIChkaXIpOwotICBkLT5uZXh0ID0gYV9saXN0OwotICBhX2xpc3QgPSBkOwotfQotCi12b2lkCi1kZWZfaGVhcHNpemUgKHJlc2VydmUsIGNvbW1pdCkKLSAgICAgaW50IHJlc2VydmU7Ci0gICAgIGludCBjb21taXQ7Ci17Ci0gIGNoYXIgYlsyMDBdOwotICBpZiAoY29tbWl0ID4gMCkKLSAgICBzcHJpbnRmIChiLCAiLWhlYXAgMHgleCwweCV4ICIsIHJlc2VydmUsIGNvbW1pdCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChiLCAiLWhlYXAgMHgleCAiLCByZXNlcnZlKTsKLSAgbmV3X2RpcmVjdGl2ZSAoeHN0cmR1cCAoYikpOwotfQotCi12b2lkCi1kZWZfc3RhY2tzaXplIChyZXNlcnZlLCBjb21taXQpCi0gICAgIGludCByZXNlcnZlOwotICAgICBpbnQgY29tbWl0OwotewotICBjaGFyIGJbMjAwXTsKLSAgaWYgKGNvbW1pdCA+IDApCi0gICAgc3ByaW50ZiAoYiwgIi1zdGFjayAweCV4LDB4JXggIiwgcmVzZXJ2ZSwgY29tbWl0KTsKLSAgZWxzZQotICAgIHNwcmludGYgKGIsICItc3RhY2sgMHgleCAiLCByZXNlcnZlKTsKLSAgbmV3X2RpcmVjdGl2ZSAoeHN0cmR1cCAoYikpOwotfQotCi0vKiBhcHBlbmRfaW1wb3J0IHNpbXBseSBhZGRzIHRoZSBnaXZlbiBpbXBvcnQgZGVmaW5pdGlvbiB0byB0aGUgZ2xvYmFsCi0gICBpbXBvcnRfbGlzdC4gIEl0IGlzIHVzZWQgYnkgZGVmX2ltcG9ydC4gICovCi0KLXN0YXRpYyB2b2lkCi1hcHBlbmRfaW1wb3J0IChzeW1ib2xfbmFtZSwgZGxsX25hbWUsIGZ1bmNfb3JkaW5hbCkKLSAgICAgY29uc3QgY2hhciAqc3ltYm9sX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRsbF9uYW1lOwotICAgICBpbnQgZnVuY19vcmRpbmFsOwotewotICBpaGVhZHR5cGUgKipwcTsKLSAgaWhlYWR0eXBlICpxOwotCi0gIGZvciAocHEgPSAmaW1wb3J0X2xpc3Q7ICpwcSAhPSBOVUxMOyBwcSA9ICYoKnBxKS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICgoKnBxKS0+ZGxsbmFtZSwgZGxsX25hbWUpID09IDApCi0JewotCSAgcSA9ICpwcTsKLQkgIHEtPmZ1bmN0YWlsLT5uZXh0ID0geG1hbGxvYyAoc2l6ZW9mIChpZnVuY3R5cGUpKTsKLQkgIHEtPmZ1bmN0YWlsID0gcS0+ZnVuY3RhaWwtPm5leHQ7Ci0JICBxLT5mdW5jdGFpbC0+b3JkICA9IGZ1bmNfb3JkaW5hbDsKLQkgIHEtPmZ1bmN0YWlsLT5uYW1lID0geHN0cmR1cCAoc3ltYm9sX25hbWUpOwotCSAgcS0+ZnVuY3RhaWwtPm5leHQgPSBOVUxMOwotCSAgcS0+bmZ1bmNzKys7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBxID0geG1hbGxvYyAoc2l6ZW9mIChpaGVhZHR5cGUpKTsKLSAgcS0+ZGxsbmFtZSA9IHhzdHJkdXAgKGRsbF9uYW1lKTsKLSAgcS0+bmZ1bmNzID0gMTsKLSAgcS0+ZnVuY2hlYWQgPSB4bWFsbG9jIChzaXplb2YgKGlmdW5jdHlwZSkpOwotICBxLT5mdW5jdGFpbCA9IHEtPmZ1bmNoZWFkOwotICBxLT5uZXh0ID0gTlVMTDsKLSAgcS0+ZnVuY3RhaWwtPm5hbWUgPSB4c3RyZHVwIChzeW1ib2xfbmFtZSk7Ci0gIHEtPmZ1bmN0YWlsLT5vcmQgID0gZnVuY19vcmRpbmFsOwotICBxLT5mdW5jdGFpbC0+bmV4dCA9IE5VTEw7Ci0KLSAgKnBxID0gcTsKLX0KLQotLyogZGVmX2ltcG9ydCBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gZGVmcGFyc2UueSB3aGVuIGFuIElNUE9SVAotICAgZGVjbGFyYXRpb24gaXMgZW5jb3VudGVyZWQuICBEZXBlbmRpbmcgb24gdGhlIGZvcm0gb2YgdGhlCi0gICBkZWNsYXJhdGlvbiwgdGhlIG1vZHVsZSBuYW1lIG1heSBvciBtYXkgbm90IG5lZWQgIi5kbGwiIHRvIGJlCi0gICBhcHBlbmRlZCB0byBpdCwgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIG1heSBiZSBzdG9yZWQgaW4gaW50ZXJuYWwKLSAgIG9yIGVudHJ5LCBhbmQgdGhlcmUgbWF5IG9yIG1heSBub3QgYmUgYW4gb3JkaW5hbCB2YWx1ZSBhc3NvY2lhdGVkCi0gICB3aXRoIGl0LiAgKi8KLQotLyogQSBub3RlIHJlZ2FyZGluZyB0aGUgcGFyc2UgbW9kZXM6Ci0gICBJbiBkZWZwYXJzZS55IHdlIGhhdmUgdG8gYWNjZXB0IGltcG9ydCBkZWNsYXJhdGlvbnMgd2hpY2ggZm9sbG93Ci0gICBhbnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0gICAgIDxmdW5jX25hbWVfaW5fYXBwPiA9IDxkbGxfbmFtZT4uPGZ1bmNfbmFtZV9pbl9kbGw+Ci0gICAgIDxmdW5jX25hbWVfaW5fYXBwPiA9IDxkbGxfbmFtZT4uPG51bWJlcj4KLSAgICAgPGRsbF9uYW1lPi48ZnVuY19uYW1lX2luX2RsbD4KLSAgICAgPGRsbF9uYW1lPi48bnVtYmVyPgotICAgRnVydGhlcm1vcmUsIHRoZSBkbGwncyBuYW1lIG1heSBvciBtYXkgbm90IGVuZCB3aXRoICIuZGxsIiwgd2hpY2gKLSAgIGNvbXBsaWNhdGVzIHRoZSBwYXJzaW5nIGEgbGl0dGxlLiAgTm9ybWFsbHkgdGhlIGRsbCdzIG5hbWUgaXMKLSAgIHBhc3NlZCB0byBkZWZfaW1wb3J0KCkgaW4gdGhlICJtb2R1bGUiIHBhcmFtZXRlciwgYnV0IHdoZW4gaXQgZW5kcwotICAgd2l0aCAiLmRsbCIgaXQgZ2V0cyBwYXNzZWQgaW4gIm1vZHVsZSIgc2FucyAiLmRsbCIgYW5kIHRoYXQgbmVlZHMKLSAgIHRvIGJlIHJlYXBwZW5kZWQuCi0KLSAgZGVmX2ltcG9ydCBnZXRzIGZpdmUgcGFyYW1ldGVyczoKLSAgQVBQX05BTUUgLSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGFwcGxpY2F0aW9uLCBpZgotICAgICAgICAgICAgIHByZXNlbnQsIG9yIE5VTEwgaWYgbm90IHByZXNlbnQuCi0gIE1PRFVMRSAgIC0gdGhlIG5hbWUgb2YgdGhlIGRsbCwgcG9zc2libHkgc2FucyBleHRlbnNpb24gKGllLCAnLmRsbCcpLgotICBETExFWFQgICAtIHRoZSBleHRlbnNpb24gb2YgdGhlIGRsbCwgaWYgcHJlc2VudCwgTlVMTCBpZiBub3QgcHJlc2VudC4KLSAgRU5UUlkgICAgLSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGRsbCwgaWYgcHJlc2VudCwgb3IgTlVMTC4KLSAgT1JEX1ZBTCAgLSB0aGUgbnVtZXJpY2FsIHRhZyBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGRsbCwgaWYgcHJlc2VudCwKLSAgICAgICAgICAgICBvciBOVUxMLiAgRXhhY3RseSBvbmUgb2YgPGVudHJ5PiBvciA8b3JkX3ZhbD4gbXVzdCBiZQotICAgICAgICAgICAgIHByZXNlbnQgKGkuZS4sIG5vdCBOVUxMKS4gICovCi0KLXZvaWQKLWRlZl9pbXBvcnQgKGFwcF9uYW1lLCBtb2R1bGUsIGRsbGV4dCwgZW50cnksIG9yZF92YWwpCi0gICAgIGNvbnN0IGNoYXIgKmFwcF9uYW1lOwotICAgICBjb25zdCBjaGFyICptb2R1bGU7Ci0gICAgIGNvbnN0IGNoYXIgKmRsbGV4dDsKLSAgICAgY29uc3QgY2hhciAqZW50cnk7Ci0gICAgIGludCBvcmRfdmFsOwotewotICBjb25zdCBjaGFyICphcHBsaWNhdGlvbl9uYW1lOwotICBjaGFyICpidWY7Ci0KLSAgaWYgKGVudHJ5ICE9IE5VTEwpCi0gICAgYXBwbGljYXRpb25fbmFtZSA9IGVudHJ5OwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGFwcF9uYW1lICE9IE5VTEwpCi0JYXBwbGljYXRpb25fbmFtZSA9IGFwcF9uYW1lOwotICAgICAgZWxzZQotCWFwcGxpY2F0aW9uX25hbWUgPSAiIjsKLSAgICB9Ci0gIAotICBpZiAoZGxsZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKG1vZHVsZSkgKyBzdHJsZW4gKGRsbGV4dCkgKyAyKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzLiVzIiwgbW9kdWxlLCBkbGxleHQpOwotICAgICAgbW9kdWxlID0gYnVmOwotICAgIH0KLQotICBhcHBlbmRfaW1wb3J0IChhcHBsaWNhdGlvbl9uYW1lLCBtb2R1bGUsIG9yZF92YWwpOwotfQotCi12b2lkCi1kZWZfdmVyc2lvbiAobWFqb3IsIG1pbm9yKQotICAgICBpbnQgbWFqb3I7Ci0gICAgIGludCBtaW5vcjsKLXsKLSAgcHJpbnRmICgiVkVSU0lPTiAlZC4lZFxuIiwgbWFqb3IsIG1pbm9yKTsKLX0KLQotdm9pZAotZGVmX3NlY3Rpb24gKG5hbWUsIGF0dHIpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBhdHRyOwotewotICBjaGFyIGJ1ZlsyMDBdOwotICBjaGFyIGF0dHNbNV07Ci0gIGNoYXIgKmQgPSBhdHRzOwotICBpZiAoYXR0ciAmIDEpCi0gICAgKmQrKyA9ICdSJzsKLQotICBpZiAoYXR0ciAmIDIpCi0gICAgKmQrKyA9ICdXJzsKLSAgaWYgKGF0dHIgJiA0KQotICAgICpkKysgPSAnWCc7Ci0gIGlmIChhdHRyICYgOCkKLSAgICAqZCsrID0gJ1MnOwotICAqZCsrID0gMDsKLSAgc3ByaW50ZiAoYnVmLCAiLWF0dHIgJXMgJXMiLCBuYW1lLCBhdHRzKTsKLSAgbmV3X2RpcmVjdGl2ZSAoeHN0cmR1cCAoYnVmKSk7Ci19Ci0KLXZvaWQKLWRlZl9jb2RlIChhdHRyKQotICAgICBpbnQgYXR0cjsKLXsKLQotICBkZWZfc2VjdGlvbiAoIkNPREUiLCBhdHRyKTsKLX0KLQotdm9pZAotZGVmX2RhdGEgKGF0dHIpCi0gICAgIGludCBhdHRyOwotewotICBkZWZfc2VjdGlvbiAoIkRBVEEiLCBhdHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1ydW4gKHdoYXQsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKndoYXQ7Ci0gICAgIGNoYXIgKmFyZ3M7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBwaWQsIHdhaXRfc3RhdHVzOwotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqKmFyZ3Y7Ci0gIGNoYXIgKmVycm1zZ19mbXQsICplcnJtc2dfYXJnOwotICBjaGFyICp0ZW1wX2Jhc2UgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotCi0gIGluZm9ybSAoInJ1bjogJXMgJXNcbiIsIHdoYXQsIGFyZ3MpOwotCi0gIC8qIENvdW50IHRoZSBhcmdzICovCi0gIGkgPSAwOwotICBmb3IgKHMgPSBhcmdzOyAqczsgcysrKQotICAgIGlmICgqcyA9PSAnICcpCi0gICAgICBpKys7Ci0gIGkrKzsKLSAgYXJndiA9IGFsbG9jYSAoc2l6ZW9mIChjaGFyICopICogKGkgKyAzKSk7Ci0gIGkgPSAwOwotICBhcmd2W2krK10gPSB3aGF0OwotICBzID0gYXJnczsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgd2hpbGUgKCpzID09ICcgJykKLQkrK3M7Ci0gICAgICBhcmd2W2krK10gPSBzOwotICAgICAgd2hpbGUgKCpzICE9ICcgJyAmJiAqcyAhPSAwKQotCXMrKzsKLSAgICAgIGlmICgqcyA9PSAwKQotCWJyZWFrOwotICAgICAgKnMrKyA9IDA7Ci0gICAgfQotICBhcmd2W2krK10gPSBOVUxMOwotCi0gIHBpZCA9IHBleGVjdXRlIChhcmd2WzBdLCAoY2hhciAqIGNvbnN0ICopIGFyZ3YsIHByb2dyYW1fbmFtZSwgdGVtcF9iYXNlLAotCQkgICZlcnJtc2dfZm10LCAmZXJybXNnX2FyZywgUEVYRUNVVEVfT05FIHwgUEVYRUNVVEVfU0VBUkNIKTsKLQotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIGluZm9ybSAoc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICAKLSAgICAgIGZhdGFsIChlcnJtc2dfZm10LCBlcnJtc2dfYXJnKTsKLSAgICB9Ci0KLSAgcGlkID0gcHdhaXQgKHBpZCwgJiB3YWl0X3N0YXR1cywgMCk7Ci0gIAotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmYXRhbCAoXygid2FpdDogJXMiKSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgfQotICBlbHNlIGlmIChXSUZTSUdOQUxFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmYXRhbCAoXygic3VicHJvY2VzcyBnb3QgZmF0YWwgc2lnbmFsICVkIiksIFdURVJNU0lHICh3YWl0X3N0YXR1cykpOwotICAgIH0KLSAgZWxzZSBpZiAoV0lGRVhJVEVEICh3YWl0X3N0YXR1cykpCi0gICAgewotICAgICAgaWYgKFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykgIT0gMCkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCXdhcm4gKF8oIiVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiksCi0JICAgICAgd2hhdCwgV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSk7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci19Ci0KLS8qIExvb2sgZm9yIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydCBpbiB0aGUgLmRyZWN0dmUgc2VjdGlvbiBvZgotICAgQUJGRC4gIFBhc3MgZWFjaCBvbmUgdG8gZGVmX2V4cG9ydHMuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9kcmVjdHZlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKiBzOwotICBpbnQgICAgICAgIHNpemU7Ci0gIGNoYXIgKiAgICAgYnVmOwotICBjaGFyICogICAgIHA7Ci0gIGNoYXIgKiAgICAgZTsKLQotICAvKiBMb29rIGZvciAuZHJlY3R2ZSdzICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgRFJFQ1RWRV9TRUNUSU9OX05BTUUpOwotICAKLSAgaWYgKHMgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gICAgICAKLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAocyk7Ci0gIGJ1ZiAgPSB4bWFsbG9jIChzaXplKTsKLQotICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJTdWNraW5nIGluIGluZm8gZnJvbSAlcyBzZWN0aW9uIGluICVzXG4iKSwKLQkgIERSRUNUVkVfU0VDVElPTl9OQU1FLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgLyogU2VhcmNoIGZvciAtZXhwb3J0OiBzdHJpbmdzICovCi0gIHAgPSBidWY7Ci0gIGUgPSBidWYgKyBzaXplOwotICB3aGlsZSAocCA8IGUpCi0gICAgewotICAgICAgaWYgKHBbMF0gPT0gJy0nCi0JICAmJiBzdHJuY21wIChwLCAiLWV4cG9ydDoiLCA4KSA9PSAwKQotCXsKLQkgIGNoYXIgKiBuYW1lOwotCSAgY2hhciAqIGM7Ci0JICAKLQkgIHAgKz0gODsKLQkgIG5hbWUgPSBwOwotCSAgd2hpbGUgKHAgPCBlICYmICpwICE9ICcgJyAmJiAqcCAhPSAnLScpCi0JICAgIHArKzsKLQkgIGMgPSB4bWFsbG9jIChwIC0gbmFtZSArIDEpOwotCSAgbWVtY3B5IChjLCBuYW1lLCBwIC0gbmFtZSk7Ci0JICBjW3AgLSBuYW1lXSA9IDA7Ci0KLQkgIC8qIEZJWE1FOiBUaGUgNXRoIGFyZyBpcyBmb3IgdGhlIGBjb25zdGFudCcgZmllbGQuCi0JICAgICBXaGF0IHNob3VsZCBpdCBiZT8gIE5vdCB0aGF0IGl0IG1hdHRlcnMgc2luY2UgaXQncyBub3QKLQkgICAgIGN1cnJlbnRseSB1c2VmdWwuICAqLwotCSAgZGVmX2V4cG9ydHMgKGMsIDAsIC0xLCAwLCAwLCAwKTsKLQotCSAgaWYgKGFkZF9zdGRjYWxsX2FsaWFzICYmIHN0cmNociAoYywgJ0AnKSkKLQkgICAgewotCSAgICAgIGNoYXIgKmV4cG9ydGVkX25hbWUgPSB4c3RyZHVwIChjKTsKLQkgICAgICBjaGFyICphdHN5bSA9IHN0cmNociAoZXhwb3J0ZWRfbmFtZSwgJ0AnKTsKLQkgICAgICAqYXRzeW0gPSAnXDAnOwotCSAgICAgIGRlZl9leHBvcnRzIChleHBvcnRlZF9uYW1lLCB4c3RyZHVwIChjKSwgLTEsIDAsIDAsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXArKzsKLSAgICB9Ci0gIGZyZWUgKGJ1Zik7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyBpbiBNSU5JU1lNUywgYW5kIGFkZCBlYWNoIG9uZSB0byBsaXN0IG9mCi0gICBzeW1ib2xzIHRvIGV4cG9ydC4gICovCi0KLXN0YXRpYyB2b2lkCi1zY2FuX2ZpbHRlcmVkX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBhc3ltYm9sICpzdG9yZTsKLSAgYmZkX2J5dGUgKmZyb20sICpmcm9tZW5kOwotCi0gIHN0b3JlID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgaWYgKHN0b3JlID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgZnJvbSA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudCAqIHNpemU7Ci0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bWJvbF9uYW1lOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGZhbHNlLCBmcm9tLCBzdG9yZSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIHN5bWJvbF9uYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IHN5bWJvbF9uYW1lWzBdKQotCSsrc3ltYm9sX25hbWU7Ci0KLSAgICAgIGRlZl9leHBvcnRzICh4c3RyZHVwIChzeW1ib2xfbmFtZSkgLCAwLCAtMSwgMCwgMCwgMCk7Ci0KLSAgICAgIGlmIChhZGRfc3RkY2FsbF9hbGlhcyAmJiBzdHJjaHIgKHN5bWJvbF9uYW1lLCAnQCcpKQotICAgICAgICB7Ci0JICBjaGFyICpleHBvcnRlZF9uYW1lID0geHN0cmR1cCAoc3ltYm9sX25hbWUpOwotCSAgY2hhciAqYXRzeW0gPSBzdHJjaHIgKGV4cG9ydGVkX25hbWUsICdAJyk7Ci0JICAqYXRzeW0gPSAnXDAnOwotCSAgZGVmX2V4cG9ydHMgKGV4cG9ydGVkX25hbWUsIHhzdHJkdXAgKHN5bWJvbF9uYW1lKSwgLTEsIDAsIDAsIDApOwotCX0KLSAgICB9Ci19Ci0KLS8qIEFkZCBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9leGNsdWRlcyAobmV3X2V4Y2x1ZGVzKQotICAgICBjb25zdCBjaGFyICpuZXdfZXhjbHVkZXM7Ci17Ci0gIGNoYXIgKmxvY2FsX2NvcHk7Ci0gIGNoYXIgKmV4Y2x1ZGVfc3RyaW5nOwotCi0gIGxvY2FsX2NvcHkgPSB4c3RyZHVwIChuZXdfZXhjbHVkZXMpOwotCi0gIGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChsb2NhbF9jb3B5LCAiLDoiKTsKLSAgZm9yICg7IGV4Y2x1ZGVfc3RyaW5nOyBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAoTlVMTCwgIiw6IikpCi0gICAgewotICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpuZXdfZXhjbHVkZTsKLSAgICAgIAotICAgICAgbmV3X2V4Y2x1ZGUgPSAoKHN0cnVjdCBzdHJpbmdfbGlzdCAqKQotCQkgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ19saXN0KSkpOwotICAgICAgbmV3X2V4Y2x1ZGUtPnN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZXhjbHVkZV9zdHJpbmcpICsgMik7Ci0gICAgICAvKiBGSVhNRTogSXMgaXQgYWx3YXlzIHJpZ2h0IHRvIGFkZCBhIGxlYWRpbmcgdW5kZXJzY29yZT8gICovCi0gICAgICBzcHJpbnRmIChuZXdfZXhjbHVkZS0+c3RyaW5nLCAiXyVzIiwgZXhjbHVkZV9zdHJpbmcpOwotICAgICAgbmV3X2V4Y2x1ZGUtPm5leHQgPSBleGNsdWRlczsKLSAgICAgIGV4Y2x1ZGVzID0gbmV3X2V4Y2x1ZGU7Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBpbmZvcm0gKF8oIkV4Y2x1ZGluZyBzeW1ib2w6ICVzXG4iKSwgZXhjbHVkZV9zdHJpbmcpOwotICAgIH0KLQotICBmcmVlIChsb2NhbF9jb3B5KTsKLX0KLQotLyogU2VlIGlmIFNUUklORyBpcyBvbiB0aGUgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWF0Y2hfZXhjbHVkZSAoc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqZXhjbF9pdGVtOwotCi0gIGZvciAoZXhjbF9pdGVtID0gZXhjbHVkZXM7IGV4Y2xfaXRlbTsgZXhjbF9pdGVtID0gZXhjbF9pdGVtLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHN0cmluZywgZXhjbF9pdGVtLT5zdHJpbmcpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgdGhlIGRlZmF1bHQgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2RlZmF1bHRfZXhjbHVkZXMgKHZvaWQpCi17Ci0gIGFkZF9leGNsdWRlcyAoZGVmYXVsdF9leGNsdWRlcyk7Ci19Ci0KLS8qIENob29zZSB3aGljaCBzeW1ib2xzIHRvIGV4cG9ydC4gICovCi0KLXN0YXRpYyBsb25nCi1maWx0ZXJfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZCwgKnRvOwotICBhc3ltYm9sICpzdG9yZTsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotICB0byA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLQotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBpbnQga2VlcCA9IDA7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZmFsc2UsIChjb25zdCBQVFIpIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgLyogQ2hlY2sgZm9yIGV4dGVybmFsIGFuZCBkZWZpbmVkIG9ubHkgc3ltYm9scy4gICovCi0gICAgICBrZWVwID0gKCgoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkgICAgICAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JICAgICAgJiYgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpOwotICAgICAgCi0gICAgICBrZWVwID0ga2VlcCAmJiAhIG1hdGNoX2V4Y2x1ZGUgKHN5bS0+bmFtZSk7Ci0KLSAgICAgIGlmIChrZWVwKQotCXsKLQkgIG1lbWNweSAodG8sIGZyb20sIHNpemUpOwotCSAgdG8gKz0gc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodG8gLSAoYmZkX2J5dGUgKikgbWluaXN5bXMpIC8gc2l6ZTsKLX0KLQotLyogRXhwb3J0IGFsbCBzeW1ib2xzIGluIEFCRkQsIGV4Y2VwdCBmb3Igb25lcyB3ZSB3ZXJlIHRvbGQgbm90IHRvCi0gICBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9hbGxfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBQVFIgbWluaXN5bXM7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotCi0gIC8qIElnbm9yZSBiZmRzIHdpdGggYW4gaW1wb3J0IGRlc2NyaXB0b3IgdGFibGUuICBXZSBhc3N1bWUgdGhhdCBhbnkKLSAgICAgc3VjaCBCRkQgY29udGFpbnMgc3ltYm9scyB3aGljaCBhcmUgZXhwb3J0ZWQgZnJvbSBhbm90aGVyIERMTCwKLSAgICAgYW5kIHdlIGRvbid0IHdhbnQgdG8gcmVleHBvcnQgdGhlbSBmcm9tIGhlcmUuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaWRhdGEkNCIpKQotICAgIHJldHVybjsKLQotICBpZiAoISAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEhBU19TWU1TKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgd2FybiAoXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gYmZkX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGZhbHNlLCAmbWluaXN5bXMsICZzaXplKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgd2FybiAoXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERpc2NhcmQgdGhlIHN5bWJvbHMgd2UgZG9uJ3Qgd2FudCB0byBleHBvcnQuICBJdCdzIE9LIHRvIGRvIHRoaXMKLSAgICAgaW4gcGxhY2U7IHdlJ2xsIGZyZWUgdGhlIHN0b3JhZ2UgYW55d2F5LiAgKi8KLQotICBzeW1jb3VudCA9IGZpbHRlcl9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpOwotICBzY2FuX2ZpbHRlcmVkX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSk7Ci0KLSAgZnJlZSAobWluaXN5bXMpOwotfQotCi0vKiBMb29rIGF0IHRoZSBvYmplY3QgZmlsZSB0byBkZWNpZGUgd2hpY2ggc3ltYm9scyB0byBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9vcGVuX29ial9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChleHBvcnRfYWxsX3N5bWJvbHMpCi0gICAgc2Nhbl9hbGxfc3ltYm9scyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzY2FuX2RyZWN0dmVfc3ltYm9scyAoYWJmZCk7Ci0gCi0gIC8qIEZJWE1FOiB3ZSBvdWdodCB0byByZWFkIGluIGFuZCBibG9jayBvdXQgdGhlIGJhc2UgcmVsb2NhdGlvbnMgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkRvbmUgcmVhZGluZyAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNjYW5fb2JqX2ZpbGUgKGZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgYmZkICogZiA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIDApOwotCi0gIGlmICghZikKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiBvYmplY3QgZmlsZTogJXMiKSwgZmlsZW5hbWUpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiU2Nhbm5pbmcgb2JqZWN0IGZpbGUgJXMiKSwgZmlsZW5hbWUpOwotICAKLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGYsIGJmZF9hcmNoaXZlKSkKLSAgICB7Ci0gICAgICBiZmQgKmFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYsIDApOwotICAgICAgd2hpbGUgKGFyZmlsZSkKLQl7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYXJmaWxlLCBiZmRfb2JqZWN0KSkKLQkgICAgc2Nhbl9vcGVuX29ial9maWxlIChhcmZpbGUpOwotCSAgYmZkX2Nsb3NlIChhcmZpbGUpOwotCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZiwgYXJmaWxlKTsKLQl9Ci0gICAgICAKLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotICAgICAgaWYgKG1jb3JlX2VsZl9vdXRfZmlsZSkKLQlpbmZvcm0gKF8oIkNhbm5vdCBwcm9kdWNlIG1jb3JlLWVsZiBkbGwgZnJvbSBhcmNoaXZlIGZpbGU6ICVzIiksIGZpbGVuYW1lKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZiwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgc2Nhbl9vcGVuX29ial9maWxlIChmKTsKLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gICAgICBpZiAobWNvcmVfZWxmX291dF9maWxlKQotCW1jb3JlX2VsZl9jYWNoZV9maWxlbmFtZSAoKGNoYXIgKikgZmlsZW5hbWUpOwotI2VuZGlmCi0gICAgfQotCi0gIGJmZF9jbG9zZSAoZik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9kZWZfaW5mbyAoZikKLSAgICAgRklMRSAqZjsKLXsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0gIGZwcmludGYgKGYsICIlcyAiLCBBU01fQyk7Ci0gIGZvciAoaSA9IDA7IG9hdltpXTsgaSsrKQotICAgIGZwcmludGYgKGYsICIlcyAiLCBvYXZbaV0pOwotICBmcHJpbnRmIChmLCAiXG4iKTsKLSAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICIlcyAgJWQgPSAlcyAlcyBAICVkICVzJXMlc1xuIiwKLQkgICAgICAgQVNNX0MsCi0JICAgICAgIGksCi0JICAgICAgIGV4cC0+bmFtZSwKLQkgICAgICAgZXhwLT5pbnRlcm5hbF9uYW1lLAotCSAgICAgICBleHAtPm9yZGluYWwsCi0JICAgICAgIGV4cC0+bm9uYW1lID8gIk5PTkFNRSAiIDogIiIsCi0JICAgICAgIGV4cC0+Y29uc3RhbnQgPyAiQ09OU1RBTlQiIDogIiIsCi0JICAgICAgIGV4cC0+ZGF0YSA/ICJEQVRBIiA6ICIiKTsKLSAgICB9Ci19Ci0KLS8qIEdlbmVyYXRlIHRoZSAuZXhwIGZpbGUgKi8KLQotc3RhdGljIGludAotc2Z1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIHJldHVybiAqKGNvbnN0IGxvbmcgKikgYSAtICooY29uc3QgbG9uZyAqKSBiOwotfQotCi1zdGF0aWMgdm9pZAotZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKQotICAgICBGSUxFICpmOwotICAgICBsb25nICpuZWVkOwotICAgICBpbnQgcGFnZV9hZGRyOwotICAgICBpbnQgb25fcGFnZTsKLXsKLSAgaW50IGk7Ci0KLSAgLyogRmx1c2ggdGhpcyBwYWdlICovCi0gIGZwcmludGYgKGYsICJcdCVzXHQweCUwOHhcdCVzIFN0YXJ0aW5nIFJWQSBmb3IgY2h1bmtcbiIsCi0JICAgQVNNX0xPTkcsCi0JICAgcGFnZV9hZGRyLAotCSAgIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JXhcdCVzIFNpemUgb2YgYmxvY2tcbiIsCi0JICAgQVNNX0xPTkcsCi0JICAgKG9uX3BhZ2UgKiAyKSArIChvbl9wYWdlICYgMSkgKiAyICsgOCwKLQkgICBBU01fQyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBvbl9wYWdlOyBpKyspCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JWx4XG4iLCBBU01fU0hPUlQsIChuZWVkW2ldIC0gcGFnZV9hZGRyKSB8IDB4MzAwMCk7Ci0gICAgfQotICAvKiBBbmQgcGFkZGluZyAqLwotICBpZiAob25fcGFnZSAmIDEpCi0gICAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JXhcbiIsIEFTTV9TSE9SVCwgMCB8IDB4MDAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZGVmX2ZpbGUgKCkKLXsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0KLSAgaW5mb3JtIChfKCJBZGRpbmcgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIpKTsKLSAgCi0gIGZwcmludGYgKG91dHB1dF9kZWYsICI7Iik7Ci0gIGZvciAoaSA9IDA7IG9hdltpXTsgaSsrKQotICAgIGZwcmludGYgKG91dHB1dF9kZWYsICIgJXMiLCBvYXZbaV0pOwotCi0gIGZwcmludGYgKG91dHB1dF9kZWYsICJcbkVYUE9SVFNcbiIpOwotCi0gIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyICpxdW90ZSA9IHN0cmNociAoZXhwLT5uYW1lLCAnLicpID8gIlwiIiA6ICIiOwotICAgICAgY2hhciAqcmVzID0gY3BsdXNfZGVtYW5nbGUgKGV4cC0+aW50ZXJuYWxfbmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotCi0gICAgICBpZiAoc3RyY21wIChleHAtPm5hbWUsIGV4cC0+aW50ZXJuYWxfbmFtZSkgPT0gMCkKLSAgICAgICAgewotCi0JICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXHQlcyVzJXMgQCAlZCVzJXMgOyAlc1xuIiwKLQkJICAgcXVvdGUsCi0JCSAgIGV4cC0+bmFtZSwKLQkJICAgcXVvdGUsCi0JCSAgIGV4cC0+b3JkaW5hbCwKLQkJICAgZXhwLT5ub25hbWUgPyAiIE5PTkFNRSIgOiAiIiwKLQkJICAgZXhwLT5kYXRhID8gIiBEQVRBIiA6ICIiLAotCQkgICByZXMgPyByZXMgOiAiIik7Ci0JfQotICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKnF1b3RlMSA9IHN0cmNociAoZXhwLT5pbnRlcm5hbF9uYW1lLCAnLicpID8gIlwiIiA6ICIiOwotCSAgLyogY2hhciAqYWxpYXMgPSAgKi8KLQkgIGZwcmludGYgKG91dHB1dF9kZWYsICJcdCVzJXMlcyA9ICVzJXMlcyBAICVkJXMlcyA7ICVzXG4iLAotCQkgICBxdW90ZSwKLQkJICAgZXhwLT5uYW1lLAotCQkgICBxdW90ZSwKLQkJICAgcXVvdGUxLAotCQkgICBleHAtPmludGVybmFsX25hbWUsCi0JCSAgIHF1b3RlMSwKLQkJICAgZXhwLT5vcmRpbmFsLAotCQkgICBleHAtPm5vbmFtZSA/ICIgTk9OQU1FIiA6ICIiLAotCQkgICBleHAtPmRhdGEgPyAiIERBVEEiIDogIiIsCi0JCSAgIHJlcyA/IHJlcyA6ICIiKTsKLQl9Ci0gICAgICBpZiAocmVzKQotICAgICAgICBmcmVlIChyZXMpOwotICAgIH0KLSAgCi0gIGluZm9ybSAoXygiQWRkZWQgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIpKTsKLX0KLQotLyogZ2VuZXJhdGVfaWRhdGFfb2ZpbGUgZ2VuZXJhdGVzIHRoZSBwb3J0YWJsZSBhc3NlbWJseSBzb3VyY2UgY29kZQotICAgZm9yIHRoZSBpZGF0YSBzZWN0aW9ucy4gIEl0IGFwcGVuZHMgdGhlIHNvdXJjZSBjb2RlIHRvIHRoZSBlbmQgb2YKLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2lkYXRhX29maWxlIChmaWx2YXIpCi0gICAgIEZJTEUgKmZpbHZhcjsKLXsKLSAgaWhlYWR0eXBlICpoZWFkcHRyOwotICBpZnVuY3R5cGUgKmZ1bmNwdHI7Ci0gIGludCAgICAgICAgaGVhZGluZGV4OwotICBpbnQgICAgICAgIGZ1bmNpbmRleDsKLSAgaW50CSAgICAgbmhlYWRzOwotCi0gIGlmIChpbXBvcnRfbGlzdCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmcHJpbnRmIChmaWx2YXIsICIlcyBJbXBvcnQgZGF0YSBzZWN0aW9uc1xuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQyXG4iKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0ZG9pX2lkYXRhXG4iLCBBU01fR0xPQkFMKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiZG9pX2lkYXRhOlxuIik7Ci0KLSAgbmhlYWRzID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc2xpc3RvbmUlZCVzXHQlcyAlc1xuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUiwKLQkgICAgICAgQVNNX0MsIGhlYWRwdHItPmRsbG5hbWUpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc2RsbG5hbWUlZCVzXG4iLAotCSAgICAgICBBU01fUlZBX0JFRk9SRSwgbmhlYWRzLCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNsaXN0dHdvJWQlc1xuXG4iLAotCSAgICAgICBBU01fUlZBX0JFRk9SRSwgbmhlYWRzLCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIG5oZWFkcysrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIE5VTEwgcmVjb3JkIGF0ICovCi0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogZW5kIG9mIGlkYXRhJDIgKi8KLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBzZWN0aW9uICAgICAgICAqLwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ0XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCAibGlzdG9uZSVkOlxuIiwgaGVhZGluZGV4KTsKLSAgICAgIGZvciAoIGZ1bmNpbmRleCA9IDA7IGZ1bmNpbmRleCA8IGhlYWRwdHItPm5mdW5jczsgZnVuY2luZGV4KysgKQotCWZwcmludGYgKGZpbHZhciwgIlx0JXNmdW5jcHRyJWRfJWQlc1xuIiwKLQkJIEFTTV9SVkFfQkVGT1JFLCBoZWFkaW5kZXgsIGZ1bmNpbmRleCwgQVNNX1JWQV9BRlRFUik7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogTlVMTCB0ZXJtaW5hdGluZyBsaXN0ICovCi0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNVxuIik7Ci0gIGhlYWRpbmRleCA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgImxpc3R0d28lZDpcbiIsIGhlYWRpbmRleCk7Ci0gICAgICBmb3IgKCBmdW5jaW5kZXggPSAwOyBmdW5jaW5kZXggPCBoZWFkcHRyLT5uZnVuY3M7IGZ1bmNpbmRleCsrICkKLQlmcHJpbnRmIChmaWx2YXIsICJcdCVzZnVuY3B0ciVkXyVkJXNcbiIsCi0JCSBBU01fUlZBX0JFRk9SRSwgaGVhZGluZGV4LCBmdW5jaW5kZXgsIEFTTV9SVkFfQUZURVIpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBOVUxMIHRlcm1pbmF0aW5nIGxpc3QgKi8KLSAgICAgIGhlYWRpbmRleCsrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ2XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnVuY2luZGV4ID0gMDsKLSAgICAgIGZvciAoZnVuY3B0ciA9IGhlYWRwdHItPmZ1bmNoZWFkOyBmdW5jcHRyICE9IE5VTEw7Ci0JICAgZnVuY3B0ciA9IGZ1bmNwdHItPm5leHQpCi0JewotCSAgZnByaW50ZiAoZmlsdmFyLCJmdW5jcHRyJWRfJWQ6XG4iLCBoZWFkaW5kZXgsIGZ1bmNpbmRleCk7Ci0JICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdCVkXG4iLCBBU01fU0hPUlQsCi0JCSAgICgoZnVuY3B0ci0+b3JkKSAmIDB4RkZGRikpOwotCSAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCBmdW5jcHRyLT5uYW1lKTsKLQkgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0MFxuIiwgQVNNX0JZVEUpOwotCSAgZnVuY2luZGV4Kys7Ci0JfQotICAgICAgaGVhZGluZGV4Kys7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDdcbiIpOwotICBoZWFkaW5kZXggPSAwOwotICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsImRsbG5hbWUlZDpcbiIsIGhlYWRpbmRleCk7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIGhlYWRwdHItPmRsbG5hbWUpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQwXG4iLCBBU01fQllURSk7Ci0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZXhwX2ZpbGUgKCkKLXsKLSAgRklMRSAqZjsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0gIGRsaXN0X3R5cGUgKmRsOwotICBjaGFyICpjbWQ7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJHZW5lcmF0aW5nIGV4cG9ydCBmaWxlOiAlc1xuIiksIGV4cF9uYW1lKTsKLSAgCi0gIGYgPSBmb3BlbiAoVE1QX0FTTSwgRk9QRU5fV1QpOwotICBpZiAoIWYpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlOiAlcyIpLCBUTVBfQVNNKTsKLSAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiT3BlbmVkIHRlbXBvcmFyeSBmaWxlOiAlcyIpLCBUTVBfQVNNKTsKLQotICBkdW1wX2RlZl9pbmZvIChmKTsKLSAgCi0gIGlmIChkX2V4cG9ydHMpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmVkYXRhXG5cbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJMAklcyBBbGx3YXlzIDBcbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwkweCVseAklcyBUaW1lIGFuZCBkYXRlXG4iLCBBU01fTE9ORywgKGxvbmcpIHRpbWUoMCksCi0JICAgICAgIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCTAJJXMgTWFqb3IgYW5kIE1pbm9yIHZlcnNpb25cbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc25hbWUlcwklcyBQdHIgdG8gbmFtZSBvZiBkbGxcbiIsIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBTdGFydGluZyBvcmRpbmFsIG9mIGV4cG9ydHNcbiIsIEFTTV9MT05HLCBkX2xvd19vcmQsIEFTTV9DKTsKLQotCi0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBOdW1iZXIgb2YgZnVuY3Rpb25zXG4iLCBBU01fTE9ORywgZF9oaWdoX29yZCAtIGRfbG93X29yZCArIDEsIEFTTV9DKTsKLSAgICAgIGZwcmludGYoZiwiXHQlcyBuYW1lZCBmdW5jcyAlZCwgbG93IG9yZCAlZCwgaGlnaCBvcmQgJWRcbiIsCi0JICAgICAgQVNNX0MsCi0JICAgICAgZF9uYW1lZF9uZnVuY3MsIGRfbG93X29yZCwgZF9oaWdoX29yZCk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBOdW1iZXIgb2YgbmFtZXNcbiIsIEFTTV9MT05HLAotCSAgICAgICBzaG93X2FsbG5hbWVzID8gZF9oaWdoX29yZCAtIGRfbG93X29yZCArIDEgOiBkX25hbWVkX25mdW5jcywgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNhZnVuY3MlcyAgJXMgQWRkcmVzcyBvZiBmdW5jdGlvbnNcbiIsIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzYW5hbWVzJXMJJXMgQWRkcmVzcyBvZiBOYW1lIFBvaW50ZXIgVGFibGVcbiIsCi0JICAgICAgIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzYW5vcmRzJXMJJXMgQWRkcmVzcyBvZiBvcmRpbmFsc1xuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIm5hbWU6CSVzCVwiJXNcIlxuIiwgQVNNX1RFWFQsIGRsbF9uYW1lKTsKLQotCi0gICAgICBmcHJpbnRmKGYsIiVzIEV4cG9ydCBhZGRyZXNzIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmKGYsIlx0JXNcbiIsIEFTTV9BTElHTl9MT05HKTsKLSAgICAgIGZwcmludGYgKGYsICJhZnVuY3M6XG4iKTsKLSAgICAgIGkgPSBkX2xvd19vcmQ7Ci0KLSAgICAgIGZvciAoZXhwID0gZF9leHBvcnRzOyBleHA7IGV4cCA9IGV4cC0+bmV4dCkKLQl7Ci0JICBpZiAoZXhwLT5vcmRpbmFsICE9IGkpCi0JICAgIHsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVkXHQlcyAlZC4uJWQgbWlzc2luZ1xuIiwKLQkJICAgICAgIEFTTV9TUEFDRSwKLQkJICAgICAgIChleHAtPm9yZGluYWwgLSBpKSAqIDQsCi0JCSAgICAgICBBU01fQywKLQkJICAgICAgIGksIGV4cC0+b3JkaW5hbCAtIDEpOwotCSAgICAgIGkgPSBleHAtPm9yZGluYWw7Ci0jZW5kaWYKLQkgICAgICB3aGlsZSAoaSA8IGV4cC0+b3JkaW5hbCkKLQkJewotCQkgIGZwcmludGYoZiwiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotCQkgIGkrKzsKLQkJfQotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiXHQlcyVzJXMlc1x0JXMgJWRcbiIsIEFTTV9SVkFfQkVGT1JFLAotICAgICAgICAgICAgICAgICAgIEFTTV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgICAgZXhwLT5pbnRlcm5hbF9uYW1lLCBBU01fUlZBX0FGVEVSLCBBU01fQywgZXhwLT5vcmRpbmFsKTsKLQkgIGkrKzsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGYsIiVzIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJhbmFtZXM6XG4iKTsKLQotICAgICAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCi0JewotCSAgaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCSAgICBmcHJpbnRmIChmLCAiXHQlc24lZCVzXG4iLAotCQkgICAgIEFTTV9SVkFfQkVGT1JFLCBleHAtPm9yZGluYWwsIEFTTV9SVkFfQUZURVIpOwotCX0KLQotICAgICAgZnByaW50ZiAoZiwiJXMgRXhwb3J0IE9yaWRpbmFsIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiYW5vcmRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLQl7Ci0JICBpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICAgIGZwcmludGYgKGYsICJcdCVzCSVkXG4iLCBBU01fU0hPUlQsIGV4cC0+b3JkaW5hbCAtIGRfbG93X29yZCk7Ci0JfQotCi0gICAgICBmcHJpbnRmKGYsIiVzIEV4cG9ydCBOYW1lIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLQlpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICBmcHJpbnRmIChmLCAibiVkOgklcwlcIiVzXCJcbiIsCi0JCSAgIGV4cC0+b3JkaW5hbCwgQVNNX1RFWFQsIGV4cC0+bmFtZSk7Ci0KLSAgICAgIGlmIChhX2xpc3QpCi0JewotCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24gJXNcbiIsIERSRUNUVkVfU0VDVElPTl9OQU1FKTsKLQkgIGZvciAoZGwgPSBhX2xpc3Q7IGRsOyBkbCA9IGRsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIGRsLT50ZXh0KTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgaWYgKGRfbGlzdCkKLQl7Ci0JICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbiAucmRhdGFcbiIpOwotCSAgZm9yIChkbCA9IGRfbGlzdDsgZGw7IGRsID0gZGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBjaGFyICpwOwotCSAgICAgIGludCBsOwotCSAgICAgIC8qIFdlIGRvbnQgb3V0cHV0IGFzIGFzY2lpICdjYXVzZSB0aGVyZSBjYW4KLQkgICAgICAgICBiZSBxdW90ZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgKi8KLQotCSAgICAgIGwgPSAwOwotCSAgICAgIGZvciAocCA9IGRsLT50ZXh0OyAqcDsgcCsrKQotCQl7Ci0JCSAgaWYgKGwgPT0gMCkKLQkJICAgIGZwcmludGYgKGYsICJcdCVzXHQiLCBBU01fQllURSk7Ci0JCSAgZWxzZQotCQkgICAgZnByaW50ZiAoZiwgIiwiKTsKLQkJICBmcHJpbnRmIChmLCAiJWQiLCAqcCk7Ci0JCSAgaWYgKHBbMV0gPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZiwgIiwwXG4iKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgaWYgKCsrbCA9PSAxMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZiwgIlxuIik7Ci0JCSAgICAgIGwgPSAwOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0KLSAgLyogQWRkIHRvIHRoZSBvdXRwdXQgZmlsZSBhIHdheSBvZiBnZXR0aW5nIHRvIHRoZSBleHBvcnRlZCBuYW1lcwotICAgICB3aXRob3V0IHVzaW5nIHRoZSBpbXBvcnQgbGlicmFyeS4gKi8KLSAgaWYgKGFkZF9pbmRpcmVjdCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LnJkYXRhXG4iKTsKLSAgICAgIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLQlpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICB7Ci0JICAgIC8qIFdlIHVzZSBhIHNpbmdsZSB1bmRlcnNjb3JlIGZvciBNUyBjb21wYXRpYmlsaXR5LCBhbmQgYQotICAgICAgICAgICAgICAgZG91YmxlIHVuZGVyc2NvcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQKLSAgICAgICAgICAgICAgIGN5Z3dpbiByZWxlYXNlcy4gICovCi0JICAgIGZwcmludGYgKGYsICJcdCVzXHRfX2ltcF8lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKLQkgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9pbXBfXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotCSAgICBmcHJpbnRmIChmLCAiX19pbXBfJXM6XG4iLCBleHAtPm5hbWUpOwotCSAgICBmcHJpbnRmIChmLCAiX2ltcF9fJXM6XG4iLCBleHAtPm5hbWUpOwotCSAgICBmcHJpbnRmIChmLCAiXHQlc1x0JXNcbiIsIEFTTV9MT05HLCBleHAtPm5hbWUpOwotCSAgfQotICAgIH0KLQotICAvKiBEdW1wIHRoZSByZWxvYyBzZWN0aW9uIGlmIGEgYmFzZSBmaWxlIGlzIHByb3ZpZGVkICovCi0gIGlmIChiYXNlX2ZpbGUpCi0gICAgewotICAgICAgaW50IGFkZHI7Ci0gICAgICBsb25nIG5lZWRbUEFHRV9TSVpFXTsKLSAgICAgIGxvbmcgcGFnZV9hZGRyOwotICAgICAgaW50IG51bWJ5dGVzOwotICAgICAgaW50IG51bV9lbnRyaWVzOwotICAgICAgbG9uZyAqY29weTsKLSAgICAgIGludCBqOwotICAgICAgaW50IG9uX3BhZ2U7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmluaXRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgImxhYjpcbiIpOwotCi0gICAgICBmc2VlayAoYmFzZV9maWxlLCAwLCBTRUVLX0VORCk7Ci0gICAgICBudW1ieXRlcyA9IGZ0ZWxsIChiYXNlX2ZpbGUpOwotICAgICAgZnNlZWsgKGJhc2VfZmlsZSwgMCwgU0VFS19TRVQpOwotICAgICAgY29weSA9IHhtYWxsb2MgKG51bWJ5dGVzKTsKLSAgICAgIGZyZWFkIChjb3B5LCAxLCBudW1ieXRlcywgYmFzZV9maWxlKTsKLSAgICAgIG51bV9lbnRyaWVzID0gbnVtYnl0ZXMgLyBzaXplb2YgKGxvbmcpOwotCi0KLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQucmVsb2NcbiIpOwotICAgICAgaWYgKG51bV9lbnRyaWVzKQotCXsKLQkgIGludCBzcmM7Ci0JICBpbnQgZHN0ID0gMDsKLQkgIGludCBsYXN0ID0gLTE7Ci0JICBxc29ydCAoY29weSwgbnVtX2VudHJpZXMsIHNpemVvZiAobG9uZyksIHNmdW5jKTsKLQkgIC8qIERlbGV0ZSBkdXBsY2F0ZXMgKi8KLQkgIGZvciAoc3JjID0gMDsgc3JjIDwgbnVtX2VudHJpZXM7IHNyYysrKQotCSAgICB7Ci0JICAgICAgaWYgKGxhc3QgIT0gY29weVtzcmNdKQotCQlsYXN0ID0gY29weVtkc3QrK10gPSBjb3B5W3NyY107Ci0JICAgIH0KLQkgIG51bV9lbnRyaWVzID0gZHN0OwotCSAgYWRkciA9IGNvcHlbMF07Ci0JICBwYWdlX2FkZHIgPSBhZGRyICYgUEFHRV9NQVNLOwkJLyogd29yayBvdXQgdGhlIHBhZ2UgYWRkciAqLwotCSAgb25fcGFnZSA9IDA7Ci0JICBmb3IgKGogPSAwOyBqIDwgbnVtX2VudHJpZXM7IGorKykKLQkgICAgewotCSAgICAgIGFkZHIgPSBjb3B5W2pdOwotCSAgICAgIGlmICgoYWRkciAmIFBBR0VfTUFTSykgIT0gcGFnZV9hZGRyKQotCQl7Ci0JCSAgZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKTsKLQkJICBvbl9wYWdlID0gMDsKLQkJICBwYWdlX2FkZHIgPSBhZGRyICYgUEFHRV9NQVNLOwotCQl9Ci0JICAgICAgbmVlZFtvbl9wYWdlKytdID0gYWRkcjsKLQkgICAgfQotCSAgZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKTsKLQotLyoJICBmcHJpbnRmIChmLCAiXHQlc1x0MCwwXHQlcyBFbmRcbiIsIEFTTV9MT05HLCBBU01fQyk7Ki8KLQl9Ci0gICAgfQotCi0gIGdlbmVyYXRlX2lkYXRhX29maWxlIChmKTsKLQotICBmY2xvc2UgKGYpOwotCi0gIC8qIGFzc2VtYmxlIHRoZSBmaWxlICovCi0gIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChhc19mbGFncykgKyBzdHJsZW4gKGV4cF9uYW1lKQotCQkJICsgc2l6ZW9mIFRNUF9BU00gKyA1MCk7Ci0gIHNwcmludGYgKGNtZCwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIGV4cF9uYW1lLCBUTVBfQVNNKTsKLQotI2lmZGVmIERMTFRPT0xfQVJNCi0gIGlmIChtYWNoaW5lID09IE1BUk1fSU5URVJXT1JLIHx8IG1hY2hpbmUgPT0gTVRIVU1CKQotICAgIHN0cmNhdCAoY21kLCAiIC1tdGh1bWItaW50ZXJ3b3JrIik7Ci0jZW5kaWYKLQotICBydW4gKGFzX25hbWUsIGNtZCk7Ci0KLSAgaWYgKGRvbnRkZWx0ZW1wcyA9PSAwKQotICAgIHVubGluayAoVE1QX0FTTSk7Ci0gIAotICBpbmZvcm0gKF8oIkdlbmVyYXRlZCBleHBvcnRzIGZpbGUiKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXhsYXRlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoYWRkX3VuZGVyc2NvcmUpCi0gICAgewotICAgICAgY2hhciAqY29weSA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyKTsKLSAgICAgIGNvcHlbMF0gPSAnXyc7Ci0gICAgICBzdHJjcHkgKGNvcHkgKyAxLCBuYW1lKTsKLSAgICAgIG5hbWUgPSBjb3B5OwotICAgIH0KLQotICBpZiAoa2lsbGF0KQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCAnQCcpOwotICAgICAgaWYgKHApCi0JKnAgPSAwOwotICAgIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotZHVtcF9pYXQgKGYsIGV4cCkKLSAgICAgRklMRSAqZjsKLSAgICAgZXhwb3J0X3R5cGUgKmV4cDsKLXsKLSAgaWYgKGV4cC0+bm9uYW1lICYmICFzaG93X2FsbG5hbWVzICkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MHglMDh4XG4iLAotCSAgICAgICBBU01fTE9ORywKLQkgICAgICAgZXhwLT5vcmRpbmFsIHwgMHg4MDAwMDAwMCk7IC8qIGhpbnQgb3Igb3JpbmRhbCA/PyAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzSUQlZCVzXG4iLCBBU01fUlZBX0JFRk9SRSwKLQkgICAgICAgZXhwLT5vcmRpbmFsLAotCSAgICAgICBBU01fUlZBX0FGVEVSKTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdAotewotICBpbnQgaWQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGludCBmbGFnczsKLSAgaW50IGFsaWduOwotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0gIGFzeW1ib2wgKipzeW1wcDsKLSAgaW50IHNpemU7Ci0gIHVuc2lnbmVkICAgY2hhciAqZGF0YTsKLX0gc2luZm87Ci0KLSNpZm5kZWYgRExMVE9PTF9QUEMKLQotI2RlZmluZSBURVhUIDAKLSNkZWZpbmUgREFUQSAxCi0jZGVmaW5lIEJTUyAyCi0jZGVmaW5lIElEQVRBNyAzCi0jZGVmaW5lIElEQVRBNSA0Ci0jZGVmaW5lIElEQVRBNCA1Ci0jZGVmaW5lIElEQVRBNiA2Ci0KLSNkZWZpbmUgTlNFQ1MgNwotCi1zdGF0aWMgc2luZm8gc2VjZGF0YVtOU0VDU10gPQotewotICB7IFRFWFQsICAgIi50ZXh0IiwgICAgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTLCAyfSwKLSAgeyBEQVRBLCAgICIuZGF0YSIsICAgIFNFQ19EQVRBLCAgICAgICAgICAgICAgICAgICAgMn0sCi0gIHsgQlNTLCAgICAiLmJzcyIsICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNywgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTUsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNiwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAxfQotfTsKLQotI2Vsc2UKLQotLyogU2VjdGlvbnMgbnVtYmVyZWQgdG8gbWFrZSB0aGUgb3JkZXIgdGhlIHNhbWUgYXMgb3RoZXIgUG93ZXJQQyBOVCAgICAqLwotLyogY29tcGlsZXJzLiBUaGlzIGFsc28ga2VlcHMgZnVubnkgYWxpZ25tZW50IHRoaW5naWVzIGZyb20gaGFwcGVuaW5nLiAqLwotI2RlZmluZSBURVhUICAgMAotI2RlZmluZSBQREFUQSAgMQotI2RlZmluZSBSREFUQSAgMgotI2RlZmluZSBJREFUQTUgMwotI2RlZmluZSBJREFUQTQgNAotI2RlZmluZSBJREFUQTYgNQotI2RlZmluZSBJREFUQTcgNgotI2RlZmluZSBEQVRBICAgNwotI2RlZmluZSBCU1MgICAgOAotCi0jZGVmaW5lIE5TRUNTIDkKLQotc3RhdGljIHNpbmZvIHNlY2RhdGFbTlNFQ1NdID0KLXsKLSAgeyBURVhULCAgICIudGV4dCIsICAgIFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUywgM30sCi0gIHsgUERBVEEsICAiLnBkYXRhIiwgICBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IFJEQVRBLCAgIi5yZWxkYXRhIiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTUsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNiwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAxfSwKLSAgeyBJREFUQTcsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgREFUQSwgICAiLmRhdGEiLCAgICBTRUNfREFUQSwgICAgICAgICAgICAgICAgICAgIDJ9LAotICB7IEJTUywgICAgIi5ic3MiLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAyfQotfTsKLQotI2VuZGlmCi0KLS8qCi1UaGlzIGlzIHdoYXQgd2UncmUgdHJ5aW5nIHRvIG1ha2UuICBXZSBnZW5lcmF0ZSB0aGUgaW1wIHN5bWJvbHMgd2l0aAotYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB1bmRlcnNjb3JlcywgZm9yIGNvbXBhdGliaWxpdHkuCi0KLQkudGV4dAotCS5nbG9iYWwJX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLQkuZ2xvYmFsCV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLV9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4OgotCWptcCAqCV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLQkuc2VjdGlvbgkuaWRhdGEkNwkjIFRvIGZvcmNlIGxvYWRpbmcgb2YgaGVhZAotCS5sb25nCV9fdmVyc2lvbl9hX2hlYWQKLSMgSW1wb3J0IEFkZHJlc3MgVGFibGUKLQkuc2VjdGlvbgkuaWRhdGEkNQotX19pbXBfR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAODoKLQkucnZhCUlEMgotCi0jIEltcG9ydCBMb29rdXAgVGFibGUKLQkuc2VjdGlvbgkuaWRhdGEkNAotCS5ydmEJSUQyCi0jIEhpbnQvTmFtZSB0YWJsZQotCS5zZWN0aW9uCS5pZGF0YSQ2Ci1JRDI6CS5zaG9ydAkyCi0JLmFzY2l6CSJHZXRGaWxlVmVyc2lvbkluZm9TaXplVyIKLQotCi1Gb3IgdGhlIFBvd2VyUEMsIGhlcmUncyB0aGUgdmFyaWF0aW9uIG9uIHRoZSBhYm92ZSBzY2hlbWU6Ci0KLSMgUmF0aGVyIHRoYW4gYSBzaW1wbGUgImptcCAqIiwgdGhlIGNvZGUgdG8gZ2V0IHRvIHRoZSBkbGwgZnVuY3Rpb24KLSMgbG9va3MgbGlrZToKLSAgICAgICAgIC50ZXh0Ci0gICAgICAgICBsd3oJcjExLFt0b2N2XV9faW1wX2Z1bmN0aW9uX25hbWUocjIpCi0jCQkgICBSRUxPQzogMDAwMDAwMDAgVE9DUkVMMTYsVE9DREVGTiBfX2ltcF9mdW5jdGlvbl9uYW1lCi0gICAgICAgICBsd3oJcjEyLDAocjExKQotCSBzdHcJcjIsNChyMSkKLQkgbXRjdHIJcjEyCi0JIGx3eglyMiw0KHIxMSkKLQkgYmN0cgotKi8KLQotc3RhdGljIGNoYXIgKgotbWFrZV9sYWJlbCAocHJlZml4LCBuYW1lKQotICAgICBjb25zdCBjaGFyICpwcmVmaXg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBsZW4gPSBzdHJsZW4gKEFTTV9QUkVGSVgpICsgc3RybGVuIChwcmVmaXgpICsgc3RybGVuIChuYW1lKTsKLSAgY2hhciAqY29weSA9IHhtYWxsb2MgKGxlbiArMSApOwotICBzdHJjcHkgKGNvcHksIEFTTV9QUkVGSVgpOwotICBzdHJjYXQgKGNvcHksIHByZWZpeCk7Ci0gIHN0cmNhdCAoY29weSwgbmFtZSk7Ci0gIHJldHVybiBjb3B5OwotfQotCi1zdGF0aWMgYmZkICoKLW1ha2Vfb25lX2xpYl9maWxlIChleHAsIGkpCi0gICAgIGV4cG9ydF90eXBlICpleHA7Ci0gICAgIGludCBpOwotewotI2lmIDAKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgRklMRSAqZjsKLSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICJkIjsKLSAgICAgIGNoYXIgKmNtZDsKLQotICAgICAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChwcmVmaXgpICsgMTApOwotICAgICAgc3ByaW50ZiAobmFtZSwgIiVzcyUwNWQucyIsIHByZWZpeCwgaSk7Ci0gICAgICBmID0gZm9wZW4gKG5hbWUsIEZPUEVOX1dUKTsKLSAgICAgIGZwcmludGYgKGYsICJcdC50ZXh0XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQlcyVzXG4iLCBBU01fR0xPQkFMLCBBU01fUFJFRklYLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9faW1wXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9pbXBfXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIiVzJXM6XG5cdCVzXHRfX2ltcF8lc1xuIiwgQVNNX1BSRUZJWCwKLQkgICAgICAgZXhwLT5uYW1lLCBBU01fSlVNUCwgZXhwLT5uYW1lKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pZGF0YSQ3XHQlcyBUbyBmb3JjZSBsb2FkaW5nIG9mIGhlYWRcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQlc1xuIiwgQVNNX0xPTkcsIGhlYWRfbGFiZWwpOwotCi0KLSAgICAgIGZwcmludGYgKGYsIiVzIEltcG9ydCBBZGRyZXNzIFRhYmxlXG4iLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ1XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJfX2ltcF8lczpcbiIsIGV4cC0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChmLCAiX2ltcF9fJXM6XG4iLCBleHAtPm5hbWUpOwotCi0gICAgICBkdW1wX2lhdCAoZiwgZXhwKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlxuJXMgSW1wb3J0IExvb2t1cCBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotCi0gICAgICBkdW1wX2lhdCAoZiwgZXhwKTsKLQotICAgICAgaWYoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JewotCSAgZnByaW50ZiAoZiwgIiVzIEhpbnQvTmFtZSB0YWJsZVxuIiwgQVNNX0MpOwotCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDZcbiIpOwotCSAgZnByaW50ZiAoZiwgIklEJWQ6XHQlc1x0JWRcbiIsIGV4cC0+b3JkaW5hbCwgQVNNX1NIT1JULCBleHAtPmhpbnQpOwotCSAgZnByaW50ZiAoZiwgIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIHhsYXRlIChleHAtPm5hbWUpKTsKLQl9Ci0KLSAgICAgIGZjbG9zZSAoZik7Ci0KLSAgICAgIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChhc19mbGFncykgKyAyICogc3RybGVuIChwcmVmaXgpICsgNTApOwotICAgICAgc3ByaW50ZiAoY21kLCAiJXMgLW8gJXNzJTA1ZC5vICVzcyVkLnMiLAotCSAgICAgICBhc19mbGFncywgcHJlZml4LCBpLCBwcmVmaXgsIGkpOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSAgICAgIGlmIChtYWNoaW5lID09IE1BUk1fSU5URVJXT1JLIHx8IG1hY2hpbmUgPT0gTVRIVU1CKQotCXN0cmNhdCAoY21kLCAiIC1tdGh1bWItaW50ZXJ3b3JrIik7Ci0jZW5kaWYKLSAgCi0gICAgICBydW4gKGFzX25hbWUsIGNtZCk7Ci0gICAgfQotI2Vsc2UgLyogaWYgMCAqLwotICAgIHsKLSAgICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgIGFzeW1ib2wgKiAgZXhwX2xhYmVsOwotICAgICAgYXN5bWJvbCAqICBpbmFtZTsKLSAgICAgIGFzeW1ib2wgKiAgaW5hbWUyOwotICAgICAgYXN5bWJvbCAqICBpbmFtZV9sYWI7Ci0gICAgICBhc3ltYm9sICoqIGluYW1lX2xhYl9wcDsKLSAgICAgIGFzeW1ib2wgKiogaW5hbWVfcHA7Ci0jaWZkZWYgRExMVE9PTF9QUEMKLSAgICAgIGFzeW1ib2wgKiogZm5fcHA7Ci0gICAgICBhc3ltYm9sICoqIHRvY19wcDsKLSNkZWZpbmUgRVhUUkEJIDIKLSNlbmRpZgotI2lmbmRlZiBFWFRSQQotI2RlZmluZSBFWFRSQSAgICAwCi0jZW5kaWYKLSAgICAgIGFzeW1ib2wgKiAgcHRyc1tOU0VDUyArIDQgKyBFWFRSQSArIDFdOwotCi0gICAgICBjaGFyICogICAgIG91dG5hbWUgPSB4bWFsbG9jICgxMCk7Ci0gICAgICBpbnQgICAgICAgIG9pZHggPSAwOwotCi0gICAgICAKLSAgICAgIHNwcmludGYgKG91dG5hbWUsICIlcyUwNWQubyIsIFRNUF9TVFVCLCBpKTsKLSAgICAgIAotICAgICAgYWJmZCA9IGJmZF9vcGVudyAob3V0bmFtZSwgSE9XX0JGRF9UQVJHRVQpOwotICAgICAgCi0gICAgICBpZiAoIWFiZmQpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmYXRhbCAoXygiYmZkX29wZW4gZmFpbGVkIG9wZW4gc3R1YiBmaWxlOiAlcyIpLCBvdXRuYW1lKTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGluZm9ybSAoXygiQ3JlYXRpbmcgc3R1YiBmaWxlOiAlcyIpLCBvdXRuYW1lKTsKLSAgICAgIAotICAgICAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICAgICAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIEhPV19CRkRfQVJDSCwgMCk7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotICAgICAgaWYgKG1hY2hpbmUgPT0gTUFSTV9JTlRFUldPUksgfHwgbWFjaGluZSA9PSBNVEhVTUIpCi0JYmZkX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBGX0lOVEVSV09SSyk7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgLyogRmlyc3QgbWFrZSBzeW1ib2xzIGZvciB0aGUgc2VjdGlvbnMgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCXsKLQkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCSAgaWYgKHNpLT5pZCAhPSBpKQotCSAgICBhYm9ydCgpOwotCSAgc2ktPnNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgc2ktPm5hbWUpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCSBzaS0+c2VjLAotCQkJCSBzaS0+ZmxhZ3MpOwotCi0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGFiZmQsIHNpLT5zZWMsIHNpLT5hbGlnbik7Ci0JICBzaS0+c2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNpLT5zZWM7Ci0JICBzaS0+c3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotCSAgc2ktPnN5bS0+bmFtZSA9IHNpLT5zZWMtPm5hbWU7Ci0JICBzaS0+c3ltLT5zZWN0aW9uID0gc2ktPnNlYzsKLQkgIHNpLT5zeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgc2ktPnN5bS0+dmFsdWUgPSAwOwotCSAgcHRyc1tvaWR4XSA9IHNpLT5zeW07Ci0JICBzaS0+c3ltcHAgPSBwdHJzICsgb2lkeDsKLQkgIHNpLT5zaXplID0gMDsKLQkgIHNpLT5kYXRhID0gTlVMTDsKLQotCSAgb2lkeCsrOwotCX0KLQotICAgICAgaWYgKCEgZXhwLT5kYXRhKQotCXsKLQkgIGV4cF9sYWJlbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0JICBleHBfbGFiZWwtPm5hbWUgPSBtYWtlX2xhYmVsICgiIiwgZXhwLT5uYW1lKTsKLQotCSAgLyogT24gUG93ZXJQQywgdGhlIGZ1bmN0aW9uIG5hbWUgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBpbgotCSAgICAgdGhlIHJkYXRhIHNlY3Rpb24sIHRoZSBmaXJzdCBlbGVtZW50IG9mIHdoaWNoIGlzIGEKLQkgICAgIHBvaW50ZXIgdG8gdGhlIGNvZGUgKC4uZnVuY3Rpb25fbmFtZSksIGFuZCB0aGUgc2Vjb25kCi0JICAgICBwb2ludHMgdG8gdGhlIC50b2MgKi8KLSNpZmRlZiBETExUT09MX1BQQwotCSAgaWYgKG1hY2hpbmUgPT0gTVBQQykKLQkgICAgZXhwX2xhYmVsLT5zZWN0aW9uID0gc2VjZGF0YVtSREFUQV0uc2VjOwotCSAgZWxzZQotI2VuZGlmCi0JICAgIGV4cF9sYWJlbC0+c2VjdGlvbiA9IHNlY2RhdGFbVEVYVF0uc2VjOwotCi0JICBleHBfbGFiZWwtPmZsYWdzID0gQlNGX0dMT0JBTDsKLQkgIGV4cF9sYWJlbC0+dmFsdWUgPSAwOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLQkgIGlmIChtYWNoaW5lID09IE1USFVNQikKLQkgICAgYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyAoYWJmZCwgZXhwX2xhYmVsLCBDX1RIVU1CRVhURlVOQyk7Ci0jZW5kaWYKLQkgIHB0cnNbb2lkeCsrXSA9IGV4cF9sYWJlbDsKLQl9Ci0KLSAgICAgIC8qIEdlbmVyYXRlIGltcCBzeW1ib2xzIHdpdGggb25lIHVuZGVyc2NvcmUgZm9yIE1pY3Jvc29mdAotICAgICAgICAgY29tcGF0aWJpbGl0eSwgYW5kIHdpdGggdHdvIHVuZGVyc2NvcmVzIGZvciBiYWNrd2FyZAotICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBjeWd3aW4uICAqLwotICAgICAgaW5hbWUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0gICAgICBpbmFtZS0+bmFtZSA9IG1ha2VfbGFiZWwgKCJfX2ltcF8iLCBleHAtPm5hbWUpOwotICAgICAgaW5hbWUtPnNlY3Rpb24gPSBzZWNkYXRhW0lEQVRBNV0uc2VjOwotICAgICAgaW5hbWUtPmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIGluYW1lLT52YWx1ZSA9IDA7Ci0KLSAgICAgIGluYW1lMiA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLSAgICAgIGluYW1lMi0+bmFtZSA9IG1ha2VfbGFiZWwgKCJfaW1wX18iLCBleHAtPm5hbWUpOwotICAgICAgaW5hbWUyLT5zZWN0aW9uID0gc2VjZGF0YVtJREFUQTVdLnNlYzsKLSAgICAgIGluYW1lMi0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICAgICAgaW5hbWUyLT52YWx1ZSA9IDA7Ci0KLSAgICAgIGluYW1lX2xhYiA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLQotICAgICAgaW5hbWVfbGFiLT5uYW1lID0gaGVhZF9sYWJlbDsKLSAgICAgIGluYW1lX2xhYi0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSZiZmRfdW5kX3NlY3Rpb247Ci0gICAgICBpbmFtZV9sYWItPmZsYWdzID0gMDsKLSAgICAgIGluYW1lX2xhYi0+dmFsdWUgPSAwOwotCi0KLSAgICAgIGluYW1lX3BwID0gcHRycyArIG9pZHg7Ci0gICAgICBwdHJzW29pZHgrK10gPSBpbmFtZTsKLSAgICAgIHB0cnNbb2lkeCsrXSA9IGluYW1lMjsKLQotICAgICAgaW5hbWVfbGFiX3BwID0gcHRycyArIG9pZHg7Ci0gICAgICBwdHJzW29pZHgrK10gPSBpbmFtZV9sYWI7Ci0KLSNpZmRlZiBETExUT09MX1BQQwotICAgICAgLyogVGhlIHN5bWJvbCByZWZlcmluZyB0byB0aGUgY29kZSAoLnRleHQpICovCi0gICAgICB7Ci0JYXN5bWJvbCAqZnVuY3Rpb25fbmFtZTsKLQotCWZ1bmN0aW9uX25hbWUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0JZnVuY3Rpb25fbmFtZS0+bmFtZSA9IG1ha2VfbGFiZWwgKCIuLiIsIGV4cC0+bmFtZSk7Ci0JZnVuY3Rpb25fbmFtZS0+c2VjdGlvbiA9IHNlY2RhdGFbVEVYVF0uc2VjOwotCWZ1bmN0aW9uX25hbWUtPmZsYWdzID0gQlNGX0dMT0JBTDsKLQlmdW5jdGlvbl9uYW1lLT52YWx1ZSA9IDA7Ci0KLQlmbl9wcCA9IHB0cnMgKyBvaWR4OwotCXB0cnNbb2lkeCsrXSA9IGZ1bmN0aW9uX25hbWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFRoZSAudG9jIHN5bWJvbCAqLwotICAgICAgewotCWFzeW1ib2wgKnRvY19zeW1ib2w7ICAgIC8qIFRoZSAudG9jIHN5bWJvbCAqLwotCi0JdG9jX3N5bWJvbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0JdG9jX3N5bWJvbC0+bmFtZSA9IG1ha2VfbGFiZWwgKCIuIiwgInRvYyIpOwotCXRvY19zeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikmYmZkX3VuZF9zZWN0aW9uOwotCXRvY19zeW1ib2wtPmZsYWdzID0gQlNGX0dMT0JBTDsKLQl0b2Nfc3ltYm9sLT52YWx1ZSA9IDA7Ci0KLQl0b2NfcHAgPSBwdHJzICsgb2lkeDsKLQlwdHJzW29pZHgrK10gPSB0b2Nfc3ltYm9sOwotICAgICAgfQotI2VuZGlmCi0gICAgICAKLSAgICAgIHB0cnNbb2lkeF0gPSAwOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKLQl7Ci0JICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKLQkgIGFzZWN0aW9uICpzZWMgPSBzaS0+c2VjOwotCSAgYXJlbGVudCAqcmVsOwotCSAgYXJlbGVudCAqKnJwcDsKLQotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgVEVYVDoKLQkgICAgICBpZiAoISBleHAtPmRhdGEpCi0JCXsKLQkJICBzaS0+c2l6ZSA9IEhPV19KVEFCX1NJWkU7Ci0JCSAgc2ktPmRhdGEgPSB4bWFsbG9jIChIT1dfSlRBQl9TSVpFKTsKLQkJICBtZW1jcHkgKHNpLT5kYXRhLCBIT1dfSlRBQiwgSE9XX0pUQUJfU0laRSk7Ci0KLQkJICAvKiBhZGQgdGhlIHJlbG9jIGludG8gaWRhdGEkNSAqLwotCQkgIHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQkgIAotCQkgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDIpOwotCQkgIHJwcFswXSA9IHJlbDsKLQkJICBycHBbMV0gPSAwOwotCQkgIAotCQkgIHJlbC0+YWRkcmVzcyA9IEhPV19KVEFCX1JPRkY7Ci0JCSAgcmVsLT5hZGRlbmQgPSAwOwotCi0JCSAgaWYgKG1hY2hpbmUgPT0gTVBQQykKLQkJICAgIHsKLQkJICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwKLQkJCQkJCQkgIEJGRF9SRUxPQ18xNl9HT1RPRkYpOwotCQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gaW5hbWVfcHA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gc2VjZGF0YVtJREFUQTVdLnN5bXBwOwotCQkgICAgfQotCQkgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JCSAgc2VjLT5yZWxvY19jb3VudCA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJREFUQTQ6Ci0JICAgIGNhc2UgSURBVEE1OgotCSAgICAgIC8qIEFuIGlkYXRhJDQgb3IgaWRhdGEkNSBpcyBvbmUgd29yZCBsb25nLCBhbmQgaGFzIGFuCi0JCSBydmEgdG8gaWRhdGEkNiAqLwotCi0JICAgICAgc2ktPmRhdGEgPSB4bWFsbG9jICg0KTsKLQkgICAgICBzaS0+c2l6ZSA9IDQ7Ci0KLQkgICAgICBpZiAoZXhwLT5ub25hbWUpCi0JCXsKLQkJICBzaS0+ZGF0YVswXSA9IGV4cC0+b3JkaW5hbCA7Ci0JCSAgc2ktPmRhdGFbMV0gPSBleHAtPm9yZGluYWwgPj4gODsKLQkJICBzaS0+ZGF0YVsyXSA9IGV4cC0+b3JkaW5hbCA+PiAxNjsKLQkJICBzaS0+ZGF0YVszXSA9IDB4ODA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzZWMtPnJlbG9jX2NvdW50ID0gMTsKLQkJICBtZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7Ci0JCSAgcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCSAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMik7Ci0JCSAgcnBwWzBdID0gcmVsOwotCQkgIHJwcFsxXSA9IDA7Ci0JCSAgcmVsLT5hZGRyZXNzID0gMDsKLQkJICByZWwtPmFkZGVuZCA9IDA7Ci0JCSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX1JWQSk7Ci0JCSAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlY2RhdGFbSURBVEE2XS5zeW1wcDsKLQkJICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIElEQVRBNjoKLQkgICAgICBpZiAoIWV4cC0+bm9uYW1lKQotCQl7Ci0JCSAgLyogVGhpcyB1c2VkIHRvIGFkZCAxIHRvIGV4cC0+aGludC4gIEkgZG9uJ3Qga25vdwotICAgICAgICAgICAgICAgICAgICAgd2h5IGl0IGRpZCB0aGF0LCBhbmQgaXQgZG9lcyBub3QgbWF0Y2ggd2hhdCBJIHNlZQotICAgICAgICAgICAgICAgICAgICAgaW4gcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCB0aGUgTVMgdG9vbHMuICAqLwotCQkgIGludCBpZHggPSBleHAtPmhpbnQ7Ci0JCSAgc2ktPnNpemUgPSBzdHJsZW4gKHhsYXRlIChleHAtPm5hbWUpKSArIDM7Ci0JCSAgc2ktPmRhdGEgPSB4bWFsbG9jIChzaS0+c2l6ZSk7Ci0JCSAgc2ktPmRhdGFbMF0gPSBpZHggJiAweGZmOwotCQkgIHNpLT5kYXRhWzFdID0gaWR4ID4+IDg7Ci0JCSAgc3RyY3B5IChzaS0+ZGF0YSArIDIsIHhsYXRlIChleHAtPm5hbWUpKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElEQVRBNzoKLQkgICAgICBzaS0+c2l6ZSA9IDQ7Ci0JICAgICAgc2ktPmRhdGEgPXhtYWxsb2MoNCk7Ci0JICAgICAgbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOwotCSAgICAgIHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCSAgICAgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDIpOwotCSAgICAgIHJwcFswXSA9IHJlbDsKLQkgICAgICByZWwtPmFkZHJlc3MgPSAwOwotCSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfUlZBKTsKLQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gaW5hbWVfbGFiX3BwOwotCSAgICAgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JICAgICAgc2VjLT5yZWxvY19jb3VudCA9IDE7Ci0JICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBETExUT09MX1BQQwotCSAgICBjYXNlIFBEQVRBOgotCSAgICAgIHsKLQkJLyogVGhlIC5wZGF0YSBzZWN0aW9uIGlzIDUgd29yZHMgbG9uZy4gKi8KLQkJLyogVGhpbmsgb2YgaXQgYXM6ICAgICAgICAgICAgICAgICAgICAgKi8KLQkJLyogc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJLyogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJLyogICBiZmRfdm1hIEJlZ2luQWRkcmVzcywgICAgIFsweDAwXSAgKi8KLQkJLyogICAgICAgICAgIEVuZEFkZHJlc3MsICAgICAgIFsweDA0XSAgKi8KLQkJLyoJICAgICBFeGNlcHRpb25IYW5kbGVyLCBbMHgwOF0gICovCi0JCS8qCSAgICAgSGFuZGxlckRhdGEsICAgICAgWzB4MGNdICAqLwotCQkvKgkgICAgIFByb2xvZ0VuZEFkZHJlc3M7IFsweDEwXSAgKi8KLQkJLyogfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCQkvKiBTbyB0aGlzIHBkYXRhIHNlY3Rpb24gc2V0dXBzIHVwIHRoaXMgYXMgYSBnbHVlIGxpbmthZ2UgdG8KLQkJICAgYSBkbGwgcm91dGluZS4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhvdXNlIGtlZXBpbmcgdGhpbmdzCi0JCSAgIHdlIG5lZWQgdG8gZG86Ci0KLQkJICAgMS4gSW4gdGhlIG5hbWUgb2YgZ2x1ZSB0cmlja2VyeSwgdGhlIEFERFIzMiByZWxvY3MgZm9yIDAsCi0JCSAgICAgIDQsIGFuZCAweDEwIGFyZSBzZXQgdG8gcG9pbnQgdG8gdGhlIHNhbWUgcGxhY2U6Ci0JCSAgICAgICIuLmZ1bmN0aW9uX25hbWUiLgotCQkgICAyLiBUaGVyZSBpcyBvbmUgbW9yZSByZWxvYyBuZWVkZWQgaW4gdGhlIHBkYXRhIHNlY3Rpb24uCi0JCSAgICAgIFRoZSBhY3R1YWwgZ2x1ZSBpbnN0cnVjdGlvbiB0byByZXN0b3JlIHRoZSB0b2Mgb24KLQkJICAgICAgcmV0dXJuIGlzIHNhdmVkIGFzIHRoZSBvZmZzZXQgaW4gYW4gSU1HTFVFIHJlbG9jLgotCQkgICAgICBTbyB3ZSBuZWVkIGEgdG90YWwgb2YgZm91ciByZWxvY3MgZm9yIHRoaXMgc2VjdGlvbi4KLQotCQkgICAzLiBMYXN0bHksIHRoZSBIYW5kbGVyRGF0YSBmaWVsZCBpcyBzZXQgdG8gMHgwMywgdG8gaW5kaWNhdGUKLQkJICAgICAgdGhhdCB0aGlzIGlzIGEgZ2x1ZSByb3V0aW5lLgotCQkqLwotCQlhcmVsZW50ICppbWdsdWUsICpiYV9yZWwsICplYV9yZWwsICpwZWFfcmVsOwotCi0JCS8qIGFsaWdubWVudCBtdXN0IGJlIHNldCB0byAyKioyIG9yIHlvdSBnZXQgZXh0cmEgc3R1ZmYgKi8KLQkJYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChhYmZkLCBzZWMsIDIpOwotCi0JCXNpLT5zaXplID0gNCAqIDU7Ci0JCXNpLT5kYXRhID14bWFsbG9jKDQgKiA1KTsKLQkJbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOwotCQlycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiA1KTsKLQkJcnBwWzBdID0gaW1nbHVlICA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQlycHBbMV0gPSBiYV9yZWwgID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCXJwcFsyXSA9IGVhX3JlbCAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJcnBwWzNdID0gcGVhX3JlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQlycHBbNF0gPSAwOwotCi0JCS8qIHN0aWNrIHRoZSB0b2MgcmVsb2FkIGluc3RydWN0aW9uIGluIHRoZSBnbHVlIHJlbG9jICovCi0JCWJmZF9wdXRfMzIoYWJmZCwgcHBjX2dsdWVfaW5zbiwgKGNoYXIgKikgJmltZ2x1ZS0+YWRkcmVzcyk7Ci0KLQkJaW1nbHVlLT5hZGRlbmQgPSAwOwotCQlpbWdsdWUtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLAotCQkJCQkJICAgICAgIEJGRF9SRUxPQ18zMl9HT1RPRkYpOwotCQlpbWdsdWUtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkJYmFfcmVsLT5hZGRyZXNzID0gMDsKLQkJYmFfcmVsLT5hZGRlbmQgPSAwOwotCQliYV9yZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCQliYV9yZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkJYmZkX3B1dF8zMihhYmZkLCAweDE4LCBzaS0+ZGF0YSArIDB4MDQpOwotCQllYV9yZWwtPmFkZHJlc3MgPSA0OwotCQllYV9yZWwtPmFkZGVuZCA9IDA7Ci0JCWVhX3JlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JCWVhX3JlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCQkvKiBtYXJrIGl0IGFzIGdsdWUgKi8KLQkJYmZkX3B1dF8zMihhYmZkLCAweDAzLCBzaS0+ZGF0YSArIDB4MGMpOwotCi0JCS8qIG1hcmsgdGhlIHByb2xvZyBlbmQgYWRkcmVzcyAqLwotCQliZmRfcHV0XzMyKGFiZmQsIDB4MEQsIHNpLT5kYXRhICsgMHgxMCk7Ci0JCXBlYV9yZWwtPmFkZHJlc3MgPSAweDEwOwotCQlwZWFfcmVsLT5hZGRlbmQgPSAwOwotCQlwZWFfcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJcGVhX3JlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCQlzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCQlzZWMtPnJlbG9jX2NvdW50ID0gNDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBjYXNlIFJEQVRBOgotCSAgICAgIC8qIEVhY2ggZXh0ZXJuYWwgZnVuY3Rpb24gaW4gYSBQb3dlclBDIFBFIGZpbGUgaGFzIGEgdHdvIHdvcmQKLQkJIGRlc2NyaXB0b3IgY29uc2lzdGluZyBvZjoKLQkJIDEuIFRoZSBhZGRyZXNzIG9mIHRoZSBjb2RlLgotCQkgMi4gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvcHJpYXRlIC50b2MKLQkgICAgICAgICBXZSB1c2UgcmVsb2NzIHRvIGJ1aWxkIHRoaXMuCi0JICAgICAgKi8KLQotCSAgICAgIHNpLT5zaXplID0gODsKLQkgICAgICBzaS0+ZGF0YSA9IHhtYWxsb2MgKDgpOwotCSAgICAgIG1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKLQotCSAgICAgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDMpOwotCSAgICAgIHJwcFswXSA9IHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCSAgICAgIHJwcFsxXSA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCSAgICAgIHJwcFsyXSA9IDA7Ci0KLQkgICAgICByZWwtPmFkZHJlc3MgPSAwOwotCSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCSAgICAgIHJlbCA9IHJwcFsxXTsKLQotCSAgICAgIHJlbC0+YWRkcmVzcyA9IDQ7Ci0JICAgICAgcmVsLT5hZGRlbmQgPSAwOwotCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHRvY19wcDsKLQotCSAgICAgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JICAgICAgc2VjLT5yZWxvY19jb3VudCA9IDI7Ci0JICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogRExMVE9PTF9QUEMgKi8KLQkgICAgfQotCX0KLQotICAgICAgewotCWJmZF92bWEgdm1hID0gMDsKLQkvKiBTaXplIHVwIGFsbCB0aGUgc2VjdGlvbnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKLQkgIHsKLQkgICAgc2luZm8gKnNpID0gc2VjZGF0YSArIGk7Ci0KLQkgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNpLT5zZWMsIHNpLT5zaXplKTsKLQkgICAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2ktPnNlYywgdm1hKTsKLQotLyoJICAgIHZtYSArPSBzaS0+c2l6ZTsqLwotCSAgfQotICAgICAgfQotICAgICAgLyogV3JpdGUgdGhlbSBvdXQgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCXsKLQkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCi0JICBpZiAoaSA9PSBJREFUQTUgJiYgbm9faWRhdGE1KQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGkgPT0gSURBVEE0ICYmIG5vX2lkYXRhNCkKLQkgICAgY29udGludWU7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2ktPnNlYywKLQkJCQkgICAgc2ktPmRhdGEsIDAsCi0JCQkJICAgIHNpLT5zaXplKTsKLQl9Ci0KLSAgICAgIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBwdHJzLCBvaWR4KTsKLSAgICAgIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICBhYmZkID0gYmZkX29wZW5yIChvdXRuYW1lLCBIT1dfQkZEX1RBUkdFVCk7Ci0gICAgICByZXR1cm4gYWJmZDsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGJmZCAqCi1tYWtlX2hlYWQgKCkKLXsKLSAgRklMRSAqZiA9IGZvcGVuIChUTVBfSEVBRF9TLCBGT1BFTl9XVCk7Ci0gIGNoYXIgKmNtZDsKLQotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZhdGFsIChfKCJmYWlsZWQgdG8gb3BlbiB0ZW1wb3JhcnkgaGVhZCBmaWxlOiAlcyIpLCBUTVBfSEVBRF9TKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIGZwcmludGYgKGYsICIlcyBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUlxuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkMlxuIik7Ci0KLSAgZnByaW50ZihmLCJcdCVzXHQlc1xuIiwgQVNNX0dMT0JBTCxoZWFkX2xhYmVsKTsKLQotICBmcHJpbnRmIChmLCAiJXM6XG4iLCBoZWFkX2xhYmVsKTsKLQotICBmcHJpbnRmIChmLCAiXHQlc2huYW1lJXNcdCVzUHRyIHRvIGltYWdlIGltcG9ydCBieSBuYW1lIGxpc3RcbiIsCi0JICAgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICBmcHJpbnRmIChmLCAiXHQlc3RoaXMgc2hvdWxkIGJlIHRoZSB0aW1lc3RhbXAsIGJ1dCBOVCBzb21ldGltZXNcbiIsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNkb2Vzbid0IGxvYWQgRExMcyB3aGVuIHRoaXMgaXMgc2V0LlxuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFx0JXMgbG9hZGVkIHRpbWVcbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXHQlcyBGb3J3YXJkZXIgY2hhaW5cbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzX18lc19pbmFtZSVzXHQlcyBpbXBvcnRlZCBkbGwncyBuYW1lXG4iLAotCSAgIEFTTV9SVkFfQkVGT1JFLAotCSAgIGltcF9uYW1lX2xhYiwKLQkgICBBU01fUlZBX0FGVEVSLAotCSAgIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNmdGh1bmslc1x0JXMgcG9pbnRlciB0byBmaXJzdHRodW5rXG4iLAotCSAgIEFTTV9SVkFfQkVGT1JFLAotCSAgIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICBmcHJpbnRmIChmLCAiJXNTdHVmZiBmb3IgY29tcGF0aWJpbGl0eVxuIiwgQVNNX0MpOwotCi0gIGlmICghbm9faWRhdGE1KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaWRhdGEkNVxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZiwgImZ0aHVuazpcbiIpOwotICAgIH0KLSAgCi0gIGlmICghbm9faWRhdGE0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaWRhdGEkNFxuIik7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNFxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiaG5hbWU6XG4iKTsKLSAgICB9Ci0gIAotICBmY2xvc2UgKGYpOwotCi0gIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChhc19mbGFncykgKyBzaXplb2YgVE1QX0hFQURfTwotCQkJICsgc2l6ZW9mIFRNUF9IRUFEX1MgKyA1MCk7Ci0gIHNwcmludGYgKGNtZCwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIFRNUF9IRUFEX08sIFRNUF9IRUFEX1MpOwotICAKLSNpZmRlZiBETExUT09MX0FSTQotICBpZiAobWFjaGluZSA9PSBNQVJNX0lOVEVSV09SSyB8fCBtYWNoaW5lID09IE1USFVNQikKLSAgICBzdHJjYXQgKGNtZCwgIiAtbXRodW1iLWludGVyd29yayIpOwotI2VuZGlmCi0gIAotICBydW4gKGFzX25hbWUsIGNtZCk7Ci0KLSAgcmV0dXJuIGJmZF9vcGVuciAoVE1QX0hFQURfTywgSE9XX0JGRF9UQVJHRVQpOwotfQotCi1zdGF0aWMgYmZkICoKLW1ha2VfdGFpbCAoKQotewotICBGSUxFICpmID0gZm9wZW4gKFRNUF9UQUlMX1MsIEZPUEVOX1dUKTsKLSAgY2hhciAqY21kOwotCi0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgZmF0YWwgKF8oImZhaWxlZCB0byBvcGVuIHRlbXBvcmFyeSB0YWlsIGZpbGU6ICVzIiksIFRNUF9UQUlMX1MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKCFub19pZGF0YTQpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICB9Ci0gIAotICBpZiAoIW5vX2lkYXRhNSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNVxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgIH0KLQotI2lmZGVmIERMTFRPT0xfUFBDCi0gIC8qIE5vcm1hbGx5LCB3ZSBuZWVkIHRvIHNlZSBhIG51bGwgZGVzY3JpcHRvciBidWlsdCBpbiBpZGF0YSQzIHRvCi0gICAgIGFjdCBhcyB0aGUgdGVybWluYXRvciBmb3IgdGhlIGxpc3QuIFRoZSBpZGVhbCB3YXksIEkgc3VwcG9zZSwKLSAgICAgd291bGQgYmUgdG8gbWFyayB0aGlzIHNlY3Rpb24gYXMgYSBjb21kYXQgdHlwZSAyIHNlY3Rpb24sIHNvCi0gICAgIG9ubHkgb25lIHdvdWxkIGFwcGVhciBpbiB0aGUgZmluYWwgLmV4ZSAoaWYgb3VyIGxpbmtlciBzdXBwb3J0ZWQKLSAgICAgY29tZGF0LCB0aGF0IGlzKSBvciBjYXVzZSBpdCB0byBiZSBpbnNlcnRlZCBieSBzb21ldGhpbmcgZWxzZSAoc2F5Ci0gICAgIGNydDApCi0gICovCi0KLSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDNcbiIpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX1BQQwotICAvKiBPdGhlciBQb3dlclBDIE5UIGNvbXBpbGVycyB1c2UgaWRhdGEkNiBmb3IgdGhlIGRsbG5hbWUsIHNvIEkKLSAgICAgZG8gdG9vLiBPcmlnaW5hbCwgaHVoPyAqLwotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNlxuIik7Ci0jZWxzZQotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkN1xuIik7Ci0jZW5kaWYKLQotICBmcHJpbnRmIChmLCAiXHQlc1x0X18lc19pbmFtZVxuIiwgQVNNX0dMT0JBTCwgaW1wX25hbWVfbGFiKTsKLSAgZnByaW50ZiAoZiwgIl9fJXNfaW5hbWU6XHQlc1x0XCIlc1wiXG4iLAotCSAgIGltcF9uYW1lX2xhYiwgQVNNX1RFWFQsIGRsbF9uYW1lKTsKLQotICBmY2xvc2UgKGYpOwotCi0gIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChhc19mbGFncykgKyBzaXplb2YgVE1QX1RBSUxfTwotCQkJICsgc2l6ZW9mIFRNUF9UQUlMX1MgKyA1MCk7Ci0gIHNwcmludGYgKGNtZCwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIFRNUF9UQUlMX08sIFRNUF9UQUlMX1MpOwotICAKLSNpZmRlZiBETExUT09MX0FSTQotICBpZiAobWFjaGluZSA9PSBNQVJNX0lOVEVSV09SSyB8fCBNVEhVTUIpCi0gICAgc3RyY2F0IChjbWQsICIgLW10aHVtYi1pbnRlcndvcmsiKTsKLSNlbmRpZgotICAKLSAgcnVuIChhc19uYW1lLCBjbWQpOwotICAKLSAgcmV0dXJuICBiZmRfb3BlbnIgKFRNUF9UQUlMX08sIEhPV19CRkRfVEFSR0VUKTsKLX0KLQotc3RhdGljIHZvaWQKLWdlbl9saWJfZmlsZSAoKQotewotICBpbnQgaTsKLSAgZXhwb3J0X3R5cGUgKmV4cDsKLSAgYmZkICphcl9oZWFkOwotICBiZmQgKmFyX3RhaWw7Ci0gIGJmZCAqb3V0YXJjaDsKLSAgYmZkICogaGVhZCAgPSAwOwotCi0gIHVubGluayAoaW1wX25hbWUpOwotCi0gIG91dGFyY2ggPSBiZmRfb3BlbncgKGltcF9uYW1lLCBIT1dfQkZEX1RBUkdFVCk7Ci0KLSAgaWYgKCFvdXRhcmNoKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oIkNhbid0IG9wZW4gLmxpYiBmaWxlOiAlcyIpLCBpbXBfbmFtZSk7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJDcmVhdGluZyBsaWJyYXJ5IGZpbGU6ICVzXG4iKSwgaW1wX25hbWUpOwotICAKLSAgYmZkX3NldF9mb3JtYXQgKG91dGFyY2gsIGJmZF9hcmNoaXZlKTsKLSAgb3V0YXJjaC0+aGFzX2FybWFwID0gMTsKLQotICAvKiBXb3JrIG91dCBhIHJlYXNvbmFibGUgc2l6ZSBvZiB0aGluZ3MgdG8gcHV0IG9udG8gb25lIGxpbmUuICovCi0KLSAgYXJfaGVhZCA9IG1ha2VfaGVhZCAoKTsKLSAgYXJfdGFpbCA9IG1ha2VfdGFpbCgpOwotCi0gIGlmIChhcl9oZWFkID09IE5VTEwgfHwgYXJfdGFpbCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgCi0gIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQotICAgIHsKLSAgICAgIGJmZCAqbiA9IG1ha2Vfb25lX2xpYl9maWxlIChleHAsIGkpOwotICAgICAgbi0+bmV4dCA9IGhlYWQ7Ci0gICAgICBoZWFkID0gbjsKLSAgICB9Ci0KLSAgLyogTm93IHN0aWNrIHRoZW0gYWxsIGludG8gdGhlIGFyY2hpdmUgKi8KLQotICBhcl9oZWFkLT5uZXh0ID0gaGVhZDsKLSAgYXJfdGFpbC0+bmV4dCA9IGFyX2hlYWQ7Ci0gIGhlYWQgPSBhcl90YWlsOwotCi0gIGlmICghIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvdXRhcmNoLCBoZWFkKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2FyY2hpdmVfaGVhZCIpOwotICAKLSAgaWYgKCEgYmZkX2Nsb3NlIChvdXRhcmNoKSkKLSAgICBiZmRfZmF0YWwgKGltcF9uYW1lKTsKLQotICB3aGlsZSAoaGVhZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZCAqbiA9IGhlYWQtPm5leHQ7Ci0gICAgICBiZmRfY2xvc2UgKGhlYWQpOwotICAgICAgaGVhZCA9IG47Ci0gICAgfQotCi0gIC8qIERlbGV0ZSBhbGwgdGhlIHRlbXAgZmlsZXMgKi8KLQotICBpZiAoZG9udGRlbHRlbXBzID09IDApCi0gICAgewotICAgICAgdW5saW5rIChUTVBfSEVBRF9PKTsKLSAgICAgIHVubGluayAoVE1QX0hFQURfUyk7Ci0gICAgICB1bmxpbmsgKFRNUF9UQUlMX08pOwotICAgICAgdW5saW5rIChUTVBfVEFJTF9TKTsKLSAgICB9Ci0KLSAgaWYgKGRvbnRkZWx0ZW1wcyA8IDIpCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc2l6ZW9mIFRNUF9TVFVCICsgMTApOwotICAgICAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotCXsKLQkgIHNwcmludGYgKG5hbWUsICIlcyUwNWQubyIsIFRNUF9TVFVCLCBpKTsKLQkgIGlmICh1bmxpbmsgKG5hbWUpIDwgMCkKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgd2FybiAoXygiY2Fubm90IGRlbGV0ZSAlczogJXNcbiIpLCBuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQl9Ci0gICAgfQotICAKLSAgaW5mb3JtIChfKCJDcmVhdGVkIGxpYiBmaWxlIikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUnVuIHRocm91Z2ggdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIC5vIGZpbGVzIGFuZCB0aGUKLSAgIC5kZWYgZmlsZSBhbmQgd29yayBvdXQgdGhlIGJlc3Qgc3R1ZmYgKi8KLXN0YXRpYyBpbnQKLXBmdW5jIChhLCBiKQotICAgICBjb25zdCB2b2lkICphOwotICAgICBjb25zdCB2b2lkICpiOwotewotICBleHBvcnRfdHlwZSAqYXAgPSAqKGV4cG9ydF90eXBlICoqKSBhOwotICBleHBvcnRfdHlwZSAqYnAgPSAqKGV4cG9ydF90eXBlICoqKSBiOwotICBpZiAoYXAtPm9yZGluYWwgPT0gYnAtPm9yZGluYWwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogdW5zZXQgb3JkaW5hbHMgZ28gdG8gdGhlIGJvdHRvbSAqLwotICBpZiAoYXAtPm9yZGluYWwgPT0gLTEpCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChicC0+b3JkaW5hbCA9PSAtMSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAoYXAtPm9yZGluYWwgLSBicC0+b3JkaW5hbCk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5mdW5jIChhLCBiKQotICAgICBjb25zdCB2b2lkICphOwotICAgICBjb25zdCB2b2lkICpiOwotewotICBleHBvcnRfdHlwZSAqYXAgPSAqKGV4cG9ydF90eXBlICoqKSBhOwotICBleHBvcnRfdHlwZSAqYnAgPSAqKGV4cG9ydF90eXBlICoqKSBiOwotCi0gIHJldHVybiAoc3RyY21wIChhcC0+bmFtZSwgYnAtPm5hbWUpKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbW92ZV9udWxsX25hbWVzIChwdHIpCi0gICAgIGV4cG9ydF90eXBlICoqcHRyOwotewotICBpbnQgc3JjOwotICBpbnQgZHN0OwotICBmb3IgKGRzdCA9IHNyYyA9IDA7IHNyYyA8IGRfbmZ1bmNzOyBzcmMrKykKLSAgICB7Ci0gICAgICBpZiAocHRyW3NyY10pCi0JewotCSAgcHRyW2RzdF0gPSBwdHJbc3JjXTsKLQkgIGRzdCsrOwotCX0KLSAgICB9Ci0gIGRfbmZ1bmNzID0gZHN0OwotfQotCi1zdGF0aWMgdm9pZAotZHRhYiAocHRyKQotICAgICBleHBvcnRfdHlwZSAqKnB0cjsKLXsKLSNpZmRlZiBTQUNERUJVRwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKHB0cltpXSkKLQl7Ci0JICBwcmludGYgKCIlZCAlcyBAICVkICVzJXMlc1xuIiwKLQkJICBpLCBwdHJbaV0tPm5hbWUsIHB0cltpXS0+b3JkaW5hbCwKLQkJICBwdHJbaV0tPm5vbmFtZSA/ICJOT05BTUUgIiA6ICIiLAotCQkgIHB0cltpXS0+Y29uc3RhbnQgPyAiQ09OU1RBTlQiIDogIiIsCi0JCSAgcHRyW2ldLT5kYXRhID8gIkRBVEEiIDogIiIpOwotCX0KLSAgICAgIGVsc2UKLQlwcmludGYgKCJlbXB0eVxuIik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2R1cGxpY2F0ZXMgKGRfZXhwb3J0X3ZlYykKLSAgICAgZXhwb3J0X3R5cGUgKipkX2V4cG9ydF92ZWM7Ci17Ci0gIGludCBtb3JlID0gMTsKLSAgaW50IGk7Ci0gIHdoaWxlIChtb3JlKQotICAgIHsKLQotICAgICAgbW9yZSA9IDA7Ci0gICAgICAvKiBSZW1vdmUgZHVwbGljYXRlcyAqLwotICAgICAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIG5mdW5jKTsKLQotICAgICAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jcyAtIDE7IGkrKykKLQl7Ci0JICBpZiAoc3RyY21wIChkX2V4cG9ydF92ZWNbaV0tPm5hbWUsCi0JCSAgICAgIGRfZXhwb3J0X3ZlY1tpICsgMV0tPm5hbWUpID09IDApCi0JICAgIHsKLQotCSAgICAgIGV4cG9ydF90eXBlICphID0gZF9leHBvcnRfdmVjW2ldOwotCSAgICAgIGV4cG9ydF90eXBlICpiID0gZF9leHBvcnRfdmVjW2kgKyAxXTsKLQotCSAgICAgIG1vcmUgPSAxOwotCSAgICAgIAotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgaW5mb3JtIChfKCJXYXJuaW5nLCBpZ25vcmluZyBkdXBsaWNhdGUgRVhQT1JUICVzICVkLCVkXG4iKSwKLQkJICAgICAgYS0+bmFtZSwgYS0+b3JkaW5hbCwgYi0+b3JkaW5hbCk7Ci0JICAgICAgCi0JICAgICAgaWYgKGEtPm9yZGluYWwgIT0gLTEKLQkJICAmJiBiLT5vcmRpbmFsICE9IC0xKQotCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQlmYXRhbCAoXygiRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzIiksCi0JCSAgICAgIGEtPm5hbWUpOwotCi0JICAgICAgLyogTWVyZ2UgYXR0cmlidXRlcyAqLwotCSAgICAgIGItPm9yZGluYWwgPSBhLT5vcmRpbmFsID4gMCA/IGEtPm9yZGluYWwgOiBiLT5vcmRpbmFsOwotCSAgICAgIGItPmNvbnN0YW50IHw9IGEtPmNvbnN0YW50OwotCSAgICAgIGItPm5vbmFtZSB8PSBhLT5ub25hbWU7Ci0JICAgICAgYi0+ZGF0YSB8PSBhLT5kYXRhOwotCSAgICAgIGRfZXhwb3J0X3ZlY1tpXSA9IDA7Ci0JICAgIH0KLQotCSAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLQkgIHJlbW92ZV9udWxsX25hbWVzIChkX2V4cG9ydF92ZWMpOwotCSAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLQl9Ci0gICAgfQotCi0KLSAgLyogQ291bnQgdGhlIG5hbWVzICovCi0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmICghZF9leHBvcnRfdmVjW2ldLT5ub25hbWUpCi0JZF9uYW1lZF9uZnVuY3MrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1maWxsX29yZGluYWxzIChkX2V4cG9ydF92ZWMpCi0gICAgIGV4cG9ydF90eXBlICoqZF9leHBvcnRfdmVjOwotewotICBpbnQgbG93ZXN0ID0gLTE7Ci0gIGludCBpOwotICBjaGFyICpwdHI7Ci0gIGludCBzaXplID0gNjU1MzY7Ci0KLSAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIHBmdW5jKTsKLQotICAvKiBmaWxsIGluIHRoZSB1bnNldCBvcmRpbmFscyB3aXRoIG9uZXMgZnJvbSBvdXIgcmFuZ2UgKi8KLQotICBwdHIgPSAoY2hhciAqKSB4bWFsbG9jIChzaXplKTsKLQotICBtZW1zZXQgKHB0ciwgMCwgc2l6ZSk7Ci0KLSAgLyogTWFyayBpbiBvdXIgbGFyZ2UgdmVjdG9yIGFsbCB0aGUgbnVtYmVycyB0aGF0IGFyZSB0YWtlbiAqLwotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsICE9IC0xKQotCXsKLQkgIHB0cltkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWxdID0gMTsKLQkgIGlmIChsb3dlc3QgPT0gLTEgfHwgZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsIDwgbG93ZXN0KQotCSAgICB7Ci0JICAgICAgbG93ZXN0ID0gZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBTdGFydCBhdCAxIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTVMgdG9vbGNoYWluLiAgKi8KLSAgaWYgKGxvd2VzdCA9PSAtMSkKLSAgICBsb3dlc3QgPSAxOwotCi0gIC8qIE5vdyBmaWxsIGluIG9yZGluYWxzIHdoZXJlIHRoZSB1c2VyIHdhbnRzIHVzIHRvIGNob29zZS4gKi8KLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKGRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCA9PSAtMSkKLQl7Ci0JICByZWdpc3RlciBpbnQgajsKLQotCSAgLyogRmlyc3QgdHJ5IHdpdGhpbiBvciBhZnRlciBhbnkgdXNlciBzdXBwbGllZCByYW5nZS4gKi8KLQkgIGZvciAoaiA9IGxvd2VzdDsgaiA8IHNpemU7IGorKykKLQkgICAgaWYgKHB0cltqXSA9PSAwKQotCSAgICAgIHsKLQkJcHRyW2pdID0gMTsKLQkJZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsID0gajsKLQkJZ290byBkb25lOwotCSAgICAgIH0KLQotCSAgLyogVGhlbiB0cnkgYmVmb3JlIHRoZSByYW5nZS4gKi8KLQkgIGZvciAoaiA9IGxvd2VzdDsgaiA+MDsgai0tKQotCSAgICBpZiAocHRyW2pdID09IDApCi0JICAgICAgewotCQlwdHJbal0gPSAxOwotCQlkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPSBqOwotCQlnb3RvIGRvbmU7Ci0JICAgICAgfQotCWRvbmU6OwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocHRyKTsKLQotICAvKiBBbmQgcmVzb3J0ICovCi0KLSAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIHBmdW5jKTsKLQotICAvKiBXb3JrIG91dCB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IG9yZGluYWwgbnVtYmVycy4gICovCi0gIGlmIChkX25mdW5jcykKLSAgICB7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjWzBdKQotCWRfbG93X29yZCA9IGRfZXhwb3J0X3ZlY1swXS0+b3JkaW5hbDsKLSAgICAgIGlmIChkX2V4cG9ydF92ZWNbZF9uZnVuY3MtMV0pCi0JZF9oaWdoX29yZCA9IGRfZXhwb3J0X3ZlY1tkX25mdW5jcy0xXS0+b3JkaW5hbDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWFscGhhZnVuYyAoYXYsYnYpCi0gICAgIGNvbnN0IHZvaWQgKmF2OwotICAgICBjb25zdCB2b2lkICpidjsKLXsKLSAgY29uc3QgZXhwb3J0X3R5cGUgKiphID0gKGNvbnN0IGV4cG9ydF90eXBlICoqKSBhdjsKLSAgY29uc3QgZXhwb3J0X3R5cGUgKipiID0gKGNvbnN0IGV4cG9ydF90eXBlICoqKSBidjsKLQotICByZXR1cm4gc3RyY21wICgoKmEpLT5uYW1lLCAoKmIpLT5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLW1hbmdsZV9kZWZzICgpCi17Ci0gIC8qIEZpcnN0IHdvcmsgb3V0IHRoZSBtaW5pbXVtIG9yZGluYWwgY2hvc2VuICovCi0KLSAgZXhwb3J0X3R5cGUgKmV4cDsKLQotICBpbnQgaTsKLSAgaW50IGhpbnQgPSAwOwotICBleHBvcnRfdHlwZSAqKmRfZXhwb3J0X3ZlYwotICA9IChleHBvcnRfdHlwZSAqKikgeG1hbGxvYyAoc2l6ZW9mIChleHBvcnRfdHlwZSAqKSAqIGRfbmZ1bmNzKTsKLQotICBpbmZvcm0gKF8oIlByb2Nlc3NpbmcgZGVmaW5pdGlvbnMiKSk7Ci0gIAotICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0gICAgewotICAgICAgZF9leHBvcnRfdmVjW2ldID0gZXhwOwotICAgIH0KLQotICBwcm9jZXNzX2R1cGxpY2F0ZXMgKGRfZXhwb3J0X3ZlYyk7Ci0gIGZpbGxfb3JkaW5hbHMgKGRfZXhwb3J0X3ZlYyk7Ci0KLSAgLyogUHV0IGJhY2sgdGhlIGxpc3QgaW4gdGhlIG5ldyBvcmRlciAqLwotICBkX2V4cG9ydHMgPSAwOwotICBmb3IgKGkgPSBkX25mdW5jcyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGRfZXhwb3J0X3ZlY1tpXS0+bmV4dCA9IGRfZXhwb3J0czsKLSAgICAgIGRfZXhwb3J0cyA9IGRfZXhwb3J0X3ZlY1tpXTsKLSAgICB9Ci0KLSAgLyogQnVpbGQgbGlzdCBpbiBhbHBoYSBvcmRlciAqLwotICBkX2V4cG9ydHNfbGV4aWNhbGx5ID0gKGV4cG9ydF90eXBlICoqKQotICAgIHhtYWxsb2MgKHNpemVvZiAoZXhwb3J0X3R5cGUgKikgKiAoZF9uZnVuY3MgKyAxKSk7Ci0KLSAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotICAgIHsKLSAgICAgIGRfZXhwb3J0c19sZXhpY2FsbHlbaV0gPSBleHA7Ci0gICAgfQotICBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldID0gMDsKLQotICBxc29ydCAoZF9leHBvcnRzX2xleGljYWxseSwgaSwgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgYWxwaGFmdW5jKTsKLQotICAvKiBGaWxsIGV4cCBlbnRyaWVzIHdpdGggdGhlaXIgaGludCB2YWx1ZXMgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIWRfZXhwb3J0c19sZXhpY2FsbHlbaV0tPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCWRfZXhwb3J0c19sZXhpY2FsbHlbaV0tPmhpbnQgPSBoaW50Kys7Ci0gICAgfQotICAKLSAgaW5mb3JtIChfKCJQcm9jZXNzZWQgZGVmaW5pdGlvbnMiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgLyogeGdldGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIpLCBwcm9ncmFtX25hbWUpOwotICAvKiB4Z2V0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1tIC0tbWFjaGluZSA8bWFjaGluZT4gICAgQ3JlYXRlIGFzIERMTCBmb3IgPG1hY2hpbmU+LiAgW2RlZmF1bHQ6ICVzXVxuIiksIG1uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAgICBwb3NzaWJsZSA8bWFjaGluZT46IGFybVtfaW50ZXJ3b3JrXSwgaTM4NiwgbWNvcmVbLWVsZl1bLWxlXSwgcHBjLCB0aHVtYlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtZSAtLW91dHB1dC1leHAgPG91dG5hbWU+IEdlbmVyYXRlIGFuIGV4cG9ydCBmaWxlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtbCAtLW91dHB1dC1saWIgPG91dG5hbWU+IEdlbmVyYXRlIGFuIGludGVyZmFjZSBsaWJyYXJ5LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtYSAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtRCAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIGludGVyZmFjZSBsaWIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1kIC0taW5wdXQtZGVmIDxkZWZmaWxlPiAgTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLXogLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG9mIC5kZWYgZmlsZSB0byBiZSBjcmVhdGVkLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCBsaXN0ZWQgc3ltYm9sc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLWV4Y2x1ZGUtc3ltYm9scyA8bGlzdD4gRG9uJ3QgZXhwb3J0IDxsaXN0PlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLW5vLWRlZmF1bHQtZXhjbHVkZXMgIENsZWFyIGRlZmF1bHQgZXhjbHVkZSBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1iIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLXggLS1uby1pZGF0YTQgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ0IHNlY3Rpb24uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1jIC0tbm8taWRhdGE1ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtVSAtLWFkZC11bmRlcnNjb3JlICAgICAgIEFkZCB1bmRlcnNjb3JlcyB0byBzeW1ib2xzIGluIGludGVyZmFjZSBsaWJyYXJ5LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtayAtLWtpbGwtYXQgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtQSAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLVMgLS1hcyA8bmFtZT4gICAgICAgICAgICBVc2UgPG5hbWU+IGZvciBhc3NlbWJsZXIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1mIC0tYXMtZmxhZ3MgPGZsYWdzPiAgICAgUGFzcyA8ZmxhZ3M+IHRvIHRoZSBhc3NlbWJsZXIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1uIC0tbm8tZGVsZXRlICAgICAgICAgICAgS2VlcCB0ZW1wIGZpbGVzIChyZXBlYXQgZm9yIGV4dHJhIHByZXNlcnZhdGlvbikuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC12IC0tdmVyYm9zZSAgICAgICAgICAgICAgQmUgdmVyYm9zZS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBwcm9ncmFtIHZlcnNpb24uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1oIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uLlxuIikpOwotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1NIC0tbWNvcmUtZWxmIDxvdXRuYW1lPiAgUHJvY2VzcyBtY29yZS1lbGYgb2JqZWN0IGZpbGVzIGludG8gPG91dG5hbWU+LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtTCAtLWxpbmtlciA8bmFtZT4gICAgICAgIFVzZSA8bmFtZT4gYXMgdGhlIGxpbmtlci5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLUYgLS1saW5rZXItZmxhZ3MgPGZsYWdzPiBQYXNzIDxmbGFncz4gdG8gdGhlIGxpbmtlci5cbiIpKTsKLSNlbmRpZgotICBleGl0IChzdGF0dXMpOwotfQotCi0jZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJCTE1MAotI2RlZmluZSBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TCShPUFRJT05fRVhQT1JUX0FMTF9TWU1TICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNUwkJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUwkoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJuby1kZWxldGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ24nfSwKLSAgeyJkbGxuYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdEJ30sCi0gIHsibm8taWRhdGE0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICd4J30sCi0gIHsibm8taWRhdGE1Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdjJ30sCi0gIHsib3V0cHV0LWV4cCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7Im91dHB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3onfSwKLSAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTExfU1lNU30sCi0gIHsibm8tZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVN9LAotICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1TfSwKLSAgeyJuby1kZWZhdWx0LWV4Y2x1ZGVzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTfSwKLSAgeyJvdXRwdXQtbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gIHsiZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdkJ30sIC8qIGZvciBjb21wYXRpYmxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyAqLwotICB7ImlucHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAotICB7ImFkZC11bmRlcnNjb3JlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdVJ30sCi0gIHsia2lsbC1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnayd9LAotICB7ImFkZC1zdGRjYWxsLWFsaWFzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdBJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgJ1YnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsibWFjaGluZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAotICB7ImFkZC1pbmRpcmVjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICB7ImFzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdTJ30sCi0gIHsiYXMtZmxhZ3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJtY29yZS1lbGYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ00nfSwKLSAgezB9Ci19OwotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICoqYXY7Ci17Ci0gIGludCBjOwotICBpbnQgaTsKLSAgY2hhciAqZmlyc3RhcmcgPSAwOwotICBwcm9ncmFtX25hbWUgPSBhdlswXTsKLSAgb2F2ID0gYXY7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LAotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCQkJICAgCi0JCQkgICAibTplOmw6YUQ6ZDp6OmI6eGN1VWtBUzpmOm52VmhNOkw6RjoiLAotI2Vsc2UKLQkJCSAgICJtOmU6bDphRDpkOno6Yjp4Y3VVa0FTOmY6bnZWaCIsCi0jZW5kaWYKLQkJCSAgIGxvbmdfb3B0aW9ucywgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgT1BUSU9OX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGxfc3ltYm9scyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVM6Ci0JICBleHBvcnRfYWxsX3N5bWJvbHMgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYQ0xVREVfU1lNUzoKLQkgIGFkZF9leGNsdWRlcyAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVM6Ci0JICBkb19kZWZhdWx0X2V4Y2x1ZGVzID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIG5vX2lkYXRhNCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIG5vX2lkYXRhNSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGFzX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGFzX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQkgIC8qIGlnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgKi8KLQljYXNlICd1JzoKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgYWRkX2luZGlyZWN0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgb3V0cHV0X2RlZiA9IGZvcGVuIChvcHRhcmcsIEZPUEVOX1dUKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZGxsX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGltcF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICBleHBfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQljYXNlICdtJzoKLQkgIG1uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgcHJpbnRfdmVyc2lvbiAocHJvZ3JhbV9uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1UnOgotCSAgYWRkX3VuZGVyc2NvcmUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnayc6Ci0JICBraWxsYXQgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBhZGRfc3RkY2FsbF9hbGlhcyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRlZl9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBkb250ZGVsdGVtcHMrKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgYmFzZV9maWxlID0gZm9wZW4gKG9wdGFyZywgRk9QRU5fUkIpOwotCSAgCi0JICBpZiAoIWJhc2VfZmlsZSkKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZmF0YWwgKF8oIlVuYWJsZSB0byBvcGVuIGJhc2UtZmlsZTogJXMiKSwgb3B0YXJnKTsKLQotCSAgYnJlYWs7Ci0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLQljYXNlICdNJzoKLQkgIG1jb3JlX2VsZl9vdXRfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0wnOgotCSAgbWNvcmVfZWxmX2xpbmtlciA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgbWNvcmVfZWxmX2xpbmtlcl9mbGFncyA9IG9wdGFyZzsKLQkgIGJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBtdGFibGVbaV0udHlwZTsgaSsrKQotICAgIGlmIChzdHJjbXAgKG10YWJsZVtpXS50eXBlLCBtbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmICghbXRhYmxlW2ldLnR5cGUpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiKSwgbW5hbWUpOwotCi0gIG1hY2hpbmUgPSBpOwotCi0gIGlmICghZGxsX25hbWUgJiYgZXhwX25hbWUpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoZXhwX25hbWUpICsgNTsKLSAgICAgIGRsbF9uYW1lID0geG1hbGxvYyAobGVuKTsKLSAgICAgIHN0cmNweSAoZGxsX25hbWUsIGV4cF9uYW1lKTsKLSAgICAgIHN0cmNhdCAoZGxsX25hbWUsICIuZGxsIik7Ci0gICAgfQotCi0gIGlmIChhc19uYW1lID09IE5VTEwpCi0gICAgYXNfbmFtZSA9IGRlZHVjZV9uYW1lICgiYXMiKTsKLSAgCi0gIC8qIERvbid0IHVzZSB0aGUgZGVmYXVsdCBleGNsdWRlIGxpc3QgaWYgd2UncmUgcmVhZGluZyBvbmx5IHRoZQotICAgICBzeW1ib2xzIGluIHRoZSAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGRlZmF1bHQgZXhjbHVkZXMgYXJlIG1lYW50Ci0gICAgIHRvIGF2b2lkIGV4cG9ydGluZyBETEwgZW50cnkgcG9pbnQgYW5kIEN5Z3dpbjMyIGltcHVyZV9wdHIuICAqLwotICBpZiAoISBleHBvcnRfYWxsX3N5bWJvbHMpCi0gICAgZG9fZGVmYXVsdF9leGNsdWRlcyA9IGZhbHNlOwotICAKLSAgaWYgKGRvX2RlZmF1bHRfZXhjbHVkZXMpCi0gICAgc2V0X2RlZmF1bHRfZXhjbHVkZXMgKCk7Ci0KLSAgaWYgKGRlZl9maWxlKQotICAgIHByb2Nlc3NfZGVmX2ZpbGUgKGRlZl9maWxlKTsKLQotICB3aGlsZSAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaWYgKCFmaXJzdGFyZykKLQlmaXJzdGFyZyA9IGF2W29wdGluZF07Ci0gICAgICBzY2FuX29ial9maWxlIChhdltvcHRpbmRdKTsKLSAgICAgIG9wdGluZCsrOwotICAgIH0KLQotICBtYW5nbGVfZGVmcyAoKTsKLQotICBpZiAoZXhwX25hbWUpCi0gICAgZ2VuX2V4cF9maWxlICgpOwotICAKLSAgaWYgKGltcF9uYW1lKQotICAgIHsKLSAgICAgIC8qIE1ha2UgaW1wX25hbWUgc2FmZSBmb3IgdXNlIGFzIGEgbGFiZWwuICovCi0gICAgICBjaGFyICpwOwotCi0gICAgICBpbXBfbmFtZV9sYWIgPSB4c3RyZHVwIChpbXBfbmFtZSk7Ci0gICAgICBmb3IgKHAgPSBpbXBfbmFtZV9sYWI7ICpwOyBwKyspCi0JewotCSAgaWYgKCFpc2FscGhhICgodW5zaWduZWQgY2hhcikgKnApICYmICFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKQotCSAgICAqcCA9ICdfJzsKLQl9Ci0gICAgICBoZWFkX2xhYmVsID0gbWFrZV9sYWJlbCgiX2hlYWRfIiwgaW1wX25hbWVfbGFiKTsKLSAgICAgIGdlbl9saWJfZmlsZSAoKTsKLSAgICB9Ci0gIAotICBpZiAob3V0cHV0X2RlZikKLSAgICBnZW5fZGVmX2ZpbGUgKCk7Ci0gIAotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gIGlmIChtY29yZV9lbGZfb3V0X2ZpbGUpCi0gICAgbWNvcmVfZWxmX2dlbl9vdXRfZmlsZSAoKTsKLSNlbmRpZgotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIExvb2sgZm9yIHRoZSBwcm9ncmFtIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIFBST0dfTkFNRSBhbmQgdGhlCi0gICBzdHJpbmcgcnVubmluZyBmcm9tIFBSRUZJWCB0byBFTkRfUFJFRklYLiAgSWYgdGhlIGNvbmNhdGVuYXRlZAotICAgc3RyaW5nIGNvbnRhaW5zIGEgJy8nLCB0cnkgYXBwZW5kaW5nIEVYRUNVVEFCTEVfU1VGRklYIGlmIGl0IGlzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWxvb2tfZm9yX3Byb2cgKHByb2dfbmFtZSwgcHJlZml4LCBlbmRfcHJlZml4KQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgICAgaW50IGVuZF9wcmVmaXg7Ci17Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKmNtZDsKLQotICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByZWZpeCkgCi0gICAgICAgICAgICAgICAgICsgc3RybGVuIChwcm9nX25hbWUpIAotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKEVYRUNVVEFCTEVfU1VGRklYKSAKLSNlbmRpZgotCQkgKyAxMCk7Ci0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCArIGVuZF9wcmVmaXgsICIlcyIsIHByb2dfbmFtZSk7Ci0KLSAgaWYgKHN0cmNociAoY21kLCAnLycpICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGZvdW5kOwotCi0gICAgICBmb3VuZCA9IChzdGF0IChjbWQsICZzKSA9PSAwCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgfHwgc3RhdCAoc3RyY2F0IChjbWQsIEVYRUNVVEFCTEVfU1VGRklYKSwgJnMpID09IDAKLSNlbmRpZgotCSAgICAgICApOwotCi0gICAgICBpZiAoISBmb3VuZCkKLSAgICAgICAgewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGluZm9ybSAoXygiVHJpZWQgZmlsZTogJXMiKSwgY21kKTsKLQkgIGZyZWUgKGNtZCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiVXNpbmcgZmlsZTogJXMiKSwgY21kKTsKLQotICByZXR1cm4gY21kOwotfQotCi0vKiBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gd2UgYXJlIHdhbnQgdG8gaW52b2tlLgotICAgUFJPR19OQU1FIGlzIHRoZSBiYXNpYyBuYW1lIG9mIHRoZSBwcm9ncmFtIHdlIHdhbnQgdG8gcnVuLAotICAgZWcgImFzIiBvciAibGQiLiAgVGhlIGNhdGNoIGlzIHRoYXQgd2UgbWlnaHQgd2FudCBhY3R1YWxseQotICAgcnVuICJpMzg2LXBlLWFzIiBvciAicHBjLXBlLWxkIi4gIAotCi0gICBJZiBhcmd2WzBdIGNvbnRhaW5zIHRoZSBmdWxsIHBhdGgsIHRoZW4gdHJ5IHRvIGZpbmQgdGhlIHByb2dyYW0KLSAgIGluIHRoZSBzYW1lIHBsYWNlLCB3aXRoIGFuZCB0aGVuIHdpdGhvdXQgYSB0YXJnZXQtbGlrZSBwcmVmaXguCi0KLSAgIEdpdmVuLCBhcmd2WzBdID0gL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1kbGx0b29sLAotICAgZGVkdWNlX25hbWUoImFzIikgdXNlcyB0aGUgZm9sbG93aW5nIHNlYXJjaCBvcmRlcjogCi0KLSAgICAgL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1hcwotICAgICAvdXNyL2xvY2FsL2Jpbi9hcwotICAgICBhcwotICAgCi0gICBJZiB0aGVyZSdzIGFuIEVYRUNVVEFCTEVfU1VGRklYLCBpdCdsbCB1c2UgdGhhdCBhcyB3ZWxsOyBmb3IgZWFjaAotICAgbmFtZSwgaXQnbGwgdHJ5IHdpdGhvdXQgYW5kIHRoZW4gd2l0aCBFWEVDVVRBQkxFX1NVRkZJWC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSBpNTg2LWN5Z3dpbjMyLWRsbHRvb2wsIGl0IHdpbGwgbm90IGV2ZW4gdHJ5ICJhcyIKLSAgIGFzIHRoZSBmYWxsYmFjaywgYnV0IHJhdGhlciByZXR1cm4gaTU4Ni1jeWd3aW4zMi1hcy4KLSAgICAgCi0gICBPaCwgYW5kIGdpdmVuLCBhcmd2WzBdID0gZGxsdG9vbCwgaXQnbGwgcmV0dXJuICJhcyIuCi0KLSAgIFJldHVybnMgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZGVkdWNlX25hbWUgKHByb2dfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcHJvZ19uYW1lOwotewotICBjaGFyICpjbWQ7Ci0gIGNoYXIgKmRhc2gsICpzbGFzaCwgKmNwOwotCi0gIGRhc2ggPSBOVUxMOwotICBzbGFzaCA9IE5VTEw7Ci0gIGZvciAoY3AgPSBwcm9ncmFtX25hbWU7ICpjcCAhPSAnXDAnOyArK2NwKQotICAgIHsKLSAgICAgIGlmICgqY3AgPT0gJy0nKQotCWRhc2ggPSBjcDsKLSAgICAgIGlmICgKLSNpZiBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0JICAqY3AgPT0gJzonIHx8ICpjcCA9PSAnXFwnIHx8Ci0jZW5kaWYKLQkgICpjcCA9PSAnLycpCi0JewotCSAgc2xhc2ggPSBjcDsKLQkgIGRhc2ggPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgY21kID0gTlVMTDsKLQotICBpZiAoZGFzaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZpcnN0LCB0cnkgbG9va2luZyBmb3IgYSBwcmVmaXhlZCBQUk9HX05BTUUgaW4gdGhlCi0gICAgICAgICBQUk9HUkFNX05BTUUgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIHByZWZpeCBhcyBQUk9HUkFNX05BTUUuICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIGRhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKHNsYXNoICE9IE5VTEwgJiYgY21kID09IE5VTEwpCi0gICAgewotICAgICAgLyogTmV4dCwgdHJ5IGxvb2tpbmcgZm9yIGEgUFJPR19OQU1FIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcwotICAgICAgICAgdGhhdCBvZiB0aGlzIHByb2dyYW0uICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIHNsYXNoIC0gcHJvZ3JhbV9uYW1lICsgMSk7Ci0gICAgfQotCi0gIGlmIChjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBKdXN0IHJldHVybiBQUk9HX05BTUUgYXMgaXMuICAqLwotICAgICAgY21kID0geHN0cmR1cCAocHJvZ19uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNtZDsKLX0KLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi10eXBlZGVmIHN0cnVjdCBmbmFtZV9jYWNoZQotewotICBjaGFyICogICAgICAgICAgICAgICBmaWxlbmFtZTsKLSAgc3RydWN0IGZuYW1lX2NhY2hlICogbmV4dDsKLX0KLWZuYW1lX2NhY2hlOwotCi1zdGF0aWMgZm5hbWVfY2FjaGUgZm5hbWVzOwotCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lIChjaGFyICogZmlsZW5hbWUpCi17Ci0gIGZuYW1lX2NhY2hlICogcHRyOwotCi0gIHB0ciA9ICYgZm5hbWVzOwotCi0gIHdoaWxlIChwdHItPm5leHQgIT0gTlVMTCkKLSAgICBwdHIgPSBwdHItPm5leHQ7Ci0KLSAgcHRyLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBwdHItPm5leHQgICAgID0gKGZuYW1lX2NhY2hlICopIG1hbGxvYyAoc2l6ZW9mIChmbmFtZV9jYWNoZSkpOwotICBpZiAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgcHRyLT5uZXh0LT5uZXh0ID0gTlVMTDsKLX0KLQotI2RlZmluZSBNQ09SRV9FTEZfVE1QX09CSiAibWNvcmVlbGYubyIKLSNkZWZpbmUgTUNPUkVfRUxGX1RNUF9FWFAgIm1jb3JlZWxmLmV4cCIKLSNkZWZpbmUgTUNPUkVfRUxGX1RNUF9MSUIgIm1jb3JlZWxmLmxpYiIKLQotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUgKHZvaWQpCi17Ci0gIGZuYW1lX2NhY2hlICogcHRyOwotICBkeW5fc3RyaW5nX3QgZHM7Ci0KLSAgLyogU3RlcCBvbmUuICBSdW4gJ2xkIC1yJyBvbiB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGluIG9yZGVyIHRvIHJlc29sdmUKLSAgICAgYW55IGludGVybmFsIHJlZmVyZW5jZXMgYW5kIHRvIGdlbmVyYXRlIGEgc2luZ2xlIC5leHBvcnRzIHNlY3Rpb24uICAqLwotICBwdHIgPSAmIGZuYW1lczsKLQotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICItciAiKTsKLQotICBpZiAobWNvcmVfZWxmX2xpbmtlcl9mbGFncyAhPSBOVUxMKQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgbWNvcmVfZWxmX2xpbmtlcl9mbGFncyk7Ci0gIAotICB3aGlsZSAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBwdHItPmZpbGVuYW1lKTsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAiKTsKLQotICAgICAgcHRyID0gcHRyLT5uZXh0OwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICItbyAiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXIgPT0gTlVMTCkKLSAgICBtY29yZV9lbGZfbGlua2VyID0gZGVkdWNlX25hbWUgKCJsZCIpOwotICAKLSAgcnVuIChtY29yZV9lbGZfbGlua2VyLCBkcy0+cyk7Ci0KLSAgZHluX3N0cmluZ19kZWxldGUgKGRzKTsKLQotICAvKiBTdGVwIHR3by4gQ3JlYXRlIGEgLmV4cCBmaWxlIGFuZCBhIC5saWIgZmlsZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZS4gCi0gICAgIERvIHRoaXMgYnkgcmVjdXJzaXZlbHkgaW52b2tpbmcgZGxsdG9vbC4uLi4qLwotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1TICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIGFzX25hbWUpOwotICAKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1lICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfRVhQKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1sICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfTElCKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiICIgKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC12Iik7Ci0gIAotICBpZiAoZG9udGRlbHRlbXBzKQotICAgIHsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbiIpOwotICAKLSAgICAgIGlmIChkb250ZGVsdGVtcHMgPiAxKQotCWR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbiIpOwotICAgIH0KLQotICAvKiBYWFggLSBGSU1FOiBvdWdodCB0byBjaGVjay9jb3B5IG90aGVyIGNvbW1hbmQgbGluZSBvcHRpb25zIGFzIHdlbGwuICAqLwotICAKLSAgcnVuIChwcm9ncmFtX25hbWUsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIC8qIFN0ZXAgZm91ci4gRmVlZCB0aGUgLmV4cCBhbmQgb2JqZWN0IGZpbGVzIHRvIGxkIC1zaGFyZWQgdG8gY3JlYXRlIHRoZSBkbGwuICAqLwotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1zaGFyZWQgIik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXJfZmxhZ3MpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBtY29yZV9lbGZfbGlua2VyX2ZsYWdzKTsKLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9FWFApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9PQkopOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgLW8gIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgbWNvcmVfZWxmX291dF9maWxlKTsKLQotICBydW4gKG1jb3JlX2VsZl9saW5rZXIsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB1bmxpbmsgKE1DT1JFX0VMRl9UTVBfRVhQKTsKLQotICBpZiAoZG9udGRlbHRlbXBzIDwgMikKLSAgICB1bmxpbmsgKE1DT1JFX0VMRl9UTVBfT0JKKTsKLX0KLSNlbmRpZiAvKiBETExUT09MX01DT1JFX0VMRiAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGxsdG9vbC5oIGIvYmludXRpbHMvZGxsdG9vbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE2N2M4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RsbHRvb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGRsbHRvb2wuaCAtLSBoZWFkZXIgZmlsZSBmb3IgZGxsdG9vbAotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gdm9pZCBkZWZfY29kZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9kYXRhIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2Rlc2NyaXB0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmX2V4cG9ydHMKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2hlYXBzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfaW1wb3J0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfbGlicmFyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfc3RhY2tzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfdmVyc2lvbiBQQVJBTVMgKChpbnQsIGludCkpOwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBpbnQgeXlkZWJ1ZzsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIEZJTEUgKnl5aW47Ci1leHRlcm4gaW50IGxpbmVudW1iZXI7CmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx3cmFwLmMgYi9iaW51dGlscy9kbGx3cmFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjA2ZmIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsd3JhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMyArMCwwIEBACi0vKiBkbGx3cmFwLmMgLS0gd3JhcHBlciBmb3IgRExMVE9PTCBhbmQgR0NDIHRvIGdlbmVyYXRlIFBFIHN0eWxlIERMTHMKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE11bWl0IEtoYW4gKGtoYW5AeHJheWxpdGgud2lzYy5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLwotI2lmbmRlZiBfX0dOVUNfXwotIyBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2Vsc2UgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpID4+IDgpICYgMDM3NykKLSNlbmRpZgotI2Vsc2UgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSAmIDB4ZmYpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykgJiAweGZmKSAhPSAwICYmICgodykgJiAweGZmKSAhPSAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpICYgMHhmZjAwKSA+PiA4KQotI2VuZGlmCi0jZW5kaWYgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNlbmRpZiAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotCi1zdGF0aWMgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjAuMi40IjsKLXN0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqY3lnd2luX2RyaXZlcl9mbGFncyA9IAotICAiLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMiOwotc3RhdGljIGNoYXIgKm1pbmd3MzJfZHJpdmVyX2ZsYWdzID0gIi1tZGxsIjsKLXN0YXRpYyBjaGFyICpnZW5lcmljX2RyaXZlcl9mbGFncyA9ICItV2wsLS1kbGwiOwotCi1zdGF0aWMgY2hhciAqZW50cnlfcG9pbnQ7Ci0KLXN0YXRpYyBjaGFyICpkbGx0b29sX25hbWUgPSBOVUxMOwotCi1zdGF0aWMgY2hhciAqdGFyZ2V0ID0gVEFSR0VUOwotCi10eXBlZGVmIGVudW0gewotICBVTktOT1dOX1RBUkdFVCwgCi0gIENZR1dJTl9UQVJHRVQsIAotICBNSU5HVzMyX1RBUkdFVAotfSAKLXRhcmdldF90eXBlOwotCi1zdGF0aWMgdGFyZ2V0X3R5cGUgd2hpY2hfdGFyZ2V0ID0gVU5LTk9XTl9UQVJHRVQ7Ci0KLXN0YXRpYyBpbnQgZG9udGRlbHRlbXBzID0gMDsKLXN0YXRpYyBpbnQgZHJ5X3J1biA9IDA7Ci0KLXN0YXRpYyBjaGFyICpwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyBpbnQgdmVyYm9zZSA9IDA7Ci0KLXN0YXRpYyBjaGFyICpkbGxfZmlsZV9uYW1lOwotc3RhdGljIGNoYXIgKmRsbF9uYW1lOwotc3RhdGljIGNoYXIgKmJhc2VfZmlsZV9uYW1lOwotc3RhdGljIGNoYXIgKmV4cF9maWxlX25hbWU7Ci1zdGF0aWMgY2hhciAqZGVmX2ZpbGVfbmFtZTsKLXN0YXRpYyBpbnQgZGVsZXRlX2Jhc2VfZmlsZSA9IDE7Ci1zdGF0aWMgaW50IGRlbGV0ZV9leHBfZmlsZSA9IDE7Ci1zdGF0aWMgaW50IGRlbGV0ZV9kZWZfZmlsZSA9IDE7Ci0KLXN0YXRpYyBpbnQgcnVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluZm9ybSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIGNoYXIgKmxvb2tfZm9yX3Byb2cgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGNoYXIgKmRlZHVjZV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZGVsZXRlX3RlbXBfZmlsZXMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2xlYW51cF9hbmRfZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQbGVhc2Uga2VlcCB0aGUgZm9sbG93aW5nIDQgcm91dGluZXMgaW4gc3luYyB3aXRoIGRsbHRvb2wuYzoKLSAgICAgZGlzcGxheSAoKQotICAgICBpbmZvcm0gKCkKLSAgICAgbG9va19mb3JfcHJvZyAoKQotICAgICBkZWR1Y2VfbmFtZSAoKQotICAgSXQncyBub3Qgd29ydGggdGhlIGhhc3NsZSB0byBicmVhayB0aGVzZSBvdXQgc2luY2UgZGxsd3JhcCB3aWxsCi0gICAoaG9wZWZ1bGx5KSBzb29uIGJlIHJldGlyZWQgaW4gZmF2b3Igb2YgYGxkIC0tc2hhcmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9saXN0ICAgICAgYXJnczsKLXsKLSAgaWYgKHByb2dyYW1fbmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCi0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotCi0gIGlmIChtZXNzYWdlIFtzdHJsZW4gKG1lc3NhZ2UpIC0gMV0gIT0gJ1xuJykKLSAgICBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0gIAotCi0KLXN0YXRpYyB2b2lkCi0jaWZkZWYgX19TVERDX18KLWluZm9ybSAoY29uc3QgY2hhciAqIG1lc3NhZ2UsIC4uLikKLSNlbHNlCi1pbmZvcm0gKG1lc3NhZ2UsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICAKLSAgaWYgKCF2ZXJib3NlKQotICAgIHJldHVybjsKLQotI2lmZGVmIF9fU1REQ19fCi0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSNlbmRpZgotCi0gIGRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpOwotICAKLSAgdmFfZW5kIChhcmdzKTsKLX0KLQotLyogTG9vayBmb3IgdGhlIHByb2dyYW0gZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgUFJPR19OQU1FIGFuZCB0aGUKLSAgIHN0cmluZyBydW5uaW5nIGZyb20gUFJFRklYIHRvIEVORF9QUkVGSVguICBJZiB0aGUgY29uY2F0ZW5hdGVkCi0gICBzdHJpbmcgY29udGFpbnMgYSAnLycsIHRyeSBhcHBlbmRpbmcgRVhFQ1VUQUJMRV9TVUZGSVggaWYgaXQgaXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcmVmaXgsIGVuZF9wcmVmaXgpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJlZml4OwotICAgICBpbnQgZW5kX3ByZWZpeDsKLXsKLSAgc3RydWN0IHN0YXQgczsKLSAgY2hhciAqY21kOwotCi0gIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJlZml4KSAKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKHByb2dfbmFtZSkgCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgICArIHN0cmxlbiAoRVhFQ1VUQUJMRV9TVUZGSVgpIAotI2VuZGlmCi0JCSArIDEwKTsKLSAgc3RyY3B5IChjbWQsIHByZWZpeCk7Ci0KLSAgc3ByaW50ZiAoY21kICsgZW5kX3ByZWZpeCwgIiVzIiwgcHJvZ19uYW1lKTsKLQotICBpZiAoc3RyY2hyIChjbWQsICcvJykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgZm91bmQ7Ci0KLSAgICAgIGZvdW5kID0gKHN0YXQgKGNtZCwgJnMpID09IDAKLSNpZmRlZiBIQVZFX0VYRUNVVEFCTEVfU1VGRklYCi0gICAgICAgICAgICAgICB8fCBzdGF0IChzdHJjYXQgKGNtZCwgRVhFQ1VUQUJMRV9TVUZGSVgpLCAmcykgPT0gMAotI2VuZGlmCi0JICAgICAgICk7Ci0KLSAgICAgIGlmICghIGZvdW5kKQotICAgICAgICB7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgaW5mb3JtIChfKCJUcmllZCBmaWxlOiAlcyIpLCBjbWQpOwotCSAgZnJlZSAoY21kKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJVc2luZyBmaWxlOiAlcyIpLCBjbWQpOwotCi0gIHJldHVybiBjbWQ7Ci19Ci0KLS8qIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB3ZSBhcmUgd2FudCB0byBpbnZva2UuCi0gICBQUk9HX05BTUUgaXMgdGhlIGJhc2ljIG5hbWUgb2YgdGhlIHByb2dyYW0gd2Ugd2FudCB0byBydW4sCi0gICBlZyAiYXMiIG9yICJsZCIuICBUaGUgY2F0Y2ggaXMgdGhhdCB3ZSBtaWdodCB3YW50IGFjdHVhbGx5Ci0gICBydW4gImkzODYtcGUtYXMiIG9yICJwcGMtcGUtbGQiLiAgCi0KLSAgIElmIGFyZ3ZbMF0gY29udGFpbnMgdGhlIGZ1bGwgcGF0aCwgdGhlbiB0cnkgdG8gZmluZCB0aGUgcHJvZ3JhbQotICAgaW4gdGhlIHNhbWUgcGxhY2UsIHdpdGggYW5kIHRoZW4gd2l0aG91dCBhIHRhcmdldC1saWtlIHByZWZpeC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSAvdXNyL2xvY2FsL2Jpbi9pNTg2LWN5Z3dpbjMyLWRsbHRvb2wsCi0gICBkZWR1Y2VfbmFtZSgiYXMiKSB1c2VzIHRoZSBmb2xsb3dpbmcgc2VhcmNoIG9yZGVyOiAKLQotICAgICAvdXNyL2xvY2FsL2Jpbi9pNTg2LWN5Z3dpbjMyLWFzCi0gICAgIC91c3IvbG9jYWwvYmluL2FzCi0gICAgIGFzCi0gICAKLSAgIElmIHRoZXJlJ3MgYW4gRVhFQ1VUQUJMRV9TVUZGSVgsIGl0J2xsIHVzZSB0aGF0IGFzIHdlbGw7IGZvciBlYWNoCi0gICBuYW1lLCBpdCdsbCB0cnkgd2l0aG91dCBhbmQgdGhlbiB3aXRoIEVYRUNVVEFCTEVfU1VGRklYLgotCi0gICBHaXZlbiwgYXJndlswXSA9IGk1ODYtY3lnd2luMzItZGxsdG9vbCwgaXQgd2lsbCBub3QgZXZlbiB0cnkgImFzIgotICAgYXMgdGhlIGZhbGxiYWNrLCBidXQgcmF0aGVyIHJldHVybiBpNTg2LWN5Z3dpbjMyLWFzLgotICAgICAKLSAgIE9oLCBhbmQgZ2l2ZW4sIGFyZ3ZbMF0gPSBkbGx0b29sLCBpdCdsbCByZXR1cm4gImFzIi4KLQotICAgUmV0dXJucyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1kZWR1Y2VfbmFtZSAocHJvZ19uYW1lKQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci17Ci0gIGNoYXIgKmNtZDsKLSAgY2hhciAqZGFzaCwgKnNsYXNoLCAqY3A7Ci0KLSAgZGFzaCA9IE5VTEw7Ci0gIHNsYXNoID0gTlVMTDsKLSAgZm9yIChjcCA9IHByb2dyYW1fbmFtZTsgKmNwICE9ICdcMCc7ICsrY3ApCi0gICAgewotICAgICAgaWYgKCpjcCA9PSAnLScpCi0JZGFzaCA9IGNwOwotICAgICAgaWYgKAotI2lmIGRlZmluZWQoX19ESkdQUF9fKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKLQkgICpjcCA9PSAnOicgfHwgKmNwID09ICdcXCcgfHwKLSNlbmRpZgotCSAgKmNwID09ICcvJykKLQl7Ci0JICBzbGFzaCA9IGNwOwotCSAgZGFzaCA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBjbWQgPSBOVUxMOwotCi0gIGlmIChkYXNoICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRmlyc3QsIHRyeSBsb29raW5nIGZvciBhIHByZWZpeGVkIFBST0dfTkFNRSBpbiB0aGUKLSAgICAgICAgIFBST0dSQU1fTkFNRSBkaXJlY3RvcnksIHdpdGggdGhlIHNhbWUgcHJlZml4IGFzIFBST0dSQU1fTkFNRS4gICovCi0gICAgICBjbWQgPSBsb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByb2dyYW1fbmFtZSwgZGFzaCAtIHByb2dyYW1fbmFtZSArIDEpOwotICAgIH0KLQotICBpZiAoc2xhc2ggIT0gTlVMTCAmJiBjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOZXh0LCB0cnkgbG9va2luZyBmb3IgYSBQUk9HX05BTUUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzCi0gICAgICAgICB0aGF0IG9mIHRoaXMgcHJvZ3JhbS4gICovCi0gICAgICBjbWQgPSBsb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByb2dyYW1fbmFtZSwgc2xhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKGNtZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEp1c3QgcmV0dXJuIFBST0dfTkFNRSBhcyBpcy4gICovCi0gICAgICBjbWQgPSB4c3RyZHVwIChwcm9nX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gY21kOwotfQotCi1zdGF0aWMgdm9pZAotZGVsZXRlX3RlbXBfZmlsZXMgKCkKLXsKLSAgaWYgKGRlbGV0ZV9iYXNlX2ZpbGUgJiYgYmFzZV9maWxlX25hbWUpCi0gICAgewotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGJhc2UgZmlsZSAlc1xuIiwKLQkJIGRvbnRkZWx0ZW1wcyA/ICJLZWVwaW5nIiA6ICJEZWxldGluZyIsCi0JICAgICAgICAgYmFzZV9maWxlX25hbWUpOwotICAgICAgaWYgKCEgZG9udGRlbHRlbXBzKQotICAgICAgICB7Ci0gICAgICAgICAgdW5saW5rIChiYXNlX2ZpbGVfbmFtZSk7Ci0JICBmcmVlIChiYXNlX2ZpbGVfbmFtZSk7Ci0JfQotICAgIH0KLSAgCi0gIGlmIChkZWxldGVfZXhwX2ZpbGUgJiYgZXhwX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBpZiAodmVyYm9zZSkKLQlmcHJpbnRmIChzdGRlcnIsICIlcyB0ZW1wb3JhcnkgZXhwIGZpbGUgJXNcbiIsCi0JCSBkb250ZGVsdGVtcHMgPyAiS2VlcGluZyIgOiAiRGVsZXRpbmciLAotCSAgICAgICAgIGV4cF9maWxlX25hbWUpOwotICAgICAgaWYgKCEgZG9udGRlbHRlbXBzKQotICAgICAgICB7Ci0gICAgICAgICAgdW5saW5rIChleHBfZmlsZV9uYW1lKTsKLSAgICAgICAgICBmcmVlIChleHBfZmlsZV9uYW1lKTsKLQl9Ci0gICAgfQotICBpZiAoZGVsZXRlX2RlZl9maWxlICYmIGRlZl9maWxlX25hbWUpCi0gICAgewotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGRlZiBmaWxlICVzXG4iLAotCQkgZG9udGRlbHRlbXBzID8gIktlZXBpbmciIDogIkRlbGV0aW5nIiwKLQkgICAgICAgICBkZWZfZmlsZV9uYW1lKTsKLSAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKLSAgICAgICAgewotICAgICAgICAgIHVubGluayAoZGVmX2ZpbGVfbmFtZSk7Ci0gICAgICAgICAgZnJlZSAoZGVmX2ZpbGVfbmFtZSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgCi1jbGVhbnVwX2FuZF9leGl0IChpbnQgc3RhdHVzKQotewotICBkZWxldGVfdGVtcF9maWxlcyAoKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLSAgCi1zdGF0aWMgaW50Ci1ydW4gKHdoYXQsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKndoYXQ7Ci0gICAgIGNoYXIgKmFyZ3M7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBwaWQsIHdhaXRfc3RhdHVzLCByZXRjb2RlOwotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqKmFyZ3Y7Ci0gIGNoYXIgKmVycm1zZ19mbXQsICplcnJtc2dfYXJnOwotICBjaGFyICp0ZW1wX2Jhc2UgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBpbnQgaW5fcXVvdGU7Ci0gIGNoYXIgc2VwOwotCi0gIGlmICh2ZXJib3NlIHx8IGRyeV9ydW4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXMgJXNcbiIsIHdoYXQsIGFyZ3MpOwotCi0gIC8qIENvdW50IHRoZSBhcmdzICovCi0gIGkgPSAwOwotICBmb3IgKHMgPSBhcmdzOyAqczsgcysrKQotICAgIGlmICgqcyA9PSAnICcpCi0gICAgICBpKys7Ci0gIGkrKzsKLSAgYXJndiA9IGFsbG9jYSAoc2l6ZW9mIChjaGFyICopICogKGkgKyAzKSk7Ci0gIGkgPSAwOwotICBhcmd2W2krK10gPSB3aGF0OwotICBzID0gYXJnczsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgd2hpbGUgKCpzID09ICcgJyAmJiAqcyAhPSAwKQotCXMrKzsKLSAgICAgIGlmICgqcyA9PSAwKQotCWJyZWFrOwotICAgICAgaW5fcXVvdGUgPSAoKnMgPT0gJ1wnJyB8fCAqcyA9PSAnIicpOwotICAgICAgc2VwID0gKGluX3F1b3RlKSA/ICpzKysgOiAnICc7Ci0gICAgICBhcmd2W2krK10gPSBzOwotICAgICAgd2hpbGUgKCpzICE9IHNlcCAmJiAqcyAhPSAwKQotCXMrKzsKLSAgICAgIGlmICgqcyA9PSAwKQotCWJyZWFrOwotICAgICAgKnMrKyA9IDA7Ci0gICAgICBpZiAoaW5fcXVvdGUpCi0gICAgICAgIHMrKzsKLSAgICB9Ci0gIGFyZ3ZbaSsrXSA9IE5VTEw7Ci0KLSAgaWYgKGRyeV9ydW4pCi0gICAgcmV0dXJuIDA7Ci0KLSAgcGlkID0gcGV4ZWN1dGUgKGFyZ3ZbMF0sIChjaGFyICogY29uc3QgKikgYXJndiwgcHJvZ3JhbV9uYW1lLCB0ZW1wX2Jhc2UsCi0JCSAgJmVycm1zZ19mbXQsICZlcnJtc2dfYXJnLCBQRVhFQ1VURV9PTkUgfCBQRVhFQ1VURV9TRUFSQ0gpOwotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgaW50IGVycm5vX3ZhbCA9IGVycm5vOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6ICVzXG4iLCBzdHJlcnJvciAoZXJybm9fdmFsKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0Y29kZSA9IDA7Ci0gIHBpZCA9IHB3YWl0IChwaWQsICZ3YWl0X3N0YXR1cywgMCk7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHdhaXQ6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgcmV0Y29kZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChXSUZTSUdOQUxFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWRcbiIsCi0JICAgICAgIHByb2dyYW1fbmFtZSwgV1RFUk1TSUcgKHdhaXRfc3RhdHVzKSk7Ci0gICAgICByZXRjb2RlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRkVYSVRFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGlmIChXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpICE9IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwKLQkgIAkgICBwcm9ncmFtX25hbWUsIHdoYXQsIFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykpOwotCSAgcmV0Y29kZSA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHJldGNvZGUgPSAxOwotICAKLSAgcmV0dXJuIHJldGNvZGU7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW15YmFzZW5hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKmJhc2UgPSBuYW1lOwotCi0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUgPT0gJy8nIHx8ICpuYW1lID09ICdcXCcpCi0JewotCSAgYmFzZSA9IG5hbWUgKyAxOwotCX0KLSAgICAgICsrbmFtZTsKLSAgICB9Ci0gIHJldHVybiAoY2hhciAqKSBiYXNlOwotfQotCi1zdGF0aWMgaW50IAotc3RyaGFzaCAoY29uc3QgY2hhciAqc3RyKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIGhhc2ggPSAwOwotICBsZW4gPSAwOwotICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyOwotICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggKz0gYyArIChjIDw8IDE3KTsKLSAgICAgIGhhc2ggXj0gaGFzaCA+PiAyOwotICAgICAgKytsZW47Ci0gICAgfQotICBoYXNoICs9IGxlbiArIChsZW4gPDwgMTcpOwotICBoYXNoIF49IGhhc2ggPj4gMjsKLQotICByZXR1cm4gaGFzaDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLXByaW50X3ZlcnNpb24gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoIkdOVSAlcyAlc1xuIiwgbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKLSAgcHJpbnRmICgiQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKTsKLSAgcHJpbnRmICgiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIik7Ci0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIiwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgR2VuZXJpYyBvcHRpb25zOlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXF1aWV0LCAtcSAgICAgICAgICAgIFdvcmsgcXVpZXRseVxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXZlcmJvc2UsIC12ICAgICAgICAgIFZlcmJvc2VcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS12ZXJzaW9uICAgICAgICAgICAgICBQcmludCBkbGx3cmFwIHZlcnNpb25cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1pbXBsaWIgPG91dG5hbWU+ICAgICBTeW5vbnltIGZvciAtLW91dHB1dC1saWJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICBPcHRpb25zIGZvciAlczpcbiIsIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRyaXZlci1uYW1lIDxkcml2ZXI+IERlZmF1bHRzIHRvIFwiZ2NjXCJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcml2ZXItZmxhZ3MgPGZsYWdzPiBPdmVycmlkZSBkZWZhdWx0IGxkIGZsYWdzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGxsdG9vbC1uYW1lIDxkbGx0b29sPiBEZWZhdWx0cyB0byBcImRsbHRvb2xcIlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWVudHJ5IDxlbnRyeT4gICAgICAgIFNwZWNpZnkgYWx0ZXJuYXRlIERMTCBlbnRyeSBwb2ludFxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWltYWdlLWJhc2UgPGJhc2U+ICAgIFNwZWNpZnkgaW1hZ2UgYmFzZSBhZGRyZXNzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tdGFyZ2V0IDxtYWNoaW5lPiAgICAgaTM4Ni1jeWd3aW4zMiBvciBpMzg2LW1pbmd3MzJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcnktcnVuICAgICAgICAgICAgICBTaG93IHdoYXQgbmVlZHMgdG8gYmUgcnVuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbW5vLWN5Z3dpbiAgICAgICAgICAgQ3JlYXRlIE1pbmd3IERMTFxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgIE9wdGlvbnMgcGFzc2VkIHRvIERMTFRPT0w6XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbWFjaGluZSA8bWFjaGluZT5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBleHBvcnQgZmlsZS5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtbGliIDxvdXRuYW1lPiBHZW5lcmF0ZSBpbnB1dCBsaWJyYXJ5LlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIG91dHB1dCBsaWIuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGVmIDxkZWZmaWxlPiAgICAgICAgTmFtZSBpbnB1dCAuZGVmIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG91dHB1dCAuZGVmIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCAuZHJlY3R2ZSBzeW1ib2xzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiBFeGNsdWRlIDxsaXN0PiBmcm9tIC5kZWZcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzICAgIFphcCBkZWZhdWx0IGV4Y2x1ZGUgc3ltYm9sc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWJhc2UtZmlsZSA8YmFzZWZpbGU+IFJlYWQgbGlua2VyIGdlbmVyYXRlZCBiYXNlIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1pZGF0YTQgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvblxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vLWlkYXRhNSAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC1VICAgICAgICAgICAgICAgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIC5saWJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLWsgICAgICAgICAgICAgICAgICAgICBLaWxsIEA8bj4gZnJvbSBleHBvcnRlZCBuYW1lc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlclxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vZGVsZXRlICAgICAgICAgICAgIEtlZXAgdGVtcCBmaWxlcy5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICBSZXN0IGFyZSBwYXNzZWQgdW5tb2RpZmllZCB0byB0aGUgbGFuZ3VhZ2UgZHJpdmVyXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuXG4iKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotI2RlZmluZSBPUFRJT05fU1RBUlQJCTE0OQotCi0vKiBHRU5FUklDIG9wdGlvbnMuICovCi0jZGVmaW5lIE9QVElPTl9RVUlFVAkJKE9QVElPTl9TVEFSVCArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJCT1NFCQkoT1BUSU9OX1FVSUVUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCShPUFRJT05fVkVSQk9TRSArIDEpCi0KLS8qIERMTFdSQVAgb3B0aW9ucy4gKi8KLSNkZWZpbmUgT1BUSU9OX0RSWV9SVU4JCShPUFRJT05fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9EUklWRVJfTkFNRQkoT1BUSU9OX0RSWV9SVU4gKyAxKQotI2RlZmluZSBPUFRJT05fRFJJVkVSX0ZMQUdTCShPUFRJT05fRFJJVkVSX05BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fRExMVE9PTF9OQU1FCShPUFRJT05fRFJJVkVSX0ZMQUdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VOVFJZCQkoT1BUSU9OX0RMTFRPT0xfTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCShPUFRJT05fRU5UUlkgKyAxKQotI2RlZmluZSBPUFRJT05fVEFSR0VUCQkoT1BUSU9OX0lNQUdFX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fTU5PX0NZR1dJTgkoT1BUSU9OX1RBUkdFVCArIDEpCi0KLS8qIERMTFRPT0wgb3B0aW9ucy4gKi8KLSNkZWZpbmUgT1BUSU9OX05PREVMRVRFCQkoT1BUSU9OX01OT19DWUdXSU4gKyAxKQotI2RlZmluZSBPUFRJT05fRExMTkFNRQkJKE9QVElPTl9OT0RFTEVURSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19JREFUQTQgCShPUFRJT05fRExMTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19JREFUQTUJKE9QVElPTl9OT19JREFUQTQgKyAxKQotI2RlZmluZSBPUFRJT05fT1VUUFVUX0VYUAkoT1BUSU9OX05PX0lEQVRBNSArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfREVGCShPUFRJT05fT1VUUFVUX0VYUCArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJKE9QVElPTl9PVVRQVVRfREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUyAoT1BUSU9OX0VYUE9SVF9BTExfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWENMVURFX1NZTVMJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyAoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfTElCCShPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyArIDEpCi0jZGVmaW5lIE9QVElPTl9ERUYJCShPUFRJT05fT1VUUFVUX0xJQiArIDEpCi0jZGVmaW5lIE9QVElPTl9BRERfVU5ERVJTQ09SRQkoT1BUSU9OX0RFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9LSUxMQVQJCShPUFRJT05fQUREX1VOREVSU0NPUkUgKyAxKQotI2RlZmluZSBPUFRJT05fSEVMUAkJKE9QVElPTl9LSUxMQVQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFDSElORQkJKE9QVElPTl9IRUxQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FERF9JTkRJUkVDVAkoT1BUSU9OX01BQ0hJTkUgKyAxKQotI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCShPUFRJT05fQUREX0lORElSRUNUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FTCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgLyogZ2VuZXJpYyBvcHRpb25zLiAqLwotICB7InF1aWV0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdxJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAotICB7ImltcGxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUUFVUX0xJQn0sCi0KLSAgLyogZGxsd3JhcCBvcHRpb25zLiAqLwotICB7ImRyeS1ydW4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RSWV9SVU59LAotICB7ImRyaXZlci1uYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfTkFNRX0sCi0gIHsiZHJpdmVyLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfRkxBR1N9LAotICB7ImRsbHRvb2wtbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMVE9PTF9OQU1FfSwKLSAgeyJlbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEFSR0VUfSwKLQotICAvKiBkbGx0b29sIG9wdGlvbnMuICovCi0gIHsibm8tZGVsZXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsiZGxsbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMTkFNRX0sCi0gIHsibm8taWRhdGE0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19JREFUQTR9LAotICB7Im5vLWlkYXRhNSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fSURBVEE1fSwKLSAgeyJvdXRwdXQtZXhwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfRVhQfSwKLSAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfREVGfSwKLSAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTExfU1lNU30sCi0gIHsibm8tZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVN9LAotICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1TfSwKLSAgeyJuby1kZWZhdWx0LWV4Y2x1ZGVzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTfSwKLSAgeyJvdXRwdXQtbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfTElCfSwKLSAgeyJkZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRn0sCi0gIHsiYWRkLXVuZGVyc2NvcmUiLCBub19hcmd1bWVudCwgTlVMTCwgJ1UnfSwKLSAgeyJraWxsYXQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2snfSwKLSAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJtYWNoaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUNISU5FfSwKLSAgeyJhZGQtaW5kaXJlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FERF9JTkRJUkVDVH0sCi0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAotICB7ImFzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU30sCi0gIHswfQotfTsKLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgaTsKLQotICBjaGFyICoqc2F2ZWRfYXJndiA9IDA7Ci0gIGludCBjbWRsaW5lX2xlbiA9IDA7Ci0KLSAgaW50IGV4cG9ydF9hbGwgPSAwOwotCi0gIGludCAqZGxsdG9vbF9hcmdfaW5kaWNlczsKLSAgaW50ICpkcml2ZXJfYXJnX2luZGljZXM7Ci0KLSAgY2hhciAqZHJpdmVyX2ZsYWdzID0gMDsKLSAgY2hhciAqb3V0cHV0X2xpYl9maWxlX25hbWUgPSAwOwotCi0gIGR5bl9zdHJpbmdfdCBkbGx0b29sX2NtZGxpbmU7Ci0gIGR5bl9zdHJpbmdfdCBkcml2ZXJfY21kbGluZTsKLQotICBpbnQgZGVmX2ZpbGVfc2VlbiA9IDA7Ci0KLSAgY2hhciAqaW1hZ2VfYmFzZV9zdHIgPSAwOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgc2F2ZWRfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChjaGFyKikpOwotICBkbGx0b29sX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKLSAgZHJpdmVyX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKLSAgZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJndltpXSk7Ci0gICAgICBjaGFyICphcmcgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cmNweSAoYXJnLCBhcmd2W2ldKTsKLSAgICAgIGNtZGxpbmVfbGVuICs9IGxlbjsKLSAgICAgIHNhdmVkX2FyZ3ZbaV0gPSBhcmc7Ci0gICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW2ldID0gMDsKLSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tpXSA9IDE7Ci0gICAgfQotICBjbWRsaW5lX2xlbisrOwotCi0gIC8qIFdlIHJlY29nbml6ZSBkbGx3cmFwIGFuZCBkbGx0b29sIG9wdGlvbnMsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMKLSAgICAgcGFzc2VkIG9udG8gdGhlIGxhbmd1YWdlIGRyaXZlciAoZWcuLCB0byBHQ0MpLiBXZSBjb2xsZWN0IG9wdGlvbnMKLSAgICAgdG8gZGxsdG9vbCBhbmQgZHJpdmVyIGluIGRsbHRvb2xfYXJncyBhbmQgZHJpdmVyX2FyZ3MuICovCi0gICAKLSAgb3B0ZXJyID0gMDsKLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIm5rQXF2ZTpVaG86bDpMOkk6IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGludCBkbGx0b29sX2FyZzsKLSAgICAgIGludCBkcml2ZXJfYXJnOwotICAgICAgaW50IHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyOwotCi0gICAgICBkbGx0b29sX2FyZyA9IDA7Ci0gICAgICBkcml2ZXJfYXJnID0gMTsKLSAgICAgIHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMDsKLQotICAgICAgaWYgKGMgIT0gJz8nKQotICAgICAgICB7Ci0JICAvKiBXZSByZWNvZ25pemUgdGhpcyBvcHRpb24sIHNvIGl0IGhhcyB0byBiZSBlaXRoZXIgZGxsd3JhcCBvcgotCSAgICAgZGxsdG9vbCBvcHRpb24uIERvIG5vdCBwYXNzIHRvIGRyaXZlciB1bmxlc3MgaXQncyBvbmUgb2YgdGhlCi0JICAgICBnZW5lcmljIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIGFsbCB0aGUgdG9vbHMgKHN1Y2ggYXMgLXYpCi0JICAgICB3aGljaCBhcmUgZGVhbHQgd2l0aCBsYXRlci4gKi8KLQkgIGRyaXZlcl9hcmcgPSAwOwotCX0KLQotICAgICAgLyogZGVhbCB3aXRoIGdlbmVyaWMgYW5kIGRsbHdyYXAgb3B0aW9ucyBmaXJzdC4gKi8KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgdmVyYm9zZSA9IDA7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIHByaW50X3ZlcnNpb24gKHByb2dyYW1fbmFtZSk7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGVudHJ5X3BvaW50ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLQkgIGltYWdlX2Jhc2Vfc3RyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVGOgotCSAgZGVmX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGRlZl9maWxlX3NlZW4gPSAxOwotCSAgZGVsZXRlX2RlZl9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgZG9udGRlbHRlbXBzID0gMTsKLQkgIGRsbHRvb2xfYXJnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgZGxsX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCWNhc2UgJ2wnOgotCWNhc2UgJ0wnOgotCSAgZHJpdmVyX2FyZyA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ETExOQU1FOgotCSAgZGxsX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUllfUlVOOgotCSAgZHJ5X3J1biA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUklWRVJfTkFNRToKLQkgIGRyaXZlcl9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFJJVkVSX0ZMQUdTOgotCSAgZHJpdmVyX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRExMVE9PTF9OQU1FOgotCSAgZGxsdG9vbF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEFSR0VUOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTU5PX0NZR1dJTjoKLQkgIHRhcmdldCA9ICJpMzg2LW1pbmd3MzIiOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotCSAgYmFzZV9maWxlX25hbWUgPSBvcHRhcmc7Ci0JICBkZWxldGVfYmFzZV9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX09VVFBVVF9FWFA6Ci0JICBleHBfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgZGVsZXRlX2V4cF9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGwgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fT1VUUFVUX0xJQjoKLQkgIG91dHB1dF9saWJfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnPyc6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZGxsdG9vbF9hcmcgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICAvKiBIYW5kbGUgcGFzc2luZyB0aHJvdWdoIC0tb3B0aW9uPXZhbHVlIGNhc2UuICovCi0gICAgICBpZiAob3B0YXJnIAotICAgICAgICAgICYmIHNhdmVkX2FyZ3Zbb3B0aW5kLTFdWzBdID09ICctJyAKLSAgICAgICAgICAmJiBzYXZlZF9hcmd2W29wdGluZC0xXVsxXSA9PSAnLScgCi0JICAmJiBzdHJjaHIgKHNhdmVkX2FyZ3Zbb3B0aW5kLTFdLCAnPScpKQotCXNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMTsKLQotICAgICAgaWYgKGRsbHRvb2xfYXJnKQotICAgICAgICB7Ci0JICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0xXSA9IDE7Ci0JICBpZiAob3B0YXJnICYmICEgc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXIpCi0JICAgIHsKLQkgICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0yXSA9IDE7Ci0JICAgIH0gCi0JfQotCi0gICAgICBpZiAoISBkcml2ZXJfYXJnKQotICAgICAgICB7Ci0JICBkcml2ZXJfYXJnX2luZGljZXNbb3B0aW5kLTFdID0gMDsKLQkgIGlmIChvcHRhcmcgJiYgISBzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpcikKLQkgICAgewotCSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tvcHRpbmQtMl0gPSAwOwotCSAgICB9IAotCX0KLSAgICB9Ci0KLSAgLyogc2FuaXR5IGNoZWNrcy4gKi8KLSAgaWYgKCEgZGxsX25hbWUgJiYgISBkbGxfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgICAgICIlczogTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBvZiAtbyBvciAtLWRsbG5hbWUgb3B0aW9uc1xuIiwKLSAgICAgICAgICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZGxsX25hbWUpCi0gICAgewotICAgICAgZGxsX25hbWUgPSB4c3RyZHVwIChteWJhc2VuYW1lIChkbGxfZmlsZV9uYW1lKSk7Ci0gICAgfQotICBlbHNlIGlmICghIGRsbF9maWxlX25hbWUpCi0gICAgewotICAgICAgZGxsX2ZpbGVfbmFtZSA9IHhzdHJkdXAgKGRsbF9uYW1lKTsKLSAgICB9Ci0KLSAgLyogRGVkdWNlIGRyaXZlci1uYW1lIGFuZCBkbGx0b29sLW5hbWUgZnJvbSBvdXIgb3duLiAqLwotICBpZiAoZHJpdmVyX25hbWUgPT0gTlVMTCkKLSAgICBkcml2ZXJfbmFtZSA9IGRlZHVjZV9uYW1lICgiZ2NjIik7Ci0KLSAgaWYgKGRsbHRvb2xfbmFtZSA9PSBOVUxMKQotICAgIGRsbHRvb2xfbmFtZSA9IGRlZHVjZV9uYW1lICgiZGxsdG9vbCIpOwotCi0gIGlmICghIGRlZl9maWxlX3NlZW4pCi0gICAgewotICAgICAgY2hhciAqZmlsZXByZWZpeCA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gICAgICBkZWZfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDUpOwotICAgICAgc3ByaW50ZiAoZGVmX2ZpbGVfbmFtZSwgIiVzLmRlZiIsIAotICAgICAgICAgICAgICAgKGRvbnRkZWx0ZW1wcykgPyBteWJhc2VuYW1lIChmaWxlcHJlZml4KSA6IGZpbGVwcmVmaXgpOwotICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IG5vIGV4cG9ydCBkZWZpbml0aW9uIGZpbGUgcHJvdmlkZWRcbiIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAKLSAgICAgICAgICAgICAgICJkbGx3cmFwIHdpbGwgY3JlYXRlIG9uZSwgYnV0IG1heSBub3QgYmUgd2hhdCB5b3Ugd2FudFxuIik7Ci0gICAgfQotICAKLSAgLyogc2V0IHRoZSB0YXJnZXQgcGxhdGZvcm0uICovCi0gIGlmIChzdHJzdHIgKHRhcmdldCwgImN5Z3dpbjMyIikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gQ1lHV0lOX1RBUkdFVDsKLSAgZWxzZSBpZiAoc3Ryc3RyICh0YXJnZXQsICJtaW5ndzMyIikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gTUlOR1czMl9UQVJHRVQ7Ci0gIGVsc2UgCi0gICAgd2hpY2hfdGFyZ2V0ID0gVU5LTk9XTl9UQVJHRVQ7Ci0KLSAgLyogcmUtY3JlYXRlIHRoZSBjb21tYW5kIGxpbmVzIGFzIGEgc3RyaW5nLCB0YWtpbmcgY2FyZSB0byBxdW90ZSBzdHVmZi4gKi8KLSAgZGxsdG9vbF9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtdiIpOwotICAgIH0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtLWRsbG5hbWUgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGRsbF9uYW1lKTsKLQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKQotICAgIHsKLSAgICAgIGlmIChkbGx0b29sX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgCi0JICAgICAgICAgICAgICAgICAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGFyZyk7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotCi0gIGRyaXZlcl9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKLSAgaWYgKCEgZHJpdmVyX2ZsYWdzIHx8IHN0cmxlbiAoZHJpdmVyX2ZsYWdzKSA9PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAod2hpY2hfdGFyZ2V0KQotICAgICAgICB7Ci0JY2FzZSBDWUdXSU5fVEFSR0VUOgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IGN5Z3dpbl9kcml2ZXJfZmxhZ3M7Ci0JICBicmVhazsKLQkKLQljYXNlIE1JTkdXMzJfVEFSR0VUOgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IG1pbmd3MzJfZHJpdmVyX2ZsYWdzOwotCSAgYnJlYWs7Ci0JCi0JZGVmYXVsdDoKLSAgICAgICAgICBkcml2ZXJfZmxhZ3MgPSBnZW5lcmljX2RyaXZlcl9mbGFnczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZHJpdmVyX2ZsYWdzKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAiIC1vICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGRsbF9maWxlX25hbWUpOwotCi0gIGlmICghIGVudHJ5X3BvaW50IHx8IHN0cmxlbiAoZW50cnlfcG9pbnQpID09IDApCi0gICAgewotICAgICAgc3dpdGNoICh3aGljaF90YXJnZXQpCi0gICAgICAgIHsKLQljYXNlIENZR1dJTl9UQVJHRVQ6Ci0JICBlbnRyeV9wb2ludCA9ICJfX2N5Z3dpbl9kbGxfZW50cnlAMTIiOwotCSAgYnJlYWs7Ci0JCi0JY2FzZSBNSU5HVzMyX1RBUkdFVDoKLQkgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQ1JUU3RhcnR1cEAxMiI7Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotICAgICAgICAgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQDEyIjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLWUsIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZW50cnlfcG9pbnQpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZXhjbHVkZS1zeW1ib2w9Iik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgKGVudHJ5X3BvaW50WzBdID09ICdfJykgPyBlbnRyeV9wb2ludCsxIDogZW50cnlfcG9pbnQpOwotCi0gIGlmICghIGltYWdlX2Jhc2Vfc3RyIHx8IHN0cmxlbiAoaW1hZ2VfYmFzZV9zdHIpID09IDApCi0gICAgewotICAgICAgY2hhciAqdG1wYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICgiMHgxMjM0NTY3OCIpICsgMSk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhhc2ggPSBzdHJoYXNoIChkbGxfZmlsZV9uYW1lKTsKLSAgICAgIHNwcmludGYgKHRtcGJ1ZiwgIjB4JS44bFgiLCAweDYwMDAwMDAwfCgoaGFzaDw8MTYpJjB4RkZDMDAwMCkpOwotICAgICAgaW1hZ2VfYmFzZV9zdHIgPSB0bXBidWY7Ci0gICAgfQotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLS1pbWFnZS1iYXNlLCIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGltYWdlX2Jhc2Vfc3RyKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsICIgLXYiKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoZHJpdmVyX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIiBcIiIgOiAiICIpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBhcmcpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotICAKLSAgLyoKLSAgICogU3RlcCBwcmUtMS4gSWYgbm8gLS1kZWYgPEVYUE9SVF9ERUY+IGlzIHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgaXQKLSAgICogYW5kIHRoZW4gcGFzcyBpdCBvbi4KLSAgICovCi0gIAotICBpZiAoISBkZWZfZmlsZV9zZWVuKSAKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGR5bl9zdHJpbmdfdCBzdGVwX3ByZTE7Ci0KLSAgICAgIHN0ZXBfcHJlMSA9IGR5bl9zdHJpbmdfbmV3ICgxMDI0KTsKLQotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIGlmIChleHBvcnRfYWxsKQotCXsKLSAgICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCAiIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9sPSIpOwotICAgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsIAotCSAgIl9jeWd3aW5fZGxsX2VudHJ5QDEyLERsbE1haW5DUlRTdGFydHVwQDEyLERsbE1haW5AMTIsRGxsRW50cnlQb2ludEAxMiIpOwotCX0KLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsICIgLS1vdXRwdXQtZGVmICIpOwotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGVmX2ZpbGVfbmFtZSk7Ci0KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0JewotCSAgaWYgKGRyaXZlcl9hcmdfaW5kaWNlc1tpXSkKLQkgICAgewotCSAgICAgIGNoYXIgKmFyZyA9IHNhdmVkX2FyZ3ZbaV07Ci0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJnKTsKLQkgICAgICBpZiAobGVuID49IDIgJiYgYXJnW2xlbi0yXSA9PSAnLicgCi0JICAgICAgICAgICYmIChhcmdbbGVuLTFdID09ICdvJyB8fCBhcmdbbGVuLTFdID09ICdhJykpCi0JCXsKLQkJICBpbnQgcXVvdGUgPSAoc3RyY2hyIChhcmcsICcgJykgfHwgc3RyY2hyIChhcmcsICdcdCcpKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLAotCQkJCSAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCBhcmcpOwotCQkgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsCi0JCQkJICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXBfcHJlMS0+cykpCi0JY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgICAKLSAgICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwX3ByZTEpOwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZGVmICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCBkZWZfZmlsZV9uYW1lKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJETExUT09MIG5hbWUgICAgOiAlc1xuIiwgZGxsdG9vbF9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRMTFRPT0wgb3B0aW9ucyA6ICVzXG4iLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRFJJVkVSIG5hbWUgICAgIDogJXNcbiIsIGRyaXZlcl9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRSSVZFUiBvcHRpb25zICA6ICVzXG4iLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgfQotIAotICAvKgotICAgKiBTdGVwIDEuIENhbGwgR0NDL0xEIHRvIGNyZWF0ZSBiYXNlIHJlbG9jYXRpb24gZmlsZS4gSWYgdXNpbmcgR0NDLCB0aGUKLSAgICogZHJpdmVyIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBnY2MgLVdsLC0tZGxsIC0tV2wsLS1iYXNlLWZpbGUsZm9vLmJhc2UgW3Jlc3Qgb2YgY29tbWFuZCBsaW5lXQotICAgKgotICAgKiBJZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGEgYmFzZSBuYW1lLCBjcmVhdGUgdGVtcG9yYXJ5IG9uZSB0aGF0Ci0gICAqIGlzIGRlbGV0ZWQgYXQgZXhpdC4KLSAgICoKLSAgICovCi0gIAotICBpZiAoISBiYXNlX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlcHJlZml4ID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgICAgIGJhc2VfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDYpOwotICAgICAgc3ByaW50ZiAoYmFzZV9maWxlX25hbWUsICIlcy5iYXNlIiwgCi0gICAgICAgICAgICAgICAoZG9udGRlbHRlbXBzKSA/IG15YmFzZW5hbWUgKGZpbGVwcmVmaXgpIDogZmlsZXByZWZpeCk7Ci0gICAgICBkZWxldGVfYmFzZV9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgIH0KLSAgCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDEgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGJhc2VfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIi1XbCwtLWJhc2UtZmlsZSwiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDEsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDEtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAxKTsKLSAgfQotCi0KLQotICAvKgotICAgKiBTdGVwIDIuIGdlbmVyYXRlIHRoZSBleHAgZmlsZSBieSBydW5uaW5nIGRsbHRvb2wuIAotICAgKiBkbGx0b29sIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBkbGx0b29sIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIFtyZXN0IG9mIGNvbW1hbmQgbGluZV0KLSAgICoKLSAgICogSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhIGJhc2UgbmFtZSwgY3JlYXRlIHRlbXBvcmFyeSBvbmUgdGhhdAotICAgKiBpcyBkZWxldGVkIGF0IGV4aXQuCi0gICAqCi0gICAqLwotICAKLSAgaWYgKCEgZXhwX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpwID0gc3RycmNociAoZGxsX25hbWUsICcuJyk7Ci0gICAgICBzaXplX3QgcHJlZml4X2xlbiA9IChwKSA/IHAgLSBkbGxfbmFtZSA6IHN0cmxlbiAoZGxsX25hbWUpOwotICAgICAgZXhwX2ZpbGVfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHByZWZpeF9sZW4gKyA0ICsgMSk7Ci0gICAgICBzdHJuY3B5IChleHBfZmlsZV9uYW1lLCBkbGxfbmFtZSwgcHJlZml4X2xlbik7Ci0gICAgICBleHBfZmlsZV9uYW1lW3ByZWZpeF9sZW5dID0gJ1wwJzsKLSAgICAgIHN0cmNhdCAoZXhwX2ZpbGVfbmFtZSwgIi5leHAiKTsKLSAgICAgIGRlbGV0ZV9leHBfZmlsZSA9IDE7Ci0gICAgfQotICAKLSAgewotICAgIGludCBxdW90ZTsKLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDIgPSBkeW5fc3RyaW5nX25ldyAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChiYXNlX2ZpbGVfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsICItLWJhc2UtZmlsZSAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiAiIDogIiAiKTsKLQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIi0tb3V0cHV0LWV4cCAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIGV4cF9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0KLSAgICBpZiAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgfQotCi0gICAgaWYgKHJ1biAoZGxsdG9vbF9uYW1lLCBzdGVwMi0+cykpCi0gICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAKLSAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDIpOwotICB9Ci0KLSAgLyoKLSAgICogU3RlcCAzLiBDYWxsIEdDQy9MRCB0byBhZ2FpbiwgYWRkaW5nIHRoZSBleHAgZmlsZSB0aGlzIHRpbWUuCi0gICAqIGRyaXZlciBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICogICAgCi0gICAqICAgICUgZ2NjIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIGZvby5leHAgW3Jlc3QgLi4uXQotICAgKi8KLQotICB7Ci0gICAgaW50IHF1b3RlOwotCi0gICAgZHluX3N0cmluZ190IHN0ZXAzID0gZHluX3N0cmluZ19uZXcgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAiLVdsLC0tYmFzZS1maWxlLCIpOwotICAgIHF1b3RlID0gKHN0cmNociAoYmFzZV9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBiYXNlX2ZpbGVfbmFtZSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiICIgOiAiICIpOwotCi0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDMtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAzKTsKLSAgfQotCi0KLSAgLyoKLSAgICogU3RlcCA0LiBSdW4gRExMVE9PTCBhZ2FpbiB1c2luZyB0aGUgc2FtZSBjb21tYW5kIGxpbmUuCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0gICAgZHluX3N0cmluZ190IHN0ZXA0ID0gZHluX3N0cmluZ19uZXcgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiLS1iYXNlLWZpbGUgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJyAnKSAKLSAgICAgICAgICAgICB8fCBzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIGJhc2VfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIgIiA6ICIgIik7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICItLW91dHB1dC1leHAgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoKQotICAgICAgewotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICIgIik7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIH0KLQotICAgIGlmIChvdXRwdXRfbGliX2ZpbGVfbmFtZSkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiIC0tb3V0cHV0LWxpYiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBvdXRwdXRfbGliX2ZpbGVfbmFtZSk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXA0LT5zKSkKLSAgICAgIGNsZWFudXBfYW5kX2V4aXQgKDEpOwotICAgIAotICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwNCk7Ci0gIH0KLSAgCi0KLSAgLyoKLSAgICogU3RlcCA1LiBMaW5rIGl0IGFsbCB0b2dldGhlciBhbmQgYmUgZG9uZSB3aXRoIGl0LgotICAgKiBkcml2ZXIgY29tbWFuZCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAqICAgIAotICAgKiAgICAlIGdjYyAtV2wsLS1kbGwgZm9vLmV4cCBbcmVzdCAuLi5dCi0gICAqCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDUgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDUsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDUtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXA1KTsKLSAgfQotCi0gIGNsZWFudXBfYW5kX2V4aXQgKDApOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5jIGIvYmludXRpbHMvZHluLXN0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGEzMDQzLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKiBBbiBhYnN0cmFjdCBzdHJpbmcgZGF0YXR5cGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLSAgIEdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBiaW51dGlscyBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpZmRlZiBJTl9HQ0MKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLSNpbmNsdWRlICJnYW5zaWRlY2wuaCIKLSNlbHNlCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNlbmRpZgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7Ci1leHRlcm4gY2hhciAqeHJlYWxsb2MgKCk7Ci0KLS8qIENyZWF0ZSBhIG5ldyBkeW5hbWljIHN0cmluZyBjYXBhYmxlIG9mIGhvbGRpbmcgYXQgbGVhc3QgU1BBQ0UKLSAgIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLiAgSWYgU1BBQ0UgaXMgMCwgaXQKLSAgIHdpbGwgYmUgc2lsZW50bHkgaW5jcmVhc2VkIHRvIDEuICAqLwotCi1keW5fc3RyaW5nX3QgCi1keW5fc3RyaW5nX25ldyAoc3BhY2UpCi0gICAgIGludCBzcGFjZTsKLXsKLSAgZHluX3N0cmluZ190IHJlc3VsdCA9IChkeW5fc3RyaW5nX3QpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGR5bl9zdHJpbmcpKTsKLSAKLSAgaWYgKHNwYWNlID09IDApCi0gICAgLyogV2UgbmVlZCBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdGVybWluYXRpbmcKLSAgICAgICBOVUwuICAqLwotICAgIHNwYWNlID0gMTsKLQotICByZXN1bHQtPmFsbG9jYXRlZCA9IHNwYWNlOwotICByZXN1bHQtPnMgPSAoY2hhciopIHhtYWxsb2MgKHNwYWNlKTsKLSAgcmVzdWx0LT5sZW5ndGggPSAwOwotICByZXN1bHQtPnNbMF0gPSAnXDAnOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IERTLiAgKi8KLQotdm9pZCAKLWR5bl9zdHJpbmdfZGVsZXRlIChkcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotewotICBmcmVlIChkcy0+cyk7Ci0gIGZyZWUgKGRzKTsKLX0KLQotLyogQXBwZW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgUyB0byBEUywgcmVzaXppbmcgRFMgaWYKLSAgIG5lY2Vzc2FyeS4gICovCi0KLWR5bl9zdHJpbmdfdCAKLWR5bl9zdHJpbmdfYXBwZW5kIChkcywgcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBjaGFyICpzOwotewotICBpbnQgbGVuID0gc3RybGVuIChzKTsKLSAgZHluX3N0cmluZ19yZXNpemUgKGRzLCBkcy0+bGVuZ3RoICsgbGVuICsgMSAvKiAnXDAnICovKTsKLSAgc3RyY3B5IChkcy0+cyArIGRzLT5sZW5ndGgsIHMpOwotICBkcy0+bGVuZ3RoICs9IGxlbjsKLQotICByZXR1cm4gZHM7Ci19Ci0KLS8qIEluY3JlYXNlIHRoZSBjYXBhY2l0eSBvZiBEUyBzbyB0aGF0IGl0IGNhbiBob2xkIGF0IGxlYXN0IFNQQUNFCi0gICBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgIChhdCBwcmVzZW50KSByZWR1Y2UgdGhlIGNhcGFjaXR5IG9mIERTLiAgKi8KLQotZHluX3N0cmluZ190IAotZHluX3N0cmluZ19yZXNpemUgKGRzLCBzcGFjZSkKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBpbnQgc3BhY2U7Ci17Ci0gIGludCBuZXdfYWxsb2NhdGVkID0gZHMtPmFsbG9jYXRlZDsKLQotICB3aGlsZSAoc3BhY2UgPiBuZXdfYWxsb2NhdGVkKQotICAgIG5ld19hbGxvY2F0ZWQgKj0gMjsKLSAgICAKLSAgaWYgKG5ld19hbGxvY2F0ZWQgIT0gZHMtPmFsbG9jYXRlZCkKLSAgICB7Ci0gICAgICAvKiBXZSBhY3R1YWxseSBuZWVkIG1vcmUgc3BhY2UuICAqLwotICAgICAgZHMtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7Ci0gICAgICBkcy0+cyA9IChjaGFyKikgeHJlYWxsb2MgKGRzLT5zLCBkcy0+YWxsb2NhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRzOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5oIGIvYmludXRpbHMvZHluLXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJiYmJmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIEFuIGFic3RyYWN0IHN0cmluZyBkYXRhdHlwZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotICAgR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGJpbnV0aWxzIGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZHluX3N0cmluZwotewotICBpbnQgYWxsb2NhdGVkOyAvKiBUaGUgYW1vdW50IG9mIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIHN0cmluZy4gICovCi0gIGludCBsZW5ndGg7IC8qIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICAqLwotICBjaGFyICpzOyAvKiBUaGUgc3RyaW5nIGl0c2VsZiwgTlVMLXRlcm1pbmF0ZWQuICAqLwotfSogZHluX3N0cmluZ190OwotCi1leHRlcm4gZHluX3N0cmluZ190IGR5bl9zdHJpbmdfbmV3ICAgICAgUEFSQU1TKChpbnQpKTsKLWV4dGVybiB2b2lkIGR5bl9zdHJpbmdfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKGR5bl9zdHJpbmdfdCkpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX2FwcGVuZCAgIFBBUkFNUygoZHluX3N0cmluZ190LCBjaGFyKikpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX3Jlc2l6ZSAgIFBBUkFNUygoZHluX3N0cmluZ190LCBpbnQpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMgYi9iaW51dGlscy9maWxlbW9kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI1MmJhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogZmlsZW1vZGUuYyAtLSBtYWtlIGEgc3RyaW5nIGRlc2NyaWJpbmcgZmlsZSBtb2RlcwotICAgQ29weXJpZ2h0IChDKSAxOTg1LCA5MCwgOTEsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLXN0YXRpYyBjaGFyIGZ0eXBlbGV0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHNldHN0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGNoYXIgKikpOwotCi0vKiBmaWxlbW9kZXN0cmluZyAtIGZpbGwgaW4gc3RyaW5nIFNUUiB3aXRoIGFuIGxzLXN0eWxlIEFTQ0lJCi0gICByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RfbW9kZSBmaWVsZCBvZiBmaWxlIHN0YXRzIGJsb2NrIFNUQVRQLgotICAgMTAgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGluIFNUUjsgbm8gdGVybWluYXRpbmcgbnVsbCBpcyBhZGRlZC4KLSAgIFRoZSBjaGFyYWN0ZXJzIHN0b3JlZCBpbiBTVFIgYXJlOgotCi0gICAwCUZpbGUgdHlwZS4gICdkJyBmb3IgZGlyZWN0b3J5LCAnYycgZm9yIGNoYXJhY3RlcgotCXNwZWNpYWwsICdiJyBmb3IgYmxvY2sgc3BlY2lhbCwgJ20nIGZvciBtdWx0aXBsZXgsCi0JJ2wnIGZvciBzeW1ib2xpYyBsaW5rLCAncycgZm9yIHNvY2tldCwgJ3AnIGZvciBmaWZvLAotCSctJyBmb3IgYW55IG90aGVyIGZpbGUgdHlwZQotCi0gICAxCSdyJyBpZiB0aGUgb3duZXIgbWF5IHJlYWQsICctJyBvdGhlcndpc2UuCi0KLSAgIDIJJ3cnIGlmIHRoZSBvd25lciBtYXkgd3JpdGUsICctJyBvdGhlcndpc2UuCi0KLSAgIDMJJ3gnIGlmIHRoZSBvd25lciBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCi0Jc2V0LXVzZXItaWQsICctJyBvdGhlcndpc2UuCi0JJ1MnIGlmIHRoZSBmaWxlIGlzIHNldC11c2VyLWlkLCBidXQgdGhlIGV4ZWN1dGUKLQliaXQgaXNuJ3Qgc2V0LgotCi0gICA0CSdyJyBpZiBncm91cCBtZW1iZXJzIG1heSByZWFkLCAnLScgb3RoZXJ3aXNlLgotCi0gICA1CSd3JyBpZiBncm91cCBtZW1iZXJzIG1heSB3cml0ZSwgJy0nIG90aGVyd2lzZS4KLQotICAgNgkneCcgaWYgZ3JvdXAgbWVtYmVycyBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCi0Jc2V0LWdyb3VwLWlkLCAnLScgb3RoZXJ3aXNlLgotCSdTJyBpZiBpdCBpcyBzZXQtZ3JvdXAtaWQgYnV0IG5vdCBleGVjdXRhYmxlLgotCi0gICA3CSdyJyBpZiBhbnkgdXNlciBtYXkgcmVhZCwgJy0nIG90aGVyd2lzZS4KLQotICAgOAkndycgaWYgYW55IHVzZXIgbWF5IHdyaXRlLCAnLScgb3RoZXJ3aXNlLgotCi0gICA5CSd4JyBpZiBhbnkgdXNlciBtYXkgZXhlY3V0ZSwgJ3QnIGlmIHRoZSBmaWxlIGlzICJzdGlja3kiCi0JKHdpbGwgYmUgcmV0YWluZWQgaW4gc3dhcCBzcGFjZSBhZnRlciBleGVjdXRpb24pLCAnLScKLQlvdGhlcndpc2UuCi0JJ1QnIGlmIHRoZSBmaWxlIGlzIHN0aWNreSBidXQgbm90IGV4ZWN1dGFibGUuICovCi0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm90IHVzZWQ7IG9ubHkgbW9kZV9zdHJpbmcgaXMgdXNlZC4gICovCi0KLXZvaWQKLWZpbGVtb2Rlc3RyaW5nIChzdGF0cCwgc3RyKQotICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdHA7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgbW9kZV9zdHJpbmcgKCh1bnNpZ25lZCBsb25nKSBzdGF0cC0+c3RfbW9kZSwgc3RyKTsKLX0KLQotI2VuZGlmCi0KLS8qIEdldCBkZWZpbml0aW9ucyBmb3IgdGhlIGZpbGUgcGVybWlzc2lvbiBiaXRzLiAgKi8KLQotI2lmbmRlZiBTX0lSV1hVCi0jZGVmaW5lIFNfSVJXWFUgMDcwMAotI2VuZGlmCi0jaWZuZGVmIFNfSVJVU1IKLSNkZWZpbmUgU19JUlVTUiAwNDAwCi0jZW5kaWYKLSNpZm5kZWYgU19JV1VTUgotI2RlZmluZSBTX0lXVVNSIDAyMDAKLSNlbmRpZgotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAotI2VuZGlmCi0KLSNpZm5kZWYgU19JUldYRwotI2RlZmluZSBTX0lSV1hHIDAwNzAKLSNlbmRpZgotI2lmbmRlZiBTX0lSR1JQCi0jZGVmaW5lIFNfSVJHUlAgMDA0MAotI2VuZGlmCi0jaWZuZGVmIFNfSVdHUlAKLSNkZWZpbmUgU19JV0dSUCAwMDIwCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotI2RlZmluZSBTX0lYR1JQIDAwMTAKLSNlbmRpZgotCi0jaWZuZGVmIFNfSVJXWE8KLSNkZWZpbmUgU19JUldYTyAwMDA3Ci0jZW5kaWYKLSNpZm5kZWYgU19JUk9USAotI2RlZmluZSBTX0lST1RIIDAwMDQKLSNlbmRpZgotI2lmbmRlZiBTX0lXT1RICi0jZGVmaW5lIFNfSVdPVEggMDAwMgotI2VuZGlmCi0jaWZuZGVmIFNfSVhPVEgKLSNkZWZpbmUgU19JWE9USCAwMDAxCi0jZW5kaWYKLQotLyogTGlrZSBmaWxlbW9kZXN0cmluZywgYnV0IG9ubHkgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGBzdHJ1Y3Qgc3RhdCcKLSAgIGlzIGdpdmVuIGFzIGFuIGFyZ3VtZW50LiAqLwotCi12b2lkCi1tb2RlX3N0cmluZyAobW9kZSwgc3RyKQotICAgICB1bnNpZ25lZCBsb25nIG1vZGU7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RyWzBdID0gZnR5cGVsZXQgKCh1bnNpZ25lZCBsb25nKSBtb2RlKTsKLSAgc3RyWzFdID0gKG1vZGUgJiBTX0lSVVNSKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbMl0gPSAobW9kZSAmIFNfSVdVU1IpICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0clszXSA9IChtb2RlICYgU19JWFVTUikgIT0gMCA/ICd4JyA6ICctJzsKLSAgc3RyWzRdID0gKG1vZGUgJiBTX0lSR1JQKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbNV0gPSAobW9kZSAmIFNfSVdHUlApICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0cls2XSA9IChtb2RlICYgU19JWEdSUCkgIT0gMCA/ICd4JyA6ICctJzsKLSAgc3RyWzddID0gKG1vZGUgJiBTX0lST1RIKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbOF0gPSAobW9kZSAmIFNfSVdPVEgpICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0cls5XSA9IChtb2RlICYgU19JWE9USCkgIT0gMCA/ICd4JyA6ICctJzsKLSAgc2V0c3QgKCh1bnNpZ25lZCBsb25nKSBtb2RlLCBzdHIpOwotfQotCi0vKiBSZXR1cm4gYSBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBmaWxlIGRlc2NyaWJlZCBieQotICAgZmlsZSBtb2RlIEJJVFM6Ci0gICAnZCcgZm9yIGRpcmVjdG9yaWVzCi0gICAnYicgZm9yIGJsb2NrIHNwZWNpYWwgZmlsZXMKLSAgICdjJyBmb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZXMKLSAgICdtJyBmb3IgbXVsdGlwbGV4b3IgZmlsZXMKLSAgICdsJyBmb3Igc3ltYm9saWMgbGlua3MKLSAgICdzJyBmb3Igc29ja2V0cwotICAgJ3AnIGZvciBmaWZvcwotICAgJy0nIGZvciBhbnkgb3RoZXIgZmlsZSB0eXBlLiAqLwotCi0jaWZuZGVmIFNfSVNESVIKLSNpZmRlZiBTX0lGRElSCi0jZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZESVIpICovCi0jZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiAwMTcwMDAwKSA9PSAwNDAwMDApCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGRElSKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0RJUikgKi8KLQotI2lmbmRlZiBTX0lTQkxLCi0jaWZkZWYgU19JRkJMSwotI2RlZmluZSBTX0lTQkxLKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGQkxLKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGQkxLKSAqLwotI2RlZmluZSBTX0lTQkxLKGkpIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZCTEspICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTQkxLKSAqLwotCi0jaWZuZGVmIFNfSVNDSFIKLSNpZmRlZiBTX0lGQ0hSCi0jZGVmaW5lIFNfSVNDSFIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZDSFIpICovCi0jZGVmaW5lIFNfSVNDSFIoaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkNIUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNDSFIpICovCi0KLSNpZm5kZWYgU19JU0ZJRk8KLSNpZmRlZiBTX0lGSUZPCi0jZGVmaW5lIFNfSVNGSUZPKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGSUZPKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLwotI2RlZmluZSBTX0lTRklGTyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0ZJRk8pICovCi0KLSNpZm5kZWYgU19JU1NPQ0sKLSNpZmRlZiBTX0lGU09DSwotI2RlZmluZSBTX0lTU09DSyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZTT0NLKSAqLwotI2RlZmluZSBTX0lTU09DSyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGU09DSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNTT0NLKSAqLwotCi0jaWZuZGVmIFNfSVNMTksKLSNpZmRlZiBTX0lGTE5LCi0jZGVmaW5lIFNfSVNMTksoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZMTkspCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZMTkspICovCi0jZGVmaW5lIFNfSVNMTksoaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkxOSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNMTkspICovCi0KLXN0YXRpYyBjaGFyCi1mdHlwZWxldCAoYml0cykKLSAgICAgdW5zaWduZWQgbG9uZyBiaXRzOwotewotICBpZiAoU19JU0RJUiAoYml0cykpCi0gICAgcmV0dXJuICdkJzsKLSAgaWYgKFNfSVNMTksgKGJpdHMpKQotICAgIHJldHVybiAnbCc7Ci0gIGlmIChTX0lTQkxLIChiaXRzKSkKLSAgICByZXR1cm4gJ2InOwotICBpZiAoU19JU0NIUiAoYml0cykpCi0gICAgcmV0dXJuICdjJzsKLSAgaWYgKFNfSVNTT0NLIChiaXRzKSkKLSAgICByZXR1cm4gJ3MnOwotICBpZiAoU19JU0ZJRk8gKGJpdHMpKQotICAgIHJldHVybiAncCc7Ci0KLSNpZmRlZiBTX0lGTVQKLSNpZmRlZiBTX0lGTVBDCi0gIGlmICgoYml0cyAmIFNfSUZNVCkgPT0gU19JRk1QQwotICAgICAgfHwgKGJpdHMgJiBTX0lGTVQpID09IFNfSUZNUEIpCi0gICAgcmV0dXJuICdtJzsKLSNlbmRpZgotI2lmZGVmIFNfSUZOV0sKLSAgaWYgKChiaXRzICYgU19JRk1UKSA9PSBTX0lGTldLKQotICAgIHJldHVybiAnbic7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIHJldHVybiAnLSc7Ci19Ci0KLS8qIFNldCB0aGUgJ3MnIGFuZCAndCcgZmxhZ3MgaW4gZmlsZSBhdHRyaWJ1dGVzIHN0cmluZyBDSEFSUywKLSAgIGFjY29yZGluZyB0byB0aGUgZmlsZSBtb2RlIEJJVFMuICovCi0KLXN0YXRpYyB2b2lkCi1zZXRzdCAoYml0cywgY2hhcnMpCi0gICAgIHVuc2lnbmVkIGxvbmcgYml0czsKLSAgICAgY2hhciAqY2hhcnM7Ci17Ci0jaWZkZWYgU19JU1VJRAotICBpZiAoYml0cyAmIFNfSVNVSUQpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzNdICE9ICd4JykKLQkvKiBTZXQtdWlkLCBidXQgbm90IGV4ZWN1dGFibGUgYnkgb3duZXIuICovCi0JY2hhcnNbM10gPSAnUyc7Ci0gICAgICBlbHNlCi0JY2hhcnNbM10gPSAncyc7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgU19JU0dJRAotICBpZiAoYml0cyAmIFNfSVNHSUQpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzZdICE9ICd4JykKLQkvKiBTZXQtZ2lkLCBidXQgbm90IGV4ZWN1dGFibGUgYnkgZ3JvdXAuICovCi0JY2hhcnNbNl0gPSAnUyc7Ci0gICAgICBlbHNlCi0JY2hhcnNbNl0gPSAncyc7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgU19JU1ZUWAotICBpZiAoYml0cyAmIFNfSVNWVFgpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzldICE9ICd4JykKLQkvKiBTdGlja3ksIGJ1dCBub3QgZXhlY3V0YWJsZSBieSBvdGhlcnMuICovCi0JY2hhcnNbOV0gPSAnVCc7Ci0gICAgICBlbHNlCi0JY2hhcnNbOV0gPSAndCc7Ci0gICAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9iaW51dGlscy9pZWVlLmMgYi9iaW51dGlscy9pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTViODguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvaWVlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYwOSArMCwwIEBACi0vKiBpZWVlLmMgLS0gUmVhZCBhbmQgd3JpdGUgSUVFRS02OTUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSByZWFkcyBhbmQgd3JpdGVzIElFRUUtNjk1IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiaWVlZS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYW4gZW50cnkgb24gdGhlIGJsb2NrIHN0YWNrLiAgKi8KLQotc3RydWN0IGllZWVfYmxvY2sKLXsKLSAgLyogVGhlIGtpbmQgb2YgYmxvY2suICAqLwotICBpbnQga2luZDsKLSAgLyogVGhlIHNvdXJjZSBmaWxlIG5hbWUsIGZvciBhIEJCNSBibG9jay4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBUaGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIHR5cGUsIGZvciBhIEJCNCBvciBCQjYgYmxvY2suICAqLwotICB1bnNpZ25lZCBpbnQgZm5pbmR4OwotICAvKiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgc2tpcHBlZC4gICovCi0gIGJvb2xlYW4gc2tpcDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBibG9jayBzdGFjay4gICovCi0KLSNkZWZpbmUgQkxPQ0tTVEFDS19TSVpFICgxNikKLQotc3RydWN0IGllZWVfYmxvY2tzdGFjawotewotICAvKiBUaGUgc3RhY2sgcG9pbnRlci4gICovCi0gIHN0cnVjdCBpZWVlX2Jsb2NrICpic3A7Ci0gIC8qIFRoZSBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX2Jsb2NrIHN0YWNrW0JMT0NLU1RBQ0tfU0laRV07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBpZWVlX3ZhcgotewotICAvKiBTdGFydCBvZiBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTGVuZ3RoIG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogU2xvdCBpZiB3ZSBtYWtlIGFuIGluZGlyZWN0IHR5cGUuICAqLwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgLyogS2luZCBvZiB2YXJpYWJsZSBvciBmdW5jdGlvbi4gICovCi0gIGVudW0KLSAgICB7Ci0gICAgICBJRUVFX1VOS05PV04sCi0gICAgICBJRUVFX0VYVEVSTkFMLAotICAgICAgSUVFRV9HTE9CQUwsCi0gICAgICBJRUVFX1NUQVRJQywKLSAgICAgIElFRUVfTE9DQUwsCi0gICAgICBJRUVFX0ZVTkNUSU9OCi0gICAgfSBraW5kOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSB2YXJpYWJsZXMuICAqLwotCi1zdHJ1Y3QgaWVlZV92YXJzCi17Ci0gIC8qIE51bWJlciBvZiBzbG90cyBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gIC8qIFZhcmlhYmxlcy4gICovCi0gIHN0cnVjdCBpZWVlX3ZhciAqdmFyczsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHR5cGUuICBXZSBuZWVkIHRoaXMgYmVjYXVzZQotICAgd2UgZG9uJ3Qgd2FudCB0byByZXByZXNlbnQgYml0ZmllbGRzIGFzIHJlYWwgdHlwZXMuICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlCi17Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFNsb3QgaWYgdGhpcyBpcyB0eXBlIGlzIHJlZmVyZW5jZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuICAqLwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgLyogU2xvdHMgZm9yIGFyZ3VtZW50cyBpZiB3ZSBtYWtlIGluZGlyZWN0IHR5cGVzIGZvciB0aGVtLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3Nsb3RzOwotICAvKiBJZiB0aGlzIGlzIGEgYml0ZmllbGQsIHRoaXMgaXMgdGhlIHNpemUgaW4gYml0cy4gIElmIHRoaXMgaXMgbm90Ci0gICAgIGEgYml0ZmllbGQsIHRoaXMgaXMgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgYml0c2l6ZTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCB0aGUgdHlwZSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBpZWVlX3R5cGVzCi17Ci0gIC8qIE51bWJlciBvZiBzbG90cyBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gIC8qIFR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZSAqdHlwZXM7Ci0gIC8qIEJ1aWx0aW4gdHlwZXMuICAqLwotI2RlZmluZSBCVUlMVElOX1RZUEVfQ09VTlQgKDYwKQotICBkZWJ1Z190eXBlIGJ1aWx0aW5zW0JVSUxUSU5fVFlQRV9DT1VOVF07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhIGxpbmtlZCBsYXN0IG9mIHN0cnVjdHMgd2l0aCB0aGVpciB0YWcgbmFtZXMsCi0gICBzbyB0aGF0IHdlIGNhbiBjb252ZXJ0IHRoZW0gdG8gQysrIGNsYXNzZXMgaWYgbmVjZXNzYXJ5LiAgKi8KLQotc3RydWN0IGllZWVfdGFnCi17Ci0gIC8qIE5leHQgdGFnLiAgKi8KLSAgc3RydWN0IGllZWVfdGFnICpuZXh0OwotICAvKiBUaGlzIHRhZyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVGhlIHR5cGUgb2YgdGhlIHRhZy4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogVGhlIHRhZ2dlZCB0eXBlIGlzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgYXQgdGhpcyBzbG90LiAgKi8KLSAgZGVidWdfdHlwZSBzbG90OwotICAvKiBUaGlzIGlzIGFuIGFycmF5IG9mIHNsb3RzIHVzZWQgd2hlbiBhIGZpZWxkIHR5cGUgaXMgY29udmVydGVkCi0gICAgIGludG8gYSBpbmRpcmVjdCB0eXBlLCBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIGxhdGVyIGNvbnZlcnRlZCBpbnRvCi0gICAgIGEgcmVmZXJlbmNlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlICpmc2xvdHM7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gd2UgcGFzcyBhcm91bmQgdG8gdGhlIHBhcnNpbmcKLSAgIGZ1bmN0aW9ucy4gICovCi0KLXN0cnVjdCBpZWVlX2luZm8KLXsKLSAgLyogVGhlIGRlYnVnZ2luZyBoYW5kbGUuICAqLwotICBQVFIgZGhhbmRsZTsKLSAgLyogVGhlIEJGRC4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogVGhlIHN0YXJ0IG9mIHRoZSBieXRlcyB0byBiZSBwYXJzZWQuICAqLwotICBjb25zdCBiZmRfYnl0ZSAqYnl0ZXM7Ci0gIC8qIFRoZSBlbmQgb2YgdGhlIGJ5dGVzIHRvIGJlIHBhcnNlZC4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpwZW5kOwotICAvKiBUaGUgYmxvY2sgc3RhY2suICAqLwotICBzdHJ1Y3QgaWVlZV9ibG9ja3N0YWNrIGJsb2Nrc3RhY2s7Ci0gIC8qIFdoZXRoZXIgd2UgaGF2ZSBzZWVuIGEgQkIxIG9yIEJCMi4gICovCi0gIGJvb2xlYW4gc2F3X2ZpbGVuYW1lOwotICAvKiBUaGUgdmFyaWFibGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdmFycyB2YXJzOwotICAvKiBUaGUgZ2xvYmFsIHZhcmlhYmxlcywgYWZ0ZXIgYSBnbG9iYWwgdHlwZWRlZiBibG9jay4gICovCi0gIHN0cnVjdCBpZWVlX3ZhcnMgKmdsb2JhbF92YXJzOwotICAvKiBUaGUgdHlwZXMuICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlcyB0eXBlczsKLSAgLyogVGhlIGdsb2JhbCB0eXBlcywgYWZ0ZXIgYSBnbG9iYWwgdHlwZWRlZiBibG9jay4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVzICpnbG9iYWxfdHlwZXM7Ci0gIC8qIFRoZSBsaXN0IG9mIHRhZ2dlZCBzdHJ1Y3RzLiAgKi8KLSAgc3RydWN0IGllZWVfdGFnICp0YWdzOwotfTsKLQotLyogQmFzaWMgYnVpbHRpbiB0eXBlcywgbm90IGluY2x1ZGluZyB0aGUgcG9pbnRlcnMuICAqLwotCi1lbnVtIGJ1aWx0aW5fdHlwZXMKLXsKLSAgYnVpbHRpbl91bmtub3duID0gMCwKLSAgYnVpbHRpbl92b2lkID0gMSwKLSAgYnVpbHRpbl9zaWduZWRfY2hhciA9IDIsCi0gIGJ1aWx0aW5fdW5zaWduZWRfY2hhciA9IDMsCi0gIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludCA9IDQsCi0gIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50ID0gNSwKLSAgYnVpbHRpbl9zaWduZWRfbG9uZyA9IDYsCi0gIGJ1aWx0aW5fdW5zaWduZWRfbG9uZyA9IDcsCi0gIGJ1aWx0aW5fc2lnbmVkX2xvbmdfbG9uZyA9IDgsCi0gIGJ1aWx0aW5fdW5zaWduZWRfbG9uZ19sb25nID0gOSwKLSAgYnVpbHRpbl9mbG9hdCA9IDEwLAotICBidWlsdGluX2RvdWJsZSA9IDExLAotICBidWlsdGluX2xvbmdfZG91YmxlID0gMTIsCi0gIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZSA9IDEzLAotICBidWlsdGluX3F1b3RlZF9zdHJpbmcgPSAxNCwKLSAgYnVpbHRpbl9pbnN0cnVjdGlvbl9hZGRyZXNzID0gMTUsCi0gIGJ1aWx0aW5faW50ID0gMTYsCi0gIGJ1aWx0aW5fdW5zaWduZWQgPSAxNywKLSAgYnVpbHRpbl91bnNpZ25lZF9pbnQgPSAxOCwKLSAgYnVpbHRpbl9jaGFyID0gMTksCi0gIGJ1aWx0aW5fbG9uZyA9IDIwLAotICBidWlsdGluX3Nob3J0ID0gMjEsCi0gIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQgPSAyMiwKLSAgYnVpbHRpbl9zaG9ydF9pbnQgPSAyMywKLSAgYnVpbHRpbl9zaWduZWRfc2hvcnQgPSAyNCwKLSAgYnVpbHRpbl9iY2RfZmxvYXQgPSAyNQotfTsKLQotLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm91bmQgaW4gdGhlIGRlcml2YXRpb24gZmxhZ3Mgb2YgYSAnYicKLSAgIGNvbXBvbmVudCByZWNvcmQgb2YgYSAnVCcgdHlwZSBleHRlbnNpb24gcmVjb3JkIGluIGEgQysrIHBtaXNjCi0gICByZWNvcmQuICBUaGVzZSBhcmUgYml0bWFza3MuICAqLwotCi0vKiBTZXQgZm9yIGEgcHJpdmF0ZSBiYXNlIGNsYXNzLCBjbGVhciBmb3IgYSBwdWJsaWMgYmFzZSBjbGFzcy4KLSAgIFByb3RlY3RlZCBiYXNlIGNsYXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuICAqLwotI2RlZmluZSBCQVNFRkxBR1NfUFJJVkFURSAoMHgxKQotLyogU2V0IGZvciBhIHZpcnR1YWwgYmFzZSBjbGFzcy4gICovCi0jZGVmaW5lIEJBU0VGTEFHU19WSVJUVUFMICgweDIpCi0vKiBTZXQgZm9yIGEgZnJpZW5kIGNsYXNzLCBjbGVhciBmb3IgYSBiYXNlIGNsYXNzLiAgKi8KLSNkZWZpbmUgQkFTRUZMQUdTX0ZSSUVORCAoMHgxMCkKLQotLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm91bmQgaW4gdGhlIHNwZWNzIGZsYWdzIG9mIGEgJ2QnLCAnbScsIG9yICd2JwotICAgY29tcG9uZW50IHJlY29yZCBvZiBhICdUJyB0eXBlIGV4dGVuc2lvbiByZWNvcmQgaW4gYSBDKysgcG1pc2MKLSAgIHJlY29yZC4gIFRoZSBzYW1lIGZsYWdzIGFyZSB1c2VkIGZvciBhICdNJyByZWNvcmQgaW4gYSBDKysgcG1pc2MKLSAgIHJlY29yZC4gICovCi0KLS8qIFRoZSBsb3dlciB0d28gYml0cyBob2xkIHZpc2liaWxpdHkgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZICgweDMpCi0vKiBUaGlzIHZhbHVlIGluIHRoZSBsb3dlciB0d28gYml0cyBpbmRpY2F0ZXMgYSBwdWJsaWMgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QVUJMSUMgKDB4MCkKLS8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHByaXZhdGUgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFICgweDEpCi0vKiBUaGlzIHZhbHVlIGluIHRoZSBsb3dlciB0d28gYml0cyBpbmRpY2F0ZXMgYSBwcm90ZWN0ZWQgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQgKDB4MikKLS8qIFNldCBmb3IgYSBzdGF0aWMgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfU1RBVElDICgweDQpCi0vKiBTZXQgZm9yIGEgdmlydHVhbCBvdmVycmlkZS4gICovCi0jZGVmaW5lIENYWEZMQUdTX09WRVJSSURFICgweDgpCi0vKiBTZXQgZm9yIGEgZnJpZW5kIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfRlJJRU5EICgweDEwKQotLyogU2V0IGZvciBhIGNvbnN0IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfQ09OU1QgKDB4MjApCi0vKiBTZXQgZm9yIGEgdm9sYXRpbGUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19WT0xBVElMRSAoMHg0MCkKLS8qIFNldCBmb3IgYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX09WRVJMT0FERUQgKDB4ODApCi0vKiBTZXQgZm9yIGFuIG9wZXJhdG9yIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfT1BFUkFUT1IgKDB4MTAwKQotLyogU2V0IGZvciBhIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICAqLwotI2RlZmluZSBDWFhGTEFHU19DVE9SRFRPUiAoMHg0MDApCi0vKiBTZXQgZm9yIGEgY29uc3RydWN0b3IuICAqLwotI2RlZmluZSBDWFhGTEFHU19DVE9SICgweDIwMCkKLS8qIFNldCBmb3IgYW4gaW5saW5lIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfSU5MSU5FICgweDgwMCkKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgaWVlZV9lcnJvcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgaWVlZV9lb2YgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqKSk7Ci1zdGF0aWMgY2hhciAqc2F2ZXN0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9udW1iZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGJmZF92bWEgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfaWQKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgY29uc3QgY2hhciAqKiwKLQkgICB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9vcHRpb25hbF9pZAotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAotCSAgIHVuc2lnbmVkIGxvbmcgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfZXhwcmVzc2lvbgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIGllZWVfYnVpbHRpbl90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FsbG9jX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF90eXBlX2luZGV4Ci0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGludCBpZWVlX3JlZ25vX3RvX2dlbnJlZyBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGllZWVfZ2VucmVnX3RvX3JlZ25vIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfYmIgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9iZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX25uIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfdHkgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9hdG4gUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9taXNjCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9jeHhfY2xhc3MKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9kZWZhdWx0cwotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfcmVmZXJlbmNlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVxdWlyZV9hc24KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlcXVpcmVfYXRuNjUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgY29uc3QgY2hhciAqKiwKLQkgICB1bnNpZ25lZCBsb25nICopKTsKLQotLyogUmVwb3J0IGFuIGVycm9yIGluIHRoZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1pZWVlX2Vycm9yIChpbmZvLCBwLCBzKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogMHglbHg6ICVzICgweCV4KVxuIiwgYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgKHAgLSBpbmZvLT5ieXRlcyksIHMsICpwKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIHMpOwotfQotCi0vKiBSZXBvcnQgYW4gdW5leHBlY3RlZCBFT0YgaW4gdGhlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfZW9mIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotewotICBpZWVlX2Vycm9yIChpbmZvLCAoY29uc3QgYmZkX2J5dGUgKikgTlVMTCwKLQkgICAgICBfKCJ1bmV4cGVjdGVkIGVuZCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSk7Ci19Ci0KLS8qIFNhdmUgYSBzdHJpbmcgaW4gbWVtb3J5LiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2F2ZXN0cmluZyAoc3RhcnQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuOwotewotICBjaGFyICpyZXQ7Ci0KLSAgcmV0ID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAocmV0LCBzdGFydCwgbGVuKTsKLSAgcmV0W2xlbl0gPSAnXDAnOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBSZWFkIGEgbnVtYmVyIHdoaWNoIG11c3QgYmUgcHJlc2VudCBpbiBhbiBJRUVFIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsIHB2KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBiZmRfdm1hICpwdjsKLXsKLSAgcmV0dXJuIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCBwdiwgKGJvb2xlYW4gKikgTlVMTCk7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgaW4gYW4gSUVFRSBmaWxlLiAgSWYgcHByZXNlbnQgaXMgbm90IE5VTEwsIHRoZSBudW1iZXIKLSAgIG5lZWQgbm90IGJlIHRoZXJlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsIHB2LCBwcHJlc2VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci0gICAgIGJvb2xlYW4gKnBwcmVzZW50OwotewotICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYjsKLQotICBpZiAoKnBwID49IGluZm8tPnBlbmQpCi0gICAgewotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JewotCSAgKnBwcmVzZW50ID0gZmFsc2U7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBpZWVlX2VvZiAoaW5mbyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGIgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotICArKypwcDsKLQotICBpZiAoYiA8PSBpZWVlX251bWJlcl9lbmRfZW51bSkKLSAgICB7Ci0gICAgICAqcHYgPSAoYmZkX3ZtYSkgYjsKLSAgICAgIGlmIChwcHJlc2VudCAhPSBOVUxMKQotCSpwcHJlc2VudCA9IHRydWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGIgPj0gaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gJiYgYiA8PSBpZWVlX251bWJlcl9yZXBlYXRfZW5kX2VudW0pCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGkgPSAoaW50KSBiIC0gKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW07Ci0gICAgICBpZiAoKnBwICsgaSAtIDEgPj0gaW5mby0+cGVuZCkKLQl7Ci0JICBpZWVlX2VvZiAoaW5mbyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAqcHYgPSAwOwotICAgICAgZm9yICg7IGkgPiAwOyBpLS0pCi0JewotCSAgKnB2IDw8PSA4OwotCSAgKnB2ICs9ICoqcHA7Ci0JICArKypwcDsKLQl9Ci0KLSAgICAgIGlmIChwcHJlc2VudCAhPSBOVUxMKQotCSpwcHJlc2VudCA9IHRydWU7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAtLSpwcDsKLSAgICAgICpwcHJlc2VudCA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGllZWVfZXJyb3IgKGluZm8sICpwcCAtIDEsIF8oImludmFsaWQgbnVtYmVyIikpOwotICByZXR1cm4gZmFsc2U7ICAKLX0KLQotLyogUmVhZCBhIHJlcXVpcmVkIHN0cmluZyBmcm9tIGFuIElFRUUgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBuYW1lOwotICAgICB1bnNpZ25lZCBsb25nICpwbmFtbGVuOwotewotICByZXR1cm4gaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4sIChib29sZWFuICopIE5VTEwpOwotfQotCi0vKiBSZWFkIGEgc3RyaW5nIGZyb20gYW4gSUVFRSBmaWxlLiAgSWYgcHByZXNlbnQgaXMgbm90IE5VTEwsIHRoZQotICAgc3RyaW5nIGlzIG9wdGlvbmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuLCBwcHJlc2VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBuYW1lOwotICAgICB1bnNpZ25lZCBsb25nICpwbmFtbGVuOwotICAgICBib29sZWFuICpwcHJlc2VudDsKLXsKLSAgYmZkX2J5dGUgYjsKLSAgdW5zaWduZWQgbG9uZyBsZW47Ci0KLSAgaWYgKCpwcCA+PSBpbmZvLT5wZW5kKQotICAgIHsKLSAgICAgIGllZWVfZW9mIChpbmZvKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYiA9ICoqcHA7Ci0gICsrKnBwOwotCi0gIGlmIChiIDw9IDB4N2YpCi0gICAgbGVuID0gYjsKLSAgZWxzZSBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgYiA9PSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtKQotICAgIHsKLSAgICAgIGxlbiA9ICoqcHA7Ci0gICAgICArKypwcDsKLSAgICB9Ci0gIGVsc2UgaWYgKChpZWVlX3JlY29yZF9lbnVtX3R5cGUpIGIgPT0gaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLSAgICB7Ci0gICAgICBsZW4gPSAoKipwcCA8PCA4KSArICgqcHApWzFdOwotICAgICAgKnBwICs9IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JewotCSAgLS0qcHA7Ci0JICAqcHByZXNlbnQgPSBmYWxzZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCAtIDEsIF8oImludmFsaWQgc3RyaW5nIGxlbmd0aCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCh1bnNpZ25lZCBsb25nKSAoaW5mby0+cGVuZCAtICpwcCkgPCBsZW4pCi0gICAgewotICAgICAgaWVlZV9lb2YgKGluZm8pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqcG5hbWUgPSAoY29uc3QgY2hhciAqKSAqcHA7Ci0gICpwbmFtbGVuID0gbGVuOwotICAqcHAgKz0gbGVuOwotCi0gIGlmIChwcHJlc2VudCAhPSBOVUxMKQotICAgICpwcHJlc2VudCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYW4gZXhwcmVzc2lvbiBmcm9tIGFuIElFRUUgZmlsZS4gIFNpbmNlIHRoaXMgY29kZSBpcyBvbmx5IHVzZWQKLSAgIHRvIHBhcnNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgSSBoYXZlbid0IGJvdGhlcmVkIHRvIHdyaXRlIGEgZnVsbAotICAgYmxvd24gSUVFRSBleHByZXNzaW9uIHBhcnNlci4gIEkndmUgb25seSB0aHJvd24gaW4gdGhlIHRoaW5ncyBJJ3ZlCi0gICBzZWVuIGluIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgY2FuIGJlIGVhc2lseSBleHRlbmRlZCBpZgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgcHYpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGJmZF92bWEgKnB2OwotewotICBjb25zdCBiZmRfYnl0ZSAqZXhwcl9zdGFydDsKLSNkZWZpbmUgRVhQUl9TVEFDS19TSVpFICgxMCkKLSAgYmZkX3ZtYSBleHByX3N0YWNrW0VYUFJfU1RBQ0tfU0laRV07Ci0gIGJmZF92bWEgKmVzcDsKLQotICBleHByX3N0YXJ0ID0gKnBwOwotCi0gIGVzcCA9IGV4cHJfc3RhY2s7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBib29sZWFuIHByZXNlbnQ7Ci0gICAgICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYzsKLQotICAgICAgc3RhcnQgPSAqcHA7Ci0KLSAgICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdmFsLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocHJlc2VudCkKLQl7Ci0JICBpZiAoZXNwIC0gZXhwcl9zdGFjayA+PSBFWFBSX1NUQUNLX1NJWkUpCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBvdmVyZmxvdyIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgICplc3ArKyA9IHZhbDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7Ci0KLSAgICAgIGlmIChjID49IGllZWVfbW9kdWxlX2JlZ2lubmluZ19lbnVtKQotCWJyZWFrOwotCi0gICAgICArKypwcDsKLQotICAgICAgaWYgKGMgPT0gaWVlZV9jb21tYSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQlkZWZhdWx0OgotCSAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuc3VwcG9ydGVkIElFRUUgZXhwcmVzc2lvbiBvcGVyYXRvciIpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSBpbmR4OwotCSAgICBhc2VjdGlvbiAqczsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmluZHgpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgZm9yIChzID0gaW5mby0+YWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICAgICAgaWYgKChiZmRfdm1hKSBzLT50YXJnZXRfaW5kZXggPT0gaW5keCkKLQkJYnJlYWs7Ci0JICAgIGlmIChzID09IE5VTEwpCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5rbm93biBzZWN0aW9uIikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAKLQkgICAgaWYgKGVzcCAtIGV4cHJfc3RhY2sgPj0gRVhQUl9TVEFDS19TSVpFKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImV4cHJlc3Npb24gc3RhY2sgb3ZlcmZsb3ciKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgKmVzcCsrID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9mdW5jdGlvbl9wbHVzX2VudW06Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgdjEsIHYyOwotCi0JICAgIGlmIChlc3AgLSBleHByX3N0YWNrIDwgMikKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIHVuZGVyZmxvdyIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICB2MSA9ICotLWVzcDsKLQkgICAgdjIgPSAqLS1lc3A7Ci0JICAgICplc3ArKyA9IHYxICsgdjI7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlc3AgLSAxICE9IGV4cHJfc3RhY2spCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgZXhwcl9zdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBtaXNtYXRjaCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKnB2ID0gKi0tZXNwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gYW4gSUVFRSBidWlsdGluIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsIGluZHgpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpwOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLXsKLSAgUFRSIGRoYW5kbGU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoaW5keCA8IEJVSUxUSU5fVFlQRV9DT1VOVAotICAgICAgJiYgaW5mby0+dHlwZXMuYnVpbHRpbnNbaW5keF0gIT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XTsKLQotICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLQotICBpZiAoaW5keCA+PSAzMiAmJiBpbmR4IDwgNjQpCi0gICAgewotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBwLCBpbmR4IC0gMzIpKTsKLSAgICAgIGFzc2VydCAoaW5keCA8IEJVSUxUSU5fVFlQRV9DT1VOVCk7Ci0gICAgICBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XSA9IHR5cGU7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgc3dpdGNoICgoZW51bSBidWlsdGluX3R5cGVzKSBpbmR4KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgcCwgXygidW5rbm93biBidWlsdGluIHR5cGUiKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgYnVpbHRpbl91bmtub3duOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdm9pZDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBuYW1lID0gInZvaWQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX2NoYXI6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgY2hhciI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9jaGFyOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9zaG9ydF9pbnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgc2hvcnQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0X2ludDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIGxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIGxvbmcgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmcgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9mbG9hdDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgbmFtZSA9ICJmbG9hdCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9kb3VibGU6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2xvbmdfZG91YmxlOgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDEyKTsKLSAgICAgIG5hbWUgPSAibG9uZyBkb3VibGUiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZToKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDE2KTsKLSAgICAgIG5hbWUgPSAibG9uZyBsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9xdW90ZWRfc3RyaW5nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsCi0JCQkJCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJYnVpbHRpbl9jaGFyKSksCi0JCQkJICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBwLAotCQkJCQkJICAgICAgICgodW5zaWduZWQgaW50KQotCQkJCQkJCWJ1aWx0aW5faW50KSksCi0JCQkJICAgIDAsIC0xLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAiUVVPVEVEIFNUUklORyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9pbnN0cnVjdGlvbl9hZGRyZXNzOgotICAgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgY29kZSBhZGRyZXNzLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAiaW5zdHJ1Y3Rpb24gYWRkcmVzcyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9pbnQ6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAiaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkOgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfaW50OgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2NoYXI6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Nob3J0OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2hvcnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIHNob3J0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Nob3J0X2ludDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNob3J0IGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfc2hvcnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgc2hvcnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fYmNkX2Zsb2F0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgcCwgXygiQkNEIGZsb2F0IHR5cGUgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKLQotICBhc3NlcnQgKGluZHggPCBCVUlMVElOX1RZUEVfQ09VTlQpOwotCi0gIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdID0gdHlwZTsKLQotICByZXR1cm4gdHlwZTsKLX0KLQotLyogQWxsb2NhdGUgbW9yZSBzcGFjZSBpbiB0aGUgdHlwZSB0YWJsZS4gIElmIHJlZiBpcyB0cnVlLCB0aGlzIGlzIGEKLSAgIHJlZmVyZW5jZSB0byB0aGUgdHlwZTsgaWYgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgd2Ugc2hvdWxkIHNldAotICAgdXAgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2FsbG9jX3R5cGUgKGluZm8sIGluZHgsIHJlZikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci0gICAgIGJvb2xlYW4gcmVmOwotewotICB1bnNpZ25lZCBpbnQgbmFsbG9jOwotICByZWdpc3RlciBzdHJ1Y3QgaWVlZV90eXBlICp0OwotICBzdHJ1Y3QgaWVlZV90eXBlICp0ZW5kOwotCi0gIGlmIChpbmR4ID49IGluZm8tPnR5cGVzLmFsbG9jKQotICAgIHsKLSAgICAgIG5hbGxvYyA9IGluZm8tPnR5cGVzLmFsbG9jOwotICAgICAgaWYgKG5hbGxvYyA9PSAwKQotCW5hbGxvYyA9IDQ7Ci0gICAgICB3aGlsZSAoaW5keCA+PSBuYWxsb2MpCi0JbmFsbG9jICo9IDI7Ci0KLSAgICAgIGluZm8tPnR5cGVzLnR5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlICopCi0JCQkgICB4cmVhbGxvYyAoaW5mby0+dHlwZXMudHlwZXMsCi0JCQkJICAgICBuYWxsb2MgKiBzaXplb2YgKmluZm8tPnR5cGVzLnR5cGVzKSk7Ci0KLSAgICAgIG1lbXNldCAoaW5mby0+dHlwZXMudHlwZXMgKyBpbmZvLT50eXBlcy5hbGxvYywgMCwKLQkgICAgICAobmFsbG9jIC0gaW5mby0+dHlwZXMuYWxsb2MpICogc2l6ZW9mICppbmZvLT50eXBlcy50eXBlcyk7Ci0KLSAgICAgIHRlbmQgPSBpbmZvLT50eXBlcy50eXBlcyArIG5hbGxvYzsKLSAgICAgIGZvciAodCA9IGluZm8tPnR5cGVzLnR5cGVzICsgaW5mby0+dHlwZXMuYWxsb2M7IHQgPCB0ZW5kOyB0KyspCi0JdC0+dHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgaW5mby0+dHlwZXMuYWxsb2MgPSBuYWxsb2M7Ci0gICAgfQotCi0gIGlmIChyZWYpCi0gICAgewotICAgICAgdCA9IGluZm8tPnR5cGVzLnR5cGVzICsgaW5keDsKLSAgICAgIGlmICh0LT50eXBlID09IE5VTEwpCi0JewotCSAgdC0+cHNsb3QgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnQtPnBzbG90KTsKLQkgICp0LT5wc2xvdCA9IERFQlVHX1RZUEVfTlVMTDsKLQkgIHQtPnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGluZm8tPmRoYW5kbGUsIHQtPnBzbG90LAotCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIGlmICh0LT50eXBlID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgdHlwZSBpbmRleCBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgYmZkX3ZtYSBpbmR4OwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmR4IDwgMjU2KQotICAgIHsKLSAgICAgICpwdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBzdGFydCwgaW5keCk7Ci0gICAgICBpZiAoKnB0eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZHggLT0gMjU2OwotICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIGluZHgsIHRydWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqcHR5cGUgPSBpbmZvLT50eXBlcy50eXBlc1tpbmR4XS50eXBlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBmaWxlLiAgVGhpcyBpcyBwYXNzZWQgdGhlCi0gICBieXRlcyB3aGljaCBjb21wb3NlIHRoZSBEZWJ1ZyBJbmZvcm1hdGlvbiBQYXJ0IG9mIGFuIElFRUUgZmlsZS4gICovCi0KLWJvb2xlYW4KLXBhcnNlX2llZWUgKGRoYW5kbGUsIGFiZmQsIGJ5dGVzLCBsZW4pCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpieXRlczsKLSAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci17Ci0gIHN0cnVjdCBpZWVlX2luZm8gaW5mbzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGJmZF9ieXRlICpwLCAqcGVuZDsKLQotICBpbmZvLmRoYW5kbGUgPSBkaGFuZGxlOwotICBpbmZvLmFiZmQgPSBhYmZkOwotICBpbmZvLmJ5dGVzID0gYnl0ZXM7Ci0gIGluZm8ucGVuZCA9IGJ5dGVzICsgbGVuOwotICBpbmZvLmJsb2Nrc3RhY2suYnNwID0gaW5mby5ibG9ja3N0YWNrLnN0YWNrOwotICBpbmZvLnNhd19maWxlbmFtZSA9IGZhbHNlOwotICBpbmZvLnZhcnMuYWxsb2MgPSAwOwotICBpbmZvLnZhcnMudmFycyA9IE5VTEw7Ci0gIGluZm8uZ2xvYmFsX3ZhcnMgPSBOVUxMOwotICBpbmZvLnR5cGVzLmFsbG9jID0gMDsKLSAgaW5mby50eXBlcy50eXBlcyA9IE5VTEw7Ci0gIGluZm8uZ2xvYmFsX3R5cGVzID0gTlVMTDsKLSAgaW5mby50YWdzID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IEJVSUxUSU5fVFlQRV9DT1VOVDsgaSsrKQotICAgIGluZm8udHlwZXMuYnVpbHRpbnNbaV0gPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgcCA9IGJ5dGVzOwotICBwZW5kID0gaW5mby5wZW5kOwotICB3aGlsZSAocCA8IHBlbmQpCi0gICAgewotICAgICAgY29uc3QgYmZkX2J5dGUgKnJlY29yZF9zdGFydDsKLSAgICAgIGllZWVfcmVjb3JkX2VudW1fdHlwZSBjOwotCi0gICAgICByZWNvcmRfc3RhcnQgPSBwOwotCi0gICAgICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKnArKzsKLQotICAgICAgaWYgKGMgPT0gaWVlZV9hdF9yZWNvcmRfZW51bSkKLQljID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKCgodW5zaWduZWQgaW50KSBjIDw8IDgpIHwgKnArKyk7Ci0KLSAgICAgIGlmIChjIDw9IGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSkKLQl7Ci0JICBpZWVlX2Vycm9yICgmaW5mbywgcmVjb3JkX3N0YXJ0LCBfKCJ1bmV4cGVjdGVkIG51bWJlciIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JZGVmYXVsdDoKLQkgIGllZWVfZXJyb3IgKCZpbmZvLCByZWNvcmRfc3RhcnQsIF8oInVuZXhwZWN0ZWQgcmVjb3JkIHR5cGUiKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQljYXNlIGllZWVfYmJfcmVjb3JkX2VudW06Ci0JICBpZiAoISBwYXJzZV9pZWVlX2JiICgmaW5mbywgJnApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9iZV9yZWNvcmRfZW51bToKLQkgIGlmICghIHBhcnNlX2llZWVfYmUgKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX25uX3JlY29yZDoKLQkgIGlmICghIHBhcnNlX2llZWVfbm4gKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX3R5X3JlY29yZF9lbnVtOgotCSAgaWYgKCEgcGFyc2VfaWVlZV90eSAoJmluZm8sICZwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfYXRuX3JlY29yZF9lbnVtOgotCSAgaWYgKCEgcGFyc2VfaWVlZV9hdG4gKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8uYmxvY2tzdGFjay5ic3AgIT0gaW5mby5ibG9ja3N0YWNrLnN0YWNrKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKCZpbmZvLCAoY29uc3QgYmZkX2J5dGUgKikgTlVMTCwKLQkJICBfKCJibG9ja3MgbGVmdCBvbiBzdGFjayBhdCBlbmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYW4gSUVFRSBCQiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9iYiAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpibG9ja19zdGFydDsKLSAgYmZkX2J5dGUgYjsKLSAgYmZkX3ZtYSBzaXplOwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLSAgY2hhciAqbmFtY29weSA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBmbmluZHg7Ci0gIGJvb2xlYW4gc2tpcDsKLQotICBibG9ja19zdGFydCA9ICpwcDsKLQotICBiID0gKipwcDsKLSAgKysqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKQotICAgICAgfHwgISBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZuaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOwotICBza2lwID0gZmFsc2U7Ci0KLSAgc3dpdGNoIChiKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBCQjE6IFR5cGUgZGVmaW5pdGlvbnMgbG9jYWwgdG8gYSBtb2R1bGUuICAqLwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAobmFtY29weSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+c2F3X2ZpbGVuYW1lID0gdHJ1ZTsKLQotICAgICAgLyogRGlzY2FyZCBhbnkgdmFyaWFibGVzIG9yIHR5cGVzIHdlIG1heSBoYXZlIHNlZW4gYmVmb3JlLiAgKi8KLSAgICAgIGlmIChpbmZvLT52YXJzLnZhcnMgIT0gTlVMTCkKLQlmcmVlIChpbmZvLT52YXJzLnZhcnMpOwotICAgICAgaW5mby0+dmFycy52YXJzID0gTlVMTDsKLSAgICAgIGluZm8tPnZhcnMuYWxsb2MgPSAwOwotICAgICAgaWYgKGluZm8tPnR5cGVzLnR5cGVzICE9IE5VTEwpCi0JZnJlZSAoaW5mby0+dHlwZXMudHlwZXMpOwotICAgICAgaW5mby0+dHlwZXMudHlwZXMgPSBOVUxMOwotICAgICAgaW5mby0+dHlwZXMuYWxsb2MgPSAwOwotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSB0eXBlcyB0byB0aGUgZ2xvYmFsIHR5cGVzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5nbG9iYWxfdHlwZXMgIT0gTlVMTCkKLQl7Ci0JICBpbmZvLT50eXBlcy5hbGxvYyA9IGluZm8tPmdsb2JhbF90eXBlcy0+YWxsb2M7Ci0JICBpbmZvLT50eXBlcy50eXBlcyA9ICgoc3RydWN0IGllZWVfdHlwZSAqKQotCQkJICAgICAgIHhtYWxsb2MgKGluZm8tPnR5cGVzLmFsbG9jCi0JCQkJCSogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKSk7Ci0JICBtZW1jcHkgKGluZm8tPnR5cGVzLnR5cGVzLCBpbmZvLT5nbG9iYWxfdHlwZXMtPnR5cGVzLAotCQkgIGluZm8tPnR5cGVzLmFsbG9jICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgLyogQkIyOiBHbG9iYWwgdHlwZSBkZWZpbml0aW9ucy4gIFRoZSBuYW1lIGlzIHN1cHBvc2VkIHRvIGJlCi0JIGVtcHR5LCBidXQgd2UgZG9uJ3QgY2hlY2suICovCi0gICAgICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGluZm8tPmRoYW5kbGUsICIqZ2xvYmFsKiIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnNhd19maWxlbmFtZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIEJCMzogSGlnaCBsZXZlbCBtb2R1bGUgYmxvY2sgYmVnaW4uICBXZSBkb24ndCBoYXZlIHRvIGRvCi0JIGFueXRoaW5nIGhlcmUuICBUaGUgbmFtZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBhcyBmb3IKLQkgdGhlIEJCMSwgYnV0IHdlIGRvbid0IGNoZWNrLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgLyogQkI0OiBHbG9iYWwgZnVuY3Rpb24uICAqLwotICAgICAgewotCWJmZF92bWEgc3RhY2tzcGFjZSwgdHlwaW5keCwgb2Zmc2V0OwotCWRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnN0YWNrc3BhY2UpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0eXBpbmR4KQotCSAgICB8fCAhIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIHN0YWNrIHNwYWNlLiAgRklYTUUuICAqLwotCi0JaWYgKHR5cGluZHggPCAyNTYpCi0JICB7Ci0JICAgIHJldHVybl90eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIGJsb2NrX3N0YXJ0LCB0eXBpbmR4KTsKLQkgICAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICB0eXBpbmR4IC09IDI1NjsKLQkgICAgaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCB0eXBpbmR4LCB0cnVlKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGZuaW5keCA9IHR5cGluZHg7Ci0JICAgIHJldHVybl90eXBlID0gaW5mby0+dHlwZXMudHlwZXNbdHlwaW5keF0udHlwZTsKLQkgICAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsIHJldHVybl90eXBlKQotCQk9PSBERUJVR19LSU5EX0ZVTkNUSU9OKQotCSAgICAgIHJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChpbmZvLT5kaGFuZGxlLAotCQkJCQkJICAgcmV0dXJuX3R5cGUpOwotCSAgfQotCi0JbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoISBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGluZm8tPmRoYW5kbGUsIG5hbWNvcHksIHJldHVybl90eXBlLAotCQkJCSAgICAgdHJ1ZSwgb2Zmc2V0KSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA1OgotICAgICAgLyogQkI1OiBGaWxlIG5hbWUgZm9yIHNvdXJjZSBsaW5lIG51bWJlcnMuICAqLwotICAgICAgewotCXVuc2lnbmVkIGludCBpOwotCi0JLyogV2UgaWdub3JlIHRoZSBkYXRlIGFuZCB0aW1lLiAgRklYTUUuICAqLwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JICB7Ci0JICAgIGJmZF92bWEgaWdub3JlOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZpZ25vcmUsICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0KLQluYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQlpZiAobmFtY29weSA9PSBOVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNjoKLSAgICAgIC8qIEJCNjogTG9jYWwgZnVuY3Rpb24gb3IgYmxvY2suICAqLwotICAgICAgewotCWJmZF92bWEgc3RhY2tzcGFjZSwgdHlwaW5keCwgb2Zmc2V0OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzdGFja3NwYWNlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdHlwaW5keCkKLQkgICAgfHwgISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBzdGFjayBzcGFjZS4gIEZJWE1FLiAgKi8KLQotCWlmIChuYW1sZW4gPT0gMCkKLQkgIHsKLQkgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGluZm8tPmRoYW5kbGUsIG9mZnNldCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAvKiBDaGFuZ2UgYiB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBibG9jawotCSAgICAgICByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uLiAgKi8KLQkgICAgYiA9IDB4ODY7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBUaGUgTVJJIEMrKyBjb21waWxlciB3aWxsIG91dHB1dCBhIGZha2UgZnVuY3Rpb24gbmFtZWQKLQkgICAgICAgX19YUllDUFAgdG8gaG9sZCBDKysgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2Ugc2tpcAotCSAgICAgICB0aGF0IGZ1bmN0aW9uLiAgVGhpcyBpcyBub3QgY3J1Y2lhbCwgYnV0IGl0IG1ha2VzCi0JICAgICAgIGNvbnZlcnRpbmcgZnJvbSBJRUVFIHRvIG90aGVyIGRlYnVnIGZvcm1hdHMgd29yawotCSAgICAgICBiZXR0ZXIuICAqLwotCSAgICBpZiAoc3RybmNtcCAobmFtZSwgIl9fWFJZQ1BQIiwgbmFtbGVuKSA9PSAwKQotCSAgICAgIHNraXAgPSB0cnVlOwotCSAgICBlbHNlCi0JICAgICAgewotCQlkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCi0JCWlmICh0eXBpbmR4IDwgMjU2KQotCQkgIHsKLQkJICAgIHJldHVybl90eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIGJsb2NrX3N0YXJ0LAotCQkJCQkJICAgICB0eXBpbmR4KTsKLQkJICAgIGlmIChyZXR1cm5fdHlwZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgdHlwaW5keCAtPSAyNTY7Ci0JCSAgICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHR5cGluZHgsIHRydWUpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBmbmluZHggPSB0eXBpbmR4OwotCQkgICAgcmV0dXJuX3R5cGUgPSBpbmZvLT50eXBlcy50eXBlc1t0eXBpbmR4XS50eXBlOwotCQkgICAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsIHJldHVybl90eXBlKQotCQkJPT0gREVCVUdfS0lORF9GVU5DVElPTikKLQkJICAgICAgcmV0dXJuX3R5cGUgPSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGluZm8tPmRoYW5kbGUsCi0JCQkJCQkJICAgcmV0dXJuX3R5cGUpOwotCQkgIH0KLQotCQluYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQkJaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSwKLQkJCQkJICAgICByZXR1cm5fdHlwZSwgZmFsc2UsIG9mZnNldCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMDoKLSAgICAgIC8qIEJCMTA6IEFzc2VtYmxlciBtb2R1bGUgc2NvcGUuICBJbiB0aGUgbm9ybWFsIGNhc2UsIHdlCi0JIGNvbXBsZXRlbHkgaWdub3JlIGFsbCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgewotCWNvbnN0IGNoYXIgKmluYW0sICp2c3RyOwotCXVuc2lnbmVkIGxvbmcgaW5hbWxlbiwgdnN0cmxlbjsKLQliZmRfdm1hIHRvb2xfdHlwZTsKLQlib29sZWFuIHByZXNlbnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAoISBpbmZvLT5zYXdfZmlsZW5hbWUpCi0JICB7Ci0JICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCSAgICBpZiAobmFtY29weSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGluZm8tPnNhd19maWxlbmFtZSA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoISBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCAmaW5hbSwgJmluYW1sZW4pCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0b29sX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJnZzdHIsICZ2c3RybGVuLCAmcHJlc2VudCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkgIHsKLQkgICAgYmZkX3ZtYSBpZ25vcmU7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZpZ25vcmUsICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTE6Ci0gICAgICAvKiBCQjExOiBNb2R1bGUgc2VjdGlvbi4gIFdlIGNvbXBsZXRlbHkgaWdub3JlIGFsbCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgewotCWJmZF92bWEgc2VjdHlwZSwgc2VjaW5keCwgb2Zmc2V0LCBtYXA7Ci0JYm9vbGVhbiBwcmVzZW50OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzZWN0eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2VjaW5keCkKLQkgICAgfHwgISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZtYXAsICZwcmVzZW50KSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGJsb2NrX3N0YXJ0LCBfKCJ1bmtub3duIEJCIHR5cGUiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgLyogUHVzaCB0aGlzIGJsb2NrIG9uIHRoZSBibG9jayBzdGFjay4gICovCi0KLSAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwID49IGluZm8tPmJsb2Nrc3RhY2suc3RhY2sgKyBCTE9DS1NUQUNLX1NJWkUpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgKGNvbnN0IGJmZF9ieXRlICopIE5VTEwsIF8oInN0YWNrIG92ZXJmbG93IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+a2luZCA9IGI7Ci0gIGlmIChiID09IDUpCi0gICAgaW5mby0+YmxvY2tzdGFjay5ic3AtPmZpbGVuYW1lID0gbmFtY29weTsKLSAgaW5mby0+YmxvY2tzdGFjay5ic3AtPmZuaW5keCA9IGZuaW5keDsKLSAgaW5mby0+YmxvY2tzdGFjay5ic3AtPnNraXAgPSBza2lwOwotICArK2luZm8tPmJsb2Nrc3RhY2suYnNwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYW4gSUVFRSBCRSByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9iZSAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGJmZF92bWEgb2Zmc2V0OwotCi0gIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygic3RhY2sgdW5kZXJmbG93IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLS1pbmZvLT5ibG9ja3N0YWNrLmJzcDsKLQotICBzd2l0Y2ggKGluZm8tPmJsb2Nrc3RhY2suYnNwLT5raW5kKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICAvKiBXaGVuIHdlIGVuZCB0aGUgZ2xvYmFsIHR5cGVkZWZzIGJsb2NrLCB3ZSBjb3B5IG91dCB0aGUgdGhlCi0gICAgICAgICBjb250ZW50cyBvZiBpbmZvLT52YXJzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSB2YXJpYWJsZSBpbmRpY2VzCi0gICAgICAgICBtYXkgYmUgcmV1c2VkIGluIHRoZSBsb2NhbCBibG9ja3MuICBIb3dldmVyLCB3ZSBuZWVkIHRvCi0gICAgICAgICBwcmVzZXJ2ZSB0aGVtIHNvIHRoYXQgd2UgY2FuIGxvY2F0ZSBhIGZ1bmN0aW9uIHJldHVybmluZyBhCi0gICAgICAgICByZWZlcmVuY2UgdmFyaWFibGUgd2hvc2UgdHlwZSBpcyBuYW1lZCBpbiB0aGUgZ2xvYmFsIHR5cGVkZWYKLSAgICAgICAgIGJsb2NrLiAgKi8KLSAgICAgIGluZm8tPmdsb2JhbF92YXJzID0gKChzdHJ1Y3QgaWVlZV92YXJzICopCi0JCQkgICB4bWFsbG9jIChzaXplb2YgKmluZm8tPmdsb2JhbF92YXJzKSk7Ci0gICAgICBpbmZvLT5nbG9iYWxfdmFycy0+YWxsb2MgPSBpbmZvLT52YXJzLmFsbG9jOwotICAgICAgaW5mby0+Z2xvYmFsX3ZhcnMtPnZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhciAqKQotCQkJCSB4bWFsbG9jIChpbmZvLT52YXJzLmFsbG9jCi0JCQkJCSAgKiBzaXplb2YgKCppbmZvLT52YXJzLnZhcnMpKSk7Ci0gICAgICBtZW1jcHkgKGluZm8tPmdsb2JhbF92YXJzLT52YXJzLCBpbmZvLT52YXJzLnZhcnMsCi0JICAgICAgaW5mby0+dmFycy5hbGxvYyAqIHNpemVvZiAoKmluZm8tPnZhcnMudmFycykpOwotCi0gICAgICAvKiBXZSBhbHNvIGNvcHkgb3V0IHRoZSBub24gYnVpbHRpbiBwYXJ0cyBvZiBpbmZvLT50eXBlcywgc2luY2UKLSAgICAgICAgIHRoZSB0eXBlcyBhcmUgZGlzY2FyZGVkIHdoZW4gd2Ugc3RhcnQgYSBuZXcgYmxvY2suICAqLwotICAgICAgaW5mby0+Z2xvYmFsX3R5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlcyAqKQotCQkJICAgIHhtYWxsb2MgKHNpemVvZiAqaW5mby0+Z2xvYmFsX3R5cGVzKSk7Ci0gICAgICBpbmZvLT5nbG9iYWxfdHlwZXMtPmFsbG9jID0gaW5mby0+dHlwZXMuYWxsb2M7Ci0gICAgICBpbmZvLT5nbG9iYWxfdHlwZXMtPnR5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlICopCi0JCQkJICAgeG1hbGxvYyAoaW5mby0+dHlwZXMuYWxsb2MKLQkJCQkJICAgICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKSk7Ci0gICAgICBtZW1jcHkgKGluZm8tPmdsb2JhbF90eXBlcy0+dHlwZXMsIGluZm8tPnR5cGVzLnR5cGVzLAotCSAgICAgIGluZm8tPnR5cGVzLmFsbG9jICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKTsKLSAgICAgIG1lbXNldCAoaW5mby0+Z2xvYmFsX3R5cGVzLT5idWlsdGlucywgMCwKLQkgICAgICBzaXplb2YgKGluZm8tPmdsb2JhbF90eXBlcy0+YnVpbHRpbnMpKTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA2OgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+c2tpcCkKLQl7Ci0JICBpZiAoISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGluZm8tPmRoYW5kbGUsIG9mZnNldCArIDEpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4ODY6Ci0gICAgICAvKiBUaGlzIGlzIEJFNiB3aGVuIEJCNiBzdGFydGVkIGEgYmxvY2sgcmF0aGVyIHRoYW4gYSBsb2NhbAotCSBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX2VuZF9ibG9jayAoaW5mby0+ZGhhbmRsZSwgb2Zmc2V0ICsgMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDU6Ci0gICAgICAvKiBXaGVuIHdlIGVuZCBhIEJCNSwgd2UgbG9vayB1cCB0aGUgc3RhY2sgZm9yIHRoZSBsYXN0IEJCNSwgaWYKLSAgICAgICAgIHRoZXJlIGlzIG9uZSwgc28gdGhhdCB3ZSBjYW4gY2FsbCBkZWJ1Z19zdGFydF9zb3VyY2UuICAqLwotICAgICAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwID4gaW5mby0+YmxvY2tzdGFjay5zdGFjaykKLQl7Ci0JICBzdHJ1Y3QgaWVlZV9ibG9jayAqYmw7Ci0KLQkgIGJsID0gaW5mby0+YmxvY2tzdGFjay5ic3A7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgLS1ibDsKLQkgICAgICBpZiAoYmwtPmtpbmQgPT0gNSkKLQkJewotCQkgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoaW5mby0+ZGhhbmRsZSwgYmwtPmZpbGVuYW1lKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICB3aGlsZSAoYmwgIT0gaW5mby0+YmxvY2tzdGFjay5zdGFjayk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDExOgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgbW9kdWxlIHNpemUuICBGSVhNRS4gICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBPdGhlciBibG9jayB0eXBlcyBkbyBub3QgaGF2ZSBhbnkgdHJhaWxpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhbiBOTiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9ubiAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpubl9zdGFydDsKLSAgYmZkX3ZtYSB2YXJpbmR4OwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQotICBubl9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpCi0gICAgICB8fCAhIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZhcmluZHggPCAzMikKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBubl9zdGFydCwgXygiaWxsZWdhbCB2YXJpYWJsZSBpbmRleCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHZhcmluZHggLT0gMzI7Ci0KLSAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgICAgIGFsbG9jID0gaW5mby0+dmFycy5hbGxvYzsKLSAgICAgIGlmIChhbGxvYyA9PSAwKQotCWFsbG9jID0gNDsKLSAgICAgIHdoaWxlICh2YXJpbmR4ID49IGFsbG9jKQotCWFsbG9jICo9IDI7Ci0gICAgICBpbmZvLT52YXJzLnZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhciAqKQotCQkJIHhyZWFsbG9jIChpbmZvLT52YXJzLnZhcnMsCi0JCQkJICAgYWxsb2MgKiBzaXplb2YgKmluZm8tPnZhcnMudmFycykpOwotICAgICAgbWVtc2V0IChpbmZvLT52YXJzLnZhcnMgKyBpbmZvLT52YXJzLmFsbG9jLCAwLAotCSAgICAgIChhbGxvYyAtIGluZm8tPnZhcnMuYWxsb2MpICogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpOwotICAgICAgaW5mby0+dmFycy5hbGxvYyA9IGFsbG9jOwotICAgIH0KLQotICBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtZSA9IG5hbWU7Ci0gIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1sZW4gPSBuYW1sZW47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgVFkgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2llZWVfdHkgKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqdHlfc3RhcnQsICp0eV92YXJfc3RhcnQsICp0eV9jb2RlX3N0YXJ0OwotICBiZmRfdm1hIHR5cGVpbmR4LCB2YXJpbmR4LCB0YzsKLSAgUFRSIGRoYW5kbGU7Ci0gIGJvb2xlYW4gdGFnLCB0eXBkZWY7Ci0gIGRlYnVnX3R5cGUgKmFyZ19zbG90czsKLSAgdW5zaWduZWQgbG9uZyB0eXBlX2JpdHNpemU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLQotICB0eV9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGVpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHR5cGVpbmR4IDwgMjU2KQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X3N0YXJ0LCBfKCJpbGxlZ2FsIHR5cGUgaW5kZXgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHR5cGVpbmR4IC09IDI1NjsKLSAgaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCB0eXBlaW5keCwgZmFsc2UpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKipwcCAhPSAweGNlKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygidW5rbm93biBUWSBjb2RlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgdHlfdmFyX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2YXJpbmR4IDwgMzIpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfdmFyX3N0YXJ0LCBfKCJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgdmFyaW5keCAtPSAzMjsKLQotICBpZiAodmFyaW5keCA+PSBpbmZvLT52YXJzLmFsbG9jIHx8IGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfdmFyX3N0YXJ0LCBfKCJ1bmRlZmluZWQgdmFyaWFibGUgaW4gVFkiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHR5X2NvZGVfc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0YykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIHRhZyA9IGZhbHNlOwotICB0eXBkZWYgPSBmYWxzZTsKLSAgYXJnX3Nsb3RzID0gTlVMTDsKLSAgdHlwZV9iaXRzaXplID0gMDsKLSAgc3dpdGNoICh0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X2NvZGVfc3RhcnQsIF8oInVua25vd24gVFkgY29kZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgJyEnOgotICAgICAgLyogVW5rbm93biB0eXBlLCB3aXRoIHNpemUuICBXZSB0cmVhdCBpdCBhcyBpbnQuICBGSVhNRS4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzaXplOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLQl0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgc2l6ZSwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdBJzogLyogQXJyYXkuICAqLwotICAgIGNhc2UgJ2EnOiAvKiBGT1JUUkFOIGFycmF5IGluIGNvbHVtbi9yb3cgb3JkZXIuICBGSVhNRTogTm90Ci0JCSBkaXN0aW5ndWlzaGVkIGZyb20gbm9ybWFsIGFycmF5LiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGVsZV90eXBlOwotCWJmZF92bWEgbG93ZXIsIHVwcGVyOwotCi0JaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmZWxlX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZsb3dlcikKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnVwcGVyKSkKLQkgIHJldHVybiBmYWxzZTsKLQl0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLCBlbGVfdHlwZSwKLQkJCQkgICAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgdHlfY29kZV9zdGFydCwKLQkJCQkJCQkgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJICBidWlsdGluX2ludCkpLAotCQkJCSAgICAgIChiZmRfc2lnbmVkX3ZtYSkgbG93ZXIsCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSB1cHBlciwKLQkJCQkgICAgICBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0UnOgotICAgICAgLyogU2ltcGxlIGVudW1lcmF0aW9uLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWNvbnN0IGNoYXIgKipuYW1lczsKLQl1bnNpZ25lZCBpbnQgYzsKLQliZmRfc2lnbmVkX3ZtYSAqdmFsczsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JLyogRklYTUU6IHdlIGlnbm9yZSB0aGUgZW51bWVyYXRpb24gc2l6ZS4gICovCi0KLQlhbGxvYyA9IDEwOwotCW5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0JbWVtc2V0IChuYW1lcywgMCwgYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLQljID0gMDsKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgcHJlc2VudCkKLQkgICAgICBicmVhazsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCQkgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkgICAgICB9Ci0KLQkgICAgbmFtZXNbY10gPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCSAgICBpZiAobmFtZXNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCW5hbWVzW2NdID0gTlVMTDsKLQotCXZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYyAqIHNpemVvZiAqdmFscyk7Ci0JZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQkgIHZhbHNbaV0gPSBpOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfZW51bV90eXBlIChkaGFuZGxlLCBuYW1lcywgdmFscyk7Ci0JdGFnID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICAvKiBTdHJ1Y3Qgd2l0aCBiaXQgZmllbGRzLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JYWxsb2MgPSAxMDsKLQlmaWVsZHMgPSAoZGVidWdfZmllbGQgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmZpZWxkcyk7Ci0JYyA9IDA7Ci0Jd2hpbGUgKDEpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0JICAgIGRlYnVnX3R5cGUgZnR5cGU7Ci0JICAgIGJmZF92bWEgYml0cG9zLCBiaXRzaXplOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBwcmVzZW50KQotCSAgICAgIGJyZWFrOwotCSAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZmdHlwZSkKLQkJfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmJpdHBvcykKLQkJfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmJpdHNpemUpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkJICB4cmVhbGxvYyAoZmllbGRzLCBhbGxvYyAqIHNpemVvZiAqZmllbGRzKSk7Ci0JICAgICAgfQotCi0JICAgIGZpZWxkc1tjXSA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbiksCi0JCQkJCSAgZnR5cGUsIGJpdHBvcywgYml0c2l6ZSwKLQkJCQkJICBERUJVR19WSVNJQklMSVRZX1BVQkxJQyk7Ci0JICAgIGlmIChmaWVsZHNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCWZpZWxkc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdHJ1ZSwgc2l6ZSwgZmllbGRzKTsKLQl0YWcgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdOJzoKLSAgICAgIC8qIEVudW1lcmF0aW9uLiAgKi8KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgYWxsb2M7Ci0JY29uc3QgY2hhciAqKm5hbWVzOwotCWJmZF9zaWduZWRfdm1hICp2YWxzOwotCXVuc2lnbmVkIGludCBjOwotCi0JYWxsb2MgPSAxMDsKLQluYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotCXZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLQljID0gMDsKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQkgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFsKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBpcyB6ZXJvLCB0aGVuIHRoZSB2YWx1ZSBpcwotICAgICAgICAgICAgICAgYWN0dWFsbHkgdGhlIHNpemUgb2YgdGhlIGVudW0uICBXZSBpZ25vcmUgdGhpcwotICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0JICAgIGlmIChuYW1sZW4gPT0gMCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCQkgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkJdmFscyA9ICgoYmZkX3NpZ25lZF92bWEgKikKLQkJCXhyZWFsbG9jICh2YWxzLCBhbGxvYyAqIHNpemVvZiAqdmFscykpOwotCSAgICAgIH0KLQotCSAgICBuYW1lc1tjXSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JICAgIGlmIChuYW1lc1tjXSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgdmFsc1tjXSA9IChiZmRfc2lnbmVkX3ZtYSkgdmFsOwotCSAgICArK2M7Ci0JICB9Ci0KLQluYW1lc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWxzKTsKLQl0YWcgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdPJzogLyogU21hbGwgcG9pbnRlci4gIFdlIGRvbid0IGRpc3Rpbmd1aXNoIHNtYWxsIGFuZCBsYXJnZQotCQkgcG9pbnRlcnMuICBGSVhNRS4gICovCi0gICAgY2FzZSAnUCc6IC8qIExhcmdlIHBvaW50ZXIuICAqLwotICAgICAgewotCWRlYnVnX3R5cGUgdDsKLQotCWlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCXR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwgdCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgLyogUmFuZ2UuICAqLwotICAgICAgewotCWJmZF92bWEgbG93LCBoaWdoLCBzaWduZWRwLCBzaXplOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZsb3cpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZoaWdoKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2lnbmVkcCkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfcmFuZ2VfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgICBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCBzaXplLAotCQkJCQkJCSAgICEgc2lnbmVkcCksCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSBsb3csCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSBoaWdoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6IC8qIFN0cnVjdC4gICovCi0gICAgY2FzZSAnVSc6IC8qIFVuaW9uLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JYWxsb2MgPSAxMDsKLQlmaWVsZHMgPSAoZGVidWdfZmllbGQgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmZpZWxkcyk7Ci0JYyA9IDA7Ci0Jd2hpbGUgKDEpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0JICAgIGJmZF92bWEgdGluZHg7Ci0JICAgIGJmZF92bWEgb2Zmc2V0OwotCSAgICBkZWJ1Z190eXBlIGZ0eXBlOwotCSAgICBiZmRfdm1hIGJpdHNpemU7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdGluZHgpCi0JCXx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZvZmZzZXQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAodGluZHggPCAyNTYpCi0JICAgICAgewotCQlmdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCB0eV9jb2RlX3N0YXJ0LCB0aW5keCk7Ci0JCWJpdHNpemUgPSAwOwotCQlvZmZzZXQgKj0gODsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cnVjdCBpZWVlX3R5cGUgKnQ7Ci0KLQkJdGluZHggLT0gMjU2OwotCQlpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHRpbmR4LCB0cnVlKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXQgPSBpbmZvLT50eXBlcy50eXBlcyArIHRpbmR4OwotCQlmdHlwZSA9IHQtPnR5cGU7Ci0JCWJpdHNpemUgPSB0LT5iaXRzaXplOwotCQlpZiAoYml0c2l6ZSA9PSAwKQotCQkgIG9mZnNldCAqPSA4OwotCSAgICAgIH0KLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkJICB4cmVhbGxvYyAoZmllbGRzLCBhbGxvYyAqIHNpemVvZiAqZmllbGRzKSk7Ci0JICAgICAgfQotCi0JICAgIGZpZWxkc1tjXSA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbiksCi0JCQkJCSAgZnR5cGUsIG9mZnNldCwgYml0c2l6ZSwKLQkJCQkJICBERUJVR19WSVNJQklMSVRZX1BVQkxJQyk7Ci0JICAgIGlmIChmaWVsZHNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCWZpZWxkc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdGMgPT0gJ1MnLCBzaXplLCBmaWVsZHMpOwotCXRhZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogVHlwZWRlZi4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0eXBkZWYgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgIC8qIFByb2NlZHVyZS4gIEZJWE1FOiBUaGlzIGlzIGFuIGV4dGVybiBkZWNsYXJhdGlvbiwgd2hpY2ggd2UKLSAgICAgICAgIGhhdmUgbm8gd2F5IG9mIHJlcHJlc2VudGluZy4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBhdHRyOwotCWRlYnVnX3R5cGUgcnR5cGU7Ci0JYmZkX3ZtYSBuYXJnczsKLQlib29sZWFuIHByZXNlbnQ7Ci0Jc3RydWN0IGllZWVfdmFyICpwdjsKLQotCS8qIEZJWE1FOiBXZSBpZ25vcmUgdGhlIGF0dHJpYnV0ZSBhbmQgdGhlIGFyZ3VtZW50IG5hbWVzLiAgKi8KLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXR0cikKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZydHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJm5hcmdzKSkKLQkgIHJldHVybiBmYWxzZTsKLQlkbwotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl3aGlsZSAocHJlc2VudCk7Ci0KLQlwdiA9IGluZm8tPnZhcnMudmFycyArIHZhcmluZHg7Ci0JcHYtPmtpbmQgPSBJRUVFX0VYVEVSTkFMOwotCWlmIChwdi0+bmFtbGVuID4gMAotCSAgICAmJiBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBydHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotCSAgewotCSAgICAvKiBTZXQgdXAgdGhlIHJldHVybiB0eXBlIGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgdG8KLSAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSBzbG90LCBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UgaXQgdG8gYQotICAgICAgICAgICAgICAgcmVmZXJlbmNlIGxhdGVyIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgICAgcHYtPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpwdi0+cHNsb3QpOwotCSAgICAqcHYtPnBzbG90ID0gcnR5cGU7Ci0JICAgIHJ0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBwdi0+cHNsb3QsCi0JCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgfQotCi0JdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgcnR5cGUsIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkJCSBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgLyogVm9pZC4gIFRoaXMgaXMgbm90IGRvY3VtZW50ZWQsIGJ1dCB0aGUgTVJJIGNvbXBpbGVyIGVtaXRzIGl0LiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1onOgotICAgICAgLyogQXJyYXkgd2l0aCAwIGxvd2VyIGJvdW5kLiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGV0eXBlOwotCWJmZF92bWEgaGlnaDsKLQotCWlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJmV0eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaGlnaCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLCBldHlwZSwKLQkJCQkgICAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgdHlfY29kZV9zdGFydCwKLQkJCQkJCQkgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJICBidWlsdGluX2ludCkpLAotCQkJCSAgICAgIDAsIChiZmRfc2lnbmVkX3ZtYSkgaGlnaCwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzogLyogQ29tcGxleC4gICovCi0gICAgY2FzZSAnZCc6IC8qIERvdWJsZSBjb21wbGV4LiAgKi8KLSAgICAgIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCi0JLyogRklYTUU6IEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBuYW1lIG1lYW5zLiAgKi8KLQotCWlmICghIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoZGhhbmRsZSwgdGMgPT0gJ2MnID8gNCA6IDgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICAgIC8qIFBhc2NhbCBmaWxlIG5hbWUuICBGSVhNRS4gICovCi0gICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV9jb2RlX3N0YXJ0LCBfKCJQYXNjYWwgZmlsZSBuYW1lIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgIC8qIEJpdGZpZWxkIHR5cGUuICAqLwotICAgICAgewotCWJmZF92bWEgc2lnbmVkcCwgYml0c2l6ZSwgZHVtbXk7Ci0JY29uc3QgYmZkX2J5dGUgKmhvbGQ7Ci0JYm9vbGVhbiBwcmVzZW50OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaWduZWRwKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYml0c2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBJIHRoaW5rIHRoZSBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCB0aGVyZSBpcyBhIHR5cGUgaW5kZXgsCi0gICAgICAgICAgIGJ1dCBzb21lIGFjdHVhbCBmaWxlcyBkbyBub3QgaGF2ZSBvbmUuICAqLwotCWhvbGQgPSAqcHA7Ci0JaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZkdW1teSwgJnByZXNlbnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICghIHByZXNlbnQpCi0JICB7Ci0JICAgIC8qIEZJWE1FOiBUaGlzIGlzIGp1c3QgYSBndWVzcy4gICovCi0JICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LAotCQkJCQlzaWduZWRwID8gZmFsc2UgOiB0cnVlKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgICpwcCA9IGhvbGQ7Ci0JICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnR5cGUpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl0eXBlX2JpdHNpemUgPSBiaXRzaXplOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICduJzoKLSAgICAgIC8qIFF1YWxpZmllci4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBraW5kOwotCWRlYnVnX3R5cGUgdDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAma2luZCkKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0KSkKLQkgIHJldHVybiBmYWxzZTsKLQotCXN3aXRjaCAoa2luZCkKLQkgIHsKLQkgIGRlZmF1bHQ6Ci0JICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X3N0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBxdWFsaWZlciIpKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBjYXNlIDE6Ci0JICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKGRoYW5kbGUsIHQpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB0eXBlID0gZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIChkaGFuZGxlLCB0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgLyogU2V0LiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JZGVidWdfdHlwZSBldHlwZTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZldHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBGSVhNRTogV2UgaWdub3JlIHRoZSBzaXplLiAgKi8KLQotCXR5cGUgPSBkZWJ1Z19tYWtlX3NldF90eXBlIChkaGFuZGxlLCBldHlwZSwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICAgIC8qIFByb2NlZHVyZSB3aXRoIGNvbXBpbGVyIGRlcGVuZGVuY2llcy4gICovCi0gICAgICB7Ci0Jc3RydWN0IGllZWVfdmFyICpwdjsKLQliZmRfdm1hIGF0dHIsIGZyYW1lX3R5cGUsIHB1c2hfbWFzaywgbmFyZ3MsIGxldmVsLCBmYXRoZXI7Ci0JZGVidWdfdHlwZSBydHlwZTsKLQlkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0JYm9vbGVhbiB2YXJhcmdzOwotCWJvb2xlYW4gcHJlc2VudDsKLQotCS8qIEZJWE1FOiBXZSBpZ25vcmUgc29tZSBvZiB0aGlzIGluZm9ybWF0aW9uLiAgKi8KLQotCXB2ID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXR0cikKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmZyYW1lX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZwdXNoX21hc2spCi0JICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmcnR5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZuYXJncykpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKG5hcmdzID09IChiZmRfdm1hKSAtMSkKLQkgIHsKLQkgICAgYXJnX3R5cGVzID0gTlVMTDsKLQkgICAgdmFyYXJncyA9IGZhbHNlOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IGk7Ci0KLQkgICAgYXJnX3R5cGVzID0gKChkZWJ1Z190eXBlICopCi0JCQkgeG1hbGxvYyAoKG5hcmdzICsgMSkgKiBzaXplb2YgKmFyZ190eXBlcykpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkgICAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsIGFyZ190eXBlcyArIGkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgLyogSWYgdGhlIGxhc3QgdHlwZSBpcyBwb2ludGVyIHRvIHZvaWQsIHRoaXMgaXMgcmVhbGx5IGEKLSAgICAgICAgICAgICAgIHZhcmFyZ3MgZnVuY3Rpb24uICAqLwotCSAgICB2YXJhcmdzID0gZmFsc2U7Ci0JICAgIGlmIChuYXJncyA+IDApCi0JICAgICAgewotCQlkZWJ1Z190eXBlIGxhc3Q7Ci0KLQkJbGFzdCA9IGFyZ190eXBlc1tuYXJncyAtIDFdOwotCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgbGFzdCkgPT0gREVCVUdfS0lORF9QT0lOVEVSCi0JCSAgICAmJiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwKLQkJCQkJICAgICBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQkJCSAgICBsYXN0KSkKLQkJCT09IERFQlVHX0tJTkRfVk9JRCkpCi0JCSAgewotCQkgICAgLS1uYXJnczsKLQkJICAgIHZhcmFyZ3MgPSB0cnVlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogSWYgdGhlcmUgYXJlIGFueSBwb2ludGVyIGFyZ3VtZW50cywgdHVybiB0aGVtIGludG8KLSAgICAgICAgICAgICAgIGluZGlyZWN0IHR5cGVzIGluIGNhc2Ugd2UgbGF0ZXIgbmVlZCB0byBjb252ZXJ0IHRoZW0gdG8KLSAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0eXBlcy4gICovCi0JICAgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQotCSAgICAgIHsKLQkJaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGFyZ190eXBlc1tpXSkKLQkJICAgID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkJICB7Ci0JCSAgICBpZiAoYXJnX3Nsb3RzID09IE5VTEwpCi0JCSAgICAgIHsKLQkJCWFyZ19zbG90cyA9ICgoZGVidWdfdHlwZSAqKQotCQkJCSAgICAgeG1hbGxvYyAobmFyZ3MgKiBzaXplb2YgKmFyZ19zbG90cykpOwotCQkJbWVtc2V0IChhcmdfc2xvdHMsIDAsIG5hcmdzICogc2l6ZW9mICphcmdfc2xvdHMpOwotCQkgICAgICB9Ci0JCSAgICBhcmdfc2xvdHNbaV0gPSBhcmdfdHlwZXNbaV07Ci0JCSAgICBhcmdfdHlwZXNbaV0gPQotCQkgICAgICBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQlhcmdfc2xvdHMgKyBpLAotCQkJCQkJKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBhcmdfdHlwZXNbbmFyZ3NdID0gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbGV2ZWwpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZmYXRoZXIsICZwcmVzZW50KSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIFdlIGNhbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZnVuY3Rpb24gYW5kIGEgc3RhdGljCi0gICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQlwdi0+a2luZCA9IElFRUVfRlVOQ1RJT047Ci0KLQlpZiAocHYtPm5hbWxlbiA+IDAKLQkgICAgJiYgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgcnR5cGUpID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkgIHsKLQkgICAgLyogU2V0IHVwIHRoZSByZXR1cm4gdHlwZSBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nIHRvCi0gICAgICAgICAgICAgICB0aGUgdmFyaWFibGUgc2xvdCwgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIGl0IHRvIGEKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZSBsYXRlciBpZiBhcHByb3ByaWF0ZS4gICovCi0JICAgIHB2LT5wc2xvdCA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcHYtPnBzbG90KTsKLQkgICAgKnB2LT5wc2xvdCA9IHJ0eXBlOwotCSAgICBydHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgcHYtPnBzbG90LAotCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIH0KLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHJ0eXBlLCBhcmdfdHlwZXMsIHZhcmFyZ3MpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlY29yZCB0aGUgdHlwZSBpbiB0aGUgdGFibGUuICAqLwotCi0gIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLnR5cGUgPSB0eXBlOwotCi0gIGlmICgodGFnIHx8IHR5cGRlZikKLSAgICAgICYmIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1sZW4gPiAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIG5hbWUgPSBzYXZlc3RyaW5nIChpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtZSwKLQkJCSBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtbGVuKTsKLSAgICAgIGlmICh0eXBkZWYpCi0JdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7Ci0gICAgICBlbHNlIGlmICh0YyA9PSAnRScgfHwgdGMgPT0gJ04nKQotCXR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGllZWVfdGFnICppdDsKLQotCSAgLyogV2UgbXVzdCBhbGxvY2F0ZSBhbGwgc3RydWN0IHRhZ3MgYXMgaW5kaXJlY3QgdHlwZXMsIHNvCi0gICAgICAgICAgICAgdGhhdCBpZiB3ZSBsYXRlciBzZWUgYSBkZWZpbml0aW9uIG9mIHRoZSB0YWcgYXMgYSBDKysKLSAgICAgICAgICAgICByZWNvcmQgd2UgY2FuIHVwZGF0ZSB0aGUgaW5kaXJlY3Qgc2xvdCBhbmQgYXV0b21hdGljYWxseQotICAgICAgICAgICAgIGNoYW5nZSBhbGwgdGhlIGV4aXN0aW5nIHJlZmVyZW5jZXMuICAqLwotCSAgaXQgPSAoc3RydWN0IGllZWVfdGFnICopIHhtYWxsb2MgKHNpemVvZiAqaXQpOwotCSAgbWVtc2V0IChpdCwgMCwgc2l6ZW9mICppdCk7Ci0JICBpdC0+bmV4dCA9IGluZm8tPnRhZ3M7Ci0JICBpbmZvLT50YWdzID0gaXQ7Ci0JICBpdC0+bmFtZSA9IG5hbWU7Ci0JICBpdC0+c2xvdCA9IHR5cGU7Ci0KLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsICZpdC0+c2xvdCwgbmFtZSk7Ci0JICB0eXBlID0gZGVidWdfdGFnX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUpOwotCi0JICBpdC0+dHlwZSA9IHR5cGU7Ci0JfQotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPnR5cGVzLnR5cGVzW3R5cGVpbmR4XS50eXBlID0gdHlwZTsKLSAgaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLmFyZ19zbG90cyA9IGFyZ19zbG90czsKLSAgaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLmJpdHNpemUgPSB0eXBlX2JpdHNpemU7Ci0KLSAgLyogV2UgbWF5IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgdHlwZSBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nCi0gICAgIHRvIHNsb3QuICBJdCBkb2VzIG5vIGhhcm0gdG8gcmVwbGFjZSB0aGUgaW5kaXJlY3QgdHlwZSB3aXRoIHRoZQotICAgICByZWFsIHR5cGUuICBGaWxsaW5nIGluIHNsb3QgYXMgd2VsbCBoYW5kbGVzIHRoZSBpbmRpcmVjdCB0eXBlcwotICAgICB3aGljaCBhcmUgYWxyZWFkeSBoYW5naW5nIGFyb3VuZC4gICovCi0gIGlmIChpbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0ucHNsb3QgIT0gTlVMTCkKLSAgICAqaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLnBzbG90ID0gdHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYW4gQVROIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9pZWVlX2F0biAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICphdG5fc3RhcnQsICphdG5fY29kZV9zdGFydDsKLSAgYmZkX3ZtYSB2YXJpbmR4OwotICBzdHJ1Y3QgaWVlZV92YXIgKnB2YXI7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBhdG5fY29kZTsKLSAgUFRSIGRoYW5kbGU7Ci0gIGJmZF92bWEgdiwgdjIsIHYzLCB2NCwgdjU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICBjaGFyICpuYW1jb3B5OwotICBib29sZWFuIHByZXNlbnQ7Ci0gIGludCBibG9ja3R5cGU7Ci0KLSAgYXRuX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdHlwZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF0bl9jb2RlX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXRuX2NvZGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmFyaW5keCA9PSAwKQotICAgIHsKLSAgICAgIHB2YXIgPSBOVUxMOwotICAgICAgbmFtZSA9ICIiOwotICAgICAgbmFtbGVuID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhcmluZHggPCAzMikKLSAgICB7Ci0gICAgICAvKiBUaGUgTVJJIGNvbXBpbGVyIHJlcG9ydGVkbHkgc29tZXRpbWVzIGVtaXRzIHZhcmlhYmxlIGxpZmV0aW1lCi0gICAgICAgICBpbmZvcm1hdGlvbiBmb3IgYSByZWdpc3Rlci4gIFdlIGp1c3QgaWdub3JlIGl0LiAgKi8KLSAgICAgIGlmIChhdG5fY29kZSA9PSA5KQotCXJldHVybiBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpOwotCi0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fc3RhcnQsIF8oImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFyaW5keCAtPSAzMjsKLSAgICAgIGlmICh2YXJpbmR4ID49IGluZm8tPnZhcnMuYWxsb2MKLQkgIHx8IGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lID09IE5VTEwpCi0JewotCSAgLyogVGhlIE1SSSBjb21waWxlciBvciBsaW5rZXIgc29tZXRpbWVzIG9taXRzIHRoZSBOTiByZWNvcmQKLSAgICAgICAgICAgICBmb3IgYSBwbWlzYyByZWNvcmQuICAqLwotCSAgaWYgKGF0bl9jb2RlID09IDYyKQotCSAgICB7Ci0JICAgICAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYykKLQkJewotCQkgIHVuc2lnbmVkIGludCBhbGxvYzsKLQotCQkgIGFsbG9jID0gaW5mby0+dmFycy5hbGxvYzsKLQkJICBpZiAoYWxsb2MgPT0gMCkKLQkJICAgIGFsbG9jID0gNDsKLQkJICB3aGlsZSAodmFyaW5keCA+PSBhbGxvYykKLQkJICAgIGFsbG9jICo9IDI7Ci0JCSAgaW5mby0+dmFycy52YXJzID0gKChzdHJ1Y3QgaWVlZV92YXIgKikKLQkJCQkgICAgIHhyZWFsbG9jIChpbmZvLT52YXJzLnZhcnMsCi0JCQkJCSAgICAgICAoYWxsb2MKLQkJCQkJCSogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpKSk7Ci0JCSAgbWVtc2V0IChpbmZvLT52YXJzLnZhcnMgKyBpbmZvLT52YXJzLmFsbG9jLCAwLAotCQkJICAoKGFsbG9jIC0gaW5mby0+dmFycy5hbGxvYykKLQkJCSAgICogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpKTsKLQkJICBpbmZvLT52YXJzLmFsbG9jID0gYWxsb2M7Ci0JCX0KLQotCSAgICAgIHB2YXIgPSBpbmZvLT52YXJzLnZhcnMgKyB2YXJpbmR4OwotCSAgICAgIHB2YXItPm5hbWUgPSAiIjsKLQkgICAgICBwdmFyLT5uYW1sZW4gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fc3RhcnQsIF8oInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBBVE4iKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBwdmFyID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKLQotICAgICAgcHZhci0+dHlwZSA9IHR5cGU7Ci0KLSAgICAgIG5hbWUgPSBwdmFyLT5uYW1lOwotICAgICAgbmFtbGVuID0gcHZhci0+bmFtbGVuOwotICAgIH0KLQotICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgd2l0aCBhIHBvaW50ZXIKLSAgICAgdHlwZSwgY2hhbmdlIHRoZSB0eXBlIHRvIGFuIGluZGlyZWN0IHR5cGUgc28gdGhhdCB3ZSBjYW4gbGF0ZXIKLSAgICAgY2hhbmdlIGl0IHRvIGEgcmVmZXJlbmNlIHR5cGUgaWYgd2UgZW5jb3VudGVyIGEgQysrIHBtaXNjICdSJwotICAgICByZWNvcmQuICAqLwotICBpZiAocHZhciAhPSBOVUxMCi0gICAgICAmJiB0eXBlICE9IERFQlVHX1RZUEVfTlVMTAotICAgICAgJiYgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgdHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYXRuX2NvZGUpCi0JewotCWNhc2UgMToKLQljYXNlIDI6Ci0JY2FzZSAzOgotCWNhc2UgNToKLQljYXNlIDg6Ci0JY2FzZSAxMDoKLQkgIHB2YXItPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpwdmFyLT5wc2xvdCk7Ci0JICAqcHZhci0+cHNsb3QgPSB0eXBlOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgcHZhci0+cHNsb3QsCi0JCQkJCSAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgcHZhci0+dHlwZSA9IHR5cGU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAoYXRuX2NvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fY29kZV9zdGFydCwgXygidW5rbm93biBBVE4gdHlwZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgMToKLSAgICAgIC8qIEF1dG9tYXRpYyB2YXJpYWJsZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX0xPQ0FMLCB2KTsKLQotICAgIGNhc2UgMjoKLSAgICAgIC8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAodHlwZSA9PSBOVUxMKQotCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXB2YXItPmtpbmQgPSBJRUVFX0xPQ0FMOwotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwgREVCVUdfUkVHSVNURVIsCi0JCQkJICAgIGllZWVfcmVnbm9fdG9fZ2VucmVnIChpbmZvLT5hYmZkLCB2KSk7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBTdGF0aWMgdmFyaWFibGUuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIGlmICh0eXBlID09IE5VTEwpCi0JdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKQotCWJsb2NrdHlwZSA9IDA7Ci0gICAgICBlbHNlCi0JYmxvY2t0eXBlID0gaW5mby0+YmxvY2tzdGFjay5ic3BbLTFdLmtpbmQ7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXsKLQkgIGlmIChibG9ja3R5cGUgPT0gNCB8fCBibG9ja3R5cGUgPT0gNikKLQkgICAgcHZhci0+a2luZCA9IElFRUVfTE9DQUw7Ci0JICBlbHNlCi0JICAgIHB2YXItPmtpbmQgPSBJRUVFX1NUQVRJQzsKLQl9Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLAotCQkJCSAgICAoYmxvY2t0eXBlID09IDQgfHwgYmxvY2t0eXBlID09IDYKLQkJCQkgICAgID8gREVCVUdfTE9DQUxfU1RBVElDCi0JCQkJICAgICA6IERFQlVHX1NUQVRJQyksCi0JCQkJICAgIHYpOwotCi0gICAgY2FzZSA0OgotICAgICAgLyogRXh0ZXJuYWwgZnVuY3Rpb24uICBXZSBkb24ndCBjdXJyZW50bHkgcmVjb3JkIHRoZXNlLiAgRklYTUUuICAqLwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9FWFRFUk5BTDsKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSA1OgotICAgICAgLyogRXh0ZXJuYWwgdmFyaWFibGUuICBXZSBkb24ndCBjdXJyZW50bHkgcmVjb3JkIHRoZXNlLiAgRklYTUUuICAqLwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9FWFRFUk5BTDsKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSA3OgotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQotCSAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYyKQotCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYzLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHByZXNlbnQpCi0JewotCSAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2NCwgJnByZXNlbnQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgdHdvIG9wdGlvbmFsIGZpZWxkcyBpbiB2MyBhbmQgdjQsIHNpbmNlCi0gICAgICAgICB0aGV5IGFyZSBub3QgZGVmaW5lZC4gICovCi0KLSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBjb2x1bW4gbnVtYmVyLiAgRklYTUUuICAqLwotCi0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX2xpbmUgKGRoYW5kbGUsIHYsIHYzKTsKLQotICAgIGNhc2UgODoKLSAgICAgIC8qIEdsb2JhbCB2YXJpYWJsZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9HTE9CQUw7Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLCBERUJVR19HTE9CQUwsIHYpOwotCi0gICAgY2FzZSA5OgotICAgICAgLyogVmFyaWFibGUgbGlmZXRpbWUgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDEwOgotICAgICAgLyogTG9ja2VkIHJlZ2lzdGVyLiAgVGhlIHNwZWMgc2F5cyB0aGF0IHRoZXJlIGFyZSB0d28gcmVxdWlyZWQKLSAgICAgICAgIGZpZWxkcywgYnV0IGF0IGxlYXN0IG9uIG9jY2FzaW9uIHRoZSBNUkkgY29tcGlsZXIgb25seSBlbWl0cwotICAgICAgICAgb25lLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSSB0aGluayB0aGlzIG1lYW5zIGEgdmFyaWFibGUgdGhhdCBpcyBib3RoIGluIGEgcmVnaXN0ZXIgYW5kCi0gICAgICAgICBhIGZyYW1lIHNsb3QuICBXZSBpZ25vcmUgdGhlIGZyYW1lIHNsb3QuICBGSVhNRS4gICovCi0KLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX1JFR0lTVEVSLCB2KTsKLQotICAgIGNhc2UgMTE6Ci0gICAgICAvKiBSZXNlcnZlZCBmb3IgRk9SVFJBTiBjb21tb24uICAqLwotICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsIF8oInVuc3VwcG9ydGVkIEFUTjExIikpOwotCi0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSAxMjoKLSAgICAgIC8qIEJhc2VkIHZhcmlhYmxlLiAgKi8KLSAgICAgIHYzID0gMDsKLSAgICAgIHY0ID0gMHg4MDsKLSAgICAgIHY1ID0gMDsKLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2MikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MywgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwcmVzZW50KQotCXsKLQkgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjQsICZwcmVzZW50KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKHByZXNlbnQpCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnY1LCAmcHJlc2VudCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9jb2RlX3N0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBBVE4xMiIpKTsKLQotICAgICAgLyogUmV0dXJuIHRydWUgdG8ga2VlcCBnb2luZy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgMTY6Ci0gICAgICAvKiBDb25zdGFudC4gIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHRoYXQgSSBoYXZlIGlzIGFtYmlndW91cywKLSAgICAgICAgIHNvIEknbSBub3QgZ29pbmcgdG8gdHJ5IHRvIGltcGxlbWVudCBpdC4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCi0JICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjIsICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHJlc2VudCkKLQl7Ci0JICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYyLCAmcHJlc2VudCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChwcmVzZW50KQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcCA9PSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bSkKLQl7Ci0JICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDE5OgotICAgICAgLyogU3RhdGljIHZhcmlhYmxlIGZyb20gYXNzZW1ibGVyLiAgKi8KLSAgICAgIHYyID0gMDsKLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpCi0JICB8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgLyogV2UgZG9uJ3QgcmVhbGx5IGhhbmRsZSB0aGlzIGNvcnJlY3RseS4gIEZJWE1FLiAgKi8KLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksCi0JCQkJICAgIGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKSwKLQkJCQkgICAgdjIgIT0gMCA/IERFQlVHX0dMT0JBTCA6IERFQlVHX1NUQVRJQywKLQkJCQkgICAgdjMpOwotCi0gICAgY2FzZSA2MjoKLSAgICAgIC8qIFByb2NlZHVyZSBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uLiAgKi8KLSAgICBjYXNlIDYzOgotICAgICAgLyogVmFyaWFibGUgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbi4gICovCi0gICAgY2FzZSA2NDoKLSAgICAgIC8qIE1vZHVsZSBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2MikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhdG5fY29kZSA9PSA2MiAmJiB2ID09IDgwKQotCXsKLQkgIGlmIChwcmVzZW50KQotCSAgICB7Ci0JICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsCi0JCQkgIF8oInVuZXhwZWN0ZWQgc3RyaW5nIGluIEMrKyBtaXNjIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgcmV0dXJuIGllZWVfcmVhZF9jeHhfbWlzYyAoaW5mbywgcHAsIHYyKTsKLQl9Ci0KLSAgICAgIC8qIFdlIGp1c3QgaWdub3JlIGFsbCBvZiB0aGlzIHN0dWZmLiAgRklYTUUuICAqLwotCi0gICAgICBmb3IgKDsgdjIgPiAwOyAtLXYyKQotCXsKLQkgIHN3aXRjaCAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcCkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygiYmFkIG1pc2MgcmVjb3JkIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBjYXNlIGllZWVfYXRfcmVjb3JkX2VudW06Ci0JICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bToKLQkgICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYzKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogSGFuZGxlIEMrKyBkZWJ1Z2dpbmcgbWlzY2VsbGFuZW91cyByZWNvcmRzLiAgVGhpcyBpcyBjYWxsZWQgZm9yCi0gICBwcm9jZWR1cmUgbWlzY2VsbGFuZW91cyByZWNvcmRzIG9mIHR5cGUgODAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX2N4eF9taXNjIChpbmZvLCBwcCwgY291bnQpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgYmZkX3ZtYSBjYXRlZ29yeTsKLQotICBzdGFydCA9ICpwcDsKLQotICAvKiBHZXQgdGhlIGNhdGVnb3J5IG9mIEMrKyBtaXNjIHJlY29yZC4gICovCi0gIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY2F0ZWdvcnkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLS1jb3VudDsKLQotICBzd2l0Y2ggKGNhdGVnb3J5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgbWlzYyByZWNvcmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIGlmICghIGllZWVfcmVhZF9jeHhfY2xhc3MgKGluZm8sIHBwLCBjb3VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIHsKLQliZmRfdm1hIGZsYWdzOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0KLQkvKiBUaGUgSUVFRSBzcGVjIGluZGljYXRlcyB0aGF0IHRoZSAnTScgcmVjb3JkIG9ubHkgaGFzIGEKLSAgICAgICAgICAgZmxhZ3MgZmllbGQuICBUaGUgTVJJIGNvbXBpbGVyIGFsc28gZW1pdHMgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQotCWlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICgqcHAgPCBpbmZvLT5wZW5kCi0JICAgICYmIChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHAgPT0gaWVlZV9hdF9yZWNvcmRfZW51bSkKLQkgIHsKLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCS8qIFRoaXMgaXMgZW1pdHRlZCBmb3IgbWV0aG9kIGZ1bmN0aW9ucywgYnV0IEkgZG9uJ3QgdGhpbmsgd2UKLSAgICAgICAgICAgY2FyZSB2ZXJ5IG11Y2guICBJdCBtaWdodCBoZWxwIGlmIGl0IHRvbGQgdXMgdXNlZnVsCi0gICAgICAgICAgIGluZm9ybWF0aW9uIGxpa2UgdGhlIGNsYXNzIHdpdGggd2hpY2ggdGhpcyBmdW5jdGlvbiBpcwotICAgICAgICAgICBhc3NvY2lhdGVkLCBidXQgaXQgZG9lc24ndCwgc28gaXQgaXNuJ3QgaGVscGZ1bC4gICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2N4eF9kZWZhdWx0cyAoaW5mbywgcHAsIGNvdW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3onOgotICAgICAgewotCWNvbnN0IGNoYXIgKm5hbWUsICptYW5nbGVkLCAqY2xhc3M7Ci0JdW5zaWduZWQgbG9uZyBuYW1sZW4sIG1hbmdsZWRsZW4sIGNsYXNzbGVuOwotCWJmZF92bWEgY29udHJvbDsKLQotCS8qIFBvaW50ZXIgdG8gbWVtYmVyLiAgKi8KLQotCWlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKQotCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkLCAmbWFuZ2xlZGxlbikKLQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmY2xhc3MsICZjbGFzc2xlbikKLQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNvbnRyb2wpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogRklYTUU6IFdlIHNob3VsZCBub3cgdHJhY2sgZG93biBuYW1lIGFuZCBjaGFuZ2UgaXRzIHR5cGUuICAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgIGlmICghIGllZWVfcmVhZF9yZWZlcmVuY2UgKGluZm8sIHBwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBDKysgY2xhc3MgZGVmaW5pdGlvbi4gIFRoaXMgaXMgYSBwbWlzYyB0eXBlIDgwIHJlY29yZCBvZgotICAgY2F0ZWdvcnkgJ1QnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9jeHhfY2xhc3MgKGluZm8sIHBwLCBjb3VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBiZmRfdm1hIGNsYXNzOwotICBjb25zdCBjaGFyICp0YWc7Ci0gIHVuc2lnbmVkIGxvbmcgdGFnbGVuOwotICBzdHJ1Y3QgaWVlZV90YWcgKml0OwotICBQVFIgZGhhbmRsZTsKLSAgZGVidWdfZmllbGQgKmZpZWxkczsKLSAgdW5zaWduZWQgaW50IGZpZWxkX2NvdW50LCBmaWVsZF9hbGxvYzsKLSAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgdW5zaWduZWQgaW50IGJhc2VjbGFzc2VzX2NvdW50LCBiYXNlY2xhc3Nlc19hbGxvYzsKLSAgY29uc3QgZGVidWdfZmllbGQgKnN0cnVjdGZpZWxkczsKLSAgc3RydWN0IGllZWVfbWV0aG9kCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICAgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnZhcmlhbnRzOwotICAgICAgdW5zaWduZWQgY291bnQ7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gICAgfSAqbWV0aG9kczsKLSAgdW5zaWduZWQgaW50IG1ldGhvZHNfY291bnQsIG1ldGhvZHNfYWxsb2M7Ci0gIGRlYnVnX3R5cGUgdnB0cmJhc2U7Ci0gIGJvb2xlYW4gb3dudnB0cjsKLSAgZGVidWdfbWV0aG9kICpkbWV0aG9kczsKLQotICBzdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNsYXNzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC0tY291bnQ7Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJnRhZywgJnRhZ2xlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotICAtLWNvdW50OwotCi0gIC8qIEZpbmQgdGhlIEMgc3RydWN0IHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgZm9yIChpdCA9IGluZm8tPnRhZ3M7IGl0ICE9IE5VTEw7IGl0ID0gaXQtPm5leHQpCi0gICAgaWYgKGl0LT5uYW1lWzBdID09IHRhZ1swXQotCSYmIHN0cm5jbXAgKGl0LT5uYW1lLCB0YWcsIHRhZ2xlbikgPT0gMAotCSYmIHN0cmxlbiAoaXQtPm5hbWUpID09IHRhZ2xlbikKLSAgICAgIGJyZWFrOwotICBpZiAoaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5kZWZpbmVkIEMrKyBvYmplY3QiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIGZpZWxkcyA9IE5VTEw7Ci0gIGZpZWxkX2NvdW50ID0gMDsKLSAgZmllbGRfYWxsb2MgPSAwOwotICBiYXNlY2xhc3NlcyA9IE5VTEw7Ci0gIGJhc2VjbGFzc2VzX2NvdW50ID0gMDsKLSAgYmFzZWNsYXNzZXNfYWxsb2MgPSAwOwotICBtZXRob2RzID0gTlVMTDsKLSAgbWV0aG9kc19jb3VudCA9IDA7Ci0gIG1ldGhvZHNfYWxsb2MgPSAwOwotICB2cHRyYmFzZSA9IERFQlVHX1RZUEVfTlVMTDsKLSAgb3dudnB0ciA9IGZhbHNlOwotCi0gIHN0cnVjdGZpZWxkcyA9IGRlYnVnX2dldF9maWVsZHMgKGRoYW5kbGUsIGl0LT50eXBlKTsKLQotICB3aGlsZSAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIGJmZF92bWEgaWQ7Ci0gICAgICBjb25zdCBiZmRfYnl0ZSAqc3BlY19zdGFydDsKLQotICAgICAgc3BlY19zdGFydCA9ICpwcDsKLQotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZpZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLS1jb3VudDsKLQotICAgICAgc3dpdGNoIChpZCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGllZWVfZXJyb3IgKGluZm8sIHNwZWNfc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgb2JqZWN0IHNwZWMiKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQljYXNlICdiJzoKLQkgIHsKLQkgICAgYmZkX3ZtYSBmbGFncywgY2lubGluZTsKLQkgICAgY29uc3QgY2hhciAqYmFzZW5hbWUsICpmaWVsZG5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgYmFzZWxlbiwgZmllbGRsZW47Ci0JICAgIGNoYXIgKmJhc2Vjb3B5OwotCSAgICBkZWJ1Z190eXBlIGJhc2V0eXBlOwotCSAgICBiZmRfdm1hIGJpdHBvczsKLQkgICAgYm9vbGVhbiB2aXJ0dWFscDsKLQkgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0JICAgIGRlYnVnX2Jhc2VjbGFzcyBiYXNlY2xhc3M7Ci0KLQkgICAgLyogVGhpcyByZXByZXNlbnRzIGEgYmFzZSBvciBmcmllbmQgY2xhc3MuICAqLwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmJhc2VuYW1lLCAmYmFzZWxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNpbmxpbmUpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmZpZWxkbmFtZSwgJmZpZWxkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDQ7Ci0KLQkgICAgLyogV2UgaGF2ZSBubyB3YXkgb2YgcmVjb3JkaW5nIGZyaWVuZCBpbmZvcm1hdGlvbiwgc28gd2UKLSAgICAgICAgICAgICAgIGp1c3QgaWdub3JlIGl0LiAgKi8KLQkgICAgaWYgKChmbGFncyAmIEJBU0VGTEFHU19GUklFTkQpICE9IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSSBhc3N1bWUgdGhhdCBlaXRoZXIgYWxsIG9mIHRoZSBtZW1iZXJzIG9mIHRoZQotICAgICAgICAgICAgICAgYmFzZWNsYXNzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0LCBzdGFydGluZyBhdCB0aGUKLSAgICAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0LCBvciB0aGF0IG5vbmUgb2YgdGhlbSBhcmUKLSAgICAgICAgICAgICAgIGluY2x1ZGVkLiAgKi8KLQotCSAgICBpZiAoKGZpZWxkbGVuID09IDApID09IChjaW5saW5lID09IDApKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuc3VwcG9ydGVkIEMrKyBvYmplY3QgdHlwZSIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBiYXNlY29weSA9IHNhdmVzdHJpbmcgKGJhc2VuYW1lLCBiYXNlbGVuKTsKLQkgICAgYmFzZXR5cGUgPSBkZWJ1Z19maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBiYXNlY29weSwKLQkJCQkJICAgICAgIERFQlVHX0tJTkRfSUxMRUdBTCk7Ci0JICAgIGZyZWUgKGJhc2Vjb3B5KTsKLQkgICAgaWYgKGJhc2V0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgYmFzZSBjbGFzcyBub3QgZGVmaW5lZCIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoZmllbGRsZW4gPT0gMCkKLQkgICAgICBiaXRwb3MgPSAwOwotCSAgICBlbHNlCi0JICAgICAgewotCQljb25zdCBkZWJ1Z19maWVsZCAqcGY7Ci0KLQkJaWYgKHN0cnVjdGZpZWxkcyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCWZvciAocGYgPSBzdHJ1Y3RmaWVsZHM7ICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOyBwZisrKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotCi0JCSAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChkaGFuZGxlLCAqcGYpOwotCQkgICAgaWYgKGZuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmIChmbmFtZVswXSA9PSBmaWVsZG5hbWVbMF0KLQkJCSYmIHN0cm5jbXAgKGZuYW1lLCBmaWVsZG5hbWUsIGZpZWxkbGVuKSA9PSAwCi0JCQkmJiBzdHJsZW4gKGZuYW1lKSA9PSBmaWVsZGxlbikKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCQlpZiAoKnBmID09IERFQlVHX0ZJRUxEX05VTEwpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJXygiQysrIGJhc2UgY2xhc3Mgbm90IGZvdW5kIGluIGNvbnRhaW5lciIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJYml0cG9zID0gZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyAoZGhhbmRsZSwgKnBmKTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKChmbGFncyAmIEJBU0VGTEFHU19WSVJUVUFMKSAhPSAwKQotCSAgICAgIHZpcnR1YWxwID0gdHJ1ZTsKLQkgICAgZWxzZQotCSAgICAgIHZpcnR1YWxwID0gZmFsc2U7Ci0JICAgIGlmICgoZmxhZ3MgJiBCQVNFRkxBR1NfUFJJVkFURSkgIT0gMCkKLQkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCSAgICBlbHNlCi0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCi0JICAgIGJhc2VjbGFzcyA9IGRlYnVnX21ha2VfYmFzZWNsYXNzIChkaGFuZGxlLCBiYXNldHlwZSwgYml0cG9zLAotCQkJCQkgICAgICB2aXJ0dWFscCwgdmlzaWJpbGl0eSk7Ci0JICAgIGlmIChiYXNlY2xhc3MgPT0gREVCVUdfQkFTRUNMQVNTX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGlmIChiYXNlY2xhc3Nlc19jb3VudCArIDEgPj0gYmFzZWNsYXNzZXNfYWxsb2MpCi0JICAgICAgewotCQliYXNlY2xhc3Nlc19hbGxvYyArPSAxMDsKLQkJYmFzZWNsYXNzZXMgPSAoKGRlYnVnX2Jhc2VjbGFzcyAqKQotCQkJICAgICAgIHhyZWFsbG9jIChiYXNlY2xhc3NlcywKLQkJCQkJIChiYXNlY2xhc3Nlc19hbGxvYwotCQkJCQkgICogc2l6ZW9mICpiYXNlY2xhc3NlcykpKTsKLQkgICAgICB9Ci0KLQkgICAgYmFzZWNsYXNzZXNbYmFzZWNsYXNzZXNfY291bnRdID0gYmFzZWNsYXNzOwotCSAgICArK2Jhc2VjbGFzc2VzX2NvdW50OwotCSAgICBiYXNlY2xhc3Nlc1tiYXNlY2xhc3Nlc19jb3VudF0gPSBERUJVR19CQVNFQ0xBU1NfTlVMTDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6Ci0JICB7Ci0JICAgIGJmZF92bWEgZmxhZ3M7Ci0JICAgIGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgKm1hbmdsZWRuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIGZpZWxkbGVuLCBtYW5nbGVkbGVuOwotCSAgICBjaGFyICpmaWVsZGNvcHk7Ci0JICAgIGJvb2xlYW4gc3RhdGljcDsKLQkgICAgZGVidWdfdHlwZSBmdHlwZTsKLQkgICAgY29uc3QgZGVidWdfZmllbGQgKnBmID0gTlVMTDsKLQkgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0JICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotCi0JICAgIC8qIFRoaXMgcmVwcmVzZW50cyBhIGRhdGEgbWVtYmVyLiAgKi8KLQotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmZsYWdzKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmaWVsZG5hbWUsICZmaWVsZGxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbWFuZ2xlZG5hbWUsICZtYW5nbGVkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDM7Ci0KLQkgICAgZmllbGRjb3B5ID0gc2F2ZXN0cmluZyAoZmllbGRuYW1lLCBmaWVsZGxlbik7Ci0KLQkgICAgc3RhdGljcCA9IChmbGFncyAmIENYWEZMQUdTX1NUQVRJQykgIT0gMCA/IHRydWUgOiBmYWxzZTsKLQotCSAgICBpZiAoc3RhdGljcCkKLQkgICAgICB7Ci0JCXN0cnVjdCBpZWVlX3ZhciAqcHYsICpwdmVuZDsKLQotCQkvKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBkZWZpbml0aW9uIGZvciB0aGlzIHZhcmlhYmxlLiAgKi8KLQkJcHYgPSBpbmZvLT52YXJzLnZhcnM7Ci0JCXB2ZW5kID0gcHYgKyBpbmZvLT52YXJzLmFsbG9jOwotCQlmb3IgKDsgcHYgPCBwdmVuZDsgcHYrKykKLQkJICBpZiAocHYtPm5hbWxlbiA9PSBtYW5nbGVkbGVuCi0JCSAgICAgICYmIHN0cm5jbXAgKHB2LT5uYW1lLCBtYW5nbGVkbmFtZSwgbWFuZ2xlZGxlbikgPT0gMCkKLQkJICAgIGJyZWFrOwotCQlpZiAocHYgPCBwdmVuZCkKLQkJICBmdHlwZSA9IHB2LT50eXBlOwotCQllbHNlCi0JCSAgewotCQkgICAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB2YXJpYWJsZSBpcyBuZXZlciB1c2VkLiAgKi8KLQkJICAgIGZ0eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHN0YXJ0LAotCQkJCQkgICAgICAgKHVuc2lnbmVkIGludCkgYnVpbHRpbl92b2lkKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgZmluZHg7Ci0KLQkJaWYgKHN0cnVjdGZpZWxkcyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCWZvciAocGYgPSBzdHJ1Y3RmaWVsZHMsIGZpbmR4ID0gMDsKLQkJICAgICAqcGYgIT0gREVCVUdfRklFTERfTlVMTDsKLQkJICAgICBwZisrLCBmaW5keCsrKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotCi0JCSAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChkaGFuZGxlLCAqcGYpOwotCQkgICAgaWYgKGZuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmIChmbmFtZVswXSA9PSBtYW5nbGVkbmFtZVswXQotCQkJJiYgc3RybmNtcCAoZm5hbWUsIG1hbmdsZWRuYW1lLCBtYW5nbGVkbGVuKSA9PSAwCi0JCQkmJiBzdHJsZW4gKGZuYW1lKSA9PSBtYW5nbGVkbGVuKQotCQkgICAgICBicmVhazsKLQkJICB9Ci0JCWlmICgqcGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQlfKCJDKysgZGF0YSBtZW1iZXIgbm90IGZvdW5kIGluIGNvbnRhaW5lciIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJZnR5cGUgPSBkZWJ1Z19nZXRfZmllbGRfdHlwZSAoZGhhbmRsZSwgKnBmKTsKLQotCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgZnR5cGUpID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkJICB7Ci0JCSAgICAvKiBXZSBtaWdodCBuZWVkIHRvIGNvbnZlcnQgdGhpcyBmaWVsZCBpbnRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHR5cGUgbGF0ZXIgb24sIHNvIG1ha2UgaXQgYW4gaW5kaXJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZS4gICovCi0JCSAgICBpZiAoaXQtPmZzbG90cyA9PSBOVUxMKQotCQkgICAgICB7Ci0JCQl1bnNpZ25lZCBpbnQgZmNudDsKLQkJCWNvbnN0IGRlYnVnX2ZpZWxkICpwZmNudDsKLQotCQkJZmNudCA9IDA7Ci0JCQlmb3IgKHBmY250ID0gc3RydWN0ZmllbGRzOwotCQkJICAgICAqcGZjbnQgIT0gREVCVUdfRklFTERfTlVMTDsKLQkJCSAgICAgcGZjbnQrKykKLQkJCSAgKytmY250OwotCQkJaXQtPmZzbG90cyA9ICgoZGVidWdfdHlwZSAqKQotCQkJCSAgICAgIHhtYWxsb2MgKGZjbnQgKiBzaXplb2YgKml0LT5mc2xvdHMpKTsKLQkJCW1lbXNldCAoaXQtPmZzbG90cywgMCwKLQkJCQlmY250ICogc2l6ZW9mICppdC0+ZnNsb3RzKTsKLQkJICAgICAgfQotCi0JCSAgICBpZiAoZnR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpdC0+ZnNsb3RzW2ZpbmR4XSA9IGZ0eXBlOwotCQkgICAgZnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQkgICAgICBpdC0+ZnNsb3RzICsgZmluZHgsCi0JCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoZnR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBzd2l0Y2ggKGZsYWdzICYgQ1hYRkxBR1NfVklTSUJJTElUWSkKLQkgICAgICB7Ci0JICAgICAgZGVmYXVsdDoKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVua25vd24gQysrIHZpc2liaWxpdHkiKSk7Ci0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QVUJMSUM6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJJVkFURToKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBpZiAoc3RhdGljcCkKLQkgICAgICB7Ci0JCWNoYXIgKm1hbmdsZWRjb3B5OwotCi0JCW1hbmdsZWRjb3B5ID0gc2F2ZXN0cmluZyAobWFuZ2xlZG5hbWUsIG1hbmdsZWRsZW4pOwotCi0JCWZpZWxkID0gZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChkaGFuZGxlLCBmaWVsZGNvcHksCi0JCQkJCQkgIGZ0eXBlLCBtYW5nbGVkY29weSwKLQkJCQkJCSAgdmlzaWJpbGl0eSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfdm1hIGJpdHBvcywgYml0c2l6ZTsKLQotCQliaXRwb3MgPSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIChkaGFuZGxlLCAqcGYpOwotCQliaXRzaXplID0gZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgKGRoYW5kbGUsICpwZik7Ci0JCWlmIChiaXRwb3MgPT0gKGJmZF92bWEpIC0xIHx8IGJpdHNpemUgPT0gKGJmZF92bWEpIC0xKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJiYWQgQysrIGZpZWxkIGJpdCBwb3Mgb3Igc2l6ZSIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCWZpZWxkID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgZmllbGRjb3B5LCBmdHlwZSwgYml0cG9zLAotCQkJCQkgIGJpdHNpemUsIHZpc2liaWxpdHkpOwotCSAgICAgIH0KLQotCSAgICBpZiAoZmllbGQgPT0gREVCVUdfRklFTERfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgaWYgKGZpZWxkX2NvdW50ICsgMSA+PSBmaWVsZF9hbGxvYykKLQkgICAgICB7Ci0JCWZpZWxkX2FsbG9jICs9IDEwOwotCQlmaWVsZHMgPSAoKGRlYnVnX2ZpZWxkICopCi0JCQkgIHhyZWFsbG9jIChmaWVsZHMsIGZpZWxkX2FsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgICB9Ci0KLQkgICAgZmllbGRzW2ZpZWxkX2NvdW50XSA9IGZpZWxkOwotCSAgICArK2ZpZWxkX2NvdW50OwotCSAgICBmaWVsZHNbZmllbGRfY291bnRdID0gREVCVUdfRklFTERfTlVMTDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnbSc6Ci0JY2FzZSAndic6Ci0JICB7Ci0JICAgIGJmZF92bWEgZmxhZ3MsIHZvZmZzZXQsIGNvbnRyb2w7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUsICptYW5nbGVkOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbiwgbWFuZ2xlZGxlbjsKLQkgICAgc3RydWN0IGllZWVfdmFyICpwdiwgKnB2ZW5kOwotCSAgICBkZWJ1Z190eXBlIHR5cGU7Ci0JICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotCSAgICBib29sZWFuIGNvbnN0cCwgdm9sYXRpbGVwOwotCSAgICBjaGFyICptYW5nbGVkY29weTsKLQkgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgbXY7Ci0JICAgIHN0cnVjdCBpZWVlX21ldGhvZCAqbWV0aDsKLQkgICAgdW5zaWduZWQgaW50IGltOwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm1hbmdsZWQsICZtYW5nbGVkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDM7Ci0JICAgIGlmIChpZCAhPSAndicpCi0JICAgICAgdm9mZnNldCA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdm9mZnNldCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQktLWNvdW50OwotCSAgICAgIH0KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjb250cm9sKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIC0tY291bnQ7Ci0KLQkgICAgLyogV2UganVzdCBpZ25vcmUgdGhlIGNvbnRyb2wgaW5mb3JtYXRpb24uICAqLwotCi0JICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlcHJlc2VudCBmcmllbmQgaW5mb3JtYXRpb24sIHNvIHdlCi0gICAgICAgICAgICAgICBqdXN0IGlnbm9yZSBpdC4gICovCi0JICAgIGlmICgoZmxhZ3MgJiBDWFhGTEFHU19GUklFTkQpICE9IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogV2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBzZWVuIGEgdHlwZSBmb3IgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgcHYgPSBpbmZvLT52YXJzLnZhcnM7Ci0JICAgIHB2ZW5kID0gcHYgKyBpbmZvLT52YXJzLmFsbG9jOwotCSAgICBmb3IgKDsgcHYgPCBwdmVuZDsgcHYrKykKLQkgICAgICBpZiAocHYtPm5hbWxlbiA9PSBtYW5nbGVkbGVuCi0JCSAgJiYgc3RybmNtcCAocHYtPm5hbWUsIG1hbmdsZWQsIG1hbmdsZWRsZW4pID09IDApCi0JCWJyZWFrOwotCi0JICAgIGlmIChwdiA+PSBwdmVuZCkKLQkgICAgICB7Ci0JCS8qIFdlIHdvbid0IGhhdmUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmdW5jdGlvbiBpZgotCQkgICBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBmaWxlLiAgV2UgZG9uJ3QgdHJ5IHRvCi0JCSAgIGhhbmRsZSB0aGlzIGNhc2UuICBGSVhNRS4gICovCi0JCXR5cGUgPSAoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0JCQkoZGhhbmRsZSwKLQkJCSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgc3RhcnQsCi0JCQkJCSAgICAodW5zaWduZWQgaW50KSBidWlsdGluX3ZvaWQpLAotCQkJIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkgZmFsc2UpKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0JCWNvbnN0IGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLQkJYm9vbGVhbiB2YXJhcmdzOwotCi0JCWlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBwdi0+dHlwZSkKLQkJICAgICE9IERFQlVHX0tJTkRfRlVOQ1RJT04pCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJXygiYmFkIHR5cGUgZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCXJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChkaGFuZGxlLCBwdi0+dHlwZSk7Ci0JCWFyZ190eXBlcyA9IGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMgKGRoYW5kbGUsIHB2LT50eXBlLAotCQkJCQkJICAgICAgICZ2YXJhcmdzKTsKLQkJaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCB8fCBhcmdfdHlwZXMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQlfKCJubyB0eXBlIGluZm9ybWF0aW9uIGZvciBDKysgbWV0aG9kIGZ1bmN0aW9uIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQotCQl0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGl0LT50eXBlLAotCQkJCQkgICAgICAgKGRlYnVnX3R5cGUgKikgYXJnX3R5cGVzLAotCQkJCQkgICAgICAgdmFyYXJncyk7Ci0JICAgICAgfQotCSAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIHN3aXRjaCAoZmxhZ3MgJiBDWFhGTEFHU19WSVNJQklMSVRZKQotCSAgICAgIHsKLQkgICAgICBkZWZhdWx0OgotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5rbm93biBDKysgdmlzaWJpbGl0eSIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQzoKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGNvbnN0cCA9IChmbGFncyAmIENYWEZMQUdTX0NPTlNUKSAhPSAwID8gdHJ1ZSA6IGZhbHNlOwotCSAgICB2b2xhdGlsZXAgPSAoZmxhZ3MgJiBDWFhGTEFHU19WT0xBVElMRSkgIT0gMCA/IHRydWUgOiBmYWxzZTsKLQotCSAgICBtYW5nbGVkY29weSA9IHNhdmVzdHJpbmcgKG1hbmdsZWQsIG1hbmdsZWRsZW4pOwotCi0JICAgIGlmICgoZmxhZ3MgJiBDWFhGTEFHU19TVEFUSUMpICE9IDApCi0JICAgICAgewotCQlpZiAoaWQgPT0gJ3YnKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgc3RhdGljIHZpcnR1YWwgbWV0aG9kIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJbXYgPSBkZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwgbWFuZ2xlZGNvcHksCi0JCQkJCQkgICAgICAgdHlwZSwgdmlzaWJpbGl0eSwKLQkJCQkJCSAgICAgICBjb25zdHAsIHZvbGF0aWxlcCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlkZWJ1Z190eXBlIHZjb250ZXh0OwotCi0JCWlmIChpZCAhPSAndicpCi0JCSAgdmNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiBGSVhNRTogSG93IGNhbiB3ZSBjYWxjdWxhdGUgdGhpcyBjb3JyZWN0bHk/ICAqLwotCQkgICAgdmNvbnRleHQgPSBpdC0+dHlwZTsKLQkJICB9Ci0JCW12ID0gZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwgbWFuZ2xlZGNvcHksIHR5cGUsCi0JCQkJCQl2aXNpYmlsaXR5LCBjb25zdHAsCi0JCQkJCQl2b2xhdGlsZXAsIHZvZmZzZXQsCi0JCQkJCQl2Y29udGV4dCk7Ci0JICAgICAgfQotCSAgICBpZiAobXYgPT0gREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZm9yIChtZXRoID0gbWV0aG9kcywgaW0gPSAwOyBpbSA8IG1ldGhvZHNfY291bnQ7IG1ldGgrKywgaW0rKykKLQkgICAgICBpZiAobWV0aC0+bmFtbGVuID09IG5hbWxlbgotCQkgICYmIHN0cm5jbXAgKG1ldGgtPm5hbWUsIG5hbWUsIG5hbWxlbikgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIGlmIChpbSA+PSBtZXRob2RzX2NvdW50KQotCSAgICAgIHsKLQkJaWYgKG1ldGhvZHNfY291bnQgPj0gbWV0aG9kc19hbGxvYykKLQkJICB7Ci0JCSAgICBtZXRob2RzX2FsbG9jICs9IDEwOwotCQkgICAgbWV0aG9kcyA9ICgoc3RydWN0IGllZWVfbWV0aG9kICopCi0JCQkgICAgICAgeHJlYWxsb2MgKG1ldGhvZHMsCi0JCQkJCSBtZXRob2RzX2FsbG9jICogc2l6ZW9mICptZXRob2RzKSk7Ci0JCSAgfQotCQltZXRob2RzW21ldGhvZHNfY291bnRdLm5hbWUgPSBuYW1lOwotCQltZXRob2RzW21ldGhvZHNfY291bnRdLm5hbWxlbiA9IG5hbWxlbjsKLQkJbWV0aG9kc1ttZXRob2RzX2NvdW50XS52YXJpYW50cyA9IE5VTEw7Ci0JCW1ldGhvZHNbbWV0aG9kc19jb3VudF0uY291bnQgPSAwOwotCQltZXRob2RzW21ldGhvZHNfY291bnRdLmFsbG9jID0gMDsKLQkJbWV0aCA9IG1ldGhvZHMgKyBtZXRob2RzX2NvdW50OwotCQkrK21ldGhvZHNfY291bnQ7Ci0JICAgICAgfQotCi0JICAgIGlmIChtZXRoLT5jb3VudCArIDEgPj0gbWV0aC0+YWxsb2MpCi0JICAgICAgewotCQltZXRoLT5hbGxvYyArPSAxMDsKLQkJbWV0aC0+dmFyaWFudHMgPSAoKGRlYnVnX21ldGhvZF92YXJpYW50ICopCi0JCQkJICB4cmVhbGxvYyAobWV0aC0+dmFyaWFudHMsCi0JCQkJCSAgICAobWV0aC0+YWxsb2MKLQkJCQkJICAgICAqIHNpemVvZiAqbWV0aC0+dmFyaWFudHMpKSk7Ci0JICAgICAgfQotCi0JICAgIG1ldGgtPnZhcmlhbnRzW21ldGgtPmNvdW50XSA9IG12OwotCSAgICArK21ldGgtPmNvdW50OwotCSAgICBtZXRoLT52YXJpYW50c1ttZXRoLT5jb3VudF0gPSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdvJzoKLQkgIHsKLQkgICAgYmZkX3ZtYSBzcGVjOwotCi0JICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24sIHNvIHdlIGp1c3QKLQkgICAgICAgaWdub3JlIGl0LiAgKi8KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZzcGVjKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIC0tY291bnQ7Ci0JICAgIGlmICgoc3BlYyAmIDQpICE9IDApCi0JICAgICAgewotCQljb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJdW5zaWduZWQgbG9uZyBmaWxlbmFtbGVuOwotCQliZmRfdm1hIGxpbmVubzsKLQotCQlpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmZmlsZW5hbWUsICZmaWxlbmFtbGVuKQotCQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmxpbmVubykpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQljb3VudCAtPSAyOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKHNwZWMgJiA4KSAhPSAwKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbWFuZ2xlZDsKLQkJdW5zaWduZWQgbG9uZyBtYW5nbGVkbGVuOwotCi0JCWlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkLCAmbWFuZ2xlZGxlbikpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQktLWNvdW50OwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkgICAgXygidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgb3ZlcmhlYWQgc3BlYyIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAneic6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnZuYW1lLCAqYmFzZW5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdm5hbWVsZW4sIGJhc2VsZW47Ci0JICAgIGJmZF92bWEgdnNpemUsIGNvbnRyb2w7Ci0KLQkgICAgLyogQSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIuICAqLwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZ2bmFtZSwgJnZuYW1lbGVuKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdnNpemUpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmJhc2VuYW1lLCAmYmFzZWxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNvbnRyb2wpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgY291bnQgLT0gNDsKLQotCSAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgY29udHJvbCBudW1iZXIuICBXZSBkb24ndCBjYXJlIHdoYXQKLQkgICAgICAgdGhlIHZpcnR1YWwgdGFibGUgbmFtZSBpcy4gIFdlIGhhdmUgbm8gd2F5IHRvIHN0b3JlIHRoZQotCSAgICAgICB2aXJ0dWFsIHRhYmxlIHNpemUsIGFuZCBJIGRvbid0IHRoaW5rIHdlIGNhcmUgYW55aG93LiAgKi8KLQotCSAgICAvKiBGSVhNRTogV2UgY2FuJ3QgaGFuZGxlIG11bHRpcGxlIHZpcnR1YWwgdGFibGUgcG9pbnRlcnMuICAqLwotCi0JICAgIGlmIChiYXNlbGVuID09IDApCi0JICAgICAgb3dudnB0ciA9IHRydWU7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNoYXIgKmJhc2Vjb3B5OwotCi0JCWJhc2Vjb3B5ID0gc2F2ZXN0cmluZyAoYmFzZW5hbWUsIGJhc2VsZW4pOwotCQl2cHRyYmFzZSA9IGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIGJhc2Vjb3B5LAotCQkJCQkJICAgREVCVUdfS0lORF9JTExFR0FMKTsKLQkJZnJlZSAoYmFzZWNvcHkpOwotCQlpZiAodnB0cmJhc2UgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmRlZmluZWQgQysrIHZ0YWJsZSIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBtZXRob2QgdmFyaWFudHMsIHdlIGNhbiBjYWxsCi0gICAgIGRlYnVnX21ha2VfbWV0aG9kIGZvciBlYWNoIG9uZS4gICovCi0KLSAgaWYgKG1ldGhvZHNfY291bnQgPT0gMCkKLSAgICBkbWV0aG9kcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZG1ldGhvZHMgPSAoKGRlYnVnX21ldGhvZCAqKQotCQkgIHhtYWxsb2MgKChtZXRob2RzX2NvdW50ICsgMSkgKiBzaXplb2YgKmRtZXRob2RzKSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbWV0aG9kc19jb3VudDsgaSsrKQotCXsKLQkgIGNoYXIgKm5hbWNvcHk7Ci0KLQkgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChtZXRob2RzW2ldLm5hbWUsIG1ldGhvZHNbaV0ubmFtbGVuKTsKLQkgIGRtZXRob2RzW2ldID0gZGVidWdfbWFrZV9tZXRob2QgKGRoYW5kbGUsIG5hbWNvcHksCi0JCQkJCSAgIG1ldGhvZHNbaV0udmFyaWFudHMpOwotCSAgaWYgKGRtZXRob2RzW2ldID09IERFQlVHX01FVEhPRF9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZG1ldGhvZHNbaV0gPSBERUJVR19NRVRIT0RfTlVMTDsKLSAgICAgIGZyZWUgKG1ldGhvZHMpOwotICAgIH0KLQotICAvKiBUaGUgc3RydWN0IHR5cGUgd2FzIGNyZWF0ZWQgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyBhdAotICAgICBpdC0+c2xvdC4gIFdlIHVwZGF0ZSBpdC0+c2xvdCB0byBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBhbGwKLSAgICAgcmVmZXJlbmNlcyB0byB0aGlzIHN0cnVjdC4gICovCi0gIGl0LT5zbG90ID0gZGVidWdfbWFrZV9vYmplY3RfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgIGNsYXNzICE9ICd1JywKLQkJCQkgICAgIGRlYnVnX2dldF90eXBlX3NpemUgKGRoYW5kbGUsCi0JCQkJCQkJICBpdC0+c2xvdCksCi0JCQkJICAgICBmaWVsZHMsIGJhc2VjbGFzc2VzLCBkbWV0aG9kcywKLQkJCQkgICAgIHZwdHJiYXNlLCBvd252cHRyKTsKLSAgaWYgKGl0LT5zbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgQysrIGRlZmF1bHQgYXJndW1lbnQgdmFsdWUgYW5kIHJlZmVyZW5jZSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9jeHhfZGVmYXVsdHMgKGluZm8sIHBwLCBjb3VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBjb25zdCBjaGFyICpmbm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgZm5sZW47Ci0gIGJmZF92bWEgZGVmY291bnQ7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgLyogR2l2aW5nIHRoZSBmdW5jdGlvbiBuYW1lIGJlZm9yZSB0aGUgYXJndW1lbnQgY291bnQgaXMgYW4gYWRkZW5kdW0KLSAgICAgdG8gdGhlIHNwZWMuICBUaGUgZnVuY3Rpb24gbmFtZSBpcyBkZW1hbmdsZWQsIHRob3VnaCwgc28gdGhpcwotICAgICByZWNvcmQgbXVzdCBhbHdheXMgcmVmZXIgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCi0gIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrCi0gICAgICB8fCBpbmZvLT5ibG9ja3N0YWNrLmJzcFstMV0uZm5pbmR4ID09ICh1bnNpZ25lZCBpbnQpIC0xKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgZGVmYXVsdCB2YWx1ZXMgbm90IGluIGEgZnVuY3Rpb24iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmbm5hbWUsICZmbmxlbikKLSAgICAgIHx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZkZWZjb3VudCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb3VudCAtPSAyOwotCi0gIHdoaWxlIChkZWZjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHR5cGUsIHZhbDsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cnZhbDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RydmFsbGVuOwotCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC0tY291bnQ7Ci0KLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSAwOgotCWNhc2UgNDoKLQkgIGJyZWFrOwotCi0JY2FzZSAxOgotCWNhc2UgMjoKLQkgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdmFsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLS1jb3VudDsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCWNhc2UgNzoKLQkgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZzdHJ2YWwsICZzdHJ2YWxsZW4pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAtLWNvdW50OwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgZGVmYXVsdCB0eXBlIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcywgc28gd2UKLSAgICAgICAgIGp1c3QgaWdub3JlIHRoZW0uICBGSVhNRS4gICovCi0gICAgfQotCi0gIC8qIEFueSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBpbmRpY2VzIG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgcmVhbGx5Ci0gICAgIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBQVFIgZGhhbmRsZTsKLSAgICAgIGRlYnVnX3R5cGUgKmFyZ19zbG90czsKLQotICAgICAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7Ci0gICAgICBhcmdfc2xvdHMgPSBpbmZvLT50eXBlcy50eXBlc1tpbmZvLT5ibG9ja3N0YWNrLmJzcFstMV0uZm5pbmR4XS5hcmdfc2xvdHM7Ci0gICAgICB3aGlsZSAoY291bnQtLSA+IDApCi0JewotCSAgYmZkX3ZtYSBpbmR4OwotCSAgZGVidWdfdHlwZSB0YXJnZXQ7Ci0KLQkgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFRoZSBpbmRleCBpcyAxIGJhc2VkLiAgKi8KLQkgIC0taW5keDsKLQkgIGlmIChhcmdfc2xvdHMgPT0gTlVMTAotCSAgICAgIHx8IGFyZ19zbG90c1tpbmR4XSA9PSBERUJVR19UWVBFX05VTEwKLQkgICAgICB8fCAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgYXJnX3Nsb3RzW2luZHhdKQotCQkgICE9IERFQlVHX0tJTkRfUE9JTlRFUikpCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygicmVmZXJlbmNlIHBhcmFtZXRlciBpcyBub3QgYSBwb2ludGVyIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICB0YXJnZXQgPSBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGRoYW5kbGUsIGFyZ19zbG90c1tpbmR4XSk7Ci0JICBhcmdfc2xvdHNbaW5keF0gPSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChkaGFuZGxlLCB0YXJnZXQpOwotCSAgaWYgKGFyZ19zbG90c1tpbmR4XSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgQysrIHJlZmVyZW5jZSBkZWZpbml0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9yZWZlcmVuY2UgKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGJmZF92bWEgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIgKmNsYXNzLCAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBjbGFzc2xlbiwgbmFtbGVuOwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgZGVidWdfdHlwZSB0YXJnZXQ7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdpdmluZyB0aGUgY2xhc3MgbmFtZSBiZWZvcmUgdGhlIG1lbWJlciBuYW1lIGlzIGluIGFuIGFkZGVuZHVtIHRvCi0gICAgIHRoZSBzcGVjLiAgKi8KLSAgaWYgKGZsYWdzID09IDMpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmNsYXNzLCAmY2xhc3NsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwc2xvdCA9IE5VTEw7Ci0gIGlmIChmbGFncyAhPSAzKQotICAgIHsKLSAgICAgIGludCBwYXNzOwotCi0gICAgICAvKiBXZSBzZWFyY2ggZnJvbSB0aGUgbGFzdCB2YXJpYWJsZSBpbmRpY2VzIHRvIHRoZSBmaXJzdCBpbgotCSBob3BlcyBvZiBmaW5kaW5nIGxvY2FsIHZhcmlhYmxlcyBjb3JyZWN0bHkuICBXZSBzZWFyY2ggdGhlCi0JIGxvY2FsIHZhcmlhYmxlcyBvbiB0aGUgZmlyc3QgcGFzcywgYW5kIHRoZSBnbG9iYWwgdmFyaWFibGVzCi0JIG9uIHRoZSBzZWNvbmQuICBGSVhNRTogVGhpcyBwcm9iYWJseSB3b24ndCB3b3JrIGluIGFsbCBjYXNlcy4KLQkgT24gdGhlIG90aGVyIGhhbmQsIEkgZG9uJ3Qga25vdyB3aGF0IHdpbGwuICAqLwotICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykKLQl7Ci0JICBzdHJ1Y3QgaWVlZV92YXJzICp2YXJzOwotCSAgaW50IGk7Ci0JICBzdHJ1Y3QgaWVlZV92YXIgKnB2ID0gTlVMTDsKLQotCSAgaWYgKHBhc3MgPT0gMCkKLQkgICAgdmFycyA9ICZpbmZvLT52YXJzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFycyA9IGluZm8tPmdsb2JhbF92YXJzOwotCSAgICAgIGlmICh2YXJzID09IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IChpbnQpIHZhcnMtPmFsbG9jIC0gMTsgaSA+PSAwOyBpLS0pCi0JICAgIHsKLQkgICAgICBib29sZWFuIGZvdW5kOwotCi0JICAgICAgcHYgPSB2YXJzLT52YXJzICsgaTsKLQotCSAgICAgIGlmIChwdi0+cHNsb3QgPT0gTlVMTAotCQkgIHx8IHB2LT5uYW1sZW4gIT0gbmFtbGVuCi0JCSAgfHwgc3RybmNtcCAocHYtPm5hbWUsIG5hbWUsIG5hbWxlbikgIT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBmb3VuZCA9IGZhbHNlOwotCSAgICAgIHN3aXRjaCAoZmxhZ3MpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCSAgICAgIF8oInVucmVjb2duaXplZCBDKysgcmVmZXJlbmNlIHR5cGUiKSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCi0JCWNhc2UgMDoKLQkJICAvKiBHbG9iYWwgdmFyaWFibGUgb3IgZnVuY3Rpb24uICAqLwotCQkgIGlmIChwdi0+a2luZCA9PSBJRUVFX0dMT0JBTAotCQkgICAgICB8fCBwdi0+a2luZCA9PSBJRUVFX0VYVEVSTkFMCi0JCSAgICAgIHx8IHB2LT5raW5kID09IElFRUVfRlVOQ1RJT04pCi0JCSAgICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAxOgotCQkgIC8qIEdsb2JhbCBzdGF0aWMgdmFyaWFibGUgb3IgZnVuY3Rpb24uICAqLwotCQkgIGlmIChwdi0+a2luZCA9PSBJRUVFX1NUQVRJQwotCQkgICAgICB8fCBwdi0+a2luZCA9PSBJRUVFX0ZVTkNUSU9OKQotCQkgICAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgMjoKLQkJICAvKiBMb2NhbCB2YXJpYWJsZS4gICovCi0JCSAgaWYgKHB2LT5raW5kID09IElFRUVfTE9DQUwpCi0JCSAgICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChmb3VuZCkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGkgPj0gMCkKLQkgICAgewotCSAgICAgIHBzbG90ID0gcHYtPnBzbG90OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBpZWVlX3RhZyAqaXQ7Ci0KLSAgICAgIGZvciAoaXQgPSBpbmZvLT50YWdzOyBpdCAhPSBOVUxMOyBpdCA9IGl0LT5uZXh0KQotCXsKLQkgIGlmIChpdC0+bmFtZVswXSA9PSBjbGFzc1swXQotCSAgICAgICYmIHN0cm5jbXAgKGl0LT5uYW1lLCBjbGFzcywgY2xhc3NsZW4pID09IDAKLQkgICAgICAmJiBzdHJsZW4gKGl0LT5uYW1lKSA9PSBjbGFzc2xlbikKLQkgICAgewotCSAgICAgIGlmIChpdC0+ZnNsb3RzICE9IE5VTEwpCi0JCXsKLQkJICBjb25zdCBkZWJ1Z19maWVsZCAqcGY7Ci0JCSAgdW5zaWduZWQgaW50IGZpbmR4OwotCi0JCSAgcGYgPSBkZWJ1Z19nZXRfZmllbGRzIChpbmZvLT5kaGFuZGxlLCBpdC0+dHlwZSk7Ci0JCSAgaWYgKHBmID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJCSAgIkMrKyByZWZlcmVuY2UgaW4gY2xhc3Mgd2l0aCBubyBmaWVsZHMiKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgZm9yIChmaW5keCA9IDA7ICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOyBwZisrLCBmaW5keCsrKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpmbmFtZTsKLQotCQkgICAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChpbmZvLT5kaGFuZGxlLCAqcGYpOwotCQkgICAgICBpZiAoZm5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKGZuYW1lLCBuYW1lLCBuYW1sZW4pID09IDAKLQkJCSAgJiYgc3RybGVuIChmbmFtZSkgPT0gbmFtbGVuKQotCQkJewotCQkJICBwc2xvdCA9IGl0LT5mc2xvdHMgKyBmaW5keDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocHNsb3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIHJlZmVyZW5jZSBub3QgZm91bmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIGFsbG9jYXRlZCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcKLSAgICAgdG8gKnBzbG90LCB3aGljaCB3ZSBjYW4gbm93IHVwZGF0ZSB0byBiZSBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsICpwc2xvdCkgIT0gREVCVUdfS0lORF9QT0lOVEVSKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgcmVmZXJlbmNlIGlzIG5vdCBwb2ludGVyIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB0YXJnZXQgPSBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGluZm8tPmRoYW5kbGUsICpwc2xvdCk7Ci0gICpwc2xvdCA9IGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKGluZm8tPmRoYW5kbGUsIHRhcmdldCk7Ci0gIGlmICgqcHNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVxdWlyZSBhbiBBU04gcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCBwdikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0gIGJmZF92bWEgdmFyaW5keDsKLQotICBzdGFydCA9ICpwcDsKLQotICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKLSAgaWYgKGMgIT0gaWVlZV9lMl9maXJzdF9ieXRlX2VudW0pCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIm1pc3NpbmcgcmVxdWlyZWQgQVNOIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICoqcHApOwotICBpZiAoYyAhPSBpZWVlX2Fzbl9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBU04iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBKdXN0IGlnbm9yZSB0aGUgdmFyaWFibGUgaW5kZXguICAqLwotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCBwdik7Ci19Ci0KLS8qIFJlcXVpcmUgYW4gQVRONjUgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcG5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0gIGJmZF92bWEgbmFtZV9pbmR4LCB0eXBlX2luZHgsIGF0bl9jb2RlOwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotICBpZiAoYyAhPSBpZWVlX2F0X3JlY29yZF9lbnVtKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICoqcHApOwotICBpZiAoYyAhPSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBVE42NSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbmFtZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGVfaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdG5fY29kZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEp1c3QgaWdub3JlIG5hbWVfaW5keC4gICovCi0KLSAgaWYgKHR5cGVfaW5keCAhPSAwIHx8IGF0bl9jb2RlICE9IDY1KQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJiYWQgQVRONjUgcmVjb3JkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4pOwotfQotDAotLyogQ29udmVydCBhIHJlZ2lzdGVyIG51bWJlciBpbiBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEKLSAgIGdlbmVyaWMgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLQotc3RhdGljIGludAotaWVlZV9yZWdub190b19nZW5yZWcgKGFiZmQsIHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHI7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgLyogRm9yIHNvbWUgcmVhc29ucyBzdGFicyBhZGRzIDIgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAgICAgICBudW1iZXJzLiAgKi8KLSAgICAgIGlmIChyID49IDE2KQotCXIgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgLyogU3RhYnMgdXNlcyAwIHRvIDE1IGZvciByMCB0byByMTUsIDE2IHRvIDMxIGZvciBnMCB0byBnMTUsIGFuZAotICAgICAgICAgMzIgdG8gMzUgZm9yIGZwMCB0byBmcDMuICAqLwotICAgICAgLS1yOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZ2VuZXJpYyByZWdpc3RlciBudW1iZXIgdG8gYW4gSUVFRSBzcGVjaWZpYyBvbmUuICAqLwotCi1zdGF0aWMgaW50Ci1pZWVlX2dlbnJlZ190b19yZWdubyAoYWJmZCwgcikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcjsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gc3RhYnMgYWRkIDIgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAgICAgICBudW1iZXJzLiAgKi8KLSAgICAgIGlmIChyID49IDE4KQotCXIgLT0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgLyogU3RhYnMgdXNlcyAwIHRvIDE1IGZvciByMCB0byByMTUsIDE2IHRvIDMxIGZvciBnMCB0byBnMTUsIGFuZAotICAgICAgICAgMzIgdG8gMzUgZm9yIGZwMCB0byBmcDMuICAqLwotICAgICAgKytyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotDAotLyogVGhlc2Ugcm91dGluZXMgYnVpbGQgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIHRoZSBnZW5lcmljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0vKiBXZSBidWlsZCB0aGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnl0ZSBieSBieXRlLiAgUmF0aGVyIHRoYW4KLSAgIHdhc3RlIHRpbWUgY29weWluZyBkYXRhIGFyb3VuZCwgd2UgdXNlIGEgbGlua2VkIGxpc3Qgb2YgYnVmZmVycyB0bwotICAgaG9sZCB0aGUgZGF0YS4gICovCi0KLSNkZWZpbmUgSUVFRV9CVUZTSVpFICg0OTApCi0KLXN0cnVjdCBpZWVlX2J1ZgotewotICAvKiBOZXh0IGJ1ZmZlci4gICovCi0gIHN0cnVjdCBpZWVlX2J1ZiAqbmV4dDsKLSAgLyogTnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhpcyBidWZmZXIuICAqLwotICB1bnNpZ25lZCBpbnQgYzsKLSAgLyogQnl0ZXMuICAqLwotICBiZmRfYnl0ZSBidWZbSUVFRV9CVUZTSVpFXTsKLX07Ci0KLS8qIEEgbGlzdCBvZiBidWZmZXJzLiAgKi8KLQotc3RydWN0IGllZWVfYnVmbGlzdAotewotICAvKiBIZWFkIG9mIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKmhlYWQ7Ci0gIC8qIFRhaWwtLWxhc3QgYnVmZmVyIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKnRhaWw7Ci19OwotCi0vKiBJbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgQkIxMSBibG9ja3MgcmVxdWlyZWQgYnkgdGhlIEhQIGVtdWxhdG9yLAotICAgd2Uga2VlcCB0cmFjayBvZiByYW5nZXMgb2YgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQgdG8gYSBnaXZlbgotICAgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0cnVjdCBpZWVlX3JhbmdlCi17Ci0gIC8qIE5leHQgcmFuZ2UuICAqLwotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqbmV4dDsKLSAgLyogTG93IGFkZHJlc3MuICAqLwotICBiZmRfdm1hIGxvdzsKLSAgLyogSGlnaCBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBoaWdoOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgY2xhc3Mgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlX2NsYXNzCi17Ci0gIC8qIFRoZSBuYW1lIGluZGV4IGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgLyogVGhlIHBtaXNjIHJlY29yZHMgZm9yIHRoZSBjbGFzcy4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgcG1pc2NidWY7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcG1pc2MgcmVjb3Jkcy4gICovCi0gIHVuc2lnbmVkIGludCBwbWlzY2NvdW50OwotICAvKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgaG9sZGluZyB0aGUgdmlydHVhbCB0YWJsZSwgaWYgbm90IHRoaXMKLSAgICAgY2xhc3MuICAqLwotICBjb25zdCBjaGFyICp2Y2xhc3M7Ci0gIC8qIFdoZXRoZXIgdGhpcyBjbGFzcyBob2xkcyBpdHMgb3duIHZpcnR1YWwgdGFibGUuICAqLwotICBib29sZWFuIG93bnZwdHI7Ci0gIC8qIFRoZSBsYXJnZXN0IHZpcnR1YWwgdGFibGUgb2Zmc2V0IHNlZW4gc28gZmFyLiAgKi8KLSAgYmZkX3ZtYSB2b2Zmc2V0OwotICAvKiBUaGUgY3VycmVudCBtZXRob2QuICAqLwotICBjb25zdCBjaGFyICptZXRob2Q7Ci0gIC8qIEFkZGl0aW9uYWwgcG1pc2MgcmVjb3JkcyB1c2VkIHRvIHJlY29yZCBmaWVsZHMgb2YgcmVmZXJlbmNlIHR5cGUuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHJlZnM7Ci19OwotCi0vKiBUaGlzIGlzIGhvdyB3ZSBzdG9yZSB0eXBlcyBmb3IgdGhlIHdyaXRpbmcgcm91dGluZXMuICBNb3N0IHR5cGVzCi0gICBhcmUgc2ltcGx5IHJlcHJlc2VudGVkIGJ5IGEgdHlwZSBpbmRleC4gICovCi0KLXN0cnVjdCBpZWVlX3dyaXRlX3R5cGUKLXsKLSAgLyogVHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBpbmR4OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdHlwZSwgaWYga25vd24uICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIHR5cGUsIGlmIGFueS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZSwgd2UgYnVpbGQgdGhlIHR5cGUgaGVyZSwgYW5kCi0gICAgIG9ubHkgYWRkIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpZiB3ZSBuZWVkIGl0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmRlZjsKLSAgLyogSWYgdGhpcyBpcyBhIHN0cnVjdCwgdGhpcyBpcyB3aGVyZSB0aGUgc3RydWN0IGRlZmluaXRpb24gaXMKLSAgICAgYnVpbHQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHN0cmRlZjsKLSAgLyogSWYgdGhpcyBpcyBhIGNsYXNzLCB0aGlzIGlzIHdoZXJlIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiBpcyBidWlsdC4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKmNsYXNzZGVmOwotICAvKiBXaGV0aGVyIHRoZSB0eXBlIGlzIHVuc2lnbmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHVuc2lnbmVkcCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBpcyBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlZmVyZW5jZXAgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgaXMgaW4gdGhlIGxvY2FsIHR5cGUgYmxvY2suICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxwIDogMTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGEgZHVwbGljYXRlIHN0cnVjdCBkZWZpbml0aW9uIHdoaWNoIHdlIGFyZQotICAgICBpZ25vcmluZy4gICovCi0gIHVuc2lnbmVkIGludCBpZ25vcmVwIDogMTsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIHR5cGUgc3RhY2sgdXNlZCBieSB0aGUgZGVidWcgd3JpdGluZyByb3V0aW5lcy4gIEZJWE1FOgotICAgV2UgY291bGQgZ2VuZXJhdGUgbW9yZSBlZmZpY2llbnQgb3V0cHV0IGlmIHdlIHJlbWVtYmVyZWQgd2hlbiB3ZQotICAgaGF2ZSBvdXRwdXQgYSBwYXJ0aWN1bGFyIHR5cGUgYmVmb3JlLiAgKi8KLQotc3RydWN0IGllZWVfdHlwZV9zdGFjawotewotICAvKiBOZXh0IGVudHJ5IG9uIHN0YWNrLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqbmV4dDsKLSAgLyogVHlwZSBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLX07Ci0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGEgbmFtZSBhbmQgc29tZSB0eXBlcy4KLSAgIFRoZXNlIGFyZSB1c2VkIGZvciB0eXBlZGVmcyBhbmQgdGFncy4gICovCi0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZQotewotICAvKiBOZXh0IHR5cGUgZm9yIHRoaXMgbmFtZS4gICovCi0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbmV4dDsKLSAgLyogSUQgbnVtYmVyLiAgRm9yIGEgdHlwZWRlZiwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIHR5cGUgdG8gd2hpY2gKLSAgICAgdGhpcyBuYW1lIGlzIHR5cGVkZWZlZC4gICovCi0gIHVuc2lnbmVkIGludCBpZDsKLSAgLyogVHlwZS4gICovCi0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLSAgLyogSWYgdGhpcyBpcyBhIHRhZyB3aGljaCBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQsIHRoaXMgaXMgdGhlCi0gICAgIGtpbmQuICBJZiB0aGUgdGFnIGhhcyBiZWVuIGRlZmluZWQsIHRoaXMgaXMgREVCVUdfS0lORF9JTExFR0FMLiAgKi8KLSAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLX07Ci0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gYXNzb2NpYXRlIG5hbWVzIGFuZCB0eXBlcy4gICovCi0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEluZm9ybWF0aW9uIGZvciB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKnR5cGVzOwotfTsKLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgZW51bXMuICAqLwotCi1zdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0KLXsKLSAgLyogTmV4dCBlbnVtLiAgKi8KLSAgc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICpuZXh0OwotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIFdoZXRoZXIgdGhpcyBlbnVtIGhhcyBiZWVuIGRlZmluZWQuICAqLwotICBib29sZWFuIGRlZmluZWQ7Ci0gIC8qIFRhZy4gICovCi0gIGNvbnN0IGNoYXIgKnRhZzsKLSAgLyogTmFtZXMuICAqLwotICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gIC8qIFZhbHVlcy4gICovCi0gIGJmZF9zaWduZWRfdm1hICp2YWxzOwotfTsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdHlwZXMsIHNvIHRoYXQgd2UgZG9uJ3QKLSAgIG91dHB1dCB0aGVtIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQotc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZQotewotICAvKiBQb2ludGVyIHRvIHRoaXMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBwb2ludGVyOwotICAvKiBGdW5jdGlvbiB3aXRoIHVua25vd24gYXJndW1lbnRzIHJldHVybmluZyB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgZnVuY3Rpb247Ci0gIC8qIENvbnN0IHZlcnNpb24gb2YgdGhpcyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbnN0X3F1YWxpZmllZDsKLSAgLyogVm9sYXRpbGUgdmVyc2lvbiBvZiB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdm9sYXRpbGVfcXVhbGlmaWVkOwotICAvKiBMaXN0IG9mIGFycmF5cyBvZiB0aGlzIHR5cGUgb2YgdmFyaW91cyBib3VuZHMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICphcnJheXM7Ci19OwotCi0vKiBBIGxpc3Qgb2YgYXJyYXlzIGJvdW5kcy4gICovCi0KLXN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUKLXsKLSAgLyogTmV4dCBhcnJheSBib3VuZHMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICpuZXh0OwotICAvKiBUeXBlIGluZGV4IHdpdGggdGhlc2UgYm91bmRzLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIExvdyBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGxvdzsKLSAgLyogSGlnaCBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci19OwotCi0vKiBUaGlzIGlzIGEgbGlzdCBvZiBwZW5kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlciBpbmZvcm1hdGlvbi4gIFdlIGRvbid0Ci0gICBvdXRwdXQgdGhlbSB1bnRpbCB3ZSBzZWUgdGhlIGZpcnN0IGJsb2NrLiAgKi8KLQotc3RydWN0IGllZWVfcGVuZGluZ19wYXJtCi17Ci0gIC8qIE5leHQgcGVuZGluZyBwYXJhbWV0ZXIuICAqLwotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm5leHQ7Ci0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIC8qIFdoZXRoZXIgdGhlIHR5cGUgaXMgYSByZWZlcmVuY2UuICAqLwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIC8qIEtpbmQuICAqLwotICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAvKiBWYWx1ZS4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogVGhpcyBpcyB0aGUgaGFuZGxlIHBhc3NlZCBkb3duIGJ5IGRlYnVnX3dyaXRlLiAgKi8KLQotc3RydWN0IGllZWVfaGFuZGxlCi17Ci0gIC8qIEJGRCB3ZSBhcmUgd3JpdGluZyB0by4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogV2hldGhlciB3ZSBnb3QgYW4gZXJyb3IgaW4gYSBzdWJyb3V0aW5lIGNhbGxlZCB2aWEgdHJhdmVyc2Ugb3IKLSAgICAgbWFwX292ZXJfc2VjdGlvbnMuICAqLwotICBib29sZWFuIGVycm9yOwotICAvKiBDdXJyZW50IGRhdGEgYnVmZmVyIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpjdXJyZW50OwotICAvKiBDdXJyZW50IGRhdGEgYnVmZmVyLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmICpjdXJidWY7Ci0gIC8qIEZpbGVuYW1lIG9mIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBNb2R1bGUgbmFtZSBvZiBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBjb25zdCBjaGFyICptb2RuYW1lOwotICAvKiBMaXN0IG9mIGJ1ZmZlciBmb3IgZ2xvYmFsIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBnbG9iYWxfdHlwZXM7Ci0gIC8qIExpc3Qgb2YgZmluaXNoZWQgZGF0YSBidWZmZXJzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBkYXRhOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHR5cGVkZWZzIGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHR5cGVzOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBjdXJyZW50Ci0gICAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHZhcnM7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgQysrIGNsYXNzIGRlZmluaXRpb25zIGluIHRoZSBjdXJyZW50Ci0gICAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGN4eDsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciBsaW5lIG51bWJlcnMgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgbGluZW5vczsKLSAgLyogUmFuZ2VzIGZvciB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKnJhbmdlczsKLSAgLyogUmFuZ2VzIGZvciBhbGwgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKmdsb2JhbF9yYW5nZXM7Ci0gIC8qIE5lc3RlZCBwZW5kaW5nIHJhbmdlcy4gICovCi0gIHN0cnVjdCBpZWVlX3JhbmdlICpwZW5kaW5nX3JhbmdlczsKLSAgLyogVHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKnR5cGVfc3RhY2s7Ci0gIC8qIE5leHQgdW5hbGxvY2F0ZWQgdHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIC8qIE5leHQgdW5hbGxvY2F0ZWQgbmFtZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIC8qIFR5cGVkZWZzLiAgKi8KLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfdGFibGUgdHlwZWRlZnM7Ci0gIC8qIFRhZ3MuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF90YWJsZSB0YWdzOwotICAvKiBFbnVtcy4gICovCi0gIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqZW51bXM7Ci0gIC8qIE1vZGlmaWVkIHZlcnNpb25zIG9mIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbW9kaWZpZWQ7Ci0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBpbiBtb2RpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCBtb2RpZmllZF9hbGxvYzsKLSAgLyogNCBieXRlIGNvbXBsZXggdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBjb21wbGV4X2Zsb2F0X2luZGV4OwotICAvKiA4IGJ5dGUgY29tcGxleCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbXBsZXhfZG91YmxlX2luZGV4OwotICAvKiBUaGUgZGVwdGggb2YgYmxvY2sgbmVzdGluZy4gIFRoaXMgaXMgMCBvdXRzaWRlIGEgZnVuY3Rpb24sIGFuZCAxCi0gICAgIGp1c3QgYWZ0ZXIgc3RhcnRfZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGJsb2NrX2RlcHRoOwotICAvKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmZubmFtZTsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gd2UgYXJlIGN1cnJlbnRseQotICAgICB3cml0aW5nIG91dC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZm50eXBlOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbiB3ZSBhcmUKLSAgICAgY3VycmVudGx5IHdyaXRpbmcgb3V0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmFyZ3M7Ci0gIC8qIE51bWJlciBvZiBhcmd1bWVudHMgd3JpdHRlbiB0byBmbmFyZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgZm5hcmdjb3VudDsKLSAgLyogUGVuZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICpwZW5kaW5nX3Bhcm1zOwotICAvKiBDdXJyZW50IGxpbmUgbnVtYmVyIGZpbGVuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbGluZW5vX2ZpbGVuYW1lOwotICAvKiBMaW5lIG51bWJlciBuYW1lIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGxpbmVub19uYW1lX2luZHg7Ci0gIC8qIEZpbGVuYW1lIG9mIHBlbmRpbmcgbGluZSBudW1iZXIuICAqLwotICBjb25zdCBjaGFyICpwZW5kaW5nX2xpbmVub19maWxlbmFtZTsKLSAgLyogUGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgcGVuZGluZ19saW5lbm87Ci0gIC8qIEFkZHJlc3Mgb2YgcGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIGJmZF92bWEgcGVuZGluZ19saW5lbm9fYWRkcjsKLSAgLyogSGlnaGVzdCBhZGRyZXNzIHNlZW4gYXQgZW5kIG9mIHByb2NlZHVyZS4gICovCi0gIGJmZF92bWEgaGlnaGFkZHI7Ci19OwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX2luaXRfYnVmZmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2hhbmdlX2J1ZmZlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgc3RydWN0IGllZWVfYnVmbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FwcGVuZF9idWZmZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKiwKLQkgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhbF93cml0ZV9ieXRlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfMmJ5dGVzIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfbnVtYmVyIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2lkIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYXNuCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYXRuNjUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3B1c2hfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3BvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBpZWVlX3BvcF91bnVzZWRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3BvcF90eXBlX3VzZWQKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYWRkX3JhbmdlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBib29sZWFuLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3JhbmdlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9yYW5nZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9kZWZpbmVfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2RlZmluZV9uYW1lZF90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOwotc3RhdGljIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKmllZWVfZ2V0X21vZGlmaWVkX2luZm8KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV91bmRlZmluZWRfdGFnCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHZvaWQgaWVlZV9hZGRfYmIxMV9ibG9ja3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9hZGRfYmIxMQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3Zpc190b19mbGFncyBQQVJBTVMgKChlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfbWV0aG9kX3ZhcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZvaWRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jb21wbGV4X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9wb2ludGVyX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JhbmdlX3R5cGUgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfb2Zmc2V0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZvbGF0aWxlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfc3RydWN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2NsYXNzX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGVkZWZfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90YWdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdGFnIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGVkX2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Z1bmN0aW9uX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2Z1bmN0aW9uIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9saW5lbm8KLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgaWVlZV9mbnMgPQotewotICBpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQsCi0gIGllZWVfc3RhcnRfc291cmNlLAotICBpZWVlX2VtcHR5X3R5cGUsCi0gIGllZWVfdm9pZF90eXBlLAotICBpZWVlX2ludF90eXBlLAotICBpZWVlX2Zsb2F0X3R5cGUsCi0gIGllZWVfY29tcGxleF90eXBlLAotICBpZWVlX2Jvb2xfdHlwZSwKLSAgaWVlZV9lbnVtX3R5cGUsCi0gIGllZWVfcG9pbnRlcl90eXBlLAotICBpZWVlX2Z1bmN0aW9uX3R5cGUsCi0gIGllZWVfcmVmZXJlbmNlX3R5cGUsCi0gIGllZWVfcmFuZ2VfdHlwZSwKLSAgaWVlZV9hcnJheV90eXBlLAotICBpZWVlX3NldF90eXBlLAotICBpZWVlX29mZnNldF90eXBlLAotICBpZWVlX21ldGhvZF90eXBlLAotICBpZWVlX2NvbnN0X3R5cGUsCi0gIGllZWVfdm9sYXRpbGVfdHlwZSwKLSAgaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSwKLSAgaWVlZV9zdHJ1Y3RfZmllbGQsCi0gIGllZWVfZW5kX3N0cnVjdF90eXBlLAotICBpZWVlX3N0YXJ0X2NsYXNzX3R5cGUsCi0gIGllZWVfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgaWVlZV9jbGFzc19iYXNlY2xhc3MsCi0gIGllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kLAotICBpZWVlX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBpZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwKLSAgaWVlZV9jbGFzc19lbmRfbWV0aG9kLAotICBpZWVlX2VuZF9jbGFzc190eXBlLAotICBpZWVlX3R5cGVkZWZfdHlwZSwKLSAgaWVlZV90YWdfdHlwZSwKLSAgaWVlZV90eXBkZWYsCi0gIGllZWVfdGFnLAotICBpZWVlX2ludF9jb25zdGFudCwKLSAgaWVlZV9mbG9hdF9jb25zdGFudCwKLSAgaWVlZV90eXBlZF9jb25zdGFudCwKLSAgaWVlZV92YXJpYWJsZSwKLSAgaWVlZV9zdGFydF9mdW5jdGlvbiwKLSAgaWVlZV9mdW5jdGlvbl9wYXJhbWV0ZXIsCi0gIGllZWVfc3RhcnRfYmxvY2ssCi0gIGllZWVfZW5kX2Jsb2NrLAotICBpZWVlX2VuZF9mdW5jdGlvbiwKLSAgaWVlZV9saW5lbm8KLX07Ci0KLS8qIEluaXRpYWxpemUgYSBidWZmZXIgdG8gYmUgZW1wdHkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX2luaXRfYnVmZmVyIChpbmZvLCBidWZsaXN0KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmJ1Zmxpc3Q7Ci17Ci0gIGJ1Zmxpc3QtPmhlYWQgPSBOVUxMOwotICBidWZsaXN0LT50YWlsID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGEgYnVmZmVyIGxpc3QgaGFzIGFueSBkYXRhLiAgKi8KLQotI2RlZmluZSBpZWVlX2J1ZmZlcl9lbXB0eXAoYnVmbGlzdCkgKChidWZsaXN0KS0+aGVhZCA9PSBOVUxMKQotCi0vKiBDaGFuZ2UgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIGEgc3BlY2lmaWVkIGJ1ZmZlciBjaGFpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sIGJ1Zmxpc3QpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLXsKLSAgaWYgKGJ1Zmxpc3QtPmhlYWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9idWYgKmJ1ZjsKLQotICAgICAgYnVmID0gKHN0cnVjdCBpZWVlX2J1ZiAqKSB4bWFsbG9jIChzaXplb2YgKmJ1Zik7Ci0gICAgICBidWYtPm5leHQgPSBOVUxMOwotICAgICAgYnVmLT5jID0gMDsKLSAgICAgIGJ1Zmxpc3QtPmhlYWQgPSBidWY7Ci0gICAgICBidWZsaXN0LT50YWlsID0gYnVmOwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50ID0gYnVmbGlzdDsKLSAgaW5mby0+Y3VyYnVmID0gYnVmbGlzdC0+dGFpbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXBwZW5kIGEgYnVmZmVyIGNoYWluLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCBtYWluYnVmLCBuZXdidWYpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqbWFpbmJ1ZjsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqbmV3YnVmOwotewotICBpZiAobmV3YnVmLT5oZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG1haW5idWYtPmhlYWQgPT0gTlVMTCkKLQltYWluYnVmLT5oZWFkID0gbmV3YnVmLT5oZWFkOwotICAgICAgZWxzZQotCW1haW5idWYtPnRhaWwtPm5leHQgPSBuZXdidWYtPmhlYWQ7Ci0gICAgICBtYWluYnVmLT50YWlsID0gbmV3YnVmLT50YWlsOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgYnl0ZSBpbnRvIHRoZSBidWZmZXIuICBXZSB1c2UgYSBtYWNybyBmb3Igc3BlZWQgYW5kIGEKLSAgIGZ1bmN0aW9uIGZvciB0aGUgY29tcGxleCBjYXNlcy4gICovCi0KLSNkZWZpbmUgaWVlZV93cml0ZV9ieXRlKGluZm8sIGIpCQkJCVwKLSAgKChpbmZvKS0+Y3VyYnVmLT5jIDwgSUVFRV9CVUZTSVpFCQkJCVwKLSAgID8gKChpbmZvKS0+Y3VyYnVmLT5idWZbKGluZm8pLT5jdXJidWYtPmMrK10gPSAoYiksIHRydWUpCVwKLSAgIDogaWVlZV9yZWFsX3dyaXRlX2J5dGUgKChpbmZvKSwgKGIpKSkKLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhbF93cml0ZV9ieXRlIChpbmZvLCBiKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCBiOwotewotICBpZiAoaW5mby0+Y3VyYnVmLT5jID49IElFRUVfQlVGU0laRSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9idWYgKm47Ci0KLSAgICAgIG4gPSAoc3RydWN0IGllZWVfYnVmICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIG4tPmMgPSAwOwotICAgICAgaWYgKGluZm8tPmN1cnJlbnQtPmhlYWQgPT0gTlVMTCkKLQlpbmZvLT5jdXJyZW50LT5oZWFkID0gbjsKLSAgICAgIGVsc2UKLQlpbmZvLT5jdXJyZW50LT50YWlsLT5uZXh0ID0gbjsKLSAgICAgIGluZm8tPmN1cnJlbnQtPnRhaWwgPSBuOwotICAgICAgaW5mby0+Y3VyYnVmID0gbjsKLSAgICB9Ci0KLSAgaW5mby0+Y3VyYnVmLT5idWZbaW5mby0+Y3VyYnVmLT5jXSA9IGI7Ci0gICsraW5mby0+Y3VyYnVmLT5jOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdHdvIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCBpKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCBpOwotewotICByZXR1cm4gKGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgaSA+PiA4KQotCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBpICYgMHhmZikpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gaW50ZWdlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX251bWJlciAoaW5mbywgdikKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBiZmRfdm1hIHY7Ci17Ci0gIGJmZF92bWEgdDsKLSAgYmZkX2J5dGUgYWJbMjBdOwotICBiZmRfYnl0ZSAqcDsKLSAgdW5zaWduZWQgaW50IGM7Ci0KLSAgaWYgKHYgPD0gKGJmZF92bWEpIGllZWVfbnVtYmVyX2VuZF9lbnVtKQotICAgIHJldHVybiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIHYpOwotCi0gIHQgPSB2OwotICBwID0gYWIgKyBzaXplb2YgYWI7Ci0gIHdoaWxlICh0ICE9IDApCi0gICAgewotICAgICAgKi0tcCA9IHQgJiAweGZmOwotICAgICAgdCA+Pj0gODsKLSAgICB9Ci0gIGMgPSAoYWIgKyAyMCkgLSBwOwotCi0gIGlmIChjID4gKHVuc2lnbmVkIGludCkgKGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bQotCQkJICAtIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgbnVtZXJpYyBvdmVyZmxvdzogMHgiKSk7Ci0gICAgICBmcHJpbnRmX3ZtYSAoc3RkZXJyLCB2KTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gKyBjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoOyBjID4gMDsgLS1jLCArK3ApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAqcCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaWQgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBsZW4gPSBzdHJsZW4gKHMpOwotICBpZiAobGVuIDw9IDB4N2YpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA8PSAweGZmKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA8PSAweGZmZmYpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMl9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgbGVuKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHN0cmluZyBsZW5ndGggb3ZlcmZsb3c6ICV1XG4iKSwgbGVuKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yICg7ICpzICE9ICdcMCc7IHMrKykKLSAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sICpzKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEFTTiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9hc24gKGluZm8sIGluZHgsIHZhbCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHJldHVybiAoaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXNuX3JlY29yZF9lbnVtKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdmFsKSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBBVE42NSByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9hdG42NSAoaW5mbywgaW5keCwgcykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgcmV0dXJuIChpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDY1KQotCSAgJiYgaWVlZV93cml0ZV9pZCAoaW5mbywgcykpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBpbmRleCBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcHVzaF90eXBlIChpbmZvLCBpbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLXsKLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqdHM7Ci0KLSAgdHMgPSAoc3RydWN0IGllZWVfdHlwZV9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKnRzKTsKLSAgbWVtc2V0ICh0cywgMCwgc2l6ZW9mICp0cyk7Ci0KLSAgdHMtPnR5cGUuaW5keCA9IGluZHg7Ci0gIHRzLT50eXBlLnNpemUgPSBzaXplOwotICB0cy0+dHlwZS51bnNpZ25lZHAgPSB1bnNpZ25lZHA7Ci0gIHRzLT50eXBlLmxvY2FscCA9IGxvY2FscDsKLQotICB0cy0+bmV4dCA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGluZm8tPnR5cGVfc3RhY2sgPSB0czsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUG9wIGEgdHlwZSBpbmRleCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pZWVlX3BvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci17Ci0gIHJldHVybiBpZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIHRydWUpOwotfQotCi0vKiBQb3AgYW4gdW51c2VkIHR5cGUgaW5kZXggb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci17Ci0gICh2b2lkKSBpZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIGZhbHNlKTsKLX0KLQotLyogUG9wIGEgdXNlZCBvciB1bnVzZWQgdHlwZSBpbmRleCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIHVzZWQpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYm9vbGVhbiB1c2VkOwotewotICBzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICp0czsKLSAgdW5zaWduZWQgaW50IHJldDsKLQotICB0cyA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGFzc2VydCAodHMgIT0gTlVMTCk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIHR5cGUsIGFuZCB3ZSBuZWVkIGl0LCB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUKLSAgICAgYWN0dWFsIGRlZmluaXRpb24gdG8gdGhlIHR5cGVkZWYgYmxvY2sgbm93LiAgKi8KLSAgaWYgKHVzZWQgJiYgISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZ0cy0+dHlwZS5mbmRlZikpCi0gICAgewotICAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLQotICAgICAgaWYgKHRzLT50eXBlLmxvY2FscCkKLQl7Ci0JICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBzdGFydGVkIHRoZSB0eXBlcyBibG9jay4gICovCi0JICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0JCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJ1Zmxpc3QgPSAmaW5mby0+dHlwZXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE1ha2Ugc3VyZSB3ZSBzdGFydGVkIHRoZSBnbG9iYWwgdHlwZSBibG9jay4gICovCi0JICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKLQkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJ1Zmxpc3QgPSAmaW5mby0+Z2xvYmFsX3R5cGVzOwotCX0KLQotICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCBidWZsaXN0LCAmdHMtPnR5cGUuZm5kZWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0ID0gdHMtPnR5cGUuaW5keDsKLSAgaW5mby0+dHlwZV9zdGFjayA9IHRzLT5uZXh0OwotICBmcmVlICh0cyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFkZCBhIHJhbmdlIG9mIGJ5dGVzIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGdsb2JhbCwgbG93LCBoaWdoKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICBiZmRfdm1hIGxvdzsKLSAgICAgYmZkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqKnBsaXN0LCAqciwgKipwcjsKLQotICBpZiAobG93ID09IChiZmRfdm1hKSAtMSB8fCBoaWdoID09IChiZmRfdm1hKSAtMSB8fCBsb3cgPT0gaGlnaCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoZ2xvYmFsKQotICAgIHBsaXN0ID0gJmluZm8tPmdsb2JhbF9yYW5nZXM7Ci0gIGVsc2UKLSAgICBwbGlzdCA9ICZpbmZvLT5yYW5nZXM7Ci0KLSAgZm9yIChyID0gKnBsaXN0OyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChoaWdoID49IHItPmxvdyAmJiBsb3cgPD0gci0+aGlnaCkKLQl7Ci0JICAvKiBUaGUgbmV3IHJhbmdlIG92ZXJsYXBzIHIuICAqLwotCSAgaWYgKGxvdyA8IHItPmxvdykKLQkgICAgci0+bG93ID0gbG93OwotCSAgaWYgKGhpZ2ggPiByLT5oaWdoKQotCSAgICByLT5oaWdoID0gaGlnaDsKLQkgIHByID0gJnItPm5leHQ7Ci0JICB3aGlsZSAoKnByICE9IE5VTEwgJiYgKCpwciktPmxvdyA8PSByLT5oaWdoKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGllZWVfcmFuZ2UgKm47Ci0KLQkgICAgICBpZiAoKCpwciktPmhpZ2ggPiByLT5oaWdoKQotCQlyLT5oaWdoID0gKCpwciktPmhpZ2g7Ci0JICAgICAgbiA9ICgqcHIpLT5uZXh0OwotCSAgICAgIGZyZWUgKCpwcik7Ci0JICAgICAgKnByID0gbjsKLQkgICAgfQotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICByID0gKHN0cnVjdCBpZWVlX3JhbmdlICopIHhtYWxsb2MgKHNpemVvZiAqcik7Ci0gIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKLQotICByLT5sb3cgPSBsb3c7Ci0gIHItPmhpZ2ggPSBoaWdoOwotCi0gIC8qIFN0b3JlIHRoZSByYW5nZXMgc29ydGVkIGJ5IGFkZHJlc3MuICAqLwotICBmb3IgKHByID0gcGxpc3Q7ICpwciAhPSBOVUxMOyBwciA9ICYoKnByKS0+bmV4dCkKLSAgICBpZiAoKCpwciktPmxvdyA+IGhpZ2gpCi0gICAgICBicmVhazsKLSAgci0+bmV4dCA9ICpwcjsKLSAgKnByID0gcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBuZXcgcmFuZ2UgZm9yIHdoaWNoIHdlIG9ubHkgaGF2ZSB0aGUgbG93IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9yYW5nZSAoaW5mbywgbG93KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJmZF92bWEgbG93OwotewotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcjsKLQotICByID0gKHN0cnVjdCBpZWVlX3JhbmdlICopIHhtYWxsb2MgKHNpemVvZiAqcik7Ci0gIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKLSAgci0+bG93ID0gbG93OwotICByLT5uZXh0ID0gaW5mby0+cGVuZGluZ19yYW5nZXM7Ci0gIGluZm8tPnBlbmRpbmdfcmFuZ2VzID0gcjsKLSAgcmV0dXJuIHRydWU7Ci19ICAKLQotLyogRmluaXNoIGEgcmFuZ2Ugc3RhcnRlZCBieSBpZWVlX3N0YXJ0X3JhbmdlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX3JhbmdlIChpbmZvLCBoaWdoKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJmZF92bWEgaGlnaDsKLXsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKnI7Ci0gIGJmZF92bWEgbG93OwotCi0gIGFzc2VydCAoaW5mby0+cGVuZGluZ19yYW5nZXMgIT0gTlVMTCk7Ci0gIHIgPSBpbmZvLT5wZW5kaW5nX3JhbmdlczsKLSAgbG93ID0gci0+bG93OwotICBpbmZvLT5wZW5kaW5nX3JhbmdlcyA9IHItPm5leHQ7Ci0gIGZyZWUgKHIpOwotICByZXR1cm4gaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCBsb3csIGhpZ2gpOwotfQotCi0vKiBTdGFydCBkZWZpbmluZyBhIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLXsKLSAgcmV0dXJuIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICh1bnNpZ25lZCBpbnQpIC0xLCBzaXplLCB1bnNpZ25lZHAsCi0JCQkJIGxvY2FscCwgKHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikgTlVMTCk7Ci19Ci0KLS8qIFN0YXJ0IGRlZmluaW5nIGEgbmFtZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCBpbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCwgYnVmbGlzdCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLXsKLSAgdW5zaWduZWQgaW50IHR5cGVfaW5keDsKLSAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKLQotICBpZiAoaW5keCAhPSAodW5zaWduZWQgaW50KSAtMSkKLSAgICB0eXBlX2luZHggPSBpbmR4OwotICBlbHNlCi0gICAgewotICAgICAgdHlwZV9pbmR4ID0gaW5mby0+dHlwZV9pbmR4OwotICAgICAgKytpbmZvLT50eXBlX2luZHg7Ci0gICAgfQotCi0gIG5hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0KLSAgLyogSWYgd2Ugd2VyZSBnaXZlbiBhIGJ1ZmZlciwgdXNlIGl0OyBvdGhlcndpc2UsIHVzZSBlaXRoZXIgdGhlCi0gICAgIGxvY2FsIG9yIHRoZSBnbG9iYWwgdHlwZSBpbmZvcm1hdGlvbiwgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSB0eXBlCi0gICAgIGJsb2NrIGlzIHN0YXJ0ZWQuICAqLwotICBpZiAoYnVmbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgYnVmbGlzdCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAobG9jYWxwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogUHVzaCB0aGUgbmV3IHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIHdyaXRlIG91dCBhbiBOTiByZWNvcmQsIGFuZAotICAgICB3cml0ZSBvdXQgdGhlIHN0YXJ0IG9mIGEgVFkgcmVjb3JkLiAgVGhlIGNhbGxlciB3aWxsIHRoZW4gZmluaXNoCi0gICAgIHRoZSBUWSByZWNvcmQuICAqLwotICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgdHlwZV9pbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiAoaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCi0JICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX3R5X3JlY29yZF9lbnVtKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHR5cGVfaW5keCkKLQkgICYmIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMHhjZSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpKTsKLX0KLQotLyogR2V0IGFuIGVudHJ5IHRvIHRoZSBsaXN0IG9mIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgdHlwZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICoKLWllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGluZHgpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci17Ci0gIGlmIChpbmR4ID49IGluZm8tPm1vZGlmaWVkX2FsbG9jKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuYWxsb2M7Ci0KLSAgICAgIG5hbGxvYyA9IGluZm8tPm1vZGlmaWVkX2FsbG9jOwotICAgICAgaWYgKG5hbGxvYyA9PSAwKQotCW5hbGxvYyA9IDE2OwotICAgICAgd2hpbGUgKGluZHggPj0gbmFsbG9jKQotCW5hbGxvYyAqPSAyOwotICAgICAgaW5mby0+bW9kaWZpZWQgPSAoKHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKikKLQkJCXhyZWFsbG9jIChpbmZvLT5tb2RpZmllZCwKLQkJCQkgIG5hbGxvYyAqIHNpemVvZiAqaW5mby0+bW9kaWZpZWQpKTsKLSAgICAgIG1lbXNldCAoaW5mby0+bW9kaWZpZWQgKyBpbmZvLT5tb2RpZmllZF9hbGxvYywgMCwKLQkgICAgICAobmFsbG9jIC0gaW5mby0+bW9kaWZpZWRfYWxsb2MpICogc2l6ZW9mICppbmZvLT5tb2RpZmllZCk7Ci0gICAgICBpbmZvLT5tb2RpZmllZF9hbGxvYyA9IG5hbGxvYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGluZm8tPm1vZGlmaWVkICsgaW5keDsKLX0KLQwKLS8qIFJvdXRpbmVzIGZvciB0aGUgaGFzaCB0YWJsZSBtYXBwaW5nIG5hbWVzIHRvIHR5cGVzLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mICpyZXQpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50eXBlcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBUcmF2ZXJzZSB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgaWVlZV9uYW1lX3R5cGVfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfaGFzaF90cmF2ZXJzZQkJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotDAotLyogVGhlIGdlbmVyYWwgcm91dGluZSB0byB3cml0ZSBvdXQgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi13cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgaW5mbzsKLSAgYXNlY3Rpb24gKnM7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgc3RydWN0IGllZWVfYnVmICpiOwotCi0gIG1lbXNldCAoJmluZm8sIDAsIHNpemVvZiBpbmZvKTsKLSAgaW5mby5hYmZkID0gYWJmZDsKLSAgaW5mby50eXBlX2luZHggPSAyNTY7Ci0gIGluZm8ubmFtZV9pbmR4ID0gMzI7Ci0KLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8udHlwZWRlZnMucm9vdCwgaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYykKLSAgICAgIHx8ICEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8udGFncy5yb290LCBpZWVlX25hbWVfdHlwZV9uZXdmdW5jKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmdsb2JhbF90eXBlcykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmRhdGEpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby50eXBlcykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLnZhcnMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5jeHgpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5saW5lbm9zKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZm50eXBlKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGUgKGRoYW5kbGUsICZpZWVlX2ZucywgKFBUUikgJmluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby5maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQgKCZpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFB1dCBhbnkgdW5kZWZpbmVkIHRhZ3MgaW4gdGhlIGdsb2JhbCB0eXBlZGVmIGluZm9ybWF0aW9uLiAgKi8KLSAgaW5mby5lcnJvciA9IGZhbHNlOwotICBpZWVlX25hbWVfdHlwZV9oYXNoX3RyYXZlcnNlICgmaW5mby50YWdzLAotCQkJCWllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZywKLQkJCQkoUFRSKSAmaW5mbyk7Ci0gIGlmIChpbmZvLmVycm9yKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQcmVwZW5kIHRoZSBnbG9iYWwgdHlwZWRlZiBpbmZvcm1hdGlvbiB0byB0aGUgb3RoZXIgZGF0YS4gICovCi0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8uZ2xvYmFsX3R5cGVzKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgSFAgZGVidWdnZXIgc2VlbXMgdG8gaGF2ZSBhIGJ1ZyBpbiB3aGljaCBpdCBpZ25vcmVzIHRoZQotICAgICAgICAgbGFzdCBlbnRyeSBpbiB0aGUgZ2xvYmFsIHR5cGVzLCBzbyB3ZSBhZGQgYSBkdW1teSBlbnRyeS4gICovCi0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKCZpbmZvLCAmaW5mby5nbG9iYWxfdHlwZXMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sIGluZm8ubmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkICgmaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfdHlfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgaW5mby50eXBlX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIDB4Y2UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgaW5mby5uYW1lX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgJ1AnKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sIChpbnQpIGJ1aWx0aW5fdm9pZCArIDMyKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKCZpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoJmluZm8sICZpbmZvLmdsb2JhbF90eXBlcywgJmluZm8uZGF0YSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby5kYXRhID0gaW5mby5nbG9iYWxfdHlwZXM7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgZGVjbGFyZSBCQjExIGJsb2NrcyBmb3IgZWFjaCByYW5nZSBpbiB0aGUKLSAgICAgZmlsZS4gIFRoZXkgYXJlIGFkZGVkIHRvIGluZm8tPnZhcnMuICAqLwotICBpbmZvLmVycm9yID0gZmFsc2U7Ci0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby52YXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgaWVlZV9hZGRfYmIxMV9ibG9ja3MsIChQVFIpICZpbmZvKTsKLSAgaWYgKGluZm8uZXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLnZhcnMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoJmluZm8sICZpbmZvLnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyICgmaW5mbywgJmluZm8uZGF0YSwgJmluZm8udmFycykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOb3cgYWxsIHRoZSBkYXRhIGlzIGluIGluZm8uZGF0YS4gIFdyaXRlIGl0IG91dCB0byB0aGUgQkZELiAgV2UKLSAgICAgbm9ybWFsbHkgd291bGQgbmVlZCB0byB3b3JyeSBhYm91dCB3aGV0aGVyIGFsbCB0aGUgb3RoZXIgc2VjdGlvbnMKLSAgICAgYXJlIHNldCB1cCB5ZXQsIGJ1dCB0aGUgSUVFRSBiYWNrZW5kIHdpbGwgaGFuZGxlIHRoaXMgcGFydGljdWxhcgotICAgICBjYXNlIGNvcnJlY3RseSByZWdhcmRsZXNzLiAgKi8KLSAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8uZGF0YSkpCi0gICAgewotICAgICAgLyogVGhlcmUgaXMgbm8gZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZXJyID0gTlVMTDsKLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGVidWciKTsKLSAgaWYgKHMgPT0gTlVMTCkKLSAgICBlcnIgPSAiYmZkX21ha2Vfc2VjdGlvbiI7Ci0gIGlmIChlcnIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIFNFQ19ERUJVR0dJTkcgfCBTRUNfSEFTX0NPTlRFTlRTKSkKLQllcnIgPSAiYmZkX3NldF9zZWN0aW9uX2ZsYWdzIjsKLSAgICB9Ci0gIGlmIChlcnIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIHNpemUgPSAwOwotICAgICAgZm9yIChiID0gaW5mby5kYXRhLmhlYWQ7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0Jc2l6ZSArPSBiLT5jOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHMsIHNpemUpKQotCWVyciA9ICJiZmRfc2V0X3NlY3Rpb25fc2l6ZSI7Ci0gICAgfQotICBpZiAoZXJyID09IE5VTEwpCi0gICAgewotICAgICAgZmlsZV9wdHIgb2Zmc2V0OwotCi0gICAgICBvZmZzZXQgPSAwOwotICAgICAgZm9yIChiID0gaW5mby5kYXRhLmhlYWQ7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBiLT5idWYsIG9mZnNldCwgYi0+YykpCi0JICAgIHsKLQkgICAgICBlcnIgPSAiYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgb2Zmc2V0ICs9IGItPmM7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGVyciwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmaW5mby50eXBlZGVmcy5yb290KTsKLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmluZm8udGFncy5yb290KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZvciBhbiB1bmRlZmluZWQgdGFnLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi0gICBpZWVlX25hbWVfdHlwZV9oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZyAoaCwgcCkKLSAgICAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7Ci0KLSAgZm9yIChudCA9IGgtPnR5cGVzOyBudCAhPSBOVUxMOyBudCA9IG50LT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gICAgICBjaGFyIGNvZGU7Ci0KLSAgICAgIGlmIChudC0+a2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCSAgICB7Ci0JICAgICAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCSAgICB7Ci0JICAgICAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBudC0+dHlwZS5uYW1lKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfdHlfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBudC0+dHlwZS5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDB4Y2UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpKQotCXsKLQkgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAobnQtPmtpbmQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotCWNhc2UgREVCVUdfS0lORF9DTEFTUzoKLQkgIGNvZGUgPSAnUyc7Ci0JICBicmVhazsKLQljYXNlIERFQlVHX0tJTkRfVU5JT046Ci0JY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotCSAgY29kZSA9ICdVJzsKLQkgIGJyZWFrOwotCWNhc2UgREVCVUdfS0lORF9FTlVNOgotCSAgY29kZSA9ICdFJzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBjb2RlKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkpCi0JewotCSAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGluZm9ybWF0aW9uIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGNvbnN0IGNoYXIgKm1vZG5hbWU7Ci0gIGNoYXIgKmMsICpzOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgaWYgKGluZm8tPmZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCAoaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBtb2RuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0gIGlmIChtb2RuYW1lICE9IE5VTEwpCi0gICAgKyttb2RuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgbW9kbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnXFwnKTsKLSAgICAgIGlmIChtb2RuYW1lICE9IE5VTEwpCi0JKyttb2RuYW1lOwotICAgICAgZWxzZQotCW1vZG5hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0gIGMgPSB4c3RyZHVwIChtb2RuYW1lKTsKLSAgcyA9IHN0cnJjaHIgKGMsICcuJyk7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgKnMgPSAnXDAnOwotICBpbmZvLT5tb2RuYW1lID0gYzsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+bGluZW5vcykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT5yYW5nZXMgPSBOVUxMOwotCi0gIC8qIEFsd2F5cyBpbmNsdWRlIGEgQkIxIGFuZCBhIEJCMyBibG9jay4gIFRoYXQgaXMgd2hhdCB0aGUgb3V0cHV0IG9mCi0gICAgIHRoZSBNUkkgbGlua2VyIHNlZW1zIHRvIGxvb2sgbGlrZS4gICovCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKnI7Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Y3h4KSkKLSAgICB7Ci0gICAgICAvKiBBcHBlbmQgYW55IEMrKyBpbmZvcm1hdGlvbiB0byB0aGUgZ2xvYmFsIGZ1bmN0aW9uIGFuZAotICAgICAgICAgdmFyaWFibGUgaW5mb3JtYXRpb24uICAqLwotICAgICAgYXNzZXJ0ICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKTsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV2UgcHV0IHRoZSBwbWlzYyByZWNvcmRzIGluIGEgZHVtbXkgcHJvY2VkdXJlLCBqdXN0IGFzIHRoZQotICAgICAgICAgTVJJIGNvbXBpbGVyIGRvZXMuICAqLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDYpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiX19YUllDUFAiKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5oaWdoYWRkciAtIDEpCi0JICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMsICZpbmZvLT5jeHgpCi0JICB8fCAhIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmhpZ2hhZGRyIC0gMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRm9yY2Ugb3V0IHRoZSBwZW5kaW5nIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGllZWVfbGluZW5vICgoUFRSKSBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAoYmZkX3ZtYSkgLTEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmxpbmVub3MpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmxpbmVub3MpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPmxpbmVub19maWxlbmFtZSkgIT0gMCkKLQl7Ci0JICAvKiBXZSB3ZXJlIG5vdCBpbiB0aGUgbWFpbiBmaWxlLiAgV2UganVzdCBjbG9zZWQgdGhlCi0gICAgICAgICAgICAgaW5jbHVkZWQgbGluZSBudW1iZXIgYmxvY2ssIGFuZCBub3cgd2UgbXVzdCBjbG9zZSB0aGUKLSAgICAgICAgICAgICBtYWluIGxpbmUgbnVtYmVyIGJsb2NrLiAgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmRhdGEsICZpbmZvLT50eXBlcykKLSAgICAgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSwgJmluZm8tPnZhcnMpCi0gICAgICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmRhdGEsICZpbmZvLT5saW5lbm9zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQnVpbGQgQkIxMC9CQjExIGJsb2NrcyBiYXNlZCBvbiB0aGUgcmFuZ2VzIHdlIHJlY29yZGVkLiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIkdOVSBvYmpjb3B5IikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAociA9IGluZm8tPnJhbmdlczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgaW50IGtpbmQ7Ci0KLSAgICAgIGxvdyA9IHItPmxvdzsKLSAgICAgIGhpZ2ggPSByLT5oaWdoOwotCi0gICAgICAvKiBGaW5kIHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByYW5nZS4gICovCi0gICAgICBmb3IgKHMgPSBpbmZvLT5hYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykgPD0gbG93Ci0JICAgICAgJiYgaGlnaCA8PSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykKLQkJCSAgKyBiZmRfc2VjdGlvbl9zaXplIChpbmZvLT5hYmZkLCBzKSkpCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICAvKiBKdXN0IGlnbm9yZSB0aGlzIHJhbmdlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQ29hbGVzY2UgcmFuZ2VzIGlmIGl0IHNlZW1zIHJlYXNvbmFibGUuICAqLwotICAgICAgd2hpbGUgKHItPm5leHQgIT0gTlVMTAotCSAgICAgJiYgaGlnaCArIDB4MTAwMCA+PSByLT5uZXh0LT5sb3cKLQkgICAgICYmIChyLT5uZXh0LT5oaWdoCi0JCSA8PSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykKLQkJICAgICArIGJmZF9zZWN0aW9uX3NpemUgKGluZm8tPmFiZmQsIHMpKSkpCi0JewotCSAgciA9IHItPm5leHQ7Ci0JICBoaWdoID0gci0+aGlnaDsKLQl9Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQlraW5kID0gMTsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLQlraW5kID0gMzsKLSAgICAgIGVsc2UKLQlraW5kID0gMjsKLQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDExKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBraW5kKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgcy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggLSBsb3cpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWRkIHRoaXMgcmFuZ2UgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIHJhbmdlcy4gICovCi0gICAgICBpZiAoISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgdHJ1ZSwgbG93LCBoaWdoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgQkIxMSBibG9ja3MgZGVzY3JpYmluZyBlYWNoIHJhbmdlIHRoYXQgd2UgaGF2ZSBub3QgYWxyZWFkeQotICAgZGVzY3JpYmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfYWRkX2JiMTFfYmxvY2tzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgZGF0YTsKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gIHN0cnVjdCBpZWVlX3JhbmdlICpyOwotCi0gIGxvdyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0gIGhpZ2ggPSBsb3cgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IHJhbmdlIGF0IG9yIGFmdGVyIHRoaXMgc2VjdGlvbi4gIFRoZSByYW5nZXMgYXJlCi0gICAgIHNvcnRlZCBieSBhZGRyZXNzLiAgKi8KLSAgZm9yIChyID0gaW5mby0+Z2xvYmFsX3JhbmdlczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICBpZiAoci0+aGlnaCA+IGxvdykKLSAgICAgIGJyZWFrOwotCi0gIHdoaWxlIChsb3cgPCBoaWdoKQotICAgIHsKLSAgICAgIGlmIChyID09IE5VTEwgfHwgci0+bG93ID49IGhpZ2gpCi0JewotCSAgaWYgKCEgaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIGhpZ2gpKQotCSAgICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAobG93IDwgci0+bG93Ci0JICAmJiByLT5sb3cgLSBsb3cgPiAweDEwMCkKLQl7Ci0JICBpZiAoISBpZWVlX2FkZF9iYjExIChpbmZvLCBzZWMsIGxvdywgci0+bG93KSkKLQkgICAgewotCSAgICAgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBsb3cgPSByLT5oaWdoOwotCi0gICAgICByID0gci0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIEFkZCBhIHNpbmdsZSBCQjExIGJsb2NrIGZvciBhIHJhbmdlLiAgV2UgYWRkIGl0IHRvIGluZm8tPnZhcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIGhpZ2gpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgIGJmZF92bWEgaGlnaDsKLXsKLSAgaW50IGtpbmQ7Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqbW9kbmFtZTsKLSAgICAgIGNoYXIgKmMsICpzOwotCi0gICAgICAvKiBTdGFydCB0aGUgZW5jbG9zaW5nIEJCMTAgYmxvY2suICAqLwotICAgICAgZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKTsKLSAgICAgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChtb2RuYW1lICE9IE5VTEwpCi0JKyttb2RuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJ1xcJyk7Ci0JICBpZiAobW9kbmFtZSAhPSBOVUxMKQotCSAgICArK21vZG5hbWU7Ci0JICBlbHNlCi0JICAgIG1vZG5hbWUgPSBmaWxlbmFtZTsKLQl9Ci0gICAgICBjID0geHN0cmR1cCAobW9kbmFtZSk7Ci0gICAgICBzID0gc3RycmNociAoYywgJy4nKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JKnMgPSAnXDAnOwotCi0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMTApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBjKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICJHTlUgb2JqY29weSIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZnJlZSAoYyk7Ci0gICAgfQotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotICAgIGtpbmQgPSAxOwotICBlbHNlIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLSAgICBraW5kID0gMzsKLSAgZWxzZQotICAgIGtpbmQgPSAyOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywga2luZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNlYy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggLSBsb3cpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgcmVjb3JkaW5nIGluZm9ybWF0aW9uIGZyb20gYSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlLiAgVGhpcyBpcwotICAgdXNlZCB0byByZWNvcmQgd2hpY2ggZmlsZSBkZWZpbmVkIHdoaWNoIHR5cGVzLCB2YXJpYWJsZXMsIGV0Yy4gIEl0Ci0gICBpcyBub3QgdXNlZCBmb3IgbGluZSBudW1iZXJzLCBzaW5jZSB0aGUgbGluZW5vIGVudHJ5IHBvaW50IHBhc3NlcwotICAgZG93biB0aGUgZmlsZSBuYW1lIGFueWhvdy4gIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGRvZXNuJ3Qgc2VlbQotICAgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBhbnl3aGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhbiBlbXB0eSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW1wdHlfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIChpbnQpIGJ1aWx0aW5fdW5rbm93biwgMCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIChpbnQpIGJ1aWx0aW5fdm9pZCwgMCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhbiBpbnRlZ2VyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9pbnRfdHlwZSAocCwgc2l6ZSwgdW5zaWduZWRwKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2xvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodW5zaWduZWRwKQotICAgICsraW5keDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIHVuc2lnbmVkcCwgZmFsc2UpOwotfQotCi0vKiBNYWtlIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Zsb2F0X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2Zsb2F0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHNpemUgcmVhbGx5IGRlcGVuZHMgdXBvbiB0aGUgcHJvY2Vzc29yLiAgKi8KLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2xvbmdfZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2xvbmdfbG9uZ19kb3VibGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHVuc3VwcG9ydGVkIGZsb2F0IHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qIE1ha2UgYSBjb21wbGV4IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jb21wbGV4X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjaGFyIGNvZGU7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCAhPSAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCwgc2l6ZSAqIDIsCi0JCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGNvZGUgPSAnYyc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTY6Ci0gICAgICAvKiBUaGVzZSBjYXNlcyBjYW4gYmUgb3V0cHV0IGJ5IGdjYyAtZ3N0YWJzLiAgT3V0cHV0dGluZyB0aGUKLSAgICAgICAgIHdyb25nIHR5cGUgaXMgYmV0dGVyIHRoYW4gY3Jhc2hpbmcuICAqLwotICAgIGNhc2UgODoKLSAgICAgIGlmIChpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCAhPSAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5mby0+Y29tcGxleF9kb3VibGVfaW5kZXgsIHNpemUgKiAyLAotCQkJICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBjb2RlID0gJ2QnOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBjb21wbGV4IHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQgdGhlIHN0cmluZyBpcyBmb3IuICAqLwotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplICogMiwgZmFsc2UsIGZhbHNlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgY29kZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc2l6ZSA9PSA0KQotICAgIGluZm8tPmNvbXBsZXhfZmxvYXRfaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0gIGVsc2UKLSAgICBpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGJvb2xlYW4gdHlwZS4gIElFRUUgZG9lc24ndCBzdXBwb3J0IHRoZXNlLCBzbyB3ZSBqdXN0IG1ha2UKLSAgIGFuIGludGVnZXIgdHlwZSBpbnN0ZWFkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfYm9vbF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHJldHVybiBpZWVlX2ludF90eXBlIChwLCBzaXplLCB0cnVlKTsKLX0KLQotLyogTWFrZSBhbiBlbnVtZXJhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFscykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKmU7Ci0gIGJvb2xlYW4gbG9jYWxwLCBzaW1wbGU7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBpbnQgaSA9IDA7Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0gIGluZHggPSAodW5zaWduZWQgaW50KSAtMTsKLSAgZm9yIChlID0gaW5mby0+ZW51bXM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0gICAgewotICAgICAgaWYgKHRhZyA9PSBOVUxMKQotCXsKLQkgIGlmIChlLT50YWcgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlLT50YWcgPT0gTlVMTAotCSAgICAgIHx8IHRhZ1swXSAhPSBlLT50YWdbMF0KLQkgICAgICB8fCBzdHJjbXAgKHRhZywgZS0+dGFnKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghIGUtPmRlZmluZWQpCi0JewotCSAgLyogVGhpcyBlbnVtIHRhZyBoYXMgYmVlbiBzZWVuIGJ1dCBub3QgZGVmaW5lZC4gICovCi0JICBpbmR4ID0gZS0+aW5keDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKG5hbWVzICE9IE5VTEwgJiYgZS0+bmFtZXMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMICYmIGUtPm5hbWVzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChuYW1lc1tpXVswXSAhPSBlLT5uYW1lc1tpXVswXQotCQkgIHx8IHZhbHNbaV0gIT0gZS0+dmFsc1tpXQotCQkgIHx8IHN0cmNtcCAobmFtZXNbaV0sIGUtPm5hbWVzW2ldKSAhPSAwKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKChuYW1lcyA9PSBOVUxMICYmIGUtPm5hbWVzID09IE5VTEwpCi0JICB8fCAobmFtZXMgIT0gTlVMTAotCSAgICAgICYmIGUtPm5hbWVzICE9IE5VTEwKLQkgICAgICAmJiBuYW1lc1tpXSA9PSBOVUxMCi0JICAgICAgJiYgZS0+bmFtZXNbaV0gPT0gTlVMTCkpCi0JewotCSAgLyogV2UndmUgc2VlbiB0aGlzIGVudW0gYmVmb3JlLiAgKi8KLQkgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgZS0+aW5keCwgMCwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotICAgICAgaWYgKHRhZyAhPSBOVUxMKQotCXsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgc2VlbiBhbiBlbnVtIG9mIHRoZSBzYW1lIG5hbWUsIHNvIHdlIG11c3QgbWFrZQotCSAgICAgc3VyZSB0byBvdXRwdXQgdGhpcyBvbmUgbG9jYWxseS4gICovCi0JICBsb2NhbHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgc2ltcGxlIGVudW1lcmF0aW9uLCBpbiB3aGljaCB0aGUgdmFsdWVzIHN0YXJ0IGF0IDAKLSAgICAgYW5kIGFsd2F5cyBpbmNyZW1lbnQgYnkgMSwgd2UgY2FuIHVzZSB0eXBlIEUuICBPdGhlcndpc2Ugd2UgbXVzdAotICAgICB1c2UgdHlwZSBOLiAgKi8KLQotICBzaW1wbGUgPSB0cnVlOwotICBpZiAobmFtZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMOyBpKyspCi0JewotCSAgaWYgKHZhbHNbaV0gIT0gaSkKLQkgICAgewotCSAgICAgIHNpbXBsZSA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCB0YWcsIGluZHgsIDAsIHRydWUsIGxvY2FscCwKLQkJCQkoc3RydWN0IGllZWVfYnVmbGlzdCAqKSBOVUxMKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2ltcGxlID8gJ0UnIDogJ04nKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaW1wbGUpCi0gICAgewotICAgICAgLyogRklYTUU6IFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIGVudW1lcmF0aW9uIHNpemUsIGJ1dCB3ZQotICAgICAgICAgZG9uJ3Qgc3RvcmUgdGhhdC4gICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKG5hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWVzW2ldKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCEgc2ltcGxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHZhbHNbaV0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBpZiAoaW5keCA9PSAodW5zaWduZWQgaW50KSAtMSkKLQl7Ci0JICBlID0gKHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOwotCSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKmUpOwotCSAgZS0+aW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQkgIGUtPnRhZyA9IHRhZzsKLQotCSAgZS0+bmV4dCA9IGluZm8tPmVudW1zOwotCSAgaW5mby0+ZW51bXMgPSBlOwotCX0KLQotICAgICAgZS0+bmFtZXMgPSBuYW1lczsKLSAgICAgIGUtPnZhbHMgPSB2YWxzOwotICAgICAgZS0+ZGVmaW5lZCA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgcG9pbnRlciB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcG9pbnRlcl90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm0gPSBOVUxMOwotCi0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQSBwb2ludGVyIHRvIGEgc2ltcGxlIGJ1aWx0aW4gdHlwZSBjYW4gYmUgb2J0YWluZWQgYnkgYWRkaW5nIDMyLgotICAgICBGSVhNRTogV2lsbCB0aGlzIGJlIGEgc2hvcnQgcG9pbnRlciwgYW5kIHdpbGwgdGhhdCBtYXR0ZXI/ICAqLwotICBpZiAoaW5keCA8IDMyKQotICAgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCArIDMyLCAwLCB0cnVlLCBmYWxzZSk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChwLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKG0tPnBvaW50ZXIgPiAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+cG9pbnRlciwgNCwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCA0LCB0cnVlLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnUCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIG0tPnBvaW50ZXIgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBmdW5jdGlvbiB0eXBlLiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgYSBtZXRob2QsIGJ1dCB3ZQotICAgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBhZGQgaXQgdG8gdGhlIHR5cGUgdGFibGUgaW4gdGhhdCBjYXNlLiAgV2UKLSAgIGhhbmRsZSB0aGlzIGJ5IGRlZmluaW5nIHRoZSB0eXBlIGluIGEgcHJpdmF0ZSBidWZmZXIsIGFuZCBvbmx5Ci0gICBhZGRpbmcgdGhhdCBidWZmZXIgdG8gdGhlIHR5cGVkZWYgYmxvY2sgaWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Z1bmN0aW9uX3R5cGUgKHAsIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCAqYXJncyA9IE5VTEw7Ci0gIGludCBpOwotICB1bnNpZ25lZCBpbnQgcmV0aW5keDsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmRlZjsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbTsKLQotICBsb2NhbHAgPSBmYWxzZTsKLQotICBpZiAoYXJnY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZ3MgPSAodW5zaWduZWQgaW50ICopIHhtYWxsb2MgKGFyZ2NvdW50ICogc2l6ZW9mICphcmdzKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotCSAgICBsb2NhbHAgPSB0cnVlOwotCSAgYXJnc1tpXSA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGFyZ2NvdW50IDwgMCkKLSAgICB2YXJhcmdzID0gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotICAgIGxvY2FscCA9IHRydWU7Ci0gIHJldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBtID0gTlVMTDsKLSAgaWYgKGFyZ2NvdW50IDwgMCAmJiAhIGxvY2FscCkKLSAgICB7Ci0gICAgICBtID0gaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAocCwgcmV0aW5keCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKG0tPmZ1bmN0aW9uID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPmZ1bmN0aW9uLCAwLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gIC8qIEFuIGF0dHJpYnV0ZSBvZiAweDQxIG1lYW5zIHRoYXQgdGhlIGZyYW1lIGFuZCBwdXNoIG1hc2sgYXJlCi0gICAgIHVua25vd24uICAqLwotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmZm5kZWYpCi0gICAgICB8fCAhIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgKHVuc2lnbmVkIGludCkgLTEsIDAsIHRydWUsIGxvY2FscCwKLQkJCQkgICAmZm5kZWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAneCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAweDQxKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZXRpbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgKGJmZF92bWEpIGFyZ2NvdW50ICsgKHZhcmFyZ3MgPyAxIDogMCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGFyZ2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLQlpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYXJnc1tpXSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICBmcmVlIChhcmdzKTsKLSAgICB9Ci0gIGlmICh2YXJhcmdzKQotICAgIHsKLSAgICAgIC8qIEEgdmFyYXJncyBmdW5jdGlvbiBpcyByZXByZXNlbnRlZCBieSB3cml0aW5nIG91dCB0aGUgbGFzdAotICAgICAgICAgYXJndW1lbnQgYXMgdHlwZSB2b2lkICosIGFsdGhvdWdoIHRoaXMgbWFrZXMgbGl0dGxlIHNlbnNlLiAgKi8KLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgYnVpbHRpbl92b2lkICsgMzIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSB3cm90ZSB0aGUgaW5mb3JtYXRpb24gaW50byBmbmRlZiwgaW4gY2FzZSB3ZSBkb24ndCBuZWVkIGl0LgotICAgICBJdCB3aWxsIGJlIGFwcGVuZGVkIHRvIGluZm8tPnR5cGVzIGJ5IGllZWVfcG9wX3R5cGUuICAqLwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmZuZGVmID0gZm5kZWY7Ci0KLSAgaWYgKG0gIT0gTlVMTCkKLSAgICBtLT5mdW5jdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVmZXJlbmNlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogSUVFRSBhcHBlYXJzIHRvIHJlY29yZCBhIG5vcm1hbCBwb2ludGVyIHR5cGUsIGFuZCB0aGVuIHVzZSBhCi0gICAgIHBtaXNjIHJlY29yZCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIHJlYWxseSBhIHJlZmVyZW5jZS4gICovCi0KLSAgaWYgKCEgaWVlZV9wb2ludGVyX3R5cGUgKHApKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSByYW5nZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmFuZ2VfdHlwZSAocCwgbG93LCBoaWdoKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93OwotICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotCi0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIHVuc2lnbmVkcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUudW5zaWduZWRwOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICByZXR1cm4gKGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdSJykKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgbG93KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBoaWdoKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHVuc2lnbmVkcCA/IDAgOiAxKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNpemUpKTsKLX0KLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hcnJheV90eXBlIChwLCBsb3csIGhpZ2gsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgZWxlaW5keDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZSAqYTsKLQotICAvKiBJRUVFIGRvZXMgbm90IHN0b3JlIHRoZSByYW5nZSwgc28gd2UganVzdCBpZ25vcmUgaXQuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICBlbGVpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgcmFuZ2UsIHRyZWF0IHRoZSBzaXplIGFzIGV4YWN0bHkgb25lCi0gICAgIGVsZW1lbnQuICAqLwotICBpZiAobG93IDwgaGlnaCkKLSAgICBzaXplICo9IChoaWdoIC0gbG93KSArIDE7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBlbGVpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKGEgPSBtLT5hcnJheXM7IGEgIT0gTlVMTDsgYSA9IGEtPm5leHQpCi0JewotCSAgaWYgKGEtPmxvdyA9PSBsb3cgJiYgYS0+aGlnaCA9PSBoaWdoKQotCSAgICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGEtPmluZHgsIHNpemUsIGZhbHNlLCBmYWxzZSk7Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCBmYWxzZSwgbG9jYWxwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93ID09IDAgPyAnWicgOiAnQycpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBlbGVpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChsb3cgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBoaWdoICsgMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBhID0gKHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICphKTsKLSAgICAgIG1lbXNldCAoYSwgMCwgc2l6ZW9mICphKTsKLQotICAgICAgYS0+aW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLSAgICAgIGEtPmxvdyA9IGxvdzsKLSAgICAgIGEtPmhpZ2ggPSBoaWdoOwotCi0gICAgICBhLT5uZXh0ID0gbS0+YXJyYXlzOwotICAgICAgbS0+YXJyYXlzID0gYTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgZWxlaW5keDsKLQotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgZWxlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEZJWE1FOiBXZSBkb24ndCBrbm93IHRoZSBzaXplLCBzbyB3ZSBqdXN0IHVzZSA0LiAgKi8KLQotICByZXR1cm4gKGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIDAsIHRydWUsIGxvY2FscCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAncycpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBlbGVpbmR4KSk7Ci19Ci0KLS8qIE1ha2UgYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9vZmZzZXRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IHRhcmdldGluZHgsIGJhc2VpbmR4OwotCi0gIHRhcmdldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLSAgYmFzZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBGSVhNRTogVGhlIE1SSSBDKysgY29tcGlsZXIgZG9lcyBub3QgYXBwZWFyIHRvIGdlbmVyYXRlIGFueQotICAgICB1c2VmdWwgdHlwZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBvZmZzZXQgdHlwZS4gIEl0IGp1c3QgcmVjb3JkcyBhCi0gICAgIHBvaW50ZXIgdG8gbWVtYmVyIGFzIGFuIGludGVnZXIuICBUaGUgTVJJL0hQIElFRUUgc3BlYyBkb2VzCi0gICAgIGRlc2NyaWJlIGEgcG1pc2MgcmVjb3JkIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBhIHBvaW50ZXIgdG8KLSAgICAgbWVtYmVyLiAgVW5mb3J0dW5hdGVseSwgaXQgZG9lcyBub3QgZGVzY3JpYmUgdGhlIHRhcmdldCB0eXBlLAotICAgICB3aGljaCBzZWVtcyBwcmV0dHkgaW1wb3J0YW50LiAgSSdtIGdvaW5nIHRvIHB1bnQgdGhpcyBmb3Igbm93LiAgKi8KLQotICByZXR1cm4gaWVlZV9pbnRfdHlwZSAocCwgNCwgdHJ1ZSk7Ci19ICAKLQotLyogTWFrZSBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbWV0aG9kX3R5cGUgKHAsIGRvbWFpbiwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBib29sZWFuIGRvbWFpbjsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIE1SSS9IUCBJRUVFIHNwZWMgZGVmaW5lcyBhIHBtaXNjIHJlY29yZCB0byB1c2UgZm9yIGEKLSAgICAgbWV0aG9kLCBidXQgdGhlIGRlZmluaXRpb24gaXMgaW5jb21wbGV0ZS4gIFdlIGp1c3Qgb3V0cHV0IGFuICd4JwotICAgICB0eXBlLiAgKi8KLQotICBpZiAoZG9tYWluKQotICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLQotICByZXR1cm4gaWVlZV9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncyk7Ci19Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAobS0+Y29uc3RfcXVhbGlmaWVkID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPmNvbnN0X3F1YWxpZmllZCwgc2l6ZSwgdW5zaWduZWRwLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnbicpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAxKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICBtLT5jb25zdF9xdWFsaWZpZWQgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSB2b2xhdGlsZSBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZvbGF0aWxlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAobS0+dm9sYXRpbGVfcXVhbGlmaWVkID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPnZvbGF0aWxlX3F1YWxpZmllZCwgc2l6ZSwgdW5zaWduZWRwLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnbicpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAyKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICBtLT52b2xhdGlsZV9xdWFsaWZpZWQgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvbnZlcnQgYW4gZW51bSBkZWJ1Z192aXNpYmlsaXR5IGludG8gYSBDWFhGTEFHUyB2YWx1ZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KQotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQzsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEU7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFN0YXJ0IGRlZmluaW5nIGEgc3RydWN0IHR5cGUuICBXZSBidWlsZCBpdCBpbiB0aGUgc3RyZGVmIGZpZWxkIG9uCi0gICB0aGUgc3RhY2ssIHRvIGF2b2lkIGNvbmZ1c2luZyB0eXBlIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IHRoZQotICAgZmllbGRzIHdpdGggdGhlIHN0cnVjdCB0eXBlIGl0c2VsZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHAsIGlnbm9yZXA7Ci0gIGJvb2xlYW4gY29weTsKLSAgY2hhciBhYlsyMF07Ci0gIGNvbnN0IGNoYXIgKmxvb2s7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50LCAqbnRsb29rOwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHN0cmRlZjsKLQotICBsb2NhbHAgPSBmYWxzZTsKLSAgaWdub3JlcCA9IGZhbHNlOwotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgdGFnIGZvciBpbnRlcm5hbCB1c2UgZXZlbiBpZiB3ZSBkb24ndCB3YW50Ci0gICAgIG9uZSBmb3IgZXh0ZXJuYWwgdXNlLiAgVGhpcyB3aWxsIGxldCB1cyByZWZlciB0byBhbiBhbm9ueW1vdXMKLSAgICAgc3RydWN0LiAgKi8KLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxvb2sgPSB0YWc7Ci0gICAgICBjb3B5ID0gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ByaW50ZiAoYWIsICJfX2Fub24ldSIsIGlkKTsKLSAgICAgIGxvb2sgPSBhYjsKLSAgICAgIGNvcHkgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgcmVmZXJlbmNlcyB0byB0aGUgdGFnLCB3ZSBtdXN0IHVzZSB0aGUKLSAgICAgZXhpc3RpbmcgdHlwZSBpbmRleC4gICovCi0gIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnRhZ3MsIGxvb2ssIHRydWUsIGNvcHkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBudCA9IE5VTEw7Ci0gIGZvciAobnRsb29rID0gaC0+dHlwZXM7IG50bG9vayAhPSBOVUxMOyBudGxvb2sgPSBudGxvb2stPm5leHQpCi0gICAgewotICAgICAgaWYgKG50bG9vay0+aWQgPT0gaWQpCi0JbnQgPSBudGxvb2s7Ci0gICAgICBlbHNlIGlmICghIG50bG9vay0+dHlwZS5sb2NhbHApCi0JewotCSAgLyogV2UgYXJlIGNyZWF0aW5nIGEgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgYSBnbG9iYWxseQotCSAgICAgZGVmaW5lZCB0YWcuICBGb3JjZSBpdCB0byBiZSBsb2NhbCB0byBhdm9pZAotCSAgICAgY29uZnVzaW9uLiAgKi8KLQkgIGxvY2FscCA9IHRydWU7Ci0JfQotICAgIH0KLQotICBpZiAobnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGxvY2FscCA9PSBudC0+dHlwZS5sb2NhbHApOwotICAgICAgaWYgKG50LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCAmJiAhIGxvY2FscCkKLQl7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IHNlZW4gYSBnbG9iYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4KLSAgICAgICAgICAgICBJZ25vcmUgdGhpcyBuZXcgZGVmaW5pdGlvbi4gICovCi0JICBpZ25vcmVwID0gdHJ1ZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnQgPSAoc3RydWN0IGllZWVfbmFtZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbnQpOwotICAgICAgbWVtc2V0IChudCwgMCwgc2l6ZW9mICpudCk7Ci0gICAgICBudC0+aWQgPSBpZDsKLSAgICAgIG50LT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLSAgICAgIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gICAgICBoLT50eXBlcyA9IG50OwotICAgICAgbnQtPnR5cGUuaW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgICAgICsraW5mby0+dHlwZV9pbmR4OwotICAgIH0KLQotICBudC0+a2luZCA9IERFQlVHX0tJTkRfSUxMRUdBTDsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmc3RyZGVmKQotICAgICAgfHwgISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCB0YWcsIG50LT50eXBlLmluZHgsIHNpemUsIHRydWUsCi0JCQkJICAgbG9jYWxwLCAmc3RyZGVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc3RydWN0cCA/ICdTJyA6ICdVJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpZ25vcmVwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmhvbGQ7Ci0KLSAgICAgIC8qIFdlIG5ldmVyIHdhbnQgbnQtPnR5cGUubmFtZSB0byBiZSBOVUxMLiAgV2Ugd2FudCB0aGUgcmVzdCBvZgotCSB0aGUgdHlwZSB0byBiZSB0aGUgb2JqZWN0IHNldCB1cCBvbiB0aGUgdHlwZSBzdGFjazsgaXQgd2lsbAotCSBoYXZlIGEgTlVMTCBuYW1lIGlmIHRhZyBpcyBOVUxMLiAgKi8KLSAgICAgIGhvbGQgPSBudC0+dHlwZS5uYW1lOwotICAgICAgbnQtPnR5cGUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlOwotICAgICAgbnQtPnR5cGUubmFtZSA9IGhvbGQ7Ci0gICAgfQotCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSA9IHRhZzsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYgPSBzdHJkZWY7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaWdub3JlcCA9IGlnbm9yZXA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGZpZWxkIHRvIGEgc3RydWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RydWN0X2ZpZWxkIChwLCBuYW1lLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gIGJvb2xlYW4gcmVmZXJlbmNlcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBiZmRfdm1hIG9mZnNldDsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+bmV4dCAhPSBOVUxMCi0JICAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPm5leHQtPnR5cGUuc3RyZGVmKSk7Ci0KLSAgLyogSWYgd2UgYXJlIGlnbm9yaW5nIHRoaXMgc3RydWN0IGRlZmluaXRpb24sIGp1c3QgcG9wIGFuZCBpZ25vcmUKLSAgICAgdGhlIHR5cGUuICAqLwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5pZ25vcmVwKQotICAgIHsKLSAgICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICB1bnNpZ25lZHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnVuc2lnbmVkcDsKLSAgcmVmZXJlbmNlcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcDsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAobG9jYWxwKQotICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwID0gdHJ1ZTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBmbGFnczsKLSAgICAgIHVuc2lnbmVkIGludCBuaW5keDsKLQotICAgICAgLyogVGhpcyBpcyBhIGNsYXNzLiAgV2UgbXVzdCBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpZWxkIHRvCi0gICAgICAgICB0aGUgY2xhc3MgcmVjb3JkcyB3ZSBhcmUgYnVpbGRpbmcuICAqLwotCi0gICAgICBmbGFncyA9IGllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KTsKLSAgICAgIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywKLQkJCQkmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2QnKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNDsKLQotICAgICAgaWYgKHJlZmVyZW5jZXApCi0JewotCSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0JICAvKiBXZSBuZWVkIHRvIG91dHB1dCBhIHJlY29yZCByZWNvcmRpbmcgdGhhdCB0aGlzIGZpZWxkIGlzCi0gICAgICAgICAgICAgcmVhbGx5IG9mIHJlZmVyZW5jZSB0eXBlLiAgV2UgcHV0IHRoaXMgb24gdGhlIHJlZnMgZmllbGQKLSAgICAgICAgICAgICBvZiBjbGFzc2RlZiwgc28gdGhhdCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIEMrKwotICAgICAgICAgICAgIHJlY29yZHMgYWZ0ZXIgdGhlIGNsYXNzIGlzIGRlZmluZWQuICAqLwotCi0JICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLQkgICsraW5mby0+bmFtZV9pbmR4OwotCi0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCi0JCQkJICAgICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5yZWZzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ1InKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhlIGJpdHNpemUgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgc2l6ZSwgd2UgbmVlZCB0byBvdXRwdXQKLSAgICAgYSBiaXRmaWVsZCB0eXBlLiAgKi8KLSAgaWYgKHNpemUgPT0gMCB8fCBiaXRzaXplID09IDAgfHwgYml0c2l6ZSA9PSBzaXplICogOCkKLSAgICBvZmZzZXQgPSBiaXRwb3MgLyA4OwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgMCwgdW5zaWduZWRwLAotCQkJICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnZycpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB1bnNpZ25lZHAgPyAwIDogMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGJpdHNpemUpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBvZmZzZXQgPSBiaXRwb3M7Ci0gICAgfQotCi0gIC8qIFN3aXRjaCB0byB0aGUgc3RydWN0IHdlIGFyZSBidWlsZGluZyBpbiBvcmRlciB0byBvdXRwdXQgdGhpcwotICAgICBmaWVsZCBkZWZpbml0aW9uLiAgKi8KLSAgcmV0dXJuIChpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikKLQkgICYmIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBvZmZzZXQpKTsKLX0KLQotLyogRmluaXNoIHVwIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfc3RydWN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKnBiOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKSk7Ci0KLSAgLyogSWYgd2Ugd2VyZSBpZ25vcmluZyB0aGlzIHN0cnVjdCBkZWZpbml0aW9uIGJlY2F1c2UgaXQgd2FzIGEKLSAgICAgZHVwbGljYXRlIGRlZmludGlvbiwganVzdCB0aHJvdWdoIGF3YXkgd2hhdGV2ZXIgYnl0ZXMgd2UgaGF2ZQotICAgICBhY2N1bXVsYXRlZC4gIExlYXZlIHRoZSB0eXBlIG9uIHRoZSBzdGFjay4gKi8KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaWdub3JlcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIHRoaXMgdGFnLCB0aGVuIGxvY2FscAotICAgICB3aWxsIGJlIGZhbHNlLCBhbmQgd2UgY2FuIHB1dCBpdCBpbiB0aGUgZ2xvYmFsIHR5cGUgYmxvY2suCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYXZvaWQgb3V0cHV0dGluZyBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgd2hpY2ggYXJlCi0gICAgIHRoZSBzYW1lLiAgKi8KLSAgaWYgKCEgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgc3RhcnRlZCB0aGUgZ2xvYmFsIHR5cGUgYmxvY2suICAqLwotICAgICAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAyKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwYiA9ICZpbmZvLT5nbG9iYWxfdHlwZXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgc3RhcnRlZCB0aGUgdHlwZXMgYmxvY2suICAqLwotICAgICAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwYiA9ICZpbmZvLT50eXBlczsKLSAgICB9Ci0KLSAgLyogQXBwZW5kIHRoZSBzdHJ1Y3QgZGVmaW5pdGlvbiB0byB0aGUgdHlwZXMuICAqLwotICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sIHBiLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExlYXZlIHRoZSBzdHJ1Y3Qgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGNsYXNzIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9jbGFzc190eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplLCB2cHRyLCBvd252cHRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdnB0cjsKLSAgICAgYm9vbGVhbiBvd252cHRyOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGNvbnN0IGNoYXIgKnZjbGFzczsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCBwbWlzY2J1ZjsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKmNsYXNzZGVmOwotCi0gIC8qIEEgQysrIGNsYXNzIGlzIG91dHB1dCBhcyBhIEMrKyBzdHJ1Y3QgYWxvbmcgd2l0aCBhIHNldCBvZiBwbWlzYwotICAgICByZWNvcmRzIGRlc2NyaWJpbmcgdGhlIGNsYXNzLiAgKi8KLQotICAvKiBXZSBuZWVkIHRvIGhhdmUgYSBuYW1lIHNvIHRoYXQgd2UgY2FuIGFzc29jaWF0ZSB0aGUgc3RydWN0IGFuZAotICAgICB0aGUgY2xhc3MuICAqLwotICBpZiAodGFnID09IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqdDsKLQotICAgICAgdCA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgICAgIHNwcmludGYgKHQsICJfX2Fub24ldSIsIGlkKTsKLSAgICAgIHRhZyA9IHQ7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IHdyaXRlIG91dCB0aGUgdmlydHVhbCB0YWJsZSBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBoYXZlCi0gICAgIGZpbmlzaGVkIHRoZSBjbGFzcywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSB2aXJ0dWFsIHRhYmxlIHNpemUuCi0gICAgIFdlIGdldCB0aGUgc2l6ZSBmcm9tIHRoZSBsYXJnZXN0IHZvZmZzZXQgd2Ugc2VlLiAgKi8KLSAgdmNsYXNzID0gTlVMTDsKLSAgaWYgKHZwdHIgJiYgISBvd252cHRyKQotICAgIHsKLSAgICAgIHZjbGFzcyA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZTsKLSAgICAgIGFzc2VydCAodmNsYXNzICE9IE5VTEwpOwotICAgICAgLyogV2UgZG9uJ3QgY2FsbCBpZWVlX3BvcF91bnVzZWRfdHlwZSwgc2luY2UgdGhlIGNsYXNzIHNob3VsZAotICAgICAgICAgZ2V0IGRlZmluZWQuICAqLwotICAgICAgKHZvaWQpIGllZWVfcG9wX3R5cGUgKGluZm8pOwotICAgIH0KLQotICBpZiAoISBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgLyogV2Ugd3JpdGUgb3V0IHBtaXNjIHJlY29yZHMgaW50byB0aGUgY2xhc3NkZWYgZmllbGQuICBXZSB3aWxsCi0gICAgIHdyaXRlIG91dCB0aGUgcG1pc2Mgc3RhcnQgYWZ0ZXIgd2Uga25vdyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgd2UKLSAgICAgbmVlZC4gICovCi0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZwbWlzY2J1ZikKLSAgICAgIHx8ICEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmcG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmR4LCAnVCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmR4LCBzdHJ1Y3RwID8gJ28nIDogJ3UnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBpbmR4LCB0YWcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjbGFzc2RlZiA9IChzdHJ1Y3QgaWVlZV90eXBlX2NsYXNzICopIHhtYWxsb2MgKHNpemVvZiAqY2xhc3NkZWYpOwotICBtZW1zZXQgKGNsYXNzZGVmLCAwLCBzaXplb2YgKmNsYXNzZGVmKTsKLQotICBjbGFzc2RlZi0+aW5keCA9IGluZHg7Ci0gIGNsYXNzZGVmLT5wbWlzY2J1ZiA9IHBtaXNjYnVmOwotICBjbGFzc2RlZi0+cG1pc2Njb3VudCA9IDM7Ci0gIGNsYXNzZGVmLT52Y2xhc3MgPSB2Y2xhc3M7Ci0gIGNsYXNzZGVmLT5vd252cHRyID0gb3dudnB0cjsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmID0gY2xhc3NkZWY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX3N0YXRpY19tZW1iZXIgKHAsIG5hbWUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHR5cGUuICBIb3BlZnVsbHkgdGhlcmUgd2lsbCBiZSBhIGNhbGwgdG8KLSAgICAgaWVlZV92YXJpYWJsZSBkZWNsYXJpbmcgdGhlIHBoeXNpY2FsIG5hbWUgYW5kIHRoZSB0eXBlLCBzaW5jZQotICAgICB0aGF0IGlzIHdoZXJlIGFuIElFRUUgY29uc3VtZXIgbXVzdCBnZXQgdGhlIHR5cGUuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTCk7Ci0KLSAgZmxhZ3MgPSBpZWVlX3Zpc190b19mbGFncyAodmlzaWJpbGl0eSk7Ci0gIGZsYWdzIHw9IENYWEZMQUdTX1NUQVRJQzsKLQotICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2QnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIHBoeXNuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgYmFzZSBjbGFzcyB0byBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3NfYmFzZWNsYXNzIChwLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjb25zdCBjaGFyICpibmFtZTsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBiaW5keDsKLSAgY2hhciAqZm5hbWU7Ci0gIHVuc2lnbmVkIGludCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWUgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+bmV4dCAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT5uZXh0LT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmICEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5zdHJkZWYpKTsKLQotICBibmFtZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZTsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGJpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogV2UgYXJlIGN1cnJlbnRseSBkZWZpbmluZyBib3RoIGEgc3RydWN0IGFuZCBhIGNsYXNzLiAgV2UgbXVzdAotICAgICB3cml0ZSBvdXQgYSBmaWVsZCBkZWZpbml0aW9uIGluIHRoZSBzdHJ1Y3Qgd2hpY2ggaG9sZHMgdGhlIGJhc2UKLSAgICAgY2xhc3MuICBUaGUgc3RhYnMgZGVidWdnaW5nIHJlYWRlciB3aWxsIGNyZWF0ZSBhIGZpZWxkIG5hbWVkCi0gICAgIF92YiRDTEFTUyBmb3IgYSB2aXJ0dWFsIGJhc2UgY2xhc3MsIHNvIHdlIGp1c3QgdXNlIHRoYXQuICBGSVhNRToKLSAgICAgd2Ugc2hvdWxkIG5vdCBkZXBlbmQgdXBvbiBhIGRldGFpbCBvZiBzdGFicyBkZWJ1Z2dpbmcuICAqLwotICBpZiAodmlydHVhbCkKLSAgICB7Ci0gICAgICBmbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYm5hbWUpICsgc2l6ZW9mICJfdmIkIik7Ci0gICAgICBzcHJpbnRmIChmbmFtZSwgIl92YiQlcyIsIGJuYW1lKTsKLSAgICAgIGZsYWdzID0gQkFTRUZMQUdTX1ZJUlRVQUw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxvY2FscCkKLQlpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCA9IHRydWU7Ci0KLSAgICAgIGZuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChibmFtZSkgKyBzaXplb2YgIl9iJCIpOwotICAgICAgc3ByaW50ZiAoZm5hbWUsICJfYiQlcyIsIGJuYW1lKTsKLQotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGZuYW1lKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBiaXRwb3MgLyA4KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IDA7Ci0gICAgfQotCi0gIGlmICh2aXNpYmlsaXR5ID09IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURSkKLSAgICBmbGFncyB8PSBCQVNFRkxBR1NfUFJJVkFURTsKLQotICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2InKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgYm5hbWUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGZuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNTsKLQotICBmcmVlIChmbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGJ1aWxkaW5nIGEgbWV0aG9kIGZvciBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCA9PSBOVUxMKTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgPSBuYW1lOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZWZpbmUgYSBuZXcgbWV0aG9kIHZhcmlhbnQsIGVpdGhlciBzdGF0aWMgb3Igbm90LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIHN0YXRpY3AsIGNvbnN0cCwKLQkJICAgICAgIHZvbGF0aWxlcCwgdm9mZnNldCwgY29udGV4dCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gc3RhdGljcDsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dDsKLXsKLSAgdW5zaWduZWQgaW50IGZsYWdzOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0gIGJvb2xlYW4gdmlydHVhbDsKLQotICAvKiBXZSBkb24ndCBuZWVkIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QuICBBbiBJRUVFIGNvbnN1bWVyIHdoaWNoCi0gICAgIHdhbnRzIHRoZSB0eXBlIG11c3QgdHJhY2sgZG93biB0aGUgZnVuY3Rpb24gYnkgdGhlIHBoeXNpY2FsIG5hbWUKLSAgICAgYW5kIGdldCB0aGUgdHlwZSBmcm9tIHRoYXQuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIHRoZSBjb250ZXh0LiAgRklYTUU6IFdlIHByb2JhYmx5IG91Z2h0IHRvIHVzZSBpdCB0bwotICAgICBhZGp1c3QgdGhlIHZvZmZzZXQgc29tZWhvdywgYnV0IEkgZG9uJ3QgcmVhbGx5IGtub3cgaG93LiAgKi8KLSAgaWYgKGNvbnRleHQpCi0gICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCAhPSBOVUxMKTsKLQotICBmbGFncyA9IGllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KTsKLQotICAvKiBGSVhNRTogV2UgbmV2ZXIgc2V0IENYWEZMQUdTX09WRVJSSURFLCBDWFhGTEFHU19PUEVSQVRPUiwKLSAgICAgQ1hYRkxBR1NfQ1RPUkRUT1IsIENYWEZMQUdTX0NUT1IsIG9yIENYWEZMQUdTX0lOTElORS4gICovCi0KLSAgaWYgKHN0YXRpY3ApCi0gICAgZmxhZ3MgfD0gQ1hYRkxBR1NfU1RBVElDOwotICBpZiAoY29uc3RwKQotICAgIGZsYWdzIHw9IENYWEZMQUdTX0NPTlNUOwotICBpZiAodm9sYXRpbGVwKQotICAgIGZsYWdzIHw9IENYWEZMQUdTX1ZPTEFUSUxFOwotCi0gIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLQotICB2aXJ0dWFsID0gY29udGV4dCB8fCB2b2Zmc2V0ID4gMDsKLQotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCi0JCQkgICAgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIHZpcnR1YWwgPyAndicgOiAnbScpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LAotCQkJICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBwaHlzbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2aXJ0dWFsKQotICAgIHsKLSAgICAgIGlmICh2b2Zmc2V0ID4gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dm9mZnNldCkKLQlpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52b2Zmc2V0ID0gdm9mZnNldDsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgdm9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgKytpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50OwotICAgIH0KLQotICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhIG5ldyBtZXRob2QgdmFyaWFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXAsCi0JCQkgICB2b2Zmc2V0LCBjb250ZXh0KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgYm9vbGVhbiBjb250ZXh0OwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIGllZWVfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIGZhbHNlLCBjb25zdHAsCi0JCQkJdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KTsKLX0KLQotLyogRGVmaW5lIGEgbmV3IHN0YXRpYyBtZXRob2QgdmFyaWFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgdHJ1ZSwgY29uc3RwLAotCQkJCXZvbGF0aWxlcCwgMCwgZmFsc2UpOwotfQotCi0vKiBGaW5pc2ggdXAgYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19lbmRfbWV0aG9kIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCAhPSBOVUxMKTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VuZF9jbGFzc190eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTCk7Ci0KLSAgLyogSWYgd2Ugd2VyZSBpZ25vcmluZyB0aGlzIGNsYXNzIGRlZmluaXRpb24gYmVjYXVzZSBpdCB3YXMgYQotICAgICBkdXBsaWNhdGUgZGVmaW5pdGlvbiwganVzdCB0aHJvdWdoIGF3YXkgd2hhdGV2ZXIgYnl0ZXMgd2UgaGF2ZQotICAgICBhY2N1bXVsYXRlZC4gIExlYXZlIHRoZSB0eXBlIG9uIHRoZSBzdGFjay4gICovCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmlnbm9yZXApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OwotCi0gIC8qIElmIHdlIGhhdmUgYSB2aXJ0dWFsIHRhYmxlLCB3ZSBjYW4gd3JpdGUgb3V0IHRoZSBpbmZvcm1hdGlvbiBub3cuICAqLwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dmNsYXNzICE9IE5VTEwKLSAgICAgIHx8IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm93bnZwdHIpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLAotCQkJCSZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAneicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LAotCQkJICAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5vd252cHRyKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsCi0JCQkJICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52Y2xhc3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIG51bWJlciBvZiBwbWlzYyByZWNvcmRzLCB3ZSBjYW4gd3JpdGUgb3V0Ci0gICAgIHRoZSBhdG42MiB3aGljaCBzdGFydHMgdGhlIHBtaXNjIHJlY29yZHMsIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUKLSAgICAgQysrIGJ1ZmZlcnMuICAqLwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4MCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sCi0JCQkgICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4LAotCQkJICAgICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5yZWZzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgsCi0JCQkJJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnJlZnMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGllZWVfZW5kX3N0cnVjdF90eXBlIChwKTsKLX0KLQotLyogUHVzaCBhIHByZXZpb3VzbHkgc2VlbiB0eXBlZGVmIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90eXBlZGVmX3R5cGUgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnR5cGVkZWZzLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0gIC8qIGggc2hvdWxkIG5ldmVyIGJlIE5VTEwsIHNpbmNlIHRoYXQgd291bGQgaW1wbHkgdGhhdCB0aGUgZ2VuZXJpYwotICAgICBkZWJ1Z2dpbmcgY29kZSBoYXMgYXNrZWQgZm9yIGEgdHlwZWRlZiB3aGljaCBpdCBoYXMgbm90IHlldAotICAgICBkZWZpbmVkLiAgKi8KLSAgYXNzZXJ0IChoICE9IE5VTEwpOwotCi0gIC8qIFdlIGFsd2F5cyB1c2UgdGhlIG1vc3QgcmVjZW50bHkgZGVmaW5lZCB0eXBlIGZvciB0aGlzIG5hbWUsIHdoaWNoCi0gICAgIHdpbGwgYmUgdGhlIGZpcnN0IG9uZSBvbiB0aGUgbGlzdC4gICovCi0KLSAgbnQgPSBoLT50eXBlczsKLSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG50LT50eXBlLmluZHgsIG50LT50eXBlLnNpemUsCi0JCQludC0+dHlwZS51bnNpZ25lZHAsIG50LT50eXBlLmxvY2FscCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENvcHkgb3ZlciBhbnkgb3RoZXIgdHlwZSBpbmZvcm1hdGlvbiB3ZSBtYXkgaGF2ZS4gICovCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUgPSBudC0+dHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHRhZ2dlZCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90YWdfdHlwZSAocCwgbmFtZSwgaWQsIGtpbmQpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIGJvb2xlYW4gY29weTsKLSAgY2hhciBhYlsyMF07Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIGlmIChraW5kID09IERFQlVHX0tJTkRfRU5VTSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKmU7Ci0KLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JYWJvcnQgKCk7Ci0gICAgICBmb3IgKGUgPSBpbmZvLT5lbnVtczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLQlpZiAoZS0+dGFnICE9IE5VTEwgJiYgc3RyY21wIChlLT50YWcsIG5hbWUpID09IDApCi0JICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGUtPmluZHgsIDAsIHRydWUsIGZhbHNlKTsKLQotICAgICAgZSA9IChzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKikgeG1hbGxvYyAoc2l6ZW9mICplKTsKLSAgICAgIG1lbXNldCAoZSwgMCwgc2l6ZW9mICplKTsKLQotICAgICAgZS0+aW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgICAgICsraW5mby0+dHlwZV9pbmR4OwotICAgICAgZS0+dGFnID0gbmFtZTsKLSAgICAgIGUtPmRlZmluZWQgPSBmYWxzZTsKLQotICAgICAgZS0+bmV4dCA9IGluZm8tPmVudW1zOwotICAgICAgaW5mby0+ZW51bXMgPSBlOwotCi0gICAgICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGUtPmluZHgsIDAsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0KLSAgY29weSA9IGZhbHNlOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNwcmludGYgKGFiLCAiX19hbm9uJXUiLCBpZCk7Ci0gICAgICBuYW1lID0gYWI7Ci0gICAgICBjb3B5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaCA9IGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwICgmaW5mby0+dGFncywgbmFtZSwgdHJ1ZSwgY29weSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAobnQgPSBoLT50eXBlczsgbnQgIT0gTlVMTDsgbnQgPSBudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobnQtPmlkID09IGlkKQotCXsKLQkgIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCBudC0+dHlwZS5pbmR4LCBudC0+dHlwZS5zaXplLAotCQkJCW50LT50eXBlLnVuc2lnbmVkcCwgbnQtPnR5cGUubG9jYWxwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogQ29weSBvdmVyIGFueSBvdGhlciB0eXBlIGluZm9ybWF0aW9uIHdlIG1heSBoYXZlLiAgKi8KLQkgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUgPSBudC0+dHlwZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWYgKCEgbnQtPnR5cGUubG9jYWxwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgYSBnbG9iYWwgdHlwZSwgc28gaXQgbXVzdCBiZQotICAgICAgICAgICAgIGxvY2FsLiAqLwotCSAgbG9jYWxwID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIG50ID0gKHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm50KTsKLSAgbWVtc2V0IChudCwgMCwgc2l6ZW9mICpudCk7Ci0KLSAgbnQtPmlkID0gaWQ7Ci0gIG50LT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLSAgbnQtPnR5cGUuaW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgbnQtPnR5cGUubG9jYWxwID0gbG9jYWxwOwotICArK2luZm8tPnR5cGVfaW5keDsKLSAgbnQtPmtpbmQgPSBraW5kOwotCi0gIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gIGgtPnR5cGVzID0gbnQ7Ci0KLSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG50LT50eXBlLmluZHgsIDAsIGZhbHNlLCBsb2NhbHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWRlZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3R5cGRlZiAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IGllZWVfd3JpdGVfdHlwZSB0eXBlOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIHR5cGUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlOwotICBpbmR4ID0gdHlwZS5pbmR4OwotCi0gIC8qIElmIHRoaXMgaXMgYSBzaW1wbGUgYnVpbHRpbiB0eXBlIHVzaW5nIGEgYnVpbHRpbiBuYW1lLCB3ZSBkb24ndAotICAgICB3YW50IHRvIG91dHB1dCB0aGUgdHlwZWRlZiBpdHNlbGYuICBXZSBhbHNvIHdhbnQgdG8gY2hhbmdlIHRoZQotICAgICB0eXBlIGluZGV4IHRvIGNvcnJlc3BvbmQgdG8gdGhlIG5hbWUgYmVpbmcgdXNlZC4gIFdlIHJlY29nbml6ZQotICAgICBuYW1lcyB1c2VkIGluIHN0YWJzIGRlYnVnZ2luZyBvdXRwdXQgZXZlbiBpZiB0aGV5IGRvbid0IGV4YWN0bHkKLSAgICAgY29ycmVzcG9uZCB0byB0aGUgbmFtZXMgdXNlZCBmb3IgdGhlIElFRUUgYnVpbHRpbiB0eXBlcy4gICovCi0gIGZvdW5kID0gZmFsc2U7Ci0gIGlmIChpbmR4IDw9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fYmNkX2Zsb2F0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKGVudW0gYnVpbHRpbl90eXBlcykgaW5keCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3ZvaWQ6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAidm9pZCIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3NpZ25lZF9jaGFyOgotCWNhc2UgYnVpbHRpbl9jaGFyOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBjaGFyIikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3NpZ25lZF9jaGFyOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiY2hhciIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9jaGFyOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfY2hhcjoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBjaGFyIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDoKLQljYXNlIGJ1aWx0aW5fc2hvcnQ6Ci0JY2FzZSBidWlsdGluX3Nob3J0X2ludDoKLQljYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0OgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBzaG9ydCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNob3J0IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3Nob3J0OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2hvcnQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3Nob3J0X2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBzaG9ydCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQ6Ci0JY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0OgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIHNob3J0IGludCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJzaG9ydCB1bnNpZ25lZCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgc2hvcnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9zaWduZWRfbG9uZzoKLQljYXNlIGJ1aWx0aW5faW50OiAvKiBGSVhNRTogU2l6ZSBkZXBlbmRzIHVwb24gYXJjaGl0ZWN0dXJlLiAgKi8KLQljYXNlIGJ1aWx0aW5fbG9uZzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJzaWduZWQgbG9uZyIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9zaWduZWRfbG9uZzsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9pbnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJsb25nIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9sb25nOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZzoKLQljYXNlIGJ1aWx0aW5fdW5zaWduZWQ6IC8qIEZJWE1FOiBTaXplIGRlcGVuZHMgdXBvbiBhcmNoaXRlY3R1cmUuICAqLwotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9pbnQ6IC8qIEZJWE1FOiBMaWtlIGJ1aWx0aW5fdW5zaWduZWQuICAqLwotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGxvbmciKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCAibG9uZyB1bnNpZ25lZCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfbG9uZzsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkX2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3NpZ25lZF9sb25nX2xvbmc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIGxvbmcgbG9uZyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGxvbmcgaW50IikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZ19sb25nOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGxvbmcgbG9uZyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGxvbmcgdW5zaWduZWQgaW50IikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fZmxvYXQ6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiZmxvYXQiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9kb3VibGU6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiZG91YmxlIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fbG9uZ19kb3VibGU6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAibG9uZyBkb3VibGUiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgImxvbmcgbG9uZyBkb3VibGUiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChmb3VuZCkKLQl0eXBlLmluZHggPSBpbmR4OwotICAgIH0KLQotICBoID0gaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAgKCZpbmZvLT50eXBlZGVmcywgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgdGhpcyB0eXBlIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgbG9jYWxwID0gdHlwZS5sb2NhbHA7Ci0gIGZvciAobnQgPSBoLT50eXBlczsgbnQgIT0gTlVMTDsgbnQgPSBudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobnQtPmlkID09IGluZHgpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIGdsb2JhbCBkZWZpbml0aW9uLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8KLQkgICAgIGRvIGFueXRoaW5nIGhlcmUuICAqLwotCSAgaWYgKCEgbnQtPnR5cGUubG9jYWxwKQotCSAgICB7Ci0JICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiwgc28gbWFrZSB0aGlzIG9uZSBsb2NhbC4gICovCi0JICBsb2NhbHAgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgYSBuZXcgdHlwZWRlZiBmb3IgdGhpcyB0eXBlLiAgKi8KLQotICBudCA9IChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpudCk7Ci0gIG1lbXNldCAobnQsIDAsIHNpemVvZiAqbnQpOwotICBudC0+aWQgPSBpbmR4OwotICBudC0+dHlwZSA9IHR5cGU7Ci0gIG50LT50eXBlLm5hbWUgPSBuYW1lOwotICBudC0+dHlwZS5sb2NhbHAgPSBsb2NhbHA7Ci0gIG50LT5raW5kID0gREVCVUdfS0lORF9JTExFR0FMOwotCi0gIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gIGgtPnR5cGVzID0gbnQ7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgb25lIG9mIHRoZSBidWlsdGluIHR5cGVkZWZzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICBhY3R1YWxseSBkZWZpbmUgaXQuICAqLwotICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCAodW5zaWduZWQgaW50KSAtMSwgdHlwZS5zaXplLAotCQkJCXR5cGUudW5zaWduZWRwLAlsb2NhbHAsCi0JCQkJKHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikgTlVMTCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdUJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZW1vdmUgdGhlIHR5cGUgd2UganVzdCBhZGRlZCB0byB0aGUgdHlwZSBzdGFjay4gIFRoaXMgc2hvdWxkIG5vdAotICAgICBiZSBpZWVlX3BvcF91bnVzZWRfdHlwZSwgc2luY2UgdGhlIHR5cGUgaXMgdXNlZCwgd2UganVzdCBkb24ndAotICAgICBuZWVkIGl0IG5vdy4gICovCi0gICh2b2lkKSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdGFnIGZvciBhIHR5cGUuICBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90YWcgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogVGhpcyBzaG91bGQgbm90IGJlIGllZWVfcG9wX3VudXNlZF90eXBlLCBzaW5jZSB3ZSB3YW50IHRoZSB0eXBlCi0gICAgIHRvIGJlIGRlZmluZWQuICAqLwotICAodm9pZCkgaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYW4gaW50ZWdlciBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUUuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZhcmlhYmxlIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIGJvb2xlYW4gYXNuOwotICBpbnQgcmVmZmxhZzsKLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICByZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOwotICB0eXBlX2luZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBhc3NlcnQgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpOwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICArK2luZm8tPm5hbWVfaW5keDsKLQotICAvKiBXcml0ZSBvdXQgYW4gTk4gYW5kIGFuIEFUTiByZWNvcmQgZm9yIHRoaXMgdmFyaWFibGUuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB0eXBlX2luZHgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBERUJVR19HTE9CQUw6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgOCkKLQkgIHx8ICEgaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCB2YWwsIHZhbCArIHNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlZmZsYWcgPSAwOwotICAgICAgYXNuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfU1RBVElDOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDMpCi0JICB8fCAhIGllZWVfYWRkX3JhbmdlIChpbmZvLCBmYWxzZSwgdmFsLCB2YWwgKyBzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMTsKLSAgICAgIGFzbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0xPQ0FMX1NUQVRJQzoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAzKQotCSAgfHwgISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgZmFsc2UsIHZhbCwgdmFsICsgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVmZmxhZyA9IDI7Ci0gICAgICBhc24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19MT0NBTDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAxKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdmFsKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMjsKLSAgICAgIGFzbiA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19SRUdJU1RFUjoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAyKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywKLQkJCQkgIGllZWVfZ2VucmVnX3RvX3JlZ25vIChpbmZvLT5hYmZkLCB2YWwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMjsKLSAgICAgIGFzbiA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhc24pCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5hbWVfaW5keCwgdmFsKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgcmVhbGx5IGEgcmVmZXJlbmNlIHR5cGUsIHRoZW4gd2UganVzdCBvdXRwdXQgaXQgd2l0aAotICAgICBwb2ludGVyIHR5cGUsIGFuZCBtdXN0IG5vdyBvdXRwdXQgYSBDKysgcmVjb3JkIGluZGljYXRpbmcgdGhhdCBpdAotICAgICBpcyByZWFsbHkgcmVmZXJlbmNlIHR5cGUuICAqLwotICBpZiAocmVmZXJlbmNlcCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgICAgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgdmFyaWFibGUsIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBtaXNjCi0gICAgICAgICByZWNvcmQgaW4gdGhlIEMrKyBtaXNjIHJlY29yZCBibG9jay4gIE90aGVyd2lzZSwgd2Ugd2FudCB0bwotICAgICAgICAgb3V0cHV0IGl0IGp1c3QgYWZ0ZXIgdGhlIHZhcmlhYmxlIGRlZmluaXRpb24sIHdoaWNoIGlzIHdoZXJlCi0gICAgICAgICB0aGUgY3VycmVudCBidWZmZXIgaXMuICAqLwotICAgICAgaWYgKHJlZmZsYWcgIT0gMikKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnUicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgcmVmZmxhZykKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9mdW5jdGlvbiAocCwgbmFtZSwgZ2xvYmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBnbG9iYWw7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiByZWZlcmVuY2VwOwotICB1bnNpZ25lZCBpbnQgcmV0aW5keCwgdHlwZWluZHg7Ci0KLSAgcmVmZXJlbmNlcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcDsKLSAgcmV0aW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEJlc2lkZXMgcmVjb3JkaW5nIGEgQkI0IG9yIEJCNiBibG9jaywgd2UgcmVjb3JkIHRoZSB0eXBlIG9mIHRoZQotICAgICBmdW5jdGlvbiBpbiB0aGUgQkIxIHR5cGVkZWYgYmxvY2suICBXZSBjYW4ndCB3cml0ZSBvdXQgdGhlIGZ1bGwKLSAgICAgdHlwZSB1bnRpbCB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBwYXJhbWV0ZXJzLCBzbyB3ZSBhY2N1bXVsYXRlIGl0Ci0gICAgIGluIGluZm8tPmZudHlwZSBhbmQgaW5mby0+Zm5hcmdzLiAgKi8KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Zm50eXBlKSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhpcyBtaWdodCBoYXBwZW4gc29tZWRheSBpZiB3ZSBzdXBwb3J0IG5lc3RlZAotICAgICAgICAgZnVuY3Rpb25zLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpbmZvLT5mbm5hbWUgPSBuYW1lOwotCi0gIC8qIEFuIGF0dHJpYnV0ZSBvZiAweDQwIG1lYW5zIHRoYXQgdGhlIHB1c2ggbWFzayBpcyB1bmtub3duLiAgKi8KLSAgaWYgKCEgaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgbmFtZSwgKHVuc2lnbmVkIGludCkgLTEsIDAsIGZhbHNlLCB0cnVlLAotCQkJCSZpbmZvLT5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAneCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAweDQwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZXRpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdHlwZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPmZuYXJnY291bnQgPSAwOwotCi0gIC8qIElmIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgaXMgYWN0dWFsbHkgYSByZWZlcmVuY2UgdHlwZSwgd2UKLSAgICAgbXVzdCBhZGQgYSByZWNvcmQgaW5kaWNhdGluZyB0aGF0LiAgKi8KLSAgaWYgKHJlZmVyZW5jZXApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gICAgICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnUicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZ2xvYmFsID8gMCA6IDEpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFzc2VydCAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSk7Ci0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgYWRkcmVzcyBpcyB3cml0dGVuIG91dCBhcyB0aGUgZmlyc3QgYmxvY2suICAqLwotCi0gICsraW5mby0+YmxvY2tfZGVwdGg7Ci0KLSAgcmV0dXJuIChpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAmJiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGdsb2JhbCA/IDQgOiA2KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdHlwZWluZHgpKTsKLX0KLQotLyogQWRkIGEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGNhbGxlZCBiZWZvcmUgdGhlCi0gICBmaXJzdCBibG9jaywgc28gd2UgcG9zdHBvbmUgdGhlbSB1bnRpbCB3ZSBzZWUgdGhlIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZnVuY3Rpb25fcGFyYW1ldGVyIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm0sICoqcG07Ci0KLSAgYXNzZXJ0IChpbmZvLT5ibG9ja19kZXB0aCA9PSAxKTsKLQotICBtID0gKHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqKSB4bWFsbG9jIChzaXplb2YgKm0pOwotICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7Ci0KLSAgbS0+bmV4dCA9IE5VTEw7Ci0gIG0tPm5hbWUgPSBuYW1lOwotICBtLT5yZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOwotICBtLT50eXBlID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gIG0tPmtpbmQgPSBraW5kOwotICBtLT52YWwgPSB2YWw7Ci0KLSAgZm9yIChwbSA9ICZpbmZvLT5wZW5kaW5nX3Bhcm1zOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCi0gICAgOwotICAqcG0gPSBtOwotCi0gIC8qIEFkZCB0aGUgdHlwZSB0byB0aGUgZm5hcmdzIGxpc3QuICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5mbmFyZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBtLT50eXBlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICsraW5mby0+Zm5hcmdjb3VudDsKLQotICByZXR1cm4gdHJ1ZTsgIAotfQotCi0vKiBPdXRwdXQgcGVuZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfb3V0cHV0X3BlbmRpbmdfcGFybXMgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICptOwotICB1bnNpZ25lZCBpbnQgcmVmY291bnQ7Ci0KLSAgcmVmY291bnQgPSAwOwotICBmb3IgKG0gPSBpbmZvLT5wZW5kaW5nX3Bhcm1zOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotICAgIHsKLSAgICAgIGVudW0gZGVidWdfdmFyX2tpbmQgdmtpbmQ7Ci0KLSAgICAgIHN3aXRjaCAobS0+a2luZCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgREVCVUdfUEFSTV9TVEFDSzoKLQljYXNlIERFQlVHX1BBUk1fUkVGRVJFTkNFOgotCSAgdmtpbmQgPSBERUJVR19MT0NBTDsKLQkgIGJyZWFrOwotCWNhc2UgREVCVUdfUEFSTV9SRUc6Ci0JY2FzZSBERUJVR19QQVJNX1JFRl9SRUc6Ci0JICB2a2luZCA9IERFQlVHX1JFR0lTVEVSOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+dHlwZSwgMCwgZmFsc2UsIGZhbHNlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXAgPSBtLT5yZWZlcmVuY2VwOwotICAgICAgaWYgKG0tPnJlZmVyZW5jZXApCi0JKytyZWZjb3VudDsKLSAgICAgIGlmICghIGllZWVfdmFyaWFibGUgKChQVFIpIGluZm8sIG0tPm5hbWUsIHZraW5kLCBtLT52YWwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGFueSByZWZlcmVuY2UgcGFyYW1ldGVycywgd2UgbmVlZCB0byBvdXRwdXQgYQotICAgICBtaXNjZWxsYW5lb3VzIHJlY29yZCBpbmRpY2F0aW5nIHRoZW0uICAqLwotICBpZiAocmVmY291bnQgPiAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuaW5keCwgdmFyaW5keDsKLQotICAgICAgLyogRklYTUU6IFRoZSBNUkkgY29tcGlsZXIgb3V0cHV0cyB0aGUgZGVtYW5nbGVkIGZ1bmN0aW9uIG5hbWUKLSAgICAgICAgIGhlcmUsIGJ1dCB3ZSBhcmUgb3V0cHV0dGluZyB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KLSAgICAgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgcmVmY291bnQgKyAzKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdCJykKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGluZm8tPmZubmFtZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IgKG0gPSBpbmZvLT5wZW5kaW5nX3Bhcm1zLCB2YXJpbmR4ID0gMTsKLQkgICBtICE9IE5VTEw7Ci0JICAgbSA9IG0tPm5leHQsIHZhcmluZHgrKykKLQl7Ci0JICBpZiAobS0+cmVmZXJlbmNlcCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgdmFyaW5keCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgbSA9IGluZm8tPnBlbmRpbmdfcGFybXM7Ci0gIHdoaWxlIChtICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICpuZXh0OwotCi0gICAgICBuZXh0ID0gbS0+bmV4dDsKLSAgICAgIGZyZWUgKG0pOwotICAgICAgbSA9IG5leHQ7Ci0gICAgfQotCi0gIGluZm8tPnBlbmRpbmdfcGFybXMgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGJsb2NrLiAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgYmxvY2ssIHdlIG91dHB1dCB0aGUgYWRkcmVzcwotICAgdG8gZmluaXNoIHRoZSBCQjQgb3IgQkI2LCBhbmQgdGhlbiBvdXRwdXQgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9ibG9jayAocCwgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+YmxvY2tfZGVwdGggPT0gMSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYWRkcikKLQkgIHx8ICEgaWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyAoaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA2KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGFkZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9zdGFydF9yYW5nZSAoaW5mbywgYWRkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICsraW5mby0+YmxvY2tfZGVwdGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgd2UgYXJlIGdpdmVuIGlzIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBidXQgSUVFRSBzZWVtcwotICAgICB0byB3YW50IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGJsb2NrLCBzbyB3ZQotICAgICBzdWJ0cmFjdCBvbmUuICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBhZGRyIC0gMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfZW5kX3JhbmdlIChpbmZvLCBhZGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLS1pbmZvLT5ibG9ja19kZXB0aDsKLQotICBpZiAoYWRkciA+IGluZm8tPmhpZ2hhZGRyKQotICAgIGluZm8tPmhpZ2hhZGRyID0gYWRkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfZnVuY3Rpb24gKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5ibG9ja19kZXB0aCA9PSAxKTsKLQotICAtLWluZm8tPmJsb2NrX2RlcHRoOwotCi0gIC8qIE5vdyB3ZSBjYW4gZmluaXNoIHVwIGZudHlwZSwgYW5kIGFkZCBpdCB0byB0aGUgdHlwZGVmIHNlY3Rpb24uCi0gICAgIEF0IHRoaXMgcG9pbnQsIGZudHlwZSBpcyB0aGUgJ3gnIHR5cGUgdXAgdG8gdGhlIGFyZ3VtZW50IGNvdW50LAotICAgICBhbmQgZm5hcmdzIGlzIHRoZSBhcmd1bWVudCB0eXBlcy4gIFdlIG11c3QgYWRkIHRoZSBhcmd1bWVudAotICAgICBjb3VudCwgYW5kIHdlIG11c3QgYWRkIHRoZSBsZXZlbC4gIEZJWE1FOiBXZSBkb24ndCByZWNvcmQgdmFyYXJncwotICAgICBmdW5jdGlvbnMgY29ycmVjdGx5LiAgSW4gZmFjdCwgc3RhYnMgZGVidWdnaW5nIGRvZXMgbm90IGdpdmUgdXMKLSAgICAgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRvIHNvLiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm50eXBlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+Zm5hcmdjb3VudCkKLSAgICAgIHx8ICEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgdHlwZGVmIGJsb2NrIGhhcyBiZWVuIHN0YXJ0ZWQuICAqLwotICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMsICZpbmZvLT5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzLCAmaW5mby0+Zm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+Zm5uYW1lID0gTlVMTDsKLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmZudHlwZSkKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmZuYXJncykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT5mbmFyZ2NvdW50ID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbGluZW5vIChwLCBmaWxlbmFtZSwgbGluZW5vLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGluZW5vOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmZpbGVuYW1lICE9IE5VTEwpOwotCi0gIC8qIFRoZSBIUCBzaW11bGF0b3Igc2VlbXMgdG8gZ2V0IGNvbmZ1c2VkIHdoZW4gbW9yZSB0aGFuIG9uZSBsaW5lIGlzCi0gICAgIGxpc3RlZCBmb3IgdGhlIHNhbWUgYWRkcmVzcywgYXQgbGVhc3QgaWYgdGhleSBhcmUgaW4gZGlmZmVyZW50Ci0gICAgIGZpbGVzLiAgV2UgaGFuZGxlIHRoaXMgYnkgYWx3YXlzIGxpc3RpbmcgdGhlIGxhc3QgbGluZSBmb3IgYQotICAgICBnaXZlbiBhZGRyZXNzLCBzaW5jZSB0aGF0IHNlZW1zIHRvIGJlIHRoZSBvbmUgdGhhdCBnZGIgdXNlcy4gICovCi0gIGlmIChpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBhZGRyICE9IGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIpCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBsaW5lIG51bWJlciBibG9jay4gICovCi0gICAgICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5saW5lbm9zKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbmZvLT5saW5lbm9fbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotCSAgKytpbmZvLT5uYW1lX2luZHg7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA1KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5maWxlbmFtZSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gaW5mby0+ZmlsZW5hbWU7Ci0JfQotCi0gICAgICBpZiAoc3RyY21wIChpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotCXsKLQkgIGlmIChzdHJjbXAgKGluZm8tPmZpbGVuYW1lLCBpbmZvLT5saW5lbm9fZmlsZW5hbWUpICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSB3ZXJlIG5vdCBpbiB0aGUgbWFpbiBmaWxlLiAgQ2xvc2UgdGhlIGJsb2NrIGZvciB0aGUKLQkJIGluY2x1ZGVkIGZpbGUuICAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoc3RyY21wIChpbmZvLT5maWxlbmFtZSwgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUpID09IDApCi0JCXsKLQkJICAvKiBXZSBuZWVkIGEgbmV3IE5OIHJlY29yZCwgYW5kIHdlIGFyZW4ndCBhYm91dCB0bwotCQkgICAgIG91dHB1dCBvbmUuICAqLwotCQkgIGluZm8tPmxpbmVub19uYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0JCSAgKytpbmZvLT5uYW1lX2luZHg7Ci0JCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkJICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKLQkJICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCSAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIG5vdCBjaGFuZ2luZyB0byB0aGUgbWFpbiBmaWxlLiAgT3BlbiBhIGJsb2NrIGZvcgotCQkgdGhlIG5ldyBpbmNsdWRlZCBmaWxlLiAgKi8KLQkgICAgICBpbmZvLT5saW5lbm9fbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotCSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgNSkKLQkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWU7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDcpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5wZW5kaW5nX2xpbmVubykKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4LAotCQkJICAgICAgIGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgaW5mby0+cGVuZGluZ19saW5lbm8gPSBsaW5lbm87Ci0gIGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIgPSBhZGRyOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvaXMtcmFubGliLmMgYi9iaW51dGlscy9pcy1yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlNzJhNC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9pcy1yYW5saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogTGlua2VkIHdpdGggYXIubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdyYW5saWInIChub3QgJ2FyJykuICovCi0KLWludCBpc19yYW5saWIgPSAxOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvaXMtc3RyaXAuYyBiL2JpbnV0aWxzL2lzLXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTM0MWEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvaXMtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogTGlua2VkIHdpdGggb2JqY29weS5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gaXMgJ3N0cmlwJyAobm90Ci0gICAnb2JqY29weScpLiAqLwotCi1pbnQgaXNfc3RyaXAgPSAxOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbWFjLWJpbnV0aWxzLnIgYi9iaW51dGlscy9tYWMtYmludXRpbHMucgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxYTMwMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tYWMtYmludXRpbHMucgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJlc291cmNlcyBmb3IgR05VIGJpbnV0aWxzLiAqLwotCi0jaW5jbHVkZSAiU3lzVHlwZXMuciIKLQotLyogVmVyc2lvbiByZXNvdXJjZXMuICovCi0KLXJlc291cmNlICd2ZXJzJyAoMSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKLX07Ci0KLXJlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JImJpbnV0aWxzICIgVkVSU0lPTl9TVFJJTkcgIiBmb3IgTVBXIgotfTsKLQotI2lmZGVmIFdBTlRfQ0ZSRwotCi0jaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKLQotcmVzb3VyY2UgJ2NmcmcnICgwKSB7Ci0JewotCQlrUG93ZXJQQywKLQkJa0Z1bGxMaWIsCi0JCWtOb1ZlcnNpb25OdW0sIGtOb1ZlcnNpb25OdW0sCi0JCTAsMCwKLQkJa0lzQXBwLCBrT25EaXNrRmxhdCwga1plcm9PZmZzZXQsIGtXaG9sZUZvcmssCi0JCVBST0dfTkFNRQotCX0KLX07Ci0KLSNlbmRpZiAvKiBXQU5UX0NGUkcgKi8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21ha2VmaWxlLnZtcy1pbiBiL2JpbnV0aWxzL21ha2VmaWxlLnZtcy1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwOWQxYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tYWtlZmlsZS52bXMtaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBiaW51dGlscyB1bmRlciBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBybWkuZGUKLSMKLSMKLQotIyBEaXN0cmlidXRpb24gdmVyc2lvbiwgZmlsbGVkIGluIGJ5IGNvbmZpZ3VyZS5jb20KLVZFUlNJT049QFZFUlNJT05ACi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1UQVJHRVQ9IiJ2bXMtYWxwaGEiIgotZWxzZQotVEFSR0VUPSIidm1zLXZheCIiCi1lbmRpZgotCi1pZmVxICgkKENDKSxnY2MpCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKQotREVGUz0vZGVmaW5lPSgiVEFSR0VUPSQoVEFSR0VUKSIpCi1MSUJTPSxnbnVfY2NfbGlicmFyeTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsZ251X2NjX2xpYnJhcnk6Y3J0MC5vYmoKLWVsc2UKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1ERUZTPS9kZWZpbmU9KCJUQVJHRVQ9JChUQVJHRVQpIiwiY29uc3Q9IiwidW5saW5rPXJlbW92ZSIpCi1MSUJTPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbmRpZgotCi1CRkRMSUIgPSBbLS5iZmRdbGliYmZkLm9sYi9saWIKLUJGRExJQl9ERVAgPSBbLS5iZmRdbGliYmZkLm9sYgotTElCSUJFUlRZX0RFUCA9IFstLmxpYmliZXJ0eV1saWJpYmVydHkub2xiCi1MSUJJQkVSVFkgPSBbLS5saWJpYmVydHldbGliaWJlcnR5Lm9sYi9saWIKLU9QQ09ERVNfREVQID0gWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYgotT1BDT0RFUyA9IFstLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGIvbGliCi0KLURFQlVHX09CSlMgPSByZGRiZy5vYmosZGVidWcub2JqLHN0YWJzLm9iaixpZWVlLm9iaixyZGNvZmYub2JqCi0KLVdSSVRFX0RFQlVHX09CSlMgPSAkKERFQlVHX09CSlMpLHdyc3RhYnMub2JqCi0KLUJVTElCUyA9IFtdYnVjb21tLm9iaix2ZXJzaW9uLm9iaixmaWxlbW9kZS5vYmoKLQotQURETF9ERVBTID0gJChCVUxJQlMpLCQoQkZETElCX0RFUCksJChMSUJJQkVSVFlfREVQKQotQURETF9MSUJTID0gJChCVUxJQlMpLCQoQkZETElCKSwkKExJQklCRVJUWSkKLQotU0laRU9CSlMgPSAkKEFERExfREVQUyksc2l6ZS5vYmoKLQotU1RSSU5HU09CSlMgPSAkKEFERExfREVQUyksc3RyaW5ncy5vYmoKLQotTk1PQkpTID0gJChBRERMX0RFUFMpLG5tLm9iagotCi1PQkpEVU1QT0JKUyA9ICQoQURETF9ERVBTKSxvYmpkdW1wLm9iaixwcmRiZy5vYmosJChERUJVR19PQkpTKSwkKE9QQ09ERVNfREVQKQotCi1hbGw6IGNvbmZpZy5oIHNpemUuZXhlIHN0cmluZ3MuZXhlIG9iamR1bXAuZXhlIG5tLmV4ZQotCi1zaXplLmV4ZTogJChTSVpFT0JKUykKLQlsaW5rL2V4ZT0kQCBzaXplLm9iaiwkKEFERExfTElCUykkKExJQlMpCi0KLXN0cmluZ3MuZXhlOiAkKFNUUklOR1NPQkpTKQotCWxpbmsvZXhlPSRAIHN0cmluZ3Mub2JqLCQoQURETF9MSUJTKSQoTElCUykKLQotbm0uZXhlOiAkKE5NT0JKUykKLQlsaW5rL2V4ZT0kQCBubS5vYmosJChBRERMX0xJQlMpJChMSUJTKQotCi1vYmpkdW1wLmV4ZTogJChPQkpEVU1QT0JKUykKLQlsaW5rL2V4ZT0kQCBvYmpkdW1wLm9iaixwcmRiZy5vYmosJChERUJVR19PQkpTKSwkKEJGRExJQiksJChPUENPREVTKSwkKEFERExfTElCUykkKExJQlMpCi0KLQotdmVyc2lvbi5vYmo6IHZlcnNpb24uYwotCSQoQ0MpICQoQ0ZMQUdTKS9kZWZpbmU9KFZFUlNJT049IiIiJChWRVJTSU9OKSIiIikgJDwKLQotY29uZmlnLmg6Ci0JJCQgQGNvbmZpZ3VyZQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQotWy0uYmZkXWxpYmJmZC5vbGI6Ci0JJChDRCkgWy0uYmZkXQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGI6Ci0JJChDRCkgWy0ubGliaWJlcnR5XQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYjoKLQkkKENEKSBbLS5vcGNvZGVzXQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSAqLmV4ZTsKLQotZGlzdGNsZWFuOiBjbGVhbgotCSQoUk0pIGNvbmZpZy5oOwotCSQoUk0pIG1ha2VmaWxlLnZtczsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21heWJlLXJhbmxpYi5jIGIvYmludXRpbHMvbWF5YmUtcmFubGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2JjMGYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbWF5YmUtcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBkZWNpZGVzIGF0IHJ1bnRpbWUKLSAgICh1c2luZyBhcmd2WzBdIGlmIGl0IGlzIGlzICdhcicgb3IgJ3JhbmxpYicuICovCi0KLWludCBpc19yYW5saWIgPSAtMTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21heWJlLXN0cmlwLmMgYi9iaW51dGlscy9tYXliZS1zdHJpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDY3Yzk5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL21heWJlLXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIG9iamNvcHkubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGRlY2lkZXMgYXQgcnVudGltZQotICAgKHVzaW5nIGFyZ3ZbMF0gaWYgaXQgaXMgaXMgJ3N0cmlwJyBvciAnb2JqY29weScuICovCi0KLWludCBpc19zdHJpcCA9IC0xOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbXB3LWNvbmZpZy5pbiBiL2JpbnV0aWxzL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTA2N2QuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgYmludXRpbHMuCi0KLVNldCB0YXJnZXRfYXJjaCBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLS4qLS4qLy8nYAotCi0jIChzaG91bGQgY2Fub25pY2FsaXplIGFyY2ggbmFtZSkgKi8KLQotU2V0IGFyY2huYW1lIEFSQ0hfe3RhcmdldF9hcmNofQotCi1TZXQgdW5kZXJzY29yZSAwCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1oaXRhY2hpLWhtcy8KLQlTZXQgdW5kZXJzY29yZSAxCi1FbmQgSWYKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJBUkNIREVGUyA9IC1kIiB7YXJjaG5hbWV9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJVTkRFUlNDT1JFID0gIiB7dW5kZXJzY29yZX0JCQk+PiAie299Im1rLnRtcAotRWNobyAiQlVJTERfTkxNQ09OViA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJCVUlMRF9TUkNPTlYgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAiU1lTSU5GT19QUk9HID0gIgkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkJVSUxEX0RMTFRPT0wgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCQk+PiAie299Im1rLnRtcAotCi1FY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldwotRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCQkJCT4+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21wdy1tYWtlLnNlZCBiL2JpbnV0aWxzL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhYmZmZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBiaW51dGlscyBVbml4IG1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQotIyBBZGQgYSBydWxlLgotL14jIyMjIC4qL2FcCi1cCi0ie299InVuZGVyc2NvcmUuYy5vIFxcT3B0aW9uLWYgIntvfSJ1bmRlcnNjb3JlLmNcCi0KLSMgQ29tbWVudCBvdXQgYW55IGFsaWFzIHNldHRpbmdzLgotL15ob3N0X2FsaWFzID0vcy9eLyMvCi0vXnRhcmdldF9hbGlhcyA9L3MvXi8jLwotCi0jIFdoYWNrIG91dCB1bnVzZWQgaG9zdCBkZWZpbmUgYml0cy4KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotCi0jIERvbid0IGJ1aWxkIHNwZWNpYWxpemVkIHRvb2xzLgotL0JVSUxEX05MTUNPTlYvcy9AQlVJTERfTkxNQ09OVkAvLwotL0JVSUxEX1NSQ09OVi9zL0BCVUlMRF9TUkNPTlZALy8KLS9CVUlMRF9ETExUT09ML3MvQEJVSUxEX0RMTFRPT0xALy8KLQotL1VOREVSU0NPUkUvcy9AVU5ERVJTQ09SRUAve1VOREVSU0NPUkV9LwotCi0jIERvbid0IG5lZWQgdGhpcy4KLS9ASExERkxBR1NAL3MvQEhMREZMQUdTQC8vCi0KLSMgUG9pbnQgYXQgdGhlIGxpYnJhcmllcyBkaXJlY3RseS4KLS9AQkZETElCQC9zL0BCRkRMSUJALzo6YmZkOmxpYmJmZC5vLwotL0BPUENPREVTQC9zL0BPUENPREVTQC86Om9wY29kZXM6bGlib3Bjb2Rlcy5vLwotCi0jIFdoYWNrIG91dCB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnQuCi0vdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50L3MvdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50QC8vCi0KLSMgRml4IGFuZCBhZGQgdG8gdGhlIGluY2x1ZGUgcGF0aHMuCi0vXklOQ0xVREVTID0gLiokL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0vQkZERElSL3MvLWkge0JGRERJUn0gLy1pICJ7QkZERElSfSI6IC8KLS9JTkNESVIvcy8taSB7SU5DRElSfSAvLWkgIntJTkNESVJ9IjogLwotCi0jIFVzZSBieWFjYyBpbnN0ZWFkIG9mIGJpc29uIChmb3Igbm93IGFueXdheSkuCi0vQklTT04vcy9eQklTT04gPS4qJC9CSVNPTiA9IGJ5YWNjLwotIy9CSVNPTkZMQUdTL3MvXkJJU09ORkxBR1MgPS4qJC9CSVNPTkZMQUdTID0gLwotCi0jIEVtYmVkIHRoZSB2ZXJzaW9uIGluIHN5bWJvbGljIGRvdWJsZXF1b3RlcyB0aGF0IHdpbGwgZXhwYW5kIHRvCi0jIHRoZSByaWdodCB0aGluZyBmb3IgZWFjaCBjb21waWxlci4KLS9WRVJTSU9OL3MvJyJ7VkVSU0lPTn0iJy97ZHF9e1ZFUlNJT059e2RxfS8KLQotIyAnKycgaXMgYSBzcGVjaWFsIGNoYXIgdG8gTVBXLCBkb24ndCB1c2UgaXQgZXZlci4KLS9jKytmaWx0L3MvYysrZmlsdC9jcGx1c2ZpbHQvCi0KLSMgQWxsIG9mIHRoZSBiaW51dGlscyB1c2UgdGhlIHNhbWUgUmV6IGZpbGUsIGNoYW5nZSBuYW1lcyB0byByZWZlciB0byBpdC4KLS9ee1tBLVpdKl9QUk9HfS9zLyQvICJ7c30ibWFjLWJpbnV0aWxzLnIvCi0ve1tBLVpdKl9QUk9HfVwuci9zL3tbQS1aXSpfUFJPR31cLnIvbWFjLWJpbnV0aWxzLnIvCi0KLSMgVGhlcmUgYXJlIGF1dG8tZ2VuZXJhdGVkIHJlZmVyZW5jZXMgdG8gQkZEIC5oIGZpbGVzIHRoYXQgYXJlIG5vdAotIyBpbiB0aGUgb2JqZGlyIChsaWtlIGJmZC5oKSBidXQgYXJlIGluIHRoZSBzb3VyY2UgZGlyLgotLzo6YmZkOmxpYi9zLzo6YmZkOmxpYlwoW2Etel0qXClcLmgve0JGRERJUn06bGliXDEuaC9nCi0KLSMgRml4IHRoZSBsb2NhdGlvbnMgb2YgZ2VuZXJhdGVkIGZpbGVzLgotL2NvbmZpZy9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZwotL2NvbmZpZy9zL15jb25maWdcLmgvIntvfSJjb25maWdcLmgvCi0vdW5kZXJzY29yZS9zLyJ7c30idW5kZXJzY29yZVwuYy8ie299InVuZGVyc2NvcmUuYy9nCi0vdW5kZXJzY29yZS9zL151bmRlcnNjb3JlXC5jLyJ7b30idW5kZXJzY29yZVwuYy8KLQotIyBGaXggcGF0aHMgdG8gZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcy4KLS9sZXgueXkuYy9zLyJ7c30ibGV4XC55eVwuYy8ie299ImxleC55eS5jL2cKLS9sZXgueXkuYy9zL15sZXhcLnl5XC5jLyJ7b30ibGV4Lnl5LmMvCi0vYXJsZXguYy9zLyJ7c30iYXJsZXhcLmMvIntvfSJhcmxleC5jL2cKLS9hcmxleC5jL3MvXmFybGV4XC5jLyJ7b30iYXJsZXguYy8KLS95LnRhYi5jL3MvIntzfSJ5XC50YWJcLmMvIntvfSJ5LnRhYi5jL2cKLS95LnRhYi5jL3MvXnlcLnRhYlwuYy8ie299InkudGFiLmMvCi0vYXJwYXJzZS5jL3MvIntzfSJhcnBhcnNlXC5jLyJ7b30iYXJwYXJzZS5jL2cKLS9hcnBhcnNlLmMvcy9eYXJwYXJzZVwuYy8ie299ImFycGFyc2UuYy8KLS95LnRhYi5oL3MvIntzfSJ5XC50YWJcLmgvIntvfSJ5LnRhYi5oL2cKLS95LnRhYi5oL3MvXnlcLnRhYlwuaC8ie299InkudGFiLmgvCi0vYXJwYXJzZS5oL3MvIntzfSJhcnBhcnNlXC5oLyJ7b30iYXJwYXJzZS5oL2cKLS9hcnBhcnNlLmgvcy9eYXJwYXJzZVwuaC8ie299ImFycGFyc2UuaC8KLQotLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZwotCi0jIFRoZSBnZW5lcmF0ZWQgbGV4ZXIgbWF5IGluY2x1ZGUgYW4gaWZkZWYgZm9yIG9sZGVyIE1hYyBjb21waWxlcnMgdGhhdAotIyBuZWVkcyB0byB3b3JrIHdpdGggbmV3ZXIgY29tcGlsZXJzIGFsc28uCi0vbGV4Lnl5LmMvcy9SZW5hbWUgLXkgXChbXiBdKlwpIFwoW14gXSpcKSQvc2VkIC1lICdzLGlmZGVmIG1hY2ludG9zaCxpZiBkZWZpbmVkKG1hY2ludG9zaCkgfHwgZGVmaW5lZChfX01XRVJLU19fKSwnIFwxID4gXDIvCi0KLSMgRml4IGFuIG92ZXItZWFnZXJuZXNzLgotL2VjaG8uKldBUk5JTkcuKlRoaXMgZmlsZS9zLycuKicvJyAnLwotCi0jIEFkZCBhICJzdGFtcHMiIHRhcmdldC4KLSRhXAotc3RhbXBzIFxcT3B0aW9uLWYgc3RhbXAtdW5kZXJcCi0KLS9eaW5zdGFsbCBcXE9wdGlvbi1mIC8sL14kL2NcCi1pbnN0YWxsIFxcT3B0aW9uLWYgIGFsbCBpbnN0YWxsLW9ubHlcCi1cCi1pbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKLQkjIE5lZWQgdG8gY29weSBhbGwgdGhlIHRvb2xzXAotCUZvciBwcm9nIGluIHtQUk9HU31cCi0JCVNldCBwcm9nbmFtZSBgZWNobyB7cHJvZ30gfCBzZWQgLWUgJ3MvLm5ldy8vJ2BcCi0JCUR1cGxpY2F0ZSAteSA6e3Byb2d9ICJ7YmluZGlyfSJ7cHJvZ25hbWV9XAotCUVuZCBGb3JcCi0KLQotL3RydWUvcy8gOyBAdHJ1ZSQvLwotCi0jIGRvdCBmaWxlcyBhcmUgdHJvdWJsZSwgcmVtb3ZlIHRoZW0gYW5kIHRoZWlyIGFjdGlvbnMuCi0vXlwuZGVwLywvXiQvZAotCi0jIFJlbW92ZSB1bi11c2VmdWwgdGFyZ2V0cy4KLS9eTWFrZWZpbGUgXFxPcHRpb24tZi8sL14kL2QKLS9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mLywvXiQvZAotL15jb25maWcuc3RhdHVzIFxcT3B0aW9uLWYvLC9eJC9kCi0KLSMgRG9uJ3QgdHJ5IHRvIG1ha2UgdGhlIGRlbWFuZ2xlcidzIG1hbiBwYWdlLCBpdCdzIHVzZWxlc3MuCi0vXntERU1BTkdMRVJfUFJPR31cLjEgXFxPcHRpb24tZi8sL14kL2QKLSMgRG9uJ3QgZGVwZW5kIG9uIGl0IGVpdGhlci4KLS97REVNQU5HTEVSX1BST0d9L3MvIHtERU1BTkdMRVJfUFJPR31cLjEvLwotCmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1jb252LjEgYi9iaW51dGlscy9ubG1jb252LjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzNhZWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbmxtY29udi4xCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggbmxtY29udiAxICJNYXJjaCAxOTk2IiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotbmxtY29udiBcLSBjb252ZXJ0cyBvYmplY3QgY29kZSBpbnRvIGFuIE5MTQotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgbmxtY29udgotLlJCICJbXHwiIFwtSVwgXGZJYmZkbmFtZVxmQlwgfFwgXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU9cIFxmSWJmZG5hbWVcZkJcIHxcIFwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVFwgXGZJaGVhZGVyZmlsZVxmQlwgfFwgXC1cLWhlYWRlclwtZmlsZT1cZkloZWFkZXJmaWxlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVlwgfFwgXC1cLXZlcnNpb25cZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWhlbHBcZlIgIlx8XSIgCi0uQiBpbmZpbGUKLS5CIG91dGZpbGUKLS5TSCBERVNDUklQVElPTgotLkIgbmxtY29udgotY29udmVydHMgdGhlIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlIAotLkIgaW5maWxlCi1pbnRvIHRoZSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSAKLS5CUiBvdXRmaWxlICwKLW9wdGlvbmFsbHkgcmVhZGluZyAKLS5JIGhlYWRlcmZpbGUKLWZvciBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgRm9yIGluc3RydWN0aW9ucyBvbiB3cml0aW5nIHRoZSBOTE0KLWNvbW1hbmQgZmlsZSBsYW5ndWFnZSB1c2VkIGluIGhlYWRlciBmaWxlcywgc2VlIAotLklSICJUaGUgTmV0V2FyZSBUb29sIE1ha2VyIFNwZWNpZmljYXRpb24gTWFudWFsIiAsCi1hdmFpbGFibGUgZnJvbSBOb3ZlbGwsIEluYy4KLS5CIG5sbWNvbnYKLWN1cnJlbnRseSB3b3JrcyB3aXRoIGkzODYgb2JqZWN0IGZpbGVzIGluIAotLkJSIENPRkYgLAotLkJSIEVMRiAsCi1vcgotLkIgYS5vdXQKLWZvcm1hdCwgYW5kIHdpdGggU1BBUkMgb2JqZWN0IGZpbGVzIGluCi0uQiBFTEYKLW9yCi0uQiBhLm91dAotZm9ybWF0LgotLmJyCi0uQiBubG1jb252Ci11c2VzIHRoZSBHTlUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5IHRvIHJlYWQgCi0uSVIgaW5maWxlIC4KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtSSBcZkliZmRuYW1lXGZSLCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Db25zaWRlciB0aGUgc291cmNlIGZpbGUncyBvYmplY3QgZm9ybWF0IHRvIGJlIAotLklSIGJmZG5hbWUgLAotcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBkZWR1Y2UgaXQuCi0uVFAKLS5CIFwtTyBcZkliZmRuYW1lXGZSLCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZQotV3JpdGUgdGhlIG91dHB1dCBmaWxlIHVzaW5nIHRoZSBvYmplY3QgZm9ybWF0IAotLklSIGJmZG5hbWUgLgotLkIgbmxtY29udgotaW5mZXJzIHRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIHRoZSBpbnB1dCBmb3JtYXQsIGUuZy4gZm9yIGFuIGkzODYKLWlucHV0IGZpbGUgdGhlIG91dHB1dCBmb3JtYXQgaXMKLS5JUiBubG0zMlwtaTM4NiAuCi0uVFAKLS5CIFwtVCBcZkloZWFkZXJmaWxlXGZSLCBcZkJcLVwtaGVhZGVyXC1maWxlPVxmSWhlYWRlcmZpbGUKLVJlYWRzIAotLkkgaGVhZGVyZmlsZQotZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHdyaXRpbmcgdGhlIE5MTQotY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWUgCi0uSVIgIlRoZSBOZXRXYXJlIFRvb2wgTWFrZXIgU3BlY2lmaWNhdGlvbiBNYW51YWwiICwKLWF2YWlsYWJsZSBmcm9tIE5vdmVsbCwgSW5jLgotLlRQCi0uQiBcLVZcZlIsIFxmQlwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgbmxtY29udgotYW5kIGV4aXQuCi0uVFAKLS5CIFwtaFxmUiwgXGZCXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBubG1jb252Ci1hbmQgZXhpdC4KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoSnVuZSAxOTkzKS4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbmxtY29udi5jIGIvYmludXRpbHMvbmxtY29udi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM4YjZjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWNvbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMTIgKzAsMCBAQAotLyogbmxtY29udi5jIC0tIE5MTSBjb252ZXJzaW9uIHByb2dyYW0KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gY29udmVydCBhbnkgYXBwcm9wcmlhdGUgb2JqZWN0IGZpbGUKLSAgIGludG8gYSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSAoYW4gTkxNKS4gIEl0IHdpbGwgYWNjZXB0IGEgbGlua2VyCi0gICBzcGVjaWZpY2F0aW9uIGZpbGUgd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoYXQgYWNjZXB0ZWQgYnkgdGhlCi0gICBOZXRXYXJlIGxpbmtlciwgTkxNTElOSy4gICovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZuZGVmIF9fR05VQ19fCi0jIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0KLS8qIEludGVybmFsIEJGRCBOTE0gaGVhZGVyLiAgKi8KLSNpbmNsdWRlICJsaWJubG0uaCIKLSNpbmNsdWRlICJubG1jb252LmgiCi0KLSNpZmRlZiBOTE1DT05WX0FMUEhBCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jZW5kaWYKLQotLyogSWYgc3RyZXJyb3IgaXMganVzdCBhIG1hY3JvLCB3ZSB3YW50IHRvIHVzZSB0aGUgb25lIGZyb20gbGliaWJlcnR5Ci0gICBzaW5jZSBpdCB3aWxsIGhhbmRsZSB1bmRlZmluZWQgdmFsdWVzLiAgKi8KLSN1bmRlZiBzdHJlcnJvcgotZXh0ZXJuIGNoYXIgKnN0cmVycm9yICgpOwotCi0jaWZuZGVmIGxvY2FsdGltZQotZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1lICgpOwotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0KLSNpZm5kZWYgUl9PSwotI2RlZmluZSBSX09LIDQKLSNkZWZpbmUgV19PSyAyCi0jZGVmaW5lIFhfT0sgMQotI2VuZGlmCi0MCi0vKiBHbG9iYWwgdmFyaWFibGVzLiAgKi8KLQotLyogVGhlIG5hbWUgdXNlZCB0byBpbnZva2UgdGhlIHByb2dyYW0uICAqLwotY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotCi0vKiBXaGV0aGVyIHRvIHByaW50IG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKGN1cnJlbnRseSBqdXN0IGNvbnRyb2xzCi0gICB3aGV0aGVyIGl0IHByaW50cyB0aGUgbGlua2VyIGNvbW1hbmQgaWYgdGhlcmUgaXMgb25lKS4gICovCi1zdGF0aWMgaW50IGRlYnVnOwotCi0vKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqc3ltYm9sczsKLQotLyogQSBzZWN0aW9uIHdlIGNyZWF0ZSBpbiB0aGUgb3V0cHV0IGZpbGUgdG8gaG9sZCBwb2ludGVycyB0byB3aGVyZQotICAgdGhlIHNlY3Rpb25zIG9mIHRoZSBpbnB1dCBmaWxlIGVuZCB1cC4gIFdlIHdpbGwgcHV0IGEgcG9pbnRlciB0bwotICAgdGhpcyBzZWN0aW9uIGluIHRoZSBOTE0gaGVhZGVyLiAgVGhlc2UgaXMgYW4gZW50cnkgZm9yIGVhY2ggaW5wdXQKLSAgIHNlY3Rpb24uICBUaGUgZm9ybWF0IGlzCi0gICAgICAgbnVsbCB0ZXJtaW5hdGVkIHNlY3Rpb24gbmFtZQotICAgICAgIHplcm9lcyB0byBhZGp1c3QgdG8gNCBieXRlIGJvdW5kYXJ5Ci0gICAgICAgNCBieXRlIHNlY3Rpb24gZGF0YSBmaWxlIHBvaW50ZXIKLSAgICAgICA0IGJ5dGUgc2VjdGlvbiBzaXplCi0gICBXZSBkb24ndCBuZWVkIGEgdmVyc2lvbiBudW1iZXIuICBUaGUgd2F5IHdlIGZpbmQgdGhpcyBpbmZvcm1hdGlvbgotICAgaXMgYnkgZmluZGluZyBhIHN0YW1wIGluIHRoZSBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgSWYgd2UgbmVlZCB0bwotICAgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiwgd2UgY2FuIHNpbXBseSBjaGFuZ2UgdGhlCi0gICBzdGFtcC4gICovCi1zdGF0aWMgYXNlY3Rpb24gKnNlY3NlYzsKLQotLyogQSB0ZW1wb3JhcnkgZmlsZSBuYW1lIHRvIGJlIHVubGlua2VkIG9uIGV4aXQuICBBY3R1YWxseSwgZm9yIG1vc3QKLSAgIGVycm9ycywgd2UgbGVhdmUgaXQgYXJvdW5kLiAgSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGF0IGlzIGhlbHBmdWwKLSAgIG9yIG5vdC4gICovCi1zdGF0aWMgY2hhciAqdW5saW5rX29uX2V4aXQ7Ci0KLS8qIFRoZSBsaXN0IG9mIGxvbmcgb3B0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsgImRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdkJyB9LAotICB7ICJoZWFkZXItZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnVCcgfSwKLSAgeyAiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCcgfSwKLSAgeyAiaW5wdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LAotICB7ICJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knIH0sIC8qIE9ic29sZXRlICovCi0gIHsgImxpbmtlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbCcgfSwKLSAgeyAib3V0cHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTycgfSwKLSAgeyAib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTycgfSwgLyogT2Jzb2xldGUgKi8KLSAgeyAidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVicgfSwKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgMCwgMCB9Ci19OwotCi0vKiBMb2NhbCByb3V0aW5lcy4gICovCi0KLXN0YXRpYyB2b2lkIHNob3dfaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzaG93X3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqc2VsZWN0X291dHB1dF9mb3JtYXQgUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkJIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIHNldHVwX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvcHlfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJICAgbG9uZyAqLCBjaGFyICosCi0JCQkJICAgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHZvaWQgZGVmYXVsdF9tYW5nbGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqKiwKLQkJCQkJICAgbG9uZyAqLCBjaGFyICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBjaGFyICpsaW5rX2lucHV0cyBQQVJBTVMgKChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiwgY2hhciAqKSk7Ci0KLSNpZmRlZiBOTE1DT05WX0kzODYKLXN0YXRpYyB2b2lkIGkzODZfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJCWxvbmcgKiwgY2hhciAqLAotCQkJCQliZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLXN0YXRpYyB2b2lkIGFscGhhX21hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAotCQkJCQkgbG9uZyAqLCBjaGFyICosCi0JCQkJCSBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotc3RhdGljIHZvaWQgcG93ZXJwY19idWlsZF9zdHVicyBQQVJBTVMgKChiZmQgKiwgYmZkICosIGFzeW1ib2wgKioqLCBsb25nICopKTsKLXN0YXRpYyB2b2lkIHBvd2VycGNfcmVzb2x2ZV9zdHVicyBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHBvd2VycGNfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJCSAgIGxvbmcgKiwgY2hhciAqLAotCQkJCQkgICBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQwKLS8qIFRoZSBtYWluIHJvdXRpbmUuICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG9wdDsKLSAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKmlucHV0X2Zvcm1hdCA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKm91dHB1dF9mb3JtYXQgPSBOVUxMOwotICBjb25zdCBjaGFyICpoZWFkZXJfZmlsZSA9IE5VTEw7Ci0gIGNoYXIgKmxkX2FyZyA9IE5VTEw7Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgZml4ZWRfaGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciB2YXJfaGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIHZlcnNpb25faGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgY29weXJpZ2h0X2hkcl9zdHJ1Y3Q7Ci0gIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIgZXh0ZW5kZWRfaGRyX3N0cnVjdDsKLSAgYmZkICppbmJmZDsKLSAgYmZkICpvdXRiZmQ7Ci0gIGFzeW1ib2wgKipuZXdzeW1zLCAqKm91dHN5bXM7Ci0gIGxvbmcgc3ltY291bnQsIG5ld3N5bWFsbG9jLCBuZXdzeW1jb3VudDsKLSAgbG9uZyBzeW1zaXplOwotICBhc2VjdGlvbiAqdGV4dF9zZWMsICpic3Nfc2VjLCAqZGF0YV9zZWM7Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfc2l6ZV90eXBlIGFsaWduOwotICBhc3ltYm9sICplbmRzeW07Ci0gIGxvbmcgaTsKLSAgY2hhciBpbmxlYWQsIG91dGxlYWQ7Ci0gIGJvb2xlYW4gZ290c3RhcnQsIGdvdGV4aXQsIGdvdGNoZWNrOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgRklMRSAqY3VzdG9tX2RhdGEgPSBOVUxMOwotICBGSUxFICpoZWxwX2RhdGEgPSBOVUxMOwotICBGSUxFICptZXNzYWdlX2RhdGEgPSBOVUxMOwotICBGSUxFICpycGNfZGF0YSA9IE5VTEw7Ci0gIEZJTEUgKnNoYXJlZF9kYXRhID0gTlVMTDsKLSAgc2l6ZV90IGN1c3RvbV9zaXplID0gMDsKLSAgc2l6ZV90IGhlbHBfc2l6ZSA9IDA7Ci0gIHNpemVfdCBtZXNzYWdlX3NpemUgPSAwOwotICBzaXplX3QgbW9kdWxlX3NpemUgPSAwOwotICBzaXplX3QgcnBjX3NpemUgPSAwOwotICBhc2VjdGlvbiAqY3VzdG9tX3NlY3Rpb24gPSBOVUxMOwotICBhc2VjdGlvbiAqaGVscF9zZWN0aW9uID0gTlVMTDsKLSAgYXNlY3Rpb24gKm1lc3NhZ2Vfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICptb2R1bGVfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICpycGNfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzaGFyZWRfc2VjdGlvbiA9IE5VTEw7Ci0gIGJmZCAqc2hhcmVkYmZkOwotICBzaXplX3Qgc2hhcmVkX29mZnNldCA9IDA7Ci0gIHNpemVfdCBzaGFyZWRfc2l6ZSA9IDA7Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgc2hhcmVkaGRyOwotICBpbnQgbGVuOwotICBjaGFyICptb2RuYW1lOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImRoSTpsOk86VDpWIiwgbG9uZ19vcHRpb25zLAotCQkJICAgICAoaW50ICopIE5VTEwpKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ2QnOgotCSAgZGVidWcgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ0knOgotCSAgaW5wdXRfZm9ybWF0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICBsZF9hcmcgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIG91dHB1dF9mb3JtYXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGhlYWRlcl9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBwcmludF92ZXJzaW9uICgibmxtY29udiIpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIG91dHB1dF9maWxlID0gTlVMTDsKLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgaW5wdXRfZmlsZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgICAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JewotCSAgb3V0cHV0X2ZpbGUgPSBhcmd2W29wdGluZF07Ci0JICArK29wdGluZDsKLQkgIGlmIChvcHRpbmQgPCBhcmdjKQotCSAgICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgaWYgKHN0cmNtcCAoaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGUpID09IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gdG8gZGVmYXVsdCB2YWx1ZXMuICAqLwotICBmaXhlZF9oZHIgPSAmZml4ZWRfaGRyX3N0cnVjdDsKLSAgbWVtc2V0ICgoUFRSKSAmZml4ZWRfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIGZpeGVkX2hkcl9zdHJ1Y3QpOwotICB2YXJfaGRyID0gJnZhcl9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZ2YXJfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIHZhcl9oZHJfc3RydWN0KTsKLSAgdmVyc2lvbl9oZHIgPSAmdmVyc2lvbl9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZ2ZXJzaW9uX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiB2ZXJzaW9uX2hkcl9zdHJ1Y3QpOwotICBjb3B5cmlnaHRfaGRyID0gJmNvcHlyaWdodF9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZjb3B5cmlnaHRfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIGNvcHlyaWdodF9oZHJfc3RydWN0KTsKLSAgZXh0ZW5kZWRfaGRyID0gJmV4dGVuZGVkX2hkcl9zdHJ1Y3Q7Ci0gIG1lbXNldCAoKFBUUikgJmV4dGVuZGVkX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiBleHRlbmRlZF9oZHJfc3RydWN0KTsKLSAgY2hlY2tfcHJvY2VkdXJlID0gTlVMTDsKLSAgY3VzdG9tX2ZpbGUgPSBOVUxMOwotICBkZWJ1Z19pbmZvID0gZmFsc2U7Ci0gIGV4aXRfcHJvY2VkdXJlID0gIl9TdG9wIjsKLSAgZXhwb3J0X3N5bWJvbHMgPSBOVUxMOwotICBtYXBfZmlsZSA9IE5VTEw7Ci0gIGZ1bGxfbWFwID0gZmFsc2U7Ci0gIGhlbHBfZmlsZSA9IE5VTEw7Ci0gIGltcG9ydF9zeW1ib2xzID0gTlVMTDsKLSAgbWVzc2FnZV9maWxlID0gTlVMTDsKLSAgbW9kdWxlcyA9IE5VTEw7Ci0gIHNoYXJlbGliX2ZpbGUgPSBOVUxMOwotICBzdGFydF9wcm9jZWR1cmUgPSAiX1ByZWx1ZGUiOwotICB2ZXJib3NlID0gZmFsc2U7Ci0gIHJwY19maWxlID0gTlVMTDsKLQotICBwYXJzZV9lcnJvcnMgPSAwOwotCi0gIC8qIFBhcnNlIHRoZSBoZWFkZXIgZmlsZSAoaWYgdGhlcmUgaXMgb25lKS4gICovCi0gIGlmIChoZWFkZXJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG5sbWxleF9maWxlIChoZWFkZXJfZmlsZSkKLQkgIHx8IHl5cGFyc2UgKCkgIT0gMAotCSAgfHwgcGFyc2VfZXJyb3JzICE9IDApCi0JZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChpbnB1dF9maWxlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9maWxlICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCIlczogaW5wdXQgZmlsZSBuYW1lZCBib3RoIG9uIGNvbW1hbmQgbGluZSBhbmQgd2l0aCBJTlBVVFxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBpZiAoaW5wdXRfZmlsZXMtPm5leHQgPT0gTlVMTCkKLQlpbnB1dF9maWxlID0gaW5wdXRfZmlsZXMtPnN0cmluZzsKLSAgICAgIGVsc2UKLQlpbnB1dF9maWxlID0gbGlua19pbnB1dHMgKGlucHV0X2ZpbGVzLCBsZF9hcmcpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5wdXRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGlucHV0IGZpbGVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLSAgICB9Ci0KLSAgaW5iZmQgPSBiZmRfb3BlbnIgKGlucHV0X2ZpbGUsIGlucHV0X2Zvcm1hdCk7Ci0gIGlmIChpbmJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChpbmJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9mb3JtYXQgPT0gTlVMTCkKLSAgICBvdXRwdXRfZm9ybWF0ID0gc2VsZWN0X291dHB1dF9mb3JtYXQgKGJmZF9nZXRfYXJjaCAoaW5iZmQpLAotCQkJCQkgIGJmZF9nZXRfbWFjaCAoaW5iZmQpLAotCQkJCQkgIGJmZF9iaWdfZW5kaWFuIChpbmJmZCkpOwotCi0gIGFzc2VydCAob3V0cHV0X2Zvcm1hdCAhPSBOVUxMKTsKLQotICAvKiBVc2UgdGhlIG91dHB1dCBmaWxlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgaWYgaXQgZXhpc3RzLgotICAgICBPdGhlcndpc2UgdXNlIHRoZSBmaWxlIG5hbWVkIGluIHRoZSBPVVRQVVQgc3RhdGVtZW50LiAgKi8KLSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLSAgICB9Ci0KLSAgb3V0YmZkID0gYmZkX29wZW53IChvdXRwdXRfZmlsZSwgb3V0cHV0X2Zvcm1hdCk7Ci0gIGlmIChvdXRiZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKG91dHB1dF9maWxlKTsKLSAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKG91dGJmZCwgYmZkX29iamVjdCkpCi0gICAgYmZkX2ZhdGFsIChvdXRwdXRfZmlsZSk7Ci0KLSAgYXNzZXJ0IChiZmRfZ2V0X2ZsYXZvdXIgKG91dGJmZCkgPT0gYmZkX3RhcmdldF9ubG1fZmxhdm91cik7Ci0KLSAgaWYgKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlIChpbmJmZCwgb3V0YmZkKSA9PSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgIF8oIiVzOiB3YXJuaW5nOmlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgbm90IGNvbXBhdGlibGVcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lKTsKLQotICAvKiBNb3ZlIHRoZSB2YWx1ZXMgcmVhZCBmcm9tIHRoZSBjb21tYW5kIGZpbGUgaW50byBvdXRiZmQuICAqLwotICAqbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKSA9IGZpeGVkX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fdmFyaWFibGVfaGVhZGVyIChvdXRiZmQpID0gdmFyX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCkgPSB2ZXJzaW9uX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fY29weXJpZ2h0X2hlYWRlciAob3V0YmZkKSA9IGNvcHlyaWdodF9oZHJfc3RydWN0OwotICAqbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKSA9IGV4dGVuZGVkX2hkcl9zdHJ1Y3Q7Ci0KLSAgLyogU3RhcnQgY29weWluZyB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELiAgKi8KLSAgaWYgKCEgYmZkX3NldF9maWxlX2ZsYWdzIChvdXRiZmQsIGJmZF9nZXRfZmlsZV9mbGFncyAoaW5iZmQpKSkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKG91dGJmZCkpOwotCi0gIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoaW5iZmQpOwotICBpZiAoc3ltc2l6ZSA8IDApCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaW5iZmQsIHN5bWJvbHMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSAuYnNzIHNlY3Rpb24uICAqLwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKGJzc19zZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBic3Nfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICAgICAgaWYgKGJzc19zZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgYnNzX3NlYywgU0VDX0FMTE9DKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvdXRiZmQsIGJzc19zZWMsIDEpKQotCWJmZF9mYXRhbCAoXygibWFrZSAuYnNzIHNlY3Rpb24iKSk7Ci0gICAgfQotCi0gIC8qIFdlIHN0b3JlIHRoZSBvcmlnaW5hbCBzZWN0aW9uIG5hbWVzIGluIHRoZSAubmxtc2VjdGlvbnMgc2VjdGlvbiwKLSAgICAgc28gdGhhdCBwcm9ncmFtcyB3aGljaCB1bmRlcnN0YW5kIGl0IGNhbiByZXN1cnJlY3QgdGhlIG9yaWdpbmFsCi0gICAgIHNlY3Rpb25zIGZyb20gdGhlIE5MTS4gIFdlIHdpbGwgcHV0IGEgcG9pbnRlciB0byAubmxtc2VjdGlvbnMgaW4KLSAgICAgdGhlIE5MTSBoZWFkZXIgYXJlYS4gICovCi0gIHNlY3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1zZWN0aW9ucyIpOwotICBpZiAoc2Vjc2VjID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChfKCJtYWtlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIikpOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgc2Vjc2VjLCBTRUNfSEFTX0NPTlRFTlRTKSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbnMgZmxhZ3MiKSk7Ci0KLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLSAgLyogRm9yIFBvd2VyUEMgTmV0V2FyZSB3ZSBuZWVkIHRvIGJ1aWxkIHN0dWJzIGZvciBjYWxscyB0byB1bmRlZmluZWQKLSAgICAgc3ltYm9scy4gIEJlY2F1c2UgZWFjaCBzdHViIHJlcXVpcmVzIGFuIGVudHJ5IGluIHRoZSBUT0Mgc2VjdGlvbgotICAgICB3aGljaCBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzIG90aGVyIGVudHJpZXMgaW4gdGhlIFRPQwotICAgICBzZWN0aW9uLCB3ZSBtdXN0IGRvIHRoaXMgYmVmb3JlIGRldGVybWluaW5nIHdoZXJlIHRoZSBUT0Mgc2VjdGlvbgotICAgICBnb2VzIGluIHNldHVwX3NlY3Rpb25zLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcG93ZXJwY19idWlsZF9zdHVicyAoaW5iZmQsIG91dGJmZCwgJnN5bWJvbHMsICZzeW1jb3VudCk7Ci0jZW5kaWYKLQotICAvKiBTZXQgdXAgdGhlIHNlY3Rpb25zLiAgKi8KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpbmJmZCwgc2V0dXBfc2VjdGlvbnMsIChQVFIpIG91dGJmZCk7Ci0KLSAgdGV4dF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBOTE1fQ09ERV9OQU1FKTsKLQotICAvKiBUaGUgLmJzcyBzZWN0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAoZGF0YV9zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGFkZDsKLQotICAgICAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChkYXRhX3NlYyk7Ci0gICAgICBhbGlnbiA9IDEgPDwgYnNzX3NlYy0+YWxpZ25tZW50X3Bvd2VyOwotICAgICAgYWRkID0gKCh2bWEgKyBhbGlnbiAtIDEpICZ+IChhbGlnbiAtIDEpKSAtIHZtYTsKLSAgICAgIHZtYSArPSBhZGQ7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChvdXRiZmQsIGJzc19zZWMsIHZtYSkpCi0JYmZkX2ZhdGFsIChfKCJzZXQgLmJzcyB2bWEiKSk7Ci0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBkYXRhX3NpemU7Ci0KLQkgIGRhdGFfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoZGF0YV9zZWMpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgZGF0YV9zZWMsIGRhdGFfc2l6ZSArIGFkZCkpCi0JICAgIGJmZF9mYXRhbCAoXygic2V0IC5kYXRhIHNpemUiKSk7Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3Qgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgaW5sZWFkID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChpbmJmZCk7Ci0gIG91dGxlYWQgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG91dGJmZCk7Ci0gIGdvdHN0YXJ0ID0gZmFsc2U7Ci0gIGdvdGV4aXQgPSBmYWxzZTsKLSAgZ290Y2hlY2sgPSBmYWxzZTsKLSAgbmV3c3ltYWxsb2MgPSAxMDsKLSAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChuZXdzeW1hbGxvYyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG5ld3N5bWNvdW50ID0gMDsKLSAgZW5kc3ltID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IHN5bWNvdW50OyBpKyspCi0gICAgewotICAgICAgcmVnaXN0ZXIgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBzeW1ib2xzW2ldOwotCi0gICAgICAvKiBBZGQgb3IgcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIGlmIChpbmxlYWQgIT0gb3V0bGVhZCkKLQl7Ci0JICBpZiAoaW5sZWFkICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKVswXSA9PSBpbmxlYWQpCi0JCXsKLQkJICBpZiAob3V0bGVhZCA9PSAnXDAnKQotCQkgICAgKytzeW0tPm5hbWU7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjaGFyICpuZXc7Ci0KLQkJICAgICAgbmV3ID0geG1hbGxvYyAoc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSArIDEpOwotCQkgICAgICBuZXdbMF0gPSBvdXRsZWFkOwotCQkgICAgICBzdHJjcHkgKG5ldyArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgKyAxKTsKLQkJICAgICAgc3ltLT5uYW1lID0gbmV3OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm5ldzsKLQotCSAgICAgIG5ldyA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgKyAyKTsKLQkgICAgICBuZXdbMF0gPSBvdXRsZWFkOwotCSAgICAgIHN0cmNweSAobmV3ICsgMSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSk7Ci0JICAgICAgc3ltLT5uYW1lID0gbmV3OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOTE0ncyBoYXZlIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLCBidXQgdGhleSBkbyBub3QKLQkgaGF2ZSBhIGNvbW1vbiBzZWN0aW9uIGluIHRoZSBVbml4IHNlbnNlLiAgTW92ZSBhbGwgY29tbW9uCi0JIHN5bWJvbHMgaW50byB0aGUgLmJzcyBzZWN0aW9uLCBhbmQgbWFyayB0aGVtIGFzIGV4cG9ydGVkLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgYmZkX3ZtYSBzaXplOwotCi0JICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgc2l6ZSA9IHN5bS0+dmFsdWU7Ci0JICBzeW0tPnZhbHVlID0gYnNzX3NlYy0+X3Jhd19zaXplOwotCSAgYnNzX3NlYy0+X3Jhd19zaXplICs9IHNpemU7Ci0JICBhbGlnbiA9IDEgPDwgYnNzX3NlYy0+YWxpZ25tZW50X3Bvd2VyOwotCSAgYnNzX3NlYy0+X3Jhd19zaXplID0gKGJzc19zZWMtPl9yYXdfc2l6ZSArIGFsaWduIC0gMSkgJn4gKGFsaWduIC0gMSk7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICAvKiBNb3ZlIHRoZSBzeW1ib2wgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3ltLT52YWx1ZSArPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm91dHB1dF9vZmZzZXQ7Ci0JICBzeW0tPnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm91dHB1dF9zZWN0aW9uOwotCSAgLyogVGhpcyBpcyBubyBsb25nZXIgYSBzZWN0aW9uIHN5bWJvbC4gICovCi0JICBzeW0tPmZsYWdzICY9fiBCU0ZfU0VDVElPTl9TWU07Ci0JfQotCi0gICAgICAvKiBGb3JjZSBfZWRhdGEgYW5kIF9lbmQgdG8gYmUgZGVmaW5lZC4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUKLQkgZG9uZSBieSB0aGUgbGlua2VyLCBidXQgdGhlIG1hbmlwdWxhdGlvbiBvZiB0aGUgY29tbW9uCi0JIHN5bWJvbHMgd2lsbCBjb25mdXNlIGl0LiAgKi8KLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpID09IDAKLQkgICYmIGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gPT0gJ18nCi0JICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgIl9lZGF0YSIpID09IDApCi0JICAgIHsKLQkgICAgICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgICAgIHN5bS0+dmFsdWUgPSAwOwotCSAgICB9Ci0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiX2VuZCIpID09IDApCi0JICAgIHsKLQkgICAgICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgICAgIGVuZHN5bSA9IHN5bTsKLQkgICAgfQotCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0JICAvKiBGb3IgUG93ZXJQQyBOZXRXYXJlLCB3ZSBkZWZpbmUgX19HT1QwLiAgVGhpcyBpcyB0aGUgc3RhcnQKLQkgICAgIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotCSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMKLQkgICAgICAmJiBzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJfX0dPVDAiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmdvdF9zZWM7Ci0KLQkgICAgICBnb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCAiLmdvdCIpOwotCSAgICAgIGFzc2VydCAoZ290X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCk7Ci0JICAgICAgc3ltLT52YWx1ZSA9IGdvdF9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgc3ltLT5zZWN0aW9uID0gZ290X3NlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgIH0KLSNlbmRpZgotIAl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sLCBjaGVjayB0aGUgZXhwb3J0IGxpc3QuICAqLwotICAgICAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKSkgIT0gMCkKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0JICBpbnQgZm91bmRfc2ltcGxlOwotCi0JICAvKiBVbmZvcnR1bmF0ZWx5LCBhIHN5bWJvbCBjYW4gYXBwZWFyIG11bHRpcGxlIHRpbWVzIG9uIHRoZQotCSAgICAgZXhwb3J0IGxpc3QsIHdpdGggYW5kIHdpdGhvdXQgcHJlZml4ZXMuICAqLwotCSAgZm91bmRfc2ltcGxlID0gMDsKLQkgIGZvciAobCA9IGV4cG9ydF9zeW1ib2xzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobC0+c3RyaW5nLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQotCQlmb3VuZF9zaW1wbGUgPSAxOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKnpiYXNlOwotCi0JCSAgemJhc2UgPSBzdHJjaHIgKGwtPnN0cmluZywgJ0AnKTsKLQkJICBpZiAoemJhc2UgIT0gTlVMTAotCQkgICAgICAmJiBzdHJjbXAgKHpiYXNlICsgMSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgbXVzdCBhZGQgYSBzeW1ib2wgd2l0aCB0aGlzIHByZWZpeC4gICovCi0JCSAgICAgIGlmIChuZXdzeW1jb3VudCA+PSBuZXdzeW1hbGxvYykKLQkJCXsKLQkJCSAgbmV3c3ltYWxsb2MgKz0gMTA7Ci0JCQkgIG5ld3N5bXMgPSAoKGFzeW1ib2wgKiopCi0JCQkJICAgICB4cmVhbGxvYyAoKFBUUikgbmV3c3ltcywKLQkJCQkJICAgICAgIChuZXdzeW1hbGxvYwotCQkJCQkJKiBzaXplb2YgKGFzeW1ib2wgKikpKSk7Ci0JCQl9Ci0JCSAgICAgIG5ld3N5bXNbbmV3c3ltY291bnRdID0KLQkJCShhc3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCkpOwotCQkgICAgICAqbmV3c3ltc1tuZXdzeW1jb3VudF0gPSAqc3ltOwotCQkgICAgICBuZXdzeW1zW25ld3N5bWNvdW50XS0+bmFtZSA9IGwtPnN0cmluZzsKLQkJICAgICAgKytuZXdzeW1jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBpZiAoISBmb3VuZF9zaW1wbGUpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgdW5tb2RpZmllZCBzeW1ib2wgaXMgYWN0dWFsbHkgbm90IGV4cG9ydGVkIGF0Ci0JCSBhbGwuICAqLwotCSAgICAgIHN5bS0+ZmxhZ3MgJj1+IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7Ci0JICAgICAgc3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIGl0J3MgYW4gdW5kZWZpbmVkIHN5bWJvbCwgc2VlIGlmIGl0J3Mgb24gdGhlIGltcG9ydCBsaXN0LgotCSBDaGFuZ2UgdGhlIHByZWZpeCBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0KLQkgIGZvciAobCA9IGltcG9ydF9zeW1ib2xzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobC0+c3RyaW5nLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQotCQlicmVhazsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICp6YmFzZTsKLQotCQkgIHpiYXNlID0gc3RyY2hyIChsLT5zdHJpbmcsICdAJyk7Ci0JCSAgaWYgKHpiYXNlICE9IE5VTEwKLQkJICAgICAgJiYgc3RyY21wICh6YmFzZSArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN5bS0+bmFtZSA9IGwtPnN0cmluZzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgaWYgKGwgPT0gTlVMTCkKLQkgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgIF8oIiVzOiB3YXJuaW5nOiBzeW1ib2wgJXMgaW1wb3J0ZWQgYnV0IG5vdCBpbiBpbXBvcnQgbGlzdFxuIiksCi0JCSAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKLQl9Ci0JCi0gICAgICAvKiBTZWUgaWYgaXQncyBvbmUgb2YgdGhlIHNwZWNpYWwgbmFtZWQgc3ltYm9scy4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICAvKiBGSVhNRTogSWYgdGhlc2Ugc3ltYm9scyBhcmUgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLCB3ZQotCSAgICAgYWRkIHRoZSAudGV4dCBzZWN0aW9uIHNpemUgdG8gdGhlIHZhbHVlLiAgVGhpcyBtYXkgbm90IGJlCi0JICAgICBjb3JyZWN0IGZvciBhbGwgdGFyZ2V0cy4gIEknbSBub3Qgc3VyZSBob3cgdGhpcyBzaG91bGQKLQkgICAgIHJlYWxseSBiZSBoYW5kbGVkLiAgKi8KLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHN0YXJ0X3Byb2NlZHVyZSkgPT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gZGF0YV9zZWMKLQkJICAmJiB0ZXh0X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJdmFsICs9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgdGV4dF9zZWMpOwotCSAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0YmZkLCB2YWwpKQotCQliZmRfZmF0YWwgKF8oInNldCBzdGFydCBhZGRyZXNzIikpOwotCSAgICAgIGdvdHN0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgZXhpdF9wcm9jZWR1cmUpID09IDApCi0JICAgIHsKLQkgICAgICB2YWwgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pID09IGRhdGFfc2VjCi0JCSAgJiYgdGV4dF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCXZhbCArPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHRleHRfc2VjKTsKLQkgICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5leGl0UHJvY2VkdXJlT2Zmc2V0ID0gdmFsOwotCSAgICAgIGdvdGV4aXQgPSB0cnVlOwotCSAgICB9Ci0JICBpZiAoY2hlY2tfcHJvY2VkdXJlICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGNoZWNrX3Byb2NlZHVyZSkgPT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gZGF0YV9zZWMKLQkJICAmJiB0ZXh0X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJdmFsICs9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgdGV4dF9zZWMpOwotCSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0ID0gdmFsOwotCSAgICAgIGdvdGNoZWNrID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVuZHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGVuZHN5bS0+dmFsdWUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGJzc19zZWMpOwotCi0gICAgICAvKiBGSVhNRTogSWYgYW55IHJlbG9jcyByZWZlcnJpbmcgdG8gX2VuZCB1c2UgaW5wbGFjZSBhZGRlbmRzLAotCSB0aGVuIEkgdGhpbmsgdGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkKLQkgaTM4Nl9tYW5nbGVfcmVsb2NzLiAgSXMgaXQgbmVlZGVkIGZvciBhbnkgb3RoZXIgb2JqZWN0Ci0JIGZvcm1hdHM/ICAqLwotICAgIH0KLQotICBpZiAobmV3c3ltY291bnQgPT0gMCkKLSAgICBvdXRzeW1zID0gc3ltYm9sczsKLSAgZWxzZQotICAgIHsKLSAgICAgIG91dHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoKHN5bWNvdW50ICsgbmV3c3ltY291bnQgKyAxKQotCQkJCSAgICAgICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIG1lbWNweSAob3V0c3ltcywgc3ltYm9scywgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgbWVtY3B5IChvdXRzeW1zICsgc3ltY291bnQsIG5ld3N5bXMsIG5ld3N5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIG91dHN5bXNbc3ltY291bnQgKyBuZXdzeW1jb3VudF0gPSBOVUxMOwotICAgIH0KLQotICBiZmRfc2V0X3N5bXRhYiAob3V0YmZkLCBvdXRzeW1zLCBzeW1jb3VudCArIG5ld3N5bWNvdW50KTsKLSAgICAKLSAgaWYgKCEgZ290c3RhcnQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogU1RBUlQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgc3RhcnRfcHJvY2VkdXJlKTsKLSAgaWYgKCEgZ290ZXhpdCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBFWElUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIGV4aXRfcHJvY2VkdXJlKTsKLSAgaWYgKGNoZWNrX3Byb2NlZHVyZSAhPSBOVUxMCi0gICAgICAmJiAhIGdvdGNoZWNrKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6IENIRUNLIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIGNoZWNrX3Byb2NlZHVyZSk7Ci0KLSAgLyogQWRkIGFkZGl0aW9uYWwgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotICBpZiAoY3VzdG9tX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjdXN0b21fZGF0YSA9IGZvcGVuIChjdXN0b21fZmlsZSwgInIiKTsKLSAgICAgIGlmIChjdXN0b21fZGF0YSA9PSBOVUxMCi0JICB8fCBmc3RhdCAoZmlsZW5vIChjdXN0b21fZGF0YSksICZzdCkgPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBjdXN0b21fZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBjdXN0b21fZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1c3RvbV9zaXplID0gc3Quc3Rfc2l6ZTsKLQkgIGN1c3RvbV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbWN1c3RvbSIpOwotCSAgaWYgKGN1c3RvbV9zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIGN1c3RvbV9zZWN0aW9uLCBjdXN0b21fc2l6ZSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBjdXN0b21fc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJjdXN0b20gc2VjdGlvbiIpKTsKLQl9Ci0gICAgfQotICBpZiAoaGVscF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgaGVscF9kYXRhID0gZm9wZW4gKGhlbHBfZmlsZSwgInIiKTsKLSAgICAgIGlmIChoZWxwX2RhdGEgPT0gTlVMTAotCSAgfHwgZnN0YXQgKGZpbGVubyAoaGVscF9kYXRhKSwgJnN0KSA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIGhlbHBfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBoZWxwX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoZWxwX3NpemUgPSBzdC5zdF9zaXplOwotCSAgaGVscF9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbWhlbHAiKTsKLQkgIGlmIChoZWxwX3NlY3Rpb24gPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgaGVscF9zZWN0aW9uLCBoZWxwX3NpemUpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgaGVscF9zZWN0aW9uLAotCQkJCQkgIFNFQ19IQVNfQ09OVEVOVFMpKQotCSAgICBiZmRfZmF0YWwgKF8oImhlbHAgc2VjdGlvbiIpKTsKLQkgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQl9Ci0gICAgfQotICBpZiAobWVzc2FnZV9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgbWVzc2FnZV9kYXRhID0gZm9wZW4gKG1lc3NhZ2VfZmlsZSwgInIiKTsKLSAgICAgIGlmIChtZXNzYWdlX2RhdGEgPT0gTlVMTAotCSAgfHwgZnN0YXQgKGZpbGVubyAobWVzc2FnZV9kYXRhKSwgJnN0KSA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIG1lc3NhZ2VfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBtZXNzYWdlX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZXNzYWdlX3NpemUgPSBzdC5zdF9zaXplOwotCSAgbWVzc2FnZV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbW1lc3NhZ2VzIik7Ci0JICBpZiAobWVzc2FnZV9zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG1lc3NhZ2Vfc2VjdGlvbiwgbWVzc2FnZV9zaXplKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG1lc3NhZ2Vfc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJtZXNzYWdlIHNlY3Rpb24iKSk7Ci0JICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0JfQotICAgIH0KLSAgaWYgKG1vZHVsZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0KLSAgICAgIG1vZHVsZV9zaXplID0gMDsKLSAgICAgIGZvciAobCA9IG1vZHVsZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JbW9kdWxlX3NpemUgKz0gc3RybGVuIChsLT5zdHJpbmcpICsgMTsKLSAgICAgIG1vZHVsZV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbW1vZHVsZXMiKTsKLSAgICAgIGlmIChtb2R1bGVfc2VjdGlvbiA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG1vZHVsZV9zZWN0aW9uLCBtb2R1bGVfc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG1vZHVsZV9zZWN0aW9uLAotCQkJCSAgICAgIFNFQ19IQVNfQ09OVEVOVFMpKQotCWJmZF9mYXRhbCAoXygibW9kdWxlIHNlY3Rpb24iKSk7Ci0gICAgfQotICBpZiAocnBjX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBycGNfZGF0YSA9IGZvcGVuIChycGNfZmlsZSwgInIiKTsKLSAgICAgIGlmIChycGNfZGF0YSA9PSBOVUxMCi0JICB8fCBmc3RhdCAoZmlsZW5vIChycGNfZGF0YSksICZzdCkgPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBycGNfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBycGNfZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJwY19zaXplID0gc3Quc3Rfc2l6ZTsKLQkgIHJwY19zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbXJwYyIpOwotCSAgaWYgKHJwY19zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHJwY19zZWN0aW9uLCBycGNfc2l6ZSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBycGNfc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJycGMgc2VjdGlvbiIpKTsKLQkgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQl9Ci0gICAgfQotICBpZiAoc2hhcmVsaWJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNoYXJlZGJmZCA9IGJmZF9vcGVuciAoc2hhcmVsaWJfZmlsZSwgb3V0cHV0X2Zvcm1hdCk7Ci0gICAgICBpZiAoc2hhcmVkYmZkID09IE5VTEwKLQkgIHx8ICEgYmZkX2NoZWNrX2Zvcm1hdCAoc2hhcmVkYmZkLCBiZmRfb2JqZWN0KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc2hhcmVsaWJfZmlsZSwKLQkJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgc2hhcmVsaWJfZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNoYXJlZGhkciA9ICpubG1fZml4ZWRfaGVhZGVyIChzaGFyZWRiZmQpOwotCSAgYmZkX2Nsb3NlIChzaGFyZWRiZmQpOwotCSAgc2hhcmVkX2RhdGEgPSBmb3BlbiAoc2hhcmVsaWJfZmlsZSwgInIiKTsKLQkgIGlmIChzaGFyZWRfZGF0YSA9PSBOVUxMCi0JICAgICAgfHwgKGZzdGF0IChmaWxlbm8gKHNoYXJlZF9kYXRhKSwgJnN0KSA8IDApKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUsCi0JCSAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKLQkgICAgICBzaGFyZWxpYl9maWxlID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSWYgd2Ugd2VyZSBjbGV2ZXIsIHdlIGNvdWxkIGp1c3QgY29weSBvdXQgdGhlCi0JCSBzZWN0aW9ucyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgd2hpY2ggd2UgYWN0dWFsbHkKLQkJIG5lZWQuICBIb3dldmVyLCB3ZSB3b3VsZCBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIHNpemVzCi0JCSBvZiB0aGUgZXh0ZXJuYWwgYW5kIHB1YmxpYyBpbmZvcm1hdGlvbiwgYW5kIHRoYXQgY2FuCi0JCSBub3QgYmUgZG9uZSB3aXRob3V0IHJlYWRpbmcgdGhyb3VnaCB0aGVtLiAgKi8KLQkgICAgICBpZiAoc2hhcmVkaGRyLnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSA+IDApCi0JCXsKLQkJICAvKiBUaGVyZSBpcyBubyBwbGFjZSB0byByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbi4gICovCi0JCSAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgXygiJXM6JXM6IHdhcm5pbmc6IHNoYXJlZCBsaWJyYXJpZXMgY2FuIG5vdCBoYXZlIHVuaW5pdGlhbGl6ZWQgZGF0YVxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUpOwotCQl9Ci0JICAgICAgc2hhcmVkX29mZnNldCA9IHN0LnN0X3NpemU7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIuY29kZUltYWdlT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLmNvZGVJbWFnZU9mZnNldDsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5kYXRhSW1hZ2VPZmZzZXQpCi0JCXNoYXJlZF9vZmZzZXQgPSBzaGFyZWRoZHIuZGF0YUltYWdlT2Zmc2V0OwotCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLnJlbG9jYXRpb25GaXh1cE9mZnNldCkKLQkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5yZWxvY2F0aW9uRml4dXBPZmZzZXQ7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIuZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLmV4dGVybmFsUmVmZXJlbmNlc09mZnNldDsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5wdWJsaWNzT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLnB1YmxpY3NPZmZzZXQ7Ci0JICAgICAgc2hhcmVkX3NpemUgPSBzdC5zdF9zaXplIC0gc2hhcmVkX29mZnNldDsKLQkgICAgICBzaGFyZWRfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1zaGFyZWQiKTsKLQkgICAgICBpZiAoc2hhcmVkX3NlY3Rpb24gPT0gTlVMTAotCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2hhcmVkX3NlY3Rpb24sCi0JCQkJCSAgICAgc2hhcmVkX3NpemUpCi0JCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgc2hhcmVkX3NlY3Rpb24sCi0JCQkJCSAgICAgIFNFQ19IQVNfQ09OVEVOVFMpKQotCQliZmRfZmF0YWwgKF8oInNoYXJlZCBzZWN0aW9uIikpOwotCSAgICAgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQ2hlY2sgd2hldGhlciBhIHZlcnNpb24gd2FzIGdpdmVuLiAgKi8KLSAgaWYgKHN0cm5jbXAgKHZlcnNpb25faGRyLT5zdGFtcCwgIlZlUnNJb04jIiwgOCkgIT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBObyB2ZXJzaW9uIG51bWJlciBnaXZlblxuIiksCi0JICAgICBwcm9ncmFtX25hbWUpOwotCi0gIC8qIEF0IGxlYXN0IGZvciBub3csIGFsd2F5cyBjcmVhdGUgYW4gZXh0ZW5kZWQgaGVhZGVyLCBiZWNhdXNlIHRoYXQKLSAgICAgaXMgd2hhdCBOTE1MSU5LIGRvZXMuICAqLwotICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0KLSAgc3RybmNweSAobmxtX2N5Z251c19leHRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIkN5R25Vc0V4IiwgOCk7Ci0KLSAgLyogSWYgdGhlIGRhdGUgd2FzIG5vdCBnaXZlbiwgZm9yY2UgaXQgaW4uICAqLwotICBpZiAobmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT5tb250aCA9PSAwCi0gICAgICAmJiBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPmRheSA9PSAwCi0gICAgICAmJiBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPnllYXIgPT0gMCkKLSAgICB7Ci0gICAgICB0aW1lX3Qgbm93OwotICAgICAgc3RydWN0IHRtICpwdG07Ci0KLSAgICAgIHRpbWUgKCZub3cpOwotICAgICAgcHRtID0gbG9jYWx0aW1lICgmbm93KTsKLSAgICAgIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+bW9udGggPSBwdG0tPnRtX21vbiArIDE7Ci0gICAgICBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPmRheSA9IHB0bS0+dG1fbWRheTsKLSAgICAgIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+eWVhciA9IHB0bS0+dG1feWVhciArIDE5MDA7Ci0gICAgICBzdHJuY3B5ICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpOwotICAgIH0KLQotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotICAvKiBSZXNvbHZlIHRoZSBzdHVicyB3ZSBidWlsZCBmb3IgUG93ZXJQQyBOZXRXYXJlLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcG93ZXJwY19yZXNvbHZlX3N0dWJzIChpbmJmZCwgb3V0YmZkKTsKLSNlbmRpZgotCi0gIC8qIENvcHkgb3ZlciB0aGUgc2VjdGlvbnMuICAqLwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGluYmZkLCBjb3B5X3NlY3Rpb25zLCAoUFRSKSBvdXRiZmQpOwotCi0gIC8qIEZpbmlzaCB1cCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGN1c3RvbV9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChjdXN0b21fc2l6ZSk7Ci0gICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIGN1c3RvbV9zaXplLCBjdXN0b21fZGF0YSkgIT0gY3VzdG9tX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIGN1c3RvbV9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIGN1c3RvbV9zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgY3VzdG9tX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oImN1c3RvbSBzZWN0aW9uIikpOwotCSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+Y3VzdG9tRGF0YU9mZnNldCA9Ci0JICAgIGN1c3RvbV9zZWN0aW9uLT5maWxlcG9zOwotCSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+Y3VzdG9tRGF0YVNpemUgPSBjdXN0b21fc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmICghIGRlYnVnX2luZm8pCi0gICAgewotICAgICAgLyogQXMgYSBzcGVjaWFsIGhhY2ssIHRoZSBiYWNrZW5kIHJlY29nbml6ZXMgYSBkZWJ1Z0luZm9PZmZzZXQKLQkgb2YgLTEgdG8gbWVhbiB0aGF0IGl0IHNob3VsZCBub3Qgb3V0cHV0IGFueSBkZWJ1Z2dpbmcKLQkgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBub3QgYmUgaGFuZGxpbmcgYnkgZmlkZGxpbmcgd2l0aCB0aGUKLQkgc3ltYm9sIHRhYmxlIGJlY2F1c2UgZXhwb3J0ZWQgc3ltYm9scyBhcHBlYXIgaW4gYm90aCB0aGUKLQkgZXhwb3J0IGluZm9ybWF0aW9uIGFuZCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmRlYnVnSW5mb09mZnNldCA9IChmaWxlX3B0cikgLTE7Ci0gICAgfQotICBpZiAobWFwX2ZpbGUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICBfKCIlczogd2FybmluZzogTUFQIGFuZCBGVUxMTUFQIGFyZSBub3Qgc3VwcG9ydGVkOyB0cnkgbGQgLU1cbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgaWYgKGhlbHBfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAoaGVscF9zaXplKTsKLSAgICAgIGlmIChmcmVhZCAoZGF0YSwgMSwgaGVscF9zaXplLCBoZWxwX2RhdGEpICE9IGhlbHBfc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgaGVscF9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIGhlbHBfc2VjdGlvbiwgZGF0YSwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIGhlbHBfc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygiaGVscCBzZWN0aW9uIikpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+aGVscEZpbGVPZmZzZXQgPQotCSAgICBoZWxwX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5oZWxwRmlsZUxlbmd0aCA9IGhlbHBfc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmIChtZXNzYWdlX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKG1lc3NhZ2Vfc2l6ZSk7Ci0gICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIG1lc3NhZ2Vfc2l6ZSwgbWVzc2FnZV9kYXRhKSAhPSBtZXNzYWdlX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIG1lc3NhZ2VfZmlsZSwKLQkJIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBtZXNzYWdlX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBtZXNzYWdlX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oIm1lc3NhZ2Ugc2VjdGlvbiIpKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0ID0KLQkgICAgbWVzc2FnZV9zZWN0aW9uLT5maWxlcG9zOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+bWVzc2FnZUZpbGVMZW5ndGggPSBtZXNzYWdlX3NpemU7Ci0KLQkgIC8qIEZJWE1FOiBBcmUgdGhlc2Ugb2Zmc2V0cyBjb3JyZWN0IG9uIGFsbCBwbGF0Zm9ybXM/ICBBcmUKLQkgICAgIHRoZXkgMzIgYml0cyBvbiBhbGwgcGxhdGZvcm1zPyAgV2hhdCBlbmRpYW5uZXNzPyAgKi8KLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPmxhbmd1YWdlSUQgPQotCSAgICBiZmRfaF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyAxMDYpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+bWVzc2FnZUNvdW50ID0KLQkgICAgYmZkX2hfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgMTEwKTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmIChtb2R1bGVzICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpzZXQ7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGM7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChtb2R1bGVfc2l6ZSk7Ci0gICAgICBjID0gMDsKLSAgICAgIHNldCA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGE7Ci0gICAgICBmb3IgKGwgPSBtb2R1bGVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLQkgICpzZXQgPSBzdHJsZW4gKGwtPnN0cmluZyk7Ci0JICBzdHJuY3B5IChzZXQgKyAxLCBsLT5zdHJpbmcsICpzZXQpOwotCSAgc2V0ICs9ICpzZXQgKyAxOwotCSAgKytjOwotCX0KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBtb2R1bGVfc2VjdGlvbiwgZGF0YSwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIG1vZHVsZV9zaXplKSkKLQliZmRfZmF0YWwgKF8oIm1vZHVsZSBzZWN0aW9uIikpOwotICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9Ci0JbW9kdWxlX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyA9IGM7Ci0gICAgfQotICBpZiAocnBjX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKHJwY19zaXplKTsKLSAgICAgIGlmIChmcmVhZCAoZGF0YSwgMSwgcnBjX3NpemUsIHJwY19kYXRhKSAhPSBycGNfc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgcnBjX2ZpbGUsCi0JCSBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgcnBjX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBycGNfc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygicnBjIHNlY3Rpb24iKSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5SUENEYXRhT2Zmc2V0ID0KLQkgICAgcnBjX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5SUENEYXRhTGVuZ3RoID0gcnBjX3NpemU7Ci0JfQotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgfQotICBpZiAoc2hhcmVsaWJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAoc2hhcmVkX3NpemUpOwotICAgICAgaWYgKGZzZWVrIChzaGFyZWRfZGF0YSwgc2hhcmVkX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGZyZWFkIChkYXRhLCAxLCBzaGFyZWRfc2l6ZSwgc2hhcmVkX2RhdGEpICE9IHNoYXJlZF9zaXplKQotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBzaGFyZWxpYl9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNoYXJlZF9zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgc2hhcmVkX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oInNoYXJlZCBzZWN0aW9uIikpOwotCX0KLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZENvZGVPZmZzZXQgPQotCXNoYXJlZGhkci5jb2RlSW1hZ2VPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoID0KLQlzaGFyZWRoZHIuY29kZUltYWdlU2l6ZTsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZERhdGFPZmZzZXQgPQotCXNoYXJlZGhkci5kYXRhSW1hZ2VPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREYXRhTGVuZ3RoID0KLQlzaGFyZWRoZHIuZGF0YUltYWdlU2l6ZTsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCA9Ci0JKHNoYXJlZGhkci5yZWxvY2F0aW9uRml4dXBPZmZzZXQKLQkgLSBzaGFyZWRfb2Zmc2V0Ci0JICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3MpOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCA9Ci0JKHNoYXJlZGhkci5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQKLQkgLSBzaGFyZWRfb2Zmc2V0Ci0JICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3MpOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCA9Ci0Jc2hhcmVkaGRyLm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUHVibGljc09mZnNldCA9Ci0Jc2hhcmVkaGRyLnB1YmxpY3NPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZlB1YmxpY3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCA9Ci0Jc2hhcmVkaGRyLmRlYnVnSW5mb09mZnNldCAtIHNoYXJlZF9vZmZzZXQgKyBzaGFyZWRfc2VjdGlvbi0+ZmlsZXBvczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZkRlYnVnUmVjb3JkczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPlNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0ID0KLQlzaGFyZWRoZHIuY29kZVN0YXJ0T2Zmc2V0OwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCA9Ci0Jc2hhcmVkaGRyLmV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGxlbiA9IHN0cmxlbiAob3V0cHV0X2ZpbGUpOwotICBpZiAobGVuID4gTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAyKQotICAgIGxlbiA9IE5MTV9NT0RVTEVfTkFNRV9TSVpFIC0gMjsKLSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZVswXSA9IGxlbjsKLQotICBzdHJuY3B5IChubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5tb2R1bGVOYW1lICsgMSwgb3V0cHV0X2ZpbGUsCi0JICAgTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAyKTsKLSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZVtOTE1fTU9EVUxFX05BTUVfU0laRSAtIDFdID0gJ1wwJzsKLSAgZm9yIChtb2RuYW1lID0gbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZTsKLSAgICAgICAqbW9kbmFtZSAhPSAnXDAnOwotICAgICAgIG1vZG5hbWUrKykKLSAgICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICptb2RuYW1lKSkKLSAgICAgICptb2RuYW1lID0gdG91cHBlciAoKm1vZG5hbWUpOwotCi0gIHN0cm5jcHkgKG5sbV92YXJpYWJsZV9oZWFkZXIgKG91dGJmZCktPm9sZFRocmVhZE5hbWUsICIgTE9ORyIsCi0JICAgTkxNX09MRF9USFJFQURfTkFNRV9MRU5HVEgpOwotCi0gIG5sbV9jeWdudXNfZXh0X2hlYWRlciAob3V0YmZkKS0+b2Zmc2V0ID0gc2Vjc2VjLT5maWxlcG9zOwotICBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKG91dGJmZCktPmxlbmd0aCA9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2Vjc2VjKTsKLQotICBpZiAoISBiZmRfY2xvc2UgKG91dGJmZCkpCi0gICAgYmZkX2ZhdGFsIChvdXRwdXRfZmlsZSk7Ci0gIGlmICghIGJmZF9jbG9zZSAoaW5iZmQpKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKHVubGlua19vbl9leGl0ICE9IE5VTEwpCi0gICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBEaXNwbGF5IGEgaGVscCBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNob3dfaGVscCAoKQotewotICBwcmludGYgKF8oIiVzOiBDb252ZXJ0IGFuIG9iamVjdCBmaWxlIGludG8gYSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZVxuIiksCi0JICBwcm9ncmFtX25hbWUpOwotICBzaG93X3VzYWdlIChzdGRvdXQsIDApOwotfQotCi0vKiBTaG93IGEgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlwKLVVzYWdlOiAlcyBbLWRoVl0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLVQgaGVhZGVyLWZpbGVdIFstbCBsaW5rZXJdXG5cCi0gICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLS1oZWFkZXItZmlsZT1maWxlXSBbLS1saW5rZXI9bGlua2VyXSBbLS1kZWJ1Z11cblwKLSAgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXVxuXAotICAgICAgIFtpbi1maWxlIFtvdXQtZmlsZV1dXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoZmlsZSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0MCi0vKiBTZWxlY3QgdGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gdGhlIGlucHV0IGFyY2hpdGVjdHVyZSwgbWFjaGluZSwKLSAgIGFuZCBlbmRpYW5uZXNzLiAgVGhpcyBjaG9vc2VzIHRoZSBhcHByb3ByaWF0ZSBOTE0gdGFyZ2V0LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc2VsZWN0X291dHB1dF9mb3JtYXQgKGFyY2gsIG1hY2gsIGJpZ2VuZGlhbikKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgICAgYm9vbGVhbiBiaWdlbmRpYW47Ci17Ci0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0jaWZkZWYgTkxNQ09OVl9JMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgcmV0dXJuICJubG0zMi1pMzg2IjsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfU1BBUkMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgcmV0dXJuICJubG0zMi1zcGFyYyI7Ci0jZW5kaWYKLSNpZmRlZiBOTE1DT05WX0FMUEhBCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIHJldHVybiAibmxtMzItYWxwaGEiOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgcmV0dXJuICJubG0zMi1wb3dlcnBjIjsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiBmb3IgJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhcmNoLCBtYWNoKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICAgIC8qIEF2b2lkIHdhcm5pbmcuICAqLwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotDAotLyogVGhlIEJGRCBzZWN0aW9ucyBhcmUgY29waWVkIGluIHR3byBwYXNzZXMuICBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMKLSAgIHRoZSBvdXRwdXQgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBzZWN0aW9uLCBhbmQgc2V0cyB1cCB0aGUgc2VjdGlvbgotICAgbmFtZSwgc2l6ZSwgZXRjLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldHVwX3NlY3Rpb25zIChpbmJmZCwgaW5zZWMsIGRhdGFfcHRyKQotICAgICBiZmQgKmluYmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIFBUUiBkYXRhX3B0cjsKLXsKLSAgYmZkICpvdXRiZmQgPSAoYmZkICopIGRhdGFfcHRyOwotICBmbGFnd29yZCBmOwotICBjb25zdCBjaGFyICpvdXRuYW1lOwotICBhc2VjdGlvbiAqb3V0c2VjOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBhbGlnbjsKLSAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0gIGJmZF9zaXplX3R5cGUgc2Vjc2Vjc2l6ZTsKLQotICBmID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpbmJmZCwgaW5zZWMpOwotICBpZiAoZiAmIFNFQ19DT0RFKQotICAgIG91dG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotICBlbHNlIGlmICgoZiAmIFNFQ19MT0FEKSAmJiAoZiAmIFNFQ19IQVNfQ09OVEVOVFMpKQotICAgIG91dG5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOwotICBlbHNlIGlmIChmICYgU0VDX0FMTE9DKQotICAgIG91dG5hbWUgPSBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gIGVsc2UKLSAgICBvdXRuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5iZmQsIGluc2VjKTsKLQotICBvdXRzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBvdXRuYW1lKTsKLSAgaWYgKG91dHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG91dHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgb3V0bmFtZSk7Ci0gICAgICBpZiAob3V0c2VjID09IE5VTEwpCi0JYmZkX2ZhdGFsIChfKCJtYWtlIHNlY3Rpb24iKSk7Ci0gICAgfQotCi0gIGluc2VjLT5vdXRwdXRfc2VjdGlvbiA9IG91dHNlYzsKLQotICBvZmZzZXQgPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYyk7Ci0gIGFsaWduID0gMSA8PCBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBpbnNlYyk7Ci0gIGFkZCA9ICgob2Zmc2V0ICsgYWxpZ24gLSAxKSAmfiAoYWxpZ24gLSAxKSkgLSBvZmZzZXQ7Ci0gIGluc2VjLT5vdXRwdXRfb2Zmc2V0ID0gb2Zmc2V0ICsgYWRkOwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYywKLQkJCSAgICAgIChiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYykKLQkJCSAgICAgICArIGJmZF9zZWN0aW9uX3NpemUgKGluYmZkLCBpbnNlYykKLQkJCSAgICAgICArIGFkZCkpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IHNlY3Rpb24gc2l6ZSIpKTsKLQotICBpZiAoKGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGluc2VjKQotICAgICAgID4gYmZkX3NlY3Rpb25fYWxpZ25tZW50IChvdXRiZmQsIG91dHNlYykpCi0gICAgICAmJiAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG91dGJmZCwgb3V0c2VjLAotCQkJCSAgICAgIGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGluc2VjKSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgc2VjdGlvbiBhbGlnbm1lbnQiKSk7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG91dHNlYywKLQkJCSAgICAgICBmIHwgYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG91dHNlYykpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IHNlY3Rpb24gZmxhZ3MiKSk7Ci0KLSAgYmZkX3NldF9yZWxvYyAob3V0YmZkLCBvdXRzZWMsIChhcmVsZW50ICoqKSBOVUxMLCAwKTsKLQotICAvKiBGb3IgZWFjaCBpbnB1dCBzZWN0aW9uIHdlIGFsbG9jYXRlIHNwYWNlIGZvciBhbiBlbnRyeSBpbgotICAgICAubmxtc2VjdGlvbnMuICAqLwotICBzZWNzZWNzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBzZWNzZWMpOwotICBzZWNzZWNzaXplICs9IHN0cmxlbiAoYmZkX3NlY3Rpb25fbmFtZSAoaW5iZmQsIGluc2VjKSkgKyAxOwotICBzZWNzZWNzaXplID0gKHNlY3NlY3NpemUgKyAzKSAmfiAzOwotICBzZWNzZWNzaXplICs9IDg7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHNlY3NlYywgc2Vjc2Vjc2l6ZSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb25zIHNpemUiKSk7Ci19Ci0KLS8qIENvcHkgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9zZWN0aW9ucyAoaW5iZmQsIGluc2VjLCBkYXRhX3B0cikKLSAgICAgYmZkICppbmJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICBQVFIgZGF0YV9wdHI7Ci17Ci0gIHN0YXRpYyBiZmRfc2l6ZV90eXBlIHNlY3NlY29mZiA9IDA7Ci0gIGJmZCAqb3V0YmZkID0gKGJmZCAqKSBkYXRhX3B0cjsKLSAgY29uc3QgY2hhciAqaW5uYW1lOwotICBhc2VjdGlvbiAqb3V0c2VjOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIFBUUiBjb250ZW50czsKLSAgbG9uZyByZWxvY19zaXplOwotICBiZmRfYnl0ZSBidWZbNF07Ci0gIGJmZF9zaXplX3R5cGUgYWRkOwotCi0gIGlubmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGluYmZkLCBpbnNlYyk7Ci0KLSAgb3V0c2VjID0gaW5zZWMtPm91dHB1dF9zZWN0aW9uOwotICBhc3NlcnQgKG91dHNlYyAhPSBOVUxMKTsKLQotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChpbnNlYyk7Ci0KLSAgLyogRklYTUU6IFdoeSBhcmUgdGhlc2UgbmVjZXNzYXJ5PyAgKi8KLSAgaW5zZWMtPl9jb29rZWRfc2l6ZSA9IGluc2VjLT5fcmF3X3NpemU7Ci0gIGluc2VjLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIGluc2VjKSAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0gICAgY29udGVudHMgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgY29udGVudHMgPSB4bWFsbG9jIChzaXplKTsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5iZmQsIGluc2VjLCBjb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemUpKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaW5iZmQpKTsKLSAgICB9Ci0KLSAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGluYmZkLCBpbnNlYyk7Ci0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGluYmZkKSk7Ci0gIGlmIChyZWxvY19zaXplICE9IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbG9jczsKLSAgICAgIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgICAgIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxvY19zaXplKTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5iZmQsIGluc2VjLCByZWxvY3MsIHN5bWJvbHMpOwotICAgICAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGluYmZkKSk7Ci0gICAgICBtYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCAmcmVsb2NzLCAmcmVsb2NfY291bnQsIChjaGFyICopIGNvbnRlbnRzLAotCQkgICAgIHNpemUpOwotCi0gICAgICAvKiBGSVhNRTogcmVmZXJzIHRvIGludGVybmFsIEJGRCBmaWVsZHMuICAqLwotICAgICAgaWYgKG91dHNlYy0+b3JlbG9jYXRpb24gIT0gKGFyZWxlbnQgKiopIE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSB0b3RhbF9jb3VudDsKLQkgIGFyZWxlbnQgKipjb21iaW5lZDsKLQotCSAgdG90YWxfY291bnQgPSByZWxvY19jb3VudCArIG91dHNlYy0+cmVsb2NfY291bnQ7Ci0JICBjb21iaW5lZCA9IChhcmVsZW50ICoqKSB4bWFsbG9jICh0b3RhbF9jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0JICBtZW1jcHkgKGNvbWJpbmVkLCBvdXRzZWMtPm9yZWxvY2F0aW9uLAotCQkgIG91dHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotCSAgbWVtY3B5IChjb21iaW5lZCArIG91dHNlYy0+cmVsb2NfY291bnQsIHJlbG9jcywKLQkJICAoc2l6ZV90KSAocmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGZyZWUgKG91dHNlYy0+b3JlbG9jYXRpb24pOwotCSAgcmVsb2NfY291bnQgPSB0b3RhbF9jb3VudDsKLQkgIHJlbG9jcyA9IGNvbWJpbmVkOwotCX0KLQotICAgICAgYmZkX3NldF9yZWxvYyAob3V0YmZkLCBvdXRzZWMsIHJlbG9jcywgcmVsb2NfY291bnQpOwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgb3V0c2VjLCBjb250ZW50cywKLQkJCQkgICAgICBpbnNlYy0+b3V0cHV0X29mZnNldCwgc2l6ZSkpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChvdXRiZmQpKTsKLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgLyogQWRkIHRoaXMgc2VjdGlvbiB0byAubmxtc2VjdGlvbnMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgc2Vjc2VjLCAoUFRSKSBpbm5hbWUsIHNlY3NlY29mZiwKLQkJCQkgIHN0cmxlbiAoaW5uYW1lKSArIDEpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOwotICBzZWNzZWNvZmYgKz0gc3RybGVuIChpbm5hbWUpICsgMTsKLQotICBhZGQgPSAoKHNlY3NlY29mZiArIDMpICZ+IDMpIC0gc2Vjc2Vjb2ZmOwotICBpZiAoYWRkICE9IDApCi0gICAgewotICAgICAgYmZkX2hfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSAwLCBidWYpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgYnVmLCBzZWNzZWNvZmYsIGFkZCkpCi0JYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb24gY29udGVudHMiKSk7Ci0gICAgICBzZWNzZWNvZmYgKz0gYWRkOwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIG91dHNlYy0+ZmlsZXBvcywgYnVmKTsKLSAgZWxzZQotICAgIGJmZF9oX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgMCwgYnVmKTsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgYnVmLCBzZWNzZWNvZmYsIDQpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOwotICBzZWNzZWNvZmYgKz0gNDsKLQotICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIHNpemUsIGJ1Zik7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzZWNzZWMsIGJ1Ziwgc2Vjc2Vjb2ZmLCA0KSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIpKTsKLSAgc2Vjc2Vjb2ZmICs9IDQ7Ci19Ci0KLS8qIFNvbWUsIHBlcmhhcHMgYWxsLCBOZXRXYXJlIHRhcmdldHMgcmVxdWlyZSBjaGFuZ2luZyB0aGUgcmVsb2NzIHVzZWQKLSAgIGJ5IHRoZSBpbnB1dCBmb3JtYXRzLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCi0JICAgICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAob3V0YmZkKSkKLSAgICB7Ci0jaWZkZWYgTkxNQ09OVl9JMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaTM4Nl9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCi0JCQkgIGNvbnRlbnRzLCBjb250ZW50c19zaXplKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9BTFBIQQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBhbHBoYV9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCi0JCQkgICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIHBvd2VycGNfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLAotCQkJICAgICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBkZWZhdWx0X21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwKLQkJCSAgICAgY29udGVudHMsIGNvbnRlbnRzX3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBCeSBkZWZhdWx0IGFsbCB3ZSBuZWVkIHRvIGRvIGZvciByZWxvY3MgaXMgY2hhbmdlIHRoZSBhZGRyZXNzIGJ5Ci0gICB0aGUgb3V0cHV0X29mZnNldC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWRlZmF1bHRfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkJICAgICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICBpZiAoaW5zZWMtPm91dHB1dF9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX2NvdW50OwotICAgICAgcmVnaXN0ZXIgYXJlbGVudCAqKnJlbG9jczsKLSAgICAgIHJlZ2lzdGVyIGxvbmcgaTsKLQotICAgICAgcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOwotICAgICAgcmVsb2NzID0gKnJlbG9jc19wdHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKywgcmVsb2NzKyspCi0JKCpyZWxvY3MpLT5hZGRyZXNzICs9IGluc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLX0KLQwKLSNpZmRlZiBOTE1DT05WX0kzODYKLQotLyogTmV0V2FyZSBvbiB0aGUgaTM4NiBzdXBwb3J0cyBhIHJlc3RyaWN0ZWQgc2V0IG9mIHJlbG9jcywgd2hpY2ggYXJlCi0gICBkaWZmZXJlbnQgZnJvbSB0aG9zZSB1c2VkIG9uIG90aGVyIGkzODYgdGFyZ2V0cy4gIFRoaXMgcm91dGluZQotICAgY29udmVydHMgdGhlIHJlbG9jcy4gIEl0IGlzLCBvYnZpb3VzbHksIHZlcnkgdGFyZ2V0IGRlcGVuZGVudC4gIEF0Ci0gICB0aGUgbW9tZW50LCB0aGUgbmxtMzItaTM4NiBiYWNrZW5kIHBlcmZvcm1zIHNpbWlsYXIgdHJhbnNsYXRpb25zOwotICAgaG93ZXZlciwgaXQgaXMgbW9yZSByZWxpYWJsZSBhbmQgZWZmaWNpZW50IHRvIGRvIHRoZW0gaGVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9pMzg2X3BjcmVsX2hvd3RvID0KLSAgSE9XVE8gKDEsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotaTM4Nl9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCQkgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIGxvbmcgcmVsb2NfY291bnQsIGk7Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0KLSAgcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOwotICByZWxvY3MgPSAqcmVsb2NzX3B0cjsKLSAgZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJlbCA9ICpyZWxvY3MrKzsKLSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gICAgICAvKiBXZSdyZSBtb3ZpbmcgdGhlIHJlbG9jcyBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQKLQkgc2VjdGlvbiwgc28gd2UgbXVzdCBhZGp1c3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nbHkuICAqLwotICAgICAgYWRkcmVzcyA9IHJlbC0+YWRkcmVzczsKLSAgICAgIHJlbC0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKLQotICAgICAgLyogTm90ZSB0aGF0IG5vIHNlcmlvdXMgaGFybSB3aWxsIGVuc3VlIGlmIHdlIGZhaWwgdG8gY2hhbmdlIGEKLQkgcmVsb2MuICBUaGUgYmFja2VuZCB3aWxsIGZhaWwgd2hlbiB3cml0aW5nIG91dCB0aGUgcmVsb2MuICAqLwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyByZWxvYyBpcyB3aXRoaW4gdGhlIGRhdGEgd2UgaGF2ZS4gIFdlIHVzZSBvbmx5Ci0JIDQgYnl0ZSByZWxvY3MgaGVyZSwgc28gd2UgaW5zaXN0IG9uIGhhdmluZyA0IGJ5dGVzLiAgKi8KLSAgICAgIGlmIChhZGRyZXNzICsgNCA+IGNvbnRlbnRzX3NpemUpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgZW50aXJlbHkgd2l0aGluIGEgc2luZ2xlIHNlY3Rpb24gaXMKLQkgY29tcGxldGVseSB1bm5lY2Vzc2FyeS4gIFRoaXMgY2FuIGJlIGdlbmVyYXRlZCBieSBsZCAtci4gICovCi0gICAgICBpZiAoc3ltID09IGluc2VjLT5zeW1ib2wKLQkgICYmIHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmICEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCXsKLQkgIC0tKnJlbG9jX2NvdW50X3B0cjsKLQkgIC0tcmVsb2NzOwotCSAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAotCQkgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gaSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBhbW91bnQgdGhlIHJlbG9jYXRpb24gd2lsbCBhZGQgaW4uICAqLwotICAgICAgYWRkZW5kID0gcmVsLT5hZGRlbmQgKyBzeW0tPnZhbHVlOwotCi0gICAgICAvKiBOZXRXYXJlIGRvZXNuJ3Qgc3VwcG9ydCBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBkZWZpbmVkCi0JIHN5bWJvbHMsIHNvIHdlIGhhdmUgdG8gZWxpbWluYXRlIHRoZW0gYnkgZG9pbmcgdGhlIHJlbG9jYXRpb24KLQkgbm93LiAgV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgcmVsb2MgaXMgd2l0aGluIGEgc2luZ2xlCi0JIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSA9PSBpbnNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIGlmIChyZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JICAgIGFkZGVuZCAtPSBhZGRyZXNzOwotCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCSAgdmFsICs9IGFkZGVuZDsKLQkgIGJmZF9wdXRfMzIgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQotCSAgLS0qcmVsb2NfY291bnRfcHRyOwotCSAgLS1yZWxvY3M7Ci0JICBtZW1tb3ZlIChyZWxvY3MsIHJlbG9jcyArIDEsCi0JCSAgIChzaXplX3QpICgocmVsb2NfY291bnQgLSBpKSAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOZXRXYXJlIGRvZXNuJ3Qgc3VwcG9ydCByZWxvYyBhZGRlbmRzLCBzbyB3ZSBnZXQgcmlkIG9mIHRoZW0KLQkgaGVyZSBieSBzaW1wbHkgYWRkaW5nIHRoZW0gaW50byB0aGUgb2JqZWN0IGRhdGEuICBXZSBoYW5kbGUKLQkgdGhlIHN5bWJvbCB2YWx1ZSwgaWYgYW55LCB0aGUgc2FtZSB3YXkuICAqLwotICAgICAgaWYgKGFkZGVuZCAhPSAwCi0JICAmJiByZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQkgIHZhbCArPSBhZGRlbmQ7Ci0JICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0KLQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgZm9yIHRoZSBjaGFuZ2VzIHdlIGp1c3QgbWFkZS4gICovCi0JICByZWwtPmFkZGVuZCA9IDA7Ci0JICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgLyogTmV0V2FyZSB1c2VzIGEgcmVsb2Mgd2l0aCBwY3JlbF9vZmZzZXQgc2V0LiAgV2UgYWRqdXN0Ci0JIHBjX3JlbGF0aXZlIHJlbG9jcyBhY2NvcmRpbmdseS4gIFdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlCi0JIGhvd3RvIGZpZWxkLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHRoZSBjdXJyZW50IG9uZSBpcwotCSBjb21wYXRpYmxlLiAgV2Ugc2hvdWxkIGNoZWNrIHRoYXQgc3BlY2lhbF9mdW5jdGlvbiBpcyBOVUxMCi0JIGhlcmUsIGJ1dCBhdCB0aGUgbW9tZW50IGNvZmYtaTM4NiB1c2VzIGEgc3BlY2lhbF9mdW5jdGlvbgotCSB3aGljaCBkb2VzIG5vdCBhZmZlY3Qgd2hhdCB3ZSBhcmUgZG9pbmcgaGVyZS4gICovCi0gICAgICBpZiAocmVsLT5ob3d0byAhPSBOVUxMCi0JICAmJiByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSAgJiYgISByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgLyogV2hlbiBwY3JlbF9vZmZzZXQgaXMgbm90IHNldCwgaXQgbWVhbnMgdGhhdCB0aGUgbmVnYXRpdmUKLQkgICAgIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgbG9jYXRpb24gaXMgc3RvcmVkIGluIHRoZQotCSAgICAgbWVtb3J5IGxvY2F0aW9uLiAgV2UgbXVzdCBhZGQgaXQgYmFjayBpbi4gICovCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCSAgdmFsICs9IGFkZHJlc3M7Ci0JICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0KLQkgIC8qIFdlIG11c3QgY2hhbmdlIHRvIGEgbmV3IGhvd3RvLiAgKi8KLQkgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfcGNyZWxfaG93dG87Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qIE5MTUNPTlZfSTM4NiAqLwotDAotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLQotLyogT24gdGhlIEFscGhhIHRoZSBmaXJzdCByZWxvYyBmb3IgZXZlcnkgc2VjdGlvbiBtdXN0IGJlIGEgc3BlY2lhbAotICAgcmVsb2NzIHdoaWNoIGhvbGQgdGhlIEdQIGFkZHJlc3MuICBBbHNvLCB0aGUgZmlyc3QgcmVsb2MgaW4gdGhlCi0gICBmaWxlIG11c3QgYmUgYSBzcGVjaWFsIHJlbG9jIHdoaWNoIGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSAubGl0YQotICAgc2VjdGlvbi4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX2FscGhhX253X2hvd3RvID0KLSAgSE9XVE8gKEFMUEhBX1JfTldfUkVMT0MsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5XX1JFTE9DIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotYWxwaGFfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkJICAgICBjb250ZW50c19zaXplKQotICAgICBiZmQgKm91dGJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICByZWdpc3RlciBhcmVsZW50ICoqKnJlbG9jc19wdHI7Ci0gICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKLSAgICAgY2hhciAqY29udGVudHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKLXsKLSAgbG9uZyBvbGRfcmVsb2NfY291bnQ7Ci0gIGFyZWxlbnQgKipvbGRfcmVsb2NzOwotICByZWdpc3RlciBhcmVsZW50ICoqcmVsb2NzOwotCi0gIG9sZF9yZWxvY19jb3VudCA9ICpyZWxvY19jb3VudF9wdHI7Ci0gIG9sZF9yZWxvY3MgPSAqcmVsb2NzX3B0cjsKLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKChvbGRfcmVsb2NfY291bnQgKyAzKSAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICpyZWxvY3NfcHRyID0gcmVsb2NzOwotCi0gIGlmIChubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3MgPT0gMCkKLSAgICB7Ci0gICAgICBiZmQgKmluYmZkOwotICAgICAgYXNlY3Rpb24gKmxpdGFfc2VjdGlvbjsKLQotICAgICAgaW5iZmQgPSBpbnNlYy0+b3duZXI7Ci0gICAgICBsaXRhX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5iZmQsIF9MSVRBKTsKLSAgICAgIGlmIChsaXRhX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9hZGRyZXNzID0KLQkgICAgYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5iZmQsIGxpdGFfc2VjdGlvbik7Ci0JICBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX3NpemUgPQotCSAgICBiZmRfc2VjdGlvbl9zaXplIChpbmJmZCwgbGl0YV9zZWN0aW9uKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQXZvaWQgb3V0cHV0dGluZyB0aGlzIHJlbG9jIGFnYWluLiAgKi8KLQkgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfYWRkcmVzcyA9IDQ7Ci0JfQotCi0gICAgICAqcmVsb2NzID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICAoKnJlbG9jcyktPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICAoKnJlbG9jcyktPmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3M7Ci0gICAgICAoKnJlbG9jcyktPmFkZGVuZCA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfc2l6ZSArIDE7Ci0gICAgICAoKnJlbG9jcyktPmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOwotICAgICAgKytyZWxvY3M7Ci0gICAgICArKygqcmVsb2NfY291bnRfcHRyKTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBHUCB2YWx1ZSBmcm9tIGJmZC4gICovCi0gIGlmIChubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5ncCA9PSAwKQotICAgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmdwID0KLSAgICAgIGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUgKGluc2VjLT5vd25lcik7Ci0KLSAgKnJlbG9jcyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAoKnJlbG9jcyktPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICgqcmVsb2NzKS0+YWRkcmVzcyA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmdwOwotICAoKnJlbG9jcyktPmFkZGVuZCA9IDA7Ci0gICgqcmVsb2NzKS0+aG93dG8gPSAmbmxtMzJfYWxwaGFfbndfaG93dG87Ci0gICsrcmVsb2NzOwotICArKygqcmVsb2NfY291bnRfcHRyKTsKLQotICBtZW1jcHkgKChQVFIpIHJlbG9jcywgKFBUUikgb2xkX3JlbG9jcywKLQkgIChzaXplX3QpIG9sZF9yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gIHJlbG9jc1tvbGRfcmVsb2NfY291bnRdID0gKGFyZWxlbnQgKikgTlVMTDsKLQotICBmcmVlIChvbGRfcmVsb2NzKTsKLQotICBpZiAoaW5zZWMtPm91dHB1dF9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAoYmZkX3NpemVfdHlwZSkgb2xkX3JlbG9jX2NvdW50OyBpKyssIHJlbG9jcysrKQotCSgqcmVsb2NzKS0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBOTE1DT05WX0FMUEhBICovCi0MCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0KLS8qIFdlIGtlZXAgYSBsaW5rZWQgbGlzdCBvZiBzdHVicyB3aGljaCB3ZSBtdXN0IGJ1aWxkLiAgQmVjYXVzZSBCRkQKLSAgIHJlcXVpcmVzIHVzIHRvIGtub3cgdGhlIHNpemVzIG9mIGFsbCBzZWN0aW9ucyBiZWZvcmUgd2UgY2FuIHNldCB0aGUKLSAgIGNvbnRlbnRzIG9mIGFueSwgd2UgbXVzdCBmaWd1cmUgb3V0IHdoaWNoIHN0dWJzIHdlIHdhbnQgdG8gYnVpbGQKLSAgIGJlZm9yZSB3ZSBjYW4gYWN0dWFsbHkgYnVpbGQgYW55IG9mIHRoZW0uICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19zdHViCi17Ci0gIC8qIE5leHQgc3R1YiBpbiBsaW5rZWQgbGlzdC4gICovCi0gIHN0cnVjdCBwb3dlcnBjX3N0dWIgKm5leHQ7Ci0KLSAgLyogU3ltYm9sIHdob3NlIHZhbHVlIGlzIHRoZSBzdGFydCBvZiB0aGUgc3R1Yi4gIFRoaXMgaXMgYSBzeW1ib2wKLSAgICAgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBgLicuICAqLwotICBhc3ltYm9sICpzdGFydDsKLQotICAvKiBTeW1ib2wgd2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIHJlbG9jIGFnYWluc3QuICBUaGlzIGlzIGEgc3ltYm9sCi0gICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBTVEFSVCBidXQgd2l0aG91dCB0aGUgbGVhZGluZyBgLicuICAqLwotICBhc3ltYm9sICpyZWxvYzsKLQotICAvKiBUaGUgVE9DIGluZGV4IGZvciB0aGlzIHN0dWIuICBUaGlzIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBUT0MKLSAgICAgc2VjdGlvbiBhdCB3aGljaCB0aGUgcmVsb2MgaXMgY3JlYXRlZC4gICovCi0gIHVuc2lnbmVkIGludCB0b2NfaW5kZXg7Ci19OwotCi0vKiBUaGUgbGlua2VkIGxpc3Qgb2Ygc3R1YnMuICAqLwotCi1zdGF0aWMgc3RydWN0IHBvd2VycGNfc3R1YiAqcG93ZXJwY19zdHViczsKLQotLyogVGhpcyBpcyB3aGF0IGEgc3R1YiBsb29rcyBsaWtlLiAgVGhlIGZpcnN0IGluc3RydWN0aW9uIHdpbGwgZ2V0Ci0gICBhZGp1c3RlZCB3aXRoIHRoZSBjb3JyZWN0IFRPQyBpbmRleC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VycGNfc3R1Yl9pbnNuc1tdID0KLXsKLSAgMHg4MTgyMDAwMCwJCS8qIGx3egkgcjEyLDAocjIpICovCi0gIDB4OTA0MTAwMTQsCQkvKiBzdHcJIHIyLDIwKHIxKSAqLwotICAweDgwMGMwMDAwLAkJLyogbHd6CSByMCwwKHIxMikgKi8KLSAgMHg4MDRjMDAwNCwJCS8qIGx3egkgcjIscihyMTIpICovCi0gIDB4N2MwOTAzYTYsCQkvKiBtdGN0ciByMCAqLwotICAweDRlODAwNDIwLAkJLyogYmN0ciAqLwotICAwLAkJCS8qIFRyYWNlYmFjayB0YWJsZS4gICovCi0gIDB4YzgwMDAsCi0gIDAKLX07Ci0KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX0lOU05fQ09VTlQgXAotICAoc2l6ZW9mIHBvd2VycGNfc3R1Yl9pbnNucyAvIHNpemVvZiBwb3dlcnBjX3N0dWJfaW5zbnNbMF0pCi0KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX1NJWkUgKDQgKiBQT1dFUlBDX1NUVUJfSU5TTl9DT1VOVCkKLQotLyogRWFjaCBzdHViIHVzZXMgYSBmb3VyIGJ5dGUgVE9DIGVudHJ5LiAgKi8KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX1RPQ19FTlRSWV9TSVpFICg0KQotCi0vKiBUaGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZTsKLQotLyogTG9vayBmb3IgYWxsIHVuZGVmaW5lZCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoIGAuJywgYW5kIHByZXBhcmUgdG8KLSAgIGJ1aWxkIGEgc3R1YiBmb3IgZWFjaCBvbmUuICAqLwotCi1zdGF0aWMgdm9pZAotcG93ZXJwY19idWlsZF9zdHVicyAoaW5iZmQsIG91dGJmZCwgc3ltYm9sc19wdHIsIHN5bWNvdW50X3B0cikKLSAgICAgYmZkICppbmJmZDsKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzeW1ib2wgKioqc3ltYm9sc19wdHI7Ci0gICAgIGxvbmcgKnN5bWNvdW50X3B0cjsKLXsKLSAgYXNlY3Rpb24gKnN0dWJfc2VjOwotICBhc2VjdGlvbiAqZ290X3NlYzsKLSAgdW5zaWduZWQgaW50IGdvdF9iYXNlOwotICBsb25nIGk7Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIGxvbmcgc3R1YmNvdW50OwotCi0gIC8qIE1ha2UgYSBzZWN0aW9uIHRvIGhvbGQgc3R1YnMuICBXZSBkb24ndCBzZXQgU0VDX0hBU19DT05URU5UUyBmb3IKLSAgICAgdGhlIHNlY3Rpb24gdG8gcHJldmVudCBjb3B5X3NlY3Rpb25zIGZyb20gcmVhZGluZyBmcm9tIGl0LiAgKi8KLSAgc3R1Yl9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChpbmJmZCwgIi5zdHVicyIpOwotICBpZiAoc3R1Yl9zZWMgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChpbmJmZCwgc3R1Yl9zZWMsCi0JCQkJICAoU0VDX0NPREUKLQkJCQkgICB8IFNFQ19SRUxPQwotCQkJCSAgIHwgU0VDX0FMTE9DCi0JCQkJICAgfCBTRUNfTE9BRCkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBzdHViX3NlYywgMikpCi0gICAgYmZkX2ZhdGFsICgiLnN0dWJzIik7Ci0KLSAgLyogR2V0IHRoZSBUT0Mgc2VjdGlvbiwgd2hpY2ggaXMgbmFtZWQgLmdvdC4gICovCi0gIGdvdF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5iZmQsICIuZ290Iik7Ci0gIGlmIChnb3Rfc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGdvdF9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChpbmJmZCwgIi5nb3QiKTsKLSAgICAgIGlmIChnb3Rfc2VjID09IChhc2VjdGlvbiAqKSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIGdvdF9zZWMsCi0JCQkJICAgICAgKFNFQ19EQVRBCi0JCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgIHwgU0VDX0FMTE9DCi0JCQkJICAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGdvdF9zZWMsIDIpKQotCWJmZF9mYXRhbCAoIi5nb3QiKTsKLSAgICB9Ci0KLSAgcG93ZXJwY19pbml0aWFsX2dvdF9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoaW5iZmQsIGdvdF9zZWMpOwotICBnb3RfYmFzZSA9IHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZTsKLSAgZ290X2Jhc2UgPSAoZ290X2Jhc2UgKyAzKSAmfiAzOwotCi0gIHN0dWJjb3VudCA9IDA7Ci0KLSAgc3ltY291bnQgPSAqc3ltY291bnRfcHRyOwotICBmb3IgKGkgPSAwOyBpIDwgc3ltY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBhc3ltYm9sICpuZXdzeW07Ci0gICAgICBjaGFyICpuZXduYW1lOwotICAgICAgc3RydWN0IHBvd2VycGNfc3R1YiAqaXRlbTsKLQotICAgICAgc3ltID0gKCpzeW1ib2xzX3B0cilbaV07Ci0KLSAgICAgIC8qIFdlIG11c3QgbWFrZSBhIHN0dWIgZm9yIGV2ZXJ5IHVuZGVmaW5lZCBzeW1ib2wgd2hvc2UgbmFtZQotCSBzdGFydHMgd2l0aCAnLicuICAqLwotICAgICAgaWYgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gIT0gJy4nCi0JICB8fCAhIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSBhIG5ldyB1bmRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgd2l0aG91dAotCSB0aGUgbGVhZGluZyBgLicuICAqLwotICAgICAgbmV3c3ltID0gKGFzeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sKSk7Ci0gICAgICAqbmV3c3ltID0gKnN5bTsKLSAgICAgIG5ld25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpKTsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSArIDEpOwotICAgICAgbmV3c3ltLT5uYW1lID0gbmV3bmFtZTsKLQotICAgICAgLyogRGVmaW5lIHRoZSBgLicgc3ltYm9sIHRvIGJlIGluIHRoZSBzdHViIHNlY3Rpb24uICAqLwotICAgICAgc3ltLT5zZWN0aW9uID0gc3R1Yl9zZWM7Ci0gICAgICBzeW0tPnZhbHVlID0gc3R1YmNvdW50ICogUE9XRVJQQ19TVFVCX1NJWkU7Ci0gICAgICAvKiBXZSBzZXQgdGhlIEJTRl9EWU5BTUlDIGZsYWcgaGVyZSBzbyB0aGF0IHdlIGNhbiBjaGVjayBpdCB3aGVuCi0JIHdlIGFyZSBtYW5nbGluZyByZWxvY3MuICBGSVhNRTogVGhpcyBpcyBhIGhhY2suICAqLwotICAgICAgc3ltLT5mbGFncyA9IEJTRl9MT0NBTCB8IEJTRl9EWU5BTUlDOwotCi0gICAgICAvKiBBZGQgdGhpcyBzdHViIHRvIHRoZSBsaW5rZWQgbGlzdC4gICovCi0gICAgICBpdGVtID0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcG93ZXJwY19zdHViKSk7Ci0gICAgICBpdGVtLT5zdGFydCA9IHN5bTsKLSAgICAgIGl0ZW0tPnJlbG9jID0gbmV3c3ltOwotICAgICAgaXRlbS0+dG9jX2luZGV4ID0gZ290X2Jhc2UgKyBzdHViY291bnQgKiBQT1dFUlBDX1NUVUJfVE9DX0VOVFJZX1NJWkU7Ci0KLSAgICAgIGl0ZW0tPm5leHQgPSBwb3dlcnBjX3N0dWJzOwotICAgICAgcG93ZXJwY19zdHVicyA9IGl0ZW07Ci0gICAgICAKLSAgICAgICsrc3R1YmNvdW50OwotICAgIH0KLQotICBpZiAoc3R1YmNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICoqczsKLSAgICAgIHN0cnVjdCBwb3dlcnBjX3N0dWIgKmw7Ci0KLSAgICAgIC8qIEFkZCB0aGUgbmV3IHN5bWJvbHMgd2UganVzdCBjcmVhdGVkIHRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgKnN5bWJvbHNfcHRyID0gKGFzeW1ib2wgKiopIHhyZWFsbG9jICgoY2hhciAqKSAqc3ltYm9sc19wdHIsCi0JCQkJCSAgICAoKHN5bWNvdW50ICsgc3R1YmNvdW50KQotCQkJCQkgICAgICogc2l6ZW9mIChhc3ltYm9sKSkpOwotICAgICAgKnN5bWNvdW50X3B0ciArPSBzdHViY291bnQ7Ci0gICAgICBzID0gJigqc3ltYm9sc19wdHIpW3N5bWNvdW50XTsKLSAgICAgIGZvciAobCA9IHBvd2VycGNfc3R1YnM7IGwgIT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0JKnMrKyA9IGwtPnJlbG9jOwotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5zdHVicyBzZWN0aW9uIGFuZCBpbmNyZWFzZSB0aGUgc2l6ZSBvZgotCSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChpbmJmZCwgc3R1Yl9zZWMsCi0JCQkJICBzdHViY291bnQgKiBQT1dFUlBDX1NUVUJfU0laRSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGluYmZkLCBnb3Rfc2VjLAotCQkJCSAgICAgKGdvdF9iYXNlCi0JCQkJICAgICAgKyAoc3R1YmNvdW50Ci0JCQkJCSAqIFBPV0VSUENfU1RVQl9UT0NfRU5UUllfU0laRSkpKSkKLQliZmRfZmF0YWwgKF8oInN0dWIgc2VjdGlvbiBzaXplcyIpKTsKLSAgICB9Ci19Ci0KLS8qIFJlc29sdmUgYWxsIHRoZSBzdHVicyBmb3IgUG93ZXJQQyBOZXRXYXJlLiAgV2UgZmlsbCBpbiB0aGUgY29udGVudHMKLSAgIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiwgYW5kIGNyZWF0ZSBuZXcgcmVsb2NzIGluIHRoZSBUT0MuICAqLwotCi1zdGF0aWMgdm9pZAotcG93ZXJwY19yZXNvbHZlX3N0dWJzIChpbmJmZCwgb3V0YmZkKQotICAgICBiZmQgKmluYmZkOwotICAgICBiZmQgKm91dGJmZDsKLXsKLSAgYmZkX2J5dGUgYnVmW1BPV0VSUENfU1RVQl9TSVpFXTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBzdHViY291bnQ7Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIGFzZWN0aW9uICpnb3Rfc2VjOwotICBhcmVsZW50ICoqcjsKLSAgc3RydWN0IHBvd2VycGNfc3R1YiAqbDsKLQotICBpZiAocG93ZXJwY19zdHVicyA9PSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKGkgPSAwOyBpIDwgUE9XRVJQQ19TVFVCX0lOU05fQ09VTlQ7IGkrKykKLSAgICBiZmRfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBwb3dlcnBjX3N0dWJfaW5zbnNbaV0sIGJ1ZiArIGkgKiA0KTsKLQotICBnb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCAiLmdvdCIpOwotICBhc3NlcnQgKGdvdF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpOwotICBhc3NlcnQgKGdvdF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSAoYXJlbGVudCAqKikgTlVMTCk7Ci0KLSAgc3R1YmNvdW50ID0gMDsKLSAgZm9yIChsID0gcG93ZXJwY19zdHViczsgbCAhPSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICArK3N0dWJjb3VudDsKLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHN0dWJjb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0KLSAgciA9IHJlbG9jczsKLSAgZm9yIChsID0gcG93ZXJwY19zdHViczsgbCAhPSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWxvYzsKLQotICAgICAgLyogQWRqdXN0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byB1c2UgdGhlIHJpZ2h0IFRPQyBpbmRleC4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBwb3dlcnBjX3N0dWJfaW5zbnNbMF0gKyBsLT50b2NfaW5kZXgsIGJ1Zik7Ci0KLSAgICAgIC8qIFdyaXRlIHRoaXMgc3R1YiBvdXQuICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsCi0JCQkJICAgICAgYmZkX2dldF9zZWN0aW9uIChsLT5zdGFydCksCi0JCQkJICAgICAgYnVmLAotCQkJCSAgICAgIGwtPnN0YXJ0LT52YWx1ZSwKLQkJCQkgICAgICBQT1dFUlBDX1NUVUJfU0laRSkpCi0JYmZkX2ZhdGFsIChfKCJ3cml0aW5nIHN0dWIiKSk7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIG5ldyByZWxvYyBmb3IgdGhlIFRPQyBlbnRyeS4gICovCi0gICAgICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmwtPnJlbG9jOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBsLT50b2NfaW5kZXggKyBnb3Rfc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmVsb2MtPmFkZGVuZCA9IDA7Ci0gICAgICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGluYmZkLCBCRkRfUkVMT0NfMzIpOwotCQkJCSAgICAgIAotICAgICAgKnIrKyA9IHJlbG9jOwotICAgIH0KLQotICBiZmRfc2V0X3JlbG9jIChvdXRiZmQsIGdvdF9zZWMtPm91dHB1dF9zZWN0aW9uLCByZWxvY3MsIHN0dWJjb3VudCk7Ci19Ci0KLS8qIEFkanVzdCByZWxvY2F0aW9uIGVudHJpZXMgZm9yIFBvd2VyUEMgTmV0V2FyZS4gIFdlIGRvIG5vdCBvdXRwdXQKLSAgIFRPQyByZWxvY2F0aW9ucy4gIFRoZSBvYmplY3QgY29kZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBvZmZzZXQgZnJvbQotICAgdGhlIFRPQyBwb2ludGVyLiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgVE9DIHJlZ2lzdGVyLAotICAgcjIsIHdpbGwgYmUgc2V0IHRvIHRoZSBjb3JyZWN0IFRPQyB2YWx1ZSwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IKLSAgIGFueSBmdXJ0aGVyIHJlbG9jLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotcG93ZXJwY19tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCQkgICAgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgcmVnaXN0ZXIgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKnRvY19ob3d0bzsKLSAgbG9uZyByZWxvY19jb3VudDsKLSAgcmVnaXN0ZXIgYXJlbGVudCAqKnJlbG9jczsKLSAgcmVnaXN0ZXIgbG9uZyBpOwotCi0gIHRvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoaW5zZWMtPm93bmVyLCBCRkRfUkVMT0NfUFBDX1RPQzE2KTsKLSAgaWYgKHRvY19ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIC5nb3Qgc2VjdGlvbiwgY2xlYXIgb3V0IGFsbCB0aGUgY29udGVudHMgYmV5b25kCi0gICAgIHRoZSBpbml0aWFsIHNpemUuICBXZSBtdXN0IGRvIHRoaXMgaGVyZSBiZWNhdXNlIGNvcHlfc2VjdGlvbnMgaXMKLSAgICAgZ29pbmcgdG8gd3JpdGUgb3V0IHdoYXRldmVyIHdlIHJldHVybiBpbiB0aGUgY29udGVudHMgZmllbGQuICAqLwotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5zZWMtPm93bmVyLCBpbnNlYyksICIuZ290IikgPT0gMCkKLSAgICBtZW1zZXQgKGNvbnRlbnRzICsgcG93ZXJwY19pbml0aWFsX2dvdF9zaXplLCAwLAotCSAgICAoc2l6ZV90KSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2MgKGluc2VjKQotCQkgICAgICAtIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZSkpOwotCi0gIHJlbG9jX2NvdW50ID0gKnJlbG9jX2NvdW50X3B0cjsKLSAgcmVsb2NzID0gKnJlbG9jc19wdHI7Ci0gIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGJmZF92bWEgc3ltX3ZhbHVlOwotCi0gICAgICByZWwgPSAqcmVsb2NzKys7Ci0gICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAgICAgLyogQ29udmVydCBhbnkgcmVsb2NzIGFnYWluc3QgdGhlIC5ic3Mgc2VjdGlvbiBpbnRvIHJlbG9jcwotICAgICAgICAgYWdhaW5zdCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0YmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpLAotCQkgIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSkgPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqZGF0YXNlYzsKLQotCSAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsCi0JCQkJCSAgICAgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0JICBpZiAoZGF0YXNlYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgcmVsLT5hZGRlbmQgKz0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dGJmZCwKLQkJCQkJCSAgIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkJCSAgICAgICsgc3ltLT52YWx1ZSk7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGRhdGFzZWMtPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBtdXN0IGJlIGFibGUgdG8gcmVzb2x2ZSBhbGwgUEMgcmVsYXRpdmUgcmVsb2NzIGF0IHRoaXMKLQkgcG9pbnQuICBJZiB3ZSBnZXQgYSBicmFuY2ggdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCB3ZSBidWlsZCBhCi0JIHN0dWIsIHNpbmNlIE5ldFdhcmUgd2lsbCByZXNvbHZlIHVuZGVmaW5lZCBzeW1ib2xzIGludG8gYQotCSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gICovCi0gICAgICBpZiAocmVsLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JewotCSAgLyogVGhpcyBjaGVjayBmb3Igd2hldGhlciBhIHN5bWJvbCBpcyBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzCi0JICAgICB0aGUgcmVsb2Mgd2lsbCBiZSB3cm9uZyBpZiB0aGVyZSBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jCi0JICAgICBiZXR3ZWVuIHR3byBzZWN0aW9ucyBib3RoIG9mIHdoaWNoIHdlcmUgcGxhY2VkIGluIHRoZQotCSAgICAgc2FtZSBvdXRwdXQgc2VjdGlvbi4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSAhPSBpbnNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVzb2x2ZWQgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCAlc1xuIiksCi0JCSAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvLT5zaXplID09IDIgJiYgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KTsKLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgdmFsID0gKCh2YWwgJn4gcmVsLT5ob3d0by0+ZHN0X21hc2spCi0JCSAgICAgfCAoKCh2YWwgJiByZWwtPmhvd3RvLT5zcmNfbWFzaykKLQkJCSArIChzeW0tPnZhbHVlIC0gcmVsLT5hZGRyZXNzKQotCQkJICsgcmVsLT5hZGRlbmQpCi0JCQkmIHJlbC0+aG93dG8tPmRzdF9tYXNrKSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYW4gc3R1YmJlZCBzeW1ib2wgYW5kIHRoZQotCQkgbmV4dCBpbnN0cnVjdGlvbiBpcwotCQkgICAgIGNyb3IgMzEsMzEsMzEKLQkJIHRoZW4gd2UgcmVwbGFjZSB0aGUgbmV4dCBpbnN0cnVjdGlvbiB3aXRoCi0JCSAgICAgbHd6ICByMiwyMChyMSkKLQkJIFRoaXMgcmVsb2FkcyB0aGUgVE9DIHBvaW50ZXIgYWZ0ZXIgYSBzdHViIGNhbGwuICAqLwotCSAgICAgIGlmIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pWzBdID09ICcuJwotCQkgICYmIChzeW0tPmZsYWdzICYgQlNGX0RZTkFNSUMpICE9IDAKLQkJICAmJiAoYmZkX2dldF8zMiAob3V0YmZkLAotCQkJCSAgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzICsgNCkKLQkJICAgICAgPT0gMHg0ZmZmZmI4MikpIC8qIGNyb3IgMzEsMzEsMzEgKi8KLQkJYmZkX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgMHg4MDQxMDAxNCwgLyogbHd6IHIyLDIwKHIxKSAqLwotCQkJICAgIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyArIDQpOwotCi0JICAgICAgLS0qcmVsb2NfY291bnRfcHRyOwotCSAgICAgIC0tcmVsb2NzOwotCSAgICAgIG1lbW1vdmUgKHJlbG9jcywgcmVsb2NzICsgMSwKLQkJICAgICAgIChzaXplX3QpICgocmVsb2NfY291bnQgLSAxKSAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXaGVuIGNvbnNpZGVyaW5nIGEgVE9DIHJlbG9jLCB3ZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoZQotCSBzeW1ib2wgdmFsdWUuICBUaGUgc3ltYm9sIHdpbGwgYmUgc3RhcnQgb2YgdGhlIFRPQyBzZWN0aW9uCi0JICh3aGljaCBpcyBuYW1lZCAuZ290KS4gIFdlIGRvIHdhbnQgdG8gaW5jbHVkZSB0aGUgYWRkZW5kLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvID09IHRvY19ob3d0bykKLQlzeW1fdmFsdWUgPSAwOwotICAgICAgZWxzZQotCXN5bV92YWx1ZSA9IHN5bS0+dmFsdWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgd2l0aCBhIHZhbHVlLCBvcgotCSB0aGVyZSBpcyBhIHJlbG9jIGFkZGVuZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFkZGVuZCBpbiB0aGUKLQkgb2JqZWN0IGZpbGUuICAqLwotICAgICAgaWYgKHN5bV92YWx1ZSArIHJlbC0+YWRkZW5kICE9IDApCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIHN3aXRjaCAocmVsLT5ob3d0by0+c2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDE6Ci0JICAgICAgdmFsID0gYmZkX2dldF8xNiAob3V0YmZkLAotCQkJCShiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgdmFsID0gKCh2YWwgJn4gcmVsLT5ob3d0by0+ZHN0X21hc2spCi0JCSAgICAgfCAoKCh2YWwgJiByZWwtPmhvd3RvLT5zcmNfbWFzaykKLQkJCSArIHN5bV92YWx1ZQotCQkJICsgcmVsLT5hZGRlbmQpCi0JCQkmIHJlbC0+aG93dG8tPmRzdF9tYXNrKSk7Ci0JICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgdmFsIDwgLSAweDgwMDAKLQkJICB8fCAoYmZkX3NpZ25lZF92bWEpIHZhbCA+PSAweDgwMDApCi0JCWZwcmludGYgKHN0ZGVyciwKLQkJCSBfKCIlczogb3ZlcmZsb3cgd2hlbiBhZGp1c3RpbmcgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzXG4iKSwKLQkJCSBwcm9ncmFtX25hbWUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpOwotCSAgICAgIGJmZF9wdXRfMTYgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMjoKLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsCi0JCQkJKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICB2YWwgPSAoKHZhbCAmfiByZWwtPmhvd3RvLT5kc3RfbWFzaykKLQkJICAgICB8ICgoKHZhbCAmIHJlbC0+aG93dG8tPnNyY19tYXNrKQotCQkJICsgc3ltX3ZhbHVlCi0JCQkgKyByZWwtPmFkZGVuZCkKLQkJCSYgcmVsLT5ob3d0by0+ZHN0X21hc2spKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+c3ltYm9sX3B0cl9wdHI7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGluY29ycG9yYXRlZCB0aGUgYWRkZW5kLCByZW1vdmUgYW55IFRPQwotCSByZWxvY3MuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gPT0gdG9jX2hvd3RvKQotCXsKLQkgIC0tKnJlbG9jX2NvdW50X3B0cjsKLQkgIC0tcmVsb2NzOwotCSAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAotCQkgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gaSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgcmVsLT5hZGRyZXNzICs9IGluc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLX0KLQotI2VuZGlmIC8qIE5MTUNPTlZfUE9XRVJQQyAqLwotDAotLyogTmFtZSBvZiBsaW5rZXIuICAqLwotI2lmbmRlZiBMRF9OQU1FCi0jZGVmaW5lIExEX05BTUUgImxkIgotI2VuZGlmCi0KLS8qIFRlbXBvcmFyeSBmaWxlIG5hbWUgYmFzZS4gICovCi1zdGF0aWMgY2hhciAqdGVtcF9maWxlbmFtZTsKLQotLyogVGhlIHVzZXIgaGFzIHNwZWNpZmllZCBzZXZlcmFsIGlucHV0IGZpbGVzLiAgSW52b2tlIHRoZSBsaW5rZXIgdG8KLSAgIGxpbmsgdGhlbSBhbGwgdG9nZXRoZXIsIGFuZCBjb252ZXJ0IGFuZCBkZWxldGUgdGhlIHJlc3VsdGluZyBvdXRwdXQKLSAgIGZpbGUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1saW5rX2lucHV0cyAoaW5wdXRzLCBsZCkKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICppbnB1dHM7Ci0gICAgIGNoYXIgKmxkOwotewotICBzaXplX3QgYzsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpxOwotICBjaGFyICoqYXJndjsKLSAgc2l6ZV90IGk7Ci0gIGludCBwaWQ7Ci0gIGludCBzdGF0dXM7Ci0gIGNoYXIgKmVycmZtdDsKLSAgY2hhciAqZXJyYXJnOwotCi0gIGMgPSAwOwotICBmb3IgKHEgPSBpbnB1dHM7IHEgIT0gTlVMTDsgcSA9IHEtPm5leHQpCi0gICAgKytjOwotCi0gIGFyZ3YgPSAoY2hhciAqKikgYWxsb2NhICgoYyArIDUpICogc2l6ZW9mKGNoYXIgKikpOwotCi0jaWZuZGVmIF9fTVNET1NfXwotICBpZiAobGQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICAvKiBGaW5kIHRoZSBsaW5rZXIgdG8gaW52b2tlIGJhc2VkIG9uIGhvdyBubG1jb252IHdhcyBydW4uICAqLwotICAgICAgcCA9IHByb2dyYW1fbmFtZSArIHN0cmxlbiAocHJvZ3JhbV9uYW1lKTsKLSAgICAgIHdoaWxlIChwICE9IHByb2dyYW1fbmFtZSkKLQl7Ci0JICBpZiAocFstMV0gPT0gJy8nKQotCSAgICB7Ci0JICAgICAgbGQgPSAoY2hhciAqKSB4bWFsbG9jIChwIC0gcHJvZ3JhbV9uYW1lICsgc3RybGVuIChMRF9OQU1FKSArIDEpOwotCSAgICAgIG1lbWNweSAobGQsIHByb2dyYW1fbmFtZSwgcCAtIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgc3RyY3B5IChsZCArIChwIC0gcHJvZ3JhbV9uYW1lKSwgTERfTkFNRSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC0tcDsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKGxkID09IE5VTEwpCi0gICAgbGQgPSAoY2hhciAqKSBMRF9OQU1FOwotCi0gIHRlbXBfZmlsZW5hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotCi0gIHVubGlua19vbl9leGl0ID0geG1hbGxvYyAoc3RybGVuICh0ZW1wX2ZpbGVuYW1lKSArIDMpOwotICBzcHJpbnRmICh1bmxpbmtfb25fZXhpdCwgIiVzLk8iLCB0ZW1wX2ZpbGVuYW1lKTsKLQotICBhcmd2WzBdID0gbGQ7Ci0gIGFyZ3ZbMV0gPSAoY2hhciAqKSAiLVVyIjsKLSAgYXJndlsyXSA9IChjaGFyICopICItbyI7Ci0gIGFyZ3ZbM10gPSB1bmxpbmtfb25fZXhpdDsKLSAgaSA9IDQ7Ci0gIGZvciAocSA9IGlucHV0czsgcSAhPSBOVUxMOyBxID0gcS0+bmV4dCwgaSsrKQotICAgIGFyZ3ZbaV0gPSBxLT5zdHJpbmc7Ci0gIGFyZ3ZbaV0gPSBOVUxMOwotCi0gIGlmIChkZWJ1ZykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBhcmd2W2ldICE9IE5VTEw7IGkrKykKLQlmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBhcmd2W2ldKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotCi0gIHBpZCA9IHBleGVjdXRlIChsZCwgYXJndiwgcHJvZ3JhbV9uYW1lLCAoY2hhciAqKSBOVUxMLCAmZXJyZm10LCAmZXJyYXJnLAotCQkgIFBFWEVDVVRFX1NFQVJDSCB8IFBFWEVDVVRFX09ORSk7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZXhlY3V0aW9uIG9mICVzIGZhaWxlZDogIiksIHByb2dyYW1fbmFtZSwgbGQpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBlcnJmbXQsIGVycmFyZyk7Ci0gICAgICB1bmxpbmsgKHVubGlua19vbl9leGl0KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocHdhaXQgKHBpZCwgJnN0YXR1cywgMCkgPCAwKQotICAgIHsKLSAgICAgIHBlcnJvciAoInB3YWl0Iik7Ci0gICAgICB1bmxpbmsgKHVubGlua19vbl9leGl0KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogRXhlY3V0aW9uIG9mICVzIGZhaWxlZFxuIiksIHByb2dyYW1fbmFtZSwgbGQpOwotICAgICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHVubGlua19vbl9leGl0OwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbmxtY29udi5oIGIvYmludXRpbHMvbmxtY29udi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTJhNTU3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWNvbnYuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qIG5sbWNvbnYuaCAtLSBoZWFkZXIgZmlsZSBmb3IgTkxNIGNvbnZlcnNpb24gcHJvZ3JhbQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBiZmQuaCwgbmxtL2NvbW1vbi5oIGFuZCBubG0vaW50ZXJuYWwuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzCi0gICBmaWxlLiAgKi8KLQotLyogQSBsaW5rZWQgbGlzdCBvZiBzdHJpbmdzLiAgKi8KLQotc3RydWN0IHN0cmluZ19saXN0Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqbmV4dDsKLSAgY2hhciAqc3RyaW5nOwotfTsKLQotLyogVGhlIE5MTSBoZWFkZXIgcGFyc2VyIGluIG5sbWhlYWRlci55IHN0b3JlcyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgIGZvbGxvd2luZyB2YXJpYWJsZXMuICAqLwotCi1leHRlcm4gTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqZml4ZWRfaGRyOwotZXh0ZXJuIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgKnZhcl9oZHI7Ci1leHRlcm4gTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyICp2ZXJzaW9uX2hkcjsKLWV4dGVybiBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciAqY29weXJpZ2h0X2hkcjsKLWV4dGVybiBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyICpleHRlbmRlZF9oZHI7Ci0KLS8qIFByb2NlZHVyZSBuYW1lZCBieSBDSEVDSy4gICovCi1leHRlcm4gY2hhciAqY2hlY2tfcHJvY2VkdXJlOwotLyogRmlsZSBuYW1lZCBieSBDVVNUT00uICAqLwotZXh0ZXJuIGNoYXIgKmN1c3RvbV9maWxlOwotLyogV2hldGhlciB0byBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKERFQlVHKS4gICovCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19pbmZvOwotLyogUHJvY2VkdXJlIG5hbWVkIGJ5IEVYSVQuICAqLwotZXh0ZXJuIGNoYXIgKmV4aXRfcHJvY2VkdXJlOwotLyogRXhwb3J0ZWQgc3ltYm9scyAoRVhQT1JUKS4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICpleHBvcnRfc3ltYm9sczsKLS8qIExpc3Qgb2YgZmlsZXMgZnJvbSBJTlBVVC4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICppbnB1dF9maWxlczsKLS8qIE1hcCBmaWxlIG5hbWUgKE1BUCwgRlVMTE1BUCkuICAqLwotZXh0ZXJuIGNoYXIgKm1hcF9maWxlOwotLyogV2hldGhlciBhIGZ1bGwgbWFwIGhhcyBiZWVuIHJlcXVlc3RlZCAoRlVMTE1BUCkuICAqLwotZXh0ZXJuIGJvb2xlYW4gZnVsbF9tYXA7Ci0vKiBGaWxlIG5hbWVkIGJ5IEhFTFAuICAqLwotZXh0ZXJuIGNoYXIgKmhlbHBfZmlsZTsKLS8qIEltcG9ydGVkIHN5bWJvbHMgKElNUE9SVCkuICAqLwotZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqaW1wb3J0X3N5bWJvbHM7Ci0vKiBGaWxlIG5hbWVkIGJ5IE1FU1NBR0VTLiAgKi8KLWV4dGVybiBjaGFyICptZXNzYWdlX2ZpbGU7Ci0vKiBBdXRvbG9hZCBtb2R1bGUgbGlzdCAoTU9EVUxFKS4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICptb2R1bGVzOwotLyogRmlsZSBuYW1lZCBieSBPVVRQVVQuICAqLwotZXh0ZXJuIGNoYXIgKm91dHB1dF9maWxlOwotLyogRmlsZSBuYW1lZCBieSBTSEFSRUxJQi4gICovCi1leHRlcm4gY2hhciAqc2hhcmVsaWJfZmlsZTsKLS8qIFN0YXJ0IHByb2NlZHVyZSBuYW1lIChTVEFSVCkuICAqLwotZXh0ZXJuIGNoYXIgKnN0YXJ0X3Byb2NlZHVyZTsKLS8qIFZFUkJPU0UuICAqLwotZXh0ZXJuIGJvb2xlYW4gdmVyYm9zZTsKLS8qIFJQQyBkZXNjcmlwdGlvbiBmaWxlIChYRENEQVRBKS4gICovCi1leHRlcm4gY2hhciAqcnBjX2ZpbGU7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygc2VyaW91cyBwYXJzZSBlcnJvcnMuICAqLwotZXh0ZXJuIGludCBwYXJzZV9lcnJvcnM7Ci0KLS8qIFRoZSBwYXJzZXIuICAqLwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGVsbCB0aGUgbGV4ZXIgd2hhdCBmaWxlIHRvIHJlYWQuICAqLwotZXh0ZXJuIGJvb2xlYW4gbmxtbGV4X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1oZWFkZXIueSBiL2JpbnV0aWxzL25sbWhlYWRlci55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjFlMjJhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWhlYWRlci55CisrKyAvZGV2L251bGwKQEAgLTEsOTc4ICswLDAgQEAKLSV7LyogbmxtaGVhZGVyLnkgLSBwYXJzZSBOTE0gaGVhZGVyIHNwZWNpZmljYXRpb24ga2V5d29yZHMuCi0gICAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBiaXNvbiBmaWxlIHBhcnNlcyB0aGUgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgTmV0V2FyZSBOTE0KLSAgIGxpbmtlciwgZXhjZXB0IGZvciBsaXN0cyBvZiBvYmplY3QgZmlsZXMuICBJdCBzdG9yZXMgdGhlCi0gICBpbmZvcm1hdGlvbiBpbiBnbG9iYWwgdmFyaWFibGVzLgotCi0gICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgTmV0V2FyZSBUb29sCi0gICBNYWtlciBTcGVjaWZpY2F0aW9uIG1hbnVhbCwgZWRpdGlvbiAxLjAuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibmxtL2NvbW1vbi5oIgotI2luY2x1ZGUgIm5sbS9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIm5sbWNvbnYuaCIKLQotLyogSW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBzdHJ1Y3R1cmVzIHBvaW50ZWQgdG8gYnkgdGhlc2UKLSAgIHZhcmlhYmxlcy4gICovCi0KLU5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmZpeGVkX2hkcjsKLU5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgKnZhcl9oZHI7Ci1ObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIgKnZlcnNpb25faGRyOwotTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgKmNvcHlyaWdodF9oZHI7Ci1ObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyICpleHRlbmRlZF9oZHI7Ci0KLS8qIFByb2NlZHVyZSBuYW1lZCBieSBDSEVDSy4gICovCi1jaGFyICpjaGVja19wcm9jZWR1cmU7Ci0vKiBGaWxlIG5hbWVkIGJ5IENVU1RPTS4gICovCi1jaGFyICpjdXN0b21fZmlsZTsKLS8qIFdoZXRoZXIgdG8gZ2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIChERUJVRykuICAqLwotYm9vbGVhbiBkZWJ1Z19pbmZvOwotLyogUHJvY2VkdXJlIG5hbWVkIGJ5IEVYSVQuICAqLwotY2hhciAqZXhpdF9wcm9jZWR1cmU7Ci0vKiBFeHBvcnRlZCBzeW1ib2xzIChFWFBPUlQpLiAgKi8KLXN0cnVjdCBzdHJpbmdfbGlzdCAqZXhwb3J0X3N5bWJvbHM7Ci0vKiBMaXN0IG9mIGZpbGVzIGZyb20gSU5QVVQuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICppbnB1dF9maWxlczsKLS8qIE1hcCBmaWxlIG5hbWUgKE1BUCwgRlVMTE1BUCkuICAqLwotY2hhciAqbWFwX2ZpbGU7Ci0vKiBXaGV0aGVyIGEgZnVsbCBtYXAgaGFzIGJlZW4gcmVxdWVzdGVkIChGVUxMTUFQKS4gICovCi1ib29sZWFuIGZ1bGxfbWFwOwotLyogRmlsZSBuYW1lZCBieSBIRUxQLiAgKi8KLWNoYXIgKmhlbHBfZmlsZTsKLS8qIEltcG9ydGVkIHN5bWJvbHMgKElNUE9SVCkuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICppbXBvcnRfc3ltYm9sczsKLS8qIEZpbGUgbmFtZWQgYnkgTUVTU0FHRVMuICAqLwotY2hhciAqbWVzc2FnZV9maWxlOwotLyogQXV0b2xvYWQgbW9kdWxlIGxpc3QgKE1PRFVMRSkuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICptb2R1bGVzOwotLyogRmlsZSBuYW1lZCBieSBPVVRQVVQuICAqLwotY2hhciAqb3V0cHV0X2ZpbGU7Ci0vKiBGaWxlIG5hbWVkIGJ5IFNIQVJFTElCLiAgKi8KLWNoYXIgKnNoYXJlbGliX2ZpbGU7Ci0vKiBTdGFydCBwcm9jZWR1cmUgbmFtZSAoU1RBUlQpLiAgKi8KLWNoYXIgKnN0YXJ0X3Byb2NlZHVyZTsKLS8qIFZFUkJPU0UuICAqLwotYm9vbGVhbiB2ZXJib3NlOwotLyogUlBDIGRlc2NyaXB0aW9uIGZpbGUgKFhEQ0RBVEEpLiAgKi8KLWNoYXIgKnJwY19maWxlOwotCi0vKiBUaGUgbnVtYmVyIG9mIHNlcmlvdXMgZXJyb3JzIHRoYXQgaGF2ZSBvY2N1cnJlZC4gICovCi1pbnQgcGFyc2VfZXJyb3JzOwotCi0vKiBUaGUgY3VycmVudCBzeW1ib2wgcHJlZml4IHdoZW4gcmVhZGluZyBhIGxpc3Qgb2YgaW1wb3J0IG9yIGV4cG9ydAotICAgc3ltYm9scy4gICovCi1zdGF0aWMgY2hhciAqc3ltYm9sX3ByZWZpeDsKLQotLyogUGFyc2VyIGVycm9yIG1lc3NhZ2UgaGFuZGxlci4gICovCi0jZGVmaW5lIHl5ZXJyb3IobXNnKSBubG1oZWFkZXJfZXJyb3IgKG1zZyk7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG5sbWxleF9maWxlX3B1c2ggUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1sZXhfZmlsZV9vcGVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBubG1sZXhfYnVmX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgbmxtbGV4X2J1Zl9hZGQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgbG9uZyBubG1sZXhfZ2V0X251bWJlciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIG5sbWhlYWRlcl9pZGVudGlmeSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBubG1oZWFkZXJfd2FybiBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgbmxtaGVhZGVyX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqIHN0cmluZ19saXN0X2NvbnMgUEFSQU1TICgoY2hhciAqLAotCQkJCQkJICAgICAgc3RydWN0IHN0cmluZ19saXN0ICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiBzdHJpbmdfbGlzdF9hcHBlbmQgUEFSQU1TICgoc3RydWN0IHN0cmluZ19saXN0ICosCi0JCQkJCQkJc3RydWN0IHN0cmluZ19saXN0ICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiBzdHJpbmdfbGlzdF9hcHBlbmQxIFBBUkFNUyAoKHN0cnVjdCBzdHJpbmdfbGlzdCAqLAotCQkJCQkJCSBjaGFyICopKTsKLXN0YXRpYyBjaGFyICp4c3RyZHVwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0lfQotCi0ldW5pb24KLXsKLSAgY2hhciAqc3RyaW5nOwotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmxpc3Q7Ci19OwotCi0vKiBUaGUgcmVzZXJ2ZWQgd29yZHMuICAqLwotCi0ldG9rZW4gQ0hFQ0sgQ09ERVNUQVJUIENPUFlSSUdIVCBDVVNUT00gREFURSBERUJVRyBERVNDUklQVElPTiBFWElUCi0ldG9rZW4gRVhQT1JUIEZMQUdfT04gRkxBR19PRkYgRlVMTE1BUCBIRUxQIElNUE9SVCBJTlBVVCBNQVAgTUVTU0FHRVMKLSV0b2tlbiBNT0RVTEUgTVVMVElQTEUgT1NfRE9NQUlOIE9VVFBVVCBQU0VVRE9QUkVFTVBUSU9OIFJFRU5UUkFOVAotJXRva2VuIFNDUkVFTk5BTUUgU0hBUkVMSUIgU1RBQ0sgU1RBUlQgU1lOQ0hST05JWkUKLSV0b2tlbiBUSFJFQUROQU1FIFRZUEUgVkVSQk9TRSBWRVJTSU9OSyBYRENEQVRBCi0KLS8qIEFyZ3VtZW50cy4gICovCi0KLSV0b2tlbiA8c3RyaW5nPiBTVFJJTkcKLSV0b2tlbiA8c3RyaW5nPiBRVU9URURfU1RSSU5HCi0KLS8qIFR5cGVkIG5vbi10ZXJtaW5hbHMuICAqLwotJXR5cGUgPGxpc3Q+IHN5bWJvbF9saXN0X29wdCBzeW1ib2xfbGlzdCBzdHJpbmdfbGlzdAotJXR5cGUgPHN0cmluZz4gc3ltYm9sCi0KLSUlCi0KLS8qIEtleXdvcmRzIG11c3Qgc3RhcnQgaW4gdGhlIGxlZnRtb3N0IGNvbHVtbiBvZiB0aGUgZmlsZS4gIEFyZ3VtZW50cwotICAgbWF5IGFwcGVhciBhbnl3aGVyZSBlbHNlLiAgVGhlIGxleGVyIHVzZXMgdGhpcyB0byBkZXRlcm1pbmUgd2hhdAotICAgdG9rZW4gdG8gcmV0dXJuLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0IGhlcmUuICAqLwotCi0vKiBUaGUgZW50aXJlIGZpbGUgaXMganVzdCBhIGxpc3Qgb2YgY29tbWFuZHMuICAqLwotCi1maWxlOgkKLQkgIGNvbW1hbmRzCi0JOwotCi0vKiBBIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgY29tbWFuZHMuICAqLwotCi1jb21tYW5kczoKLQkgIC8qIE1heSBiZSBlbXB0eS4gICovCi0JfCBjb21tYW5kIGNvbW1hbmRzCi0JOwotCi0vKiBBIHNpbmdsZSBjb21tYW5kLiAgVGhlcmUgaXMgd2hlcmUgbW9zdCBvZiB0aGUgd29yayB0YWtlcyBwbGFjZS4gICovCi0KLWNvbW1hbmQ6Ci0JICBDSEVDSyBTVFJJTkcKLQkgIHsKLQkgICAgY2hlY2tfcHJvY2VkdXJlID0gJDI7Ci0JICB9Ci0JfCBDT0RFU1RBUlQgU1RSSU5HCi0JICB7Ci0JICAgIG5sbWhlYWRlcl93YXJuIChfKCJDT0RFU1RBUlQgaXMgbm90IGltcGxlbWVudGVkOyBzb3JyeSIpLCAtMSk7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IENPUFlSSUdIVCBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgc3RybmNweSAoY29weXJpZ2h0X2hkci0+c3RhbXAsICJDb1B5UmlHaFQ9IiwgMTApOwotCSAgICBsZW4gPSBzdHJsZW4gKCQyKTsKLQkgICAgaWYgKGxlbiA+PSBOTE1fTUFYX0NPUFlSSUdIVF9NRVNTQUdFX0xFTkdUSCkKLQkgICAgICB7Ci0JCW5sbWhlYWRlcl93YXJuIChfKCJjb3B5cmlnaHQgc3RyaW5nIGlzIHRvbyBsb25nIiksCi0JCQkJTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEggLSAxKTsKLQkJbGVuID0gTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEggLSAxOwotCSAgICAgIH0KLQkgICAgY29weXJpZ2h0X2hkci0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCA9IGxlbjsKLQkgICAgc3RybmNweSAoY29weXJpZ2h0X2hkci0+Y29weXJpZ2h0TWVzc2FnZSwgJDIsIGxlbik7Ci0JICAgIGNvcHlyaWdodF9oZHItPmNvcHlyaWdodE1lc3NhZ2VbbGVuXSA9ICdcMCc7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IENVU1RPTSBTVFJJTkcKLQkgIHsKLQkgICAgY3VzdG9tX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IERBVEUgU1RSSU5HIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgLyogV2UgZG9uJ3Qgc2V0IHRoZSB2ZXJzaW9uIHN0YW1wIGhlcmUsIGJlY2F1c2Ugd2UgdXNlIHRoZQotCSAgICAgICB2ZXJzaW9uIHN0YW1wIHRvIGRldGVjdCB3aGV0aGVyIHRoZSByZXF1aXJlZCBWRVJTSU9OCi0JICAgICAgIGtleXdvcmQgd2FzIGdpdmVuLiAgKi8KLQkgICAgdmVyc2lvbl9oZHItPm1vbnRoID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgdmVyc2lvbl9oZHItPmRheSA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIHZlcnNpb25faGRyLT55ZWFyID0gbmxtbGV4X2dldF9udW1iZXIgKCQ0KTsKLQkgICAgZnJlZSAoJDIpOwotCSAgICBmcmVlICgkMyk7Ci0JICAgIGZyZWUgKCQ0KTsKLQkgICAgaWYgKHZlcnNpb25faGRyLT5tb250aCA8IDEgfHwgdmVyc2lvbl9oZHItPm1vbnRoID4gMTIpCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgbW9udGgiKSwgLTEpOwotCSAgICBpZiAodmVyc2lvbl9oZHItPmRheSA8IDEgfHwgdmVyc2lvbl9oZHItPmRheSA+IDMxKQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIGRheSIpLCAtMSk7Ci0JICAgIGlmICh2ZXJzaW9uX2hkci0+eWVhciA8IDE5MDAgfHwgdmVyc2lvbl9oZHItPnllYXIgPiAzMDAwKQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIHllYXIiKSwgLTEpOwotCSAgfQotCXwgREVCVUcKLQkgIHsKLQkgICAgZGVidWdfaW5mbyA9IHRydWU7Ci0JICB9Ci0JfCBERVNDUklQVElPTiBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuICgkMik7Ci0JICAgIGlmIChsZW4gPiBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCkKLQkgICAgICB7Ci0JCW5sbWhlYWRlcl93YXJuIChfKCJkZXNjcmlwdGlvbiBzdHJpbmcgaXMgdG9vIGxvbmciKSwKLQkJCQlOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCk7Ci0JCWxlbiA9IE5MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIOwotCSAgICAgIH0KLQkgICAgdmFyX2hkci0+ZGVzY3JpcHRpb25MZW5ndGggPSBsZW47Ci0JICAgIHN0cm5jcHkgKHZhcl9oZHItPmRlc2NyaXB0aW9uVGV4dCwgJDIsIGxlbik7Ci0JICAgIHZhcl9oZHItPmRlc2NyaXB0aW9uVGV4dFtsZW5dID0gJ1wwJzsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgRVhJVCBTVFJJTkcKLQkgIHsKLQkgICAgZXhpdF9wcm9jZWR1cmUgPSAkMjsKLQkgIH0KLQl8IEVYUE9SVAotCSAgewotCSAgICBzeW1ib2xfcHJlZml4ID0gTlVMTDsKLQkgIH0KLQkgIHN5bWJvbF9saXN0X29wdAotCSAgewotCSAgICBleHBvcnRfc3ltYm9scyA9IHN0cmluZ19saXN0X2FwcGVuZCAoZXhwb3J0X3N5bWJvbHMsICQzKTsKLQkgIH0KLQl8IEZMQUdfT04gU1RSSU5HCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgRkxBR19PRkYgU1RSSU5HCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgJj1+IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IEZVTExNQVAKLQkgIHsKLQkgICAgbWFwX2ZpbGUgPSAiIjsKLQkgICAgZnVsbF9tYXAgPSB0cnVlOwotCSAgfQotCXwgRlVMTE1BUCBTVFJJTkcKLQkgIHsKLQkgICAgbWFwX2ZpbGUgPSAkMjsKLQkgICAgZnVsbF9tYXAgPSB0cnVlOwotCSAgfQotCXwgSEVMUCBTVFJJTkcKLQkgIHsKLQkgICAgaGVscF9maWxlID0gJDI7Ci0JICB9Ci0JfCBJTVBPUlQKLQkgIHsKLQkgICAgc3ltYm9sX3ByZWZpeCA9IE5VTEw7Ci0JICB9Ci0JICBzeW1ib2xfbGlzdF9vcHQKLQkgIHsKLQkgICAgaW1wb3J0X3N5bWJvbHMgPSBzdHJpbmdfbGlzdF9hcHBlbmQgKGltcG9ydF9zeW1ib2xzLCAkMyk7Ci0JICB9Ci0JfCBJTlBVVCBzdHJpbmdfbGlzdAotCSAgewotCSAgICBpbnB1dF9maWxlcyA9IHN0cmluZ19saXN0X2FwcGVuZCAoaW5wdXRfZmlsZXMsICQyKTsKLQkgIH0KLQl8IE1BUAotCSAgewotCSAgICBtYXBfZmlsZSA9ICIiOwotCSAgfQotCXwgTUFQIFNUUklORwotCSAgewotCSAgICBtYXBfZmlsZSA9ICQyOwotCSAgfQotCXwgTUVTU0FHRVMgU1RSSU5HCi0JICB7Ci0JICAgIG1lc3NhZ2VfZmlsZSA9ICQyOwotCSAgfQotCXwgTU9EVUxFIHN0cmluZ19saXN0Ci0JICB7Ci0JICAgIG1vZHVsZXMgPSBzdHJpbmdfbGlzdF9hcHBlbmQgKG1vZHVsZXMsICQyKTsKLQkgIH0KLQl8IE1VTFRJUExFCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgyOwotCSAgfQotCXwgT1NfRE9NQUlOCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgxMDsKLQkgIH0KLQl8IE9VVFBVVCBTVFJJTkcKLQkgIHsKLQkgICAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0JICAgICAgb3V0cHV0X2ZpbGUgPSAkMjsKLQkgICAgZWxzZQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpZ25vcmluZyBkdXBsaWNhdGUgT1VUUFVUIHN0YXRlbWVudCIpLCAtMSk7Ci0JICB9Ci0JfCBQU0VVRE9QUkVFTVBUSU9OCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHg4OwotCSAgfQotCXwgUkVFTlRSQU5UCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgxOwotCSAgfQotCXwgU0NSRUVOTkFNRSBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuICgkMik7Ci0JICAgIGlmIChsZW4gPj0gTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEgpCi0JICAgICAgewotCQlubG1oZWFkZXJfd2FybiAoXygic2NyZWVuIG5hbWUgaXMgdG9vIGxvbmciKSwKLQkJCQlOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSCk7Ci0JCWxlbiA9IE5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIOwotCSAgICAgIH0KLQkgICAgdmFyX2hkci0+c2NyZWVuTmFtZUxlbmd0aCA9IGxlbjsKLQkgICAgc3RybmNweSAodmFyX2hkci0+c2NyZWVuTmFtZSwgJDIsIGxlbik7Ci0JICAgIHZhcl9oZHItPnNjcmVlbk5hbWVbTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEhdID0gJ1wwJzsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgU0hBUkVMSUIgU1RSSU5HCi0JICB7Ci0JICAgIHNoYXJlbGliX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IFNUQUNLIFNUUklORwotCSAgewotCSAgICB2YXJfaGRyLT5zdGFja1NpemUgPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBTVEFSVCBTVFJJTkcKLQkgIHsKLQkgICAgc3RhcnRfcHJvY2VkdXJlID0gJDI7Ci0JICB9Ci0JfCBTWU5DSFJPTklaRQotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzIHw9IDB4NDsKLQkgIH0KLQl8IFRIUkVBRE5BTUUgUVVPVEVEX1NUUklORwotCSAgewotCSAgICBpbnQgbGVuOwotCi0JICAgIGxlbiA9IHN0cmxlbiAoJDIpOwotCSAgICBpZiAobGVuID49IE5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RIKQotCSAgICAgIHsKLQkJbmxtaGVhZGVyX3dhcm4gKF8oInRocmVhZCBuYW1lIGlzIHRvbyBsb25nIiksCi0JCQkJTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgpOwotCQlsZW4gPSBOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSDsKLQkgICAgICB9Ci0JICAgIHZhcl9oZHItPnRocmVhZE5hbWVMZW5ndGggPSBsZW47Ci0JICAgIHN0cm5jcHkgKHZhcl9oZHItPnRocmVhZE5hbWUsICQyLCBsZW4pOwotCSAgICB2YXJfaGRyLT50aHJlYWROYW1lW2xlbl0gPSAnXDAnOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBUWVBFIFNUUklORwotCSAgewotCSAgICBmaXhlZF9oZHItPm1vZHVsZVR5cGUgPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBWRVJCT1NFCi0JICB7Ci0JICAgIHZlcmJvc2UgPSB0cnVlOwotCSAgfQotCXwgVkVSU0lPTksgU1RSSU5HIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0KLQkgICAgc3RybmNweSAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKLQkgICAgdmVyc2lvbl9oZHItPm1ham9yVmVyc2lvbiA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIHZhbCA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDk5KQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIG1pbm9yIHZlcnNpb24gbnVtYmVyIChtdXN0IGJlIGJldHdlZW4gMCBhbmQgOTkpIiksCi0JCQkgICAgICAtMSk7Ci0JICAgIGVsc2UKLQkgICAgICB2ZXJzaW9uX2hkci0+bWlub3JWZXJzaW9uID0gdmFsOwotCSAgICB2YWwgPSBubG1sZXhfZ2V0X251bWJlciAoJDQpOwotCSAgICBpZiAodmFsIDwgMCkKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCByZXZpc2lvbiBudW1iZXIgKG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNikiKSwKLQkJCSAgICAgIC0xKTsKLQkgICAgZWxzZSBpZiAodmFsID4gMjYpCi0JICAgICAgdmVyc2lvbl9oZHItPnJldmlzaW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHZlcnNpb25faGRyLT5yZXZpc2lvbiA9IHZhbDsKLQkgICAgZnJlZSAoJDIpOwotCSAgICBmcmVlICgkMyk7Ci0JICAgIGZyZWUgKCQ0KTsKLQkgIH0KLQl8IFZFUlNJT05LIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0KLQkgICAgc3RybmNweSAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKLQkgICAgdmVyc2lvbl9oZHItPm1ham9yVmVyc2lvbiA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIHZhbCA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDk5KQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIG1pbm9yIHZlcnNpb24gbnVtYmVyIChtdXN0IGJlIGJldHdlZW4gMCBhbmQgOTkpIiksCi0JCQkgICAgICAtMSk7Ci0JICAgIGVsc2UKLQkgICAgICB2ZXJzaW9uX2hkci0+bWlub3JWZXJzaW9uID0gdmFsOwotCSAgICB2ZXJzaW9uX2hkci0+cmV2aXNpb24gPSAwOwotCSAgICBmcmVlICgkMik7Ci0JICAgIGZyZWUgKCQzKTsKLQkgIH0KLQl8IFhEQ0RBVEEgU1RSSU5HCi0JICB7Ci0JICAgIHJwY19maWxlID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2Ygc3ltYm9scy4gICovCi0KLXN5bWJvbF9saXN0X29wdDoKLQkgIC8qIEVtcHR5LiAgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgc3ltYm9sX2xpc3QKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEEgbGlzdCBvZiBzeW1ib2xzIGluIGFuIGltcG9ydCBvciBleHBvcnQgbGlzdC4gIFByZWZpeGVzIG1heSBhcHBlYXIKLSAgIGluIHBhcmVudGhlc2VzLiAgV2UgbmVlZCB0byB1c2UgbGVmdCByZWN1cnNpb24gaGVyZSB0byBhdm9pZAotICAgYnVpbGRpbmcgdXAgYSBsYXJnZSBpbXBvcnQgbGlzdCBvbiB0aGUgcGFyc2VyIHN0YWNrLiAgKi8KLQotc3ltYm9sX2xpc3Q6Ci0JICBzeW1ib2wKLQkgIHsKLQkgICAgJCQgPSBzdHJpbmdfbGlzdF9jb25zICgkMSwgTlVMTCk7Ci0JICB9Ci0JfCBzeW1ib2xfcHJlZml4Ci0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IHN5bWJvbF9saXN0IHN5bWJvbAotCSAgewotCSAgICAkJCA9IHN0cmluZ19saXN0X2FwcGVuZDEgKCQxLCAkMik7Ci0JICB9Ci0JfCBzeW1ib2xfbGlzdCBzeW1ib2xfcHJlZml4Ci0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBBIHByZWZpeCBmb3Igc3Vic2VxdWVudCBzeW1ib2xzLiAgKi8KLQotc3ltYm9sX3ByZWZpeDoKLQkgICcoJyBTVFJJTkcgJyknCi0JICB7Ci0JICAgIGlmIChzeW1ib2xfcHJlZml4ICE9IE5VTEwpCi0JICAgICAgZnJlZSAoc3ltYm9sX3ByZWZpeCk7Ci0JICAgIHN5bWJvbF9wcmVmaXggPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEEgc2luZ2xlIHN5bWJvbC4gICovCi0KLXN5bWJvbDoKLQkgIFNUUklORwotCSAgewotCSAgICBpZiAoc3ltYm9sX3ByZWZpeCA9PSBOVUxMKQotCSAgICAgICQkID0gJDE7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSQkID0geG1hbGxvYyAoc3RybGVuIChzeW1ib2xfcHJlZml4KSArIHN0cmxlbiAoJDEpICsgMik7Ci0JCXNwcmludGYgKCQkLCAiJXNAJXMiLCBzeW1ib2xfcHJlZml4LCAkMSk7Ci0JCWZyZWUgKCQxKTsKLQkgICAgICB9Ci0JICB9Ci0JOwotCi0vKiBBIGxpc3Qgb2Ygc3RyaW5ncy4gICovCi0KLXN0cmluZ19saXN0OgotCSAgLyogTWF5IGJlIGVtcHR5LiAgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgU1RSSU5HIHN0cmluZ19saXN0Ci0JICB7Ci0JICAgICQkID0gc3RyaW5nX2xpc3RfY29ucyAoJDEsICQyKTsKLQkgIH0KLQk7Ci0KLSUlCi0KLS8qIElmIHN0cmVycm9yIGlzIGp1c3QgYSBtYWNybywgd2Ugd2FudCB0byB1c2UgdGhlIG9uZSBmcm9tIGxpYmliZXJ0eQotICAgc2luY2UgaXQgd2lsbCBoYW5kbGUgdW5kZWZpbmVkIHZhbHVlcy4gICovCi0jdW5kZWYgc3RyZXJyb3IKLWV4dGVybiBjaGFyICpzdHJlcnJvciAoKTsKLQotLyogVGhlIGxleGVyIGlzIHNpbXBsZSwgdG9vIHNpbXBsZSBmb3IgZmxleC4gIEtleXdvcmRzIGFyZSBvbmx5Ci0gICByZWNvZ25pemVkIGF0IHRoZSBzdGFydCBvZiBsaW5lcy4gIEV2ZXJ5dGhpbmcgZWxzZSBtdXN0IGJlIGFuCi0gICBhcmd1bWVudC4gIEEgY29tbWEgaXMgdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLiAgKi8KLQotLyogVGhlIHN0YXRlcyB0aGUgbGV4ZXIgY2FuIGJlIGluLiAgKi8KLQotZW51bSBsZXhfc3RhdGUKLXsKLSAgLyogQXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotICBCRUdJTk5JTkdfT0ZfTElORSwKLSAgLyogSW4gdGhlIG1pZGRsZSBvZiBhIGxpbmUuICAqLwotICBJTl9MSU5FCi19OwotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBzdGFjayBvZiBmaWxlcyB0byBoYW5kbGUgZmlsZSBpbmNsdXNpb24uICAqLwotCi1zdHJ1Y3QgaW5wdXQKLXsKLSAgLyogVGhlIGZpbGUgdG8gcmVhZCBmcm9tLiAgKi8KLSAgRklMRSAqZmlsZTsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBjaGFyICpuYW1lOwotICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlci4gICovCi0gIGludCBsaW5lbm87Ci0gIC8qIFRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLSAgZW51bSBsZXhfc3RhdGUgc3RhdGU7Ci0gIC8qIFRoZSBuZXh0IGZpbGUgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IGlucHV0ICpuZXh0OwotfTsKLQotLyogVGhlIGN1cnJlbnQgaW5wdXQgZmlsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXQgY3VycmVudDsKLQotLyogVGhlIGNoYXJhY3RlciB3aGljaCBpbnRyb2R1Y2VzIGNvbW1lbnRzLiAgKi8KLSNkZWZpbmUgQ09NTUVOVF9DSEFSICcjJwotDAotLyogU3RhcnQgdGhlIGxleGVyIGdvaW5nIG9uIHRoZSBtYWluIGlucHV0IGZpbGUuICAqLwotCi1ib29sZWFuCi1ubG1sZXhfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY3VycmVudC5uZXh0ID0gTlVMTDsKLSAgcmV0dXJuIG5sbWxleF9maWxlX29wZW4gKG5hbWUpOwotfQotCi0vKiBTdGFydCB0aGUgbGV4ZXIgZ29pbmcgb24gYSBzdWJzaWRpYXJ5IGlucHV0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotbmxtbGV4X2ZpbGVfcHVzaCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGlucHV0ICpwdXNoOwotCi0gIHB1c2ggPSAoc3RydWN0IGlucHV0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGlucHV0KSk7Ci0gICpwdXNoID0gY3VycmVudDsKLSAgaWYgKG5sbWxleF9maWxlX29wZW4gKG5hbWUpKQotICAgIGN1cnJlbnQubmV4dCA9IHB1c2g7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjdXJyZW50ID0gKnB1c2g7Ci0gICAgICBmcmVlIChwdXNoKTsKLSAgICB9Ci19Ci0KLS8qIFN0YXJ0IGxleGluZyBmcm9tIGEgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1sZXhfZmlsZV9vcGVuIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjdXJyZW50LmZpbGUgPSBmb3BlbiAobmFtZSwgInIiKTsKLSAgaWYgKGN1cnJlbnQuZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgICsrcGFyc2VfZXJyb3JzOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgY3VycmVudC5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGN1cnJlbnQubGluZW5vID0gMTsKLSAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRhYmxlIHVzZWQgdG8gdHVybiBrZXl3b3JkcyBpbnRvIHRva2Vucy4gICovCi0KLXN0cnVjdCBrZXl3b3JkX3Rva2Vuc19zdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqa2V5d29yZDsKLSAgaW50IHRva2VuOwotfTsKLQotc3RydWN0IGtleXdvcmRfdG9rZW5zX3N0cnVjdCBrZXl3b3JkX3Rva2Vuc1tdID0KLXsKLSAgeyAiQ0hFQ0siLCBDSEVDSyB9LAotICB7ICJDT0RFU1RBUlQiLCBDT0RFU1RBUlQgfSwKLSAgeyAiQ09QWVJJR0hUIiwgQ09QWVJJR0hUIH0sCi0gIHsgIkNVU1RPTSIsIENVU1RPTSB9LAotICB7ICJEQVRFIiwgREFURSB9LAotICB7ICJERUJVRyIsIERFQlVHIH0sCi0gIHsgIkRFU0NSSVBUSU9OIiwgREVTQ1JJUFRJT04gfSwKLSAgeyAiRVhJVCIsIEVYSVQgfSwKLSAgeyAiRVhQT1JUIiwgRVhQT1JUIH0sCi0gIHsgIkZMQUdfT04iLCBGTEFHX09OIH0sCi0gIHsgIkZMQUdfT0ZGIiwgRkxBR19PRkYgfSwKLSAgeyAiRlVMTE1BUCIsIEZVTExNQVAgfSwKLSAgeyAiSEVMUCIsIEhFTFAgfSwKLSAgeyAiSU1QT1JUIiwgSU1QT1JUIH0sCi0gIHsgIklOUFVUIiwgSU5QVVQgfSwKLSAgeyAiTUFQIiwgTUFQIH0sCi0gIHsgIk1FU1NBR0VTIiwgTUVTU0FHRVMgfSwKLSAgeyAiTU9EVUxFIiwgTU9EVUxFIH0sCi0gIHsgIk1VTFRJUExFIiwgTVVMVElQTEUgfSwKLSAgeyAiT1NfRE9NQUlOIiwgT1NfRE9NQUlOIH0sCi0gIHsgIk9VVFBVVCIsIE9VVFBVVCB9LAotICB7ICJQU0VVRE9QUkVFTVBUSU9OIiwgUFNFVURPUFJFRU1QVElPTiB9LAotICB7ICJSRUVOVFJBTlQiLCBSRUVOVFJBTlQgfSwKLSAgeyAiU0NSRUVOTkFNRSIsIFNDUkVFTk5BTUUgfSwKLSAgeyAiU0hBUkVMSUIiLCBTSEFSRUxJQiB9LAotICB7ICJTVEFDSyIsIFNUQUNLIH0sCi0gIHsgIlNUQUNLU0laRSIsIFNUQUNLIH0sCi0gIHsgIlNUQVJUIiwgU1RBUlQgfSwKLSAgeyAiU1lOQ0hST05JWkUiLCBTWU5DSFJPTklaRSB9LAotICB7ICJUSFJFQUROQU1FIiwgVEhSRUFETkFNRSB9LAotICB7ICJUWVBFIiwgVFlQRSB9LAotICB7ICJWRVJCT1NFIiwgVkVSQk9TRSB9LAotICB7ICJWRVJTSU9OIiwgVkVSU0lPTksgfSwKLSAgeyAiWERDREFUQSIsIFhEQ0RBVEEgfQotfTsKLQotI2RlZmluZSBLRVlXT1JEX0NPVU5UIChzaXplb2YgKGtleXdvcmRfdG9rZW5zKSAvIHNpemVvZiAoa2V5d29yZF90b2tlbnNbMF0pKQotDAotLyogVGhlIGxleGVyIGFjY3VtdWxhdGVzIHN0cmluZ3MgaW4gdGhlc2UgdmFyaWFibGVzLiAgKi8KLXN0YXRpYyBjaGFyICpsZXhfYnVmOwotc3RhdGljIGludCBsZXhfc2l6ZTsKLXN0YXRpYyBpbnQgbGV4X3BvczsKLQotLyogU3RhcnQgYWNjdW11bGF0aW5nIHN0cmluZ3MgaW50byB0aGUgYnVmZmVyLiAgKi8KLSNkZWZpbmUgQlVGX0lOSVQoKSBcCi0gICgodm9pZCkgKGxleF9idWYgIT0gTlVMTCA/IGxleF9wb3MgPSAwIDogbmxtbGV4X2J1Zl9pbml0ICgpKSkKLQotc3RhdGljIGludAotbmxtbGV4X2J1Zl9pbml0ICgpCi17Ci0gIGxleF9zaXplID0gMTA7Ci0gIGxleF9idWYgPSB4bWFsbG9jIChsZXhfc2l6ZSArIDEpOwotICBsZXhfcG9zID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZpbmlzaCBhIHN0cmluZyBpbiB0aGUgYnVmZmVyLiAgKi8KLSNkZWZpbmUgQlVGX0ZJTklTSCgpICgodm9pZCkgKGxleF9idWZbbGV4X3Bvc10gPSAnXDAnKSkKLQotLyogQWNjdW11bGF0ZSBhIGNoYXJhY3RlciBpbnRvIHRoZSBidWZmZXIuICAqLwotI2RlZmluZSBCVUZfQUREKGMpIFwKLSAgKCh2b2lkKSAobGV4X3BvcyA8IGxleF9zaXplIFwKLQkgICA/IGxleF9idWZbbGV4X3BvcysrXSA9IChjKSBcCi0JICAgOiBubG1sZXhfYnVmX2FkZCAoYykpKQotCi1zdGF0aWMgY2hhcgotbmxtbGV4X2J1Zl9hZGQgKGMpCi0gICAgIGludCBjOwotewotICBpZiAobGV4X3BvcyA+PSBsZXhfc2l6ZSkKLSAgICB7Ci0gICAgICBsZXhfc2l6ZSAqPSAyOwotICAgICAgbGV4X2J1ZiA9IHhyZWFsbG9jIChsZXhfYnVmLCBsZXhfc2l6ZSArIDEpOwotICAgIH0KLQotICByZXR1cm4gbGV4X2J1ZltsZXhfcG9zKytdID0gYzsKLX0KLQwKLS8qIFRoZSBsZXhlciBwcm9wZXIuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNpbmcKLSAgIGNvZGUuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBpbnQgYzsKLQotdGFpbF9yZWN1cnNlOgotCi0gIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCi0gIC8qIENvbW1hcyBhcmUgdHJlYXRlZCBhcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpIHx8IGMgPT0gJywnKQotICAgIHsKLSAgICAgIGN1cnJlbnQuc3RhdGUgPSBJTl9MSU5FOwotICAgICAgaWYgKGMgPT0gJ1xuJykKLQl7Ci0JICArK2N1cnJlbnQubGluZW5vOwotCSAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotCX0KLSAgICAgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotICAgIH0KLQotICAvKiBBdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdlIGVpdGhlciBwb3AgdG8gdGhlIHByZXZpb3VzIGZpbGUgb3IKLSAgICAgZmluaXNoIHVwLiAgKi8KLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGZjbG9zZSAoY3VycmVudC5maWxlKTsKLSAgICAgIGZyZWUgKGN1cnJlbnQubmFtZSk7Ci0gICAgICBpZiAoY3VycmVudC5uZXh0ID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGlucHV0ICpuZXh0OwotCi0JICBuZXh0ID0gY3VycmVudC5uZXh0OwotCSAgY3VycmVudCA9ICpuZXh0OwotCSAgZnJlZSAobmV4dCk7Ci0JICBnb3RvIHRhaWxfcmVjdXJzZTsKLQl9Ci0gICAgfQotCi0gIC8qIEEgY29tbWVudCBjaGFyYWN0ZXIgYWx3YXlzIG1lYW5zIHRvIGRyb3AgZXZlcnl0aGluZyB1bnRpbCB0aGUKLSAgICAgbmV4dCBuZXdsaW5lLiAgKi8KLSAgaWYgKGMgPT0gQ09NTUVOVF9DSEFSKQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JfQotICAgICAgd2hpbGUgKGMgIT0gJ1xuJyk7Ci0gICAgICArK2N1cnJlbnQubGluZW5vOwotICAgICAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotICAgICAgZ290byB0YWlsX3JlY3Vyc2U7Ci0gICAgfQotCi0gIC8qIEFuICdAJyBpbnRyb2R1Y2VzIGFuIGluY2x1ZGUgZmlsZS4gICovCi0gIGlmIChjID09ICdAJykKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCSAgaWYgKGMgPT0gJ1xuJykKLQkgICAgKytjdXJyZW50LmxpbmVubzsKLQl9Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpKTsKLSAgICAgIEJVRl9JTklUICgpOwotICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpICYmIGMgIT0gRU9GKQotCXsKLQkgIEJVRl9BREQgKGMpOwotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JfQotICAgICAgQlVGX0ZJTklTSCAoKTsKLQotICAgICAgdW5nZXRjIChjLCBjdXJyZW50LmZpbGUpOwotICAgICAgCi0gICAgICBubG1sZXhfZmlsZV9wdXNoIChsZXhfYnVmKTsKLSAgICAgIGdvdG8gdGFpbF9yZWN1cnNlOwotICAgIH0KLQotICAvKiBBIG5vbi1zcGFjZSBjaGFyYWN0ZXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBtdXN0IGJlIHRoZSBzdGFydCBvZgotICAgICBhIGtleXdvcmQuICAqLwotICBpZiAoY3VycmVudC5zdGF0ZSA9PSBCRUdJTk5JTkdfT0ZfTElORSkKLSAgICB7Ci0gICAgICBCVUZfSU5JVCAoKTsKLSAgICAgIHdoaWxlIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgYykgfHwgYyA9PSAnXycpCi0JewotCSAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgQlVGX0FERCAodG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpKTsKLQkgIGVsc2UKLQkgICAgQlVGX0FERCAoYyk7Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQl9Ci0gICAgICBCVUZfRklOSVNIICgpOwotCi0gICAgICBpZiAoYyAhPSBFT0YgJiYgISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykgJiYgYyAhPSAnLCcpCi0JewotCSAgbmxtaGVhZGVyX2lkZW50aWZ5ICgpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczolZDogaWxsZWdhbCBjaGFyYWN0ZXIgaW4ga2V5d29yZDogJWNcbiIpLAotCQkgICBjdXJyZW50Lm5hbWUsIGN1cnJlbnQubGluZW5vLCBjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBLRVlXT1JEX0NPVU5UOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAobGV4X2J1ZlswXSA9PSBrZXl3b3JkX3Rva2Vuc1tpXS5rZXl3b3JkWzBdCi0JCSAgJiYgc3RyY21wIChsZXhfYnVmLCBrZXl3b3JkX3Rva2Vuc1tpXS5rZXl3b3JkKSA9PSAwKQotCQl7Ci0JCSAgLyogUHVzaGluZyBiYWNrIHRoZSBmaW5hbCB3aGl0ZXNwYWNlIGF2b2lkcyB3b3JyeWluZwotCQkgICAgIGFib3V0IFxuIGhlcmUuICAqLwotCQkgIHVuZ2V0YyAoYywgY3VycmVudC5maWxlKTsKLQkJICBjdXJyZW50LnN0YXRlID0gSU5fTElORTsKLQkJICByZXR1cm4ga2V5d29yZF90b2tlbnNbaV0udG9rZW47Ci0JCX0KLQkgICAgfQotCSAgCi0JICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVkOiB1bnJlY29nbml6ZWQga2V5d29yZDogJXNcbiIpLAotCQkgICBjdXJyZW50Lm5hbWUsIGN1cnJlbnQubGluZW5vLCBsZXhfYnVmKTsKLQl9Ci0KLSAgICAgICsrcGFyc2VfZXJyb3JzOwotICAgICAgLyogVHJlYXQgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIGFzIGEgY29tbWVudC4gICovCi0gICAgICB1bmdldGMgKENPTU1FTlRfQ0hBUiwgY3VycmVudC5maWxlKTsKLSAgICAgIGdvdG8gdGFpbF9yZWN1cnNlOwotICAgIH0KLQotICAvKiBQYXJlbnRoZXNlcyBqdXN0IHJlcHJlc2VudCB0aGVtc2VsdmVzLiAgKi8KLSAgaWYgKGMgPT0gJygnIHx8IGMgPT0gJyknKQotICAgIHJldHVybiBjOwotCi0gIC8qIEhhbmRsZSBxdW90ZWQgc3RyaW5ncy4gICovCi0gIGlmIChjID09ICciJyB8fCBjID09ICdcJycpCi0gICAgewotICAgICAgaW50IHF1b3RlOwotICAgICAgaW50IHN0YXJ0X2xpbmVubzsKLQotICAgICAgcXVvdGUgPSBjOwotICAgICAgc3RhcnRfbGluZW5vID0gY3VycmVudC5saW5lbm87Ci0KLSAgICAgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotICAgICAgQlVGX0lOSVQgKCk7Ci0gICAgICB3aGlsZSAoYyAhPSBxdW90ZSAmJiBjICE9IEVPRikKLQl7Ci0JICBCVUZfQUREIChjKTsKLQkgIGlmIChjID09ICdcbicpCi0JICAgICsrY3VycmVudC5saW5lbm87Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQl9Ci0gICAgICBCVUZfRklOSVNIICgpOwotCi0gICAgICBpZiAoYyA9PSBFT0YpCi0JewotCSAgbmxtaGVhZGVyX2lkZW50aWZ5ICgpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczolZDogZW5kIG9mIGZpbGUgaW4gcXVvdGVkIHN0cmluZ1xuIiksCi0JCSAgIGN1cnJlbnQubmFtZSwgc3RhcnRfbGluZW5vKTsKLQkgICsrcGFyc2VfZXJyb3JzOwotCX0KLQotICAgICAgLyogRklYTUU6IFBvc3NpYmxlIG1lbW9yeSBsZWFrLiAgKi8KLSAgICAgIHl5bHZhbC5zdHJpbmcgPSB4c3RyZHVwIChsZXhfYnVmKTsKLSAgICAgIHJldHVybiBRVU9URURfU1RSSU5HOwotICAgIH0KLQotICAvKiBHYXRoZXIgYSBnZW5lcmljIGFyZ3VtZW50LiAgKi8KLSAgQlVGX0lOSVQgKCk7Ci0gIHdoaWxlICghIGlzc3BhY2UgKGMpCi0JICYmIGMgIT0gJywnCi0JICYmIGMgIT0gQ09NTUVOVF9DSEFSCi0JICYmIGMgIT0gJygnCi0JICYmIGMgIT0gJyknKQotICAgIHsKLSAgICAgIEJVRl9BREQgKGMpOwotICAgICAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0gICAgfQotICBCVUZfRklOSVNIICgpOwotCi0gIHVuZ2V0YyAoYywgY3VycmVudC5maWxlKTsKLQotICAvKiBGSVhNRTogUG9zc2libGUgbWVtb3J5IGxlYWsuICAqLwotICB5eWx2YWwuc3RyaW5nID0geHN0cmR1cCAobGV4X2J1Zik7Ci0gIHJldHVybiBTVFJJTkc7Ci19Ci0MCi0vKiBHZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZy4gICovCi0KLXN0YXRpYyBsb25nCi1ubG1sZXhfZ2V0X251bWJlciAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgbG9uZyByZXQ7Ci0gIGNoYXIgKnNlbmQ7Ci0KLSAgcmV0ID0gc3RydG9sIChzLCAmc2VuZCwgMTApOwotICBpZiAoKnNlbmQgIT0gJ1wwJykKLSAgICBubG1oZWFkZXJfd2FybiAoXygiYmFkIG51bWJlciIpLCAtMSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFByZWZpeCB0aGUgbmxtY29udiB3YXJuaW5ncyB3aXRoIGEgbm90ZSBhcyB0byB3aGVyZSB0aGV5IGNvbWUgZnJvbS4KLSAgIFdlIGRvbid0IHVzZSBwcm9ncmFtX25hbWUgb24gZXZlcnkgd2FybmluZywgYmVjYXVzZSB0aGVuIHNvbWUKLSAgIHZlcnNpb25zIG9mIHRoZSBlbWFjcyBuZXh0LWVycm9yIGZ1bmN0aW9uIGNhbid0IHJlY29nbml6ZSB0aGUgbGluZQotICAgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLW5sbWhlYWRlcl9pZGVudGlmeSAoKQotewotICBzdGF0aWMgaW50IGRvbmU7Ci0KLSAgaWYgKCEgZG9uZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBwcm9ibGVtcyBpbiBOTE0gY29tbWFuZCBsYW5ndWFnZSBpbnB1dDpcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZG9uZSA9IDE7Ci0gICAgfQotfQotCi0vKiBJc3N1ZSBhIHdhcm5pbmcuICAqLwotCi1zdGF0aWMgdm9pZAotbmxtaGVhZGVyX3dhcm4gKHMsIGltYXgpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBpbWF4OwotewotICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlcyIsIGN1cnJlbnQubmFtZSwgY3VycmVudC5saW5lbm8sIHMpOwotICBpZiAoaW1heCAhPSAtMSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgKG1heCAlZCkiLCBpbWF4KTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotLyogUmVwb3J0IGFuIGVycm9yLiAgKi8KLQotc3RhdGljIHZvaWQKLW5sbWhlYWRlcl9lcnJvciAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgbmxtaGVhZGVyX3dhcm4gKHMsIC0xKTsKLSAgKytwYXJzZV9lcnJvcnM7Ci19Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqCi1zdHJpbmdfbGlzdF9jb25zIChzLCBsKQotICAgICBjaGFyICpzOwotICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2xpc3QpKTsKLSAgcmV0LT5uZXh0ID0gbDsKLSAgcmV0LT5zdHJpbmcgPSBzOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBBcHBlbmQgYSBzdHJpbmcgbGlzdCB0byBhbm90aGVyIHN0cmluZyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqCi1zdHJpbmdfbGlzdF9hcHBlbmQgKGwxLCBsMikKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsMTsKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsMjsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cmluZ19saXN0ICoqcHA7Ci0KLSAgZm9yIChwcCA9ICZsMTsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gbDI7Ci0gIHJldHVybiBsMTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIGEgc3RyaW5nIGxpc3QuICAqLwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICoKLXN0cmluZ19saXN0X2FwcGVuZDEgKGwsIHMpCi0gICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKLSAgICAgY2hhciAqczsKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpuOwotICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwcDsKLQotICBuID0gKHN0cnVjdCBzdHJpbmdfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdHJpbmdfbGlzdCkpOwotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+c3RyaW5nID0gczsKLSAgZm9yIChwcCA9ICZsOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBuOwotICByZXR1cm4gbDsKLX0KLQotLyogRHVwbGljYXRlIGEgc3RyaW5nIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXhzdHJkdXAgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbGVuOwotICBjaGFyICpyZXQ7Ci0KLSAgbGVuID0gc3RybGVuIChzKTsKLSAgcmV0ID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIHN0cmNweSAocmV0LCBzKTsKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25tLjEgYi9iaW51dGlscy9ubS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFkOTllLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25tLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG5tIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLW5tIFwtIGxpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG5tCi0uUkIgIltcfCIgXC1hIHwgXC1cLWRlYnVnXC1zeW1zICJcfF0iIAotLlJCICJbXHwiIFwtZyB8IFwtXC1leHRlcm5cLW9ubHkgIlx8XSIKLS5SQiAiW1x8IiBcLUIgIlx8XSIgIAotLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLUQgfCBcLVwtZHluYW1pYyAiXHxdIiAKLS5SQiAiW1x8IiBcLXMgfCBcLVwtcHJpbnRcLWFybWFwICJcfF0iIAotLlJCICJbXHwiIFwtbyB8IFwtXC1wcmludFwtZmlsZVwtbmFtZSAiXHxdIiAgCi0uUkIgIltcfCIgXC1uIHwgXC1cLW51bWVyaWNcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC1wIHwgXC1cLW5vXC1zb3J0ICJcfF0iCi0uUkIgIltcfCIgXC1yIHwgXC1cLXJldmVyc2VcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXNpemVcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC11IHwgXC1cLXVuZGVmaW5lZFwtb25seSAiXHxdIiAgCi0uUkIgIltcfCIgXC1sIHwgXC1cLWxpbmVcLW51bWJlcnMgIlx8XSIKLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIiAgCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIgIAotLlJCICJbXHwiICJcLXQgXGZJcmFkaXgiIHwgXC1cLXJhZGl4PVxmSXJhZGl4ICJcfF0iCi0uUkIgIltcfCIgXC1QIHwgLS1wb3J0YWJpbGl0eSAiXHxdIgotLlJCICJbXHwiICJcLWYgXGZJZm9ybWF0IiB8IFwtXC1mb3JtYXQ9XGZJZm9ybWF0ICJcfF0iCi0uUkIgIltcfCIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIgIlx8XSIKLS5SQiAiW1x8IiBcYwotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC5cfF0KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1HTlUgXGMKLS5CIG5tXGMKLVwmIGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIFxjCi0uSSBvYmpmaWxlXGMKLVwmLiAgSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBnaXZlbiBhcyBhcmd1bWVudHMsIFxjCi0uQiBubVxjCi1cJiBhc3N1bWVzIGBcfFxjCi0uQiBhLm91dFxjCi1cfCcuCi0KLS5TSCBPUFRJT05TCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotLlRQCi0uQiBcLUEKLS5UUAotLkIgXC1vCi0uVFAKLS5CIFwtXC1wcmludFwtZmlsZVwtbmFtZSAKLVByZWNlZGUgZWFjaCBzeW1ib2wgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgd2hlcmUgaXQgd2FzIGZvdW5kLAotcmF0aGVyIHRoYW4gaWRlbnRpZnlpbmcgdGhlIGlucHV0IGZpbGUgb25jZSBvbmx5IGJlZm9yZSBhbGwgb2YgaXRzCi1zeW1ib2xzLiAKLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWRlYnVnXC1zeW1zIAotRGlzcGxheSBkZWJ1Z2dlci1vbmx5IHN5bWJvbHM7IG5vcm1hbGx5IHRoZXNlIGFyZSBub3QgbGlzdGVkLgotCi0uVFAKLS5CIFwtQgotVGhlIHNhbWUgYXMKLS5CIFwtXC1mb3JtYXQ9YnNkCi0oZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTUlQUyBcZkJubVxmUCkuCi0KLS5UUAotLkIgXC1DCi0uVFAKLS5CIFwtXC1kZW1hbmdsZQotRGVjb2RlIChcZklkZW1hbmdsZVxmUCkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4KLQotLlRQCi0uQiBcLUQKLS5UUAotLkIgXC1cLWR5bmFtaWMKLURpc3BsYXkgdGhlIGR5bmFtaWMgc3ltYm9scyByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIHN5bWJvbHMuICBUaGlzIGlzCi1vbmx5IG1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAotbGlicmFyaWVzLgotCi0uVFAKLS5CICJcLWYgXGZJZm9ybWF0IgotVXNlIHRoZSBvdXRwdXQgZm9ybWF0IFxmSWZvcm1hdFxmUCwgd2hpY2ggY2FuIGJlIGBgYnNkJycsCi1gYHN5c3YnJywgb3IgYGBwb3NpeCcnLiAgVGhlIGRlZmF1bHQgaXMgYGBic2QnJy4KLU9ubHkgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBcZklmb3JtYXRcZlAgaXMgc2lnbmlmaWNhbnQ7IGl0IGNhbiBiZQotZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UuCi0KLS5UUAotLkIgXC1nCi0uVFAKLS5CIFwtXC1leHRlcm5cLW9ubHkgCi1EaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLW4KLS5UUAotLkIgXC12Ci0uVFAKLS5CIFwtXC1udW1lcmljXC1zb3J0IAotU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IHRoZWlyIGFkZHJlc3Nlcywgbm90IGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyCi1uYW1lcy4gCi0KLS5UUAotLkIgXC1wCi0uVFAKLS5CIFwtXC1ub1wtc29ydCAKLURvbid0IGJvdGhlciB0byBzb3J0IHRoZSBzeW1ib2xzIGluIGFueSBvcmRlcjsganVzdCBwcmludCB0aGVtIGluIHRoZQotb3JkZXIgZW5jb3VudGVyZWQuCi0KLS5UUAotLkIgXC1QCi0uVFAKLS5CIFwtXC1wb3J0YWJpbGl0eQotVXNlIHRoZSBQT1NJWC4yIHN0YW5kYXJkIG91dHB1dCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3JtYXQuCi1FcXVpdmFsZW50IHRvIGBgXC1mIHBvc2l4JycuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1wcmludFwtYXJtYXAKLVdoZW4gbGlzdGluZyBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzLCBpbmNsdWRlIHRoZSBpbmRleDogYSBtYXBwaW5nCi0oc3RvcmVkIGluIHRoZSBhcmNoaXZlIGJ5IFxjCi0uQiBhclxjCi1cJiBvciBcYwotLkIgcmFubGliXGMKLVwmKSBvZiB3aGF0IG1vZHVsZXMKLWNvbnRhaW4gZGVmaW5pdGlvbnMgZm9yIHdoYXQgbmFtZXMuCi0KLS5UUAotLkIgXC1yCi0uVFAKLS5CIFwtXC1yZXZlcnNlXC1zb3J0IAotUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQgKHdoZXRoZXIgbnVtZXJpYyBvciBhbHBoYWJldGljKTsgbGV0IHRoZQotbGFzdCBjb21lIGZpcnN0LgotCi0uVFAKLS5CIFwtXC1zaXplXC1zb3J0IAotU29ydCBzeW1ib2xzIGJ5IHNpemUuICBUaGUgc2l6ZSBpcyBjb21wdXRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi10aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aCB0aGUgbmV4dCBoaWdoZXIKLXZhbHVlLiAgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBwcmludGVkLCByYXRoZXIgdGhhbiB0aGUgdmFsdWUuCi0KLS5UUAotLkIgIlwtdCBcZklyYWRpeCIKLS5UUAotLkIgIlwtXC1yYWRpeD1cZklyYWRpeCIKLVVzZSBcZklyYWRpeFxmUCBhcyB0aGUgcmFkaXggZm9yIHByaW50aW5nIHRoZSBzeW1ib2wgdmFsdWVzLiAgSXQgbXVzdCBiZQotYGBkJycgZm9yIGRlY2ltYWwsIGBgbycnIGZvciBvY3RhbCwgb3IgYGB4JycgZm9yIGhleGFkZWNpbWFsLgotCi0uVFAKLS5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgotU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgotU2VlIAotLkJSIG9iamR1bXAgKCAxICksCi1mb3IgaW5mb3JtYXRpb24gb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KLQotLlRQCi0uQiBcLXUKLS5UUAotLkIgXC1cLXVuZGVmaW5lZFwtb25seSAKLURpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyAodGhvc2UgZXh0ZXJuYWwgdG8gZWFjaCBvYmplY3QgZmlsZSkuCi0KLS5UUAotLkIgXC1sCi0uVFAKLS5CIFwtXC1saW5lXC1udW1iZXJzCi1Gb3IgZWFjaCBzeW1ib2wsIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdHJ5IHRvIGZpbmQgYSBmaWxlbmFtZSBhbmQKLWxpbmUgbnVtYmVyLiAgRm9yIGEgZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLWFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIEZvciBhbiB1bmRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZQotbnVtYmVyIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbC4gIElmIGxpbmUgbnVtYmVyCi1pbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQsIHByaW50IGl0IGFmdGVyIHRoZSBvdGhlciBzeW1ib2wgaW5mb3JtYXRpb24uCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgbm0KLWFuZCBleGl0LgotCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgbm0KLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKLS5CUiBhciAiKCIgMSAiKSwiCi0uQlIgb2JqZHVtcCAoIDEgKSwKLS5CUiByYW5saWIgIigiIDEgIikuIgotCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25tLmMgYi9iaW51dGlscy9ubS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTFiN2ZiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU4ICswLDAgQEAKLS8qIG5tLmMgLS0gRGVzY3JpYmUgc3ltYm9sIHRhYmxlIG9mIGEgcmVsIGZpbGUuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0vKiBXaGVuIHNvcnRpbmcgYnkgc2l6ZSwgd2UgdXNlIHRoaXMgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHNpemUgYW5kIGEKLSAgIHBvaW50ZXIgdG8gdGhlIG1pbmlzeW1ib2wuICAqLwotCi1zdHJ1Y3Qgc2l6ZV9zeW0KLXsKLSAgY29uc3QgUFRSIG1pbmlzeW07Ci0gIGJmZF92bWEgc2l6ZTsKLX07Ci0KLS8qIFdoZW4gZmV0Y2hpbmcgcmVsb2NzLCB3ZSB1c2UgdGhpcyBzdHJ1Y3R1cmUgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZ2V0X3JlbG9jcy4gICovCi0KLXN0cnVjdCBnZXRfcmVsb2NzX2luZm8KLXsKLSAgYXNlY3Rpb24gKipzZWNzOwotICBhcmVsZW50ICoqKnJlbG9jczsKLSAgbG9uZyAqcmVsY291bnQ7Ci0gIGFzeW1ib2wgKipzeW1zOwotfTsKLQotc3RhdGljIHZvaWQKLXVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcHJpbnRfcmFkaXggUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zZXRfb3V0cHV0X2Zvcm1hdCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3JlbF9maWxlIFBBUkFNUyAoKGJmZCAqIGZpbGUsIGJmZCAqIGFyY2hpdmUpKTsKLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCkpOwotCi1zdGF0aWMgbG9uZwotc29ydF9zeW1ib2xzX2J5X3NpemUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LAotCQkJICAgICAgc3RydWN0IHNpemVfc3ltICoqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3NpemVfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgc3RydWN0IHNpemVfc3ltICosIGxvbmcsIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1kZWZfZW50cnkgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi0vKiBUaGUgc29ydGluZyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbnVtZXJpY19yZXZlcnNlIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbm9uX251bWVyaWNfcmV2ZXJzZSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1zaXplX2ZvcndhcmQxIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLXNpemVfZm9yd2FyZDIgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogVGhlIG91dHB1dCBmb3JtYXR0aW5nIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3N5c3YgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfcG9zaXggUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfYnNkIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9zeXN2IFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCBQQVJBTVMgKChjaGFyICphcmNoaXZlLCBDT05TVCBjaGFyICpmaWxlbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3ZhbHVlIFBBUkFNUyAoKGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX2JzZCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX3N5c3YgUEFSQU1TICgoc3ltYm9sX2luZm8gKiBpbmZvLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19wb3NpeCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWdldF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMuICAqLwotc3RydWN0IG91dHB1dF9mbnMKLSAgewotICAgIC8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICAgIHZvaWQgKCpwcmludF9vYmplY3RfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gICAgdm9pZCAoKnByaW50X2FyY2hpdmVfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfYXJjaGl2ZV9tZW1iZXIpIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKLSAgICAgICBjb250YWluaW5nIGEgc3ltYm9sLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2ZpbGVuYW1lKSBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi0gICAgLyogUHJpbnQgYSBsaW5lIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKHN5bWJvbF9pbmZvICogaW5mbywgYmZkICogYWJmZCkpOwotICB9Owotc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zIGZvcm1hdHNbXSA9Ci17Ci0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9ic2QsCi0gICBwcmludF9hcmNoaXZlX21lbWJlcl9ic2QsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfc3ltYm9sX2luZm9fYnNkfSwKLSAge3ByaW50X29iamVjdF9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfc3lzdiwKLSAgIHByaW50X3N5bWJvbF9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfc3ltYm9sX2luZm9fc3lzdn0sCi0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4LAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXgsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9zeW1ib2xfaW5mb19wb3NpeH0KLX07Ci0KLS8qIEluZGljZXMgaW4gYGZvcm1hdHMnLiAgKi8KLSNkZWZpbmUgRk9STUFUX0JTRCAwCi0jZGVmaW5lIEZPUk1BVF9TWVNWIDEKLSNkZWZpbmUgRk9STUFUX1BPU0lYIDIKLSNkZWZpbmUgRk9STUFUX0RFRkFVTFQgRk9STUFUX0JTRAotCi0vKiBUaGUgb3V0cHV0IGZvcm1hdCB0byB1c2UuICAqLwotc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zICpmb3JtYXQgPSAmZm9ybWF0c1tGT1JNQVRfREVGQVVMVF07Ci0KLQotLyogQ29tbWFuZCBvcHRpb25zLiAgKi8KLQotc3RhdGljIGludCBkb19kZW1hbmdsZSA9IDA7CS8qIFByZXR0eSBwcmludCBDKysgc3ltYm9sIG5hbWVzLiAgKi8KLXN0YXRpYyBpbnQgZXh0ZXJuYWxfb25seSA9IDA7CS8qIHByaW50IGV4dGVybmFsIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBkZWZpbmVkX29ubHkgPSAwOwkvKiBQcmludCBkZWZpbmVkIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBub19zb3J0ID0gMDsJCS8qIGRvbid0IHNvcnQ7IHByaW50IHN5bXMgaW4gb3JkZXIgZm91bmQgKi8KLXN0YXRpYyBpbnQgcHJpbnRfZGVidWdfc3ltcyA9IDA7CS8qIHByaW50IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyB0b28gKi8KLXN0YXRpYyBpbnQgcHJpbnRfYXJtYXAgPSAwOwkvKiBkZXNjcmliZSBfXy5TWU1ERUYgZGF0YSBpbiBhcmNoaXZlIGZpbGVzLiAgKi8KLXN0YXRpYyBpbnQgcmV2ZXJzZV9zb3J0ID0gMDsJLyogc29ydCBpbiBkb3dud2FyZChhbHBoYSBvciBudW1lcmljKSBvcmRlciAqLwotc3RhdGljIGludCBzb3J0X251bWVyaWNhbGx5ID0gMDsJLyogc29ydCBpbiBudW1lcmljIHJhdGhlciB0aGFuIGFscGhhIG9yZGVyICovCi1zdGF0aWMgaW50IHNvcnRfYnlfc2l6ZSA9IDA7CS8qIHNvcnQgYnkgc2l6ZSBvZiBzeW1ib2wgKi8KLXN0YXRpYyBpbnQgdW5kZWZpbmVkX29ubHkgPSAwOwkvKiBwcmludCB1bmRlZmluZWQgc3ltYm9scyBvbmx5ICovCi1zdGF0aWMgaW50IGR5bmFtaWMgPSAwOwkJLyogcHJpbnQgZHluYW1pYyBzeW1ib2xzLiAgKi8KLXN0YXRpYyBpbnQgc2hvd192ZXJzaW9uID0gMDsJLyogc2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLXN0YXRpYyBpbnQgc2hvd19zdGF0cyA9IDA7CS8qIHNob3cgc3RhdGlzdGljcyAqLwotc3RhdGljIGludCBsaW5lX251bWJlcnMgPSAwOwkvKiBwcmludCBsaW5lIG51bWJlcnMgZm9yIHN5bWJvbHMgKi8KLQotLyogV2hlbiB0byBwcmludCB0aGUgbmFtZXMgb2YgZmlsZXMuICBOb3QgbXV0dWFsbHkgZXhjbHVzaXZlIGluIFNZU1YgZm9ybWF0LiAgKi8KLXN0YXRpYyBpbnQgZmlsZW5hbWVfcGVyX2ZpbGUgPSAwOwkvKiBPbmNlIHBlciBmaWxlLCBvbiBpdHMgb3duIGxpbmUuICAqLwotc3RhdGljIGludCBmaWxlbmFtZV9wZXJfc3ltYm9sID0gMDsJLyogT25jZSBwZXIgc3ltYm9sLCBhdCBzdGFydCBvZiBsaW5lLiAgKi8KLQotLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgYSBzeW1ib2wgdmFsdWUuICAqLwotI2lmbmRlZiBCRkQ2NAotc3RhdGljIGNoYXIgdmFsdWVfZm9ybWF0W10gPSAiJTA4bHgiOwotI2Vsc2UKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi1zdGF0aWMgY2hhciB2YWx1ZV9mb3JtYXRbXSA9ICIlMDE2bHgiOwotI2Vsc2UKLS8qIFdlIGRvbid0IHVzZSB2YWx1ZV9mb3JtYXQgZm9yIHRoaXMgY2FzZS4gICovCi0jZW5kaWYKLSNlbmRpZgotc3RhdGljIGludCBwcmludF9yYWRpeCA9IDE2OwotLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgc3RhYiBpbmZvLiAgKi8KLXN0YXRpYyBjaGFyIG90aGVyX2Zvcm1hdFtdID0gIiUwMngiOwotc3RhdGljIGNoYXIgZGVzY19mb3JtYXRbXSA9ICIlMDR4IjsKLQotc3RhdGljIGNoYXIgKnRhcmdldCA9IE5VTEw7Ci0KLS8qIFVzZWQgdG8gY2FjaGUgdGhlIGxpbmUgbnVtYmVycyBmb3IgYSBCRkQuICAqLwotc3RhdGljIGJmZCAqbGluZW5vX2NhY2hlX2JmZDsKLXN0YXRpYyBiZmQgKmxpbmVub19jYWNoZV9yZWxfYmZkOwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZGVidWctc3ltcyIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfZGVidWdfc3ltcywgMX0sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgJmRvX2RlbWFuZ2xlLCAxfSwKLSAgeyJkeW5hbWljIiwgbm9fYXJndW1lbnQsICZkeW5hbWljLCAxfSwKLSAgeyJleHRlcm4tb25seSIsIG5vX2FyZ3VtZW50LCAmZXh0ZXJuYWxfb25seSwgMX0sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImxpbmUtbnVtYmVycyIsIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7Im5vLWNwbHVzIiwgbm9fYXJndW1lbnQsICZkb19kZW1hbmdsZSwgMH0sICAvKiBMaW51eCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgeyJuby1kZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDB9LAotICB7Im5vLXNvcnQiLCBub19hcmd1bWVudCwgJm5vX3NvcnQsIDF9LAotICB7Im51bWVyaWMtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9udW1lcmljYWxseSwgMX0sCi0gIHsicG9ydGFiaWxpdHkiLCBub19hcmd1bWVudCwgMCwgJ1AnfSwKLSAgeyJwcmludC1hcm1hcCIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfYXJtYXAsIDF9LAotICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCAwLCAnbyd9LAotICB7InJhZGl4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCi0gIHsicmV2ZXJzZS1zb3J0Iiwgbm9fYXJndW1lbnQsICZyZXZlcnNlX3NvcnQsIDF9LAotICB7InNpemUtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9ieV9zaXplLCAxfSwKLSAgeyJzdGF0cyIsIG5vX2FyZ3VtZW50LCAmc2hvd19zdGF0cywgMX0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMH0sCi0gIHsiZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZkZWZpbmVkX29ubHksIDF9LAotICB7InVuZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZ1bmRlZmluZWRfb25seSwgMX0sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAmc2hvd192ZXJzaW9uLCAxfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQwKLS8qIFNvbWUgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstYUFCQ0RnbG5vcFByc3V2Vl0gWy10IHJhZGl4XSBbLS1yYWRpeD1yYWRpeF0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCi0gICAgICAgWy0tZGVidWctc3ltc10gWy0tZXh0ZXJuLW9ubHldIFstLXByaW50LWFybWFwXSBbLS1wcmludC1maWxlLW5hbWVdXG5cCi0gICAgICAgWy0tbnVtZXJpYy1zb3J0XSBbLS1uby1zb3J0XSBbLS1yZXZlcnNlLXNvcnRdIFstLXNpemUtc29ydF1cblwKLSAgICAgICBbLS11bmRlZmluZWQtb25seV0gWy0tcG9ydGFiaWxpdHldIFstZiB7YnNkLHN5c3YscG9zaXh9XVxuXAotICAgICAgIFstLWZvcm1hdD17YnNkLHN5c3YscG9zaXh9XSBbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdIFstLWR5bmFtaWNdXG5cCi0gICAgICAgWy0tZGVmaW5lZC1vbmx5XSBbLS1saW5lLW51bWJlcnNdXG5cCi0gICAgICAgWy0tdmVyc2lvbl0gWy0taGVscF1cblwKLSAgICAgICBbZmlsZS4uLl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLS8qIFNldCB0aGUgcmFkaXggZm9yIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHNpemUgYWNjb3JkaW5nIHRvIFJBRElYLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9wcmludF9yYWRpeCAocmFkaXgpCi0gICAgIGNoYXIgKnJhZGl4OwotewotICBzd2l0Y2ggKCpyYWRpeCkKLSAgICB7Ci0gICAgY2FzZSAneCc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdvJzoKLSAgICAgIGlmICgqcmFkaXggPT0gJ2QnKQotCXByaW50X3JhZGl4ID0gMTA7Ci0gICAgICBlbHNlCi0JcHJpbnRfcmFkaXggPSA4OwotI2lmbmRlZiBCRkQ2NAotICAgICAgdmFsdWVfZm9ybWF0WzRdID0gKnJhZGl4OwotI2Vsc2UKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0gICAgICB2YWx1ZV9mb3JtYXRbNV0gPSAqcmFkaXg7Ci0jZWxzZQotICAgICAgLyogVGhpcyBjYXNlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG9jdGFsIGFuZCBkZWNpbWFsCi0gICAgICAgICBwcmludGluZy4gICovCi0jZW5kaWYKLSNlbmRpZgotICAgICAgb3RoZXJfZm9ybWF0WzNdID0gZGVzY19mb3JtYXRbM10gPSAqcmFkaXg7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgcmFkaXhcbiIpLCBwcm9ncmFtX25hbWUsIHJhZGl4KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF9vdXRwdXRfZm9ybWF0IChmKQotICAgICBjaGFyICpmOwotewotICBpbnQgaTsKLQotICBzd2l0Y2ggKCpmKQotICAgIHsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdCJzoKLSAgICAgIGkgPSBGT1JNQVRfQlNEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBpID0gRk9STUFUX1BPU0lYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBpID0gRk9STUFUX1NZU1Y7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgb3V0cHV0IGZvcm1hdFxuIiksIHByb2dyYW1fbmFtZSwgZik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGZvcm1hdCA9ICZmb3JtYXRzW2ldOwotfQotDAotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgcmV0dmFsOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFBQkNEZWY6Z2xub3BQcnN0OnV2ViIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnYSc6Ci0JICBwcmludF9kZWJ1Z19zeW1zID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotCWNhc2UgJ28nOgotCSAgZmlsZW5hbWVfcGVyX3N5bWJvbCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdCJzoJCS8qIEZvciBNSVBTIGNvbXBhdGliaWxpdHkuICAqLwotCSAgc2V0X291dHB1dF9mb3JtYXQgKCJic2QiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgZG9fZGVtYW5nbGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkeW5hbWljID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgLyogSWdub3JlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gICovCi0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIHNldF9vdXRwdXRfZm9ybWF0IChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBleHRlcm5hbF9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JY2FzZSAnbCc6Ci0JICBsaW5lX251bWJlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JY2FzZSAndic6Ci0JICBzb3J0X251bWVyaWNhbGx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgbm9fc29ydCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLQkgIHNldF9vdXRwdXRfZm9ybWF0ICgicG9zaXgiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgcmV2ZXJzZV9zb3J0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgcHJpbnRfYXJtYXAgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzZXRfcHJpbnRfcmFkaXggKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIHVuZGVmaW5lZF9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAyMDA6CQkvKiAtLXRhcmdldCAqLwotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlIDA6CQkvKiBBIGxvbmcgb3B0aW9uIHRoYXQganVzdCBzZXRzIGEgZmxhZy4gICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoIm5tIik7Ci0KLSAgLyogT0ssIGFsbCBvcHRpb25zIG5vdyBwYXJzZWQuICBJZiBubyBmaWxlbmFtZSBzcGVjaWZpZWQsIGRvIGEub3V0LiAgKi8KLSAgaWYgKG9wdGluZCA9PSBhcmdjKQotICAgIHJldHVybiAhZGlzcGxheV9maWxlICgiYS5vdXQiKTsKLQotICByZXR2YWwgPSAwOwotCi0gIGlmIChhcmdjIC0gb3B0aW5kID4gMSkKLSAgICBmaWxlbmFtZV9wZXJfZmlsZSA9IDE7Ci0KLSAgLyogV2Ugd2VyZSBnaXZlbiBzZXZlcmFsIGZpbGVuYW1lcyB0byBkby4gICovCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIGlmICghZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSkpCi0JcmV0dmFsKys7Ci0gICAgfQotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotI2lmZGVmIEhBVkVfU0JSSwotICBpZiAoc2hvd19zdGF0cykKLSAgICB7Ci0gICAgICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksIHByb2dyYW1fbmFtZSwKLQkgICAgICAgKGxvbmcpIChsaW0gLSAoY2hhciAqKSAmZW52aXJvbikpOwotICAgIH0KLSNlbmRpZgotCi0gIGV4aXQgKHJldHZhbCk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZGlzcGxheV9hcmNoaXZlIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGJmZCAqYXJmaWxlID0gTlVMTDsKLSAgYmZkICpsYXN0X2FyZmlsZSA9IE5VTEw7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICAoKmZvcm1hdC0+cHJpbnRfYXJjaGl2ZV9maWxlbmFtZSkgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQotICBpZiAocHJpbnRfYXJtYXApCi0gICAgcHJpbnRfc3ltZGVmX2VudHJ5IChmaWxlKTsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLQotICAgICAgaWYgKGFyZmlsZSA9PSBOVUxMKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYXJmaWxlLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotCXsKLQkgICgqZm9ybWF0LT5wcmludF9hcmNoaXZlX21lbWJlcikgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpLAotCQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhcmZpbGUpKTsKLQkgIGRpc3BsYXlfcmVsX2ZpbGUgKGFyZmlsZSwgZmlsZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYXJmaWxlKSk7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCSAgICB7Ci0JICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICAgICAgZnJlZSAobWF0Y2hpbmcpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQl7Ci0JICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLQkgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotCSAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotCX0KLSAgICAgIGxhc3RfYXJmaWxlID0gYXJmaWxlOwotICAgIH0KLQotICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLSAgICAgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotICAgICAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBib29sZWFuIHJldHZhbCA9IHRydWU7Ci0gIGJmZCAqZmlsZTsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpKQotICAgIHsKLSAgICAgIGRpc3BsYXlfYXJjaGl2ZSAoZmlsZSk7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGZpbGUsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgKCpmb3JtYXQtPnByaW50X29iamVjdF9maWxlbmFtZSkgKGZpbGVuYW1lKTsKLSAgICAgIGRpc3BsYXlfcmVsX2ZpbGUgKGZpbGUsIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9jbG9zZSAoZmlsZSkgPT0gZmFsc2UpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgbGluZW5vX2NhY2hlX2JmZCA9IE5VTEw7Ci0gIGxpbmVub19jYWNoZV9yZWxfYmZkID0gTlVMTDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogVGhlc2UgZ2xvYmFscyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGludG8gdGhlIHNvcnRpbmcKLSAgIHJvdXRpbmVzLiAgKi8KLXN0YXRpYyBiZmQgKnNvcnRfYmZkOwotc3RhdGljIGJvb2xlYW4gc29ydF9keW5hbWljOwotc3RhdGljIGFzeW1ib2wgKnNvcnRfeDsKLXN0YXRpYyBhc3ltYm9sICpzb3J0X3k7Ci0KLS8qIFN5bWJvbC1zb3J0aW5nIHByZWRpY2F0ZXMgKi8KLSNkZWZpbmUgdmFsdWVvZih4KSAoKHgpLT5zZWN0aW9uLT52bWEgKyAoeCktPnZhbHVlKQotCi0vKiBOdW1lcmljIHNvcnRzLiAgVW5kZWZpbmVkIHN5bWJvbHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkICJsZXNzIHRoYW4iCi0gICBkZWZpbmVkIHN5bWJvbHMgd2l0aCB6ZXJvIHZhbHVlcy4gIENvbW1vbiBzeW1ib2xzIGFyZSBub3QgdHJlYXRlZAotICAgc3BlY2lhbGx5IC0tIGkuZS4sIHRoZWlyIHNpemVzIGFyZSB1c2VkIGFzIHRoZWlyICJ2YWx1ZXMiLiAgKi8KLQotc3RhdGljIGludAotbnVtZXJpY19mb3J3YXJkIChQX3gsIFBfeSkKLSAgICAgY29uc3QgUFRSIFBfeDsKLSAgICAgY29uc3QgUFRSIFBfeTsKLXsKLSAgYXN5bWJvbCAqeCwgKnk7Ci0gIGFzZWN0aW9uICp4cywgKnlzOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9ICBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhzID0gYmZkX2dldF9zZWN0aW9uICh4KTsKLSAgeXMgPSBiZmRfZ2V0X3NlY3Rpb24gKHkpOwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHhzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAodmFsdWVvZiAoeCkgIT0gdmFsdWVvZiAoeSkpCi0gICAgcmV0dXJuIHZhbHVlb2YgKHgpIDwgdmFsdWVvZiAoeSkgPyAtMSA6IDE7Ci0KLSAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKLX0KLQotc3RhdGljIGludAotbnVtZXJpY19yZXZlcnNlICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHJldHVybiAtIG51bWVyaWNfZm9yd2FyZCAoeCwgeSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KQotICAgICBjb25zdCBQVFIgUF94OwotICAgICBjb25zdCBQVFIgUF95OwotewotICBhc3ltYm9sICp4LCAqeTsKLSAgY29uc3QgY2hhciAqeG4sICp5bjsKLQotICB4ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3gsIHNvcnRfeCk7Ci0gIHkgPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7Ci0gIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7Ci0KLSAgcmV0dXJuICgoeG4gPT0gTlVMTCkgPyAoKHluID09IE5VTEwpID8gMCA6IC0xKSA6Ci0JICAoKHluID09IE5VTEwpID8gMSA6IHN0cmNtcCAoeG4sIHluKSkpOwotfQotCi1zdGF0aWMgaW50Ci1ub25fbnVtZXJpY19yZXZlcnNlICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHJldHVybiAtIG5vbl9udW1lcmljX2ZvcndhcmQgKHgsIHkpOwotfQotCi1zdGF0aWMgaW50ICgqKHNvcnRlcnNbMl1bMl0pKSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpID0KLXsKLSAgeyBub25fbnVtZXJpY19mb3J3YXJkLCBub25fbnVtZXJpY19yZXZlcnNlIH0sCi0gIHsgbnVtZXJpY19mb3J3YXJkLCBudW1lcmljX3JldmVyc2UgfQotfTsKLQotLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNpbWlsYXIKLSAgIHRvIG51bWVyaWNfZm9yd2FyZCwgYnV0IHdoZW4gc3ltYm9scyBoYXZlIHRoZSBzYW1lIHZhbHVlIGl0IHNvcnRzCi0gICBieSBzZWN0aW9uIFZNQS4gIFRoaXMgc2ltcGxpZmllcyB0aGUgc29ydF9zeW1ib2xzX2J5X3NpemUgY29kZQotICAgd2hpY2ggaGFuZGxlcyBzeW1ib2xzIGF0IHRoZSBlbmQgb2Ygc2VjdGlvbnMuICBBbHNvLCB0aGlzIHJvdXRpbmUKLSAgIHRyaWVzIHRvIHNvcnQgZmlsZSBuYW1lcyBiZWZvcmUgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLgotICAgVGhhdCB3aWxsIG1ha2UgdGhlIGZpbGUgbmFtZSBoYXZlIGEgemVybyBzaXplLCB3aGljaCB3aWxsIG1ha2UKLSAgIHNvcnRfc3ltYm9sc19ieV9zaXplIGNob29zZSB0aGUgbm9uIGZpbGUgbmFtZSBzeW1ib2wsIGxlYWRpbmcgdG8KLSAgIG1vcmUgbWVhbmluZ2Z1bCBvdXRwdXQuICBGb3Igc2ltaWxhciByZWFzb25zLCB0aGlzIGNvZGUgc29ydHMKLSAgIGdudV9jb21waWxlZF8qIGFuZCBnY2MyX2NvbXBpbGVkIGJlZm9yZSBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUKLSAgIHZhbHVlLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMSAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGFzeW1ib2wgKngsICp5OwotICBhc2VjdGlvbiAqeHMsICp5czsKLSAgY29uc3QgY2hhciAqeG4sICp5bjsKLSAgc2l6ZV90IHhubCwgeW5sOwotICBpbnQgeGYsIHlmOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF95LCBzb3J0X3kpOwotICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKHNvcnRfYmZkKSk7Ci0KLSAgeHMgPSBiZmRfZ2V0X3NlY3Rpb24gKHgpOwotICB5cyA9IGJmZF9nZXRfc2VjdGlvbiAoeSk7Ci0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoeHMpKQotICAgIGFib3J0ICgpOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uICh5cykpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHZhbHVlb2YgKHgpICE9IHZhbHVlb2YgKHkpKQotICAgIHJldHVybiB2YWx1ZW9mICh4KSA8IHZhbHVlb2YgKHkpID8gLTEgOiAxOwotCi0gIGlmICh4cy0+dm1hICE9IHlzLT52bWEpCi0gICAgcmV0dXJuIHhzLT52bWEgPCB5cy0+dm1hID8gLTEgOiAxOwotCi0gIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7Ci0gIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7Ci0gIHhubCA9IHN0cmxlbiAoeG4pOwotICB5bmwgPSBzdHJsZW4gKHluKTsKLQotICAvKiBUaGUgc3ltYm9scyBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQgY29udmV5IGV2ZW4gbGVzcwotICAgICBpbmZvcm1hdGlvbiB0aGFuIHRoZSBmaWxlIG5hbWUsIHNvIHNvcnQgdGhlbSBvdXQgZmlyc3QuICAqLwotCi0gIHhmID0gKHN0cnN0ciAoeG4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyICh4biwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLSAgeWYgPSAoc3Ryc3RyICh5biwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKHluLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotCi0gIGlmICh4ZiAmJiAhIHlmKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgeGYgJiYgeWYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogV2UgdXNlIGEgaGV1cmlzdGljIGZvciB0aGUgZmlsZSBuYW1lLiAgSXQgbWF5IG5vdCB3b3JrIG9uIG5vbgotICAgICBVbml4IHN5c3RlbXMsIGJ1dCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBvbmx5IGRpZmZlcmVuY2UKLSAgICAgaXMgcHJlY2lzZWx5IHdoaWNoIHN5bWJvbCBuYW1lcyBnZXQgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUgZmlsZV9zeW1ib2wocywgc24sIHNubCkJCQlcCi0gICgoKHMpLT5mbGFncyAmIEJTRl9GSUxFKSAhPSAwCQkJXAotICAgfHwgKChzbilbKHNubCkgLSAyXSA9PSAnLicJCQlcCi0gICAgICAgJiYgKChzbilbKHNubCkgLSAxXSA9PSAnbycJCVwKLQkgICB8fCAoc24pWyhzbmwpIC0gMV0gPT0gJ2EnKSkpCi0KLSAgeGYgPSBmaWxlX3N5bWJvbCAoeCwgeG4sIHhubCk7Ci0gIHlmID0gZmlsZV9zeW1ib2wgKHksIHluLCB5bmwpOwotCi0gIGlmICh4ZiAmJiAhIHlmKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgeGYgJiYgeWYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKLX0KLQotLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNvcnRpbmcKLSAgIGFuIGFycmF5IG9mIHNpemVfc3ltIHN0cnVjdHVyZXMgaW50byBzaXplIG9yZGVyLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMiAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzaXplX3N5bSAqeCA9IChjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKikgUF94OwotICBjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKnkgPSAoY29uc3Qgc3RydWN0IHNpemVfc3ltICopIFBfeTsKLQotICBpZiAoeC0+c2l6ZSA8IHktPnNpemUpCi0gICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IDEgOiAtMTsKLSAgZWxzZSBpZiAoeC0+c2l6ZSA+IHktPnNpemUpCi0gICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IC0xIDogMTsKLSAgZWxzZQotICAgIHJldHVybiBzb3J0ZXJzWzBdW3JldmVyc2Vfc29ydF0gKHgtPm1pbmlzeW0sIHktPm1pbmlzeW0pOwotfQotCi0vKiBTb3J0IHRoZSBzeW1ib2xzIGJ5IHNpemUuICBXZSBndWVzcyB0aGUgc2l6ZSBieSBhc3N1bWluZyB0aGF0IHRoZQotICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIG5leHQgaGlnaGVyIHN5bWJvbCBpcyB0aGUgc2l6ZS4gIEZJWE1FOiBFTEYgYWN0dWFsbHkgc3RvcmVzIGEgc2l6ZQotICAgd2l0aCBlYWNoIHN5bWJvbC4gIFdlIHNob3VsZCB1c2UgaXQuICAqLwotCi1zdGF0aWMgbG9uZwotc29ydF9zeW1ib2xzX2J5X3NpemUgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc3ltc2l6ZXNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgc3RydWN0IHNpemVfc3ltICoqc3ltc2l6ZXNwOwotewotICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9IE5VTEw7Ci0gIGFzeW1ib2wgKnN0b3JlX3N5bSwgKnN0b3JlX25leHQ7Ci0KLSAgcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc2l6ZV9mb3J3YXJkMSk7Ci0KLSAgLyogV2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIHNwZWNpYWwgc2V0IG9mIHN5bWJvbHMgYW5kIHNpemVzIHRvCi0gICAgIHByaW50LiAgKi8KLSAgc3ltc2l6ZXMgPSAoc3RydWN0IHNpemVfc3ltICopIHhtYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pKTsKLSAgKnN5bXNpemVzcCA9IHN5bXNpemVzOwotCi0gIC8qIE5vdGUgdGhhdCBmaWx0ZXJfc3ltYm9scyBoYXMgYWxyZWFkeSByZW1vdmVkIGFsbCBhYnNvbHV0ZSBhbmQKLSAgICAgdW5kZWZpbmVkIHN5bWJvbHMuICBIZXJlIHdlIHJlbW92ZSBhbGwgc3ltYm9scyB3aG9zZSBzaXplIHdpbmRzCi0gICAgIHVwIGFzIHplcm8uICAqLwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotCi0gIHN0b3JlX3N5bSA9IHNvcnRfeDsKLSAgc3RvcmVfbmV4dCA9IHNvcnRfeTsKLQotICBpZiAoZnJvbSA8IGZyb21lbmQpCi0gICAgewotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCAoY29uc3QgUFRSKSBmcm9tLAotCQkJCSAgICAgIHN0b3JlX3N5bSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotCi0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKm5leHQ7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSBzejsKLSAgICAgIGFzeW1ib2wgKnRlbXA7Ci0KLSAgICAgIGlmIChmcm9tICsgc2l6ZSA8IGZyb21lbmQpCi0JewotCSAgbmV4dCA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwKLQkJCQkJICAgZHluYW1pYywKLQkJCQkJICAgKGNvbnN0IFBUUikgKGZyb20gKyBzaXplKSwKLQkJCQkJICAgc3RvcmVfbmV4dCk7Ci0JICBpZiAobmV4dCA9PSBOVUxMKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQl9Ci0gICAgICBlbHNlCi0JbmV4dCA9IE5VTEw7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQlzeiA9IHN5bS0+dmFsdWU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZyb20gKyBzaXplIDwgZnJvbWVuZAotCSAgICAgICYmIHNlYyA9PSBiZmRfZ2V0X3NlY3Rpb24gKG5leHQpKQotCSAgICBzeiA9IHZhbHVlb2YgKG5leHQpIC0gdmFsdWVvZiAoc3ltKTsKLQkgIGVsc2UKLQkgICAgc3ogPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKQotCQkgIC0gdmFsdWVvZiAoc3ltKSk7Ci0JfQotCi0gICAgICBpZiAoc3ogIT0gMCkKLQl7Ci0JICBzeW1zaXplcy0+bWluaXN5bSA9IChjb25zdCBQVFIpIGZyb207Ci0JICBzeW1zaXplcy0+c2l6ZSA9IHN6OwotCSAgKytzeW1zaXplczsKLQl9Ci0KLSAgICAgIHN5bSA9IG5leHQ7Ci0KLSAgICAgIHRlbXAgPSBzdG9yZV9zeW07Ci0gICAgICBzdG9yZV9zeW0gPSBzdG9yZV9uZXh0OwotICAgICAgc3RvcmVfbmV4dCA9IHRlbXA7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gc3ltc2l6ZXMgLSAqc3ltc2l6ZXNwOwotCi0gIC8qIFdlIG11c3Qgbm93IHNvcnQgYWdhaW4gYnkgc2l6ZS4gICovCi0gIHFzb3J0ICgoUFRSKSAqc3ltc2l6ZXNwLCBzeW1jb3VudCwgc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pLCBzaXplX2ZvcndhcmQyKTsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0MCi0vKiBJZiBBUkNISVZFX0JGRCBpcyBub24tTlVMTCwgaXQgaXMgdGhlIGFyY2hpdmUgY29udGFpbmluZyBBQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfcmVsX2ZpbGUgKGFiZmQsIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIFBUUiBtaW5pc3ltczsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHN0cnVjdCBzaXplX3N5bSAqc3ltc2l6ZXM7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBzeW1jb3VudCA9IGJmZF9yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCAmbWluaXN5bXMsICZzaXplKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEaXNjYXJkIHRoZSBzeW1ib2xzIHdlIGRvbid0IHdhbnQgdG8gcHJpbnQuCi0gICAgIEl0J3MgT0sgdG8gZG8gdGhpcyBpbiBwbGFjZTsgd2UnbGwgZnJlZSB0aGUgc3RvcmFnZSBhbnl3YXkKLSAgICAgKGFmdGVyIHByaW50aW5nKS4gICovCi0KLSAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKLQotICBzeW1zaXplcyA9IE5VTEw7Ci0gIGlmICghIG5vX3NvcnQpCi0gICAgewotICAgICAgc29ydF9iZmQgPSBhYmZkOwotICAgICAgc29ydF9keW5hbWljID0gZHluYW1pYzsKLSAgICAgIHNvcnRfeCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gICAgICBzb3J0X3kgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICAgICAgaWYgKHNvcnRfeCA9PSBOVUxMIHx8IHNvcnRfeSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBpZiAoISBzb3J0X2J5X3NpemUpCi0JcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwKLQkgICAgICAgc29ydGVyc1tzb3J0X251bWVyaWNhbGx5XVtyZXZlcnNlX3NvcnRdKTsKLSAgICAgIGVsc2UKLQlzeW1jb3VudCA9IHNvcnRfc3ltYm9sc19ieV9zaXplIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsCi0JCQkJCSBzaXplLCAmc3ltc2l6ZXMpOwotICAgIH0KLQotICBpZiAoISBzb3J0X2J5X3NpemUpCi0gICAgcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCk7Ci0gIGVsc2UKLSAgICBwcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpOwotCi0gIGZyZWUgKG1pbmlzeW1zKTsKLX0KLQwKLS8qIENob29zZSB3aGljaCBzeW1ib2wgZW50cmllcyB0byBwcmludDsKLSAgIGNvbXBhY3QgdGhlbSBkb3dud2FyZCB0byBnZXQgcmlkIG9mIHRoZSByZXN0LgotICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBiZSBwcmludGVkLiAgKi8KLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQsICp0bzsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgdG8gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0KLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgaW50IGtlZXAgPSAwOwotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBQUk9HUkVTUyAoMSk7Ci0gICAgICAKLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgKGNvbnN0IFBUUikgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBpZiAodW5kZWZpbmVkX29ubHkpCi0Ja2VlcCA9IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKTsKLSAgICAgIGVsc2UgaWYgKGV4dGVybmFsX29ubHkpCi0Ja2VlcCA9ICgoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkJfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCQl8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkJfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLSAgICAgIGVsc2UKLQlrZWVwID0gMTsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmICEgcHJpbnRfZGVidWdfc3ltcwotCSAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotCWtlZXAgPSAwOwotCi0gICAgICBpZiAoa2VlcAotCSAgJiYgc29ydF9ieV9zaXplCi0JICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKSkKLQlrZWVwID0gMDsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmIGRlZmluZWRfb25seSkKLQl7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICBrZWVwID0gMDsKLQl9Ci0KLSAgICAgIGlmIChrZWVwKQotCXsKLQkgIG1lbWNweSAodG8sIGZyb20sIHNpemUpOwotCSAgdG8gKz0gc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodG8gLSAoYmZkX2J5dGUgKikgbWluaXN5bXMpIC8gc2l6ZTsKLX0KLQwKLS8qIFByaW50IHN5bWJvbCBuYW1lIE5BTUUsIHJlYWQgZnJvbSBBQkZELCB3aXRoIHByaW50ZiBmb3JtYXQgRk9STUFULAotICAgZGVtYW5nbGluZyBpdCBpZiByZXF1ZXN0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltbmFtZSAoZm9ybWF0LCBuYW1lLCBhYmZkKQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGRvX2RlbWFuZ2xlICYmICpuYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKnJlczsKLQotICAgICAgLyogSW4gdGhpcyBtb2RlLCBnaXZlIGEgdXNlci1sZXZlbCB2aWV3IG9mIHRoZSBzeW1ib2wgbmFtZQotCSBldmVuIGlmIGl0J3Mgbm90IG1hbmdsZWQ7IHN0cmlwIG9mZiBhbnkgbGVhZGluZwotCSB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IG5hbWVbMF0pCi0JbmFtZSsrOwotCi0gICAgICByZXMgPSBjcGx1c19kZW1hbmdsZSAobmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICAgICAgaWYgKHJlcykKLQl7Ci0JICBwcmludGYgKGZvcm1hdCwgcmVzKTsKLQkgIGZyZWUgKHJlcyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBwcmludGYgKGZvcm1hdCwgbmFtZSk7Ci19Ci0KLS8qIFByaW50IHRoZSBzeW1ib2xzLiAgSWYgQVJDSElWRV9CRkQgaXMgbm9uLU5VTEwsIGl0IGlzIHRoZSBhcmNoaXZlCi0gICBjb250YWluaW5nIEFCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGFzeW1ib2wgKnN0b3JlOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IHRoZSBzeW1ib2xzIHdoZW4gc29ydGluZyBieSBzaXplLiAgKi8KLQotc3RhdGljIHZvaWQgCi1wcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBiZmQgKmFyY2hpdmVfYmZkOwotewotICBhc3ltYm9sICpzdG9yZTsKLSAgc3RydWN0IHNpemVfc3ltICpmcm9tLCAqZnJvbWVuZDsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSBzeW1zaXplczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudDsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20tPm1pbmlzeW0sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgLyogU2V0IHRoZSBzeW1ib2wgdmFsdWUgc28gdGhhdCB3ZSBhY3R1YWxseSBkaXNwbGF5IHRoZSBzeW1ib2wKLSAgICAgICAgIHNpemUuICAqLwotICAgICAgc3ltLT52YWx1ZSA9IGZyb20tPnNpemUgLSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7Ci0KLSAgICAgIHByaW50X3N5bWJvbCAoYWJmZCwgc3ltLCBhcmNoaXZlX2JmZCk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhIHNpbmdsZSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkICphcmNoaXZlX2JmZDsKLXsKLSAgUFJPR1JFU1MgKDEpOwotCi0gICgqZm9ybWF0LT5wcmludF9zeW1ib2xfZmlsZW5hbWUpIChhcmNoaXZlX2JmZCwgYWJmZCk7Ci0KLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JcHJpbnRfc3ltbmFtZSAoIiVzIiwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgYWJmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sX2luZm8gc3ltaW5mbzsKLQotICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltLCAmc3ltaW5mbyk7Ci0gICAgICAoKmZvcm1hdC0+cHJpbnRfc3ltYm9sX2luZm8pICgmc3ltaW5mbywgYWJmZCk7Ci0gICAgfQotCi0gIGlmIChsaW5lX251bWJlcnMpCi0gICAgewotICAgICAgc3RhdGljIGFzeW1ib2wgKipzeW1zOwotICAgICAgc3RhdGljIGxvbmcgc3ltY291bnQ7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKmZ1bmN0aW9ubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lbm87Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scyBpbiBvcmRlciB0byBjYWxsCi0gICAgICAgICBiZmRfZmluZF9uZWFyZXN0X2xpbmUuICBUaGlzIGlzIGluZWZmaWNpZW50LCBidXQsIHRoZW4sIHlvdQotICAgICAgICAgZG9uJ3QgaGF2ZSB0byB1c2UgLS1saW5lLW51bWJlcnMuICAqLwotICAgICAgaWYgKGFiZmQgIT0gbGluZW5vX2NhY2hlX2JmZCAmJiBzeW1zICE9IE5VTEwpCi0JewotCSAgZnJlZSAoc3ltcyk7Ci0JICBzeW1zID0gTlVMTDsKLQl9Ci0gICAgICBpZiAoc3ltcyA9PSBOVUxMKQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQkgIGlmIChzeW1zaXplIDwgMCkKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0JICBpZiAoc3ltY291bnQgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGxpbmVub19jYWNoZV9iZmQgPSBhYmZkOwotCX0KLQotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICBzdGF0aWMgYXNlY3Rpb24gKipzZWNzOwotCSAgc3RhdGljIGFyZWxlbnQgKioqcmVsb2NzOwotCSAgc3RhdGljIGxvbmcgKnJlbGNvdW50OwotCSAgc3RhdGljIHVuc2lnbmVkIGludCBzZWNjb3VudDsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgLyogRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHdlIHRyeSB0byBmaW5kIGEgcmVsb2MgZm9yIHRoZQotICAgICAgICAgICAgIHN5bWJvbCwgYW5kIHByaW50IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgcmVsb2MuICAqLwotCi0JICBpZiAoYWJmZCAhPSBsaW5lbm9fY2FjaGVfcmVsX2JmZCAmJiByZWxvY3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQotCQlpZiAocmVsb2NzW2ldICE9IE5VTEwpCi0JCSAgZnJlZSAocmVsb2NzW2ldKTsKLQkgICAgICBmcmVlIChzZWNzKTsKLQkgICAgICBmcmVlIChyZWxvY3MpOwotCSAgICAgIGZyZWUgKHJlbGNvdW50KTsKLQkgICAgICBzZWNzID0gTlVMTDsKLQkgICAgICByZWxvY3MgPSBOVUxMOwotCSAgICAgIHJlbGNvdW50ID0gTlVMTDsKLQkgICAgfQotCi0JICBpZiAocmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvIGluZm87Ci0KLQkgICAgICBzZWNjb3VudCA9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCk7Ci0KLQkgICAgICBzZWNzID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqc2Vjcyk7Ci0JICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKioqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqcmVsb2NzKTsKLQkgICAgICByZWxjb3VudCA9IChsb25nICopIHhtYWxsb2MgKHNlY2NvdW50ICogc2l6ZW9mICpyZWxjb3VudCk7Ci0KLQkgICAgICBpbmZvLnNlY3MgPSBzZWNzOwotCSAgICAgIGluZm8ucmVsb2NzID0gcmVsb2NzOwotCSAgICAgIGluZm8ucmVsY291bnQgPSByZWxjb3VudDsKLQkgICAgICBpbmZvLnN5bXMgPSBzeW1zOwotCSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZ2V0X3JlbG9jcywgKFBUUikgJmluZm8pOwotCSAgICAgIGxpbmVub19jYWNoZV9yZWxfYmZkID0gYWJmZDsKLQkgICAgfQotCi0JICBzeW1uYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyBqOwotCi0JICAgICAgZm9yIChqID0gMDsgaiA8IHJlbGNvdW50W2ldOyBqKyspCi0JCXsKLQkJICBhcmVsZW50ICpyOwotCi0JCSAgciA9IHJlbG9jc1tpXVtqXTsKLQkJICBpZiAoci0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCQkgICAgICAmJiAoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbiA9PSBzeW0tPnNlY3Rpb24KLQkJICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IHN5bS0+dmFsdWUKLQkJICAgICAgJiYgc3RyY21wIChzeW1uYW1lLAotCQkJCSBiZmRfYXN5bWJvbF9uYW1lICgqci0+c3ltX3B0cl9wdHIpKSA9PSAwCi0JCSAgICAgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2Vjc1tpXSwgc3ltcywKLQkJCQkJCXItPmFkZHJlc3MsICZmaWxlbmFtZSwKLQkJCQkJCSZmdW5jdGlvbm5hbWUsICZsaW5lbm8pKQotCQkgICAgewotCQkgICAgICAvKiBXZSBvbmx5IHByaW50IHRoZSBmaXJzdCBvbmUgd2UgZmluZC4gICovCi0JCSAgICAgIHByaW50ZiAoIlx0JXM6JXUiLCBmaWxlbmFtZSwgbGluZW5vKTsKLQkJICAgICAgaSA9IHNlY2NvdW50OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vd25lciA9PSBhYmZkKQotCXsKLQkgIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSwgc3ltcywKLQkJCQkgICAgIHN5bS0+dmFsdWUsICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwKLQkJCQkgICAgICZsaW5lbm8pCi0JICAgICAgJiYgZmlsZW5hbWUgIT0gTlVMTAotCSAgICAgICYmIGxpbmVubyAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXHQlczoldSIsIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBwdXRjaGFyICgnXG4nKTsKLX0KLQwKLS8qIFRoZSBmb2xsb3dpbmcgMyBncm91cHMgb2YgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5LAotICAgb25jZSBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBlYWNoIGZpbGUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCi0gICBUaGV5IHNob3VsZCBjaGVjayBgZmlsZW5hbWVfcGVyX2ZpbGUnIGFuZCBgZmlsZW5hbWVfcGVyX3N5bWJvbCcsCi0gICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlaXIgb3V0cHV0IGZvcm1hdCwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8KLSAgIHByaW50IGFueXRoaW5nLiAgKi8KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX2JzZCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoZmlsZW5hbWVfcGVyX2ZpbGUgJiYgIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICh1bmRlZmluZWRfb25seSkKLSAgICBwcmludGYgKF8oIlxuXG5VbmRlZmluZWQgc3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOwotICBwcmludGYgKF8oIlwKLU5hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgIFNlY3Rpb25cblxuIikpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSAmJiAhZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCIlczpcbiIsIGZpbGVuYW1lKTsKLX0KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSkKLSAgICBwcmludGYgKCJcbiVzOlxuIiwgZmlsZW5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX2JzZCAoYXJjaGl2ZSwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKmFyY2hpdmU7Ci0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3N5c3YgKGFyY2hpdmUsIGZpbGVuYW1lKQotICAgICBjaGFyICphcmNoaXZlOwotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHByaW50ZiAoXygiXG5cblVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXNbJXNdOlxuXG4iKSwgYXJjaGl2ZSwgZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzWyVzXTpcblxuIiksIGFyY2hpdmUsIGZpbGVuYW1lKTsKLSAgcHJpbnRmIChfKCJcCi1OYW1lICAgICAgICAgICAgICAgICAgVmFsdWUgICBDbGFzcyAgICAgICAgVHlwZSAgICAgICAgIFNpemUgICBMaW5lICBTZWN0aW9uXG5cbiIpKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3Bvc2l4IChhcmNoaXZlLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqYXJjaGl2ZTsKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICghZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCIlc1slc106XG4iLCBhcmNoaXZlLCBmaWxlbmFtZSk7Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKLSAgIGNvbnRhaW5pbmcgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX2JzZCAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKLSAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKLSAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXggKGFyY2hpdmVfYmZkLCBhYmZkKQotICAgICBiZmQgKmFyY2hpdmVfYmZkLCAqYWJmZDsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgewotICAgICAgaWYgKGFyY2hpdmVfYmZkKQotCXByaW50ZiAoIiVzWyVzXTogIiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiJXM6ICIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0MCi0vKiBQcmludCBhIHN5bWJvbCB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF92YWx1ZSAodmFsKQotICAgICBiZmRfdm1hIHZhbDsKLXsKLSNpZiAhIGRlZmluZWQgKEJGRDY0KSB8fCBCRkRfSE9TVF82NEJJVF9MT05HCi0gIHByaW50ZiAodmFsdWVfZm9ybWF0LCB2YWwpOwotI2Vsc2UKLSAgLyogV2UgaGF2ZSBhIDY0IGJpdCB2YWx1ZSB0byBwcmludCwgYnV0IHRoZSBob3N0IGlzIG9ubHkgMzIgYml0LiAgKi8KLSAgaWYgKHByaW50X3JhZGl4ID09IDE2KQotICAgIGZwcmludGZfdm1hIChzdGRvdXQsIHZhbCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlszMF07Ci0gICAgICBjaGFyICpzOwotCi0gICAgICBzID0gYnVmICsgc2l6ZW9mIGJ1ZjsKLSAgICAgICotLXMgPSAnXDAnOwotICAgICAgd2hpbGUgKHZhbCA+IDApCi0JewotCSAgKi0tcyA9ICh2YWwgJSBwcmludF9yYWRpeCkgKyAnMCc7Ci0JICB2YWwgLz0gcHJpbnRfcmFkaXg7Ci0JfQotICAgICAgd2hpbGUgKChidWYgKyBzaXplb2YgYnVmIC0gMSkgLSBzIDwgMTYpCi0JKi0tcyA9ICcwJzsKLSAgICAgIHByaW50ZiAoIiVzIiwgcyk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLS8qIFByaW50IGEgbGluZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19ic2QgKGluZm8sIGFiZmQpCi0gICAgIHN5bWJvbF9pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChpbmZvLT50eXBlID09ICdVJykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlKnMiLAotI2lmZGVmIEJGRDY0Ci0JICAgICAgMTYsCi0jZWxzZQotCSAgICAgIDgsCi0jZW5kaWYKLQkgICAgICAiIik7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgcHJpbnRmICgiICVjIiwgaW5mby0+dHlwZSk7Ci0gIGlmIChpbmZvLT50eXBlID09ICctJykKLSAgICB7Ci0gICAgICAvKiBBIHN0YWIuICAqLwotICAgICAgcHJpbnRmICgiICIpOwotICAgICAgcHJpbnRmIChvdGhlcl9mb3JtYXQsIGluZm8tPnN0YWJfb3RoZXIpOwotICAgICAgcHJpbnRmICgiICIpOwotICAgICAgcHJpbnRmIChkZXNjX2Zvcm1hdCwgaW5mby0+c3RhYl9kZXNjKTsKLSAgICAgIHByaW50ZiAoIiAlNXMiLCBpbmZvLT5zdGFiX25hbWUpOwotICAgIH0KLSAgcHJpbnRfc3ltbmFtZSAoIiAlcyIsIGluZm8tPm5hbWUsIGFiZmQpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fc3lzdiAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfc3ltbmFtZSAoIiUtMjBzfCIsIGluZm8tPm5hbWUsIGFiZmQpOwkvKiBOYW1lICovCi0gIGlmIChpbmZvLT50eXBlID09ICdVJykKLSAgICBwcmludGYgKCIgICAgICAgICIpOwkvKiBWYWx1ZSAqLwotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgcHJpbnRmICgifCAgICVjICB8IiwgaW5mby0+dHlwZSk7CS8qIENsYXNzICovCi0gIGlmIChpbmZvLT50eXBlID09ICctJykKLSAgICB7Ci0gICAgICAvKiBBIHN0YWIuICAqLwotICAgICAgcHJpbnRmICgiJTE4c3wgICIsIGluZm8tPnN0YWJfbmFtZSk7CS8qIChDKSBUeXBlICovCi0gICAgICBwcmludGYgKGRlc2NfZm9ybWF0LCBpbmZvLT5zdGFiX2Rlc2MpOwkvKiBTaXplICovCi0gICAgICBwcmludGYgKCJ8ICAgICB8Iik7CS8qIExpbmUsIFNlY3Rpb24gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwcmludGYgKCIgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCIpOwkvKiBUeXBlLCBTaXplLCBMaW5lLCBTZWN0aW9uICovCi19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19wb3NpeCAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfc3ltbmFtZSAoIiVzICIsIGluZm8tPm5hbWUsIGFiZmQpOwotICBwcmludGYgKCIlYyAiLCBpbmZvLT50eXBlKTsKLSAgaWYgKGluZm8tPnR5cGUgPT0gJ1UnKQotICAgIHByaW50ZiAoIiAgICAgICAgIik7Ci0gIGVsc2UKLSAgICBwcmludF92YWx1ZSAoaW5mby0+dmFsdWUpOwotICAvKiBQT1NJWC4yIHdhbnRzIHRoZSBzeW1ib2wgc2l6ZSBwcmludGVkIGhlcmUsIHdoZW4gYXBwbGljYWJsZTsKLSAgICAgQkZEIGN1cnJlbnRseSBkb2Vzbid0IHByb3ZpZGUgaXQsIHNvIHdlIHRha2UgdGhlIGVhc3kgd2F5IG91dCBieQotICAgICBjb25zaWRlcmluZyBpdCB0byBuZXZlciBiZSBhcHBsaWNhYmxlLiAgKi8KLX0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9zeW1kZWZfZW50cnkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3ltaW5kZXggaWR4ID0gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgY2Fyc3ltICp0aGVzeW07Ci0gIGJvb2xlYW4gZXZlcnByaW50ZWQgPSBmYWxzZTsKLQotICBmb3IgKGlkeCA9IGJmZF9nZXRfbmV4dF9tYXBlbnQgKGFiZmQsIGlkeCwgJnRoZXN5bSk7Ci0gICAgICAgaWR4ICE9IEJGRF9OT19NT1JFX1NZTUJPTFM7Ci0gICAgICAgaWR4ID0gYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgaWR4LCAmdGhlc3ltKSkKLSAgICB7Ci0gICAgICBiZmQgKmVsdDsKLSAgICAgIGlmICghZXZlcnByaW50ZWQpCi0JewotCSAgcHJpbnRmIChfKCJcbkFyY2hpdmUgaW5kZXg6XG4iKSk7Ci0JICBldmVycHJpbnRlZCA9IHRydWU7Ci0JfQotICAgICAgZWx0ID0gYmZkX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGlkeCk7Ci0gICAgICBpZiAoZWx0ID09IE5VTEwpCi0JYmZkX2ZhdGFsICgiYmZkX2dldF9lbHRfYXRfaW5kZXgiKTsKLSAgICAgIGlmICh0aGVzeW0tPm5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLQl7Ci0JICBwcmludF9zeW1uYW1lICgiJXMiLCB0aGVzeW0tPm5hbWUsIGFiZmQpOwotCSAgcHJpbnRmICgiIGluICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChlbHQpKTsKLQl9Ci0gICAgfQotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgcmVsb2NzIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbi4KLSAgIEl0IGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YWFyZzsKLXsKLSAgc3RydWN0IGdldF9yZWxvY3NfaW5mbyAqZGF0YSA9IChzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvICopIGRhdGFhcmc7Ci0KLSAgKmRhdGEtPnNlY3MgPSBzZWM7Ci0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotICAgIHsKLSAgICAgICpkYXRhLT5yZWxvY3MgPSBOVUxMOwotICAgICAgKmRhdGEtPnJlbGNvdW50ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIHJlbHNpemU7Ci0KLSAgICAgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICAqZGF0YS0+cmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgKmRhdGEtPnJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCAqZGF0YS0+cmVsb2NzLAotCQkJCQkJZGF0YS0+c3ltcyk7Ci0gICAgICBpZiAoKmRhdGEtPnJlbGNvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgKytkYXRhLT5zZWNzOwotICArK2RhdGEtPnJlbG9jczsKLSAgKytkYXRhLT5yZWxjb3VudDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1yYW5saWIuYyBiL2JpbnV0aWxzL25vdC1yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiOWNlYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ub3QtcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAnYXInIChub3QgJ3JhbmxpYicpLiAqLwotCi1pbnQgaXNfcmFubGliID0gMDsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1zdHJpcC5jIGIvYmludXRpbHMvbm90LXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDkzY2UuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbm90LXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIG9iamNvcHkubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdvYmpjb3B5JyAobm90Ci0gICAnc3RyaXAnKS4gKi8KLQotaW50IGlzX3N0cmlwID0gMDsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamNvcHkuMSBiL2JpbnV0aWxzL29iamNvcHkuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiOThkMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpjb3B5LjEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG9iamNvcHkgMSAiT2N0b2JlciAxOTk0IiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotb2JqY29weSBcLSBjb3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBvYmpjb3B5Ci0uUkIgIltcfCIgXC1GXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtT1wgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1qXCBcZklzZWN0aW9ubmFtZVxmUlwgfFwgXGZCXC1cLW9ubHlcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVJcIFxmSXNlY3Rpb25uYW1lXGZSXCB8XCBcZkJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWFsbFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWdcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXN0cmlwXC11bm5lZWRlZFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLUtcIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU5cIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1MXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtbG9jYWxpemVcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtV1wgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLXdlYWtlblwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsXGZSICJcfF0iIAotLlJCICJbXHwiIFwtWFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWxvY2Fsc1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWJcIFxmSWJ5dGVcZlJcIHxcIFxmQlwtXC1ieXRlPVxmSWJ5dGVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1pXCBcZklpbnRlcmxlYXZlXGZSXCB8XCBcZkJcLVwtaW50ZXJsZWF2ZT1cZklpbnRlcmxlYXZlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlc1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGVidWdnaW5nICJcfF0iCi0uUkIgIltcfCIgXC1cLWdhcFwtZmlsbD1cZkl2YWxcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtcGFkXC10bz1cZklhZGRyZXNzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXNldFwtc3RhcnQ9XGZJdmFsXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc3RhcnQ9XGZJaW5jclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLWFkZHJlc3Nlcz1cZklpbmNyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc2VjdGlvblwtYWRkcmVzcz1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLWxtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXNldFwtc2VjdGlvblwtZmxhZ3M9XGZJc2VjdGlvbj1mbGFnc1xmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1hZGRcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWU9ZmlsZW5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1sZWFkaW5nXC1jaGFyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXJlbW92ZVwtbGVhZGluZ1wtY2hhclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC13ZWFrZW5cZlIgIlx8XSIKLS5SQiAiW1x8IiBcLXZcIHxcIFwtXC12ZXJib3NlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVlwgfFwgXC1cLXZlcnNpb25cZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWhlbHBcZlIgIlx8XSIgCi0uQiBpbmZpbGUKLS5SQiAiW1x8IiBvdXRmaWxlXGZSICJcfF0iIAotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIAotLkIgb2JqY29weQotdXRpbGl0eSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCBmaWxlIHRvIGFub3RoZXIuICAKLS5CIG9iamNvcHkgCi11c2VzIHRoZSBHTlUgQkZEIExpYnJhcnkgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIG9iamVjdCBmaWxlcy4gIEl0IGNhbgotd3JpdGUgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxlIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YKLXRoZSBzb3VyY2Ugb2JqZWN0IGZpbGUuICBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgCi0uQiBvYmpjb3B5Ci1pcyBjb250cm9sbGVkIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zLgotLlBQCi0uQiBvYmpjb3B5Ci1jcmVhdGVzIHRlbXBvcmFyeSBmaWxlcyB0byBkbyBpdHMgdHJhbnNsYXRpb25zIGFuZCBkZWxldGVzIHRoZW0KLWFmdGVyd2FyZC4KLS5CIG9iamNvcHkKLXVzZXMgQkZEIHRvIGRvIGFsbCBpdHMgdHJhbnNsYXRpb24gd29yazsgaXQga25vd3MgYWJvdXQgYWxsIHRoZQotZm9ybWF0cyBCRkQga25vd3MgYWJvdXQsIGFuZCB0aHVzIGlzIGFibGUgdG8gcmVjb2duaXplIG1vc3QgZm9ybWF0cwotd2l0aG91dCBiZWluZyB0b2xkIGV4cGxpY2l0bHkuCi0uUFAKLS5CIG9iamNvcHkKLWNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFMtcmVjb3JkcyBieSB1c2luZyBhbiBvdXRwdXQgdGFyZ2V0IG9mCi0uQiBzcmVjCi0oZS5nLiwgdXNlCi0uQiAtTyBzcmVjKS4KLS5QUAotLkIgb2JqY29weQotY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSByYXcgYmluYXJ5IGZpbGUgYnkgdXNpbmcgYW4gb3V0cHV0IHRhcmdldCBvZgotLkIgYmluYXJ5Ci0oZS5nLiwgdXNlCi0uQiAtTyBiaW5hcnkpLgotV2hlbgotLkIgb2JqY29weQotZ2VuZXJhdGVzIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCB3aWxsIGVzc2VudGlhbGx5IHByb2R1Y2UgYSBtZW1vcnkgZHVtcAotb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBvYmplY3QgZmlsZS4gIEFsbCBzeW1ib2xzIGFuZCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC4gIFRoZSBtZW1vcnkgZHVtcCB3aWxsIHN0YXJ0IGF0IHRoZQotdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuCi0uUFAKLVdoZW4gZ2VuZXJhdGluZyBhbiBTLXJlY29yZCBvciBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgbWF5IGJlIGhlbHBmdWwgdG8KLXVzZQotLkIgLVMKLXRvIHJlbW92ZSBzZWN0aW9ucyBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluIHNvbWUgY2FzZXMKLS5CIC1SCi13aWxsIGJlIHVzZWZ1bCB0byByZW1vdmUgc2VjdGlvbnMgd2hpY2ggY29udGFpbiBpbmZvcm1hdGlvbiB3aGljaCBpcwotbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCi0uUFAKLS5JIGluZmlsZQotYW5kCi0uSSBvdXRmaWxlCi1hcmUgdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZpbGVzIHJlc3BlY3RpdmVseS4gIElmIHlvdSBkbyBub3Qgc3BlY2lmeQotLklSIG91dGZpbGUgLAotLkIgb2JqY29weQotY3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGFuZCBkZXN0cnVjdGl2ZWx5IHJlbmFtZXMgdGhlIHJlc3VsdCB3aXRoIHRoZQotbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4KLQotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1JIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKLUNvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgCi0uSVIgYmZkbmFtZSAsCi1yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZHVjZSBpdC4KLS5UUAotLkIgXC1PIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Xcml0ZSB0aGUgb3V0cHV0IGZpbGUgdXNpbmcgdGhlIG9iamVjdCBmb3JtYXQgCi0uSVIgYmZkbmFtZSAuCi0uVFAKLS5CIFwtRiBcZkliZmRuYW1lXGZSLCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUKLVVzZSAKLS5JIGJmZG5hbWUKLWFzIHRoZSBvYmplY3QgZm9ybWF0IGZvciBib3RoIHRoZSBpbnB1dCBhbmQgdGhlIG91dHB1dCBmaWxlOyBpLmUuCi1zaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vIHRyYW5zbGF0aW9uLgotLlRQCi0uQiBcLWogXGZJc2VjdGlvbm5hbWVcZlIsIFxmQlwtXC1vbmx5XC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lCi1Db3B5IG9ubHkgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgaW5wdXQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUsCi1kaXNjYXJkaW5nIGFsbCBvdGhlciBzZWN0aW9ucy4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4KLW9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZSBvdXRwdXQKLWZpbGUgdW51c2FibGUuCi0uVFAKLS5CIFwtUiBcZklzZWN0aW9ubmFtZVxmUiwgXGZCXC1cLXJlbW92ZS1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lCi1SZW1vdmUgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlCi10aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZQotb3V0cHV0IGZpbGUgdW51c2FibGUuCi0uVFAKLS5CIFwtU1xmUiwgXGZCXC1cLXN0cmlwXC1hbGwKLURvIG5vdCBjb3B5IHJlbG9jYXRpb24gYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1nXGZSLCBcZkJcLVwtc3RyaXBcLWRlYnVnCi1EbyBub3QgY29weSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1cLXN0cmlwXC11bm5lZWRlZAotU3RyaXAgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotLlRQCi0uQiBcLUsgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLWtlZXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1Db3B5IG9ubHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwtTiBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1EbyBub3QgY29weSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLS5UUAotLkIgXC1MIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1sb2NhbGl6ZVwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLU1ha2Ugc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgbG9jYWwgdG8gdGhlIGZpbGUsIHNvIHRoYXQgaXQgaXMgbm90Ci12aXNpYmxlIGV4dGVybmFsbHkuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwtVyBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtd2Vha2VuXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotTWFrZSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCB3ZWFrLiBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwteFxmUiwgXGZCIFwtXC1kaXNjYXJkXC1hbGwKLURvIG5vdCBjb3B5IG5vbi1nbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1YXGZSLCBcZkJcLVwtZGlzY2FyZFwtbG9jYWxzCi1EbyBub3QgY29weSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4gKFRoZXNlIHVzdWFsbHkgc3RhcnQKLXdpdGggIkwiIG9yICIuIikuCi0uVFAKLS5CIFwtYiBcZklieXRlXGZSLCBcZkJcLVwtYnl0ZT1cZklieXRlCi1LZWVwIG9ubHkgZXZlcnkgXGZJYnl0ZVxmUHRoIGJ5dGUgb2YgdGhlIGlucHV0IGZpbGUgKGhlYWRlciBkYXRhIGlzCi1ub3QgYWZmZWN0ZWQpLiAgXGZJYnl0ZVxmUCBjYW4gYmUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byB0aGUKLWludGVybGVhdmUtMS4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgZmlsZXMgdG8gcHJvZ3JhbQotUk9Ncy4gIEl0IGlzIHR5cGljYWxseSB1c2VkIHdpdGggYW4gc3JlYyBvdXRwdXQgdGFyZ2V0LgotLlRQCi0uQiBcLWkgXGZJaW50ZXJsZWF2ZVxmUiwgXGZCXC1cLWludGVybGVhdmU9XGZJaW50ZXJsZWF2ZQotT25seSBjb3B5IG9uZSBvdXQgb2YgZXZlcnkgXGZJaW50ZXJsZWF2ZVxmUCBieXRlcy4gIFdoaWNoIG9uZSB0byBjb3B5IGlzCi1zZWxlY3RlZCBieSB0aGUgXGZCXC1iXGZQIG9yIFxmQlwtXC1ieXRlXGZQIG9wdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDQuCi1UaGUgaW50ZXJsZWF2ZSBpcyBpZ25vcmVkIGlmIG5laXRoZXIgXGZCXC1iXGZQIG5vciBcZkJcLVwtYnl0ZVxmUCBpcyBnaXZlbi4KLS5UUAotLkIgXC1wXGZSLCBcZkJcLVwtcHJlc2VydmVcLWRhdGVzCi1TZXQgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBiZSB0aGUgc2FtZQotYXMgdGhvc2Ugb2YgdGhlIGlucHV0IGZpbGUuCi0uVFAKLS5CIFwtXC1kZWJ1Z2dpbmcKLUNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpZiBwb3NzaWJsZS4gIFRoaXMgaXMgbm90IHRoZSBkZWZhdWx0Ci1iZWNhdXNlIG9ubHkgY2VydGFpbiBkZWJ1Z2dpbmcgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlCi1jb252ZXJzaW9uIHByb2Nlc3MgY2FuIGJlIHRpbWUgY29uc3VtaW5nLgotLlRQCi0uQiBcLVwtZ2FwXC1maWxsPVxmSXZhbAotRmlsbCBnYXBzIGJldHdlZW4gc2VjdGlvbnMgd2l0aCBcZkl2YWxcZlAuICBUaGlzIG9wZXJhdGlvbiBhcHBsaWVzIHRvCi10aGUgXGZJbG9hZCBhZGRyZXNzXGZQIChMTUEpIG9mIHRoZSBzZWN0aW9ucy4gIEl0IGlzIGRvbmUgYnkgaW5jcmVhc2luZwotdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXIgYWRkcmVzcywgYW5kIGZpbGxpbmcgaW4gdGhlIGV4dHJhCi1zcGFjZSBjcmVhdGVkIHdpdGggXGZJdmFsXGZQLgotLlRQCi0uQiBcLVwtcGFkXC10bz1cZklhZGRyZXNzCi1QYWQgdGhlIG91dHB1dCBmaWxlIHVwIHRvIHRoZSBsb2FkIGFkZHJlc3MgXGZJYWRkcmVzc1xmUC4gIFRoaXMgaXMKLWRvbmUgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBzZWN0aW9uLiAgVGhlIGV4dHJhIHNwYWNlIGlzCi1maWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IFxmQlwtXC1nYXBcLWZpbGxcZlAgKGRlZmF1bHQKLXplcm8pLgotLlRQCi0uQiBcZkJcLVwtc2V0XC1zdGFydD1cZkl2YWwKLVNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV3IGZpbGUgdG8gXGZJdmFsXGZQLiAgTm90IGFsbCBvYmplY3QKLWZpbGUgZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXN0YXJ0PVxmSWluY3JcZlIsIFxmQlwtXC1hZGp1c3RcLXN0YXJ0PVxmSWluY3IKLUNoYW5nZXMgdGhlIHN0YXJ0IGFkZHJlc3MgYnkgYWRkaW5nIFxmSWluY3JcZlAuICBOb3QgYWxsIG9iamVjdCBmaWxlCi1mb3JtYXRzIHN1cHBvcnQgc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcy4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzPVxmSWluY3JcZlIsIFxmQlwtXC1hZGp1c3RcLXZtYT1cZklpbmNyCi1DaGFuZ2VzIHRoZSBhZGRyZXNzIG9mIGFsbCBzZWN0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3RhcnQgYWRkcmVzcywgYnkKLWFkZGluZyBcZklpbmNyXGZQLiAgU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIGRvIG5vdCBwZXJtaXQgc2VjdGlvbgotYWRkcmVzc2VzIHRvIGJlIGNoYW5nZWQgYXJiaXRyYXJpbHkuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCByZWxvY2F0ZQotdGhlIHNlY3Rpb25zOyBpZiB0aGUgcHJvZ3JhbSBleHBlY3RzIHNlY3Rpb25zIHRvIGJlIGxvYWRlZCBhdCBhCi1jZXJ0YWluIGFkZHJlc3MsIGFuZCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc2VjdGlvbnMgc3VjaAotdGhhdCB0aGV5IGFyZSBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcywgdGhlIHByb2dyYW0gbWF5IGZhaWwuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLWFkZHJlc3M9XGZJc2VjdGlvbns9LCssLX12YWxcZlIsIFxmQlwtXC1hZGp1c3RcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbAotU2V0IG9yIGNoYW5nZXMgdGhlIFZNQSBhbmQgTE1BIGFkZHJlc3NlcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4KLUlmIFxmST1cZlAgaXMgdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8gXGZJdmFsXGZQLgotT3RoZXJ3aXNlLCBcZkl2YWxcZlAgaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBzZWN0aW9uCi1hZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlciBcZkJcLVwtY2hhbmdlXC1hZGRyZXNzZXNcZlAsIGFib3ZlLiAgSWYKLVxmSXNlY3Rpb25cZlAgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsIGJlCi1pc3N1ZWQsIHVubGVzcyBcZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlAgaXMgdXNlZC4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtbG1hPVxmSXNlY3Rpb257PSwrLC19dmFsCi1TZXQgb3IgY2hhbmdlIHRoZSBMTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4gIElmIFxmST1cZlAgaXMKLXVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4gIE90aGVyd2lzZSwgXGZJdmFsXGZQCi1pcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMKLXVuZGVyIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlc1xmUCwgYWJvdmUuICBJZiBcZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0Ci1pbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKLVxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUCBpcyB1c2VkLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC12bWE9XGZJc2VjdGlvbns9LCssLX12YWwKLVNldCBvciBjaGFuZ2UgdGhlIFZNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZCBcZklzZWN0aW9uXGZQLiAgSWYgXGZJPVxmUCBpcwotdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8gXGZJdmFsXGZQLiAgT3RoZXJ3aXNlLCBcZkl2YWxcZlAKLWlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cwotdW5kZXIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzXGZQLCBhYm92ZS4gIElmIFxmSXNlY3Rpb25cZlAgZG9lcyBub3QgZXhpc3QKLWluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQsIHVubGVzcwotXGZCXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZQIGlzIHVzZWQuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXdhcm5pbmdzXGZSLCBcZkJcLVwtYWRqdXN0XC13YXJuaW5ncwotSWYgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtWFhYXGZQIGlzIHVzZWQsIGFuZCB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzCi1ub3QgZXhpc3QsIGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0uVFAKLS5CIFxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUiwgXGZCXC1cLW5vXC1hZGp1c3RcLXdhcm5pbmdzCi1EbyBub3QgaXNzdWUgYSB3YXJuaW5nIGlmIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLVhYWFxmUCBpcyB1c2VkLCBldmVuCi1pZiB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdCBleGlzdC4KLS5UUAotLkIgXGZCXC1cLXNldFwtc2VjdGlvblwtZmxhZ3M9XGZJc2VjdGlvbj1mbGFncwotU2V0IHRoZSBmbGFncyBmb3IgdGhlIG5hbWVkIHNlY3Rpb24uICBUaGUgXGZJZmxhZ3NcZlAgYXJndW1lbnQgaXMgYQotY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBmbGFnIG5hbWVzLiAgVGhlIHJlY29nbml6ZWQgbmFtZXMgYXJlCi1cZklhbGxvY1xmUCwgXGZJbG9hZFxmUCwgXGZJcmVhZG9ubHlcZlAsIFxmSWNvZGVcZlAsIFxmSWRhdGFcZlAsIGFuZAotXGZJcm9tXGZQLiAgTm90IGFsbCBmbGFncyBhcmUgbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlCi1mb3JtYXRzLgotLlRQCi0uQiBcZkJcLVwtYWRkXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lPWZpbGVuYW1lCi1BZGQgYSBuZXcgc2VjdGlvbiBuYW1lZCBcZklzZWN0aW9ubmFtZVxmUiB3aGlsZSBjb3B5aW5nIHRoZSBmaWxlLiAgVGhlCi1jb250ZW50cyBvZiB0aGUgbmV3IHNlY3Rpb24gYXJlIHRha2VuIGZyb20gdGhlIGZpbGUgXGZJZmlsZW5hbWVcZlIuCi1UaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgVGhpcyBvcHRpb24KLW9ubHkgd29ya3Mgb24gZmlsZSBmb3JtYXRzIHdoaWNoIGNhbiBzdXBwb3J0IHNlY3Rpb25zIHdpdGggYXJiaXRyYXJ5Ci1uYW1lcy4KLS5UUAotLkIgXC1cLWNoYW5nZVwtbGVhZGluZ1wtY2hhcgotU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mCi1zeW1ib2xzLiAgVGhlIG1vc3QgY29tbW9uIHN1Y2ggY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUsIHdoaWNoIGNvbXBpbGVycwotb2Z0ZW4gYWRkIGJlZm9yZSBldmVyeSBzeW1ib2wuICBUaGlzIG9wdGlvbiB0ZWxscyAKLS5CIG9iamNvcHkKLXRvIGNoYW5nZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgb2YgZXZlcnkgc3ltYm9sIHdoZW4gaXQgY29udmVydHMKLWJldHdlZW4gb2JqZWN0IGZpbGUgZm9ybWF0cy4gIElmIHRoZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSB0aGUgc2FtZQotbGVhZGluZyBjaGFyYWN0ZXIsIHRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QuICBPdGhlcndpc2UsIGl0IHdpbGwgYWRkCi1hIGNoYXJhY3Rlciwgb3IgcmVtb3ZlIGEgY2hhcmFjdGVyLCBvciBjaGFuZ2UgYSBjaGFyYWN0ZXIsIGFzCi1hcHByb3ByaWF0ZS4KLS5UUAotLkIgXC1cLXJlbW92ZVwtbGVhZGluZ1wtY2hhcgotSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGdsb2JhbCBzeW1ib2wgaXMgYSBzcGVjaWFsIHN5bWJvbCBsZWFkaW5nCi1jaGFyYWN0ZXIgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCByZW1vdmUgdGhlIGNoYXJhY3Rlci4gIFRoZQotbW9zdCBjb21tb24gc3ltYm9sIGxlYWRpbmcgY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUuICBUaGlzIG9wdGlvbiB3aWxsCi1yZW1vdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSBhbGwgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGNhbiBiZQotdXNlZnVsIGlmIHlvdSB3YW50IHRvIGxpbmsgdG9nZXRoZXIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzCi13aXRoIGRpZmZlcmVudCBjb252ZW50aW9ucyBmb3Igc3ltYm9sIG5hbWVzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotXGZCXC1cLWNoYW5nZVwtbGVhZGluZ1wtY2hhclxmUCBiZWNhdXNlIGl0IGFsd2F5cyBjaGFuZ2VzIHRoZSBzeW1ib2wgbmFtZQotd2hlbiBhcHByb3ByaWF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQKLS5UUAotLkIgXC1cLXdlYWtlbgotQ2hhbmdlIGFsbCBnbG9iYWwgc3ltYm9scyBpbiB0aGUgZmlsZSB0byBiZSB3ZWFrLgotLlRQCi0uQiBcLXZcZlIsIFxmQlwtXC12ZXJib3NlCi1WZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKLWFyY2hpdmVzLCAiXGZCb2JqY29weSBcLVZcZlIiIGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotLlRQCi0uQiBcLVZcZlIsIFxmQlwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgb2JqY29weQotYW5kIGV4aXQuCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgb2JqY29weQotYW5kIGV4aXQuCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKEp1bmUgMTk5MykuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvb2JqY29weS5jIGIvYmludXRpbHMvb2JqY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2JkOTk2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL29iamNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNjcgKzAsMCBAQAotLyogb2JqY29weS5jIC0tIGNvcHkgb2JqZWN0IGZpbGUgZnJvbSBpbnB1dCB0byBvdXRwdXQsIG9wdGlvbmFsbHkgbWFzc2FnaW5nIGl0LgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLS8qIEEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cGxpY2l0bHkgc3RyaXAgb3V0LCBvciB0byBrZWVwLiAgQSBsaW5rZWQKLSAgIGxpc3QgaXMgZ29vZCBlbm91Z2ggZm9yIGEgc21hbGwgbnVtYmVyIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgYnV0Ci0gICB0aGlzIHdpbGwgc2xvdyB0aGluZ3MgZG93biBhIGxvdCBpZiBtYW55IHN5bWJvbHMgYXJlIGJlaW5nCi0gICBkZWxldGVkLiAqLwotCi1zdHJ1Y3Qgc3ltbGlzdAotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3Qgc3ltbGlzdCAqbmV4dDsKLX07Ci0KLXN0YXRpYyB2b2lkIGNvcHlfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHN0cmlwX3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgZmxhZ3dvcmQgcGFyc2VfZmxhZ3MgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbGlzdCAqZmluZF9zZWN0aW9uX2xpc3QgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvcHlfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBnZXRfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGludCBjb21wYXJlX3NlY3Rpb25fbG1hIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhZGRfc3BlY2lmaWNfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN5bWxpc3QgKiopKTsKLXN0YXRpYyBib29sZWFuIGlzX3NwZWNpZmllZF9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3ltbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpc19zdHJpcF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGZpbHRlcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXN5bWJvbCAqKiwgYXN5bWJvbCAqKiwgbG9uZykpOwotc3RhdGljIHZvaWQgbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgZmlsdGVyX2J5dGVzIFBBUkFNUyAoKGNoYXIgKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB3cml0ZV9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgUFRSLCBsb25nICosIGFzeW1ib2wgKioqKSk7Ci1zdGF0aWMgdm9pZCBjb3B5X29iamVjdCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIGNvcHlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKiwgYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgY29weV9maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBzdHJpcF9tYWluIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIGludCBjb3B5X21haW4gUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSNkZWZpbmUgUkVUVVJOX05PTkZBVEFMKHMpIHtiZmRfbm9uZmF0YWwgKHMpOyBzdGF0dXMgPSAxOyByZXR1cm47fQotCi1zdGF0aWMgYXN5bWJvbCAqKmlzeW1wcCA9IE5VTEw7CS8qIElucHV0IHN5bWJvbHMgKi8KLXN0YXRpYyBhc3ltYm9sICoqb3N5bXBwID0gTlVMTDsJLyogT3V0cHV0IHN5bWJvbHMgdGhhdCBzdXJ2aXZlIHN0cmlwcGluZyAqLwotCi0vKiBJZiBgY29weV9ieXRlJyA+PSAwLCBjb3B5IG9ubHkgdGhhdCBieXRlIG9mIGV2ZXJ5IGBpbnRlcmxlYXZlJyBieXRlcy4gICovCi1zdGF0aWMgaW50IGNvcHlfYnl0ZSA9IC0xOwotc3RhdGljIGludCBpbnRlcmxlYXZlID0gNDsKLQotc3RhdGljIGJvb2xlYW4gdmVyYm9zZTsJCS8qIFByaW50IGZpbGUgYW5kIHRhcmdldCBuYW1lcy4gKi8KLXN0YXRpYyBib29sZWFuIHByZXNlcnZlX2RhdGVzOwkvKiBQcmVzZXJ2ZSBpbnB1dCBmaWxlIHRpbWVzdGFtcC4gICovCi1zdGF0aWMgaW50IHN0YXR1cyA9IDA7CQkvKiBFeGl0IHN0YXR1cy4gICovCi0KLWVudW0gc3RyaXBfYWN0aW9uCi0gIHsKLSAgICBTVFJJUF9VTkRFRiwKLSAgICBTVFJJUF9OT05FLAkJCS8qIGRvbid0IHN0cmlwICovCi0gICAgU1RSSVBfREVCVUcsCQkvKiBzdHJpcCBhbGwgZGVidWdnZXIgc3ltYm9scyAqLwotICAgIFNUUklQX1VOTkVFREVELAkJLyogc3RyaXAgdW5uZWNlc3Nhcnkgc3ltYm9scyAqLwotICAgIFNUUklQX0FMTAkJCS8qIHN0cmlwIGFsbCBzeW1ib2xzICovCi0gIH07Ci0KLS8qIFdoaWNoIHN5bWJvbHMgdG8gcmVtb3ZlLiAqLwotc3RhdGljIGVudW0gc3RyaXBfYWN0aW9uIHN0cmlwX3N5bWJvbHM7Ci0KLWVudW0gbG9jYWxzX2FjdGlvbgotICB7Ci0gICAgTE9DQUxTX1VOREVGLAotICAgIExPQ0FMU19TVEFSVF9MLAkJLyogZGlzY2FyZCBsb2NhbHMgc3RhcnRpbmcgd2l0aCBMICovCi0gICAgTE9DQUxTX0FMTAkJCS8qIGRpc2NhcmQgYWxsIGxvY2FscyAqLwotICB9OwotCi0vKiBXaGljaCBsb2NhbCBzeW1ib2xzIHRvIHJlbW92ZS4gIE92ZXJyaWRlcyBTVFJJUF9BTEwuICAqLwotc3RhdGljIGVudW0gbG9jYWxzX2FjdGlvbiBkaXNjYXJkX2xvY2FsczsKLQotLyogV2hhdCBraW5kIG9mIGNoYW5nZSB0byBwZXJmb3JtLiAgKi8KLWVudW0gY2hhbmdlX2FjdGlvbgotewotICBDSEFOR0VfSUdOT1JFLAotICBDSEFOR0VfTU9ESUZZLAotICBDSEFOR0VfU0VUCi19OwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGxpc3RzIG9mIHNlY3Rpb25zIGFuZCBhY3Rpb25zIHRvIHRha2UuICAqLwotc3RydWN0IHNlY3Rpb25fbGlzdAotewotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICogbmV4dDsgICAgICAvKiBOZXh0IHNlY3Rpb24gdG8gY2hhbmdlLiAgKi8KLSAgY29uc3QgY2hhciAqICAgICAgICAgIG5hbWU7ICAgICAgLyogU2VjdGlvbiBuYW1lLiAgKi8KLSAgYm9vbGVhbiAgICAgICAgICAgICAgIHVzZWQ7ICAgICAgLyogV2hldGhlciB0aGlzIGVudHJ5IHdhcyB1c2VkLiAgKi8KLSAgYm9vbGVhbiAgICAgICAgICAgICAgIHJlbW92ZTsgICAgLyogV2hldGhlciB0byByZW1vdmUgdGhpcyBzZWN0aW9uLiAgKi8KLSAgYm9vbGVhbgkJY29weTsgICAgICAvKiBXaGV0aGVyIHRvIGNvcHkgdGhpcyBzZWN0aW9uLiAgKi8KLSAgZW51bSBjaGFuZ2VfYWN0aW9uICAgIGNoYW5nZV92bWE7LyogV2hldGhlciB0byBjaGFuZ2Ugb3Igc2V0IFZNQS4gICovCi0gIGJmZF92bWEgCQl2bWFfdmFsOyAgIC8qIEFtb3VudCB0byBjaGFuZ2UgYnkgb3Igc2V0IHRvLiAgKi8KLSAgZW51bSBjaGFuZ2VfYWN0aW9uICAgIGNoYW5nZV9sbWE7LyogV2hldGhlciB0byBjaGFuZ2Ugb3Igc2V0IExNQS4gICovCi0gIGJmZF92bWEgCQlsbWFfdmFsOyAgIC8qIEFtb3VudCB0byBjaGFuZ2UgYnkgb3Igc2V0IHRvLiAgKi8KLSAgYm9vbGVhbiAJCXNldF9mbGFnczsgLyogV2hldGhlciB0byBzZXQgdGhlIHNlY3Rpb24gZmxhZ3MuICAqLwotICBmbGFnd29yZCAJCWZsYWdzOyAgICAgLyogV2hhdCB0byBzZXQgdGhlIHNlY3Rpb24gZmxhZ3MgdG8uICAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QgKmNoYW5nZV9zZWN0aW9uczsKLXN0YXRpYyBib29sZWFuIHNlY3Rpb25zX3JlbW92ZWQ7Ci1zdGF0aWMgYm9vbGVhbiBzZWN0aW9uc19jb3BpZWQ7Ci0KLS8qIENoYW5nZXMgdG8gdGhlIHN0YXJ0IGFkZHJlc3MuICAqLwotc3RhdGljIGJmZF92bWEgY2hhbmdlX3N0YXJ0ID0gMDsKLXN0YXRpYyBib29sZWFuIHNldF9zdGFydF9zZXQgPSBmYWxzZTsKLXN0YXRpYyBiZmRfdm1hIHNldF9zdGFydDsKLQotLyogQ2hhbmdlcyB0byBzZWN0aW9uIGFkZHJlc3Nlcy4gICovCi1zdGF0aWMgYmZkX3ZtYSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzID0gMDsKLQotLyogRmlsbGluZyBnYXBzIGJldHdlZW4gc2VjdGlvbnMuICAqLwotc3RhdGljIGJvb2xlYW4gZ2FwX2ZpbGxfc2V0ID0gZmFsc2U7Ci1zdGF0aWMgYmZkX2J5dGUgZ2FwX2ZpbGwgPSAwOwotCi0vKiBQYWQgdG8gYSBnaXZlbiBhZGRyZXNzLiAgKi8KLXN0YXRpYyBib29sZWFuIHBhZF90b19zZXQgPSBmYWxzZTsKLXN0YXRpYyBiZmRfdm1hIHBhZF90bzsKLQotLyogTGlzdCBvZiBzZWN0aW9ucyB0byBhZGQuICAqLwotCi1zdHJ1Y3Qgc2VjdGlvbl9hZGQKLXsKLSAgLyogTmV4dCBzZWN0aW9uIHRvIGFkZC4gICovCi0gIHN0cnVjdCBzZWN0aW9uX2FkZCAqbmV4dDsKLSAgLyogTmFtZSBvZiBzZWN0aW9uIHRvIGFkZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIE5hbWUgb2YgZmlsZSBob2xkaW5nIHNlY3Rpb24gY29udGVudHMuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogU2l6ZSBvZiBmaWxlLiAgKi8KLSAgc2l6ZV90IHNpemU7Ci0gIC8qIENvbnRlbnRzIG9mIGZpbGUuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJGRCBzZWN0aW9uLCBhZnRlciBpdCBoYXMgYmVlbiBhZGRlZC4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2FkZCAqYWRkX3NlY3Rpb25zOwotCi0vKiBXaGV0aGVyIHRvIGNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29udmVydF9kZWJ1Z2dpbmcgPSBmYWxzZTsKLQotLyogV2hldGhlciB0byBjaGFuZ2UgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGluIHN5bWJvbCBuYW1lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIGNoYW5nZV9sZWFkaW5nX2NoYXIgPSBmYWxzZTsKLQotLyogV2hldGhlciB0byByZW1vdmUgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGZyb20gZ2xvYmFsIHN5bWJvbCBuYW1lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIHJlbW92ZV9sZWFkaW5nX2NoYXIgPSBmYWxzZTsKLQotLyogTGlzdCBvZiBzeW1ib2xzIHRvIHN0cmlwLCBrZWVwLCBsb2NhbGl6ZSwgYW5kIHdlYWtlbi4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqc3RyaXBfc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKmtlZXBfc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKmxvY2FsaXplX3NwZWNpZmljX2xpc3QgPSBOVUxMOwotc3RhdGljIHN0cnVjdCBzeW1saXN0ICp3ZWFrZW5fc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci0KLS8qIElmIHRoaXMgaXMgdHJ1ZSwgd2Ugd2Vha2VuIGdsb2JhbCBzeW1ib2xzIChzZXQgQlNGX1dFQUspLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gd2Vha2VuID0gZmFsc2U7Ci0KLS8qIDE1MCBpc24ndCBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KLQotI2RlZmluZSBPUFRJT05fQUREX1NFQ1RJT04gMTUwCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTIChPUFRJT05fQUREX1NFQ1RJT04gKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUiAoT1BUSU9OX0NIQU5HRV9BRERSRVNTRVMgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NUQVJUIChPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUiArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTIChPUFRJT05fQ0hBTkdFX1NUQVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQSAoT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1MgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BIChPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9XQVJOSU5HUyAoT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQSArIDEpCi0jZGVmaW5lIE9QVElPTl9ERUJVR0dJTkcgKE9QVElPTl9DSEFOR0VfV0FSTklOR1MgKyAxKQotI2RlZmluZSBPUFRJT05fR0FQX0ZJTEwgKE9QVElPTl9ERUJVR0dJTkcgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTIChPUFRJT05fR0FQX0ZJTEwgKyAxKQotI2RlZmluZSBPUFRJT05fUEFEX1RPIChPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVIgKE9QVElPTl9QQURfVE8gKyAxKQotI2RlZmluZSBPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1MgKE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NFVF9TVEFSVCAoT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUUklQX1VOTkVFREVEIChPUFRJT05fU0VUX1NUQVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dFQUtFTiAoT1BUSU9OX1NUUklQX1VOTkVFREVEICsgMSkKLQotLyogT3B0aW9ucyB0byBoYW5kbGUgaWYgcnVubmluZyBhcyAic3RyaXAiLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvcHRpb24gc3RyaXBfb3B0aW9uc1tdID0KLXsKLSAgeyJkaXNjYXJkLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAneCd9LAotICB7ImRpc2NhcmQtbG9jYWxzIiwgbm9fYXJndW1lbnQsIDAsICdYJ30sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sIC8qIE9ic29sZXRlICovCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImlucHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LCAvKiBPYnNvbGV0ZSAqLwotICB7ImlucHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7ImtlZXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdLJ30sCi0gIHsib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAkvKiBPYnNvbGV0ZSAqLwotICB7Im91dHB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJwcmVzZXJ2ZS1kYXRlcyIsIG5vX2FyZ3VtZW50LCAwLCAncCd9LAotICB7InJlbW92ZS1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdSJ30sCi0gIHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0gIHsic3RyaXAtZGVidWciLCBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzdHJpcC11bm5lZWRlZCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fU1RSSVBfVU5ORUVERUR9LAotICB7InN0cmlwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTid9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJ30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLS8qIE9wdGlvbnMgdG8gaGFuZGxlIGlmIHJ1bm5pbmcgYXMgIm9iamNvcHkiLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvcHRpb24gY29weV9vcHRpb25zW10gPQotewotICB7ImFkZC1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9BRERfU0VDVElPTn0sCi0gIHsiYWRqdXN0LXN0YXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU1RBUlR9LAotICB7ImFkanVzdC12bWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9BRERSRVNTRVN9LAotICB7ImFkanVzdC1zZWN0aW9uLXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTU30sCi0gIHsiYWRqdXN0LXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfV0FSTklOR1N9LAotICB7ImJ5dGUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InfSwKLSAgeyJjaGFuZ2UtYWRkcmVzc2VzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTfSwKLSAgeyJjaGFuZ2UtbGVhZGluZy1jaGFyIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSfSwKLSAgeyJjaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTfSwKLSAgeyJjaGFuZ2Utc2VjdGlvbi1sbWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQX0sCi0gIHsiY2hhbmdlLXNlY3Rpb24tdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUF9LAotICB7ImNoYW5nZS1zdGFydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NUQVJUfSwKLSAgeyJjaGFuZ2Utd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsiZGVidWdnaW5nIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ERUJVR0dJTkd9LAotICB7ImRpc2NhcmQtYWxsIiwgbm9fYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgMCwgJ1gnfSwKLSAgeyJvbmx5LXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2onfSwKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJnYXAtZmlsbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fR0FQX0ZJTEx9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJpbnB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJpbnRlcmxlYXZlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdpJ30sCi0gIHsia2VlcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0snfSwKLSAgeyJuby1hZGp1c3Qtd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsibm8tY2hhbmdlLXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1N9LAotICB7Im91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwJLyogT2Jzb2xldGUgKi8KLSAgeyJvdXRwdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsicGFkLXRvIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9QQURfVE99LAotICB7InByZXNlcnZlLWRhdGVzIiwgbm9fYXJndW1lbnQsIDAsICdwJ30sCi0gIHsibG9jYWxpemUtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdMJ30sCi0gIHsicmVtb3ZlLWxlYWRpbmctY2hhciIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUn0sCi0gIHsicmVtb3ZlLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1InfSwKLSAgeyJzZXQtc2VjdGlvbi1mbGFncyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1N9LAotICB7InNldC1zdGFydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fU0VUX1NUQVJUfSwKLSAgeyJzdHJpcC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnZyd9LAotICB7InN0cmlwLXVubmVlZGVkIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9TVFJJUF9VTk5FRURFRH0sCi0gIHsic3RyaXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdOJ30sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgeyJ3ZWFrZW4iLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1dFQUtFTn0sCi0gIHsid2Vha2VuLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnVyd9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBJTVBPUlRTICovCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBUaGlzIGZsYWcgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHN0cmlwIGFuZCBvYmpjb3B5OgotICAgMSBtZWFucyB0aGlzIGlzICdzdHJpcCc7IDAgbWVhbnMgdGhpcyBpcyAnb2JqY29weScuCi0gICAtMSBtZWFucyBpZiB3ZSBzaG91bGQgdXNlIGFyZ3ZbMF0gdG8gZGVjaWRlLiAqLwotZXh0ZXJuIGludCBpc19zdHJpcDsKLQotCi1zdGF0aWMgdm9pZAotY29weV91c2FnZSAoc3RyZWFtLCBleGl0X3N0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgZXhpdF9zdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstdlZTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1iIGJ5dGVdXG5cCi0gICAgICAgWy1qIHNlY3Rpb25dIFstUiBzZWN0aW9uXVxuXAotICAgICAgIFstaSBpbnRlcmxlYXZlXSBbLS1pbnRlcmxlYXZlPWludGVybGVhdmVdIFstLWJ5dGU9Ynl0ZV1cblwKLSAgICAgICBbLS1pbnB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tb3V0cHV0LXRhcmdldD1iZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLS1zdHJpcC1hbGxdIFstLXN0cmlwLWRlYnVnXSBbLS1zdHJpcC11bm5lZWRlZF0gWy0tZGlzY2FyZC1hbGxdXG5cCi0gICAgICAgWy0tZGlzY2FyZC1sb2NhbHNdIFstLWRlYnVnZ2luZ11cblwKLSAgICAgICBbLS1vbmx5LXNlY3Rpb249c2VjdGlvbl0gWy0tcmVtb3ZlLXNlY3Rpb249c2VjdGlvbl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAgICAgIFstLWdhcC1maWxsPXZhbF0gWy0tcGFkLXRvPWFkZHJlc3NdIFstLXByZXNlcnZlLWRhdGVzXVxuXAotICAgICAgIFstLXNldC1zdGFydD12YWxdIFxuXAotICAgICAgIFstLWNoYW5nZS1zdGFydD1pbmNyXSBbLS1jaGFuZ2UtYWRkcmVzc2VzPWluY3JdIFxuXAotICAgICAgICgtLWFkanVzdC1zdGFydCAgIGFuZCAgLS1hZGp1c3Qtdm1hIGFyZSBhbGlhc2VzIGZvciB0aGVzZSB0d28pIFxuXAotICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3M9c2VjdGlvbns9LCssLX12YWxdXG5cCi0gICAgICAgKC0tYWRqdXN0LXNlY3Rpb24tdm1hIGlzIGFuIGFsaWFzIGZvciAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MpXG5cCi0gICAgICAgWy0tY2hhbmdlLXNlY3Rpb24tbG1hPXNlY3Rpb257PSwrLC19dmFsXVxuXAotICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLXZtYT1zZWN0aW9uez0sKywtfXZhbF1cblwKLSAgICAgICBbLS1hZGp1c3Qtd2FybmluZ3NdIFstLW5vLWFkanVzdC13YXJuaW5nc11cblwKLSAgICAgICBbLS1jaGFuZ2Utd2FybmluZ3NdIFstLW5vLWNoYW5nZS13YXJuaW5nc11cblwKLSAgICAgICBbLS1zZXQtc2VjdGlvbi1mbGFncz1zZWN0aW9uPWZsYWdzXSBbLS1hZGQtc2VjdGlvbj1zZWN0aW9ubmFtZT1maWxlbmFtZV1cblwKLSAgICAgICBbLS1rZWVwLXN5bWJvbCBzeW1ib2xdIFstSyBzeW1ib2xdIFstLXN0cmlwLXN5bWJvbCBzeW1ib2xdIFstTiBzeW1ib2xdXG5cCi0gICAgICAgWy0tbG9jYWxpemUtc3ltYm9sIHN5bWJvbF0gWy1MIHN5bWJvbF0gWy0td2Vha2VuLXN5bWJvbCBzeW1ib2xdXG5cCi0gICAgICAgWy1XIHN5bWJvbF0gWy0tY2hhbmdlLWxlYWRpbmctY2hhcl0gWy0tcmVtb3ZlLWxlYWRpbmctY2hhcl0gWy0td2Vha2VuXVxuXAotICAgICAgIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdIGluLWZpbGUgW291dC1maWxlXVxuIikpOwotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChleGl0X3N0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKGV4aXRfc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmlwX3VzYWdlIChzdHJlYW0sIGV4aXRfc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBleGl0X3N0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy12VnNTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1SIHNlY3Rpb25dXG5cCi0gICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCi0gICAgICAgWy0tc3RyaXAtYWxsXSBbLS1zdHJpcC1kZWJ1Z10gWy0tc3RyaXAtdW5uZWVkZWRdIFstLWRpc2NhcmQtYWxsXVxuXAotICAgICAgIFstLWRpc2NhcmQtbG9jYWxzXSBbLS1rZWVwLXN5bWJvbCBzeW1ib2xdIFstSyBzeW1ib2xdXG5cCi0gICAgICAgWy0tc3RyaXAtc3ltYm9sIHN5bWJvbF0gWy1OIHN5bWJvbF0gWy0tcmVtb3ZlLXNlY3Rpb249c2VjdGlvbl1cblwKLSAgICAgICBbLW8gZmlsZV0gWy0tcHJlc2VydmUtZGF0ZXNdIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdIGZpbGUuLi5cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKGV4aXRfc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoZXhpdF9zdGF0dXMpOwotfQotCi0vKiBQYXJzZSBzZWN0aW9uIGZsYWdzIGludG8gYSBmbGFnd29yZCwgd2l0aCBhIGZhdGFsIGVycm9yIGlmIHRoZQotICAgc3RyaW5nIGNhbid0IGJlIHBhcnNlZC4gICovCi0KLXN0YXRpYyBmbGFnd29yZAotcGFyc2VfZmxhZ3MgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGZsYWd3b3JkIHJldDsKLSAgY29uc3QgY2hhciAqc25leHQ7Ci0gIGludCBsZW47Ci0KLSAgcmV0ID0gU0VDX05PX0ZMQUdTOwotCi0gIGRvCi0gICAgewotICAgICAgc25leHQgPSBzdHJjaHIgKHMsICcsJyk7Ci0gICAgICBpZiAoc25leHQgPT0gTlVMTCkKLQlsZW4gPSBzdHJsZW4gKHMpOwotICAgICAgZWxzZQotCXsKLQkgIGxlbiA9IHNuZXh0IC0gczsKLQkgICsrc25leHQ7Ci0JfQotCi0gICAgICBpZiAoMCkgOwotI2RlZmluZSBQQVJTRV9GTEFHKGZuYW1lLGZ2YWwpIFwKLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGZuYW1lLCBzLCBsZW4pID09IDApIHJldCB8PSBmdmFsCi0gICAgICBQQVJTRV9GTEFHICgiYWxsb2MiLCBTRUNfQUxMT0MpOwotICAgICAgUEFSU0VfRkxBRyAoImxvYWQiLCBTRUNfTE9BRCk7Ci0gICAgICBQQVJTRV9GTEFHICgicmVhZG9ubHkiLCBTRUNfUkVBRE9OTFkpOwotICAgICAgUEFSU0VfRkxBRyAoImNvZGUiLCBTRUNfQ09ERSk7Ci0gICAgICBQQVJTRV9GTEFHICgiZGF0YSIsIFNFQ19EQVRBKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJyb20iLCBTRUNfUk9NKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJjb250ZW50cyIsIFNFQ19IQVNfQ09OVEVOVFMpOwotI3VuZGVmIFBBUlNFX0ZMQUcKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpjb3B5OwotCi0JICBjb3B5ID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICBzdHJuY3B5IChjb3B5LCBzLCBsZW4pOwotCSAgY29weVtsZW5dID0gJ1wwJzsKLQkgIG5vbl9mYXRhbCAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gZmxhZyBgJXMnIiksIGNvcHkpOwotCSAgZmF0YWwgKF8oInN1cHBvcnRlZCBmbGFnczogYWxsb2MsIGxvYWQsIHJlYWRvbmx5LCBjb2RlLCBkYXRhLCByb20sIGNvbnRlbnRzIikpOwotCX0KLQotICAgICAgcyA9IHNuZXh0OwotICAgIH0KLSAgd2hpbGUgKHMgIT0gTlVMTCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRmluZCBhbmQgb3B0aW9uYWxseSBhZGQgYW4gZW50cnkgaW4gdGhlIGNoYW5nZV9zZWN0aW9ucyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QgKgotZmluZF9zZWN0aW9uX2xpc3QgKG5hbWUsIGFkZCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBhZGQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0KLSAgZm9yIChwID0gY2hhbmdlX3NlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHAtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICByZXR1cm4gcDsKLQotICBpZiAoISBhZGQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcCA9IChzdHJ1Y3Qgc2VjdGlvbl9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fbGlzdCkpOwotICBwLT5uYW1lID0gbmFtZTsKLSAgcC0+dXNlZCA9IGZhbHNlOwotICBwLT5yZW1vdmUgPSBmYWxzZTsKLSAgcC0+Y29weSA9IGZhbHNlOwotICBwLT5jaGFuZ2Vfdm1hID0gQ0hBTkdFX0lHTk9SRTsKLSAgcC0+Y2hhbmdlX2xtYSA9IENIQU5HRV9JR05PUkU7Ci0gIHAtPnZtYV92YWwgPSAwOwotICBwLT5sbWFfdmFsID0gMDsKLSAgcC0+c2V0X2ZsYWdzID0gZmFsc2U7Ci0gIHAtPmZsYWdzID0gMDsKLQotICBwLT5uZXh0ID0gY2hhbmdlX3NlY3Rpb25zOwotICBjaGFuZ2Vfc2VjdGlvbnMgPSBwOwotCi0gIHJldHVybiBwOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gc3RyaXBfc3BlY2lmaWNfbGlzdC4gICovCi0KLXN0YXRpYyB2b2lkIAotYWRkX3NwZWNpZmljX3N5bWJvbCAobmFtZSwgbGlzdCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHN5bWxpc3QgKipsaXN0OwotewotICBzdHJ1Y3Qgc3ltbGlzdCAqdG1wX2xpc3Q7Ci0KLSAgdG1wX2xpc3QgPSAoc3RydWN0IHN5bWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3ltbGlzdCkpOwotICB0bXBfbGlzdC0+bmFtZSA9IG5hbWU7Ci0gIHRtcF9saXN0LT5uZXh0ID0gKmxpc3Q7Ci0gICpsaXN0ID0gdG1wX2xpc3Q7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGEgc3ltYm9sIHNob3VsZCBiZSBzdHJpcHBlZCBvciBrZXB0IGJhc2VkIG9uCi0gICBzdHJpcF9zcGVjaWZpY19saXN0IGFuZCBrZWVwX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgbGlzdCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHN5bWxpc3QgKmxpc3Q7Ci17Ci0gIHN0cnVjdCBzeW1saXN0ICp0bXBfbGlzdDsKLQotICBmb3IgKHRtcF9saXN0ID0gbGlzdDsgdG1wX2xpc3Q7IHRtcF9saXN0ID0gdG1wX2xpc3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgdG1wX2xpc3QtPm5hbWUpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSBpZiBhIHNlY3Rpb24gaXMgYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pc19zdHJpcF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19ERUJVR0dJTkcpICE9IDAKLSAgICAgICYmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHCi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAotCSAgfHwgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX0FMTAotCSAgfHwgY29udmVydF9kZWJ1Z2dpbmcpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIHNlY3Rpb25zX3JlbW92ZWQgJiYgISBzZWN0aW9uc19jb3BpZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIGZhbHNlKTsKLSAgaWYgKHNlY3Rpb25zX3JlbW92ZWQgJiYgcCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKHNlY3Rpb25zX2NvcGllZCAmJiAocCA9PSBOVUxMIHx8ICEgcC0+Y29weSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2hvb3NlIHdoaWNoIHN5bWJvbCBlbnRyaWVzIHRvIGNvcHk7IHB1dCB0aGUgcmVzdWx0IGluIE9TWU1TLgotICAgV2UgZG9uJ3QgY29weSBpbiBwbGFjZSwgYmVjYXVzZSB0aGF0IGNvbmZ1c2VzIHRoZSByZWxvY3MuCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBzeW1ib2xzIHRvIHByaW50LiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZmlsdGVyX3N5bWJvbHMgKGFiZmQsIG9iZmQsIG9zeW1zLCBpc3ltcywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc3ltYm9sICoqb3N5bXMsICoqaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGFzeW1ib2wgKipmcm9tID0gaXN5bXMsICoqdG8gPSBvc3ltczsKLSAgbG9uZyBzcmNfY291bnQgPSAwLCBkc3RfY291bnQgPSAwOwotCi0gIGZvciAoOyBzcmNfY291bnQgPCBzeW1jb3VudDsgc3JjX2NvdW50KyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gZnJvbVtzcmNfY291bnRdOwotICAgICAgZmxhZ3dvcmQgZmxhZ3MgPSBzeW0tPmZsYWdzOwotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0gICAgICBpbnQga2VlcDsKLQotICAgICAgaWYgKGNoYW5nZV9sZWFkaW5nX2NoYXIKLQkgICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpCi0JICAgICAgIT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvYmZkKSkKLQkgICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdcMCcKLQkgICAgICB8fCAobmFtZVswXSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpKSkpCi0JewotCSAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JmZCkgPT0gJ1wwJykKLQkgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgPSBuYW1lICsgMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBuID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDIpOwotCSAgICAgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG9iZmQpOwotCSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdcMCcpCi0JCXN0cmNweSAobiArIDEsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3RyY3B5IChuICsgMSwgbmFtZSArIDEpOwotCSAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pID0gbjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJlbW92ZV9sZWFkaW5nX2NoYXIKLQkgICYmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCi0JICAgICAgfHwgKGZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAmJiBuYW1lWzBdID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkpCi0JbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgPSBuYW1lICsgMTsKLQotICAgICAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMKQotCWtlZXAgPSAwOwotICAgICAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0tFRVApICE9IDAJCS8qIFVzZWQgaW4gcmVsb2NhdGlvbi4gICovCi0JICAgICAgIHx8ICgoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLQkJICAgJiYgKCgqYmZkX2dldF9zZWN0aW9uIChzeW0pLT5zeW1ib2xfcHRyX3B0ciktPmZsYWdzCi0JCSAgICAgICAmIEJTRl9LRUVQKSAhPSAwKSkKLQlrZWVwID0gMTsKLSAgICAgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDAJLyogR2xvYmFsIHN5bWJvbC4gICovCi0JICAgICAgIHx8IChmbGFncyAmIEJTRl9XRUFLKSAhPSAwCi0JICAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0Ja2VlcCA9IHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfVU5ORUVERUQ7Ci0gICAgICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQkvKiBEZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLQlrZWVwID0gKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfREVCVUcKLQkJJiYgc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9VTk5FRURFRAotCQkmJiAhIGNvbnZlcnRfZGVidWdnaW5nKTsKLSAgICAgIGVsc2UJCQkvKiBMb2NhbCBzeW1ib2wuICAqLwotCWtlZXAgPSAoc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9VTk5FRURFRAotCQkmJiAoZGlzY2FyZF9sb2NhbHMgIT0gTE9DQUxTX0FMTAotCQkgICAgJiYgKGRpc2NhcmRfbG9jYWxzICE9IExPQ0FMU19TVEFSVF9MCi0JCQl8fCAhIGJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgc3ltKSkpKTsKLQotICAgICAgaWYgKGtlZXAgJiYgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgc3RyaXBfc3BlY2lmaWNfbGlzdCkpCi0Ja2VlcCA9IDA7Ci0gICAgICBpZiAoIWtlZXAgJiYgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwga2VlcF9zcGVjaWZpY19saXN0KSkKLQlrZWVwID0gMTsKLSAgICAgIGlmIChrZWVwICYmIGlzX3N0cmlwX3NlY3Rpb24gKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0Ja2VlcCA9IDA7Ci0KLSAgICAgIGlmIChrZWVwICYmIChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkgICYmICh3ZWFrZW4gfHwgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgd2Vha2VuX3NwZWNpZmljX2xpc3QpKSkKLQl7Ci0JICBzeW0tPmZsYWdzICY9fiBCU0ZfR0xPQkFMOwotCSAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLQl9Ci0gICAgICBpZiAoa2VlcCAmJiAoZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkgICYmIGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIGxvY2FsaXplX3NwZWNpZmljX2xpc3QpKQotCXsKLQkgIHN5bS0+ZmxhZ3MgJj0gfihCU0ZfR0xPQkFMIHwgQlNGX1dFQUspOwotCSAgc3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JfQotCi0gICAgICBpZiAoa2VlcCkKLQl0b1tkc3RfY291bnQrK10gPSBzeW07Ci0gICAgfQotCi0gIHRvW2RzdF9jb3VudF0gPSBOVUxMOwotCi0gIHJldHVybiBkc3RfY291bnQ7Ci19Ci0KLS8qIEtlZXAgb25seSBldmVyeSBgY29weV9ieXRlJ3RoIGJ5dGUgaW4gTUVNSFVOSywgd2hpY2ggaXMgKlNJWkUgYnl0ZXMgbG9uZy4KLSAgIEFkanVzdCAqU0laRS4gICovCi0KLXN0YXRpYyB2b2lkCi1maWx0ZXJfYnl0ZXMgKG1lbWh1bmssIHNpemUpCi0gICAgIGNoYXIgKm1lbWh1bms7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnNpemU7Ci17Ci0gIGNoYXIgKmZyb20gPSBtZW1odW5rICsgY29weV9ieXRlLCAqdG8gPSBtZW1odW5rLCAqZW5kID0gbWVtaHVuayArICpzaXplOwotCi0gIGZvciAoOyBmcm9tIDwgZW5kOyBmcm9tICs9IGludGVybGVhdmUpCi0gICAgKnRvKysgPSAqZnJvbTsKLSAgaWYgKCpzaXplICUgaW50ZXJsZWF2ZSA+IGNvcHlfYnl0ZSkKLSAgICAqc2l6ZSA9ICgqc2l6ZSAvIGludGVybGVhdmUpICsgMTsKLSAgZWxzZQotICAgICpzaXplIC89IGludGVybGVhdmU7Ci19Ci0KLS8qIENvcHkgb2JqZWN0IGZpbGUgSUJGRCBvbnRvIE9CRkQuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9vYmplY3QgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBiZmRfdm1hIHN0YXJ0OwotICBsb25nIHN5bWNvdW50OwotICBhc2VjdGlvbiAqKm9zZWN0aW9ucyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgKmdhcHMgPSBOVUxMOwotICBiZmRfc2l6ZV90eXBlIG1heF9nYXAgPSAwOwotICBsb25nIHN5bXNpemU7Ci0gIFBUUiBkaGFuZGxlOwotCi0KLSAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICBwcmludGYgKF8oImNvcHkgZnJvbSAlcyglcykgdG8gJXMoJXMpXG4iKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIGJmZF9nZXRfdGFyZ2V0IChpYmZkKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIGJmZF9nZXRfdGFyZ2V0IChvYmZkKSk7Ci0KLSAgaWYgKHNldF9zdGFydF9zZXQpCi0gICAgc3RhcnQgPSBzZXRfc3RhcnQ7Ci0gIGVsc2UKLSAgICBzdGFydCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoaWJmZCk7Ci0gIHN0YXJ0ICs9IGNoYW5nZV9zdGFydDsKLQotICBpZiAoIWJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob2JmZCwgc3RhcnQpCi0gICAgICB8fCAhYmZkX3NldF9maWxlX2ZsYWdzIChvYmZkLAotCQkJICAgICAgKGJmZF9nZXRfZmlsZV9mbGFncyAoaWJmZCkKLQkJCSAgICAgICAmIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MgKG9iZmQpKSkpCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgLyogQ29weSBhcmNoaXRlY3R1cmUgb2YgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSAqLwotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJICBiZmRfZ2V0X21hY2ggKGliZmQpKSkKLSAgICBub25fZmF0YWwgKF8oIldhcm5pbmc6IE91dHB1dCBmaWxlIGNhbm5vdCByZXByZXNlbnQgYXJjaGl0ZWN0dXJlICVzIiksCi0JICAgICAgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJCQliZmRfZ2V0X21hY2ggKGliZmQpKSk7Ci0gIAotICBpZiAoIWJmZF9zZXRfZm9ybWF0IChvYmZkLCBiZmRfZ2V0X2Zvcm1hdCAoaWJmZCkpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIGlmIChpc3ltcHApCi0gICAgZnJlZSAoaXN5bXBwKTsKLSAgCi0gIGlmIChvc3ltcHAgIT0gaXN5bXBwKQotICAgIGZyZWUgKG9zeW1wcCk7Ci0KLSAgLyogQkZEIG1hbmRhdGVzIHRoYXQgYWxsIG91dHB1dCBzZWN0aW9ucyBiZSBjcmVhdGVkIGFuZCBzaXplcyBzZXQgYmVmb3JlCi0gICAgIGFueSBvdXRwdXQgaXMgZG9uZS4gIFRodXMsIHdlIHRyYXZlcnNlIGFsbCBzZWN0aW9ucyBtdWx0aXBsZSB0aW1lcy4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwgc2V0dXBfc2VjdGlvbiwgKHZvaWQgKikgb2JmZCk7Ci0KLSAgaWYgKGFkZF9zZWN0aW9ucyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX2FkZCAqcGFkZDsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnBzZXQ7Ci0KLSAgICAgIGZvciAocGFkZCA9IGFkZF9zZWN0aW9uczsgcGFkZCAhPSBOVUxMOyBwYWRkID0gcGFkZC0+bmV4dCkKLQl7Ci0JICBwYWRkLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob2JmZCwgcGFkZC0+bmFtZSk7Ci0JICBpZiAocGFkZC0+c2VjdGlvbiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbm9uX2ZhdGFsIChfKCJjYW4ndCBjcmVhdGUgc2VjdGlvbiBgJXMnOiAlcyIpLAotCQkgICAgICAgcGFkZC0+bmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHN0YXR1cyA9IDE7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmbGFnd29yZCBmbGFnczsKLQkgICAgICAKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgcGFkZC0+c2VjdGlvbiwgcGFkZC0+c2l6ZSkpCi0JCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JICAgICAgcHNldCA9IGZpbmRfc2VjdGlvbl9saXN0IChwYWRkLT5uYW1lLCBmYWxzZSk7Ci0JICAgICAgaWYgKHBzZXQgIT0gTlVMTCkKLQkJcHNldC0+dXNlZCA9IHRydWU7Ci0KLQkgICAgICBpZiAocHNldCAhPSBOVUxMICYmIHBzZXQtPnNldF9mbGFncykKLQkJZmxhZ3MgPSBwc2V0LT5mbGFncyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgICAgZWxzZQotCQlmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQTsKLQkgICAgICAKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIHBhZGQtPnNlY3Rpb24sIGZsYWdzKSkKLQkJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBpZiAocHNldCAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHBzZXQtPmNoYW5nZV92bWEgIT0gQ0hBTkdFX0lHTk9SRSkKLQkJICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKG9iZmQsIHBhZGQtPnNlY3Rpb24sIHBzZXQtPnZtYV92YWwpKQotCQkgICAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQkJICAKLQkJICBpZiAocHNldC0+Y2hhbmdlX2xtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQkgICAgewotCQkgICAgICBwYWRkLT5zZWN0aW9uLT5sbWEgPSBwc2V0LT5sbWFfdmFsOwotCQkgICAgICAKLQkJICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudAotCQkJICAob2JmZCwgcGFkZC0+c2VjdGlvbiwKLQkJCSAgIGJmZF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgcGFkZC0+c2VjdGlvbikpKQotCQkJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGdhcF9maWxsX3NldCB8fCBwYWRfdG9fc2V0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICoqc2V0OwotICAgICAgdW5zaWduZWQgaW50IGMsIGk7Ci0KLSAgICAgIC8qIFdlIG11c3QgZmlsbCBpbiBnYXBzIGJldHdlZW4gdGhlIHNlY3Rpb25zIGFuZC9vciB3ZSBtdXN0IHBhZAotCSB0aGUgbGFzdCBzZWN0aW9uIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MuICBXZSBkbyB0aGlzIGJ5Ci0JIGdyYWJiaW5nIGEgbGlzdCBvZiB0aGUgc2VjdGlvbnMsIHNvcnRpbmcgdGhlbSBieSBWTUEsIGFuZAotCSBpbmNyZWFzaW5nIHRoZSBzZWN0aW9uIHNpemVzIGFzIHJlcXVpcmVkIHRvIGZpbGwgdGhlIGdhcHMuCi0JIFdlIHdyaXRlIG91dCB0aGUgZ2FwIGNvbnRlbnRzIGJlbG93LiAgKi8KLQotICAgICAgYyA9IGJmZF9jb3VudF9zZWN0aW9ucyAob2JmZCk7Ci0gICAgICBvc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIHhtYWxsb2MgKGMgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIHNldCA9IG9zZWN0aW9uczsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAob2JmZCwgZ2V0X3NlY3Rpb25zLCAodm9pZCAqKSAmc2V0KTsKLQotICAgICAgcXNvcnQgKG9zZWN0aW9ucywgYywgc2l6ZW9mIChhc2VjdGlvbiAqKSwgY29tcGFyZV9zZWN0aW9uX2xtYSk7Ci0KLSAgICAgIGdhcHMgPSAoYmZkX3NpemVfdHlwZSAqKSB4bWFsbG9jIChjICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0gICAgICBtZW1zZXQgKGdhcHMsIDAsIGMgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLQotICAgICAgaWYgKGdhcF9maWxsX3NldCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYyAtIDE7IGkrKykKLQkgICAgewotCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQkgICAgICBiZmRfdm1hIGdhcF9zdGFydCwgZ2FwX3N0b3A7Ci0KLQkgICAgICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgb3NlY3Rpb25zW2ldKTsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCQkgIHx8IChmbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbaV0pOwotCSAgICAgIGdhcF9zdGFydCA9IGJmZF9zZWN0aW9uX2xtYSAob2JmZCwgb3NlY3Rpb25zW2ldKSArIHNpemU7Ci0JICAgICAgZ2FwX3N0b3AgPSBiZmRfc2VjdGlvbl9sbWEgKG9iZmQsIG9zZWN0aW9uc1tpICsgMV0pOwotCSAgICAgIGlmIChnYXBfc3RhcnQgPCBnYXBfc3RvcCkKLQkJewotCQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbaV0sCi0JCQkJCSAgICAgIHNpemUgKyAoZ2FwX3N0b3AgLSBnYXBfc3RhcnQpKSkKLQkJICAgIHsKLQkJICAgICAgbm9uX2ZhdGFsIChfKCJDYW4ndCBmaWxsIGdhcCBhZnRlciAlczogJXMiKSwKLQkJCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob2JmZCwgb3NlY3Rpb25zW2ldKSwKLQkJCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JCSAgICAgIHN0YXR1cyA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGdhcHNbaV0gPSBnYXBfc3RvcCAtIGdhcF9zdGFydDsKLQkJICBpZiAobWF4X2dhcCA8IGdhcF9zdG9wIC0gZ2FwX3N0YXJ0KQotCQkgICAgbWF4X2dhcCA9IGdhcF9zdG9wIC0gZ2FwX3N0YXJ0OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwYWRfdG9fc2V0KQotCXsKLQkgIGJmZF92bWEgbG1hOwotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0JICBsbWEgPSBiZmRfc2VjdGlvbl9sbWEgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0pOwotCSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0pOwotCSAgaWYgKGxtYSArIHNpemUgPCBwYWRfdG8pCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSwKLQkJCQkJICBwYWRfdG8gLSBsbWEpKQotCQl7Ci0JCSAgbm9uX2ZhdGFsIChfKCJDYW4ndCBhZGQgcGFkZGluZyB0byAlczogJXMiKSwKLQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdKSwKLQkJCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkJICBzdGF0dXMgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZ2Fwc1tjIC0gMV0gPSBwYWRfdG8gLSAobG1hICsgc2l6ZSk7Ci0JCSAgaWYgKG1heF9nYXAgPCBwYWRfdG8gLSAobG1hICsgc2l6ZSkpCi0JCSAgICBtYXhfZ2FwID0gcGFkX3RvIC0gKGxtYSArIHNpemUpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFN5bWJvbCBmaWx0ZXJpbmcgbXVzdCBoYXBwZW4gYWZ0ZXIgdGhlIG91dHB1dCBzZWN0aW9ucyBoYXZlCi0gICAgIGJlZW4gY3JlYXRlZCwgYnV0IGJlZm9yZSB0aGVpciBjb250ZW50cyBhcmUgc2V0LiAgKi8KLSAgZGhhbmRsZSA9IE5VTEw7Ci0gIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoaWJmZCk7Ci0gIGlmIChzeW1zaXplIDwgMCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgCi0gIG9zeW1wcCA9IGlzeW1wcCA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaWJmZCwgaXN5bXBwKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgCi0gIGlmIChjb252ZXJ0X2RlYnVnZ2luZykKLSAgICBkaGFuZGxlID0gcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoaWJmZCwgaXN5bXBwLCBzeW1jb3VudCk7Ci0gIAotICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9ERUJVRyAKLSAgICAgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0gICAgICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0gICAgICB8fCBkaXNjYXJkX2xvY2FscyAhPSBMT0NBTFNfVU5ERUYKLSAgICAgIHx8IHN0cmlwX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwga2VlcF9zcGVjaWZpY19saXN0ICE9IE5VTEwKLSAgICAgIHx8IGxvY2FsaXplX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwgd2Vha2VuX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwgc2VjdGlvbnNfcmVtb3ZlZAotICAgICAgfHwgc2VjdGlvbnNfY29waWVkCi0gICAgICB8fCBjb252ZXJ0X2RlYnVnZ2luZwotICAgICAgfHwgY2hhbmdlX2xlYWRpbmdfY2hhcgotICAgICAgfHwgcmVtb3ZlX2xlYWRpbmdfY2hhcgotICAgICAgfHwgd2Vha2VuKQotICAgIHsKLSAgICAgIC8qIE1hcmsgc3ltYm9scyB1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyBzbyB0aGF0IHRoZXkKLQkgYXJlIGtlcHQsIGV2ZW4gaWYgdGhleSBhcmUgbG9jYWwgbGFiZWxzIG9yIHN0YXRpYyBzeW1ib2xzLgotCSAKLQkgTm90ZSB3ZSBpdGVyYXRlIG92ZXIgdGhlIGlucHV0IHNlY3Rpb25zIGV4YW1pbmluZyB0aGVpcgotCSByZWxvY2F0aW9ucyBzaW5jZSB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMKLQkgaGF2ZW4ndCBiZWVuIHNldCB5ZXQuICBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyB3aWxsCi0JIGlnbm9yZSBpbnB1dCBzZWN0aW9ucyB3aGljaCBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci0JIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfQUxMKQotCWJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwKLQkJCSAgICAgICBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucywKLQkJCSAgICAgICAoUFRSKWlzeW1wcCk7Ci0gICAgICBvc3ltcHAgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoKHN5bWNvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoaWJmZCwgb2JmZCwgb3N5bXBwLCBpc3ltcHAsIHN5bWNvdW50KTsKLSAgICB9Ci0KLSAgaWYgKGNvbnZlcnRfZGVidWdnaW5nICYmIGRoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISB3cml0ZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSwgJnN5bWNvdW50LCAmb3N5bXBwKSkKLQl7Ci0JICBzdGF0dXMgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKG9iZmQsIG9zeW1wcCwgc3ltY291bnQpOwotCi0gIC8qIFRoaXMgaGFzIHRvIGhhcHBlbiBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIHNldC4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwgY29weV9zZWN0aW9uLCAodm9pZCAqKSBvYmZkKTsKLQotICBpZiAoYWRkX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fYWRkICpwYWRkOwotCi0gICAgICBmb3IgKHBhZGQgPSBhZGRfc2VjdGlvbnM7IHBhZGQgIT0gTlVMTDsgcGFkZCA9IHBhZGQtPm5leHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBwYWRkLT5zZWN0aW9uLAotCQkJCQkgIChQVFIpIHBhZGQtPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwKLQkJCQkJICAoYmZkX3NpemVfdHlwZSkgcGFkZC0+c2l6ZSkpCi0JICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGdhcF9maWxsX3NldCB8fCBwYWRfdG9fc2V0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBpbnQgYywgaTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZ2Fwcy4gICovCi0KLSAgICAgIGlmIChtYXhfZ2FwID4gODE5MikKLQltYXhfZ2FwID0gODE5MjsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChtYXhfZ2FwKTsKLSAgICAgIG1lbXNldCAoYnVmLCBnYXBfZmlsbCwgKHNpemVfdCkgbWF4X2dhcCk7Ci0KLSAgICAgIGMgPSBiZmRfY291bnRfc2VjdGlvbnMgKG9iZmQpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQl7Ci0JICBpZiAoZ2Fwc1tpXSAhPSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBsZWZ0OwotCSAgICAgIGZpbGVfcHRyIG9mZjsKLQotCSAgICAgIGxlZnQgPSBnYXBzW2ldOwotCSAgICAgIG9mZiA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tpXSkgLSBsZWZ0OwotCSAgICAgIHdoaWxlIChsZWZ0ID4gMCkKLQkJewotCQkgIGJmZF9zaXplX3R5cGUgbm93OwotCi0JCSAgaWYgKGxlZnQgPiA4MTkyKQotCQkgICAgbm93ID0gODE5MjsKLQkJICBlbHNlCi0JCSAgICBub3cgPSBsZWZ0OwotCi0JCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbnNbaV0sIGJ1ZiwKLQkJCQkJCSAgb2ZmLCBub3cpKQotCQkgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkJICBsZWZ0IC09IG5vdzsKLQkJICBvZmYgKz0gbm93OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBCRkQgYmFja2VuZCB0byBjb3B5IGFueSBwcml2YXRlIGRhdGEgaXQgdW5kZXJzdGFuZHMKLSAgICAgZnJvbSB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELiAgVGhpcyBpcyBkb25lIGxhc3QgdG8KLSAgICAgcGVybWl0IHRoZSByb3V0aW5lIHRvIGxvb2sgYXQgdGhlIGZpbHRlcmVkIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMKLSAgICAgaW1wb3J0YW50IGZvciB0aGUgRUNPRkYgY29kZSBhdCBsZWFzdC4gICovCi0gIGlmICghYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkpCi0gICAgewotICAgICAgbm9uX2ZhdGFsIChfKCIlczogZXJyb3IgY29weWluZyBwcml2YXRlIEJGRCBkYXRhOiAlcyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBzdGF0dXMgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogUmVhZCBlYWNoIGFyY2hpdmUgZWxlbWVudCBpbiB0dXJuIGZyb20gSUJGRCwgY29weSB0aGUKLSAgIGNvbnRlbnRzIHRvIHRlbXAgZmlsZSwgYW5kIGtlZXAgdGhlIHRlbXAgZmlsZSBoYW5kbGUuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9hcmNoaXZlIChpYmZkLCBvYmZkLCBvdXRwdXRfdGFyZ2V0KQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X3RhcmdldDsKLXsKLSAgc3RydWN0IG5hbWVfbGlzdAotICAgIHsKLSAgICAgIHN0cnVjdCBuYW1lX2xpc3QgKm5leHQ7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgYmZkICpvYmZkOwotICAgIH0gKmxpc3QsICpsOwotICBiZmQgKipwdHIgPSAmb2JmZC0+YXJjaGl2ZV9oZWFkOwotICBiZmQgKnRoaXNfZWxlbWVudDsKLSAgY2hhciAqZGlyID0gbWFrZV90ZW1wbmFtZSAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIC8qIE1ha2UgYSB0ZW1wIGRpcmVjdG9yeSB0byBob2xkIHRoZSBjb250ZW50cy4gICovCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotICBpZiAobWtkaXIgKGRpcikgIT0gMCkKLSNlbHNlCi0gIGlmIChta2RpciAoZGlyLCAwNzAwKSAhPSAwKQotI2VuZGlmCi0gICAgewotICAgICAgZmF0YWwgKF8oImNhbm5vdCBta2RpciAlcyBmb3IgYXJjaGl2ZSBjb3B5aW5nIChlcnJvcjogJXMpIiksCi0JICAgICBkaXIsIHN0cmVycm9yIChlcnJubykpOwotICAgIH0KLSAgb2JmZC0+aGFzX2FybWFwID0gaWJmZC0+aGFzX2FybWFwOwotCi0gIGxpc3QgPSBOVUxMOwotCi0gIHRoaXNfZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGliZmQsIE5VTEwpOwotICB3aGlsZSAoIXN0YXR1cyAmJiB0aGlzX2VsZW1lbnQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhbiBvdXRwdXQgZmlsZSBmb3IgdGhpcyBtZW1iZXIuICAqLwotICAgICAgY2hhciAqb3V0cHV0X25hbWUgPSBjb25jYXQgKGRpciwgIi8iLCBiZmRfZ2V0X2ZpbGVuYW1lICh0aGlzX2VsZW1lbnQpLAotCQkJCSAgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBiZmQgKm91dHB1dF9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9uYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGJmZCAqbGFzdF9lbGVtZW50OwotICAgICAgc3RydWN0IHN0YXQgYnVmOwotICAgICAgaW50IHN0YXRfc3RhdHVzID0gMDsKLQotICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQotCXsKLQkgIHN0YXRfc3RhdHVzID0gYmZkX3N0YXRfYXJjaF9lbHQgKHRoaXNfZWxlbWVudCwgJmJ1Zik7Ci0JICBpZiAoc3RhdF9zdGF0dXMgIT0gMCkKLQkgICAgbm9uX2ZhdGFsIChfKCJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIiksCi0JCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lICh0aGlzX2VsZW1lbnQpKTsKLQl9Ci0KLSAgICAgIGwgPSAoc3RydWN0IG5hbWVfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBuYW1lX2xpc3QpKTsKLSAgICAgIGwtPm5hbWUgPSBvdXRwdXRfbmFtZTsKLSAgICAgIGwtPm5leHQgPSBsaXN0OwotICAgICAgbGlzdCA9IGw7Ci0KLSAgICAgIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLQlSRVRVUk5fTk9ORkFUQUwgKG91dHB1dF9uYW1lKTsKLQotICAgICAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHRoaXNfZWxlbWVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKLQljb3B5X29iamVjdCAodGhpc19lbGVtZW50LCBvdXRwdXRfYmZkKTsKLQotICAgICAgaWYgKCFiZmRfY2xvc2UgKG91dHB1dF9iZmQpKQotCXsKLQkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCkpOwotCSAgLyogRXJyb3IgaW4gbmV3IG9iamVjdCBmaWxlLiBEb24ndCBjaGFuZ2UgYXJjaGl2ZS4gKi8KLQkgIHN0YXR1cyA9IDE7Ci0JfQotCi0gICAgICBpZiAocHJlc2VydmVfZGF0ZXMgJiYgc3RhdF9zdGF0dXMgPT0gMCkKLQlzZXRfdGltZXMgKG91dHB1dF9uYW1lLCAmYnVmKTsKLQotICAgICAgLyogT3BlbiB0aGUgbmV3bHkgb3V0cHV0IGZpbGUgYW5kIGF0dGFjaCB0byBvdXIgbGlzdC4gICovCi0gICAgICBvdXRwdXRfYmZkID0gYmZkX29wZW5yIChvdXRwdXRfbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0KLSAgICAgIGwtPm9iZmQgPSBvdXRwdXRfYmZkOwotCi0gICAgICAqcHRyID0gb3V0cHV0X2JmZDsKLSAgICAgIHB0ciA9ICZvdXRwdXRfYmZkLT5uZXh0OwotCi0gICAgICBsYXN0X2VsZW1lbnQgPSB0aGlzX2VsZW1lbnQ7Ci0KLSAgICAgIHRoaXNfZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGliZmQsIGxhc3RfZWxlbWVudCk7Ci0KLSAgICAgIGJmZF9jbG9zZSAobGFzdF9lbGVtZW50KTsKLSAgICB9Ci0gICpwdHIgPSAoYmZkICopIE5VTEw7Ci0KLSAgaWYgKCFiZmRfY2xvc2UgKG9iZmQpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIGlmICghYmZkX2Nsb3NlIChpYmZkKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAvKiBEZWxldGUgYWxsIHRoZSBmaWxlcyB0aGF0IHdlIG9wZW5lZC4gICovCi0gIGZvciAobCA9IGxpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChsLT5vYmZkKTsKLSAgICAgIHVubGluayAobC0+bmFtZSk7Ci0gICAgfQotICBybWRpciAoZGlyKTsKLX0KLQotLyogVGhlIHRvcC1sZXZlbCBjb250cm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KQotICAgICBjb25zdCBjaGFyICppbnB1dF9maWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICppbnB1dF90YXJnZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm91dHB1dF90YXJnZXQ7Ci17Ci0gIGJmZCAqaWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIC8qIFRvIGFsbG93IHVzIHRvIGRvICJzdHJpcCAqIiB3aXRob3V0IGR5aW5nIG9uIHRoZSBmaXJzdAotICAgICBub24tb2JqZWN0IGZpbGUsIGZhaWx1cmVzIGFyZSBub25mYXRhbC4gICovCi0KLSAgaWJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZW5hbWUsIGlucHV0X3RhcmdldCk7Ci0gIGlmIChpYmZkID09IE5VTEwpCi0gICAgUkVUVVJOX05PTkZBVEFMIChpbnB1dF9maWxlbmFtZSk7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGliZmQsIGJmZF9hcmNoaXZlKSkKLSAgICB7Ci0gICAgICBiZmQgKm9iZmQ7Ci0KLSAgICAgIC8qIGJmZF9nZXRfdGFyZ2V0IGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB1bnRpbAotICAgICAgICAgYmZkX2NoZWNrX2Zvcm1hdCBzdWNjZWVkcy4gICovCi0gICAgICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCW91dHB1dF90YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAoaWJmZCk7Ci0KLSAgICAgIG9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAob2JmZCA9PSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9hcmNoaXZlIChpYmZkLCBvYmZkLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoaWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmQgKm9iZmQ7Ci0KLSAgICAgIC8qIGJmZF9nZXRfdGFyZ2V0IGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB1bnRpbAotICAgICAgICAgYmZkX2NoZWNrX2Zvcm1hdCBzdWNjZWVkcy4gICovCi0gICAgICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCW91dHB1dF90YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAoaWJmZCk7Ci0KLSAgICAgIG9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAob2JmZCA9PSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9vYmplY3QgKGliZmQsIG9iZmQpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCi0JUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfZmlsZW5hbWUpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAoaWJmZCkpCi0JUkVUVVJOX05PTkZBVEFMIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgICAKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgCi0gICAgICBzdGF0dXMgPSAxOwotICAgIH0KLX0KLQotLyogQ3JlYXRlIGEgc2VjdGlvbiBpbiBPQkZEIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgYXR0cmlidXRlcwotICAgYXMgSVNFQ1RJT04gaW4gSUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9zZWN0aW9uIChpYmZkLCBpc2VjdGlvbiwgb2JmZGFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgb2JmZGFyZzsKLXsKLSAgYmZkICpvYmZkID0gKGJmZCAqKSBvYmZkYXJnOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBzZWNfcHRyIG9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfdm1hIGxtYTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGNoYXIgKmVycjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0RFQlVHR0lORykgIT0gMAotICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0JICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCi0JICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCi0gICAgcmV0dXJuOwotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pLCBmYWxzZSk7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgcC0+dXNlZCA9IHRydWU7Ci0KLSAgaWYgKHNlY3Rpb25zX3JlbW92ZWQgJiYgcCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKLSAgICByZXR1cm47Ci0gIGlmIChzZWN0aW9uc19jb3BpZWQgJiYgKHAgPT0gTlVMTCB8fCAhIHAtPmNvcHkpKQotICAgIHJldHVybjsKLQotICBvc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChvYmZkLCBiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbikpOwotICAKLSAgaWYgKG9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgZXJyID0gIm1ha2luZyI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAoY29weV9ieXRlID49IDApCi0gICAgc2l6ZSA9IChzaXplICsgaW50ZXJsZWF2ZSAtIDEpIC8gaW50ZXJsZWF2ZTsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uLCBzaXplKSkKLSAgICB7Ci0gICAgICBlcnIgPSAic2l6ZSI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLSAgCi0gIHZtYSA9IGJmZF9zZWN0aW9uX3ZtYSAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocCAhPSBOVUxMICYmIHAtPmNoYW5nZV92bWEgPT0gQ0hBTkdFX01PRElGWSkKLSAgICB2bWEgKz0gcC0+dm1hX3ZhbDsKLSAgZWxzZSBpZiAocCAhPSBOVUxMICYmIHAtPmNoYW5nZV92bWEgPT0gQ0hBTkdFX1NFVCkKLSAgICB2bWEgPSBwLT52bWFfdmFsOwotICBlbHNlCi0gICAgdm1hICs9IGNoYW5nZV9zZWN0aW9uX2FkZHJlc3M7Ci0gIAotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChvYmZkLCBvc2VjdGlvbiwgdm1hKSkKLSAgICB7Ci0gICAgICBlcnIgPSAidm1hIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIGxtYSA9IGlzZWN0aW9uLT5sbWE7Ci0gIGlmICgocCAhPSBOVUxMKSAmJiBwLT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCi0gICAgewotICAgICAgaWYgKHAtPmNoYW5nZV9sbWEgPT0gQ0hBTkdFX01PRElGWSkKLQlsbWEgKz0gcC0+bG1hX3ZhbDsKLSAgICAgIGVsc2UgaWYgKHAtPmNoYW5nZV9sbWEgPT0gQ0hBTkdFX1NFVCkKLQlsbWEgPSBwLT5sbWFfdmFsOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLSAgZWxzZQotICAgIGxtYSArPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOwotICAKLSAgb3NlY3Rpb24tPmxtYSA9IGxtYTsKLQotICAvKiBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBub3QgZW5vdWdoLiAgSWYgd2UgY2hhbmdlIHRoZSBMTUEgd2UKLSAgICAgbWF5IGhhdmUgdG8gcmVjb21wdXRlIHRoZSBoZWFkZXIgZm9yIHRoZSBmaWxlIGFzIHdlbGwuICAqLwotICBpZiAoYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwKLQkJCQkgb3NlY3Rpb24sCi0JCQkJIGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaWJmZCwgaXNlY3Rpb24pKQotICAgICAgPT0gZmFsc2UpCi0gICAgewotICAgICAgZXJyID0gImFsaWdubWVudCI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocCAhPSBOVUxMICYmIHAtPnNldF9mbGFncykKLSAgICBmbGFncyA9IHAtPmZsYWdzIHwgKGZsYWdzICYgU0VDX0hBU19DT05URU5UUyk7Ci0gIGlmICghYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBvc2VjdGlvbiwgZmxhZ3MpKQotICAgIHsKLSAgICAgIGVyciA9ICJmbGFncyI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICAvKiBUaGlzIHVzZWQgdG8gYmUgbWFuZ2xlX3NlY3Rpb247IHdlIGRvIGhlcmUgdG8gYXZvaWQgdXNpbmcKLSAgICAgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgc2luY2Ugc29tZSBmb3JtYXRzIGFsbG93IG11bHRpcGxlCi0gICAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZS4gICovCi0gIGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IG9zZWN0aW9uOwotICBpc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IDA7Ci0KLSAgLyogQWxsb3cgdGhlIEJGRCBiYWNrZW5kIHRvIGNvcHkgYW55IHByaXZhdGUgZGF0YSBpdCB1bmRlcnN0YW5kcwotICAgICBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGlmICghYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikpCi0gICAgewotICAgICAgZXJyID0gInByaXZhdGUgZGF0YSI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICAvKiBBbGwgd2VudCB3ZWxsICovCi0gIHJldHVybjsKLQotbG9zZXI6Ci0gIG5vbl9mYXRhbCAoXygiJXM6IHNlY3Rpb24gYCVzJzogZXJyb3IgaW4gJXM6ICVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgICAgIGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSwKLQkgICAgIGVyciwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICBzdGF0dXMgPSAxOwotfQotCi0vKiBDb3B5IHRoZSBkYXRhIG9mIGlucHV0IHNlY3Rpb24gSVNFQ1RJT04gb2YgSUJGRAotICAgdG8gYW4gb3V0cHV0IHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGluIE9CRkQuCi0gICBJZiBzdHJpcHBpbmcgdGhlbiBkb24ndCBjb3B5IGFueSByZWxvY2F0aW9uIGluZm8uICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9zZWN0aW9uIChpYmZkLCBpc2VjdGlvbiwgb2JmZGFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgb2JmZGFyZzsKLXsKLSAgYmZkICpvYmZkID0gKGJmZCAqKSBvYmZkYXJnOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIHNlY19wdHIgb3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgbG9uZyByZWxzaXplOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQgZWFybGllciBvbiwgZG8gbm90IGtlZXAgb24gZ2VuZXJhdGluZwotICAgICBjb21wbGFpbnRzIG5vdy4gICovCi0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICByZXR1cm47Ci0gIAotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0RFQlVHR0lORykgIT0gMAotICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0JICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCi0JICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSwgZmFsc2UpOwotCi0gIGlmIChzZWN0aW9uc19yZW1vdmVkICYmIHAgIT0gTlVMTCAmJiBwLT5yZW1vdmUpCi0gICAgcmV0dXJuOwotICBpZiAoc2VjdGlvbnNfY29waWVkICYmIChwID09IE5VTEwgfHwgISBwLT5jb3B5KSkKLSAgICByZXR1cm47Ci0KLSAgb3NlY3Rpb24gPSBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGlzZWN0aW9uKTsKLQotICBpZiAoc2l6ZSA9PSAwIHx8IG9zZWN0aW9uID09IDApCi0gICAgcmV0dXJuOwotCi0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGliZmQsIGlzZWN0aW9uKTsKLSAgaWYgKHJlbHNpemUgPCAwKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAKLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICBiZmRfc2V0X3JlbG9jIChvYmZkLCBvc2VjdGlvbiwgKGFyZWxlbnQgKiopIE5VTEwsIDApOwotICBlbHNlCi0gICAgewotICAgICAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGliZmQsIGlzZWN0aW9uLCByZWxwcCwgaXN5bXBwKTsKLSAgICAgIGlmIChyZWxjb3VudCA8IDApCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICAKLSAgICAgIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTCkKLQl7Ci0JICAvKiBSZW1vdmUgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIG5vdCBpbgotCSAgICAga2VlcF9zdHJpcF9zcGVjaWZpY19saXN0LiAqLwotCSAgYXJlbGVudCAqKnRlbXBfcmVscHA7Ci0JICBsb25nIHRlbXBfcmVsY291bnQgPSAwOwotCSAgbG9uZyBpOwotCSAgCi0JICB0ZW1wX3JlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotCSAgZm9yIChpID0gMDsgaSA8IHJlbGNvdW50OyBpKyspCi0JICAgIGlmIChpc19zcGVjaWZpZWRfc3ltYm9sCi0JCShiZmRfYXN5bWJvbF9uYW1lICgqcmVscHAgW2ldLT5zeW1fcHRyX3B0ciksCi0JCSBrZWVwX3NwZWNpZmljX2xpc3QpKQotCSAgICAgIHRlbXBfcmVscHAgW3RlbXBfcmVsY291bnQrK10gPSByZWxwcCBbaV07Ci0JICByZWxjb3VudCA9IHRlbXBfcmVsY291bnQ7Ci0JICBmcmVlIChyZWxwcCk7Ci0JICByZWxwcCA9IHRlbXBfcmVscHA7Ci0JfQotICAgICAgYmZkX3NldF9yZWxvYyAob2JmZCwgb3NlY3Rpb24sCi0JCSAgICAgKHJlbGNvdW50ID09IDAgPyAoYXJlbGVudCAqKikgTlVMTCA6IHJlbHBwKSwgcmVsY291bnQpOwotICAgIH0KLSAgCi0gIGlzZWN0aW9uLT5fY29va2VkX3NpemUgPSBpc2VjdGlvbi0+X3Jhd19zaXplOwotICBpc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykKLSAgICB7Ci0gICAgICBQVFIgbWVtaHVuayA9IChQVFIpIHhtYWxsb2MgKCh1bnNpZ25lZCkgc2l6ZSk7Ci0KLSAgICAgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpYmZkLCBpc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgc2l6ZSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgICAgIGlmIChjb3B5X2J5dGUgPj0gMCkgCi0JZmlsdGVyX2J5dGVzIChtZW1odW5rLCAmc2l6ZSk7Ci0KLSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgc2l6ZSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgICAgIGZyZWUgKG1lbWh1bmspOwotICAgIH0KLSAgZWxzZSBpZiAocCAhPSBOVUxMICYmIHAtPnNldF9mbGFncyAmJiAocC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotICAgIHsKLSAgICAgIFBUUiBtZW1odW5rID0gKFBUUikgeG1hbGxvYyAoKHVuc2lnbmVkKSBzaXplKTsKLQotICAgICAgLyogV2UgZG9uJ3QgcGVybWl0IHRoZSB1c2VyIHRvIHR1cm4gb2ZmIHRoZSBTRUNfSEFTX0NPTlRFTlRTCi0JIGZsYWctLXRoZXkgY2FuIGp1c3QgcmVtb3ZlIHRoZSBzZWN0aW9uIGVudGlyZWx5IGFuZCBhZGQgaXQKLQkgYmFjayBhZ2Fpbi4gIEhvd2V2ZXIsIHdlIGRvIHBlcm1pdCB0aGVtIHRvIHR1cm4gb24gdGhlCi0JIFNFQ19IQVNfQ09OVEVOVFMgZmxhZywgYW5kIHRha2UgaXQgdG8gbWVhbiB0aGF0IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzIHNob3VsZCBiZSB6ZXJvZWQgb3V0LiAgKi8KLQotICAgICAgbWVtc2V0IChtZW1odW5rLCAwLCBzaXplKTsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgb3NlY3Rpb24sIG1lbWh1bmssIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBzaXplKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgICAgIGZyZWUgKG1lbWh1bmspOwotICAgIH0KLX0KLQotLyogR2V0IGFsbCB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHVzZWQgd2hlbiAtLWdhcC1maWxsIG9yIC0tcGFkLXRvIGlzCi0gICB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9zZWN0aW9ucyAob2JmZCwgb3NlY3Rpb24sIHNlY3BwcGFyZykKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlY3Rpb247Ci0gICAgIFBUUiBzZWNwcHBhcmc7Ci17Ci0gIGFzZWN0aW9uICoqKnNlY3BwcCA9IChhc2VjdGlvbiAqKiopIHNlY3BwcGFyZzsKLQotICAqKnNlY3BwcCA9IG9zZWN0aW9uOwotICArKygqc2VjcHBwKTsKLX0KLQotLyogU29ydCBzZWN0aW9ucyBieSBWTUEuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQsIGFuZCBpcyB1c2VkIHdoZW4KLSAgIC0tZ2FwLWZpbGwgb3IgLS1wYWQtdG8gaXMgdXNlZC4gIFdlIGZvcmNlIG5vbiBsb2FkYWJsZSBvciBlbXB0eQotICAgc2VjdGlvbnMgdG8gdGhlIGZyb250LCB3aGVyZSB0aGV5IGFyZSBlYXNpZXIgdG8gaWdub3JlLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zZWN0aW9uX2xtYSAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotewotICBjb25zdCBhc2VjdGlvbiAqKnNlYzEgPSAoY29uc3QgYXNlY3Rpb24gKiopIGFyZzE7Ci0gIGNvbnN0IGFzZWN0aW9uICoqc2VjMiA9IChjb25zdCBhc2VjdGlvbiAqKikgYXJnMjsKLSAgZmxhZ3dvcmQgZmxhZ3MxLCBmbGFnczI7Ci0KLSAgLyogU29ydCBub24gbG9hZGFibGUgc2VjdGlvbnMgdG8gdGhlIGZyb250LiAgKi8KLSAgZmxhZ3MxID0gKCpzZWMxKS0+ZmxhZ3M7Ci0gIGZsYWdzMiA9ICgqc2VjMiktPmZsYWdzOwotICBpZiAoKGZsYWdzMSAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLSAgICAgIHx8IChmbGFnczEgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzMiAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKLQkgICYmIChmbGFnczIgJiBTRUNfTE9BRCkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChmbGFnczIgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICB8fCAoZmxhZ3MyICYgU0VDX0xPQUQpID09IDApCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFNvcnQgc2VjdGlvbnMgYnkgTE1BLiAgKi8KLSAgaWYgKCgqc2VjMSktPmxtYSA+ICgqc2VjMiktPmxtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoKCpzZWMxKS0+bG1hIDwgKCpzZWMyKS0+bG1hKQotICAgIHJldHVybiAtMTsKLQotICAvKiBTb3J0IHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgTE1BIGJ5IHNpemUuICAqLwotICBpZiAoKCpzZWMxKS0+X3Jhd19zaXplID4gKCpzZWMyKS0+X3Jhd19zaXplKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmICgoKnNlYzEpLT5fcmF3X3NpemUgPCAoKnNlYzIpLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBNYXJrIGFsbCB0aGUgc3ltYm9scyB3aGljaCB3aWxsIGJlIHVzZWQgaW4gb3V0cHV0IHJlbG9jYXRpb25zIHdpdGgKLSAgIHRoZSBCU0ZfS0VFUCBmbGFnIHNvIHRoYXQgdGhvc2Ugc3ltYm9scyB3aWxsIG5vdCBiZSBzdHJpcHBlZC4KLQotICAgSWdub3JlIHJlbG9jYXRpb25zIHdoaWNoIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMgKGliZmQsIGlzZWN0aW9uLCBzeW1ib2xzYXJnKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIHNlY19wdHIgaXNlY3Rpb247Ci0gICAgIFBUUiBzeW1ib2xzYXJnOwotewotICBhc3ltYm9sICoqc3ltYm9scyA9IChhc3ltYm9sICoqKSBzeW1ib2xzYXJnOwotICBsb25nIHJlbHNpemU7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudCwgaTsKLQotICAvKiBJZ25vcmUgYW4gaW5wdXQgc2VjdGlvbiB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHNlY3Rpb24uICAqLwotICBpZiAoaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpYmZkLCBpc2VjdGlvbiwgcmVscHAsIHN5bWJvbHMpOwotICBpZiAocmVsY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIC8qIEV4YW1pbmUgZWFjaCBzeW1ib2wgdXNlZCBpbiBhIHJlbG9jYXRpb24uICBJZiBpdCdzIG5vdCBvbmUgb2YgdGhlCi0gICAgIHNwZWNpYWwgYmZkIHNlY3Rpb24gc3ltYm9scywgdGhlbiBtYXJrIGl0IHdpdGggQlNGX0tFRVAuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgcmVsY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciAhPSBiZmRfY29tX3NlY3Rpb25fcHRyLT5zeW1ib2wKLQkgICYmICpyZWxwcFtpXS0+c3ltX3B0cl9wdHIgIT0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sCi0JICAmJiAqcmVscHBbaV0tPnN5bV9wdHJfcHRyICE9IGJmZF91bmRfc2VjdGlvbl9wdHItPnN5bWJvbCkKLQkoKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciktPmZsYWdzIHw9IEJTRl9LRUVQOwotICAgIH0KLQotICBpZiAocmVscHAgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxwcCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotd3JpdGVfZGVidWdnaW5nX2luZm8gKG9iZmQsIGRoYW5kbGUsIHN5bWNvdW50cCwgc3ltcHBwKQotICAgICBiZmQgKm9iZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBsb25nICpzeW1jb3VudHA7Ci0gICAgIGFzeW1ib2wgKioqc3ltcHBwOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2llZWVfZmxhdm91cikKLSAgICByZXR1cm4gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSk7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqc3ltcywgKnN0cmluZ3M7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bXNpemUsIHN0cmluZ3NpemU7Ci0gICAgICBhc2VjdGlvbiAqc3RhYnNlYywgKnN0YWJzdHJzZWM7Ci0KLSAgICAgIGlmICghIHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlLCAmc3ltcywKLQkJCQkJCSAgICAmc3ltc2l6ZSwgJnN0cmluZ3MsCi0JCQkJCQkgICAgJnN0cmluZ3NpemUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3RhYnNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsICIuc3RhYiIpOwotICAgICAgc3RhYnN0cnNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsICIuc3RhYnN0ciIpOwotICAgICAgaWYgKHN0YWJzZWMgPT0gTlVMTAotCSAgfHwgc3RhYnN0cnNlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBzdGFic2VjLCBzeW1zaXplKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgc3RhYnN0cnNlYywgc3RyaW5nc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgc3RhYnNlYywgMikKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgc3RhYnN0cnNlYywgMCkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBzdGFic2VjLAotCQkJCSAgIChTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJICAgIHwgU0VDX0RFQlVHR0lORykpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgc3RhYnN0cnNlYywKLQkJCQkgICAgICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgICB8IFNFQ19ERUJVR0dJTkcpKSkKLQl7Ci0JICBub25fZmF0YWwgKF8oIiVzOiBjYW4ndCBjcmVhdGUgZGVidWdnaW5nIHNlY3Rpb246ICVzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgY2FuIGdldCBhd2F5IHdpdGggc2V0dGluZyB0aGUgc2VjdGlvbiBjb250ZW50cyBub3cgYmVjYXVzZQotICAgICAgICAgdGhlIG5leHQgdGhpbmcgdGhlIGNhbGxlciBpcyBnb2luZyB0byBkbyBpcyBjb3B5IG92ZXIgdGhlCi0gICAgICAgICByZWFsIHNlY3Rpb25zLiAgV2UgbWF5IHNvbWVkYXkgaGF2ZSB0byBzcGxpdCB0aGUgY29udGVudHMKLSAgICAgICAgIHNldHRpbmcgb3V0IG9mIHRoaXMgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBzdGFic2VjLCBzeW1zLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgc3ltc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBzdGFic3Ryc2VjLCBzdHJpbmdzLAotCQkJCQkgKGZpbGVfcHRyKSAwLCBzdHJpbmdzaXplKSkKLQl7Ci0JICBub25fZmF0YWwgKF8oIiVzOiBjYW4ndCBzZXQgZGVidWdnaW5nIHNlY3Rpb24gY29udGVudHM6ICVzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG5vbl9mYXRhbCAoXygiJXM6IGRvbid0IGtub3cgaG93IHRvIHdyaXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgJXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob2JmZCkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXN0cmlwX21haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0gIGNoYXIgKmlucHV0X3RhcmdldCA9IE5VTEwsICpvdXRwdXRfdGFyZ2V0ID0gTlVMTDsKLSAgYm9vbGVhbiBzaG93X3ZlcnNpb24gPSBmYWxzZTsKLSAgaW50IGMsIGk7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIGNoYXIgKm91dHB1dF9maWxlID0gTlVMTDsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIkk6TzpGOks6TjpSOm86c1NwZ3hYVnYiLAotCQkJICAgc3RyaXBfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnSSc6Ci0JICBpbnB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIGlucHV0X3RhcmdldCA9IG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAob3B0YXJnLCB0cnVlKTsKLQkgIHAtPnJlbW92ZSA9IHRydWU7Ci0JICBzZWN0aW9uc19yZW1vdmVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0FMTDsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCWNhc2UgJ2cnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0RFQlVHOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RSSVBfVU5ORUVERUQ6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfVU5ORUVERUQ7Ci0JICBicmVhazsKLQljYXNlICdLJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmtlZXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJnN0cmlwX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBvdXRwdXRfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgcHJlc2VydmVfZGF0ZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19BTEw7Ci0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX1NUQVJUX0w7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KLQljYXNlICdoJzoKLQkgIHN0cmlwX3VzYWdlIChzdGRvdXQsIDApOwotCWRlZmF1bHQ6Ci0JICBzdHJpcF91c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoInN0cmlwIik7Ci0KLSAgLyogRGVmYXVsdCBpcyB0byBzdHJpcCBhbGwgc3ltYm9scy4gICovCi0gIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOREVGCi0gICAgICAmJiBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfVU5ERUYKLSAgICAgICYmIHN0cmlwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCkKLSAgICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOwotCi0gIGlmIChvdXRwdXRfdGFyZ2V0ID09IChjaGFyICopIE5VTEwpCi0gICAgb3V0cHV0X3RhcmdldCA9IGlucHV0X3RhcmdldDsKLQotICBpID0gb3B0aW5kOwotICBpZiAoaSA9PSBhcmdjCi0gICAgICB8fCAob3V0cHV0X2ZpbGUgIT0gTlVMTCAmJiAoaSArIDEpIDwgYXJnYykpCi0gICAgc3RyaXBfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgZm9yICg7IGkgPCBhcmdjOyBpKyspCi0gICAgewotICAgICAgaW50IGhvbGRfc3RhdHVzID0gc3RhdHVzOwotICAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICAgIGNoYXIgKnRtcG5hbWU7Ci0KLSAgICAgIGlmIChwcmVzZXJ2ZV9kYXRlcykKLQl7Ci0JICBpZiAoc3RhdCAoYXJndltpXSwgJnN0YXRidWYpIDwgMCkKLQkgICAgewotCSAgICAgIG5vbl9mYXRhbCAoXygiJXM6IGNhbm5vdCBzdGF0OiAlcyIpLCBhcmd2W2ldLCBzdHJlcnJvciAoZXJybm8pKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKG91dHB1dF9maWxlICE9IE5VTEwpCi0JdG1wbmFtZSA9IG91dHB1dF9maWxlOwotICAgICAgZWxzZQotCXRtcG5hbWUgPSBtYWtlX3RlbXBuYW1lIChhcmd2W2ldKTsKLSAgICAgIHN0YXR1cyA9IDA7Ci0KLSAgICAgIGNvcHlfZmlsZSAoYXJndltpXSwgdG1wbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQl7Ci0JICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JICAgIHNldF90aW1lcyAodG1wbmFtZSwgJnN0YXRidWYpOwotCSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0JICAgIHNtYXJ0X3JlbmFtZSAodG1wbmFtZSwgYXJndltpXSwgcHJlc2VydmVfZGF0ZXMpOwotCSAgc3RhdHVzID0gaG9sZF9zdGF0dXM7Ci0JfQotICAgICAgZWxzZQotCXVubGluayAodG1wbmFtZSk7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKLQlmcmVlICh0bXBuYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgY2hhciAqaW5wdXRfZmlsZW5hbWUgPSBOVUxMLCAqb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgY2hhciAqaW5wdXRfdGFyZ2V0ID0gTlVMTCwgKm91dHB1dF90YXJnZXQgPSBOVUxMOwotICBib29sZWFuIHNob3dfdmVyc2lvbiA9IGZhbHNlOwotICBib29sZWFuIGNoYW5nZV93YXJuID0gdHJ1ZTsKLSAgaW50IGM7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOmk6STpqOks6TjpzOk86ZDpGOkw6UjpTcGd4WFZ2VzoiLAotCQkJICAgY29weV9vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdiJzoKLQkgIGNvcHlfYnl0ZSA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAoY29weV9ieXRlIDwgMCkKLQkgICAgZmF0YWwgKF8oImJ5dGUgbnVtYmVyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIikpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBpbnRlcmxlYXZlID0gYXRvaSAob3B0YXJnKTsKLQkgIGlmIChpbnRlcmxlYXZlIDwgMSkKLQkgICAgZmF0YWwgKF8oImludGVybGVhdmUgbXVzdCBiZSBwb3NpdGl2ZSIpKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCWNhc2UgJ3MnOgkJLyogInNvdXJjZSIgLSAnSScgaXMgcHJlZmVycmVkICovCi0JICBpbnB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQljYXNlICdkJzoJCS8qICJkZXN0aW5hdGlvbiIgLSAnTycgaXMgcHJlZmVycmVkICovCi0JICBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JICBpbnB1dF90YXJnZXQgPSBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG9wdGFyZywgdHJ1ZSk7Ci0JICBpZiAocC0+cmVtb3ZlKQotCSAgICBmYXRhbCAoXygiJXMgYm90aCBjb3BpZWQgYW5kIHJlbW92ZWQiKSwgb3B0YXJnKTsKLQkgIHAtPmNvcHkgPSB0cnVlOwotCSAgc2VjdGlvbnNfY29waWVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChvcHRhcmcsIHRydWUpOwotCSAgaWYgKHAtPmNvcHkpCi0JICAgIGZhdGFsIChfKCIlcyBib3RoIGNvcGllZCBhbmQgcmVtb3ZlZCIpLCBvcHRhcmcpOwotCSAgcC0+cmVtb3ZlID0gdHJ1ZTsKLQkgIHNlY3Rpb25zX3JlbW92ZWQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfREVCVUc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVFJJUF9VTk5FRURFRDoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTk5FRURFRDsKLQkgIGJyZWFrOwotCWNhc2UgJ0snOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAma2VlcF9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAmc3RyaXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmxvY2FsaXplX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnVyc6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZ3ZWFrZW5fc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIHByZXNlcnZlX2RhdGVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19TVEFSVF9MOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dFQUtFTjoKLQkgIHdlYWtlbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9BRERfU0VDVElPTjoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgc3RydWN0IHN0YXQgc3Q7Ci0JICAgIHN0cnVjdCBzZWN0aW9uX2FkZCAqcGE7Ci0JICAgIGludCBsZW47Ci0JICAgIGNoYXIgKm5hbWU7Ci0JICAgIEZJTEUgKmY7Ci0KLQkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOwotCSAgICAKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgLS1hZGQtc2VjdGlvbiBOQU1FPUZJTEVOQU1FIikpOwotCi0JICAgIGlmIChzdGF0IChzICsgMSwgJiBzdCkgPCAwKQotCSAgICAgIGZhdGFsIChfKCJjYW5ub3Qgc3RhdDogJXM6ICVzIiksIHMgKyAxLCBzdHJlcnJvciAoZXJybm8pKTsKLQotCSAgICBwYSA9IChzdHJ1Y3Qgc2VjdGlvbl9hZGQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9hZGQpKTsKLQotCSAgICBsZW4gPSBzIC0gb3B0YXJnOwotCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0JICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKLQkgICAgbmFtZVtsZW5dID0gJ1wwJzsKLQkgICAgcGEtPm5hbWUgPSBuYW1lOwotCi0JICAgIHBhLT5maWxlbmFtZSA9IHMgKyAxOwotCi0JICAgIHBhLT5zaXplID0gc3Quc3Rfc2l6ZTsKLQotCSAgICBwYS0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAocGEtPnNpemUpOwotCSAgICBmID0gZm9wZW4gKHBhLT5maWxlbmFtZSwgRk9QRU5fUkIpOwotCSAgICAKLQkgICAgaWYgKGYgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiY2Fubm90IG9wZW46ICVzOiAlcyIpLCBwYS0+ZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCSAgICAKLQkgICAgaWYgKGZyZWFkIChwYS0+Y29udGVudHMsIDEsIHBhLT5zaXplLCBmKSA9PSAwCi0JCXx8IGZlcnJvciAoZikpCi0JICAgICAgZmF0YWwgKF8oIiVzOiBmcmVhZCBmYWlsZWQiKSwgcGEtPmZpbGVuYW1lKTsKLQotCSAgICBmY2xvc2UgKGYpOwotCi0JICAgIHBhLT5uZXh0ID0gYWRkX3NlY3Rpb25zOwotCSAgICBhZGRfc2VjdGlvbnMgPSBwYTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9TVEFSVDoKLQkgIGNoYW5nZV9zdGFydCA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1jaGFuZ2Utc3RhcnQiKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BOgotCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQToKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgaW50IGxlbjsKLQkgICAgY2hhciAqbmFtZTsKLQkgICAgY2hhciAqb3B0aW9uOwotCSAgICBiZmRfdm1hIHZhbDsKLQkgICAgZW51bSBjaGFuZ2VfYWN0aW9uIHdoYXQ7Ci0JICAgIAotCSAgICBzd2l0Y2ggKGMpCi0JICAgICAgewotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6IG9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MiOyBicmVhazsKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUE6IG9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLWxtYSI7IGJyZWFrOwotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQTogb3B0aW9uID0gIi0tY2hhbmdlLXNlY3Rpb24tdm1hIjsgYnJlYWs7Ci0JICAgICAgfQotCSAgICAKLQkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOwotCSAgICBpZiAocyA9PSBOVUxMKQotCSAgICAgIHsKLQkJcyA9IHN0cmNociAob3B0YXJnLCAnKycpOwotCQlpZiAocyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJy0nKTsKLQkJICAgIGlmIChzID09IE5VTEwpCi0JCSAgICAgIGZhdGFsIChfKCJiYWQgZm9ybWF0IGZvciAlcyIpLCBvcHRpb24pOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgbGVuID0gcyAtIG9wdGFyZzsKLQkgICAgbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotCSAgICBzdHJuY3B5IChuYW1lLCBvcHRhcmcsIGxlbik7Ci0JICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0KLQkgICAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChuYW1lLCB0cnVlKTsKLQotCSAgICB2YWwgPSBwYXJzZV92bWEgKHMgKyAxLCBvcHRpb24pOwotCi0JICAgIHN3aXRjaCAoKnMpCi0JICAgICAgewotCSAgICAgIGNhc2UgJz0nOiB3aGF0ID0gQ0hBTkdFX1NFVDsgYnJlYWs7Ci0JICAgICAgY2FzZSAnLSc6IHZhbCAgPSAtIHZhbDsgLyogRHJvcCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICcrJzogd2hhdCA9IENIQU5HRV9NT0RJRlk7IGJyZWFrOwotCSAgICAgIH0KLQkgICAgCi0JICAgIHN3aXRjaCAoYykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUzoKLQkJcC0+Y2hhbmdlX3ZtYSA9IHdoYXQ7Ci0JCXAtPnZtYV92YWwgICAgPSB2YWw7Ci0JCS8qIERyb3AgdGhyb3VnaC4gICovCi0JCQotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQToKLQkJcC0+Y2hhbmdlX2xtYSA9IHdoYXQ7Ci0JCXAtPmxtYV92YWwgICAgPSB2YWw7Ci0JCWJyZWFrOwotCQkKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUE6Ci0JCXAtPmNoYW5nZV92bWEgPSB3aGF0OwotCQlwLT52bWFfdmFsICAgID0gdmFsOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTOgotCSAgY2hhbmdlX3NlY3Rpb25fYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1jaGFuZ2UtYWRkcmVzc2VzIik7Ci0JICBjaGFuZ2Vfc3RhcnQgPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTOgotCSAgY2hhbmdlX3dhcm4gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUjoKLQkgIGNoYW5nZV9sZWFkaW5nX2NoYXIgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVCVUdHSU5HOgotCSAgY29udmVydF9kZWJ1Z2dpbmcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fR0FQX0ZJTEw6Ci0JICB7Ci0JICAgIGJmZF92bWEgZ2FwX2ZpbGxfdm1hOwotCi0JICAgIGdhcF9maWxsX3ZtYSA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1nYXAtZmlsbCIpOwotCSAgICBnYXBfZmlsbCA9IChiZmRfYnl0ZSkgZ2FwX2ZpbGxfdm1hOwotCSAgICBpZiAoKGJmZF92bWEpIGdhcF9maWxsICE9IGdhcF9maWxsX3ZtYSkKLQkgICAgICB7Ci0JCWNoYXIgYnVmZlsyMF07Ci0JCQotCQlzcHJpbnRmX3ZtYSAoYnVmZiwgZ2FwX2ZpbGxfdm1hKTsKLQkJCi0JCW5vbl9mYXRhbCAoXygiV2FybmluZzogdHJ1bmNhdGluZyBnYXAtZmlsbCBmcm9tIDB4JXMgdG8gMHgleCIpLAotCQkJICAgYnVmZiwgZ2FwX2ZpbGwpOwotCSAgICAgIH0KLQkgICAgZ2FwX2ZpbGxfc2V0ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HUzoKLQkgIGNoYW5nZV93YXJuID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9QQURfVE86Ci0JICBwYWRfdG8gPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tcGFkLXRvIik7Ci0JICBwYWRfdG9fc2V0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVI6Ci0JICByZW1vdmVfbGVhZGluZ19jaGFyID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTOgotCSAgewotCSAgICBjb25zdCBjaGFyICpzOwotCSAgICBpbnQgbGVuOwotCSAgICBjaGFyICpuYW1lOwotCi0JICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJz0nKTsKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgLS1zZXQtc2VjdGlvbi1mbGFncyIpKTsKLQotCSAgICBsZW4gPSBzIC0gb3B0YXJnOwotCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0JICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKLQkgICAgbmFtZVtsZW5dID0gJ1wwJzsKLQotCSAgICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG5hbWUsIHRydWUpOwotCi0JICAgIHAtPnNldF9mbGFncyA9IHRydWU7Ci0JICAgIHAtPmZsYWdzID0gcGFyc2VfZmxhZ3MgKHMgKyAxKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NFVF9TVEFSVDoKLQkgIHNldF9zdGFydCA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zZXQtc3RhcnQiKTsKLQkgIHNldF9zdGFydF9zZXQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KLQljYXNlICdoJzoKLQkgIGNvcHlfdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JZGVmYXVsdDoKLQkgIGNvcHlfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJvYmpjb3B5Iik7Ci0KLSAgaWYgKGNvcHlfYnl0ZSA+PSBpbnRlcmxlYXZlKQotICAgIGZhdGFsIChfKCJieXRlIG51bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcmxlYXZlIikpOwotCi0gIGlmIChvcHRpbmQgPT0gYXJnYyB8fCBvcHRpbmQgKyAyIDwgYXJnYykKLSAgICBjb3B5X3VzYWdlIChzdGRlcnIsIDEpOwotCi0gIGlucHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICBpZiAob3B0aW5kICsgMSA8IGFyZ2MpCi0gICAgb3V0cHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmQgKyAxXTsKLQotICAvKiBEZWZhdWx0IGlzIHRvIHN0cmlwIG5vIHN5bWJvbHMuICAqLwotICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTkRFRiAmJiBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfVU5ERUYpCi0gICAgc3RyaXBfc3ltYm9scyA9IFNUUklQX05PTkU7Ci0KLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKLSAgICBvdXRwdXRfdGFyZ2V0ID0gaW5wdXRfdGFyZ2V0OwotCi0gIGlmIChwcmVzZXJ2ZV9kYXRlcykKLSAgICB7Ci0gICAgICBpZiAoc3RhdCAoaW5wdXRfZmlsZW5hbWUsICZzdGF0YnVmKSA8IDApCi0JZmF0YWwgKF8oIkNhbm5vdCBzdGF0OiAlczogJXMiKSwgaW5wdXRfZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbiBmaWxlIHRoZW4gY3JlYXRlIGEgdGVtcCBhbmQgcmVuYW1lCi0gICAgIHRoZSByZXN1bHQgaW50byB0aGUgaW5wdXQuICAqLwotCi0gIGlmIChvdXRwdXRfZmlsZW5hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICp0bXBuYW1lID0gbWFrZV90ZW1wbmFtZSAoaW5wdXRfZmlsZW5hbWUpOwotCi0gICAgICBjb3B5X2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCB0bXBuYW1lLCBpbnB1dF90YXJnZXQsIG91dHB1dF90YXJnZXQpOwotICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCXsJCi0JICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JICAgIHNldF90aW1lcyAodG1wbmFtZSwgJnN0YXRidWYpOwotCSAgc21hcnRfcmVuYW1lICh0bXBuYW1lLCBpbnB1dF9maWxlbmFtZSwgcHJlc2VydmVfZGF0ZXMpOwotCX0KLSAgICAgIGVsc2UKLQl1bmxpbmsgKHRtcG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCAmJiBwcmVzZXJ2ZV9kYXRlcykKLQlzZXRfdGltZXMgKG91dHB1dF9maWxlbmFtZSwgJnN0YXRidWYpOwotICAgIH0KLQotICBpZiAoY2hhbmdlX3dhcm4pCi0gICAgewotICAgICAgZm9yIChwID0gY2hhbmdlX3NlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmICghIHAtPnVzZWQpCi0JICAgIHsKLQkgICAgICBpZiAocC0+Y2hhbmdlX3ZtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQl7Ci0JCSAgY2hhciBidWZmIFsyMF07Ci0KLQkJICBzcHJpbnRmX3ZtYSAoYnVmZiwgcC0+dm1hX3ZhbCk7Ci0JCSAgCi0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBub25fZmF0YWwgKF8oIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tdm1hICVzJWMweCVzIG5ldmVyIHVzZWQiKSwKLQkJCSAgICAgcC0+bmFtZSwKLQkJCSAgICAgcC0+Y2hhbmdlX3ZtYSA9PSBDSEFOR0VfU0VUID8gJz0nIDogJysnLAotCQkJICAgICBidWZmKTsKLQkJfQotCSAgICAgIAotCSAgICAgIGlmIChwLT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCi0JCXsKLQkJICBjaGFyIGJ1ZmYgWzIwXTsKLQotCQkgIHNwcmludGZfdm1hIChidWZmLCBwLT5sbWFfdmFsKTsKLQkJICAKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIG5vbl9mYXRhbCAoXygiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi1sbWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIpLAotCQkJICAgICBwLT5uYW1lLAotCQkJICAgICBwLT5jaGFuZ2VfbG1hID09IENIQU5HRV9TRVQgPyAnPScgOiAnKycsCi0JCQkgICAgIGJ1ZmYpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTkRFRjsKLSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfVU5ERUY7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgaWYgKGlzX3N0cmlwIDwgMCkKLSAgICB7Ci0gICAgICBpbnQgaSA9IHN0cmxlbiAocHJvZ3JhbV9uYW1lKTsKLSAgICAgIGlzX3N0cmlwID0gKGkgPj0gNSAmJiBzdHJjbXAgKHByb2dyYW1fbmFtZSArIGkgLSA1LCAic3RyaXAiKSA9PSAwKTsKLSAgICB9Ci0KLSAgaWYgKGlzX3N0cmlwKQotICAgIHN0cmlwX21haW4gKGFyZ2MsIGFyZ3YpOwotICBlbHNlCi0gICAgY29weV9tYWluIChhcmdjLCBhcmd2KTsKLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamR1bXAuMSBiL2JpbnV0aWxzL29iamR1bXAuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjMTUzZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpkdW1wLjEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG9iamR1bXAgMSAiNSBOb3ZlbWJlciAxOTkxIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotb2JqZHVtcCBcLSBkaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzLgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgb2JqZHVtcAotLlJCICJbXHwiIFwtYSB8IFwtXC1hcmNoaXZlXC1oZWFkZXJzICJcfF0iIAotLlJCICJbXHwiICJcLWJcICJcYwotLkkgYmZkbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC10YXJnZXQ9IlxjCi0uSSBiZmRuYW1lXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGVidWdnaW5nICJcfF0iIAotLlJCICJbXHwiIFwtZCB8IFwtXC1kaXNhc3NlbWJsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLUQgfCBcLVwtZGlzYXNzZW1ibGUtYWxsICJcfF0iIAotLlJCICJbXHwiIFwtXC1kaXNhc3NlbWJsZVwtemVyb2VzICJcfF0iIAotLlJCICJbXHwiIFwtRUIgfCBcLUVMIHwgXC1cLWVuZGlhbj1cYwotLkkge2JpZ3xsaXR0bGV9XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1mIHwgXC1cLWZpbGVcLWhlYWRlcnMgIlx8XSIKLS5SQiAiW1x8IiBcLWggfCBcLVwtc2VjdGlvblwtaGVhZGVycwotLlJCICJ8ICIgXC1cLWhlYWRlcnMgIlx8XSIgCi0uUkIgIltcfCIgXC1pIHwgXC1cLWluZm8gIlx8XSIgCi0uUkIgIltcfCIgIlwtalwgIlxjCi0uSSBzZWN0aW9uXGMKLS5SQiAiIHwgIiAiXC1cLXNlY3Rpb249IlxjCi0uSSBzZWN0aW9uXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtbCB8IFwtXC1saW5lXC1udW1iZXJzICJcfF0iCi0uUkIgIltcfCIgIlwtbVwgIlxjCi0uSSBtYWNoaW5lXGMKLS5SQiAiIHwgIiAiXC1cLWFyY2hpdGVjdHVyZT0iXGMKLS5JIG1hY2hpbmVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1wIHwgXC1cLXByaXZhdGVcLWhlYWRlcnMgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXByZWZpeFwtYWRkcmVzc2VzICJcfF0iIAotLlJCICJbXHwiIFwtciB8IFwtXC1yZWxvYyAiXHxdIiAKLS5SQiAiW1x8IiBcLVIgfCBcLVwtZHluYW1pY1wtcmVsb2MgIlx8XSIgCi0uUkIgIltcfCIgXC1zIHwgXC1cLWZ1bGxcLWNvbnRlbnRzICJcfF0iCi0uUkIgIltcfCIgXC1TIHwgXC1cLXNvdXJjZSAiXHxdIgotLlJCICJbXHwiIFwtXC1bbm9cLV1zaG93XC1yYXdcLWluc24gIlx8XSIgCi0uUkIgIltcfCIgXC1cLXN0YWJzICJcfF0iCi0uUkIgIltcfCIgXC10IHwgXC1cLXN5bXMgIlx8XSIgCi0uUkIgIltcfCIgXC1UIHwgXC1cLWR5bmFtaWNcLXN5bXMgIlx8XSIgCi0uUkIgIltcfCIgXC14IHwgXC1cLWFsbFwtaGVhZGVycyAiXHxdIgotLlJCICJbXHwiICJcLVwtc3RhcnRcLWFkZHJlc3M9IlxjCi0uSSBhZGRyZXNzXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1zdG9wXC1hZGRyZXNzPSJcYwotLkkgYWRkcmVzc1xjCi1cJlx8XQotLlJCICJbXHwiICJcLVwtYWRqdXN0XC12bWE9IlxjCi0uSSBvZmZzZXRcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVxjCi0uQiBvYmpkdW1wXGMKLVwmIGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIG9iamVjdCBmaWxlcy4KLVRoZSBvcHRpb25zIGNvbnRyb2wgd2hhdCBwYXJ0aWN1bGFyIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkuICBUaGlzCi1pbmZvcm1hdGlvbiBpcyBtb3N0bHkgdXNlZnVsIHRvIHByb2dyYW1tZXJzIHdobyBhcmUgd29ya2luZyBvbiB0aGUKLWNvbXBpbGF0aW9uIHRvb2xzLCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tZXJzIHdobyBqdXN0IHdhbnQgdGhlaXIKLXByb2dyYW0gdG8gY29tcGlsZSBhbmQgd29yay4KLS5QUAotLklSICAib2JqZmlsZSIgLlx8Llx8LgotYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuICBXaGVuIHlvdSBzcGVjaWZ5IGFyY2hpdmVzLAotXGMKLS5CIG9iamR1bXBcYwotXCYgc2hvd3MgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGUgbWVtYmVyIG9iamVjdCBmaWxlcy4KLQotLlNIIE9QVElPTlMKLVdoZXJlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIGFuIG9wdGlvbiBhcmUgc2hvd24gdG9nZXRoZXIsIHRoZXkgYXJlCi1lcXVpdmFsZW50LiAgQXQgbGVhc3Qgb25lIG9wdGlvbiBiZXNpZGVzCi0uQiBcLWwKLShcZkJcLVwtbGluZVwtbnVtYmVyc1xmUCkgbXVzdCBiZSBnaXZlbi4KLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWFyY2hpdmVcLWhlYWRlcnMKLUlmIGFueSBmaWxlcyBmcm9tIFxjCi0uSSBvYmpmaWxlXGMKLVwmIGFyZSBhcmNoaXZlcywgZGlzcGxheSB0aGUgYXJjaGl2ZQotaGVhZGVyIGluZm9ybWF0aW9uIChpbiBhIGZvcm1hdCBzaW1pbGFyIHRvIGBcfFxjCi0uQiBscyBcLWxcYwotXHwnKS4gIEJlc2lkZXMgdGhlCi1pbmZvcm1hdGlvbiB5b3UgY291bGQgbGlzdCB3aXRoIGBcfFxjCi0uQiBhciB0dlxjCi1cfCcsIGBcfFxjCi0uQiBvYmpkdW1wIFwtYVxjCi1cfCcgc2hvd3MKLXRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgZWFjaCBhcmNoaXZlIG1lbWJlci4KLQotLlRQCi0uQkkgIlwtXC1hZGp1c3RcLXZtYT0iICJvZmZzZXQiCi1XaGVuIGR1bXBpbmcgaW5mb3JtYXRpb24sIGZpcnN0IGFkZAotLkkgb2Zmc2V0Ci10byBhbGwgdGhlIHNlY3Rpb24gYWRkcmVzc2VzLiAgVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHNlY3Rpb24gYWRkcmVzc2VzCi1kbyBub3QgY29ycmVzcG9uZCB0byB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCBjYW4gaGFwcGVuIHdoZW4gcHV0dGluZwotc2VjdGlvbnMgYXQgcGFydGljdWxhciBhZGRyZXNzZXMgd2hlbiB1c2luZyBhIGZvcm1hdCB3aGljaCBjYW4gbm90Ci1yZXByZXNlbnQgc2VjdGlvbiBhZGRyZXNzZXMsIHN1Y2ggYXMgYS5vdXQuCi0KLS5UUAotLkJJICJcLWIgIiAiYmZkbmFtZSJcYwotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyB0byBiZQotXGMKLS5JIGJmZG5hbWVcYwotXCYuICBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBcYwotLkkgb2JqZHVtcFxjCi1cJiBjYW4KLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4gIEZvciBleGFtcGxlLAotLnNwCi0uYnIKLW9iamR1bXBcIFwtYlwgb2FzeXNcIFwtbVwgdmF4XCBcLWhcIGZ1Lm8KLS5icgotLnNwCi1kaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzIChgXHxcYwotLkIgXC1oXGMKLVx8Jykgb2YKLWBcfFxjCi0uQiBmdS5vXGMKLVx8Jywgd2hpY2ggaXMgZXhwbGljaXRseSBpZGVudGlmaWVkIChgXHxcYwotLkIgXC1tXGMKLVx8JykgYXMgYSBWYXggb2JqZWN0Ci1maWxlIGluIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgT2FzeXMgY29tcGlsZXJzLiAgWW91IGNhbiBsaXN0IHRoZQotZm9ybWF0cyBhdmFpbGFibGUgd2l0aCB0aGUgYFx8XGMKLS5CIFwtaVxjCi1cfCcgb3B0aW9uLgotCi0uVFAKLS5CIFwtQwotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLURlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCi0KLS5UUAotLkIgXC1cLWRlYnVnZ2luZwotRGlzcGxheSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGF0dGVtcHRzIHRvIHBhcnNlIGRlYnVnZ2luZwotaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBmaWxlIGFuZCBwcmludCBpdCBvdXQgdXNpbmcgYSBDIGxpa2Ugc3ludGF4LgotT25seSBjZXJ0YWluIHR5cGVzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0KLS5UUAotLkIgXC1kCi0uVFAKLS5CIFwtXC1kaXNhc3NlbWJsZQotRGlzcGxheSB0aGUgYXNzZW1ibGVyIG1uZW1vbmljcyBmb3IgdGhlIG1hY2hpbmUKLWluc3RydWN0aW9ucyBmcm9tIFxjCi0uSSBvYmpmaWxlXGMKLVwmLgotVGhpcyBvcHRpb24gb25seSBkaXNhc3NlbWJsZXMgdGhvc2Ugc2VjdGlvbnMgd2hpY2ggYXJlCi1leHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotLlRQCi0uQiBcLUQKLS5UUAotLkIgXC1cLWRpc2Fzc2VtYmxlLWFsbAotTGlrZSBcZkJcLWRcZlAsIGJ1dCBkaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2YgYWxsIHNlY3Rpb25zLCBub3QganVzdAotdGhvc2UgZXhwZWN0ZWQgdG8gY29udGFpbiBpbnN0cnVjdGlvbnMuCi0KLS5UUAotLkIgXC1cLXByZWZpeFwtYWRkcmVzc2VzCi1XaGVuIGRpc2Fzc2VtYmxpbmcsIHByaW50IHRoZSBjb21wbGV0ZSBhZGRyZXNzIG9uIGVhY2ggbGluZS4gIFRoaXMgaXMKLXRoZSBvbGRlciBkaXNhc3NlbWJseSBmb3JtYXQuCi0KLS5UUAotLkIgXC1cLWRpc2Fzc2VtYmxlXC16ZXJvZXMKLU5vcm1hbGx5IHRoZSBkaXNhc3NlbWJseSBvdXRwdXQgd2lsbCBza2lwIGJsb2NrcyBvZiB6ZXJvZXMuICBUaGlzCi1vcHRpb24gZGlyZWN0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIGRpc2Fzc2VtYmxlIHRob3NlIGJsb2NrcywganVzdCBsaWtlCi1hbnkgb3RoZXIgZGF0YS4KLQotLlRQCi0uQiBcLUVCCi0uVFAKLS5CIFwtRUwKLS5UUAotLkJJICJcLVwtZW5kaWFuPSIgIntiaWd8bGl0dGxlfSIKLVNwZWNpZnkgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIG9iamVjdCBmaWxlcy4gIFRoaXMgb25seSBhZmZlY3RzCi1kaXNhc3NlbWJseS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRpc2Fzc2VtYmxpbmcgYSBmaWxlIGZvcm1hdCB3aGljaAotZG9lcyBub3QgZGVzY3JpYmUgZW5kaWFubmVzcyBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuCi0KLS5UUAotLkIgXC1mCi0uVFAKLS5CIFwtXC1maWxlXC1oZWFkZXJzCi1EaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3ZlcmFsbCBoZWFkZXIgb2YKLWVhY2ggZmlsZSBpbiBcYwotLkkgb2JqZmlsZVxjCi1cJi4KLQotLlRQCi0uQiBcLWgKLS5UUAotLkIgXC1cLXNlY3Rpb25cLWhlYWRlcnMKLS5UUAotLkIgXC1cLWhlYWRlcnMKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgb2YgdGhlCi1vYmplY3QgZmlsZS4KLQotLlRQCi0uQiBcLVwtaGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBvYmpkdW1wCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLWkKLS5UUAotLkIgXC1cLWluZm8KLURpc3BsYXkgYSBsaXN0IHNob3dpbmcgYWxsIGFyY2hpdGVjdHVyZXMgYW5kIG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotZm9yIHNwZWNpZmljYXRpb24gd2l0aCBcYwotLkIgXC1iXGMKLVwmIG9yIFxjCi0uQiBcLW1cYwotXCYuCi0KLS5UUAotLkJJICJcLWogIiAibmFtZSJcYwotLlRQCi0uQkkgIlwtXC1zZWN0aW9uPSIgIm5hbWUiCi1EaXNwbGF5IGluZm9ybWF0aW9uIG9ubHkgZm9yIHNlY3Rpb24gXGMKLS5JIG5hbWVcYwotXCYuCi0KLS5UUAotLkIgXC1sCi0uVFAKLS5CIFwtXC1saW5lXC1udW1iZXJzCi1MYWJlbCB0aGUgZGlzcGxheSAodXNpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uKSB3aXRoIHRoZSBmaWxlbmFtZQotYW5kIHNvdXJjZSBsaW5lIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGNvZGUgc2hvd24uCi1Pbmx5IHVzZWZ1bCB3aXRoIFxmQlwtZFxmUCwgXGZCXC1EXGZQLCBvciBcZkJcLXJcZlAuCi0KLS5UUAotLkJJICJcLW0gIiAibWFjaGluZSJcYwotLlRQCi0uQkkgIlwtXC1hcmNoaXRlY3R1cmU9IiAibWFjaGluZSIKLVNwZWNpZnkgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2Ugd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcy4gIFRoaXMKLWNhbiBiZSB1c2VmdWwgd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcyB3aGljaCBkbyBub3QgZGVzY3JpYmUKLWFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZQotYXJjaGl0ZWN0dXJlcyB3aXRoIHRoZSBcZkJcLWlcZlAgb3B0aW9uLiAKLQotLlRQCi0uQiBcLXAKLS5UUAotLkIgXC1cLXByaXZhdGVcLWhlYWRlcnMKLVByaW50IGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQotZXhhY3QgaW5mb3JtYXRpb24gcHJpbnRlZCBkZXBlbmRzIHVwb24gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIEZvcgotc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIHByaW50ZWQuCi0KLS5UUAotLkIgXC1yCi0uVFAKLS5CIFwtXC1yZWxvYwotUHJpbnQgdGhlIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIElmIHVzZWQgd2l0aCBcZkJcLWRcZlAgb3IKLVxmQlwtRFxmUCwgdGhlIHJlbG9jYXRpb25zIGFyZSBwcmludGVkIGludGVyc3BlcnNlZCB3aXRoIHRoZQotZGlzYXNzZW1ibHkuCi0KLS5UUAotLkIgXC1SCi0uVFAKLS5CIFwtXC1keW5hbWljXC1yZWxvYwotUHJpbnQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotLlRQCi0uQiBcLXMKLS5UUAotLkIgXC1cLWZ1bGxcLWNvbnRlbnRzCi1EaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9ucyByZXF1ZXN0ZWQuCi0KLS5UUAotLkIgXC1TCi0uVFAKLS5CIFwtXC1zb3VyY2UKLURpc3BsYXkgc291cmNlIGNvZGUgaW50ZXJtaXhlZCB3aXRoIGRpc2Fzc2VtYmx5LCBpZiBwb3NzaWJsZS4gIEltcGxpZXMKLVxmQi1kXGZQLgotCi0uVFAKLS5CIFwtXC1zaG93XC1yYXdcLWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIHByaW50IHRoZSBpbnN0cnVjdGlvbiBpbiBoZXggYXMgd2VsbCBhcwotaW4gc3ltYm9saWMgZm9ybS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXhjZXB0IHdoZW4KLS5CIFwtXC1wcmVmaXhcLWFkZHJlc3NlcwotaXMgdXNlZC4KLQotLlRQCi0uQiBcLVwtbm9cLXNob3dcLXJhd1wtaW5zbgotV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgZG8gbm90IHByaW50IHRoZSBpbnN0cnVjdGlvbiBieXRlcy4KLVRoaXMgaXMgdGhlIGRlZmF1bHQgd2hlbgotLkIgXC1cLXByZWZpeFwtYWRkcmVzc2VzCi1pcyB1c2VkLgotCi0uVFAKLS5CIFwtXC1zdGFicwotRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIC5zdGFiLCAuc3RhYi5pbmRleCwgYW5kIC5zdGFiLmV4Y2wKLXNlY3Rpb25zIGZyb20gYW4gRUxGIGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgKHN1Y2ggYXMKLVNvbGFyaXMgMi4wKSBpbiB3aGljaCAuc3RhYiBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlIGNhcnJpZWQKLWluIGFuIEVMRiBzZWN0aW9uLiAgSW4gbW9zdCBvdGhlciBmaWxlIGZvcm1hdHMsIGRlYnVnZ2luZyBzeW1ib2wtdGFibGUKLWVudHJpZXMgYXJlIGludGVybGVhdmVkIHdpdGggbGlua2FnZSBzeW1ib2xzLCBhbmQgYXJlIHZpc2libGUgaW4gdGhlCi0uQiBcLVwtc3ltcwotb3V0cHV0LgotCi0uVFAKLS5CSSAiXC1cLXN0YXJ0XC1hZGRyZXNzPSIgImFkZHJlc3MiCi1TdGFydCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZQotLkIgXC1kXGMKLSwKLS5CIFwtcgotYW5kCi0uQiBcLXMKLW9wdGlvbnMuCi0KLS5UUAotLkJJICJcLVwtc3RvcFwtYWRkcmVzcz0iICJhZGRyZXNzIgotU3RvcCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZQotLkIgXC1kXGMKLSwKLS5CIFwtcgotYW5kCi0uQiBcLXMKLW9wdGlvbnMuCi0KLS5UUAotLkIgXC10Ci0uVFAKLS5CIFwtXC1zeW1zCi1TeW1ib2wgVGFibGUuICBQcmludCB0aGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuCi1UaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBgXHxcYwotLkIgbm1cYwotXHwnIHByb2dyYW0uCi0KLS5UUAotLkIgXC1UCi0uVFAKLS5CIFwtXC1keW5hbWljXC1zeW1zCi1EeW5hbWljIFN5bWJvbCBUYWJsZS4gIFByaW50IHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZQotZmlsZS4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbgotdHlwZXMgb2Ygc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24KLXByb3ZpZGVkIGJ5IHRoZSBgXHxcYwotLkIgbm1cYwotXHwnIHByb2dyYW0gd2hlbiBnaXZlbiB0aGUKLS5CIFwtRCAoXC1cLWR5bmFtaWMpCi1vcHRpb24uCi0KLS5UUAotLkIgXC1cLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgb2JqZHVtcAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC14Ci0uVFAKLS5CIFwtXC1hbGxcLWhlYWRlcnMKLURpc3BsYXkgYWxsIGF2YWlsYWJsZSBoZWFkZXIgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgc3ltYm9sIHRhYmxlIGFuZAotcmVsb2NhdGlvbiBlbnRyaWVzLiAgVXNpbmcgYFx8XGMKLS5CIFwteFxjCi1cfCcgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIGFsbCBvZgotYFx8XGMKLS5CIFwtYSBcLWYgXC1oIFwtciBcLXRcYwotXHwnLgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgbm0gIigiIDEgIikuIgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvb2JqZHVtcC5jIGIvYmludXRpbHMvb2JqZHVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2VlNWQ2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL29iamR1bXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NDcgKzAsMCBAQAotLyogb2JqZHVtcC5jIC0tIGR1bXAgaW5mb3JtYXRpb24gYWJvdXQgYW4gb2JqZWN0IGZpbGUuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotLyogSW50ZXJuYWwgaGVhZGVycyBmb3IgdGhlIEVMRiAuc3RhYi1kdW1wIGNvZGUgLSBzb3JyeS4gICovCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJMzIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGCi0vKiBUaGlzIGlzIG5lZWRlZCBieSBJTklUX0RJU0FTU0VNQkxFX0lORk8uICAqLwotZXh0ZXJuIGludCBmcHJpbnRmIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqZGVmYXVsdF90YXJnZXQgPSBOVUxMOwkvKiBkZWZhdWx0IGF0IHJ1bnRpbWUgKi8KLQotc3RhdGljIGludCBzaG93X3ZlcnNpb24gPSAwOwkJLyogc2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLXN0YXRpYyBpbnQgZHVtcF9zZWN0aW9uX2NvbnRlbnRzOwkvKiAtcyAqLwotc3RhdGljIGludCBkdW1wX3NlY3Rpb25faGVhZGVyczsJLyogLWggKi8KLXN0YXRpYyBib29sZWFuIGR1bXBfZmlsZV9oZWFkZXI7CS8qIC1mICovCi1zdGF0aWMgaW50IGR1bXBfc3ltdGFiOwkJCS8qIC10ICovCi1zdGF0aWMgaW50IGR1bXBfZHluYW1pY19zeW10YWI7CQkvKiAtVCAqLwotc3RhdGljIGludCBkdW1wX3JlbG9jX2luZm87CQkvKiAtciAqLwotc3RhdGljIGludCBkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbzsJLyogLVIgKi8KLXN0YXRpYyBpbnQgZHVtcF9hcl9oZHJzOwkJLyogLWEgKi8KLXN0YXRpYyBpbnQgZHVtcF9wcml2YXRlX2hlYWRlcnM7CS8qIC1wICovCi1zdGF0aWMgaW50IHByZWZpeF9hZGRyZXNzZXM7CQkvKiAtLXByZWZpeC1hZGRyZXNzZXMgKi8KLXN0YXRpYyBpbnQgd2l0aF9saW5lX251bWJlcnM7CQkvKiAtbCAqLwotc3RhdGljIGJvb2xlYW4gd2l0aF9zb3VyY2VfY29kZTsJLyogLVMgKi8KLXN0YXRpYyBpbnQgc2hvd19yYXdfaW5zbjsJCS8qIC0tc2hvdy1yYXctaW5zbiAqLwotc3RhdGljIGludCBkdW1wX3N0YWJfc2VjdGlvbl9pbmZvOwkvKiAtLXN0YWJzICovCi1zdGF0aWMgaW50IGRvX2RlbWFuZ2xlOwkJCS8qIC1DLCAtLWRlbWFuZ2xlICovCi1zdGF0aWMgYm9vbGVhbiBkaXNhc3NlbWJsZTsJCS8qIC1kICovCi1zdGF0aWMgYm9vbGVhbiBkaXNhc3NlbWJsZV9hbGw7CQkvKiAtRCAqLwotc3RhdGljIGludCBkaXNhc3NlbWJsZV96ZXJvZXM7CQkvKiAtLWRpc2Fzc2VtYmxlLXplcm9lcyAqLwotc3RhdGljIGJvb2xlYW4gZm9ybWF0c19pbmZvOwkJLyogLWkgKi8KLXN0YXRpYyBjaGFyICpvbmx5OwkJCS8qIC1qIHNlY25hbWUgKi8KLXN0YXRpYyBpbnQgd2lkZV9vdXRwdXQ7CQkJLyogLXcgKi8KLXN0YXRpYyBiZmRfdm1hIHN0YXJ0X2FkZHJlc3MgPSAoYmZkX3ZtYSkgLTE7IC8qIC0tc3RhcnQtYWRkcmVzcyAqLwotc3RhdGljIGJmZF92bWEgc3RvcF9hZGRyZXNzID0gKGJmZF92bWEpIC0xOyAgLyogLS1zdG9wLWFkZHJlc3MgKi8KLXN0YXRpYyBpbnQgZHVtcF9kZWJ1Z2dpbmc7CQkvKiAtLWRlYnVnZ2luZyAqLwotc3RhdGljIGJmZF92bWEgYWRqdXN0X3NlY3Rpb25fdm1hID0gMDsJLyogLS1hZGp1c3Qtdm1hICovCi0KLS8qIEV4dHJhIGluZm8gdG8gcGFzcyB0byB0aGUgZGlzYXNzZW1ibGVyIGFkZHJlc3MgcHJpbnRpbmcgZnVuY3Rpb24uICAqLwotc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gewotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJvb2xlYW4gcmVxdWlyZV9zZWM7Ci19OwotCi0vKiBBcmNoaXRlY3R1cmUgdG8gZGlzYXNzZW1ibGUgZm9yLCBvciBkZWZhdWx0IGlmIE5VTEwuICAqLwotc3RhdGljIGNoYXIgKm1hY2hpbmUgPSAoY2hhciAqKSBOVUxMOwotCi0vKiBUYXJnZXQgc3BlY2lmaWMgb3B0aW9ucyB0byB0aGUgZGlzYXNzZW1ibGVyLiAgKi8KLXN0YXRpYyBjaGFyICpkaXNhc3NlbWJsZXJfb3B0aW9ucyA9IChjaGFyICopIE5VTEw7Ci0KLS8qIEVuZGlhbm5lc3MgdG8gZGlzYXNzZW1ibGUgZm9yLCBvciBkZWZhdWx0IGlmIEJGRF9FTkRJQU5fVU5LTk9XTi4gICovCi1zdGF0aWMgZW51bSBiZmRfZW5kaWFuIGVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTjsKLQotLyogVGhlIHN5bWJvbCB0YWJsZS4gICovCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXM7Ci0KLS8qIE51bWJlciBvZiBzeW1ib2xzIGluIGBzeW1zJy4gICovCi1zdGF0aWMgbG9uZyBzeW1jb3VudCA9IDA7Ci0KLS8qIFRoZSBzb3J0ZWQgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqc29ydGVkX3N5bXM7Ci0KLS8qIE51bWJlciBvZiBzeW1ib2xzIGluIGBzb3J0ZWRfc3ltcycuICAqLwotc3RhdGljIGxvbmcgc29ydGVkX3N5bWNvdW50ID0gMDsKLQotLyogVGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqZHluc3ltczsKLQotLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYGR5bnN5bXMnLiAgKi8KLXN0YXRpYyBsb25nIGR5bnN5bWNvdW50ID0gMDsKLQotLyogU3RhdGljIGRlY2xhcmF0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBjaGFyICp0YXJnZXQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc2VjdGlvbl9oZWFkZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2RhdGEgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jcyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfZHluYW1pY19yZWxvY3MgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY19zZXQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGxvbmcpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc3ltYm9scyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYykpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2JmZF9wcml2YXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9iZmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3RhcmdldF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mb190YWJsZSBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV90YXJnZXRfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mbyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3ZhbHVlIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfc3ltbmFtZSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYXN5bWJvbCAqKSk7Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBib29sZWFuLCBsb25nICopKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqLCBiZmRfdm1hLAotCQkJCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcmVzcyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2xpbmUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX2J5dGVzIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGRpc2Fzc2VtYmxlcl9mdHlwZSwKLQkJCSAgIGJvb2xlYW4sIGJmZF9ieXRlICosIGJmZF92bWEsIGJmZF92bWEsCi0JCQkgICBhcmVsZW50ICoqKiwgYXJlbGVudCAqKikpOwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfZGF0YSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1lbmRpYW5fc3RyaW5nIFBBUkFNUyAoKGVudW0gYmZkX2VuZGlhbikpOwotCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBhc3ltYm9sICoqCi1zbHVycF9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgbG9uZwotcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyBQQVJBTVMgKChhc3ltYm9sICoqLCBsb25nKSk7Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc3ltYm9scyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3JlbG9jcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zdGFicyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotcmVhZF9zZWN0aW9uX3N0YWJzIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2VjdGlvbl9zdGFicyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQwKLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1haGlmQ2REcHJSdFR4c1Nsd10gWy1iIGJmZG5hbWVdIFstbSBtYWNoaW5lXSBcblwKLSAgICAgICBbLWogc2VjdGlvbi1uYW1lXSBbLU0gZGlzYXNzZW1ibGVyLW9wdGlvbnNdXG5cCi0gICAgICAgWy0tYXJjaGl2ZS1oZWFkZXJzXSBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tZGVidWdnaW5nXSBbLS1kaXNhc3NlbWJsZV1cblwKLSAgICAgICBbLS1kaXNhc3NlbWJsZS1hbGxdIFstLWRpc2Fzc2VtYmxlLXplcm9lc10gWy0tZmlsZS1oZWFkZXJzXVxuXAotICAgICAgIFstLXNlY3Rpb24taGVhZGVyc10gWy0taGVhZGVyc11cblwKLSAgICAgICBbLS1pbmZvXSBbLS1zZWN0aW9uPXNlY3Rpb24tbmFtZV0gWy0tbGluZS1udW1iZXJzXSBbLS1zb3VyY2VdXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgICAgICBbLS1hcmNoaXRlY3R1cmU9bWFjaGluZV0gWy0tcmVsb2NdIFstLWZ1bGwtY29udGVudHNdIFstLXN0YWJzXVxuXAotICAgICAgIFstLXN5bXNdIFstLWFsbC1oZWFkZXJzXSBbLS1keW5hbWljLXN5bXNdIFstLWR5bmFtaWMtcmVsb2NdXG5cCi0gICAgICAgWy0td2lkZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gWy0tcHJpdmF0ZS1oZWFkZXJzXVxuXAotICAgICAgIFstLXN0YXJ0LWFkZHJlc3M9YWRkcl0gWy0tc3RvcC1hZGRyZXNzPWFkZHJdXG5cCi0gICAgICAgWy0tcHJlZml4LWFkZHJlc3Nlc10gWy0tW25vLV1zaG93LXJhdy1pbnNuXSBbLS1kZW1hbmdsZV1cblwKLSAgICAgICBbLS1hZGp1c3Qtdm1hPW9mZnNldF0gWy1FQnwtRUxdIFstLWVuZGlhbj17YmlnfGxpdHRsZX1dIG9iamZpbGUuLi5cblwKLWF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyAtbCAoLS1saW5lLW51bWJlcnMpIG11c3QgYmUgZ2l2ZW5cbiIpKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9FTkRJQU4gKDE1MCkKLSNkZWZpbmUgT1BUSU9OX1NUQVJUX0FERFJFU1MgKE9QVElPTl9FTkRJQU4gKyAxKQotI2RlZmluZSBPUFRJT05fU1RPUF9BRERSRVNTIChPUFRJT05fU1RBUlRfQUREUkVTUyArIDEpCi0jZGVmaW5lIE9QVElPTl9BREpVU1RfVk1BIChPUFRJT05fU1RPUF9BRERSRVNTICsgMSkKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW109Ci17Ci0gIHsiYWRqdXN0LXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQURKVVNUX1ZNQX0sCi0gIHsiYWxsLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKLSAgeyJwcml2YXRlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3AnfSwKLSAgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ20nfSwKLSAgeyJhcmNoaXZlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2EnfSwKLSAgeyJkZWJ1Z2dpbmciLCBub19hcmd1bWVudCwgJmR1bXBfZGVidWdnaW5nLCAxfSwKLSAgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDF9LAotICB7ImRpc2Fzc2VtYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gIHsiZGlzYXNzZW1ibGUtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdEJ30sCi0gIHsiZGlzYXNzZW1ibGVyLW9wdGlvbnMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ00nfSwKLSAgeyJkaXNhc3NlbWJsZS16ZXJvZXMiLCBub19hcmd1bWVudCwgJmRpc2Fzc2VtYmxlX3plcm9lcywgMX0sCi0gIHsiZHluYW1pYy1yZWxvYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUid9LAotICB7ImR5bmFtaWMtc3ltcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVCd9LAotICB7ImVuZGlhbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5ESUFOfSwKLSAgeyJmaWxlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJmdWxsLWNvbnRlbnRzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gIHsiaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ0gnfSwKLSAgeyJpbmZvIiwgbm9fYXJndW1lbnQsIE5VTEwsICdpJ30sCi0gIHsibGluZS1udW1iZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gIHsibm8tc2hvdy1yYXctaW5zbiIsIG5vX2FyZ3VtZW50LCAmc2hvd19yYXdfaW5zbiwgLTF9LAotICB7InByZWZpeC1hZGRyZXNzZXMiLCBub19hcmd1bWVudCwgJnByZWZpeF9hZGRyZXNzZXMsIDF9LAotICB7InJlbG9jIiwgbm9fYXJndW1lbnQsIE5VTEwsICdyJ30sCi0gIHsic2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnaid9LAotICB7InNlY3Rpb24taGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7InNob3ctcmF3LWluc24iLCBub19hcmd1bWVudCwgJnNob3dfcmF3X2luc24sIDF9LAotICB7InNvdXJjZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICB7InN0YWJzIiwgbm9fYXJndW1lbnQsICZkdW1wX3N0YWJfc2VjdGlvbl9pbmZvLCAxfSwKLSAgeyJzdGFydC1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFSVF9BRERSRVNTfSwKLSAgeyJzdG9wLWFkZHJlc3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUT1BfQUREUkVTU30sCi0gIHsic3ltcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndCd9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgJnNob3dfdmVyc2lvbiwgMX0sCi0gIHsid2lkZSIsIG5vX2FyZ3VtZW50LCAmd2lkZV9vdXRwdXQsICd3J30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX2hlYWRlciAoYWJmZCwgc2VjdGlvbiwgaWdub3JlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGlnbm9yZWQ7Ci17Ci0gIGNoYXIgKmNvbW1hID0gIiI7Ci0KLSAgcHJpbnRmICgiJTNkICUtMTNzICUwOGx4ICAiLCBzZWN0aW9uLT5pbmRleCwKLQkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKSwKLQkgICh1bnNpZ25lZCBsb25nKSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0gIHByaW50Zl92bWEgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pKTsKLSAgcHJpbnRmICgiICAiKTsKLSAgcHJpbnRmX3ZtYSAoc2VjdGlvbi0+bG1hKTsKLSAgcHJpbnRmICgiICAlMDhseCAgMioqJXUiLCBzZWN0aW9uLT5maWxlcG9zLAotCSAgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjdGlvbikpOwotICBpZiAoISB3aWRlX291dHB1dCkKLSAgICBwcmludGYgKCJcbiAgICAgICAgICAgICAgICAiKTsKLSAgcHJpbnRmICgiICAiKTsKLQotI2RlZmluZSBQRih4LCB5KSBcCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIHgpIHsgcHJpbnRmICgiJXMlcyIsIGNvbW1hLCB5KTsgY29tbWEgPSAiLCAiOyB9Ci0KLSAgUEYgKFNFQ19IQVNfQ09OVEVOVFMsICJDT05URU5UUyIpOwotICBQRiAoU0VDX0FMTE9DLCAiQUxMT0MiKTsKLSAgUEYgKFNFQ19DT05TVFJVQ1RPUiwgIkNPTlNUUlVDVE9SIik7Ci0gIFBGIChTRUNfQ09OU1RSVUNUT1JfVEVYVCwgIkNPTlNUUlVDVE9SIFRFWFQiKTsKLSAgUEYgKFNFQ19DT05TVFJVQ1RPUl9EQVRBLCAiQ09OU1RSVUNUT1IgREFUQSIpOwotICBQRiAoU0VDX0NPTlNUUlVDVE9SX0JTUywgIkNPTlNUUlVDVE9SIEJTUyIpOwotICBQRiAoU0VDX0xPQUQsICJMT0FEIik7Ci0gIFBGIChTRUNfUkVMT0MsICJSRUxPQyIpOwotI2lmZGVmIFNFQ19CQUxJR04KLSAgUEYgKFNFQ19CQUxJR04sICJCQUxJR04iKTsKLSNlbmRpZgotICBQRiAoU0VDX1JFQURPTkxZLCAiUkVBRE9OTFkiKTsKLSAgUEYgKFNFQ19DT0RFLCAiQ09ERSIpOwotICBQRiAoU0VDX0RBVEEsICJEQVRBIik7Ci0gIFBGIChTRUNfUk9NLCAiUk9NIik7Ci0gIFBGIChTRUNfREVCVUdHSU5HLCAiREVCVUdHSU5HIik7Ci0gIFBGIChTRUNfTkVWRVJfTE9BRCwgIk5FVkVSX0xPQUQiKTsKLSAgUEYgKFNFQ19FWENMVURFLCAiRVhDTFVERSIpOwotICBQRiAoU0VDX1NPUlRfRU5UUklFUywgIlNPUlRfRU5UUklFUyIpOwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTElOS19PTkNFKSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmxzOwotCi0gICAgICBzd2l0Y2ggKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xJTktfRFVQTElDQVRFUykKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCSAgbHMgPSAiTElOS19PTkNFX0RJU0NBUkQiOwotCSAgYnJlYWs7Ci0JY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOgotCSAgbHMgPSAiTElOS19PTkNFX09ORV9PTkxZIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU6Ci0JICBscyA9ICJMSU5LX09OQ0VfU0FNRV9TSVpFIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOgotCSAgbHMgPSAiTElOS19PTkNFX1NBTUVfQ09OVEVOVFMiOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJpbnRmICgiJXMlcyIsIGNvbW1hLCBscyk7Ci0gICAgICBjb21tYSA9ICIsICI7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0jdW5kZWYgUEYKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBwcmludGYgKF8oIlNlY3Rpb25zOlxuIikpOwotI2lmbmRlZiBCRkQ2NAotICBwcmludGYgKF8oIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgTE1BICAgICAgIEZpbGUgb2ZmICBBbGduXG4iKSk7Ci0jZWxzZQotICBwcmludGYgKF8oIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgICAgICAgICBMTUEgICAgICAgICAgICAgICBGaWxlIG9mZiAgQWxnblxuIikpOwotI2VuZGlmCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZHVtcF9zZWN0aW9uX2hlYWRlciwgKFBUUikgTlVMTCk7Ci19Ci0MCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKipzeSA9IChhc3ltYm9sICoqKSBOVUxMOwotICBsb25nIHN0b3JhZ2U7Ci0KLSAgaWYgKCEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEhBU19TWU1TKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgc3ltY291bnQgPSAwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3RvcmFnZSkKLSAgICB7Ci0gICAgICBzeSA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzdG9yYWdlKTsKLSAgICB9Ci0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5KTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgaWYgKHN5bWNvdW50ID09IDApCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgcmV0dXJuIHN5OwotfQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqKnN5ID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0gIGxvbmcgc3RvcmFnZTsKLQotICBzdG9yYWdlID0gYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IG5vdCBhIGR5bmFtaWMgb2JqZWN0XG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBkeW5zeW1jb3VudCA9IDA7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgIH0KLQotICBpZiAoc3RvcmFnZSkKLSAgICB7Ci0gICAgICBzeSA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzdG9yYWdlKTsKLSAgICB9Ci0gIGR5bnN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3kpOwotICBpZiAoZHluc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICBpZiAoZHluc3ltY291bnQgPT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogTm8gZHluYW1pYyBzeW1ib2xzXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICByZXR1cm4gc3k7Ci19Ci0KLS8qIEZpbHRlciBvdXQgKGluIHBsYWNlKSBzeW1ib2xzIHRoYXQgYXJlIHVzZWxlc3MgZm9yIGRpc2Fzc2VtYmx5LgotICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBTWU1CT0xTLgotICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlZnVsIHN5bWJvbHMuICovCi0KLXN0YXRpYyBsb25nCi1yZW1vdmVfdXNlbGVzc19zeW1ib2xzIChzeW1ib2xzLCBjb3VudCkKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGxvbmcgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGFzeW1ib2wgKippbl9wdHIgPSBzeW1ib2xzLCAqKm91dF9wdHIgPSBzeW1ib2xzOwotCi0gIHdoaWxlICgtLWNvdW50ID49IDApCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gKmluX3B0cisrOwotCi0gICAgICBpZiAoc3ltLT5uYW1lID09IE5VTEwgfHwgc3ltLT5uYW1lWzBdID09ICdcMCcpCi0JY29udGludWU7Ci0gICAgICBpZiAoc3ltLT5mbGFncyAmIChCU0ZfREVCVUdHSU5HKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQljb250aW51ZTsKLQotICAgICAgKm91dF9wdHIrKyA9IHN5bTsKLSAgICB9Ci0gIHJldHVybiBvdXRfcHRyIC0gc3ltYm9sczsKLX0KLQotLyogU29ydCBzeW1ib2xzIGludG8gdmFsdWUgb3JkZXIuICAqLwotCi1zdGF0aWMgaW50IAotY29tcGFyZV9zeW1ib2xzIChhcCwgYnApCi0gICAgIGNvbnN0IFBUUiBhcDsKLSAgICAgY29uc3QgUFRSIGJwOwotewotICBjb25zdCBhc3ltYm9sICphID0gKihjb25zdCBhc3ltYm9sICoqKWFwOwotICBjb25zdCBhc3ltYm9sICpiID0gKihjb25zdCBhc3ltYm9sICoqKWJwOwotICBjb25zdCBjaGFyICphbiwgKmJuOwotICBzaXplX3QgYW5sLCBibmw7Ci0gIGJvb2xlYW4gYWYsIGJmOwotICBmbGFnd29yZCBhZmxhZ3MsIGJmbGFnczsKLQotICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKGEpID4gYmZkX2FzeW1ib2xfdmFsdWUgKGIpKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoYSkgPCBiZmRfYXN5bWJvbF92YWx1ZSAoYikpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChhLT5zZWN0aW9uID4gYi0+c2VjdGlvbikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYS0+c2VjdGlvbiA8IGItPnNlY3Rpb24pCi0gICAgcmV0dXJuIC0xOwotCi0gIGFuID0gYmZkX2FzeW1ib2xfbmFtZSAoYSk7Ci0gIGJuID0gYmZkX2FzeW1ib2xfbmFtZSAoYik7Ci0gIGFubCA9IHN0cmxlbiAoYW4pOwotICBibmwgPSBzdHJsZW4gKGJuKTsKLQotICAvKiBUaGUgc3ltYm9scyBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQgY29udmV5IG5vIHJlYWwKLSAgICAgaW5mb3JtYXRpb24sIHNvIHB1dCB0aGVtIGFmdGVyIG90aGVyIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gICovCi0KLSAgYWYgPSAoc3Ryc3RyIChhbiwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKGFuLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotICBiZiA9IChzdHJzdHIgKGJuLCAiZ251X2NvbXBpbGVkIikgIT0gTlVMTAotCXx8IHN0cnN0ciAoYm4sICJnY2MyX2NvbXBpbGVkIikgIT0gTlVMTCk7Ci0KLSAgaWYgKGFmICYmICEgYmYpCi0gICAgcmV0dXJuIDE7Ci0gIGlmICghIGFmICYmIGJmKQotICAgIHJldHVybiAtMTsKLQotICAvKiBXZSB1c2UgYSBoZXVyaXN0aWMgZm9yIHRoZSBmaWxlIG5hbWUsIHRvIHRyeSB0byBzb3J0IGl0IGFmdGVyCi0gICAgIG1vcmUgdXNlZnVsIHN5bWJvbHMuICBJdCBtYXkgbm90IHdvcmsgb24gbm9uIFVuaXggc3lzdGVtcywgYnV0IGl0Ci0gICAgIGRvZXNuJ3QgcmVhbGx5IG1hdHRlcjsgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyBwcmVjaXNlbHkgd2hpY2gKLSAgICAgc3ltYm9sIG5hbWVzIGdldCBwcmludGVkLiAgKi8KLQotI2RlZmluZSBmaWxlX3N5bWJvbChzLCBzbiwgc25sKQkJCVwKLSAgKCgocyktPmZsYWdzICYgQlNGX0ZJTEUpICE9IDAJCQlcCi0gICB8fCAoKHNuKVsoc25sKSAtIDJdID09ICcuJwkJCVwKLSAgICAgICAmJiAoKHNuKVsoc25sKSAtIDFdID09ICdvJwkJXAotCSAgIHx8IChzbilbKHNubCkgLSAxXSA9PSAnYScpKSkKLQotICBhZiA9IGZpbGVfc3ltYm9sIChhLCBhbiwgYW5sKTsKLSAgYmYgPSBmaWxlX3N5bWJvbCAoYiwgYm4sIGJubCk7Ci0KLSAgaWYgKGFmICYmICEgYmYpCi0gICAgcmV0dXJuIDE7Ci0gIGlmICghIGFmICYmIGJmKQotICAgIHJldHVybiAtMTsKLQotICAvKiBUcnkgdG8gc29ydCBnbG9iYWwgc3ltYm9scyBiZWZvcmUgbG9jYWwgc3ltYm9scyBiZWZvcmUgZnVuY3Rpb24KLSAgICAgc3ltYm9scyBiZWZvcmUgZGVidWdnaW5nIHN5bWJvbHMuICAqLwotCi0gIGFmbGFncyA9IGEtPmZsYWdzOwotICBiZmxhZ3MgPSBiLT5mbGFnczsKLQotICBpZiAoKGFmbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IChiZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSkKLSAgICB7Ci0gICAgICBpZiAoKGFmbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKChhZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IChiZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKQotICAgIHsKLSAgICAgIGlmICgoYWZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGlmICgoYWZsYWdzICYgQlNGX0xPQ0FMKSAhPSAoYmZsYWdzICYgQlNGX0xPQ0FMKSkKLSAgICB7Ci0gICAgICBpZiAoKGFmbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoKGFmbGFncyAmIEJTRl9HTE9CQUwpICE9IChiZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKLSAgICB7Ci0gICAgICBpZiAoKGFmbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCi0JcmV0dXJuIC0xOwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLQotICAvKiBTeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCAnLicgbWlnaHQgYmUgc2VjdGlvbiBuYW1lcywgc28gc29ydCB0aGVtCi0gICAgIGFmdGVyIHN5bWJvbHMgdGhhdCBkb24ndCBzdGFydCB3aXRoICcuJy4gICovCi0gIGlmIChhblswXSA9PSAnLicgJiYgYm5bMF0gIT0gJy4nKQotICAgIHJldHVybiAxOwotICBpZiAoYW5bMF0gIT0gJy4nICYmIGJuWzBdID09ICcuJykKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogRmluYWxseSwgaWYgd2UgY2FuJ3QgZGlzdGluZ3Vpc2ggdGhlbSBpbiBhbnkgb3RoZXIgd2F5LCB0cnkgdG8KLSAgICAgZ2V0IGNvbnNpc3RlbnQgcmVzdWx0cyBieSBzb3J0aW5nIHRoZSBzeW1ib2xzIGJ5IG5hbWUuICAqLwotICByZXR1cm4gc3RyY21wIChhbiwgYm4pOwotfQotCi0vKiBTb3J0IHJlbG9jcyBpbnRvIGFkZHJlc3Mgb3JkZXIuICAqLwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3JlbG9jcyAoYXAsIGJwKQotICAgICBjb25zdCBQVFIgYXA7Ci0gICAgIGNvbnN0IFBUUiBicDsKLXsKLSAgY29uc3QgYXJlbGVudCAqYSA9ICooY29uc3QgYXJlbGVudCAqKilhcDsKLSAgY29uc3QgYXJlbGVudCAqYiA9ICooY29uc3QgYXJlbGVudCAqKilicDsKLQotICBpZiAoYS0+YWRkcmVzcyA+IGItPmFkZHJlc3MpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGEtPmFkZHJlc3MgPCBiLT5hZGRyZXNzKQotICAgIHJldHVybiAtMTsKLQotICAvKiBTbyB0aGF0IGFzc29jaWF0ZWQgcmVsb2NhdGlvbnMgdGllZCB0byB0aGUgc2FtZSBhZGRyZXNzIHNob3cgdXAKLSAgICAgaW4gdGhlIGNvcnJlY3Qgb3JkZXIsIHdlIGRvbid0IGRvIGFueSBmdXJ0aGVyIHNvcnRpbmcuICAqLwotICBpZiAoYSA+IGIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGEgPCBiKQotICAgIHJldHVybiAtMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQcmludCBWTUEgdG8gU1RSRUFNLiAgSWYgU0tJUF9aRVJPRVMgaXMgdHJ1ZSwgb21pdCBsZWFkaW5nIHplcm9lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEsIGluZm8sIHNraXBfemVyb2VzKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gc2tpcF96ZXJvZXM7Ci17Ci0gIGNoYXIgYnVmWzMwXTsKLSAgY2hhciAqcDsKLQotICBzcHJpbnRmX3ZtYSAoYnVmLCB2bWEpOwotICBpZiAoISBza2lwX3plcm9lcykKLSAgICBwID0gYnVmOwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChwID0gYnVmOyAqcCA9PSAnMCc7ICsrcCkKLQk7Ci0gICAgICBpZiAoKnAgPT0gJ1wwJykKLQktLXA7Ci0gICAgfQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcCk7Ci19Ci0KLS8qIFByaW50IHRoZSBuYW1lIG9mIGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfc3ltbmFtZSAoYWJmZCwgaW5mbywgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGNoYXIgKmFsbG9jOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICpwcmludDsKLQotICBhbGxvYyA9IE5VTEw7Ci0gIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOwotICBpZiAoISBkb19kZW1hbmdsZSB8fCBuYW1lWzBdID09ICdcMCcpCi0gICAgcHJpbnQgPSBuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgLyogRGVtYW5nbGUgdGhlIG5hbWUuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gbmFtZVswXSkKLQkrK25hbWU7Ci0KLSAgICAgIGFsbG9jID0gY3BsdXNfZGVtYW5nbGUgKG5hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLSAgICAgIGlmIChhbGxvYyA9PSBOVUxMKQotCXByaW50ID0gbmFtZTsKLSAgICAgIGVsc2UKLQlwcmludCA9IGFsbG9jOwotICAgIH0KLQotICBpZiAoaW5mbyAhPSBOVUxMKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBwcmludCk7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcyIsIHByaW50KTsKLQotICBpZiAoYWxsb2MgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYyk7Ci19Ci0KLS8qIExvY2F0ZSBhIHN5bWJvbCBnaXZlbiBhIGJmZCwgYSBzZWN0aW9uLCBhbmQgYSBWTUEuICBJZiBSRVFVSVJFX1NFQwotICAgaXMgdHJ1ZSwgdGhlbiBhbHdheXMgcmVxdWlyZSB0aGUgc3ltYm9sIHRvIGJlIGluIHRoZSBzZWN0aW9uLiAgVGhpcwotICAgcmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIG5vIHN1aXRhYmxlIHN5bWJvbC4gIElmIFBMQUNFIGlzIG5vdCBOVUxMLAotICAgdGhlbiAqUExBQ0UgaXMgc2V0IHRvIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sIGluIHNvcnRlZF9zeW1zLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGFiZmQsIHNlYywgdm1hLCByZXF1aXJlX3NlYywgcGxhY2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9zZWM7Ci0gICAgIGxvbmcgKnBsYWNlOwotewotICAvKiBAQCBXb3VsZCBpdCBzcGVlZCB0aGluZ3MgdXAgdG8gY2FjaGUgdGhlIGxhc3QgdHdvIHN5bWJvbHMgcmV0dXJuZWQsCi0gICAgIGFuZCBtYXliZSB0aGVpciBhZGRyZXNzIHJhbmdlcz8gIEZvciBtYW55IHByb2Nlc3NvcnMsIG9ubHkgb25lIG1lbW9yeQotICAgICBvcGVyYW5kIGNhbiBiZSBwcmVzZW50IGF0IGEgdGltZSwgc28gdGhlIDItZW50cnkgY2FjaGUgd291bGRuJ3QgYmUKLSAgICAgY29uc3RhbnRseSBjaHVybmVkIGJ5IGNvZGUgZG9pbmcgaGVhdnkgbWVtb3J5IGFjY2Vzc2VzLiAgKi8KLQotICAvKiBJbmRpY2VzIGluIGBzb3J0ZWRfc3ltcycuICAqLwotICBsb25nIG1pbiA9IDA7Ci0gIGxvbmcgbWF4ID0gc29ydGVkX3N5bWNvdW50OwotICBsb25nIHRoaXNwbGFjZTsKLQotICBpZiAoc29ydGVkX3N5bWNvdW50IDwgMSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBsb29raW5nIGZvciB0aGUgY2xvc2VzdCBzeW1ib2wgdG8gdGhlCi0gICAgIHJlcXVpcmVkIHZhbHVlLiAgV2UgYXJlIHNlYXJjaGluZyB0aGUgcmFuZ2UgKG1pbiwgbWF4XS4gICovCi0gIHdoaWxlIChtaW4gKyAxIDwgbWF4KQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLQotICAgICAgdGhpc3BsYWNlID0gKG1heCArIG1pbikgLyAyOwotICAgICAgc3ltID0gc29ydGVkX3N5bXNbdGhpc3BsYWNlXTsKLQotICAgICAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gdm1hKQotCW1heCA9IHRoaXNwbGFjZTsKLSAgICAgIGVsc2UgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIDwgdm1hKQotCW1pbiA9IHRoaXNwbGFjZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtaW4gPSB0aGlzcGxhY2U7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBzeW1ib2wgd2Ugd2FudCBpcyBub3cgaW4gbWluLCB0aGUgbG93IGVuZCBvZiB0aGUgcmFuZ2Ugd2UKLSAgICAgd2VyZSBzZWFyY2hpbmcuICBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBzeW1ib2xzIHdpdGggdGhlIHNhbWUKLSAgICAgdmFsdWUsIHdlIHdhbnQgdGhlIGZpcnN0IG9uZS4gICovCi0gIHRoaXNwbGFjZSA9IG1pbjsKLSAgd2hpbGUgKHRoaXNwbGFjZSA+IDAKLQkgJiYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdKQotCSAgICAgPT0gYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZSAtIDFdKSkpCi0gICAgLS10aGlzcGxhY2U7Ci0KLSAgLyogSWYgdGhlIGZpbGUgaXMgcmVsb2NhdGVhYmxlLCBhbmQgdGhlIHN5bWJvbCBjb3VsZCBiZSBmcm9tIHRoaXMKLSAgICAgc2VjdGlvbiwgcHJlZmVyIGEgc3ltYm9sIGZyb20gdGhpcyBzZWN0aW9uIG92ZXIgc3ltYm9scyBmcm9tCi0gICAgIG90aGVycywgZXZlbiBpZiB0aGUgb3RoZXIgc3ltYm9sJ3MgdmFsdWUgbWlnaHQgYmUgY2xvc2VyLgotICAgICAgIAotICAgICBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgd3JvbmcgZm9yIHNvbWUgc3ltYm9sIHJlZmVyZW5jZXMgaWYgdGhlCi0gICAgIHNlY3Rpb25zIGhhdmUgb3ZlcmxhcHBpbmcgbWVtb3J5IHJhbmdlcywgYnV0IGluIHRoYXQgY2FzZSB0aGVyZSdzCi0gICAgIG5vIHdheSB0byB0ZWxsIHdoYXQncyBkZXNpcmVkIHdpdGhvdXQgbG9va2luZyBhdCB0aGUgcmVsb2NhdGlvbgotICAgICB0YWJsZS4gICovCi0KLSAgaWYgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0tPnNlY3Rpb24gIT0gc2VjCi0gICAgICAmJiAocmVxdWlyZV9zZWMKLQkgIHx8ICgoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpICE9IDAKLQkgICAgICAmJiB2bWEgPj0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCSAgICAgICYmIHZtYSA8IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCQkrIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykpKSkpCi0gICAgewotICAgICAgbG9uZyBpOwotCi0gICAgICBmb3IgKGkgPSB0aGlzcGxhY2UgKyAxOyBpIDwgc29ydGVkX3N5bWNvdW50OyBpKyspCi0JewotCSAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1tpXSkKLQkgICAgICAhPSBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIC0taTsKLSAgICAgIGZvciAoOyBpID49IDA7IGktLSkKLQl7Ci0JICBpZiAoc29ydGVkX3N5bXNbaV0tPnNlY3Rpb24gPT0gc2VjCi0JICAgICAgJiYgKGkgPT0gMAotCQkgIHx8IHNvcnRlZF9zeW1zW2kgLSAxXS0+c2VjdGlvbiAhPSBzZWMKLQkJICB8fCAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW2ldKQotCQkgICAgICAhPSBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbaSAtIDFdKSkpKQotCSAgICB7Ci0JICAgICAgdGhpc3BsYWNlID0gaTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0tPnNlY3Rpb24gIT0gc2VjKQotCXsKLQkgIC8qIFdlIGRpZG4ndCBmaW5kIGEgZ29vZCBzeW1ib2wgd2l0aCBhIHNtYWxsZXIgdmFsdWUuCi0JICAgICBMb29rIGZvciBvbmUgd2l0aCBhIGxhcmdlciB2YWx1ZS4gICovCi0JICBmb3IgKGkgPSB0aGlzcGxhY2UgKyAxOyBpIDwgc29ydGVkX3N5bWNvdW50OyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc29ydGVkX3N5bXNbaV0tPnNlY3Rpb24gPT0gc2VjKQotCQl7Ci0JCSAgdGhpc3BsYWNlID0gaTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXS0+c2VjdGlvbiAhPSBzZWMKLQkgICYmIChyZXF1aXJlX3NlYwotCSAgICAgIHx8ICgoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpICE9IDAKLQkJICAmJiB2bWEgPj0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICYmIHZtYSA8IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCQkgICAgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpKSkpKQotCXsKLQkgIC8qIFRoZXJlIGlzIG5vIHN1aXRhYmxlIHN5bWJvbC4gICovCi0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmIChwbGFjZSAhPSBOVUxMKQotICAgICpwbGFjZSA9IHRoaXNwbGFjZTsKLQotICByZXR1cm4gc29ydGVkX3N5bXNbdGhpc3BsYWNlXTsKLX0KLQotLyogUHJpbnQgYW4gYWRkcmVzcyB0byBJTkZPIHN5bWJvbGljYWxseS4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0gKGFiZmQsIHNlYywgc3ltLCB2bWEsIGluZm8sIHNraXBfemVyb2VzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBib29sZWFuIHNraXBfemVyb2VzOwotewotICBvYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEsIGluZm8sIHNraXBfemVyb2VzKTsKLQotICBpZiAoc3ltID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBzZWNhZGRyOwotCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiA8JXMiLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci0gICAgICBzZWNhZGRyID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKLSAgICAgIGlmICh2bWEgPCBzZWNhZGRyKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLTB4Iik7Ci0JICBvYmpkdW1wX3ByaW50X3ZhbHVlIChzZWNhZGRyIC0gdm1hLCBpbmZvLCB0cnVlKTsKLQl9Ci0gICAgICBlbHNlIGlmICh2bWEgPiBzZWNhZGRyKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKzB4Iik7Ci0JICBvYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEgLSBzZWNhZGRyLCBpbmZvLCB0cnVlKTsKLQl9Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIj4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiA8Iik7Ci0gICAgICBvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIGluZm8sIHN5bSk7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiB2bWEpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItMHgiKTsKLQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIC0gdm1hLCBpbmZvLCB0cnVlKTsKLQl9Ci0gICAgICBlbHNlIGlmICh2bWEgPiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisweCIpOwotCSAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hIC0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSksIGluZm8sIHRydWUpOwotCX0KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPiIpOwotICAgIH0KLX0KLQotLyogUHJpbnQgVk1BIHRvIElORk8sIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gIElmIFNLSVBfWkVST0VTIGlzCi0gICB0cnVlLCBkb24ndCBvdXRwdXQgbGVhZGluZyB6ZXJvZXMuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyICh2bWEsIGluZm8sIHNraXBfemVyb2VzKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gc2tpcF96ZXJvZXM7Ci17Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICphdXg7Ci0gIGFzeW1ib2wgKnN5bTsKLQotICBpZiAoc29ydGVkX3N5bWNvdW50IDwgMSkKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4Iik7Ci0gICAgICBvYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEsIGluZm8sIHNraXBfemVyb2VzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXV4ID0gKHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICopIGluZm8tPmFwcGxpY2F0aW9uX2RhdGE7Ci0gIHN5bSA9IGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhdXgtPmFiZmQsIGF1eC0+c2VjLCB2bWEsIGF1eC0+cmVxdWlyZV9zZWMsCi0JCQkJIChsb25nICopIE5VTEwpOwotICBvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0gKGF1eC0+YWJmZCwgYXV4LT5zZWMsIHN5bSwgdm1hLCBpbmZvLAotCQkJICAgICAgIHNraXBfemVyb2VzKTsKLX0KLQotLyogUHJpbnQgVk1BIHRvIElORk8uICBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgZGlzYXNzZW1ibGVyCi0gICByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcmVzcyAodm1hLCBpbmZvKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIG9iamR1bXBfcHJpbnRfYWRkciAodm1hLCBpbmZvLCAhIHByZWZpeF9hZGRyZXNzZXMpOwotfQotCi0vKiBEZXRlcm1pbmUgb2YgdGhlIGdpdmVuIGFkZHJlc3MgaGFzIGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpdC4gICovCi0KLXN0YXRpYyBpbnQKLW9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3MgKHZtYSwgaW5mbykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKiBhdXg7Ci0gIGFzeW1ib2wgKiBzeW07Ci0KLSAgLyogTm8gc3ltYm9scyAtIGRvIG5vdCBib3RoZXIgY2hlY2tpbmcuICAqLwotICBpZiAoc29ydGVkX3N5bWNvdW50IDwgMSkKLSAgICByZXR1cm4gMDsKLQotICBhdXggPSAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKLSAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGF1eC0+YWJmZCwgYXV4LT5zZWMsIHZtYSwgYXV4LT5yZXF1aXJlX3NlYywKLQkJCQkgKGxvbmcgKikgTlVMTCk7Ci0KLSAgcmV0dXJuIChzeW0gIT0gTlVMTCAmJiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPT0gdm1hKSk7Ci19Ci0KLS8qIEhvbGQgdGhlIGxhc3QgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIGxhc3QgbGluZSBudW1iZXIgd2UgZGlzcGxheWVkCi0gICBpbiBhIGRpc2Fzc2VtYmx5LiAgKi8KLQotc3RhdGljIGNoYXIgKnByZXZfZnVuY3Rpb25uYW1lOwotc3RhdGljIHVuc2lnbmVkIGludCBwcmV2X2xpbmU7Ci0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGFsbCBmaWxlcyB0aGF0IHdlIGhhdmUgc2VlbiB3aGVuIGRvaW5nIGEKLSAgIGRpc3Nhc3NlbWJseSB3aXRoIHNvdXJjZSwgc28gdGhhdCB3ZSBrbm93IGhvdyBtdWNoIG9mIHRoZSBmaWxlIHRvCi0gICBkaXNwbGF5LiAgVGhpcyBjYW4gYmUgaW1wb3J0YW50IGZvciBpbmxpbmVkIGZ1bmN0aW9ucy4gICovCi0KLXN0cnVjdCBwcmludF9maWxlX2xpc3QKLXsKLSAgc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqbmV4dDsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBGSUxFICpmOwotfTsKLQotc3RhdGljIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKnByaW50X2ZpbGVzOwotCi0vKiBUaGUgbnVtYmVyIG9mIHByZWNlZGluZyBjb250ZXh0IGxpbmVzIHRvIHNob3cgd2hlbiB3ZSBzdGFydAotICAgZGlzcGxheWluZyBhIGZpbGUgZm9yIHRoZSBmaXJzdCB0aW1lLiAgKi8KLQotI2RlZmluZSBTSE9XX1BSRUNFRElOR19DT05URVhUX0xJTkVTICg1KQotCi0vKiBTa2lwIGFoZWFkIHRvIGEgZ2l2ZW4gbGluZSBpbiBhIGZpbGUsIG9wdGlvbmFsbHkgcHJpbnRpbmcgZWFjaAotICAgbGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1za2lwX3RvX2xpbmUgUEFSQU1TICgoc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLXNraXBfdG9fbGluZSAocCwgbGluZSwgc2hvdykKLSAgICAgc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqcDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGJvb2xlYW4gc2hvdzsKLXsKLSAgd2hpbGUgKHAtPmxpbmUgPCBsaW5lKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgIGlmIChmZ2V0cyAoYnVmLCBzaXplb2YgYnVmLCBwLT5mKSA9PSBOVUxMKQotCXsKLQkgIGZjbG9zZSAocC0+Zik7Ci0JICBwLT5mID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNob3cpCi0JcHJpbnRmICgiJXMiLCBidWYpOwotCi0gICAgICBpZiAoc3RyY2hyIChidWYsICdcbicpICE9IE5VTEwpCi0JKytwLT5saW5lOwotICAgIH0KLX0gIAotCi0vKiBTaG93IHRoZSBsaW5lIG51bWJlciwgb3IgdGhlIHNvdXJjZSBsaW5lLCBpbiBhIGRpc3Nhc3NlbWJseQotICAgbGlzdGluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1zaG93X2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmY7Ci17Ci0gIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICBDT05TVCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotCi0gIGlmICghIHdpdGhfbGluZV9udW1iZXJzICYmICEgd2l0aF9zb3VyY2VfY29kZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1zLCBvZmYsICZmaWxlbmFtZSwKLQkJCSAgICAgICAmZnVuY3Rpb25uYW1lLCAmbGluZSkpCi0gICAgcmV0dXJuOwotCi0gIGlmIChmaWxlbmFtZSAhPSBOVUxMICYmICpmaWxlbmFtZSA9PSAnXDAnKQotICAgIGZpbGVuYW1lID0gTlVMTDsKLSAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMICYmICpmdW5jdGlvbm5hbWUgPT0gJ1wwJykKLSAgICBmdW5jdGlvbm5hbWUgPSBOVUxMOwotCi0gIGlmICh3aXRoX2xpbmVfbnVtYmVycykKLSAgICB7Ci0gICAgICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKLQkgICYmIChwcmV2X2Z1bmN0aW9ubmFtZSA9PSBOVUxMCi0JICAgICAgfHwgc3RyY21wIChmdW5jdGlvbm5hbWUsIHByZXZfZnVuY3Rpb25uYW1lKSAhPSAwKSkKLQlwcmludGYgKCIlcygpOlxuIiwgZnVuY3Rpb25uYW1lKTsKLSAgICAgIGlmIChsaW5lID4gMCAmJiBsaW5lICE9IHByZXZfbGluZSkKLQlwcmludGYgKCIlczoldVxuIiwgZmlsZW5hbWUgPT0gTlVMTCA/ICI/Pz8iIDogZmlsZW5hbWUsIGxpbmUpOwotICAgIH0KLQotICBpZiAod2l0aF9zb3VyY2VfY29kZQotICAgICAgJiYgZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgbGluZSA+IDApCi0gICAgewotICAgICAgc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqKnBwLCAqcDsKLQotICAgICAgZm9yIChwcCA9ICZwcmludF9maWxlczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCWlmIChzdHJjbXAgKCgqcHApLT5maWxlbmFtZSwgZmlsZW5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIHAgPSAqcHA7Ci0KLSAgICAgIGlmIChwICE9IE5VTEwpCi0JewotCSAgaWYgKHAgIT0gcHJpbnRfZmlsZXMpCi0JICAgIHsKLQkgICAgICBpbnQgbDsKLQotCSAgICAgIC8qIFdlIGhhdmUgcmVlbmNvdW50ZXJlZCBhIGZpbGUgbmFtZSB3aGljaCB3ZSBzYXcKLQkJIGVhcmxpZXIuICBUaGlzIGltcGxpZXMgdGhhdCBlaXRoZXIgd2UgYXJlIGR1bXBpbmcgb3V0Ci0JCSBjb2RlIGZyb20gYW4gaW5jbHVkZWQgZmlsZSwgb3IgdGhlIHNhbWUgZmlsZSB3YXMKLQkJIGxpbmtlZCBpbiBtb3JlIHRoYW4gb25jZS4gIFRoZXJlIGFyZSB0d28gY29tbW9uIGNhc2VzCi0JCSBvZiBhbiBpbmNsdWRlZCBmaWxlOiBpbmxpbmUgZnVuY3Rpb25zIGluIGEgaGVhZGVyCi0JCSBmaWxlLCBhbmQgYSBiaXNvbiBvciBmbGV4IHNrZWxldG9uIGZpbGUuICBJbiB0aGUKLQkJIGZvcm1lciBjYXNlIHdlIHdhbnQgdG8ganVzdCBzdGFydCBwcmludGluZyAoYnV0IHdlCi0JCSBiYWNrIHVwIGEgZmV3IGxpbmVzIHRvIGdpdmUgY29udGV4dCk7IGluIHRoZSBsYXR0ZXIKLQkJIGNhc2Ugd2Ugd2FudCB0byBjb250aW51ZSBmcm9tIHdoZXJlIHdlIGxlZnQgb2ZmLiAgSQotCQkgY2FuJ3QgdGhpbmsgb2YgYSBnb29kIHdheSB0byBkaXN0aW5ndWlzaCB0aGUgY2FzZXMsCi0JCSBzbyBJIHVzZWQgYSBoZXVyaXN0aWMgYmFzZWQgb24gdGhlIGZpbGUgbmFtZS4gICovCi0JICAgICAgaWYgKHN0cmNtcCAocC0+ZmlsZW5hbWUgKyBzdHJsZW4gKHAtPmZpbGVuYW1lKSAtIDIsICIuaCIpICE9IDApCi0JCWwgPSBwLT5saW5lOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGwgPSBsaW5lIC0gU0hPV19QUkVDRURJTkdfQ09OVEVYVF9MSU5FUzsKLQkJICBpZiAobCA8PSAwKQotCQkgICAgbCA9IDE7Ci0JCX0KLQotCSAgICAgIGlmIChwLT5mID09IE5VTEwpCi0JCXsKLQkJICBwLT5mID0gZm9wZW4gKHAtPmZpbGVuYW1lLCAiciIpOwotCQkgIHAtPmxpbmUgPSAwOwotCQl9Ci0JICAgICAgaWYgKHAtPmYgIT0gTlVMTCkKLQkJc2tpcF90b19saW5lIChwLCBsLCBmYWxzZSk7Ci0KLQkgICAgICBpZiAocHJpbnRfZmlsZXMtPmYgIT0gTlVMTCkKLQkJewotCQkgIGZjbG9zZSAocHJpbnRfZmlsZXMtPmYpOwotCQkgIHByaW50X2ZpbGVzLT5mID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChwLT5mICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBza2lwX3RvX2xpbmUgKHAsIGxpbmUsIHRydWUpOwotCSAgICAgICpwcCA9IHAtPm5leHQ7Ci0JICAgICAgcC0+bmV4dCA9IHByaW50X2ZpbGVzOwotCSAgICAgIHByaW50X2ZpbGVzID0gcDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBGSUxFICpmOwotCi0JICBmID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGludCBsOwotCi0JICAgICAgcCA9ICgoc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqKQotCQkgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBwcmludF9maWxlX2xpc3QpKSk7Ci0JICAgICAgcC0+ZmlsZW5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKSArIDEpOwotCSAgICAgIHN0cmNweSAocC0+ZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQkgICAgICBwLT5saW5lID0gMDsKLQkgICAgICBwLT5mID0gZjsKLQotCSAgICAgIGlmIChwcmludF9maWxlcyAhPSBOVUxMICYmIHByaW50X2ZpbGVzLT5mICE9IE5VTEwpCi0JCXsKLQkJICBmY2xvc2UgKHByaW50X2ZpbGVzLT5mKTsKLQkJICBwcmludF9maWxlcy0+ZiA9IE5VTEw7Ci0JCX0KLQkgICAgICBwLT5uZXh0ID0gcHJpbnRfZmlsZXM7Ci0JICAgICAgcHJpbnRfZmlsZXMgPSBwOwotCi0JICAgICAgbCA9IGxpbmUgLSBTSE9XX1BSRUNFRElOR19DT05URVhUX0xJTkVTOwotCSAgICAgIGlmIChsIDw9IDApCi0JCWwgPSAxOwotCSAgICAgIHNraXBfdG9fbGluZSAocCwgbCwgZmFsc2UpOwotCSAgICAgIGlmIChwLT5mICE9IE5VTEwpCi0JCXNraXBfdG9fbGluZSAocCwgbGluZSwgdHJ1ZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTAotICAgICAgJiYgKHByZXZfZnVuY3Rpb25uYW1lID09IE5VTEwKLQkgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBwcmV2X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCi0gICAgewotICAgICAgaWYgKHByZXZfZnVuY3Rpb25uYW1lICE9IE5VTEwpCi0JZnJlZSAocHJldl9mdW5jdGlvbm5hbWUpOwotICAgICAgcHJldl9mdW5jdGlvbm5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGZ1bmN0aW9ubmFtZSkgKyAxKTsKLSAgICAgIHN0cmNweSAocHJldl9mdW5jdGlvbm5hbWUsIGZ1bmN0aW9ubmFtZSk7Ci0gICAgfQotCi0gIGlmIChsaW5lID4gMCAmJiBsaW5lICE9IHByZXZfbGluZSkKLSAgICBwcmV2X2xpbmUgPSBsaW5lOwotfQotCi0vKiBQc2V1ZG8gRklMRSBvYmplY3QgZm9yIHN0cmluZ3MuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY2hhciAqYnVmZmVyOwotICBzaXplX3Qgc2l6ZTsKLSAgY2hhciAqY3VycmVudDsKLX0gU0ZJTEU7Ci0KLS8qIHNwcmludGYgdG8gYSAic3RyZWFtIiAqLwotCi1zdGF0aWMgaW50Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1vYmpkdW1wX3NwcmludGYgKFNGSUxFICpmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLSNlbHNlCi1vYmpkdW1wX3NwcmludGYgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgU0ZJTEUgKmY7Ci0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSNlbmRpZgotICBjaGFyICpidWY7Ci0gIHZhX2xpc3QgYXJnczsKLSAgc2l6ZV90IG47Ci0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0gIGYgPSB2YV9hcmcgKGFyZ3MsIFNGSUxFICopOwotICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotICB2YXNwcmludGYgKCZidWYsIGZvcm1hdCwgYXJncyk7Ci0KLSAgdmFfZW5kIChhcmdzKTsKLQotICBpZiAoYnVmID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJPdXQgb2YgdmlydHVhbCBtZW1vcnlcbiIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBuID0gc3RybGVuIChidWYpOwotCi0gIHdoaWxlICgoZi0+YnVmZmVyICsgZi0+c2l6ZSkgLSBmLT5jdXJyZW50IDwgbiArIDEpCi0gICAgewotICAgICAgc2l6ZV90IGN1cnJvZmY7Ci0KLSAgICAgIGN1cnJvZmYgPSBmLT5jdXJyZW50IC0gZi0+YnVmZmVyOwotICAgICAgZi0+c2l6ZSAqPSAyOwotICAgICAgZi0+YnVmZmVyID0geHJlYWxsb2MgKGYtPmJ1ZmZlciwgZi0+c2l6ZSk7Ci0gICAgICBmLT5jdXJyZW50ID0gZi0+YnVmZmVyICsgY3Vycm9mZjsKLSAgICB9Ci0KLSAgbWVtY3B5IChmLT5jdXJyZW50LCBidWYsIG4pOwotICBmLT5jdXJyZW50ICs9IG47Ci0gIGYtPmN1cnJlbnRbMF0gPSAnXDAnOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIG47Ci19Ci0KLS8qIFRoZSBudW1iZXIgb2YgemVyb2VzIHdlIHdhbnQgdG8gc2VlIGJlZm9yZSB3ZSBzdGFydCBza2lwcGluZyB0aGVtLgotICAgVGhlIG51bWJlciBpcyBhcmJpdHJhcmlseSBjaG9zZW4uICAqLwotCi0jZGVmaW5lIFNLSVBfWkVST0VTICg4KQotCi0vKiBUaGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgSWYgdGhlCi0gICBudW1iZXIgb2YgemVyb2VzIGF0IHRoZSBlbmQgaXMgYmV0d2VlbiBTS0lQX1pFUk9FU19BVF9FTkQgYW5kCi0gICBTS0lQX1pFUk9FUywgdGhleSB3aWxsIGJlIGRpc2Fzc2VtYmxlZC4gIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuCi0gICBTS0lQX1pFUk9FU19BVF9FTkQsIHRoZXkgd2lsbCBiZSBza2lwcGVkLiAgVGhpcyBpcyBhIGhldXJpc3RpYwotICAgYXR0ZW1wdCB0byBhdm9pZCBkaXNhc3NlbWJsaW5nIHplcm9lcyBpbnNlcnRlZCBieSBzZWN0aW9uCi0gICBhbGlnbm1lbnQuICAqLwotCi0jZGVmaW5lIFNLSVBfWkVST0VTX0FUX0VORCAoMykKLQotLyogRGlzYXNzZW1ibGUgc29tZSBkYXRhIGluIG1lbW9yeSBiZXR3ZWVuIGdpdmVuIHZhbHVlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9ieXRlcyAoaW5mbywgZGlzYXNzZW1ibGVfZm4sIGluc25zLCBkYXRhLCBzdGFydCwgc3RvcCwgcmVscHBwLAotCQkgICByZWxwcGVuZCkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZV9mbjsKLSAgICAgYm9vbGVhbiBpbnNuczsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgIGJmZF92bWEgc3RvcDsKLSAgICAgYXJlbGVudCAqKipyZWxwcHA7Ci0gICAgIGFyZWxlbnQgKipyZWxwcGVuZDsKLXsKLSAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKmF1eDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGludCBieXRlc19wZXJfbGluZTsKLSAgYm9vbGVhbiBkb25lX2RvdDsKLSAgaW50IHNraXBfYWRkcl9jaGFyczsKLSAgYmZkX3ZtYSBpOwotCi0gIGF1eCA9IChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOwotICBzZWN0aW9uID0gYXV4LT5zZWM7Ci0KLSAgaWYgKGluc25zKQotICAgIGJ5dGVzX3Blcl9saW5lID0gNDsKLSAgZWxzZQotICAgIGJ5dGVzX3Blcl9saW5lID0gMTY7Ci0KLSAgLyogRmlndXJlIG91dCBob3cgbWFueSBjaGFyYWN0ZXJzIHRvIHNraXAgYXQgdGhlIHN0YXJ0IG9mIGFuCi0gICAgIGFkZHJlc3MsIHRvIG1ha2UgdGhlIGRpc2Fzc2VtYmx5IGxvb2sgbmljZXIuICBXZSBkaXNjYXJkIGxlYWRpbmcKLSAgICAgemVyb2VzIGluIGNodW5rcyBvZiA0LCBlbnN1cmluZyB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhIGxlYWRpbmcKLSAgICAgemVybyByZW1haW5pbmcuICAqLwotICBza2lwX2FkZHJfY2hhcnMgPSAwOwotICBpZiAoISBwcmVmaXhfYWRkcmVzc2VzKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzMwXTsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIHNwcmludGZfdm1hIChidWYsCi0JCSAgIHNlY3Rpb24tPnZtYSArIGJmZF9zZWN0aW9uX3NpemUgKHNlY3Rpb24tPm93bmVyLCBzZWN0aW9uKSk7Ci0gICAgICBzID0gYnVmOwotICAgICAgd2hpbGUgKHNbMF0gPT0gJzAnICYmIHNbMV0gPT0gJzAnICYmIHNbMl0gPT0gJzAnICYmIHNbM10gPT0gJzAnCi0JICAgICAmJiBzWzRdID09ICcwJykKLQl7Ci0JICBza2lwX2FkZHJfY2hhcnMgKz0gNDsKLQkgIHMgKz0gNDsKLQl9Ci0gICAgfQotCi0gIGluZm8tPmluc25faW5mb192YWxpZCA9IDA7Ci0KLSAgZG9uZV9kb3QgPSBmYWxzZTsKLSAgaSA9IHN0YXJ0OwotICB3aGlsZSAoaSA8IHN0b3ApCi0gICAgewotICAgICAgYmZkX3ZtYSB6OwotICAgICAgaW50IGJ5dGVzID0gMDsKLSAgICAgIGJvb2xlYW4gbmVlZF9ubCA9IGZhbHNlOwotCi0gICAgICAvKiBJZiB3ZSBzZWUgbW9yZSB0aGFuIFNLSVBfWkVST0VTIGJ5dGVzIG9mIHplcm9lcywgd2UganVzdAotICAgICAgICAgcHJpbnQgYC4uLicuICAqLwotICAgICAgZm9yICh6ID0gaTsgeiA8IHN0b3A7IHorKykKLQlpZiAoZGF0YVt6XSAhPSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoISBkaXNhc3NlbWJsZV96ZXJvZXMKLQkgICYmIChpbmZvLT5pbnNuX2luZm9fdmFsaWQgPT0gMAotCSAgICAgIHx8IGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9PSAwKQotCSAgJiYgKHogLSBpID49IFNLSVBfWkVST0VTCi0JICAgICAgfHwgKHogPT0gc3RvcCAmJiB6IC0gaSA8IFNLSVBfWkVST0VTX0FUX0VORCkpKQotCXsKLQkgIHByaW50ZiAoIlx0Li4uXG4iKTsKLQotCSAgLyogSWYgdGhlcmUgYXJlIG1vcmUgbm9uemVybyBieXRlcyB0byBmb2xsb3csIHdlIG9ubHkgc2tpcAotICAgICAgICAgICAgIHplcm9lcyBpbiBtdWx0aXBsZXMgb2YgNCwgdG8gdHJ5IHRvIGF2b2lkIHJ1bm5pbmcgb3ZlcgotICAgICAgICAgICAgIHRoZSBzdGFydCBvZiBhbiBpbnN0cnVjdGlvbiB3aGljaCBoYXBwZW5zIHRvIHN0YXJ0IHdpdGgKLSAgICAgICAgICAgICB6ZXJvLiAgKi8KLQkgIGlmICh6ICE9IHN0b3ApCi0JICAgIHogPSBpICsgKCh6IC0gaSkgJn4gMyk7Ci0KLQkgIGJ5dGVzID0geiAtIGk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYnVmWzUwXTsKLQkgIFNGSUxFIHNmaWxlOwotCSAgaW50IGJwYyA9IDA7Ci0JICBpbnQgcGIgPSAwOwotCi0JICBkb25lX2RvdCA9IGZhbHNlOwotCi0JICBpZiAod2l0aF9saW5lX251bWJlcnMgfHwgd2l0aF9zb3VyY2VfY29kZSkKLQkgICAgc2hvd19saW5lIChhdXgtPmFiZmQsIHNlY3Rpb24sIGkpOwotCi0JICBpZiAoISBwcmVmaXhfYWRkcmVzc2VzKQotCSAgICB7Ci0JICAgICAgY2hhciAqczsKLQotCSAgICAgIHNwcmludGZfdm1hIChidWYsIHNlY3Rpb24tPnZtYSArIGkpOwotCSAgICAgIGZvciAocyA9IGJ1ZiArIHNraXBfYWRkcl9jaGFyczsgKnMgPT0gJzAnOyBzKyspCi0JCSpzID0gJyAnOwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQkqLS1zID0gJzAnOwotCSAgICAgIHByaW50ZiAoIiVzOlx0IiwgYnVmICsgc2tpcF9hZGRyX2NoYXJzKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXV4LT5yZXF1aXJlX3NlYyA9IHRydWU7Ci0JICAgICAgb2JqZHVtcF9wcmludF9hZGRyZXNzIChzZWN0aW9uLT52bWEgKyBpLCBpbmZvKTsKLQkgICAgICBhdXgtPnJlcXVpcmVfc2VjID0gZmFsc2U7Ci0JICAgICAgcHV0Y2hhciAoJyAnKTsKLQkgICAgfQotCi0JICBpZiAoaW5zbnMpCi0JICAgIHsKLQkgICAgICBzZmlsZS5zaXplID0gMTIwOwotCSAgICAgIHNmaWxlLmJ1ZmZlciA9IHhtYWxsb2MgKHNmaWxlLnNpemUpOwotCSAgICAgIHNmaWxlLmN1cnJlbnQgPSBzZmlsZS5idWZmZXI7Ci0JICAgICAgaW5mby0+ZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpIG9iamR1bXBfc3ByaW50ZjsKLQkgICAgICBpbmZvLT5zdHJlYW0gPSAoRklMRSAqKSAmc2ZpbGU7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSAwOwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDA7Ci0KLQkgICAgICAvKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIEl0IHRlc3RzIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgICAgICAgaW4gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUgY3VycmVudCBvbmUuICAqLwotCSAgICAgIGlmICgqcmVscHBwIDwgcmVscHBlbmQKLQkJICAmJiAoKipyZWxwcHApLT5hZGRyZXNzID49IGkKLQkJICAmJiAoKipyZWxwcHApLT5hZGRyZXNzIDwgaSArIGJ5dGVzKQotCQlpbmZvLT5mbGFncyA9IElOU05fSEFTX1JFTE9DOwotCSAgICAgIGVsc2UKLQkJaW5mby0+ZmxhZ3MgPSAwOwotCi0JICAgICAgYnl0ZXMgPSAoKmRpc2Fzc2VtYmxlX2ZuKSAoc2VjdGlvbi0+dm1hICsgaSwgaW5mbyk7Ci0JICAgICAgaW5mby0+ZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpIGZwcmludGY7Ci0JICAgICAgaW5mby0+c3RyZWFtID0gc3Rkb3V0OwotCSAgICAgIGlmIChpbmZvLT5ieXRlc19wZXJfbGluZSAhPSAwKQotCQlieXRlc19wZXJfbGluZSA9IGluZm8tPmJ5dGVzX3Blcl9saW5lOwotCSAgICAgIGlmIChieXRlcyA8IDApCi0JCXsKLQkJICBpZiAoc2ZpbGUuY3VycmVudCAhPSBzZmlsZS5idWZmZXIpCi0JCSAgICBwcmludGYgKCIlc1xuIiwgc2ZpbGUuYnVmZmVyKTsKLQkJICBmcmVlIChzZmlsZS5idWZmZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxvbmcgajsKLQotCSAgICAgIGJ5dGVzID0gYnl0ZXNfcGVyX2xpbmU7Ci0JICAgICAgaWYgKGkgKyBieXRlcyA+IHN0b3ApCi0JCWJ5dGVzID0gc3RvcCAtIGk7Ci0KLQkgICAgICBmb3IgKGogPSBpOyBqIDwgaSArIGJ5dGVzOyArK2opCi0JCXsKLQkJICBpZiAoaXNwcmludCAoZGF0YVtqXSkpCi0JCSAgICBidWZbaiAtIGldID0gZGF0YVtqXTsKLQkJICBlbHNlCi0JCSAgICBidWZbaiAtIGldID0gJy4nOwotCQl9Ci0JICAgICAgYnVmW2ogLSBpXSA9ICdcMCc7Ci0JICAgIH0KLQotCSAgaWYgKHByZWZpeF9hZGRyZXNzZXMKLQkgICAgICA/IHNob3dfcmF3X2luc24gPiAwCi0JICAgICAgOiBzaG93X3Jhd19pbnNuID49IDApCi0JICAgIHsKLQkgICAgICBsb25nIGo7Ci0KLQkgICAgICAvKiBJZiAhIHByZWZpeF9hZGRyZXNzZXMgYW5kICEgd2lkZV9vdXRwdXQsIHdlIHByaW50Ci0gICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9saW5lIGJ5dGVzIHBlciBsaW5lLiAgKi8KLQkgICAgICBwYiA9IGJ5dGVzOwotCSAgICAgIGlmIChwYiA+IGJ5dGVzX3Blcl9saW5lICYmICEgcHJlZml4X2FkZHJlc3NlcyAmJiAhIHdpZGVfb3V0cHV0KQotCQlwYiA9IGJ5dGVzX3Blcl9saW5lOwotCi0JICAgICAgaWYgKGluZm8tPmJ5dGVzX3Blcl9jaHVuaykKLQkJYnBjID0gaW5mby0+Ynl0ZXNfcGVyX2NodW5rOwotCSAgICAgIGVsc2UKLQkJYnBjID0gMTsKLQotCSAgICAgIGZvciAoaiA9IGk7IGogPCBpICsgcGI7IGogKz0gYnBjKQotCQl7Ci0JCSAgaW50IGs7Ci0JCSAgaWYgKGJwYyA+IDEgJiYgaW5mby0+ZGlzcGxheV9lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0JCSAgICB7Ci0JCSAgICAgIGZvciAoayA9IGJwYyAtIDE7IGsgPj0gMDsgay0tKQotCQkJcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOwotCQkgICAgICBwdXRjaGFyICgnICcpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZm9yIChrID0gMDsgayA8IGJwYzsgaysrKQotCQkJcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOwotCQkgICAgICBwdXRjaGFyICgnICcpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmb3IgKDsgcGIgPCBieXRlc19wZXJfbGluZTsgcGIgKz0gYnBjKQotCQl7Ci0JCSAgaW50IGs7Ci0KLQkJICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCi0JCSAgICBwcmludGYgKCIgICIpOwotCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCX0KLQotCSAgICAgIC8qIFNlcGFyYXRlIHJhdyBkYXRhIGZyb20gaW5zdHJ1Y3Rpb24gYnkgZXh0cmEgc3BhY2UuICAqLwotCSAgICAgIGlmIChpbnNucykKLQkJcHV0Y2hhciAoJ1x0Jyk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIgICAgIik7Ci0JICAgIH0KLQotCSAgaWYgKCEgaW5zbnMpCi0JICAgIHByaW50ZiAoIiVzIiwgYnVmKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzIiwgc2ZpbGUuYnVmZmVyKTsKLQkgICAgICBmcmVlIChzZmlsZS5idWZmZXIpOwotCSAgICB9Ci0KLQkgIGlmIChwcmVmaXhfYWRkcmVzc2VzCi0JICAgICAgPyBzaG93X3Jhd19pbnNuID4gMAotCSAgICAgIDogc2hvd19yYXdfaW5zbiA+PSAwKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHBiIDwgYnl0ZXMpCi0JCXsKLQkJICBsb25nIGo7Ci0JCSAgY2hhciAqczsKLQotCQkgIHB1dGNoYXIgKCdcbicpOwotCQkgIGogPSBpICsgcGI7Ci0KLQkJICBzcHJpbnRmX3ZtYSAoYnVmLCBzZWN0aW9uLT52bWEgKyBqKTsKLQkJICBmb3IgKHMgPSBidWYgKyBza2lwX2FkZHJfY2hhcnM7ICpzID09ICcwJzsgcysrKQotCQkgICAgKnMgPSAnICc7Ci0JCSAgaWYgKCpzID09ICdcMCcpCi0JCSAgICAqLS1zID0gJzAnOwotCQkgIHByaW50ZiAoIiVzOlx0IiwgYnVmICsgc2tpcF9hZGRyX2NoYXJzKTsKLQotCQkgIHBiICs9IGJ5dGVzX3Blcl9saW5lOwotCQkgIGlmIChwYiA+IGJ5dGVzKQotCQkgICAgcGIgPSBieXRlczsKLQkJICBmb3IgKDsgaiA8IGkgKyBwYjsgaiArPSBicGMpCi0JCSAgICB7Ci0JCSAgICAgIGludCBrOwotCi0JCSAgICAgIGlmIChicGMgPiAxICYmIGluZm8tPmRpc3BsYXlfZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCQkJewotCQkJICBmb3IgKGsgPSBicGMgLSAxOyBrID49IDA7IGstLSkKLQkJCSAgICBwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZm9yIChrID0gMDsgayA8IGJwYzsgaysrKQotCQkJICAgIHByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIGRhdGFbaiArIGtdKTsKLQkJCSAgcHV0Y2hhciAoJyAnKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmICghd2lkZV9vdXRwdXQpCi0JICAgIHB1dGNoYXIgKCdcbicpOwotCSAgZWxzZQotCSAgICBuZWVkX25sID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmIChkdW1wX3JlbG9jX2luZm8KLQkgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICB3aGlsZSAoKCpyZWxwcHApIDwgcmVscHBlbmQKLQkJICYmICgoKipyZWxwcHApLT5hZGRyZXNzID49IChiZmRfdm1hKSBpCi0JCSAgICAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA8IChiZmRfdm1hKSBpICsgYnl0ZXMpKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqcTsKLQotCSAgICAgIHEgPSAqKnJlbHBwcDsKLQotCSAgICAgIGlmICh3aWRlX291dHB1dCkKLQkJcHV0Y2hhciAoJ1x0Jyk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCJcdFx0XHQiKTsKLQotCSAgICAgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHNlY3Rpb24tPnZtYSArIHEtPmFkZHJlc3MsIGluZm8sIHRydWUpOwotCi0JICAgICAgcHJpbnRmICgiOiAlc1x0IiwgcS0+aG93dG8tPm5hbWUpOwotCi0JICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyID09IE5VTEwgfHwgKnEtPnN5bV9wdHJfcHRyID09IE5VTEwpCi0JCXByaW50ZiAoIip1bmtub3duKiIpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0JCSAgc3ltX25hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpOwotCQkgIGlmIChzeW1fbmFtZSAhPSBOVUxMICYmICpzeW1fbmFtZSAhPSAnXDAnKQotCQkgICAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhdXgtPmFiZmQsIGluZm8sICpxLT5zeW1fcHRyX3B0cik7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQotCQkgICAgICBzeW1fc2VjID0gYmZkX2dldF9zZWN0aW9uICgqcS0+c3ltX3B0cl9wdHIpOwotCQkgICAgICBzeW1fbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhdXgtPmFiZmQsIHN5bV9zZWMpOwotCQkgICAgICBpZiAoc3ltX25hbWUgPT0gTlVMTCB8fCAqc3ltX25hbWUgPT0gJ1wwJykKLQkJCXN5bV9uYW1lID0gIip1bmtub3duKiI7Ci0JCSAgICAgIHByaW50ZiAoIiVzIiwgc3ltX25hbWUpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAocS0+YWRkZW5kKQotCQl7Ci0JCSAgcHJpbnRmICgiKzB4Iik7Ci0JCSAgb2JqZHVtcF9wcmludF92YWx1ZSAocS0+YWRkZW5kLCBpbmZvLCB0cnVlKTsKLQkJfQotCi0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgICBuZWVkX25sID0gZmFsc2U7Ci0JICAgICAgKysoKnJlbHBwcCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChuZWVkX25sKQotCXByaW50ZiAoIlxuIik7Ci0KLSAgICAgIGkgKz0gYnl0ZXM7Ci0gICAgfQotfQotCi0vKiBEaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIGk7Ci0gIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZV9mbjsKLSAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGlzYXNtX2luZm87Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvIGF1eDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgcHJpbnRfZmlsZXMgPSBOVUxMOwotICBwcmV2X2Z1bmN0aW9ubmFtZSA9IE5VTEw7Ci0gIHByZXZfbGluZSA9IC0xOwotCi0gIC8qIFdlIG1ha2UgYSBjb3B5IG9mIHN5bXMgdG8gc29ydC4gIFdlIGRvbid0IHdhbnQgdG8gc29ydCBzeW1zCi0gICAgIGJlY2F1c2UgdGhhdCB3aWxsIHNjcmV3IHVwIHRoZSByZWxvY3MuICAqLwotICBzb3J0ZWRfc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG1lbWNweSAoc29ydGVkX3N5bXMsIHN5bXMsIHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLQotICBzb3J0ZWRfc3ltY291bnQgPSByZW1vdmVfdXNlbGVzc19zeW1ib2xzIChzb3J0ZWRfc3ltcywgc3ltY291bnQpOwotCi0gIC8qIFNvcnQgdGhlIHN5bWJvbHMgaW50byBzZWN0aW9uIGFuZCBzeW1ib2wgb3JkZXIgKi8KLSAgcXNvcnQgKHNvcnRlZF9zeW1zLCBzb3J0ZWRfc3ltY291bnQsIHNpemVvZiAoYXN5bWJvbCAqKSwgY29tcGFyZV9zeW1ib2xzKTsKLQotICBJTklUX0RJU0FTU0VNQkxFX0lORk8oZGlzYXNtX2luZm8sIHN0ZG91dCwgZnByaW50Zik7Ci0gIGRpc2FzbV9pbmZvLmFwcGxpY2F0aW9uX2RhdGEgPSAoUFRSKSAmYXV4OwotICBhdXguYWJmZCA9IGFiZmQ7Ci0gIGF1eC5yZXF1aXJlX3NlYyA9IGZhbHNlOwotICBkaXNhc21faW5mby5wcmludF9hZGRyZXNzX2Z1bmMgPSBvYmpkdW1wX3ByaW50X2FkZHJlc3M7Ci0gIGRpc2FzbV9pbmZvLnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgPSBvYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzOwotCi0gIGlmIChtYWNoaW5lICE9IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICppbmZvID0gYmZkX3NjYW5fYXJjaCAobWFjaGluZSk7Ci0gICAgICBpZiAoaW5mbyA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IHVzZSBzdXBwbGllZCBtYWNoaW5lICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLAotCQkgICBtYWNoaW5lKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIGFiZmQtPmFyY2hfaW5mbyA9IGluZm87Ci0gICAgfQotCi0gIGlmIChlbmRpYW4gIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfdGFyZ2V0ICp4dmVjOwotCi0gICAgICB4dmVjID0gKHN0cnVjdCBiZmRfdGFyZ2V0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF90YXJnZXQpKTsKLSAgICAgIG1lbWNweSAoeHZlYywgYWJmZC0+eHZlYywgc2l6ZW9mIChzdHJ1Y3QgYmZkX3RhcmdldCkpOwotICAgICAgeHZlYy0+Ynl0ZW9yZGVyID0gZW5kaWFuOwotICAgICAgYWJmZC0+eHZlYyA9IHh2ZWM7Ci0gICAgfQotCi0gIGRpc2Fzc2VtYmxlX2ZuID0gZGlzYXNzZW1ibGVyIChhYmZkKTsKLSAgaWYgKCFkaXNhc3NlbWJsZV9mbikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBkaXNhc3NlbWJsZSBmb3IgYXJjaGl0ZWN0dXJlICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLAotCSAgICAgICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYmZkX2dldF9hcmNoIChhYmZkKSwgMCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkaXNhc21faW5mby5mbGF2b3VyID0gYmZkX2dldF9mbGF2b3VyIChhYmZkKTsKLSAgZGlzYXNtX2luZm8uYXJjaCA9IGJmZF9nZXRfYXJjaCAoYWJmZCk7Ci0gIGRpc2FzbV9pbmZvLm1hY2ggPSBiZmRfZ2V0X21hY2ggKGFiZmQpOwotICBkaXNhc21faW5mby5kaXNhc3NlbWJsZXJfb3B0aW9ucyA9IGRpc2Fzc2VtYmxlcl9vcHRpb25zOwotICAKLSAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICBkaXNhc21faW5mby5kaXNwbGF5X2VuZGlhbiA9IGRpc2FzbV9pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotICBlbHNlIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgZGlzYXNtX2luZm8uZGlzcGxheV9lbmRpYW4gPSBkaXNhc21faW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLSAgZWxzZQotICAgIC8qID8/PyBBYm9ydGluZyBoZXJlIHNlZW1zIHRvbyBkcmFzdGljLiAgV2UgY291bGQgZGVmYXVsdCB0byBiaWcgb3IgbGl0dGxlCi0gICAgICAgaW5zdGVhZC4gICovCi0gICAgZGlzYXNtX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIHNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmRhdGEgPSBOVUxMOwotICAgICAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gICAgICBhcmVsZW50ICoqcmVsYnVmID0gTlVMTDsKLSAgICAgIGFyZWxlbnQgKipyZWxwcCA9IE5VTEw7Ci0gICAgICBhcmVsZW50ICoqcmVscHBlbmQgPSBOVUxMOwotICAgICAgbG9uZyBzdG9wOwotICAgICAgYXN5bWJvbCAqc3ltID0gTlVMTDsKLSAgICAgIGxvbmcgcGxhY2UgPSAwOwotCi0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkgIHx8ICghIGRpc2Fzc2VtYmxlX2FsbAotCSAgICAgICYmIG9ubHkgPT0gTlVMTAotCSAgICAgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChvbmx5ICE9IChjaGFyICopIE5VTEwgJiYgc3RyY21wIChvbmx5LCBzZWN0aW9uLT5uYW1lKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZHVtcF9yZWxvY19pbmZvCi0JICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgbG9uZyByZWxzaXplOwotCi0JICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbik7Ci0JICBpZiAocmVsc2l6ZSA8IDApCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0JICBpZiAocmVsc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICBsb25nIHJlbGNvdW50OwotCi0JICAgICAgcmVsYnVmID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotCSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVsYnVmLCBzeW1zKTsKLQkgICAgICBpZiAocmVsY291bnQgPCAwKQotCQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotCSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jcyBieSBhZGRyZXNzLiAgKi8KLQkgICAgICBxc29ydCAocmVsYnVmLCByZWxjb3VudCwgc2l6ZW9mIChhcmVsZW50ICopLCBjb21wYXJlX3JlbG9jcyk7Ci0KLQkgICAgICByZWxwcCA9IHJlbGJ1ZjsKLQkgICAgICByZWxwcGVuZCA9IHJlbHBwICsgcmVsY291bnQ7Ci0KLQkgICAgICAvKiBTa2lwIG92ZXIgdGhlIHJlbG9jcyBiZWxvbmdpbmcgdG8gYWRkcmVzc2VzIGJlbG93IHRoZQotCQkgc3RhcnQgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgd2hpbGUgKHJlbHBwIDwgcmVscHBlbmQKLQkJCSAmJiAoKnJlbHBwKS0+YWRkcmVzcyA8IHN0YXJ0X2FkZHJlc3MpCi0JCSAgICArK3JlbHBwOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAlczpcbiIpLCBzZWN0aW9uLT5uYW1lKTsKLQotICAgICAgZGF0YXNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOwotICAgICAgaWYgKGRhdGFzaXplID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoKHNpemVfdCkgZGF0YXNpemUpOwotCi0gICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGRhdGEsIDAsIGRhdGFzaXplKTsKLQotICAgICAgYXV4LnNlYyA9IHNlY3Rpb247Ci0gICAgICBkaXNhc21faW5mby5idWZmZXIgPSBkYXRhOwotICAgICAgZGlzYXNtX2luZm8uYnVmZmVyX3ZtYSA9IHNlY3Rpb24tPnZtYTsKLSAgICAgIGRpc2FzbV9pbmZvLmJ1ZmZlcl9sZW5ndGggPSBkYXRhc2l6ZTsKLSAgICAgIGlmIChzdGFydF9hZGRyZXNzID09IChiZmRfdm1hKSAtMQotCSAgfHwgc3RhcnRfYWRkcmVzcyA8IGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWEpCi0JaSA9IDA7Ci0gICAgICBlbHNlCi0JaSA9IHN0YXJ0X2FkZHJlc3MgLSBkaXNhc21faW5mby5idWZmZXJfdm1hOwotICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCi0Jc3RvcCA9IGRhdGFzaXplOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzdG9wX2FkZHJlc3MgPCBkaXNhc21faW5mby5idWZmZXJfdm1hKQotCSAgICBzdG9wID0gMDsKLQkgIGVsc2UKLQkgICAgc3RvcCA9IHN0b3BfYWRkcmVzcyAtIGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWE7Ci0JICBpZiAoc3RvcCA+IGRpc2FzbV9pbmZvLmJ1ZmZlcl9sZW5ndGgpCi0JICAgIHN0b3AgPSBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoOwotCX0KLQotICAgICAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnZtYSArIGksCi0JCQkJICAgICB0cnVlLCAmcGxhY2UpOwotCi0gICAgICB3aGlsZSAoaSA8IHN0b3ApCi0JewotCSAgYXN5bWJvbCAqbmV4dHN5bTsKLQkgIGxvbmcgbmV4dHN0b3A7Ci0JICBib29sZWFuIGluc25zOwotCSAgCi0JICBpZiAoc3ltICE9IE5VTEwgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPD0gc2VjdGlvbi0+dm1hICsgaSkKLQkgICAgewotCSAgICAgIGludCB4OwotCi0JICAgICAgZm9yICh4ID0gcGxhY2U7Ci0JCSAgICh4IDwgc29ydGVkX3N5bWNvdW50Ci0JCSAgICAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbeF0pIDw9IHNlY3Rpb24tPnZtYSArIGkpOwotCQkgICArK3gpCi0JCWNvbnRpbnVlOwotCSAgICAgIGRpc2FzbV9pbmZvLnN5bWJvbHMgPSAmIHNvcnRlZF9zeW1zW3BsYWNlXTsKLQkgICAgICBkaXNhc21faW5mby5udW1fc3ltYm9scyA9IHggLSBwbGFjZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBkaXNhc21faW5mby5zeW1ib2xzID0gTlVMTDsKLQotCSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhYmZkLCBzZWN0aW9uLCBzeW0sCi0JCQkJCSAgIHNlY3Rpb24tPnZtYSArIGksCi0JCQkJCSAgICZkaXNhc21faW5mbywKLQkJCQkJICAgZmFsc2UpOwotCSAgICAgIHByaW50ZiAoIjpcbiIpOwotCSAgICB9Ci0JICAKLQkgIGlmIChzeW0gIT0gTlVMTCAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGkpCi0JICAgIG5leHRzeW0gPSBzeW07Ci0JICBlbHNlIGlmIChzeW0gPT0gTlVMTCkKLQkgICAgbmV4dHN5bSA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aGlsZSAocGxhY2UgPCBzb3J0ZWRfc3ltY291bnQKLQkJICAgICAvKiA/Pz8gV2h5IHRoZSB0ZXN0IGZvciAhPSBzZWN0aW9uPyAgKi8KLQkJICAgICAmJiAoc29ydGVkX3N5bXNbcGxhY2VdLT5zZWN0aW9uICE9IHNlY3Rpb24KLQkJCSB8fCAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3BsYWNlXSkKLQkJCSAgICAgPD0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKSkKLQkJKytwbGFjZTsKLQkgICAgICBpZiAocGxhY2UgPj0gc29ydGVkX3N5bWNvdW50KQotCQluZXh0c3ltID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCW5leHRzeW0gPSBzb3J0ZWRfc3ltc1twbGFjZV07Ci0JICAgIH0KLQkgIAotCSAgaWYgKHN5bSAhPSBOVUxMICYmIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gc2VjdGlvbi0+dm1hICsgaSkKLQkgICAgewotCSAgICAgIG5leHRzdG9wID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgaWYgKG5leHRzdG9wID4gc3RvcCkKLQkJbmV4dHN0b3AgPSBzdG9wOwotCSAgICB9Ci0JICBlbHNlIGlmIChuZXh0c3ltID09IE5VTEwpCi0JICAgIG5leHRzdG9wID0gc3RvcDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5leHRzdG9wID0gYmZkX2FzeW1ib2xfdmFsdWUgKG5leHRzeW0pIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIGlmIChuZXh0c3RvcCA+IHN0b3ApCi0JCW5leHRzdG9wID0gc3RvcDsKLQkgICAgfQotCSAgCi0JICAvKiBJZiBhIHN5bWJvbCBpcyBleHBsaWNpdGx5IG1hcmtlZCBhcyBiZWluZyBhbiBvYmplY3QKLQkgICAgIHJhdGhlciB0aGFuIGEgZnVuY3Rpb24sIGp1c3QgZHVtcCB0aGUgYnl0ZXMgd2l0aG91dAotCSAgICAgZGlzYXNzZW1ibGluZyB0aGVtLiAgKi8KLQkgIGlmIChkaXNhc3NlbWJsZV9hbGwKLQkgICAgICB8fCBzeW0gPT0gTlVMTAotCSAgICAgIHx8IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gc2VjdGlvbi0+dm1hICsgaQotCSAgICAgIHx8ICgoc3ltLT5mbGFncyAmIEJTRl9PQkpFQ1QpID09IDAKLQkJICAmJiAoc3Ryc3RyIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiZ251X2NvbXBpbGVkIikKLQkJICAgICAgPT0gTlVMTCkKLQkJICAmJiAoc3Ryc3RyIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiZ2NjMl9jb21waWxlZCIpCi0JCSAgICAgID09IE5VTEwpKQotCSAgICAgIHx8IChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCSAgICBpbnNucyA9IHRydWU7Ci0JICBlbHNlCi0JICAgIGluc25zID0gZmFsc2U7Ci0JICAKLQkgIGRpc2Fzc2VtYmxlX2J5dGVzICgmZGlzYXNtX2luZm8sIGRpc2Fzc2VtYmxlX2ZuLCBpbnNucywgZGF0YSwgaSwKLQkJCSAgICAgbmV4dHN0b3AsICZyZWxwcCwgcmVscHBlbmQpOwotCSAgCi0JICBpID0gbmV4dHN0b3A7Ci0JICBzeW0gPSBuZXh0c3ltOwotCX0KLSAgICAgIAotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgICBpZiAocmVsYnVmICE9IE5VTEwpCi0JZnJlZSAocmVsYnVmKTsKLSAgICB9Ci0gIGZyZWUgKHNvcnRlZF9zeW1zKTsKLX0KLQwKLQotLyogRGVmaW5lIGEgdGFibGUgb2Ygc3RhYiB2YWx1ZXMgYW5kIHByaW50LXN0cmluZ3MuICBXZSB3aXNoIHRoZSBpbml0aWFsaXplcgotICAgY291bGQgYmUgYSBkaXJlY3QtbWFwcGVkIHRhYmxlLCBidXQgaW5zdGVhZCB3ZSBidWlsZCBvbmUgdGhlIGZpcnN0Ci0gICB0aW1lIHdlIG5lZWQgaXQuICAqLwotCi1zdGF0aWMgdm9pZCBkdW1wX3NlY3Rpb25fc3RhYnMgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICpzdGFic2VjdF9uYW1lLAotCQkJCQljaGFyICpzdHJzZWN0X25hbWUpKTsKLQotLyogRHVtcCB0aGUgc3RhYnMgc2VjdGlvbnMgZnJvbSBhbiBvYmplY3QgZmlsZSB0aGF0IGhhcyBhIHNlY3Rpb24gdGhhdAotICAgdXNlcyBTdW4gc3RhYnMgZW5jb2RpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9zdGFicyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsICIuc3RhYiIsICIuc3RhYnN0ciIpOwotICBkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsICIuc3RhYi5leGNsIiwgIi5zdGFiLmV4Y2xzdHIiKTsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIuaW5kZXgiLCAiLnN0YWIuaW5kZXhzdHIiKTsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiJEdEQl9TWU1CT0xTJCIsICIkR0RCX1NUUklOR1MkIik7Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqc3RhYnM7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBzdGFiX3NpemU7Ci0KLXN0YXRpYyBjaGFyICpzdHJ0YWI7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBzdGFic3RyX3NpemU7Ci0KLS8qIFJlYWQgQUJGRCdzIHN0YWJzIHNlY3Rpb24gU1RBQlNFQ1RfTkFNRSBpbnRvIGBzdGFicycKLSAgIGFuZCBzdHJpbmcgdGFibGUgc2VjdGlvbiBTVFJTRUNUX05BTUUgaW50byBgc3RydGFiJy4KLSAgIElmIHRoZSBzZWN0aW9uIGV4aXN0cyBhbmQgd2FzIHJlYWQsIGFsbG9jYXRlIHRoZSBzcGFjZSBhbmQgcmV0dXJuIHRydWUuCi0gICBPdGhlcndpc2UgcmV0dXJuIGZhbHNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc2VjdGlvbl9zdGFicyAoYWJmZCwgc3RhYnNlY3RfbmFtZSwgc3Ryc2VjdF9uYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YWJzZWN0X25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cnNlY3RfbmFtZTsKLXsKLSAgYXNlY3Rpb24gKnN0YWJzZWN0LCAqc3RhYnN0cnNlY3Q7Ci0KLSAgc3RhYnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3RhYnNlY3RfbmFtZSk7Ci0gIGlmICgwID09IHN0YWJzZWN0KQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiTm8gJXMgc2VjdGlvbiBwcmVzZW50XG5cbiIpLCBzdGFic2VjdF9uYW1lKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3RhYnN0cnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3Ryc2VjdF9uYW1lKTsKLSAgaWYgKDAgPT0gc3RhYnN0cnNlY3QpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXMgaGFzIG5vICVzIHNlY3Rpb25cbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdHJzZWN0X25hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAKLSAgc3RhYl9zaXplICAgID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3RhYnNlY3QpOwotICBzdGFic3RyX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdGFic3Ryc2VjdCk7Ci0KLSAgc3RhYnMgID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0YWJfc2l6ZSk7Ci0gIHN0cnRhYiA9IChjaGFyICopIHhtYWxsb2MgKHN0YWJzdHJfc2l6ZSk7Ci0gIAotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzZWN0LCAoUFRSKSBzdGFicywgMCwgc3RhYl9zaXplKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBSZWFkaW5nICVzIHNlY3Rpb24gb2YgJXMgZmFpbGVkOiAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgc3RhYnNlY3RfbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIGZyZWUgKHN0YWJzKTsKLSAgICAgIGZyZWUgKHN0cnRhYik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3RhYnN0cnNlY3QsIChQVFIpIHN0cnRhYiwgMCwKLQkJCQkgIHN0YWJzdHJfc2l6ZSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogUmVhZGluZyAlcyBzZWN0aW9uIG9mICVzIGZhaWxlZDogJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIHN0cnNlY3RfbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIGZyZWUgKHN0YWJzKTsKLSAgICAgIGZyZWUgKHN0cnRhYik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFicyBlbnRyaWVzIHVzZSBhIDEyIGJ5dGUgZm9ybWF0OgotICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgIDEgYnl0ZSBzdGFiIHR5cGUKLSAgICAgMSBieXRlIHN0YWIgb3RoZXIgZmllbGQKLSAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQotICAgRklYTUU6IFRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSBmb3IgYSA2NCBiaXQgb2JqZWN0IGZvcm1hdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotLyogUHJpbnQgQUJGRCdzIHN0YWJzIHNlY3Rpb24gU1RBQlNFQ1RfTkFNRSAoaW4gYHN0YWJzJyksCi0gICB1c2luZyBzdHJpbmcgdGFibGUgc2VjdGlvbiBTVFJTRUNUX05BTUUgKGluIGBzdHJ0YWInKS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzdGFic2VjdF9uYW1lLCBzdHJzZWN0X25hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqc3RhYnNlY3RfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqc3Ryc2VjdF9uYW1lOwotewotICBpbnQgaTsKLSAgdW5zaWduZWQgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gMCwgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgPSAwOwotICBiZmRfYnl0ZSAqc3RhYnAsICpzdGFic19lbmQ7Ci0KLSAgc3RhYnAgPSBzdGFiczsKLSAgc3RhYnNfZW5kID0gc3RhYnAgKyBzdGFiX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuXG4iKSwgc3RhYnNlY3RfbmFtZSk7Ci0gIHByaW50ZiAoIlN5bW51bSBuX3R5cGUgbl9vdGhyIG5fZGVzYyBuX3ZhbHVlICBuX3N0cnggU3RyaW5nXG4iKTsKLQotICAvKiBMb29wIHRocm91Z2ggYWxsIHN5bWJvbHMgYW5kIHByaW50IHRoZW0uCi0KLSAgICAgV2Ugc3RhcnQgdGhlIGluZGV4IGF0IC0xIGJlY2F1c2UgdGhlcmUgaXMgYSBkdW1teSBzeW1ib2wgb24KLSAgICAgdGhlIGZyb250IG9mIHN0YWJzLWluLXtjb2ZmLGVsZn0gc2VjdGlvbnMgdGhhdCBzdXBwbGllcyBzaXplcy4gICovCi0KLSAgZm9yIChpID0gLTE7IHN0YWJwIDwgc3RhYnNfZW5kOyBzdGFicCArPSBTVEFCU0laRSwgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cng7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHR5cGUsIG90aGVyOwotICAgICAgdW5zaWduZWQgc2hvcnQgZGVzYzsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0KLSAgICAgIHN0cnggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgU1RSRFhPRkYpOwotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBzdGFicCArIFRZUEVPRkYpOwotICAgICAgb3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgc3RhYnAgKyBPVEhFUk9GRik7Ci0gICAgICBkZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzdGFicCArIERFU0NPRkYpOwotICAgICAgdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgVkFMT0ZGKTsKLQotICAgICAgcHJpbnRmICgiXG4lLTZkICIsIGkpOwotICAgICAgLyogRWl0aGVyIHByaW50IHRoZSBzdGFiIG5hbWUsIG9yLCBpZiB1bm5hbWVkLCBwcmludCBpdHMgbnVtYmVyCi0JIGFnYWluIChtYWtlcyBjb25zaXN0ZW50IGZvcm1hdHRpbmcgZm9yIHRvb2xzIGxpa2UgYXdrKS4gKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3N0YWJfbmFtZSAodHlwZSk7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMKQotCXByaW50ZiAoIiUtNnMiLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gTl9VTkRGKQotCXByaW50ZiAoIkhkclN5bSIpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiUtNmQiLCB0eXBlKTsKLSAgICAgIHByaW50ZiAoIiAlLTZkICUtNmQgIiwgb3RoZXIsIGRlc2MpOwotICAgICAgcHJpbnRmX3ZtYSAodmFsdWUpOwotICAgICAgcHJpbnRmICgiICUtNmx1Iiwgc3RyeCk7Ci0KLSAgICAgIC8qIFN5bWJvbHMgd2l0aCB0eXBlID09IDAgKE5fVU5ERikgc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRoZQotCSBzdHJpbmcgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZS4gIFdlIHVzZSB0aGF0IGluZm8KLQkgdG8ga25vdyBob3cgdG8gcmVsb2NhdGUgdGhlICpuZXh0KiBmaWxlJ3Mgc3RyaW5nIHRhYmxlIGluZGljZXMuICAqLwotCi0gICAgICBpZiAodHlwZSA9PSBOX1VOREYpCi0JewotCSAgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQ7Ci0JICBuZXh0X2ZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCArPSB2YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXNpbmcgdGhlIChwb3NzaWJseSB1cGRhdGVkKSBzdHJpbmcgdGFibGUgb2Zmc2V0LCBwcmludCB0aGUKLQkgICAgIHN0cmluZyAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wuICAqLwotCi0JICBpZiAoKHN0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQpIDwgc3RhYnN0cl9zaXplKQotCSAgICBwcmludGYgKCIgJXMiLCAmc3RydGFiW3N0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXRdKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiICoiKTsKLQl9Ci0gICAgfQotICBwcmludGYgKCJcblxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdGFic2VjdF9uYW1lOwotICAgICBjaGFyICpzdHJzZWN0X25hbWU7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIC8qIENoZWNrIGZvciBzZWN0aW9uIG5hbWVzIGZvciB3aGljaCBzdGFic2VjdF9uYW1lIGlzIGEgcHJlZml4LCB0bwotICAgICBoYW5kbGUgLnN0YWIwLCBldGMuICAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBzICE9IE5VTEw7Ci0gICAgICAgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuIChzdGFic2VjdF9uYW1lKTsKLQotICAgICAgLyogSWYgdGhlIHByZWZpeCBtYXRjaGVzLCBhbmQgdGhlIGZpbGVzIHNlY3Rpb24gbmFtZSBlbmRzIHdpdGggYQotCSBudWwgb3IgYSBkaWdpdCwgdGhlbiB3ZSBtYXRjaC4gIEkuZS4sIHdlIHdhbnQgZWl0aGVyIGFuIGV4YWN0Ci0JIG1hdGNoIG9yIGEgc2VjdGlvbiBmb2xsb3dlZCBieSBhIG51bWJlci4gICovCi0gICAgICBpZiAoc3RybmNtcCAoc3RhYnNlY3RfbmFtZSwgcy0+bmFtZSwgbGVuKSA9PSAwCi0JICAmJiAocy0+bmFtZVtsZW5dID09ICdcMDAwJwotCSAgICAgIHx8IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzLT5uYW1lW2xlbl0pKSkKLQl7Ci0JICBpZiAocmVhZF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzLT5uYW1lLCBzdHJzZWN0X25hbWUpKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc2VjdGlvbl9zdGFicyAoYWJmZCwgcy0+bmFtZSwgc3Ryc2VjdF9uYW1lKTsKLQkgICAgICBmcmVlIChzdGFicyk7Ci0JICAgICAgZnJlZSAoc3RydGFiKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbW1hID0gIiI7Ci0KLSAgcHJpbnRmIChfKCJhcmNoaXRlY3R1cmU6ICVzLCAiKSwKLQkgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpLAotCQkJCSAgIGJmZF9nZXRfbWFjaCAoYWJmZCkpKTsKLSAgcHJpbnRmIChfKCJmbGFncyAweCUwOHg6XG4iKSwgYWJmZC0+ZmxhZ3MpOwotCi0jZGVmaW5lIFBGKHgsIHkpICAgIGlmIChhYmZkLT5mbGFncyAmIHgpIHtwcmludGYoIiVzJXMiLCBjb21tYSwgeSk7IGNvbW1hPSIsICI7fQotICBQRiAoSEFTX1JFTE9DLCAiSEFTX1JFTE9DIik7Ci0gIFBGIChFWEVDX1AsICJFWEVDX1AiKTsKLSAgUEYgKEhBU19MSU5FTk8sICJIQVNfTElORU5PIik7Ci0gIFBGIChIQVNfREVCVUcsICJIQVNfREVCVUciKTsKLSAgUEYgKEhBU19TWU1TLCAiSEFTX1NZTVMiKTsKLSAgUEYgKEhBU19MT0NBTFMsICJIQVNfTE9DQUxTIik7Ci0gIFBGIChEWU5BTUlDLCAiRFlOQU1JQyIpOwotICBQRiAoV1BfVEVYVCwgIldQX1RFWFQiKTsKLSAgUEYgKERfUEFHRUQsICJEX1BBR0VEIik7Ci0gIFBGIChCRkRfSVNfUkVMQVhBQkxFLCAiQkZEX0lTX1JFTEFYQUJMRSIpOwotICBwcmludGYgKF8oIlxuc3RhcnQgYWRkcmVzcyAweCIpKTsKLSAgcHJpbnRmX3ZtYSAoYWJmZC0+c3RhcnRfYWRkcmVzcyk7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgKGFiZmQpCi1iZmQgKmFiZmQ7Ci17Ci0gIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBzdGRvdXQpOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9iZmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBhZGp1c3Rpbmcgc2VjdGlvbiBWTUEncywgY2hhbmdlIHRoZW0gYWxsIG5vdy4gIENoYW5naW5nCi0gICAgIHRoZSBCRkQgaW5mb3JtYXRpb24gaXMgYSBoYWNrLiAgSG93ZXZlciwgd2UgbXVzdCBkbyBpdCwgb3IKLSAgICAgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIHdpbGwgbm90IGRvIHRoZSByaWdodCB0aGluZy4gICovCi0gIGlmIChhZGp1c3Rfc2VjdGlvbl92bWEgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgcy0+dm1hICs9IGFkanVzdF9zZWN0aW9uX3ZtYTsKLQkgIHMtPmxtYSArPSBhZGp1c3Rfc2VjdGlvbl92bWE7Ci0JfQotICAgIH0KLQotICBwcmludGYgKF8oIlxuJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgYWJmZC0+eHZlYy0+bmFtZSk7Ci0gIGlmIChkdW1wX2FyX2hkcnMpCi0gICAgcHJpbnRfYXJlbHRfZGVzY3IgKHN0ZG91dCwgYWJmZCwgdHJ1ZSk7Ci0gIGlmIChkdW1wX2ZpbGVfaGVhZGVyKQotICAgIGR1bXBfYmZkX2hlYWRlciAoYWJmZCk7Ci0gIGlmIChkdW1wX3ByaXZhdGVfaGVhZGVycykKLSAgICBkdW1wX2JmZF9wcml2YXRlX2hlYWRlciAoYWJmZCk7Ci0gIHB1dGNoYXIgKCdcbicpOwotICBpZiAoZHVtcF9zZWN0aW9uX2hlYWRlcnMpCi0gICAgZHVtcF9oZWFkZXJzIChhYmZkKTsKLSAgaWYgKGR1bXBfc3ltdGFiIHx8IGR1bXBfcmVsb2NfaW5mbyB8fCBkaXNhc3NlbWJsZSB8fCBkdW1wX2RlYnVnZ2luZykKLSAgICB7Ci0gICAgICBzeW1zID0gc2x1cnBfc3ltdGFiIChhYmZkKTsKLSAgICB9Ci0gIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiIHx8IGR1bXBfZHluYW1pY19yZWxvY19pbmZvKQotICAgIHsKLSAgICAgIGR5bnN5bXMgPSBzbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCk7Ci0gICAgfQotICBpZiAoZHVtcF9zeW10YWIpCi0gICAgZHVtcF9zeW1ib2xzIChhYmZkLCBmYWxzZSk7Ci0gIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiKQotICAgIGR1bXBfc3ltYm9scyAoYWJmZCwgdHJ1ZSk7Ci0gIGlmIChkdW1wX3N0YWJfc2VjdGlvbl9pbmZvKQotICAgIGR1bXBfc3RhYnMgKGFiZmQpOwotICBpZiAoZHVtcF9yZWxvY19pbmZvICYmICEgZGlzYXNzZW1ibGUpCi0gICAgZHVtcF9yZWxvY3MgKGFiZmQpOwotICBpZiAoZHVtcF9keW5hbWljX3JlbG9jX2luZm8pCi0gICAgZHVtcF9keW5hbWljX3JlbG9jcyAoYWJmZCk7Ci0gIGlmIChkdW1wX3NlY3Rpb25fY29udGVudHMpCi0gICAgZHVtcF9kYXRhIChhYmZkKTsKLSAgaWYgKGRpc2Fzc2VtYmxlKQotICAgIGRpc2Fzc2VtYmxlX2RhdGEgKGFiZmQpOwotICBpZiAoZHVtcF9kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgUFRSIGRoYW5kbGU7Ci0KLSAgICAgIGRoYW5kbGUgPSByZWFkX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCk7Ci0gICAgICBpZiAoZGhhbmRsZSAhPSBOVUxMKQotCXsKLQkgIGlmICghIHByaW50X2RlYnVnZ2luZ19pbmZvIChzdGRvdXQsIGRoYW5kbGUpKQotCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBwcmludGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmFpbGVkXG4iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JfQotICAgIH0KLSAgaWYgKHN5bXMpCi0gICAgewotICAgICAgZnJlZSAoc3ltcyk7Ci0gICAgICBzeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChkeW5zeW1zKQotICAgIHsKLSAgICAgIGZyZWUgKGR5bnN5bXMpOwotICAgICAgZHluc3ltcyA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9maWxlIChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBjaGFyICpmaWxlbmFtZTsKLSAgICAgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKmZpbGUsICphcmZpbGUgPSAoYmZkICopIE5VTEw7Ci0KLSAgZmlsZSA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaWxlLCBiZmRfYXJjaGl2ZSkgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICBiZmQgKmxhc3RfYXJmaWxlID0gTlVMTDsKLQotICAgICAgcHJpbnRmIChfKCJJbiBhcmNoaXZlICVzOlxuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLSAgICAgIGZvciAoOzspCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLQkgIGlmIChhcmZpbGUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCQl7Ci0JCSAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBkaXNwbGF5X2JmZCAoYXJmaWxlKTsKLQotCSAgaWYgKGxhc3RfYXJmaWxlICE9IE5VTEwpCi0JICAgIGJmZF9jbG9zZSAobGFzdF9hcmZpbGUpOwotCSAgbGFzdF9hcmZpbGUgPSBhcmZpbGU7Ci0JfQotCi0gICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQliZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBkaXNwbGF5X2JmZCAoZmlsZSk7Ci0KLSAgYmZkX2Nsb3NlIChmaWxlKTsKLX0KLQwKLS8qIEFjdHVhbGx5IGRpc3BsYXkgdGhlIHZhcmlvdXMgcmVxdWVzdGVkIHJlZ2lvbnMgKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBiZmRfc2l6ZV90eXBlIHN0YXJ0LCBzdG9wOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPQotICAgICAgIHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IG9uYWxpbmUgPSAxNjsKLQotICAgICAgaWYgKG9ubHkgPT0gKGNoYXIgKikgTlVMTCB8fAotCSAgc3RyY21wIChvbmx5LCBzZWN0aW9uLT5uYW1lKSA9PSAwKQotCXsKLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iKSwgc2VjdGlvbi0+bmFtZSk7Ci0KLQkgICAgICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgZGF0YSA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0JICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQotCi0JICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCAwLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0KLQkgICAgICBpZiAoc3RhcnRfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEKLQkJICB8fCBzdGFydF9hZGRyZXNzIDwgc2VjdGlvbi0+dm1hKQotCQlzdGFydCA9IDA7Ci0JICAgICAgZWxzZQotCQlzdGFydCA9IHN0YXJ0X2FkZHJlc3MgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCi0JCXN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoc3RvcF9hZGRyZXNzIDwgc2VjdGlvbi0+dm1hKQotCQkgICAgc3RvcCA9IDA7Ci0JCSAgZWxzZQotCQkgICAgc3RvcCA9IHN0b3BfYWRkcmVzcyAtIHNlY3Rpb24tPnZtYTsKLQkJICBpZiAoc3RvcCA+IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKQotCQkgICAgc3RvcCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotCQl9Ci0JICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIGo7Ci0KLQkJICBwcmludGYgKCIgJTA0bHggIiwgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSkpOwotCQkgIGZvciAoaiA9IGk7IGogPCBpICsgb25hbGluZTsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoaiA8IHN0b3ApCi0JCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSAoZGF0YVtqXSkpOwotCQkgICAgICBlbHNlCi0JCQlwcmludGYgKCIgICIpOwotCQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQotCQkJcHJpbnRmICgiICIpOwotCQkgICAgfQotCi0JCSAgcHJpbnRmICgiICIpOwotCQkgIGZvciAoaiA9IGk7IGogPCBpICsgb25hbGluZTsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoaiA+PSBzdG9wKQotCQkJcHJpbnRmICgiICIpOwotCQkgICAgICBlbHNlCi0JCQlwcmludGYgKCIlYyIsIGlzcHJpbnQgKGRhdGFbal0pID8gZGF0YVtqXSA6ICcuJyk7Ci0JCSAgICB9Ci0JCSAgcHV0Y2hhciAoJ1xuJyk7Ci0JCX0KLQkgICAgICBmcmVlIChkYXRhKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFNob3VsZCBwZXJoYXBzIHNoYXJlIGNvZGUgYW5kIGRpc3BsYXkgd2l0aCBubT8gKi8KLXN0YXRpYyB2b2lkCi1kdW1wX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBhc3ltYm9sICoqY3VycmVudDsKLSAgbG9uZyBtYXg7Ci0gIGxvbmcgY291bnQ7Ci0KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgY3VycmVudCA9IGR5bnN5bXM7Ci0gICAgICBtYXggPSBkeW5zeW1jb3VudDsKLSAgICAgIGlmIChtYXggPT0gMCkKLQlyZXR1cm47Ci0gICAgICBwcmludGYgKCJEWU5BTUlDIFNZTUJPTCBUQUJMRTpcbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBzeW1zOwotICAgICAgbWF4ID0gc3ltY291bnQ7Ci0gICAgICBpZiAobWF4ID09IDApCi0JcmV0dXJuOwotICAgICAgcHJpbnRmICgiU1lNQk9MIFRBQkxFOlxuIik7Ci0gICAgfQotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG1heDsgY291bnQrKykKLSAgICB7Ci0gICAgICBpZiAoKmN1cnJlbnQpCi0JewotCSAgYmZkICpjdXJfYmZkID0gYmZkX2FzeW1ib2xfYmZkICgqY3VycmVudCk7Ci0KLQkgIGlmIChjdXJfYmZkICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICAgIGNoYXIgKmFsbG9jOwotCi0JICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpjdXJyZW50KTsKLQkgICAgICBhbGxvYyA9IE5VTEw7Ci0JICAgICAgaWYgKGRvX2RlbWFuZ2xlICYmIG5hbWUgIT0gTlVMTCAmJiAqbmFtZSAhPSAnXDAnKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbjsKLQotCQkgIC8qIElmIHdlIHdhbnQgdG8gZGVtYW5nbGUgdGhlIG5hbWUsIHdlIGRlbWFuZ2xlIGl0Ci0gICAgICAgICAgICAgICAgICAgICBoZXJlLCBhbmQgdGVtcG9yYXJpbHkgY2xvYmJlciBpdCB3aGlsZSBjYWxsaW5nCi0gICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sLiAgRklYTUU6IFRoaXMgaXMgYSBncm9zcyBoYWNrLiAgKi8KLQotCQkgIG4gPSBuYW1lOwotCQkgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGN1cl9iZmQpID09ICpuKQotCQkgICAgKytuOwotCQkgIGFsbG9jID0gY3BsdXNfZGVtYW5nbGUgKG4sIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLQkJICBpZiAoYWxsb2MgIT0gTlVMTCkKLQkJICAgICgqY3VycmVudCktPm5hbWUgPSBhbGxvYzsKLQkJICBlbHNlCi0JCSAgICAoKmN1cnJlbnQpLT5uYW1lID0gbjsKLQkJfQotCi0JICAgICAgYmZkX3ByaW50X3N5bWJvbCAoY3VyX2JmZCwgc3Rkb3V0LCAqY3VycmVudCwKLQkJCQliZmRfcHJpbnRfc3ltYm9sX2FsbCk7Ci0KLQkgICAgICAoKmN1cnJlbnQpLT5uYW1lID0gbmFtZTsKLQkgICAgICBpZiAoYWxsb2MgIT0gTlVMTCkKLQkJZnJlZSAoYWxsb2MpOwotCi0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgfQotCX0KLSAgICAgIGN1cnJlbnQrKzsKLSAgICB9Ci0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIGFzZWN0aW9uICphOwotCi0gIGZvciAoYSA9IGFiZmQtPnNlY3Rpb25zOyBhICE9IChhc2VjdGlvbiAqKSBOVUxMOyBhID0gYS0+bmV4dCkKLSAgICB7Ci0gICAgICBsb25nIHJlbHNpemU7Ci0KLSAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGEpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChhKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKG9ubHkpCi0JewotCSAgaWYgKHN0cmNtcCAob25seSwgYS0+bmFtZSkpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKChhLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGEpOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBwcmludGYgKCJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106IiwgYS0+bmFtZSk7Ci0KLSAgICAgIGlmIChyZWxzaXplID09IDApCi0JewotCSAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0JICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIGEsIHJlbHBwLCBzeW1zKTsKLQkgIGlmIChyZWxjb3VudCA8IDApCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgZWxzZSBpZiAocmVsY291bnQgPT0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAobm9uZSlcblxuIik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgZHVtcF9yZWxvY19zZXQgKGFiZmQsIGEsIHJlbHBwLCByZWxjb3VudCk7Ci0JICAgICAgcHJpbnRmICgiXG5cbiIpOwotCSAgICB9Ci0JICBmcmVlIChyZWxwcCk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfZHluYW1pY19yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBwcmludGYgKCJEWU5BTUlDIFJFTE9DQVRJT04gUkVDT1JEUyIpOwotCi0gIGlmIChyZWxzaXplID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCByZWxwcCwgZHluc3ltcyk7Ci0gICAgICBpZiAocmVsY291bnQgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZWxzZSBpZiAocmVsY291bnQgPT0gMCkKLQl7Ci0JICBwcmludGYgKCIgKG5vbmUpXG5cbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgZHVtcF9yZWxvY19zZXQgKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCByZWxwcCwgcmVsY291bnQpOwotCSAgcHJpbnRmICgiXG5cbiIpOwotCX0KLSAgICAgIGZyZWUgKHJlbHBwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jX3NldCAoYWJmZCwgc2VjLCByZWxwcCwgcmVsY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqKnJlbHBwOwotICAgICBsb25nIHJlbGNvdW50OwotewotICBhcmVsZW50ICoqcDsKLSAgY2hhciAqbGFzdF9maWxlbmFtZSwgKmxhc3RfZnVuY3Rpb25uYW1lOwotICB1bnNpZ25lZCBpbnQgbGFzdF9saW5lOwotCi0gIC8qIEdldCBjb2x1bW4gaGVhZGVycyBsaW5lZCB1cCByZWFzb25hYmx5LiAgKi8KLSAgewotICAgIHN0YXRpYyBpbnQgd2lkdGg7Ci0gICAgaWYgKHdpZHRoID09IDApCi0gICAgICB7Ci0JY2hhciBidWZbMzBdOwotCXNwcmludGZfdm1hIChidWYsIChiZmRfdm1hKSAtMSk7Ci0Jd2lkdGggPSBzdHJsZW4gKGJ1ZikgLSA3OwotICAgICAgfQotICAgIHByaW50ZiAoIk9GRlNFVCAlKnMgVFlQRSAlKnMgVkFMVUUgXG4iLCB3aWR0aCwgIiIsIDEyLCAiIik7Ci0gIH0KLQotICBsYXN0X2ZpbGVuYW1lID0gTlVMTDsKLSAgbGFzdF9mdW5jdGlvbm5hbWUgPSBOVUxMOwotICBsYXN0X2xpbmUgPSAwOwotCi0gIGZvciAocCA9IHJlbHBwOyByZWxjb3VudCAmJiAqcCAhPSAoYXJlbGVudCAqKSBOVUxMOyBwKyssIHJlbGNvdW50LS0pCi0gICAgewotICAgICAgYXJlbGVudCAqcSA9ICpwOwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICpmdW5jdGlvbm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwotCi0gICAgICBpZiAoc3RhcnRfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEKLQkgICYmIHEtPmFkZHJlc3MgPCBzdGFydF9hZGRyZXNzKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN0b3BfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEKLQkgICYmIHEtPmFkZHJlc3MgPiBzdG9wX2FkZHJlc3MpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICh3aXRoX2xpbmVfbnVtYmVycwotCSAgJiYgc2VjICE9IE5VTEwKLQkgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjLCBzeW1zLCBxLT5hZGRyZXNzLAotCQkJCSAgICAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKSkKLQl7Ci0JICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKLQkgICAgICAmJiAobGFzdF9mdW5jdGlvbm5hbWUgPT0gTlVMTAotCQkgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBsYXN0X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlcygpOlxuIiwgZnVuY3Rpb25uYW1lKTsKLQkgICAgICBpZiAobGFzdF9mdW5jdGlvbm5hbWUgIT0gTlVMTCkKLQkJZnJlZSAobGFzdF9mdW5jdGlvbm5hbWUpOwotCSAgICAgIGxhc3RfZnVuY3Rpb25uYW1lID0geHN0cmR1cCAoZnVuY3Rpb25uYW1lKTsKLQkgICAgfQotCSAgaWYgKGxpbmUgPiAwCi0JICAgICAgJiYgKGxpbmUgIT0gbGFzdF9saW5lCi0JCSAgfHwgKGZpbGVuYW1lICE9IE5VTEwKLQkJICAgICAgJiYgbGFzdF9maWxlbmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cmNtcCAoZmlsZW5hbWUsIGxhc3RfZmlsZW5hbWUpICE9IDApKSkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA9PSBOVUxMID8gIj8/PyIgOiBmaWxlbmFtZSwgbGluZSk7Ci0JICAgICAgbGFzdF9saW5lID0gbGluZTsKLQkgICAgICBpZiAobGFzdF9maWxlbmFtZSAhPSBOVUxMKQotCQlmcmVlIChsYXN0X2ZpbGVuYW1lKTsKLQkgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQkJbGFzdF9maWxlbmFtZSA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQlsYXN0X2ZpbGVuYW1lID0geHN0cmR1cCAoZmlsZW5hbWUpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocS0+c3ltX3B0cl9wdHIgJiYgKnEtPnN5bV9wdHJfcHRyKQotCXsKLQkgIHN5bV9uYW1lID0gKCoocS0+c3ltX3B0cl9wdHIpKS0+bmFtZTsKLQkgIHNlY3Rpb25fbmFtZSA9ICgqKHEtPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bV9uYW1lID0gTlVMTDsKLQkgIHNlY3Rpb25fbmFtZSA9IE5VTEw7Ci0JfQotICAgICAgaWYgKHN5bV9uYW1lKQotCXsKLQkgIHByaW50Zl92bWEgKHEtPmFkZHJlc3MpOwotCSAgaWYgKHEtPmhvd3RvLT5uYW1lKQotCSAgICBwcmludGYgKCIgJS0xNnMgICIsIHEtPmhvd3RvLT5uYW1lKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiICUtMTZkICAiLCBxLT5ob3d0by0+dHlwZSk7Ci0JICBvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSBOVUxMLAotCQkJCSAqcS0+c3ltX3B0cl9wdHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc2VjdGlvbl9uYW1lID09IChDT05TVCBjaGFyICopIE5VTEwpCi0JICAgIHNlY3Rpb25fbmFtZSA9ICIqdW5rbm93bioiOwotCSAgcHJpbnRmX3ZtYSAocS0+YWRkcmVzcyk7Ci0JICBwcmludGYgKCIgJS0xNnMgIFslc10iLAotCQkgIHEtPmhvd3RvLT5uYW1lLAotCQkgIHNlY3Rpb25fbmFtZSk7Ci0JfQotICAgICAgaWYgKHEtPmFkZGVuZCkKLQl7Ci0JICBwcmludGYgKCIrMHgiKTsKLQkgIHByaW50Zl92bWEgKHEtPmFkZGVuZCk7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0MCi0vKiBUaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGFyY2hpdGVjdHVyZSBuYW1lICsgMS4gICovCi0jZGVmaW5lIExPTkdFU1RfQVJDSCBzaXplb2YoInJzNjAwMDo2MDAwIikKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZW5kaWFuX3N0cmluZyAoZW5kaWFuKQotICAgICBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuOwotewotICBpZiAoZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIHJldHVybiAiYmlnIGVuZGlhbiI7Ci0gIGVsc2UgaWYgKGVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSAgICByZXR1cm4gImxpdHRsZSBlbmRpYW4iOwotICBlbHNlCi0gICAgcmV0dXJuICJlbmRpYW5uZXNzIHVua25vd24iOwotfQotCi0vKiBMaXN0IHRoZSB0YXJnZXRzIHRoYXQgQkZEIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCwgZWFjaCBmb2xsb3dlZAotICAgYnkgaXRzIGVuZGlhbm5lc3MgYW5kIHRoZSBhcmNoaXRlY3R1cmVzIGl0IHN1cHBvcnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X2xpc3QgKCkKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGNoYXIgKmR1bW15X25hbWU7Ci0gIGludCB0OwotCi0gIGR1bW15X25hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBmb3IgKHQgPSAwOyBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQotICAgIHsKLSAgICAgIGJmZF90YXJnZXQgKnAgPSBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsKLSAgICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVudyAoZHVtbXlfbmFtZSwgcC0+bmFtZSk7Ci0gICAgICBpbnQgYTsKLQotICAgICAgcHJpbnRmICgiJXNcbiAoaGVhZGVyICVzLCBkYXRhICVzKVxuIiwgcC0+bmFtZSwKLQkgICAgICBlbmRpYW5fc3RyaW5nIChwLT5oZWFkZXJfYnl0ZW9yZGVyKSwKLQkgICAgICBlbmRpYW5fc3RyaW5nIChwLT5ieXRlb3JkZXIpKTsKLQotICAgICAgaWYgKGFiZmQgPT0gTlVMTCkKLQl7Ci0JICBiZmRfbm9uZmF0YWwgKGR1bW15X25hbWUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKQotCSAgICBiZmRfbm9uZmF0YWwgKHAtPm5hbWUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBmb3IgKGEgPSAoaW50KSBiZmRfYXJjaF9vYnNjdXJlICsgMTsgYSA8IChpbnQpIGJmZF9hcmNoX2xhc3Q7IGErKykKLQlpZiAoYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpIGEsIDApKQotCSAgcHJpbnRmICgiICAlc1xuIiwKLQkJICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSkgYSwgMCkpOwotICAgIH0KLSAgdW5saW5rIChkdW1teV9uYW1lKTsKLSAgZnJlZSAoZHVtbXlfbmFtZSk7Ci19Ci0KLS8qIFByaW50IGEgdGFibGUgc2hvd2luZyB3aGljaCBhcmNoaXRlY3R1cmVzIGFyZSBzdXBwb3J0ZWQgZm9yIGVudHJpZXMKLSAgIEZJUlNUIHRocm91Z2ggTEFTVC0xIG9mIGJmZF90YXJnZXRfdmVjdG9yICh0YXJnZXRzIGFjcm9zcywKLSAgIGFyY2hpdGVjdHVyZXMgZG93bikuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9pbmZvX3RhYmxlIChmaXJzdCwgbGFzdCkKLSAgICAgaW50IGZpcnN0OwotICAgICBpbnQgbGFzdDsKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGludCB0LCBhOwotICBjaGFyICpkdW1teV9uYW1lOwotCi0gIC8qIFByaW50IGhlYWRpbmcgb2YgdGFyZ2V0IG5hbWVzLiAgKi8KLSAgcHJpbnRmICgiXG4lKnMiLCAoaW50KSBMT05HRVNUX0FSQ0gsICIgIik7Ci0gIGZvciAodCA9IGZpcnN0OyB0IDwgbGFzdCAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQotICAgIHByaW50ZiAoIiVzICIsIGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKTsKLSAgcHV0Y2hhciAoJ1xuJyk7Ci0KLSAgZHVtbXlfbmFtZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gIGZvciAoYSA9IChpbnQpIGJmZF9hcmNoX29ic2N1cmUgKyAxOyBhIDwgKGludCkgYmZkX2FyY2hfbGFzdDsgYSsrKQotICAgIGlmIChzdHJjbXAgKGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhLCAwKSwgIlVOS05PV04hIikgIT0gMCkKLSAgICAgIHsKLQlwcmludGYgKCIlKnMgIiwgKGludCkgTE9OR0VTVF9BUkNIIC0gMSwKLQkJYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGEsIDApKTsKLQlmb3IgKHQgPSBmaXJzdDsgdCA8IGxhc3QgJiYgYmZkX3RhcmdldF92ZWN0b3JbdF07IHQrKykKLQkgIHsKLQkgICAgYmZkX3RhcmdldCAqcCA9IGJmZF90YXJnZXRfdmVjdG9yW3RdOwotCSAgICBib29sZWFuIG9rID0gdHJ1ZTsKLQkgICAgYmZkICphYmZkID0gYmZkX29wZW53IChkdW1teV9uYW1lLCBwLT5uYW1lKTsKLQotCSAgICBpZiAoYWJmZCA9PSBOVUxMKQotCSAgICAgIHsKLQkJYmZkX25vbmZhdGFsIChwLT5uYW1lKTsKLQkJb2sgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG9rKQotCSAgICAgIHsKLQkJaWYgKCEgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotCQkgIHsKLQkJICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbikKLQkJICAgICAgYmZkX25vbmZhdGFsIChwLT5uYW1lKTsKLQkJICAgIG9rID0gZmFsc2U7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAob2spCi0JICAgICAgewotCQlpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYSwgMCkpCi0JCSAgb2sgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG9rKQotCSAgICAgIHByaW50ZiAoIiVzICIsIHAtPm5hbWUpOwotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgbCA9IHN0cmxlbiAocC0+bmFtZSk7Ci0JCXdoaWxlIChsLS0pCi0JCSAgcHV0Y2hhciAoJy0nKTsKLQkJcHV0Y2hhciAoJyAnKTsKLQkgICAgICB9Ci0JICB9Ci0JcHV0Y2hhciAoJ1xuJyk7Ci0gICAgICB9Ci0gIHVubGluayAoZHVtbXlfbmFtZSk7Ci0gIGZyZWUgKGR1bW15X25hbWUpOwotfQotCi0vKiBQcmludCB0YWJsZXMgb2YgYWxsIHRoZSB0YXJnZXQtYXJjaGl0ZWN0dXJlIGNvbWJpbmF0aW9ucyB0aGF0Ci0gICBCRkQgaGFzIGJlZW4gY29uZmlndXJlZCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X3RhYmxlcyAoKQotewotICBpbnQgdCwgY29sdW1uczsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGNoYXIgKmNvbHVtOwotCi0gIGNvbHVtbnMgPSAwOwotICBjb2x1bSA9IGdldGVudiAoIkNPTFVNTlMiKTsKLSAgaWYgKGNvbHVtICE9IE5VTEwpCi0gICAgY29sdW1ucyA9IGF0b2kgKGNvbHVtKTsKLSAgaWYgKGNvbHVtbnMgPT0gMCkKLSAgICBjb2x1bW5zID0gODA7Ci0KLSAgdCA9IDA7Ci0gIHdoaWxlIChiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBvbGR0ID0gdCwgd2lkOwotCi0gICAgICB3aWQgPSBMT05HRVNUX0FSQ0ggKyBzdHJsZW4gKGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKSArIDE7Ci0gICAgICArK3Q7Ci0gICAgICB3aGlsZSAod2lkIDwgY29sdW1ucyAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMKQotCXsKLQkgIGludCBuZXd3aWQ7Ci0KLQkgIG5ld3dpZCA9IHdpZCArIHN0cmxlbiAoYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpICsgMTsKLQkgIGlmIChuZXd3aWQgPj0gY29sdW1ucykKLQkgICAgYnJlYWs7Ci0JICB3aWQgPSBuZXd3aWQ7Ci0JICArK3Q7Ci0JfQotICAgICAgZGlzcGxheV9pbmZvX3RhYmxlIChvbGR0LCB0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2luZm8gKCkKLXsKLSAgcHJpbnRmIChfKCJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbiAlc1xuIiksIEJGRF9WRVJTSU9OKTsKLSAgZGlzcGxheV90YXJnZXRfbGlzdCAoKTsKLSAgZGlzcGxheV90YXJnZXRfdGFibGVzICgpOwotfQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKnRhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotICBib29sZWFuIHNlZW5mbGFnID0gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAicGliOm06TTpWQ2REbGZhaHJSdFR4c1NqOndFOiIsCi0JCQkgICBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBpZiAoYyAhPSAnbCcgJiYgYyAhPSBPUFRJT05fU1RBUlRfQUREUkVTUyAmJiBjICE9IE9QVElPTl9TVE9QX0FERFJFU1MpCi0Jc2VlbmZsYWcgPSB0cnVlOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIDA6Ci0JICBicmVhazsJCS8qIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBsb25nIG9wdGlvbiAqLwotCWNhc2UgJ20nOgotCSAgbWFjaGluZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdqJzoKLQkgIG9ubHkgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIHdpdGhfbGluZV9udW1iZXJzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBkdW1wX2ZpbGVfaGVhZGVyID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgZm9ybWF0c19pbmZvID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgZHVtcF9wcml2YXRlX2hlYWRlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkdW1wX3ByaXZhdGVfaGVhZGVycyA9IDE7Ci0JICBkdW1wX3N5bXRhYiA9IDE7Ci0JICBkdW1wX3JlbG9jX2luZm8gPSAxOwotCSAgZHVtcF9maWxlX2hlYWRlciA9IHRydWU7Ci0JICBkdW1wX2FyX2hkcnMgPSAxOwotCSAgZHVtcF9zZWN0aW9uX2hlYWRlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBkdW1wX3N5bXRhYiA9IDE7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGR1bXBfZHluYW1pY19zeW10YWIgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICBkb19kZW1hbmdsZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRpc2Fzc2VtYmxlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZGlzYXNzZW1ibGUgPSBkaXNhc3NlbWJsZV9hbGwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICBkaXNhc3NlbWJsZSA9IHRydWU7Ci0JICB3aXRoX3NvdXJjZV9jb2RlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgZHVtcF9zZWN0aW9uX2NvbnRlbnRzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgZHVtcF9yZWxvY19pbmZvID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgZHVtcF9keW5hbWljX3JlbG9jX2luZm8gPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBkdW1wX2FyX2hkcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBkdW1wX3NlY3Rpb25faGVhZGVycyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdIJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3cnOgotCSAgd2lkZV9vdXRwdXQgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQURKVVNUX1ZNQToKLQkgIGFkanVzdF9zZWN0aW9uX3ZtYSA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1hZGp1c3Qtdm1hIik7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVEFSVF9BRERSRVNTOgotCSAgc3RhcnRfYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zdGFydC1hZGRyZXNzIik7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVE9QX0FERFJFU1M6Ci0JICBzdG9wX2FkZHJlc3MgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tc3RvcC1hZGRyZXNzIik7Ci0JICBicmVhazsKLQljYXNlICdFJzoKLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgIkIiKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiTCIpID09IDApCi0JICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIC1FIG9wdGlvblxuIiksIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VORElBTjoKLQkgIGlmIChzdHJuY21wIChvcHRhcmcsICJiaWciLCBzdHJsZW4gKG9wdGFyZykpID09IDApCi0JICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotCSAgZWxzZSBpZiAoc3RybmNtcCAob3B0YXJnLCAibGl0dGxlIiwgc3RybGVuIChvcHRhcmcpKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCAtLWVuZGlhbiB0eXBlIGAlcydcbiIpLAotCQkgICAgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoIm9iamR1bXAiKTsKLQotICBpZiAoc2VlbmZsYWcgPT0gZmFsc2UpCi0gICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgaWYgKGZvcm1hdHNfaW5mbykKLSAgICB7Ci0gICAgICBkaXNwbGF5X2luZm8gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9wdGluZCA9PSBhcmdjKQotCWRpc3BsYXlfZmlsZSAoImEub3V0IiwgdGFyZ2V0KTsKLSAgICAgIGVsc2UKLQlmb3IgKDsgb3B0aW5kIDwgYXJnYzspCi0JICBkaXNwbGF5X2ZpbGUgKGFyZ3Zbb3B0aW5kKytdLCB0YXJnZXQpOwotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9wby9NYWtlLWluIGIvYmludXRpbHMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3BvL1BPVEZJTEVTLmluIGIvYmludXRpbHMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTA1ODYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1hZGRyMmxpbmUuYwotYXIuYwotYXJzdXAuYwotYXJzdXAuaAotYnVjb21tLmMKLWJ1Y29tbS5oCi1idWRiZy5oCi1jb2ZmZHVtcC5jCi1jb2ZmZ3Jvay5jCi1jb2ZmZ3Jvay5oCi1kZWJ1Zy5jCi1kZWJ1Zy5jCi1kZWJ1Zy5oCi1kbGx0b29sLmMKLWRsbHRvb2wuaAotZGxsd3JhcC5jCi1keW4tc3RyaW5nLmMKLWR5bi1zdHJpbmcuaAotZmlsZW1vZGUuYwotaWVlZS5jCi1pZWVlLmMKLWlzLXJhbmxpYi5jCi1pcy1zdHJpcC5jCi1tYXliZS1yYW5saWIuYwotbWF5YmUtc3RyaXAuYwotbmxtY29udi5jCi1ubG1jb252LmgKLW5tLmMKLW5vdC1yYW5saWIuYwotbm90LXN0cmlwLmMKLW9iamNvcHkuYwotb2JqZHVtcC5jCi1wcmRiZy5jCi1yZGNvZmYuYwotcmRjb2ZmLmMKLXJkZGJnLmMKLXJkZGJnLmMKLXJlYWRlbGYuYwotcmVuYW1lLmMKLXJlc2Jpbi5jCi1yZXNjb2ZmLmMKLXJlc3JjLmMKLXJlc3Jlcy5jCi1zaXplLmMKLXNyY29udi5jCi1zdGFicy5jCi1zdGFicy5jCi1zdHJpbmdzLmMKLXN5c2R1bXAuYwotdmVyc2lvbi5jCi13aW5kcmVzLmMKLXdpbmRyZXMuaAotd2luZHVuaS5jCi13aW5kdW5pLmgKLXdyc3RhYnMuYwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcG8vYmludXRpbHMucG90IGIvYmludXRpbHMvcG8vYmludXRpbHMucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzc5NWNiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ODMgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDYtMDMgMDI6NTgtMDcwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFkZHIybGluZS5jOjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1DZnNIVl0gWy1iIGJmZG5hbWVdIFstLXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuIgotIiAgICAgICBbLS1iYXNlbmFtZXNdIFstLWZ1bmN0aW9uc10gW2FkZHIgYWRkciAuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogYWRkcjJsaW5lLmM6ODMgYXIuYzoyNTUgbmxtY29udi5jOjExNDEgbm0uYzozMDQgb2JqY29weS5jOjMxOCBvYmpjb3B5LmM6MzM3Ci0jOiBvYmpkdW1wLmM6MjM2IHJlYWRlbGYuYzoxMTY4IHNpemUuYzo4OSBzdHJpbmdzLmM6NTEyIHdpbmRyZXMuYzo3MzAKLW1zZ2lkICJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhZGRyMmxpbmUuYzoyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgZ2V0IGFkZHJlc3NlcyBmcm9tIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1de2RtcHFyc3R4fVthYmNpbG9zU3V2Vl0gW21lbWJlci1uYW1lXSBhcmNoaXZlLWZpbGUgZmlsZS4uLlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICAlcyAtTSBbPG1yaS1zY3JpcHRdXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMjcKLW1zZ2lkICIgY29tbWFuZHM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMjgKLW1zZ2lkICIgIGQgICAgICAgICAgICAtIGRlbGV0ZSBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIyOQotbXNnaWQgIiAgbVthYl0gICAgICAgIC0gbW92ZSBmaWxlKHMpIGluIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzAKLW1zZ2lkICIgIHAgICAgICAgICAgICAtIHByaW50IGZpbGUocykgZm91bmQgaW4gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMQotbXNnaWQgIiAgcVtmXSAgICAgICAgIC0gcXVpY2sgYXBwZW5kIGZpbGUocykgdG8gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMgotbXNnaWQgIiIKLSIgIHJbYWJdW2ZdW3VdICAtIHJlcGxhY2UgZXhpc3Rpbmcgb3IgaW5zZXJ0IG5ldyBmaWxlKHMpIGludG8gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMwotbXNnaWQgIiAgdCAgICAgICAgICAgIC0gZGlzcGxheSBjb250ZW50cyBvZiBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzQKLW1zZ2lkICIgIHhbb10gICAgICAgICAtIGV4dHJhY3QgZmlsZShzKSBmcm9tIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzUKLW1zZ2lkICIgY29tbWFuZCBzcGVjaWZpYyBtb2RpZmllcnM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzYKLW1zZ2lkICIgIFthXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGFmdGVyIFttZW1iZXItbmFtZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzNwotbXNnaWQgIiAgW2JdICAgICAgICAgIC0gcHV0IGZpbGUocykgYmVmb3JlIFttZW1iZXItbmFtZV0gKHNhbWUgYXMgW2ldKVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM4Ci1tc2dpZCAiICBbZl0gICAgICAgICAgLSB0cnVuY2F0ZSBpbnNlcnRlZCBmaWxlIG5hbWVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzkKLW1zZ2lkICIgIFtvXSAgICAgICAgICAtIHByZXNlcnZlIG9yaWdpbmFsIGRhdGVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDAKLW1zZ2lkICIiCi0iICBbdV0gICAgICAgICAgLSBvbmx5IHJlcGxhY2UgZmlsZXMgdGhhdCBhcmUgbmV3ZXIgdGhhbiBjdXJyZW50IGFyY2hpdmUgIgotImNvbnRlbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDEKLW1zZ2lkICIgZ2VuZXJpYyBtb2RpZmllcnM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDIKLW1zZ2lkICIgIFtjXSAgICAgICAgICAtIGRvIG5vdCB3YXJuIGlmIHRoZSBsaWJyYXJ5IGhhZCB0byBiZSBjcmVhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDMKLW1zZ2lkICIgIFtzXSAgICAgICAgICAtIGNyZWF0ZSBhbiBhcmNoaXZlIGluZGV4IChjZi4gcmFubGliKVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQ0Ci1tc2dpZCAiICBbU10gICAgICAgICAgLSBkbyBub3QgYnVpbGQgYSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI0NQotbXNnaWQgIiAgW3ZdICAgICAgICAgIC0gYmUgdmVyYm9zZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQ2Ci1tc2dpZCAiICBbVl0gICAgICAgICAgLSBkaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlclxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbLXZWXSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo0MzEKLW1zZ2lkICJ0d28gZGlmZmVyZW50IG9wZXJhdGlvbiBvcHRpb25zIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjUwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjUzMgotbXNnaWQgIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo1MzUKLW1zZ2lkICJgdScgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGByJyBvcHRpb24uIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnRlcm5hbCBlcnJvciAtLSB0aGlzIG9wdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjczMCBhci5jOjc4MiBhci5jOjEyMTIgb2JqY29weS5jOjk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSI8bWVtYmVyICVzPlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NzUxIGFyLmM6ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGlzIG5vdCBhIHZhbGlkIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo3ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhdCByZXR1cm5zIG5lZ2F0aXZlIHNpemUgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6OTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGlzIG5vdCBhbiBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6OTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjcmVhdGluZyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MTExMAotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBtZW1iZXIgbmFtZWQgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MTE2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gZW50cnkgJXMgaW4gYXJjaGl2ZSAlcyFcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjEzMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGFyY2hpdmUgbWFwIHRvIHVwZGF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIGVudHJ5ICVzIGluIGFyY2hpdmUuXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gb3V0cHV0IGFyY2hpdmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjE3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBhcmNoaXZlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgJXMgaXMgbm90IGFuIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gb3V0cHV0IGFyY2hpdmUgc3BlY2lmaWVkIHlldFxuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MjQ1IGFyc3VwLmM6MjgwIGFyc3VwLmM6MzE2IGFyc3VwLmM6MzM2IGFyc3VwLmM6Mzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoyNTMgYXJzdXAuYzozNTQgYXJzdXAuYzozNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MzAxIGFyc3VwLmM6MzcwIGFyc3VwLmM6NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzo0MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3VycmVudCBvcGVuIGFyY2hpdmUgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjQyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gb3BlbiAgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBzZXQgQkZEIGRlZmF1bHQgdGFyZ2V0IHRvIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjE1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTWF0Y2hpbmcgZm9ybWF0czoiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTY4Ci1tc2dpZCAiU3VwcG9ydGVkIHRhcmdldHM6IgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjE3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3VwcG9ydGVkIHRhcmdldHM6IgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIG51bWJlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIjbGluZXMgJWQgIgotbXNnc3RyICIiCi0KLSM6IGNvZmZkdW1wLmM6NDU2IHN5c2R1bXAuYzo3MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo0OTggc3Jjb252LmM6MTk0MCBzeXNkdW1wLmM6NzU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSAlcyB2ZXJzaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo1MTYgc3Jjb252LmM6MTk3NyBzeXNkdW1wLmM6Nzc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6NjUzCi1tc2dpZCAiZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo3MzYKLW1zZ2lkICJkZWJ1Z19zdGFydF9zb3VyY2U6IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6Nzk1Ci1tc2dpZCAiZGVidWdfcmVjb3JkX2Z1bmN0aW9uOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjg1MQotbXNnaWQgImRlYnVnX3JlY29yZF9wYXJhbWV0ZXI6IG5vIGN1cnJlbnQgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo4ODUKLW1zZ2lkICJkZWJ1Z19lbmRfZnVuY3Rpb246IG5vIGN1cnJlbnQgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo4OTEKLW1zZ2lkICJkZWJ1Z19lbmRfZnVuY3Rpb246IHNvbWUgYmxvY2tzIHdlcmUgbm90IGNsb3NlZCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjkyMQotbXNnaWQgImRlYnVnX3N0YXJ0X2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTU5Ci1tc2dpZCAiZGVidWdfZW5kX2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTY2Ci1tc2dpZCAiZGVidWdfZW5kX2Jsb2NrOiBhdHRlbXB0IHRvIGNsb3NlIHRvcCBsZXZlbCBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjk5MgotbXNnaWQgImRlYnVnX3JlY29yZF9saW5lOiBubyBjdXJyZW50IHVuaXQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUUKLSM6IGRlYnVnLmM6MTA0NgotbXNnaWQgImRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSMuIEZJWE1FCi0jOiBkZWJ1Zy5jOjEwNTgKLW1zZ2lkICJkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUUuCi0jOiBkZWJ1Zy5jOjExNTIKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfbGFiZWwgbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTE3OAotbXNnaWQgImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTE5NAotbXNnaWQgImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjE3NjQKLW1zZ2lkICJkZWJ1Z19tYWtlX3VuZGVmaW5lZF90eXBlOiB1bnN1cHBvcnRlZCBraW5kIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTk3MAotbXNnaWQgImRlYnVnX25hbWVfdHlwZTogbm8gY3VycmVudCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjAxOAotbXNnaWQgImRlYnVnX3RhZ190eXBlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDI2Ci1tc2dpZCAiZGVidWdfdGFnX3R5cGU6IGV4dHJhIHRhZyBhdHRlbXB0ZWQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGNoYW5naW5nIHR5cGUgc2l6ZSBmcm9tICVkIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDkwCi1tc2dpZCAiZGVidWdfZmluZF9uYW1lZF90eXBlOiBubyBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnX2dldF9yZWFsX3R5cGU6IGNpcmN1bGFyIGRlYnVnIGluZm9ybWF0aW9uIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjY2MwotbXNnaWQgImRlYnVnX3dyaXRlX3R5cGU6IGlsbGVnYWwgdHlwZSBlbmNvdW50ZXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6NzExIGRsbHRvb2wuYzo3MzUgZGxsdG9vbC5jOjc2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjc5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGRlZiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Nzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NpbmcgZGVmIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4MDMKLW1zZ2lkICJQcm9jZXNzZWQgZGVmIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjgyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW50YXggZXJyb3IgaW4gZGVmIGZpbGUgJXM6JWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5BTUU6ICVzIGJhc2U6ICV4IgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4NjQKLW1zZ2lkICJDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxJQlJBUlk6ICVzIGJhc2U6ICV4IgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndhaXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgInN1YnByb2Nlc3MgZ290IGZhdGFsIHNpZ25hbCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJTdWNraW5nIGluIGluZm8gZnJvbSAlcyBzZWN0aW9uIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhjbHVkaW5nIHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTM4NiBkbGx0b29sLmM6MTM5NyBubS5jOjkwMiBubS5jOjkxMyBvYmpkdW1wLmM6Mzc5IG9iamR1bXAuYzozOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogd2Ugb3VnaHQgdG8gcmVhZCBpbiBhbmQgYmxvY2sgb3V0IHRoZSBiYXNlIHJlbG9jYXRpb25zCi0jOiBkbGx0b29sLmM6MTQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJEb25lIHJlYWRpbmcgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTQzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gb3BlbiBvYmplY3QgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2Nhbm5pbmcgb2JqZWN0IGZpbGUgJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHByb2R1Y2UgbWNvcmUtZWxmIGRsbCBmcm9tIGFyY2hpdmUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE1MzgKLW1zZ2lkICJBZGRpbmcgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTU4MwotbXNnaWQgIkFkZGVkIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR2VuZXJhdGluZyBleHBvcnQgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9wZW5lZCB0ZW1wb3JhcnkgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE5MTgKLW1zZ2lkICJHZW5lcmF0ZWQgZXhwb3J0cyBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyMTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJmZF9vcGVuIGZhaWxlZCBvcGVuIHN0dWIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjIxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3JlYXRpbmcgc3R1YiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjU1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gb3BlbiB0ZW1wb3JhcnkgaGVhZCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjYyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gb3BlbiB0ZW1wb3JhcnkgdGFpbCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjY5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIC5saWIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI3MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkZWxldGUgJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI3NjEKLW1zZ2lkICJDcmVhdGVkIGxpYiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyODYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmcsIGlnbm9yaW5nIGR1cGxpY2F0ZSBFWFBPUlQgJXMgJWQsJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjg2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI5OTUKLW1zZ2lkICJQcm9jZXNzaW5nIGRlZmluaXRpb25zIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDMzCi1tc2dpZCAiUHJvY2Vzc2VkIGRlZmluaXRpb25zIgotbXNnc3RyICIiCi0KLSMuIHhnZXRleHQ6Yy1mb3JtYXQKLSM6IGRsbHRvb2wuYzozMDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIgotbXNnc3RyICIiCi0KLSMuIHhnZXRleHQ6Yy1mb3JtYXQKLSM6IGRsbHRvb2wuYzozMDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgICAtbSAtLW1hY2hpbmUgPG1hY2hpbmU+ICAgIENyZWF0ZSBhcyBETEwgZm9yIDxtYWNoaW5lPi4gIFtkZWZhdWx0OiAlc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA0NwotbXNnaWQgIiIKLSIgICAgICAgIHBvc3NpYmxlIDxtYWNoaW5lPjogYXJtW19pbnRlcndvcmtdLCBpMzg2LCBtY29yZVstZWxmXVstbGVdLCBwcGMsICIKLSJ0aHVtYlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDQ4Ci1tc2dpZCAiICAgLWUgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBleHBvcnQgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA0OQotbXNnaWQgIiAgIC1sIC0tb3V0cHV0LWxpYiA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTAKLW1zZ2lkICIgICAtYSAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDUxCi1tc2dpZCAiIgotIiAgIC1EIC0tZGxsbmFtZSA8bmFtZT4gICAgICAgTmFtZSBvZiBpbnB1dCBkbGwgdG8gcHV0IGludG8gaW50ZXJmYWNlIGxpYi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1MgotbXNnaWQgIiAgIC1kIC0taW5wdXQtZGVmIDxkZWZmaWxlPiAgTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1MwotbXNnaWQgIiAgIC16IC0tb3V0cHV0LWRlZiA8ZGVmZmlsZT4gTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NAotbXNnaWQgIiAgICAgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgRXhwb3J0IGFsbCBzeW1ib2xzIHRvIC5kZWZcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NQotbXNnaWQgIiAgICAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCBsaXN0ZWQgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDU2Ci1tc2dpZCAiICAgICAgLS1leGNsdWRlLXN5bWJvbHMgPGxpc3Q+IERvbid0IGV4cG9ydCA8bGlzdD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NwotbXNnaWQgIiAgICAgIC0tbm8tZGVmYXVsdC1leGNsdWRlcyAgQ2xlYXIgZGVmYXVsdCBleGNsdWRlIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1OAotbXNnaWQgIiAgIC1iIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1OQotbXNnaWQgIiAgIC14IC0tbm8taWRhdGE0ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNCBzZWN0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDYwCi1tc2dpZCAiICAgLWMgLS1uby1pZGF0YTUgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ1IHNlY3Rpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjEKLW1zZ2lkICIiCi0iICAgLVUgLS1hZGQtdW5kZXJzY29yZSAgICAgICBBZGQgdW5kZXJzY29yZXMgdG8gc3ltYm9scyBpbiBpbnRlcmZhY2UgIgotImxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjIKLW1zZ2lkICIgICAtayAtLWtpbGwtYXQgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDYzCi1tc2dpZCAiICAgLUEgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICBBZGQgYWxpYXNlcyB3aXRob3V0IEA8bj4uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjQKLW1zZ2lkICIgICAtUyAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlci5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA2NQotbXNnaWQgIiAgIC1mIC0tYXMtZmxhZ3MgPGZsYWdzPiAgICAgUGFzcyA8ZmxhZ3M+IHRvIHRoZSBhc3NlbWJsZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjYKLW1zZ2lkICIiCi0iICAgLW4gLS1uby1kZWxldGUgICAgICAgICAgICBLZWVwIHRlbXAgZmlsZXMgKHJlcGVhdCBmb3IgZXh0cmEgIgotInByZXNlcnZhdGlvbikuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjcKLW1zZ2lkICIgICAtdiAtLXZlcmJvc2UgICAgICAgICAgICAgIEJlIHZlcmJvc2UuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjgKLW1zZ2lkICIgICAtViAtLXZlcnNpb24gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA2OQotbXNnaWQgIiAgIC1oIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDcxCi1tc2dpZCAiIgotIiAgIC1NIC0tbWNvcmUtZWxmIDxvdXRuYW1lPiAgUHJvY2VzcyBtY29yZS1lbGYgb2JqZWN0IGZpbGVzIGludG8gPG91dG5hbWU+LlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDcyCi1tc2dpZCAiICAgLUwgLS1saW5rZXIgPG5hbWU+ICAgICAgICBVc2UgPG5hbWU+IGFzIHRoZSBsaW5rZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNzMKLW1zZ2lkICIgICAtRiAtLWxpbmtlci1mbGFncyA8ZmxhZ3M+IFBhc3MgPGZsYWdzPiB0byB0aGUgbGlua2VyLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBvcGVuIGJhc2UtZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMzODUKLW1zZ2lkICJidWZmZXIgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzE2Ci1tc2dpZCAidW5leHBlY3RlZCBlbmQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo0MTEKLW1zZ2lkICJpbnZhbGlkIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDcwCi1tc2dpZCAiaW52YWxpZCBzdHJpbmcgbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1MjcgaWVlZS5jOjU2OAotbXNnaWQgImV4cHJlc3Npb24gc3RhY2sgb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjU0NwotbXNnaWQgInVuc3VwcG9ydGVkIElFRUUgZXhwcmVzc2lvbiBvcGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTYyCi1tc2dpZCAidW5rbm93biBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1ODMKLW1zZ2lkICJleHByZXNzaW9uIHN0YWNrIHVuZGVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTk3Ci1tc2dpZCAiZXhwcmVzc2lvbiBzdGFjayBtaXNtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NjM2Ci1tc2dpZCAidW5rbm93biBidWlsdGluIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjc4MQotbXNnaWQgIkJDRCBmbG9hdCB0eXBlIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjkyNwotbXNnaWQgInVuZXhwZWN0ZWQgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo5MzQKLW1zZ2lkICJ1bmV4cGVjdGVkIHJlY29yZCB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo5NjcKLW1zZ2lkICJibG9ja3MgbGVmdCBvbiBzdGFjayBhdCBlbmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEyMzIKLW1zZ2lkICJ1bmtub3duIEJCIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEyNDEKLW1zZ2lkICJzdGFjayBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTI2NgotbXNnaWQgInN0YWNrIHVuZGVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTM4MCBpZWVlLmM6MTQ1MiBpZWVlLmM6MjE1MQotbXNnaWQgImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0MzAKLW1zZ2lkICJpbGxlZ2FsIHR5cGUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0NDAgaWVlZS5jOjE0NzcKLW1zZ2lkICJ1bmtub3duIFRZIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0NTkKLW1zZ2lkICJ1bmRlZmluZWQgdmFyaWFibGUgaW4gVFkiCi1tc2dzdHIgIiIKLQotIy4gUGFzY2FsIGZpbGUgbmFtZS4gIEZJWE1FLgotIzogaWVlZS5jOjE4NzAKLW1zZ2lkICJQYXNjYWwgZmlsZSBuYW1lIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE5MTgKLW1zZ2lkICJ1bnN1cHBvcnRlZCBxdWFsaWZlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjE4OQotbXNnaWQgInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBBVE4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjIyMzIKLW1zZ2lkICJ1bmtub3duIEFUTiB0eXBlIgotbXNnc3RyICIiCi0KLSMuIFJlc2VydmVkIGZvciBGT1JUUkFOIGNvbW1vbi4KLSM6IGllZWUuYzoyMzU0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgQVROMTEiCi1tc2dzdHIgIiIKLQotIy4gV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4KLSM6IGllZWUuYzoyMzgxCi1tc2dpZCAidW5zdXBwb3J0ZWQgQVROMTIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI0NDEKLW1zZ2lkICJ1bmV4cGVjdGVkIHN0cmluZyBpbiBDKysgbWlzYyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjQ1NAotbXNnaWQgImJhZCBtaXNjIHJlY29yZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjQ5NwotbXNnaWQgInVucmVjb2duaXplZCBDKysgbWlzYyByZWNvcmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2MTQKLW1zZ2lkICJ1bmRlZmluZWQgQysrIG9iamVjdCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjY0OAotbXNnaWQgInVucmVjb2duaXplZCBDKysgb2JqZWN0IHNwZWMiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2ODQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBDKysgb2JqZWN0IHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2OTQKLW1zZ2lkICJDKysgYmFzZSBjbGFzcyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjcwNiBpZWVlLmM6MjgxMQotbXNnaWQgIkMrKyBvYmplY3QgaGFzIG5vIGZpZWxkcyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjcyNQotbXNnaWQgIkMrKyBiYXNlIGNsYXNzIG5vdCBmb3VuZCBpbiBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI4MzIKLW1zZ2lkICJDKysgZGF0YSBtZW1iZXIgbm90IGZvdW5kIGluIGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjg3MyBpZWVlLmM6MzAyMwotbXNnaWQgInVua25vd24gQysrIHZpc2liaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI5MDcKLW1zZ2lkICJiYWQgQysrIGZpZWxkIGJpdCBwb3Mgb3Igc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjk5OQotbXNnaWQgImJhZCB0eXBlIGZvciBDKysgbWV0aG9kIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMDA5Ci1tc2dpZCAibm8gdHlwZSBpbmZvcm1hdGlvbiBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzA0OAotbXNnaWQgIkMrKyBzdGF0aWMgdmlydHVhbCBtZXRob2QiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMxNDMKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBvdmVyaGVhZCBzcGVjIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMTgyCi1tc2dpZCAidW5kZWZpbmVkIEMrKyB2dGFibGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMyNTMKLW1zZ2lkICJDKysgZGVmYXVsdCB2YWx1ZXMgbm90IGluIGEgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMyOTMKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIGRlZmF1bHQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzMyNAotbXNnaWQgInJlZmVyZW5jZSBwYXJhbWV0ZXIgaXMgbm90IGEgcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzQwOQotbXNnaWQgInVucmVjb2duaXplZCBDKysgcmVmZXJlbmNlIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM0OTEKLW1zZ2lkICJDKysgcmVmZXJlbmNlIG5vdCBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzQ5OQotbXNnaWQgIkMrKyByZWZlcmVuY2UgaXMgbm90IHBvaW50ZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM1MjggaWVlZS5jOjM1MzYKLW1zZ2lkICJtaXNzaW5nIHJlcXVpcmVkIEFTTiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzU2NiBpZWVlLmM6MzU3NAotbXNnaWQgIm1pc3NpbmcgcmVxdWlyZWQgQVRONjUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM1ODgKLW1zZ2lkICJiYWQgQVRONjUgcmVjb3JkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo0MjM1Ci1tc2dpZCAiSUVFRSBudW1lcmljIG92ZXJmbG93OiAweCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDI4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJRUVFIHN0cmluZyBsZW5ndGggb3ZlcmZsb3c6ICV1XG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjUzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSB1bnN1cHBvcnRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSAldVxuIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1MzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgZmxvYXQgdHlwZSBzaXplICV1XG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjUzODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSB1bnN1cHBvcnRlZCBjb21wbGV4IHR5cGUgc2l6ZSAldVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyNzUgc3Jjb252LmM6MTk2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzozMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlucHV0IGZpbGUgbmFtZWQgYm90aCBvbiBjb21tYW5kIGxpbmUgYW5kIHdpdGggSU5QVVRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBpbnB1dCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjM2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOmlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgbm90IGNvbXBhdGlibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDExCi1tc2dpZCAibWFrZSAuYnNzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQyMAotbXNnaWQgIm1ha2UgLm5sbXNlY3Rpb25zIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQyMgotbXNnaWQgInNldCAubmxtc2VjdGlvbnMgZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQ1MAotbXNnaWQgInNldCAuYnNzIHZtYSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDU3Ci1tc2dpZCAic2V0IC5kYXRhIHNpemUiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjYzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogc3ltYm9sICVzIGltcG9ydGVkIGJ1dCBub3QgaW4gaW1wb3J0IGxpc3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NjU4Ci1tc2dpZCAic2V0IHN0YXJ0IGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjcwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogU1RBUlQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjcxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogRVhJVCBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBDSEVDSyBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzM2IG5sbWNvbnYuYzo5MjgKLW1zZ2lkICJjdXN0b20gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzU3IG5sbWNvbnYuYzo5NjAKLW1zZ2lkICJoZWxwIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjc3OSBubG1jb252LmM6OTc5Ci1tc2dpZCAibWVzc2FnZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3OTUgbmxtY29udi5jOjEwMTIKLW1zZ2lkICJtb2R1bGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6ODE1IG5sbWNvbnYuYzoxMDI5Ci1tc2dpZCAicnBjIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjg1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolczogd2FybmluZzogc2hhcmVkIGxpYnJhcmllcyBjYW4gbm90IGhhdmUgdW5pbml0aWFsaXplZCBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjg3MyBubG1jb252LmM6MTA0OQotbXNnaWQgInNoYXJlZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo4ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IE5vIHZlcnNpb24gbnVtYmVyIGdpdmVuXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjkyMiBubG1jb252LmM6OTU0IG5sbWNvbnYuYzo5NzMgbmxtY29udi5jOjEwMjMgbmxtY29udi5jOjEwNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXM6IHJlYWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjk0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogTUFQIGFuZCBGVUxMTUFQIGFyZSBub3Qgc3VwcG9ydGVkOyB0cnkgbGQgLU1cbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ29udmVydCBhbiBvYmplY3QgZmlsZSBpbnRvIGEgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstZGhWXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstVCBoZWFkZXItZmlsZV0gWy1sIGxpbmtlcl1cbiIKLSIgICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0taGVhZGVyLWZpbGU9ZmlsZV0gWy0tbGlua2VyPWxpbmtlcl0gWy0tZGVidWddXG4iCi0iICAgICAgIFstLWhlbHBdIFstLXZlcnNpb25dXG4iCi0iICAgICAgIFtpbi1maWxlIFtvdXQtZmlsZV1dXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjExNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN1cHBvcnQgbm90IGNvbXBpbGVkIGluIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjE2Ci1tc2dpZCAibWFrZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjMwCi1tc2dpZCAic2V0IHNlY3Rpb24gc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTIzNgotbXNnaWQgInNldCBzZWN0aW9uIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTI0MAotbXNnaWQgInNldCBzZWN0aW9uIGZsYWdzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjUxCi1tc2dpZCAic2V0IC5ubG1zZWN0aW9ucyBzaXplIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMzM5IG5sbWNvbnYuYzoxMzQ3IG5sbWNvbnYuYzoxMzU2IG5sbWNvbnYuYzoxMzYxCi1tc2dpZCAic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxODY0Ci1tc2dpZCAic3R1YiBzZWN0aW9uIHNpemVzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxOTEzCi1tc2dpZCAid3JpdGluZyBzdHViIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyMDAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlc29sdmVkIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogb3ZlcmZsb3cgd2hlbiBhZGp1c3RpbmcgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjIxOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGV4ZWN1dGlvbiBvZiAlcyBmYWlsZWQ6ICIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjIwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRXhlY3V0aW9uIG9mICVzIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1hQUJDRGdsbm9wUHJzdXZWXSBbLXQgcmFkaXhdIFstLXJhZGl4PXJhZGl4XSBbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0tZGVidWctc3ltc10gWy0tZXh0ZXJuLW9ubHldIFstLXByaW50LWFybWFwXSBbLS1wcmludC1maWxlLW5hbWVdXG4iCi0iICAgICAgIFstLW51bWVyaWMtc29ydF0gWy0tbm8tc29ydF0gWy0tcmV2ZXJzZS1zb3J0XSBbLS1zaXplLXNvcnRdXG4iCi0iICAgICAgIFstLXVuZGVmaW5lZC1vbmx5XSBbLS1wb3J0YWJpbGl0eV0gWy1mIHtic2Qsc3lzdixwb3NpeH1dXG4iCi0iICAgICAgIFstLWZvcm1hdD17YnNkLHN5c3YscG9zaXh9XSBbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdIFstLWR5bmFtaWNdXG4iCi0iICAgICAgIFstLWRlZmluZWQtb25seV0gWy0tbGluZS1udW1iZXJzXVxuIgotIiAgICAgICBbLS12ZXJzaW9uXSBbLS1oZWxwXVxuIgotIiAgICAgICBbZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IGludmFsaWQgcmFkaXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjM2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IGludmFsaWQgb3V0cHV0IGZvcm1hdFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6NDkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxMjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJVbmRlZmluZWQgc3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTI4NCBubS5jOjEzMzgKLW1zZ2lkICIiCi0iTmFtZSAgICAgICAgICAgICAgICAgIFZhbHVlICAgQ2xhc3MgICAgICAgIFR5cGUgICAgICAgICBTaXplICAgTGluZSAgIgotIlNlY3Rpb25cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEzMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXNbJXNdOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzWyVzXTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjE1MDgKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSBpbmRleDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy12VlNwZ3hYXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstRiBiZmRuYW1lXSBbLWIgYnl0ZV1cbiIKLSIgICAgICAgWy1SIHNlY3Rpb25dIFstaSBpbnRlcmxlYXZlXSBbLS1pbnRlcmxlYXZlPWludGVybGVhdmVdIFstLWJ5dGU9Ynl0ZV1cbiIKLSIgICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV0gIgotIlstLXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLS1zdHJpcC1hbGxdIFstLXN0cmlwLWRlYnVnXSBbLS1zdHJpcC11bm5lZWRlZF0gWy0tZGlzY2FyZC1hbGxdXG4iCi0iICAgICAgIFstLWRpc2NhcmQtbG9jYWxzXSBbLS1kZWJ1Z2dpbmddIFstLXJlbW92ZS1zZWN0aW9uPXNlY3Rpb25dXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjMwMAotbXNnaWQgIiIKLSIgICAgICAgWy0tZ2FwLWZpbGw9dmFsXSBbLS1wYWQtdG89YWRkcmVzc10gWy0tcHJlc2VydmUtZGF0ZXNdXG4iCi0iICAgICAgIFstLXNldC1zdGFydD12YWxdIFxuIgotIiAgICAgICBbLS1jaGFuZ2Utc3RhcnQ9aW5jcl0gWy0tY2hhbmdlLWFkZHJlc3Nlcz1pbmNyXSBcbiIKLSIgICAgICAgKC0tYWRqdXN0LXN0YXJ0ICAgYW5kICAtLWFkanVzdC12bWEgYXJlIGFsaWFzZXMgZm9yIHRoZXNlIHR3bykgXG4iCi0iICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3M9c2VjdGlvbns9LCssLX12YWxdXG4iCi0iICAgICAgICgtLWFkanVzdC1zZWN0aW9uLXZtYSBpcyBhbiBhbGlhcyBmb3IgLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzKVxuIgotIiAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi1sbWE9c2VjdGlvbns9LCssLX12YWxdXG4iCi0iICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLXZtYT1zZWN0aW9uez0sKywtfXZhbF1cbiIKLSIgICAgICAgWy0tYWRqdXN0LXdhcm5pbmdzXSBbLS1uby1hZGp1c3Qtd2FybmluZ3NdXG4iCi0iICAgICAgIFstLWNoYW5nZS13YXJuaW5nc10gWy0tbm8tY2hhbmdlLXdhcm5pbmdzXVxuIgotIiAgICAgICBbLS1zZXQtc2VjdGlvbi1mbGFncz1zZWN0aW9uPWZsYWdzXSAiCi0iWy0tYWRkLXNlY3Rpb249c2VjdGlvbm5hbWU9ZmlsZW5hbWVdXG4iCi0iICAgICAgIFstLWtlZXAtc3ltYm9sIHN5bWJvbF0gWy1LIHN5bWJvbF0gWy0tc3RyaXAtc3ltYm9sIHN5bWJvbF0gWy1OICIKLSJzeW1ib2xdXG4iCi0iICAgICAgIFstLWxvY2FsaXplLXN5bWJvbCBzeW1ib2xdIFstTCBzeW1ib2xdIFstLXdlYWtlbi1zeW1ib2wgc3ltYm9sXVxuIgotIiAgICAgICBbLVcgc3ltYm9sXSBbLS1jaGFuZ2UtbGVhZGluZy1jaGFyXSBbLS1yZW1vdmUtbGVhZGluZy1jaGFyXSAiCi0iWy0td2Vha2VuXVxuIgotIiAgICAgICBbLS12ZXJib3NlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBpbi1maWxlIFtvdXQtZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MzI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy12VnNTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1SIHNlY3Rpb25dXG4iCi0iICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdICIKLSJbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0tc3RyaXAtYWxsXSBbLS1zdHJpcC1kZWJ1Z10gWy0tc3RyaXAtdW5uZWVkZWRdIFstLWRpc2NhcmQtYWxsXVxuIgotIiAgICAgICBbLS1kaXNjYXJkLWxvY2Fsc10gWy0ta2VlcC1zeW1ib2wgc3ltYm9sXSBbLUsgc3ltYm9sXVxuIgotIiAgICAgICBbLS1zdHJpcC1zeW1ib2wgc3ltYm9sXSBbLU4gc3ltYm9sXSBbLS1yZW1vdmUtc2VjdGlvbj1zZWN0aW9uXVxuIgotIiAgICAgICBbLW8gZmlsZV0gWy0tcHJlc2VydmUtZGF0ZXNdIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdICIKLSJmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjM4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgc2VjdGlvbiBmbGFnIGAlcyciCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjM4NAotbXNnaWQgInN1cHBvcnRlZCBmbGFnczogYWxsb2MsIGxvYWQsIHJlYWRvbmx5LCBjb2RlLCBkYXRhLCByb20sIGNvbnRlbnRzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo2MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29weSBmcm9tICVzKCVzKSB0byAlcyglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6NjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IE91dHB1dCBmaWxlIGNhbm5vdCByZXByZXNlbnQgYXJjaGl0ZWN0dXJlICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo2NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgY3JlYXRlIHNlY3Rpb24gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjc1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBmaWxsIGdhcCBhZnRlciAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjc4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBhZGQgcGFkZGluZyB0byAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjkxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3IgY29weWluZyBwcml2YXRlIEJGRCBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6OTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBta2RpciAlcyBmb3IgYXJjaGl2ZSBjb3B5aW5nIChlcnJvcjogJXMpIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxMjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzZWN0aW9uIGAlcyc6IGVycm9yIGluICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgY3JlYXRlIGRlYnVnZ2luZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3Qgc2V0IGRlYnVnZ2luZyBzZWN0aW9uIGNvbnRlbnRzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTUxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTYxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IHN0YXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNjY4Ci1tc2dpZCAiYnl0ZSBudW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE2NzMKLW1zZ2lkICJpbnRlcmxlYXZlIG11c3QgYmUgcG9zaXRpdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NDIKLW1zZ2lkICJiYWQgZm9ybWF0IGZvciAtLWFkZC1zZWN0aW9uIE5BTUU9RklMRU5BTUUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQ6ICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTc2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbjogJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNzY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmcmVhZCBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogdHJ1bmNhdGluZyBnYXAtZmlsbCBmcm9tIDB4JXMgdG8gMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTg5MgotbXNnaWQgImJhZCBmb3JtYXQgZm9yIC0tc2V0LXNlY3Rpb24tZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5MjIKLW1zZ2lkICJieXRlIG51bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcmxlYXZlIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxOTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBzdGF0OiAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi12bWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTk5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiAtLWNoYW5nZS1zZWN0aW9uLWxtYSAlcyVjMHglcyBuZXZlciB1c2VkIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWFoaWZDZERwclJ0VHhzU2x3XSBbLWIgYmZkbmFtZV0gWy1tIG1hY2hpbmVdIFstaiBzZWN0aW9uLW5hbWVdXG4iCi0iICAgICAgIFstLWFyY2hpdmUtaGVhZGVyc10gWy0tdGFyZ2V0PWJmZG5hbWVdIFstLWRlYnVnZ2luZ10gWy0tZGlzYXNzZW1ibGVdXG4iCi0iICAgICAgIFstLWRpc2Fzc2VtYmxlLWFsbF0gWy0tZGlzYXNzZW1ibGUtemVyb2VzXSBbLS1maWxlLWhlYWRlcnNdXG4iCi0iICAgICAgIFstLXNlY3Rpb24taGVhZGVyc10gWy0taGVhZGVyc11cbiIKLSIgICAgICAgWy0taW5mb10gWy0tc2VjdGlvbj1zZWN0aW9uLW5hbWVdIFstLWxpbmUtbnVtYmVyc10gWy0tc291cmNlXVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMjYKLW1zZ2lkICIiCi0iICAgICAgIFstLWFyY2hpdGVjdHVyZT1tYWNoaW5lXSBbLS1yZWxvY10gWy0tZnVsbC1jb250ZW50c10gWy0tc3RhYnNdXG4iCi0iICAgICAgIFstLXN5bXNdIFstLWFsbC1oZWFkZXJzXSBbLS1keW5hbWljLXN5bXNdIFstLWR5bmFtaWMtcmVsb2NdXG4iCi0iICAgICAgIFstLXdpZGVdIFstLXZlcnNpb25dIFstLWhlbHBdIFstLXByaXZhdGUtaGVhZGVyc11cbiIKLSIgICAgICAgWy0tc3RhcnQtYWRkcmVzcz1hZGRyXSBbLS1zdG9wLWFkZHJlc3M9YWRkcl1cbiIKLSIgICAgICAgWy0tcHJlZml4LWFkZHJlc3Nlc10gWy0tW25vLV1zaG93LXJhdy1pbnNuXSBbLS1kZW1hbmdsZV1cbiIKLSIgICAgICAgWy0tYWRqdXN0LXZtYT1vZmZzZXRdIFstRUJ8LUVMXSBbLS1lbmRpYW49e2JpZ3xsaXR0bGV9XSBvYmpmaWxlLi4uXG4iCi0iYXQgbGVhc3Qgb25lIG9wdGlvbiBiZXNpZGVzIC1sICgtLWxpbmUtbnVtYmVycykgbXVzdCBiZSBnaXZlblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzozNjEKLW1zZ2lkICJTZWN0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MzYzCi1tc2dpZCAiSWR4IE5hbWUgICAgICAgICAgU2l6ZSAgICAgIFZNQSAgICAgICBMTUEgICAgICAgRmlsZSBvZmYgIEFsZ25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MzY1Ci1tc2dpZCAiIgotIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgICAgICAgICBMTUEgICAgICAgICAgICAgICBGaWxlIG9mZiAgIgotIkFsZ25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogbm90IGEgZHluYW1pYyBvYmplY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogTm8gZHluYW1pYyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjExMzEKLW1zZ2lkICJPdXQgb2YgdmlydHVhbCBtZW1vcnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTUzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgdXNlIHN1cHBsaWVkIG1hY2hpbmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTU1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgZGlzYXNzZW1ibGUgZm9yIGFyY2hpdGVjdHVyZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxNjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIk5vICVzIHNlY3Rpb24gcHJlc2VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlcyBoYXMgbm8gJXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODE4IG9iamR1bXAuYzoxODI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBSZWFkaW5nICVzIHNlY3Rpb24gb2YgJXMgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxOTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdGVjdHVyZTogJXMsICIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJmbGFncyAweCUwOHg6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE5ODcKLW1zZ2lkICIiCi0iXG4iCi0ic3RhcnQgYWRkcmVzcyAweCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjAzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBwcmludGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIxMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW4gYXJjaGl2ZSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjE1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyNjY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJGRCBoZWFkZXIgZmlsZSB2ZXJzaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjI3ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCAtRSBvcHRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjgwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZWNvZ25pemVkIC0tZW5kaWFuIHR5cGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjIwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcGFyc2VfY29mZl90eXBlOiBCYWQgdHlwZSBjb2RlIDB4JXhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZGNvZmYuYzo0MjMgcmRjb2ZmLmM6NTMxIHJkY29mZi5jOjcxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6NDM5IHJkY29mZi5jOjczMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX2NvZmZfZ2V0X2F1eGVudCBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6Nzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlbGQ6IC5iZiB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjg0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJWxkOiB1bmV4cGVjdGVkIC5lZlxuIgotbXNnc3RyICIiCi0KLSM6IHJkZGJnLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHJlY29nbml6ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmRkYmcuYzo0MDAKLW1zZ2lkICJMYXN0IHN0YWJzIGVudHJpZXMgYmVmb3JlIGVycm9yOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMzcgcmVhZGVsZi5jOjI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRXJyb3I6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQ5IHJlYWRlbGYuYzoyNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFdhcm5pbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA4IHJlYWRlbGYuYzozMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzIKLW1zZ2lkICJEb24ndCBrbm93IGFib3V0IHJlbG9jYXRpb25zIG9uIHRoaXMgbWFjaGluZSBhcmNoaXRlY3R1cmVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDEwIHJlYWRlbGYuYzo0MzkKLW1zZ2lkICJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NTYKLW1zZ2lkICIiCi0iICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lICAgICAgICAgICIKLSJBZGRlbmRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDU5Ci1tc2dpZCAiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbmlzZWQ6ICUtN2x4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3BlcmF0aW5nIFN5c3RlbSBzcGVjaWZpYzogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NDQgcmVhZGVsZi5jOjk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzU4Ci1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc1OQotbXNnaWQgIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2MAotbXNnaWQgIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2MQotbXNnaWQgIkRZTiAoU2hhcmVkIG9iamVjdCBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzYyCi1tc2dpZCAiQ09SRSAoQ29yZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9TIFNwZWNpZmljOiAoJXgpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NzAgcmVhZGVsZi5jOjgyOSByZWFkZWxmLmM6OTMyIHJlYWRlbGYuYzoxMTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJXgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc4MwotbXNnaWQgIk5vbmUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjkyOQotbXNnaWQgIkVMRkRBVEEyTFNCIChsaXR0bGUgZW5kaWFuKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6OTMwCi1tc2dpZCAiRUxGREFUQTJNU0IgKGJpZyBlbmRpYW4pIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQzCi1tc2dpZCAiVXNhZ2U6IHJlYWRlbGYge29wdGlvbnN9IGVsZi1maWxlKHMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDQKLW1zZ2lkICIgIE9wdGlvbnMgYXJlOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ1Ci1tc2dpZCAiIgotIiAgLWEgb3IgLS1hbGwgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvOiAtaCAtbCAtUyAtcyAtciAtZCAtViAtLWhpc3RvZ3JhbVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ2Ci1tc2dpZCAiICAtaCBvciAtLWZpbGUtaGVhZGVyICAgICAgIERpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ3Ci1tc2dpZCAiICAtbCBvciAtLXByb2dyYW0taGVhZGVycyBvciAtLXNlZ21lbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDgKLW1zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDkKLW1zZ2lkICIgIC1TIG9yIC0tc2VjdGlvbi1oZWFkZXJzIG9yIC0tc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MAotbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTEKLW1zZ2lkICIgIC1lIG9yIC0taGVhZGVycyAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MgotbXNnaWQgIiAgLXMgb3IgLS1zeW1zIG9yIC0tc3ltYm9scyBEaXNwbGF5IHRoZSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MwotbXNnaWQgIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NAotbXNnaWQgIiAgLWQgb3IgLS1keW5hbWljICAgICAgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQgKGlmIHByZXNlbnQpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTUKLW1zZ2lkICIgIC1WIG9yIC0tdmVyc2lvbi1pbmZvICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBzZWN0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NgotbXNnaWQgIiIKLSIgIC1EIG9yIC0tdXNlLWR5bmFtaWMgICAgICAgVXNlIHRoZSBkeW5hbWljIHNlY3Rpb24gaW5mbyB3aGVuIGRpc3BsYXlpbmcgIgotInN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NwotbXNnaWQgIiAgLXggPG51bWJlcj4gb3IgLS1oZXgtZHVtcD08bnVtYmVyPlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTU4Ci1tc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXAgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1OQotbXNnaWQgIiAgLXdbbGlhcHJdIG9yIC0tZGVidWctZHVtcFs9bGluZSw9aW5mbyw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTYwCi1tc2dpZCAiIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBEV0FSRjIgZGVidWcgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE2MgotbXNnaWQgIiAgLWkgPG51bWJlcj4gb3IgLS1pbnN0cnVjdGlvbi1kdW1wPTxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjMKLW1zZ2lkICIiCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjUKLW1zZ2lkICIgICAgICAgIC0taGlzdG9ncmFtICAgICAgICAgRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3Roc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTY2Ci1tc2dpZCAiICAtdiBvciAtLXZlcnNpb24gICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGZcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE2NwotbXNnaWQgIiAgLUggb3IgLS1oZWxwICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE4NQotbXNnaWQgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkdW1wIHJlcXVlc3QgdGFibGUuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBkZWJ1ZyBvcHRpb24gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3B0aW9uICctJWMnXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNDcKLW1zZ2lkICJOb3RoaW5nIHRvIGRvLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzYwIHJlYWRlbGYuYzoxMzc3IHJlYWRlbGYuYzoyNTMxCi1tc2dpZCAibm9uZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM2MQotbXNnaWQgIkVMRjMyIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzYyCi1tc2dpZCAiRUxGNjQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNjQgcmVhZGVsZi5jOjEzODEgcmVhZGVsZi5jOjEzOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd246ICVseD4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNzgKLW1zZ2lkICIyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM3OQotbXNnaWQgIjIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk0Ci1tc2dpZCAiVU5JWCAtIFN5c3RlbSBWIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk1Ci1tc2dpZCAiVU5JWCAtIEhQLVVYIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk2Ci1tc2dpZCAiU3RhbmRhbG9uZSBBcHAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0MTMKLW1zZ2lkICJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDIxCi1tc2dpZCAiRUxGIEhlYWRlcjpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQyMgotbXNnaWQgIiAgTWFnaWM6ICAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDI4IHJlYWRlbGYuYzoxNDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlbGQgKGJ5dGVzIGludG8gZmlsZSlcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ3NgotbXNnaWQgIk5vdCBhIDMyIGJpdCBFTEYgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDk2Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBwcm9ncmFtIGhlYWRlcnMgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFbGYgZmlsZSBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkVudHJ5IHBvaW50IDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhlcmUgYXJlICVkIHByb2dyYW0gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICVseDpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTUxNyByZWFkZWxmLmM6MTY2OCByZWFkZWxmLmM6MTcxMSByZWFkZWxmLmM6MjA5MCByZWFkZWxmLmM6MjIxNAotIzogcmVhZGVsZi5jOjMxMTUgcmVhZGVsZi5jOjMxMjkKLW1zZ2lkICJPdXQgb2YgbWVtb3J5XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1NDIKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiBNZW1TaXogIEZsZyBBbGlnblxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTc4Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTU4NgotbXNnaWQgIlVuYWJsZSB0byBmaW5kIHByb2dyYW0gaW50ZXJwcmV0ZXIgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc10iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2MTEKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjEyCi1tc2dpZCAiICBTZWdtZW50IFNlY3Rpb25zLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE3NDYKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHNlY3Rpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTc1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNzg2Ci1tc2dpZCAiRmlsZSBjb250YWlucyBtdWx0aXBsZSBkeW5hbWljIHN5bWJvbCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTc5OQotbXNnaWQgIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzdHJpbmcgdGFibGVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4MjgKLW1zZ2lkICIiCi0iICBbTnJdIE5hbWUgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsZyBMayAiCi0iSW5mIEFsXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWxkIGJ5dGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTE2Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk0MwotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5ODIKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjA3MAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTI4Ci1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGUhIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTM0Ci1tc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gbG9hZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTY0Ci1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjE3MAotbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjIzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyMzQKLW1zZ2lkICIgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAweCUtOC44bHggKCVzKSUqcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjI1NAotbXNnaWQgIkF1eGlsaWFyeSBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjU2Ci1tc2dpZCAiRmlsdGVyIGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNjggcmVhZGVsZi5jOjIyODkgcmVhZGVsZi5jOjIzMTUKLW1zZ2lkICJGbGFnczoiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNzAgcmVhZGVsZi5jOjIyOTEgcmVhZGVsZi5jOjIzMTcKLW1zZ2lkICIgTm9uZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNoYXJlZCBsaWJyYXJ5OiBbJXNdIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDI1Ci1tc2dpZCAiIHByb2dyYW0gaW50ZXJwcmV0ZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQ4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJOb3QgbmVlZGVkIG9iamVjdDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTgwCi1tc2dpZCAiICBBZGRyOiAweCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU4MiByZWFkZWxmLmM6Mjc3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFJldjogJWQgIEZsYWdzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjYxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEluZGV4OiAlZCAgQ250OiAlZCAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTmFtZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFBhcmVudCAlZCwgbmFtZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gbmVlZHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjY4Ci1tc2dpZCAiIEFkZHI6IDB4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT2Zmc2V0OiAlIzA4bHggIExpbmsgdG8gc2VjdGlvbjogJWxkICglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBWZXJzaW9uOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmlsZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQ250OiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWUgaW5kZXg6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjcyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzY5Ci1tc2dpZCAiIEFkZHI6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjc5OAotbXNnaWQgIiAgIDAgKCpsb2NhbCopICAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjgwMgotbXNnaWQgIiAgIDEgKCpnbG9iYWwqKSAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzAyNQotbXNnaWQgIiIKLSJcbiIKLSJObyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzAzOAotbXNnaWQgIkxPQ0FMIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDM5Ci1tc2dpZCAiR0xPQkFMIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDQwCi1tc2dpZCAiV0VBSyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA0MyByZWFkZWxmLmM6MzA2NwotIywgYy1mb3JtYXQKLW1zZ2lkICI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNDUgcmVhZGVsZi5jOjMwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPE9TIHNwZWNpZmljPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNDcgcmVhZGVsZi5jOjMwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MAotbXNnaWQgIk5PVFlQRSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MQotbXNnaWQgIk9CSkVDVCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MgotbXNnaWQgIkZVTkMiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNjMKLW1zZ2lkICJTRUNUSU9OIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDY0Ci1tc2dpZCAiRklMRSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzEyMQotbXNnaWQgIlVuYWJsZSB0byByZWFkIGluIGR5bmFtaWMgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMTYzCi1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE2OQotbXNnaWQgIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxNzUKLW1zZ2lkICJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxOTUKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIGZvciBpbWFnZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE5NgotbXNnaWQgIiAgTnVtIEJ1YzogICAgVmFsdWUgIFNpemUgICBUeXBlICAgQmluZCBPdCBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgJyVzJyBjb250YWlucyAlbHUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzI0NAotbXNnaWQgIiAgTnVtOiAgICBWYWx1ZSAgU2l6ZSBUeXBlICAgIEJpbmQgICBPdCAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzM1NgotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzQxNQotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIHN5bWJvbCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciBkaXNwbGF5aW5nIHN5bWJvbHMuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM0MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoICh0b3RhbCBvZiAlZCBidWNrZXRzKTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzQyOQotbXNnaWQgIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM0MzQgcmVhZGVsZi5jOjM0NTMgcmVhZGVsZi5jOjUzMzYgcmVhZGVsZi5jOjU1MjYKLW1zZ2lkICJPdXQgb2YgbWVtb3J5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzUwMgotbXNnaWQgIiBOdW06IE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZFRvICAgICBGbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBc3NlbWJseSBkdW1wIG9mIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzU3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzcyOAotbXNnaWQgImJhZGx5IGZvcm1lZCBleHRlbmRlZCBsaW5lIG9wIGVuY291bnRlcmVkISIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzczNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEV4dGVuZGVkIG9wY29kZSAlZDogIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzQwCi1tc2dpZCAiIgotIkVuZCBvZiBTZXF1ZW5jZVxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNldCBBZGRyZXNzIHRvIDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NTIKLW1zZ2lkICIgIGRlZmluZSBuZXcgRmlsZSBUYWJsZSBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzUzIHJlYWRlbGYuYzozODcxCi1tc2dpZCAiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJWRcdCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc1OCByZWFkZWxmLmM6Mzc2MCByZWFkZWxmLmM6Mzc2MiByZWFkZWxmLmM6Mzg4MyByZWFkZWxmLmM6Mzg4NQotIzogcmVhZGVsZi5jOjM4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJWx1XHQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVU5LTk9XTjogbGVuZ3RoICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR1bXAgb2YgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzgwMQotbXNnaWQgIlRoZSBsaW5lIGluZm8gYXBwZWFycyB0byBiZSBjb3JydXB0IC0gdGhlIHNlY3Rpb24gaXMgdG9vIHNtYWxsXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MDkKLW1zZ2lkICJPbmx5IERXQVJGIHZlcnNpb24gMiBsaW5lIGluZm8gaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzgyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBEV0FSRiBWZXJzaW9uOiAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBQcm9sZ3VlIExlbmd0aDogICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNaW5pbXVtIEluc3RydWN0aW9uIExlbmd0aDogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJbml0aWFsIHZhbHVlIG9mICdpc19zdG10JzogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMaW5lIEJhc2U6ICAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMaW5lIFJhbmdlOiAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPcGNvZGUgQmFzZTogICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NDAKLW1zZ2lkICIiCi0iXG4iCi0iIE9wY29kZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPcGNvZGUgJWQgaGFzICVkIGFyZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg0OQotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIERpcmVjdG9yeSBUYWJsZSBpcyBlbXB0eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg1MgotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NjcKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBGaWxlIE5hbWUgVGFibGUgaXMgZW1wdHkuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NzAKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBGaWxlIE5hbWUgVGFibGU6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlZFx0IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzXG4iCi1tc2dzdHIgIiIKLQotIy4gTm93IGRpc3BsYXkgdGhlIHN0YXRlbWVudHMuCi0jOiByZWFkZWxmLmM6Mzg5NwotbXNnaWQgIiIKLSJcbiIKLSIgTGluZSBOdW1iZXIgU3RhdGVtZW50czpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkxNQotbXNnaWQgIiAgQ29weVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQWR2YW5jZSBQQyBieSAlZCB0byAlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgTGluZSBieSAlZCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2V0IEZpbGUgTmFtZSB0byBlbnRyeSAlZCBpbiB0aGUgRmlsZSBOYW1lIFRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgY29sdW1uIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgaXNfc3RtdCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTU3Ci1tc2dpZCAiICBTZXQgYmFzaWMgYmxvY2tcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk2NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgY29uc3RhbnQgJWQgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgZml4ZWQgc2l6ZSBhbW91bnQgJWQgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNwZWNpYWwgb3Bjb2RlICVkOiBhZHZhbmNlIEFkZHJlc3MgYnkgJWQgdG8gMHglbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFuZCBMaW5lIGJ5ICVkIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMDcgcmVhZGVsZi5jOjQ0MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDI2Ci1tc2dpZCAiT25seSBEV0FSRiAyIHB1Ym5hbWVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbyBzZWN0aW9uOiAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIGFyZWEgaW4gLmRlYnVnX2luZm8gc2VjdGlvbjogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzkKLW1zZ2lkICIiCi0iXG4iCi0iICAgIE9mZnNldFx0TmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gVEFHIHZhbHVlOiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQyMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBBVCB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRk9STSB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDMyCi1tc2dpZCAiICBOdW1iZXIgVEFHXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJWxkICAgICAgJXMgICAgWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDQxCi1tc2dpZCAiaGFzIGNoaWxkcmVuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDQxCi1tc2dpZCAibm8gY2hpbGRyZW4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICUtMThzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBieXRlIGJsb2NrOiAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ2MzMKLW1zZ2lkICIoVXNlciBkZWZpbmVkIGxvY2F0aW9uIG9wKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDYzNQotbXNnaWQgIihVbmtub3duIGxvY2F0aW9uIG9wKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gaGFuZGxlIEZPUk06ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBmb3JtOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc2OQotbXNnaWQgIihub3QgaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NzAKLW1zZ2lkICIoaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NzEKLW1zZ2lkICIoZGVjbGFyZWQgYXMgaW5saW5lIGJ1dCBpZ25vcmVkKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc3MgotbXNnaWQgIihkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGlubGluZWQpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgKFVua25vd24gaW5saW5lIGF0dHJpYnV0ZSB2YWx1ZTogJWx4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDkwMyByZWFkZWxmLmM6NTAyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVGhlIHNlY3Rpb24gJXMgY29udGFpbnM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MjUKLW1zZ2lkICJPbmx5IHZlcnNpb24gMiBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTI5Ci1tc2dpZCAiICBDb21waWxhdGlvbiBVbml0OlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIExlbmd0aDogICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIFZlcnNpb246ICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgQWJicmV2IE9mZnNldDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgUG9pbnRlciBTaXplOiAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk1MwotbXNnaWQgIlVuYWJsZSB0byBsb2NhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBsb2NhdGUgZW50cnkgJWQgaW4gdGhlIGFiYnJldmlhdGlvbiB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiA8JWQ+PCV4PjogQWJicmV2IE51bWJlcjogJWQgKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTA0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvOiAgJWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBQb2ludGVyIFNpemU6ICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZWdtZW50IFNpemU6ICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNTEKLW1zZ2lkICIiCi0iXG4iCi0iICAgIEFkZHJlc3MgIExlbmd0aFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc3BsYXlpbmcgdGhlIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gJyVzJyBoYXMgbm8gZGVidWdnaW5nIGRhdGEuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIGRlYnVnIHNlY3Rpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxODMKLW1zZ2lkICJTb21lIHNlY3Rpb25zIHdlcmUgbm90IGR1bXBlZCBiZWNhdXNlIHRoZXkgZG8gbm90IGV4aXN0IVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTUxOQotbXNnaWQgImNvbmZsaWN0IGxpc3Qgd2l0aCB3aXRob3V0IHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1NTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICcuY29uZmxpY3QnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU1NDgKLW1zZ2lkICIgIE51bTogICAgSW5kZXggICAgICAgVmFsdWUgIE5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHN0YXQgaW5wdXQgZmlsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTYzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTYzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTY1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZW5hbWUuYzoxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBzZXQgdGltZTogJXMiCi1tc2dzdHIgIiIKLQotIy4gV2UgaGF2ZSB0byBjbGVhbiB1cCBoZXJlLgotIzogcmVuYW1lLmM6MTYwIHJlbmFtZS5jOjE5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVuYW1lOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZW5hbWUuYzoyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNpbXBsZV9jb3B5OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vdCBlbm91Z2ggYmluYXJ5IGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTQ5Ci1tc2dpZCAibnVsbCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjE3OSByZXNiaW4uYzoxODUKLW1zZ2lkICJyZXNvdXJjZSBJRCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyMjkKLW1zZ2lkICJjdXJzb3IiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MjYzIHJlc2Jpbi5jOjI3MAotbXNnaWQgIm1lbnUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjI4MAotbXNnaWQgIm1lbnVleCBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6Mjg0Ci1tc2dpZCAibWVudWV4IG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgbWVudSB2ZXJzaW9uICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjMxOSByZXNiaW4uYzozMzQgcmVzYmluLmM6NDAwCi1tc2dpZCAibWVudWl0ZW0gaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQzMAotbXNnaWQgIm1lbnVpdGVtIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQ3MSByZXNiaW4uYzo0OTkKLW1zZ2lkICJkaWFsb2cgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGRpYWxvZyBzaWduYXR1cmUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NTMxCi1tc2dpZCAiZGlhbG9nIGZvbnQgcG9pbnQgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1MzkKLW1zZ2lkICJkaWFsb2dleCBmb250IGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjU2NCByZXNiaW4uYzo1ODIKLW1zZ2lkICJkaWFsb2cgY29udHJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1NzQKLW1zZ2lkICJkaWFsb2dleCBjb250cm9sIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjYwMwotbXNnaWQgImRpYWxvZyBjb250cm9sIGVuZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo2MTUKLW1zZ2lkICJkaWFsb2cgY29udHJvbCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjY1OAotbXNnaWQgInN0cmluZ3RhYmxlIHN0cmluZyBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NjY4Ci1tc2dpZCAic3RyaW5ndGFibGUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjcwMQotbXNnaWQgImZvbnRkaXIgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjcxNAotbXNnaWQgImZvbnRkaXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NzMwCi1tc2dpZCAiZm9udGRpciBkZXZpY2UgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3MzYKLW1zZ2lkICJmb250ZGlyIGZhY2UgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3NzkKLW1zZ2lkICJhY2NlbGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo4NDMKLW1zZ2lkICJncm91cCBjdXJzb3IgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGdyb3VwIGN1cnNvciB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg2MgotbXNnaWQgImdyb3VwIGN1cnNvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MDEKLW1zZ2lkICJncm91cCBpY29uIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBncm91cCBpY29uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6OTIwCi1tc2dpZCAiZ3JvdXAgaWNvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5OTEgcmVzYmluLmM6MTIxMAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTAyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ2ZXJzaW9uIGxlbmd0aCAlZCBkb2VzIG5vdCBtYXRjaCByZXNvdXJjZSBsZW5ndGggJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24gbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwNDQKLW1zZ2lkICJmaXhlZCB2ZXJzaW9uIGluZm8iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gc2lnbmF0dXJlICVsdSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvIHZlcnNpb24gJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwODEKLW1zZ2lkICJ2ZXJzaW9uIHZhciBpbmZvIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzdHJpbmdmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTEwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5ndGFibGUgdmFsdWUgbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjExNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgIT0gJWQgKyAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmcgbGVuZ3RoICVkIDwgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTE3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZhcmZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTg5Ci1tc2dpZCAidmVyc2lvbiB2YXJmaWxlaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjEyOAotbXNnaWQgImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIGlucHV0IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBubyByZXNvdXJjZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjE1NAotbXNnaWQgImNhbid0IHJlYWQgcmVzb3VyY2Ugc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogYWRkcmVzcyBvdXQgb2YgYm91bmRzIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxOTkKLW1zZ2lkICJkaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjIyNwotbXNnaWQgIm5hbWVkIGRpcmVjdG9yeSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjM2Ci1tc2dpZCAiZGlyZWN0b3J5IGVudHJ5IG5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI1NgotbXNnaWQgIm5hbWVkIHN1YmRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjY0Ci1tc2dpZCAibmFtZWQgcmVzb3VyY2UiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI3OQotbXNnaWQgIklEIGRpcmVjdG9yeSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6Mjk2Ci1tc2dpZCAiSUQgc3ViZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMDQKLW1zZ2lkICJJRCByZXNvdXJjZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MzMwCi1tc2dpZCAicmVzb3VyY2UgdHlwZSB1bmtub3duIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMzMKLW1zZ2lkICJkYXRhIGVudHJ5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozNDEKLW1zZ2lkICJyZXNvdXJjZSBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozNDYKLW1zZ2lkICJyZXNvdXJjZSBkYXRhIHNpemUiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjQ0MQotbXNnaWQgImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6NzM0Ci1tc2dpZCAiY2FuJ3QgZ2V0IEJGRF9SRUxPQ19SVkEgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHBvcGVuIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBwcmVwcm9jZXNzb3IgZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzozMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgRU9GIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWFkIG9mICVsdSByZXR1cm5lZCAlbHUiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzo0MTAgcmVzcmMuYzo2NDEgcmVzcmMuYzo5MTQgcmVzcmMuYzoxMDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6NDYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImN1cnNvciBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBjdXJzb3IgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjQ5NSByZXNyYy5jOjc4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZnNlZWsgdG8gJWx1IGZhaWxlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzo3NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWNvbiBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBpY29uIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzoxMjczCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLUFCZG94Vl0gWy0tZm9ybWF0PWJlcmtlbGV5fHN5c3ZdIFstLXJhZGl4PTh8MTB8MTZdXG4iCi0iICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBbZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6ODMKLW1zZ2lkICJkZWZhdWx0IGlzIC0tZm9ybWF0PWJlcmtlbGV5XG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjg1Ci1tc2dpZCAiZGVmYXVsdCBpcyAtLWZvcm1hdD1zeXN2XG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyZ3VtZW50IHRvIC0tZm9ybWF0OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzoxNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByYWRpeDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmNvbnYuYzoxODc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbLWRoVnFdIGluLWZpbGUgW291dC1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyY29udi5jOjE4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENvbnZlcnQgYSBDT0ZGIG9iamVjdCBmaWxlIGludG8gYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3Jjb252LmM6MjAyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM0OSBzdGFicy5jOjE3NjIKLW1zZ2lkICJudW1lcmljIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCBzdGFiOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6ICVzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NDkyCi1tc2dpZCAiTl9MQlJBQyBub3Qgd2l0aGluIGZ1bmN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzo1MzEKLW1zZ2lkICJUb28gbWFueSBOX1JCUkFDc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NzgwCi1tc2dpZCAidW5rbm93biBDKysgZW5jb2RlZCBuYW1lIgotbXNnc3RyICIiCi0KLSMuIENvbXBsYWluIGFuZCBrZWVwIGdvaW5nLCBzbyBjb21waWxlcnMgY2FuIGludmVudCBuZXcKLSMuIGNyb3NzLXJlZmVyZW5jZSB0eXBlcy4KLSM6IHN0YWJzLmM6MTMwNgotbXNnaWQgInVucmVjb2duaXplZCBjcm9zcyByZWZlcmVuY2UgdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBEb2VzIHRoaXMgYWN0dWFsbHkgZXZlciBoYXBwZW4/ICBJcyB0aGF0IHdoeSB3ZSBhcmUgd29ycnlpbmcKLSMuIGFib3V0IGRlYWxpbmcgd2l0aCBpdCByYXRoZXIgdGhhbiBqdXN0IGNhbGxpbmcgZXJyb3JfdHlwZT8KLSM6IHN0YWJzLmM6MTg1NAotbXNnaWQgIm1pc3NpbmcgaW5kZXggdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIxODEKLW1zZ2lkICJ1bmtub3duIHZpcnR1YWwgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMTk5Ci1tc2dpZCAidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjM5MQotbXNnaWQgInVubmFtZWQgJHZiIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMzk3Ci1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBhYmJyZXZpYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyNDc3Ci1tc2dpZCAidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyNzMzCi1tc2dpZCAiY29uc3Qvdm9sYXRpbGUgaW5kaWNhdG9yIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyOTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIG1hbmdsaW5nIGZvciBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjMyODYKLW1zZ2lkICJVbmRlZmluZWQgTl9FWENMIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzM3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJUeXBlIGZpbGUgbnVtYmVyICVkIG91dCBvZiByYW5nZVxuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzM3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJUeXBlIGluZGV4IG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIFhDT0ZGIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM3NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG1hbmdsZWQgbmFtZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozODYxCi1tc2dpZCAibm8gYXJndW1lbnQgdHlwZXMgaW4gbWFuZ2xlZCBzdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdHJpbmdzLmM6MTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIG51bWJlciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0cmluZ3MuYzo0OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgaW50ZWdlciBhcmd1bWVudCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0cmluZ3MuYzo1MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWFmb3ZdIFstbiBtaW4tbGVuXSBbLW1pbi1sZW5dIFstdCB7byx4LGR9XSBbLV1cbiIKLSIgICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPW1pbi1sZW5dIFstLXJhZGl4PXtvLHgsZH1dXG4iCi0iICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogc3lzZHVtcC5jOjcxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgWy1oVl0gaW4tZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHN5c2R1bXAuYzo3ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiB2ZXJzaW9uLmM6MzkKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiB2ZXJzaW9uLmM6NDAKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuIgotInRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6MjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IG9wZW4gJXMgYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQxMgotbXNnaWQgIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NDI0Ci1tc2dpZCAiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiAiCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQzNQotbXNnaWQgIjogZHVwbGljYXRlIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biBmb3JtYXQgdHlwZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjU5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3VwcG9ydGVkIGZvcm1hdHM6IgotbXNnc3RyICIiCi0KLSMuIE90aGVyd2lzZSwgd2UgZ2l2ZSB1cC4KLSM6IHdpbmRyZXMuYzo2ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuIG5vdCBkZXRlcm1pbmUgdHlwZSBvZiBmaWxlIGAlcyc7IHVzZSB0aGUgLUkgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo3MDIKLW1zZ2lkICIiCi0iT3B0aW9uczpcbiIKLSIgIC1pIEZJTEUsIC0taW5wdXQgRklMRSAgICAgICBOYW1lIGlucHV0IGZpbGVcbiIKLSIgIC1vIEZJTEUsIC0tb3V0cHV0IEZJTEUgICAgICBOYW1lIG91dHB1dCBmaWxlXG4iCi0iICAtSSBGT1JNQVQsIC0taW5wdXQtZm9ybWF0IEZPUk1BVFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgaW5wdXQgZm9ybWF0XG4iCi0iICAtTyBGT1JNQVQsIC0tb3V0cHV0LWZvcm1hdCBGT1JNQVRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IG91dHB1dCBmb3JtYXRcbiIKLSIgIC1GIFRBUkdFVCwgLS10YXJnZXQgVEFSR0VUICBTcGVjaWZ5IENPRkYgdGFyZ2V0XG4iCi0iICAtLXByZXByb2Nlc3NvciBQUk9HUkFNICAgICAgUHJvZ3JhbSB0byB1c2UgdG8gcHJlcHJvY2VzcyByYyBmaWxlXG4iCi0iICAtLWluY2x1ZGUtZGlyIERJUiAgICAgICAgICAgSW5jbHVkZSBkaXJlY3Rvcnkgd2hlbiBwcmVwcm9jZXNzaW5nIHJjIGZpbGVcbiIKLSIgIC1EU1lNWz1WQUxdLCAtLWRlZmluZSBTWU1bPVZBTF1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgU1lNIHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG4iCi0iICAtdiAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyYm9zZSAtIHRlbGxzIHlvdSB3aGF0IGl0J3MgZG9pbmdcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzE4Ci1tc2dpZCAiICAtLXl5ZGVidWcgICAgICAgICAgICAgICAgICAgVHVybiBvbiBwYXJzZXIgZGVidWdnaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjcyMQotbXNnaWQgIiIKLSIgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuIgotIiAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzI0Ci1tc2dpZCAiIgotIkZPUk1BVCBpcyBvbmUgb2YgcmMsIHJlcywgb3IgY29mZiwgYW5kIGlzIGRlZHVjZWQgZnJvbSB0aGUgZmlsZSBuYW1lXG4iCi0iZXh0ZW5zaW9uIGlmIG5vdCBzcGVjaWZpZWQuICBBIHNpbmdsZSBmaWxlIG5hbWUgaXMgYW4gaW5wdXQgZmlsZS5cbiIKLSJObyBpbnB1dC1maWxlIGlzIHN0ZGluLCBkZWZhdWx0IHJjLiAgTm8gb3V0cHV0LWZpbGUgaXMgc3Rkb3V0LCBkZWZhdWx0IHJjLlxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo5NjMKLW1zZ2lkICJubyByZXNvdXJjZXMiCi1tc2dzdHIgIiIKLQotIzogd3JzdGFicy5jOjM2NiB3cnN0YWJzLmM6MjAyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzdHJpbmdfaGFzaF9sb29rdXAgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHdyc3RhYnMuYzo2NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhYl9pbnRfdHlwZTogYmFkIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiB3cnN0YWJzLmM6MTQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogdW5rbm93biBzaXplIGZvciBmaWVsZCBgJXMnIGluIHN0cnVjdFxuIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9iaW51dGlscy9wcmRiZy5jIGIvYmludXRpbHMvcHJkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4Y2JkMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wcmRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2MiArMCwwIEBACi0vKiBwcmRiZy5jIC0tIFByaW50IG91dCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgcHJpbnRzIG91dCB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGJ5Ci0gICBzdXBwbHlpbmcgYSBzZXQgb2Ygcm91dGluZXMgdG8gZGVidWdfd3JpdGUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdlIHVzZSBhcyBhIGhhbmRsZSBmb3IgdGhlc2Ugcm91dGluZXMuICAqLwotCi1zdHJ1Y3QgcHJfaGFuZGxlCi17Ci0gIC8qIEZpbGUgdG8gcHJpbnQgaW5mb3JtYXRpb24gdG8uICAqLwotICBGSUxFICpmOwotICAvKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZGVudDsKLSAgLyogVHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBwcl9zdGFjayAqc3RhY2s7Ci0gIC8qIFBhcmFtZXRlciBudW1iZXIgd2UgYXJlIGFib3V0IHRvIG91dHB1dC4gICovCi0gIGludCBwYXJhbWV0ZXI7Ci19OwotCi0vKiBUaGUgdHlwZSBzdGFjay4gICovCi0KLXN0cnVjdCBwcl9zdGFjawotewotICAvKiBOZXh0IGVsZW1lbnQgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IHByX3N0YWNrICpuZXh0OwotICAvKiBUaGlzIGVsZW1lbnQuICAqLwotICBjaGFyICp0eXBlOwotICAvKiBDdXJyZW50IHZpc2liaWxpdHkgb2YgZmllbGRzIGlmIHRoaXMgaXMgYSBjbGFzcy4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBOYW1lIG9mIHRoZSBjdXJyZW50IG1ldGhvZCB3ZSBhcmUgaGFuZGxpbmcuICAqLwotICBjb25zdCBjaGFyICptZXRob2Q7Ci19OwotCi1zdGF0aWMgdm9pZCBpbmRlbnQgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwdXNoX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByZXBlbmRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gYXBwZW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN1YnN0aXR1dGVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaW5kZW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgY2hhciAqcG9wX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF92bWEgUEFSQU1TICgoYmZkX3ZtYSwgY2hhciAqLCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9maXhfdmlzaWJpbGl0eQotICBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gcHJfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHByX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfcG9pbnRlcl90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9yYW5nZV90eXBlIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX29mZnNldF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfbWV0aG9kX3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gcHJfZW5kX3N0cnVjdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfY2xhc3NfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX2Jhc2VjbGFzcwotICBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3Nfc3RhcnRfbWV0aG9kIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19lbmRfbWV0aG9kIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBlZGVmX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX3RhZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX3RhZyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfaW50X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBlZF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9mdW5jdGlvbl9wYXJhbWV0ZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX2xpbmVubyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyBwcl9mbnMgPQotewotICBwcl9zdGFydF9jb21waWxhdGlvbl91bml0LAotICBwcl9zdGFydF9zb3VyY2UsCi0gIHByX2VtcHR5X3R5cGUsCi0gIHByX3ZvaWRfdHlwZSwKLSAgcHJfaW50X3R5cGUsCi0gIHByX2Zsb2F0X3R5cGUsCi0gIHByX2NvbXBsZXhfdHlwZSwKLSAgcHJfYm9vbF90eXBlLAotICBwcl9lbnVtX3R5cGUsCi0gIHByX3BvaW50ZXJfdHlwZSwKLSAgcHJfZnVuY3Rpb25fdHlwZSwKLSAgcHJfcmVmZXJlbmNlX3R5cGUsCi0gIHByX3JhbmdlX3R5cGUsCi0gIHByX2FycmF5X3R5cGUsCi0gIHByX3NldF90eXBlLAotICBwcl9vZmZzZXRfdHlwZSwKLSAgcHJfbWV0aG9kX3R5cGUsCi0gIHByX2NvbnN0X3R5cGUsCi0gIHByX3ZvbGF0aWxlX3R5cGUsCi0gIHByX3N0YXJ0X3N0cnVjdF90eXBlLAotICBwcl9zdHJ1Y3RfZmllbGQsCi0gIHByX2VuZF9zdHJ1Y3RfdHlwZSwKLSAgcHJfc3RhcnRfY2xhc3NfdHlwZSwKLSAgcHJfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgcHJfY2xhc3NfYmFzZWNsYXNzLAotICBwcl9jbGFzc19zdGFydF9tZXRob2QsCi0gIHByX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQsCi0gIHByX2NsYXNzX2VuZF9tZXRob2QsCi0gIHByX2VuZF9jbGFzc190eXBlLAotICBwcl90eXBlZGVmX3R5cGUsCi0gIHByX3RhZ190eXBlLAotICBwcl90eXBkZWYsCi0gIHByX3RhZywKLSAgcHJfaW50X2NvbnN0YW50LAotICBwcl9mbG9hdF9jb25zdGFudCwKLSAgcHJfdHlwZWRfY29uc3RhbnQsCi0gIHByX3ZhcmlhYmxlLAotICBwcl9zdGFydF9mdW5jdGlvbiwKLSAgcHJfZnVuY3Rpb25fcGFyYW1ldGVyLAotICBwcl9zdGFydF9ibG9jaywKLSAgcHJfZW5kX2Jsb2NrLAotICBwcl9lbmRfZnVuY3Rpb24sCi0gIHByX2xpbmVubwotfTsKLQwKLS8qIFByaW50IG91dCB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcmVjb3JkZWQgaW4gZGhhbmRsZS4gICovCi0KLWJvb2xlYW4KLXByaW50X2RlYnVnZ2luZ19pbmZvIChmLCBkaGFuZGxlKQotICAgICBGSUxFICpmOwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSBpbmZvOwotCi0gIGluZm8uZiA9IGY7Ci0gIGluZm8uaW5kZW50ID0gMDsKLSAgaW5mby5zdGFjayA9IE5VTEw7Ci0gIGluZm8ucGFyYW1ldGVyID0gMDsKLQotICByZXR1cm4gZGVidWdfd3JpdGUgKGRoYW5kbGUsICZwcl9mbnMsIChQVFIpICZpbmZvKTsKLX0KLQwKLS8qIEluZGVudCB0byB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1pbmRlbnQgKGluZm8pCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5pbmRlbnQ7IGkrKykKLSAgICBwdXRjICgnICcsIGluZm8tPmYpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wdXNoX3R5cGUgKGluZm8sIHR5cGUpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci17Ci0gIHN0cnVjdCBwcl9zdGFjayAqbjsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gKHN0cnVjdCBwcl9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+dHlwZSA9IHhzdHJkdXAgKHR5cGUpOwotICBuLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9JR05PUkU7Ci0gIG4tPm1ldGhvZCA9IE5VTEw7Ci0gIG4tPm5leHQgPSBpbmZvLT5zdGFjazsKLSAgaW5mby0+c3RhY2sgPSBuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmVwZW5kIGEgc3RyaW5nIG9udG8gdGhlIHR5cGUgb24gdGhlIHRvcCBvZiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcmVwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGNoYXIgKm47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIHN0cmxlbiAoaW5mby0+c3RhY2stPnR5cGUpICsgMSk7Ci0gIHNwcmludGYgKG4sICIlcyVzIiwgcywgaW5mby0+c3RhY2stPnR5cGUpOwotICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSB0eXBlIG9uIHRoZSB0b3Agb2YgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXBwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgaWYgKHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBsZW4gPSBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgaW5mby0+c3RhY2stPnR5cGUgPSAoY2hhciAqKSB4cmVhbGxvYyAoaW5mby0+c3RhY2stPnR5cGUsCi0JCQkJCSBsZW4gKyBzdHJsZW4gKHMpICsgMSk7Ci0gIHN0cmNweSAoaW5mby0+c3RhY2stPnR5cGUgKyBsZW4sIHMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB1c2UgYW4gdW5kZXJzY29yZSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgbmFtZSBzaG91bGQgZ28gaW4gYSB0eXBlCi0gICBzdHJpbmcuICBUaGlzIGZ1bmN0aW9uIHN1YnN0aXR1dGVzIGEgc3RyaW5nIGZvciB0aGUgdW5kZXJzY29yZS4gIElmCi0gICB0aGVyZSBpcyBubyB1bmRlcnNjb3JlLCB0aGUgbmFtZSBmb2xsb3dzIHRoZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1YnN0aXR1dGVfdHlwZSAoaW5mbywgcykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgY2hhciAqdTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIHUgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAnfCcpOwotICBpZiAodSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKm47Ci0KLSAgICAgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIHN0cmxlbiAocykpOwotCi0gICAgICBtZW1jcHkgKG4sIGluZm8tPnN0YWNrLT50eXBlLCB1IC0gaW5mby0+c3RhY2stPnR5cGUpOwotICAgICAgc3RyY3B5IChuICsgKHUgLSBpbmZvLT5zdGFjay0+dHlwZSksIHMpOwotICAgICAgc3RyY2F0IChuLCB1ICsgMSk7Ci0KLSAgICAgIGZyZWUgKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgICAgIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChzdHJjaHIgKHMsICd8JykgIT0gTlVMTAotICAgICAgJiYgKHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICd7JykgIT0gTlVMTAotCSAgfHwgc3RyY2hyIChpbmZvLT5zdGFjay0+dHlwZSwgJygnKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICIoIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIpIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKnMgPT0gJ1wwJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCAiICIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgcykpOwotfQotCi0vKiBJbmRlbnQgdGhlIHR5cGUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYnkgYXBwZW5kaW5nIHNwYWNlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pbmRlbnRfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGluZm8tPmluZGVudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBvcCBhIHR5cGUgZnJvbSB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBjaGFyICoKLXBvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgcHJfc3RhY2sgKm87Ci0gIGNoYXIgKnJldDsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIG8gPSBpbmZvLT5zdGFjazsKLSAgaW5mby0+c3RhY2sgPSBvLT5uZXh0OwotICByZXQgPSBvLT50eXBlOwotICBmcmVlIChvKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBQcmludCBhIFZNQSB2YWx1ZSBpbnRvIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3ZtYSAodm1hLCBidWYsIHVuc2lnbmVkcCwgaGV4cCkKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gICAgIGJvb2xlYW4gaGV4cDsKLXsKLSAgaWYgKHNpemVvZiAodm1hKSA8PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotICAgIHsKLSAgICAgIGlmIChoZXhwKQotCXNwcmludGYgKGJ1ZiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci0gICAgICBlbHNlIGlmICh1bnNpZ25lZHApCi0Jc3ByaW50ZiAoYnVmLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmLCAiJWxkIiwgKGxvbmcpIHZtYSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmWzBdID0gJzAnOwotICAgICAgYnVmWzFdID0gJ3gnOwotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiArIDIsIHZtYSk7Ci0gICAgfQotfQotDAotLyogU3RhcnQgYSBuZXcgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmluZGVudCA9PSAwKTsKLQotICBmcHJpbnRmIChpbmZvLT5mLCAiJXM6XG4iLCBmaWxlbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgc291cmNlIGZpbGUgd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9zb3VyY2UgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+aW5kZW50ID09IDApOwotCi0gIGZwcmludGYgKGluZm8tPmYsICIgJXM6XG4iLCBmaWxlbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYW4gZW1wdHkgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VtcHR5X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAiPHVuZGVmaW5lZD4iKTsKLX0KLQotLyogUHVzaCBhIHZvaWQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJ2b2lkIik7Ci19Ci0KLS8qIFB1c2ggYW4gaW50ZWdlciB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfaW50X3R5cGUgKHAsIHNpemUsIHVuc2lnbmVkcCkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMTBdOwotCi0gIHNwcmludGYgKGFiLCAiJXNpbnQlZCIsIHVuc2lnbmVkcCA/ICJ1IiA6ICIiLCBzaXplICogOCk7Ci0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKLX0KLQotLyogUHVzaCBhIGZsb2F0aW5nIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mbG9hdF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzEwXTsKLQotICBpZiAoc2l6ZSA9PSA0KQotICAgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJmbG9hdCIpOwotICBlbHNlIGlmIChzaXplID09IDgpCi0gICAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgImRvdWJsZSIpOwotCi0gIHNwcmludGYgKGFiLCAiZmxvYXQlZCIsIHNpemUgKiA4KTsKLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgYWIpOwotfQotCi0vKiBQdXNoIGEgY29tcGxleCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY29tcGxleF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGlmICghIHByX2Zsb2F0X3R5cGUgKHAsIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gcHJlcGVuZF90eXBlIChpbmZvLCAiY29tcGxleCAiKTsKLX0KLQotLyogUHVzaCBhIGJvb2xlYW4gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Jvb2xfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsxMF07Ci0KLSAgc3ByaW50ZiAoYWIsICJib29sJWQiLCBzaXplICogOCk7Ci0KLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgYWIpOwotfQotCi0vKiBQdXNoIGFuIGVudW0gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFsdWVzKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX3NpZ25lZF92bWEgdmFsOwotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgImVudW0gIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJ7ICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIi8qIHVuZGVmaW5lZCAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAwOwotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiLCAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBuYW1lc1tpXSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKHZhbHVlc1tpXSAhPSB2YWwpCi0JICAgIHsKLQkgICAgICBjaGFyIGFiWzIwXTsKLQotCSAgICAgIHByaW50X3ZtYSAodmFsdWVzW2ldLCBhYiwgZmFsc2UsIGZhbHNlKTsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiA9ICIpCi0JCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgdmFsID0gdmFsdWVzW2ldOwotCSAgICB9Ci0KLQkgICsrdmFsOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGFwcGVuZF90eXBlIChpbmZvLCAiIH0iKTsKLX0KLQotLyogVHVybiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGludG8gYSBwb2ludGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3BvaW50ZXJfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgcyA9IHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICd8Jyk7Ci0gIGlmIChzICE9IE5VTEwgJiYgc1sxXSA9PSAnWycpCi0gICAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIigqfCkiKTsKLSAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIip8Iik7Ci19Ci0KLS8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoYXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqKmFyZ190eXBlczsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqczsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIGxlbiA9IDEwOwotCi0gIGlmIChhcmdjb3VudCA8PSAwKQotICAgIHsKLSAgICAgIGFyZ190eXBlcyA9IE5VTEw7Ci0gICAgICBsZW4gKz0gMTU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGFyZ190eXBlcyA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjb3VudCAqIHNpemVvZiAqYXJnX3R5cGVzKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGFyZ190eXBlc1tpXSA9IHBvcF90eXBlIChpbmZvKTsKLQkgIGlmIChhcmdfdHlwZXNbaV0gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbGVuICs9IHN0cmxlbiAoYXJnX3R5cGVzW2ldKSArIDI7Ci0JfQotICAgICAgaWYgKHZhcmFyZ3MpCi0JbGVuICs9IDU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgcmV0dXJuIHR5cGUgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCi0gIHMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBzdHJjcHkgKHMsICIofCkgKCIpOwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgc3RyY2F0IChzLCAiLyogdW5rbm93biAqLyIpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgc3RyY2F0IChzLCAiLCAiKTsKLQkgIHN0cmNhdCAocywgYXJnX3R5cGVzW2ldKTsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsICIuLi4iKTsKLQl9Ci0gICAgICBpZiAoYXJnY291bnQgPiAwKQotCWZyZWUgKGFyZ190eXBlcyk7Ci0gICAgfQotCi0gIHN0cmNhdCAocywgIikiKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVHVybiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGludG8gYSByZWZlcmVuY2UgdG8gdGhhdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3JlZmVyZW5jZV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiJnwiKTsKLX0KLQotLyogTWFrZSBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfcmFuZ2VfdHlwZSAocCwgbG93ZXIsIHVwcGVyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYmxbMjBdLCBhYnVbMjBdOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHByaW50X3ZtYSAobG93ZXIsIGFibCwgZmFsc2UsIGZhbHNlKTsKLSAgcHJpbnRfdm1hICh1cHBlciwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotCi0gIHJldHVybiAocHJlcGVuZF90eXBlIChpbmZvLCAicmFuZ2UgKCIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIik6IikKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBhYmwpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIjoiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIGFidSkpOwotfQotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl9hcnJheV90eXBlIChwLCBsb3dlciwgdXBwZXIsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnJhbmdlX3R5cGU7Ci0gIGNoYXIgYWJsWzIwXSwgYWJ1WzIwXSwgYWJbNTBdOwotCi0gIHJhbmdlX3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChyYW5nZV90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChsb3dlciA9PSAwKQotICAgIHsKLSAgICAgIGlmICh1cHBlciA9PSAtMSkKLQlzcHJpbnRmIChhYiwgInxbXSIpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50X3ZtYSAodXBwZXIgKyAxLCBhYnUsIGZhbHNlLCBmYWxzZSk7Ci0JICBzcHJpbnRmIChhYiwgInxbJXNdIiwgYWJ1KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfdm1hIChsb3dlciwgYWJsLCBmYWxzZSwgZmFsc2UpOwotICAgICAgcHJpbnRfdm1hICh1cHBlciwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotICAgICAgc3ByaW50ZiAoYWIsICJ8WyVzOiVzXSIsIGFibCwgYWJ1KTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBhYikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChzdHJjbXAgKHJhbmdlX3R5cGUsICJpbnQiKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiOiIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCByYW5nZV90eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIHN0cmluZyAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXByX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic2V0IHsgIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgfSIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0c3RyaW5ncCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIi8qIGJpdHN0cmluZyAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfb2Zmc2V0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKQotCSAgJiYgcHJlcGVuZF90eXBlIChpbmZvLCAiICIpCi0JICAmJiBwcmVwZW5kX3R5cGUgKGluZm8sIHQpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIjo6fCIpKTsKLX0KLQotLyogTWFrZSBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX21ldGhvZF90eXBlIChwLCBkb21haW4sIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBkb21haW47Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqZG9tYWluX3R5cGU7Ci0gIGNoYXIgKiphcmdfdHlwZXM7Ci0gIGNoYXIgKnM7Ci0KLSAgbGVuID0gMTA7Ci0KLSAgaWYgKCEgZG9tYWluKQotICAgIGRvbWFpbl90eXBlID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGRvbWFpbl90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICAgICAgaWYgKGRvbWFpbl90eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHN0cm5jbXAgKGRvbWFpbl90eXBlLCAiY2xhc3MgIiwgc2l6ZW9mICJjbGFzcyAiIC0gMSkgPT0gMAotCSAgJiYgc3RyY2hyIChkb21haW5fdHlwZSArIHNpemVvZiAiY2xhc3MgIiAtIDEsICcgJykgPT0gTlVMTCkKLQlkb21haW5fdHlwZSArPSBzaXplb2YgImNsYXNzICIgLSAxOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoZG9tYWluX3R5cGUsICJ1bmlvbiBjbGFzcyAiLAotCQkJc2l6ZW9mICJ1bmlvbiBjbGFzcyAiKSA9PSAwCi0JICAgICAgICYmIChzdHJjaHIgKGRvbWFpbl90eXBlICsgc2l6ZW9mICJ1bmlvbiBjbGFzcyAiIC0gMSwgJyAnKQotCQkgICA9PSBOVUxMKSkKLQlkb21haW5fdHlwZSArPSBzaXplb2YgInVuaW9uIGNsYXNzICIgLSAxOwotICAgICAgbGVuICs9IHN0cmxlbiAoZG9tYWluX3R5cGUpOwotICAgIH0KLQotICBpZiAoYXJnY291bnQgPD0gMCkKLSAgICB7Ci0gICAgICBhcmdfdHlwZXMgPSBOVUxMOwotICAgICAgbGVuICs9IDE1OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBhcmdfdHlwZXMgPSAoY2hhciAqKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ190eXBlcyk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBhcmdfdHlwZXNbaV0gPSBwb3BfdHlwZSAoaW5mbyk7Ci0JICBpZiAoYXJnX3R5cGVzW2ldID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGxlbiArPSBzdHJsZW4gKGFyZ190eXBlc1tpXSkgKyAyOwotCX0KLSAgICAgIGlmICh2YXJhcmdzKQotCWxlbiArPSA1OwotICAgIH0KLQotICAvKiBOb3cgdGhlIHJldHVybiB0eXBlIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBzID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgaWYgKCEgZG9tYWluKQotICAgICpzID0gJ1wwJzsKLSAgZWxzZQotICAgIHN0cmNweSAocywgZG9tYWluX3R5cGUpOwotICBzdHJjYXQgKHMsICI6OnwgKCIpOwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgc3RyY2F0IChzLCAiLyogdW5rbm93biAqLyIpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgc3RyY2F0IChzLCAiLCAiKTsKLQkgIHN0cmNhdCAocywgYXJnX3R5cGVzW2ldKTsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsICIuLi4iKTsKLQl9Ci0gICAgICBpZiAoYXJnY291bnQgPiAwKQotCWZyZWUgKGFyZ190eXBlcyk7Ci0gICAgfQotCi0gIHN0cmNhdCAocywgIikiKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiY29uc3QgfCIpOwotfQotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdm9sYXRpbGVfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICJ2b2xhdGlsZSB8Iik7Ci19Ci0KLS8qIFN0YXJ0IGFjY3VtdWxhdGluZyBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZm8tPmluZGVudCArPSAyOwotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgc3RydWN0cCA/ICJzdHJ1Y3QgIiA6ICJ1bmlvbiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdGFnKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBpZGJ1ZlsyMF07Ci0KLSAgICAgIHNwcmludGYgKGlkYnVmLCAiJSVhbm9uJXUiLCBpZCk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgaWRidWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgeyIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHNpemUgIT0gMCB8fCB0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyIGFiWzMwXTsKLQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyoiKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzaXplICE9IDApCi0JewotCSAgc3ByaW50ZiAoYWIsICIgc2l6ZSAldSIsIHNpemUpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICh0YWcgIT0gTlVMTCkKLQl7Ci0JICBzcHJpbnRmIChhYiwgIiBpZCAldSIsIGlkKTsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiXG4iKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQotICByZXR1cm4gaW5kZW50X3R5cGUgKGluZm8pOwotfQotCi0vKiBPdXRwdXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZCBpbiBhIHN0cnVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNoYXIgKnQ7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBpZiAoaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPT0gdmlzaWJpbGl0eSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ICE9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFKTsKLQotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICBzID0gInB1YmxpYyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHMgPSAicHJpdmF0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgcyA9ICJwcm90ZWN0ZWQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX0lHTk9SRToKLSAgICAgIHMgPSAiLyogaWdub3JlICovIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVHJpbSBvZmYgYSB0cmFpbGluZyBzcGFjZSBpbiB0aGUgc3RydWN0IHN0cmluZywgdG8gbWFrZSB0aGUKLSAgICAgb3V0cHV0IGxvb2sgYSBiaXQgYmV0dGVyLCB0aGVuIHN0aWNrIG9uIHRoZSB2aXNpYmlsaXR5IHN0cmluZy4gICovCi0KLSAgdCA9IGluZm8tPnN0YWNrLT50eXBlOwotICBsZW4gPSBzdHJsZW4gKHQpOwotICBhc3NlcnQgKHRbbGVuIC0gMV0gPT0gJyAnKTsKLSAgdFtsZW4gLSAxXSA9ICdcMCc7Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiOlxuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGZpZWxkIHRvIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RydWN0X2ZpZWxkIChwLCBuYW1lLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotICBjaGFyICp0OwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiOyAvKiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJpdHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF92bWEgKGJpdHNpemUsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgImJpdHNpemUgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiwgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwcmludF92bWEgKGJpdHBvcywgYWIsIHRydWUsIGZhbHNlKTsKLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJiaXRwb3MgIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqL1xuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgdCk7Ci19Ci0KLS8qIEZpbmlzaCBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9zdHJ1Y3RfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+aW5kZW50ID49IDIpOwotCi0gIGluZm8tPmluZGVudCAtPSAyOwotCi0gIC8qIENoYW5nZSB0aGUgdHJhaWxpbmcgaW5kZW50YXRpb24gdG8gaGF2ZSBhIGNsb3NlIGJyYWNlLiAgKi8KLSAgcyA9IGluZm8tPnN0YWNrLT50eXBlICsgc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgLSAyOwotICBhc3NlcnQgKHNbMF0gPT0gJyAnICYmIHNbMV0gPT0gJyAnICYmIHNbMl0gPT0gJ1wwJyk7Ci0KLSAgKnMrKyA9ICd9JzsKLSAgKnMgPSAnXDAnOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGNsYXNzIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfY2xhc3NfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSwgdnB0ciwgb3dudnB0cikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHZwdHI7Ci0gICAgIGJvb2xlYW4gb3dudnB0cjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnR2ID0gTlVMTDsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICBpZiAodnB0ciAmJiAhIG93bnZwdHIpCi0gICAgewotICAgICAgdHYgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBpZiAodHYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgc3RydWN0cCA/ICJjbGFzcyAiIDogInVuaW9uIGNsYXNzICIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGlkYnVmWzIwXTsKLQotICAgICAgc3ByaW50ZiAoaWRidWYsICIlJWFub24ldSIsIGlkKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBpZGJ1ZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB7IikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoc2l6ZSAhPSAwIHx8IHZwdHIgfHwgb3dudnB0ciB8fCB0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHNpemUgIT0gMCkKLQl7Ci0JICBjaGFyIGFiWzIwXTsKLQotCSAgc3ByaW50ZiAoYWIsICIldSIsIHNpemUpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgc2l6ZSAiKQotCSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHZwdHIpCi0JewotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgdnRhYmxlICIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAob3dudnB0cikKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAic2VsZiAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdHYpCi0JCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodGFnICE9IE5VTEwpCi0JewotCSAgY2hhciBhYlszMF07Ci0KLQkgIHNwcmludGYgKGFiLCAiIGlkICV1IiwgaWQpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCi0gIHJldHVybiAoYXBwZW5kX3R5cGUgKGluZm8sICJcbiIpCi0JICAmJiBpbmRlbnRfdHlwZSAoaW5mbykpOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgbWVtYmVyIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhdGljX21lbWJlciAocCwgbmFtZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInN0YXRpYyAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIjsgLyogIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqL1xuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgdCk7Ci19Ci0KLS8qIEFkZCBhIGJhc2UgY2xhc3MgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19iYXNlY2xhc3MgKHAsIGJpdHBvcywgdmlydHVhbCwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBib29sZWFuIHZpcnR1YWw7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLSAgY29uc3QgY2hhciAqcHJlZml4OwotICBjaGFyIGFiWzIwXTsKLSAgY2hhciAqcywgKmwsICpuOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCAmJiBpbmZvLT5zdGFjay0+bmV4dCAhPSBOVUxMKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN0cm5jbXAgKHQsICJjbGFzcyAiLCBzaXplb2YgImNsYXNzICIgLSAxKSA9PSAwKQotICAgIHQgKz0gc2l6ZW9mICJjbGFzcyAiIC0gMTsKLQotICAvKiBQdXNoIGl0IGJhY2sgb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHByZXBlbmRfdHlwZSBhbmQKLSAgICAgYXBwZW5kX3R5cGUgcm91dGluZXMuICAqLwotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmlydHVhbCkKLSAgICB7Ci0gICAgICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICJ2aXJ0dWFsICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgcHJlZml4ID0gInB1YmxpYyAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHByZWZpeCA9ICJwcm90ZWN0ZWQgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgcHJlZml4ID0gInByaXZhdGUgIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmVmaXggPSAiLyogdW5rbm93biB2aXNpYmlsaXR5ICovICI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCBwcmVmaXgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0cG9zICE9IDApCi0gICAgewotICAgICAgcHJpbnRfdm1hIChiaXRwb3MsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiBiaXRwb3MgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIHNvbWV0aGluZyBsaWtlICJwdWJsaWMgQSAvICogYml0cG9zCi0gICAgIDEwICogLyIuICBUaGUgbmV4dCBlbGVtZW50IG9uIHRoZSBzdGFjayBpcyBzb21ldGhpbmcgbGlrZSAiY2xhc3MKLSAgICAgeHggeyAvICogc2l6ZSA4ICogL1xuLi4uIi4gIFdlIHdhbnQgdG8gc3Vic3RpdHV0ZSB0aGUgdG9wIG9mIHRoZQotICAgICBzdGFjayBpbiBiZWZvcmUgdGhlIHsuICAqLwotICBzID0gc3RyY2hyIChpbmZvLT5zdGFjay0+bmV4dC0+dHlwZSwgJ3snKTsKLSAgYXNzZXJ0IChzICE9IE5VTEwpOwotICAtLXM7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhICc6JywgdGhlbiB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlY2xhc3MsIGFuZAotICAgICB3ZSBtdXN0IGFwcGVuZCB0aGlzIG9uZSBhZnRlciBhIGNvbW1hLiAgKi8KLSAgZm9yIChsID0gaW5mby0+c3RhY2stPm5leHQtPnR5cGU7IGwgIT0gczsgbCsrKQotICAgIGlmICgqbCA9PSAnOicpCi0gICAgICBicmVhazsKLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCBsID09IHMgPyAiIDogIiA6ICIsICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgKyBzdHJsZW4gKHQpICsgMSk7Ci0gIG1lbWNweSAobiwgaW5mby0+c3RhY2stPnR5cGUsIHMgLSBpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIHN0cmNweSAobiArIChzIC0gaW5mby0+c3RhY2stPnR5cGUpLCB0KTsKLSAgc3RyY2F0IChuLCBzKTsKLQotICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYWRkaW5nIGEgbWV0aG9kIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhcnRfbWV0aG9kIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgaW5mby0+c3RhY2stPm1ldGhvZCA9IG5hbWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSB2YXJpYW50IHRvIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXAsIHZvZmZzZXQsCi0JCQkgY29udGV4dCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKm1ldGhvZF90eXBlOwotICBjaGFyICpjb250ZXh0X3R5cGU7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5zdGFjay0+bmV4dCAhPSBOVUxMKTsKLQotICAvKiBQdXQgdGhlIGNvbnN0IGFuZCB2b2xhdGlsZSBxdWFsaWZpZXJzIG9uIHRoZSB0eXBlLiAgKi8KLSAgaWYgKHZvbGF0aWxlcCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB2b2xhdGlsZSIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb25zdHApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgY29uc3QiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0aWNrIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW50byBpdHMgdHlwZS4gICovCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywKLQkJCSAoY29udGV4dAotCQkJICA/IGluZm8tPnN0YWNrLT5uZXh0LT5uZXh0LT5tZXRob2QKLQkJCSAgOiBpbmZvLT5zdGFjay0+bmV4dC0+bWV0aG9kKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCB0aGUgdHlwZS4gICovCi0gIG1ldGhvZF90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAobWV0aG9kX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUHVsbCBvZmYgdGhlIGNvbnRleHQgdHlwZSBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoISBjb250ZXh0KQotICAgIGNvbnRleHRfdHlwZSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb250ZXh0X3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBpZiAoY29udGV4dF90eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzLiAgKi8KLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBtZXRob2RfdHlwZSkKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyogIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChjb250ZXh0IHx8IHZvZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGFiWzIwXTsKLQotICAgICAgaWYgKGNvbnRleHQpCi0JewotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJjb250ZXh0ICIpCi0JICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgY29udGV4dF90eXBlKQotCSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwcmludF92bWEgKHZvZmZzZXQsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgInZvZmZzZXQgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiAoYXBwZW5kX3R5cGUgKGluZm8sICIgKi87XG4iKQotCSAgJiYgaW5kZW50X3R5cGUgKGluZm8pKTsKLX0KLQotLyogQWRkIGEgc3RhdGljIHZhcmlhbnQgdG8gYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKm1ldGhvZF90eXBlOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+c3RhY2stPm5leHQgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+c3RhY2stPm5leHQtPm1ldGhvZCAhPSBOVUxMKTsKLQotICAvKiBQdXQgdGhlIGNvbnN0IGFuZCB2b2xhdGlsZSBxdWFsaWZpZXJzIG9uIHRoZSB0eXBlLiAgKi8KLSAgaWYgKHZvbGF0aWxlcCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB2b2xhdGlsZSIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb25zdHApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgY29uc3QiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1hcmsgaXQgYXMgc3RhdGljLiAgKi8KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic3RhdGljICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTdGljayB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGludG8gaXRzIHR5cGUuICAqLwotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIGluZm8tPnN0YWNrLT5uZXh0LT5tZXRob2QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgdGhlIHR5cGUuICAqLwotICBtZXRob2RfdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKG1ldGhvZF90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyB0aGUgY2xhc3MuICAqLwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgbWV0aG9kX3R5cGUpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiAiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICIgKi87XG4iKQotCSAgJiYgaW5kZW50X3R5cGUgKGluZm8pKTsKLX0KLQotLyogRmluaXNoIHVwIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX2VuZF9tZXRob2QgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpbmZvLT5zdGFjay0+bWV0aG9kID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9jbGFzc190eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgcmV0dXJuIHByX2VuZF9zdHJ1Y3RfdHlwZSAocCk7Ci19Ci0KLS8qIFB1c2ggYSB0eXBlIG9uIHRoZSBzdGFjayB1c2luZyBhIHR5cGVkZWYgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBlZGVmX3R5cGUgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCBuYW1lKTsKLX0KLQotLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHVzaW5nIGEgdGFnIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdGFnX3R5cGUgKHAsIG5hbWUsIGlkLCBraW5kKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY29uc3QgY2hhciAqdCwgKnRhZzsKLSAgY2hhciBpZGJ1ZlsyMF07Ci0KLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgICAgdCA9ICJzdHJ1Y3QgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICAgIHQgPSAidW5pb24gIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgdCA9ICJlbnVtICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgICB0ID0gImNsYXNzICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgICB0ID0gInVuaW9uIGNsYXNzICI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHRhZyA9IG5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiUlYW5vbiV1IiwgaWQpOwotICAgICAgdGFnID0gaWRidWY7Ci0gICAgfQotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG5hbWUgIT0gTlVMTCAmJiBraW5kICE9IERFQlVHX0tJTkRfRU5VTSkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiAvKiBpZCAldSAqLyIsIGlkKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBpZGJ1ZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWRlZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBkZWYgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqczsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAocyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAidHlwZWRlZiAlcztcbiIsIHMpOwotCi0gIGZyZWUgKHMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0YWcuICBUaGUgdGFnIHNob3VsZCBhbHJlYWR5IGJlIGluIHRoZSBzdHJpbmcgb24gdGhlCi0gICBzdGFjaywgc28gYWxsIHdlIGhhdmUgdG8gZG8gaGVyZSBpcyBwcmludCBpdCBvdXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl90YWcgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXM7XG4iLCB0KTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGFuIGludGVnZXIgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfaW50X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHByaW50X3ZtYSAodmFsLCBhYiwgZmFsc2UsIGZhbHNlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgImNvbnN0IGludCAlcyA9ICVzO1xuIiwgbmFtZSwgYWIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCBkb3VibGUgJXMgPSAlZztcbiIsIG5hbWUsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBlZF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKHZhbCwgYWIsIGZhbHNlLCBmYWxzZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCAlcyAlcyA9ICVzO1xuIiwgdCwgbmFtZSwgYWIpOwotCi0gIGZyZWUgKHQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl92YXJpYWJsZSAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19TVEFUSUM6Ci0gICAgY2FzZSBERUJVR19MT0NBTF9TVEFUSUM6Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAic3RhdGljICIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19SRUdJU1RFUjoKLSAgICAgIGZwcmludGYgKGluZm8tPmYsICJyZWdpc3RlciAiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHByaW50X3ZtYSAodmFsLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICIlcyAvKiAlcyAqLztcbiIsIHQsIGFiKTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X2Z1bmN0aW9uIChwLCBuYW1lLCBnbG9iYWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGdsb2JhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgaWYgKCEgZ2xvYmFsKQotICAgIGZwcmludGYgKGluZm8tPmYsICJzdGF0aWMgIik7Ci0gIGZwcmludGYgKGluZm8tPmYsICIlcyAoIiwgdCk7Ci0KLSAgaW5mby0+cGFyYW1ldGVyID0gMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Z1bmN0aW9uX3BhcmFtZXRlciAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoa2luZCA9PSBERUJVR19QQVJNX1JFRkVSRU5DRQotICAgICAgfHwga2luZCA9PSBERUJVR19QQVJNX1JFRl9SRUcpCi0gICAgewotICAgICAgaWYgKCEgcHJfcmVmZXJlbmNlX3R5cGUgKHApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnBhcmFtZXRlciAhPSAxKQotICAgIGZwcmludGYgKGluZm8tPmYsICIsICIpOwotCi0gIGlmIChraW5kID09IERFQlVHX1BBUk1fUkVHIHx8IGtpbmQgPT0gREVCVUdfUEFSTV9SRUZfUkVHKQotICAgIGZwcmludGYgKGluZm8tPmYsICJyZWdpc3RlciAiKTsKLQotICBwcmludF92bWEgKHZhbCwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgLyogJXMgKi8iLCB0LCBhYik7Ci0KLSAgZnJlZSAodCk7Ci0KLSAgKytpbmZvLT5wYXJhbWV0ZXI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoaW5mby0+cGFyYW1ldGVyID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAiKVxuIik7Ci0gICAgICBpbmZvLT5wYXJhbWV0ZXIgPSAwOwotICAgIH0KLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKGFkZHIsIGFiLCB0cnVlLCB0cnVlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgInsgLyogJXMgKi9cbiIsIGFiKTsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2xpbmVubyAocCwgZmlsZW5hbWUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICIvKiBmaWxlICVzIGxpbmUgJWx1IGFkZHIgJXMgKi9cbiIsIGZpbGVuYW1lLCBsaW5lbm8sIGFiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHdyaXRpbmcgb3V0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaW5mby0+aW5kZW50IC09IDI7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJ9IC8qICVzICovXG4iLCBhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGZ1bmN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2Z1bmN0aW9uIChwKQotICAgICBQVFIgcDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuMSBiL2JpbnV0aWxzL3JhbmxpYi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZiNWM4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JhbmxpYi4xCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHJhbmxpYiAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1yYW5saWIgXC0gZ2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZS4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQiByYW5saWIgXGMKLS5SQiAiW1x8IiBcLXYgfCBcLVYgIlx8XSIKLS5JIGFyY2hpdmVcYwotXCYKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi0uQiByYW5saWIKLWdlbmVyYXRlcyBhbiBpbmRleCB0byB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSwgYW5kCi1zdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCi1tZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKLS5QUAotWW91IG1heSB1c2UKLS5SQiBgICJubSBcLXMiICcKLW9yCi0uUkIgYCAibm0gXC1cLXByaW50LWFybWFwIiAnCi10byBsaXN0IHRoaXMgaW5kZXguCi0uUFAKLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLS5QUAotVGhlIEdOVQotLkIgcmFubGliCi1wcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBHTlUKLS5CUiBhciA7Ci1ydW5uaW5nCi0uQiByYW5saWIKLWlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0byBleGVjdXRpbmcKLS5SQiBgICJhciBcLXMiICcuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtdgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiByYW5saWIKLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgYXIgIigiIDEgIiksIgotLkJSIG5tICIoIiAxICIpLiIKLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuc2ggYi9iaW51dGlscy9yYW5saWIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiNmZiYzQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmFubGliLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQSBzaW1wbGUgcmFubGliIHNjcmlwdCwgdG8gdXNlIGxlc3MgZGlzayBzcGFjZSB0aGFuIGEgcmFubGliIHByb2dyYW0uCi1hciBzICQxCmRpZmYgLS1naXQgYS9iaW51dGlscy9yY2xleC5sIGIvYmludXRpbHMvcmNsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiNDc5Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yY2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLSV7IC8qIHJjbGV4LmwgLS0gbGV4ZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMgcGFyc2VyICAqLwotLyogQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgbGV4IGlucHV0IGZpbGUgd2hpY2ggZ2VuZXJhdGVzIGEgbGV4ZXIgdXNlZCBieSB0aGUKLSAgIFdpbmRvd3MgcmMgZmlsZSBwYXJzZXIuICBJdCBiYXNpY2FsbHkganVzdCByZWNvZ25pemVkIGEgYnVuY2ggb2YKLSAgIGtleXdvcmRzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLSNpbmNsdWRlICJyY3BhcnNlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiByY2RhdGEgbW9kZSwgaW4gd2hpY2ggd2UgcmV0dXJucyB0aGUgbGVuZ3RocyBvZgotICAgc3RyaW5ncy4gICovCi0KLXN0YXRpYyBpbnQgcmNkYXRhX21vZGU7Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIHN1cHJlc3NpbmcgbGluZXMgZnJvbSBjcHAgKGluY2x1ZGluZyB3aW5kb3dzLmggb3IKLSAgIGhlYWRlcnMgZnJvbSB5b3VyIEMgc291cmNlcyBtYXkgYnJpbmcgaW4gZXh0ZXJucyBhbmQgdHlwZWRlZnMpLgotICAgV2hlbiBhY3RpdmUsIHdlIHJldHVybiBJR05PUkVEX1RPS0VOLCB3aGljaCBsZXRzIHVzIGlnbm9yZSB0aGVzZQotICAgb3V0c2lkZSBvZiByZXNvdXJjZSBjb25zdHJ1Y3RzLiAgVGh1cywgaXQgaXNuJ3QgcmVxdWlyZWQgdG8gcHJvdGVjdAotICAgYWxsIHRoZSBub24tcHJlcHJvY2Vzc29yIGxpbmVzIGluIHlvdXIgaGVhZGVyIGZpbGVzIHdpdGggI2lmZGVmCi0gICBSQ19JTlZPS0VELiAgSXQgYWxzbyBtZWFucyB5b3VyIFJDIGZpbGUgY2FuJ3QgaW5jbHVkZSBvdGhlciBSQwotICAgZmlsZXMgaWYgdGhleSdyZSBuYW1lZCAiKi5oIi4gIFNvcnJ5LiAgTmFtZSB0aGVtICoucmNoIG9yIHdoYXRldmVyLiAgKi8KLQotc3RhdGljIGludCBzdXBwcmVzc19jcHBfZGF0YTsKLQotI2RlZmluZSBNQVlCRV9SRVRVUk4oeCkgcmV0dXJuIHN1cHByZXNzX2NwcF9kYXRhID8gSUdOT1JFRF9UT0tFTiA6ICh4KQotCi0vKiBUaGUgZmlyc3QgZmlsZW5hbWUgd2UgZGV0ZWN0IGluIHRoZSBjcHAgb3V0cHV0LiAgV2UgdXNlIHRoaXMgdG8KLSAgIHRlbGwgaW5jbHVkZWQgZmlsZXMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICppbml0aWFsX2ZuOwotCi0vKiBMaXN0IG9mIGFsbG9jYXRlZCBzdHJpbmdzLiAgKi8KLQotc3RydWN0IGFsbG9jX3N0cmluZwotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICpuZXh0OwotICBjaGFyICpzOwotfTsKLQotc3RhdGljIHN0cnVjdCBhbGxvY19zdHJpbmcgKnN0cmluZ3M7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGNwcF9saW5lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGNoYXIgKmhhbmRsZV9xdW90ZXMgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBjaGFyICpnZXRfc3RyaW5nIFBBUkFNUyAoKGludCkpOwotCi0lfQotCi0lJQotCi0iQkVHSU4iCQkJeyBNQVlCRV9SRVRVUk4gKEJFRyk7IH0KLSJ7IgkJCXsgTUFZQkVfUkVUVVJOIChCRUcpOyB9Ci0iRU5EIgkJCXsgTUFZQkVfUkVUVVJOIChFTkQpOyB9Ci0ifSIJCQl7IE1BWUJFX1JFVFVSTiAoRU5EKTsgfQotIkFDQ0VMRVJBVE9SUyIJCXsgTUFZQkVfUkVUVVJOIChBQ0NFTEVSQVRPUlMpOyB9Ci0iVklSVEtFWSIJCXsgTUFZQkVfUkVUVVJOIChWSVJUS0VZKTsgfQotIkFTQ0lJIgkJCXsgTUFZQkVfUkVUVVJOIChBU0NJSSk7IH0KLSJOT0lOVkVSVCIJCXsgTUFZQkVfUkVUVVJOIChOT0lOVkVSVCk7IH0KLSJTSElGVCIJCQl7IE1BWUJFX1JFVFVSTiAoU0hJRlQpOyB9Ci0iQ09OVFJPTCIJCXsgTUFZQkVfUkVUVVJOIChDT05UUk9MKTsgfQotIkFMVCIJCQl7IE1BWUJFX1JFVFVSTiAoQUxUKTsgfQotIkJJVE1BUCIJCXsgTUFZQkVfUkVUVVJOIChCSVRNQVApOyB9Ci0iQ1VSU09SIgkJeyBNQVlCRV9SRVRVUk4gKENVUlNPUik7IH0KLSJESUFMT0ciCQl7IE1BWUJFX1JFVFVSTiAoRElBTE9HKTsgfQotIkRJQUxPR0VYIgkJeyBNQVlCRV9SRVRVUk4gKERJQUxPR0VYKTsgfQotIkVYU1RZTEUiCQl7IE1BWUJFX1JFVFVSTiAoRVhTVFlMRSk7IH0KLSJDQVBUSU9OIgkJeyBNQVlCRV9SRVRVUk4gKENBUFRJT04pOyB9Ci0iQ0xBU1MiCQkJeyBNQVlCRV9SRVRVUk4gKENMQVNTKTsgfQotIlNUWUxFIgkJCXsgTUFZQkVfUkVUVVJOIChTVFlMRSk7IH0KLSJBVVRPM1NUQVRFIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE8zU1RBVEUpOyB9Ci0iQVVUT0NIRUNLQk9YIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE9DSEVDS0JPWCk7IH0KLSJBVVRPUkFESU9CVVRUT04iCXsgTUFZQkVfUkVUVVJOIChBVVRPUkFESU9CVVRUT04pOyB9Ci0iQ0hFQ0tCT1giCQl7IE1BWUJFX1JFVFVSTiAoQ0hFQ0tCT1gpOyB9Ci0iQ09NQk9CT1giCQl7IE1BWUJFX1JFVFVSTiAoQ09NQk9CT1gpOyB9Ci0iQ1RFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKENURVhUKTsgfQotIkRFRlBVU0hCVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoREVGUFVTSEJVVFRPTik7IH0KLSJFRElUVEVYVCIJCXsgTUFZQkVfUkVUVVJOIChFRElUVEVYVCk7IH0KLSJHUk9VUEJPWCIJCXsgTUFZQkVfUkVUVVJOIChHUk9VUEJPWCk7IH0KLSJMSVNUQk9YIgkJeyBNQVlCRV9SRVRVUk4gKExJU1RCT1gpOyB9Ci0iTFRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKExURVhUKTsgfQotIlBVU0hCT1giCQl7IE1BWUJFX1JFVFVSTiAoUFVTSEJPWCk7IH0KLSJQVVNIQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFBVU0hCVVRUT04pOyB9Ci0iUkFESU9CVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoUkFESU9CVVRUT04pOyB9Ci0iUlRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKFJURVhUKTsgfQotIlNDUk9MTEJBUiIJCXsgTUFZQkVfUkVUVVJOIChTQ1JPTExCQVIpOyB9Ci0iU1RBVEUzIgkJeyBNQVlCRV9SRVRVUk4gKFNUQVRFMyk7IH0KLSJVU0VSQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFVTRVJCVVRUT04pOyB9Ci0iQkVESVQiCQkJeyBNQVlCRV9SRVRVUk4gKEJFRElUKTsgfQotIkhFRElUIgkJCXsgTUFZQkVfUkVUVVJOIChIRURJVCk7IH0KLSJJRURJVCIJCQl7IE1BWUJFX1JFVFVSTiAoSUVESVQpOyB9Ci0iRk9OVCIJCQl7IE1BWUJFX1JFVFVSTiAoRk9OVCk7IH0KLSJJQ09OIgkJCXsgTUFZQkVfUkVUVVJOIChJQ09OKTsgfQotIkxBTkdVQUdFIgkJeyBNQVlCRV9SRVRVUk4gKExBTkdVQUdFKTsgfQotIkNIQVJBQ1RFUklTVElDUyIJeyBNQVlCRV9SRVRVUk4gKENIQVJBQ1RFUklTVElDUyk7IH0KLSJWRVJTSU9OIgkJeyBNQVlCRV9SRVRVUk4gKFZFUlNJT05LKTsgfQotIk1FTlUiCQkJeyBNQVlCRV9SRVRVUk4gKE1FTlUpOyB9Ci0iTUVOVUVYIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVFWCk7IH0KLSJNRU5VSVRFTSIJCXsgTUFZQkVfUkVUVVJOIChNRU5VSVRFTSk7IH0KLSJTRVBBUkFUT1IiCQl7IE1BWUJFX1JFVFVSTiAoU0VQQVJBVE9SKTsgfQotIlBPUFVQIgkJCXsgTUFZQkVfUkVUVVJOIChQT1BVUCk7IH0KLSJDSEVDS0VEIgkJeyBNQVlCRV9SRVRVUk4gKENIRUNLRUQpOyB9Ci0iR1JBWUVEIgkJeyBNQVlCRV9SRVRVUk4gKEdSQVlFRCk7IH0KLSJIRUxQIgkJCXsgTUFZQkVfUkVUVVJOIChIRUxQKTsgfQotIklOQUNUSVZFIgkJeyBNQVlCRV9SRVRVUk4gKElOQUNUSVZFKTsgfQotIk1FTlVCQVJCUkVBSyIJCXsgTUFZQkVfUkVUVVJOIChNRU5VQkFSQlJFQUspOyB9Ci0iTUVOVUJSRUFLIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVCUkVBSyk7IH0KLSJNRVNTQUdFVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoTUVTU0FHRVRBQkxFKTsgfQotIlJDREFUQSIJCXsgTUFZQkVfUkVUVVJOIChSQ0RBVEEpOyB9Ci0iU1RSSU5HVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoU1RSSU5HVEFCTEUpOyB9Ci0iVkVSU0lPTklORk8iCQl7IE1BWUJFX1JFVFVSTiAoVkVSU0lPTklORk8pOyB9Ci0iRklMRVZFUlNJT04iCQl7IE1BWUJFX1JFVFVSTiAoRklMRVZFUlNJT04pOyB9Ci0iUFJPRFVDVFZFUlNJT04iCXsgTUFZQkVfUkVUVVJOIChQUk9EVUNUVkVSU0lPTik7IH0KLSJGSUxFRkxBR1NNQVNLIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHU01BU0spOyB9Ci0iRklMRUZMQUdTIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHUyk7IH0KLSJGSUxFT1MiCQl7IE1BWUJFX1JFVFVSTiAoRklMRU9TKTsgfQotIkZJTEVUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVUWVBFKTsgfQotIkZJTEVTVUJUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVTVUJUWVBFKTsgfQotIlZBTFVFIgkJCXsgTUFZQkVfUkVUVVJOIChWQUxVRSk7IH0KLSJNT1ZFQUJMRSIJCXsgTUFZQkVfUkVUVVJOIChNT1ZFQUJMRSk7IH0KLSJGSVhFRCIJCQl7IE1BWUJFX1JFVFVSTiAoRklYRUQpOyB9Ci0iUFVSRSIJCQl7IE1BWUJFX1JFVFVSTiAoUFVSRSk7IH0KLSJJTVBVUkUiCQl7IE1BWUJFX1JFVFVSTiAoSU1QVVJFKTsgfQotIlBSRUxPQUQiCQl7IE1BWUJFX1JFVFVSTiAoUFJFTE9BRCk7IH0KLSJMT0FET05DQUxMIgkJeyBNQVlCRV9SRVRVUk4gKExPQURPTkNBTEwpOyB9Ci0iRElTQ0FSREFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoRElTQ0FSREFCTEUpOyB9Ci0iTk9UIgkJCXsgTUFZQkVfUkVUVVJOIChOT1QpOyB9Ci0KLSJCTE9DSyJbIFx0XG5dKiJcIiJbXlwjXG5dKiJcIiIgewotCQkJICBjaGFyICpzLCAqc2VuZDsKLQotCQkJICAvKiBUaGlzIGlzIGEgaGFjayB0byBsZXQgdXMgcGFyc2UgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBlYXNpbHkuICAqLwotCi0JCQkgIHMgPSBzdHJjaHIgKHl5dGV4dCwgJyInKTsKLQkJCSAgKytzOwotCQkJICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotCQkJICBpZiAoc3RybmNtcCAocywgIlN0cmluZ0ZpbGVJbmZvIiwKLQkJCQkgICAgICAgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxKSA9PSAwCi0JCQkgICAgICAmJiBzICsgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxID09IHNlbmQpCi0JCQkgICAgTUFZQkVfUkVUVVJOIChCTE9DS1NUUklOR0ZJTEVJTkZPKTsKLQkJCSAgZWxzZSBpZiAoc3RybmNtcCAocywgIlZhckZpbGVJbmZvIiwKLQkJCQkJICAgIHNpemVvZiAiVmFyRmlsZUluZm8iIC0gMSkgPT0gMAotCQkJCSAgICYmIHMgKyBzaXplb2YgIlZhckZpbGVJbmZvIiAtIDEgPT0gc2VuZCkKLQkJCSAgICBNQVlCRV9SRVRVUk4gKEJMT0NLVkFSRklMRUlORk8pOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgY2hhciAqcjsKLQotCQkJICAgICAgciA9IGdldF9zdHJpbmcgKHNlbmQgLSBzICsgMSk7Ci0JCQkgICAgICBzdHJuY3B5IChyLCBzLCBzZW5kIC0gcyk7Ci0JCQkgICAgICByW3NlbmQgLSBzXSA9ICdcMCc7Ci0JCQkgICAgICB5eWx2YWwucyA9IHI7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKEJMT0NLKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLSIjIlteXG5dKgkJewotCQkJICBjcHBfbGluZSAoeXl0ZXh0KTsKLQkJCX0KLQotWzAtOV1beDAtOUEtRmEtZl0qTAl7Ci0JCQkgIHl5bHZhbC5pLnZhbCA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0JCQkgIHl5bHZhbC5pLmR3b3JkID0gMTsKLQkJCSAgTUFZQkVfUkVUVVJOIChOVU1CRVIpOwotCQkJfQotCi1bMC05XVt4MC05QS1GYS1mXSoJewotCQkJICB5eWx2YWwuaS52YWwgPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotCQkJICB5eWx2YWwuaS5kd29yZCA9IDA7Ci0JCQkgIE1BWUJFX1JFVFVSTiAoTlVNQkVSKTsKLQkJCX0KLQotKCJcIiJbXlwiXG5dKiJcIiJbIFx0XSopKyB7Ci0JCQkgIGNoYXIgKnM7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotCi0JCQkgIHMgPSBoYW5kbGVfcXVvdGVzICh5eXRleHQsICZsZW5ndGgpOwotCQkJICBpZiAoISByY2RhdGFfbW9kZSkKLQkJCSAgICB7Ci0JCQkgICAgICB5eWx2YWwucyA9IHM7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKFFVT1RFRFNUUklORyk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgeXlsdmFsLnNzLmxlbmd0aCA9IGxlbmd0aDsKLQkJCSAgICAgIHl5bHZhbC5zcy5zID0gczsKLQkJCSAgICAgIE1BWUJFX1JFVFVSTiAoU0laRURTVFJJTkcpOwotCQkJICAgIH0KLQkJCX0KLQotW0EtWmEtel1bXiAsXHRcclxuXSoJewotCQkJICBjaGFyICpzOwotCi0JCQkgIC8qIEkgcmVqZWN0ZWQgY29tbWEgaW4gYSBzdHJpbmcgaW4gb3JkZXIgdG8KLQkJCSAgICAgaGFuZGxlIFZJUlRLRVksIENPTlRST0wgaW4gYW4gYWNjZWxlcmF0b3IKLQkJCSAgICAgcmVzb3VyY2UuICBUaGlzIG1lYW5zIHRoYXQgYW4gdW5xdW90ZWQKLQkJCSAgICAgZmlsZSBuYW1lIGNhbiBub3QgY29udGFpbiBhIGNvbW1hLiAgSQotCQkJICAgICBkb24ndCBrbm93IHdoYXQgcmMgcGVybWl0cy4gICovCi0KLQkJCSAgcyA9IGdldF9zdHJpbmcgKHN0cmxlbiAoeXl0ZXh0KSArIDEpOwotCQkJICBzdHJjcHkgKHMsIHl5dGV4dCk7Ci0JCQkgIHl5bHZhbC5zID0gczsKLQkJCSAgTUFZQkVfUkVUVVJOIChTVFJJTkcpOwotCQkJfQotCi1bXG5dCQkJeyArK3JjX2xpbmVubzsgfQotWyBcdFxyXSsJCXsgLyogaWdub3JlIHdoaXRlc3BhY2UgKi8gfQotLgkJCXsgTUFZQkVfUkVUVVJOICgqeXl0ZXh0KTsgfQotCi0lJQotI2lmbmRlZiB5eXdyYXAKLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBzb21lIHZlcnNpb25zIG9mIGxleC4gICovCi1pbnQgeXl3cmFwICgpCi17Ci0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIEMgcHJlcHJvY2Vzc29yIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotY3BwX2xpbmUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGludCBsaW5lOwotICBjaGFyICpzZW5kLCAqZm47Ci0KLSAgKytzOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0gIAotICBsaW5lID0gc3RydG9sIChzLCAmc2VuZCwgMCk7Ci0gIGlmICgqc2VuZCAhPSAnXDAnICYmICEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZW5kKSkKLSAgICByZXR1cm47Ci0KLSAgLyogU3VidHJhY3QgMSBiZWNhdXNlIHdlIGFyZSBhYm91dCB0byBjb3VudCB0aGUgbmV3bGluZS4gICovCi0gIHJjX2xpbmVubyA9IGxpbmUgLSAxOwotCi0gIHMgPSBzZW5kOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0KLSAgaWYgKCpzICE9ICciJykKLSAgICByZXR1cm47Ci0KLSAgKytzOwotICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotICBpZiAoc2VuZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmbiA9IChjaGFyICopIHhtYWxsb2MgKHNlbmQgLSBzICsgMSk7Ci0gIHN0cm5jcHkgKGZuLCBzLCBzZW5kIC0gcyk7Ci0gIGZuW3NlbmQgLSBzXSA9ICdcMCc7Ci0KLSAgZnJlZSAocmNfZmlsZW5hbWUpOwotICByY19maWxlbmFtZSA9IGZuOwotCi0gIGlmICghaW5pdGlhbF9mbikKLSAgICB7Ci0gICAgICBpbml0aWFsX2ZuID0geG1hbGxvYyAoc3RybGVuIChmbikgKyAxKTsKLSAgICAgIHN0cmNweShpbml0aWFsX2ZuLCBmbik7Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBpbml0aWFsIGZpbGUsIHJlZ2FyZGxlc3Mgb2YgbmFtZS4gIFN1cHByZXNzIGFsbCBvdGhlcgotICAgICBmaWxlcyBpZiB0aGV5IGVuZCBpbiAiLmgiICh0aGlzIGFsbG93cyBpbmNsdWRlZCAiKi5yYyIpICovCi0gIGlmIChzdHJjbXAgKGluaXRpYWxfZm4sIGZuKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGZuICsgc3RybGVuIChmbikgLSAyLCAiLmgiKSAhPSAwKQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMDsKLSAgZWxzZQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMTsKLX0KLQotLyogSGFuZGxlIGEgcXVvdGVkIHN0cmluZy4gIFRoZSBxdW90ZXMgYXJlIHN0cmlwcGVkLiAgQSBwYWlyIG9mIHF1b3RlcwotICAgaW4gYSBzdHJpbmcgYXJlIHR1cm5lZCBpbnRvIGEgc2luZ2xlIHF1b3RlLiAgQWRqYWNlbnQgc3RyaW5ncyBhcmUKLSAgIG1lcmdlZCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhcmUgbWVyZ2VkLCBhcyBpbiBDLiAgKi8KLQotc3RhdGljIGNoYXIgKgotaGFuZGxlX3F1b3RlcyAoaW5wdXQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqaW5wdXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmxlbjsKLXsKLSAgY2hhciAqcmV0LCAqczsKLSAgY29uc3QgY2hhciAqdDsKLSAgaW50IGNoOwotCi0gIHJldCA9IGdldF9zdHJpbmcgKHN0cmxlbiAoaW5wdXQpICsgMSk7Ci0KLSAgcyA9IHJldDsKLSAgdCA9IGlucHV0OwotICBpZiAoKnQgPT0gJyInKQotICAgICsrdDsKLSAgd2hpbGUgKCp0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCp0ID09ICdcXCcpCi0JewotCSAgKyt0OwotCSAgc3dpdGNoICgqdCkKLQkgICAgewotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgiYmFja3NsYXNoIGF0IGVuZCBvZiBzdHJpbmciKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcIic6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgidXNlIFwiXCIgdG8gcHV0IFwiIGluIGEgc3RyaW5nIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9BOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdiJzoKLQkgICAgICAqcysrID0gRVNDQVBFX0I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2YnOgotCSAgICAgICpzKysgPSBFU0NBUEVfRjsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9OOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdyJzoKLQkgICAgICAqcysrID0gRVNDQVBFX1I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgICpzKysgPSBFU0NBUEVfVDsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAndic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9WOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcXCc6Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotCSAgICAgIGNoID0gKnQgLSAnMCc7Ci0JICAgICAgKyt0OwotCSAgICAgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzcnKQotCQl7Ci0JCSAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOwotCQkgICsrdDsKLQkJICBpZiAoKnQgPj0gJzAnICYmICp0IDw9ICc3JykKLQkJICAgIHsKLQkJICAgICAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOwotCQkgICAgICArK3Q7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAqcysrID0gY2g7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgKyt0OwotCSAgICAgIGNoID0gMDsKLQkgICAgICB3aGlsZSAoMSkKLQkJewotCQkgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzknKQotCQkgICAgY2ggPSAoY2ggPDwgNCkgfCAoKnQgLSAnMCcpOwotCQkgIGVsc2UgaWYgKCp0ID49ICdhJyAmJiAqdCA8PSAnZicpCi0JCSAgICBjaCA9IChjaCA8PCA0KSB8ICgqdCAtICdhJyk7Ci0JCSAgZWxzZSBpZiAoKnQgPj0gJ0EnICYmICp0IDw9ICdGJykKLQkJICAgIGNoID0gKGNoIDw8IDQpIHwgKCp0IC0gJ0EnKTsKLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQkJICArK3Q7Ci0JCX0KLQkgICAgICAqcysrID0gY2g7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKCJ1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlIik7Ci0JICAgICAgKnMrKyA9ICdcXCc7Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgqdCAhPSAnIicpCi0JKnMrKyA9ICp0Kys7Ci0gICAgICBlbHNlIGlmICh0WzFdID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBlbHNlIGlmICh0WzFdID09ICciJykKLQl7Ci0JICAqcysrID0gJyInOwotCSAgdCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK3Q7Ci0JICBhc3NlcnQgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpOwotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpCi0JICAgICsrdDsKLQkgIGlmICgqdCA9PSAnXDAnKQotCSAgICBicmVhazsKLQkgIGFzc2VydCAoKnQgPT0gJyInKTsKLQkgICsrdDsKLQl9Ci0gICAgfQotCi0gICpzID0gJ1wwJzsKLQotICAqbGVuID0gcyAtIHJldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBbGxvY2F0ZSBhIHN0cmluZyBvZiBhIGdpdmVuIGxlbmd0aC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9zdHJpbmcgKGxlbikKLSAgICAgaW50IGxlbjsKLXsKLSAgc3RydWN0IGFsbG9jX3N0cmluZyAqYXM7Ci0KLSAgYXMgPSAoc3RydWN0IGFsbG9jX3N0cmluZyAqKSB4bWFsbG9jIChzaXplb2YgKmFzKTsKLSAgYXMtPnMgPSB4bWFsbG9jIChsZW4pOwotCi0gIGFzLT5uZXh0ID0gc3RyaW5nczsKLSAgc3RyaW5ncyA9IGFzLT5uZXh0OwotCi0gIHJldHVybiBhcy0+czsKLX0KLQotLyogRGlzY2FyZCBhbGwgdGhlIHN0cmluZ3Mgd2UgaGF2ZSBhbGxvY2F0ZWQuICBUaGUgcGFyc2VyIGNhbGxzIHRoaXMKLSAgIHdoZW4gaXQgbm8gbG9uZ2VyIG5lZWRzIHRoZW0uICAqLwotCi12b2lkCi1yY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKQotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICphczsKLQotICBhcyA9IHN0cmluZ3M7Ci0gIHdoaWxlIChhcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBhbGxvY19zdHJpbmcgKm47Ci0KLSAgICAgIGZyZWUgKGFzLT5zKTsKLSAgICAgIG4gPSBhcy0+bmV4dDsKLSAgICAgIGZyZWUgKGFzKTsKLSAgICAgIGFzID0gbjsKLSAgICB9Ci0KLSAgc3RyaW5ncyA9IE5VTEw7Ci19Ci0KLS8qIEVudGVyIHJjZGF0YSBtb2RlLiAgKi8KLQotdm9pZAotcmNwYXJzZV9yY2RhdGEgKCkKLXsKLSAgcmNkYXRhX21vZGUgPSAxOwotfQotCi0vKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlIGZyb20gcmNkYXRhIG1vZGUuICAqLwotCi12b2lkCi1yY3BhcnNlX25vcm1hbCAoKQotewotICByY2RhdGFfbW9kZSA9IDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yY3BhcnNlLnkgYi9iaW51dGlscy9yY3BhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzY2JiZGMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmNwYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsMTYxOSArMCwwIEBACi0leyAvKiByY3BhcnNlLnkgLS0gcGFyc2VyIGZvciBXaW5kb3dzIHJjIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBwYXJzZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMuICBJdCBpcyBiYXNlZCBvbiB0aGUgcGFyc2VyCi0gICBieSBHdW50aGVyIEViZXJ0IDxndW50aGVyLmViZXJ0QGl4b3MtbGVpcHppZy5kZT4uICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogVGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbGFuZ3VhZ2U7Ci0KLS8qIFRoZSByZXNvdXJjZSBpbmZvcm1hdGlvbiBkdXJpbmcgYSBzdWIgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzX2luZm8gc3ViX3Jlc19pbmZvOwotCi0vKiBEaWFsb2cgaW5mb3JtYXRpb24uICBUaGlzIGlzIGJ1aWx0IGJ5IHRoZSBub250ZXJtaW5hbHMgc3R5bGVzIGFuZAotICAgY29udHJvbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGRpYWxvZyBkaWFsb2c7Ci0KLS8qIFRoaXMgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgc3R5bGUuICBJdCBpcyBtb2RpZmllZCBieSB0aGUKLSAgIG5vbnRlcm1pbmFsIHN0eWxlZXhwci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0eWxlOwotCi0vKiBUaGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgY29udHJvbC4gIFRoZXkgYXJlIHNldCBiZWZvcmUgdXNpbmcKLSAgIGNvbnRyb2xfcGFyYW1zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFzZV9zdHlsZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRfc3R5bGU7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGFzczsKLQotJX0KLQotJXVuaW9uCi17Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciBhY2M7Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciAqcGFjYzsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkaWFsb2dfY29udHJvbDsKLSAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbTsKLSAgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmZpcnN0OwotICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqbGFzdDsKLSAgfSByY2RhdGE7Ci0gIHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhX2l0ZW07Ci0gIHN0cnVjdCBzdHJpbmd0YWJsZV9kYXRhICpzdHJpbmd0YWJsZTsKLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaXh2ZXI7Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmVyaW5mbzsKLSAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2ZXJzdHJpbmc7Ci0gIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmVydmFyOwotICBzdHJ1Y3QgcmVzX2lkIGlkOwotICBzdHJ1Y3QgcmVzX3Jlc19pbmZvIHJlc19pbmZvOwotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIHNob3J0IG9uOwotICAgIHVuc2lnbmVkIHNob3J0IG9mZjsKLSAgfSBtZW1mbGFnczsKLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgbnVtYmVyIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhcyBsb25nLiAgKi8KLSAgICBpbnQgZHdvcmQ7Ci0gIH0gaTsKLSAgdW5zaWduZWQgbG9uZyBpbDsKLSAgdW5zaWduZWQgc2hvcnQgaXM7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgY29uc3QgY2hhciAqczsKLSAgfSBzczsKLX07Ci0KLSV0b2tlbiBCRUcgRU5ECi0ldG9rZW4gQUNDRUxFUkFUT1JTIFZJUlRLRVkgQVNDSUkgTk9JTlZFUlQgU0hJRlQgQ09OVFJPTCBBTFQKLSV0b2tlbiBCSVRNQVAKLSV0b2tlbiBDVVJTT1IKLSV0b2tlbiBESUFMT0cgRElBTE9HRVggRVhTVFlMRSBDQVBUSU9OIENMQVNTIFNUWUxFCi0ldG9rZW4gQVVUTzNTVEFURSBBVVRPQ0hFQ0tCT1ggQVVUT1JBRElPQlVUVE9OIENIRUNLQk9YIENPTUJPQk9YIENURVhUCi0ldG9rZW4gREVGUFVTSEJVVFRPTiBFRElUVEVYVCBHUk9VUEJPWCBMSVNUQk9YIExURVhUIFBVU0hCT1ggUFVTSEJVVFRPTgotJXRva2VuIFJBRElPQlVUVE9OIFJURVhUIFNDUk9MTEJBUiBTVEFURTMgVVNFUkJVVFRPTgotJXRva2VuIEJFRElUIEhFRElUIElFRElUCi0ldG9rZW4gRk9OVAotJXRva2VuIElDT04KLSV0b2tlbiBMQU5HVUFHRSBDSEFSQUNURVJJU1RJQ1MgVkVSU0lPTksKLSV0b2tlbiBNRU5VIE1FTlVFWCBNRU5VSVRFTSBTRVBBUkFUT1IgUE9QVVAgQ0hFQ0tFRCBHUkFZRUQgSEVMUCBJTkFDVElWRQotJXRva2VuIE1FTlVCQVJCUkVBSyBNRU5VQlJFQUsKLSV0b2tlbiBNRVNTQUdFVEFCTEUKLSV0b2tlbiBSQ0RBVEEKLSV0b2tlbiBTVFJJTkdUQUJMRQotJXRva2VuIFZFUlNJT05JTkZPIEZJTEVWRVJTSU9OIFBST0RVQ1RWRVJTSU9OIEZJTEVGTEFHU01BU0sgRklMRUZMQUdTCi0ldG9rZW4gRklMRU9TIEZJTEVUWVBFIEZJTEVTVUJUWVBFIEJMT0NLU1RSSU5HRklMRUlORk8gQkxPQ0tWQVJGSUxFSU5GTwotJXRva2VuIFZBTFVFCi0ldG9rZW4gPHM+IEJMT0NLCi0ldG9rZW4gTU9WRUFCTEUgRklYRUQgUFVSRSBJTVBVUkUgUFJFTE9BRCBMT0FET05DQUxMIERJU0NBUkRBQkxFCi0ldG9rZW4gTk9UCi0ldG9rZW4gPHM+IFFVT1RFRFNUUklORyBTVFJJTkcKLSV0b2tlbiA8aT4gTlVNQkVSCi0ldG9rZW4gPHNzPiBTSVpFRFNUUklORwotJXRva2VuIElHTk9SRURfVE9LRU4KLQotJXR5cGUgPHBhY2M+IGFjY19lbnRyaWVzCi0ldHlwZSA8YWNjPiBhY2NfZW50cnkgYWNjX2V2ZW50Ci0ldHlwZSA8ZGlhbG9nX2NvbnRyb2w+IGNvbnRyb2wgY29udHJvbF9wYXJhbXMKLSV0eXBlIDxtZW51aXRlbT4gbWVudWl0ZW1zIG1lbnVpdGVtIG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KLSV0eXBlIDxyY2RhdGE+IG9wdHJjZGF0YV9kYXRhIG9wdHJjZGF0YV9kYXRhX2ludCByY2RhdGFfZGF0YQotJXR5cGUgPHJjZGF0YV9pdGVtPiBvcHRfY29udHJvbF9kYXRhCi0ldHlwZSA8Zml4dmVyPiBmaXhlZHZlcmluZm8KLSV0eXBlIDx2ZXJpbmZvPiB2ZXJibG9ja3MKLSV0eXBlIDx2ZXJzdHJpbmc+IHZlcnZhbHMKLSV0eXBlIDx2ZXJ2YXI+IHZlcnRyYW5zCi0ldHlwZSA8cmVzX2luZm8+IHN1Ym9wdGlvbnMgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWdzX21vdmUKLSV0eXBlIDxtZW1mbGFncz4gbWVtZmxhZwotJXR5cGUgPGlkPiBpZAotJXR5cGUgPGlsPiBleHN0eWxlIHBhcmVubnVtYmVyCi0ldHlwZSA8aWw+IG51bWV4cHIgcG9zbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBjcG9zbnVtZXhwcgotJXR5cGUgPGlzPiBhY2Nfb3B0aW9ucyBhY2Nfb3B0aW9uIG1lbnVpdGVtX2ZsYWdzIG1lbnVpdGVtX2ZsYWcKLSV0eXBlIDxzPiBvcHRzdHJpbmdjIGZpbGVfbmFtZQotJXR5cGUgPGk+IHNpemVkbnVtZXhwciBzaXplZHBvc251bWV4cHIKLQotJWxlZnQgJ3wnCi0lbGVmdCAnXicKLSVsZWZ0ICcmJwotJWxlZnQgJysnICctJwotJWxlZnQgJyonICcvJyAnJScKLSVyaWdodCAnficgTkVHCi0KLSUlCi0KLWlucHV0OgotCSAgLyogZW1wdHkgKi8KLQl8IGlucHV0IG5ld2NtZCBhY2NlbGVyYXRvcgotCXwgaW5wdXQgbmV3Y21kIGJpdG1hcAotCXwgaW5wdXQgbmV3Y21kIGN1cnNvcgotCXwgaW5wdXQgbmV3Y21kIGRpYWxvZwotCXwgaW5wdXQgbmV3Y21kIGZvbnQKLQl8IGlucHV0IG5ld2NtZCBpY29uCi0JfCBpbnB1dCBuZXdjbWQgbGFuZ3VhZ2UKLQl8IGlucHV0IG5ld2NtZCBtZW51Ci0JfCBpbnB1dCBuZXdjbWQgbWVudWV4Ci0JfCBpbnB1dCBuZXdjbWQgbWVzc2FnZXRhYmxlCi0JfCBpbnB1dCBuZXdjbWQgcmNkYXRhCi0JfCBpbnB1dCBuZXdjbWQgc3RyaW5ndGFibGUKLQl8IGlucHV0IG5ld2NtZCB1c2VyCi0JfCBpbnB1dCBuZXdjbWQgdmVyc2lvbmluZm8KLQl8IGlucHV0IG5ld2NtZCBJR05PUkVEX1RPS0VOCi0JOwotCi1uZXdjbWQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICByY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKTsKLQkgIH0KLQk7Ci0KLS8qIEFjY2VsZXJhdG9yIHJlc291cmNlcy4gICovCi0KLWFjY2VsZXJhdG9yOgotCSAgaWQgQUNDRUxFUkFUT1JTIHN1Ym9wdGlvbnMgQkVHIGFjY19lbnRyaWVzIEVORAotCSAgewotCSAgICBkZWZpbmVfYWNjZWxlcmF0b3IgKCQxLCAmJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLWFjY19lbnRyaWVzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgYWNjX2VudHJpZXMgYWNjX2VudHJ5Ci0JICB7Ci0JICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYTsKLQotCSAgICBhID0gKHN0cnVjdCBhY2NlbGVyYXRvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYSk7Ci0JICAgICphID0gJDI7Ci0JICAgIGlmICgkMSA9PSBOVUxMKQotCSAgICAgICQkID0gYTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IGFjY2VsZXJhdG9yICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gYTsKLQkJJCQgPSAkMTsKLQkgICAgICB9Ci0JICB9Ci0JOwotCi1hY2NfZW50cnk6Ci0JICBhY2NfZXZlbnQgY3Bvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuaWQgPSAkMjsKLQkgIH0KLQl8IGFjY19ldmVudCBjcG9zbnVtZXhwciAnLCcgYWNjX29wdGlvbnMKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuaWQgPSAkMjsKLQkgICAgJCQuZmxhZ3MgfD0gJDQ7Ci0JICAgIGlmICgoJCQuZmxhZ3MgJiBBQ0NfVklSVEtFWSkgPT0gMAotCQkmJiAoJCQuZmxhZ3MgJiAoQUNDX1NISUZUIHwgQUNDX0NPTlRST0wgfCBBQ0NfQUxUKSkgIT0gMCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImluYXBwcm9wcmlhdGUgbW9kaWZpZXJzIGZvciBub24tVklSVEtFWSIpKTsKLQkgIH0KLQk7Ci0KLWFjY19ldmVudDoKLQkgIFFVT1RFRFNUUklORwotCSAgewotCSAgICBjb25zdCBjaGFyICpzID0gJDE7Ci0JICAgIGNoYXIgY2g7Ci0KLQkgICAgJCQubmV4dCA9IE5VTEw7Ci0JICAgICQkLmlkID0gMDsKLQkgICAgY2ggPSAqczsKLQkgICAgaWYgKGNoICE9ICdeJykKLQkgICAgICAkJC5mbGFncyA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSQkLmZsYWdzID0gQUNDX0NPTlRST0wgfCBBQ0NfVklSVEtFWTsKLQkJKytzOwotCQljaCA9ICpzOwotCQljaCA9IHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjaCk7Ci0JICAgICAgfQotCSAgICAkJC5rZXkgPSBjaDsKLQkgICAgaWYgKHNbMV0gIT0gJ1wwJykKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImFjY2VsZXJhdG9yIHNob3VsZCBvbmx5IGJlIG9uZSBjaGFyYWN0ZXIiKSk7Ci0JICB9Ci0JfCBwb3NudW1leHByCi0JICB7Ci0JICAgICQkLm5leHQgPSBOVUxMOwotCSAgICAkJC5mbGFncyA9IDA7Ci0JICAgICQkLmlkID0gMDsKLQkgICAgJCQua2V5ID0gJDE7Ci0JICB9Ci0JOwotCi1hY2Nfb3B0aW9uczoKLQkgIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGFjY19vcHRpb25zICcsJyBhY2Nfb3B0aW9uCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMzsKLQkgIH0KLQkvKiBJJ3ZlIGhhZCBvbmUgcmVwb3J0IHRoYXQgdGhlIGNvbW1hIGlzIG9wdGlvbmFsLiAgKi8KLQl8IGFjY19vcHRpb25zIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMSB8ICQyOwotCSAgfQotCTsKLQotYWNjX29wdGlvbjoKLQkgIFZJUlRLRVkKLQkgIHsKLQkgICAgJCQgPSBBQ0NfVklSVEtFWTsKLQkgIH0KLQl8IEFTQ0lJCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMganVzdCB0aGUgYWJzZW5jZSBvZiBWSVJUS0VZLiAgKi8KLQkgICAgJCQgPSAwOwotCSAgfQotCXwgTk9JTlZFUlQKLQkgIHsKLQkgICAgJCQgPSBBQ0NfTk9JTlZFUlQ7Ci0JICB9Ci0JfCBTSElGVAotCSAgewotCSAgICAkJCA9IEFDQ19TSElGVDsKLQkgIH0KLQl8IENPTlRST0wKLQkgIHsKLQkgICAgJCQgPSBBQ0NfQ09OVFJPTDsKLQkgIH0KLQl8IEFMVAotCSAgewotCSAgICAkJCA9IEFDQ19BTFQ7Ci0JICB9Ci0JOwotCi0vKiBCaXRtYXAgcmVzb3VyY2VzLiAgKi8KLQotYml0bWFwOgotCSAgaWQgQklUTUFQIG1lbWZsYWdzX21vdmUgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV9iaXRtYXAgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIEN1cnNvciByZXNvdXJjZXMuICAqLwotCi1jdXJzb3I6Ci0JICBpZCBDVVJTT1IgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfY3Vyc29yICgkMSwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBEaWFsb2cgcmVzb3VyY2VzLiAgKi8KLQotZGlhbG9nOgotCSAgaWQgRElBTE9HIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9IE5VTEw7Ci0JICAgICAgZGlhbG9nLmNvbnRyb2xzID0gTlVMTDsKLQkgICAgICBzdWJfcmVzX2luZm8gPSAkMzsKLQkgICAgfQotCSAgICBzdHlsZXMgQkVHIGNvbnRyb2xzIEVORAotCSAgewotCSAgICBkZWZpbmVfZGlhbG9nICgkMSwgJnN1Yl9yZXNfaW5mbywgJmRpYWxvZyk7Ci0JICB9Ci0JfCBpZCBESUFMT0dFWCBtZW1mbGFnc19tb3ZlIGV4c3R5bGUgcG9zbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwcgotCSAgICB7Ci0JICAgICAgbWVtc2V0ICgmZGlhbG9nLCAwLCBzaXplb2YgZGlhbG9nKTsKLQkgICAgICBkaWFsb2cueCA9ICQ1OwotCSAgICAgIGRpYWxvZy55ID0gJDY7Ci0JICAgICAgZGlhbG9nLndpZHRoID0gJDc7Ci0JICAgICAgZGlhbG9nLmhlaWdodCA9ICQ4OwotCSAgICAgIGRpYWxvZy5zdHlsZSA9IFdTX1BPUFVQIHwgV1NfQk9SREVSIHwgV1NfU1lTTUVOVTsKLQkgICAgICBkaWFsb2cuZXhzdHlsZSA9ICQ0OwotCSAgICAgIGRpYWxvZy5tZW51Lm5hbWVkID0gMTsKLQkgICAgICBkaWFsb2cuY2xhc3MubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5mb250ID0gTlVMTDsKLQkgICAgICBkaWFsb2cuZXggPSAoKHN0cnVjdCBkaWFsb2dfZXggKikKLQkJCSAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlhbG9nX2V4KSkpOwotCSAgICAgIG1lbXNldCAoZGlhbG9nLmV4LCAwLCBzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKTsKLQkgICAgICBkaWFsb2cuY29udHJvbHMgPSBOVUxMOwotCSAgICAgIHN1Yl9yZXNfaW5mbyA9ICQzOwotCSAgICB9Ci0JICAgIHN0eWxlcyBCRUcgY29udHJvbHMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9kaWFsb2cgKCQxLCAmc3ViX3Jlc19pbmZvLCAmZGlhbG9nKTsKLQkgIH0KLQl8IGlkIERJQUxPR0VYIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9ICgoc3RydWN0IGRpYWxvZ19leCAqKQotCQkJICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKSk7Ci0JICAgICAgbWVtc2V0IChkaWFsb2cuZXgsIDAsIHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOwotCSAgICAgIGRpYWxvZy5leC0+aGVscCA9ICQ5OwotCSAgICAgIGRpYWxvZy5jb250cm9scyA9IE5VTEw7Ci0JICAgICAgc3ViX3Jlc19pbmZvID0gJDM7Ci0JICAgIH0KLQkgICAgc3R5bGVzIEJFRyBjb250cm9scyBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX2RpYWxvZyAoJDEsICZzdWJfcmVzX2luZm8sICZkaWFsb2cpOwotCSAgfQotCTsKLQotZXhzdHlsZToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gMDsKLQkgIH0KLQl8IEVYU1RZTEUgJz0nIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQk7Ci0KLXN0eWxlczoKLQkgIC8qIGVtcHR5ICovCi0JfCBzdHlsZXMgQ0FQVElPTiBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZkaWFsb2cuY2FwdGlvbiwgJDMpOwotCSAgfQotCXwgc3R5bGVzIENMQVNTIGlkCi0JICB7Ci0JICAgIGRpYWxvZy5jbGFzcyA9ICQzOwotCSAgfQotCXwgc3R5bGVzIFNUWUxFCi0JICAgIHsgc3R5bGUgPSBkaWFsb2cuc3R5bGU7IH0KLQkgICAgc3R5bGVleHByCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSA9IHN0eWxlOwotCSAgfQotCXwgc3R5bGVzIEVYU1RZTEUgbnVtZXhwcgotCSAgewotCSAgICBkaWFsb2cuZXhzdHlsZSA9ICQzOwotCSAgfQotCXwgc3R5bGVzIEZPTlQgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSB8PSBEU19TRVRGT05UOwotCSAgICBkaWFsb2cucG9pbnRzaXplID0gJDM7Ci0JICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmZGlhbG9nLmZvbnQsICQ1KTsKLQkgIH0KLQl8IHN0eWxlcyBGT05UIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBkaWFsb2cuc3R5bGUgfD0gRFNfU0VURk9OVDsKLQkgICAgZGlhbG9nLnBvaW50c2l6ZSA9ICQzOwotCSAgICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJmRpYWxvZy5mb250LCAkNSk7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImV4dGVuZGVkIEZPTlQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRpYWxvZy5leC0+d2VpZ2h0ID0gJDY7Ci0JCWRpYWxvZy5leC0+aXRhbGljID0gJDc7Ci0JICAgICAgfQotCSAgfQotCXwgc3R5bGVzIE1FTlUgaWQKLQkgIHsKLQkgICAgZGlhbG9nLm1lbnUgPSAkMzsKLQkgIH0KLQl8IHN0eWxlcyBDSEFSQUNURVJJU1RJQ1MgbnVtZXhwcgotCSAgewotCSAgICBzdWJfcmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzID0gJDM7Ci0JICB9Ci0JfCBzdHlsZXMgTEFOR1VBR0UgbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBzdWJfcmVzX2luZm8ubGFuZ3VhZ2UgPSAkMyB8ICgkNCA8PCA4KTsKLQkgIH0KLQl8IHN0eWxlcyBWRVJTSU9OSyBudW1leHByCi0JICB7Ci0JICAgIHN1Yl9yZXNfaW5mby52ZXJzaW9uID0gJDM7Ci0JICB9Ci0JOwotCi1jb250cm9sczoKLQkgIC8qIGVtcHR5ICovCi0JfCBjb250cm9scyBjb250cm9sCi0JICB7Ci0JICAgIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKnBwOwotCi0JICAgIGZvciAocHAgPSAmZGlhbG9nLmNvbnRyb2xzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgICAgOwotCSAgICAqcHAgPSAkMjsKLQkgIH0KLQk7Ci0KLWNvbnRyb2w6Ci0JICBBVVRPM1NUQVRFCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQVVUTzNTVEFURSB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTX0FVVE8zU1RBVEU7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBBVVRPQ0hFQ0tCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1g7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBBVVRPUkFESU9CVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT047Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBCRURJVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oIklFRElUIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCSAgICByZXNfc3RyaW5nX3RvX2lkICgmJCQtPmNsYXNzLCAiQkVESVQiKTsKLQkgIH0KLQl8IENIRUNLQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19DSEVDS0JPWCB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBDT01CT0JPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IENCU19TSU1QTEUgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSAwOwotCSAgICAgIGNsYXNzID0gQ1RMX0NPTUJPQk9YOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKLQkgICAgaWYgKCQxMSAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQxMTsKLQkgICAgICB9Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkMTE7Ci0JICAgICQkLT5kYXRhID0gJDEyOwotCSAgfQotCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKLQkgICAgaWYgKCQxMiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpOwotCQkkJC0+ZGF0YSA9ICQxMjsKLQkgICAgICB9Ci0JICAgICQkLT5jbGFzcy5uYW1lZCA9IDE7Ci0gIAkgICAgdW5pY29kZV9mcm9tX2FzY2lpKCYkJC0+Y2xhc3MudS5uLmxlbmd0aCwgJiQkLT5jbGFzcy51Lm4ubmFtZSwgJDUpOwotCSAgfQotCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoImhlbHAgSUQgcmVxdWlyZXMgRElBTE9HRVgiKTsKLQkgICAgJCQtPmhlbHAgPSAkMTI7Ci0JICAgICQkLT5kYXRhID0gJDEzOwotCSAgICAkJC0+Y2xhc3MubmFtZWQgPSAxOwotICAJICAgIHVuaWNvZGVfZnJvbV9hc2NpaSgmJCQtPmNsYXNzLnUubi5sZW5ndGgsICYkJC0+Y2xhc3MudS5uLm5hbWUsICQ1KTsKLQkgIH0KLQl8IENURVhUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU1NfQ0VOVEVSIHwgV1NfR1JPVVA7Ci0JICAgICAgYmFzZV9zdHlsZSA9IFNTX0NFTlRFUjsKLQkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IERFRlBVU0hCVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBFRElUVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBHUk9VUEJPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX0dST1VQQk9YOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19HUk9VUEJPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEhFRElUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGNsYXNzID0gQ1RMX0VESVQ7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiSUVESVQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIHJlc19zdHJpbmdfdG9faWQgKCYkJC0+Y2xhc3MsICJIRURJVCIpOwotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMiwgJDMsICQ0LCAkNSwgMCwgMCwgQ1RMX1NUQVRJQywKLQkJCQkgU1NfSUNPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwgMCk7Ci0JICAgIGlmICgkNiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ2OwotCSAgICAgIH0KLQkgIH0KLQl8IElDT04gb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGljb25fc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLSAgICAJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDQsICQ1LCAkNiwgJDcsIENUTF9TVEFUSUMsCi0JCQkJIHN0eWxlLCAkOSk7Ci0JICAgIGlmICgkMTAgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkJJCQtPmRhdGEgPSAkMTA7Ci0JICAgICAgfQotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgaWNvbl9zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotICAgIAkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgQ1RMX1NUQVRJQywKLQkJCQkgc3R5bGUsICQ5KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkMTA7Ci0JICAgICQkLT5kYXRhID0gJDExOwotCSAgfQotCXwgSUVESVQKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfRURJVDsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJJRURJVCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLT5jbGFzcywgIklFRElUIik7Ci0JICB9Ci0JfCBMSVNUQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKLQkgICAgICBiYXNlX3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKLQkgICAgICBjbGFzcyA9IENUTF9MSVNUQk9YOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBMVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX0xFRlQgfCBXU19HUk9VUDsKLQkgICAgICBiYXNlX3N0eWxlID0gU1NfTEVGVDsKLQkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFBVU0hCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQk9YIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFBVU0hCVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBSQURJT0JVVFRPTgotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUkFESU9CVVRUT047Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBSVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX1JJR0hUIHwgV1NfR1JPVVA7Ci0JICAgICAgYmFzZV9zdHlsZSA9IFNTX1JJR0hUOwotCSAgICAgIGNsYXNzID0gQ1RMX1NUQVRJQzsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCXwgU0NST0xMQkFSCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU0JTX0hPUlo7Ci0JICAgICAgYmFzZV9zdHlsZSA9IDA7Ci0JICAgICAgY2xhc3MgPSBDVExfU0NST0xMQkFSOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBTVEFURTMKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU18zU1RBVEUgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU18zU1RBVEU7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBVU0VSQlVUVE9OIFFVT1RFRFNUUklORyAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcKLQkgICAgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgCi0JICAgIHsgc3R5bGUgPSBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KLQkgICAgc3R5bGVleHByIG9wdGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkNCwgJDYsICQ4LCAkMTAsICQxMiwgQ1RMX0JVVFRPTiwKLQkJCQkgc3R5bGUsICQxNik7Ci0JICB9Ci0JOwotCi0vKiBQYXJhbWV0ZXJzIGZvciBhIGNvbnRyb2wuICBUaGUgc3RhdGljIHZhcmlhYmxlcyBERUZBVUxUX1NUWUxFLAotICAgQkFTRV9TVFlMRSwgYW5kIENMQVNTIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgbm9udGVybWluYWwKLSAgIGlzIHVzZWQuICBERUZBVUxUX1NUWUxFIGlzIHRoZSBzdHlsZSB0byB1c2UgaWYgbm8gc3R5bGUgZXhwcmVzc2lvbgotICAgaXMgc3BlY2lmaWVkLiAgQkFTRV9TVFlMRSBpcyB0aGUgYmFzZSBzdHlsZSB0byB1c2UgaWYgYSBzdHlsZQotICAgZXhwcmVzc2lvbiBpcyBzcGVjaWZpZWQ7IHRoZSBzdHlsZSBleHByZXNzaW9uIG1vZGlmaWVzIHRoZSBiYXNlCi0gICBzdHlsZS4gIENMQVNTIGlzIHRoZSBjbGFzcyBvZiB0aGUgY29udHJvbC4gICovCi0KLWNvbnRyb2xfcGFyYW1zOgotCSAgb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsCi0JCQkJIGRlZmF1bHRfc3R5bGUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUsIDApOwotCSAgICBpZiAoJDcgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkJJCQtPmRhdGEgPSAkNzsKLQkgICAgICB9Ci0JICB9Ci0JfCBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgY29udHJvbF9wYXJhbXNfc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsIHN0eWxlLCAkOCk7Ci0JICAgIGlmICgkOSAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ5OwotCSAgICAgIH0KLQkgIH0KLQl8IG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjb250cm9sX3BhcmFtc19zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCBjbGFzcywgc3R5bGUsICQ4KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkOTsKLQkgICAgJCQtPmRhdGEgPSAkMTA7Ci0JICB9Ci0JOwotCi1vcHRzdHJpbmdjOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgUVVPVEVEU1RSSU5HICcsJwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotb3B0X2NvbnRyb2xfZGF0YToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgJCQgPSAkMi5maXJzdDsKLQkgIH0KLQk7Ci0KLS8qIFRoZXNlIG9ubHkgZXhpc3QgdG8gcGFyc2UgYSByZWR1Y3Rpb24gb3V0IG9mIGEgY29tbW9uIGNhc2UuICAqLwotCi1jb250cm9sX3N0eWxlZXhwcjoKLQkgICcsJwotCSAgeyBzdHlsZSA9IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi1pY29uX3N0eWxlZXhwcjoKLQkgICcsJwotCSAgeyBzdHlsZSA9IFNTX0lDT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KLQkgIHN0eWxlZXhwcgotCTsKLQotY29udHJvbF9wYXJhbXNfc3R5bGVleHByOgotCSAgJywnCi0JICB7IHN0eWxlID0gYmFzZV9zdHlsZSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi0vKiBGb250IHJlc291cmNlcy4gICovCi0KLWZvbnQ6Ci0JICBpZCBGT05UIG1lbWZsYWdzX21vdmVfZGlzY2FyZCBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX2ZvbnQgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIEljb24gcmVzb3VyY2VzLiAgKi8KLQotaWNvbjoKLQkgIGlkIElDT04gbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfaWNvbiAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogTGFuZ3VhZ2UgY29tbWFuZC4gIFRoaXMgY2hhbmdlcyB0aGUgc3RhdGljIHZhcmlhYmxlIGxhbmd1YWdlLCB3aGljaAotICAgYWZmZWN0cyBhbGwgc3Vic2VxdWVudCByZXNvdXJjZXMuICAqLwotCi1sYW5ndWFnZToKLQkgIExBTkdVQUdFIG51bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgbGFuZ3VhZ2UgPSAkMiB8ICgkMyA8PCA4KTsKLQkgIH0KLQk7Ci0KLS8qIE1lbnUgcmVzb3VyY2VzLiAgKi8KLQotbWVudToKLQkgIGlkIE1FTlUgc3Vib3B0aW9ucyBCRUcgbWVudWl0ZW1zIEVORAotCSAgewotCSAgICBkZWZpbmVfbWVudSAoJDEsICYkMywgJDUpOwotCSAgfQotCTsKLQotbWVudWl0ZW1zOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgbWVudWl0ZW1zIG1lbnVpdGVtCi0JICB7Ci0JICAgIGlmICgkMSA9PSBOVUxMKQotCSAgICAgICQkID0gJDI7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cnVjdCBtZW51aXRlbSAqKnBwOwotCi0JCWZvciAocHAgPSAmJDEtPm5leHQ7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkJICA7Ci0JCSpwcCA9ICQyOwotCQkkJCA9ICQxOwotCSAgICAgIH0KLQkgIH0KLQk7Ci0KLW1lbnVpdGVtOgotCSAgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIG1lbnVpdGVtX2ZsYWdzCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAwLCAwLCBOVUxMKTsKLQkgIH0KLQl8IE1FTlVJVEVNIFNFUEFSQVRPUgotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoTlVMTCwgMCwgMCwgMCwgMCwgTlVMTCk7Ci0JICB9Ci0JfCBQT1BVUCBRVU9URURTVFJJTkcgbWVudWl0ZW1fZmxhZ3MgQkVHIG1lbnVpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAwLCAkMywgMCwgMCwgJDUpOwotCSAgfQotCTsKLQotbWVudWl0ZW1fZmxhZ3M6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IDA7Ci0JICB9Ci0JfCBtZW51aXRlbV9mbGFncyAnLCcgbWVudWl0ZW1fZmxhZwotCSAgewotCSAgICAkJCA9ICQxIHwgJDM7Ci0JICB9Ci0JfCBtZW51aXRlbV9mbGFncyBtZW51aXRlbV9mbGFnCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMjsKLQkgIH0KLQk7Ci0KLW1lbnVpdGVtX2ZsYWc6Ci0JICBDSEVDS0VECi0JICB7Ci0JICAgICQkID0gTUVOVUlURU1fQ0hFQ0tFRDsKLQkgIH0KLQl8IEdSQVlFRAotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX0dSQVlFRDsKLQkgIH0KLQl8IEhFTFAKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9IRUxQOwotCSAgfQotCXwgSU5BQ1RJVkUKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9JTkFDVElWRTsKLQkgIH0KLQl8IE1FTlVCQVJCUkVBSwotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCQVJCUkVBSzsKLQkgIH0KLQl8IE1FTlVCUkVBSwotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCUkVBSzsKLQkgIH0KLQk7Ci0KLS8qIE1lbnVleCByZXNvdXJjZXMuICAqLwotCi1tZW51ZXg6Ci0JICBpZCBNRU5VRVggc3Vib3B0aW9ucyBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9tZW51ICgkMSwgJiQzLCAkNSk7Ci0JICB9Ci0JOwotCi1tZW51ZXhpdGVtczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KLQkgIHsKLQkgICAgaWYgKCQxID09IE5VTEwpCi0JICAgICAgJCQgPSAkMjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IG1lbnVpdGVtICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gJDI7Ci0JCSQkID0gJDE7Ci0JICAgICAgfQotCSAgfQotCTsKLQotbWVudWV4aXRlbToKLQkgIE1FTlVJVEVNIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsIDAsIDAsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsIDAsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIG9wdGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgMCwgTlVMTCk7Ci0JICB9Ci0gCXwgTUVOVUlURU0gU0VQQVJBVE9SCi0gCSAgewotIAkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwpOwotIAkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgMCwgMCwgMCwgMCwgJDQpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgMCwgMCwgMCwgJDUpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgJDQsIDAsIDAsICQ2KTsKLQkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwcgotCSAgICBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgJDYsICQ4KTsKLQkgIH0KLQk7Ci0KLS8qIE1lc3NhZ2V0YWJsZSByZXNvdXJjZXMuICAqLwotCi1tZXNzYWdldGFibGU6Ci0JICBpZCBNRVNTQUdFVEFCTEUgbWVtZmxhZ3NfbW92ZSBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX21lc3NhZ2V0YWJsZSAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogUmNkYXRhIHJlc291cmNlcy4gICovCi0KLXJjZGF0YToKLQkgIGlkIFJDREFUQSBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX3JjZGF0YSAoJDEsICYkMywgJDUuZmlyc3QpOwotCSAgfQotCTsKLQotLyogV2UgdXNlIGEgZGlmZmVyZW50IGxleGluZyBhbGdvcml0aG0sIGJlY2F1c2UgcmNkYXRhIHN0cmluZ3MgbWF5Ci0gICBjb250YWluIGVtYmVkZGVkIG51bGwgYnl0ZXMsIGFuZCB3ZSBuZWVkIHRvIGtub3cgdGhlIGxlbmd0aCB0byB1c2UuICAqLwotCi1vcHRyY2RhdGFfZGF0YToKLQkgIHsKLQkgICAgcmNwYXJzZV9yY2RhdGEgKCk7Ci0JICB9Ci0JICBvcHRyY2RhdGFfZGF0YV9pbnQKLQkgIHsKLQkgICAgcmNwYXJzZV9ub3JtYWwgKCk7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi1vcHRyY2RhdGFfZGF0YV9pbnQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJC5maXJzdCA9IE5VTEw7Ci0JICAgICQkLmxhc3QgPSBOVUxMOwotCSAgfQotCXwgcmNkYXRhX2RhdGEKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLXJjZGF0YV9kYXRhOgotCSAgU0laRURTVFJJTkcKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfc3RyaW5nICgkMS5zLCAkMS5sZW5ndGgpOwotCSAgICAkJC5maXJzdCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfbnVtYmVyICgkMS52YWwsICQxLmR3b3JkKTsKLQkgICAgJCQuZmlyc3QgPSByaTsKLQkgICAgJCQubGFzdCA9IHJpOwotCSAgfQotCXwgcmNkYXRhX2RhdGEgJywnIFNJWkVEU1RSSU5HCi0JICB7Ci0JICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLQkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX3N0cmluZyAoJDMucywgJDMubGVuZ3RoKTsKLQkgICAgJCQuZmlyc3QgPSAkMS5maXJzdDsKLQkgICAgJDEubGFzdC0+bmV4dCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCByY2RhdGFfZGF0YSAnLCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLQkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX251bWJlciAoJDMudmFsLCAkMy5kd29yZCk7Ci0JICAgICQkLmZpcnN0ID0gJDEuZmlyc3Q7Ci0JICAgICQxLmxhc3QtPm5leHQgPSByaTsKLQkgICAgJCQubGFzdCA9IHJpOwotCSAgfQotCTsKLQotLyogU3RyaW5ndGFibGUgcmVzb3VyY2VzLiAgKi8KLQotc3RyaW5ndGFibGU6Ci0JICBTVFJJTkdUQUJMRSBzdWJvcHRpb25zIEJFRyAKLQkgICAgeyBzdWJfcmVzX2luZm8gPSAkMjsgfQotCSAgICBzdHJpbmdfZGF0YSBFTkQKLQk7Ci0KLXN0cmluZ19kYXRhOgotCSAgLyogZW1wdHkgKi8KLQl8IHN0cmluZ19kYXRhIG51bWV4cHIgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRlZmluZV9zdHJpbmd0YWJsZSAoJnN1Yl9yZXNfaW5mbywgJDIsICQzKTsKLQkgIH0KLQl8IHN0cmluZ19kYXRhIG51bWV4cHIgJywnIFFVT1RFRFNUUklORwotCSAgewotCSAgICBkZWZpbmVfc3RyaW5ndGFibGUgKCZzdWJfcmVzX2luZm8sICQyLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBVc2VyIGRlZmluZWQgcmVzb3VyY2VzLiAgV2UgYWNjZXB0IGdlbmVyYWwgc3Vib3B0aW9ucyBpbiB0aGUKLSAgIGZpbGVfbmFtZSBjYXNlIHRvIGtlZXAgdGhlIHBhcnNlciBoYXBweS4gICovCi0KLXVzZXI6Ci0JICBpZCBpZCBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX3VzZXJfZGF0YSAoJDEsICQyLCAmJDMsICQ1LmZpcnN0KTsKLQkgIH0KLQl8IGlkIGlkIHN1Ym9wdGlvbnMgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV91c2VyX2ZpbGUgKCQxLCAkMiwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBWZXJzaW9uaW5mbyByZXNvdXJjZXMuICAqLwotCi12ZXJzaW9uaW5mbzoKLQkgIGlkIFZFUlNJT05JTkZPIGZpeGVkdmVyaW5mbyBCRUcgdmVyYmxvY2tzIEVORAotCSAgewotCSAgICBkZWZpbmVfdmVyc2lvbmluZm8gKCQxLCBsYW5ndWFnZSwgJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLWZpeGVkdmVyaW5mbzoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gKChzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKikKLQkJICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvKSkpOwotCSAgICBtZW1zZXQgKCQkLCAwLCBzaXplb2YgKHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbykpOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVWRVJTSU9OIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgJDEtPmZpbGVfdmVyc2lvbl9tcyA9ICgkMyA8PCAxNikgfCAkNDsKLQkgICAgJDEtPmZpbGVfdmVyc2lvbl9scyA9ICgkNSA8PCAxNikgfCAkNjsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBQUk9EVUNUVkVSU0lPTiBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbXMgPSAoJDMgPDwgMTYpIHwgJDQ7Ci0JICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbHMgPSAoJDUgPDwgMTYpIHwgJDY7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRUZMQUdTTUFTSyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX2ZsYWdzX21hc2sgPSAkMzsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBGSUxFRkxBR1MgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV9mbGFncyA9ICQzOwotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVPUyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX29zID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVRZUEUgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV90eXBlID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVNVQlRZUEUgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV9zdWJ0eXBlID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBUbyBoYW5kbGUgdmVyYmxvY2tzIHN1Y2Nlc3NmdWxseSwgdGhlIGxleGVyIGhhbmRsZXMgQkxPQ0sKLSAgIHNwZWNpYWxseS4gIEEgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcwotICAgQkxPQ0tTVFJJTkdGSUxFSU5GTy4gIEEgQkxPQ0sgIlZhckZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcwotICAgQkxPQ0tWQVJGSUxFSU5GTy4gIEEgQkxPQ0sgd2l0aCBzb21lIG90aGVyIHN0cmluZyByZXR1cm5zIEJMT0NLCi0gICB3aXRoIHRoZSBzdHJpbmcgYXMgdGhlIHZhbHVlLiAgKi8KLQotdmVyYmxvY2tzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgdmVyYmxvY2tzIEJMT0NLU1RSSU5HRklMRUlORk8gQkVHIEJMT0NLIEJFRyB2ZXJ2YWxzIEVORCBFTkQKLQkgIHsKLQkgICAgJCQgPSBhcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvICgkMSwgJDQsICQ2KTsKLQkgIH0KLQl8IHZlcmJsb2NrcyBCTE9DS1ZBUkZJTEVJTkZPIEJFRyBWQUxVRSBRVU9URURTVFJJTkcgdmVydHJhbnMgRU5ECi0JICB7Ci0JICAgICQkID0gYXBwZW5kX3Zlcl92YXJmaWxlaW5mbyAoJDEsICQ1LCAkNik7Ci0JICB9Ci0JOwotCi12ZXJ2YWxzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgdmVydmFscyBWQUxVRSBRVU9URURTVFJJTkcgJywnIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJ2YWwgKCQxLCAkMywgJDUpOwotCSAgfQotCTsKLQotdmVydHJhbnM6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCB2ZXJ0cmFucyBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJ0cmFucyAoJDEsICQyLCAkMyk7Ci0JICB9Ci0JOwotCi0vKiBBIHJlc291cmNlIElELiAgKi8KLQotaWQ6Ci0JICBwb3NudW1leHByCi0JICB7Ci0JICAgICQkLm5hbWVkID0gMDsKLQkgICAgJCQudS5pZCA9ICQxOwotCSAgfQotCXwgU1RSSU5HCi0JICB7Ci0JICAgIGNoYXIgKmNvcHksICpzOwotCi0JICAgIC8qIEl0IHNlZW1zIHRoYXQgcmVzb3VyY2UgSUQncyBhcmUgZm9yY2VkIHRvIHVwcGVyIGNhc2UuICAqLwotCSAgICBjb3B5ID0geHN0cmR1cCAoJDEpOwotCSAgICBmb3IgKHMgPSBjb3B5OyAqcyAhPSAnXDAnOyBzKyspCi0JICAgICAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSpzID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLCBjb3B5KTsKLQkgICAgZnJlZSAoY29weSk7Ci0JICB9Ci0JOwotCi0vKiBHZW5lcmljIHN1Ym9wdGlvbnMuICBUaGVzZSBtYXkgYXBwZWFyIGJlZm9yZSB0aGUgQkVHSU4gaW4gYW55Ci0gICBtdWx0aWxpbmUgc3RhdGVtZW50LiAgKi8KLQotc3Vib3B0aW9uczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgIG1lbXNldCAoJiQkLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfcmVzX2luZm8pKTsKLQkgICAgJCQubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQkgICAgLyogRklYTUU6IElzIHRoaXMgdGhlIHJpZ2h0IGRlZmF1bHQ/ICAqLwotCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEU7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIG1lbWZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247Ci0JICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIENIQVJBQ1RFUklTVElDUyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLmNoYXJhY3RlcmlzdGljcyA9ICQzOwotCSAgfQotCXwgc3Vib3B0aW9ucyBMQU5HVUFHRSBudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLmxhbmd1YWdlID0gJDMgfCAoJDQgPDwgOCk7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIFZFUlNJT05LIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQudmVyc2lvbiA9ICQzOwotCSAgfQotCTsKLQotLyogTWVtb3J5IGZsYWdzIHdoaWNoIGRlZmF1bHQgdG8gTU9WRUFCTEUgYW5kIERJU0NBUkRBQkxFLiAgKi8KLQotbWVtZmxhZ3NfbW92ZV9kaXNjYXJkOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgbWVtc2V0ICgmJCQsIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotCSAgICAkJC5sYW5ndWFnZSA9IGxhbmd1YWdlOwotCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEUgfCBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgfQotCXwgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247Ci0JICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7Ci0JICB9Ci0JOwotCi0vKiBNZW1vcnkgZmxhZ3Mgd2hpY2ggZGVmYXVsdCB0byBNT1ZFQUJMRS4gICovCi0KLW1lbWZsYWdzX21vdmU6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICBtZW1zZXQgKCYkJCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0JICAgICQkLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JICAgICQkLm1lbWZsYWdzID0gTUVNRkxBR19NT1ZFQUJMRTsKLQkgIH0KLQl8IG1lbWZsYWdzX21vdmUgbWVtZmxhZwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC5tZW1mbGFncyB8PSAkMi5vbjsKLQkgICAgJCQubWVtZmxhZ3MgJj1+ICQyLm9mZjsKLQkgIH0KLQk7Ci0KLS8qIE1lbW9yeSBmbGFncy4gIFRoaXMgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHR3byBpbnRlZ2VycywgYmVjYXVzZSB3ZQotICAgc29tZXRpbWVzIHdhbnQgdG8gc2V0IGJpdHMgYW5kIHdlIHNvbWV0aW1lcyB3YW50IHRvIGNsZWFyIHRoZW0uICAqLwotCi1tZW1mbGFnOgotCSAgTU9WRUFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCXwgRklYRUQKLQkgIHsKLQkgICAgJCQub24gPSAwOwotCSAgICAkJC5vZmYgPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgfQotCXwgUFVSRQotCSAgewotCSAgICAkJC5vbiA9IE1FTUZMQUdfUFVSRTsKLQkgICAgJCQub2ZmID0gMDsKLQkgIH0KLQl8IElNUFVSRQotCSAgewotCSAgICAkJC5vbiA9IDA7Ci0JICAgICQkLm9mZiA9IE1FTUZMQUdfUFVSRTsKLQkgIH0KLQl8IFBSRUxPQUQKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX1BSRUxPQUQ7Ci0JICAgICQkLm9mZiA9IDA7Ci0JICB9Ci0JfCBMT0FET05DQUxMCi0JICB7Ci0JICAgICQkLm9uID0gMDsKLQkgICAgJCQub2ZmID0gTUVNRkxBR19QUkVMT0FEOwotCSAgfQotCXwgRElTQ0FSREFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCTsKLQotLyogQSBmaWxlIG5hbWUuICAqLwotCi1maWxlX25hbWU6Ci0JICBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IFNUUklORwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotLyogQSBzdHlsZSBleHByZXNzaW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBzdGF0aWMgdmFyaWFibGUgU1RZTEUuICBXZSBkbwotICAgaXQgdGhpcyB3YXkgYmVjYXVzZSByYyBhcHBlYXJzIHRvIHBlcm1pdCBhIHN0eWxlIHRvIGJlIHNldCB0bwotICAgc29tZXRoaW5nIGxpa2UKLSAgICAgICBXU19HUk9VUCB8IE5PVCBXU19UQUJTVE9QCi0gICB0byBtZWFuIHRoYXQgYSBkZWZhdWx0IG9mIFdTX1RBQlNUT1Agc2hvdWxkIGJlIHJlbW92ZWQuICBBbnl0aGluZwotICAgd2hpY2ggd2FudHMgdG8gYWNjZXB0IGEgc3R5bGUgbXVzdCBmaXJzdCBzZXQgU1RZTEUgdG8gdGhlIGRlZmF1bHQKLSAgIHZhbHVlLiAgVGhlIHN0eWxlZXhwciBub250ZXJtaW5hbCB3aWxsIGNoYW5nZSBTVFlMRSBhcyBzcGVjaWZpZWQgYnkKLSAgIHRoZSB1c2VyLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGhlcmUsCi0gICBqdXN0IG51bWJlcnMgc2VwYXJhdGVkIGJ5ICd8Jy4gICovCi0KLXN0eWxlZXhwcjoKLQkgIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlIHw9ICQxOwotCSAgfQotCXwgTk9UIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlICY9fiAkMjsKLQkgIH0KLQl8IHN0eWxlZXhwciAnfCcgcGFyZW5udW1iZXIKLQkgIHsKLQkgICAgc3R5bGUgfD0gJDM7Ci0JICB9Ci0JfCBzdHlsZWV4cHIgJ3wnIE5PVCBwYXJlbm51bWJlcgotCSAgewotCSAgICBzdHlsZSAmPX4gJDQ7Ci0JICB9Ci0JOwotCi1wYXJlbm51bWJlcjoKLQkgIE5VTUJFUgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQl8ICcoJyBudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCTsKLQotLyogQW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIGEgbGVhZGluZyBjb21tYS4gICovCi0KLW9wdGNudW1leHByOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSAwOwotCSAgfQotCXwgY251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEuICAqLwotCi1jbnVtZXhwcjoKLQkgICcsJyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHBvc3NpYmx5IG5lZ2F0ZWQgbnVtZXJpYyBleHByZXNzaW9uLiAgKi8KLQotbnVtZXhwcjoKLQkgIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEEgcG9zc2libHkgbmVnYXRlZCBleHByZXNzaW9uIHdpdGggYSBzaXplLiAgKi8KLQotc2l6ZWRudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCAnLScgc2l6ZWRudW1leHByICVwcmVjIE5FRwotCSAgewotCSAgICAkJC52YWwgPSAtICQyLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMi5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAqICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAvICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAlICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCArICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAtICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAmICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnXicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCBeICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnfCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCB8ICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEgd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5Ci0gICBuZWdhdGlvbi4gICovCi0KLWNwb3NudW1leHByOgotCSAgJywnIHBvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgKi8KLQotcG9zbnVtZXhwcjoKLQkgIHNpemVkcG9zbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgV2Ugc2VwYXJhdGUgdW5hcnkKLSAgIG5lZ2F0aW9uIHRvIGF2b2lkIHBhcnNpbmcgY29uZmxpY3RzIHdoZW4gdHdvIG51bWVyaWMgZXhwcmVzc2lvbnMKLSAgIGFwcGVhciBjb25zZWN1dGl2ZWx5LiAgKi8KLQotc2l6ZWRwb3NudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyonIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy8nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyUnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJysnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy0nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyYnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ14nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgXiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ3wnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgfCAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JOwotCi0lJQotCi0vKiBTZXQgdGhlIGxhbmd1YWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLXZvaWQKLXJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5nKQotICAgICBpbnQgbGFuZzsKLXsKLSAgbGFuZ3VhZ2UgPSBsYW5nOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmRjb2ZmLmMgYi9iaW51dGlscy9yZGNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2OGJjNi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDg4OSArMCwwIEBACi0vKiBzdGFicy5jIC0tIFBhcnNlIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggcGFyc2VzIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0aGlzIEJGRCBpbnRlcm5hbCBmaWxlLiAgV2UgbmVlZCBpdCBmb3IKLSAgIHRoZSBOX0JUTUFTSywgZXRjLiwgdmFsdWVzLiAgKi8KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoZXNlIG1hY3JvcyBleHRyYWN0IHRoZSByaWdodCBtYXNrIGFuZCBzaGlmdHMgZm9yIHRoaXMgQkZELiAgVGhleQotICAgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCBBQkZELiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBtYWNyb3MgbGlrZSBJU0ZDTiBhbmQgREVDUkVGLCBmcm9tIGNvZmYvaW50ZXJuYWwuaCwgd2lsbCB3b3JrCi0gICB3aXRob3V0IG1vZGlmaWNhdGlvbi4gICovCi0jZGVmaW5lIE5fQlRNQVNLIChjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0bWFzaykKLSNkZWZpbmUJTl9CVFNIRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0KQotI2RlZmluZQlOX1RNQVNLICAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzaykKLSNkZWZpbmUJTl9UU0hJRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdHNoaWZ0KQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlIHN5bWJvbHMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQKLSAgIGxvY2F0aW9uIHdpdGhpbiB0aGUgc3ltYm9scy4gICovCi0KLXN0cnVjdCBjb2ZmX3N5bWJvbHMKLXsKLSAgLyogVGhlIHN5bWJvbHMuICAqLwotICBhc3ltYm9sICoqc3ltczsKLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgLyogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHN5bWJvbC4gICovCi0gIGxvbmcgc3ltbm87Ci0gIC8qIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzeW1ib2wgaW4gdGhlIENPRkYgc3ltYm9sIHRhYmxlICh3aGVyZQotICAgICBlYWNoIGF1eGVudCBjb3VudHMgYXMgYSBzeW1ib2wpLiAgKi8KLSAgbG9uZyBjb2ZmX3N5bW5vOwotfTsKLQotLyogVGhlIGxhcmdlc3QgYmFzaWMgdHlwZSB3ZSBhcmUgcHJlcGFyZWQgdG8gaGFuZGxlLiAgKi8KLQotI2RlZmluZSBUX01BWCAoVF9MTkdEQkwpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBzbG90cy4gICovCi0KLXN0cnVjdCBjb2ZmX3Nsb3RzCi17Ci0gIC8qIE5leHQgc2V0IG9mIHNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKm5leHQ7Ci0gIC8qIFNsb3RzLiAgKi8KLSNkZWZpbmUgQ09GRl9TTE9UUyAoMTYpCi0gIGRlYnVnX3R5cGUgc2xvdHNbQ09GRl9TTE9UU107Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBzeW1ib2wgaW5kaWNlcyB0byB0eXBlcy4gICovCi0KLXN0cnVjdCBjb2ZmX3R5cGVzCi17Ci0gIC8qIFNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKnNsb3RzOwotICAvKiBCYXNpYyB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgYmFzaWNbVF9NQVggKyAxXTsKLX07Ci0KLXN0YXRpYyBkZWJ1Z190eXBlICpjb2ZmX2dldF9zbG90IFBBUkFNUyAoKHN0cnVjdCBjb2ZmX3R5cGVzICosIGludCkpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl90eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGxvbmcsIGludCwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgYm9vbGVhbiwgUFRSKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX2Jhc2VfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBsb25nLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9lbnVtX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9jb2ZmX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwgYXN5bWJvbCAqLCBsb25nLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgUFRSLCBkZWJ1Z190eXBlLCBib29sZWFuKSk7Ci0MCi0vKiBSZXR1cm4gdGhlIHNsb3QgZm9yIGEgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLWNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBpbmR4KQotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGludCBpbmR4OwotewotICBzdHJ1Y3QgY29mZl9zbG90cyAqKnBwczsKLQotICBwcHMgPSAmdHlwZXMtPnNsb3RzOwotCi0gIHdoaWxlIChpbmR4ID49IENPRkZfU0xPVFMpCi0gICAgewotICAgICAgaWYgKCpwcHMgPT0gTlVMTCkKLQl7Ci0JICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0JICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0JfQotICAgICAgcHBzID0gJigqcHBzKS0+bmV4dDsKLSAgICAgIGluZHggLT0gQ09GRl9TTE9UUzsKLSAgICB9Ci0KLSAgaWYgKCpwcHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0gICAgICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0gICAgfQotCi0gIHJldHVybiAoKnBwcyktPnNsb3RzICsgaW5keDsKLX0KLQotLyogUGFyc2UgYSBDT0ZGIHR5cGUgY29kZSBpbiBOVFlQRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwgdXNlYXV4LAotCQkgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIGJvb2xlYW4gdXNlYXV4OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgZGVidWdfdHlwZSB0eXBlOwotCi0gIGlmICgobnR5cGUgJiB+Tl9CVE1BU0spICE9IDApCi0gICAgewotICAgICAgaW50IG5ld3R5cGU7Ci0KLSAgICAgIG5ld3R5cGUgPSBERUNSRUYgKG50eXBlKTsKLQotICAgICAgaWYgKElTUFRSIChudHlwZSkpCi0JewotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG5ld3R5cGUsCi0JCQkJICBwYXV4ZW50LCB1c2VhdXgsIGRoYW5kbGUpOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0ZDTiAobnR5cGUpKQotCXsKLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBuZXd0eXBlLAotCQkJCSAgcGF1eGVudCwgdXNlYXV4LCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHR5cGUsIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkJCSAgIGZhbHNlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0FSWSAobnR5cGUpKQotCXsKLQkgIGludCBuOwotCi0JICBpZiAocGF1eGVudCA9PSBOVUxMKQotCSAgICBuID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIHNob3J0ICpkaW07Ci0JICAgICAgaW50IGk7Ci0KLQkgICAgICAvKiBGSVhNRTogSWYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9PSAwLCBnZGIgc2V0cwotICAgICAgICAgICAgICAgICB0aGUgY19uYXV4IGZpZWxkIG9mIHRoZSBzeW1lbnQgdG8gMC4gICovCi0KLQkgICAgICAvKiBNb3ZlIHRoZSBkaW1lbnNpb25zIGRvd24sIHNvIHRoYXQgdGhlIG5leHQgYXJyYXkKLSAgICAgICAgICAgICAgICAgcGlja3MgdXAgdGhlIG5leHQgb25lLiAgKi8KLQkgICAgICBkaW0gPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuOwotCSAgICAgIG4gPSBkaW1bMF07Ci0JICAgICAgZm9yIChpID0gMDsgKmRpbSAhPSAwICYmIGkgPCBESU1OVU0gLSAxOyBpKyssIGRpbSsrKQotCQkqZGltID0gKihkaW0gKyAxKTsKLQkgICAgICAqZGltID0gMDsKLQkgICAgfQotCi0JICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgY29mZl9zeW1ubywgbmV3dHlwZSwKLQkJCQkgIHBhdXhlbnQsIGZhbHNlLCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIHR5cGUsCi0JCQkJCXBhcnNlX2NvZmZfYmFzZV90eXBlIChhYmZkLCBzeW1ib2xzLAotCQkJCQkJCSAgICAgIHR5cGVzLAotCQkJCQkJCSAgICAgIGNvZmZfc3ltbm8sCi0JCQkJCQkJICAgICAgVF9JTlQsCi0JCQkJCQkJICAgICAgTlVMTCwgZGhhbmRsZSksCi0JCQkJCTAsIG4gLSAxLCBmYWxzZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHBhcnNlX2NvZmZfdHlwZTogQmFkIHR5cGUgY29kZSAweCV4XG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBudHlwZSk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLQotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gIGlmIChwYXV4ZW50ICE9IE5VTEwgJiYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA+IDApCi0gICAgewotICAgICAgZGVidWdfdHlwZSAqc2xvdDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyB0eXBlLiAgRklYTUU6IGdkYiBjaGVja3MKLQkgdGhhdCB0aGUgY2xhc3MgaXMgbm90IENfU1RSVEFHLCBub3IgQ19VTlRBRywgbm9yIENfRU5UQUcuICAqLwotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sKTsKLSAgICAgIGlmICgqc2xvdCAhPSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuICpzbG90OwotICAgICAgZWxzZQotCXJldHVybiBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHNsb3QsIChjb25zdCBjaGFyICopIE5VTEwpOwotICAgIH0KLQotICAvKiBJZiB0aGUgYXV4IGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3Igc29tZXRoaW5nLCB1c2VhdXggd2lsbAotICAgICBoYXZlIGJlZW4gc2V0IHRvIGZhbHNlLCBpbmRpY2F0aW5nIHRoYXQgcGFyc2VfY29mZl9iYXNlX3R5cGUKLSAgICAgc2hvdWxkIG5vdCB1c2UgaXQuICBXZSBuZWVkIHRvIGRvIGl0IHRoaXMgd2F5LCByYXRoZXIgdGhhbiBzaW1wbHkKLSAgICAgcGFzc2luZyBwYXV4ZW50IGFzIE5VTEwsIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIGhhbmRsZQotICAgICBtdWx0aXBsZSBhcnJheSBkaW1lbnNpb25zIHdoaWxlIHN0aWxsIGRpc2NhcmRpbmcgcGF1eGVudCBhZnRlcgotICAgICBoYXZpbmcgaGFuZGxlZCBhbGwgb2YgdGhlbS4gICovCi0gIGlmICghIHVzZWF1eCkKLSAgICBwYXV4ZW50ID0gTlVMTDsKLQotICByZXR1cm4gcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwKLQkJCSAgICAgICBwYXV4ZW50LCBkaGFuZGxlKTsKLX0KLQotLyogUGFyc2UgYSBiYXNpYyBDT0ZGIHR5cGUgaW4gTlRZUEUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwKLQkJICAgICAgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBkZWJ1Z190eXBlIHJldDsKLSAgYm9vbGVhbiBzZXRfYmFzaWM7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGRlYnVnX3R5cGUgKnNsb3Q7Ci0KLSAgaWYgKG50eXBlID49IDAKLSAgICAgICYmIG50eXBlIDw9IFRfTUFYCi0gICAgICAmJiB0eXBlcy0+YmFzaWNbbnR5cGVdICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gdHlwZXMtPmJhc2ljW250eXBlXTsKLQotICBzZXRfYmFzaWMgPSB0cnVlOwotICBuYW1lID0gTlVMTDsKLQotICBzd2l0Y2ggKG50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0ID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTlVMTDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9DSEFSOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NIT1JUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9JTlQ6Ci0gICAgICAvKiBGSVhNRTogUGVyaGFwcyB0aGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9MT05HOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0ZMT0FUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0xOR0RCTDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTIpOwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VQ0hBUjoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1VTSE9SVDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VSU5UOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VTE9ORzoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdHJ1ZSwgMCwKLQkJCQkgICAgICAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfVU5JT046Ci0gICAgICBpZiAocGF1eGVudCA9PSBOVUxMKQotCXJldCA9IGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGZhbHNlLCAwLCAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRU5VTToKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIChjb25zdCBjaGFyICoqKSBOVUxMLAotCQkJCSAgICAoYmZkX3NpZ25lZF92bWEgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKTsKLQotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBjb2ZmX3N5bW5vKTsKLSAgICAgICpzbG90ID0gcmV0OwotCi0gICAgICBzZXRfYmFzaWMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHJldCA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgcmV0KTsKLQotICBpZiAoc2V0X2Jhc2ljCi0gICAgICAmJiBudHlwZSA+PSAwCi0gICAgICAmJiBudHlwZSA8PSBUX01BWCkKLSAgICB0eXBlcy0+YmFzaWNbbnR5cGVdID0gcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFBhcnNlIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBsb25nIHN5bWVuZDsKLSAgaW50IGFsbG9jOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICBpbnQgY291bnQ7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBzeW1lbmQgPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCi0gIGFsbG9jID0gMTA7Ci0gIGZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKLSAgY291bnQgPSAwOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZQotCSAmJiBzeW1ib2xzLT5jb2ZmX3N5bW5vIDwgc3ltZW5kCi0JICYmIHN5bWJvbHMtPnN5bW5vIDwgc3ltYm9scy0+c3ltY291bnQpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgbG9uZyB0aGlzX2NvZmZfc3ltbm87Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBzdWJhdXg7Ci0gICAgICBiZmRfdm1hIGJpdHBvcyA9IDAsIGJpdHNpemUgPSAwOwotCi0gICAgICBzeW0gPSBzeW1ib2xzLT5zeW1zW3N5bWJvbHMtPnN5bW5vXTsKLQotICAgICAgaWYgKCEgYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltLCAmc3ltZW50KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfc3ltZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotCi0gICAgICB0aGlzX2NvZmZfc3ltbm8gPSBzeW1ib2xzLT5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMtPnN5bW5vOwotICAgICAgc3ltYm9scy0+Y29mZl9zeW1ubyArPSAxICsgc3ltZW50Lm5fbnVtYXV4OwotCi0gICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JcHN1YmF1eCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltLCAwLCAmYXV4ZW50KSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9hdXhlbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICBwc3ViYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfTU9TOgotCWNhc2UgQ19NT1U6Ci0JICBiaXRwb3MgPSA4ICogYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJRUxEOgotCSAgYml0cG9zID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRU9TOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGRvbmUpCi0JewotCSAgZGVidWdfdHlwZSBmdHlwZTsKLQkgIGRlYnVnX2ZpZWxkIGY7Ci0KLQkgIGZ0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgIHN5bWVudC5uX3R5cGUsIHBzdWJhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgZiA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGZ0eXBlLAotCQkJCWJpdHBvcywgYml0c2l6ZSwgREVCVUdfVklTSUJJTElUWV9QVUJMSUMpOwotCSAgaWYgKGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgaWYgKGNvdW50ICsgMSA+PSBhbGxvYykKLQkgICAgewotCSAgICAgIGFsbG9jICs9IDEwOwotCSAgICAgIGZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJCXhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgfQotCi0JICBmaWVsZHNbY291bnRdID0gZjsKLQkgICsrY291bnQ7Ci0JfQotICAgIH0KLQotICBmaWVsZHNbY291bnRdID0gREVCVUdfRklFTERfTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgbnR5cGUgPT0gVF9TVFJVQ1QsCi0JCQkJIHBhdXhlbnQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJCSBmaWVsZHMpOwotfQotCi0vKiBQYXJzZSBhbiBlbnVtIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICpwYXV4ZW50OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgbG9uZyBzeW1lbmQ7Ci0gIGludCBhbGxvYzsKLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLSAgaW50IGNvdW50OwotICBib29sZWFuIGRvbmU7Ci0KLSAgc3ltZW5kID0gcGF1eGVudC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLQotICBhbGxvYyA9IDEwOwotICBuYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotICB2YWxzID0gKGJmZF9zaWduZWRfdm1hICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICp2YWxzKTsKLSAgY291bnQgPSAwOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZQotCSAmJiBzeW1ib2xzLT5jb2ZmX3N5bW5vIDwgc3ltZW5kCi0JICYmIHN5bWJvbHMtPnN5bW5vIDwgc3ltYm9scy0+c3ltY291bnQpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbHMtPnN5bXNbc3ltYm9scy0+c3ltbm9dOwotCi0gICAgICBpZiAoISBiZmRfY29mZl9nZXRfc3ltZW50IChhYmZkLCBzeW0sICZzeW1lbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0KLSAgICAgICsrc3ltYm9scy0+c3ltbm87Ci0gICAgICBzeW1ib2xzLT5jb2ZmX3N5bW5vICs9IDEgKyBzeW1lbnQubl9udW1hdXg7Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfTU9FOgotCSAgaWYgKGNvdW50ICsgMSA+PSBhbGxvYykKLQkgICAgewotCSAgICAgIGFsbG9jICs9IDEwOwotCSAgICAgIG5hbWVzID0gKChjb25zdCBjaGFyICoqKQotCQkgICAgICAgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkgICAgICB2YWxzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkgICAgICB4cmVhbGxvYyAodmFscywgYWxsb2MgKiBzaXplb2YgKnZhbHMpKTsKLQkgICAgfQotCi0JICBuYW1lc1tjb3VudF0gPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOwotCSAgdmFsc1tjb3VudF0gPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICsrY291bnQ7Ci0JICBicmVhazsKLQotCWNhc2UgQ19FT1M6Ci0JICBkb25lID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgbmFtZXNbY291bnRdID0gTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWxzKTsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIENPRkYgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2NvZmZfc3ltYm9sIChhYmZkLCB0eXBlcywgc3ltLCBjb2ZmX3N5bW5vLCBwc3ltZW50LCBkaGFuZGxlLCB0eXBlLAotCQkgICB3aXRoaW5fZnVuY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfdHlwZXMgKnR5cGVzOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqcHN5bWVudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYm9vbGVhbiB3aXRoaW5fZnVuY3Rpb247Ci17Ci0gIHN3aXRjaCAocHN5bWVudC0+bl9zY2xhc3MpCi0gICAgewotICAgIGNhc2UgQ19OVUxMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfQVVUTzoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19MT0NBTCwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19HTE9CQUwsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVEFUOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAotCQkJCSAgICh3aXRoaW5fZnVuY3Rpb24KLQkJCQkgICAgPyBERUJVR19MT0NBTF9TVEFUSUMKLQkJCQkgICAgOiBERUJVR19TVEFUSUMpLAotCQkJCSAgIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUc6Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19SRUdJU1RFUiwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfQVJHOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICAgREVCVUdfUEFSTV9TVEFDSywgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgIERFQlVHX1BBUk1fUkVHLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlKTsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICAgIHsKLQlkZWJ1Z190eXBlICpzbG90OwotCi0JdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlKTsKLQlpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBTdG9yZSB0aGUgbmFtZWQgdHlwZSBpbnRvIHRoZSBzbG90LCBzbyB0aGF0IHJlZmVyZW5jZXMgZ2V0Ci0gICAgICAgICAgIHRoZSBuYW1lLiAgKi8KLQlzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotCSpzbG90ID0gdHlwZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsJCQkJICAgCi19Ci0KLS8qIFRoaXMgaXMgdGhlIG1haW4gcm91dGluZS4gIEl0IGxvb2tzIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZAotICAgaGFuZGxlcyB0aGVtLiAgKi8KLQotYm9vbGVhbgotcGFyc2VfY29mZiAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2xzIHN5bWJvbHM7Ci0gIHN0cnVjdCBjb2ZmX3R5cGVzIHR5cGVzOwotICBpbnQgaTsKLSAgbG9uZyBuZXh0X2NfZmlsZTsKLSAgY29uc3QgY2hhciAqZm5uYW1lOwotICBpbnQgZm5jbGFzczsKLSAgaW50IGZudHlwZTsKLSAgYmZkX3ZtYSBmbmVuZDsKLSAgYWxlbnQgKmxpbmVub3M7Ci0gIGJvb2xlYW4gd2l0aGluX2Z1bmN0aW9uOwotICBsb25nIHRoaXNfY29mZl9zeW1ubzsKLQotICBzeW1ib2xzLnN5bXMgPSBzeW1zOwotICBzeW1ib2xzLnN5bWNvdW50ID0gc3ltY291bnQ7Ci0gIHN5bWJvbHMuc3ltbm8gPSAwOwotICBzeW1ib2xzLmNvZmZfc3ltbm8gPSAwOwotCi0gIHR5cGVzLnNsb3RzID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8PSBUX01BWDsgaSsrKQotICAgIHR5cGVzLmJhc2ljW2ldID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIG5leHRfY19maWxlID0gLTE7Ci0gIGZubmFtZSA9IE5VTEw7Ci0gIGZuY2xhc3MgPSAwOwotICBmbnR5cGUgPSAwOwotICBmbmVuZCA9IDA7Ci0gIGxpbmVub3MgPSBOVUxMOwotICB3aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQotICB3aGlsZSAoc3ltYm9scy5zeW1ubyA8IHN5bWNvdW50KQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXg7Ci0gICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgICAgIHN5bSA9IHN5bXNbc3ltYm9scy5zeW1ub107Ci0KLSAgICAgIGlmICghIGJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bSwgJnN5bWVudCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQotICAgICAgdGhpc19jb2ZmX3N5bW5vID0gc3ltYm9scy5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMuc3ltbm87Ci0gICAgICBzeW1ib2xzLmNvZmZfc3ltbm8gKz0gMSArIHN5bWVudC5uX251bWF1eDsKLQotICAgICAgLyogV2Ugb25seSB3b3JyeSBhYm91dCB0aGUgZmlyc3QgYXV4ZW50LCBiZWNhdXNlIHRoYXQgaXMgdGhlCi0JIG9ubHkgb25lIHdoaWNoIGlzIHJlbGV2YW50IGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKHN5bWVudC5uX251bWF1eCA9PSAwKQotCXBhdXggPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9jb2ZmX2dldF9hdXhlbnQgKGFiZmQsIHN5bSwgMCwgJmF1eGVudCkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfYXV4ZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBwYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIGlmICh0aGlzX2NvZmZfc3ltbm8gPT0gbmV4dF9jX2ZpbGUgJiYgc3ltZW50Lm5fc2NsYXNzICE9IENfRklMRSkKLQl7Ci0JICAvKiBUaGUgbGFzdCBDX0ZJTEUgc3ltYm9sIHBvaW50cyB0byB0aGUgZmlyc3QgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCAiKmdsb2JhbHMqIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfRUZDTjoKLQljYXNlIENfRVhUREVGOgotCWNhc2UgQ19VTEFCRUw6Ci0JY2FzZSBDX1VTVEFUSUM6Ci0JY2FzZSBDX0xJTkU6Ci0JY2FzZSBDX0FMSUFTOgotCWNhc2UgQ19ISURERU46Ci0JICAvKiBKdXN0IGlnbm9yZSB0aGVzZSBjbGFzc2VzLiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJTEU6Ci0JICBuZXh0X2NfZmlsZSA9IHN5bWVudC5uX3ZhbHVlOwotCSAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfU1RBVDoKLQkgIC8qIElnbm9yZSBzdGF0aWMgc3ltYm9scyB3aXRoIGEgdHlwZSBvZiBUX05VTEwuICBUaGVzZQotICAgICAgICAgICAgIHJlcHJlc2VudCBzZWN0aW9uIGVudHJpZXMuICAqLwotCSAgaWYgKHN5bWVudC5uX3R5cGUgPT0gVF9OVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBDX0VYVDoKLQkgIGlmIChJU0ZDTiAoc3ltZW50Lm5fdHlwZSkpCi0JICAgIHsKLQkgICAgICBmbm5hbWUgPSBuYW1lOwotCSAgICAgIGZuY2xhc3MgPSBzeW1lbnQubl9zY2xhc3M7Ci0JICAgICAgZm50eXBlID0gc3ltZW50Lm5fdHlwZTsKLQkgICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkJZm5lbmQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSArIGF1eGVudC54X3N5bS54X21pc2MueF9mc2l6ZTsKLQkgICAgICBlbHNlCi0JCWZuZW5kID0gMDsKLQkgICAgICBsaW5lbm9zID0gQkZEX1NFTkQgKGFiZmQsIF9nZXRfbGluZW5vLCAoYWJmZCwgc3ltKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgIHN5bWVudC5uX3R5cGUsIHBhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoISBwYXJzZV9jb2ZmX3N5bWJvbCAoYWJmZCwgJnR5cGVzLCBzeW0sIHRoaXNfY29mZl9zeW1ubywgJnN5bWVudCwKLQkJCQkgICBkaGFuZGxlLCB0eXBlLCB3aXRoaW5fZnVuY3Rpb24pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQ19GQ046Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmJmIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChmbm5hbWUgPT0gTlVMTCkKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVsZDogLmJmIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iKSwKLQkJCSAgIHByb2dyYW1fbmFtZSwgdGhpc19jb2ZmX3N5bW5vKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgICAgICBERUNSRUYgKGZudHlwZSksIHBhdXgsIGZhbHNlLCBkaGFuZGxlKTsKLQkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoZGhhbmRsZSwgZm5uYW1lLCB0eXBlLAotCQkJCQkgICBmbmNsYXNzID09IENfRVhULAotCQkJCQkgICBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmIChsaW5lbm9zICE9IE5VTEwpCi0JCXsKLQkJICBpbnQgYmFzZTsKLQkJICBiZmRfdm1hIGFkZHI7Ci0KLQkJICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JCSAgICBiYXNlID0gMDsKLQkJICBlbHNlCi0JCSAgICBiYXNlID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vIC0gMTsKLQotCQkgIGFkZHIgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpOwotCi0JCSAgKytsaW5lbm9zOwotCi0JCSAgd2hpbGUgKGxpbmVub3MtPmxpbmVfbnVtYmVyICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9saW5lIChkaGFuZGxlLAotCQkJCQkgICAgICAgbGluZW5vcy0+bGluZV9udW1iZXIgKyBiYXNlLAotCQkJCQkgICAgICAgbGluZW5vcy0+dS5vZmZzZXQgKyBhZGRyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgKytsaW5lbm9zOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmbm5hbWUgPSBOVUxMOwotCSAgICAgIGxpbmVub3MgPSBOVUxMOwotCSAgICAgIGZuY2xhc3MgPSAwOwotCSAgICAgIGZudHlwZSA9IDA7Ci0KLQkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZWYiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgd2l0aGluX2Z1bmN0aW9uKQotCQl7Ci0JCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJWxkOiB1bmV4cGVjdGVkIC5lZlxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHRoaXNfY29mZl9zeW1ubyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBmbmVuZCkKLQkJZm5lbmQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGZuZW5kKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZm5lbmQgPSAwOwotCSAgICAgIHdpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ19CTE9DSzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuYmIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZWIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChkaGFuZGxlLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgJnN5bWJvbHMsICZ0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgc3ltZW50Lm5fdHlwZSwgcGF1eCwgdHJ1ZSwgZGhhbmRsZSk7Ci0JICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICghIHBhcnNlX2NvZmZfc3ltYm9sIChhYmZkLCAmdHlwZXMsIHN5bSwgdGhpc19jb2ZmX3N5bW5vLCAmc3ltZW50LAotCQkJCSAgIGRoYW5kbGUsIHR5cGUsIHdpdGhpbl9mdW5jdGlvbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZGRiZy5jIGIvYmludXRpbHMvcmRkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyOGMzNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qIHJkZGJnLmMgLS0gUmVhZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBhIGdlbmVyaWMgZm9ybS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHJlYWRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEgZ2VuZXJpYyBmb3JtLiAgVGhpcwotICAgZmlsZSBrbm93cyBob3cgdG8gZGlnIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIGFuIG9iamVjdAotICAgZmlsZS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLXN0YXRpYyBib29sZWFuIHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nLCBQVFIsIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gcmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgc2F2ZV9zdGFiIFBBUkFNUyAoKGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHN0YWJfY29udGV4dCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3NhdmVkX3N0YWJzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmVhZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIEJGRC4gIFJldHVybnMgYSBnZW5lcmljIGRlYnVnZ2luZwotICAgcG9pbnRlci4gICovCi0KLVBUUgotcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIFBUUiBkaGFuZGxlOwotICBib29sZWFuIGZvdW5kOwotCi0gIGRoYW5kbGUgPSBkZWJ1Z19pbml0ICgpOwotICBpZiAoZGhhbmRsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsCi0JCQkJCSAgICZmb3VuZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgewotICAgICAgaWYgKCEgcmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlLAotCQkJCQkgICAgICAmZm91bmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2llZWVfZmxhdm91cikKLSAgICB7Ci0gICAgICBpZiAoISByZWFkX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsICZmb3VuZCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFRyeSByZWFkaW5nIHRoZSBDT0ZGIHN5bWJvbHMgaWYgd2UgZGlkbid0IGZpbmQgYW55IHN0YWJzIGluIENPRkYKLSAgICAgc2VjdGlvbnMuICAqLwotICBpZiAoISBmb3VuZAotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgJiYgc3ltY291bnQgPiAwKQotICAgIHsKLSAgICAgIGlmICghIHBhcnNlX2NvZmYgKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlKSkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgZm91bmQpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gcmVjb2duaXplZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIpLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRoYW5kbGU7Ci19Ci0KLS8qIFJlYWQgc3RhYnMgaW4gc2VjdGlvbnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBzdGF0aWMgc3RydWN0Ci0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cnNlY25hbWU7Ci0gICAgfSBuYW1lc1tdID0geyB7ICIuc3RhYiIsICIuc3RhYnN0ciIgfSB9OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgUFRSIHNoYW5kbGU7Ci0KLSAgKnBmb3VuZCA9IGZhbHNlOwotICBzaGFuZGxlID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIG5hbWVzIC8gc2l6ZW9mIG5hbWVzWzBdOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYywgKnN0cnNlYzsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVzW2ldLnNlY25hbWUpOwotICAgICAgc3Ryc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVzW2ldLnN0cnNlY25hbWUpOwotICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIHN0cnNlYyAhPSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc3RhYnNpemUsIHN0cnNpemU7Ci0JICBiZmRfYnl0ZSAqc3RhYnMsICpzdHJpbmdzOwotCSAgYmZkX2J5dGUgKnN0YWI7Ci0JICBiZmRfc2l6ZV90eXBlIHN0cm9mZiwgbmV4dF9zdHJvZmY7Ci0KLQkgIHN0YWJzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKTsKLQkgIHN0YWJzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0YWJzaXplKTsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBzdGFicywgMCwgc3RhYnNpemUpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lc1tpXS5zZWNuYW1lLAotCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzdHJzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLQkgIHN0cmluZ3MgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc3Ryc2l6ZSk7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0cnNlYywgc3RyaW5ncywgMCwgc3Ryc2l6ZSkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWVzW2ldLnN0cnNlY25hbWUsCi0JCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzaGFuZGxlID0gc3RhcnRfc3RhYiAoZGhhbmRsZSwgYWJmZCwgdHJ1ZSwgc3ltcywgc3ltY291bnQpOwotCSAgICAgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAqcGZvdW5kID0gdHJ1ZTsKLQotCSAgc3Ryb2ZmID0gMDsKLQkgIG5leHRfc3Ryb2ZmID0gMDsKLQkgIGZvciAoc3RhYiA9IHN0YWJzOyBzdGFiIDwgc3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSAxMikKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgc3RyeDsKLQkgICAgICBpbnQgdHlwZTsKLQkgICAgICBpbnQgb3RoZXI7Ci0JICAgICAgaW50IGRlc2M7Ci0JICAgICAgYmZkX3ZtYSB2YWx1ZTsKLQotCSAgICAgIC8qIFRoaXMgY29kZSBwcmVzdW1lcyAzMiBiaXQgdmFsdWVzLiAgKi8KLQotCSAgICAgIHN0cnggPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiKTsKLQkgICAgICB0eXBlID0gYmZkX2dldF84IChhYmZkLCBzdGFiICsgNCk7Ci0JICAgICAgb3RoZXIgPSBiZmRfZ2V0XzggKGFiZmQsIHN0YWIgKyA1KTsKLQkgICAgICBkZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3RhYiArIDYpOwotCSAgICAgIHZhbHVlID0gYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIDgpOwotCi0JICAgICAgaWYgKHR5cGUgPT0gMCkKLQkJewotCQkgIC8qIFNwZWNpYWwgdHlwZSAwIHN0YWJzIGluZGljYXRlIHRoZSBvZmZzZXQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBuZXh0IHN0cmluZyB0YWJsZS4gICovCi0JCSAgc3Ryb2ZmID0gbmV4dF9zdHJvZmY7Ci0JCSAgbmV4dF9zdHJvZmYgKz0gdmFsdWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICpmLCAqczsKLQotCQkgIGYgPSBOVUxMOwotCQkgIHMgPSAoY2hhciAqKSBzdHJpbmdzICsgc3Ryb2ZmICsgc3RyeDsKLQkJICB3aGlsZSAoc1tzdHJsZW4gKHMpIC0gMV0gPT0gJ1xcJwotCQkJICYmIHN0YWIgKyAxMiA8IHN0YWJzICsgc3RhYnNpemUpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKnA7Ci0KLQkJICAgICAgc3RhYiArPSAxMjsKLQkJICAgICAgcCA9IHMgKyBzdHJsZW4gKHMpIC0gMTsKLQkJICAgICAgKnAgPSAnXDAnOwotCQkgICAgICBzID0gY29uY2F0IChzLAotCQkJCSAgKChjaGFyICopIHN0cmluZ3MKLQkJCQkgICArIHN0cm9mZgotCQkJCSAgICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYikpLAotCQkJCSAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLQkJICAgICAgLyogV2UgaGF2ZSB0byByZXN0b3JlIHRoZSBiYWNrc2xhc2gsIGJlY2F1c2UsIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBpcyBoYXNoaW5nIHN0YWJzIHN0cmluZ3MsIHdlIG1heQotICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGUgc2FtZSBzdHJpbmcgbW9yZSB0aGFuIG9uY2UuICAqLwotCQkgICAgICAqcCA9ICdcXCc7Ci0KLQkJICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJCWZyZWUgKGYpOwotCQkgICAgICBmID0gczsKLQkJICAgIH0KLQotCQkgIHNhdmVfc3RhYiAodHlwZSwgZGVzYywgdmFsdWUsIHMpOwotCi0JCSAgaWYgKCEgcGFyc2Vfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSwgdHlwZSwgZGVzYywgdmFsdWUsIHMpKQotCQkgICAgewotCQkgICAgICBzdGFiX2NvbnRleHQgKCk7Ci0JCSAgICAgIGZyZWVfc2F2ZWRfc3RhYnMgKCk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIERvbid0IGZyZWUgZiwgc2luY2UgSSB0aGluayB0aGUgc3RhYnMgY29kZQotICAgICAgICAgICAgICAgICAgICAgZXhwZWN0cyBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgIHN0cmFpZ2h0ZW5lZCBvdXQuICBGSVhNRS4gICovCi0JCX0KLQkgICAgfQotCi0JICBmcmVlX3NhdmVkX3N0YWJzICgpOwotCSAgZnJlZSAoc3RhYnMpOwotCi0JICAvKiBEb24ndCBmcmVlIHN0cmluZ3MsIHNpbmNlIEkgdGhpbmsgdGhlIHN0YWJzIGNvZGUgZXhwZWN0cwotICAgICAgICAgICAgIHRoZSBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUgc3RyYWlnaHRlbmVkCi0gICAgICAgICAgICAgb3V0LiAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgaWYgKHNoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBmaW5pc2hfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBzdGFicyBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBQVFIgc2hhbmRsZTsKLSAgYXN5bWJvbCAqKnBzLCAqKnN5bWVuZDsKLQotICBzaGFuZGxlID0gTlVMTDsKLSAgc3ltZW5kID0gc3ltcyArIHN5bWNvdW50OwotICBmb3IgKHBzID0gc3ltczsgcHMgPCBzeW1lbmQ7IHBzKyspCi0gICAgewotICAgICAgc3ltYm9sX2luZm8gaTsKLQotICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgKnBzLCAmaSk7Ci0KLSAgICAgIGlmIChpLnR5cGUgPT0gJy0nKQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0JICBjaGFyICpmOwotCi0JICBpZiAoc2hhbmRsZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2hhbmRsZSA9IHN0YXJ0X3N0YWIgKGRoYW5kbGUsIGFiZmQsIGZhbHNlLCBzeW1zLCBzeW1jb3VudCk7Ci0JICAgICAgaWYgKHNoYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgICpwZm91bmQgPSB0cnVlOwotCi0JICBzID0gaS5uYW1lOwotCSAgZiA9IE5VTEw7Ci0JICB3aGlsZSAoc1tzdHJsZW4gKHMpIC0gMV0gPT0gJ1xcJwotCQkgJiYgcHMgKyAxIDwgc3ltZW5kKQotCSAgICB7Ci0JICAgICAgY2hhciAqc2MsICpuOwotCi0JICAgICAgKytwczsKLQkgICAgICBzYyA9IHhzdHJkdXAgKHMpOwotCSAgICAgIHNjW3N0cmxlbiAoc2MpIC0gMV0gPSAnXDAnOwotCSAgICAgIG4gPSBjb25jYXQgKHNjLCBiZmRfYXN5bWJvbF9uYW1lICgqcHMpLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgICAgICBmcmVlIChzYyk7Ci0JICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJZnJlZSAoZik7Ci0JICAgICAgZiA9IG47Ci0JICAgICAgcyA9IG47Ci0JICAgIH0KLQotCSAgc2F2ZV9zdGFiIChpLnN0YWJfdHlwZSwgaS5zdGFiX2Rlc2MsIGkudmFsdWUsIHMpOwotCi0JICBpZiAoISBwYXJzZV9zdGFiIChkaGFuZGxlLCBzaGFuZGxlLCBpLnN0YWJfdHlwZSwgaS5zdGFiX2Rlc2MsCi0JCQkgICAgaS52YWx1ZSwgcykpCi0JICAgIHsKLQkgICAgICBzdGFiX2NvbnRleHQgKCk7Ci0JICAgICAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgZnJlZSBmLCBzaW5jZSBJIHRoaW5rIHRoZSBzdGFicyBjb2RlIGV4cGVjdHMKLQkgICAgIHN0cmluZ3MgdG8gaGFuZyBhcm91bmQuICBUaGlzIHNob3VsZCBiZSBzdHJhaWdodGVuZWQgb3V0LgotCSAgICAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQotICBpZiAoc2hhbmRsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGZpbmlzaF9zdGFiIChkaGFuZGxlLCBzaGFuZGxlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBib29sZWFuICpwZm91bmQ7Ci17Ci0gIGFzZWN0aW9uICpkc2VjOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLQotICAvKiBUaGUgQkZEIGJhY2tlbmQgcHV0cyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYSBzZWN0aW9uCi0gICAgIG5hbWVkIC5kZWJ1Zy4gICovCi0KLSAgZHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0gIGlmIChkc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRzZWMpOwotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzaXplKTsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBkc2VjLCBjb250ZW50cywgMCwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHBhcnNlX2llZWUgKGRoYW5kbGUsIGFiZmQsIGNvbnRlbnRzLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoY29udGVudHMpOwotCi0gICpwZm91bmQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVjb3JkIHN0YWJzIHN0cmluZ3MsIHNvIHRoYXQgd2UgY2FuIGdpdmUgc29tZSBjb250ZXh0IGZvciBlcnJvcnMuICAqLwotCi0jZGVmaW5lIFNBVkVfU1RBQlNfQ09VTlQgKDE2KQotCi1zdHJ1Y3Qgc2F2ZWRfc3RhYgotewotICBpbnQgdHlwZTsKLSAgaW50IGRlc2M7Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGNoYXIgKnN0cmluZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2F2ZWRfc3RhYiBzYXZlZF9zdGFic1tTQVZFX1NUQUJTX0NPVU5UXTsKLXN0YXRpYyBpbnQgc2F2ZWRfc3RhYnNfaW5kZXg7Ci0KLS8qIFNhdmUgYSBzdGFicyBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotc2F2ZV9zdGFiICh0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGRlc2M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS5zdHJpbmcgIT0gTlVMTCkKLSAgICBmcmVlIChzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nKTsKLSAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnR5cGUgPSB0eXBlOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uZGVzYyA9IGRlc2M7Ci0gIHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS52YWx1ZSA9IHZhbHVlOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLSAgc2F2ZWRfc3RhYnNfaW5kZXggPSAoc2F2ZWRfc3RhYnNfaW5kZXggKyAxKSAlIFNBVkVfU1RBQlNfQ09VTlQ7Ci19Ci0KLS8qIFByb3ZpZGUgY29udGV4dCBmb3IgYW4gZXJyb3IuICAqLwotCi1zdGF0aWMgdm9pZAotc3RhYl9jb250ZXh0ICgpCi17Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiTGFzdCBzdGFicyBlbnRyaWVzIGJlZm9yZSBlcnJvcjpcbiIpKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAibl90eXBlIG5fZGVzYyBuX3ZhbHVlICBzdHJpbmdcbiIpOwotCi0gIGkgPSBzYXZlZF9zdGFic19pbmRleDsKLSAgZG8KLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2F2ZWRfc3RhYiAqc3RhYnA7Ci0KLSAgICAgIHN0YWJwID0gc2F2ZWRfc3RhYnMgKyBpOwotICAgICAgaWYgKHN0YWJwLT5zdHJpbmcgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCi0JICBzID0gYmZkX2dldF9zdGFiX25hbWUgKHN0YWJwLT50eXBlKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIiUtNnMiLCBzKTsKLQkgIGVsc2UgaWYgKHN0YWJwLT50eXBlID09IDApCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIkhkclN5bSIpOwotCSAgZWxzZQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIlLTZkIiwgc3RhYnAtPnR5cGUpOwotCSAgZnByaW50ZiAoc3RkZXJyLCAiICUtNmQgIiwgc3RhYnAtPmRlc2MpOwotCSAgZnByaW50Zl92bWEgKHN0ZGVyciwgc3RhYnAtPnZhbHVlKTsKLQkgIGlmIChzdGFicC0+dHlwZSAhPSAwKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBzdGFicC0+c3RyaW5nKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0JfQotICAgICAgaSA9IChpICsgMSkgJSBTQVZFX1NUQUJTX0NPVU5UOwotICAgIH0KLSAgd2hpbGUgKGkgIT0gc2F2ZWRfc3RhYnNfaW5kZXgpOwotfQotCi0vKiBGcmVlIHRoZSBzYXZlZCBzdGFiIHN0cmluZ3MuICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV9zYXZlZF9zdGFicyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0FWRV9TVEFCU19DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzYXZlZF9zdGFic1tpXS5zdHJpbmcgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChzYXZlZF9zdGFic1tpXS5zdHJpbmcpOwotCSAgc2F2ZWRfc3RhYnNbaV0uc3RyaW5nID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHNhdmVkX3N0YWJzX2luZGV4ID0gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JlYWRlbGYuYyBiL2JpbnV0aWxzL3JlYWRlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5ODI0ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZWFkZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDE1ICswLDAgQEAKLS8qIHJlYWRlbGYuYyAtLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFuIEVMRiBmb3JtYXQgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBPcmlnaW5hbGx5IGRldmVsb3BlZCBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0gICBNb2RpZmljYXRpb25zIGJ5IE5pY2sgQ2xpZnRvbiA8bmlja2NAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qIERlZmluZSBCRkQ2NCBoZXJlLCBldmVuIGlmIG91ciBkZWZhdWx0IGFyY2hpdGVjdHVyZSBpcyAzMiBiaXQgRUxGCi0gICBhcyB0aGlzIHdpbGwgYWxsb3cgdXMgdG8gcmVhZCBpbiBhbmQgcGFyc2UgNjRiaXQgYW5kIDMyYml0IEVMRiBmaWxlcy4gICovCi0jZGVmaW5lIEJGRDY0Ci0jaW5jbHVkZSAiYmZkLmgiCi0KLSNpbmNsdWRlICJlbGYvY29tbW9uLmgiCi0jaW5jbHVkZSAiZWxmL2V4dGVybmFsLmgiCi0jaW5jbHVkZSAiZWxmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgotCi0vKiBUaGUgZm9sbG93aW5nIGhlYWRlcnMgdXNlIHRoZSBlbGYvcmVsb2MtbWFjcm9zLmggZmlsZSB0bwotICAgYXV0b21hdGljYWxseSBnZW5lcmF0ZSByZWxvY2F0aW9uIHJlY29nbml0aW9uIGZ1bmN0aW9ucwotICAgc3VjaCBhcyBlbGZfbWlwc19yZWxvY190eXBlKCkgICovCi0KLSNkZWZpbmUgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi0KLSNpbmNsdWRlICJlbGYvaTM4Ni5oIgotI2luY2x1ZGUgImVsZi92ODUwLmgiCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0jaW5jbHVkZSAiZWxmL3NwYXJjLmgiCi0jaW5jbHVkZSAiZWxmL20zMnIuaCIKLSNpbmNsdWRlICJlbGYvZDEwdi5oIgotI2luY2x1ZGUgImVsZi9kMzB2LmgiCi0jaW5jbHVkZSAiZWxmL3NoLmgiCi0jaW5jbHVkZSAiZWxmL21uMTAyMDAuaCIKLSNpbmNsdWRlICJlbGYvbW4xMDMwMC5oIgotI2luY2x1ZGUgImVsZi9ocHBhLmgiCi0jaW5jbHVkZSAiZWxmL2FyYy5oIgotI2luY2x1ZGUgImVsZi9mcjMwLmgiCi0jaW5jbHVkZSAiZWxmL21jb3JlLmgiCi0jaW5jbHVkZSAiZWxmL2k5NjAuaCIKLQotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi1jaGFyICogICAgICAgICAgCXByb2dyYW1fbmFtZSA9ICJyZWFkZWxmIjsKLXVuc2lnbmVkIGludCAgICAJZHluYW1pY19hZGRyOwotYmZkX3NpemVfdHlwZSAgCQlkeW5hbWljX3NpemU7Ci11bnNpZ25lZCBpbnQgICAgCXJlbGFfYWRkcjsKLXVuc2lnbmVkIGludCAgICAJcmVsYV9zaXplOwotY2hhciAqICAgICAgICAgIAlkeW5hbWljX3N0cmluZ3M7Ci1jaGFyICoJCQlzdHJpbmdfdGFibGU7Ci11bnNpZ25lZCBsb25nICAgICAgICAgICBudW1fZHluYW1pY19zeW1zOwotRWxmX0ludGVybmFsX1N5bSAqIAlkeW5hbWljX3N5bWJvbHM7Ci1FbGZfSW50ZXJuYWxfU3ltaW5mbyAqCWR5bmFtaWNfc3ltaW5mbzsKLXVuc2lnbmVkIGxvbmcgICAJZHluYW1pY19zeW1pbmZvX29mZnNldDsKLXVuc2lnbmVkIGludAkJZHluYW1pY19zeW1pbmZvX25lbnQ7Ci1jaGFyICAgICAgICAgICAgCXByb2dyYW1faW50ZXJwcmV0ZXIgWzY0XTsKLWludCAgICAgICAgICAgICAJZHluYW1pY19pbmZvW0RUX0pNUFJFTCArIDFdOwotaW50ICAgICAgICAgICAgIAl2ZXJzaW9uX2luZm9bMTZdOwotaW50ICAgICAgICAgICAgIAlsb2FkYWRkciA9IDA7Ci1FbGZfSW50ZXJuYWxfRWhkciAgICAgICBlbGZfaGVhZGVyOwotRWxmX0ludGVybmFsX1NoZHIgKiAgICAgc2VjdGlvbl9oZWFkZXJzOwotRWxmX0ludGVybmFsX0R5biAqICAgICAgZHluYW1pY19zZWdtZW50OwotaW50IAkJCXNob3dfbmFtZTsKLWludCAJCQlkb19keW5hbWljOwotaW50IAkJCWRvX3N5bXM7Ci1pbnQgCQkJZG9fcmVsb2M7Ci1pbnQgCQkJZG9fc2VjdGlvbnM7Ci1pbnQgCQkJZG9fc2VnbWVudHM7Ci1pbnQgCQkJZG9fdXNpbmdfZHluYW1pYzsKLWludCAJCQlkb19oZWFkZXI7Ci1pbnQgCQkJZG9fZHVtcDsKLWludCAJCQlkb192ZXJzaW9uOwotaW50CQkJZG9faGlzdG9ncmFtOwotaW50CQkJZG9fZGVidWdnaW5nOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfaW5mbzsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX2FiYnJldnM7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19saW5lczsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX3B1Ym5hbWVzOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfYXJhbmdlczsKLWludAkJCWlzXzMyYml0X2VsZjsKLQotLyogQSBkeW5hbWljIGFycmF5IG9mIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggc2VjdGlvbnMgcmVxdWlyZSBkdW1waW5nLiAgKi8KLWNoYXIgKgkJCWR1bXBfc2VjdHMgPSBOVUxMOwotdW5zaWduZWQgaW50CQludW1fZHVtcF9zZWN0cyA9IDA7Ci0KLSNkZWZpbmUgSEVYX0RVTVAJKDEgPDwgMCkKLSNkZWZpbmUgRElTQVNTX0RVTVAJKDEgPDwgMSkKLSNkZWZpbmUgREVCVUdfRFVNUAkoMSA8PCAyKQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZHVtYiBjb21waWxlcnMuICAqLwotc3RhdGljIGJmZF92bWEgKCogICAgICAgICBieXRlX2dldCkgICAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hICAgICAgICAgICAgYnl0ZV9nZXRfbGl0dGxlX2VuZGlhbiAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSAgICAgICAgICAgIGJ5dGVfZ2V0X2JpZ19lbmRpYW4gICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfbWlwc19keW5hbWljX3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZHluYW1pY190eXBlICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkdW1wX3JlbG9jYXRpb25zICAgICAgICAgICAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBFbGZfSW50ZXJuYWxfU3ltICosIHVuc2lnbmVkIGxvbmcsIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9maWxlX3R5cGUgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfbWFjaGluZV9uYW1lICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X21hY2hpbmVfZmxhZ3MgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkLCB1bnNpZ25lZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfbWlwc19zZWdtZW50X3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfc2VnbWVudF90eXBlICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfbWlwc19zZWN0aW9uX3R5cGVfbmFtZSAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zZWN0aW9uX3R5cGVfbmFtZSAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3N5bWJvbF9iaW5kaW5nICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfc3ltYm9sX3R5cGUgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHBhcnNlX2FyZ3MgICAgICAgICAgICAgICAgICBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19maWxlX2hlYWRlciAgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3NlY3Rpb25faGVhZGVycyAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGR5bmFtaWNfc2VnbWVudF9taXBzX3ZhbCAgICBQQVJBTVMgKChFbGZfSW50ZXJuYWxfRHluICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3N5bWJvbF90YWJsZSAgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgcHJvY2Vzc19maWxlICAgICAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3JlbG9jcyAgICAgICAgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfdmVyc2lvbl9zZWN0aW9ucyAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3Zlcl9mbGFncyAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfc3ltYm9sX2luZGV4X3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF8zMmJpdF9zZWN0aW9uX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0XzY0Yml0X3NlY3Rpb25faGVhZGVycyAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludAkJICBnZXRfMzJiaXRfcHJvZ3JhbV9oZWFkZXJzICAgUEFSQU1TICgoRklMRSAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7Ci1zdGF0aWMgaW50CQkgIGdldF82NGJpdF9wcm9ncmFtX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0X2ZpbGVfaGVhZGVyICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIEVsZl9JbnRlcm5hbF9TeW0gKiBnZXRfMzJiaXRfZWxmX3N5bWJvbHMgICAgICAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqIGdldF82NGJpdF9lbGZfc3ltYm9scyAgICAgICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgKiAgICAgICAgICAgICAgZ2V0X2R5bmFtaWNfZGF0YSAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF8zMmJpdF9keW5hbWljX3NlZ21lbnQgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAgIFBBUkFNUyAoKEZJTEUgKikpOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLXN0YXRpYyBpbnQgCSAgICAgICAgICBkaXNhc3NlbWJsZV9zZWN0aW9uICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBGSUxFICopKTsKLSNlbmRpZgotc3RhdGljIGludCAJICAgICAgICAgIGR1bXBfc2VjdGlvbiAgICAgICAgICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotc3RhdGljIGludCAJICAgICAgICAgIGRpc3BsYXlfZGVidWdfc2VjdGlvbiAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2luZm8gICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2xpbmVzICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2FiYnJldiAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2FyYW5nZXMgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiAgICBwcm9jZXNzX2FiYnJldl9zZWN0aW9uICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICAgICAgcmVhZF9sZWIxMjggICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50ICosIGludCkpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3AgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgcmVzZXRfc3RhdGVfbWFjaGluZSAgICAgICAgIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfVEFHX25hbWUgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfQVRfbmFtZSAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfRk9STV9uYW1lICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBmcmVlX2FiYnJldnMgICAgICAgICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBhZGRfYWJicmV2ICAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGFkZF9hYmJyZXZfYXR0ciAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqICAgIHJlYWRfYW5kX2Rpc3BsYXlfYXR0ciAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogICAgZGlzcGxheV9ibG9jayAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBkZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbiAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkCQkgIHJlcXVlc3RfZHVtcCAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X2VsZl9jbGFzcyAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X2RhdGFfZW5jb2RpbmcgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X29zYWJpX25hbWUgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBpbnQJCSAgZ3Vlc3NfaXNfcmVsYSAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLQotdHlwZWRlZiBpbnQgRWxmMzJfV29yZDsKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgMAotI2VuZGlmCi0jZGVmaW5lIFVOS05PV04gLTEKLQotI2RlZmluZSBTRUNUSU9OX05BTUUoWCkgCShzdHJpbmdfdGFibGUgKyAoWCktPnNoX25hbWUpCi0KLSNkZWZpbmUgRFRfVkVSU0lPTlRBR0lEWCh0YWcpCShEVF9WRVJORUVETlVNIC0gKHRhZykpCS8qIFJldmVyc2Ugb3JkZXIhICovCi0KLSNkZWZpbmUgQllURV9HRVQoZmllbGQpIAlieXRlX2dldCAoZmllbGQsIHNpemVvZiAoZmllbGQpKQotI2RlZmluZSBCWVRFX0dFVDgoZmllbGQpIAlieXRlX2dldCAoZmllbGQsIC04KQotCi0jZGVmaW5lIE5VTV9FTEVNKGFycmF5KSAJKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mICgoYXJyYXkpWzBdKSkKLQotI2RlZmluZSBHRVRfREFUQV9BTExPQyhvZmZzZXQsIHNpemUsIHZhciwgdHlwZSwgcmVhc29uKQkJCVwKLSAgaWYgKGZzZWVrIChmaWxlLCBvZmZzZXQsIFNFRUtfU0VUKSkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIHN0YXJ0IG9mICVzIGF0ICV4XG4iKSwgcmVhc29uLCBvZmZzZXQpOyBcCi0gICAgICByZXR1cm4gMDsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotICB2YXIgPSAodHlwZSkgbWFsbG9jIChzaXplKTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gIGlmICh2YXIgPT0gTlVMTCkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nICVkIGJ5dGVzIGZvciAlc1xuIiksIHNpemUsIHJlYXNvbik7IFwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0gCQkJCQkJCQkJXAotIAkJCQkJCQkJCVwKLSAgaWYgKGZyZWFkICh2YXIsIHNpemUsIDEsIGZpbGUpICE9IDEpIAkJCQkJXAotICAgIHsgCQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGluICVkIGJ5dGVzIG9mICVzXG4iKSwgc2l6ZSwgcmVhc29uKTsgCVwKLSAgICAgIGZyZWUgKHZhcik7IAkJCQkJCQlcCi0gICAgICB2YXIgPSBOVUxMOwkJCQkJCQlcCi0gICAgICByZXR1cm4gMDsgCQkJCQkJCVwKLSAgICB9Ci0KLQotI2RlZmluZSBHRVRfREFUQShvZmZzZXQsIHZhciwgcmVhc29uKSAJCQkJCVwKLSAgaWYgKGZzZWVrIChmaWxlLCBvZmZzZXQsIFNFRUtfU0VUKSkJCQkJCVwKLSAgICB7IAkJCQkJCQkJCVwKLSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gc2VlayB0byAleCBmb3IgJXNcbiIpLCBvZmZzZXQsIHJlYXNvbik7CVwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIGVsc2UgaWYgKGZyZWFkICgmIHZhciwgc2l6ZW9mICh2YXIpLCAxLCBmaWxlKSAhPSAxKQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGRhdGEgYXQgJXggZm9yICVzXG4iKSwgb2Zmc2V0LCByZWFzb24pOwlcCi0gICAgICByZXR1cm4gMDsJCQkJCQkJCVwKLSAgICB9Ci0KLSNkZWZpbmUgR0VUX0VMRl9TWU1CT0xTKGZpbGUsIG9mZnNldCwgc2l6ZSkJCQlcCi0gIChpc18zMmJpdF9lbGYgPyBnZXRfMzJiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgc2l6ZSkJXAotICAgOiBnZXRfNjRiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgc2l6ZSkpCi0KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RhdGljIHZvaWQKLWVycm9yIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogRXJyb3I6ICIpLCBwcm9ncmFtX25hbWUpOwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi13YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogV2FybmluZzogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZAotZXJyb3IgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqIG1lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBFcnJvcjogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgbWVzc2FnZSA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXdhcm4gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqIG1lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBXYXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBtZXNzYWdlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfdm1hCi1ieXRlX2dldF9saXR0bGVfZW5kaWFuIChmaWVsZCwgc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqIGZpZWxkOwotICAgICBpbnQgICAgICAgICAgICAgc2l6ZTsKLXsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gKiBmaWVsZDsKLQotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiAgKCh1bnNpZ25lZCBpbnQpIChmaWVsZCBbMF0pKQotCXwgICAgKCgodW5zaWduZWQgaW50KSAoZmllbGQgWzFdKSkgPDwgOCk7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICAvKiBXZSB3YW50IHRvIGV4dHJhY3QgZGF0YSBmcm9tIGFuIDggYnl0ZSB3aWRlIGZpZWxkIGFuZAotCSBwbGFjZSBpdCBpbnRvIGEgNCBieXRlIHdpZGUgZmllbGQuICBTaW5jZSB0aGlzIGlzIGEgbGl0dGxlCi0JIGVuZGlhbiBzb3VyY2Ugd2UgY2FuIGp1dHMgdXNlIHRoZSA0IGJ5dGUgZXh0cmFjdGlvbiBjb2RlLiAgKi8KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICAoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMF0pKQotCXwgICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsxXSkpIDw8IDgpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzJdKSkgPDwgMTYpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzNdKSkgPDwgMjQpOwotCi0gICAgY2FzZSAtODoKLSAgICAgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UsIGdlbmVyYXRlZCBieSB0aGUgQllURV9HRVQ4IG1hY3JvLgotCSBJdCBtZWFucyB0aGF0IHdlIGFyZSBsb2FkaW5nIGFuIDggYnl0ZSB2YWx1ZSBmcm9tIGEgZmllbGQKLQkgaW4gYW4gZXh0ZXJuYWwgc3RydWN0dXJlIGludG8gYW4gOCBieXRlIHZhbHVlIGluIGEgZmllbGQKLQkgaW4gYW4gaW50ZXJuYWwgc3RyY3V0dXJlLiAgKi8KLSAgICAgIHJldHVybiAgKChiZmRfdm1hKSAoZmllbGQgWzBdKSkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbMV0pKSA8PCA4KQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFsyXSkpIDw8IDE2KQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFszXSkpIDw8IDI0KQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs0XSkpIDw8IDMyKQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs1XSkpIDw8IDQwKQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs2XSkpIDw8IDQ4KQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs3XSkpIDw8IDU2KTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciAoXygiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIiksIHNpemUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgYmZkX3ZtYQotYnl0ZV9nZXRfYmlnX2VuZGlhbiAoZmllbGQsIHNpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBmaWVsZDsKLSAgICAgaW50ICAgICAgICAgICAgIHNpemU7Ci17Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuICogZmllbGQ7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gKCh1bnNpZ25lZCBpbnQpIChmaWVsZCBbMV0pKSB8ICgoKGludCkgKGZpZWxkIFswXSkpIDw8IDgpOwotCi0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICgodW5zaWduZWQgbG9uZykgKGZpZWxkIFszXSkpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMl0pKSA8PCA4KQotCXwgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzFdKSkgPDwgMTYpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMF0pKSA8PCAyNCk7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICAvKiBBbHRob3VnaCB3ZSBhcmUgZXh0cmFjaW5nIGRhdGEgZnJvbSBhbiA4IGJ5dGUgd2lkZSBmaWVsZCwgd2UKLQkgYXJlIHJldHVybmluZyBvbmx5IDQgYnl0ZXMgb2YgZGF0YS4gICovCi0gICAgICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzddKSkKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFs2XSkpIDw8IDgpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbNV0pKSA8PCAxNikKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFs0XSkpIDw8IDI0KTsKLQotICAgIGNhc2UgLTg6Ci0gICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBnZW5lcmF0ZWQgYnkgdGhlIEJZVEVfR0VUOCBtYWNyby4KLQkgSXQgbWVhbnMgdGhhdCB3ZSBhcmUgbG9hZGluZyBhbiA4IGJ5dGUgdmFsdWUgZnJvbSBhIGZpZWxkCi0JIGluIGFuIGV4dGVybmFsIHN0cnVjdHVyZSBpbnRvIGFuIDggYnl0ZSB2YWx1ZSBpbiBhIGZpZWxkCi0JIGluIGFuIGludGVybmFsIHN0cmN1dHVyZS4gICovCi0gICAgICByZXR1cm4gKChiZmRfdm1hKSAoZmllbGQgWzddKSkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs2XSkpIDw8IDgpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbNV0pKSA8PCAxNikKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs0XSkpIDw8IDI0KQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzNdKSkgPDwgMzIpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbMl0pKSA8PCA0MCkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFsxXSkpIDw8IDQ4KQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzBdKSkgPDwgNTYpOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yIChfKCJVbmhhbmRsZWQgZGF0YSBsZW5ndGg6ICVkXG4iKSwgc2l6ZSk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLQotLyogR3Vlc3MgdGhlIHJlbG9jYXRpb24gc2l6ZWQgYmFzZWQgb24gdGhlIHNpemVkIGNvbW1vbmx5IHVzZWQgYnkgdGhlIHNwZWNpZmljIG1hY2hpbmUuICAqLwotc3RhdGljIGludAotZ3Vlc3NfaXNfcmVsYSAoZV9tYWNoaW5lKQotICAgICB1bnNpZ25lZCBsb25nIGVfbWFjaGluZTsKLXsKLSAgc3dpdGNoIChlX21hY2hpbmUpCi0gICAgewotICAgICAgLyogVGFyZ2V0cyB0aGF0IHVzZSBSRUwgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgRU1fQVJNOgotICAgIGNhc2UgRU1fMzg2OgotICAgIGNhc2UgRU1fNDg2OgotICAgIGNhc2UgRU1fOTYwOgotICAgIGNhc2UgRU1fQ1lHTlVTX00zMlI6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRDEwVjoKLSAgICBjYXNlIEVNX01JUFM6Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIAotICAgICAgLyogVGFyZ2V0cyB0aGF0IHVzZSBSRUxBIHJlbG9jYXRpb25zLiAgKi8KLSAgICBjYXNlIEVNXzY4SzoKLSAgICBjYXNlIEVNX1NQQVJDOgotICAgIGNhc2UgRU1fUFBDOgotICAgIGNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRDMwVjoKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMjAwOgotICAgIGNhc2UgRU1fQ1lHTlVTX01OMTAzMDA6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRlIzMDoKLSAgICBjYXNlIEVNX1NIOgotICAgIGNhc2UgRU1fQUxQSEE6Ci0gICAgY2FzZSBFTV9NQ09SRToKLSAgICAgIHJldHVybiBUUlVFOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHdhcm4gKF8oIkRvbid0IGtub3cgYWJvdXQgcmVsb2NhdGlvbnMgb24gdGhpcyBtYWNoaW5lIGFyY2hpdGVjdHVyZVxuIikpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRpb24gZGF0YSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gICovCi1zdGF0aWMgaW50Ci1kdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0LCByZWxfc2l6ZSwgc3ltdGFiLCBuc3ltcywgc3RydGFiLCBpc19yZWxhKQotICAgICBGSUxFICogICAgICAgICAgICAgZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgIHJlbF9vZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgICByZWxfc2l6ZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIHN5bXRhYjsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgIG5zeW1zOwotICAgICBjaGFyICogICAgICAgICAgICAgc3RydGFiOwotICAgICBpbnQgICAgICAgICAgICAgICAgaXNfcmVsYTsKLXsKLSAgdW5zaWduZWQgaW50ICAgICAgICBpOwotICBFbGZfSW50ZXJuYWxfUmVsICogIHJlbHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogcmVsYXM7Ci0KLSAgCi0gIGlmIChpc19yZWxhID09IFVOS05PV04pCi0gICAgaXNfcmVsYSA9IGd1ZXNzX2lzX3JlbGEgKGVsZl9oZWFkZXIuZV9tYWNoaW5lKTsKLQotICBpZiAoaXNfcmVsYSkKLSAgICB7Ci0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIEVsZjMyX0V4dGVybmFsX1JlbGEgKiBlcmVsYXM7Ci0JICAKLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbGFzLAotCQkJICBFbGYzMl9FeHRlcm5hbF9SZWxhICosICJyZWxvY3MiKTsKLQkgIAotCSAgcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JICAKLQkgIHJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopCi0JICAgIG1hbGxvYyAocmVsX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7Ci0gICAgICAKLQkgIGlmIChyZWxhcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IoXygib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgCi0JICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgICAgewotCSAgICAgIHJlbGFzW2ldLnJfb2Zmc2V0ID0gQllURV9HRVQgKGVyZWxhc1tpXS5yX29mZnNldCk7Ci0JICAgICAgcmVsYXNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfaW5mbyk7Ci0JICAgICAgcmVsYXNbaV0ucl9hZGRlbmQgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfYWRkZW5kKTsKLQkgICAgfQotICAgICAgCi0JICBmcmVlIChlcmVsYXMpOwotICAgICAgCi0JICByZWxzID0gKEVsZl9JbnRlcm5hbF9SZWwgKikgcmVsYXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEVsZjY0X0V4dGVybmFsX1JlbGEgKiBlcmVsYXM7Ci0JICAKLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbGFzLAotCQkJICBFbGY2NF9FeHRlcm5hbF9SZWxhICosICJyZWxvY3MiKTsKLQkgIAotCSAgcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAKLQkgIHJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopCi0JICAgIG1hbGxvYyAocmVsX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7Ci0gICAgICAKLQkgIGlmIChyZWxhcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IoXygib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgCi0JICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgICAgewotCSAgICAgIHJlbGFzW2ldLnJfb2Zmc2V0ID0gQllURV9HRVQ4IChlcmVsYXNbaV0ucl9vZmZzZXQpOwotCSAgICAgIHJlbGFzW2ldLnJfaW5mbyAgID0gQllURV9HRVQ4IChlcmVsYXNbaV0ucl9pbmZvKTsKLQkgICAgICByZWxhc1tpXS5yX2FkZGVuZCA9IEJZVEVfR0VUOCAoZXJlbGFzW2ldLnJfYWRkZW5kKTsKLQkgICAgfQotICAgICAgCi0JICBmcmVlIChlcmVsYXMpOwotICAgICAgCi0JICByZWxzID0gKEVsZl9JbnRlcm5hbF9SZWwgKikgcmVsYXM7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc18zMmJpdF9lbGYpCi0JewotCSAgRWxmMzJfRXh0ZXJuYWxfUmVsICogZXJlbHM7Ci0KLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbHMsCi0JCQkgIEVsZjMyX0V4dGVybmFsX1JlbCAqLCAicmVsb2NzIik7Ci0JICAKLQkgIHJlbF9zaXplID0gcmVsX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAKLQkgIHJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKQotCSAgICBtYWxsb2MgKHJlbF9zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsKSk7Ci0JICAKLQkgIGlmIChyZWxzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAKLQkgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgcmVsc1tpXS5yX29mZnNldCA9IEJZVEVfR0VUIChlcmVsc1tpXS5yX29mZnNldCk7Ci0JICAgICAgcmVsc1tpXS5yX2luZm8gICA9IEJZVEVfR0VUIChlcmVsc1tpXS5yX2luZm8pOwotCSAgICB9Ci0JICAKLQkgIGZyZWUgKGVyZWxzKTsKLQkgIAotCSAgcmVsYXMgPSAoRWxmX0ludGVybmFsX1JlbGEgKikgcmVsczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfRXh0ZXJuYWxfUmVsICogZXJlbHM7Ci0KLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbHMsCi0JCQkgIEVsZjY0X0V4dGVybmFsX1JlbCAqLCAicmVsb2NzIik7Ci0JICAKLQkgIHJlbF9zaXplID0gcmVsX3NpemUgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbCk7Ci0JICAKLQkgIHJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKQotCSAgICBtYWxsb2MgKHJlbF9zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsKSk7Ci0JICAKLQkgIGlmIChyZWxzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAKLQkgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgcmVsc1tpXS5yX29mZnNldCA9IEJZVEVfR0VUOCAoZXJlbHNbaV0ucl9vZmZzZXQpOwotCSAgICAgIHJlbHNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVDggKGVyZWxzW2ldLnJfaW5mbyk7Ci0JICAgIH0KLQkgIAotCSAgZnJlZSAoZXJlbHMpOwotCSAgCi0JICByZWxhcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSByZWxzOwotCX0KLSAgICB9Ci0KLSAgaWYgKGlzX3JlbGEpCi0gICAgcHJpbnRmCi0gICAgICAoXygiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lICAgICAgICAgIEFkZGVuZFxuIikpOwotICBlbHNlCi0gICAgcHJpbnRmCi0gICAgICAoXygiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lXG4iKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIHJ0eXBlOwotICAgICAgYmZkX3ZtYSAgICAgIG9mZnNldDsKLSAgICAgIGJmZF92bWEgICAgICBpbmZvOwotICAgICAgYmZkX3ZtYSAgICAgIHN5bXRhYl9pbmRleDsKLSAgICAgIGJmZF92bWEgICAgICB0eXBlOwotICAgICAgCi0gICAgICBpZiAoaXNfcmVsYSkKLQl7Ci0JICBvZmZzZXQgPSByZWxhcyBbaV0ucl9vZmZzZXQ7Ci0JICBpbmZvICAgPSByZWxhcyBbaV0ucl9pbmZvOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvZmZzZXQgPSByZWxzIFtpXS5yX29mZnNldDsKLQkgIGluZm8gICA9IHJlbHMgW2ldLnJfaW5mbzsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChpc18zMmJpdF9lbGYpCi0JewotCSAgdHlwZSAgICAgICAgID0gRUxGMzJfUl9UWVBFIChpbmZvKTsKLQkgIHN5bXRhYl9pbmRleCA9IEVMRjMyX1JfU1lNICAoaW5mbyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHR5cGUgICAgICAgICA9IEVMRjY0X1JfVFlQRSAoaW5mbyk7Ci0JICBzeW10YWJfaW5kZXggPSBFTEY2NF9SX1NZTSAgKGluZm8pOwotCX0KLQotI2lmZGVmIF9iZmRfaW50NjRfbG93Ci0gICAgICBwcmludGYgKCIgICU4LjhseCAgJTUuNWx4ICIsIF9iZmRfaW50NjRfbG93IChvZmZzZXQpLCBfYmZkX2ludDY0X2xvdyAoaW5mbykpOwotI2Vsc2UKLSAgICAgIHByaW50ZiAoIiAgJTguOGx4ICAlNS41bHggIiwgb2Zmc2V0LCBpbmZvKTsKLSNlbmRpZgotICAgICAgCi0gICAgICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCXsKLQlkZWZhdWx0OgotCSAgcnR5cGUgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19NMzJSOgotCSAgcnR5cGUgPSBlbGZfbTMycl9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV8zODY6Ci0JY2FzZSBFTV80ODY6Ci0JICBydHlwZSA9IGVsZl9pMzg2X3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNXzY4SzoKLQkgIHJ0eXBlID0gZWxmX202OGtfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fOTYwOgotCSAgcnR5cGUgPSBlbGZfaTk2MF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9PTERfU1BBUkNWOToKLQljYXNlIEVNX1NQQVJDMzJQTFVTOgotCWNhc2UgRU1fU1BBUkNWOToKLQljYXNlIEVNX1NQQVJDOgotCSAgcnR5cGUgPSBlbGZfc3BhcmNfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0JICBydHlwZSA9IHY4NTBfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0QxMFY6Ci0JICBydHlwZSA9IGVsZl9kMTB2X3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19EMzBWOgotCSAgcnR5cGUgPSBlbGZfZDMwdl9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9TSDoKLQkgIHJ0eXBlID0gZWxmX3NoX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19NTjEwMzAwOgotCSAgcnR5cGUgPSBlbGZfbW4xMDMwMF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoKLQkgIHJ0eXBlID0gZWxmX21uMTAyMDBfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0ZSMzA6Ci0JICBydHlwZSA9IGVsZl9mcjMwX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX01DT1JFOgotCSAgcnR5cGUgPSBlbGZfbWNvcmVfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fUFBDOgotCSAgcnR5cGUgPSBlbGZfcHBjX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX01JUFM6Ci0JY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgIHJ0eXBlID0gZWxmX21pcHNfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQUxQSEE6Ci0JICBydHlwZSA9IGVsZl9hbHBoYV9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9BUk06Ci0JICBydHlwZSA9IGVsZl9hcm1fcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0FSQzoKLQkgIHJ0eXBlID0gZWxmX2FyY19yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9QQVJJU0M6Ci0JICBydHlwZSA9IGVsZl9ocHBhX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocnR5cGUgPT0gTlVMTCkKLSNpZmRlZiBfYmZkX2ludDY0X2xvdwkKLQlwcmludGYgKF8oInVucmVjb2duaXNlZDogJS03bHgiKSwgX2JmZF9pbnQ2NF9sb3cgKHR5cGUpKTsKLSNlbHNlCi0JcHJpbnRmIChfKCJ1bnJlY29nbmlzZWQ6ICUtN2x4IiksIHR5cGUpOwotI2VuZGlmCi0gICAgICBlbHNlCi0JcHJpbnRmICgiJS0yMS4yMXMiLCBydHlwZSk7Ci0KLSAgICAgIGlmIChzeW10YWJfaW5kZXgpCi0JewotCSAgaWYgKHN5bXRhYiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bXRhYl9pbmRleCA+PSBuc3ltcykKLQkJcHJpbnRmICgiIGJhZCBzeW1ib2wgaW5kZXg6ICUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpIHN5bXRhYl9pbmRleCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSAqIHBzeW07Ci0KLQkJICBwc3ltID0gc3ltdGFiICsgc3ltdGFiX2luZGV4OwotCQkgIAotCQkgIHByaW50ZiAoIiAlMDhseCAgIiwgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3ZhbHVlKTsKLQkJICAKLQkJICBpZiAocHN5bS0+c3RfbmFtZSA9PSAwKQotCQkgICAgcHJpbnRmICgiJS0yNS4yNXMiLAotCQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgcHN5bS0+c3Rfc2huZHgpKTsKLQkJICBlbHNlIGlmIChzdHJ0YWIgPT0gTlVMTCkKLQkJICAgIHByaW50ZiAoXygiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIpLCBwc3ltLT5zdF9uYW1lKTsKLQkJICBlbHNlCi0JCSAgICBwcmludGYgKCIlLTI1LjI1cyIsIHN0cnRhYiArIHBzeW0tPnN0X25hbWUpOwotCQkgIAotCQkgIGlmIChpc19yZWxhKQotCQkgICAgcHJpbnRmICgiICsgJWx4IiwgKHVuc2lnbmVkIGxvbmcpIHJlbGFzIFtpXS5yX2FkZGVuZCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGlzX3JlbGEpCi0JcHJpbnRmICgiJTM0YyVseCIsICcgJywgKHVuc2lnbmVkIGxvbmcpIHJlbGFzW2ldLnJfYWRkZW5kKTsKLQotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0gICAgfQotCi0gIGZyZWUgKHJlbGFzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X21pcHNfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOiByZXR1cm4gIk1JUFNfUkxEX1ZFUlNJT04iOwotICAgIGNhc2UgRFRfTUlQU19USU1FX1NUQU1QOiByZXR1cm4gIk1JUFNfVElNRV9TVEFNUCI7Ci0gICAgY2FzZSBEVF9NSVBTX0lDSEVDS1NVTTogcmV0dXJuICJNSVBTX0lDSEVDS1NVTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOiByZXR1cm4gIk1JUFNfSVZFUlNJT04iOwotICAgIGNhc2UgRFRfTUlQU19GTEFHUzogcmV0dXJuICJNSVBTX0ZMQUdTIjsKLSAgICBjYXNlIERUX01JUFNfQkFTRV9BRERSRVNTOiByZXR1cm4gIk1JUFNfQkFTRV9BRERSRVNTIjsKLSAgICBjYXNlIERUX01JUFNfTVNZTTogcmV0dXJuICJNSVBTX01TWU0iOwotICAgIGNhc2UgRFRfTUlQU19DT05GTElDVDogcmV0dXJuICJNSVBTX0NPTkZMSUNUIjsKLSAgICBjYXNlIERUX01JUFNfTElCTElTVDogcmV0dXJuICJNSVBTX0xJQkxJU1QiOwotICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzogcmV0dXJuICJNSVBTX0xPQ0FMX0dPVE5PIjsKLSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzogcmV0dXJuICJNSVBTX0NPTkZMSUNUTk8iOwotICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86IHJldHVybiAiTUlQU19MSUJMSVNUTk8iOwotICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzogcmV0dXJuICJNSVBTX1NZTVRBQk5PIjsKLSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzogcmV0dXJuICJNSVBTX1VOUkVGRVhUTk8iOwotICAgIGNhc2UgRFRfTUlQU19HT1RTWU06IHJldHVybiAiTUlQU19HT1RTWU0iOwotICAgIGNhc2UgRFRfTUlQU19ISVBBR0VOTzogcmV0dXJuICJNSVBTX0hJUEFHRU5PIjsKLSAgICBjYXNlIERUX01JUFNfUkxEX01BUDogcmV0dXJuICJNSVBTX1JMRF9NQVAiOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTUzogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NfTk86IHJldHVybiAiTUlQU19ERUxUQV9DTEFTU19OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFOiByZXR1cm4gIk1JUFNfREVMVEFfSU5TVEFOQ0UiOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTzogcmV0dXJuICJNSVBTX0RFTFRBX0lOU1RBTkNFX05PIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0M6IHJldHVybiAiTUlQU19ERUxUQV9SRUxPQyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1JFTE9DX05POiByZXR1cm4gIk1JUFNfREVMVEFfUkVMT0NfTk8iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9TWU06IHJldHVybiAiTUlQU19ERUxUQV9TWU0iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9TWU1fTk86IHJldHVybiAiTUlQU19ERUxUQV9TWU1fTk8iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU1NZTTogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTU1lNIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk86IHJldHVybiAiTUlQU19ERUxUQV9DTEFTU1NZTV9OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0NYWF9GTEFHUzogcmV0dXJuICJNSVBTX0NYWF9GTEFHUyI7Ci0gICAgY2FzZSBEVF9NSVBTX1BJWElFX0lOSVQ6IHJldHVybiAiTUlQU19QSVhJRV9JTklUIjsKLSAgICBjYXNlIERUX01JUFNfU1lNQk9MX0xJQjogcmV0dXJuICJNSVBTX1NZTUJPTF9MSUIiOwotICAgIGNhc2UgRFRfTUlQU19MT0NBTFBBR0VfR09USURYOiByZXR1cm4gIk1JUFNfTE9DQUxQQUdFX0dPVElEWCI7Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMX0dPVElEWDogcmV0dXJuICJNSVBTX0xPQ0FMX0dPVElEWCI7Ci0gICAgY2FzZSBEVF9NSVBTX0hJRERFTl9HT1RJRFg6IHJldHVybiAiTUlQU19ISURERU5fR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfUFJPVEVDVEVEX0dPVElEWDogcmV0dXJuICJNSVBTX1BST1RFQ1RFRF9HT1RJRFgiOwotICAgIGNhc2UgRFRfTUlQU19PUFRJT05TOiByZXR1cm4gIk1JUFNfT1BUSU9OUyI7Ci0gICAgY2FzZSBEVF9NSVBTX0lOVEVSRkFDRTogcmV0dXJuICJNSVBTX0lOVEVSRkFDRSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RZTlNUUl9BTElHTjogcmV0dXJuICJNSVBTX0RZTlNUUl9BTElHTiI7Ci0gICAgY2FzZSBEVF9NSVBTX0lOVEVSRkFDRV9TSVpFOiByZXR1cm4gIk1JUFNfSU5URVJGQUNFX1NJWkUiOwotICAgIGNhc2UgRFRfTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFI6IHJldHVybiAiTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFIiOwotICAgIGNhc2UgRFRfTUlQU19QRVJGX1NVRkZJWDogcmV0dXJuICJNSVBTX1BFUkZfU1VGRklYIjsKLSAgICBjYXNlIERUX01JUFNfQ09NUEFDVF9TSVpFOiByZXR1cm4gIk1JUFNfQ09NUEFDVF9TSVpFIjsKLSAgICBjYXNlIERUX01JUFNfR1BfVkFMVUU6IHJldHVybiAiTUlQU19HUF9WQUxVRSI7Ci0gICAgY2FzZSBEVF9NSVBTX0FVWF9EWU5BTUlDOiByZXR1cm4gIk1JUFNfQVVYX0RZTkFNSUMiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9keW5hbWljX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBEVF9OVUxMOglyZXR1cm4gIk5VTEwiOwotICAgIGNhc2UgRFRfTkVFREVEOglyZXR1cm4gIk5FRURFRCI7Ci0gICAgY2FzZSBEVF9QTFRSRUxTWjoJcmV0dXJuICJQTFRSRUxTWiI7Ci0gICAgY2FzZSBEVF9QTFRHT1Q6CXJldHVybiAiUExUR09UIjsKLSAgICBjYXNlIERUX0hBU0g6CXJldHVybiAiSEFTSCI7Ci0gICAgY2FzZSBEVF9TVFJUQUI6CXJldHVybiAiU1RSVEFCIjsKLSAgICBjYXNlIERUX1NZTVRBQjoJcmV0dXJuICJTWU1UQUIiOwotICAgIGNhc2UgRFRfUkVMQToJcmV0dXJuICJSRUxBIjsKLSAgICBjYXNlIERUX1JFTEFTWjoJcmV0dXJuICJSRUxBU1oiOwotICAgIGNhc2UgRFRfUkVMQUVOVDoJcmV0dXJuICJSRUxBRU5UIjsKLSAgICBjYXNlIERUX1NUUlNaOglyZXR1cm4gIlNUUlNaIjsKLSAgICBjYXNlIERUX1NZTUVOVDoJcmV0dXJuICJTWU1FTlQiOwotICAgIGNhc2UgRFRfSU5JVDoJcmV0dXJuICJJTklUIjsKLSAgICBjYXNlIERUX0ZJTkk6CXJldHVybiAiRklOSSI7Ci0gICAgY2FzZSBEVF9TT05BTUU6CXJldHVybiAiU09OQU1FIjsKLSAgICBjYXNlIERUX1JQQVRIOglyZXR1cm4gIlJQQVRIIjsKLSAgICBjYXNlIERUX1NZTUJPTElDOglyZXR1cm4gIlNZTUJPTElDIjsKLSAgICBjYXNlIERUX1JFTDoJcmV0dXJuICJSRUwiOwotICAgIGNhc2UgRFRfUkVMU1o6CXJldHVybiAiUkVMU1oiOwotICAgIGNhc2UgRFRfUkVMRU5UOglyZXR1cm4gIlJFTEVOVCI7Ci0gICAgY2FzZSBEVF9QTFRSRUw6CXJldHVybiAiUExUUkVMIjsKLSAgICBjYXNlIERUX0RFQlVHOglyZXR1cm4gIkRFQlVHIjsKLSAgICBjYXNlIERUX1RFWFRSRUw6CXJldHVybiAiVEVYVFJFTCI7Ci0gICAgY2FzZSBEVF9KTVBSRUw6CXJldHVybiAiSk1QUkVMIjsKLSAgICBjYXNlIERUX0JJTkRfTk9XOiAgIHJldHVybiAiQklORF9OT1ciOwotICAgIGNhc2UgRFRfSU5JVF9BUlJBWTogcmV0dXJuICJJTklUX0FSUkFZIjsKLSAgICBjYXNlIERUX0ZJTklfQVJSQVk6IHJldHVybiAiRklOSV9BUlJBWSI7Ci0gICAgY2FzZSBEVF9JTklUX0FSUkFZU1o6IHJldHVybiAiSU5JVF9BUlJBWVNaIjsKLSAgICBjYXNlIERUX0ZJTklfQVJSQVlTWjogcmV0dXJuICJGSU5JX0FSUkFZU1oiOwotICAgICAgCi0gICAgY2FzZSBEVF9QTFRQQURTWjoJcmV0dXJuICJQTFRQQURTWiI7Ci0gICAgY2FzZSBEVF9NT1ZFRU5UOglyZXR1cm4gIk1PVkVFTlQiOwotICAgIGNhc2UgRFRfTU9WRVNaOglyZXR1cm4gIk1PVkVTWiI7Ci0gICAgY2FzZSBEVF9GRUFUVVJFXzE6CXJldHVybiAiRkVBVFVSRV8xIjsKLSAgICBjYXNlIERUX1BPU0ZMQUdfMToJcmV0dXJuICJQT1NGTEFHXzEiOwotICAgIGNhc2UgRFRfU1lNSU5TWjoJcmV0dXJuICJTWU1JTlNaIjsKLSAgICBjYXNlIERUX1NZTUlORU5UOglyZXR1cm4gIlNZTUlORU5UIjsgLyogYWthIFZBTFJOR0hJICovCi0gICAgICAKLSAgICBjYXNlIERUX0FERFJSTkdMTzogIHJldHVybiAiQUREUlJOR0xPIjsKLSAgICBjYXNlIERUX1NZTUlORk86CXJldHVybiAiU1lNSU5GTyI7IC8qIGFrYSBBRERSUk5HSEkgKi8KLSAgICAgIAotICAgIGNhc2UgRFRfVkVSU1lNOglyZXR1cm4gIlZFUlNZTSI7Ci0gICAgICAKLSAgICBjYXNlIERUX1JFTEFDT1VOVDoJcmV0dXJuICJSRUxBQ09VTlQiOwotICAgIGNhc2UgRFRfUkVMQ09VTlQ6CXJldHVybiAiUkVMQ09VTlQiOwotICAgIGNhc2UgRFRfRkxBR1NfMToJcmV0dXJuICJGTEFHU18xIjsKLSAgICBjYXNlIERUX1ZFUkRFRjoJcmV0dXJuICJWRVJERUYiOwotICAgIGNhc2UgRFRfVkVSREVGTlVNOglyZXR1cm4gIlZFUkRFRk5VTSI7Ci0gICAgY2FzZSBEVF9WRVJORUVEOglyZXR1cm4gIlZFUk5FRUQiOwotICAgIGNhc2UgRFRfVkVSTkVFRE5VTToJcmV0dXJuICJWRVJORUVETlVNIjsKLSAgICAgIAotICAgIGNhc2UgRFRfQVVYSUxJQVJZOglyZXR1cm4gIkFVWElMQVJZIjsKLSAgICBjYXNlIERUX1VTRUQ6CXJldHVybiAiVVNFRCI7Ci0gICAgY2FzZSBEVF9GSUxURVI6CXJldHVybiAiRklMVEVSIjsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoKHR5cGUgPj0gRFRfTE9QUk9DKSAmJiAodHlwZSA8PSBEVF9ISVBST0MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0JICAKLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9NSVBTOgotCSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgICAgIHJlc3VsdCA9IGdldF9taXBzX2R5bmFtaWNfdHlwZSAodHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmVzdWx0ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JICAgIHJldHVybiByZXN1bHQ7Ci0KLQkgIHNwcmludGYgKGJ1ZmYsIF8oIlByb2Nlc3NvciBTcGVjaWZpYzogJWx4IiksIHR5cGUpOwotCX0KLSAgICAgIGVsc2UgaWYgKCh0eXBlID49IERUX0xPT1MpICYmICh0eXBlIDw9IERUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsIF8oIk9wZXJhdGluZyBTeXN0ZW0gc3BlY2lmaWM6ICVseCIpLCB0eXBlKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICVseCIpLCB0eXBlKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfZmlsZV90eXBlIChlX3R5cGUpCi0gICAgIHVuc2lnbmVkIGVfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoZV90eXBlKQotICAgIHsKLSAgICBjYXNlIEVUX05PTkU6CXJldHVybiBfKCJOT05FIChOb25lKSIpOwotICAgIGNhc2UgRVRfUkVMOglyZXR1cm4gXygiUkVMIChSZWxvY2F0YWJsZSBmaWxlKSIpOwotICAgIGNhc2UgRVRfRVhFQzogICAgICAgcmV0dXJuIF8oIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0RZTjogICAgICAgIHJldHVybiBfKCJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0NPUkU6ICAgICAgIHJldHVybiBfKCJDT1JFIChDb3JlIGZpbGUpIik7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChlX3R5cGUgPj0gRVRfTE9QUk9DKSAmJiAoZV90eXBlIDw9IEVUX0hJUFJPQykpCi0Jc3ByaW50ZiAoYnVmZiwgXygiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpIiksIGVfdHlwZSk7Ci0gICAgICBlbHNlIGlmICgoZV90eXBlID49IEVUX0xPT1MpICYmIChlX3R5cGUgPD0gRVRfSElPUykpCi0Jc3ByaW50ZiAoYnVmZiwgXygiT1MgU3BlY2lmaWM6ICgleCkiKSwgZV90eXBlKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIGVfdHlwZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9tYWNoaW5lX25hbWUgKGVfbWFjaGluZSkKLSAgICAgdW5zaWduZWQgZV9tYWNoaW5lOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChlX21hY2hpbmUpCi0gICAgewotICAgIGNhc2UgRU1fTk9ORTogICAgICAgIAlyZXR1cm4gXygiTm9uZSIpOwotICAgIGNhc2UgRU1fTTMyOiAgICAgICAgIAlyZXR1cm4gIldFMzIxMDAiOwotICAgIGNhc2UgRU1fU1BBUkM6ICAgICAgIAlyZXR1cm4gIlNwYXJjIjsKLSAgICBjYXNlIEVNXzM4NjogICAgICAgICAJcmV0dXJuICJJbnRlbCA4MDM4NiI7Ci0gICAgY2FzZSBFTV82OEs6ICAgICAgICAgCXJldHVybiAiTUM2ODAwMCI7Ci0gICAgY2FzZSBFTV84OEs6ICAgICAgICAgCXJldHVybiAiTUM4ODAwMCI7Ci0gICAgY2FzZSBFTV80ODY6ICAgICAgICAgCXJldHVybiAiSW50ZWwgODA0ODYiOwotICAgIGNhc2UgRU1fODYwOiAgICAgICAgIAlyZXR1cm4gIkludGVsIDgwODYwIjsKLSAgICBjYXNlIEVNX01JUFM6ICAgICAgICAJcmV0dXJuICJNSVBTIFIzMDAwIGJpZy1lbmRpYW4iOwotICAgIGNhc2UgRU1fUzM3MDogICAgICAgIAlyZXR1cm4gIkFtZGFobCI7Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRTogCXJldHVybiAiTUlQUyBSNDAwMCBiaWctZW5kaWFuIjsKLSAgICBjYXNlIEVNX09MRF9TUEFSQ1Y5OglyZXR1cm4gIlNwYXJjIHY5IChvbGQpIjsKLSAgICBjYXNlIEVNX1BBUklTQzogICAgICAJcmV0dXJuICJIUFBBIjsKLSAgICBjYXNlIEVNX1BQQ19PTEQ6CQlyZXR1cm4gIlBvd2VyIFBDIChvbGQpIjsKLSAgICBjYXNlIEVNX1NQQVJDMzJQTFVTOiAJcmV0dXJuICJTcGFyYyB2OCsiIDsKLSAgICBjYXNlIEVNXzk2MDogICAgICAgICAJcmV0dXJuICJJbnRlbCA5MDg2MCI7Ci0gICAgY2FzZSBFTV9QUEM6ICAgICAgICAgCXJldHVybiAiUG93ZXJQQyI7Ci0gICAgY2FzZSBFTV9WODAwOiAgICAgICAgIAlyZXR1cm4gIk5FQyBWODAwIjsKLSAgICBjYXNlIEVNX0ZSMjA6ICAgICAgICAgCXJldHVybiAiRnVqaXRzdSBGUjIwIjsKLSAgICBjYXNlIEVNX1JIMzI6ICAgICAgICAgCXJldHVybiAiVFJXIFJIMzIiOwotICAgIGNhc2UgRU1fTUNPUkU6CSAgICAgICAgcmV0dXJuICJNQ09SRSI7Ci0gICAgY2FzZSBFTV9BUk06CSAJcmV0dXJuICJBUk0iOwotICAgIGNhc2UgRU1fT0xEX0FMUEhBOgkgCXJldHVybiAiRGlnaXRhbCBBbHBoYSAob2xkKSI7Ci0gICAgY2FzZSBFTV9TSDoJCSAJcmV0dXJuICJIaXRhY2hpIFNIIjsKLSAgICBjYXNlIEVNX1NQQVJDVjk6ICAgICAJcmV0dXJuICJTcGFyYyB2OSI7Ci0gICAgY2FzZSBFTV9UUklDT1JFOiAgICAJcmV0dXJuICJTaWVtZW5zIFRyaWNvcmUiOwotICAgIGNhc2UgRU1fQVJDOgkJcmV0dXJuICJBcmdvbmF1dCBSSVNDIENvcmUiOwotICAgIGNhc2UgRU1fSDhfMzAwOgkJcmV0dXJuICJIaXRhY2hpIEg4LzMwMCI7Ci0gICAgY2FzZSBFTV9IOF8zMDBIOgkJcmV0dXJuICJIaXRhY2hpIEg4LzMwMEgiOwotICAgIGNhc2UgRU1fSDhTOgkJcmV0dXJuICJIaXRhY2hpIEg4UyI7Ci0gICAgY2FzZSBFTV9IOF81MDA6CQlyZXR1cm4gIkhpdGFjaGkgSDgvNTAwIjsKLSAgICBjYXNlIEVNX0lBXzY0OgkJcmV0dXJuICJJbnRlbCBNZXJjZWQiOwotICAgIGNhc2UgRU1fTUlQU19YOgkJcmV0dXJuICJTdGFuZm9yZCBNSVBTLVgiOwotICAgIGNhc2UgRU1fQ09MREZJUkU6CQlyZXR1cm4gIk1vdG9yb2xhIENvbGRmaXJlIjsKLSAgICBjYXNlIEVNXzY4SEMxMjoJCXJldHVybiAiTW90b3JvbGEgTTY4SEMxMiI7Ci0gICAgY2FzZSBFTV9BTFBIQTogICAgICAgCXJldHVybiAiQWxwaGEiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0QxMFY6ICAgICAgICByZXR1cm4gImQxMHYiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0QzMFY6ICAgICAgICByZXR1cm4gImQzMHYiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0FSQzoJCXJldHVybiAiQXJjIjsKLSAgICBjYXNlIEVNX0NZR05VU19NMzJSOglyZXR1cm4gIk1pdHN1YmlzaGkgTTMyciI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfVjg1MDoJcmV0dXJuICJORUMgdjg1MCI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDMwMDoJcmV0dXJuICJtbjEwMzAwIjsKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMjAwOglyZXR1cm4gIm1uMTAyMDAiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0ZSMzA6CXJldHVybiAiRnVqaXRzdSBGUjMwIjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIGVfbWFjaGluZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9tYWNoaW5lX2ZsYWdzIChlX2ZsYWdzLCBlX21hY2hpbmUpCi0gICAgIHVuc2lnbmVkIGVfZmxhZ3M7Ci0gICAgIHVuc2lnbmVkIGVfbWFjaGluZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmIFsxMDI0XTsKLQotICBidWZbMF0gPSAnXDAnOwotICBpZiAoZV9mbGFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVfbWFjaGluZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRU1fNjhLOgotICAgICAgICAgIGlmIChlX2ZsYWdzICYgRUZfQ1BVMzIpCi0gICAgICAgICAgICBzdHJjYXQgKGJ1ZiwgIiwgY3B1MzIiKTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgRU1fUFBDOgotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfRU1CKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgZW1iIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUtbGliIik7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0JICBzd2l0Y2ggKGVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0JICAgIHsKLQkgICAgY2FzZSBFX1Y4NTBFX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTBlIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRV9WODUwRUFfQVJDSDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdjg1MGVhIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRV9WODUwX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTAiKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdW5rbm93biB2ODUwIGFyY2hpdGVjdHVyZSB2YXJpYW50Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTTMyUjoKLQkgIGlmICgoZV9mbGFncyAmIEVGX00zMlJfQVJDSCkgPT0gRV9NMzJSX0FSQ0gpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtMzJyIik7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9NSVBTOgotCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICBpZiAoZV9mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbm9yZW9yZGVyIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19QSUMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBwaWMiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBjcGljIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19BQkkyKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgYWJpMiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMSIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzIpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMyIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzQpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzNCIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfbWlwc19zZWdtZW50X3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX01JUFNfUkVHSU5GTzoKLSAgICAgIHJldHVybiAiUkVHSU5GTyI7Ci0gICAgY2FzZSBQVF9NSVBTX1JUUFJPQzoKLSAgICAgIHJldHVybiAiUlRQUk9DIjsKLSAgICBjYXNlIFBUX01JUFNfT1BUSU9OUzoKLSAgICAgIHJldHVybiAiT1BUSU9OUyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3NlZ21lbnRfdHlwZSAocF90eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHBfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAocF90eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX05VTEw6ICAgICAgIHJldHVybiAiTlVMTCI7Ci0gICAgY2FzZSBQVF9MT0FEOiAgICAgICByZXR1cm4gIkxPQUQiOwotICAgIGNhc2UgUFRfRFlOQU1JQzoJcmV0dXJuICJEWU5BTUlDIjsKLSAgICBjYXNlIFBUX0lOVEVSUDogICAgIHJldHVybiAiSU5URVJQIjsKLSAgICBjYXNlIFBUX05PVEU6ICAgICAgIHJldHVybiAiTk9URSI7Ci0gICAgY2FzZSBQVF9TSExJQjogICAgICByZXR1cm4gIlNITElCIjsKLSAgICBjYXNlIFBUX1BIRFI6ICAgICAgIHJldHVybiAiUEhEUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChwX3R5cGUgPj0gUFRfTE9QUk9DKSAmJiAocF90eXBlIDw9IFBUX0hJUFJPQykpCi0JewotCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKLQkgIAotCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkgICAgewotCSAgICBjYXNlIEVNX01JUFM6Ci0JICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X21pcHNfc2VnbWVudF90eXBlIChwX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIAotCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCSAgICByZXR1cm4gcmVzdWx0OwotCSAgCi0JICBzcHJpbnRmIChidWZmLCAiTE9QUk9DKyVseCIsIHBfdHlwZSAtIFBUX0xPUFJPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHBfdHlwZSA+PSBQVF9MT09TKSAmJiAocF90eXBlIDw9IFBUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsICJMT09TKyVseCIsIHBfdHlwZSAtIFBUX0xPT1MpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWx4IiksIHBfdHlwZSk7Ci0KLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpCi0gICAgIHVuc2lnbmVkIGludCBzaF90eXBlOwotewotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX01JUFNfTElCTElTVDogICAgICAgcmV0dXJuICJNSVBTX0xJQkxJU1QiOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTTogICAgICAgICAgcmV0dXJuICJNSVBTX01TWU0iOwotICAgIGNhc2UgU0hUX01JUFNfQ09ORkxJQ1Q6ICAgICAgcmV0dXJuICJNSVBTX0NPTkZMSUNUIjsKLSAgICBjYXNlIFNIVF9NSVBTX0dQVEFCOiAgICAgICAgIHJldHVybiAiTUlQU19HUFRBQiI7Ci0gICAgY2FzZSBTSFRfTUlQU19VQ09ERTogICAgICAgICByZXR1cm4gIk1JUFNfVUNPREUiOwotICAgIGNhc2UgU0hUX01JUFNfREVCVUc6ICAgICAgICAgcmV0dXJuICJNSVBTX0RFQlVHIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JFR0lORk86ICAgICAgIHJldHVybiAiTUlQU19SRUdJTkZPIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BBQ0tBR0U6ICAgICAgIHJldHVybiAiTUlQU19QQUNLQUdFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BBQ0tTWU06ICAgICAgIHJldHVybiAiTUlQU19QQUNLU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JFTEQ6ICAgICAgICAgIHJldHVybiAiTUlQU19SRUxEIjsKLSAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOiAgICAgICAgIHJldHVybiAiTUlQU19JRkFDRSI7Ci0gICAgY2FzZSBTSFRfTUlQU19DT05URU5UOiAgICAgICByZXR1cm4gIk1JUFNfQ09OVEVOVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19PUFRJT05TOiAgICAgICByZXR1cm4gIk1JUFNfT1BUSU9OUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19TSERSOiAgICAgICAgICByZXR1cm4gIk1JUFNfU0hEUiI7Ci0gICAgY2FzZSBTSFRfTUlQU19GREVTQzogICAgICAgICByZXR1cm4gIk1JUFNfRkRFU0MiOwotICAgIGNhc2UgU0hUX01JUFNfRVhUU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0VYVFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERU5TRTogICAgICAgICByZXR1cm4gIk1JUFNfREVOU0UiOwotICAgIGNhc2UgU0hUX01JUFNfUERFU0M6ICAgICAgICAgcmV0dXJuICJNSVBTX1BERVNDIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xPQ1NZTTogICAgICAgIHJldHVybiAiTUlQU19MT0NTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfQVVYU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0FVWFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19PUFRTWU06ICAgICAgICByZXR1cm4gIk1JUFNfT1BUU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xPQ1NUUjogICAgICAgIHJldHVybiAiTUlQU19MT0NTVFIiOwotICAgIGNhc2UgU0hUX01JUFNfTElORTogICAgICAgICAgcmV0dXJuICJNSVBTX0xJTkUiOwotICAgIGNhc2UgU0hUX01JUFNfUkZERVNDOiAgICAgICAgcmV0dXJuICJNSVBTX1JGREVTQyI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQVNZTTogICAgICByZXR1cm4gIk1JUFNfREVMVEFTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFJTlNUOiAgICAgcmV0dXJuICJNSVBTX0RFTFRBSU5TVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQUNMQVNTOiAgICByZXR1cm4gIk1JUFNfREVMVEFDTEFTUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19EV0FSRjogICAgICAgICByZXR1cm4gIk1JUFNfRFdBUkYiOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFERUNMOiAgICAgcmV0dXJuICJNSVBTX0RFTFRBREVDTCI7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOiAgICByZXR1cm4gIk1JUFNfU1lNQk9MX0xJQiI7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6ICAgICAgICByZXR1cm4gIk1JUFNfRVZFTlRTIjsKLSAgICBjYXNlIFNIVF9NSVBTX1RSQU5TTEFURTogICAgIHJldHVybiAiTUlQU19UUkFOU0xBVEUiOwotICAgIGNhc2UgU0hUX01JUFNfUElYSUU6ICAgICAgICAgcmV0dXJuICJNSVBTX1BJWElFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1hMQVRFOiAgICAgICAgIHJldHVybiAiTUlQU19YTEFURSI7Ci0gICAgY2FzZSBTSFRfTUlQU19YTEFURV9ERUJVRzogICByZXR1cm4gIk1JUFNfWExBVEVfREVCVUciOwotICAgIGNhc2UgU0hUX01JUFNfV0hJUkw6ICAgICAgICAgcmV0dXJuICJNSVBTX1dISVJMIjsKLSAgICBjYXNlIFNIVF9NSVBTX0VIX1JFR0lPTjogICAgIHJldHVybiAiTUlQU19FSF9SRUdJT04iOwotICAgIGNhc2UgU0hUX01JUFNfWExBVEVfT0xEOiAgICAgcmV0dXJuICJNSVBTX1hMQVRFX09MRCI7Ci0gICAgY2FzZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OOiByZXR1cm4gIk1JUFNfUERSX0VYQ0VQVElPTiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHNoX3R5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX05VTEw6CQlyZXR1cm4gIk5VTEwiOwotICAgIGNhc2UgU0hUX1BST0dCSVRTOgkJcmV0dXJuICJQUk9HQklUUyI7Ci0gICAgY2FzZSBTSFRfU1lNVEFCOgkJcmV0dXJuICJTWU1UQUIiOwotICAgIGNhc2UgU0hUX1NUUlRBQjoJCXJldHVybiAiU1RSVEFCIjsKLSAgICBjYXNlIFNIVF9SRUxBOgkJcmV0dXJuICJSRUxBIjsKLSAgICBjYXNlIFNIVF9IQVNIOgkJcmV0dXJuICJIQVNIIjsKLSAgICBjYXNlIFNIVF9EWU5BTUlDOgkJcmV0dXJuICJEWU5BTUlDIjsKLSAgICBjYXNlIFNIVF9OT1RFOgkJcmV0dXJuICJOT1RFIjsKLSAgICBjYXNlIFNIVF9OT0JJVFM6CQlyZXR1cm4gIk5PQklUUyI7Ci0gICAgY2FzZSBTSFRfUkVMOgkJcmV0dXJuICJSRUwiOwotICAgIGNhc2UgU0hUX1NITElCOgkJcmV0dXJuICJTSExJQiI7Ci0gICAgY2FzZSBTSFRfRFlOU1lNOgkJcmV0dXJuICJEWU5TWU0iOwotICAgIGNhc2UgU0hUX0dOVV92ZXJkZWY6CXJldHVybiAiVkVSREVGIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVybmVlZDoJcmV0dXJuICJWRVJORUVEIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVyc3ltOglyZXR1cm4gIlZFUlNZTSI7Ci0gICAgY2FzZSAweDZmZmZmZmYwOgkgICAgICAgIHJldHVybiAiVkVSU1lNIjsKLSAgICBjYXNlIDB4NmZmZmZmZmM6CSAgICAgICAgcmV0dXJuICJWRVJERUYiOwotICAgIGNhc2UgMHg3ZmZmZmZmZDoJCXJldHVybiAiQVVYSUxJQVJZIjsKLSAgICBjYXNlIDB4N2ZmZmZmZmY6CQlyZXR1cm4gIkZJTFRFUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChzaF90eXBlID49IFNIVF9MT1BST0MpICYmIChzaF90eXBlIDw9IFNIVF9ISVBST0MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0KLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9NSVBTOgotCSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgICAgIHJlc3VsdCA9IGdldF9taXBzX3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgIlNIVF9MT1BST0MrJXgiLCBzaF90eXBlIC0gU0hUX0xPUFJPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPT1MpICYmIChzaF90eXBlIDw9IFNIVF9ISU9TKSkKLQlzcHJpbnRmIChidWZmLCAiU0hUX0xPT1MrJXgiLCBzaF90eXBlIC0gU0hUX0xPT1MpOwotICAgICAgZWxzZSBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPVVNFUikgJiYgKHNoX3R5cGUgPD0gU0hUX0hJVVNFUikpCi0Jc3ByaW50ZiAoYnVmZiwgIlNIVF9MT1VTRVIrJXgiLCBzaF90eXBlIC0gU0hUX0xPVVNFUik7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBzaF90eXBlKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdHJ1Y3Qgb3B0aW9uIG9wdGlvbnMgW10gPQotewotICB7ImFsbCIsICAgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2EnfSwKLSAgeyJmaWxlLWhlYWRlciIsICAgICAgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsicHJvZ3JhbS1oZWFkZXJzIiwgIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7ImhlYWRlcnMiLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2UnfSwKLSAgeyJoaXN0b2dyYW0iLCAgICAgICAgbm9fYXJndW1lbnQsICYgZG9faGlzdG9ncmFtLCAxfSwKLSAgeyJzZWdtZW50cyIsICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsic2VjdGlvbnMiLCAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InNlY3Rpb24taGVhZGVycyIsICBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzeW1ib2xzIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0gIHsic3ltcyIsICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAncyd9LAotICB7InJlbG9jcyIsICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3InfSwKLSAgeyJkeW5hbWljIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdkJ30sCi0gIHsidmVyc2lvbi1pbmZvIiwgICAgIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICB7InVzZS1keW5hbWljIiwgICAgICBub19hcmd1bWVudCwgMCwgJ0QnfSwKLSAgeyJoZXgtZHVtcCIsICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGVidWctZHVtcCIsICAgICAgIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAndyd9LAotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLSAgeyJpbnN0cnVjdGlvbi1kdW1wIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdpJ30sCi0jZW5kaWYKLQotICB7InZlcnNpb24iLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJoZWxwIiwgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdIJ30sCi0gIHswLCAgICAgICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotc3RhdGljIHZvaWQKLXVzYWdlICgpCi17Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiVXNhZ2U6IHJlYWRlbGYge29wdGlvbnN9IGVsZi1maWxlKHMpXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICBPcHRpb25zIGFyZTpcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1hIG9yIC0tYWxsICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVMgLXMgLXIgLWQgLVYgLS1oaXN0b2dyYW1cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1oIG9yIC0tZmlsZS1oZWFkZXIgICAgICAgRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtbCBvciAtLXByb2dyYW0taGVhZGVycyBvciAtLXNlZ21lbnRzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVyc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLVMgb3IgLS1zZWN0aW9uLWhlYWRlcnMgb3IgLS1zZWN0aW9uc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtZSBvciAtLWhlYWRlcnMgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1oIC1sIC1TXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtcyBvciAtLXN5bXMgb3IgLS1zeW1ib2xzIERpc3BsYXkgdGhlIHN5bWJvbCB0YWJsZVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1kIG9yIC0tZHluYW1pYyAgICAgICAgICAgRGlzcGxheSB0aGUgZHluYW1pYyBzZWdtZW50IChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLVYgb3IgLS12ZXJzaW9uLWluZm8gICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIHNlY3Rpb25zIChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLUQgb3IgLS11c2UtZHluYW1pYyAgICAgICBVc2UgdGhlIGR5bmFtaWMgc2VjdGlvbiBpbmZvIHdoZW4gZGlzcGxheWluZyBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAteCA8bnVtYmVyPiBvciAtLWhleC1kdW1wPTxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXAgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC13W2xpYXByXSBvciAtLWRlYnVnLWR1bXBbPWxpbmUsPWluZm8sPWFiYnJldiw9cHVibmFtZXMsPXJhbmdlc11cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgRFdBUkYyIGRlYnVnIHNlY3Rpb25zXG4iKSk7Ci0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWkgPG51bWJlcj4gb3IgLS1pbnN0cnVjdGlvbi1kdW1wPTxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iKSk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgIC0taGlzdG9ncmFtICAgICAgICAgRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3Roc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXYgb3IgLS12ZXJzaW9uICAgICAgICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiByZWFkZWxmXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtSCBvciAtLWhlbHAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvblxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotCi0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotcmVxdWVzdF9kdW1wIChzZWN0aW9uLCB0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbjsKLSAgICAgY2hhciAgICAgICAgIHR5cGU7Ci17Ci0gIGlmIChzZWN0aW9uID49IG51bV9kdW1wX3NlY3RzKQotICAgIHsKLSAgICAgIGNoYXIgKiBuZXdfZHVtcF9zZWN0czsKLQotICAgICAgbmV3X2R1bXBfc2VjdHMgPSAoY2hhciAqKSBjYWxsb2MgKHNlY3Rpb24gKyAxLCAxKTsKLQotICAgICAgaWYgKG5ld19kdW1wX3NlY3RzID09IE5VTEwpCi0JZXJyb3IgKF8oIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkdW1wIHJlcXVlc3QgdGFibGUuIikpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENvcHkgY3VycmVudCBmbGFnIHNldHRpbmdzLiAgKi8KLQkgIG1lbWNweSAobmV3X2R1bXBfc2VjdHMsIGR1bXBfc2VjdHMsIG51bV9kdW1wX3NlY3RzKTsKLQotCSAgZnJlZSAoZHVtcF9zZWN0cyk7Ci0KLQkgIGR1bXBfc2VjdHMgPSBuZXdfZHVtcF9zZWN0czsKLQkgIG51bV9kdW1wX3NlY3RzID0gc2VjdGlvbiArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoZHVtcF9zZWN0cykKLSAgICBkdW1wX3NlY3RzIFtzZWN0aW9uXSB8PSB0eXBlOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCBjOwotCi0gIGlmIChhcmdjIDwgMikKLSAgICB1c2FnZSAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZwotCSAgKGFyZ2MsIGFyZ3YsICJlcnNhaGxkU0R3Ojp4Omk6dlYiLCBvcHRpb25zLCBOVUxMKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGNoYXIgKiAgICBjcDsKLSAgICAgIGludAlzZWN0aW9uOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIC8qIExvbmcgb3B0aW9ucy4gICovCi0JICBicmVhazsKLQljYXNlICdIJzoKLQkgIHVzYWdlICgpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIGRvX3N5bXMgKys7Ci0JICBkb19yZWxvYyArKzsKLQkgIGRvX2R5bmFtaWMgKys7Ci0JICBkb19oZWFkZXIgKys7Ci0JICBkb19zZWN0aW9ucyArKzsKLQkgIGRvX3NlZ21lbnRzICsrOwotCSAgZG9fdmVyc2lvbiArKzsKLQkgIGRvX2hpc3RvZ3JhbSArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZG9faGVhZGVyICsrOwotCSAgZG9fc2VjdGlvbnMgKys7Ci0JICBkb19zZWdtZW50cyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZG9fdXNpbmdfZHluYW1pYyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgZG9fcmVsb2MgKys7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIGRvX2hlYWRlciArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgZG9fc2VnbWVudHMgKys7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGRvX3N5bXMgKys7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGRvX3NlY3Rpb25zICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkb19keW5hbWljICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkb19kdW1wICsrOwotCSAgc2VjdGlvbiA9IHN0cnRvdWwgKG9wdGFyZywgJiBjcCwgMCk7Ci0JICBpZiAoISAqIGNwICYmIHNlY3Rpb24gPj0gMCkKLQkgICAgewotCSAgICAgIHJlcXVlc3RfZHVtcCAoc2VjdGlvbiwgSEVYX0RVTVApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBnb3RvIG9vcHM7Ci0JY2FzZSAndyc6Ci0JICBkb19kdW1wICsrOwotCSAgaWYgKG9wdGFyZyA9PSAwKQotCSAgICBkb19kZWJ1Z2dpbmcgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZG9fZGVidWdnaW5nID0gMDsKLQkgICAgICBzd2l0Y2ggKG9wdGFyZ1swXSkKLQkJewotCQljYXNlICdpJzoKLQkJY2FzZSAnSSc6Ci0JCSAgZG9fZGVidWdfaW5mbyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnYSc6Ci0JCWNhc2UgJ0EnOgotCQkgIGRvX2RlYnVnX2FiYnJldnMgPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2wnOgotCQljYXNlICdMJzoKLQkJICBkb19kZWJ1Z19saW5lcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncCc6Ci0JCWNhc2UgJ1AnOgotCQkgIGRvX2RlYnVnX3B1Ym5hbWVzID0gMTsKLQkJICBicmVhazsKLQotCQljYXNlICdyJzoKLQkJY2FzZSAnUic6Ci0JCSAgZG9fZGVidWdfYXJhbmdlcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICB3YXJuIChfKCJVbnJlY29nbmlzZWQgZGVidWcgb3B0aW9uICclcydcbiIpLCBvcHRhcmcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLQljYXNlICdpJzoKLQkgIGRvX2R1bXAgKys7Ci0JICBzZWN0aW9uID0gc3RydG91bCAob3B0YXJnLCAmIGNwLCAwKTsKLQkgIGlmICghICogY3AgJiYgc2VjdGlvbiA+PSAwKQotCSAgICB7Ci0JICAgICAgcmVxdWVzdF9kdW1wIChzZWN0aW9uLCBESVNBU1NfRFVNUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGdvdG8gb29wczsKLSNlbmRpZgotCWNhc2UgJ3YnOgotCSAgcHJpbnRfdmVyc2lvbiAocHJvZ3JhbV9uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgZG9fdmVyc2lvbiArKzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0Jb29wczoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlcnJvciAoXygiSW52YWxpZCBvcHRpb24gJy0lYydcbiIpLCBjKTsKLQkgIC8qIERyb3AgdGhyb3VnaC4gICovCi0JY2FzZSAnPyc6Ci0JICB1c2FnZSAoKTsKLQl9Ci0gICAgfQotCi0gIGlmICghZG9fZHluYW1pYyAmJiAhZG9fc3ltcyAmJiAhZG9fcmVsb2MgJiYgIWRvX3NlY3Rpb25zCi0gICAgICAmJiAhZG9fc2VnbWVudHMgJiYgIWRvX2hlYWRlciAmJiAhZG9fZHVtcCAmJiAhZG9fdmVyc2lvbgotICAgICAgJiYgIWRvX2hpc3RvZ3JhbSAmJiAhZG9fZGVidWdnaW5nKQotICAgIHVzYWdlICgpOwotICBlbHNlIGlmIChhcmdjIDwgMykKLSAgICB7Ci0gICAgICB3YXJuIChfKCJOb3RoaW5nIHRvIGRvLlxuIikpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9lbGZfY2xhc3MgKGVsZl9jbGFzcykKLSAgICAgdW5zaWduZWQgY2hhciBlbGZfY2xhc3M7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLSAgCi0gIHN3aXRjaCAoZWxmX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIEVMRkNMQVNTTk9ORTogcmV0dXJuIF8oIm5vbmUiKTsKLSAgICBjYXNlIEVMRkNMQVNTMzI6ICAgcmV0dXJuIF8oIkVMRjMyIik7Ci0gICAgY2FzZSBFTEZDTEFTUzY0OiAgIHJldHVybiBfKCJFTEY2NCIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bjogJXg+IiksIGVsZl9jbGFzcyk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9kYXRhX2VuY29kaW5nIChlbmNvZGluZykKLSAgICAgdW5zaWduZWQgY2hhciBlbmNvZGluZzsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotICAKLSAgc3dpdGNoIChlbmNvZGluZykKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBTk9ORTogcmV0dXJuIF8oIm5vbmUiKTsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOiByZXR1cm4gXygiMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4iKTsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOiByZXR1cm4gXygiMidzIGNvbXBsZW1lbnQsIGJpZyBlbmRpYW4iKTsKLSAgICBkZWZhdWx0OiAgICAgICAgICAKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duOiAleD4iKSwgZW5jb2RpbmcpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfb3NhYmlfbmFtZSAob3NhYmkpCi0gICAgIHVuc2lnbmVkIGNoYXIgb3NhYmk7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLSAgCi0gIHN3aXRjaCAob3NhYmkpCi0gICAgewotICAgIGNhc2UgRUxGT1NBQklfU1lTVjogICAgICAgcmV0dXJuIF8oIlVOSVggLSBTeXN0ZW0gViIpOwotICAgIGNhc2UgRUxGT1NBQklfSFBVWDogICAgICAgcmV0dXJuIF8oIlVOSVggLSBIUC1VWCIpOwotICAgIGNhc2UgRUxGT1NBQklfU1RBTkRBTE9ORTogcmV0dXJuIF8oIlN0YW5kYWxvbmUgQXBwIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duOiAleD4iKSwgb3NhYmkpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi0vKiBEZWNvZGUgdGhlIGRhdGEgaGVsZCBpbiAnZWxmX2hlYWRlcicuICAqLwotc3RhdGljIGludAotcHJvY2Vzc19maWxlX2hlYWRlciAoKQotewotICBpZiAoICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUcwXSAhPSBFTEZNQUcwCi0gICAgICB8fCBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX01BRzFdICE9IEVMRk1BRzEKLSAgICAgIHx8IGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHMl0gIT0gRUxGTUFHMgotICAgICAgfHwgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUczXSAhPSBFTEZNQUczKQotICAgIHsKLSAgICAgIGVycm9yCi0JKF8oIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX2hlYWRlcikKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgcHJpbnRmIChfKCJFTEYgSGVhZGVyOlxuIikpOwotICAgICAgcHJpbnRmIChfKCIgIE1hZ2ljOiAgICIpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBFSV9OSURFTlQ7IGkgKyspCi0JcHJpbnRmICgiJTIuMnggIiwgZWxmX2hlYWRlci5lX2lkZW50IFtpXSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmIChfKCIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9lbGZfY2xhc3MgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfQ0xBU1NdKSk7Ci0gICAgICBwcmludGYgKF8oIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X2RhdGFfZW5jb2RpbmcgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfREFUQV0pKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iKSwKLQkgICAgICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dLAotCSAgICAgIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dID09IEVWX0NVUlJFTlQKLQkgICAgICAgPyAiKGN1cnJlbnQpIgotCSAgICAgICA6IChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dICE9IEVWX05PTkUKLQkJICA/ICI8dW5rbm93bjogJWx4PiIKLQkJICA6ICIiKSkpOwotICAgICAgcHJpbnRmIChfKCIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9vc2FiaV9uYW1lIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX09TQUJJXSkpOwotICAgICAgcHJpbnRmIChfKCIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIpLAotCSAgICAgIGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfQUJJVkVSU0lPTl0pOwotICAgICAgcHJpbnRmIChfKCIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9maWxlX3R5cGUgKGVsZl9oZWFkZXIuZV90eXBlKSk7Ci0gICAgICBwcmludGYgKF8oIiAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X21hY2hpbmVfbmFtZSAoZWxmX2hlYWRlci5lX21hY2hpbmUpKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4XG4iKSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgMHglbHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZW50cnkpOwotICAgICAgcHJpbnRmIChfKCIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3Bob2ZmKTsKLSAgICAgIHByaW50ZiAoXygiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICVsZCAoYnl0ZXMgaW50byBmaWxlKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaG9mZik7Ci0gICAgICBwcmludGYgKF8oIiAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseCVzXG4iKSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX2ZsYWdzLAotCSAgICAgIGdldF9tYWNoaW5lX2ZsYWdzIChlbGZfaGVhZGVyLmVfZmxhZ3MsIGVsZl9oZWFkZXIuZV9tYWNoaW5lKSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9laHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfcGhlbnRzaXplKTsKLSAgICAgIHByaW50ZiAoXygiICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9waG51bSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaGVudHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3NobnVtKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaHN0cm5keCk7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci17Ci0gIEVsZjMyX0V4dGVybmFsX1BoZHIgKiBwaGRyczsKLSAgRWxmMzJfRXh0ZXJuYWxfUGhkciAqIGV4dGVybmFsOwotICBFbGYzMl9JbnRlcm5hbF9QaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotICAKLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9waG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplICogZWxmX2hlYWRlci5lX3BobnVtLAotCQkgIHBoZHJzLCBFbGYzMl9FeHRlcm5hbF9QaGRyICosICJwcm9ncmFtIGhlYWRlcnMiKTsKLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHByb2dyYW1faGVhZGVycywgZXh0ZXJuYWwgPSBwaGRyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrLCBleHRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+cF90eXBlICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+cF9vZmZzZXQgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfb2Zmc2V0KTsKLSAgICAgIGludGVybmFsLT5wX3ZhZGRyICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF92YWRkcik7Ci0gICAgICBpbnRlcm5hbC0+cF9wYWRkciAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfcGFkZHIpOwotICAgICAgaW50ZXJuYWwtPnBfZmlsZXN6ID0gQllURV9HRVQgKGV4dGVybmFsLT5wX2ZpbGVzeik7Ci0gICAgICBpbnRlcm5hbC0+cF9tZW1zeiAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfbWVtc3opOwotICAgICAgaW50ZXJuYWwtPnBfZmxhZ3MgID0gQllURV9HRVQgKGV4dGVybmFsLT5wX2ZsYWdzKTsKLSAgICAgIGludGVybmFsLT5wX2FsaWduICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9hbGlnbik7Ci0gICAgfQotCi0gIGZyZWUgKHBoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZ2V0XzY0Yml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX1BoZHIgKiBwaGRyczsKLSAgRWxmNjRfRXh0ZXJuYWxfUGhkciAqIGV4dGVybmFsOwotICBFbGY2NF9JbnRlcm5hbF9QaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotICAKLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9waG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplICogZWxmX2hlYWRlci5lX3BobnVtLAotCQkgIHBoZHJzLCBFbGY2NF9FeHRlcm5hbF9QaGRyICosICJwcm9ncmFtIGhlYWRlcnMiKTsKLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHByb2dyYW1faGVhZGVycywgZXh0ZXJuYWwgPSBwaGRyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrLCBleHRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+cF90eXBlICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+cF9mbGFncyAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfZmxhZ3MpOwotICAgICAgaW50ZXJuYWwtPnBfb2Zmc2V0ID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnBfdmFkZHIgID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF92YWRkcik7Ci0gICAgICBpbnRlcm5hbC0+cF9wYWRkciAgPSBCWVRFX0dFVDggKGV4dGVybmFsLT5wX3BhZGRyKTsKLSAgICAgIGludGVybmFsLT5wX2ZpbGVzeiA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfZmlsZXN6KTsKLSAgICAgIGludGVybmFsLT5wX21lbXN6ICA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfbWVtc3opOwotICAgICAgaW50ZXJuYWwtPnBfYWxpZ24gID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9hbGlnbik7Ci0gICAgfQotCi0gIGZyZWUgKHBoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGZfSW50ZXJuYWxfUGhkciAqIHByb2dyYW1faGVhZGVyczsKLSAgRWxmX0ludGVybmFsX1BoZHIgKiBzZWdtZW50OwotICB1bnNpZ25lZCBpbnQJICAgICAgaTsKLQotICBpZiAoZWxmX2hlYWRlci5lX3BobnVtID09IDApCi0gICAgewotICAgICAgaWYgKGRvX3NlZ21lbnRzKQotCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gcHJvZ3JhbSBoZWFkZXJzIGluIHRoaXMgZmlsZS5cbiIpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoZG9fc2VnbWVudHMgJiYgIWRvX2hlYWRlcikKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuRWxmIGZpbGUgaXMgJXNcbiIpLCBnZXRfZmlsZV90eXBlIChlbGZfaGVhZGVyLmVfdHlwZSkpOwotICAgICAgcHJpbnRmIChfKCJFbnRyeSBwb2ludCAweCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZW50cnkpOwotICAgICAgcHJpbnRmIChfKCJUaGVyZSBhcmUgJWQgcHJvZ3JhbSBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIiksCi0JICAgICAgZWxmX2hlYWRlci5lX3BobnVtLCAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3Bob2ZmKTsKLSAgICB9Ci0KLSAgcHJvZ3JhbV9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9QaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfcGhudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci0KLSAgaWYgKHByb2dyYW1faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICBpID0gZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKTsKLSAgZWxzZQotICAgIGkgPSBnZXRfNjRiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpOwotCi0gIGlmIChpID09IDApCi0gICAgewotICAgICAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIGlmIChkb19zZWdtZW50cykKLSAgICB7Ci0gICAgICBwcmludGYKLQkoXygiXG5Qcm9ncmFtIEhlYWRlciVzOlxuIiksIGVsZl9oZWFkZXIuZV9waG51bSA+IDEgPyAicyIgOiAiIik7Ci0gICAgICBwcmludGYKLQkoXygiICBUeXBlICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiBNZW1TaXogIEZsZyBBbGlnblxuIikpOwotICAgIH0KLQotICBsb2FkYWRkciA9IC0xOwotICBkeW5hbWljX2FkZHIgPSAwOwotICBkeW5hbWljX3NpemUgPSAwOwotCi0gIGZvciAoaSA9IDAsIHNlZ21lbnQgPSBwcm9ncmFtX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsKLSAgICAgICBpICsrLCBzZWdtZW50ICsrKQotICAgIHsKLSAgICAgIGlmIChkb19zZWdtZW50cykKLQl7Ci0JICBwcmludGYgKCIgICUtMTEuMTFzICIsIGdldF9zZWdtZW50X3R5cGUgKHNlZ21lbnQtPnBfdHlwZSkpOwotCSAgcHJpbnRmICgiMHglNi42bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfb2Zmc2V0KTsKLQkgIHByaW50ZiAoIjB4JTguOGx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX3ZhZGRyKTsKLQkgIHByaW50ZiAoIjB4JTguOGx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX3BhZGRyKTsKLQkgIHByaW50ZiAoIjB4JTUuNWx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX2ZpbGVzeik7Ci0JICBwcmludGYgKCIweCU1LjVseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9tZW1zeik7Ci0JICBwcmludGYgKCIlYyVjJWMgIiwKLQkJICAoc2VnbWVudC0+cF9mbGFncyAmIFBGX1IgPyAnUicgOiAnICcpLAotCQkgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfVyA/ICdXJyA6ICcgJyksCi0JCSAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9YID8gJ0UnIDogJyAnKSk7Ci0JICBwcmludGYgKCIlI2x4IiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfYWxpZ24pOwotCX0KLQotICAgICAgc3dpdGNoIChzZWdtZW50LT5wX3R5cGUpCi0JewotCWNhc2UgUFRfTE9BRDoKLQkgIGlmIChsb2FkYWRkciA9PSAtMSkKLQkgICAgbG9hZGFkZHIgPSAoc2VnbWVudC0+cF92YWRkciAmIDB4ZmZmZmYwMDApCi0JICAgICAgLSAoc2VnbWVudC0+cF9vZmZzZXQgJiAweGZmZmZmMDAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBQVF9EWU5BTUlDOgotCSAgaWYgKGR5bmFtaWNfYWRkcikKLQkgICAgZXJyb3IgKF8oIm1vcmUgdGhhbiBvbmUgZHluYW1pYyBzZWdtZW50XG4iKSk7Ci0KLQkgIGR5bmFtaWNfYWRkciA9IHNlZ21lbnQtPnBfb2Zmc2V0OwotCSAgZHluYW1pY19zaXplID0gc2VnbWVudC0+cF9maWxlc3o7Ci0JICBicmVhazsKLQotCWNhc2UgUFRfSU5URVJQOgotCSAgaWYgKGZzZWVrIChmaWxlLCBzZWdtZW50LT5wX29mZnNldCwgU0VFS19TRVQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIGZpbmQgcHJvZ3JhbSBpbnRlcnByZXRlciBuYW1lXG4iKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcm9ncmFtX2ludGVycHJldGVyWzBdID0gMDsKLQkgICAgICBmc2NhbmYgKGZpbGUsICIlNjNzIiwgcHJvZ3JhbV9pbnRlcnByZXRlcik7Ci0KLQkgICAgICBpZiAoZG9fc2VnbWVudHMpCi0JCXByaW50ZiAoXygiXG4gICAgICBbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc10iKSwKLQkJICAgIHByb2dyYW1faW50ZXJwcmV0ZXIpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChkb19zZWdtZW50cykKLQlwdXRjICgnXG4nLCBzdGRvdXQpOwotICAgIH0KLQotICBpZiAobG9hZGFkZHIgPT0gLTEpCi0gICAgewotICAgICAgLyogVmVyeSBzdHJhbmdlLiAqLwotICAgICAgbG9hZGFkZHIgPSAwOwotICAgIH0KLQotICBpZiAoZG9fc2VnbWVudHMgJiYgc2VjdGlvbl9oZWFkZXJzICE9IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcbiBTZWN0aW9uIHRvIFNlZ21lbnQgbWFwcGluZzpcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWdtZW50IFNlY3Rpb25zLi4uXG4iKSk7Ci0KLSAgICAgIGFzc2VydCAoc3RyaW5nX3RhYmxlICE9IE5VTEwpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZWxmX2hlYWRlci5lX3BobnVtOyBpKyspCi0JewotCSAgaW50ICAgICAgICAgICAgICAgICBqOwotCSAgRWxmX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotCi0JICBzZWdtZW50ID0gcHJvZ3JhbV9oZWFkZXJzICsgaTsKLQkgIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0KLQkgIHByaW50ZiAoIiAgICUyLjJkICAgICAiLCBpKTsKLQotCSAgZm9yIChqID0gMDsgaiA8IGVsZl9oZWFkZXIuZV9zaG51bTsgaisrLCBzZWN0aW9uICsrKQotCSAgICB7Ci0JICAgICAgaWYgKHNlY3Rpb24tPnNoX3NpemUgPiAwCi0JCSAgLyogQ29tcGFyZSBhbGxvY2F0ZWQgc2VjdGlvbnMgYnkgVk1BLCB1bmFsbG9jYXRlZAotCQkgICAgIHNlY3Rpb25zIGJ5IGZpbGUgb2Zmc2V0LiAgKi8KLQkJICAmJiAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MKLQkJICAgICAgPyAoc2VjdGlvbi0+c2hfYWRkciA+PSBzZWdtZW50LT5wX3ZhZGRyCi0JCQkgJiYgc2VjdGlvbi0+c2hfYWRkciArIHNlY3Rpb24tPnNoX3NpemUKLQkJCSA8PSBzZWdtZW50LT5wX3ZhZGRyICsgc2VnbWVudC0+cF9tZW1zeikKLQkJICAgICAgOiAoc2VjdGlvbi0+c2hfb2Zmc2V0ID49IHNlZ21lbnQtPnBfb2Zmc2V0Ci0JCQkgJiYgKHNlY3Rpb24tPnNoX29mZnNldCArIHNlY3Rpb24tPnNoX3NpemUKLQkJCSAgICAgPD0gc2VnbWVudC0+cF9vZmZzZXQgKyBzZWdtZW50LT5wX2ZpbGVzeikpKSkKLQkJcHJpbnRmICgiJXMgIiwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0JICAgIH0KLQotCSAgcHV0YyAoJ1xuJyxzdGRvdXQpOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1nZXRfMzJiaXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfRXh0ZXJuYWxfU2hkciAqIHNoZHJzOwotICBFbGYzMl9JbnRlcm5hbF9TaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotCi0gIEdFVF9EQVRBX0FMTE9DIChlbGZfaGVhZGVyLmVfc2hvZmYsCi0JCSAgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSAqIGVsZl9oZWFkZXIuZV9zaG51bSwKLQkJICBzaGRycywgRWxmMzJfRXh0ZXJuYWxfU2hkciAqLCAic2VjdGlvbiBoZWFkZXJzIik7Ci0KLSAgc2VjdGlvbl9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfc2hudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0KLSAgaWYgKHNlY3Rpb25faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgaW50ZXJuYWwgPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLSAgICAgICBpICsrLCBpbnRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+c2hfbmFtZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX25hbWUpOwotICAgICAgaW50ZXJuYWwtPnNoX3R5cGUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF90eXBlKTsKLSAgICAgIGludGVybmFsLT5zaF9mbGFncyAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfZmxhZ3MpOwotICAgICAgaW50ZXJuYWwtPnNoX2FkZHIgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9hZGRyKTsKLSAgICAgIGludGVybmFsLT5zaF9vZmZzZXQgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfb2Zmc2V0KTsKLSAgICAgIGludGVybmFsLT5zaF9zaXplICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfc2l6ZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfbGluayAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2xpbmspOwotICAgICAgaW50ZXJuYWwtPnNoX2luZm8gICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9pbmZvKTsKLSAgICAgIGludGVybmFsLT5zaF9hZGRyYWxpZ24gPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfYWRkcmFsaWduKTsKLSAgICAgIGludGVybmFsLT5zaF9lbnRzaXplICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfZW50c2l6ZSk7Ci0gICAgfQotCi0gIGZyZWUgKHNoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZ2V0XzY0Yml0X3NlY3Rpb25faGVhZGVycyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX1NoZHIgKiBzaGRyczsKLSAgRWxmNjRfSW50ZXJuYWxfU2hkciAqIGludGVybmFsOwotICB1bnNpZ25lZCBpbnQgICAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZWxmX2hlYWRlci5lX3Nob2ZmLAotCQkgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgKiBlbGZfaGVhZGVyLmVfc2hudW0sCi0JCSAgc2hkcnMsIEVsZjY0X0V4dGVybmFsX1NoZHIgKiwgInNlY3Rpb24gaGVhZGVycyIpOwotCi0gIHNlY3Rpb25faGVhZGVycyA9IChFbGZfSW50ZXJuYWxfU2hkciAqKSBtYWxsb2MKLSAgICAoZWxmX2hlYWRlci5lX3NobnVtICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkcikpOwotCi0gIGlmIChzZWN0aW9uX2hlYWRlcnMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGludGVybmFsID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0gICAgICAgaSArKywgaW50ZXJuYWwgKyspCi0gICAgewotICAgICAgaW50ZXJuYWwtPnNoX25hbWUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9uYW1lKTsKLSAgICAgIGludGVybmFsLT5zaF90eXBlICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfZmxhZ3MgICAgID0gQllURV9HRVQ4IChzaGRyc1tpXS5zaF9mbGFncyk7Ci0gICAgICBpbnRlcm5hbC0+c2hfYWRkciAgICAgID0gQllURV9HRVQ4IChzaGRyc1tpXS5zaF9hZGRyKTsKLSAgICAgIGludGVybmFsLT5zaF9zaXplICAgICAgPSBCWVRFX0dFVDggKHNoZHJzW2ldLnNoX3NpemUpOwotICAgICAgaW50ZXJuYWwtPnNoX2VudHNpemUgICA9IEJZVEVfR0VUOCAoc2hkcnNbaV0uc2hfZW50c2l6ZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfbGluayAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2xpbmspOwotICAgICAgaW50ZXJuYWwtPnNoX2luZm8gICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9pbmZvKTsKLSAgICAgIGludGVybmFsLT5zaF9vZmZzZXQgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfb2Zmc2V0KTsKLSAgICAgIGludGVybmFsLT5zaF9hZGRyYWxpZ24gPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfYWRkcmFsaWduKTsKLSAgICB9Ci0KLSAgZnJlZSAoc2hkcnMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqCi1nZXRfMzJiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgbnVtYmVyKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotewotICBFbGYzMl9FeHRlcm5hbF9TeW0gKiBlc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgaXN5bXM7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKiAgIHBzeW07Ci0gIHVuc2lnbmVkIGludCAgICAgICAgIGo7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKG9mZnNldCwgbnVtYmVyICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkgIGVzeW1zLCBFbGYzMl9FeHRlcm5hbF9TeW0gKiwgInN5bWJvbHMiKTsKLQotICBpc3ltcyA9IChFbGZfSW50ZXJuYWxfU3ltICopIG1hbGxvYyAobnVtYmVyICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0KLSAgaWYgKGlzeW1zID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVzeW1zKTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGZvciAoaiA9IDAsIHBzeW0gPSBpc3ltczsKLSAgICAgICBqIDwgbnVtYmVyOwotICAgICAgIGogKyssIHBzeW0gKyspCi0gICAgewotICAgICAgcHN5bS0+c3RfbmFtZSAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfbmFtZSk7Ci0gICAgICBwc3ltLT5zdF92YWx1ZSA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF92YWx1ZSk7Ci0gICAgICBwc3ltLT5zdF9zaXplICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9zaXplKTsKLSAgICAgIHBzeW0tPnN0X3NobmR4ID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3NobmR4KTsKLSAgICAgIHBzeW0tPnN0X2luZm8gID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X2luZm8pOwotICAgICAgcHN5bS0+c3Rfb3RoZXIgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfb3RoZXIpOwotICAgIH0KLQotICBmcmVlIChlc3ltcyk7Ci0KLSAgcmV0dXJuIGlzeW1zOwotfQotCi1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqCi1nZXRfNjRiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgbnVtYmVyKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotewotICBFbGY2NF9FeHRlcm5hbF9TeW0gKiBlc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgaXN5bXM7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKiAgIHBzeW07Ci0gIHVuc2lnbmVkIGludCAgICAgICAgIGo7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKG9mZnNldCwgbnVtYmVyICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TeW0pLAotCQkgIGVzeW1zLCBFbGY2NF9FeHRlcm5hbF9TeW0gKiwgInN5bWJvbHMiKTsKLQotICBpc3ltcyA9IChFbGZfSW50ZXJuYWxfU3ltICopIG1hbGxvYyAobnVtYmVyICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0KLSAgaWYgKGlzeW1zID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVzeW1zKTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGZvciAoaiA9IDAsIHBzeW0gPSBpc3ltczsKLSAgICAgICBqIDwgbnVtYmVyOwotICAgICAgIGogKyssIHBzeW0gKyspCi0gICAgewotICAgICAgcHN5bS0+c3RfbmFtZSAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfbmFtZSk7Ci0gICAgICBwc3ltLT5zdF9pbmZvICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9pbmZvKTsKLSAgICAgIHBzeW0tPnN0X290aGVyID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X290aGVyKTsKLSAgICAgIHBzeW0tPnN0X3NobmR4ID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3NobmR4KTsKLSAgICAgIHBzeW0tPnN0X3ZhbHVlID0gQllURV9HRVQ4IChlc3ltc1tqXS5zdF92YWx1ZSk7Ci0gICAgICBwc3ltLT5zdF9zaXplICA9IEJZVEVfR0VUOCAoZXN5bXNbal0uc3Rfc2l6ZSk7Ci0gICAgfQotCi0gIGZyZWUgKGVzeW1zKTsKLQotICByZXR1cm4gaXN5bXM7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0KLSAgc2VjdGlvbl9oZWFkZXJzID0gTlVMTDsKLQotICBpZiAoZWxmX2hlYWRlci5lX3NobnVtID09IDApCi0gICAgewotICAgICAgaWYgKGRvX3NlY3Rpb25zKQotCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gc2VjdGlvbnMgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGRvX3NlY3Rpb25zICYmICFkb19oZWFkZXIpCi0gICAgcHJpbnRmIChfKCJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHglbHg6XG4iKSwKLQkgICAgZWxmX2hlYWRlci5lX3NobnVtLCAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3Nob2ZmKTsKLQotICBpZiAoaXNfMzJiaXRfZWxmKQotICAgIHsKLSAgICAgIGlmICghIGdldF8zMmJpdF9zZWN0aW9uX2hlYWRlcnMgKGZpbGUpKQotCXJldHVybiAwOwotICAgIH0KLSAgZWxzZSBpZiAoISBnZXRfNjRiaXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBSZWFkIGluIHRoZSBzdHJpbmcgdGFibGUsIHNvIHRoYXQgd2UgaGF2ZSBuYW1lcyB0byBkaXNwbGF5LiAgKi8KLSAgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVycyArIGVsZl9oZWFkZXIuZV9zaHN0cm5keDsKLQotICBpZiAoc2VjdGlvbi0+c2hfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RyaW5nX3RhYmxlX29mZnNldDsKLQotICAgICAgc3RyaW5nX3RhYmxlX29mZnNldCA9IHNlY3Rpb24tPnNoX29mZnNldDsKLQotICAgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJICAgICAgc3RyaW5nX3RhYmxlLCBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKLSAgICB9Ci0KLSAgLyogU2NhbiB0aGUgc2VjdGlvbnMgZm9yIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZQotICAgICBhbmQgZHluYW1pYyBzdHJpbmcgdGFibGUgYW5kIGRlYnVnIHNlY3Rpb25zLiAqLwotICBkeW5hbWljX3N5bWJvbHMgPSBOVUxMOwotICBkeW5hbWljX3N0cmluZ3MgPSBOVUxMOwotICBkeW5hbWljX3N5bWluZm8gPSBOVUxMOwotICAKLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgY2hhciAqIG5hbWUgPSBTRUNUSU9OX05BTUUgKHNlY3Rpb24pOwotCi0gICAgICBpZiAoc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCXsKLQkgIGlmIChkeW5hbWljX3N5bWJvbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIikpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIG51bV9keW5hbWljX3N5bXMgPSBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgIGR5bmFtaWNfc3ltYm9scyA9Ci0JICAgIEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LCBudW1fZHluYW1pY19zeW1zKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9TVFJUQUIKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApCi0JewotCSAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKF8oIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzdHJpbmcgdGFibGVzXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJCSAgZHluYW1pY19zdHJpbmdzLCBjaGFyICosICJkeW5hbWljIHN0cmluZ3MiKTsKLQl9Ci0gICAgICBlbHNlIGlmICgoZG9fZGVidWdnaW5nIHx8IGRvX2RlYnVnX2luZm8gfHwgZG9fZGVidWdfYWJicmV2cwotCQl8fCBkb19kZWJ1Z19saW5lcyB8fCBkb19kZWJ1Z19wdWJuYW1lcyB8fCBkb19kZWJ1Z19hcmFuZ2VzKQotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIDcpID09IDApCi0JewotCSAgbmFtZSArPSA3OwotCi0JICBpZiAoZG9fZGVidWdnaW5nCi0JICAgICAgfHwgKGRvX2RlYnVnX2luZm8gICAgICYmIChzdHJjbXAgKG5hbWUsICJpbmZvIikgPT0gMCkpCi0JICAgICAgfHwgKGRvX2RlYnVnX2FiYnJldnMgICYmIChzdHJjbXAgKG5hbWUsICJhYmJyZXYiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfbGluZXMgICAgJiYgKHN0cmNtcCAobmFtZSwgImxpbmUiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfcHVibmFtZXMgJiYgKHN0cmNtcCAobmFtZSwgInB1Ym5hbWVzIikgPT0gMCkpCi0JICAgICAgfHwgKGRvX2RlYnVnX2FyYW5nZXMgICYmIChzdHJjbXAgKG5hbWUsICJhcmFuZ2VzIikgPT0gMCkpCi0JICAgICAgKQotCSAgICByZXF1ZXN0X2R1bXAgKGksIERFQlVHX0RVTVApOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZG9fc2VjdGlvbnMpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcHJpbnRmIChfKCJcblNlY3Rpb24gSGVhZGVyJXM6XG4iKSwgZWxmX2hlYWRlci5lX3NobnVtID4gMSA/ICJzIiA6ICIiKTsKLSAgcHJpbnRmCi0gICAgKF8oIiAgW05yXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgSW5mIEFsXG4iKSk7Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgcHJpbnRmICgiICBbJTJkXSAlLTE3LjE3cyAlLTE1LjE1cyAiLAotCSAgICAgIGksCi0JICAgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwKLQkgICAgICBnZXRfc2VjdGlvbl90eXBlX25hbWUgKHNlY3Rpb24tPnNoX3R5cGUpKTsKLQotICAgICAgcHJpbnRmICggIiU4LjhseCAlNi42bHggJTYuNmx4ICUyLjJseCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9hZGRyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfc2l6ZSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2VudHNpemUpOwotCi0gICAgICBwcmludGYgKCIgJWMlYyVjICUybGQgJTNseCAlbGRcbiIsCi0JICAgICAgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX1dSSVRFID8gJ1cnIDogJyAnKSwKLQkgICAgICAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MgPyAnQScgOiAnICcpLAotCSAgICAgIChzZWN0aW9uLT5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIgPyAnWCcgOiAnICcpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9saW5rLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9pbmZvLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9hZGRyYWxpZ24pOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogUHJvY2VzcyB0aGUgcmVsb2Mgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3JlbG9jcyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgcmVsX3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcJICAgcmVsX29mZnNldDsKLQotCi0gIGlmICghZG9fcmVsb2MpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGRvX3VzaW5nX2R5bmFtaWMpCi0gICAgewotICAgICAgaW50IGlzX3JlbGE7Ci0KLSAgICAgIHJlbF9zaXplICAgPSAwOwotICAgICAgcmVsX29mZnNldCA9IDA7Ci0KLSAgICAgIGlmIChkeW5hbWljX2luZm9bRFRfUkVMXSkKLQl7Ci0JICByZWxfb2Zmc2V0ID0gZHluYW1pY19pbmZvW0RUX1JFTF07Ci0JICByZWxfc2l6ZSAgID0gZHluYW1pY19pbmZvW0RUX1JFTFNaXTsKLQkgIGlzX3JlbGEgICAgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlIGlmIChkeW5hbWljX2luZm8gW0RUX1JFTEFdKQotCXsKLQkgIHJlbF9vZmZzZXQgPSBkeW5hbWljX2luZm9bRFRfUkVMQV07Ci0JICByZWxfc2l6ZSAgID0gZHluYW1pY19pbmZvW0RUX1JFTEFTWl07Ci0JICBpc19yZWxhICAgID0gVFJVRTsKLQl9Ci0gICAgICBlbHNlIGlmIChkeW5hbWljX2luZm9bRFRfSk1QUkVMXSkKLQl7Ci0JICByZWxfb2Zmc2V0ID0gZHluYW1pY19pbmZvW0RUX0pNUFJFTF07Ci0JICByZWxfc2l6ZSAgID0gZHluYW1pY19pbmZvW0RUX1BMVFJFTFNaXTsKLQkgIAotCSAgc3dpdGNoIChkeW5hbWljX2luZm9bRFRfUExUUkVMXSkKLQkgICAgewotCSAgICBjYXNlIERUX1JFTDoKLQkgICAgICBpc19yZWxhID0gRkFMU0U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMQToKLQkgICAgICBpc19yZWxhID0gVFJVRTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpc19yZWxhID0gVU5LTk9XTjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJlbF9zaXplKQotCXsKLQkgIHByaW50ZgotCSAgICAoXygiXG5SZWxvY2F0aW9uIHNlY3Rpb24gYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsZCBieXRlczpcbiIpLAotCSAgICAgcmVsX29mZnNldCwgcmVsX3NpemUpOwotCi0JICBkdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0IC0gbG9hZGFkZHIsIHJlbF9zaXplLAotCQkJICAgIGR5bmFtaWNfc3ltYm9scywgbnVtX2R5bmFtaWNfc3ltcywgZHluYW1pY19zdHJpbmdzLCBpc19yZWxhKTsKLQl9Ci0gICAgICBlbHNlCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICAgIHNlY3Rpb247Ci0gICAgICB1bnNpZ25lZCBsb25nIAkJaTsKLSAgICAgIGludCAgICAgICAgICAgCQlmb3VuZCA9IDA7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLQkgICBpKyssIHNlY3Rpb24gKyspCi0JewotCSAgaWYgKCAgIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX1JFTEEKLQkgICAgICAmJiBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9SRUwpCi0JICAgIGNvbnRpbnVlOwotCi0JICByZWxfb2Zmc2V0ID0gc2VjdGlvbi0+c2hfb2Zmc2V0OwotCSAgcmVsX3NpemUgICA9IHNlY3Rpb24tPnNoX3NpemU7Ci0KLQkgIGlmIChyZWxfc2l6ZSkKLQkgICAgewotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzdHJzZWM7Ci0JICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHN5bXNlYzsKLQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgc3ltdGFiOwotCSAgICAgIGNoYXIgKiAgICAgICAgICAgICAgICBzdHJ0YWI7Ci0JICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGlzX3JlbGE7Ci0JICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgIG5zeW1zOwotCSAgICAgIAotCSAgICAgIHByaW50ZiAoXygiXG5SZWxvY2F0aW9uIHNlY3Rpb24gIikpOwotCi0JICAgICAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQlwcmludGYgKCIlZCIsIHNlY3Rpb24tPnNoX25hbWUpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiJyVzJyIsIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0JICAgICAgcHJpbnRmIChfKCIgYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIiksCi0JCSByZWxfb2Zmc2V0LCAodW5zaWduZWQgbG9uZykgKHJlbF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSkpOwotCi0JICAgICAgc3ltc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluazsKLQotCSAgICAgIG5zeW1zID0gc3ltc2VjLT5zaF9zaXplIC8gc3ltc2VjLT5zaF9lbnRzaXplOwotCSAgICAgIHN5bXRhYiA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc3ltc2VjLT5zaF9vZmZzZXQsIG5zeW1zKTsKLQotCSAgICAgIGlmIChzeW10YWIgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzdHJzZWMgPSBzZWN0aW9uX2hlYWRlcnMgKyBzeW1zZWMtPnNoX2xpbms7Ci0KLQkgICAgICBHRVRfREFUQV9BTExPQyAoc3Ryc2VjLT5zaF9vZmZzZXQsIHN0cnNlYy0+c2hfc2l6ZSwgc3RydGFiLAotCQkJICAgICAgY2hhciAqLCAic3RyaW5nIHRhYmxlIik7Ci0JICAgICAgCi0JICAgICAgaXNfcmVsYSA9IHNlY3Rpb24tPnNoX3R5cGUgPT0gU0hUX1JFTEE7Ci0KLQkgICAgICBkdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0LCByZWxfc2l6ZSwgc3ltdGFiLCBuc3ltcywgc3RydGFiLCBpc19yZWxhKTsKLQotCSAgICAgIGZyZWUgKHN0cnRhYik7Ci0JICAgICAgZnJlZSAoc3ltdGFiKTsKLQotCSAgICAgIGZvdW5kID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgZm91bmQpCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyByZWxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB2b2lkCi1keW5hbWljX3NlZ21lbnRfbWlwc192YWwgKGVudHJ5KQotICAgICBFbGZfSW50ZXJuYWxfRHluICogZW50cnk7Ci17Ci0gIHN3aXRjaCAoZW50cnktPmRfdGFnKQotICAgIHsKLSAgICBjYXNlIERUX01JUFNfRkxBR1M6Ci0gICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQlwcmludGYgKCJOT05FXG4iKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciAqIG9wdHNbXSA9Ci0JICB7Ci0JICAgICJRVUlDS1NUQVJUIiwgIk5PVFBPVCIsICJOT19MSUJSQVJZX1JFUExBQ0VNRU5UIiwKLQkgICAgIk5PX01PVkUiLCAiU0dJX09OTFkiLCAiR1VBUkFOVEVFX0lOSVQiLCAiREVMVEFfQ19QTFVTX1BMVVMiLAotCSAgICAiR1VBUkFOVEVFX1NUQVJUX0lOSVQiLCAiUElYSUUiLCAiREVGQVVMVF9ERUxBWV9MT0FEIiwKLQkgICAgIlJFUVVJQ0tTVEFSVCIsICJSRVFVSUNLU1RBUlRFRCIsICJDT1JEIiwgIk5PX1VOUkVTX1VOREVGIiwKLQkgICAgIlJMRF9PUkRFUl9TQUZFIgotCSAgfTsKLQkgIHVuc2lnbmVkIGludCBjbnQ7Ci0JICBpbnQgZmlyc3QgPSAxOwotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fRUxFTSAob3B0cyk7ICsrIGNudCkKLQkgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsICYgKDEgPDwgY250KSkKLQkgICAgICB7Ci0JCXByaW50ZiAoIiVzJXMiLCBmaXJzdCA/ICIiIDogIiAiLCBvcHRzW2NudF0pOwotCQlmaXJzdCA9IDA7Ci0JICAgICAgfQotCSAgcHV0cyAoIiIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOgotICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCXByaW50ZiAoIkludGVyZmFjZSBWZXJzaW9uOiAlc1xuIiwKLQkJZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWwpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6Ci0gICAgICB7Ci0JY2hhciB0aW1lYnVmWzIwXTsKLQl0aW1lX3QgdGltZSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCXN0cmZ0aW1lICh0aW1lYnVmLCAyMCwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgZ210aW1lICgmdGltZSkpOwotCXByaW50ZiAoIlRpbWUgU3RhbXA6ICVzXG4iLCB0aW1lYnVmKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOgotICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzoKLSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKLSAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgotICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKLSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKLSAgICBjYXNlIERUX01JUFNfSElQQUdFTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05POgotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0NfTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTV9OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk86Ci0gICAgY2FzZSBEVF9NSVBTX0NPTVBBQ1RfU0laRToKLSAgICAgIHByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3B0cik7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXRfMzJiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfRXh0ZXJuYWxfRHluICogZWR5bjsKLSAgRWxmX0ludGVybmFsX0R5biAqICAgZW50cnk7Ci0gIGJmZF9zaXplX3R5cGUgICAgICAgIGk7Ci0gIAotICBHRVRfREFUQV9BTExPQyAoZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUsCi0JCSAgZWR5biwgRWxmMzJfRXh0ZXJuYWxfRHluICosICJkeW5hbWljIHNlZ21lbnQiKTsKLSAgCi0gIC8qIFNHSSdzIEVMRiBoYXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBEWU5BTUlDIHNlZ21lbnQuICBEZXRlcm1pbmUKLSAgICAgaG93IGxhcmdlIHRoaXMgLmR5bmFtaWMgaXMgbm93LiAgV2UgY2FuIGRvIHRoaXMgZXZlbiBiZWZvcmUgdGhlIGJ5dGUKLSAgICAgc3dhcHBpbmcgc2luY2UgdGhlIERUX05VTEwgdGFnIGlzIHJlY29nbml6YWJsZS4gICovCi0gIGR5bmFtaWNfc2l6ZSA9IDA7Ci0gIHdoaWxlICgqKEVsZjMyX1dvcmQgKikgZWR5biBbZHluYW1pY19zaXplKytdLmRfdGFnICE9IERUX05VTEwpCi0gICAgOwotCi0gIGR5bmFtaWNfc2VnbWVudCA9IChFbGZfSW50ZXJuYWxfRHluICopCi0gICAgbWFsbG9jIChkeW5hbWljX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9EeW4pKTsKLQotICBpZiAoZHluYW1pY19zZWdtZW50ID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVkeW4pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotICAgICAgIGkgPCBkeW5hbWljX3NpemU7Ci0gICAgICAgaSArKywgZW50cnkgKyspCi0gICAgewotICAgICAgZW50cnktPmRfdGFnICAgICAgPSBCWVRFX0dFVCAoZWR5biBbaV0uZF90YWcpOwotICAgICAgZW50cnktPmRfdW4uZF92YWwgPSBCWVRFX0dFVCAoZWR5biBbaV0uZF91bi5kX3ZhbCk7Ci0gICAgfQotCi0gIGZyZWUgKGVkeW4pOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfNjRiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmNjRfRXh0ZXJuYWxfRHluICogZWR5bjsKLSAgRWxmX0ludGVybmFsX0R5biAqICAgZW50cnk7Ci0gIGJmZF9zaXplX3R5cGUgICAgICAgIGk7Ci0gIAotICBHRVRfREFUQV9BTExPQyAoZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUsCi0JCSAgZWR5biwgRWxmNjRfRXh0ZXJuYWxfRHluICosICJkeW5hbWljIHNlZ21lbnQiKTsKLSAgCi0gIC8qIFNHSSdzIEVMRiBoYXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBEWU5BTUlDIHNlZ21lbnQuICBEZXRlcm1pbmUKLSAgICAgaG93IGxhcmdlIHRoaXMgLmR5bmFtaWMgaXMgbm93LiAgV2UgY2FuIGRvIHRoaXMgZXZlbiBiZWZvcmUgdGhlIGJ5dGUKLSAgICAgc3dhcHBpbmcgc2luY2UgdGhlIERUX05VTEwgdGFnIGlzIHJlY29nbml6YWJsZS4gICovCi0gIGR5bmFtaWNfc2l6ZSA9IDA7Ci0gIHdoaWxlICgqKGJmZF92bWEgKikgZWR5biBbZHluYW1pY19zaXplICsrXS5kX3RhZyAhPSBEVF9OVUxMKQotICAgIDsKLQotICBkeW5hbWljX3NlZ21lbnQgPSAoRWxmX0ludGVybmFsX0R5biAqKQotICAgIG1hbGxvYyAoZHluYW1pY19zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfRHluKSk7Ci0KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlZHluKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKLSAgICAgICBpIDwgZHluYW1pY19zaXplOwotICAgICAgIGkgKyssIGVudHJ5ICsrKQotICAgIHsKLSAgICAgIGVudHJ5LT5kX3RhZyAgICAgID0gQllURV9HRVQ4IChlZHluIFtpXS5kX3RhZyk7Ci0gICAgICBlbnRyeS0+ZF91bi5kX3ZhbCA9IEJZVEVfR0VUOCAoZWR5biBbaV0uZF91bi5kX3ZhbCk7Ci0gICAgfQotCi0gIGZyZWUgKGVkeW4pOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBhbmQgZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGR5bmFtaWMgc2VnbWVudC4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLSAgYmZkX3NpemVfdHlwZSAgICAgIGk7Ci0KLSAgaWYgKGR5bmFtaWNfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkb19keW5hbWljKQotCXByaW50ZiAoXygiXG5UaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBpZiAoISBnZXRfMzJiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAoZmlsZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltYm9scyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotCSAgIGkgPCBkeW5hbWljX3NpemU7Ci0JICAgKytpLCArKyBlbnRyeSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkgIGlmIChlbnRyeS0+ZF90YWcgIT0gRFRfU1lNVEFCKQotCSAgICBjb250aW51ZTsKLQotCSAgZHluYW1pY19pbmZvW0RUX1NZTVRBQl0gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgLyogU2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZyB0aGUgc3ltYm9sIHRhYmxlIGlzLAotCSAgICAgd2UgZGVmYXVsdCB0byByZWFkaW5nIGluIHRoZSBlbnRpcmUgZmlsZSAoISkgYW5kCi0JICAgICBwcm9jZXNzaW5nIHRoYXQuICBUaGlzIGlzIG92ZXJraWxsLCBJIGtub3csIGJ1dCBpdAotCSAgICAgc2hvdWxkIHdvcmsuICovCi0JICBvZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCi0JICBpZiAoZnNlZWsgKGZpbGUsIDAsIFNFRUtfRU5EKSkKLQkgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIGVuZCBvZiBmaWxlISIpKTsKLQotCSAgaWYgKGlzXzMyYml0X2VsZikKLQkgICAgbnVtX2R5bmFtaWNfc3ltcyA9IChmdGVsbCAoZmlsZSkgLSBvZmZzZXQpIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCSAgZWxzZQotCSAgICBudW1fZHluYW1pY19zeW1zID0gKGZ0ZWxsIChmaWxlKSAtIG9mZnNldCkgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSk7Ci0KLQkgIGlmIChudW1fZHluYW1pY19zeW1zIDwgMSkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBsb2FkXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgZHluYW1pY19zeW1ib2xzID0gR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBvZmZzZXQsIG51bV9keW5hbWljX3N5bXMpOwotCX0KLSAgICB9Ci0KLSAgLyogU2ltaWxhcmx5IGZpbmQgYSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCSAgbG9uZyAgICAgICAgICBzdHJfdGFiX2xlbjsKLQotCSAgaWYgKGVudHJ5LT5kX3RhZyAhPSBEVF9TVFJUQUIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBkeW5hbWljX2luZm9bRFRfU1RSVEFCXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICAvKiBTaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnIHRoZSBzdHJpbmcgdGFibGUgaXMsCi0JICAgICB3ZSBkZWZhdWx0IHRvIHJlYWRpbmcgaW4gdGhlIGVudGlyZSBmaWxlICghKSBhbmQKLQkgICAgIHByb2Nlc3NpbmcgdGhhdC4gIFRoaXMgaXMgb3ZlcmtpbGwsIEkga25vdywgYnV0IGl0Ci0JICAgICBzaG91bGQgd29yay4gKi8KLQotCSAgb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQkgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19FTkQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIpKTsKLQkgIHN0cl90YWJfbGVuID0gZnRlbGwgKGZpbGUpIC0gb2Zmc2V0OwotCi0JICBpZiAoc3RyX3RhYl9sZW4gPCAxKQotCSAgICB7Ci0JICAgICAgZXJyb3IKLQkJKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBzdHJfdGFiX2xlbiwgZHluYW1pY19zdHJpbmdzLCBjaGFyICosCi0JCQkgICJkeW5hbWljIHN0cmluZyB0YWJsZSIpOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFuZCBmaW5kIHRoZSBzeW1pbmZvIHNlY3Rpb24gaWYgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzeW1pbnN6ID0gMDsKLQotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5FTlQpCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiB0aGVzZSBicmFjZXMgYXJlIG5lY2Vzc2FyeSB0byBhdm9pZCBhIHN5bnRheAotCQkgZXJyb3IgZnJvbSB0aGUgU3VuT1M0IEMgY29tcGlsZXIuICAqLwotCSAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltaW5mbykgPT0gZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBlbHNlIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5TWikKLQkgICAgc3ltaW5zeiA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCSAgZWxzZSBpZiAoZW50cnktPmRfdGFnID09IERUX1NZTUlORk8pCi0JICAgIGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCX0KLQotICAgICAgaWYgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgIT0gMCAmJiBzeW1pbnN6ICE9IDApCi0JewotCSAgRWxmX0V4dGVybmFsX1N5bWluZm8gKiBleHRzeW1pbmZvOwotCSAgRWxmX0ludGVybmFsX1N5bWluZm8gKiBzeW1pbmZvOwotCi0JICAvKiBUaGVyZSBpcyBhIHN5bWluZm8gc2VjdGlvbi4gIFJlYWQgdGhlIGRhdGEuICAqLwotCSAgR0VUX0RBVEFfQUxMT0MgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQsIHN5bWluc3osIGV4dHN5bWluZm8sCi0JCQkgIEVsZl9FeHRlcm5hbF9TeW1pbmZvICosICJzeW1ib2wgaW5mb3JtYXRpb24iKTsKLQotCSAgZHluYW1pY19zeW1pbmZvID0gKEVsZl9JbnRlcm5hbF9TeW1pbmZvICopIG1hbGxvYyAoc3ltaW5zeik7Ci0JICBpZiAoZHluYW1pY19zeW1pbmZvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGR5bmFtaWNfc3ltaW5mb19uZW50ID0gc3ltaW5zeiAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bWluZm8pOwotCSAgZm9yIChpID0gMCwgc3ltaW5mbyA9IGR5bmFtaWNfc3ltaW5mbzsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OwotCSAgICAgICArK2ksICsrc3ltaW5mbykKLQkgICAgewotCSAgICAgIHN5bWluZm8tPnNpX2JvdW5kdG8gPSBCWVRFX0dFVCAoZXh0c3ltaW5mb1tpXS5zaV9ib3VuZHRvKTsKLQkgICAgICBzeW1pbmZvLT5zaV9mbGFncyA9IEJZVEVfR0VUIChleHRzeW1pbmZvW2ldLnNpX2ZsYWdzKTsKLQkgICAgfQotCi0JICBmcmVlIChleHRzeW1pbmZvKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkb19keW5hbWljICYmIGR5bmFtaWNfYWRkcikKLSAgICBwcmludGYgKF8oIlxuRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIiksCi0JICAgIGR5bmFtaWNfYWRkciwgKGxvbmcpIGR5bmFtaWNfc2l6ZSk7Ci0gIGlmIChkb19keW5hbWljKQotICAgIHByaW50ZiAoXygiICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZVxuIikpOwotCi0gIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotICAgICAgIGkgPCBkeW5hbWljX3NpemU7Ci0gICAgICAgaSsrLCBlbnRyeSArKykKLSAgICB7Ci0gICAgICBpZiAoZG9fZHluYW1pYykKLQlwcmludGYgKF8oIiAgMHglLTguOGx4ICglcyklKnMiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5kX3RhZywKLQkJZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdGFnKSwKLQkJMjcgLSBzdHJsZW4gKGdldF9keW5hbWljX3R5cGUgKGVudHJ5LT5kX3RhZykpLAotCQkiICIpOwotCi0gICAgICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLQl7Ci0JY2FzZSBEVF9BVVhJTElBUlk6Ci0JY2FzZSBEVF9GSUxURVI6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfQVVYSUxJQVJZKQotCQlwcmludGYgKF8oIkF1eGlsaWFyeSBsaWJyYXJ5IikpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmIChfKCJGaWx0ZXIgbGlicmFyeSIpKTsKLQotCSAgICAgIGlmIChkeW5hbWljX3N0cmluZ3MpCi0JCXByaW50ZiAoIjogWyVzXVxuIiwgZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWwpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiOiAlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkVBVFVSRV8xOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkZsYWdzOiIpKTsKLQkgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQkJcHJpbnRmIChfKCIgTm9uZVxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCQkgIGlmICh2YWwgJiBEVEZfMV9QQVJJTklUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgUEFSSU5JVCIpOwotCQkgICAgICB2YWwgXj0gRFRGXzFfUEFSSU5JVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICE9IDApCi0JCSAgICBwcmludGYgKCIgJWx4IiwgdmFsKTsKLQkJICBwdXRzICgiIik7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1BPU0ZMQUdfMToKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQkJICBpZiAodmFsICYgREZfUDFfTEFaWUxPQUQpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBMQVpZTE9BRCIpOwotCQkgICAgICB2YWwgXj0gREZfUDFfTEFaWUxPQUQ7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGX1AxX0dST1VQUEVSTSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdST1VQUEVSTSIpOwotCQkgICAgICB2YWwgXj0gREZfUDFfR1JPVVBQRVJNOwotCQkgICAgfQotCQkgIGlmICh2YWwgIT0gMCkKLQkJICAgIHByaW50ZiAoIiAlbHgiLCB2YWwpOwotCQkgIHB1dHMgKCIiKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkxBR1NfMToKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQkJICBpZiAodmFsICYgREZfMV9OT1cpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBOT1ciKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9XOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0dMT0JBTCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdMT0JBTCIpOwotCQkgICAgICB2YWwgXj0gREZfMV9HTE9CQUw7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfR1JPVVApCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBHUk9VUCIpOwotCQkgICAgICB2YWwgXj0gREZfMV9HUk9VUDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9OT0RFTEVURSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE5PREVMRVRFIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX05PREVMRVRFOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0xPQURGTFRSKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgTE9BREZMVFIiKTsKLQkJICAgICAgdmFsIF49IERGXzFfTE9BREZMVFI7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfSU5JVEZJUlNUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgSU5JVEZJUlNUIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0lOSVRGSVJTVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9OT09QRU4pCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBOT09QRU4iKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9PUEVOOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX09SSUdJTikKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE9SSUdJTiIpOwotCQkgICAgICB2YWwgXj0gREZfMV9PUklHSU47Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfRElSRUNUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgRElSRUNUIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0RJUkVDVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9UUkFOUykKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIFRSQU5TIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX1RSQU5TOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0lOVEVSUE9TRSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIElOVEVSUE9TRSIpOwotCQkgICAgICB2YWwgXj0gREZfMV9JTlRFUlBPU0U7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAhPSAwKQotCQkgICAgcHJpbnRmICgiICVseCIsIHZhbCk7Ci0JCSAgcHV0cyAoIiIpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QTFRSRUw6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgcHV0cyAoZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdW4uZF92YWwpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9OVUxMCToKLQljYXNlIERUX05FRURFRAk6Ci0JY2FzZSBEVF9QTFRHT1QJOgotCWNhc2UgRFRfSEFTSAk6Ci0JY2FzZSBEVF9TVFJUQUIJOgotCWNhc2UgRFRfU1lNVEFCCToKLQljYXNlIERUX1JFTEEJOgotCWNhc2UgRFRfSU5JVAk6Ci0JY2FzZSBEVF9GSU5JCToKLQljYXNlIERUX1NPTkFNRQk6Ci0JY2FzZSBEVF9SUEFUSAk6Ci0JY2FzZSBEVF9TWU1CT0xJQzoKLQljYXNlIERUX1JFTAk6Ci0JY2FzZSBEVF9ERUJVRwk6Ci0JY2FzZSBEVF9URVhUUkVMCToKLQljYXNlIERUX0pNUFJFTAk6Ci0JICBkeW5hbWljX2luZm9bZW50cnktPmRfdGFnXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGNoYXIgKiBuYW1lOwotCi0JICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyA9PSBOVUxMKQotCQluYW1lID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCW5hbWUgPSBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgICAgIGlmIChuYW1lKQotCQl7Ci0JCSAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERUX05FRURFRDoKLQkJICAgICAgcHJpbnRmIChfKCJTaGFyZWQgbGlicmFyeTogWyVzXSIpLCBuYW1lKTsKLQotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCBwcm9ncmFtX2ludGVycHJldGVyKSkKLQkJCXByaW50ZiAoIlxuIik7Ci0JCSAgICAgIGVsc2UKLQkJCXByaW50ZiAoXygiIHByb2dyYW0gaW50ZXJwcmV0ZXJcbiIpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFRfU09OQU1FOgotCQkgICAgICBwcmludGYgKF8oIkxpYnJhcnkgc29uYW1lOiBbJXNdXG4iKSwgbmFtZSk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIERUX1JQQVRIOgotCQkgICAgICBwcmludGYgKF8oIkxpYnJhcnkgcnBhdGg6IFslc11cbiIpLCBuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QTFRSRUxTWjoKLQljYXNlIERUX1JFTEFTWgk6Ci0JY2FzZSBEVF9TVFJTWgk6Ci0JY2FzZSBEVF9SRUxTWgk6Ci0JY2FzZSBEVF9SRUxBRU5UCToKLQljYXNlIERUX1NZTUVOVAk6Ci0JY2FzZSBEVF9SRUxFTlQJOgotCWNhc2UgRFRfUExUUEFEU1o6Ci0JY2FzZSBEVF9NT1ZFRU5UCToKLQljYXNlIERUX01PVkVTWgk6Ci0JY2FzZSBEVF9JTklUX0FSUkFZU1o6Ci0JY2FzZSBEVF9GSU5JX0FSUkFZU1o6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgcHJpbnRmICgiJWx1IChieXRlcylcbiIsICh1bnNpZ25lZCBsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFRfVkVSREVGTlVNOgotCWNhc2UgRFRfVkVSTkVFRE5VTToKLQljYXNlIERUX1JFTEFDT1VOVDoKLQljYXNlIERUX1JFTENPVU5UOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHByaW50ZiAoIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5kX3VuLmRfdmFsKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9TWU1JTlNaOgotCWNhc2UgRFRfU1lNSU5FTlQ6Ci0JY2FzZSBEVF9TWU1JTkZPOgotCWNhc2UgRFRfVVNFRDoKLQljYXNlIERUX0lOSVRfQVJSQVk6Ci0JY2FzZSBEVF9GSU5JX0FSUkFZOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBpZiAoZHluYW1pY19zdHJpbmdzICE9IE5VTEwgJiYgZW50cnktPmRfdGFnID09IERUX1VTRUQpCi0JCXsKLQkJICBjaGFyICogbmFtZTsKLQotCQkgIG5hbWUgPSBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCQkgIGlmICgqIG5hbWUpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoXygiTm90IG5lZWRlZCBvYmplY3Q6IFslc11cbiIpLCBuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAKLQkgICAgICBwcmludGYgKCIlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfQklORF9OT1c6Ci0JICAvKiBUaGUgdmFsdWUgb2YgdGhpcyBlbnRyeSBpcyBpZ25vcmVkLiAgKi8KLQkgIGJyZWFrOwotCSAgCi0JZGVmYXVsdDoKLQkgIGlmICgoZW50cnktPmRfdGFnID49IERUX1ZFUlNZTSkgJiYgKGVudHJ5LT5kX3RhZyA8PSBEVF9WRVJORUVETlVNKSkKLQkgICAgdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChlbnRyeS0+ZF90YWcpXSA9Ci0JICAgICAgZW50cnktPmRfdW4uZF92YWw7Ci0KLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkJewotCQljYXNlIEVNX01JUFM6Ci0JCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JCSAgZHluYW1pY19zZWdtZW50X21pcHNfdmFsIChlbnRyeSk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgcHJpbnRmICgiJSNseFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfdmVyX2ZsYWdzIChmbGFncykKLSAgICAgdW5zaWduZWQgaW50IGZsYWdzOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgYnVmZlswXSA9IDA7Ci0KLSAgaWYgKGZsYWdzID09IDApCi0gICAgcmV0dXJuIF8oIm5vbmUiKTsKLQotICBpZiAoZmxhZ3MgJiBWRVJfRkxHX0JBU0UpCi0gICAgc3RyY2F0IChidWZmLCAiQkFTRSAiKTsKLQotICBpZiAoZmxhZ3MgJiBWRVJfRkxHX1dFQUspCi0gICAgewotICAgICAgaWYgKGZsYWdzICYgVkVSX0ZMR19CQVNFKQotCXN0cmNhdCAoYnVmZiwgInwgIik7Ci0KLSAgICAgIHN0cmNhdCAoYnVmZiwgIldFQUsgIik7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIH4oVkVSX0ZMR19CQVNFIHwgVkVSX0ZMR19XRUFLKSkKLSAgICBzdHJjYXQgKGJ1ZmYsICJ8IDx1bmtub3duPiIpOwotCi0gIHJldHVybiBidWZmOwotfQotCi0vKiBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgdmVyc2lvbiBzZWN0aW9ucy4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgdW5zaWduZWQgICBpOwotICBpbnQgICAgICAgIGZvdW5kID0gMDsKLQotICBpZiAoISBkb192ZXJzaW9uKQotICAgIHJldHVybiAxOwotCi0gIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLSAgICAgICBpKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgc3dpdGNoIChzZWN0aW9uLT5zaF90eXBlKQotCXsKLQljYXNlIFNIVF9HTlVfdmVyZGVmOgotCSAgewotCSAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICogZWRlZnM7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICBpZHg7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICBjbnQ7Ci0KLQkgICAgZm91bmQgPSAxOwotCi0JICAgIHByaW50ZgotCSAgICAgIChfKCJcblZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iKSwKLQkgICAgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgc2VjdGlvbi0+c2hfaW5mbyk7Ci0KLQkgICAgcHJpbnRmIChfKCIgIEFkZHI6IDB4IikpOwotCSAgICBwcmludGZfdm1hIChzZWN0aW9uLT5zaF9hZGRyKTsKLQkgICAgcHJpbnRmIChfKCIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIiksCi0JCSAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9saW5rLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rKSk7Ci0KLQkgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJCSAgICBlZGVmcywgRWxmX0V4dGVybmFsX1ZlcmRlZiAqLAotCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiIpOwotCi0JICAgIGZvciAoaWR4ID0gY250ID0gMDsgY250IDwgc2VjdGlvbi0+c2hfaW5mbzsgKysgY250KQotCSAgICAgIHsKLQkJY2hhciAqICAgICAgICAgICAgICAgICB2c3RhcnQ7Ci0JCUVsZl9FeHRlcm5hbF9WZXJkZWYgKiAgZWRlZjsKLQkJRWxmX0ludGVybmFsX1ZlcmRlZiAgICBlbnQ7Ci0JCUVsZl9FeHRlcm5hbF9WZXJkYXV4ICogZWF1eDsKLQkJRWxmX0ludGVybmFsX1ZlcmRhdXggICBhdXg7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgajsKLQkJaW50ICAgICAgICAgICAgICAgICAgICBpc3VtOwotCQkKLQkJdnN0YXJ0ID0gKChjaGFyICopIGVkZWZzKSArIGlkeDsKLQotCQllZGVmID0gKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgdnN0YXJ0OwotCi0JCWVudC52ZF92ZXJzaW9uID0gQllURV9HRVQgKGVkZWYtPnZkX3ZlcnNpb24pOwotCQllbnQudmRfZmxhZ3MgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9mbGFncyk7Ci0JCWVudC52ZF9uZHggICAgID0gQllURV9HRVQgKGVkZWYtPnZkX25keCk7Ci0JCWVudC52ZF9jbnQgICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2NudCk7Ci0JCWVudC52ZF9oYXNoICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2hhc2gpOwotCQllbnQudmRfYXV4ICAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9hdXgpOwotCQllbnQudmRfbmV4dCAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9uZXh0KTsKLQotCQlwcmludGYgKF8oIiAgJSMwNng6IFJldjogJWQgIEZsYWdzOiAlcyIpLAotCQkJaWR4LCBlbnQudmRfdmVyc2lvbiwgZ2V0X3Zlcl9mbGFncyAoZW50LnZkX2ZsYWdzKSk7Ci0KLQkJcHJpbnRmIChfKCIgIEluZGV4OiAlZCAgQ250OiAlZCAgIiksCi0JCQllbnQudmRfbmR4LCBlbnQudmRfY250KTsKLQotCQl2c3RhcnQgKz0gZW50LnZkX2F1eDsKLQotCQllYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHZzdGFydDsKLQotCQlhdXgudmRhX25hbWUgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25hbWUpOwotCQlhdXgudmRhX25leHQgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25leHQpOwotCi0JCWlmIChkeW5hbWljX3N0cmluZ3MpCi0JCSAgcHJpbnRmIChfKCJOYW1lOiAlc1xuIiksIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52ZGFfbmFtZSk7Ci0JCWVsc2UKLQkJICBwcmludGYgKF8oIk5hbWUgaW5kZXg6ICVsZFxuIiksIGF1eC52ZGFfbmFtZSk7Ci0KLQkJaXN1bSA9IGlkeCArIGVudC52ZF9hdXg7Ci0KLQkJZm9yIChqID0gMTsgaiA8IGVudC52ZF9jbnQ7IGogKyspCi0JCSAgewotCQkgICAgaXN1bSAgICs9IGF1eC52ZGFfbmV4dDsKLQkJICAgIHZzdGFydCArPSBhdXgudmRhX25leHQ7Ci0KLQkJICAgIGVhdXggPSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgdnN0YXJ0OwotCi0JCSAgICBhdXgudmRhX25hbWUgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25hbWUpOwotCQkgICAgYXV4LnZkYV9uZXh0ID0gQllURV9HRVQgKGVhdXgtPnZkYV9uZXh0KTsKLQotCQkgICAgaWYgKGR5bmFtaWNfc3RyaW5ncykKLQkJICAgICAgcHJpbnRmIChfKCIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iKSwKLQkJCSAgICAgIGlzdW0sIGosIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52ZGFfbmFtZSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogUGFyZW50ICVkLCBuYW1lIGluZGV4OiAlbGRcbiIpLAotCQkJICAgICAgaXN1bSwgaiwgYXV4LnZkYV9uYW1lKTsKLQkJICB9Ci0KLQkJaWR4ICs9IGVudC52ZF9uZXh0OwotCSAgICAgIH0KLQotCSAgICBmcmVlIChlZGVmcyk7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgU0hUX0dOVV92ZXJuZWVkOgotCSAgewotCSAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqICBlbmVlZDsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgaWR4OwotCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbnQ7Ci0KLQkgICAgZm91bmQgPSAxOwotCi0JICAgIHByaW50ZiAoXygiXG5WZXJzaW9uIG5lZWRzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlbGQgZW50cmllczpcbiIpLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgc2VjdGlvbi0+c2hfaW5mbyk7Ci0KLQkgICAgcHJpbnRmIChfKCIgQWRkcjogMHgiKSk7Ci0JICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOwotCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbmsgdG8gc2VjdGlvbjogJWxkICglcylcbiIpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfbGluaywKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluaykpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCi0JCQkgICAgZW5lZWQsIEVsZl9FeHRlcm5hbF9WZXJuZWVkICosCi0JCQkgICAgInZlcnNpb24gbmVlZCBzZWN0aW9uIik7Ci0KLQkgICAgZm9yIChpZHggPSBjbnQgPSAwOyBjbnQgPCBzZWN0aW9uLT5zaF9pbmZvOyArK2NudCkKLQkgICAgICB7Ci0JCUVsZl9FeHRlcm5hbF9WZXJuZWVkICogZW50cnk7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuZWVkICAgICBlbnQ7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgICBqOwotCQlpbnQgICAgICAgICAgICAgICAgICAgICAgaXN1bTsKLQkJY2hhciAqICAgICAgICAgICAgICAgICAgIHZzdGFydDsKLQotCQl2c3RhcnQgPSAoKGNoYXIgKikgZW5lZWQpICsgaWR4OwotCi0JCWVudHJ5ID0gKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHZzdGFydDsKLQotCQllbnQudm5fdmVyc2lvbiA9IEJZVEVfR0VUIChlbnRyeS0+dm5fdmVyc2lvbik7Ci0JCWVudC52bl9jbnQgICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9jbnQpOwotCQllbnQudm5fZmlsZSAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fZmlsZSk7Ci0JCWVudC52bl9hdXggICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9hdXgpOwotCQllbnQudm5fbmV4dCAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fbmV4dCk7Ci0KLQkJcHJpbnRmIChfKCIgICUjMDZ4OiBWZXJzaW9uOiAlZCIpLCBpZHgsIGVudC52bl92ZXJzaW9uKTsKLQotCQlpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgIHByaW50ZiAoXygiICBGaWxlOiAlcyIpLCBkeW5hbWljX3N0cmluZ3MgKyBlbnQudm5fZmlsZSk7Ci0JCWVsc2UKLQkJICBwcmludGYgKF8oIiAgRmlsZTogJWx4IiksIGVudC52bl9maWxlKTsKLQotCQlwcmludGYgKF8oIiAgQ250OiAlZFxuIiksIGVudC52bl9jbnQpOwotCi0JCXZzdGFydCArPSBlbnQudm5fYXV4OwotCi0JCWZvciAoaiA9IDAsIGlzdW0gPSBpZHggKyBlbnQudm5fYXV4OyBqIDwgZW50LnZuX2NudDsgKytqKQotCQkgIHsKLQkJICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICogZWF1eDsKLQkJICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgYXV4OwotCi0JCSAgICBlYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopIHZzdGFydDsKLQotCQkgICAgYXV4LnZuYV9oYXNoICA9IEJZVEVfR0VUIChlYXV4LT52bmFfaGFzaCk7Ci0JCSAgICBhdXgudm5hX2ZsYWdzID0gQllURV9HRVQgKGVhdXgtPnZuYV9mbGFncyk7Ci0JCSAgICBhdXgudm5hX290aGVyID0gQllURV9HRVQgKGVhdXgtPnZuYV9vdGhlcik7Ci0JCSAgICBhdXgudm5hX25hbWUgID0gQllURV9HRVQgKGVhdXgtPnZuYV9uYW1lKTsKLQkJICAgIGF1eC52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX25leHQpOwotCi0JCSAgICBpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IE5hbWU6ICVzIiksCi0JCQkgICAgICBpc3VtLCBkeW5hbWljX3N0cmluZ3MgKyBhdXgudm5hX25hbWUpOwotCQkgICAgZWxzZQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IE5hbWUgaW5kZXg6ICVseCIpLAotCQkJICAgICAgaXN1bSwgYXV4LnZuYV9uYW1lKTsKLQotCQkgICAgcHJpbnRmIChfKCIgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWRcbiIpLAotCQkJICAgIGdldF92ZXJfZmxhZ3MgKGF1eC52bmFfZmxhZ3MpLCBhdXgudm5hX290aGVyKTsKLQotCQkgICAgaXN1bSAgICs9IGF1eC52bmFfbmV4dDsKLQkJICAgIHZzdGFydCArPSBhdXgudm5hX25leHQ7Ci0JCSAgfQotCi0JCWlkeCArPSBlbnQudm5fbmV4dDsKLQkgICAgICB9Ci0JICAgIAotCSAgICBmcmVlIChlbmVlZCk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0dOVV92ZXJzeW06Ci0JICB7Ci0JICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgICBsaW5rX3NlY3Rpb247Ci0JICAgIGludCAgICAgICAgICAgICAgCQl0b3RhbDsKLQkgICAgaW50ICAgICAgICAgICAgICAJCWNudDsKLQkgICAgdW5zaWduZWQgY2hhciAqIAkJZWRhdGE7Ci0JICAgIHVuc2lnbmVkIHNob3J0ICogCQlkYXRhOwotCSAgICBjaGFyICogICAgICAgICAgIAkJc3RydGFiOwotCSAgICBFbGZfSW50ZXJuYWxfU3ltICogCQlzeW1ib2xzOwotCSAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICAgICAgc3RyaW5nX3NlYzsKLQotCSAgICBsaW5rX3NlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rOwotCSAgICB0b3RhbCA9IHNlY3Rpb24tPnNoX3NpemUgLyBzZWN0aW9uLT5zaF9lbnRzaXplOwotCi0JICAgIGZvdW5kID0gMTsKLQotCSAgICBzeW1ib2xzID0gR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBsaW5rX3NlY3Rpb24tPnNoX29mZnNldCwKLQkJCQkgICAgICAgbGlua19zZWN0aW9uLT5zaF9zaXplIC8gbGlua19zZWN0aW9uLT5zaF9lbnRzaXplKTsKLQotCSAgICBzdHJpbmdfc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgbGlua19zZWN0aW9uLT5zaF9saW5rOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzdHJpbmdfc2VjLT5zaF9vZmZzZXQsIHN0cmluZ19zZWMtPnNoX3NpemUsCi0JCQkgICAgc3RydGFiLCBjaGFyICosICJ2ZXJzaW9uIHN0cmluZyB0YWJsZSIpOwotCi0JICAgIHByaW50ZiAoXygiXG5WZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksIHRvdGFsKTsKLQotCSAgICBwcmludGYgKF8oIiBBZGRyOiAiKSk7Ci0JICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOwotCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbms6ICVseCAoJXMpXG4iKSwKLQkJICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX2xpbmssCi0JCSAgICBTRUNUSU9OX05BTUUgKGxpbmtfc2VjdGlvbikpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DICh2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldCi0JCQkgICAgLSBsb2FkYWRkciwKLQkJCSAgICB0b3RhbCAqIHNpemVvZiAoc2hvcnQpLCBlZGF0YSwKLQkJCSAgICB1bnNpZ25lZCBjaGFyICosICJ2ZXJzaW9uIHN5bWJvbCBkYXRhIik7Ci0KLQkgICAgZGF0YSA9ICh1bnNpZ25lZCBzaG9ydCAqKSBtYWxsb2MgKHRvdGFsICogc2l6ZW9mIChzaG9ydCkpOwotCi0JICAgIGZvciAoY250ID0gdG90YWw7IGNudCAtLTspCi0JICAgICAgZGF0YSBbY250XSA9IGJ5dGVfZ2V0IChlZGF0YSArIGNudCAqIHNpemVvZiAoc2hvcnQpLAotCQkJCSAgICAgc2l6ZW9mIChzaG9ydCkpOwotCi0JICAgIGZyZWUgKGVkYXRhKTsKLQotCSAgICBmb3IgKGNudCA9IDA7IGNudCA8IHRvdGFsOyBjbnQgKz0gNCkKLQkgICAgICB7Ci0JCWludCBqLCBubjsKLQotCQlwcmludGYgKCIgICUwM3g6IiwgY250KTsKLQotCQlmb3IgKGogPSAwOyAoaiA8IDQpICYmIChjbnQgKyBqKSA8IHRvdGFsOyArK2opCi0JCSAgc3dpdGNoIChkYXRhIFtjbnQgKyBqXSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgZnB1dHMgKF8oIiAgIDAgKCpsb2NhbCopICAgICIpLCBzdGRvdXQpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAxOgotCQkgICAgICBmcHV0cyAoXygiICAgMSAoKmdsb2JhbCopICAgIiksIHN0ZG91dCk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBubiA9IHByaW50ZiAoIiU0eCVjIiwgZGF0YSBbY250ICsgal0gJiAweDdmZmYsCi0JCQkJICAgZGF0YSBbY250ICsgal0gJiAweDgwMDAgPyAnaCcgOiAnICcpOwotCi0JCSAgICAgIGlmIChzeW1ib2xzIFtjbnQgKyBqXS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUKLQkJCSAgJiYgc2VjdGlvbl9oZWFkZXJzW3N5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4XS5zaF90eXBlCi0JCQkgID09IFNIVF9OT0JJVFMpCi0JCQl7Ci0JCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KLQkJCSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGl2bjsKLQkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIG9mZnNldDsKLQotCQkJICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXQotCQkJICAgIC0gbG9hZGFkZHI7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgIGV2bjsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICAgZXZuYTsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgICBpdm5hOwotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIHZuYV9vZmY7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgICAgICBpdm4udm5fYXV4ICA9IEJZVEVfR0VUIChldm4udm5fYXV4KTsKLQkJCSAgICAgIGl2bi52bl9uZXh0ID0gQllURV9HRVQgKGV2bi52bl9uZXh0KTsKLQotCQkJICAgICAgdm5hX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7Ci0KLQkJCSAgICAgIGRvCi0JCQkJewotCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCi0JCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMSkiKTsKLQotCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7Ci0JCQkJICBpdm5hLnZuYV9vdGhlciA9IEJZVEVfR0VUIChldm5hLnZuYV9vdGhlcik7Ci0KLQkJCQkgIHZuYV9vZmYgKz0gaXZuYS52bmFfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZuYS52bmFfb3RoZXIgIT0gZGF0YSBbY250ICsgal0KLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSBkYXRhIFtjbnQgKyBqXSkKLQkJCQl7Ci0JCQkJICBpdm5hLnZuYV9uYW1lID0gQllURV9HRVQgKGV2bmEudm5hX25hbWUpOwotCi0JCQkJICBubiArPSBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJCXN0cnRhYiArIGl2bmEudm5hX25hbWUsCi0JCQkJCQkxMiAtIHN0cmxlbiAoc3RydGFiCi0JCQkJCQkJICAgICArIGl2bmEudm5hX25hbWUpLAotCQkJCQkJIikiKTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICAgIGVsc2UgaWYgKGl2bi52bl9uZXh0ID09IDApCi0JCQkJewotCQkJCSAgaWYgKGRhdGEgW2NudCArIGpdICE9IDB4ODAwMSkKLQkJCQkgICAgewotCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKLQkJCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICBldmQ7Ci0KLQkJCQkgICAgICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8KLQkJCQkJW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildCi0JCQkJCS0gbG9hZGFkZHI7Ci0KLQkJCQkgICAgICBkbwotCQkJCQl7Ci0JCQkJCSAgR0VUX0RBVEEgKG9mZnNldCwgZXZkLAotCQkJCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24iKTsKLQotCQkJCQkgIGl2ZC52ZF9uZXh0ID0gQllURV9HRVQgKGV2ZC52ZF9uZXh0KTsKLQkJCQkJICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQotCQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCQkJfQotCQkJCSAgICAgIHdoaWxlIChpdmQudmRfbmR4Ci0JCQkJCSAgICAgIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQotCQkJCQkgICAgICYmIGl2ZC52ZF9uZXh0ICE9IDApOwotCi0JCQkJICAgICAgaWYgKGl2ZC52ZF9uZHgKLQkJCQkJICA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQotCQkJCQl7Ci0JCQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRhdXggIGV2ZGE7Ci0JCQkJCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7Ci0KLQkJCQkJICBpdmQudmRfYXV4ID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOwotCi0JCQkJCSAgR0VUX0RBVEEgKG9mZnNldCArIGl2ZC52ZF9hdXgsIGV2ZGEsCi0JCQkJCQkgICAgInZlcnNpb24gZGVmaW5pdGlvbiBhdXgiKTsKLQotCQkJCQkgIGl2ZGEudmRhX25hbWUgPQotCQkJCQkgICAgQllURV9HRVQgKGV2ZGEudmRhX25hbWUpOwotCi0JCQkJCSAgbm4gKz0KLQkJCQkJICAgIHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkJICAgIHN0cnRhYiArIGl2ZGEudmRhX25hbWUsCi0JCQkJCQkgICAgMTIKLQkJCQkJCSAgICAtIHN0cmxlbiAoc3RydGFiCi0JCQkJCQkJICAgICAgKyBpdmRhLnZkYV9uYW1lKSwKLQkJCQkJCSAgICAiKSIpOwotCQkJCQl9Ci0JCQkJICAgIH0KLQotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCW9mZnNldCArPSBpdm4udm5fbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdm4udm5fbmV4dCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHN5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJCXsKLQkJCSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGl2bjsKLQkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIG9mZnNldDsKLQotCQkJICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXQotCQkJICAgIC0gbG9hZGFkZHI7Ci0KLQkJICAgICAgICAgIGRvCi0JCQkgICAgewotCQkJICAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggICAgIGl2bmE7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgIGV2bjsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICAgZXZuYTsKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBhX29mZjsKLQotCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZuLCAidmVyc2lvbiBuZWVkIik7Ci0KLQkJCSAgICAgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOwotCQkJICAgICAgaXZuLnZuX25leHQgPSBCWVRFX0dFVCAoZXZuLnZuX25leHQpOwotCi0JCQkgICAgICBhX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7Ci0KLQkJCSAgICAgIGRvCi0JCQkJewotCQkJCSAgR0VUX0RBVEEgKGFfb2ZmLCBldm5hLAotCQkJCQkgICAgInZlcnNpb24gbmVlZCBhdXggKDIpIik7Ci0KLQkJCQkgIGl2bmEudm5hX25leHQgID0gQllURV9HRVQgKGV2bmEudm5hX25leHQpOwotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCi0JCQkJICBhX29mZiArPSBpdm5hLnZuYV9uZXh0OwotCQkJCX0KLQkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSBkYXRhIFtjbnQgKyBqXQotCQkJCSAgICAgJiYgaXZuYS52bmFfbmV4dCAhPSAwKTsKLQotCQkJICAgICAgaWYgKGl2bmEudm5hX290aGVyID09IGRhdGEgW2NudCArIGpdKQotCQkJCXsKLQkJCQkgIGl2bmEudm5hX25hbWUgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmFtZSk7Ci0KLQkJCQkgIG5uICs9IHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkJc3RydGFiICsgaXZuYS52bmFfbmFtZSwKLQkJCQkJCTEyIC0gc3RybGVuIChzdHJ0YWIKLQkJCQkJCQkgICAgICsgaXZuYS52bmFfbmFtZSksCi0JCQkJCQkiKSIpOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCi0JCQkgICAgICBvZmZzZXQgKz0gaXZuLnZuX25leHQ7Ci0JCQkgICAgfQotCQkJICB3aGlsZSAoaXZuLnZuX25leHQpOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChkYXRhIFtjbnQgKyBqXSAhPSAweDgwMDEpCi0JCQl7Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKLQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRlZiAgZXZkOwotCQkJICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildIC0gbG9hZGFkZHI7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmQsICJ2ZXJzaW9uIGRlZiIpOwotCi0JCQkgICAgICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0JCQkgICAgICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQotCQkJICAgICAgb2Zmc2V0ICs9IGl2ZC52ZF9uZXh0OwotCQkJICAgIH0KLQkJCSAgd2hpbGUgKGl2ZC52ZF9uZHggIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQotCQkJCSAmJiBpdmQudmRfbmV4dCAhPSAwKTsKLQotCQkJICBpZiAoaXZkLnZkX25keCA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7Ci0KLQkJCSAgICAgIGl2ZC52ZF9hdXggPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQgLSBpdmQudmRfbmV4dCArIGl2ZC52ZF9hdXgsCi0JCQkJCWV2ZGEsICJ2ZXJzaW9uIGRlZiBhdXgiKTsKLQotCQkJICAgICAgaXZkYS52ZGFfbmFtZSA9IEJZVEVfR0VUIChldmRhLnZkYV9uYW1lKTsKLQotCQkJICAgICAgbm4gKz0gcHJpbnRmICgiKCVzJS0qcyIsCi0JCQkJCSAgICBzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lLAotCQkJCQkgICAgMTIgLSBzdHJsZW4gKHN0cnRhYgotCQkJCQkJCSArIGl2ZGEudmRhX25hbWUpLAotCQkJCQkgICAgIikiKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgaWYgKG5uIDwgMTgpCi0JCQlwcmludGYgKCIlKmMiLCAxOCAtIG5uLCAnICcpOwotCQkgICAgfQotCi0JCXB1dGNoYXIgKCdcbicpOwotCSAgICAgIH0KLQotCSAgICBmcmVlIChkYXRhKTsKLQkgICAgZnJlZSAoc3RydGFiKTsKLQkgICAgZnJlZSAoc3ltYm9scyk7Ci0JICB9Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoISBmb3VuZCkKLSAgICBwcmludGYgKF8oIlxuTm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9zeW1ib2xfYmluZGluZyAoYmluZGluZykKLSAgICAgdW5zaWduZWQgaW50IGJpbmRpbmc7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGJpbmRpbmcpCi0gICAgewotICAgIGNhc2UgU1RCX0xPQ0FMOiAgcmV0dXJuIF8oIkxPQ0FMIik7Ci0gICAgY2FzZSBTVEJfR0xPQkFMOiByZXR1cm4gXygiR0xPQkFMIik7Ci0gICAgY2FzZSBTVEJfV0VBSzogICByZXR1cm4gXygiV0VBSyIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoYmluZGluZyA+PSBTVEJfTE9QUk9DICYmIGJpbmRpbmcgPD0gU1RCX0hJUFJPQykKLQlzcHJpbnRmIChidWZmLCBfKCI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiKSwgYmluZGluZyk7Ci0gICAgICBlbHNlIGlmIChiaW5kaW5nID49IFNUQl9MT09TICYmIGJpbmRpbmcgPD0gU1RCX0hJT1MpCi0Jc3ByaW50ZiAoYnVmZiwgXygiPE9TIHNwZWNpZmljPjogJWQiKSwgYmluZGluZyk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlZCIpLCBiaW5kaW5nKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3N5bWJvbF90eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTVFRfTk9UWVBFOiAgIHJldHVybiBfKCJOT1RZUEUiKTsKLSAgICBjYXNlIFNUVF9PQkpFQ1Q6ICAgcmV0dXJuIF8oIk9CSkVDVCIpOwotICAgIGNhc2UgU1RUX0ZVTkM6ICAgICByZXR1cm4gXygiRlVOQyIpOwotICAgIGNhc2UgU1RUX1NFQ1RJT046ICByZXR1cm4gXygiU0VDVElPTiIpOwotICAgIGNhc2UgU1RUX0ZJTEU6ICAgICByZXR1cm4gXygiRklMRSIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAodHlwZSA+PSBTVFRfTE9QUk9DICYmIHR5cGUgPD0gU1RUX0hJUFJPQykKLQl7Ci0JICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fQVJNICYmIHR5cGUgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgcmV0dXJuIF8oIlRIVU1CX0ZVTkMiKTsKLQkgIAotCSAgc3ByaW50ZiAoYnVmZiwgXygiPHByb2Nlc3NvciBzcGVjaWZpYz46ICVkIiksIHR5cGUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGUgPj0gU1RUX0xPT1MgJiYgdHlwZSA8PSBTVFRfSElPUykKLQlzcHJpbnRmIChidWZmLCBfKCI8T1Mgc3BlY2lmaWM+OiAlZCIpLCB0eXBlKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICVkIiksIHR5cGUpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfc3ltYm9sX2luZGV4X3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgU0hOX1VOREVGOiAgcmV0dXJuICJVTkQiOwotICAgIGNhc2UgU0hOX0FCUzogICAgcmV0dXJuICJBQlMiOwotICAgIGNhc2UgU0hOX0NPTU1PTjogcmV0dXJuICJDT00iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAodHlwZSA+PSBTSE5fTE9QUk9DICYmIHR5cGUgPD0gU0hOX0hJUFJPQykKLQlyZXR1cm4gIlBSQyI7Ci0gICAgICBlbHNlIGlmICh0eXBlID49IFNITl9MT1JFU0VSVkUgJiYgdHlwZSA8PSBTSE5fSElSRVNFUlZFKQotCXJldHVybiAiUlNWIjsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPj0gU0hOX0xPT1MgJiYgdHlwZSA8PSBTSE5fSElPUykKLQlyZXR1cm4gIk9TICI7Ci0gICAgICBlbHNlCi0JewotCSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0JICBzcHJpbnRmIChidWZmLCAiJTNkIiwgdHlwZSk7Ci0JICByZXR1cm4gYnVmZjsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQgKgotZ2V0X2R5bmFtaWNfZGF0YSAoZmlsZSwgbnVtYmVyKQotICAgICBGSUxFICogICAgICAgZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IG51bWJlcjsKLXsKLSAgY2hhciAqIGVfZGF0YTsKLSAgaW50ICogIGlfZGF0YTsKLQotICBlX2RhdGEgPSAoY2hhciAqKSBtYWxsb2MgKG51bWJlciAqIDQpOwotCi0gIGlmIChlX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVhZCAoZV9kYXRhLCA0LCBudW1iZXIsIGZpbGUpICE9IG51bWJlcikKLSAgICB7Ci0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgaW4gZHluYW1pYyBkYXRhXG4iKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaV9kYXRhID0gKGludCAqKSBtYWxsb2MgKG51bWJlciAqIHNpemVvZiAoKiBpX2RhdGEpKTsKLQotICBpZiAoaV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVfZGF0YSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgd2hpbGUgKG51bWJlci0tKQotICAgIGlfZGF0YSBbbnVtYmVyXSA9IGJ5dGVfZ2V0IChlX2RhdGEgKyBudW1iZXIgKiA0LCA0KTsKLQotICBmcmVlIChlX2RhdGEpOwotCi0gIHJldHVybiBpX2RhdGE7Ci19Ci0KLS8qIER1bXAgdGhlIHN5bWJvbCB0YWJsZSAqLwotc3RhdGljIGludAotcHJvY2Vzc19zeW1ib2xfdGFibGUgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICBzZWN0aW9uOwotICBjaGFyICAgbmIgWzRdOwotICBjaGFyICAgbmMgWzRdOwotICBpbnQgICAgbmJ1Y2tldHM7Ci0gIGludCAgICBuY2hhaW5zOwotICBpbnQgKiAgYnVja2V0cyA9IE5VTEw7Ci0gIGludCAqICBjaGFpbnMgPSBOVUxMOwotCi0gIGlmICghIGRvX3N5bXMgJiYgIWRvX2hpc3RvZ3JhbSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZHluYW1pY19pbmZvW0RUX0hBU0hdICYmICgoZG9fdXNpbmdfZHluYW1pYyAmJiBkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCkKLQkJCQl8fCBkb19oaXN0b2dyYW0pKQotICAgIHsKLSAgICAgIGlmIChmc2VlayAoZmlsZSwgZHluYW1pY19pbmZvW0RUX0hBU0hdIC0gbG9hZGFkZHIsIFNFRUtfU0VUKSkKLQl7Ci0JICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKGZyZWFkIChuYiwgc2l6ZW9mIChuYiksIDEsIGZpbGUpICE9IDEpCi0JewotCSAgZXJyb3IgKF8oIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmIChmcmVhZCAobmMsIHNpemVvZiAobmMpLCAxLCBmaWxlKSAhPSAxKQotCXsKLQkgIGVycm9yIChfKCJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIG5idWNrZXRzID0gYnl0ZV9nZXQgKG5iLCA0KTsKLSAgICAgIG5jaGFpbnMgID0gYnl0ZV9nZXQgKG5jLCA0KTsKLQotICAgICAgYnVja2V0cyA9IGdldF9keW5hbWljX2RhdGEgKGZpbGUsIG5idWNrZXRzKTsKLSAgICAgIGNoYWlucyAgPSBnZXRfZHluYW1pY19kYXRhIChmaWxlLCBuY2hhaW5zKTsKLQotICAgICAgaWYgKGJ1Y2tldHMgPT0gTlVMTCB8fCBjaGFpbnMgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX3N5bXMKLSAgICAgICYmIGR5bmFtaWNfaW5mb1tEVF9IQVNIXSAmJiBkb191c2luZ19keW5hbWljICYmIGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAgICBobjsKLSAgICAgIGludCAgICBzaTsKLQotICAgICAgcHJpbnRmIChfKCJcblN5bWJvbCB0YWJsZSBmb3IgaW1hZ2U6XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgTnVtIEJ1YzogICAgVmFsdWUgIFNpemUgICBUeXBlICAgQmluZCBPdCBOZHggTmFtZVxuIikpOwotCi0gICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgaG4rKykKLQl7Ci0JICBpZiAoISBidWNrZXRzIFtobl0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBmb3IgKHNpID0gYnVja2V0cyBbaG5dOyBzaTsgc2kgPSBjaGFpbnMgW3NpXSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBwc3ltOwotCi0JICAgICAgcHN5bSA9IGR5bmFtaWNfc3ltYm9scyArIHNpOwotCi0JICAgICAgcHJpbnRmICgiICAlM2QgJTNkOiAlOGx4ICU1bGQgJTZzICU2cyAlMmQgIiwKLQkJICAgICAgc2ksIGhuLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgcHN5bS0+c3RfdmFsdWUsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF9zaXplLAotCQkgICAgICBnZXRfc3ltYm9sX3R5cGUgKEVMRl9TVF9UWVBFIChwc3ltLT5zdF9pbmZvKSksCi0JCSAgICAgIGdldF9zeW1ib2xfYmluZGluZyAoRUxGX1NUX0JJTkQgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgcHN5bS0+c3Rfb3RoZXIpOwotCi0JICAgICAgcHJpbnRmICgiJTMuM3MiLCBnZXRfc3ltYm9sX2luZGV4X3R5cGUgKHBzeW0tPnN0X3NobmR4KSk7Ci0KLQkgICAgICBwcmludGYgKCIgJXNcbiIsIGR5bmFtaWNfc3RyaW5ncyArIHBzeW0tPnN0X25hbWUpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZG9fc3ltcyAmJiAhZG9fdXNpbmdfZHluYW1pYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgICAgIGk7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLQkgICBpKyssIHNlY3Rpb24rKykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgICAgICAgICAgc2k7Ci0JICBjaGFyICogICAgICAgICAgICAgICAgc3RydGFiOwotCSAgRWxmX0ludGVybmFsX1N5bSAqICAgIHN5bXRhYjsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICBwc3ltOwotCi0KLQkgIGlmICggICBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9TWU1UQUIKLQkgICAgICAmJiBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBwcmludGYgKF8oIlxuU3ltYm9sIHRhYmxlICclcycgY29udGFpbnMgJWx1IGVudHJpZXM6XG4iKSwKLQkJICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLAotCQkgICh1bnNpZ25lZCBsb25nKSAoc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpKTsKLQkgIGZwdXRzIChfKCIgIE51bTogICAgVmFsdWUgIFNpemUgVHlwZSAgICBCaW5kICAgT3QgIE5keCBOYW1lXG4iKSwKLQkJIHN0ZG91dCk7Ci0KLQkgIHN5bXRhYiA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCQkJCSAgICBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSk7Ci0JICBpZiAoc3ltdGFiID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoc2VjdGlvbi0+c2hfbGluayA9PSBlbGZfaGVhZGVyLmVfc2hzdHJuZHgpCi0JICAgIHN0cnRhYiA9IHN0cmluZ190YWJsZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzdHJpbmdfc2VjOwotCi0JICAgICAgc3RyaW5nX3NlYyA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgICBHRVRfREFUQV9BTExPQyAoc3RyaW5nX3NlYy0+c2hfb2Zmc2V0LCBzdHJpbmdfc2VjLT5zaF9zaXplLAotCQkJICAgICAgc3RydGFiLCBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKLQkgICAgfQotCi0JICBmb3IgKHNpID0gMCwgcHN5bSA9IHN5bXRhYjsKLQkgICAgICAgc2kgPCBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgICAgICAgc2kgKyssIHBzeW0gKyspCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgICUzZDogJThseCAlNWxkICUtN3MgJS02cyAlMmQgIiwKLQkJICAgICAgc2ksCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF92YWx1ZSwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3NpemUsCi0JCSAgICAgIGdldF9zeW1ib2xfdHlwZSAoRUxGX1NUX1RZUEUgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgZ2V0X3N5bWJvbF9iaW5kaW5nIChFTEZfU1RfQklORCAocHN5bS0+c3RfaW5mbykpLAotCQkgICAgICBwc3ltLT5zdF9vdGhlcik7Ci0KLQkgICAgICBwcmludGYgKCIlNHMiLCBnZXRfc3ltYm9sX2luZGV4X3R5cGUgKHBzeW0tPnN0X3NobmR4KSk7Ci0KLQkgICAgICBwcmludGYgKCIgJXMiLCBzdHJ0YWIgKyBwc3ltLT5zdF9uYW1lKTsKLQotCSAgICAgIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9EWU5TWU0gJiYKLQkJICB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBjaGFyICAgZGF0YVsyXTsKLQkJICB1bnNpZ25lZCBzaG9ydCAgdmVyc19kYXRhOwotCQkgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7Ci0JCSAgaW50ICAgICAgICAgICAgIGlzX25vYml0czsKLQkJICBpbnQgICAgICAgICAgICAgY2hlY2tfZGVmOwotCi0JCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXQotCQkgICAgLSBsb2FkYWRkcjsKLQotCQkgIEdFVF9EQVRBIChvZmZzZXQgKyBzaSAqIHNpemVvZiAodmVyc19kYXRhKSwgZGF0YSwKLQkJCSAgICAidmVyc2lvbiBkYXRhIik7Ci0KLQkJICB2ZXJzX2RhdGEgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0KLQkJICBpc19ub2JpdHMgPSBwc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUgPwotCQkgICAgKHNlY3Rpb25faGVhZGVycyBbcHN5bS0+c3Rfc2huZHhdLnNoX3R5cGUgPT0gU0hUX05PQklUUykKLQkJICAgIDogMDsKLQotCQkgIGNoZWNrX2RlZiA9IChwc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpOwotCi0JCSAgaWYgKCh2ZXJzX2RhdGEgJiAweDgwMDApIHx8IHZlcnNfZGF0YSA+IDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpc19ub2JpdHMgfHwgISBjaGVja19kZWYpCi0JCQl7Ci0JCQkgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICBldm47Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICBpdm47Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICBpdm5hOwotCi0JCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXSAtIGxvYWRhZGRyOwotCi0JCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOwotCQkJICBpdm4udm5fbmV4dCA9IEJZVEVfR0VUIChldm4udm5fbmV4dCk7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICB1bnNpZ25lZCBsb25nICB2bmFfb2ZmOwotCi0JCQkgICAgICB2bmFfb2ZmID0gb2Zmc2V0ICsgaXZuLnZuX2F1eDsKLQotCQkJICAgICAgZG8KLQkJCQl7Ci0JCQkJICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgZXZuYTsKLQotCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCi0JCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMykiKTsKLQotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7Ci0JCQkJICBpdm5hLnZuYV9uYW1lICA9IEJZVEVfR0VUIChldm5hLnZuYV9uYW1lKTsKLQotCQkJCSAgdm5hX29mZiArPSBpdm5hLnZuYV9uZXh0OwotCQkJCX0KLQkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSB2ZXJzX2RhdGEKLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSB2ZXJzX2RhdGEpCi0JCQkJYnJlYWs7Ci0KLQkJCSAgICAgIG9mZnNldCArPSBpdm4udm5fbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdm4udm5fbmV4dCAhPSAwKTsKLQotCQkJICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gdmVyc19kYXRhKQotCQkJICAgIHsKLQkJCSAgICAgIHByaW50ZiAoIkAlcyAoJWQpIiwKLQkJCQkgICAgICBzdHJ0YWIgKyBpdm5hLnZuYV9uYW1lLCBpdm5hLnZuYV9vdGhlcik7Ci0JCQkgICAgICBjaGVja19kZWYgPSAwOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoISBpc19ub2JpdHMpCi0JCQkgICAgZXJyb3IgKF8oImJhZCBkeW5hbWljIHN5bWJvbCIpKTsKLQkJCSAgZWxzZQotCQkJICAgIGNoZWNrX2RlZiA9IDE7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGNoZWNrX2RlZikKLQkJCXsKLQkJCSAgaWYgKHZlcnNfZGF0YSAhPSAweDgwMDEpCi0JCQkgICAgewotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAgICAgaXZkOwotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggICAgaXZkYTsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgb2Zmc2V0OwotCi0JCQkgICAgICBvZmZzZXQgPQotCQkJCXZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSREVGKV0KLQkJCQktIGxvYWRhZGRyOwotCi0JCQkgICAgICBkbwotCQkJCXsKLQkJCQkgIEVsZl9FeHRlcm5hbF9WZXJkZWYgICBldmQ7Ci0KLQkJCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2ZCwgInZlcnNpb24gZGVmIik7Ci0KLQkJCQkgIGl2ZC52ZF9uZHggID0gQllURV9HRVQgKGV2ZC52ZF9uZHgpOwotCQkJCSAgaXZkLnZkX2F1eCAgPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7Ci0JCQkJICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0KLQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZkLnZkX25keCAhPSAodmVyc19kYXRhICYgMHg3ZmZmKQotCQkJCSAgICAgJiYgaXZkLnZkX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIG9mZnNldCAtPSBpdmQudmRfbmV4dDsKLQkJCSAgICAgIG9mZnNldCArPSBpdmQudmRfYXV4OwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmRhLCAidmVyc2lvbiBkZWYgYXV4Iik7Ci0KLQkJCSAgICAgIGl2ZGEudmRhX25hbWUgPSBCWVRFX0dFVCAoZXZkYS52ZGFfbmFtZSk7Ci0KLQkJCSAgICAgIGlmIChwc3ltLT5zdF9uYW1lICE9IGl2ZGEudmRhX25hbWUpCi0JCQkJcHJpbnRmICgodmVyc19kYXRhICYgMHg4MDAwKQotCQkJCQk/ICJAJXMiIDogIkBAJXMiLAotCQkJCQlzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHB1dGNoYXIgKCdcbicpOwotCSAgICB9Ci0KLQkgIGZyZWUgKHN5bXRhYik7Ci0JICBpZiAoc3RydGFiICE9IHN0cmluZ190YWJsZSkKLQkgICAgZnJlZSAoc3RydGFiKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkb19zeW1zKQotICAgIHByaW50ZgotICAgICAgKF8oIlxuRHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzcGxheWluZyBzeW1ib2xzLlxuIikpOwotCi0gIGlmIChkb19oaXN0b2dyYW0gJiYgYnVja2V0cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAqbGVuZ3RoczsKLSAgICAgIGludCAqY291bnRzOwotICAgICAgaW50IGhuOwotICAgICAgaW50IHNpOwotICAgICAgaW50IG1heGxlbmd0aCA9IDA7Ci0gICAgICBpbnQgbnplcm9fY291bnRzID0gMDsKLSAgICAgIGludCBuc3ltcyA9IDA7Ci0KLSAgICAgIHByaW50ZiAoXygiXG5IaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCAodG90YWwgb2YgJWQgYnVja2V0cyk6XG4iKSwKLQkgICAgICBuYnVja2V0cyk7Ci0gICAgICBwcmludGYgKF8oIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iKSk7Ci0KLSAgICAgIGxlbmd0aHMgPSAoaW50ICopIGNhbGxvYyAobmJ1Y2tldHMsIHNpemVvZiAoaW50KSk7Ci0gICAgICBpZiAobGVuZ3RocyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZm9yIChobiA9IDA7IGhuIDwgbmJ1Y2tldHM7ICsraG4pCi0JewotCSAgaWYgKCEgYnVja2V0cyBbaG5dKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yIChzaSA9IGJ1Y2tldHNbaG5dOyBzaTsgc2kgPSBjaGFpbnNbc2ldKQotCSAgICB7Ci0JICAgICAgKytuc3ltczsKLQkgICAgICBpZiAobWF4bGVuZ3RoIDwgKytsZW5ndGhzW2huXSkKLQkJKyttYXhsZW5ndGg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGNvdW50cyA9IChpbnQgKikgY2FsbG9jIChtYXhsZW5ndGggKyAxLCBzaXplb2YgKGludCkpOwotICAgICAgaWYgKGNvdW50cyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgKytobikKLQkrKyBjb3VudHMgW2xlbmd0aHMgW2huXV07Ci0KLSAgICAgIHByaW50ZiAoIiAgICAgIDAgICUtMTBkICglNS4xZiUlKVxuIiwKLQkgICAgICBjb3VudHNbMF0sIChjb3VudHNbMF0gKiAxMDAuMCkgLyBuYnVja2V0cyk7Ci0gICAgICBmb3IgKHNpID0gMTsgc2kgPD0gbWF4bGVuZ3RoOyArK3NpKQotCXsKLQkgIG56ZXJvX2NvdW50cyArPSBjb3VudHNbc2ldICogc2k7Ci0JICBwcmludGYgKCIlN2QgICUtMTBkICglNS4xZiUlKSAgICAlNS4xZiUlXG4iLAotCQkgIHNpLCBjb3VudHNbc2ldLCAoY291bnRzW3NpXSAqIDEwMC4wKSAvIG5idWNrZXRzLAotCQkgIChuemVyb19jb3VudHMgKiAxMDAuMCkgLyBuc3ltcyk7Ci0JfQotCi0gICAgICBmcmVlIChjb3VudHMpOwotICAgICAgZnJlZSAobGVuZ3Rocyk7Ci0gICAgfQotCi0gIGlmIChidWNrZXRzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYnVja2V0cyk7Ci0gICAgICBmcmVlIChjaGFpbnMpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19zeW1pbmZvIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMCi0gICAgICB8fCAhZG9fZHluYW1pYykKLSAgICAvKiBObyBzeW1pbmZvLCB0aGlzIGlzIG9rLiAgKi8KLSAgICByZXR1cm4gMTsKLQotICAvKiBUaGVyZSBiZXR0ZXIgc2hvdWxkIGJlIGEgZHluYW1pYyBzeW1ib2wgc2VjdGlvbi4gICovCi0gIGlmIChkeW5hbWljX3N5bWJvbHMgPT0gTlVMTCB8fCBkeW5hbWljX3N0cmluZ3MgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZHluYW1pY19hZGRyKQotICAgIHByaW50ZiAoXygiXG5EeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIpLAotCSAgICBkeW5hbWljX3N5bWluZm9fb2Zmc2V0LCBkeW5hbWljX3N5bWluZm9fbmVudCk7Ci0KLSAgcHJpbnRmIChfKCIgTnVtOiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmRUbyAgICAgRmxhZ3NcbiIpKTsKLSAgZm9yIChpID0gMDsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgc2hvcnQgaW50IGZsYWdzID0gZHluYW1pY19zeW1pbmZvW2ldLnNpX2ZsYWdzOwotCi0gICAgICBwcmludGYgKCIlNGQ6ICUtMzBzICIsIGksCi0JICAgICAgZHluYW1pY19zdHJpbmdzICsgZHluYW1pY19zeW1ib2xzW2ldLnN0X25hbWUpOwotCi0gICAgICBzd2l0Y2ggKGR5bmFtaWNfc3ltaW5mb1tpXS5zaV9ib3VuZHRvKQotCXsKLQljYXNlIFNZTUlORk9fQlRfU0VMRjoKLQkgIGZwdXRzICgiU0VMRiAgICAgICAiLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0JY2FzZSBTWU1JTkZPX0JUX1BBUkVOVDoKLQkgIGZwdXRzICgiUEFSRU5UICAgICAiLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmIChkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA+IDAKLQkgICAgICAmJiBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA8IGR5bmFtaWNfc2l6ZSkKLQkgICAgcHJpbnRmICgiJS0xMHMgIiwKLQkJICAgIGR5bmFtaWNfc3RyaW5ncwotCQkgICAgKyBkeW5hbWljX3NlZ21lbnRbZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG9dLmRfdW4uZF92YWwpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIlLTEwZCAiLCBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0RJUkVDVCkKLQlwcmludGYgKCIgRElSRUNUIik7Ci0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19QQVNTVEhSVSkKLQlwcmludGYgKCIgUEFTU1RIUlUiKTsKLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0NPUFkpCi0JcHJpbnRmICgiIENPUFkiKTsKLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0xBWllMT0FEKQotCXByaW50ZiAoIiBMQVpZTE9BRCIpOwotCi0gICAgICBwdXRzICgiIik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICBGSUxFICogZmlsZTsKLXsKLSAgcHJpbnRmIChfKCJcbkFzc2VtYmx5IGR1bXAgb2Ygc2VjdGlvbiAlc1xuIiksCi0JICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICAvKiBYWFggLS0gdG8gYmUgZG9uZSAtLS0gWFhYICovCi0KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotZHVtcF9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGJmZF9zaXplX3R5cGUgICBieXRlczsKLSAgYmZkX3ZtYSAgICAgICAgIGFkZHI7Ci0gIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0KLSAgYnl0ZXMgPSBzZWN0aW9uLT5zaF9zaXplOwotCi0gIGlmIChieXRlcyA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIpLAotCSAgICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcbkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICBhZGRyID0gc2VjdGlvbi0+c2hfYWRkcjsKLQotICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBieXRlcywgc3RhcnQsIHVuc2lnbmVkIGNoYXIgKiwKLQkJICAic2VjdGlvbiBkYXRhIik7Ci0KLSAgZGF0YSA9IHN0YXJ0OwotCi0gIHdoaWxlIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGludCBrOwotICAgICAgaW50IGxieXRlczsKLQotICAgICAgbGJ5dGVzID0gKGJ5dGVzID4gMTYgPyAxNiA6IGJ5dGVzKTsKLQotICAgICAgcHJpbnRmICgiICAweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgYWRkcik7Ci0KLSAgICAgIHN3aXRjaCAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIEVMRkRBVEEyTFNCOgotCSAgZm9yIChqID0gMTU7IGogPj0gMDsgaiAtLSkKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoIShqICYgMHgzKSkKLQkJcHJpbnRmICgiICIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUxGREFUQTJNU0I6Ci0JICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQotCQlwcmludGYgKCIgIik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgZm9yIChqID0gMDsgaiA8IGxieXRlczsgaisrKQotCXsKLQkgIGsgPSBkYXRhIFtqXTsKLQkgIGlmIChrID49ICcgJyAmJiBrIDwgMHg4MCkKLQkgICAgcHJpbnRmICgiJWMiLCBrKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiLiIpOwotCX0KLQotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0KLSAgICAgIGRhdGEgICs9IGxieXRlczsKLSAgICAgIGFkZHIgICs9IGxieXRlczsKLSAgICAgIGJ5dGVzIC09IGxieXRlczsKLSAgICB9Ci0KLSAgZnJlZSAoc3RhcnQpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludAotcmVhZF9sZWIxMjggKGRhdGEsIGxlbmd0aF9yZXR1cm4sIHNpZ24pCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICBpbnQgKiAgICAgICAgICAgbGVuZ3RoX3JldHVybjsKLSAgICAgaW50ICAgICAgICAgICAgIHNpZ247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJlc3VsdCA9IDA7Ci0gIHVuc2lnbmVkIGludCAgICAgIG51bV9yZWFkID0gMDsKLSAgaW50ICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICB1bnNpZ25lZCBjaGFyICAgICBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICogZGF0YSArKzsKLSAgICAgIG51bV9yZWFkICsrOwotCi0gICAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLQotICAgICAgc2hpZnQgKz0gNzsKLQotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICBpZiAobGVuZ3RoX3JldHVybiAhPSBOVUxMKQotICAgICogbGVuZ3RoX3JldHVybiA9IG51bV9yZWFkOwotCi0gIGlmIChzaWduICYmIChzaGlmdCA8IDMyKSAmJiAoYnl0ZSAmIDB4NDApKQotICAgIHJlc3VsdCB8PSAtMSA8PCBzaGlmdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdCBTdGF0ZV9NYWNoaW5lX1JlZ2lzdGVycwotewotICB1bnNpZ25lZCBsb25nCWFkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCAgZmlsZTsKLSAgdW5zaWduZWQgaW50ICBsaW5lOwotICB1bnNpZ25lZCBpbnQgIGNvbHVtbjsKLSAgaW50ICAgICAgICAgICBpc19zdG10OwotICBpbnQgICAgICAgICAgIGJhc2ljX2Jsb2NrOwotICBpbnQJICAgICAgICBlbmRfc2VxdWVuY2U7Ci0vKiBUaGlzIHZhcmlhYmxlIGhvbGQgdGhlIG51bWJlciBvZiB0aGUgbGFzdCBlbnRyeSBzZWVuCi0gICBpbiB0aGUgRmlsZSBUYWJsZS4gICovCi0gIHVuc2lnbmVkIGludCAgbGFzdF9maWxlX2VudHJ5OwotfSBTTVI7Ci0KLXN0YXRpYyBTTVIgc3RhdGVfbWFjaGluZV9yZWdzOwotCi1zdGF0aWMgdm9pZAotcmVzZXRfc3RhdGVfbWFjaGluZSAoaXNfc3RtdCkKLSAgICAgaW50IGlzX3N0bXQ7Ci17Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzID0gMDsKLSAgc3RhdGVfbWFjaGluZV9yZWdzLmZpbGUgPSAxOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSA9IDE7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5jb2x1bW4gPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdCA9IGlzX3N0bXQ7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5iYXNpY19ibG9jayA9IDA7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5lbmRfc2VxdWVuY2UgPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGFzdF9maWxlX2VudHJ5ID0gMDsKLX0KLQotLyogSGFuZGxlZCBhbiBleHRlbmQgbGluZSBvcC4gIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBlbmQKLSAgIG9mIHNlcXVlbmNlLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCAoZGF0YSwgaXNfc3RtdCkKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIGludCBpc19zdG10OwotewotICB1bnNpZ25lZCBjaGFyICAgb3BfY29kZTsKLSAgaW50ICAgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gIHVuc2lnbmVkIGludCAgICBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgKiBuYW1lOwotICB1bnNpZ25lZCBsb25nICAgYWRyOwotICAKLSAgbGVuID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQotICBpZiAobGVuID09IDApCi0gICAgewotICAgICAgd2FybiAoXygiYmFkbHkgZm9ybWVkIGV4dGVuZGVkIGxpbmUgb3AgZW5jb3VudGVyZWQhIikpOwotICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Ci0gICAgfQotCi0gIGxlbiArPSBieXRlc19yZWFkOwotICBvcF9jb2RlID0gKiBkYXRhICsrOwotCi0gIHByaW50ZiAoXygiICBFeHRlbmRlZCBvcGNvZGUgJWQ6ICIpLCBvcF9jb2RlKTsKLSAgCi0gIHN3aXRjaCAob3BfY29kZSkKLSAgICB7Ci0gICAgY2FzZSBEV19MTkVfZW5kX3NlcXVlbmNlOgotICAgICAgcHJpbnRmIChfKCJFbmQgb2YgU2VxdWVuY2VcblxuIikpOwotICAgICAgcmVzZXRfc3RhdGVfbWFjaGluZSAoaXNfc3RtdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgotICAgICAgLyogWFhYIC0gYXNzdW1wdGlvbiBoZXJlIHRoYXQgYWRkcmVzcyBzaXplIGlzIDQhICovCi0gICAgICBhZHIgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0gICAgICBwcmludGYgKF8oInNldCBBZGRyZXNzIHRvIDB4JWx4XG4iKSwgYWRyKTsKLSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzID0gYWRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0xORV9kZWZpbmVfZmlsZToKLSAgICAgIHByaW50ZiAoXygiICBkZWZpbmUgbmV3IEZpbGUgVGFibGUgZW50cnlcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iKSk7Ci0JIAotICAgICAgcHJpbnRmIChfKCIgICAlZFx0IiksICsrIHN0YXRlX21hY2hpbmVfcmVncy5sYXN0X2ZpbGVfZW50cnkpOwotICAgICAgbmFtZSA9IGRhdGE7Ci0gICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotICAgICAgcHJpbnRmIChfKCIlc1xuXG4iKSwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKF8oIlVOS05PV046IGxlbmd0aCAlZFxuIiksIGxlbiAtIGJ5dGVzX3JlYWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBsZW47Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19saW5lcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOwotewotICBEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm8gKiBleHRlcm5hbDsKLSAgRFdBUkYyX0ludGVybmFsX0xpbmVJbmZvICAgaW5mbzsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgc3RhbmRhcmRfb3Bjb2RlczsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgZGF0YSA9IHN0YXJ0OwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmQgID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmRfb2Zfc2VxdWVuY2U7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLSAgcHJpbnRmIChfKCJcbkR1bXAgb2YgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlczpcblxuIiksCi0JICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoZGF0YSA8IGVuZCkKLSAgICB7Ci0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm8gKikgZGF0YTsKLQotICAgICAgLyogQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgYmxvY2suICAqLwotICAgICAgaW5mby5saV9sZW5ndGggPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2xlbmd0aCk7Ci0gICAgICBpZiAoaW5mby5saV9sZW5ndGggPiBzZWN0aW9uLT5zaF9zaXplKQotCXsKLQkgIHdhcm4KLQkgICAgKF8oIlRoZSBsaW5lIGluZm8gYXBwZWFycyB0byBiZSBjb3JydXB0IC0gdGhlIHNlY3Rpb24gaXMgdG9vIHNtYWxsXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIC8qIENoZWNrIGl0cyB2ZXJzaW9uIG51bWJlci4gICovCi0gICAgICBpbmZvLmxpX3ZlcnNpb24gPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX3ZlcnNpb24pOwotICAgICAgaWYgKGluZm8ubGlfdmVyc2lvbiAhPSAyKQotCXsKLQkgIHdhcm4gKF8oIk9ubHkgRFdBUkYgdmVyc2lvbiAyIGxpbmUgaW5mbyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgCi0gICAgICBpbmZvLmxpX3Byb2xvZ3VlX2xlbmd0aCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfcHJvbG9ndWVfbGVuZ3RoKTsKLSAgICAgIGluZm8ubGlfbWluX2luc25fbGVuZ3RoID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9taW5faW5zbl9sZW5ndGgpOwotICAgICAgaW5mby5saV9kZWZhdWx0X2lzX3N0bXQgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICBpbmZvLmxpX2xpbmVfYmFzZSAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfbGluZV9iYXNlKTsKLSAgICAgIGluZm8ubGlfbGluZV9yYW5nZSAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9saW5lX3JhbmdlKTsKLSAgICAgIGluZm8ubGlfb3Bjb2RlX2Jhc2UgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9vcGNvZGVfYmFzZSk7Ci0gICAgICAKLSAgICAgIC8qIFNpZ24gZXh0ZW5kIHRoZSBsaW5lIGJhc2UgZmllbGQuICAqLwotICAgICAgaW5mby5saV9saW5lX2Jhc2UgPDw9IDI0OwotICAgICAgaW5mby5saV9saW5lX2Jhc2UgPj49IDI0OwotICAgICAgCi0gICAgICBwcmludGYgKF8oIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIpLCBpbmZvLmxpX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgRFdBUkYgVmVyc2lvbjogICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgUHJvbGd1ZSBMZW5ndGg6ICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfcHJvbG9ndWVfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBNaW5pbXVtIEluc3RydWN0aW9uIExlbmd0aDogICVkXG4iKSwgaW5mby5saV9taW5faW5zbl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIEluaXRpYWwgdmFsdWUgb2YgJ2lzX3N0bXQnOiAgJWRcbiIpLCBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICBwcmludGYgKF8oIiAgTGluZSBCYXNlOiAgICAgICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfbGluZV9iYXNlKTsKLSAgICAgIHByaW50ZiAoXygiICBMaW5lIFJhbmdlOiAgICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9saW5lX3JhbmdlKTsKLSAgICAgIHByaW50ZiAoXygiICBPcGNvZGUgQmFzZTogICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9vcGNvZGVfYmFzZSk7Ci0KLSAgICAgIGVuZF9vZl9zZXF1ZW5jZSA9IGRhdGEgKyBpbmZvLmxpX2xlbmd0aCArIHNpemVvZiAoaW5mby5saV9sZW5ndGgpOwotCi0gICAgICByZXNldF9zdGF0ZV9tYWNoaW5lIChpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICAKLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBPcGNvZGVzIHRhYmxlLiAgKi8KLSAgICAgIHN0YW5kYXJkX29wY29kZXMgPSBkYXRhICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLSAgICAgIAotICAgICAgcHJpbnRmIChfKCJcbiBPcGNvZGVzOlxuIikpOwotICAgICAgCi0gICAgICBmb3IgKGkgPSAxOyBpIDwgaW5mby5saV9vcGNvZGVfYmFzZTsgaSsrKQotCXByaW50ZiAoXygiICBPcGNvZGUgJWQgaGFzICVkIGFyZ3NcbiIpLCBpLCBzdGFuZGFyZF9vcGNvZGVzW2ldKTsKLSAgICAgIAotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIERpcmVjdG9yeSB0YWJsZS4gICovCi0gICAgICBkYXRhID0gc3RhbmRhcmRfb3Bjb2RlcyArIGluZm8ubGlfb3Bjb2RlX2Jhc2UgLSAxOwotICAgICAgCi0gICAgICBpZiAoKiBkYXRhID09IDApCi0JcHJpbnRmIChfKCJcbiBUaGUgRGlyZWN0b3J5IFRhYmxlIGlzIGVtcHR5LlxuIikpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXG4gVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIpKTsKLQkgIAotCSAgd2hpbGUgKCogZGF0YSAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCIgICVzXG4iKSwgZGF0YSk7Ci0JICAgICAgCi0JICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgLyogU2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGRhdGEgKys7Ci0gICAgICAKLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBGaWxlIE5hbWUgdGFibGUuICAqLwotICAgICAgaWYgKCogZGF0YSA9PSAwKQotCXByaW50ZiAoXygiXG4gVGhlIEZpbGUgTmFtZSBUYWJsZSBpcyBlbXB0eS5cbiIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIlxuIFRoZSBGaWxlIE5hbWUgVGFibGU6XG4iKSk7Ci0JICBwcmludGYgKF8oIiAgRW50cnlcdERpclx0VGltZVx0U2l6ZVx0TmFtZVxuIikpOwotCSAgCi0JICB3aGlsZSAoKiBkYXRhICE9IDApCi0JICAgIHsKLQkgICAgICBjaGFyICogbmFtZTsKLQkgICAgICBpbnQgYnl0ZXNfcmVhZDsKLQkgICAgICAKLQkgICAgICBwcmludGYgKF8oIiAgJWRcdCIpLCArKyBzdGF0ZV9tYWNoaW5lX3JlZ3MubGFzdF9maWxlX2VudHJ5KTsKLQkgICAgICBuYW1lID0gZGF0YTsKLQkgICAgICAKLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCSAgICAgIAotCSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiJXNcbiIpLCBuYW1lKTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgLyogU2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGRhdGEgKys7Ci0gICAgICAKLSAgICAgIC8qIE5vdyBkaXNwbGF5IHRoZSBzdGF0ZW1lbnRzLiAgKi8KLSAgICAgIHByaW50ZiAoXygiXG4gTGluZSBOdW1iZXIgU3RhdGVtZW50czpcbiIpKTsKLSAgICAgIAotICAgICAgCi0gICAgICB3aGlsZSAoZGF0YSA8IGVuZF9vZl9zZXF1ZW5jZSkKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIG9wX2NvZGU7Ci0JICBpbnQgICAgICAgICAgIGFkdjsKLQkgIGludCAgICAgICAgICAgYnl0ZXNfcmVhZDsKLQkgIAotCSAgb3BfY29kZSA9ICogZGF0YSArKzsKLQkgIAotCSAgc3dpdGNoIChvcF9jb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfTE5TX2V4dGVuZGVkX29wOgotCSAgICAgIGRhdGEgKz0gcHJvY2Vzc19leHRlbmRlZF9saW5lX29wIChkYXRhLCBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgRFdfTE5TX2NvcHk6Ci0JICAgICAgcHJpbnRmIChfKCIgIENvcHlcbiIpKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKLQkgICAgICBhZHYgPSBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aCAqIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgUEMgYnkgJWQgdG8gJWx4XG4iKSwgYWR2LAotCQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgRFdfTE5TX2FkdmFuY2VfbGluZToKLQkgICAgICBhZHYgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAxKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIExpbmUgYnkgJWQgdG8gJWRcbiIpLCBhZHYsCi0JCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5saW5lKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgRmlsZSBOYW1lIHRvIGVudHJ5ICVkIGluIHRoZSBGaWxlIE5hbWUgVGFibGVcbiIpLAotCQkgICAgICBhZHYpOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5maWxlID0gYWR2OwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19zZXRfY29sdW1uOgotCSAgICAgIGFkdiA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiAgU2V0IGNvbHVtbiB0byAlZFxuIiksIGFkdik7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmNvbHVtbiA9IGFkdjsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6Ci0JICAgICAgYWR2ID0gc3RhdGVfbWFjaGluZV9yZWdzLmlzX3N0bXQ7Ci0JICAgICAgYWR2ID0gISBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIFNldCBpc19zdG10IHRvICVkXG4iKSwgYWR2KTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdCA9IGFkdjsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIHByaW50ZiAoXygiICBTZXQgYmFzaWMgYmxvY2tcbiIpKTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYmFzaWNfYmxvY2sgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19jb25zdF9hZGRfcGM6Ci0JICAgICAgYWR2ID0gKDI1NSAtIGluZm8ubGlfb3Bjb2RlX2Jhc2UpIC8gaW5mby5saV9saW5lX3JhbmdlOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBQQyBieSBjb25zdGFudCAlZCB0byAweCVseFxuIiksIGFkdiwKLQkJICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgotCSAgICAgIGFkdiA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLQkgICAgICBkYXRhICs9IDI7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIFBDIGJ5IGZpeGVkIHNpemUgYW1vdW50ICVkIHRvIDB4JWx4XG4iKSwKLQkJICAgICAgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgb3BfY29kZSAtPSBpbmZvLmxpX29wY29kZV9iYXNlOwotCSAgICAgIGFkdiAgICAgID0gKG9wX2NvZGUgLyBpbmZvLmxpX2xpbmVfcmFuZ2UpICogaW5mby5saV9taW5faW5zbl9sZW5ndGg7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBTcGVjaWFsIG9wY29kZSAlZDogYWR2YW5jZSBBZGRyZXNzIGJ5ICVkIHRvIDB4JWx4IiksCi0JCSAgICAgIG9wX2NvZGUsIGFkdiwgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MpOwotCSAgICAgIGFkdiAgICArPSAob3BfY29kZSAlIGluZm8ubGlfbGluZV9yYW5nZSkgKyBpbmZvLmxpX2xpbmVfYmFzZTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgYW5kIExpbmUgYnkgJWQgdG8gJWRcbiIpLAotCQkgICAgICBhZHYsIHN0YXRlX21hY2hpbmVfcmVncy5saW5lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfcHVibmFtZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgRFdBUkYyX0V4dGVybmFsX1B1Yk5hbWVzICogZXh0ZXJuYWw7Ci0gIERXQVJGMl9JbnRlcm5hbF9QdWJOYW1lcyAgIHB1Ym5hbWVzOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmQ7Ci0KLSAgZW5kID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotCi0gIHByaW50ZiAoXygiQ29udGVudHMgb2YgdGhlICVzIHNlY3Rpb246XG5cbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoc3RhcnQgPCBlbmQpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0OwotCi0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXMgKikgc3RhcnQ7Ci0KLSAgICAgIHB1Ym5hbWVzLnBuX2xlbmd0aCAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX2xlbmd0aCk7Ci0gICAgICBwdWJuYW1lcy5wbl92ZXJzaW9uID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl92ZXJzaW9uKTsKLSAgICAgIHB1Ym5hbWVzLnBuX29mZnNldCAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX29mZnNldCk7Ci0gICAgICBwdWJuYW1lcy5wbl9zaXplICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl9zaXplKTsKLQotICAgICAgZGF0YSAgID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotICAgICAgc3RhcnQgKz0gcHVibmFtZXMucG5fbGVuZ3RoICsgc2l6ZW9mIChleHRlcm5hbC0+cG5fbGVuZ3RoKTsKLQotICAgICAgaWYgKHB1Ym5hbWVzLnBuX3ZlcnNpb24gIT0gMikKLQl7Ci0JICB3YXJuIChfKCJPbmx5IERXQVJGIDIgcHVibmFtZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQiKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWxkXG4iKSwKLQkgICAgICBwdWJuYW1lcy5wbl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgT2Zmc2V0IGludG8gLmRlYnVnX2luZm8gc2VjdGlvbjogICAgICVsZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoXygiICBTaXplIG9mIGFyZWEgaW4gLmRlYnVnX2luZm8gc2VjdGlvbjogJWxkXG4iKSwKLQkgICAgICBwdWJuYW1lcy5wbl9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCJcbiAgICBPZmZzZXRcdE5hbWVcbiIpKTsKLQotICAgICAgZG8KLQl7Ci0JICBvZmZzZXQgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0KLQkgIGlmIChvZmZzZXQgIT0gMCkKLQkgICAgewotCSAgICAgIGRhdGEgKz0gNDsKLQkgICAgICBwcmludGYgKCIgICAgJWxkXHRcdCVzXG4iLCBvZmZzZXQsIGRhdGEpOwotCSAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAob2Zmc2V0ICE9IDApOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X1RBR19uYW1lICh0YWcpCi0gICAgIHVuc2lnbmVkIGxvbmcgdGFnOwotewotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSBEV19UQUdfcGFkZGluZzogcmV0dXJuICJEV19UQUdfcGFkZGluZyI7Ci0gICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZTogcmV0dXJuICJEV19UQUdfYXJyYXlfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZTogcmV0dXJuICJEV19UQUdfY2xhc3NfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfZW50cnlfcG9pbnQ6IHJldHVybiAiRFdfVEFHX2VudHJ5X3BvaW50IjsKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOiByZXR1cm4gIkRXX1RBR19lbnVtZXJhdGlvbl90eXBlIjsKLSAgICBjYXNlIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyOiByZXR1cm4gIkRXX1RBR19mb3JtYWxfcGFyYW1ldGVyIjsKLSAgICBjYXNlIERXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbjogcmV0dXJuICJEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24iOwotICAgIGNhc2UgRFdfVEFHX2xhYmVsOiByZXR1cm4gIkRXX1RBR19sYWJlbCI7Ci0gICAgY2FzZSBEV19UQUdfbGV4aWNhbF9ibG9jazogcmV0dXJuICJEV19UQUdfbGV4aWNhbF9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfbWVtYmVyOiByZXR1cm4gIkRXX1RBR19tZW1iZXIiOwotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZTogcmV0dXJuICJEV19UQUdfcG9pbnRlcl90eXBlIjsKLSAgICBjYXNlIERXX1RBR19yZWZlcmVuY2VfdHlwZTogcmV0dXJuICJEV19UQUdfcmVmZXJlbmNlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2NvbXBpbGVfdW5pdDogcmV0dXJuICJEV19UQUdfY29tcGlsZV91bml0IjsKLSAgICBjYXNlIERXX1RBR19zdHJpbmdfdHlwZTogcmV0dXJuICJEV19UQUdfc3RyaW5nX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOiByZXR1cm4gIkRXX1RBR19zdHJ1Y3R1cmVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc3Vicm91dGluZV90eXBlOiByZXR1cm4gIkRXX1RBR19zdWJyb3V0aW5lX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3R5cGVkZWY6IHJldHVybiAiRFdfVEFHX3R5cGVkZWYiOwotICAgIGNhc2UgRFdfVEFHX3VuaW9uX3R5cGU6IHJldHVybiAiRFdfVEFHX3VuaW9uX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnM6IHJldHVybiAiRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMiOwotICAgIGNhc2UgRFdfVEFHX3ZhcmlhbnQ6IHJldHVybiAiRFdfVEFHX3ZhcmlhbnQiOwotICAgIGNhc2UgRFdfVEFHX2NvbW1vbl9ibG9jazogcmV0dXJuICJEV19UQUdfY29tbW9uX2Jsb2NrIjsKLSAgICBjYXNlIERXX1RBR19jb21tb25faW5jbHVzaW9uOiByZXR1cm4gIkRXX1RBR19jb21tb25faW5jbHVzaW9uIjsKLSAgICBjYXNlIERXX1RBR19pbmhlcml0YW5jZTogcmV0dXJuICJEV19UQUdfaW5oZXJpdGFuY2UiOwotICAgIGNhc2UgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZTogcmV0dXJuICJEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lIjsKLSAgICBjYXNlIERXX1RBR19tb2R1bGU6IHJldHVybiAiRFdfVEFHX21vZHVsZSI7Ci0gICAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOiByZXR1cm4gIkRXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3NldF90eXBlOiByZXR1cm4gIkRXX1RBR19zZXRfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc3VicmFuZ2VfdHlwZTogcmV0dXJuICJEV19UQUdfc3VicmFuZ2VfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfd2l0aF9zdG10OiByZXR1cm4gIkRXX1RBR193aXRoX3N0bXQiOwotICAgIGNhc2UgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbjogcmV0dXJuICJEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uIjsKLSAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6IHJldHVybiAiRFdfVEFHX2Jhc2VfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY2F0Y2hfYmxvY2s6IHJldHVybiAiRFdfVEFHX2NhdGNoX2Jsb2NrIjsKLSAgICBjYXNlIERXX1RBR19jb25zdF90eXBlOiByZXR1cm4gIkRXX1RBR19jb25zdF90eXBlIjsKLSAgICBjYXNlIERXX1RBR19jb25zdGFudDogcmV0dXJuICJEV19UQUdfY29uc3RhbnQiOwotICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0b3I6IHJldHVybiAiRFdfVEFHX2VudW1lcmF0b3IiOwotICAgIGNhc2UgRFdfVEFHX2ZpbGVfdHlwZTogcmV0dXJuICJEV19UQUdfZmlsZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19mcmllbmQ6IHJldHVybiAiRFdfVEFHX2ZyaWVuZCI7Ci0gICAgY2FzZSBEV19UQUdfbmFtZWxpc3Q6IHJldHVybiAiRFdfVEFHX25hbWVsaXN0IjsKLSAgICBjYXNlIERXX1RBR19uYW1lbGlzdF9pdGVtOiByZXR1cm4gIkRXX1RBR19uYW1lbGlzdF9pdGVtIjsKLSAgICBjYXNlIERXX1RBR19wYWNrZWRfdHlwZTogcmV0dXJuICJEV19UQUdfcGFja2VkX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N1YnByb2dyYW06IHJldHVybiAiRFdfVEFHX3N1YnByb2dyYW0iOwotICAgIGNhc2UgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW06IHJldHVybiAiRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0iOwotICAgIGNhc2UgRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtOiByZXR1cm4gIkRXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSI7Ci0gICAgY2FzZSBEV19UQUdfdGhyb3duX3R5cGU6IHJldHVybiAiRFdfVEFHX3Rocm93bl90eXBlIjsKLSAgICBjYXNlIERXX1RBR190cnlfYmxvY2s6IHJldHVybiAiRFdfVEFHX3RyeV9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfdmFyaWFudF9wYXJ0OiByZXR1cm4gIkRXX1RBR192YXJpYW50X3BhcnQiOwotICAgIGNhc2UgRFdfVEFHX3ZhcmlhYmxlOiByZXR1cm4gIkRXX1RBR192YXJpYWJsZSI7Ci0gICAgY2FzZSBEV19UQUdfdm9sYXRpbGVfdHlwZTogcmV0dXJuICJEV19UQUdfdm9sYXRpbGVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfTUlQU19sb29wOiByZXR1cm4gIkRXX1RBR19NSVBTX2xvb3AiOwotICAgIGNhc2UgRFdfVEFHX2Zvcm1hdF9sYWJlbDogcmV0dXJuICJEV19UQUdfZm9ybWF0X2xhYmVsIjsKLSAgICBjYXNlIERXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZTogcmV0dXJuICJEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGUiOwotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3RlbXBsYXRlOiByZXR1cm4gIkRXX1RBR19jbGFzc190ZW1wbGF0ZSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlzdGF0aWMgY2hhciBidWZmZXIgWzEwMF07Ci0KLQlzcHJpbnRmIChidWZmZXIsIF8oIlVua25vd24gVEFHIHZhbHVlOiAlbHgiKSwgdGFnKTsKLQlyZXR1cm4gYnVmZmVyOwotICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X0FUX25hbWUgKGF0dHJpYnV0ZSkKLSAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGU7Ci17Ci0gIHN3aXRjaCAoYXR0cmlidXRlKQotICAgIHsKLSAgICBjYXNlIERXX0FUX3NpYmxpbmc6IHJldHVybiAiRFdfQVRfc2libGluZyI7Ci0gICAgY2FzZSBEV19BVF9sb2NhdGlvbjogcmV0dXJuICJEV19BVF9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9uYW1lOiByZXR1cm4gIkRXX0FUX25hbWUiOwotICAgIGNhc2UgRFdfQVRfb3JkZXJpbmc6IHJldHVybiAiRFdfQVRfb3JkZXJpbmciOwotICAgIGNhc2UgRFdfQVRfc3Vic2NyX2RhdGE6IHJldHVybiAiRFdfQVRfc3Vic2NyX2RhdGEiOwotICAgIGNhc2UgRFdfQVRfYnl0ZV9zaXplOiByZXR1cm4gIkRXX0FUX2J5dGVfc2l6ZSI7Ci0gICAgY2FzZSBEV19BVF9iaXRfb2Zmc2V0OiByZXR1cm4gIkRXX0FUX2JpdF9vZmZzZXQiOwotICAgIGNhc2UgRFdfQVRfYml0X3NpemU6IHJldHVybiAiRFdfQVRfYml0X3NpemUiOwotICAgIGNhc2UgRFdfQVRfZWxlbWVudF9saXN0OiByZXR1cm4gIkRXX0FUX2VsZW1lbnRfbGlzdCI7Ci0gICAgY2FzZSBEV19BVF9zdG10X2xpc3Q6IHJldHVybiAiRFdfQVRfc3RtdF9saXN0IjsKLSAgICBjYXNlIERXX0FUX2xvd19wYzogcmV0dXJuICJEV19BVF9sb3dfcGMiOwotICAgIGNhc2UgRFdfQVRfaGlnaF9wYzogcmV0dXJuICJEV19BVF9oaWdoX3BjIjsKLSAgICBjYXNlIERXX0FUX2xhbmd1YWdlOiByZXR1cm4gIkRXX0FUX2xhbmd1YWdlIjsKLSAgICBjYXNlIERXX0FUX21lbWJlcjogcmV0dXJuICJEV19BVF9tZW1iZXIiOwotICAgIGNhc2UgRFdfQVRfZGlzY3I6IHJldHVybiAiRFdfQVRfZGlzY3IiOwotICAgIGNhc2UgRFdfQVRfZGlzY3JfdmFsdWU6IHJldHVybiAiRFdfQVRfZGlzY3JfdmFsdWUiOwotICAgIGNhc2UgRFdfQVRfdmlzaWJpbGl0eTogcmV0dXJuICJEV19BVF92aXNpYmlsaXR5IjsKLSAgICBjYXNlIERXX0FUX2ltcG9ydDogcmV0dXJuICJEV19BVF9pbXBvcnQiOwotICAgIGNhc2UgRFdfQVRfc3RyaW5nX2xlbmd0aDogcmV0dXJuICJEV19BVF9zdHJpbmdfbGVuZ3RoIjsKLSAgICBjYXNlIERXX0FUX2NvbW1vbl9yZWZlcmVuY2U6IHJldHVybiAiRFdfQVRfY29tbW9uX3JlZmVyZW5jZSI7Ci0gICAgY2FzZSBEV19BVF9jb21wX2RpcjogcmV0dXJuICJEV19BVF9jb21wX2RpciI7Ci0gICAgY2FzZSBEV19BVF9jb25zdF92YWx1ZTogcmV0dXJuICJEV19BVF9jb25zdF92YWx1ZSI7Ci0gICAgY2FzZSBEV19BVF9jb250YWluaW5nX3R5cGU6IHJldHVybiAiRFdfQVRfY29udGFpbmluZ190eXBlIjsKLSAgICBjYXNlIERXX0FUX2RlZmF1bHRfdmFsdWU6IHJldHVybiAiRFdfQVRfZGVmYXVsdF92YWx1ZSI7Ci0gICAgY2FzZSBEV19BVF9pbmxpbmU6IHJldHVybiAiRFdfQVRfaW5saW5lIjsKLSAgICBjYXNlIERXX0FUX2lzX29wdGlvbmFsOiByZXR1cm4gIkRXX0FUX2lzX29wdGlvbmFsIjsKLSAgICBjYXNlIERXX0FUX2xvd2VyX2JvdW5kOiByZXR1cm4gIkRXX0FUX2xvd2VyX2JvdW5kIjsKLSAgICBjYXNlIERXX0FUX3Byb2R1Y2VyOiByZXR1cm4gIkRXX0FUX3Byb2R1Y2VyIjsKLSAgICBjYXNlIERXX0FUX3Byb3RvdHlwZWQ6IHJldHVybiAiRFdfQVRfcHJvdG90eXBlZCI7Ci0gICAgY2FzZSBEV19BVF9yZXR1cm5fYWRkcjogcmV0dXJuICJEV19BVF9yZXR1cm5fYWRkciI7Ci0gICAgY2FzZSBEV19BVF9zdGFydF9zY29wZTogcmV0dXJuICJEV19BVF9zdGFydF9zY29wZSI7Ci0gICAgY2FzZSBEV19BVF9zdHJpZGVfc2l6ZTogcmV0dXJuICJEV19BVF9zdHJpZGVfc2l6ZSI7Ci0gICAgY2FzZSBEV19BVF91cHBlcl9ib3VuZDogcmV0dXJuICJEV19BVF91cHBlcl9ib3VuZCI7Ci0gICAgY2FzZSBEV19BVF9hYnN0cmFjdF9vcmlnaW46IHJldHVybiAiRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIjsKLSAgICBjYXNlIERXX0FUX2FjY2Vzc2liaWxpdHk6IHJldHVybiAiRFdfQVRfYWNjZXNzaWJpbGl0eSI7Ci0gICAgY2FzZSBEV19BVF9hZGRyZXNzX2NsYXNzOiByZXR1cm4gIkRXX0FUX2FkZHJlc3NfY2xhc3MiOwotICAgIGNhc2UgRFdfQVRfYXJ0aWZpY2lhbDogcmV0dXJuICJEV19BVF9hcnRpZmljaWFsIjsKLSAgICBjYXNlIERXX0FUX2Jhc2VfdHlwZXM6IHJldHVybiAiRFdfQVRfYmFzZV90eXBlcyI7Ci0gICAgY2FzZSBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb246IHJldHVybiAiRFdfQVRfY2FsbGluZ19jb252ZW50aW9uIjsKLSAgICBjYXNlIERXX0FUX2NvdW50OiByZXR1cm4gIkRXX0FUX2NvdW50IjsKLSAgICBjYXNlIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uIjsKLSAgICBjYXNlIERXX0FUX2RlY2xfY29sdW1uOiByZXR1cm4gIkRXX0FUX2RlY2xfY29sdW1uIjsKLSAgICBjYXNlIERXX0FUX2RlY2xfZmlsZTogcmV0dXJuICJEV19BVF9kZWNsX2ZpbGUiOwotICAgIGNhc2UgRFdfQVRfZGVjbF9saW5lOiByZXR1cm4gIkRXX0FUX2RlY2xfbGluZSI7Ci0gICAgY2FzZSBEV19BVF9kZWNsYXJhdGlvbjogcmV0dXJuICJEV19BVF9kZWNsYXJhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9kaXNjcl9saXN0OiByZXR1cm4gIkRXX0FUX2Rpc2NyX2xpc3QiOwotICAgIGNhc2UgRFdfQVRfZW5jb2Rpbmc6IHJldHVybiAiRFdfQVRfZW5jb2RpbmciOwotICAgIGNhc2UgRFdfQVRfZXh0ZXJuYWw6IHJldHVybiAiRFdfQVRfZXh0ZXJuYWwiOwotICAgIGNhc2UgRFdfQVRfZnJhbWVfYmFzZTogcmV0dXJuICJEV19BVF9mcmFtZV9iYXNlIjsKLSAgICBjYXNlIERXX0FUX2ZyaWVuZDogcmV0dXJuICJEV19BVF9mcmllbmQiOwotICAgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOiByZXR1cm4gIkRXX0FUX2lkZW50aWZpZXJfY2FzZSI7Ci0gICAgY2FzZSBEV19BVF9tYWNyb19pbmZvOiByZXR1cm4gIkRXX0FUX21hY3JvX2luZm8iOwotICAgIGNhc2UgRFdfQVRfbmFtZWxpc3RfaXRlbXM6IHJldHVybiAiRFdfQVRfbmFtZWxpc3RfaXRlbXMiOwotICAgIGNhc2UgRFdfQVRfcHJpb3JpdHk6IHJldHVybiAiRFdfQVRfcHJpb3JpdHkiOwotICAgIGNhc2UgRFdfQVRfc2VnbWVudDogcmV0dXJuICJEV19BVF9zZWdtZW50IjsKLSAgICBjYXNlIERXX0FUX3NwZWNpZmljYXRpb246IHJldHVybiAiRFdfQVRfc3BlY2lmaWNhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9zdGF0aWNfbGluazogcmV0dXJuICJEV19BVF9zdGF0aWNfbGluayI7Ci0gICAgY2FzZSBEV19BVF90eXBlOiByZXR1cm4gIkRXX0FUX3R5cGUiOwotICAgIGNhc2UgRFdfQVRfdXNlX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX3VzZV9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXI6IHJldHVybiAiRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyIjsKLSAgICBjYXNlIERXX0FUX3ZpcnR1YWxpdHk6IHJldHVybiAiRFdfQVRfdmlydHVhbGl0eSI7Ci0gICAgY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjogcmV0dXJuICJEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2ZkZTogcmV0dXJuICJEV19BVF9NSVBTX2ZkZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2xvb3BfYmVnaW46IHJldHVybiAiRFdfQVRfTUlQU19sb29wX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfZXBpbG9nX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yOiByZXR1cm4gIkRXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yIjsKLSAgICBjYXNlIERXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGg6IHJldHVybiAiRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZTogcmV0dXJuICJEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX3N0cmlkZTogcmV0dXJuICJEV19BVF9NSVBTX3N0cmlkZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWU6IHJldHVybiAiRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lIjsKLSAgICBjYXNlIERXX0FUX01JUFNfY2xvbmVfb3JpZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfY2xvbmVfb3JpZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfaGFzX2lubGluZXM6IHJldHVybiAiRFdfQVRfTUlQU19oYXNfaW5saW5lcyI7Ci0gICAgY2FzZSBEV19BVF9zZl9uYW1lczogcmV0dXJuICJEV19BVF9zZl9uYW1lcyI7Ci0gICAgY2FzZSBEV19BVF9zcmNfaW5mbzogcmV0dXJuICJEV19BVF9zcmNfaW5mbyI7Ci0gICAgY2FzZSBEV19BVF9tYWNfaW5mbzogcmV0dXJuICJEV19BVF9tYWNfaW5mbyI7Ci0gICAgY2FzZSBEV19BVF9zcmNfY29vcmRzOiByZXR1cm4gIkRXX0FUX3NyY19jb29yZHMiOwotICAgIGNhc2UgRFdfQVRfYm9keV9iZWdpbjogcmV0dXJuICJEV19BVF9ib2R5X2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX2JvZHlfZW5kOiByZXR1cm4gIkRXX0FUX2JvZHlfZW5kIjsKLSAgICBkZWZhdWx0OgotICAgICAgewotCXN0YXRpYyBjaGFyIGJ1ZmZlciBbMTAwXTsKLQotCXNwcmludGYgKGJ1ZmZlciwgXygiVW5rbm93biBBVCB2YWx1ZTogJWx4IiksIGF0dHJpYnV0ZSk7Ci0JcmV0dXJuIGJ1ZmZlcjsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9GT1JNX25hbWUgKGZvcm0pCi0gICAgIHVuc2lnbmVkIGxvbmcgZm9ybTsKLXsKLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjogcmV0dXJuICJEV19GT1JNX2FkZHIiOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6IHJldHVybiAiRFdfRk9STV9ibG9jazIiOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6IHJldHVybiAiRFdfRk9STV9ibG9jazQiOwotICAgIGNhc2UgRFdfRk9STV9kYXRhMjogcmV0dXJuICJEV19GT1JNX2RhdGEyIjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6IHJldHVybiAiRFdfRk9STV9kYXRhNCI7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OiByZXR1cm4gIkRXX0ZPUk1fZGF0YTgiOwotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6IHJldHVybiAiRFdfRk9STV9zdHJpbmciOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazogcmV0dXJuICJEV19GT1JNX2Jsb2NrIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOiByZXR1cm4gIkRXX0ZPUk1fYmxvY2sxIjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTE6IHJldHVybiAiRFdfRk9STV9kYXRhMSI7Ci0gICAgY2FzZSBEV19GT1JNX2ZsYWc6IHJldHVybiAiRFdfRk9STV9mbGFnIjsKLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6IHJldHVybiAiRFdfRk9STV9zZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX3N0cnA6IHJldHVybiAiRFdfRk9STV9zdHJwIjsKLSAgICBjYXNlIERXX0ZPUk1fdWRhdGE6IHJldHVybiAiRFdfRk9STV91ZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOiByZXR1cm4gIkRXX0ZPUk1fcmVmX2FkZHIiOwotICAgIGNhc2UgRFdfRk9STV9yZWYxOiByZXR1cm4gIkRXX0ZPUk1fcmVmMSI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjI6IHJldHVybiAiRFdfRk9STV9yZWYyIjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmNDogcmV0dXJuICJEV19GT1JNX3JlZjQiOwotICAgIGNhc2UgRFdfRk9STV9yZWY4OiByZXR1cm4gIkRXX0ZPUk1fcmVmOCI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YTogcmV0dXJuICJEV19GT1JNX3JlZl91ZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OiByZXR1cm4gIkRXX0ZPUk1faW5kaXJlY3QiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyIFsxMDBdOwotCi0Jc3ByaW50ZiAoYnVmZmVyLCBfKCJVbmtub3duIEZPUk0gdmFsdWU6ICVseCIpLCBmb3JtKTsKLQlyZXR1cm4gYnVmZmVyOwotICAgICAgfQotICAgIH0KLX0KLQotLyogRklYTUU6ICBUaGVyZSBhcmUgYmV0dGVyIGFuZCBtb3JlIGVmZmllY2ludCB3YXlzIHRvIGhhbmRsZQotICAgdGhlc2Ugc3RydWN0dXJlcy4gIEZvciBub3cgdGhvdWdoLCBJIGp1c3Qgd2FudCBzb21ldGhpbmcgdGhhdAotICAgaXMgc2ltcGxlIHRvIGltcGxlbWVudC4gICovCi10eXBlZGVmIHN0cnVjdCBhYmJyZXZfYXR0cgotewotICB1bnNpZ25lZCBsb25nICAgICAgICBhdHRyaWJ1dGU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgIGZvcm07Ci0gIHN0cnVjdCBhYmJyZXZfYXR0ciAqIG5leHQ7Ci19Ci1hYmJyZXZfYXR0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgYWJicmV2X2VudHJ5Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZW50cnk7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdGFnOwotICBpbnQgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOwotICBzdHJ1Y3QgYWJicmV2X2F0dHIgKiAgIGZpcnN0X2F0dHI7Ci0gIHN0cnVjdCBhYmJyZXZfYXR0ciAqICAgbGFzdF9hdHRyOwotICBzdHJ1Y3QgYWJicmV2X2VudHJ5ICogIG5leHQ7Ci19Ci1hYmJyZXZfZW50cnk7Ci0KLXN0YXRpYyBhYmJyZXZfZW50cnkgKiBmaXJzdF9hYmJyZXYgPSBOVUxMOwotc3RhdGljIGFiYnJldl9lbnRyeSAqIGxhc3RfYWJicmV2ID0gTlVMTDsKLQotc3RhdGljIHZvaWQKLWZyZWVfYWJicmV2cyBQQVJBTVMgKCh2b2lkKSkKLXsKLSAgYWJicmV2X2VudHJ5ICogYWJicmV2OwotCi0gIGZvciAoYWJicmV2ID0gZmlyc3RfYWJicmV2OyBhYmJyZXY7KQotICAgIHsKLSAgICAgIGFiYnJldl9lbnRyeSAqIG5leHQgPSBhYmJyZXYtPm5leHQ7Ci0gICAgICBhYmJyZXZfYXR0ciAgKiBhdHRyOwotCi0gICAgICBmb3IgKGF0dHIgPSBhYmJyZXYtPmZpcnN0X2F0dHI7IGF0dHI7KQotCXsKLQkgIGFiYnJldl9hdHRyICogbmV4dCA9IGF0dHItPm5leHQ7Ci0KLQkgIGZyZWUgKGF0dHIpOwotCSAgYXR0ciA9IG5leHQ7Ci0JfQotCi0gICAgICBmcmVlIChhYmJyZXYpOwotICAgICAgYWJicmV2ID0gbmV4dDsKLSAgICB9Ci0KLSAgbGFzdF9hYmJyZXYgPSBmaXJzdF9hYmJyZXYgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotYWRkX2FiYnJldiAobnVtYmVyLCB0YWcsIGNoaWxkcmVuKQotICAgICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgICAgdW5zaWduZWQgbG9uZyB0YWc7Ci0gICAgIGludCAgICAgICAgICAgY2hpbGRyZW47Ci17Ci0gIGFiYnJldl9lbnRyeSAqIGVudHJ5OwotCi0gIGVudHJ5ID0gKGFiYnJldl9lbnRyeSAqKSBtYWxsb2MgKHNpemVvZiAoKiBlbnRyeSkpOwotCi0gIGlmIChlbnRyeSA9PSBOVUxMKQotICAgIC8qIHVnZyAqLwotICAgIHJldHVybjsKLQotICBlbnRyeS0+ZW50cnkgICAgICA9IG51bWJlcjsKLSAgZW50cnktPnRhZyAgICAgICAgPSB0YWc7Ci0gIGVudHJ5LT5jaGlsZHJlbiAgID0gY2hpbGRyZW47Ci0gIGVudHJ5LT5maXJzdF9hdHRyID0gTlVMTDsKLSAgZW50cnktPmxhc3RfYXR0ciAgPSBOVUxMOwotICBlbnRyeS0+bmV4dCAgICAgICA9IE5VTEw7Ci0KLSAgaWYgKGZpcnN0X2FiYnJldiA9PSBOVUxMKQotICAgIGZpcnN0X2FiYnJldiA9IGVudHJ5OwotICBlbHNlCi0gICAgbGFzdF9hYmJyZXYtPm5leHQgPSBlbnRyeTsKLQotICBsYXN0X2FiYnJldiA9IGVudHJ5OwotfQotCi1zdGF0aWMgdm9pZAotYWRkX2FiYnJldl9hdHRyIChhdHRyaWJ1dGUsIGZvcm0pCi0gICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlOwotICAgICB1bnNpZ25lZCBsb25nIGZvcm07Ci17Ci0gIGFiYnJldl9hdHRyICogYXR0cjsKLQotICBhdHRyID0gKGFiYnJldl9hdHRyICopIG1hbGxvYyAoc2l6ZW9mICgqIGF0dHIpKTsKLQotICBpZiAoYXR0ciA9PSBOVUxMKQotICAgIC8qIHVnZyAqLwotICAgIHJldHVybjsKLQotICBhdHRyLT5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gIGF0dHItPmZvcm0gICAgICA9IGZvcm07Ci0gIGF0dHItPm5leHQgICAgICA9IE5VTEw7Ci0KLSAgaWYgKGxhc3RfYWJicmV2LT5maXJzdF9hdHRyID09IE5VTEwpCi0gICAgbGFzdF9hYmJyZXYtPmZpcnN0X2F0dHIgPSBhdHRyOwotICBlbHNlCi0gICAgbGFzdF9hYmJyZXYtPmxhc3RfYXR0ci0+bmV4dCA9IGF0dHI7Ci0KLSAgbGFzdF9hYmJyZXYtPmxhc3RfYXR0ciA9IGF0dHI7Ci19Ci0KLS8qIFByb2Nlc3NlcyB0aGUgKHBhcnRpYWwpIGNvbnRlbnRzIG9mIGEgLmRlYnVnX2FiYnJldiBzZWN0aW9uLgotICAgUmV0dXJucyBOVUxMIGlmIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2FzIGVuY291bnRlcmVkLgotICAgUmV0dXJucyB0aGUgYWRkcmVzcyBhZnRlciB0aGUgbGFzdCBieXRlIHJlYWQgaWYgdGhlIGVuZCBvZgotICAgYW4gYWJicmV2aWF0aW9uIHNldCB3YXMgZm91bmQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1wcm9jZXNzX2FiYnJldl9zZWN0aW9uIChzdGFydCwgZW5kKQotICAgICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiBlbmQ7Ci17Ci0gIGlmIChmaXJzdF9hYmJyZXYgIT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB3aGlsZSAoc3RhcnQgPCBlbmQpCi0gICAgewotICAgICAgaW50ICAgICAgICAgICBieXRlc19yZWFkOwotICAgICAgdW5zaWduZWQgbG9uZyBlbnRyeTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGFnOwotICAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGU7Ci0gICAgICBpbnQgICAgICAgICAgIGNoaWxkcmVuOwotCi0gICAgICBlbnRyeSA9IHJlYWRfbGViMTI4IChzdGFydCwgJiBieXRlc19yZWFkLCAwKTsKLSAgICAgIHN0YXJ0ICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICAgIGlmIChlbnRyeSA9PSAwKQotCXJldHVybiBzdGFydDsKLQotICAgICAgdGFnID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotICAgICAgY2hpbGRyZW4gPSAqIHN0YXJ0ICsrOwotCi0gICAgICBhZGRfYWJicmV2IChlbnRyeSwgdGFnLCBjaGlsZHJlbik7Ci0KLSAgICAgIGRvCi0JewotCSAgdW5zaWduZWQgbG9uZyBmb3JtOwotCi0JICBhdHRyaWJ1dGUgPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICBzdGFydCArPSBieXRlc19yZWFkOwotCi0JICBmb3JtID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotCSAgaWYgKGF0dHJpYnV0ZSAhPSAwKQotCSAgICBhZGRfYWJicmV2X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSk7Ci0JfQotICAgICAgd2hpbGUgKGF0dHJpYnV0ZSAhPSAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19hYmJyZXYgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgYWJicmV2X2VudHJ5ICogZW50cnk7Ci0gIHVuc2lnbmVkIGNoYXIgKiBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiB0aGUgJXMgc2VjdGlvbjpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIGRvCi0gICAgewotICAgICAgc3RhcnQgPSBwcm9jZXNzX2FiYnJldl9zZWN0aW9uIChzdGFydCwgZW5kKTsKLQotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBUQUdcbiIpKTsKLQotICAgICAgZm9yIChlbnRyeSA9IGZpcnN0X2FiYnJldjsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JewotCSAgYWJicmV2X2F0dHIgKiBhdHRyOwotCi0JICBwcmludGYgKF8oIiAgICVsZCAgICAgICVzICAgIFslc11cbiIpLAotCQkgIGVudHJ5LT5lbnRyeSwKLQkJICBnZXRfVEFHX25hbWUgKGVudHJ5LT50YWcpLAotCQkgIGVudHJ5LT5jaGlsZHJlbiA/IF8oImhhcyBjaGlsZHJlbiIpIDogXygibm8gY2hpbGRyZW4iKSk7Ci0KLQkgIGZvciAoYXR0ciA9IGVudHJ5LT5maXJzdF9hdHRyOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoXygiICAgICUtMThzICVzXG4iKSwKLQkJICAgICAgZ2V0X0FUX25hbWUgKGF0dHItPmF0dHJpYnV0ZSksCi0JCSAgICAgIGdldF9GT1JNX25hbWUgKGF0dHItPmZvcm0pKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHdoaWxlIChzdGFydCk7Ci0KLSAgcHJpbnRmICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1kaXNwbGF5X2Jsb2NrIChkYXRhLCBsZW5ndGgpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICB1bnNpZ25lZCBsb25nICAgbGVuZ3RoOwotewotICBwcmludGYgKF8oIiAlbHUgYnl0ZSBibG9jazogIiksIGxlbmd0aCk7Ci0KLSAgd2hpbGUgKGxlbmd0aCAtLSkKLSAgICBwcmludGYgKCIlbHggIiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhICsrLCAxKSk7Ci0KLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbiAoZGF0YSwgcG9pbnRlcl9zaXplKQotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICAgIHBvaW50ZXJfc2l6ZTsKLXsKLSAgdW5zaWduZWQgY2hhciBvcDsKLSAgaW50ICAgICAgICAgICBieXRlc19yZWFkOwotICB1bnNpZ25lZCBsb25nIHV2YWx1ZTsKLQotICBvcCA9ICogZGF0YSArKzsKLQotICBzd2l0Y2ggKG9wKQotICAgIHsKLSAgICBjYXNlIERXX09QX2FkZHI6Ci0gICAgICBwcmludGYgKCJEV19PUF9hZGRyOiAlbHgiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIHBvaW50ZXJfc2l6ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kZXJlZjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2RlcmVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MXU6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDF1OiAlbHUiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3QxczoKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0MXM6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDJ1OgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3QydTogJWx1IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MnM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDJzOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q0dToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0NHU6ICVsdSIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDRzOgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3Q0czogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0OHU6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDh1OiAlbHUgJWx1IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0OHM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDhzOiAlbGQgJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSwKLQkgICAgICAobG9uZykgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0dToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0dTogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3RzOgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3RzOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kdXA6Ci0gICAgICBwcmludGYgKCJEV19PUF9kdXAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZHJvcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2Ryb3AiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfb3ZlcjoKLSAgICAgIHByaW50ZiAoIkRXX09QX292ZXIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGljazoKLSAgICAgIHByaW50ZiAoIkRXX09QX3BpY2s6ICVsZCIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zd2FwOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc3dhcCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yb3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9yb3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfeGRlcmVmOgotICAgICAgcHJpbnRmICgiRFdfT1BfeGRlcmVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2FiczoKLSAgICAgIHByaW50ZiAoIkRXX09QX2FicyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9hbmQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9hbmQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZGl2OgotICAgICAgcHJpbnRmICgiRFdfT1BfZGl2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX21pbnVzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbWludXMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbW9kOgotICAgICAgcHJpbnRmICgiRFdfT1BfbW9kIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX211bDoKLSAgICAgIHByaW50ZiAoIkRXX09QX211bCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9uZWc6Ci0gICAgICBwcmludGYgKCJEV19PUF9uZWciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfbm90OgotICAgICAgcHJpbnRmICgiRFdfT1Bfbm90Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX29yOgotICAgICAgcHJpbnRmICgiRFdfT1Bfb3IiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGx1czoKLSAgICAgIHByaW50ZiAoIkRXX09QX3BsdXMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGx1c191Y29uc3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9wbHVzX3Vjb25zdDogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2hsOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2hsIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3NocjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3NociIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zaHJhOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2hyYSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF94b3I6Ci0gICAgICBwcmludGYgKCJEV19PUF94b3IiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJhOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJhOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZXE6Ci0gICAgICBwcmludGYgKCJEV19PUF9lcSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9nZToKLSAgICAgIHByaW50ZiAoIkRXX09QX2dlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2d0OgotICAgICAgcHJpbnRmICgiRFdfT1BfZ3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGU6Ci0gICAgICBwcmludGYgKCJEV19PUF9sZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9sdDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2x0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX25lOgotICAgICAgcHJpbnRmICgiRFdfT1BfbmUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2tpcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3NraXA6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQwOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ0OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ1OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ2OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ3OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ4OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0OCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ5OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0OSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDEwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDExOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTI6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxMiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDEzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE0OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTU6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxNSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE3OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTg6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxOCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxOToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIwOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjE6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDIyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyNCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI2OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0Mjc6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyNyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI5OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQzMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQzMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDMxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzM6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWczIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzU6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzY6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzc6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzg6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzk6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzEwOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTE6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzEyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzEzOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxNCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE2OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTc6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxNyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxODoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE5OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjA6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzIyOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjM6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyMyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI1OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjY6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyNiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI4OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjk6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyOSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWczMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzMwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzMxOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMzEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzM6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzU6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzY6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzc6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzg6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzk6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnOTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEwOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzEwOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEzOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzEzOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTQ6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE2OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE2OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTc6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTc6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE5OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE5OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjA6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIyOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzIyOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjM6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI1OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI1OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjY6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjY6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI4OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI4OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjk6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjk6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWczMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWczMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzMxOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzMxOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWd4OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVneDogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZmJyZWc6Ci0gICAgICBwcmludGYgKCJEV19PUF9mYnJlZzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZ3g6Ci0gICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJmJ5dGVzX3JlYWQsIDApOwotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZ3g6ICVsdSAlbGQiLCB1dmFsdWUsCi0JICAgICAgcmVhZF9sZWIxMjggKGRhdGEgKyBieXRlc19yZWFkLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3BpZWNlOgotICAgICAgcHJpbnRmICgiRFdfT1BfcGllY2U6ICVsdSIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2RlcmVmX3NpemU6Ci0gICAgICBwcmludGYgKCJEV19PUF9kZXJlZl9zaXplOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfeGRlcmVmX3NpemU6Ci0gICAgICBwcmludGYgKCJEV19PUF94ZGVyZWZfc2l6ZTogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX25vcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX25vcCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKG9wID49IERXX09QX2xvX3VzZXIKLQkgICYmIG9wIDw9IERXX09QX2hpX3VzZXIpCi0JcHJpbnRmIChfKCIoVXNlciBkZWZpbmVkIGxvY2F0aW9uIG9wKSIpKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKF8oIihVbmtub3duIGxvY2F0aW9uIG9wKSIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1yZWFkX2FuZF9kaXNwbGF5X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSwgZGF0YSwgcG9pbnRlcl9zaXplKQotICAgICB1bnNpZ25lZCBsb25nICAgYXR0cmlidXRlOwotICAgICB1bnNpZ25lZCBsb25nICAgZm9ybTsKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICBwb2ludGVyX3NpemU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICB1dmFsdWU7Ci0gIHVuc2lnbmVkIGNoYXIgKiBibG9ja19zdGFydDsKLSAgaW50ICAgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gIGludAkJICBpc19yZWYgPSAwOwotCi0gIHByaW50ZiAoIiAgICAgJS0xOHM6IiwgZ2V0X0FUX25hbWUgKGF0dHJpYnV0ZSkpOwotCi0gIHN3aXRjaCAoZm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgotICAgIGNhc2UgRFdfRk9STV9yZWYxOgotICAgIGNhc2UgRFdfRk9STV9yZWYyOgotICAgIGNhc2UgRFdfRk9STV9yZWY0OgotICAgIGNhc2UgRFdfRk9STV9yZWY4OgotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6Ci0gICAgICBpc19yZWYgPSAxOwotICAgIH0KLQotICBzd2l0Y2ggKGZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCBwb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwleD4iIDogIiAlI3giLCB1dmFsdWUpOwotICAgICAgZGF0YSArPSBwb2ludGVyX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWYxOgotICAgIGNhc2UgRFdfRk9STV9mbGFnOgotICAgIGNhc2UgRFdfRk9STV9kYXRhMToKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhICsrLCAxKTsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JXg+IiA6ICIgJWQiLCB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmMjoKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTI6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0gICAgICBkYXRhICs9IDI7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCV4PiIgOiAiICVkIiwgdXZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZjQ6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE0OgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDQpOwotICAgICAgZGF0YSArPSA0OwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwleD4iIDogIiAlZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWY4OgotICAgIGNhc2UgRFdfRk9STV9kYXRhODoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLSAgICAgIHByaW50ZiAoIiAlbHgiLCB1dmFsdWUpOwotICAgICAgcHJpbnRmICgiICVseCIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsKLSAgICAgIGRhdGEgKz0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3N0cmluZzoKLSAgICAgIHByaW50ZiAoIiAlcyIsIGRhdGEpOwotICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3NkYXRhOgotICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMSk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKCIgJWxkIiwgKGxvbmcpIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6Ci0gICAgY2FzZSBEV19GT1JNX3VkYXRhOgotICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCVseD4iIDogIiAlbGQiLCB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6Ci0gICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIGJ5dGVzX3JlYWQ7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDEpOwotICAgICAgYmxvY2tfc3RhcnQgPSBkYXRhICsgMTsKLSAgICAgIGRhdGEgPSBkaXNwbGF5X2Jsb2NrIChibG9ja19zdGFydCwgdXZhbHVlKTsKLSAgICAgIHV2YWx1ZSA9ICogYmxvY2tfc3RhcnQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0gICAgICBibG9ja19zdGFydCA9IGRhdGEgKyAyOwotICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOwotICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIDQ7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fc3RycDoKLSAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6Ci0gICAgICB3YXJuIChfKCJVbmFibGUgdG8gaGFuZGxlIEZPUk06ICVkIiksIGZvcm0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgd2FybiAoXygiVW5yZWNvZ25pc2VkIGZvcm06ICVkIiksIGZvcm0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEZvciBzb21lIGF0dHJpYnV0ZXMgd2UgY2FuIGRpc3BsYXkgZnV0aGVyIGluZm9ybWF0aW9uLiAgKi8KLQotICBwcmludGYgKCJcdCIpOwotCi0gIHN3aXRjaCAoYXR0cmlidXRlKQotICAgIHsKLSAgICBjYXNlIERXX0FUX2lubGluZToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0lOTF9ub3RfaW5saW5lZDogICAgICAgICAgcHJpbnRmIChfKCIobm90IGlubGluZWQpIikpOyBicmVhazsKLQljYXNlIERXX0lOTF9pbmxpbmVkOiAgICAgICAgICAgICAgcHJpbnRmIChfKCIoaW5saW5lZCkiKSk7IGJyZWFrOwotCWNhc2UgRFdfSU5MX2RlY2xhcmVkX25vdF9pbmxpbmVkOiBwcmludGYgKF8oIihkZWNsYXJlZCBhcyBpbmxpbmUgYnV0IGlnbm9yZWQpIikpOyBicmVhazsKLQljYXNlIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkOiAgICAgcHJpbnRmIChfKCIoZGVjbGFyZWQgYXMgaW5saW5lIGFuZCBpbmxpbmVkKSIpKTsgYnJlYWs7Ci0JZGVmYXVsdDogcHJpbnRmIChfKCIgIChVbmtub3duIGlubGluZSBhdHRyaWJ1dGUgdmFsdWU6ICVseCkiKSwgdXZhbHVlKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2ZyYW1lX2Jhc2U6Ci0gICAgICBpZiAodXZhbHVlID49IERXX09QX3JlZzAgJiYgdXZhbHVlIDw9IERXX09QX3JlZzMxKQotCXByaW50ZiAoIihyZWcgJWxkKSIsIHV2YWx1ZSAtIERXX09QX3JlZzApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2xhbmd1YWdlOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfTEFOR19DOiAgICAgICAgICAgICAgcHJpbnRmICgiKG5vbi1BTlNJIEMpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19DODk6ICAgICAgICAgICAgcHJpbnRmICgiKEFOU0kgQykiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0NfcGx1c19wbHVzOiAgICBwcmludGYgKCIoQysrKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfRm9ydHJhbjc3OiAgICAgIHByaW50ZiAoIihGT1JUUkFOIDc3KSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfRm9ydHJhbjkwOiAgICAgIHByaW50ZiAoIihGb3J0cmFuIDkwKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfTW9kdWxhMjogICAgICAgIHByaW50ZiAoIihNb2R1bGEgMikiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX1Bhc2NhbDgzOiAgICAgICBwcmludGYgKCIoQU5TSSBQYXNjYWwpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19BZGE4MzogICAgICAgICAgcHJpbnRmICgiKEFkYSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0NvYm9sNzQ6ICAgICAgICBwcmludGYgKCIoQ29ib2wgNzQpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19Db2JvbDg1OiAgICAgICAgcHJpbnRmICgiKENvYm9sIDg1KSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfTWlwc19Bc3NlbWJsZXI6IHByaW50ZiAoIihNSVBTIGFzc2VtYmxlcikiKTsgYnJlYWs7Ci0JZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIoVW5rbm93bjogJWx4KSIsIHV2YWx1ZSk7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9lbmNvZGluZzoKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0FURV92b2lkOiAgICAgICAgICAgIHByaW50ZiAoIih2b2lkKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9hZGRyZXNzOiAgICAgICAgIHByaW50ZiAoIihtYWNoaW5lIGFkZHJlc3MpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2Jvb2xlYW46ICAgICAgICAgcHJpbnRmICgiKGJvb2xlYW4pIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2NvbXBsZXhfZmxvYXQ6ICAgcHJpbnRmICgiKGNvbXBsZXggZmxvYXQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2Zsb2F0OiAgICAgICAgICAgcHJpbnRmICgiKGZsb2F0KSIpOyBicmVhazsKLQljYXNlIERXX0FURV9zaWduZWQ6ICAgICAgICAgIHByaW50ZiAoIihzaWduZWQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX3NpZ25lZF9jaGFyOiAgICAgcHJpbnRmICgiKHNpZ25lZCBjaGFyKSIpOyBicmVhazsKLQljYXNlIERXX0FURV91bnNpZ25lZDogICAgICAgIHByaW50ZiAoIih1bnNpZ25lZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfdW5zaWduZWRfY2hhcjogICBwcmludGYgKCIodW5zaWduZWQgY2hhcikiKTsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmICh1dmFsdWUgPj0gRFdfQVRFX2xvX3VzZXIKLQkgICAgICAmJiB1dmFsdWUgPD0gRFdfQVRFX2hpX3VzZXIpCi0JICAgIHByaW50ZiAoIih1c2VyIGRlZmluZWQgdHlwZSkiKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiKHVua25vd24gdHlwZSkiKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9hY2Nlc3NpYmlsaXR5OgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfQUNDRVNTX3B1YmxpYzoJCXByaW50ZiAoIihwdWJsaWMpIik7IGJyZWFrOwotCWNhc2UgRFdfQUNDRVNTX3Byb3RlY3RlZDoJcHJpbnRmICgiKHByb3RlY3RlZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BQ0NFU1NfcHJpdmF0ZToJCXByaW50ZiAoIihwcml2YXRlKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biBhY2Nlc3NpYmlsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfdmlzaWJpbGl0eToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX1ZJU19sb2NhbDoJcHJpbnRmICgiKGxvY2FsKSIpOyBicmVhazsKLQljYXNlIERXX1ZJU19leHBvcnRlZDoJcHJpbnRmICgiKGV4cG9ydGVkKSIpOyBicmVhazsKLQljYXNlIERXX1ZJU19xdWFsaWZpZWQ6CXByaW50ZiAoIihxdWFsaWZpZWQpIik7IGJyZWFrOwotCWRlZmF1bHQ6CQlwcmludGYgKCIodW5rbm93biB2aXNpYmlsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfdmlydHVhbGl0eToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX1ZJUlRVQUxJVFlfbm9uZToJcHJpbnRmICgiKG5vbmUpIik7IGJyZWFrOwotCWNhc2UgRFdfVklSVFVBTElUWV92aXJ0dWFsOglwcmludGYgKCIodmlydHVhbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbDpwcmludGYgKCIocHVyZV92aXJ0dWFsKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biB2aXJ0dWFsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfSURfY2FzZV9zZW5zaXRpdmU6CXByaW50ZiAoIihjYXNlX3NlbnNpdGl2ZSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19JRF91cF9jYXNlOgkJcHJpbnRmICgiKHVwX2Nhc2UpIik7IGJyZWFrOwotCWNhc2UgRFdfSURfZG93bl9jYXNlOgkJcHJpbnRmICgiKGRvd25fY2FzZSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19JRF9jYXNlX2luc2Vuc2l0aXZlOglwcmludGYgKCIoY2FzZV9pbnNlbnNpdGl2ZSkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoJCSAgICAgICAgcHJpbnRmICgiKHVua25vd24gY2FzZSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2NhbGxpbmdfY29udmVudGlvbjoKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0NDX25vcm1hbDoJcHJpbnRmICgiKG5vcm1hbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19DQ19wcm9ncmFtOglwcmludGYgKCIocHJvZ3JhbSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19DQ19ub2NhbGw6CXByaW50ZiAoIihub2NhbGwpIik7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAodXZhbHVlID49IERXX0NDX2xvX3VzZXIKLQkgICAgICAmJiB1dmFsdWUgPD0gRFdfQ0NfaGlfdXNlcikKLQkgICAgcHJpbnRmICgiKHVzZXIgZGVmaW5lZCkiKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiKHVua25vd24gY29udmVudGlvbikiKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfbG9jYXRpb246Ci0gICAgY2FzZSBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbjoKLSAgICBjYXNlIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uOgotICAgICAgcHJpbnRmICgiKCIpOwotICAgICAgZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24gKGJsb2NrX3N0YXJ0LCBwb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmICgiKSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0gIHJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX2luZm8gKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLSAgdW5zaWduZWQgY2hhciAqIHNlY3Rpb25fYmVnaW4gPSBzdGFydDsKLQotICBwcmludGYgKF8oIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIERXQVJGMl9FeHRlcm5hbF9Db21wVW5pdCAqIGV4dGVybmFsOwotICAgICAgRFdBUkYyX0ludGVybmFsX0NvbXBVbml0ICAgY29tcHVuaXQ7Ci0gICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICB0YWdzOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICAgIGludAkJCSBsZXZlbDsKLQotICAgICAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX0NvbXBVbml0ICopIHN0YXJ0OwotCi0gICAgICBjb21wdW5pdC5jdV9sZW5ndGggICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9sZW5ndGgpOwotICAgICAgY29tcHVuaXQuY3VfdmVyc2lvbiAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfdmVyc2lvbik7Ci0gICAgICBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0ID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9hYmJyZXZfb2Zmc2V0KTsKLSAgICAgIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X3BvaW50ZXJfc2l6ZSk7Ci0KLSAgICAgIHRhZ3MgPSBzdGFydCArIHNpemVvZiAoKiBleHRlcm5hbCk7Ci0gICAgICBzdGFydCArPSBjb21wdW5pdC5jdV9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5jdV9sZW5ndGgpOwotCi0gICAgICBpZiAoY29tcHVuaXQuY3VfdmVyc2lvbiAhPSAyKQotCXsKLQkgIHdhcm4gKF8oIk9ubHkgdmVyc2lvbiAyIERXQVJGIGRlYnVnIGluZm9ybWF0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiICBDb21waWxhdGlvbiBVbml0OlxuIikpOwotICAgICAgcHJpbnRmIChfKCIgICBMZW5ndGg6ICAgICAgICAlbGRcbiIpLCBjb21wdW5pdC5jdV9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgICBWZXJzaW9uOiAgICAgICAlZFxuIiksIGNvbXB1bml0LmN1X3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgICBBYmJyZXYgT2Zmc2V0OiAlbGRcbiIpLCBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoXygiICAgUG9pbnRlciBTaXplOiAgJWRcbiIpLCBjb21wdW5pdC5jdV9wb2ludGVyX3NpemUpOwotCi0gICAgICBpZiAoZmlyc3RfYWJicmV2ICE9IE5VTEwpCi0JZnJlZV9hYmJyZXZzICgpOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSBhYmJyZXZzIHVzZWQgYnkgdGhpcyBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotICAgICAgewotCUVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWM7Ci0JdW5zaWduZWQgY2hhciAqICAgICAgIGJlZ2luOwotCi0JLyogTG9jYXRlIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24gYW5kIHByb2Nlc3MgaXQuICAqLwotCWZvciAoaSA9IDAsIHNlYyA9IHNlY3Rpb25faGVhZGVyczsKLQkgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0JICAgICBpICsrLCBzZWMgKyspCi0JICBpZiAoc3RyY21wIChTRUNUSU9OX05BTUUgKHNlYyksICIuZGVidWdfYWJicmV2IikgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQlpZiAoaSA9PSAtMSB8fCBzZWMtPnNoX3NpemUgPT0gMCkKLQkgIHsKLQkgICAgd2FybiAoXygiVW5hYmxlIHRvIGxvY2F0ZSAuZGVidWdfYWJicmV2IHNlY3Rpb24hXG4iKSk7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCi0JR0VUX0RBVEFfQUxMT0MgKHNlYy0+c2hfb2Zmc2V0LCBzZWMtPnNoX3NpemUsIGJlZ2luLCB1bnNpZ25lZCBjaGFyICosCi0JCQkiZGVidWdfYWJicmV2IHNlY3Rpb24gZGF0YSIpOwotCi0JcHJvY2Vzc19hYmJyZXZfc2VjdGlvbiAoYmVnaW4gKyBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0LAotCQkJCWJlZ2luICsgc2VjLT5zaF9zaXplKTsKLQotCWZyZWUgKGJlZ2luKTsKLSAgICAgIH0KLQotICAgICAgbGV2ZWwgPSAwOwotICAgICAgd2hpbGUgKHRhZ3MgPCBzdGFydCkKLQl7Ci0JICBpbnQgICAgICAgICAgICBieXRlc19yZWFkOwotCSAgaW50ICAgICAgICAgICAgYWJicmV2X251bWJlcjsKLQkgIGFiYnJldl9lbnRyeSAqIGVudHJ5OwotCSAgYWJicmV2X2F0dHIgICogYXR0cjsKLQotCSAgYWJicmV2X251bWJlciA9IHJlYWRfbGViMTI4ICh0YWdzLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgdGFncyArPSBieXRlc19yZWFkOwotCi0JICAvKiBBIG51bGwgRElFIG1hcmtzIHRoZSBlbmQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuLiAgKi8KLQkgIGlmIChhYmJyZXZfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICAtLWxldmVsOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFNjYW4gdGhyb3VnaCB0aGUgYWJicmV2aWF0aW9uIGxpc3QgdW50aWwgd2UgcmVhY2ggdGhlCi0JICAgICBjb3JyZWN0IGVudHJ5LiAgKi8KLQkgIGZvciAoZW50cnkgPSBmaXJzdF9hYmJyZXY7Ci0JICAgICAgIGVudHJ5ICYmIGVudHJ5LT5lbnRyeSAhPSBhYmJyZXZfbnVtYmVyOwotCSAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0KQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGVudHJ5ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICB3YXJuIChfKCJVbmFibGUgdG8gbG9jYXRlIGVudHJ5ICVkIGluIHRoZSBhYmJyZXZpYXRpb24gdGFibGVcbiIpLAotCQkgICAgYWJicmV2X251bWJlcik7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQotCSAgcHJpbnRmIChfKCIgPCVkPjwleD46IEFiYnJldiBOdW1iZXI6ICVkICglcylcbiIpLAotCQkgIGxldmVsLCB0YWdzIC0gc2VjdGlvbl9iZWdpbiAtIGJ5dGVzX3JlYWQsCi0JCSAgYWJicmV2X251bWJlciwKLQkJICBnZXRfVEFHX25hbWUgKGVudHJ5LT50YWcpKTsKLQotCSAgZm9yIChhdHRyID0gZW50cnktPmZpcnN0X2F0dHI7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQotCSAgICB0YWdzID0gcmVhZF9hbmRfZGlzcGxheV9hdHRyIChhdHRyLT5hdHRyaWJ1dGUsCi0JCQkJCSAgYXR0ci0+Zm9ybSwKLQkJCQkJICB0YWdzLAotCQkJCQkgIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSk7Ci0KLQkgIGlmIChlbnRyeS0+Y2hpbGRyZW4pCi0JICAgICsrbGV2ZWw7Ci0JfQotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX2FyYW5nZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBwcmludGYgKF8oIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIERXQVJGMl9FeHRlcm5hbF9BUmFuZ2UgKiBleHRlcm5hbDsKLSAgICAgIERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UgICBhcmFuZ2U7Ci0gICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgcmFuZ2VzOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBhZGRyZXNzOwotCi0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfQVJhbmdlICopIHN0YXJ0OwotCi0gICAgICBhcmFuZ2UuYXJfbGVuZ3RoICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9sZW5ndGgpOwotICAgICAgYXJhbmdlLmFyX3ZlcnNpb24gICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfdmVyc2lvbik7Ci0gICAgICBhcmFuZ2UuYXJfaW5mb19vZmZzZXQgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9pbmZvX29mZnNldCk7Ci0gICAgICBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9wb2ludGVyX3NpemUpOwotICAgICAgYXJhbmdlLmFyX3NlZ21lbnRfc2l6ZSA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfc2VnbWVudF9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgJWxkXG4iKSwgYXJhbmdlLmFyX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbzogICVseFxuIiksIGFyYW5nZS5hcl9pbmZvX29mZnNldCk7Ci0gICAgICBwcmludGYgKF8oIiAgUG9pbnRlciBTaXplOiAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmIChfKCIgIFNlZ21lbnQgU2l6ZTogICAgICAgICAgICAgJWRcbiIpLCBhcmFuZ2UuYXJfc2VnbWVudF9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCJcbiAgICBBZGRyZXNzICBMZW5ndGhcbiIpKTsKLQotICAgICAgcmFuZ2VzID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotCi0gICAgICBmb3IgKDs7KQotCXsKLQkgIGFkZHJlc3MgPSBieXRlX2dldCAocmFuZ2VzLCBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKTsKLQotCSAgaWYgKGFkZHJlc3MgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIHJhbmdlcyArPSBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplOwotCi0JICBsZW5ndGggID0gYnl0ZV9nZXQgKHJhbmdlcywgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSk7Ci0KLQkgIHJhbmdlcyArPSBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplOwotCi0JICBwcmludGYgKCIgICAgJTguOGx4ICVsdVxuIiwgYWRkcmVzcywgbGVuZ3RoKTsKLQl9Ci0KLSAgICAgIHN0YXJ0ICs9IGFyYW5nZS5hcl9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5hcl9sZW5ndGgpOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOwotewotICBwcmludGYgKF8oIkRpc3BsYXlpbmcgdGhlIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iKSwKLQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSAgLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIGRlYnVnIHNlY3Rpb24gYW5kIGEgcG9pbnRlcgotICAgICB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGRlY29kZSBpdC4gICovCi1zdHJ1Y3QKLXsKLSAgY2hhciAqIG5hbWU7Ci0gIGludCAoKiBkaXNwbGF5KSBQQVJBTVMoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLX0KLWRlYnVnX2Rpc3BsYXlzW10gPQotewotICB7ICIuZGVidWdfaW5mbyIsICAgICAgICBkaXNwbGF5X2RlYnVnX2luZm8gfSwKLSAgeyAiLmRlYnVnX2FiYnJldiIsICAgICAgZGlzcGxheV9kZWJ1Z19hYmJyZXYgfSwKLSAgeyAiLmRlYnVnX2xpbmUiLCAgICAgICAgZGlzcGxheV9kZWJ1Z19saW5lcyB9LAotICB7ICIuZGVidWdfYXJhbmdlcyIsICAgICBkaXNwbGF5X2RlYnVnX2FyYW5nZXMgfSwKLSAgeyAiLmRlYnVnX3B1Ym5hbWVzIiwgICAgZGlzcGxheV9kZWJ1Z19wdWJuYW1lcyB9LAotICB7ICIuZGVidWdfbWFjaW5mbyIsICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfSwKLSAgeyAiLmRlYnVnX2ZyYW1lIiwgICAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0sCi0gIHsgIi5kZWJ1Z19zdHIiLCAgICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCB9LAotICB7ICIuZGVidWdfc3RhdGljX2Z1bmMiLCBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfSwKLSAgeyAiLmRlYnVnX3N0YXRpY192YXJzIiwgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0sCi0gIHsgIi5kZWJ1Z190eXBlcyIsICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCB9LAotICB7ICIuZGVidWdfd2Vha25hbWVzIiwgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfQotfTsKLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGNoYXIgKiAgICAgICAgICBuYW1lID0gU0VDVElPTl9OQU1FIChzZWN0aW9uKTsKLSAgYmZkX3NpemVfdHlwZSAgIGxlbmd0aDsKLSAgdW5zaWduZWQgY2hhciAqIHN0YXJ0OwotICBpbnQgICAgICAgICAgICAgaTsKLQotICBsZW5ndGggPSBzZWN0aW9uLT5zaF9zaXplOwotICBpZiAobGVuZ3RoID09IDApCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJyVzJyBoYXMgbm8gZGVidWdnaW5nIGRhdGEuXG4iKSwgbmFtZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgbGVuZ3RoLCBzdGFydCwgdW5zaWduZWQgY2hhciAqLAotCQkgICJkZWJ1ZyBzZWN0aW9uIGRhdGEiKTsKLQotICAvKiBTZWUgaWYgd2Uga25vdyBob3cgdG8gZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgKi8KLSAgZm9yIChpID0gTlVNX0VMRU0gKGRlYnVnX2Rpc3BsYXlzKTsgaS0tOykKLSAgICBpZiAoc3RyY21wIChkZWJ1Z19kaXNwbGF5c1tpXS5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgewotCWRlYnVnX2Rpc3BsYXlzW2ldLmRpc3BsYXkgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICBpZiAoaSA9PSAtMSkKLSAgICBwcmludGYgKF8oIlVucmVjb2duaXNlZCBkZWJ1ZyBzZWN0aW9uOiAlc1xuIiksIG5hbWUpOwotCi0gIGZyZWUgKHN0YXJ0KTsKLQotICAvKiBJZiB3ZSBsb2FkZWQgaW4gdGhlIGFiYnJldiBzZWN0aW9uIGF0IHNvbWUgcG9pbnQsCi0gICAgIHdlIG11c3QgcmVsZWFzZSBpdCBoZXJlLiAgKi8KLSAgaWYgKGZpcnN0X2FiYnJldiAhPSBOVUxMKQotICAgIGZyZWVfYWJicmV2cyAoKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgIHNlY3Rpb247Ci0gIHVuc2lnbmVkIGludCAgaTsKLQotICBpZiAoISBkb19kdW1wKQotICAgIHJldHVybiAxOwotCi0gIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bQotICAgICAgICYmIGkgPCBudW1fZHVtcF9zZWN0czsKLSAgICAgICBpICsrLCBzZWN0aW9uICsrKQotICAgIHsKLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0gICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIERJU0FTU19EVU1QKQotCWRpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOwotI2VuZGlmCi0gICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIEhFWF9EVU1QKQotCWR1bXBfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSk7Ci0KLSAgICAgIGlmIChkdW1wX3NlY3RzW2ldICYgREVCVUdfRFVNUCkKLQlkaXNwbGF5X2RlYnVnX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOwotICAgIH0KLQotICBpZiAoaSA8IG51bV9kdW1wX3NlY3RzKQotICAgIHdhcm4gKF8oIlNvbWUgc2VjdGlvbnMgd2VyZSBub3QgZHVtcGVkIGJlY2F1c2UgdGhleSBkbyBub3QgZXhpc3QhXG4iKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAobWFzaykKLSAgICAgaW50IG1hc2s7Ci17Ci0gIGlmIChtYXNrKQotICAgIHsKLSAgICAgIGludCBmaXJzdCA9IDE7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfSU5FWCkKLQlmcHV0cyAoIklORVgiLCBzdGRvdXQpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfVUZMTykKLQlwcmludGYgKCIlc1VGTE8iLCBmaXJzdCA/ICIiIDogInwiKSwgZmlyc3QgPSAwOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX09GTE8pCi0JcHJpbnRmICgiJXNPRkxPIiwgZmlyc3QgPyAiIiA6ICJ8IiksIGZpcnN0ID0gMDsKLSAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9ESVYwKQotCXByaW50ZiAoIiVzRElWMCIsIGZpcnN0ID8gIiIgOiAifCIpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfSU5WQUwpCi0JcHJpbnRmICgiJXNJTlZBTCIsIGZpcnN0ID8gIiIgOiAifCIpOwotICAgIH0KLSAgZWxzZQotICAgIGZwdXRzICgiMCIsIHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfbWlwc19zcGVjaWZpYyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLSAgc2l6ZV90IGxpYmxpc3Rfb2Zmc2V0ID0gMDsKLSAgc2l6ZV90IGxpYmxpc3RubyA9IDA7Ci0gIHNpemVfdCBjb25mbGljdHNubyA9IDA7Ci0gIHNpemVfdCBvcHRpb25zX29mZnNldCA9IDA7Ci0gIHNpemVfdCBjb25mbGljdHNfb2Zmc2V0ID0gMDsKLQotICAvKiBXZSBoYXZlIGEgbG90IG9mIHNwZWNpYWwgc2VjdGlvbnMuICBUaGFua3MgU0dJISAgKi8KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIC8qIE5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gICovCi0gICAgcmV0dXJuIDA7Ci0KLSAgZm9yIChlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsgZW50cnktPmRfdGFnICE9IERUX05VTEw7ICsrZW50cnkpCi0gICAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0gICAgICB7Ci0gICAgICBjYXNlIERUX01JUFNfTElCTElTVDoKLQlsaWJsaXN0X29mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgotCWxpYmxpc3RubyA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX09QVElPTlM6Ci0Jb3B0aW9uc19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOgotCWNvbmZsaWN0c19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86Ci0JY29uZmxpY3Rzbm8gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgaWYgKGxpYmxpc3Rfb2Zmc2V0ICE9IDAgJiYgbGlibGlzdG5vICE9IDAgJiYgZG9fZHluYW1pYykKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9MaWIgKiBlbGliOwotICAgICAgc2l6ZV90IGNudDsKLQotICAgICAgR0VUX0RBVEFfQUxMT0MgKGxpYmxpc3Rfb2Zmc2V0LCBsaWJsaXN0bm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX0xpYiksCi0JCSAgICAgIGVsaWIsIEVsZjMyX0V4dGVybmFsX0xpYiAqLCAibGlibGlzdCIpOwotCi0gICAgICBwcmludGYgKCJcblNlY3Rpb24gJy5saWJsaXN0JyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwgbGlibGlzdG5vKTsKLSAgICAgIGZwdXRzICgiICAgICBMaWJyYXJ5ICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtICAgVmVyc2lvbiBGbGFnc1xuIiwKLQkgICAgIHN0ZG91dCk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgbGlibGlzdG5vOyArK2NudCkKLQl7Ci0JICBFbGYzMl9MaWIgbGlibGlzdDsKLQkgIHRpbWVfdCB0aW1lOwotCSAgY2hhciB0aW1lYnVmWzIwXTsKLQotCSAgbGlibGlzdC5sX25hbWUgPSBCWVRFX0dFVCAoZWxpYltjbnRdLmxfbmFtZSk7Ci0JICB0aW1lID0gQllURV9HRVQgKGVsaWJbY250XS5sX3RpbWVfc3RhbXApOwotCSAgbGlibGlzdC5sX2NoZWNrc3VtID0gQllURV9HRVQgKGVsaWJbY250XS5sX2NoZWNrc3VtKTsKLQkgIGxpYmxpc3QubF92ZXJzaW9uID0gQllURV9HRVQgKGVsaWJbY250XS5sX3ZlcnNpb24pOwotCSAgbGlibGlzdC5sX2ZsYWdzID0gQllURV9HRVQgKGVsaWJbY250XS5sX2ZsYWdzKTsKLQotCSAgc3RyZnRpbWUgKHRpbWVidWYsIDIwLCAiJVktJW0tJWRUJUg6JU06JVMiLCBnbXRpbWUgKCZ0aW1lKSk7Ci0KLQkgIHByaW50ZiAoIiUzZDogJS0yMHMgJXMgJSMxMGx4ICUtN2xkIiwgY250LAotCQkgIGR5bmFtaWNfc3RyaW5ncyArIGxpYmxpc3QubF9uYW1lLCB0aW1lYnVmLAotCQkgIGxpYmxpc3QubF9jaGVja3N1bSwgbGlibGlzdC5sX3ZlcnNpb24pOwotCi0JICBpZiAobGlibGlzdC5sX2ZsYWdzID09IDApCi0JICAgIHB1dHMgKCIgTk9ORSIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdAotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQkJaW50IGJpdDsKLQkgICAgICB9IGxfZmxhZ3NfdmFsc1tdID0KLQkJewotCQkgIHsgIiBFWEFDVF9NQVRDSCIsIExMX0VYQUNUX01BVENIIH0sCi0JCSAgeyAiIElHTk9SRV9JTlRfVkVSIiwgTExfSUdOT1JFX0lOVF9WRVIgfSwKLQkJICB7ICIgUkVRVUlSRV9NSU5PUiIsIExMX1JFUVVJUkVfTUlOT1IgfSwKLQkJICB7ICIgRVhQT1JUUyIsIExMX0VYUE9SVFMgfSwKLQkJICB7ICIgREVMQVlfTE9BRCIsIExMX0RFTEFZX0xPQUQgfSwKLQkJICB7ICIgREVMVEEiLCBMTF9ERUxUQSB9Ci0JCX07Ci0JICAgICAgaW50IGZsYWdzID0gbGlibGlzdC5sX2ZsYWdzOwotCSAgICAgIGludCBmY250OwotCi0JICAgICAgZm9yIChmY250ID0gMDsKLQkJICAgZmNudCA8IHNpemVvZiAobF9mbGFnc192YWxzKSAvIHNpemVvZiAobF9mbGFnc192YWxzWzBdKTsKLQkJICAgKytmY250KQotCQlpZiAoKGZsYWdzICYgbF9mbGFnc192YWxzW2ZjbnRdLmJpdCkgIT0gMCkKLQkJICB7Ci0JCSAgICBmcHV0cyAobF9mbGFnc192YWxzW2ZjbnRdLm5hbWUsIHN0ZG91dCk7Ci0JCSAgICBmbGFncyBePSBsX2ZsYWdzX3ZhbHNbZmNudF0uYml0OwotCQkgIH0KLQkgICAgICBpZiAoZmxhZ3MgIT0gMCkKLQkJcHJpbnRmICgiICUjeCIsICh1bnNpZ25lZCBpbnQpIGZsYWdzKTsKLQotCSAgICAgIHB1dHMgKCIiKTsKLQkgICAgfQotCX0KLQotICAgICAgZnJlZSAoZWxpYik7Ci0gICAgfQotCi0gIGlmIChvcHRpb25zX29mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICogZW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICogc2VjdCA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICogaW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICogb3B0aW9uOwotICAgICAgc2l6ZV90IG9mZnNldDsKLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHNlY3Rpb24gaGVhZGVyIHNvIHRoYXQgd2UgZ2V0IHRoZSBzaXplLiAgKi8KLSAgICAgIHdoaWxlIChzZWN0LT5zaF90eXBlICE9IFNIVF9NSVBTX09QVElPTlMpCi0JKytzZWN0OwotCi0gICAgICBHRVRfREFUQV9BTExPQyAob3B0aW9uc19vZmZzZXQsIHNlY3QtPnNoX3NpemUsIGVvcHQsCi0JCSAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICosICJvcHRpb25zIik7Ci0KLSAgICAgIGlvcHQgPSAoRWxmX0ludGVybmFsX09wdGlvbnMgKikgbWFsbG9jICgoc2VjdC0+c2hfc2l6ZSAvIHNpemVvZiAoZW9wdCkpCi0JCQkJCSAgICAgICogc2l6ZW9mICgqaW9wdCkpOwotICAgICAgaWYgKGlvcHQgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgb2Zmc2V0ID0gY250ID0gMDsKLSAgICAgIG9wdGlvbiA9IGlvcHQ7Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgc2VjdC0+c2hfc2l6ZSkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqIGVvcHRpb247Ci0KLQkgIGVvcHRpb24gPSAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgKChjaGFyICopIGVvcHQgKyBvZmZzZXQpOwotCi0JICBvcHRpb24tPmtpbmQgPSBCWVRFX0dFVCAoZW9wdGlvbi0+a2luZCk7Ci0JICBvcHRpb24tPnNpemUgPSBCWVRFX0dFVCAoZW9wdGlvbi0+c2l6ZSk7Ci0JICBvcHRpb24tPnNlY3Rpb24gPSBCWVRFX0dFVCAoZW9wdGlvbi0+c2VjdGlvbik7Ci0JICBvcHRpb24tPmluZm8gPSBCWVRFX0dFVCAoZW9wdGlvbi0+aW5mbyk7Ci0KLQkgIG9mZnNldCArPSBvcHRpb24tPnNpemU7Ci0JICArK29wdGlvbjsKLQkgICsrY250OwotCX0KLQotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiksCi0JICAgICAgc3RyaW5nX3RhYmxlICsgc2VjdC0+c2hfbmFtZSwgY250KTsKLQotICAgICAgb3B0aW9uID0gaW9wdDsKLSAgICAgIHdoaWxlIChjbnQtLSA+IDApCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgc3dpdGNoIChvcHRpb24tPmtpbmQpCi0JICAgIHsKLQkgICAgY2FzZSBPREtfTlVMTDoKLQkgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICAqLwotCSAgICAgIHByaW50ZiAoIiBOVUxMICAgICAgICVkICVseCIsIG9wdGlvbi0+c2VjdGlvbiwgb3B0aW9uLT5pbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfUkVHSU5GTzoKLQkgICAgICBwcmludGYgKCIgUkVHSU5GTyAgICAiKTsKLQkgICAgICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fTUlQUykKLQkJewotCQkgIC8qIDMyYml0IGZvcm0uICAqLwotCQkgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmVyZWc7Ci0JCSAgRWxmMzJfUmVnSW5mbyByZWdpbmZvOwotCi0JCSAgZXJlZyA9IChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopIChvcHRpb24gKyAxKTsKLQkJICByZWdpbmZvLnJpX2dwcm1hc2sgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BybWFzayk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMF0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1sxXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzFdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1syXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzNdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbM10pOwotCQkgIHJlZ2luZm8ucmlfZ3BfdmFsdWUgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BfdmFsdWUpOwotCi0JCSAgcHJpbnRmICgiR1BSICUwOGx4ICBHUCAweCVseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9ncHJtYXNrLAotCQkJICAodW5zaWduZWQgbG9uZykgcmVnaW5mby5yaV9ncF92YWx1ZSk7Ci0JCSAgcHJpbnRmICgiICAgICAgICAgICAgQ1BSMCAlMDhseCAgQ1BSMSAlMDhseCAgQ1BSMiAlMDhseCAgQ1BSMyAlMDhseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdLCByZWdpbmZvLnJpX2Nwcm1hc2tbMV0sCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSwgcmVnaW5mby5yaV9jcHJtYXNrWzNdKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIDY0IGJpdCBmb3JtLiAgKi8KLQkJICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICogZXJlZzsKLQkJICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIHJlZ2luZm87Ci0KLQkJICBlcmVnID0gKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikgKG9wdGlvbiArIDEpOwotCQkgIHJlZ2luZm8ucmlfZ3BybWFzayAgICA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncHJtYXNrKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1swXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzFdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMV0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzJdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1szXSk7Ci0JCSAgcmVnaW5mby5yaV9ncF92YWx1ZSAgID0gQllURV9HRVQ4IChlcmVnLT5yaV9ncF92YWx1ZSk7Ci0KLQkJICBwcmludGYgKCJHUFIgJTA4bHggIEdQIDB4IiwKLQkJCSAgcmVnaW5mby5yaV9ncHJtYXNrKTsKLQkJICBwcmludGZfdm1hIChyZWdpbmZvLnJpX2dwX3ZhbHVlKTsKLQkJICBwcmludGYgKCJcbiIpOwotCi0JCSAgcHJpbnRmICgiICAgICAgICAgICAgQ1BSMCAlMDhseCAgQ1BSMSAlMDhseCAgQ1BSMiAlMDhseCAgQ1BSMyAlMDhseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdLCByZWdpbmZvLnJpX2Nwcm1hc2tbMV0sCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSwgcmVnaW5mby5yaV9jcHJtYXNrWzNdKTsKLQkJfQotCSAgICAgICsrb3B0aW9uOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICBjYXNlIE9ES19FWENFUFRJT05TOgotCSAgICAgIGZwdXRzICgiIEVYQ0VQVElPTlMgZnBlX21pbigiLCBzdGRvdXQpOwotCSAgICAgIHByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uIChvcHRpb24tPmluZm8gJiBPRVhfRlBVX01JTik7Ci0JICAgICAgZnB1dHMgKCIpIGZwZV9tYXgoIiwgc3Rkb3V0KTsKLQkgICAgICBwcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAoKG9wdGlvbi0+aW5mbyAmIE9FWF9GUFVfTUFYKSA+PiA4KTsKLQkgICAgICBmcHV0cyAoIikiLCBzdGRvdXQpOwotCi0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9FWF9QQUdFMCkKLQkJZnB1dHMgKCIgUEFHRTAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfU01NKQotCQlmcHV0cyAoIiBTTU0iLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfRlBEQlVHKQotCQlmcHV0cyAoIiBGUERCVUciLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfRElTTUlTUykKLQkJZnB1dHMgKCIgRElTTUlTUyIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX1BBRDoKLQkgICAgICBmcHV0cyAoIiBQQUQgICAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT1BBRF9QUkVGSVgpCi0JCWZwdXRzICgiIFBSRUZJWCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfUE9TVEZJWCkKLQkJZnB1dHMgKCIgUE9TVEZJWCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfU1lNQk9MKQotCQlmcHV0cyAoIiBTWU1CT0wiLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19IV1BBVENIOgotCSAgICAgIGZwdXRzICgiIEhXUEFUQ0ggICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjRLRU9QKQotCQlmcHV0cyAoIiBSNEtFT1AiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjhLUEZFVENIKQotCQlmcHV0cyAoIiBSOEtQRkVUQ0giLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjVLRU9QKQotCQlmcHV0cyAoIiBSNUtFT1AiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjVLQ1ZUTCkKLQkJZnB1dHMgKCIgUjVLQ1ZUTCIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0ZJTEw6Ci0JICAgICAgZnB1dHMgKCIgRklMTCAgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIC8qIFhYWCBQcmludCBjb250ZW50IG9mIGluZm8gd29yZD8gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX1RBR1M6Ci0JICAgICAgZnB1dHMgKCIgVEFHUyAgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIC8qIFhYWCBQcmludCBjb250ZW50IG9mIGluZm8gd29yZD8gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0hXQU5EOgotCSAgICAgIGZwdXRzICgiIEhXQU5EICAgICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0hFQ0tFRCkKLQkJZnB1dHMgKCIgUjRLRU9QX0NIRUNLRUQiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0xFQU4pCi0JCWZwdXRzICgiIFI0S0VPUF9DTEVBTiIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0hXT1I6Ci0JICAgICAgZnB1dHMgKCIgSFdPUiAgICAgICIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DSEVDS0VEKQotCQlmcHV0cyAoIiBSNEtFT1BfQ0hFQ0tFRCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DTEVBTikKLQkJZnB1dHMgKCIgUjRLRU9QX0NMRUFOIiwgc3Rkb3V0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfR1BfR1JPVVA6Ci0JICAgICAgcHJpbnRmICgiIEdQX0dST1VQICAlIzA2bHggIHNlbGYtY29udGFpbmVkICUjMDZseCIsCi0JCSAgICAgIG9wdGlvbi0+aW5mbyAmIE9HUF9HUk9VUCwKLQkJICAgICAgKG9wdGlvbi0+aW5mbyAmIE9HUF9TRUxGKSA+PiAxNik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0lERU5UOgotCSAgICAgIHByaW50ZiAoIiBJREVOVCAgICAgJSMwNmx4ICBzZWxmLWNvbnRhaW5lZCAlIzA2bHgiLAotCQkgICAgICBvcHRpb24tPmluZm8gJiBPR1BfR1JPVVAsCi0JCSAgICAgIChvcHRpb24tPmluZm8gJiBPR1BfU0VMRikgPj4gMTYpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gICovCi0JICAgICAgcHJpbnRmICgiICUzZCA/Pz8gICAgICVkICVseCIsCi0JCSAgICAgIG9wdGlvbi0+a2luZCwgb3B0aW9uLT5zZWN0aW9uLCBvcHRpb24tPmluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGxlbiA9IHNpemVvZiAoKmVvcHQpOwotCSAgd2hpbGUgKGxlbiA8IG9wdGlvbi0+c2l6ZSkKLQkgICAgaWYgKCgoY2hhciAqKSBvcHRpb24pW2xlbl0gPj0gJyAnCi0JCSYmICgoY2hhciAqKSBvcHRpb24pW2xlbl0gPCAweDdmKQotCSAgICAgIHByaW50ZiAoIiVjIiwgKChjaGFyICopIG9wdGlvbilbbGVuKytdKTsKLQkgICAgZWxzZQotCSAgICAgIHByaW50ZiAoIlxcJTAzbyIsICgoY2hhciAqKSBvcHRpb24pW2xlbisrXSk7Ci0KLQkgIGZwdXRzICgiXG4iLCBzdGRvdXQpOwotCSAgKytvcHRpb247Ci0JfQotCi0gICAgICBmcmVlIChlb3B0KTsKLSAgICB9Ci0KLSAgaWYgKGNvbmZsaWN0c19vZmZzZXQgIT0gMCAmJiBjb25mbGljdHNubyAhPSAwKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0NvbmZsaWN0ICogZWNvbmYzMjsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0ICogZWNvbmY2NDsKLSAgICAgIEVsZjMyX0NvbmZsaWN0ICogaWNvbmY7Ci0gICAgICBzaXplX3QgY250OwotCi0gICAgICBpZiAoZHluYW1pY19zeW1ib2xzID09IE5VTEwpCi0JewotCSAgZXJyb3IgKF8oImNvbmZsaWN0IGxpc3Qgd2l0aCB3aXRob3V0IHRhYmxlIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpY29uZiA9IChFbGYzMl9Db25mbGljdCAqKSBtYWxsb2MgKGNvbmZsaWN0c25vICogc2l6ZW9mICgqaWNvbmYpKTsKLSAgICAgIGlmIChpY29uZiA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIEdFVF9EQVRBX0FMTE9DIChjb25mbGljdHNfb2Zmc2V0LCBjb25mbGljdHNubyAqIHNpemVvZiAoKmVjb25mMzIpLAotCQkJICBlY29uZjMyLCBFbGYzMl9FeHRlcm5hbF9Db25mbGljdCAqLCAiY29uZmxpY3QiKTsKLQotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb25mbGljdHNubzsgKytjbnQpCi0JICAgIGljb25mW2NudF0gPSBCWVRFX0dFVCAoZWNvbmYzMltjbnRdKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgR0VUX0RBVEFfQUxMT0MgKGNvbmZsaWN0c19vZmZzZXQsIGNvbmZsaWN0c25vICogc2l6ZW9mICgqZWNvbmY2NCksCi0JCQkgIGVjb25mNjQsIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0ICosICJjb25mbGljdCIpOwotCi0JICBmb3IgKGNudCA9IDA7IGNudCA8IGNvbmZsaWN0c25vOyArK2NudCkKLQkgICAgaWNvbmZbY250XSA9IEJZVEVfR0VUIChlY29uZjY0W2NudF0pOwotCX0KLQotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJy5jb25mbGljdCcgY29udGFpbnMgJWQgZW50cmllczpcbiIpLCBjb25mbGljdHNubyk7Ci0gICAgICBwdXRzIChfKCIgIE51bTogICAgSW5kZXggICAgICAgVmFsdWUgIE5hbWUiKSk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgY29uZmxpY3Rzbm87ICsrY250KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKiBwc3ltID0gJmR5bmFtaWNfc3ltYm9sc1tpY29uZltjbnRdXTsKLQotCSAgcHJpbnRmICgiJTV1OiAlOGx1ICAlIzEwbHggICVzXG4iLAotCQkgIGNudCwgaWNvbmZbY250XSwgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3ZhbHVlLAotCQkgIGR5bmFtaWNfc3RyaW5ncyArIHBzeW0tPnN0X25hbWUpOwotCX0KLQotCi0gICAgICBmcmVlIChpY29uZik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2FyY2hfc3BlY2lmaWMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIEVNX01JUFM6Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLSAgICAgIHJldHVybiBwcm9jZXNzX21pcHNfc3BlY2lmaWMgKGZpbGUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9maWxlX2hlYWRlciAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIC8qIFJlYWQgaW4gdGhlIGlkZW50aXR5IGFycmF5LiAgKi8KLSAgaWYgKGZyZWFkIChlbGZfaGVhZGVyLmVfaWRlbnQsIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBEZXRlcm1pbmUgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlci4gICovCi0gIHN3aXRjaCAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgZGVmYXVsdDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBFTEZEQVRBTk9ORTogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBFTEZEQVRBMkxTQjogYnl0ZV9nZXQgPSBieXRlX2dldF9saXR0bGVfZW5kaWFuOyBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOiBieXRlX2dldCA9IGJ5dGVfZ2V0X2JpZ19lbmRpYW47IGJyZWFrOwotICAgIH0KLQotICAvKiBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCAzMiBiaXQgYW5kIDY0IGJpdCBFTEYgZmlsZXMuICAqLwotICBpc18zMmJpdF9lbGYgPSAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9DTEFTU10gIT0gRUxGQ0xBU1M2NCk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLiAgKi8KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9FaGRyIGVoZHIzMjsKLQotICAgICAgaWYgKGZyZWFkIChlaGRyMzIuZV90eXBlLCBzaXplb2YgKGVoZHIzMikgLSBFSV9OSURFTlQsIDEsIGZpbGUpICE9IDEpCi0JcmV0dXJuIDA7Ci0gICAgICAKLSAgICAgIGVsZl9oZWFkZXIuZV90eXBlICAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfdHlwZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfbWFjaGluZSAgID0gQllURV9HRVQgKGVoZHIzMi5lX21hY2hpbmUpOwotICAgICAgZWxmX2hlYWRlci5lX3ZlcnNpb24gICA9IEJZVEVfR0VUIChlaGRyMzIuZV92ZXJzaW9uKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9lbnRyeSAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfZW50cnkpOwotICAgICAgZWxmX2hlYWRlci5lX3Bob2ZmICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9waG9mZik7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hvZmYgICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3Nob2ZmKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9mbGFncyAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfZmxhZ3MpOwotICAgICAgZWxmX2hlYWRlci5lX2Voc2l6ZSAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9laHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3BoZW50c2l6ZSA9IEJZVEVfR0VUIChlaGRyMzIuZV9waGVudHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3BobnVtICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9waG51bSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hlbnRzaXplID0gQllURV9HRVQgKGVoZHIzMi5lX3NoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hudW0gICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3NobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaHN0cm5keCAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfc2hzdHJuZHgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0VoZHIgZWhkcjY0OwotICAgICAgCi0gICAgICBpZiAoZnJlYWQgKGVoZHI2NC5lX3R5cGUsIHNpemVvZiAoZWhkcjY0KSAtIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLQlyZXR1cm4gMDsKLSAgICAgIAotICAgICAgZWxmX2hlYWRlci5lX3R5cGUgICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV90eXBlKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9tYWNoaW5lICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfbWFjaGluZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfdmVyc2lvbiAgID0gQllURV9HRVQgKGVoZHI2NC5lX3ZlcnNpb24pOwotICAgICAgZWxmX2hlYWRlci5lX2VudHJ5ICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfZW50cnkpOwotICAgICAgZWxmX2hlYWRlci5lX3Bob2ZmICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfcGhvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX3Nob2ZmICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfc2hvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX2ZsYWdzICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV9mbGFncyk7Ci0gICAgICBlbGZfaGVhZGVyLmVfZWhzaXplICAgID0gQllURV9HRVQgKGVoZHI2NC5lX2Voc2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplID0gQllURV9HRVQgKGVoZHI2NC5lX3BoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhudW0gICAgID0gQllURV9HRVQgKGVoZHI2NC5lX3BobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgPSBCWVRFX0dFVCAoZWhkcjY0LmVfc2hlbnRzaXplKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaG51bSAgICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfc2hudW0pOwotICAgICAgZWxmX2hlYWRlci5lX3Noc3RybmR4ICA9IEJZVEVfR0VUIChlaGRyNjQuZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19maWxlIChmaWxlX25hbWUpCi0gICAgIGNoYXIgKiBmaWxlX25hbWU7Ci17Ci0gIEZJTEUgKiAgICAgICBmaWxlOwotICBzdHJ1Y3Qgc3RhdCAgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHN0YXQgKGZpbGVfbmFtZSwgJiBzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgZXJyb3IgKF8oIkNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJXMuXG4iKSwgZmlsZV9uYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChmaWxlX25hbWUsICJyYiIpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIpLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBnZXRfZmlsZV9oZWFkZXIgKGZpbGUpKQotICAgIHsKLSAgICAgIGVycm9yIChfKCIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIpLCBmaWxlX25hbWUpOwotICAgICAgZmNsb3NlIChmaWxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGlzZSBwZXIgZmlsZSB2YXJpYWJsZXMuICAqLwotICBmb3IgKGkgPSBOVU1fRUxFTSAodmVyc2lvbl9pbmZvKTsgaS0tOykKLSAgICB2ZXJzaW9uX2luZm9baV0gPSAwOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChkeW5hbWljX2luZm8pOyBpLS07KQotICAgIGR5bmFtaWNfaW5mb1tpXSA9IDA7Ci0KLSAgLyogUHJvY2VzcyB0aGUgZmlsZS4gICovCi0gIGlmIChzaG93X25hbWUpCi0gICAgcHJpbnRmIChfKCJcbkZpbGU6ICVzXG4iKSwgZmlsZV9uYW1lKTsKLQotICBpZiAoISBwcm9jZXNzX2ZpbGVfaGVhZGVyICgpKQotICAgIHsKLSAgICAgIGZjbG9zZSAoZmlsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzIChmaWxlKTsKLQotICBwcm9jZXNzX3Byb2dyYW1faGVhZGVycyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgKGZpbGUpOwotCi0gIHByb2Nlc3NfcmVsb2NzIChmaWxlKTsKLQotICBwcm9jZXNzX3N5bWJvbF90YWJsZSAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19zeW1pbmZvIChmaWxlKTsKLQotICBwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgKGZpbGUpOwotCi0gIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19hcmNoX3NwZWNpZmljIChmaWxlKTsKLQotICBmY2xvc2UgKGZpbGUpOwotCi0gIGlmIChzZWN0aW9uX2hlYWRlcnMpCi0gICAgewotICAgICAgZnJlZSAoc2VjdGlvbl9oZWFkZXJzKTsKLSAgICAgIHNlY3Rpb25faGVhZGVycyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfdGFibGUpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nX3RhYmxlKTsKLSAgICAgIHN0cmluZ190YWJsZSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N0cmluZ3MpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zdHJpbmdzKTsKLSAgICAgIGR5bmFtaWNfc3RyaW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N5bWJvbHMpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zeW1ib2xzKTsKLSAgICAgIGR5bmFtaWNfc3ltYm9scyA9IE5VTEw7Ci0gICAgICBudW1fZHluYW1pY19zeW1zID0gMDsKLSAgICB9Ci0KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5hbWljX3N5bWluZm8pOwotICAgICAgZHluYW1pY19zeW1pbmZvID0gTlVMTDsKLSAgICB9Ci19Ci0KLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0vKiBOZWVkZWQgYnkgdGhlIGkzODYgZGlzYXNzZW1ibGVyLiAgRm9yIGV4dHJhIGNyZWRpdCwgc29tZW9uZSBjb3VsZAotICAgZml4IHRoaXMgc28gdGhhdCB3ZSBpbnNlcnQgc3ltYm9saWMgYWRkcmVzc2VzIGhlcmUsIGVzcCBmb3IgR09UL1BMVAotICAgc3ltYm9scyAqLwotCi12b2lkCi1wcmludF9hZGRyZXNzICh1bnNpZ25lZCBpbnQgYWRkciwgRklMRSAqIG91dGZpbGUpCi17Ci0gIGZwcmludGYgKG91dGZpbGUsIjB4JTguOHgiLCBhZGRyKTsKLX0KLQotLyogTmVlZGVkIGJ5IHRoZSBpMzg2IGRpc2Fzc2VtYmxlci4gKi8KLXZvaWQKLWRiX3Rhc2tfcHJpbnRzeW0gKHVuc2lnbmVkIGludCBhZGRyKQotewotICBwcmludF9hZGRyZXNzIChhZGRyLCBzdGRlcnIpOwotfQotI2VuZGlmCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50ICAgICBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcGFyc2VfYXJncyAoYXJnYywgYXJndik7Ci0KLSAgaWYgKG9wdGluZCA8IChhcmdjIC0gMSkpCi0gICAgc2hvd19uYW1lID0gMTsKLQotICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLSAgICBwcm9jZXNzX2ZpbGUgKGFyZ3YgW29wdGluZCArK10pOwotCi0gIGlmIChkdW1wX3NlY3RzICE9IE5VTEwpCi0gICAgZnJlZSAoZHVtcF9zZWN0cyk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZW5hbWUuYyBiL2JpbnV0aWxzL3JlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVhOWZkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qIHJlbmFtZS5jIC0tIHJlbmFtZSBhIGZpbGUsIHByZXNlcnZpbmcgc3ltbGlua3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBIQVZFX0dPT0RfVVRJTUVfSAotI2luY2x1ZGUgPHV0aW1lLmg+Ci0jZWxzZSAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0jaWZkZWYgSEFWRV9VVElNRVMKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmIC8qIEhBVkVfVVRJTUVTICovCi0jZW5kaWYgLyogISBIQVZFX0dPT0RfVVRJTUVfSCAqLwotCi0vKiBXZSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGVzIG9uIHN5c3RlbSB3aGVyZSB0aGF0IG1ha2VzCi0gICBhIGRpZmZlcmVuY2UuICAqLwotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYKLQotc3RhdGljIGludCBzaW1wbGVfY29weSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgYXQgb25jZS4gICovCi0jZGVmaW5lIENPUFlfQlVGIDgxOTIKLQotLyogQ29weSBmaWxlIEZST00gdG8gZmlsZSBUTywgcGVyZm9ybWluZyBubyB0cmFuc2xhdGlvbnMuCi0gICBSZXR1cm4gMCBpZiBvaywgLTEgaWYgZXJyb3IuICAqLwotCi1zdGF0aWMgaW50Ci1zaW1wbGVfY29weSAoZnJvbSwgdG8pCi0gICAgIGNvbnN0IGNoYXIgKmZyb207Ci0gICAgIGNvbnN0IGNoYXIgKnRvOwotewotICBpbnQgZnJvbWZkLCB0b2ZkLCBucmVhZDsKLSAgaW50IHNhdmVkOwotICBjaGFyIGJ1ZltDT1BZX0JVRl07Ci0KLSAgZnJvbWZkID0gb3BlbiAoZnJvbSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0gIGlmIChmcm9tZmQgPCAwKQotICAgIHJldHVybiAtMTsKLSNpZmRlZiBPX0NSRUFUCi0gIHRvZmQgPSBvcGVuICh0bywgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNzc3KTsKLSNlbHNlCi0gIHRvZmQgPSBjcmVhdCAodG8sIDA3NzcpOwotI2VuZGlmCi0gIGlmICh0b2ZkIDwgMCkKLSAgICB7Ci0gICAgICBzYXZlZCA9IGVycm5vOwotICAgICAgY2xvc2UgKGZyb21mZCk7Ci0gICAgICBlcnJubyA9IHNhdmVkOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgd2hpbGUgKChucmVhZCA9IHJlYWQgKGZyb21mZCwgYnVmLCBzaXplb2YgYnVmKSkgPiAwKQotICAgIHsKLSAgICAgIGlmICh3cml0ZSAodG9mZCwgYnVmLCBucmVhZCkgIT0gbnJlYWQpCi0JewotCSAgc2F2ZWQgPSBlcnJubzsKLQkgIGNsb3NlIChmcm9tZmQpOwotCSAgY2xvc2UgKHRvZmQpOwotCSAgZXJybm8gPSBzYXZlZDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBzYXZlZCA9IGVycm5vOwotICBjbG9zZSAoZnJvbWZkKTsKLSAgY2xvc2UgKHRvZmQpOwotICBpZiAobnJlYWQgPCAwKQotICAgIHsKLSAgICAgIGVycm5vID0gc2F2ZWQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogU2V0IHRoZSB0aW1lcyBvZiB0aGUgZmlsZSBERVNUSU5BVElPTiB0byBiZSB0aGUgc2FtZSBhcyB0aG9zZSBpbgotICAgU1RBVEJVRi4gICovCi0KLXZvaWQKLXNldF90aW1lcyAoZGVzdGluYXRpb24sIHN0YXRidWYpCi0gICAgIGNvbnN0IGNoYXIgKmRlc3RpbmF0aW9uOwotICAgICBjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZjsKLXsKLSAgaW50IHJlc3VsdDsKLQotICB7Ci0jaWZkZWYgSEFWRV9HT09EX1VUSU1FX0gKLSAgICBzdHJ1Y3QgdXRpbWJ1ZiB0YjsKLQotICAgIHRiLmFjdGltZSA9IHN0YXRidWYtPnN0X2F0aW1lOwotICAgIHRiLm1vZHRpbWUgPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICByZXN1bHQgPSB1dGltZSAoZGVzdGluYXRpb24sICZ0Yik7Ci0jZWxzZSAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0jaWZuZGVmIEhBVkVfVVRJTUVTCi0gICAgbG9uZyB0YlsyXTsKLQotICAgIHRiWzBdID0gc3RhdGJ1Zi0+c3RfYXRpbWU7Ci0gICAgdGJbMV0gPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICByZXN1bHQgPSB1dGltZSAoZGVzdGluYXRpb24sIHRiKTsKLSNlbHNlIC8qIEhBVkVfVVRJTUVTICovCi0gICAgc3RydWN0IHRpbWV2YWwgdHZbMl07Ci0KLSAgICB0dlswXS50dl9zZWMgPSBzdGF0YnVmLT5zdF9hdGltZTsKLSAgICB0dlswXS50dl91c2VjID0gMDsKLSAgICB0dlsxXS50dl9zZWMgPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICB0dlsxXS50dl91c2VjID0gMDsKLSAgICByZXN1bHQgPSB1dGltZXMgKGRlc3RpbmF0aW9uLCB0dik7Ci0jZW5kaWYgLyogSEFWRV9VVElNRVMgKi8KLSNlbmRpZiAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0gIH0KLQotICBpZiAocmVzdWx0ICE9IDApCi0gICAgbm9uX2ZhdGFsIChfKCIlczogY2Fubm90IHNldCB0aW1lOiAlcyIpLCBkZXN0aW5hdGlvbiwgc3RyZXJyb3IgKGVycm5vKSk7Ci19Ci0KLSNpZm5kZWYgU19JU0xOSwotI2lmZGVmIFNfSUZMTksKLSNkZWZpbmUgU19JU0xOSyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKLSNlbHNlCi0jZGVmaW5lIFNfSVNMTksobSkgMAotI2RlZmluZSBsc3RhdCBzdGF0Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBSZW5hbWUgRlJPTSB0byBUTywgY29weWluZyBpZiBUTyBpcyBhIGxpbmsuCi0gICBSZXR1cm4gMCBpZiBvaywgLTEgaWYgZXJyb3IuICAqLwotCi1pbnQKLXNtYXJ0X3JlbmFtZSAoZnJvbSwgdG8sIHByZXNlcnZlX2RhdGVzKQotICAgICBjb25zdCBjaGFyICpmcm9tOwotICAgICBjb25zdCBjaGFyICp0bzsKLSAgICAgaW50IHByZXNlcnZlX2RhdGVzOwotewotICBib29sZWFuIGV4aXN0czsKLSAgc3RydWN0IHN0YXQgczsKLSAgaW50IHJldCA9IDA7Ci0KLSAgZXhpc3RzID0gbHN0YXQgKHRvLCAmcykgPT0gMDsKLQotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSAgLyogV2luMzIsIHVubGlrZSB1bml4LCB3aWxsIG5vdCBlcmFzZSBgdG8nIGluIGByZW5hbWUoZnJvbSwgdG8pJyBidXQKLSAgICAgZmFpbCBpbnN0ZWFkLiAgQWxzbywgY2hvd24gaXMgbm90IHByZXNlbnQuICAqLwotCi0gIGlmIChleGlzdHMpCi0gICAgcmVtb3ZlICh0byk7Ci0KLSAgcmV0ID0gcmVuYW1lIChmcm9tLCB0byk7Ci0gIGlmIChyZXQgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuICovCi0gICAgICAKLSAgICAgIG5vbl9mYXRhbCAoXygiJXM6IHJlbmFtZTogJXMiKSwgdG8sIHN0cmVycm9yIChlcnJubykpOwotICAgICAgdW5saW5rIChmcm9tKTsKLSAgICB9Ci0jZWxzZQotICAvKiBVc2UgcmVuYW1lIG9ubHkgaWYgVE8gaXMgbm90IGEgc3ltYm9saWMgbGluayBhbmQgaGFzCi0gICAgIG9ubHkgb25lIGhhcmQgbGluay4gICovCi0gIGlmICghIGV4aXN0cyB8fCAoIVNfSVNMTksgKHMuc3RfbW9kZSkgJiYgcy5zdF9ubGluayA9PSAxKSkKLSAgICB7Ci0gICAgICByZXQgPSByZW5hbWUgKGZyb20sIHRvKTsKLSAgICAgIGlmIChyZXQgPT0gMCkKLQl7Ci0JICBpZiAoZXhpc3RzKQotCSAgICB7Ci0JICAgICAgLyogVHJ5IHRvIHByZXNlcnZlIHRoZSBwZXJtaXNzaW9uIGJpdHMgYW5kIG93bmVyc2hpcCBvZgotCQkgVE8uICBGaXJzdCBnZXQgdGhlIG1vZGUgcmlnaHQgZXhjZXB0IGZvciB0aGUgc2V0dWlkCi0JCSBiaXQuICBUaGVuIGNoYW5nZSB0aGUgb3duZXJzaGlwLiAgVGhlbiBmaXggdGhlIHNldHVpZAotCQkgYml0LiAgV2UgZG8gdGhlIGNobW9kIGJlZm9yZSB0aGUgY2hvd24gYmVjYXVzZSBpZiB0aGUKLQkJIGNob3duIHN1Y2NlZWRzLCBhbmQgd2UgYXJlIGEgbm9ybWFsIHVzZXIsIHdlIHdvbid0IGJlCi0JCSBhYmxlIHRvIGRvIHRoZSBjaG1vZCBhZnRlcndhcmQuICBXZSBkb24ndCBib3RoZXIgdG8KLQkJIGZpeCB0aGUgc2V0dWlkIGJpdCBmaXJzdCBiZWNhdXNlIHRoYXQgbWlnaHQgaW50cm9kdWNlCi0JCSBhIGZsZWV0aW5nIHNlY3VyaXR5IHByb2JsZW0sIGFuZCBiZWNhdXNlIHRoZSBjaG93bgotCQkgd2lsbCBjbGVhciB0aGUgc2V0dWlkIGJpdCBhbnlob3cuICBXZSBvbmx5IGZpeCB0aGUKLQkJIHNldHVpZCBiaXQgaWYgdGhlIGNob3duIHN1Y2NlZWRzLCBiZWNhdXNlIHdlIGRvbid0Ci0JCSB3YW50IHRvIGludHJvZHVjZSBhbiB1bmV4cGVjdGVkIHNldHVpZCBmaWxlIG93bmVkIGJ5Ci0JCSB0aGUgdXNlciBydW5uaW5nIG9iamNvcHkuICAqLwotCSAgICAgIGNobW9kICh0bywgcy5zdF9tb2RlICYgMDc3Nyk7Ci0JICAgICAgaWYgKGNob3duICh0bywgcy5zdF91aWQsIHMuc3RfZ2lkKSA+PSAwKQotCQljaG1vZCAodG8sIHMuc3RfbW9kZSAmIDA3Nzc3KTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuICovCi0JICBub25fZmF0YWwgKF8oIiVzOiByZW5hbWU6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKLQkgIHVubGluayAoZnJvbSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldCA9IHNpbXBsZV9jb3B5IChmcm9tLCB0byk7Ci0gICAgICBpZiAocmV0ICE9IDApCi0Jbm9uX2ZhdGFsIChfKCIlczogc2ltcGxlX2NvcHk6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQotCXNldF90aW1lcyAodG8sICZzKTsKLSAgICAgIHVubGluayAoZnJvbSk7Ci0gICAgfQotI2VuZGlmIC8qIF9XSU4zMiAmJiAhX19DWUdXSU4zMl9fICovCi0KLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc2Jpbi5jIGIvYmludXRpbHMvcmVzYmluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzA3ZmIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzYmluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzg3ICswLDAgQEAKLS8qIHJlc2Jpbi5jIC0tIG1hbmlwdWxhdGUgdGhlIFdpbmRvd3MgYmluYXJ5IHJlc291cmNlIGZvcm1hdC4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBjb252ZXJ0IGJldHdlZW4gdGhlIGJpbmFyeSByZXNvdXJjZQotICAgZm9ybWF0IGFuZCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyB0aGF0IHdlIHdhbnQgdG8gdXNlLiAgVGhlIHNhbWUKLSAgIGJpbmFyeSByZXNvdXJjZSBmb3JtYXQgaXMgdXNlZCBpbiBib3RoIHJlcyBhbmQgQ09GRiBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLS8qIE1hY3JvcyB0byBzd2FwIGluIHZhbHVlcy4gICovCi0KLSNkZWZpbmUgZ2V0XzE2KGJlLCBzKSAoKGJlKSA/IGJmZF9nZXRiMTYgKHMpIDogYmZkX2dldGwxNiAocykpCi0jZGVmaW5lIGdldF8zMihiZSwgcykgKChiZSkgPyBiZmRfZ2V0YjMyIChzKSA6IGJmZF9nZXRsMzIgKHMpKQotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZCB0b29zbWFsbCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB1bmljaGFyICpnZXRfdW5pY29kZQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZ2V0X3Jlc2lkCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2dlbmVyaWMKLSAgUEFSQU1TICgoZW51bSByZXNfdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19jdXJzb3IKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX21lbnUKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgbWVudWl0ZW0gKmJpbl90b19yZXNfbWVudWl0ZW1zCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50LCBpbnQgKikpOwotc3RhdGljIHN0cnVjdCBtZW51aXRlbSAqYmluX3RvX3Jlc19tZW51ZXhpdGVtcwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2RpYWxvZwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfc3RyaW5nCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19mb250ZGlyCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX3JjZGF0YQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZ3JvdXBfY3Vyc29yCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19ncm91cF9pY29uCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc192ZXJzaW9uCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc191c2VyZGF0YQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotCi0vKiBHaXZlbiBhIHJlc291cmNlIHR5cGUgSUQsIGEgcG9pbnRlciB0byBkYXRhLCBhIGxlbmd0aCwgcmV0dXJuIGEKLSAgIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGF0IHJlc291cmNlLiAgVGhlIGNhbGxlcgotICAgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgcmVzX2luZm8gYW5kIGNvZmZfaW5mbyBmaWVsZHMKLSAgIG9mIHRoZSByZXR1cm5lZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXMgKHR5cGUsIGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgc3RydWN0IHJlc19pZCB0eXBlOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGlmICh0eXBlLm5hbWVkKQotICAgIHJldHVybiBiaW5fdG9fcmVzX3VzZXJkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoICh0eXBlLnUuaWQpCi0JewotCWRlZmF1bHQ6Ci0JICByZXR1cm4gYmluX3RvX3Jlc191c2VyZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0NVUlNPUjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0JJVE1BUDoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX0JJVE1BUCwgZGF0YSwgbGVuZ3RoKTsKLQljYXNlIFJUX0lDT046Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9JQ09OLCBkYXRhLCBsZW5ndGgpOwotCWNhc2UgUlRfTUVOVToKLQkgIHJldHVybiBiaW5fdG9fcmVzX21lbnUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9ESUFMT0c6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19kaWFsb2cgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9TVFJJTkc6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19zdHJpbmcgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9GT05URElSOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZm9udGRpciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0ZPTlQ6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9GT05ULCBkYXRhLCBsZW5ndGgpOwotCWNhc2UgUlRfQUNDRUxFUkFUT1I6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9SQ0RBVEE6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19yY2RhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9NRVNTQUdFVEFCTEU6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9NRVNTQUdFVEFCTEUsIGRhdGEsIGxlbmd0aCk7Ci0JY2FzZSBSVF9HUk9VUF9DVVJTT1I6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19ncm91cF9jdXJzb3IgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9HUk9VUF9JQ09OOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZ3JvdXBfaWNvbiAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX1ZFUlNJT046Ci0JICByZXR1cm4gYmluX3RvX3Jlc192ZXJzaW9uIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCX0KLSAgICB9Ci19Ci0KLS8qIEdpdmUgYW4gZXJyb3IgaWYgdGhlIGJpbmFyeSBkYXRhIGlzIHRvbyBzbWFsbC4gICovCi0KLXN0YXRpYyB2b2lkCi10b29zbWFsbCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsIChfKCIlczogbm90IGVub3VnaCBiaW5hcnkgZGF0YSIpLCBtc2cpOwotfQotCi0vKiBTd2FwIGluIGEgTlVMTCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nLiAgKi8KLQotc3RhdGljIHVuaWNoYXIgKgotZ2V0X3VuaWNvZGUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgcmV0bGVuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci0gICAgIGludCAqcmV0bGVuOwotewotICBpbnQgYywgaTsKLSAgdW5pY2hhciAqcmV0OwotCi0gIGMgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoIDwgKHVuc2lnbmVkIGxvbmcpIGMgKiAyICsgMikKLQl0b29zbWFsbCAoXygibnVsbCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nIikpOwotICAgICAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIGMgKiAyKSA9PSAwKQotCWJyZWFrOwotICAgICAgKytjOwotICAgIH0KLQotICByZXQgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKChjICsgMSkgKiBzaXplb2YgKHVuaWNoYXIpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHJldFtpXSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIGkgKiAyKTsKLSAgcmV0W2ldID0gMDsKLQotICBpZiAocmV0bGVuICE9IE5VTEwpCi0gICAgKnJldGxlbiA9IGM7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogR2V0IGEgcmVzb3VyY2UgaWRlbnRpZmllci4gIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfcmVzaWQgKGlkLCBkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIHN0cnVjdCByZXNfaWQgKmlkOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBmaXJzdDsKLQotICBpZiAobGVuZ3RoIDwgMikKLSAgICB0b29zbWFsbCAoXygicmVzb3VyY2UgSUQiKSk7Ci0KLSAgZmlyc3QgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICBpZiAoZmlyc3QgPT0gMHhmZmZmKQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPCA0KQotCXRvb3NtYWxsIChfKCJyZXNvdXJjZSBJRCIpKTsKLSAgICAgIGlkLT5uYW1lZCA9IDA7Ci0gICAgICBpZC0+dS5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWQtPm5hbWVkID0gMTsKLSAgICAgIGlkLT51Lm4ubmFtZSA9IGdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICZpZC0+dS5uLmxlbmd0aCk7Ci0gICAgICByZXR1cm4gaWQtPnUubi5sZW5ndGggKiAyICsgMjsKLSAgICB9Ci19Ci0KLS8qIENvbnZlcnQgYSByZXNvdXJjZSB3aGljaCBqdXN0IHN0b3JlcyB1bmludGVycHJldGVkIGRhdGEgZnJvbQotICAgYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2dlbmVyaWMgKHR5cGUsIGRhdGEsIGxlbmd0aCkKLSAgICAgZW51bSByZXNfdHlwZSB0eXBlOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLXsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gdHlwZTsKLSAgci0+dS5kYXRhLmRhdGEgPSBkYXRhOwotICByLT51LmRhdGEubGVuZ3RoID0gbGVuZ3RoOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgY3Vyc29yIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBjdXJzb3IgKmM7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDQpCi0gICAgdG9vc21hbGwgKF8oImN1cnNvciIpKTsKLQotICBjID0gKHN0cnVjdCBjdXJzb3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmMpOwotICBjLT54aG90c3BvdCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gIGMtPnlob3RzcG90ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gIGMtPmxlbmd0aCA9IGxlbmd0aCAtIDQ7Ci0gIGMtPmRhdGEgPSBkYXRhICsgNDsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfQ1VSU09SOwotICByLT51LmN1cnNvciA9IGM7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBtZW51IHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX21lbnUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBzdHJ1Y3QgbWVudSAqbTsKLSAgaW50IHZlcnNpb24sIHJlYWQ7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX01FTlU7Ci0KLSAgbSA9IChzdHJ1Y3QgbWVudSAqKSByZXNfYWxsb2MgKHNpemVvZiAqbSk7Ci0gIHItPnUubWVudSA9IG07Ci0KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgdG9vc21hbGwgKF8oIm1lbnUgaGVhZGVyIikpOwotCi0gIHZlcnNpb24gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotCi0gIGlmICh2ZXJzaW9uID09IDApCi0gICAgewotICAgICAgaWYgKGxlbmd0aCA8IDQpCi0JdG9vc21hbGwgKF8oIm1lbnUgaGVhZGVyIikpOwotICAgICAgbS0+aGVscCA9IDA7Ci0gICAgICBtLT5pdGVtcyA9IGJpbl90b19yZXNfbWVudWl0ZW1zIChkYXRhICsgNCwgbGVuZ3RoIC0gNCwgYmlnX2VuZGlhbiwKLQkJCQkgICAgICAgJnJlYWQpOwotICAgIH0KLSAgZWxzZSBpZiAodmVyc2lvbiA9PSAxKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA4KQotCXRvb3NtYWxsIChfKCJtZW51ZXggaGVhZGVyIikpOwotICAgICAgbS0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgb2Zmc2V0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICAgICBpZiAob2Zmc2V0ICsgNCA+PSBsZW5ndGgpCi0JdG9vc21hbGwgKF8oIm1lbnVleCBvZmZzZXQiKSk7Ci0gICAgICBtLT5pdGVtcyA9IGJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEgKyA0ICsgb2Zmc2V0LAotCQkJCQkgbGVuZ3RoIC0gKDQgKyBvZmZzZXQpLAotCQkJCQkgYmlnX2VuZGlhbiwKLQkJCQkJICZyZWFkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmYXRhbCAoXygidW5zdXBwb3J0ZWQgbWVudSB2ZXJzaW9uICVkIiksIHZlcnNpb24pOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IG1lbnUgaXRlbXMgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IG1lbnVpdGVtICoKLWJpbl90b19yZXNfbWVudWl0ZW1zIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIHJlYWQpCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLSAgICAgaW50ICpyZWFkOwotewotICBzdHJ1Y3QgbWVudWl0ZW0gKmZpcnN0LCAqKnBwOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgKnJlYWQgPSAwOwotCi0gIHdoaWxlIChsZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGludCBmbGFncywgc2xlbiwgaXRlbWxlbjsKLSAgICAgIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0gICAgICBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gICAgICBpZiAobGVuZ3RoIDwgNCkKLQl0b29zbWFsbCAoXygibWVudWl0ZW0gaGVhZGVyIikpOwotCi0gICAgICBtaSA9IChzdHJ1Y3QgbWVudWl0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKm1pKTsKLSAgICAgIG1pLT5zdGF0ZSA9IDA7Ci0gICAgICBtaS0+aGVscCA9IDA7Ci0KLSAgICAgIGZsYWdzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIG1pLT50eXBlID0gZmxhZ3MgJn4gKE1FTlVJVEVNX1BPUFVQIHwgTUVOVUlURU1fRU5ETUVOVSk7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBNRU5VSVRFTV9QT1BVUCkgPT0gMCkKLQlzdHJvZmYgPSA0OwotICAgICAgZWxzZQotCXN0cm9mZiA9IDI7Ci0KLSAgICAgIGlmIChsZW5ndGggPCBzdHJvZmYgKyAyKQotCXRvb3NtYWxsIChfKCJtZW51aXRlbSBoZWFkZXIiKSk7Ci0KLSAgICAgIGlmIChnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBzdHJvZmYpID09IDApCi0JewotCSAgc2xlbiA9IDA7Ci0JICBtaS0+dGV4dCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCW1pLT50ZXh0ID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyBzdHJvZmYsIGxlbmd0aCAtIHN0cm9mZiwgYmlnX2VuZGlhbiwKLQkJCQkmc2xlbik7Ci0KLSAgICAgIGl0ZW1sZW4gPSBzdHJvZmYgKyBzbGVuICogMiArIDI7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBNRU5VSVRFTV9QT1BVUCkgPT0gMCkKLQl7Ci0JICBtaS0+cG9wdXAgPSBOVUxMOwotCSAgbWktPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBzdWJyZWFkOwotCi0JICBtaS0+aWQgPSAwOwotCSAgbWktPnBvcHVwID0gYmluX3RvX3Jlc19tZW51aXRlbXMgKGRhdGEgKyBpdGVtbGVuLCBsZW5ndGggLSBpdGVtbGVuLAotCQkJCQkgICAgYmlnX2VuZGlhbiwgJnN1YnJlYWQpOwotCSAgaXRlbWxlbiArPSBzdWJyZWFkOwotCX0KLQotICAgICAgbWktPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gbWk7Ci0gICAgICBwcCA9ICZtaS0+bmV4dDsKLQotICAgICAgZGF0YSArPSBpdGVtbGVuOwotICAgICAgbGVuZ3RoIC09IGl0ZW1sZW47Ci0gICAgICAqcmVhZCArPSBpdGVtbGVuOwotCi0gICAgICBpZiAoKGZsYWdzICYgTUVOVUlURU1fRU5ETUVOVSkgIT0gMCkKLQlyZXR1cm4gZmlyc3Q7Ci0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBtZW51ZXggaXRlbXMgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IG1lbnVpdGVtICoKLWJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgcmVhZCkKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotICAgICBpbnQgKnJlYWQ7Ci17Ci0gIHN0cnVjdCBtZW51aXRlbSAqZmlyc3QsICoqcHA7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICAqcmVhZCA9IDA7Ci0KLSAgd2hpbGUgKGxlbmd0aCA+IDApCi0gICAgewotICAgICAgaW50IGZsYWdzLCBzbGVuOwotICAgICAgdW5zaWduZWQgaW50IGl0ZW1sZW47Ci0gICAgICBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gICAgICBpZiAobGVuZ3RoIDwgMTQpCi0JdG9vc21hbGwgKF8oIm1lbnVpdGVtIGhlYWRlciIpKTsKLQotICAgICAgbWkgPSAoc3RydWN0IG1lbnVpdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICptaSk7Ci0gICAgICBtaS0+dHlwZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBtaS0+c3RhdGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIG1pLT5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOwotCi0gICAgICBmbGFncyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEwKTsKLQotICAgICAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKSA9PSAwKQotCXsKLQkgIHNsZW4gPSAwOwotCSAgbWktPnRleHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQltaS0+dGV4dCA9IGdldF91bmljb2RlIChkYXRhICsgMTIsIGxlbmd0aCAtIDEyLCBiaWdfZW5kaWFuLCAmc2xlbik7Ci0KLSAgICAgIGl0ZW1sZW4gPSAxMiArIHNsZW4gKiAyICsgMjsKLSAgICAgIGl0ZW1sZW4gPSAoaXRlbWxlbiArIDMpICZ+IDM7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiAxKSA9PSAwKQotCXsKLQkgIG1pLT5wb3B1cCA9IE5VTEw7Ci0JICBtaS0+aGVscCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBzdWJyZWFkOwotCi0JICBpZiAobGVuZ3RoIDwgaXRlbWxlbiArIDQpCi0JICAgIHRvb3NtYWxsIChfKCJtZW51aXRlbSIpKTsKLQkgIG1pLT5oZWxwID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgaXRlbWxlbik7Ci0JICBpdGVtbGVuICs9IDQ7Ci0KLQkgIG1pLT5wb3B1cCA9IGJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEgKyBpdGVtbGVuLAotCQkJCQkgICAgICBsZW5ndGggLSBpdGVtbGVuLAotCQkJCQkgICAgICBiaWdfZW5kaWFuLCAmc3VicmVhZCk7Ci0JICBpdGVtbGVuICs9IHN1YnJlYWQ7Ci0JfQotCi0gICAgICBtaS0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBtaTsKLSAgICAgIHBwID0gJm1pLT5uZXh0OwotCi0gICAgICBkYXRhICs9IGl0ZW1sZW47Ci0gICAgICBsZW5ndGggLT0gaXRlbWxlbjsKLSAgICAgICpyZWFkICs9IGl0ZW1sZW47Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiAweDgwKSAhPSAwKQotCXJldHVybiBmaXJzdDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgZGlhbG9nIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19kaWFsb2cgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdmVyc2lvbjsKLSAgc3RydWN0IGRpYWxvZyAqZDsKLSAgaW50IGMsIHN1YmxlbiwgaTsKLSAgdW5zaWduZWQgaW50IG9mZjsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDE4KQotICAgIHRvb3NtYWxsIChfKCJkaWFsb2cgaGVhZGVyIikpOwotCi0gIGQgPSAoc3RydWN0IGRpYWxvZyAqKSByZXNfYWxsb2MgKHNpemVvZiAqZCk7Ci0KLSAgdmVyc2lvbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gIGlmICh2ZXJzaW9uICE9IDEpCi0gICAgewotICAgICAgZC0+ZXggPSBOVUxMOwotICAgICAgZC0+c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgZC0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgb2ZmID0gODsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc2lnbmF0dXJlOwotCi0gICAgICBzaWduYXR1cmUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGlmIChzaWduYXR1cmUgIT0gMHhmZmZmKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGRpYWxvZyBzaWduYXR1cmUgJWQiKSwgc2lnbmF0dXJlKTsKLQotICAgICAgZC0+ZXggPSAoc3RydWN0IGRpYWxvZ19leCAqKSByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOwotICAgICAgZC0+ZXgtPmhlbHAgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGQtPmV4c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGQtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMTIpOwotICAgICAgb2ZmID0gMTY7Ci0gICAgfQotCi0gIGlmIChsZW5ndGggPCBvZmYgKyAxMCkKLSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGhlYWRlciIpKTsKLQotICBjID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLSAgZC0+eCA9IGdldF8xNiAgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyAyKTsKLSAgZC0+eSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotICBkLT53aWR0aCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDYpOwotICBkLT5oZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKLQotICBvZmYgKz0gMTA7Ci0KLSAgc3VibGVuID0gZ2V0X3Jlc2lkICgmZC0+bWVudSwgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgb2ZmICs9IHN1YmxlbjsKLQotICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkLT5jbGFzcywgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgb2ZmICs9IHN1YmxlbjsKLQotICBkLT5jYXB0aW9uID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbiwgJnN1Ymxlbik7Ci0gIG9mZiArPSBzdWJsZW4gKiAyICsgMjsKLQotICBpZiAoKGQtPnN0eWxlICYgRFNfU0VURk9OVCkgPT0gMCkKLSAgICB7Ci0gICAgICBkLT5wb2ludHNpemUgPSAwOwotICAgICAgZC0+Zm9udCA9IE5VTEw7Ci0gICAgICBpZiAoZC0+ZXggIT0gTlVMTCkKLQl7Ci0JICBkLT5leC0+d2VpZ2h0ID0gMDsKLQkgIGQtPmV4LT5pdGFsaWMgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoIDwgb2ZmICsgMikKLQl0b29zbWFsbCAoXygiZGlhbG9nIGZvbnQgcG9pbnQgc2l6ZSIpKTsKLQotICAgICAgZC0+cG9pbnRzaXplID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLSAgICAgIG9mZiArPSAyOwotCi0gICAgICBpZiAoZC0+ZXggIT0gTlVMTCkKLQl7Ci0JICBpZiAobGVuZ3RoIDwgb2ZmICsgNCkKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZ2V4IGZvbnQgaW5mb3JtYXRpb24iKSk7Ci0JICBkLT5leC0+d2VpZ2h0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLQkgIGQtPmV4LT5pdGFsaWMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyAyKTsKLQkgIG9mZiArPSA0OwotCX0KLQotICAgICAgZC0+Zm9udCA9IGdldF91bmljb2RlIChkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4sICZzdWJsZW4pOwotICAgICAgb2ZmICs9IHN1YmxlbiAqIDIgKyAyOwotICAgIH0KLQotICBkLT5jb250cm9scyA9IE5VTEw7Ci0gIHBwID0gJmQtPmNvbnRyb2xzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkYzsKLSAgICAgIGludCBkYXRhbGVuOwotCi0gICAgICBvZmYgPSAob2ZmICsgMykgJn4gMzsKLQotICAgICAgZGMgPSAoc3RydWN0IGRpYWxvZ19jb250cm9sICopIHJlc19hbGxvYyAoc2l6ZW9mICpkYyk7Ci0KLSAgICAgIGlmIChkLT5leCA9PSBOVUxMKQotCXsKLQkgIGlmIChsZW5ndGggPCBvZmYgKyA4KQotCSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGNvbnRyb2wiKSk7Ci0KLQkgIGRjLT5zdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0JICBkYy0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotCSAgZGMtPmhlbHAgPSAwOwotCSAgb2ZmICs9IDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZW5ndGggPCBvZmYgKyAxMikKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZ2V4IGNvbnRyb2wiKSk7Ci0JICBkYy0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0JICBkYy0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotCSAgZGMtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgOCk7Ci0JICBvZmYgKz0gMTI7Ci0JfQotCi0gICAgICBpZiAobGVuZ3RoIDwgb2ZmICsgMTApCi0JdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIikpOwotCi0gICAgICBkYy0+eCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0gICAgICBkYy0+eSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDIpOwotICAgICAgZGMtPndpZHRoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7Ci0gICAgICBkYy0+aGVpZ2h0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNik7Ci0KLSAgICAgIGlmIChkLT5leCAhPSBOVUxMKQotICAgICAgICBkYy0+aWQgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKLSAgICAgIGVsc2UKLSAgICAgICAgZGMtPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgOCk7Ci0KLSAgICAgIG9mZiArPSAxMCArIChkLT5leCAhPSBOVUxMID8gMiA6IDApOwotCi0gICAgICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkYy0+Y2xhc3MsIGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbik7Ci0gICAgICBvZmYgKz0gc3VibGVuOwotCi0gICAgICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkYy0+dGV4dCwgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgICAgIG9mZiArPSBzdWJsZW47Ci0KLSAgICAgIGlmIChsZW5ndGggPCBvZmYgKyAyKQotCXRvb3NtYWxsIChfKCJkaWFsb2cgY29udHJvbCBlbmQiKSk7Ci0KLSAgICAgIGRhdGFsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotICAgICAgb2ZmICs9IDI7Ci0KLSAgICAgIGlmIChkYXRhbGVuID09IDApCi0JZGMtPmRhdGEgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIG9mZiA9IChvZmYgKyAzKSAmfiAzOwotCi0JICBpZiAobGVuZ3RoIDwgb2ZmICsgZGF0YWxlbikKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIGRhdGEiKSk7Ci0KLQkgIGRjLT5kYXRhID0gKChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikKLQkJICAgICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCByY2RhdGFfaXRlbSkpKTsKLQkgIGRjLT5kYXRhLT5uZXh0ID0gTlVMTDsKLQkgIGRjLT5kYXRhLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKLQkgIGRjLT5kYXRhLT51LmJ1ZmZlci5sZW5ndGggPSBkYXRhbGVuOwotCSAgZGMtPmRhdGEtPnUuYnVmZmVyLmRhdGEgPSBkYXRhICsgb2ZmOwotCi0JICBvZmYgKz0gZGF0YWxlbjsJICAKLQl9Ci0KLSAgICAgIGRjLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGRjOwotICAgICAgcHAgPSAmZGMtPm5leHQ7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9ESUFMT0c7Ci0gIHItPnUuZGlhbG9nID0gZDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIHN0cmluZ3RhYmxlIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19zdHJpbmcgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0OwotICBpbnQgaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBzdCA9IChzdHJ1Y3Qgc3RyaW5ndGFibGUgKikgcmVzX2FsbG9jIChzaXplb2YgKnN0KTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2xlbjsKLQotICAgICAgaWYgKGxlbmd0aCA8IDIpCi0JdG9vc21hbGwgKF8oInN0cmluZ3RhYmxlIHN0cmluZyBsZW5ndGgiKSk7Ci0gICAgICBzbGVuID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIHN0LT5zdHJpbmdzW2ldLmxlbmd0aCA9IHNsZW47Ci0KLSAgICAgIGlmIChzbGVuID4gMCkKLQl7Ci0JICB1bmljaGFyICpzOwotCSAgdW5zaWduZWQgaW50IGo7Ci0KLQkgIGlmIChsZW5ndGggPCAyICsgMiAqIHNsZW4pCi0JICAgIHRvb3NtYWxsIChfKCJzdHJpbmd0YWJsZSBzdHJpbmciKSk7Ci0KLQkgIHMgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKHNsZW4gKiBzaXplb2YgKHVuaWNoYXIpKTsKLQkgIHN0LT5zdHJpbmdzW2ldLnN0cmluZyA9IHM7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBzbGVuOyBqKyspCi0JICAgIHNbal0gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyICsgaiAqIDIpOwotCX0KLQotICAgICAgZGF0YSArPSAyICsgMiAqIHNsZW47Ci0gICAgICBsZW5ndGggLT0gMiArIDIgKiBzbGVuOwotICAgIH0KLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfU1RSSU5HVEFCTEU7Ci0gIHItPnUuc3RyaW5ndGFibGUgPSBzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGZvbnRkaXIgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2ZvbnRkaXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgYywgaTsKLSAgc3RydWN0IGZvbnRkaXIgKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCAyKQotICAgIHRvb3NtYWxsIChfKCJmb250ZGlyIGhlYWRlciIpKTsKLQotICBjID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGZvbnRkaXIgKmZkOwotICAgICAgdW5zaWduZWQgaW50IG9mZjsKLQotICAgICAgaWYgKGxlbmd0aCA8IDU2KQotCXRvb3NtYWxsIChfKCJmb250ZGlyIikpOwotCi0gICAgICBmZCA9IChzdHJ1Y3QgZm9udGRpciAqKSByZXNfYWxsb2MgKHNpemVvZiAqZmQpOwotICAgICAgZmQtPmluZGV4ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQotICAgICAgLyogVG8gd29yayBvdXQgdGhlIGxlbmd0aCBvZiB0aGUgZm9udGRpciBkYXRhLCB3ZSBtdXN0IGdldCB0aGUKLSAgICAgICAgIGxlbmd0aCBvZiB0aGUgZGV2aWNlIG5hbWUgYW5kIGZhY2UgbmFtZSBzdHJpbmdzLCBldmVuIHRob3VnaAotICAgICAgICAgd2UgZG9uJ3Qgc3RvcmUgdGhlbSBpbiB0aGUgZm9udGRpciBzdHJ1Y3R1cmUuICBUaGUKLSAgICAgICAgIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IHRoZXNlIGFyZSBOVUxMIHRlcm1pbmF0ZWQgY2hhcgotICAgICAgICAgc3RyaW5ncywgbm90IFVuaWNvZGUgc3RyaW5ncy4gICovCi0KLSAgICAgIG9mZiA9IDU2OwotCi0gICAgICB3aGlsZSAob2ZmIDwgbGVuZ3RoICYmIGRhdGFbb2ZmXSAhPSAnXDAnKQotCSsrb2ZmOwotICAgICAgaWYgKG9mZiA+PSBsZW5ndGgpCi0JdG9vc21hbGwgKF8oImZvbnRkaXIgZGV2aWNlIG5hbWUiKSk7Ci0gICAgICArK29mZjsKLQotICAgICAgd2hpbGUgKG9mZiA8IGxlbmd0aCAmJiBkYXRhW29mZl0gIT0gJ1wwJykKLQkrK29mZjsKLSAgICAgIGlmIChvZmYgPj0gbGVuZ3RoKQotCXRvb3NtYWxsIChfKCJmb250ZGlyIGZhY2UgbmFtZSIpKTsKLSAgICAgICsrb2ZmOwotCi0gICAgICBmZC0+bGVuZ3RoID0gb2ZmOwotICAgICAgZmQtPmRhdGEgPSBkYXRhOwotCi0gICAgICBmZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBmZDsKLSAgICAgIHBwID0gJmZkLT5uZXh0OwotCi0gICAgICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGFueSByb3VuZGluZyBpcwotICAgICAgICAgcmVxdWlyZWQuICAqLwotCi0gICAgICBkYXRhICs9IG9mZjsKLSAgICAgIGxlbmd0aCAtPSBvZmY7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9GT05URElSOwotICByLT51LmZvbnRkaXIgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhbiBhY2NlbGVyYXRvcnMgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2FjY2VsZXJhdG9ycyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmE7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA4KQotCXRvb3NtYWxsIChfKCJhY2NlbGVyYXRvciIpKTsKLQotICAgICAgYSA9IChzdHJ1Y3QgYWNjZWxlcmF0b3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmEpOwotCi0gICAgICBhLT5mbGFncyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBhLT5rZXkgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGEtPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0KLSAgICAgIGEtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gYTsKLSAgICAgIHBwID0gJmEtPm5leHQ7Ci0KLSAgICAgIGlmICgoYS0+ZmxhZ3MgJiBBQ0NfTEFTVCkgIT0gMCkKLQlicmVhazsKLQotICAgICAgZGF0YSArPSA4OwotICAgICAgbGVuZ3RoIC09IDg7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjsKLSAgci0+dS5hY2MgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhbiByY2RhdGEgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3JjZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgcmkgPSAoc3RydWN0IHJjZGF0YV9pdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICpyaSk7Ci0KLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IFJDREFUQV9CVUZGRVI7Ci0gIHJpLT51LmJ1ZmZlci5sZW5ndGggPSBsZW5ndGg7Ci0gIHJpLT51LmJ1ZmZlci5kYXRhID0gZGF0YTsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfUkNEQVRBOwotICByLT51LnJjZGF0YSA9IHJpOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZ3JvdXAgY3Vyc29yIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19ncm91cF9jdXJzb3IgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdHlwZSwgYywgaTsKLSAgc3RydWN0IGdyb3VwX2N1cnNvciAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDYpCi0gICAgdG9vc21hbGwgKF8oImdyb3VwIGN1cnNvciBoZWFkZXIiKSk7Ci0KLSAgdHlwZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICBpZiAodHlwZSAhPSAyKQotICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIGdyb3VwIGN1cnNvciB0eXBlICVkIiksIHR5cGUpOwotCi0gIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLQotICBkYXRhICs9IDY7Ci0gIGxlbmd0aCAtPSA2OwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpnYzsKLQotICAgICAgaWYgKGxlbmd0aCA8IDE0KQotCXRvb3NtYWxsIChfKCJncm91cCBjdXJzb3IiKSk7Ci0KLSAgICAgIGdjID0gKHN0cnVjdCBncm91cF9jdXJzb3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmdjKTsKLQotICAgICAgZ2MtPndpZHRoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIGdjLT5oZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGdjLT5wbGFuZXMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGdjLT5iaXRzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNik7Ci0gICAgICBnYy0+Ynl0ZXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGdjLT5pbmRleCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKTsKLQotICAgICAgZ2MtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZ2M7Ci0gICAgICBwcCA9ICZnYy0+bmV4dDsKLQotICAgICAgZGF0YSArPSAxNDsKLSAgICAgIGxlbmd0aCAtPSAxNDsKLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0dST1VQX0NVUlNPUjsKLSAgci0+dS5ncm91cF9jdXJzb3IgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGdyb3VwIGljb24gcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2dyb3VwX2ljb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdHlwZSwgYywgaTsKLSAgc3RydWN0IGdyb3VwX2ljb24gKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCA2KQotICAgIHRvb3NtYWxsIChfKCJncm91cCBpY29uIGhlYWRlciIpKTsKLQotICB0eXBlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gIGlmICh0eXBlICE9IDEpCi0gICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgZ3JvdXAgaWNvbiB0eXBlICVkIiksIHR5cGUpOwotCi0gIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLQotICBkYXRhICs9IDY7Ci0gIGxlbmd0aCAtPSA2OwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgICAgIGlmIChsZW5ndGggPCAxNCkKLQl0b29zbWFsbCAoXygiZ3JvdXAgaWNvbiIpKTsKLQotICAgICAgZ2kgPSAoc3RydWN0IGdyb3VwX2ljb24gKikgcmVzX2FsbG9jIChzaXplb2YgKmdpKTsKLQotICAgICAgZ2ktPndpZHRoID0gZGF0YVswXTsKLSAgICAgIGdpLT5oZWlnaHQgPSBkYXRhWzFdOwotICAgICAgZ2ktPmNvbG9ycyA9IGRhdGFbMl07Ci0gICAgICBnaS0+cGxhbmVzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBnaS0+Yml0cyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDYpOwotICAgICAgZ2ktPmJ5dGVzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgOCk7Ci0gICAgICBnaS0+aW5kZXggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7Ci0KLSAgICAgIGdpLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGdpOwotICAgICAgcHAgPSAmZ2ktPm5leHQ7Ci0KLSAgICAgIGRhdGEgKz0gMTQ7Ci0gICAgICBsZW5ndGggLT0gMTQ7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9HUk9VUF9JQ09OOwotICByLT51Lmdyb3VwX2ljb24gPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogRXh0cmFjdCBkYXRhIGZyb20gYSB2ZXJzaW9uIGhlYWRlci4gIElmIEtFWSBpcyBub3QgTlVMTCwgdGhlbiB0aGUKLSAgIGtleSBtdXN0IGJlIEtFWTsgb3RoZXJ3aXNlLCB0aGUga2V5IGlzIHJldHVybmVkIGluICpQS0VZLiAgVGhpcwotICAgc2V0cyAqTEVOIHRvIHRoZSB0b3RhbCBsZW5ndGgsICpWQUxMRU4gdG8gdGhlIHZhbHVlIGxlbmd0aCwgKlRZUEUKLSAgIHRvIHRoZSB0eXBlLCBhbmQgKk9GRiB0byB0aGUgb2Zmc2V0IHRvIHRoZSBjaGlsZHJlbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwga2V5LCBwa2V5LCBsZW4sIHZhbGxlbiwgdHlwZSwKLQkJICAgIG9mZikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotICAgICBjb25zdCBjaGFyICprZXk7Ci0gICAgIHVuaWNoYXIgKipwa2V5OwotICAgICBpbnQgKmxlbjsKLSAgICAgaW50ICp2YWxsZW47Ci0gICAgIGludCAqdHlwZTsKLSAgICAgaW50ICpvZmY7Ci17Ci0gIGlmIChsZW5ndGggPCA4KQotICAgIHRvb3NtYWxsIChrZXkpOwotCi0gICpsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAqdmFsbGVuID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICp0eXBlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0KLSAgKm9mZiA9IDY7Ci0KLSAgbGVuZ3RoIC09IDY7Ci0gIGRhdGEgKz0gNjsKLQotICBpZiAoa2V5ID09IE5VTEwpCi0gICAgewotICAgICAgaW50IHN1YmxlbjsKLQotICAgICAgKnBrZXkgPSBnZXRfdW5pY29kZSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAmc3VibGVuKTsKLSAgICAgICpvZmYgKz0gc3VibGVuICogMiArIDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaWYgKGxlbmd0aCA8IDIpCi0JICAgIHRvb3NtYWxsIChrZXkpOwotCSAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSkgIT0gKHVuc2lnbmVkIGNoYXIpICprZXkpCi0JICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIikpOwotCi0JICAqb2ZmICs9IDI7Ci0JICBsZW5ndGggLT0gMjsKLQkgIGRhdGEgKz0gMjsKLQotCSAgaWYgKCprZXkgPT0gJ1wwJykKLQkgICAgYnJlYWs7Ci0KLQkgICsra2V5OwotCX0KLSAgICB9Ci0KLSAgKm9mZiA9ICgqb2ZmICsgMykgJn4gMzsKLX0KLQotLyogQ29udmVydCBhIHZlcnNpb24gcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3ZlcnNpb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdmVybGVuLCB2YWxsZW4sIHR5cGUsIG9mZjsKLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaTsKLSAgc3RydWN0IHZlcl9pbmZvICpmaXJzdCwgKipwcDsKLSAgc3RydWN0IHZlcnNpb25pbmZvICp2OwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAiVlNfVkVSU0lPTl9JTkZPIiwKLQkJICAgICAgKHVuaWNoYXIgKikgTlVMTCwgJnZlcmxlbiwgJnZhbGxlbiwgJnR5cGUsICZvZmYpOwotCi0gIGlmICgodW5zaWduZWQgaW50KSB2ZXJsZW4gIT0gbGVuZ3RoKQotICAgIGZhdGFsIChfKCJ2ZXJzaW9uIGxlbmd0aCAlZCBkb2VzIG5vdCBtYXRjaCByZXNvdXJjZSBsZW5ndGggJWx1IiksCi0JICAgdmVybGVuLCBsZW5ndGgpOwotCi0gIGlmICh0eXBlICE9IDApCi0gICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiB0eXBlICVkIiksIHR5cGUpOwotCi0gIGRhdGEgKz0gb2ZmOwotICBsZW5ndGggLT0gb2ZmOwotCi0gIGlmICh2YWxsZW4gPT0gMCkKLSAgICBmaSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZSwgZml2OwotCi0gICAgICBpZiAodmFsbGVuICE9IDUyKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24gbGVuZ3RoICVkIiksIHZhbGxlbik7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA1MikKLQl0b29zbWFsbCAoXygiZml4ZWQgdmVyc2lvbiBpbmZvIikpOwotCi0gICAgICBzaWduYXR1cmUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgaWYgKHNpZ25hdHVyZSAhPSAweGZlZWYwNGJkKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gc2lnbmF0dXJlICVsdSIpLCBzaWduYXR1cmUpOwotCi0gICAgICBmaXYgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGlmIChmaXYgIT0gMCAmJiBmaXYgIT0gMHgxMDAwMCkKLQlmYXRhbCAoXygidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIGluZm8gdmVyc2lvbiAlbHUiKSwgZml2KTsKLQotICAgICAgZmkgPSAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICpmaSk7Ci0KLSAgICAgIGZpLT5maWxlX3ZlcnNpb25fbXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGZpLT5maWxlX3ZlcnNpb25fbHMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7Ci0gICAgICBmaS0+cHJvZHVjdF92ZXJzaW9uX21zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMTYpOwotICAgICAgZmktPnByb2R1Y3RfdmVyc2lvbl9scyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDIwKTsKLSAgICAgIGZpLT5maWxlX2ZsYWdzX21hc2sgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAyNCk7Ci0gICAgICBmaS0+ZmlsZV9mbGFncyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDI4KTsKLSAgICAgIGZpLT5maWxlX29zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMzIpOwotICAgICAgZmktPmZpbGVfdHlwZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDM2KTsKLSAgICAgIGZpLT5maWxlX3N1YnR5cGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0MCk7Ci0gICAgICBmaS0+ZmlsZV9kYXRlX21zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNDQpOwotICAgICAgZmktPmZpbGVfZGF0ZV9scyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQ4KTsKLQotICAgICAgZGF0YSArPSA1MjsKLSAgICAgIGxlbmd0aCAtPSA1MjsKLSAgICB9Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICB3aGlsZSAobGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZpOwotICAgICAgaW50IGNoOwotCi0gICAgICBpZiAobGVuZ3RoIDwgOCkKLQl0b29zbWFsbCAoXygidmVyc2lvbiB2YXIgaW5mbyIpKTsKLQotICAgICAgdmkgPSAoc3RydWN0IHZlcl9pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2aSk7Ci0KLSAgICAgIGNoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNik7Ci0KLSAgICAgIGlmIChjaCA9PSAnUycpCi0JewotCSAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICoqcHB2czsKLQotCSAgdmktPnR5cGUgPSBWRVJJTkZPX1NUUklORzsKLQotCSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICJTdHJpbmdGaWxlSW5mbyIsCi0JCQkgICAgICAodW5pY2hhciAqKSBOVUxMLCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwKLQkJCSAgICAgICZvZmYpOwotCi0JICBpZiAodmFsbGVuICE9IDApCi0JICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHN0cmluZ2ZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICBkYXRhICs9IG9mZjsKLQkgIGxlbmd0aCAtPSBvZmY7Ci0KLQkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJICAgICAgJnZpLT51LnN0cmluZy5sYW5ndWFnZSwgJnZlcmxlbiwgJnZhbGxlbiwKLQkJCSAgICAgICZ0eXBlLCAmb2ZmKTsKLQotCSAgaWYgKHZhbGxlbiAhPSAwKQotCSAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZ3RhYmxlIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICBkYXRhICs9IG9mZjsKLQkgIGxlbmd0aCAtPSBvZmY7Ci0JICB2ZXJsZW4gLT0gb2ZmOwotCi0JICB2aS0+dS5zdHJpbmcuc3RyaW5ncyA9IE5VTEw7Ci0JICBwcHZzID0gJnZpLT51LnN0cmluZy5zdHJpbmdzOwotCi0JICAvKiBJdCdzIGNvbnZlbmllbnQgdG8gcm91bmQgdmVybGVuIHRvIGEgNCBieXRlIGFsaWdubWVudCwKLSAgICAgICAgICAgICBzaW5jZSB3ZSByb3VuZCB0aGUgc3VidmFyaWFibGVzIGluIHRoZSBsb29wLiAgKi8KLQkgIHZlcmxlbiA9ICh2ZXJsZW4gKyAzKSAmfiAzOwotCi0JICB3aGlsZSAodmVybGVuID4gMCkKLQkgICAgewotCSAgICAgIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnM7Ci0JICAgICAgaW50IHN1YnZlcmxlbiwgdnNsZW4sIHZhbG9mZjsKLQotCSAgICAgIHZzID0gKHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnMpOwotCi0JICAgICAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sCi0JCQkJICAoY29uc3QgY2hhciAqKSBOVUxMLCAmdnMtPmtleSwgJnN1YnZlcmxlbiwKLQkJCQkgICZ2YWxsZW4sICZ0eXBlLCAmb2ZmKTsKLQotCSAgICAgIHN1YnZlcmxlbiA9IChzdWJ2ZXJsZW4gKyAzKSAmfiAzOwotCi0JICAgICAgZGF0YSArPSBvZmY7Ci0JICAgICAgbGVuZ3RoIC09IG9mZjsKLQotCSAgICAgIHZzLT52YWx1ZSA9IGdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICZ2c2xlbik7Ci0JICAgICAgdmFsb2ZmID0gdnNsZW4gKiAyICsgMjsKLQkgICAgICB2YWxvZmYgPSAodmFsb2ZmICsgMykgJn4gMzsKLQotCSAgICAgIGlmIChvZmYgKyB2YWxvZmYgIT0gc3VidmVybGVuKQotCQlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgIT0gJWQgKyAlZCIpLAotCQkgICAgICAgc3VidmVybGVuLCBvZmYsIHZhbG9mZik7Ci0KLQkgICAgICB2cy0+bmV4dCA9IE5VTEw7Ci0JICAgICAgKnBwdnMgPSB2czsKLQkgICAgICBwcHZzID0gJnZzLT5uZXh0OwotCi0JICAgICAgZGF0YSArPSB2YWxvZmY7Ci0JICAgICAgbGVuZ3RoIC09IHZhbG9mZjsKLQotCSAgICAgIGlmICh2ZXJsZW4gPCBzdWJ2ZXJsZW4pCi0JCWZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIGxlbmd0aCAlZCA8ICVkIiksCi0JCSAgICAgICB2ZXJsZW4sIHN1YnZlcmxlbik7Ci0KLQkgICAgICB2ZXJsZW4gLT0gc3VidmVybGVuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoY2ggPT0gJ1YnKQotCXsKLQkgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqKnBwdnY7Ci0KLQkgIHZpLT50eXBlID0gVkVSSU5GT19WQVI7Ci0KLQkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAiVmFyRmlsZUluZm8iLAotCQkJICAgICAgKHVuaWNoYXIgKikgTlVMTCwgJnZlcmxlbiwgJnZhbGxlbiwgJnR5cGUsCi0JCQkgICAgICAmb2ZmKTsKLQotCSAgaWYgKHZhbGxlbiAhPSAwKQotCSAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2YXJmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiKSwgdmFsbGVuKTsKLQotCSAgZGF0YSArPSBvZmY7Ci0JICBsZW5ndGggLT0gb2ZmOwotCi0JICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCSAgICAgICZ2aS0+dS52YXIua2V5LCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwgJm9mZik7Ci0KLQkgIGRhdGEgKz0gb2ZmOwotCSAgbGVuZ3RoIC09IG9mZjsKLQotCSAgdmktPnUudmFyLnZhciA9IE5VTEw7Ci0JICBwcHZ2ID0gJnZpLT51LnZhci52YXI7Ci0KLQkgIHdoaWxlICh2YWxsZW4gPiAwKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2djsKLQotCSAgICAgIGlmIChsZW5ndGggPCA0KQotCQl0b29zbWFsbCAoXygidmVyc2lvbiB2YXJmaWxlaW5mbyIpKTsKLQotCSAgICAgIHZ2ID0gKHN0cnVjdCB2ZXJfdmFyaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnYpOwotCi0JICAgICAgdnYtPmxhbmd1YWdlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQkgICAgICB2di0+Y2hhcnNldCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotCi0JICAgICAgdnYtPm5leHQgPSBOVUxMOwotCSAgICAgICpwcHZ2ID0gdnY7Ci0JICAgICAgcHB2diA9ICZ2di0+bmV4dDsKLQotCSAgICAgIGRhdGEgKz0gNDsKLQkgICAgICBsZW5ndGggLT0gNDsKLQotCSAgICAgIGlmICh2YWxsZW4gPCA0KQotCQlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICAgICAgdmFsbGVuIC09IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciKSk7Ci0KLSAgICAgIHZpLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IHZpOwotICAgICAgcHAgPSAmdmktPm5leHQ7ICAgICAgCi0gICAgfQotCi0gIHYgPSAoc3RydWN0IHZlcnNpb25pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2KTsKLSAgdi0+Zml4ZWQgPSBmaTsKLSAgdi0+dmFyID0gZmlyc3Q7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX1ZFUlNJT05JTkZPOwotICByLT51LnZlcnNpb25pbmZvID0gdjsKLQotICByZXR1cm4gcjsgIAotfQotCi0vKiBDb252ZXJ0IGFuIGFyYml0cmFyeSB1c2VyIGRlZmluZWQgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3VzZXJkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLQotICByaS0+bmV4dCA9IE5VTEw7Ci0gIHJpLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKLSAgcmktPnUuYnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKLSAgcmktPnUuYnVmZmVyLmRhdGEgPSBkYXRhOwotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9VU0VSREFUQTsKLSAgci0+dS5yY2RhdGEgPSByaTsKLQotICByZXR1cm4gcjsKLX0KLQwKLS8qIE1hY3JvcyB0byBzd2FwIG91dCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIHB1dF8xNihiZSwgdiwgcykgKChiZSkgPyBiZmRfcHV0YjE2ICgodiksIChzKSkgOiBiZmRfcHV0bDE2ICgodiksIChzKSkpCi0jZGVmaW5lIHB1dF8zMihiZSwgdiwgcykgKChiZSkgPyBiZmRfcHV0YjMyICgodiksIChzKSkgOiBiZmRfcHV0bDMyICgodiksIChzKSkpCi0KLS8qIExvY2FsIGZ1bmN0aW9ucyB1c2VkIHRvIGNvbnZlcnQgcmVzb3VyY2VzIHRvIGJpbmFyeSBmb3JtYXQuICAqLwotCi1zdGF0aWMgdm9pZCBkd29yZF9hbGlnbl9iaW4gUEFSQU1TICgoc3RydWN0IGJpbmRhdGEgKioqLCB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzaWRfdG9fYmluIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICp1bmljb2RlX3RvX2JpbiBQQVJBTVMgKChjb25zdCB1bmljaGFyICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2FjY2VsZXJhdG9yCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9jdXJzb3IKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGN1cnNvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9ncm91cF9jdXJzb3IKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9kaWFsb2cKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGRpYWxvZyAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9mb250ZGlyCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBmb250ZGlyICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2dyb3VwX2ljb24KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fbWVudQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9tZW51aXRlbXMKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnVpdGVtICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX21lbnVleGl0ZW1zCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9yY2RhdGEKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX3N0cmluZ3RhYmxlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqc3RyaW5nX3RvX3VuaWNvZGVfYmluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fdmVyc2lvbmluZm8KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHZlcnNpb25pbmZvICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2dlbmVyaWMKLSAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci0KLS8qIENvbnZlcnQgYSByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluIChyZXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN3aXRjaCAocmVzLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBSRVNfVFlQRV9CSVRNQVA6Ci0gICAgY2FzZSBSRVNfVFlQRV9GT05UOgotICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2dlbmVyaWMgKHJlcy0+dS5kYXRhLmxlbmd0aCwgcmVzLT51LmRhdGEuZGF0YSk7Ci0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2FjY2VsZXJhdG9yIChyZXMtPnUuYWNjLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2N1cnNvciAocmVzLT51LmN1cnNvciwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9ncm91cF9jdXJzb3IgKHJlcy0+dS5ncm91cF9jdXJzb3IsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZGlhbG9nIChyZXMtPnUuZGlhbG9nLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0ZPTlRESVI6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9mb250ZGlyIChyZXMtPnUuZm9udGRpciwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9JQ09OOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZ3JvdXBfaWNvbiAocmVzLT51Lmdyb3VwX2ljb24sIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX21lbnUgKHJlcy0+dS5tZW51LCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX3JjZGF0YSAocmVzLT51LnJjZGF0YSwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX3N0cmluZ3RhYmxlIChyZXMtPnUuc3RyaW5ndGFibGUsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9yY2RhdGEgKHJlcy0+dS5yY2RhdGEsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl92ZXJzaW9uaW5mbyAocmVzLT51LnZlcnNpb25pbmZvLCBiaWdfZW5kaWFuKTsKLSAgICB9Ci19Ci0KLS8qIEFsaWduIHRvIGEgMzIgYml0IGJvdW5kYXJ5LiAgUFBQIHBvaW50cyB0byB0aGUgb2YgYSBsaXN0IG9mIGJpbmRhdGEKLSAgIHN0cnVjdHVyZXMuICBMRU5HVEggcG9pbnRzIHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cnVjdHVyZXMuICBJZgotICAgbmVjZXNzYXJ5LCB0aGlzIGFkZHMgYSBuZXcgYmluZGF0YSB0byBicmluZyBsZW5ndGggdXAgdG8gYSAzMiBiaXQKLSAgIGJvdW5kYXJ5LiAgSXQgdXBkYXRlcyAqUFBQIGFuZCAqTEVOR1RILiAgKi8KLQotc3RhdGljIHZvaWQKLWR3b3JkX2FsaWduX2JpbiAocHBwLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBiaW5kYXRhICoqKnBwcDsKLSAgICAgdW5zaWduZWQgbG9uZyAqbGVuZ3RoOwotewotICBpbnQgYWRkOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBpZiAoKCpsZW5ndGggJiAzKSA9PSAwKQotICAgIHJldHVybjsKLQotICBhZGQgPSA0IC0gKCpsZW5ndGggJiAzKTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBhZGQ7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoYWRkKTsKLSAgbWVtc2V0IChkLT5kYXRhLCAwLCBhZGQpOwotCi0gIGQtPm5leHQgPSBOVUxMOwotICAqKnBwcCA9IGQ7Ci0gICpwcHAgPSAmKCoqcHBwKS0+bmV4dDsKLQotICAqbGVuZ3RoICs9IGFkZDsKLX0KLQotLyogQ29udmVydCBhIHJlc291cmNlIElEIHRvIGJpbmFyeS4gIFRoaXMgYWx3YXlzIHJldHVybnMgZXhhY3RseSBvbmUKLSAgIGJpbmRhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc2lkX3RvX2JpbiAoaWQsIGJpZ19lbmRpYW4pCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCi0gIGlmICghIGlkLm5hbWVkKQotICAgIHsKLSAgICAgIGQtPmxlbmd0aCA9IDQ7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAweGZmZmYsIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBpZC51LmlkLCBkLT5kYXRhICsgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGQtPmxlbmd0aCA9IGlkLnUubi5sZW5ndGggKiAyICsgMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpZC51Lm4ubGVuZ3RoOyBpKyspCi0JcHV0XzE2IChiaWdfZW5kaWFuLCBpZC51Lm4ubmFtZVtpXSwgZC0+ZGF0YSArIGkgKiAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIGkgKiAyKTsKLSAgICB9Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7Ci19Ci0KLS8qIENvbnZlcnQgYSBudWxsIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmcgdG8gYmluYXJ5LiAgVGhpcyBhbHdheXMKLSAgIHJldHVybnMgZXhhY3RseSBvbmUgYmluZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotdW5pY29kZV90b19iaW4gKHN0ciwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5pY2hhciAqc3RyOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IGxlbjsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgbGVuID0gMDsKLSAgaWYgKHN0ciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IHVuaWNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9IHN0cjsgKnMgIT0gMDsgcysrKQotCSsrbGVuOwotICAgIH0KLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBsZW4gKiAyICsgMjsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGlmIChzdHIgPT0gTlVMTCkKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgdW5pY2hhciAqczsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKHMgPSBzdHIsIGkgPSAwOyAqcyAhPSAwOyBzKyssIGkrKykKLQlwdXRfMTYgKGJpZ19lbmRpYW4sICpzLCBkLT5kYXRhICsgaSAqIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgaSAqIDIpOwotICAgIH0KLQotICBkLT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsKLX0KLQotLyogQ29udmVydCBhbiBhY2NlbGVyYXRvciByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9hY2NlbGVyYXRvciAoYWNjZWxlcmF0b3JzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmFjY2VsZXJhdG9yczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICphOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChhID0gYWNjZWxlcmF0b3JzOyBhICE9IE5VTEw7IGEgPSBhLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gODsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoOCk7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwKLQkgICAgICBhLT5mbGFncyB8IChhLT5uZXh0ICE9IE5VTEwgPyAwIDogQUNDX0xBU1QpLAotCSAgICAgIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBhLT5rZXksIGQtPmRhdGEgKyAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgYS0+aWQsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIDgpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBjdXJzb3IgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fY3Vyc29yIChjLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgY3Vyc29yICpjOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bGVuZ3RoID0gNDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg0KTsKLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMtPnhob3RzcG90LCBkLT5kYXRhKTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLT55aG90c3BvdCwgZC0+ZGF0YSArIDIpOwotCi0gIGQtPm5leHQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPm5leHQtPmxlbmd0aCA9IGMtPmxlbmd0aDsKLSAgZC0+bmV4dC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGMtPmRhdGE7Ci0gIGQtPm5leHQtPm5leHQgPSBOVUxMOwotCi0gIHJldHVybiBkOwotfQotCi0vKiBDb252ZXJ0IGEgZ3JvdXAgY3Vyc29yIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dyb3VwX2N1cnNvciAoZ3JvdXBfY3Vyc29ycywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqZ3JvdXBfY3Vyc29yczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgaW50IGM7Ci0gIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdjOwotCi0gIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKLSAgZmlyc3QtPmxlbmd0aCA9IDY7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIDIsIGZpcnN0LT5kYXRhICsgMik7Ci0KLSAgZmlyc3QtPm5leHQgPSBOVUxMOwotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICBjID0gMDsKLSAgZm9yIChnYyA9IGdyb3VwX2N1cnNvcnM7IGdjICE9IE5VTEw7IGdjID0gZ2MtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDE0OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxNCk7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPndpZHRoLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPmhlaWdodCwgZC0+ZGF0YSArIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+cGxhbmVzLCBkLT5kYXRhICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT5iaXRzLCBkLT5kYXRhICsgNik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGdjLT5ieXRlcywgZC0+ZGF0YSArIDgpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+aW5kZXgsIGQtPmRhdGEgKyAxMik7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYywgZmlyc3QtPmRhdGEgKyA0KTsKLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBkaWFsb2cgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZGlhbG9nIChkaWFsb2csIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBkaWFsb2dleDsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgaW50IG9mZiwgYzsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkYzsKLQotICBkaWFsb2dleCA9IGV4dGVuZGVkX2RpYWxvZyAoZGlhbG9nKTsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSBkaWFsb2dleCA/IDI2IDogMTg7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGZpcnN0LT5sZW5ndGgpOwotCi0gIGxlbmd0aCA9IGZpcnN0LT5sZW5ndGg7Ci0KLSAgaWYgKCEgZGlhbG9nZXgpCi0gICAgewotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPnN0eWxlLCBmaXJzdC0+ZGF0YSk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXhzdHlsZSwgZmlyc3QtPmRhdGEgKyA0KTsKLSAgICAgIG9mZiA9IDg7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAxLCBmaXJzdC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDB4ZmZmZiwgZmlyc3QtPmRhdGEgKyAyKTsKLQotICAgICAgaWYgKGRpYWxvZy0+ZXggPT0gTlVMTCkKLQlwdXRfMzIgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhICsgNCk7Ci0gICAgICBlbHNlCi0JcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4LT5oZWxwLCBmaXJzdC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4c3R5bGUsIGZpcnN0LT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+c3R5bGUsIGZpcnN0LT5kYXRhICsgMTIpOwotICAgICAgb2ZmID0gMTY7Ci0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT54LCBmaXJzdC0+ZGF0YSArIG9mZiArIDIpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+eSwgZmlyc3QtPmRhdGEgKyBvZmYgKyA0KTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPndpZHRoLCBmaXJzdC0+ZGF0YSArIG9mZiArIDYpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+aGVpZ2h0LCBmaXJzdC0+ZGF0YSArIG9mZiArIDgpOwotCi0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gICpwcCA9IHJlc2lkX3RvX2JpbiAoZGlhbG9nLT5tZW51LCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gICpwcCA9IHJlc2lkX3RvX2JpbiAoZGlhbG9nLT5jbGFzcywgYmlnX2VuZGlhbik7Ci0gIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAqcHAgPSB1bmljb2RlX3RvX2JpbiAoZGlhbG9nLT5jYXB0aW9uLCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gIGlmICgoZGlhbG9nLT5zdHlsZSAmIERTX1NFVEZPTlQpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSBkaWFsb2dleCA/IDYgOiAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+cG9pbnRzaXplLCBkLT5kYXRhKTsKLQotICAgICAgaWYgKGRpYWxvZ2V4KQotCXsKLQkgIGlmIChkaWFsb2ctPmV4ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyAyKTsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyA0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4LT53ZWlnaHQsIGQtPmRhdGEgKyAyKTsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXgtPml0YWxpYywgZC0+ZGF0YSArIDQpOwotCSAgICB9Ci0JfQotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gdW5pY29kZV90b19iaW4gKGRpYWxvZy0+Zm9udCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotICAgIH0KLQotICBjID0gMDsKLSAgZm9yIChkYyA9IGRpYWxvZy0+Y29udHJvbHM7IGRjICE9IE5VTEw7IGRjID0gZGMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZGNvZmY7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gZGlhbG9nZXggPyAyNCA6IDE4OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotCi0gICAgICBpZiAoISBkaWFsb2dleCkKLQl7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5zdHlsZSwgZC0+ZGF0YSk7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5leHN0eWxlLCBkLT5kYXRhICsgNCk7Ci0JICBkY29mZiA9IDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmhlbHAsIGQtPmRhdGEpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+ZXhzdHlsZSwgZC0+ZGF0YSArIDQpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+c3R5bGUsIGQtPmRhdGEgKyA4KTsKLQkgIGRjb2ZmID0gMTI7Ci0JfQotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT54LCBkLT5kYXRhICsgZGNvZmYpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+eSwgZC0+ZGF0YSArIGRjb2ZmICsgMik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT53aWR0aCwgZC0+ZGF0YSArIGRjb2ZmICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT5oZWlnaHQsIGQtPmRhdGEgKyBkY29mZiArIDYpOwotCi0gICAgICBpZiAoZGlhbG9nZXgpCi0gICAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmlkLCBkLT5kYXRhICsgZGNvZmYgKyA4KTsKLSAgICAgIGVsc2UKLSAgICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+aWQsIGQtPmRhdGEgKyBkY29mZiArIDgpOwotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gcmVzaWRfdG9fYmluIChkYy0+Y2xhc3MsIGJpZ19lbmRpYW4pOwotICAgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAgICAgKnBwID0gcmVzaWRfdG9fYmluIChkYy0+dGV4dCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7Ci0KLSAgICAgIGxlbmd0aCArPSAyOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICBpZiAoZGMtPmRhdGEgPT0gTlVMTCkKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgc3VibGVuOwotCi0JICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0KLQkgICpwcCA9IHJlc190b19iaW5fcmNkYXRhIChkYy0+ZGF0YSwgYmlnX2VuZGlhbik7Ci0JICBzdWJsZW4gPSAwOwotCSAgd2hpbGUgKCpwcCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3VibGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0JICAgIH0KLQotCSAgcHV0XzE2IChiaWdfZW5kaWFuLCBzdWJsZW4sIGQtPmRhdGEpOwotCi0JICBsZW5ndGggKz0gc3VibGVuOwotCX0KLSAgICB9Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYywgZmlyc3QtPmRhdGEgKyBvZmYpOwotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIGZvbnRkaXIgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZm9udGRpciAoZm9udGRpcnMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBmb250ZGlyICpmb250ZGlyczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgaW50IGM7Ci0gIGNvbnN0IHN0cnVjdCBmb250ZGlyICpmZDsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSAyOwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgyKTsKLQotICBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gIGMgPSAwOwotICBmb3IgKGZkID0gZm9udGRpcnM7IGZkICE9IE5VTEw7IGZkID0gZmQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDIpOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGZkLT5pbmRleCwgZC0+ZGF0YSk7Ci0KLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gZmQtPmxlbmd0aDsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBmZC0+ZGF0YTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsgICAgICAKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSk7Ci0KLSAgcmV0dXJuIGZpcnN0OyAgCi19Ci0KLS8qIENvbnZlcnQgYSBncm91cCBpY29uIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dyb3VwX2ljb24gKGdyb3VwX2ljb25zLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ3JvdXBfaWNvbnM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGludCBjOwotICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgZmlyc3QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZmlyc3QpOwotICBmaXJzdC0+bGVuZ3RoID0gNjsKLSAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSk7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgZmlyc3QtPmRhdGEgKyAyKTsKLQotICBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gIGMgPSAwOwotICBmb3IgKGdpID0gZ3JvdXBfaWNvbnM7IGdpICE9IE5VTEw7IGdpID0gZ2ktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDE0OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxNCk7Ci0KLSAgICAgIGQtPmRhdGFbMF0gPSBnaS0+d2lkdGg7Ci0gICAgICBkLT5kYXRhWzFdID0gZ2ktPmhlaWdodDsKLSAgICAgIGQtPmRhdGFbMl0gPSBnaS0+Y29sb3JzOwotICAgICAgZC0+ZGF0YVszXSA9IDA7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdpLT5wbGFuZXMsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2ktPmJpdHMsIGQtPmRhdGEgKyA2KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZ2ktPmJ5dGVzLCBkLT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdpLT5pbmRleCwgZC0+ZGF0YSArIDEyKTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSArIDQpOwotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIG1lbnUgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fbWVudSAobWVudSwgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgbWVudWV4OwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBtZW51ZXggPSBleHRlbmRlZF9tZW51IChtZW51KTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBtZW51ZXggPyA4IDogNDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGlmICghIG1lbnVleCkKLSAgICB7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgMik7Ci0KLSAgICAgIGQtPm5leHQgPSByZXNfdG9fYmluX21lbnVpdGVtcyAobWVudS0+aXRlbXMsIGJpZ19lbmRpYW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDQsIGQtPmRhdGEgKyAyKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWVudS0+aGVscCwgZC0+ZGF0YSArIDQpOwotCi0gICAgICBkLT5uZXh0ID0gcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAobWVudS0+aXRlbXMsIGJpZ19lbmRpYW4pOwotICAgIH0KLQotICByZXR1cm4gZDsKLX0KLQotLyogQ29udmVydCBtZW51IGl0ZW1zIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX21lbnVpdGVtcyAoaXRlbXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKG1pID0gaXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZmxhZ3M7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSBtaS0+cG9wdXAgPT0gTlVMTCA/IDQgOiAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBmbGFncyA9IG1pLT50eXBlOwotICAgICAgaWYgKG1pLT5uZXh0ID09IE5VTEwpCi0JZmxhZ3MgfD0gTUVOVUlURU1fRU5ETUVOVTsKLSAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKLQlmbGFncyB8PSBNRU5VSVRFTV9QT1BVUDsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBmbGFncywgZC0+ZGF0YSk7Ci0KLSAgICAgIGlmIChtaS0+cG9wdXAgPT0gTlVMTCkKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIG1pLT5pZCwgZC0+ZGF0YSArIDIpOwotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gdW5pY29kZV90b19iaW4gKG1pLT50ZXh0LCBiaWdfZW5kaWFuKTsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgKnBwID0gcmVzX3RvX2Jpbl9tZW51aXRlbXMgKG1pLT5wb3B1cCwgYmlnX2VuZGlhbik7Ci0JICB3aGlsZSAoKnBwICE9IE5VTEwpCi0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IG1lbnVleCBpdGVtcyB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAoaXRlbXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgbGVuZ3RoID0gMDsKLQotICBmb3IgKG1pID0gaXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZmxhZ3M7Ci0KLSAgICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDEyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxMik7Ci0KLSAgICAgIGxlbmd0aCArPSAxMjsKLQotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBtaS0+dHlwZSwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIG1pLT5zdGF0ZSwgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBtaS0+aWQsIGQtPmRhdGEgKyA4KTsKLQotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKG1pLT5uZXh0ID09IE5VTEwpCi0JZmxhZ3MgfD0gMHg4MDsKLSAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKLQlmbGFncyB8PSAxOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBmbGFncywgZC0+ZGF0YSArIDEwKTsKLQotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0KLSAgICAgICpwcCA9IHVuaWNvZGVfdG9fYmluIChtaS0+dGV4dCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0JICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCSAgZC0+bGVuZ3RoID0gNDsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7Ci0KLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWktPmhlbHAsIGQtPmRhdGEpOwotCi0JICAqcHAgPSBkOwotCSAgcHAgPSAmZC0+bmV4dDsKLQotCSAgKnBwID0gcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAobWktPnBvcHVwLCBiaWdfZW5kaWFuKTsKLQkgIHdoaWxlICgqcHAgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYW4gcmNkYXRhIHJlc291cmNlIHRvIGJpbmFyeS4gIFRoaXMgaXMgYWxzbyB1c2VkIHRvIGNvbnZlcnQKLSAgIG90aGVyIGluZm9ybWF0aW9uIHdoaWNoIGhhcHBlbnMgdG8gYmUgc3RvcmVkIGluIHJjZGF0YV9pdGVtIGxpc3RzCi0gICB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9yY2RhdGEgKGl0ZW1zLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKml0ZW1zOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChyaSA9IGl0ZW1zOyByaSAhPSBOVUxMOyByaSA9IHJpLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCi0gICAgICBzd2l0Y2ggKHJpLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIFJDREFUQV9XT1JEOgotCSAgZC0+bGVuZ3RoID0gMjsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7Ci0JICBwdXRfMTYgKGJpZ19lbmRpYW4sIHJpLT51LndvcmQsIGQtPmRhdGEpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9EV09SRDoKLQkgIGQtPmxlbmd0aCA9IDQ7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCByaS0+dS5kd29yZCwgZC0+ZGF0YSk7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX1NUUklORzoKLQkgIGQtPmxlbmd0aCA9IHJpLT51LnN0cmluZy5sZW5ndGg7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmktPnUuc3RyaW5nLnM7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX1dTVFJJTkc6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQotCSAgICBkLT5sZW5ndGggPSByaS0+dS53c3RyaW5nLmxlbmd0aCAqIDI7Ci0JICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IHJpLT51LndzdHJpbmcubGVuZ3RoOyBpKyspCi0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCByaS0+dS53c3RyaW5nLndbaV0sIGQtPmRhdGEgKyBpICogMik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBSQ0RBVEFfQlVGRkVSOgotCSAgZC0+bGVuZ3RoID0gcmktPnUuYnVmZmVyLmxlbmd0aDsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByaS0+dS5idWZmZXIuZGF0YTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgc3RyaW5ndGFibGUgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fc3RyaW5ndGFibGUgKHN0LCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0OwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBpbnQgaTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIGludCBzbGVuLCBqOwotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICB1bmljaGFyICpzOwotCi0gICAgICBzbGVuID0gc3QtPnN0cmluZ3NbaV0ubGVuZ3RoOwotICAgICAgcyA9IHN0LT5zdHJpbmdzW2ldLnN0cmluZzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDIgKyBzbGVuICogMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBzbGVuLCBkLT5kYXRhKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IHNsZW47IGorKykKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIHNbal0sIGQtPmRhdGEgKyAyICsgaiAqIDIpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OyAgICAgIAotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBiaW5hcnkgc3RyaW5nLiAgVGhpcyBhbHdheXMKLSAgIHJldHVybnMgZXhhY3RseSBvbmUgYmluZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotc3RyaW5nX3RvX3VuaWNvZGVfYmluIChzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc2l6ZV90IGxlbiwgaTsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgbGVuID0gc3RybGVuIChzKTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBsZW4gKiAyICsgMjsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHNbaV0sIGQtPmRhdGEgKyBpICogMik7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIGkgKiAyKTsKLQotICBkLT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsgIAotfQotCi0vKiBDb252ZXJ0IGEgdmVyc2lvbmluZm8gcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fdmVyc2lvbmluZm8gKHZlcnNpb25pbmZvLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgc3RydWN0IHZlcl9pbmZvICp2aTsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSA2OwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotICBsZW5ndGggPSA2OwotCi0gIGlmICh2ZXJzaW9uaW5mby0+Zml4ZWQgPT0gTlVMTCkKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhICsgMik7Ci0gIGVsc2UKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDUyLCBmaXJzdC0+ZGF0YSArIDIpOwotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEgKyA0KTsKLQotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICAqcHAgPSBzdHJpbmdfdG9fdW5pY29kZV9iaW4gKCJWU19WRVJTSU9OX0lORk8iLCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICBpZiAodmVyc2lvbmluZm8tPmZpeGVkICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaTsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gNTI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDUyKTsKLQotICAgICAgbGVuZ3RoICs9IDUyOwotCi0gICAgICBmaSA9IHZlcnNpb25pbmZvLT5maXhlZDsKLQotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCAweGZlZWYwNGJkLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgMHgxMDAwMCwgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV92ZXJzaW9uX21zLCBkLT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX3ZlcnNpb25fbHMsIGQtPmRhdGEgKyAxMik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5wcm9kdWN0X3ZlcnNpb25fbXMsIGQtPmRhdGEgKyAxNik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5wcm9kdWN0X3ZlcnNpb25fbHMsIGQtPmRhdGEgKyAyMCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX2ZsYWdzX21hc2ssIGQtPmRhdGEgKyAyNCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX2ZsYWdzLCBkLT5kYXRhICsgMjgpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9vcywgZC0+ZGF0YSArIDMyKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfdHlwZSwgZC0+ZGF0YSArIDM2KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfc3VidHlwZSwgZC0+ZGF0YSArIDQwKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZGF0ZV9tcywgZC0+ZGF0YSArIDQ0KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZGF0ZV9scywgZC0+ZGF0YSArIDQ4KTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgZm9yICh2aSA9IHZlcnNpb25pbmZvLT52YXI7IHZpICE9IE5VTEw7IHZpID0gdmktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKnZpZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmlsZW47Ci0KLSAgICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICAgICAgdmlkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZpZCk7Ci0gICAgICB2aWQtPmxlbmd0aCA9IDY7Ci0gICAgICB2aWQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLSAgICAgIGxlbmd0aCArPSA2OwotICAgICAgdmlsZW4gPSA2OwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZpZC0+ZGF0YSArIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2aWQtPmRhdGEgKyA0KTsKLQotICAgICAgKnBwID0gdmlkOwotICAgICAgcHAgPSAmdmlkLT5uZXh0OwotCi0gICAgICBzd2l0Y2ggKHZpLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIFZFUklORk9fU1RSSU5HOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGhvbGQsIHZzbGVuOwotCSAgICBzdHJ1Y3QgYmluZGF0YSAqdnNkOwotCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzOwotCi0JICAgICpwcCA9IHN0cmluZ190b191bmljb2RlX2JpbiAoIlN0cmluZ0ZpbGVJbmZvIiwgYmlnX2VuZGlhbik7Ci0JICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICB2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotCSAgICBob2xkID0gbGVuZ3RoOwotCSAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JICAgIHZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkgICAgdnNkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZzZCk7Ci0JICAgIHZzZC0+bGVuZ3RoID0gNjsKLQkgICAgdnNkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0JICAgIGxlbmd0aCArPSA2OwotCSAgICB2aWxlbiArPSA2OwotCSAgICB2c2xlbiA9IDY7Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2c2QtPmRhdGEgKyAyKTsKLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2c2QtPmRhdGEgKyA0KTsKLQotCSAgICAqcHAgPSB2c2Q7Ci0JICAgIHBwID0gJnZzZC0+bmV4dDsKLQotCSAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAodmktPnUuc3RyaW5nLmxhbmd1YWdlLCBiaWdfZW5kaWFuKTsKLQkgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0JICAgIGZvciAodnMgPSB2aS0+dS5zdHJpbmcuc3RyaW5nczsgdnMgIT0gTlVMTDsgdnMgPSB2cy0+bmV4dCkKLQkgICAgICB7Ci0JCXN0cnVjdCBiaW5kYXRhICp2c3NkOwotCQl1bnNpZ25lZCBsb25nIHZzc2xlbjsKLQotCQlob2xkID0gbGVuZ3RoOwotCQlkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JCXZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkJdnNzZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2c3NkKTsKLQkJdnNzZC0+bGVuZ3RoID0gNjsKLQkJdnNzZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotCQlsZW5ndGggKz0gNjsKLQkJdmlsZW4gKz0gNjsKLQkJdnNsZW4gKz0gNjsKLQkJdnNzbGVuID0gNjsKLQotCQlwdXRfMTYgKGJpZ19lbmRpYW4sIDEsIHZzc2QtPmRhdGEgKyA0KTsKLQotCQkqcHAgPSB2c3NkOwotCQlwcCA9ICZ2c3NkLT5uZXh0OwotCi0JCSpwcCA9IHVuaWNvZGVfdG9fYmluICh2cy0+a2V5LCBiaWdfZW5kaWFuKTsKLQkJbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZzc2xlbiArPSAoKnBwKS0+bGVuZ3RoOwotCQlwcCA9ICYoKnBwKS0+bmV4dDsKLQotCQlob2xkID0gbGVuZ3RoOwotCQlkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JCXZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzc2xlbiArPSBsZW5ndGggLSBob2xkOwotCi0JCSpwcCA9IHVuaWNvZGVfdG9fYmluICh2cy0+dmFsdWUsIGJpZ19lbmRpYW4pOwotIAkJcHV0XzE2IChiaWdfZW5kaWFuLCAoKnBwKS0+bGVuZ3RoIC8gMiwgdnNzZC0+ZGF0YSArIDIpOwotCQlsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkJdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJdnNsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJdnNzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXBwID0gJigqcHApLT5uZXh0OwotCi0JCXB1dF8xNiAoYmlnX2VuZGlhbiwgdnNzbGVuLCB2c3NkLT5kYXRhKTsKLQkgICAgICB9Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2c2xlbiwgdnNkLT5kYXRhKTsKLQotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgVkVSSU5GT19WQVI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaG9sZCwgdnZsZW4sIHZ2dmxlbjsKLQkgICAgc3RydWN0IGJpbmRhdGEgKnZ2ZDsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl92YXJpbmZvICp2djsKLQotCSAgICAqcHAgPSBzdHJpbmdfdG9fdW5pY29kZV9iaW4gKCJWYXJGaWxlSW5mbyIsIGJpZ19lbmRpYW4pOwotCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkgICAgaG9sZCA9IGxlbmd0aDsKLQkgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCSAgICB2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCi0JICAgIHZ2ZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2dmQpOwotCSAgICB2dmQtPmxlbmd0aCA9IDY7Ci0JICAgIHZ2ZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotCSAgICBsZW5ndGggKz0gNjsKLQkgICAgdmlsZW4gKz0gNjsKLQkgICAgdnZsZW4gPSA2OwotCi0JICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgdnZkLT5kYXRhICsgNCk7Ci0KLQkgICAgKnBwID0gdnZkOwotCSAgICBwcCA9ICZ2dmQtPm5leHQ7Ci0KLQkgICAgKnBwID0gdW5pY29kZV90b19iaW4gKHZpLT51LnZhci5rZXksIGJpZ19lbmRpYW4pOwotCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdnZsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkgICAgaG9sZCA9IGxlbmd0aDsKLQkgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCSAgICB2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCSAgICB2dmxlbiArPSBsZW5ndGggLSBob2xkOwotCi0JICAgIHZ2dmxlbiA9IDA7Ci0KLQkgICAgZm9yICh2diA9IHZpLT51LnZhci52YXI7IHZ2ICE9IE5VTEw7IHZ2ID0gdnYtPm5leHQpCi0JICAgICAgewotCQlzdHJ1Y3QgYmluZGF0YSAqdnZzZDsKLQotCQl2dnNkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZ2c2QpOwotCQl2dnNkLT5sZW5ndGggPSA0OwotCQl2dnNkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotCi0JCWxlbmd0aCArPSA0OwotCQl2aWxlbiArPSA0OwotCQl2dmxlbiArPSA0OwotCQl2dnZsZW4gKz0gNDsKLQotCQlwdXRfMTYgKGJpZ19lbmRpYW4sIHZ2LT5sYW5ndWFnZSwgdnZzZC0+ZGF0YSk7Ci0JCXB1dF8xNiAoYmlnX2VuZGlhbiwgdnYtPmNoYXJzZXQsIHZ2c2QtPmRhdGEgKyAyKTsKLQotCQl2dnNkLT5uZXh0ID0gTlVMTDsKLQkJKnBwID0gdnZzZDsKLQkJcHAgPSAmdnZzZC0+bmV4dDsKLQkgICAgICB9Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2dmxlbiwgdnZkLT5kYXRhKTsKLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2dnZsZW4sIHZ2ZC0+ZGF0YSArIDIpOwotCi0JICAgIGJyZWFrOwotCSAgfQotCX0KLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2aWxlbiwgdmlkLT5kYXRhKTsKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBsZW5ndGgsIGZpcnN0LT5kYXRhKTsKLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBnZW5lcmljIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dlbmVyaWMgKGxlbmd0aCwgZGF0YSkKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPmxlbmd0aCA9IGxlbmd0aDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGE7Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZXNjb2ZmLmMgYi9iaW51dGlscy9yZXNjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjQ4N2EuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzgxICswLDAgQEAKLS8qIHJlc2NvZmYuYyAtLSByZWFkIGFuZCB3cml0ZSByZXNvdXJjZXMgaW4gV2luZG93cyBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb24gdGhhdCByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJlc291cmNlcwotICAgaW4gQ09GRiBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotLyogSW4gb3JkZXIgdG8gdXNlIHRoZSBhZGRyZXNzIG9mIGEgcmVzb3VyY2UgZGF0YSBlbnRyeSwgd2UgbmVlZCB0bwotICAgZ2V0IHRoZSBpbWFnZSBiYXNlIG9mIHRoZSBmaWxlLiAgUmlnaHQgbm93IHdlIGV4dHJhY3QgaXQgZnJvbQotICAgaW50ZXJuYWwgQkZEIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogSW5mb3JtYXRpb24gd2UgZXh0cmFjdCBmcm9tIHRoZSBmaWxlLiAgKi8KLQotc3RydWN0IGNvZmZfZmlsZV9pbmZvCi17Ci0gIC8qIEZpbGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBEYXRhIHJlYWQgZnJvbSB0aGUgZmlsZS4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpkYXRhOwotICAvKiBFbmQgb2YgZGF0YSByZWFkIGZyb20gZmlsZS4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpkYXRhX2VuZDsKLSAgLyogQWRkcmVzcyBvZiB0aGUgcmVzb3VyY2Ugc2VjdGlvbiBtaW51cyB0aGUgaW1hZ2UgYmFzZSBvZiB0aGUgZmlsZS4gICovCi0gIGJmZF92bWEgc2VjYWRkcjsKLSAgLyogTm9uLXplcm8gaWYgdGhlIGZpbGUgaXMgYmlnIGVuZGlhbi4gICovCi0gIGludCBiaWdfZW5kaWFuOwotfTsKLQotLyogQSByZXNvdXJjZSBkaXJlY3RvcnkgdGFibGUgaW4gYSBDT0ZGIGZpbGUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkKLXsKLSAgLyogQ2hhcmFjdGVyaXN0aWNzLiAgKi8KLSAgYmZkX2J5dGUgY2hhcmFjdGVyaXN0aWNzWzRdOwotICAvKiBUaW1lIHN0YW1wLiAgKi8KLSAgYmZkX2J5dGUgdGltZVs0XTsKLSAgLyogTWFqb3IgdmVyc2lvbiBudW1iZXIuICAqLwotICBiZmRfYnl0ZSBtYWpvclsyXTsKLSAgLyogTWlub3IgdmVyc2lvbiBudW1iZXIuICAqLwotICBiZmRfYnl0ZSBtaW5vclsyXTsKLSAgLyogTnVtYmVyIG9mIG5hbWVkIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLSAgYmZkX2J5dGUgbmFtZV9jb3VudFsyXTsKLSAgLyogTnVtYmVyIG9mIGRpcmVjdG9yeSBlbnRyaWVzIHdpdGggSURzLiAgKi8KLSAgYmZkX2J5dGUgaWRfY291bnRbMl07Ci19OwotCi0vKiBBIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyeSBpbiBhIENPRkYgZmlsZS4gICovCi0KLXN0cnVjdCBleHRlcm5fcmVzX2VudHJ5Ci17Ci0gIC8qIE5hbWUgb3IgSUQuICAqLwotICBiZmRfYnl0ZSBuYW1lWzRdOwotICAvKiBBZGRyZXNzIG9mIHJlc291cmNlIGVudHJ5IG9yIHN1YmRpcmVjdG9yeS4gICovCi0gIGJmZF9ieXRlIHJ2YVs0XTsKLX07Ci0KLS8qIEEgcmVzb3VyY2UgZGF0YSBlbnRyeSBpbiBhIENPRkYgZmlsZS4gICovCi0KLXN0cnVjdCBleHRlcm5fcmVzX2RhdGEKLXsKLSAgLyogQWRkcmVzcyBvZiByZXNvdXJjZSBkYXRhLiAgVGhpcyBpcyBhcHBhcmVudGx5IGEgZmlsZSByZWxhdGl2ZQotICAgICBhZGRyZXNzLCByYXRoZXIgdGhhbiBhIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgYmZkX2J5dGUgcnZhWzRdOwotICAvKiBTaXplIG9mIHJlc291cmNlIGRhdGEuICAqLwotICBiZmRfYnl0ZSBzaXplWzRdOwotICAvKiBDb2RlIHBhZ2UuICAqLwotICBiZmRfYnl0ZSBjb2RlcGFnZVs0XTsKLSAgLyogUmVzZXJ2ZWQuICAqLwotICBiZmRfYnl0ZSByZXNlcnZlZFs0XTsKLX07Ci0KLS8qIE1hY3JvcyB0byBzd2FwIGluIHZhbHVlcy4gICovCi0KLSNkZWZpbmUgZ2V0ZmlfMTYoZmksIHMpICgoZmkpLT5iaWdfZW5kaWFuID8gYmZkX2dldGIxNiAocykgOiBiZmRfZ2V0bDE2IChzKSkKLSNkZWZpbmUgZ2V0ZmlfMzIoZmksIHMpICgoZmkpLT5iaWdfZW5kaWFuID8gYmZkX2dldGIzMiAocykgOiBiZmRfZ2V0bDMyIChzKSkKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgb3ZlcnJ1biBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfY29mZl9yZXNfZGlyCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICosIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVhZF9jb2ZmX2RhdGFfZW50cnkKLSAgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKiwgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7Ci0MCi0vKiBSZWFkIHRoZSByZXNvdXJjZXMgaW4gYSBDT0ZGIGZpbGUuICAqLwotCi1zdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1yZWFkX2NvZmZfcnNyYyAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICphYmZkOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyBmaW5mbzsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgaW5wdXQiKSk7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQlsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnNyYyIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IG5vIHJlc291cmNlIHNlY3Rpb25cbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgICAgIGZpbGVuYW1lKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYyk7Ci0gIGRhdGEgPSAoYmZkX2J5dGUgKikgcmVzX2FsbG9jIChzaXplKTsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgMCwgc2l6ZSkpCi0gICAgYmZkX2ZhdGFsIChfKCJjYW4ndCByZWFkIHJlc291cmNlIHNlY3Rpb24iKSk7Ci0KLSAgZmluZm8uZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgZmluZm8uZGF0YSA9IGRhdGE7Ci0gIGZpbmZvLmRhdGFfZW5kID0gZGF0YSArIHNpemU7Ci0gIGZpbmZvLnNlY2FkZHIgPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICAtIHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKTsKLSAgZmluZm8uYmlnX2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChhYmZkKTsKLQotICBiZmRfY2xvc2UgKGFiZmQpOwotCi0gIC8qIE5vdyBqdXN0IHJlYWQgaW4gdGhlIHRvcCBsZXZlbCByZXNvdXJjZSBkaXJlY3RvcnkuICBOb3RlIHRoYXQgd2UKLSAgICAgZG9uJ3QgZnJlZSBkYXRhLCBzaW5jZSB3ZSBjcmVhdGUgcmVzb3VyY2UgZW50cmllcyB0aGF0IHBvaW50IGludG8KLSAgICAgaXQuICBJZiB3ZSBldmVyIHdhbnQgdG8gZnJlZSB1cCB0aGUgcmVzb3VyY2UgaW5mb3JtYXRpb24gd2UgcmVhZCwKLSAgICAgdGhpcyB3aWxsIGhhdmUgdG8gYmUgY2xlYW5lZCB1cC4gICovCi0KLSAgcmV0dXJuIHJlYWRfY29mZl9yZXNfZGlyIChkYXRhLCAmZmluZm8sIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsIDApOwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGlmIHdlIGFyZSBvdXQgb2YgYm91bmRzLiAgKi8KLQotc3RhdGljIHZvaWQKLW92ZXJydW4gKGZpbmZvLCBtc2cpCi0gICAgIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqZmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgZmF0YWwgKF8oIiVzOiAlczogYWRkcmVzcyBvdXQgb2YgYm91bmRzIiksIGZpbmZvLT5maWxlbmFtZSwgbXNnKTsKLX0KLQotLyogUmVhZCBhIHJlc291cmNlIGRpcmVjdG9yeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1yZWFkX2NvZmZfcmVzX2RpciAoZGF0YSwgZmluZm8sIHR5cGUsIGxldmVsKQotICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICpmaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgaW50IGxldmVsOwotewotICBjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKmVyZDsKLSAgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOwotICBpbnQgbmFtZV9jb3VudCwgaWRfY291bnQsIGk7Ci0gIHN0cnVjdCByZXNfZW50cnkgKipwcDsKLSAgY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKmVyZTsKLQotICBpZiAoKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGRhdGEpIDwgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJkaXJlY3RvcnkiKSk7Ci0KLSAgZXJkID0gKGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSAqKSBkYXRhOwotCi0gIHJkID0gKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZCk7Ci0gIHJkLT5jaGFyYWN0ZXJpc3RpY3MgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+Y2hhcmFjdGVyaXN0aWNzKTsKLSAgcmQtPnRpbWUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+dGltZSk7Ci0gIHJkLT5tYWpvciA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5tYWpvcik7Ci0gIHJkLT5taW5vciA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5taW5vcik7Ci0gIHJkLT5lbnRyaWVzID0gTlVMTDsKLQotICBuYW1lX2NvdW50ID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcmQtPm5hbWVfY291bnQpOwotICBpZF9jb3VudCA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5pZF9jb3VudCk7Ci0KLSAgcHAgPSAmcmQtPmVudHJpZXM7Ci0KLSAgLyogVGhlIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyaWVzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZGlyZWN0b3J5Ci0gICAgIHRhYmxlLiAgKi8KLSAgZXJlID0gKGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5ICopIChlcmQgKyAxKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbmFtZV9jb3VudDsgaSsrLCBlcmUrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG5hbWUsIHJ2YTsKLSAgICAgIHN0cnVjdCByZXNfZW50cnkgKnJlOwotICAgICAgY29uc3QgYmZkX2J5dGUgKmVyczsKLSAgICAgIGludCBsZW5ndGgsIGo7Ci0KLSAgICAgIGlmICgoY29uc3QgYmZkX2J5dGUgKikgZXJlID49IGZpbmZvLT5kYXRhX2VuZCkKLQlvdmVycnVuIChmaW5mbywgXygibmFtZWQgZGlyZWN0b3J5IGVudHJ5IikpOwotCi0gICAgICBuYW1lID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPm5hbWUpOwotICAgICAgcnZhID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPnJ2YSk7Ci0KLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiB0aGUgaGlnaCBiaXQgaW4gTkFNRSBpcyBzZXQuICAqLwotICAgICAgbmFtZSAmPX4gMHg4MDAwMDAwMDsKLQotICAgICAgaWYgKG5hbWUgPiAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQotCW92ZXJydW4gKGZpbmZvLCBfKCJkaXJlY3RvcnkgZW50cnkgbmFtZSIpKTsKLQotICAgICAgZXJzID0gZmluZm8tPmRhdGEgKyBuYW1lOwotCi0gICAgICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0gICAgICByZS0+bmV4dCA9IE5VTEw7Ci0gICAgICByZS0+aWQubmFtZWQgPSAxOwotICAgICAgbGVuZ3RoID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcnMpOwotICAgICAgcmUtPmlkLnUubi5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICByZS0+aWQudS5uLm5hbWUgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKGxlbmd0aCAqIHNpemVvZiAodW5pY2hhcikpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgaisrKQotCXJlLT5pZC51Lm4ubmFtZVtqXSA9IGdldGZpXzE2IChmaW5mbywgZXJzICsgaiAqIDIgKyAyKTsKLQotICAgICAgaWYgKGxldmVsID09IDApCi0JdHlwZSA9ICZyZS0+aWQ7Ci0KLSAgICAgIGlmICgocnZhICYgMHg4MDAwMDAwMCkgIT0gMCkKLQl7Ci0JICBydmEgJj1+IDB4ODAwMDAwMDA7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJuYW1lZCBzdWJkaXJlY3RvcnkiKSk7Ci0JICByZS0+c3ViZGlyID0gMTsKLQkgIHJlLT51LmRpciA9IHJlYWRfY29mZl9yZXNfZGlyIChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUsCi0JCQkJCSBsZXZlbCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJuYW1lZCByZXNvdXJjZSIpKTsKLQkgIHJlLT5zdWJkaXIgPSAwOwotCSAgcmUtPnUucmVzID0gcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGZpbmZvLT5kYXRhICsgcnZhLCBmaW5mbywgdHlwZSk7Ci0JfQotCi0gICAgICAqcHAgPSByZTsKLSAgICAgIHBwID0gJnJlLT5uZXh0OwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgaWRfY291bnQ7IGkrKywgZXJlKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBuYW1lLCBydmE7Ci0gICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKLQotICAgICAgaWYgKChjb25zdCBiZmRfYnl0ZSAqKSBlcmUgPj0gZmluZm8tPmRhdGFfZW5kKQotCW92ZXJydW4gKGZpbmZvLCBfKCJJRCBkaXJlY3RvcnkgZW50cnkiKSk7Ci0KLSAgICAgIG5hbWUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZS0+bmFtZSk7Ci0gICAgICBydmEgPSBnZXRmaV8zMiAoZmluZm8sIGVyZS0+cnZhKTsKLQotICAgICAgcmUgPSAoc3RydWN0IHJlc19lbnRyeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmUpOwotICAgICAgcmUtPm5leHQgPSBOVUxMOwotICAgICAgcmUtPmlkLm5hbWVkID0gMDsKLSAgICAgIHJlLT5pZC51LmlkID0gbmFtZTsKLQotICAgICAgaWYgKGxldmVsID09IDApCi0JdHlwZSA9ICZyZS0+aWQ7Ci0KLSAgICAgIGlmICgocnZhICYgMHg4MDAwMDAwMCkgIT0gMCkKLQl7Ci0JICBydmEgJj1+IDB4ODAwMDAwMDA7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJJRCBzdWJkaXJlY3RvcnkiKSk7Ci0JICByZS0+c3ViZGlyID0gMTsKLQkgIHJlLT51LmRpciA9IHJlYWRfY29mZl9yZXNfZGlyIChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUsCi0JCQkJCSBsZXZlbCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJJRCByZXNvdXJjZSIpKTsKLQkgIHJlLT5zdWJkaXIgPSAwOwotCSAgcmUtPnUucmVzID0gcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGZpbmZvLT5kYXRhICsgcnZhLCBmaW5mbywgdHlwZSk7Ci0JfQotCi0gICAgICAqcHAgPSByZTsKLSAgICAgIHBwID0gJnJlLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gcmQ7Ci19Ci0KLS8qIFJlYWQgYSByZXNvdXJjZSBkYXRhIGVudHJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGRhdGEsIGZpbmZvLCB0eXBlKQotICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICpmaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLXsKLSAgY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqZXJkOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICB1bnNpZ25lZCBsb25nIHNpemUsIHJ2YTsKLSAgY29uc3QgYmZkX2J5dGUgKnJlc2RhdGE7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygicmVzb3VyY2UgdHlwZSB1bmtub3duIikpOwotCi0gIGlmICgoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZGF0YSkgPCBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2RhdGEpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJkYXRhIGVudHJ5IikpOwotCi0gIGVyZCA9IChjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhICopIGRhdGE7Ci0KLSAgc2l6ZSA9IGdldGZpXzMyIChmaW5mbywgZXJkLT5zaXplKTsKLSAgcnZhID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPnJ2YSk7Ci0gIGlmIChydmEgPCBmaW5mby0+c2VjYWRkcgotICAgICAgfHwgcnZhIC0gZmluZm8tPnNlY2FkZHIgPj0gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKLSAgICBvdmVycnVuIChmaW5mbywgXygicmVzb3VyY2UgZGF0YSIpKTsKLQotICByZXNkYXRhID0gZmluZm8tPmRhdGEgKyAocnZhIC0gZmluZm8tPnNlY2FkZHIpOwotCi0gIGlmIChzaXplID4gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIHJlc2RhdGEpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJyZXNvdXJjZSBkYXRhIHNpemUiKSk7Ci0KLSAgciA9IGJpbl90b19yZXMgKCp0eXBlLCByZXNkYXRhLCBzaXplLCBmaW5mby0+YmlnX2VuZGlhbik7Ci0KLSAgbWVtc2V0ICgmci0+cmVzX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotICByLT5jb2ZmX2luZm8uY29kZXBhZ2UgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+Y29kZXBhZ2UpOwotICByLT5jb2ZmX2luZm8ucmVzZXJ2ZWQgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+cmVzZXJ2ZWQpOwotCi0gIHJldHVybiByOwotfQotDAotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBidWlsZCBhIGxpc3Qgb2YgYmluZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGJpbmRhdGFfYnVpbGQKLXsKLSAgLyogVGhlIGRhdGEuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgLyogVGhlIGxhc3Qgc3RydWN0dXJlIHdlIGhhdmUgYWRkZWQgdG8gdGhlIGxpc3QuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqbGFzdDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIGxpc3QgYXMgYSB3aG9sZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgaW5mb3JtYXRpb24gYXMgd2UgYnVpbGQgdGhlIGRpcmVjdG9yeQotICAgdHJlZS4gICovCi0KLXN0cnVjdCBjb2ZmX3dyaXRlX2luZm8KLXsKLSAgLyogVGhlc2UgZmllbGRzIGFyZSBiYXNlZCBvbiB0aGUgQkZELiAgKi8KLSAgLyogVGhlIEJGRCBpdHNlbGYuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBmaWxlIGlzIGJpZyBlbmRpYW4uICAqLwotICBpbnQgYmlnX2VuZGlhbjsKLSAgLyogUG9pbnRlciB0byBzZWN0aW9uIHN5bWJvbCB1c2VkIHRvIGJ1aWxkIFJWQSByZWxvY3MuICAqLwotICBhc3ltYm9sICoqc3ltcHA7Ci0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBpbml0aWFsbHksIGFuZCB0aGVuIG5vdCBjaGFuZ2VkLiAgKi8KLSAgLyogTGVuZ3RoIG9mIGRpcmVjdG9yeSB0YWJsZXMgYW5kIGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGRpcnNpemU7Ci0gIC8qIExlbmd0aCBvZiBkaXJlY3RvcnkgZW50cnkgc3RyaW5ncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZGlyc3Ryc2l6ZTsKLSAgLyogTGVuZ3RoIG9mIHJlc291cmNlIGRhdGEgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZGF0YWVudHNpemU7Ci0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSB1cGRhdGVkIGFzIHdlIGFkZCBkYXRhLiAgKi8KLSAgLyogRGlyZWN0b3J5IHRhYmxlcyBhbmQgZW50cmllcy4gICovCi0gIHN0cnVjdCBiaW5kYXRhX2J1aWxkIGRpcnM7Ci0gIC8qIERpcmVjdG9yeSBlbnRyeSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgZGlyc3RyczsKLSAgLyogUmVzb3VyY2UgZGF0YSBlbnRyaWVzLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgZGF0YWVudHM7Ci0gIC8qIEFjdHVhbCByZXNvdXJjZSBkYXRhLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgcmVzb3VyY2VzOwotICAvKiBSZWxvY2F0aW9ucy4gICovCi0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIC8qIE51bWJlciBvZiByZWxvY2F0aW9ucy4gICovCi0gIHVuc2lnbmVkIGludCByZWxvY19jb3VudDsKLX07Ci0KLS8qIE1hY3JvcyB0byBzd2FwIG91dCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIHB1dGN3aV8xNihjd2ksIHYsIHMpIFwKLSAgKChjd2ktPmJpZ19lbmRpYW4pID8gYmZkX3B1dGIxNiAoKHYpLCAocykpIDogYmZkX3B1dGwxNiAoKHYpLCAocykpKQotI2RlZmluZSBwdXRjd2lfMzIoY3dpLCB2LCBzKSBcCi0gICgoY3dpLT5iaWdfZW5kaWFuKSA/IGJmZF9wdXRiMzIgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMzIgKCh2KSwgKHMpKSkKLQotc3RhdGljIHZvaWQgY29mZl9iaW5fc2l6ZXMKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqY29mZl9hbGxvYyBQQVJBTVMgKChzdHJ1Y3QgYmluZGF0YV9idWlsZCAqLCBzaXplX3QpKTsKLXN0YXRpYyB2b2lkIGNvZmZfdG9fYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICosIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKikpOwotc3RhdGljIHZvaWQgY29mZl9yZXNfdG9fYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqKSk7Ci0KLS8qIFdyaXRlIHJlc291cmNlcyB0byBhIENPRkYgZmlsZS4gIFJFU09VUkNFUyBzaG91bGQgYWxyZWFkeSBiZQotICAgc29ydGVkLgotCi0gICBSaWdodCBub3cgd2UgYWx3YXlzIGNyZWF0ZSBhIG5ldyBmaWxlLiAgU29tZWRheSB3ZSBzaG91bGQgYWxzbwotICAgb2ZmZXIgdGhlIGFiaWxpdHkgdG8gbWVyZ2UgcmVzb3VyY2VzIGludG8gYW4gZXhpc3RpbmcgZmlsZS4gIFRoaXMKLSAgIHdvdWxkIHJlcXVpcmUgZG9pbmcgdGhlIGJhc2ljIHdvcmsgb2Ygb2JqY29weSwganVzdCBtb2RpZnlpbmcgb3IKLSAgIGFkZGluZyB0aGUgLnJzcmMgc2VjdGlvbi4gICovCi0KLXZvaWQKLXdyaXRlX2NvZmZfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCwgcmVzb3VyY2VzKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotewotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gY3dpOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGgsIG9mZnNldDsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgb3V0cHV0IikpOwotCi0gIGFiZmQgPSBiZmRfb3BlbncgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGlmICghIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2Zvcm1hdCIpOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FybSwgMCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoX21hY2goYXJtKSIpOwotI2Vsc2UKLSAgLyogRklYTUU6IFRoaXMgaXMgb2J2aW91c2x5IGkzODYgc3BlY2lmaWMuICAqLwotICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfaTM4NiwgMCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoX21hY2goaTM4NikiKTsKLSNlbmRpZiAvKiBhcm0gKi8KLQotICBpZiAoISBiZmRfc2V0X2ZpbGVfZmxhZ3MgKGFiZmQsIEhBU19TWU1TIHwgSEFTX1JFTE9DKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2ZpbGVfZmxhZ3MiKTsKLQotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJzcmMiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoImJmZF9tYWtlX3NlY3Rpb24iKTsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywKLQkJCSAgICAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQwotCQkJCXwgU0VDX0xPQUQgfCBTRUNfREFUQSkpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9mbGFncyIpOwotCi0gIGlmICghIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzZWMtPnN5bWJvbF9wdHJfcHRyLCAxKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X3N5bXRhYiIpOwotCi0gIC8qIFJlcXVpcmluZyB0aGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIEJGRC4gICovCi0gIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0KLSAgLyogVGhlIG9yZGVyIG9mIGRhdGEgaW4gdGhlIC5yc3JjIHNlY3Rpb24gaXMKLSAgICAgICByZXNvdXJjZSBkaXJlY3RvcnkgdGFibGVzIGFuZCBlbnRyaWVzCi0gICAgICAgcmVzb3VyY2UgZGlyZWN0b3J5IHN0cmluZ3MKLSAgICAgICByZXNvdXJjZSBkYXRhIGVudHJpZXMKLSAgICAgICBhY3R1YWwgcmVzb3VyY2UgZGF0YQotCi0gICAgIFdlIGJ1aWxkIHRoZXNlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIGluIGRpZmZlcmVudCBsaXN0cy4gICovCi0KLSAgY3dpLmFiZmQgPSBhYmZkOwotICBjd2kuYmlnX2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChhYmZkKTsKLSAgY3dpLnN5bXBwID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLSAgY3dpLmRpcnNpemUgPSAwOwotICBjd2kuZGlyc3Ryc2l6ZSA9IDA7Ci0gIGN3aS5kYXRhZW50c2l6ZSA9IDA7Ci0gIGN3aS5kaXJzLmQgPSBOVUxMOwotICBjd2kuZGlycy5sYXN0ID0gTlVMTDsKLSAgY3dpLmRpcnMubGVuZ3RoID0gMDsKLSAgY3dpLmRpcnN0cnMuZCA9IE5VTEw7Ci0gIGN3aS5kaXJzdHJzLmxhc3QgPSBOVUxMOwotICBjd2kuZGlyc3Rycy5sZW5ndGggPSAwOwotICBjd2kuZGF0YWVudHMuZCA9IE5VTEw7Ci0gIGN3aS5kYXRhZW50cy5sYXN0ID0gTlVMTDsKLSAgY3dpLmRhdGFlbnRzLmxlbmd0aCA9IDA7Ci0gIGN3aS5yZXNvdXJjZXMuZCA9IE5VTEw7Ci0gIGN3aS5yZXNvdXJjZXMubGFzdCA9IE5VTEw7Ci0gIGN3aS5yZXNvdXJjZXMubGVuZ3RoID0gMDsKLSAgY3dpLnJlbG9jcyA9IE5VTEw7Ci0gIGN3aS5yZWxvY19jb3VudCA9IDA7Ci0KLSAgLyogV29yayBvdXQgdGhlIHNpemVzIG9mIHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgZW50cmllcywgc28gdGhhdCB3ZQotICAgICBrbm93IHRoZSB2YXJpb3VzIG9mZnNldHMgd2Ugd2lsbCBuZWVkLiAgKi8KLSAgY29mZl9iaW5fc2l6ZXMgKHJlc291cmNlcywgJmN3aSk7Ci0KLSAgLyogRm9yY2UgdGhlIGRpcmVjdG9yeSBzdHJpbmdzIHRvIGJlIDMyIGJpdCBhbGlnbmVkLiAgRXZlcnkgb3RoZXIKLSAgICAgc3RydWN0dXJlIGlzIDMyIGJpdCBhbGlnbmVkIGFueWhvdy4gICovCi0gIGN3aS5kaXJzdHJzaXplID0gKGN3aS5kaXJzdHJzaXplICsgMykgJn4gMzsKLQotICAvKiBBY3R1YWxseSBjb252ZXJ0IHRoZSByZXNvdXJjZXMgdG8gYmluYXJ5LiAgKi8KLSAgY29mZl90b19iaW4gKHJlc291cmNlcywgJmN3aSk7Ci0KLSAgLyogQWRkIGFub3RoZXIgMiBieXRlcyB0byB0aGUgZGlyZWN0b3J5IHN0cmluZ3MgaWYgbmVlZGVkIGZvcgotICAgICBhbGlnbm1lbnQuICAqLwotICBpZiAoKGN3aS5kaXJzdHJzLmxlbmd0aCAmIDMpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqZXg7Ci0KLSAgICAgIGV4ID0gY29mZl9hbGxvYyAoJmN3aS5kaXJzdHJzLCAyKTsKLSAgICAgIGV4WzBdID0gMDsKLSAgICAgIGV4WzFdID0gMDsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgd2UgYnVpbHQgY2FtZSBvdXQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB3ZQotICAgICBjYWxjdWxhdGVkIGluaXRpYWxseS4gICovCi0gIGFzc2VydCAoY3dpLmRpcnMubGVuZ3RoID09IGN3aS5kaXJzaXplKTsKLSAgYXNzZXJ0IChjd2kuZGlyc3Rycy5sZW5ndGggPT0gY3dpLmRpcnN0cnNpemUpOwotICBhc3NlcnQgKGN3aS5kYXRhZW50cy5sZW5ndGggPT0gY3dpLmRhdGFlbnRzaXplKTsKLQotICBsZW5ndGggPSAoY3dpLmRpcnNpemUKLQkgICAgKyBjd2kuZGlyc3Ryc2l6ZQotCSAgICArIGN3aS5kYXRhZW50c2l6ZQotCSAgICArIGN3aS5yZXNvdXJjZXMubGVuZ3RoKTsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBsZW5ndGgpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9zaXplIik7Ci0KLSAgYmZkX3NldF9yZWxvYyAoYWJmZCwgc2VjLCBjd2kucmVsb2NzLCBjd2kucmVsb2NfY291bnQpOwotCi0gIG9mZnNldCA9IDA7Ci0gIGZvciAoZCA9IGN3aS5kaXJzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKLQliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7Ci0gICAgfQotICBmb3IgKGQgPSBjd2kuZGlyc3Rycy5kOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkLT5kYXRhLCBvZmZzZXQsIGQtPmxlbmd0aCkpCi0JYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIik7Ci0gICAgICBvZmZzZXQgKz0gZC0+bGVuZ3RoOwotICAgIH0KLSAgZm9yIChkID0gY3dpLmRhdGFlbnRzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKLQliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7Ci0gICAgfQotICBmb3IgKGQgPSBjd2kucmVzb3VyY2VzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKLQliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7Ci0gICAgfQotCi0gIGFzc2VydCAob2Zmc2V0ID09IGxlbmd0aCk7Ci0KLSAgaWYgKCEgYmZkX2Nsb3NlIChhYmZkKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfY2xvc2UiKTsKLQotICAvKiBXZSBhbGxvY2F0ZWQgdGhlIHJlbG9jcyBhcnJheSB1c2luZyBtYWxsb2MuICAqLwotICBmcmVlIChjd2kucmVsb2NzKTsKLX0KLQotLyogV29yayBvdXQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGZpeGVkIHNpemUgcmVzb3VyY2UgZGlyZWN0b3J5Ci0gICBlbnRyaWVzLiAgVGhpcyB1cGRhdGVzIGZpZWxkcyBpbiBDV0kuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9iaW5fc2l6ZXMgKHJlc2RpciwgY3dpKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzZGlyOwotICAgICBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICpjd2k7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKnJlOwotCi0gIGN3aS0+ZGlyc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSk7Ci0KLSAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICB7Ci0gICAgICBjd2ktPmRpcnNpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSk7Ci0KLSAgICAgIGlmIChyZS0+aWQubmFtZWQpCi0JY3dpLT5kaXJzdHJzaXplICs9IHJlLT5pZC51Lm4ubGVuZ3RoICogMiArIDI7Ci0KLSAgICAgIGlmIChyZS0+c3ViZGlyKQotCWNvZmZfYmluX3NpemVzIChyZS0+dS5kaXIsIGN3aSk7Ci0gICAgICBlbHNlCi0JY3dpLT5kYXRhZW50c2l6ZSArPSBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2RhdGEpOwotICAgIH0KLX0KLQotLyogQWxsb2NhdGUgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIGxpc3QuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1jb2ZmX2FsbG9jIChiYiwgc2l6ZSkKLSAgICAgc3RydWN0IGJpbmRhdGFfYnVpbGQgKmJiOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLQotICBkLT5uZXh0ID0gTlVMTDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChzaXplKTsKLSAgZC0+bGVuZ3RoID0gc2l6ZTsKLQotICBpZiAoYmItPmQgPT0gTlVMTCkKLSAgICBiYi0+ZCA9IGQ7Ci0gIGVsc2UKLSAgICBiYi0+bGFzdC0+bmV4dCA9IGQ7Ci0gIGJiLT5sYXN0ID0gZDsKLSAgYmItPmxlbmd0aCArPSBzaXplOwotCi0gIHJldHVybiBkLT5kYXRhOwotfQotCi0vKiBDb252ZXJ0IHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgUkVTRElSIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3RvX2JpbiAocmVzZGlyLCBjd2kpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNkaXI7Ci0gICAgIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKmN3aTsKLXsKLSAgc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5ICplcmQ7Ci0gIGludCBjaSwgY247Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKmU7Ci0gIHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5ICplcmU7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBkaXJlY3RvcnkgdGFibGUuICAqLwotCi0gIGVyZCA9ICgoc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5ICopCi0JIGNvZmZfYWxsb2MgKCZjd2ktPmRpcnMsIHNpemVvZiAoKmVyZCkpKTsKLQotICBwdXRjd2lfMzIgKGN3aSwgcmVzZGlyLT5jaGFyYWN0ZXJpc3RpY3MsIGVyZC0+Y2hhcmFjdGVyaXN0aWNzKTsKLSAgcHV0Y3dpXzMyIChjd2ksIHJlc2Rpci0+dGltZSwgZXJkLT50aW1lKTsKLSAgcHV0Y3dpXzE2IChjd2ksIHJlc2Rpci0+bWFqb3IsIGVyZC0+bWFqb3IpOwotICBwdXRjd2lfMTYgKGN3aSwgcmVzZGlyLT5taW5vciwgZXJkLT5taW5vcik7Ci0KLSAgY2kgPSAwOwotICBjbiA9IDA7Ci0gIGZvciAoZSA9IHJlc2Rpci0+ZW50cmllczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZS0+aWQubmFtZWQpCi0JKytjbjsKLSAgICAgIGVsc2UKLQkrK2NpOwotICAgIH0KLQotICBwdXRjd2lfMTYgKGN3aSwgY24sIGVyZC0+bmFtZV9jb3VudCk7Ci0gIHB1dGN3aV8xNiAoY3dpLCBjaSwgZXJkLT5pZF9jb3VudCk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBkYXRhIGVudHJpZXMuICBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgc3BhY2UgZm9yIGFsbAotICAgICB0aGUgZW50cmllcyBiZWZvcmUgd3JpdGluZyB0aGVtIG91dC4gIFRoYXQgcGVybWl0cyBhIHJlY3Vyc2l2ZQotICAgICBjYWxsIHRvIHdvcmsgY29ycmVjdGx5IHdoZW4gd3JpdGluZyBvdXQgc3ViZGlyZWN0b3JpZXMuICAqLwotCi0gIGVyZSA9ICgoc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKikKLQkgY29mZl9hbGxvYyAoJmN3aS0+ZGlycywgKGNpICsgY24pICogc2l6ZW9mICgqZXJlKSkpOwotICBmb3IgKGUgPSByZXNkaXItPmVudHJpZXM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQsIGVyZSsrKQotICAgIHsKLSAgICAgIGlmICghIGUtPmlkLm5hbWVkKQotCXB1dGN3aV8zMiAoY3dpLCBlLT5pZC51LmlkLCBlcmUtPm5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKnN0cjsKLQkgIGludCBpOwotCi0JICAvKiBGb3Igc29tZSByZWFzb24gZXhpc3RpbmcgZmlsZXMgc2VlbSB0byBoYXZlIHRoZSBoaWdoIGJpdAotICAgICAgICAgICAgIHNldCBvbiB0aGUgYWRkcmVzcyBvZiB0aGUgbmFtZSwgYWx0aG91Z2ggdGhhdCBpcyBub3QKLSAgICAgICAgICAgICBkb2N1bWVudGVkLiAgKi8KLQkgIHB1dGN3aV8zMiAoY3dpLAotCQkgICAgIDB4ODAwMDAwMDAgfCAoY3dpLT5kaXJzaXplICsgY3dpLT5kaXJzdHJzLmxlbmd0aCksCi0JCSAgICAgZXJlLT5uYW1lKTsKLQotCSAgc3RyID0gY29mZl9hbGxvYyAoJmN3aS0+ZGlyc3RycywgZS0+aWQudS5uLmxlbmd0aCAqIDIgKyAyKTsKLQkgIHB1dGN3aV8xNiAoY3dpLCBlLT5pZC51Lm4ubGVuZ3RoLCBzdHIpOwotCSAgZm9yIChpID0gMDsgaSA8IGUtPmlkLnUubi5sZW5ndGg7IGkrKykKLQkgICAgcHV0Y3dpXzE2IChjd2ksIGUtPmlkLnUubi5uYW1lW2ldLCBzdHIgKyBpICogMiArIDIpOwotCX0KLQotICAgICAgaWYgKGUtPnN1YmRpcikKLQl7Ci0JICBwdXRjd2lfMzIgKGN3aSwgMHg4MDAwMDAwMCB8IGN3aS0+ZGlycy5sZW5ndGgsIGVyZS0+cnZhKTsKLQkgIGNvZmZfdG9fYmluIChlLT51LmRpciwgY3dpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHV0Y3dpXzMyIChjd2ksCi0JCSAgICAgY3dpLT5kaXJzaXplICsgY3dpLT5kaXJzdHJzaXplICsgY3dpLT5kYXRhZW50cy5sZW5ndGgsCi0JCSAgICAgZXJlLT5ydmEpOwotCi0JICBjb2ZmX3Jlc190b19iaW4gKGUtPnUucmVzLCBjd2kpOwotCX0KLSAgICB9Ci19Ci0KLS8qIENvbnZlcnQgdGhlIHJlc291cmNlIFJFUyB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9yZXNfdG9fYmluIChyZXMsIGN3aSkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICpjd2k7Ci17Ci0gIGFyZWxlbnQgKnI7Ci0gIHN0cnVjdCBleHRlcm5fcmVzX2RhdGEgKmVyZDsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiwgYWx0aG91Z2ggZXZlcnkgb3RoZXIgYWRkcmVzcyBpcyBhIHNlY3Rpb24KLSAgICAgb2Zmc2V0LCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVzb3VyY2UgZGF0YSBpdHNlbGYgaXMgYW4gUlZBLiAgVGhhdAotICAgICBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gIFdlIGFsbG9jYXRlCi0gICAgIHRoZSByZWxvY3MgYXJyYXkgdXNpbmcgbWFsbG9jIHNvIHRoYXQgd2UgY2FuIHVzZSByZWFsbG9jLiAgRklYTUU6Ci0gICAgIFRoaXMgcmVsb2NhdGlvbiBoYW5kbGluZyBpcyBjb3JyZWN0IGZvciB0aGUgaTM4NiwgYnV0IHByb2JhYmx5Ci0gICAgIG5vdCBmb3IgYW55IG90aGVyIHRhcmdldC4gICovCi0KLSAgciA9IChhcmVsZW50ICopIHJlc3dyX2FsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgci0+c3ltX3B0cl9wdHIgPSBjd2ktPnN5bXBwOwotICByLT5hZGRyZXNzID0gY3dpLT5kaXJzaXplICsgY3dpLT5kaXJzdHJzaXplICsgY3dpLT5kYXRhZW50cy5sZW5ndGg7Ci0gIHItPmFkZGVuZCA9IDA7Ci0gIHItPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChjd2ktPmFiZmQsIEJGRF9SRUxPQ19SVkEpOwotICBpZiAoci0+aG93dG8gPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKF8oImNhbid0IGdldCBCRkRfUkVMT0NfUlZBIHJlbG9jYXRpb24gdHlwZSIpKTsKLQotICBjd2ktPnJlbG9jcyA9IHhyZWFsbG9jIChjd2ktPnJlbG9jcywKLQkJCSAgKGN3aS0+cmVsb2NfY291bnQgKyAyKSAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gIGN3aS0+cmVsb2NzW2N3aS0+cmVsb2NfY291bnRdID0gcjsKLSAgY3dpLT5yZWxvY3NbY3dpLT5yZWxvY19jb3VudCArIDFdID0gTlVMTDsKLSAgKytjd2ktPnJlbG9jX2NvdW50OwotCi0gIGVyZCA9IChzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhICopIGNvZmZfYWxsb2MgKCZjd2ktPmRhdGFlbnRzLCBzaXplb2YgKCplcmQpKTsKLQotICBwdXRjd2lfMzIgKGN3aSwKLQkgICAgIChjd2ktPmRpcnNpemUKLQkgICAgICArIGN3aS0+ZGlyc3Ryc2l6ZQotCSAgICAgICsgY3dpLT5kYXRhZW50c2l6ZQotCSAgICAgICsgY3dpLT5yZXNvdXJjZXMubGVuZ3RoKSwKLQkgICAgIGVyZC0+cnZhKTsKLSAgcHV0Y3dpXzMyIChjd2ksIHJlcy0+Y29mZl9pbmZvLmNvZGVwYWdlLCBlcmQtPmNvZGVwYWdlKTsKLSAgcHV0Y3dpXzMyIChjd2ksIHJlcy0+Y29mZl9pbmZvLnJlc2VydmVkLCBlcmQtPnJlc2VydmVkKTsKLQotICBkID0gcmVzX3RvX2JpbiAocmVzLCBjd2ktPmJpZ19lbmRpYW4pOwotCi0gIGlmIChjd2ktPnJlc291cmNlcy5kID09IE5VTEwpCi0gICAgY3dpLT5yZXNvdXJjZXMuZCA9IGQ7Ci0gIGVsc2UKLSAgICBjd2ktPnJlc291cmNlcy5sYXN0LT5uZXh0ID0gZDsKLQotICBsZW5ndGggPSAwOwotICBmb3IgKDsgZC0+bmV4dCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotICBjd2ktPnJlc291cmNlcy5sYXN0ID0gZDsKLSAgY3dpLT5yZXNvdXJjZXMubGVuZ3RoICs9IGxlbmd0aDsKLQotICBwdXRjd2lfMzIgKGN3aSwgbGVuZ3RoLCBlcmQtPnNpemUpOwotCi0gIC8qIEZvcmNlIHRoZSBuZXh0IHJlc291cmNlIHRvIGhhdmUgMzIgYml0IGFsaWdubWVudC4gICovCi0KLSAgaWYgKChsZW5ndGggJiAzKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBhZGQ7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpleDsKLQotICAgICAgYWRkID0gNCAtIChsZW5ndGggJiAzKTsKLQotICAgICAgZXggPSBjb2ZmX2FsbG9jICgmY3dpLT5yZXNvdXJjZXMsIGFkZCk7Ci0gICAgICBtZW1zZXQgKGV4LCAwLCBhZGQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc3JjLmMgYi9iaW51dGlscy9yZXNyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjMzYzJhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Jlc3JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzc2ICswLDAgQEAKLS8qIHJlc3JjLmMgLS0gcmVhZCBhbmQgd3JpdGUgV2luZG93cyByYyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IHJlYWQgYW5kIHdyaXRlIFdpbmRvd3MgcmMgZmlsZXMuCi0gICBUaGVzZSBhcmUgdGV4dCBmaWxlcyB0aGF0IHJlcHJlc2VudCByZXNvdXJjZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSNkZWZpbmUgcG9wZW4gX3BvcGVuCi0jZGVmaW5lIHBjbG9zZSBfcGNsb3NlCi0jZW5kaWYKLQotLyogVGhlIGRlZmF1bHQgcHJlcHJvY2Vzc29yLiAgKi8KLQotI2RlZmluZSBERUZBVUxUX1BSRVBST0NFU1NPUiAiZ2NjIC1FIC14Yy1oZWFkZXIgLURSQ19JTlZPS0VEIgotCi0vKiBXZSByZWFkIHRoZSBkaXJlY3RvcnkgZW50cmllcyBpbiBhIGN1cnNvciBvciBpY29uIGZpbGUgaW50bwotICAgaW5zdGFuY2VzIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGljb25kaXIKLXsKLSAgLyogV2lkdGggb2YgaW1hZ2UuICAqLwotICB1bnNpZ25lZCBjaGFyIHdpZHRoOwotICAvKiBIZWlnaHQgb2YgaW1hZ2UuICAqLwotICB1bnNpZ25lZCBjaGFyIGhlaWdodDsKLSAgLyogTnVtYmVyIG9mIGNvbG9ycyBpbiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgY29sb3Jjb3VudDsKLSAgdW5pb24KLSAgewotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIENvbG9yIHBsYW5lcy4gICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCBwbGFuZXM7Ci0gICAgICAvKiBCaXRzIHBlciBwaXhlbC4gICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCBiaXRzOwotICAgIH0gaWNvbjsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBYIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCB4aG90c3BvdDsKLSAgICAgIC8qIFkgY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IHlob3RzcG90OwotICAgIH0gY3Vyc29yOwotICB9IHU7Ci0gIC8qIEJ5dGVzIGluIGltYWdlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBieXRlczsKLSAgLyogRmlsZSBvZmZzZXQgb2YgaW1hZ2UuICAqLwotICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLX07Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSByYyBmaWxlIHdlIGFyZSByZWFkaW5nLiAgKi8KLQotY2hhciAqcmNfZmlsZW5hbWU7Ci0KLS8qIFRoZSBsaW5lIG51bWJlciBpbiB0aGUgcmMgZmlsZS4gICovCi0KLWludCByY19saW5lbm87Ci0KLS8qIFRoZSBwaXBlIHdlIGFyZSByZWFkaW5nIGZyb20sIHNvIHRoYXQgd2UgY2FuIGNsb3NlIGl0IGlmIHdlIGV4aXQuICAqLwotCi1zdGF0aWMgRklMRSAqY3BwX3BpcGU7Ci0KLS8qIEFzIHdlIHJlYWQgdGhlIHJjIGZpbGUsIHdlIGF0dGFjaCBpbmZvcm1hdGlvbiB0byB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotCi0vKiBUaGUgbnVtYmVyIG9mIGN1cnNvciByZXNvdXJjZXMgd2UgaGF2ZSB3cml0dGVuIG91dC4gICovCi0KLXN0YXRpYyBpbnQgY3Vyc29yczsKLQotLyogVGhlIG51bWJlciBvZiBmb250IHJlc291cmNlcyB3ZSBoYXZlIHdyaXR0ZW4gb3V0LiAgKi8KLQotc3RhdGljIGludCBmb250czsKLQotLyogRm9udCBkaXJlY3RvcnkgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZm9udGRpciAqZm9udGRpcnM7Ci0KLS8qIFJlc291cmNlIGluZm8gdG8gdXNlIGZvciBmb250ZGlycy4gICovCi0KLXN0cnVjdCByZXNfcmVzX2luZm8gZm9udGRpcnNfcmVzaW5mbzsKLQotLyogVGhlIG51bWJlciBvZiBpY29uIHJlc291cmNlcyB3ZSBoYXZlIHdyaXR0ZW4gb3V0LiAgKi8KLQotc3RhdGljIGludCBpY29uczsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIEZJTEUgKmxvb2tfZm9yX2RlZmF1bHQgUEFSQU1TICgoY2hhciAqLCBjb25zdCBjaGFyICosIGludCwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGNsb3NlX3BpcGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgdW5leHBlY3RlZF9lb2YgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGdldF93b3JkIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbG9uZyBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2V0X2RhdGEKLSAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZGVmaW5lX2ZvbnRkaXJzIFBBUkFNUyAoKHZvaWQpKTsKLQwKLS8qIGxvb2sgZm9yIHRoZSBwcmVwcm9jZXNzb3IgcHJvZ3JhbSAqLwotCi1zdGF0aWMgRklMRSAqCi1sb29rX2Zvcl9kZWZhdWx0IChjbWQsIHByZWZpeCwgZW5kX3ByZWZpeCwgcHJlcHJvY2FyZ3MsIGZpbGVuYW1lKQotICAgICBjaGFyICpjbWQ7Ci0gICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgICAgaW50IGVuZF9wcmVmaXg7Ci0gICAgIGNvbnN0IGNoYXIgKnByZXByb2NhcmdzOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgY2hhciAqc3BhY2U7Ci0gIGludCBmb3VuZDsKLSAgc3RydWN0IHN0YXQgczsKLQotICBzdHJjcHkgKGNtZCwgcHJlZml4KTsKLQotICBzcHJpbnRmIChjbWQgKyBlbmRfcHJlZml4LCAiJXMiLCBERUZBVUxUX1BSRVBST0NFU1NPUik7Ci0gIHNwYWNlID0gc3RyY2hyIChjbWQgKyBlbmRfcHJlZml4LCAnICcpOwotICBpZiAoc3BhY2UpCi0gICAgKnNwYWNlID0gMDsKLQotICBpZiAoc3RyY2hyIChjbWQsICcvJykpCi0gICAgewotICAgICAgZm91bmQgPSAoc3RhdCAoY21kLCAmcykgPT0gMAotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLQkgICAgICAgfHwgc3RhdCAoc3RyY2F0IChjbWQsIEVYRUNVVEFCTEVfU1VGRklYKSwgJnMpID09IDAKLSNlbmRpZgotCSAgICAgICApOwotCi0gICAgICBpZiAoISBmb3VuZCkKLQl7Ci0JICBpZiAodmVyYm9zZSkKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiVHJpZWQgYCVzJ1xuIiwgY21kKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgc3RyY3B5IChjbWQsIHByZWZpeCk7Ci0KLSAgc3ByaW50ZiAoY21kICsgZW5kX3ByZWZpeCwgIiVzICVzICVzIiwKLQkgICBERUZBVUxUX1BSRVBST0NFU1NPUiwgcHJlcHJvY2FyZ3MsIGZpbGVuYW1lKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICJVc2luZyBgJXMnXG4iLCBjbWQpOwotCi0gIGNwcF9waXBlID0gcG9wZW4gKGNtZCwgRk9QRU5fUlQpOwotICByZXR1cm4gY3BwX3BpcGU7Ci19Ci0KLS8qIFJlYWQgYW4gcmMgZmlsZS4gICovCi0KLXN0cnVjdCByZXNfZGlyZWN0b3J5ICoKLXJlYWRfcmNfZmlsZSAoZmlsZW5hbWUsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsIGxhbmd1YWdlKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJlcHJvY2Vzc29yOwotICAgICBjb25zdCBjaGFyICpwcmVwcm9jYXJnczsKLSAgICAgaW50IGxhbmd1YWdlOwotewotICBjaGFyICpjbWQ7Ci0KLSAgaWYgKHByZXByb2NhcmdzID09IE5VTEwpCi0gICAgcHJlcHJvY2FyZ3MgPSAiIjsKLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZmlsZW5hbWUgPSAiLSI7Ci0KLSAgaWYgKHByZXByb2Nlc3NvcikKLSAgICB7Ci0gICAgICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByZXByb2Nlc3NvcikKLQkJICAgICArIHN0cmxlbiAocHJlcHJvY2FyZ3MpCi0JCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQotCQkgICAgICsgMTApOwotICAgICAgc3ByaW50ZiAoY21kLCAiJXMgJXMgJXMiLCBwcmVwcm9jZXNzb3IsIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0KLSAgICAgIGNwcF9waXBlID0gcG9wZW4gKGNtZCwgRk9QRU5fUlQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmRhc2gsICpzbGFzaCwgKmNwOwotCi0gICAgICBwcmVwcm9jZXNzb3IgPSBERUZBVUxUX1BSRVBST0NFU1NPUjsKLQotICAgICAgY21kID0geG1hbGxvYyAoc3RybGVuIChwcm9ncmFtX25hbWUpCi0JCSAgICAgKyBzdHJsZW4gKHByZXByb2Nlc3NvcikKLQkJICAgICArIHN0cmxlbiAocHJlcHJvY2FyZ3MpCi0JCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLQkJICAgICArIHN0cmxlbiAoRVhFQ1VUQUJMRV9TVUZGSVgpCi0jZW5kaWYKLQkJICAgICArIDEwKTsKLQotCi0gICAgICBkYXNoID0gc2xhc2ggPSAwOwotICAgICAgZm9yIChjcCA9IHByb2dyYW1fbmFtZTsgKmNwOyBjcCsrKQotCXsKLQkgIGlmICgqY3AgPT0gJy0nKQotCSAgICBkYXNoID0gY3A7Ci0JICBpZiAoCi0jaWYgZGVmaW5lZChfX0RKR1BQX18pIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19XSU4zMl9fKQotCSAgICAgICpjcCA9PSAnOicgfHwgKmNwID09ICdcXCcgfHwKLSNlbmRpZgotCSAgICAgICpjcCA9PSAnLycpCi0JICAgIHsKLQkgICAgICBzbGFzaCA9IGNwOwotCSAgICAgIGRhc2ggPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBjcHBfcGlwZSA9IDA7Ci0KLSAgICAgIGlmIChkYXNoKQotCXsKLQkgIC8qIEZpcnN0LCB0cnkgbG9va2luZyBmb3IgYSBwcmVmaXhlZCBnY2MgaW4gdGhlIHdpbmRyZXMKLQkgICAgIGRpcmVjdG9yeSwgd2l0aCB0aGUgc2FtZSBwcmVmaXggYXMgd2luZHJlcyAqLwotCi0JICBjcHBfcGlwZSA9IGxvb2tfZm9yX2RlZmF1bHQgKGNtZCwgcHJvZ3JhbV9uYW1lLCBkYXNoLXByb2dyYW1fbmFtZSsxLAotCQkJCSAgICAgICBwcmVwcm9jYXJncywgZmlsZW5hbWUpOwotCX0KLQotICAgICAgaWYgKHNsYXNoICYmICFjcHBfcGlwZSkKLQl7Ci0JICAvKiBOZXh0LCB0cnkgbG9va2luZyBmb3IgYSBnY2MgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzCi0gICAgICAgICAgICAgdGhhdCB3aW5kcmVzICovCi0KLQkgIGNwcF9waXBlID0gbG9va19mb3JfZGVmYXVsdCAoY21kLCBwcm9ncmFtX25hbWUsIHNsYXNoLXByb2dyYW1fbmFtZSsxLAotCQkJCSAgICAgICBwcmVwcm9jYXJncywgZmlsZW5hbWUpOwotCX0KLQotICAgICAgaWYgKCFjcHBfcGlwZSkKLQl7Ci0JICAvKiBTaWdoLCB0cnkgdGhlIGRlZmF1bHQgKi8KLQotCSAgY3BwX3BpcGUgPSBsb29rX2Zvcl9kZWZhdWx0IChjbWQsICIiLCAwLCBwcmVwcm9jYXJncywgZmlsZW5hbWUpOwotCX0KLQotICAgIH0KLSAgaWYgKGNwcF9waXBlID09IE5VTEwpCi0gICAgZmF0YWwgKF8oImNhbid0IHBvcGVuIGAlcyc6ICVzIiksIGNtZCwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gIGZyZWUgKGNtZCk7Ci0KLSAgeGF0ZXhpdCAoY2xvc2VfcGlwZSk7Ci0KLSAgcmNfZmlsZW5hbWUgPSB4c3RyZHVwIChmaWxlbmFtZSk7Ci0gIHJjX2xpbmVubyA9IDE7Ci0gIGlmIChsYW5ndWFnZSAhPSAtMSkKLSAgICByY3BhcnNlX3NldF9sYW5ndWFnZSAobGFuZ3VhZ2UpOwotICB5eWluID0gY3BwX3BpcGU7Ci0gIHl5cGFyc2UgKCk7Ci0KLSAgaWYgKHBjbG9zZSAoY3BwX3BpcGUpICE9IDApCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogcHJlcHJvY2Vzc29yIGZhaWxlZFxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGNwcF9waXBlID0gTlVMTDsKLQotICBpZiAoZm9udGRpcnMgIT0gTlVMTCkKLSAgICBkZWZpbmVfZm9udGRpcnMgKCk7Ci0KLSAgZnJlZSAocmNfZmlsZW5hbWUpOwotICByY19maWxlbmFtZSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJlc291cmNlczsKLX0KLQotLyogQ2xvc2UgdGhlIHBpcGUgaWYgaXQgaXMgb3Blbi4gIFRoaXMgaXMgY2FsbGVkIHZpYSB4YXRleGl0LiAgKi8KLQotdm9pZAotY2xvc2VfcGlwZSAoKQotewotICBpZiAoY3BwX3BpcGUgIT0gTlVMTCkKLSAgICBwY2xvc2UgKGNwcF9waXBlKTsKLX0KLQotLyogUmVwb3J0IGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgYW4gcmMgZmlsZS4gICovCi0KLXZvaWQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBmYXRhbCAoIiVzOiVkOiAlcyIsIHJjX2ZpbGVuYW1lLCByY19saW5lbm8sIG1zZyk7Ci19Ci0KLS8qIElzc3VlIGEgd2FybmluZyB3aGlsZSByZWFkaW5nIGFuIHJjIGZpbGUuICAqLwotCi12b2lkCi1yY3BhcnNlX3dhcm5pbmcgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBmcHJpbnRmIChzdGRlcnIsICIlczolZDogJXNcbiIsIHJjX2ZpbGVuYW1lLCByY19saW5lbm8sIG1zZyk7Ci19Ci0KLS8qIERpZSBpZiB3ZSBnZXQgYW4gdW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi11bmV4cGVjdGVkX2VvZiAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsIChfKCIlczogdW5leHBlY3RlZCBFT0YiKSwgbXNnKTsKLX0KLQotLyogUmVhZCBhIDE2IGJpdCB3b3JkIGZyb20gYSBmaWxlLiAgVGhlIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBsaXR0bGUKLSAgIGVuZGlhbi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF93b3JkIChlLCBtc2cpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IGIxLCBiMjsKLQotICBiMSA9IGdldGMgKGUpOwotICBiMiA9IGdldGMgKGUpOwotICBpZiAoZmVvZiAoZSkpCi0gICAgdW5leHBlY3RlZF9lb2YgKG1zZyk7Ci0gIHJldHVybiAoKGIyICYgMHhmZikgPDwgOCkgfCAoYjEgJiAweGZmKTsKLX0KLQotLyogUmVhZCBhIDMyIGJpdCB3b3JkIGZyb20gYSBmaWxlLiAgVGhlIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBsaXR0bGUKLSAgIGVuZGlhbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1nZXRfbG9uZyAoZSwgbXNnKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBiMSwgYjIsIGIzLCBiNDsKLQotICBiMSA9IGdldGMgKGUpOwotICBiMiA9IGdldGMgKGUpOwotICBiMyA9IGdldGMgKGUpOwotICBiNCA9IGdldGMgKGUpOwotICBpZiAoZmVvZiAoZSkpCi0gICAgdW5leHBlY3RlZF9lb2YgKG1zZyk7Ci0gIHJldHVybiAoKCgoKCgoYjQgJiAweGZmKSA8PCA4KQotCSAgICAgIHwgKGIzICYgMHhmZikpIDw8IDgpCi0JICAgIHwgKGIyICYgMHhmZikpIDw8IDgpCi0JICB8IChiMSAmIDB4ZmYpKTsKLX0KLQotLyogUmVhZCBkYXRhIGZyb20gYSBmaWxlLiAgVGhpcyBpcyBhIHdyYXBwZXIgdG8gZG8gZXJyb3IgY2hlY2tpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZ2V0X2RhdGEgKGUsIHAsIGMsIG1zZykKLSAgICAgRklMRSAqZTsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjOwotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgZ290OwotCi0gIGdvdCA9IGZyZWFkIChwLCAxLCBjLCBlKTsKLSAgaWYgKGdvdCA9PSBjKQotICAgIHJldHVybjsKLQotICBmYXRhbCAoXygiJXM6IHJlYWQgb2YgJWx1IHJldHVybmVkICVsdSIpLCBtc2csIGMsIGdvdCk7Ci19Ci0MCi0vKiBEZWZpbmUgYW4gYWNjZWxlcmF0b3IgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfYWNjZWxlcmF0b3IgKGlkLCByZXNpbmZvLCBkYXRhKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmRhdGE7Ci17Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfQUNDRUxFUkFUT1IsIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0FDQ0VMRVJBVE9SOwotICByLT51LmFjYyA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGJpdG1hcCByZXNvdXJjZS4gIEJpdG1hcCBkYXRhIGlzIHN0b3JlZCBpbiBhIGZpbGUuICBUaGUKLSAgIGZpcnN0IDE0IGJ5dGVzIG9mIHRoZSBmaWxlIGFyZSBhIHN0YW5kYXJkIGhlYWRlciwgd2hpY2ggaXMgbm90Ci0gICBpbmNsdWRlZCBpbiB0aGUgcmVzb3VyY2UgZGF0YS4gICovCi0KLSNkZWZpbmUgQklUTUFQX1NLSVAgKDE0KQotCi12b2lkCi1kZWZpbmVfYml0bWFwIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBpbnQgaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBlID0gb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIEZPUEVOX1JCLCAiYml0bWFwIGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplIC0gQklUTUFQX1NLSVApOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCSVRNQVBfU0tJUDsgaSsrKQotICAgIGdldGMgKGUpOwotCi0gIGdldF9kYXRhIChlLCBkYXRhLCBzLnN0X3NpemUgLSBCSVRNQVBfU0tJUCwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfQklUTUFQLCBpZCwKLQkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0KLSAgci0+dHlwZSA9IFJFU19UWVBFX0JJVE1BUDsKLSAgci0+dS5kYXRhLmxlbmd0aCA9IHMuc3Rfc2l6ZSAtIEJJVE1BUF9TS0lQOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGN1cnNvciByZXNvdXJjZS4gIEEgY3Vyc29yIGZpbGUgbWF5IGNvbnRhaW4gYSBzZXQgb2YKLSAgIGJpdG1hcHMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSBzYW1lIGN1cnNvciBhdCB2YXJpb3VzIGRpZmZlcmVudAotICAgcmVzb2x1dGlvbnMuICBUaGV5IGVhY2ggZ2V0IHdyaXR0ZW4gb3V0IHdpdGggYSBkaWZmZXJlbnQgSUQuICBUaGUKLSAgIHJlYWwgY3Vyc29yIHJlc291cmNlIGlzIHRoZW4gYSBncm91cCByZXNvdXJjZSB3aGljaCBjYW4gYmUgdXNlZCB0bwotICAgc2VsZWN0IG9uZSBvZiB0aGUgYWN0dWFsIGN1cnNvcnMuICAqLwotCi12b2lkCi1kZWZpbmVfY3Vyc29yIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBpbnQgdHlwZSwgY291bnQsIGk7Ci0gIHN0cnVjdCBpY29uZGlyICppY29uZGlyczsKLSAgaW50IGZpcnN0X2N1cnNvcjsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgc3RydWN0IGdyb3VwX2N1cnNvciAqZmlyc3QsICoqcHA7Ci0KLSAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgImN1cnNvciBmaWxlIiwgJnJlYWxfZmlsZW5hbWUpOwotCi0gIC8qIEEgY3Vyc29yIGZpbGUgaXMgYmFzaWNhbGx5IGFuIGljb24gZmlsZS4gIFRoZSBzdGFydCBvZiB0aGUgZmlsZQotICAgICBpcyBhIHRocmVlIHdvcmQgc3RydWN0dXJlLiAgVGhlIGZpcnN0IHdvcmQgaXMgaWdub3JlZC4gIFRoZQotICAgICBzZWNvbmQgd29yZCBpcyB0aGUgdHlwZSBvZiBkYXRhLiAgVGhlIHRoaXJkIHdvcmQgaXMgdGhlIG51bWJlciBvZgotICAgICBlbnRyaWVzLiAgKi8KLQotICBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIHR5cGUgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIGNvdW50ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICBpZiAodHlwZSAhPSAyKQotICAgIGZhdGFsIChfKCJjdXJzb3IgZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gY3Vyc29yIGRhdGEiKSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgaWNvbiBkaXJlY3RvcnkgZW50cmllcy4gICovCi0KLSAgaWNvbmRpcnMgPSAoc3RydWN0IGljb25kaXIgKikgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKmljb25kaXJzKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpY29uZGlyc1tpXS53aWR0aCA9IGdldGMgKGUpOwotICAgICAgaWNvbmRpcnNbaV0uaGVpZ2h0ID0gZ2V0YyAoZSk7Ci0gICAgICBpY29uZGlyc1tpXS5jb2xvcmNvdW50ID0gZ2V0YyAoZSk7Ci0gICAgICBnZXRjIChlKTsKLSAgICAgIGljb25kaXJzW2ldLnUuY3Vyc29yLnhob3RzcG90ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICAgICAgaWNvbmRpcnNbaV0udS5jdXJzb3IueWhvdHNwb3QgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gICAgICBpY29uZGlyc1tpXS5ieXRlcyA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgICAgIGljb25kaXJzW2ldLm9mZnNldCA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKLQotICAgICAgaWYgKGZlb2YgKGUpKQotCXVuZXhwZWN0ZWRfZW9mIChyZWFsX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIGVhY2ggY3Vyc29yIGFzIGEgdW5pcXVlIHJlc291cmNlLiAgKi8KLQotICBmaXJzdF9jdXJzb3IgPSBjdXJzb3JzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0gICAgICBzdHJ1Y3QgY3Vyc29yICpjOwotCi0gICAgICBpZiAoZnNlZWsgKGUsIGljb25kaXJzW2ldLm9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JZmF0YWwgKF8oIiVzOiBmc2VlayB0byAlbHUgZmFpbGVkOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgICAgICBpY29uZGlyc1tpXS5vZmZzZXQsIHN0cmVycm9yIChlcnJubykpOwotCi0gICAgICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChpY29uZGlyc1tpXS5ieXRlcyk7Ci0KLSAgICAgIGdldF9kYXRhIChlLCBkYXRhLCBpY29uZGlyc1tpXS5ieXRlcywgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgIGMgPSAoc3RydWN0IGN1cnNvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYyk7Ci0gICAgICBjLT54aG90c3BvdCA9IGljb25kaXJzW2ldLnUuY3Vyc29yLnhob3RzcG90OwotICAgICAgYy0+eWhvdHNwb3QgPSBpY29uZGlyc1tpXS51LmN1cnNvci55aG90c3BvdDsKLSAgICAgIGMtPmxlbmd0aCA9IGljb25kaXJzW2ldLmJ5dGVzOwotICAgICAgYy0+ZGF0YSA9IGRhdGE7Ci0KLSAgICAgICsrY3Vyc29yczsKLQotICAgICAgbmFtZS5uYW1lZCA9IDA7Ci0gICAgICBuYW1lLnUuaWQgPSBjdXJzb3JzOwotCi0gICAgICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9DVVJTT1IsIG5hbWUsCi0JCQkJICAgIHJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9DVVJTT1I7Ci0gICAgICByLT51LmN1cnNvciA9IGM7Ci0gICAgICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotICAgIH0KLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBEZWZpbmUgYSBjdXJzb3IgZ3JvdXAgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBncm91cF9jdXJzb3IgKmNnOwotCi0gICAgICBjZyA9IChzdHJ1Y3QgZ3JvdXBfY3Vyc29yICopIHJlc19hbGxvYyAoc2l6ZW9mICpjZyk7Ci0gICAgICBjZy0+bmV4dCA9IE5VTEw7Ci0gICAgICBjZy0+d2lkdGggPSBpY29uZGlyc1tpXS53aWR0aDsKLSAgICAgIGNnLT5oZWlnaHQgPSAyICogaWNvbmRpcnNbaV0uaGVpZ2h0OwotCi0gICAgICAvKiBGSVhNRTogV2hhdCBzaG91bGQgdGhlc2UgYmUgc2V0IHRvPyAgKi8KLSAgICAgIGNnLT5wbGFuZXMgPSAxOwotICAgICAgY2ctPmJpdHMgPSAxOwotCi0gICAgICBjZy0+Ynl0ZXMgPSBpY29uZGlyc1tpXS5ieXRlcyArIDQ7Ci0gICAgICBjZy0+aW5kZXggPSBmaXJzdF9jdXJzb3IgKyBpICsgMTsKLQotICAgICAgKnBwID0gY2c7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoaWNvbmRpcnMpOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0dST1VQX0NVUlNPUiwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfR1JPVVBfQ1VSU09SOwotICByLT51Lmdyb3VwX2N1cnNvciA9IGZpcnN0OwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBkaWFsb2cgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfZGlhbG9nIChpZCwgcmVzaW5mbywgZGlhbG9nKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci17Ci0gIHN0cnVjdCBkaWFsb2cgKmNvcHk7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgY29weSA9IChzdHJ1Y3QgZGlhbG9nICopIHJlc19hbGxvYyAoc2l6ZW9mICpjb3B5KTsKLSAgKmNvcHkgPSAqZGlhbG9nOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0RJQUxPRywgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfRElBTE9HOwotICByLT51LmRpYWxvZyA9IGNvcHk7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGRpYWxvZyBjb250cm9sLiAgVGhpcyBkb2VzIG5vdCBkZWZpbmUgYSByZXNvdXJjZSwgYnV0Ci0gICBtZXJlbHkgYWxsb2NhdGVzIGFuZCBmaWxscyBpbiBhIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBkaWFsb2dfY29udHJvbCAqCi1kZWZpbmVfY29udHJvbCAodGV4dCwgaWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGNsYXNzLCBzdHlsZSwgZXhzdHlsZSkKLSAgICAgY29uc3QgY2hhciAqdGV4dDsKLSAgICAgdW5zaWduZWQgbG9uZyBpZDsKLSAgICAgdW5zaWduZWQgbG9uZyB4OwotICAgICB1bnNpZ25lZCBsb25nIHk7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2lkdGg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaGVpZ2h0OwotICAgICB1bnNpZ25lZCBsb25nIGNsYXNzOwotICAgICB1bnNpZ25lZCBsb25nIHN0eWxlOwotICAgICB1bnNpZ25lZCBsb25nIGV4c3R5bGU7Ci17Ci0gIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqbjsKLQotICBuID0gKHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKSByZXNfYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5pZCA9IGlkOwotICBuLT5zdHlsZSA9IHN0eWxlOwotICBuLT5leHN0eWxlID0gZXhzdHlsZTsKLSAgbi0+eCA9IHg7Ci0gIG4tPnkgPSB5OwotICBuLT53aWR0aCA9IHdpZHRoOwotICBuLT5oZWlnaHQgPSBoZWlnaHQ7Ci0gIG4tPmNsYXNzLm5hbWVkID0gMDsKLSAgbi0+Y2xhc3MudS5pZCA9IGNsYXNzOwotICBpZiAodGV4dCAhPSBOVUxMKQotICAgIHJlc19zdHJpbmdfdG9faWQgKCZuLT50ZXh0LCB0ZXh0KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG4tPnRleHQubmFtZWQgPSAwOwotICAgICAgbi0+dGV4dC51LmlkID0gMDsKLSAgICB9Ci0gIG4tPmRhdGEgPSBOVUxMOwotICBuLT5oZWxwID0gMDsKLQotICByZXR1cm4gbjsKLX0KLQotLyogRGVmaW5lIGEgZm9udCByZXNvdXJjZS4gICovCi0KLXZvaWQKLWRlZmluZV9mb250IChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBsb25nIG9mZnNldDsKLSAgbG9uZyBmb250ZGF0YWxlbmd0aDsKLSAgdW5zaWduZWQgY2hhciAqZm9udGRhdGE7Ci0gIHN0cnVjdCBmb250ZGlyICpmZDsKLSAgY29uc3QgY2hhciAqZGV2aWNlLCAqZmFjZTsKLSAgc3RydWN0IGZvbnRkaXIgKipwcDsKLQotICBlID0gb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIEZPUEVOX1JCLCAiZm9udCBmaWxlIiwgJnJlYWxfZmlsZW5hbWUpOwotCi0gIGlmIChzdGF0IChyZWFsX2ZpbGVuYW1lLCAmcykgPCAwKQotICAgIGZhdGFsIChfKCJzdGF0IGZhaWxlZCBvbiBiaXRtYXAgZmlsZSBgJXMnOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgIHN0cmVycm9yIChlcnJubykpOwotCi0gIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKHMuc3Rfc2l6ZSk7Ci0KLSAgZ2V0X2RhdGEgKGUsIGRhdGEsIHMuc3Rfc2l6ZSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfRk9OVCwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotCi0gIHItPnR5cGUgPSBSRVNfVFlQRV9GT05UOwotICByLT51LmRhdGEubGVuZ3RoID0gcy5zdF9zaXplOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci0KLSAgLyogRm9yIGVhY2ggZm9udCByZXNvdXJjZSwgd2UgbXVzdCBhZGQgYW4gZW50cnkgaW4gdGhlIEZPTlRESVIKLSAgICAgcmVzb3VyY2UuICBUaGUgRk9OVERJUiByZXNvdXJjZSBpbmNsdWRlcyBzb21lIHN0cmluZ3MgaW4gdGhlIGZvbnQKLSAgICAgZmlsZS4gIFRvIGZpbmQgdGhlbSwgd2UgaGF2ZSB0byBkbyBzb21lIG1hZ2ljIG9uIHRoZSBkYXRhIHdlIGhhdmUKLSAgICAgcmVhZC4gICovCi0KLSAgb2Zmc2V0ID0gKCgoKCgoZGF0YVs0N10gPDwgOCkKLQkJfCBkYXRhWzQ2XSkgPDwgOCkKLQkgICAgICB8IGRhdGFbNDVdKSA8PCA4KQotCSAgICB8IGRhdGFbNDRdKTsKLSAgaWYgKG9mZnNldCA+IDAgJiYgb2Zmc2V0IDwgcy5zdF9zaXplKQotICAgIGRldmljZSA9IChjaGFyICopIGRhdGEgKyBvZmZzZXQ7Ci0gIGVsc2UKLSAgICBkZXZpY2UgPSAiIjsKLQotICBvZmZzZXQgPSAoKCgoKChkYXRhWzUxXSA8PCA4KQotCQl8IGRhdGFbNTBdKSA8PCA4KQotCSAgICAgIHwgZGF0YVs0OV0pIDw8IDgpCi0JICAgIHwgZGF0YVs0OF0pOwotICBpZiAob2Zmc2V0ID4gMCAmJiBvZmZzZXQgPCBzLnN0X3NpemUpCi0gICAgZmFjZSA9IChjaGFyICopIGRhdGEgKyBvZmZzZXQ7Ci0gIGVsc2UKLSAgICBmYWNlID0gIiI7Ci0KLSAgKytmb250czsKLQotICBmb250ZGF0YWxlbmd0aCA9IDU4ICsgc3RybGVuIChkZXZpY2UpICsgc3RybGVuIChmYWNlKTsKLSAgZm9udGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKGZvbnRkYXRhbGVuZ3RoKTsKLSAgbWVtY3B5IChmb250ZGF0YSwgZGF0YSwgNTYpOwotICBzdHJjcHkgKChjaGFyICopIGZvbnRkYXRhICsgNTYsIGRldmljZSk7Ci0gIHN0cmNweSAoKGNoYXIgKikgZm9udGRhdGEgKyA1NyArIHN0cmxlbiAoZGV2aWNlKSwgZmFjZSk7Ci0KLSAgZmQgPSAoc3RydWN0IGZvbnRkaXIgKikgcmVzX2FsbG9jIChzaXplb2YgKmZkKTsKLSAgZmQtPm5leHQgPSBOVUxMOwotICBmZC0+aW5kZXggPSBmb250czsKLSAgZmQtPmxlbmd0aCA9IGZvbnRkYXRhbGVuZ3RoOwotICBmZC0+ZGF0YSA9IGZvbnRkYXRhOwotCi0gIGZvciAocHAgPSAmZm9udGRpcnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IGZkOwotCi0gIC8qIEZvciB0aGUgc2luZ2xlIGZvbnRkaXJzIHJlc291cmNlLCB3ZSBhbHdheXMgdXNlIHRoZSByZXNvdXJjZQotICAgICBpbmZvcm1hdGlvbiBvZiB0aGUgbGFzdCBmb250LiAgSSBkb24ndCBrbm93IHdoYXQgZWxzZSB0byBkby4gICovCi0gIGZvbnRkaXJzX3Jlc2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIHRoZSBmb250ZGlycyByZXNvdXJjZS4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBlbnRpcmUgcmMKLSAgIGZpbGUgaGFzIGJlZW4gcGFyc2VkLCBpZiBhbnkgZm9udCByZXNvdXJjZXMgd2VyZSBzZWVuLiAgKi8KLQotc3RhdGljIHZvaWQKLWRlZmluZV9mb250ZGlycyAoKQotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBzdHJ1Y3QgcmVzX2lkIGlkOwotCi0gIGlkLm5hbWVkID0gMDsKLSAgaWQudS5pZCA9IDE7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfRk9OVERJUiwgaWQsIDB4NDA5LCAwKTsKLQotICByLT50eXBlID0gUkVTX1RZUEVfRk9OVERJUjsKLSAgci0+dS5mb250ZGlyID0gZm9udGRpcnM7Ci0gIHItPnJlc19pbmZvID0gZm9udGRpcnNfcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGFuIGljb24gcmVzb3VyY2UuICBBbiBpY29uIGZpbGUgbWF5IGNvbnRhaW4gYSBzZXQgb2YKLSAgIGJpdG1hcHMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSBzYW1lIGljb24gYXQgdmFyaW91cyBkaWZmZXJlbnQKLSAgIHJlc29sdXRpb25zLiAgVGhleSBlYWNoIGdldCB3cml0dGVuIG91dCB3aXRoIGEgZGlmZmVyZW50IElELiAgVGhlCi0gICByZWFsIGljb24gcmVzb3VyY2UgaXMgdGhlbiBhIGdyb3VwIHJlc291cmNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi0gICBzZWxlY3Qgb25lIG9mIHRoZSBhY3R1YWwgaWNvbiBiaXRtYXBzLiAgKi8KLQotdm9pZAotZGVmaW5lX2ljb24gKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIGludCB0eXBlLCBjb3VudCwgaTsKLSAgc3RydWN0IGljb25kaXIgKmljb25kaXJzOwotICBpbnQgZmlyc3RfaWNvbjsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgc3RydWN0IGdyb3VwX2ljb24gKmZpcnN0LCAqKnBwOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJpY29uIGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogVGhlIHN0YXJ0IG9mIGFuIGljb24gZmlsZSBpcyBhIHRocmVlIHdvcmQgc3RydWN0dXJlLiAgVGhlIGZpcnN0Ci0gICAgIHdvcmQgaXMgaWdub3JlZC4gIFRoZSBzZWNvbmQgd29yZCBpcyB0aGUgdHlwZSBvZiBkYXRhLiAgVGhlIHRoaXJkCi0gICAgIHdvcmQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLQotICBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIHR5cGUgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIGNvdW50ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICBpZiAodHlwZSAhPSAxKQotICAgIGZhdGFsIChfKCJpY29uIGZpbGUgYCVzJyBkb2VzIG5vdCBjb250YWluIGljb24gZGF0YSIpLCByZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBSZWFkIGluIHRoZSBpY29uIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLQotICBpY29uZGlycyA9IChzdHJ1Y3QgaWNvbmRpciAqKSB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAqaWNvbmRpcnMpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGljb25kaXJzW2ldLndpZHRoID0gZ2V0YyAoZSk7Ci0gICAgICBpY29uZGlyc1tpXS5oZWlnaHQgPSBnZXRjIChlKTsKLSAgICAgIGljb25kaXJzW2ldLmNvbG9yY291bnQgPSBnZXRjIChlKTsKLSAgICAgIGdldGMgKGUpOwotICAgICAgaWNvbmRpcnNbaV0udS5pY29uLnBsYW5lcyA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgICAgIGljb25kaXJzW2ldLnUuaWNvbi5iaXRzID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICAgICAgaWNvbmRpcnNbaV0uYnl0ZXMgPSBnZXRfbG9uZyAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gICAgICBpY29uZGlyc1tpXS5vZmZzZXQgPSBnZXRfbG9uZyAoZSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgIGlmIChmZW9mIChlKSkKLQl1bmV4cGVjdGVkX2VvZiAocmVhbF9maWxlbmFtZSk7Ci0gICAgfQotCi0gIC8qIERlZmluZSBlYWNoIGljb24gYXMgYSB1bmlxdWUgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0X2ljb24gPSBpY29uczsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICAgc3RydWN0IHJlc19pZCBuYW1lOwotCi0gICAgICBpZiAoZnNlZWsgKGUsIGljb25kaXJzW2ldLm9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JZmF0YWwgKF8oIiVzOiBmc2VlayB0byAlbHUgZmFpbGVkOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgICAgICBpY29uZGlyc1tpXS5vZmZzZXQsIHN0cmVycm9yIChlcnJubykpOwotCi0gICAgICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChpY29uZGlyc1tpXS5ieXRlcyk7Ci0KLSAgICAgIGdldF9kYXRhIChlLCBkYXRhLCBpY29uZGlyc1tpXS5ieXRlcywgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgICsraWNvbnM7Ci0KLSAgICAgIG5hbWUubmFtZWQgPSAwOwotICAgICAgbmFtZS51LmlkID0gaWNvbnM7Ci0KLSAgICAgIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0lDT04sIG5hbWUsCi0JCQkJICAgIHJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9JQ09OOwotICAgICAgci0+dS5kYXRhLmxlbmd0aCA9IGljb25kaXJzW2ldLmJ5dGVzOwotICAgICAgci0+dS5kYXRhLmRhdGEgPSBkYXRhOwotICAgICAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLSAgICB9Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogRGVmaW5lIGFuIGljb24gZ3JvdXAgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBncm91cF9pY29uICpjZzsKLQotICAgICAgLyogRm9yIHNvbWUgcmVhc29uLCBhdCBsZWFzdCBpbiBzb21lIGZpbGVzIHRoZSBwbGFuZXMgYW5kIGJpdHMKLSAgICAgICAgIGFyZSB6ZXJvLiAgV2UgaW5zdGVhZCBzZXQgdGhlbSBmcm9tIHRoZSBjb2xvci4gIFRoaXMgaXMKLSAgICAgICAgIGNvcGllZCBmcm9tIHJjbC4gICovCi0KLSAgICAgIGNnID0gKHN0cnVjdCBncm91cF9pY29uICopIHJlc19hbGxvYyAoc2l6ZW9mICpjZyk7Ci0gICAgICBjZy0+bmV4dCA9IE5VTEw7Ci0gICAgICBjZy0+d2lkdGggPSBpY29uZGlyc1tpXS53aWR0aDsKLSAgICAgIGNnLT5oZWlnaHQgPSBpY29uZGlyc1tpXS5oZWlnaHQ7Ci0gICAgICBjZy0+Y29sb3JzID0gaWNvbmRpcnNbaV0uY29sb3Jjb3VudDsKLQotICAgICAgY2ctPnBsYW5lcyA9IDE7Ci0gICAgICBjZy0+Yml0cyA9IDA7Ci0gICAgICB3aGlsZSAoKDEgPDwgY2ctPmJpdHMpIDwgY2ctPmNvbG9ycykKLQkrK2NnLT5iaXRzOwotCi0gICAgICBjZy0+Ynl0ZXMgPSBpY29uZGlyc1tpXS5ieXRlczsKLSAgICAgIGNnLT5pbmRleCA9IGZpcnN0X2ljb24gKyBpICsgMTsKLQotICAgICAgKnBwID0gY2c7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoaWNvbmRpcnMpOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0dST1VQX0lDT04sIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0dST1VQX0lDT047Ci0gIHItPnUuZ3JvdXBfaWNvbiA9IGZpcnN0OwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBtZW51IHJlc291cmNlLiAgKi8KLQotdm9pZAotZGVmaW5lX21lbnUgKGlkLCByZXNpbmZvLCBtZW51aXRlbXMpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIHN0cnVjdCBtZW51aXRlbSAqbWVudWl0ZW1zOwotewotICBzdHJ1Y3QgbWVudSAqbTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBtID0gKHN0cnVjdCBtZW51ICopIHJlc19hbGxvYyAoc2l6ZW9mICptKTsKLSAgbS0+aXRlbXMgPSBtZW51aXRlbXM7Ci0gIG0tPmhlbHAgPSAwOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX01FTlUsIGlkLCByZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9NRU5VOwotICByLT51Lm1lbnUgPSBtOwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBtZW51IGl0ZW0uICBUaGlzIGRvZXMgbm90IGRlZmluZSBhIHJlc291cmNlLCBidXQgbWVyZWx5Ci0gICBhbGxvY2F0ZXMgYW5kIGZpbGxzIGluIGEgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG1lbnVpdGVtICoKLWRlZmluZV9tZW51aXRlbSAodGV4dCwgbWVudWlkLCB0eXBlLCBzdGF0ZSwgaGVscCwgbWVudWl0ZW1zKQotICAgICBjb25zdCBjaGFyICp0ZXh0OwotICAgICBpbnQgbWVudWlkOwotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3RhdGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaGVscDsKLSAgICAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbXM7Ci17Ci0gIHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgbWkgPSAoc3RydWN0IG1lbnVpdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICptaSk7Ci0gIG1pLT5uZXh0ID0gTlVMTDsKLSAgbWktPnR5cGUgPSB0eXBlOwotICBtaS0+c3RhdGUgPSBzdGF0ZTsKLSAgbWktPmlkID0gbWVudWlkOwotICBpZiAodGV4dCA9PSBOVUxMKQotICAgIG1pLT50ZXh0ID0gTlVMTDsKLSAgZWxzZQotICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmbWktPnRleHQsIHRleHQpOwotICBtaS0+aGVscCA9IGhlbHA7Ci0gIG1pLT5wb3B1cCA9IG1lbnVpdGVtczsKLSAgcmV0dXJuIG1pOwotfQotCi0vKiBEZWZpbmUgYSBtZXNzYWdldGFibGUgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfbWVzc2FnZXRhYmxlIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJtZXNzYWdldGFibGUgZmlsZSIsCi0JCQkmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplKTsKLQotICBnZXRfZGF0YSAoZSwgZGF0YSwgcy5zdF9zaXplLCByZWFsX2ZpbGVuYW1lKTsKLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9NRVNTQUdFVEFCTEUsIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLQotICByLT50eXBlID0gUkVTX1RZUEVfTUVTU0FHRVRBQkxFOwotICByLT51LmRhdGEubGVuZ3RoID0gcy5zdF9zaXplOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhbiByY2RhdGEgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfcmNkYXRhIChpZCwgcmVzaW5mbywgZGF0YSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgc3RydWN0IHJjZGF0YV9pdGVtICpkYXRhOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1JDREFUQSwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfUkNEQVRBOwotICByLT51LnJjZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIENyZWF0ZSBhbiByY2RhdGEgaXRlbSBob2xkaW5nIGEgc3RyaW5nLiAgKi8KLQotc3RydWN0IHJjZGF0YV9pdGVtICoKLWRlZmluZV9yY2RhdGFfc3RyaW5nIChzdHJpbmcsIGxlbikKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICB1bnNpZ25lZCBsb25nIGxlbjsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLSAgY2hhciAqczsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IFJDREFUQV9TVFJJTkc7Ci0gIHJpLT51LnN0cmluZy5sZW5ndGggPSBsZW47Ci0gIHMgPSAoY2hhciAqKSByZXNfYWxsb2MgKGxlbik7Ci0gIG1lbWNweSAocywgc3RyaW5nLCBsZW4pOwotICByaS0+dS5zdHJpbmcucyA9IHM7Ci0KLSAgcmV0dXJuIHJpOwotfQotCi0vKiBDcmVhdGUgYW4gcmNkYXRhIGl0ZW0gaG9sZGluZyBhIG51bWJlci4gICovCi0KLXN0cnVjdCByY2RhdGFfaXRlbSAqCi1kZWZpbmVfcmNkYXRhX251bWJlciAodmFsLCBkd29yZCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gICAgIGludCBkd29yZDsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IGR3b3JkID8gUkNEQVRBX0RXT1JEIDogUkNEQVRBX1dPUkQ7Ci0gIHJpLT51LndvcmQgPSB2YWw7Ci0KLSAgcmV0dXJuIHJpOwotfQotCi0vKiBEZWZpbmUgYSBzdHJpbmd0YWJsZSByZXNvdXJjZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHN0cmluZwotICAgd2hpY2ggYXBwZWFycyBpbiBhIFNUUklOR1RBQkxFIHN0YXRlbWVudC4gICovCi0KLXZvaWQKLWRlZmluZV9zdHJpbmd0YWJsZSAocmVzaW5mbywgc3RyaW5naWQsIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBzdHJpbmdpZDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgcmVzX2lkIGlkOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlkLm5hbWVkID0gMDsKLSAgaWQudS5pZCA9IChzdHJpbmdpZCA+PiA0KSArIDE7Ci0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1NUUklORywgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDEpOwotCi0gIGlmIChyLT50eXBlID09IFJFU19UWVBFX1VOSU5JVElBTElaRUQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9TVFJJTkdUQUJMRTsKLSAgICAgIHItPnUuc3RyaW5ndGFibGUgPSAoKHN0cnVjdCBzdHJpbmd0YWJsZSAqKQotCQkJICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ3RhYmxlKSkpOwotICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JewotCSAgci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5sZW5ndGggPSAwOwotCSAgci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5zdHJpbmcgPSBOVUxMOwotCX0KLQotICAgICAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLSAgICB9Ci0KLSAgdW5pY29kZV9mcm9tX2FzY2lpICgmci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tzdHJpbmdpZCAmIDB4Zl0ubGVuZ3RoLAotCQkgICAgICAmci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tzdHJpbmdpZCAmIDB4Zl0uc3RyaW5nLAotCQkgICAgICBzdHJpbmcpOwotfQotCi0vKiBEZWZpbmUgYSB1c2VyIGRhdGEgcmVzb3VyY2Ugd2hlcmUgdGhlIGRhdGEgaXMgaW4gdGhlIHJjIGZpbGUuICAqLwotCi12b2lkCi1kZWZpbmVfdXNlcl9kYXRhIChpZCwgdHlwZSwgcmVzaW5mbywgZGF0YSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgc3RydWN0IHJlc19pZCB0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRhdGE7Ci17Ci0gIHN0cnVjdCByZXNfaWQgaWRzWzNdOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlkc1swXSA9IHR5cGU7Ci0gIGlkc1sxXSA9IGlkOwotICBpZHNbMl0ubmFtZWQgPSAwOwotICBpZHNbMl0udS5pZCA9IHJlc2luZm8tPmxhbmd1YWdlOwotCi0gIHIgPSBkZWZpbmVfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIDMsIGlkcywgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9VU0VSREFUQTsKLSAgci0+dS51c2VyZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIHVzZXIgZGF0YSByZXNvdXJjZSB3aGVyZSB0aGUgZGF0YSBpcyBpbiBhIGZpbGUuICAqLwotCi12b2lkCi1kZWZpbmVfdXNlcl9maWxlIChpZCwgdHlwZSwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIHN0cnVjdCByZXNfaWQgdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIHN0cnVjdCByZXNfaWQgaWRzWzNdOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJmb250IGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplKTsKLQotICBnZXRfZGF0YSAoZSwgZGF0YSwgcy5zdF9zaXplLCByZWFsX2ZpbGVuYW1lKTsKLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICBpZHNbMF0gPSB0eXBlOwotICBpZHNbMV0gPSBpZDsKLSAgaWRzWzJdLm5hbWVkID0gMDsKLSAgaWRzWzJdLnUuaWQgPSByZXNpbmZvLT5sYW5ndWFnZTsKLQotICByID0gZGVmaW5lX3Jlc291cmNlICgmcmVzb3VyY2VzLCAzLCBpZHMsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfVVNFUkRBVEE7Ci0gIHItPnUudXNlcmRhdGEgPSAoKHN0cnVjdCByY2RhdGFfaXRlbSAqKQotCQkgICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IHJjZGF0YV9pdGVtKSkpOwotICByLT51LnVzZXJkYXRhLT5uZXh0ID0gTlVMTDsKLSAgci0+dS51c2VyZGF0YS0+dHlwZSA9IFJDREFUQV9CVUZGRVI7Ci0gIHItPnUudXNlcmRhdGEtPnUuYnVmZmVyLmxlbmd0aCA9IHMuc3Rfc2l6ZTsKLSAgci0+dS51c2VyZGF0YS0+dS5idWZmZXIuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIHZlcnNpb25pbmZvIHJlc291cmNlLiAgKi8KLQotdm9pZAotZGVmaW5lX3ZlcnNpb25pbmZvIChpZCwgbGFuZ3VhZ2UsIGZpeGVkdmVyaW5mbywgdmVyaW5mbykKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgaW50IGxhbmd1YWdlOwotICAgICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpeGVkdmVyaW5mbzsKLSAgICAgc3RydWN0IHZlcl9pbmZvICp2ZXJpbmZvOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1ZFUlNJT04sIGlkLCBsYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9WRVJTSU9OSU5GTzsKLSAgci0+dS52ZXJzaW9uaW5mbyA9ICgoc3RydWN0IHZlcnNpb25pbmZvICopCi0JCSAgICAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdmVyc2lvbmluZm8pKSk7Ci0gIHItPnUudmVyc2lvbmluZm8tPmZpeGVkID0gZml4ZWR2ZXJpbmZvOwotICByLT51LnZlcnNpb25pbmZvLT52YXIgPSB2ZXJpbmZvOwotICByLT5yZXNfaW5mby5sYW5ndWFnZSA9IGxhbmd1YWdlOwotfQotCi0vKiBBZGQgc3RyaW5nIHZlcnNpb24gaW5mbyB0byBhIGxpc3Qgb2YgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfaW5mbyAqCi1hcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvICh2ZXJpbmZvLCBsYW5ndWFnZSwgc3RyaW5ncykKLSAgICAgc3RydWN0IHZlcl9pbmZvICp2ZXJpbmZvOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotewotICBzdHJ1Y3QgdmVyX2luZm8gKnZpLCAqKnBwOwotCi0gIHZpID0gKHN0cnVjdCB2ZXJfaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdmkpOwotICB2aS0+bmV4dCA9IE5VTEw7Ci0gIHZpLT50eXBlID0gVkVSSU5GT19TVFJJTkc7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmdmktPnUuc3RyaW5nLmxhbmd1YWdlLCBsYW5ndWFnZSk7Ci0gIHZpLT51LnN0cmluZy5zdHJpbmdzID0gc3RyaW5nczsKLQotICBmb3IgKHBwID0gJnZlcmluZm87ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZpOwotCi0gIHJldHVybiB2ZXJpbmZvOwotfQotCi0vKiBBZGQgdmFyaWFibGUgdmVyc2lvbiBpbmZvIHRvIGEgbGlzdCBvZiB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl9pbmZvICoKLWFwcGVuZF92ZXJfdmFyZmlsZWluZm8gKHZlcmluZm8sIGtleSwgdmFyKQotICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZlcmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2YXI7Ci17Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmksICoqcHA7Ci0KLSAgdmkgPSAoc3RydWN0IHZlcl9pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2aSk7Ci0gIHZpLT5uZXh0ID0gTlVMTDsKLSAgdmktPnR5cGUgPSBWRVJJTkZPX1ZBUjsKLSAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2aS0+dS52YXIua2V5LCBrZXkpOwotICB2aS0+dS52YXIudmFyID0gdmFyOwotCi0gIGZvciAocHAgPSAmdmVyaW5mbzsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gdmk7Ci0KLSAgcmV0dXJuIHZlcmluZm87Ci19Ci0KLS8qIEFwcGVuZCB2ZXJzaW9uIHN0cmluZyBpbmZvcm1hdGlvbiB0byBhIGxpc3QuICAqLwotCi1zdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKgotYXBwZW5kX3ZlcnZhbCAoc3RyaW5ncywga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotICAgICBjb25zdCBjaGFyICprZXk7Ci0gICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotewotICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzLCAqKnBwOwotCi0gIHZzID0gKHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnMpOwotICB2cy0+bmV4dCA9IE5VTEw7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmdnMtPmtleSwga2V5KTsKLSAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2cy0+dmFsdWUsIHZhbHVlKTsKLQotICBmb3IgKHBwID0gJnN0cmluZ3M7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZzOwotCi0gIHJldHVybiBzdHJpbmdzOwotfQotCi0vKiBBcHBlbmQgdmVyc2lvbiB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBhIGxpc3QuICAqLwotCi1zdHJ1Y3QgdmVyX3ZhcmluZm8gKgotYXBwZW5kX3ZlcnRyYW5zICh2YXIsIGxhbmd1YWdlLCBjaGFyc2V0KQotICAgICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZhcjsKLSAgICAgdW5zaWduZWQgbG9uZyBsYW5ndWFnZTsKLSAgICAgdW5zaWduZWQgbG9uZyBjaGFyc2V0OwotewotICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2LCAqKnBwOwotCi0gIHZ2ID0gKHN0cnVjdCB2ZXJfdmFyaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnYpOwotICB2di0+bmV4dCA9IE5VTEw7Ci0gIHZ2LT5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICB2di0+Y2hhcnNldCA9IGNoYXJzZXQ7Ci0KLSAgZm9yIChwcCA9ICZ2YXI7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZ2OwotCi0gIHJldHVybiB2YXI7Ci19Ci0MCi0vKiBMb2NhbCBmdW5jdGlvbnMgdXNlZCB0byB3cml0ZSBvdXQgYW4gcmMgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGluZGVudCBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZGlyZWN0b3J5Ci0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50ICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfc3ViZGlyCi0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19yZXNvdXJjZQotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2FjY2VsZXJhdG9ycwotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19jdXJzb3IgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgY3Vyc29yICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2dyb3VwX2N1cnNvcgotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZGlhbG9nIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGRpYWxvZyAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19kaWFsb2dfY29udHJvbAotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19mb250ZGlyIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGZvbnRkaXIgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZ3JvdXBfaWNvbiBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX21lbnUgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgbWVudSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX21lbnVpdGVtcwotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfcmNkYXRhIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfc3RyaW5ndGFibGUKLSAgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY192ZXJzaW9uaW5mbyBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCB2ZXJzaW9uaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19maWxlZGF0YQotICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotCi0vKiBJbmRlbnQgYSBnaXZlbiBudW1iZXIgb2Ygc3BhY2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLWluZGVudCAoZSwgYykKLSAgICAgRklMRSAqZTsKLSAgICAgaW50IGM7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgcHV0YyAoJyAnLCBlKTsKLX0KLQotLyogRHVtcCB0aGUgcmVzb3VyY2VzIHdlIGhhdmUgcmVhZCBpbiB0aGUgZm9ybWF0IG9mIGFuIHJjIGZpbGUuCi0KLSAgIEFjdHVhbGx5LCB3ZSBkb24ndCB1c2UgdGhlIGZvcm1hdCBvZiBhbiByYyBmaWxlLCBiZWNhdXNlIGl0J3Mgd2F5Ci0gICB0b28gbXVjaCBvZiBhIHBhaW4tLWZvciBleGFtcGxlLCB3ZSdkIGhhdmUgdG8gd3JpdGUgaWNvbiByZXNvdXJjZXMKLSAgIGludG8gYSBmaWxlIGFuZCByZWZlciB0byB0aGF0IGZpbGUuICBXZSBqdXN0IGdlbmVyYXRlIGEgcmVhZGFibGUKLSAgIGZvcm1hdCB0aGF0IGtpbmQgb2YgbG9va3MgbGlrZSBhbiByYyBmaWxlLCBhbmQgaXMgdXNlZnVsIGZvcgotICAgdW5kZXJzdGFuZGluZyB0aGUgY29udGVudHMgb2YgYSByZXNvdXJjZSBmaWxlLiAgU29tZWRheSB3ZSBtYXkgd2FudAotICAgdG8gZ2VuZXJhdGUgYW4gcmMgZmlsZSB3aGljaCB0aGUgcmMgY29tcGlsZXIgY2FuIHJlYWQ7IGlmIHRoYXQgZGF5Ci0gICBjb21lcywgdGhpcyBjb2RlIHdpbGwgaGF2ZSB0byBiZSBmaXhlZCB1cC4gICovCi0KLXZvaWQKLXdyaXRlX3JjX2ZpbGUgKGZpbGVuYW1lLCByZXNvdXJjZXMpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotewotICBGSUxFICplOwotICBpbnQgbGFuZ3VhZ2U7Ci0KLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZSA9IHN0ZG91dDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGUgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dUKTsKLSAgICAgIGlmIChlID09IE5VTEwpCi0JZmF0YWwgKF8oImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIpLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgfQotCi0gIGxhbmd1YWdlID0gLTE7Ci0gIHdyaXRlX3JjX2RpcmVjdG9yeSAoZSwgcmVzb3VyY2VzLCAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLAotCQkgICAgICAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLCAmbGFuZ3VhZ2UsIDEpOwotfQotCi0vKiBXcml0ZSBvdXQgYSBkaXJlY3RvcnkuICBFIGlzIHRoZSBmaWxlIHRvIHdyaXRlIHRvLiAgUkQgaXMgdGhlCi0gICBkaXJlY3RvcnkuICBUWVBFIGlzIGEgcG9pbnRlciB0byB0aGUgbGV2ZWwgMSBJRCB3aGljaCBzZXJ2ZXMgYXMgdGhlCi0gICByZXNvdXJjZSB0eXBlLiAgTkFNRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGxldmVsIDIgSUQgd2hpY2ggc2VydmVzIGFzCi0gICBhbiBpbmRpdmlkdWFsIHJlc291cmNlIG5hbWUuICBMQU5HVUFHRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQKLSAgIGxhbmd1YWdlLiAgTEVWRUwgaXMgdGhlIGxldmVsIGluIHRoZSB0cmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2RpcmVjdG9yeSAoZSwgcmQsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBpbnQgKmxhbmd1YWdlOwotICAgICBpbnQgbGV2ZWw7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKnJlOwotCi0gIC8qIFByaW50IG91dCBzb21lIENPRkYgaW5mb3JtYXRpb24gdGhhdCByYyBmaWxlcyBjYW4ndCByZXByZXNlbnQuICAqLwotCi0gIGlmIChyZC0+dGltZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBUaW1lIHN0YW1wOiAlbHVcbiIsIHJkLT50aW1lKTsKLSAgaWYgKHJkLT5jaGFyYWN0ZXJpc3RpY3MgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gQ2hhcmFjdGVyaXN0aWNzOiAlbHVcbiIsIHJkLT5jaGFyYWN0ZXJpc3RpY3MpOwotICBpZiAocmQtPm1ham9yICE9IDAgfHwgcmQtPm1pbm9yICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIFZlcnNpb246ICVkICVkXG4iLCByZC0+bWFqb3IsIHJkLT5taW5vcik7Ci0KLSAgZm9yIChyZSA9IHJkLT5lbnRyaWVzOyAgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGxldmVsKQotCXsKLQljYXNlIDE6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAxLCB0aGUga2V5IG9mIHRoaXMgcmVzb3VyY2UgaXMgdGhlCi0gICAgICAgICAgICAgdHlwZS4gIFRoaXMgbm9ybWFsbHkgZHVwbGljYXRlcyB0aGUgaW5mb3JtYXRpb24gd2UgaGF2ZQotICAgICAgICAgICAgIHN0b3JlZCB3aXRoIHRoZSByZXNvdXJjZSBpdHNlbGYsIGJ1dCB3ZSBuZWVkIHRvIHJlbWVtYmVyCi0gICAgICAgICAgICAgdGhlIHR5cGUgaWYgdGhpcyBpcyBhIHVzZXIgZGVmaW5lIHJlc291cmNlIHR5cGUuICAqLwotCSAgdHlwZSA9ICZyZS0+aWQ7Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDIsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUgbmFtZQotCSAgICAgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbiB0aGUgcmMgcHJpbnRvdXQuICovCi0JICBuYW1lID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMywgdGhlbiB0aGlzIGtleSByZXByZXNlbnRzIGEgbGFuZ3VhZ2UuCi0JICAgICBVc2UgaXQgdG8gdXBkYXRlIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAgKi8KLQkgIGlmICghIHJlLT5pZC5uYW1lZAotCSAgICAgICYmIHJlLT5pZC51LmlkICE9ICh1bnNpZ25lZCBsb25nKSAodW5zaWduZWQgaW50KSAqbGFuZ3VhZ2UKLQkgICAgICAmJiAocmUtPmlkLnUuaWQgJiAweGZmZmYpID09IHJlLT5pZC51LmlkKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoZSwgIkxBTkdVQUdFICVsdSwgJWx1XG4iLAotCQkgICAgICAgcmUtPmlkLnUuaWQgJiAweGZmLCAocmUtPmlkLnUuaWQgPj4gOCkgJiAweGZmKTsKLQkgICAgICAqbGFuZ3VhZ2UgPSByZS0+aWQudS5pZDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmUtPnN1YmRpcikKLQl3cml0ZV9yY19zdWJkaXIgKGUsIHJlLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwgbGV2ZWwpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZXZlbCA9PSAzKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgbm9ybWFsIGNhc2U6IHRoZSB0aHJlZSBsZXZlbHMgYXJlCi0gICAgICAgICAgICAgICAgIFRZUEUvTkFNRS9MQU5HVUFHRS4gIE5BTUUgd2lsbCBoYXZlIGJlZW4gc2V0IGF0IGxldmVsCi0gICAgICAgICAgICAgICAgIDIsIGFuZCByZXByZXNlbnRzIHRoZSBuYW1lIHRvIHVzZS4gIFdlIHByb2JhYmx5IGp1c3QKLSAgICAgICAgICAgICAgICAgc2V0IExBTkdVQUdFLCBhbmQgaXQgd2lsbCBwcm9iYWJseSBtYXRjaCB3aGF0IHRoZQotICAgICAgICAgICAgICAgICByZXNvdXJjZSBpdHNlbGYgcmVjb3JkcyBpZiBhbnl0aGluZy4gICovCi0JICAgICAgd3JpdGVfcmNfcmVzb3VyY2UgKGUsIHR5cGUsIG5hbWUsIHJlLT51LnJlcywgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChlLCAiLy8gUmVzb3VyY2UgYXQgdW5leHBlY3RlZCBsZXZlbCAlZFxuIiwgbGV2ZWwpOwotCSAgICAgIHdyaXRlX3JjX3Jlc291cmNlIChlLCB0eXBlLCAoc3RydWN0IHJlc19pZCAqKSBOVUxMLCByZS0+dS5yZXMsCi0JCQkJIGxhbmd1YWdlKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN1YmRpcmVjdG9yeSBlbnRyeS4gIEUgaXMgdGhlIGZpbGUgdG8gd3JpdGUgdG8uICBSRSBpcwotICAgdGhlIHN1YmRpcmVjdG9yeSBlbnRyeS4gIFRZUEUgYW5kIE5BTUUgYXJlIHBvaW50ZXJzIHRvIGhpZ2hlciBsZXZlbAotICAgSURzLCBvciBOVUxMLiAgTEFOR1VBR0UgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxhbmd1YWdlLgotICAgTEVWRUwgaXMgdGhlIGxldmVsIGluIHRoZSB0cmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3N1YmRpciAoZSwgcmUsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci0gICAgIGludCBsZXZlbDsKLXsKLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0gIHN3aXRjaCAobGV2ZWwpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGZwcmludGYgKGUsICIvLyBUeXBlOiAiKTsKLSAgICAgIGlmIChyZS0+aWQubmFtZWQpCi0JcmVzX2lkX3ByaW50IChlLCByZS0+aWQsIDEpOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0KLQkgIHN3aXRjaCAocmUtPmlkLnUuaWQpCi0JICAgIHsKLQkgICAgY2FzZSBSVF9DVVJTT1I6IHMgPSAiY3Vyc29yIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfQklUTUFQOiBzID0gImJpdG1hcCI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0lDT046IHMgPSAiaWNvbiI7IGJyZWFrOwotCSAgICBjYXNlIFJUX01FTlU6IHMgPSAibWVudSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0RJQUxPRzogcyA9ICJkaWFsb2ciOyBicmVhazsKLQkgICAgY2FzZSBSVF9TVFJJTkc6IHMgPSAic3RyaW5ndGFibGUiOyBicmVhazsKLQkgICAgY2FzZSBSVF9GT05URElSOiBzID0gImZvbnRkaXIiOyBicmVhazsKLQkgICAgY2FzZSBSVF9GT05UOiBzID0gImZvbnQiOyBicmVhazsKLQkgICAgY2FzZSBSVF9BQ0NFTEVSQVRPUjogcyA9ICJhY2NlbGVyYXRvcnMiOyBicmVhazsKLQkgICAgY2FzZSBSVF9SQ0RBVEE6IHMgPSAicmNkYXRhIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfTUVTU0FHRVRBQkxFOiBzID0gIm1lc3NhZ2V0YWJsZSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0dST1VQX0NVUlNPUjogcyA9ICJncm91cCBjdXJzb3IiOyBicmVhazsKLQkgICAgY2FzZSBSVF9HUk9VUF9JQ09OOiBzID0gImdyb3VwIGljb24iOyBicmVhazsKLQkgICAgY2FzZSBSVF9WRVJTSU9OOiBzID0gInZlcnNpb24iOyBicmVhazsKLQkgICAgY2FzZSBSVF9ETEdJTkNMVURFOiBzID0gImRsZ2luY2x1ZGUiOyBicmVhazsKLQkgICAgY2FzZSBSVF9QTFVHUExBWTogcyA9ICJwbHVncGxheSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX1ZYRDogcyA9ICJ2eGQiOyBicmVhazsKLQkgICAgY2FzZSBSVF9BTklDVVJTT1I6IHMgPSAiYW5pY3Vyc29yIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfQU5JSUNPTjogcyA9ICJhbmlpY29uIjsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6IHMgPSBOVUxMOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAocyAhPSBOVUxMKQotCSAgICBmcHJpbnRmIChlLCAiJXMiLCBzKTsKLQkgIGVsc2UKLQkgICAgcmVzX2lkX3ByaW50IChlLCByZS0+aWQsIDEpOwotCX0KLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gTmFtZTogIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgZnByaW50ZiAoZSwgIi8vIExhbmd1YWdlOiAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgcmUtPmlkLCAxKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoZSwgIi8vIExldmVsICVkOiAiLCBsZXZlbCk7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9CQkKLQotICB3cml0ZV9yY19kaXJlY3RvcnkgKGUsIHJlLT51LmRpciwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsICsgMSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHNpbmdsZSByZXNvdXJjZS4gIEUgaXMgdGhlIGZpbGUgdG8gd3JpdGUgdG8uICBUWVBFIGlzIGEKLSAgIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLiAgTkFNRSBpcyBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLSAgIG9mIHRoZSByZXNvdXJjZTsgaXQgd2lsbCBiZSBOVUxMIGlmIHRoZXJlIGlzIGEgbGV2ZWwgbWlzbWF0Y2guICBSRVMKLSAgIGlzIHRoZSByZXNvdXJjZSBkYXRhLiAgTEFOR1VBR0UgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50Ci0gICBsYW5ndWFnZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19yZXNvdXJjZSAoZSwgdHlwZSwgbmFtZSwgcmVzLCBsYW5ndWFnZSkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBpbnQgKmxhbmd1YWdlOwotewotICBjb25zdCBjaGFyICpzOwotICBpbnQgcnQ7Ci0gIGludCBtZW51ZXggPSAwOwotCi0gIGZwcmludGYgKGUsICJcbiIpOwotCi0gIHN3aXRjaCAocmVzLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgotICAgICAgcyA9ICJBQ0NFTEVSQVRPUiI7Ci0gICAgICBydCA9IFJUX0FDQ0VMRVJBVE9SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKLSAgICAgIHMgPSAiQklUTUFQIjsKLSAgICAgIHJ0ID0gUlRfQklUTUFQOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKLSAgICAgIHMgPSAiQ1VSU09SIjsKLSAgICAgIHJ0ID0gUlRfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKLSAgICAgIHMgPSAiR1JPVVBfQ1VSU09SIjsKLSAgICAgIHJ0ID0gUlRfR1JPVVBfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIGlmIChleHRlbmRlZF9kaWFsb2cgKHJlcy0+dS5kaWFsb2cpKQotCXMgPSAiRElBTE9HRVgiOwotICAgICAgZWxzZQotCXMgPSAiRElBTE9HIjsKLSAgICAgIHJ0ID0gUlRfRElBTE9HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6Ci0gICAgICBzID0gIkZPTlQiOwotICAgICAgcnQgPSBSVF9GT05UOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlRESVI6Ci0gICAgICBzID0gIkZPTlRESVIiOwotICAgICAgcnQgPSBSVF9GT05URElSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0lDT046Ci0gICAgICBzID0gIklDT04iOwotICAgICAgcnQgPSBSVF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046Ci0gICAgICBzID0gIkdST1VQX0lDT04iOwotICAgICAgcnQgPSBSVF9HUk9VUF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FTlU6Ci0gICAgICBpZiAoZXh0ZW5kZWRfbWVudSAocmVzLT51Lm1lbnUpKQotCXsKLQkgIHMgPSAiTUVOVUVYIjsKLQkgIG1lbnVleCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHMgPSAiTUVOVSI7Ci0JICBtZW51ZXggPSAwOwotCX0KLSAgICAgIHJ0ID0gUlRfTUVOVTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU6Ci0gICAgICBzID0gIk1FU1NBR0VUQUJMRSI7Ci0gICAgICBydCA9IFJUX01FU1NBR0VUQUJMRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICBzID0gIlJDREFUQSI7Ci0gICAgICBydCA9IFJUX1JDREFUQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLSAgICAgIHMgPSAiU1RSSU5HVEFCTEUiOwotICAgICAgcnQgPSBSVF9TVFJJTkc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICBzID0gTlVMTDsKLSAgICAgIHJ0ID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9WRVJTSU9OSU5GTzoKLSAgICAgIHMgPSAiVkVSU0lPTklORk8iOwotICAgICAgcnQgPSBSVF9WRVJTSU9OOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChydCAhPSAwCi0gICAgICAmJiB0eXBlICE9IE5VTEwKLSAgICAgICYmICh0eXBlLT5uYW1lZCB8fCB0eXBlLT51LmlkICE9ICh1bnNpZ25lZCBsb25nKSBydCkpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIFVuZXhwZWN0ZWQgcmVzb3VyY2UgdHlwZSBtaXNtYXRjaDogIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsICp0eXBlLCAxKTsKLSAgICAgIGZwcmludGYgKGUsICIgIT0gJWQiLCBydCk7Ci0gICAgfQotCi0gIGlmIChyZXMtPmNvZmZfaW5mby5jb2RlcGFnZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBDb2RlIHBhZ2U6ICVsdVxuIiwgcmVzLT5jb2ZmX2luZm8uY29kZXBhZ2UpOwotICBpZiAocmVzLT5jb2ZmX2luZm8ucmVzZXJ2ZWQgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gQ09GRiByZXNlcnZlZCB2YWx1ZTogJWx1XG4iLCByZXMtPmNvZmZfaW5mby5yZXNlcnZlZCk7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICByZXNfaWRfcHJpbnQgKGUsICpuYW1lLCAwKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGUsICI/P1Vua25vd24tTmFtZT8/Iik7Ci0KLSAgZnByaW50ZiAoZSwgIiAiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChlLCAiJXMiLCBzKTsKLSAgZWxzZSBpZiAodHlwZSAhPSBOVUxMKQotICAgIHJlc19pZF9wcmludCAoZSwgKnR5cGUsIDApOwotICBlbHNlCi0gICAgZnByaW50ZiAoZSwgIj8/VW5rbm93bi1UeXBlPz8iKTsKLQotICBpZiAocmVzLT5yZXNfaW5mby5tZW1mbGFncyAhPSAwKQotICAgIHsKLSAgICAgIGlmICgocmVzLT5yZXNfaW5mby5tZW1mbGFncyAmIE1FTUZMQUdfTU9WRUFCTEUpICE9IDApCi0JZnByaW50ZiAoZSwgIiBNT1ZFQUJMRSIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19QVVJFKSAhPSAwKQotCWZwcmludGYgKGUsICIgUFVSRSIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19QUkVMT0FEKSAhPSAwKQotCWZwcmludGYgKGUsICIgUFJFTE9BRCIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19ESVNDQVJEQUJMRSkgIT0gMCkKLQlmcHJpbnRmIChlLCAiIERJU0NBUkRBQkxFIik7Ci0gICAgfQotCi0gIGlmIChyZXMtPnR5cGUgPT0gUkVTX1RZUEVfRElBTE9HKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIgJWQsICVkLCAlZCwgJWQiLCByZXMtPnUuZGlhbG9nLT54LCByZXMtPnUuZGlhbG9nLT55LAotCSAgICAgICByZXMtPnUuZGlhbG9nLT53aWR0aCwgcmVzLT51LmRpYWxvZy0+aGVpZ2h0KTsKLSAgICAgIGlmIChyZXMtPnUuZGlhbG9nLT5leCAhPSBOVUxMCi0JICAmJiByZXMtPnUuZGlhbG9nLT5leC0+aGVscCAhPSAwKQotCWZwcmludGYgKGUsICIsICVsdSIsIHJlcy0+dS5kaWFsb2ctPmV4LT5oZWxwKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0KLSAgaWYgKChyZXMtPnJlc19pbmZvLmxhbmd1YWdlICE9IDAgJiYgcmVzLT5yZXNfaW5mby5sYW5ndWFnZSAhPSAqbGFuZ3VhZ2UpCi0gICAgICB8fCByZXMtPnJlc19pbmZvLmNoYXJhY3RlcmlzdGljcyAhPSAwCi0gICAgICB8fCByZXMtPnJlc19pbmZvLnZlcnNpb24gIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgbW9kaWZpZXJzOwotCi0gICAgICBzd2l0Y2ggKHJlcy0+dHlwZSkKLQl7Ci0JY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLQljYXNlIFJFU19UWVBFX0RJQUxPRzoKLQljYXNlIFJFU19UWVBFX01FTlU6Ci0JY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0JY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLQkgIG1vZGlmaWVycyA9IDE7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBtb2RpZmllcnMgPSAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmVzLT5yZXNfaW5mby5sYW5ndWFnZSAhPSAwICYmIHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgIT0gKmxhbmd1YWdlKQotCWZwcmludGYgKGUsICIlc0xBTkdVQUdFICVkLCAlZFxuIiwKLQkJIG1vZGlmaWVycyA/ICIvLyAiIDogIiIsCi0JCSByZXMtPnJlc19pbmZvLmxhbmd1YWdlICYgMHhmZiwKLQkJIChyZXMtPnJlc19pbmZvLmxhbmd1YWdlID4+IDgpICYgMHhmZik7Ci0gICAgICBpZiAocmVzLT5yZXNfaW5mby5jaGFyYWN0ZXJpc3RpY3MgIT0gMCkKLQlmcHJpbnRmIChlLCAiJXNDSEFSQUNURVJJU1RJQ1MgJWx1XG4iLAotCQkgbW9kaWZpZXJzID8gIi8vICIgOiAiIiwKLQkJIHJlcy0+cmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzKTsKLSAgICAgIGlmIChyZXMtPnJlc19pbmZvLnZlcnNpb24gIT0gMCkKLQlmcHJpbnRmIChlLCAiJXNWRVJTSU9OICVsdVxuIiwKLQkJIG1vZGlmaWVycyA/ICIvLyAiIDogIiIsCi0JCSByZXMtPnJlc19pbmZvLnZlcnNpb24pOwotICAgIH0KLQotICBzd2l0Y2ggKHJlcy0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHdyaXRlX3JjX2FjY2VsZXJhdG9ycyAoZSwgcmVzLT51LmFjYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgotICAgICAgd3JpdGVfcmNfY3Vyc29yIChlLCByZXMtPnUuY3Vyc29yKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I6Ci0gICAgICB3cml0ZV9yY19ncm91cF9jdXJzb3IgKGUsIHJlcy0+dS5ncm91cF9jdXJzb3IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIHdyaXRlX3JjX2RpYWxvZyAoZSwgcmVzLT51LmRpYWxvZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKLSAgICAgIHdyaXRlX3JjX2ZvbnRkaXIgKGUsIHJlcy0+dS5mb250ZGlyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9JQ09OOgotICAgICAgd3JpdGVfcmNfZ3JvdXBfaWNvbiAoZSwgcmVzLT51Lmdyb3VwX2ljb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FTlU6Ci0gICAgICB3cml0ZV9yY19tZW51IChlLCByZXMtPnUubWVudSwgbWVudWV4KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICB3cml0ZV9yY19yY2RhdGEgKGUsIHJlcy0+dS5yY2RhdGEsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotICAgICAgd3JpdGVfcmNfc3RyaW5ndGFibGUgKGUsIG5hbWUsIHJlcy0+dS5zdHJpbmd0YWJsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICB3cml0ZV9yY19yY2RhdGEgKGUsIHJlcy0+dS51c2VyZGF0YSwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICB3cml0ZV9yY192ZXJzaW9uaW5mbyAoZSwgcmVzLT51LnZlcnNpb25pbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9CSVRNQVA6Ci0gICAgY2FzZSBSRVNfVFlQRV9GT05UOgotICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHdyaXRlX3JjX2ZpbGVkYXRhIChlLCByZXMtPnUuZGF0YS5sZW5ndGgsIHJlcy0+dS5kYXRhLmRhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYWNjZWxlcmF0b3IgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfYWNjZWxlcmF0b3JzIChlLCBhY2NlbGVyYXRvcnMpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjZWxlcmF0b3JzOwotewotICBjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmFjYzsKLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotICBmb3IgKGFjYyA9IGFjY2VsZXJhdG9yczsgYWNjICE9IE5VTEw7IGFjYyA9IGFjYy0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgcHJpbnRhYmxlOwotCi0gICAgICBmcHJpbnRmIChlLCAiICAiKTsKLQotICAgICAgaWYgKChhY2MtPmtleSAmIDB4N2YpID09IGFjYy0+a2V5Ci0JICAmJiBpc3ByaW50ICgodW5zaWduZWQgY2hhcikgYWNjLT5rZXkpCi0JICAmJiAoYWNjLT5mbGFncyAmIEFDQ19WSVJUS0VZKSA9PSAwKQotCXsKLQkgIGZwcmludGYgKGUsICJcIiVjXCIiLCBhY2MtPmtleSk7Ci0JICBwcmludGFibGUgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChlLCAiJWQiLCBhY2MtPmtleSk7Ci0JICBwcmludGFibGUgPSAwOwotCX0KLQotICAgICAgZnByaW50ZiAoZSwgIiwgJWQiLCBhY2MtPmlkKTsKLQotICAgICAgaWYgKCEgcHJpbnRhYmxlKQotCXsKLQkgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19WSVJUS0VZKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBWSVJUS0VZIik7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKGUsICIsIEFTQ0lJIik7Ci0JfQotCi0gICAgICBpZiAoKGFjYy0+ZmxhZ3MgJiBBQ0NfU0hJRlQpICE9IDApCi0JZnByaW50ZiAoZSwgIiwgU0hJRlQiKTsKLSAgICAgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19DT05UUk9MKSAhPSAwKQotCWZwcmludGYgKGUsICIsIENPTlRST0wiKTsKLSAgICAgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19BTFQpICE9IDApCi0JZnByaW50ZiAoZSwgIiwgQUxUIik7Ci0KLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGN1cnNvciBpbmZvcm1hdGlvbi4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgaW4gYSBzZXBhcmF0ZQotICAgZmlsZSwgd2hpY2ggdGhlIHJjIGZpbGUgd291bGQgaW5jbHVkZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19jdXJzb3IgKGUsIGN1cnNvcikKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IGN1cnNvciAqY3Vyc29yOwotewotICBmcHJpbnRmIChlLCAiLy8gSG90c3BvdDogeDogJWQ7IHk6ICVkXG4iLCBjdXJzb3ItPnhob3RzcG90LAotCSAgIGN1cnNvci0+eWhvdHNwb3QpOwotICB3cml0ZV9yY19maWxlZGF0YSAoZSwgY3Vyc29yLT5sZW5ndGgsIGN1cnNvci0+ZGF0YSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBncm91cCBjdXJzb3IgZGF0YS4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgYnVpbHQgZnJvbSB0aGUKLSAgIGN1cnNvciBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2dyb3VwX2N1cnNvciAoZSwgZ3JvdXBfY3Vyc29yKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpncm91cF9jdXJzb3I7Ci17Ci0gIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdjOwotCi0gIGZvciAoZ2MgPSBncm91cF9jdXJzb3I7IGdjICE9IE5VTEw7IGdjID0gZ2MtPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIHdpZHRoOiAlZDsgaGVpZ2h0ICVkOyBwbGFuZXMgJWQ7IGJpdHMgJWRcbiIsCi0JICAgICBnYy0+d2lkdGgsIGdjLT5oZWlnaHQsIGdjLT5wbGFuZXMsIGdjLT5iaXRzKTsKLSAgICAgIGZwcmludGYgKGUsICIvLyBkYXRhIGJ5dGVzOiAlbHU7IGluZGV4OiAlZFxuIiwKLQkgICAgICAgZ2MtPmJ5dGVzLCBnYy0+aW5kZXgpOwotICAgIH0KLX0KLQotLyogV3JpdGUgZGlhbG9nIGRhdGEuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfZGlhbG9nIChlLCBkaWFsb2cpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpYWxvZ19jb250cm9sICpjb250cm9sOwotCi0gIGlmIChkaWFsb2ctPnN0eWxlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIlNUWUxFIDB4JWx4XG4iLCBkaWFsb2ctPnN0eWxlKTsKLSAgaWYgKGRpYWxvZy0+ZXhzdHlsZSAhPSAwKQotICAgIGZwcmludGYgKGUsICJFWFNUWUxFIDB4JWx4XG4iLCBkaWFsb2ctPmV4c3R5bGUpOwotICBpZiAoKGRpYWxvZy0+Y2xhc3MubmFtZWQgJiYgZGlhbG9nLT5jbGFzcy51Lm4ubGVuZ3RoID4gMCkKLSAgICAgIHx8IGRpYWxvZy0+Y2xhc3MudS5pZCAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICJDTEFTUyAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgZGlhbG9nLT5jbGFzcywgMCk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChkaWFsb2ctPmNhcHRpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiQ0FQVElPTiBcIiIpOwotICAgICAgdW5pY29kZV9wcmludCAoZSwgZGlhbG9nLT5jYXB0aW9uLCAtMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXCJcbiIpOwotICAgIH0KLSAgaWYgKChkaWFsb2ctPm1lbnUubmFtZWQgJiYgZGlhbG9nLT5tZW51LnUubi5sZW5ndGggPiAwKQotICAgICAgfHwgZGlhbG9nLT5tZW51LnUuaWQgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiTUVOVSAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgZGlhbG9nLT5tZW51LCAwKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLSAgaWYgKGRpYWxvZy0+Zm9udCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICJGT05UICVkLCBcIiIsIGRpYWxvZy0+cG9pbnRzaXplKTsKLSAgICAgIHVuaWNvZGVfcHJpbnQgKGUsIGRpYWxvZy0+Zm9udCwgLTEpOwotICAgICAgZnByaW50ZiAoZSwgIlwiIik7Ci0gICAgICBpZiAoZGlhbG9nLT5leCAhPSBOVUxMCi0JICAmJiAoZGlhbG9nLT5leC0+d2VpZ2h0ICE9IDAgfHwgZGlhbG9nLT5leC0+aXRhbGljICE9IDApKQotCWZwcmludGYgKGUsICIsICVkLCAlZCIsIGRpYWxvZy0+ZXgtPndlaWdodCwgZGlhbG9nLT5leC0+aXRhbGljKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAoY29udHJvbCA9IGRpYWxvZy0+Y29udHJvbHM7IGNvbnRyb2wgIT0gTlVMTDsgY29udHJvbCA9IGNvbnRyb2wtPm5leHQpCi0gICAgd3JpdGVfcmNfZGlhbG9nX2NvbnRyb2wgKGUsIGNvbnRyb2wpOwotCi0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBGb3IgZWFjaCBwcmVkZWZpbmVkIGNvbnRyb2wga2V5d29yZCwgdGhpcyB0YWJsZSBwcm92aWRlcyB0aGUgY2xhc3MKLSAgIGFuZCB0aGUgc3R5bGUuICAqLwotCi1zdHJ1Y3QgY29udHJvbF9pbmZvCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIHNob3J0IGNsYXNzOwotICB1bnNpZ25lZCBsb25nIHN0eWxlOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gY29udHJvbF9pbmZvW10gPQotewotICB7ICJBVVRPM1NUQVRFIiwgQ1RMX0JVVFRPTiwgQlNfQVVUTzNTVEFURSB9LAotICB7ICJBVVRPQ0hFQ0tCT1giLCBDVExfQlVUVE9OLCBCU19BVVRPQ0hFQ0tCT1ggfSwKLSAgeyAiQVVUT1JBRElPQlVUVE9OIiwgQ1RMX0JVVFRPTiwgQlNfQVVUT1JBRElPQlVUVE9OIH0sCi0gIHsgIkNIRUNLQk9YIiwgQ1RMX0JVVFRPTiwgQlNfQ0hFQ0tCT1ggfSwKLSAgeyAiQ09NQk9CT1giLCBDVExfQ09NQk9CT1gsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJDVEVYVCIsIENUTF9TVEFUSUMsIFNTX0NFTlRFUiB9LAotICB7ICJERUZQVVNIQlVUVE9OIiwgQ1RMX0JVVFRPTiwgQlNfREVGUFVTSEJVVFRPTiB9LAotICB7ICJFRElUVEVYVCIsIENUTF9FRElULCAodW5zaWduZWQgbG9uZykgLTEgfSwKLSAgeyAiR1JPVVBCT1giLCBDVExfQlVUVE9OLCBCU19HUk9VUEJPWCB9LAotICB7ICJJQ09OIiwgQ1RMX1NUQVRJQywgU1NfSUNPTiB9LAotICB7ICJMSVNUQk9YIiwgQ1RMX0xJU1RCT1gsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJMVEVYVCIsIENUTF9TVEFUSUMsIFNTX0xFRlQgfSwKLSAgeyAiUFVTSEJPWCIsIENUTF9CVVRUT04sIEJTX1BVU0hCT1ggfSwKLSAgeyAiUFVTSEJVVFRPTiIsIENUTF9CVVRUT04sIEJTX1BVU0hCVVRUT04gfSwKLSAgeyAiUkFESU9CVVRUT04iLCBDVExfQlVUVE9OLCBCU19SQURJT0JVVFRPTiB9LAotICB7ICJSVEVYVCIsIENUTF9TVEFUSUMsIFNTX1JJR0hUIH0sCi0gIHsgIlNDUk9MTEJBUiIsIENUTF9TQ1JPTExCQVIsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJTVEFURTMiLCBDVExfQlVUVE9OLCBCU18zU1RBVEUgfSwKLSAgLyogSXQncyBpbXBvcnRhbnQgdGhhdCBVU0VSQlVUVE9OIGNvbWUgYWZ0ZXIgYWxsIHRoZSBvdGhlciBidXR0b24KLSAgICAgdHlwZXMsIHNvIHRoYXQgaXQgd29uJ3QgYmUgbWF0Y2hlZCB0b28gZWFybHkuICAqLwotICB7ICJVU0VSQlVUVE9OIiwgQ1RMX0JVVFRPTiwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBXcml0ZSBhIGRpYWxvZyBjb250cm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2RpYWxvZ19jb250cm9sIChlLCBjb250cm9sKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmNvbnRyb2w7Ci17Ci0gIGNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gKmNpOwotCi0gIGZwcmludGYgKGUsICIgICIpOwotCi0gIGlmIChjb250cm9sLT5jbGFzcy5uYW1lZCkKLSAgICBjaSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGNpID0gY29udHJvbF9pbmZvOyBjaS0+bmFtZSAhPSBOVUxMOyArK2NpKQotCWlmIChjaS0+Y2xhc3MgPT0gY29udHJvbC0+Y2xhc3MudS5pZAotCSAgICAmJiAoY2ktPnN0eWxlID09ICh1bnNpZ25lZCBsb25nKSAtMQotCQl8fCBjaS0+c3R5bGUgPT0gKGNvbnRyb2wtPnN0eWxlICYgMHhmZikpKQotCSAgYnJlYWs7Ci0gICAgfQotICBpZiAoY2kgPT0gTlVMTCkKLSAgICBmcHJpbnRmIChlLCAiQ09OVFJPTCIpOwotICBlbHNlIGlmIChjaS0+bmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKGUsICIlcyIsIGNpLT5uYW1lKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGUsICJDT05UUk9MIik7Ci0gIAotICBpZiAoY29udHJvbC0+dGV4dC5uYW1lZCB8fCBjb250cm9sLT50ZXh0LnUuaWQgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiICIpOwotICAgICAgcmVzX2lkX3ByaW50IChlLCBjb250cm9sLT50ZXh0LCAxKTsKLSAgICAgIGZwcmludGYgKGUsICIsIik7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICIgJWQsICIsIGNvbnRyb2wtPmlkKTsKLQotICBpZiAoY2kgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29udHJvbC0+Y2xhc3MubmFtZWQpCi0JZnByaW50ZiAoZSwgIlwiIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIGNvbnRyb2wtPmNsYXNzLCAwKTsKLSAgICAgIGlmIChjb250cm9sLT5jbGFzcy5uYW1lZCkKLQlmcHJpbnRmIChlLCAiXCIiKTsKLSAgICAgIGZwcmludGYgKGUsICIsIDB4JWx4LCAiLCBjb250cm9sLT5zdHlsZSk7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICIlZCwgJWQiLCBjb250cm9sLT54LCBjb250cm9sLT55KTsKLQotICBpZiAoY29udHJvbC0+c3R5bGUgIT0gU1NfSUNPTgotICAgICAgfHwgY29udHJvbC0+ZXhzdHlsZSAhPSAwCi0gICAgICB8fCBjb250cm9sLT53aWR0aCAhPSAwCi0gICAgICB8fCBjb250cm9sLT5oZWlnaHQgIT0gMAotICAgICAgfHwgY29udHJvbC0+aGVscCAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIsICVkLCAlZCIsIGNvbnRyb2wtPndpZHRoLCBjb250cm9sLT5oZWlnaHQpOwotCi0gICAgICAvKiBGSVhNRTogV2UgZG9uJ3QgbmVlZCB0byBwcmludCB0aGUgc3R5bGUgaWYgaXQgaXMgdGhlIGRlZmF1bHQuCi0JIE1vcmUgaW1wb3J0YW50bHksIGluIGNlcnRhaW4gY2FzZXMgd2UgYWN0dWFsbHkgbmVlZCB0byB0dXJuCi0JIG9mZiBwYXJ0cyBvZiB0aGUgZm9yY2VkIHN0eWxlLCBieSB1c2luZyBOT1QuICAqLwotICAgICAgZnByaW50ZiAoZSwgIiwgMHglbHgiLCBjb250cm9sLT5zdHlsZSk7Ci0KLSAgICAgIGlmIChjb250cm9sLT5leHN0eWxlICE9IDAgfHwgY29udHJvbC0+aGVscCAhPSAwKQotCWZwcmludGYgKGUsICIsIDB4JWx4LCAlbHUiLCBjb250cm9sLT5leHN0eWxlLCBjb250cm9sLT5oZWxwKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0KLSAgaWYgKGNvbnRyb2wtPmRhdGEgIT0gTlVMTCkKLSAgICB3cml0ZV9yY19yY2RhdGEgKGUsIGNvbnRyb2wtPmRhdGEsIDIpOwotfQotCi0vKiBXcml0ZSBvdXQgZm9udCBkaXJlY3RvcnkgZGF0YS4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgYnVpbHQgZnJvbQotICAgdGhlIGZvbnQgZGF0YS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19mb250ZGlyIChlLCBmb250ZGlyKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZm9udGRpciAqZm9udGRpcjsKLXsKLSAgY29uc3Qgc3RydWN0IGZvbnRkaXIgKmZjOwotCi0gIGZvciAoZmMgPSBmb250ZGlyOyBmYyAhPSBOVUxMOyBmYyA9IGZjLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyBGb250IGluZGV4OiAlZFxuIiwgZmMtPmluZGV4KTsKLSAgICAgIHdyaXRlX3JjX2ZpbGVkYXRhIChlLCBmYy0+bGVuZ3RoLCBmYy0+ZGF0YSk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgZ3JvdXAgaWNvbiBkYXRhLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBidWlsdCBmcm9tIHRoZQotICAgaWNvbiBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2dyb3VwX2ljb24gKGUsIGdyb3VwX2ljb24pCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpncm91cF9pY29uOwotewotICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgZm9yIChnaSA9IGdyb3VwX2ljb247IGdpICE9IE5VTEw7IGdpID0gZ2ktPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIHdpZHRoOiAlZDsgaGVpZ2h0ICVkOyBjb2xvcnM6ICVkOyBwbGFuZXMgJWQ7IGJpdHMgJWRcbiIsCi0JICAgICAgIGdpLT53aWR0aCwgZ2ktPmhlaWdodCwgZ2ktPmNvbG9ycywgZ2ktPnBsYW5lcywgZ2ktPmJpdHMpOwotICAgICAgZnByaW50ZiAoZSwgIi8vIGRhdGEgYnl0ZXM6ICVsdTsgaW5kZXg6ICVkXG4iLAotCSAgICAgICBnaS0+Ynl0ZXMsIGdpLT5pbmRleCk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYSBtZW51IHJlc291cmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX21lbnUgKGUsIG1lbnUsIG1lbnVleCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgIGludCBtZW51ZXg7Ci17Ci0gIGlmIChtZW51LT5oZWxwICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIEhlbHAgSUQ6ICVsdVxuIiwgbWVudS0+aGVscCk7Ci0gIHdyaXRlX3JjX21lbnVpdGVtcyAoZSwgbWVudS0+aXRlbXMsIG1lbnVleCwgMCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBtZW51aXRlbXMuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfbWVudWl0ZW1zIChlLCBtZW51aXRlbXMsIG1lbnVleCwgaW5kKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKLSAgICAgaW50IG1lbnVleDsKLSAgICAgaW50IGluZDsKLXsKLSAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBpbmRlbnQgKGUsIGluZCk7Ci0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0KLSAgZm9yIChtaSA9IG1lbnVpdGVtczsgbWkgIT0gTlVMTDsgbWkgPSBtaS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbmRlbnQgKGUsIGluZCArIDIpOwotCi0gICAgICBpZiAobWktPnBvcHVwID09IE5VTEwpCi0JZnByaW50ZiAoZSwgIk1FTlVJVEVNIik7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZSwgIlBPUFVQIik7Ci0KLSAgICAgIGlmICghIG1lbnVleAotCSAgJiYgbWktPnBvcHVwID09IE5VTEwKLQkgICYmIG1pLT50ZXh0ID09IE5VTEwKLQkgICYmIG1pLT50eXBlID09IDAKLQkgICYmIG1pLT5pZCA9PSAwKQotCXsKLQkgIGZwcmludGYgKGUsICIgU0VQQVJBVE9SXG4iKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKG1pLT50ZXh0ID09IE5VTEwpCi0JZnByaW50ZiAoZSwgIiBcIlwiIik7Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAoZSwgIiBcIiIpOwotCSAgdW5pY29kZV9wcmludCAoZSwgbWktPnRleHQsIC0xKTsKLQkgIGZwcmludGYgKGUsICJcIiIpOwotCX0KLQotICAgICAgaWYgKCEgbWVudWV4KQotCXsKLQkgIGlmIChtaS0+cG9wdXAgPT0gTlVMTCkKLQkgICAgZnByaW50ZiAoZSwgIiwgJWQiLCBtaS0+aWQpOwotCi0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fQ0hFQ0tFRCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgQ0hFQ0tFRCIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX0dSQVlFRCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgR1JBWUVEIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fSEVMUCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgSEVMUCIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX0lOQUNUSVZFKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBJTkFDVElWRSIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX01FTlVCQVJCUkVBSykgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgTUVOVUJBUkJSRUFLIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fTUVOVUJSRUFLKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBNRU5VQlJFQUsiKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG1pLT5pZCAhPSAwIHx8IG1pLT50eXBlICE9IDAgfHwgbWktPnN0YXRlICE9IDAgfHwgbWktPmhlbHAgIT0gMCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKGUsICIsICVkIiwgbWktPmlkKTsKLQkgICAgICBpZiAobWktPnR5cGUgIT0gMCB8fCBtaS0+c3RhdGUgIT0gMCB8fCBtaS0+aGVscCAhPSAwKQotCQl7Ci0JCSAgZnByaW50ZiAoZSwgIiwgJWx1IiwgbWktPnR5cGUpOwotCQkgIGlmIChtaS0+c3RhdGUgIT0gMCB8fCBtaS0+aGVscCAhPSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChlLCAiLCAlbHUiLCBtaS0+c3RhdGUpOwotCQkgICAgICBpZiAobWktPmhlbHAgIT0gMCkKLQkJCWZwcmludGYgKGUsICIsICVsdSIsIG1pLT5oZWxwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLQotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCXdyaXRlX3JjX21lbnVpdGVtcyAoZSwgbWktPnBvcHVwLCBtZW51ZXgsIGluZCArIDIpOwotICAgIH0KLQotICBpbmRlbnQgKGUsIGluZCk7Ci0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gcmNkYXRhIHJlc291cmNlLiAgVGhpcyBpcyBhbHNvIHVzZWQgZm9yIG90aGVyIHR5cGVzIG9mCi0gICByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIHByaW50IGFyYml0cmFyeSBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3JjZGF0YSAoZSwgcmNkYXRhLCBpbmQpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhOwotICAgICBpbnQgaW5kOwotewotICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0gIGluZGVudCAoZSwgaW5kKTsKLSAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKLQotICBmb3IgKHJpID0gcmNkYXRhOyByaSAhPSBOVUxMOyByaSA9IHJpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChyaS0+dHlwZSA9PSBSQ0RBVEFfQlVGRkVSICYmIHJpLT51LmJ1ZmZlci5sZW5ndGggPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaW5kZW50IChlLCBpbmQgKyAyKTsKLQotICAgICAgc3dpdGNoIChyaS0+dHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBSQ0RBVEFfV09SRDoKLQkgIGZwcmludGYgKGUsICIlZCIsIHJpLT51LndvcmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9EV09SRDoKLQkgIGZwcmludGYgKGUsICIlbHVMIiwgcmktPnUuZHdvcmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9TVFJJTkc6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQotCSAgICBmcHJpbnRmIChlLCAiXCIiKTsKLQkgICAgcyA9IHJpLT51LnN0cmluZy5zOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgcmktPnUuc3RyaW5nLmxlbmd0aDsgaSsrKQotCSAgICAgIHsKLQkJaWYgKGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSAgcHV0YyAoKnMsIGUpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsICpzKTsKLQkgICAgICB9Ci0JICAgIGZwcmludGYgKGUsICJcIiIpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgUkNEQVRBX1dTVFJJTkc6Ci0JICBmcHJpbnRmIChlLCAiTFwiIik7Ci0JICB1bmljb2RlX3ByaW50IChlLCByaS0+dS53c3RyaW5nLncsIHJpLT51LndzdHJpbmcubGVuZ3RoKTsKLQkgIGZwcmludGYgKGUsICJcIiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9CVUZGRVI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQkgICAgaW50IGZpcnN0OwotCi0JICAgIC8qIEFzc3VtZSBsaXR0bGUgZW5kaWFuIGRhdGEuICAqLwotCi0JICAgIGZpcnN0ID0gMTsKLQkgICAgZm9yIChpID0gMDsgaSArIDMgPCByaS0+dS5idWZmZXIubGVuZ3RoOyBpICs9IDQpCi0JICAgICAgewotCQl1bnNpZ25lZCBsb25nIGw7Ci0KLQkJbCA9ICgoKCgoKHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAzXSA8PCA4KQotCQkJIHwgcmktPnUuYnVmZmVyLmRhdGFbaSArIDJdKSA8PCA4KQotCQkgICAgICAgfCByaS0+dS5idWZmZXIuZGF0YVtpICsgMV0pIDw8IDgpCi0JCSAgICAgfCByaS0+dS5idWZmZXIuZGF0YVtpXSk7Ci0JCWlmIChmaXJzdCkKLQkJICBmaXJzdCA9IDA7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBmcHJpbnRmIChlLCAiLFxuIik7Ci0JCSAgICBpbmRlbnQgKGUsIGluZCArIDIpOwotCQkgIH0KLQkJZnByaW50ZiAoZSwgIiVsdUwiLCBsKTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGkgKyAxIDwgcmktPnUuYnVmZmVyLmxlbmd0aCkKLQkgICAgICB7Ci0JCWludCBpOwotCi0JCWkgPSAocmktPnUuYnVmZmVyLmRhdGFbaSArIDFdIDw8IDgpIHwgcmktPnUuYnVmZmVyLmRhdGFbaV07Ci0JCWlmIChmaXJzdCkKLQkJICBmaXJzdCA9IDA7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBmcHJpbnRmIChlLCAiLFxuIik7Ci0JCSAgICBpbmRlbnQgKGUsIGluZCArIDIpOwotCQkgIH0KLQkJZnByaW50ZiAoZSwgIiVkIiwgaSk7Ci0JCWkgKz0gMjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGkgPCByaS0+dS5idWZmZXIubGVuZ3RoKQotCSAgICAgIHsKLQkJaWYgKGZpcnN0KQotCQkgIGZpcnN0ID0gMDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGZwcmludGYgKGUsICIsXG4iKTsKLQkJICAgIGluZGVudCAoZSwgaW5kICsgMik7Ci0JCSAgfQotCQlpZiAoKHJpLT51LmJ1ZmZlci5kYXRhW2ldICYgMHg3ZikgPT0gcmktPnUuYnVmZmVyLmRhdGFbaV0KLQkJICAgICYmIGlzcHJpbnQgKHJpLT51LmJ1ZmZlci5kYXRhW2ldKSkKLQkJICBmcHJpbnRmIChlLCAiXCIlY1wiIiwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZSwgIlwiXCUwM29cIiIsIHJpLT51LmJ1ZmZlci5kYXRhW2ldKTsKLQkgICAgICB9Ci0KLQkgICAgYnJlYWs7Ci0JICB9Ci0JfQotCi0gICAgICBpZiAocmktPm5leHQgIT0gTlVMTCkKLQlmcHJpbnRmIChlLCAiLCIpOwotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgfQotCi0gIGluZGVudCAoZSwgaW5kKTsKLSAgZnByaW50ZiAoZSwgIkVORFxuIik7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cmluZ3RhYmxlIHJlc291cmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3N0cmluZ3RhYmxlIChlLCBuYW1lLCBzdHJpbmd0YWJsZSkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHN0cmluZ3RhYmxlICpzdHJpbmd0YWJsZTsKLXsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gIGludCBpOwotCi0gIGlmIChuYW1lICE9IE5VTEwgJiYgISBuYW1lLT5uYW1lZCkKLSAgICBvZmZzZXQgPSAobmFtZS0+dS5pZCAtIDEpIDw8IDQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gJXMgc3RyaW5nIHRhYmxlIG5hbWVcbiIsCi0JICAgICAgIG5hbWUgPT0gTlVMTCA/ICJNaXNzaW5nIiA6ICJJbnZhbGlkIik7Ci0gICAgICBvZmZzZXQgPSAwOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5sZW5ndGggIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChlLCAiICAlbHUsIFwiIiwgb2Zmc2V0ICsgaSk7Ci0JICB1bmljb2RlX3ByaW50IChlLCBzdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5zdHJpbmcsCi0JCQkgc3RyaW5ndGFibGUtPnN0cmluZ3NbaV0ubGVuZ3RoKTsKLQkgIGZwcmludGYgKGUsICJcIlxuIik7Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGEgdmVyc2lvbmluZm8gcmVzb3VyY2UuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfdmVyc2lvbmluZm8gKGUsIHZlcnNpb25pbmZvKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmY7Ci0gIGNvbnN0IHN0cnVjdCB2ZXJfaW5mbyAqdmk7Ci0KLSAgZiA9IHZlcnNpb25pbmZvLT5maXhlZDsKLSAgaWYgKGYtPmZpbGVfdmVyc2lvbl9tcyAhPSAwIHx8IGYtPmZpbGVfdmVyc2lvbl9scyAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRVZFUlNJT04gJWx1LCAlbHUsICVsdSwgJWx1XG4iLAotCSAgICAgKGYtPmZpbGVfdmVyc2lvbl9tcyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5maWxlX3ZlcnNpb25fbXMgJiAweGZmZmYsCi0JICAgICAoZi0+ZmlsZV92ZXJzaW9uX2xzID4+IDE2KSAmIDB4ZmZmZiwKLQkgICAgIGYtPmZpbGVfdmVyc2lvbl9scyAmIDB4ZmZmZik7Ci0gIGlmIChmLT5wcm9kdWN0X3ZlcnNpb25fbXMgIT0gMCB8fCBmLT5wcm9kdWN0X3ZlcnNpb25fbHMgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIFBST0RVQ1RWRVJTSU9OICVsdSwgJWx1LCAlbHUsICVsdVxuIiwKLQkgICAgIChmLT5wcm9kdWN0X3ZlcnNpb25fbXMgPj4gMTYpICYgMHhmZmZmLAotCSAgICAgZi0+cHJvZHVjdF92ZXJzaW9uX21zICYgMHhmZmZmLAotCSAgICAgKGYtPnByb2R1Y3RfdmVyc2lvbl9scyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5wcm9kdWN0X3ZlcnNpb25fbHMgJiAweGZmZmYpOwotICBpZiAoZi0+ZmlsZV9mbGFnc19tYXNrICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFRkxBR1NNQVNLIDB4JWx4XG4iLCBmLT5maWxlX2ZsYWdzX21hc2spOwotICBpZiAoZi0+ZmlsZV9mbGFncyAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRUZMQUdTIDB4JWx4XG4iLCBmLT5maWxlX2ZsYWdzKTsKLSAgaWYgKGYtPmZpbGVfb3MgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVPUyAweCVseFxuIiwgZi0+ZmlsZV9vcyk7Ci0gIGlmIChmLT5maWxlX3R5cGUgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVUWVBFIDB4JWx4XG4iLCBmLT5maWxlX3R5cGUpOwotICBpZiAoZi0+ZmlsZV9zdWJ0eXBlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFU1VCVFlQRSAweCVseFxuIiwgZi0+ZmlsZV9zdWJ0eXBlKTsKLSAgaWYgKGYtPmZpbGVfZGF0ZV9tcyAhPSAwIHx8IGYtPmZpbGVfZGF0ZV9scyAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBEYXRlOiAlbHUsICVsdVxuIiwgZi0+ZmlsZV9kYXRlX21zLCBmLT5maWxlX2RhdGVfbHMpOwotCi0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0KLSAgZm9yICh2aSA9IHZlcnNpb25pbmZvLT52YXI7IHZpICE9IE5VTEw7IHZpID0gdmktPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoICh2aS0+dHlwZSkKLQl7Ci0JY2FzZSBWRVJJTkZPX1NUUklORzoKLQkgIHsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2czsKLQotCSAgICBmcHJpbnRmIChlLCAiICBCTE9DSyBcIlN0cmluZ0ZpbGVJbmZvXCJcbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICBCRUdJTlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgICAgQkxPQ0sgXCIiKTsKLQkgICAgdW5pY29kZV9wcmludCAoZSwgdmktPnUuc3RyaW5nLmxhbmd1YWdlLCAtMSk7Ci0JICAgIGZwcmludGYgKGUsICJcIlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgICAgQkVHSU5cbiIpOwotCi0JICAgIGZvciAodnMgPSB2aS0+dS5zdHJpbmcuc3RyaW5nczsgdnMgIT0gTlVMTDsgdnMgPSB2cy0+bmV4dCkKLQkgICAgICB7Ci0JCWZwcmludGYgKGUsICIgICAgICBWQUxVRSBcIiIpOwotCQl1bmljb2RlX3ByaW50IChlLCB2cy0+a2V5LCAtMSk7Ci0JCWZwcmludGYgKGUsICJcIiwgXCIiKTsKLQkJdW5pY29kZV9wcmludCAoZSwgdnMtPnZhbHVlLCAtMSk7Ci0JCWZwcmludGYgKGUsICJcIlxuIik7Ci0JICAgICAgfQotCi0JICAgIGZwcmludGYgKGUsICIgICAgRU5EXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgRU5EXG4iKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIFZFUklORk9fVkFSOgotCSAgewotCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2OwotCi0JICAgIGZwcmludGYgKGUsICIgIEJMT0NLIFwiVmFyRmlsZUluZm9cIlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgIEJFR0lOXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgICBWQUxVRSBcIiIpOwotCSAgICB1bmljb2RlX3ByaW50IChlLCB2aS0+dS52YXIua2V5LCAtMSk7Ci0JICAgIGZwcmludGYgKGUsICJcIiIpOwotCi0JICAgIGZvciAodnYgPSB2aS0+dS52YXIudmFyOyB2diAhPSBOVUxMOyB2diA9IHZ2LT5uZXh0KQotCSAgICAgIGZwcmludGYgKGUsICIsIDB4JXgsICVkIiwgKHVuc2lnbmVkIGludCkgdnYtPmxhbmd1YWdlLAotCQkgICAgICAgdnYtPmNoYXJzZXQpOwotCi0JICAgIGZwcmludGYgKGUsICJcbiAgRU5EXG4iKTsKLQotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgZGF0YSB3aGljaCB3b3VsZCBub3JtYWxseSBiZSByZWFkIGZyb20gYSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2ZpbGVkYXRhIChlLCBsZW5ndGgsIGRhdGEpCi0gICAgIEZJTEUgKmU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotewotICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgZm9yIChpID0gMDsgaSArIDE1IDwgbGVuZ3RoOyBpICs9IDE2KQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyAlNGx4OiAiLCBpKTsKLSAgICAgIGZwcmludGYgKGUsICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIiwKLQkgICAgICAgZGF0YVtpICsgMF0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSwgZGF0YVtpICsgM10sCi0JICAgICAgIGRhdGFbaSArIDRdLCBkYXRhW2kgKyA1XSwgZGF0YVtpICsgNl0sIGRhdGFbaSArIDddKTsKLSAgICAgIGZwcmludGYgKGUsICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JICAgICAgIGRhdGFbaSArICA4XSwgZGF0YVtpICsgIDldLCBkYXRhW2kgKyAxMF0sIGRhdGFbaSArIDExXSwKLQkgICAgICAgZGF0YVtpICsgMTJdLCBkYXRhW2kgKyAxM10sIGRhdGFbaSArIDE0XSwgZGF0YVtpICsgMTVdKTsKLSAgICB9Ci0KLSAgaWYgKGkgPCBsZW5ndGgpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vICU0bHg6IiwgaSk7Ci0gICAgICB3aGlsZSAoaSA8IGxlbmd0aCkKLQl7Ci0JICBmcHJpbnRmIChlLCAiICUwMngiLCBkYXRhW2ldKTsKLQkgICsraTsKLQl9Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZXNyZXMuYyBiL2JpbnV0aWxzL3Jlc3Jlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTI2NGY0Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Jlc3Jlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qIHJlc3Jlcy5jOiByZWFkX3Jlc19maWxlIGFuZCB3cml0ZV9yZXNfZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3Igd2luZHJlcy4KLQotICAgQ29weXJpZ2h0IDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEFuZGVycyBOb3JsYW5kZXIgPGFub3JsYW5kQGhlbTIucGFzc2FnZW4uc2U+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1zdHJ1Y3QgcmVzX2hkcgotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBkYXRhX3NpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBoZWFkZXJfc2l6ZTsKLSAgfTsKLQotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2RpcmVjdG9yeQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGludCAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19yZXNvdXJjZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19pZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19pbmZvIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2RhdGEgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2hlYWRlcgotICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICopKTsKLQotc3RhdGljIGludCByZWFkX3Jlc291cmNlX2VudHJ5IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHJlYWRfcmVzX2RhdGEgUEFSQU1TICgodm9pZCAqLCBzaXplX3QsIGludCkpOwotc3RhdGljIHZvaWQgcmVhZF9yZXNfaWQgUEFSQU1TICgoc3RydWN0IHJlc19pZCAqKSk7Ci1zdGF0aWMgdW5pY2hhciAqcmVhZF91bmlzdHJpbmcgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyB2b2lkIHNraXBfbnVsbF9yZXNvdXJjZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9pZF9zaXplIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfaWQgKikpOwotc3RhdGljIHZvaWQgcmVzX2FsaWduX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotICByZXNfYWRkX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50LCBpbnQpKTsKLQotdm9pZAotICByZXNfYXBwZW5kX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqLCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosCi0JICAgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOwotCi1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlcyA9IE5VTEw7Ci0KLXN0YXRpYyBGSUxFICpmcmVzOwotc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBSZWFkIHJlc291cmNlIGZpbGUgKi8KLXN0cnVjdCByZXNfZGlyZWN0b3J5ICoKLXJlYWRfcmVzX2ZpbGUgKGZuKQotICAgICBjb25zdCBjaGFyICpmbjsKLXsKLSAgZmlsZW5hbWUgPSBmbjsKLSAgZnJlcyA9IGZvcGVuIChmaWxlbmFtZSwgInJiIik7Ci0gIGlmIChmcmVzID09IE5VTEwpCi0gICAgZmF0YWwgKCJjYW4ndCBvcGVuIGAlcycgZm9yIG91dHB1dDogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgc2tpcF9udWxsX3Jlc291cmNlICgpOwotCi0gIHdoaWxlIChyZWFkX3Jlc291cmNlX2VudHJ5ICgpKQotICAgIDsKLQotICBmY2xvc2UgKGZyZXMpOwotCi0gIHJldHVybiByZXNvdXJjZXM7Ci19Ci0KLS8qIFdyaXRlIHJlc291cmNlIGZpbGUgKi8KLXZvaWQKLXdyaXRlX3Jlc19maWxlIChmbiwgcmVzZGlyKQotICAgICBjb25zdCBjaGFyICpmbjsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLXsKLSAgaW50IGxhbmd1YWdlOwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaWduW10gPQotICB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gIGxvbmcgZnBvczsKLQotICBmaWxlbmFtZSA9IGZuOwotCi0gIGZyZXMgPSBmb3BlbiAoZmlsZW5hbWUsICJ3YiIpOwotICBpZiAoZnJlcyA9PSBOVUxMKQotICAgIGZhdGFsICgiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIC8qIFdyaXRlIDMyIGJpdCByZXNvdXJjZSBzaWduYXR1cmUgKi8KLSAgd3JpdGVfcmVzX2RhdGEgKHNpZ24sIHNpemVvZiAoc2lnbiksIDEpOwotCi0gIC8qIHdyaXRlIHJlc291cmNlcyAqLwotCi0gIGxhbmd1YWdlID0gLTE7Ci0gIHdyaXRlX3Jlc19kaXJlY3RvcnkgKHJlc2RpciwgKGNvbnN0IHN0cnVjdCByZXNfaWQgKikgTlVMTCwKLQkJICAgICAgIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsICZsYW5ndWFnZSwgMSk7Ci0KLSAgLyogZW5kIGZpbGUgb24gRFdPUkQgYm91bmRhcnkgKi8KLSAgZnBvcyA9IGZ0ZWxsIChmcmVzKTsKLSAgaWYgKGZwb3MgJSA0KQotICAgIHdyaXRlX3Jlc19kYXRhIChzaWduLCBmcG9zICUgNCwgMSk7Ci0KLSAgZmNsb3NlIChmcmVzKTsKLX0KLQotLyogUmVhZCBhIHJlc291cmNlIGVudHJ5LCByZXR1cm5zIDAgd2hlbiBhbGwgcmVzb3VyY2VzIGFyZSByZWFkICovCi1zdGF0aWMgaW50Ci1yZWFkX3Jlc291cmNlX2VudHJ5ICh2b2lkKQotewotICBzdHJ1Y3QgcmVzX2lkIHR5cGU7Ci0gIHN0cnVjdCByZXNfaWQgbmFtZTsKLSAgc3RydWN0IHJlc19yZXNfaW5mbyByZXNpbmZvOwotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHI7Ci0gIGxvbmcgdmVyc2lvbjsKLSAgdm9pZCAqYnVmZjsKLQotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIC8qIFJlYWQgaGVhZGVyICovCi0gIGlmIChmcmVhZCAoJnJlc2hkciwgc2l6ZW9mIChyZXNoZHIpLCAxLCBmcmVzKSAhPSAxKQotICAgIHJldHVybiAwOwotCi0gIC8qIHJlYWQgcmVzb3VyY2UgdHlwZSAqLwotICByZWFkX3Jlc19pZCAoJnR5cGUpOwotICAvKiByZWFkIHJlc291cmNlIGlkICovCi0gIHJlYWRfcmVzX2lkICgmbmFtZSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0KLSAgLyogUmVhZCBhZGRpdGlvbmFsIHJlc291cmNlIGhlYWRlciAqLwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby52ZXJzaW9uLCBzaXplb2YgKHJlc2luZm8udmVyc2lvbiksIDEpOwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5tZW1mbGFncywgc2l6ZW9mIChyZXNpbmZvLm1lbWZsYWdzKSwgMSk7Ci0gIHJlYWRfcmVzX2RhdGEgKCZyZXNpbmZvLmxhbmd1YWdlLCBzaXplb2YgKHJlc2luZm8ubGFuZ3VhZ2UpLCAxKTsKLSAgcmVhZF9yZXNfZGF0YSAoJnZlcnNpb24sIHNpemVvZiAodmVyc2lvbiksIDEpOwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5jaGFyYWN0ZXJpc3RpY3MsIHNpemVvZiAocmVzaW5mby5jaGFyYWN0ZXJpc3RpY3MpLCAxKTsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLQotICAvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIGRhdGEgKi8KLSAgYnVmZiA9IHJlc19hbGxvYyAocmVzaGRyLmRhdGFfc2l6ZSk7Ci0gIC8qIFJlYWQgZGF0YSAqLwotICByZWFkX3Jlc19kYXRhIChidWZmLCByZXNoZHIuZGF0YV9zaXplLCAxKTsKLSAgLyogQ29udmVydCBiaW5hcnkgZGF0YSB0byByZXNvdXJjZSAqLwotICByID0gYmluX3RvX3JlcyAodHlwZSwgYnVmZiwgcmVzaGRyLmRhdGFfc2l6ZSwgMCk7Ci0gIHItPnJlc19pbmZvID0gcmVzaW5mbzsKLSAgLyogQWRkIHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeSAqLwotICByZXNfYWRkX3Jlc291cmNlIChyLCAmdHlwZSwgJm5hbWUsIHJlc2luZm8ubGFuZ3VhZ2UsIDApOwotCi0gIHJldHVybiAxOwotfQotCi0vKiB3cml0ZSByZXNvdXJjZSBkaXJlY3RvcnkgdG8gYmluYXJ5IHJlc291cmNlIGZpbGUgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfZGlyZWN0b3J5IChyZCwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci0gICAgIGludCBsZXZlbDsKLXsKLSAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0KLSAgZm9yIChyZSA9IHJkLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAobGV2ZWwpCi0JewotCWNhc2UgMToKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDEsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUKLQkgICAgIHR5cGUuICBUaGlzIG5vcm1hbGx5IGR1cGxpY2F0ZXMgdGhlIGluZm9ybWF0aW9uIHdlIGhhdmUKLQkgICAgIHN0b3JlZCB3aXRoIHRoZSByZXNvdXJjZSBpdHNlbGYsIGJ1dCB3ZSBuZWVkIHRvIHJlbWVtYmVyCi0JICAgICB0aGUgdHlwZSBpZiB0aGlzIGlzIGEgdXNlciBkZWZpbmUgcmVzb3VyY2UgdHlwZS4gICovCi0JICB0eXBlID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAyOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMiwgdGhlIGtleSBvZiB0aGlzIHJlc291cmNlIGlzIHRoZSBuYW1lCi0JICAgICB3ZSBhcmUgZ29pbmcgdG8gdXNlIGluIHRoZSByYyBwcmludG91dC4gKi8KLQkgIG5hbWUgPSAmcmUtPmlkOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAzLCB0aGVuIHRoaXMga2V5IHJlcHJlc2VudHMgYSBsYW5ndWFnZS4KLQkgICAgIFVzZSBpdCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLwotCSAgaWYgKCFyZS0+aWQubmFtZWQKLQkgICAgICAmJiByZS0+aWQudS5pZCAhPSAqbGFuZ3VhZ2UKLQkgICAgICAmJiAocmUtPmlkLnUuaWQgJiAweGZmZmYpID09IHJlLT5pZC51LmlkKQotCSAgICB7Ci0JICAgICAgKmxhbmd1YWdlID0gcmUtPmlkLnUuaWQ7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJlLT5zdWJkaXIpCi0Jd3JpdGVfcmVzX2RpcmVjdG9yeSAocmUtPnUuZGlyLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwgbGV2ZWwgKyAxKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobGV2ZWwgPT0gMykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlOiB0aGUgdGhyZWUgbGV2ZWxzIGFyZQotCSAgICAgICAgIFRZUEUvTkFNRS9MQU5HVUFHRS4gIE5BTUUgd2lsbCBoYXZlIGJlZW4gc2V0IGF0IGxldmVsCi0JICAgICAgICAgMiwgYW5kIHJlcHJlc2VudHMgdGhlIG5hbWUgdG8gdXNlLiAgV2UgcHJvYmFibHkganVzdAotCSAgICAgICAgIHNldCBMQU5HVUFHRSwgYW5kIGl0IHdpbGwgcHJvYmFibHkgbWF0Y2ggd2hhdCB0aGUKLQkgICAgICAgICByZXNvdXJjZSBpdHNlbGYgcmVjb3JkcyBpZiBhbnl0aGluZy4gICovCi0JICAgICAgd3JpdGVfcmVzX3Jlc291cmNlICh0eXBlLCBuYW1lLCByZS0+dS5yZXMsIGxhbmd1YWdlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLy8gUmVzb3VyY2UgYXQgdW5leHBlY3RlZCBsZXZlbCAlZFxuIiwgbGV2ZWwpOwotCSAgICAgIHdyaXRlX3Jlc19yZXNvdXJjZSAodHlwZSwgKHN0cnVjdCByZXNfaWQgKikgTlVMTCwgcmUtPnUucmVzLAotCQkJCSAgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JfQotICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX3Jlc291cmNlICh0eXBlLCBuYW1lLCByZXMsIGxhbmd1YWdlKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci17Ci0gIGludCBydDsKLQotICBzd2l0Y2ggKHJlcy0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHJ0ID0gUlRfQUNDRUxFUkFUT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQklUTUFQOgotICAgICAgcnQgPSBSVF9CSVRNQVA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgotICAgICAgcnQgPSBSVF9DVVJTT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfQ1VSU09SOgotICAgICAgcnQgPSBSVF9HUk9VUF9DVVJTT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgotICAgICAgcnQgPSBSVF9ESUFMT0c7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVDoKLSAgICAgIHJ0ID0gUlRfRk9OVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9GT05URElSOgotICAgICAgcnQgPSBSVF9GT05URElSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0lDT046Ci0gICAgICBydCA9IFJUX0lDT047Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfSUNPTjoKLSAgICAgIHJ0ID0gUlRfR1JPVVBfSUNPTjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9NRU5VOgotICAgICAgcnQgPSBSVF9NRU5VOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHJ0ID0gUlRfTUVTU0FHRVRBQkxFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKLSAgICAgIHJ0ID0gUlRfUkNEQVRBOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotICAgICAgcnQgPSBSVF9TVFJJTkc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICBydCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICBydCA9IFJUX1ZFUlNJT047Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJ0ICE9IDAKLSAgICAgICYmIHR5cGUgIT0gTlVMTAotICAgICAgJiYgKHR5cGUtPm5hbWVkIHx8IHR5cGUtPnUuaWQgIT0gcnQpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIi8vIFVuZXhwZWN0ZWQgcmVzb3VyY2UgdHlwZSBtaXNtYXRjaDogIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKHN0ZGVyciwgKnR5cGUsIDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICE9ICVkIiwgcnQpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHdyaXRlX3Jlc19iaW4gKHJlcywgdHlwZSwgbmFtZSwgJnJlcy0+cmVzX2luZm8pOwotICByZXR1cm47Ci19Ci0KLS8qIFdyaXRlIGEgcmVzb3VyY2UgaW4gYmluYXJ5IHJlc291cmNlIGZvcm1hdCAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19iaW4gKHJlcywgdHlwZSwgbmFtZSwgcmVzaW5mbykKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotewotICB1bnNpZ25lZCBsb25nIGRhdGFzaXplID0gMDsKLSAgY29uc3Qgc3RydWN0IGJpbmRhdGEgKmJpbl9yZXAsICpkYXRhOwotCi0gIGJpbl9yZXAgPSByZXNfdG9fYmluIChyZXMsIDApOwotICBmb3IgKGRhdGEgPSBiaW5fcmVwOyBkYXRhICE9IE5VTEw7IGRhdGEgPSBkYXRhLT5uZXh0KQotICAgIGRhdGFzaXplICs9IGRhdGEtPmxlbmd0aDsKLQotICB3cml0ZV9yZXNfaGVhZGVyIChkYXRhc2l6ZSwgdHlwZSwgbmFtZSwgcmVzaW5mbyk7Ci0KLSAgZm9yIChkYXRhID0gYmluX3JlcDsgZGF0YSAhPSBOVUxMOyBkYXRhID0gZGF0YS0+bmV4dCkKLSAgICB3cml0ZV9yZXNfZGF0YSAoZGF0YS0+ZGF0YSwgZGF0YS0+bGVuZ3RoLCAxKTsKLX0KLQotLyogR2V0IG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gc3RvcmUgYW4gaWQgaW4gYmluYXJ5IGZvcm1hdCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldF9pZF9zaXplIChpZCkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWQ7Ci17Ci0gIGlmIChpZC0+bmFtZWQpCi0gICAgcmV0dXJuIHNpemVvZiAodW5pY2hhcikgKiAoaWQtPnUubi5sZW5ndGggKyAxKTsKLSAgZWxzZQotICAgIHJldHVybiBzaXplb2YgKHVuaWNoYXIpICogMjsKLX0KLQotLyogV3JpdGUgYSByZXNvdXJjZSBoZWFkZXIgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfaGVhZGVyIChkYXRhc2l6ZSwgdHlwZSwgbmFtZSwgcmVzaW5mbykKLSAgICAgdW5zaWduZWQgbG9uZyBkYXRhc2l6ZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLXsKLSAgc3RydWN0IHJlc19oZHIgcmVzaGRyOwotICByZXNoZHIuZGF0YV9zaXplID0gZGF0YXNpemU7Ci0gIHJlc2hkci5oZWFkZXJfc2l6ZSA9IDI0ICsgZ2V0X2lkX3NpemUgKHR5cGUpICsgZ2V0X2lkX3NpemUgKG5hbWUpOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotICB3cml0ZV9yZXNfZGF0YSAoJnJlc2hkciwgc2l6ZW9mIChyZXNoZHIpLCAxKTsKLSAgd3JpdGVfcmVzX2lkICh0eXBlKTsKLSAgd3JpdGVfcmVzX2lkIChuYW1lKTsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLQotICB3cml0ZV9yZXNfaW5mbyAocmVzaW5mbyk7Ci0gIHJlc19hbGlnbl9maWxlICgpOwotfQotCi0KLS8qIFdyaXRlIGRhdGEgdG8gZmlsZSwgYWJvcnQgb24gZmFpbHVyZSAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19kYXRhIChkYXRhLCBzaXplLCBjb3VudCkKLSAgICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaWYgKGZ3cml0ZSAoZGF0YSwgc2l6ZSwgY291bnQsIGZyZXMpICE9IGNvdW50KQotICAgIGZhdGFsICgiJXM6ICVzOiBjb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOwotfQotCi0vKiBSZWFkIGRhdGEgZnJvbSBmaWxlLCBhYm9ydCBvbiBmYWlsdXJlICovCi1zdGF0aWMgdm9pZAotcmVhZF9yZXNfZGF0YSAoZGF0YSwgc2l6ZSwgY291bnQpCi0gICAgIHZvaWQgKmRhdGE7Ci0gICAgIHNpemVfdCBzaXplOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGlmIChmcmVhZCAoZGF0YSwgc2l6ZSwgY291bnQsIGZyZXMpICE9IGNvdW50KQotICAgIGZhdGFsICgiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIiwgcHJvZ3JhbV9uYW1lLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFdyaXRlIGEgcmVzb3VyY2UgaWQgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfaWQgKGlkKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZDsKLXsKLSAgaWYgKGlkLT5uYW1lZCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbiA9IGlkLT51Lm4ubGVuZ3RoOwotICAgICAgdW5pY2hhciBudWxsX3Rlcm0gPSAwOwotICAgICAgd3JpdGVfcmVzX2RhdGEgKGlkLT51Lm4ubmFtZSwgbGVuICogc2l6ZW9mICh1bmljaGFyKSwgMSk7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoJm51bGxfdGVybSwgc2l6ZW9mIChudWxsX3Rlcm0pLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBpID0gMHhGRkZGOwotICAgICAgd3JpdGVfcmVzX2RhdGEgKCZpLCBzaXplb2YgKGkpLCAxKTsKLSAgICAgIGkgPSBpZC0+dS5pZDsKLSAgICAgIHdyaXRlX3Jlc19kYXRhICgmaSwgc2l6ZW9mIChpKSwgMSk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSByZXNvdXJjZSBpbmZvICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2luZm8gKGluZm8pCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKmluZm87Ci17Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+dmVyc2lvbiwgc2l6ZW9mIChpbmZvLT52ZXJzaW9uKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+bWVtZmxhZ3MsIHNpemVvZiAoaW5mby0+bWVtZmxhZ3MpLCAxKTsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT5sYW5ndWFnZSwgc2l6ZW9mIChpbmZvLT5sYW5ndWFnZSksIDEpOwotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPnZlcnNpb24sIHNpemVvZiAoaW5mby0+dmVyc2lvbiksIDEpOwotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPmNoYXJhY3RlcmlzdGljcywgc2l6ZW9mIChpbmZvLT5jaGFyYWN0ZXJpc3RpY3MpLCAxKTsKLX0KLQotLyogcmVhZCBhIHJlc291cmNlIGlkZW50aWZpZXIgKi8KLXZvaWQgCi1yZWFkX3Jlc19pZCAoaWQpCi0gICAgIHN0cnVjdCByZXNfaWQgKmlkOwotewotICB1bnNpZ25lZCBzaG9ydCBvcmQ7Ci0gIHVuaWNoYXIgKmlkX3MgPSBOVUxMOwotICBpbnQgbGVuOwotCi0gIHJlYWRfcmVzX2RhdGEgKCZvcmQsIHNpemVvZiAob3JkKSwgMSk7Ci0gIGlmIChvcmQgPT0gMHhGRkZGKQkJLyogYW4gb3JkaW5hbCBpZCAqLwotICAgIHsKLSAgICAgIHJlYWRfcmVzX2RhdGEgKCZvcmQsIHNpemVvZiAob3JkKSwgMSk7Ci0gICAgICBpZC0+bmFtZWQgPSAwOwotICAgICAgaWQtPnUuaWQgPSBvcmQ7Ci0gICAgfQotICBlbHNlCi0gICAgLyogbmFtZWQgaWQgKi8KLSAgICB7Ci0gICAgICBpZiAoZnNlZWsgKGZyZXMsIC1zaXplb2YgKG9yZCksIFNFRUtfQ1VSKSAhPSAwKQotCWZhdGFsICgiJXM6ICVzOiBjb3VsZCBub3Qgc2VlayBpbiBmaWxlIiwgcHJvZ3JhbV9uYW1lLCBmaWxlbmFtZSk7Ci0gICAgICBpZF9zID0gcmVhZF91bmlzdHJpbmcgKCZsZW4pOwotICAgICAgaWQtPm5hbWVkID0gMTsKLSAgICAgIGlkLT51Lm4ubGVuZ3RoID0gbGVuOwotICAgICAgaWQtPnUubi5uYW1lID0gaWRfczsKLSAgICB9Ci19Ci0KLS8qIFJlYWQgYSBudWxsIHRlcm1pbmF0ZWQgVU5JQ09ERSBzdHJpbmcgKi8KLXN0YXRpYyB1bmljaGFyICoKLXJlYWRfdW5pc3RyaW5nIChsZW4pCi0gICAgIGludCAqbGVuOwotewotICB1bmljaGFyICpzOwotICB1bmljaGFyIGM7Ci0gIHVuaWNoYXIgKnA7Ci0gIGludCBsOwotCi0gICpsZW4gPSAwOwotICBsID0gMDsKLQotICAvKiB0aGVyZSBhcmUgaGFyZGx5IGFueSBuYW1lcyBsb25nZXIgdGhhbiAyNTYgY2hhcmFjdGVycyAqLwotICBwID0gcyA9ICh1bmljaGFyICopIHhtYWxsb2MgKHNpemVvZiAodW5pY2hhcikgKiAyNTYpOwotICBkbwotICAgIHsKLSAgICAgIHJlYWRfcmVzX2RhdGEgKCZjLCBzaXplb2YgKGMpLCAxKTsKLSAgICAgICpwKysgPSBjOwotICAgICAgaWYgKGMgIT0gMCkKLQlsKys7Ci0gICAgfQotICB3aGlsZSAoYyAhPSAwKTsKLSAgKmxlbiA9IGw7Ci0gIHJldHVybiBzOwotfQotCi0vKiBhbGlnbiBmaWxlIG9uIERXT1JEIGJvdW5kYXJ5ICovCi1zdGF0aWMgdm9pZAotcmVzX2FsaWduX2ZpbGUgKHZvaWQpCi17Ci0gIGlmIChmc2VlayAoZnJlcywgZnRlbGwgKGZyZXMpICUgNCwgU0VFS19DVVIpICE9IDApCi0gICAgZmF0YWwgKCIlczogJXM6IHVuYWJsZSB0byBhbGlnbiBmaWxlIiwgcHJvZ3JhbV9uYW1lLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIENoZWNrIGlmIGZpbGUgaXMgYSB3aW4zMiBiaW5hcnkgcmVzb3VyY2UgZmlsZSwgaWYgc28KLSAgIHNraXAgcGFzdCB0aGUgbnVsbCByZXNvdXJjZS4gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIC0xIG9uCi0gICBlcnJvci4KLSAqLwotc3RhdGljIHZvaWQKLXNraXBfbnVsbF9yZXNvdXJjZSAodm9pZCkKLXsKLSAgc3RydWN0IHJlc19oZHIgcmVzaGRyID0KLSAgezAsIDB9OwotICByZWFkX3Jlc19kYXRhICgmcmVzaGRyLCBzaXplb2YgKHJlc2hkciksIDEpOwotICBpZiAoKHJlc2hkci5kYXRhX3NpemUgIT0gMCkgfHwgKHJlc2hkci5oZWFkZXJfc2l6ZSAhPSAweDIwKSkKLSAgICBnb3RvIHNraXBfZXJyOwotCi0gIC8qIFN1YnRyYWN0IHNpemUgb2YgSGVhZGVyU2l6ZSBhbmQgRGF0YVNpemUgKi8KLSAgaWYgKGZzZWVrIChmcmVzLCByZXNoZHIuaGVhZGVyX3NpemUgLSA4LCBTRUVLX0NVUikgIT0gMCkKLSAgICBnb3RvIHNraXBfZXJyOwotCi0gIHJldHVybjsKLQotc2tpcF9lcnI6Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogTm90IGEgdmFsaWQgV0lOMzIgcmVzb3VyY2UgZmlsZVxuIiwgcHJvZ3JhbV9uYW1lLAotCSAgIGZpbGVuYW1lKTsKLSAgeGV4aXQgKDEpOwotfQotCi0vKiBBZGQgYSByZXNvdXJjZSB0byByZXNvdXJjZSBkaXJlY3RvcnkgKi8KLXZvaWQKLXJlc19hZGRfcmVzb3VyY2UgKHIsIHR5cGUsIGlkLCBsYW5ndWFnZSwgZHVwb2spCi0gICAgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkOwotICAgICBpbnQgbGFuZ3VhZ2U7Ci0gICAgIGludCBkdXBvazsKLXsKLSAgc3RydWN0IHJlc19pZCBhWzNdOwotCi0gIGFbMF0gPSAqdHlwZTsKLSAgYVsxXSA9ICppZDsKLSAgYVsyXS5uYW1lZCA9IDA7Ci0gIGFbMl0udS5pZCA9IGxhbmd1YWdlOwotICByZXNfYXBwZW5kX3Jlc291cmNlICgmcmVzb3VyY2VzLCByLCAzLCBhLCBkdXBvayk7Ci19Ci0KLS8qIEFwcGVuZCBhIHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeS4KLSAgIFRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBkZWZpbmVfcmVzb3VyY2UKLSAgIGFuZCBtb2RpZmllZCB0byBhZGQgYW4gZXhpc3RpbmcgcmVzb3VyY2UuCi0gKi8KLXZvaWQKLXJlc19hcHBlbmRfcmVzb3VyY2UgKHJlc291cmNlcywgcmVzb3VyY2UsIGNpZHMsIGlkcywgZHVwb2spCi0gICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqcmVzb3VyY2VzOwotICAgICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXNvdXJjZTsKLSAgICAgaW50IGNpZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkczsKLSAgICAgaW50IGR1cG9rOwotewotICBzdHJ1Y3QgcmVzX2VudHJ5ICpyZSA9IE5VTEw7Ci0gIGludCBpOwotCi0gIGFzc2VydCAoY2lkcyA+IDApOwotICBmb3IgKGkgPSAwOyBpIDwgY2lkczsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCByZXNfZW50cnkgKipwcDsKLQotICAgICAgaWYgKCpyZXNvdXJjZXMgPT0gTlVMTCkKLQl7Ci0JICBzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1ldmFsOwotCi0JICAvKiBVc2UgdGhlIHNhbWUgdGltZXN0YW1wIGZvciBldmVyeSByZXNvdXJjZSBjcmVhdGVkIGluIGEKLQkgICAgIHNpbmdsZSBydW4uICAqLwotCSAgaWYgKHRpbWV2YWwgPT0gMCkKLQkgICAgdGltZXZhbCA9IHRpbWUgKE5VTEwpOwotCi0JICAqcmVzb3VyY2VzID0gKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKQotCQkJcmVzX2FsbG9jIChzaXplb2YgKipyZXNvdXJjZXMpKTsKLQkgICgqcmVzb3VyY2VzKS0+Y2hhcmFjdGVyaXN0aWNzID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+dGltZSA9IHRpbWV2YWw7Ci0JICAoKnJlc291cmNlcyktPm1ham9yID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+bWlub3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5lbnRyaWVzID0gTlVMTDsKLQl9Ci0KLSAgICAgIGZvciAocHAgPSAmKCpyZXNvdXJjZXMpLT5lbnRyaWVzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JaWYgKHJlc19pZF9jbXAgKCgqcHApLT5pZCwgaWRzW2ldKSA9PSAwKQotCSAgYnJlYWs7Ci0KLSAgICAgIGlmICgqcHAgIT0gTlVMTCkKLQlyZSA9ICpwcDsKLSAgICAgIGVsc2UKLQl7Ci0JICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0JICByZS0+bmV4dCA9IE5VTEw7Ci0JICByZS0+aWQgPSBpZHNbaV07Ci0JICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMTsKLQkgICAgICByZS0+dS5kaXIgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMDsKLQkgICAgICByZS0+dS5yZXMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpwcCA9IHJlOwotCX0KLQotICAgICAgaWYgKChpICsgMSkgPCBjaWRzKQotCXsKLQkgIGlmICghcmUtPnN1YmRpcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgaSwgaWRzKTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iKTsKLQkgICAgICB4ZXhpdCAoMSk7Ci0JICAgIH0KLQotCSAgcmVzb3VyY2VzID0gJnJlLT51LmRpcjsKLQl9Ci0gICAgfQotCi0gIGlmIChyZS0+c3ViZGlyKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocmUtPnUucmVzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR1cG9rKQotCXJldHVybjsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHdhcm5pbmc6ICIsIHByb2dyYW1fbmFtZSk7Ci0gICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGNpZHMsIGlkcyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6IGR1cGxpY2F0ZSB2YWx1ZVxuIik7Ci0gICAgfQotCi0gIHJlLT51LnJlcyA9IHJlc291cmNlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc2FuaXR5LnNoIGIvYmludXRpbHMvc2FuaXR5LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDJjYWJmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Nhbml0eS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMhL2Jpbi9zaAotIyMjIHF1aWNrIHNhbml0eSB0ZXN0IGZvciB0aGUgYmludXRpbHMuCi0jIyMKLSMjIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYW5kIGlzIG1haW50YWluZWQgYnkgSy4gUmljaGFyZCBQaXhsZXksCi0jIyMgcmljaEBjeWdudXMuY29tLgotCi0jIyMgZmFpbCBvbiBlcnJvcnMKLXNldCAtZQotCi0jIyMgZmlyc3QgYXJnIGlzIGRpcmVjdG9yeSBpbiB3aGljaCBiaW5hcmllcyB0byBiZSB0ZXN0ZWQgcmVzaWRlLgotY2FzZSAiJDEiIGluCi0iIikgQklOPS4gOzsKLSopICBCSU49IiQxIiA7OwotZXNhYwotCi0jIyMgc2l6ZQotZm9yIGkgaW4gc2l6ZSBvYmpkdW1wIG5tIGFyIHN0cmlwIHJhbmxpYiA7IGRvCi0JJHtCSU59L3NpemUgJHtCSU59LyRpID4gL2Rldi9udWxsCi1kb25lCi0KLSMjIyBvYmpkdW1wCi1mb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KLQkke0JJTn0vb2JqZHVtcCAtYWhpZmRydHhzbCAke0JJTn0vJGkgPiAvZGV2L251bGwKLWRvbmUKLQotIyMjIG5tCi1mb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KLQkke0JJTn0vbm0gJHtCSU59LyRpID4gL2Rldi9udWxsCi1kb25lCi0KLSMjIyBzdHJpcAotVE1QRElSPS4vYmludXRpbHMtJCQKLW1rZGlyICR7VE1QRElSfQotCi1jcCAke0JJTn0vc3RyaXAgJHtUTVBESVJ9L3N0cmlwCi0KLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciByYW5saWIgOyBkbwotCWNwICR7QklOfS8kaSAke1RNUERJUn0vJGkKLQkke0JJTn0vc3RyaXAgJHtUTVBESVJ9LyRpCi0JY3AgJHtCSU59LyRpICR7VE1QRElSfS8kaQotCSR7VE1QRElSfS9zdHJpcCAke1RNUERJUn0vJGkKLWRvbmUKLQotIyMjIGFyCi0KLSMjIyByYW5saWIKLQotcm0gLXJmICR7VE1QRElSfQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NpemUuMSBiL2JpbnV0aWxzL3NpemUuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxOWJkMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zaXplLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHNpemUgMSAiNSBOb3ZlbWJlciAxOTkxIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotc2l6ZSBcLSBsaXN0IHNlY3Rpb24gc2l6ZXMgYW5kIHRvdGFsIHNpemUuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBzaXplCi0uUkIgIltcfCIgXC1BIFx8fFx8IFwtQiBcfHxcfCBcYwotLkJJICJcLVwtZm9ybWF0PSIgY29tcGF0aWJpbGl0eVxjCi1cJlx8XQotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iIAotLlJCICJbXHwiIFwtZCBcfHxcfCBcLW8gXHx8XHwgXC14XGMKLVx8fFx8XGMKLS5CSSAiXC1cLXJhZGl4PSIgbnVtYmVyXGMKLVwmXHxdCi0uUkIgIltcfCIgXGMKLS5CSSAiXC1cLXRhcmdldD0iIGJmZG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVYgXHx8XHwgXC1cLXZlcnNpb24gIlx8XSIgIAotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIFxjCi0uQiBzaXplXGMKLVwmIHV0aWxpdHkgbGlzdHMgdGhlIHNlY3Rpb24gc2l6ZXNcKGVtXCZhbmQgdGhlIHRvdGFsCi1zaXplXChlbVwmZm9yIGVhY2ggb2YgdGhlIG9iamVjdCBmaWxlcwotLkkgb2JqZmlsZQotaW4gaXRzIGFyZ3VtZW50IGxpc3QuCi1CeSBkZWZhdWx0LCBvbmUgbGluZSBvZiBvdXRwdXQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoIG9iamVjdCBmaWxlIG9yIGVhY2gKLW1vZHVsZSBpbiBhbiBhcmNoaXZlLgotCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLUEKLS5UUAotLkIgXC1CCi0uVFAKLS5CSSAiXC1cLWZvcm1hdCAiICJjb21wYXRpYmlsaXR5IgotVXNpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgdGhlIG91dHB1dCBmcm9tIEdOVQotXGMKLS5CIHNpemVcYwotXCYgcmVzZW1ibGVzIG91dHB1dCBmcm9tIFN5c3RlbSBWIFxjCi0uQiBzaXplXGMKLVwmICh1c2luZyBgXHxcYwotLkIgXC1BXGMKLVx8JywKLW9yIGBcfFxjCi0uQiBcLVwtZm9ybWF0PXN5c3ZcYwotXHwnKSwgb3IgQmVya2VsZXkgXGMKLS5CIHNpemVcYwotXCYgKHVzaW5nIGBcfFxjCi0uQiBcLUJcYwotXHwnLCBvcgotYFx8XGMKLS5CIFwtXC1mb3JtYXQ9YmVya2VsZXlcYwotXHwnKS4gIFRoZSBkZWZhdWx0IGlzIHRoZSBvbmUtbGluZSBmb3JtYXQgc2ltaWxhciB0bwotQmVya2VsZXkncy4gIAotCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiBhY2NlcHRhYmxlIGFyZ3VtZW50cyBhbmQgb3B0aW9ucy4KLQotLlRQCi0uQiBcLWQKLS5UUAotLkIgXC1vCi0uVFAKLS5CIFwteAotLlRQCi0uQkkgIlwtXC1yYWRpeCAiICJudW1iZXIiCi1Vc2luZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBjb250cm9sIHdoZXRoZXIgdGhlIHNpemUgb2YgZWFjaAotc2VjdGlvbiBpcyBnaXZlbiBpbiBkZWNpbWFsIChgXHxcYwotLkIgXC1kXGMKLVx8Jywgb3IgYFx8XGMKLS5CIFwtXC1yYWRpeCAxMFxjCi1cfCcpOyBvY3RhbAotKGBcfFxjCi0uQiBcLW9cYwotXHwnLCBvciBgXHxcYwotLkIgXC1cLXJhZGl4IDhcYwotXHwnKTsgb3IgaGV4YWRlY2ltYWwgKGBcfFxjCi0uQiBcLXhcYwotXHwnLCBvcgotYFx8XGMKLS5CIFwtXC1yYWRpeCAxNlxjCi1cfCcpLiAgSW4gYFx8XGMKLS5CIFwtXC1yYWRpeCBcYwotLkkgbnVtYmVyXGMKLVwmXGMKLVx8Jywgb25seSB0aGUgdGhyZWUKLXZhbHVlcyAoOCwgMTAsIDE2KSBhcmUgc3VwcG9ydGVkLiAgVGhlIHRvdGFsIHNpemUgaXMgYWx3YXlzIGdpdmVuIGluIHR3bwotcmFkaWNlczsgZGVjaW1hbCBhbmQgaGV4YWRlY2ltYWwgZm9yIGBcfFxjCi0uQiBcLWRcYwotXHwnIG9yIGBcfFxjCi0uQiBcLXhcYwotXHwnIG91dHB1dCwgb3IKLW9jdGFsIGFuZCBoZXhhZGVjaW1hbCBpZiB5b3UncmUgdXNpbmcgYFx8XGMKLS5CIFwtb1xjCi1cfCcuCi0KLS5UUAotLkJJICJcLVwtdGFyZ2V0ICIgImJmZG5hbWUiCi1Zb3UgY2FuIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgXGMKLS5JIG9iamZpbGVcYwotXCYgYXMKLVxjCi0uSSBiZmRuYW1lXGMKLVwmLiAgVGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeTsgXGMKLS5JIHNpemVcYwotXCYgY2FuCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuICAgU2VlIAotLkJSIG9iamR1bXAgKCAxICkgCi1mb3IgaW5mb3JtYXRpb24KLW9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1EaXNwbGF5IHZlcnNpb24gbnVtYmVyIGluZm9ybWF0aW9uIG9uIFxjCi0uQiBzaXplXGMKLVwmIGl0c2VsZi4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkJSIGluZm8gOwotLklSICJUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXMiICwKLSBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSk7IAotLkJSIGFyICIoIiAxICIpLCIKLS5CUiBvYmpkdW1wICggMSApLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zaXplLmMgYi9iaW51dGlscy9zaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1N2M3ZWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8qIHNpemUuYyAtLSByZXBvcnQgc2l6ZSBvZiB2YXJpb3VzIHNlY3Rpb25zIG9mIGFuIGV4ZWN1dGFibGUgZmlsZS4KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIEV4dGVuc2lvbnMvaW5jb21wYXRpYmlsaXRpZXM6Ci0gICBvIC0gQlNEIG91dHB1dCBoYXMgZmlsZW5hbWVzIGF0IHRoZSBlbmQuCi0gICBvIC0gQlNEIG91dHB1dCBjYW4gYXBwZWFyIGluIGRpZmZlcmVudCByYWRpY2llcy4KLSAgIG8gLSBTeXNWIG91dHB1dCBoYXMgbGVzcyByZWR1bmRhbnQgd2hpdGVzcGFjZS4gIEZpbGVuYW1lIGNvbWVzIGF0IGVuZC4KLSAgIG8gLSBTeXNWIG91dHB1dCBkb2Vzbid0IHNob3cgVk1BIHdoaWNoIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgUE1BLgotICAgbyAtIFdlIGFsc28gaGFuZGxlIGNvcmUgZmlsZXMuCi0gICBvIC0gV2UgYWxzbyBoYW5kbGUgYXJjaGl2ZXMuCi0gICBJZiB5b3Ugd3JpdGUgc2hlbGwgc2NyaXB0cyB3aGljaCBtYW5pcHVsYXRlIHRoaXMgaW5mbyB0aGVuIHlvdSBtYXkgYmUKLSAgIG91dCBvZiBsdWNrOyB0aGVyZSdzIG5vIC0tY29tcGF0aWJpbGl0eSBvciAtLXBlZGFudGljIG9wdGlvbi4KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmbmRlZiBCU0RfREVGQVVMVAotI2RlZmluZSBCU0RfREVGQVVMVCAxCi0jZW5kaWYKLQotLyogUHJvZ3JhbSBvcHRpb25zLiAgKi8KLQotZW51bQotICB7Ci0gICAgZGVjaW1hbCwgb2N0YWwsIGhleAotICB9IHJhZGl4ID0gZGVjaW1hbDsKLWludCBiZXJrZWxleV9mb3JtYXQgPSBCU0RfREVGQVVMVDsJLyogMCBtZWFucyB1c2UgQVQmVC1zdHlsZSBvdXRwdXQuICAqLwotaW50IHNob3dfdmVyc2lvbiA9IDA7Ci1pbnQgc2hvd19oZWxwID0gMDsKLQotLyogUHJvZ3JhbSBleGl0IHN0YXR1cy4gICovCi1pbnQgcmV0dXJuX2NvZGUgPSAwOwotCi1zdGF0aWMgY2hhciAqdGFyZ2V0ID0gTlVMTDsKLQotLyogU3RhdGljIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5X2JmZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgZGlzcGxheV9hcmNoaXZlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHNpemVfbnVtYmVyIFBBUkFNUyAoKGJmZF9zaXplX3R5cGUpKTsKLSNpZiAwCi1zdGF0aWMgdm9pZCBscHJpbnRfbnVtYmVyIFBBUkFNUyAoKGludCwgYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBycHJpbnRfbnVtYmVyIFBBUkFNUyAoKGludCwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHZvaWQgcHJpbnRfYmVya2VsZXlfZm9ybWF0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzeXN2X2ludGVybmFsX3NpemVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHN5c3ZfaW50ZXJuYWxfcHJpbnRlciBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zeXN2X2Zvcm1hdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgcHJpbnRfc2l6ZXMgUEFSQU1TICgoYmZkICogZmlsZSkpOwotc3RhdGljIHZvaWQgYmVya2VsZXlfc3VtIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIpKTsKLQwKLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1BQmRveFZdIFstLWZvcm1hdD1iZXJrZWxleXxzeXN2XSBbLS1yYWRpeD04fDEwfDE2XVxuXAotICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBbZmlsZS4uLl1cbiIpLCBwcm9ncmFtX25hbWUpOwotI2lmIEJTRF9ERUZBVUxUCi0gIGZwdXRzIChfKCJkZWZhdWx0IGlzIC0tZm9ybWF0PWJlcmtlbGV5XG4iKSwgc3RyZWFtKTsKLSNlbHNlCi0gIGZwdXRzIChfKCJkZWZhdWx0IGlzIC0tZm9ybWF0PXN5c3ZcbiIpLCBzdHJlYW0pOwotI2VuZGlmCi0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLXN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAyMDB9LAotICB7InJhZGl4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMX0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMn0sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAmc2hvd192ZXJzaW9uLCAxfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsICZzaG93X2hlbHAsIDF9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IHRlbXA7Ci0gIGludCBjOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIkFCVmRveCIsIGxvbmdfb3B0aW9ucywKLQkJCSAgIChpbnQgKikgMCkpICE9IEVPRikKLSAgICBzd2l0Y2ggKGMpCi0gICAgICB7Ci0gICAgICBjYXNlIDIwMDoJCS8qIC0tZm9ybWF0ICovCi0Jc3dpdGNoICgqb3B0YXJnKQotCSAgewotCSAgY2FzZSAnQic6Ci0JICBjYXNlICdiJzoKLQkgICAgYmVya2VsZXlfZm9ybWF0ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdTJzoKLQkgIGNhc2UgJ3MnOgotCSAgICBiZXJrZWxleV9mb3JtYXQgPSAwOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW52YWxpZCBhcmd1bWVudCB0byAtLWZvcm1hdDogJXNcbiIpLCBvcHRhcmcpOwotCSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSAyMDI6CQkvKiAtLXRhcmdldCAqLwotCXRhcmdldCA9IG9wdGFyZzsKLQlicmVhazsKLQotICAgICAgY2FzZSAyMDE6CQkvKiAtLXJhZGl4ICovCi0jaWZkZWYgQU5TSV9MSUJSQVJJRVMKLQl0ZW1wID0gc3RydG9sIChvcHRhcmcsIE5VTEwsIDEwKTsKLSNlbHNlCi0JdGVtcCA9IGF0b2wgKG9wdGFyZyk7Ci0jZW5kaWYKLQlzd2l0Y2ggKHRlbXApCi0JICB7Ci0JICBjYXNlIDEwOgotCSAgICByYWRpeCA9IGRlY2ltYWw7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA4OgotCSAgICByYWRpeCA9IG9jdGFsOwotCSAgICBicmVhazsKLQkgIGNhc2UgMTY6Ci0JICAgIHJhZGl4ID0gaGV4OwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIHByaW50ZiAoXygiSW52YWxpZCByYWRpeDogJXNcbiIpLCBvcHRhcmcpOwotCSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSAnQSc6Ci0JYmVya2VsZXlfZm9ybWF0ID0gMDsKLQlicmVhazsKLSAgICAgIGNhc2UgJ0InOgotCWJlcmtlbGV5X2Zvcm1hdCA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdWJzoKLQlzaG93X3ZlcnNpb24gPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSAnZCc6Ci0JcmFkaXggPSBkZWNpbWFsOwotCWJyZWFrOwotICAgICAgY2FzZSAneCc6Ci0JcmFkaXggPSBoZXg7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdvJzoKLQlyYWRpeCA9IG9jdGFsOwotCWJyZWFrOwotICAgICAgY2FzZSAwOgotCWJyZWFrOwotICAgICAgY2FzZSAnPyc6Ci0JdXNhZ2UgKHN0ZGVyciwgMSk7Ci0gICAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgic2l6ZSIpOwotICBpZiAoc2hvd19oZWxwKQotICAgIHVzYWdlIChzdGRvdXQsIDApOwotCi0gIGlmIChvcHRpbmQgPT0gYXJnYykKLSAgICBkaXNwbGF5X2ZpbGUgKCJhLm91dCIpOwotICBlbHNlCi0gICAgZm9yICg7IG9wdGluZCA8IGFyZ2M7KQotICAgICAgZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSk7Ci0KLSAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotDAotLyogRGlzcGxheSBzdGF0cyBvbiBmaWxlIG9yIGFyY2hpdmUgbWVtYmVyIEFCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9iZmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgLyogQW4gYXJjaGl2ZSB3aXRoaW4gYW4gYXJjaGl2ZS4gICovCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgcHJpbnRfc2l6ZXMgKGFiZmQpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotICAgICAgZnJlZSAobWF0Y2hpbmcpOwotICAgICAgcmV0dXJuX2NvZGUgPSAzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfY29yZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBDT05TVCBjaGFyICpjb3JlX2NtZDsKLQotICAgICAgcHJpbnRfc2l6ZXMgKGFiZmQpOwotICAgICAgZnB1dHMgKCIgKGNvcmUgZmlsZSIsIHN0ZG91dCk7Ci0KLSAgICAgIGNvcmVfY21kID0gYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpOwotICAgICAgaWYgKGNvcmVfY21kKQotCXByaW50ZiAoIiBpbnZva2VkIGFzICVzIiwgY29yZV9jbWQpOwotCi0gICAgICBwdXRzICgiKVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0gICAgewotICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0gICAgICBmcmVlIChtYXRjaGluZyk7Ci0gICAgfQotCi0gIHJldHVybl9jb2RlID0gMzsKLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYXJjaGl2ZSAoZmlsZSkKLSAgICAgYmZkICpmaWxlOwotewotICBiZmQgKmFyZmlsZSA9IChiZmQgKikgTlVMTDsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0KLSAgICAgIGFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGZpbGUsIGFyZmlsZSk7Ci0gICAgICBpZiAoYXJmaWxlID09IE5VTEwpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpCi0JICAgIHsKLQkgICAgICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQkgICAgICByZXR1cm5fY29kZSA9IDI7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgZGlzcGxheV9iZmQgKGFyZmlsZSk7Ci0gICAgICAvKiBEb24ndCBjbG9zZSB0aGUgYXJjaGl2ZSBlbGVtZW50czsgd2UgbmVlZCB0aGVtIGZvciBuZXh0X2FyY2hpdmUgKi8KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2ZpbGUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgYmZkICpmaWxlID0gYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybl9jb2RlID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGZpbGUsIGJmZF9hcmNoaXZlKSA9PSB0cnVlKQotICAgIGRpc3BsYXlfYXJjaGl2ZSAoZmlsZSk7Ci0gIGVsc2UKLSAgICBkaXNwbGF5X2JmZCAoZmlsZSk7Ci0KLSAgaWYgKGJmZF9jbG9zZSAoZmlsZSkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm5fY29kZSA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotDAotLyogVGhpcyBpcyB3aGF0IGxleGljYWwgZnVuY3Rpb25zIGFyZSBmb3IuICAqLwotCi1zdGF0aWMgaW50Ci1zaXplX251bWJlciAobnVtKQotICAgICBiZmRfc2l6ZV90eXBlIG51bTsKLXsKLSAgY2hhciBidWZmZXJbNDBdOwotICBzcHJpbnRmIChidWZmZXIsCi0JICAgKHJhZGl4ID09IGRlY2ltYWwgPyAiJWx1IiA6Ci0JICAgKChyYWRpeCA9PSBvY3RhbCkgPyAiMCVsbyIgOiAiMHglbHgiKSksCi0JICAgKHVuc2lnbmVkIGxvbmcpIG51bSk7Ci0KLSAgcmV0dXJuIHN0cmxlbiAoYnVmZmVyKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1scHJpbnRfbnVtYmVyICh3aWR0aCwgbnVtKQotICAgICBpbnQgd2lkdGg7Ci0gICAgIGJmZF9zaXplX3R5cGUgbnVtOwotewotICBjaGFyIGJ1ZmZlcls0MF07Ci0gIHNwcmludGYgKGJ1ZmZlciwKLQkgICAocmFkaXggPT0gZGVjaW1hbCA/ICIlbHUiIDoKLQkgICAoKHJhZGl4ID09IG9jdGFsKSA/ICIwJWxvIiA6ICIweCVseCIpKSwKLQkgICAodW5zaWduZWQgbG9uZykgbnVtKTsKLQotICBwcmludGYgKCIlLSpzIiwgd2lkdGgsIGJ1ZmZlcik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotcnByaW50X251bWJlciAod2lkdGgsIG51bSkKLSAgICAgaW50IHdpZHRoOwotICAgICBiZmRfc2l6ZV90eXBlIG51bTsKLXsKLSAgY2hhciBidWZmZXJbNDBdOwotICBzcHJpbnRmIChidWZmZXIsCi0JICAgKHJhZGl4ID09IGRlY2ltYWwgPyAiJWx1IiA6Ci0JICAgKChyYWRpeCA9PSBvY3RhbCkgPyAiMCVsbyIgOiAiMHglbHgiKSksCi0JICAgKHVuc2lnbmVkIGxvbmcpIG51bSk7Ci0KLSAgcHJpbnRmICgiJSpzIiwgd2lkdGgsIGJ1ZmZlcik7Ci19Ci0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGJzc3NpemU7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHRleHRzaXplOwotCi1zdGF0aWMgdm9pZAotYmVya2VsZXlfc3VtIChhYmZkLCBzZWMsIGlnbm9yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlYzsKLSAgICAgUFRSIGlnbm9yZTsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLSAgaWYgKChmbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLSAgaWYgKChmbGFncyAmIFNFQ19DT0RFKSAhPSAwIHx8IChmbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLSAgICB0ZXh0c2l6ZSArPSBzaXplOwotICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotICAgIGRhdGFzaXplICs9IHNpemU7Ci0gIGVsc2UKLSAgICBic3NzaXplICs9IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIAotcHJpbnRfYmVya2VsZXlfZm9ybWF0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBpbnQgZmlsZXNfc2VlbiA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgdG90YWw7Ci0KLSAgYnNzc2l6ZSA9IDA7Ci0gIGRhdGFzaXplID0gMDsKLSAgdGV4dHNpemUgPSAwOwotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgYmVya2VsZXlfc3VtLCAoUFRSKSBOVUxMKTsKLQotICBpZiAoZmlsZXNfc2VlbisrID09IDApCi0jaWYgMAotICAgIC8qIEludGVsIGRvZXNuJ3QgbGlrZSBic3Mvc3RrIGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGNvcmUgZmlsZXMuICAqLwotICAgIHB1dHMgKChyYWRpeCA9PSBvY3RhbCkgPyAiICAgdGV4dFx0ICAgZGF0YVx0YnNzL3N0a1x0ICAgIG9jdFx0ICAgIGhleFx0ZmlsZW5hbWUiIDoKLQkgICIgICB0ZXh0XHQgICBkYXRhXHRic3Mvc3RrXHQgICAgZGVjXHQgICAgaGV4XHRmaWxlbmFtZSIpOwotI2Vsc2UKLSAgICBwdXRzICgocmFkaXggPT0gb2N0YWwpID8gIiAgIHRleHRcdCAgIGRhdGFcdCAgICBic3NcdCAgICBvY3RcdCAgICBoZXhcdGZpbGVuYW1lIiA6Ci0JICAiICAgdGV4dFx0ICAgZGF0YVx0ICAgIGJzc1x0ICAgIGRlY1x0ICAgIGhleFx0ZmlsZW5hbWUiKTsKLSNlbmRpZgotCi0gIHRvdGFsID0gdGV4dHNpemUgKyBkYXRhc2l6ZSArIGJzc3NpemU7Ci0KLSAgcnByaW50X251bWJlciAoNywgdGV4dHNpemUpOwotICBwdXRjaGFyICgnXHQnKTsKLSAgcnByaW50X251bWJlciAoNywgZGF0YXNpemUpOwotICBwdXRjaGFyICgnXHQnKTsKLSAgcnByaW50X251bWJlciAoNywgYnNzc2l6ZSk7Ci0gIHByaW50ZiAoKChyYWRpeCA9PSBvY3RhbCkgPyAiXHQlN2xvXHQlN2x4XHQiIDogIlx0JTdsdVx0JTdseFx0IiksCi0JICAodW5zaWduZWQgbG9uZykgdG90YWwsICh1bnNpZ25lZCBsb25nKSB0b3RhbCk7Ci0KLSAgZnB1dHMgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdGRvdXQpOwotICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpKQotICAgIHByaW50ZiAoIiAoZXggJXMpIiwgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSk7Ci19Ci0KLS8qIEkgUkVBTExZIG1pc3MgbGV4aWNhbCBmdW5jdGlvbnMhICovCi1iZmRfc2l6ZV90eXBlIHN2aV90b3RhbCA9IDA7Ci1iZmRfdm1hIHN2aV9tYXh2bWEgPSAwOwotaW50IHN2aV9uYW1lbGVuID0gMDsKLWludCBzdmlfdm1hbGVuID0gMDsKLWludCBzdmlfc2l6ZWxlbiA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1zeXN2X2ludGVybmFsX3NpemVyIChmaWxlLCBzZWMsIGlnbm9yZSkKLSAgICAgYmZkICpmaWxlOwotICAgICBzZWNfcHRyIHNlYzsKLSAgICAgUFRSIGlnbm9yZTsKLXsKLSAgYmZkX3NpemVfdHlwZSBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoZmlsZSwgc2VjKTsKLSAgaWYgKCFiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLSAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLSAgICAgICYmICFiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgewotICAgICAgaW50IG5hbWVsZW4gPSBzdHJsZW4gKGJmZF9zZWN0aW9uX25hbWUgKGZpbGUsIHNlYykpOwotICAgICAgaWYgKG5hbWVsZW4gPiBzdmlfbmFtZWxlbikKLQlzdmlfbmFtZWxlbiA9IG5hbWVsZW47Ci0KLSAgICAgIHN2aV90b3RhbCArPSBzaXplOwotICAgICAgaWYgKGJmZF9zZWN0aW9uX3ZtYSAoZmlsZSwgc2VjKSA+IHN2aV9tYXh2bWEpCi0Jc3ZpX21heHZtYSA9IGJmZF9zZWN0aW9uX3ZtYSAoZmlsZSwgc2VjKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zeXN2X2ludGVybmFsX3ByaW50ZXIgKGZpbGUsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmZpbGU7Ci0gICAgIHNlY19wdHIgc2VjOwotICAgICBQVFIgaWdub3JlOwotewotICBiZmRfc2l6ZV90eXBlIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChmaWxlLCBzZWMpOwotICBpZiAoIWJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotICAgICAgJiYgIWJmZF9pc19jb21fc2VjdGlvbiAoc2VjKQotICAgICAgJiYgIWJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICB7Ci0gICAgICBzdmlfdG90YWwgKz0gc2l6ZTsKLQotICAgICAgcHJpbnRmICgiJS0qcyAgICIsIHN2aV9uYW1lbGVuLCBiZmRfc2VjdGlvbl9uYW1lIChmaWxlLCBzZWMpKTsKLSAgICAgIHJwcmludF9udW1iZXIgKHN2aV9zaXplbGVuLCBzaXplKTsKLSAgICAgIHByaW50ZiAoIiAgICIpOwotICAgICAgcnByaW50X251bWJlciAoc3ZpX3ZtYWxlbiwgYmZkX3NlY3Rpb25fdm1hIChmaWxlLCBzZWMpKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3lzdl9mb3JtYXQgKGZpbGUpCi0gICAgIGJmZCAqZmlsZTsKLXsKLSAgLyogc2l6ZSBhbGwgb2YgdGhlIGNvbHVtbnMgKi8KLSAgc3ZpX3RvdGFsID0gMDsKLSAgc3ZpX21heHZtYSA9IDA7Ci0gIHN2aV9uYW1lbGVuID0gMDsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChmaWxlLCBzeXN2X2ludGVybmFsX3NpemVyLCAoUFRSKSBOVUxMKTsKLSAgc3ZpX3ZtYWxlbiA9IHNpemVfbnVtYmVyICgoYmZkX3NpemVfdHlwZSlzdmlfbWF4dm1hKTsKLSAgaWYgKChzaXplX3QpIHN2aV92bWFsZW4gPCBzaXplb2YgKCJhZGRyIikgLSAxKQotICAgIHN2aV92bWFsZW4gPSBzaXplb2YgKCJhZGRyIiktMTsKLQotICBzdmlfc2l6ZWxlbiA9IHNpemVfbnVtYmVyIChzdmlfdG90YWwpOwotICBpZiAoKHNpemVfdCkgc3ZpX3NpemVsZW4gPCBzaXplb2YgKCJzaXplIikgLSAxKQotICAgIHN2aV9zaXplbGVuID0gc2l6ZW9mICgic2l6ZSIpLTE7Ci0KLSAgc3ZpX3RvdGFsID0gMDsKLSAgcHJpbnRmICgiJXMgICIsIGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLSAgaWYgKGJmZF9teV9hcmNoaXZlIChmaWxlKSkKLSAgICBwcmludGYgKCIgKGV4ICVzKSIsIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChmaWxlKSkpOwotCi0gIHByaW50ZiAoIjpcbiUtKnMgICAlKnMgICAlKnNcbiIsIHN2aV9uYW1lbGVuLCAic2VjdGlvbiIsCi0JICBzdmlfc2l6ZWxlbiwgInNpemUiLCBzdmlfdm1hbGVuLCAiYWRkciIpOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGZpbGUsIHN5c3ZfaW50ZXJuYWxfcHJpbnRlciwgKFBUUikgTlVMTCk7Ci0KLSAgcHJpbnRmICgiJS0qcyAgICIsIHN2aV9uYW1lbGVuLCAiVG90YWwiKTsKLSAgcnByaW50X251bWJlciAoc3ZpX3NpemVsZW4sIHN2aV90b3RhbCk7Ci0gIHByaW50ZiAoIlxuXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3NpemVzIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGlmIChiZXJrZWxleV9mb3JtYXQpCi0gICAgcHJpbnRfYmVya2VsZXlfZm9ybWF0IChmaWxlKTsKLSAgZWxzZQotICAgIHByaW50X3N5c3ZfZm9ybWF0IChmaWxlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NyY29udi5jIGIvYmludXRpbHMvc3Jjb252LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMGYyYjcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3Jjb252LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDM2ICswLDAgQEAKLS8qIHNyY29udi5jIC0tIFN5c3JvZmYgY29udmVyc2lvbiBwcm9ncmFtCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQotCi0gICBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIGNvZmYgb2JqZWN0IGZpbGUKLSAgIGludG8gYSBIaXRhY2hpIE9NL0xNIChTeXNyb2ZmKSBmb3JtYXQuCi0KLSAgIEFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkICovCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJzeXNyb2ZmLmgiCi0jaW5jbHVkZSAiY29mZmdyb2suaCIKLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotCi0jZGVmaW5lIFBST0dSQU1fVkVSU0lPTiAiMS41IgotLyojZGVmaW5lIEZPT1AxIDEgKi8KLQotc3RhdGljIGludCBhZGRyc2l6ZTsKLXN0YXRpYyBjaGFyICp0b29sbmFtZTsKLXN0YXRpYyBjaGFyICoqcm5hbWVzOwotCi1zdGF0aWMgdm9pZCB3cl9jcyAoKTsKLXN0YXRpYyB2b2lkIHdhbGtfdHJlZV9zY29wZSAoKTsKLXN0YXRpYyB2b2lkIHdyX2dsb2JhbHMgKCk7Ci1zdGF0aWMgaW50IGZpbmRfYmFzZSAoKTsKLQotc3RhdGljIEZJTEUgKmZpbGU7Ci1zdGF0aWMgYmZkICphYmZkOwotc3RhdGljIGludCBkZWJ1ZyA9IDA7Ci1zdGF0aWMgaW50IHF1aWNrID0gMDsKLXN0YXRpYyBpbnQgbm9wcmVzY2FuID0gMDsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9vZmlsZSAqdHJlZTsKLS8qIE9ic29sZXRlID8/IAotICAgc3RhdGljIGludCBhYnNvbHV0ZV9wOwotICovCi0KLXN0YXRpYyBpbnQgc2VnbWVudGVkX3A7Ci1zdGF0aWMgaW50IGNvZGU7Ci0KLXN0YXRpYyBpbnQgaWRzMVsyMDAwMF07Ci1zdGF0aWMgaW50IGlkczJbMjAwMDBdOwotCi1zdGF0aWMgaW50IGJhc2UxID0gMHgxODsKLXN0YXRpYyBpbnQgYmFzZTIgPSAweDIwMTg7Ci0KLXN0YXRpYyBpbnQKLWdldF9tZW1iZXJfaWQgKHgpCi0gICAgIGludCB4OwotewotICBpZiAoaWRzMlt4XSkKLSAgICB7Ci0gICAgICByZXR1cm4gaWRzMlt4XTsKLSAgICB9Ci0gIGlkczJbeF0gPSBiYXNlMisrOwotICByZXR1cm4gaWRzMlt4XTsKLX0KLQotc3RhdGljIGludAotZ2V0X29yZGluYXJ5X2lkICh4KQotICAgICBpbnQgeDsKLXsKLSAgaWYgKGlkczFbeF0pCi0gICAgewotICAgICAgcmV0dXJuIGlkczFbeF07Ci0gICAgfQotICBpZHMxW3hdID0gYmFzZTErKzsKLSAgcmV0dXJuIGlkczFbeF07Ci19Ci1zdGF0aWMgY2hhciAqCi1zZWN0aW9uX3RyYW5zbGF0ZSAobikKLSAgICAgY2hhciAqbjsKLXsKLSAgaWYgKHN0cmNtcCAobiwgIi50ZXh0IikgPT0gMCkKLSAgICByZXR1cm4gIlAiOwotICBpZiAoc3RyY21wIChuLCAiLmRhdGEiKSA9PSAwKQotICAgIHJldHVybiAiRCI7Ci0gIGlmIChzdHJjbXAgKG4sICIuYnNzIikgPT0gMCkKLSAgICByZXR1cm4gIkIiOwotICByZXR1cm4gbjsKLX0KLQotCi0KLSNkZWZpbmUgREFURSAiOTQwMjAxMDczMDAwIjsJLyogSnVzdCBhIHRpbWUgb24gbXkgYmlydGhkYXkgKi8KLQotCi1zdGF0aWMKLWNoYXIgKgotc3RyaXBfc3VmZml4IChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgaTsKLSAgY2hhciAqcmVzOwotICBmb3IgKGkgPSAwOyBuYW1lW2ldICE9IDAgJiYgbmFtZVtpXSAhPSAnLic7IGkrKykKLSAgICA7Ci0gIHJlcyA9IChjaGFyICopIHhtYWxsb2MgKGkgKyAxKTsKLSAgbWVtY3B5IChyZXMsIG5hbWUsIGkpOwotICByZXNbaV0gPSAwOwotICByZXR1cm4gcmVzOwotfQotCi0KLS8qIElUIExFTiBzdHVmZiBDUyAqLwotc3RhdGljIHZvaWQKLWNoZWNrc3VtIChmaWxlLCBwdHIsIHNpemUsIGNvZGUpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBjb2RlOwotewotICBpbnQgajsKLSAgaW50IGxhc3Q7Ci0gIGludCBzdW0gPSAwOwotICBpbnQgYnl0ZXMgPSBzaXplIC8gODsKLSAgbGFzdCA9ICEoY29kZSAmIDB4ZmYwMCk7Ci0gIGlmIChzaXplICYgMHg3KQotICAgIGFib3J0ICgpOwotICBwdHJbMF0gPSBjb2RlIHwgKGxhc3QgPyAweDgwIDogMCk7Ci0gIHB0clsxXSA9IGJ5dGVzICsgMTsKLQotICBmb3IgKGogPSAwOyBqIDwgYnl0ZXM7IGorKykKLSAgICB7Ci0gICAgICBzdW0gKz0gcHRyW2pdOwotICAgIH0KLSAgLyogR2x1ZSBvbiBhIGNoZWNrc3VtIHRvbyAqLwotICBwdHJbYnl0ZXNdID0gfnN1bTsKLSAgZndyaXRlIChwdHIsIGJ5dGVzICsgMSwgMSwgZmlsZSk7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZUlOVCAobiwgcHRyLCBpZHgsIHNpemUsIGZpbGUpCi0gICAgIGludCBuOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLQotICBpZiAoc2l6ZSA9PSAtMikKLSAgICBzaXplID0gYWRkcnNpemU7Ci0gIGVsc2UgaWYgKHNpemUgPT0gLTEpCi0gICAgc2l6ZSA9IDA7Ci0KLSAgaWYgKGJ5dGUgPiAyNDApCi0gICAgewotICAgICAgLyogTGV0cyB3cml0ZSBvdXQgdGhhdCByZWNvcmQgYW5kIGRvIGFub3RoZXIgb25lICovCi0gICAgICBjaGVja3N1bSAoZmlsZSwgcHRyLCAqaWR4LCBjb2RlIHwgMHgxMDAwKTsKLSAgICAgICppZHggPSAxNjsKLSAgICAgIGJ5dGUgPSAqaWR4IC8gODsKLSAgICB9Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgcHRyW2J5dGVdID0gbjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHB0cltieXRlICsgMF0gPSBuID4+IDg7Ci0gICAgICBwdHJbYnl0ZSArIDFdID0gbjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHB0cltieXRlICsgMF0gPSBuID4+IDI0OwotICAgICAgcHRyW2J5dGUgKyAxXSA9IG4gPj4gMTY7Ci0gICAgICBwdHJbYnl0ZSArIDJdID0gbiA+PiA4OwotICAgICAgcHRyW2J5dGUgKyAzXSA9IG4gPj4gMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gICppZHggKz0gc2l6ZSAqIDg7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlQklUUyAodmFsLCBwdHIsIGlkeCwgc2l6ZSkKLSAgICAgaW50IHZhbDsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0gIGludCBiaXQgPSAqaWR4ICUgODsKLSAgaW50IG9sZDsKLSAgKmlkeCArPSBzaXplOwotCi0gIG9sZCA9IHB0cltieXRlXTsKLSAgLyogVHVybiBvZmYgYWxsIGFib3V0IHRvIGNoYW5nZSBiaXRzICovCi0gIG9sZCAmPSB+KCh+MCA+PiAoOCAtIGJpdCAtIHNpemUpKSAmICgoMSA8PCBzaXplKSAtIDEpKTsKLSAgLyogVHVybiBvbiB0aGUgYml0cyB3ZSB3YW50ICovCi0gIG9sZCB8PSAodmFsICYgKCgxIDw8IHNpemUpIC0gMSkpIDw8ICg4IC0gYml0IC0gc2l6ZSk7Ci0gIHB0cltieXRlXSA9IG9sZDsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlQkFSUkFZIChkYXRhLCBwdHIsIGlkeCwgc2l6ZSwgZmlsZSkKLSAgICAgYmFycmF5IGRhdGE7Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplOwotICAgICBGSUxFICpmaWxlOwotewotICBpbnQgaTsKLSAgd3JpdGVJTlQgKGRhdGEubGVuLCBwdHIsIGlkeCwgMSwgZmlsZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbjsgaSsrKQotICAgIHsKLSAgICAgIHdyaXRlSU5UIChkYXRhLmRhdGFbaV0sIHB0ciwgaWR4LCAxLCBmaWxlKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlQ0hBUlMgKHN0cmluZywgcHRyLCBpZHgsIHNpemUsIGZpbGUpCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGludCBpID0gKmlkeCAvIDg7Ci0KLSAgaWYgKGkgPiAyNDApCi0gICAgewotICAgICAgLyogTGV0cyB3cml0ZSBvdXQgdGhhdCByZWNvcmQgYW5kIGRvIGFub3RoZXIgb25lICovCi0gICAgICBjaGVja3N1bSAoZmlsZSwgcHRyLCAqaWR4LCBjb2RlIHwgMHgxMDAwKTsKLSAgICAgICppZHggPSAxNjsKLSAgICAgIGkgPSAqaWR4IC8gODsKLSAgICB9Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBWYXJpYWJsZSBsZW5ndGggc3RyaW5nICovCi0gICAgICBzaXplID0gc3RybGVuIChzdHJpbmcpOwotICAgICAgcHRyW2krK10gPSBzaXplOwotICAgIH0KLQotICAvKiBCVUcgV0FJVElORyBUTyBIQVBQRU4gKi8KLSAgbWVtY3B5IChwdHIgKyBpLCBzdHJpbmcsIHNpemUpOwotICBpICs9IHNpemU7Ci0gICppZHggPSBpICogODsKLX0KLQotI2RlZmluZSBTWVNST0ZGX1NXQVBfT1VUCi0jaW5jbHVkZSAic3lzcm9mZi5jIgotCi0KLXN0YXRpYyBjaGFyICpybmFtZV9zaFtdID0KLXsKLSAgIlIwIiwgIlIxIiwgIlIyIiwgIlIzIiwgIlI0IiwgIlI1IiwgIlI2IiwgIlI3IiwgIlI4IiwgIlI5IiwgIlIxMCIsICJSMTEiLCAiUjEyIiwgIlIxMyIsICJSMTQiLCAiUjE1IgotfTsKLQotc3RhdGljIGNoYXIgKnJuYW1lX2g4MzAwW10gPQotewotICAiRVIwIiwgIkVSMSIsICJFUjIiLCAiRVIzIiwgIkVSNCIsICJFUjUiLCAiRVI2IiwgIkVSNyIsICJQQyIsICJDQ1IiCi19OwotCi1zdGF0aWMgdm9pZAotd3JfdHIgKCkKLXsKLSAgLyogVGhlIFRSIGJsb2NrIGlzIG5vdCBub3JtYWwgLSBpdCBkb2Vzbid0IGhhdmUgYW55IGNvbnRlbnRzLiAqLwotCi0gIHN0YXRpYyBjaGFyIGJbXSA9IHsKLSAgICAweGZmLAkJCS8qIElUICovCi0gICAgMHgwMywJCQkvKiBSTCAqLwotICAgIDB4ZmQsCQkJLyogQ1MgKi8KLSAgfTsKLSAgZndyaXRlIChiLCAxLCBzaXplb2YgKGIpLCBmaWxlKTsKLX0KLQotc3RhdGljIHZvaWQKLXdyX3VuIChwdHIsIHNmaWxlLCBmaXJzdCwgbnNlY3MpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IGZpcnN0OwotICAgICBpbnQgbnNlY3M7Ci17Ci0gIHN0cnVjdCBJVF91biB1bjsKLQotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnM7Ci0KLSAgdW4uc3BhcmUxID0gMDsKLQotICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKLSAgICB1bi5mb3JtYXQgPSBGT1JNQVRfTE07Ci0gIGVsc2UKLSAgICB1bi5mb3JtYXQgPSBGT1JNQVRfT007Ci0gIHVuLnNwYXJlMSA9IDA7Ci0KLQotI2lmIDEKLSAgdW4ubnNlY3Rpb25zID0gcHRyLT5uc2VjdGlvbnMgLSAxOwkvKiAgRG9uJ3QgY291bnQgdGhlIGFicyBzZWN0aW9uICovCi0jZWxzZQotICAvKk5FVyAtIG9ubHkgY291bnQgc2VjdGlvbnMgd2l0aCBzaXplICovCi0gIHVuLm5zZWN0aW9ucyA9IG5zZWNzOwotI2VuZGlmCi0KLSAgdW4ubmV4dGRlZnMgPSAwOwotICB1bi5uZXh0cmVmcyA9IDA7Ci0gIC8qIENvdW50IGFsbCB0aGUgdW5kZWZpbmVkIGFuZCBkZWZpbmVkIHZhcmlhYmxlcyB3aXRoIGdsb2JhbCBzY29wZSAqLwotCi0gIGlmIChmaXJzdCkKLSAgICB7Ci0gICAgICBmb3IgKHMgPSBwdHItPnN5bWJvbF9saXN0X2hlYWQ7IHM7IHMgPSBzLT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgaWYgKHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X2RlZgotCSAgICAgIHx8IHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfY29tbW9uKQotCSAgICB1bi5uZXh0ZGVmcysrOwotCi0JICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfcmVmKQotCSAgICB1bi5uZXh0cmVmcysrOwotCX0KLSAgICB9Ci0gIHVuLnRvb2wgPSB0b29sbmFtZTsKLSAgdW4udGNkID0gREFURTsKLSAgdW4ubGlua2VyID0gIkxfR1gwMCI7Ci0gIHVuLmxjZCA9IERBVEU7Ci0gIHVuLm5hbWUgPSBzZmlsZS0+bmFtZTsKLSAgc3lzcm9mZl9zd2FwX3VuX291dCAoZmlsZSwgJnVuKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3JfaGQgKHApCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotewotICBzdHJ1Y3QgSVRfaGQgaGQ7Ci0KLSAgaGQuc3BhcmUxID0gMDsKLSAgaWYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1ApCi0gICAgewotICAgICAgaGQubXQgPSBNVFlQRV9BQlNfTE07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGQubXQgPSBNVFlQRV9PTVNfT1JfTE1TOwotICAgIH0KLSAgaGQuY2QgPSBEQVRFOwotCi0gIGhkLm51ID0gcC0+bnNvdXJjZXM7CQkvKiBBbHdheXMgb25lIHVuaXQgKi8KLSAgaGQuY29kZSA9IDA7CQkJLyogQWx3YXlzIEFTQ0lJICovCi0gIGhkLnZlciA9ICIwMjAwIjsJCS8qIFZlcnNpb24gMi4wMCAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBoZC5hdSA9IDg7Ci0gICAgICBoZC5zaSA9IDA7Ci0gICAgICBoZC5zcGNzeiA9IDMyOwotICAgICAgaGQuc2Vnc3ogPSAwOwotICAgICAgaGQuc2Vnc2ggPSAwOwotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2g4MzAwOgotCSAgaGQuY3B1ID0gIkg4MzAwIjsKLQkgIGhkLmFmbCA9IDI7Ci0JICBhZGRyc2l6ZSA9IDI7Ci0JICB0b29sbmFtZSA9ICJDX0g4LzMwMCI7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2g4MzAwaDoKLQkgIGhkLmNwdSA9ICJIODMwMEgiOwotCSAgaGQuYWZsID0gNDsKLQkgIGFkZHJzaXplID0gNDsKLQkgIHRvb2xuYW1lID0gIkNfSDgvMzAwSCI7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2g4MzAwczoKLQkgIGhkLmNwdSA9ICJIODMwMFMiOwotCSAgaGQuYWZsID0gNDsKLQkgIGFkZHJzaXplID0gNDsKLQkgIHRvb2xuYW1lID0gIkNfSDgvMzAwUyI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQoKTsKLQl9Ci0gICAgICBybmFtZXMgPSBybmFtZV9oODMwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBoZC5hdSA9IDg7Ci0gICAgICBoZC5zaSA9IDA7Ci0gICAgICBoZC5hZmwgPSA0OwotICAgICAgaGQuc3Bjc3ogPSAzMjsKLSAgICAgIGhkLnNlZ3N6ID0gMDsKLSAgICAgIGhkLnNlZ3NoID0gMDsKLSAgICAgIGhkLmNwdSA9ICJTSCI7Ci0gICAgICBhZGRyc2l6ZSA9IDQ7Ci0gICAgICB0b29sbmFtZSA9ICJDX1NIIjsKLSAgICAgIHJuYW1lcyA9IHJuYW1lX3NoOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoISBiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgJiBFWEVDX1ApCi0gICAgewotICAgICAgaGQuZXAgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhkLmVwID0gMTsKLSAgICAgIGhkLnVhbiA9IDA7Ci0gICAgICBoZC5zYSA9IDA7Ci0gICAgICBoZC5zYWQgPSAwOwotICAgICAgaGQuYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gICAgfQotCi0gIGhkLm9zID0gIiI7Ci0gIGhkLnN5cyA9ICIiOwotICBoZC5tbiA9IHN0cmlwX3N1ZmZpeCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIHN5c3JvZmZfc3dhcF9oZF9vdXQgKGZpbGUsICZoZCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyX3NoIChwLCBzZWMpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBJVF9zaCBzaDsKLSAgc2gudW5pdCA9IDA7Ci0gIHNoLnNlY3Rpb24gPSBzZWMtPm51bWJlcjsKLSNpZmRlZiBGT09QMQotICBzaC5zZWN0aW9uID0gMDsKLSNlbmRpZgotICBzeXNyb2ZmX3N3YXBfc2hfb3V0IChmaWxlLCAmc2gpOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cl9vYiAocCwgc2VjdGlvbikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgaW50IGZpcnN0ID0gMTsKLSAgdW5zaWduZWQgY2hhciBzdHVmZlsyMDBdOwotCi0gIGkgPSAwOwotICB3aGlsZSAoaSA8IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgc3RydWN0IElUX29iIG9iOwotICAgICAgaW50IHRvZG8gPSAyMDA7CQkvKiBDb3B5IGluIDIwMCBieXRlIGx1bXBzICovCi0gICAgICBvYi5zcGFyZSA9IDA7Ci0gICAgICBpZiAoaSArIHRvZG8gPiBzZWN0aW9uLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplKQotCXRvZG8gPSBzZWN0aW9uLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplIC0gaTsKLQotICAgICAgaWYgKGZpcnN0KQotCXsKLQkgIG9iLnNhZiA9IDE7Ci0JICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKLQkgICAgb2IuYWRkcmVzcyA9IHNlY3Rpb24tPmFkZHJlc3M7Ci0JICBlbHNlCi0JICAgIG9iLmFkZHJlc3MgPSAwOwotCi0JICBmaXJzdCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9iLnNhZiA9IDA7Ci0JfQotCi0gICAgICBvYi5jcGYgPSAwOwkJLyogTmV2ZXIgY29tcHJlc3MgKi8KLSAgICAgIG9iLmRhdGEubGVuID0gdG9kbzsKLSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbi0+YmZkX3NlY3Rpb24sIHN0dWZmLCBpLCB0b2RvKTsKLSAgICAgIG9iLmRhdGEuZGF0YSA9IHN0dWZmOwotICAgICAgc3lzcm9mZl9zd2FwX29iX291dCAoZmlsZSwgJm9iIC8qLCBpICsgdG9kbyA8IHNlY3Rpb24tPnNpemUgKi8gKTsKLSAgICAgIGkgKz0gdG9kbzsKLSAgICB9Ci0gIC8qIE5vdyBmaWxsIHRoZSByZXN0IHdpdGggYmxhbmtzICovCi0gIHdoaWxlIChpIDwgKGJmZF9zaXplX3R5cGUpIHNlY3Rpb24tPnNpemUpCi0gICAgewotICAgICAgc3RydWN0IElUX29iIG9iOwotICAgICAgaW50IHRvZG8gPSAyMDA7CQkvKiBDb3B5IGluIDIwMCBieXRlIGx1bXBzICovCi0gICAgICBvYi5zcGFyZSA9IDA7Ci0gICAgICBpZiAoaSArIHRvZG8gPiAoYmZkX3NpemVfdHlwZSkgc2VjdGlvbi0+c2l6ZSkKLQl0b2RvID0gc2VjdGlvbi0+c2l6ZSAtIGk7Ci0gICAgICBvYi5zYWYgPSAwOwotCi0gICAgICBvYi5jcGYgPSAwOwkJLyogTmV2ZXIgY29tcHJlc3MgKi8KLSAgICAgIG9iLmRhdGEubGVuID0gdG9kbzsKLSAgICAgIG1lbXNldCAoc3R1ZmYsIDAsIHRvZG8pOwotICAgICAgb2IuZGF0YS5kYXRhID0gc3R1ZmY7Ci0gICAgICBzeXNyb2ZmX3N3YXBfb2Jfb3V0IChmaWxlLCAmb2IpOwotICAgICAgaSArPSB0b2RvOwotICAgIH0KLSAgLyogTm93IGZpbGwgdGhlIHJlc3Qgd2l0aCBibGFua3MgKi8KLQotfQotCi1zdGF0aWMgdm9pZAotd3JfcmwgKHB0ciwgc2VjKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7Ci17Ci0gIGludCBuciA9IHNlYy0+bnJlbG9jczsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX3JlbG9jICpyID0gc2VjLT5yZWxvY3MgKyBpOwotICAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpyZWY7Ci0gICAgICBzdHJ1Y3QgSVRfcmwgcmw7Ci0gICAgICBybC5hcG9sID0gMDsKLSAgICAgIHJsLmJvdW5kYXJ5ID0gMDsKLSAgICAgIHJsLnNlZ21lbnQgPSAxOwotICAgICAgcmwuc2lnbiA9IDA7Ci0gICAgICBybC5jaGVjayA9IDA7Ci0gICAgICBybC5hZGRyID0gci0+b2Zmc2V0OwotICAgICAgcmwuYml0bG9jID0gMDsKLSAgICAgIHJsLmZsZW4gPSAzMjsJCS8qIFNIIFNwZWNpZmljICovCi0gICAgICAvKiBXaGF0IHNvcnQgb2YgcmVsb2MgPyBMb29rIGluIHRoZSBzZWN0aW9uIHRvIGZpbmQgb3V0ICovCi0gICAgICByZWYgPSByLT5zeW1ib2w7Ci0gICAgICBpZiAocmVmLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCi0JewotCSAgcmwuYmNvdW50ID0gNDsJLyogQWx3YXlzIDQgZm9yIHVzICovCi0JICBybC5vcCA9IE9QX0VYVF9SRUY7Ci0JICBybC5zeW1uID0gcmVmLT5lcl9udW1iZXI7Ci0JfQotICAgICAgZWxzZSBpZiAocmVmLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKLQl7Ci0JICBybC5iY291bnQgPSAxMTsJLyogQWx3YXlzIDExIGZvciB1cyAqLwotCSAgcmwub3AgPSBPUF9TRUNfUkVGOwotCSAgcmwuc2VjbiA9IHJlZi0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkgIHJsLmNvcGNvZGVfaXNfMyA9IDM7Ci0JICBybC5hbGVuZ3RoX2lzXzQgPSA0OwotCSAgcmwuYWRkZW5kID0gcmVmLT53aGVyZS0+b2Zmc2V0IC0gcmVmLT53aGVyZS0+c2VjdGlvbi0+YWRkcmVzczsKLQkgIHJsLmFvcGNvZGVfaXNfMHgyMCA9IDB4MjA7Ci0JfQotCi0gICAgICBlbHNlCi0JewotCSAgcmwuYmNvdW50ID0gMTE7CS8qIEFsd2F5cyAxMSBmb3IgdXMgKi8KLQkgIHJsLm9wID0gT1BfU0VDX1JFRjsKLQkgIHJsLnNlY24gPSByZWYtPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0JICBybC5jb3Bjb2RlX2lzXzMgPSAzOwotCSAgcmwuYWxlbmd0aF9pc180ID0gNDsKLQkgIHJsLmFkZGVuZCA9IC1yZWYtPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzOwotCSAgcmwuYW9wY29kZV9pc18weDIwID0gMHgyMDsKLQl9Ci0gICAgICBybC5lbmQgPSAweGZmOwotICAgICAgaWYgKHJsLm9wID09IE9QX1NFQ19SRUYKLQkgIHx8IHJsLm9wID09IE9QX0VYVF9SRUYpCi0JewotCSAgc3lzcm9mZl9zd2FwX3JsX291dCAoZmlsZSwgJnJsKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3Jfb2JqZWN0X2JvZHkgKHApCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotewotICBpbnQgaTsKLSAgZm9yIChpID0gMTsgaSA8IHAtPm5zZWN0aW9uczsgaSsrKQotICAgIHsKLSAgICAgIHdyX3NoIChwLCBwLT5zZWN0aW9ucyArIGkpOwotICAgICAgd3Jfb2IgKHAsIHAtPnNlY3Rpb25zICsgaSk7Ci0gICAgICB3cl9ybCAocCwgcC0+c2VjdGlvbnMgKyBpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9kcHNfc3RhcnQgKHNmaWxlLCBzZWN0aW9uLCBzY29wZSwgdHlwZSwgbmVzdCkKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqc2NvcGU7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgbmVzdDsKLXsKLSAgc3RydWN0IElUX2RwcyBkcHM7Ci0gIGRwcy5lbmQgPSAwOwotICBkcHMub3B0ID0gMDsKLSAgZHBzLnR5cGUgPSB0eXBlOwotICBpZiAoc2NvcGUtPnNlYykKLSAgICB7Ci0gICAgICBkcHMuc2FuID0gc2NvcGUtPnNlYy0+bnVtYmVyOwotICAgICAgZHBzLmFkZHJlc3MgPSBzY29wZS0+b2Zmc2V0IC0gZmluZF9iYXNlIChzZmlsZSwgc2NvcGUtPnNlYyk7Ci0gICAgICBkcHMuYmxvY2tfc2l6ZSA9IHNjb3BlLT5zaXplOwotICAgICAgaWYgKGRlYnVnKQotCXsKLQkgIHByaW50ZiAoIkRQUyAlcyAlZCAleFxuIiwKLQkJICBzZmlsZS0+bmFtZSwKLQkJICBuZXN0LAotCQkgIGRwcy5hZGRyZXNzKTsKLQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkcHMuc2FuID0gMDsKLSAgICAgIGRwcy5hZGRyZXNzID0gMDsKLSAgICAgIGRwcy5ibG9ja19zaXplID0gMDsKLSAgICB9Ci0KLSAgZHBzLm5lc3RpbmcgPSBuZXN0OwotICBkcHMubmVnID0gMHgxMDAxOwotICBzeXNyb2ZmX3N3YXBfZHBzX291dCAoZmlsZSwgJmRwcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9kcHNfZW5kIChzZWN0aW9uLCBzY29wZSwgdHlwZSkKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOwotICAgICBpbnQgdHlwZTsKLXsKLSAgc3RydWN0IElUX2RwcyBkcHM7Ci0gIGRwcy5lbmQgPSAxOwotICBkcHMudHlwZSA9IHR5cGU7Ci0gIHN5c3JvZmZfc3dhcF9kcHNfb3V0IChmaWxlLCAmZHBzKTsKLX0KLQotc3RhdGljIGludCAqCi1uaW50cyAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHJldHVybiAoaW50ICopICh4Y2FsbG9jIChzaXplb2YgKGludCksIHgpKTsKLX0KLQotc3RhdGljIHZvaWQgd2Fsa190cmVlX3N5bWJvbCAoKTsKLXN0YXRpYyB2b2lkCi13YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOwotICAgICBpbnQgbmVzdDsKLXsKLSAgc3dpdGNoICh0eXBlLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfc2VjZGVmX3R5cGU6Ci0gICAgY2FzZSBjb2ZmX2Jhc2ljX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0KLQlzd2l0Y2ggKHR5cGUtPnUuYmFzaWMpCi0JICB7Ci0JICBjYXNlIFRfTlVMTDoKLQkgIGNhc2UgVF9WT0lEOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9WT0lEOwotCSAgICBkYnQuc2lnbiA9IEJUWVBFX1VOU1BFQzsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9DSEFSOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9DSEFSOwotCSAgICBkYnQuc2lnbiA9IEJUWVBFX1VOU1BFQzsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9TSE9SVDoKLQkgIGNhc2UgVF9JTlQ6Ci0JICBjYXNlIFRfTE9ORzoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfSU5UOwotCSAgICBkYnQuc2lnbiA9IFNJR05fU0lHTkVEOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX0ZMT0FUOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9GTE9BVDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9TSU5HTEU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX0RPVUJMRToKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfRkxPQVQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfRE9VQkxFOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9MTkdEQkw6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0ZMT0FUOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX0VYVEVOREVEOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9VQ0hBUjoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfQ0hBUjsKLQkgICAgZGJ0LnNpZ24gPSBTSUdOX1VOU0lHTkVEOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX1VTSE9SVDoKLQkgIGNhc2UgVF9VSU5UOgotCSAgY2FzZSBUX1VMT05HOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9JTlQ7Ci0JICAgIGRidC5zaWduID0gU0lHTl9VTlNJR05FRDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCSAgICBicmVhazsKLQkgIH0KLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHB0IGRwdDsKLQl3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLT51LnBvaW50ZXIucG9pbnRzX3RvLCBuZXN0ICsgMSk7Ci0JZHB0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZHB0X291dCAoZmlsZSwgJmRwdCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIGNvZmZfZnVuY3Rpb25fdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGZwIGRmcDsKLQlzdHJ1Y3QgY29mZl9zeW1ib2wgKnBhcmFtOwotCWRmcC5lbmQgPSAwOwotCWRmcC5zcGFyZSA9IDA7Ci0JZGZwLm5wYXJhbXMgPSB0eXBlLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMtPm52YXJzOwotCWRmcC5uZWcgPSAweDEwMDE7Ci0KLQl3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMsIG5lc3QgKyAxKTsKLQotCXN5c3JvZmZfc3dhcF9kZnBfb3V0IChmaWxlLCAmZGZwKTsKLQotCWZvciAocGFyYW0gPSB0eXBlLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMtPnZhcnNfaGVhZDsKLQkgICAgIHBhcmFtOwotCSAgICAgcGFyYW0gPSBwYXJhbS0+bmV4dCkKLQkgIHsKLQkgICAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIDAsIHBhcmFtLCBuZXN0KTsKLQkgIH0KLQlkZnAuZW5kID0gMTsKLQlzeXNyb2ZmX3N3YXBfZGZwX291dCAoZmlsZSwgJmRmcCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIGNvZmZfc3RydWN0ZGVmX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0Jc3RydWN0IElUX2RkcyBkZHM7Ci0Jc3RydWN0IGNvZmZfc3ltYm9sICptZW1iZXI7Ci0JZGRzLnNwYXJlID0gMDsKLQlkYnQuYnR5cGUgPSBCVFlQRV9TVFJVQ1Q7Ci0JZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOwotCWRidC5zaWduID0gU0lHTl9VTlNQRUM7Ci0JZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCWRidC5zaWQgPSBnZXRfbWVtYmVyX2lkICh0eXBlLT51LmFzdHJ1Y3RkZWYuaWR4KTsKLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLQlkZHMuZW5kID0gMDsKLQlkZHMubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kZHNfb3V0IChmaWxlLCAmZGRzKTsKLQlmb3IgKG1lbWJlciA9IHR5cGUtPnUuYXN0cnVjdGRlZi5lbGVtZW50cy0+dmFyc19oZWFkOwotCSAgICAgbWVtYmVyOwotCSAgICAgbWVtYmVyID0gbWVtYmVyLT5uZXh0KQotCSAgewotCSAgICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgMCwgbWVtYmVyLCBuZXN0ICsgMSk7Ci0JICB9Ci0KLQlkZHMuZW5kID0gMTsKLQlzeXNyb2ZmX3N3YXBfZGRzX291dCAoZmlsZSwgJmRkcyk7Ci0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zdHJ1Y3RyZWZfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQlkYnQuYnR5cGUgPSBCVFlQRV9UQUc7Ci0JZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOwotCWRidC5zaWduID0gU0lHTl9VTlNQRUM7Ci0JZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCWlmICh0eXBlLT51LmFzdHJ1Y3RyZWYucmVmKQotCSAgewotCSAgICBkYnQuc2lkID0gZ2V0X21lbWJlcl9pZCAodHlwZS0+dS5hc3RydWN0cmVmLnJlZi0+bnVtYmVyKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGRidC5zaWQgPSAwOwotCSAgfQotCi0JZGJ0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGFyIGRhcjsKLQlpbnQgajsKLQlpbnQgZGltcyA9IDE7CQkvKiBPbmx5IG91dHB1dCBvbmUgZGltZW5zaW9uIGF0IGEgdGltZSAqLwotCWRhci5kaW1zID0gZGltczsKLQlkYXIudmFyaWFibGUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLnN1YnR5cGUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLnNwYXJlID0gbmludHMgKGRpbXMpOwotCWRhci5tYXhfdmFyaWFibGUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1heHNwYXJlID0gbmludHMgKGRpbXMpOwotCWRhci5tYXggPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1pbl92YXJpYWJsZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWluID0gbmludHMgKGRpbXMpOwotCWRhci5taW5zcGFyZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIubmVnID0gMHgxMDAxOwotCWRhci5sZW5ndGggPSB0eXBlLT5zaXplIC8gdHlwZS0+dS5hcnJheS5kaW07Ci0JZm9yIChqID0gMDsgaiA8IGRpbXM7IGorKykKLQkgIHsKLQkgICAgZGFyLnZhcmlhYmxlW2pdID0gVkFSSUFCTEVfRklYRUQ7Ci0JICAgIGRhci5zdWJ0eXBlW2pdID0gU1VCX0lOVEVHRVI7Ci0JICAgIGRhci5zcGFyZVtqXSA9IDA7Ci0JICAgIGRhci5tYXhfdmFyaWFibGVbal0gPSAwOwotCSAgICBkYXIubWF4W2pdID0gdHlwZS0+dS5hcnJheS5kaW07Ci0JICAgIGRhci5taW5fdmFyaWFibGVbal0gPSAwOwotCSAgICBkYXIubWluW2pdID0gMTsJLyogV2h5IGlzbid0IHRoaXMgMCA/ICovCi0JICB9Ci0Jd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZS0+dS5hcnJheS5hcnJheV9vZiwgbmVzdCArIDEpOwotCXN5c3JvZmZfc3dhcF9kYXJfb3V0IChmaWxlLCAmZGFyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtZGVmX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0Jc3RydWN0IElUX2RlbiBkZW47Ci0Jc3RydWN0IGNvZmZfc3ltYm9sICptZW1iZXI7Ci0JZGJ0LmJ0eXBlID0gQlRZUEVfRU5VTTsKLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKLQlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYWVudW1kZWYuaWR4KTsKLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLQotCWRlbi5lbmQgPSAwOwotCWRlbi5uZWcgPSAweDEwMDE7Ci0JZGVuLnNwYXJlID0gMDsKLQlzeXNyb2ZmX3N3YXBfZGVuX291dCAoZmlsZSwgJmRlbik7Ci0JZm9yIChtZW1iZXIgPSB0eXBlLT51LmFlbnVtZGVmLmVsZW1lbnRzLT52YXJzX2hlYWQ7Ci0JICAgICBtZW1iZXI7Ci0JICAgICBtZW1iZXIgPSBtZW1iZXItPm5leHQpCi0JICB7Ci0JICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBtZW1iZXIsIG5lc3QgKyAxKTsKLQkgIH0KLQotCWRlbi5lbmQgPSAxOwotCXN5c3JvZmZfc3dhcF9kZW5fb3V0IChmaWxlLCAmZGVuKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZW51bXJlZl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZGJ0OwotCWRidC5idHlwZSA9IEJUWVBFX1RBRzsKLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKLQlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYWVudW1yZWYucmVmLT5udW1iZXIpOwotCWRidC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogT2Jzb2xldGUgPyAKLSAgIHN0YXRpYyB2b2lkCi0gICBkdHlfc3RhcnQgKCkKLSAgIHsKLSAgIHN0cnVjdCBJVF9kdHkgZHR5OwotICAgZHR5LmVuZCA9IDA7Ci0gICBkdHkubmVnID0gMHgxMDAxOwotICAgZHR5LnNwYXJlID0gMDsKLSAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLSAgIH0KLQotICAgc3RhdGljIHZvaWQKLSAgIGR0eV9zdG9wICgpCi0gICB7Ci0gICBzdHJ1Y3QgSVRfZHR5IGR0eTsKLSAgIGR0eS5lbmQgPSAwOwotICAgZHR5Lm5lZyA9IDB4MTAwMTsKLSAgIGR0eS5lbmQgPSAxOwotICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgfQotCi0KLSAgIHN0YXRpYyB2b2lkCi0gICBkdW1wX3RyZWVfc3RydWN0dXJlIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KQotICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOwotICAgaW50IG5lc3Q7Ci0gICB7Ci0gICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLSAgIHsKLQotCi0gICB9Ci0KLSAgIH0KLSAqLwotCi1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3R5cGUgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpCi0KLSAgICAgc3RydWN0Ci0gICAgIGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgICAgc3RydWN0IGNvZmZfdHlwZSAqdHlwZTsKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotICAgIHsKLQotICAgICAgc3RydWN0IElUX2R0eSBkdHk7Ci0gICAgICBkdHkuZW5kID0gMDsKLSAgICAgIGR0eS5uZWcgPSAweDEwMDE7Ci0KLSAgICAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLSAgICAgIHdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpOwotICAgICAgZHR5LmVuZCA9IDE7Ci0gICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0KLSAgICAgIHdyX2Rwc19zdGFydCAoc2ZpbGUsCi0JCSAgICBzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAotCQkgICAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsCi0JCSAgICBCTE9DS19UWVBFX0ZVTkNUSU9OLCBuZXN0KTsKLSAgICAgIHdyX2Rwc19zdGFydCAoc2ZpbGUsIHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKLQkJICAgIEJMT0NLX1RZUEVfQkxPQ0ssIG5lc3QpOwotICAgICAgd2Fsa190cmVlX3Njb3BlIChzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAotCQkgICAgICAgc2ZpbGUsCi0JCSAgICAgICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKLQkJICAgICAgIG5lc3QgKyAxLCBCTE9DS19UWVBFX0JMT0NLKTsKLQotICAgICAgd3JfZHBzX2VuZCAoc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKLQkJICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKLQkJICBCTE9DS19UWVBFX0JMT0NLKTsKLSAgICAgIHdyX2Rwc19lbmQgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsIEJMT0NLX1RZUEVfRlVOQ1RJT04pOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IElUX2R0eSBkdHk7Ci0gICAgICBkdHkuZW5kID0gMDsKLSAgICAgIGR0eS5uZWcgPSAweDEwMDE7Ci0gICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0gICAgICB3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KTsKLSAgICAgIGR0eS5lbmQgPSAxOwotICAgICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgIH0KLQotfQotCi0KLQotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCBzZWN0aW9uLCBzeW1ib2wsIG5lc3QpCi0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICAgIGludCBuZXN0OwotewotICBzdHJ1Y3QgSVRfZHN5IGRzeTsKLQotICBtZW1zZXQoJmRzeSwgMCwgc2l6ZW9mKGRzeSkpOwotICBkc3kubmVzdGluZyA9IG5lc3Q7Ci0KLSAgc3dpdGNoIChzeW1ib2wtPnR5cGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl9mdW5jdGlvbl90eXBlOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9GVU5DOwotICAgICAgZHN5LmFzc2lnbiA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0cmVmX3R5cGU6Ci0gICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKLSAgICBjYXNlIGNvZmZfYmFzaWNfdHlwZToKLSAgICBjYXNlIGNvZmZfZW51bXJlZl90eXBlOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9WQVI7Ci0gICAgICBkc3kuYXNzaWduID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtZGVmX3R5cGU6Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX1RBRzsKLSAgICAgIGRzeS5hc3NpZ24gPSAwOwotICAgICAgZHN5Lm1hZ2ljID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zdHJ1Y3RkZWZfdHlwZToKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfVEFHOwotICAgICAgZHN5LmFzc2lnbiA9IDA7Ci0gICAgICBkc3kubWFnaWMgPSBzeW1ib2wtPnR5cGUtPnUuYXN0cnVjdGRlZi5pc3N0cnVjdCA/IDAgOiAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3NlY2RlZl90eXBlOgotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdCkKLSAgICB7Ci0gICAgICBkc3kuYXNzaWduID0gMDsKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfTUVNQkVSOwotICAgIH0KLSAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW0pCi0gICAgewotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9FTlVNOwotICAgICAgZHN5LmFzc2lnbiA9IDA7Ci0gICAgICBkc3kuZXZhbGxlbiA9IDQ7Ci0gICAgICBkc3kuZXZhbHVlID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OwotICAgIH0KLQotICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc3RydWN0ZGVmX3R5cGUKLSAgICAgIHx8IHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfZW50YWcKLSAgICAgIHx8IHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfc3RydGFnKQotICAgIHsKLSAgICAgIGRzeS5zbnVtYmVyID0gZ2V0X21lbWJlcl9pZCAoc3ltYm9sLT5udW1iZXIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRzeS5zbnVtYmVyID0gZ2V0X29yZGluYXJ5X2lkIChzeW1ib2wtPm51bWJlcik7Ci0gICAgfQotCi0KLSAgZHN5LnNuYW1lID0gc3ltYm9sLT5uYW1lWzBdID09ICdfJyA/IHN5bWJvbC0+bmFtZSArIDEgOiBzeW1ib2wtPm5hbWU7Ci0KLSAgc3dpdGNoIChzeW1ib2wtPnZpc2libGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl92aXNfY29tbW9uOgotICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKLSAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1NUQVRJQ19FWFRfREVGOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19leHRfcmVmOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fU1RBVElDX0VYVF9SRUY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6Ci0gICAgICBkc3kuYWluZm8gPSBBSU5GT19TVEFUSUNfSU5UOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvOgotICAgIGNhc2UgY29mZl92aXNfYXV0b3BhcmFtOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fQVVUTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfcmVnaXN0ZXI6Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKLSAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1JFRzsKLSAgICAgIGJyZWFrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc190YWc6Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0OgotICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX2VudW06Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGRzeS5kbGVuZ3RoID0gc3ltYm9sLT50eXBlLT5zaXplOwotICBzd2l0Y2ggKHN5bWJvbC0+d2hlcmUtPndoZXJlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtb3J5OgotCi0gICAgICBkc3kuc2VjdGlvbiA9IHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLSNpZmRlZiBGT09QCi0gICAgICBkc3kuc2VjdGlvbiA9IDA7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OgotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bToKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RhY2s6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3JlZ2lzdGVyOgotICAgIGNhc2UgY29mZl93aGVyZV91bmtub3duOgotICAgIGNhc2UgY29mZl93aGVyZV9zdHJ0YWc6Ci0KLSAgICBjYXNlIGNvZmZfd2hlcmVfZW50YWc6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3R5cGVkZWY6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHN3aXRjaCAoc3ltYm9sLT53aGVyZS0+d2hlcmUpCi0gICAgewotICAgIGNhc2UgY29mZl93aGVyZV9tZW1vcnk6Ci0gICAgICBkc3kuYWRkcmVzcyA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldCAtIGZpbmRfYmFzZSAoc2ZpbGUsIHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0YWNrOgotICAgICAgZHN5LmFkZHJlc3MgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDoKLQotCi0gICAgICBpZiAoc3ltYm9sLT53aGVyZS0+Yml0c2l6ZSkKLQl7Ci0JICBpbnQgYml0cyA9IChzeW1ib2wtPndoZXJlLT5vZmZzZXQgKiA4ICsgc3ltYm9sLT53aGVyZS0+Yml0b2Zmc2V0KTsKLQkgIGRzeS5iaXR1bml0ID0gMTsKLQkgIGRzeS5maWVsZF9sZW4gPSBzeW1ib2wtPndoZXJlLT5iaXRzaXplOwotCSAgZHN5LmZpZWxkX29mZiA9IChiaXRzIC8gMzIpICogNDsKLQkgIGRzeS5maWVsZF9iaXRvZmYgPSBiaXRzICUgMzI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRzeS5iaXR1bml0ID0gMDsKLQotCSAgZHN5LmZpZWxkX2xlbiA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKLQkgIGRzeS5maWVsZF9vZmYgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOgotICAgICAgLyogICAgICBkc3kuYml0dW5pdCA9IDA7Ci0gICAgICAgICBkc3kuZmllbGRfbGVuICA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKLSAgICAgICAgIGRzeS5maWVsZF9vZmYgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7ICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfcmVnaXN0ZXI6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3Vua25vd246Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0cnRhZzoKLQotICAgIGNhc2UgY29mZl93aGVyZV9lbnRhZzoKLSAgICBjYXNlIGNvZmZfd2hlcmVfdHlwZWRlZjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfcmVnaXN0ZXIpCi0gICAgZHN5LnJlZyA9IHJuYW1lc1tzeW1ib2wtPndoZXJlLT5vZmZzZXRdOwotCi0gIHN3aXRjaCAoc3ltYm9sLT52aXNpYmxlLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfdmlzX2NvbW1vbjoKLSAgICAgIC8qIFdlIGRvIHRoaXMgJ2NhdXNlIGNvbW1vbiBDIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgZXh0ZGVmcyAqLwotICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9yZWY6Ci0KLSAgICAgIGRzeS5lbmFtZSA9IHN5bWJvbC0+bmFtZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG9wYXJhbToKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfUEFSQU1FVEVSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6Ci0KLSAgICBjYXNlIGNvZmZfdmlzX2F1dG86Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdpc3RlcjoKLSAgICBjYXNlIGNvZmZfdmlzX3RhZzoKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgZHN5LnNmbiA9IDA7Ci0gIGRzeS5zbG4gPSAyOwotCi0gIGRzeS5uZWcgPSAweDEwMDE7Ci0KLQotICBzeXNyb2ZmX3N3YXBfZHN5X291dCAoZmlsZSwgJmRzeSk7Ci0KLSAgd2Fsa190cmVlX3R5cGUgKHNmaWxlLCBzeW1ib2wsIHN5bWJvbC0+dHlwZSwgbmVzdCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV9zY29wZSAoc2VjdGlvbiwgc2ZpbGUsIHNjb3BlLCBuZXN0LCB0eXBlKQotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpzY29wZTsKLSAgICAgaW50IG5lc3Q7Ci0gICAgIGludCB0eXBlOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnM7Ci0gIHN0cnVjdCBjb2ZmX3Njb3BlICpjaGlsZDsKLQotICBpZiAoc2NvcGUtPnZhcnNfaGVhZAotICAgICAgfHwgKHNjb3BlLT5saXN0X2hlYWQgJiYgc2NvcGUtPmxpc3RfaGVhZC0+dmFyc19oZWFkKSkKLSAgICB7Ci0gICAgICB3cl9kcHNfc3RhcnQgKHNmaWxlLCBzZWN0aW9uLCBzY29wZSwgdHlwZSwgbmVzdCk7Ci0KLSAgICAgIGlmIChuZXN0ID09IDApCi0Jd3JfZ2xvYmFscyAodHJlZSwgc2ZpbGUsIG5lc3QgKyAxKTsKLQotICAgICAgZm9yICh2YXJzID0gc2NvcGUtPnZhcnNfaGVhZDsgdmFyczsgdmFycyA9IHZhcnMtPm5leHQpCi0JewotCSAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIHNlY3Rpb24sIHZhcnMsIG5lc3QpOwotCX0KLQotICAgICAgZm9yIChjaGlsZCA9IHNjb3BlLT5saXN0X2hlYWQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQotCXsKLQkgIHdhbGtfdHJlZV9zY29wZSAoc2VjdGlvbiwgc2ZpbGUsIGNoaWxkLCBuZXN0ICsgMSwgQkxPQ0tfVFlQRV9CTE9DSyk7Ci0JfQotCi0gICAgICB3cl9kcHNfZW5kIChzZWN0aW9uLCBzY29wZSwgdHlwZSk7Ci0gICAgfQotfQotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV9zZmlsZSAoc2VjdGlvbiwgc2ZpbGUpCi0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLXsKLSAgd2Fsa190cmVlX3Njb3BlIChzZWN0aW9uLCBzZmlsZSwgc2ZpbGUtPnNjb3BlLCAwLCBCTE9DS19UWVBFX0NPTVBVTklUKTsKLQotfQotCi1zdGF0aWMgdm9pZAotd3JfcHJvZ3JhbV9zdHJ1Y3R1cmUgKHAsIHNmaWxlKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotewotCi0gIHdhbGtfdHJlZV9zZmlsZSAocC0+c2VjdGlvbnMgKyA0LCBzZmlsZSk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdyX2R1IChwLCBzZmlsZSwgbikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IG47Ci17Ci0gIHN0cnVjdCBJVF9kdSBkdTsKLSAgaW50IGxpbTsKLSNpZiAwCi0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICBzdGF0aWMgaW50IGluY2l0ID0gMHg1MDAwMDA7Ci0gIGludCB1c2VkID0gMDsKLSNlbmRpZgotICBpbnQgaTsKLSAgaW50IGo7Ci0gIHVuc2lnbmVkIGludCAqbG93ZXN0ID0gKHVuc2lnbmVkICopIG5pbnRzIChwLT5uc2VjdGlvbnMpOwotICB1bnNpZ25lZCBpbnQgKmhpZ2hlc3QgPSAodW5zaWduZWQgKikgbmludHMgKHAtPm5zZWN0aW9ucyk7Ci0gIGR1LmZvcm1hdCA9IGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1AgPyAwIDogMTsKLSAgZHUub3B0aW1pemVkID0gMDsKLSAgZHUuc3RhY2tmcm10ID0gMDsKLSAgZHUuc3BhcmUgPSAwOwotICBkdS51bml0ID0gbjsKLSAgZHUuc2VjdGlvbnMgPSBwLT5uc2VjdGlvbnMgLSAxOwotICBkdS5zYW4gPSAoaW50ICopIHhjYWxsb2MgKHNpemVvZiAoaW50KSwgZHUuc2VjdGlvbnMpOwotICBkdS5hZGRyZXNzID0gbmludHMgKGR1LnNlY3Rpb25zKTsKLSAgZHUubGVuZ3RoID0gbmludHMgKGR1LnNlY3Rpb25zKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZHUuc2VjdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICBsb3dlc3RbaV0gPSB+MDsKLSAgICAgIGhpZ2hlc3RbaV0gPSAwOwotICAgIH0KLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZCB0cnkgYW5kIHdvcmsgb3V0IHRoZSBleHRlbnRzIGluIHRoaXMKLSAgICAgc291cmNlIGZpbGUgKi8KLSNpZiAwCi0gIGZvciAoc3ltYm9sID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7Ci0gICAgICAgc3ltYm9sOwotICAgICAgIHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc2VjZGVmX3R5cGUpCi0JewotCSAgdW5zaWduZWQgaW50IGxvdyA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKLQkgIHVuc2lnbmVkIGludCBoaWdoID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0ICsgc3ltYm9sLT50eXBlLT5zaXplIC0gMTsKLQkgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb24gPSBzeW1ib2wtPndoZXJlLT5zZWN0aW9uOwotCi0JICBpbnQgc24gPSBzZWN0aW9uLT5udW1iZXI7Ci0JICBpZiAobG93IDwgbG93ZXN0W3NuXSkKLQkgICAgbG93ZXN0W3NuXSA9IGxvdzsKLQkgIGlmIChoaWdoID4gaGlnaGVzdFtzbl0pCi0JICAgIGhpZ2hlc3Rbc25dID0gaGlnaDsKLQl9Ci0gICAgfQotCi0KLSAgZm9yIChpID0gMDsgaSA8IGR1LnNlY3Rpb25zOyBpKyspCi0gICAgewotICAgICAgaWYgKGhpZ2hlc3RbaV0gPT0gMCkKLQl7Ci0JICBsb3dlc3RbaV0gPSBoaWdoZXN0W2ldID0gaW5jaXQ7Ci0JfQotICAgICAgZHUuc2FuW3VzZWRdID0gaTsKLSAgICAgIGR1Lmxlbmd0aFt1c2VkXSA9IGhpZ2hlc3RbaV0gLSBsb3dlc3RbaV07Ci0gICAgICBkdS5hZGRyZXNzW3VzZWRdID0gYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCA/IGxvd2VzdFtpXSA6IDA7Ci0gICAgICBpZiAoZGVidWcpCi0JewotCSAgcHJpbnRmICgiIHNlY3Rpb24gJTZzIDB4JTA4eC4uMHglMDh4XG4iLAotCQkgIHAtPnNlY3Rpb25zW2kgKyAxXS5uYW1lLAotCQkgIGxvd2VzdFtpXSwKLQkJICBoaWdoZXN0W2ldKTsKLQl9Ci0gICAgICB1c2VkKys7Ci0gICAgfQotCi0jZW5kaWYKLSAgbGltID0gZHUuc2VjdGlvbnM7Ci0gIGZvciAoaiA9IDA7IGogPCBsaW07IGorKykKLSAgICB7Ci0gICAgICBpbnQgc3JjID0gajsKLSAgICAgIGludCBkc3QgPSBqOwotICAgICAgZHUuc2FuW2RzdF0gPSBkc3Q7Ci0gICAgICBpZiAoc2ZpbGUtPnNlY3Rpb25bc3JjXS5pbml0KQotCXsKLQkgIGR1Lmxlbmd0aFtkc3RdCi0JICAgID0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5oaWdoIC0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5sb3cgKyAxOwotCSAgZHUuYWRkcmVzc1tkc3RdCi0JICAgID0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5sb3c7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGR1Lmxlbmd0aFtkc3RdID0gMDsKLQkgIGR1LmFkZHJlc3NbZHN0XSA9IDA7Ci0JfQotICAgICAgaWYgKGRlYnVnKQotCXsKLQkgIGlmIChzZmlsZS0+c2VjdGlvbltzcmNdLnBhcmVudCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiBzZWN0aW9uICU2cyAweCUwOHguLjB4JTA4eFxuIiwKLQkJICAgICAgc2ZpbGUtPnNlY3Rpb25bc3JjXS5wYXJlbnQtPm5hbWUsCi0JCSAgICAgIGR1LmFkZHJlc3NbZHN0XSwKLQkJICAgICAgZHUuYWRkcmVzc1tkc3RdICsgZHUubGVuZ3RoW2RzdF0gLSAxKTsKLQkgICAgfQotCX0KLSAgICAgIGR1LnNlY3Rpb25zID0gZHN0ICsgMTsKLSAgICB9Ci0KLSAgZHUudG9vbCA9ICJjX2djYyI7Ci0gIGR1LmRhdGUgPSBEQVRFOwotCi0gIHN5c3JvZmZfc3dhcF9kdV9vdXQgKGZpbGUsICZkdSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9kdXMgKHAsIHNmaWxlKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotewotCi0gIHN0cnVjdCBJVF9kdXMgZHVzOwotCi0gIGR1cy5lZm4gPSAweDEwMDE7Ci0gIGR1cy5ucyA9IDE7CQkJLyogcC0+bnNvdXJjZXM7IHNhYyAxNCBqdWwgOTQgKi8KLSAgZHVzLmRyYiA9IG5pbnRzIChkdXMubnMpOwotICBkdXMuZm5hbWUgPSAoY2hhciAqKikgeGNhbGxvYyAoc2l6ZW9mIChjaGFyICopLCBkdXMubnMpOwotICBkdXMuc3BhcmUgPSBuaW50cyAoZHVzLm5zKTsKLSAgZHVzLm5kaXIgPSAwOwotICAvKiBGaW5kIHRoZSBmaWxlbmFtZXMgKi8KLSNpZiAwCi0gIGkgPSAwOwotCi0gIGZvciAoc2ZpbGUgPSBwLT5zb3VyY2VfaGVhZDsKLSAgICAgICBzZmlsZTsKLSAgICAgICBzZmlsZSA9IHNmaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGR1cy5kcmJbaV0gPSAwOwotICAgICAgZHVzLnNwYXJlW2ldID0gMDsKLSAgICAgIGR1cy5mbmFtZVtpXSA9IHNmaWxlLT5uYW1lOwotICAgICAgaSsrOwotICAgIH0KLSNlbHNlCi0gIGR1cy5kcmJbMF0gPSAwOwotICBkdXMuZm5hbWVbMF0gPSBzZmlsZS0+bmFtZTsKLSNlbmRpZgotCi0gIHN5c3JvZmZfc3dhcF9kdXNfb3V0IChmaWxlLCAmZHVzKTsKLQotfQotCi0vKiBGaW5kIHRoZSBvZmZzZXQgb2YgdGhlIC50ZXh0IHNlY3Rpb24gZm9yIHRoaXMgc2ZpbGUgaW4gdGhlCi0gICAudGV4dCBzZWN0aW9uIGZvciB0aGUgb3V0cHV0IGZpbGUgKi8KLQotc3RhdGljIGludAotZmluZF9iYXNlIChzZmlsZSwgc2VjdGlvbikKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotewotICByZXR1cm4gc2ZpbGUtPnNlY3Rpb25bc2VjdGlvbi0+bnVtYmVyXS5sb3c7Ci19Ci1zdGF0aWMgdm9pZAotd3JfZGxuIChwLCBzZmlsZSwgbikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IG47Ci0KLXsKLSNpZiAwCi0gIGlmIChuID09IDApCi0gICAgewotICAgICAgLyogQ291bnQgdXAgYWxsIHRoZSBsaW5lbnVtYmVycyAqLwotICAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeTsKLSAgICAgIGludCBsYyA9IDA7Ci0gICAgICBzdHJ1Y3QgSVRfZGxuIGRsbjsKLQotICAgICAgaW50IGlkeDsKLQotICAgICAgZm9yIChzeSA9IHAtPnN5bWJvbF9saXN0X2hlYWQ7Ci0JICAgc3k7Ci0JICAgc3kgPSBzeS0+bmV4dF9pbl9vZmlsZV9saXN0KQotCXsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKnQgPSBzeS0+dHlwZTsKLQkgIGlmICh0LT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLQkgICAgewotCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmUgKmwgPSB0LT51LmZ1bmN0aW9uLmxpbmVzOwotCSAgICAgIGxjICs9IGwtPm5saW5lczsKLQkgICAgfQotCX0KLQotICAgICAgZGxuLnNmbiA9IG5pbnRzIChsYyk7Ci0gICAgICBkbG4uc2xuID0gbmludHMgKGxjKTsKLSAgICAgIGRsbi5sbG4gPSBuaW50cyAobGMpOwotICAgICAgZGxuLnNlY3Rpb24gPSBuaW50cyAobGMpOwotCi0gICAgICBkbG4uZnJvbV9hZGRyZXNzID0gbmludHMgKGxjKTsKLSAgICAgIGRsbi50b19hZGRyZXNzID0gbmludHMgKGxjKTsKLQotCi0gICAgICBkbG4ubmVnID0gMHgxMDAxOwotCi0gICAgICBkbG4ubmxuID0gbGM7Ci0KLSAgICAgIC8qIFJ1biB0aHJvdWdoIG9uY2UgbW9yZSBhbmQgZmlsbCB1cCB0aGUgc3RydWN0dXJlICovCi0gICAgICBpZHggPSAwOwotICAgICAgZm9yIChzeSA9IHAtPnN5bWJvbF9saXN0X2hlYWQ7Ci0JICAgc3k7Ci0JICAgc3kgPSBzeS0+bmV4dF9pbl9vZmlsZV9saXN0KQotCXsKLQkgIGlmIChzeS0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0JICAgIHsKLQkgICAgICBpbnQgaTsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5lICpsID0gc3ktPnR5cGUtPnUuZnVuY3Rpb24ubGluZXM7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGwtPm5saW5lczsgaSsrKQotCQl7Ci0JCSAgZGxuLnNlY3Rpb25baWR4XSA9IHN5LT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCQkgIGRsbi5zZm5baWR4XSA9IG47Ci0JCSAgZGxuLnNsbltpZHhdID0gbC0+bGluZXNbaV07Ci0JCSAgZGxuLmZyb21fYWRkcmVzc1tpZHhdID0gbC0+YWRkcmVzc2VzW2ldOwotCQkgIGlmIChpZHgpCi0JCSAgICBkbG4udG9fYWRkcmVzc1tpZHggLSAxXSA9IGRsbi5mcm9tX2FkZHJlc3NbaWR4XTsKLQkJICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JICBuKys7Ci0JfQotICAgICAgc3lzcm9mZl9zd2FwX2Rsbl9vdXQgKGZpbGUsICZkbG4pOwotICAgIH0KLQotI2VuZGlmCi0jaWYgMQotICAvKiBDb3VudCB1cCBhbGwgdGhlIGxpbmVudW1iZXJzICovCi0KLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeTsKLSAgaW50IGxjID0gMDsKLSAgc3RydWN0IElUX2RsbiBkbG47Ci0KLSAgaW50IGlkeDsKLQotICBmb3IgKHN5ID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7Ci0gICAgICAgc3k7Ci0gICAgICAgc3kgPSBzeS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl90eXBlICp0ID0gc3ktPnR5cGU7Ci0gICAgICBpZiAodC0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0JewotCSAgc3RydWN0IGNvZmZfbGluZSAqbCA9IHQtPnUuZnVuY3Rpb24ubGluZXM7Ci0JICBpZiAobCkKLQkgICAgbGMgKz0gbC0+bmxpbmVzOwotCX0KLSAgICB9Ci0KLSAgZGxuLnNmbiA9IG5pbnRzIChsYyk7Ci0gIGRsbi5zbG4gPSBuaW50cyAobGMpOwotICBkbG4uY2MgPSBuaW50cyAobGMpOwotICBkbG4uc2VjdGlvbiA9IG5pbnRzIChsYyk7Ci0KLSAgZGxuLmZyb21fYWRkcmVzcyA9IG5pbnRzIChsYyk7Ci0gIGRsbi50b19hZGRyZXNzID0gbmludHMgKGxjKTsKLQotCi0gIGRsbi5uZWcgPSAweDEwMDE7Ci0KLSAgZGxuLm5sbiA9IGxjOwotCi0gIC8qIFJ1biB0aHJvdWdoIG9uY2UgbW9yZSBhbmQgZmlsbCB1cCB0aGUgc3RydWN0dXJlICovCi0gIGlkeCA9IDA7Ci0gIGZvciAoc3kgPSBzZmlsZS0+c2NvcGUtPnZhcnNfaGVhZDsKLSAgICAgICBzeTsKLSAgICAgICBzeSA9IHN5LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzeS0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0JewotCSAgaW50IGk7Ci0JICBzdHJ1Y3QgY29mZl9saW5lICpsID0gc3ktPnR5cGUtPnUuZnVuY3Rpb24ubGluZXM7Ci0JICBpZiAobCkKLQkgICAgewotCSAgICAgIGludCBiYXNlID0gZmluZF9iYXNlIChzZmlsZSwgc3ktPndoZXJlLT5zZWN0aW9uKTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgbC0+bmxpbmVzOyBpKyspCi0JCXsKLQkJICBkbG4uc2VjdGlvbltpZHhdID0gc3ktPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0JCSAgZGxuLnNmbltpZHhdID0gMDsKLQkJICBkbG4uc2xuW2lkeF0gPSBsLT5saW5lc1tpXTsKLQkJICBkbG4uZnJvbV9hZGRyZXNzW2lkeF0gPQotCQkgICAgbC0+YWRkcmVzc2VzW2ldICsgc3ktPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzIC0gYmFzZTsKLQkJICBkbG4uY2NbaWR4XSA9IDA7Ci0JCSAgaWYgKGlkeCkKLQkJICAgIGRsbi50b19hZGRyZXNzW2lkeCAtIDFdID0gZGxuLmZyb21fYWRkcmVzc1tpZHhdOwotCQkgIGlkeCsrOwotCi0JCX0KLQkgICAgICBkbG4udG9fYWRkcmVzc1tpZHggLSAxXSA9IGRsbi5mcm9tX2FkZHJlc3NbaWR4IC0gMV0gKyAyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKGxjKQotICAgIHN5c3JvZmZfc3dhcF9kbG5fb3V0IChmaWxlLCAmZGxuKTsKLSNlbmRpZgotfQotCi0vKiBXcml0ZSB0aGUgZ2xvYmFsIHN5bWJvbHMgb3V0IHRvIHRoZSBkZWJ1ZyBpbmZvICovCi1zdGF0aWMgdm9pZAotd3JfZ2xvYmFscyAocCwgc2ZpbGUsIG4pCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBuOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5OwotICBmb3IgKHN5ID0gcC0+c3ltYm9sX2xpc3RfaGVhZDsKLSAgICAgICBzeTsKLSAgICAgICBzeSA9IHN5LT5uZXh0X2luX29maWxlX2xpc3QpCi0gICAgewotICAgICAgaWYgKHN5LT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9kZWYKLQkgIHx8IHN5LT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCi0JewotCSAgLyogT25seSB3cml0ZSBvdXQgc3ltYm9scyBpZiB0aGV5IGJlbG9uZyB0bwotCSAgICAgdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgKi8KLQkgIGlmIChzeS0+c2ZpbGUgPT0gc2ZpbGUpCi0JICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBzeSwgMCk7Ci0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3JfZGVidWcgKHApCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotewotICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gIGludCBuID0gMDsKLSAgZm9yIChzZmlsZSA9IHAtPnNvdXJjZV9oZWFkOwotICAgICAgIHNmaWxlOwotICAgICAgIHNmaWxlID0gc2ZpbGUtPm5leHQpCi0KLSAgICB7Ci0gICAgICBpZiAoZGVidWcpCi0JewotCSAgcHJpbnRmICgiJXNcbiIsIHNmaWxlLT5uYW1lKTsKLQl9Ci0gICAgICB3cl9kdSAocCwgc2ZpbGUsIG4pOwotICAgICAgd3JfZHVzIChwLCBzZmlsZSk7Ci0gICAgICB3cl9wcm9ncmFtX3N0cnVjdHVyZSAocCwgc2ZpbGUpOwotICAgICAgd3JfZGxuIChwLCBzZmlsZSwgbik7Ci0gICAgICBuKys7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3JfY3MgKCkKLXsKLSAgLyogSXQgc2VlbXMgdGhhdCB0aGUgQ1Mgc3RydWN0IGlzIG5vdCBub3JtYWwgLSB0aGUgc2l6ZSBpcyB3cm9uZwotICAgICBoZXJlcyBvbmUgSSBwcmVwYXJlZCBlYXJsaWVyLi4gKi8KLSAgc3RhdGljIGNoYXIgYltdID0gewotICAgIDB4ODAsCQkJLyogSVQgKi8KLSAgICAweDIxLAkJCS8qIFJMICovCi0gICAgMHgwMCwJCQkvKiBudW1iZXIgb2YgY2hhcnMgaW4gdmFyaWFibGUgbGVuZ3RoIHBhcnQgKi8KLSAgICAweDgwLAkJCS8qIGhkICovIAotICAgIDB4MDAsCQkJLyogaHMgKi8gCi0gICAgMHg4MCwJCQkvKiB1biAqLyAKLSAgICAweDAwLAkJCS8qIHVzICovIAotICAgIDB4ODAsCQkJLyogc2MgKi8gCi0gICAgMHgwMCwJCQkvKiBzcyAqLyAKLSAgICAweDgwLAkJCS8qIGVyICovIAotICAgIDB4ODAsCQkJLyogZWQgKi8gCi0gICAgMHg4MCwJCQkvKiBzaCAqLyAKLSAgICAweDgwLAkJCS8qIG9iICovIAotICAgIDB4ODAsCQkJLyogcmwgKi8gCi0gICAgMHg4MCwJCQkvKiBkdSAqLwotICAgIDB4ODAsCQkJLyogZHBzICovCi0gICAgMHg4MCwJCQkvKiBkc3kgKi8KLSAgICAweDgwLAkJCS8qIGR0eSAqLwotICAgIDB4ODAsCQkJLyogZGxuICovCi0gICAgMHg4MCwJCQkvKiBkc28gKi8KLSAgICAweDgwLAkJCS8qIGR1cyAqLwotICAgIDB4MDAsCQkJLyogZHNzICovCi0gICAgMHg4MCwJCQkvKiBkYnQgKi8KLSAgICAweDAwLAkJCS8qIGRwcCAqLwotICAgIDB4ODAsCQkJLyogZGZwICovCi0gICAgMHg4MCwJCQkvKiBkZW4gKi8KLSAgICAweDgwLAkJCS8qIGRkcyAqLwotICAgIDB4ODAsCQkJLyogZGFyICovCi0gICAgMHg4MCwJCQkvKiBkcHQgKi8KLSAgICAweDAwLAkJCS8qIGR1bCAqLwotICAgIDB4MDAsCQkJLyogZHNlICovCi0gICAgMHgwMCwJCQkvKiBkb3QgKi8KLSAgICAweERFCQkJLyogQ1MgKi8KLSAgfTsKLSAgZndyaXRlIChiLCAxLCBzaXplb2YgKGIpLCBmaWxlKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBTQyByZWNvcmRzIGZvciBhIHVuaXQuICBDcmVhdGUgYW4gU0MKLSAgIGZvciBhbGwgdGhlIHNlY3Rpb25zIHdoaWNoIGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUsIGV2ZW4KLSAgIGlmIHRoZXJlIGlzbid0IGFuIGVxdWl2YWxlbnQgb25lIG9uIHRoZSBpbnB1dCAqLwotCi1zdGF0aWMgaW50Ci13cl9zYyAocHRyLCBzZmlsZSkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotewotICBpbnQgaTsKLWludCBzY291bnQgPSAwOwotICAvKiBGaXJzdCB3b3JrIG91dCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlY3Rpb25zICovCi0KLSAgaW50IHRvdGFsX3NlYyA9IHB0ci0+bnNlY3Rpb25zOwotCi0gIHN0cnVjdCBteWluZm8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgICB9OwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLQotICBzdHJ1Y3QgbXlpbmZvICppbmZvCi0gICAgPSAoc3RydWN0IG15aW5mbyAqKSBjYWxsb2MgKHRvdGFsX3NlYywgc2l6ZW9mIChzdHJ1Y3QgbXlpbmZvKSk7Ci0KLQotCi0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9zZWM7IGkrKykKLSAgICB7Ci0gICAgICBpbmZvW2ldLnNlYyA9IHB0ci0+c2VjdGlvbnMgKyBpOwotICAgICAgaW5mb1tpXS5zeW1ib2wgPSAwOwotICAgIH0KLQotICBmb3IgKHN5bWJvbCA9IHNmaWxlLT5zY29wZS0+dmFyc19oZWFkOwotICAgICAgIHN5bWJvbDsKLSAgICAgICBzeW1ib2wgPSBzeW1ib2wtPm5leHQpCi0gICAgewotCi0gICAgICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc2VjZGVmX3R5cGUpCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3NlYzsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24gPT0gaW5mb1tpXS5zZWMpCi0JCXsKLQkJICBpbmZvW2ldLnN5bWJvbCA9IHN5bWJvbDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgb3V0cHV0IGFsbCB0aGUgc2VjdGlvbiBpbmZvLCBhbmQgZmFrZSB1cCBzb21lIHN0dWZmIGZvciBzZWN0aW9ucwotICAgICB3ZSBkb24ndCBoYXZlICovCi0KLSAgZm9yIChpID0gMTsgaSA8IHRvdGFsX3NlYzsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBJVF9zYyBzYzsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBzeW1ib2wgPSBpbmZvW2ldLnN5bWJvbDsKLSAgICAgIHNjLnNwYXJlID0gMDsKLSAgICAgIHNjLnNwYXJlMSA9IDA7Ci0gICAgICBpZiAoIXN5bWJvbCkKLQl7Ci0JICAvKiBEb24ndCBoYXZlIGEgc3ltYm9sIHNldCBhc2lkZSBmb3IgdGhpcyBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IG5vdGhpbmcKLQkgICAgIGluIHRoaXMgZmlsZSBkb2VzIGFueXRoaW5nIGZvciB0aGUgc2VjdGlvbi4gKi8KLQkgIHNjLmZvcm1hdCA9ICEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCk7Ci0JICBzYy5hZGRyID0gMDsKLQkgIHNjLmxlbmd0aCA9IDA7Ci0JICBuYW1lID0gaW5mb1tpXS5zZWMtPm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKQotCSAgICB7Ci0JICAgICAgc2MuZm9ybWF0ID0gMDsKLQkgICAgICBzYy5hZGRyID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzYy5mb3JtYXQgPSAxOwotCSAgICAgIHNjLmFkZHIgPSAwOwotCSAgICB9Ci0JICBzYy5sZW5ndGggPSBzeW1ib2wtPnR5cGUtPnNpemU7Ci0JICBuYW1lID0gc3ltYm9sLT5uYW1lOwotCX0KLQotICAgICAgc2MuYWxpZ24gPSA0OwotCi0gICAgICBzYy5jb25jYXQgPSBDT05DQVRfU0lNUExFOwotICAgICAgc2MucmVhZCA9IDM7Ci0gICAgICBzYy53cml0ZSA9IDM7Ci0gICAgICBzYy5leGVjID0gMzsKLSAgICAgIHNjLmluaXQgPSAzOwotICAgICAgc2MubW9kZSA9IDM7Ci0gICAgICBzYy5zcGFyZSA9IDA7Ci0gICAgICBzYy5zZWdhZGQgPSAwOwotICAgICAgc2Muc3BhcmUxID0gMDsJCS8qIElmIG5vdCB6ZXJvLCB0aGVuIGl0IGRvZXNuJ3Qgd29yayAqLwotICAgICAgc2MubmFtZSA9IHNlY3Rpb25fdHJhbnNsYXRlIChuYW1lKTsKLSAgICAgIGlmIChzdHJsZW4gKHNjLm5hbWUpID09IDEpCi0JewotCSAgc3dpdGNoIChzYy5uYW1lWzBdKQotCSAgICB7Ci0JICAgIGNhc2UgJ0QnOgotCSAgICBjYXNlICdCJzoKLQkgICAgICBzYy5jb250ZW50cyA9IENPTlRFTlRTX0RBVEE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc2MuY29udGVudHMgPSBDT05URU5UU19DT0RFOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNjLmNvbnRlbnRzID0gQ09OVEVOVFNfQ09ERTsKLQl9Ci0jaWYgMAotICAgICAgLyogTkVXICovCi0gICAgICBpZiAoc2MubGVuZ3RoKSB7Ci0jZW5kaWYKLQlzeXNyb2ZmX3N3YXBfc2Nfb3V0IChmaWxlLCAmc2MpOwotCXNjb3VudCsrOwotI2lmIDAKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLXJldHVybiBzY291bnQ7Ci19Ci0KLQotLyogV3JpdGUgb3V0IHRoZSBFUiByZWNvcmRzIGZvciBhIHVuaXQuICovCi1zdGF0aWMgdm9pZAotd3JfZXIgKHB0ciwgc2ZpbGUsIGZpcnN0KQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBmaXJzdDsKLXsKLSAgaW50IGlkeCA9IDA7Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltOwotICBpZiAoZmlyc3QpCi0gICAgewotICAgICAgZm9yIChzeW0gPSBwdHItPnN5bWJvbF9saXN0X2hlYWQ7IHN5bTsgc3ltID0gc3ltLT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgaWYgKHN5bS0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfcmVmKQotCSAgICB7Ci0JICAgICAgc3RydWN0IElUX2VyIGVyOwotCSAgICAgIGVyLnNwYXJlID0gMDsKLQkgICAgICBlci50eXBlID0gRVJfTk9UU1BFQzsKLQkgICAgICBlci5uYW1lID0gc3ltLT5uYW1lOwotCSAgICAgIHN5c3JvZmZfc3dhcF9lcl9vdXQgKGZpbGUsICZlcik7Ci0JICAgICAgc3ltLT5lcl9udW1iZXIgPSBpZHgrKzsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgRUQgcmVjb3JkcyBmb3IgYSB1bml0LiAqLwotc3RhdGljIHZvaWQKLXdyX2VkIChwdHIsIHNmaWxlLCBmaXJzdCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgZmlyc3Q7Ci17Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqczsKLSAgaWYgKGZpcnN0KQotICAgIHsKLSAgICAgIGZvciAocyA9IHB0ci0+c3ltYm9sX2xpc3RfaGVhZDsgczsgcyA9IHMtPm5leHRfaW5fb2ZpbGVfbGlzdCkKLQl7Ci0JICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfZGVmCi0JICAgICAgfHwgcy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19jb21tb24pCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgSVRfZWQgZWQ7Ci0KLQkgICAgICBlZC5zZWN0aW9uID0gcy0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkgICAgICBlZC5zcGFyZSA9IDA7Ci0JICAgICAgaWYgKHMtPndoZXJlLT5zZWN0aW9uLT5kYXRhKQotCQl7Ci0JCSAgZWQudHlwZSA9IEVEX1RZUEVfREFUQTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHMtPndoZXJlLT5zZWN0aW9uLT5jb2RlICYgU0VDX0NPREUpCi0JCXsKLQkJICBlZC50eXBlID0gRURfVFlQRV9FTlRSWTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVkLnR5cGUgPSBFRF9UWVBFX05PVFNQRUM7Ci0JCSAgZWQudHlwZSA9IEVEX1RZUEVfREFUQTsKLQkJfQotCSAgICAgIGVkLmFkZHJlc3MgPSBzLT53aGVyZS0+b2Zmc2V0IC0gcy0+d2hlcmUtPnNlY3Rpb24tPmFkZHJlc3M7Ci0JICAgICAgZWQubmFtZSA9IHMtPm5hbWU7Ci0JICAgICAgc3lzcm9mZl9zd2FwX2VkX291dCAoZmlsZSwgJmVkKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl91bml0X2luZm8gKHB0cikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLXsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICBpbnQgZmlyc3QgPSAxOwotICBmb3IgKHNmaWxlID0gcHRyLT5zb3VyY2VfaGVhZDsKLSAgICAgICBzZmlsZTsKLSAgICAgICBzZmlsZSA9IHNmaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGxvbmcgcDE7Ci0gICAgICBsb25nIHAyOwotICAgICAgaW50IG5zZWNzOwotICAgICAgcDEgPSBmdGVsbCAoZmlsZSk7Ci0gICAgICB3cl91biAocHRyLCBzZmlsZSwgZmlyc3QsIDApOwotICAgICAgbnNlY3MgPSB3cl9zYyAocHRyLCBzZmlsZSk7Ci0gICAgICBwMiA9IGZ0ZWxsIChmaWxlKTsKLSAgICAgIGZzZWVrIChmaWxlLCBwMSwgU0VFS19TRVQpOwotICAgICAgd3JfdW4gKHB0ciwgc2ZpbGUsIGZpcnN0LCBuc2Vjcyk7Ci0gICAgICBmc2VlayAoZmlsZSwgcDIsIFNFRUtfU0VUKTsgCi0gICAgICB3cl9lciAocHRyLCBzZmlsZSwgZmlyc3QpOwotICAgICAgd3JfZWQgKHB0ciwgc2ZpbGUsIGZpcnN0KTsKLSAgICAgIGZpcnN0ID0gMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9tb2R1bGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotewotICB3cl9jcyAoKTsKLSAgd3JfaGQgKHApOwotICB3cl91bml0X2luZm8gKHApOwotICB3cl9vYmplY3RfYm9keSAocCk7Ci0gIHdyX2RlYnVnIChwKTsKLSAgd3JfdHIgKCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWFsaWduICh4KQotICAgICBpbnQgeDsKLXsKLSAgcmV0dXJuICh4ICsgMykgJiB+MzsKLX0KLQotLyogRmluZCBhbGwgdGhlIGNvbW1vbiB2YXJpYWJsZXMgYW5kIHR1cm4gdGhlbSBpbnRvCi0gICBvcmRpbmFyeSBkZWZzIC0gZHVubm8gd2h5LCBidXQgdGhhdHMgd2hhdCBoaXRhY2hpIGRvZXMgd2l0aCAnZW0gKi8KLQotc3RhdGljIHZvaWQKLXByZXNjYW4gKHRyZWUpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnM7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKmNvbW1vbl9zZWN0aW9uOwotICAvKiBGaW5kIHRoZSBjb21tb24gc2VjdGlvbiAtIGFsd2F5cyBzZWN0aW9uIDMgKi8KLSAgY29tbW9uX3NlY3Rpb24gPSB0cmVlLT5zZWN0aW9ucyArIDM7Ci0gIGZvciAocyA9IHRyZWUtPnN5bWJvbF9saXN0X2hlYWQ7Ci0gICAgICAgczsKLSAgICAgICBzID0gcy0+bmV4dF9pbl9vZmlsZV9saXN0KQotICAgIHsKLSAgICAgIGlmIChzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKLQl7Ci0JICBzdHJ1Y3QgY29mZl93aGVyZSAqdyA9IHMtPndoZXJlOwotCSAgLyogICAgICBzLT52aXNpYmxlLT50eXBlID0gY29mZl92aXNfZXh0X2RlZjsgbGVhdmUgaXQgYXMgY29tbW9uICovCi0JICBjb21tb25fc2VjdGlvbi0+c2l6ZSA9IGFsaWduIChjb21tb25fc2VjdGlvbi0+c2l6ZSk7Ci0JICB3LT5vZmZzZXQgPSBjb21tb25fc2VjdGlvbi0+c2l6ZSArIGNvbW1vbl9zZWN0aW9uLT5hZGRyZXNzOwotCSAgdy0+c2VjdGlvbiA9IGNvbW1vbl9zZWN0aW9uOwotCSAgY29tbW9uX3NlY3Rpb24tPnNpemUgKz0gcy0+dHlwZS0+c2l6ZTsKLQkgIGNvbW1vbl9zZWN0aW9uLT5zaXplID0gYWxpZ24gKGNvbW1vbl9zZWN0aW9uLT5zaXplKTsKLQl9Ci0gICAgfQotfQotCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlVzYWdlOiAlcyBbLWRoVnFdIGluLWZpbGUgW291dC1maWxlXVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogQ29udmVydCBhIENPRkYgb2JqZWN0IGZpbGUgaW50byBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotCi0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKmF2W107Ci17Ci0gIGludCBvcHQ7Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLSAgewotICAgIHsiZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2QnfSwKLSAgICB7InF1aWNrIiwgbm9fYXJndW1lbnQsIDAsICdxJ30sCi0gICAgeyJub3ByZXNjYW4iLCBub19hcmd1bWVudCwgMCwgJ24nfSwKLSAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgICB7TlVMTCwgbm9fYXJndW1lbnQsIDAsIDB9Ci0gIH07Ci0gIGNoYXIgKiptYXRjaGluZzsKLSAgY2hhciAqaW5wdXRfZmlsZTsKLSAgY2hhciAqb3V0cHV0X2ZpbGU7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhdlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFjLCBhdiwgImRoVnFuIiwgbG9uZ19vcHRpb25zLAotCQkJICAgICAoaW50ICopIE5VTEwpKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ3EnOgotCSAgcXVpY2sgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBub3ByZXNjYW4gPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkZWJ1ZyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCAqLwotCWNhc2UgJ1YnOgotCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKLQkgIGV4aXQgKDApOwotCSAgLypOT1RSRUFDSEVEICovCi0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAvKk5PVFJFQUNIRUQgKi8KLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG1heSBiZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLSAgb3V0cHV0X2ZpbGUgPSBOVUxMOwotICBpZiAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaW5wdXRfZmlsZSA9IGF2W29wdGluZF07Ci0gICAgICArK29wdGluZDsKLSAgICAgIGlmIChvcHRpbmQgPCBhYykKLQl7Ci0JICBvdXRwdXRfZmlsZSA9IGF2W29wdGluZF07Ci0JICArK29wdGluZDsKLQkgIGlmIChvcHRpbmQgPCBhYykKLQkgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIGlmIChzdHJjbXAgKGlucHV0X2ZpbGUsIG91dHB1dF9maWxlKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbXVzdCBiZSBkaWZmZXJlbnRcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICBleGl0ICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBpbnB1dF9maWxlID0gMDsKLQotICBpZiAoIWlucHV0X2ZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmICghb3V0cHV0X2ZpbGUpCi0gICAgewotICAgICAgLyogVGFrZSBhIC5vIG9mZiB0aGUgaW5wdXQgZmlsZSBhbmQgc3RpY2sgb24gYSAub2JqLiAgSWYKLSAgICAgICAgIGl0IGRvZXNuJ3QgZW5kIGluIC5vLCB0aGVuIHN0aWNrIGEgLm9iaiBvbiBhbnl3YXkgKi8KLQotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoaW5wdXRfZmlsZSk7Ci0gICAgICBvdXRwdXRfZmlsZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotICAgICAgc3RyY3B5IChvdXRwdXRfZmlsZSwgaW5wdXRfZmlsZSk7Ci0gICAgICBpZiAobGVuID4gMwotCSAgJiYgb3V0cHV0X2ZpbGVbbGVuIC0gMl0gPT0gJy4nCi0JICAmJiBvdXRwdXRfZmlsZVtsZW4gLSAxXSA9PSAnbycpCi0JewotCSAgb3V0cHV0X2ZpbGVbbGVuXSA9ICdiJzsKLQkgIG91dHB1dF9maWxlW2xlbiArIDFdID0gJ2onOwotCSAgb3V0cHV0X2ZpbGVbbGVuICsgMl0gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJjYXQgKG91dHB1dF9maWxlLCAiLm9iaiIpOwotCX0KLSAgICB9Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZSwgMCk7Ci0KLSAgaWYgKCFhYmZkKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGZpbGUgPSBmb3BlbiAob3V0cHV0X2ZpbGUsIEZPUEVOX1dCKTsKLQotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIG91dHB1dF9maWxlKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoZGVidWcpCi0gICAgcHJpbnRmICgiaWRzICVkICVkXG4iLCBiYXNlMSwgYmFzZTIpOwotICB0cmVlID0gY29mZl9ncm9rIChhYmZkKTsKLSAgaWYgKCFub3ByZXNjYW4pCi0gICAgcHJlc2NhbiAodHJlZSk7Ci0gIHdyX21vZHVsZSAodHJlZSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3RhYnMuYyBiL2JpbnV0aWxzL3N0YWJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2IzYmQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDUxODggKzAsMCBAQAotLyogc3RhYnMuYyAtLSBQYXJzZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCBwYXJzZXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGdkYiBzdGFicyByZWFkaW5nCi0gICBjb2RlLiAgVGhlIGpvYiBpdCBkb2VzIGlzIHNvbWV3aGF0IGRpZmZlcmVudCwgYmVjYXVzZSBpdCBpcyBub3QKLSAgIHRyeWluZyB0byBpZGVudGlmeSB0aGUgY29ycmVjdCBhZGRyZXNzIGZvciBhbnl0aGluZy4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogTWVhbmluZ2xlc3MgZGVmaW5pdGlvbiBuZWVkcyBieSBhb3V0NjQuaC4gIEZJWE1FLiAgKi8KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotI2lmbmRlZiBESVJfU0VQQVJBVE9SCi0jaWZkZWYgX1dJTjMyCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJ1xcJwotI2Vsc2UKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2YgcHJlZGVmaW5lZCBYQ09GRiB0eXBlcy4gICovCi0KLSNkZWZpbmUgWENPRkZfVFlQRV9DT1VOVCAzNAotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGFzIGEgaGFuZGxlIHNvIHRoYXQgdGhlIHN0YWIgcGFyc2luZyBkb2Vzbid0Ci0gICBuZWVkIHRvIHVzZSBhbnkgc3RhdGljIHZhcmlhYmxlcy4gICovCi0KLXN0cnVjdCBzdGFiX2hhbmRsZQotewotICAvKiBUaGUgQkZELiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUcnVlIGlmIHRoaXMgaXMgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBib29sZWFuIHNlY3Rpb25zOwotICAvKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYXN5bWJvbCAqKnN5bXM7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scy4gICovCi0gIGxvbmcgc3ltY291bnQ7Ci0gIC8qIFRoZSBhY2N1bXVsYXRlZCBmaWxlIG5hbWUgc3RyaW5nLiAgKi8KLSAgY2hhciAqc29fc3RyaW5nOwotICAvKiBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgTl9TTyBzeW1ib2wuICAqLwotICBiZmRfdm1hIHNvX3ZhbHVlOwotICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgZmlsZQotICAgICByZWxhdGl2ZSBOX0xCUkFDIGFuZCBOX1JCUkFDIHN5bWJvbHMuICAqLwotICBiZmRfdm1hIGZpbGVfc3RhcnRfb2Zmc2V0OwotICAvKiBUaGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIHNvIHRoYXQgd2UgY2FuIGhhbmRsZQotICAgICBmdW5jdGlvbiByZWxhdGl2ZSBOX0xCUkFDIGFuZCBOX1JCUkFDIHN5bWJvbHMuICAqLwotICBiZmRfdm1hIGZ1bmN0aW9uX3N0YXJ0X29mZnNldDsKLSAgLyogVGhlIHZlcnNpb24gbnVtYmVyIG9mIGdjYyB3aGljaCBjb21waWxlZCB0aGUgY3VycmVudCBjb21waWxhdGlvbgotICAgICB1bml0LCAwIGlmIG5vdCBjb21waWxlZCBieSBnY2MuICAqLwotICBpbnQgZ2NjX2NvbXBpbGVkOwotICAvKiBXaGV0aGVyIGFuIE5fT1BUIHN5bWJvbCB3YXMgc2VlbiB0aGF0IHdhcyBub3QgZ2VuZXJhdGVkIGJ5IGdjYywKLSAgICAgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHRoZSBTdW5QUk8gY29tcGlsZXIuICAqLwotICBib29sZWFuIG5fb3B0X2ZvdW5kOwotICAvKiBUaGUgbWFpbiBmaWxlIG5hbWUuICAqLwotICBjaGFyICptYWluX2ZpbGVuYW1lOwotICAvKiBBIHN0YWNrIG9mIHVuZmluaXNoZWQgTl9CSU5DTCBmaWxlcy4gICovCi0gIHN0cnVjdCBiaW5jbF9maWxlICpiaW5jbF9zdGFjazsKLSAgLyogQSBsaXN0IG9mIGZpbmlzaGVkIE5fQklOQ0wgZmlsZXMuICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqYmluY2xfbGlzdDsKLSAgLyogV2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgZnVuY3Rpb24gb3Igbm90LiAgKi8KLSAgYm9vbGVhbiB3aXRoaW5fZnVuY3Rpb247Ci0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCB1c2VkIGlmIHdlIGhhdmUgc2VlbiBhbgotICAgICBOX0ZVTiBzeW1ib2wgd2hpbGUgaW4gYSBmdW5jdGlvbi4gIFRoaXMgaXMgLTEgaWYgd2UgaGF2ZSBub3Qgc2VlbgotICAgICBhbiBOX0ZVTiAodGhlIG5vcm1hbCBjYXNlKS4gICovCi0gIGJmZF92bWEgZnVuY3Rpb25fZW5kOwotICAvKiBUaGUgZGVwdGggb2YgYmxvY2sgbmVzdGluZy4gICovCi0gIGludCBibG9ja19kZXB0aDsKLSAgLyogTGlzdCBvZiBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb25zLiAgKi8KLSAgc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKnBlbmRpbmc7Ci0gIC8qIE51bWJlciBvZiBmaWxlcyBmb3Igd2hpY2ggd2UgaGF2ZSB0eXBlcy4gICovCi0gIHVuc2lnbmVkIGludCBmaWxlczsKLSAgLyogTGlzdHMgb2YgdHlwZXMgcGVyIGZpbGUuICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlcyAqKmZpbGVfdHlwZXM7Ci0gIC8qIFByZWRlZmluZWQgWENPRkYgdHlwZXMuICAqLwotICBkZWJ1Z190eXBlIHhjb2ZmX3R5cGVzW1hDT0ZGX1RZUEVfQ09VTlRdOwotICAvKiBVbmRlZmluZWQgdGFncy4gICovCi0gIHN0cnVjdCBzdGFiX3RhZyAqdGFnczsKLSAgLyogU2V0IGJ5IHBhcnNlX3N0YWJfdHlwZSBpZiBpdCBzZWVzIGEgc3RydWN0dXJlIGRlZmluZWQgYXMgYSBjcm9zcwotICAgICByZWZlcmVuY2UgdG8gaXRzZWxmLiAgUmVzZXQgYnkgcGFyc2Vfc3RhYl90eXBlIG90aGVyd2lzZS4gICovCi0gIGJvb2xlYW4gc2VsZl9jcm9zc3JlZjsKLX07Ci0KLS8qIEEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHVzZWQgdG8gaG9sZCBwZW5kaW5nIHZhcmlhYmxlCi0gICBkZWZpbml0aW9ucyBzZWVuIGJlZm9yZSB0aGUgTl9MQlJBQyBvZiBhIGJsb2NrLiAgKi8KLQotc3RydWN0IHN0YWJfcGVuZGluZ192YXIKLXsKLSAgLyogTmV4dCBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb24uICAqLwotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqbmV4dDsKLSAgLyogTmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIEtpbmQuICAqLwotICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gIC8qIFZhbHVlLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBBIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyB1c2VkIHRvIGhvbGQgdGhlIHR5cGVzIGZvciBhIHNpbmdsZQotICAgZmlsZS4gICovCi0KLXN0cnVjdCBzdGFiX3R5cGVzCi17Ci0gIC8qIE5leHQgc2V0IG9mIHNsb3RzIGZvciB0aGlzIGZpbGUuICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlcyAqbmV4dDsKLSAgLyogVHlwZXMgaW5kZXhlZCBieSB0eXBlIG51bWJlci4gICovCi0jZGVmaW5lIFNUQUJfVFlQRVNfU0xPVFMgKDE2KQotICBkZWJ1Z190eXBlIHR5cGVzW1NUQUJfVFlQRVNfU0xPVFNdOwotfTsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgdW5kZWZpbmVkIHRhZ3MgdGhhdCB3ZSBlbmNvdW50ZXIsIHNvIHRoYXQgd2UgY2FuCi0gICBmaWxsIHRoZW0gaW4gaWYgdGhlIHRhZyBpcyBsYXRlciBkZWZpbmVkLiAgKi8KLQotc3RydWN0IHN0YWJfdGFnCi17Ci0gIC8qIE5leHQgdW5kZWZpbmVkIHRhZy4gICovCi0gIHN0cnVjdCBzdGFiX3RhZyAqbmV4dDsKLSAgLyogVGFnIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIGtpbmQuICAqLwotICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAvKiBTbG90IHRvIGhvbGQgcmVhbCB0eXBlIHdoZW4gd2UgZGlzY292ZXIgaXQuICBJZiB3ZSBkb24ndCwgd2UgZmlsbAotICAgICBpbiBhbiB1bmRlZmluZWQgdGFnIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHNsb3Q7Ci0gIC8qIEluZGlyZWN0IHR5cGUgd2UgaGF2ZSBjcmVhdGVkIHRvIHBvaW50IGF0IHNsb3QuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci19OwotCi1zdGF0aWMgY2hhciAqc2F2ZXN0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgYmFkX3N0YWIgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3YXJuX3N0YWIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfc3RyaW5nCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCi0JICAgZGVidWdfdHlwZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl90eXBlX251bWJlcgotICBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBpbnQgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9yYW5nZV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBpbnQgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9zdW5fYnVpbHRpbl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9zdW5fZmxvYXRpbmdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfZW51bV90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGJvb2xlYW4sCi0JICAgY29uc3QgaW50ICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfYmFzZWNsYXNzZXMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgZGVidWdfYmFzZWNsYXNzICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX3N0cnVjdF9maWVsZHMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgZGVidWdfZmllbGQgKiosCi0JICAgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX2NwcF9hYmJyZXYKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgZGVidWdfZmllbGQgKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9vbmVfc3RydWN0X2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiwKLQkgICBkZWJ1Z19maWVsZCAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfbWVtYmVycwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgaW50ICosIGRlYnVnX21ldGhvZCAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9hcmd0eXBlcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBkZWJ1Z190eXBlLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICBkZWJ1Z190eXBlLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfdGlsZGVfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgY29uc3QgaW50ICosCi0JICAgZGVidWdfdHlwZSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBwdXNoX2JpbmNsIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpwb3BfYmluY2wgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICopKTsKLXN0YXRpYyBib29sZWFuIGZpbmRfZXhjbAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3JlY29yZF92YXJpYWJsZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsCi0JICAgZW51bSBkZWJ1Z192YXJfa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbWl0X3BlbmRpbmdfdmFycyBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSAqc3RhYl9maW5kX3Nsb3QKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBzdGFiX2ZpbmRfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9yZWNvcmRfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBpbnQgKiwgZGVidWdfdHlwZSkpOwotc3RhdGljIGRlYnVnX3R5cGUgc3RhYl94Y29mZl9idWlsdGluX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgaW50KSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBpbnQsCi0JICAgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLXN0YXRpYyBkZWJ1Z190eXBlICpzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiAqKSk7Ci0KLS8qIFNhdmUgYSBzdHJpbmcgaW4gbWVtb3J5LiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2F2ZXN0cmluZyAoc3RhcnQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIGludCBsZW47Ci17Ci0gIGNoYXIgKnJldDsKLQotICByZXQgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5IChyZXQsIHN0YXJ0LCBsZW4pOwotICByZXRbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgZnJvbSBhIHN0cmluZy4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1wYXJzZV9udW1iZXIgKHBwLCBwb3ZlcmZsb3cpCi0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgYm9vbGVhbiAqcG92ZXJmbG93OwotewotICB1bnNpZ25lZCBsb25nIHVsOwotICBjb25zdCBjaGFyICpvcmlnOwotCi0gIGlmIChwb3ZlcmZsb3cgIT0gTlVMTCkKLSAgICAqcG92ZXJmbG93ID0gZmFsc2U7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBlcnJubyA9IDA7Ci0gIHVsID0gc3RydG91bCAoKnBwLCAoY2hhciAqKikgcHAsIDApOwotICBpZiAodWwgKyAxICE9IDAgfHwgZXJybm8gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiBiZmRfdm1hIGlzIGxhcmdlciB0aGFuIHVuc2lnbmVkIGxvbmcsIGFuZCB0aGUgbnVtYmVyIGlzCi0gICAgICAgICBtZWFudCB0byBiZSBuZWdhdGl2ZSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzaWduCi0gICAgICAgICBleHRlbmQgcHJvcGVybHkuICAqLwotICAgICAgaWYgKCpvcmlnID09ICctJykKLQlyZXR1cm4gKGJmZF92bWEpIChiZmRfc2lnbmVkX3ZtYSkgKGxvbmcpIHVsOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSB1bDsKLSAgICB9Ci0KLSAgLyogTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHN0cnRvdWwgb3ZlcmZsb3dlZCwgaXQgc2hvdWxkIGhhdmUgc2V0ICpwcAotICAgICB0byB0aGUgZW5kIG9mIHRoZSBudW1iZXIsIHdoaWNoIGlzIHdoZXJlIHdlIHdhbnQgaXQuICAqLwotCi0gIGlmIChzaXplb2YgKGJmZF92bWEpID4gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpwOwotICAgICAgYm9vbGVhbiBuZWc7Ci0gICAgICBpbnQgYmFzZTsKLSAgICAgIGJmZF92bWEgb3ZlciwgbGFzdGRpZzsKLSAgICAgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0gICAgICBiZmRfdm1hIHY7Ci0KLSAgICAgIC8qIE91ciBvd24gdmVyc2lvbiBvZiBzdHJ0b3VsLCBmb3IgYSBiZmRfdm1hLiAgKi8KLQotICAgICAgcCA9IG9yaWc7Ci0KLSAgICAgIG5lZyA9IGZhbHNlOwotICAgICAgaWYgKCpwID09ICcrJykKLQkrK3A7Ci0gICAgICBlbHNlIGlmICgqcCA9PSAnLScpCi0JewotCSAgbmVnID0gdHJ1ZTsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIGJhc2UgPSAxMDsKLSAgICAgIGlmICgqcCA9PSAnMCcpCi0JewotCSAgaWYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnKQotCSAgICB7Ci0JICAgICAgYmFzZSA9IDE2OwotCSAgICAgIHAgKz0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmFzZSA9IDg7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JfQotCi0gICAgICBvdmVyID0gKChiZmRfdm1hKSAoYmZkX3NpZ25lZF92bWEpIC0xKSAvIChiZmRfdm1hKSBiYXNlOwotICAgICAgbGFzdGRpZyA9ICgoYmZkX3ZtYSkgKGJmZF9zaWduZWRfdm1hKSAtMSkgJSAoYmZkX3ZtYSkgYmFzZTsKLQotICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLSAgICAgIHYgPSAwOwotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaW50IGQ7Ci0KLQkgIGQgPSAqcCsrOwotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBkKSkKLQkgICAgZCAtPSAnMCc7Ci0JICBlbHNlIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgZCkpCi0JICAgIGQgLT0gJ0EnOwotCSAgZWxzZSBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGQpKQotCSAgICBkIC09ICdhJzsKLQkgIGVsc2UKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChkID49IGJhc2UpCi0JICAgIGJyZWFrOwotCi0JICBpZiAodiA+IG92ZXIgfHwgKHYgPT0gb3ZlciAmJiAoYmZkX3ZtYSkgZCA+IGxhc3RkaWcpKQotCSAgICB7Ci0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBvdmVyZmxvdykKLQl7Ci0JICBpZiAobmVnKQotCSAgICB2ID0gLSB2OwotCSAgcmV0dXJuIHY7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIG51bWJlciBpcyB0b28gbGFyZ2UgdG8gcmVwcmVzZW50IGluIGEKLSAgICAgYmZkX3ZtYS4gICovCi0KLSAgaWYgKHBvdmVyZmxvdyAhPSBOVUxMKQotICAgICpwb3ZlcmZsb3cgPSB0cnVlOwotICBlbHNlCi0gICAgd2Fybl9zdGFiIChvcmlnLCBfKCJudW1lcmljIG92ZXJmbG93IikpOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGZvciBhIGJhZCBzdGFiIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1iYWRfc3RhYiAocCkKLSAgICAgY29uc3QgY2hhciAqcDsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJCYWQgc3RhYjogJXNcbiIpLCBwKTsKLX0KLQotLyogV2FybiBhYm91dCBzb21ldGhpbmcgaW4gYSBzdGFiIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi13YXJuX3N0YWIgKHAsIGVycikKLSAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgY29uc3QgY2hhciAqZXJyOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIldhcm5pbmc6ICVzOiAlc1xuIiksIGVyciwgcCk7Ci19Ci0KLS8qIENyZWF0ZSBhIGhhbmRsZSB0byBwYXJzZSBzdGFicyBzeW1ib2xzIHdpdGguICAqLwotCi0vKkFSR1NVU0VEKi8KLVBUUgotc3RhcnRfc3RhYiAoZGhhbmRsZSwgYWJmZCwgc2VjdGlvbnMsIHN5bXMsIHN5bWNvdW50KQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHNlY3Rpb25zOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLXsKLSAgc3RydWN0IHN0YWJfaGFuZGxlICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBzdGFiX2hhbmRsZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIG1lbXNldCAocmV0LCAwLCBzaXplb2YgKnJldCk7Ci0gIHJldC0+YWJmZCA9IGFiZmQ7Ci0gIHJldC0+c2VjdGlvbnMgPSBzZWN0aW9uczsKLSAgcmV0LT5zeW1zID0gc3ltczsKLSAgcmV0LT5zeW1jb3VudCA9IHN5bWNvdW50OwotICByZXQtPmZpbGVzID0gMTsKLSAgcmV0LT5maWxlX3R5cGVzID0gKHN0cnVjdCBzdGFiX3R5cGVzICoqKSB4bWFsbG9jIChzaXplb2YgKnJldC0+ZmlsZV90eXBlcyk7Ci0gIHJldC0+ZmlsZV90eXBlc1swXSA9IE5VTEw7Ci0gIHJldC0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBXaGVuIHdlIGhhdmUgcHJvY2Vzc2VkIGFsbCB0aGUgc3RhYnMgaW5mb3JtYXRpb24sIHdlIG5lZWQgdG8gZ28KLSAgIHRocm91Z2ggYW5kIGZpbGwgaW4gYWxsIHRoZSB1bmRlZmluZWQgdGFncy4gICovCi0KLWJvb2xlYW4KLWZpbmlzaF9zdGFiIChkaGFuZGxlLCBoYW5kbGUpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBQVFIgaGFuZGxlOwotewotICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IHN0YWJfdGFnICpzdDsKLQotICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCi0JICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgaW5mby0+ZnVuY3Rpb25fZW5kKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLSAgICAgIGluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKLSAgICB9Ci0KLSAgZm9yIChzdCA9IGluZm8tPnRhZ3M7IHN0ICE9IE5VTEw7IHN0ID0gc3QtPm5leHQpCi0gICAgewotICAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLQotICAgICAga2luZCA9IHN0LT5raW5kOwotICAgICAgaWYgKGtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMKQotCWtpbmQgPSBERUJVR19LSU5EX1NUUlVDVDsKLSAgICAgIHN0LT5zbG90ID0gZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIHN0LT5uYW1lLCBraW5kKTsKLSAgICAgIGlmIChzdC0+c2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIHN0YWJzIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLXBhcnNlX3N0YWIgKGRoYW5kbGUsIGhhbmRsZSwgdHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgZGVzYzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfaGFuZGxlICopIGhhbmRsZTsKLQotICAvKiBnY2Mgd2lsbCBlbWl0IHR3byBOX1NPIHN0cmluZ3MgcGVyIGNvbXBpbGF0aW9uIHVuaXQsIG9uZSBmb3IgdGhlCi0gICAgIGRpcmVjdG9yeSBuYW1lIGFuZCBvbmUgZm9yIHRoZSBmaWxlIG5hbWUuICBXZSBqdXN0IGNvbGxlY3QgTl9TTwotICAgICBzdHJpbmdzIGFzIHdlIHNlZSB0aGVtLCBhbmQgc3RhcnQgdGhlIG5ldyBjb21waWxhdGlvbiB1bml0IHdoZW4KLSAgICAgd2Ugc2VlIGEgbm9uIE5fU08gc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnNvX3N0cmluZyAhPSBOVUxMCi0gICAgICAmJiAodHlwZSAhPSBOX1NPIHx8ICpzdHJpbmcgPT0gJ1wwJyB8fCB2YWx1ZSAhPSBpbmZvLT5zb192YWx1ZSkpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCBpbmZvLT5zb19zdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPm1haW5fZmlsZW5hbWUgPSBpbmZvLT5zb19zdHJpbmc7Ci0KLSAgICAgIGluZm8tPmdjY19jb21waWxlZCA9IDA7Ci0gICAgICBpbmZvLT5uX29wdF9mb3VuZCA9IGZhbHNlOwotCi0gICAgICAvKiBHZW5lcmFsbHksIGZvciBzdGFicyBpbiB0aGUgc3ltYm9sIHRhYmxlLCB0aGUgTl9MQlJBQyBhbmQKLQkgTl9SQlJBQyBzeW1ib2xzIGFyZSByZWxhdGl2ZSB0byB0aGUgTl9TTyBzeW1ib2wgdmFsdWUuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2VjdGlvbnMpCi0JaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQgPSBpbmZvLT5zb192YWx1ZTsKLQotICAgICAgLyogV2UgbmVlZCB0byByZXNldCB0aGUgbWFwcGluZyBmcm9tIHR5cGUgbnVtYmVycyB0byB0eXBlcy4gIFdlCi0JIGNhbid0IGZyZWUgdGhlIG9sZCBtYXBwaW5nLCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YKLQkgZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlLiAgKi8KLSAgICAgIGluZm8tPmZpbGVzID0gMTsKLSAgICAgIGluZm8tPmZpbGVfdHlwZXMgPSAoKHN0cnVjdCBzdGFiX3R5cGVzICoqKQotCQkJICB4bWFsbG9jIChzaXplb2YgKmluZm8tPmZpbGVfdHlwZXMpKTsKLSAgICAgIGluZm8tPmZpbGVfdHlwZXNbMF0gPSBOVUxMOwotCi0gICAgICBpbmZvLT5zb19zdHJpbmcgPSBOVUxMOwotCi0gICAgICAvKiBOb3cgcHJvY2VzcyB3aGF0ZXZlciB0eXBlIHdlIGp1c3QgZ290LiAgKi8KLSAgICB9Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIE5fRk46Ci0gICAgY2FzZSBOX0ZOX1NFUToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0xCUkFDOgotICAgICAgLyogSWdub3JlIGV4dHJhIG91dGVybW9zdCBjb250ZXh0IGZyb20gU3VuUFJPIGNjIGFuZCBhY2MuICAqLwotICAgICAgaWYgKGluZm8tPm5fb3B0X2ZvdW5kICYmIGRlc2MgPT0gMSkKLQlicmVhazsKLQotICAgICAgaWYgKCEgaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiTl9MQlJBQyBub3Qgd2l0aGluIGZ1bmN0aW9uXG4iKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdGFydCBhbiBpbm5lciBsZXhpY2FsIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X2Jsb2NrIChkaGFuZGxlLAotCQkJICAgICAgICh2YWx1ZQotCQkJCSsgaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQKLQkJCQkrIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRW1pdCBhbnkgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9ucy4gICovCi0gICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICsraW5mby0+YmxvY2tfZGVwdGg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9SQlJBQzoKLSAgICAgIC8qIElnbm9yZSBleHRyYSBvdXRlcm1vc3QgY29udGV4dCBmcm9tIFN1blBSTyBjYyBhbmQgYWNjLiAgKi8KLSAgICAgIGlmIChpbmZvLT5uX29wdF9mb3VuZCAmJiBkZXNjID09IDEpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlIHNob3VsZG4ndCBoYXZlIGFueSBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb25zIGhlcmUsIGJ1dCwKLSAgICAgICAgIGlmIHdlIGRvLCB3ZSBwcm9iYWJseSBuZWVkIHRvIGVtaXQgdGhlbSBiZWZvcmUgY2xvc2luZyB0aGUKLSAgICAgICAgIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRW5kIGFuIGlubmVyIGxleGljYWwgYmxvY2suICAqLwotICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChkaGFuZGxlLAotCQkJICAgICAodmFsdWUKLQkJCSAgICAgICsgaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQKLQkJCSAgICAgICsgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0KSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAtLWluZm8tPmJsb2NrX2RlcHRoOwotICAgICAgaWYgKGluZm8tPmJsb2NrX2RlcHRoIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIlRvbyBtYW55IE5fUkJSQUNzXG4iKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fU086Ci0gICAgICAvKiBUaGlzIGFsd2F5cyBlbmRzIGEgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKLQl7Ci0JICBiZmRfdm1hIGVuZHZhbDsKLQotCSAgZW5kdmFsID0gdmFsdWU7Ci0JICBpZiAoKnN0cmluZyAhPSAnXDAnCi0JICAgICAgJiYgaW5mby0+ZnVuY3Rpb25fZW5kICE9IChiZmRfdm1hKSAtMQotCSAgICAgICYmIGluZm8tPmZ1bmN0aW9uX2VuZCA8IGVuZHZhbCkKLQkgICAgZW5kdmFsID0gaW5mby0+ZnVuY3Rpb25fZW5kOwotCSAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKLQkgICAgICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgZW5kdmFsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0JICBpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JfQotCi0gICAgICAvKiBBbiBlbXB0eSBzdHJpbmcgaXMgZW1pdHRlZCBieSBnY2MgYXQgdGhlIGVuZCBvZiBhIGNvbXBpbGF0aW9uCi0gICAgICAgICB1bml0LiAgKi8KLSAgICAgIGlmICgqc3RyaW5nID09ICdcMCcpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIEp1c3QgYWNjdW11bGF0ZSBzdHJpbmdzIHVudGlsIHdlIHNlZSBhIG5vbiBOX1NPIHN5bWJvbC4gIElmCi0gICAgICAgICB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBvciBzb21lIG90aGVyCi0JIGZvcm0gb2YgYWJzb2x1dGUgcGF0aCBzcGVjaWZpY2F0aW9uLCB3ZSBkaXNjYXJkIHRoZSBwcmV2aW91c2x5Ci0gICAgICAgICBhY2N1bXVsYXRlZCBzdHJpbmdzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zb19zdHJpbmcgPT0gTlVMTCkKLQlpbmZvLT5zb19zdHJpbmcgPSB4c3RyZHVwIChzdHJpbmcpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmY7Ci0KLQkgIGYgPSBpbmZvLT5zb19zdHJpbmc7Ci0KLQkgIGlmICggICAoc3RyaW5nWzBdID09ICcvJykKLQkgICAgICB8fCAoc3RyaW5nWzBdID09IERJUl9TRVBBUkFUT1IpCi0JICAgICAgfHwgKCAgIChESVJfU0VQQVJBVE9SID09ICdcXCcpCi0JCSAgJiYgKHN0cmluZ1sxXSA9PSAnOicpCi0JCSAgJiYgKCAgIChzdHJpbmdbMl0gPT0gRElSX1NFUEFSQVRPUikKLQkJICAgICAgfHwgKHN0cmluZ1syXSA9PSAnLycpKSkpCi0JICAgIGluZm8tPnNvX3N0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7Ci0JICBlbHNlCi0JICAgIGluZm8tPnNvX3N0cmluZyA9IGNvbmNhdCAoaW5mby0+c29fc3RyaW5nLCBzdHJpbmcsCi0JCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICBmcmVlIChmKTsKLQl9Ci0KLSAgICAgIGluZm8tPnNvX3ZhbHVlID0gdmFsdWU7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NPTDoKLSAgICAgIC8qIFN0YXJ0IGFuIGluY2x1ZGUgZmlsZS4gICovCi0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGRoYW5kbGUsIHN0cmluZykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fQklOQ0w6Ci0gICAgICAvKiBTdGFydCBhbiBpbmNsdWRlIGZpbGUgd2hpY2ggbWF5IGJlIHJlcGxhY2VkLiAgKi8KLSAgICAgIHB1c2hfYmluY2wgKGluZm8sIHN0cmluZywgdmFsdWUpOwotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VJTkNMOgotICAgICAgLyogRW5kIGFuIE5fQklOQ0wgaW5jbHVkZS4gICovCi0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGRoYW5kbGUsIHBvcF9iaW5jbCAoaW5mbykpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VYQ0w6Ci0gICAgICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIGEgaGVhZGVyIGZpbGUgbmFtZWQgYnkgTl9CSU5DTCB3aGljaAotICAgICAgICAgd2FzIGVsaW1pbmF0ZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgICBpZiAoISBmaW5kX2V4Y2wgKGluZm8sIHN0cmluZywgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NMSU5FOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2xpbmUgKGRoYW5kbGUsIGRlc2MsCi0JCQkgICAgICAgdmFsdWUgKyBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0JDT01NOgotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VDT01NOgotICAgICAgaWYgKCEgZGVidWdfZW5kX2NvbW1vbl9ibG9jayAoZGhhbmRsZSwgc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9GVU46Ci0gICAgICBpZiAoKnN0cmluZyA9PSAnXDAnKQotCXsKLQkgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFsd2F5cyBtYXJrcyB0aGUgZW5kIG9mIGEgZnVuY3Rpb247IHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgIG5lZWQgdG8gd29ycnkgYWJvdXQgaW5mby0+ZnVuY3Rpb25fZW5kLiAgKi8KLQkgICAgICBpZiAoaW5mby0+c2VjdGlvbnMpCi0JCXZhbHVlICs9IGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldDsKLQkgICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCQkgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCB2YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQkgICAgICBpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQSBjb25zdCBzdGF0aWMgc3ltYm9sIGluIHRoZSAudGV4dCBzZWN0aW9uIHdpbGwgaGF2ZSBhbiBOX0ZVTgotICAgICAgICAgZW50cnkuICBXZSBuZWVkIHRvIHVzZSB0aGVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLAotICAgICAgICAgaW4gY2FzZSB3ZSBhcmUgbG9va2luZyBhdCBnY2Mgb3V0cHV0IGJlZm9yZSBpdCB3YXMgY2hhbmdlZCB0bwotICAgICAgICAgYWx3YXlzIGVtaXQgYW4gZW1wdHkgTl9GVU4uICBXZSBjYW4ndCBjYWxsIGRlYnVnX2VuZF9mdW5jdGlvbgotICAgICAgICAgaGVyZSwgYmVjYXVzZSBpdCBtaWdodCBiZSBhIGxvY2FsIHN0YXRpYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbgotCSAgJiYgKGluZm8tPmZ1bmN0aW9uX2VuZCA9PSAoYmZkX3ZtYSkgLTEKLQkgICAgICB8fCB2YWx1ZSA8IGluZm8tPmZ1bmN0aW9uX2VuZCkpCi0JaW5mby0+ZnVuY3Rpb25fZW5kID0gdmFsdWU7Ci0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyB0aGUgc3RyaW5nIGZvciBOX1NUU1lNLCBOX0xDU1lNIG9yIE5fUk9TWU0KLSAgICAgICAgIHN5bWJvbHMsIGFuZCBpZiBpdCBkb2VzIG5vdCBzdGFydCB3aXRoIDpTLCBnZGIgcmVsb2NhdGVzIHRoZQotICAgICAgICAgdmFsdWUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgZ2NjIGFsd2F5cyBzZWVtcyB0byB1c2UKLSAgICAgICAgIDpTLCBzbyB3ZSBkb24ndCB3b3JyeSBhYm91dCB0aGlzLiAgKi8KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQljb25zdCBjaGFyICpjb2xvbjsKLQotCWNvbG9uID0gc3RyY2hyIChzdHJpbmcsICc6Jyk7Ci0JaWYgKGNvbG9uICE9IE5VTEwKLQkgICAgJiYgKGNvbG9uWzFdID09ICdmJyB8fCBjb2xvblsxXSA9PSAnRicpKQotCSAgewotCSAgICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCSAgICAgIHsKLQkJYmZkX3ZtYSBlbmR2YWw7Ci0KLQkJZW5kdmFsID0gdmFsdWU7Ci0JCWlmIChpbmZvLT5mdW5jdGlvbl9lbmQgIT0gKGJmZF92bWEpIC0xCi0JCSAgICAmJiBpbmZvLT5mdW5jdGlvbl9lbmQgPCBlbmR2YWwpCi0JCSAgZW5kdmFsID0gaW5mby0+ZnVuY3Rpb25fZW5kOwotCQlpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCQkgICAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGVuZHZhbCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JICAgICAgfQotCSAgICAvKiBGb3Igc3RhYnMgaW4gc2VjdGlvbnMsIGxpbmUgbnVtYmVycyBhbmQgYmxvY2sgYWRkcmVzc2VzCi0gICAgICAgICAgICAgICBhcmUgb2Zmc2V0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICAqLwotCSAgICBpZiAoaW5mby0+c2VjdGlvbnMpCi0JICAgICAgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0ID0gdmFsdWU7Ci0JICAgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoISBwYXJzZV9zdGFiX3N0cmluZyAoZGhhbmRsZSwgaW5mbywgdHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9PUFQ6Ci0gICAgICBpZiAoc3RyaW5nICE9IE5VTEwgJiYgc3RyY21wIChzdHJpbmcsICJnY2MyX2NvbXBpbGVkLiIpID09IDApCi0JaW5mby0+Z2NjX2NvbXBpbGVkID0gMjsKLSAgICAgIGVsc2UgaWYgKHN0cmluZyAhPSBOVUxMICYmIHN0cmNtcCAoc3RyaW5nLCAiZ2NjX2NvbXBpbGVkLiIpID09IDApCi0JaW5mby0+Z2NjX2NvbXBpbGVkID0gMTsKLSAgICAgIGVsc2UKLQlpbmZvLT5uX29wdF9mb3VuZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9PQko6Ci0gICAgY2FzZSBOX0VORE06Ci0gICAgY2FzZSBOX01BSU46Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIHRoZSBzdGFicyBzdHJpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9zdHJpbmcgKGRoYW5kbGUsIGluZm8sIHN0YWJ0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBpbnQgc3RhYnR5cGU7Ci0gICAgIGludCBkZXNjOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCB0eXBlOwotICBkZWJ1Z190eXBlIGR0eXBlOwotICBib29sZWFuIHN5bm9ueW07Ci0gIGJvb2xlYW4gc2VsZl9jcm9zc3JlZjsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBwID0gc3RyY2hyIChzdHJpbmcsICc6Jyk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgd2hpbGUgKHBbMV0gPT0gJzonKQotICAgIHsKLSAgICAgIHAgKz0gMjsKLSAgICAgIHAgPSBzdHJjaHIgKHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogR0NDIDIueCBwdXRzIHRoZSBsaW5lIG51bWJlciBpbiBkZXNjLiAgU3VuT1MgYXBwYXJlbnRseSBwdXRzIGluCi0gICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgYSB0eXBlIG9yIG9iamVjdCwgd2hpY2ggd2UKLSAgICAgaWdub3JlLiAgKi8KLSAgaWYgKGluZm8tPmdjY19jb21waWxlZCA+PSAyKQotICAgIGxpbmVubyA9IGRlc2M7Ci0gIGVsc2UKLSAgICBsaW5lbm8gPSAwOwotCi0gIC8qIEZJWE1FOiBTb21ldGltZXMgdGhlIHNwZWNpYWwgQysrIG5hbWVzIHN0YXJ0IHdpdGggJy4nLiAgKi8KLSAgbmFtZSA9IE5VTEw7Ci0gIGlmIChzdHJpbmdbMF0gPT0gJyQnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3RyaW5nWzFdKQotCXsKLQljYXNlICd0JzoKLQkgIG5hbWUgPSAidGhpcyI7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIC8qIFdhczogbmFtZSA9ICJ2cHRyIjsgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgbmFtZSA9ICJlaF90aHJvdyI7Ci0JICBicmVhazsKLQljYXNlICdfJzoKLQkgIC8qIFRoaXMgd2FzIGFuIGFub255bW91cyB0eXBlIHRoYXQgd2FzIG5ldmVyIGZpeGVkIHVwLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgLyogU3VuUFJPICgzLjAgYXQgbGVhc3QpIHN0YXRpYyB2YXJpYWJsZSBlbmNvZGluZy4gICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgd2Fybl9zdGFiIChzdHJpbmcsIF8oInVua25vd24gQysrIGVuY29kZWQgbmFtZSIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAocCA9PSBzdHJpbmcgfHwgKHN0cmluZ1swXSA9PSAnICcgJiYgcCA9PSBzdHJpbmcgKyAxKSkKLQluYW1lID0gTlVMTDsKLSAgICAgIGVsc2UKLQluYW1lID0gc2F2ZXN0cmluZyAoc3RyaW5nLCBwIC0gc3RyaW5nKTsKLSAgICB9Ci0KLSAgKytwOwotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnKCcgfHwgKnAgPT0gJy0nKQotICAgIHR5cGUgPSAnbCc7Ci0gIGVsc2UKLSAgICB0eXBlID0gKnArKzsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2MnOgotICAgICAgLyogYyBpcyBhIHNwZWNpYWwgY2FzZSwgbm90IGZvbGxvd2VkIGJ5IGEgdHlwZS1udW1iZXIuCi0JIFNZTUJPTDpjPWlWQUxVRSBmb3IgYW4gaW50ZWdlciBjb25zdGFudCBzeW1ib2wuCi0JIFNZTUJPTDpjPXJWQUxVRSBmb3IgYSBmbG9hdGluZyBjb25zdGFudCBzeW1ib2wuCi0JIFNZTUJPTDpjPWVUWVBFLElOVFZBTFVFIGZvciBhbiBlbnVtIGNvbnN0YW50IHN5bWJvbC4KLQkgZS5nLiAiYjpjPWU2LDAiIGZvciAiY29uc3QgYiA9IGJsb2IxIgotCSAod2hlcmUgdHlwZSA2IGlzIGRlZmluZWQgYnkgImJsb2JzOnQ2PWVibG9iMTowLGJsb2IyOjEsOyIpLiAgKi8KLSAgICAgIGlmICgqcCAhPSAnPScpCi0JewotCSAgYmFkX3N0YWIgKHN0cmluZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKytwOwotICAgICAgc3dpdGNoICgqcCsrKQotCXsKLQljYXNlICdyJzoKLQkgIC8qIEZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQkgIGlmICghIGRlYnVnX3JlY29yZF9mbG9hdF9jb25zdCAoZGhhbmRsZSwgbmFtZSwgYXRvZiAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIC8qIEludGVnZXIgY29uc3RhbnQuICAqLwotCSAgLyogRGVmaW5pbmcgaW50ZWdlciBjb25zdGFudHMgdGhpcyB3YXkgaXMga2luZCBvZiBzaWxseSwKLQkgICAgIHNpbmNlICdlJyBjb25zdGFudHMgYWxsb3dzIHRoZSBjb21waWxlciB0byBnaXZlIG5vdCBvbmx5Ci0JICAgICB0aGUgdmFsdWUsIGJ1dCB0aGUgdHlwZSBhcyB3ZWxsLiAgQyBoYXMgYXQgbGVhc3QgaW50LAotCSAgICAgbG9uZywgdW5zaWduZWQgaW50LCBhbmQgbG9uZyBsb25nIGFzIGNvbnN0YW50IHR5cGVzOwotCSAgICAgb3RoZXIgbGFuZ3VhZ2VzIHByb2JhYmx5IHNob3VsZCBoYXZlIGF0IGxlYXN0IHVuc2lnbmVkIGFzCi0JICAgICB3ZWxsIGFzIHNpZ25lZCBjb25zdGFudHMuICAqLwotCSAgaWYgKCEgZGVidWdfcmVjb3JkX2ludF9jb25zdCAoZGhhbmRsZSwgbmFtZSwgYXRvaSAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIC8qIFNZTUJPTDpjPWVUWVBFLElOVFZBTFVFIGZvciBhIGNvbnN0YW50IHN5bWJvbCB3aG9zZSB2YWx1ZQotCSAgICAgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGludGVncmFsLgotCSAgICAgZS5nLiAiYjpjPWU2LDAiIGZvciAiY29uc3QgYiA9IGJsb2IxIgotCSAgICAgKHdoZXJlIHR5cGUgNiBpcyBkZWZpbmVkIGJ5ICJibG9iczp0Nj1lYmxvYjE6MCxibG9iMjoxLDsiKS4gICovCi0JICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAmcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCpwICE9ICcsJykKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgZGVidWdfcmVjb3JkX3R5cGVkX2NvbnN0IChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgYXRvaSAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYmFkX3N0YWIgKHN0cmluZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgLyogVGhlIG5hbWUgb2YgYSBjYXVnaHQgZXhjZXB0aW9uLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJICAgICAgICZwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9sYWJlbCAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgLyogQSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIHR5cGUgPT0gJ0YnLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTdW4gYWNjIHB1dHMgZGVjbGFyZWQgdHlwZXMgb2YgYXJndW1lbnRzIGhlcmUuICBXZSBkb24ndCBjYXJlCi0JIGFib3V0IHRoZWlyIGFjdHVhbCB0eXBlcyAoRklYTUUgLS0gd2Ugc2hvdWxkIHJlbWVtYmVyIHRoZSB3aG9sZQotCSBmdW5jdGlvbiBwcm90b3R5cGUpLCBidXQgdGhlIGxpc3QgbWF5IGRlZmluZSBzb21lIG5ldyB0eXBlcwotCSB0aGF0IHdlIGhhdmUgdG8gcmVtZW1iZXIsIHNvIHdlIG11c3Qgc2NhbiBpdCBub3cuICAqLwotICAgICAgd2hpbGUgKCpwID09ICc7JykKLQl7Ci0JICArK3A7Ci0JICBpZiAocGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCkKLQkgICAgICA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICB7Ci0JY2hhciBsZWFkaW5nOwotCWxvbmcgYzsKLQlhc3ltYm9sICoqcHM7Ci0KLQkvKiBBIGdsb2JhbCBzeW1ib2wuICBUaGUgdmFsdWUgbXVzdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUKLQkgICBzeW1ib2wgdGFibGUuICAqLwotCWR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0JbGVhZGluZyA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoaW5mby0+YWJmZCk7Ci0JZm9yIChjID0gaW5mby0+c3ltY291bnQsIHBzID0gaW5mby0+c3ltczsgYyA+IDA7IC0tYywgKytwcykKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbjsKLQotCSAgICBuID0gYmZkX2FzeW1ib2xfbmFtZSAoKnBzKTsKLQkgICAgaWYgKGxlYWRpbmcgIT0gJ1wwJyAmJiAqbiA9PSBsZWFkaW5nKQotCSAgICAgICsrbjsKLQkgICAgaWYgKCpuID09ICpuYW1lICYmIHN0cmNtcCAobiwgbmFtZSkgPT0gMCkKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoYyA+IDApCi0JICB2YWx1ZSA9IGJmZF9hc3ltYm9sX3ZhbHVlICgqcHMpOwotCWlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfR0xPQkFMLAotCQkJCSAgICB2YWx1ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogVGhpcyBjYXNlIGlzIGZha2VkIGJ5IGEgY29uZGl0aW9uYWwgYWJvdmUsIHdoZW4gdGhlcmUgaXMgbm8KLQkgY29kZSBsZXR0ZXIgaW4gdGhlIGRieCBkYXRhLiAgRGJ4IGRhdGEgbmV2ZXIgYWN0dWFsbHkKLQkgY29udGFpbnMgJ2wnLiAgKi8KLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdzJzoKLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfTE9DQUwsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICAgIC8qIEEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLSAgICAgIGlmICgqcCAhPSAnRicpCi0JZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCS8qIHBGIGlzIGEgdHdvLWxldHRlciBjb2RlIHRoYXQgbWVhbnMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgaW4KLQkgICBGb3J0cmFuLiAgVGhlIHR5cGUtbnVtYmVyIHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuCi0JICAgdmFsdWUuICBUcmFuc2xhdGUgaXQgaW50byBhIHBvaW50ZXItdG8tZnVuY3Rpb24gdHlwZS4gICovCi0JICArK3A7Ci0JICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkJICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGR0eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgewotCSAgICAgIGRlYnVnX3R5cGUgZnR5cGU7Ci0KLQkgICAgICBmdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgZHR5cGUsCi0JCQkJCQkoZGVidWdfdHlwZSAqKSBOVUxMLCBmYWxzZSk7Ci0JICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwgZnR5cGUpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9TVEFDSywKLQkJCQkgICAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IEF0IHRoaXMgcG9pbnQgZ2RiIGNvbnNpZGVycyByZWFycmFuZ2luZyB0aGUgcGFyYW1ldGVyCi0JIGFkZHJlc3Mgb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgaWYgaXQgaXMgc21hbGxlciB0aGFuIGFuIGludC4KLQkgV2UgaGF2ZSBubyB3YXkgdG8gZG8gdGhhdCwgc2luY2Ugd2UgZG9uJ3QgcmVhbGx5IGtub3cgbXVjaAotCSBhYm91dCB0aGUgdGFyZ2V0LiAgKi8KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgIGlmIChzdGFidHlwZSA9PSBOX0ZVTikKLQl7Ci0JICAvKiBQcm90b3R5cGUgb2YgYSBmdW5jdGlvbiByZWZlcmVuY2VkIGJ5IHRoaXMgZmlsZS4gICovCi0JICB3aGlsZSAoKnAgPT0gJzsnKQotCSAgICB7Ci0JICAgICAgKytwOwotCSAgICAgIGlmIChwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAgIChkZWJ1Z190eXBlICoqKSBOVUxMKQotCQkgID09IERFQlVHX1RZUEVfTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJ1InOgotICAgICAgLyogUGFyYW1ldGVyIHdoaWNoIGlzIGluIGEgcmVnaXN0ZXIuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fUkVHLAotCQkJCSAgICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIC8qIFJlZ2lzdGVyIHZhcmlhYmxlIChlaXRoZXIgZ2xvYmFsIG9yIGxvY2FsKS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX1JFR0lTVEVSLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IEF0IHRoaXMgcG9pbnQgZ2RiIGNoZWNrcyB0byBjb21iaW5lIHBhaXJzIG9mICdwJyBhbmQKLQkgJ3InIHN0YWJzIGludG8gYSBzaW5nbGUgJ1AnIHN0YWIuICAqLwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgLyogU3RhdGljIHN5bWJvbCBhdCB0b3AgbGV2ZWwgb2YgZmlsZSAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19TVEFUSUMsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIC8qIEEgdHlwZWRlZi4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgJnAsICZzbG90KTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBBIG5hbWVsZXNzIHR5cGUuICBOb3RoaW5nIHRvIGRvLiAgKi8KLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgZHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIGR0eXBlKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc2xvdCAhPSBOVUxMKQotCSpzbG90ID0gZHR5cGU7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBTdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHRhZy4gIEZvciBHTlUgQysrLCB0aGlzIGNhbiBiZSBiZSBmb2xsb3dlZAotCSBieSAndCcgd2hpY2ggbWVhbnMgd2UgYXJlIHR5cGVkZWYnaW5nIGl0IGFzIHdlbGwuICAqLwotICAgICAgaWYgKCpwICE9ICd0JykKLQl7Ci0JICBzeW5vbnltID0gZmFsc2U7Ci0JICAvKiBGSVhNRTogZ2RiIHNldHMgc3lub255bSB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGxhbmd1YWdlCi0gICAgICAgICAgICAgaXMgQysrLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3lub255bSA9IHRydWU7Ci0JICArK3A7Ci0JfQotCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgJnAsICZzbG90KTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogSU5GTy0+U0VMRl9DUk9TU1JFRiBpcyBzZXQgYnkgcGFyc2Vfc3RhYl90eXBlIGlmIHRoaXMgdHlwZSBpcwotICAgICAgICAgYSBjcm9zcyByZWZlcmVuY2UgdG8gaXRzZWxmLiAgVGhlc2UgYXJlIGdlbmVyYXRlZCBieSBzb21lCi0gICAgICAgICB2ZXJzaW9ucyBvZiBnKysuICAqLwotICAgICAgc2VsZl9jcm9zc3JlZiA9IGluZm8tPnNlbGZfY3Jvc3NyZWY7Ci0KLSAgICAgIGR0eXBlID0gZGVidWdfdGFnX3R5cGUgKGRoYW5kbGUsIG5hbWUsIGR0eXBlKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHNsb3QgIT0gTlVMTCkKLQkqc2xvdCA9IGR0eXBlOwotCi0gICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhIGNyb3NzIHJlZmVyZW5jZSB0byB0aGlzIHRhZyB3aGljaCB3ZSBjYW4gbm93Ci0gICAgICAgICBmaWxsIGluLiAgQXZvaWQgZmlsbGluZyBpbiBhIGNyb3NzIHJlZmVyZW5jZSB0byBvdXJzZWx2ZXMsCi0gICAgICAgICBiZWNhdXNlIHRoYXQgd291bGQgbGVhZCB0byBjaXJjdWxhciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCEgc2VsZl9jcm9zc3JlZikKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RhYl90YWcgKipwc3Q7Ci0KLQkgIGZvciAocHN0ID0gJmluZm8tPnRhZ3M7ICpwc3QgIT0gTlVMTDsgcHN0ID0gJigqcHN0KS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgoKnBzdCktPm5hbWVbMF0gPT0gbmFtZVswXQotCQkgICYmIHN0cmNtcCAoKCpwc3QpLT5uYW1lLCBuYW1lKSA9PSAwKQotCQl7Ci0JCSAgKCpwc3QpLT5zbG90ID0gZHR5cGU7Ci0JCSAgKnBzdCA9ICgqcHN0KS0+bmV4dDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc3lub255bSkKLQl7Ci0JICBkdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgZHR5cGUpOwotCSAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoc2xvdCAhPSBOVUxMKQotCSAgICAqc2xvdCA9IGR0eXBlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIC8qIFN0YXRpYyBzeW1ib2wgb2YgbG9jYWwgc2NvcGUgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsCi0JCQkJICBERUJVR19MT0NBTF9TVEFUSUMsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3YnOgotICAgICAgLyogUmVmZXJlbmNlIHBhcmFtZXRlci4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9SRUZFUkVOQ0UsCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2EnOgotICAgICAgLyogUmVmZXJlbmNlIHBhcmFtZXRlciB3aGljaCBpcyBpbiBhIHJlZ2lzdGVyLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1JFRl9SRUcsCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgLyogVGhpcyBpcyB1c2VkIGJ5IFN1biBGT1JUUkFOIGZvciAiZnVuY3Rpb24gcmVzdWx0IHZhbHVlIi4KLQkgU3VuIGNsYWltcyAoImRieCBhbmQgZGJ4dG9vbCBpbnRlcmZhY2VzIiwgMm5kIGVkKQotCSB0aGF0IFBhc2NhbCB1c2VzIGl0IHRvbywgYnV0IHdoZW4gSSB0cmllZCBpdCBQYXNjYWwgdXNlZAotCSAieDozIiAobG9jYWwgc3ltYm9sKSBpbnN0ZWFkLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfTE9DQUwsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYmFkX3N0YWIgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBnZGIgY29udmVydHMgc3RydWN0dXJlIHZhbHVlcyB0byBzdHJ1Y3R1cmUgcG9pbnRlcnMgaW4gYQotICAgICBjb3VwbGUgb2YgY2FzZXMsIGRlcGVuZGluZyB1cG9uIHRoZSB0YXJnZXQuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHN0YWJzIHR5cGUuICBUaGUgdHlwZW5hbWUgYXJndW1lbnQgaXMgbm9uLU5VTEwgaWYgdGhpcyBpcyBhCi0gICB0eXBlZGVmIG9yIGEgdGFnIGRlZmluaXRpb24uICBUaGUgcHAgYXJndW1lbnQgcG9pbnRzIHRvIHRoZSBzdGFiCi0gICBzdHJpbmcsIGFuZCBpcyB1cGRhdGVkLiAgVGhlIHNsb3RwIGFyZ3VtZW50IHBvaW50cyB0byBhIHBsYWNlIHRvCi0gICBzdG9yZSB0aGUgc2xvdCB1c2VkIGlmIHRoZSB0eXBlIGlzIGJlaW5nIGRlZmluZWQuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsIHNsb3RwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICoqc2xvdHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGludCB0eXBlbnVtc1syXTsKLSAgaW50IHNpemU7Ci0gIGJvb2xlYW4gc3RyaW5ncDsKLSAgaW50IGRlc2NyaXB0b3I7Ci0gIGRlYnVnX3R5cGUgZHR5cGU7Ci0KLSAgaWYgKHNsb3RwICE9IE5VTEwpCi0gICAgKnNsb3RwID0gTlVMTDsKLQotICBvcmlnID0gKnBwOwotCi0gIHNpemUgPSAtMTsKLSAgc3RyaW5ncCA9IGZhbHNlOwotCi0gIGluZm8tPnNlbGZfY3Jvc3NyZWYgPSBmYWxzZTsKLQotICAvKiBSZWFkIHR5cGUgbnVtYmVyIGlmIHByZXNlbnQuICBUaGUgdHlwZSBudW1iZXIgbWF5IGJlIG9taXR0ZWQuCi0gICAgIGZvciBpbnN0YW5jZSBpbiBhIHR3by1kaW1lbnNpb25hbCBhcnJheSBkZWNsYXJlZCB3aXRoIHR5cGUKLSAgICAgImFyMTsxOzEwO2FyMTsxOzEwOzQiLiAgKi8KLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApICYmICoqcHAgIT0gJygnICYmICoqcHAgIT0gJy0nKQotICAgIHsKLSAgICAgIC8qICd0eXBlbnVtcz0nIG5vdCBwcmVzZW50LCB0eXBlIGlzIGFub255bW91cy4gIFJlYWQgYW5kIHJldHVybgotCSB0aGUgZGVmaW5pdGlvbiwgYnV0IGRvbid0IHB1dCBpdCBpbiB0aGUgdHlwZSB2ZWN0b3IuICAqLwotICAgICAgdHlwZW51bXNbMF0gPSB0eXBlbnVtc1sxXSA9IC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCB0eXBlbnVtcykpCi0JcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgaWYgKCoqcHAgIT0gJz0nKQotCXsKLQkgIC8qIFR5cGUgaXMgbm90IGJlaW5nIGRlZmluZWQgaGVyZS4gIEVpdGhlciBpdCBhbHJlYWR5Ci0JICAgICBleGlzdHMsIG9yIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBpdC4gICovCi0JICByZXR1cm4gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKTsKLQl9Ci0KLSAgICAgIC8qIE9ubHkgc2V0IHRoZSBzbG90IGlmIHRoZSB0eXBlIGlzIGJlaW5nIGRlZmluZWQuICBUaGlzIG1lYW5zCi0gICAgICAgICB0aGF0IHRoZSBtYXBwaW5nIGZyb20gdHlwZSBudW1iZXJzIHRvIHR5cGVzIHdpbGwgb25seSByZWNvcmQKLSAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIHdoaWNoIGRlZmluZXMgYSB0eXBlLiAgSWYgd2UgZG9uJ3QgZG8KLSAgICAgICAgIHRoaXMsIHRoZW4gc29tZXRoaW5nIGxpa2UKLQkgICAgIHR5cGVkZWYgaW50IGZvbzsKLQkgICAgIGludCBpOwotCSB3aWxsIHJlY29yZCB0aGF0IGkgaXMgb2YgdHlwZSBmb28uICBVbmZvcnR1bmF0ZWx5LCBzdGFicwotCSBpbmZvcm1hdGlvbiBpcyBhbWJpZ3VvdXMgYWJvdXQgdmFyaWFibGUgdHlwZXMuICBGb3IgdGhpcyBjb2RlLAotCSAgICAgdHlwZWRlZiBpbnQgZm9vOwotCSAgICAgaW50IGk7Ci0JICAgICBmb28gajsKLQkgdGhlIHN0YWJzIGluZm9ybWF0aW9uIHJlY29yZHMgYm90aCBpIGFuZCBqIGFzIGhhdmluZyB0aGUgc2FtZQotCSB0eXBlLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBwYXRjaGluZyB0aGUgY29tcGlsZXIuICAqLwotICAgICAgaWYgKHNsb3RwICE9IE5VTEwgJiYgdHlwZW51bXNbMF0gPj0gMCAmJiB0eXBlbnVtc1sxXSA+PSAwKQotCSpzbG90cCA9IHN0YWJfZmluZF9zbG90IChpbmZvLCB0eXBlbnVtcyk7Ci0KLSAgICAgIC8qIFR5cGUgaXMgYmVpbmcgZGVmaW5lZCBoZXJlLiAgKi8KLSAgICAgIC8qIFNraXAgdGhlICc9Jy4gICovCi0gICAgICArKypwcDsKLQotICAgICAgd2hpbGUgKCoqcHAgPT0gJ0AnKQotCXsKLQkgIGNvbnN0IGNoYXIgKnAgPSAqcHAgKyAxOwotCSAgY29uc3QgY2hhciAqYXR0cjsKLQotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJygnIHx8ICpwID09ICctJykKLQkgICAgewotCSAgICAgIC8qIE1lbWJlciB0eXBlLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBUeXBlIGF0dHJpYnV0ZXMuICAqLwotCSAgYXR0ciA9IHA7Ci0KLQkgIGZvciAoOyAqcCAhPSAnOyc7ICsrcCkKLQkgICAgewotCSAgICAgIGlmICgqcCA9PSAnXDAnKQotCQl7Ci0JCSAgYmFkX3N0YWIgKG9yaWcpOwotCQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JCX0KLQkgICAgfQotCSAgKnBwID0gcCArIDE7Ci0KLQkgIHN3aXRjaCAoKmF0dHIpCi0JICAgIHsKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgc2l6ZSA9IGF0b2kgKGF0dHIgKyAxKTsKLQkgICAgICBpZiAoc2l6ZSA8PSAwKQotCQlzaXplID0gLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgc3RyaW5ncCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBJZ25vcmUgdW5yZWNvZ25pemVkIHR5cGUgYXR0cmlidXRlcywgc28gZnV0dXJlCi0JCSBjb21waWxlcnMgY2FuIGludmVudCBuZXcgb25lcy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGRlc2NyaXB0b3IgPSAqKnBwOwotICArKypwcDsKLQotICBzd2l0Y2ggKGRlc2NyaXB0b3IpCi0gICAgewotICAgIGNhc2UgJ3gnOgotICAgICAgewotCWVudW0gZGVidWdfdHlwZV9raW5kIGNvZGU7Ci0JY29uc3QgY2hhciAqcTEsICpxMiwgKnA7Ci0KLQkvKiBBIGNyb3NzIHJlZmVyZW5jZSB0byBhbm90aGVyIHR5cGUuICAqLwotCi0Jc3dpdGNoICgqKnBwKQotCSAgewotCSAgY2FzZSAncyc6Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX1NUUlVDVDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICd1JzoKLQkgICAgY29kZSA9IERFQlVHX0tJTkRfVU5JT047Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnZSc6Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX0VOVU07Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgLyogQ29tcGxhaW4gYW5kIGtlZXAgZ29pbmcsIHNvIGNvbXBpbGVycyBjYW4gaW52ZW50IG5ldwotCSAgICAgICBjcm9zcy1yZWZlcmVuY2UgdHlwZXMuICAqLwotCSAgICB3YXJuX3N0YWIgKG9yaWcsIF8oInVucmVjb2duaXplZCBjcm9zcyByZWZlcmVuY2UgdHlwZSIpKTsKLQkgICAgY29kZSA9IERFQlVHX0tJTkRfU1RSVUNUOwotCSAgICBicmVhazsKLQkgIH0KLQkrKypwcDsKLQotCXExID0gc3RyY2hyICgqcHAsICc8Jyk7Ci0JcCA9IHN0cmNociAoKnBwLCAnOicpOwotCWlmIChwID09IE5VTEwpCi0JICB7Ci0JICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQl3aGlsZSAocTEgIT0gTlVMTCAmJiBwID4gcTEgJiYgcFsxXSA9PSAnOicpCi0JICB7Ci0JICAgIHEyID0gc3RyY2hyIChxMSwgJz4nKTsKLQkgICAgaWYgKHEyID09IE5VTEwgfHwgcTIgPCBwKQotCSAgICAgIGJyZWFrOwotCSAgICBwICs9IDI7Ci0JICAgIHAgPSBzdHJjaHIgKHAsICc6Jyk7Ci0JICAgIGlmIChwID09IE5VTEwpCi0JICAgICAgewotCQliYWRfc3RhYiAob3JpZyk7Ci0JCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgfQotCSAgfQotCi0JLyogU29tZSB2ZXJzaW9ucyBvZiBnKysgY2FuIGVtaXQgc3RhYnMgbGlrZQotCSAgICAgICBmbGVlcDpUMjA9eHNmbGVlcDoKLQkgICB3aGljaCBkZWZpbmUgc3RydWN0dXJlcyBpbiB0ZXJtcyBvZiB0aGVtc2VsdmVzLiAgV2UgbmVlZCB0bwotCSAgIHRlbGwgdGhlIGNhbGxlciB0byBhdm9pZCBidWlsZGluZyBhIGNpcmN1bGFyIHN0cnVjdHVyZS4gICovCi0JaWYgKHR5cGVuYW1lICE9IE5VTEwKLQkgICAgJiYgc3RybmNtcCAodHlwZW5hbWUsICpwcCwgcCAtICpwcCkgPT0gMAotCSAgICAmJiB0eXBlbmFtZVtwIC0gKnBwXSA9PSAnXDAnKQotCSAgaW5mby0+c2VsZl9jcm9zc3JlZiA9IHRydWU7Ci0KLQlkdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgaW5mbywgKnBwLCBwIC0gKnBwLCBjb2RlKTsKLQotCSpwcCA9IHAgKyAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICctJzoKLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICBjYXNlICcoJzoKLSAgICAgIHsKLQljb25zdCBjaGFyICpob2xkOwotCWludCB4dHlwZW51bXNbMl07Ci0KLQkvKiBUaGlzIHR5cGUgaXMgZGVmaW5lZCBhcyBhbm90aGVyIHR5cGUuICAqLwotCi0JKCpwcCktLTsKLQlob2xkID0gKnBwOwotCi0JLyogUGVlayBhaGVhZCBhdCB0aGUgbnVtYmVyIHRvIGRldGVjdCB2b2lkLiAgKi8KLQlpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgeHR5cGVudW1zKSkKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQlpZiAodHlwZW51bXNbMF0gPT0geHR5cGVudW1zWzBdICYmIHR5cGVudW1zWzFdID09IHh0eXBlbnVtc1sxXSkKLQkgIHsKLQkgICAgLyogVGhpcyB0eXBlIGlzIGJlaW5nIGRlZmluZWQgYXMgaXRzZWxmLCB3aGljaCBtZWFucyB0aGF0Ci0gICAgICAgICAgICAgICBpdCBpcyB2b2lkLiAgKi8KLQkgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAqcHAgPSBob2xkOwotCi0JICAgIC8qIEdvIGJhY2sgdG8gdGhlIG51bWJlciBhbmQgaGF2ZSBwYXJzZV9zdGFiX3R5cGUgZ2V0IGl0LgotCSAgICAgICBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIGRlYWwgd2l0aCBzb21ldGhpbmcgbGlrZQotCSAgICAgICB0KDEsMik9KDMsNCk9Li4uIHdoaWNoIHRoZSBMdWNpZCBjb21waWxlciB1c2VzLiAgKi8KLQkgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0KLQlpZiAodHlwZW51bXNbMF0gIT0gLTEpCi0JICB7Ci0JICAgIGlmICghIHN0YWJfcmVjb3JkX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zLCBkdHlwZSkpCi0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAnKic6Ci0gICAgICBkdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgICBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkJKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCQlwcCwKLQkJCQkJCQkoZGVidWdfdHlwZSAqKikgTlVMTCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcmJzoKLSAgICAgIC8qIFJlZmVyZW5jZSB0byBhbm90aGVyIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZQotCSAgICAgICAoZGhhbmRsZSwKLQkJcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgICAgLyogRnVuY3Rpb24gcmV0dXJuaW5nIGFub3RoZXIgdHlwZS4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0JICAgICAgIChkaGFuZGxlLAotCQlwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCksCi0JCShkZWJ1Z190eXBlICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgLyogQ29uc3QgcXVhbGlmaWVyIG9uIHNvbWUgdHlwZSAoU3VuKS4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGFjY2VwdHMgJ2MnIGhlcmUgaWYgb3M5a19zdGFicy4gICovCi0gICAgICBkdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgIHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKLQkJCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgICBwcCwKLQkJCQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgLyogVm9sYXRpbGUgcXVhbCBvbiBzb21lIHR5cGUgKFN1bikuICAqLwotICAgICAgLyogRklYTUU6IGdkYiBhY2NlcHRzICdpJyBoZXJlIGlmIG9zOWtfc3RhYnMuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV92b2xhdGlsZV90eXBlCi0JICAgICAgIChkaGFuZGxlLAotCQlwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCkpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQCc6Ci0gICAgICAvKiBPZmZzZXQgKGNsYXNzICYgdmFyaWFibGUpIHR5cGUuICBUaGlzIGlzIHVzZWQgZm9yIGEgcG9pbnRlcgotICAgICAgICAgcmVsYXRpdmUgdG8gYW4gb2JqZWN0LiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGRvbWFpbjsKLQlkZWJ1Z190eXBlIG1lbXR5cGU7Ci0KLQkvKiBNZW1iZXIgdHlwZS4gICovCi0KLQlkb21haW4gPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChkb21haW4gPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCWlmICgqKnBwICE9ICcsJykKLQkgIHsKLQkgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCSsrKnBwOwotCi0JbWVtdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChtZW10eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQlkdHlwZSA9IGRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUgKGRoYW5kbGUsIGRvbWFpbiwgbWVtdHlwZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyMnOgotICAgICAgLyogTWV0aG9kIChjbGFzcyAmIGZuKSB0eXBlLiAgKi8KLSAgICAgIGlmICgqKnBwID09ICcjJykKLQl7Ci0JICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCi0JICArKypwcDsKLQkgIHJldHVybl90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChyZXR1cm5fdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICBpZiAoKipwcCAhPSAnOycpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgICAgfQotCSAgKysqcHA7Ci0JICBkdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLAotCQkJCQkgIERFQlVHX1RZUEVfTlVMTCwKLQkJCQkJICAoZGVidWdfdHlwZSAqKSBOVUxMLCBmYWxzZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlYnVnX3R5cGUgZG9tYWluOwotCSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLQkgIGRlYnVnX3R5cGUgKmFyZ3M7Ci0JICB1bnNpZ25lZCBpbnQgbjsKLQkgIHVuc2lnbmVkIGludCBhbGxvYzsKLQkgIGJvb2xlYW4gdmFyYXJnczsKLQotCSAgZG9tYWluID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGRvbWFpbiA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQkgIGlmICgqKnBwICE9ICcsJykKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICArKypwcDsKLQotCSAgcmV0dXJuX3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgYWxsb2MgPSAxMDsKLQkgIGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqYXJncyk7Ci0JICBuID0gMDsKLQkgIHdoaWxlICgqKnBwICE9ICc7JykKLQkgICAgewotCSAgICAgIGlmICgqKnBwICE9ICcsJykKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCQl9Ci0JICAgICAgKysqcHA7Ci0KLQkgICAgICBpZiAobiArIDEgPj0gYWxsb2MpCi0JCXsKLQkJICBhbGxvYyArPSAxMDsKLQkJICBhcmdzID0gKChkZWJ1Z190eXBlICopCi0JCQkgIHhyZWFsbG9jICgoUFRSKSBhcmdzLCBhbGxvYyAqIHNpemVvZiAqYXJncykpOwotCQl9Ci0KLQkgICAgICBhcmdzW25dID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgICAgICBpZiAoYXJnc1tuXSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgKytuOwotCSAgICB9Ci0JICArKypwcDsKLQotCSAgLyogSWYgdGhlIGxhc3QgdHlwZSBpcyBub3Qgdm9pZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHRha2VzIGEKLQkgICAgIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICBPdGhlcndpc2UsIHdlIG11c3Qgc3RyaXAKLQkgICAgIHRoZSB2b2lkIHR5cGUuICAqLwotCSAgaWYgKG4gPT0gMAotCSAgICAgIHx8IGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGFyZ3NbbiAtIDFdKSAhPSBERUJVR19LSU5EX1ZPSUQpCi0JICAgIHZhcmFyZ3MgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLS1uOwotCSAgICAgIHZhcmFyZ3MgPSBmYWxzZTsKLQkgICAgfQotCi0JICBhcmdzW25dID0gREVCVUdfVFlQRV9OVUxMOwotCi0JICBkdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBkb21haW4sIGFyZ3MsCi0JCQkJCSAgdmFyYXJncyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIC8qIFJhbmdlIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwgdHlwZW51bXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0gICAgICAvKiBTdW4gQUNDIGJ1aWx0aW4gaW50IHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAvKiBTdW4gQUNDIGJ1aWx0aW4gZmxvYXQgdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfc3VuX2Zsb2F0aW5nX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZSc6Ci0gICAgICAvKiBFbnVtZXJhdGlvbiB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9lbnVtX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAndSc6Ci0gICAgICAvKiBTdHJ1Y3Qgb3IgdW5pb24gdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwKLQkJCQkgICAgICBkZXNjcmlwdG9yID09ICdzJywgdHlwZW51bXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgIC8qIEFycmF5IHR5cGUuICAqLwotICAgICAgaWYgKCoqcHAgIT0gJ3InKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9hcnJheV90eXBlIChkaGFuZGxlLCBpbmZvLCBwcCwgc3RyaW5ncCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3NldF90eXBlIChkaGFuZGxlLAotCQkJCSAgIHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKLQkJCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkJICAgIHBwLAotCQkJCQkJICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKSwKLQkJCQkgICBzdHJpbmdwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAodHlwZW51bXNbMF0gIT0gLTEpCi0gICAgewotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIGR0eXBlKSkKLQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoc2l6ZSAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIChkaGFuZGxlLCBkdHlwZSwgKHVuc2lnbmVkIGludCkgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gZHR5cGU7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgYnkgd2hpY2ggYSB0eXBlIGlzIHJlZmVycmVkIHRvIGluIGRieCBkYXRhLCBvcgotICAgcGVyaGFwcyByZWFkIGEgcGFpciAoRklMRU5VTSwgVFlQRU5VTSkgaW4gcGFyZW50aGVzZXMuICBKdXN0IGEKLSAgIHNpbmdsZSBudW1iZXIgTiBpcyBlcXVpdmFsZW50IHRvICgwLE4pLiAgUmV0dXJuIHRoZSB0d28gbnVtYmVycyBieQotICAgc3RvcmluZyB0aGVtIGluIHRoZSB2ZWN0b3IgVFlQRU5VTVMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHR5cGVudW1zKQotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGludCAqdHlwZW51bXM7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBpZiAoKipwcCAhPSAnKCcpCi0gICAgewotICAgICAgdHlwZW51bXNbMF0gPSAwOwotICAgICAgdHlwZW51bXNbMV0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIHR5cGVudW1zWzBdID0gKGludCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgdHlwZW51bXNbMV0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICAgIGlmICgqKnBwICE9ICcpJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9yYW5nZV90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsIHR5cGVudW1zKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBpbnQgcmFuZ2VudW1zWzJdOwotICBib29sZWFuIHNlbGZfc3VicmFuZ2U7Ci0gIGRlYnVnX3R5cGUgaW5kZXhfdHlwZTsKLSAgY29uc3QgY2hhciAqczIsICpzMzsKLSAgYmZkX3NpZ25lZF92bWEgbjIsIG4zOwotICBib29sZWFuIG92Miwgb3YzOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgaW5kZXhfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAvKiBGaXJzdCBjb21lcyBhIHR5cGUgd2UgYXJlIGEgc3VicmFuZ2Ugb2YuCi0gICAgIEluIEMgaXQgaXMgdXN1YWxseSAwLCAxIG9yIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuICAqLwotICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgcmFuZ2VudW1zKSkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHNlbGZfc3VicmFuZ2UgPSAocmFuZ2VudW1zWzBdID09IHR5cGVudW1zWzBdCi0JCSAgICYmIHJhbmdlbnVtc1sxXSA9PSB0eXBlbnVtc1sxXSk7Ci0KLSAgaWYgKCoqcHAgPT0gJz0nKQotICAgIHsKLSAgICAgICpwcCA9IG9yaWc7Ci0gICAgICBpbmRleF90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmICgqKnBwID09ICc7JykKLSAgICArKypwcDsKLQotICAvKiBUaGUgcmVtYWluaW5nIHR3byBvcGVyYW5kcyBhcmUgdXN1YWxseSBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9mCi0gICAgIHRoZSByYW5nZS4gIEJ1dCBpbiBzb21lIHNwZWNpYWwgY2FzZXMgdGhleSBtZWFuIHNvbWV0aGluZyBlbHNlLiAgKi8KLSAgczIgPSAqcHA7Ci0gIG4yID0gcGFyc2VfbnVtYmVyIChwcCwgJm92Mik7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgczMgPSAqcHA7Ci0gIG4zID0gcGFyc2VfbnVtYmVyIChwcCwgJm92Myk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgaWYgKG92MiB8fCBvdjMpCi0gICAgewotICAgICAgLyogZ2NjIHdpbGwgZW1pdCByYW5nZSBzdGFicyBmb3IgbG9uZyBsb25nIHR5cGVzLiAgSGFuZGxlIHRoaXMKLSAgICAgICAgIGFzIGEgc3BlY2lhbCBjYXNlLiAgRklYTUU6IFRoaXMgbmVlZHMgdG8gYmUgbW9yZSBnZW5lcmFsLiAgKi8KLSNkZWZpbmUgTExMT1cgICIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDsiCi0jZGVmaW5lIExMSElHSCAiMDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsiCi0jZGVmaW5lIFVMTEhJR0ggIjAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIKLSAgICAgIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQl7Ci0JICBpZiAoc3RybmNtcCAoczIsIExMTE9XLCBzaXplb2YgTExMT1cgLSAxKSA9PSAwCi0JICAgICAgJiYgc3RybmNtcCAoczMsIExMSElHSCwgc2l6ZW9mIExMSElHSCAtIDEpID09IDApCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0JICBpZiAoISBvdjIKLQkgICAgICAmJiBuMiA9PSAwCi0JICAgICAgJiYgc3RybmNtcCAoczMsIFVMTEhJR0gsIHNpemVvZiBVTExISUdIIC0gMSkgPT0gMCkKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOwotCX0KLQotICAgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJudW1lcmljIG92ZXJmbG93IikpOwotICAgIH0KLQotICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgewotICAgICAgLyogQSB0eXBlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpdHNlbGYsIHdpdGggYm90aCBib3VuZHMgMCwKLSAgICAgICAgIGlzIHZvaWQuICAqLwotICAgICAgaWYgKHNlbGZfc3VicmFuZ2UgJiYgbjIgPT0gMCAmJiBuMyA9PSAwKQotCXJldHVybiBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0KLSAgICAgIC8qIEEgdHlwZSBkZWZpbmVkIGFzIGEgc3VicmFuZ2Ugb2YgaXRzZWxmLCB3aXRoIG4yIHBvc2l0aXZlIGFuZAotCSBuMyB6ZXJvLCBpcyBhIGNvbXBsZXggdHlwZSwgYW5kIG4yIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuICAqLwotICAgICAgaWYgKHNlbGZfc3VicmFuZ2UgJiYgbjMgPT0gMCAmJiBuMiA+IDApCi0JcmV0dXJuIGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCBuMik7Ci0KLSAgICAgIC8qIElmIG4zIGlzIHplcm8gYW5kIG4yIGlzIHBvc2l0aXZlLCB0aGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQKLSAgICAgICAgIHR5cGUsIGFuZCBuMiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAgKi8KLSAgICAgIGlmIChuMyA9PSAwICYmIG4yID4gMCkKLQlyZXR1cm4gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCBuMik7Ci0KLSAgICAgIC8qIElmIHRoZSB1cHBlciBib3VuZCBpcyAtMSwgdGhpcyBpcyBhbiB1bnNpZ25lZCBpbnQuICAqLwotICAgICAgaWYgKG4yID09IDAgJiYgbjMgPT0gLTEpCi0JewotCSAgLyogV2hlbiBnY2MgaXMgdXNlZCB3aXRoIC1nc3RhYnMsIGJ1dCBub3QgLWdzdGFicyssIGl0IHdpbGwgZW1pdAotCSAgICAgICAgIGxvbmcgbG9uZyBpbnQ6dDY9cjE7MDstMTsKLQkJIGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQ6dDc9cjE7MDstMTsKLQkgICAgIFdlIGhhY2sgaGVyZSB0byBoYW5kbGUgdGhpcyByZWFzb25hYmx5LiAgKi8KLQkgIGlmICh0eXBlbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJsb25nIGxvbmcgaW50IikgPT0gMCkKLQkJcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAibG9uZyBsb25nIHVuc2lnbmVkIGludCIpID09IDApCi0JCXJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLQkgICAgfQotCSAgLyogRklYTUU6IFRoZSBzaXplIGhlcmUgcmVhbGx5IGRlcGVuZHMgdXBvbiB0aGUgdGFyZ2V0LiAgKi8KLQkgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLQl9Ci0KLSAgICAgIC8qIEEgcmFuZ2Ugb2YgMCB0byAxMjcgaXMgY2hhci4gICovCi0gICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMiA9PSAwICYmIG4zID09IDEyNykKLQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBmb3IgdGhlIGxhbmd1YWdlIENISUxMIGhlcmUuICAqLwotCi0gICAgICBpZiAobjIgPT0gMCkKLQl7Ci0JICBpZiAobjMgPCAwKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgLSBuMywgdHJ1ZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweGZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweGZmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLQkgIGVsc2UgaWYgKG4zID09IDB4ZmZmZmZmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSNpZmRlZiBCRkQ2NAotCSAgZWxzZSBpZiAobjMgPT0gKCgoKGJmZF92bWEpIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IDB4ZmZmZmZmZmYpKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlIGlmIChuMyA9PSAwCi0JICAgICAgICYmIG4yIDwgMAotCSAgICAgICAmJiAoc2VsZl9zdWJyYW5nZSB8fCBuMiA9PSAtOCkpCi0JcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIC0gbjIsIHRydWUpOwotICAgICAgZWxzZSBpZiAobjIgPT0gLSBuMyAtIDEgfHwgbjIgPT0gbjMgKyAxKQotCXsKLQkgIGlmIChuMyA9PSAweDdmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotCSAgZWxzZSBpZiAobjMgPT0gMHg3ZmZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotCSAgZWxzZSBpZiAobjMgPT0gMHg3ZmZmZmZmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSNpZmRlZiBCRkQ2NAotCSAgZWxzZSBpZiAobjMgPT0gKCgoKGJmZF92bWEpIDB4N2ZmZmZmZmYpIDw8IDMyKSB8IDB4ZmZmZmZmZmYpKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotI2VuZGlmCi0JfQotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50IEkgZG9uJ3QgaGF2ZSB0aGUgZmFpbnRlc3QgaWRlYSBob3cgdG8gZGVhbCB3aXRoIGEKLSAgICAgc2VsZl9zdWJyYW5nZSB0eXBlOyBJJ20gZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhpcyBpcyB1c2VkIGFzIGFuCi0gICAgIGlkaW9tLCBhbmQgdGhhdCBhbGwgb2YgdGhlbSBhcmUgc3BlY2lhbCBjYXNlcy4gIFNvIC4gLiAuICAqLwotICBpZiAoc2VsZl9zdWJyYW5nZSkKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpbmRleF90eXBlID0gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHJhbmdlbnVtcyk7Ci0gIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb2VzIHRoaXMgYWN0dWFsbHkgZXZlciBoYXBwZW4/ICBJcyB0aGF0IHdoeSB3ZSBhcmUgd29ycnlpbmcKLSAgICAgICAgIGFib3V0IGRlYWxpbmcgd2l0aCBpdCByYXRoZXIgdGhhbiBqdXN0IGNhbGxpbmcgZXJyb3JfdHlwZT8gICovCi0gICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm1pc3NpbmcgaW5kZXggdHlwZSIpKTsKLSAgICAgIGluZGV4X3R5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgfQotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZGV4X3R5cGUsIG4yLCBuMyk7Ci19Ci0KLS8qIFN1bidzIEFDQyB1c2VzIGEgc29tZXdoYXQgc2FuZXIgbWV0aG9kIGZvciBzcGVjaWZ5aW5nIHRoZSBidWlsdGluCi0gICB0eXBlZGVmcyBpbiBldmVyeSBmaWxlIChmb3IgaW50LCBsb25nLCBldGMpOgotCi0JdHlwZSA9IGIgPHNpZ25lZD4gPHdpZHRoPjsgPG9mZnNldD47IDxuYml0cz4KLQlzaWduZWQgPSB1IG9yIHMuICBQb3NzaWJsZSBjIGluIGFkZGl0aW9uIHRvIHUgb3IgcyAoZm9yIGNoYXI/KS4KLQlvZmZzZXQgPSBvZmZzZXQgZnJvbSBoaWdoIG9yZGVyIGJpdCB0byBzdGFydCBiaXQgb2YgdHlwZS4KLQl3aWR0aCBpcyAjIGJ5dGVzIGluIG9iamVjdCBvZiB0aGlzIHR5cGUsIG5iaXRzIGlzICMgYml0cyBpbiB0eXBlLgotCi0gICBUaGUgd2lkdGgvb2Zmc2V0IHN0dWZmIGFwcGVhcnMgdG8gYmUgZm9yIHNtYWxsIG9iamVjdHMgc3RvcmVkIGluCi0gICBsYXJnZXIgb25lcyAoZS5nLiBgc2hvcnRzJyBpbiBgaW50JyByZWdpc3RlcnMpLiAgV2UgaWdub3JlIGl0IGZvciBub3csCi0gICBGSVhNRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIHBwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBib29sZWFuIHVuc2lnbmVkcDsKLSAgYmZkX3ZtYSBiaXRzOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc3dpdGNoICgqKnBwKQotICAgIHsKLSAgICBjYXNlICdzJzoKLSAgICAgIHVuc2lnbmVkcCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndSc6Ci0gICAgICB1bnNpZ25lZHAgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBGb3Igc29tZSBvZGQgcmVhc29uLCBhbGwgZm9ybXMgb2YgY2hhciBwdXQgYSBjIGhlcmUuICBUaGlzIGlzIHN0cmFuZ2UKLSAgICAgYmVjYXVzZSBubyBvdGhlciB0eXBlIGhhcyB0aGlzIGhvbm9yLiAgV2UgY2FuIHNhZmVseSBpZ25vcmUgdGhpcyBiZWNhdXNlCi0gICAgIHdlIGFjdHVhbGx5IGRldGVybWluZSAnY2hhcidhY3Rlcm5lc3MgYnkgdGhlIG51bWJlciBvZiBiaXRzIHNwZWNpZmllZCBpbgotICAgICB0aGUgZGVzY3JpcHRvci4gICovCi0gIGlmICgqKnBwID09ICdjJykKLSAgICArKypwcDsKLQotICAvKiBUaGUgZmlyc3QgbnVtYmVyIGFwcGVhcnMgdG8gYmUgdGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZAotICAgICBieSB0aGlzIHR5cGUsIGV4Y2VwdCB0aGF0IHVuc2lnbmVkIHNob3J0IGlzIDQgaW5zdGVhZCBvZiAyLgotICAgICBTaW5jZSB0aGlzIGluZm9ybWF0aW9uIGlzIHJlZHVuZGFudCB3aXRoIHRoZSB0aGlyZCBudW1iZXIsCi0gICAgIHdlIHdpbGwgaWdub3JlIGl0LiAgKi8KLSAgKHZvaWQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gICsrKnBwOwotCi0gIC8qIFRoZSBzZWNvbmQgbnVtYmVyIGlzIGFsd2F5cyAwLCBzbyBpZ25vcmUgaXQgdG9vLiAqLwotICAodm9pZCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgLyogVGhlIHRoaXJkIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoaXMgdHlwZS4gKi8KLSAgYml0cyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotCi0gIC8qIFRoZSB0eXBlICpzaG91bGQqIGVuZCB3aXRoIGEgc2VtaWNvbG9uLiAgSWYgaXQgYXJlIGVtYmVkZGVkCi0gICAgIGluIGEgbGFyZ2VyIHR5cGUgdGhlIHNlbWljb2xvbiBtYXkgYmUgdGhlIG9ubHkgd2F5IHRvIGtub3cgd2hlcmUKLSAgICAgdGhlIHR5cGUgZW5kcy4gIElmIHRoaXMgdHlwZSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFic3RyaW5nIHdlCi0gICAgIGNhbiBkZWFsIHdpdGggdGhlIG9taXR0ZWQgc2VtaWNvbG9uIChidXQgd2UgZG9uJ3QgaGF2ZSB0byBsaWtlCi0gICAgIGl0KS4gIERvbid0IGJvdGhlciB0byBjb21wbGFpbigpLCBTdW4ncyBjb21waWxlciBvbWl0cyB0aGUgc2VtaWNvbG9uCi0gICAgIGZvciAidm9pZCIuICAqLwotICBpZiAoKipwcCA9PSAnOycpCi0gICAgKysqcHA7Ci0KLSAgaWYgKGJpdHMgPT0gMCkKLSAgICByZXR1cm4gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCBiaXRzIC8gOCwgdW5zaWduZWRwKTsKLX0KLQotLyogUGFyc2UgYSBidWlsdGluIGZsb2F0aW5nIHR5cGUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4gY29tcGlsZXIuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9zdW5fZmxvYXRpbmdfdHlwZSAoZGhhbmRsZSwgcHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJmZF92bWEgZGV0YWlsczsKLSAgYmZkX3ZtYSBieXRlczsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIFRoZSBmaXJzdCBudW1iZXIgaGFzIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgdHlwZSwgZm9yIGV4YW1wbGUKLSAgICAgRk5fQ09NUExFWC4gICovCi0gIGRldGFpbHMgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSBzZWNvbmQgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgdGhpcyB0eXBlICovCi0gIGJ5dGVzID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoZGV0YWlscyA9PSBORl9DT01QTEVYCi0gICAgICB8fCBkZXRhaWxzID09IE5GX0NPTVBMRVgxNgotICAgICAgfHwgZGV0YWlscyA9PSBORl9DT01QTEVYMzIpCi0gICAgcmV0dXJuIGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCBieXRlcyk7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgYnl0ZXMpOyAgICAgIAotfQotCi0vKiBIYW5kbGUgYW4gZW51bSB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfZW51bV90eXBlIChkaGFuZGxlLCBwcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotICB1bnNpZ25lZCBpbnQgbjsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAvKiBUaGUgYWl4NCBjb21waWxlciBlbWl0cyBhbiBleHRyYSBmaWVsZCBiZWZvcmUgdGhlIGVudW0gbWVtYmVyczsKLSAgICAgbXkgZ3Vlc3MgaXMgaXQncyBhIHR5cGUgb2Ygc29tZSBzb3J0LiAgSnVzdCBpZ25vcmUgaXQuICAqLwotICBpZiAoKipwcCA9PSAnLScpCi0gICAgewotICAgICAgd2hpbGUgKCoqcHAgIT0gJzonKQotCSsrKnBwOwotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIHZhbHVlLW5hbWVzIGFuZCB0aGVpciB2YWx1ZXMuCi0gICAgIFRoZSBpbnB1dCBzeW50YXggaXMgTkFNRTpWQUxVRSxOQU1FOlZBTFVFLCBhbmQgc28gb24uCi0gICAgIEEgc2VtaWNvbG9uIG9yIGNvbW1hIGluc3RlYWQgb2YgYSBOQU1FIG1lYW5zIHRoZSBlbmQuICAqLwotICBhbGxvYyA9IDEwOwotICBuYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotICB2YWx1ZXMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKnZhbHVlcyk7Ci0gIG4gPSAwOwotICB3aGlsZSAoKipwcCAhPSAnXDAnICYmICoqcHAgIT0gJzsnICYmICoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgYmZkX3NpZ25lZF92bWEgdmFsOwotCi0gICAgICBwID0gKnBwOwotICAgICAgd2hpbGUgKCpwICE9ICc6JykKLQkrK3A7Ci0KLSAgICAgIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCi0gICAgICAqcHAgPSBwICsgMTsKLSAgICAgIHZhbCA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgaWYgKG4gKyAxID49IGFsbG9jKQotCXsKLQkgIGFsbG9jICs9IDEwOwotCSAgbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCSAgIHhyZWFsbG9jICgoUFRSKSBuYW1lcywgYWxsb2MgKiBzaXplb2YgKm5hbWVzKSk7Ci0JICB2YWx1ZXMgPSAoKGJmZF9zaWduZWRfdm1hICopCi0JCSAgICB4cmVhbGxvYyAoKFBUUikgdmFsdWVzLCBhbGxvYyAqIHNpemVvZiAqdmFsdWVzKSk7Ci0JfQotCi0gICAgICBuYW1lc1tuXSA9IG5hbWU7Ci0gICAgICB2YWx1ZXNbbl0gPSB2YWw7Ci0gICAgICArK247Ci0gICAgfQotCi0gIG5hbWVzW25dID0gTlVMTDsKLSAgdmFsdWVzW25dID0gMDsKLQotICBpZiAoKipwcCA9PSAnOycpCi0gICAgKysqcHA7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfZW51bV90eXBlIChkaGFuZGxlLCBuYW1lcywgdmFsdWVzKTsKLX0KLQotLyogUmVhZCB0aGUgZGVzY3JpcHRpb24gb2YgYSBzdHJ1Y3R1cmUgKG9yIHVuaW9uIHR5cGUpIGFuZCByZXR1cm4gYW4gb2JqZWN0Ci0gICBkZXNjcmliaW5nIHRoZSB0eXBlLgotCi0gICBQUCBwb2ludHMgdG8gYSBjaGFyYWN0ZXIgcG9pbnRlciB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCB1bmNvbnN1bWVkIHRva2VuCi0gICBpbiB0aGUgdGhlIHN0YWJzIHN0cmluZy4gIEZvciBleGFtcGxlLCBnaXZlbiBzdGFicyAiQTpUND1zNGE6MSwwLDMyOzsiLAotICAgKlBQIHdpbGwgcG9pbnQgdG8gIjRhOjEsMCwzMjs7Ii4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3N0cnVjdF90eXBlIChkaGFuZGxlLCBpbmZvLCB0YWduYW1lLCBwcCwgc3RydWN0cCwgdHlwZW51bXMpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnRhZ25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBiZmRfdm1hIHNpemU7Ci0gIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIGJvb2xlYW4gc3RhdGljczsKLSAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotICBib29sZWFuIG93bnZwdHI7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICAvKiBHZXQgdGhlIHNpemUuICAqLwotICBzaXplID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0KLSAgLyogR2V0IHRoZSBvdGhlciBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIHBhcnNlX3N0YWJfYmFzZWNsYXNzZXMgKGRoYW5kbGUsIGluZm8sIHBwLCAmYmFzZWNsYXNzZXMpCi0gICAgICB8fCAhIHBhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcyAoZGhhbmRsZSwgaW5mbywgcHAsICZmaWVsZHMsICZzdGF0aWNzKQotICAgICAgfHwgISBwYXJzZV9zdGFiX21lbWJlcnMgKGRoYW5kbGUsIGluZm8sIHRhZ25hbWUsIHBwLCB0eXBlbnVtcywgJm1ldGhvZHMpCi0gICAgICB8fCAhIHBhcnNlX3N0YWJfdGlsZGVfZmllbGQgKGRoYW5kbGUsIGluZm8sIHBwLCB0eXBlbnVtcywgJnZwdHJiYXNlLAotCQkJCSAgICZvd252cHRyKSkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICghIHN0YXRpY3MKLSAgICAgICYmIGJhc2VjbGFzc2VzID09IE5VTEwKLSAgICAgICYmIG1ldGhvZHMgPT0gTlVMTAotICAgICAgJiYgdnB0cmJhc2UgPT0gREVCVUdfVFlQRV9OVUxMCi0gICAgICAmJiAhIG93bnZwdHIpCi0gICAgcmV0dXJuIGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcyk7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2Vfb2JqZWN0X3R5cGUgKGRoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcywgYmFzZWNsYXNzZXMsCi0JCQkJIG1ldGhvZHMsIHZwdHJiYXNlLCBvd252cHRyKTsKLX0KLQotLyogVGhlIHN0YWJzIGZvciBDKysgZGVyaXZlZCBjbGFzc2VzIGNvbnRhaW4gYmFzZWNsYXNzIGluZm9ybWF0aW9uIHdoaWNoCi0gICBpcyBtYXJrZWQgYnkgYSAnIScgY2hhcmFjdGVyIGFmdGVyIHRoZSB0b3RhbCBzaXplLiAgVGhpcyBmdW5jdGlvbiBpcwotICAgY2FsbGVkIHdoZW4gd2UgZW5jb3VudGVyIHRoZSBiYXNlY2xhc3MgbWFya2VyLCBhbmQgc2x1cnBzIHVwIGFsbCB0aGUKLSAgIGJhc2VjbGFzcyBpbmZvcm1hdGlvbi4KLQotICAgSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSAnIScgbWFya2VyIGlzIHRoZSBudW1iZXIgb2YgYmFzZSBjbGFzc2VzIHRoYXQKLSAgIHRoZSBjbGFzcyBpcyBkZXJpdmVkIGZyb20sIGZvbGxvd2VkIGJ5IGluZm9ybWF0aW9uIGZvciBlYWNoIGJhc2UgY2xhc3MuCi0gICBGb3IgZWFjaCBiYXNlIGNsYXNzLCB0aGVyZSBhcmUgdHdvIHZpc2liaWxpdHkgc3BlY2lmaWVycywgYSBiaXQgb2Zmc2V0Ci0gICB0byB0aGUgYmFzZSBjbGFzcyBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGRlcml2ZWQgY2xhc3MsIGEgcmVmZXJlbmNlIHRvCi0gICB0aGUgdHlwZSBmb3IgdGhlIGJhc2UgY2xhc3MsIGFuZCBhIHRlcm1pbmF0aW5nIHNlbWljb2xvbi4KLQotICAgQSB0eXBpY2FsIGV4YW1wbGUsIHdpdGggdHdvIGJhc2UgY2xhc3Nlcywgd291bGQgYmUgIiEyLDAyMCwxOTswMjY0LDIxOyIuCi0gICAJCQkJCQkgICAgICAgXl4gXiBeIF4gIF4gXiAgXgotCUJhc2VjbGFzcyBpbmZvcm1hdGlvbiBtYXJrZXIgX19fX19fX19fX19fX19fX19ffHwgfCB8IHwgIHwgfCAgfAotCU51bWJlciBvZiBiYXNlY2xhc3NlcyBfX19fX19fX19fX19fX19fX19fX19fX19fX3wgfCB8IHwgIHwgfCAgfAotCVZpc2liaWxpdHkgc3BlY2lmaWVycyAoMikgX19fX19fX19fX19fX19fX19fX19fX19ffCB8IHwgIHwgfCAgfAotCU9mZnNldCBpbiBiaXRzIGZyb20gc3RhcnQgb2YgY2xhc3MgX19fX19fX19fX19fX19fX198IHwgIHwgfCAgfAotCVR5cGUgbnVtYmVyIGZvciBiYXNlIGNsYXNzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX3wgIHwgfCAgfAotCVZpc2liaWxpdHkgc3BlY2lmaWVycyAoMikgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wgfCAgfAotCU9mZnNldCBpbiBiaXRzIGZyb20gc3RhcnQgb2YgY2xhc3MgX19fX19fX19fX19fX19fX19fX19fX19ffCAgfAotCVR5cGUgbnVtYmVyIG9mIGJhc2UgY2xhc3MgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotCi0gIFJldHVybiB0cnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX2Jhc2VjbGFzc2VzIChkaGFuZGxlLCBpbmZvLCBwcCwgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19iYXNlY2xhc3MgKipyZXRwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgYywgaTsKLSAgZGVidWdfYmFzZWNsYXNzICpjbGFzc2VzOwotCi0gICpyZXRwID0gTlVMTDsKLQotICBvcmlnID0gKnBwOwotCi0gIGlmICgqKnBwICE9ICchJykKLSAgICB7Ci0gICAgICAvKiBObyBiYXNlIGNsYXNzZXMuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICArKypwcDsKLQotICBjID0gKHVuc2lnbmVkIGludCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0KLSAgaWYgKCoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGNsYXNzZXMgPSAoZGVidWdfYmFzZWNsYXNzICopIHhtYWxsb2MgKChjICsgMSkgKiBzaXplb2YgKCoqcmV0cCkpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgIGRlYnVnX3R5cGUgdHlwZTsKLQotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICcwJzoKLQkgIHZpcnR1YWwgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJzEnOgotCSAgdmlydHVhbCA9IHRydWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bmtub3duIHZpcnR1YWwgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiKSk7Ci0JICB2aXJ0dWFsID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICcwJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0JICBicmVhazsKLQljYXNlICcxJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkgIGJyZWFrOwotCWNhc2UgJzInOgotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHdhcm5fc3RhYiAob3JpZywgXygidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIikpOwotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIC8qIFRoZSByZW1haW5pbmcgdmFsdWUgaXMgdGhlIGJpdCBvZmZzZXQgb2YgdGhlIHBvcnRpb24gb2YgdGhlCi0JIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYmFzZWNsYXNzLiAgQWx3YXlzIHplcm8gaW4gdGhlCi0JIGFic2VuY2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UuICAqLwotICAgICAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrKnBwOwotCi0gICAgICB0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGNsYXNzZXNbaV0gPSBkZWJ1Z19tYWtlX2Jhc2VjbGFzcyAoZGhhbmRsZSwgdHlwZSwgYml0cG9zLCB2aXJ0dWFsLAotCQkJCQkgdmlzaWJpbGl0eSk7Ci0gICAgICBpZiAoY2xhc3Nlc1tpXSA9PSBERUJVR19CQVNFQ0xBU1NfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICgqKnBwICE9ICc7JykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgY2xhc3Nlc1tpXSA9IERFQlVHX0JBU0VDTEFTU19OVUxMOwotCi0gICpyZXRwID0gY2xhc3NlczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBzdHJ1Y3Qgb3IgY2xhc3MgZGF0YSBmaWVsZHMuICBUaGV5IGhhdmUgdGhlIGZvcm06Ci0KLSAgIAlOQU1FIDogW1ZJU0lCSUxJVFldIFRZUEVOVU0gLCBCSVRQT1MgLCBCSVRTSVpFIDsKLQotICAgQXQgdGhlIGVuZCwgd2Ugc2VlIGEgc2VtaWNvbG9uIGluc3RlYWQgb2YgYSBmaWVsZC4KLQotICAgSW4gQysrLCB0aGlzIG1heSB3aW5kIHVwIGJlaW5nIE5BTUU6P1RZUEVOVU06UEhZU05BTUU7IGZvcgotICAgYSBzdGF0aWMgZmllbGQuCi0KLSAgIFRoZSBvcHRpb25hbCBWSVNJQklMSVRZIGlzIG9uZSBvZjoKLQotICAgCScvMCcJKFZJU0lCSUxJVFlfUFJJVkFURSkKLQknLzEnCShWSVNJQklMSVRZX1BST1RFQ1RFRCkKLQknLzInCShWSVNJQklMSVRZX1BVQkxJQykKLQknLzknCShWSVNJQklMSVRZX0lHTk9SRSkKLQotICAgb3Igbm90aGluZywgZm9yIEMgc3R5bGUgZmllbGRzIHdpdGggcHVibGljIHZpc2liaWxpdHkuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3N0cnVjdF9maWVsZHMgKGRoYW5kbGUsIGluZm8sIHBwLCByZXRwLCBzdGF0aWNzcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19maWVsZCAqKnJldHA7Ci0gICAgIGJvb2xlYW4gKnN0YXRpY3NwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gICpyZXRwID0gTlVMTDsKLSAgKnN0YXRpY3NwID0gZmFsc2U7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBjID0gMDsKLSAgYWxsb2MgPSAxMDsKLSAgZmllbGRzID0gKGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpmaWVsZHMpOwotICB3aGlsZSAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgLyogQWRkIDEgdG8gYyB0byBsZWF2ZSByb29tIGZvciBOVUxMIHBvaW50ZXIgYXQgZW5kLiAgKi8KLSAgICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQl7Ci0JICBhbGxvYyArPSAxMDsKLQkgIGZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJICAgIHhyZWFsbG9jICgoUFRSKSBmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQl9Ci0KLSAgICAgIC8qIElmIGl0IHN0YXJ0cyB3aXRoIENQTFVTX01BUktFUiBpdCBpcyBhIHNwZWNpYWwgYWJicmV2aWF0aW9uLAotCSB1bmxlc3MgdGhlIENQTFVTX01BUktFUiBpcyBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLCBpbgotCSB3aGljaCBjYXNlIGl0IGlzIGp1c3QgdGhlIG5hbWUgb2YgYW4gYW5vbnltb3VzIHR5cGUsIHdoaWNoIHdlCi0JIHNob3VsZCBoYW5kbGUgbGlrZSBhbnkgb3RoZXIgdHlwZSBuYW1lLiAgV2UgYWNjZXB0IGVpdGhlciAnJCcKLQkgb3IgJy4nLCBiZWNhdXNlIGEgZmllbGQgbmFtZSBjYW4gbmV2ZXIgY29udGFpbiBvbmUgb2YgdGhlc2UKLQkgY2hhcmFjdGVycyBleGNlcHQgYXMgYSBDUExVU19NQVJLRVIuICAqLwotCi0gICAgICBpZiAoKCpwID09ICckJyB8fCAqcCA9PSAnLicpICYmIHBbMV0gIT0gJ18nKQotCXsKLQkgICsrKnBwOwotCSAgaWYgKCEgcGFyc2Vfc3RhYl9jcHBfYWJicmV2IChkaGFuZGxlLCBpbmZvLCBwcCwgZmllbGRzICsgYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICsrYzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhlICc6JyB0aGF0IHNlcGFyYXRlcyB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBmaWVsZAotCSB2YWx1ZXMuICBEYXRhIG1lbWJlcnMgYXJlIGRlbGltaXRlZCBieSBhIHNpbmdsZSAnOicsIHdoaWxlIG1lbWJlcgotCSBmdW5jdGlvbnMgYXJlIGRlbGltaXRlZCBieSBhIHBhaXIgb2YgJzoncy4gIFdoZW4gd2UgaGl0IHRoZSBtZW1iZXIKLQkgZnVuY3Rpb25zIChpZiBhbnkpLCB0ZXJtaW5hdGUgc2NhbiBsb29wIGFuZCByZXR1cm4uICovCi0KLSAgICAgIHAgPSBzdHJjaHIgKHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwWzFdID09ICc6JykKLQlicmVhazsKLQotICAgICAgaWYgKCEgcGFyc2Vfc3RhYl9vbmVfc3RydWN0X2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgcCwgZmllbGRzICsgYywKLQkJCQkJIHN0YXRpY3NwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICsrYzsKLSAgICB9Ci0KLSAgZmllbGRzW2NdID0gREVCVUdfRklFTERfTlVMTDsKLQotICAqcmV0cCA9IGZpZWxkczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3BlY2lhbCBHTlUgQysrIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9jcHBfYWJicmV2IChkaGFuZGxlLCBpbmZvLCBwcCwgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19maWVsZCAqcmV0cDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgaW50IGNwcF9hYmJyZXY7Ci0gIGRlYnVnX3R5cGUgY29udGV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBiaXRwb3M7Ci0KLSAgKnJldHAgPSBERUJVR19GSUVMRF9OVUxMOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgaWYgKCoqcHAgIT0gJ3YnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiICgqcHApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgY3BwX2FiYnJldiA9ICoqcHA7Ci0gICsrKnBwOwotCi0gIC8qIEF0IHRoaXMgcG9pbnQsICpwcCBwb2ludHMgdG8gc29tZXRoaW5nIGxpa2UgIjIyOjIzPSoyMi4uLiIsIHdoZXJlCi0gICAgIHRoZSB0eXBlIG51bWJlciBiZWZvcmUgdGhlICc6JyBpcyB0aGUgImNvbnRleHQiIGFuZCBldmVyeXRoaW5nCi0gICAgIGFmdGVyIGlzIGEgcmVndWxhciB0eXBlIGRlZmluaXRpb24uICBMb29rdXAgdGhlIHR5cGUsIGZpbmQgaXQncwotICAgICBuYW1lLCBhbmQgY29uc3RydWN0IHRoZSBmaWVsZCBuYW1lLiAgKi8KLQotICBjb250ZXh0ID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN3aXRjaCAoY3BwX2FiYnJldikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAvKiAkdmYgLS0gYSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIuICAqLwotICAgICAgbmFtZSA9ICJfdnB0ciQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICAvKiAkdmIgLS0gYSB2aXJ0dWFsIGJzb21ldGhpbmdvcm90aGVyICovCi0gICAgICB0eXBlbmFtZSA9IGRlYnVnX2dldF90eXBlX25hbWUgKGRoYW5kbGUsIGNvbnRleHQpOwotICAgICAgaWYgKHR5cGVuYW1lID09IE5VTEwpCi0JewotCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bm5hbWVkICR2YiB0eXBlIikpOwotCSAgdHlwZW5hbWUgPSAiRk9PIjsKLQl9Ci0gICAgICBuYW1lID0gY29uY2F0ICgiX3ZiJCIsIHR5cGVuYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oInVucmVjb2duaXplZCBDKysgYWJicmV2aWF0aW9uIikpOwotICAgICAgbmFtZSA9ICJJTlZBTElEX0NQTFVTUExVU19BQkJSRVYiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICc6JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICB0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICAqcmV0cCA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIGJpdHBvcywgMCwKLQkJCSAgICBERUJVR19WSVNJQklMSVRZX1BSSVZBVEUpOwotICBpZiAoKnJldHAgPT0gREVCVUdfRklFTERfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgc2luZ2xlIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfb25lX3N0cnVjdF9maWVsZCAoZGhhbmRsZSwgaW5mbywgcHAsIHAsIHJldHAsIHN0YXRpY3NwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgIGRlYnVnX2ZpZWxkICpyZXRwOwotICAgICBib29sZWFuICpzdGF0aWNzcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBiaXRwb3M7Ci0gIGJmZF92bWEgYml0c2l6ZTsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIEZJWE1FOiBnZGIgY2hlY2tzIEFSTV9ERU1BTkdMSU5HIGhlcmUuICAqLwotCi0gIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCi0gICpwcCA9IHAgKyAxOwotCi0gIGlmICgqKnBwICE9ICcvJykKLSAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnMCc6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCSAgYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JICBicmVhazsKLQljYXNlICcyJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB3YXJuX3N0YWIgKG9yaWcsIF8oInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGZpZWxkIikpOwotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCoqcHAgPT0gJzonKQotICAgIHsKLSAgICAgIGNoYXIgKnZhcm5hbWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBzdGF0aWMgY2xhc3MgbWVtYmVyLiAgKi8KLSAgICAgICsrKnBwOwotICAgICAgcCA9IHN0cmNociAoKnBwLCAnOycpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB2YXJuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQotICAgICAgKnBwID0gcCArIDE7Ci0KLSAgICAgICpyZXRwID0gZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChkaGFuZGxlLCBuYW1lLCB0eXBlLCB2YXJuYW1lLAotCQkJCQl2aXNpYmlsaXR5KTsKLSAgICAgICpzdGF0aWNzcCA9IHRydWU7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICcsJykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBiaXRzaXplID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAoYml0cG9zID09IDAgJiYgYml0c2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpbiB0d28gY2FzZXM6ICgxKSBhdCBsZWFzdCBmb3IgZ2NjIDIuNC41IG9yCi0JIHNvLCBpdCBpcyBhIGZpZWxkIHdoaWNoIGhhcyBiZWVuIG9wdGltaXplZCBvdXQuICBUaGUgY29ycmVjdAotCSBzdGFiIGZvciB0aGlzIGNhc2UgaXMgdG8gdXNlIFZJU0lCSUxJVFlfSUdOT1JFLCBidXQgdGhhdCBpcyBhCi0JIHJlY2VudCBpbnZlbnRpb24uICAoMikgSXQgaXMgYSAwLXNpemUgYXJyYXkuICBGb3IgZXhhbXBsZQotCSB1bmlvbiB7IGludCBudW07IGNoYXIgc3RyWzBdOyB9IGZvby4gIFByaW50aW5nICI8bm8gdmFsdWU+IgotCSBmb3Igc3RyIGluICJwIGZvbyIgaXMgT0ssIHNpbmNlIGZvby5zdHIgKGFuZCB0aHVzIGZvby5zdHJbM10pCi0JIHdpbGwgY29udGludWUgdG8gd29yaywgYW5kIGEgMC1zaXplIGFycmF5IGFzIGEgd2hvbGUgZG9lc24ndAotCSBoYXZlIGFueSBjb250ZW50cyB0byBwcmludC4KLQotCSBJIHN1c3BlY3QgdGhpcyBwcm9iYWJseSBjb3VsZCBhbHNvIGhhcHBlbiB3aXRoIGdjYyAtZ3N0YWJzCi0JIChub3QgLWdzdGFicyspIGZvciBzdGF0aWMgZmllbGRzLCBhbmQgcGVyaGFwcyBvdGhlciBDKysKLQkgZXh0ZW5zaW9ucy4gIEhvcGVmdWxseSBmZXcgcGVvcGxlIHVzZSAtZ3N0YWJzIHdpdGggZ2RiLCBzaW5jZQotCSBpdCBpcyBpbnRlbmRlZCBmb3IgZGJ4IGNvbXBhdGliaWxpdHkuICAqLwotICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOwotICAgIH0KLQotICAvKiBGSVhNRTogZ2RiIGRvZXMgc29tZSBzdHVmZiBoZXJlIHRvIG1hcmsgZmllbGRzIGFzIHVucGFja2VkLiAgKi8KLQotICAqcmV0cCA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgbWVtYmVyIGZ1bmN0aW9uIHN0YWJzIGluZm8gZm9yIEMrKyBjbGFzc2VzLiAgVGhlIGZvcm0gb2YgZWFjaCBtZW1iZXIKLSAgIGZ1bmN0aW9uIGRhdGEgaXM6Ci0KLQlOQU1FIDo6IFRZUEVOVU1bPXR5cGUgZGVmaW5pdGlvbl0gQVJHUyA6IFBIWVNOQU1FIDsKLQotICAgQW4gZXhhbXBsZSB3aXRoIHR3byBtZW1iZXIgZnVuY3Rpb25zIGlzOgotCi0JYWZ1bmMxOjoyMD0jIzE1OzppOzJBLjthZnVuYzI6OjIwOmk7MkEuOwotCi0gICBGb3IgdGhlIGNhc2Ugb2Ygb3ZlcmxvYWRlZCBvcGVyYXRvcnMsIHRoZSBmb3JtYXQgaXMgb3AkOjoqLmZ1bmNzLCB3aGVyZQotICAgJCBpcyB0aGUgQ1BMVVNfTUFSS0VSICh1c3VhbGx5ICckJyksIGAqJyBob2xkcyB0aGUgcGxhY2UgZm9yIGFuIG9wZXJhdG9yCi0gICBuYW1lIChzdWNoIGFzIGArPScpIGFuZCBgLicgbWFya3MgdGhlIGVuZCBvZiB0aGUgb3BlcmF0b3IgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX21lbWJlcnMgKGRoYW5kbGUsIGluZm8sIHRhZ25hbWUsIHBwLCB0eXBlbnVtcywgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdGFnbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotICAgICBkZWJ1Z19tZXRob2QgKipyZXRwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgKnJldHAgPSBOVUxMOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgYWxsb2MgPSAwOwotICBtZXRob2RzID0gTlVMTDsKLSAgYyA9IDA7Ci0KLSAgd2hpbGUgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnZhcmlhbnRzOwotICAgICAgdW5zaWduZWQgaW50IGN2YXJzOwotICAgICAgdW5zaWduZWQgaW50IGFsbG9jdmFyczsKLSAgICAgIGRlYnVnX3R5cGUgbG9va19haGVhZF90eXBlOwotCi0gICAgICBwID0gc3RyY2hyICgqcHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMIHx8IHBbMV0gIT0gJzonKQotCWJyZWFrOwotCi0gICAgICAvKiBGSVhNRTogU29tZSBzeXN0ZW1zIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAnJCcgaGVyZS4gICovCi0gICAgICBpZiAoKCpwcClbMF0gIT0gJ28nIHx8ICgqcHApWzFdICE9ICdwJyB8fCAoKnBwKVsyXSAhPSAnJCcpCi0JewotCSAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7Ci0JICAqcHAgPSBwICsgMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbXBsZXRlbHkgd2llcmQgY2FzZS4gIEluIG9yZGVyIHRvIHN0dWZmIGluIHRoZQotCSAgICAgbmFtZXMgdGhhdCBtaWdodCBjb250YWluIGNvbG9ucyAodGhlIHVzdWFsIG5hbWUgZGVsaW1pdGVyKSwKLQkgICAgIE1pa2UgVGllbWFubiBkZWZpbmVkIGEgZGlmZmVyZW50IG5hbWUgZm9ybWF0IHdoaWNoIGlzCi0JICAgICBzaWduYWxsZWQgaWYgdGhlIGlkZW50aWZpZXIgaXMgIm9wJCIuICBJbiB0aGF0IGNhc2UsIHRoZQotCSAgICAgZm9ybWF0IGlzICJvcCQ6OlhYWFguIiB3aGVyZSBYWFhYIGlzIHRoZSBuYW1lLiAgVGhpcyBpcwotCSAgICAgdXNlZCBmb3IgbmFtZXMgbGlrZSAiKyIgb3IgIj0iLiAgWVVVVVVVVVVLISAgRklYTUUhICAqLwotCSAgKnBwID0gcCArIDI7Ci0JICBmb3IgKHAgPSAqcHA7ICpwICE9ICcuJyAmJiAqcCAhPSAnXDAnOyBwKyspCi0JICAgIDsKLQkgIGlmICgqcCAhPSAnLicpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQkgICpwcCA9IHAgKyAxOwotCX0KLQotICAgICAgYWxsb2N2YXJzID0gMTA7Ci0gICAgICB2YXJpYW50cyA9ICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikKLQkJICB4bWFsbG9jIChhbGxvY3ZhcnMgKiBzaXplb2YgKnZhcmlhbnRzKSk7Ci0gICAgICBjdmFycyA9IDA7Ci0KLSAgICAgIGxvb2tfYWhlYWRfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgZG8KLQl7Ci0JICBkZWJ1Z190eXBlIHR5cGU7Ci0JICBib29sZWFuIHN0dWI7Ci0JICBjaGFyICphcmd0eXBlczsKLQkgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotCSAgYm9vbGVhbiBjb25zdHAsIHZvbGF0aWxlcCwgc3RhdGljcDsKLQkgIGJmZF92bWEgdm9mZnNldDsKLQkgIGRlYnVnX3R5cGUgY29udGV4dDsKLQkgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotCSAgYm9vbGVhbiB2YXJhcmdzOwotCi0JICBpZiAobG9va19haGVhZF90eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgewotCSAgICAgIC8qIGcrKyB2ZXJzaW9uIDEga2x1ZGdlICovCi0JICAgICAgdHlwZSA9IGxvb2tfYWhlYWRfdHlwZTsKLQkgICAgICBsb29rX2FoZWFkX3R5cGUgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoKipwcCAhPSAnOicpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgKysqcHA7Ci0JICBwID0gc3RyY2hyICgqcHAsICc7Jyk7Ci0JICBpZiAocCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzdHViID0gZmFsc2U7Ci0JICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgdHlwZSkgPT0gREVCVUdfS0lORF9NRVRIT0QKLQkgICAgICAmJiBkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIChkaGFuZGxlLCB0eXBlLCAmdmFyYXJncykgPT0gTlVMTCkKLQkgICAgc3R1YiA9IHRydWU7Ci0KLQkgIGFyZ3R5cGVzID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQkgICpwcCA9IHAgKyAxOwotCi0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnMCc6Ci0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMSc6Ci0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKysqcHA7Ci0KLQkgIGNvbnN0cCA9IGZhbHNlOwotCSAgdm9sYXRpbGVwID0gZmFsc2U7Ci0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgLyogTm9ybWFsIGZ1bmN0aW9uLiAgKi8KLQkgICAgICArKypwcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgLyogY29uc3QgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBjb25zdHAgPSB0cnVlOwotCSAgICAgICsrKnBwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdDJzoKLQkgICAgICAvKiB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgICAgIHZvbGF0aWxlcCA9IHRydWU7Ci0JICAgICAgKysqcHA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0QnOgotCSAgICAgIC8qIGNvbnN0IHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbi4gICovCi0JICAgICAgY29uc3RwID0gdHJ1ZTsKLQkgICAgICB2b2xhdGlsZXAgPSB0cnVlOwotCSAgICAgICsrKnBwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICcqJzoKLQkgICAgY2FzZSAnPyc6Ci0JICAgIGNhc2UgJy4nOgotCSAgICAgIC8qIEZpbGUgY29tcGlsZWQgd2l0aCBnKysgdmVyc2lvbiAxOyBubyBpbmZvcm1hdGlvbi4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJjb25zdC92b2xhdGlsZSBpbmRpY2F0b3IgbWlzc2luZyIpKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzdGF0aWNwID0gZmFsc2U7Ci0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnKic6Ci0JICAgICAgLyogdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24sIGZvbGxvd2VkIGJ5IGluZGV4LiAgVGhlIHNpZ24KLQkJIGJpdCBpcyBzdXBwb3NlZGx5IHNldCB0byBkaXN0aW5ndWlzaAotCQkgcG9pbnRlcnMtdG8tbWV0aG9kcyBmcm9tIHZpcnR1YWwgZnVuY3Rpb24gaW5kaWNpZXMuICAqLwotCSAgICAgICsrKnBwOwotCSAgICAgIHZvZmZzZXQgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLQkgICAgICBpZiAoKipwcCAhPSAnOycpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgKysqcHA7Ci0JICAgICAgdm9mZnNldCAmPSAweDdmZmZmZmZmOwotCi0JICAgICAgaWYgKCoqcHAgPT0gJzsnIHx8ICpwcCA9PSAnXDAnKQotCQl7Ci0JCSAgLyogTXVzdCBiZSBnKysgdmVyc2lvbiAxLiAgKi8KLQkJICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogRmlndXJlIG91dCBmcm9tIHdoZW5jZSB0aGlzIHZpcnR1YWwgZnVuY3Rpb24KLQkJICAgICBjYW1lLiAgSXQgbWF5IGJlbG9uZyB0byB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIG9mCi0JCSAgICAgb25lIG9mIGl0cyBiYXNlY2xhc3Nlcy4gICovCi0JCSAgICBsb29rX2FoZWFkX3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkgICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSAgICAgICBwcCwKLQkJCQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JCSAgICBpZiAoKipwcCA9PSAnOicpCi0JCSAgICAgIHsKLQkJCS8qIGcrKyB2ZXJzaW9uIDEgb3ZlcmxvYWRlZCBtZXRob2RzLiAgKi8KLQkJCWNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJY29udGV4dCA9IGxvb2tfYWhlYWRfdHlwZTsKLQkJCWxvb2tfYWhlYWRfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQkJCWlmICgqKnBwICE9ICc7JykKLQkJCSAgewotCQkJICAgIGJhZF9zdGFiIChvcmlnKTsKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIH0KLQkJCSsrKnBwOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJz8nOgotCSAgICAgIC8qIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgICAgICsrKnBwOwotCSAgICAgIHN0YXRpY3AgPSB0cnVlOwotCSAgICAgIHZvZmZzZXQgPSAwOwotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgaWYgKHN0cm5jbXAgKGFyZ3R5cGVzLCBuYW1lLCBzdHJsZW4gKG5hbWUpKSAhPSAwKQotCQlzdHViID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHdhcm5fc3RhYiAob3JpZywgIm1lbWJlciBmdW5jdGlvbiB0eXBlIG1pc3NpbmciKTsKLQkgICAgICB2b2Zmc2V0ID0gMDsKLQkgICAgICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJy4nOgotCSAgICAgICsrKnBwOwotCSAgICAgIHZvZmZzZXQgPSAwOwotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHR5cGUgaXMgbm90IGEgc3R1YiwgdGhlbiB0aGUgYXJndHlwZXMgc3RyaW5nIGlzCi0gICAgICAgICAgICAgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIHRoZQotICAgICAgICAgICAgIGFyZ3R5cGVzIHN0cmluZyBpcyB0aGUgbWFuZ2xlZCBmb3JtIG9mIHRoZSBhcmd1bWVudAotICAgICAgICAgICAgIHR5cGVzLCBhbmQgdGhlIGZ1bGwgdHlwZSBhbmQgdGhlIHBoeXNpY2FsIG5hbWUgbXVzdCBiZQotICAgICAgICAgICAgIGV4dHJhY3RlZCBmcm9tIHRoZW0uICAqLwotCSAgaWYgKCEgc3R1YikKLQkgICAgcGh5c25hbWUgPSBhcmd0eXBlczsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRlYnVnX3R5cGUgY2xhc3NfdHlwZSwgcmV0dXJuX3R5cGU7Ci0KLQkgICAgICBjbGFzc190eXBlID0gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKTsKLQkgICAgICBpZiAoY2xhc3NfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZXR1cm5fdHlwZSA9IGRlYnVnX2dldF9yZXR1cm5fdHlwZSAoZGhhbmRsZSwgdHlwZSk7Ci0JICAgICAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICB0eXBlID0gcGFyc2Vfc3RhYl9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgY2xhc3NfdHlwZSwgbmFtZSwKLQkJCQkJICB0YWduYW1lLCByZXR1cm5fdHlwZSwgYXJndHlwZXMsCi0JCQkJCSAgY29uc3RwLCB2b2xhdGlsZXAsICZwaHlzbmFtZSk7Ci0JICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGN2YXJzICsgMSA+PSBhbGxvY3ZhcnMpCi0JICAgIHsKLQkgICAgICBhbGxvY3ZhcnMgKz0gMTA7Ci0JICAgICAgdmFyaWFudHMgPSAoKGRlYnVnX21ldGhvZF92YXJpYW50ICopCi0JCQkgIHhyZWFsbG9jICgoUFRSKSB2YXJpYW50cywKLQkJCQkgICAgYWxsb2N2YXJzICogc2l6ZW9mICp2YXJpYW50cykpOwotCSAgICB9Ci0KLQkgIGlmICghIHN0YXRpY3ApCi0JICAgIHZhcmlhbnRzW2N2YXJzXSA9IGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQgKGRoYW5kbGUsIHBoeXNuYW1lLAotCQkJCQkJCSB0eXBlLCB2aXNpYmlsaXR5LAotCQkJCQkJCSBjb25zdHAsIHZvbGF0aWxlcCwKLQkJCQkJCQkgdm9mZnNldCwgY29udGV4dCk7Ci0JICBlbHNlCi0JICAgIHZhcmlhbnRzW2N2YXJzXSA9IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50IChkaGFuZGxlLAotCQkJCQkJCQlwaHlzbmFtZSwKLQkJCQkJCQkJdHlwZSwKLQkJCQkJCQkJdmlzaWJpbGl0eSwKLQkJCQkJCQkJY29uc3RwLAotCQkJCQkJCQl2b2xhdGlsZXApOwotCSAgaWYgKHZhcmlhbnRzW2N2YXJzXSA9PSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICsrY3ZhcnM7Ci0JfQotICAgICAgd2hpbGUgKCoqcHAgIT0gJzsnICYmICoqcHAgIT0gJ1wwJyk7Ci0KLSAgICAgIHZhcmlhbnRzW2N2YXJzXSA9IERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEw7Ci0KLSAgICAgIGlmICgqKnBwICE9ICdcMCcpCi0JKysqcHA7Ci0KLSAgICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQl7Ci0JICBhbGxvYyArPSAxMDsKLQkgIG1ldGhvZHMgPSAoKGRlYnVnX21ldGhvZCAqKQotCQkgICAgIHhyZWFsbG9jICgoUFRSKSBtZXRob2RzLCBhbGxvYyAqIHNpemVvZiAqbWV0aG9kcykpOwotCX0KLQotICAgICAgbWV0aG9kc1tjXSA9IGRlYnVnX21ha2VfbWV0aG9kIChkaGFuZGxlLCBuYW1lLCB2YXJpYW50cyk7Ci0KLSAgICAgICsrYzsKLSAgICB9Ci0KLSAgaWYgKG1ldGhvZHMgIT0gTlVMTCkKLSAgICBtZXRob2RzW2NdID0gREVCVUdfTUVUSE9EX05VTEw7Ci0KLSAgKnJldHAgPSBtZXRob2RzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHN0cmluZyByZXByZXNlbnRpbmcgYXJndW1lbnQgdHlwZXMgZm9yIGEgbWV0aG9kLiAgU3RhYnMKLSAgIHRyaWVzIHRvIHNhdmUgc3BhY2UgYnkgcGFja2luZyBhcmd1bWVudCB0eXBlcyBpbnRvIGEgbWFuZ2xlZAotICAgc3RyaW5nLiAgVGhpcyBzdHJpbmcgc2hvdWxkIGdpdmUgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGV4dHJhY3QKLSAgIGJvdGggYXJndW1lbnQgdHlwZXMgYW5kIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgZ2l2ZW4KLSAgIHRoZSB0YWcgbmFtZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBjbGFzc190eXBlLCBmaWVsZG5hbWUsIHRhZ25hbWUsCi0JCSAgICAgcmV0dXJuX3R5cGUsIGFyZ3R5cGVzLCBjb25zdHAsIHZvbGF0aWxlcCwgcHBoeXNuYW1lKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBkZWJ1Z190eXBlIGNsYXNzX3R5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKmZpZWxkbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFnbmFtZTsKLSAgICAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgICAgY29uc3QgY2hhciAqYXJndHlwZXM7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLSAgICAgY29uc3QgY2hhciAqKnBwaHlzbmFtZTsKLXsKLSAgYm9vbGVhbiBpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yOwotICBib29sZWFuIGlzX2NvbnN0cnVjdG9yOwotICBib29sZWFuIGlzX2Rlc3RydWN0b3I7Ci0gIGRlYnVnX3R5cGUgKmFyZ3M7Ci0gIGJvb2xlYW4gdmFyYXJnczsKLQotICAvKiBDb25zdHJ1Y3RvcnMgYXJlIHNvbWV0aW1lcyBoYW5kbGVkIHNwZWNpYWxseS4gICovCi0gIGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IgPSAoKGFyZ3R5cGVzWzBdID09ICdfJwotCQkJCSAgICYmIGFyZ3R5cGVzWzFdID09ICdfJwotCQkJCSAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYXJndHlwZXNbMl0pCi0JCQkJICAgICAgIHx8IGFyZ3R5cGVzWzJdID09ICdRJwotCQkJCSAgICAgICB8fCBhcmd0eXBlc1syXSA9PSAndCcpKQotCQkJCSAgfHwgc3RybmNtcCAoYXJndHlwZXMsICJfX2N0IiwgNCkgPT0gMCk7Ci0KLSAgaXNfY29uc3RydWN0b3IgPSAoaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvcgotCQkgICAgfHwgKHRhZ25hbWUgIT0gTlVMTAotCQkJJiYgc3RyY21wIChmaWVsZG5hbWUsIHRhZ25hbWUpID09IDApKTsKLSAgaXNfZGVzdHJ1Y3RvciA9ICgoYXJndHlwZXNbMF0gPT0gJ18nCi0JCSAgICAmJiAoYXJndHlwZXNbMV0gPT0gJyQnIHx8IGFyZ3R5cGVzWzFdID09ICcuJykKLQkJICAgICYmIGFyZ3R5cGVzWzJdID09ICdfJykKLQkJICAgfHwgc3RybmNtcCAoYXJndHlwZXMsICJfX2R0IiwgNCkgPT0gMCk7Ci0KLSAgaWYgKGlzX2Rlc3RydWN0b3IgfHwgaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvcikKLSAgICAqcHBoeXNuYW1lID0gYXJndHlwZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgY29uc3QgY2hhciAqY29uc3RfcHJlZml4OwotICAgICAgY29uc3QgY2hhciAqdm9sYXRpbGVfcHJlZml4OwotICAgICAgY2hhciBidWZbMjBdOwotICAgICAgdW5zaWduZWQgaW50IG1hbmdsZWRfbmFtZV9sZW47Ci0gICAgICBjaGFyICpwaHlzbmFtZTsKLQotICAgICAgbGVuID0gdGFnbmFtZSA9PSBOVUxMID8gMCA6IHN0cmxlbiAodGFnbmFtZSk7Ci0gICAgICBjb25zdF9wcmVmaXggPSBjb25zdHAgPyAiQyIgOiAiIjsKLSAgICAgIHZvbGF0aWxlX3ByZWZpeCA9IHZvbGF0aWxlcCA/ICJWIiA6ICIiOwotCi0gICAgICBpZiAobGVuID09IDApCi0Jc3ByaW50ZiAoYnVmLCAiX18lcyVzIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgpOwotICAgICAgZWxzZSBpZiAodGFnbmFtZSAhPSBOVUxMICYmIHN0cmNociAodGFnbmFtZSwgJzwnKSAhPSBOVUxMKQotCXsKLQkgIC8qIFRlbXBsYXRlIG1ldGhvZHMgYXJlIGZ1bGx5IG1hbmdsZWQuICAqLwotCSAgc3ByaW50ZiAoYnVmLCAiX18lcyVzIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgpOwotCSAgdGFnbmFtZSA9IE5VTEw7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWYsICJfXyVzJXMlZCIsIGNvbnN0X3ByZWZpeCwgdm9sYXRpbGVfcHJlZml4LCBsZW4pOwotCi0gICAgICBtYW5nbGVkX25hbWVfbGVuID0gKChpc19jb25zdHJ1Y3RvciA/IDAgOiBzdHJsZW4gKGZpZWxkbmFtZSkpCi0JCQkgICsgc3RybGVuIChidWYpCi0JCQkgICsgbGVuCi0JCQkgICsgc3RybGVuIChhcmd0eXBlcykKLQkJCSAgKyAxKTsKLQotICAgICAgaWYgKGZpZWxkbmFtZVswXSA9PSAnbycKLQkgICYmIGZpZWxkbmFtZVsxXSA9PSAncCcKLQkgICYmIChmaWVsZG5hbWVbMl0gPT0gJyQnIHx8IGZpZWxkbmFtZVsyXSA9PSAnLicpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLQotCSAgb3BuYW1lID0gY3BsdXNfbWFuZ2xlX29wbmFtZSAoZmllbGRuYW1lICsgMywgMCk7Ci0JICBpZiAob3BuYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIk5vIG1hbmdsaW5nIGZvciBcIiVzXCJcbiIpLCBmaWVsZG5hbWUpOwotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgIG1hbmdsZWRfbmFtZV9sZW4gKz0gc3RybGVuIChvcG5hbWUpOwotCSAgcGh5c25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChtYW5nbGVkX25hbWVfbGVuKTsKLQkgIHN0cm5jcHkgKHBoeXNuYW1lLCBmaWVsZG5hbWUsIDMpOwotCSAgc3RyY3B5IChwaHlzbmFtZSArIDMsIG9wbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHBoeXNuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobWFuZ2xlZF9uYW1lX2xlbik7Ci0JICBpZiAoaXNfY29uc3RydWN0b3IpCi0JICAgIHBoeXNuYW1lWzBdID0gJ1wwJzsKLQkgIGVsc2UKLQkgICAgc3RyY3B5IChwaHlzbmFtZSwgZmllbGRuYW1lKTsKLQl9Ci0KLSAgICAgIHN0cmNhdCAocGh5c25hbWUsIGJ1Zik7Ci0gICAgICBpZiAodGFnbmFtZSAhPSBOVUxMKQotCXN0cmNhdCAocGh5c25hbWUsIHRhZ25hbWUpOwotICAgICAgc3RyY2F0IChwaHlzbmFtZSwgYXJndHlwZXMpOwotCi0gICAgICAqcHBoeXNuYW1lID0gcGh5c25hbWU7Ci0gICAgfQotCi0gIGlmICgqYXJndHlwZXMgPT0gJ1wwJyB8fCBpc19kZXN0cnVjdG9yKQotICAgIHsKLSAgICAgIGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmFyZ3MpOwotICAgICAgKmFyZ3MgPSBOVUxMOwotICAgICAgcmV0dXJuIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBjbGFzc190eXBlLCBhcmdzLAotCQkJCSAgICAgZmFsc2UpOwotICAgIH0KLQotICBhcmdzID0gc3RhYl9kZW1hbmdsZV9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgKnBwaHlzbmFtZSwgJnZhcmFyZ3MpOwotICBpZiAoYXJncyA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBjbGFzc190eXBlLCBhcmdzLAotCQkJCSB2YXJhcmdzKTsKLX0KLQotLyogVGhlIHRhaWwgZW5kIG9mIHN0YWJzIGZvciBDKysgY2xhc3NlcyB0aGF0IGNvbnRhaW4gYSB2aXJ0dWFsIGZ1bmN0aW9uCi0gICBwb2ludGVyIGNvbnRhaW5zIGEgdGlsZGUsIGEgJSwgYW5kIGEgdHlwZSBudW1iZXIuCi0gICBUaGUgdHlwZSBudW1iZXIgcmVmZXJzIHRvIHRoZSBiYXNlIGNsYXNzIChwb3NzaWJseSB0aGlzIGNsYXNzIGl0c2VsZikgd2hpY2gKLSAgIGNvbnRhaW5zIHRoZSB2dGFibGUgcG9pbnRlciBmb3IgdGhlIGN1cnJlbnQgY2xhc3MuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBwYXJzZWQgYWxsIHRoZSBtZXRob2QgZGVjbGFyYXRpb25zLAotICAgc28gd2UgY2FuIGxvb2sgZm9yIHRoZSB2cHRyIGJhc2UgY2xhc3MgaW5mby4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3RpbGRlX2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgdHlwZW51bXMsIHJldHZwdHJiYXNlLCByZXRvd252cHRyKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci0gICAgIGRlYnVnX3R5cGUgKnJldHZwdHJiYXNlOwotICAgICBib29sZWFuICpyZXRvd252cHRyOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpob2xkOwotICBpbnQgdnR5cGVudW1zWzJdOwotCi0gICpyZXR2cHRyYmFzZSA9IERFQlVHX1RZUEVfTlVMTDsKLSAgKnJldG93bnZwdHIgPSBmYWxzZTsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIElmIHdlIGFyZSBwb3NpdGlvbmVkIGF0IGEgJzsnLCB0aGVuIHNraXAgaXQuICovCi0gIGlmICgqKnBwID09ICc7JykKLSAgICArKypwcDsKLQotICBpZiAoKipwcCAhPSAnficpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgKysqcHA7Ci0KLSAgaWYgKCoqcHAgPT0gJz0nIHx8ICoqcHAgPT0gJysnIHx8ICoqcHAgPT0gJy0nKQotICAgIHsKLSAgICAgIC8qIE9ic29sZXRlIGZsYWdzIHRoYXQgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YKLQkgY29uc3RydWN0b3JzIGFuZC9vciBkZXN0cnVjdG9ycy4gKi8KLSAgICAgICsrKnBwOwotICAgIH0KLQotICBpZiAoKipwcCAhPSAnJScpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgKysqcHA7Ci0KLSAgaG9sZCA9ICpwcDsKLQotICAvKiBUaGUgbmV4dCBudW1iZXIgaXMgdGhlIHR5cGUgbnVtYmVyIG9mIHRoZSBiYXNlIGNsYXNzIChwb3NzaWJseQotICAgICBvdXIgb3duIGNsYXNzKSB3aGljaCBzdXBwbGllcyB0aGUgdnRhYmxlIGZvciB0aGlzIGNsYXNzLiAgKi8KLSAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHZ0eXBlbnVtcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2dHlwZW51bXNbMF0gPT0gdHlwZW51bXNbMF0KLSAgICAgICYmIHZ0eXBlbnVtc1sxXSA9PSB0eXBlbnVtc1sxXSkKLSAgICAqcmV0b3dudnB0ciA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkZWJ1Z190eXBlIHZ0eXBlOwotICAgICAgY29uc3QgY2hhciAqcDsKLQotICAgICAgKnBwID0gaG9sZDsKLQotICAgICAgdnR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGZvciAocCA9ICpwcDsgKnAgIT0gJzsnICYmICpwICE9ICdcMCc7IHArKykKLQk7Ci0gICAgICBpZiAoKnAgIT0gJzsnKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgICpyZXR2cHRyYmFzZSA9IHZ0eXBlOwotCi0gICAgICAqcHAgPSBwICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7ICAgIAotfQotCi0vKiBSZWFkIGEgZGVmaW5pdGlvbiBvZiBhbiBhcnJheSB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfYXJyYXlfdHlwZSAoZGhhbmRsZSwgaW5mbywgcHAsIHN0cmluZ3ApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgYm9vbGVhbiBzdHJpbmdwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICBpbnQgdHlwZW51bXNbMl07Ci0gIGRlYnVnX3R5cGUgaW5kZXhfdHlwZTsKLSAgYm9vbGVhbiBhZGp1c3RhYmxlOwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlciwgdXBwZXI7Ci0gIGRlYnVnX3R5cGUgZWxlbWVudF90eXBlOwotCi0gIC8qIEZvcm1hdCBvZiBhbiBhcnJheSB0eXBlOgotICAgICAiYXI8aW5kZXggdHlwZT47bG93ZXI7dXBwZXI7PGFycmF5X2NvbnRlbnRzX3R5cGU+Ii4KLSAgICAgT1M5MDAwOiAiYXJsb3dlcix1cHBlcjs8YXJyYXlfY29udGVudHNfdHlwZT4iLgotCi0gICAgIEZvcnRyYW4gYWRqdXN0YWJsZSBhcnJheXMgdXNlIEFkaWdpdHMgb3IgVGRpZ2l0cyBmb3IgbG93ZXIgb3IgdXBwZXI7Ci0gICAgIGZvciB0aGVzZSwgcHJvZHVjZSBhIHR5cGUgbGlrZSBmbG9hdFtdW10uICAqLwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAvKiBJZiB0aGUgaW5kZXggdHlwZSBpcyB0eXBlIDAsIHdlIHRha2UgaXQgYXMgaW50LiAgKi8KLSAgcCA9ICpwcDsKLSAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAoJnAsIHR5cGVudW1zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0eXBlbnVtc1swXSA9PSAwICYmIHR5cGVudW1zWzFdID09IDAgJiYgKipwcCAhPSAnPScpCi0gICAgewotICAgICAgaW5kZXhfdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAoZGhhbmRsZSwgImludCIpOwotICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXsKLQkgIGluZGV4X3R5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0JICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAqcHAgPSBwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYWRqdXN0YWJsZSA9IGZhbHNlOwotCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSAmJiAqKnBwICE9ICctJykKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIGFkanVzdGFibGUgPSB0cnVlOwotICAgIH0KLQotICBsb3dlciA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkgJiYgKipwcCAhPSAnLScpCi0gICAgewotICAgICAgKysqcHA7Ci0gICAgICBhZGp1c3RhYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgdXBwZXIgPSAoYmZkX3NpZ25lZF92bWEpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgZWxlbWVudF90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgaWYgKGVsZW1lbnRfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhZGp1c3RhYmxlKQotICAgIHsKLSAgICAgIGxvd2VyID0gMDsKLSAgICAgIHVwcGVyID0gLTE7Ci0gICAgfQotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIGVsZW1lbnRfdHlwZSwgaW5kZXhfdHlwZSwgbG93ZXIsCi0JCQkJdXBwZXIsIHN0cmluZ3ApOwotfQotCi0vKiBUaGlzIHN0cnVjdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcyB3ZSBoYXZlIHNlZW4gdXNpbmcKLSAgIE5fQklOQ0wuICAqLwotCi1zdHJ1Y3QgYmluY2xfZmlsZQotewotICAvKiBUaGUgbmV4dCBOX0JJTkNMIGZpbGUuICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbmV4dDsKLSAgLyogVGhlIG5leHQgTl9CSU5DTCBvbiB0aGUgc3RhY2suICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbmV4dF9zdGFjazsKLSAgLyogVGhlIGZpbGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBoYXNoIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSBoYXNoOwotICAvKiBUaGUgZmlsZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBmaWxlOwotICAvKiBUaGUgbGlzdCBvZiB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICpmaWxlX3R5cGVzOwotfTsKLQotLyogU3RhcnQgYSBuZXcgTl9CSU5DTCBmaWxlLCBwdXNoaW5nIGl0IG9udG8gdGhlIHN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXB1c2hfYmluY2wgKGluZm8sIG5hbWUsIGhhc2gpCi0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBoYXNoOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbjsKLQotICBuID0gKHN0cnVjdCBiaW5jbF9maWxlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBpbmZvLT5iaW5jbF9saXN0OwotICBuLT5uZXh0X3N0YWNrID0gaW5mby0+YmluY2xfc3RhY2s7Ci0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT5oYXNoID0gaGFzaDsKLSAgbi0+ZmlsZSA9IGluZm8tPmZpbGVzOwotICBuLT5maWxlX3R5cGVzID0gTlVMTDsKLSAgaW5mby0+YmluY2xfbGlzdCA9IG47Ci0gIGluZm8tPmJpbmNsX3N0YWNrID0gbjsKLQotICArK2luZm8tPmZpbGVzOwotICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJICAgICAgeHJlYWxsb2MgKChQVFIpIGluZm8tPmZpbGVfdHlwZXMsCi0JCQkJKGluZm8tPmZpbGVzCi0JCQkJICogc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSkpOwotICBpbmZvLT5maWxlX3R5cGVzW24tPmZpbGVdID0gTlVMTDsKLX0KLQotLyogRmluaXNoIGFuIE5fQklOQ0wgZmlsZSwgYXQgYW4gTl9FSU5DTCwgcG9wcGluZyB0aGUgbmFtZSBvZmYgdGhlCi0gICBzdGFjay4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBvcF9iaW5jbCAoaW5mbykKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbzsKLQotICBvID0gaW5mby0+YmluY2xfc3RhY2s7Ci0gIGlmIChvID09IE5VTEwpCi0gICAgcmV0dXJuIGluZm8tPm1haW5fZmlsZW5hbWU7Ci0gIGluZm8tPmJpbmNsX3N0YWNrID0gby0+bmV4dF9zdGFjazsKLQotICBvLT5maWxlX3R5cGVzID0gaW5mby0+ZmlsZV90eXBlc1tvLT5maWxlXTsKLQotICBpZiAoaW5mby0+YmluY2xfc3RhY2sgPT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+bWFpbl9maWxlbmFtZTsKLSAgcmV0dXJuIGluZm8tPmJpbmNsX3N0YWNrLT5uYW1lOwotfQotCi0vKiBIYW5kbGUgYW4gTl9FWENMOiBnZXQgdGhlIHR5cGVzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTl9CSU5DTC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1maW5kX2V4Y2wgKGluZm8sIG5hbWUsIGhhc2gpCi0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBoYXNoOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbDsKLQotICArK2luZm8tPmZpbGVzOwotICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJICAgICAgeHJlYWxsb2MgKChQVFIpIGluZm8tPmZpbGVfdHlwZXMsCi0JCQkJKGluZm8tPmZpbGVzCi0JCQkJICogc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSkpOwotCi0gIGZvciAobCA9IGluZm8tPmJpbmNsX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgaWYgKGwtPmhhc2ggPT0gaGFzaCAmJiBzdHJjbXAgKGwtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBicmVhazsKLSAgaWYgKGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB3YXJuX3N0YWIgKG5hbWUsIF8oIlVuZGVmaW5lZCBOX0VYQ0wiKSk7Ci0gICAgICBpbmZvLT5maWxlX3R5cGVzW2luZm8tPmZpbGVzIC0gMV0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZm8tPmZpbGVfdHlwZXNbaW5mby0+ZmlsZXMgLSAxXSA9IGwtPmZpbGVfdHlwZXM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIHZhcmlhYmxlIGRlZmluaXRpb24uICBnY2MgZW1pdHMgdmFyaWFibGUgZGVmaW5pdGlvbnMgZm9yIGEKLSAgIGJsb2NrIGJlZm9yZSB0aGUgTl9MQlJBQywgc28gd2UgbXVzdCBob2xkIG9udG8gdGhlbSB1bnRpbCB3ZSBzZWUKLSAgIGl0LiAgVGhlIFN1blBSTyBjb21waWxlciBlbWl0cyB2YXJpYWJsZSBkZWZpbml0aW9ucyBhZnRlciB0aGUKLSAgIE5fTEJSQUMsIHNvIHdlIGNhbiBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSBpbW1lZGlhdGVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgdHlwZSwga2luZCwgdmFsKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICp2OwotCi0gIGlmICgoa2luZCA9PSBERUJVR19HTE9CQUwgfHwga2luZCA9PSBERUJVR19TVEFUSUMpCi0gICAgICB8fCAhIGluZm8tPndpdGhpbl9mdW5jdGlvbgotICAgICAgfHwgKGluZm8tPmdjY19jb21waWxlZCA9PSAwICYmIGluZm8tPm5fb3B0X2ZvdW5kKSkKLSAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpOwotCi0gIHYgPSAoc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKikgeG1hbGxvYyAoc2l6ZW9mICp2KTsKLSAgbWVtc2V0ICh2LCAwLCBzaXplb2YgKnYpOwotCi0gIHYtPm5leHQgPSBpbmZvLT5wZW5kaW5nOwotICB2LT5uYW1lID0gbmFtZTsKLSAgdi0+dHlwZSA9IHR5cGU7Ci0gIHYtPmtpbmQgPSBraW5kOwotICB2LT52YWwgPSB2YWw7Ci0gIGluZm8tPnBlbmRpbmcgPSB2OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbWl0IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICBUaGlzIGlzIGNhbGxlZCBhZnRlciB3ZSBzZWUgdGhlCi0gICBOX0xCUkFDIHRoYXQgc3RhcnRzIHRoZSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqdjsKLQotICB2ID0gaW5mby0+cGVuZGluZzsKLSAgd2hpbGUgKHYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqbmV4dDsKLQotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCB2LT5uYW1lLCB2LT50eXBlLCB2LT5raW5kLCB2LT52YWwpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbmV4dCA9IHYtPm5leHQ7Ci0gICAgICBmcmVlICh2KTsKLSAgICAgIHYgPSBuZXh0OwotICAgIH0KLQotICBpbmZvLT5wZW5kaW5nID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluZCB0aGUgc2xvdCBmb3IgYSB0eXBlIGluIHRoZSBkYXRhYmFzZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLXN0YWJfZmluZF9zbG90IChpbmZvLCB0eXBlbnVtcykKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBpbnQgZmlsZW51bTsKLSAgaW50IGluZGV4OwotICBzdHJ1Y3Qgc3RhYl90eXBlcyAqKnBzOwotCi0gIGZpbGVudW0gPSB0eXBlbnVtc1swXTsKLSAgaW5kZXggPSB0eXBlbnVtc1sxXTsKLQotICBpZiAoZmlsZW51bSA8IDAgfHwgKHVuc2lnbmVkIGludCkgZmlsZW51bSA+PSBpbmZvLT5maWxlcykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlR5cGUgZmlsZSBudW1iZXIgJWQgb3V0IG9mIHJhbmdlXG4iKSwgZmlsZW51bSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChpbmRleCA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJUeXBlIGluZGV4IG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIpLCBpbmRleCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcHMgPSBpbmZvLT5maWxlX3R5cGVzICsgZmlsZW51bTsKLQotICB3aGlsZSAoaW5kZXggPj0gU1RBQl9UWVBFU19TTE9UUykKLSAgICB7Ci0gICAgICBpZiAoKnBzID09IE5VTEwpCi0JewotCSAgKnBzID0gKHN0cnVjdCBzdGFiX3R5cGVzICopIHhtYWxsb2MgKHNpemVvZiAqKnBzKTsKLQkgIG1lbXNldCAoKnBzLCAwLCBzaXplb2YgKipwcyk7Ci0JfQotICAgICAgcHMgPSAmKCpwcyktPm5leHQ7Ci0gICAgICBpbmRleCAtPSBTVEFCX1RZUEVTX1NMT1RTOwotICAgIH0KLSAgaWYgKCpwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpwcyA9IChzdHJ1Y3Qgc3RhYl90eXBlcyAqKSB4bWFsbG9jIChzaXplb2YgKipwcyk7Ci0gICAgICBtZW1zZXQgKCpwcywgMCwgc2l6ZW9mICoqcHMpOwotICAgIH0KLQotICByZXR1cm4gKCpwcyktPnR5cGVzICsgaW5kZXg7Ci19Ci0KLS8qIEZpbmQgYSB0eXBlIGdpdmVuIGEgdHlwZSBudW1iZXIuICBJZiB0aGUgdHlwZSBoYXMgbm90IGJlZW4KLSAgIGFsbG9jYXRlZCB5ZXQsIGNyZWF0ZSBhbiBpbmRpcmVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXN0YWJfZmluZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLXsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBpZiAodHlwZW51bXNbMF0gPT0gMCAmJiB0eXBlbnVtc1sxXSA8IDApCi0gICAgewotICAgICAgLyogQSBuZWdhdGl2ZSB0eXBlIG51bWJlciBpbmRpY2F0ZXMgYW4gWENPRkYgYnVpbHRpbiB0eXBlLiAgKi8KLSAgICAgIHJldHVybiBzdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXNbMV0pOwotICAgIH0KLQotICBzbG90ID0gc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKTsKLSAgaWYgKHNsb3QgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICgqc2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgc2xvdCwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLSAgcmV0dXJuICpzbG90OwotfQotCi0vKiBSZWNvcmQgdGhhdCBhIGdpdmVuIHR5cGUgbnVtYmVyIHJlZmVycyB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIHR5cGUpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBzbG90ID0gc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKTsKLSAgaWYgKHNsb3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogZ2RiIGFwcGVhcnMgdG8gaWdub3JlIHR5cGUgcmVkZWZpbml0aW9ucywgc28gd2UgZG8gYXMgd2VsbC4gICovCi0KLSAgKnNsb3QgPSB0eXBlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gYW4gWENPRkYgYnVpbHRpbiB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXN0YWJfeGNvZmZfYnVpbHRpbl90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBpbnQgdHlwZW51bTsKLXsKLSAgZGVidWdfdHlwZSByZXR0eXBlOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmICh0eXBlbnVtID49IDAgfHwgdHlwZW51bSA8IC1YQ09GRl9UWVBFX0NPVU5UKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIFhDT0ZGIHR5cGUgJWRcbiIpLCB0eXBlbnVtKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICBpZiAoaW5mby0+eGNvZmZfdHlwZXNbLXR5cGVudW1dICE9IE5VTEwpCi0gICAgcmV0dXJuIGluZm8tPnhjb2ZmX3R5cGVzWy10eXBlbnVtXTsKLQotICBzd2l0Y2ggKC10eXBlbnVtKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBUaGUgc2l6ZSBvZiB0aGlzIGFuZCBhbGwgdGhlIG90aGVyIHR5cGVzIGFyZSBmaXhlZCwgZGVmaW5lZAotCSBieSB0aGUgZGVidWdnaW5nIGZvcm1hdC4gICovCi0gICAgICBuYW1lID0gImludCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBuYW1lID0gInNob3J0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBuYW1lID0gImxvbmciOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgY2hhciI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICBuYW1lID0gInNpZ25lZCBjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIHNob3J0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgaW50IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgOToKLSAgICAgIG5hbWUgPSAidW5zaWduZWQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgIGNhc2UgMTA6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmciOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMToKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIC8qIElFRUUgc2luZ2xlIHByZWNpc2lvbiAoMzIgYml0KS4gICovCi0gICAgICBuYW1lID0gImZsb2F0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMzoKLSAgICAgIC8qIElFRUUgZG91YmxlIHByZWNpc2lvbiAoNjQgYml0KS4gICovCi0gICAgICBuYW1lID0gImRvdWJsZSI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTQ6Ci0gICAgICAvKiBUaGlzIGlzIGFuIElFRUUgZG91YmxlIG9uIHRoZSBSUy82MDAwLCBhbmQgZGlmZmVyZW50IG1hY2hpbmVzCi0JIHdpdGggZGlmZmVyZW50IHNpemVzIGZvciAibG9uZyBkb3VibGUiIHNob3VsZCB1c2UgZGlmZmVyZW50Ci0JIG5lZ2F0aXZlIHR5cGUgbnVtYmVycy4gIFNlZSBzdGFicy50ZXhpbmZvLiAgKi8KLSAgICAgIG5hbWUgPSAibG9uZyBkb3VibGUiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE1OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgbmFtZSA9ICJib29sZWFuIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE3OgotICAgICAgbmFtZSA9ICJzaG9ydCByZWFsIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxODoKLSAgICAgIG5hbWUgPSAicmVhbCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTk6Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgbmFtZSA9ICJzdHJpbmdwdHIiOwotICAgICAgcmV0dHlwZSA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIwOgotICAgICAgLyogRklYTUUgKi8KLSAgICAgIG5hbWUgPSAiY2hhcmFjdGVyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjE6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqMSI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjoKLSAgICAgIG5hbWUgPSAibG9naWNhbCoyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIzOgotICAgICAgbmFtZSA9ICJsb2dpY2FsKjQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjU6Ci0gICAgICAvKiBDb21wbGV4IHR5cGUgY29uc2lzdGluZyBvZiB0d28gSUVFRSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlcy4gICovCi0gICAgICBuYW1lID0gImNvbXBsZXgiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjY6Ci0gICAgICAvKiBDb21wbGV4IHR5cGUgY29uc2lzdGluZyBvZiB0d28gSUVFRSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlcy4gICovCi0gICAgICBuYW1lID0gImRvdWJsZSBjb21wbGV4IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoZGhhbmRsZSwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNzoKLSAgICAgIG5hbWUgPSAiaW50ZWdlcioxIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI4OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyKjIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjk6Ci0gICAgICBuYW1lID0gImludGVnZXIqNCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMDoKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBuYW1lID0gIndjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMxOgotICAgICAgbmFtZSA9ICJsb25nIGxvbmciOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmcgbG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMzOgotICAgICAgbmFtZSA9ICJsb2dpY2FsKjgiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzQ6Ci0gICAgICBuYW1lID0gImludGVnZXIqOCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCByZXR0eXBlKTsKLQotICBpbmZvLT54Y29mZl90eXBlc1stdHlwZW51bV0gPSByZXR0eXBlOwotCi0gIHJldHVybiByZXR0eXBlOwotfQotCi0vKiBGaW5kIG9yIGNyZWF0ZSBhIHRhZ2dlZCB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXN0YWJfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgaW5mbywgcCwgbGVuLCBraW5kKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwOwotICAgICBpbnQgbGVuOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBjaGFyICpuYW1lOwotICBkZWJ1Z190eXBlIGR0eXBlOwotICBzdHJ1Y3Qgc3RhYl90YWcgKnN0OwotCi0gIG5hbWUgPSBzYXZlc3RyaW5nIChwLCBsZW4pOwotCi0gIC8qIFdlIHBhc3MgREVCVUdfS0lORF9JTExFR0FMIGJlY2F1c2Ugd2Ugd2FudCBhbGwgdGFncyBpbiB0aGUgc2FtZQotICAgICBuYW1lc3BhY2UuICBUaGlzIGlzIHJpZ2h0IGZvciBDLCBhbmQgSSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUKLSAgICAgb3RoZXIgbGFuZ3VhZ2VzLiAgRklYTUUuICAqLwotICBkdHlwZSA9IGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIG5hbWUsIERFQlVHX0tJTkRfSUxMRUdBTCk7Ci0gIGlmIChkdHlwZSAhPSBERUJVR19UWVBFX05VTEwpCi0gICAgewotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgICByZXR1cm4gZHR5cGU7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gZW50cnkgb24gdGhlIHVuZGVmaW5lZCB0YWcgbGlzdC4gICovCi0gIGZvciAoc3QgPSBpbmZvLT50YWdzOyBzdCAhPSBOVUxMOyBzdCA9IHN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdC0+bmFtZVswXSA9PSBuYW1lWzBdCi0JICAmJiBzdHJjbXAgKHN0LT5uYW1lLCBuYW1lKSA9PSAwKQotCXsKLQkgIGlmIChzdC0+a2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwpCi0JICAgIHN0LT5raW5kID0ga2luZDsKLQkgIGZyZWUgKG5hbWUpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKHN0ID09IE5VTEwpCi0gICAgewotICAgICAgc3QgPSAoc3RydWN0IHN0YWJfdGFnICopIHhtYWxsb2MgKHNpemVvZiAqc3QpOwotICAgICAgbWVtc2V0IChzdCwgMCwgc2l6ZW9mICpzdCk7Ci0KLSAgICAgIHN0LT5uZXh0ID0gaW5mby0+dGFnczsKLSAgICAgIHN0LT5uYW1lID0gbmFtZTsKLSAgICAgIHN0LT5raW5kID0ga2luZDsKLSAgICAgIHN0LT5zbG90ID0gREVCVUdfVFlQRV9OVUxMOwotICAgICAgc3QtPnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsICZzdC0+c2xvdCwgbmFtZSk7Ci0gICAgICBpbmZvLT50YWdzID0gc3Q7Ci0gICAgfQotCi0gIHJldHVybiBzdC0+dHlwZTsKLX0KLQwKLS8qIEluIG9yZGVyIHRvIGdldCB0aGUgY29ycmVjdCBhcmd1bWVudCB0eXBlcyBmb3IgYSBzdHViYmVkIG1ldGhvZCwgd2UKLSAgIG5lZWQgdG8gZXh0cmFjdCB0aGUgYXJndW1lbnQgdHlwZXMgZnJvbSBhIEMrKyBtYW5nbGVkIHN0cmluZy4KLSAgIFNpbmNlIHRoZSBhcmd1bWVudCB0eXBlcyBjYW4gcmVmZXIgYmFjayB0byB0aGUgcmV0dXJuIHR5cGUsIHRoaXMKLSAgIG1lYW5zIHRoYXQgd2UgbXVzdCBkZW1hbmdsZSB0aGUgZW50aXJlIHBoeXNpY2FsIG5hbWUuICBJbiBnZGIgdGhpcwotICAgaXMgZG9uZSBieSBjYWxsaW5nIGNwbHVzX2RlbWFuZ2xlIGFuZCBydW5uaW5nIHRoZSByZXN1bHRzIGJhY2sKLSAgIHRocm91Z2ggdGhlIEMrKyBleHByZXNzaW9uIHBhcnNlci4gIFNpbmNlIHdlIGhhdmUgbm8gZXhwcmVzc2lvbgotICAgcGFyc2VyLCB3ZSBtdXN0IGR1cGxpY2F0ZSBtdWNoIG9mIHRoZSB3b3JrIG9mIGNwbHVzX2RlbWFuZ2xlIGhlcmUuCi0KLSAgIFdlIGFzc3VtZSB0aGF0IEdOVSBzdHlsZSBkZW1hbmdsaW5nIGlzIHVzZWQsIHNpbmNlIHRoaXMgaXMgb25seQotICAgZG9uZSBmb3IgbWV0aG9kIHN0dWJzLCBhbmQgb25seSBnKysgc2hvdWxkIG91dHB1dCB0aGF0IGZvcm0gb2YKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIHBvaW50ZXIgdG8gdHlwZSBpbmZvcm1hdGlvbiB3aGljaAotICAgZGVtYW5nbGluZyBhIHN0cmluZy4gICovCi0KLXN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcKLXsKLSAgLyogVGhlIHN0YXJ0IG9mIHRoZSB0eXBlLiAgVGhpcyBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkLiAgKi8KLSAgY29uc3QgY2hhciAqdHlwZXN0cmluZzsKLSAgLyogVGhlIGxlbmd0aCBvZiB0aGUgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBsZW47Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gd2hpbGUgZGVtYW5nbGluZyBhCi0gICBzdHJpbmcuICAqLwotCi1zdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvCi17Ci0gIC8qIFRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGFuZGxlLiAgKi8KLSAgUFRSIGRoYW5kbGU7Ci0gIC8qIFRoZSBzdGFiIGluZm9ybWF0aW9uIGhhbmRsZS4gICovCi0gIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgLyogVGhlIGFycmF5IG9mIGFyZ3VtZW50cyB3ZSBhcmUgYnVpbGRpbmcuICAqLwotICBkZWJ1Z190eXBlICphcmdzOwotICAvKiBXaGV0aGVyIHRoZSBtZXRob2QgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgYm9vbGVhbiB2YXJhcmdzOwotICAvKiBUaGUgYXJyYXkgb2YgdHlwZXMgd2UgaGF2ZSByZW1lbWJlcmVkLiAgKi8KLSAgc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZyAqdHlwZXN0cmluZ3M7Ci0gIC8qIFRoZSBudW1iZXIgb2YgdHlwZXN0cmluZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZXN0cmluZ19jb3VudDsKLSAgLyogVGhlIG51bWJlciBvZiB0eXBlc3RyaW5nIHNsb3RzIHdlIGhhdmUgYWxsb2NhdGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGVzdHJpbmdfYWxsb2M7Ci19OwotCi1zdGF0aWMgdm9pZCBzdGFiX2JhZF9kZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYl9kZW1hbmdsZV9jb3VudCBQQVJBTVMgKChjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudAotICBQQVJBTVMgKChjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9wcmVmaXgKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfc2lnbmF0dXJlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2NsYXNzCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9hcmdzCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKiwKLQkgICBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfYXJnCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKiwKLQkgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9mdW5kX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLS8qIFdhcm4gYWJvdXQgYSBiYWQgZGVtYW5nbGluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1zdGFiX2JhZF9kZW1hbmdsZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJiYWQgbWFuZ2xlZCBuYW1lIGAlcydcbiIpLCBzKTsKLX0KLQotLyogR2V0IGEgY291bnQgZnJvbSBhIHN0YWIgc3RyaW5nLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotc3RhYl9kZW1hbmdsZV9jb3VudCAocHApCi0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLSAgICB7Ci0gICAgICBjb3VudCAqPSAxMDsKLSAgICAgIGNvdW50ICs9ICoqcHAgLSAnMCc7Ci0gICAgICArKypwcDsKLSAgICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLQotLyogUmVxdWlyZSBhIGNvdW50IGluIGEgc3RyaW5nLiAgVGhlIGNvdW50IG1heSBiZSBtdWx0aXBsZSBkaWdpdHMsIGluCi0gICB3aGljaCBjYXNlIGl0IG11c3QgZW5kIGluIGFuIHVuZGVyc2NvcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCBwaSkKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICB1bnNpZ25lZCBpbnQgKnBpOwotewotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpwaSA9ICoqcHAgLSAnMCc7Ci0gICsrKnBwOwotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudDsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICAgIGNvdW50ID0gKnBpOwotICAgICAgcCA9ICpwcDsKLSAgICAgIGRvCi0JewotCSAgY291bnQgKj0gMTA7Ci0JICBjb3VudCArPSAqcCAtICcwJzsKLQkgICsrcDsKLQl9Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSk7Ci0gICAgICBpZiAoKnAgPT0gJ18nKQotCXsKLQkgICpwcCA9IHAgKyAxOwotCSAgKnBpID0gY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBkZW1hbmdsZXMgYSBwaHlzaWNhbCBuYW1lLCByZXR1cm5pbmcgYSBOVUxMCi0gICB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUgKgotc3RhYl9kZW1hbmdsZV9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgcGh5c25hbWUsIHB2YXJhcmdzKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgYm9vbGVhbiAqcHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gbWluZm87Ci0KLSAgbWluZm8uZGhhbmRsZSA9IGRoYW5kbGU7Ci0gIG1pbmZvLmluZm8gPSBpbmZvOwotICBtaW5mby5hcmdzID0gTlVMTDsKLSAgbWluZm8udmFyYXJncyA9IGZhbHNlOwotICBtaW5mby50eXBlc3RyaW5nX2FsbG9jID0gMTA7Ci0gIG1pbmZvLnR5cGVzdHJpbmdzID0gKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nICopCi0JCSAgICAgICB4bWFsbG9jIChtaW5mby50eXBlc3RyaW5nX2FsbG9jCi0JCQkJKiBzaXplb2YgKm1pbmZvLnR5cGVzdHJpbmdzKSk7Ci0gIG1pbmZvLnR5cGVzdHJpbmdfY291bnQgPSAwOwotCi0gIC8qIGNwbHVzX2RlbWFuZ2xlIGNoZWNrcyBmb3Igc3BlY2lhbCBHTlUgbWFuZ2xlZCBmb3JtcywgYnV0IHdlIGNhbid0Ci0gICAgIHNlZSBhbnkgb2YgdGhlbSBpbiBtYW5nbGVkIG1ldGhvZCBhcmd1bWVudCB0eXBlcy4gICovCi0KLSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9wcmVmaXggKCZtaW5mbywgJnBoeXNuYW1lKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoKnBoeXNuYW1lICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9zaWduYXR1cmUgKCZtaW5mbywgJnBoeXNuYW1lKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZnJlZSAobWluZm8udHlwZXN0cmluZ3MpOwotICBtaW5mby50eXBlc3RyaW5ncyA9IE5VTEw7Ci0KLSAgaWYgKG1pbmZvLmFyZ3MgPT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIm5vIGFyZ3VtZW50IHR5cGVzIGluIG1hbmdsZWQgc3RyaW5nXG4iKSk7Ci0KLSAgKnB2YXJhcmdzID0gbWluZm8udmFyYXJnczsKLSAgcmV0dXJuIG1pbmZvLmFyZ3M7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChtaW5mby50eXBlc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKG1pbmZvLnR5cGVzdHJpbmdzKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSBwcmVmaXggb2YgdGhlIG1hbmdsZWQgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3ByZWZpeCAobWluZm8sIHBwKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpzY2FuOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBjcGx1c19kZW1hbmdsZSBjaGVja3MgZm9yIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLAotICAgICBidXQgd2UgY2FuJ3Qgc2VlIHRoZW0gaW4gbWFuZ2xlZCBhcmd1bWVudCB0eXBlcy4gICovCi0KLSAgLyogTG9vayBmb3IgYF9fJy4gICovCi0gIHNjYW4gPSAqcHA7Ci0gIGRvCi0gICAgewotICAgICAgc2NhbiA9IHN0cmNociAoc2NhbiwgJ18nKTsKLSAgICB9Ci0gIHdoaWxlIChzY2FuICE9IE5VTEwgJiYgKisrc2NhbiAhPSAnXycpOwotCi0gIGlmIChzY2FuID09IE5VTEwpCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKCpwcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC0tc2NhbjsKLQotICAvKiBXZSBmb3VuZCBgX18nOyBtb3ZlIGFoZWFkIHRvIHRoZSBsYXN0IGNvbnRpZ3VvdXMgYF9fJyBwYWlyLiAgKi8KLSAgaSA9IHN0cnNwbiAoc2NhbiwgIl8iKTsKLSAgaWYgKGkgPiAyKQotICAgIHNjYW4gKz0gaSAtIDI7Ci0KLSAgaWYgKHNjYW4gPT0gKnBwCi0gICAgICAmJiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNjYW5bMl0pCi0JICB8fCBzY2FuWzJdID09ICdRJwotCSAgfHwgc2NhblsyXSA9PSAndCcpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBHTlUgc3R5bGUgY29uc3RydWN0b3IgbmFtZS4gICovCi0gICAgICAqcHAgPSBzY2FuICsgMjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZSBpZiAoc2NhbiA9PSAqcHAKLQkgICAmJiAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzY2FuWzJdKQotCSAgICYmIHNjYW5bMl0gIT0gJ3QnKQotICAgIHsKLSAgICAgIC8qIExvb2sgZm9yIHRoZSBgX18nIHRoYXQgc2VwYXJhdGVzIHRoZSBwcmVmaXggZnJvbSB0aGUKLSAgICAgICAgIHNpZ25hdHVyZS4gICovCi0gICAgICB3aGlsZSAoKnNjYW4gPT0gJ18nKQotCSsrc2NhbjsKLSAgICAgIHNjYW4gPSBzdHJzdHIgKHNjYW4sICJfXyIpOwotICAgICAgaWYgKHNjYW4gPT0gTlVMTCB8fCBzY2FuWzJdID09ICdcMCcpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKCpwcCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gc3RhYl9kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIChtaW5mbywgcHAsIHNjYW4pOwotICAgIH0KLSAgZWxzZSBpZiAoc2NhblsyXSAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFRoZSBuYW1lIGRvZXNuJ3Qgc3RhcnQgd2l0aCBgX18nLCBidXQgaXQgZG9lcyBjb250YWluIGBfXycuICAqLwotICAgICAgcmV0dXJuIHN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAobWluZm8sIHBwLCBzY2FuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIERlbWFuZ2xlIGEgZnVuY3Rpb24gbmFtZSBwcmVmaXguICBUaGUgc2NhbiBhcmd1bWVudCBwb2ludHMgdG8gdGhlCi0gICBkb3VibGUgdW5kZXJzY29yZSB3aGljaCBzZXBhcmF0ZXMgdGhlIGZ1bmN0aW9uIG5hbWUgZnJvbSB0aGUKLSAgIHNpZ25hdHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKG1pbmZvLCBwcCwgc2NhbikKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgY2hhciAqc2NhbjsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgc3RyaW5nIGZyb20gKnBwIHRvIHNjYW4gaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgV2UKLSAgICAgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbmFtZSwgc2luY2Ugd2UganVzdCBsb29raW5nIGZvciBhcmd1bWVudAotICAgICB0eXBlcy4gIEhvd2V2ZXIsIGZvciBjb252ZXJzaW9uIG9wZXJhdG9ycywgdGhlIG5hbWUgbWF5IGluY2x1ZGUgYQotICAgICB0eXBlIHdoaWNoIHdlIG11c3QgcmVtZW1iZXIgaW4gb3JkZXIgdG8gaGFuZGxlIGJhY2tyZWZlcmVuY2VzLiAgKi8KLQotICBuYW1lID0gKnBwOwotICAqcHAgPSBzY2FuICsgMjsKLQotICBpZiAoKnBwIC0gbmFtZSA+PSA1Ci0JICAgJiYgc3RybmNtcCAobmFtZSwgInR5cGUiLCA0KSA9PSAwCi0JICAgJiYgKG5hbWVbNF0gPT0gJyQnIHx8IG5hbWVbNF0gPT0gJy4nKSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gbmFtZSArIDU7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCAmdGVtLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChuYW1lWzBdID09ICdfJwotCSAgICYmIG5hbWVbMV0gPT0gJ18nCi0JICAgJiYgbmFtZVsyXSA9PSAnbycKLQkgICAmJiBuYW1lWzNdID09ICdwJykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gbmFtZSArIDQ7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCAmdGVtLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSB0aGUgc2lnbmF0dXJlLiAgVGhpcyBpcyB3aGVyZSB0aGUgYXJndW1lbnQgdHlwZXMgYXJlCi0gICBmb3VuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3NpZ25hdHVyZSAobWluZm8sIHBwKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBib29sZWFuIGV4cGVjdF9mdW5jLCBmdW5jX2RvbmU7Ci0gIGNvbnN0IGNoYXIgKmhvbGQ7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBleHBlY3RfZnVuYyA9IGZhbHNlOwotICBmdW5jX2RvbmUgPSBmYWxzZTsKLSAgaG9sZCA9IE5VTEw7Ci0KLSAgd2hpbGUgKCoqcHAgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqcHApCi0JewotCWNhc2UgJ1EnOgotCSAgaG9sZCA9ICpwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkIChtaW5mbywgcHAsIChkZWJ1Z190eXBlICopIE5VTEwpCi0JICAgICAgfHwgISBzdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBob2xkLCAqcHAgLSBob2xkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZXhwZWN0X2Z1bmMgPSB0cnVlOwotCSAgaG9sZCA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgotCSAgLyogU3RhdGljIG1lbWJlciBmdW5jdGlvbi4gIEZJWE1FOiBDYW4gdGhpcyBoYXBwZW4/ICAqLwotCSAgaWYgKGhvbGQgPT0gTlVMTCkKLQkgICAgaG9sZCA9ICpwcDsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoKLQkgIC8qIENvbnN0IG1lbWJlciBmdW5jdGlvbi4gICovCi0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9jbGFzcyAobWluZm8sIHBwLCAoY29uc3QgY2hhciAqKikgTlVMTCkKLQkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBleHBlY3RfZnVuYyA9IHRydWU7Ci0JICBob2xkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRic6Ci0JICAvKiBGdW5jdGlvbi4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGFjdHVhbGx5IGhhcHBlbnMgd2l0aCBnKysKLSAgICAgICAgICAgICBvdXRwdXQuICAqLwotCSAgaG9sZCA9IE5VTEw7Ci0JICBmdW5jX2RvbmUgPSB0cnVlOwotCSAgKysqcHA7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgLyogVGVtcGxhdGUuICAqLwotCSAgaWYgKGhvbGQgPT0gTlVMTCkKLQkgICAgaG9sZCA9ICpwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUgKG1pbmZvLCBwcCwgKGNoYXIgKiopIE5VTEwpCi0JICAgICAgfHwgISBzdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBob2xkLCAqcHAgLSBob2xkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaG9sZCA9IE5VTEw7Ci0JICBleHBlY3RfZnVuYyA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgJ18nOgotCSAgLyogQXQgdGhlIG91dGVybW9zdCBsZXZlbCwgd2UgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZQotCSAgICAgc3BlY2lmaWVkLCBzbyBpZiB3ZSBydW4gaW50byBhbm90aGVyICdfJyBhdCB0aGlzIHBvaW50IHdlCi0JICAgICBhcmUgZGVhbGluZyB3aXRoIGEgbWFuZ2xlZCBuYW1lIHRoYXQgaXMgZWl0aGVyIGJvZ3VzLCBvcgotCSAgICAgaGFzIGJlZW4gbWFuZ2xlZCBieSBzb21lIGFsZ29yaXRobSB3ZSBkb24ndCBrbm93IGhvdyB0bwotCSAgICAgZGVhbCB3aXRoLiAgU28ganVzdCByZWplY3QgdGhlIGVudGlyZSBkZW1hbmdsaW5nLiAgKi8KLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQotCWRlZmF1bHQ6Ci0JICAvKiBBc3N1bWUgd2UgaGF2ZSBzdHVtYmxlZCBvbnRvIHRoZSBmaXJzdCBvdXRlcm1vc3QgZnVuY3Rpb24KLQkgICAgIGFyZ3VtZW50IHRva2VuLCBhbmQgc3RhcnQgcHJvY2Vzc2luZyBhcmdzLiAgKi8KLQkgIGZ1bmNfZG9uZSA9IHRydWU7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChleHBlY3RfZnVuYykKLQl7Ci0JICBmdW5jX2RvbmUgPSB0cnVlOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsICZtaW5mby0+YXJncywgJm1pbmZvLT52YXJhcmdzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZnVuY19kb25lKQotICAgIHsKLSAgICAgIC8qIFdpdGggR05VIHN0eWxlIGRlbWFuZ2xpbmcsIGJhcl9fM2ZvbyBpcyAnZm9vOjpiYXIodm9pZCknLCBhbmQKLQkgYmFyX18zZm9vaSBpcyAnZm9vOjpiYXIoaW50KScuICBXZSBnZXQgaGVyZSB3aGVuIHdlIGZpbmQgdGhlCi0JIGZpcnN0IGNhc2UsIGFuZCBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSAnKHZvaWQpJyBnZXRzIGFkZGVkCi0JIHRvIHRoZSBjdXJyZW50IGRlY2xwLiAgKi8KLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSBxdWFsaWZpZWQgbmFtZSwgc3VjaCBhcyAiUTI1T3V0ZXI1SW5uZXIiIHdoaWNoIGlzIHRoZQotICAgbWFuZ2xlZCBmb3JtIG9mICJPdXRlcjo6SW5uZXIiLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkIChtaW5mbywgcHAsIHB0eXBlKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICpwdHlwZTsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgdW5zaWduZWQgaW50IHF1YWxpZmllcnM7Ci0gIGRlYnVnX3R5cGUgY29udGV4dDsKLQotICBvcmlnID0gKnBwOwotCi0gIHN3aXRjaCAoKCpwcClbMV0pCi0gICAgewotICAgIGNhc2UgJ18nOgotICAgICAgLyogR05VIG1hbmdsZWQgbmFtZSB3aXRoIG1vcmUgdGhhbiA5IGNsYXNzZXMuICBUaGUgY291bnQgaXMKLQkgcHJlY2VkZWQgYnkgYW4gdW5kZXJzY29yZSAodG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSB0aGUgPD0gOQotCSBjYXNlKSBhbmQgZm9sbG93ZWQgYnkgYW4gdW5kZXJzY29yZS4gICovCi0gICAgICBwID0gKnBwICsgMjsKLSAgICAgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJzAnKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBxdWFsaWZpZXJzID0gYXRvaSAocCk7Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSkKLQkrK3A7Ci0gICAgICBpZiAoKnAgIT0gJ18nKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAqcHAgPSBwICsgMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgcXVhbGlmaWVycyA9ICgqcHApWzFdIC0gJzAnOwotICAgICAgLyogU2tpcCBhbiBvcHRpb25hbCB1bmRlcnNjb3JlIGFmdGVyIHRoZSBjb3VudC4gICovCi0gICAgICBpZiAoKCpwcClbMl0gPT0gJ18nKQotCSsrKnBwOwotICAgICAgKnBwICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgIGRlZmF1bHQ6Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgLyogUGljayBvZmYgdGhlIG5hbWVzLiAgKi8KLSAgd2hpbGUgKHF1YWxpZmllcnMtLSA+IDApCi0gICAgewotICAgICAgaWYgKCoqcHAgPT0gJ18nKQotCSsrKnBwOwotICAgICAgaWYgKCoqcHAgPT0gJ3QnKQotCXsKLQkgIGNoYXIgKm5hbWU7Ci0KLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUgKG1pbmZvLCBwcCwKLQkJCQkJcHR5cGUgIT0gTlVMTCA/ICZuYW1lIDogTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKHB0eXBlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb250ZXh0ID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbWluZm8tPmluZm8sCi0JCQkJCSAgICAgICBuYW1lLCBzdHJsZW4gKG5hbWUpLAotCQkJCQkgICAgICAgREVCVUdfS0lORF9DTEFTUyk7Ci0JICAgICAgZnJlZSAobmFtZSk7Ci0JICAgICAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGxlbjsKLQotCSAgbGVuID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotCSAgaWYgKHN0cmxlbiAoKnBwKSA8IGxlbikKLQkgICAgewotCSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHB0eXBlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBkZWJ1Z19maWVsZCAqZmllbGRzOwotCi0JICAgICAgZmllbGRzID0gTlVMTDsKLQkgICAgICBpZiAoY29udGV4dCAhPSBERUJVR19UWVBFX05VTEwpCi0JCWZpZWxkcyA9IGRlYnVnX2dldF9maWVsZHMgKG1pbmZvLT5kaGFuZGxlLCBjb250ZXh0KTsKLQotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0KLQkgICAgICBpZiAoZmllbGRzICE9IE5VTEwpCi0JCXsKLQkJICBjaGFyICpuYW1lOwotCi0JCSAgLyogVHJ5IHRvIGZpbmQgdGhlIHR5cGUgYnkgbG9va2luZyB0aHJvdWdoIHRoZQotICAgICAgICAgICAgICAgICAgICAgZmllbGRzIG9mIGNvbnRleHQgdW50aWwgd2UgZmluZCBhIGZpZWxkIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgICAgICBzYW1lIHR5cGUuICBUaGlzIG91Z2h0IHRvIHdvcmsgZm9yIGEgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgd2l0aGluIGEgY2xhc3MsIGJ1dCBpdCB3b24ndCB3b3JrIGZvciwKLSAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGFuIGVudW0gZGVmaW5lZCB3aXRoaW4gYSBjbGFzcy4gIHN0YWJzIGRvZXMKLSAgICAgICAgICAgICAgICAgICAgIG5vdCBnaXZlIHVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHRoZQotICAgICAgICAgICAgICAgICAgICAgbGF0dGVyIGNhc2UuICAqLwotCi0JCSAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgbGVuKTsKLQotCQkgIGZvciAoOyAqZmllbGRzICE9IERFQlVHX0ZJRUxEX05VTEw7IGZpZWxkcysrKQotCQkgICAgewotCQkgICAgICBkZWJ1Z190eXBlIGZ0OwotCQkgICAgICBjb25zdCBjaGFyICpkbjsKLQotCQkgICAgICBmdCA9IGRlYnVnX2dldF9maWVsZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKmZpZWxkcyk7Ci0JCSAgICAgIGlmIChmdCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBkbiA9IGRlYnVnX2dldF90eXBlX25hbWUgKG1pbmZvLT5kaGFuZGxlLCBmdCk7Ci0JCSAgICAgIGlmIChkbiAhPSBOVUxMICYmIHN0cmNtcCAoZG4sIG5hbWUpID09IDApCi0JCQl7Ci0JCQkgIGNvbnRleHQgPSBmdDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBmcmVlIChuYW1lKTsKLQkJfQotCi0JICAgICAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSB0byBmYWxsIGJhY2sgb24gZmluZGluZyB0aGUgdHlwZSBieSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgYXJlIG1vcmUgdHlwZXMgdG8gY29tZSwgdGhlbiB0aGlzIG11c3QKLSAgICAgICAgICAgICAgICAgICAgIGJlIGEgY2xhc3MuICBPdGhlcndpc2UsIGl0IGNvdWxkIGJlIGFueXRoaW5nLiAgKi8KLQotCQkgIGlmIChxdWFsaWZpZXJzID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKm5hbWU7Ci0KLQkJICAgICAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgbGVuKTsKLQkJICAgICAgY29udGV4dCA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCQkgICAgICAgbmFtZSk7Ci0JCSAgICAgIGZyZWUgKG5hbWUpOwotCQkgICAgfQotCi0JCSAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgICAgewotCQkgICAgICBjb250ZXh0ID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJCSAgICAgICBtaW5mby0+aW5mbywKLQkJCQkJCSAgICAgICAqcHAsIGxlbiwKLQkJCQkJCSAgICAgICAocXVhbGlmaWVycyA9PSAwCi0JCQkJCQkJPyBERUJVR19LSU5EX0lMTEVHQUwKLQkJCQkJCQk6IERFQlVHX0tJTkRfQ0xBU1MpKTsKLQkJICAgICAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgKnBwICs9IGxlbjsKLQl9Ci0gICAgfQotCi0gIGlmIChwdHlwZSAhPSBOVUxMKQotICAgICpwdHlwZSA9IGNvbnRleHQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgdGVtcGxhdGUuICBJZiBQTkFNRSBpcyBub3QgTlVMTCwgdGhpcyBzZXRzICpQTkFNRSB0byBhCi0gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfdGVtcGxhdGUgKG1pbmZvLCBwcCwgcG5hbWUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNoYXIgKipwbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgdW5zaWduZWQgaW50IHIsIGk7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICArKypwcDsKLQotICAvKiBTa2lwIHRoZSB0ZW1wbGF0ZSBuYW1lLiAgKi8KLSAgciA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLSAgaWYgKHIgPT0gMCB8fCBzdHJsZW4gKCpwcCkgPCByKQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICpwcCArPSByOwotCi0gIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIGxpc3QuICAqLwotICBpZiAoc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmcikgPT0gMCkKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0gICAgewotICAgICAgaWYgKCoqcHAgPT0gJ1onKQotCXsKLQkgIC8qIFRoaXMgaXMgYSB0eXBlIHBhcmFtZXRlci4gICovCi0JICArKypwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpvbGRfcDsKLQkgIGJvb2xlYW4gcG9pbnRlcnAsIHJlYWxwLCBpbnRlZ3JhbHAsIGNoYXJwLCBib29scDsKLQkgIGJvb2xlYW4gZG9uZTsKLQotCSAgb2xkX3AgPSAqcHA7Ci0JICBwb2ludGVycCA9IGZhbHNlOwotCSAgcmVhbHAgPSBmYWxzZTsKLQkgIGludGVncmFscCA9IGZhbHNlOwotCSAgY2hhcnAgPSBmYWxzZTsKLQkgIGJvb2xwID0gZmFsc2U7Ci0JICBkb25lID0gZmFsc2U7Ci0KLQkgIC8qIFRoaXMgaXMgYSB2YWx1ZSBwYXJhbWV0ZXIuICAqLwotCi0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgKGRlYnVnX3R5cGUgKikgTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgd2hpbGUgKCpvbGRfcCAhPSAnXDAnICYmICEgZG9uZSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKm9sZF9wKQotCQl7Ci0JCWNhc2UgJ1AnOgotCQljYXNlICdwJzoKLQkJY2FzZSAnUic6Ci0JCSAgcG9pbnRlcnAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdDJzoJLyogQ29uc3QuICAqLwotCQljYXNlICdTJzoJLyogU2lnbmVkLiAgKi8KLQkJY2FzZSAnVSc6CS8qIFVuc2lnbmVkLiAgKi8KLQkJY2FzZSAnVic6CS8qIFZvbGF0aWxlLiAgKi8KLQkJY2FzZSAnRic6CS8qIEZ1bmN0aW9uLiAgKi8KLQkJY2FzZSAnTSc6CS8qIE1lbWJlciBmdW5jdGlvbi4gICovCi0JCWNhc2UgJ08nOgkvKiA/Pz8gKi8KLQkJICArK29sZF9wOwotCQkgIGJyZWFrOwotCQljYXNlICdRJzoJLyogUXVhbGlmaWVkIG5hbWUuICAqLwotCQkgIGludGVncmFscCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1QnOgkvKiBSZW1lbWJlcmVkIHR5cGUuICAqLwotCQkgIGFib3J0ICgpOwotCQljYXNlICd2JzoJLyogVm9pZC4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgJ3gnOgkvKiBMb25nIGxvbmcuICAqLwotCQljYXNlICdsJzoJLyogTG9uZy4gICovCi0JCWNhc2UgJ2knOgkvKiBJbnQuICAqLwotCQljYXNlICdzJzoJLyogU2hvcnQuICAqLwotCQljYXNlICd3JzoJLyogV2NoYXJfdC4gICovCi0JCSAgaW50ZWdyYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAnYic6CS8qIEJvb2wuICAqLwotCQkgIGJvb2xwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAnYyc6CS8qIENoYXIuICAqLwotCQkgIGNoYXJwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAncic6CS8qIExvbmcgZG91YmxlLiAgKi8KLQkJY2FzZSAnZCc6CS8qIERvdWJsZS4gICovCi0JCWNhc2UgJ2YnOgkvKiBGbG9hdC4gICovCi0JCSAgcmVhbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIC8qIEFzc3VtZSBpdCdzIGEgdXNlciBkZWZpbmVkIGludGVncmFsIHR5cGUuICAqLwotCQkgIGludGVncmFscCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaW50ZWdyYWxwKQotCSAgICB7Ci0JICAgICAgaWYgKCoqcHAgPT0gJ20nKQotCQkrKypwcDsKLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkrKypwcDsKLQkgICAgfQotCSAgZWxzZSBpZiAoY2hhcnApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgdmFsOwotCi0JICAgICAgaWYgKCoqcHAgPT0gJ20nKQotCQkrKypwcDsKLQkgICAgICB2YWwgPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0JICAgICAgaWYgKHZhbCA9PSAwKQotCQl7Ci0JCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChib29scCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCB2YWw7Ci0KLQkgICAgICB2YWwgPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0JICAgICAgaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQotCQl7Ci0JCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyZWFscCkKLQkgICAgewotCSAgICAgIGlmICgqKnBwID09ICdtJykKLQkJKysqcHA7Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkJKysqcHA7Ci0JICAgICAgaWYgKCoqcHAgPT0gJy4nKQotCQl7Ci0JCSAgKysqcHA7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkJICAgICsrKnBwOwotCQl9Ci0JICAgICAgaWYgKCoqcHAgPT0gJ2UnKQotCQl7Ci0JCSAgKysqcHA7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkJICAgICsrKnBwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHBvaW50ZXJwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGxlbjsKLQotCSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJmxlbikpCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgKnBwICs9IGxlbjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV2UgY2FuIHRyYW5zbGF0ZSB0aGlzIHRvIGEgc3RyaW5nIGZhaXJseSBlYXNpbHkgYnkgaW52b2tpbmcgdGhlCi0gICAgIHJlZ3VsYXIgZGVtYW5nbGluZyByb3V0aW5lLiAgKi8KLSAgaWYgKHBuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqczEsICpzMiwgKnMzLCAqczQ7Ci0gICAgICBjaGFyICpmcm9tLCAqdG87Ci0KLSAgICAgIHMxID0gc2F2ZXN0cmluZyAob3JpZywgKnBwIC0gb3JpZyk7Ci0KLSAgICAgIHMyID0gY29uY2F0ICgiTm9TdWNoU3RyaW5HX18iLCBzMSwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLSAgICAgIGZyZWUgKHMxKTsKLQotICAgICAgczMgPSBjcGx1c19kZW1hbmdsZSAoczIsIERNR0xfQU5TSSk7Ci0KLSAgICAgIGZyZWUgKHMyKTsKLQotICAgICAgaWYgKHMzICE9IE5VTEwpCi0JczQgPSBzdHJzdHIgKHMzLCAiOjpOb1N1Y2hTdHJpbkciKTsKLSAgICAgIGlmIChzMyA9PSBOVUxMIHx8IHM0ID09IE5VTEwpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgaWYgKHMzICE9IE5VTEwpCi0JICAgIGZyZWUgKHMzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEVsaW1pbmF0aW5nIGFsbCBzcGFjZXMsIGV4Y2VwdCB0aG9zZSBiZXR3ZWVuID4gY2hhcmFjdGVycywKLSAgICAgICAgIG1ha2VzIGl0IG1vcmUgbGlrZWx5IHRoYXQgdGhlIGRlbWFuZ2xlZCBuYW1lIHdpbGwgbWF0Y2ggdGhlCi0gICAgICAgICBuYW1lIHdoaWNoIGcrKyB1c2VkIGFzIHRoZSBzdHJ1Y3R1cmUgbmFtZS4gICovCi0gICAgICBmb3IgKGZyb20gPSB0byA9IHMzOyBmcm9tICE9IHM0OyArK2Zyb20pCi0JaWYgKCpmcm9tICE9ICcgJwotCSAgICB8fCAoZnJvbVsxXSA9PSAnPicgJiYgZnJvbSA+IHMzICYmIGZyb21bLTFdID09ICc+JykpCi0JICAqdG8rKyA9ICpmcm9tOwotCi0gICAgICAqcG5hbWUgPSBzYXZlc3RyaW5nIChzMywgdG8gLSBzMyk7Ci0KLSAgICAgIGZyZWUgKHMzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgY2xhc3MgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2NsYXNzIChtaW5mbywgcHAsIHBzdGFydCkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBzdGFydDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgdW5zaWduZWQgaW50IG47Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBuID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotICBpZiAoc3RybGVuICgqcHApIDwgbikKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChwc3RhcnQgIT0gTlVMTCkKLSAgICAqcHN0YXJ0ID0gKnBwOwotCi0gICpwcCArPSBuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBmdW5jdGlvbiBhcmd1bWVudHMuICBJZiB0aGUgcGFyZ3MgYXJndW1lbnQgaXMgbm90IE5VTEwsIGl0Ci0gICBpcyBzZXQgdG8gYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgaG9sZGluZyB0aGUgYXJndW1lbnRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCBwYXJncywgcHZhcmFyZ3MpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKipwYXJnczsKLSAgICAgYm9vbGVhbiAqcHZhcmFyZ3M7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIHVuc2lnbmVkIGludCBhbGxvYywgY291bnQ7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBhbGxvYyA9IDEwOwotICBpZiAocGFyZ3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqKnBhcmdzKTsKLSAgICAgICpwdmFyYXJncyA9IGZhbHNlOwotICAgIH0KLSAgY291bnQgPSAwOwotCi0gIHdoaWxlICgqKnBwICE9ICdfJyAmJiAqKnBwICE9ICdcMCcgJiYgKipwcCAhPSAnZScpCi0gICAgewotICAgICAgaWYgKCoqcHAgPT0gJ04nIHx8ICoqcHAgPT0gJ1QnKQotCXsKLQkgIGNoYXIgdGVtcHR5cGU7Ci0JICB1bnNpZ25lZCBpbnQgciwgdDsKLQotCSAgdGVtcHR5cGUgPSAqKnBwOwotCSAgKysqcHA7Ci0KLQkgIGlmICh0ZW1wdHlwZSA9PSAnVCcpCi0JICAgIHIgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmcikpCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmdCkpCi0JICAgIHsKLQkgICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICh0ID49IG1pbmZvLT50eXBlc3RyaW5nX2NvdW50KQotCSAgICB7Ci0JICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgd2hpbGUgKHItLSA+IDApCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICp0ZW07Ci0KLQkgICAgICB0ZW0gPSBtaW5mby0+dHlwZXN0cmluZ3NbdF0udHlwZXN0cmluZzsKLQkgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZyAobWluZm8sICZ0ZW0sIHBhcmdzLCAmY291bnQsICZhbGxvYykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZyAobWluZm8sIHBwLCBwYXJncywgJmNvdW50LCAmYWxsb2MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAocGFyZ3MgIT0gTlVMTCkKLSAgICAoKnBhcmdzKVtjb3VudF0gPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKCoqcHAgPT0gJ2UnKQotICAgIHsKLSAgICAgIGlmIChwYXJncyAhPSBOVUxMKQotCSpwdmFyYXJncyA9IHRydWU7Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgc2luZ2xlIGFyZ3VtZW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfYXJnIChtaW5mbywgcHAsIHBhcmdzLCBwY291bnQsIHBhbGxvYykKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqKnBhcmdzOwotICAgICB1bnNpZ25lZCBpbnQgKnBjb3VudDsKLSAgICAgdW5zaWduZWQgaW50ICpwYWxsb2M7Ci17Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0gIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLAotCQkJICAgIHBhcmdzID09IE5VTEwgPyAoZGVidWdfdHlwZSAqKSBOVUxMIDogJnR5cGUpCi0gICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIHN0YXJ0LCAqcHAgLSBzdGFydCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwYXJncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICgqcGNvdW50ICsgMSA+PSAqcGFsbG9jKQotCXsKLQkgICpwYWxsb2MgKz0gMTA7Ci0JICAqcGFyZ3MgPSAoKGRlYnVnX3R5cGUgKikKLQkJICAgIHhyZWFsbG9jICgqcGFyZ3MsICpwYWxsb2MgKiBzaXplb2YgKipwYXJncykpOwotCX0KLSAgICAgICgqcGFyZ3MpWypwY291bnRdID0gdHlwZTsKLSAgICAgICsrKnBjb3VudDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgdHlwZS4gIElmIHRoZSBwdHlwZSBhcmd1bWVudCBpcyBub3QgTlVMTCwgKnB0eXBlIGlzIHNldAotICAgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBzd2l0Y2ggKCoqcHApCi0gICAgewotICAgIGNhc2UgJ1AnOgotICAgIGNhc2UgJ3AnOgotICAgICAgLyogQSBwb2ludGVyIHR5cGUuICAqLwotICAgICAgKysqcHA7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCSpwdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAvKiBBIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICAvKiBBbiBhcnJheS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBoaWdoOwotCi0JKysqcHA7Ci0JaGlnaCA9IDA7Ci0Jd2hpbGUgKCoqcHAgIT0gJ1wwJyAmJiAqKnBwICE9ICdfJykKLQkgIHsKLQkgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCSAgICAgIHsKLQkJc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICBoaWdoICo9IDEwOwotCSAgICBoaWdoICs9ICoqcHAgLSAnMCc7Ci0JICAgICsrKnBwOwotCSAgfQotCWlmICgqKnBwICE9ICdfJykKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JKysqcHA7Ci0KLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICBkZWJ1Z190eXBlIGludF90eXBlOwotCi0JICAgIGludF90eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImludCIpOwotCSAgICBpZiAoaW50X3R5cGUgPT0gTlVMTCkKLQkgICAgICBpbnRfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0LCBmYWxzZSk7Ci0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSwgaW50X3R5cGUsCi0JCQkJCSAgICAwLCBoaWdoLCBmYWxzZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHJlbWVtYmVyZWQgdHlwZS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0JY29uc3QgY2hhciAqcDsKLQotCSsrKnBwOwotCWlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJmkpKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQlpZiAoaSA+PSBtaW5mby0+dHlwZXN0cmluZ19jb3VudCkKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JcCA9IG1pbmZvLT50eXBlc3RyaW5nc1tpXS50eXBlc3RyaW5nOwotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0YnOgotICAgICAgLyogQSBmdW5jdGlvbi4gICovCi0gICAgICB7Ci0JZGVidWdfdHlwZSAqYXJnczsKLQlib29sZWFuIHZhcmFyZ3M7Ci0KLQkrKypwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwKLQkJCQkgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgPyAoZGVidWdfdHlwZSAqKikgTlVMTAotCQkJCSAgIDogJmFyZ3MpLAotCQkJCSAgKHB0eXBlID09IE5VTEwKLQkJCQkgICA/IChib29sZWFuICopIE5VTEwKLQkJCQkgICA6ICZ2YXJhcmdzKSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKCoqcHAgIT0gJ18nKQotCSAgewotCSAgICAvKiBjcGx1c19kZW1hbmdsZSB3aWxsIGFjY2VwdCBhIGZ1bmN0aW9uIHdpdGhvdXQgYSByZXR1cm4KLQkgICAgICAgdHlwZSwgYnV0IEkgZG9uJ3Qga25vdyB3aGVuIHRoYXQgd2lsbCBoYXBwZW4sIG9yIHdoYXQKLQkgICAgICAgdG8gZG8gaWYgaXQgZG9lcy4gICovCi0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSsrKnBwOwotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKHB0eXBlICE9IE5VTEwpCi0JICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUsIGFyZ3MsCi0JCQkJCSAgICAgdmFyYXJncyk7Ci0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgY2FzZSAnTyc6Ci0gICAgICB7Ci0JYm9vbGVhbiBtZW1iZXJwLCBjb25zdHAsIHZvbGF0aWxlcDsKLQlkZWJ1Z190eXBlICphcmdzOwotCWJvb2xlYW4gdmFyYXJnczsKLQl1bnNpZ25lZCBpbnQgbjsKLQljb25zdCBjaGFyICpuYW1lOwotCi0JbWVtYmVycCA9ICoqcHAgPT0gJ00nOwotCWNvbnN0cCA9IGZhbHNlOwotCXZvbGF0aWxlcCA9IGZhbHNlOwotCWFyZ3MgPSBOVUxMOwotCXZhcmFyZ3MgPSBmYWxzZTsKLQotCSsrKnBwOwotCWlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JbiA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQlpZiAoc3RybGVuICgqcHApIDwgbikKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JbmFtZSA9ICpwcDsKLQkqcHAgKz0gbjsKLQotCWlmIChtZW1iZXJwKQotCSAgewotCSAgICBpZiAoKipwcCA9PSAnQycpCi0JICAgICAgewotCQljb25zdHAgPSB0cnVlOwotCQkrKypwcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCoqcHAgPT0gJ1YnKQotCSAgICAgIHsKLQkJdm9sYXRpbGVwID0gdHJ1ZTsKLQkJKysqcHA7Ci0JICAgICAgfQotCSAgICBpZiAoKipwcCAhPSAnRicpCi0JICAgICAgewotCQlzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICsrKnBwOwotCSAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwKLQkJCQkgICAgICAocHR5cGUgPT0gTlVMTAotCQkJCSAgICAgICA/IChkZWJ1Z190eXBlICoqKSBOVUxMCi0JCQkJICAgICAgIDogJmFyZ3MpLAotCQkJCSAgICAgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgICAgID8gKGJvb2xlYW4gKikgTlVMTAotCQkJCSAgICAgICA6ICZ2YXJhcmdzKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JaWYgKCoqcHAgIT0gJ18nKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkrKypwcDsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgZGVidWdfdHlwZSBjbGFzc190eXBlOwotCi0JICAgIGNsYXNzX3R5cGUgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJCW5hbWUsIChpbnQpIG4sCi0JCQkJCQlERUJVR19LSU5EX0NMQVNTKTsKLQkgICAgaWYgKGNsYXNzX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAoISBtZW1iZXJwKQotCSAgICAgICpwdHlwZSA9IGRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBjbGFzc190eXBlLAotCQkJCQkgICAgICAgKnB0eXBlKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogRklYTUU6IFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCBjb25zdHAgb3IKLSAgICAgICAgICAgICAgICAgICB2b2xhdGlsZXAuICAqLwotCQkqcHR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlLAotCQkJCQkJIGNsYXNzX3R5cGUsIGFyZ3MsIHZhcmFyZ3MpOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICArKypwcDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdRJzoKLSAgICAgIHsKLQljb25zdCBjaGFyICpob2xkOwotCi0JaG9sZCA9ICpwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZCAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIGZ1bmRhbWVudGFsIHR5cGUuICBJZiB0aGUgcHR5cGUgYXJndW1lbnQgaXMgbm90IE5VTEwsCi0gICAqcHR5cGUgaXMgc2V0IHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJvb2xlYW4gY29uc3RwLCB2b2xhdGlsZXAsIHVuc2lnbmVkcCwgc2lnbmVkcDsKLSAgYm9vbGVhbiBkb25lOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgY29uc3RwID0gZmFsc2U7Ci0gIHZvbGF0aWxlcCA9IGZhbHNlOwotICB1bnNpZ25lZHAgPSBmYWxzZTsKLSAgc2lnbmVkcCA9IGZhbHNlOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqcHApCi0JewotCWNhc2UgJ0MnOgotCSAgY29uc3RwID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdVJzoKLQkgIHVuc2lnbmVkcCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6Ci0JICBzaWduZWRwID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdWJzoKLQkgIHZvbGF0aWxlcCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKCoqcHApCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICBjYXNlICdfJzoKLSAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIHBlcm1pdHMgdGhpcywgYnV0IEkgZG9uJ3Qga25vdyB3aGF0IGl0IG1lYW5zLiAgKi8KLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndic6IC8qIHZvaWQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJ2b2lkIik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKG1pbmZvLT5kaGFuZGxlKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6IC8qIGxvbmcgbG9uZyAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogImxvbmcgbG9uZyBpbnQiKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDgsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2wnOiAvKiBsb25nICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAibG9uZyB1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogImxvbmcgaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0LCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdpJzogLyogaW50ICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAidW5zaWduZWQgaW50IgotCQkJCQkgICA6ICJpbnQiKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOiAvKiBzaG9ydCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gInNob3J0IHVuc2lnbmVkIGludCIKLQkJCQkJICAgOiAic2hvcnQgaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAyLCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzogLyogYm9vbCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImJvb2wiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzogLyogY2hhciAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gInVuc2lnbmVkIGNoYXIiCi0JCQkJCSAgIDogKHNpZ25lZHAKLQkJCQkJICAgICAgPyAic2lnbmVkIGNoYXIiCi0JCQkJCSAgICAgIDogImNoYXIiKSkpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAxLCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd3JzogLyogd2NoYXJfdCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgIl9fd2NoYXJfdCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAyLCB0cnVlKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6IC8qIGxvbmcgZG91YmxlICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAibG9uZyBkb3VibGUiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA4KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6IC8qIGRvdWJsZSAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImRvdWJsZSIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDgpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzogLyogZmxvYXQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJmbG9hdCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqaG9sZDsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfY2xhc3MgKG1pbmZvLCBwcCwgJmhvbGQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICBjaGFyICpuYW1lOwotCi0JICAgIG5hbWUgPSBzYXZlc3RyaW5nIChob2xkLCAqcHAgLSBob2xkKTsKLQkgICAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbmFtZSk7Ci0JICAgIGZyZWUgKG5hbWUpOwotCSAgICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICB7Ci0JCS8qIEZJWE1FOiBJdCBpcyBwcm9iYWJseSBpbmNvcnJlY3QgdG8gYXNzdW1lIHRoYXQKLSAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgdHlwZXMgYXJlIHRhZ2dlZCB0eXBlcy4gICovCi0JCSpwdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAotCQkJCQkJaG9sZCwgKnBwIC0gaG9sZCwKLQkJCQkJCURFQlVHX0tJTkRfSUxMRUdBTCk7Ci0JCWlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgICAgewotCWNoYXIgKm5hbWU7Ci0KLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlIChtaW5mbywgcHAsCi0JCQkJICAgICAgcHR5cGUgIT0gTlVMTCA/ICZuYW1lIDogTlVMTCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKHB0eXBlICE9IE5VTEwpCi0JICB7Ci0JICAgICpwdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAotCQkJCQkgICAgbmFtZSwgc3RybGVuIChuYW1lKSwKLQkJCQkJICAgIERFQlVHX0tJTkRfQ0xBU1MpOwotCSAgICBmcmVlIChuYW1lKTsKLQkgICAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAocHR5cGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29uc3RwKQotCSpwdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgICBpZiAodm9sYXRpbGVwKQotCSpwdHlwZSA9IGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZW1lbWJlciBhIHR5cGUgc3RyaW5nIGluIGEgZGVtYW5nbGVkIHN0cmluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBwLCBsZW4pCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICpwOwotICAgICBpbnQgbGVuOwotewotICBpZiAobWluZm8tPnR5cGVzdHJpbmdfY291bnQgPj0gbWluZm8tPnR5cGVzdHJpbmdfYWxsb2MpCi0gICAgewotICAgICAgbWluZm8tPnR5cGVzdHJpbmdfYWxsb2MgKz0gMTA7Ci0gICAgICBtaW5mby0+dHlwZXN0cmluZ3MgPSAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcgKikKLQkJCSAgICB4cmVhbGxvYyAobWluZm8tPnR5cGVzdHJpbmdzLAotCQkJCSAgICAgIChtaW5mby0+dHlwZXN0cmluZ19hbGxvYwotCQkJCSAgICAgICAqIHNpemVvZiAqbWluZm8tPnR5cGVzdHJpbmdzKSkpOwotICAgIH0KLQotICBtaW5mby0+dHlwZXN0cmluZ3NbbWluZm8tPnR5cGVzdHJpbmdfY291bnRdLnR5cGVzdHJpbmcgPSBwOwotICBtaW5mby0+dHlwZXN0cmluZ3NbbWluZm8tPnR5cGVzdHJpbmdfY291bnRdLmxlbiA9ICh1bnNpZ25lZCBpbnQpIGxlbjsKLSAgKyttaW5mby0+dHlwZXN0cmluZ19jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0YW1wLWguaW4gYi9iaW51dGlscy9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0cmluZ3MuMSBiL2JpbnV0aWxzL3N0cmluZ3MuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZGUyOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdHJpbmdzLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHN0cmluZ3MgMSAiMjUgSnVuZSAxOTkzIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotc3RyaW5ncyBcLSBwcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcwotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgc3RyaW5ncwotLlJCICJbXHwiIFwtYSB8IFwtXGMKLS5SQiB8IFwtXC1hbGwgIlx8XSIgCi0uUkIgIltcfCIgXC1mIHwgXC1cLXByaW50XC1maWxlXC1uYW1lICJcfF0iCi0uUkIgIltcfCIgXC1vICJcfF0iIAotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iIAotLlJCICJbXHwiIFwtdiB8IFwtXC12ZXJzaW9uICJcfF0iICAKLS5SQiAiW1x8IiBcLW4KLS5JIG1pblwtbGVuXGMKLS5SSSB8IFwtbWluXC1sZW5cYwotLlJCIHwgIlwtXC1ieXRlcz0iXGMKLS5JIG1pblwtbGVuXGMKLVwmXHxdCi0uUkIgIltcfCIgXC10Ci0uSSB7byx4LGR9XGMKLS5SQiAiW1x8IiAiXC1cLXRhcmdldD1cZkliZmRuYW1lIiAiXHxdIgotLlJCIHwgIlwtXC1yYWRpeD0iXGMKLS5JIHtvLHgsZH1cYwotXCZcfF0KLS5JIGZpbGVcYwotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLUZvciBlYWNoCi0uSSBmaWxlCi1naXZlbiwgR05VIFxjCi0uQiBzdHJpbmdzCi1wcmludHMgdGhlIHByaW50YWJsZSBjaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIGF0IGxlYXN0IDQKLWNoYXJhY3RlcnMgbG9uZyAob3IgdGhlIG51bWJlciBnaXZlbiB3aXRoIHRoZSBvcHRpb25zIGJlbG93KSBhbmQgYXJlCi1mb2xsb3dlZCBieSBhbiB1bnByaW50YWJsZSBjaGFyYWN0ZXIuICBCeSBkZWZhdWx0LCBpdCBvbmx5IHByaW50cyB0aGUKLXN0cmluZ3MgZnJvbSB0aGUgaW5pdGlhbGl6ZWQgYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7IGZvcgotb3RoZXIgdHlwZXMgb2YgZmlsZXMsIGl0IHByaW50cyB0aGUgc3RyaW5ncyBmcm9tIHRoZSB3aG9sZSBmaWxlLgotCi0uUFAKLS5CIHN0cmluZ3MKLWlzIG1haW5seSB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50cyBvZiBub24tdGV4dCBmaWxlcy4KLQotLlNIIE9QVElPTlMKLVRoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCi1lcXVpdmFsZW50LgotCi0uVFAKLS5CIFwtYQotLlRQCi0uQiBcLVwtYWxsCi0uVFAKLS5CIFwtCi1EbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsKLXNjYW4gdGhlIHdob2xlIGZpbGVzLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtcHJpbnRcLWZpbGVcLW5hbWUKLVByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4KLQotLlRQCi0uQiBcLVwtaGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBzdHJpbmdzCi1vbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi0uVFAKLS5CIFwtdgotLlRQCi0uQiBcLVwtdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyCi1vZgotLkIgc3RyaW5ncwotb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotLlRQCi0uQiAiXC1uIFxmSW1pblwtbGVuXGZQIgotLlRQCi0uQiAiXC1cZkltaW5cLWxlblxmUCIKLS5UUAotLkIgIlwtYnl0ZXM9XGZJbWluXC1sZW5cZlAiCi1QcmludCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhdCBsZWFzdAotLkkgbWluXC1sZW4KLWNoYXJhY3RlcnMgbG9uZywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA0LgotCi0uVFAKLS5CUiAiXC10ICIge28seCxkfQotLlRQCi0uQlIgIlwtXC1yYWRpeD0iIHtvLHgsZH0KLVByaW50IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4gIFRoZSBzaW5nbGUKLWNoYXJhY3RlciBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHJhZGl4IG9mIHRoZSBvZmZzZXRcKGVtb2N0YWwsCi1oZXhhZGVjaW1hbCwgb3IgZGVjaW1hbC4KLQotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLVNlZSAKLS5CUiBvYmpkdW1wICggMSApLAotZm9yIGluZm9ybWF0aW9uIG9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCi0KLS5UUAotLkIgXC1vCi1MaWtlCi0uQlIgIlwtdCBvIiAuCi0KLS5QUAotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKLS5CUiBhciAoIDEgKSwKLS5CUiBubSAoIDEgKSwKLS5CUiBvYmpkdW1wICggMSApLAotLkJSIHJhbmxpYiAoIDEgKS4KLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpbmdzLmMgYi9iaW51dGlscy9zdHJpbmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmU2YTEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RyaW5ncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qIHN0cmluZ3MgLS0gcHJpbnQgdGhlIHN0cmluZ3Mgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gZmlsZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIFVzYWdlOiBzdHJpbmdzIFtvcHRpb25zXSBmaWxlLi4uCi0KLSAgIE9wdGlvbnM6Ci0gICAtLWFsbAotICAgLWEKLSAgIC0JCURvIG5vdCBzY2FuIG9ubHkgdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBvZiBvYmplY3QgZmlsZXMuCi0KLSAgIC0tcHJpbnQtZmlsZS1uYW1lCi0gICAtZgkJUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLgotCi0gICAtLWJ5dGVzPW1pbi1sZW4KLSAgIC1uIG1pbi1sZW4KLSAgIC1taW4tbGVuCVByaW50IGdyYXBoaWMgY2hhciBzZXF1ZW5jZXMsIE1JTi1MRU4gb3IgbW9yZSBieXRlcyBsb25nLAotCQl0aGF0IGFyZSBmb2xsb3dlZCBieSBhIE5VTCBvciBhIG5ld2xpbmUuICBEZWZhdWx0IGlzIDQuCi0KLSAgIC0tcmFkaXg9e28seCxkfQotICAgLXQge28seCxkfQlQcmludCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcsCi0JCWluIG9jdGFsL2hleC9kZWNpbWFsLgotCi0gICAtbwkJTGlrZSAtdG8uICAoU29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaGF2ZSAtbyBsaWtlIC10bywKLQkJb3RoZXJzIGxpa2UgLXRkLiAgV2UgY2hvc2Ugb25lIGFyYml0cmFyaWx5LikKLQotICAgLS10YXJnZXQ9QkZETkFNRQotCQlTcGVjaWZ5IGEgbm9uLWRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi0gICAtLWhlbHAKLSAgIC1oCQlQcmludCB0aGUgdXNhZ2UgbWVzc2FnZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0gICAtLXZlcnNpb24KLSAgIC12CQlQcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlci4KLQotICAgV3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIDxybXNAZ251LmFpLm1pdC5lZHU+Ci0gICBhbmQgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgaXNhc2NpaQotI2RlZmluZSBpc2dyYXBoaWMoYykgKGlzYXNjaWkgKGMpICYmIGlzcHJpbnQgKGMpKQotI2Vsc2UKLSNkZWZpbmUgaXNncmFwaGljKGMpIChpc3ByaW50IChjKSkKLSNlbmRpZgotCi0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLS8qIFRoZSBCRkQgc2VjdGlvbiBmbGFncyB0aGF0IGlkZW50aWZ5IGFuIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIERBVEFfRkxBR1MgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykKLQotLyogUmFkaXggZm9yIHByaW50aW5nIGFkZHJlc3NlcyAobXVzdCBiZSA4LCAxMCBvciAxNikuICAqLwotc3RhdGljIGludCBhZGRyZXNzX3JhZGl4OwotCi0vKiBNaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSBvZiBncmFwaGljIGNoYXJzIHRvIHRyaWdnZXIgb3V0cHV0LiAgKi8KLXN0YXRpYyBpbnQgc3RyaW5nX21pbjsKLQotLyogdHJ1ZSBtZWFucyBwcmludCBhZGRyZXNzIHdpdGhpbiBmaWxlIGZvciBlYWNoIHN0cmluZy4gICovCi1zdGF0aWMgYm9vbGVhbiBwcmludF9hZGRyZXNzZXM7Ci0KLS8qIHRydWUgbWVhbnMgcHJpbnQgZmlsZW5hbWUgZm9yIGVhY2ggc3RyaW5nLiAgKi8KLXN0YXRpYyBib29sZWFuIHByaW50X2ZpbGVuYW1lczsKLQotLyogdHJ1ZSBtZWFucyBmb3Igb2JqZWN0IGZpbGVzIHNjYW4gb25seSB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuIGRhdGFzZWN0aW9uX29ubHk7Ci0KLS8qIHRydWUgaWYgd2UgZm91bmQgYW4gaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGluIHRoZSBjdXJyZW50IGZpbGUuICAqLwotc3RhdGljIGJvb2xlYW4gZ290X2Ffc2VjdGlvbjsKLQotLyogVGhlIEJGRCBvYmplY3QgZmlsZSBmb3JtYXQuICAqLwotc3RhdGljIGNoYXIgKnRhcmdldDsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICB7ImJ5dGVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsicmFkaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7TlVMTCwgMCwgTlVMTCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkIHN0cmluZ3NfYV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0cmluZ3Nfb2JqZWN0X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdHJpbmdzX2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZSkpOwotc3RhdGljIGludCBpbnRlZ2VyX2FyZyBQQVJBTVMgKChjaGFyICpzKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdHJpbmdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBGSUxFICpzdHJlYW0sCi0JCQkJICBmaWxlX3B0ciBhZGRyZXNzLCBpbnQgc3RvcF9wb2ludCwKLQkJCQkgIGludCBtYWdpY2NvdW50LCBjaGFyICptYWdpYykpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqc3RyZWFtLCBpbnQgc3RhdHVzKSk7Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG9wdGM7Ci0gIGludCBleGl0X3N0YXR1cyA9IDA7Ci0gIGJvb2xlYW4gZmlsZXNfZ2l2ZW4gPSBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLSAgc3RyaW5nX21pbiA9IC0xOwotICBwcmludF9hZGRyZXNzZXMgPSBmYWxzZTsKLSAgcHJpbnRfZmlsZW5hbWVzID0gZmFsc2U7Ci0gIGRhdGFzZWN0aW9uX29ubHkgPSB0cnVlOwotICB0YXJnZXQgPSBOVUxMOwotCi0gIHdoaWxlICgob3B0YyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYWZuOm90OnYwMTIzNDU2Nzg5IiwKLQkJCSAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0YykKLQl7Ci0JY2FzZSAnYSc6Ci0JICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgcHJpbnRfZmlsZW5hbWVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQotCWNhc2UgJ24nOgotCSAgc3RyaW5nX21pbiA9IGludGVnZXJfYXJnIChvcHRhcmcpOwotCSAgaWYgKHN0cmluZ19taW4gPCAxKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW52YWxpZCBudW1iZXIgJXNcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgcHJpbnRfYWRkcmVzc2VzID0gdHJ1ZTsKLQkgIGFkZHJlc3NfcmFkaXggPSA4OwotCSAgYnJlYWs7Ci0KLQljYXNlICd0JzoKLQkgIHByaW50X2FkZHJlc3NlcyA9IHRydWU7Ci0JICBpZiAob3B0YXJnWzFdICE9ICdcMCcpCi0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgc3dpdGNoIChvcHRhcmdbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDEwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIGFkZHJlc3NfcmFkaXggPSAxNjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ1QnOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICd2JzoKLQkgIHByaW50X3ZlcnNpb24gKCJzdHJpbmdzIik7Ci0JICBicmVhazsKLQotCWNhc2UgJz8nOgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHN0cmluZ19taW4gPCAwKQotCSAgICBzdHJpbmdfbWluID0gb3B0YzsKLQkgIGVsc2UKLQkgICAgc3RyaW5nX21pbiA9IHN0cmluZ19taW4gKiAxMCArIG9wdGMgLSAnMCc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfbWluIDwgMCkKLSAgICBzdHJpbmdfbWluID0gNDsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICBpZiAob3B0aW5kID49IGFyZ2MpCi0gICAgewotICAgICAgZGF0YXNlY3Rpb25fb25seSA9IGZhbHNlOwotICAgICAgcHJpbnRfc3RyaW5ncyAoIntzdGFuZGFyZCBpbnB1dH0iLCBzdGRpbiwgMCwgMCwgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBmaWxlc19naXZlbiA9IHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yICg7IG9wdGluZCA8IGFyZ2M7ICsrb3B0aW5kKQotCXsKLQkgIGlmIChzdHJjbXAgKGFyZ3Zbb3B0aW5kXSwgIi0iKSA9PSAwKQotCSAgICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlc19naXZlbiA9IHRydWU7Ci0JICAgICAgZXhpdF9zdGF0dXMgfD0gKHN0cmluZ3NfZmlsZSAoYXJndltvcHRpbmRdKSA9PSBmYWxzZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmaWxlc19naXZlbiA9PSBmYWxzZSkKLSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQotICByZXR1cm4gKGV4aXRfc3RhdHVzKTsKLX0KLQwKLS8qIFNjYW4gc2VjdGlvbiBTRUNUIG9mIHRoZSBmaWxlIEFCRkQsIHdob3NlIHByaW50YWJsZSBuYW1lIGlzIEZJTEUuCi0gICBJZiBpdCBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLAotICAgc2V0IGBnb3RfYV9zZWN0aW9uJyBhbmQgcHJpbnQgdGhlIHN0cmluZ3MgaW4gaXQuICAqLwotCi1zdGF0aWMgdm9pZAotc3RyaW5nc19hX3NlY3Rpb24gKGFiZmQsIHNlY3QsIGZpbGVhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Q7Ci0gICAgIFBUUiBmaWxlYXJnOwotewotICBjb25zdCBjaGFyICpmaWxlID0gKGNvbnN0IGNoYXIgKikgZmlsZWFyZzsKLQotICBpZiAoKHNlY3QtPmZsYWdzICYgREFUQV9GTEFHUykgPT0gREFUQV9GTEFHUykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN6ID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KTsKLSAgICAgIFBUUiBtZW0gPSB4bWFsbG9jIChzeik7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0LCBtZW0sIChmaWxlX3B0cikgMCwgc3opKQotCXsKLQkgIGdvdF9hX3NlY3Rpb24gPSB0cnVlOwotCSAgcHJpbnRfc3RyaW5ncyAoZmlsZSwgKEZJTEUgKikgTlVMTCwgc2VjdC0+ZmlsZXBvcywgMCwgc3osIG1lbSk7Ci0JfQotICAgICAgZnJlZSAobWVtKTsKLSAgICB9Ci19Ci0KLS8qIFNjYW4gYWxsIG9mIHRoZSBzZWN0aW9ucyBpbiBGSUxFLCBhbmQgcHJpbnQgdGhlIHN0cmluZ3MKLSAgIGluIHRoZSBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24ocykuCi0KLSAgIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsCi0gICBmYWxzZSBpZiBub3QgKHN1Y2ggYXMgaWYgRklMRSBpcyBub3QgYW4gb2JqZWN0IGZpbGUpLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0cmluZ3Nfb2JqZWN0X2ZpbGUgKGZpbGUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIGJmZCAqYWJmZCA9IGJmZF9vcGVuciAoZmlsZSwgdGFyZ2V0KTsKLQotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IHRoZSBmaWxlIGFzIGEgbm9uLW9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBjYWxsIGlzIG1haW5seSBmb3IgaXRzIHNpZGUgZWZmZWN0IG9mIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb25zLgotICAgICBXZSBmb2xsb3cgdGhlIHRyYWRpdGlvbmFsIGJlaGF2aW9yIG9mIGBzdHJpbmdzJyBpbiB0aGF0IHdlIGRvbid0Ci0gICAgIGNvbXBsYWluIGlmIHdlIGRvbid0IHJlY29nbml6ZSBhIGZpbGUgdG8gYmUgYW4gb2JqZWN0IGZpbGUuICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZ290X2Ffc2VjdGlvbiA9IGZhbHNlOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIHN0cmluZ3NfYV9zZWN0aW9uLCAoUFRSKSBmaWxlKTsKLQotICBpZiAoIWJmZF9jbG9zZSAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGdvdF9hX3NlY3Rpb247Ci19Ci0KLS8qIFByaW50IHRoZSBzdHJpbmdzIGluIEZJTEUuICBSZXR1cm4gdHJ1ZSBpZiBvaywgZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0cmluZ3NfZmlsZSAoZmlsZSkKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgLyogSWYgd2Ugd2VyZW4ndCB0b2xkIHRvIHNjYW4gdGhlIHdob2xlIGZpbGUsCi0gICAgIHRyeSB0byBvcGVuIGl0IGFzIGFuIG9iamVjdCBmaWxlIGFuZCBvbmx5IGxvb2sgYXQKLSAgICAgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9ucy4gIElmIHRoYXQgZmFpbHMsIGZhbGwgYmFjayB0byB0aGUKLSAgICAgd2hvbGUgZmlsZS4gICovCi0gIGlmICghZGF0YXNlY3Rpb25fb25seSB8fCAhc3RyaW5nc19vYmplY3RfZmlsZSAoZmlsZSkpCi0gICAgewotICAgICAgRklMRSAqc3RyZWFtOwotCi0gICAgICBzdHJlYW0gPSBmb3BlbiAoZmlsZSwgInJiIik7Ci0gICAgICAvKiBOb3QgYWxsIHN5c3RlbXMgcGVybWl0ICJyYiIsIHNvIHRyeSAiciIgaWYgaXQgZmFpbGVkLiAgKi8KLSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQlzdHJlYW0gPSBmb3BlbiAoZmlsZSwgInIiKTsKLSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgIHBlcnJvciAoZmlsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBwcmludF9zdHJpbmdzIChmaWxlLCBzdHJlYW0sIChmaWxlX3B0cikgMCwgMCwgMCwgKGNoYXIgKikgMCk7Ci0KLSAgICAgIGlmIChmY2xvc2UgKHN0cmVhbSkgPT0gRU9GKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgcGVycm9yIChmaWxlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRmluZCB0aGUgc3RyaW5ncyBpbiBmaWxlIEZJTEVOQU1FLCByZWFkIGZyb20gU1RSRUFNLgotICAgQXNzdW1lIHRoYXQgU1RSRUFNIGlzIHBvc2l0aW9uZWQgc28gdGhhdCB0aGUgbmV4dCBieXRlIHJlYWQKLSAgIGlzIGF0IGFkZHJlc3MgQUREUkVTUyBpbiB0aGUgZmlsZS4KLSAgIFN0b3AgcmVhZGluZyBhdCBhZGRyZXNzIFNUT1BfUE9JTlQgaW4gdGhlIGZpbGUsIGlmIG5vbnplcm8uCi0KLSAgIElmIFNUUkVBTSBpcyBOVUxMLCBkbyBub3QgcmVhZCBmcm9tIGl0LgotICAgVGhlIGNhbGxlciBjYW4gc3VwcGx5IGEgYnVmZmVyIG9mIGNoYXJhY3RlcnMKLSAgIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGRhdGEgaW4gU1RSRUFNLgotICAgTUFHSUMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQKLSAgIE1BR0lDQ09VTlQgaXMgaG93IG1hbnkgY2hhcmFjdGVycyBhcmUgaW4gaXQuCi0gICBUaG9zZSBjaGFyYWN0ZXJzIGNvbWUgYXQgYWRkcmVzcyBBRERSRVNTIGFuZCB0aGUgZGF0YSBpbiBTVFJFQU0gZm9sbG93LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N0cmluZ3MgKGZpbGVuYW1lLCBzdHJlYW0sIGFkZHJlc3MsIHN0b3BfcG9pbnQsIG1hZ2ljY291bnQsIG1hZ2ljKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBmaWxlX3B0ciBhZGRyZXNzOwotICAgICBpbnQgc3RvcF9wb2ludDsKLSAgICAgaW50IG1hZ2ljY291bnQ7Ci0gICAgIGNoYXIgKm1hZ2ljOwotewotICBjaGFyICpidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJpbmdfbWluICsgMSk7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgZmlsZV9wdHIgc3RhcnQ7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBjOwotCi0gICAgICAvKiBTZWUgaWYgdGhlIG5leHQgYHN0cmluZ19taW4nIGNoYXJzIGFyZSBhbGwgZ3JhcGhpYyBjaGFycy4gICovCi0gICAgdHJ5bGluZToKLSAgICAgIGlmIChzdG9wX3BvaW50ICYmIGFkZHJlc3MgPj0gc3RvcF9wb2ludCkKLQlicmVhazsKLSAgICAgIHN0YXJ0ID0gYWRkcmVzczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdfbWluOyBpKyspCi0JewotCSAgaWYgKG1hZ2ljY291bnQpCi0JICAgIHsKLQkgICAgICBtYWdpY2NvdW50LS07Ci0JICAgICAgYyA9ICptYWdpYysrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0JCXJldHVybjsKLQkgICAgICBjID0gZ2V0YyAoc3RyZWFtKTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXJldHVybjsKLQkgICAgfQotCSAgYWRkcmVzcysrOwotCSAgaWYgKCFpc2dyYXBoaWMgKGMpKQotCSAgICAvKiBGb3VuZCBhIG5vbi1ncmFwaGljLiAgVHJ5IGFnYWluIHN0YXJ0aW5nIHdpdGggbmV4dCBjaGFyLiAgKi8KLQkgICAgZ290byB0cnlsaW5lOwotCSAgYnVmW2ldID0gYzsKLQl9Ci0KLSAgICAgIC8qIFdlIGZvdW5kIGEgcnVuIG9mIGBzdHJpbmdfbWluJyBncmFwaGljIGNoYXJhY3RlcnMuICBQcmludCB1cAotICAgICAgICAgdG8gdGhlIG5leHQgbm9uLWdyYXBoaWMgY2hhcmFjdGVyLiAgKi8KLQotICAgICAgaWYgKHByaW50X2ZpbGVuYW1lcykKLQlwcmludGYgKCIlczogIiwgZmlsZW5hbWUpOwotICAgICAgaWYgKHByaW50X2FkZHJlc3NlcykKLQlzd2l0Y2ggKGFkZHJlc3NfcmFkaXgpCi0JICB7Ci0JICBjYXNlIDg6Ci0JICAgIHByaW50ZiAoIiU3bG8gIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMTA6Ci0JICAgIHByaW50ZiAoIiU3bGQgIiwgKGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMTY6Ci0JICAgIHByaW50ZiAoIiU3bHggIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLSAgICAgIGJ1ZltpXSA9ICdcMCc7Ci0gICAgICBmcHV0cyAoYnVmLCBzdGRvdXQpOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAobWFnaWNjb3VudCkKLQkgICAgewotCSAgICAgIG1hZ2ljY291bnQtLTsKLQkgICAgICBjID0gKm1hZ2ljKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgICAgYyA9IGdldGMgKHN0cmVhbSk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQlicmVhazsKLQkgICAgfQotCSAgYWRkcmVzcysrOwotCSAgaWYgKCEgaXNncmFwaGljIChjKSkKLQkgICAgYnJlYWs7Ci0JICBwdXRjaGFyIChjKTsKLQl9Ci0KLSAgICAgIHB1dGNoYXIgKCdcbicpOwotICAgIH0KLX0KLQwKLS8qIFBhcnNlIHN0cmluZyBTIGFzIGFuIGludGVnZXIsIHVzaW5nIGRlY2ltYWwgcmFkaXggYnkgZGVmYXVsdCwKLSAgIGJ1dCBhbGxvd2luZyBvY3RhbCBhbmQgaGV4IG51bWJlcnMgYXMgaW4gQy4gICovCi0KLXN0YXRpYyBpbnQKLWludGVnZXJfYXJnIChzKQotICAgICBjaGFyICpzOwotewotICBpbnQgdmFsdWU7Ci0gIGludCByYWRpeCA9IDEwOwotICBjaGFyICpwID0gczsKLSAgaW50IGM7Ci0KLSAgaWYgKCpwICE9ICcwJykKLSAgICByYWRpeCA9IDEwOwotICBlbHNlIGlmICgqKytwID09ICd4JykKLSAgICB7Ci0gICAgICByYWRpeCA9IDE2OwotICAgICAgcCsrOwotICAgIH0KLSAgZWxzZQotICAgIHJhZGl4ID0gODsKLQotICB2YWx1ZSA9IDA7Ci0gIHdoaWxlICgoKGMgPSAqcCsrKSA+PSAnMCcgJiYgYyA8PSAnOScpCi0JIHx8IChyYWRpeCA9PSAxNiAmJiAoYyAmIH40MCkgPj0gJ0EnICYmIChjICYgfjQwKSA8PSAnWicpKQotICAgIHsKLSAgICAgIHZhbHVlICo9IHJhZGl4OwotICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCXZhbHVlICs9IGMgLSAnMCc7Ci0gICAgICBlbHNlCi0JdmFsdWUgKz0gKGMgJiB+NDApIC0gJ0EnOwotICAgIH0KLQotICBpZiAoYyA9PSAnYicpCi0gICAgdmFsdWUgKj0gNTEyOwotICBlbHNlIGlmIChjID09ICdCJykKLSAgICB2YWx1ZSAqPSAxMDI0OwotICBlbHNlCi0gICAgcC0tOwotCi0gIGlmICgqcCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnZhbGlkIGludGVnZXIgYXJndW1lbnQgJXNcbiIpLCBwcm9ncmFtX25hbWUsIHMpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1hZm92XSBbLW4gbWluLWxlbl0gWy1taW4tbGVuXSBbLXQge28seCxkfV0gWy1dXG5cCi0gICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPW1pbi1sZW5dIFstLXJhZGl4PXtvLHgsZH1dXG5cCi0gICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLWhlbHBdIFstLXZlcnNpb25dIGZpbGUuLi5cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpcC4xIGIvYmludXRpbHMvc3RyaXAuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4ODE3ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdHJpcC4xCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBzdHJpcCAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1zdHJpcCBcLSBEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBzdHJpcAotLlJCICJbXHwiIFwtRlwgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1PXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUCAiXHxdIgotLlJCICJbXHwiIFwtUlwgXGZJc2VjdGlvbm5hbWVcZlJcIHxcIFxmQlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWVcZlAgIlx8XSIKLS5SQiAiW1x8IiBcLXNcZlJcIHxcIFxmQlwtXC1zdHJpcFwtYWxsICJcfF0iCi0uUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWcgIlx8XSIKLS5SQiAiW1x8IiBcLVwtc3RyaXBcLXVubmVlZGVkXGZSICJcfF0iCi0uUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsICJcfF0iCi0uUkIgIltcfCIgXC1YXGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtbG9jYWxzICJcfF0iCi0uUkIgIltcfCIgXC1LXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1OXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1vXCBcZklmaWxlXGZcUiAiXHxdIgotLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlcyAiXHxdIgotLlJCICJbXHwiIFwtdlxmUlwgfFwgXGZCXC1cLXZlcmJvc2UgIlx8XSIKLS5SQiAiW1x8IiBcLVZcZlJcIHxcIFxmQlwtXC12ZXJzaW9uICJcfF0iCi0uUkIgIltcfCIgXC1WXGZSXCB8XCBcZkJcLVwtaGVscCAiXHxdIgotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLQotLlNIIERFU0NSSVBUSU9OCi1HTlUKLS5CIHN0cmlwCi1kaXNjYXJkcyBhbGwgc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZXMKLS5JUiBvYmpmaWxlIC4KLVRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBtYXkgaW5jbHVkZSBhcmNoaXZlcy4KLUF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSBtdXN0IGJlIGdpdmVuLgotCi0uUAotLkIgc3RyaXAKLW1vZGlmaWVzIHRoZSBmaWxlcyBuYW1lZCBpbiBpdHMgYXJndW1lbnQsCi1yYXRoZXIgdGhhbiB3cml0aW5nIG1vZGlmaWVkIGNvcGllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CICJcLUYgXGZJYmZkbmFtZSIKLS5UUAotLkIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIKLVRyZWF0IHRoZSBvcmlnaW5hbCBcZklvYmpmaWxlXGZQIGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IFxmSWJmZG5hbWVcZlAsIGFuZCByZXdyaXRlIGl0IGluIHRoZSBzYW1lIGZvcm1hdC4KLQotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIHN0cmlwCi1hbmQgZXhpdC4KLQotLlRQCi0uQiAiXC1JIFxmSWJmZG5hbWUKLS5UUAotLkIgIlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUiCi1UcmVhdCB0aGUgb3JpZ2luYWwgXGZJb2JqZmlsZVxmUCBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Ci1jb2RlIGZvcm1hdCBcZkliZmRuYW1lXGZQLgotCi0uVFAKLS5CICJcLU8gXGZJYmZkbmFtZVxmUCIKLS5UUAotLkIgIlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lIgotUmVwbGFjZSBcZklvYmpmaWxlXGZQIHdpdGggYSBmaWxlIGluIHRoZSBvdXRwdXQgZm9ybWF0IFxmSWJmZG5hbWVcZlAuCi0KLS5UUAotLkIgIlwtUiBcZklzZWN0aW9ubmFtZVxmUCIKLS5UUAotLkIgIlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWUiCi1SZW1vdmUgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlCi10aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZQotb2JqZWN0IGZpbGUgdW51c2FibGUuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1zdHJpcFwtYWxsCi1SZW1vdmUgYWxsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1TCi0uVFAKLS5CIFwtZwotLlRQCi0uQiBcLVwtc3RyaXBcLWRlYnVnCi1SZW1vdmUgZGVidWdnaW5nIHN5bWJvbHMgb25seS4KLQotLlRQCi0uQiBcLVwtc3RyaXBcLXVubmVlZGVkCi1TdHJpcCBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0KLS5UUAotLkIgXC1OIFxmSXN5bWJvbG5hbWVcZlIKLS5UUAotLkIgXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotUmVtb3ZlIHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLCBhbmQgbWF5IGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgc3RyaXAKLW9wdGlvbnMuCi0KLS5UUAotLkIgXC1vIFxmSWZpbGVcZlIKLVB1dCB0aGUgc3RyaXBwZWQgb3V0cHV0IGluIFxmSWZpbGVcZlIsIHJhdGhlciB0aGFuIHJlcGxhY2luZyB0aGUKLWV4aXN0aW5nIGZpbGUuICBXaGVuIHRoaXMgYXJndW1lbnQgaXMgdXNlZCwgb25seSBvbmUgXGZJb2JqZmlsZVxmUgotYXJndW1lbnQgbWF5IGJlIHNwZWNpZmllZC4KLQotLlRQCi0uQiBcLXAKLS5UUAotLkIgXC1cLXByZXNlcnZlLWRhdGVzCi1QcmVzZXJ2ZSB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIGZpbGUuCi0KLS5UUAotLkIgXC14Ci0uVFAKLS5CIFwtXC1kaXNjYXJkXC1hbGwKLVJlbW92ZSBub24tZ2xvYmFsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1YCi0uVFAKLS5CIFwtXC1kaXNjYXJkXC1sb2NhbHMKLVJlbW92ZSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4KLShUaGVzZSB1c3VhbGx5IHN0YXJ0IHdpdGggYGBMJycgb3IgYGAuJycuKQotCi0uVFAKLS5CIFwtSyBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLUNvcHkgb25seSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotLlRQCi0uQiBcLU4gXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotRG8gbm90IGNvcHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGFuZCBtYXkgYmUgY29tYmluZWQgd2l0aCBzdHJpcCBvcHRpb25zCi1vdGhlciB0aGFuIFxmQlwtS1xmUi4KLQotLlRQCi0uQiBcLXYKLS5UUAotLkIgXC1cLXZlcmJvc2UKLVZlcmJvc2Ugb3V0cHV0OiBsaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWQuICBJbiB0aGUgY2FzZSBvZgotYXJjaGl2ZXMsCi0uQiAic3RyaXAgXC12IgotbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGZCc3RyaXBcZlAgYW5kIGV4aXQuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CUiBpbmZvIDsKLS5JUiAiVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzIiAsCi1Sb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2R1bXAuYyBiL2JpbnV0aWxzL3N5c2R1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyMWU4Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTAgKzAsMCBAQAotLyogU3lzcm9mZiBvYmplY3QgZm9ybWF0IGR1bXBlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPi4KLQotIFRoaXMgcHJvZ3JhbSByZWFkcyBhIFNZU1JPRkYgb2JqZWN0IGZpbGUgYW5kIHByaW50cyBpdCBpbiBhbgotIGFsbW9zdCBodW1hbiByZWFkYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgInN5c3JvZmYuaCIKLQotI2RlZmluZSBQUk9HUkFNX1ZFUlNJT04gIjEuMCIKLQotc3RhdGljIGludCBkdW1wID0gMTsKLXN0YXRpYyBpbnQgc2VnbWVudGVkX3A7Ci1zdGF0aWMgaW50IGNvZGU7Ci1zdGF0aWMgaW50IGFkZHJzaXplID0gNDsKLXN0YXRpYyBGSUxFICpmaWxlOwotCi1jaGFyICoKLWdldENIQVJTIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgaW50IG9jID0gKmlkeCAvIDg7Ci0gIGNoYXIgKnI7Ci0gIGludCBiID0gc2l6ZTsKLSAgaWYgKGIgPj0gbWF4KQotICAgIHsKLSAgICAgIHJldHVybiAiKnVuZGVmaW5lZCoiOwotICAgIH0KLQotICBpZiAoYiA9PSAwKQotICAgIHsKLSAgICAgIC8qIEdvdCB0byB3b3JrIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgZnJvbSBzZWxmICovCi0gICAgICBiID0gcHRyW29jKytdOwotICAgICAgKCppZHgpICs9IDg7Ci0gICAgfQotCi0gICppZHggKz0gYiAqIDg7Ci0gIHIgPSB4Y2FsbG9jIChiICsgMSwgMSk7Ci0gIG1lbWNweSAociwgcHRyICsgb2MsIGIpOwotICByW2JdID0gMDsKLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaCAocHRyLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLSAgaW50IGo7Ci0gIGludCBzcGFuID0gMTY7Ci0KLSAgcHJpbnRmICgiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IHNwYW4pCi0gICAgewotICAgICAgZm9yIChqID0gMDsgaiA8IHNwYW47IGorKykKLQl7Ci0JICBpZiAoaiArIGkgPCBzaXplKSAKLQkgICAgcHJpbnRmICgiJTAyeCAiLCBwdHJbaSArIGpdKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYgKCIgICAiKTsKLQl9Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBzcGFuICYmIGogKyBpIDwgc2l6ZTsgaisrKQotCXsKLQkgIGludCBjID0gcHRyW2kgKyBqXTsKLQkgIGlmIChjIDwgMzIgfHwgYyA+IDEyNykKLQkgICAgYyA9ICcuJzsKLQkgIHByaW50ZiAoIiVjIiwgYyk7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLWludAotZmlsbHVwIChwdHIpCi0gICAgIGNoYXIgKnB0cjsKLXsKLSAgaW50IHNpemU7Ci0gIGludCBzdW07Ci0gIGludCBpOwotICBzaXplID0gZ2V0YyAoZmlsZSkgLSAyOwotICBmcmVhZCAocHRyLCAxLCBzaXplLCBmaWxlKTsKLSAgc3VtID0gY29kZSArIHNpemUgKyAyOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN1bSArPSBwdHJbaV07Ci0gICAgfQotCi0gIGlmICgoc3VtICYgMHhmZikgIT0gMHhmZikKLSAgICB7Ci0gICAgICBwcmludGYgKCJTVU0gSVMgJXhcbiIsIHN1bSk7Ci0gICAgfQotICBpZiAoZHVtcCkKLSAgICBkaCAocHRyLCBzaXplKTsKLQotICByZXR1cm4gc2l6ZSAtIDE7Ci19Ci0KLWJhcnJheQotZ2V0QkFSUkFZIChwdHIsIGlkeCwgZHNpemUsIG1heCkKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IGRzaXplOwotICAgICBpbnQgbWF4OwotewotICBiYXJyYXkgcmVzOwotICBpbnQgaTsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLSAgaW50IHNpemUgPSBwdHJbYnl0ZSsrXTsKLSAgcmVzLmxlbiA9IHNpemU7Ci0gIHJlcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoc2l6ZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgcmVzLmRhdGFbaV0gPSBwdHJbYnl0ZSsrXTsKLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLWludAotZ2V0SU5UIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgaW50IG4gPSAwOwotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotCi0gIGlmIChieXRlID49IG1heCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaXplID09IC0yKQotICAgIHNpemUgPSBhZGRyc2l6ZTsKLSAgaWYgKHNpemUgPT0gLTEpCi0gICAgc2l6ZSA9IDA7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSAxOgotICAgICAgbiA9IChwdHJbYnl0ZV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbiA9IChwdHJbYnl0ZSArIDBdIDw8IDgpICsgcHRyW2J5dGUgKyAxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG4gPSAocHRyW2J5dGUgKyAwXSA8PCAyNCkgKyAocHRyW2J5dGUgKyAxXSA8PCAxNikgKyAocHRyW2J5dGUgKyAyXSA8PCA4KSArIChwdHJbYnl0ZSArIDNdKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gICppZHggKz0gc2l6ZSAqIDg7Ci0gIHJldHVybiBuOwotfQotCi1pbnQKLWdldEJJVFMgKHB0ciwgaWR4LCBzaXplLCBtYXgpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplLCBtYXg7Ci17Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0gIGludCBiaXQgPSAqaWR4ICUgODsKLQotICBpZiAoYnl0ZSA+PSBtYXgpCi0gICAgcmV0dXJuIDA7Ci0KLSAgKmlkeCArPSBzaXplOwotCi0gIHJldHVybiAocHRyW2J5dGVdID4+ICg4IC0gYml0IC0gc2l6ZSkpICYgKCgxIDw8IHNpemUpIC0gMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pdGhlYWRlciAobmFtZSwgY29kZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHByaW50ZiAoIlxuJXMgMHglMDJ4XG4iLCBuYW1lLCBjb2RlKTsKLX0KLQotc3RhdGljIGludCBpbmRlbnQ7Ci1zdGF0aWMgdm9pZAotcCAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoInwgIik7Ci0gICAgfQotICBwcmludGYgKCI+ICIpOwotfQotCi1zdGF0aWMgdm9pZAotdGFib3V0ICgpCi17Ci0gIHAgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYmFycmF5ICh5KQotICAgICBiYXJyYXkgKnk7Ci17Ci0gIGludCB4OwotICBwcmludGYgKCIlZCAoIiwgeS0+bGVuKTsKLSAgZm9yICh4ID0gMDsgeCA8IHktPmxlbjsgeCsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiglMDJ4ICVjKSIsIHktPmRhdGFbeF0sIGlzcHJpbnQgKHktPmRhdGFbeF0pID8geS0+ZGF0YVt4XSA6ICcuJyk7Ci0gICAgfQotICBwcmludGYgKCIpXG4iKTsKLX0KLQotI2RlZmluZSBTWVNST0ZGX1BSSU5UCi0jZGVmaW5lIFNZU1JPRkZfU1dBUF9JTgotCi0jaW5jbHVkZSAic3lzcm9mZi5jIgotCi0vKiAKLSAqIEZJWE1FOiBzeXNpbmZvLCB3aGljaCBnZW5lcmF0ZXMgc3lzcm9mZi5bY2hdIGZyb20gc3lzcm9mZi5pbmZvLCBjYW4ndAotICogaGFjayB0aGUgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ciBibG9jaywgd2hpY2ggaGFzIG5vIGNvbnRlbnRzLiAgU28gd2UKLSAqIGltcGxlbWVudCBvdXIgb3duIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBpbiBhbmQgcHJpbnRpbmcgb3V0IHRoZSB0cgotICogYmxvY2suCi0gKi8KLQotI2RlZmluZSBJVF90cl9DT0RFCTB4N2YKLXZvaWQKLXN5c3JvZmZfc3dhcF90cl9pbigpCi17Ci0JY2hhciByYXdbMjU1XTsKLQotCW1lbXNldChyYXcsIDAsIDI1NSk7Ci0JZmlsbHVwKHJhdyk7Ci19Ci0KLXZvaWQKLXN5c3JvZmZfcHJpbnRfdHJfb3V0KCkKLXsKLQlpdGhlYWRlcigidHIiLCBJVF90cl9DT0RFKTsKLX0KLQotc3RhdGljIGludAotZ2V0b25lICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IGMgPSBnZXRjIChmaWxlKTsKLSAgY29kZSA9IGM7Ci0KLSAgaWYgKChjICYgMHg3ZikgIT0gdHlwZSkKLSAgICB7Ci0gICAgICB1bmdldGMgKGMsIGZpbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHN3aXRjaCAoYyAmIDB4N2YpCi0gICAgewotICAgIGNhc2UgSVRfY3NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfY3MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2NzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfY3Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kbG5fQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGxuIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kbG5faW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kbG5fb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9oZF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9oZCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfaGRfaW4gKCZkdW1teSk7Ci0JYWRkcnNpemUgPSBkdW1teS5hZmw7Ci0Jc3lzcm9mZl9wcmludF9oZF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rhcl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kYXIgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rhcl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rhcl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RzeV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc3kgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RzeV9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RzeV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RmcF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZnAgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RmcF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RmcF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rzb19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc28gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rzb19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rzb19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RwdF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kcHQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RwdF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RwdF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rlbl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZW4gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rlbl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rlbl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RidF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RidF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RidF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R0eV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdHkgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R0eV9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R0eV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3VuX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3VuIGR1bW15OwotCXN5c3JvZmZfc3dhcF91bl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3VuX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfc2NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfc2MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3NjX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfc2Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9lcl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9lciBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZXJfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9lcl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2VkX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2VkIGR1bW15OwotCXN5c3JvZmZfc3dhcF9lZF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2VkX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfc2hfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfc2ggZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3NoX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfc2hfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9vYl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9vYiBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfb2JfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9vYl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3JsX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3JsIGR1bW15OwotCXN5c3JvZmZfc3dhcF9ybF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3JsX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHVfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHUgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1X2luICgmZHVtbXkpOwotCi0Jc3lzcm9mZl9wcmludF9kdV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1c19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdXMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1c19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R1c19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1bF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdWwgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1bF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R1bF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rzc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc3MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rzc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rzc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2hzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2hzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9oc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2hzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHBzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RwcyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHBzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHBzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfdHJfQ09ERToKLSAgICAgIHsKLQlzeXNyb2ZmX3N3YXBfdHJfaW4gKCk7Ci0Jc3lzcm9mZl9wcmludF90cl9vdXQgKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rkc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZHMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rkc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rkc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRmICgiR09UIEEgJXhcbiIsIGMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1vcHQgKHgpCi0gICAgIGludCB4OwotewotICByZXR1cm4gZ2V0b25lICh4KTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi11bml0X2luZm9fbGlzdCAoKQotewotICB3aGlsZSAob3B0IChJVF91bl9DT0RFKSkKLSAgICB7Ci0gICAgICBnZXRvbmUgKElUX3VzX0NPREUpOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9zY19DT0RFKSkKLQlnZXRvbmUgKElUX3NzX0NPREUpOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9lcl9DT0RFKSkKLQk7Ci0KLSAgICAgIHdoaWxlIChnZXRvbmUgKElUX2VkX0NPREUpKQotCTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamVjdF9ib2R5X2xpc3QgKCkKLXsKLSAgd2hpbGUgKGdldG9uZSAoSVRfc2hfQ09ERSkpCi0gICAgewotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfb2JfQ09ERSkpCi0JOwotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfcmxfQ09ERSkpCi0JOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1tdXN0ICh4KQotICAgICBpbnQgeDsKLXsKLSAgaWYgKCFnZXRvbmUgKHgpKQotICAgIHsKLSAgICAgIHByaW50ZiAoIldBTlRFRCAleCEhXG4iLCB4KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWIgKGksIHMpCi0gICAgIGludCBpOwotICAgICBjaGFyICpzOwotewotICBpbmRlbnQgKz0gaTsKLSAgaWYgKHMpCi0gICAgewotICAgICAgcCAoKTsKLSAgICAgIHByaW50ZiAocyk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZGVyaXZlZF90eXBlICgpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zeW1ib2xfaW5mbyAoKQotewotICB0YWIgKDEsICJTWU1CT0wgSU5GTyIpOwotICB3aGlsZSAob3B0IChJVF9kc3lfQ09ERSkpCi0gICAgewotICAgICAgaWYgKG9wdCAoSVRfZHR5X0NPREUpKQotCXsKLQkgIG11c3QgKElUX2RidF9DT0RFKTsKLQkgIGRlcml2ZWRfdHlwZSAoKTsKLQkgIG11c3QgKElUX2R0eV9DT0RFKTsKLQl9Ci0gICAgfQotICB0YWIgKC0xLCAiIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZXJpdmVkX3R5cGUgKCkKLXsKLSAgdGFiICgxLCAiREVSSVZFRCBUWVBFIik7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChvcHQgKElUX2RwcF9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZHBwX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGZwX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZnBfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kZW5fQ09ERSkpCi0JewotCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLQkgIG11c3QgKElUX2Rlbl9DT0RFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2Rlbl9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZGVuX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGRzX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZHNfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kYXJfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZHB0X0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2R1bF9DT0RFKSkKLQl7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kc2VfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZG90X0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0gIHRhYiAoLTEsICIiKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9ncmFtX3N0cnVjdHVyZSAoKQotewotICB0YWIgKDEsICJQUk9HUkFNIFNUUlVDVFVSRSIpOwotICB3aGlsZSAob3B0IChJVF9kcHNfQ09ERSkpCi0gICAgewotICAgICAgbXVzdCAoSVRfZHNvX0NPREUpOwotICAgICAgb3B0IChJVF9kc3NfQ09ERSk7Ci0gICAgICBkdW1wX3N5bWJvbF9pbmZvICgpOwotICAgICAgbXVzdCAoSVRfZHBzX0NPREUpOwotICAgIH0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jZW5kaWYKLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19saXN0ICgpCi17Ci0gIHRhYiAoMSwgIkRFQlVHIExJU1QiKTsKLQotICBtdXN0IChJVF9kdV9DT0RFKTsKLSAgb3B0IChJVF9kdXNfQ09ERSk7Ci0gIHByb2dyYW1fc3RydWN0dXJlICgpOwotICBtdXN0IChJVF9kbG5fQ09ERSk7Ci0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLW1vZHVsZSAoKQotewotICBpbnQgYyA9IDA7Ci0gIGludCBsID0gMDsKLQotICB0YWIgKDEsICJNT0RVTEUqKipcbiIpOwotCi0gIGRvCi0gICAgewotICAgICAgYyA9IGdldGMgKGZpbGUpOwotICAgICAgdW5nZXRjIChjLCBmaWxlKTsKLQotICAgICAgYyAmPSAweDdmOwotICAgIH0KLSAgd2hpbGUgKGdldG9uZSAoYykgJiYgYyAhPSBJVF90cl9DT0RFKTsKLQotI2lmIDAKLSAgbXVzdCAoSVRfY3NfQ09ERSk7Ci0gIG11c3QgKElUX2hkX0NPREUpOwotICBvcHQgKElUX2hzX0NPREUpOwotCi0gIHVuaXRfaW5mb19saXN0ICgpOwotICBvYmplY3RfYm9keV9saXN0ICgpOwotICBkZWJ1Z19saXN0ICgpOwotCi0gIG11c3QgKElUX3RyX0NPREUpOwotI2VuZGlmCi0gIHRhYiAoLTEsICIiKTsKLQotICBjID0gZ2V0YyAoZmlsZSk7Ci0gIHdoaWxlIChjICE9IEVPRikKLSAgICB7Ci0gICAgICBwcmludGYgKCIlMDJ4ICIsIGMpOwotICAgICAgbCsrOwotICAgICAgaWYgKGwgPT0gMzIpCi0JewotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGwgPSAwOwotCX0KLSAgICAgIGMgPSBnZXRjIChmaWxlKTsKLSAgICB9Ci19Ci0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIpLCBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIGludCBvcHQ7Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLSAgewotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgMCwgMH0KLSAgfTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiaFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgTlVMTCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ1YnOgotCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKLQkgIGV4aXQgKDApOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLSAgaWYgKG9wdGluZCA8IGFjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGUgPSBhdltvcHRpbmRdOwotICAgIH0KLQotICBpZiAoIWlucHV0X2ZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGZpbGUgPSBmb3BlbiAoaW5wdXRfZmlsZSwgRk9QRU5fUkIpOwotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgaW5wdXRfZmlsZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgbW9kdWxlICgpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2luZm8ueSBiL2JpbnV0aWxzL3N5c2luZm8ueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhODczNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNpbmZvLnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotJXsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1leHRlcm4gY2hhciAqd29yZDsKLWV4dGVybiBjaGFyIHdyaXRlY29kZTsKLWV4dGVybiBpbnQgbnVtYmVyOwotZXh0ZXJuIGludCB1bml0OwotY2hhciBuaWNlX25hbWVbMTAwMF07Ci1jaGFyICppdDsKLWludCBzb2ZhcjsKLWludCB3aWR0aDsKLWludCBjb2RlOwotY2hhciAqIHJlcGVhdDsKLWNoYXIgKm9sZHJlcGVhdDsKLWNoYXIgKm5hbWU7Ci1pbnQgcmRlcHRoOwotY2hhciAqbG9vcCBbXSA9IHsiIiwibiIsIm0iLCIvKkJBRCovIn07Ci1jaGFyICpuYW1lc1tdID0geyIgIiwiW25dIiwiW25dW21dIn07Ci1jaGFyICpwbmFtZXNbXT0geyIiLCIqIiwiKioifTsKLSV9Ci0KLQotJXVuaW9uIHsKLSBpbnQgaTsKLSBjaGFyICpzOwotfSAKLSV0b2tlbiBDT05ECi0ldG9rZW4gUkVQRUFUCi0ldG9rZW4gJygnICcpJwotJXRva2VuIDxzPiBUWVBFCi0ldG9rZW4gPHM+IE5BTUUKLSV0b2tlbiA8aT4gTlVNQkVSIFVOSVQKLSV0eXBlIDxpPiBhdHRyX3NpemUgCi0ldHlwZSA8cz4gYXR0cl9kZXNjIGF0dHJfaWQgYXR0cl90eXBlCi0lJQotCi10b3A6ICB7Ci0gIHN3aXRjaCAod3JpdGVjb2RlKQotICAgIHsKLSAgICBjYXNlICdpJzoKLSAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfU1dBUF9JTlxuIik7Ci0gICAgICBicmVhazsgCi0gICAgY2FzZSAncCc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX3BcbiIpOwotICAgICAgYnJlYWs7IAotICAgIGNhc2UgJ2QnOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZyc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX1NXQVBfT1VUXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgICAgcHJpbnRmKCIjaWZkZWYgU1lTUk9GRl9QUklOVFxuIik7Ci0gICAgICBwcmludGYoIiNpbmNsdWRlIDxzdGRpby5oPlxuIik7Ci0gICAgICBwcmludGYoIiNpbmNsdWRlIDxzdGRsaWIuaD5cbiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotIH0gCi1pdF9saXN0IHsKLSAgc3dpdGNoICh3cml0ZWNvZGUpIHsKLSAgY2FzZSAnaSc6Ci0gIGNhc2UgJ3AnOgotICBjYXNlICdnJzoKLSAgY2FzZSAnYyc6Ci0gICAgcHJpbnRmKCIjZW5kaWZcbiIpOwotICAgIGJyZWFrOyAKLSAgY2FzZSAnZCc6Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotICA7Ci0KLQotaXRfbGlzdDogaXQgaXRfbGlzdAotICB8Ci0gIDsKLQotaXQ6Ci0JJygnIE5BTUUgTlVNQkVSIAotICAgICAgewotCWl0ID0gJDI7IGNvZGUgPSAkMzsKLQlzd2l0Y2ggKHdyaXRlY29kZSkgCi0JICB7Ci0JICBjYXNlICdkJzoKLQkgICAgcHJpbnRmKCJcblxuXG4jZGVmaW5lIElUXyVzX0NPREUgMHgleFxuIiwgaXQsY29kZSk7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzIHsgXG4iLCBpdCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnaSc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfaW4ocHRyKVxuIiwkMik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLCBpdCk7Ci0JICAgIHByaW50Zigie1xuIik7Ci0JICAgIHByaW50ZigiY2hhciByYXdbMjU1XTtcbiIpOwotCSAgICBwcmludGYoIlx0aW50IGlkeCA9IDAgO1xuIik7Ci0JICAgIHByaW50ZigiXHRpbnQgc2l6ZTtcbiIpOwotCSAgICBwcmludGYoIm1lbXNldChyYXcsMCwyNTUpO1xuIik7CQotCSAgICBwcmludGYoIm1lbXNldChwdHIsMCxzaXplb2YoKnB0cikpO1xuIik7Ci0JICAgIHByaW50Zigic2l6ZSA9IGZpbGx1cChyYXcpO1xuIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnZyc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfb3V0KGZpbGUscHRyKVxuIiwkMik7Ci0JICAgIHByaW50ZigiRklMRSAqIGZpbGU7XG4iKTsKLQkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsIGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJcdGNoYXIgcmF3WzI1NV07XG4iKTsKLQkgICAgcHJpbnRmKCJcdGludCBpZHggPSAxNiA7XG4iKTsKLQkgICAgcHJpbnRmKCJcdG1lbXNldCAocmF3LCAwLCAyNTUpO1xuIik7Ci0JICAgIHByaW50ZigiXHRjb2RlID0gSVRfJXNfQ09ERTtcbiIsIGl0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdvJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfc3dhcF8lc19vdXQoYWJmZCxwdHIpXG4iLCQyKTsKLQkgICAgcHJpbnRmKCJiZmQgKiBhYmZkO1xuIik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJpbnQgaWR4ID0gMCA7XG4iKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdjJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfcHJpbnRfJXNfb3V0KHB0cilcbiIsJDIpOwotCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyAqcHRyO1xuIiwgaXQpOwotCSAgICBwcmludGYoIntcbiIpOwotCSAgICBwcmludGYoIml0aGVhZGVyKFwiJXNcIiwgSVRfJXNfQ09ERSk7XG4iLCQyLCQyKTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgJ3QnOgotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgfSAKLQlpdF9maWVsZF9saXN0IAotJyknCi17Ci0gIHN3aXRjaCAod3JpdGVjb2RlKSB7Ci0gIGNhc2UgJ2QnOiAKLSAgICBwcmludGYoIn07XG4iKTsKLSAgICBicmVhazsKLSAgY2FzZSAnZyc6Ci0gICAgcHJpbnRmKCJcdGNoZWNrc3VtKGZpbGUscmF3LCBpZHgsIElUXyVzX0NPREUpO1xuIiwgaXQpOwotICAgIAotICBjYXNlICdpJzoKLQotICBjYXNlICdvJzoKLSAgY2FzZSAnYyc6Ci0gICAgcHJpbnRmKCJ9XG4iKTsKLSAgfQotfQotOwotCi0KLQotaXRfZmllbGRfbGlzdDoKLQkJaXRfZmllbGQgaXRfZmllbGRfbGlzdAotCXwJY29uZF9pdF9maWVsZCBpdF9maWVsZF9saXN0CQotCXwJcmVwZWF0X2l0X2ZpZWxkIGl0X2ZpZWxkX2xpc3QKLQl8Ci0JOwotCi1yZXBlYXRfaXRfZmllbGQ6ICcoJyBSRVBFQVQgTkFNRQotCXsKLQkgIHJkZXB0aCsrOwotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIGlmIChyZGVwdGg9PTEpCi0JICAgICAgcHJpbnRmKCJcdHByaW50ZihcInJlcGVhdCAlJWRcXG5cIiwgJXMpO1xuIiwkMyk7Ci0JICAgICAgaWYgKHJkZXB0aD09MikKLQkgICAgICBwcmludGYoIlx0cHJpbnRmKFwicmVwZWF0ICUlZFxcblwiLCAlc1tuXSk7XG4iLCQzKTsKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdvJzoKLQotCSAgICAgIGlmIChyZGVwdGg9PTEpIAotCQl7Ci0JICAgICAgcHJpbnRmKCJcdHsgaW50IG47IGZvciAobiA9IDA7IG4gPCAlczsgbisrKSB7XG4iLCAgICAkMyk7Ci0JICAgIH0KLQkgICAgICBpZiAocmRlcHRoID09IDIpIHsKLQkgICAgICBwcmludGYoIlx0eyBpbnQgbTsgZm9yIChtID0gMDsgbSA8ICVzW25dOyBtKyspIHtcbiIsICAgICQzKTsKLQkgICAgfQkJCi0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBvbGRyZXBlYXQgPSByZXBlYXQ7Ci0gICAgICAgICByZXBlYXQgPSAkMzsKLQl9Ci0KLQkgaXRfZmllbGRfbGlzdCAnKScgCi0KLQl7Ci0JICByZXBlYXQgPSBvbGRyZXBlYXQ7Ci0JICBvbGRyZXBlYXQgPTA7Ci0JICByZGVwdGgtLTsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgcHJpbnRmKCJcdH19XG4iKTsKLQl9Ci0JfQotICAgICAgIDsKLQotCi1jb25kX2l0X2ZpZWxkOiAnKCcgQ09ORCBOQU1FCi0JewotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIHByaW50ZigiXHRpZiAoJXMpIHtcbiIsICQzKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotCSBpdF9maWVsZF9saXN0ICcpJyAKLQl7Ci0JICBzd2l0Y2ggKHdyaXRlY29kZSkKLQkgICAgewotCSAgICBjYXNlICdpJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ28nOgotCSAgICBjYXNlICdjJzoKLQkgIHByaW50ZigiXHR9XG4iKTsKLQl9Ci0JfQotICAgICAgIDsKLQotaXRfZmllbGQ6Ci0JJygnIGF0dHJfZGVzYyAnKCcgYXR0cl90eXBlIGF0dHJfc2l6ZSAnKScgYXR0cl9pZCAKLQl7bmFtZSA9ICQ3OyB9IAotCWVudW1zICcpJwotCXsKLQkgIGNoYXIgKmRlc2MgPSAkMjsKLQkgIGNoYXIgKnR5cGUgPSAkNDsKLQkgIGludCBzaXplID0gJDU7Ci0JICBjaGFyICppZCA9ICQ3OwotY2hhciAqcCA9IG5hbWVzW3JkZXB0aF07Ci1jaGFyICpwdHIgPSBwbmFtZXNbcmRlcHRoXTsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdnJzoKLQkgICAgICBpZiAoc2l6ZSAlIDgpIAotCQl7Ci0JCSAgCi0JCSAgcHJpbnRmKCJcdHdyaXRlQklUUyhwdHItPiVzJXMscmF3LCZpZHgsJWQpO1xuIiwKLQkJCSBpZCwKLQkJCSBuYW1lc1tyZGVwdGhdLCBzaXplKTsKLQotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHR3cml0ZSVzKHB0ci0+JXMlcyxyYXcsJmlkeCwlZCxmaWxlKTtcbiIsCi0JCSAgICAgICB0eXBlLAotCQkgICAgICAgaWQsCi0JCSAgICAgICBuYW1lc1tyZGVwdGhdLHNpemUvOCk7Ci0JCX0KLQkgICAgICBicmVhazsJICAgICAgCi0JICAgIGNhc2UgJ2knOgotCSAgICAgIHsKLQotCQlpZiAocmRlcHRoID49IDEpCi0KLQkJICB7Ci0JCSAgICBwcmludGYoImlmICghcHRyLT4lcykgcHRyLT4lcyA9ICglcyopeGNhbGxvYyglcywgc2l6ZW9mKHB0ci0+JXNbMF0pKTtcbiIsIAotCQkJICAgaWQsIAotCQkJICAgaWQsCi0JCQkgICB0eXBlLAotCQkJICAgcmVwZWF0LAotCQkJICAgaWQpOwotCQkgIH0KLQotCQlpZiAocmRlcHRoID09IDIpCi0JCSAgewotCQkgICAgcHJpbnRmKCJpZiAoIXB0ci0+JXNbbl0pIHB0ci0+JXNbbl0gPSAoJXMqKil4Y2FsbG9jKCVzW25dLCBzaXplb2YocHRyLT4lc1tuXVswXSkpO1xuIiwgCi0JCQkgICBpZCwgCi0JCQkgICBpZCwKLQkJCSAgIHR5cGUsCi0JCQkgICByZXBlYXQsCi0JCQkgICBpZCk7Ci0JCSAgfQotCi0JICAgICAgfQotCi0JICAgICAgaWYgKHNpemUgJSA4KSAKLQkJewotCQkgIHByaW50ZigiXHRwdHItPiVzJXMgPSBnZXRCSVRTKHJhdywmaWR4LCAlZCxzaXplKTtcbiIsCi0JCQkgaWQsCi0JCQkgbmFtZXNbcmRlcHRoXSwgCi0JCQkgc2l6ZSk7Ci0JCX0KLQkgICAgICBlbHNlIHsKLQkJcHJpbnRmKCJcdHB0ci0+JXMlcyA9IGdldCVzKHJhdywmaWR4LCAlZCxzaXplKTtcbiIsCi0JCSAgICAgICBpZCwKLQkJICAgICAgIG5hbWVzW3JkZXB0aF0sCi0JCSAgICAgICB0eXBlLAotCQkgICAgICAgc2l6ZS84KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdvJzoKLQkgICAgICBwcmludGYoIlx0cHV0JXMocmF3LCVkLCVkLCZpZHgscHRyLT4lcyVzKTtcbiIsIHR5cGUsc2l6ZS84LHNpemUlOCxpZCxuYW1lc1tyZGVwdGhdKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgaWYgKHJlcGVhdCkgCi0JCXByaW50ZigiXHQvKiByZXBlYXQgJXMgKi9cbiIsIHJlcGVhdCk7Ci0KLQkJICBpZiAodHlwZVswXSA9PSAnSScpIHsKLQkJICBwcmludGYoIlx0aW50ICVzJXM7IFx0LyogJXMgKi9cbiIscHRyLGlkLCBkZXNjKTsKLQkJfQotCQkgIGVsc2UgaWYgKHR5cGVbMF0gPT0nQycpIHsKLQkJICBwcmludGYoIlx0Y2hhciAlcyolcztcdCAvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHRiYXJyYXkgJXMlcztcdCAvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCSAgICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSAnYyc6Ci0JICAgICAgcHJpbnRmKCJ0YWJvdXQoKTtcbiIpOwotCQkgIHByaW50ZigiXHRwcmludGYoXCIvKiUtMzBzKi8gcHRyLT4lcyA9IFwiKTtcbiIsIGRlc2MsIGlkKTsKLQotCQkgIGlmICh0eXBlWzBdID09ICdJJykKLQkJICBwcmludGYoIlx0cHJpbnRmKFwiJSVkXFxuXCIscHRyLT4lcyVzKTtcbiIsIGlkLHApOwotCQkgIGVsc2UgICBpZiAodHlwZVswXSA9PSAnQycpCi0JCSAgcHJpbnRmKCJcdHByaW50ZihcIiUlc1xcblwiLHB0ci0+JXMlcyk7XG4iLCBpZCxwKTsKLQotCQkgIGVsc2UgICBpZiAodHlwZVswXSA9PSAnQicpIAotCQkgICAgewotCQkgIHByaW50ZigiXHRwYmFycmF5KCZwdHItPiVzJXMpO1xuIiwgaWQscCk7Ci0JCX0KLQkgICAgICBlbHNlIGFib3J0KCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQl9Ci0KLQk7Ci0KLQotYXR0cl90eXBlOgkKLQkgVFlQRSB7ICQkID0gJDE7IH0KLSAJfCAgeyAkJCA9ICJJTlQiO30KLQk7Ci0KLWF0dHJfZGVzYzogCi0JJygnIE5BTUUgJyknCQotCXsgJCQgPSAkMjsgfQotCTsKLQotYXR0cl9zaXplOgotCSBOVU1CRVIgVU5JVCAKLQl7ICQkID0gJDEgKiAkMjsgfQotCTsKLQotCi1hdHRyX2lkOgotCQknKCcgTkFNRSAnKScJeyAkJCA9ICQyOyB9Ci0JfAl7ICQkID0gImR1bW15Ijt9Ci0JOwkKLQkKLWVudW1zOiAKLQl8ICcoJyBlbnVtX2xpc3QgJyknIDsKLQotZW51bV9saXN0OgotCXwKLQllbnVtX2xpc3QgJygnIE5BTUUgTkFNRSAnKScgeyAKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdkJzoKLQkgICAgICBwcmludGYoIiNkZWZpbmUgJXMgJXNcbiIsICQzLCQ0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYyc6Ci0JCXByaW50ZigiaWYgKHB0ci0+JXMlcyA9PSAlcykgeyB0YWJvdXQoKTsgcHJpbnRmKFwiJXNcXG5cIik7fVxuIiwgbmFtZSwgbmFtZXNbcmRlcHRoXSwkNCwkMyk7Ci0JICAgIH0KLQl9Ci0KLQk7Ci0KLQotCi0lJQotLyogZm91ciBtb2RlcwotCi0gICAtZCB3cml0ZSBzdHJ1Y3R1cmUgZGVmaW50aW9ucyBmb3Igc3lzcm9mZiBpbiBob3N0IGZvcm1hdAotICAgLWkgd3JpdGUgZnVuY3Rpb25zIHRvIHN3YXAgaW50byBzeXNyb2ZmIGZvcm1hdCBpbgotICAgLW8gd3JpdGUgZnVuY3Rpb25zIHRvIHN3YXAgaW50byBzeXNyb2ZmIGZvcm1hdCBvdXQKLSAgIC1jIHdyaXRlIGNvZGUgdG8gcHJpbnQgaW5mbyBpbiBodW1hbiBmb3JtICovCi0KLWludCB5eWRlYnVnOwotY2hhciB3cml0ZWNvZGU7Ci0KLWludCAKLW1haW4oYWMsYXYpCi1pbnQgYWM7Ci1jaGFyICoqYXY7Ci17Ci0gIHl5ZGVidWc9MDsKLSAgaWYgKGFjID4gMSkKLSAgICB3cml0ZWNvZGUgPSBhdlsxXVsxXTsKLWlmICh3cml0ZWNvZGUgPT0gJ2QnKQotICB7Ci0gICAgcHJpbnRmKCJ0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBsZW47IH0gYmFycmF5OyBcbiIpOwotICAgIHByaW50ZigidHlwZWRlZiAgaW50IElOVDtcbiIpOwotICAgIHByaW50ZigidHlwZWRlZiAgY2hhciAqIENIQVJTO1xuIik7Ci0KLSAgfQotICB5eXBhcnNlKCk7Ci1yZXR1cm4gMDsKLX0KLQotaW50Ci15eWVycm9yKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGZwcmludGYoc3RkZXJyLCAiJXNcbiIgLCBzKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNsZXgubCBiL2JpbnV0aWxzL3N5c2xleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk0ODQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N5c2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotJXsKLSNpbmNsdWRlICJzeXNpbmZvLmgiCi1jaGFyICp3b3JkOwotaW50IG51bWJlcjsKLWludCB1bml0OwotCi0jaWZuZGVmIHl5d3JhcAotc3RhdGljIGludCB5eXdyYXAgKCkgeyByZXR1cm4gMTsgfQotI2VuZGlmCi0lfQotJSUKLSIoIiB7IHJldHVybiAnKCc7fQotIikiIHsgcmV0dXJuICcpJzt9Ci0iWyIgeyByZXR1cm4gJ1snO30KLSJdIiB7IHJldHVybiAnXSc7fQotIiAiIHsgOyB9Ci0iOyIuKiB7IDsgfSAKLSJcdCIgeyA7IH0KLSJcbiIgeyA7IH0KLSJcIiJbXlwiXSoiXCIiIHsKLXl5bHZhbC5zID0gbWFsbG9jKHN0cmxlbiAoeXl0ZXh0KSk7Ci1zdHJjcHkoeXlsdmFsLnMsIHl5dGV4dCsxKTsKLXl5bHZhbC5zW3N0cmxlbih5eWx2YWwucyktMV0gPSAwOwotICAgICAgICByZXR1cm4gTkFNRTsKLQl9Ci0KLTB4WzAtOWEtZl0rIHsKLSAgICAgICAgeXlsdmFsLmkgPSBzdHJ0b2woeXl0ZXh0LDAsMTYpOwotCXJldHVybiAgTlVNQkVSOwotCX0KLQotWzAtOV0rIHsKLSAgICAgICAgeXlsdmFsLmkgPSBhdG9pKHl5dGV4dCk7Ci0JcmV0dXJuICBOVU1CRVI7Ci0JfQotCi0KLSJiaXRzIiB7IHl5bHZhbC5pID0xIDtyZXR1cm4gVU5JVDt9Ci0iYml0IiB7IHl5bHZhbC5pID0gMTsgcmV0dXJuIFVOSVQ7fQotImJ5dGVzIiB7IHl5bHZhbC5pPSA4OyByZXR1cm4gVU5JVDt9Ci0iYnl0ZSIgeyB5eWx2YWwuaSA9IDg7IHJldHVybiBVTklUO30KLQotImludCIgeyB5eWx2YWwucyA9ICJJTlQiOyByZXR1cm4gVFlQRTt9Ci0iYmFycmF5IiB7IHl5bHZhbC5zID0gIkJBUlJBWSI7IHJldHVybiBUWVBFO30KLSJjaGFycyIgeyB5eWx2YWwucyA9ICJDSEFSUyI7IHJldHVybiBUWVBFO30KLSJ2YXJpYWJsZSIgeyB5eWx2YWwuaSA9IDA7IHJldHVybiBOVU1CRVI7fQotImNvdW50ZWQiIHsgeXlsdmFsLmkgPSAtNDsgcmV0dXJuIE5VTUJFUjt9Ci0iYWRkcnNpemUiIHsgeXlsdmFsLmkgPSAtMjsgcmV0dXJuIE5VTUJFUjsgfQotInNlZ3NpemUiIHsgeXlsdmFsLmkgPSAtMTsgcmV0dXJuIE5VTUJFUjsgfQotImNvbmQiIHsgcmV0dXJuIENPTkQ7fQotInJlcGVhdCIgeyByZXR1cm4gUkVQRUFUO30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c3JvZmYuaW5mbyBiL2JpbnV0aWxzL3N5c3JvZmYuaW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmMDAxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNyb2ZmLmluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotKCJjcyIgMHgwCi0gKCgic2l6ZSIpICgxIGJ5dGUpICgic2l6ZSIpKQotCi0gKCgiaGQiKSAoMSBieXRlKSAoImhkIikpCi0gKCgiaHMiKSAoMSBieXRlKSAoImhzIikpCi0gKCgidW4iKSAoMSBieXRlKSAoInVuIikpCi0gKCgidXMiKSAoMSBieXRlKSAoInVzIikpCi0KLSAoKCJzYyIpICgxIGJ5dGUpICgic2MiKSkKLSAoKCJzcyIpICgxIGJ5dGUpICgic3MiKSkKLSAoKCJlciIpICgxIGJ5dGUpICgiZXIiKSkKLSAoKCJlZCIpICgxIGJ5dGUpICgiZWQiKSkKLQotICgoInNoIikgKDEgYnl0ZSkgKCJzaCIpKQotICgoIm9iIikgKDEgYnl0ZSkgKCJvYiIpKQotICgoInJsIikgKDEgYnl0ZSkgKCJybCIpKQotICgoImR1IikgKDEgYnl0ZSkgKCJkdSIpKQotCi0gKCgiZHBzIikgKDEgYnl0ZSkgKCJkcHMiKSkKLSAoKCJkc3kiKSAoMSBieXRlKSAoImRzeSIpKQotICgoImR0eSIpICgxIGJ5dGUpICgiZHR5IikpCi0gKCgiZGxuIikgKDEgYnl0ZSkgKCJkbG4iKSkKLQotICgoImRzbyIpICgxIGJ5dGUpICgiZHNvIikpCi0gKCgiZHVzIikgKDEgYnl0ZSkgKCJkdXMiKSkKLSAoKCJkc3MiKSAoMSBieXRlKSAoImRzcyIpKQotICgoImRidCIpICgxIGJ5dGUpICgiZGJ0IikpCi0KLSAoKCJkcHAiKSAoMSBieXRlKSAoImRwcCIpKQotICgoImRmcCIpICgxIGJ5dGUpICgiZGZwIikpCi0gKCgiZGVuIikgKDEgYnl0ZSkgKCJkZW4iKSkKLSAoKCJkZHMiKSAoMSBieXRlKSAoImRkcyIpKQotCi0gKCgiZGFyIikgKDEgYnl0ZSkgKCJkYXIiKSkKLSAoKCJkcHQiKSAoMSBieXRlKSAoImRwdCIpKQotICgoImR1bCIpICgxIGJ5dGUpICgiZHVsIikpCi0gKCgiZHNlIikgKDEgYnl0ZSkgKCJkc2UiKSkKLQotICgoImRvdCIpICgxIGJ5dGUpICgiZG90IikpKQotCi0KLSgiaGQiIDB4MDQKLSAoKCJtb2R1bGUgdHlwZSIpICg0IGJpdHMpICgibXQiKQotICAoKCJNVFlQRV9BQlNfTE0iIAkiMCIpCi0gICAoIk1UWVBFX1JFTF9MTSIgCSIxIikKLSAgICgiTVRZUEVfT01TX09SX0xNUyIgCSIyIikKLSAgICgiTVRZUEVfVU5TUEVDIiAJIjB4ZiIpKSkKLSAoKCJzcGFyZSIpKDQgYml0cykgKCJzcGFyZTEiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikoIGNoYXJzIDEyIGJ5dGVzKSggImNkIikpCi0gKCgibnVtYmVyIG9mIHVuaXRzIikgKDIgYnl0ZXMpICgibnUiKSkKLSAoKCJjb2RlIikgKDEgYnl0ZSkgKCJjb2RlIikpCi0gKCgidmVyc2lvbiIpIChjaGFycyA0IGJ5dGVzKSAoInZlciIpKQotICgoImFkZHJlc3MgdXBkYXRlIikgKDEgYnl0ZSkgKCJhdSIpKQotICgoInNlZ21lbnQgaWRlbnRpZmllciIpICgxIGJpdCkgKCJzaSIpKQotICgoImFkZHJlc3MgZmllbGQgbGVuZ3RoIikgKDQgYml0cykgKCJhZmwiKSkKLSAoKCJzcGFyZSIpKDMgYml0cykgKCJzcGFyZTIiKSkKLSAoKCJzcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IikgKDEgYnl0ZSkgKCJzcGNzeiIpKQotICgoInNlZ21lbnQgc2l6ZSIpICAJKDEgYnl0ZSkgKCJzZWdzeiIpKQotICgoInNlZ21lbnQgc2hpZnQiKSAJKDEgYnl0ZSkgKCJzZWdzaCIpKQotICgoImVudHJ5IHBvaW50IikgCSgxIGJ5dGUpICgiZXAiKSkKLSAoY29uZCAicHRyLT5lcCIKLSAgICAgICAoY29uZCAicHRyLT5tdCAhPSBNVFlQRV9BQlNfTE0iIAotCSAgICAgKCgidW5pdCBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInVhbiIpKQotCSAgICAgKCgic2VjdGlvbiBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInNhIikpKQotICAgICAgIChjb25kICJzZWdtZW50ZWRfcCIKLQkgICAgICgoInNlZ21lbnQgYWRkcmVzcyIpIChzZWdzaXplIGJ5dGVzKSAoInNhZCIpKSkKLSAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gKCgib3MgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJvcyIpKQotICgoInN5cyBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInN5cyIpKQotICgoIm1vZHVsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1uIikpCi0gKCgiY3B1IikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImNwdSIpKSkKLQotCi0oImhzIiAweDA1Ci0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCi0oInVuIiAweDA2Ci0gKCgiZm9ybWF0IikgKDIgYml0cykgKCJmb3JtYXQiKQotICAoKCJGT1JNQVRfTE0iICIwIikKLSAgICgiRk9STUFUX09NIiAiMSIpCi0gICAoIkZPUk1BVF9PTVNfT1JfTE1TIiAiMiIpKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCi0gKCgibnVtYmVyIG9mIHNlY3Rpb25zIikgKDIgYnl0ZXMpICgibnNlY3Rpb25zIikpCi0gKCgibnVtYmVyIG9mIGV4dGVybmFsIHJlZnMiKSAoMiBieXRlcykgKCJuZXh0cmVmcyIpKQotICgoIm51bWJlciBvZiBleHRlcm5hbCBkZWZzIikgKDIgYnl0ZXMpICgibmV4dGRlZnMiKSkKLSAoKCJ1bml0IG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpCi0gKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgidGNkIikpCi0gKCgibGlua2VyIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJsaW5rZXIiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikgKGNoYXJzIDEyIGJ5dGVzKSAoImxjZCIpKSkKLQotCi0oInVzIiAweDA3Ci0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKQotCi0KLSgic2MiIDB4MDgKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoKCJzZWdtZW50IGFkZHJlc3MiKSAoc2Vnc2l6ZSBieXRlcykgKCJzZWdhZGQiKSkKLSAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKLSAoKCJsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgibGVuZ3RoIikpCi0gKCgiYWxpZ25tZW50IikgKGFkZHJzaXplIGJ5dGVzKSAoImFsaWduIikpCi0gKCgiY29udGVudHMiKSAoNCBiaXRzKSAoImNvbnRlbnRzIikKLSAgKCgiQ09OVEVOVFNfQ09ERSIgIjAiKQotICAgKCJDT05URU5UU19EQVRBIiAiMSIpCi0gICAoIkNPTlRFTlRTX1NUQUNLIiAiMiIpCi0gICAoIkNPTlRFTlRTX0RVTU1ZIiAiMyIpCi0gICAoIkNPTlRFTlRTX1NQRUNJQUwiICI0IikKLSAgICgiQ09OVEVOVFNfTk9OU1BFQyIgIjB4ZiIpKSkKLSAoKCJjb25jYXQiKSAoNCBiaXRzKSAoImNvbmNhdCIpCi0gICgoIkNPTkNBVF9TSU1QTEUiICIwIikKLSAgICgiQ09OQ0FUX1NIQVJFREMiICIxIikKLSAgICgiQ09OQ0FUX0RVTU1ZIiAiMiIpCi0gICAoIkNPTkNBVF9HUk9VUCIgIjMiKQotICAgKCJDT05DQVRfU0hBUkVEIiAiNCIpCi0gICAoIkNPTkNBVF9QUklWQVRFIiAiNSIpCi0gICAoIkNPTkNBVF9VTlNQRUMiICIweGYiKSkpCi0gKCgicmVhZCIpICgyIGJpdHMpICgicmVhZCIpKQotICgoIndyaXRlIikgKDIgYml0cykgKCJ3cml0ZSIpKQotICgoImV4ZWMiKSAoMiBiaXRzKSAoImV4ZWMiKSkKLSAoKCJpbml0aWFsaXplZCIpICgyIGJpdHMpICgiaW5pdCIpKQotICgoIm1vZGUiKSAoMiBiaXRzKSAoIm1vZGUiKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCi0gKCgibmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoIm5hbWUiKSkpCi0KLQotKCJzcyIgMHgwOQotICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLQkKLSgiZXIiIDB4MGMKLSAoKCJzeW1ib2wgdHlwZSIpICgyIGJpdHMpICgidHlwZSIpCi0gICgoIkVSX0VOVFJZIiAiMCIpCi0gICAoIkVSX0RBVEEiICIxIikKLSAgICgiRVJfTk9UREVGIiAiMiIpCi0gICAoIkVSX05PVFNQRUMiICIzIikpKQotICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZSIpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibmFtZSIpKSkKLQkKLQotKCJlZCIgMHgxNAotICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpCi0gKCgic3ltYm9sIHR5cGUiKSAoMyBiaXRzKSAoInR5cGUiKQotICAoKCJFRF9UWVBFX0VOVFJZIiAiMCIpCi0gICAoIkVEX1RZUEVfREFUQSIgIjEiKQotICAgKCJFRF9UWVBFX0NPTlNUIiAiMiIpCi0gICAoIkVEX1RZUEVfTk9UU1BFQyIgIjciKSkpCi0gKCgic3BhcmUiKSAoNSBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgInB0ci0+dHlwZT09RURfVFlQRV9FTlRSWSB8fCBwdHItPnR5cGU9PUVEX1RZUEVfREFUQSIKLSAgICAgICAoKCJzeW1ib2wgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpKQotIChjb25kICJwdHItPnR5cGU9PUVEX1RZUEVfQ09OU1QiCi0gICAgICAgKCgiY29uc3RhbnQgdmFsdWUiKSAoYWRkcnNpemUgYnl0ZXMpICgiY29uc3RhbnQiKSkpCi0gKCgic3ltYm9sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpKQotCi0KLSgic2giIDB4MWEKLSAoKCJ1bml0IGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQotICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpKQotCi0KLSgib2IiIDB4MWMKLSAoKCJzdGFydGluZyBhZGRyZXNzIGZsYWciKSAoMSBiaXQpICgic2FmIikpCi0gKCgiY29tcHJlc3Npb24gZmxhZyIpICgxIGJpdCkgKCJjcGYiKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAicHRyLT5zYWYiCi0gICAgICAgKCAoInN0YXJ0aW5nIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKSkKLSAoY29uZCAicHRyLT5jcGYiCi0gICAgICAgKCgiY29tcCByZXBzIikgKGFkZHJzaXplIGJ5dGVzKSAoImNvbXByZXBzIikpKQotICgoImRhdGEiKSAoYmFycmF5IGNvdW50ZWQgYnl0ZSkgKCJkYXRhIikpKQotCQotCi0oInJsIiAweDIwCi0gKCgiYm91bmRhcnkgb2YgcmVsb2NhdGVhYmxlIGFyZWEiKSAoNCBiaXRzKSAoImJvdW5kYXJ5IikpCi0gKCgiYWRkcmVzcyBwb2xhcml0eSIpICgxIGJpdCkgKCJhcG9sIikpCi0gKCgic2VnbWVudCBudW1iZXIiKSAoMSBiaXQpICgic2VnbWVudCIpKQotICgoInNpZ24gb2YgcmVsb2NhdGlvbiIpICgxIGJpdCkgKCJzaWduIikpCi0gKCgiY2hlY2sgcmFuZ2UiKSAoMSBiaXQpICgiY2hlY2siKSkKLSAoKCJyZWxvYyBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKLQotICgoImJpdCBsb2MiKSAoMSBieXRlKSAoImJpdGxvYyIpKQotICgoImZpZWxkIGxlbmd0aCIpICgxIGJ5dGUpICgiZmxlbiIpKQotICgoImJjb3VudCIpICgxIGJ5dGUpICgiYmNvdW50IikpCi0gKCgib3BlcmF0b3IiKSAoMSBieXRlKSAoIm9wIikKLSAgKCgiT1BfUkVMT0NfQUREUiIgIjEiKQotICAgKCJPUF9TRUNfUkVGIiAiMCIpCi0gICAoIk9QX0VYVF9SRUYiICIyIikpKQotIChjb25kICJwdHItPm9wID09IE9QX0VYVF9SRUYiCi0gICAgICAgKCgic3ltYm9sIG51bWJlciIpICgyIGJ5dGVzKSAoInN5bW4iKSkJKQotCQotIChjb25kICJwdHItPm9wID09IE9QX1NFQ19SRUYiCi0gICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzZWNuIikpCi0gICAgICAgKCgiY29uc3Qgb3Bjb2RlIikgKDEgYnl0ZSkgKCJjb3Bjb2RlX2lzXzMiKSkKLSAgICAgICAoKCJhZGRlbmQgbGVuZ3RoIikgKDEgYnl0ZSkgKCJhbGVuZ3RoX2lzXzQiKSkKLSAgICAgICAoKCJhZGRlbmQiKSAoNCBieXRlKSAoImFkZGVuZCIpKQotICAgICAgICgoInBsdXMgb3Bjb2RlIikgKDEgYnl0ZSkgKCJhb3Bjb2RlX2lzXzB4MjAiKSkpCi0KLSAoY29uZCAicHRyLT5vcCA9PSBPUF9SRUxPQ19BRERSIgotICAgICAgICgoImR1bm5vIikgKDIgYnl0ZXMpICgiZHVubm8iKSkpCi0KLSAoKCJlbmQiKSAgKDEgYnl0ZSkgKCJlbmQiKSkpCi0JCi0KLSgiZHUiIDB4MzAKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQotICgoIm9wdGltaXplZCIpICgxIGJpdCkgKCJvcHRpbWl6ZWQiKSkKLSAoKCJzdGFja2ZybXQiKSAoMiBiaXRzKSAoInN0YWNrZnJtdCIpKQotICgoInNwYXJlIikgKDMgYml0cykgKCJzcGFyZSIpKQotICgoInVuaXQgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQotICgoInNlY3Rpb25zIikgKDIgYnl0ZXMpICgic2VjdGlvbnMiKSkKLSAocmVwZWF0ICJwdHItPnNlY3Rpb25zIgotCSAoKCJzZWN0aW9uIGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgic2FuIikpCi0JICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKQotCSAoKCJzZWN0aW9uIGxlbmd0aCIpIChhZGRyc2l6ZSBieXRlcykgKCJsZW5ndGgiKSkpCi0gKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgiZGF0ZSIpKSkKLQotCi0oImRzeSIgMHgzNAotICgoInN5bWJvbCB0eXBlIikgKDcgYml0cykgKCJ0eXBlIikKLSAgKCgiU1RZUEVfVkFSIiAiMCIpCi0gICAoIlNUWVBFX0xBQiIgIjEiKQotICAgKCJTVFlQRV9QUk9DIiAiMiIpCi0gICAoIlNUWVBFX0ZVTkMiICIzIikKLSAgICgiU1RZUEVfVFlQRSIgIjQiKQotICAgKCJTVFlQRV9DT05TVCIgIjUiKQotICAgKCJTVFlQRV9FTlRSWSIgIjYiKQotICAgKCJTVFlQRV9NRU1CRVIiICI3IikKLSAgICgiU1RZUEVfRU5VTSIgIjgiKQotICAgKCJTVFlQRV9UQUciICI5IikKLSAgICgiU1RZUEVfUEFDS0FHRSIgIjEwIikKLSAgICgiU1RZUEVfR0VORVJJQyIgIjExIikKLSAgICgiU1RZUEVfVEFTSyIgIjEyIikKLSAgICgiU1RZUEVfRVhDRVBUSU9OIiAiMTMiKQotICAgKCJTVFlQRV9QQVJBTUVURVIiICIxNCIpCi0gICAoIlNUWVBFX0VRVUFURSIgIjE1IikKLSAgICgiU1RZUEVfVU5TUEVDIiAiMHg3ZiIpKSkKLSAoKCJhc3NpZ25tZW50IGluZm8iKSAoMSBiaXQpICgiYXNzaWduIikpCi0gKCgic3ltYm9sIGlkIikgKDIgYnl0ZXMpICgic251bWJlciIpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInNuYW1lIikpCi0gKCgibmVzdGluZyBsZXZlbCIpICgyIGJ5dGVzKSAoIm5lc3RpbmciKSkKLSAoY29uZCAicHRyLT5hc3NpZ24iCi0gICAgICAgKCgiYXNzaWdubWVudCB0eXBlIikgKDEgYnl0ZSkgICgiYWluZm8iKQotCSgoIkFJTkZPX1JFRyIgIjEiKQotCSAoIkFJTkZPX1NUQVRJQ19FWFRfREVGIiAiMiIpCi0JICgiQUlORk9fU1RBVElDX0VYVF9SRUYiICIzIikKLQkgKCJBSU5GT19TVEFUSUNfSU5UIiAiNCIpCi0JICgiQUlORk9fU1RBVElDX0NPTSIgIjUiKQotCSAoIkFJTkZPX0FVVE8iICI2IikKLQkgKCJBSU5GT19DT05TVCIgIjciKQotCSAoIkFJTkZPX1VOU1BFQyIgIjB4ZmYiKSkpCi0gICAgICAgKCgiZGF0YSBsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgiZGxlbmd0aCIpKQotICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19FWFRfREVGCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19JTlQKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0NPTSIKLQkgICAgICgoInNlY3Rpb24gbnVtYmVyIikgICgyIGJ5dGVzKSAoInNlY3Rpb24iKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0lOVAotICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfQ09NCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX0FVVE8iCi0JICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fUkVHIgotCSAgICAgKCgicmVnaXN0ZXIgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJyZWciKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLQkgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfRVhUX1JFRiIKLQkgICAgICgoImV4dGVybmFsIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiZW5hbWUiKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fQ09OU1QiCi0JICAgICAoKCJjb25zdGFudCIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJjb25zdGFudCIpKSkpCi0gKGNvbmQgInB0ci0+dHlwZSA9PSBTVFlQRV9NRU1CRVIiCi0gICAgICAgKCgiYXNzaWdubWVudCB1bml0IikgKDEgYml0KSAoImJpdHVuaXQiKSkKLSAgICAgICAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUyIikpCi0gICAgICAgKCgiZmllbGQgbGVuZ3RoIikgKGFkZHJzaXplIGJ5dGVzKSAoImZpZWxkX2xlbiIpKQotICAgICAgICgoImZpZWxkIG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9vZmYiKSkKLSAgICAgICAoY29uZCAicHRyLT5iaXR1bml0IgotCSAgICAgKCgiYml0IG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9iaXRvZmYiKSkpKQotIChjb25kICJwdHItPnR5cGU9PSBTVFlQRV9FTlVNIgotICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgiZXZhbGxlbiIpKQotICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgiZXZhbHVlIikpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfQ09OU1QiCi0gICAgICAgKCgidmFsdWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiY3ZhbHVlIikpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfRVFVQVRFIgotICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgicXZhbGxlbiIpKQotICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgicXZhbHVlIikpCi0gICAgICAgKCgiYmFzaWMgdHlwZSIpICgxIGJ5dGUpICgiYnR5cGUiKSkKLSAgICAgICAoKCJzaXplIGluZm9ybWF0aW9uIikgKGFkZHJzaXplIGJ5dGVzKSAoInNpemVpbmZvIikpCi0gICAgICAgKCgic2lnbiIpICgyIGJpdHMpICgic2lnbiIpKQotICAgICAgICgoImZsb2F0aW5nIHBvaW50IHR5cGUiKSAoNiBiaXRzKSAoImZsdF90eXBlIikpKQotICgoInNvdXJjZSBmaWxlIG51bWJlciIpICgyIGJ5dGVzKSAoInNmbiIpKQotICgoInNvdXJjZSBsaW5lIG51bWJlciIpICgyIGJ5dGVzKSAoInNsbiIpKQotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfVEFHIgotICAgICAgICgoIm1hZ2ljIikgKDEgYnl0ZSkgKCJtYWdpYyIpKSkpCi0KLSAKLQotKCJkdWwiIDB4NTIKLSAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQotICgoIm1heCBzcGFyZSIpICg3IGJpdHMpICgibWF4c3BhcmUiKSkKLSAoY29uZCAicHRyLT5tYXhfdmFyaWFibGUgPT0gMCIKLSAgICAgICAoKCJtYXhpbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1heCIpKQotICAgICAgICgoIm1heCBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1heG1vZGUiKSkpCi0KLSAoKCJtaW4gZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1pbl92YXJpYWJsZSIpKQotICgoIm1pbiBzcGFyZSIpICg3IGJpdHMpICgibWluc3BhcmUiKSkKLSAoY29uZCAicHRyLT5taW5fdmFyaWFibGUgPT0gMCIKLSAgICAgICAoKCJtaW5pbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1pbiIpKQotICAgICAgICgoIm1pbiBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1pbm1vZGUiKSkpKQotCi0KLSgiZHR5IiAweDM2Ci0gKCgiZW5kIGZsYWciKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLQotKCJkYnQiIDB4NDQKLSAoKCJiYXNpYyB0eXBlIikgKDEgYnl0ZSkgKCJidHlwZSIpCi0gICgoIkJUWVBFX1ZPSUQiICIwIikKLSAgICgiQlRZUEVfVU5ERUYiICIxIikKLSAgICgiQlRZUEVfQ0hBUiIgIjIiKQotICAgKCJCVFlQRV9JTlQiICIzIikKLSAgICgiQlRZUEVfRkxPQVQiICI0IikKLSAgICgiQlRZUEVfQklUIiAiNSIpCi0gICAoIkJUWVBFX1NUUklORyIgIjYiKQotICAgKCJCVFlQRV9ERUNJTUFMIiAiNyIpCi0gICAoIkJUWVBFX0VOVU0iICI4IikKLSAgICgiQlRZUEVfU1RSVUNUIiAiOSIpCi0gICAoIkJUWVBFX1RZUEUiICIxMCIpCi0gICAoIkJUWVBFX1RBRyIgIjExIikKLSAgICgiQlRZUEVfVU5TUEVDIiAiMHhmZiIpKSkKLSAoKCJzaXplIGluZm8iKSAoYWRkcnNpemUgYnl0ZXMpICgiYml0c2l6ZSIpKQotICgoInNpZ24iKSAoMiBiaXRzKSAoInNpZ24iKQotICAoKCJTSUdOX1NJR05FRCIgIjAiKQotICAgKCJTSUdOX1VOU0lHTkVEIiAiMSIpCi0gICAoIlNJR05fVU5TUEVDIiAiMyIpKSkKLSAoKCJmbG9hdGluZyBwb2ludCB0eXBlIikgKDYgYml0cykgKCJmcHR5cGUiKQotICAoKCJGUFRZUEVfU0lOR0xFIiAiMCIpCi0gICAoIkZQVFlQRV9ET1VCTEUiICIxIikKLSAgICgiRlBUWVBFX0VYVEVOREVEIiAiMiIpCi0gICAoIkZQVFlQRV9OT1RTUEVDIiAiMHgzZiIpKSkKLSAoY29uZCAicHRyLT5idHlwZT09QlRZUEVfVEFHIHx8IHB0ci0+YnR5cGUgPT0gQlRZUEVfVFlQRSIKLSAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJzaWQiKSkpCi0gKCgibmVnb3RpYXRpb24iKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLSgiZGFyIiAweDRlCi0gKCgiZWxlbWVudCBsZW5ndGgiICkgKGFkZHJzaXplIGJ5dGVzKSAoImxlbmd0aCIpKQotICgoImRpbXMiKSAoMSBieXRlKSAoImRpbXMiKSkKLSAocmVwZWF0ICJwdHItPmRpbXMiCi0JICgoInZhcmlhYmxlIGZsYWciKSAoMSBiaXQpICgidmFyaWFibGUiKQotCSAgKCgiVkFSSUFCTEVfRklYRUQiICIwIikKLQkgICAoIlZBUklBQkxFX1ZBUklBQkxFIiAiMSIpKSkKLQotCSAoKCJzdWJzY3JpcHQgdHlwZSIpICgxIGJpdCkgKCJzdWJ0eXBlIikKLQkgICgoIlNVQl9JTlRFR0VSIiAiMCIpCi0JICAgKCJTVUJfVFlQRSIgICAgIjEiKSkpCi0KLQkgKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlIikpCi0KLQkgKGNvbmQgInB0ci0+c3VidHlwZVtuXSA9PSBTVUJfVFlQRSIKLQkgICAgICAgKCgic3ViIHN5bWJvbCBpZCIpICgyIGJ5dGVzKSAoInNpZCIpKSkKLQotCSAoY29uZCAicHRyLT5zdWJ0eXBlW25dID09IFNVQl9JTlRFR0VSIgotCSAgICAgICAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQotCSAgICAgICAoKCJtYXggc3BhcmUiKSAoNyBiaXRzKSAoIm1heHNwYXJlIikpCi0JICAgICAgIDs7IEZJWE1FOiBuZXh0IGZpZWxkIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBtYXhfdmFyaWFibGUsCi0JICAgICAgICgoIm1heGltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWF4IikpCi0KLQkgICAgICAgKCgibWluIGRlY2xhcmF0aW9uIHR5cGUgZmxhZyIpICgxIGJpdCkgKCJtaW5fdmFyaWFibGUiKSkKLQkgICAgICAgKCgibWluIHNwYXJlIikgKDcgYml0cykgKCJtaW5zcGFyZSIpKQotCSAgICAgICA7OyBGSVhNRTogbmV4dCBmaWVsZCBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gbWluX3ZhcmlhYmxlCi0JICAgICAgICgoIm1pbmltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWluIikpKSkKLSAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCSAgICAgICAKLSgiZHNvIiAweDNhCi0gKCgiZnVuY3Rpb24gbmFtZSIpICgyIGJ5dGVzKSAoInNpZCIpKQotICgoInNwIHVwZGF0ZSBjb3VudCIpICg0IGJ5dGVzKSAoInNwdXBkYXRlcyIpKQotIChyZXBlYXQgInB0ci0+c3B1cGRhdGVzIgotCSAoKCJ1cGRhdGUgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpCi0JICgoIm9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJvZmZzZXQiKSkpKQotCi0oImRsbiIgMHgzOAotICgoIm51bWJlciBvZiBsaW5lcyIpICgyIGJ5dGVzKSAoIm5sbiIpKQotIChyZXBlYXQgInB0ci0+bmxuIgotCSAoKCJzb3VyY2UgZmlsZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZm4iKSkKLQkgKCgic291cmNlIGxpbmUgbnVtYmVyIikgKDIgYnl0ZXMpICgic2xuIikpCi0JICgoInNlY3Rpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgic2VjdGlvbiIpKQotCSAoKCJmcm9tIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiZnJvbV9hZGRyZXNzIikpCi0JICgoInRvIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgidG9fYWRkcmVzcyIpKQotCSAoKCJjYWxsIGNvdW50IikgKDIgYnl0ZXMpICgiY2MiKSkKLQkgKQotICgoIm5lZyIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLSAKLSgiZHBwIiAweDQ2Ci0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgicGFyYW1zIikgKDEgYnl0ZSkgKCJwYXJhbXMiKSkKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZW4iIDB4NGEKLSAoKCJzdGFydC9lbmQiKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZnAiIDB4NDgKLSAoKCJzdGFydC9lbmQgZmxhZyIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm51bWJlciBvZiBwYXJhbWV0ZXJzIikgKDEgYnl0ZSkgKCJucGFyYW1zIikpCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZGRzIiAweDRjCi0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZHB0IiAweDUwCi0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotICgoImR1bm5vIikgKDEgYnl0ZSkgKCJkdW5ubyIpKSkKLQotKCJkc2UiIDB4NTQKLSAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpCi0gKCgiZHVubm8iKSAoMSBieXRlKSAoImR1bm5vIikpKQotCi0oImRvdCIgMHg1NgotICgoInVua25vd24iKSAoMSBieXRlKSAoInVua25vd24iKSkpCi07IEZJWE1FOiB1bmtub3duIGZpZWxkIHNob3VsZCBiZSByZXBlYXRlZCBzeW1ib2wgbnVtYmVyPwotCi0KLSgiZHNzIiAweDQyCi0gKCgidHlwZSIpICgxIGJ5dGUpICgidHlwZSIpKQotICgoImV4dGVybmFsL2ludGVybmFsIikgKDEgYml0KSAoImludGVybmFsIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmludGVybmFsIgotICAgICAgICggICgicGFja2FnZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicGFja2FnZSIpKSkKLSAoY29uZCAicHRyLT5pbnRlcm5hbCIKLSAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJpZCIpKSkKLSAoKCJyZWNvcmQgdHlwZSIpICgyIGJ5dGVzKSAoInJlY29yZCIpKQotICgoInJ1bGVzIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicnVsZXMiKSkKLSAoKCJudW1iZXIgb2Ygc3ltYm9scyIpICgyIGJ5dGVzKSAoIm5zeW1ib2xzIikpCi0gKCgidW5rbm93biIgKSAoMiBieXRlcykgKCJmaXhtZSIpKSkKLSAgICAgCi0oInBzcyIgMHg0MAotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoImVmbiIpKQotICgoIm51bWJlciBvZiBzb3VyY2UgZmlsZXMiKSAoMiBieXRlcykgKCJucyIpKQotIChyZXBlYXQgInB0ci0+bnMiCi0JICgoImRpcmVjdG9yeSByZWZlcmVuY2UgYml0IikgKDEgYml0KSAoImRyYiIpKQotCSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLQkgKCgiY29tcGxldGVkIGZpbGUgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoImZuYW1lIikpCi0JIChjb25kICJwdHItPmRyYltuXSIgCi0JICAgICAgICgoImRpcmVjdG9yeSBhcHBlcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgiZGFuIikpKSkKLSAKLSAoKCJudW1iZXIgb2YgZGlyZWN0b3JpZXMiKSAoMiBieXRlcykgKCJuZGlyIikpCi0gKHJlcGVhdCAicHRyLT5uZGlyIgotCSAoKCJkaXJlY3RvcnkgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJkbmFtZSIpKSkpCi0KLQotOyBGSVhNRTogdGhlIHRyIGJsb2NrIGhhcyBubyBjb250ZW50cy4gc3lzaW5mbywgZXRjLiBhcmVuJ3QgcHJlcGFyZWQgCi07IHRvIGRlYWwgd2l0aCB0aGF0LgotOyAoInRyIiAweDdmKQotCi0KLSgiZHVzIiAweDQwCi0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgiZWZuIikpCi0gKCgibnVtYmVyIG9mIHNvdXJjZSBmaWxlcyIpICgyIGJ5dGVzKSAoIm5zIikpCi0gKHJlcGVhdCAicHRyLT5ucyIKLQkgKCgiZGlyZWN0b3J5IHJlZmVyZW5jZSBiaXQiKSAoMSBiaXQpICgiZHJiIikpCi0JICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotCSAoKCJjb21wbGV0ZWQgZmlsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgiZm5hbWUiKSkKLQkgKGNvbmQgInB0ci0+ZHJiW25dIiAKLQkgICAgICAgKCgiZGlyZWN0b3J5IGFwcGVyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJkYW4iKSkpKQotICgoIm51bWJlciBvZiBkaXJlY3RvcmllcyIpICgyIGJ5dGVzKSAoIm5kaXIiKSkKLSAocmVwZWF0ICJwdHItPm5kaXIiCi0JICgoImRpcmVjdG9yeSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImRuYW1lIikpKSkKLQotCi0oImRwcyIgMHgzMgotICgoInN0YXJ0L2VuZCBmbGFnIikgKDEgYml0KSAoImVuZCIpKQotICgoImJsb2NrIHR5cGUiKSAoNyBiaXRzKSAoInR5cGUiKQotICAoKCJCTE9DS19UWVBFX0NPTVBVTklUIiAiMCIpCi0gICAoIkJMT0NLX1RZUEVfUFJPQ0VEVVJFIiAiMiIpCi0gICAoIkJMT0NLX1RZUEVfRlVOQ1RJT04iICIzIikKLSAgICgiQkxPQ0tfVFlQRV9CTE9DSyIgIjQiKQotICAgKCJCTE9DS19UWVBFX0JBU0lDIiAiOSIpKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm9wdGltaXphdGlvbiIpICgxIGJ5dGUpICgib3B0IikpCi0gICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzYW4iKSkKLSAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkKLSAgICAgICAoKCJibG9jayBzaXplIikgKGFkZHJzaXplIGJ5dGVzKSAoImJsb2NrX3NpemUiKSkKLSAgICAgICAoKCJuZXN0aW5nIikgKDEgYnl0ZSkgKCJuZXN0aW5nIikpCi0gICAgICAgKGNvbmQgInB0ci0+dHlwZSA9PSBCTE9DS19UWVBFX1BST0NFRFVSRSAKLQkgICAgfHwgcHRyLT50eXBlID09IEJMT0NLX1RZUEVfRlVOQ1RJT04iCi0JICAgICAoKCJyZXR1cm4gYWRkcmVzcyIpICgxIGJpdCkgKCJyZXRhZGRyIikpCi0JICAgICAoKCJpbnRlcnJ1cHQgZnVuY3Rpb24gZmxhZyIpICgxIGJpdCkgKCJpbnRyZmxhZyIpKQotCSAgICAgKCgic3RhY2sgdXBkYXRlIGZsYWciKSAoMSBiaXQpICgic3RhY2tmbGFnIikpCi0JICAgICAoKCJpbnRyYSBwYWdlIEpNUCIpICgxIGJpdCkgKCJpbnRycGFnZWptcCIpKQotCSAgICAgKCgic3BhcmUiKSAoNCBiaXRzKSAoInNwYXJlIikpKQotICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQotCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvYmludXRpbHMvdGVzdHN1aXRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5ZjJlYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLTE5OTktMDYtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogQWRkIGZyMzAgYW5kIE1Db3JlIHRvIGV4cGVjdGVkIGNwdXMKLQlsaXN0LiAKLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYucjogRG8gbm90IGFzc3VtZSBhIGZpeGVkIG51bWJlciBvZiBzcGFjZXMKLQlpbiB0aGUgb3V0cHV0LgotCi0xOTk5LTA2LTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi53aTogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBvdXRwdXQuCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5oOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IG91dHB1dC4KLQotV2VkIEp1biAgOSAxMTo1OToyMiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogVGlnaHRlbiByZWdleHAgdG8gbWF0Y2ggYG9iamR1bXAgLWknCi0Jb3V0cHV0IHRvIGF2b2lkIG1hc3NpdmUgZXhwb25lbnRpYWwgYmVoYXZpb3VyLgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYuaDogVXBkYXRlIGZvciBjaGFuZ2VzIG9mIDE5OTktMDQtMDguCi0KLTE5OTktMDMtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLndpOiBSZW1vdmUgRlIzMCBzcGVjaWZpYyBjb21wb25udHMuCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5zOiBSZW1vdmUgUkVMQSBzcGVjaWZpYyBjb21wb25lbnRzLgotCi0xOTk5LTAyLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5zOiBEbyBub3QgYXNzdW1lIHNlY3Rpb24gYWxpZ25tZW50IGlzIDQuCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBEbyBub3QgYXNzdW1lIHJlbGEncyBhcmUgYmVpbmcgdXNlZC4gCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5leHA6IGRpc2FibGUgdGVzdHMgZm9yIG5vbiBFTEYgYmFzZWQKLQl0YXJnZXRzLgotCi0xOTk5LTAyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi53aTogQW1lbmQgdG8gbWF0Y2ggbmV3IHJlYWRlbGYgb3V0cHV0LgotCSogYmludXRpbHMtYWxsL3JlYWRlbGYucjogRG8gbm90IGFzc3VtZSB0aGF0IFJFTEFzIHdpbGwgYmUgdXNlZC4KLQotMTk5OS0wMS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBBZGQgZGVmaW5pdGlvbnMgb2YgUkVBREVMRiBhbmQgUkVBREVMRkZMQUdTLgotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5leHA6IE5ldyBmaWxlOiBSZWFkZWxmIHRlc3RzCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5oOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLWgnCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5zOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLVMnCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5zczogTmV3IGZpbGU6IEV4cGVjdGVkIHJlc3VsdHMgZm9yICdyZWFkZWxmIC1zJwotCSogYmludXRpbHMtYWxsL3JlYWRlbGYucjogTmV3IGZpbGU6IEV4cGVjdGVkIHJlc3VsdHMgZm9yICdyZWFkZWxmIC1yJwotCSogYmludXRpbHMtYWxsL3JlYWRlbGYud2k6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtd2knCi0KLVdlZCBEZWMgIDkgMTk6MTE6MzkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHAgKGNvcHlfZXhlY3V0YWJsZSk6IEV4cGVjdCBjb21wYXJpc29uCi0JZmFpbHVyZSBmb3IgbWlwcyotKi1lbGYuCi0KLUZyaSBPY3QgMTYgMjI6NTc6MTIgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IGZpeCAibm8gc3ltYm9scyIgbWVzc2FnZS4KLQotVHVlIEp1bCAyOCAxNToxNDowNCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogS2VlcCAibWFpbiIgYW5kICJfbWFpbiIgZm9yIHN0cmlwIHdpdGgKLQlzYXZpbmcgc3ltYm9sIHRlc3RzLiAgTG9vayBmb3IgZWl0aGVyICJtYWluIiBvciAiX21haW4iIGluIHRoZSBvdXRwdXQKLQlmaWxlLiAgRml4IHRlc3QgZm9yICJubyBzeW1ib2xzIiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLTE5OTgtMDctMjIgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IFBvbGlzaCBvdXRwdXQgYWJvdXQgZmFpbCBmb3Igb2JqY29weQotCShzaW1wbGUgY29weSksIHN0cmlwIHdpdGgvd2l0aG91dCBzYXZpbmcgYSBzeW1ib2wgZm9yIG9iamVjdCBmaWxlCi0JYW5kIGV4ZWN1dGFibGUuCi0KLVdlZCBKdWwgIDEgMTY6Mjc6NDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBUk0gc2ltcGxlIG9iamNvcHkgbm93IHBhc3Nlcy4KLQotV2VkIEp1biAyNCAwOToyMDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IExvb2sgZm9yICcuZGF0YScgcmF0aGVyIHRoYW4gJ2RhdGEnCi0Jd2hlbiBwYXJzaW5nIG91dHB1dCBvZiBvYmpkdW1wIC1oLgotCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBMb29rIGZvciAnLmRhdGEnIHJhdGhlciB0aGFuICdkYXRhJyB3aGVuCi0JcGFyc2luZyBvdXRwdXQgb2Ygc2l6ZSAtQS4KLQotMTk5OC0wNy0yMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuZXhwOiBUd28gbmV3IHRlc3RzIC0gc3RyaXAgb2JqZWN0IGZpbGUgd2l0aCBzYXZpbmcgYQotCXN5bWJvbCBhbmQgc3RyaXAgZXhlY3V0YWJsZSBmaWxlIHdpdGggc2F2aW5nIGEgc3ltYm9sLgotCi1GcmkgTWF5IDI5IDE0OjUwOjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEb24ndCB4ZmFpbCB0aGUgc2ltcGxlIG9iamNvcHkgdGVzdAotCXdoZW4gY3Jvc3MgY29tcGlsaW5nLgotCi1UaHUgTm92ICA2IDE0OjMyOjM3IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cDogVGVtcG9yYXJ5IGRlZmluaXRpb24gb2YgdGFyZ2V0X2Fzc2VtYmxlIGFuZAotIAlkZWZhdWx0X3RhcmdldF9hc3NlbWJsZSBzbyB0aGF0IHRlc3RpbmcgY2FuIHdvcmsgd2l0aCBvbGRlcgotIAlkZWphZ251IHZlcnNpb25zLgotCi1XZWQgU2VwIDI0IDEyOjA5OjE1IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHAoc3RyaXBfZXhlY3V0YWJsZSk6IE1ha2UgYSBuZXcgY29weSBvZgotIAl0aGUgZXhlY3V0YWJsZSBiZWluZyB0ZXN0ZWQuCi0KLU1vbiBTZXAgMTUgMjE6MjU6MjAgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ29tcGlsZSB0aGUgZXhlY3V0YWJsZXMgdG8gYmUgdGVzdGVkCi0gCW9uIHRoZSB0YXJnZXQgd2l0aCBhIHN0YXR1cyB3cmFwcGVyIChhcyBuZWNlc3NhcnkpLgotCi0JKiBiaW51dGlscy1hbGwvYXIuZXhwOiBJZiB0ZXN0aW5nIG9uIGEgcmVtb3RlIGhvc3QsIGRvbid0IGJvdGhlcgotIAlsb29raW5nIG9uIHRoZSBsb2NhbCBob3N0IGZvciB0aGUgcHJvZ3JhbSBiZWluZyB0ZXN0ZWQuIFVzZSB0aGUKLSAJY29ycmVjdCBmaWxlbmFtZXMgb24gdGhlIHJlbW90ZSBob3N0LgotCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBEaXR0by4KLQotCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBEaXR0by4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBEaXR0by4KLSAJKGNwdXNfZXhwZWN0ZWQpOiBBZGQgdGhlIHRhcmdldCBDUFUgdG8gdGhlIHJlZ2V4cCBvZiBDUFVzIHRvIGJlCi0gCWV4cGVjdGVkLCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLgotCi1UaHUgQXVnIDI4IDA5OjU3OjI3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cCAoY3B1c19leHBlY3RlZCk6IEFkZCBhcmMuCi0KLVR1ZSBBdWcgIDUgMDA6MDM6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IExvb2sgZm9yIG5tLW5ldyBhbmQgc3RyaXAtbmV3LgotCi1UdWUgSnVuICAzIDE3OjEyOjU0IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbW92ZSBleHBlY3RfYmVmb3JlIHN0YXRlbWVudC4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEb24ndCB1c2UgZ2xvYmFsIGV4ZWNfb3V0cHV0IHZhcmlhYmxlOwotIAl0aGUgb3V0cHV0IGlzIHJldHVybmVkIGZyb20gcmVtb3RlX2xvYWQgaW5zdGVhZC4KLQotTW9uIE1heSAxMiAyMjoxNDoyMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwKHN0cmlwX3Rlc3QpOiBUZXN0cyB0aGF0Ci0JZmFpbCB0byBjb21waWxlIGFyZSB1bnRlc3RlZCwgbm90IHVucmVzb2x2ZWQuCi0JKGNvcHlfc2V0dXApOiBEaXR0by4KLQotCSogbGliL3V0aWxzLWxpYi5leHAoZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSk6IENhbGwKLQl0YXJnZXRfYXNzZW1ibGUgaW5zdGVhZCBvZiB0YXJnZXRfY29tcGlsZS4KLQotV2VkIEFwciAzMCAyMDozNzo1MSAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgdG8gc3VwcG9ydCBtdWx0aWxpYiBhbmQgcmVtb3RlIGhvc3RlZCB0ZXN0aW5nLCBhbG9uZyB3aXRoCi0gCWdlbmVyYWwgY2xlYW51cHMgYW5kIHNpbXBsaWZpY2F0aW9ucy4KLQotCSogbGliL3V0aWxzLWxpYi5leHAoYmludXRpbF92ZXJzaW9uKTogVXNlIHJlbW90ZV9leGVjLgotCShkZWZhdWx0X2JpbnV0aWxzX3J1bik6IERpdHRvLgotCShkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogUmVtb3ZlIGZpcnN0IGFyZ3VtZW50OyBjYWxsCi0gCXRhcmdldF9jb21waWxlIHRvIGFjdHVhbGx5IGRvIHRoZSBhc3NlbWJseS4KLQkoZGVmYXVsdF9iaW51dGlsc19jb21waWxlLGRlZmF1bHRfYmludXRpbHNfcmVtb3ZlLHBydW5lX3dhcm5pbmdzKToKLSAJRGVsZXRlLgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbW92ZSBBUyBhbmQgQVNGTEFHUy4KLQkoYmludXRpbHNfY29tcGlsZSxiaW51dGlsc19yZW1vdmUpOiBEZWxldGUuCi0JKGJpbnV0aWxzX2Fzc2VtYmxlKTogUmVtb3ZlIGZpcnN0IGFyZ3VtZW50LgotCi0JKiBiaW51dGlscy1hbGwvYXIuZXhwOiBTZWUgaWYgd2UncmUgcnVubmluZyB0aGUgdGVzdHMgb24KLQlhIHJlbW90ZSBob3N0LCBhbmQgZG93bmxvYWQvdXBsb2FkIGZpbGVzIGFzIGFwcHJvcHJpYXRlLgotCVJlcGxhY2UgY2FsbHMgdG8gYmludXRpbHNfcmVtb3ZlIHdpdGggcmVtb3RlX2ZpbGUuIFJlcGxhY2UKLQljYWxscyB0byBiaW51dGlsc19jb21waWxlIHdpdGggdGFyZ2V0X2NvbXBpbGUuIFJlbW92ZSBpbml0aWFsCi0JYXJndW1lbnQgdG8gYmludXRpbHNfYXNzZW1ibGUuIFVzZSByZW1vdGVfbG9hZCB0byBleGVjdXRlCi0JcHJvZ3JhbXMgb24gdGhlIHRhcmdldC4KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IERpdHRvLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiAgRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6ICBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogRGl0dG8uCi0KLU1vbiBBcHIgMTQgMTI6MzY6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvYXIuZXhwIChsb25nX2ZpbGVuYW1lcyk6IENoZWNrIGZvciBhIGZpbGUgc3lzdGVtCi0Jd2l0aCBhIDE0IGNoYXJhY3RlciBmaWxlIG5hbWUgbGVuZ3RoIGxpbWl0LgotCi1UdWUgQXByICAxIDA5OjUyOjE1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBIYW5kbGUgZDEwdi4KLQotRnJpIEZlYiAgNyAxNjo0NTozNCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL2FyLmV4cDogVXNlIHBydW5lX3dhcm5pbmdzIGluc3RlYWQgb2YKLQlwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRGl0dG8uCi0KLVdlZCBKYW4gMjkgMDA6MTY6NDMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IFVzZSAvIGJldHdlZW4gJHNyY2RpciBhbmQgJHN1YmRpci4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IERpdHRvLgotCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwOiBEaXR0by4KLQkKLQotV2VkIE9jdCAxNiAyMjo1Nzo1OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogQWRkIG1uMTAyMDAgYW5kIG1uMTAzMDAgdG8gZXhwZWN0ZWQKLQljcHVzIGxpc3QuCi0KLVR1ZSBPY3QgIDEgMTU6MDY6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoYmludXRpbF92ZXJzaW9uKTogRml4IGZvciBjdXJyZW50IHZlcnNpb24KLQlwcmludGluZy4KLQotU3VuIEF1ZyAgNCAyMjoyNTo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRml4IGVuZCBvZiBsaW5lIG1hdGNoaW5nIGluIHNyZWMgdGVzdHMKLQl0byB3b3JrIHdpdGggVENMIDcuNS4KLQotU2F0IEp1biAyOSAxMjo1MTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogU2ltcGxlIGNvcHkgdGVzdCB3b3JrcyBmb3IgaTk2MCBiLm91dAotCXRhcmdldHMuCi0KLU1vbiBKdW4gMjQgMTQ6MzM6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IE9uIE9TRi8xLCB0aGUgc2ltcGxlIGNvcHkgdGVzdCB3aWxsCi0Jc3VjY2VlZCB3aXRoIGdhcywgYW5kIGZhaWwgd2l0aCAvYmluL2FzLCBzbyBtYXJrIGl0IGFzIGFuIGV4cGVjdGVkCi0JZmFpbHVyZSBvbmx5IGlmIGl0IGZhaWxzLgotCi1UdWUgTWFyIDI2IDE2OjU1OjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBObyBsb25nZXIgZXhwZWN0IGFkanVzdC1zZWN0aW9uLXZtYQotCXRlc3QgdG8gZmFpbCBmb3IgaHBwYSotKi1wcm9lbGYqLgotCi1Nb24gTWFyIDExIDA4OjI1OjE0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBMb29rIGZvciAiJENPREUkIiwgbm90IGp1c3QgIkNPREUiLgotCi1XZWQgSmFuIDMxIDExOjU1OjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBFeHBlY3QgYWRqdXN0LXNlY3Rpb24tdm1hIHRlc3RzIHRvCi0JZmFpbCBmb3IgaHBwYSotKi1wcm9lbGYqIHRhcmdldHMuCi0KLVRodSBKYW4gMjUgMTM6NTM6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IFVwZGF0ZSBmb3Igb2JqZHVtcCAtaCBmb3JtYXQgY2hhbmdlLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBMaWtld2lzZS4KLQotTW9uIEphbiAxNSAxODoxNDoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogVXNlIHRoZSBsbWEsIG5vdCB0aGUgdm1hLCB3aGVuIHRlc3RpbmcKLQlhZGRyZXNzIGFkanVzdG1lbnRzLgotCi1GcmkgRGVjIDE1IDE2OjMxOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBVcGRhdGUgb2JqZHVtcCAtaSB0ZXN0IGZvciBjdXJyZW50Ci0Jb2JqZHVtcCBvdXRwdXQuCi0KLU1vbiBOb3YgMjcgMTU6MTU6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IENvcnJlY3QgZmFpbCBjYWxscyB0byBhbHdheXMgdXNlIHRoZQotCXNhbWUgc3RyaW5nIGFzIHRoZSBwYXNzIGNhbGwuCi0KLVdlZCBOb3YgMjIgMTM6MTg6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAocHJ1bmVfc3lzdGVtX2NydWQpOiBEaXNjYXJkIC1nIC1PIHdhcm5pbmdzCi0JZnJvbSBuYXRpdmUgY29tcGlsZXJzIG9uIE9TRi8xIGFuZCBTdW5PUy4KLQotRnJpIE5vdiAxNyAxMDozNjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX2NvbXBpbGVyOiBDaGFuZ2UgZXJyb3IKLQltZXNzYWdlIHRvIHNheSBjb21waWxhdGlvbiByYXRoZXIgdGhhbiBhc3NlbWJseS4KLQotV2VkIE5vdiAxNSAxODozNDo0MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBTaW1wbGUgY29weSB0ZXN0IGRvZXMgYXBwZWFyIHRvIHdvcmsKLQlvbiBpKjg2LXN2cjQuCi0KLVdlZCBOb3YgMTUgMTI6MTk6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IElmIGFzc2VtYmx5IGZhaWxzLCBjYWxsIHVucmVzb2x2ZWQuCi0JVGVzdCBydW5uaW5nIG9iamNvcHkgYW5kIHN0cmlwIG9uIGEgZmluYWwgZXhlY3V0YWJsZS4KLQkqIGJpbnV0aWxzLWFsbC90ZXN0cHJvZy5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoU1RSSVAsIFNUUklQRkxBR1MpOiBEZWZpbmUuCi0JKGJpbnV0aWxzX2NvbXBpbGUpOiBOZXcgcHJvY2VkdXJlLgotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfY29tcGlsZSk6IE5ldyBwcm9jZWR1cmUuCi0KLUZyaSBOb3YgIDMgMTM6MjI6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19ydW4pOiBEb24ndCB1c2UgdmVyYm9zZQotCS1sb2csIHJldmVydGluZyBwYXJ0IG9mIE9jdCAyIGNoYW5nZS4KLQotV2VkIE5vdiAgMSAxNTowOTo1NyAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvcgotCW02OCotbW90b3JvbGEtc3lzdiogYW5kIG04OCotbW90b3JvbGEtc3lzdiouCi0KLVdlZCBPY3QgIDQgMTQ6Mzg6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBYQ09GRi4KLQotTW9uIE9jdCAgMiAxMjo0MTo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9hci5leHA6IE5ldyBmaWxlLgotCSogYmludXRpbHMtYWxsL2JpbnRlc3QuczogTWFrZSB0ZXh0X3N5bWJvbCBhbmQgZGF0YV9zeW1ib2wgZ2xvYmFsLgotCUFkZCBuZXcgc3RhdGljIHN5bWJvbHMgc3RhdGljX3RleHRfc3ltYm9sIGFuZCBzdGF0aWNfZGF0YV9zeW1ib2wuCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKiBjb25maWcvZGVmYXVsdC5leHAgKEFSKTogU2V0IGlmIG5vdCBzZXQuCi0JKGJpbnV0aWxzX3JlbW92ZSk6IE5ldyBwcm9jZWR1cmUuCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19ydW4pOiBDYWxsCi0JcHJ1bmVfc3lzdGVtX2NydWQgb24gcHJvZ3JhbSBvdXRwdXQuICBVc2UgdmVyYm9zZSAtbG9nIGluc3RlYWQgb2YKLQlib3RoIHZlcmJvc2UgYW5kIHNlbmRfbG9nLgotCShkZWZhdWx0X2JpbnV0aWxzX3JlbW92ZSk6IE5ldyBwcm9jZWR1cmUuCi0KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogQ2FsbAotCXBydW5lX3N5c3RlbV9jcnVkIG9uIGFzc2VtYmxlciBvdXRwdXQuCi0KLVR1ZSBTZXAgMjYgMTQ6MDc6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIHNpbXBsZSBjb3B5IHRlc3QKLQlmb3IgaTM4NiBDT0ZGIHRhcmdldHMuCi0KLVdlZCBTZXAgMTMgMTM6MjA6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAocHJ1bmVfc3lzdGVtX2NydWQpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQgb24gY21wIG91dHB1dC4KLQotU2F0IEF1ZyAxOSAxNzozODowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHhmYWlsIGZvciBpKjg2LSotYW91dCogZm9yIHNpbXBsZQotCWNvcHkgdGVzdC4KLQotV2VkIEF1ZyAxNiAxNjo1Mjo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgbWlwcyotc29ueS1ic2QqIGZvcgotCXRlc3RzIHdoaWNoIGZhaWwgb24gRUNPRkYgdGFyZ2V0cy4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBDaGFuZ2UgaSo4Ni0qLWxpbnV4IHhmYWlsIGZvciBzaW1wbGUKLQljb3B5IHRlc3QgdG8gY2hlY2sgZm9yIGkqODYtKi1saW51eGFvdXQqIGluc3RlYWQuCi0KLVR1ZSBBdWcgIDggMTc6NDg6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgYTI5ay0qLXZ4d29ya3MqCi0JZm9yIHNpbXBsZSBjb3B5IHRlc3QuCi0KLVR1ZSBKdWwgMjUgMTE6NTc6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IENoYW5nZSBzZXR1cF94ZmFpbCBmb3Igc2ltcGxlIGNvcHkKLQl0ZXN0IGZyb20gaTk2MC0qLXZ4d29ya3M1LjEgdG8gaTk2MC0qLXZ4d29ya3MqLgotCi1Nb24gSnVsIDEwIDEyOjI1OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHo4Ki0qLWNvZmYgZm9yCi0Jc2ltcGxlIGNvcHkgdGVzdC4KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cCAoY3B1c19leHBlY3RlZCk6IEFkZCB6ODAwMSBhbmQgejgwMDIuCi0KLVN1biBNYXkgMjEgMjA6MzI6NTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwIChhZGRlbmRidWcpOiBIYW5kbGUgUEEgRUxGIHRhcmdldHMKLQl0b28uCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHAgKHNpbXBsZSBjb3B5KTogRG9uJ3QgZXhwZWN0IFBBIEVMRgotCXRhcmdldHMgdG8gZmFpbC4KLQotVHVlIEFwciAgNCAxNDo1MjowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmludXRpbHMtYWxsL2hwcGE6IFJlbmFtZWQgZnJvbSBiaW51dGlscy1ocHBhLgotCi1XZWQgTWFyIDI5IDEyOjAyOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHNpbXBsZSBjb3B5IHRlc3QKLQlmb3IgaDg1MDAtKi1obXMgYW5kIGg4NTAwLSotY29mZi4KLQotVHVlIE1hciAyOCAxMToxODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBzaW1wbGUgY29weSB0ZXN0Ci0JZm9yIG02OCotZXJpY3Nzb24tb3NlIGFuZCBtODgqLSotY29mZi4KLQotTW9uIE1hciAyNyAxMToyNzozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBzaW1wbGUgY29weSB0ZXN0Ci0JZm9yIG02OCotKi12eHdvcmtzKi4KLQotRnJpIE1hciAyNCAxMTo0NDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWhwcGEvb2JqZHVtcC5leHA6IENvcnJlY3QgaHBwYSotKi0qIGNoZWNrLgotCi1UdWUgTWFyIDIxIDEwOjQ4OjQ1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiaW51dGlscy1ocHBhL2FkZGVuZGJ1Zy5zOiBOZXcgdGVzdGNhc2UuCi0JKiBiaW51dGlscy1ocHBhL29iamR1bXAuZXhwOiBSdW4gaXQuCi0KLU1vbiBNYXIgMjAgMTE6MzE6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19ydW4pOiBRdW90ZSBhbnkgZG9sbGFyIHNpZ25zCi0JaW4gcHJvZ2FyZ3MgYmVmb3JlIHBhc3NpbmcgaXQgdG8gZXhlYy4KLQotRnJpIE1hciAxNyAxNjozOTozMSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL2hwcGEuc2VkOiBTZWQgc2NyaXB0IHRvIHRyYW5zZm9ybSBiaW50ZXN0LnMgaW50byBwcm9wZXIKLQlQQSBhc3NlbWJseSBjb2RlLgotCSogYmludXRpbHMtYWxsL25tLmV4cDogRW5hYmxlIHRoZXNlIHRlc3RzIG9uIHRoZSBQQS4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRW5hYmxlIHRoZXNlIHRlc3RzIG9uIHRoZSBQQS4gIEV4cGVjdAotCXNpbXBsZSBjb3B5IHRvIGZhaWwuCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IEVuYWJsZSB0aGVzZSB0ZXN0cyBvbiB0aGUgUEEuICBIYW5kbGUKLQkiQ09ERSIgYXMgYSBzZWN0aW9uIG5hbWUuCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IEVuYWJsZSB0aGVzZSB0ZXN0cyBvbiB0aGUgUEEuCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSk6IEZvciAiaHBwYSotKi0qIiwKLQlydW4gdGhlIGFzc2VtYmx5IHRocm91Z2ggYSBzZWQgc2NyaXB0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZQotCWFzc2VtYmxlci4KLQotV2VkIE1hciAxNSAxNjo0NzoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRm9yY2Ugc2VjdGlvbiBzaXplcyB0byBiZSBpbnRlcnByZXRlZAotCWluIGhleC4gIENoYW5nZSBvYmpkdW1wIC1oIGZhaWx1cmUgbW9kZSB0byBhbHdheXMgdXNlIHRoZSBzYW1lCi0Jc3RyaW5nLgotCi1UaHUgSmFuICA1IDEzOjAxOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogSnVzdCBjaGVjayBmb3IgaXJpeDQqLCByYXRoZXIgdGhhbgotCWlyaXhcWzAtNFxdKiwgdG8gYXZvaWQgRGVqYUdudSBidWcuCi0KLVRodSBEZWMgMTUgMTk6MzU6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBFeHBlY3Qgc2ltcGxlLW9iamNvcHkgdGVzdCB0byBmYWlsCi0JZm9yIHZhcmlvdXMgb3RoZXIgdGFyZ2V0cyBmb3Igd2hpY2ggZ2FzIGRvZXNuJ3QgdXNlIGJmZDogc2gtaG1zLAotCW02OGstaHB1eCwgbTY4ay1zdW5vcywgbTY4ay1jb2ZmLCBpMzg2LWxpbnV4LCBhMjlrLXVkaSwgYTI5ay1jb2ZmLAotCWk5NjAtdnh3b3JrczUuMSwgaTk2MC1jb2ZmLCBoODMwMC1obXMsIGg4MzAwLWNvZmYuCi0KLVdlZCBEZWMgMTQgMTU6NTQ6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBTa2lwIHRlc3RzIHJlcXVpcmluZyBiaW50ZXN0Lm8gb24gaHBwYSwKLQlzaW5jZSBpdCAoY29ycmVjdGx5KSBnZW5lcmF0ZXMgc3ludGF4IGVycm9ycyBvbiB0aGF0IHBsYXRmb3JtLgotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IERpdHRvLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEaXR0by4gIEFsc28sIG1vdmUgc2V0dXBfeGZhaWwgZm9yCi0Jc2gtY29mZiB0byBicmFuY2ggd2hlcmUgb2JqY29weSBleGVjdXRpb24gcHJvZHVjZWQgbm8gZXJyb3IKLQltZXNzYWdlcy4gIEV4cGVjdCBmYWlsdXJlIGZvciBocDMwMCBhbHNvLgotCi1UaHUgRGVjICA4IDE0OjM2OjE1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cCAoY3B1c19leHBlY3RlZCk6IE5ldyB2YXJpYWJsZSwgdGFrZW4KLQlmcm9tIG9iamR1bXAgLWkgdGVzdCwgYWRkZWQgbnMzMmsgYW5kIHBvd2VycGMsIHNvcnRlZC4KLQkob2JqZHVtcCAtaSwgLWYgdGVzdHMpOiBVc2UgJGNwdXNfZXhwZWN0ZWQuCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogRm9yIHNpbXBsZS1jb3B5IHRlc3QsIGV4cGVjdCBmYWlsdXJlCi0JZm9yIHNoLWNvZmYuCi0KLVR1ZSBPY3QgMjUgMTY6MDA6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkanVzdCAtLWFkanVzdC1zZWN0aW9uLXZtYSB0ZXN0cyBmb3IKLQluZXcgUy1yZWNvcmQgc2VjdGlvbiBoYW5kbGluZy4KLQotVHVlIE9jdCAxOCAxMToxODoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IG5tIHdpdGggbm8gYXJndW1lbnRzIGFuZCBubSAtUCBkbyBub3Qgd29yawotCWFzIGV4cGVjdGVkIG9uIEVDT0ZGIHRhcmdldHM7IGFkZCBjYWxscyB0byBzZXR1cF94ZmFpbC4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogSW5pdGlhbGl6ZSBPQkpDT1BZIGFuZCBPQkpDT1BZRkxBR1MuCi0KLUZyaSBPY3QgMTQgMTQ6NDY6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JUmV3cml0ZSB0ZXN0c3VpdGUuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBSZW1vdmUuCi0JKiBiaW51dGlscy1hbGwvY29uZmlndXJlLmluLCBiaW51dGlscy1hbGwvTWFrZWZpbGUuaW46IFJlbW92ZS4KLQkqIGJpbnV0aWxzLWFsbC9iaW50ZXN0LmM6IFJlbW92ZS4KLQkqIGJpbnV0aWxzLWFsbC9iaW50ZXN0LnM6IE5ldyBmaWxlLgotCSogYmludXRpbHMtYWxsL25tLmV4cCwgYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBSZXdyaXRlLgotCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBSZXdyaXRlLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBMb2FkIHV0aWxzLWxpYi5leHAuICBTZXQgQVMgYW5kIEFTRkxBR1MuCi0JRG9uJ3QgZ28gdXAgb25lIGRpcmVjdG9yeSBmcm9tICRiYXNlX2Rpci4gIENyZWF0ZSB0bXBkaXIuCi0JKGJpbnV0aWxzX3J1biwgYmludXRpbHMtYXNzZW1ibGUpOiBOZXcgcHJvY2VkdXJlcy4KLQkqIGNvbmZpZy91bml4LmV4cDogUmVtb3ZlLgotCSogY29uZmlnL210LWEyOWstdWRpLCBjb25maWcvbXQtaTM4Ni1hb3V0OiBSZW1vdmUuCi0JKiBjb25maWcvbXQtaTk2MC1uaW5keSwgY29uZmlnL210LWx5bngsIGNvbmZpZy9tdC1tNjhrOiBSZW1vdmUuCi0JKiBjb25maWcvbXQtbWlwcy1lY29mZiwgY29uZmlnL210LXNsaXRlOiBSZW1vdmUuCi0JKiBjb25maWcvbXQtc3BhcmMtYW91dCwgY29uZmlnL210LXZ4d29ya3M6IFJlbW92ZS4KLQkqIGxpYi91dGlscy1saWIuZXhwIChiaW51dGlsX3ZlcnNpb24pOiBEb24ndCByZWRpcmVjdCBzdGFuZGFyZAotCWlucHV0IHdoZW4gZ2V0dGluZyB2ZXJzaW9uLiAgRG9uJ3QgdW5zZXQgZXJyb3JJbmZvLgotCShkZWZhdWx0X2JpbnV0aWxzX3J1bik6IE5ldyBwcm9jZWR1cmUuCi0JKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBOZXcgcHJvY2VkdXJlLgotCi1UaHUgU2VwIDI5IDEyOjQ1OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogVk1TIGRvZXMgbm90IHBlcm1pdCBgLicgaW4gZGlyZWN0b3J5IG5hbWVzOiByZW5hbWVkIGJpbnV0aWxzLmFsbAotCXRvIGJpbnV0aWxzLWFsbC4KLQkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlycyk6IENoYW5nZSBiaW51dGlscy5hbGwgdG8gYmludXRpbHMtYWxsLgotCi1GcmkgU2VwIDIzIDE2OjAxOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgbXQtbTY4ayBmb3IgbTY4ayotKi1hb3V0KiBhbmQgbTY4ayotKi1jb2ZmKiwKLQlub3QgZm9yIG02OGstKi0qLgotCi1GcmkgU2VwIDIzIDEzOjU0OjUwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogQWRkZWQgQVJNIHRvIGxpc3Qgb2YgQ1BVIHR5cGVzLgotCi1UaHUgU2VwIDIyIDExOjA0OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMuYWxsL29iamR1bXAuZXhwOiBVcGRhdGUgZm9yIG5ldyB1c2FnZSBtZXNzYWdlLgotCSogYmludXRpbHMuYWxsL3NpemUuZXhwOiBVc2UgYSBkb3VibGUgYmFja3NsYXNoIGluIHRoZSBzdHJpbmcgdG8KLQlnZXQgYSBzaW5nbGUgYmFja3NsYXNoIHRvIHRoZSByZWdleHAgbWF0Y2hlci4gIEFjY2VwdCAkVEVYVCQsCi0JJERBVEEkIGFuZCAkQlNTJCBhcyB3ZWxsIGFzIC50ZXh0LCAuZGF0YSBhbmQgLmJzcywgZm9yIEhQL1VYLgotCi1GcmkgU2VwICAyIDEyOjUzOjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3VuaXguZXhwOiBJZiBubS5uZXcgZG9lcyBub3QgZXhpc3QsIHVzZSBbdHJhbnNmb3JtIG5tXS4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMjQgMTI6NDE6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGJpbnV0aWxzLmFsbC9jb25maWd1cmUuaW46IENoYW5nZSBpMzg2IHRvCi0JaVszNDVdODYuCi0KLVR1ZSBKdWwgMTkgMTU6MjM6NTMgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtbWlwcy1lY29mZjogQWRkIC1UaWRwLmxkIG9wdGlvbi4KLQotVGh1IEp1biAzMCAxMjo0MTo1NSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogVXNlIG5tLm5ldywgbm90IG5tLCBmcm9tIG5ld2x5IGJ1aWx0IHRyZWUuCi0KLVR1ZSBNYXkgMTcgMTQ6MDQ6MDUgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVmYXVsdC5leHAsIGNvbmZpZy91bml4LmV4cDogUmVwbGFjZSBlcnJvcgotCSAgcHJvYyBjYWxscyB3aXRoIHBlcnJvci4KLQotVHVlIE1heSAxMCAxMToyMDo1NCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsaXRlKTogTWF0Y2ggb24gc3BhcmNsaXRlKi0qLSouCi0KLVdlZCBBcHIgMTMgMTg6MjU6MTkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3VuaXguZXhwOiBVc2Ugbm0ubmV3LCBub3Qgbm0sIGZyb20gbmV3bHkgYnVpbHQgdHJlZS4KLQotCSogYmludXRpbHMuYWxsL29iamR1bXAuZXhwOiBBZGQgbW9yZSB3aWxkY2FyZHMgdG8gbGlzdCBvZgotCXNpbmdsZS1sZXR0ZXIgb3B0aW9ucyBpbiBwYXR0ZXJuIGZvciB1c2FnZSBtZXNzYWdlLgotCi0JKiBiaW51dGlscy5hbGwvbm0uZXhwOiBEZWxldGVkIGRlYnVnLXN5bWJvbHMgdGVzdCwgc2luY2UgaXQgb25seQotCXdvcmtzIGZvciBhLm91dC9zdGFicyBzeXN0ZW1zLiAgRml4ZWQgcmVnZXhwcyB0byBtYWtlIHVuZGVyc2NvcmVzCi0Jb3B0aW9uYWwsIHNpbmNlIHNvbWUgQyBjb21waWxlcnMgZG9uJ3QgcHJlcGVuZCB0aGVtLiAgRGVsZXRlZAotCWNoZWNrIGZvciBmb28ubyBzeW1ib2wsIHNpbmNlIGFnYWluIHNvbWUgc3lzdGVtcyBkb24ndCBnZW5lcmF0ZQotCWl0LgotCi1Nb24gQXByIDExIDEwOjMxOjAwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogU2V0IFRDTF9MSUJSQVJZIGZvciBydW50ZXN0LgotCi1Nb24gRmViIDE0IDE5OjM0OjAzIDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFVzZSBuZXcgY29uZmlnIGZlYXR1cmVzIG9mIERlamFHbnUgaW4gc2l0ZS5leHAKLQlmaWxlLiAiTWFrZSBjaGVjayIgc2hvdWxkIG5vdyB3b3JrIGZvciBhbGwgY3Jvc3Nlcy4KLQotRnJpIEphbiAyOCAxODowMDoyOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IEluIHVzYWdlIG1lc3NhZ2UsIGFjY2VwdAotCSJzZWN0aW9uLW5hbWUiIGFzIHdlbGwgYXMgInNlY3Rpb25fbmFtZSIuCi0KLU1vbiBKYW4gMTcgMTY6NTc6MDIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMuYWxsL29iamR1bXAuZXhwOiBUcmltIGxpc3Qgb2YgZm9ybWF0IG5hbWVzIGV4cGVjdGVkLAotCWFuZCBhY2NlcHQgYW55IGtub3duIENQVSB0eXBlLgotCi1UaHUgRGVjICAyIDIwOjUwOjI0IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBzb21lIHN0dWZmIGZyb20gdGhlIHNpdGUuZXhwIGZpbGUuCi0JKiBjb25maWcvdW5peC5leHA6IEFkZCBnbG9iYWwgYmVmb3JlIHNlZWluZyBpZiB0aGUgdmFyaWFibGVzIGZvcgotCW5tLCBvYmpkdW1wLCBhbmQgc2l6ZSBleGlzdC4KLQotV2VkIE5vdiAgMyAxMToxMjozMiAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy91ZGkuZXhwLHVuaXguZXhwOiBUcmFuc2Zvcm0gdG9vbCBuYW1lLgotCSogYmludXRpbHMuYWxsLyouZXhwOiBDbGVhciBlcnJvckluZm8gYWZ0ZXIgZXhlYy4KLQotRnJpIEp1bCAgMiAxMjo0MToyMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC8qLmV4cDogVXNlIC0tIGZvciBsb25nIGFyZ3VtZW50cyByYXRoZXIgdGhhbiArLgotCi1GcmkgSnVuICA0IDEwOjUyOjI5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBjaGFuZ2Ugc3JjdHJpZ2dlciB0byBNYWtlZmlsZS5pbiAKLQotV2VkIE1heSAyNiAxNzoyNzo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIENDIGFuZCBDRkxBR1MuCi0KLUZyaSBNYXkgIDcgMTM6NTg6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IFVwZGF0ZSBmb3IgbmV3IHVzYWdlIG1lc3NhZ2UuCi0KLU1vbiBBcHIgMTkgMTQ6MDg6NTIgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy5hbGwvKi5leHA6IFVzZSB0aGUgbmV3IHV0aWxfdGVzdCBwcm9jLgotCSogTWFrZWZpbGUuaW46IENyZWF0ZSBhIGxvY2FsIHNpdGUuZXhwIGZpbGUgd2l0aCBjb25maWcgaW5mby4KLQotVGh1IE1hciAyNSAwNTozODo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogbm0uYWxsL2NvbmZpZ3VyZS5pbiAoc3JjbmFtZSk6IERlbGV0ZSBleHRyYSBxdW90ZS4KLQotTW9uIEZlYiAyMiAwNzo1NDowMyAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0gICAgICAgICogYmludXRpbHMvdGVzdHN1aXRlOiBtYWRlIG1vZGlmaWNhdGlvbnMgdG8gdGVzdGNhc2VzLCBldGMuLCB0byBhbGxvdwotICAgICAgICB0aGVtIHRvIHdvcmsgcHJvcGVybHkgIGdpdmVuIHRoZSByZW9yZ2FuaXphdGlvbiBvZiBkZWphLWdudSBhbmQgdGhlCi0gICAgICAgIHJlbG9jYXRpb24gb2YgdGhlIHRlc3RjYXNlcyBmcm9tIGRlamEtZ251IHRvIGEgInRvb2wiIHN1YmRpcmVjdG9yeS4KLQotU3VuIEZlYiAyMSAxMDo1NTo1NSAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy90ZXN0c3VpdGU6IEluaXRpYWwgY3JlYXRpb24gb2YgYmludXRpbHMvdGVzdHN1aXRlLgotCU1pZ3JhdGVkIGRlamFnbnUgdGVzdGNhc2VzIGFuZCBzdXBwb3J0IGZpbGVzIGZvciB0ZXN0aW5nIG5tIHRvCi0JYmludXRpbHMvdGVzdHN1aXRlIGZyb20gZGVqYS1nbnUuICBUaGVzZSBmaWxlcyB3ZXJlIG1vdmVkICJhcyBpcyIKLQl3aXRoIG5vIG1vZGlmaWNhdGlvbnMuICBUaGlzIG1pZ3JhdGlvbiBpcyBwYXJ0IG9mIGEgbWFqb3Igb3ZlcmhhdWwKLQlvZiBkZWphZ251LiAgVGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlc2UgdGVzdGNhc2VzLCBldGMuLCB3aGljaAotCXdpbGwgYWxsb3cgdGhlbSB0byB3b3JrIHdpdGggdGhlIG5ldyB2ZXJzaW9uIG9mIGRlamFnbnUgd2lsbCBiZQotCW1hZGUgaW4gYSBmdXR1cmUgdXBkYXRlLgotCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2FyLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYXIuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM4YzZiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYXIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkQVJdID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiRBUiBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi0jIHNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRBUl0iCi0KLSMgVGVzdCBsb25nIGZpbGUgbmFtZSBzdXBwb3J0Ci0KLXByb2MgbG9uZ19maWxlbmFtZXMgeyB9IHsKLSAgICBnbG9iYWwgQVIKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBzZXQgdGVzdG5hbWUgImFyIGxvbmcgZmlsZSBuYW1lcyIKLQotICAgIHNldCBuMSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxIgotICAgIHNldCBuMiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoyIgotICAgIHNldCBmaWxlMSB0bXBkaXIvJG4xCi0gICAgc2V0IGZpbGUyIHRtcGRpci8kbjIKLQotICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAkZmlsZTEKLQotICAgICMgU29tZSBmaWxlIHN5c3RlbXMgdHJ1bmNhdGUgZmlsZSBuYW1lcyBhdCAxNCBjaGFyYWN0ZXJzLCB3aGljaAotICAgICMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBydW4gdGhpcyB0ZXN0LiAgQ2hlY2sgZm9yIHRoYXQgbm93LgotICAgIHNldCBzdGF0dXMgW2NhdGNoICJzZXQgZiBbb3BlbiB0bXBkaXIvJG4xIHddIiBlcnJzXQotICAgIGlmIHsgJHN0YXR1cyAhPSAwIH0gewotCXZlcmJvc2UgLWxvZyAib3BlbiB0bXBkaXIvJG4xIHJldHVybmVkICRlcnJzIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICBwdXRzICRmICJmaXJzdCIKLSAgICBjbG9zZSAkZgotCi0KLSAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgJGZpbGUyCi0KLSAgICBzZXQgc3RhdHVzIFtjYXRjaCAic2V0IGYgW29wZW4gdG1wZGlyLyRuMiB3XSIgZXJyc10KLSAgICBpZiB7ICRzdGF0dXMgIT0gMCB9IHsKLQl2ZXJib3NlIC1sb2cgIm9wZW4gdG1wZGlyLyRuMiByZXR1cm5lZCAkZXJycyIKLQl1bnN1cHBvcnRlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgcHV0cyAkZiAic2Vjb25kIgotICAgIGNsb3NlICRmCi0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgZmlsZTEgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRmaWxlMV07Ci0Jc2V0IGZpbGUyIFtyZW1vdGVfZG93bmxvYWQgaG9zdCAkZmlsZTJdOwotCXNldCBkZXN0IGFydGVzdC5hCi0gICAgfSBlbHNlIHsKLQlzZXQgZGVzdCB0bXBkaXIvYXJ0ZXN0LmEKLSAgICB9Ci0KLSAgICByZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkZGVzdDsKLQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkQVIgInJjICRkZXN0ICRmaWxlMSAkZmlsZTIiXQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAkZmlsZTEgdG1wZGlyLyRuMQotICAgIH0KLQotICAgIHNldCBmIFtvcGVuIHRtcGRpci8kbjEgcl0KLSAgICBnZXRzICRmIHN0cmluZwotICAgIGNsb3NlICRmCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggImZpcnN0IiAkc3RyaW5nXSB7Ci0JdmVyYm9zZSAtbG9nICJyZWFkaW5nIHRtcGRpci8kbjEgcmV0dXJuZWQgJHN0cmluZyIKLQl1bnN1cHBvcnRlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICByZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkZGVzdDsKLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJEFSICJyYyAkZGVzdCAkZmlsZTEgJGZpbGUyIl0KLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHsKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSB0bXBkaXIvJG4xCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci8kbjIKLQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkQVIgInQgJGRlc3QiXQotICAgIHJlZ3N1YiAiXFtcclxuIFx0XF0qJCIgIiRnb3QiICIiIGdvdDsKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiJG4xKiRuMiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIAotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRmaWxlMTsKLQlyZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkZmlsZTI7Ci0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkQVIgeCAkZGVzdCIKLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkQVIgInggJGRlc3QiXQotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXZlcmJvc2UgLWxvZyAkZXhlY19vdXRwdXQKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAkbjEgdG1wZGlyLyRuMTsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJG4yIHRtcGRpci8kbjI7Ci0Jc2V0IGZpbGUxIHRtcGRpci8kbjEKLQlzZXQgZmlsZTIgdG1wZGlyLyRuMgotICAgIH0gZWxzZSB7Ci0Jc2V0IGZpbGUxICRuMQotCXNldCBmaWxlMiAkbjIKLSAgICB9Ci0KLSAgICBpZiAhW2ZpbGUgZXhpc3RzICRmaWxlMV0gewotCXZlcmJvc2UgLWxvZyAiJGZpbGUxIGRvZXMgbm90IGV4aXN0IgotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIGlmICFbZmlsZSBleGlzdHMgJGZpbGUyXSB7Ci0JdmVyYm9zZSAtbG9nICIkZmlsZTIgZG9lcyBub3QgZXhpc3QiCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZiBbb3BlbiAkZmlsZTEgcl0KLSAgICBpZiB7IFtnZXRzICRmIGxpbmVdID09IC0xIHx8ICRsaW5lICE9ICJmaXJzdCIgfSB7Ci0JdmVyYm9zZSAtbG9nICIkZmlsZTEgY29udGVudHM6IgotCXZlcmJvc2UgLWxvZyAiJGxpbmUiCi0JY2xvc2UgJGYKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICBjbG9zZSAkZgotCi0gICAgc2V0IGYgW29wZW4gJGZpbGUyIHJdCi0gICAgaWYgeyBbZ2V0cyAkZiBsaW5lXSA9PSAtMSB8fCAkbGluZSAhPSAic2Vjb25kIiB9IHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMiBjb250ZW50czoiCi0JdmVyYm9zZSAtbG9nICIkbGluZSIKLQljbG9zZSAkZgotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIGNsb3NlICRmCi0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0jIFRlc3QgYnVpbGRpbmcgdGhlIHN5bWJvbCB0YWJsZS4KLQotcHJvYyBzeW1ib2xfdGFibGUgeyB9IHsKLSAgICBnbG9iYWwgQVIKLSAgICBnbG9iYWwgQVMKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotCi0gICAgc2V0IHRlc3RuYW1lICJhciBzeW1ib2wgdGFibGUiCi0KLSAgICBpZiAhW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub10gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IGFyY2hpdmUgYXJ0ZXN0LmEKLQlzZXQgb2JqZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2JpbnRlc3Qub10KLQlyZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkYXJjaGl2ZQotICAgIH0gZWxzZSB7Ci0Jc2V0IGFyY2hpdmUgdG1wZGlyL2FydGVzdC5hCi0Jc2V0IG9iamZpbGUgdG1wZGlyL2JpbnRlc3QubwotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSB0bXBkaXIvYXJ0ZXN0LmEKLQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkQVIgInJjICRhcmNoaXZlICR7b2JqZmlsZX0iXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHsKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkTk0gIi0tcHJpbnQtYXJtYXAgJGFyY2hpdmUiXQotICAgIGlmIHsgIVtzdHJpbmcgbWF0Y2ggIip0ZXh0X3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8ICFbc3RyaW5nIG1hdGNoICIqZGF0YV9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAotCSB8fCAhW3N0cmluZyBtYXRjaCAiKmNvbW1vbl9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqc3RhdGljX3RleHRfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKnN0YXRpY19kYXRhX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipleHRlcm5hbF9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gfSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0jIFJ1biB0aGUgdGVzdHMuCi0KLWxvbmdfZmlsZW5hbWVzCi1zeW1ib2xfdGFibGUKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYmludGVzdC5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9iaW50ZXN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDA2NTAuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9iaW50ZXN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmdsb2JsIHRleHRfc3ltYm9sCi0JLnRleHQKLXRleHRfc3ltYm9sOgkKLXN0YXRpY190ZXh0X3N5bWJvbDoKLQkubG9uZwkxCi0JLmxvbmcJZXh0ZXJuYWxfc3ltYm9sCi0JLmdsb2JsIGRhdGFfc3ltYm9sCi0JLmRhdGEKLWRhdGFfc3ltYm9sOgotc3RhdGljX2RhdGFfc3ltYm9sOgotCS5sb25nCTIKLQkuY29tbSBjb21tb25fc3ltYm9sLDQKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9hZGRlbmRidWcucyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9hZGRlbmRidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5MzA2Zi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvYWRkZW5kYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBpbml0aWFsaXplX2NoYXJfc3ludGF4LENPREUKLQkuRVhQT1JUIGluaXRpYWxpemVfY2hhcl9zeW50YXgsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWluaXRpYWxpemVfY2hhcl9zeW50YXgKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxOT19DQUxMUyxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlhZGRpbCBMJ2lzX2lkY2hhci0kZ2xvYmFsJC0zMiwlcjI3Ci0JLkVYSVQKLQkuUFJPQ0VORAotaXNfaWRjaGFyCS5jb21tIDI1NgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDZiMjg5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9vYmpkdW1wLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+Ci0jIGFuZCByZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgcmV0dXJuCi19Ci0KLWlmIHtbd2hpY2ggJE9CSkRVTVBdID09IDB9IHRoZW4gewotICAgIHBlcnJvciAiJE9CSkRVTVAgZG9lcyBub3QgZXhpc3QiCi0gICAgcmV0dXJuCi19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRPQkpEVU1QXSIKLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2FkZGVuZGJ1Zy5zIHRtcGRpci9hZGRlbmRidWcub119IHRoZW4gewotICAgIHJldHVybgotfQotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgb2JqZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2FkZGVuZGJ1Zy5vXQotfSBlbHNlIHsKLSAgICBzZXQgb2JqZmlsZSB0bXBkaXIvYWRkZW5kYnVnLm8KLX0KLQotIyBNYWtlIHN1cmUgdGhlIFNPTSBCRkQgY29kZSBzaWduIGV4dGVuZHMgY29uc3RhbnRzIGluIFJfREFUQV9PVkVSUklERSBmaXh1cHMuCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtciAkb2JqZmlsZSJdCi0KLWlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLSAgc2V0IHdhbnQgIjAwMDAwMDAwIFJfUEFSSVNDX0RQUkVMMjFMXFsgCVxdK2lzX2lkY2hhclxcKzB4ZmZmZmZmZTAuKiIKLX0gZWxzZSB7Ci0gIHNldCB3YW50ICIwMDAwMDAwMCBSX0RQX1JFTEFUSVZFXFsgCVxdK2lzX2lkY2hhclxcKzB4ZmZmZmZmZTAuKiIKLX0KLQotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgImFkZGVuZGJ1ZyB0ZXN0IgotfSBlbHNlIHsKLSAgICBmYWlsICJhZGRlbmRidWcgdGVzdCIKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvbm0uZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzdjNWYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJE5NXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkTk0gZG9lcyBub3QgZXhpc3QiCi0gICAgICAgIHJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE5NXSIKLQotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgdG1wZGlyL2JpbnRlc3QubwotfQotCi0jIFRlc3Qgbm0gd2l0aCBubyBhcmd1bWVudHMuCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIEVDT0ZGIHRhcmdldHMsIGJlY2F1c2UgRUNPRkYKLSMgc3RvcmVzIG1vc3Qgc3ltYm9scyB0d2ljZSwgd2hpY2ggbWVzc2VzIHVwIHRoZSBubSBvdXRwdXQuCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIgImFscGhhKi0qLW5ldHdhcmUqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotdWx0cml4KiIgIm1pcHMqLSotZWNvZmYqIiAibWlwcyotKi1pcml4NCoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi1yaXNjb3MqIiAibWlwcyotKi1zeXN2MyoiICJtaXBzKi1zb255LWJzZCoiCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIFhDT0ZGIHRhcmdldHMsIGJlY2F1c2UgWENPRkYKLSMgZG9lcyBub3QgZW50ZXIgc3RhdGljIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLXNldHVwX3hmYWlsICIqLSotYWl4KiIKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgJHRlbXBmaWxlIl0KLQotaWYgW2luZm8gZXhpc3RzIHZhcnNdIHRoZW4geyB1bnNldCB2YXJzIH0KLXdoaWxlIHtbcmVnZXhwICIoXFthLXpBLVpcXSkgKFxbYS16X1xdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgdHlwZSBzeW1ib2wgcmVzdF19IHsKLSAgICBzZXQgdmFycygkc3ltYm9sKSAkdHlwZQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnModGV4dF9zeW1ib2wpICE9ICJUIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoZGF0YV9zeW1ib2wpICE9ICJEIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhjb21tb25fc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhjb21tb25fc3ltYm9sKSAhPSAiQyIgXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZXh0ZXJuYWxfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhleHRlcm5hbF9zeW1ib2wpICE9ICJVIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhzdGF0aWNfdGV4dF9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCkgIT0gInQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY19kYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKSAhPSAiZCJ9IHsKLSAgICBmYWlsICJubSAobm8gYXJndW1lbnRzKSIKLX0gZWxzZSB7Ci0gICAgcGFzcyAibm0gKG5vIGFyZ3VtZW50cykiCi19Ci0KLSMgVGVzdCBubSAtZwotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAtZyAkdGVtcGZpbGUiXQotCi1pZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQotd2hpbGUge1tyZWdleHAgIihcW2Etel9cXSpfc3ltYm9sKSguKikiICRnb3QgYWxsIHN5bWJvbCByZXN0XX0gewotICAgIHNldCB2YXJzKCRzeW1ib2wpIDEKLSAgICBzZXQgZ290ICRyZXN0Ci19Ci0KLWlmIHshW2luZm8gZXhpc3RzIHZhcnModGV4dF9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXSBcCi0gICAgIHx8IFtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKV19IHsKLSAgICBmYWlsICJubSAtZyIKLX0gZWxzZSB7Ci0gICAgcGFzcyAibm0gLWciCi19Ci0KLSMgVGVzdCBubSAtUAotCi0jIFRoaXMgdGVzdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBFQ09GRiB0YXJnZXRzLCBiZWNhdXNlIEVDT0ZGCi0jIHN0b3JlcyBtb3N0IHN5bWJvbHMgdHdpY2UsIHdoaWNoIG1lc3NlcyB1cCB0aGUgbm0gb3V0cHV0Lgotc2V0dXBfeGZhaWwgImFscGhhKi0qLW9zZioiICJhbHBoYSotKi1uZXR3YXJlKiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLXVsdHJpeCoiICJtaXBzKi0qLWVjb2ZmKiIgIm1pcHMqLSotaXJpeDQqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotcmlzY29zKiIgIm1pcHMqLSotc3lzdjMqIiAibWlwcyotc29ueS1ic2QqIgotCi0jIFRoaXMgdGVzdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBYQ09GRiB0YXJnZXRzLCBiZWNhdXNlIFhDT0ZGCi0jIGRvZXMgbm90IGVudGVyIHN0YXRpYyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUuCi1zZXR1cF94ZmFpbCAiKi0qLWFpeCoiCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTIC1QICR0ZW1wZmlsZSJdCi0KLXNldCB3YW50ICJjb21tb25fc3ltYm9sIEMgXFswXF0qNC4qZGF0YV9zeW1ib2wgRCBcWzAtOWEtZkEtRlxdKi4qZXh0ZXJuYWxfc3ltYm9sIFUuKnN0YXRpY19kYXRhX3N5bWJvbCBkIFxbMC05YS1mQS1GXF0qLipzdGF0aWNfdGV4dF9zeW1ib2wgdCBcWzAtOWEtZkEtRlxdKi4qdGV4dF9zeW1ib2wgVCBcWzAtOWEtZkEtRlxdKiIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJubSAtUCIKLX0gZWxzZSB7Ci0gICAgZmFpbCAibm0gLVAiCi19Ci0KLSMgVGhlcmUgYXJlIGNlcnRhaW5seSBvdGhlciB0ZXN0cyB0aGF0IGNvdWxkIGJlIHJ1bi4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamNvcHkuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk3MmYxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRPQkpDT1BZXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkT0JKQ09QWSBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkT0JKQ09QWV0iCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHBlcnJvciAidW5yZXNvbHZlZCAxIgotICAgIHVucmVzb2x2ZWQgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vOwotICAgIHNldCBjb3B5ZmlsZSB0bXBkaXIvY29weTsKLX0gZWxzZSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotICAgIHNldCBjb3B5ZmlsZSBjb3B5Ci19Ci0KLSMgVGVzdCB0aGF0IG9iamNvcHkgZG9lcyBub3QgbW9kaWZ5IGEgZmlsZSB3aGVuIGNvcHlpbmcgaXQuCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ubyJdCi0KLWlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotICAgIGZhaWwgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLX0gZWxzZSB7Ci0gICAgc2VuZF9sb2cgImNtcCAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ub1xuIgotICAgIHZlcmJvc2UgImNtcCAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ubyIKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgc3JjMSB0bXBkaXIvYmludGVzdC5vCi0Jc2V0IHNyYzIgdG1wZGlyL2NvcHkubwotCXJlbW90ZV91cGxvYWQgaG9zdCAkdGVtcGZpbGUgJHNyYzE7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR7Y29weWZpbGV9Lm8gJHNyYzI7Ci0gICAgfSBlbHNlIHsKLQlzZXQgc3JjMSAke3RlbXBmaWxlfQotCXNldCBzcmMyICR7Y29weWZpbGV9Lm8KLSAgICB9Ci0gICAgc2V0IHN0YXR1cyBbcmVtb3RlX2V4ZWMgYnVpbGQgY21wICIke3NyYzF9ICR7c3JjMn0iXTsKLSAgICBzZXQgZXhlY19vdXRwdXQgW2xpbmRleCAkc3RhdHVzIDFdOwotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgIyBPbiBzb21lIHN5c3RlbXMgdGhlIHJlc3VsdCBvZiBvYmpjb3B5IHdpbGwgbm90IGJlIGlkZW50aWNhbC4KLSAgICAjIFVzdWFsbHkgdGhpcyBpcyBqdXN0IGJlY2F1c2UgZ2FzIGlzbid0IHVzaW5nIGJmZCB0byB3cml0ZSB0aGUgZmlsZXMKLSAgICAjIGluIHRoZSBmaXJzdCBwbGFjZSwgYW5kIG1heSBvcmRlciB0aGluZ3MgYSBsaXR0bGUgZGlmZmVyZW50bHkuCi0gICAgIyBUaG9zZSBzeXN0ZW1zIHNob3VsZCB1c2Ugc2V0dXBfeGZhaWwgaGVyZS4KLQotICAgIHNldHVwX3hmYWlsICJzaC0qLWNvZmYiICJzaC0qLWhtcyIgCi0gICAgc2V0dXBfeGZhaWwgIm02OCotKi1ocHV4KiIgIm02OCotKi1zdW5vcyoiICJtNjgqLSotY29mZiIgIm02OCotKi12eHdvcmtzKiIKLSAgICBzZXR1cF94ZmFpbCAibTY4Ki1lcmljc3Nvbi1vc2UiICJtNjhrKi1tb3Rvcm9sYS1zeXN2KiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLWxpbnV4YW91dCoiICJpKjg2LSotYW91dCoiCi0gICAgc2V0dXBfeGZhaWwgImkqODYtKi1zeXN2MyIgImkqODYtKi1pc2MqIiAiaSo4Ni0qLXNjbyoiICJpKjg2LSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLWFpeCoiICJpKjg2LSotZ28zMioiCi0gICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiICJhMjlrLSotY29mZiIgImEyOWstKi12eHdvcmtzKiIKLSAgICBzZXR1cF94ZmFpbCAiaTk2MC0qLWNvZmYiCi0gICAgc2V0dXBfeGZhaWwgImg4MzAwLSotaG1zIiAiaDgzMDAtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJoODUwMC0qLWhtcyIgImg4NTAwLSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaHBwYSotKi0qIgotICAgIGNsZWFyX3hmYWlsICJocHBhKi0qLSplbGYqIgotICAgIHNldHVwX3hmYWlsICJtODgqLSotY29mZiIgIm04OCotbW90b3JvbGEtc3lzdioiCi0gICAgc2V0dXBfeGZhaWwgIno4Ki0qLWNvZmYiCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCi0JIyBPbiBPU0YvMSwgdGhpcyBzdWNjZWVkcyB3aXRoIGdhcyBhbmQgZmFpbHMgd2l0aCAvYmluL2FzLgotCXNldHVwX3hmYWlsICJhbHBoYSotKi1vc2YqIgotCi0JIyBUaGlzIGZhaWxzIGZvciBDT0ZGIGk5NjAtdnh3b3JrcyB0YXJnZXRzLgotCXNldHVwX3hmYWlsICJpOTYwLSotdnh3b3JrcyoiCi0KLQlmYWlsICJvYmpjb3B5IChzaW1wbGUgY29weSkiCi0gICAgfQotfQotCi0jIFRlc3QgZ2VuZXJhdGluZyBTIHJlY29yZHMuCi0KLSMgV2UgbWFrZSB0aGUgc3JlYyBmaWxlbmFtZSA4LjMgY29tcGF0aWJsZS4gTm90ZSB0aGF0IHRoZSBoZWFkZXIgc3RyaW5nCi0jIG1hdGNoZWQgYWdhaW5zdCBkZXBlbmRzIG9uIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiBVZ2guCi0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCBzcmVjZmlsZSBjb3B5LnNyZQotICAgIHNldCBoZWFkZXJfc3RyaW5nIFMwMEIwMDAwNjM2RjcwNzkyRTczNzI2NUMxCi19IGVsc2UgewotICAgIHNldCBzcmVjZmlsZSAke2NvcHlmaWxlfS5zcmVjCi0gICAgc2V0IGhlYWRlcl9zdHJpbmcgUzAxMzAwMDA3NDZENzA2NDY5NzIyRjYzNkY3MDc5MkU3MzcyNjU2Mzk3Ci19Ci0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke3NyZWNmaWxlfSJdCi0KLWlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotICAgIGZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLX0gZWxzZSB7Ci0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR7c3JlY2ZpbGV9IHRtcGRpci9jb3B5LnNyZWM7Ci0Jc2V0IHNyZWNmaWxlIHRtcGRpci9jb3B5LnNyZWM7Ci0gICAgfQotICAgIHNldCBmaWxlIFtvcGVuICR7c3JlY2ZpbGV9IHJdCi0KLSAgICAjIFRoZSBmaXJzdCBTIHJlY29yZCBpcyBmaXhlZCBieSB0aGUgZmlsZSBuYW1lIHdlIGFyZSB1c2luZy4KLSAgICBnZXRzICRmaWxlIGxpbmUKLSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLSAgICB2ZXJib3NlICRsaW5lCi0gICAgaWYgIVtyZWdleHAgIiRoZWFkZXJfc3RyaW5nLioiICRsaW5lXSB7Ci0Jc2VuZF9sb2cgImJhZCBoZWFkZXJcbiIKLQlmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi0gICAgfSBlbHNlIHsKLQl3aGlsZSB7W2dldHMgJGZpbGUgbGluZV0gIT0gLTEgXAotCSAgICAgICAmJiBbcmVnZXhwICJeU1xbMTIzXF1cWzAtOWEtZkEtRlxdK1xbXHJcblxdKiQiICRsaW5lXX0gewotCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkgICAgdmVyYm9zZSAkbGluZQotCSAgICBzZXQgbGluZSAiKipFT0YqKiIKLQl9Ci0Jc2VuZF9sb2cgIiRsaW5lXG4iCi0JdmVyYm9zZSAkbGluZQotCWlmICFbcmVnZXhwICJeU1xbNzg5XF1cWzAtOWEtZkEtRlxdK1xbXHJcblxdKiQiICRsaW5lXSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgImJhZCB0cmFpbGVyXG4iCi0JICAgIGZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLQl9IGVsc2UgewotCSAgICBpZiB7W2dldHMgJGZpbGUgbGluZV0gIT0gLTF9IHRoZW4gewotCQlzZW5kX2xvZyAiZ2FyYmFnZSBhdCBlbmRcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCXZlcmJvc2UgJGxpbmUKLQkJZmFpbCAib2JqY29weSAtTyBzcmVjIgotCSAgICB9IGVsc2UgewotCQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHtjb3B5ZmlsZX0uc3JlYyJdCi0JCWlmICFbcmVnZXhwICJmaWxlIGZvcm1hdCBzcmVjIiAkZ290XSB0aGVuIHsKLQkJICAgIHNlbmRfbG9nICJvYmpkdW1wIGZhaWxlZFxuIgotCQkgICAgZmFpbCAib2JqY29weSAtTyBzcmVjIgotCQl9IGVsc2UgewotCQkgICAgcGFzcyAib2JqY29weSAtTyBzcmVjIgotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgY2xvc2UgJGZpbGUKLX0KLQotIyBUZXN0IHNldHRpbmcgYW5kIGFkanVzdGluZyB0aGUgc3RhcnQgYWRkcmVzcy4gIFdlIG9ubHkgdGVzdCB0aGlzCi0jIHdoaWxlIGdlbmVyYXRpbmcgUyByZWNvcmRzLCBiZWNhdXNlIHdlIG1heSBub3QgYmUgYWJsZSB0byBzZXQgdGhlCi0jIHN0YXJ0IGFkZHJlc3MgZm9yIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMsIGFuZCB0aGUgUyByZWNvcmQgY2FzZQotIyBpcyB0aGUgb25seSB1c2VmdWwgb25lIGFueWhvdy4KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR0ZW1wZmlsZSJdCi1pZiAhW3JlZ2V4cCAic3RhcnQgYWRkcmVzcyAoXFswLTlhLWZBLUZ4WFxdKykiICRnb3QgYWxsIG9yaWdzdGFydF0gdGhlbiB7Ci0gICAgcGVycm9yICJvYmpkdW1wIGNhbiBub3QgcmVjb2duaXplIGJpbnRlc3QubyIKLSAgICBzZXQgb3JpZ3N0YXJ0ICIiCi19IGVsc2UgewotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjIC0tc2V0LXN0YXJ0IDB4NzY1NCJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0JZmFpbCAib2JqY29weSAtLXNldC1zdGFydCIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAke2NvcHlmaWxlfS5zcmVjIl0KLQlpZiAhW3JlZ2V4cCAiZmlsZSBmb3JtYXQgc3JlYy4qc3RhcnQgYWRkcmVzcyAoXFswLTlhLWZBLUZ4WFxdKykiICRnb3QgYWxsIHNyZWNzdGFydF0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1zZXQtc3RhcnQiCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRzcmVjc3RhcnQgIT0gMHg3NjU0fSB0aGVuIHsKLQkJc2VuZF9sb2cgIiRzcmVjc3RhcnQgIT0gMHg3NjU0XG4iCi0JCWZhaWwgIm9iamNvcHkgLS1zZXQtc3RhcnQiCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgIm9iamNvcHkgLS1zZXQtc3RhcnQiCi0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgLS1hZGp1c3Qtc3RhcnQgMHgxMjMiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHtjb3B5ZmlsZX0uc3JlYyJdCi0JaWYgIVtyZWdleHAgImZpbGUgZm9ybWF0IHNyZWMuKnN0YXJ0IGFkZHJlc3MgKFxbMC05YS1mQS1GeFhcXSspIiAkZ290IGFsbCBzcmVjc3RhcnRdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXN0YXJ0IgotCX0gZWxzZSB7Ci0JICAgIGlmIHskc3JlY3N0YXJ0ICE9ICRvcmlnc3RhcnQgKyAweDEyM30gdGhlbiB7Ci0JCXNlbmRfbG9nICIkc3JlY3N0YXJ0ICE9ICRvcmlnc3RhcnQgKyAweDEyM1xuIgotCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXN0YXJ0IgotCSAgICB9IGVsc2UgewotCQlwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXN0YXJ0IgotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotIyBUZXN0IGFkanVzdGluZyB0aGUgb3ZlcmFsbCBWTUEsIGFuZCBhZGp1c3RpbmcgdGhlIFZNQSBvZiBhCi0jIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFdlIGFnYWluIG9ubHkgdGVzdCB0aGlzIHdoZW4gZ2VuZXJhdGluZyBTCi0jIHJlY29yZHMuCi0KLXNldCBsb3cgIiIKLXNldCBsb3duYW1lICIiCi0KLXNldCBoZWFkZXJzIFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHRlbXBmaWxlIl0KLQotc2V0IGhlYWRlcnNfcmVnZXhwICJcWyAJMC05XF0rKFxbXiAJXF0rKVxbIAlcXSooXFswLTlhLWZBLUZcXSspXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKylcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rMlxbKlxdXFsqXF1cWzAtOVxdKyguKikiCi0KLXNldCBnb3QgJGhlYWRlcnMKLXdoaWxlIHtbcmVnZXhwICRoZWFkZXJzX3JlZ2V4cCAkZ290IGFsbCBuYW1lIHNpemUgdm1hIHJlc3RdfSB7Ci0gICAgc2V0IHZtYSAweCR2bWEKLSAgICBzZXQgc2l6ZSAweCRzaXplCi0gICAgaWYgeyRzaXplICE9IDB9IHsKLQlpZiB7JGxvdyA9PSAiIiB8fCAkdm1hIDwgJGxvd30gewotICAgICAgICAgICAgc2V0IGxvdyAkdm1hCi0JICAgIHNldCBsb3duYW1lICRuYW1lCi0JfQotICAgIH0KLSAgICBzZXQgZ290ICRyZXN0Ci19Ci0KLWlmIHskbG93ID09ICIiIHx8ICRvcmlnc3RhcnQgPT0gIiJ9IHRoZW4gewotICAgIHBlcnJvciAib2JqZHVtcCBjYW4gbm90IHJlY29nbml6ZSBiaW50ZXN0Lm8iCi19IGVsc2UgewotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjIC0tYWRqdXN0LXZtYSAweDEyMyJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0gICAgICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1maCAke2NvcHlmaWxlfS5zcmVjIl0KLQlzZXQgd2FudCAiZmlsZSBmb3JtYXQgc3JlYy4qc3RhcnQgYWRkcmVzc1xbIAlcXSooXFswLTlhLWZBLUZ4WFxdKykuKnNlYzFcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKSIKLQlpZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCBzdGFydCB2bWFdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLQl9IGVsc2UgewotCSAgICBzZXQgdm1hIDB4JHZtYQotCSAgICBpZiB7JHZtYSAhPSAkbG93ICsgMHgxMjN9IHRoZW4gewotCQlzZW5kX2xvZyAiJHZtYSAhPSAkbG93ICsgMHgxMjNcbiIKLQkJZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCi0JICAgIH0gZWxzZSB7Ci0JCWlmIHskc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzfSB0aGVuIHsKLQkJICAgIHNlbmRfbG9nICIkc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzXG4iCi0JCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLQkJfSBlbHNlIHsKLQkJICAgIHBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgc2V0IGFyZyAiIgotICAgIHNldCBnb3QgJGhlYWRlcnMKLSAgICB3aGlsZSB7W3JlZ2V4cCAkaGVhZGVyc19yZWdleHAgJGdvdCBhbGwgbmFtZSBzaXplIHZtYSByZXN0XX0gewotCXNldCB2bWEgMHgkdm1hCi0JaWYgeyR2bWEgPT0gJGxvd30gdGhlbiB7Ci0JICAgIHNldCBhcmcgIiRhcmcgLS1hZGp1c3Qtc2VjdGlvbi12bWEgJG5hbWUrNCIKLQl9Ci0Jc2V0IGdvdCAkcmVzdAotICAgIH0KLQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjICRhcmciXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgKyIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAke2NvcHlmaWxlfS5zcmVjIl0KLQlzZXQgd2FudCAiZmlsZSBmb3JtYXQgc3JlYy4qc2VjMVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspIgotCWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHZtYV0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgKyIKLQl9IGVsc2UgewotCSAgICBzZXQgdm1hIDB4JHZtYQotCSAgICBpZiB7JHZtYSAhPSAkbG93ICsgNH0gdGhlbiB7Ci0JCXNlbmRfbG9nICIkdm1hICE9ICRsb3cgKyA0XG4iCi0JCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgKyIKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHJlZ3N1YiAtYWxsICJcXCs0IiAkYXJnICI9W2V4cHIgJGxvdyArIDRdIiBhcmdlcQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjICRhcmdlcSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0JZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSA9IgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR7Y29weWZpbGV9LnNyZWMiXQotCXNldCB3YW50ICJmaWxlIGZvcm1hdCBzcmVjLipzZWMxXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKykiCi0JaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdm1hXSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSA9IgotCX0gZWxzZSB7Ci0JICAgIHNldCB2bWEgMHgkdm1hCi0JICAgIGlmIHskdm1hICE9ICRsb3cgKyA0fSB0aGVuIHsKLQkJc2VuZF9sb2cgIiR2bWEgIT0gJGxvdyArIDRcbiIKLQkJZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSA9IgotCSAgICB9IGVsc2UgewotCQlwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCi0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0jIFRlc3Qgc3RyaXBwaW5nIGFuIG9iamVjdC4KLQotcHJvYyBzdHJpcF90ZXN0IHsgfSB7Ci0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIFNUUklQCi0gICAgZ2xvYmFsIFNUUklQRkxBR1MKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdCAic3RyaXAiCi0KLSAgICBpZiB7IFt0YXJnZXRfY29tcGlsZSAkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyB0bXBkaXIvdGVzdHByb2cubyBvYmplY3QgZGVidWddICE9ICIiIH0gewotCXVudGVzdGVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZy5vXTsKLSAgICB9IGVsc2UgewotCXNldCBvYmpmaWxlIHRtcGRpci90ZXN0cHJvZy5vCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJFNUUklQICIkU1RSSVBGTEFHUyAkb2JqZmlsZSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICROTSAiLWEgJE5NRkxBR1MgJG9iamZpbGUiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIqOiBubyBzeW1ib2xzKiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3QKLX0KLQotc3RyaXBfdGVzdAotCi0jIFRlc3Qgc3RyaXBwaW5nIGFuIG9iamVjdCBmaWxlIHdpdGggc2F2aW5nIGEgc3ltYm9sCi0KLXByb2Mgc3RyaXBfdGVzdF93aXRoX3NhdmluZ19hX3N5bWJvbCB7IH0gewotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBTVFJJUAotICAgIGdsb2JhbCBTVFJJUEZMQUdTCi0gICAgZ2xvYmFsIE5NCi0gICAgZ2xvYmFsIE5NRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotCi0gICAgc2V0IHRlc3QgInN0cmlwIHdpdGggc2F2aW5nIGEgc3ltYm9sIgotCi0gICAgaWYgeyBbdGFyZ2V0X2NvbXBpbGUgJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgdG1wZGlyL3Rlc3Rwcm9nLm8gb2JqZWN0IGRlYnVnXSAhPSAiIiB9IHsKLQl1bnRlc3RlZCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2cub107Ci0gICAgfSBlbHNlIHsKLQlzZXQgb2JqZmlsZSB0bXBkaXIvdGVzdHByb2cubwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRTVFJJUCAiJFNUUklQRkxBR1MgLUsgbWFpbiAtSyBfbWFpbiAkb2JqZmlsZSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgJG9iamZpbGUiXQotICAgIGlmIHshW3JlZ2V4cCB7XihbMC05YS1mQS1GXSspP1sgXStUIG1haW59ICRleGVjX291dHB1dF0gXAotICAgICAgICAgJiYgIVtyZWdleHAge14oWzAtOWEtZkEtRl0rKT9bIF0rVCBfbWFpbn0gJGV4ZWNfb3V0cHV0XX0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLXN0cmlwX3Rlc3Rfd2l0aF9zYXZpbmdfYV9zeW1ib2wKLQotIyBCdWlsZCBhIGZpbmFsIGV4ZWN1dGFibGUuCi0KLXByb2MgY29weV9zZXR1cCB7IH0gewotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgCi0gICAgc2V0IHJlcyBbYnVpbGRfd3JhcHBlciB0ZXN0Z2x1ZS5vXTsKLSAgICBzZXQgZmxhZ3MgeyBkZWJ1ZyB9OwotICAgIAotICAgIGlmIHsgJHJlcyAhPSAiIiB9IHsKLQlsYXBwZW5kIGZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPVtsaW5kZXggJHJlcyAxXSI7Ci0Jc2V0IGFkZF9saWJzICJ0ZXN0Z2x1ZS5vIjsKLSAgICB9IGVsc2UgewotCXNldCBhZGRfbGlicyAiIjsKLSAgICB9Ci0KLSAgICBpZiB7IFt0YXJnZXRfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgJGFkZF9saWJzIiB0bXBkaXIvdGVzdHByb2cgZXhlY3V0YWJsZSAkZmxhZ3NdICAhPSAiIiB9IHsKLQlyZXR1cm4gMgotICAgIH0KLQotICAgIHNldCByZXN1bHQgW3JlbW90ZV9sb2FkIHRhcmdldCB0bXBkaXIvdGVzdHByb2ddOwotICAgIHNldCBzdGF0dXMgW2xpbmRleCAkcmVzdWx0IDBdOwotCi0gICAgaWYgeyAkc3RhdHVzICE9ICJwYXNzIiAgfSB7Ci0JcGVycm9yICJ1bnJlc29sdmVkIHNldHVwLCBzdGF0dXMgPSAkc3RhdHVzIgotCXJldHVybiAzCi0gICAgfQotCi0gICAgcmV0dXJuIDAKLX0KLQotIyBUZXN0IGNvcHlpbmcgYW4gZXhlY3V0YWJsZS4KLQotcHJvYyBjb3B5X2V4ZWN1dGFibGUgeyBwcm9nIGZsYWdzIHRlc3QxIHRlc3QyIH0gewotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IHRlc3RmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2ddOwotCXNldCB0ZXN0Y29weSBjb3B5cHJvZwotICAgIH0gZWxzZSB7Ci0Jc2V0IHRlc3RmaWxlIHRtcGRpci90ZXN0cHJvZwotCXNldCB0ZXN0Y29weSB0bXBkaXIvY29weXByb2cKLSAgICB9Ci0gICAgcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJHRlc3Rjb3B5OwotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAkdGVzdGZpbGUgJHRlc3Rjb3B5Il0KLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QxCi0JZmFpbCAkdGVzdDIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHRlc3Rjb3B5IHRtcGRpci9jb3B5cHJvZwotICAgIH0KLQotICAgIHNldCBzdGF0dXMgW3JlbW90ZV9leGVjIGJ1aWxkICJjbXAiICJ0bXBkaXIvdGVzdHByb2cgdG1wZGlyL2NvcHlwcm9nIl0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2xpbmRleCAkc3RhdHVzIDFdOwotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXBhc3MgJHRlc3QxCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCi0JIyBUaGlzIHdpbGwgZmFpbCBmb3IgbWFueSByZWFzb25zLiAgRm9yIGV4YW1wbGUsIGl0IHdpbGwgbW9zdAotCSMgbGlrZWx5IGZhaWwgaWYgYSBub24tR05VIGxpbmtlciBpcyB1c2VkLiAgVGhlcmVmb3JlLCB3ZSBkbwotCSMgbm90IGluc2lzdCB0aGF0IGl0IHBhc3MuICBJZiB5b3UgYXJlIHVzaW5nIGFuIGFzc2VtYmxlciBhbmQKLQkjIGxpbmtlciBiYXNlZCBvbiB0aGUgc2FtZSBCRkQgYXMgb2JqY29weSwgaXQgaXMgd29ydGgKLQkjIGludmVzdGlnYXRpbmcgdG8gc2VlIHdoeSB0aGlzIGZhaWx1cmUgb2NjdXJzLiAgSWYgd2UgYXJlCi0JIyBjcm9zcyBjb21waWxpbmcsIHdlIGFzc3VtZSB0aGF0IGEgR05VIGxpbmtlciBpcyBiZWluZyB1c2VkLAotCSMgYW5kIGV4cGVjdCBpdCB0byBzdWNjZWVkLgotCWlmIHtbaXNuYXRpdmVdfSB0aGVuIHsKLQkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgotCX0KLQotCSMgVGhpcyBhbHNvIGZhaWxzIGZvciBtaXBzKi0qLWVsZiB0YXJnZXRzLiAgU2VlIGVsZjMyLW1pcHMuYwotCSMgbWlwc19lbGZfc3ltX2lzX2dsb2JhbC4KLQlzZXR1cF94ZmFpbCAibWlwcyotKi1lbGYiCi0KLQlmYWlsICR0ZXN0MQotICAgIH0KLQotICAgIHNldCBvdXRwdXQgW3JlbW90ZV9sb2FkIHRhcmdldCB0bXBkaXIvY29weXByb2ddCi0gICAgc2V0IHN0YXR1cyBbbGluZGV4ICRvdXRwdXQgMF07Ci0gICAgaWYgeyAkc3RhdHVzICE9ICJwYXNzIiB9IHsKLQlmYWlsICR0ZXN0MgotICAgIH0gZWxzZSB7Ci0JcGFzcyAkdGVzdDIKLSAgICB9Ci19Ci0KLSMgVGVzdCBzdHJpcHBpbmcgYW4gZXhlY3V0YWJsZQotCi1wcm9jIHN0cmlwX2V4ZWN1dGFibGUgeyBwcm9nIGZsYWdzIHRlc3QgfSB7Ci0gICAgZ2xvYmFsIE5NCi0gICAgZ2xvYmFsIE5NRkxBR1MKLQotICAgIHJlbW90ZV9kb3dubG9hZCBidWlsZCB0bXBkaXIvY29weXByb2cgdG1wZGlyL3N0cmlwcm9nCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IGNvcHlmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvc3RyaXByb2ddOwotICAgIH0gZWxzZSB7Ci0Jc2V0IGNvcHlmaWxlIHRtcGRpci9zdHJpcHJvZwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRwcm9nICIkZmxhZ3MgJHtjb3B5ZmlsZX0iXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHtjb3B5ZmlsZX0gdG1wZGlyL3N0cmlwcm9nOwotICAgIH0KLQotICAgIHNldCByZXN1bHQgW3JlbW90ZV9sb2FkIHRhcmdldCB0bXBkaXIvc3RyaXByb2ddCi0gICAgc2V0IHN0YXR1cyBbbGluZGV4ICRyZXN1bHQgMF07Ci0gICAgaWYgeyAkc3RhdHVzICE9ICJwYXNzIiB9IHsKLQlmYWlsICR0ZXN0Ci0gICAgICAgIHJldHVybgotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgJHtjb3B5ZmlsZX0iXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIqOiBubyBzeW1ib2xzKiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLSMgVGVzdCBzdHJpcHBpbmcgYW4gZXhlY3V0YWJsZSB3aXRoIHNhdmluZyBhIHN5bWJvbAotCi1wcm9jIHN0cmlwX2V4ZWN1dGFibGVfd2l0aF9zYXZpbmdfYV9zeW1ib2wgeyBwcm9nIGZsYWdzIHRlc3QgfSB7Ci0gICAgZ2xvYmFsIE5NCi0gICAgZ2xvYmFsIE5NRkxBR1MKLQotICAgIHJlbW90ZV9kb3dubG9hZCBidWlsZCB0bXBkaXIvY29weXByb2cgdG1wZGlyL3N0cmlwcm9nCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IGNvcHlmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvc3RyaXByb2ddOwotICAgIH0gZWxzZSB7Ci0Jc2V0IGNvcHlmaWxlIHRtcGRpci9zdHJpcHJvZwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRwcm9nICIkZmxhZ3MgJHtjb3B5ZmlsZX0iXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHtjb3B5ZmlsZX0gdG1wZGlyL3N0cmlwcm9nOwotICAgIH0KLQotICAgIHNldCByZXN1bHQgW3JlbW90ZV9sb2FkIHRhcmdldCB0bXBkaXIvc3RyaXByb2ddCi0gICAgc2V0IHN0YXR1cyBbbGluZGV4ICRyZXN1bHQgMF07Ci0gICAgaWYgeyAkc3RhdHVzICE9ICJwYXNzIiB9IHsKLQlmYWlsICR0ZXN0Ci0gICAgICAgIHJldHVybgotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgJHtjb3B5ZmlsZX0iXQotICAgIGlmIHshW3JlZ2V4cCB7XlswLTlhLWZBLUZdKyBUIG1haW59ICRleGVjX291dHB1dF0gXAotICAgICAgICAgJiYgIVtyZWdleHAge15bMC05YS1mQS1GXSsgVCBfbWFpbn0gJGV4ZWNfb3V0cHV0XX0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0gICAgcGFzcyAkdGVzdAotfQotCi1zZXQgdGVzdDEgInNpbXBsZSBvYmpjb3B5IG9mIGV4ZWN1dGFibGUiCi1zZXQgdGVzdDIgInJ1biBvYmpjb3B5IG9mIGV4ZWN1dGFibGUiCi1zZXQgdGVzdDMgInJ1biBzdHJpcHBlZCBleGVjdXRhYmxlIgotc2V0IHRlc3Q0ICJydW4gc3RyaXBwZWQgZXhlY3V0YWJsZSB3aXRoIHNhdmluZyBhIHN5bWJvbCIKLQotc3dpdGNoIFtjb3B5X3NldHVwXSB7Ci0gICAgIjEiIHsKLQkjIGRvIG5vdGhpbmcKLSAgICB9Ci0gICAgIjIiIHsKLQl1bnRlc3RlZCAkdGVzdDEKLQl1bnRlc3RlZCAkdGVzdDIKLQl1bnRlc3RlZCAkdGVzdDMKLQl1bnRlc3RlZCAkdGVzdDQKLSAgICB9Ci0gICAgIjMiIHsKLQl1bnJlc29sdmVkICR0ZXN0MQotCXVucmVzb2x2ZWQgJHRlc3QyCi0JdW5yZXNvbHZlZCAkdGVzdDMKLQl1bnJlc29sdmVkICR0ZXN0NAotICAgIH0KLSAgICAiMCIgewotCWNvcHlfZXhlY3V0YWJsZSAiJE9CSkNPUFkiICIkT0JKQ09QWUZMQUdTIiAiJHRlc3QxIiAiJHRlc3QyIgotCXN0cmlwX2V4ZWN1dGFibGUgIiRTVFJJUCIgIiRTVFJJUEZMQUdTIiAiJHRlc3QzIgotCXN0cmlwX2V4ZWN1dGFibGVfd2l0aF9zYXZpbmdfYV9zeW1ib2wgIiRTVFJJUCIgIi1LIG1haW4gLUsgX21haW4gJFNUUklQRkxBR1MiICIkdGVzdDQiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqZHVtcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZmIzNGMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgcmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkT0JKRFVNUF0gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkT0JKRFVNUCBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRPQkpEVU1QXSIKLQotIyBTaW1wbGUgdGVzdCBvZiBvYmpkdW1wIC1pCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaSJdCi0KLXNldCBjcHVzX2V4cGVjdGVkICIoYTI5a3xhbGxpYW50fGFscGhhfGFyY3xhcm18Y29udmV4fGQxMHZ8ZDMwdnxmcjMwfGg4fGhwcGF8aTM4NnxpODYwfGk5NjB8bTMycnxtNjhrfG04OGt8TUNvcmV8bWlwc3xtbjEwMjAwfG1uMTAzMDB8bnMzMmt8cG93ZXJwY3xweXJhbWlkfHJvbXB8cnM2MDAwfHNofHNwYXJjfHRhaG9lfHY4NTB8dmF4fHdlMzJrfHo4a3x6ODAwMXx6ODAwMikiCi0KLSMgTWFrZSBzdXJlIHRoZSB0YXJnZXQgQ1BVIHNob3dzIHVwIGluIHRoZSBsaXN0LgotaWYgIVtyZWdleHAgJGNwdXNfZXhwZWN0ZWQgJHRhcmdldF9jcHVdIHsKLSAgICByZWdzdWIgIl5cWyhcXSIgIiRjcHVzX2V4cGVjdGVkIiAiKCR7dGFyZ2V0X2NwdX18IiBjcHVzX2V4cGVjdGVkOwotfQotCi1zZXQgd2FudCAiQkZEIGhlYWRlciBmaWxlIHZlcnNpb24uKnNyZWNcW15cblxdKlxuXFteXG5cXSpoZWFkZXIgXFteXG5cXSplbmRpYW5cW15cblxdKiwgZGF0YSBcW15cblxdKmVuZGlhbi4qJGNwdXNfZXhwZWN0ZWQiCi0KLWlmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgcGFzcyAib2JqZHVtcCAtaSIKLX0gZWxzZSB7Ci0gICAgZmFpbCAib2JqZHVtcCAtaSIKLX0KLQotIyBUaGUgcmVtYWluaW5nIHRlc3RzIHJlcXVpcmUgYSB0ZXN0IGZpbGUuCi0KLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVzdGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi19IGVsc2UgewotICAgIHNldCB0ZXN0ZmlsZSB0bXBkaXIvYmludGVzdC5vCi19Ci0KLSMgVGVzdCBvYmpkdW1wIC1mCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qYXJjaGl0ZWN0dXJlOlxbIAlcXSoke2NwdXNfZXhwZWN0ZWR9LipIQVNfUkVMT0MuKkhBU19TWU1TIgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBmYWlsICJvYmpkdW1wIC1mIgotfSBlbHNlIHsKLSAgICBwYXNzICJvYmpkdW1wIC1mIgotfQotCi0jIFRlc3Qgb2JqZHVtcCAtaAotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKlNlY3Rpb25zLipcWzAtOVxdK1xbIAlcXStcW14gCVxdKih0ZXh0fFRFWFR8XFxcJENPREVcXFwkKVxbXiAJXF0qXFsgCVxdKihcWzAtOWEtZkEtRlxdKykuKlxbMC05XF0rXFsgCVxdK1xbXiAJXF0qKFxcLmRhdGF8REFUQSlcW14gCVxdKlxbIAlcXSooXFswLTlhLWZBLUZcXSspIgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB0ZXh0X25hbWUgdGV4dF9zaXplIGRhdGFfbmFtZSBkYXRhX3NpemVdIHRoZW4gewotICAgIGZhaWwgIm9iamR1bXAgLWgiCi19IGVsc2UgewotICAgIHZlcmJvc2UgInRleHQgbmFtZSBpcyAkdGV4dF9uYW1lIHNpemUgaXMgJHRleHRfc2l6ZSIKLSAgICB2ZXJib3NlICJkYXRhIG5hbWUgaXMgJGRhdGFfbmFtZSBzaXplIGlzICRkYXRhX3NpemUiCi0gICAgaWYge1tleHByICIweCR0ZXh0X3NpemUiXSA8IDggfHwgW2V4cHIgIjB4JGRhdGFfc2l6ZSJdIDwgNH0gdGhlbiB7Ci0Jc2VuZF9sb2cgInNpemVzIHRvbyBzbWFsbFxuIgotCWZhaWwgIm9iamR1bXAgLWgiCi0gICAgfSBlbHNlIHsKLQlwYXNzICJvYmpkdW1wIC1oIgotICAgIH0KLX0KLQotIyBUZXN0IG9iamR1bXAgLXQKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC10ICR0ZXN0ZmlsZSJdCi0KLWlmIFtpbmZvIGV4aXN0cyB2YXJzXSB0aGVuIHsgdW5zZXQgdmFycyB9Ci13aGlsZSB7W3JlZ2V4cCAiKFxbYS16XF0qX3N5bWJvbCkoLiopIiAkZ290IGFsbCBzeW1ib2wgcmVzdF19IHsKLSAgICBzZXQgdmFycygkc3ltYm9sKSAxCi0gICAgc2V0IGdvdCAkcmVzdAotfQotCi1pZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRleHRfc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZGF0YV9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhjb21tb25fc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZXh0ZXJuYWxfc3ltYm9sKV19IHRoZW4gewotICAgIGZhaWwgIm9iamR1bXAgLXQiCi19IGVsc2UgewotICAgIHBhc3MgIm9iamR1bXAgLXQiCi19Ci0KLSMgVGVzdCBvYmpkdW1wIC1yCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtciAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcXFxbXFteXF1cXSoodGV4dHxURVhUfFxcXCRDT0RFXFxcJClcW15cXVxdKlxcXF0uKmV4dGVybmFsX3N5bWJvbCIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJvYmpkdW1wIC1yIgotfSBlbHNlIHsKLSAgICBmYWlsICJvYmpkdW1wIC1yIgotfQotCi0jIFRlc3Qgb2JqZHVtcCAtcwotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXMgJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKkNvbnRlbnRzLioodGV4dHxURVhUfFxcXCRDT0RFXFxcJClcW14wLTlcXSpcWyAJXF0qXFswLTlhLWZBLUZcXSpcWyAJXF0qKDAwMDAwMDAxfDAxMDAwMDAwKS4qQ29udGVudHMuKihkYXRhfERBVEEpXFteMC05XF0qXFsgCVxdKlxbMC05YS1mQS1GXF0qXFsgCVxdKigwMDAwMDAwMnwwMjAwMDAwMCkiCi0KLWlmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgcGFzcyAib2JqZHVtcCAtcyIKLX0gZWxzZSB7Ci0gICAgZmFpbCAib2JqZHVtcCAtcyIKLX0KLQotIyBPcHRpb25zIHdoaWNoIGFyZSBub3QgdGVzdGVkOiAtYSAtZCAtRCAtUiAtVCAteCAtbCAtLXN0YWJzCi0jIEkgZG9uJ3Qgc2VlIGFueSBnZW5lcmljIHdheSB0byB0ZXN0IGFueSBvZiB0aGVzZSBvdGhlciB0aGFuIC1hLgotIyBUZXN0cyBjb3VsZCBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyB0YXJnZXRzLCBhbmQgdGhhdCBzaG91bGQgYmUgZG9uZQotIyBpZiBzcGVjaWZpYyBwcm9ibGVtcyBhcmUgZm91bmQuCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmNzQ0Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBXcml0dGVuIGJ5IE5pY2sgQ2xpZnRvICA8bmlja2NAY3lnbnVzLmNvbT4KLSMgQmFzZWQgb24gc2NyaXB0cyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotIyBhbmQgS2VuIFJhZWJ1cm4gPHJhZWJ1cm5AY3lnbnVzLmNvbT4uCi0KLSMgRmlyc3Qgc29tZSBoZWxwZnVsIHByb2NlZHVyZXMsIHRoZW4gdGhlIHRlc3RzIHRoZW1zZWx2ZXMKLQotIyBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlbmFtZSBnaXZlbgotcHJvYyBmaWxlX2NvbnRlbnRzIHsgZmlsZW5hbWUgfSB7Ci0gICAgc2V0IGZpbGUgW29wZW4gJGZpbGVuYW1lIHJdCi0gICAgc2V0IGNvbnRlbnRzIFtyZWFkICRmaWxlXQotICAgIGNsb3NlICRmaWxlCi0gICAgcmV0dXJuICRjb250ZW50cwotfQotCi0jIHJlZ2V4cF9kaWZmLCBiYXNlZCBvbiBzaW1wbGVfZGlmZiB0YWtlbiBmcm9tIGxkIHRlc3Qgc3VpdGUKLSMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQotIwlmaWxlMSBjb250YWlucyBzdHJpbmdzLCBmaWxlMiBjb250YWlucyByZWdleHBzIGFuZCAjLWNvbW1lbnRzCi0jCWJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkIGluIGVpdGhlciBmaWxlCi0jCXJldHVybnMgbm9uLXplcm8gaWYgZGlmZmVyZW5jZXMgZXhpc3QKLSMKLXByb2MgcmVnZXhwX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0gewotCi0gICAgc2V0IGVvZiAtMQotICAgIHNldCBlbmRfMSAwCi0gICAgc2V0IGVuZF8yIDAKLSAgICBzZXQgZGlmZmVyZW5jZXMgMAotICAgIHNldCBkaWZmX3Bhc3MgMAotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzFdIHRoZW4gewotCXNldCBmaWxlX2EgW29wZW4gJGZpbGVfMSByXQotICAgIH0gZWxzZSB7Ci0Jd2FybmluZyAiJGZpbGVfMSBkb2Vzbid0IGV4aXN0IgotCXJldHVybiAxCi0gICAgfQotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzJdIHRoZW4gewotCXNldCBmaWxlX2IgW29wZW4gJGZpbGVfMiByXQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGZpbGVfMiBkb2Vzbid0IGV4aXN0IgotCWNsb3NlICRmaWxlX2EKLQlyZXR1cm4gMQotICAgIH0KLQotICAgIHZlcmJvc2UgIiBSZWdleHAtZGlmZidpbmc6ICRmaWxlXzEgJGZpbGVfMiIgMgotCi0gICAgd2hpbGUgeyAxIH0gewotCXNldCBsaW5lX2EgIiIKLQlzZXQgbGluZV9iICIiCi0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9hXSA9PSAwIH0gewotCSAgICBpZiB7IFtnZXRzICRmaWxlX2EgbGluZV9hXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzEgMQotCQlicmVhawotCSAgICB9Ci0JfQotCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYl0gPT0gMCB8fCBbc3RyaW5nIG1hdGNoICIjKiIgJGxpbmVfYl0gfSB7Ci0JICAgIGlmIFsgc3RyaW5nIG1hdGNoICIjcGFzcyIgJGxpbmVfYiBdIHsKLQkJc2V0IGVuZF8yIDEKLQkJc2V0IGRpZmZfcGFzcyAxCi0JCWJyZWFrCi0JICAgIH0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9iIGxpbmVfYl0gPT0gJGVvZiB9IHsKLQkJc2V0IGVuZF8yIDEKLQkJYnJlYWsKLQkgICAgfQotCX0KLQotICAgICAgICBpZiB7ICRkaWZmX3Bhc3MgfSB7IAotICAgICAgICAgICAgYnJlYWsgCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xICYmICRlbmRfMiB9IHsgCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xIiAzCi0gICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzIgfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVyYm9zZSAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIiIgMwotICAgICAgICAgICAgaWYgIVtyZWdleHAgIl4kbGluZV9iJCIgIiRsaW5lX2EiXSB7Ci0JCXNlbmRfbG9nICJyZWdleHBfZGlmZiBtYXRjaCBmYWlsdXJlXG4iCi0JCXNlbmRfbG9nICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiXG4iCi0JCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIHsgJGRpZmZlcmVuY2VzID09IDAgJiYgISRkaWZmX3Bhc3MgJiYgW2VvZiAkZmlsZV9hXSAhPSBbZW9mICRmaWxlX2JdIH0gewotCXNlbmRfbG9nICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3Roc1xuIgotCXZlcmJvc2UgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzIiAzCi0Jc2V0IGRpZmZlcmVuY2VzIDEKLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZV9hCi0gICAgY2xvc2UgJGZpbGVfYgotCi0gICAgcmV0dXJuICRkaWZmZXJlbmNlcwotfQotCi0jIFJ1biBhbiBpbmRpdmlkdWFsIHJlYWRlbGYgdGVzdC4KLSMgQmFzaWNhbGx5IHJlYWRlbGYgaXMgcnVuIG9uIHRoZSBiaW5hcnlfZmlsZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLgotIyBSZWFkZWxmJ3Mgb3V0cHV0IGlzIGNhcHR1cmVkIGFuZCB0aGVuIGNvbXBhcmVkIGFnYWluc3QgdGhlIGNvbnRlbnRzCi0jIG9mIHRoZSByZWdleHBfZmlsZS4KLQotcHJvYyByZWFkZWxmX3Rlc3QgeyBvcHRpb25zIGJpbmFyeV9maWxlIHJlZ2V4cF9maWxlIHhmYWlscyB9IHsKLQotICAgIGdsb2JhbCBSRUFERUxGCi0gICAgZ2xvYmFsIFJFQURFTEZGTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgCi0gICAgc2VuZF9sb2cgImV4ZWMgJFJFQURFTEYgJFJFQURFTEZGTEFHUyAkb3B0aW9ucyAkYmluYXJ5X2ZpbGUgPiByZWFkZWxmLm91dCIKLSAgICBjYXRjaCAiZXhlYyAkUkVBREVMRiAkUkVBREVMRkZMQUdTICRvcHRpb25zICRiaW5hcnlfZmlsZSA+IHJlYWRlbGYub3V0IiBnb3QKLQotICAgIGlmIHsgW2xsZW5ndGggJHhmYWlsc10gIT0gMCB9IHRoZW4gewotCXNldHVwX3hmYWlsICR4ZmFpbHMKLSAgICB9Ci0gICAgCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0Jc2VuZF9sb2cgJGdvdAotCWZhaWwgInJlYWRlbGYgJG9wdGlvbnMiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgcmVhZGVsZi5vdXQgJHNyY2Rpci8kc3ViZGlyLyRyZWdleHBfZmlsZV0gfSB0aGVuIHsKLQlmYWlsICJyZWFkZWxmICRvcHRpb25zIgotCXZlcmJvc2UgIm91dHB1dCBpcyBcbltmaWxlX2NvbnRlbnRzIHJlYWRlbGYub3V0XSIgMgotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgInJlYWRlbGYgJG9wdGlvbnMiCi19Ci0KLQotCi0jIE9ubHkgRUxGIGJhc2VkIHRvb2xjaGFpbnMgbmVlZCByZWFkZWxmLgotIyBGb3Igbm93IGJlIHBhcmFub2lkIGFuZCBhc3N1bWUgdGhhdCBpZiBFTEYgaXMgbm90IG1lbnRpb25lZAotIyBpbiB0aGUgdGFyZ2V0IHN0cmluZywgdGhlbiB0aGUgdGFyZ2V0IGlzIG5vdCBhbiBFTEYgYmFzZWQgcG9ydC4KLQotaWYgIVtpc3RhcmdldCAiKi0qZWxmIl0gdGhlbiB7Ci0gICAgdmVyYm9zZSAiJFJFQURFTEYgaXMgb25seSBpbnRlbnRlZGVkIGZvciBFTEYgdGFyZ2V0cyIgMgotICAgIHJldHVybgotfQotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkUkVBREVMRl0gPT0gMH0gdGhlbiB7Ci0gICAgICAgIHBlcnJvciAiJFJFQURFTEYgZG9lcyBub3QgZXhpc3QiCi0gICAgICAgIHJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJFJFQURFTEZdIgotCi0jIEFzc2VtbGUgdGhlIHRlc3QgZmlsZS4KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHBlcnJvciAidW5yZXNvbHZlZCAxIgotICAgIHVucmVzb2x2ZWQgInJlYWRlbGYgLSBmYWlsZWQgdG8gYXNzZW1ibGUiCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVtcGZpbGUgdG1wZGlyL2JpbnRlc3QubzsKLX0gZWxzZSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfQotCi0jIFJ1biB0aGUgdGVzdHMKLXJlYWRlbGZfdGVzdCAtaCAkdGVtcGZpbGUgcmVhZGVsZi5oICB7fQotCi0jIFRoZSB2ODUwIGZhaWxzIHRoZSBuZXh0IHR3byB0ZXN0cyBiZWNhdXNlIGl0IGNyZWF0ZXMgdHdvIHNwZWNpYWwKLSMgc2VjdGlvbnMgb2YgaXRzIG93bjogLmNhbGxfdGFibGVfZGF0YSBhbmQgLmNhbGxfdGFibGVfdGV4dAotIyBUaGUgcmVnZXhwIHNjcmlwdHMgYXJlIG5vdCBleHBlY3RpbmcgdGhlc2Ugc2VjdGlvbnMuLi4KLQotcmVhZGVsZl90ZXN0IC1TICR0ZW1wZmlsZSByZWFkZWxmLnMgIHt2ODUwKi0qLSp9Ci1yZWFkZWxmX3Rlc3QgLXMgJHRlbXBmaWxlIHJlYWRlbGYuc3Mge3Y4NTAqLSotKn0KLXJlYWRlbGZfdGVzdCAtciAkdGVtcGZpbGUgcmVhZGVsZi5yICB7fQotCi0KLSMgQ29tcGlsZSB0aGUgc2Vjb25kIHRlc3QgZmlsZS4KLWlmIHsgW3RhcmdldF9jb21waWxlICRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jIHRtcGRpci90ZXN0cHJvZy5vIG9iamVjdCBkZWJ1Z10gIT0gIiIgfSB7Ci0gICAgdW50ZXN0ZWQgInJlYWRlbGYgLXciCi0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZW1wZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nLm9dOwotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgdG1wZGlyL3Rlc3Rwcm9nLm8KLX0KLQotIyBUaGUgeGZhaWwgdGFyZ2V0cyBoZXJlIGRvIG5vdCBkZWZhdWx0IHRvIERXQVJGMiBmb3JtYXQgZGVidWcgaW5mb3JtYXRpb24KLSMgVGhlIHN5bXB0b20gaXMgdGhhdCB0aGUgb3V0cHV0IG9mICdyZWFkZWxmIC13aScgaXMgZW1wdHkuCi0KLXJlYWRlbGZfdGVzdCAtd2kgJHRlbXBmaWxlIHJlYWRlbGYud2kge3Y4NTAqLSotKn0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5oIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGVhYjUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1FTEYgSGVhZGVyOgotICBNYWdpYzogICA3ZiA0NSA0YyA0NiAwWzEyXSAwWzEyXSAwMSAuLiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAKLSAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEZbMzZdWzI0XQotICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIncyBjb21wbGVtZW50LC4qIGVuZGlhbgotICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgXChjdXJyZW50XCkKLSAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuKgotICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgIC4qCi0gIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMIFwoUmVsb2NhdGFibGUgZmlsZVwpCi0gIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKLSAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweDAKLSAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAwIFwoYnl0ZXMgaW50byBmaWxlXCkKLSAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAuKiBcKGJ5dGVzIGludG8gZmlsZVwpCi0gIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAuKiBcKGJ5dGVzXCkKLSAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICAwIFwoYnl0ZXNcKQotICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgIDAKLSAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAuKiBcKGJ5dGVzXCkKLSAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAuKgotICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6IC4qCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuciBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ5NjU5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLVJlbG9jYXRpb24gc2VjdGlvbiAnLnJlbC4qdGV4dCcgYXQgb2Zmc2V0IDB4LiogY29udGFpbnMgMSBlbnRyaWVzOgotICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lLioKLSAgMDAwMDAwMDQgIDAwLiogUl8uKjAwMDAwMDAwICBleHRlcm5hbF9zeW1ib2wuKgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiMTI0NS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLVRoZXJlIGFyZSAuKiBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAuKjoKLQotU2VjdGlvbiBIZWFkZXJzOgotICBcW05yXF0gTmFtZSAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxnIExrIEluZiBBbAotICBcWyAwXF0gICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgIDAwMDAwMDAwIDAwMDAwMCAwMDAwMDAgMDAgICAgICAwICAgMCAwCi0gIFxbIDFcXSAudGV4dCAgICAgICAgICAgICBQUk9HQklUUyAgICAgICAgMDAwMDAwMDAgMDAwMDM0IDAwMDAwOCAwMCAgQVggIDAgICAwIC4KLSAgXFsgMlxdIC5yZWwuK3RleHQgK1JFTC4gKzArIDArLiogMDAwMDAuIDAuICAgICAgLiAgIDEgNAotICBcWyAzXF0gLmRhdGEgICAgICAgICAgICAgUFJPR0JJVFMgICAgICAgIDAwMDAwMDAwIDAwMDAzYyAwMDAwMDQgMDAgV0EgICAwICAgMCAuCi0gIFxbIDRcXSAuYnNzICAgICAgICAgICAgICBOT0JJVFMgICAgICAgICAgMDAwMDAwMDAgMDAwMDQwIDAwMDAwMCAwMCBXQSAgIDAgICAwIC4KLSAgXFsgNVxdIC5zaHN0cnRhYiAgICAgICAgIFNUUlRBQiAgICAgICAgICAwMDAwMDAwMCAwMDAwNDAgMDAwMC4qIDAwICAgICAgMCAgIDAgLgotICBcWyA2XF0gLnN5bXRhYiAgICAgICAgICAgU1lNVEFCICAgICAgICAgIDAwMDAwMDAwIDArLiogMCsuKiAxMCAgICAgIDcgICA2IDQKLSAgXFsgN1xdIC5zdHJ0YWIgICAgICAgICAgIFNUUlRBQiAgICAgICAgICAwMDAwMDAwMCAwKy4qIDArLiogMDAgICAgICAwICAgMCAxCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2MGIzOC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLVN5bWJvbCB0YWJsZSAnLnN5bXRhYicgY29udGFpbnMgLiogZW50cmllczoKLSAgTnVtOiAgICBWYWx1ZSAgU2l6ZSBUeXBlICAgIEJpbmQgICBPdCAgTmR4IE5hbWUKLSAgICAwOiAgICAgICAgMCAgICAgMCBOT1RZUEUgIExPQ0FMICAgMCAgVU5EIAotICAgIDE6ICAgICAgICAwICAgICAwIFNFQ1RJT04gTE9DQUwgICAwICAgIDEgCi0gICAgMjogICAgICAgIDAgICAgIDAgU0VDVElPTiBMT0NBTCAgIDAgICAgMyAKLSAgICAzOiAgICAgICAgMCAgICAgMCBTRUNUSU9OIExPQ0FMICAgMCAgICA0IAotICAgIDQ6ICAgICAgICAwICAgICAwIE5PVFlQRSAgTE9DQUwgICAwICAgIDEgc3RhdGljX3RleHRfc3ltYm9sCi0gICAgNTogICAgICAgIDAgICAgIDAgTk9UWVBFICBMT0NBTCAgIDAgICAgMyBzdGF0aWNfZGF0YV9zeW1ib2wKLSAgICAuOiAgICAgICAgMCAgICAgMCBOT1RZUEUgIEdMT0JBTCAgMCAgICAxIHRleHRfc3ltYm9sCi0gICAgLjogICAgICAgIDAgICAgIDAgTk9UWVBFICBHTE9CQUwgIDAgIFVORCBleHRlcm5hbF9zeW1ib2wKLSAgIC4qOiAgICAgICAgMCAgICAgMCBOT1RZUEUgIEdMT0JBTCAgMCAgICAzIGRhdGFfc3ltYm9sCi0gICAuKjogICAgICAgIDQgICAgIDQgT0JKRUNUICBHTE9CQUwgIDAgIENPTSBjb21tb25fc3ltYm9sCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYud2kgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYud2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjJmZmYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLndpCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotVGhlIHNlY3Rpb24gLmRlYnVnX2luZm8gY29udGFpbnM6Ci0KLSAgQ29tcGlsYXRpb24gVW5pdDoKLSAgIExlbmd0aDogICAgICAgIC4qCi0gICBWZXJzaW9uOiAgICAgICAyCi0gICBBYmJyZXYgT2Zmc2V0OiAwCi0gICBQb2ludGVyIFNpemU6ICA0Ci0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogMSBcKERXX1RBR19jb21waWxlX3VuaXRcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IC4qL3Rlc3Rwcm9nLmMJCi0gICAgIERXX0FUX2NvbXBfZGlyICAgIDogLiovYmludXRpbHMJCi0gICAgIERXX0FUX3Byb2R1Y2VyICAgIDogR05VIEMgLioJCi0gICAgIERXX0FUX2xhbmd1YWdlICAgIDogMQlcKEFOU0kgQ1wpCi0gICAgIERXX0FUX2xvd19wYyAgICAgIDogMAkKLSAgICAgRFdfQVRfaGlnaF9wYyAgICAgOiAuKgkKLSAgICAgRFdfQVRfc3RtdF9saXN0ICAgOiAwCQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDIgXChEV19UQUdfc3VicHJvZ3JhbVwpCi0gICAgIERXX0FUX2V4dGVybmFsICAgIDogMQkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBmbgkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDEwCQotICAgICBEV19BVF90eXBlICAgICAgICA6IC4qCQotICAgICBEV19BVF9sb3dfcGMgICAgICA6IDAJCi0gICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCi0gICAgIERXX0FUX2ZyYW1lX2Jhc2UgIDogMSBieXRlIGJsb2NrOiAuKgotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDMgXChEV19UQUdfYmFzZV90eXBlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBpbnQJCi0gICAgIERXX0FUX2J5dGVfc2l6ZSAgIDogNAkKLSAgICAgRFdfQVRfZW5jb2RpbmcgICAgOiA1CVwoc2lnbmVkXCkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA0IFwoRFdfVEFHX3N1YnByb2dyYW1cKQotICAgICBEV19BVF9zaWJsaW5nICAgICA6IC4qCQotICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogbWFpbgkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDE2CQotICAgICBEV19BVF90eXBlICAgICAgICA6IC4qCQotICAgICBEV19BVF9sb3dfcGMgICAgICA6IC4qCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotICAgICBEV19BVF9mcmFtZV9iYXNlICA6IDEgYnl0ZSBibG9jazogLioKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA1IFwoRFdfVEFHX2xleGljYWxfYmxvY2tcKQotICAgICBEV19BVF9sb3dfcGMgICAgICA6IC4qCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDYgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGNvbW1vbgkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDMJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAwIDAgMCAwIAlcKERXX09QX2FkZHI6IDBcKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDYgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGdsb2JhbAkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDQJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAwIDAgMCAwIAlcKERXX09QX2FkZHI6IDBcKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDcgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGxvY2FsCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogNQkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAuIDAgMCAuIAlcKERXX09QX2FkZHI6IC5cKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDggXChEV19UQUdfYXJyYXlfdHlwZVwpCi0gICAgIERXX0FUX3NpYmxpbmcgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDkgXChEV19UQUdfc3VicmFuZ2VfdHlwZVwpCi0gICAgIERXX0FUX3VwcGVyX2JvdW5kIDogNgkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiAzIFwoRFdfVEFHX2Jhc2VfdHlwZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogY2hhcgkKLSAgICAgRFdfQVRfYnl0ZV9zaXplICAgOiAxCQotICAgICBEV19BVF9lbmNvZGluZyAgICA6IDgJXCh1bnNpZ25lZCBjaGFyXCkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA3IFwoRFdfVEFHX3ZhcmlhYmxlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBzdHJpbmcJCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiA2CQotICAgICBEV19BVF90eXBlICAgICAgICA6IDwuKj4JCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIC4gMCAwIC4gCVwoRFdfT1BfYWRkcjogLlwpCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9zaXplLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwOGM5MS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJFNJWkVdID09IDB9IHRoZW4gewotCXBlcnJvciAiJFNJWkUgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkU0laRV0iCi0KLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZXN0ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2JpbnRlc3Qub10KLX0gZWxzZSB7Ci0gICAgc2V0IHRlc3RmaWxlIHRtcGRpci9iaW50ZXN0Lm8KLX0KLQotc2V0IGRlYyAiXFswLTlcXSsiCi1zZXQgaGV4ICJcWzAtOWEtZkEtRlxdKyIKLQotIyBUZXN0IHNpemUgd2l0aCBubyBhcmd1bWVudHMKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRTSVpFICIkU0laRUZMQUdTICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIoJGRlYylcWyAJXF0rKCRkZWMpXFsgCVxdKygkZGVjKVxbIAlcXSsoJGRlYylcWyAJXF0rKCRoZXgpXFsgCVxdKyR7dGVzdGZpbGV9IgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB0ZXh0IGRhdGEgYnNzIGR0b3QgaGV4dG90XSB0aGVuIHsKLSAgICBmYWlsICJzaXplIChubyBhcmd1bWVudHMpIgotfSBlbHNlIHsKLSAgICBpZiB7JHRleHQgPCA4IHx8ICRkYXRhIDwgNH0gdGhlbiB7Ci0JZmFpbCAic2l6ZSAobm8gYXJndW1lbnRzKSIKLSAgICB9IGVsc2UgewotCXBhc3MgInNpemUgKG5vIGFyZ3VtZW50cykiCi0gICAgfQotfQotCi0jIFRlc3Qgc2l6ZSAtQQotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJFNJWkUgIiRTSVpFRkxBR1MgLUEgJHt0ZXN0ZmlsZX0iXQotCi1zZXQgd2FudCAiJHt0ZXN0ZmlsZX0uKih0ZXh0fFRFWFQpXFteXG5cclxdKlxbIAlcXSgkZGVjKVxbIAlcXSskZGVjLiooXFwuZGF0YXxEQVRBKVxbXlxuXHJcXSpcWyAJXF0oJGRlYylcWyAJXF0rJGRlYyIKLQotaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdGV4dG5hbWUgdGV4dHNpemUgZGF0YW5hbWUgZGF0YXNpemVdIHRoZW4gewotICAgIGZhaWwgInNpemUgLUEiCi19IGVsc2UgewotICAgIHZlcmJvc2UgInRleHQgc2l6ZTogJHRleHRzaXplIgotICAgIHZlcmJvc2UgImRhdGEgc2l6ZTogJGRhdGFzaXplIgotICAgIGlmIHskdGV4dHNpemUgPCA4IHx8ICRkYXRhc2l6ZSA8IDR9IHRoZW4gewotCWZhaWwgInNpemUgLUEiCi0gICAgfSBlbHNlIHsKLQlwYXNzICJzaXplIC1BIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwNjU2Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byB0ZXN0IG9iamNvcHkgYW5kIHN0cmlwLiAgKi8KLQotaW50IGNvbW1vbjsKLWludCBnbG9iYWwgPSAxOwotc3RhdGljIGludCBsb2NhbCA9IDI7Ci1zdGF0aWMgY2hhciBzdHJpbmdbXSA9ICJzdHJpbmciOwotCi1pbnQKLWZuICgpCi17Ci0gIHJldHVybiAzOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgaWYgKGNvbW1vbiAhPSAwCi0gICAgICB8fCBnbG9iYWwgIT0gMQotICAgICAgfHwgbG9jYWwgIT0gMgotICAgICAgfHwgc3RyY21wIChzdHJpbmcsICJzdHJpbmciKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgib2tcbiIpOwotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI4MDJlLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKLQotbG9hZF9saWIgdXRpbC1kZWZzLmV4cAotbG9hZF9saWIgdXRpbHMtbGliLmV4cAotCi1pZiAhW2luZm8gZXhpc3RzIE5NXSB0aGVuIHsKLSAgICBzZXQgTk0gW2ZpbmRmaWxlICRiYXNlX2Rpci9ubS1uZXcgJGJhc2VfZGlyL25tLW5ldyBbdHJhbnNmb3JtIG5tXV0KLX0KLWlmICFbaW5mbyBleGlzdHMgTk1GTEFHU10gdGhlbiB7Ci0gICAgc2V0IE5NRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBTSVpFXSB0aGVuIHsKLSAgICBzZXQgU0laRSBbZmluZGZpbGUgJGJhc2VfZGlyL3NpemVdCi19Ci1pZiAhW2luZm8gZXhpc3RzIFNJWkVGTEFHU10gdGhlbiB7Ci0gICAgc2V0IFNJWkVGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkRVTVBdIHRoZW4gewotICAgIHNldCBPQkpEVU1QIFtmaW5kZmlsZSAkYmFzZV9kaXIvb2JqZHVtcF0KLX0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUEZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKQ09QWV0gdGhlbiB7Ci0gICAgc2V0IE9CSkNPUFkgW2ZpbmRmaWxlICRiYXNlX2Rpci9vYmpjb3B5XQotfQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpDT1BZRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBBUl0gdGhlbiB7Ci0gICAgc2V0IEFSIFtmaW5kZmlsZSAkYmFzZV9kaXIvYXJdCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgU1RSSVBdIHRoZW4gewotICAgIHNldCBTVFJJUCBbZmluZGZpbGUgJGJhc2VfZGlyL3N0cmlwLW5ldyAkYmFzZV9kaXIvc3RyaXAtbmV3IFt0cmFuc2Zvcm0gc3RyaXBdXQotfQotaWYgIVtpbmZvIGV4aXN0cyBTVFJJUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgU1RSSVBGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIFJFQURFTEZdIHRoZW4gewotICAgIHNldCBSRUFERUxGIFtmaW5kZmlsZSAkYmFzZV9kaXIvcmVhZGVsZl0KLX0KLWlmICFbaW5mbyBleGlzdHMgUkVBREVMRkZMQUdTXSB0aGVuIHsKLSAgICBzZXQgUkVBREVMRkZMQUdTICIiCi19Ci0KLWlmICFbZmlsZSBpc2RpcmVjdG9yeSB0bXBkaXJdIHtjYXRjaCAiZXhlYyBta2RpciB0bXBkaXIiIHN0YXR1c30KLQotIwotIyBiaW51dGlsc19ydW4KLSMJcnVuIGEgcHJvZ3JhbSwgcmV0dXJuaW5nIHRoZSBvdXRwdXQKLSMJc2V0cyBiaW51dGlsc19ydW5fZmFpbGVkIGlmIHRoZSBwcm9ncmFtIGRvZXMgbm90IGV4aXN0Ci0jCi1wcm9jIGJpbnV0aWxzX3J1biB7IHByb2cgcHJvZ2FyZ3MgfSB7Ci0gICAgZGVmYXVsdF9iaW51dGlsc19ydW4gJHByb2cgJHByb2dhcmdzCi19Ci0KLSMKLSMgYmludXRpbHNfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGJpbnV0aWxzX2Fzc2VtYmxlIHsgc291cmNlIG9iamVjdCB9IHsKLSAgICBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlICRzb3VyY2UgJG9iamVjdAotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvaHBwYS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjA3ZDguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcy8jIE9sZCBPU0Ygc2VkIGJsb3dzIHVwIGlmIHlvdSBoYXZlIGEgc2VkIGNvbW1hbmQgc3RhcnRpbmcgd2l0aCAiIyIvLwotcy8jIEF2b2lkIGl0IGJ5IHB1dHRpbmcgdGhlIGNvbW1lbnRzIHdpdGhpbiByZWFsIHNlZCBjb21tYW5kcy4vLwotcy8jIEZpeCB0aGUgZGVmaW5pdGlvbiBvZiBjb21tb25fc3ltYm9sIHRvIGJlIGNvcnJlY3QgZm9yIHRoZSBQQSBhc3NlYm1sZXJzLi8vCi1zLwlcLmNvbW0gY29tbW9uX3N5bWJvbCw0L2NvbW1vbl9zeW1ib2wJLmNvbW0gNC8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3ZjIxNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvbGliL3V0aWxzLWxpYi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIGV4dGVuZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1wcm9jIGJpbnV0aWxfdmVyc2lvbiB7IHByb2cgfSB7Ci0gICAgaWYgIVtpc19yZW1vdGUgaG9zdF0gewotCXNldCBwYXRoIFt3aGljaCAkcHJvZ107Ci0JaWYgeyRwYXRoID09IDB9IHRoZW4gewotCSAgICBwZXJyb3IgIiRwcm9nIGNhbid0IGJlIHJ1biwgZmlsZSBub3QgZm91bmQuIgotCSAgICByZXR1cm4gIiIKLQl9Ci0gICAgfSBlbHNlIHsKLQlzZXQgcGF0aCAkcHJvZwotICAgIH0KLSAgICBzZXQgc3RhdGUgW3JlbW90ZV9leGVjIGhvc3QgJHByb2cgLS12ZXJzaW9uXTsKLSAgICBzZXQgdG1wICJbbGluZGV4ICRzdGF0ZSAxXVxuIjsKLSAgICAjIFNob3VsZCBmaW5kIGEgd2F5IHRvIGRpc2NhcmQgY29uc3RhbnQgcGFydHMsIGtlZXAgd2hhdGV2ZXIncwotICAgICMgbGVmdCwgc28gdGhlIHZlcnNpb24gc3RyaW5nIGNvdWxkIGJlIGFsbW9zdCBhbnl0aGluZyBhdCBhbGwuLi4KLSAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgIiR0bXAiIHZlcnNpb24gY3lnIG51bWJlcgotICAgIGlmICFbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKLSAgICAgICAgcmV0dXJuICIkcGF0aCAobm8gdmVyc2lvbiBudW1iZXIpXG4iCi0gICAgfQotICAgIHJldHVybiAiJHBhdGggJG51bWJlclxuIgotfQotCi0jCi0jIGRlZmF1bHRfYmludXRpbHNfcnVuCi0jCXJ1biBhIHByb2dyYW0sIHJldHVybmluZyB0aGUgb3V0cHV0Ci0jCXNldHMgYmludXRpbHNfcnVuX2ZhaWxlZCBpZiB0aGUgcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAotIwotcHJvYyBkZWZhdWx0X2JpbnV0aWxzX3J1biB7IHByb2cgcHJvZ2FyZ3MgfSB7Ci0gICAgZ2xvYmFsIGJpbnV0aWxzX3J1bl9mYWlsZWQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBzZXQgYmludXRpbHNfcnVuX2ZhaWxlZCAwCi0KLSAgICBpZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0JaWYge1t3aGljaCAkcHJvZ10gPT0gMH0gdGhlbiB7Ci0JICAgIHBlcnJvciAiJHByb2cgZG9lcyBub3QgZXhpc3QiCi0JICAgIHNldCBiaW51dGlsc19ydW5fZmFpbGVkIDEKLQkgICAgcmV0dXJuICIiCi0JfQotICAgIH0KLQotICAgIHNlbmRfbG9nICIkcHJvZyAkcHJvZ2FyZ3NcbiIKLSAgICB2ZXJib3NlICIkcHJvZyAkcHJvZ2FyZ3MiCi0KLSAgICAjIEdvdHRhIHF1b3RlIGRvbGxhci1zaWducyBiZWNhdXNlIHRoZXkgZ2V0IG1hbmdsZWQgYnkgdGhlCi0gICAgIyBzaGVsbCBvdGhlcndpc2UuCi0gICAgcmVnc3ViIC1hbGwgIlxcJCIgIiRwcm9nYXJncyIgIlxcJCIgcHJvZ2FyZ3MKLQotICAgIHNldCBzdGF0ZSBbcmVtb3RlX2V4ZWMgaG9zdCAkcHJvZyAkcHJvZ2FyZ3NdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyBbbGluZGV4ICRzdGF0ZSAxXV07Ci0gICAgaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0gICAgfQotICAgIHJldHVybiAkZXhlY19vdXRwdXQKLX0KLQotIwotIyBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlCi0jCWFzc2VtYmxlIGEgZmlsZQotIwotcHJvYyBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlIHsgc291cmNlIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgIyBUaGUgSFBQQSBhc3NlbWJsZXIgc3ludGF4IGlzIGEgbGl0dGxlIGRpZmZlcmVudCB0aGFuIG1vc3QsIHRvIG1ha2UKLSAgICAjIHRoZSB0ZXN0IHNvdXJjZSBmaWxlIGFzc2VtYmxlIHdlIG5lZWQgdG8gcnVuIGl0IHRocm91Z2ggc2VkLgotICAgICMKLSAgICAjIFRoaXMgaXMgYSBoYWNrIGluIHRoYXQgaXQgd29uJ3Qgc2NhbGUgd2VsbCBpZiBvdGhlciB0YXJnZXRzIG5lZWQKLSAgICAjIHNpbWlsYXIgdHJhbnNmb3JtYXRpb25zIHRvIGFzc2VtYmxlLiAgV2UnbGwgZ2VuZXJhbGl6ZSB0aGUgaGFjawotICAgICMgaWYvd2hlbiBvdGhlciB0YXJnZXRzIG5lZWQgc2ltaWxhciBoYW5kbGluZy4KLSAgICBpZiBbaXN0YXJnZXQgImhwcGEqLSotKiIgXSB0aGVuIHsKLQlzZW5kX2xvZyAic2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zXG4iCi0JdmVyYm9zZSAic2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zIgotCWNhdGNoICJleGVjIHNlZCAtZiAkc3JjZGlyL2NvbmZpZy9ocHBhLnNlZCA8ICRzb3VyY2UgPiBhc20ucyI7Ci0Jc2V0IHNvdXJjZSBhc20ucwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbdGFyZ2V0X2Fzc2VtYmxlICRzb3VyY2UgJG9iamVjdCAiIl07Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCXBlcnJvciAiJHNvdXJjZTogYXNzZW1ibHkgZmFpbGVkIgotCXJldHVybiAwCi0gICAgfQotfQotCi1pZiAhW2luZm8gZXhpc3RzIHRhcmdldF9hc3NlbWJsZV0gewotIwotIyBTdG9sZW4gZnJvbSBkZWphZ251L2xpYi90YXJnZXQuZXhwLS1wbGVhc2UgcmVtb3ZlIGFmdGVyIDEvMS85OC4KLSMKLXVwbGV2ZWwgIzAgewotICAgIHByb2MgdGFyZ2V0X2Fzc2VtYmxlIHsgc291cmNlIGRlc3RmaWxlIGZsYWdzIH0gewotCXJldHVybiBbZGVmYXVsdF90YXJnZXRfYXNzZW1ibGUgJHNvdXJjZSAkZGVzdGZpbGUgJGZsYWdzXTsKLSAgICB9Ci0KLSAgICBwcm9jIGRlZmF1bHRfdGFyZ2V0X2Fzc2VtYmxlIHsgc291cmNlIGRlc3RmaWxlIGZsYWdzIH0gewotCWdsb2JhbCBBU19GT1JfVEFSR0VUOwotCWdsb2JhbCBBU0ZMQUdTX0ZPUl9UQVJHRVQ7Ci0KLQlpZiBbaW5mbyBleGlzdHMgQVNfRk9SX1RBUkdFVF0gewotCSAgICBzZXQgQVMgIiRBU19GT1JfVEFSR0VUIjsKLQl9IGVsc2UgewotCSAgICBpZiAhW2JvYXJkX2luZm8gdGFyZ2V0IGV4aXN0cyBhc3NlbWJsZXJdIHsKLQkJc2V0IEFTIFtmaW5kX2dhc107Ci0JICAgIH0gZWxzZSB7Ci0JCXNldCBBUyBbYm9hcmRfaW5mbyB0YXJnZXQgYXNzZW1ibGVyXTsKLQkgICAgfQotCX0KLQotCWlmIFtpbmZvIGV4aXN0cyBBU0ZMQUdTX0ZPUl9UQVJHRVRdIHsKLQkgICAgYXBwZW5kIGZsYWdzICIgJEFTRkxBR1NfRk9SX1RBUkdFVCI7Ci0JfQotCi0JaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JICAgIHNldCBzb3VyY2UgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRzb3VyY2VdOwotCSAgICBzZXQgZGVzdCAiYS5vdXQiCi0JfSBlbHNlIHsKLQkgICAgc2V0IGRlc3QgJGRlc3RmaWxlCi0JfQotCXNldCBzdGF0dXMgW3JlbW90ZV9leGVjIGhvc3QgIiRBUyAkc291cmNlICRmbGFncyAtbyAkZGVzdCJdCi0JaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JICAgIHJlbW90ZV91cGxvYWQgaG9zdCAkZGVzdCAkZGVzdGZpbGUKLQl9Ci0KLQlzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzIFtsaW5kZXggJHN0YXR1cyAxXV07Ci0JaWYgeyBbbGluZGV4ICRzdGF0dXMgMF0gIT0gMCB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICJhc3NlbWJsZXIgZXhpdGVkIHdpdGggc3RhdHVzIFtsaW5kZXggJHN0YXR1cyAwXSI7Ci0JfQotCWlmIHsgW2xpbmRleCAkc3RhdHVzIDFdICE9ICIiIH0gewotCSAgICB2ZXJib3NlIC1sb2cgImFzc2VtYmxlciBvdXRwdXQgaXM6XG5bbGluZGV4ICRzdGF0dXMgMV0iIDI7Ci0JfQotCXJldHVybiAke2NvbXBfb3V0cHV0fTsKLX0KLX0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3ZlcnNpb24uYyBiL2JpbnV0aWxzL3ZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1NTkzOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy92ZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiB2ZXJzaW9uLmMgLS0gYmludXRpbHMgdmVyc2lvbiBpbmZvcm1hdGlvbgotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLS8qIFRoaXMgaXMgdGhlIHZlcnNpb24gbnVtYmVycyBmb3IgdGhlIGJpbnV0aWxzLiAgVGhleSBhbGwgY2hhbmdlIGluCi0gICBsb2Nrc3RlcCAtLSBpdCdzIGVhc2llciB0aGF0IHdheS4gKi8KLQotY29uc3QgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gVkVSU0lPTjsKLQotLyogUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCBjb3B5cmlnaHQgaW5mb3JtYXRpb24sIGFuZCBleGl0LiAgVGhpcwotICAgaW1wbGVtZW50cyB0aGUgLS12ZXJzaW9uIG9wdGlvbiBmb3IgdGhlIHZhcmlvdXMgcHJvZ3JhbXMuICAqLwotCi12b2lkCi1wcmludF92ZXJzaW9uIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKCJHTlUgJXMgJXNcbiIsIG5hbWUsIHByb2dyYW1fdmVyc2lvbik7Ci0gIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0gIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmRyZXMuYyBiL2JpbnV0aWxzL3dpbmRyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjZDkwOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kcmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTIgKzAsMCBAQAotLyogd2luZHJlcy5jIC0tIGEgcHJvZ3JhbSB0byBtYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgcHJvZ3JhbSBjYW4gcmVhZCBhbmQgd3JpdGUgV2luZG93cyByZXNvdXJjZXMgaW4gdmFyaW91cwotICAgZm9ybWF0cy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBhY3QgbGlrZSB0aGUgcmMgcmVzb3VyY2UgY29tcGlsZXIKLSAgIHByb2dyYW0sIGFuZCBpdCBjYW4gYWN0IGxpa2UgdGhlIGN2dHJlcyByZXMgdG8gQ09GRiBjb252ZXJzaW9uCi0gICBwcm9ncmFtLgotCi0gICBJdCBpcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlczoKLQotICAgKiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbi4KLQotICAgKiBUaGUgcmNsIHByb2dyYW0sIHdyaXR0ZW4gYnkgR3VudGhlciBFYmVydAotICAgICA8Z3VudGhlci5lYmVydEBpeG9zLWxlaXB6aWcuZGU+LgotCi0gICAqIFRoZSByZXMyY29mZiBwcm9ncmFtLCB3cml0dGVuIGJ5IFBlZHJvIEEuIEFyYW5kYSA8cGFhZ0B0aWQuZXM+LgotCi0gICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0vKiB1c2VkIGJ5IHJlc3JjLmMgYXQgbGVhc3QgKi8KLQotaW50IHZlcmJvc2UgPSAwOwotCi0vKiBBbiBlbnVtZXJhdGlvbiBvZiBmb3JtYXQgdHlwZXMuICAqLwotCi1lbnVtIHJlc19mb3JtYXQKLXsKLSAgLyogVW5rbm93biBmb3JtYXQuICAqLwotICBSRVNfRk9STUFUX1VOS05PV04sCi0gIC8qIFRleHR1YWwgUkMgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfUkMsCi0gIC8qIEJpbmFyeSBSRVMgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfUkVTLAotICAvKiBDT0ZGIGZpbGUuICAqLwotICBSRVNfRk9STUFUX0NPRkYKLX07Ci0KLS8qIEEgc3RydWN0dXJlIHVzZWQgdG8gbWFwIGJldHdlZW4gZm9ybWF0IHR5cGVzIGFuZCBzdHJpbmdzLiAgKi8KLQotc3RydWN0IGZvcm1hdF9tYXAKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgZW51bSByZXNfZm9ybWF0IGZvcm1hdDsKLX07Ci0KLS8qIEEgbWFwcGluZyBiZXR3ZWVuIG5hbWVzIGFuZCBmb3JtYXQgdHlwZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgZm9ybWF0X25hbWVzW10gPQotewotICB7ICJyYyIsIFJFU19GT1JNQVRfUkMgfSwKLSAgeyAicmVzIiwgUkVTX0ZPUk1BVF9SRVMgfSwKLSAgeyAiY29mZiIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7IE5VTEwsIFJFU19GT1JNQVRfVU5LTk9XTiB9Ci19OwotCi0vKiBBIG1hcHBpbmcgZnJvbSBmaWxlIGV4dGVuc2lvbnMgdG8gZm9ybWF0IHR5cGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwIGZvcm1hdF9maWxlZXh0c1tdID0KLXsKLSAgeyAicmMiLCBSRVNfRk9STUFUX1JDIH0sCi0gIHsgInJlcyIsIFJFU19GT1JNQVRfUkVTIH0sCi0gIHsgImV4ZSIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7ICJvYmoiLCBSRVNfRk9STUFUX0NPRkYgfSwKLSAgeyAibyIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7IE5VTEwsIFJFU19GT1JNQVRfVU5LTk9XTiB9Ci19OwotCi0vKiBBIGxpc3Qgb2YgaW5jbHVkZSBkaXJlY3Rvcmllcy4gICovCi0KLXN0cnVjdCBpbmNsdWRlX2RpcgotewotICBzdHJ1Y3QgaW5jbHVkZV9kaXIgKm5leHQ7Ci0gIGNoYXIgKmRpcjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5jbHVkZV9kaXIgKmluY2x1ZGVfZGlyczsKLQotLyogTG9uZyBvcHRpb25zLiAgKi8KLQotLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9ERUZJTkUgMTUwCi0jZGVmaW5lIE9QVElPTl9IRUxQIChPUFRJT05fREVGSU5FICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lOQ0xVREVfRElSIChPUFRJT05fSEVMUCArIDEpCi0jZGVmaW5lIE9QVElPTl9MQU5HVUFHRSAoT1BUSU9OX0lOQ0xVREVfRElSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BSRVBST0NFU1NPUiAoT1BUSU9OX0xBTkdVQUdFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04gKE9QVElPTl9QUkVQUk9DRVNTT1IgKyAxKQotI2RlZmluZSBPUFRJT05fWVlERUJVRyAoT1BUSU9OX1ZFUlNJT04gKyAxKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZGVmaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9ERUZJTkV9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0hFTFB9LAotICB7ImluY2x1ZGUtZGlyIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9JTkNMVURFX0RJUn0sCi0gIHsiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCi0gIHsibGFuZ3VhZ2UiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0xBTkdVQUdFfSwKLSAgeyJvdXRwdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsicHJlcHJvY2Vzc29yIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9QUkVQUk9DRVNTT1J9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9WRVJTSU9OfSwKLSAgeyJ5eWRlYnVnIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ZWURFQlVHfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotLyogU3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIHJlc19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZXh0ZW5kZWRfbWVudWl0ZW1zIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqKSk7Ci1zdGF0aWMgZW51bSByZXNfZm9ybWF0IGZvcm1hdF9mcm9tX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgZW51bSByZXNfZm9ybWF0IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIGludCBjbXBfcmVzX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnNvcnRfcmVzb3VyY2VzIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLQwKLS8qIFdoZW4gd2UgYXJlIGJ1aWxkaW5nIGEgcmVzb3VyY2UgdHJlZSwgd2UgYWxsb2NhdGUgZXZlcnl0aGluZyBvbnRvCi0gICBhbiBvYnN0YWNrLCBzbyB0aGF0IHdlIGNhbiBmcmVlIGl0IGFsbCBhdCBvbmNlIGlmIHdlIHdhbnQuICAqLwotCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgeG1hbGxvYwotI2RlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgZnJlZQotCi0vKiBUaGUgcmVzb3VyY2UgYnVpbGRpbmcgb2JzdGFjay4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayByZXNfb2JzdGFjazsKLQotLyogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2UgYnVpbGRpbmcgb2JzdGFjay4gICovCi0KLXN0YXRpYyB2b2lkCi1yZXNfaW5pdCAoKQotewotICBvYnN0YWNrX2luaXQgKCZyZXNfb2JzdGFjayk7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotUFRSCi1yZXNfYWxsb2MgKGJ5dGVzKQotICAgICBzaXplX3QgYnl0ZXM7Ci17Ci0gIHJldHVybiAoUFRSKSBvYnN0YWNrX2FsbG9jICgmcmVzX29ic3RhY2ssIGJ5dGVzKTsKLX0KLQotLyogV2UgYWxzbyB1c2UgYW4gb2JzdGFjayB0byBzYXZlIG1lbW9yeSB1c2VkIHdoaWxlIHdyaXRpbmcgb3V0IGEgc2V0Ci0gICBvZiByZXNvdXJjZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IG9ic3RhY2sgcmVzd3Jfb2JzdGFjazsKLQotLyogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2Ugd3JpdGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlc3dyX2luaXQgKCkKLXsKLSAgb2JzdGFja19pbml0ICgmcmVzd3Jfb2JzdGFjayk7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZXNvdXJjZSB3cml0aW5nIG9ic3RhY2suICAqLwotCi1QVFIKLXJlc3dyX2FsbG9jIChieXRlcykKLSAgICAgc2l6ZV90IGJ5dGVzOwotewotICByZXR1cm4gKFBUUikgb2JzdGFja19hbGxvYyAoJnJlc3dyX29ic3RhY2ssIGJ5dGVzKTsKLX0KLQwKLS8qIE9wZW4gYSBmaWxlIHVzaW5nIHRoZSBpbmNsdWRlIGRpcmVjdG9yeSBzZWFyY2ggbGlzdC4gICovCi0KLUZJTEUgKgotb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIG1vZGUsIGVycm1zZywgcmVhbF9maWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci0gICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICAgY2hhciAqKnJlYWxfZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIHN0cnVjdCBpbmNsdWRlX2RpciAqZDsKLQotICBlID0gZm9wZW4gKGZpbGVuYW1lLCBtb2RlKTsKLSAgaWYgKGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcmVhbF9maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybiBlOwotICAgIH0KLQotICBpZiAoZXJybm8gPT0gRU5PRU5UKQotICAgIHsKLSAgICAgIGZvciAoZCA9IGluY2x1ZGVfZGlyczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQl7Ci0JICBjaGFyICpuOwotCi0JICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChkLT5kaXIpICsgc3RybGVuIChmaWxlbmFtZSkgKyAyKTsKLQkgIHNwcmludGYgKG4sICIlcy8lcyIsIGQtPmRpciwgZmlsZW5hbWUpOwotCSAgZSA9IGZvcGVuIChuLCBtb2RlKTsKLQkgIGlmIChlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAqcmVhbF9maWxlbmFtZSA9IG47Ci0JICAgICAgcmV0dXJuIGU7Ci0JICAgIH0KLQotCSAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmYXRhbCAoXygiY2FuJ3Qgb3BlbiAlcyBgJXMnOiAlcyIpLCBlcnJtc2csIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICAvKiBSZXR1cm4gYSB2YWx1ZSB0byBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIENvbXBhcmUgdHdvIHJlc291cmNlIElEJ3MuICBXZSBjb25zaWRlciBuYW1lIGVudHJpZXMgdG8gY29tZSBiZWZvcmUKLSAgIG51bWVyaWMgZW50cmllcywgYmVjYXVzZSB0aGF0IGlzIGhvdyB0aGV5IGFwcGVhciBpbiB0aGUgQ09GRiAucnNyYwotICAgc2VjdGlvbi4gICovCi0KLWludAotcmVzX2lkX2NtcCAoYSwgYikKLSAgICAgc3RydWN0IHJlc19pZCBhOwotICAgICBzdHJ1Y3QgcmVzX2lkIGI7Ci17Ci0gIGlmICghIGEubmFtZWQpCi0gICAgewotICAgICAgaWYgKGIubmFtZWQpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoYS51LmlkID4gYi51LmlkKQotCXJldHVybiAxOwotICAgICAgZWxzZSBpZiAoYS51LmlkIDwgYi51LmlkKQotCXJldHVybiAtMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bmljaGFyICphcywgKmFzZSwgKmJzLCAqYnNlOwotCi0gICAgICBpZiAoISBiLm5hbWVkKQotCXJldHVybiAtMTsKLQotICAgICAgYXMgPSBhLnUubi5uYW1lOwotICAgICAgYXNlID0gYXMgKyBhLnUubi5sZW5ndGg7Ci0gICAgICBicyA9IGIudS5uLm5hbWU7Ci0gICAgICBic2UgPSBicyArIGIudS5uLmxlbmd0aDsKLQotICAgICAgd2hpbGUgKGFzIDwgYXNlKQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoYnMgPj0gYnNlKQotCSAgICByZXR1cm4gMTsKLQkgIGkgPSAoaW50KSAqYXMgLSAoaW50KSAqYnM7Ci0JICBpZiAoaSAhPSAwKQotCSAgICByZXR1cm4gaTsKLQkgICsrYXM7Ci0JICArK2JzOwotCX0KLQotICAgICAgaWYgKGJzIDwgYnNlKQotCXJldHVybiAtMTsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBQcmludCBhIHJlc291cmNlIElELiAgKi8KLQotdm9pZAotcmVzX2lkX3ByaW50IChzdHJlYW0sIGlkLCBxdW90ZSkKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBpbnQgcXVvdGU7Ci17Ci0gIGlmICghIGlkLm5hbWVkKQotICAgIGZwcmludGYgKHN0cmVhbSwgIiVsdSIsIGlkLnUuaWQpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHF1b3RlKQotCXB1dGMgKCciJywgc3RyZWFtKTsKLSAgICAgIHVuaWNvZGVfcHJpbnQgKHN0cmVhbSwgaWQudS5uLm5hbWUsIGlkLnUubi5sZW5ndGgpOwotICAgICAgaWYgKHF1b3RlKQotCXB1dGMgKCciJywgc3RyZWFtKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgbGlzdCBvZiByZXNvdXJjZSBJRCdzLiAgKi8KLQotdm9pZAotcmVzX2lkc19wcmludCAoc3RyZWFtLCBjaWRzLCBpZHMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IGNpZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkczsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKLSAgICB7Ci0gICAgICByZXNfaWRfcHJpbnQgKHN0cmVhbSwgaWRzW2ldLCAxKTsKLSAgICAgIGlmIChpICsgMSA8IGNpZHMpCi0JZnByaW50ZiAoc3RyZWFtLCAiOiAiKTsKLSAgICB9Ci19Ci0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgcmVzb3VyY2UgSUQuICAqLwotCi12b2lkCi1yZXNfc3RyaW5nX3RvX2lkIChyZXNfaWQsIHN0cmluZykKLSAgICAgc3RydWN0IHJlc19pZCAqcmVzX2lkOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHJlc19pZC0+bmFtZWQgPSAxOwotICB1bmljb2RlX2Zyb21fYXNjaWkgKCZyZXNfaWQtPnUubi5sZW5ndGgsICZyZXNfaWQtPnUubi5uYW1lLCBzdHJpbmcpOwotfQotCi0vKiBEZWZpbmUgYSByZXNvdXJjZS4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSByZXNvdXJjZSB0cmVlLCBSRVNPVVJDRVMsCi0gICBhbmQgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRvIHB1dCBpdCBpbiB0aGUgdHJlZSwgQ0lEUyBhbmQgSURTLgotICAgVGhpcyByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUsIHdoaWNoIHRoZQotICAgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluaXRpYWxpemUuICBJZiBEVVBPSyBpcyBub24temVybywgdGhlbiBpZiBhCi0gICByZXNvdXJjZSB3aXRoIHRoaXMgSUQgZXhpc3RzLCBpdCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgYSB3YXJuaW5nCi0gICBpcyBpc3N1ZWQsIGFuZCBhIG5ldyByZXNvdXJjZSBpcyBjcmVhdGVkIHJlcGxhY2luZyB0aGUgZXhpc3RpbmcKLSAgIG9uZS4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotZGVmaW5lX3Jlc291cmNlIChyZXNvdXJjZXMsIGNpZHMsIGlkcywgZHVwb2spCi0gICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqcmVzb3VyY2VzOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlID0gTlVMTDsKLSAgaW50IGk7Ci0KLSAgYXNzZXJ0IChjaWRzID4gMCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaWRzOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHJlc19lbnRyeSAqKnBwOwotCi0gICAgICBpZiAoKnJlc291cmNlcyA9PSBOVUxMKQotCXsKLQkgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWV2YWw7Ci0KLQkgIC8qIFVzZSB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGV2ZXJ5IHJlc291cmNlIGNyZWF0ZWQgaW4gYQotICAgICAgICAgICAgIHNpbmdsZSBydW4uICAqLwotCSAgaWYgKHRpbWV2YWwgPT0gMCkKLQkgICAgdGltZXZhbCA9IHRpbWUgKE5VTEwpOwotCi0JICAqcmVzb3VyY2VzID0gKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKQotCQkJcmVzX2FsbG9jIChzaXplb2YgKipyZXNvdXJjZXMpKTsKLQkgICgqcmVzb3VyY2VzKS0+Y2hhcmFjdGVyaXN0aWNzID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+dGltZSA9IHRpbWV2YWw7Ci0JICAoKnJlc291cmNlcyktPm1ham9yID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+bWlub3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5lbnRyaWVzID0gTlVMTDsKLQl9Ci0KLSAgICAgIGZvciAocHAgPSAmKCpyZXNvdXJjZXMpLT5lbnRyaWVzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JaWYgKHJlc19pZF9jbXAgKCgqcHApLT5pZCwgaWRzW2ldKSA9PSAwKQotCSAgYnJlYWs7Ci0KLSAgICAgIGlmICgqcHAgIT0gTlVMTCkKLQlyZSA9ICpwcDsKLSAgICAgIGVsc2UKLQl7Ci0JICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0JICByZS0+bmV4dCA9IE5VTEw7Ci0JICByZS0+aWQgPSBpZHNbaV07Ci0JICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMTsKLQkgICAgICByZS0+dS5kaXIgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMDsKLQkgICAgICByZS0+dS5yZXMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpwcCA9IHJlOwotCX0KLQotICAgICAgaWYgKChpICsgMSkgPCBjaWRzKQotCXsKLQkgIGlmICghIHJlLT5zdWJkaXIpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGksIGlkcyk7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iKSk7Ci0JICAgICAgeGV4aXQgKDEpOwotCSAgICB9Ci0KLQkgIHJlc291cmNlcyA9ICZyZS0+dS5kaXI7Ci0JfQotICAgIH0KLQotICBpZiAocmUtPnN1YmRpcikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIpKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKHJlLT51LnJlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkdXBvaykKLQlyZXR1cm4gcmUtPnUucmVzOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiOiBkdXBsaWNhdGUgdmFsdWVcbiIpKTsKLSAgICB9Ci0KLSAgcmUtPnUucmVzID0gKChzdHJ1Y3QgcmVzX3Jlc291cmNlICopCi0JICAgICAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc291cmNlKSkpOwotCi0gIHJlLT51LnJlcy0+dHlwZSA9IFJFU19UWVBFX1VOSU5JVElBTElaRUQ7Ci0gIG1lbXNldCAoJnJlLT51LnJlcy0+cmVzX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotICBtZW1zZXQgKCZyZS0+dS5yZXMtPmNvZmZfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX2NvZmZfaW5mbykpOwotCi0gIHJldHVybiByZS0+dS5yZXM7Ci19Ci0KLS8qIERlZmluZSBhIHN0YW5kYXJkIHJlc291cmNlLiAgVGhpcyBpcyBhIHZlcnNpb24gb2YgZGVmaW5lX3Jlc291cmNlCi0gICB0aGF0IGp1c3QgdGFrZXMgdHlwZSwgbmFtZSwgYW5kIGxhbmd1YWdlIGFyZ3VtZW50cy4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlIChyZXNvdXJjZXMsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIGludCB0eXBlOwotICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0gICAgIGludCBsYW5ndWFnZTsKLSAgICAgaW50IGR1cG9rOwotewotICBzdHJ1Y3QgcmVzX2lkIGFbM107Ci0KLSAgYVswXS5uYW1lZCA9IDA7Ci0gIGFbMF0udS5pZCA9IHR5cGU7Ci0gIGFbMV0gPSBuYW1lOwotICBhWzJdLm5hbWVkID0gMDsKLSAgYVsyXS51LmlkID0gbGFuZ3VhZ2U7Ci0gIHJldHVybiBkZWZpbmVfcmVzb3VyY2UgKHJlc291cmNlcywgMywgYSwgZHVwb2spOwotfQotCi0vKiBDb21wYXJpc29uIHJvdXRpbmUgZm9yIHJlc291cmNlIHNvcnRpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBfcmVzX2VudHJ5IChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqcmUxLCAqKnJlMjsKLQotICByZTEgPSAoY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqKikgcDE7Ci0gIHJlMiA9IChjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqKSBwMjsKLSAgcmV0dXJuIHJlc19pZF9jbXAgKCgqcmUxKS0+aWQsICgqcmUyKS0+aWQpOwotfQotCi0vKiBTb3J0IHRoZSByZXNvdXJjZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKgotc29ydF9yZXNvdXJjZXMgKHJlc2RpcikKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLXsKLSAgaW50IGMsIGk7Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlOwotICBzdHJ1Y3QgcmVzX2VudHJ5ICoqYTsKLQotICBpZiAocmVzZGlyLT5lbnRyaWVzID09IE5VTEwpCi0gICAgcmV0dXJuIHJlc2RpcjsKLQotICBjID0gMDsKLSAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICArK2M7Ci0KLSAgLyogVGhpcyBpcyBhIHJlY3Vyc2l2ZSByb3V0aW5lLCBzbyB1c2luZyB4bWFsbG9jIGlzIHByb2JhYmx5IGJldHRlcgotICAgICB0aGFuIGFsbG9jYS4gICovCi0gIGEgPSAoc3RydWN0IHJlc19lbnRyeSAqKikgeG1hbGxvYyAoYyAqIHNpemVvZiAoc3RydWN0IHJlc19lbnRyeSAqKSk7Ci0KLSAgZm9yIChpID0gMCwgcmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQsIGkrKykKLSAgICBhW2ldID0gcmU7Ci0KLSAgcXNvcnQgKGEsIGMsIHNpemVvZiAoc3RydWN0IHJlc19lbnRyeSAqKSwgY21wX3Jlc19lbnRyeSk7Ci0KLSAgcmVzZGlyLT5lbnRyaWVzID0gYVswXTsKLSAgZm9yIChpID0gMDsgaSA8IGMgLSAxOyBpKyspCi0gICAgYVtpXS0+bmV4dCA9IGFbaSArIDFdOwotICBhW2ldLT5uZXh0ID0gTlVMTDsKLQotICBmcmVlIChhKTsKLQotICAvKiBOb3cgc29ydCB0aGUgc3ViZGlyZWN0b3JpZXMuICAqLwotCi0gIGZvciAocmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQpCi0gICAgaWYgKHJlLT5zdWJkaXIpCi0gICAgICByZS0+dS5kaXIgPSBzb3J0X3Jlc291cmNlcyAocmUtPnUuZGlyKTsKLQotICByZXR1cm4gcmVzZGlyOwotfQotDAotLyogUmV0dXJuIHdoZXRoZXIgdGhlIGRpYWxvZyByZXNvdXJjZSBESUFMT0cgaXMgYSBESUFMT0cgb3IgYQotICAgRElBTE9HRVguICAqLwotCi1pbnQKLWV4dGVuZGVkX2RpYWxvZyAoZGlhbG9nKQotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci17Ci0gIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqYzsKLQotICBpZiAoZGlhbG9nLT5leCAhPSBOVUxMKQotICAgIHJldHVybiAxOwotCi0gIGZvciAoYyA9IGRpYWxvZy0+Y29udHJvbHM7IGMgIT0gTlVMTDsgYyA9IGMtPm5leHQpCi0gICAgaWYgKGMtPmRhdGEgIT0gTlVMTCB8fCBjLT5oZWxwICE9IDApCi0gICAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgTUVOVUlURU1TIGFyZSBhIE1FTlUgb3IgYSBNRU5VRVguICAqLwotCi1pbnQKLWV4dGVuZGVkX21lbnUgKG1lbnUpCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51ICptZW51OwotewotICByZXR1cm4gZXh0ZW5kZWRfbWVudWl0ZW1zIChtZW51LT5pdGVtcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dGVuZGVkX21lbnVpdGVtcyAobWVudWl0ZW1zKQotICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKLXsKLSAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBmb3IgKG1pID0gbWVudWl0ZW1zOyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChtaS0+aGVscCAhPSAwIHx8IG1pLT5zdGF0ZSAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMICYmIG1pLT5pZCAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKChtaS0+dHlwZQotCSAgICYgfiAoTUVOVUlURU1fQ0hFQ0tFRAotCQl8IE1FTlVJVEVNX0dSQVlFRAotCQl8IE1FTlVJVEVNX0hFTFAKLQkJfCBNRU5VSVRFTV9JTkFDVElWRQotCQl8IE1FTlVJVEVNX01FTlVCQVJCUkVBSwotCQl8IE1FTlVJVEVNX01FTlVCUkVBSykpCi0JICAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCXsKLQkgIGlmIChleHRlbmRlZF9tZW51aXRlbXMgKG1pLT5wb3B1cCkpCi0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IHR5cGUsIG9yIGV4aXQgaWYgaXQgY2FuJ3QgYmUgZG9uZS4gICovCi0KLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQKLWZvcm1hdF9mcm9tX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwICptOwotCi0gIGZvciAobSA9IGZvcm1hdF9uYW1lczsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0gICAgaWYgKHN0cmNhc2VjbXAgKG0tPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBicmVhazsKLQotICBpZiAobS0+bmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVua25vd24gZm9ybWF0IHR5cGUgYCVzJ1xuIiksIHByb2dyYW1fbmFtZSwgbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBzdXBwb3J0ZWQgZm9ybWF0czoiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZvciAobSA9IGZvcm1hdF9uYW1lczsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0JZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgbS0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICByZXR1cm4gbS0+Zm9ybWF0OwotfQotCi0vKiBXb3JrIG91dCBhIGZvcm1hdCB0eXBlIGdpdmVuIGEgZmlsZSBuYW1lLiAgSWYgSU5QVVQgaXMgbm9uLXplcm8sCi0gICBpdCdzIE9LIHRvIGxvb2sgYXQgdGhlIGZpbGUgaXRzZWxmLiAgKi8KLQotc3RhdGljIGVudW0gcmVzX2Zvcm1hdAotZm9ybWF0X2Zyb21fZmlsZW5hbWUgKGZpbGVuYW1lLCBpbnB1dCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGludCBpbnB1dDsKLXsKLSAgY29uc3QgY2hhciAqZXh0OwotICBGSUxFICplOwotICB1bnNpZ25lZCBjaGFyIGIxLCBiMiwgYjMsIGI0LCBiNTsKLSAgaW50IG1hZ2ljOwotCi0gIC8qIElmIHdlIGhhdmUgYW4gZXh0ZW5zaW9uLCBzZWUgaWYgd2UgcmVjb2duaXplIGl0IGFzIGltcGx5aW5nIGEKLSAgICAgcGFydGljdWxhciBmb3JtYXQuICAqLwotICBleHQgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy4nKTsKLSAgaWYgKGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwICptOwotCi0gICAgICArK2V4dDsKLSAgICAgIGZvciAobSA9IGZvcm1hdF9maWxlZXh0czsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0JaWYgKHN0cmNhc2VjbXAgKG0tPm5hbWUsIGV4dCkgPT0gMCkKLQkgIHJldHVybiBtLT5mb3JtYXQ7Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgbmFtZSBvZiBhbiBvdXRwdXQgZmlsZSwgYXNzdW1lIGl0J3MgYQotICAgICBDT0ZGIGZpbGUuICAqLwotCi0gIGlmICghIGlucHV0KQotICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0KLSAgLyogUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mIHRoZSBmaWxlIHRvIHNlZSBpZiB3ZSBjYW4gZ3Vlc3Mgd2hhdAotICAgICBpdCBpcy4gICovCi0KLSAgZSA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUkIpOwotICBpZiAoZSA9PSBOVUxMKQotICAgIGZhdGFsICgiJXM6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIGIxID0gZ2V0YyAoZSk7Ci0gIGIyID0gZ2V0YyAoZSk7Ci0gIGIzID0gZ2V0YyAoZSk7Ci0gIGI0ID0gZ2V0YyAoZSk7Ci0gIGI1ID0gZ2V0YyAoZSk7Ci0KLSAgZmNsb3NlIChlKTsKLQotICAvKiBBIFBFIGV4ZWN1dGFibGUgc3RhcnRzIHdpdGggMHg0ZCAweDVhLiAgKi8KLSAgaWYgKGIxID09IDB4NGQgJiYgYjIgPT0gMHg1YSkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9DT0ZGOwotCi0gIC8qIEEgQ09GRiAubyBmaWxlIHN0YXJ0cyB3aXRoIGEgQ09GRiBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpYyA9IChiMiA8PCA4KSB8IGIxOwotICBzd2l0Y2ggKG1hZ2ljKQotICAgIHsKLSAgICBjYXNlIDB4MTRjOiAvKiBpMzg2ICovCi0gICAgY2FzZSAweDE2NjogLyogTUlQUyAqLwotICAgIGNhc2UgMHgxODQ6IC8qIEFscGhhICovCi0gICAgY2FzZSAweDI2ODogLyogNjhrICovCi0gICAgY2FzZSAweDFmMDogLyogUG93ZXJQQyAqLwotICAgIGNhc2UgMHgyOTA6IC8qIFBBICovCi0gICAgICByZXR1cm4gUkVTX0ZPUk1BVF9DT0ZGOwotICAgIH0KLQotICAvKiBBIFJFUyBmaWxlIHN0YXJ0cyB3aXRoIDB4MCAweDAgMHgwIDB4MCAweDIwIDB4MCAweDAgMHgwLiAgKi8KLSAgaWYgKGIxID09IDAgJiYgYjIgPT0gMCAmJiBiMyA9PSAwICYmIGI0ID09IDAgJiYgYjUgPT0gMHgyMCkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9SRVM7Ci0KLSAgLyogSWYgZXZlcnkgY2hhcmFjdGVyIGlzIHByaW50YWJsZSBvciBzcGFjZSwgYXNzdW1lIGl0J3MgYW4gUkMgZmlsZS4gICovCi0gIGlmICgoaXNwcmludCAoYjEpIHx8IGlzc3BhY2UgKGIxKSkKLSAgICAgICYmIChpc3ByaW50IChiMikgfHwgaXNzcGFjZSAoYjIpKQotICAgICAgJiYgKGlzcHJpbnQgKGIzKSB8fCBpc3NwYWNlIChiMykpCi0gICAgICAmJiAoaXNwcmludCAoYjQpIHx8IGlzc3BhY2UgKGI0KSkKLSAgICAgICYmIChpc3ByaW50IChiNSkgfHwgaXNzcGFjZSAoYjUpKSkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9SQzsKLQotICAvKiBPdGhlcndpc2UsIHdlIGdpdmUgdXAuICAqLwotICBmYXRhbCAoXygiY2FuIG5vdCBkZXRlcm1pbmUgdHlwZSBvZiBmaWxlIGAlcyc7IHVzZSB0aGUgLUkgb3B0aW9uIiksCi0JIGZpbGVuYW1lKTsKLQotICAvKiBSZXR1cm4gc29tZXRoaW5nIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyIHdhcm5pbmcuICAqLwotICByZXR1cm4gUkVTX0ZPUk1BVF9VTktOT1dOOwotfQotCi0vKiBQcmludCBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiVXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXVxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1PcHRpb25zOlxuXAotICAtaSBGSUxFLCAtLWlucHV0IEZJTEUgICAgICAgTmFtZSBpbnB1dCBmaWxlXG5cCi0gIC1vIEZJTEUsIC0tb3V0cHV0IEZJTEUgICAgICBOYW1lIG91dHB1dCBmaWxlXG5cCi0gIC1JIEZPUk1BVCwgLS1pbnB1dC1mb3JtYXQgRk9STUFUXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGlucHV0IGZvcm1hdFxuXAotICAtTyBGT1JNQVQsIC0tb3V0cHV0LWZvcm1hdCBGT1JNQVRcblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgb3V0cHV0IGZvcm1hdFxuXAotICAtRiBUQVJHRVQsIC0tdGFyZ2V0IFRBUkdFVCAgU3BlY2lmeSBDT0ZGIHRhcmdldFxuXAotICAtLXByZXByb2Nlc3NvciBQUk9HUkFNICAgICAgUHJvZ3JhbSB0byB1c2UgdG8gcHJlcHJvY2VzcyByYyBmaWxlXG5cCi0gIC0taW5jbHVkZS1kaXIgRElSICAgICAgICAgICBJbmNsdWRlIGRpcmVjdG9yeSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuXAotICAtRFNZTVs9VkFMXSwgLS1kZWZpbmUgU1lNWz1WQUxdXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgU1lNIHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG5cCi0gIC12ICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJib3NlIC0gdGVsbHMgeW91IHdoYXQgaXQncyBkb2luZ1xuXAotICAtLWxhbmd1YWdlIFZBTCAgICAgICAgICAgICAgU2V0IGxhbmd1YWdlIHdoZW4gcmVhZGluZyByYyBmaWxlXG4iKSk7Ci0jaWZkZWYgWVlERUJVRwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLS15eWRlYnVnICAgICAgICAgICAgICAgICAgIFR1cm4gb24gcGFyc2VyIGRlYnVnZ2luZ1xuIikpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2VcblwKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb25cbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1GT1JNQVQgaXMgb25lIG9mIHJjLCByZXMsIG9yIGNvZmYsIGFuZCBpcyBkZWR1Y2VkIGZyb20gdGhlIGZpbGUgbmFtZVxuXAotZXh0ZW5zaW9uIGlmIG5vdCBzcGVjaWZpZWQuICBBIHNpbmdsZSBmaWxlIG5hbWUgaXMgYW4gaW5wdXQgZmlsZS5cblwKLU5vIGlucHV0LWZpbGUgaXMgc3RkaW4sIGRlZmF1bHQgcmMuICBObyBvdXRwdXQtZmlsZSBpcyBzdGRvdXQsIGRlZmF1bHQgcmMuXG4iKSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLS8qIFF1b3RlIGNoYXJhY3RlcnMgdGhhdCB3aWxsIGNvbmZ1c2UgdGhlIHNoZWxsIHdoZW4gd2UgcnVuIHRoZSBwcmVwcm9jZXNzb3IgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpxdW90IChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RhdGljIGNoYXIgKmJ1ZiA9IDA7Ci0gIHN0YXRpYyBpbnQgYnVmbGVuID0gMDsKLSAgaW50IHNsZW4gPSBzdHJsZW4gKHN0cmluZyk7Ci0gIGNvbnN0IGNoYXIgKnNyYzsKLSAgY2hhciAqZGVzdDsKLQotICBpZiAoKGJ1ZmxlbiA8IHNsZW4gKiAyICsgMikgfHwgIWJ1ZikKLSAgICB7Ci0gICAgICBidWZsZW4gPSBzbGVuICogMiArIDI7Ci0gICAgICBpZiAoYnVmKQotCWZyZWUgKGJ1Zik7Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChidWZsZW4pOwotICAgIH0KLQotICBmb3IgKHNyYz1zdHJpbmcsIGRlc3Q9YnVmOyAqc3JjOyBzcmMrKywgZGVzdCsrKQotICAgIHsKLSAgICAgIGlmICgqc3JjID09ICcoJyB8fCAqc3JjID09ICcpJyB8fCAqc3JjID09ICcgJykKLQkqZGVzdCsrID0gJ1xcJzsKLSAgICAgICpkZXN0ID0gKnNyYzsKLSAgICB9Ci0gICpkZXN0ID0gMDsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogVGhlIG1haW4gZnVuY3Rpb24uICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKmlucHV0X2ZpbGVuYW1lOwotICBjaGFyICpvdXRwdXRfZmlsZW5hbWU7Ci0gIGVudW0gcmVzX2Zvcm1hdCBpbnB1dF9mb3JtYXQ7Ci0gIGVudW0gcmVzX2Zvcm1hdCBvdXRwdXRfZm9ybWF0OwotICBjaGFyICp0YXJnZXQ7Ci0gIGNoYXIgKnByZXByb2Nlc3NvcjsKLSAgY2hhciAqcHJlcHJvY2FyZ3M7Ci0gIGNvbnN0IGNoYXIgKnF1b3RlZGFyZzsKLSAgaW50IGxhbmd1YWdlOwotICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHJlc19pbml0ICgpOwotCi0gIGlucHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgaW5wdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9VTktOT1dOOwotICBvdXRwdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9VTktOT1dOOwotICB0YXJnZXQgPSBOVUxMOwotICBwcmVwcm9jZXNzb3IgPSBOVUxMOwotICBwcmVwcm9jYXJncyA9IE5VTEw7Ci0gIGxhbmd1YWdlID0gLTE7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJpOm86STpPOkY6RDp2IiwgbG9uZ19vcHRpb25zLAotCQkJICAgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnaSc6Ci0JICBpbnB1dF9maWxlbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbyc6Ci0JICBvdXRwdXRfZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgJ0knOgotCSAgaW5wdXRfZm9ybWF0ID0gZm9ybWF0X2Zyb21fbmFtZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTyc6Ci0JICBvdXRwdXRfZm9ybWF0ID0gZm9ybWF0X2Zyb21fbmFtZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRic6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1BSRVBST0NFU1NPUjoKLQkgIHByZXByb2Nlc3NvciA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRCc6Ci0JY2FzZSBPUFRJT05fREVGSU5FOgotCSAgaWYgKHByZXByb2NhcmdzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBxdW90ZWRhcmcgPSBxdW90IChvcHRhcmcpOwotCSAgICAgIHByZXByb2NhcmdzID0geG1hbGxvYyAoc3RybGVuIChxdW90ZWRhcmcpICsgMyk7Ci0JICAgICAgc3ByaW50ZiAocHJlcHJvY2FyZ3MsICItRCVzIiwgcXVvdGVkYXJnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIHF1b3RlZGFyZyA9IHF1b3QgKG9wdGFyZyk7Ci0JICAgICAgbiA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2FyZ3MpICsgc3RybGVuIChxdW90ZWRhcmcpICsgNCk7Ci0JICAgICAgc3ByaW50ZiAobiwgIiVzIC1EJXMiLCBwcmVwcm9jYXJncywgcXVvdGVkYXJnKTsKLQkgICAgICBmcmVlIChwcmVwcm9jYXJncyk7Ci0JICAgICAgcHJlcHJvY2FyZ3MgPSBuOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3YnOgotCSAgdmVyYm9zZSArKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSU5DTFVERV9ESVI6Ci0JICBpZiAocHJlcHJvY2FyZ3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHF1b3RlZGFyZyA9IHF1b3QgKG9wdGFyZyk7Ci0JICAgICAgcHJlcHJvY2FyZ3MgPSB4bWFsbG9jIChzdHJsZW4gKHF1b3RlZGFyZykgKyAzKTsKLQkgICAgICBzcHJpbnRmIChwcmVwcm9jYXJncywgIi1JJXMiLCBxdW90ZWRhcmcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpuOwotCi0JICAgICAgcXVvdGVkYXJnID0gcXVvdCAob3B0YXJnKTsKLQkgICAgICBuID0geG1hbGxvYyAoc3RybGVuIChwcmVwcm9jYXJncykgKyBzdHJsZW4gKHF1b3RlZGFyZykgKyA0KTsKLQkgICAgICBzcHJpbnRmIChuLCAiJXMgLUklcyIsIHByZXByb2NhcmdzLCBxdW90ZWRhcmcpOwotCSAgICAgIGZyZWUgKHByZXByb2NhcmdzKTsKLQkgICAgICBwcmVwcm9jYXJncyA9IG47Ci0JICAgIH0KLQotCSAgewotCSAgICBzdHJ1Y3QgaW5jbHVkZV9kaXIgKm4sICoqcHA7Ci0KLQkgICAgbiA9IChzdHJ1Y3QgaW5jbHVkZV9kaXIgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLQkgICAgbi0+bmV4dCA9IE5VTEw7Ci0JICAgIG4tPmRpciA9IG9wdGFyZzsKLQotCSAgICBmb3IgKHBwID0gJmluY2x1ZGVfZGlyczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCSAgICAgIDsKLQkgICAgKnBwID0gbjsKLQkgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9MQU5HVUFHRToKLQkgIGxhbmd1YWdlID0gc3RydG9sIChvcHRhcmcsIChjaGFyICoqKSBOVUxMLCAxNik7Ci0JICBicmVhazsKLQotI2lmZGVmIFlZREVCVUcKLQljYXNlIE9QVElPTl9ZWURFQlVHOgotCSAgeXlkZWJ1ZyA9IDE7Ci0JICBicmVhazsKLSNlbmRpZgotCi0JY2FzZSBPUFRJT05fSEVMUDoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9WRVJTSU9OOgotCSAgcHJpbnRfdmVyc2lvbiAoIndpbmRyZXMiKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaW5wdXRfZmlsZW5hbWUgPT0gTlVMTCAmJiBvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICAgICAgKytvcHRpbmQ7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfZmlsZW5hbWUgPT0gTlVMTCAmJiBvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgIH0KLQotICBpZiAoYXJnYyAhPSBvcHRpbmQpCi0gICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgaWYgKGlucHV0X2Zvcm1hdCA9PSBSRVNfRk9STUFUX1VOS05PV04pCi0gICAgewotICAgICAgaWYgKGlucHV0X2ZpbGVuYW1lID09IE5VTEwpCi0JaW5wdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9SQzsKLSAgICAgIGVsc2UKLQlpbnB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9maWxlbmFtZSAoaW5wdXRfZmlsZW5hbWUsIDEpOwotICAgIH0KLQotICBpZiAob3V0cHV0X2Zvcm1hdCA9PSBSRVNfRk9STUFUX1VOS05PV04pCi0gICAgewotICAgICAgaWYgKG91dHB1dF9maWxlbmFtZSA9PSBOVUxMKQotCW91dHB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1JDOwotICAgICAgZWxzZQotCW91dHB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9maWxlbmFtZSAob3V0cHV0X2ZpbGVuYW1lLCAwKTsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgaW5wdXQgZmlsZS4gICovCi0KLSAgc3dpdGNoIChpbnB1dF9mb3JtYXQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIFJFU19GT1JNQVRfUkM6Ci0gICAgICByZXNvdXJjZXMgPSByZWFkX3JjX2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCBwcmVwcm9jZXNzb3IsIHByZXByb2NhcmdzLAotCQkJCWxhbmd1YWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SRVM6Ci0gICAgICByZXNvdXJjZXMgPSByZWFkX3Jlc19maWxlIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFU19GT1JNQVRfQ09GRjoKLSAgICAgIHJlc291cmNlcyA9IHJlYWRfY29mZl9yc3JjIChpbnB1dF9maWxlbmFtZSwgdGFyZ2V0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAocmVzb3VyY2VzID09IE5VTEwpCi0gICAgZmF0YWwgKF8oIm5vIHJlc291cmNlcyIpKTsKLQotICAvKiBTb3J0IHRoZSByZXNvdXJjZXMuICBUaGlzIGlzIHJlcXVpcmVkIGZvciBDT0ZGLCBjb252ZW5pZW50IGZvcgotICAgICByYywgYW5kIHVuaW1wb3J0YW50IGZvciByZXMuICAqLwotCi0gIHJlc291cmNlcyA9IHNvcnRfcmVzb3VyY2VzIChyZXNvdXJjZXMpOwotCi0gIC8qIFdyaXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgcmVzd3JfaW5pdCAoKTsKLQotICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIFJFU19GT1JNQVRfUkM6Ci0gICAgICB3cml0ZV9yY19maWxlIChvdXRwdXRfZmlsZW5hbWUsIHJlc291cmNlcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFU19GT1JNQVRfUkVTOgotICAgICAgd3JpdGVfcmVzX2ZpbGUgKG91dHB1dF9maWxlbmFtZSwgcmVzb3VyY2VzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9DT0ZGOgotICAgICAgd3JpdGVfY29mZl9maWxlIChvdXRwdXRfZmlsZW5hbWUsIHRhcmdldCwgcmVzb3VyY2VzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB4ZXhpdCAoMCk7Ci0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9iaW51dGlscy93aW5kcmVzLmggYi9iaW51dGlscy93aW5kcmVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDNkZDUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd2luZHJlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODQ5ICswLDAgQEAKLS8qIHdpbmRyZXMuaCAtLSBoZWFkZXIgZmlsZSBmb3Igd2luZHJlcyBwcm9ncmFtLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVGhpcyBpcyB0aGUgaGVhZGVyIGZpbGUgZm9yIHRoZSB3aW5kcmVzIHByb2dyYW0uICBJdCBkZWZpbmVzCi0gICBzdHJ1Y3R1cmVzIGFuZCBkZWNsYXJlcyBmdW5jdGlvbnMgdXNlZCB3aXRoaW4gdGhlIHByb2dyYW0uICAqLwotCi0jaW5jbHVkZSAid2luZHVuaS5oIgotCi0vKiBXZSByZXByZXNlbnQgcmVzb3VyY2VzIGludGVybmFsbHkgYXMgYSB0cmVlLCBzaW1pbGFyIHRvIHRoZSB0cmVlCi0gICB1c2VkIGluIHRoZSAucnNyYyBzZWN0aW9uIG9mIGEgQ09GRiBmaWxlLiAgVGhlIHJvb3QgaXMgYQotICAgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX2RpcmVjdG9yeQotewotICAvKiBSZXNvdXJjZSBmbGFncy4gIEFjY29yZGluZyB0byB0aGUgTVMgZG9jcywgdGhpcyBpcyBjdXJyZW50bHkKLSAgICAgYWx3YXlzIHplcm8uICAqLwotICB1bnNpZ25lZCBsb25nIGNoYXJhY3RlcmlzdGljczsKLSAgLyogVGltZS9kYXRlIHN0YW1wLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB0aW1lOwotICAvKiBNYWpvciB2ZXJzaW9uIG51bWJlci4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1ham9yOwotICAvKiBNaW5vciB2ZXJzaW9uIG51bWJlci4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1pbm9yOwotICAvKiBEaXJlY3RvcnkgZW50cmllcy4gICovCi0gIHN0cnVjdCByZXNfZW50cnkgKmVudHJpZXM7Ci19OwotCi0vKiBBIHJlc291cmNlIElEIGlzIHN0b3JlZCBpbiBhIHJlc19pZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX2lkCi17Ci0gIC8qIE5vbi16ZXJvIGlmIHRoaXMgZW50cnkgaGFzIGEgbmFtZSByYXRoZXIgdGhhbiBhbiBJRC4gICovCi0gIHVuc2lnbmVkIGludCBuYW1lZCA6IDE7Ci0gIHVuaW9uCi0gIHsKLSAgICAvKiBJZiB0aGUgbmFtZWQgZmllbGQgaXMgbm9uLXplcm8sIHRoaXMgaXMgdGhlIG5hbWUuICAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIExlbmd0aCBvZiB0aGUgbmFtZS4gICovCi0gICAgICBpbnQgbGVuZ3RoOwotICAgICAgLyogUG9pbnRlciB0byB0aGUgbmFtZSwgd2hpY2ggaXMgYSBVbmljb2RlIHN0cmluZy4gICovCi0gICAgICB1bmljaGFyICpuYW1lOwotICAgIH0gbjsKLSAgICAvKiBJZiB0aGUgbmFtZWQgZmllbGQgaXMgemVybywgdGhpcyBpcyB0aGUgSUQuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgaWQ7Ci0gIH0gdTsKLX07Ci0KLS8qIEVhY2ggZW50cnkgaW4gdGhlIHRyZWUgaXMgYSByZXNfZW50cnkgc3RydWN0dXJlLiAgV2UgbWl4Ci0gICBkaXJlY3RvcmllcyBhbmQgcmVzb3VyY2VzIGJlY2F1c2UgaW4gYSBDT0ZGIGZpbGUgYWxsIGVudHJpZXMgaW4gYQotICAgZGlyZWN0b3J5IGFyZSBzb3J0ZWQgdG9nZXRoZXIsIHdoZXRoZXIgdGhlIGVudHJpZXMgYXJlCi0gICBzdWJkaXJlY3RvcmllcyBvciByZXNvdXJjZXMuICAqLwotCi1zdHJ1Y3QgcmVzX2VudHJ5Ci17Ci0gIC8qIE5leHQgZW50cnkuICAqLwotICBzdHJ1Y3QgcmVzX2VudHJ5ICpuZXh0OwotICAvKiBSZXNvdXJjZSBJRC4gICovCi0gIHN0cnVjdCByZXNfaWQgaWQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoaXMgZW50cnkgaXMgYSBzdWJkaXJlY3RvcnkgcmF0aGVyIHRoYW4gYSBsZWFmLiAgKi8KLSAgdW5zaWduZWQgaW50IHN1YmRpciA6IDE7Ci0gIHVuaW9uCi0gIHsKLSAgICAvKiBJZiB0aGUgc3ViZGlyIGZpZWxkIGlzIG5vbi16ZXJvLCB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUKLSAgICAgICBzdWJkaXJlY3RvcnkuICAqLwotICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpkaXI7Ci0gICAgLyogSWYgdGhlIHN1YmRpciBmaWVsZCBpcyB6ZXJvLCB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUgcmVzb3VyY2UKLSAgICAgICBkYXRhLiAgKi8KLSAgICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gIH0gdTsKLX07Ci0KLS8qIFR5cGVzIG9mIHJlc291cmNlcy4gICovCi0KLWVudW0gcmVzX3R5cGUKLXsKLSAgUkVTX1RZUEVfVU5JTklUSUFMSVpFRCwKLSAgUkVTX1RZUEVfQUNDRUxFUkFUT1IsCi0gIFJFU19UWVBFX0JJVE1BUCwKLSAgUkVTX1RZUEVfQ1VSU09SLAotICBSRVNfVFlQRV9HUk9VUF9DVVJTT1IsCi0gIFJFU19UWVBFX0RJQUxPRywKLSAgUkVTX1RZUEVfRk9OVCwKLSAgUkVTX1RZUEVfRk9OVERJUiwKLSAgUkVTX1RZUEVfSUNPTiwKLSAgUkVTX1RZUEVfR1JPVVBfSUNPTiwKLSAgUkVTX1RZUEVfTUVOVSwKLSAgUkVTX1RZUEVfTUVTU0FHRVRBQkxFLAotICBSRVNfVFlQRV9SQ0RBVEEsCi0gIFJFU19UWVBFX1NUUklOR1RBQkxFLAotICBSRVNfVFlQRV9VU0VSREFUQSwKLSAgUkVTX1RZUEVfVkVSU0lPTklORk8KLX07Ci0KLS8qIEEgcmVzIGZpbGUgYW5kIGEgQ09GRiBmaWxlIHN0b3JlIGluZm9ybWF0aW9uIGRpZmZlcmVudGx5LiAgVGhlCi0gICByZXNfaW5mbyBzdHJ1Y3R1cmVzIGhvbGRzIGRhdGEgd2hpY2ggaW4gYSByZXMgZmlsZSBpcyBzdG9yZWQgd2l0aAotICAgZWFjaCByZXNvdXJjZSwgYnV0IGluIGEgQ09GRiBmaWxlIGlzIHN0b3JlZCBlbHNld2hlcmUuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc19pbmZvCi17Ci0gIC8qIExhbmd1YWdlLiAgSW4gYSBDT0ZGIGZpbGUsIHRoZSB0aGlyZCBsZXZlbCBvZiB0aGUgZGlyZWN0b3J5IGlzCi0gICAgIGtleWVkIGJ5IHRoZSBsYW5ndWFnZSwgc28gdGhlIGxhbmd1YWdlIG9mIGEgcmVzb3VyY2UgaXMgZGVmaW5lZAotICAgICBieSBpdHMgbG9jYXRpb24gaW4gdGhlIHJlc291cmNlIHRyZWUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBsYW5ndWFnZTsKLSAgLyogQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSByZXNvdXJjZS4gIEVudGlyZWx5IHVzZXIgZGVmaW5lZC4gIEluIGEKLSAgICAgQ09GRiBmaWxlLCB0aGUgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUgaGFzIGEgY2hhcmFjdGVyaXN0aWNzCi0gICAgIGZpZWxkLCBidXQgSSBkb24ndCBrbm93IGlmIGl0J3MgcmVsYXRlZCB0byB0aGUgb25lIGluIHRoZSByZXMKLSAgICAgZmlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgY2hhcmFjdGVyaXN0aWNzOwotICAvKiBWZXJzaW9uIG9mIHRoZSByZXNvdXJjZS4gIEVudGlyZWx5IHVzZXIgZGVmaW5lZC4gIEluIGEgQ09GRiBmaWxlLAotICAgICB0aGUgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUgaGFzIGEgY2hhcmFjdGVyaXN0aWNzIGZpZWxkLCBidXQgSQotICAgICBkb24ndCBrbm93IGlmIGl0J3MgcmVsYXRlZCB0byB0aGUgb25lIGluIHRoZSByZXMgZmlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmVyc2lvbjsKLSAgLyogTWVtb3J5IGZsYWdzLiAgVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBNRU1GTEFHIHZhbHVlcwotICAgICBkZWZpbmVkIGJlbG93LiAgTW9zdCBvZiB0aGVzZSB2YWx1ZXMgYXJlIGhpc3RvcmljYWwsIGFuZCBhcmUgbm90Ci0gICAgIG1lYW5pbmdmdWwgZm9yIHdpbjMyLiAgSSBkb24ndCB0aGluayB0aGVyZSBpcyBhbnkgd2F5IHRvIHN0b3JlCi0gICAgIHRoaXMgaW5mb3JtYXRpb24gaW4gYSBDT0ZGIGZpbGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBtZW1mbGFnczsKLX07Ci0KLS8qIEVhY2ggcmVzb3VyY2UgaW4gYSBDT0ZGIGZpbGUgaGFzIHNvbWUgaW5mb3JtYXRpb24gd2hpY2ggY2FuIGRvZXMKLSAgIG5vdCBhcHBlYXIgaW4gYSByZXMgZmlsZS4gICovCi0KLXN0cnVjdCByZXNfY29mZl9pbmZvCi17Ci0gIC8qIFRoZSBjb2RlIHBhZ2UgdXNlZCBmb3IgdGhlIGRhdGEuICBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcwotICAgICBzaG91bGQgYmUuICAqLwotICB1bnNpZ25lZCBsb25nIGNvZGVwYWdlOwotICAvKiBBIHJlc291cmNlIGVudHJ5IGluIGEgQ09GRiBmaWxlIGhhcyBhIHJlc2VydmVkIGZpZWxkLCB3aGljaCB3ZQotICAgICByZWNvcmQgaGVyZSB3aGVuIHJlYWRpbmcgYSBDT0ZGIGZpbGUuICBXaGVuIHdyaXRpbmcgYSBDT0ZGIGZpbGUsCi0gICAgIHdlIHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkOwotfTsKLQotLyogUmVzb3VyY2UgZGF0YSBpcyBzdG9yZWQgaW4gYSByZXNfcmVzb3VyY2Ugc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZQotewotICAvKiBUaGUgdHlwZSBvZiByZXNvdXJjZS4gICovCi0gIGVudW0gcmVzX3R5cGUgdHlwZTsKLSAgLyogVGhlIGRhdGEgZm9yIHRoZSByZXNvdXJjZS4gICovCi0gIHVuaW9uCi0gIHsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgfSBkYXRhOwotICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjOwotICAgIHN0cnVjdCBjdXJzb3IgKmN1cnNvcjsKLSAgICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpncm91cF9jdXJzb3I7Ci0gICAgc3RydWN0IGRpYWxvZyAqZGlhbG9nOwotICAgIHN0cnVjdCBmb250ZGlyICpmb250ZGlyOwotICAgIHN0cnVjdCBncm91cF9pY29uICpncm91cF9pY29uOwotICAgIHN0cnVjdCBtZW51ICptZW51OwotICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhOwotICAgIHN0cnVjdCBzdHJpbmd0YWJsZSAqc3RyaW5ndGFibGU7Ci0gICAgc3RydWN0IHJjZGF0YV9pdGVtICp1c2VyZGF0YTsKLSAgICBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOwotICB9IHU7Ci0gIC8qIEluZm9ybWF0aW9uIGZyb20gYSByZXMgZmlsZS4gICovCi0gIHN0cnVjdCByZXNfcmVzX2luZm8gcmVzX2luZm87Ci0gIC8qIEluZm9ybWF0aW9uIGZyb20gYSBDT0ZGIGZpbGUuICAqLwotICBzdHJ1Y3QgcmVzX2NvZmZfaW5mbyBjb2ZmX2luZm87Ci19OwotCi0vKiBNZW1vcnkgZmxhZ3MgaW4gdGhlIG1lbWZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHJlc19yZXNvdXJjZS4gICovCi0KLSNkZWZpbmUgTUVNRkxBR19NT1ZFQUJMRQkweDEwCi0jZGVmaW5lIE1FTUZMQUdfUFVSRQkJMHgyMAotI2RlZmluZSBNRU1GTEFHX1BSRUxPQUQJCTB4NDAKLSNkZWZpbmUgTUVNRkxBR19ESVNDQVJEQUJMRQkweDEwMDAKLQotLyogU3RhbmRhcmQgcmVzb3VyY2UgdHlwZSBjb2Rlcy4gIFRoZXNlIGFyZSB1c2VkIGluIHRoZSBJRCBmaWVsZCBvZiBhCi0gICByZXNfZW50cnkgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBSVF9DVVJTT1IJCSAxCi0jZGVmaW5lIFJUX0JJVE1BUAkJIDIKLSNkZWZpbmUgUlRfSUNPTgkJCSAzCi0jZGVmaW5lIFJUX01FTlUJCQkgNAotI2RlZmluZSBSVF9ESUFMT0cJCSA1Ci0jZGVmaW5lIFJUX1NUUklORwkJIDYKLSNkZWZpbmUgUlRfRk9OVERJUgkJIDcKLSNkZWZpbmUgUlRfRk9OVAkJCSA4Ci0jZGVmaW5lIFJUX0FDQ0VMRVJBVE9SCQkgOQotI2RlZmluZSBSVF9SQ0RBVEEJCTEwCi0jZGVmaW5lIFJUX01FU1NBR0VUQUJMRQkJMTEKLSNkZWZpbmUgUlRfR1JPVVBfQ1VSU09SCQkxMgotI2RlZmluZSBSVF9HUk9VUF9JQ09OCQkxNAotI2RlZmluZSBSVF9WRVJTSU9OCQkxNgotI2RlZmluZSBSVF9ETEdJTkNMVURFCQkxNwotI2RlZmluZSBSVF9QTFVHUExBWQkJMTkKLSNkZWZpbmUgUlRfVlhECQkJMjAKLSNkZWZpbmUgUlRfQU5JQ1VSU09SCQkyMQotI2RlZmluZSBSVF9BTklJQ09OCQkyMgotCi0vKiBBbiBhY2NlbGVyYXRvciByZXNvdXJjZSBpcyBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgYWNjZWxlcmF0b3IKLXsKLSAgLyogTmV4dCBhY2NlbGVyYXRvci4gICovCi0gIHN0cnVjdCBhY2NlbGVyYXRvciAqbmV4dDsKLSAgLyogRmxhZ3MuICBBIGNvbWJpbmF0aW9uIG9mIHRoZSBBQ0MgdmFsdWVzIGRlZmluZWQgYmVsb3cuICAqLwotICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKLSAgLyogS2V5IHZhbHVlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQga2V5OwotICAvKiBSZXNvdXJjZSBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGlkOwotfTsKLQotLyogQWNjZWxlcmF0b3IgZmxhZ3MgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFjY2VsZXJhdG9yLgotICAgVGhlc2UgYXJlIHRoZSBzYW1lIHZhbHVlcyB0aGF0IGFwcGVhciBpbiBhIHJlcyBmaWxlLiAgSSBob3BlLiAgKi8KLQotI2RlZmluZSBBQ0NfVklSVEtFWQkweDAxCi0jZGVmaW5lIEFDQ19OT0lOVkVSVAkweDAyCi0jZGVmaW5lIEFDQ19TSElGVAkweDA0Ci0jZGVmaW5lIEFDQ19DT05UUk9MCTB4MDgKLSNkZWZpbmUgQUNDX0FMVAkJMHgxMAotI2RlZmluZSBBQ0NfTEFTVAkweDgwCi0KLS8qIEEgY3Vyc29yIHJlc291cmNlLiAgKi8KLQotc3RydWN0IGN1cnNvcgotewotICAvKiBYIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCi0gIHNob3J0IHhob3RzcG90OwotICAvKiBZIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCi0gIHNob3J0IHlob3RzcG90OwotICAvKiBMZW5ndGggb2YgYml0bWFwIGRhdGEuICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgLyogRGF0YS4gICovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci19OwotCi0vKiBBIGdyb3VwX2N1cnNvciByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZ3JvdXBfY3Vyc29yIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgZ3JvdXBfY3Vyc29yCi17Ci0gIC8qIE5leHQgY3Vyc29yIGluIGdyb3VwLiAgKi8KLSAgc3RydWN0IGdyb3VwX2N1cnNvciAqbmV4dDsKLSAgLyogV2lkdGguICAqLwotICB1bnNpZ25lZCBzaG9ydCB3aWR0aDsKLSAgLyogSGVpZ2h0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaGVpZ2h0OwotICAvKiBQbGFuZXMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBwbGFuZXM7Ci0gIC8qIEJpdHMgcGVyIHBpeGVsLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgYml0czsKLSAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIGN1cnNvciByZXNvdXJjZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgYnl0ZXM7Ci0gIC8qIEluZGV4IG9mIGN1cnNvciByZXNvdXJjZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IGluZGV4OwotfTsKLQotLyogQSBkaWFsb2cgcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgZGlhbG9nCi17Ci0gIC8qIEJhc2ljIHdpbmRvdyBzdHlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgc3R5bGU7Ci0gIC8qIEV4dGVuZGVkIHdpbmRvdyBzdHlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgZXhzdHlsZTsKLSAgLyogWCBjb29yZGluYXRlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgeDsKLSAgLyogWSBjb29yZGluYXRlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgeTsKLSAgLyogV2lkdGguICAqLwotICB1bnNpZ25lZCBzaG9ydCB3aWR0aDsKLSAgLyogSGVpZ2h0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaGVpZ2h0OwotICAvKiBNZW51IG5hbWUuICAqLwotICBzdHJ1Y3QgcmVzX2lkIG1lbnU7Ci0gIC8qIENsYXNzIG5hbWUuICAqLwotICBzdHJ1Y3QgcmVzX2lkIGNsYXNzOwotICAvKiBDYXB0aW9uLiAgKi8KLSAgdW5pY2hhciAqY2FwdGlvbjsKLSAgLyogRm9udCBwb2ludCBzaXplLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgcG9pbnRzaXplOwotICAvKiBGb250IG5hbWUuICAqLwotICB1bmljaGFyICpmb250OwotICAvKiBFeHRlbmRlZCBpbmZvcm1hdGlvbiBmb3IgYSBkaWFsb2dleC4gICovCi0gIHN0cnVjdCBkaWFsb2dfZXggKmV4OwotICAvKiBDb250cm9scy4gICovCi0gIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqY29udHJvbHM7Ci19OwotCi0vKiBBbiBleHRlbmRlZCBkaWFsb2cgaGFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZGlhbG9nX2V4Ci17Ci0gIC8qIEhlbHAgSUQuICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci0gIC8qIEZvbnQgd2VpZ2h0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgd2VpZ2h0OwotICAvKiBXaGV0aGVyIHRoZSBmb250IGlzIGl0YWxpYy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGl0YWxpYzsKLX07Ci0KLS8qIFdpbmRvdyBzdHlsZSBmbGFncywgZnJvbSB0aGUgd2luc3VwIERlZmluZXMuaCBoZWFkZXIgZmlsZS4gIFRoZXNlCi0gICBjYW4gYXBwZWFyIGluIHRoZSBzdHlsZSBmaWVsZCBvZiBhIHN0cnVjdCBkaWFsb2cgb3IgYSBzdHJ1Y3QKLSAgIGRpYWxvZ19jb250cm9sLiAgKi8KLQotI2RlZmluZSBDV19VU0VERUZBVUxUCSgweDgwMDAwMDAwKQotI2RlZmluZSBXU19CT1JERVIJKDB4ODAwMDAwTCkKLSNkZWZpbmUgV1NfQ0FQVElPTgkoMHhjMDAwMDBMKQotI2RlZmluZSBXU19DSElMRAkoMHg0MDAwMDAwMEwpCi0jZGVmaW5lIFdTX0NISUxEV0lORE9XCSgweDQwMDAwMDAwTCkKLSNkZWZpbmUgV1NfQ0xJUENISUxEUkVOCSgweDIwMDAwMDBMKQotI2RlZmluZSBXU19DTElQU0lCTElOR1MJKDB4NDAwMDAwMEwpCi0jZGVmaW5lIFdTX0RJU0FCTEVECSgweDgwMDAwMDBMKQotI2RlZmluZSBXU19ETEdGUkFNRQkoMHg0MDAwMDBMKQotI2RlZmluZSBXU19HUk9VUAkoMHgyMDAwMEwpCi0jZGVmaW5lIFdTX0hTQ1JPTEwJKDB4MTAwMDAwTCkKLSNkZWZpbmUgV1NfSUNPTklDCSgweDIwMDAwMDAwTCkKLSNkZWZpbmUgV1NfTUFYSU1JWkUJKDB4MTAwMDAwMEwpCi0jZGVmaW5lIFdTX01BWElNSVpFQk9YCSgweDEwMDAwTCkKLSNkZWZpbmUgV1NfTUlOSU1JWkUJKDB4MjAwMDAwMDBMKQotI2RlZmluZSBXU19NSU5JTUlaRUJPWAkoMHgyMDAwMEwpCi0jZGVmaW5lIFdTX09WRVJMQVBQRUQJKDBMKQotI2RlZmluZSBXU19PVkVSTEFQUEVEV0lORE9XCSgweGNmMDAwMEwpCi0jZGVmaW5lIFdTX1BPUFVQCSgweDgwMDAwMDAwTCkKLSNkZWZpbmUgV1NfUE9QVVBXSU5ET1cJKDB4ODA4ODAwMDBMKQotI2RlZmluZSBXU19TSVpFQk9YCSgweDQwMDAwTCkKLSNkZWZpbmUgV1NfU1lTTUVOVQkoMHg4MDAwMEwpCi0jZGVmaW5lIFdTX1RBQlNUT1AJKDB4MTAwMDBMKQotI2RlZmluZSBXU19USElDS0ZSQU1FCSgweDQwMDAwTCkKLSNkZWZpbmUgV1NfVElMRUQJKDBMKQotI2RlZmluZSBXU19USUxFRFdJTkRPVwkoMHhjZjAwMDBMKQotI2RlZmluZSBXU19WSVNJQkxFCSgweDEwMDAwMDAwTCkKLSNkZWZpbmUgV1NfVlNDUk9MTAkoMHgyMDAwMDBMKQotI2RlZmluZSBNRElTX0FMTENISUxEU1RZTEVTCSgweDEpCi0jZGVmaW5lIEJTXzNTVEFURQkoMHg1TCkKLSNkZWZpbmUgQlNfQVVUTzNTVEFURQkoMHg2TCkKLSNkZWZpbmUgQlNfQVVUT0NIRUNLQk9YCSgweDNMKQotI2RlZmluZSBCU19BVVRPUkFESU9CVVRUT04JKDB4OUwpCi0jZGVmaW5lIEJTX0JJVE1BUAkoMHg4MEwpCi0jZGVmaW5lIEJTX0JPVFRPTQkoMHg4MDBMKQotI2RlZmluZSBCU19DRU5URVIJKDB4MzAwTCkKLSNkZWZpbmUgQlNfQ0hFQ0tCT1gJKDB4MkwpCi0jZGVmaW5lIEJTX0RFRlBVU0hCVVRUT04JKDB4MUwpCi0jZGVmaW5lIEJTX0dST1VQQk9YCSgweDdMKQotI2RlZmluZSBCU19JQ09OCSgweDQwTCkKLSNkZWZpbmUgQlNfTEVGVAkoMHgxMDBMKQotI2RlZmluZSBCU19MRUZUVEVYVAkoMHgyMEwpCi0jZGVmaW5lIEJTX01VTFRJTElORQkoMHgyMDAwTCkKLSNkZWZpbmUgQlNfTk9USUZZCSgweDQwMDBMKQotI2RlZmluZSBCU19PV05FUkRSQVcJKDB4YkwpCi0jZGVmaW5lIEJTX1BVU0hCT1gJKDB4Y0wpCQkvKiBGSVhNRSEgIFdoYXQgc2hvdWxkIHRoaXMgYmU/ICAqLwotI2RlZmluZSBCU19QVVNIQlVUVE9OCSgwTCkKLSNkZWZpbmUgQlNfUFVTSExJS0UJKDB4MTAwMEwpCi0jZGVmaW5lIEJTX1JBRElPQlVUVE9OCSgweDRMKQotI2RlZmluZSBCU19SSUdIVAkoMHgyMDBMKQotI2RlZmluZSBCU19SSUdIVEJVVFRPTgkoMHgyMEwpCi0jZGVmaW5lIEJTX1RFWFQJKDBMKQotI2RlZmluZSBCU19UT1AJKDB4NDAwTCkKLSNkZWZpbmUgQlNfVVNFUkJVVFRPTgkoMHg4TCkKLSNkZWZpbmUgQlNfVkNFTlRFUgkoMHhjMDBMKQotI2RlZmluZSBDQlNfQVVUT0hTQ1JPTEwJKDB4NDBMKQotI2RlZmluZSBDQlNfRElTQUJMRU5PU0NST0xMCSgweDgwMEwpCi0jZGVmaW5lIENCU19EUk9QRE9XTgkoMHgyTCkKLSNkZWZpbmUgQ0JTX0RST1BET1dOTElTVAkoMHgzTCkKLSNkZWZpbmUgQ0JTX0hBU1NUUklOR1MJKDB4MjAwTCkKLSNkZWZpbmUgQ0JTX0xPV0VSQ0FTRQkoMHg0MDAwTCkKLSNkZWZpbmUgQ0JTX05PSU5URUdSQUxIRUlHSFQJKDB4NDAwTCkKLSNkZWZpbmUgQ0JTX09FTUNPTlZFUlQJKDB4ODBMKQotI2RlZmluZSBDQlNfT1dORVJEUkFXRklYRUQJKDB4MTBMKQotI2RlZmluZSBDQlNfT1dORVJEUkFXVkFSSUFCTEUJKDB4MjBMKQotI2RlZmluZSBDQlNfU0lNUExFCSgweDFMKQotI2RlZmluZSBDQlNfU09SVAkoMHgxMDBMKQotI2RlZmluZSBDQlNfVVBQRVJDQVNFCSgweDIwMDBMKQotI2RlZmluZSBFU19BVVRPSFNDUk9MTAkoMHg4MEwpCi0jZGVmaW5lIEVTX0FVVE9WU0NST0xMCSgweDQwTCkKLSNkZWZpbmUgRVNfQ0VOVEVSCSgweDFMKQotI2RlZmluZSBFU19MRUZUCSgwTCkKLSNkZWZpbmUgRVNfTE9XRVJDQVNFCSgweDEwTCkKLSNkZWZpbmUgRVNfTVVMVElMSU5FCSgweDRMKQotI2RlZmluZSBFU19OT0hJREVTRUwJKDB4MTAwTCkKLSNkZWZpbmUgRVNfTlVNQkVSCSgweDIwMDBMKQotI2RlZmluZSBFU19PRU1DT05WRVJUCSgweDQwMEwpCi0jZGVmaW5lIEVTX1BBU1NXT1JECSgweDIwTCkKLSNkZWZpbmUgRVNfUkVBRE9OTFkJKDB4ODAwTCkKLSNkZWZpbmUgRVNfUklHSFQJKDB4MkwpCi0jZGVmaW5lIEVTX1VQUEVSQ0FTRQkoMHg4TCkKLSNkZWZpbmUgRVNfV0FOVFJFVFVSTgkoMHgxMDAwTCkKLSNkZWZpbmUgTEJTX0RJU0FCTEVOT1NDUk9MTAkoMHgxMDAwTCkKLSNkZWZpbmUgTEJTX0VYVEVOREVEU0VMCSgweDgwMEwpCi0jZGVmaW5lIExCU19IQVNTVFJJTkdTCSgweDQwTCkKLSNkZWZpbmUgTEJTX01VTFRJQ09MVU1OCSgweDIwMEwpCi0jZGVmaW5lIExCU19NVUxUSVBMRVNFTAkoMHg4TCkKLSNkZWZpbmUgTEJTX05PREFUQQkoMHgyMDAwTCkKLSNkZWZpbmUgTEJTX05PSU5URUdSQUxIRUlHSFQJKDB4MTAwTCkKLSNkZWZpbmUgTEJTX05PUkVEUkFXCSgweDRMKQotI2RlZmluZSBMQlNfTk9TRUwJKDB4NDAwMEwpCi0jZGVmaW5lIExCU19OT1RJRlkJKDB4MUwpCi0jZGVmaW5lIExCU19PV05FUkRSQVdGSVhFRAkoMHgxMEwpCi0jZGVmaW5lIExCU19PV05FUkRSQVdWQVJJQUJMRQkoMHgyMEwpCi0jZGVmaW5lIExCU19TT1JUCSgweDJMKQotI2RlZmluZSBMQlNfU1RBTkRBUkQJKDB4YTAwMDAzTCkKLSNkZWZpbmUgTEJTX1VTRVRBQlNUT1BTCSgweDgwTCkKLSNkZWZpbmUgTEJTX1dBTlRLRVlCT0FSRElOUFVUCSgweDQwMEwpCi0jZGVmaW5lIFNCU19CT1RUT01BTElHTgkoMHg0TCkKLSNkZWZpbmUgU0JTX0hPUloJKDBMKQotI2RlZmluZSBTQlNfTEVGVEFMSUdOCSgweDJMKQotI2RlZmluZSBTQlNfUklHSFRBTElHTgkoMHg0TCkKLSNkZWZpbmUgU0JTX1NJWkVCT1gJKDB4OEwpCi0jZGVmaW5lIFNCU19TSVpFQk9YQk9UVE9NUklHSFRBTElHTgkoMHg0TCkKLSNkZWZpbmUgU0JTX1NJWkVCT1hUT1BMRUZUQUxJR04JKDB4MkwpCi0jZGVmaW5lIFNCU19TSVpFR1JJUAkoMHgxMEwpCi0jZGVmaW5lIFNCU19UT1BBTElHTgkoMHgyTCkKLSNkZWZpbmUgU0JTX1ZFUlQJKDB4MUwpCi0jZGVmaW5lIFNTX0JJVE1BUAkoMHhlTCkKLSNkZWZpbmUgU1NfQkxBQ0tGUkFNRQkoMHg3TCkKLSNkZWZpbmUgU1NfQkxBQ0tSRUNUCSgweDRMKQotI2RlZmluZSBTU19DRU5URVIJKDB4MUwpCi0jZGVmaW5lIFNTX0NFTlRFUklNQUdFCSgweDIwMEwpCi0jZGVmaW5lIFNTX0VOSE1FVEFGSUxFCSgweGZMKQotI2RlZmluZSBTU19FVENIRURGUkFNRQkoMHgxMkwpCi0jZGVmaW5lIFNTX0VUQ0hFREhPUloJKDB4MTBMKQotI2RlZmluZSBTU19FVENIRURWRVJUCSgweDExTCkKLSNkZWZpbmUgU1NfR1JBWUZSQU1FCSgweDhMKQotI2RlZmluZSBTU19HUkFZUkVDVAkoMHg1TCkKLSNkZWZpbmUgU1NfSUNPTgkoMHgzTCkKLSNkZWZpbmUgU1NfTEVGVAkoMEwpCi0jZGVmaW5lIFNTX0xFRlROT1dPUkRXUkFQCSgweGNMKQotI2RlZmluZSBTU19OT1BSRUZJWAkoMHg4MEwpCi0jZGVmaW5lIFNTX05PVElGWQkoMHgxMDBMKQotI2RlZmluZSBTU19PV05FUkRSQVcJKDB4ZEwpCi0jZGVmaW5lIFNTX1JFQUxTSVpFSU1BR0UJKDB4ODAwTCkKLSNkZWZpbmUgU1NfUklHSFQJKDB4MkwpCi0jZGVmaW5lIFNTX1JJR0hUSlVTVAkoMHg0MDBMKQotI2RlZmluZSBTU19TSU1QTEUJKDB4YkwpCi0jZGVmaW5lIFNTX1NVTktFTgkoMHgxMDAwTCkKLSNkZWZpbmUgU1NfVVNFUklURU0gICAgICgweGFMKQotI2RlZmluZSBTU19XSElURUZSQU1FCSgweDlMKQotI2RlZmluZSBTU19XSElURVJFQ1QJKDB4NkwpCi0jZGVmaW5lIERTXzNETE9PSwkoMHg0TCkKLSNkZWZpbmUgRFNfQUJTQUxJR04JKDB4MUwpCi0jZGVmaW5lIERTX0NFTlRFUgkoMHg4MDBMKQotI2RlZmluZSBEU19DRU5URVJNT1VTRQkoMHgxMDAwTCkKLSNkZWZpbmUgRFNfQ09OVEVYVEhFTFAJKDB4MjAwMEwpCi0jZGVmaW5lIERTX0NPTlRST0wJKDB4NDAwTCkKLSNkZWZpbmUgRFNfRklYRURTWVMJKDB4OEwpCi0jZGVmaW5lIERTX0xPQ0FMRURJVAkoMHgyMEwpCi0jZGVmaW5lIERTX01PREFMRlJBTUUJKDB4ODBMKQotI2RlZmluZSBEU19OT0ZBSUxDUkVBVEUJKDB4MTBMKQotI2RlZmluZSBEU19OT0lETEVNU0cJKDB4MTAwTCkKLSNkZWZpbmUgRFNfU0VURk9OVAkoMHg0MEwpCi0jZGVmaW5lIERTX1NFVEZPUkVHUk9VTkQJKDB4MjAwTCkKLSNkZWZpbmUgRFNfU1lTTU9EQUwJKDB4MkwpCi0KLS8qIEEgZGlhbG9nIGNvbnRyb2wuICAqLwotCi1zdHJ1Y3QgZGlhbG9nX2NvbnRyb2wKLXsKLSAgLyogTmV4dCBjb250cm9sLiAgKi8KLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpuZXh0OwotICAvKiBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGlkOwotICAvKiBTdHlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgc3R5bGU7Ci0gIC8qIEV4dGVuZGVkIHN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBleHN0eWxlOwotICAvKiBYIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB4OwotICAvKiBZIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB5OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0gIC8qIENsYXNzIG5hbWUuICAqLwotICBzdHJ1Y3QgcmVzX2lkIGNsYXNzOwotICAvKiBBc3NvY2lhdGVkIHRleHQuICAqLwotICBzdHJ1Y3QgcmVzX2lkIHRleHQ7Ci0gIC8qIEV4dHJhIGRhdGEgZm9yIHRoZSB3aW5kb3cgcHJvY2VkdXJlLiAgKi8KLSAgc3RydWN0IHJjZGF0YV9pdGVtICpkYXRhOwotICAvKiBIZWxwIElELiAgT25seSB1c2VkIGluIGFuIGV4dGVuZGVkIGRpYWxvZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGVscDsKLX07Ci0KLS8qIENvbnRyb2wgY2xhc3Nlcy4gIFRoZXNlIGNhbiBiZSB1c2VkIGFzIHRoZSBJRCBmaWVsZCBpbiBhIHN0cnVjdAotICAgZGlhbG9nX2NvbnRyb2wuICAqLwotCi0jZGVmaW5lIENUTF9CVVRUT04JMHg4MAotI2RlZmluZSBDVExfRURJVAkweDgxCi0jZGVmaW5lIENUTF9TVEFUSUMJMHg4MgotI2RlZmluZSBDVExfTElTVEJPWAkweDgzCi0jZGVmaW5lIENUTF9TQ1JPTExCQVIJMHg4NAotI2RlZmluZSBDVExfQ09NQk9CT1gJMHg4NQotCi0vKiBBIGZvbnRkaXIgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIGZvbnRkaXIgc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBmb250ZGlyCi17Ci0gIHN0cnVjdCBmb250ZGlyICpuZXh0OwotICAvKiBJbmRleCBvZiBmb250IGVudHJ5LiAgKi8KLSAgc2hvcnQgaW5kZXg7Ci0gIC8qIExlbmd0aCBvZiBmb250IGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIC8qIEZvbnQgaW5mb3JtYXRpb24uICovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci19OwotCi0vKiBBIGdyb3VwX2ljb24gcmVzb3VyY2UgaXMgYSBsaXN0IG9mIGdyb3VwX2ljb24gc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBncm91cF9pY29uCi17Ci0gIC8qIE5leHQgaWNvbiBpbiBncm91cC4gICovCi0gIHN0cnVjdCBncm91cF9pY29uICpuZXh0OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIGNoYXIgd2lkdGg7Ci0gIC8qIEhlaWdodC4gICovCi0gIHVuc2lnbmVkIGNoYXIgaGVpZ2h0OwotICAvKiBDb2xvciBjb3VudC4gICovCi0gIHVuc2lnbmVkIGNoYXIgY29sb3JzOwotICAvKiBQbGFuZXMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBwbGFuZXM7Ci0gIC8qIEJpdHMgcGVyIHBpeGVsLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgYml0czsKLSAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIGN1cnNvciByZXNvdXJjZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgYnl0ZXM7Ci0gIC8qIEluZGV4IG9mIGN1cnNvciByZXNvdXJjZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IGluZGV4OwotfTsKLQotLyogQSBtZW51IHJlc291cmNlLiAgKi8KLQotc3RydWN0IG1lbnUKLXsKLSAgLyogTGlzdCBvZiBtZW51aXRlbXMuICAqLwotICBzdHJ1Y3QgbWVudWl0ZW0gKml0ZW1zOwotICAvKiBIZWxwIElELiAgSSBkb24ndCB0aGluayB0aGVyZSBpcyBhbnkgd2F5IHRvIHNldCB0aGlzIGluIGFuIHJjCi0gICAgIGZpbGUsIGJ1dCBpdCBjYW4gYXBwZWFyIGluIHRoZSBiaW5hcnkgZm9ybWF0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoZWxwOwotfTsKLQotLyogQSBtZW51IHJlc291cmNlIGlzIGEgbGlzdCBvZiBtZW51aXRlbSBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IG1lbnVpdGVtCi17Ci0gIC8qIE5leHQgbWVudWl0ZW0uICAqLwotICBzdHJ1Y3QgbWVudWl0ZW0gKm5leHQ7Ci0gIC8qIFR5cGUuICBJbiBhIG5vcm1hbCBtZW51LCByYXRoZXIgdGhhbiBhIG1lbnVleCwgdGhpcyBpcyB0aGUgZmxhZ3MKLSAgICAgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gIC8qIFN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gYSBtZW51ZXguICAqLwotICB1bnNpZ25lZCBsb25nIHN0YXRlOwotICAvKiBJZC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGlkOwotICAvKiBVbmljb2RlIHRleHQuICAqLwotICB1bmljaGFyICp0ZXh0OwotICAvKiBQb3B1cCBtZW51IGl0ZW1zIGZvciBhIHBvcHVwLiAgKi8KLSAgc3RydWN0IG1lbnVpdGVtICpwb3B1cDsKLSAgLyogSGVscCBJRC4gIFRoaXMgaXMgb25seSB1c2VkIGluIGEgbWVudWV4LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoZWxwOwotfTsKLQotLyogTWVudSBpdGVtIGZsYWdzLiAgVGhlc2UgY2FuIGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QKLSAgIG1lbnVpdGVtLiAgKi8KLQotI2RlZmluZSBNRU5VSVRFTV9HUkFZRUQJCTB4MDAxCi0jZGVmaW5lIE1FTlVJVEVNX0lOQUNUSVZFCTB4MDAyCi0jZGVmaW5lIE1FTlVJVEVNX0JJVE1BUAkJMHgwMDQKLSNkZWZpbmUgTUVOVUlURU1fT1dORVJEUkFXCTB4MTAwCi0jZGVmaW5lIE1FTlVJVEVNX0NIRUNLRUQJMHgwMDgKLSNkZWZpbmUgTUVOVUlURU1fUE9QVVAJCTB4MDEwCi0jZGVmaW5lIE1FTlVJVEVNX01FTlVCQVJCUkVBSwkweDAyMAotI2RlZmluZSBNRU5VSVRFTV9NRU5VQlJFQUsJMHgwNDAKLSNkZWZpbmUgTUVOVUlURU1fRU5ETUVOVQkweDA4MAotI2RlZmluZSBNRU5VSVRFTV9IRUxQCSAgICAgICAweDQwMDAKLQotLyogQW4gcmNkYXRhIHJlc291cmNlIGlzIGEgcG9pbnRlciB0byBhIGxpc3Qgb2YgcmNkYXRhX2l0ZW0KLSAgIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgcmNkYXRhX2l0ZW0KLXsKLSAgLyogTmV4dCBkYXRhIGl0ZW0uICAqLwotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKm5leHQ7Ci0gIC8qIFR5cGUgb2YgZGF0YS4gICovCi0gIGVudW0KLSAgewotICAgIFJDREFUQV9XT1JELAotICAgIFJDREFUQV9EV09SRCwKLSAgICBSQ0RBVEFfU1RSSU5HLAotICAgIFJDREFUQV9XU1RSSU5HLAotICAgIFJDREFUQV9CVUZGRVIKLSAgfSB0eXBlOwotICB1bmlvbgotICB7Ci0gICAgdW5zaWduZWQgaW50IHdvcmQ7Ci0gICAgdW5zaWduZWQgbG9uZyBkd29yZDsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgfSBzdHJpbmc7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgICBjb25zdCB1bmljaGFyICp3OwotICAgIH0gd3N0cmluZzsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgfSBidWZmZXI7Ci0gIH0gdTsKLX07Ci0KLS8qIEEgc3RyaW5ndGFibGUgcmVzb3VyY2UgaXMgYSBwb2ludGVyIHRvIGEgc3RyaW5ndGFibGUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHN0cmluZ3RhYmxlCi17Ci0gIC8qIEVhY2ggc3RyaW5ndGFibGUgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIDE2IHVuaWNvZGUgc3RyaW5ncy4gICovCi0gIHN0cnVjdAotICB7Ci0gICAgLyogTGVuZ3RoIG9mIHN0cmluZy4gICovCi0gICAgaW50IGxlbmd0aDsKLSAgICAvKiBTdHJpbmcgZGF0YSBpZiBsZW5ndGggPiAwLiAgKi8KLSAgICB1bmljaGFyICpzdHJpbmc7Ci0gIH0gc3RyaW5nc1sxNl07Ci19OwotCi0vKiBBIHZlcnNpb25pbmZvIHJlc291cmNlIHBvaW50cyB0byBhIHZlcnNpb25pbmZvIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB2ZXJzaW9uaW5mbwotewotICAvKiBGaXhlZCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaXhlZDsKLSAgLyogVmFyaWFibGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCB2ZXJfaW5mbyAqdmFyOwotfTsKLQotLyogVGhlIGZpeGVkIHBvcnRpb24gb2YgYSB2ZXJzaW9uaW5mbyByZXNvdXJjZS4gICovCi0KLXN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbwotewotICAvKiBUaGUgZmlsZSB2ZXJzaW9uLCB3aGljaCBpcyB0d28gMzIgYml0IGludGVnZXJzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX3ZlcnNpb25fbXM7Ci0gIHVuc2lnbmVkIGxvbmcgZmlsZV92ZXJzaW9uX2xzOwotICAvKiBUaGUgcHJvZHVjdCB2ZXJzaW9uLCB3aGljaCBpcyB0d28gMzIgYml0IGludGVnZXJzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwcm9kdWN0X3ZlcnNpb25fbXM7Ci0gIHVuc2lnbmVkIGxvbmcgcHJvZHVjdF92ZXJzaW9uX2xzOwotICAvKiBUaGUgZmlsZSBmbGFncyBtYXNrLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX2ZsYWdzX21hc2s7Ci0gIC8qIFRoZSBmaWxlIGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX2ZsYWdzOwotICAvKiBUaGUgT1MgdHlwZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9vczsKLSAgLyogVGhlIGZpbGUgdHlwZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV90eXBlOwotICAvKiBUaGUgZmlsZSBzdWJ0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX3N1YnR5cGU7Ci0gIC8qIFRoZSBkYXRlLCB3aGljaCBpbiBXaW5kb3dzIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfZGF0ZV9tczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX2RhdGVfbHM7Ci19OwotCi0vKiBBIGxpc3Qgb2YgdmFyaWFibGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfaW5mbwotewotICAvKiBOZXh0IGl0ZW0uICAqLwotICBzdHJ1Y3QgdmVyX2luZm8gKm5leHQ7Ci0gIC8qIFR5cGUgb2YgZGF0YS4gICovCi0gIGVudW0geyBWRVJJTkZPX1NUUklORywgVkVSSU5GT19WQVIgfSB0eXBlOwotICB1bmlvbgotICB7Ci0gICAgLyogU3RyaW5nRmlsZUluZm8gZGF0YS4gICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogTGFuZ3VhZ2UuICAqLwotICAgICAgdW5pY2hhciAqbGFuZ3VhZ2U7Ci0gICAgICAvKiBTdHJpbmdzLiAgKi8KLSAgICAgIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqc3RyaW5nczsKLSAgICB9IHN0cmluZzsKLSAgICAvKiBWYXJGaWxlSW5mbyBkYXRhLiAgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBLZXkuICAqLwotICAgICAgdW5pY2hhciAqa2V5OwotICAgICAgLyogVmFsdWVzLiAgKi8KLSAgICAgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmFyOwotICAgIH0gdmFyOwotICB9IHU7Ci19OwotCi0vKiBBIGxpc3Qgb2Ygc3RyaW5nIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgdmVyX3N0cmluZ2luZm8KLXsKLSAgLyogTmV4dCBzdHJpbmcuICAqLwotICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKm5leHQ7Ci0gIC8qIEtleS4gICovCi0gIHVuaWNoYXIgKmtleTsKLSAgLyogVmFsdWUuICAqLwotICB1bmljaGFyICp2YWx1ZTsKLX07Ci0KLS8qIEEgbGlzdCBvZiB2YXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl92YXJpbmZvCi17Ci0gIC8qIE5leHQgaXRlbS4gICovCi0gIHN0cnVjdCB2ZXJfdmFyaW5mbyAqbmV4dDsKLSAgLyogTGFuZ3VhZ2UgSUQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBsYW5ndWFnZTsKLSAgLyogQ2hhcmFjdGVyIHNldCBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNoYXJzZXQ7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdoZW4gY29udmVydGluZyByZXNvdXJjZSBpbmZvcm1hdGlvbiB0bwotICAgYmluYXJ5LiAgKi8KLQotc3RydWN0IGJpbmRhdGEKLXsKLSAgLyogTmV4dCBkYXRhLiAgKi8KLSAgc3RydWN0IGJpbmRhdGEgKm5leHQ7Ci0gIC8qIExlbmd0aCBvZiBkYXRhLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIC8qIERhdGEuICAqLwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotfTsKLQotZXh0ZXJuIGludCB2ZXJib3NlOwotCi0vKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuICAqLwotCi1leHRlcm4gc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfcmNfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVhZF9yZXNfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVhZF9jb2ZmX3JzcmMKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHdyaXRlX3JjX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9yZXNfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLWV4dGVybiB2b2lkIHdyaXRlX2NvZmZfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotCi1leHRlcm4gc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3JlcwotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotZXh0ZXJuIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgaW50KSk7Ci0KLWV4dGVybiBGSUxFICpvcGVuX2ZpbGVfc2VhcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiopKTsKLQotZXh0ZXJuIFBUUiByZXNfYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIHJlc3dyX2FsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi0vKiBSZXNvdXJjZSBJRCBoYW5kbGluZy4gICovCi0KLWV4dGVybiBpbnQgcmVzX2lkX2NtcCBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBzdHJ1Y3QgcmVzX2lkKSk7Ci1leHRlcm4gdm9pZCByZXNfaWRfcHJpbnQgUEFSQU1TICgoRklMRSAqLCBzdHJ1Y3QgcmVzX2lkLCBpbnQpKTsKLWV4dGVybiB2b2lkIHJlc19pZHNfcHJpbnQgUEFSQU1TICgoRklMRSAqLCBpbnQsIGNvbnN0IHN0cnVjdCByZXNfaWQgKikpOwotZXh0ZXJuIHZvaWQgcmVzX3N0cmluZ190b19pZCBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBNYW5pcHVsYXRpb24gb2YgdGhlIHJlc291cmNlIHRyZWUuICAqLwotCi1leHRlcm4gc3RydWN0IHJlc19yZXNvdXJjZSAqZGVmaW5lX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqLCBpbnQsIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50KSk7Ci1leHRlcm4gc3RydWN0IHJlc19yZXNvdXJjZSAqZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqLCBpbnQsIHN0cnVjdCByZXNfaWQsIGludCwgaW50KSk7Ci0KLWV4dGVybiBpbnQgZXh0ZW5kZWRfZGlhbG9nIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBkaWFsb2cgKikpOwotZXh0ZXJuIGludCBleHRlbmRlZF9tZW51IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51ICopKTsKLQotLyogQ29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSByYyBmaWxlIHN1cHBvcnQgYW5kIHRoZSBwYXJzZXIgYW5kIGxleGVyLiAgKi8KLQotZXh0ZXJuIGludCB5eWRlYnVnOwotZXh0ZXJuIEZJTEUgKnl5aW47Ci1leHRlcm4gY2hhciAqcmNfZmlsZW5hbWU7Ci1leHRlcm4gaW50IHJjX2xpbmVubzsKLWV4dGVybiBpbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX3dhcm5pbmcgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX3NldF9sYW5ndWFnZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHJjcGFyc2VfZGlzY2FyZF9zdHJpbmdzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJjcGFyc2VfcmNkYXRhIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJjcGFyc2Vfbm9ybWFsIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgZGVmaW5lX2FjY2VsZXJhdG9yCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgc3RydWN0IGFjY2VsZXJhdG9yICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9iaXRtYXAKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9jdXJzb3IKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9kaWFsb2cKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgZGlhbG9nICopKTsKLWV4dGVybiBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmRlZmluZV9jb250cm9sCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCSAgIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiB2b2lkIGRlZmluZV9mb250Ci0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfaWNvbgotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX21lbnUKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBzdHJ1Y3QgbWVudWl0ZW0gKikpOwotZXh0ZXJuIHN0cnVjdCBtZW51aXRlbSAqZGVmaW5lX21lbnVpdGVtCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCSAgIHN0cnVjdCBtZW51aXRlbSAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfbWVzc2FnZXRhYmxlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfcmNkYXRhCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgc3RydWN0IHJjZGF0YV9pdGVtICopKTsKLWV4dGVybiBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRlZmluZV9yY2RhdGFfc3RyaW5nCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIHN0cnVjdCByY2RhdGFfaXRlbSAqZGVmaW5lX3JjZGF0YV9udW1iZXIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfc3RyaW5ndGFibGUKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV91c2VyX2RhdGEKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLAotCSAgIHN0cnVjdCByY2RhdGFfaXRlbSAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfdXNlcl9maWxlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwKLQkgICBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV92ZXJzaW9uaW5mbwotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBpbnQsIHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqLAotCSAgIHN0cnVjdCB2ZXJfaW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IHZlcl9pbmZvICphcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvCi0gIFBBUkFNUyAoKHN0cnVjdCB2ZXJfaW5mbyAqLCBjb25zdCBjaGFyICosIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IHZlcl9pbmZvICphcHBlbmRfdmVyX3ZhcmZpbGVpbmZvCi0gIFBBUkFNUyAoKHN0cnVjdCB2ZXJfaW5mbyAqLCBjb25zdCBjaGFyICosIHN0cnVjdCB2ZXJfdmFyaW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IHZlcl9zdHJpbmdpbmZvICphcHBlbmRfdmVydmFsCi0gIFBBUkFNUyAoKHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHN0cnVjdCB2ZXJfdmFyaW5mbyAqYXBwZW5kX3ZlcnRyYW5zCi0gIFBBUkFNUyAoKHN0cnVjdCB2ZXJfdmFyaW5mbyAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy93aW5kdW5pLmMgYi9iaW51dGlscy93aW5kdW5pLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OWY0N2EuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd2luZHVuaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qIHdpbmR1bmkuYyAtLSB1bmljb2RlIHN1cHBvcnQgZm9yIHRoZSB3aW5kcmVzIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyB1bmljb2RlIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSB3aW5kcmVzCi0gICBwcm9ncmFtLiAgSWRlYWxseSwgd2Ugd291bGQgaGF2ZSBnZW5lcmljIHVuaWNvZGUgc3VwcG9ydCB3aGljaAotICAgd291bGQgd29yayBvbiBhbGwgc3lzdGVtcy4gIEhvd2V2ZXIsIHdlIGRvbid0LiAgSW5zdGVhZCwgb24gYQotICAgV2luZG93cyBob3N0LCB3ZSBhcmUgcHJlcGFyZWQgdG8gY2FsbCBzb21lIFdpbmRvd3Mgcm91dGluZXMuICBUaGlzCi0gICBtZWFucyB0aGF0IHdlIHdpbGwgZ2VuZXJhdGUgZGlmZmVyZW50IG91dHB1dCBvbiBXaW5kb3dzIGFuZCBVbml4Ci0gICBob3N0cywgYnV0IHRoYXQgc2VlbXMgYmV0dGVyIHRoYW4gbm90IHJlYWxseSBzdXBwb3J0aW5nIHVuaWNvZGUgYXQKLSAgIGFsbC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJ3aW5kdW5pLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBzdHJpbmcuICBXZSBqdXN0IGNvcHkgaXQsCi0gICBleHBhbmRpbmcgY2hhcnMgdG8gc2hvcnRzLCByYXRoZXIgdGhhbiBkb2luZyBzb21ldGhpbmcgaW50ZWxsaWdlbnQuICAqLwotCi12b2lkCi11bmljb2RlX2Zyb21fYXNjaWkgKGxlbmd0aCwgdW5pY29kZSwgYXNjaWkpCi0gICAgIGludCAqbGVuZ3RoOwotICAgICB1bmljaGFyICoqdW5pY29kZTsKLSAgICAgY29uc3QgY2hhciAqYXNjaWk7Ci17Ci0gIGludCBsZW47Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHVuc2lnbmVkIHNob3J0ICp3OwotCi0gIGxlbiA9IHN0cmxlbiAoYXNjaWkpOwotCi0gIGlmIChsZW5ndGggIT0gTlVMTCkKLSAgICAqbGVuZ3RoID0gbGVuOwotCi0gICp1bmljb2RlID0gKCh1bmljaGFyICopIHJlc19hbGxvYyAoKGxlbiArIDEpICogc2l6ZW9mICh1bmljaGFyKSkpOwotCi0jaWZkZWYgX1dJTjMyCi0gIC8qIEZJWE1FOiBPbiBXaW5kb3dzLCB3ZSBzaG91bGQgYmUgdXNpbmcgTXVsdGlCeXRlVG9XaWRlQ2hhciB0byBzZXQKLSAgICAgdGhlIGxlbmd0aC4gICovCi0gIE11bHRpQnl0ZVRvV2lkZUNoYXIgKENQX0FDUCwgMCwgYXNjaWksIGxlbiArIDEsICp1bmljb2RlLCBsZW4gKyAxKTsKLSNlbHNlCi0gIGZvciAocyA9IGFzY2lpLCB3ID0gKnVuaWNvZGU7ICpzICE9ICdcMCc7IHMrKywgdysrKQotICAgICp3ID0gKnMgJiAweGZmOwotICAqdyA9IDA7Ci0jZW5kaWYKLX0KLQotLyogUHJpbnQgdGhlIHVuaWNvZGUgc3RyaW5nIFVOSUNPREUgdG8gdGhlIGZpbGUgRS4gIExFTkdUSCBpcyB0aGUKLSAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByaW50LCBvciAtMSBpZiB3ZSBzaG91bGQgcHJpbnQgdW50aWwgdGhlCi0gICBlbmQgb2YgdGhlIHN0cmluZy4gIEZJWE1FOiBPbiBhIFdpbmRvd3MgaG9zdCwgd2Ugc2hvdWxkIGJlIGNhbGxpbmcKLSAgIHNvbWUgV2luZG93cyBmdW5jdGlvbiwgcHJvYmFibHkgV2lkZUNoYXJUb011bHRpQnl0ZS4gICovCi0KLXZvaWQKLXVuaWNvZGVfcHJpbnQgKGUsIHVuaWNvZGUsIGxlbmd0aCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3QgdW5pY2hhciAqdW5pY29kZTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgdW5pY2hhciBjaDsKLQotICAgICAgaWYgKGxlbmd0aCA9PSAwKQotCXJldHVybjsKLSAgICAgIGlmIChsZW5ndGggPiAwKQotCS0tbGVuZ3RoOwotCi0gICAgICBjaCA9ICp1bmljb2RlOwotCi0gICAgICBpZiAoY2ggPT0gMCAmJiBsZW5ndGggPCAwKQotCXJldHVybjsKLQotICAgICAgKyt1bmljb2RlOwotCi0gICAgICBpZiAoKGNoICYgMHg3ZikgPT0gY2gpCi0JewotCSAgaWYgKGNoID09ICdcXCcpCi0JICAgIGZwdXRzICgiXFwiLCBlKTsKLQkgIGVsc2UgaWYgKGlzcHJpbnQgKGNoKSkKLQkgICAgcHV0YyAoY2gsIGUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjaCkKLQkJewotCQljYXNlIEVTQ0FQRV9BOgotCQkgIGZwdXRzICgiXFxhIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfQjoKLQkJICBmcHV0cyAoIlxcYiIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX0Y6Ci0JCSAgZnB1dHMgKCJcXGYiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9OOgotCQkgIGZwdXRzICgiXFxuIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfUjoKLQkJICBmcHV0cyAoIlxcciIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX1Q6Ci0JCSAgZnB1dHMgKCJcXHQiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9WOgotCQkgIGZwdXRzICgiXFx2IiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgoY2ggJiAweGZmKSA9PSBjaCkKLQlmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOwotICAgICAgZWxzZQotCWZwcmludGYgKGUsICJcXHgleCIsICh1bnNpZ25lZCBpbnQpIGNoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy93aW5kdW5pLmggYi9iaW51dGlscy93aW5kdW5pLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTlhZjIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd2luZHVuaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogd2luZHVuaS5oIC0tIGhlYWRlciBmaWxlIGZvciB1bmljb2RlIHN1cHBvcnQgZm9yIHdpbmRyZXMgcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgdGhlIHR5cGVzIGFuZCBmdW5jdGlvbnMgd2UgdXNlIGZvcgotICAgdW5pY29kZSBzdXBwb3J0IGluIHdpbmRyZXMuICBPdXIgdW5pY29kZSBzdXBwb3J0IGlzIHZlcnkgbGltaXRlZCBhdAotICAgcHJlc2VudC4KLQotICAgV2UgZG9uJ3QgcHV0IHRoaXMgc3R1ZmYgaW4gd2luZHJlcy5oIHNvIHRoYXQgd2luZHVuaS5jIGRvZXNuJ3QgaGF2ZQotICAgdG8gaW5jbHVkZSB3aW5kcmVzLmguICB3aW5kdW5pLmMgbmVlZHMgdG8gaW5jbHVkZXMgd2luZG93cy5oLCBhbmQKLSAgIHRoYXQgd291bGQgY29uZmxpY3Qgd2l0aCB0aGUgZGVmaW5pdGlvbnMgb2YgV2luZG93cyBtYWNyb3Mgd2UKLSAgIGFscmVhZHkgaGF2ZSBpbiB3aW5kcmVzLmguICAqLwotCi0vKiBXZSB1c2UgdGhpcyB0eXBlIHRvIGhvbGQgYSB1bmljb2RlIGNoYXJhY3Rlci4gICovCi0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdW5pY2hhcjsKLQotLyogRXNjYXBlIGNoYXJhY3RlciB0cmFuc2xhdGlvbnMuICAqLwotCi0jZGVmaW5lIEVTQ0FQRV9BICgwMDcpCi0jZGVmaW5lIEVTQ0FQRV9CICgwMTApCi0jZGVmaW5lIEVTQ0FQRV9GICgwMTQpCi0jZGVmaW5lIEVTQ0FQRV9OICgwMTIpCi0jZGVmaW5lIEVTQ0FQRV9SICgwMTUpCi0jZGVmaW5lIEVTQ0FQRV9UICgwMTEpCi0jZGVmaW5lIEVTQ0FQRV9WICgwMTMpCi0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBzdHJpbmcuICAqLwotCi1leHRlcm4gdm9pZCB1bmljb2RlX2Zyb21fYXNjaWkKLSAgUEFSQU1TICgoaW50ICosIHVuaWNoYXIgKiosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBQcmludCBhIHVuaWNvZGUgc3RyaW5nIHRvIGEgZmlsZS4gICovCi0KLWV4dGVybiB2b2lkIHVuaWNvZGVfcHJpbnQgUEFSQU1TICgoRklMRSAqLCBjb25zdCB1bmljaGFyICosIGludCkpOwotCi0vKiBXaW5kcmVzIHN1cHBvcnQgcm91dGluZSBjYWxsZWQgYnkgdW5pY29kZV9mcm9tX2FzY2lpLiAgVGhpcyBpcyBib3RoCi0gICBoZXJlIGFuZCBpbiB3aW5kcmVzLmguICBJdCBzaG91bGQgcHJvYmFibHkgYmUgaW4gYSBzZXBhcmF0ZSBoZWFkZXIKLSAgIGZpbGUsIGJ1dCBpdCBoYXJkbHkgc2VlbXMgd29ydGggaXQgZm9yIG9uZSBmdW5jdGlvbi4gICovCi0KLWV4dGVybiBQVFIgcmVzX2FsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd3JzdGFicy5jIGIvYmludXRpbHMvd3JzdGFicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI4MTc0Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dyc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MTYgKzAsMCBAQAotLyogd3JzdGFicy5jIC0tIE91dHB1dCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCB3cml0ZXMgb3V0IHN0YWJzIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24uICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0vKiBNZWFuaW5nbGVzcyBkZWZpbml0aW9uIG5lZWRzIGJ5IGFvdXQ2NC5oLiAgRklYTUUuICAqLwotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0vKiBUaGUgc2l6ZSBvZiBhIHN0YWJzIHN5bWJvbC4gIFRoaXMgcHJlc3VtZXMgMzIgYml0IHZhbHVlcy4gICovCi0KLSNkZWZpbmUgU1RBQl9TWU1CT0xfU0laRSAoMTIpCi0KLS8qIEFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIE5leHQgc3RyaW5nIGluIHRoaXMgdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIEluZGV4IGluIHN0cmluZyB0YWJsZS4gICovCi0gIGxvbmcgaW5kZXg7Ci0gIC8qIFNpemUgb2YgdHlwZSBpZiB0aGlzIGlzIGEgdHlwZWRlZi4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotfTsKLQotLyogQSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci19OwotCi0vKiBUaGUgdHlwZSBzdGFjay4gIEVhY2ggZWxlbWVudCBvbiB0aGUgc3RhY2sgaXMgYSBzdHJpbmcuICAqLwotCi1zdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrCi17Ci0gIC8qIFRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqbmV4dDsKLSAgLyogVGhpcyBlbGVtZW50IGFzIGEgc3RyaW5nLiAgKi8KLSAgY2hhciAqc3RyaW5nOwotICAvKiBUaGUgdHlwZSBpbmRleCBvZiB0aGlzIGVsZW1lbnQuICAqLwotICBsb25nIGluZGV4OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBXaGV0aGVyIHR5cGUgc3RyaW5nIGRlZmluZXMgYSBuZXcgdHlwZS4gICovCi0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgLyogU3RyaW5nIGRlZmluaW5nIHN0cnVjdCBmaWVsZHMuICAqLwotICBjaGFyICpmaWVsZHM7Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzIGRlZmluaW5nIGJhc2UgY2xhc3NlcyBmb3IgYQotICAgICBjbGFzcy4gICovCi0gIGNoYXIgKipiYXNlY2xhc3NlczsKLSAgLyogU3RyaW5nIGRlZmluaW5nIGNsYXNzIG1ldGhvZHMuICAqLwotICBjaGFyICptZXRob2RzOwotICAvKiBTdHJpbmcgZGVmaW5pbmcgdnRhYmxlIHBvaW50ZXIgZm9yIGEgY2xhc3MuICAqLwotICBjaGFyICp2dGFibGU7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdHlwZSBpbmRpY2VzIGZvciB0YWdnZWQKLSAgIHR5cGVzLiAgKi8KLQotc3RydWN0IHN0YWJfdGFnCi17Ci0gIC8qIFRoZSB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyBpbmRleDsKLSAgLyogVGhlIHRhZyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotICAvKiBUaGUga2luZCBvZiB0eXBlLiAgVGhpcyBpcyBzZXQgdG8gREVCVUdfS0lORF9JTExFR0FMIHdoZW4gdGhlCi0gICAgIHR5cGUgaXMgZGVmaW5lZC4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLX07Ci0KLS8qIFdlIHJlbWVtYmVyIHZhcmlvdXMgc29ydHMgb2YgdHlwZSBpbmRpY2VzLiAgVGhleSBhcmUgbm90IHJlbGF0ZWQsCi0gICBidXQsIGZvciBjb252ZW5pZW5jZSwgd2Uga2VlcCBhbGwgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBzdGFiX3R5cGVfY2FjaGUKLXsKLSAgLyogVGhlIHZvaWQgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgdm9pZF90eXBlOwotICAvKiBTaWduZWQgaW50ZWdlciB0eXBlIGluZGljZXMsIGluZGV4ZWQgYnkgc2l6ZSAtIDEuICAqLwotICBsb25nIHNpZ25lZF9pbnRlZ2VyX3R5cGVzWzhdOwotICAvKiBVbnNpZ25lZCBpbnRlZ2VyIHR5cGUgaW5kaWNlcywgaW5kZXhlZCBieSBzaXplIC0gMS4gICovCi0gIGxvbmcgdW5zaWduZWRfaW50ZWdlcl90eXBlc1s4XTsKLSAgLyogRmxvYXRpbmcgcG9pbnQgdHlwZXMsIGluZGV4ZWQgYnkgc2l6ZSAtIDEuICAqLwotICBsb25nIGZsb2F0X3R5cGVzWzE2XTsKLSAgLyogUG9pbnRlcnMgdG8gdHlwZXMsIGluZGV4ZWQgYnkgdGhlIHR5cGUgaW5kZXguICAqLwotICBsb25nICpwb2ludGVyX3R5cGVzOwotICBzaXplX3QgcG9pbnRlcl90eXBlc19hbGxvYzsKLSAgLyogRnVuY3Rpb25zIHJldHVybmluZyB0eXBlcywgaW5kZXhlZCBieSB0aGUgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgKmZ1bmN0aW9uX3R5cGVzOwotICBzaXplX3QgZnVuY3Rpb25fdHlwZXNfYWxsb2M7Ci0gIC8qIFJlZmVyZW5jZXMgdG8gdHlwZXMsIGluZGV4ZWQgYnkgdGhlIHR5cGUgaW5kZXguICAqLwotICBsb25nICpyZWZlcmVuY2VfdHlwZXM7Ci0gIHNpemVfdCByZWZlcmVuY2VfdHlwZXNfYWxsb2M7Ci0gIC8qIFN0cnVjdC91bmlvbi9jbGFzcyB0eXBlIGluZGljZXMsIGluZGV4ZWQgYnkgdGhlIHN0cnVjdCBpZC4gICovCi0gIHN0cnVjdCBzdGFiX3RhZyAqc3RydWN0X3R5cGVzOwotICBzaXplX3Qgc3RydWN0X3R5cGVzX2FsbG9jOwotfTsKLQotLyogVGhpcyBpcyB0aGUgaGFuZGxlIHBhc3NlZCB0aHJvdWdoIGRlYnVnX3dyaXRlLiAgKi8KLQotc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlCi17Ci0gIC8qIFRoZSBCRkQuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIFRoaXMgYnVmZmVyIGhvbGRzIHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2J5dGUgKnN5bWJvbHM7Ci0gIHNpemVfdCBzeW1ib2xzX3NpemU7Ci0gIHNpemVfdCBzeW1ib2xzX2FsbG9jOwotICAvKiBUaGlzIGlzIGEgbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMgZm9yIHRoZSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzdHJpbmdzOwotICAvKiBUaGUgbGFzdCBzdHJpbmcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqbGFzdF9zdHJpbmc7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBzdHJpbmdzLiAgKi8KLSAgc2l6ZV90IHN0cmluZ3Nfc2l6ZTsKLSAgLyogVGhpcyBoYXNoIHRhYmxlIGVsaW1pbmF0ZXMgZHVwbGljYXRlIHN0cmluZ3MuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgc3RyaGFzaDsKLSAgLyogVGhlIHR5cGUgc3RhY2suICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICp0eXBlX3N0YWNrOwotICAvKiBUaGUgbmV4dCB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyB0eXBlX2luZGV4OwotICAvKiBUaGUgdHlwZSBjYWNoZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVfY2FjaGUgdHlwZV9jYWNoZTsKLSAgLyogQSBtYXBwaW5nIGZyb20gdHlwZWRlZiBuYW1lcyB0byB0eXBlIGluZGljZXMuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgdHlwZWRlZl9oYXNoOwotICAvKiBJZiB0aGlzIGlzIG5vdCAtMSwgaXQgaXMgdGhlIG9mZnNldCB0byB0aGUgbW9zdCByZWNlbnQgTl9TTwotICAgICBzeW1ib2wsIGFuZCB0aGUgdmFsdWUgb2YgdGhhdCBzeW1ib2wgbmVlZHMgdG8gYmUgc2V0LiAgKi8KLSAgbG9uZyBzb19vZmZzZXQ7Ci0gIC8qIElmIHRoaXMgaXMgbm90IC0xLCBpdCBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBtb3N0IHJlY2VudCBOX0ZVTgotICAgICBzeW1ib2wsIGFuZCB0aGUgdmFsdWUgb2YgdGhhdCBzeW1ib2wgbmVlZHMgdG8gYmUgc2V0LiAgKi8KLSAgbG9uZyBmdW5fb2Zmc2V0OwotICAvKiBUaGUgbGFzdCB0ZXh0IHNlY3Rpb24gYWRkcmVzcyBzZWVuLiAgKi8KLSAgYmZkX3ZtYSBsYXN0X3RleHRfYWRkcmVzczsKLSAgLyogVGhlIGJsb2NrIG5lc3RpbmcgZGVwdGguICAqLwotICB1bnNpZ25lZCBpbnQgbmVzdGluZzsKLSAgLyogVGhlIGZ1bmN0aW9uIGFkZHJlc3MuICAqLwotICBiZmRfdm1hIGZuYWRkcjsKLSAgLyogQSBwZW5kaW5nIExCUkFDIHN5bWJvbC4gICovCi0gIGJmZF92bWEgcGVuZGluZ19sYnJhYzsKLSAgLyogVGhlIGN1cnJlbnQgbGluZSBudW1iZXIgZmlsZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbGluZW5vX2ZpbGVuYW1lOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RyaW5nX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl93cml0ZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcHVzaF9zdHJpbmcKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgbG9uZywgYm9vbGVhbiwKLQkgICB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKnN0YWJfcG9wX3R5cGUgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfbW9kaWZ5X3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGludCwgdW5zaWduZWQgaW50LCBsb25nICoqLCBzaXplX3QgKikpOwotc3RhdGljIGxvbmcgc3RhYl9nZXRfc3RydWN0X2luZGV4Ci0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkgICBlbnVtIGRlYnVnX3R5cGVfa2luZCwgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3NfbWV0aG9kX3ZhcgotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbiwgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3ZvaWRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jb21wbGV4X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9wb2ludGVyX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3JhbmdlX3R5cGUgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfb2Zmc2V0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3ZvbGF0aWxlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbmRfc3RydWN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X2NsYXNzX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3NfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3R5cGVkZWZfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl90YWdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdGFnIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3R5cGVkX2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2Z1bmN0aW9uX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW5kX2Z1bmN0aW9uIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9saW5lbm8KLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgc3RhYl9mbnMgPQotewotICBzdGFiX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQsCi0gIHN0YWJfc3RhcnRfc291cmNlLAotICBzdGFiX2VtcHR5X3R5cGUsCi0gIHN0YWJfdm9pZF90eXBlLAotICBzdGFiX2ludF90eXBlLAotICBzdGFiX2Zsb2F0X3R5cGUsCi0gIHN0YWJfY29tcGxleF90eXBlLAotICBzdGFiX2Jvb2xfdHlwZSwKLSAgc3RhYl9lbnVtX3R5cGUsCi0gIHN0YWJfcG9pbnRlcl90eXBlLAotICBzdGFiX2Z1bmN0aW9uX3R5cGUsCi0gIHN0YWJfcmVmZXJlbmNlX3R5cGUsCi0gIHN0YWJfcmFuZ2VfdHlwZSwKLSAgc3RhYl9hcnJheV90eXBlLAotICBzdGFiX3NldF90eXBlLAotICBzdGFiX29mZnNldF90eXBlLAotICBzdGFiX21ldGhvZF90eXBlLAotICBzdGFiX2NvbnN0X3R5cGUsCi0gIHN0YWJfdm9sYXRpbGVfdHlwZSwKLSAgc3RhYl9zdGFydF9zdHJ1Y3RfdHlwZSwKLSAgc3RhYl9zdHJ1Y3RfZmllbGQsCi0gIHN0YWJfZW5kX3N0cnVjdF90eXBlLAotICBzdGFiX3N0YXJ0X2NsYXNzX3R5cGUsCi0gIHN0YWJfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgc3RhYl9jbGFzc19iYXNlY2xhc3MsCi0gIHN0YWJfY2xhc3Nfc3RhcnRfbWV0aG9kLAotICBzdGFiX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBzdGFiX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwKLSAgc3RhYl9jbGFzc19lbmRfbWV0aG9kLAotICBzdGFiX2VuZF9jbGFzc190eXBlLAotICBzdGFiX3R5cGVkZWZfdHlwZSwKLSAgc3RhYl90YWdfdHlwZSwKLSAgc3RhYl90eXBkZWYsCi0gIHN0YWJfdGFnLAotICBzdGFiX2ludF9jb25zdGFudCwKLSAgc3RhYl9mbG9hdF9jb25zdGFudCwKLSAgc3RhYl90eXBlZF9jb25zdGFudCwKLSAgc3RhYl92YXJpYWJsZSwKLSAgc3RhYl9zdGFydF9mdW5jdGlvbiwKLSAgc3RhYl9mdW5jdGlvbl9wYXJhbWV0ZXIsCi0gIHN0YWJfc3RhcnRfYmxvY2ssCi0gIHN0YWJfZW5kX2Jsb2NrLAotICBzdGFiX2VuZF9mdW5jdGlvbiwKLSAgc3RhYl9saW5lbm8KLX07Ci0MCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdHJpbmdfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgICByZXQtPmluZGV4ID0gLTE7Ci0gICAgICByZXQtPnNpemUgPSAwOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3RyaW5nX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2UgYXJlIGJ1aWxkaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCB0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgZGVzYzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBiZmRfc2l6ZV90eXBlIHN0cng7Ci0gIGJmZF9ieXRlIHN5bVtTVEFCX1NZTUJPTF9TSVpFXTsKLQotICBpZiAoc3RyaW5nID09IE5VTEwpCi0gICAgc3RyeCA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZpbmZvLT5zdHJoYXNoLCBzdHJpbmcsIHRydWUsIHRydWUpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oInN0cmluZ19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChoLT5pbmRleCAhPSAtMSkKLQlzdHJ4ID0gaC0+aW5kZXg7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyeCA9IGluZm8tPnN0cmluZ3Nfc2l6ZTsKLQkgIGgtPmluZGV4ID0gc3RyeDsKLQkgIGlmIChpbmZvLT5sYXN0X3N0cmluZyA9PSBOVUxMKQotCSAgICBpbmZvLT5zdHJpbmdzID0gaDsKLQkgIGVsc2UKLQkgICAgaW5mby0+bGFzdF9zdHJpbmctPm5leHQgPSBoOwotCSAgaW5mby0+bGFzdF9zdHJpbmcgPSBoOwotCSAgaW5mby0+c3RyaW5nc19zaXplICs9IHN0cmxlbiAoc3RyaW5nKSArIDE7Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIHByZXN1bWVzIDMyIGJpdCB2YWx1ZXMuICAqLwotICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBzdHJ4LCBzeW0pOwotICBiZmRfcHV0XzggKGluZm8tPmFiZmQsIHR5cGUsIHN5bSArIDQpOwotICBiZmRfcHV0XzggKGluZm8tPmFiZmQsIDAsIHN5bSArIDUpOwotICBiZmRfcHV0XzE2IChpbmZvLT5hYmZkLCBkZXNjLCBzeW0gKyA2KTsKLSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgdmFsdWUsIHN5bSArIDgpOwotCi0gIGlmIChpbmZvLT5zeW1ib2xzX3NpemUgKyBTVEFCX1NZTUJPTF9TSVpFID4gaW5mby0+c3ltYm9sc19hbGxvYykKLSAgICB7Ci0gICAgICBpbmZvLT5zeW1ib2xzX2FsbG9jICo9IDI7Ci0gICAgICBpbmZvLT5zeW1ib2xzID0gKGJmZF9ieXRlICopIHhyZWFsbG9jIChpbmZvLT5zeW1ib2xzLAotCQkJCQkgICAgIGluZm8tPnN5bWJvbHNfYWxsb2MpOwotICAgIH0KLQotICBtZW1jcHkgKGluZm8tPnN5bWJvbHMgKyBpbmZvLT5zeW1ib2xzX3NpemUsIHN5bSwgU1RBQl9TWU1CT0xfU0laRSk7Ci0KLSAgaW5mby0+c3ltYm9sc19zaXplICs9IFNUQUJfU1lNQk9MX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSBzdHJpbmcgb24gdG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgc3RyaW5nLCBpbmRleCwgZGVmaW5pdGlvbiwgc2l6ZSkKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGxvbmcgaW5kZXg7Ci0gICAgIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKnM7Ci0KLSAgcyA9IChzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICopIHhtYWxsb2MgKHNpemVvZiAqcyk7Ci0gIHMtPnN0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7Ci0gIHMtPmluZGV4ID0gaW5kZXg7Ci0gIHMtPmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICBzLT5zaXplID0gc2l6ZTsKLQotICBzLT5maWVsZHMgPSBOVUxMOwotICBzLT5iYXNlY2xhc3NlcyA9IE5VTEw7Ci0gIHMtPm1ldGhvZHMgPSBOVUxMOwotICBzLT52dGFibGUgPSBOVUxMOwotCi0gIHMtPm5leHQgPSBpbmZvLT50eXBlX3N0YWNrOwotICBpbmZvLT50eXBlX3N0YWNrID0gczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHR5cGUgaW5kZXggd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCBzaXplKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGxvbmcgaW5kZXg7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBjaGFyIGJ1ZlsyMF07Ci0KLSAgc3ByaW50ZiAoYnVmLCAiJWxkIiwgaW5kZXgpOwotICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZmFsc2UsIHNpemUpOwotfQotCi0vKiBQb3AgYSB0eXBlIG9mZiB0aGUgdHlwZSBzdGFjay4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gICBmcmVlaW5nIHRoZSBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zdGFiX3BvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci17Ci0gIHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKnM7Ci0gIGNoYXIgKnJldDsKLQotICBzID0gaW5mby0+dHlwZV9zdGFjazsKLSAgYXNzZXJ0IChzICE9IE5VTEwpOwotCi0gIGluZm8tPnR5cGVfc3RhY2sgPSBzLT5uZXh0OwotCi0gIHJldCA9IHMtPnN0cmluZzsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogVGhlIGdlbmVyYWwgcm91dGluZSB0byB3cml0ZSBvdXQgc3RhYnMgaW4gc2VjdGlvbnMgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gIFRoaXMgYWNjdW11bGF0ZXMgdGhlIHN0YWJzIHN5bWJvbHMgYW5kIHRoZSBzdHJpbmdzIGluCi0gICB0d28gb2JzdGFja3MuICBXZSBjYW4ndCBlYXNpbHkgd3JpdGUgb3V0IHRoZSBpbmZvcm1hdGlvbiBhcyB3ZSBnbwotICAgYWxvbmcsIGJlY2F1c2Ugd2UgbmVlZCB0byBrbm93IHRoZSBzZWN0aW9uIHNpemVzIGJlZm9yZSB3ZSBjYW4KLSAgIHdyaXRlIG91dCB0aGUgc2VjdGlvbiBjb250ZW50cy4gIEFCRkQgaXMgdGhlIEJGRCBhbmQgREhBTkRMRSBpcyB0aGUKLSAgIGhhbmRsZSBmb3IgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgc2V0cyAqUFNZTVMgdG8gcG9pbnQgdG8KLSAgIHRoZSBzeW1ib2xzLCAqUFNZTVNJWkUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbHMsICpQU1RSSU5HUyB0byB0aGUKLSAgIHN0cmluZ3MsIGFuZCAqUFNUUklOR1NJWkUgdG8gdGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLwotCi1ib29sZWFuCi13cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgZGhhbmRsZSwgcHN5bXMsIHBzeW1zaXplLAotCQkJCQlwc3RyaW5ncywgcHN0cmluZ3NpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICoqcHN5bXM7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnBzeW1zaXplOwotICAgICBiZmRfYnl0ZSAqKnBzdHJpbmdzOwotICAgICBiZmRfc2l6ZV90eXBlICpwc3RyaW5nc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlIGluZm87Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqaDsKLSAgYmZkX2J5dGUgKnA7Ci0KLSAgaW5mby5hYmZkID0gYWJmZDsKLQotICBpbmZvLnN5bWJvbHNfc2l6ZSA9IDA7Ci0gIGluZm8uc3ltYm9sc19hbGxvYyA9IDUwMDsKLSAgaW5mby5zeW1ib2xzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKGluZm8uc3ltYm9sc19hbGxvYyk7Ci0KLSAgaW5mby5zdHJpbmdzID0gTlVMTDsKLSAgaW5mby5sYXN0X3N0cmluZyA9IE5VTEw7Ci0gIC8qIFJlc2VydmUgMSBieXRlIGZvciBhIG51bGwgYnl0ZS4gICovCi0gIGluZm8uc3RyaW5nc19zaXplID0gMTsKLQotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmaW5mby5zdHJoYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKQotICAgICAgfHwgISBiZmRfaGFzaF90YWJsZV9pbml0ICgmaW5mby50eXBlZGVmX2hhc2gudGFibGUsIHN0cmluZ19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgImJmZF9oYXNoX3RhYmxlX2luaXRfZmFpbGVkOiAlc1xuIiwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLnR5cGVfc3RhY2sgPSBOVUxMOwotICBpbmZvLnR5cGVfaW5kZXggPSAxOwotICBtZW1zZXQgKCZpbmZvLnR5cGVfY2FjaGUsIDAsIHNpemVvZiBpbmZvLnR5cGVfY2FjaGUpOwotICBpbmZvLnNvX29mZnNldCA9IC0xOwotICBpbmZvLmZ1bl9vZmZzZXQgPSAtMTsKLSAgaW5mby5sYXN0X3RleHRfYWRkcmVzcyA9IDA7Ci0gIGluZm8ubmVzdGluZyA9IDA7Ci0gIGluZm8uZm5hZGRyID0gMDsKLSAgaW5mby5wZW5kaW5nX2xicmFjID0gKGJmZF92bWEpIC0xOwotCi0gIC8qIFRoZSBpbml0aWFsIHN5bWJvbCBob2xkcyB0aGUgc3RyaW5nIHNpemUuICAqLwotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoJmluZm8sIDAsIDAsIDAsIChjb25zdCBjaGFyICopIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPdXRwdXQgYW4gaW5pdGlhbCBOX1NPIHN5bWJvbC4gICovCi0gIGluZm8uc29fb2Zmc2V0ID0gaW5mby5zeW1ib2xzX3NpemU7Ci0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sICgmaW5mbywgTl9TTywgMCwgMCwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkZWJ1Z193cml0ZSAoZGhhbmRsZSwgJnN0YWJfZm5zLCAoUFRSKSAmaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFzc2VydCAoaW5mby5wZW5kaW5nX2xicmFjID09IChiZmRfdm1hKSAtMSk7Ci0KLSAgLyogT3V0cHV0IGEgdHJhaWxpbmcgTl9TTy4gICovCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sICgmaW5mbywgTl9TTywgMCwgaW5mby5sYXN0X3RleHRfYWRkcmVzcywKLQkJCSAgIChjb25zdCBjaGFyICopIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQdXQgdGhlIHN0cmluZyBzaXplIGluIHRoZSBpbml0aWFsIHN5bWJvbC4gICovCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGluZm8uc3RyaW5nc19zaXplLCBpbmZvLnN5bWJvbHMgKyA4KTsKLQotICAqcHN5bXMgPSBpbmZvLnN5bWJvbHM7Ci0gICpwc3ltc2l6ZSA9IGluZm8uc3ltYm9sc19zaXplOwotCi0gICpwc3RyaW5nc2l6ZSA9IGluZm8uc3RyaW5nc19zaXplOwotICAqcHN0cmluZ3MgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoaW5mby5zdHJpbmdzX3NpemUpOwotCi0gIHAgPSAqcHN0cmluZ3M7Ci0gICpwKysgPSAnXDAnOwotICBmb3IgKGggPSBpbmZvLnN0cmluZ3M7IGggIT0gTlVMTDsgaCA9IGgtPm5leHQpCi0gICAgewotICAgICAgc3RyY3B5ICgoY2hhciAqKSBwLCBoLT5yb290LnN0cmluZyk7Ci0gICAgICBwICs9IHN0cmxlbiAoKGNoYXIgKikgcCkgKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgd3JpdGluZyBvdXQgaW5mb3JtYXRpb24gZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBXZSB3b3VsZCBub3JtYWxseSBvdXRwdXQgYW4gTl9TTyBzeW1ib2wgaGVyZS4gIEhvd2V2ZXIsIHRoYXQKLSAgICAgd291bGQgZm9yY2UgdXMgdG8gcmVzZXQgYWxsIG9mIG91ciB0eXBlIGluZm9ybWF0aW9uLiAgSSB0aGluayB3ZQotICAgICB3aWxsIGJlIGJldHRlciBvZmYganVzdCBvdXRwdXR0aW5nIGFuIE5fU09MIHN5bWJvbCwgYW5kIG5vdAotICAgICB3b3JyeWluZyBhYm91dCBzcGxpdHRpbmcgaW5mb3JtYXRpb24gYmV0d2VlbiBmaWxlcy4gICovCi0KLSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0KLSAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NPTCwgMCwgMCwgZmlsZW5hbWUpOwotfQotCi0vKiBTdGFydCB3cml0aW5nIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUU6IFRoZSBzeW1ib2wncyB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgdGV4dCBzZWN0aW9uCi0gICAgIGFkZHJlc3MuICBIb3dldmVyLCB3ZSB3b3VsZCBoYXZlIHRvIGZpbGwgaXQgaW4gbGF0ZXIsIGFuZCBnZGIKLSAgICAgZG9lc24ndCBjYXJlLCBzbyB3ZSBkb24ndCBib3RoZXIgd2l0aCBpdC4gICovCi0KLSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0KLSAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NPTCwgMCwgMCwgZmlsZW5hbWUpOwotfQotCi0vKiBQdXNoIGFuIGVtcHR5IHR5cGUuICBUaGlzIHNob3VsZG4ndCBub3JtYWxseSBoYXBwZW4uICBXZSBqdXN0IHVzZSBhCi0gICB2b2lkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbXB0eV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIFdlIGRvbid0IGNhbGwgc3RhYl92b2lkX3R5cGUgaWYgdGhlIHR5cGUgaXMgbm90IHlldCBkZWZpbmVkLAotICAgICBiZWNhdXNlIHRoYXQgbWlnaHQgc2NyZXcgdXAgdGhlIHR5cGVkZWYuICAqLwotCi0gIGlmIChpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSAhPSAwKQotICAgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGluZGV4OwotICAgICAgY2hhciBidWZbNDBdOwotCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD0lbGQiLCBpbmRleCwgaW5kZXgpOwotCi0gICAgICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZmFsc2UsIDApOwotICAgIH0KLX0KLQotLyogUHVzaCBhIHZvaWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICBpZiAoaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUgIT0gMCkKLSAgICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUsIDApOwotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbmRleDsKLSAgICAgIGNoYXIgYnVmWzQwXTsKLQotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotCi0gICAgICBpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSA9IGluZGV4OwotCi0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9JWxkIiwgaW5kZXgsIGluZGV4KTsKLQotICAgICAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIDApOwotICAgIH0KLX0KLQotLyogUHVzaCBhbiBpbnRlZ2VyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9pbnRfdHlwZSAocCwgc2l6ZSwgdW5zaWduZWRwKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGxvbmcgKmNhY2hlOwotCi0gIGlmIChzaXplIDw9IDAgfHwgKHNpemUgPiBzaXplb2YgKGxvbmcpICYmIHNpemUgIT0gOCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJzdGFiX2ludF90eXBlOiBiYWQgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodW5zaWduZWRwKQotICAgIGNhY2hlID0gaW5mby0+dHlwZV9jYWNoZS5zaWduZWRfaW50ZWdlcl90eXBlczsKLSAgZWxzZQotICAgIGNhY2hlID0gaW5mby0+dHlwZV9jYWNoZS51bnNpZ25lZF9pbnRlZ2VyX3R5cGVzOwotCi0gIGlmIChjYWNoZVtzaXplIC0gMV0gIT0gMCkKLSAgICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgY2FjaGVbc2l6ZSAtIDFdLCBzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5kZXg7Ci0gICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgICAgIGNhY2hlW3NpemUgLSAxXSA9IGluZGV4OwotCi0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9ciVsZDsiLCBpbmRleCwgaW5kZXgpOwotICAgICAgaWYgKHVuc2lnbmVkcCkKLQl7Ci0JICBzdHJjYXQgKGJ1ZiwgIjA7Iik7Ci0JICBpZiAoc2l6ZSA8IHNpemVvZiAobG9uZykpCi0JICAgIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiVsZDsiLCAoKGxvbmcpIDEgPDwgKHNpemUgKiA4KSkgLSAxKTsKLQkgIGVsc2UgaWYgKHNpemUgPT0gc2l6ZW9mIChsb25nKSkKLQkgICAgc3RyY2F0IChidWYsICItMTsiKTsKLQkgIGVsc2UgaWYgKHNpemUgPT0gOCkKLQkgICAgc3RyY2F0IChidWYsICIwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsiKTsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChzaXplIDw9IHNpemVvZiAobG9uZykpCi0JICAgIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiVsZDslbGQ7IiwKLQkJICAgICAobG9uZykgLSAoKHVuc2lnbmVkIGxvbmcpIDEgPDwgKHNpemUgKiA4IC0gMSkpLAotCQkgICAgIChsb25nKSAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IChzaXplICogOCAtIDEpKSAtIDEpKTsKLQkgIGVsc2UgaWYgKHNpemUgPT0gOCkKLQkgICAgc3RyY2F0IChidWYsICIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDswNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIpOwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCBzaXplKTsKLSAgICB9Ci19Ci0KLS8qIFB1c2ggYSBmbG9hdGluZyBwb2ludCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZmxvYXRfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgaWYgKHNpemUgPiAwCi0gICAgICAmJiBzaXplIC0gMSA8IChzaXplb2YgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlcwotCQkgICAgIC8gc2l6ZW9mIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbMF0pCi0gICAgICAmJiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzW3NpemUgLSAxXSAhPSAwKQotICAgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLAotCQkJCSAgIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbc2l6ZSAtIDFdLAotCQkJCSAgIHNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbmRleDsKLSAgICAgIGNoYXIgKmludF90eXBlOwotICAgICAgY2hhciBidWZbNTBdOwotCi0gICAgICAvKiBGbG9hdHMgYXJlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpbnQuICAqLwotICAgICAgaWYgKCEgc3RhYl9pbnRfdHlwZSAoaW5mbywgNCwgZmFsc2UpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGludF90eXBlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLQotICAgICAgaWYgKHNpemUgPiAwCi0JICAmJiBzaXplIC0gMSA8IChzaXplb2YgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlcwotCQkJIC8gc2l6ZW9mIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbMF0pKQotCWluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbc2l6ZSAtIDFdID0gaW5kZXg7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD1yJXM7JXU7MDsiLCBpbmRleCwgaW50X3R5cGUsIHNpemUpOwotCi0gICAgICBmcmVlIChpbnRfdHlwZSk7Ci0KLSAgICAgIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCBzaXplKTsKLSAgICB9Ci19Ci0KLS8qIFB1c2ggYSBjb21wbGV4IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jb21wbGV4X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyIGJ1Zls1MF07Ci0gIGxvbmcgaW5kZXg7Ci0KLSAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgc3ByaW50ZiAoYnVmLCAiJWxkPXIlbGQ7JXU7MDsiLCBpbmRleCwgaW5kZXgsIHNpemUpOwotCi0gIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCBzaXplICogMik7Ci19Ci0KLS8qIFB1c2ggYSBib29sZWFuIHR5cGUuICBXZSB1c2UgYW4gWENPRkYgcHJlZGVmaW5lZCB0eXBlLCBzaW5jZSBnZGIKLSAgIGFsd2F5cyByZWNvZ25pemVzIHRoZW0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9ib29sX3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBsb25nIGluZGV4OwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5kZXggPSAtMjE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIGluZGV4ID0gLTIyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgNDoKLSAgICAgIGluZGV4ID0gLTE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICBpbmRleCA9IC0zMzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIHNpemUpOwotfQotCi0vKiBQdXNoIGFuIGVudW0gdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFscykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBzaXplX3QgbGVuOwotICBjb25zdCBjaGFyICoqcG47Ci0gIGNoYXIgKmJ1ZjsKLSAgbG9uZyBpbmRleCA9IDA7Ci0gIGJmZF9zaWduZWRfdm1hICpwdjsKLQotICBpZiAobmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKHRhZyAhPSBOVUxMKTsKLQotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMTAgKyBzdHJsZW4gKHRhZykpOwotICAgICAgc3ByaW50ZiAoYnVmLCAieGUlczoiLCB0YWcpOwotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGlzIGp1c3QgYSBndWVzcy4gICovCi0gICAgICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGZhbHNlLCA0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGxlbiA9IDEwOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgbGVuICs9IHN0cmxlbiAodGFnKTsKLSAgZm9yIChwbiA9IG5hbWVzOyAqcG4gIT0gTlVMTDsgcG4rKykKLSAgICBsZW4gKz0gc3RybGVuICgqcG4pICsgMjA7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLQotICBpZiAodGFnID09IE5VTEwpCi0gICAgc3RyY3B5IChidWYsICJlIik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0gICAgICBzcHJpbnRmIChidWYsICIlczpUJWxkPWUiLCB0YWcsIGluZGV4KTsKLSAgICB9Ci0KLSAgZm9yIChwbiA9IG5hbWVzLCBwdiA9IHZhbHM7ICpwbiAhPSBOVUxMOyBwbisrLCBwdisrKQotICAgIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiVzOiVsZCwiLCAqcG4sIChsb25nKSAqcHYpOwotICBzdHJjYXQgKGJ1ZiwgIjsiKTsKLQotICBpZiAodGFnID09IE5VTEwpCi0gICAgewotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGlzIGp1c3QgYSBndWVzcy4gICovCi0gICAgICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGZhbHNlLCA0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGlzIGp1c3QgYSBndWVzcy4gICovCi0gICAgICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpCi0JICB8fCAhIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCA0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSBtb2RpZmljYXRpb24gb2YgdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjay4gIENhY2hlIHRoZQotICAgcmVzdWx0cyBpbiBDQUNIRSBhbmQgQ0FDSEVfQUxMT0MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgbW9kLCBzaXplLCBjYWNoZSwgY2FjaGVfYWxsb2MpCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IG1vZDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGxvbmcgKipjYWNoZTsKLSAgICAgc2l6ZV90ICpjYWNoZV9hbGxvYzsKLXsKLSAgbG9uZyB0YXJnaW5kZXg7Ci0gIGxvbmcgaW5kZXg7Ci0gIGNoYXIgKnMsICpidWY7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwpOwotICB0YXJnaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT5pbmRleDsKLQotICBpZiAodGFyZ2luZGV4IDw9IDAKLSAgICAgIHx8IGNhY2hlID09IE5VTEwpCi0gICAgewotICAgICAgYm9vbGVhbiBkZWZpbml0aW9uOwotCi0gICAgICAvKiBFaXRoZXIgdGhlIHRhcmdldCB0eXBlIGhhcyBubyBpbmRleCwgb3Igd2UgYXJlbid0IGNhY2hpbmcKLSAgICAgICAgIHRoaXMgbW9kaWZpZXIuICBFaXRoZXIgd2F5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY29yZGluZyB0aGUKLSAgICAgICAgIG5ldyB0eXBlLCBzbyB3ZSBkb24ndCBib3RoZXIgdG8gZGVmaW5lIG9uZS4gICovCi0gICAgICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgICAgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAyKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVjJXMiLCBtb2QsIHMpOwotICAgICAgZnJlZSAocyk7Ci0gICAgICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGRlZmluaXRpb24sIHNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChzaXplX3QpIHRhcmdpbmRleCA+PSAqY2FjaGVfYWxsb2MpCi0JewotCSAgc2l6ZV90IGFsbG9jOwotCi0JICBhbGxvYyA9ICpjYWNoZV9hbGxvYzsKLQkgIGlmIChhbGxvYyA9PSAwKQotCSAgICBhbGxvYyA9IDEwOwotCSAgd2hpbGUgKChzaXplX3QpIHRhcmdpbmRleCA+PSBhbGxvYykKLQkgICAgYWxsb2MgKj0gMjsKLQkgICpjYWNoZSA9IChsb25nICopIHhyZWFsbG9jICgqY2FjaGUsIGFsbG9jICogc2l6ZW9mIChsb25nKSk7Ci0JICBtZW1zZXQgKCpjYWNoZSArICpjYWNoZV9hbGxvYywgMCwKLQkJICAoYWxsb2MgLSAqY2FjaGVfYWxsb2MpICogc2l6ZW9mIChsb25nKSk7Ci0JICAqY2FjaGVfYWxsb2MgPSBhbGxvYzsKLQl9Ci0KLSAgICAgIGluZGV4ID0gKCpjYWNoZSlbdGFyZ2luZGV4XTsKLSAgICAgIGlmIChpbmRleCAhPSAwICYmICEgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbikKLQl7Ci0JICAvKiBXZSBoYXZlIGFscmVhZHkgZGVmaW5lZCBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHR5cGUsIGFuZAotICAgICAgICAgICAgIHRoZSBlbnRyeSBvbiB0aGUgdHlwZSBzdGFjayBpcyBub3QgYSBkZWZpbml0aW9uLCBzbyB3ZQotICAgICAgICAgICAgIGNhbiBzYWZlbHkgZGlzY2FyZCBpdCAod2UgbWF5IGhhdmUgYSBkZWZpbml0aW9uIG9uIHRoZQotICAgICAgICAgICAgIHN0YWNrLCBldmVuIGlmIHdlIGFscmVhZHkgZGVmaW5lZCBhIG1vZGlmaWNhdGlvbiwgaWYgaXQKLSAgICAgICAgICAgICBpcyBhIHN0cnVjdCB3aGljaCB3ZSBkaWQgbm90IGRlZmluZSBhdCB0aGUgdGltZSBpdCB3YXMKLSAgICAgICAgICAgICByZWZlcmVuY2VkKS4gICovCi0JICBmcmVlIChzdGFiX3BvcF90eXBlIChpbmZvKSk7Ci0JICBpZiAoISBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotCSAgKytpbmZvLT50eXBlX2luZGV4OwotCi0JICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0JICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMjApOwotCSAgc3ByaW50ZiAoYnVmLCAiJWxkPSVjJXMiLCBpbmRleCwgbW9kLCBzKTsKLQkgIGZyZWUgKHMpOwotCi0JICAoKmNhY2hlKVt0YXJnaW5kZXhdID0gaW5kZXg7Ci0KLQkgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIHNpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGZyZWUgKGJ1Zik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0gIAotCi0vKiBQdXNoIGEgcG9pbnRlciB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcG9pbnRlcl90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIEZJWE1FOiBUaGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnKicsIDQsICZpbmZvLT50eXBlX2NhY2hlLnBvaW50ZXJfdHlwZXMsCi0JCQkgICAmaW5mby0+dHlwZV9jYWNoZS5wb2ludGVyX3R5cGVzX2FsbG9jKTsKLX0KLQotLyogUHVzaCBhIGZ1bmN0aW9uIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGludCBpOwotCi0gIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlcHJlc2VudCB0aGUgYXJndW1lbnQgdHlwZXMsIHNvIHdlIGp1c3QKLSAgICAgZGlzY2FyZCB0aGVtLiAgSG93ZXZlciwgaWYgdGhleSBkZWZpbmUgbmV3IHR5cGVzLCB3ZSBtdXN0IG91dHB1dAotICAgICB0aGVtLiAgV2UgZG8gdGhpcyBieSBwcm9kdWNpbmcgZW1wdHkgdHlwZWRlZnMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uKQotCWZyZWUgKHN0YWJfcG9wX3R5cGUgKGluZm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpzLCAqYnVmOwotCi0JICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLQkgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAzKTsKLQkgIHNwcmludGYgKGJ1ZiwgIjp0JXMiLCBzKTsKLQkgIGZyZWUgKHMpOwotCi0JICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGZyZWUgKGJ1Zik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJ2YnLCAwLCAmaW5mby0+dHlwZV9jYWNoZS5mdW5jdGlvbl90eXBlcywKLQkJCSAgICZpbmZvLT50eXBlX2NhY2hlLmZ1bmN0aW9uX3R5cGVzX2FsbG9jKTsKLX0KLQotLyogUHVzaCBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcmVmZXJlbmNlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUU6IFRoZSBzaXplIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICcmJywgNCwgJmluZm8tPnR5cGVfY2FjaGUucmVmZXJlbmNlX3R5cGVzLAotCQkJICAgJmluZm8tPnR5cGVfY2FjaGUucmVmZXJlbmNlX3R5cGVzX2FsbG9jKTsKLX0KLQotLyogUHVzaCBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9yYW5nZV90eXBlIChwLCBsb3csIGhpZ2gpCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgY2hhciAqcywgKmJ1ZjsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnNpemU7Ci0KLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMTAwKTsKLSAgc3ByaW50ZiAoYnVmLCAiciVzOyVsZDslbGQ7IiwgcywgKGxvbmcpIGxvdywgKGxvbmcpIGhpZ2gpOwotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGRlZmluaXRpb24sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGFuIGFycmF5IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9hcnJheV90eXBlIChwLCBsb3csIGhpZ2gsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIHVuc2lnbmVkIGludCBlbGVtZW50X3NpemU7Ci0gIGNoYXIgKnJhbmdlLCAqZWxlbWVudCwgKmJ1ZjsKLSAgbG9uZyBpbmRleDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHJhbmdlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgZWxlbWVudF9zaXplID0gaW5mby0+dHlwZV9zdGFjay0+c2l6ZTsKLSAgZWxlbWVudCA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocmFuZ2UpICsgc3RybGVuIChlbGVtZW50KSArIDEwMCk7Ci0KLSAgaWYgKCEgc3RyaW5ncCkKLSAgICB7Ci0gICAgICBpbmRleCA9IDA7Ci0gICAgICAqYnVmID0gJ1wwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIGRlZmluZSBhIHR5cGUgaW4gb3JkZXIgdG8gaW5jbHVkZSB0aGUgc3RyaW5nCi0gICAgICAgICBhdHRyaWJ1dGUuICAqLwotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotICAgICAgZGVmaW5pdGlvbiA9IHRydWU7Ci0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9QFM7IiwgaW5kZXgpOwotICAgIH0KLQotICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICJhciVzOyVsZDslbGQ7JXMiLAotCSAgIHJhbmdlLCAobG9uZykgbG93LCAobG9uZykgaGlnaCwgZWxlbWVudCk7Ci0gIGZyZWUgKHJhbmdlKTsKLSAgZnJlZSAoZWxlbWVudCk7Ci0KLSAgaWYgKGhpZ2ggPCBsb3cpCi0gICAgc2l6ZSA9IDA7Ci0gIGVsc2UKLSAgICBzaXplID0gZWxlbWVudF9zaXplICogKChoaWdoIC0gbG93KSArIDEpOwotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBkZWZpbml0aW9uLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHNldCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc2V0X3R5cGUgKHAsIGJpdHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBib29sZWFuIGJpdHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICpzLCAqYnVmOwotICBsb25nIGluZGV4OwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotCi0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDMwKTsKLQotICBpZiAoISBiaXRzdHJpbmdwKQotICAgIHsKLSAgICAgICpidWYgPSAnXDAnOwotICAgICAgaW5kZXggPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gZGVmaW5lIGEgdHlwZSBpbiBvcmRlciB0byBpbmNsdWRlIHRoZSBzdHJpbmcKLSAgICAgICAgIGF0dHJpYnV0ZS4gICovCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0gICAgICBkZWZpbml0aW9uID0gdHJ1ZTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD1AUzsiLCBpbmRleCk7Ci0gICAgfQotCi0gIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIlMlcyIsIHMpOwotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBkZWZpbml0aW9uLCAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhbiBvZmZzZXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX29mZnNldF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKnRhcmdldCwgKmJhc2UsICpidWY7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHRhcmdldCA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIGJhc2UgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHRhcmdldCkgKyBzdHJsZW4gKGJhc2UpICsgMyk7Ci0gIHNwcmludGYgKGJ1ZiwgIkAlcywlcyIsIGJhc2UsIHRhcmdldCk7Ci0gIGZyZWUgKGJhc2UpOwotICBmcmVlICh0YXJnZXQpOwotCi0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZGVmaW5pdGlvbiwgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSBtZXRob2QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX21ldGhvZF90eXBlIChwLCBkb21haW5wLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gZG9tYWlucDsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICpkb21haW4sICpyZXR1cm5fdHlwZSwgKmJ1ZjsKLSAgY2hhciAqKmFyZ3M7Ci0gIGludCBpOwotICBzaXplX3QgbGVuOwotCi0gIC8qIFdlIGRvbid0IGJvdGhlciB3aXRoIHN0dWIgbWV0aG9kIHR5cGVzLCBiZWNhdXNlIHRoYXQgd291bGQKLSAgICAgcmVxdWlyZSBhIG1hbmdsZXIgZm9yIEMrKyBhcmd1bWVudCB0eXBlcy4gIFRoaXMgd2lsbCB3YXN0ZSBzcGFjZQotICAgICBpbiB0aGUgZGVidWdnaW5nIG91dHB1dC4gICovCi0KLSAgLyogV2UgbmVlZCBhIGRvbWFpbi4gIEknbSBub3Qgc3VyZSBET01BSU5QIGNhbiBldmVyIGJlIGZhbHNlLAotICAgICBhbnlob3cuICAqLwotICBpZiAoISBkb21haW5wKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfZW1wdHlfdHlwZSAocCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgZG9tYWluID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQSBub24tdmFyYXJncyBmdW5jdGlvbiBpcyBpbmRpY2F0ZWQgYnkgbWFraW5nIHRoZSBsYXN0IHBhcmFtZXRlcgotICAgICB0eXBlIGJlIHZvaWQuICAqLwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgewotICAgICAgYXJncyA9IE5VTEw7Ci0gICAgICBhcmdjb3VudCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChhcmdjb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGlmICh2YXJhcmdzKQotCWFyZ3MgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGFyZ3MgPSAoY2hhciAqKikgeG1hbGxvYyAoMSAqIHNpemVvZiAoKmFyZ3MpKTsKLQkgIGlmICghIHN0YWJfZW1wdHlfdHlwZSAocCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0JICBhcmdzWzBdID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0JICBhcmdjb3VudCA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFyZ3MgPSAoY2hhciAqKikgeG1hbGxvYyAoKGFyZ2NvdW50ICsgMSkgKiBzaXplb2YgKCphcmdzKSk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0JICBhcmdzW2ldID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0JfQotICAgICAgaWYgKCEgdmFyYXJncykKLQl7Ci0JICBpZiAoISBzdGFiX2VtcHR5X3R5cGUgKHApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotCSAgYXJnc1thcmdjb3VudF0gPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQkgICsrYXJnY291bnQ7Ci0JfQotICAgIH0KLQotICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICByZXR1cm5fdHlwZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGxlbiA9IHN0cmxlbiAoZG9tYWluKSArIHN0cmxlbiAocmV0dXJuX3R5cGUpICsgMTA7Ci0gIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotICAgIGxlbiArPSBzdHJsZW4gKGFyZ3NbaV0pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0KLSAgc3ByaW50ZiAoYnVmLCAiIyVzLCVzIiwgZG9tYWluLCByZXR1cm5fdHlwZSk7Ci0gIGZyZWUgKGRvbWFpbik7Ci0gIGZyZWUgKHJldHVybl90eXBlKTsKLSAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspCi0gICAgewotICAgICAgc3RyY2F0IChidWYsICIsIik7Ci0gICAgICBzdHJjYXQgKGJ1ZiwgYXJnc1tpXSk7Ci0gICAgICBmcmVlIChhcmdzW2ldKTsKLSAgICB9Ci0gIHN0cmNhdCAoYnVmLCAiOyIpOwotCi0gIGlmIChhcmdzICE9IE5VTEwpCi0gICAgZnJlZSAoYXJncyk7Ci0KLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBkZWZpbml0aW9uLCAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIGNvbnN0IHZlcnNpb24gb2YgYSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY29uc3RfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJ2snLCBpbmZvLT50eXBlX3N0YWNrLT5zaXplLAotCQkJICAgKGxvbmcgKiopIE5VTEwsIChzaXplX3QgKikgTlVMTCk7Ci19Ci0KLS8qIFB1c2ggYSB2b2xhdGlsZSB2ZXJzaW9uIG9mIGEgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3ZvbGF0aWxlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICdCJywgaW5mby0+dHlwZV9zdGFjay0+c2l6ZSwKLQkJCSAgIChsb25nICoqKSBOVUxMLCAoc2l6ZV90ICopIE5VTEwpOwotfQotCi0vKiBHZXQgdGhlIHR5cGUgaW5kZXggdG8gdXNlIGZvciBhIHN0cnVjdC91bmlvbi9jbGFzcyBJRC4gIFRoaXMgc2hvdWxkCi0gICByZXR1cm4gLTEgaWYgaXQgZmFpbHMuICAqLwotCi1zdGF0aWMgbG9uZwotc3RhYl9nZXRfc3RydWN0X2luZGV4IChpbmZvLCB0YWcsIGlkLCBraW5kLCBwc2l6ZSkKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLSAgICAgdW5zaWduZWQgaW50ICpwc2l6ZTsKLXsKLSAgaWYgKGlkID49IGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzX2FsbG9jKQotICAgIHsKLSAgICAgIHNpemVfdCBhbGxvYzsKLQotICAgICAgYWxsb2MgPSBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYzsKLSAgICAgIGlmIChhbGxvYyA9PSAwKQotCWFsbG9jID0gMTA7Ci0gICAgICB3aGlsZSAoaWQgPj0gYWxsb2MpCi0JYWxsb2MgKj0gMjsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzID0KLQkoc3RydWN0IHN0YWJfdGFnICopIHhyZWFsbG9jIChpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlcywKLQkJCQkgICAgICBhbGxvYyAqIHNpemVvZiAoc3RydWN0IHN0YWJfdGFnKSk7Ci0gICAgICBtZW1zZXQgKChpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlcwotCSAgICAgICArIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzX2FsbG9jKSwKLQkgICAgICAwLAotCSAgICAgICgoYWxsb2MgLSBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYykKLQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBzdGFiX3RhZykpKTsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzX2FsbG9jID0gYWxsb2M7Ci0gICAgfQotCi0gIGlmIChpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0uaW5kZXggPT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0uaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLnRhZyA9IHRhZzsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5raW5kID0ga2luZDsKLSAgICB9Ci0KLSAgaWYgKGtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBkZWZpbml0aW9uIG9mIHRoZSBzdHJ1Y3QuICAqLwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLmtpbmQgPSBraW5kOwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLnNpemUgPSAqcHNpemU7Ci0gICAgfQotICBlbHNlCi0gICAgKnBzaXplID0gaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLnNpemU7Ci0KLSAgcmV0dXJuIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5pbmRleDsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBhIHN0cnVjdC4gIFdlIGlnbm9yZSB0aGUgdGFnLCBhbmQgaGFuZGxlIGl0IGluCi0gICBzdGFiX3RhZy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfc3RydWN0X3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBsb25nIGluZGV4OwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKmJ1ZjsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICg0MCk7Ci0KLSAgaWYgKGlkID09IDApCi0gICAgewotICAgICAgaW5kZXggPSAwOwotICAgICAgKmJ1ZiA9ICdcMCc7Ci0gICAgICBkZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5kZXggPSBzdGFiX2dldF9zdHJ1Y3RfaW5kZXggKGluZm8sIHRhZywgaWQsIERFQlVHX0tJTkRfSUxMRUdBTCwKLQkJCQkgICAgICZzaXplKTsKLSAgICAgIGlmIChpbmRleCA8IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPSIsIGluZGV4KTsKLSAgICAgIGRlZmluaXRpb24gPSB0cnVlOwotICAgIH0KLQotICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIlYyV1IiwKLQkgICBzdHJ1Y3RwID8gJ3MnIDogJ3UnLAotCSAgIHNpemUpOwotCi0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGRlZmluaXRpb24sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgPSAoY2hhciAqKSB4bWFsbG9jICgxKTsKLSAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzWzBdID0gJ1wwJzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgZmllbGQgdG8gYSBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdHJ1Y3RfZmllbGQgKHAsIG5hbWUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBiZmRfdm1hIGJpdHNpemU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGNoYXIgKnMsICpuOwotICBjb25zdCBjaGFyICp2aXM7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOwotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQWRkIHRoaXMgZmllbGQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdHJ1Y3QgZmllbGRzLCB3aGljaCBpcwotICAgICBjdXJyZW50bHkgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzICE9IE5VTEwpOwotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpCi0JCQkrIHN0cmxlbiAobmFtZSkKLQkJCSsgc3RybGVuIChzKQotCQkJKyA1MCk7Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgdmlzID0gIiI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgdmlzID0gIi8wIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHZpcyA9ICIvMSI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGJpdHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICBiaXRzaXplID0gc2l6ZSAqIDg7Ci0gICAgICBpZiAoYml0c2l6ZSA9PSAwKQotCWZwcmludGYgKHN0ZGVyciwKLQkJIF8oIiVzOiB3YXJuaW5nOiB1bmtub3duIHNpemUgZm9yIGZpZWxkIGAlcycgaW4gc3RydWN0XG4iKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpLCBuYW1lKTsKLSAgICB9Ci0KLSAgc3ByaW50ZiAobiwgIiVzJXM6JXMlcywlbGQsJWxkOyIsIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcywgbmFtZSwgdmlzLCBzLAotCSAgIChsb25nKSBiaXRwb3MsIChsb25nKSBiaXRzaXplKTsKLQotICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpOwotICBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgPSBuOwotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbmRfc3RydWN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgbG9uZyBpbmRleDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGNoYXIgKmZpZWxkcywgKmZpcnN0LCAqYnVmOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT5pbmRleDsKLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnNpemU7Ci0gIGZpZWxkcyA9IGluZm8tPnR5cGVfc3RhY2stPmZpZWxkczsKLSAgZmlyc3QgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpcnN0KSArIHN0cmxlbiAoZmllbGRzKSArIDIpOwotICBzcHJpbnRmIChidWYsICIlcyVzOyIsIGZpcnN0LCBmaWVsZHMpOwotICBmcmVlIChmaXJzdCk7Ci0gIGZyZWUgKGZpZWxkcyk7Ci0KLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZGVmaW5pdGlvbiwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0YXJ0X2NsYXNzX3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUsIHZwdHIsIG93bnZwdHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB2cHRyOwotICAgICBib29sZWFuIG93bnZwdHI7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICp2c3RyaW5nOwotCi0gIGlmICghIHZwdHIgfHwgb3dudnB0cikKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICB2c3RyaW5nID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgICAgIHZzdHJpbmcgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLSAgICB9Ci0KLSAgaWYgKCEgc3RhYl9zdGFydF9zdHJ1Y3RfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2cHRyKQotICAgIHsKLSAgICAgIGNoYXIgKnZ0YWJsZTsKLQotICAgICAgaWYgKG93bnZwdHIpCi0JewotCSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrLT5pbmRleCA+IDApOwotCSAgdnRhYmxlID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotCSAgc3ByaW50ZiAodnRhYmxlLCAifiUlJWxkIiwgaW5mby0+dHlwZV9zdGFjay0+aW5kZXgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2dGFibGUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHZzdHJpbmcpICsgMyk7Ci0JICBzcHJpbnRmICh2dGFibGUsICJ+JSUlcyIsIHZzdHJpbmcpOwotCSAgZnJlZSAodnN0cmluZyk7Ci0JfQotCi0gICAgICBpbmZvLT50eXBlX3N0YWNrLT52dGFibGUgPSB2dGFibGU7Ci0gICAgfQotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgbWVtYmVyIHRvIHRoZSBjbGFzcyBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX3N0YXRpY19tZW1iZXIgKHAsIG5hbWUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqcywgKm47Ci0gIGNvbnN0IGNoYXIgKnZpczsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEFkZCB0aGlzIGZpZWxkIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3RydWN0IGZpZWxkcywgd2hpY2ggaXMKLSAgICAgY3VycmVudGx5IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKQotCQkJKyBzdHJsZW4gKG5hbWUpCi0JCQkrIHN0cmxlbiAocykKLQkJCSsgc3RybGVuIChwaHlzbmFtZSkKLQkJCSsgMTApOwotCi0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHZpcyA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHZpcyA9ICIvMCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICB2aXMgPSAiLzEiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHNwcmludGYgKG4sICIlcyVzOiVzJXM6JXM7IiwgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzLCBuYW1lLCB2aXMsIHMsCi0JICAgcGh5c25hbWUpOwotCi0gIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyk7Ci0gIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyA9IG47Ci0KLSAgaWYgKGRlZmluaXRpb24pCi0gICAgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGJhc2UgY2xhc3MgdG8gdGhlIGNsYXNzIG9uIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3NfYmFzZWNsYXNzIChwLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgKmJ1ZjsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGNoYXIgKipiYXNlY2xhc3NlczsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEJ1aWxkIHRoZSBiYXNlIGNsYXNzIHNwZWNpZmllci4gICovCi0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDI1KTsKLSAgYnVmWzBdID0gdmlydHVhbCA/ICcxJyA6ICcwJzsKLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIGJ1ZlsxXSA9ICcwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIGJ1ZlsxXSA9ICcxJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIGJ1ZlsxXSA9ICcyJzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBzcHJpbnRmIChidWYgKyAyLCAiJWxkLCVzOyIsIChsb25nKSBiaXRwb3MsIHMpOwotICBmcmVlIChzKTsKLQotICAvKiBBZGQgdGhlIG5ldyBiYXNlY2xhc3MgdG8gdGhlIGV4aXN0aW5nIG9uZXMuICAqLwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgPT0gTlVMTCkKLSAgICBjID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAwOwotICAgICAgd2hpbGUgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2NdICE9IE5VTEwpCi0JKytjOwotICAgIH0KLQotICBiYXNlY2xhc3NlcyA9IChjaGFyICoqKSB4cmVhbGxvYyAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMsCi0JCQkJICAgIChjICsgMikgKiBzaXplb2YgKCpiYXNlY2xhc3NlcykpOwotICBiYXNlY2xhc3Nlc1tjXSA9IGJ1ZjsKLSAgYmFzZWNsYXNzZXNbYyArIDFdID0gTlVMTDsKLQotICBpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3NlcyA9IGJhc2VjbGFzc2VzOwotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhZGRpbmcgYSBtZXRob2QgdG8gdGhlIGNsYXNzIG9uIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3Nfc3RhcnRfbWV0aG9kIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICptOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG0gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMyk7Ci0gICAgICAqbSA9ICdcMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbSA9IChjaGFyICopIHhyZWFsbG9jIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzLAotCQkJICAgICAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKQotCQkJICAgICAgKyBzdHJsZW4gKG5hbWUpCi0JCQkgICAgICArIDQpKTsKLSAgICB9Ci0KLSAgc3ByaW50ZiAobSArIHN0cmxlbiAobSksICIlczo6IiwgbmFtZSk7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyA9IG07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHZhcmlhbnQsIGVpdGhlciBzdGF0aWMgb3Igbm90LCB0byB0aGUgY3VycmVudCBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgc3RhdGljcCwgY29uc3RwLCB2b2xhdGlsZXAsCi0JCSAgICAgICB2b2Zmc2V0LCBjb250ZXh0cCkKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gc3RhdGljcDsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dHA7Ci17Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqdHlwZTsKLSAgY2hhciAqY29udGV4dCA9IE5VTEw7Ci0gIGNoYXIgdmlzYywgcXVhbGMsIHR5cGVjOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICB0eXBlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKGNvbnRleHRwKQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gICAgICBjb250ZXh0ID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0gICAgfQotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgIT0gTlVMTCk7Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHZpc2MgPSAnMCc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICB2aXNjID0gJzEnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgdmlzYyA9ICcyJzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoY29uc3RwKQotICAgIHsKLSAgICAgIGlmICh2b2xhdGlsZXApCi0JcXVhbGMgPSAnRCc7Ci0gICAgICBlbHNlCi0JcXVhbGMgPSAnQic7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHZvbGF0aWxlcCkKLQlxdWFsYyA9ICdDJzsKLSAgICAgIGVsc2UKLQlxdWFsYyA9ICdBJzsKLSAgICB9Ci0KLSAgaWYgKHN0YXRpY3ApCi0gICAgdHlwZWMgPSAnPyc7Ci0gIGVsc2UgaWYgKCEgY29udGV4dHApCi0gICAgdHlwZWMgPSAnLic7Ci0gIGVsc2UKLSAgICB0eXBlYyA9ICcqJzsKLQotICBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzID0KLSAgICAoY2hhciAqKSB4cmVhbGxvYyAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcywKLQkJICAgICAgIChzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpCi0JCQkrIHN0cmxlbiAodHlwZSkKLQkJCSsgc3RybGVuIChwaHlzbmFtZSkKLQkJCSsgKGNvbnRleHRwID8gc3RybGVuIChjb250ZXh0KSA6IDApCi0JCQkrIDQwKSk7Ci0KLSAgc3ByaW50ZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyArIHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyksCi0JICAgIiVzOiVzOyVjJWMlYyIsIHR5cGUsIHBoeXNuYW1lLCB2aXNjLCBxdWFsYywgdHlwZWMpOwotICBmcmVlICh0eXBlKTsKLQotICBpZiAoY29udGV4dHApCi0gICAgewotICAgICAgc3ByaW50ZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyArIHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyksCi0JICAgICAgICIlbGQ7JXM7IiwgKGxvbmcpIHZvZmZzZXQsIGNvbnRleHQpOwotICAgICAgZnJlZSAoY29udGV4dCk7Ci0gICAgfQotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSB2YXJpYW50IHRvIHRoZSBjdXJyZW50IG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXAsCi0JCQkgICB2b2Zmc2V0LCBjb250ZXh0cCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3RhYl9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgZmFsc2UsIGNvbnN0cCwKLQkJCQl2b2xhdGlsZXAsIHZvZmZzZXQsIGNvbnRleHRwKTsKLX0KLQotLyogQWRkIGEgc3RhdGljIHZhcmlhbnQgdG8gdGhlIGN1cnJlbnQgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdGFiX2NsYXNzX21ldGhvZF92YXIgKGluZm8sIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCB0cnVlLCBjb25zdHAsCi0JCQkJdm9sYXRpbGVwLCAwLCBmYWxzZSk7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX2VuZF9tZXRob2QgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwgJiYgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyAhPSBOVUxMKTsKLQotICAvKiBXZSBhbGxvY2F0ZWQgZW5vdWdoIHJvb20gb24gaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyB0byBhZGQgdGhlCi0gICAgIHRyYWlsaW5nIHNlbWljb2xvbi4gICovCi0gIHN0cmNhdCAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcywgIjsiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbmRfY2xhc3NfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgc2l6ZV90IGxlbjsKLSAgdW5zaWduZWQgaW50IGkgPSAwOwotICBjaGFyICpidWY7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwgJiYgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzICE9IE5VTEwpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBzaXplIHdlIG5lZWQgdG8gYWxsb2NhdGUgZm9yIHRoZSBjbGFzcyBkZWZpbml0aW9uLiAgKi8KLQotICBsZW4gPSAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5zdHJpbmcpCi0JICsgc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpCi0JICsgMTApOwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZW4gKz0gMjA7Ci0gICAgICBmb3IgKGkgPSAwOyBpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tpXSAhPSBOVUxMOyBpKyspCi0JbGVuICs9IHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0pOwotICAgIH0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgIT0gTlVMTCkKLSAgICBsZW4gKz0gc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKTsKLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSAhPSBOVUxMKQotICAgIGxlbiArPSBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSk7Ci0KLSAgLyogQnVpbGQgdGhlIGNsYXNzIGRlZmluaXRpb24uICAqLwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0KLSAgc3RyY3B5IChidWYsIGluZm8tPnR5cGVfc3RhY2stPnN0cmluZyk7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzICE9IE5VTEwpCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiISV1LCIsIGkpOwotICAgICAgZm9yIChpID0gMDsgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIHN0cmNhdCAoYnVmLCBpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tpXSk7Ci0JICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tpXSk7Ci0JfQotICAgICAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMpOwotICAgICAgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgPSBOVUxMOwotICAgIH0KLQotICBzdHJjYXQgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKTsKLSAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKTsKLSAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzID0gTlVMTDsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cmNhdCAoYnVmLCBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKTsKLSAgICAgIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpOwotICAgICAgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyA9IE5VTEw7Ci0gICAgfQotCi0gIHN0cmNhdCAoYnVmLCAiOyIpOwotCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT52dGFibGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJjYXQgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlKTsKLSAgICAgIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSk7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT52dGFibGUgPSBOVUxMOwotICAgIH0KLQotICAvKiBSZXBsYWNlIHRoZSBzdHJpbmcgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aCB0aGUgY29tcGxldGUKLSAgICAgY2xhc3MgZGVmaW5pdGlvbi4gICovCi0gIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPnN0cmluZyk7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnN0cmluZyA9IGJ1ZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHR5cGVkZWYgd2hpY2ggd2FzIHByZXZpb3VzbHkgZGVmaW5lZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3R5cGVkZWZfdHlwZSAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZpbmZvLT50eXBlZGVmX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0gIGFzc2VydCAoaCAhPSBOVUxMICYmIGgtPmluZGV4ID4gMCk7Ci0KLSAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGgtPmluZGV4LCBoLT5zaXplKTsKLX0KLQotLyogUHVzaCBhIHN0cnVjdCwgdW5pb24gb3IgY2xhc3MgdGFnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdGFnX3R5cGUgKHAsIG5hbWUsIGlkLCBraW5kKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGxvbmcgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotCi0gIGluZGV4ID0gc3RhYl9nZXRfc3RydWN0X2luZGV4IChpbmZvLCBuYW1lLCBpZCwga2luZCwgJnNpemUpOwotICBpZiAoaW5kZXggPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIHNpemUpOwotfQotCi0vKiBEZWZpbmUgYSB0eXBlZGVmLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdHlwZGVmIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBsb25nIGluZGV4OwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgY2hhciAqcywgKmJ1ZjsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpoOwotCi0gIGluZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+aW5kZXg7Ci0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOwotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAocykgKyAyMCk7Ci0KLSAgaWYgKGluZGV4ID4gMCkKLSAgICBzcHJpbnRmIChidWYsICIlczp0JXMiLCBuYW1lLCBzKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzOnQlbGQ9JXMiLCBuYW1lLCBpbmRleCwgcyk7Ci0gICAgfQotCi0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgaCA9IHN0cmluZ19oYXNoX2xvb2t1cCAoJmluZm8tPnR5cGVkZWZfaGFzaCwgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygic3RyaW5nX2hhc2hfbG9va3VwIGZhaWxlZDogJXNcbiIpLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEkgZG9uJ3QgdGhpbmsgd2UgY2FyZSBhYm91dCByZWRlZmluaXRpb25zLiAgKi8KLQotICBoLT5pbmRleCA9IGluZGV4OwotICBoLT5zaXplID0gc2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVmaW5lIGEgdGFnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdGFnIChwLCB0YWcpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqcywgKmJ1ZjsKLQotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuICh0YWcpICsgc3RybGVuIChzKSArIDMpOwotCi0gIHNwcmludGYgKGJ1ZiwgIiVzOlQlcyIsIHRhZywgcyk7Ci0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfaW50X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpidWY7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDIwKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6Yz1pJWxkIiwgbmFtZSwgKGxvbmcpIHZhbCk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVmaW5lIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9mbG9hdF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZG91YmxlIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpidWY7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDIwKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6Yz1mJWciLCBuYW1lLCB2YWwpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnMsICpidWY7Ci0KLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHMpICsgMjApOwotICBzcHJpbnRmIChidWYsICIlczpjPWUlcywlbGQiLCBuYW1lLCBzLCAobG9uZykgdmFsKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl92YXJpYWJsZSAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpzLCAqYnVmOwotICBpbnQgc3RhYl90eXBlOwotICBjb25zdCBjaGFyICpraW5kc3RyOwotCi0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgREVCVUdfR0xPQkFMOgotICAgICAgc3RhYl90eXBlID0gTl9HU1lNOwotICAgICAga2luZHN0ciA9ICJHIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19TVEFUSUM6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1NUU1lNOwotICAgICAga2luZHN0ciA9ICJTIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19MT0NBTF9TVEFUSUM6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1NUU1lNOwotICAgICAga2luZHN0ciA9ICJWIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19MT0NBTDoKLSAgICAgIHN0YWJfdHlwZSA9IE5fTFNZTTsKLSAgICAgIGtpbmRzdHIgPSAiIjsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBhIHR5cGUgcmVmZXJlbmNlIG9yIGRlZmluaXRpb24uICAqLwotICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQl7Ci0JICBjaGFyICpuOwotCSAgbG9uZyBpbmRleDsKLQotCSAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotCSAgKytpbmZvLT50eXBlX2luZGV4OwotCSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAyMCk7Ci0JICBzcHJpbnRmIChuLCAiJWxkPSVzIiwgaW5kZXgsIHMpOwotCSAgZnJlZSAocyk7Ci0JICBzID0gbjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfUkVHSVNURVI6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1JTWU07Ci0gICAgICBraW5kc3RyID0gInIiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHMpICsgMyk7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzOiVzJXMiLCBuYW1lLCBraW5kc3RyLCBzKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIHN0YWJfdHlwZSwgMCwgdmFsLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBvdXRwdXR0aW5nIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdGFydF9mdW5jdGlvbiAocCwgbmFtZSwgZ2xvYmFscCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJvb2xlYW4gZ2xvYmFscDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpyZXR0eXBlLCAqYnVmOwotCi0gIGFzc2VydCAoaW5mby0+bmVzdGluZyA9PSAwICYmIGluZm8tPmZ1bl9vZmZzZXQgPT0gLTEpOwotCi0gIHJldHR5cGUgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChyZXR0eXBlKSArIDMpOwotICBzcHJpbnRmIChidWYsICIlczolYyVzIiwgbmFtZSwKLQkgICBnbG9iYWxwID8gJ0YnIDogJ2YnLAotCSAgIHJldHR5cGUpOwotCi0gIC8qIFdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG5vdywgc28gd2Ugc2V0IGl0IGluIHN0YXJ0X2Jsb2NrLiAgKi8KLSAgaW5mby0+ZnVuX29mZnNldCA9IGluZm8tPnN5bWJvbHNfc2l6ZTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9GVU4sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2Z1bmN0aW9uX3BhcmFtZXRlciAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqcywgKmJ1ZjsKLSAgaW50IHN0YWJfdHlwZTsKLSAgY2hhciBraW5kYzsKLQotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1BBUk1fU1RBQ0s6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1BTWU07Ci0gICAgICBraW5kYyA9ICdwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19QQVJNX1JFRzoKLSAgICAgIHN0YWJfdHlwZSA9IE5fUlNZTTsKLSAgICAgIGtpbmRjID0gJ1AnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1BBUk1fUkVGRVJFTkNFOgotICAgICAgc3RhYl90eXBlID0gTl9QU1lNOwotICAgICAga2luZGMgPSAndic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfUEFSTV9SRUZfUkVHOgotICAgICAgc3RhYl90eXBlID0gTl9SU1lNOwotICAgICAga2luZGMgPSAnYSc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAocykgKyAzKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6JWMlcyIsIG5hbWUsIGtpbmRjLCBzKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIHN0YWJfdHlwZSwgMCwgdmFsLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBGaWxsIGluIGFueSBzbG90cyB3aGljaCBoYXZlIGJlZW4gd2FpdGluZyBmb3IgdGhlIGZpcnN0IGtub3duCi0gICAgIHRleHQgYWRkcmVzcy4gICovCi0KLSAgaWYgKGluZm8tPnNvX29mZnNldCAhPSAtMSkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBhZGRyLCBpbmZvLT5zeW1ib2xzICsgaW5mby0+c29fb2Zmc2V0ICsgOCk7Ci0gICAgICBpbmZvLT5zb19vZmZzZXQgPSAtMTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmZ1bl9vZmZzZXQgIT0gLTEpCi0gICAgewotICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgYWRkciwgaW5mby0+c3ltYm9scyArIGluZm8tPmZ1bl9vZmZzZXQgKyA4KTsKLSAgICAgIGluZm8tPmZ1bl9vZmZzZXQgPSAtMTsKLSAgICB9Ci0KLSAgKytpbmZvLT5uZXN0aW5nOwotCi0gIC8qIFdlIHdpbGwgYmUgY2FsbGVkIHdpdGggYSB0b3AgbGV2ZWwgYmxvY2sgc3Vycm91bmRpbmcgdGhlCi0gICAgIGZ1bmN0aW9uLCBidXQgc3RhYnMgaW5mb3JtYXRpb24gZG9lcyBub3Qgb3V0cHV0IHRoYXQgYmxvY2ssIHNvIHdlCi0gICAgIGlnbm9yZSBpdC4gICovCi0KLSAgaWYgKGluZm8tPm5lc3RpbmcgPT0gMSkKLSAgICB7Ci0gICAgICBpbmZvLT5mbmFkZHIgPSBhZGRyOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gb3V0cHV0IHRoZSBMQlJBQyBzeW1ib2wgYWZ0ZXIgYW55IHZhcmlhYmxlcyB3aGljaCBhcmUKLSAgICAgZGVjbGFyZWQgaW5zaWRlIHRoZSBibG9jay4gIFdlIHBvc3Rwb25lIHRoZSBMQlJBQyB1bnRpbCB0aGUgbmV4dAotICAgICBzdGFydF9ibG9jayBvciBlbmRfYmxvY2suICAqLwotCi0gIC8qIElmIHdlIGhhdmUgcG9zdHBvbmVkIGFuIExCUkFDLCBvdXRwdXQgaXQgbm93LiAgKi8KLSAgaWYgKGluZm8tPnBlbmRpbmdfbGJyYWMgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xCUkFDLCAwLCBpbmZvLT5wZW5kaW5nX2xicmFjLAotCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUmVtZW1iZXIgdGhlIGFkZHJlc3MgYW5kIG91dHB1dCBpdCBsYXRlci4gICovCi0KLSAgaW5mby0+cGVuZGluZ19sYnJhYyA9IGFkZHIgLSBpbmZvLT5mbmFkZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgaWYgKGFkZHIgPiBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcykKLSAgICBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcyA9IGFkZHI7Ci0KLSAgLyogSWYgd2UgaGF2ZSBwb3N0cG9uZWQgYW4gTEJSQUMsIG91dHB1dCBpdCBub3cuICAqLwotICBpZiAoaW5mby0+cGVuZGluZ19sYnJhYyAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTEJSQUMsIDAsIGluZm8tPnBlbmRpbmdfbGJyYWMsCi0JCQkgICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+cGVuZGluZ19sYnJhYyA9IChiZmRfdm1hKSAtMTsKLSAgICB9Ci0KLSAgYXNzZXJ0IChpbmZvLT5uZXN0aW5nID4gMCk7Ci0KLSAgLS1pbmZvLT5uZXN0aW5nOwotCi0gIC8qIFdlIGlnbm9yZSB0aGUgb3V0ZXJtb3N0IGJsb2NrLiAgKi8KLSAgaWYgKGluZm8tPm5lc3RpbmcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fUkJSQUMsIDAsIGFkZHIgLSBpbmZvLT5mbmFkZHIsCi0JCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci19Ci0KLS8qIEVuZCBhIGZ1bmN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbmRfZnVuY3Rpb24gKHApCi0gICAgIFBUUiBwOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgbGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9saW5lbm8gKHAsIGZpbGUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGluZW5vOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmxpbmVub19maWxlbmFtZSAhPSBOVUxMKTsKLQotICBpZiAoYWRkciA+IGluZm8tPmxhc3RfdGV4dF9hZGRyZXNzKQotICAgIGluZm8tPmxhc3RfdGV4dF9hZGRyZXNzID0gYWRkcjsKLQotICBpZiAoc3RyY21wIChmaWxlLCBpbmZvLT5saW5lbm9fZmlsZW5hbWUpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fU09MLCAwLCBhZGRyLCBmaWxlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBmaWxlOwotICAgIH0KLQotICByZXR1cm4gc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fU0xJTkUsIGxpbmVubywgYWRkciAtIGluZm8tPmZuYWRkciwKLQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL2NvbmZpZy1tbC5pbiBiL2NvbmZpZy1tbC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZjdjZi4uMDAwMDAwMAotLS0gYS9jb25maWctbWwuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2ODcgKzAsMCBAQAotIyBDb25maWd1cmUgZnJhZ21lbnQgaW52b2tlZCBpbiB0aGUgcG9zdC10YXJnZXQgc2VjdGlvbiBmb3Igc3ViZGlycwotIyB3YW50aW5nIG11bHRpbGliIHN1cHBvcnQuCi0jCi0jIEl0IGlzIGFkdmlzYWJsZSB0byBzdXBwb3J0IGEgZmV3IC0tZW5hYmxlLy0tZGlzYWJsZSBvcHRpb25zIHRvIGxldCB0aGUKLSMgdXNlciBzZWxlY3Qgd2hpY2ggbGlicmFyaWVzIHMvaGUgcmVhbGx5IHdhbnRzLgotIwotIyBTdWJkaXJlY3RvcmllcyB3aXNoaW5nIHRvIHVzZSBtdWx0aWxpYiBzaG91bGQgcHV0IHRoZSBmb2xsb3dpbmcgbGluZXMKLSMgaW4gdGhlICJwb3N0LXRhcmdldCIgc2VjdGlvbiBvZiBjb25maWd1cmUuaW4uCi0jCi0jIGlmIFsgIiR7c3JjZGlyfSIgPSAiLiIgXSA7IHRoZW4KLSMgICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdIDsgdGhlbgotIyAgICAgLiAke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4vY29uZmlnLW1sLmluCi0jICAgZWxzZQotIyAgICAgLiAke3dpdGhfbXVsdGlzcmN0b3B9Li4vY29uZmlnLW1sLmluCi0jICAgZmkKLSMgZWxzZQotIyAgIC4gJHtzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbgotIyBmaQotIwotIyBTZWUgbGlicngvY29uZmlndXJlLmluIGluIHRoZSBsaWJnKysgZGlzdHJpYnV0aW9uIGZvciBhbiBleGFtcGxlIG9mIGhvdwotIyB0byBoYW5kbGUgYXV0b2NvbmYnZCBsaWJyYXJpZXMuCi0jCi0jIFRoaW5ncyBhcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSA2IHNlcGFyYXRlIGNhc2VzIG11c3QgYmUgaGFuZGxlZDoKLSMgMiAobmF0aXZlLCBjcm9zcykgeCAzIChhYnNvbHV0ZS1wYXRoLCByZWxhdGl2ZS1ub3QtZG90LCBkb3QpID0gNi4KLSMKLSMgc3JjZGlyPS4gaXMgc3BlY2lhbC4gIEl0IG11c3QgaGFuZGxlIG1ha2UgcHJvZ3JhbXMgdGhhdCBkb24ndCBoYW5kbGUgVlBBVEguCi0jIFRvIGltcGxlbWVudCB0aGlzLCBhIHN5bWxpbmsgdHJlZSBpcyBidWlsdCBmb3IgZWFjaCBsaWJyYXJ5IGFuZCBmb3IgZWFjaAotIyBtdWx0aWxpYiBzdWJkaXIuCi0jCi0jIFRoZSBidWlsZCB0cmVlIGlzIGxheWVkIG91dCBhcwotIwotIyAuLwotIyAgIGxpYmcrKwotIyAgIG5ld2xpYgotIyAgIG02ODAyMC8KLSMgICAgICAgICAgbGliZysrCi0jICAgICAgICAgIG5ld2xpYgotIyAgICAgICAgICBtNjg4ODEvCi0jICAgICAgICAgICAgICAgICBsaWJnKysKLSMgICAgICAgICAgICAgICAgIG5ld2xpYgotIwotIyBUaGUgbmljZSBmZWF0dXJlIGFib3V0IHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCBpbnRlci1saWJyYXJ5IHJlZmVyZW5jZXMKLSMgaW4gdGhlIGJ1aWxkIHRyZWUgd29yayB3aXRob3V0IGhhdmluZyB0byBjYXJlIHdoZXJlIHlvdSBhcmUuICBOb3RlIHRoYXQKLSMgaW50ZXItbGlicmFyeSByZWZlcmVuY2VzIGFsc28gd29yayBpbiB0aGUgc291cmNlIHRyZWUgYmVjYXVzZSBzeW1saW5rIHRyZWVzCi0jIGFyZSBidWlsdCB3aGVuIHNyY2Rpcj0uCi0jCi0jIFVuZm9ydHVuYXRlbHksIHRyeWluZyB0byBhY2Nlc3MgdGhlIGxpYnJhcmllcyBpbiB0aGUgYnVpbGQgdHJlZSByZXF1aXJlcwotIyB0aGUgdXNlciB0byBtYW51YWxseSBjaG9vc2Ugd2hpY2ggbGlicmFyeSB0byB1c2UgYXMgR0NDIHdvbid0IGJlIGFibGUgdG8KLSMgZmluZCB0aGUgcmlnaHQgb25lLiAgVGhpcyBpcyB2aWV3ZWQgYXMgdGhlIGxlc3NlciBvZiB0d28gZXZpbHMuCi0jCi0jIENvbmZpZ3VyZSB2YXJpYWJsZXM6Ci0jICR7d2l0aF90YXJnZXRfc3ViZGlyfSA9ICIuIiBmb3IgbmF0aXZlLCBvciAke3RhcmdldF9hbGlhc30gZm9yIGNyb3NzLgotIyBTZXQgYnkgdG9wIGxldmVsIE1ha2VmaWxlLgotIyAke3dpdGhfbXVsdGlzcmN0b3B9ID0gaG93IG1hbnkgbGV2ZWxzIG9mIG11bHRpbGlicyB0aGVyZSBhcmUgaW4gdGhlIHNvdXJjZQotIyB0cmVlLiAgSXQgZXhpc3RzIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBjb25maWd1cmluZyBpbiB0aGUgc291cmNlIHRyZWU6Ci0jICR7c3JjZGlyfSBpcyBub3QgY29uc3RhbnQuCi0jICR7d2l0aF9tdWx0aXN1YmRpcn0gPSBuYW1lIG9mIG11bHRpbGliIHN1YmRpcmVjdG9yeSAoZWc6IG02ODAyMC9tNjg4ODEpLgotIwotIyBNYWtlZmlsZSB2YXJpYWJsZXM6Ci0jIE1VTFRJU1JDVE9QID0gbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiBzb3VyY2UgdHJlZSAoKzEgaWYgY3Jvc3MpCi0jIChGSVhNRTogbm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gJHt3aXRoX211bHRpc3JjdG9wfS4gIENoZWNrIG91dC4pLgotIyBNVUxUSUJVSUxEVE9QID0gbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiBidWlsZCB0cmVlCi0jIE1VTFRJRElSUyA9IGxpc3Qgb2YgbXVsdGlsaWIgc3ViZGlycyAoZWc6IG02ODAwMCBtNjgwMjAgLi4uKQotIyAob25seSBkZWZpbmVkIGluIGVhY2ggbGlicmFyeSdzIG1haW4gTWFrZWZpbGUpLgotIyBNVUxUSVNVQkRJUiA9IGluc3RhbGxlZCBzdWJkaXJlY3RvcnkgbmFtZSB3aXRoIGxlYWRpbmcgJy8nIChlZzogL202ODAwMCkKLSMgKG9ubHkgZGVmaW5lZCBpbiBlYWNoIG11bHRpbGliIHN1YmRpcikuCi0KLSMgRklYTUU6IE11bHRpbGliIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBieSBkZWZhdWx0IGZvciBldmVyeXRoaW5nIG90aGVyIHRoYW4KLSMgbmV3bGliLiAgSXQgaXMgdXAgdG8gZWFjaCB0YXJnZXQgdG8gdHVybiBvbiBtdWx0aWxpYiBzdXBwb3J0IGZvciB0aGUgb3RoZXIKLSMgbGlicmFyaWVzIGFzIGRlc2lyZWQuCi0KLSMgV2UgaGF2ZSB0byBoYW5kbGUgYmVpbmcgaW52b2tlZCBieSBib3RoIEN5Z251cyBjb25maWd1cmUgYW5kIEF1dG9jb25mLgotIwotIyBDeWdudXMgY29uZmlndXJlIGluY29taW5nIHZhcmlhYmxlczoKLSMgc3JjZGlyLCBzdWJkaXIsIGhvc3QsIGFyZ3VtZW50cwotIwotIyBBdXRvY29uZiBpbmNvbWluZyB2YXJpYWJsZXM6Ci0jIHNyY2RpciwgaG9zdCwgYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgV2UgKmNvdWxkKiBmaWd1cmUgc3JjZGlyIGFuZCBob3N0IG91dCwgYnV0IHdlJ2QgaGF2ZSB0byBkbyB3b3JrIHRoYXQKLSMgb3VyIGNhbGxlciBoYXMgYWxyZWFkeSBkb25lIHRvIGZpZ3VyZSB0aGVtIG91dCBhbmQgcmVxdWlyaW5nIHRoZXNlIHR3bwotIyBzZWVtcyByZWFzb25hYmxlLgotIyBOb3RlIHRoYXQgYGhvc3QnIGluIHRoaXMgY2FzZSBpcyBHQ0MncyBgdGFyZ2V0Jy4gIFRhcmdldCBsaWJyYXJpZXMgYXJlCi0jIGNvbmZpZ3VyZWQgZm9yIGEgcGFydGljdWxhciBob3N0LgotCi1pZiBbIC1uICIke2FjX2NvbmZpZ3VyZV9hcmdzfSIgXTsgdGhlbgotICBNYWtlZmlsZT0ke2FjX2ZpbGUtTWFrZWZpbGV9Ci0gIG1sX2NvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotICBtbF9hcmd1bWVudHM9IiR7YWNfY29uZmlndXJlX2FyZ3N9IgotICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfQotZWxzZQotICBNYWtlZmlsZT0ke01ha2VmaWxlLU1ha2VmaWxlfQotICBtbF9jb25maWdfc2hlbGw9JHtjb25maWdfc2hlbGwtL2Jpbi9zaH0KLSAgbWxfYXJndW1lbnRzPSIke2FyZ3VtZW50c30iCi0gIGlmIFsgLW4gIiR7c3ViZGlyfSIgLWEgIiR7c3ViZGlyfSIgIT0gIi4iIF0gOyB0aGVuCi0gICAgbWxfcmVhbHNyY2Rpcj0ke3NyY2Rpcn0vJHtzdWJkaXJ9Ci0gIGVsc2UKLSAgICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfQotICBmaQotZmkKLQotIyBTY2FuIGFsbCB0aGUgYXJndW1lbnRzIGFuZCBzZXQgYWxsIHRoZSBvbmVzIHdlIG5lZWQuCi0KLW1sX3ZlcmJvc2U9LS12ZXJib3NlCi1mb3Igb3B0aW9uIGluICR7bWxfYXJndW1lbnRzfQotZG8KLSAgY2FzZSAkb3B0aW9uIGluCi0gIC0tKikgOzsKLSAgLSopIG9wdGlvbj0tJG9wdGlvbiA7OwotICBlc2FjCi0KLSAgY2FzZSAkb3B0aW9uIGluCi0gIC0tKj0qKQotCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCi0JOzsKLSAgZXNhYwotCi0gIGNhc2UgJG9wdGlvbiBpbgotICAtLWRpc2FibGUtKikKLQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLWRpc2FibGUtOmVuYWJsZV86O3M6LTpfOmcnYAotCWV2YWwgJGVuYWJsZW9wdD1ubwotCTs7Ci0gIC0tZW5hYmxlLSopCi0JY2FzZSAiJG9wdGlvbiIgaW4KLQkqPSopCTs7Ci0JKikJb3B0YXJnPXllcyA7OwotCWVzYWMKLQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCWV2YWwgJGVuYWJsZW9wdD0iJG9wdGFyZyIKLQk7OwotICAtLW5vcmVjdXJzaW9uIHwgLS1ubyopCi0JbWxfbm9yZWN1cnNpb249eWVzCi0JOzsKLSAgLS1zaWxlbnQgfCAtLXNpbCogfCAtLXF1aWV0IHwgLS1xKikKLQltbF92ZXJib3NlPS0tc2lsZW50Ci0JOzsKLSAgLS12ZXJib3NlIHwgLS12IHwgLS12ZXJiKikKLQltbF92ZXJib3NlPS0tdmVyYm9zZQotCTs7Ci0gIC0td2l0aC0qKQotCWNhc2UgIiRvcHRpb24iIGluCi0JKj0qKQk7OwotCSopCW9wdGFyZz15ZXMgOzsKLQllc2FjCi0Jd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JZXZhbCAkd2l0aG9wdD0iJG9wdGFyZyIKLQk7OwotICAtLXdpdGhvdXQtKikKLQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOm91dDo6O3M6LTpfOmcnYAotCWV2YWwgJHdpdGhvcHQ9bm8KLQk7OwotICBlc2FjCi1kb25lCi0KLSMgT25seSBkbyB0aGlzIGlmIC0tZW5hYmxlLW11bHRpbGliLgotaWYgWyAiJHtlbmFibGVfbXVsdGlsaWJ9IiA9IHllcyBdOyB0aGVuCi0KLSMgQ29tcHV0ZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwgZGlyZWN0b3J5Ci0jIChpZTogbm90IGEgbXVsdGlsaWIgc3ViZGlyZWN0b3J5LCBhbmQgbm90IGEgc3ViZGlyZWN0b3J5IGxpa2UgbGliZysrL3NyYykuCi0jICR7d2l0aF9tdWx0aXN1YmRpcn0gdGVsbHMgdXMgd2UncmUgaW4gdGhlIHJpZ2h0IGJyYW5jaCwgYnV0IHdlIGNvdWxkIGJlCi0jIGluIGEgc3ViZGlyIG9mIHRoYXQuCi0jID8/PyBUaGUgcHJldmlvdXMgdmVyc2lvbiBjb3VsZCB2b2lkIHRoaXMgdGVzdCBieSBzZXBhcmF0aW5nIHRoZSBwcm9jZXNzIGludG8KLSMgdHdvIGZpbGVzOiBvbmUgdGhhdCBvbmx5IHRoZSBsaWJyYXJ5J3MgdG9wbGV2ZWwgY29uZmlndXJlLmluIHJhbiAodG8KLSMgY29uZmlndXJlIHRoZSBtdWx0aWxpYiBzdWJkaXJzKSwgYW5kIGFub3RoZXIgdGhhdCBhbGwgY29uZmlndXJlLmluJ3MgcmFuIHRvCi0jIHVwZGF0ZSB0aGUgTWFrZWZpbGUuICBJdCBzZWVtZWQgcmVhc29uYWJsZSB0byBjb2xsYXBzZSBhbGwgbXVsdGlsaWIgc3VwcG9ydAotIyBpbnRvIG9uZSBmaWxlLCBidXQgaXQgZG9lcyBsZWF2ZSB1cyB3aXRoIGhhdmluZyB0byBwZXJmb3JtIHRoaXMgdGVzdC4KLW1sX3RvcGxldmVsX3A9bm8KLWlmIFsgLXogIiR7d2l0aF9tdWx0aXN1YmRpcn0iIF07IHRoZW4KLSAgaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gICAgIyBVc2UgJHttbF9yZWFsc3JjZGlyfSBpbnN0ZWFkIG9mICR7c3JjZGlyfSBoZXJlIHRvIGFjY291bnQgZm9yICR7c3ViZGlyfS4KLSAgICAjICR7d2l0aF90YXJnZXRfc3ViZGlyfSA9ICIuIiBmb3IgbmF0aXZlLCBvdGhlcndpc2UgdGFyZ2V0IGFsaWFzLgotICAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgPSAiLiIgXTsgdGhlbgotICAgICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCi0JbWxfdG9wbGV2ZWxfcD15ZXMKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uLy4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCi0JbWxfdG9wbGV2ZWxfcD15ZXMKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgICMgVXNlICR7bWxfcmVhbHNyY2Rpcn0gaW5zdGVhZCBvZiAke3NyY2Rpcn0gaGVyZSB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0gICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCi0gICAgICBtbF90b3BsZXZlbF9wPXllcwotICAgIGZpCi0gIGZpCi1maQotCi0jIElmIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwgZGlyZWN0b3J5LCBzZXQgbXVsdGlkaXJzIHRvIHRoZQotIyBtdWx0aWxpYiBzdWJkaXJzIHRvIHN1cHBvcnQuICBUaGlzIGxpdmVzIGF0IHRoZSB0b3AgYmVjYXVzZSB3ZSBuZWVkCi0jIGBtdWx0aWRpcnMnIHNldCByaWdodCBhd2F5LgotCi1pZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0KLW11bHRpZGlycz0KLWZvciBpIGluIGAke0NDLWdjY30gLS1wcmludC1tdWx0aS1saWIgMj4vZGV2L251bGxgOyBkbwotICBkaXI9YGVjaG8gJGkgfCBzZWQgLWUgJ3MvOy4qJC8vJ2AKLSAgaWYgWyAiJHtkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gICAgdHJ1ZQotICBlbHNlCi0gICAgaWYgWyAteiAiJHttdWx0aWRpcnN9IiBdOyB0aGVuCi0gICAgICBtdWx0aWRpcnM9IiR7ZGlyfSIKLSAgICBlbHNlCi0gICAgICBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke2Rpcn0iCi0gICAgZmkKLSAgZmkKLWRvbmUKLQotIyBUYXJnZXQgbGlicmFyaWVzIGFyZSBjb25maWd1cmVkIGZvciB0aGUgaG9zdCB0aGV5IHJ1biBvbiwgc28gd2UgY2hlY2sKLSMgJGhvc3QgaGVyZSwgbm90ICR0YXJnZXQuCi0KLWNhc2UgIiR7aG9zdH0iIGluCi1hcmMtKi1lbGYqKQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gIT0geHllcyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqYmUqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLWFybS0qLSopCi0JaWYgWyB4IiRlbmFibGVfZnB1IiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqZnB1KikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCIkZW5hYmxlXzI2Yml0IiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqMjZiaXQqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4IiRlbmFibGVfdW5kZXJzY29yZSIgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKnVuZGVyKikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCIkZW5hYmxlX2ludGVyd29yayIgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKmludGVyd29yayopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpsZSogKSA6IDs7Ci0JICAgICAgKmJlKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotbTY4Ki0qLSopCi0JaWYgWyB4JGVuYWJsZV9zb2Z0ZmxvYXQgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnNvZnQtZmxvYXQqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfbTY4ODgxID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptNjg4ODEqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfbTY4MDAwID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptNjgwMDAqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfbTY4MDIwID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptNjgwMjAqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1taXBzKi0qLSopCi0JaWYgWyB4JGVuYWJsZV9zaW5nbGVfZmxvYXQgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnNpbmdsZSogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqZWwqICkgOiA7OwotCSAgICAgICplYiogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9zb2Z0ZmxvYXQgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnNvZnQtZmxvYXQqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1wb3dlcnBjKi0qLSogfCByczYwMDAqLSotKikKLQlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9wb3dlcmNwdSA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICBwb3dlciB8ICovcG93ZXIgfCAqL3Bvd2VyLyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9wb3dlcnBjY3B1ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpwb3dlcnBjKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3Bvd2VycGNvcyA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWNhbGwtbGludXgqIHwgKm1jYWxsLXNvbGFyaXMqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm1saXR0bGUqIHwgKm1iaWcqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfc3lzdiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWNhbGwtc3lzdiogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9haXggPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm1jYWxsLWFpeCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLWVzYWMKLQotIyBSZW1vdmUgZXh0cmFuZW91cyBibGFua3MgZnJvbSBtdWx0aWRpcnMuCi0jIFRlc3RzIGxpa2UgYGlmIFsgLW4gIiRtdWx0aWRpcnMiIF0nIHJlcXVpcmUgaXQuCi1tdWx0aWRpcnM9YGVjaG8gIiRtdWx0aWRpcnMiIHwgc2VkIC1lICdzL15bIF1bIF0qLy8nIC1lICdzL1sgXVsgXSokLy8nIC1lICdzL1sgXVsgXSovIC9nJ2AKLQotIyBBZGQgY29kZSB0byBsaWJyYXJ5J3MgdG9wIGxldmVsIG1ha2VmaWxlIHRvIGhhbmRsZSBidWlsZGluZyB0aGUgbXVsdGlsaWIKLSMgc3ViZGlycy4KLQotY2F0ID4gTXVsdGkudGVtIDw8XEVPRgotCi0jIEZJWE1FOiBUaGVyZSBzaG91bGQgYmUgYW4gQC1zaWduIGluIGZyb250IG9mIHRoZSBgaWYnLgotIyBMZWF2ZSBvdXQgdW50aWwgdGhpcyBpcyB0ZXN0ZWQgYSBiaXQgbW9yZS4KLW11bHRpLWRvOgotCWlmIFsgLXogIiQoTVVMVElESVJTKSIgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICByb290cHJlPWBwd2RgLzsgZXhwb3J0IHJvb3RwcmU7IFwKLQkgIHNyY3Jvb3RwcmU9YGNkICQoc3JjZGlyKTsgcHdkYC87IGV4cG9ydCBzcmNyb290cHJlOyBcCi0JICBsaWI9YGVjaG8gJCR7cm9vdHByZX0gfCBzZWQgLWUgJ3MsXi4qL1woW14vXVteL10qXCkvJCQsXDEsJ2A7IFwKLQkgIGNvbXBpbGVyPSIkKENDKSI7IFwKLQkgIGZvciBpIGluIGAkJHtjb21waWxlcn0gLS1wcmludC1tdWx0aS1saWIgMj4vZGV2L251bGxgOyBkbyBcCi0JICAgIGRpcj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvOy4qJCQvLydgOyBcCi0JICAgIGlmIFsgIiQke2Rpcn0iID0gIi4iIF07IHRoZW4gXAotCSAgICAgIHRydWU7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgaWYgWyAtZCAuLi8kJHtkaXJ9LyQke2xpYn0gXTsgdGhlbiBcCi0JCWZsYWdzPWBlY2hvICQkaSB8IHNlZCAtZSAncy9eW147XSo7Ly8nIC1lICdzL0AvIC0vZydgOyBcCi0JCWlmIChjZCAuLi8kJHtkaXJ9LyQke2xpYn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBcCi0JCQkJQ0ZMQUdTPSIkKENGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJQ1hYRkxBR1M9IiQoQ1hYRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUxJQkNGTEFHUz0iJChMSUJDRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUxJQkNYWEZMQUdTPSIkKExJQkNYWEZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlMREZMQUdTPSIkKExERkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCSQoRE8pKTsgdGhlbiBcCi0JCSAgdHJ1ZTsgXAotCQllbHNlIFwKLQkJICBleGl0IDE7IFwKLQkJZmk7IFwKLQkgICAgICBlbHNlIHRydWU7IFwKLQkgICAgICBmaTsgXAotCSAgICBmaTsgXAotCSAgZG9uZTsgXAotCWZpCi0KLSMgRklYTUU6IFRoZXJlIHNob3VsZCBiZSBhbiBALXNpZ24gaW4gZnJvbnQgb2YgdGhlIGBpZicuCi0jIExlYXZlIG91dCB1bnRpbCB0aGlzIGlzIHRlc3RlZCBhIGJpdCBtb3JlLgotbXVsdGktY2xlYW46Ci0JaWYgWyAteiAiJChNVUxUSURJUlMpIiBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbHNlIFwKLQkgIGxpYj1gcHdkIHwgc2VkIC1lICdzLF4uKi9cKFteL11bXi9dKlwpJCQsXDEsJ2A7IFwKLQkgIGZvciBkaXIgaW4gTWFrZWZpbGUgJChNVUxUSURJUlMpOyBkbyBcCi0JICAgIGlmIFsgLWYgLi4vJCR7ZGlyfS8kJHtsaWJ9L01ha2VmaWxlIF07IHRoZW4gXAotCSAgICAgIGlmIChjZCAuLi8kJHtkaXJ9LyQke2xpYn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkKERPKSk7IFwKLQkgICAgICB0aGVuIHRydWU7IFwKLQkgICAgICBlbHNlIGV4aXQgMTsgXAotCSAgICAgIGZpOyBcCi0JICAgIGVsc2UgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZG9uZTsgXAotCWZpCi1FT0YKLQotY2F0ICR7TWFrZWZpbGV9IE11bHRpLnRlbSA+IE1ha2VmaWxlLnRlbQotcm0gLWYgJHtNYWtlZmlsZX0gTXVsdGkudGVtCi1tdiBNYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KLQotZmkgIyAke21sX3RvcGxldmVsX3B9ID0geWVzCi0KLWlmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KLSAgZWNobyAiQWRkaW5nIG11bHRpbGliIHN1cHBvcnQgdG8gTWFrZWZpbGUgaW4gJHttbF9yZWFsc3JjZGlyfSIKLSAgaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotICAgIGVjaG8gIm11bHRpZGlycz0ke211bHRpZGlyc30iCi0gIGZpCi0gIGVjaG8gIndpdGhfbXVsdGlzdWJkaXI9JHt3aXRoX211bHRpc3ViZGlyfSIKLWZpCi0KLWlmIFsgIiR7c3JjZGlyfSIgPSAiLiIgXTsgdGhlbgotICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdOyB0aGVuCi0gICAgbWxfc3JjZG90ZG90PSIuLi8iCi0gIGVsc2UKLSAgICBtbF9zcmNkb3Rkb3Q9IiIKLSAgZmkKLWVsc2UKLSAgbWxfc3JjZG90ZG90PSIiCi1maQotCi1pZiBbIC16ICIke3dpdGhfbXVsdGlzdWJkaXJ9IiBdOyB0aGVuCi0gIG1sX3N1YmRpcj0KLSAgbWxfYnVpbGRkb3Rkb3Q9Ci0gIDogIyBtbF9zcmNkb3Rkb3Q9ICMgYWxyZWFkeSBzZXQKLWVsc2UKLSAgbWxfc3ViZGlyPSIvJHt3aXRoX211bHRpc3ViZGlyfSIKLSAgIyBUaGUgJ1teL11bXi9dKicgYXBwZWFycyB0aGF0IHdheSB0byB3b3JrIGFyb3VuZCBhIFN1bk9TIHNlZCBidWcuCi0gIG1sX2J1aWxkZG90ZG90PWBlY2hvICR7d2l0aF9tdWx0aXN1YmRpcn0gfCBzZWQgLWUgJ3M6W14vXVteL10qOi4uOmcnYC8KLSAgaWYgWyAiJHNyY2RpciIgPSAiLiIgXTsgdGhlbgotICAgIG1sX3NyY2RvdGRvdD0ke21sX3NyY2RvdGRvdH0ke21sX2J1aWxkZG90ZG90fQotICBlbHNlCi0gICAgOiAjIG1sX3NyY2RvdGRvdD0gIyBhbHJlYWR5IHNldAotICBmaQotZmkKLQotaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotICBtbF9kbz0nJChNQUtFKScKLSAgbWxfY2xlYW49JyQoTUFLRSknCi1lbHNlCi0gIG1sX2RvPXRydWUKLSAgbWxfY2xlYW49dHJ1ZQotZmkKLQotIyBUT1AgaXMgdXNlZCBieSBuZXdsaWIgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBlbHNld2hlcmUgZm9yIHRoaXMgcHVycG9zZS4KLSMgTVVMVEl7U1JDLEJVSUxEfVRPUCBhcmUgdGhlIHByb3BlciBvbmVzIHRvIHVzZS4gIE1VTFRJU1JDVE9QIGlzIGVtcHR5Ci0jIHdoZW4gc3JjZGlyICE9IGJ1aWxkZGlyLiAgTVVMVElCVUlMRFRPUCBpcyBhbHdheXMgc29tZSBudW1iZXIgb2YgLi4vJ3MuCi0jIEZJWE1FOiBuZXdsaWIgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byB1c2UgTVVMVEl7U1JDLEJVSUxEfVRPUCBzbyB3ZSBjYW4KLSMgZGVsZXRlIFRPUC4gIE5ld2xpYiBtYXkgd2lzaCB0byBjb250aW51ZSB0byB1c2UgVE9QIGZvciBpdHMgb3duIHB1cnBvc2VzCi0jIG9mIGNvdXJzZS4KLSMgTVVMVElESVJTIGlzIG5vbi1lbXB0eSBmb3IgdGhlIGNwdSB0b3AgbGV2ZWwgTWFrZWZpbGUgKGVnOiBuZXdsaWIvTWFrZWZpbGUpCi0jIGFuZCBsaXN0cyB0aGUgc3ViZGlyZWN0b3JpZXMgdG8gcmVjdXJzZSBpbnRvLgotIyBNVUxUSVNVQkRJUiBpcyBub24tZW1wdHkgaW4gZWFjaCBjcHUgc3ViZGlyZWN0b3J5J3MgTWFrZWZpbGUKLSMgKGVnOiBuZXdsaWIvaDgzMDBoL01ha2VmaWxlKSBhbmQgaXMgdGhlIGluc3RhbGxlZCBzdWJkaXJlY3RvcnkgbmFtZSB3aXRoCi0jIGEgbGVhZGluZyAnLycuCi0jIE1VTFRJRE8gaXMgdXNlZCBmb3IgdGFyZ2V0cyBsaWtlIGFsbCwgaW5zdGFsbCwgYW5kIGNoZWNrIHdoZXJlCi0jICQoRkxBR1NfVE9fUEFTUykgYXVnbWVudGVkIHdpdGggdGhlIHN1YmRpcidzIGNvbXBpbGVyIG9wdGlvbiBpcyBuZWVkZWQuCi0jIE1VTFRJQ0xFQU4gaXMgdXNlZCBmb3IgdGhlICpjbGVhbiB0YXJnZXRzLgotIwotIyA/Pz8gSXQgaXMgcG9zc2libGUgdG8gbWVyZ2UgTVVMVElETyBhbmQgTVVMVElDTEVBTiBpbnRvIG9uZS4gIFRoZXkgYXJlCi0jIGN1cnJlbnRseSBrZXB0IHNlcGFyYXRlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgKmNsZWFuIHRhcmdldHMgdG8gcmVxdWlyZQotIyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjb21waWxlciAod2hpY2ggTVVMVElETyBjdXJyZW50bHkgcmVxdWlyZXMpIGFuZAotIyB0aGVyZWZvcmUgd2UnZCBoYXZlIHRvIHJlY29yZCB0aGUgZGlyZWN0b3J5IG9wdGlvbnMgYXMgd2VsbCBhcyBuYW1lcwotIyAoY3VycmVudGx5IHdlIGp1c3QgcmVjb3JkIHRoZSBuYW1lcyBhbmQgdXNlIC0tcHJpbnQtbXVsdGktbGliIHRvIGdldCB0aGUKLSMgb3B0aW9ucykuCi0KLXNlZCAtZSAiczpeVE9QWyAJXSo9WyAJXSpcKFsuL10qXClbIAldKiQ6VE9QID0gJHttbF9idWlsZGRvdGRvdH1cMToiIFwKLSAgICAtZSAiczpeTVVMVElTUkNUT1BbIAldKj0uKiQ6TVVMVElTUkNUT1AgPSAke21sX3NyY2RvdGRvdH06IiBcCi0gICAgLWUgInM6Xk1VTFRJQlVJTERUT1BbIAldKj0uKiQ6TVVMVElCVUlMRFRPUCA9ICR7bWxfYnVpbGRkb3Rkb3R9OiIgXAotICAgIC1lICJzOl5NVUxUSURJUlNbIAldKj0uKiQ6TVVMVElESVJTID0gJHttdWx0aWRpcnN9OiIgXAotICAgIC1lICJzOl5NVUxUSVNVQkRJUlsgCV0qPS4qJDpNVUxUSVNVQkRJUiA9ICR7bWxfc3ViZGlyfToiIFwKLSAgICAtZSAiczpeTVVMVElET1sgCV0qPS4qJDpNVUxUSURPID0gJG1sX2RvOiIgXAotICAgIC1lICJzOl5NVUxUSUNMRUFOWyAJXSo9LiokOk1VTFRJQ0xFQU4gPSAkbWxfY2xlYW46IiBcCi0JJHtNYWtlZmlsZX0gPiBNYWtlZmlsZS50ZW0KLXJtIC1mICR7TWFrZWZpbGV9Ci1tdiBNYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KLQotIyBJZiB0aGlzIGlzIHRoZSBsaWJyYXJ5J3MgdG9wIGxldmVsLCBjb25maWd1cmUgZWFjaCBtdWx0aWxpYiBzdWJkaXIuCi0jIFRoaXMgaXMgZG9uZSBhdCB0aGUgZW5kIGJlY2F1c2UgdGhpcyBpcyB0aGUgbG9vcCB0aGF0IHJ1bnMgY29uZmlndXJlCi0jIGluIGVhY2ggbXVsdGlsaWIgc3ViZGlyIGFuZCBpdCBzZWVtZWQgcmVhc29uYWJsZSB0byBmaW5pc2ggdXBkYXRpbmcgdGhlCi0jIE1ha2VmaWxlIGJlZm9yZSBnb2luZyBvbiB0byBjb25maWd1cmUgdGhlIHN1YmRpcnMuCi0KLWlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLQotIyBXZSBtdXN0IGZyZXNobHkgY29uZmlndXJlIGVhY2ggc3ViZGlyZWN0b3J5LiAgVGhpcyBiaXQgb2YgY29kZSBpcwotIyBhY3R1YWxseSBwYXJ0aWFsbHkgc3RvbGVuIGZyb20gdGhlIG1haW4gY29uZmlndXJlIHNjcmlwdC4gIEZJWE1FLgotCi1pZiBbIC1uICIke211bHRpZGlyc30iIF0gJiYgWyAteiAiJHttbF9ub3JlY3Vyc2lvbn0iIF07IHRoZW4KLQotICBpZiBbICIke21sX3ZlcmJvc2V9IiA9IC0tdmVyYm9zZSBdOyB0aGVuCi0gICAgZWNobyAiUnVubmluZyBjb25maWd1cmUgaW4gbXVsdGlsaWIgc3ViZGlycyAke211bHRpZGlyc30iCi0gICAgZWNobyAicHdkOiBgcHdkYCIKLSAgZmkKLQotICBtbF9vcmlnZGlyPWBwd2RgCi0gIG1sX2xpYmRpcj1gZWNobyAkbWxfb3JpZ2RpciB8IHNlZCAtZSAncyxeLiovLCwnYAotICAjIGNkIHRvIHRvcC1sZXZlbC1idWlsZC1kaXIvJHt3aXRoX3RhcmdldF9zdWJkaXJ9Ci0gIGNkIC4uCi0KLSAgZm9yIG1sX2RpciBpbiAke211bHRpZGlyc307IGRvCi0KLSAgICBpZiBbICIke21sX3ZlcmJvc2V9IiA9IC0tdmVyYm9zZSBdOyB0aGVuCi0gICAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZSBpbiBtdWx0aWxpYiBzdWJkaXIgJHttbF9kaXJ9IgotICAgICAgZWNobyAicHdkOiBgcHdkYCIKLSAgICBmaQotCi0gICAgaWYgWyAtZCAke21sX2Rpcn0gXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyICR7bWxfZGlyfTsgZmkKLSAgICBpZiBbIC1kICR7bWxfZGlyfS8ke21sX2xpYmRpcn0gXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyICR7bWxfZGlyfS8ke21sX2xpYmRpcn07IGZpCi0KLSAgICAjIEVnOiBpZiAke21sX2Rpcn0gPSBtNjgwMDAvbTY4ODgxLCBkb3Rkb3QgPSAuLi8uLi8KLSAgICBkb3Rkb3Q9Li4vYGVjaG8gJHttbF9kaXJ9IHwgc2VkIC1lICdzfFteL118fGcnIC1lICdzfC98Li4vfGcnYAotCi0gICAgY2FzZSAke3NyY2Rpcn0gaW4KLSAgICAiLiIpCi0gICAgICBlY2hvIEJ1aWxkaW5nIHN5bWxpbmsgdHJlZSBpbiBgcHdkYC8ke21sX2Rpcn0vJHttbF9saWJkaXJ9Ci0gICAgICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdOyB0aGVuCi0JbWxfdW5zdWJkaXI9Ii4uLyIKLSAgICAgIGVsc2UKLQltbF91bnN1YmRpcj0iIgotICAgICAgZmkKLSAgICAgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OwotICAgICAgIC4uLyR7ZG90ZG90fSR7bWxfdW5zdWJkaXJ9c3ltbGluay10cmVlIC4uLyR7ZG90ZG90fSR7bWxfdW5zdWJkaXJ9JHttbF9saWJkaXJ9ICIiKQotICAgICAgaWYgWyAtZiAke21sX2Rpcn0vJHttbF9saWJkaXJ9L01ha2VmaWxlIF07IHRoZW4KLQlpZiBbIHgiJHtNQUtFfSIgPSB4IF07IHRoZW4KLQkgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyBtYWtlIGRpc3RjbGVhbikKLQllbHNlCi0JICAoY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgJHtNQUtFfSBkaXN0Y2xlYW4pCi0JZmkKLSAgICAgIGZpCi0gICAgICBtbF9uZXdzcmNkaXI9Ii4iCi0gICAgICBtbF9zcmNkaXJvcHRpb249Ci0gICAgICBtdWx0aXNyY3RvcD0ke2RvdGRvdH0KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgIC8qKSAjIGFic29sdXRlIHBhdGgKLSAgICAgICAgbWxfbmV3c3JjZGlyPSR7c3JjZGlyfQotICAgICAgICA7OwotICAgICAgKikgIyBvdGhlcndpc2UgcmVsYXRpdmUKLSAgICAgICAgbWxfbmV3c3JjZGlyPSR7ZG90ZG90fSR7c3JjZGlyfQotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgbWxfc3JjZGlyb3B0aW9uPSItc3JjZGlyPSR7bWxfbmV3c3JjZGlyfSIKLSAgICAgIG11bHRpc3JjdG9wPQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBjYXNlICIke3Byb2duYW1lfSIgaW4KLSAgICAvKikgICAgIG1sX3JlY3Byb2c9JHtwcm9nbmFtZX0gOzsKLSAgICAqKSAgICAgIG1sX3JlY3Byb2c9JHtkb3Rkb3R9JHtwcm9nbmFtZX0gOzsKLSAgICBlc2FjCi0KLSAgICAjIEZJWE1FOiBQT1BESVI9JHtQV0Q9YHB3ZGB9IGRvZXNuJ3Qgd29yayBoZXJlLgotICAgIE1MX1BPUERJUj1gcHdkYAotICAgIGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn0KLQotICAgIGlmIFsgLWYgJHttbF9uZXdzcmNkaXJ9L2NvbmZpZ3VyZSBdOyB0aGVuCi0gICAgICBtbF9yZWNwcm9nPSR7bWxfbmV3c3JjZGlyfS9jb25maWd1cmUKLSAgICBmaQotICAgIGlmIGV2YWwgJHttbF9jb25maWdfc2hlbGx9ICR7bWxfcmVjcHJvZ30gXAotCS0td2l0aC1tdWx0aXN1YmRpcj0ke21sX2Rpcn0gLS13aXRoLW11bHRpc3JjdG9wPSR7bXVsdGlzcmN0b3B9IFwKLQkke21sX2FyZ3VtZW50c30gJHttbF9zcmNkaXJvcHRpb259IDsgdGhlbgotICAgICAgdHJ1ZQotICAgIGVsc2UKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBjZCAke01MX1BPUERJUn0KLQotICBkb25lCi0KLSAgY2QgJHttbF9vcmlnZGlyfQotZmkKLQotZmkgIyAke21sX3RvcGxldmVsX3B9ID0geWVzCi1maSAjICR7ZW5hYmxlX211bHRpbGlifSA9IHllcwpkaWZmIC0tZ2l0IGEvY29uZmlnLmd1ZXNzIGIvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODVmNjYxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDEwMDggKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgV3JpdHRlbiBieSBQZXIgQm90aG5lciA8Ym90aG5lckBjeWdudXMuY29tPi4KLSMgVGhlIG1hc3RlciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpcyBhdCB0aGUgRlNGIGluIC9ob21lL2dkL2dudS9saWIuCi0jCi0jIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KLSMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCi0jIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgotIwotIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKLSMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBzeXN0ZW0gdHlwZSAoaG9zdC90YXJnZXQgbmFtZSkuCi0jCi0jIE9ubHkgYSBmZXcgc3lzdGVtcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBsaXN0OyBwbGVhc2UgYWRkIG90aGVycwotIyAoYnV0IHRyeSB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgY2xlYW4pLgotIwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDgvMjQvOTQuKQotaWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKLWZpCi0KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotdHJhcCAncm0gLWYgZHVtbXkuYyBkdW1teS5vIGR1bW15OyBleGl0IDEnIDEgMiAxNQotCi0jIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCi0KLWNhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KLSAgICBhbHBoYTpPU0YxOio6KikKLQlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JZmkKLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWNhdCA8PEVPRiA+ZHVtbXkucwotCS5nbG9ibCBtYWluCi0JLmVudCBtYWluCi1tYWluOgotCS5mcmFtZSBcJDMwLDAsXCQyNiwwCi0JLnByb2xvZ3VlIDAKLQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAotCWxkYSBcJDIsMjU5Ci0JLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0Jc3JsIFwkMSw4LFwkMgotCXNsbCBcJDIsMixcJDIKLQlzbGwgXCQwLDMsXCQwCi0JYWRkbCBcJDEsXCQwLFwkMAotCWFkZGwgXCQyLFwkMCxcJDAKLQlyZXQgXCQzMSwoXCQyNiksMQotCS5lbmQgbWFpbgotRU9GCi0JJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCS4vZHVtbXkKLQkJY2FzZSAiJD8iIGluCi0JCQk3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxNSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMTQpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkxNikKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQllc2FjCi0JZmkKLQlybSAtZiBkdW1teS5zIGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstY2JtLXN5c3Y0Ci0JZXhpdCAwOzsKLSAgICBhbWlnYTpOZXRCU0Q6KjoqKQotICAgICAgZWNobyBtNjhrLWNibS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0gICAgICBleGl0IDAgOzsKLSAgICBhbWlnYTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcwotCWV4aXQgMCA7OwotICAgIGFyYzY0Ok9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwczY0ZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaGttaXBzOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG1heDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc2dpOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgYXJtMzI6TmV0QlNEOio6KikKLQllY2hvIGFybS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqKQotCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDA7OwotICAgIFB5cmFtaWQqOk9TeCo6KjoqfE1JUyo6T1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIE5JTEU6KjoqOmRjb3N4KQotCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKLSAgICBzdW40SDpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKGhlYWQgLTEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCi0JdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MwotCWNhc2UgImAvYmluL2FyY2hgIiBpbgotCSAgICBzdW4zKQotCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCSAgICBzdW40KQotCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQllc2FjCi0JZXhpdCAwIDs7Ci0gICAgYXVzaHA6U3VuT1M6KjoqKQotCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXRhcmkqOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6TmV0QlNEOio6KikKLQllY2hvIG02OGstc3VuLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zKjpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqKQotCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+ZHVtbXkuYwotCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqKmFyZ3Y7IHsKLQkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2VuZGlmCi0JICBleGl0ICgtMSk7Ci0JfQotRU9GCi0JJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSBcCi0JICAmJiAuL2R1bW15IGBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgIFwKLQkgICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgZHVtbXkuYyBkdW1teQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azpDWC9VWDo3KjoqKQotCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDAgOzsKLSAgICBtODhrOio6NCo6UjQqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgMCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgQVZpaU9OOmRndXg6KjoqKQotICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAotICAgICAgICBpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIC1vICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0gOyB0aGVuCi0JaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXAotCSAgICAgLW8gJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdIDsgdGhlbgotCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGVsc2UgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGZpCi0gCWV4aXQgMCA7OwotICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCi0JZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKLQlleGl0IDAgOzsKLSAgICBNODgqOio6UjMqOiopCi0JIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMwotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgMCA7OwotICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQotCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQotCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgKjpJUklYKjoqOiopCi0JZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAotCWV4aXQgMCA7OwotICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KLQllY2hvIHJvbXAtaWJtLWFpeCAgICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKLQlleGl0IDAgOzsgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJwotICAgIGk/ODY6QUlYOio6KikKLQllY2hvIGkzODYtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgICo6QUlYOjI6MykKLQlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJc2VkICdzL14JCS8vJyA8PCBFT0YgPmR1bW15LmMKLQkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KLQotCQltYWluKCkKLQkJCXsKLQkJCWlmICghX19wb3dlcl9wYygpKQotCQkJCWV4aXQoMSk7Ci0JCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOwotCQkJZXhpdCgwKTsKLQkJCX0KLUVPRgotCQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQkJcm0gLWYgZHVtbXkuYyBkdW1teQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6NCkKLQlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FSGwgcHJvYzAgfCBncmVwIFBPV0VSID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj00LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIE5ldEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgICo5Pz8qOk1QRS9pWDoqOiopCi0JZWNobyBocHBhMS4wLWhwLW1wZWl4Ci0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQotCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OwotCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7Ci0JICAgIDkwMDAvWzY3OF1bMC05XVswLTldICkKLQotICAgICAgICAgICAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+ZHVtbXkuYwotICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYgCi0gICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KSAKLSAgICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOiAKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykgCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmIAotICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICBleGl0ICgwKTsKLSAgICAgICAgICAgICAgfQotRU9GCi0JKCR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgKSAmJiBIUF9BUkNIPWAuL2R1bW15YAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllc2FjCi0JSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIDMwNTAqOkhJLVVYOio6KikKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQlybSAtZiBkdW1teS5jIGR1bW15Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCi0JZWNobyBocHBhMS4xLWhwLW9zZgotCWV4aXQgMCA7OwotICAgIGhwOD8/Ok9TRjE6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBpPzg2Ok9TRjE6KjoqKQotCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCi0JZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCi0JZmkKLQlleGl0IDAgOzsKLSAgICBwYXJpc2MqOkxpdGVzKjoqOiopCi0JZWNobyBocHBhMS4xLWhwLWxpdGVzCi0JZXhpdCAwIDs7Ci0gICAgaHBwYSo6T3BlbkJTRDoqOiopCi0JZWNobyBocHBhLXVua25vd24tb3BlbmJzZAotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlgtTVA6KjoqOiopCi0JZWNobyB4bXAtY3JheS11bmljb3MKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpZLU1QOio6KjoqKQotCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIENSQVkqW0EtWl05MDoqOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKLQl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKLQkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LwotCWV4aXQgMCA7OwotICAgIENSQVkqVFM6KjoqOiopCi0JZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgQ1JBWS0yOio6KjoqKQotCWVjaG8gY3JheTItY3JheS11bmljb3MKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMDpVTklYX1N5c3RlbV9WOio6KikKLSAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICJmMzAwLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMTpVTklYX1N5c3RlbV9WOio6KikKLSAgICAgICBlY2hvIGYzMDEtZnVqaXRzdS11eHB2YGVjaG8gJFVOQU1FX1JFTEVBU0UgfCBzZWQgJ3MvIC4qLy8nYAotICAgICAgIGV4aXQgMCA7OwotICAgIGhwM1swLTldWzA1XTpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1ocC1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBpPzg2OkJTRC8zODY6KjoqIHwgKjpCU0QvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLQkgICAgaWYgdGVzdCAiZWxmIiA9ICJgL3Vzci9iaW4vb2JqZm9ybWF0YCI7IHRoZW4KLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGVsZmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi8vJ2AKLQkJZXhpdCAwCi0JICAgIGZpCi0JZmkKLSAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpOZXRCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgICo6T3BlbkJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3BlbmJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgIGkqOltDY11bWXldW0dnXVtXd11bSWldW05uXSo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luMzIKLQlleGl0IDAgOzsKLSAgICBpKjpNSU5HVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgotCWV4aXQgMCA7OwotICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQotICAgICAgICAjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiBnZW5lcmljIHBvc2l4IHN1YnN5c3RlbT8KLQkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQotCSMgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mCi0JIyBpMzg2PwotCWVjaG8gaTM4Ni1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgMCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbjMyCi0JZXhpdCAwIDs7Ci0gICAgcHJlcCo6U3VuT1M6NS4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgICo6R05VOio6KikKLQllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKLQlleGl0IDAgOzsKLSAgICAqOkxpbnV4Oio6KikKLQkjIHVuYW1lIG9uIHRoZSBBUk0gcHJvZHVjZXMgYWxsIHNvcnRzIG9mIHN0cmFuZ2VuZXNzLCBhbmQgd2UgbmVlZCB0bwotCSMgZmlsdGVyIGl0IG91dC4KLQljYXNlICIkVU5BTUVfTUFDSElORSIgaW4KLQkgIGFybXYqKQkJICAgICAgVU5BTUVfTUFDSElORT0kVU5BTUVfTUFDSElORSA7OwotCSAgYXJtKiB8IHNhMTEwKikJICAgICAgVU5BTUVfTUFDSElORT0iYXJtIiA7OwotCWVzYWMKLQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLgotCWxkX2hlbHBfc3RyaW5nPWBsZCAtLWhlbHAgMj4mMWAKLQlsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucz1gZWNobyAkbGRfaGVscF9zdHJpbmcgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCBlbXVsYXRpb25zOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCBlbXVsYXRpb25zOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF9lbXVsYXRpb25zIiBpbgotCSAgaT84NmxpbnV4KSAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IiAgICAgIDsgZXhpdCAwIDs7Ci0JICBpPzg2Y29mZikgICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiICAgICAgOyBleGl0IDAgOzsKLQkgIHNwYXJjbGludXgpIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OwotCSAgYXJtbGludXgpICAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7Ci0JICBtNjhrbGludXgpICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKLQkgIGVsZjMycHBjIHwgZWxmMzJwcGNsaW51eCkKLQkJIyBEZXRlcm1pbmUgTGliIFZlcnNpb24KLQkJY2F0ID5kdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykKLWV4dGVybiBjaGFyIF9fbGliY192ZXJzaW9uW107Ci1leHRlcm4gY2hhciBfX2xpYmNfcmVsZWFzZVtdOwotI2VuZGlmCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWYgZGVmaW5lZChfX0dMSUJDX18pCi0gIHByaW50ZigiJXMgJXNcbiIsIF9fbGliY192ZXJzaW9uLCBfX2xpYmNfcmVsZWFzZSk7Ci0jZWxzZQotICBwcmludGYoInVua293blxuIik7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLQkJTElCQz0iIgotCQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsCi0JCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkuL2R1bW15IHwgZ3JlcCAxXC45OSA+IC9kZXYvbnVsbAotCQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCQlMSUJDPSJsaWJjMSIKLQkJCWZpCi0JCWZpCQotCQlybSAtZiBkdW1teS5jIGR1bW15Ci0JCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJhbHBoYSIgOyB0aGVuCi0JCXNlZCAncy9eCS8vJyAgPDxFT0YgPmR1bW15LnMKLQkJLmdsb2JsIG1haW4KLQkJLmVudCBtYWluCi0JbWFpbjoKLQkJLmZyYW1lIFwkMzAsMCxcJDI2LDAKLQkJLnByb2xvZ3VlIDAKLQkJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKLQkJbGRhIFwkMiwyNTkKLQkJLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0JCXNybCBcJDEsOCxcJDIKLQkJc2xsIFwkMiwyLFwkMgotCQlzbGwgXCQwLDMsXCQwCi0JCWFkZGwgXCQxLFwkMCxcJDAKLQkJYWRkbCBcJDIsXCQwLFwkMAotCQlyZXQgXCQzMSwoXCQyNiksMQotCQkuZW5kIG1haW4KLUVPRgotCQlMSUJDPSIiCi0JCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKLQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCS4vZHVtbXkKLQkJCWNhc2UgIiQ/IiBpbgotCQkJNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKLQkJCQk7OwotCQkJMTUpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTE0KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKLQkJCQk7OwotCQkJMTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKLQkJCQk7OwotCQkJMTYpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCi0JCQkJOzsKLQkJCWVzYWMJCi0KLQkJCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgZHVtbXkgfCBcCi0JCQkgIGdyZXAgbGQuc28uMSA+IC9kZXYvbnVsbAotCQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCQlMSUJDPSJsaWJjMSIKLQkJCWZpCi0JCWZpCQotCQlybSAtZiBkdW1teS5zIGR1bW15Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAKLQllbGlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIm1pcHMiIDsgdGhlbgotCSAgY2F0ID5kdW1teS5jIDw8RU9GCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWZkZWYgX19NSVBTRUJfXwotICBwcmludGYgKCIlcy11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSNpZmRlZiBfX01JUFNFTF9fCi0gIHByaW50ZiAoIiVzZWwtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgIiR7VU5BTUVfTUFDSElORX0iICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0JICBybSAtZiBkdW1teS5jIGR1bW15Ci0JZWxzZQotCSAgIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpCi0JICAjIG9yIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkgICMgR0NDIHdhbnRzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbGludXgtZ251b2xkbGQgYW5kIGxpbnV4LWdudWFvdXQuCi0JICAjIElmIGxkIGRvZXMgbm90IHByb3ZpZGUgKmFueSogInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKLQkgICMgdGhhdCBtZWFucyBpdCBpcyBnbnVvbGRsZC4KLQkgIGVjaG8gIiRsZF9oZWxwX3N0cmluZyIgfCBncmVwID4vZGV2L251bGwgMj4mMSAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgotCSAgdGVzdCAkPyAhPSAwICYmIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiICYmIGV4aXQgMAotCi0JICBjYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgaT84NikKLQkgICAgVkVORE9SPXBjOwotCSAgICA7OwotCSAgKikKLQkgICAgVkVORE9SPXVua25vd247Ci0JICAgIDs7Ci0JICBlc2FjCi0JICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgotCSAgY2F0ID5kdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSNpZmRlZiBfX0VMRl9fCi0jIGlmZGVmIF9fR0xJQkNfXwotIyAgaWYgX19HTElCQ19fID49IDIKLSAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKLSMgIGVsc2UKLSAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOwotIyAgZW5kaWYKLSMgZWxzZQotICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKLSMgZW5kaWYKLSNlbHNlCi0gIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVhb3V0XG4iLCBhcmd2WzFdKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgZHVtbXkuYyBkdW1teQotCWZpIDs7Ci0jIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLiAgZWFybGllciB2ZXJzaW9ucwotIyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGggc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0gICAgaT84NjpEWU5JWC9wdHg6NCo6KikKLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgMCA7OwotICAgIGk/ODY6VU5JWF9TVjo0LjJNUDoyLiopCi0gICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KLSAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgotICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCi0JIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgotICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGk/ODY6Kjo0Lio6KiB8IGk/ODY6U1lTVEVNX1Y6NC4qOiopCi0JaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgaT84NjoqOjU6NykKLSAgICAgICBVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGVncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotICAgICAgICgvYmluL3VuYW1lIC1YfGVncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLSAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLSAgICAgICAgICAgICAgICYmIFVOQU1FX01BQ0hJTkU9aTU4NgotIyA1LjAuNGMgcmV0dXJucyAiUGVudCBJSSIuICA1LjAuNSByZXR1cm5zIFBlbnRJSQotICAgICAgICgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudC4qSUknID4vZGV2L251bGwpIFwKLSAgICAgICAgICAgICAgICYmIFVOQU1FX01BQ0hJTkU9aTY4NgotICAgICAgICgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKLSAgICAgICAgICAgICAgICYmIFVOQU1FX01BQ0hJTkU9aTY4NgotICAgICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059LXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgZXhpdCAwIDs7Ci0gICAgaT84NjoqOjMuMjoqKQotCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KLQkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAotCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGVncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2Ci0JCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2Ci0JCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudElJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50IElJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLSAgICAgICAgICAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKLQlmaQotCWV4aXQgMCA7OwotICAgIHBjOio6KjoqKQotICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAotICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpMzg2LgotCWVjaG8gaTM4Ni1wYy1tc2Rvc2RqZ3BwCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEludGVsOk1hY2g6Myo6KikKLQllY2hvIGkzODYtcGMtbWFjaDMKLQlleGl0IDAgOzsKLSAgICBwYXJhZ29uOio6KjoqKQotCWVjaG8gaTg2MC1pbnRlbC1vc2YxCi0JZXhpdCAwIDs7Ci0gICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAotCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0Ci0JZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgotCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKLQlmaQotCWV4aXQgMCA7OwotICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKLQkjICJtaW5pZnJhbWUiCi0JZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2Ci0JZXhpdCAwIDs7Ci0gICAgTTY4KjoqOlIzVls1NjddKjoqKQotCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OwotICAgIDNbMzRdPz86Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCi0gICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpPzg2Okx5bnhPUzoyLio6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6Mi4qOiopCi0JZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgU01bQkVdUzpVTklYX1NWOio6KikKLQllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUk0qOlNJTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOlNJTklYLSo6KjoqKQotCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKLQllbHNlCi0JCWVjaG8gbnMzMmstc25pLXN5c3YKLQlmaQotCWV4aXQgMCA7OwotICAgIFBFTlRJVU06Q1B1bml4OjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDAgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgbWM2OCo6QS9VWDoqOiopCi0JZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBuZXdzKjpORVdTLU9TOio6NiopCi0JZWNobyBtaXBzLXNvbnktbmV3c29zNgotCWV4aXQgMCA7OwotICAgIFIzMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFI0MDAwOlVOSVhfU1Y6KjoqKQotCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgotCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1iZS1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KLQllY2hvIGk1ODYtcGMtYmVvcwotCWV4aXQgMCA7OwotZXNhYwotCi0jZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKLSNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKLQotY2F0ID5kdW1teS5jIDw8RU9GCi0jaWZkZWYgX1NFUVVFTlRfCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2VuZGlmCi1tYWluICgpCi17Ci0jaWYgZGVmaW5lZCAoc29ueSkKLSNpZiBkZWZpbmVkIChNSVBTRUIpCi0gIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCi0gICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCi0gIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0gIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKLSNpZmRlZiBORVdTT1M0Ci0gICAgICAgICAgIjQiCi0jZWxzZQotCSAgIiIKLSNlbmRpZgotICAgICAgICAgKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKLSAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQotICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChOZVhUKQotI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQotI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgotI2VuZGlmCi0gIGludCB2ZXJzaW9uOwotICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7Ci0gIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQotI2lmIGRlZmluZWQgKFVNQVhWKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChDTVUpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQotICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChzZXF1ZW50KQotI2lmIGRlZmluZWQgKGkzODYpCi0gIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAobnMzMjAwMCkKLSAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKLSAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKLQotICAgIHVuYW1lKCZ1bik7Ci0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7Ci0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAodmF4KQotI2lmICFkZWZpbmVkICh1bHRyaXgpCi0gIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCi0gIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0gIGV4aXQgKDEpOwotfQotRU9GCi0KLSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotcm0gLWYgZHVtbXkuYyBkdW1teQotCi0jIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLXRlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9Ci0KLSMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKLQotaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KLXRoZW4KLSAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgotICAgIGMxKikKLQllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIGMzNCopCi0JZWNobyBjMzQtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGMzOCopCi0JZWNobyBjMzgtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGM0KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBlc2FjCi1maQotCi0jZWNobyAnKFVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZSknIDE+JjIKLQotZXhpdCAxCmRpZmYgLS1naXQgYS9jb25maWcuaWYgYi9jb25maWcuaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzAyNjkuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmlmCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotIyEgL2Rldi9udWxsCi0jIERvbid0IGNhbGwgaXQgZGlyZWN0bHkuIFRoaXMgc2hlbGwgc2NyaXB0IGZyYWdtZW50IGlzIGNhbGxlZCB0bwotIyBkZXRlcm1pbmU6Ci0jCi0jCTEuIGxpYnN0Y3h4X2ludGVyZmFjZTogdGhlIGludGVyZmFjZSBuYW1lIGZvciBsaWJzdGRjKysuCi0jCTIuIGN4eF9pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgYysrLgotIwkzLiBsaWJjX2ludGVyZmFjZTogdGhlIGludGVyZmFjZSBuYW1lIGZvciBsaWJjLgotIwotCi0jIEdldCB0aGUgdG9wIGxldmVsIHNyYyBkaXIuCi1pZiBbIC16ICIke3RvcHNyY2Rpcn0iIC1hIC16ICIke3RvcF9zcmNkaXJ9IiBdCi10aGVuCi0gIGVjaG8gIlVuZGVmaW5lZCB0b3AgbGV2ZWwgc3JjIGRpcjogdG9wc3JjZGlyIGFuZCB0b3Bfc3JjZGlyIGFyZSBlbXB0eSIgPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgWyAtbiAiJHt0b3BzcmNkaXJ9IiBdCi10aGVuCi0gIGlmX3RvcHNyY2Rpcj0ke3RvcHNyY2Rpcn0KLWVsc2UKLSAgaWZfdG9wc3JjZGlyPSR7dG9wX3NyY2Rpcn0KLWZpCi0KLWlmIFsgLWYgJHtpZl90b3BzcmNkaXJ9L2xpYnN0ZGMrKy9NYWtlZmlsZS5pbiBdOyB0aGVuCi0jIFdlIGNoZWNrIGxpYnN0ZGMrKyBmb3IgbGlic3RkY3h4X2ludGVyZmFjZS4KLWxpYnN0ZGN4eF9pbnRlcmZhY2U9YGdyZXAgIl5JTlRFUkZBQ0UiICR7aWZfdG9wc3JjZGlyfS9saWJzdGRjKysvTWFrZWZpbGUuaW4gfCBzZWQgJ3MvSU5URVJGQUNFWyAJXSo9WyAJXSpcKC4qXCkvXDEvJ2AKLWVsc2UKLWxpYnN0ZGN4eF9pbnRlcmZhY2U9Ci1maQotCi1pZiBbIC1mICR7aWZfdG9wc3JjZGlyfS9nY2MvY3AvTWFrZWZpbGUuaW4gXTsgdGhlbgotIyBXZSBjaGVjayBnY2MvY3AgZm9yIGN4eF9pbnRlcmZhY2UuCi1jeHhfaW50ZXJmYWNlPWBncmVwICJeSU5URVJGQUNFIiAke2lmX3RvcHNyY2Rpcn0vZ2NjL2NwL01ha2VmaWxlLmluIHwgc2VkICdzL0lOVEVSRkFDRVsgCV0qPVsgCV0qXCguKlwpL1wxLydgCi1lbHNlCi1jeHhfaW50ZXJmYWNlPQotZmkKLQotIyBUaGUgdHJpY2tpZXN0IHBhcnQgaXMgbGliY19pbnRlcmZhY2UuCi1pZiBbIC16ICIke2xpYmNfaW50ZXJmYWNlfSIgXQotdGhlbgotICBjYXNlICR7dGFyZ2V0X29zfSBpbgotICAqbGludXgqbGliYzEqfCpsaW51eCpsaWJjNSopCi0gICAgY2FzZSAke3RhcmdldF9hbGlhc30gaW4KLSAgICAqYWxwaGEqfCpwb3dlcnBjKikKLSAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNS45LQotICAgICAgOzsKLSAgICAqKQotICAgICAgbGliY19pbnRlcmZhY2U9LWxpYmM1LQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgKmxpbnV4KmdudSopCi0gICAgIyBXZSBoYXZlIHRvIHdvcmsgaGFyZGVyIHRvIGZpZ3VyZSBpdCBvdXQuCi0gICAgaWYgWyAke3RhcmdldF9hbGlhc30gPSAke2J1aWxkX2FsaWFzfSBdCi0gICAgdGhlbgotICAgICAgZHVtbXk9aWYkJAotICAgICAgY2F0ID4kZHVtbXkuYyA8PEVPRgotI2luY2x1ZGUgPGZlYXR1cmVzLmg+ICAgICAgICAgICAgICAgICAgICAgIAotbWFpbihhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsgICAgICAgICAgCi0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgcHJpbnRmKCIlZFxuIiwgX19HTElCQ19NSU5PUl9fKTsKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLSAgICAgICR7Q0MtY2N9ICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbAotICAgICAgaWYgWyAiJD8iID0gMCBdCi0gICAgICB0aGVuCi0JbGliY19pbnRlcmZhY2U9LWxpYmM2LmAuLyRkdW1teWAtCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0gICAgICBlbHNlCi0JIyBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuLgotCWVjaG8gIkNhbm5vdCBmaW5kIHRoZSBHTlUgQyBsaWJyYXJ5IG1pbm9yIHZlcnNpb24gbnVtYmVyLiIgPiYyCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZXhpdCAxCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgQ3Jvc3MgY29tcGlsaW5nLiBBc3N1bWUgZ2xpYmMgMi4xLgotICAgICAgbGliY19pbnRlcmZhY2U9LWxpYmM2LjEtCi0gICAgZmkKLSAgICA7OwotICAqKQotICAgIGxpYmNfaW50ZXJmYWNlPS0KLSAgICA7OwotICBlc2FjCi1maQpkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlZmUzMTYuLjAwMDAwMDAKLS0tIGEvY29uZmlnLnN1YgorKysgL2Rldi9udWxsCkBAIC0xLDEyMTMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQsIHZlcnNpb24gMS4xLgotIyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTItOTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KLSMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQotIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotaWYgWyB4JDEgPSB4IF0KLXRoZW4KLQllY2hvIENvbmZpZ3VyYXRpb24gbmFtZSBtaXNzaW5nLiAxPiYyCi0JZWNobyAiVXNhZ2U6ICQwIENQVS1NRlItT1BTWVMiIDE+JjIKLQllY2hvICJvciAgICAgJDAgQUxJQVMiIDE+JjIKLQllY2hvIHdoZXJlIEFMSUFTIGlzIGEgcmVjb2duaXplZCBjb25maWd1cmF0aW9uIHR5cGUuIDE+JjIKLQlleGl0IDEKLWZpCi0KLSMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotY2FzZSAkMSBpbgotCSpsb2NhbCopCi0JCWVjaG8gJDEKLQkJZXhpdCAwCi0JCTs7Ci0JKikKLQk7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBsaW51eC1nbnUqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gICopCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAotICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQotICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKLSAgICBlbHNlIG9zPTsgZmkKLSAgICA7OwotZXNhYwotCi0jIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KLSMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCi0jIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCi0jIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KLWNhc2UgJG9zIGluCi0JLXN1bipvcyopCi0JCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgotCQk7OwotCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCi0JLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCi0JLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKLQktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAotCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCi0JLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz12eHdvcmtzCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPS1zY28zLjJ2NQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzQpCi0JCW9zPS1zY28zLjJ2NAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMi5bNC05XSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjJ2WzQtOV0qKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQl0YWhvZSB8IGk4NjAgfCBtMzJyIHwgbTY4ayB8IG02ODAwMCB8IG04OGsgfCBuczMyayB8IGFyYyB8IGFybSBcCi0JCXwgYXJtZVtsYl0gfCBweXJhbWlkIHwgbW4xMDIwMCB8IG1uMTAzMDAgfCB0cm9uIHwgYTI5ayBcCi0JCXwgNTgwIHwgaTk2MCB8IGg4MzAwIFwKLQkJfCBocHBhIHwgaHBwYTEuMCB8IGhwcGExLjEgfCBocHBhMi4wIHwgaHBwYTIuMHcgfCBocHBhMi4wbiBcCi0JCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYXBjYTVbNjddIFwKLQkJfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciB8IGkzNzAgfCBzaCB8IHBvd2VycGMgfCBwb3dlcnBjbGUgXAotCQl8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIHwgbWlwczE2IHwgbWlwczY0IHwgbWlwc2VsIHwgbWlwczY0ZWwgXAotCQl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCB8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCi0JCXwgbWlwczY0dnI1MDAwIHwgbWlwcnM2NHZyNTAwMGVsIHwgbWNvcmUgXAotCSAgICAgICAgfCBtODgxMTAgfCBtNjgwWzAxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB6OGsgfCB2NzAgXAotCQl8IHNwYXJjIHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY3Y5IFwKLQkJfCB0aHVtYiB8IHY4NTAgfCBjNHggfCBkMTB2IHwgaDg1MDAgfCB3NjUpCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCi0JIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCi0JIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgotCWlbMzQ1NjddODYpCi0JICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCi0JICA7OwotCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCi0JKi0qLSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgotCXZheC0qIHwgdGFob2UtKiB8IGlbMzQ1NjddODYtKiB8IGk4NjAtKiB8IG0zMnItKiB8IG02OGstKiB8IG02ODAwMC0qIFwKLQkgICAgICB8IG04OGstKiB8IHNwYXJjLSogfCBuczMyay0qIHwgZng4MC0qIHwgYXJjLSogfCBhcm0tKiB8IGNbMTIzXSogXAotCSAgICAgIHwgbWlwcy0qIHwgcHlyYW1pZC0qIHwgdHJvbi0qIHwgYTI5ay0qIHwgcm9tcC0qIHwgcnM2MDAwLSogXAotCSAgICAgIHwgcG93ZXItKiB8IG5vbmUtKiB8IDU4MC0qIHwgY3JheTItKiB8IGg4MzAwLSogfCBoODUwMC0qIHwgaTk2MC0qIFwKLQkgICAgICB8IHhtcC0qIHwgeW1wLSogXAotCSAgICAgIHwgaHBwYS0qIHwgaHBwYTEuMC0qIHwgaHBwYTEuMS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMHctKiB8IGhwcGEyLjBuLSogXAotCSAgICAgIHwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYXBjYTVbNjddLSogXAotCSAgICAgIHwgd2UzMmstKiB8IGN5ZHJhLSogfCBuczE2ay0qIHwgcG4tKiB8IG5wMS0qIHwgeHBzMTAwLSogXAotCSAgICAgIHwgY2xpcHBlci0qIHwgb3Jpb24tKiBcCi0JICAgICAgfCBzcGFyY2xpdGUtKiB8IHBkcDExLSogfCBzaC0qIHwgcG93ZXJwYy0qIHwgcG93ZXJwY2xlLSogXAotCSAgICAgIHwgc3BhcmM2NC0qIHwgc3BhcmN2OS0qIHwgc3BhcmM4NngtKiB8IG1pcHMxNi0qIHwgbWlwczY0LSogfCBtaXBzZWwtKiBcCi0JICAgICAgfCBtaXBzNjRlbC0qIHwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCi0JICAgICAgfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAotCSAgICAgIHwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiB8IG1jb3JlLSogXAotCSAgICAgIHwgZjMwMS0qIHwgYXJtKi0qIHwgdDNlLSogXAotCSAgICAgIHwgbTg4MTEwLSogfCBtNjgwWzAxMjM0XTAtKiB8IG02ODM/Mi0qIHwgbTY4MzYwLSogfCB6OGstKiB8IGQxMHYtKiBcCi0JICAgICAgfCB0aHVtYi0qIHwgdjg1MC0qIHwgZDMwdi0qIHwgdGljMzAtKiB8IGMzMC0qICkKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCWFkb2JlNjhrKQotCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQotCQlvcz0tc2NvdXQKLQkJOzsKLQlhbGxpYW50IHwgZng4MCkKLQkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKLQkJOzsKLQlhbHRvcyB8IGFsdG9zMzA2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCi0JCTs7Ci0JYW0yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCi0JCW9zPS1ic2QKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQk7OwotCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljb252ZXgtYzEpCi0JCWJhc2ljX21hY2hpbmU9YzEtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzIpCi0JCWJhc2ljX21hY2hpbmU9YzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzMyKQotCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzQpCi0JCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzOCkKLQkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljcmF5IHwgeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmF5MikKLQkJYmFzaWNfbWFjaGluZT1jcmF5Mi1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQlbY3RqXTkwLWNyYXkpCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyZHMgfCB1bm9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRweDIwIHwgZHB4MjAtKikKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAotCQlvcz0tYm9zeAotCQk7OwotCWRweDIqIHwgZHB4MiotYnVsbCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZWJtb24yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LWVibW9uCi0JCTs7Ci0JZWx4c2kpCi0JCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKLQkJb3M9LWJzZAotCQk7OwotCWVuY29yZSB8IHVtYXggfCBtbWF4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQotCQk7OwotCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlmeDI4MDApCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50Ci0JCTs7Ci0JZ2VuaXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKLQkJOzsKLQlnbWljcm8pCi0JCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KLQkJb3M9LXN5c3YKLQkJOzsKLQloMzA1MHIqIHwgaGl1eCopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JaDgzMDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaDgzMDB4cmF5KQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LXhyYXkKLQkJOzsKLQloODUwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloYXJyaXMpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JaHAzMDAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHAzMDBic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0tYnNkCi0JCTs7Ci0JaHAzMDBocHV4KQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWhwdXgKLQkJOzsKLQlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKLQkJOzsKLQlocDlrM1syLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwcGEtbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCWhwcGFvc2YpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tb3NmCi0JCTs7Ci0JaHBwcm8pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JaTM3MC1pYm0qIHwgaWJtKikKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpWzM0NTY3XTg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWlbMzQ1NjddODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpWzM0NTY3XTg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaVszNDU2N104NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWkzODYtZ28zMiB8IGdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaTM4Ni1taW5ndzMyIHwgbWluZ3czMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1pbmd3MzIKLQkJOzsKLQlpcmlzIHwgaXJpczRkKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCi0JCWNhc2UgJG9zIGluCi0JCSAgICAtaXJpeCopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1pcml4NAotCQkJOzsKLQkJZXNhYwotCQk7OwotCWlzaTY4IHwgaXNpKQotCQliYXNpY19tYWNoaW5lPW02OGstaXNpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAqTWlOVCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci0JbWlwc2VsKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwc2VsLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMqLWxpbnV4KikKLQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXRic2QzODYpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1uZXRic2QKLQkJOzsKLQluZXR3aW5kZXIpCi0JCWJhc2ljX21hY2hpbmU9YXJtdjRsLWNvcmVsCi0JCW9zPS1saW51eAotCQk7OwotCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzMTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmVjdjcwKQotCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW1vbjk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1tb245NjAKLQkJOzsKLQlucDEpCi0JCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCi0JCTs7Ci0Jb3A1MG4tKiB8IG9wNjBjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJb3M9LXByb2VsZgotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBiZCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKLQkJOzsKLQlwYmIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKLQkJOzsKLSAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGVudGl1bSB8IHA1IHwgazUgfCBuZXhlbikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCTs7Ci0JcGVudGl1bXBybyB8IHA2IHwgazYgfCA2eDg2KQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtaWkgfCBwZW50aXVtMikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4ZW4tKikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qKQotCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwbikKLQkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAotCQk7OwotCXBvd2VyKQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JICAgICAgICA7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzYTI5MjAwKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNwYXJjbGl0ZS13cnMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3QyMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCi0JCTs7Ci0Jc3RyYXR1cykKLQkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXQzZSkKLQkJYmFzaWNfbWFjaGluZT10M2UtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdHgzOSkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCi0JCTs7Ci0JdHgzOWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLSAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0gICAgICAgICAgICAgICA7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JeG1wKQotCQliYXNpY19tYWNoaW5lPXhtcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLSAgICAgICAgeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl6OGstKi1jb2ZmKQotCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCi0JCW9zPS1zaW0KLQkJOzsKLQlub25lKQotCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQotCQlvcz0tbm9uZQotCQk7OwotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCi0jIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0Jdzg5aykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJOzsKLQlvcDUwbikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW9wNjBjKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0JbWlwcykKLQkJaWYgWyB4JG9zID0geC1saW51eC1nbnUgXTsgdGhlbgotCQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJZWxzZQotCQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJZmkKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNwYXJjIHwgc3BhcmN2OSkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLSAgICAgICAgY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JbWFjIHwgbXB3IHwgbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCTs7Ci0JcG1hYyB8IHBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKLQkJOzsKLQljNHgqKQotCQliYXNpY19tYWNoaW5lPWM0eC1ub25lCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcwotICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgotCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgotCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCi0JCTs7Ci0JLXNvbGFyaXMpCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCS1zdnI0KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXVuaXh3YXJlKikKLQkJb3M9LXN5c3Y0LjJ1dwotCQk7OwotCS1nbnUvbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCi0JIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KLQkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KLQktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCi0JICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAotCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAotCSAgICAgIHwgLWFvcyogXAotCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCi0JICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCi0JICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1uZXRic2QqIHwgLW9wZW5ic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogXAotCSAgICAgIHwgLWx5bnhvcyogfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAotCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKLQkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCi0JICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtcmhhcHNvZHkqIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKLQkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW9uOTYwKiB8IC1sbmV3cyopCi0JCTs7Ci0JLW1hYyopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vc2Zyb3NlKikKLQkJb3M9LW9zZnJvc2UKLQkJOzsKLQktb3NmKikKLQkJb3M9LW9zZgotCQk7OwotCS11dGVrKikKLQkJb3M9LWJzZAotCQk7OwotCS1keW5peCopCi0JCW9zPS1ic2QKLQkJOzsKLQktYWNpcyopCi0JCW9zPS1hb3MKLQkJOzsKLQktMzg2YnNkKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWN0aXgqIHwgLXV0cyopCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JLW5zMiApCi0JICAgICAgICBvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQktb3NlKikKLQkJb3M9LW9zZQotCQk7OwotCS1lczE4MDAqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLSAgICAgICAgLSptaW50IHwgLSpNaU5UKQotCSAgICAgICAgb3M9LW1pbnQKLQkJOzsKLQktbm9uZSkKLQkJOzsKLQkqKQotCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KLQkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotZWxzZQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCi0jIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgotIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCi0jICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCi0jIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKLSMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZwotIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KLQotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotYWNvcm4pCi0JCW9zPS1yaXNjaXgxLjIKLQkJOzsKLQlhcm0qLWNvcmVsKQotCQlvcz0tbGludXgKLQkJOzsKLQlhcm0qLXNlbWkpCi0JCW9zPS1hb3V0Ci0JCTs7Ci0gICAgICAgIHBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1pcHMqLWNpc2NvKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotKikKLQkJb3M9LWVsZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotICAgICAgICAqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotICAgICAgICAqLWhpZ2hsZXZlbCkKLQkJb3M9LWJzZAotCQk7OwotCSotZW5jb3JlKQotCQlvcz0tYnNkCi0JCTs7Ci0gICAgICAgICotc2dpKQotCQlvcz0taXJpeAotCQk7OwotICAgICAgICAqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzAxLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKi1yb202OGspCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi0qYnVnKQotCQlvcz0tY29mZgotCQk7OwotCSotYXBwbGUpCi0JCW9zPS1tYWNvcwotCQk7OwotCSotYXRhcmkqKQotCQlvcz0tbWludAotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1iZW9zKikKLQkJCQl2ZW5kb3I9YmUKLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktbXBlaXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLWhtcyopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLW1wdyogfCAtbWFjb3MqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktKm1pbnQgfCAtKk1pTlQpCi0JCQkJdmVuZG9yPWF0YXJpCi0JCQkJOzsKLQkJZXNhYwotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAotCQk7OwotZXNhYwotCi1lY2hvICRiYXNpY19tYWNoaW5lJG9zCmRpZmYgLS1naXQgYS9jb25maWcvQ2hhbmdlTG9nIGIvY29uZmlnL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2ZmM2MC4uMDAwMDAwMAotLS0gYS9jb25maWcvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLTE5OTktMDQtMDcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBtdC1kMzB2OiBOZXcgZmlsZSwgcGFzcyAtZyAtT3MgLVdhLC1DIGFzIGRlZmF1bHQgb3B0aW9ucy4KLQotMTk5OS0wMi0wOCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IEFkZGVkIG1hY3JvcyB0byBmaW5kIGl0Y2wgZmlsZXMuCi0JRXhwb3J0IFRDTF9DRkxBR1MgZnJvbSB0Y2xDb25maWcuc2guCi0JRXhwb3J0IFRDTF9MSUJfRlVMTF9QQVRILCBUS19MSUJfRlVMTF9QQVRILCBJVENMX0xJQl9GVUxMX1BBVEgsCi0JSVRLX0xJQl9GVUxMX1BBVEgsIGFuZCBUSVhfTElCX0ZVTExfUEFUSAotCVJlcGxhY2UgVElYIG1hY3JvcyB3aXRoIGJldHRlciBvbmVzIGZyb20gc25hdmlnYXRvci4KLQotVHVlIEZlYiAgMiAyMjo1MToyMSAxOTk5IFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIG1oLWFybXBpYzogTmV3IGZpbGUuICBQYXRjaCBmcm9tIEppbSBQaWNrIDxqaW1AamltcGljay5jb20+LgotCSogbXQtYXJtcGljOiBMaWtld2lzZS4KLQotTW9uIEphbiAxOCAxOTo0MTowOCAxOTk5ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjeWd3aW4ubWg6IEFjdGl2YXRlIGNvbW1lbnRlZCBvdXQgZGVwZW5kZW5jaWVzIGZvcgotCWdkYjogbGlidGVybWNhcC4KLQotV2VkIE5vdiAxOCAyMDoyOTo0NiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjeWd3aW4ubWg6IEFkZCBleHRyYSBsaWJ0ZXJtY2FwIHRhcmdldCBpbmZvcm1hdGlvbi4KLQlBZGQgY29tbWVudGVkIG91dCBkZXBlbmRlbmN5IGZvciBnZGIgdG8gbGlidGVybWNhcCBmb3IKLQlmdXR1cmUgcmVhZGxpbmUgcmVxdWlyZW1lbnQuCi0KLU1vbiBOb3YgIDIgMTU6MTU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIG1oLWN5Z3dpbjMyOiBkZWxldGUKLSAgICAgICAgKiBtaC1jeWd3aW46IHdhcyBtaC1jeWd3aW4zMgotCi0xOTk4LTEwLTI2ICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogVENMSERJUiBhbmQgVEtIRElSIG5lZWQgdG8gYmUgcnVuIHRocm91Z2gKLQljeWdwYXRoIGZvciBNaWNyb3NvZnQgYnVpbGRzLgotCi0xOTk4LTEwLTIwICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogUmUtZXhwb3J0ZWQgVENMX0xJQlMgYW5kIFRDTF9MRF9TRUFSQ0hfRkxBR1MKLQliZWNhdXNlIGl0Y2wgbmVlZHMgdGhlbS4KLQotTW9uIEF1ZyAzMSAxNzo1MDo1MyAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogbWgtYWl4NDMgKE5NX0ZPUl9UQVJHRVQpOiBBZGQgLVgzMl82NCBhcyB3ZWxsLgotCi1TYXQgQXVnIDI5IDE0OjMyOjU1IDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBtaC1haXg0MzogTmV3IGZpbGUuCi0KLU1vbiBBdWcgMTAgMDA6MTU6NDcgMTk5OCAgSEogTHUgKGhqbEBnbnUub3JnKQotCi0JKiBtdC1saW51eCAoQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi0xOTk4LTA1LTI5ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBjb2xsZWN0aW9uIG9mIGdlbmVyaWMgYXV0b2NvbmYgbWFjcm9zLgotCQotV2VkIEFwciAyMiAxMjoyNDoyOCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbXQtb3NwYWNlOiBOZXcgZmlsZSwgc3VwcG9ydCB1c2luZyAtT3MgaW5zdGVhZCBvZiAtTzIgdG8gY29tcGlsZQotCXRoZSBsaWJyYXJpZXMuCi0KLVdlZCBBcHIgMjIgMTA6NTM6MTQgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG10LWxpbnV4IChDWFhGTEFHU19GT1JfVEFSR0VUKTogU2V0IHRoaXMgaW5zdGVhZCBvZiBDWFhGTEFHUy4KLQotU2F0IEFwciAxMSAyMjo0MzoxNyAxOTk4ICBKLiBLZWFuIEpvaG5zdG9uICA8amtqQHNjby5jb20+Ci0KLQkqIG1oLXN2c3Y1OiBOZXcgZmlsZSAtIHN1cHBvcnQgZm9yIFNDTyBVbml4V2FyZSA3IC8gU1ZSNS4KLQotVGh1IE1hciAyNiAwMTo1NDoyNSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogc3RvcCBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgZG9zcmVsLgotCi1UaHUgU2VwIDExIDE2OjQzOjI3IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogbWgtZWxmYWxwaGFwaWMsIG10LWVsZmFscGhhcGljOiBOZXcgZmlsZXMuCi0KLVdlZCBKdWwgMjMgMTI6MzI6MTggMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBtaC1nbzMyIChDRkxBR1MpOiBEb24ndCBzZXQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIuCi0KLU1vbiBKdW4gMTYgMTk6MDY6NDEgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogbWgtcHBjcGljOiBOZXcgZmlsZS4KLQkqIG10LXBwY3BpYzogTmV3IGZpbGUuCi0KLVRodSBNYXIgMjcgMTU6NTI6NDAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogbWgtY3lnd2luMzI6IG92ZXJyaWRlIENYWEZMQUdTLCBzZXR0aW5nIHRvIC1PMiBvbmx5Ci0JKG5vIGRlYnVnKQotCi1UdWUgTWFyIDI1IDE4OjE2OjQzIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBvdmVycmlkZSBMSUJHQ0MyX0RFQlVHX0NGTEFHUyBzbyBkZWJ1ZyBpbmZvCi0JaXNuJ3QgaW5jbHVkZWQgaW4gY3lnd2luMzItaG9zdGVkIGxpYmdjYzIuYSBieSBkZWZhdWx0Ci0KLVdlZCBKYW4gIDggMTk6NTY6NDMgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIG1oLWN5Z3dpbjMyOiBvdmVycmlkZSBDRkxBR1Mgc28gZGVidWcgaW5mbyBpc24ndCBpbmNsdWRlZAotICAgICAgICBpbiBjeWd3aW4zMi1ob3N0ZWQgdG9vbHMgYnkgZGVmYXVsdAotCi1UdWUgRGVjIDMxIDE2OjA0OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtbGludXg6IFJlbW92ZS4KLQotTW9uIE5vdiAxMSAxMDoyOTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG10LXBwYzogRGVsZXRlIGZpbGUsIG9wdGlvbnMgbW92ZWQgdG8gbmV3bGliIGNvbmZpZ3VyZS4KLQotRnJpIE9jdCAgNCAxMjoyMTowMyAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogbWgtZGd1eDM4NjogTmV3IGZpbGUuICB4ODYgZGd1eCBzcGVjaWZpYyBmbGFncwotCi1Nb24gU2VwIDMwIDE1OjEwOjA3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdyAoRVhUUkFMSUJTX1BQQ19YQ09GRik6IE5ldywgd2FzIEVYVFJBTElCU19QUEMuCi0JKEVYVFJBTElCU19QUEMpOiBVc2Ugc2hhcmVkIGxpYnJhcmllcyBpbnN0ZWFkIG9mIHhjb2ZmLgotCi1TYXQgQXVnIDE3IDA0OjU2OjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQHNrYXJvLmN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBkb24ndCAtRF9XSU4zMiBoZXJlIGFueW1vcmUKLQotVGh1IEF1ZyAxNSAxOTo0Njo0NCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKFNFR0ZMQUdfNjhLLCBTRUdGTEFHX1BQQyk6IFJlbW92ZS4KLQkoRVhUUkFMSUJTX1BQQyk6IEFkZCBsaWJnY2MueGNvZmYuCi0KLVRodSBBdWcgIDggMTQ6NTE6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBtdC1wcGM6IE5ldyBmaWxlLCBhZGQgLW1yZWxvY2F0YWJsZS1saWIgYW5kIC1tbm8tZWFiaSB0byBhbGwKLQl0YXJnZXQgYnVpbGRzIGZvciBQb3dlclBDIGVhYmkgdGFyZ2V0cy4KLQotRnJpIEp1bCAxMiAxMjowNjowMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdzogTmV3IHN1YmRpciwgTWFjIE1QVyBjb25maWd1cmF0aW9uIHN1cHBvcnQgYml0cy4KLQotTW9uIEp1bCAgOCAxNzozMDo1MiAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIG1oLWlyaXg2OiBOZXcgZmlsZS4KLQotTW9uIEp1bCAgOCAxNToxNTozNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIG10LXNwYXJjcGljIChQSUNGTEFHX0ZPUl9UQVJHRVQpOiBVc2UgLWZQSUMuCi0KLUZyaSBKdWwgIDUgMTE6NDk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1pcml4NCAoUkFOTElCKTogRG9uJ3QgZGVmaW5lOyBJcml4IDQgZG9lcyBoYXZlIHJhbmxpYi4KLQotU3VuIEp1biAyMyAyMjo1OToyNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogbmV3IGZpbGUuICBMaWtlIG1oLWdvMzIgd2l0aG91dCB0aGUgQ0ZMQUdTIGVudHJ5LgotCi1UdWUgTWFyIDI2IDE0OjEwOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtZ28zMiAoQ0ZMQUdTKTogRGVmaW5lLgotCi1UaHUgTWFyIDE0IDE5OjIwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtbmVjdjQ6IE5ldyBmaWxlLgotCi1UaHUgRmViIDE1IDEzOjA3OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtY3h1eCAoQ0MpOiBOZXcgdmFyaWFibGUuCi0JKENGTEFHUywgTERGTEFHUyk6IFJlbW92ZS4KLQkqIG1oLW5jcnN2cjQzIChDQyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZMQUdTKTogUmVtb3ZlLgotCSogbWgtc29sYXJpcyAoQ0ZMQUdTKTogUmVtb3ZlLgotCi0JKiBtaC1nbzMyOiBSZW1vdmUgbW9zdCB2YXJpYWJsZSBzZXR0aW5ncywgc2luY2UgdGhleSBwcmVzdW1lZCBhCi0JQ2FuYWRpYW4gQ3Jvc3MsIHdoaWNoIGlzIG5vdyBoYW5kbGVkIGNvcnJlY3RseSBieSB0aGUgY29uZmlndXJlCi0Jc2NyaXB0LgotCi0JKiBtaC1zcGFyY3BpYyAoUElDRkxBRyk6IFNldCB0byAtZlBJQywgbm90IC1mcGljLgotCi1Nb24gRmViIDEyIDE0OjUzOjM5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtaC1tNjhrcGljLCBtdC1tNjhrcGljOiBOZXcgZmlsZXMuCi0KLVRodSBGZWIgIDEgMTQ6MTU6NDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChDQ19NV0M2OEspOiBBZGQgb3B0aW9ucyBzaW1pbGFyIHRvIHRob3NlIHVzZWQKLQlpbiBDQ19NV0NQUEMsIGFuZCAtbWM2ODAyMCAtbW9kZWwgZmFyLgotCShBUl9NV0xJTks2OEspOiBBZGQgLXhtIGxpYnJhcnkuCi0JKEFSX0FSKTogRGVmaW5lLgotCShDQ19MRF9NV0xJTks2OEspOiBSZW1vdmUgLWQuCi0JKEVYVFJBTElCU19NV0M2OEspOiBEZWZpbmUuCi0KLVRodSBKYW4gMjUgMTY6MDU6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1uY3JzdnI0MyAoQ0ZMQUdTKTogUmVtb3ZlIC1Ibm9jb3B5ci4KLQotVHVlIE5vdiAgNyAxNTo0MTozMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKENDX01XQzY4SywgQ0NfTVdDUFBDKTogUmVtb3ZlIHVudXNlZCBpbmNsdWRlIHBhdGguCi0JKENDX01XQ1BQQyk6IEFkZCAtbXB3X2NoYXJzLCBkaXNhYmxlIHdhcm5pbmdzLCBhZGQgY29tbWVudHMKLQlleHBsYWluaW5nIHJlYXNvbnMgZm9yIHZhcmlvdXMgZmxhZ3MuCi0JKEVYVFJBTElCU19QUEMsIEVYVFJBTElCU19NV0NQUEMgKTogUHV0IHJ1bnRpbWUgbGlicmFyeSBmaXJzdC4KLQkKLUZyaSBPY3QgMTMgMTQ6NDQ6MjUgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIG1oLWFpeCwgbWgtc3VuOiAgUmVtb3ZlZC4KLQotCSogbWgtZGVjc3RhdGlvbiAoWDExX0VYVFJBX0NGTEFHUyk6IERlZmluZS4KLQotCSogbWgtc2NvLCBtaC1zb2xhcmlzLCBtaC1zeXN2NCAoWDExX0VYVFJBX0xJQlMpOiBEZWZpbmUuCi0KLSAgICAgICAgKiBtaC1ocDMwMCwgbWgtaHB1eCwgbWgtaHB1eDgsIG1oLXNvbGFyaXMsIG1oLXN1bjMsIG1oLXN5c3Y0OiBEb24ndCAKLQloYXJkY29kZSBsb2NhdGlvbiBvZiBYIHN0dWZmIGhlcmUuCi0KLVRodSBTZXAgMjggMTM6MTQ6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3OiBBZGQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgNjhLIGFuZCBQb3dlck1hYwotCWNvbXBpbGVycywgYWRkIGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IGFuZCBsaW5rIHN0ZXBzIGZvcgotCVBvd2VyTWFjcy4KLQotVGh1IFNlcCAxNCAwODoyMDowNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbWgtaHAzMDAgKENDKTogQWRkICJDQyA9IGNjIC1XcCwtSDI1NjAwMCIgdG8gYXZvaWQKLQkidG9vIG11Y2ggZGVmaW5pbmciIGVycm9ycyBmcm9tIHRoZSBIUFVYIGNvbXBpbGVyLgotCi1UaHUgQXVnIDE3IDE3OjI4OjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogbWgtaHAzMDAgKFJBTkxJQik6IFVzZSAiYXIgdHMiLCBpbiBjYXNlIEdOVSBhciB3YXMgdXNlZCBhbmQKLQlkaWRuJ3QgYnVpbGQgYSBzeW1ib2wgdGFibGUuCi0KLVRodSBKdW4gMjIgMTc6NDc6MjQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChDQyk6IERlZmluZSBBTlNJX1BST1RPVFlQRVMuCi0KLU1vbiBBcHIgMTAgMTI6Mjk6NDggMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChFWFRSQUxJQlMpOiBBbHdheXMgbGluayBpbiBNYXRoLm8sIENTQU5FTElCLm8sCi0gICAgICAgIGFuZCBUb29sTGlicy5vLgotCi0JKiBtcHctbWgtbXB3IChDQyk6IERlZmluZSBBTE1PU1RfU1REQy4KLQkoQ0ZMQUdTKTogUmVtb3ZlIEFMTU9TVF9TVERDLCAtbWM2ODg4MS4KLQkoTERGTEFHUyk6IGFkZCAtdy4KLQotCSogbXB3LW1oLW1wdyAoQ0ZMQUdTKTogQWRkIC1iIG9wdGlvbiB0byBwdXQgc3RyaW5ncyBhdCB0aGUgZW5kcyBvZgotCWZ1bmN0aW9ucy4KLQotCSogbXB3LW1oLW1wdzogTmV3IGZpbGUsIGhvc3QgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZm9yIE1QVy4KLQotRnJpIE1hciAzMSAxMTozNToxNyAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBtdC1uZXR3YXJlOiBOZXcgZmlsZS4KLQotTW9uIE1hciAxMyAxMjozMToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWhwdXg4OiBOZXcgZmlsZS4KLQkqIG1oLWhwdXg6IFVzZSBYMTFSNSByYXRoZXIgdGhhbiBYMTFSNC4KLQotVGh1IEZlYiAgOSAxMTowNDoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWxpbnV4IChTWVNWKTogRG9uJ3QgZGVmaW5lLgotCShSQU5MSUIpOiBEb24ndCBkZWZpbmUuCi0KLVdlZCBKYW4gMTEgMTY6Mjk6MzQgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIG0/LSpwaWMgKExJQkNYWEZMQUdTKTogQWRkIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzLgotCi1UaHUgTm92ICAzIDE3OjI3OjE5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1oLWlyaXg0IChDQyk6IEluY3JlYXNlIG1heGltdW0gc3RyaW5nIGxlbmd0aC4KLQotCSogbWgtc2NvIChDQyk6IERlZmluZSBhd2F5IGNvbnN0LCBpdCBkb2Vzbid0IHdvcmsgcmlnaHQ7IGVsZW1lbnRzCi0Jb2YgYXJyYXlzIG9mIHB0ci10by1jb25zdCBhcmUgY29uc2lkZXJlZCBjb25zdCB0aGVtc2VsdmVzLgotCi1TYXQgSnVsIDE2IDEyOjE3OjQ5IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogbWgtY3h1eDogTmV3IGZpbGUsIGZyb20gQm9iIFJ1c2sgKHJydXNrQG1haWwuY3NkLmhhcnJpcy5jb20pLgotCi1TYXQgSnVuICA0IDE3OjIyOjEyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBtaC1uY3JzdnI0MzogIE5ldyBmaWxlIGZyb20gVG9tIE1jQ29ubmVsbAotCTx0bWNjb25uZUBzZWRvbmEuaW50ZWwuY29tPi4KLQotVGh1IE1heSAxOSAwMDozMjoxMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbWgtaHB1eCAoQ0MpOiBBZGQgLVdwLC1IMjU2MDAwIHRvIGF2b2lkICJ0b28gbXVjaCBkZWZpbmluZyIKLQllcnJvcnMgZnJvbSB0aGUgSFBVWCA4IGNvbXBpbGVycy4KLQotV2VkIE1heSAgNCAyMDoxNDo0NyAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIG1oLWx5bnhyczZrOiBzZXQgU0hFTEwgdG8gL2Jpbi9iYXNoCi0KLVR1ZSBBcHIgMTIgMTI6Mzg6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaC1pcml4NCAoQ0MpOiBDaGFuZ2UgLVhOaDE1MDAgdG8gLVhOaDIwMDAuCi0KLVNhdCBEZWMgMjUgMjA6MDM6NDUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG10LWhwcGE6IERlbGV0ZS4KLQotVHVlIE5vdiAxNiAyMjo1NDozOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWgtYTY4YnNkOiBEZWZpbmUgQ0MgdG8gZ2NjLgotCi1Nb24gTm92IDE1IDE2OjU2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1saW51eDogRG9uJ3QgcHV0IC1zdGF0aWMgaW4gTERGTEFHUy4gIEFkZCBjb21tZW50cy4KLQotTW9uIE5vdiAxNSAxMzozNzo1OCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIG1oLXN5c3Y0IChBUl9GTEFHUyk6IGNoYW5nZSBmcm9tIGNxIHRvIGNyCi0KLUZyaSBOb3YgIDUgMDg6MTI6MzIgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQotCi0JKiBtaC11bml4d2FyZTogcmVtb3ZlLiAgSXQncyB0aGUgc2FtZSBhcyBzeXN2NCwgYW5kIGNvbmZpZy5ndWVzcwotCWNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UuICBTbyBkb24ndCBhbGxvdyBza2V3LgotCi1XZWQgT2N0IDIwIDIwOjM1OjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1ocDMwMDogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZSwgYnV0IGFkZCBjb21tZW50IGV4cGxhaW5pbmcuCi0KLVR1ZSBPY3QgMTkgMTg6NTg6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLWhwMzAwOiBEb24ndCBkZWZpbmUgQ0ZMQUdTIHRvIGVtcHR5LiAgV2h5IHNob3VsZCBocDMwMCBiZQotCWRpZmZlcmVudCBmcm9tIGFueXRoaW5nIGVsc2U/ICAoImdkYiBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIG5hdGl2ZQotCWRlYnVnIGZvcm1hdCIgaXNuJ3QgYSBnb29kIGVub3VnaCBhbnN3ZXIgYmVjYXVzZSB3ZSBtaWdodCBiZSB1c2luZwotCWdjYykuCi0KLVR1ZSBPY3QgIDUgMTI6MTc6NDAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtaC1hbHBoYW9zZjogUmVtb3ZlLCBubyBsb25nZXIgbmVjZXNzYXJ5IG5vdyB0aGF0IGdkYiBrbm93cwotCWhvdyB0byBoYW5kbGUgT1NGLzEgc2hhcmVkIGxpYnJhcmllcy4KLQotVHVlIEp1bCAgNiAxMToyNzozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBtaC1hbHBoYW9zZjogTmV3IGZpbGUuCi0KLVRodSBKdWwgIDEgMTU6NDk6MzMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLXJpc2NvczogTmV3IGZpbGUuCi0KLU1vbiBKdW4gMTQgMTI6MDM6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaC1haXgsIG1oLWFpeDM4NiwgbWgtZGVjc3RhdGlvbiwgbWgtZGVsdGE4OCwgbWgtaHB1eCwgbWgtaXJpeDQsCi0JbWgtbmNyMzAwMCwgbWgtc29sYXJpcywgbWgtc3lzdiwgbWgtc3lzdjQ6IHJlbW92ZSBJTlNUQUxMPWNwIGxpbmUsCi0Jbm93IHRoYXQgd2UncmUgdXNpbmcgaW5zdGFsbC5zaCBnbG9iYWxseQotCi1GcmkgSnVuICA0IDE2OjA5OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWgtc3lzdjQgKElOU1RBTEwpOiBVc2UgY3AsIG5vdCAvdXNyL3VjYi9pbnN0YWxsLgotCi1UaHUgQXByICA4IDExOjIxOjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbXQtYTI5aywgbXQtZWJtb24yOWssIG10LW9zNjhrLCBtdC1vc2U2ODAwMCwgbXQtb3NlNjhrLAotCW10LXZ4d29ya3M2OCwgbXQtdnh3b3Jrczk2MDogUmVtb3ZlZCBvYnNvbGV0ZSwgdW51c2VkIHRhcmdldAotCU1ha2VmaWxlIGZyYWdtZW50IGZpbGVzLgotCi1Nb24gTWFyICA4IDE1OjA1OjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWgtYWl4Mzg2OiBOZXcgZmlsZTsgb2xkIG1oLWFpeCwgcGx1cyBuby1vcCBSQU5MSUIuCi0KLVRodSBPY3QgIDEgMTM6NTA6NDggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBtaC1zb2xhcmlzOiBJTlNUQUxMIGlzIE5PVCAvdXNyL3VjYi9pbnN0YWxsCi0KLU1vbiBBdWcgMjQgMTQ6MjU6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtdC1vc2U2ODAwMCwgbXQtb3NlNjhrOiByZW5hbWVkIGZyb20gbXQtT1NFKi4KLQotVHVlIEp1bCAyMSAwMjoxMTowMSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIG10LU9TRTY4aywgbXQtNjgwMDAwOiBuZXcgY29uZmlncy4KLQotVGh1IEp1bCAxNiAxNzoxMjowOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1oLWlyaXg0OiBtZXJnZWQgY2hhbmdlcyBmcm9tIHByb2dyZXNzaXZlLgotCi1UdWUgSnVuICA5IDIzOjI5OjM4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogRXZlcnl3aGVyZTogQ2hhbmdlIFJBTkxJQj1lY2hvPi9kZXYvbnVsbCAod2hpY2ggY29uZnVzZXMKLQlzb21lIHNoZWxscyAtIGFuZCBJIGRvbid0IGJsYW1lIHRoZW0pIHRvIFJBTkxJQj10cnVlLgotCSogbWgtc29sYXJpczogIFVzZSAvdXNyL3VjYi9pbnN0YWxsIGZvciBJTlNUQUxMLgotCi1TdW4gTWF5IDMxIDE0OjQ1OjIzIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCi0KLQkqIG1oLXNvbGFyaXMyOiBBZGQgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIFNvbGFyaXMgMiAoc3lzdiwgbm8gcmFubGliKQotCi1GcmkgQXByIDEwIDIzOjEwOjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtaC1uY3IzMDAwOiAgQWRkIG5ldyBjb25maWd1cmF0aW9uIGZvciBOQ1IgMzAwMC4KLQotVHVlIERlYyAxMCAwMDoxMDo1NSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIENoYW5nZUxvZzogZnJlc2ggY2hhbmdlbG9nLgotCmRpZmYgLS1naXQgYS9jb25maWcvYWNpbmNsdWRlLm00IGIvY29uZmlnL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjc5OWNlZC4uMDAwMDAwMAotLS0gYS9jb25maWcvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTk5NCArMCwwIEBACi1kbmwgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGludG8gYWxsIGFueSBvdGhlciBhY2luY2x1ZGUgZmlsZSB0aGF0IG5lZWRzCi1kbmwgdG8gdXNlIHRoZXNlIG1hY3Jvcy4KLQotZG5sIFRoaXMgaXMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgY2FsbHMgb3VyIG93biBBQ19QUk9HX0NDX1dPUktTLAotZG5sIGFuZCBkb2Vzbid0IGNhbGwgQUNfUFJPR19DWFhfR05VLCBjYXVzZSB3ZSB0ZXN0IGZvciB0aGF0IGluICBBQ19QUk9HX0NDX1dPUktTLgotZG5sIFdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci1kbmwgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mIGl0c2VsZi4KLWRubCBGaW5kIGEgd29ya2luZyBHKysgY3Jvc3MgY29tcGlsZXIuIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdOVSBDKysgY29tcGlsZXIuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19DWFhfQ1JPU1MsCi1bQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NYWENQUF0pCi1BQ19DSEVDS19QUk9HUyhDWFgsICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKyssIGdjYykKLQotQ1lHX0FDX1BST0dfR1hYX1dPUktTCi0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ3h4ID0geWVzOyB0aGVuCi0gIEdYWD15ZXMKLWRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENYWEZMQUdTIGlzIHNldCwgaW4gY2FzZSB0aGUgcGFja2FnZQotZG5sIHBsYXlzIGFyb3VuZCB3aXRoIENYWEZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAotZG5sIG5vcm1hbCB2ZXJzaW9ucyBvZiBhIGxpYnJhcnkpLCB0YXN0ZWxlc3MgYXMgdGhhdCBpZGVhIGlzLgotICBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKLSAgQ1hYRkxBR1M9Ci0gIEFDX1BST0dfQ1hYX0cKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KLSAgICBDWFhGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ1hYRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR1hYPQotICB0ZXN0ICIke0NYWEZMQUdTK3NldH0iID0gc2V0IHx8IENYWEZMQUdTPSItZyIKLWZpCi1dKQotCi1kbmwgU2VlIGlmIHRoZSBHKysgY29tcGlsZXIgd2UgZm91bmQgd29ya3MuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19HWFhfV09SS1MsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBhY3R1YWxseSB3b3Jrc10pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQ1BMVVNQTFVTCi1kbmwgVHJ5IGEgdGVzdCBjYXNlLiBXZSBvbmx5IGNvbXBpbGUsIGJlY2F1c2UgaXQncyBjbG9zZSB0byBpbXBvc3NpYmxlCi1kbmwgdG8gZ2V0IGEgY29ycmVjdCBmdWxseSBsaW5rZWQgZXhlY3V0YWJsZSB3aXRoIGEgY3Jvc3MgY29tcGlsZXIuIEZvcgotZG5sIG1vc3QgY3Jvc3MgY29tcGlsZXJzLCB0aGlzIHRlc3QgaXMgYm9ndXMuIEZvciBHKyssIHdlIGNhbiB1c2UgdmFyaW91cwotZG5sIG90aGVyIGNvbXBpbGUgbGluZSBvcHRpb25zIHRvIGdldCBhIGRlY2VudCBpZGVhIHRoYXQgdGhlIGNyb3NzIGNvbXBpbGVyCi1kbmwgYWN0dWFsbHkgZG9lcyB3b3JrLCBldmVuIHRob3VnaCB3ZSBjYW4ndCBwcm9kdWNlIGFuIGV4ZWN1dGFibGUgd2l0aG91dAotZG5sIG1vcmUgaW5mbyBhYm91dCB0aGUgdGFyZ2V0IGl0J3MgYmVpbmcgY29tcGlsZWQgZm9yLiBUaGlzIG9ubHkgd29ya3MKLWRubCBmb3IgdGhlIEdOVSBDKysgY29tcGlsZXIuCi0KLWRubCBUcmFuc2Zvcm0gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIGl0J3MgY3Jvc3MgdmFyaWFudCwgdW5sZXNzCi1kbmwgQ1hYIGlzIHNldC4gVGhpcyBpcyBhbHNvIHdoYXQgQ1hYIGdldHMgc2V0IHRvIGluIHRoZSBnZW5lcmF0ZWQKLWRubCBNYWtlZmlsZS4KLWlmIHRlc3QgeCIke0NYWH0iID0geGMrKyA7IHRoZW4KLSAgICBDWFg9YGVjaG8gZ2NjIHwgc2VkIC1lICIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9ImAKLWZpCi0KLWRubCBHZXQgRysrJ3MgZnVsbCBwYXRoIHRvIGxpYmdjYy5hCi1saWJnY2NwYXRoPWAke0NYWH0gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19neHg9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2d4eD1ubwotZmkKLQotZG5sIElmIHdlIGFyZSB1c2luZyBHKyssIGxvb2sgZm9yIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gZXhpc3QgaWYgdGhpcwotZG5sIGNvbXBpbGVyIHdvcmtzLgotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19neHh9IiA9IHh5ZXMgOyB0aGVuCi0gICAgZ2NjZmlsZXM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6L2xpYmdjYy5hOjonYAotICAgIGlmIHRlc3QgLWYgJHtnY2NmaWxlc30vc3BlY3MgLWEgLWYgJHtnY2NmaWxlc30vY3BwIC1hIC1mICR7Z2NjZmlsZXN9L2NjMXBsdXM7IHRoZW4KLQlnY2NmaWxlcz15ZXMKLSAgICBlbHNlCi0JZ2NjZmlsZXM9bm8KLSAgICBmaQotICAgIGdjY2xpYnM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6bGliL2djYy1saWIvOjonIC1lICdzOi9saWJnY2MuYTo6JyAtZSAncyxcKC4qXCkvLiosXDEsZydgL2xpYgotICAgIGlmIHRlc3QgLWQgJHtnY2NsaWJzfS9sZHNjcmlwdHMgLWEgLWYgJHtnY2NsaWJzfS9saWJjLmEgLWEgLWYgJHtnY2NsaWJzfS9saWJzdGRjKysuYSA7IHRoZW4KLQlnY2NsaWJzPXllcwotICAgIGVsc2UKLQlnY2NsaWJzPW5vCi0gICAgZmkKLWZpCi0KLWRubCBJZiBldmVyeXRoaW5nIGlzIE9LLCB0aGVuIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoZSBjb21waWxlciB3b3Jrcy4KLWlmIHRlc3QgeCIke2djY2ZpbGVzfSIgPSB4bm8gLW8geCIke2djY2xpYnN9IiA9IHhubzsgdGhlbgotICAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPW5vCi0gICAgQUNfTVNHX0VSUk9SKCR7Q1hYfSBpcyBhIG5vbi13b3JraW5nIGNyb3NzIGNvbXBpbGVyKQotZWxzZQotICAgYWNfY3ZfcHJvZ19jeHhfd29ya3M9eWVzIAotZmkKLQotQUNfTEFOR19SRVNUT1JFCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9wcm9nX2N4eF93b3JrcykKLWlmIHRlc3QgeCIkYWNfY3ZfcHJvZ19jeHhfd29ya3MiID0geG5vOyB0aGVuCi0gIEFDX01TR19FUlJPUihbaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuXSkKLWZpCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIEcrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXJdKQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jeHhfY3Jvc3MpCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCi1BQ19TVUJTVChDWFgpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIGEgd29ya2luZyBHQ0MgY3Jvc3MgY29tcGlsZXIuIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdOVSBnY2MgY29tcGlsZXIuCi1kbmwgVGhpcyBpcyBiYXNlZCBvbiB0aGUgbWFjcm9zIGFib3ZlIGZvciBHKysuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19DQ19DUk9TUywKLVtBQ19CRUZPUkUoWyQwXSwgW0FDX1BST0dfQ0NQUF0pCi1BQ19DSEVDS19QUk9HUyhDQywgY2MsIGdjYykKLQotQ1lHX0FDX1BST0dfR0NDX1dPUktTCi0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKLWRubCBwbGF5cyBhcm91bmQgd2l0aCBDRkxBR1MgKHN1Y2ggYXMgdG8gYnVpbGQgYm90aCBkZWJ1Z2dpbmcgYW5kCi1kbmwgbm9ybWFsIHZlcnNpb25zIG9mIGEgbGlicmFyeSksIHRhc3RlbGVzcyBhcyB0aGF0IGlkZWEgaXMuCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBBQ19QUk9HX0NDX0cKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdYWD0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi1dKQotCi1kbmwgU2VlIGlmIHRoZSBHQ0MgY29tcGlsZXIgd2UgZm91bmQgd29ya3MuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19HQ0NfV09SS1MsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHY2MgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBhY3R1YWxseSB3b3Jrc10pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQwotZG5sIFRyeSBhIHRlc3QgY2FzZS4gV2Ugb25seSBjb21waWxlLCBiZWNhdXNlIGl0J3MgY2xvc2UgdG8gaW1wb3NzaWJsZQotZG5sIHRvIGdldCBhIGNvcnJlY3QgZnVsbHkgbGlua2VkIGV4ZWN1dGFibGUgd2l0aCBhIGNyb3NzCi1kbmwgY29tcGlsZXIuIEZvciBtb3N0IGNyb3NzIGNvbXBpbGVycywgdGhpcyB0ZXN0IGlzIGJvZ3VzLiBGb3IgRysrLAotZG5sIHdlIGNhbiB1c2UgdmFyaW91cyBvdGhlciBjb21waWxlIGxpbmUgb3B0aW9ucyB0byBnZXQgYSBkZWNlbnQgaWRlYQotZG5sIHRoYXQgdGhlIGNyb3NzIGNvbXBpbGVyIGFjdHVhbGx5IGRvZXMgd29yaywgZXZlbiB0aG91Z2ggd2UgY2FuJ3QKLWRubCBwcm9kdWNlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCBtb3JlIGluZm8gYWJvdXQgdGhlIHRhcmdldCBpdCdzCi1kbmwgYmVpbmcgY29tcGlsZWQgZm9yLiBUaGlzIG9ubHkgd29ya3MgZm9yIHRoZSBHTlUgQysrIGNvbXBpbGVyLgotCi1kbmwgVHJhbnNmb3JtIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byBpdCdzIGNyb3NzIHZhcmlhbnQsIHVubGVzcwotZG5sIENYWCBpcyBzZXQuIFRoaXMgaXMgYWxzbyB3aGF0IENDIGdldHMgc2V0IHRvIGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuCi1pZiB0ZXN0IHgiJHtDQ30iID0geGNjIDsgdGhlbgotICAgIENDPWBlY2hvIGdjYyB8IHNlZCAtZSAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSJgCi1maQotCi1kbmwgR2V0IEdjYydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotbGliZ2NjcGF0aD1gJHtDQ30gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2djYz1ubwotZmkKLQotZG5sIElmIHdlIGFyZSB1c2luZyBHY2MsIGxvb2sgZm9yIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gZXhpc3QgaWYgdGhpcwotZG5sIGNvbXBpbGVyIHdvcmtzLgotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19nY2N9IiA9IHh5ZXMgOyB0aGVuCi0gICAgZ2NjZmlsZXM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6L2xpYmdjYy5hOjonYAotICAgIGlmIHRlc3QgLWYgJHtnY2NmaWxlc30vc3BlY3MgLWEgLWYgJHtnY2NmaWxlc30vY3BwIC1hIC1mICR7Z2NjZmlsZXN9L2NjMXBsdXM7IHRoZW4KLQlnY2NmaWxlcz15ZXMKLSAgICBlbHNlCi0JZ2NjZmlsZXM9bm8KLSAgICBmaQotICAgIGdjY2xpYnM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6bGliL2djYy1saWIvOjonIC1lICdzOi9saWJnY2MuYTo6JyAtZSAncyxcKC4qXCkvLiosXDEsZydgL2xpYgotICAgIGlmIHRlc3QgLWQgJHtnY2NsaWJzfS9sZHNjcmlwdHMgLWEgLWYgJHtnY2NsaWJzfS9saWJjLmEgLWEgLWYgJHtnY2NsaWJzfS9saWJzdGRjKysuYSA7IHRoZW4KLQlnY2NsaWJzPXllcwotICAgIGVsc2UKLQlnY2NsaWJzPW5vCi0gICAgZmkKLWZpCi0KLWRubCBJZiBldmVyeXRoaW5nIGlzIE9LLCB0aGVuIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoZSBjb21waWxlciB3b3Jrcy4KLWlmIHRlc3QgeCIke2djY2ZpbGVzfSIgPSB4bm8gLW8geCIke2djY2xpYnN9IiA9IHhubzsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLSAgICBBQ19NU0dfRVJST1IoJHtDQ30gaXMgYSBub24td29ya2luZyBjcm9zcyBjb21waWxlcikgICAgCi1lbHNlCi0gICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLWZpCi0KLUFDX0xBTkdfUkVTVE9SRQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jY193b3JrcykKLWlmIHRlc3QgeCIkYWNfY3ZfcHJvZ19jY193b3JrcyIgPSB4bm87IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDKysgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy5dKQotZmkKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgR2NjIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlcl0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9wcm9nX2NjX2Nyb3NzKQotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi1BQ19TVUJTVChDQykKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIEJGRCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gYWNjZXNzIGFuZAotZG5sIG1hbmlwdWxhdGUgb2JqZWN0IG9yIGV4ZWN1dGFibGUgZmlsZXMuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9CRkQsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGJmZCBoZWFkZXIgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotZG5sIExvb2sgZm9yIHRoZSBoZWFkZXIgZmlsZQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfYmZkaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9iZmQvYmZkLmgiIDsgdGhlbgotCWFjX2N2X2NfYmZkaD1gKGNkICRpL2JmZDsgcHdkKWAKLQlicmVhawotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19iZmRofSIgIT0geDsgdGhlbgotICAgIEJGREhESVI9Ii1JJHthY19jdl9jX2JmZGh9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2JmZGh9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChCRkRIRElSKQotCi1kbmwgTG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGJmZCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfYmZkbGliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2JmZC9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19iZmRsaWI9YChjZCAkaS9iZmQ7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1kbmwgV2UgbGlzdCB0d28gZGlyZWN0b3JpZXMgY2F1c2UgYmZkIG5vdyB1c2VzIGxpYnRvb2wKLWlmIHRlc3QgeCIke2FjX2N2X2NfYmZkbGlifSIgIT0geDsgdGhlbgotICAgIEJGRExJQj0iLUwke2FjX2N2X2NfYmZkbGlifSAtTCR7YWNfY3ZfY19iZmRsaWJ9Ly5saWJzIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2JmZGxpYn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKEJGRExJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiBUaGlzIGRlZmluZXMgbWFueSBjb21tb25seSB1c2VkIEMKLWRubCBmdW5jdGlvbnMgdGhhdCBleGlzdHMgaW4gdmFyaW91cyBzdGF0ZXMgYmFzZWQgb24gdGhlIHVuZGVybHlpbmcgT1MuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJFUlRZLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBsaWJlcnR5IGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliZXJ0eSxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9saWJpYmVydHkvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfbGliZXJ0eT1gKGNkICRpL2xpYmliZXJ0eTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZXJ0eX0iICE9IHg7IHRoZW4KLSAgICBMSUJFUlRZPSItTCR7YWNfY3ZfY19saWJlcnR5fSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saWJlcnR5fSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoTElCRVJUWSkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIG9wY29kZXMgbGlicmFyeS4gVGhpcyBpcyB1c2VkIHRvIGRvIGRpc3Nhc2VtYmxpZXMuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9PUENPREVTLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBvcGNvZGVzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2Nfb3BjLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL29wY29kZXMvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2Nfb3BjPWAoY2QgJGkvb3Bjb2RlczsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfb3BjfSIgIT0geDsgdGhlbgotICAgIE9QQ09ERVNMSUI9Ii1MJHthY19jdl9jX29wY30iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfb3BjfSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoT1BDT0RFU0xJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIExvb2sgZm9yIHRoZSBEZWphR251IGhlYWRlciBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZS4gVGhpcyBmaWxlCi1kbmwgZGVmaW5lcyB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gdGVzdGluZyBzdXBwb3J0LgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfREVKQUdOVSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgdGVzdGluZyBzdXBwb3J0IGZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19kZWphZ251LFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRzcmNkaXIvJGkvZWNjL2VjYy9pbmZyYS90ZXN0bGliL2N1cnJlbnQvaW5jbHVkZS9kZWphZ251LmgiIDsgdGhlbgotCWFjX2N2X2NfZGVqYWdudT1gKGNkICRzcmNkaXIvJGkvZWNjL2VjYy9pbmZyYS90ZXN0bGliL2N1cnJlbnQvaW5jbHVkZTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfZGVqYWdudX0iICE9IHg7IHRoZW4KLSAgICBERUpBR05VSERJUj0iLUkke2FjX2N2X2NfZGVqYWdudX0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfZGVqYWdudX0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2RlamFnbnVsaWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kaS9pbmZyYS90ZXN0bGliL2N1cnJlbnQvbGliL2hvc3R1dGlsLmV4cCIgOyB0aGVuCi0JYWNfY3ZfY19kZWphZ251bGliPWAoY2QgJHNyY2Rpci8kaS9pbmZyYS90ZXN0bGliL2N1cnJlbnQvbGliOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19kZWphZ251bGlifSIgIT0geDsgdGhlbgotICAgIERFSkFHTlVMSUI9IiR7YWNfY3ZfY19kZWphZ251bGlifSIKLWVsc2UKLSAgICBERUpBR05VTElCPSIiCi1maQotQUNfTVNHX0NIRUNLSU5HKGZvciBydW50ZXN0IGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3J1bnRlc3QsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kaS9kZWphZ251L3J1bnRlc3QiIDsgdGhlbgotCWFjX2N2X2NfcnVudGVzdD1gKGNkICRzcmNkaXIvJGkvZGVqYWdudTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfcnVudGVzdH0iICE9IHg7IHRoZW4KLSAgICBSVU5URVNURElSPSIke2FjX2N2X2NfcnVudGVzdH0iCi0gICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19ydW50ZXN0fSkKLWVsc2UKLSAgICBSVU5URVNURElSPSIiCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKFJVTlRFU1RESVIpCi1BQ19TVUJTVChERUpBR05VTElCKQotQUNfU1VCU1QoREVKQUdOVUhESVIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBsaWJpbnRsIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUuIFRoaXMgaXMgZm9yCi1kbmwgIGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JTlRMLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBpbnRsIGhlYWRlciBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1kbmwgTG9vayBmb3IgdGhlIGhlYWRlciBmaWxlCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbnRsaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9pbnRsL2xpYmludGwuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbnRsaD1gKGNkICRpL2ludGw7IHB3ZClgCi0JYnJlYWsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaW50bGh9IiAhPSB4OyB0aGVuCi0gICAgSU5UTEhESVI9Ii1JJHthY19jdl9jX2ludGxofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbnRsaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKElOVExIRElSKQotCi1kbmwgTG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGxpYmludGwgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2ludGxsaWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvaW50bC9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19pbnRsbGliPWAoY2QgJGkvaW50bDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaW50bGxpYn0iICE9IHg7IHRoZW4KLSAgICBJTlRMTElCPSItTCR7YWNfY3ZfY19pbnRsbGlifSAtbGludGwiCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaW50bGxpYn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKElOVExMSUIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBzaW11bGF0b3IgbGlicmFyeS4KLUFDX0RFRlVOKENZR19BQ19QQVRIX1NJTSwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWNhc2UgIiR0YXJnZXRfY3B1IiBpbgotICAgIHBvd2VycGMpCXRhcmdldF9kaXI9cHBjIDs7Ci0gICAgc3BhcmMqKQl0YXJnZXRfZGlyPWVyYzMyIDs7Ci0gICAgbWlwcyopCXRhcmdldF9kaXI9bWlwcyA7OwotICAgICopCQl0YXJnZXRfZGlyPSR0YXJnZXRfY3B1IDs7Ci1lc2FjCi1kbmwgRmlyc3QgbG9vayBmb3IgdGhlIGhlYWRlciBmaWxlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBzaW11bGF0b3IgaGVhZGVyIGZpbGUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19zaW1oLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbmNsdWRlL3JlbW90ZS1zaW0uaCIgOyB0aGVuCi0JYWNfY3ZfY19zaW1oPWAoY2QgJHtzcmNkaXJ9LyRpL2luY2x1ZGU7IHB3ZClgCi0JYnJlYWsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfc2ltaH0iICE9IHg7IHRoZW4KLSAgICBTSU1IRElSPSItSSR7YWNfY3ZfY19zaW1ofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19zaW1ofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoU0lNSERJUikKLQotZG5sIFNlZSB3aGV0aGVyIGl0J3MgYSBkZXZvIG9yIEZvdW5kcnkgYnJhbmNoIHNpbXVsYXRvcgotQUNfTVNHX0NIRUNLSU5HKFdoZXRoZXIgdGhpcyBpcyBhIGRldm8gc2ltdWxhdG9yICkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3NpbWRldm8sWwotICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJFNJTUhESVIiCi0gICAgQUNfRUdSRVBfSEVBREVSKFtTSU1fREVTQyBzaW1fb3Blbi4qc3RydWN0IF9iZmRdLCByZW1vdGUtc2ltLmgsCi0gICAgICAgIGFjX2N2X2Nfc2ltZGV2bz15ZXMsCi0gICAgICAgIGFjX2N2X2Nfc2ltZGV2bz1ubykKLV0pCi1pZiB0ZXN0IHgiJGFjX2N2X2Nfc2ltZGV2byIgPSB4InllcyIgOyB0aGVuCi0gICAgQUNfREVGSU5FKEhBVkVfREVWT19TSU0pCi1maQotQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfc2ltZGV2b30pCi1BQ19TVUJTVChIQVZFX0RFVk9fU0lNKQotCi1kbmwgTmV4dCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgc2ltdWxhdG9yIGxpYnJhcnkpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19zaW1saWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvc2ltLyR0YXJnZXRfZGlyL01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX3NpbWxpYj1gKGNkICRpL3NpbS8kdGFyZ2V0X2RpcjsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfc2ltbGlifSIgIT0geDsgdGhlbgotICAgIFNJTUxJQj0iLUwke2FjX2N2X2Nfc2ltbGlifSIKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICAgZG5sIEZJWE1FOiB0aGlzIGlzIGtpbmRhIGJvZ3VzLCBjYXVzZSB1bXRpbWF0ZWx5IHRoZSBUTSB3aWxsIGJ1aWxkCi0gICAgZG5sIGFsbCB0aGUgbGlicmFyaWVzIGZvciBzZXZlcmFsIGFyY2hpdGVjdHVyZXMuIEJ1dCBmb3Igbm93LCB0aGlzCi0gICAgZG5sIHdpbGwgd29yayB0aWxsIHRoZW4uCi1kbmwgICAgIEFDX01TR19DSEVDS0lORyhmb3IgdGhlIHNpbXVsYXRvciBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIgbGlicmFyaWVzKQotICAgIGRubCBUcmFuc2Zvcm0gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIGl0J3MgY3Jvc3MgdmFyaWFudCwgdW5sZXNzCi0gICAgZG5sIENYWCBpcyBzZXQuIFRoaXMgaXMgYWxzbyB3aGF0IENYWCBnZXRzIHNldCB0byBpbiB0aGUgZ2VuZXJhdGVkCi0gICAgZG5sIE1ha2VmaWxlLgotICAgIENST1NTX0dDQz1gZWNobyBnY2MgfCBzZWQgLWUgInMvXi8kdGFyZ2V0LyJgCi0KLSAgICBkbmwgR2V0IEcrKydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotY2hhbmdlcXVvdGUoLCkKLSAgICBnY2NwYXRoPWAke0NST1NTX0dDQ30gLS1wcmludC1saWJnY2MgfCBzZWQgLWUgJ3M6W2EtejAtOUEtWlwuXC1dKi9saWJnY2MuYTo6JyAtZSAnczpsaWIvZ2NjLWxpYi86OidgbGliCi1jaGFuZ2VxdW90ZShbLF0pCi0gICAgaWYgdGVzdCAtZiAkZ2NjcGF0aC9saWJzaW0uYSAtbyAtZiAkZ2NjcGF0aC9saWJzaW0uc28gOyB0aGVuCi0gICAgICAgIGFjX2N2X2Nfc2ltbGliPSIkZ2NjcGF0aC8iCi0gICAgICAgIFNJTUxJQj0iLUwke2FjX2N2X2Nfc2ltbGlifSIKLQlBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19zaW1saWJ9KQotICAgIGVsc2UKLSAgICAgICAgQU1fQ09ORElUSU9OQUwoUFNJTSwgdGVzdCB4JHBzaW0gPSB4bm8pCi0JU0lNTElCPSIiCi0JQUNfTVNHX1JFU1VMVChub25lKQotZG5sICAgICAgICAgYWNfY3ZfY19zaW1saWI9bm9uZQotICAgIGZpCi1maQotQUNfU1VCU1QoU0lNTElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJJQkVSVFksIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2xpYmliZXJ0eS9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19saWJpYj1gKGNkICRpL2xpYmliZXJ0eS87IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmlifSIgIT0geDsgdGhlbgotICAgIExJQklCRVJUWT0iLUwke2FjX2N2X2NfbGliaWJ9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmlifSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoTElCSUJFUlRZKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BQ19ERUZVTihDWUdfQUNfUEFUSF9ERVZPLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGRldm8gaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfZGV2b2gsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2luY2x1ZGUvcmVtb3RlLXNpbS5oIiA7IHRoZW4KLQlhY19jdl9jX2Rldm9oPWAoY2QgJHtzcmNkaXJ9LyRpL2luY2x1ZGU7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2Rldm9ofSIgIT0geDsgdGhlbgotICAgIERFVk9IRElSPSItSSR7YWNfY3ZfY19kZXZvaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfZGV2b2h9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChERVZPSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIGZpbmQgdGhlIElERSBsaWJyYXJ5IGFuZCBoZWFkZXJzLgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSURFLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElERSBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1JREVIRElSPQotSURFTElCPQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRlaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvbGliaWRlL3NyYy9ldmVudC5oIiA7IHRoZW4KLQlhY19jdl9jX2lkZWg9YChjZCAke3NyY2Rpcn0vJGkvbGliaWRlL3NyYzsgcHdkKWA7Ci0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWh9IiAhPSB4OyB0aGVuCi0gICAgSURFSERJUj0iLUkke2FjX2N2X2NfaWRlaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBMSUJJREUgVENMIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRldGNsaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvbGliaWRldGNsL3NyYy9pZGV0Y2wuaCIgOyB0aGVuCi0JYWNfY3ZfY19pZGV0Y2xoPWAoY2QgJHtzcmNkaXJ9LyRpL2xpYmlkZXRjbC9zcmM7IHB3ZClgOwotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGV0Y2xofSIgIT0geDsgdGhlbgotICAgIElERUhESVI9IiR7SURFSERJUn0gLUkke2FjX2N2X2NfaWRldGNsaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRldGNsaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgaGVhZGVycyBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZWgyLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2xpYmlkZS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfaWRlaDI9YChjZCAkaS9saWJpZGUvc3JjOyBwd2QpYDsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRlaDJ9IiAhPSB4OyB0aGVuCi0gICAgSURFSERJUj0iJHtJREVIRElSfSAtSSR7YWNfY3ZfY19pZGVoMn0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlaDJ9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLWRubCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZWxpYixbCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWxpYn0iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2xpYmlkZS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotICAgICAgICBhY19jdl9jX2lkZWxpYj1gKGNkICRpL2xpYmlkZS9zcmM7IHB3ZClgCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLWZpXSkgCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWxpYn0iICE9IHggOyB0aGVuCi0gICAgIElERUxJQj0iLUwke2FjX2N2X2NfaWRlbGlifSIKLSAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlbGlifSkKLWVsc2UKLSAgICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotZG5sIGZpbmQgbGliaWRkZXRjbC5hIGlmIGl0IGV4aXN0cwotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgVENMIGxpYnJhcnkpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGV0Y2xsaWIsWwotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGV0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9saWJpZGV0Y2wvc3JjL01ha2VmaWxlIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pZGV0Y2xsaWI9YChjZCAkaS9saWJpZGV0Y2wvc3JjOyBwd2QpYAotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi1maQotXSkgCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZXRjbGxpYn0iICE9IHggOyB0aGVuCi0gICAgIElERUxJQj0iJHtJREVMSUJ9IC1MJHthY19jdl9jX2lkZXRjbGxpYn0iCi0gICAgIElERVRDTExJQj0iLWxpZGV0Y2wiCi0gICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZXRjbGxpYn0pCi1lbHNlCi0gICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChJREVIRElSKQotQUNfU1VCU1QoSURFTElCKQotQUNfU1VCU1QoSURFVENMTElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCBhbGwgdGhlIElMVSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lMVSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUga2VybmVsIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2tlcm5lbC9tZXRob2QuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoPWAoY2QgJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2tlcm5lbDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aH0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSItSSR7YWNfY3ZfY19pbHVofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBrZXJuZWwgaGVhZGVycyBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVoNSxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9pbHUvcnVudGltZS9rZXJuZWwvaWx1Y29uZi5oIiA7IHRoZW4KLQlhY19jdl9jX2lsdWg1PWAoY2QgJGkvaWx1L3J1bnRpbWUva2VybmVsOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoNX0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWg1fSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoNX0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgQysrIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jcHAvcmVzb3VyY2UuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoMj1gKGNkICR7c3JjZGlyfS8kaS9pbHUvc3R1YmJlcnMvY3BwOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoMn0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWgyfSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoMn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgQyBoZWFkZXJzKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDMsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jL3Jlc291cmNlLmgiIDsgdGhlbgotCWFjX2N2X2NfaWx1aDM9YChjZCAke3NyY2Rpcn0vJGkvaWx1L3N0dWJiZXJzL2MgIDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aDN9IiAhPSB4OyB0aGVuCi0gICAgSUxVSERJUj0iJHtJTFVIRElSfSAtSSR7YWNfY3ZfY19pbHVoM30iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aDN9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgSUxVIEMgcnVudGltZSBoZWFkZXJzKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDQsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2MvaWx1Y3N0dWIuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoND1gKGNkICR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9jICA7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWg0fSIgIT0geDsgdGhlbgotICAgIElMVUhESVI9IiR7SUxVSERJUn0gLUkke2FjX2N2X2NfaWx1aDR9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWg0fSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVwYXRoLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2lsdS9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19pbHVwYXRoPWAoY2QgJGkvaWx1OyBwd2QpYAotCWJyZWFrCi0gICAgZmkKLWRvbmUKLV0pCi1JTFVUT1A9JHthY19jdl9jX2lsdXBhdGh9Ci0KLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliLFsKLWlmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9rZXJuZWwvTWFrZWZpbGUiIDsgdGhlbgotICAgIGFjX2N2X2NfaWx1bGliPWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2tlcm5lbDsgcHdkKWAKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWJ9L2xpYmlsdS5hKQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm8pCi1maV0pCi0gICAKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBDKysgYmluZGluZ3MgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYjIsWwotaWYgdGVzdCAtZiAiJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2NwcC9NYWtlZmlsZSIgOyB0aGVuCi0gICAgYWNfY3ZfY19pbHVsaWIyPWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2NwcDsgcHdkKWAKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWIyfS9saWJpbHUtYysrLmEpCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLWZpXSkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgSUxVIEMgYmluZGluZ3MgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYjMsWwotaWYgdGVzdCAtZiAiJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2MvTWFrZWZpbGUiIDsgdGhlbgotICAgIGFjX2N2X2NfaWx1bGliMz1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jOyBwd2QpYAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJHthY19jdl9jX2lsdWxpYjN9L2xpYmlsdS1jLmEpCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLWZpXSkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgSUxVIFRrIGJpbmRpbmdzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWI0LFsKLWlmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9tYWlubG9vcC9NYWtlZmlsZSIgOyB0aGVuCi0gICAgYWNfY3ZfY19pbHVsaWI0PWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL21haW5sb29wOyBwd2QpYAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJHthY19jdl9jX2lsdWxpYjR9L2xpYmlsdS10ay5hKQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm8pCi1maV0pCi0KLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1bGlifSIgPSB4IC1hIHgiJHthY19jdl9jX2lsdWxpYjJ9IiA9IHg7IHRoZW4KLSAgSUxVSERJUj0iIgotZmkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVsaWJ9IiAhPSB4IC1hIHgiJHthY19jdl9jX2lsdWxpYjJ9IiAhPSB4OyB0aGVuCi0gICAgSUxVTElCPSItTCR7YWNfY3ZfY19pbHVsaWJ9IC1MJHthY19jdl9jX2lsdWxpYjJ9IC1MJHthY19jdl9jX2lsdWxpYjN9IC1MJHthY19jdl9jX2lsdWxpYjR9IgotZWxzZQotICAgIElMVUxJQj0iIgotZmkKLQotaWYgdGVzdCB4IiR7SUxVTElCfSIgPSB4OyB0aGVuCi0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgbGlicmFyaWVzIGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlcikKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWI1LFsKLSAgICBOQVRJVkVfR0NDPWBlY2hvIGdjYyB8IHNlZCAtZSAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSJgCi0KLSAgICBkbmwgR2V0IEcrKydzIGZ1bGwgcGF0aCB0byBpdCdzIGxpYnJhcmllcwotICAgIGFjX2N2X2NfaWx1bGliNT1gJHtOQVRJVkVfR0NDfSAtLXByaW50LWxpYmdjYyB8IHNlZCAtZSAnczpsaWIvZ2NjLWxpYi8uKjo6J2BsaWIKLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2lsdWxpYjUvbGliaWx1LWMuYSAtbyAtZiAkYWNfY3ZfY19pbHVsaWI1L2xpYmlsdS1jLnNvIDsgdGhlbgotICAgICAgICBpZiB0ZXN0IHgiJHtJTFVIRElSfSIgPSB4OyB0aGVuCi0gICAgICAgICAgICAgICBJTFVIRElSPSItSSR7YWNfY3ZfY19pbHVsaWI1fS8uLi9pbmNsdWRlIgotICAgICAgICBmaQotICAgICAgICBJTFVMSUI9Ii1MJHthY19jdl9jX2lsdWxpYjV9IgotICAgICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVsaWI1fSkKLSAgICBlbHNlCi0gICAgICAgIGFjX2N2X2NfaWx1bGliPW5vbmUKLSAgICAgICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgIGZpCi1maV0pCi1BQ19TVUJTVChJTFVIRElSKQotQUNfU1VCU1QoSUxVTElCKQotQUNfU1VCU1QoSUxVVE9QKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgVGhpcyBkZWZpbmVzIHRoZSBieXRlIG9yZGVyIGZvciB0aGUgaG9zdC4gV2UgY2FuJ3QgdXNlCi1kbmwgQUNfQ19CSUdFTkRJQU4sIGNhdXNlIHdlIHdhbnQgdG8gY3JlYXRlIGEgY29uZmlnIGZpbGUgYW5kCi1kbmwgc3Vic3RpdHVlIHRoZSByZWFsIHZhbHVlLCBzbyB0aGUgaGVhZGVyIGZpbGVzIHdvcmsgcmlnaHQKLUFDX0RFRlVOKENZR19BQ19DX0VORElBTiwgWwotQUNfTVNHX0NIRUNLSU5HKHRvIHNlZSBpZiB0aGlzIGlzIGEgbGl0dGxlIGVuZGlhbiBob3N0KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGl0dGxlX2VuZGlhbiwgWwotYWNfY3ZfY19saXR0bGVfZW5kaWFuPXVua25vd24KLSMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCi1BQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPl0sIFsKLSNpZiAhQllURV9PUkRFUiB8fCAhX0JJR19FTkRJQU4gfHwgIV9MSVRUTEVfRU5ESUFOCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmXSwgWyMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0xJVFRMRV9FTkRJQU4gb3Igbm90LgotQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD5dLCBbCi0jaWYgQllURV9PUkRFUiAhPSBfTElUVExFX0VORElBTgotIG5vdCBiaWcgZW5kaWFuCi0jZW5kaWZdLCBhY19jdl9jX2xpdHRsZV9lbmRpYW49eWVzLCBhY19jdl9jX2xpdHRsZV9lbmRpYW49bm8pCi1dKQotaWYgdGVzdCAke2FjX2N2X2NfbGl0dGxlX2VuZGlhbn0gPSB1bmtub3duOyB0aGVuCi1vbGRfY2ZsYWdzPSRDRkxBR1MKLUNGTEFHUz0tZwotQUNfVFJZX1JVTihbCi1tYWluICgpIHsKLSAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsOwotICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICBleGl0ICh1LmNbMF0gPT0gMSk7Ci19XSwKLWFjX2N2X2NfbGl0dGxlX2VuZGlhbj1ubywKLWFjX2N2X2NfbGl0dGxlX2VuZGlhbj15ZXMsWwotZG5sIFllcywgdGhpcyBpcyB1Z2x5LCBhbmQgb25seSB1c2VkIGZvciBhIGNhbmFkaWFuIGNyb3NzIGFueXdheS4gVGhpcwotZG5sIGlzIGp1c3QgdG8ga2VlcCBjb25maWd1cmUgZnJvbSBzdG9wcGluZyBoZXJlLgotY2FzZSAiJHtob3N0fSIgaW4KLWNoYW5nZXF1b3RlKCwpCi0gICBpWzM0NTZdODYtKi0qKSBhY19jdl9jX2xpdHRsZV9lbmRpYW49eWVzIDs7Ci0gICBzcGFyYyotKi0qKSAgICBhY19jdl9jX2xpdHRsZV9lbmRpYW49bm8gOzsKLWNoYW5nZXF1b3RlKFssXSkKLSAgKikgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgY3Jvc3MgY29tcGlsZSB0aGlzIHRlc3QpIDs7Ci1lc2FjXSkKLUNGTEFHUz0kb2xkX2NmbGFncwotZmldKQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpdHRsZV9lbmRpYW59IiA9IHh5ZXM7IHRoZW4KLSAgICBBQ19ERUZJTkUoTElUVExFX0VORElBTl9IT1NUKQotICAgIEVORElBTj0iQ1lHX0xTQkZJUlNUIjsKLWVsc2UKLSAgICBFTkRJQU49IkNZR19NU0JGSVJTVCI7Ci1maQotQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGl0dGxlX2VuZGlhbn0pCi1BQ19TVUJTVChFTkRJQU4pCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBMb29rIGZvciB0aGUgcGF0aCB0byBsaWJnY2MsIHNvIHdlIGNhbiB1c2UgaXQgdG8gZGlyZWN0bHkgbGluawotZG5sIGluIGxpYmdjYy5hIHdpdGggTEQuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHQ0MsCi1bQUNfTVNHX0NIRUNLSU5HKFtMb29raW5nIGZvciB0aGUgcGF0aCB0byBsaWJnY2MuYV0pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQwotCi1kbmwgR2V0IEdjYydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotbGliZ2NjcGF0aD1gJHtDQ30gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2djYz1ubwotZmkKLQotZG5sIAotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19nY2N9IiA9IHh5ZXMgOyB0aGVuCi0gICBnY2NwYXRoPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi9saWJnY2MuYTo6J2AKLSAgIExJQkdDQz0iLUwke2djY3BhdGh9IgotICAgQUNfTVNHX1JFU1VMVCgke2djY3BhdGh9KQotZWxzZQotICAgTElCR0NDPSIiCi0gICBBQ19NU0dfRVJST1IoTm90IHVzaW5nIGdjYykKLWZpCi0KLUFDX0xBTkdfUkVTVE9SRQotQUNfU1VCU1QoTElCR0NDKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi1kbmwgV2FybmluZzogdHJhbnNpdGlvbiBvZiB2ZXJzaW9uIDkgdG8gMTAgd2lsbCBicmVhayB0aGlzIGFsZ29yaXRobQotZG5sIGJlY2F1c2UgMTAgc29ydHMgYmVmb3JlIDkuIFdlIGFsc28gbG9vayBmb3IganVzdCB0Y2wuIFdlIGhhdmUgdG8KLWRubCBiZSBjYXJlZnVsIHRoYXQgd2UgZG9uJ3QgbWF0Y2ggc3R1ZmYgbGlrZSB0Y2xYIGJ5IGFjY2lkZW50LgotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10Y2xpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9UQ0wsIFsKLSAgICBDWUdfQUNfUEFUSF9UQ0xICi0gICAgQ1lHX0FDX1BBVEhfVENMQ09ORklHCi0gICAgQ1lHX0FDX0xPQURfVENMQ09ORklHCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVENMSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX3RjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIFRjbCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0FSR19XSVRIKHRjbGluY2x1ZGUsIFsgIC0td2l0aC10Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0Y2wgaGVhZGVycyBhcmVdLCB3aXRoX3RjbGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3RjbGgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX3RjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF90Y2xpbmNsdWRlfS90Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYy90Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGNsIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX3RjbGNvbmZpZy8kaS9nZW5lcmljL3RjbC5oIDsgdGhlbgotICAgICAgYWNfY3ZfY190Y2xoPWAoY2QgJGFjX2N2X2NfdGNsY29uZmlnLyRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUY2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICB0Y2xwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBUY2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJHRjbHBhdGgvdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfdGNsaD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgY2hlY2sgaWYgaXRzIGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlcgotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0gICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvaW5jbHVkZQotICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90Y2wuaDsgdGhlbgotICAgICAgICBhY19jdl9jX3RjbGg9JGNjcGF0aAotICAgIGZpCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgIEFDX0NIRUNLX0hFQURFUih0Y2wuaCwgYWNfY3ZfY190Y2xoPWluc3RhbGxlZCwgYWNfY3ZfY190Y2xoPSIiKQotZWxzZQotICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGNsaH0pCi1maQotXSkKLSAgVENMSERJUj0iIgotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBhbnkgVGNsIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iICE9IHggOyB0aGVuCi0gICAgbm9fdGNsPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotCWlmIHRlc3QgeCIke0NDfSIgPSB4Y2wgOyB0aGVuCi0JICAgIHRtcD0iYGN5Z3BhdGggLS13aW5kb3dzICR7YWNfY3ZfY190Y2xofWAiCi0JICAgIGFjX2N2X2NfdGNsaD0iYGVjaG8gJHRtcCB8IHNlZCAtZSBzI1xcXFxcXFxcIy8jZ2AiCi0JZmkKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGNsaH0pCi0gICAgICAgIFRDTEhESVI9Ii1JJHthY19jdl9jX3RjbGh9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUQ0xIRElSKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgdGNsIGNvbmZpZ3VyYXRpb24KLUFDX0RFRlVOKENZR19BQ19QQVRIX1RDTENPTkZJRywgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGNsY29uZmlnCi1pZiB0ZXN0IHgiJHtub190Y2x9IiA9IHggOyB0aGVuCi0gIGRubCB3ZSByZXNldCBub190Y2wgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX3RjbD10cnVlCi0gICAgQUNfQVJHX1dJVEgodGNsY29uZmlnLCBbICAtLXdpdGgtdGNsY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0Y2wgY29uZmlndXJhdGlvbiAodGNsQ29uZmlnLnNoKV0sCi0gICAgICAgICB3aXRoX3RjbGNvbmZpZz0ke3dpdGh2YWx9KQotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFRjbCBjb25maWd1cmF0aW9uIHNjcmlwdF0pCi0gICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGNsY29uZmlnLFsKLQotICAgIGRubCBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgotICAgIGlmIHRlc3QgeCIke3dpdGhfdGNsY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt3aXRoX3RjbGNvbmZpZ30vdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJHt3aXRoX3RjbGNvbmZpZ307IHB3ZClgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RjbGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0Y2xDb25maWcuc2hdKQotICAgICAgICBmaQotICAgIGZpCi0KLSAgICBkbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGNsIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgc291cmNlIHRyZWUKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvJGkvdW5peC90Y2xDb25maWcuc2ggOyB0aGVuCi0gICAgICAgICAgICAgICAgYWNfY3ZfY190Y2xjb25maWc9YChjZCAkc3JjZGlyLyRpL3VuaXg7IHB3ZClgCi0JICAgICAgICBicmVhawotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi0gICAgZG5sIGNoZWNrIGluIGEgZmV3IG90aGVyIGxvY2F0aW9ucwotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRjbCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkaS90Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgICAgICB0Y2xjb25mcGF0aD0kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotCi0gICAgICAgIGRubCBmaW5kIHRoZSBleGFjdCBUY2wgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICAgICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgICAgICBmb3IgaSBpbiBgbHMgLWRyICR0Y2xjb25mcGF0aC90Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtZiAkaS91bml4L3RjbENvbmZpZy5zaCA7IHRoZW4KLSAgICAgICAgICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICRpL3VuaXg7IHB3ZClgCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgZG5sIENoZWNrIHRvIHNlZSBpZiBpdCdzIGluc3RhbGxlZC4gV2UgaGF2ZSB0byBsb29rIGluIHRoZSAkQ0MgcGF0aAotICAgIGRubCB0byBmaW5kIGl0LCBjYXVzZSBvdXIgJHByZWZpeCBtYXkgbm90IG1hdGNoIHRoZSBjb21waWxlcnMuCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0JY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvbGliCi0gICAgICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90Y2xDb25maWcuc2g7IHRoZW4KLQkgICAgYWNfY3ZfY190Y2xjb25maWc9JGNjcGF0aAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkJZG5sIGVuZCBvZiBjYWNoZV92YWwKLQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBUQ0xDT05GSUc9IiIKLSAgICAgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUY2wgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgICBlbHNlCi0gICAgICAgIG5vX3RjbD0iIgotICAgICAgICBUQ0xDT05GSUc9JHthY19jdl9jX3RjbGNvbmZpZ30vdGNsQ29uZmlnLnNoCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHtUQ0xDT05GSUd9KQotICAgICBmaQotZmkKLUFDX1NVQlNUKFRDTENPTkZJRykKLV0pCi0KLWRubCBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi1kbmwgZnJvbSBQQVRIX1RDTENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9UQ0xDT05GSUcsIFsKLSAgICAuICRUQ0xDT05GSUcKLQotZG5sIEFDX1NVQlNUKFRDTF9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9NQUpPUl9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9NSU5PUl9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9DQykKLSAgICBBQ19TVUJTVChUQ0xfREVGUykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi0gICAgQUNfU1VCU1QoVENMX0xJQl9GSUxFKQotICAgIEFDX1NVQlNUKFRDTF9MSUJfRlVMTF9QQVRIKQotICAgIEFDX1NVQlNUKFRDTF9MSUJTKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVENMX1BSRUZJWCkKLQotICAgIEFDX1NVQlNUKFRDTF9DRkxBR1MpCi0KLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRDTF9FWEVDX1BSRUZJWCkKLQotICAgIEFDX1NVQlNUKFRDTF9TSExJQl9DRkxBR1MpCi0gICAgQUNfU1VCU1QoVENMX1NITElCX0xEKQotZG5sIGRvbid0IGV4cG9ydCwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKLWRubCBBQ19TVUJTVChUQ0xfU0hMSUJfTERfTElCUykKLWRubCBBQ19TVUJTVChUQ0xfU0hMSUJfU1VGRklYKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgQUNfU1VCU1QoVENMX0RMX0xJQlMpCi0gICAgQUNfU1VCU1QoVENMX0xEX0ZMQUdTKQotICAgIEFDX1NVQlNUKFRDTF9MRF9TRUFSQ0hfRkxBR1MpCi1kbmwgZG9uJ3QgZXhwb3J0LCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQotZG5sIEFDX1NVQlNUKFRDTF9DT01QQVRfT0JKUykKLSAgICBBQ19TVUJTVChUQ0xfUkFOTElCKQotICAgIEFDX1NVQlNUKFRDTF9CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChUQ0xfTElCX1NQRUMpCi1kbmwgQUNfU1VCU1QoVENMX0xJQl9WRVJTSU9OU19PSykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVENMX1NIQVJFRF9MSUJfU1VGRklYKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUQ0xfVU5TSEFSRURfTElCX1NVRkZJWCkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVEssIFsKLSAgICBDWUdfQUNfUEFUSF9US0gKLSAgICBDWUdfQUNfUEFUSF9US0NPTkZJRwotICAgIENZR19BQ19MT0FEX1RLQ09ORklHCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVEtILCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIHRrIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi0jIElmIHRoZSBkaXJlY3RvcnkgKHByZXN1bWFibHkgc3ltbGluaykgbmFtZWQgInRrIiBleGlzdHMsIHVzZSB0aGF0IG9uZQotIyBpbiBwcmVmZXJlbmNlIHRvIGFueSBvdGhlcnMuICBTYW1lIGxvZ2ljIGlzIHVzZWQgd2hlbiBjaG9vc2luZyBsaWJyYXJ5Ci0jIGFuZCBhZ2FpbiB3aXRoIFRjbC4gVGhlIHNlYXJjaCBvcmRlciBpcyB0aGUgYmVzdCBwbGFjZSB0byBsb29rIGZpcnN0LCB0aGVuIGluCi0jIGRlY3JlYXNpbmcgc2lnbmlmaWNhbmNlLiBUaGUgbG9vcCBicmVha3MgaWYgdGhlIHRyaWdnZXIgZmlsZSBpcyBmb3VuZC4KLSMgTm90ZSB0aGUgZ3Jvc3MgbGl0dGxlIGNvbnZlcnNpb24gaGVyZSBvZiBzcmNkaXIgYnkgY2QnaW5nIHRvIHRoZSBmb3VuZAotIyBkaXJlY3RvcnkuIFRoaXMgY29udmVydHMgdGhlIHBhdGggZnJvbSBhIHJlbGF0aXZlIHRvIGFuIGFic29sdXRlLCBzbwotIyByZWN1cnNpdmUgY2FjaGUgdmFyaWFibGVzIGZvciB0aGUgcGF0aCB3aWxsIHdvcmsgcmlnaHQuIFdlIGNoZWNrIGFsbAotIyB0aGUgcG9zc2libGUgcGF0aHMgaW4gb25lIGxvb3AgcmF0aGVyIHRoYW4gbWFueSBzZXBlcmF0ZSBsb29wcyB0byBzcGVlZAotIyB0aGluZ3MgdXAuCi0jIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10a2luY2x1ZGUKLSMKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub190az10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIFRrIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgodGtpbmNsdWRlLCBbICAtLXdpdGgtdGtpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0ayBoZWFkZXJzIGFyZV0sIHdpdGhfdGtpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY190a2gsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGtpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfdGtpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfdGtpbmNsdWRlfS90ay5oIDsgdGhlbgotICAgIGFjX2N2X2NfdGtoPWAoY2QgJHt3aXRoX3RraW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfdGtpbmNsdWRlfS9nZW5lcmljL3RrLmggOyB0aGVuCi0gICAgYWNfY3ZfY190a2g9YChjZCAke3dpdGhfdGtpbmNsdWRlfS9nZW5lcmljOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGtpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRrIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfdGtjb25maWcvJGkvZ2VuZXJpYy90ay5oIDsgdGhlbgotICAgICAgYWNfY3ZfY190a2g9YChjZCAkYWNfY3ZfY190a2NvbmZpZy8kaS9nZW5lcmljOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUayBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS90ayogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgdGtwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBUayBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUaywgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICR0a3BhdGgvdGsqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGsuaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX3RraD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlci4gV2UgZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiB1c2luZwotICAgIGRubCBBQ19DSEVDS19IRUFERVIsIGNhdXNlIHRoaXMgZG9lc24ndCBkZXBlbmQgaW4gaGF2aW5nIFggY29uZmlndXJlZC4KLSAgICBjY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9pbmNsdWRlCi0gICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RrLmg7IHRoZW4KLQlhY19jdl9jX3RraD0kY2NwYXRoCi0gICAgZmkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RraH0pCi1maQotXSkKLSAgVEtIRElSPSIiCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IFRrIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgIT0geCA7IHRoZW4KLSAgICBub190az0iIgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotCWlmIHRlc3QgeCIke0NDfSIgPSB4Y2wgOyB0aGVuCi0JICAgIHRtcD0iYGN5Z3BhdGggLS13aW5kb3dzICR7YWNfY3ZfY190a2h9YCIKLQkgICAgYWNfY3ZfY190a2g9ImBlY2hvICR0bXAgfCBzZWQgLWUgcyNcXFxcXFxcXCMvI2dgIgotCWZpCi0gICAgICAgIEFDX01TR19SRVNVTFQoW2ZvdW5kIGluICR7YWNfY3ZfY190a2h9XSkKLSAgICAgICAgVEtIRElSPSItSSR7YWNfY3ZfY190a2h9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUS0hESVIpCi1dKQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9US0NPTkZJRywgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGtjb25maWcKLWlmIHRlc3QgeCIke25vX3RrfSIgPSB4IDsgdGhlbgotICBkbmwgd2UgcmVzZXQgbm9fdGsgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX3RrPXRydWUKLSAgICBBQ19BUkdfV0lUSCh0a2NvbmZpZywgWyAgLS13aXRoLXRrY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0ayBjb25maWd1cmF0aW9uICh0a0NvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF90a2NvbmZpZz0ke3dpdGh2YWx9KQotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFRrIGNvbmZpZ3VyYXRpb24gc2NyaXB0XSkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY190a2NvbmZpZyxbCi0KLSAgICBkbmwgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10a2NvbmZpZyB3YXMgc3BlY2lmaWVkLgotICAgIGlmIHRlc3QgeCIke3dpdGhfdGtjb25maWd9IiAhPSB4IDsgdGhlbgotICAgICAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGtjb25maWd9L3RrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAke3dpdGhfdGtjb25maWd9OyBwd2QpYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0a0NvbmZpZy5zaF0pCi0gICAgICAgIGZpCi0gICAgZmkKLQotICAgIGRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUayBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvJGkvdW5peC90a0NvbmZpZy5zaCA7IHRoZW4KLSAgICAgICAgICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJHNyY2Rpci8kaS91bml4OyBwd2QpYAotCSAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotICAgIGRubCBjaGVjayBpbiBhIGZldyBvdGhlciBsb2NhdGlvbnMKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRrIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRpL3RrKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICAgICAgdGtjb25mcGF0aD0kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotCi0gICAgICAgIGRubCBmaW5kIHRoZSBleGFjdCBUayBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgICAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUaywgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICAgICAgZm9yIGkgaW4gYGxzIC1kciAkdGtjb25mcGF0aC90ayogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRpL3VuaXgvdGtDb25maWcuc2ggOyB0aGVuCi0gICAgICAgICAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICRpL3VuaXg7IHB3ZClgCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgZG5sIENoZWNrIHRvIHNlZSBpZiBpdCdzIGluc3RhbGxlZC4gV2UgaGF2ZSB0byBsb29rIGluIHRoZSAkQ0MgcGF0aAotICAgIGRubCB0byBmaW5kIGl0LCBjYXVzZSBvdXIgJHByZWZpeCBtYXkgbm90IG1hdGNoIHRoZSBjb21waWxlcnMuCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKLQljY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9saWIKLSAgICAgICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RrQ29uZmlnLnNoOyB0aGVuCi0JICAgIGFjX2N2X2NfdGtjb25maWc9JGNjcGF0aAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkJZG5sIGVuZCBvZiBjYWNoZV92YWwKLQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIFRLQ09ORklHPSIiCi0gICAgICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGsgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgICBlbHNlCi0gICAgICAgIG5vX3RrPSIiCi0gICAgICAgIFRLQ09ORklHPSR7YWNfY3ZfY190a2NvbmZpZ30vdGtDb25maWcuc2gKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke1RLQ09ORklHfSkKLSAgICAgZmkKLWZpCi1BQ19TVUJTVChUS0NPTkZJRykKLV0pCi0KLWRubCBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi1kbmwgZnJvbSBQQVRIX1RLQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX1RLQ09ORklHLCBbCi0gICAgaWYgdGVzdCAtZiAiJFRLQ09ORklHIiA7IHRoZW4KLSAgICAgIC4gJFRLQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKFRLX1ZFUlNJT04pCi1kbmwgbm90IGFjdHVhbGx5IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUS19NQUpPUl9WRVJTSU9OKQotZG5sICAgIEFDX1NVQlNUKFRLX01JTk9SX1ZFUlNJT04pCi0gICAgQUNfU1VCU1QoVEtfREVGUykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi0gICAgQUNfU1VCU1QoVEtfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoVEtfTElCX0ZVTExfUEFUSCkKLSAgICBBQ19TVUJTVChUS19MSUJTKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVEtfUFJFRklYKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUS19FWEVDX1BSRUZJWCkKLSAgICBBQ19TVUJTVChUS19CVUlMRF9JTkNMVURFUykKLSAgICBBQ19TVUJTVChUS19YSU5DTFVERVMpCi0gICAgQUNfU1VCU1QoVEtfWExJQlNXKQotICAgIEFDX1NVQlNUKFRLX0JVSUxEX0xJQl9TUEVDKQotICAgIEFDX1NVQlNUKFRLX0xJQl9TUEVDKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1pdGNsaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTCwgWwotICAgIENZR19BQ19QQVRIX0lUQ0xICi0gICAgQ1lHX0FDX1BBVEhfSVRDTExJQgotICAgIENZR19BQ19QQVRIX0lUQ0xTSAotICAgIENZR19BQ19QQVRIX0lUQ0xNS0lEWAotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xILCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9faXRjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIEl0Y2wgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSChpdGNsaW5jbHVkZSwgWyAgLS13aXRoLWl0Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBpdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF9pdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbGgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF9pdGNsaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9pdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYy9pdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggSXRjbCBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfaXRjbGNvbmZpZy8kaS9zcmMvaXRjbC5oIDsgdGhlbgotICAgICAgYWNfY3ZfY19pdGNsaD1gKGNkICRhY19jdl9jX2l0Y2xjb25maWcvJGkvc3JjOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgaXRjbHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IEl0Y2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgSXRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRpdGNscGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9zcmMvaXRjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfaXRjbGg9YChjZCAkaS9zcmM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCi0gICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICBBQ19DSEVDS19IRUFERVIoaXRjbC5oLCBhY19jdl9jX2l0Y2xoPWluc3RhbGxlZCwgYWNfY3ZfY19pdGNsaD0iIikKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xofSkKLWZpCi1dKQotICBJVENMSERJUj0iIgotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IEl0Y2wgaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iICE9IHggOyB0aGVuCi0gICAgbm9faXRjbD0iIgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xofSkKLSAgICAgICAgSVRDTEhESVI9Ii1JJHthY19jdl9jX2l0Y2xofSIKLSAgICBmaQotZmkKLQotQUNfU1VCU1QoSVRDTEhESVIpCi1dKQotCi1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBsaWJyYXJ5Ci1kbmwgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLWl0Y2xsaWIKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xMSUIsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1pZiB0ZXN0IHgiJHtub19pdGNsfSIgPSB4IDsgdGhlbgotICAgIGRubCB3ZSByZXNldCBub19pdGNsIGluY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX2l0Y2w9dHJ1ZQotICAgIEFDX0FSR19XSVRIKGl0Y2xsaWIsCi0JWyAgLS13aXRoLWl0Y2xsaWIgICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgaXRjbCBsaWJyYXJ5IGlzXSwKLSAgICAgICAgd2l0aF9pdGNsbGliPSR7d2l0aHZhbH0pCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRjbCBsaWJyYXJ5XSkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsbGliLFsKLSAgICBkbmwgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsbGliIHdhcyBzcGVjaWZpZWQuCi0gICAgaWYgdGVzdCB4IiR7d2l0aF9pdGNsbGlifSIgIT0geCA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt3aXRoX2l0Y2xsaWJ9L2xpYml0Y2wkVENMX1NIQVJFRF9MSUJfU1VGRklYIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICR7d2l0aF9pdGNsbGlifTsgcHdkKWAvbGliaXRjbCRUQ0xfU0hBUkVEX0xJQl9TVUZGSVgKLQllbHNlCi0JICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsbGlifS9saWJpdGNsJFRDTF9VTlNIQVJFRF9MSUJfU1VGRklYIjsgdGhlbgotCSAJYWNfY3ZfY19pdGNsbGliPWAoY2QgJHt3aXRoX2l0Y2xsaWJ9OyBwd2QpYC9saWJpdGNsJFRDTF9VTlNIQVJFRF9MSUJfU1VGRklYCi0JICAgIGZpCi0JZmkKLSAgICBmaQotICAgIGRubCB0aGVuIGNoZWNrIGZvciBhICBJdGNsIGxpYnJhcnkuIFNpbmNlIHRoZXNlIGFyZSB1bmluc3RhbGxlZCwKLSAgICBkbmwgdXNlIHRoZSBzaW1wbGUgbGliIG5hbWUgcm9vdC4gCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgYnVpbGQgZGlyZWN0b3J5Ci0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkaS9pdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICAgICAgaXRjbHBhdGg9JGkvaXRjbAotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgIGlmIHRlc3QgLWYgIiRpdGNscGF0aC9zcmMvbGliaXRjbC4kVENMX1NITElCX1NVRkZJWCIgOyB0aGVuCi0JICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaXRjbHBhdGgvc3JjOyBwd2QpYAotICAgICAgICBlbGlmIHRlc3QgLWYgIiRpdGNscGF0aC9zcmMvbGliaXRjbC5hIjsgdGhlbgotCSAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJGl0Y2xwYXRoL3NyYzsgcHdkKWAKLQlmaQotICAgIGZpCi0gICAgZG5sIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBmb3IgaSBpbiAke2Rpcmxpc3R9OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAke3NyY2Rpcn0vJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgICAgIGl0Y2xwYXRoPSR7c3JjZGlyfS8kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotICAgICAgICBmb3IgaSBpbiBgbHMgLWRyICR7aXRjbHBhdGh9L2l0Y2wqIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICIkaS9zcmMvbGliaXRjbCRUQ0xfU0hMSUJfU1VGRklYIiA7IHRoZW4KLQkgICAgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICRpL3NyYzsgcHdkKWAKLQkgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbGlmIHRlc3QgLWYgIiRpL3NyYy9saWJpdGNsLmEiOyB0aGVuCi0JICAgICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaS9zcmM7IHB3ZClgCi0JICAgICAgICBicmVhawotCSAgICBmaQkKLSAgICAgICAgZG9uZQotICAgIGZpCi0KLSAgICBkbmwgc2VlIGlmIG9uZSBpcyBjb252ZW5pZW50bHkgaW5zdGFsbGVkIHdpdGggdGhlIGNvbXBpbGVyCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgotCWNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2xpYgotICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7Y2NwYXRofS9saWJpdGNsJFRDTF9TSExJQl9TVUZGSVgiIDsgdGhlbgotCSAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAke2NjcGF0aH07IHB3ZClgCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHtjY3BhdGh9L2xpYml0Y2wuYSI7IHRoZW4KLQkgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJHtjY3BhdGh9OyBwd2QpYAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgICAgIElUQ0xMSUI9IiIKLSAgICAgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBJdGNsIGxpYnJhcnkpCi0gICAgZWxzZQotICAgICAgICBJVENMTElCPSItTCR7YWNfY3ZfY19pdGNsbGlifSIKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbGxpYn0pCi0gICAgICAgIG5vX2l0Y2w9IiIKLSAgICBmaQotZmkKLQotQUNfUFJPVklERShbJDBdKQotQUNfU1VCU1QoSVRDTExJQikKLV0pCi0KLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaXRjbF9zaCBzY3JpcHQKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtaXRjbGluY2x1ZGUKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xTSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX2l0Y2w9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgaXRjbF9zaCBzY3JpcHQpCi1BQ19BUkdfV0lUSChpdGNsaW5jbHVkZSwgWyAgLS13aXRoLWl0Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBpdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF9pdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbHNoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfaXRjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vaXRjbF9zaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xzaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYy9pdGNsX3NoIDsgdGhlbgotICAgIGFjX2N2X2NfaXRjbHNoPWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGNsX3NoXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xzaH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgaXRjbHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IEl0Y2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgSXRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRpdGNscGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9zcmMvaXRjbF9zaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX2l0Y2xzaD1gKGNkICRpL3NyYzsgcHdkKWAvaXRjbF9zaAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xzaH0iID0geCA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgIEFDX1BBVEhfUFJPRyhhY19jdl9jX2l0Y2xzaCwgaXRjbF9zaCkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xzaH0pCi1maQotXSkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIHRoZSBpdGNsX3NoIHNjcmlwdF0pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiAhPSB4IDsgdGhlbgotICAgIG5vX2l0Y2w9IiIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsc2h9KQotICAgIElUQ0xTSD0iJHthY19jdl9jX2l0Y2xzaH0iCi1maQotQUNfU1VCU1QoSVRDTFNIKQotXSkKLQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBpdGNsX3NoIHNjcmlwdAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1pdGNsaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTE1LSURYLCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9faXRjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGl0Y2xfbWtpbmRleC50Y2wgc2NyaXB0KQotQUNfQVJHX1dJVEgoaXRjbGluY2x1ZGUsIFsgIC0td2l0aC1pdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgaXRjbCBoZWFkZXJzIGFyZV0sIHdpdGhfaXRjbGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xta2lkeCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX2l0Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L2l0Y2xfc2ggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsbWtpZHg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmMvaXRjbF9zaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbF9zaF0pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbWtpZHh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIGl0Y2xwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBJdGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIEl0Y2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkaXRjbHBhdGgvaXRjbCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvbGlicmFyeS9pdGNsX21raW5kZXgudGNsIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfaXRjbG1raWR4PWAoY2QgJGkvbGlicmFyeTsgcHdkKWAvaXRjbF9ta2luZGV4LnRjbAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbG1raWR4fSIgPSB4IDsgdGhlbgotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0gICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2Avc2hhcmUKLSAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkY2NwYXRoL2l0Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2l0Y2xfbWtpbmRleC50Y2wgOyB0aGVuCi0gICAgICAgICAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICRpOyBwd2QpYC9pdGNsX21raW5kZXgudGNsCi0gICAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi1dKQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgdGhlIGl0Y2xfbWtpbmRleC50Y2wgc2NyaXB0XSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iICE9IHggOyB0aGVuCi0gICAgbm9faXRjbD0iIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xta2lkeH0pCi0gICAgSVRDTE1LSURYPSIke2FjX2N2X2NfaXRjbG1raWR4fSIKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChJVENMTUtJRFgpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSB0aXggc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGl4aW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVElYLCBbCi0gICAgQ1lHX0FDX1BBVEhfVElYSAotICAgIENZR19BQ19QQVRIX1RJWExJQgotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX1RJWEgsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub190aXg9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciBUaXggaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSCh0aXhpbmNsdWRlLCBbICAtLXdpdGgtdGl4aW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGl4IGhlYWRlcnMgYXJlXSwgd2l0aF90aXhpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY190aXhoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRpeGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF90aXhpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfdGl4aW5jbHVkZX0vdGl4LmggOyB0aGVuCi0gICAgYWNfY3ZfY190aXhoPWAoY2QgJHt3aXRoX3RpeGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RpeGluY2x1ZGV9L2dlbmVyaWMvdGl4LmggOyB0aGVuCi0gICAgYWNfY3ZfY190aXhoPWAoY2QgJHt3aXRoX3RpeGluY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90aXhpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRpeCBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgIT0geCA7IHRoZW4KLSAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfY3ZfY190aXhjb25maWcvJGkvZ2VuZXJpYy90aXguaCA7IHRoZW4KLSAgICAgIGFjX2N2X2NfdGl4aD1gKGNkICRhY19jdl9jX3RpeGNvbmZpZy8kaS9nZW5lcmljOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGl4IHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL3RpeCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgdGl4cGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGl4IHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRpeCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICR0aXhwYXRoL3RpeCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy90aXguaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX3RpeGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0KLSAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyLiBXZSBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nCi0gICAgZG5sIEFDX0NIRUNLX0hFQURFUiwgY2F1c2UgdGhpcyBkb2Vzbid0IGRlcGVuZCBpbiBoYXZpbmcgWCBjb25maWd1cmVkLgotICAgIGNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2luY2x1ZGUKLSAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGl4Lmg7IHRoZW4KLQlhY19jdl9jX3RpeGg9aW5zdGFsbGVkCi0gICAgZmkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RpeGh9KQotZmkKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIGFueSBUaXggaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgIT0geCA7IHRoZW4KLSAgICBub190aXg9IiIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190aXhofSkKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0gICAgICAgIFRJWEhESVI9Ii1JJHthY19jdl9jX3RpeGh9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUSVhIRElSKQotXSkKLQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVElYQ09ORklHLCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIHRpeCBjb25maWd1cmF0aW9uCi0jIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKLSMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGl4Y29uZmlnCi0jCi0KLWlmIHRlc3QgeCIke25vX3RpeH0iID0geCA7IHRoZW4KLSAgIyB3ZSByZXNldCBub190aXggaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICBub190aXg9dHJ1ZQotICBBQ19BUkdfV0lUSCh0aXhjb25maWcsIFsgIC0td2l0aC10aXhjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRpeCBjb25maWd1cmF0aW9uICh0aXhDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfdGl4Y29uZmlnPSR7d2l0aHZhbH0pCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIFRpeCBjb25maWd1cmF0aW9uXSkKLSAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGl4Y29uZmlnLFsKLQotICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGl4Y29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gIGlmIHRlc3QgeCIke3dpdGhfdGl4Y29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGl4Y29uZmlnfS90aXhDb25maWcuc2giIDsgdGhlbgotICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAke3dpdGhfdGl4Y29uZmlnfTsgcHdkKWAKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90aXhjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGl4Q29uZmlnLnNoXSkKLSAgICBmaQotICBmaQotCi0gICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIFRpeCBsaWJyYXJ5Ci0gIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJLi4vdGl4IFwKLQkJYGxzIC1kciAuLi90aXhbWzRdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vdGl4IFwKLQkJYGxzIC1kciAuLi8uLi90aXhbWzRdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vLi4vdGl4IFwKLQkJYGxzIC1kciAuLi8uLi8uLi90aXhbWzRdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL3RpeENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvdGl4Q29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCSR7c3JjZGlyfS8uLi90aXggXAotCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90aXhbWzQtOV1dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvdGl4Q29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgotICAgIFRJWENPTkZJRz0iIyBubyBUaXggY29uZmlncyBmb3VuZCIKLSAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIFRpeCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQotICBlbHNlCi0gICAgbm9fdGl4PQotICAgIFRJWENPTkZJRz0ke2FjX2N2X2NfdGl4Y29uZmlnfS90aXhDb25maWcuc2gKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRUSVhDT05GSUcpCi0gIGZpCi1maQotCi1dKQotCi0jIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKLSMgZnJvbSBQQVRIX1RJWENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9USVhDT05GSUcsIFsKLSAgICBpZiB0ZXN0IC1mICIkVElYQ09ORklHIiA7IHRoZW4KLSAgICAgIC4gJFRJWENPTkZJRwotICAgIGZpCi0KLSAgICBBQ19TVUJTVChUSVhfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoVElYX0xJQl9GVUxMX1BBVEgpCi1dKQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMQ09ORklHLCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgY29uZmlndXJhdGlvbgotIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi0jIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLWl0Y2xjb25maWcKLSMKLQotaWYgdGVzdCB4IiR7bm9faXRjbH0iID0geCA7IHRoZW4KLSAgIyB3ZSByZXNldCBub19pdGNsIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKLSAgbm9faXRjbD10cnVlCi0gIEFDX0FSR19XSVRIKGl0Y2xjb25maWcsIFsgIC0td2l0aC1pdGNsY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyBpdGNsIGNvbmZpZ3VyYXRpb24gKGl0Y2xDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfaXRjbGNvbmZpZz0ke3dpdGh2YWx9KQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJdGNsIGNvbmZpZ3VyYXRpb25dKQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsY29uZmlnLFsKLQotICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgotICBpZiB0ZXN0IHgiJHt3aXRoX2l0Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICR7d2l0aF9pdGNsY29uZmlnfTsgcHdkKWAKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0Y2xDb25maWcuc2hdKQotICAgIGZpCi0gIGZpCi0KLSAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgaXRjbCBsaWJyYXJ5Ci0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCS4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uLy4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vLi4vLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gYGxzIC1kICR7cHJlZml4fS9saWIgL3Vzci9sb2NhbC9saWIgMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2xDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbC9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICBdKQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgSVRDTENPTkZJRz0iIyBubyBpdGNsIGNvbmZpZ3MgZm91bmQiCi0gICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBpdGNsIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gIGVsc2UKLSAgICBub19pdGNsPQotICAgIElUQ0xDT05GSUc9JHthY19jdl9jX2l0Y2xjb25maWd9L2l0Y2xDb25maWcuc2gKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRJVENMQ09ORklHKQotICBmaQotZmkKLQotXSkKLQotIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi0jIGZyb20gUEFUSF9JVENMQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX0lUQ0xDT05GSUcsIFsKLSAgICBpZiB0ZXN0IC1mICIkSVRDTENPTkZJRyIgOyB0aGVuCi0gICAgICAuICRJVENMQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKElUQ0xfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoSVRDTF9TSCkKLSAgICBBQ19TVUJTVChJVENMX0xJQl9GSUxFKQotICAgIEFDX1NVQlNUKElUQ0xfTElCX0ZVTExfUEFUSCkKLQotXSkKLQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVEtDT05GSUcsIFsKLSMKLSMgT2ssIGxldHMgZmluZCB0aGUgaXRrIGNvbmZpZ3VyYXRpb24KLSMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGtjb25maWcKLSMKLQotaWYgdGVzdCB4IiR7bm9faXRrfSIgPSB4IDsgdGhlbgotICAjIHdlIHJlc2V0IG5vX2l0ayBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCi0gIG5vX2l0az10cnVlCi0gIEFDX0FSR19XSVRIKGl0a2NvbmZpZywgWyAgLS13aXRoLWl0a2NvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaXRrIGNvbmZpZ3VyYXRpb24gKGl0a0NvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF9pdGtjb25maWc9JHt3aXRodmFsfSkKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRrIGNvbmZpZ3VyYXRpb25dKQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGtjb25maWcsWwotCi0gICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGtjb25maWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgdGVzdCB4IiR7d2l0aF9pdGtjb25maWd9IiAhPSB4IDsgdGhlbgotICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGtjb25maWd9L2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICR7d2l0aF9pdGtjb25maWd9OyBwd2QpYAotICAgIGVsc2UKLSAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGtDb25maWcuc2hdKQotICAgIGZpCi0gIGZpCi0KLSAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgaXRrIGxpYnJhcnkKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gXAotCQkuLi9pdGNsL2l0ayBcCi0JCWBscyAtZHIgLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vaXRjbC9pdGsgXAotCQlgbHMgLWRyIC4uLy4uL2l0Y2wvaXRrW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uLy4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAuLi8uLi8uLi9pdGNsL2l0a1tbM11dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAke3NyY2Rpcn0vLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICBdKQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICBJVENMQ09ORklHPSIjIG5vIGl0ayBjb25maWdzIGZvdW5kIgotICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgaXRrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gIGVsc2UKLSAgICBub19pdGs9Ci0gICAgSVRLQ09ORklHPSR7YWNfY3ZfY19pdGtjb25maWd9L2l0a0NvbmZpZy5zaAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJElUS0NPTkZJRykKLSAgZmkKLWZpCi0KLV0pCi0KLSMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcwotIyBmcm9tIFBBVEhfSVRLQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX0lUS0NPTkZJRywgWwotICAgIGlmIHRlc3QgLWYgIiRJVEtDT05GSUciIDsgdGhlbgotICAgICAgLiAkSVRLQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKElUS19CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChJVEtfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoSVRLX0xJQl9GVUxMX1BBVEgpCi1dKQotCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGxpYmd1aSBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1saWJndWlpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUksIFsKLSAgICBDWUdfQUNfUEFUSF9MSUJHVUlICi0gICAgQ1lHX0FDX1BBVEhfTElCR1VJTElCCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR1VJSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9fbGliZ3VpPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgTGliZ3VpIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgobGliZ3VpaW5jbHVkZSwgWyAgLS13aXRoLWxpYmd1aWluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIGxpYmd1aSBoZWFkZXJzIGFyZV0sIHdpdGhfbGliZ3VpaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliZ3VpaCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1saWJndWlpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfbGliZ3VpaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L2d1aXRjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICR7d2l0aF9saWJndWlpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF9saWJndWlpbmNsdWRlfS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19saWJndWloPWAoY2QgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L3NyYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2xpYmd1aWluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggTGliZ3VpIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWljb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2xpYmd1aWNvbmZpZy8kaS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAkYWNfY3ZfY19saWJndWljb25maWcvJGkvc3JjOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgTGliZ3VpIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2xpYmd1aSogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgbGliZ3VpcGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgTGliZ3VpIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIExpYmd1aSwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRsaWJndWlwYXRoL2xpYmd1aSogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvc3JjL2d1aXRjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICRpL3NyYzsgcHdkKWAKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgQUNfQ0hFQ0tfSEVBREVSKGd1aXRjbC5oLCBhY19jdl9jX2xpYmd1aWg9aW5zdGFsbGVkLCBhY19jdl9jX2xpYmd1aWg9IiIpCi1maQotXSkKLUxJQkdVSUhESVI9IiIKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfV0FSTihbQ2FuJ3QgZmluZCBhbnkgTGliZ3VpIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iICE9IHggOyB0aGVuCi0gICAgbm9fbGliZ3VpPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotICAgICAgICBMSUJHVUlIRElSPSItSSR7YWNfY3ZfY19saWJndWlofSIKLSAgICBmaQotZmkKLUFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmd1aWh9KQotQUNfU1VCU1QoTElCR1VJSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIGZpbmQgdGhlIEdVSSBsaWJyYXJ5Ci1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUlMSUIsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgR1VJIGxpYnJhcnkgIGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciBHVUkgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmd1aWxpYixbCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWxpYn0iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2xpYmd1aS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotICAgICAgICBhY19jdl9jX2xpYmd1aWxpYj1gKGNkICRpL2xpYmd1aS9zcmM7IHB3ZClgCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLWZpCi1dKSAKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpbGlifSIgIT0geCA7IHRoZW4KLSAgICAgR1VJTElCPSIke0dVSUxJQn0gLUwke2FjX2N2X2NfbGliZ3VpbGlifSIKLSAgICAgTElCR1VJTElCPSItbGd1aSIKLSAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGliZ3VpbGlifSkKLWVsc2UKLSAgICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfU1VCU1QoR1VJTElCKQotQUNfU1VCU1QoTElCR1VJTElCKQotXSkKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hNjhic2QgYi9jb25maWcvbWgtYTY4YnNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkxMjg5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hNjhic2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1SQU5MSUI9dHJ1ZQotCi0jTm9uZSBvZiB0aGUgQXBvbGxvIGNvbXBpbGVycyBjYW4gY29tcGlsZSBnYXMgb3IgYmludXRpbHMuICBUaGUgcHJlcHJvY2Vzc29yCi0jIGNob2tlcyBvbiBiZmQsIHRoZSBjb21waWxlciB3b24ndCBsZXQgeW91IGFzc2lnbiBpbnRlZ2VycyB0byBlbnVtcywgYW5kCi0jIG90aGVyIHByb2JsZW1zLiAgRGVmaW5pbmcgQ0MgdG8gZ2NjIGlzIGEgcXVlc3Rpb25hYmxlIHdheSB0byBzYXkgImRvbid0IHVzZQotIyB0aGUgYXBvbGxvIGNvbXBpbGVyIiAodGhlIHByZWZlcnJlZCB2ZXJzaW9uIG9mIEdDQyBjb3VsZCBiZSBjYWxsZWQgY2MsCi0jIG9yIHdoYXRldmVyKSwgYnV0IEknbSBub3Qgc3VyZSBsZWF2aW5nIENDIGFzIGNjIGlzIGFueSBiZXR0ZXIuLi4KLQotI0NDPWNjIC1BIGFuc2kgLUEgcnVudHlwZSxhbnkgLUEgc3lzdHlwZSxhbnkgLVVfX1NURENfXyAtRE5PX1NUREFSRwotQ0M9Z2NjCi0KLUJJU09OPXlhY2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1haXgzODYgYi9jb25maWcvbWgtYWl4Mzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNjZDFjLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1haXgzODYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1SQU5MSUIgPSBAOgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWFpeDQzIGIvY29uZmlnL21oLWFpeDQzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI3NTBjLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1haXg0MworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBBSVggNC4zIGFuZCBhYm92ZSByZXF1aXJlcyAtWDMyXzY0IGZsYWcgdG8gYWxsIGFyIGFuZCBubSBjb21tYW5kcwotIyB0byBoYW5kbGUgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBvYmplY3RzLgotQVJfRk9SX1RBUkdFVD1hciAtWDMyXzY0Ci1OTV9GT1JfVEFSR0VUPW5tIC1YMzJfNjQKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hcG9sbG82OCBiL2NvbmZpZy9taC1hcG9sbG82OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5N2VkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtYXBvbGxvNjgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUhERUZJTkVTID0gLURVU0cKLVJBTkxJQj10cnVlCi1DQz0gY2MgLUEgYW5zaSAtQSBydW50eXBlLGFueSAtQSBzeXN0eXBlLGFueSAtVV9fU1REQ19fIC1EVVNHCmRpZmYgLS1naXQgYS9jb25maWcvbWgtYXJtcGljIGIvY29uZmlnL21oLWFybXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjZjJjOC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtYXJtcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWN4dXggYi9jb25maWcvbWgtY3h1eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiMmExNi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtY3h1eAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmb3IgSGFycmlzIENYL1VYIDcgKGFuZCBtYXliZSA2KSwgYmFzZWQgb24gc3lzdjQgY29uZmlndXJhdGlvbi4KLQotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNAotUkFOTElCID0gdHJ1ZQotCi0jIEMrKyBkZWJ1Z2dpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgdW5kZXIgU1ZSNCAoRFdBUkYpCi1DWFhGTEFHUz0tTwotCi0jIFRoZSBsIGZsYWcgZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIHRoZSBTVlI0IGFyY2hpdmVyLCByZW1vdmUgaXQuCi1BUl9GTEFHUyA9IGNxCi0KLSMgVW5kZXIgQ1gvVVgsIHdlIHdhbnQgdG8gdGVsbCB0aGUgY29tcGlsZXIgdG8gdXNlIEFOU0kgbW9kZS4KLUNDPWNjIC1YYQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWN5Z3dpbiBiL2NvbmZpZy9taC1jeWd3aW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTAyN2YuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWN5Z3dpbgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVM9YWxsLWxpYnRlcm1jYXAKLUVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUz1pbnN0YWxsLWxpYnRlcm1jYXAKLQotYWxsLWdkYjogYWxsLWxpYnRlcm1jYXAKLQotaW5zdGFsbC1nZGI6IGFsbC1saWJ0ZXJtY2FwCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGVjc3RhdGlvbiBiL2NvbmZpZy9taC1kZWNzdGF0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzIwMTkyLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kZWNzdGF0aW9uCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1DQyA9IGNjIC1XZiwtWE5nMTAwMAotCi0jIGZvciBYMTEsIHNpbmNlIHRoZSBuYXRpdmUgREVDd2luZG93cyBpbmNsdWRlIGZpbGVzIGFyZSByZWFsbHkgYnJva2VuIHdoZW4KLSMgaXQgY29tZXMgdG8gZnVuY3Rpb24gcHJvdG90eXBlcy4gIAotWDExX0VYVFJBX0NGTEFHUyA9ICItRE5lZWRGdW5jdGlvblByb3RvdHlwZXM9MCIKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kZWx0YTg4IGIvY29uZmlnL21oLWRlbHRhODgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOWM0NTMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRlbHRhODgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVJBTkxJQiA9IHRydWUKLQotCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kZ3V4IGIvY29uZmlnL21oLWRndXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDg1ZDYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRndXgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUhERUZJTkVTPS1ESE9TVF9TWVM9REdVWF9TWVMKLUNDPWdjYyAtV2FsbCAtYW5zaSAtRF9fdXNpbmdfREdVWAotUkFOTElCPXRydWUKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRndXgzODYgYi9jb25maWcvbWgtZGd1eDM4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4ODVjMy4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGd1eDM4NgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgZnJvbSBtaC1kZ3V4Ci1IREVGSU5FUz0tREhPU1RfU1lTPURHVVhfU1lTCi1DQz1nY2MgLVdhbGwgLWFuc2kgLURfX3VzaW5nX0RHVVgKLVJBTkxJQiA9IHRydWUKLQotIyBmcm9tIG1oLXN5c3Y0Ci0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3IKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbAotCi0jIGZyb20gYW5nZWxhCi0jIG5vIGRlYnVnZ2luZyBkdWUgdG8gYnJva2VuIGNvbXBpbGVyLCB1c2UgQlNEIHN0eWxlIHRpbWVvZmRheQotQ0ZMQUdTPS1PIC1EX0JTRF9USU1FT0ZEQVlfRkxBVk9SCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kamdwcCBiL2NvbmZpZy9taC1kamdwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMDA3Yi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGpncHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgV2UgZG9uJ3Qgd2FudCB0byB1c2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIG9uIERPUy4gIFVuZm9ydHVuYXRlbHksCi0jIHRoaXMgcmVxdWlyZXMgdGhhdCB3ZSBzZXQgQ0ZMQUdTLgotIyBUaGlzIHVzZWQgdG8gc2V0IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyLgotQ0ZMQUdTPS1PMgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWVsZmFscGhhcGljIGIvY29uZmlnL21oLWVsZmFscGhhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNmMmM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1lbGZhbHBoYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocDMwMCBiL2NvbmZpZy9taC1ocDMwMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNzI0ZC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaHAzMDAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YKLSMgQXZvaWQgInRvbyBtdWNoIGRlZmluaW5nIiBlcnJvcnMgZnJvbSBIUFVYIGNvbXBpbGVyLgotQ0MgPSBjYyAtV3AsLUgyNTYwMDAKLSMgSWYgImFyIiBpbiAkUEFUSCBpcyBHTlUgYXIsIHRoZSBzeW1ib2wgdGFibGUgbWF5IG5lZWQgcmVidWlsZGluZy4KLSMgSWYgaXQncyBIUC9VWCBhciwgdGhpcyBzaG91bGQgYmUgaGFybWxlc3MuCi1SQU5MSUIgPSBhciB0cwotCi0jIE5hdGl2ZSBjYyBjYW4ndCBib290c3RyYXAgZ2NjIHdpdGggLWcuICBEZWZpbmluZyBDRkxBR1MgaGVyZSBsb3NlcyAoYSkKLSMgZm9yIG5vbi1nY2MgZGlyZWN0b3JpZXMsIChiKSBpZiB3ZSBhcmUgY29tcGlsaW5nIHdpdGggZ2NjLCBub3QKLSMgbmF0aXZlIGNjLiAgTmVpdGhlciAoYSkgbm9yIChiKSBoYXMgYSB0cml2aWFsIGZpeCB0aG91Z2guCi0KLUNGTEFHUyA9CmRpZmYgLS1naXQgYS9jb25maWcvbWgtaHB1eCBiL2NvbmZpZy9taC1ocHV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDcxYzlkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1ocHV4CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLUNDID0gY2MgLVdwLC1IMjU2MDAwCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaHB1eDggYi9jb25maWcvbWgtaHB1eDgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzFjOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWhwdXg4CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLUNDID0gY2MgLVdwLC1IMjU2MDAwCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaW50ZXJpeCBiL2NvbmZpZy9taC1pbnRlcml4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI4ZWNmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pbnRlcml4CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBUaGUgc2hlbGwgbWF5IG5vdCBiZSBpbiAvYmluLiAKLVNIRUxMID0gc2gKLVJBTkxJQiA9IHRydWUKLQotIyBXZSBkb24ndCB3YW50IGRlYnVnZ2luZyBpbmZvIGluIEludGVyaXgtaG9zdGVkIHRvb2xjaGFpbnMuCi0jIEFjY29tcGxpc2ggdGhpcyBieSBvdmVycmlkaW5nIENGTEFHUy4gVGhpcyBpcyBhbHNvIGEgd29ya2Fyb3VuZAotIyBmb3IgTEQgY3Jhc2ggd2hlbiBidWlsZGluZyBzaGFyZWQgbGlic3RkYysrLgotQ0ZMQUdTPS1PMgotQ1hYRkxBR1M9LU8yCi0KLSMgV2UgYWxzbyBuZWVkIHRvIG92ZXJyaWRlIExJQkdDQzJfREVCVUdfQ0ZMQUdTIHNvIGxpYmdjYzIgd2lsbCBiZQotIyBidWlsdCB3aXRob3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCi1MSUJHQ0MyX0RFQlVHX0NGTEFHUz0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pcml4NCBiL2NvbmZpZy9taC1pcml4NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3MjE0NS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaXJpeDQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTWFrZWZpbGUgY2hhbmdlcyBmb3IgU0dJJ3MgcnVubmluZyBJUklYLTQueC4KLSMgVGVsbCBjb21waWxlciB0byB1c2UgSyZSIEMuICBXZSBjYW4ndCBjb21waWxlIHVuZGVyIHRoZSBTR0kgQW5zaQotIyBlbnZpcm9ubWVudC4gIEFsc28gYnVtcCBzd2l0Y2ggdGFibGUgc2l6ZSBzbyB0aGF0IGNwLXBhcnNlIHdpbGwKLSMgY29tcGlsZS4gIEJ1bXAgc3RyaW5nIGxlbmd0aCBsaW1pdCBzbyBsaW5rZXIgYnVpbGRzLgotCi1DQyA9IGNjIC1jY2tyIC1XZiwtWE5nMTUwMCAtV2YsLVhOazEwMDAgLVdmLC1YTmgyMDAwIC1XZiwtWE5sODE5MgotU1lTViA9IC1EU1lTVgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg1IGIvY29uZmlnL21oLWlyaXg1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ3Yzk5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNS54LgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg2IGIvY29uZmlnL21oLWlyaXg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI1YzE2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNi54LgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotIyBTcGVjaWZ5IHRoZSBBQkksIHRvIGVuc3VyZSB0aGF0IGFsbCBJcml4IDYgc3lzdGVtcyB3aWxsIGJlaGF2ZSB0aGUgc2FtZS4KLSMgQWxzbywgdXNpbmcgLTMyIGF2b2lkcyBidWdzIHRoYXQgZXhpc3QgaW4gdGhlIG4zMi9uNjQgc3VwcG9ydCBpbiBzb21lCi0jIHZlcnNpb25zIG9mIHRoZSBTR0kgY29tcGlsZXIuCi1DQyA9IGNjIC0zMgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWx5bnhvcyBiL2NvbmZpZy9taC1seW54b3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmNiNzkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWx5bnhvcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyAvYmluL2NjIGlzIGxlc3MgdGhhbiB1c2VmdWwgZm9yIG91ciBwdXJwb3Nlcy4gIEFsd2F5cyB1c2UgR0NDCi1DQyA9IC9iaW4vZ2NjCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbHlueHJzNmsgYi9jb25maWcvbWgtbHlueHJzNmsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzkzOTkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWx5bnhyczZrCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIEx5bnhPUyBydW5uaW5nIG9uIHRoZSByczYwMDAgZG9lc24ndCBoYXZlIHJhbmxpYgotUkFOTElCID0gdHJ1ZQotCi0jIC9iaW4vY2MgaXMgbGVzcyB0aGFuIHVzZWZ1bCBmb3Igb3VyIHB1cnBvc2VzLiAgQWx3YXlzIHVzZSBHQ0MKLUNDID0gL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvYmluL2djYwotCi0jIC9iaW4vc2ggaXMgdG9vIGJ1Z2d5LCBzbyB1c2UgL2Jpbi9iYXNoIGluc3RlYWQuCi1TSEVMTCA9IC9iaW4vYmFzaApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW02OGtwaWMgYi9jb25maWcvbWgtbTY4a3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNDhkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbTY4a3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1taW5ndzMyIGIvY29uZmlnL21oLW1pbmd3MzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDgzOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW1pbmd3MzIKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFdlIGRvbid0IHdhbnQgZGVidWdnaW5nIGluZm8gaW4gV2luMzItaG9zdGVkIHRvb2xjaGFpbnMuCi0jIEFjY29tcGxpc2ggdGhpcyBieSBvdmVycmlkaW5nIENGTEFHUy4KLUNGTEFHUz0tTzIKLUNYWEZMQUdTPS1PMgotCi0jIFdlIGFsc28gbmVlZCB0byBvdmVycmlkZSBMSUJHQ0MyX0RFQlVHX0NGTEFHUyBzbyBsaWJnY2MyIHdpbGwgYmUKLSMgYnVpbHQgd2l0aG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQotTElCR0NDMl9ERUJVR19DRkxBR1M9Ci0KLSMgY3VzdG9tIGluc3RhbGxhdGlvbiBydWxlcyBmb3IgbWluZ3czMiAoYXBwZW5kIC5leGUgdG8gYmluYXJpZXMsIGV0Yy4pCi0jIElOU1RBTExfRE9TUkVMPWluc3RhbGwtZG9zcmVsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmNyMzAwMCBiL2NvbmZpZy9taC1uY3IzMDAwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJkODAzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1uY3IzMDAwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBIb3N0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYW4gTkNSIDMwMDAgKGk0ODYvU1ZSNCkgc3lzdGVtLgotCi0jIFRoZSBOQ1IgMzAwMCBzaGlwcyB3aXRoIGEgTWV0YVdhcmUgY29tcGlsZXIgaW5zdGFsbGVkIGFzIC9iaW4vY2MuCi0jIFRoaXMgY29tcGlsZXIgbm90IG9ubHkgZW1pdHMgb2Jub3hpb3VzIGNvcHlyaWdodCBtZXNzYWdlcyBldmVyeSB0aW1lCi0jIHlvdSBydW4gaXQsIGJ1dCBpdCBjaG9rZXMgYW5kIGRpZXMgb24gYSB3aG9sZSBidW5jaCBvZiBHTlUgc291cmNlCi0jIGZpbGVzLiAgRGVmYXVsdCB0byB1c2luZyB0aGUgQVQmVCBjb21waWxlciBpbnN0YWxsZWQgaW4gL3Vzci9jY3MvQVRUL2NjLgotIyBVbmZvcnR1bmF0ZWx5IHRob3VnaCwgdGhlIEFUJlQgY29tcGlsZXIgc29tZXRpbWVzIGdlbmVyYXRlcyBjb2RlIHRoYXQKLSMgdGhlIGFzc2VtYmxlciBiYXJmcyBvbiBpZiAtZyBpcyB1c2VkLCBzbyBkaXNhYmxlIGl0IGJ5IGRlZmF1bHQgYXMgd2VsbC4KLUNDID0gL3Vzci9jY3MvQVRUL2NjCi1DRkxBR1MgPQotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3EKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1uY3JzdnI0MyBiL2NvbmZpZy9taC1uY3JzdnI0MwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiMDk5MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbmNyc3ZyNDMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMgSG9zdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGFuIE5DUiAzMDAwIChpNDg2L1NWUjQzKSBzeXN0ZW0uCi0KLSMgVGhlIE1ldGFXYXJlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgYSBjb3B5cmlnaHQgbWVzc2FnZSB1bmxlc3MgeW91Ci0jIHR1cm4gaXQgb2ZmIGJ5IGFkZGluZyB0aGUgLUhub2NvcHlyIGZsYWcuCi1DQyA9IGNjIC1Ibm9jb3B5cgotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmVjdjQgYi9jb25maWcvbWgtbmVjdjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODc3MzYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW5lY3Y0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBIb3N0IE1ha2VmaWxlIGZyYWdtZW50IGZvciBORUMgTUlQUyBTVlI0LgotCi0jIFRoZSBDIGNvbXBpbGVyIG9uIE5FQyBNSVBTIFNWUjQgbmVlZHMgYmlnZ2VyIHRhYmxlcy4KLUNDID0gY2MgLVpYTmQ9NTAwMCAtWlhOZz0xMDAwCi0KLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBORUMgLWxYMTEgbmVlZHMgc29tZSBvdGhlciBsaWJyYXJpZXMuCi1YMTFfRVhUUkFfTElCUyA9IC1sc29ja2V0IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtcGFwaWMgYi9jb25maWcvbWgtcGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXBhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXBwY3BpYyBiL2NvbmZpZy9taC1wcGNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXBwY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1yaXNjb3MgYi9jb25maWcvbWgtcmlzY29zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg2YjMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1yaXNjb3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIFRoaXMgaXMgZm9yIGEgTUlQUyBydW5uaW5nIFJJU0Mvb3MgNC41MkMuCi0KLSMgVGhpcyBpcyBuZWVkZWQgZm9yIEdEQiwgYnV0IG5lZWRzIHRvIGJlIGluIHRoZSB0b3AtbGV2ZWwgbWFrZSBiZWNhdXNlCi0jIGlmIGEgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIHRoZSBic2QgaGVhZGVycyBhbmQgZ2V0cyBsaW5rZWQgd2l0aCB0aGUKLSMgc3lzdiBzeXN0ZW0gbGlicmFyaWVzIGFsbCBoZWxsIGNhbiBicmVhayBsb29zZSAoZS5nLiBhIGptcF9idWYgbWlnaHQgYmUKLSMgYSBkaWZmZXJlbnQgc2l6ZSkuCi0jIHB0cmFjZSgyKSBhcHBhcmVudGx5IGhhcyBwcm9ibGVtcyBpbiB0aGUgQlNEIGVudmlyb25tZW50LiAgTm8gd29ya2Fyb3VuZCBpcwotIyBrbm93biBleGNlcHQgdG8gc2VsZWN0IHRoZSBzeXN2IGVudmlyb25tZW50LiAgQ291bGQgd2UgdXNlIC9wcm9jIGluc3RlYWQ/Ci0jIFRoZXNlICJzeXN2IGVudmlyb25tZW50cyIgYW5kICJic2QgZW52aXJvbm1lbnRzIiBvZnRlbiBlbmQgdXAgYmVpbmcgYSBwYWluLgotIwotIyBUaGlzIGlzIG5vdCBwYXJ0IG9mIENGTEFHUyBiZWNhdXNlIHBlcmhhcHMgbm90IGFsbCBDIGNvbXBpbGVycyBoYXZlIHRoaXMKLSMgb3B0aW9uLgotQ0M9IGNjIC1zeXN0eXBlIHN5c3YKLQotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNjbyBiL2NvbmZpZy9taC1zY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzM3YzkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXNjbworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotIyBZb3UgbWF5IG5lZWQgdGhpcyBpZiB5b3UgZG9uJ3QgaGF2ZSBiaXNvbi4KLSMgQklTT04gPSB5YWNjIC1TbTEwNDAwCi0jIFRoZSBuYXRpdmUgQyBjb21waWxlciBib3RjaGVzIHNvbWUgc2ltcGxlIHVzZXMgb2YgY29uc3QuICBVbmZvcnR1bmF0ZWx5LAotIyBpdCBkb2Vzbid0IGRlZmluZWQgYW55dGhpbmcgbGlrZSAiX19zY29fXyIgZm9yIHVzIHRvIHRlc3QgZm9yIGluIGFuc2lkZWNsLmguCi1DQyA9IGNjIC1EY29uc3Q9Ci0KLVgxMV9FWFRSQV9MSUJTID0gLWxzb2NrZXQgLWxtIC1saW50bCAtbG1hbGxvYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNvbGFyaXMgYi9jb25maWcvbWgtc29sYXJpcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiZWE1NC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc29sYXJpcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTdW5zIHJ1bm5pbmcgU29sYXJpcyAyCi0KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbCAtbHNvY2tldApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNwYXJjcGljIGIvY29uZmlnL21oLXNwYXJjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRiYzIyLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zcGFyY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9YGNhc2UgIiR7TElCQ0ZMQUdTfSAke0xJQkNYWEZMQUdTfSIgaW4gKi1mcGljKiApIGVjaG8gLWZwaWMgOzsgKiApIGVjaG8gLWZQSUMgOzsgZXNhY2AKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zdW4zIGIvY29uZmlnL21oLXN1bjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDUxNTUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXN1bjMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgU3VuJ3MgQyBjb21waWxlciBuZWVkcyB0aGUgLUogZmxhZyB0byBiZSBhYmxlIHRvIGNvbXBpbGUgY3AtcGFyc2UuYwotIyB3aXRob3V0IG92ZXJmbG93aW5nIHRoZSBqdW1wIHRhYmxlcyAoLUogc2F5cyB0byB1c2UgYSAzMiBiaXQgdGFibGUpCi1DQyA9IGNjIC1KCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3lzdiBiL2NvbmZpZy9taC1zeXN2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIxMTg3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zeXN2NCBiL2NvbmZpZy9taC1zeXN2NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwNjY1MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc3lzdjQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3IKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXN5c3Y1IGIvY29uZmlnL21oLXN5c3Y1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmEzOGU1Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2NQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNCAtRFNWUjUKLVJBTkxJQiA9IHRydWUKLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcgotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtdmF4dWx0MiBiL2NvbmZpZy9taC12YXh1bHQyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGUyZGM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC12YXh1bHQyCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFRoZSBvbGQgQlNEIHBjYyBpc24ndCB1cCB0byBjb21waWxpbmcgcGFydHMgb2YgZ2RiIHNvIHVzZSBnY2MKLUNDID0gZ2NjCmRpZmYgLS1naXQgYS9jb25maWcvbWgteDg2cGljIGIvY29uZmlnL21oLXg4NnBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNDhkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgteDg2cGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy1taC1tcHcgYi9jb25maWcvbXB3LW1oLW1wdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzZWY0Zi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3LW1oLW1wdworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIFRoaXMgaXMgYW4gTVBXIG1ha2VmaWxlIGZyYWdtZW50LgotCi0jIFNpbmNlIHRoZXJlIGFyZSBhIG11bHRpcGxpY2l0eSBvZiBNYWMgY29tcGlsZXJzIGFuZCB0d28gZGlmZmVyZW50Ci0jIHByb2Nlc3NvcnMsIHRoaXMgZmlsZSBpcyBwcmltYXJpbHkgYSBsaWJyYXJ5IG9mIG9wdGlvbnMgZm9yIGVhY2gKLSMgY29tcGlsZXIuICBTb21lYm9keSBlbHNlIChzdWNoIGFzIGEgY29uZmlndXJlIG9yIGJ1aWxkIHNjcmlwdCkgd2lsbAotIyBtYWtlIHRoZSBhY3R1YWwgY2hvaWNlLgotCi0jIENvbXBpbGVyIHRvIHVzZSBmb3IgY29tcGlsaW5nLgotCi1DQ19NUFdfQyA9IEMgLWQgTVBXX0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC13Ci0KLUNDX1NDID0gU0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC1pICcnIC1pIDoKLQotQ0NfTVdDNjhLID0gTVdDNjhLIC1kIE1QVyAtZW51bSBpbnQgLW1wd19jaGFycyAtc3ltIG9uIC13IG9mZiAtbWM2ODAyMCAtbW9kZWwgZmFyCi0KLUNDX1BQQ0MgPSBQUENDIC1kIHBvd2VyYz0xIC1kIHBhc2NhbD0gLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtdwotCi1DQ19NUkMgPSBNckMgLWQgcG93ZXJjPTEgLWQgcGFzY2FsPSAtZCBBTE1PU1RfU1REQyAtZCBBTlNJX1BST1RPVFlQRVMgLWQgTVBXIC1pICcnIC1pIDogLWptCi0KLUNDX1NNckMgPSBTTXJDIC1kIE1QVwotCi0jICItbXB3X2NoYXJzIiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBHTlUgc291cmNlcyBvZnRlbiBtaXggc2lnbmVkIGFuZAotIyB1bnNpZ25lZCBjYXN1YWxseS4KLSMgIi13IG9mZiIgaXMgbm90IGEgZ3JlYXQgaWRlYSwgYnV0IENXNyBpcyBjb21wbGFpbmluZyBhYm91dCBlbnVtCi0jIGFzc2lnbm1lbnRzLgotIyAiLW9wdCBnbG9iYWwscGVlcCxsNCxzcGVlZCIgaXMgc29tZXRpbWVzIGdvb2QsIGFuZCBzb21ldGltZXMgYmFkLgotIyBXZSBtdXN0IHVzZSB7Q0luY2x1ZGVzfSBzbyB0aGF0IE1QVyB0b29scyB3aWxsIHdvcms7IHtNV0NJbmNsdWRlc30KLSMgZGVmaW5lcyBzdGRvdXQsIGlzbG93ZXIsIGV0YywgaW4gd2F5cyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCBNUFcncwotIyBydW50aW1lLiAgSG93ZXZlciwgdGhpcyBjYW5ub3QgYmUgZG9uZSB2aWEgIC1pICJ7Q0luY2x1ZGVzfSIsIHNpbmNlCi0jIHRoYXQgZG9lcyBub3QgYWZmZWN0IGhvdyA8Pi10eXBlIGluY2x1ZGVzIGhhcHBlbjsgaW5zdGVhZCwgdGhlIHZhcmlhYmxlCi0jIE1XQ0luY2x1ZGVzIG11c3QgYmUgc2V0IHRvIHBvaW50IGF0IHtDSW5jbHVkZXN9LgotCi1DQ19NV0NQUEMgPSBNV0NQUEMgLWQgTVBXIC1lbnVtIGludCAtbXB3X2NoYXJzIC1zeW0gb24gLXcgb2ZmCi0KLSMgTm90ZSB0aGF0IEdDQyBkb2VzICpub3QqIHdpcmUgaW4gYSBkZWZpbml0aW9uIG9mICJwYXNjYWwiLCBzbyB0aGF0Ci0jIGl0IGNhbiBiZSBoYW5kbGVkIGluIGFub3RoZXIgd2F5IGlmIGRlc2lyZWQuCi0KLUNDXzY4S19HQ0MgPSBnQyAtRHBhc2NhbD0gLURBTlNJX1BST1RPVFlQRVMgLURNUFcKLQotQ0NfUFBDX0dDQyA9IGdDIC1EcG93ZXJjPTEgLURwYXNjYWw9IC1EQU5TSV9QUk9UT1RZUEVTIC1ETVBXCi0KLSMgTm90aGluZyBmb3IgdGhlIGRlZmF1bHQgQ0ZMQUdTLgotCi1DRkxBR1MgPSAKLQotIyBUb29sIHRvIHVzZSBmb3IgbWFraW5nIGxpYnJhcmllcy9hcmNoaXZlcy4KLQotQVJfTElCID0gTGliCi0KLUFSX01XTElOSzY4SyA9IE1XTGluazY4SyAteG0gbGlicmFyeQotCi1BUl9QUENMSU5LID0gUFBDTGluayAteG0gbGlicmFyeQotCi1BUl9NV0xJTktQUEMgPSBNV0xpbmtQUEMgLXhtIGxpYnJhcnkKLQotQVJfQVIgPSBhcgotCi1BUl9GTEFHUyA9IC1vCi0KLVJBTkxJQl9OVUxMID0gbnVsbC1jb21tYW5kCi0KLVJBTkxJQl9SQU5MSUIgPSByYW5saWIKLQotIyBDb21waWxlciBhbmQvb3IgbGlua2VyIHRvIHVzZSBmb3IgbGlua2luZy4KLQotQ0NfTERfTElOSyA9IExpbmsgLXcgLWQgLW1vZGVsIGZhciB7Q0NfTERfVE9PTF9GTEFHU30KLQotQ0NfTERfTVdMSU5LNjhLID0gTVdMaW5rNjhLIC13IHtDQ19MRF9UT09MX0ZMQUdTfSAtc3ltIG9uIC1tb2RlbCBmYXIKLQotQ0NfTERfUFBDTElOSyA9IFBQQ0xpbmsgLW1haW4gX19zdGFydCAtb3V0cHV0Zm9ybWF0IHhjb2ZmCi0KLUNDX0xEX01XTElOS1BQQyA9IE1XTGlua1BQQyAtdyB7Q0NfTERfVE9PTF9GTEFHU30gLXN5bSBvbgotCi1DQ19MRF9HTEQgPSBnQwotCi0jIEV4dGVuc2lvbiBmb3IgbGlua2VyIG91dHB1dC4KLQotUFJPR19FWFRfNjhLID0KLQotUFJPR19FWFRfWENPRkYgPSAueGNvZmYKLQotIyBOb3RoaW5nIGZvciB0aGUgZGVmYXVsdCBMREZMQUdTLgotCi1MREZMQUdTID0gLXcKLQotQ0NfTERfVE9PTF9GTEFHUyA9IC1jICdNUFMgJyAtdCBNUFNUCi0KLSMgTGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdC4KLQotIyBJdCB3b3VsZCBhcHBlYXIgdGhhdCB0aGUgbWF0aCBsaWJyYXJpZXMgYXJlIG5vdAotIyBuZWVkZWQgZXhjZXB0IHRvIHByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBzY2FsYiwKLSMgd2hpY2ggaXMgY2FsbGVkIGZyb20gbGRleHAsIHdoaWNoIGlzIHJlZmVyZW5jZWQKLSMgaW4gdGhlIG02OGsgb3Bjb2RlcyBsaWJyYXJ5LgotCi1FWFRSQUxJQlNfQyA9IFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iU3RkQ2xpYi5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iTWF0aC5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iQ1NBTkVMaWIubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iU3R1YnMubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iUnVudGltZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJJbnRlcmZhY2UubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iVG9vbExpYnMubwotCi1FWFRSQUxJQlNfTVdDNjhLID0gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJTdGRDbGliLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJNYXRoLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJDU0FORUxpYi5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJTdHVicy5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IkludGVyZmFjZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7TVc2OEtMaWJyYXJpZXN9TVBXIEFOU0kgKDRpKSBDLjY4Sy5MaWIiCi0KLUVYVFJBTElCU19QUENfWENPRkYgPSBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iU3RkQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJNYXRoTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7R0NDUFBDTGlicmFyaWVzfSJsaWJnY2MueGNvZmYKLQotRVhUUkFMSUJTX1BQQyA9IFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9Ik1hdGhMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ0NSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntHQ0NQUENMaWJyYXJpZXN9ImxpYmdjYy54Y29mZgotCi1FWFRSQUxJQlNfTVdDUFBDID0gXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iTVdTdGRDUnVudGltZS5MaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliIFxPcHRpb24tZAotCSJ7TVdQUENMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iTWF0aExpYiBcT3B0aW9uLWQKLQkie01XUFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vCi0KLSMgVG9vbCB0byBtYWtlIFBFRiB3aXRoLCBpZiBuZWVkZWQuCi0KLU1BS0VQRUZfTlVMTCA9IG51bGwtY29tbWFuZAotCi1NQUtFUEVGX1BQQyA9IE1ha2VQRUYKLQotTUFLRVBFRl9GTEFHUyA9IFxPcHRpb24tZAotCS1sIEludGVyZmFjZUxpYi54Y29mZj1JbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JLWwgTWF0aExpYi54Y29mZj1NYXRoTGliIFxPcHRpb24tZAotCS1sIFN0ZENMaWIueGNvZmY9U3RkQ0xpYgotCi1NQUtFUEVGX1RPT0xfRkxBR1MgPSAtZnQgTVBTVCAtZmMgJ01QUyAnCi0KLSMgUmVzb3VyY2UgY29tcGlsZXIgdG8gdXNlLgotCi1SRVpfNjhLID0gUmV6Ci0KLVJFWl9QUEMgPSBSZXogLWQgV0FOVF9DRlJHCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvQ2hhbmdlTG9nIGIvY29uZmlnL21wdy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGVmYmYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1UdWUgTm92IDI2IDEyOjM0OjEyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQ6IEZpeCBzb21lIGNvbW1lbnRzLgotCi1Nb24gU2VwIDE2IDE0OjQyOjUyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQgKEhMREVOVik6IEVkaXQgb3V0IGFsbCByZWZlcmVuY2VzLgotCi1UaHUgQXVnIDE1IDE5OjQ5OjIzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogdHJ1ZTogTmV3IHNjcmlwdCwgaWRlbnRpY2FsIHRvIG1wdy10cnVlLgotCSogZy1tcHctbWFrZS5zZWQ6IEFkZCBAREFTSF9DX0ZMQUdAIGFuZCBAU0VHTUVOVF9GTEFHKClACi0JdG8gdGhlIGVkaXRvcnMgZm9yIGNvbXBpbGUgY29tbWFuZHMuCi0KLVRodSBBdWcgIDEgMTU6MDE6NDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctdHJ1ZSwgbXB3LXRvdWNoLCBudWxsLWNvbW1hbmQ6IE5ldyBzY3JpcHRzLgotCSogUkVBRE1FOiBEZXNjcmliZSB1c2FnZSBpbiBtb3JlIGRldGFpbC4KLQotVHVlIERlYyAxMiAxNDo1MTo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBEb24ndCBlZGl0IG91dCAidmVyc2lvbj0iIG9jY3VycmVuY2VzLgotCi1GcmkgRGVjICAxIDExOjQ2OjE4IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQgKGJpbmRpciwgbGliZGlyKTogRWRpdCB0aGUgcG9zaXRpb25zIG9mCi0JcGF0aG5hbWUgc2VwYXJhdG9ycyB0byB3b3JrIHdpdGggb3RoZXIgcGF0aG5hbWVzIGJldHRlci4KLQotVHVlIE5vdiAgNyAxNTowODowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBBZGQgY29tbWVudCBhYm91dCBEdXBsaWNhdGUgdnMgQ2F0ZW5hdGUsCi0JYWRkIGFkZGl0aW9uYWwgcGF0dGVybiBmb3IgZWRpdGluZyBsaW5rLWNvbXBpbGUgY29tbWFuZHMuCi0KLVR1ZSBPY3QgMjQgMTQ6Mjg6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZDogQWRkIGhhbmRsaW5nIGZvciAqLnRhYi5baGNdIGZpbGVzLgotCShDSElMTF9GT1JfVEFSR0VULCBDSElMTF9MSUIpOiBFZGl0IG91dCB0cmlja3kgZGVmaW5pdGlvbnMKLQlvZiB0aGVzZS4KLQotVGh1IFNlcCAyOCAyMTowNToxMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgZ2VuZXJpYyBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlCi0JVW5peCBtYWtlZmlsZXMgaW50byBNUFcgbWFrZWZpbGUgc3ludGF4LgotCi1GcmkgTWFyIDE3IDExOjUxOjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogUkVBRE1FOiBDbGFyaWZ5IGluc3RydWN0aW9ucy4KLQkqIGZpOiBSZW1vdmUuCi0KLVdlZCBEZWMgMjEgMTU6NDU6NTMgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNb3ZlSWZDaGFuZ2UsIFJFQURNRSwgZmksIGZvcndhcmQtaW5jbHVkZSwgb3Blbi1icmFjZSwKLSAgICAgICAgdHItN3RvOC1zcmM6IE5ldyBmaWxlcy4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvTW92ZUlmQ2hhbmdlIGIvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmMxMjUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIFJlbmFtZSBhIGZpbGUgb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSBhIHByZXZpb3VzbHkgZXhpc3RpbmcKLSMgZmlsZSBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGtlZXBpbmcgbWFrZSBmcm9tIGRvaW5nCi0jIHRvbyBtdWNoIHdvcmsgaWYgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBoYXZlbid0IGNoYW5nZWQuCi0KLSMgVGhpcyBpcyBhbiBNUFcgdHJhbnNsYXRpb24gb2YgdGhlIHN0YW5kYXJkIEdOVSBzaCBzY3JpcHQgbW92ZS1pZi1jaGFuZ2UuCi0KLVNldCBleGl0IDAKLQotSWYgImBleGlzdHMgLWYgInsyfSJgIgotICBDb21wYXJlICJ7MX0iICJ7Mn0iID5kZXY6bnVsbAotICBJZiB7c3RhdHVzfSAhPSAwCi0gICAgUmVuYW1lIC15ICJ7MX0iICJ7Mn0iCi0gIEVsc2UKLSAgICBFY2hvICJ7Mn0iIGlzIHVuY2hhbmdlZAotICAgIERlbGV0ZSAtaSAteSAiezF9IgotICBFbmQKLUVsc2UKLSAgUmVuYW1lIC15ICJ7MX0iICJ7Mn0iCi1FbmQKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvUkVBRE1FIGIvY29uZmlnL21wdy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDcwMGEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBNUFcgc2NyaXB0cyBhbmQgcmVsYXRlZCBmaWxlcyB0aGF0IGFyZSBuZWVkZWQgdG8KLWJ1aWxkIEN5Z251cyBHTlUgdG9vbHMgZm9yIE1QVy4gIFRoZSBzY3JpcHRzIHNob3VsZCBiZSBzb21ld2hlcmUgb24gdGhlCi1jb21tYW5kIHBhdGg7IG91ciB1c3VhbCBwcmFjdGljZSBoYXMgYmVlbiB0byBoYXZlIGEgc2VwYXJhdGUgZGlyZWN0b3J5Ci1mb3IgdGhlIHNjcmlwdHMsIGFuZCBwdXQgdGhlIHRvb2xzIChieWFjYywgZmxleCwgYW5kIHNlZCBhdCBsZWFzdCkgdGhlcmUKLWFsc287IHRoZW4gaXQncyBlYXNpZXIgdG8gZHJhZyB0aGUgc3VwcG9ydCBiaXRzIGFyb3VuZCBhcyBhIGdyb3VwLCBvciB0bwotdXBncmFkZSBNUFcgdmVyc2lvbnMuICBUaGUgY29tcGxldGUgcGFja2FnZSBvZiBzY3JpcHRzIGFuZCB0b29sIGJpbmFyaWVzCi1pcyB1c3VhbGx5IGF2YWlsYWJsZSBhcyBwdWIvbWFjL2J1aWxkdG9vbHMuY3B0LmhxeCBvbiBmdHAuY3lnbnVzLmNvbS4KLQotInRyLTd0bzgtc3JjIiBpcyBhY3R1YWxseSB0aGUgc291cmNlIHRvIGFuIE1QVyBzY3JpcHQgdGhhdCB0cmFuc2Zvcm1zCi1zZXF1ZW5jZXMgbGlrZSAiXE9wdGlvbi1kIiBpbnRvIHRoZSBhY3R1YWwgOC1iaXQgY2hhcnMgdGhhdCBNUFcgbmVlZHMuCi1JdCdzIG9ubHkgdGhlIHNvdXJjZSBiZWNhdXNlIGl0IGNhbid0IGl0c2VsZiBpbmNsdWRlIGFueSA4LWJpdCBjaGFycy4KLUl0ICpjYW4qIGJlIHByb2Nlc3NlZCBpbnRvIGEgZ2VudWluZSAidHItN3RvOCIgYnkgdXNpbmcgaXRzZWxmOgotCi0JdHItN3RvOCB0ci03dG84LXNyYyB8IHNlZCAtZSAncy9TcmMvLycgPm5ldy10ci03dG84Ci0KLVVzZSB0aGlzIHRvIHZlcmlmeToKLQotCWNvbXBhcmUgdHItN3RvOCBuZXctdHItN3RvOAotCi1JZiB5b3UgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgdHItN3RvOCwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5Ci1yZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiAiXE9wdGlvbi1kIiB3aXRoIHJlYWwgT3B0aW9uLWQgKHdoaWNoIGxvb2tzCi1saWtlIGEgZGVsdGEpLCB0aGVuIGRvIHNpbWlsYXJseSB3aXRoIGFsbCB0aGUgb3RoZXIgIlxPcHRpb24tLi4uIgotc3RyaW5ncywgYW5kIHRoZW4gY2hhbmdlICJcU3JjT3B0aW9uLWQiIGludG8gdGhlIHN0cmluZyAiXE9wdGlvbi1kIi4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvZm9yd2FyZC1pbmNsdWRlIGIvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDZiZDcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUVjaG8gJyNpbmNsdWRlJyC2IiJ7MX0itiIgPiJ7Mn0iLnRlbQotTW92ZUlmQ2hhbmdlICJ7Mn0iLnRlbSAiezJ9IgotCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkIGIvY29uZmlnL21wdy9nLW1wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkM2M3Ny4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4IG1ha2VmaWxlcyBpbnRvIE1QVyBtYWtlZmlsZXMuCi0jIFRoZXNlIGFyZSBub21pbmFsbHkgZ2VuZXJpYywgYnV0IHdvcmsgYmVzdCBvbiB0aGUgbWFrZWZpbGVzIHVzZWQKLSMgZm9yIEdOVSBwcm9ncmFtcy4KLQotIyBXaGFjayBvdXQgYW55IGNvbW1lbnRlZC1vdXQgbGluZXMgdGhhdCBhcmUgcHJvYmFibHkgY29tbWFuZHM7Ci0jIHRoZXkgY2FuIG9ubHkgY2F1c2UgdHJvdWJsZSBsYXRlciBvbi4KLS9eIwkvZAotCi0jIENoYW5nZSBkZXBlbmRlbmN5IGNoYXIuCi0vOiQvcy86LyBcXE9wdGlvbi1mL2cKLS9eW14gCTojXVteOl0qOi9zL1woWyAJXSpcKTpcKFsgCV0qXCkvIFxcT3B0aW9uLWYgL2cKLQotIyBDaGFuZ2Ugc3ludGF4IG9mIE1ha2VmaWxlIHZhcnMuCi0vXCQvcy9cJHtcKFthLXpBLVowLTlfLV0qXCl9L3tcMX0vZwotL1wkL3MvXCQoXChbYS16QS1aMC05Xy1dKlwpKS97XDF9L2cKLS8gJEAvcy8gJEAvIHtUYXJnfS8KLQotIyBEb3VibGUtJCBhcmUgbGl0ZXJhbHMgdG8gVW5peCBidXQgbm90IHRvIE1QVyBtYWtlLgotL1wkXCQvcy9cJFwkLyQvZwotCi0jIENoYW5nZSBwYXRobmFtZSBzeW50YXguCi0vXC8vcyxcLlwuL1wvXC5cLi8sOjo6LGcKLS9cLy9zLFwuXC4vLDo6LGcKLS9cLlwvL3MsXC4vLDosZwotL1wvL3MsLyw6LGcKLSMgVW5kbyBleGNlc3MgY2hhbmdlcy4KLS9hbmQvcyxhbmQ6b3IkLGFuZC9vciwKLS9hbmQvcyxhbmQ6b3IgLGFuZC9vciAsCi0vd2FudC9zLHdhbnQ6bmVlZCx3YW50L25lZWQsCi0jIEZpeGluZyB1cCBzZWQgY29tbWFuZHMuCi0vLWUvc18iOlwoW146XSpcKTpkIl8iL1wxL2QiX2cKLS8tZS9zXyI6XChbXjpdKlwpOiw6XChbXjpdKlwpOmQiXyIvXDEvLC9cMi9kIl9nCi0KLS89L3MvID0gXC4kLyA9IDovCi0KLSMgTWFrZSB0aGVzZSBnbyBhd2F5IHNvIHRoYXQgbGF0ZXIgZWRpdHMgbm90IGNvbmZ1c2VkLgotL0hMREVOVi9zL3tITERFTlZ9Ly8KLQotIyBDb21tZW50IG91dCBhbnkgZXhwbGljaXQgc3JjZGlyIHNldHRpbmcuCi0vc3JjZGlyL3MvXnNyY2Rpci8jIHNyY2Rpci8KLQotL0JBU0VESVIvcy9eQkFTRURJUiA9LiokL0JBU0VESVIgPSAie3NyY3Jvb3R9Ii8KLS97QkFTRURJUn06L3Mve0JBU0VESVJ9Oi97QkFTRURJUn0vZwotL3tzcmNkaXJ9Oi9zL3tzcmNkaXJ9Oi8ie3NyY2Rpcn0iL2cKLS8ie3NyY2Rpcn0iOi9zLyJ7c3JjZGlyfSI6LyJ7c3JjZGlyfSIvZwotCi0jIFR3ZWFrIHNvbWUgY29udmVudGlvbnMgdGhhdCBhcmUgYmFja3dhcmRzIGZvciB0aGUgTWFjLgotL2JpbmRpci9zL3tleGVjX3ByZWZpeH06YmluL3tleGVjX3ByZWZpeH1iaW46LwotL2xpYmRpci9zL3tleGVjX3ByZWZpeH06bGliL3tleGVjX3ByZWZpeH1saWI6LwotCi0jIENvbW1lbnQgb3V0IHNldHRpbmdzIG9mIGFueXRoaW5nIHNldCBieSBtcHcgaG9zdCBjb25maWcuCi0vQ0Mvcy9eQ0MgKj0vI0NDID0vCi0vQ0ZMQUdTL3MvXkNGTEFHUyAqPS8jQ0ZMQUdTID0vCi0vQVIvcy9eQVIgKj0vI0FSID0vCi0vQVJfRkxBR1Mvcy9eQVJfRkxBR1MgKj0vI0FSX0ZMQUdTID0vCi0vUkFOTElCL3MvXlJBTkxJQiAqPS8jUkFOTElCID0vCi0vQ0NfTEQvcy9eQ0NfTEQgKj0vI0NDX0xEID0vCi0vTERGTEFHUy9zL15MREZMQUdTICo9LyNMREZMQUdTID0vCi0KLSMgQ2hhbmdlIC1JIHVzYWdlcy4KLS8tSS9zLy1JXC4vLWkgOi9nCi0vLUkvcy8tSTo6YmZkLy1pIDo6YmZkOi9nCi0vLUkvcy8tSTo6aW5jbHVkZS8taSA6OmluY2x1ZGU6L2cKLS8tSS9zLy1JLy1pIC9nCi0KLSMgQ2hhbmdlIC1EIHVzYWdlLgotLy1EL3MvXChbID1dXCktRFwoW14gXSpcKS9cMS1kIFwyL2cKLQotIyBDaGFuZ2UgY29udGludWF0aW9uIGNoYXIuCi0vXFwkL3MvXFwkL1xcT3B0aW9uLWQvCi0KLSMgQ2hhbmdlIHdpbGRjYXJkIGNoYXIuCi0vXCovcy9cKi9cXE9wdGlvbi14L2cKLQotIyBDaGFuZ2UgcGF0aCBvZiB2YXJpb3VzIHR5cGVzIG9mIHNvdXJjZSBmaWxlcy4gIFRoaXMgcnVsZSBkb2VzIG5vdCBhbGxvdwotIyBmb3IgZmlsZSBuYW1lcyB3aXRoIG11bHRpcGxlIGRvdHMgaW4gdGhlIG5hbWUuCi0vXC5bY2hseV0vcy9cKFsgCT48PV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5cKFtjaGx5XVwpL1wxIntzfSJcMi5cMy9nCi0vXC5bY2hseV0vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLlwoW2NobHldXCkvIntzfSJcMS5cMi8KLSMgQWxsb3cgZmlsZXMgbmFtZWQgKi50YWIuW2NoXSBhcyBhIHNwZWNpYWwgY2FzZS4KLS9cLnRhYlwuW2NoXS9zL1woWyAJPjw9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXC50YWJcKVwuXChbY2hdXCkvXDEie3N9IlwyLlwzL2cKLS9cLnRhYlwuW2NoXS9zL15cKFstYS16QS1aMC05XyR7fToiXSpcLnRhYlwpXC5cKFtjaF1cKS8ie3N9IlwxLlwyLwotIyBGaXggc29tZSBvdmVyZW50aHVzaWFzbXMuCi0ve3N9L3MvIntzfSIie3NyY2Rpcn0iLyJ7c3JjZGlyfSIvZwotL3tzfS9zLyJ7c30ie1woW2EtekEtWjAtOV9dKlwpZGlyfS8ie1wxZGlyfSIvZwotL3tzfS9zLyJ7c30ie1woW2EtekEtWjAtOV9dKlwpRElSfS8ie1wxRElSfSIvZwotL3tzfS9zLyJ7c30iIntcKFthLXpBLVowLTlfXSpcKWRpcn0iLyJ7XDFkaXJ9Ii9nCi0ve3N9L3MvIntzfSIie1woW2EtekEtWjAtOV9dKlwpRElSfSIvIntcMURJUn0iL2cKLS97c30vcy8ie3N9IjovOi9nCi0ve3N9L3MvXiJ7c30iLy9nCi0ve3N9L3MvIntzfSIie3N9Ii8ie3N9Ii9nCi0ve3N9L3MvIntzfSIie3NyY2Rpcn0iLyJ7c30iL2cKLS97c30vcy8ie3NyY2Rpcn0iIntzfSIvIntzfSIvZwotCi0jIFRoZSAuZGVmIGZpbGVzIGFyZSBhbHNvIHR5cGljYWxseSBzb3VyY2UgZmlsZXMuCi0vXC5kZWYvcy9cKFsgCT48XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLmRlZi9cMSJ7c30iXDIuZGVmL2cKLS9cLmRlZi9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwuZGVmLyJ7c30iXDEuZGVmL2cKLQotIyBDaGFuZ2UgZXh0ZW5zaW9uIGFuZCBwYXRoIG9mIG9iamVjdHMuCi0vXC5vL3MvXChbIAk9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLm8vXDEie299IlwyLmMuby9nCi0vXC5vL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5vLyJ7b30iXDEuYy5vLwotIyBBbGxvdyAqLnRhYi5vIGZpbGVzIGFzIGEgc3BlY2lhbCBjYXNlIG9mIGEgMi1kb3QtbmFtZSBmaWxlLgotL1wuby9zL1woWyAJPV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC50YWJcLm8vXDEie299IlwyLnRhYi5jLm8vZwotL1wuby9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwudGFiXC5vLyJ7b30iXDEudGFiLmMuby8KLSMgQ2xlYW4gdXAuCi0vIntvfSIvcy8ie299IiJ7b30iLyJ7b30iL2cKLS8ie299Ii9zL14ie299IlwoW2EtekEtWjAtOV9dKlwpPS9cMT0vCi0KLSMgQ2hhbmdlIGV4dGVuc2lvbiBvZiBsaWJzLgotL1wuYS9zL2xpYlwoW2Etel0qXClcLmEvbGliXDEuby9nCi0KLSMgUmVtb3ZlIG5vbi1mYWlsIG9wdGlvbi4KLS8tL3MvXlwoWyAJXSpcKS0vXDEvCi0jIEZpeCBvdmVyZWFnZXJuZXNzZXMgLSBhc3N1bWVzIG5vIG9uZS1sZXR0ZXIgY29tbWFuZHMuCi0vXlsgCV0qW2Etel0gL3MvXlwoWyAJXSpcKVwoW2Etel1cKSAvXDEtXDIgLwotCi0jIFJlbW92ZSBub24tZWNobyBvcHRpb24uICh3YXRjaCBvdXQgZm9yIGF1dG9jb25mIHRoaW5ncykKLS9AL3MvXlwoWyAJXSpcKUAvXDEvCi0KLSMgQ2hhbmdlIGNwIHRvIER1cGxpY2F0ZS4KLSMgQ2F0ZW5hdGUgaXMgcGVyaGFwcyBtb3JlIGFjY3VyYXRlLCBidXQgdGhlIHBhdHRlcm4gd291bGQgaGF2ZSB0bwotIyBpZGVudGlmeSB0aGUgb3V0cHV0IGZpbGUgYW5kIGFkZCBhICc+JyByZWRpcmVjdGlvbiBpbnRvIGl0LgotL2NwL3MvXlwoWyAJXSpcKWNwIC9cMUR1cGxpY2F0ZSAtZCAteSAvCi0jIENoYW5nZSBtdiB0byBSZW5hbWUuCi0vbXYvcy9eXChbIAldKlwpbXYgL1wxUmVuYW1lIC15IC8KLS9SZW5hbWUvcy9eXChbIAldKlwpUmVuYW1lIC15IC1mL1wxUmVuYW1lIC15LwotIyBDaGFuZ2Ugcm0gdG8gRGVsZXRlLgotL3JtIC1yZi9zL15cKFsgCV0qXClybSAtcmYgL1wxRGVsZXRlIC1pIC15IC8KLS9ybSAtZi9zL15cKFsgCV0qXClybSAtZiAvXDFEZWxldGUgLWkgLXkgLwotL3JtL3MvXlwoWyAJXSpcKXJtIC9cMURlbGV0ZSAtaSAteSAvCi0jIE5vdGUgdGhhdCB3ZSBkb24ndCBtZXNzIHdpdGggbG4gLSBkaXJlY3Rvcnktc3BlY2lmaWMgc2NyaXB0cwotIyBtdXN0IGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggc3ltbGlua3MuCi0jIENoYW5nZSBjYXQgdG8gQ2F0ZW5hdGUuCi0vY2F0L3MvXlwoWyAJXSpcKWNhdCAvXDFDYXRlbmF0ZSAvCi0jIENoYW5nZSB0b3VjaCB0byBtcHctdG91Y2guCi0vdG91Y2gvcy9eXChbIAldKlwpdG91Y2ggL1wxbXB3LXRvdWNoIC8KLSMgQ2hhbmdlIG1rZGlyIHRvIE5ld0ZvbGRlci4KLS9ta2Rpci9zL15cKFsgCV0qXClta2RpciAvXDFOZXdGb2xkZXIgLwotIyBDaGFuZ2UgdmFyIHNldHRpbmcgdG8gU2V0LgotLz0vcy9eXChbIAldKlwpXChbLWEtekEtWjAtOV9dKlwpPVwoW147XSpcKTsgXFxPcHRpb24tZC9cMVNldCBcMiBcMy8KLQotIyBDaGFuZ2UgdGVzdHMuCi0vaWYgL3MvaWYgXFsgKi1mIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAqLWYgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiLwotL2lmIC9zL2lmIFxbICEgKi1mIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZiBcKFteIF0qXCkgXSAqOyAqdGhlbiBcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLQotL2lmIC9zL2lmIFxbICotZCBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCi0vaWYgL3MvaWYgXFsgKi1kIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZCBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCi0vaWYgL3MvaWYgXFsgISAqLWQgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiID09ICIiLwotCi0vaWYgL3MvaWYgXFsgLWQgXChbXiBdKlwpIF0gKjsgdGhlbiB0cnVlICo7IGVsc2UgbWtkaXIgXChbXiA7XSpcKSAqOyBmaS9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIgTmV3Rm9sZGVyIFwyIEVuZCBJZi8KLQotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSA9IFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgPT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgPSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiID09ICJcMiIvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgIT0gXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgIlwxIiAhPSAiXDIiLwotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSAhPSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgLWVxIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgLWVxIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLQotL15bIAldKmVsc2UgdHJ1ZSQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZVwKLQotCi0vZWxzZS9zL15cKFsgCV0qXCllbHNlWyAJXSokL1wxRWxzZS8KLS9lbHNlL3MvXlwoWyAJXSpcKWVsc2VbOyAJXSpcXE9wdGlvbi1kJC9cMUVsc2UvCi0KLS9eWyAJXSplbHNlWyAJXSp0cnVlWyAJXSokL2NcCi0JRWxzZVwKLQkJbXB3LXRydWUKLQotL15bIAldKmVsc2VbIAldKnRydWVbOyAJXSpmaSQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZVwKLQlFbmQgSWYKLQotL2ZpL3MvXlwoWyAJXSpcKWZpICokL1wxRW5kLwotL2ZpL3MvXlwoWyAJXSpcKWZpICo7ICpcXE9wdGlvbi1kL1wxRW5kLwotCi0jIENoYW5nZSBsb29waW5nLgotL2Zvci9zL15cKFsgCV0qXClmb3IgXChbLWEtekEtWjAtOV9dKlwpIGluIFwoW147XSpcKTsgKmRvICpcXE9wdGlvbi1kL1wxRm9yIFwyIEluIFwzLwotL15cKFsgCV0qXClkbyAqXFxPcHRpb24tZC9kCi0vZG9uZS9zL15cKFsgCV0qXClkb25lICo7ICpcXE9wdGlvbi1kL1wxRW5kLwotL2RvbmUvcy9eXChbIAldKlwpZG9uZSQvXDFFbmQvCi0KLSMgVHJhaWxpbmcgc2VtaWNvbG9ucyBhbmQgY29udGludWVkIGxpbmVzIGFyZSB1bm5lZWRlZCBzaCBzeW50YXguCi0vOyBcXE9wdGlvbi1kL3MvOyBcXE9wdGlvbi1kLy8KLQotIyBDaGFuZ2UgbW92ZS1pZi1jaGFuZ2UgdG8gTW92ZUlmQ2hhbmdlLgotL21vdmUtaWYtY2hhbmdlL3MvXChbXiAJXSpcKW1vdmUtaWYtY2hhbmdlL01vdmVJZkNoYW5nZS9nCi0KLSMgQ2hhbmdlICQoU0hFTEwpIHRvIHRoZSBzY3JpcHQgbmFtZSBieSBpdHNlbGYuCi0vU0hFTEwvcy9eXChbIAldKlwpe1NIRUxMfSAvXDEvCi0KLSMgQ2hhbmdlIHN5bnRheCBvZiBkZWZhdWx0IHJ1bGUgZGVwZW5kZW5jeS4KLS9eXC5jXC5vL3MvXlwuY1wubyBcXE9wdGlvbi1mJC8uYy5vIFxcT3B0aW9uLWYgLmMvCi0KLSMgQ2hhbmdlIGRlZmF1bHQgcnVsZSdzIGFjdGlvbi4KLS97Q0N9IC1jL3Mve0NDfSAtYyBcKC4qXCkgXCQ8JC97Q0N9IEBEQVNIX0NfRkxBR0Age0RlcERpcn17RGVmYXVsdH0uYyBcMSBAU0VHTUVOVF9GTEFHKHtEZWZhdWx0fSlAIC1vIHtUYXJnRGlyfXtEZWZhdWx0fS5jLm8vCi0KLSMgVGhpcyBpcyBwcmV0dHkgZGlzZ3VzdGluZywgYnV0IEkgY2FuJ3Qgc2VlbSB0byBkZXRlY3QgZW1wdHkgcnVsZXMuCi0vT3B0aW9uLWYkL3MvT3B0aW9uLWYkL09wdGlvbi1mIF9vbGRlc3QvZwotCi0jIFJlbW92ZSAtYyBmcm9tIGV4cGxpY2l0IGNvbXBpbGVyIGNhbGxzLiAoYnV0IHNob3VsZCBub3QgaWYgR0NDKQotIyBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzb3VyY2UgZmlsZSB0aGF0IGlzICJ7eHh4fSJmaWxlLmMuCi0vIC1jIC9zL3tcKFtBLVpfXSpcKUNDfVwoLipcKSAtYyBcKC4qXCkiXChbXiJdKlwpIlwoWy1hLXpfXSpcKVwuYy97XDFDQ31cMiBAREFTSF9DX0ZMQUdAIFwzIlw0Ilw1LmMgLW8gIntvfSJcNS5jLm8vCi0jIEhhbmRsZSB0aGUgY2FzZSBvZiBhIHNvdXJjZSBmaWxlIHRoYXQgaXMgInt4eHh9ImRpcjpmaWxlLmMuCi0vIC1jIC9zL3tcKFtBLVpfXSpcKUNDfVwoLipcKSAtYyBcKC4qXCkiXChbXiJdKlwpIlwoWy1hLXpfXSpcKTpcKFstYS16X10qXClcLmMve1wxQ0N9XDIgQERBU0hfQ19GTEFHQCBcMyJcNCJcNTpcNi5jIC1vICJ7b30iXDYuYy5vLwotCi0jIENoYW5nZSBsaW5raW5nIGNjIHRvIGxpbmtpbmcgc2VxdWVuY2UuCi0vLW8vcy9eXChbIAldKlwpe0NDfSBcKC4qXCl7XChbQS1aX10qXClDRkxBR1N9IFwoLipcKXtMREZMQUdTfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpJC9cMXtDQ19MRH0gXDIge1wzQ0ZMQUdTfSBcNCB7TERGTEFHU30gXDUgLW8gXDZ7UFJPR19FWFR9IFw3XAotXDF7TUFLRVBFRn0gXDZ7UFJPR19FWFR9IC1vIFw2IHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKLVwxe1JFWn0gIntzfSJcNi5yIC1vIFw2IC1hcHBlbmQgLWQgUFJPR19OQU1FPSciJ1w2JyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJy8KLS8tby9zL15cKFsgCV0qXCl7Q0N9IFwoLipcKXtcKFtBLVpfXSpcKUNGTEFHU30gXCguKlwpLW8gXChbXiBdKlwpIFwoLipcKXtMREZMQUdTfSBcKC4qXCkkL1wxe0NDX0xEfSBcMiB7XDNDRkxBR1N9IFw0IHtMREZMQUdTfSBcNiAtbyBcNXtQUk9HX0VYVH0gXDdcCi1cMXtNQUtFUEVGfSBcNXtQUk9HX0VYVH0gLW8gXDUge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9Ilw1LnIgLW8gXDUgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDUnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotLy1vL3MvXlwoWyAJXSpcKXtIT1NUX0NDfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpJC9cMXtIT1NUX0NDX0xEfSBcMiAtbyBcM3tQUk9HX0VYVH0gXDRcCi1cMXtNQUtFUEVGfSBcM3tQUk9HX0VYVH0gLW8gXDMge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9IlwzLnIgLW8gXDMgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDMnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotCi0jIENvbW1lbnQgb3V0IC5OT0VYUE9SVCBydWxlcy4KLS9cLk5PRVhQT1JUL3MvXlwuTk9FWFBPUlQvI1wuTk9FWFBPUlQvCi0jIENvbW1lbnQgb3V0IC5QSE9OWSBydWxlcy4KLS9cLlBIT05ZL3MvXlwuUEhPTlkvI1wuUEhPTlkvCi0jIENvbW1lbnQgb3V0IC5QUkVDSU9VUyBydWxlcy4KLS9cLlBSRUNJT1VTL3MvXlwuUFJFQ0lPVVMvI1wuUFJFQ0lPVVMvCi0jIENvbW1lbnQgb3V0IC5TVUZGSVhFUyBydWxlcy4KLS9cLlNVRkZJWEVTL3MvXlwuU1VGRklYRVMvI1wuU1VGRklYRVMvCi0KLSMgU2V0IHRoZSBpbnN0YWxsIHByb2dyYW0gYXBwcm9wcmlhdGVseS4KLS9JTlNUQUxML3MvXklOU1RBTEwgKj0gKmAuKmA6aW5zdGFsbC5zaCAtYy9JTlNUQUxMID0gRHVwbGljYXRlIC15LwotCi0jIERvbid0IHRyeSB0byBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIHRyZWUncyBvd24gdG9vbHMuCi0vYmlzb24vcy9gLipiaXNvbjpiaXNvbi4qYC9iaXNvbiAteS8KLS9ieWFjYy9zL2AuKmJ5YWNjOmJ5YWNjLipgL2J5YWNjLwotL2ZsZXgvcy9gLipmbGV4OmZsZXguKmAvZmxleC8KLQotIyBUdXJuIHRyYW5zZm9ybWVkIEMgY29tbWVudHMgaW4gZWNobyBjb21tYW5kcyBiYWNrIGludG8gY29tbWVudHMuCi0vZWNoby9zLGVjaG8gJ1woLipcKTpcXE9wdGlvbi14XCguKlwpXFxPcHRpb24teDpcKC4qXCknLGVjaG8gJ1wxLypcMiovXDMnLAotCi0jIFdoYWNrIG91dCB2YXJpb3VzIGNsZXZlciBleHByZXNzaW9ucyB0aGF0IHNlYXJjaCBmb3IgdG9vbHMsIHNpbmNlCi0jIHRoZSBjbGV2ZXIgY29kZSBpcyB0b28gL2Jpbi9zaCBzcGVjaWZpYy4KLQotL15BUl9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1BUl9GT1JfVEFSR0VUID0gOjpiaW51dGlsczphclwKLQotCi0vXlJBTkxJQl9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1SQU5MSUJfRk9SX1RBUkdFVCA9IDo6YmludXRpbHM6cmFubGliXAotCi0KLS9eUkFOTElCX1RFU1RfRk9SX1RBUkdFVCA9IC8sL3JhbmxpYiBdICkkL2NcCi1SQU5MSUJfVEVTVF9GT1JfVEFSR0VUID0gXAotCi0KLS9eRVhQRUNUID0gYC8sL2AkL2NcCi1FWFBFQ1QgPSBcCi0KLQotL15SVU5URVNUID0gYC8sL2AkL2NcCi1SVU5URVNUID0gXAotCi0KLS9eQ0NfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAotQ0NfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNYWF9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1DWFhfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNISUxMX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKLUNISUxMX0ZPUl9UQVJHRVQgPSBcCi0KLQotL15DSElMTF9MSUIgPSBgLywvYCQvY1wKLUNISUxMX0xJQiA9IFwKLQotL3Nhbml0L3Mve3N0YXJ0LXNhbml0Li4uLVthLXowLTldKn0vLwotL3Nhbml0L3Mve2VuZC1zYW5pdC4uLi1bYS16MC05XSp9Ly8KLQotIyBBZGQgc3RhbmRhcmQgZGVmaW5lcyBhbmQgZGVmYXVsdCBydWxlcy4KLS9eIyBzcmNkaXIvYVwKLVwKLXMgPSAie3NyY2Rpcn0iXAotXAotbyA9IDpcCi1cCi0ie299IiBcXE9wdGlvbi1mIDogIntzfSIKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9tcHctdG91Y2ggYi9jb25maWcvbXB3L21wdy10b3VjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2E1MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L21wdy10b3VjaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyAiVG91Y2giIGNvbW1hbmQuCi0KLUlmICJgRXhpc3RzICJ7MX0iYCIgIT0gIiIKLQlTZXRGaWxlIC1tIC4gInsxfSIKLUVsc2UKLQlFY2hvICcgJyA+ICJ7MX0iCi1FbmQgSWYKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbXB3LXRydWUgYi9jb25maWcvbXB3L21wdy10cnVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTA2NTMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvbXB3LXRydWUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FeGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbnVsbC1jb21tYW5kIGIvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDRjOGUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIFRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcuCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L29wZW4tYnJhY2UgYi9jb25maWcvbXB3L29wZW4tYnJhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDY1ZGMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9vcGVuLWJyYWNlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIE1QVyBtYWtlZmlsZXMgc2VlbSBub3QgdG8gaGF2ZSBhbnkgd2F5IHRvIGdldCBhIGxpdGVyYWwgb3BlbgotIyBicmFjZSBpbnRvIGEgcnVsZSBhbnl3aGVyZSwgc28gdGhpcyBkb2VzIHRoZSBqb2IuCi0KLUVjaG8gJ3snCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjIGIvY29uZmlnL21wdy90ci03dG84LXNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwYjY0OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TdHJlYW1FZGl0IC1lIFxPcHRpb24tZAotICAnL1xPcHRpb24teC8gXE9wdGlvbi1kCi0gICAgUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi1kLyAiXE9wdGlvbi1kXE9wdGlvbi1kIiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLSAgICBSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLWYvICJcT3B0aW9uLWRcT3B0aW9uLWYiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tOC8gIlxPcHRpb24tZFxPcHRpb24tOCIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0JUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi01LyAiXE9wdGlvbi1kXE9wdGlvbi01IiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLQlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLXgvICJcT3B0aW9uLWRcT3B0aW9uLXgiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tci8gIlxPcHRpb24tZFxPcHRpb24tciIgLWMgXE9wdGlvbi01JyAgXE9wdGlvbi1kCi0gICJ7MX0iCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RydWUgYi9jb25maWcvbXB3L3RydWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDY1MzAuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy90cnVlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWcvbXQtYXJtcGljIGIvY29uZmlnL210LWFybXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtYXJtcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtZDMwdiBiL2NvbmZpZy9tdC1kMzB2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzRiNzc0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1kMzB2CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIEJ1aWxkIGxpYnJhcmllcyBvcHRpbWl6aW5nIGZvciBzcGFjZSwgbm90IHNwZWVkLgotIyBUdXJuIG9mZiB3YXJuaW5ncyBhYm91dCBzeW1ib2xzIG5hbWVkIHRoZSBzYW1lIGFzIHJlZ2lzdGVycwotIENGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zIC1XYSwtQwotIENYWEZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MgLVdhLC1DCmRpZmYgLS1naXQgYS9jb25maWcvbXQtZWxmYWxwaGFwaWMgYi9jb25maWcvbXQtZWxmYWxwaGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWVsZmFscGhhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtbGludXggYi9jb25maWcvbXQtbGludXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOWU2ZjEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWxpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFdoZW4gdXNpbmcgZ2xpYmMgMiBvbiBMaW51eCB3ZSBtdXN0IGFsd2F5cyB1c2UgdnRhYmxlIHRodW5rcy4KLUNYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTKSAtZnZ0YWJsZS10aHVua3MgLURfR05VX1NPVVJDRQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LW02OGtwaWMgYi9jb25maWcvbXQtbTY4a3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5ODcyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtbTY4a3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LW5ldHdhcmUgYi9jb25maWcvbXQtbmV0d2FyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4MmY5Yi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtbmV0d2FyZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUdEQl9OTE1fREVQUyA9IGFsbC1nY2MgYWxsLWxkCmRpZmYgLS1naXQgYS9jb25maWcvbXQtb3NwYWNlIGIvY29uZmlnL210LW9zcGFjZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwOTEwNC4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtb3NwYWNlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIEJ1aWxkIGxpYnJhcmllcyBvcHRpbWl6aW5nIGZvciBzcGFjZSwgbm90IHNwZWVkLgotIENGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zCi0gQ1hYRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXBhcGljIGIvY29uZmlnL210LXBhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1wYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXBwY3BpYyBiL2NvbmZpZy9tdC1wcGNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXBwY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXNwYXJjcGljIGIvY29uZmlnL210LXNwYXJjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBlYzI3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1zcGFyY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD1gY2FzZSAiJHtMSUJDRkxBR1N9ICR7TElCQ1hYRkxBR1N9IiBpbiAqLWZwaWMqICkgZWNobyAtZnBpYyA7OyAqICkgZWNobyAtZlBJQyA7OyBlc2FjYApkaWZmIC0tZ2l0IGEvY29uZmlnL210LXY4MTAgYi9jb25maWcvbXQtdjgxMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkYTZjMi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtdjgxMAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQ0NfRk9SX1RBUkdFVCA9IGNhNzMyIC1hbnNpCi1BU19GT1JfVEFSR0VUID0gYXM3MzIKLUFSX0ZPUl9UQVJHRVQgPSBhcjczMgotUkFOTElCX0ZPUl9UQVJHRVQgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbXQteDg2cGljIGIvY29uZmlnL210LXg4NnBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5ODcyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQteDg2cGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mcGljCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhZDYwYjcuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMTU5NSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyMjIFdBUk5JTkc6IHRoaXMgZmlsZSBjb250YWlucyBlbWJlZGRlZCB0YWJzLiAgRG8gbm90IHJ1biB1bnRhYmlmeSBvbiB0aGlzIGZpbGUuCi0KLSMgQ29uZmlndXJhdGlvbiBzY3JpcHQKLSMgQ29weXJpZ2h0IChDKSAxOTg4LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkuCi0KLSMKLSMgU2hlbGwgc2NyaXB0IHRvIGNyZWF0ZSBwcm9wZXIgbGlua3MgdG8gbWFjaGluZS1kZXBlbmRlbnQgZmlsZXMgaW4KLSMgcHJlcGFyYXRpb24gZm9yIGNvbXBpbGF0aW9uLgotIwotIyBJZiBjb25maWd1cmUgc3VjY2VlZHMsIGl0IGxlYXZlcyBpdHMgc3RhdHVzIGluIGNvbmZpZy5zdGF0dXMuCi0jIElmIGNvbmZpZ3VyZSBmYWlscyBhZnRlciBkaXN0dXJiaW5nIHRoZSBzdGF0dXMgcXVvLCAKLSMgICAgICAgY29uZmlnLnN0YXR1cyBpcyByZW1vdmVkLgotIwotCi1leHBvcnQgUEFUSCB8fCAoZWNobyAiT09QUywgdGhpcyBpc24ndCBzaC4gIERlc3BlcmF0aW9uIHRpbWUuICBJIHdpbGwgZmVlZCBteXNlbGYgdG8gc2guIjsgc2ggJDAgJGFyZ3Y7IGtpbGwgJCQpCi0KLXJlbW92ZT1ybQotaGFyZF9saW5rPWxuCi1zeW1ib2xpY19saW5rPSdsbiAtcycKLQotI2ZvciBUZXN0Ci0jcmVtb3ZlPSJlY2hvIHJtIgotI2hhcmRfbGluaz0iZWNobyBsbiIKLSNzeW1ib2xpY19saW5rPSJlY2hvIGxuIC1zIgotCi0jIGNsZWFyIHNvbWUgdGhpbmdzIHBvdGVudGlhbGx5IGluaGVyaXRlZCBmcm9tIGVudmlyb25tZW50LgotCi1NYWtlZmlsZT1NYWtlZmlsZQotTWFrZWZpbGVfaW49TWFrZWZpbGUuaW4KLWFyZ3VtZW50cz0KLWJ1aWxkX2FsaWFzPQotY2FjaGVfZmlsZT1jb25maWcuY2FjaGUKLWNhY2hlX2ZpbGVfb3B0aW9uPQotY29uZmlnZGlycz0KLWV4dHJhY29uZmlnZGlycz0KLWRpcm9wdGlvbnM9Ci1leGVjX3ByZWZpeD0KLWV4ZWNfcHJlZml4b3B0aW9uPQotZmF0YWw9Ci1mbG9hdGluZ19wb2ludD1kZWZhdWx0Ci1nYXM9ZGVmYXVsdAotZ2NjX3ZlcnNpb249Ci1nY2NfdmVyc2lvbl90cmlnZ2VyPQotaG9zdF9hbGlhcz1OT0hPU1QKLWhvc3RfbWFrZWZpbGVfZnJhZz0KLW1vdmVpZmNoYW5nZT0KLW5vcmVjdXJzaW9uPQotb3RoZXJfb3B0aW9ucz0KLXBhY2thZ2VfbWFrZWZpbGVfZnJhZz0KLXBhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZz0KLXByZWZpeD0vdXNyL2xvY2FsCi1wcm9nbmFtZT0KLXByb2dyYW1fcHJlZml4PQotcHJvZ3JhbV9wcmVmaXhvcHRpb249Ci1wcm9ncmFtX3N1ZmZpeD0KLXByb2dyYW1fc3VmZml4b3B0aW9uPQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLXByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb249Ci1yZWRpcmVjdD0KLXJlbW92aW5nPQotc2l0ZT0KLXNpdGVfbWFrZWZpbGVfZnJhZz0KLXNpdGVfb3B0aW9uPQotc3JjZGlyPQotc3JjdHJpZ2dlcj0KLXN1YmRpcnM9Ci10YXJnZXRfYWxpYXM9Tk9UQVJHRVQKLXRhcmdldF9tYWtlZmlsZV9mcmFnPQotdW5kZWZzPU5PVU5ERUZTCi12ZXJzaW9uPSIkUmV2aXNpb24kIgoteDExPWRlZmF1bHQKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIyMgd2UgbWlnaHQgbmVlZCB0byB1c2Ugc29tZSBvdGhlciBzaGVsbCB0aGFuIC9iaW4vc2ggZm9yIHJ1bm5pbmcgc3Vic2hlbGxzCi0KLSMjIyBJZiB3ZSBhcmUgb24gV2luZG93cywgc2VhcmNoIGZvciB0aGUgc2hlbGwuICBUaGlzIHdpbGwgcGVybWl0IHBlb3BsZQotIyMjIHRvIG5vdCBoYXZlIC9iaW4vc2gsIGJ1dCB0byBiZSBhYmxlIHRvIHNlZSAvU09NRS9QQVRIL3NoIGNvbmZpZ3VyZQotIyMjIHdpdGhvdXQgYWxzbyBoYXZpbmcgdG8gc2V0IENPTkZJR19TSEVMTC4gIFRoaXMgY29kZSB3aWxsIHdvcmsgd2hlbgotIyMjIHVzaW5nIGJhc2gsIHdoaWNoIHNldHMgT1NUWVBFLgotY2FzZSAiJHtPU1RZUEV9IiBpbgotKndpbjMyKikKLSAgaWYgWyB4JHtDT05GSUdfU0hFTEx9ID0geCBdOyB0aGVuCi0gICAgaWYgWyAhIC1mIC9iaW4vc2ggXTsgdGhlbgotICAgICAgaWYgWyB4JHtTSEVMTH0gIT0geCBdICYmIFsgLWYgJHtTSEVMTH0gXTsgdGhlbgotCUNPTkZJR19TSEVMTD0ke1NIRUxMfQotCWV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGVsc2UKLQlmb3IgcHJvZyBpbiBzaCBzaC5leGUgYmFzaCBiYXNoLmV4ZTsgZG8KLQkgIElGUz0iJHtJRlM9CX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLQkgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0JICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0JICAgIGlmIHRlc3QgLWYgJGRpci8kcHJvZzsgdGhlbgotCSAgICAgIENPTkZJR19TSEVMTD0kZGlyLyRwcm9nCi0JICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIHRlc3QgLW4gIiR7Q09ORklHX1NIRUxMfSIgJiYgYnJlYWsKLQlkb25lCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLWNvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1OT19FRElUPSJUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBlZGl0LiIKLQotIyMgdGhpcyBpcyBhIGxpdHRsZSB0b3VjaHkgYW5kIHdvbid0IGFsd2F5cyB3b3JrLCBidXQuLi4KLSMjCi0jIyBpZiB0aGUgYXJndlswXSBzdGFydHMgd2l0aCBhIHNsYXNoIHRoZW4gaXQgaXMgYW4gYWJzb2x1dGUgbmFtZSB0aGF0IGNhbiAoYW5kCi0jIyBtdXN0KSBiZSB1c2VkIGFzIGlzLgotIyMKLSMjIG90aGVyd2lzZSwgaWYgYXJndlswXSBoYXMgbm8gc2xhc2ggaW4gaXQsIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBvbiB0aGUKLSMjIHBhdGguICBTaW5jZSBQQVRIIG1pZ2h0IGluY2x1ZGUgIi4iIHdlIGFsc28gYWRkIGBwd2RgIHRvIHRoZSBlbmQgb2YgUEFUSC4KLSMjCi0KLXByb2duYW1lPSQwCi0jIGlmIFBXRCBhbHJlYWR5IGhhcyBhIHZhbHVlLCBpdCBpcyBwcm9iYWJseSB3cm9uZy4KLWlmIFsgLW4gIiRQV0QiIF07IHRoZW4gUFdEPWBwd2RgOyBmaQotCi1jYXNlICIke3Byb2duYW1lfSIgaW4KLS8qKSA7OwotKi8qKSA7OwotKikKLSAgICAgICAgUEFUSD0kUEFUSDoke1BXRD1gcHdkYH0gOyBleHBvcnQgUEFUSAotICAgICAgICA7OwotZXNhYwotCi0jIExvb3Agb3ZlciBhbGwgYXJncwotCi13aGlsZSA6Ci1kbwotCi0jIEJyZWFrIG91dCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhcmdzCi0JY2FzZSAkIyBpbgotCTApCi0JCWJyZWFrCi0JCTs7Ci0JZXNhYwotCi0jIEdldCB0aGUgZmlyc3QgYXJnLCBhbmQgc2h1ZmZsZQotCW9wdGlvbj0kMQotCXNoaWZ0Ci0KLSMgTWFrZSBhbGwgb3B0aW9ucyBoYXZlIHR3byBoeXBoZW5zCi0Jb3JpZ19vcHRpb249JG9wdGlvbgkjIFNhdmUgb3JpZ2luYWwgZm9yIGVycm9yIG1lc3NhZ2VzCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qKSA7OwotCS0qKSBvcHRpb249LSRvcHRpb24gOzsKLQllc2FjCi0JCQotIyBTcGxpdCBvdXQgdGhlIGFyZ3VtZW50IGZvciBvcHRpb25zIHRoYXQgdGFrZSB0aGVtCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qPSopCi0JCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uIgotCQk7OwotIyBUaGVzZSBvcHRpb25zIGhhdmUgbWFuZGF0b3J5IHZhbHVlcy4gIFNpbmNlIHdlIGRpZG4ndCBmaW5kIGFuID0gc2lnbiwKLSMgdGhlIHZhbHVlIG11c3QgYmUgaW4gdGhlIG5leHQgYXJndW1lbnQKLQktLWJ1KiB8IC0tY2FjaGUqIHwgLS1leCogfCAtLWhvKiB8IC0tcHJlKiB8IC0tcHJvZ3JhbS1wKiB8IC0tcHJvZ3JhbS1zKiB8IC0tcHJvZ3JhbS10KiB8IC0tc2kqIHwgLS1zciogfCAtLXRhKiB8IC0tdG0qIHwgLS14LSogfCAtLWJpKiB8IC0tc2IqIHwgLS1saSogfCAtLWRhKiB8IC0tc3kqIHwgLS1zaCogfCAtLWxvKiB8IC0taW4qIHwgLS1vbCogfCAtLW1hKikKLQkJb3B0YXJnPSQxCi0JCXNoaWZ0Ci0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uPSRvcHRhcmciCi0JCTs7Ci0JLS12KQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgLXYiCi0JCTs7Ci0JLS0qKQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgJG9wdGlvbiIKLQkJOzsKLQllc2FjCi0KLSMgTm93LCBwcm9jZXNzIHRoZSBvcHRpb25zCi0JY2FzZSAkb3B0aW9uIGluCi0KLQktLWJpKikKLQkJYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1iaW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLWJ1aWxkKiB8IC0tYnUqKQotCQljYXNlICIkYnVpbGRfYWxpYXMiIGluCi0JCSIiKSBidWlsZF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgYnVpbGQgbWFjaGluZSBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1jYWNoZSopCi0JCWNhY2hlX2ZpbGU9JG9wdGFyZwotCQk7OwotCS0tZGEqKQotCQlkYXRhZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1kYXRhZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1kaXNhYmxlLSopCi0JCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCi0JCWV2YWwgJGVuYWJsZW9wdD1ubwotCQlkaXNhYmxlb3B0aW9ucz0iJGRpc2FibGVvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS1lbmFibGUtKikKLQkJY2FzZSAiJG9wdGlvbiIgaW4KLQkJKj0qKQk7OwotCQkqKQlvcHRhcmc9eWVzIDs7Ci0JCWVzYWMKLQotCQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCQlldmFsICIkZW5hYmxlb3B0PSckb3B0YXJnJyIKLQkJZW5hYmxlb3B0aW9ucz0iJGVuYWJsZW9wdGlvbnMgJyRvcHRpb24nIgotCQk7OwotCS0tZXhlYy1wcmVmaXgqIHwgLS1leCopCi0JCWV4ZWNfcHJlZml4PSRvcHRhcmcKLQkJZXhlY19wcmVmaXhvcHRpb249Ii0tZXhlYy1wcmVmaXg9JG9wdGFyZyIKLQkJOzsKLQktLWdhcyB8IC0tZyopCi0JCWdhcz15ZXMKLQkJOzsKLQktLWhlbHAgfCAtLWhlKikKLQkJZmF0YWw9eWVzCi0JCTs7Ci0JLS1ob3N0KiB8IC0taG8qKQotCQljYXNlICRob3N0X2FsaWFzIGluCi0JCU5PSE9TVCkgaG9zdF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1pbmMqKQotCQlpbmNsdWRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmNsdWRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1pbmYqKQotCQlpbmZvZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmZvZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1saWJkKikKLQkJbGliZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxpYmUqKQotCQlsaWJleGVjZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJleGVjZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1sbyopCi0JCWxvY2Fsc3RhdGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxvY2Fsc3RhdGVkaXI9JG9wdGFyZyIKLQkJOzsKLQktLW1hKikKLQkJbWFuZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1tYW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLW5mcCB8IC0tbmYqKQotCQlmbG9hdGluZ19wb2ludD1ubwotCQlmbG9hdGluZ19wb2ludG9wdGlvbj0iLS1uZnAiCi0JCTs7Ci0JLS1ub3JlY3Vyc2lvbiB8IC0tbm8qKQotCQlub3JlY3Vyc2lvbj15ZXMKLQkJOzsKLQktLW9sKikKLQkJb2xkaW5jbHVkZWRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tb2xkaW5jbHVkZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tcHJlZml4KiB8IC0tcHJlKikKLQkJcHJlZml4PSRvcHRhcmcKLQkJcHJlZml4b3B0aW9uPSItLXByZWZpeD0kb3B0YXJnIgotCQk7OwotCS0tcHJvZ3JhbS1wcmVmaXgqIHwgLS1wcm9ncmFtLXAqKQotCQlwcm9ncmFtX3ByZWZpeD0kb3B0YXJnCi0JCXByb2dyYW1fcHJlZml4b3B0aW9uPSItLXByb2dyYW0tcHJlZml4PSRvcHRhcmciCi0JCTs7Ci0JLS1wcm9ncmFtLXN1ZmZpeCogfCAtLXByb2dyYW0tcyopCi0JCXByb2dyYW1fc3VmZml4PSRvcHRhcmcKLQkJcHJvZ3JhbV9zdWZmaXhvcHRpb249Ii0tcHJvZ3JhbS1zdWZmaXg9JG9wdGFyZyIKLQkJOzsKLQktLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUqIHwgLS1wcm9ncmFtLXQqKQotCQkjIERvdWJsZSBhbnkgYmFja3NsYXNoZXMgb3IgZG9sbGFyIHNpZ25zIGluIHRoZSBhcmd1bWVudAotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IC1lIGBlY2hvICR7b3B0YXJnfSB8IHNlZCAtZSAncy9cXFxcL1xcXFxcXFxcL2cnIC1lICdzL1xcXCQvJCQvZydgIgotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9uPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0nJG9wdGFyZyciCi0JCTs7Ci0JLS1ybSkKLQkJcmVtb3Zpbmc9LS1ybQotCQk7OwotCS0tc2IqKQotCQlzYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zYmluZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1zaCopCi0JCXNoYXJlZHN0YXRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zaGFyZWRzdGF0ZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tc2lsZW50IHwgLS1zaWwqIHwgLS1xdWlldCB8IC0tcSopCi0JCXJlZGlyZWN0PSI+L2Rldi9udWxsIgotCQl2ZXJib3NlPS0tc2lsZW50Ci0JCTs7Ci0JLS1zaXRlKiB8IC0tc2l0KikKLQkJc2l0ZT0kb3B0YXJnCi0JCXNpdGVfb3B0aW9uPSItLXNpdGU9JG9wdGFyZyIKLQkJOzsKLQktLXNyY2RpciovIHwgLS1zciovKQotICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuICBPdGhlcndpc2UsIHdoZW4gdGhlIGZpbGUgbmFtZSBnZXRzCi0gICAgICAgICAgICAgICAgIyBib2x0ZWQgaW50byBhbiBvYmplY3QgZmlsZSBhcyBkZWJ1ZyBpbmZvLCBpdCBoYXMgdHdvIHNsYXNoZXMKLSAgICAgICAgICAgICAgICAjIGluIGl0LiAgT3JkaW5hcmlseSB0aGlzIGlzIG9rLCBidXQgZW1hY3MgdGFrZXMgZG91YmxlIHNsYXNoCi0gICAgICAgICAgICAgICAgIyB0byBtZWFuICJmb3JnZXQgdGhlIGZpcnN0IHBhcnQiLgotCQlzcmNkaXI9YGVjaG8gJG9wdGFyZyB8IHNlZCAtZSAnczovJDo6J2AKLQkJOzsKLQktLXNyY2RpciogfCAtLXNyKikKLQkJc3JjZGlyPSRvcHRhcmcKLQkJOzsKLQktLXN5KikKLQkJc3lzY29uZmRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tc3lzY29uZmRpcj0kb3B0YXJnIgotCQk7OwotCS0tdGFyZ2V0KiB8IC0tdGEqKQotCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJTk9UQVJHRVQpIHRhcmdldF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLXRtcGRpciogfCAtLXRtKikKLQkJVE1QRElSPSRvcHRhcmcKLQkJdG1wZGlyb3B0aW9uPSItLXRtcGRpcj0kb3B0YXJnIgotCQk7OwotCS0tdmVyYm9zZSB8IC0tdiB8IC0tdmVyYiopCi0JCXJlZGlyZWN0PQotCQl2ZXJib3NlPS0tdmVyYm9zZQotCQk7OwotCS0tdmVyc2lvbiB8IC0tViB8IC0tdmVycyopCi0JCWVjaG8gIlRoaXMgaXMgQ3lnbnVzIENvbmZpZ3VyZSB2ZXJzaW9uIiBgZWNobyAke3ZlcnNpb259IHwgc2VkICdzL1sgJDpdLy9nJ2AKLQkJZXhpdCAwCi0JCTs7Ci0JLS13aXRoLSopCi0JCWNhc2UgIiRvcHRpb24iIGluCi0JCSo9KikJOzsKLQkJKikJb3B0YXJnPXllcyA7OwotCQllc2FjCi0KLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JCWV2YWwgJHdpdGhvcHQ9IiRvcHRhcmciCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLXdpdGhvdXQtKikKLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czpvdXQ6OjtzOi06XzpnJ2AKLQkJZXZhbCAkd2l0aG9wdD1ubwotCQl3aXRob3V0b3B0aW9ucz0iJHdpdGhvdXRvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS14KQl3aXRoX3g9eWVzCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLXgiCi0JCTs7Ci0JLS14LWkqIHwgLS14LWwqKSBvdGhlcl9vcHRpb25zPSIkb3RoZXJfb3B0aW9ucyAkb3JpZ19vcHRpb24iCi0JCTs7Ci0JLS0qKQotCQllY2hvICJjb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246IFwiJG9yaWdfb3B0aW9uXCI7IHVzZSAtLWhlbHAgZm9yIHVzYWdlLiIgPiYyCi0JCWV4aXQgMQotCQk7OwotCSopCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykgdW5kZWZzPSRvcHRpb24gOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQllc2FjCi1kb25lCi0KLSMgcHJvY2VzcyBob3N0IGFuZCB0YXJnZXQKLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIFVOREVGUwotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlbid0IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgdW5kZWZzIGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyAzLiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyA1LiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgZGVmYXVsdHMgdG8gaG9zdC4KLQotY2FzZSAiJHtmYXRhbH0iIGluCi0iIikKLQkjIE1ha2Ugc3VyZSB0aGF0IGhvc3QsIHRhcmdldCAmIHVuZGVmcyBhcmVuJ3QgYWxsIHNwZWNpZmllZCBhdCB0aGUKLQkjIHNhbWUgdGltZS4KLQljYXNlICRob3N0X2FsaWFzLS0tJHRhcmdldF9hbGlhcy0tLSR1bmRlZnMgaW4KLQlOT0hPU1QtLS0qLS0tKiB8ICotLS1OT1RBUkdFVC0tLSogfCAqLS0tKi0tLU5PVU5ERUZTKQotCQk7OwotCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUuICAxPiYyCi0JICAgZmF0YWw9eWVzCi0JICAgYnJlYWsgMgotCQk7OwotCWVzYWMKLQotCSMgTm93LCBkbyBkZWZhdWx0aW5nIGZvciBob3N0LgotCWNhc2UgJGhvc3RfYWxpYXMgaW4KLQlOT0hPU1QpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCSMgTmVpdGhlciAtLWhvc3Qgb3B0aW9uIG5vciB1bmRlZnMgd2VyZSBwcmVzZW50LgotCQkJIyBDYWxsIGNvbmZpZy5ndWVzcy4KLQkJCWd1ZXNzc3lzPWBlY2hvICR7cHJvZ25hbWV9IHwgc2VkICdzL2NvbmZpZ3VyZSQvY29uZmlnLmd1ZXNzLydgCi0JCQlpZiBob3N0X2FsaWFzPWAke2NvbmZpZ19zaGVsbH0gJHtndWVzc3N5c31gCi0JCQl0aGVuCi0JCQkJIyBJZiB0aGUgc3RyaW5nIHdlIGFyZSBnb2luZyB0byB1c2UgZm9yCi0JCQkJIyB0aGUgdGFyZ2V0IGlzIGEgcHJlZml4IG9mIHRoZSBzdHJpbmcKLQkJCQkjIHdlIGp1c3QgZ3Vlc3NlZCBmb3IgdGhlIGhvc3QsIHRoZW4KLQkJCQkjIGFzc3VtZSB3ZSBhcmUgcnVubmluZyBuYXRpdmUsIGFuZCBmb3JjZQotCQkJCSMgdGhlIHNhbWUgc3RyaW5nIGZvciBib3RoIHRhcmdldCBhbmQgaG9zdC4KLQkJCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJCQlOT1RBUkdFVCkgOzsKLQkJCQkqKQotCQkJCQlpZiBleHByICRob3N0X2FsaWFzIDogJHRhcmdldF9hbGlhcyA+L2Rldi9udWxsCi0JCQkJCXRoZW4KLQkJCQkJCWhvc3RfYWxpYXM9JHRhcmdldF9hbGlhcwotCQkJCQlmaQotCQkJCQk7OwotCQkJCWVzYWMKLQkJCQllY2hvICJDb25maWd1cmluZyBmb3IgYSAke2hvc3RfYWxpYXN9IGhvc3QuIiAxPiYyCi0JCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCWVsc2UKLQkJCQllY2hvICdDb25maWcuZ3Vlc3MgZmFpbGVkIHRvIGRldGVybWluZSB0aGUgaG9zdCB0eXBlLiAgWW91IG5lZWQgdG8gc3BlY2lmeSBvbmUuJyAxPiYyCi0JCQkJZmF0YWw9eWVzCi0JCQlmaQotCQkJOzsKLQkJKikKLQkJCWhvc3RfYWxpYXM9JHVuZGVmcwotCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCXVuZGVmcz1OT1VOREVGUwotCQkJOzsKLQkJZXNhYwotCWVzYWMKLQotCSMgRG8gZGVmYXVsdGluZyBmb3IgdGFyZ2V0LiAgSWYgLS10YXJnZXQgb3B0aW9uIGlzbid0IHByZXNlbnQsIGRlZmF1bHQKLQkjIHRvIHVuZGVmcy4gIElmIHVuZGVmcyBpc24ndCBwcmVzZW50LCBkZWZhdWx0IHRvIGhvc3QuCi0JY2FzZSAkdGFyZ2V0X2FsaWFzIGluCi0JTk9UQVJHRVQpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCXRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcwotCQkJOzsKLQkJKikKLQkJCXRhcmdldF9hbGlhcz0kdW5kZWZzCi0JCQlhcmd1bWVudHM9Ii0tdGFyZ2V0PSR0YXJnZXRfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCTs7Ci0JCWVzYWMKLQllc2FjCi0JOzsKLSopIDs7Ci1lc2FjCi0KLWlmIFsgLW4gIiR7ZmF0YWx9IiAtbyAiJHtob3N0X2FsaWFzfSIgPSAiaGVscCIgXSA7IHRoZW4KLQlleGVjIDE+JjIKLQllY2hvIFVzYWdlOiBjb25maWd1cmUgW09QVElPTlNdIFtIT1NUXQotCWVjaG8KLQllY2hvIE9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0c10KLQllY2hvICcgLS1wcmVmaXg9TVlESVIJCSBpbnN0YWxsIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWV4ZWMtcHJlZml4PU1ZRElSCSBpbnN0YWxsIGhvc3QtZGVwZW5kZW50IGZpbGVzIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWhlbHAJCQkgcHJpbnQgdGhpcyBtZXNzYWdlIFtub3JtYWwgY29uZmlnXScKLQllY2hvICcgLS1idWlsZD1CVUlMRAkJIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdJwotCWVjaG8gJyAtLWhvc3Q9SE9TVAkJIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZGV0ZXJtaW5lZCB2aWEgY29uZmlnLmd1ZXNzXScKLQllY2hvICcgLS1ub3JlY3Vyc2lvbgkJIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXScKLQllY2hvICcgLS1wcm9ncmFtLXByZWZpeD1GT08JIHByZXBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS1zdWZmaXg9Rk9PCSBhcHBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QIHRyYW5zZm9ybSBpbnN0YWxsZWQgbmFtZXMgYnkgc2VkIHBhdHRlcm4gUCBbIiJdJwotCWVjaG8gJyAtLXNpdGU9U0lURQkJIGNvbmZpZ3VyZSB3aXRoIHNpdGUtc3BlY2lmaWMgbWFrZWZpbGUgZm9yIFNJVEUnCi0JZWNobyAnIC0tc3JjZGlyPURJUgkJIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFsuIG9yIC4uXScKLQllY2hvICcgLS10YXJnZXQ9VEFSR0VUCSBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdJwotCWVjaG8gJyAtLXRtcGRpcj1UTVBESVIJIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMgaW4gVE1QRElSIFsvdG1wXScKLQllY2hvICcgLS1uZnAJCQkgY29uZmlndXJlIGZvciBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBbaGFyZCBmbG9hdF0nCi0JZWNobyAnIC0td2l0aC1GT08sIC0td2l0aC1GT089QkFSIHBhY2thZ2UgRk9PIGlzIGF2YWlsYWJsZSAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0td2l0aG91dC1GT08JCSBwYWNrYWdlIEZPTyBpcyBOT1QgYXZhaWxhYmxlJwotCWVjaG8gJyAtLWVuYWJsZS1GT08sIC0tZW5hYmxlLUZPTz1CQVIgaW5jbHVkZSBmZWF0dXJlIEZPTyAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0tZGlzYWJsZS1GT08JCSBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTycKLQllY2hvCi0JZWNobyAnV2hlcmUgSE9TVCBhbmQgVEFSR0VUIGFyZSBzb21ldGhpbmcgbGlrZSAic3BhcmMtc3Vub3MiLCAibWlwcy1zZ2ktaXJpeDUiLCBldGMuJwotCWVjaG8KLQlpZiBbIC1yIGNvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLQkJY2F0IGNvbmZpZy5zdGF0dXMKLQlmaQotCi0JZXhpdCAxCi1maQotCi1jb25maWdzdWI9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9jb25maWcuc3ViLydgCi1tb3ZlaWZjaGFuZ2U9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9tb3ZlLWlmLWNoYW5nZS8nYAotdG9wc3JjZGlyPWBjZCBcYGRpcm5hbWUgJHtwcm9nbmFtZX1cYDsgcHdkYAotCi0KLSMgdGhpcyBpcyBhIGhhY2suICBzdW40IG11c3QgYWx3YXlzIGJlIGEgdmFsaWQgaG9zdCBhbGlhcyBvciB0aGlzIHdpbGwgZmFpbC4KLWlmICR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gc3VuNCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0gICAgICAgIHRydWUKLWVsc2UKLSAgICAgICAgZWNobyAnKioqJyBjYW5ub3QgZmluZCBjb25maWcuc3ViLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLXRvdWNoIGNvbmZpZy5qdW5rCi1pZiAke2NvbmZpZ19zaGVsbH0gJHttb3ZlaWZjaGFuZ2V9IGNvbmZpZy5qdW5rIGNvbmZpZy50cmFzaCA7IHRoZW4KLSAgICAgICAgdHJ1ZQotZWxzZQotICAgICAgICBlY2hvICcqKionIGNhbm5vdCBmaW5kIG1vdmUtaWYtY2hhbmdlLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi1ybSAtZiBjb25maWcuanVuayBjb25maWcudHJhc2gKLQotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIiIpCi0gICAgICAgIGlmIFsgLXIgY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjZGlyPS4KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIFsgLXIgJHtwcm9nbmFtZX0uaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcj1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAnczovY29uZmlndXJlJDo6J2AKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJDYW4ndCBmaW5kIGNvbmZpZ3VyZS5pbi4gIFRyeSB1c2luZyAtLXNyY2Rpcj1zb21lX2RpciIgIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0qKQotCSMgU2V0IHNyY2RpciB0byAiLiIgaWYgdGhhdCdzIHdoYXQgaXQgaXMuCi0JIyBUaGlzIGlzIGltcG9ydGFudCBmb3IgbXVsdGlsaWIgc3VwcG9ydC4KLQlpZiBbICEgLWQgJHtzcmNkaXJ9IF0gOyB0aGVuCi0JCWVjaG8gIkludmFsaWQgc291cmNlIGRpcmVjdG9yeSAke3NyY2Rpcn0iID4mMgotCQlleGl0IDEKLQlmaQotCXB3ZD1gcHdkYAotCXNyY3B3ZD1gY2QgJHtzcmNkaXJ9IDsgcHdkYAotCWlmIFsgIiR7cHdkfSIgPSAiJHtzcmNwd2R9IiBdIDsgdGhlbgotCQlzcmNkaXI9LgotCWZpCi1lc2FjCi0KLSMjIyB3YXJuIGFib3V0IHNvbWUgY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbnMuCi0KLWNhc2UgIiR7c3JjZGlyfSIgaW4KLSIuIikgOzsKLSopCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9L2NvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBlY2hvICcqKionIENhbm5vdCBjb25maWd1cmUgaGVyZSBpbiBcIiR7UFdEPWBwd2RgfVwiIHdoZW4gXCIke3NyY2Rpcn1cIiBpcyBjdXJyZW50bHkgY29uZmlndXJlZC4gMT4mMgotICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotZXNhYwotCi0KLSMgZGVmYXVsdCBleGVjX3ByZWZpeAotY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0iIikgZXhlY19wcmVmaXg9IlwkKHByZWZpeCkiIDs7Ci0qKSA7OwotZXNhYwotCi0jIERlZmluZSB0aGUgdHJpZ2dlciBmaWxlIHRvIG1ha2Ugc3VyZSBjb25maWd1cmUgd2lsbCByZS1ydW4gd2hlbmV2ZXIKLSMgdGhlIGdjYyB2ZXJzaW9uIG51bWJlciBjaGFuZ2VzLgotaWYgWyAiJHt3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIrc2V0fSIgPSBzZXQgXTsgdGhlbgotICAgIGdjY192ZXJzaW9uX3RyaWdnZXI9IiR3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIiCi0gICAgZ2NjX3ZlcnNpb249YHNlZCAtZSAncy8uKlwiXChbXiBcIl0qXClbIFwiXS4qL1wxLycgPCAke3dpdGhfZ2NjX3ZlcnNpb25fdHJpZ2dlcn1gCi1lbHNlCi0gICAgIyBJZiBnY2MncyBzb3VyY2VzIGFyZSBhdmFpbGFibGUsIGRlZmluZSB0aGUgdHJpZ2dlciBmaWxlLgotICAgIGlmIFsgLWYgJHt0b3BzcmNkaXJ9L2djYy92ZXJzaW9uLmMgXSA7IHRoZW4KLQlnY2NfdmVyc2lvbl90cmlnZ2VyPSR7dG9wc3JjZGlyfS9nY2MvdmVyc2lvbi5jCi0JZ2NjX3ZlcnNpb249YHNlZCAtZSAncy8uKlwiXChbXiBcIl0qXClbIFwiXS4qL1wxLycgPCAke2djY192ZXJzaW9uX3RyaWdnZXJ9YAotCWNhc2UgIiRhcmd1bWVudHMiIGluCi0JICAqLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIqICkKLQkgICAgOzsKLQkgICogKQotCSAgICAjIE1ha2Ugc3VyZSBjb25maWd1cmUuaW4ga25vd3MgYWJvdXQgdGhpcy4KLQkgICAgYXJndW1lbnRzPSItLXdpdGgtZ2NjLXZlcnNpb24tdHJpZ2dlcj0kZ2NjX3ZlcnNpb25fdHJpZ2dlciAkYXJndW1lbnRzIgotCSAgICA7OwotCWVzYWMKLQl3aXRob3B0aW9ucz0iLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIgJHdpdGhvcHRpb25zIgotICAgIGZpCi1maQotCi0jIyMgYnJlYWsgdXAgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbi4KLWNhc2UgImBncmVwICdeIyBwZXJcLWhvc3Q6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluYCIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaGFzIG5vIFwicGVyLWhvc3Q6XCIgbGluZS4gMT4mMgotCSMgQ2hlY2sgZm9yIGEgZGlyZWN0b3J5IHRoYXQncyBiZWVuIGNvbnZlcnRlZCB0byB1c2UgYXV0b2NvbmYgc2luY2UKLQkjIGl0IHdhcyBsYXN0IGNvbmZpZ3VyZWQuCi0JaWYgZ3JlcCBBQ19PVVRQVVQgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+L2Rldi9udWxsIDsgdGhlbgotCSAgZWNobyAnKioqJyBIbW0sIGxvb2tzIGxpa2UgdGhpcyBkaXJlY3RvcnkgaGFzIGJlZW4gYXV0b2NvbmZpc2NhdGVkLiAxPiYyCi0JICBpZiBbIC1yICR7c3JjZGlyfS9jb25maWd1cmUgXSA7IHRoZW4KLQkgICAgZWNobyAnKioqJyBSdW5uaW5nIHRoZSBsb2NhbCBjb25maWd1cmUgc2NyaXB0LiAxPiYyCi0JICAgIGNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCi0JICAgICIiKSBjYWNoZV9maWxlX29wdGlvbj0gOzsKLQkgICAgKikgIGNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIgOzsKLQkgICAgZXNhYwotCSAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7c3JjZGlyfSIKLQkgICAgY2FzZSAiJHtidWlsZF9hbGlhc30iIGluCi0JICAgICIiKSBidWlsZG9wdD0gOzsKLQkgICAgKikgIGJ1aWxkb3B0PSItLWJ1aWxkPSR7YnVpbGRfYWxpYXN9IiA7OwotCSAgICBlc2FjCi0JICAgIGV2YWwgZXhlYyAke2NvbmZpZ19zaGVsbH0gJHtzcmNkaXJ9L2NvbmZpZ3VyZSAke3ZlcmJvc2V9IFwKLQkJJHtidWlsZG9wdH0gLS1ob3N0PSR7aG9zdF9hbGlhc30gLS10YXJnZXQ9JHt0YXJnZXRfYWxpYXN9IFwKLQkJJHtwcmVmaXhvcHRpb259ICR7dG1wZGlyb3B0aW9ufSAke2V4ZWNfcHJlZml4b3B0aW9ufSBcCi0JCSR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9IFwKLQkJJHtwcm9ncmFtX3ByZWZpeG9wdGlvbn0gJHtwcm9ncmFtX3N1ZmZpeG9wdGlvbn0gXAotCQkke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259ICR7c2l0ZV9vcHRpb259IFwKLQkJJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gXAotCQkke2VuYWJsZW9wdGlvbnN9ICR7ZGlzYWJsZW9wdGlvbnN9ICR7ZmxvYXRpbmdfcG9pbnRvcHRpb259IFwKLQkJJHtjYWNoZV9maWxlX29wdGlvbn0gJHtyZW1vdmluZ30gJHtvdGhlcl9vcHRpb25zfSAke3JlZGlyZWN0fQotCSAgZWxzZQotCSAgICBlY2hvICcqKionIFRoZXJlIGlzIG5vIGNvbmZpZ3VyZSBzY3JpcHQgcHJlc2VudCB0aG91Z2guIDE+JjIKLQkgIGZpCi0JZmkKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1jYXNlICJgZ3JlcCAnXiMgcGVyXC10YXJnZXQ6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluYCIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaGFzIG5vIFwicGVyLXRhcmdldDpcIiBsaW5lLiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotY2FzZSAiJHtUTVBESVJ9IiBpbgotIiIpIFRNUERJUj0vdG1wIDsgZXhwb3J0IFRNUERJUiA7OwotKikgOzsKLWVzYWMKLQotIyBrZWVwIHRoaXMgZmlsZW5hbWUgc2hvcnQgZm9yICYlKiUkKiMgMTQgY2hhciBmaWxlIG5hbWVzCi10bXBmaWxlPSR7VE1QRElSfS9jT05mJCQKLSMgTm90ZSB0aGF0IHVuZGVyIG1hbnkgdmVyc2lvbnMgb2Ygc2ggYSB0cmFwIGhhbmRsZXIgZm9yIDAgd2lsbCAqb3ZlcnJpZGUqIGFueQotIyBleGl0IHN0YXR1cyB5b3UgZXhwbGljaXRseSBzcGVjaWZ5ISAgQXQgdGhpcyBwb2ludCwgdGhlIG9ubHkgbm9uLWVycm9yIGV4aXQKLSMgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0OyB0aGVzZSBhY3Rpb25zIGFyZSBkdXBsaWNhdGVkIHRoZXJlLCBtaW51cwotIyB0aGUgImV4aXQgMSIuICBEb24ndCB1c2UgImV4aXQgMCIgYW55d2hlcmUgYWZ0ZXIgdGhpcyB3aXRob3V0IHJlc2V0dGluZyB0aGUKLSMgdHJhcCBoYW5kbGVyLCBvciB5b3UnbGwgbG9zZS4KLXRyYXAgInJtIC1mIE1ha2VmaWxlLnRlbSAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvczsgZXhpdCAxIiAwIDEgMiAxNQotCi0jIHNwbGl0ICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaW50byBjb21tb24sIHBlci1ob3N0LCBwZXItdGFyZ2V0LAotIyBhbmQgcG9zdC10YXJnZXQgcGFydHMuICBQb3N0LXRhcmdldCBpcyBvcHRpb25hbC4KLXNlZCAtZSAnL14jIHBlclwtaG9zdDovLCRkJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS5jb20KLXNlZCAtZSAnMSwvXiMgcGVyXC1ob3N0Oi9kJyAtZSAnL14jIHBlclwtdGFyZ2V0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LmhzdAotaWYgZ3JlcCAnXiMgcG9zdC10YXJnZXQ6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4vZGV2L251bGwgOyB0aGVuCi0gIHNlZCAtZSAnMSwvXiMgcGVyXC10YXJnZXQ6L2QnIC1lICcvXiMgcG9zdFwtdGFyZ2V0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnRndAotICBzZWQgLWUgJzEsL14jIHBvc3RcLXRhcmdldDovZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0ucG9zCi1lbHNlCi0gIHNlZCAtZSAnMSwvXiMgcGVyXC10YXJnZXQ6L2QnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnRndAotICBlY2hvID4ke3RtcGZpbGV9LnBvcwotZmkKLQotIyMjIGRvIGNvbW1vbiBwYXJ0IG9mIGNvbmZpZ3VyZS5pbgotCi0jIElmIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlciBkb2VzIG5vdCBleGlzdCwgYnV0IHRoZSAiZ2NjIiBkaXJlY3RvcnkgZG9lcywKLSMgd2Ugd2lsbCBza2lwIHRoaXMgZGlyZWN0b3J5OyBpbiB0aGlzIGNhc2UgdGhlIHN1Yi1kaXJlY3RvcnkncyBjb21tb24gcGFydAotIyBvZiBjb25maWd1cmUuaW4gd2lsbCBjcmVhdGUgYSBzbWFsbCBzaGVsbCBzY3JpcHQgInNraXAtdGhpcy1kaXIiIGNvbnRhaW5pbmcKLSMgY29tbWFuZHMgdG8gY29tcGxldGVseSBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5IG9yIGNyZWF0ZWQgZmlsZXMuCi0KLS4gJHt0bXBmaWxlfS5jb20KLQotaWYgdGVzdCAtZiBza2lwLXRoaXMtZGlyOyB0aGVuCi0JIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKLQkjIGFuZCByZXNldCB0aGUgdHJhcCBoYW5kbGVyLgotCXRyYXAgMAotCXJtIC1mIE1ha2VmaWxlKiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcwotCSMgRXhlY3V0ZSB0aGUgZmluYWwgY2xlYW4tdXAgYWN0aW9ucwotCSR7Y29uZmlnX3NoZWxsfSBza2lwLXRoaXMtZGlyCi0JIyBhbmQgc3RvcCBjb25maWd1cmluZyB0aGlzIGRpcmVjdG9yeS4KLQlleGl0IDAKLWZpCi0KLSMgc29tZSBzYW5pdHkgY2hlY2tzIG9uIGNvbmZpZ3VyZS5pbgotY2FzZSAiJHtzcmN0cmlnZ2VyfSIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionIHNyY3RyaWdnZXIgbm90IHNldCBpbiAke1BXRD1gcHdkYH0vY29uZmlndXJlLmluLiAgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWNhc2UgIiR7YnVpbGRfYWxpYXN9IiBpbgotIiIpCi0JaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7aG9zdF9hbGlhc31gIDsgdGhlbgotCSAgICBidWlsZF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0JICAgIGJ1aWxkX3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLQkgICAgYnVpbGRfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0JICAgIGJ1aWxkPSR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLQkgICAgYnVpbGRfYWxpYXM9JHtob3N0X2FsaWFzfQotCWZpCi0JOzsKLSopCi0JaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7YnVpbGRfYWxpYXN9YCA7IHRoZW4KLQkgICAgYnVpbGRvcHQ9Ii0tYnVpbGQ9JHtidWlsZF9hbGlhc30iCi0JICAgIGJ1aWxkX2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLQkgICAgYnVpbGRfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotCSAgICBidWlsZF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLQkgICAgYnVpbGQ9JHtidWlsZF9jcHV9LSR7YnVpbGRfdmVuZG9yfS0ke2J1aWxkX29zfQotCWVsc2UKLQkgICAgZWNobyAiVW5yZWNvZ25pemVkIGJ1aWxkIHN5c3RlbSBuYW1lICR7YnVpbGRfYWxpYXN9LiIgMT4mMgotCSAgICBleGl0IDEKLQlmaQotCTs7Ci1lc2FjCi0KLWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke2hvc3RfYWxpYXN9YCA7IHRoZW4KLSAgICB0cnVlCi1lbHNlCi0gICAgZWNobyAiVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIG5hbWUgJHtob3N0X2FsaWFzfS4iIDE+JjIKLSAgICBleGl0IDEKLWZpCi1ob3N0X2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWhvc3Q9JHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQotCi0uICR7dG1wZmlsZX0uaHN0Ci0KLWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke3RhcmdldF9hbGlhc31gIDsgdGhlbgotICAgIHRydWUKLWVsc2UKLSAgICBlY2hvICJVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSBuYW1lICR7dGFyZ2V0X2FsaWFzfS4iIDE+JjIKLSAgICBleGl0IDEKLWZpCi10YXJnZXRfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLXRhcmdldD0ke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0tJHt0YXJnZXRfb3N9Ci0KLS4gJHt0bXBmaWxlfS50Z3QKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIiIpCi0gICAgICAgIHNyY2RpcmRlZmF1bHRlZD0xCi0gICAgICAgIHNyY2Rpcj0uCi0gICAgICAgIGlmIFsgISAtciAke3NyY3RyaWdnZXJ9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjZGlyPS4uCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1pZiBbICEgLXIgJHtzcmNkaXJ9LyR7c3JjdHJpZ2dlcn0gXSA7IHRoZW4KLSAgICAgICAgY2FzZSAiJHtzcmNkaXJkZWZhdWx0ZWR9IiBpbgotICAgICAgICAiIikgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IENhbid0IGZpbmQgJHtzcmNuYW1lfSBzb3VyY2VzIGluICR7UFdEPWBwd2RgfS8ke3NyY2Rpcn0iIDE+JjIgOzsKLSAgICAgICAgKikgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBDYW4ndCBmaW5kICR7c3JjbmFtZX0gc291cmNlcyBpbiAke1BXRD1gcHdkYH0vLiBvciAke1BXRD1gcHdkYH0vLi4iIDE+JjIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGVjaG8gJyoqKicgXChBdCBsZWFzdCAke3NyY3RyaWdnZXJ9IGlzIG1pc3NpbmcuXCkgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLSMgU29tZSBzeXN0ZW1zIChlLmcuLCBvbmUgb2YgdGhlIGkzODYtYWl4IHN5c3RlbXMgdGhlIGdhcyB0ZXN0ZXJzIGFyZQotIyB1c2luZykgZG9uJ3QgaGFuZGxlICJcJCIgY29ycmVjdGx5LCBzbyBkb24ndCB1c2UgaXQgaGVyZS4KLXRvb2xkaXI9JyQoZXhlY19wcmVmaXgpJy8ke3RhcmdldF9hbGlhc30KLQotaWYgWyAiJHtob3N0X2FsaWFzfSIgIT0gIiR7dGFyZ2V0X2FsaWFzfSIgXSA7IHRoZW4KLSAgICBpZiBbICIke3Byb2dyYW1fcHJlZml4b3B0aW9ufSIgPSAiIiBdIDsgdGhlbgotICAgICAgICBpZiBbICIke3Byb2dyYW1fc3VmZml4b3B0aW9ufSIgPSAiIiBdIDsgdGhlbiAKLSAgICAgICAgICAgIGlmIFsgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0iID0gIiIgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tIDsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLWZpCi0KLSMgTWVyZ2UgcHJvZ3JhbV9wcmVmaXggYW5kIHByb2dyYW1fc3VmZml4IG9udG8gcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KLSMgKHByb2dyYW1fc3VmZml4IHVzZWQgdG8gdXNlICQsIGJ1dCBpdCdzIGhhcmQgdG8gcHJlc2VydmUgJCB0aHJvdWdoIGJvdGgKLSMgbWFrZSBhbmQgc2guKQotaWYgWyAiJHtwcm9ncmFtX3N1ZmZpeH0iICE9ICIiIF0gOyB0aGVuCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iLWUgcyxcXFxcKC4qXFxcXCksXFxcXDEke3Byb2dyYW1fc3VmZml4fSwgJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSIKLWZpCi0KLWlmIFsgIiR7cHJvZ3JhbV9wcmVmaXh9IiAhPSAiIiBdIDsgdGhlbgotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ii1lIHMsXiwke3Byb2dyYW1fcHJlZml4fSwgJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSIKLWZpCi0KLSMgSWYgQ0MgYW5kIENYWCBhcmUgbm90IHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIGFuZCB0aGUgTWFrZWZpbGUKLSMgZXhpc3RzLCB0cnkgdG8gZXh0cmFjdCB0aGVtIGZyb20gaXQuICBUaGlzIGlzIHRvIGhhbmRsZSBydW5uaW5nCi0jIC4vY29uZmlnLnN0YXR1cyBieSBoYW5kLgotaWYgWyAteiAiJHtDQ30iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNDWyAJXSo9LyBzL0NDWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENDPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotaWYgWyAteiAiJHtDRkxBR1N9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DRkxBR1NbIAldKj0vIHMvQ0ZMQUdTWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENGTEFHUz1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLWlmIFsgLXogIiR7Q1hYfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ1hYWyAJXSo9LyBzL0NYWFsgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDWFg9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi1pZiBbIC16ICIke0NYWEZMQUdTfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ1hYRkxBR1NbIAldKj0vIHMvQ1hYRkxBR1NbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ1hYRkxBR1M9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi0jIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBZQUNDLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAotIyBsb2NhdGUgYmlzb24gb3IgYnlhY2MgaW4gb2JqZGlyLgotCi1mb3IgcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjIHlhY2MKLWRvCi0gIHNldCBkdW1teSAkcHJvZzsgdG1wPSQyCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvJHRtcDsgdGhlbgotICAgICAgREVGQVVMVF9ZQUNDPSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9ZQUNDIiAmJiBicmVhawotZG9uZQotCi0jIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBNNC4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgbWFrZWZpbGUgY2FuJ3QKLSMgbG9jYXRlIG00IGluIG9iamRpci4KLQotZm9yIHByb2cgaW4gZ200IGdudW00IG00Ci1kbwotICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgotICBJRlM9IiR7SUZTPSAgIH0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci8kdG1wOyB0aGVuCi0gICAgICBERUZBVUxUX000PSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9NNCIgJiYgYnJlYWsKLWRvbmUKLQotIyBHZW5lcmF0ZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgTEVYLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAotIyBsb2NhdGUgZmxleCBpbiBvYmpkaXIuCi0KLWZvciBwcm9nIGluIGZsZXggbGV4Ci1kbwotICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyLyR0bXA7IHRoZW4KLSAgICAgIERFRkFVTFRfTEVYPSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9MRVgiICYmIGJyZWFrCi1kb25lCi0KLWlmIFsgIiR7YnVpbGR9IiAhPSAiJHtob3N0fSIgXTsgdGhlbgotICAjIElmIHdlIGFyZSBkb2luZyBhIENhbmFkaWFuIENyb3NzLCBpbiB3aGljaCB0aGUgaG9zdCBhbmQgYnVpbGQgc3lzdGVtcwotICAjIGFyZSBub3QgdGhlIHNhbWUsIHdlIHNldCByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgdG9vbHMuCi0KLSAgdG9vbHM9IkFSIEFSX0ZPUl9UQVJHRVQgQVMgQVNfRk9SX1RBUkdFVCBCSVNPTiBDQ19GT1JfQlVJTEQiCi0gIHRvb2xzPSIke3Rvb2xzfSBDQ19GT1JfVEFSR0VUIENYWF9GT1JfVEFSR0VUIgotICB0b29scz0iJHt0b29sc30gRExMVE9PTCBETExUT09MX0ZPUl9UQVJHRVQgR0NDX0ZPUl9UQVJHRVQgSE9TVF9QUkVGSVgiCi0gIHRvb2xzPSIke3Rvb2xzfSBIT1NUX1BSRUZJWF8xIExEIExEX0ZPUl9UQVJHRVQgTEVYIE1BS0VJTkZPIE5NIgotICB0b29scz0iJHt0b29sc30gTk1fRk9SX1RBUkdFVCBSQU5MSUIgUkFOTElCX0ZPUl9UQVJHRVQiCi0gIHRvb2xzPSIke3Rvb2xzfSBXSU5EUkVTIFdJTkRSRVNfRk9SX1RBUkdFVCBZQUNDIgotCi0gIGZvciB2YXIgaW4gJHt0b29sc307IGRvCi0gICAgaWYgWyAteiAiYGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAiIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gICAgICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL14nIiR7dmFyfSInWyAJXSo9LyBzLyciJHt2YXJ9IidbIAldKj1bIAldKlwoLipcKS9cMS9wJyBcCi0JPCBNYWtlZmlsZSA+IE1ha2VmaWxlLnYKLSAgICAgIHQ9YHRhaWwgLTEgTWFrZWZpbGUudmAKLSAgICAgIGlmIFsgLW4gIiR7dH0iIF07IHRoZW4KLQlldmFsICIke3Zhcn09JyR7dH0nIgotICAgICAgZmkKLSAgICAgIHJtIC1mIE1ha2VmaWxlLnYKLSAgICBmaQotICBkb25lCi0KLSAgQVI9JHtBUi0ke2hvc3RfYWxpYXN9LWFyfQotICBBUl9GT1JfVEFSR0VUPSR7QVJfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYXJ9Ci0gIEFTPSR7QVMtJHtob3N0X2FsaWFzfS1hc30KLSAgQVNfRk9SX1RBUkdFVD0ke0FTX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWFzfQotICBCSVNPTj0ke0JJU09OLWJpc29ufQotICBDQz0ke0NDLSR7aG9zdF9hbGlhc30tZ2NjfQotICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9Ci0gIENYWD0ke0NYWC0ke2hvc3RfYWxpYXN9LWMrK30KLSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLSAgQ0NfRk9SX0JVSUxEPSR7Q0NfRk9SX0JVSUxELWdjY30KLSAgQ0NfRk9SX1RBUkdFVD0ke0NDX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWdjY30KLSAgQ1hYX0ZPUl9UQVJHRVQ9JHtDWFhfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYysrfQotICBETExUT09MPSR7RExMVE9PTC0ke2hvc3RfYWxpYXN9LWRsbHRvb2x9Ci0gIERMTFRPT0xfRk9SX1RBUkdFVD0ke0RMTFRPT0xfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tZGxsdG9vbH0KLSAgR0NDX0ZPUl9UQVJHRVQ9JHtHQ0NfRk9SX1RBUkdFVC0ke0NDX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWdjY319Ci0gIEhPU1RfUFJFRklYPSR7YnVpbGRfYWxpYXN9LQotICBIT1NUX1BSRUZJWF8xPSR7YnVpbGRfYWxpYXN9LQotICBMRD0ke0xELSR7aG9zdF9hbGlhc30tbGR9Ci0gIExEX0ZPUl9UQVJHRVQ9JHtMRF9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1sZH0KLSAgTUFLRUlORk89JHtNQUtFSU5GTy1tYWtlaW5mb30KLSAgTk09JHtOTS0ke2hvc3RfYWxpYXN9LW5tfQotICBOTV9GT1JfVEFSR0VUPSR7Tk1fRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tbm19Ci0gIFJBTkxJQj0ke1JBTkxJQi0ke2hvc3RfYWxpYXN9LXJhbmxpYn0KLSAgUkFOTElCX0ZPUl9UQVJHRVQ9JHtSQU5MSUJfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tcmFubGlifQotICBXSU5EUkVTPSR7V0lORFJFUy0ke2hvc3RfYWxpYXN9LXdpbmRyZXN9Ci0gIFdJTkRSRVNfRk9SX1RBUkdFVD0ke1dJTkRSRVNfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30td2luZHJlc30KLQotICBpZiBbIC16ICIke1lBQ0N9IiBdOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9iaXNvbjsgdGhlbgotCVlBQ0M9ImJpc29uIC15IgotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL2J5YWNjOyB0aGVuCi0JWUFDQz1ieWFjYwotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL3lhY2M7IHRoZW4KLQlZQUNDPXlhY2MKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgaWYgWyAteiAiJHtZQUNDfSIgXTsgdGhlbgotICAgICAgWUFDQz0iYmlzb24gLXkiCi0gICAgZmkKLSAgZmkKLQotICBpZiBbIC16ICIke0xFWH0iIF07IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2ZsZXg7IHRoZW4KLQlMRVg9ZmxleAotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL2xleDsgdGhlbgotCUxFWD1sZXgKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgTEVYPSR7TEVYLWZsZXh9Ci0gIGZpCi0KLSAgIyBFeHBvcnQgdmFyaWFibGVzIHdoaWNoIGF1dG9jb25mIG1pZ2h0IHRyeSB0byBzZXQuCi0gIGV4cG9ydCBBUwotICBleHBvcnQgQVIKLSAgZXhwb3J0IENDX0ZPUl9CVUlMRAotICBleHBvcnQgRExMVE9PTAotICBleHBvcnQgTEQKLSAgZXhwb3J0IE5NCi0gIGV4cG9ydCBSQU5MSUIKLSAgZXhwb3J0IFdJTkRSRVMKLWVsc2UKLSAgIyBJZiBDQyBpcyBzdGlsbCBub3Qgc2V0LCB0cnkgdG8gZ2V0IGdjYy4KLSAgaWYgWyAteiAiJHtDQ30iIF07IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgotCUNDPSJnY2MiCi0JZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi0JaWYgdGVzdCAteiAiYCR7Q0N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotCWVsc2UKLQkgIENGTEFHUz0ke0NGTEFHUy0iLU8yIn0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1PMiJ9Ci0JZmkKLQlybSAtZiBjb25mdGVzdCoKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgQ0M9JHtDQy1jY30KLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiR7Q0ZMQUdTfSI7IHRoZW4KLSAgICAgICMgSGVyZSBDQyBpcyBzZXQgYnV0IENGTEFHUyBpcyBub3QuICBVc2UgYSBxdWljayBoYWNrIHRvIHVzZSAtTzIgaWYgQ0MKLSAgICAgICMgaXMgc2V0IHRvIGEgdmVyc2lvbiBvZiBnY2MuCi0gICAgICBjYXNlICIke0NDfSIgaW4KLSAgICAgICpnY2MpCi0JZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi0JaWYgdGVzdCAteiAiYCR7Q0N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotCWVsc2UKLQkgIENGTEFHUz0ke0NGTEFHUy0iLU8yIn0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1PMiJ9Ci0JZmkKLQlybSAtZiBjb25mdGVzdCoKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi0gIGZpCi0KLSAgQ1hYPSR7Q1hYLSJjKysifQotICBDRkxBR1M9JHtDRkxBR1MtIi1nIn0KLSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLWZpCi0KLWV4cG9ydCBDQwotZXhwb3J0IENYWAotZXhwb3J0IENGTEFHUwotZXhwb3J0IENYWEZMQUdTCi0KLQotZm9yIHN1YmRpciBpbiAuICR7c3ViZGlyc30gOyBkbwotCi0gICAgIyAke3N1YmRpcn0gaXMgcmVsYXRpdmUgcGF0aCBmcm9tIC4gdG8gdGhlIGRpcmVjdG9yeSB3ZSdyZSBjdXJyZW50bHkKLSAgICAjIGNvbmZpZ3VyaW5nLgotICAgICMgJHtpbnZzdWJkaXJ9IGlzIGludmVyc2Ugb2YgJHtzdWJkaXIpLCAqd2l0aCogdHJhaWxpbmcgLywgaWYgbmVlZGVkLgotICAgIGludnN1YmRpcj1gZWNobyAke3N1YmRpcn0vIHwgc2VkIC1lICdzfFwuL3x8ZycgLWUgJ3N8W14vXSovfC4uL3xnJ2AKLQotICAgICMjIyBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBzcmNkaXIKLSAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICIuIikgICMgbm8gLXNyY2RpciBvcHRpb24uICBXZSdyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICAgICAgICAgICAgICBtYWtlc3JjZGlyPS4gOzsKLSAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICAgICAgICAgIG1ha2VzcmNkaXI9YGVjaG8gJHtzcmNkaXJ9LyR7c3ViZGlyfSB8IHNlZCAtZSAnc3wvXC4kfHwnYAotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgY2FzZSAiJHtzdWJkaXJ9IiBpbgotICAgICAgICAgICAgICAgIC4pIG1ha2VzcmNkaXI9JHtzcmNkaXJ9IDs7Ci0gICAgICAgICAgICAgICAgKikgbWFrZXNyY2Rpcj0ke2ludnN1YmRpcn0ke3NyY2Rpcn0vJHtzdWJkaXJ9IDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgWyAiJHtzdWJkaXJ9LyIgIT0gIi4vIiBdIDsgdGhlbgotICAgICAgICBNYWtlZmlsZT0ke3N1YmRpcn0vTWFrZWZpbGUKLSAgICBmaQotCi0gICAgaWYgWyAhIC1kICR7c3ViZGlyfSBdIDsgdGhlbgotICAgICAgICBpZiBta2RpciAke3N1YmRpcn0gOyB0aGVuCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke3N1YmRpcn0iIDE+JjIKLSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLSAgICBmaQotCi0gICAgY2FzZSAiJHtyZW1vdmluZ30iIGluCi0gICAgIiIpCi0gICAgICAgIGNhc2UgIiR7c3ViZGlyfSIgaW4KLSAgICAgICAgLikgOzsKLSAgICAgICAgKikgZXZhbCBlY2hvIEJ1aWxkaW5nIGluICR7c3ViZGlyfSAke3JlZGlyZWN0fSA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgIyBGSVhNRSBTaG91bGQgdGhpcyBiZSBkb25lIHJlY3Vyc2l2ZWx5ID8/PyAoVXNlZnVsIGZvciBlLmcuIGdkYnRlc3QpCi0gICAgICAgICMgU2V0IHVwIHRoZSBsaXN0IG9mIGxpbmtzIHRvIGJlIG1hZGUuCi0gICAgICAgICMgJHtsaW5rc30gaXMgdGhlIGxpc3Qgb2YgbGluayBuYW1lcywgYW5kICR7ZmlsZXN9IGlzIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpbmsgdG8uCi0KLSAgICAgICAgIyBNYWtlIHRoZSBsaW5rcy4KLSAgICAgICAgY29uZmlnbGlua3M9IiR7bGlua3N9IgotICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuc3RhdHVzIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgbXYgLWYgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrCi0gICAgICAgIGZpCi0gICAgICAgIHdoaWxlIFsgLW4gIiR7ZmlsZXN9IiBdIDsgZG8KLSAgICAgICAgICAgICAgICAjIHNldCBmaWxlIHRvIGNhciBvZiBmaWxlcywgZmlsZXMgdG8gY2RyIG9mIGZpbGVzCi0gICAgICAgICAgICAgICAgc2V0ICR7ZmlsZXN9OyBmaWxlPSQxOyBzaGlmdDsgZmlsZXM9JCoKLSAgICAgICAgICAgICAgICBzZXQgJHtsaW5rc307IGxpbms9JDE7IHNoaWZ0OyBsaW5rcz0kKgotCi0gICAgICAgICAgICAgICAgaWYgWyAhIC1yICR7c3JjZGlyfS8ke2ZpbGV9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtmaWxlfSBdIDsgdGhlbgotCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY2Fubm90IGNyZWF0ZSBhIGxpbmsgXCIke2xpbmt9XCIsIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJzaW5jZSB0aGUgZmlsZSBcIiR7c3JjZGlyfS8ke2ZpbGV9XCIgZG9lcyBub3QgZXhpc3QuIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLQkJICBlbHNlCi0JCQlzcmNmaWxlPSR7ZmlsZX0KLQkJICBmaQotCQllbHNlCi0JCQlzcmNmaWxlPSR7c3JjZGlyfS8ke2ZpbGV9Ci0gICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgICR7cmVtb3ZlfSAtZiAke2xpbmt9Ci0JCSMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsKLQkJaWYgJHtzeW1ib2xpY19saW5rfSAke3NyY2ZpbGV9ICR7bGlua30gPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCQkJdHJ1ZQotCQllbHNlCi0JCQkjIFdlIG5lZWQgdG8gcmUtcmVtb3ZlIHRoZSBmaWxlIGJlY2F1c2UgTHlueCBsZWF2ZXMgYSAKLQkJCSMgdmVyeSBzdHJhbmdlIGRpcmVjdG9yeSB0aGVyZSB3aGVuIGl0IGZhaWxzIGFuIE5GUyBzeW1saW5rLgotCQkJJHtyZW1vdmV9IC1yIC1mICR7bGlua30KLQkJCSR7aGFyZF9saW5rfSAke3NyY2ZpbGV9ICR7bGlua30KLQkJZmkKLSAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtsaW5rfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IHVuYWJsZSB0byBsaW5rIFwiJHtsaW5rfVwiIHRvIFwiJHtzcmNmaWxlfVwiLiIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgIGVjaG8gIkxpbmtlZCBcIiR7bGlua31cIiB0byBcIiR7c3JjZmlsZX1cIi4iCi0gICAgICAgIGRvbmUKLQotICAgICAgICAjIENyZWF0ZSBhIC5nZGJpbml0IGZpbGUgd2hpY2ggcnVucyB0aGUgb25lIGluIHNyY2RpcgotICAgICAgICAjIGFuZCB0ZWxscyBHREIgdG8gbG9vayB0aGVyZSBmb3Igc291cmNlIGZpbGVzLgotCi0gICAgICAgIGlmIFsgLXIgJHtzcmNkaXJ9LyR7c3ViZGlyfS8uZ2RiaW5pdCBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGNhc2UgJHtzcmNkaXJ9IGluCi0gICAgICAgICAgICAgICAgLikgOzsKLSAgICAgICAgICAgICAgICAqKSBjYXQgPiAke3N1YmRpcn0vLmdkYmluaXQgPDxFT0YKLSMgJHtOT19FRElUfQotZGlyICR7bWFrZXNyY2Rpcn0KLWRpciAuCi1zb3VyY2UgJHttYWtlc3JjZGlyfS8uZ2RiaW5pdAotRU9GCi0gICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgZmkKLQotICAgICAgICAjIEluc3RhbGwgYSBtYWtlZmlsZSwgYW5kIG1ha2UgaXQgc2V0IFZQQVRICi0gICAgICAgICMgaWYgbmVjZXNzYXJ5IHNvIHRoYXQgdGhlIHNvdXJjZXMgYXJlIGZvdW5kLgotICAgICAgICAjIEFsc28gY2hhbmdlIGl0cyB2YWx1ZSBvZiBzcmNkaXIuCi0gICAgICAgICMgTk9URTogTWFrZWZpbGUgZ2VuZXJhdGlvbiBjb25zdGl0dXRlcyB0aGUgbWFqb3JpdHkgb2YgdGhlIHRpbWUgaW4gY29uZmlndXJlLiAgSGVuY2UsIHRoaXMgc2VjdGlvbiBoYXMKLSAgICAgICAgIyBiZWVuIHNvbWV3aGF0IG9wdGltaXplZCBhbmQgaXMgcGVyaGFwcyBhIGJpdCB0d2lzdHkuCi0KLSAgICAgICAgIyBjb2RlIGlzIG9yZGVyIHNvIGFzIHRvIHRyeSB0byBzZWQgdGhlIHNtYWxsZXN0IGlucHV0IGZpbGVzIHdlIGtub3cuCi0gICAgICAgICMgc28gZG8gdGhlc2Ugc2VwYXJhdGVseSBiZWNhdXNlIEkgZG9uJ3QgdHJ1c3QgdGhlIG9yZGVyIG9mIHNlZCAtZSBleHByZXNzaW9ucy4KLQotICAgICAgICAjIHRoZSBmaXZlIG1ha2VmaWxlIGZyYWdtZW50cyBNVVNUIGVuZCB1cCBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlIGluIHRoaXMgb3JkZXI6IAotICAgICAgICAjIHBhY2thZ2UgbWFjcm9zLCB0YXJnZXQsIGhvc3QsIHNpdGUsIGFuZCBwYWNrYWdlIHJ1bGVzLgotCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSBdIDsgdGhlbgotCi0gICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIHRoZSBtYWtlZmlsZSBmb3IgdGhpcyBwYWNrYWdlIGZyb20gIk1ha2VmaWxlLmluIiAob3Igd2hhdGV2ZXIgaXQncyBjYWxsZWQpIGludG8gTWFrZWZpbGUudGVtLgotICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9LyR7TWFrZWZpbGV9LnRlbQotICAgICAgICAgICAgY2FzZSAiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ID4gJHtNYWtlZmlsZX0udGVtCi0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBFeHBlY3RlZCBwYWNrYWdlIG1ha2VmaWxlIHJ1bGVzIGZyYWdtZW50IFwiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9XCIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBpcyBtaXNzaW5nIGluICR7UFdEPWBwd2RgfS4gMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke01ha2VmaWxlfS50ZW0KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSBmb3IgdGhpcyBzaXRlLgotICAgICAgICAgICAgcm0gLWYgJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgY2FzZSAiJHtzaXRlfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9L2NvbmZpZy9tcy0ke3NpdGV9Ci0KLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7TWFrZWZpbGV9Ci0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIGhvc3QuCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7aG9zdF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtob3N0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtob3N0X21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIGhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke3N1YmRpcikvTWFrZWZpbGUudGVtCi0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIHRhcmdldC4KLSAgICAgICAgICAgIHJtIC1mICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICBjYXNlICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3RhcmdldF9tYWtlZmlsZV9mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyBFbWl0IHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGlzIHBhY2thZ2UncyBtYWNyb3MuCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICBjYXNlICIke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIHBhY2thZ2UgbWFrZWZpbGUgZnJhZ21lbnQgXCIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgcmVhbCBjb3B5IG5vdyBpbiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0KLSAgICAgICAgICAgICMgcHJlcGVuZCB3YXJuaW5nIGFib3V0IGVkaXR0aW5nLCBhbmQgYSBidW5jaCBvZiB2YXJpYWJsZXMuCi0gICAgICAgICAgICBybSAtZiAke01ha2VmaWxlfQotICAgICAgICAgICAgY2F0ID4gJHtNYWtlZmlsZX0gPDxFT0YKLSMgJHtOT19FRElUfQotVlBBVEggPSAke21ha2VzcmNkaXJ9Ci1saW5rcyA9ICR7Y29uZmlnbGlua3N9Ci1ob3N0X2FsaWFzID0gJHtob3N0X2FsaWFzfQotaG9zdF9jcHUgPSAke2hvc3RfY3B1fQotaG9zdF92ZW5kb3IgPSAke2hvc3RfdmVuZG9yfQotaG9zdF9vcyA9ICR7aG9zdF9vc30KLWhvc3RfY2Fub25pY2FsID0gJHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQotdGFyZ2V0X2FsaWFzID0gJHt0YXJnZXRfYWxpYXN9Ci10YXJnZXRfY3B1ID0gJHt0YXJnZXRfY3B1fQotdGFyZ2V0X3ZlbmRvciA9ICR7dGFyZ2V0X3ZlbmRvcn0KLXRhcmdldF9vcyA9ICR7dGFyZ2V0X29zfQotdGFyZ2V0X2Nhbm9uaWNhbCA9ICR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfS0ke3RhcmdldF9vc30KLUVPRgotCSAgICBjYXNlICIke2J1aWxkfSIgaW4KLQkgICAgICAiIikgOzsKLQkgICAgICAqKSAgY2F0ID4+ICR7TWFrZWZpbGV9IDw8IEVPRgotYnVpbGRfYWxpYXMgPSAke2J1aWxkX2FsaWFzfQotYnVpbGRfY3B1ID0gJHtidWlsZF9jcHV9Ci1idWlsZF92ZW5kb3IgPSAke2J1aWxkX3ZlbmRvcn0KLWJ1aWxkX29zID0gJHtidWlsZF9vc30KLWJ1aWxkX2Nhbm9uaWNhbCA9ICR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLUVPRgotCSAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIDs7Ci0gICAgICAgICAgICAgIC8qKSBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgOzsKLSAgICAgICAgICAgICAgLyopIGVjaG8gdGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIHRhcmdldF9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSA7OwotICAgICAgICAgICAgICAvKikgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKSAgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBpZiBbICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iICE9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgZWNobyBzaXRlX21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke3NpdGVfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfQotICAgICAgICAgICAgZmkgCi0KLQkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBidWlsZCBzaGFyZWQgbGlicy4KLQkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfc2hhcmVkfSI7IHRoZW4KLQkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9IG5vID4+ICR7TWFrZWZpbGV9Ci0JICAgIGVsc2UKLQkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9ICR7ZW5hYmxlX3NoYXJlZH0gPj4gJHtNYWtlZmlsZX0KLQkgICAgZmkKLQkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBydW10aW1lIGxpYnJhcnkgc3R1ZmYgaW5zdGFsbGVkIGluIGxpYnN1YmRpci4KLQkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9IjsgdGhlbgotCSAgICAgICAgZWNobyBlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMgPSBubyA+PiAke01ha2VmaWxlfQotCSAgICBlbHNlCi0JICAgICAgICBlY2hvIGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyA9ICR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSA+PiAke01ha2VmaWxlfQotCSAgICBmaQotCi0JICAgICMgRW1pdCBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgZmlsZSBjb250YWluaW5nIGdjYydzCi0JICAgICMgdmVyc2lvbiBudW1iZXIuCi0JICAgIGVjaG8gZ2NjX3ZlcnNpb25fdHJpZ2dlciA9ICR7Z2NjX3ZlcnNpb25fdHJpZ2dlcn0gPj4gJHtNYWtlZmlsZX0KLQkgICAgIyBBbmQgZW1pdCBhIG1hY3JvIGRlZmluaW5nIGdjYydzIHZlcnNpb24gbnVtYmVyLgotCSAgICBlY2hvIGdjY192ZXJzaW9uID0gJHtnY2NfdmVyc2lvbn0gPj4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyByZXNldCBwcmVmaXgsIGV4ZWNfcHJlZml4LCBzcmNkaXIsIFNVQkRJUlMsIE5PTlNVQkRJUlMsCi0gICAgICAgICAgICAjIHJlbW92ZSBhbnkgZm9ybSBmZWVkcy4KLSAgICAgICAgICAgIGlmIFsgLXogIiR7c3ViZGlyc30iIF07IHRoZW4KLSAgICAgICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudG0yCi0gICAgICAgICAgICAgICAgc2VkIC1lICJzOl5TVUJESVJTWyAJXSo9LiokOlNVQkRJUlMgPSAke2NvbmZpZ2RpcnN9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpeTk9OU1VCRElSU1sgCV0qPS4qJDpOT05TVUJESVJTID0gJHtub2NvbmZpZ2RpcnN9OiIgXAotICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRtMgotICAgICAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudG0yICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLQkgICAgZmkKLQkgICAgc2VkICAgICAtZSAic3xecHJlZml4WyAJXSo9LiokfHByZWZpeCA9ICR7cHJlZml4fXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmV4ZWNfcHJlZml4WyAJXSo9LiokfGV4ZWNfcHJlZml4ID0gJHtleGVjX3ByZWZpeH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5iaW5kaXJbIAldKj0uKiR8YmluZGlyID0gJHtiaW5kaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec2JpbmRpclsgCV0qPS4qJHxzYmluZGlyID0gJHtzYmluZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmxpYmV4ZWNkaXJbIAldKj0uKiR8bGliZXhlY2RpciA9ICR7bGliZXhlY2Rpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5kYXRhZGlyWyAJXSo9LiokfGRhdGFkaXIgPSAke2RhdGFkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec3lzY29uZmRpclsgCV0qPS4qJHxzeXNjb25mZGlyID0gJHtzeXNjb25mZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnNoYXJlZHN0YXRlZGlyWyAJXSo9LiokfHNoYXJlZHN0YXRlZGlyID0gJHtzaGFyZWRzdGF0ZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5sb2NhbHN0YXRlZGlyWyAJXSo9LiokfGxvY2Fsc3RhdGVkaXIgPSAke2xvY2Fsc3RhdGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebGliZGlyWyAJXSo9LiokfGxpYmRpciA9ICR7bGliZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmluY2x1ZGVkaXJbIAldKj0uKiR8aW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5vbGRpbmNsdWRlZGlyWyAJXSo9LiokfG9sZGluY2x1ZGVkaXIgPSAke29sZGluY2x1ZGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeaW5mb2RpclsgCV0qPS4qJHxpbmZvZGlyID0gJHtpbmZvZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8Xm1hbmRpclsgCV0qPS4qJHxtYW5kaXIgPSAke21hbmRpcn18IiBcCi0JCSAgICAtZSAiL15DQ1sgCV0qPS97Ci0JCQk6bG9vcDEKLQkJCS9cXFxcJC8gTgotCQkJcy9cXFxcXFxuLy9nCi0JCQl0IGxvb3AxCi0JCQlzJV5DQ1sgCV0qPS4qJCVDQyA9ICR7Q0N9JQotCQkJfSIgXAotCQkgICAgLWUgIi9eQ1hYWyAJXSo9L3sKLQkJCTpsb29wMgotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDIKLQkJCXMlXkNYWFsgCV0qPS4qJCVDWFggPSAke0NYWH0lCi0JCQl9IiBcCi0JCSAgICAtZSAiL15DRkxBR1NbIAldKj0vewotCQkJOmxvb3AzCi0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wMwotCQkJcyVeQ0ZMQUdTWyAJXSo9LiokJUNGTEFHUyA9ICR7Q0ZMQUdTfSUKLQkJCX0iIFwKLQkJICAgIC1lICIvXkNYWEZMQUdTWyAJXSo9L3sKLQkJCTpsb29wNAotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDQKLQkJCXMlXkNYWEZMQUdTWyAJXSo9LiokJUNYWEZMQUdTID0gJHtDWFhGTEFHU30lCi0JCQl9IiBcCi0JCSAgICAtZSAic3xeU0hFTExbCSBdKj0uKiR8U0hFTEwgPSAke2NvbmZpZ19zaGVsbH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zcmNkaXJbIAldKj0uKiR8c3JjZGlyID0gJHttYWtlc3JjZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInMvDC8vIiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5wcm9ncmFtX3ByZWZpeFsgCV0qPS4qJDpwcm9ncmFtX3ByZWZpeCA9ICR7cHJvZ3JhbV9wcmVmaXh9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpecHJvZ3JhbV9zdWZmaXhbIAldKj0uKiQ6cHJvZ3JhbV9zdWZmaXggPSAke3Byb2dyYW1fc3VmZml4fToiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInM6XnByb2dyYW1fdHJhbnNmb3JtX25hbWVbIAldKj0uKiQ6cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX06IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF50b29sZGlyWyAJXSo9LiokfHRvb2xkaXIgPSAke3Rvb2xkaXJ9fCIgXAotCQkgICAgLWUgInM6XkRFRkFVTFRfWUFDQ1sJIF0qPS4qJDpERUZBVUxUX1lBQ0MgPSAke0RFRkFVTFRfWUFDQ306IiBcCi0JCSAgICAtZSAiczpeREVGQVVMVF9MRVhbCSBdKj0uKiQ6REVGQVVMVF9MRVggPSAke0RFRkFVTFRfTEVYfToiIFwKLQkJICAgIC1lICJzOl5ERUZBVUxUX000WyAgXSo9LiokOkRFRkFVTFRfTTQgPSAke0RFRkFVTFRfTTR9OiIgXAotICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4+ICR7TWFrZWZpbGV9Ci0gIAotCi0JICAgICMgSWYgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzLCBwcmVzZXQgdGhlIHZhbHVlcyBvZiBtYW55IG1vcmUKLQkgICAgIyB0b29scy4KLQkgICAgaWYgWyAiJHtidWlsZH0iICE9ICIke2hvc3R9IiBdOyB0aGVuCi0JCWZvciB2YXIgaW4gJHt0b29sc307IGRvCi0JCSAgICB2YWw9YGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAKLQkJICAgIHNlZCAtZSAiL14ke3Zhcn1bIAldKj0vewotCQkJICAgOmxvb3AxCi0JCQkgICAvXFxcXCQvIE4KLQkJCSAgIC9cXFxcJC8gYiBsb29wMQotCQkJICAgcy9cXFxcXFxuLy9nCi0JCQkgICBzJV4ke3Zhcn1bIAldKj0uKiQlJHt2YXJ9ID0gJHt2YWx9JQotCQkJICAgfSIgJHtNYWtlZmlsZX0gPiAke01ha2VmaWxlfS50ZW0KLQkJICAgIG12IC1mICR7TWFrZWZpbGV9LnRlbSAke01ha2VmaWxlfQotCQlkb25lCi0JICAgIGZpCi0KLSAgICAgICAgICAgICMgZmluYWwgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGVjaG8gIk5vIE1ha2VmaWxlLmluIGZvdW5kIGluICR7c3JjZGlyfS8ke3N1YmRpcn0sIHVuYWJsZSB0byBjb25maWd1cmUiIDE+JjIKLSAgICAgICAgZmkKLQotICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0KLSAgICAgICAgY2FzZSAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgdXNpbmc9IDs7Ci0gICAgICAgICopIHVzaW5nPSJhbmQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgOzsKLSAgICAgICAgKikgdXNpbmc9IiR7dXNpbmd9IGFuZCBcIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBjYXNlICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICIiKSA7OwotICAgICAgICAqKSB1c2luZz0iJHt1c2luZ30gYW5kIFwiJHtzaXRlX21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBuZXd1c2luZz1gZWNobyAiJHt1c2luZ30iIHwgc2VkICdzL2FuZC91c2luZy8nYAotICAgICAgICB1c2luZz0ke25ld3VzaW5nfQotICAgICAgICBlY2hvICJDcmVhdGVkIFwiJHtNYWtlZmlsZX1cIiBpbiIgJHtQV0Q9YHB3ZGB9ICR7dXNpbmd9Ci0KLSAgICAgICAgLiAke3RtcGZpbGV9LnBvcwotCi0gICAgICAgICMgZGVzY3JpYmUgdGhlIGNob3NlbiBjb25maWd1cmF0aW9uIGluIGNvbmZpZy5zdGF0dXMuCi0gICAgICAgICMgTWFrZSB0aGF0IGZpbGUgYSBzaGVsbHNjcmlwdCB3aGljaCB3aWxsIHJlZXN0YWJsaXNoCi0gICAgICAgICMgdGhlIHNhbWUgY29uZmlndXJhdGlvbi4gIFVzZWQgaW4gTWFrZWZpbGVzIHRvIHJlYnVpbGQKLSAgICAgICAgIyBNYWtlZmlsZXMuCi0KLSAgICAgICAgY2FzZSAiJHtub3JlY3Vyc2lvbn0iIGluCi0gICAgICAgICIiKSBhcmd1bWVudHM9IiR7YXJndW1lbnRzfSAtLW5vcmVjdXJzaW9uIiA7OwotICAgICAgICAqKSA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgaWYgWyAke3N1YmRpcn0gPSAuIF0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKLSMgJHtOT19FRElUfQotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotJHtwcm9nbmFtZX0iICR7YXJndW1lbnRzfSAgIgotIyAke3VzaW5nfSIgPiAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKLSMgJHtOT19FRElUfQotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotY2QgJHtpbnZzdWJkaXJ9Ci0ke3Byb2duYW1lfSIgJHthcmd1bWVudHN9ICAiCi0jICR7dXNpbmd9IiA+ICR7c3ViZGlyfS9jb25maWcubmV3Ci0gICAgICAgIGZpCi0gICAgICAgIGNobW9kIGEreCAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuYmFjayBdIDsgdGhlbgotICAgICAgICAgICAgICAgIG12IC1mICR7c3ViZGlyfS9jb25maWcuYmFjayAke3N1YmRpcn0vY29uZmlnLnN0YXR1cwotICAgICAgICBmaQotCSR7Y29uZmlnX3NoZWxsfSAke21vdmVpZmNoYW5nZX0gJHtzdWJkaXJ9L2NvbmZpZy5uZXcgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMKLSAgICAgICAgOzsKLQotICAgICopICBybSAtZiAke01ha2VmaWxlfSAke3N1YmRpcn0vY29uZmlnLnN0YXR1cyAke2xpbmtzfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBJZiB0aGVyZSBhcmUgc3ViZGlyZWN0b3JpZXMsIHRoZW4gcmVjdXIuCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke2NvbmZpZ2RpcnN9IiBdIDsgdGhlbiAKLSAgICAgICAgZm9yIGNvbmZpZ2RpciBpbiAke2NvbmZpZ2RpcnN9ICR7ZXh0cmFjb25maWdkaXJzfSA7IGRvCi0KLQkJIyBJZiBjb25maWdkaXIgY29udGFpbnMgJywnIGl0IGlzCi0JCSMgc3JjZGlyLGJ1aWxkZGlyLHRhcmdldF9hbGlhcwotCQkjIFRoZXNlIGNvbWUgZnJvbSBleHRyYWNvbmZpZ2RpcnMuCi0JCWNhc2UgJHtjb25maWdkaXJ9IGluCi0JCSosKikKLQkJICAgIGV2YWwgYGVjaG8gJHtjb25maWdkaXJ9IHwgc2VkIC1lICdzL1woW14sXSpcKSxcKFteLF0qXCksXCguKlwpL2NmZ19kaXI9XDEgYmxkX2Rpcj1cMiB0Z3RfYWxpYXM9XDMvJ2AKLQkJICAgIDs7Ci0JCSopCi0JCSAgICBjZmdfZGlyPSR7Y29uZmlnZGlyfQotCQkgICAgYmxkX2Rpcj0ke2NvbmZpZ2Rpcn0KLQkJICAgIHRndF9hbGlhcz0ke3RhcmdldF9hbGlhc30KLQkJICAgIDs7Ci0JCWVzYWMKLQotICAgICAgICAgICAgICAgIGlmIFsgLWQgJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwgZWNobyBDb25maWd1cmluZyAke2NvbmZpZ2Rpcn0uLi4gJHtyZWRpcmVjdH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICIuIikgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZCAuLyR7YmxkX2Rpcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBta2RpciAuLyR7YmxkX2Rpcn0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke2JsZF9kaXJ9IiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICAgICAgICAgICAgICBQT1BESVI9JHtQV0Q9YHB3ZGB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZCAke2JsZF9kaXJ9IAotCi0jIyMgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggc3JjZGlyCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAiLiIpIG5ld3NyY2Rpcj0ke3NyY2Rpcn0gOzsgIyBubyAtc3JjZGlyIG9wdGlvbi4gIFdlJ3JlIGJ1aWxkaW5nIGluIHBsYWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICA/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9Li4vJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0KLQkJCSMgSGFuZGxlIC0tY2FjaGUtZmlsZT0uLi9YWFgKLQkJCWNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCi0JCQkiIikgIyBlbXB0eQotCQkJCTs7Ci0JCQkvKikgIyBhYnNvbHV0ZSBwYXRoCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQk/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgotCQkJCWNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIKLQkJCQk7OwotCQkJKikgIyByZWxhdGl2ZSBwYXRoCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0uLi8ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQllc2FjCi0KLSMjIyBjaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUsIG90aGVyd2lzZSBmaXggcG9zc2libHkgcmVsYXRpdmUgcHJvZ25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNwcm9nPSR7bmV3c3JjZGlyfS9jb25maWd1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgWyAtZiAke25ld3NyY2Rpcn0vY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7cHJvZ25hbWV9IiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKikgICAgIHJlY3Byb2c9JHtwcm9nbmFtZX0gOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzoqKSAgICByZWNwcm9nPSR7cHJvZ25hbWV9IDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopICAgICAgcmVjcHJvZz0uLi8ke3Byb2duYW1lfSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0JCQllbHNlCi0JCQkJZXZhbCBlY2hvIE5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gJHtjZmdfZGlyfSAke3JlZGlyZWN0fQotCQkJCXJlY3Byb2c9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaQotCi0jIyMgVGhlIHJlY3Vyc2lvbiBsaW5lIGlzIGhlcmUuCi0JCQlpZiBbICEgLXogIiR7cmVjcHJvZ30iIF0gOyB0aGVuCi0JICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXZhbCAke2NvbmZpZ19zaGVsbH0gJHtyZWNwcm9nfSAke3ZlcmJvc2V9ICR7YnVpbGRvcHR9IC0taG9zdD0ke2hvc3RfYWxpYXN9IC0tdGFyZ2V0PSR7dGd0X2FsaWFzfSBcCi0gICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAke3ByZWZpeG9wdGlvbn0gJHt0bXBkaXJvcHRpb259ICR7ZXhlY19wcmVmaXhvcHRpb259IFwKLSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9ICR7cHJvZ3JhbV9wcmVmaXhvcHRpb259ICR7cHJvZ3JhbV9zdWZmaXhvcHRpb259ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gJHtzaXRlX29wdGlvbn0gJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gJHtlbmFibGVvcHRpb25zfSAke2Rpc2FibGVvcHRpb25zfSAke2Zsb2F0aW5nX3BvaW50b3B0aW9ufSAke2NhY2hlX2ZpbGVfb3B0aW9ufSAke3JlbW92aW5nfSAke290aGVyX29wdGlvbnN9ICR7cmVkaXJlY3R9IDsgdGhlbgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UKLQkJCQkJZWNobyBDb25maWd1cmUgaW4gYHB3ZGAgZmFpbGVkLCBleGl0aW5nLiAxPiYyCi0gICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIAlmaQotCQkJZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2QgJHtQT1BESVJ9Ci0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotZmkKLQotIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKLSMgYW5kIHJlc2V0IHRoZSB0cmFwIGhhbmRsZXIuCi1ybSAtZiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcwotdHJhcCAwCi0KLWV4aXQgMAotCi0jCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgZmlsbC1jb2x1bW46IDEzMQotIyBFbmQ6Ci0jCi0KLSMgZW5kIG9mIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmJhdCBiL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NmEzN2UuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLWNoZGlyIGxpYmliZXJ0eQ0KLWNhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cYmZkDQotY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxvcGNvZGVzDQotY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxncHJvZg0KLWNhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cYmludXRpbHMNCi1jYWxsIGNvbmZpZ3VyZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXGdhcw0KLWNhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cbGQNCi1jYWxsIGNvbmZpZ3VyZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uDQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjg2YTA0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExODQgKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCi0jIyBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKLSMjIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKLSMjIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LiAgCi0KLSMjIEJlIHdhcm5lZCwgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjb25maWd1cmUuaW4gZmlsZXMuICBUaGVyZSBhcmUgdGhvc2UKLSMjIHVzZWQgYnkgQXV0b2NvbmYsIHdoaWNoIGFyZSBtYWNyb3Mgd2hpY2ggYXJlIGV4cGFuZGVkIGludG8gYSBjb25maWd1cmUKLSMjIHNjcmlwdCBieSBhdXRvY29uZi4gIFRoZSBvdGhlciBzb3J0LCBvZiB3aGljaCB0aGlzIGlzIG9uZSwgaXMgZXhlY3V0ZWQKLSMjIGJ5IEN5Z251cyBjb25maWd1cmUuICAKLQotIyMgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgdHdvIHN5c3RlbXMsIGNoZWNrIG91dCB0aGUgZG9jdW1lbnRhdGlvbgotIyMgZm9yICdBdXRvY29uZicgKGF1dG9jb25mLnRleGkpIGFuZCAnQ29uZmlndXJlJyAoY29uZmlndXJlLnRleGkpLiAgCi0KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyBUbyBhZGQgYSBuZXcgZGlyZWN0b3J5IHRvIHRoZSB0cmVlLCBmaXJzdCBjaG9vc2Ugd2hldGhlciBpdCBpcyBhIHRhcmdldAotIyMjIG9yIGEgaG9zdCBkZXBlbmRlbnQgdG9vbC4gIFRoZW4gcHV0IGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QKLSMjIyAobGlicmFyeSBvciB0b29scywgaG9zdCBvciB0YXJnZXQpLCBkb2luZyBhIGRlcGVuZGVuY3kgc29ydC4gIEZvcgotIyMjIGV4YW1wbGUsIGdkYiByZXF1aXJlcyB0aGF0IGJ5YWNjIChvciBiaXNvbikgYmUgYnVpbHQgZmlyc3QsIHNvIGl0IGlzIGluCi0jIyMgdGhlICR7aG9zdF90b29sc30gbGlzdCBhZnRlciBieWFjYyBhbmQgYmlzb24uICAKLQotCi0jIHRoZXNlIGxpYnJhcmllcyBhcmUgdXNlZCBieSB2YXJpb3VzIHByb2dyYW1zIGJ1aWx0IGZvciB0aGUgaG9zdCBlbnZpcm9ubWVudAotIwotaG9zdF9saWJzPSJpbnRsIG1tYWxsb2MgbGliaWJlcnR5IG9wY29kZXMgYmZkIHJlYWRsaW5lIGdhc2ggZGIgdGNsIHRrIHRjbDguMSB0azguMSB0Y2xYIGl0Y2wgdGl4IGxpYmd1aSIKLQotaWYgWyAiJHtlbmFibGVfZ2RiZ3VpfSIgPSAieWVzIiBdIDsgdGhlbgotCWhvc3RfbGlicz0iJHtob3N0X2xpYnN9IGxpYmd1aSIKLWZpCi0KLSMgdGhlc2UgdG9vbHMgYXJlIGJ1aWx0IGZvciB0aGUgaG9zdCBlbnZpcm9ubWVudAotIyBOb3RlLCB0aGUgcG93ZXJwYy1lYWJpIGJ1aWxkIGRlcGVuZHMgb24gc2ltIG9jY3VycmluZyBiZWZvcmUgZ2RiIGluIG9yZGVyIHRvCi0jIGtub3cgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgdGhlIHNpbXVsYXRvci4KLWhvc3RfdG9vbHM9InRleGluZm8gYnlhY2MgZmxleCBiaXNvbiBiaW51dGlscyBsZCBnYXMgZ2NjIHNpbSBnZGIgbWFrZSBwYXRjaCBwcm1zIHNlbmQtcHIgZ3Byb2YgZ2RidGVzdCB0Z2FzIGV0YyBleHBlY3QgZGVqYWdudSBhc2ggYmFzaCBiemlwMiBtNCBhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sIGlzcGVsbCBncmVwIGRpZmYgcmNzIGN2c3NyYyBmaWxldXRpbHMgc2hlbGx1dGlscyB0aW1lIHRleHR1dGlscyB3ZGlmZiBmaW5kIGVtYWNzIGVtYWNzMTkgdXVkZWNvZGUgaGVsbG8gdGFyIGd6aXAgaW5kZW50IHJlY29kZSByZWxlYXNlIHNlZCB1dGlscyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGdhd2sgZmluZHV0aWxzIHNuYXZpZ2F0b3IgbGlidG9vbCBnZXR0ZXh0IHppcCIKLQotIyB0aGVzZSBsaWJyYXJpZXMgYXJlIGJ1aWx0IGZvciB0aGUgdGFyZ2V0IGVudmlyb25tZW50LCBhbmQgYXJlIGJ1aWx0IGFmdGVyCi0jIHRoZSBob3N0IGxpYnJhcmllcyBhbmQgdGhlIGhvc3QgdG9vbHMgKHdoaWNoIG1heSBiZSBhIGNyb3NzIGNvbXBpbGVyKQotIwotdGFyZ2V0X2xpYnM9InRhcmdldC1saWJpYmVydHkgXAotCQl0YXJnZXQtbGliZ2xvc3MgXAotCQl0YXJnZXQtbmV3bGliIFwKLQkJdGFyZ2V0LWxpYmlvIFwKLQkJdGFyZ2V0LWxpYnJ4IFwKLQkJdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JCXRhcmdldC1saWJnKysiCi0KLSMgdGhlc2UgdG9vbHMgYXJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgbGlicywgYW5kIGFyZSBpbnRlbmRlZCB0byBydW4gb25seQotIyBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50Ci0jCi0jIG5vdGU6IGFueSBwcm9ncmFtIHRoYXQgKnVzZXMqIGxpYnJhcmllcyB0aGF0IGFyZSBpbiB0aGUgInRhcmdldF9saWJzIgotIyBsaXN0IGJlbG9uZ3MgaW4gdGhpcyBsaXN0LiAgdGhvc2UgcHJvZ3JhbXMgYXJlIGFsc28gdmVyeSBsaWtlbHkKLSMgY2FuZGlkYXRlcyBmb3IgdGhlICJuYXRpdmVfb25seSIgbGlzdCB3aGljaCBmb2xsb3dzCi0jCi10YXJnZXRfdG9vbHM9InRhcmdldC1leGFtcGxlcyB0YXJnZXQtZ3JvZmYgdGFyZ2V0LWdwZXJmIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyBUaGVzZSB0d28gbGlzdHMgYXJlIG9mIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSMjICR7Y29uZmlnZGlyc30gbGlzdCBmb3IgZWl0aGVyIGNyb3NzLWNvbXBpbGF0aW9ucyBvciBmb3IgbmF0aXZlLQotIyMgY29tcGlsYXRpb25zLiAgRm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgbWFrZSB0aGF0IG11Y2ggc2Vuc2UgdG8KLSMjIGNyb3NzLWNvbXBpbGUgRW1hY3MsIG5vciBpcyBpdCB0ZXJyaWJseSB1c2VmdWwgdG8gY29tcGlsZSB0YXJnZXQtbGliaWJlcnR5IGluCi0jIyBhIG5hdGl2ZSBlbnZpcm9ubWVudC4gIAotCi0jIGRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGluIHRoZSBuYXRpdmUgZW52aXJvbm1lbnQgb25seQotIwotIyBUaGlzIG11c3QgYmUgYSBzaW5nbGUgbGluZSBiZWNhdXNlIG9mIHRoZSB3YXkgaXQgaXMgc2VhcmNoZWQgYnkgZ3JlcCBpbgotIyB0aGUgY29kZSBiZWxvdy4KLW5hdGl2ZV9vbmx5PSJhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sIGN2c3NyYyBlbWFjcyBlbWFjczE5IGZpbGV1dGlscyBmaW5kIGdhd2sgZ2V0dGV4dCBncmVwIGd6aXAgaGVsbG8gaW5kZW50IGlzcGVsbCBtNCByY3MgcmVjb2RlIHNlZCBzaGVsbHV0aWxzIHRhciB0ZXh0dXRpbHMgZ2FzaCB1dWRlY29kZSB3ZGlmZiBncHJvZiB0YXJnZXQtZ3JvZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCB0aW1lIGFzaCBiYXNoIGJ6aXAyIHBybXMgc25hdmlnYXRvciBnbnVzZXJ2IHRhcmdldC1ncGVyZiIKLQotIyBkaXJlY3RvcmllcyB0byBiZSBidWlsdCBpbiBhIGNyb3NzIGVudmlyb25tZW50IG9ubHkKLSMKLWNyb3NzX29ubHk9InRhcmdldC1saWJnbG9zcyB0YXJnZXQtbmV3bGliIHRhcmdldC1jeWdtb24gdGFyZ2V0LW9wY29kZXMgdGFyZ2V0LWxpYnN0dWIiCi0KLSMjIEFsbCB0b29scyBiZWxvbmcgaW4gb25lIG9mIHRoZSBmb3VyIGNhdGVnb3JpZXMsIGFuZCBhcmUgYXNzaWduZWQgYWJvdmUKLSMjIFdlIGFzc2lnbiAke2NvbmZpZ2RpcnN9IHRoaXMgd2F5IHRvIHJlbW92ZSBhbGwgZW1iZWRkZWQgbmV3bGluZXMuICBUaGlzCi0jIyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBjb25maWd1cmUgd2lsbCBjaG9rZSBpZiB0aGV5IGV2ZXIgZ2V0IHRocm91Z2guCi0jIyAke2NvbmZpZ2RpcnN9IGlzIGRpcmVjdG9yaWVzIHdlIGJ1aWxkIHVzaW5nIHRoZSBob3N0IHRvb2xzLgotIyMgJHt0YXJnZXRfY29uZmlnZGlyc30gaXMgZGlyZWN0b3JpZXMgd2UgYnVpbGQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLSMKLWNvbmZpZ2RpcnM9YGVjaG8gJHtob3N0X2xpYnN9ICR7aG9zdF90b29sc31gCi10YXJnZXRfY29uZmlnZGlycz1gZWNobyAke3RhcmdldF9saWJzfSAke3RhcmdldF90b29sc31gCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXNyY3RyaWdnZXI9bW92ZS1pZi1jaGFuZ2UKLXNyY25hbWU9ImdudSBkZXZlbG9wbWVudCBwYWNrYWdlIgotCi0jIFRoaXMgZ2V0cyBzZXQgbm9uLWVtcHR5IGZvciBzb21lIG5ldCByZWxlYXNlcyBvZiBwYWNrYWdlcy4KLWFwcGRpcnM9IiIKLQotIyBwZXItaG9zdDoKLQotIyBXb3JrIGluIGRpc3RyaWJ1dGlvbnMgdGhhdCBjb250YWluIG5vIGNvbXBpbGVyIHRvb2xzLCBsaWtlIEF1dG9jb25mLgotaWYgWyAtZCAke3NyY2Rpcn0vY29uZmlnIF07IHRoZW4KLWNhc2UgIiR7aG9zdH0iIGluCi0gIG02OGstaHAtaHB1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwMzAwIgotICAgIDs7Ci0gIG02OGstYXBvbGxvLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hcG9sbG82OCIKLSAgICA7OwotICBtNjhrLWFwb2xsby1ic2QqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hNjhic2QiCi0gICAgOzsKLSAgbTg4ay1kZy1kZ3V4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGd1eCIKLSAgICA7OwotICBtODhrLWhhcnJpcy1jeHV4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtY3h1eCIKLSAgICA7OwotICBtODhrLW1vdG9yb2xhLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZWx0YTg4IgotICAgIDs7Ci0gIG1pcHMqLWRlYy11bHRyaXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZWNzdGF0aW9uIgotICAgIDs7Ci0gIG1pcHMqLW5lYy1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5lY3Y0IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg2IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg1IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg0IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4MyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gIG1pcHMqLSotc3lzdiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXJpc2NvcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y1IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWRndXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZ3V4Mzg2IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1uY3Itc3lzdjQuMyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5jcnN2cjQzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1uY3Itc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uY3IzMDAwIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zY28iCi0gICAgOzsKLSAgaVszNDU2XTg2LSotdWRrKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjUiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotaXNjKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zb2xhcmlzMiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFpeCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFpeDM4NiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGpncHAiCi0gICAgOzsKLSAgKi1jeWd3aW4qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1jeWd3aW4iCi0gICAgOzsKLSAgKi1taW5ndzMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbWluZ3czMiIKLSAgICA7OwotICAqLWludGVyaXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pbnRlcml4IgotICAgIDs7Ci0gICotd2luZG93cyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXdpbmRvd3MiCi0gICAgOzsKLSAgdmF4LSotdWx0cml4MiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXZheHVsdDIiCi0gICAgOzsKLSAgKi0qLXNvbGFyaXMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc29sYXJpcyIKLSAgICA7OwotICBtNjhrLXN1bi1zdW5vcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN1bjMiCi0gICAgOzsKLSAgKi1ocC1ocHV4Wzc4XSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXg4IgotICAgIDs7Ci0gICotaHAtaHB1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXgiCi0gICAgOzsKLSAgKi0qLWhpdXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4IgotICAgIDs7Ci0gIHJzNjAwMC0qLWx5bnhvcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWx5bnhyczZrIgotICAgIDs7Ci0gICotKi1seW54b3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1seW54b3MiCi0gICAgOzsKLSAgKi0qLWFpeDQuWzM0NTY3ODldKiB8ICotKi1haXhbNTY3ODldLiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFpeDQzIgotICAgIDs7Ci0gICotKi1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gICotKi1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotZXNhYwotZmkKLQotIyBJZiB3ZSBhcmVuJ3QgZ29pbmcgdG8gYmUgdXNpbmcgZ2NjLCBzZWUgaWYgd2UgY2FuIGV4dHJhY3QgYSBkZWZpbml0aW9uCi0jIG9mIENDIGZyb20gdGhlIGZyYWdtZW50LgotaWYgWyAteiAiJHtDQ30iIF0gJiYgWyAiJHtidWlsZH0iID0gIiR7aG9zdH0iIF07IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm91bmQ9Ci0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0gICAgICBmb3VuZD15ZXMKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLSAgaWYgWyAteiAiJHtmb3VuZH0iIF0gJiYgWyAtbiAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdICYmIFsgLWYgIiR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30iIF07IHRoZW4KLSAgICB4eD1gc2VkIC1uIC1lICdzL15bIAldKkNDWyAJXSo9WyAJXSpcKC4qXCkkL1wxL3AnIDwgJHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfWAKLSAgICBpZiBbIC1uICIke3h4fSIgXSA7IHRoZW4KLSAgICAgIENDPSR4eAotICAgIGZpCi0gIGZpCi1maQotCi0jIFdlIGRlZmF1bHQgdG8gLS13aXRoLXNoYXJlZCBvbiBwbGF0Zm9ybXMgd2hlcmUgLWZwaWMgaXMgbWVhbmluZ2xlc3MuCi0jIFdlbGwsIHdlIGRvbid0IHlldCwgYnV0IHdlIHdpbGwuCi1pZiBmYWxzZSAmJiBbICIke2hvc3R9IiA9ICIke3RhcmdldH0iIF0gJiYgWyB4JHtlbmFibGVfc2hhcmVkfSA9IHggXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gICAgYWxwaGEqLWRlYy1vc2YqKQllbmFibGVfc2hhcmVkPXllcyA7OwotICAgIGFscGhhKi0qLWxpbnV4KikJZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBtaXBzLXNnaS1pcml4NSopCWVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgKikJCQllbmFibGVfc2hhcmVkPW5vIDs7Ci0gIGVzYWMKLWZpCi0KLWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0gIHllcykgc2hhcmVkPXllcyA7OwotICBubykgc2hhcmVkPW5vIDs7Ci0gICIiKSBzaGFyZWQ9bm8gOzsKLSAgKikgc2hhcmVkPXllcyA7OwotZXNhYwotCi1pZiBbIHgke3NoYXJlZH0gPSB4eWVzIF07IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICBhbHBoYSotKi1saW51eCopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZWxmYWxwaGFwaWMiCi0gICAgICA7OwotICAgIGFybSotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFybXBpYyIKLSAgICAgIDs7Ci0gICAgaHBwYSotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXBhcGljIgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKi1jeWd3aW4qKQotICAgICAgIyBXZSBkb24ndCB3YW50IC1mUElDIG9uIEN5Z3dpbi4KLSAgICAgIDs7Ci0gICAgaVszNDU2XTg2LSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC14ODZwaWMiCi0gICAgICA7OwotICAgIHNwYXJjNjQtKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXNwYXJjcGljIgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLWFpeCopCi0gICAgICAjIFdlIGRvbid0IHdhbnQgLWZQSUMgb24gQUlYLgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtcHBjcGljIgotICAgICAgOzsKLSAgICAqLSotKikKLSAgICAgIGlmIHRlc3QgLWYgJHtzcmNkaXJ9L2NvbmZpZy9taC0ke2hvc3RfY3B1fXBpYzsgdGhlbgotICAgICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtJHtob3N0X2NwdX1waWMiCi0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotZmkKLQotcm0gLWYgbWgtZnJhZwotaWYgWyAtbiAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdIDsgdGhlbgotICBmb3IgZiBpbiAke2hvc3RfbWFrZWZpbGVfZnJhZ30KLSAgZG8KLSAgICBjYXQgJHtzcmNkaXJ9LyRmID4+IG1oLWZyYWcKLSAgZG9uZQotICBob3N0X21ha2VmaWxlX2ZyYWc9bWgtZnJhZwotZmkKLQotIyBwZXItdGFyZ2V0OgotCi1jYXNlICIke3RhcmdldH0iIGluCi0gIHY4MTAqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtdjgxMCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXR3YXJlKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW5ldHdhcmUiCi0gICAgOzsKLSAgcG93ZXJwYy0qLW5ldHdhcmUqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbmV0d2FyZSIKLSAgICA7OwotICAqLSotbGludXgtZ251KQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbGludXgiCi0gICAgOzsKLWVzYWMKLQotIyBJZiAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UgYWx3YXlzIHVzZSAtT3MgaW5zdGVhZCBvZiAtTzIgdG8gYnVpbGQKLSMgdGhlIHRhcmdldCBsaWJyYXJpZXMsIHNpbWlsYXJseSBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgLU9zCi0jIG9uIHNlbGVjdGVkIHBsYXRmb3Jtcy4KLWNhc2UgIiR7ZW5hYmxlX3RhcmdldF9vcHRzcGFjZX06JHt0YXJnZXR9IiBpbgotICB5ZXM6KikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW9zcGFjZSIKLSAgICA7OwotICAjIENZR05VUyBMT0NBTCBkMTB2LCBkMzB2LCBmcjMwCi0gIDpkMzB2LSopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1kMzB2IgotICAgIDs7Ci0gIDptMzJyLSogfCA6ZDEwdi0qIHwgOmZyMzAtKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW9zcGFjZSIKLSAgICA7OwotICBubzoqIHwgOiopCi0gICAgOzsKLSAgKikKLSAgICBlY2hvICIqKiogYmFkIHZhbHVlIFwiJHtlbmFibGVfdGFyZ2V0X29wdHNwYWNlfVwiIGZvciAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UgZmxhZzsgaWdub3JlZCIgMT4mMgotICAgIDs7Ci1lc2FjCi0KLXNraXBkaXJzPQotZ2FzZGlyPWdhcwotdXNlX2dudV9sZD0KLXVzZV9nbnVfYXM9Ci0KLSMgc29tZSB0b29scyBhcmUgc28gZGVwZW5kZW50IHVwb24gWDExIHRoYXQgaWYgd2UncmUgbm90IGJ1aWxkaW5nIHdpdGggWCwgCi0jIGl0J3Mgbm90IGV2ZW4gd29ydGggdHJ5aW5nIHRvIGNvbmZpZ3VyZSwgbXVjaCBsZXNzIGJ1aWxkLCB0aGF0IHRvb2wuCi0KLWNhc2UgJHt3aXRoX3h9IGluCi0gIHllcyB8ICIiKSAgIyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyB0cmVlIGlzIHRoYXQgWDExIGlzIGF2YWlsYWJsZQotCTs7Ci0gIG5vKQotCXNraXBkaXJzPSIke3NraXBkaXJzfSB0ayBsaWJndWkgZ2FzaCIKLQk7OwotICAqKQotICAgIAllY2hvICIqKiogYmFkIHZhbHVlIFwiJHt3aXRoX3h9XCIgZm9yIC13aXRoLXggZmxhZzsgaWdub3JlZCIgMT4mMgotICAgIAk7OwotZXNhYwotCi0jIFNvbWUgdG9vbHMgYXJlIG9ubHkgc3VpdGFibGUgZm9yIGJ1aWxkaW5nIGluIGEgIm5hdGl2ZSIgc2l0dWF0aW9uLgotIyBUaG9zZSBhcmUgYWRkZWQgd2hlbiB3ZSBoYXZlIGEgaG9zdD09dGFyZ2V0IGNvbmZpZ3VyYXRpb24uICBGb3IgY3Jvc3MKLSMgdG9vbGNoYWlucywgd2UgYWRkIHNvbWUgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgb25seSBiZSB1c2VmdWwgaW4gYQotIyBjcm9zcy1jb21waWxlci4KLQotaXNfY3Jvc3NfY29tcGlsZXI9Ci0KLWlmIFsgeCIke2hvc3R9IiA9IHgiJHt0YXJnZXR9IiBdIDsgdGhlbgotCSMgd2hlbiBkb2luZyBhIG5hdGl2ZSB0b29sY2hhaW4sIGRvbid0IGJ1aWxkIHRoZSB0YXJnZXRzCi0JIyB0aGF0IGFyZSBpbiB0aGUgJ2Nyb3NzIG9ubHknIGxpc3QKLQlza2lwZGlycz0iJHtza2lwZGlyc30gJHtjcm9zc19vbmx5fSIKLQlpc19jcm9zc19jb21waWxlcj1ubwotZWxzZQotCSMgc2ltaWxhcmx5LCBkb24ndCBidWlsZCB0aGUgdGFyZ2V0cyBpbiB0aGUgJ25hdGl2ZSBvbmx5JyAKLQkjIGxpc3Qgd2hlbiBidWlsZGluZyBhIGNyb3NzIGNvbXBpbGVyCi0Jc2tpcGRpcnM9IiR7c2tpcGRpcnN9ICR7bmF0aXZlX29ubHl9IgotCWlzX2Nyb3NzX2NvbXBpbGVyPXllcwotZmkJCi0KLSMgV2UgYWx3YXlzIHdhbnQgdG8gdXNlIHRoZSBzYW1lIG5hbWUgZm9yIHRoaXMgZGlyZWN0b3J5LCBzbyB0aGF0IGRlamFnbnUKLSMgY2FuIHJlbGlhYmx5IGZpbmQgaXQuCi10YXJnZXRfc3ViZGlyPSR7dGFyZ2V0X2FsaWFzfQotCi1pZiBbICEgLWQgJHt0YXJnZXRfc3ViZGlyfSBdIDsgdGhlbgotICBpZiBta2RpciAke3RhcmdldF9zdWJkaXJ9IDsgdGhlbiB0cnVlCi0gIGVsc2UKLSAgICBlY2hvICInKioqIGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke3RhcmdldF9zdWJkaXJ9IiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maQotCi1jb3B5X2RpcnM9Ci0KLSMgSGFuZGxlIC0td2l0aC1oZWFkZXJzPVhYWC4gIFRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgZGlyZWN0b3J5IGFyZQotIyBjb3BpZWQgdG8gJCh0b29sZGlyKS9zeXMtaW5jbHVkZS4KLWlmIFsgeCIke3dpdGhfaGVhZGVyc30iICE9IHggXTsgdGhlbgotICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSA9IHhubyBdOyB0aGVuCi0gICAgZWNobyAxPiYyICcqKionIC0td2l0aC1oZWFkZXJzIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gY3Jvc3MgY29tcGlsaW5nCi0gICAgZXhpdCAxCi0gIGZpCi0gIGNhc2UgIiR7ZXhlY19wcmVmaXhvcHRpb259IiBpbgotICAiIikgeD0ke3ByZWZpeH0gOzsKLSAgKikgeD0ke2V4ZWNfcHJlZml4fSA7OwotICBlc2FjCi0gIGNvcHlfZGlycz0iJHtjb3B5X2RpcnN9ICR7d2l0aF9oZWFkZXJzfSAkeC8ke3RhcmdldF9hbGlhc30vc3lzLWluY2x1ZGUiCi1maQotCi0jIEhhbmRsZSAtLXdpdGgtbGlicz1YWFguICBNdWx0aXBsZSBkaXJlY3RvcmllcyBhcmUgcGVybWl0dGVkLiAgVGhlCi0jIGNvbnRlbnRzIGFyZSBjb3BpZWQgdG8gJCh0b29sZGlyKS9saWIuCi1pZiBbIHgiJHt3aXRoX2xpYnN9IiAhPSB4IF07IHRoZW4KLSAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gPSB4bm8gXTsgdGhlbgotICAgIGVjaG8gMT4mMiAnKioqJyAtLXdpdGgtbGlicyBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIGNyb3NzIGNvbXBpbGluZwotICAgIGV4aXQgMQotICBmaQotICAjIENvcHkgdGhlIGxpYnJhcmllcyBpbiByZXZlcnNlIG9yZGVyLCBzbyB0aGF0IGZpbGVzIGluIHRoZSBmaXJzdCBuYW1lZAotICAjIGxpYnJhcnkgb3ZlcnJpZGUgZmlsZXMgaW4gc3Vic2VxdWVudCBsaWJyYXJpZXMuCi0gIGNhc2UgIiR7ZXhlY19wcmVmaXhvcHRpb259IiBpbgotICAiIikgeD0ke3ByZWZpeH0gOzsKLSAgKikgeD0ke2V4ZWNfcHJlZml4fSA7OwotICBlc2FjCi0gIGZvciBsIGluICR7d2l0aF9saWJzfTsgZG8KLSAgICBjb3B5X2RpcnM9IiRsICR4LyR7dGFyZ2V0X2FsaWFzfS9saWIgJHtjb3B5X2RpcnN9IgotICBkb25lCi1maQotCi0jIElmIGJvdGggLS13aXRoLWhlYWRlcnMgYW5kIC0td2l0aC1saWJzIGFyZSBzcGVjaWZpZWQsIGRlZmF1bHQgdG8KLSMgLS13aXRob3V0LW5ld2xpYi4KLWlmIFsgeCIke3dpdGhfaGVhZGVyc30iICE9IHggXSAmJiBbIHgiJHt3aXRoX2xpYnN9IiAhPSB4IF07IHRoZW4KLSAgaWYgWyB4IiR7d2l0aF9uZXdsaWJ9IiA9IHggXTsgdGhlbgotICAgIHdpdGhfbmV3bGliPW5vCi0gIGZpCi1maQotCi0jIFJlY29nbml6ZSAtLXdpdGgtbmV3bGliLy0td2l0aG91dC1uZXdsaWIuCi1pZiBbIHgke3dpdGhfbmV3bGlifSA9IHhubyBdOyB0aGVuCi0gIHNraXBkaXJzPSIke3NraXBkaXJzfSB0YXJnZXQtbmV3bGliIgotZWxpZiBbIHgke3dpdGhfbmV3bGlifSA9IHh5ZXMgXTsgdGhlbgotICBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIHRhcmdldC1uZXdsaWIgLyAvJ2AKLWZpCi0KLSMgRGVmYXVsdCB0byB1c2luZyAtLXdpdGgtc3RhYnMgZm9yIGNlcnRhaW4gdGFyZ2V0cy4KLWlmIFsgeCR7d2l0aF9zdGFic30gPSB4IF07IHRoZW4KLSAgY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzKi0qLWlyaXg2KikKLSAgICA7OwotICBtaXBzKi0qLSogfCBhbHBoYSotKi1vc2YqKQotICAgIHdpdGhfc3RhYnM9eWVzOwotICAgIHdpdGhvcHRpb25zPSIke3dpdGhvcHRpb25zfSAtLXdpdGgtc3RhYnMiCi0gICAgOzsKLSAgZXNhYwotZmkKLQotIyBIYW5kbGUgJHtjb3B5X2RpcnN9Ci1zZXQgZm5vcmQgJHtjb3B5X2RpcnN9Ci1zaGlmdAotd2hpbGUgWyAkIyAhPSAwIF07IGRvCi0gIGlmIFsgLWYgJDIvQ09QSUVEIF0gJiYgWyB4ImBjYXQgJDIvQ09QSUVEYCIgPSB4IiQxIiBdOyB0aGVuCi0gICAgOgotICBlbHNlCi0gICAgZWNobyBDb3B5aW5nICQxIHRvICQyCi0KLSAgICAjIFVzZSB0aGUgaW5zdGFsbCBzY3JpcHQgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkgYW5kIGFsbCByZXF1aXJlZAotICAgICMgcGFyZW50IGRpcmVjdG9yaWVzLgotICAgIGlmIFsgLWQgJDIgXTsgdGhlbgotICAgICAgOgotICAgIGVsc2UKLSAgICAgIGVjaG8gPmNvbmZpZy50ZW1wCi0gICAgICAke3NyY2Rpcn0vaW5zdGFsbC1zaCAtYyAtbSA2NDQgY29uZmlnLnRlbXAgJDIvQ09QSUVECi0gICAgZmkKLQotICAgICMgQ29weSB0aGUgZGlyZWN0b3J5LCBhc3N1bWluZyB3ZSBoYXZlIHRhci4KLSAgICAjIEZJWE1FOiBTaG91bGQgd2UgdXNlIEIgaW4gdGhlIHNlY29uZCB0YXI/ICBOb3QgYWxsIHN5c3RlbXMgc3VwcG9ydCBpdC4KLSAgICAoY2QgJDE7IHRhciAtY2YgLSAuKSB8IChjZCAkMjsgdGFyIC14cGYgLSkKLQotICAgICMgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGNvcnJlY3RseSBhZGp1c3QgYWxsCi0gICAgIyBzeW1saW5rcy4gIElmIHNvbWVib2R5IGNhbiBmaWd1cmUgb3V0IGhvdyB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkKLSAgICAjIGhlcmUsIGZlZWwgZnJlZSB0byBhZGQgdGhlIGNvZGUuCi0KLSAgICBlY2hvICQxID4gJDIvQ09QSUVECi0gIGZpCi0gIHNoaWZ0OyBzaGlmdAotZG9uZQotCi0jIENvbmZpZ3VyZSBleHRyYSBkaXJlY3RvcmllcyB3aGljaCBhcmUgaG9zdCBzcGVjaWZpYwotCi1jYXNlICIke2hvc3R9IiBpbgotCWlbMzQ1Nl04Ni0qLWdvMzIqKQotCSAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgZG9zcmVsIiA7OwotCWlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotCSAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgZG9zcmVsIiA7OwotCSotY3lnd2luKikKLQkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGxpYnRlcm1jYXAgZG9zcmVsIiA7OwotZXNhYwotCi0jIFJlbW92ZSBtb3JlIHByb2dyYW1zIGZyb20gY29uc2lkZXJhdGlvbiwgYmFzZWQgb24gdGhlIGhvc3Qgb3IgCi0jIHRhcmdldCB0aGlzIHVzdWFsbHkgbWVhbnMgdGhhdCBhIHBvcnQgb2YgdGhlIHByb2dyYW0gZG9lc24ndAotIyBleGlzdCB5ZXQuCi0KLW5vY29uZmlnZGlycz0iIgotCi1jYXNlICIke2hvc3R9IiBpbgotICBpWzM0NTZdODYtKi12c3RhKQotICAgIG5vY29uZmlnZGlycz0idGNsIGV4cGVjdCBkZWphZ251IG1ha2UgdGV4aW5mbyBiaXNvbiBwYXRjaCBmbGV4IGJ5YWNjIHNlbmQtcHIgZ3Byb2YgdXVkZWNvZGUgZGVqYWdudSBkaWZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IGdldHRleHQiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZ28zMiogfCBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikKLSAgICBub2NvbmZpZ2RpcnM9InRjbCB0ayBleHBlY3QgZGVqYWdudSBtYWtlIHRleGluZm8gYmlzb24gcGF0Y2ggZmxleCBieWFjYyBzZW5kLXByIHV1ZGVjb2RlIGRlamFnbnUgZGlmZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiBnZXR0ZXh0IgotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotICAgICMgbm9jb25maWdkaXJzPSJ0Y2wgdGsgZXhwZWN0IGRlamFnbnUgbWFrZSB0ZXhpbmZvIGJpc29uIHBhdGNoIGZsZXggYnlhY2Mgc2VuZC1wciB1dWRlY29kZSBkZWphZ251IGRpZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgIG5vY29uZmlnZGlycz0iZXhwZWN0IGRlamFnbnUgY3ZzIGF1dG9jb25mIGF1dG9tYWtlIHNlbmQtcHIgZ3Byb2YgcmNzIGd1aWxlIHBlcmwgdGV4aW5mbyBhcGFjaGUgaW5ldCBsaWJ0b29sIgotCTs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGsgaXRjbCB0aXggbGliZ3VpIGdkYiIKLSAgICAgOzsKLSAgKi0qLWN5Z3dpbiopCi0gICAgIG5vY29uZmlnZGlycz0iYXV0b2NvbmYgYXV0b21ha2Ugc2VuZC1wciBncHJvZiByY3MgZ3VpbGUgcGVybCB0ZXhpbmZvIGFwYWNoZSBpbmV0IgotICAgIDs7Ci0gICotKi1uZXRic2QqKQotICAgIG5vY29uZmlnZGlycz0icmNzIgotICAgIDs7Ci0gIHBwYyotKi1wZSkKLSAgICAgbm9jb25maWdkaXJzPSJwYXRjaCBkaWZmIG1ha2UgdGsgdGNsIGV4cGVjdCBkZWphZ251IGN2c3NyYyBhdXRvY29uZiBhdXRvbWFrZSB0ZXhpbmZvIGJpc29uIHNlbmQtcHIgZ3Byb2YgcmNzIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgIDs7Ci1lc2FjCi0KLQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICAqLSotbmV0d2FyZSkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJyeCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJpYmVydHkgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gICotKi1ydGVtcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICAqLSotdnh3b3JrcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFscGhhKi1kZWMtb3NmKikKLSAgICAjIGxkIHdvcmtzLCBidXQgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLiAgZW1hY3MgZG9lc24ndAotICAgICMgd29yay4gIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5LiAgSSdtIG5vdCBzdXJlIGFib3V0IGZpbGV1dGlscy4KLSAgICAjIGdhcyBkb2Vzbid0IGdlbmVyYXRlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2FzIGxkIGVtYWNzIGZpbGV1dGlscyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhbHBoYSotKi0qdm1zKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIGxkIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4KikKLSAgICAjIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5Ci0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgICMgbGludXggaGFzIHJ4IGluIGxpYmMKLSAgICBza2lwZGlycz0iJHNraXBkaXJzIHRhcmdldC1saWJyeCIKLSAgICA7OwotICBhbHBoYSotKi0qKQotICAgICMgbmV3bGliIGlzIG5vdCA2NCBiaXQgcmVhZHkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJjLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLXBlKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLWNvZmYqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIGFybS0qLWVsZiopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgYXJtLSotb2FiaSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBjNHgtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdGh1bWItKi1jb2ZmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSMgQ1lHTlVTIExPQ0FMIGNsbS9hcm0tZWxmCi0gIHRodW1iLSotZWxmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdGh1bWItKi1vYWJpKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotIyBDWUdOVVMgTE9DQUwgbmlja2Mvc3Ryb25nYXJtCi0gIHN0cm9uZ2FybS0qLWVsZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzdHJvbmdhcm0tKi1jb2ZmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0jIEVORCBDWUdOVVMgTE9DQUwKLSAgdGh1bWItKi1wZSkgIyBDWUdOVVMgTE9DQUwgbmlja2MvdGh1bWIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLXJpc2NpeCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBkMTB2LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8iCi0gICAgOzsKLSMgQ1lHTlVTIExPQ0FMIGQzMHYKLSAgZDMwdi0qLSopCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotIyBDWUdOVVMgTE9DQUwgZnIzMAotICBmcjMwLSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotICBoODMwMCotKi0qIHwgXAotICBoODUwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBocHBhKi0qLSplbGYqIHwgXAotICBocHBhKi0qLWxpdGVzKikKLSAgICAjIERvIGNvbmZpZ3VyZSBsZC9iaW51dGlscy9nYXMgZm9yIHRoaXMgY2FzZS4KLSAgICA7OwotICBocHBhKi0qLSopCi0gICAgIyBIUCdzIEMgY29tcGlsZXIgZG9lc24ndCBoYW5kbGUgRW1hY3MgY29ycmVjdGx5IChidXQgb24gQlNEIGFuZCBNYWNoCi0gICAgIyBjYyBpcyBnY2MsIGFuZCBvbiBhbnkgc3lzdGVtIGEgdXNlciBzaG91bGQgYmUgYWJsZSB0byBsaW5rIGNjIHRvCi0gICAgIyB3aGF0ZXZlciB0aGV5IHdhbnQuICBGSVhNRSwgZW1hY3MgZW1hY3MxOSkuCi0gICAgY2FzZSAiJHtDQ30iIGluCi0JIiIgfCBjYyopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IiA7OwotICAgICAgICAqKSA7OwotICAgIGVzYWMKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgc2hlbGx1dGlscyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1jb2ZmIHwgaVszNDU2XTg2LSotZWxmKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotICAgICAgICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBpWzM0NTZdODYtKi1nbzMyKiB8IGlbMzQ1Nl0tKi1tc2Rvc2RqZ3BwKikKLSAgICAjIGJ1dCBkb24ndCBidWlsZCBnZGIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gICotKi1saW51eCopCi0gICAgIyBsaW51eCBoYXMgcnggaW4gbGliYwotICAgIHNraXBkaXJzPSIkc2tpcGRpcnMgdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotICAgIHRhcmdldF9jb25maWdkaXJzPSIkdGFyZ2V0X2NvbmZpZ2RpcnMgdGFyZ2V0LW1pbmd3IgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBleHBlY3QgdGFyZ2V0LWxpYmdsb3NzIgotCi0gICAgIyBDYW4ndCBidWlsZCBnZGIgZm9yIG1pbmd3MzIgaWYgbm90IG5hdGl2ZS4KLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgaVszNDU2XTg2LSotbWluZ3czMikgOzsgIyBrZWVwIGdkYiB0Y2wgdGsgZXhwZWN0IGV0Yy4KLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgICAgICA7OwotICAgIGVzYWMKLSAgICA7OyAgICAKLSAgKi0qLWN5Z3dpbiopCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtbGlidGVybWNhcCB0YXJnZXQtd2luc3VwIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgIyBhbHdheXMgYnVpbGQgbmV3bGliLgotICAgIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotCi0gICAgIyBDYW4ndCBidWlsZCBnZGIgZm9yIEN5Z3dpbiBpZiBub3QgbmF0aXZlLgotICAgIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgICAqLSotY3lnd2luKikgOzsgIyBrZWVwIGdkYiB0Y2wgdGsgZXhwZWN0IGV0Yy4KLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBsaWJndWkgZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsgICAgCi0gIGlbMzQ1Nl04Ni0qLXBlKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotICAgICMgVGhlIGxpbmtlciBkb2VzIG5vdCB5ZXQga25vdyBhYm91dCB3ZWFrIHN5bWJvbHMgaW4gQ09GRiwKLSAgICAjIGFuZCBpcyBub3QgY29uZmlndXJlZCB0byBoYW5kbGUgbWl4ZWQgRUxGIGFuZCBDT0ZGLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXN5c3Y0KikKLSAgICAjIFRoZSBTWVNWNCBDIGNvbXBpbGVyIGRvZXNuJ3QgaGFuZGxlIEVtYWNzIGNvcnJlY3RseQotICAgIGNhc2UgIiR7Q0N9IiBpbgotCSIiIHwgY2MqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZW1hY3MgZW1hY3MxOSIgOzsKLSAgICAgICAgKikgOzsKLSAgICBlc2FjCi0gICAgIyBidXQgdGhhdCdzIG9rYXkgc2luY2UgZW1hY3MgZG9lc24ndCB3b3JrIGFueXdheQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zKikKLSAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICAgOzsKLSAgbTY4ay0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIG02OGstKi1jb2ZmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbW4xMDIwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbW4xMDMwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBwb3dlcnBjLSotYWl4KikKLSAgICAjIGNvcGllZCBmcm9tIHJzNjAwMC0qLSogZW50cnkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgY3Zzc3JjIHRhcmdldC1saWJnbG9zcyIKLSAgICAjIFRoaXMgaXMgbmVlZGVkIHVudGlsIGdjYyBhbmQgbGQgYXJlIGZpeGVkIHRvIHdvcmsgdG9nZXRoZXIuCi0gICAgdXNlX2dudV9sZD1ubwotICAgIDs7Ci0gIHBvd2VycGMqLSotd2lubnQqIHwgcG93ZXJwYyotKi1wZSogfCBwcGMqLSotcGUpCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtd2luc3VwIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIG1ha2UgZXhwZWN0IHRhcmdldC1saWJnbG9zcyBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgIyBhbHdheXMgYnVpbGQgbmV3bGliLgotICAgIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotICAgIDs7Ci0gICAgIyBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBjYW4gbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMKLSAgcG93ZXJwY2xlLSotc29sYXJpcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiBzaW0gbWFrZSB0Y2wgdGsgZXhwZWN0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICA7OwotICBwb3dlcnBjLSotZWFiaSkKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgcnM2MDAwLSotbHlueG9zKikKLSAgICAjIFRoZSBDVlMgc2VydmVyIGNvZGUgZG9lc24ndCB3b3JrIG9uIHRoZSBSUy82MDAwCi0gICAgIyBOZXdsaWIgbWFrZXMgcHJvYmxlbXMgZm9yIGxpYmcrKyBpbiBjcm9zc2VzLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIGdwcm9mIGN2c3NyYyIKLSAgICA7OwotICByczYwMDAtKi1haXgqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKLSAgICAjIFRoaXMgaXMgbmVlZGVkIHVudGlsIGdjYyBhbmQgbGQgYXJlIGZpeGVkIHRvIHdvcmsgdG9nZXRoZXIuCi0gICAgdXNlX2dudV9sZD1ubwotICAgIDs7Ci0gIHJzNjAwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgIDs7Ci0gIG02OGstYXBvbGxvLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIGJpbnV0aWxzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi0qLWlyaXg1KikKLSAgICAjIFRoZSBHTlUgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KLSAgICAjIGVtYWNzIGlzIGVtYWNzIDE4LCB3aGljaCBkb2VzIG5vdCB3b3JrIG9uIElyaXggNSAoZW1hY3MxOSBkb2VzIHdvcmspCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIGdwcm9mIGVtYWNzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi0qLWlyaXg2KikKLSAgICAjIFRoZSBHTlUgYXNzZW1ibGVyIGRvZXMgbm90IHN1cHBvcnQgSVJJWCA2LgotICAgICMgZW1hY3MgaXMgZW1hY3MgMTgsIHdoaWNoIGRvZXMgbm90IHdvcmsgb24gSXJpeCA1IChlbWFjczE5IGRvZXMgd29yaykKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2FzIGdwcm9mIGVtYWNzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi1kZWMtYnNkKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotYnNkKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHN0eDM5LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YiICAgIyBzYW1lIGFzIGdlbmVyaWMgbWlwcwotICAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICA7OwotICBtaXBzKi0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgIDs7Ci0gIHJvbXAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgbGQgZ2FzIG9wY29kZXMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHNoLSotKikKLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgaVszNDU2XTg2LSotdnN0YSkgOzsgIyBkb24ndCBhZGQgZ3Byb2YgYmFjayBpbgotICAgICAgaVszNDU2XTg2LSotZ28zMiopIDs7ICMgZG9uJ3QgYWRkIGdwcm9mIGJhY2sgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKSA7OyAjIGRvbid0IGFkZCBncHJvZiBiYWNrIGluCi0gICAgICAqKSBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIGdwcm9mIC8gLydgIDs7Ci0gICAgZXNhYwotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgc3BhcmMtKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3BhcmM2NC0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyY2xpdGUtKi0qKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyYy0qLXN1bm9zNCopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0gICAgICAgICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgZ2RidGVzdCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICBlbHNlCi0gICAgICAgICAgIHVzZV9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIHY4MTAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgZ2FzIGdjYyBnZGIgbGQgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2ODUwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTBlLSotKikgIyBDWUdOVVMgTE9DQUwgdjg1MGUKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTBlYS0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OyAgICAgICAjIEVORCBDWUdOVVMgTE9DQUwKLSAgdmF4LSotdm1zKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgZ2RiIGxkIHRhcmdldC1uZXdsaWIgb3Bjb2RlcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdmF4LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgKi0qLWx5bnhvcyopCi0gICAgIyBOZXdsaWIgbWFrZXMgcHJvYmxlbXMgZm9yIGxpYmcrKyBpbiBjcm9zc2VzLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OyAKLSAgKi0qLW1hY29zKiB8IFwKLSAgKi0qLW1wdyopCi0gICAgIyBNYWNzIHdhbnQgYSByZXNvdXJjZSBjb21waWxlci4KLSAgICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBncmV6IgotICAgIDs7ICAgIAotZXNhYwotCi0jIElmIHdlIGFyZW4ndCBidWlsZGluZyBuZXdsaWIsIHRoZW4gZG9uJ3QgYnVpbGQgbGliZ2xvc3MsIHNpbmNlIGxpYmdsb3NzCi0jIGRlcGVuZHMgdXBvbiBzb21lIG5ld2xpYiBoZWFkZXIgZmlsZXMuCi1jYXNlICIke25vY29uZmlnZGlyc30iIGluCi0gICp0YXJnZXQtbGliZ2xvc3MqKSA7OwotICAqdGFyZ2V0LW5ld2xpYiopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiIDs7Ci1lc2FjCi0KLSMgTWFrZSBzdXJlIHdlIGRvbid0IGxldCBHTlUgbGQgYmUgYWRkZWQgaWYgd2UgZGlkbid0IHdhbnQgaXQuCi1pZiBbIHgkd2l0aF9nbnVfbGQgPSB4bm8gXTsgdGhlbgotICB1c2VfZ251X2xkPW5vCi0gIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCIKLWZpCi0KLSMgTWFrZSBzdXJlIHdlIGRvbid0IGxldCBHTlUgYXMgYmUgYWRkZWQgaWYgd2UgZGlkbid0IHdhbnQgaXQuCi1pZiBbIHgkd2l0aF9nbnVfYXMgPSB4bm8gXTsgdGhlbgotICB1c2VfZ251X2FzPW5vCi0gIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnYXMiCi1maQotCi0jIFJlbW92ZSB0aGUgZW50cmllcyBpbiAkc2tpcGRpcnMgYW5kICRub2NvbmZpZ2RpcnMgZnJvbSAkY29uZmlnZGlycyBhbmQKLSMgJHRhcmdldF9jb25maWdkaXJzLgotIyBJZiB3ZSBoYXZlIHRoZSBzb3VyY2UgZm9yICRub2NvbmZpZ2RpcnMgZW50cmllcywgYWRkIHRoZW0gdG8gJG5vdHN1cHAuCi0KLW5vdHN1cHA9IiIKLWZvciBkaXIgaW4gLiAkc2tpcGRpcnMgJG5vY29uZmlnZGlycyA7IGRvCi0gIGRpcm5hbWU9YGVjaG8gJGRpciB8IHNlZCAtZSBzL3RhcmdldC0vL2dgCi0gIGlmIFsgJGRpciAhPSAuIF0gICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgY29uZmlnZGlycz1gZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IHNlZCAtZSAicy8gJHtkaXJ9IC8gLyJgCi0gICAgaWYgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZSBdIFwKLQl8fCBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlLmluIF07IHRoZW4KLSAgICAgIGlmIGVjaG8gIiAke3NraXBkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCXRydWUKLSAgICAgIGVsc2UKLQlub3RzdXBwPSIkbm90c3VwcCAkZGlyIgotICAgICAgZmkKLSAgICBmaQotICBmaQotICBpZiBbICRkaXIgIT0gLiBdICAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICB0YXJnZXRfY29uZmlnZGlycz1gZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBzZWQgLWUgInMvICR7ZGlyfSAvIC8iYAotICAgIGlmIFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUgXSBcCi0JfHwgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZS5pbiBdOyB0aGVuCi0gICAgICBpZiBlY2hvICIgJHtza2lwZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQl0cnVlCi0gICAgICBlbHNlCi0Jbm90c3VwcD0iJG5vdHN1cHAgJGRpciIKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWRvbmUKLQotIyBTb21ldGltZXMgdGhlIHRvb2xzIGFyZSBkaXN0cmlidXRlZCB3aXRoIGxpYmliZXJ0eSBidXQgd2l0aCBubyBvdGhlcgotIyBsaWJyYXJpZXMuICBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gYnVpbGQgdGFyZ2V0LWxpYmliZXJ0eS4KLWlmIFsgLW4gIiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IiBdOyB0aGVuCi0gIG90aGVycz0KLSAgZm9yIGkgaW4gYGVjaG8gJHt0YXJnZXRfY29uZmlnZGlyc30gfCBzZWQgLWUgcy90YXJnZXQtLy9nYCA7IGRvCi0gICAgaWYgWyAiJGkiICE9ICJsaWJpYmVydHkiIF07IHRoZW4KLSAgICAgIGlmIFsgLXIgJHNyY2Rpci8kaS9jb25maWd1cmUgXSB8fCBbIC1yICRzcmNkaXIvJGkvY29uZmlndXJlLmluIF07IHRoZW4KLQlvdGhlcnM9eWVzOwotCWJyZWFrOwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIGlmIFsgLXogIiR7b3RoZXJzfSIgXTsgdGhlbgotICAgIHRhcmdldF9jb25maWdkaXJzPQotICBmaQotZmkKLQotIyBEZWNvbmZpZ3VyZSBhbGwgc3ViZGlyZWN0b3JpZXMsIGluIGNhc2Ugd2UgYXJlIGNoYW5naW5nIHRoZQotIyBjb25maWd1cmF0aW9uIGZyb20gb25lIHdoZXJlIGEgc3ViZGlyZWN0b3J5IGlzIHN1cHBvcnRlZCB0byBvbmUgd2hlcmUgaXQKLSMgaXMgbm90LgotaWYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF0gJiYgWyAtbiAiJHtjb25maWdkaXJzfSIgXTsgdGhlbgotICBmb3IgaSBpbiBgZWNobyAke2NvbmZpZ2RpcnN9IHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AgOyBkbwotICAgIHJtIC1mICRpL01ha2VmaWxlCi0gIGRvbmUKLWZpCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke3RhcmdldF9jb25maWdkaXJzfSIgXTsgdGhlbgotICBmb3IgaSBpbiBgZWNobyAke3RhcmdldF9jb25maWdkaXJzfSB8IHNlZCAtZSBzL3RhcmdldC0vL2dgIDsgZG8KLSAgICBybSAtZiAke3RhcmdldF9zdWJkaXJ9LyRpL01ha2VmaWxlCi0gIGRvbmUKLWZpCi0KLSMgUHJvZHVjZSBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIHN1YmRpcnMgd2UgY2FuJ3QgY29uZmlndXJlLgotIyBUaGlzIGlzbid0IGVzcGVjaWFsbHkgaW50ZXJlc3RpbmcgaW4gdGhlIEN5Z251cyB0cmVlLCBidXQgaW4gdGhlIGluZGl2aWR1YWwKLSMgRlNGIHJlbGVhc2VzLCBpdCdzIGltcG9ydGFudCB0byBsZXQgcGVvcGxlIGtub3cgd2hlbiB0aGVpciBtYWNoaW5lIGlzbid0Ci0jIHN1cHBvcnRlZCBieSB0aGUgb25lIG9yIHR3byBwcm9ncmFtcyBpbiBhIHBhY2thZ2UuCi0KLWlmIFsgLW4gIiR7bm90c3VwcH0iIF0gJiYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF07IHRoZW4KLSAgIyBJZiAkYXBwZGlycyBpcyBub24tZW1wdHksIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSBkaXJlY3RvcmllcyBtdXN0IHN0aWxsCi0gICMgYmUgY29uZmlndXJlZCwgb3Igd2UgZXJyb3Igb3V0LiAgKEUuZy4sIGlmIHRoZSBnYXMgcmVsZWFzZSBzdXBwb3J0cyBhCi0gICMgc3BlY2lmaWVkIHRhcmdldCBpbiBzb21lIHN1YmRpcnMgYnV0IG5vdCB0aGUgZ2FzIHN1YmRpciwgd2Ugc2hvdWxkbid0Ci0gICMgcHJldGVuZCB0aGF0IGFsbCBpcyB3ZWxsLikKLSAgaWYgWyAtbiAiJGFwcGRpcnMiIF07IHRoZW4KLSAgICBmb3IgZGlyIGluICRhcHBkaXJzIDsgZG8KLSAgICAgIGlmIFsgLXIgJGRpci9NYWtlZmlsZS5pbiBdOyB0aGVuCi0JaWYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIGFwcGRpcnM9IiIKLQkgIGJyZWFrCi0JZmkKLQlpZiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIGFwcGRpcnM9IiIKLQkgIGJyZWFrCi0JZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIGlmIFsgLW4gIiRhcHBkaXJzIiBdOyB0aGVuCi0gICAgICBlY2hvICIqKiogVGhpcyBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwYWNrYWdlLiIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZmkKLSAgIyBPa2F5LCBzb21lIGFwcGxpY2F0aW9uIHdpbGwgYnVpbGQsIG9yIHdlIGRvbid0IGNhcmUgdG8gY2hlY2suICBTdGlsbAotICAjIG5vdGlmeSBvZiBzdWJkaXJzIG5vdCBnZXR0aW5nIGJ1aWx0LgotICBlY2hvICIqKiogVGhpcyBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGZvbGxvd2luZyBzdWJkaXJlY3RvcmllczoiIDE+JjIKLSAgZWNobyAiICAgICR7bm90c3VwcH0iIDE+JjIKLSAgZWNobyAiICAgIChBbnkgb3RoZXIgZGlyZWN0b3JpZXMgc2hvdWxkIHN0aWxsIHdvcmsgZmluZS4pIiAxPiYyCi1maQotCi0jIFNldCB3aXRoX2dudV9hcyBhbmQgd2l0aF9nbnVfbGQgYXMgYXBwcm9wcmlhdGUuCi0jCi0jIFRoaXMgaXMgZG9uZSBieSBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5Ci0jIGlzIGF2YWlsYWJsZSwgYW5kIGJ5IGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zCi0jIGhhdmUgcmVxdWVzdGVkIHRoYXQgdGhpcyBtYWdpYyBub3QgaGFwcGVuLgotIyAKLSMgVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFsd2F5cyBvdmVycmlkZSB0aGUgZXhwbGljaXQgc2V0dGluZ3MgaW4gCi0jIGNvbmZpZ3VyZS5pbiwgYW5kIHRoZSBzZXR0aW5ncyBpbiBjb25maWd1cmUuaW4gb3ZlcnJpZGUgdGhpcyBtYWdpYy4KLSMKLSMgSWYgdGhlIGRlZmF1bHQgZm9yIGEgdG9vbGNoYWluIGlzIHRvIHVzZSBHTlUgYXMgYW5kIGxkLCBhbmQgeW91IGRvbid0IAotIyB3YW50IHRvIGRvIHRoYXQsIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIC0td2l0aG91dC1nbnUtYXMgYW5kCi0jIC0td2l0aG91dC1nbnUtbGQgb3B0aW9ucyBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLWlmIFsgeCR7dXNlX2dudV9hc30gPSB4IF0gOyB0aGVuCi0gIGlmIFsgeCR7d2l0aF9nbnVfYXN9ICE9IHhubyBdICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtnYXNkaXJ9ICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS8ke2dhc2Rpcn0gXSA7IHRoZW4KLSAgICB3aXRoX2dudV9hcz15ZXMKLSAgICB3aXRob3B0aW9ucz0iJHdpdGhvcHRpb25zIC0td2l0aC1nbnUtYXMiCi0gIGZpCi1maQotCi1pZiBbIHgke3VzZV9nbnVfbGR9ID0geCBdIDsgdGhlbgotICBpZiBbIHgke3dpdGhfZ251X2xkfSAhPSB4bm8gXSAmJiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiIGxkICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS9sZCBdIDsgdGhlbgotICAgIHdpdGhfZ251X2xkPXllcwotICAgIHdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLWdudS1sZCIKLSAgZmkKLWZpCi0KLSMgSWYgdXNpbmcgbmV3bGliLCBhZGQgLS13aXRoLW5ld2xpYiB0byB0aGUgd2l0aG9wdGlvbnMgc28gdGhhdCBnY2MvY29uZmlndXJlCi0jIGNhbiBkZXRlY3QgdGhpcyBjYXNlLgotCi1pZiBbIHgke3dpdGhfbmV3bGlifSAhPSB4bm8gXSAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiB0YXJnZXQtbmV3bGliICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS9uZXdsaWIgXSA7IHRoZW4KLSAgd2l0aF9uZXdsaWI9eWVzCi0gIHdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLW5ld2xpYiIKLWZpCi0KLWlmIFsgeCR7c2hhcmVkfSA9IHh5ZXMgXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gICAgaHBwYSopCi0gICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXBhcGljIgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQteDg2cGljIgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qKQotICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1wcGNwaWMiCi0gICAgICA7OwotICAgIGFscGhhKi0qLWxpbnV4KikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtZWxmYWxwaGFwaWMiCi0gICAgICA7OwotICAgICopCi0gICAgICBpZiB0ZXN0IC1mICR7c3JjZGlyfS9jb25maWcvbXQtJHt0YXJnZXRfY3B1fXBpYzsgdGhlbgotICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LSR7dGFyZ2V0X2NwdX1waWMiCi0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotZmkKLQotcm0gLWYgbXQtZnJhZwotaWYgWyAtbiAiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iIF0gOyB0aGVuCi0gIGZvciBmIGluICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9Ci0gIGRvCi0gICAgY2F0ICR7c3JjZGlyfS8kZiA+PiBtdC1mcmFnCi0gIGRvbmUKLSAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9bXQtZnJhZwotZmkKLQotIyBwb3N0LXRhcmdldDoKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgaXMgYWJsZSB0byBnZW5lcmF0ZSBhbiBleGVjdXRhYmxlLiAgSWYgaXQKLSMgY2FuJ3QsIHdlIGFyZSBwcm9iYWJseSBpbiB0cm91YmxlLiAgV2UgZG9uJ3QgY2FyZSB3aGV0aGVyIHdlIGNhbiBydW4gdGhlCi0jIGV4ZWN1dGFibGUtLXdlIG1pZ2h0IGJlIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXItLXdlIG9ubHkgY2FyZSB3aGV0aGVyIGl0Ci0jIGNhbiBiZSBjcmVhdGVkLiAgQXQgdGhpcyBwb2ludCB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0IGhhcyBzZXQgQ0MuCi1lY2hvICJpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9IiA+IGNvbmZ0ZXN0LmMKLSR7Q0N9IC1vIGNvbmZ0ZXN0ICR7Q0ZMQUdTfSAke0NQUEZMQUdTfSAke0xERkxBR1N9IGNvbmZ0ZXN0LmMKLWlmIFsgJD8gPSAwIF0gJiYgWyAtcyBjb25mdGVzdCAtbyAtcyBjb25mdGVzdC5leGUgXTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gMT4mMiAiKioqIFRoZSBjb21tYW5kICcke0NDfSAtbyBjb25mdGVzdCAke0NGTEFHU30gJHtDUFBGTEFHU30gJHtMREZMQUdTfSBjb25mdGVzdC5jJyBmYWlsZWQuIgotICBlY2hvIDE+JjIgIioqKiBZb3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIENDIHRvIGEgd29ya2luZyBjb21waWxlci4iCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBleGl0IDEKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotIyBUaGUgU29sYXJpcyAvdXNyL3VjYi9jYyBjb21waWxlciBkb2VzIG5vdCBhcHBlYXIgdG8gd29yay4KLWNhc2UgIiR7aG9zdH0iIGluCi0gIHNwYXJjLXN1bi1zb2xhcmlzMiopCi0gICAgICBDQ0JBU0U9ImBlY2hvICR7Q0MtY2N9IHwgc2VkICdzLyAuKiQvLydgIgotICAgICAgaWYgWyAiYC91c3IvYmluL3doaWNoICRDQ0JBU0VgIiA9ICIvdXNyL3VjYi9jYyIgXSA7IHRoZW4KLSAgICAgICAgICBjb3VsZF91c2U9Ci0gICAgICAgICAgWyAtZCAvb3B0L1NVTldzcHJvL2JpbiBdICYmIGNvdWxkX3VzZT0iL29wdC9TVU5Xc3Byby9iaW4iCi0gICAgICAgICAgaWYgWyAtZCAvb3B0L2N5Z251cy9iaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgaWYgWyAiJGNvdWxkX3VzZSIgPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgY291bGRfdXNlPSIvb3B0L2N5Z251cy9iaW4iCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGNvdWxkX3VzZT0iJGNvdWxkX3VzZSBvciAvb3B0L2N5Z251cy9iaW4iCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgZmkKLSAgICAgICAgaWYgWyAiJGNvdWxkX3VzZSIgPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgZWNobyAiV2FybmluZzogY29tcGlsYXRpb24gbWF5IGZhaWwgYmVjYXVzZSB5b3UncmUgdXNpbmciCi0gICAgICAgICAgICBlY2hvICIvdXNyL3VjYi9jYy4gIFlvdSBzaG91bGQgY2hhbmdlIHlvdXIgUEFUSCBvciBDQyAiCi0gICAgICAgICAgICBlY2hvICJ2YXJpYWJsZSBhbmQgcmVydW4gY29uZmlndXJlLiIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAiV2FybmluZzogY29tcGlsYXRpb24gbWF5IGZhaWwgYmVjYXVzZSB5b3UncmUgdXNpbmciCi0gICAgICAgICAgICBlY2hvICIvdXNyL3VjYi9jYywgd2hlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgQyBjb21waWxlciBmcm9tIgotICAgICAgICAgICAgZWNobyAiJGNvdWxkX3VzZS4gIFlvdSBzaG91bGQgY2hhbmdlIHlvdXIiCi0gICAgICAgICAgICBlY2hvICJQQVRIIG9yIENDIHZhcmlhYmxlIGFuZCByZXJ1biBjb25maWd1cmUuIgotICAgICAgICBmaQotICAgICAgZmkKLSAgOzsKLWVzYWMKLQotIyBJZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHNldCwgd2UgbXVzdCBzZXQgTERfTElCUkFSWV9QQVRIIHNvIHRoYXQgdGhlCi0jIGJpbnV0aWxzIHRvb2xzIHdpbGwgZmluZCBsaWJiZmQuc28uCi1pZiBbICIke3NoYXJlZH0iID0gInllcyIgXTsgdGhlbgotICBzZWQgLWUgJ3MvXlNFVF9MSUJfUEFUSFsgCV0qPS4qJC9TRVRfTElCX1BBVEggPSAkKFJFQUxMWV9TRVRfTElCX1BBVEgpLycgXAotICAgICAgTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KLSAgcm0gLWYgTWFrZWZpbGUKLSAgbXYgLWYgTWFrZWZpbGUudGVtIE1ha2VmaWxlCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLWhwdXgqKQotICAgIHNlZCAtZSAncy9eUlBBVEhfRU5WVkFSWyAJXSo9LiokL1JQQVRIX0VOVlZBUiA9IFNITElCX1BBVEgvJyBcCi0JTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KLSAgICBybSAtZiBNYWtlZmlsZQotICAgIG12IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLSMgUmVjb3JkIHRhcmdldF9jb25maWdkaXJzIGFuZCB0aGUgY29uZmlndXJlIGFyZ3VtZW50cyBpbiBNYWtlZmlsZS4KLXRhcmdldF9jb25maWdkaXJzPWBlY2hvICIke3RhcmdldF9jb25maWdkaXJzfSIgfCBzZWQgLWUgJ3MvdGFyZ2V0LS8vZydgCi10YXJnYXJncz1gZWNobyAiJHthcmd1bWVudHN9IiB8IFwKLQlzZWQgLWUgJ3MvLS1ub1teIAldKi8vJyBcCi0JICAgIC1lICdzLy0tY2FjaGVbYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0taG9bYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0tYnVbYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0tdGFbYS16LV0qPVteIAldKi8vJ2AKLQotIyBQYXNzaW5nIGEgLS13aXRoLWNyb3NzLWhvc3QgYXJndW1lbnQgbGV0cyB0aGUgdGFyZ2V0IGxpYnJhcmllcyBrbm93Ci0jIHdoZXRoZXIgdGhleSBhcmUgYmVpbmcgYnVpbHQgd2l0aCBhIGNyb3NzLWNvbXBpbGVyIG9yIGJlaW5nIGJ1aWx0Ci0jIG5hdGl2ZS4gIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2Ugb3RoZXIgbWVjaGFuaXNtcyB0byBtYWtlIHRoZQotIyBzb3J0cyBvZiBkZWNpc2lvbnMgdGhleSB3YW50IHRvIG1ha2Ugb24gdGhpcyBiYXNpcy4gIFBsZWFzZSBjb25zaWRlcgotIyB0aGlzIG9wdGlvbiB0byBiZSBkZXByZWNhdGVkLiAgRklYTUUuCi1pZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSA9IHh5ZXMgXTsgdGhlbgotICB0YXJnYXJncz0iLS13aXRoLWNyb3NzLWhvc3Q9JHtob3N0X2FsaWFzfSAke3RhcmdhcmdzfSIKLWZpCi0KLSMgRGVmYXVsdCB0byAtLWVuYWJsZS1tdWx0aWxpYi4KLWlmIFsgeCR7ZW5hYmxlX211bHRpbGlifSA9IHggXTsgdGhlbgotICB0YXJnYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHt0YXJnYXJnc30iCi1maQotCi0jIFBhc3MgLS13aXRoLW5ld2xpYiBpZiBhcHByb3ByaWF0ZS4gIE5vdGUgdGhhdCB0YXJnZXRfY29uZmlnZGlycyBoYXMKLSMgY2hhbmdlZCBmcm9tIHRoZSBlYXJsaWVyIHNldHRpbmcgb2Ygd2l0aF9uZXdsaWIuCi1pZiBbIHgke3dpdGhfbmV3bGlifSAhPSB4bm8gXSAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiBuZXdsaWIgIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9L25ld2xpYiBdIDsgdGhlbgotICB0YXJnYXJncz0iLS13aXRoLW5ld2xpYiAke3RhcmdhcmdzfSIKLWZpCi0KLSMgcHJvdmlkZSBhIHByb3BlciBneHhfaW5jbHVkZV9kaXIuCi0jIE5vdGUsIGlmIHlvdSBjaGFuZ2UgdGhlIGRlZmF1bHQsIG1ha2Ugc3VyZSB0byBmaXggYm90aCBoZXJlIGFuZCBpbgotIyB0aGUgZ2NjLCBsaWJpbywgbGlic3RkYysrIGFuZCBsaWJnKysgc3ViZGlyZWN0b3JpZXMuCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWd4eC1pbmNsdWRlLWRpciBvciAtLXdpdGhvdXQtZ3h4LWluY2x1ZGUtZGlyIHdhcyBnaXZlbi4KLWd4eF9pbmNsdWRlX2Rpcj0KLWlmIHRlc3QgLW4gIiR7d2l0aF9neHhfaW5jbHVkZV9kaXJ9IjsgdGhlbgotICBjYXNlICIke3dpdGhfZ3h4X2luY2x1ZGVfZGlyfSIgaW4KLSAgICB5ZXMgKQotICAgICAgZWNobyAiY29uZmlndXJlLmluOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZ2l2ZW4gZm9yIGcrKyBpbmNsdWRlIGRpcmVjdG9yeSIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIG5vICkKLSAgICAgIDs7Ci0gICAgKiApCi0gICAgICBneHhfaW5jbHVkZV9kaXI9JHt3aXRoX2d4eF9pbmNsdWRlX2Rpcn0KLSAgICAgIDs7Ci0gIGVzYWMKLWZpCi1pZiB0ZXN0IHgke2d4eF9pbmNsdWRlX2Rpcn0gPSB4OyB0aGVuCi0gIGlmIHRlc3QgeCR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSA9IHh5ZXM7IHRoZW4KLSAgICBneHhfaW5jbHVkZV9kaXI9JyR7bGlic3ViZGlyfS9pbmNsdWRlL2crKycKLSAgZWxzZQotICAgIC4gJHt0b3BzcmNkaXJ9L2NvbmZpZy5pZgotICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtwcmVmaXh9L2luY2x1ZGUvZysrJy0ke2xpYnN0ZGN4eF9pbnRlcmZhY2V9Ci0gIGZpCi1lbHNlCi0gIGd4eF9pbmNsdWRlX2Rpcj0ke2d4eF9pbmNsdWRlX2Rpcn0KLWZpCi0KLXRhcmdhcmdzPSItLWhvc3Q9JHt0YXJnZXRfYWxpYXN9IC0tYnVpbGQ9JHtidWlsZF9hbGlhc30gJHt0YXJnYXJnc30iCi1zZWQgLWUgInM6XlRBUkdFVF9DT05GSUdESVJTWyAJXSo9LiokOlRBUkdFVF9DT05GSUdESVJTID0gJHt0YXJnZXRfY29uZmlnZGlyc306IiBcCi0gICAgLWUgInMlXkNPTkZJR19BUkdVTUVOVFNbIAldKj0uKiQlQ09ORklHX0FSR1VNRU5UUyA9ICR7dGFyZ2FyZ3N9JSIgXAotICAgIC1lICJzJV5UQVJHRVRfU1VCRElSWyAJXSo9LiokJVRBUkdFVF9TVUJESVIgPSAke3RhcmdldF9zdWJkaXJ9JSIgXAotICAgIC1lICJzJV5neHhfaW5jbHVkZV9kaXJbIAldKj0uKiQlZ3h4X2luY2x1ZGVfZGlyPSR7Z3h4X2luY2x1ZGVfZGlyfSUiIFwKLSAgICAgICBNYWtlZmlsZSA+IE1ha2VmaWxlLnRlbQotcm0gLWYgTWFrZWZpbGUKLW12IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQotCi0jCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgZmlsbC1jb2x1bW46IDEzMQotIyBFbmQ6Ci0jCmRpZmYgLS1naXQgYS9ldGMvQ2hhbmdlTG9nIGIvZXRjL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1M2EzZS4uMDAwMDAwMAotLS0gYS9ldGMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLTE5OTktMDQtMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogYWRkLWxvZy5lbCwgYWRkLWxvZy52aTogTmV3IGZpbGVzLgotCi1XZWQgSmFuIDIwIDAxOjMzOjUwIDE5OTkgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjb21wLXRvb2xzLXZlcmlmeTogUmVtb3ZlIHNvbWUgY2hlY2tzIHRoYXQgYXJlIG5vIGxvbmdlciB2YWxpZC4KLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0ZG9jL2ZyMzAudGV4aTogTmV3IGRvY3VtZW50LgotCQotVGh1IE9jdCAgMSAyMToxNTo1OSAxOTk4ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogY29tcC10b29scy1maXgsIGNyb3NzLXRvb2xzLWZpeDogUmVwbGFjZSAvdXNyL2luY2x1ZGUKLQl3aXRoICR7RklYSU5DRElSfS4KLQotVHVlIEF1ZyAxMSAxOToyMjoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtYWtlLXJlbC1zeW0tdHJlZSAodmVyc2lvbik6IFVwZGF0ZSBjYWxjdWxhdGlvbi4KLQotRnJpIEp1biAxMiAyMTozNDowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBWYXJpb3VzIGFkZGl0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChURVhJMkhUTUwsIERWSVBTKTogTmV3IHZhcmlhYmxlcy4KLQkoc3RhbmRhcmRzLnBzKTogTmV3IHRhcmdldC4KLQkoY29uZmlndXJlLmR2aSk6IENvcHkgLnRpbiBmaWxlcyBpbiBhcyB3ZWxsLgotCShjb25maWd1cmUucHMsIGNvbmZpZ3VyZS5odG1sKTogTmV3IHRhcmdldHMuCi0JKGNsZWFuKTogUmVtb3ZlIGNvbmZpZ2Rldi5qcGcgYW5kIGNvbmZpZ2J1aWxkLmpwZy4KLQkqIGNvbmZpZ2Rldi5maWc6IE5ldyBmaWxlLgotCSogY29uZmlnZGV2LmVpbjogTmV3IGZpbGUgKEVQUyB2ZXJzaW9uIG9mIGNvbmZpZ2Rldi5maWcpLgotCSogY29uZmlnZGV2LmppbjogTmV3IGZpbGUgKEpQRUcgdmVyc2lvbiBvZiBjb25maWdkZXYuZmlnKS4KLQkqIGNvbmZpZ2J1aWxkLmZpZzogTmV3IGZpbGUuCi0JKiBjb25maWdidWlsZC5laW46IE5ldyBmaWxlIChFUFMgdmVyc2lvbiBvZiBjb25maWdidWlsZC5maWcpLgotCSogY29uZmlnYnVpbGQuamluOiBOZXcgZmlsZSAoSlBFRyB2ZXJzaW9uIG9mIGNvbmZpZ2J1aWxkLmZpZykuCi0KLVdlZCBKdW4gMTAgMTQ6NDE6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGV4aTogTmV3IGZpbGUuCi0JKiBjb25maWdkZXYudGluOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2J1aWxkLnRpbjogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoTUFLRUlORk8pOiBVc2UgbWFrZWluZm8gZnJvbSB0ZXhpbmZvIGRpcmVjdG9yeSBpZgotCWl0IGV4aXN0cy4KLQkoVEVYSTJEVkkpOiBMaWtld2lzZSBmb3IgdGV4aTJkdmkuCi0JKElORk9GSUxFUyk6IEFkZCBjb25maWd1cmUuaW5mby4KLQkoRFZJRklMRVMpOiBBZGQgY29uZmlndXJlLmR2aS4KLQkoaW5mbyk6IE9ubHkgYnVpbGQgaW5mbyBmaWxlcyBpZiB0aGUgc291cmNlIGZpbGVzIGV4aXN0LgotCShpbnN0YWxsLWluZm8pOiBPbmx5IGluc3RhbGwgaW5mbyBmaWxlcyBpZiB0aGV5IGV4aXN0LgotCShkdmkpOiBPbmx5IGJ1aWxkIERWSSBmaWxlcyBpZiB0aGUgc291cmNlcyBmaWxlcyBleGlzdC4KLQkoY29uZmlndXJlLmluZm8pOiBOZXcgdGFyZ2V0LgotCShjb25maWd1cmUuZHZpKTogTmV3IHRhcmdldC4KLQkoY2xlYW4pOiBSZW1vdmUgY29uZmlnZGV2IGFuZCBjb25maWdidWlsZCBkZXJpdmVkIGZpbGVzLgotCi0JUmVtb3ZlIG9ic29sZXRlIGRvY3VtZW50YXRpb24uCi0JKiBpbnRyby50ZXhpOiBSZW1vdmUuCi0JKiBpbnN0YWxsLnRleGk6IFJlbW92ZS4KLQkqIGNvbmZpZy1uYW1lcy50ZXhpOiBSZW1vdmUuCi0JKiBzY3JlZW4xLmVwczogUmVtb3ZlLgotCSogc2NyZWVuMS5vYmo6IFJlbW92ZS4KLQkqIHNjcmVlbjIuZXBzOiBSZW1vdmUuCi0JKiBzY3JlZW4yLm9iajogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBhYm92ZS4KLQotVGh1IE1heSAyMSAxNDozNDo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0YXJnZXRkb2MvYXJtLWludGVyd29yay50ZXhpOiBBZGQgbm90ZSBhYm91dCBpZ25vcmluZyBsaW5rZXIKLQl3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB1c2luZyAtLXN1cHBvcnQtb2xkLWNvZGUuCi0KLU1vbiBNYXkgMTggMTQ6Mjc6MzcgMTk5OCAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4sIGNvbXAtdG9vbHMtZml4LCBjb21wLXRvb2xzLXZlcmlmeSwgY3Jvc3MtdG9vbHMtZml4OgotCVVzZSAkR0NDdm4gcmF0aGVyIHRoYW4gc3Vic3RpdHV0ZSBldmVyeXdoZXJlLgotCi1UaHUgTWF5IDE0IDE0OjQzOjEwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IERvY3VtZW50IGRsbHRvb2wgc3VwcG9ydCBvZgotCWludGVyd29ya2luZy4gCi0KLVRodSBNYXkgIDcgMTY6NDk6MzggMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIFRDTF9MSUJSQVJZLCBUS19MSUJSQVJZLAotCWFuZCBHREJUS19GSUxFTkFNRS4KLQotV2VkIEFwciAgMSAxNzoxMTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0YXJnZXRkb2MvYXJtLWludGVyd29yay50ZXhpOiBEb2N1bWVudCBBUk0vdGh1bWIgaW50ZXJ3b3JraW5nLiAKLQotVHVlIE1hciAzMSAxNToyODoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb25zLgotCSogTWFrZWZpbGUuaW4gKHN0YW5kYXJkcy5pbmZvKTogRGVwZW5kIHVwb24gbWFrZS1zdGQudGV4aS4KLQotVHVlIE1hciAyNCAxNjoxMzoyNiAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEgdG8gZml4IHNoZWxsIGlzc3VlcwotCWZvciBOVCBuYXRpdmUgYnVpbGRzLiAKLQotTW9uIE1hciAgOSAxNjo0MTowNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtYWtlLXJlbC1zeW0tdHJlZSAoYmlucHJvZ3MpOiBBZGQgb2JqY29weS4KLQotVHVlIEZlYiAyNCAxODoxMTo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtYWtlLXJlbC1zeW0tdHJlZTogYXMubmV3IC0+IGFzLW5ldywgbGQubmV3IC0+IGxkLW5ldwotCW5tLm5ldyAtPiBubS1uZXcuICBNYWtlIHN5bWxpbmtzIHRvIGNydCouby4KLQotRnJpIE5vdiAyMSAxMjo1NDo1OCAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCAtLW5vLXNwbGl0IGFyZ3VtZW50IHRvIGF2b2lkIGNyZWF0aW5nIGZpbGVzCi0Jd2l0aCBuYW1lcyBsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzLgotCi1UaHUgU2VwIDI1IDEzOjEzOjExIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwZXJuLmN5Z251cy5jb20pCi0KLQkqIGludHJvLnRleGk6IEFkZCBjbG9zaW5nIGlmc2V0LgotCi1Nb24gU2VwICAxIDEwOjMxOjMyIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBNb3ZlIHNldHRpbmcgSE9TVCBhbmQgVEFSR0VUIHRvIHRoZSBiZWdpbm5pbmcKLQlvZiB0aGUgZmlsZSBmb3IgZWRpdGluZyBjb252ZW5pZW5jZS4KLQotTW9uIFNlcCAgMSAxMDoyODozNyAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbi46IE1vcmUgZnJpZW5kbHkgb3B0aW9ucy9tZXNzYWdlcyB3aGVuIGV4dHJhY3RpbmcKLQlmcm9tIGEgZmlsZSBpbnN0ZWFkIG9mIGEgdGFwZSBkZXZpY2UuCi0KLVR1ZSBKdW4gMTcgMTU6NTA6MjMgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IEFkZCAvdXNyL2JzZCB0byBQQVRIIGZvciBJcml4IChob21lIG9mIGNvbXByZXNzKQotCi1UaHUgSnVuIDEyIDEzOjQ3OjAwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0gICAgICAgICogSW5zdGFsbC5pbiAoc2hvd19leGVjX3ByZWZpeF9tc2cpOiBmaXggcXVvdGluZwotCi1XZWQgSnVuICA0IDE1OjMxOjQzIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIHJlYnVpbGRpbmcudGV4aTogUmVtb3ZlZC4KLQotU2F0IE1heSAyNCAxODowMjoyMCAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogY3Jvc3MtdG9vbHMtZml4OiAgUmVtb3ZlIGhvc3QgY2hlY2sgc2luY2UgaXQgZG9lc24ndCBtYXR0ZXIKLQlmb3IgdGhpcyBjYXNlLgotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogY2xlYW4gdXAgbW9yZSB1bnVzZWQgaG9zdHMuCi0JKiBJbnN0YWxsLmluLCBjcm9zcy10b29scy1maXgsIGNvbXAtdG9vbHMtZml4LCBjb21wLXRvb2xzLXZlcmlmeToKLQlIYWNrIGZvciBob3N0IGNoZWNrIHRvIG5vdCB3YXJuIHRoZSB1c2VyIGZvciBjZXJ0YWluIGNhc2VzLgotCi1GcmkgTWF5IDIzIDIzOjQ2OjEwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiBSZW1vdmUgYSBsb3Qgb2YgdW51c2VkIGNvZGUKLQkqIEluc3RhbGwuaW46IFJlbW92ZSByZWZlcmVuY2UgdG8gVEFQRWRmbHQsIHVzZSB2YXJpYWJsZXMgaW5zdGVhZCBvZgotCXN0cmluZyBzdWJzdGl0dXRpb24gd2hlbiBhYmxlLgotCi1GcmkgQXByIDExIDE3OjI1OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgZmlsZSBuYW1lZCBpbiBBQ19JTklUIHRvIE1ha2VmaWxlLmluLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByIDExIDE4OjEyOjQyIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IEJhY2sgb3V0IGNoYW5nZSB0byBJTlNUQUxMSE9TVCB0bwotCWNhbGwgYWxsIElSSVggc3lzdGVtcyAibWlwcy1zZ2ktaXJpeDQiCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBjb25maWd1cmUudGV4aSBhbmQgY2ZnLXBhcGVyLnRleGkuCi0KLVRodSBBcHIgMTAgMjM6MjY6NDUgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogc3JjdHJlZS50ZXhpLCBlbWFjcy1yZWxub3Rlcy50ZXhpLCBjZmctcGFwZXIudGV4aTogUmVtb3ZlLgotCSogSW5zdGFsbC5pbjogUmVtb3ZlIFVsdHJpeC1zcGVjaWZpYyBoYWNrcy4KLQlVcGRhdGUgQ3lnbnVzIHBob25lIG51bWJlcnMuCi0JKGd1ZXNzX3N5c3RlbSk6IFJlbW92ZSBzb21lIG9sZCBzeXN0ZW1zIChVbHRyaXgsIE9TRjEgdjEgJiAyLAotCW02OGstSFBVWCwgbTY4ayBTdW5PUywgZXRjLikKLQkoc2hvd19nbnVfcm9vdF9tc2cpOiBSZW1vdmUuCi0JUmVtb3ZlZCBhbGwgdGhlIHJlbW92ZSBvcHRpb24gY29kZS4KLQotVGh1IEFwciAxMCAyMzoyMzozMyAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBjb25maWd1cmUubWFuLCBjb25maWd1cmUudGV4aTogUmVtb3RlLgotCi1Nb24gQXByICA3IDE4OjE1OjAwIDE5OTcgIEJyZW5kYW4gS2Vob2UgPGJyZW5kYW5AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIEZpeCB0aGUgdmVyc2lvbiBzdHJpbmcgZm9yIE9TRjEgNC4wIHRvIHJlY29nbml6ZSBlaXRoZXIKLSAgICAgICAgVjQuKiBvciBYNC4qCi0KLU1vbiBBcHIgIDcgMTU6MzQ6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFuZGFyZHMudGV4aSwgbWFrZS1zdGRzLnRleGk6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9ucy4KLQotVHVlIE5vdiAxOSAxNTozNjoxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtYWtlLXJlbC1zeW0tdHJlZTogTmV3IGZpbGUuCi0KLVdlZCBPY3QgMjMgMDA6MzQ6MDcgMTk5NiAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIExvdHMgb2YgcGF0Y2hlcyBmcm9tIHByb2dyZXNzaXZlLi4uCi0gCSogSW5zdGFsbC5pbjogcmVzdG9yZSBERE9QVFMgZm9yIEFJWCA0LngKLSAJKiBJbnN0YWxsLmluLCBzdWJzdC1zdHJpbmdzOiBhZGQgY2FzZSBmb3IgREcgQXZpaW9uCi0gCSogc3Vic3Qtc3RyaW5nczogZml4IHR5cG8gaW4gSU5TVEFMTGRpciB2YXIgc2V0dGluZwotIAkqIGNvbXAtdG9vbHMtdmVyaWZ5OiBzZXQgU0hMSUJfUEFUSCBmb3Igc2hhcmVkIGxpYnMKLSAJKiBJbnN0YWxsLmluLCBzdWJzdC1zdHJpbmdzOiAgYWRkIGNhc2UgZm9yIHNvbGFyaXMyLjUKLSAJKiBJbnN0YWxsLmluOiBmaXggcmVncmVzc2lvbiBmb3IgaHBwYTEuMSBjaGVjawotIAkqIGNvbXAtdG9vbHMtZml4OiBzZXQgTERfTElCUkFSWV9QQVRICi0gCSogY29tcC10b29scy1maXg6IElmIGZpeGluY2x1ZGVzIGZpeGVzIC91c3IvaW5jbHVkZS9saW1pdHMuaCwKLSAJaW5zdGFsbCBpdCBhcyBzeXNsaW1pdHMuaC4KLQotV2VkIE9jdCAxNiAxOToyMDo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IFRyZWF0IHBvd2VycGMtaWJtLWFpeDQuMSB0aGUgc2FtZSBhcwotCXJzNjAwMC1pYm0tYWl4NC4xLCBzaW5jZSB0aGUgY29tcGlsZXIgbm93IHVzZXMgY29tbW9uIG1vZGUgYnkKLQlkZWZhdWx0LgotCi1XZWQgT2N0ICAyIDE1OjM5OjA3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZS4KLQotV2VkIE9jdCAgMiAxNDozMzo1OCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBjb25maWd1cmUuaW46IFN3aXRjaCB0byBhdXRvY29uZiBjb25maWd1cmUuaW4uCi0JKiBjb25maWd1cmU6IE5ldy4KLQkqIE1ha2VmaWxlLmluOiBVc2UgYXV0b2NvbmYtc3Vic3RpdHV0ZWQgdmFsdWVzLgotCi1UdWUgSnVuIDI1IDE4OjU2OjA4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogQ2hhbmdlZCB0byAkKHByZWZpeCkvc2hhcmUuCi0KLUZyaSBNYXIgMjkgMTE6Mzg6MDEgMTk5NiAgSi5ULiBDb25rbGluICAoanRjQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLm1hbjogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgotCi1XZWQgRGVjICA2IDE1OjQwOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbXAtdG9vbHMtZml4IChmaXhpbmNsdWRlcyk6IERlZmluZSBGSVhQUk9UT19ERUZJTkVTIGZyb20KLQkuLi4vaW5zdGFsbC10b29scy9maXhwcm90by1kZWZpbmVzLgotCi1TdW4gTm92IDEyIDE5OjMxOjI3IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb21wLXRvb2xzLXZlcmlmeSAodmVyaWZ5X2N4eF9pbml0aWFsaXplcnMpOiBkZWxldGUgYXJndiwKLQlhcmdjIGRlY2xhcmF0aW9ucywgYWRkIC1zdGF0aWMgdG8gY29tcGlsZSBsaW5lLgotCSh2ZXJpZnlfY3h4X2hlbGxvX3dvcmxkKTogZGVsZXRlIGFyZ3YsIGFyZ2MgZGVjbGFyYXRpb25zLCBhZGQKLQktc3RhdGljIHRvIGNvbXBpbGUgbGluZS4KLQotV2VkIFNlcCAyMCAxMzoyMTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uCi0KLU1vbiBBdWcgMjggMTc6MjU6NDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4gKFBBVEgpOiAgYWRkIC91c3IvdWNiIHRvICRQQVRIIChmb3IgU3VuT1MgNC4xLngpLgotCi1UdWUgQXVnIDE1IDIxOjUxOjU4IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiBNYXRjaCBPU0YvMSB2My54IGFzIHRoZSBzYW1lIGFzIAotICAgICAgICB2Mi54LS12Mi54IGJpbmFyaWVzIGFyZSB1cHdhcmQgY29tcGF0aWJsZS4KLQotVHVlIEF1ZyAxNSAyMTo0Njo1NCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogcmVjb2duaXplIEhQIDkwMDAvODAwIHN5c3RlbXMgYXMgdGhlCi0Jc2FtZSBhcyBIUCA5MDAwLzcwMCBzeXN0ZW1zLgotCi1UdWUgQXVnICA4IDEzOjExOjU2IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogSW5zdGFsbC5pbjogRm9yIGVtYWNzLCBydW4gc2hvd19lbWFjc19hbHRlcm5hdGVfbXNnIGFuZCBleGl0LgotCShzaG93X2VtYWNzX2FsdGVybmF0ZV9tc2cpOiBOZXcgbWVzc2FnZSBzYXlpbmcgaG93IGVtYWNzIGNhbid0IGJlCi0JaW5zdGFsbGVkIGluIGFuIGFsdGVybmF0ZSBwcmVmaXguCi0KLVRodSBKdW4gIDggMDA6NDI6NTYgMTk5NSAgQW5nZWxhIE1hcmllIFRob21hcyAgPGFuZ2VsYUBjaXJkYW4uY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHN1YnN0LXN0cmluZ3M6IGNoYW5nZSBkdSBjb21tYW5kcyB0byAkQklORElSLy4gJiAkU1JDRElSLy4ganVzdAotICAgICAgICBpbiBjYXNlIHRoZXkgYXJlIHN5bWxpbmtzLgotCi1UdWUgQXByIDE4IDE0OjIzOjEwIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY2RrLWZpeDogRXh0cmFjdGVkIHRhYmxlIG9mIHRhcmdldHMgdGhhdCBkb24ndCBuZWVkIHRoZWlyCi0JICBoZWFkZXJzIGZpeGVkIGZyb20gZ2NjJ3MgY29uZmlndXJlIHNjcmlwdC4KLQotCSogY2RrLWZpeCwgY2RrLXZlcmlmeTogVXNlICR7SE9TVH0gaW5zdGVhZCBvZiB8fEhPU1RzdHJ8fAotCi0JKiBjZGstZml4LCBjZGstdmVyaWZ5OiBOZXcgZmlsZXMsIGluc3RhbGwgc2NyaXB0IGZyYWdtZW50cyB1c2VkCi0JICBmb3IgQ3lnbnVzIERldmVsb3BlcidzIEtpdC4KLQotCSogSW5zdGFsbC5pbiAoZG9fbWtkaXIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIEluc3RhbGwuaW46IEFkZGVkIHN1cHBvcnQgZm9yIC0td2l0aCBhbmQgLS13aXRob3V0IG9wdGlvbnMuCi0JICBDaGFuZ2VkIHNvIHRoYXQgdGFwZSBjb21tYW5kcyBhcmUgbm90IHJ1biB3aGVuIGV4dHJhY3RpbmcgCi0JICBmcm9tIGEgZmlsZS4KLQkgIChkb19tdCk6IENoYW5nZWQgdG8gdGFrZSBvbmx5IG9uZSBhcmd1bWVudC4KLQotV2VkIE1hciAyOSAxMToxNjozOCAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBjYXRjaCBVTkFNRT09YWxwaGEtZGVjLW9zZjIueCBhbmQgY29ycmVjdCBlbnRyeSBmb3IKLQlhbHBoYS1kZWMtb3NmMS54Ci0JCi1GcmkgSmFuIDI3IDEyOjA0OjI5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Vic3Qtc3RyaW5ncyAobWlwcy1zZ2ktaXJpeDUpOiBOZXcgZW50cnkgaW4gdGFibGUuCi0KLVRodSBKYW4gMTkgMTI6MTU6NDQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBJbnN0YWxsLmluOiBNYWpvciByZXdyaXRlLCBidW5kbGUgZGVwZW5kZW50IGNvZGUgKGZvciBleGFtcGxlLAotCSAgZml4aW5jbHVkZXMgZm9yIGNvbXAtdG9vbHMpIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgSW5zdGFsbAotCSAgc2NyaXB0IHdoZW4gaXQgaXMgZ2VuZXJhdGVkLgotCi1UdWUgSmFuIDE3IDE2OjUxOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogUmVidWlsZCB1c2luZyAkKFNIRUxMKS4KLQotVGh1IE5vdiAgMyAxOTozMDozMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogRGVwZW5kIG9uIGluZm8uCi0KLUZyaSBBdWcgMTkgMTY6MTY6MzggMTk5NCAgSmFzb24gTW9sZW5kYSAgICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IHNldCAkRklYX0hFQURFUiBzbyBmaXhwcm90byBjYW4gZmluZCBmaXgtaGVhZGVyLgotCi1GcmkgTWF5ICA2IDE2OjE4OjU4IDE5OTQgIEphc29uIE1vbGVuZGEgICAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IGFkZCBhIHNlbWljb2xvbiBpbiB0aGUgaWYgc3RhdGVtZW50LgotCi1GcmkgQXByIDI5IDE2OjU2OjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY2ZnLXBhcGVyLnRleGk6IFVwZGF0ZSBzb21lIG91dGRhdGVkIGluZm9ybWF0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogUGFzcyBmaWxlLCBub3QgZGlyZWN0b3J5LCBhcyBsYXN0Ci0JYXJnIHRvIElOU1RBTExfREFUQS4KLQkodW5pbnN0YWxsKTogTmV3IHRhcmdldC4KLQotVGh1IEFwciAyOCAxNDo0MjoyMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBDb21tZW50IG91dCBAc21hbGxib29rLgotCi0JKiBNYWtlZmlsZS5pbjogRGVmaW5lIFRFWEkyRFZJIGFuZCBURVhJRElSLCBhbmQgdXNlIHRoZSBsYXR0ZXIuCi0JUmVtb3ZlIGluZm8gZmlsZXMgaW4gcmVhbGNsZWFuLCBub3QgY2xlYW4sIHBlciBjb2Rpbmcgc3RhbmRhcmRzLgotCVJlbW92ZSBUZVggb3V0cHV0IGluIGNsZWFuLgotCi1UdWUgQXByIDI2IDE3OjE4OjAzIDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0gICAgICAgICogSW5zdGFsbC5pbjogIGZpeGluY2x1ZGVzIG91dHB1dCBpcyBhY3R1YWxseSBwdXQgaW4gZml4aW5jbHVkZXMubG9nLAotICAgICAgICBidXQgZWNobydlZCBtZXNzYWdlcyBjbGFpbSBpdCBpcyBmaXhpbmMubG9nLiAgVGhpcyBpcyB0aGUgc2FtZQotCW1lc3NhZ2VzIGFzIEkgbG9nZ2VkIGluIE1hcmNoIDQgMTk5NCwgYnV0IGZvciBzb21lIHJlYXNvbiB3ZSBmb3VuZAotCXRoZSBjaGFuZ2UgaGFkbid0IGJlZW4gZG9uZS4gIEknbGwgaGF2ZSB0byBkaWcgdGhyb3VnaCB0aGUgbG9ncwotCWFuZCBmaW5kIG91dCB3aGF0IEkgcmVhbGx5IGRpZCBkbyB0aGF0IGRheS4gOikKLQotTW9uIEFwciAyNSAyMDoyODoxOSAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiAgdXNlIGV2YWwgdG8gY2FsbCBkb19tdCgpIGZvciBVbHRyaXggYnJva2VubmVzcy4KLQotTW9uIEFwciAyNSAyMDowMDowMCAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluKGRvX210KTogZXhpdCB3aXRoIGVycm9yIHN0YXR1cyAxIGlmICMgb2YgcGFyYW1ldGVycwotCSE9IDMuCi0KLU1vbiBBcHIgMjUgMTk6NDI6MzYgMTk5NCAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogIGxvc2UgVEFQRV9GT1JXQVJEIGFuZCBUQVBFX1JFV0lORCwgYWRkIGRvX210KCkKLQl0byBkbyBhbGwgdGFwZSBtb3ZlbWVudCBvcGVyYXRpb25zLiAgQ3VycmVudGx5IHVudGVzdGVkLiAgQWRkcmVzc2VzCi0JUFIgIyA0ODg2IGZyb20gYnVsbC4KLQotCSogSW5zdGFsbC5pbjogYWRkIDE5OTQgdG8gdGhlIGNvcHlyaWdodCB0aGluZy4KLQotRnJpIEFwciAyMiAxOTowNToxMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBVcGRhdGUgZnJvbSBGU0YuCi0KLUZyaSBBcHIgMjIgMTU6NDY6MTAgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogQWRkICRERE9QVFMsIGhhcyBgYGJzPTEyNGInJyBmb3IgYWxsIHN5c3RlbXMgZXhjZXB0Ci0JQUlYIChzb21lIHZlcnNpb25zIG9mIEFJWCBkb24ndCB1bmRlcnN0YW5kIGJzPTEyNGIuICBTaWxseSBPUykuCi0KLU1vbiBBcHIgIDQgMjI6NTU6MDUgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IG51bGwgb3V0ICRUT09MUyBiZWZvcmUgYWRkaW5nIHN0dWZmIHRvIGl0Ci0Jbm9uLWRlc3RydWN0aXZlbHkuCi0KLVdlZCBNYXIgMzAgMjE6NDU6MzUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogRml4IHR5cG8uCi0KLQkqIGNvbmZpZ3VyZS50ZXhpLCBjb25maWd1cmUubWFuOiBEb2N1bWVudCAtLWRpc2FibGUtLgotCi1Nb24gTWFyIDI4IDEzOjIyOjE1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IFVwZGF0ZSBmcm9tIEZTRi4KLQotU2F0IE1hciAyNiAwOToyMTo0NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIGZyb20gRlNGLgotCi1GcmkgTWFyIDI1IDIyOjU5OjQ1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGksIGNvbmZpZ3VyZS5tYW46IERvY3VtZW50IC0tZW5hYmxlLSogb3B0aW9ucy4KLQotV2VkIE1hciAyMyAyMzozODoyNCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IHNldCBDUFAgdG8gYmUgZ2NjIC1FIGZvciBmaXhpbmNsdWRlcy4KLQotV2VkIE1hciAyMyAxMzo0Mjo0OCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiBzZXQgUEFUSCB0byAkUEFUSDovYmluOi91c3IvYmluIHNvIHdlIGNhbiBwaWNrCi0gICAgICAgIHVwIG5hdGl2ZSB0b29scyBldmVuIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0aGVtIGluIGhpcwotICAgICAgICBwYXRoLgotCi0gICAgICAgICogSW5zdGFsbC5pbjogYGBocHBhLTEuMS1ocC1ocHV4JycgLT4gYGBocHBhMS4xLWhwLWhwdXgnJy4KLQotVHVlIE1hciAxNSAyMjowOToyMCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0gICAgICAgIAotICAgICAgICAqIEluc3RhbGwuaW46IFRBUEVfUkVXSU5EIGFuZCBUQVBFX0ZPUldBUkQgdmFyaWFibGVzIGZvciBVbml4dW5hd2FyZSwKLSAgICAgICAgYWRkZWQgc3dpdGNoIHN0YXRlbWVudCB0byBkZXRlY3QgaWYgc3lzdGVtIGlzIFVuaXh1bmF3YXJlLgotCi1GcmkgTWFyICA0IDEyOjEwOjMwIDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0gICAgICAgICogSW5zdGFsbC5pbjogIGZpeGluY2x1ZGVzIG91dHB1dCBpcyBhY3R1YWxseSBwdXQgaW4gZml4aW5jbHVkZXMubG9nLAotICAgICAgICBidXQgZWNobydlZCBtZXNzYWdlcyBjbGFpbSBpdCBpcyBmaXhpbmMubG9nLgotCi1XZWQgTm92ICAzIDAyOjU4OjAyIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiAgb3V0cHV0IFRFWEJVTkRMRSBmb3IgbW9yZSBpbnN0YWxsIG5vdGVzIG1hdGNoaW5nCi0JKiBpbnN0YWxsLXRleGkuaW46ICBQUk1TIGluZm8gbm93IGV4aXN0cwotCi1UdWUgT2N0IDI2IDE2OjU3OjEyIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogbWF0Y2ggc29sYXJpcyouICBBbHNvLCBhZGQgZGVmYXVsdCBjYXNlIHRvIGNhdGNoCi0JICBhbmQgZXJyb3Igb3V0IGZvciB1bnJlY29nbml6ZWQgc3lzdGVtcy4KLQotVGh1IEF1ZyAxOSAxODoyMTozMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IGhhbmRsZSB0aGUgbmV3IGZpeHByb3RvIHdvcmsKLQotTW9uIEp1bCAxOSAxMjowNTo0MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IHJlbW92ZSAiTVQ9dGN0bCIgZm9yIEFJWCAobm90IG5lZWRlZCwgYW5kIGJhcmVseQotCXdvcmtlZCBhbnl3YXkpCi0KLU1vbiBKdW4gMTQgMTk6MDk6MjIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogY2hhbmdlZCBIT1NUIHRvIHJlY29nbml6ZSBTb2xhcmlzIGZvciBpbnN0YWxsIG5vdGVzCi0KLVRodSBKdW4gMTAgMTY6MDE6MjUgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogZG9zLWluc3QudGV4aTogIG5ldyBmaWxlLgotCi1XZWQgSnVuICA5IDE5OjIzOjU5IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHJ0bC5jeWdudXMuY29tKQotCi0gICAgICAgICogaW5zdGFsbC10ZXhpLmluOiAgICAgICAgYWRkZWQgY29uZGl0aW9uYWxzIChuZWFybHkgY29tcGxldGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5lZCB1cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIHN1cHBvcnQgZm9yIG90aGVyIHJlbGVhc2VzIChub3QgZG9uZSkKLQotV2VkIEp1biAgOSAxNTo1Mzo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFVzZSBJTlNUQUxMX0RBVEEuCi0JKHtkaXN0LHJlYWx9Y2xlYW4pOiBBbHNvIGRlbGV0ZSBNYWtlZmlsZSBhbmQgY29uZmlnLnN0YXR1cy4KLQotRnJpIEp1biAgNCAxNzowOTo1NiAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiAgYWRkZWQgZGF0YSBmb3IgT1NfU1RSSU5HCi0KLQkqIHN1YnN0LXN0cmluZ3M6ICBhZGRlZCBzdXBwb3J0IGZvciBPU19TVFJJTkcKLQotVGh1IEp1biAgMyAwMDozNzowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IHB1bGwgQ09QWUlORyBhbmQgQ09QWUlORy5MSUIgb2ZmIG9mIHRoZSB0YXBlIAotCi1UdWUgSnVuICAxIDE2OjUyOjA4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogcmVwbGFjZSBSRUxFQVNFX0RJUiB0b28KLQotTW9uIE1hciAyMiAyMzo1NToyNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1XZWQgTWFyIDE3IDAyOjIxOjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogZml4ICdzb3VyY2Ugb25seScgZXh0cmFjdGlvbiBidWcgd2hlcmUgaXQgbG9va2VkIGZvcgotCXRoZSBzcmMgZGlyIHVuZGVyIEgtPGhvc3Q+L3NyYyBpbnN0ZWFkIG9mIHNyYzsgYWxzbyByZW1vdmUgc3RyYXkKLQlyZWZlcmVuY2UgdG8gRU1BQ1NISUJJTgotCi1Nb24gTWFyIDE1IDAxOjI1OjQ1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogbWFrZS1zdGRzLnRleGk6IGFkZGVkICdpbnN0YWxsY2hlY2snIHRvIHRoZSBzdGFuZGFyZCB0YXJnZXRzCi0KLVR1ZSBNYXIgIDkgMTk6NDg6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogYWRkZWQgSU5GTy1ESVItRU5UUlksIHVwZGF0ZWQgdmVyc2lvbiBmcm9tIHRoZSBGU0YKLQotVHVlIEZlYiAgOSAxMjo0MDoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzdGFuZGFyZHMuaW5mbyk6IEFkZGVkIC1JJChzcmNkaXIpIHRvIGZpbmQKLQltYWtlLXN0ZHMudGV4aS4KLQotTW9uIEZlYiAgMSAxNjozMjo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiB1cGRhdGVkIHRvIGxhdGVzdCBGU0YgdmVyc2lvbiwgd2hpY2ggaW5jbHVkZXM6Ci0KLQkqIG1ha2Utc3Rkcy50ZXhpOiBuZXcgZmlsZQotCi1Nb24gTm92IDMwIDAxOjMxOjQwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC10ZXhpLmluLCByZWxub3Rlcy50ZXhpLCBpbnRyby50ZXhpOiBjaGFuZ2VkIEN5Z251cyBwaG9uZQotCW51bWJlcnMgZnJvbSB0aGUgb2xkIFBhbG8gQWx0byBvbmVzIHRvIHRoZSBuZXcgTXRuLiBWaWV3IG51bWJlcnMKLQotTW9uIE5vdiAxNiAxNjo1MDo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgJChSTSkgdG8gInJtIC1mIgotCi1TdW4gT2N0IDExIDE2OjA1OjQ4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaW50cm8udGV4aTogYWRkZWQgSU5GTy1ESVItRU5UUlkKLQpkaWZmIC0tZ2l0IGEvZXRjL01ha2VmaWxlLmluIGIvZXRjL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWRjOGM5Li4wMDAwMDAwCi0tLSBhL2V0Yy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0jIAotIyBNYWtlZmlsZS5pbiBmb3IgZXRjCi0jCi0KLXByZWZpeCAJCT0gQHByZWZpeEAKLWV4ZWNfcHJlZml4IAk9IEBleGVjX3ByZWZpeEAKLQotc3JjZGlyICA9IEBzcmNkaXJACi1WUEFUSAk9IEBzcmNkaXJACi0KLWJpbmRpciAgPSBAYmluZGlyQAotbGliZGlyICA9IEBsaWJkaXJACi10b29sZGlyID0gJChsaWJkaXIpCi1kYXRhZGlyID0gQGRhdGFkaXJACi0KLW1hbmRpciAgPSBAbWFuZGlyQAotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9IEBpbmZvZGlyQAotCi1TSEVMTCA9IC9iaW4vc2gKLQotSU5TVEFMTCAJPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX0RBVEEgICAgPSBASU5TVEFMTF9EQVRBQAotCi1NQUtFSU5GTyA9IGBpZiBbIC1mIC4uL3RleGluZm8vbWFrZWluZm8vbWFrZWluZm8gXTsgXAotCXRoZW4gZWNobyAuLi90ZXhpbmZvL21ha2VpbmZvL21ha2VpbmZvOyBcCi0JZWxzZSBlY2hvIG1ha2VpbmZvOyBmaWAKLVRFWEkyRFZJID0gYGlmIFsgLWYgLi4vdGV4aW5mby91dGlsL3RleGkyZHZpIF07IFwKLQl0aGVuIGVjaG8gLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBcCi0JZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWEkySFRNTCA9IHRleGkyaHRtbAotRFZJUFMgPSBkdmlwcwotCi0jIFdoZXJlIHRvIGZpbmQgdGV4aW5mby50ZXggdG8gZm9ybWF0IGRvY3VtZW50YXRpb24gd2l0aCBUZVguCi1URVhJRElSID0gJChzcmNkaXIpLy4uL3RleGluZm8KLQotIyMjIyBIb3N0LCB0YXJnZXQsIGFuZCBzaXRlIHNwZWNpZmljIE1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCi0jIyMKLQotSU5GT0ZJTEVTID0gc3RhbmRhcmRzLmluZm8gY29uZmlndXJlLmluZm8KLURWSUZJTEVTID0gc3RhbmRhcmRzLmR2aSBjb25maWd1cmUuZHZpCi0KLWFsbDoKLQotaW5zdGFsbDoKLQotdW5pbnN0YWxsOgotCi1pbmZvOgotCWZvciBmIGluICQoSU5GT0ZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvYGVjaG8gJCRmIHwgc2VkIC1lICdzLy5pbmZvJCQvLnRleGkvJ2A7IHRoZW4gXAotCSAgICBpZiAkKE1BS0UpICJNQUtFSU5GTz0kKE1BS0VJTkZPKSIgJCRmOyB0aGVuIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0KLWluc3RhbGwtaW5mbzogaW5mbwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzICQoaW5mb2RpcikKLQlpZiB0ZXN0ICEgLWYgc3RhbmRhcmRzLmluZm87IHRoZW4gY2QgJChzcmNkaXIpOyBmaTsgXAotCWlmIHRlc3QgLWYgc3RhbmRhcmRzLmluZm87IHRoZW4gXAotCSAgZm9yIGkgaW4gc3RhbmRhcmRzLmluZm8qOyBkbyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGkgJChpbmZvZGlyKS8kJGk7IFwKLQkgIGRvbmU7IFwKLQlmaQotCWlmIHRlc3QgISAtZiBjb25maWd1cmUuaW5mbzsgdGhlbiBjZCAkKHNyY2Rpcik7IGZpOyBcCi0JaWYgdGVzdCAtZiBjb25maWd1cmUuaW5mbzsgdGhlbiBcCi0JICBmb3IgaSBpbiBjb25maWd1cmUuaW5mbyo7IGRvIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkaSAkKGluZm9kaXIpLyQkaTsgXAotCSAgZG9uZTsgXAotCWZpCi0KLWR2aToKLQlmb3IgZiBpbiAkKERWSUZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvYGVjaG8gJCRmIHwgc2VkIC1lICdzLy5kdmkkJC8udGV4aS8nYDsgdGhlbiBcCi0JICAgIGlmICQoTUFLRSkgIlRFWEkyRFZJPSQoVEVYSTJEVkkpIiAkJGY7IHRoZW4gXAotCSAgICAgIHRydWU7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQotc3RhbmRhcmRzLmluZm86ICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aSAkKHNyY2RpcikvbWFrZS1zdGRzLnRleGkKLQkkKE1BS0VJTkZPKSAtLW5vLXNwbGl0IC1JJChzcmNkaXIpIC1vIHN0YW5kYXJkcy5pbmZvICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQotCi1zdGFuZGFyZHMuZHZpOiAkKHNyY2Rpcikvc3RhbmRhcmRzLnRleGkKLQlURVhJTlBVVFM9JChURVhJRElSKTokJFRFWElOUFVUUyAkKFRFWEkyRFZJKSAkKHNyY2Rpcikvc3RhbmRhcmRzLnRleGkKLQotc3RhbmRhcmRzLnBzOiBzdGFuZGFyZHMuZHZpCi0JJChEVklQUykgc3RhbmRhcmRzLmR2aSAtbyBzdGFuZGFyZHMucHMKLQotIyBtYWtlaW5mbyByZXF1aXJlcyBpbWFnZXMgdG8gYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotY29uZmlndXJlLmluZm86ICQoc3JjZGlyKS9jb25maWd1cmUudGV4aSAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiAkKHNyY2RpcikvY29uZmlnYnVpbGQudGluCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiBjb25maWdkZXYudHh0Ci0JY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiBjb25maWdidWlsZC50eHQKLQkkKE1BS0VJTkZPKSAtSSQoc3JjZGlyKSAtbyBjb25maWd1cmUuaW5mbyAkKHNyY2RpcikvY29uZmlndXJlLnRleGkKLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAotCi0jIHRleGkyZHZpIHdhbnRzIGJvdGggdGhlIC50eHQgYW5kIHRoZSAuZXBzIGZpbGVzLgotY29uZmlndXJlLmR2aTogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpICQoc3JjZGlyKS9jb25maWdkZXYudGluICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4gJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbgotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0JY3AgJChzcmNkaXIpL2NvbmZpZ2Rldi50aW4gY29uZmlnZGV2LnR4dAotCWNwICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4gY29uZmlnYnVpbGQudHh0Ci0Jcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQljcCAkKHNyY2RpcikvY29uZmlnZGV2LmVpbiBjb25maWdkZXYuZXBzCi0JY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbiBjb25maWdidWlsZC5lcHMKLQlURVhJTlBVVFM9JChURVhJRElSKTokJFRFWElOUFVUUyAkKFRFWEkyRFZJKSAkKHNyY2RpcikvY29uZmlndXJlLnRleGkKLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAotCXJtIC1mIGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0KLSMgZHZpcHMgcmVxdWlyZXMgaW1hZ2VzIHRvIGJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotY29uZmlndXJlLnBzOiBjb25maWd1cmUuZHZpICQoc3JjZGlyKS9jb25maWdkZXYuZWluICQoc3JjZGlyKS9jb25maWdidWlsZC5laW4KLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdkZXYuZWluIGNvbmZpZ2Rldi5lcHMKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluIGNvbmZpZ2J1aWxkLmVwcwotCSQoRFZJUFMpIGNvbmZpZ3VyZS5kdmkgLW8gY29uZmlndXJlLnBzCi0Jcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQotY29uZmlndXJlLmh0bWw6ICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCSQoVEVYSTJIVE1MKSAtc3BsaXRfY2hhcHRlciAkKHNyY2RpcikvY29uZmlndXJlLnRleGkKLQotY2xlYW46Ci0Jcm0gLWYgKi5hdXggKi5jcCAqLmNwcyAqLmR2aSAqLmZuICouZm5zICoua3kgKi5reXMgKi5sb2cKLQlybSAtZiAqLnBnICoucGdzICoudG9jICoudHAgKi50cHMgKi52ciAqLnZycwotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0IGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0Jcm0gLWYgY29uZmlnZGV2LmpwZyBjb25maWdidWlsZC5qcGcKLQotbW9zdGx5Y2xlYW46IGNsZWFuCi0KLWRpc3RjbGVhbjogICBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlCi0KLW1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiAgIGRpc3RjbGVhbgotCXJtIC1mICouaW5mbyoKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKGhvc3RfbWFrZWZpbGVfZnJhZykgJCh0YXJnZXRfbWFrZWZpbGVfZnJhZykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyMgdGhlc2UgbGFzdCB0YXJnZXRzIGFyZSBmb3Igc3RhbmRhcmRzLnRleGkgY29uZm9ybWFuY2UKLWRpc3Q6Ci1jaGVjazoKLWluc3RhbGxjaGVjazoKLVRBR1M6CmRpZmYgLS1naXQgYS9ldGMvYWRkLWxvZy5lbCBiL2V0Yy9hZGQtbG9nLmVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM4OGU4Li4wMDAwMDAwCi0tLSBhL2V0Yy9hZGQtbG9nLmVsCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLTs7OyA9PT09PT09PT09PT0gTk9URSBXRUxMISA9PT09PT09PT09PT09Ci07OzsKLTs7OyBZb3Ugb25seSBuZWVkIHRvIHVzZSB0aGlzIGZpbGUgaWYgeW91J3JlIHVzaW5nIGEgdmVyc2lvbiBvZiBFbWFjcwotOzs7IHByaW9yIHRvIDIwLjEgdG8gd29yayBvbiBHREIuICBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcwotOzs7IGFuZCB0aGUgc3RhbmRhcmQgYWRkLWxvZy5lbCBwcm92aWRlZCB3aXRoIDE5LjM0IGlzIHRoYXQgaXQKLTs7OyBnZW5lcmF0ZXMgZGF0ZXMgdXNpbmcgdGhlIHRlcnNlciBmb3JtYXQgdXNlZCBieSBFbWFjcyAyMC4gIFRoaXMgaXMKLTs7OyB0aGUgZm9ybWF0IHJlY29tbWVuZGVkIGZvciB1c2UgaW4gR0RCIENoYW5nZUxvZ3MuCi07OzsKLTs7OyBUbyB1c2UgdGhpcyBjb2RlLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIGRpcmVjdG9yeSBgfi9lbGlzcCcsIHNhdmUgdGhlIGNvZGUKLTs7OyBiZWxvdyBpbiBgfi9lbGlzcC9hZGQtbG9nLmVsJywgYW5kIHRoZW4gcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4KLTs7OyB5b3VyIGB+Ly5lbWFjcycgZmlsZSwgdG8gdGVsbCBFbWFjcyB3aGVyZSB0byBmaW5kIGl0OgotOzs7IAotOzs7IChzZXRxIGxvYWQtcGF0aAotOzs7ICAgICAgIChjb25zIChleHBhbmQtZmlsZS1uYW1lICJ+L2VsaXNwIikKLTs7OyAgICAgICAgICAgICBsb2FkLXBhdGgpKQotOzs7IAotOzs7IElmIHlvdSB3YW50LCB5b3UgY2FuIGFsc28gYnl0ZS1jb21waWxlIGl0IC0tLSBpdCdsbCBydW4gYSBsaXR0bGUKLTs7OyBmYXN0ZXIsIGFuZCB1c2UgYSBsaXR0bGUgbGVzcyBtZW1vcnkuICAoTm90IHRoYXQgdGhvc2UgbWF0dGVyIG11Y2ggZm9yCi07OzsgdGhpcyBmaWxlLikgIFRvIGRvIHRoYXQsIGFmdGVyIHlvdSd2ZSBzYXZlZCB0aGUgdGV4dCBhcwotOzs7IH4vZWxpc3AvYWRkLWxvZy5lbCwgYnJpbmcgaXQgdXAgaW4gRW1hY3MsIGFuZCB0eXBlCi07OzsgCi07OzsgICAgIEMtdSBNLXggYnl0ZS1jb21waWxlLWZpbGUKLTs7OwotOzs7IC0tLSBKaW0gQmxhbmR5Ci0KLTs7OyBhZGQtbG9nLmVsIC0tLSBjaGFuZ2UgbG9nIG1haW50ZW5hbmNlIGNvbW1hbmRzIGZvciBFbWFjcwotCi07OyBDb3B5cmlnaHQgKEMpIDE5ODUsIDE5ODYsIDE5ODgsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLTs7IEtleXdvcmRzOiBtYWludAotCi07OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCi0KLTs7IEdOVSBFbWFjcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci07OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotOzsgYW55IGxhdGVyIHZlcnNpb24uCi0KLTs7IEdOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLTs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLTs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLTs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi07OyBhbG9uZyB3aXRoIEdOVSBFbWFjczsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotOzsgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi07OyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotOzs7IENvbW1lbnRhcnk6Ci0KLTs7IFRoaXMgZmFjaWxpdHkgaXMgZG9jdW1lbnRlZCBpbiB0aGUgRW1hY3MgTWFudWFsLgotCi07OzsgQ29kZToKLQotKGRlZnZhciBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSBuaWwKLSAgIipOYW1lIG9mIGEgY2hhbmdlIGxvZyBmaWxlIGZvciBcXFthZGQtY2hhbmdlLWxvZy1lbnRyeV0uIikKLQotKGRlZnZhciBhZGQtbG9nLWN1cnJlbnQtZGVmdW4tZnVuY3Rpb24gbmlsCi0gICJcCi0qSWYgbm9uLW5pbCwgZnVuY3Rpb24gdG8gZ3Vlc3MgbmFtZSBvZiBjdXJyZW50IGZ1bmN0aW9uIGZyb20gc3Vycm91bmRpbmcgdGV4dC4KLVxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XSBjYWxscyB0aGlzIGZ1bmN0aW9uIChpZiBuaWwsIGBhZGQtbG9nLWN1cnJlbnQtZGVmdW4nCi1pbnN0ZWFkKSB3aXRoIG5vIGFyZ3VtZW50cy4gIEl0IHJldHVybnMgYSBzdHJpbmcgb3IgbmlsIGlmIGl0IGNhbm5vdCBndWVzcy4iKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnZhciBhZGQtbG9nLWZ1bGwtbmFtZSBuaWwKLSAgIipGdWxsIG5hbWUgb2YgdXNlciwgZm9yIGluY2x1c2lvbiBpbiBDaGFuZ2VMb2cgZGFpbHkgaGVhZGVycy4KLVRoaXMgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBgdXNlci1mdWxsLW5hbWUnIGZ1bmN0aW9uLiIpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdmFyIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzIG5pbAotICAiKkVsZWN0cm9uaWMgbWFpbCBhZGRyZXNzIG9mIHVzZXIsIGZvciBpbmNsdXNpb24gaW4gQ2hhbmdlTG9nIGRhaWx5IGhlYWRlcnMuCi1UaGlzIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBgdXNlci1tYWlsLWFkZHJlc3MnLiIpCi0KLShkZWZ2YXIgY2hhbmdlLWxvZy1mb250LWxvY2sta2V5d29yZHMKLSAgJygoIl5bU01UV0ZdLisiIC4gZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkJOyBEYXRlIGxpbmUuCi0gICAgKCJeXHRcXCogXFwoW14gOlxuXStcXCkiIDEgZm9udC1sb2NrLWNvbW1lbnQtZmFjZSkJOyBGaWxlIG5hbWUuCi0gICAgKCIoXFwoW14pXG5dK1xcKSk6IiAxIGZvbnQtbG9jay1rZXl3b3JkLWZhY2UpKQk7IEZ1bmN0aW9uIG5hbWUuCi0gICJBZGRpdGlvbmFsIGV4cHJlc3Npb25zIHRvIGhpZ2hsaWdodCBpbiBDaGFuZ2UgTG9nIG1vZGUuIikKLQotKGRlZnZhciBjaGFuZ2UtbG9nLW1vZGUtbWFwIG5pbAotICAiS2V5bWFwIGZvciBDaGFuZ2UgTG9nIG1ham9yIG1vZGUuIikKLShpZiBjaGFuZ2UtbG9nLW1vZGUtbWFwCi0gICAgbmlsCi0gIChzZXRxIGNoYW5nZS1sb2ctbW9kZS1tYXAgKG1ha2Utc3BhcnNlLWtleW1hcCkpCi0gIChkZWZpbmUta2V5IGNoYW5nZS1sb2ctbW9kZS1tYXAgIlxNLXEiICdjaGFuZ2UtbG9nLWZpbGwtcGFyYWdyYXBoKSkKLQotKGRlZnVuIGNoYW5nZS1sb2ctbmFtZSAoKQotICAob3IgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUKLSAgICAgIChpZiAoZXEgc3lzdGVtLXR5cGUgJ3ZheC12bXMpIAotCSAgIiRDSEFOR0VfTE9HJC5UWFQiIAotCShpZiAob3IgKGVxIHN5c3RlbS10eXBlICdtcy1kb3MpIChlcSBzeXN0ZW0tdHlwZSAnd2luZG93cy1udCkpCi0JICAgICJjaGFuZ2VsbyIKLQkgICJDaGFuZ2VMb2ciKSkpKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIHByb21wdC1mb3ItY2hhbmdlLWxvZy1uYW1lICgpCi0gICJQcm9tcHQgZm9yIGEgY2hhbmdlIGxvZyBuYW1lLiIKLSAgKGxldCogKChkZWZhdWx0IChjaGFuZ2UtbG9nLW5hbWUpKQotCSAobmFtZSAoZXhwYW5kLWZpbGUtbmFtZQotCQkocmVhZC1maWxlLW5hbWUgKGZvcm1hdCAiTG9nIGZpbGUgKGRlZmF1bHQgJXMpOiAiIGRlZmF1bHQpCi0JCQkJbmlsIGRlZmF1bHQpKSkpCi0gICAgOzsgSGFuZGxlIHNvbWV0aGluZyB0aGF0IGlzIHN5bnRhY3RpY2FsbHkgYSBkaXJlY3RvcnkgbmFtZS4KLSAgICA7OyBMb29rIGZvciBDaGFuZ2VMb2cgb3Igd2hhdGV2ZXIgaW4gdGhhdCBkaXJlY3RvcnkuCi0gICAgKGlmIChzdHJpbmc9IChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IG5hbWUpICIiKQotCShleHBhbmQtZmlsZS1uYW1lIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGRlZmF1bHQpCi0JCQkgIG5hbWUpCi0gICAgICA7OyBIYW5kbGUgc3BlY2lmeWluZyBhIGZpbGUgdGhhdCBpcyBhIGRpcmVjdG9yeS4KLSAgICAgIChpZiAoZmlsZS1kaXJlY3RvcnktcCBuYW1lKQotCSAgKGV4cGFuZC1maWxlLW5hbWUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZGVmYXVsdCkKLQkJCSAgICAoZmlsZS1uYW1lLWFzLWRpcmVjdG9yeSBuYW1lKSkKLQluYW1lKSkpKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGZpbmQtY2hhbmdlLWxvZyAoJm9wdGlvbmFsIGZpbGUtbmFtZSkKLSAgIkZpbmQgYSBjaGFuZ2UgbG9nIGZpbGUgZm9yIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XSBhbmQgcmV0dXJuIHRoZSBuYW1lLgotCi1PcHRpb25hbCBhcmcgRklMRS1OQU1FIHNwZWNpZmllcyB0aGUgZmlsZSB0byB1c2UuCi1JZiBGSUxFLU5BTUUgaXMgbmlsLCB1c2UgdGhlIHZhbHVlIG9mIGBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScuCi1JZiAnY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnIGlzIG5pbCwgYmVoYXZlIGFzIHRob3VnaCBpdCB3ZXJlICdDaGFuZ2VMb2cnCi1cKG9yIHdoYXRldmVyIHdlIHVzZSBvbiB0aGlzIG9wZXJhdGluZyBzeXN0ZW0pLgotCi1JZiAnY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnIGNvbnRhaW5zIGEgbGVhZGluZyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuCi1zaW1wbHkgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBPdGhlcndpc2UsIHNlYXJjaCBpbiB0aGUgY3VycmVudCAKLWRpcmVjdG9yeSBhbmQgaXRzIHN1Y2Nlc3NpdmUgcGFyZW50cyBmb3IgYSBmaWxlIHNvIG5hbWVkLgotCi1PbmNlIGEgZmlsZSBpcyBmb3VuZCwgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJyBpcyBzZXQgbG9jYWxseSBpbiB0aGUKLWN1cnJlbnQgYnVmZmVyIHRvIHRoZSBjb21wbGV0ZSBmaWxlIG5hbWUuIgotICA7OyBJZiB1c2VyIHNwZWNpZmllZCBhIGZpbGUgbmFtZSBvciBpZiB0aGlzIGJ1ZmZlciBrbm93cyB3aGljaCBvbmUgdG8gdXNlLAotICA7OyBqdXN0IHVzZSB0aGF0LgotICAob3IgZmlsZS1uYW1lCi0gICAgICAoc2V0cSBmaWxlLW5hbWUgKGFuZCBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZQotCQkJICAgKGZpbGUtbmFtZS1kaXJlY3RvcnkgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUpCi0JCQkgICBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSkpCi0gICAgICAocHJvZ24KLQk7OyBDaGFzZSBsaW5rcyBpbiB0aGUgc291cmNlIGZpbGUKLQk7OyBhbmQgdXNlIHRoZSBjaGFuZ2UgbG9nIGluIHRoZSBkaXIgd2hlcmUgaXQgcG9pbnRzLgotCShzZXRxIGZpbGUtbmFtZSAob3IgKGFuZCBidWZmZXItZmlsZS1uYW1lCi0JCQkJIChmaWxlLW5hbWUtZGlyZWN0b3J5Ci0JCQkJICAoZmlsZS1jaGFzZS1saW5rcyBidWZmZXItZmlsZS1uYW1lKSkpCi0JCQkgICAgZGVmYXVsdC1kaXJlY3RvcnkpKQotCShpZiAoZmlsZS1kaXJlY3RvcnktcCBmaWxlLW5hbWUpCi0JICAgIChzZXRxIGZpbGUtbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSAoY2hhbmdlLWxvZy1uYW1lKSBmaWxlLW5hbWUpKSkKLQk7OyBDaGFzZSBsaW5rcyBiZWZvcmUgdmlzaXRpbmcgdGhlIGZpbGUuCi0JOzsgVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gdXNlIGEgc2luZ2xlIGNoYW5nZSBsb2cgZmlsZQotCTs7IGZvciBzZXZlcmFsIHJlbGF0ZWQgZGlyZWN0b3JpZXMuCi0JKHNldHEgZmlsZS1uYW1lIChmaWxlLWNoYXNlLWxpbmtzIGZpbGUtbmFtZSkpCi0JKHNldHEgZmlsZS1uYW1lIChleHBhbmQtZmlsZS1uYW1lIGZpbGUtbmFtZSkpCi0JOzsgTW92ZSB1cCBpbiB0aGUgZGlyIGhpZXJhcmNoeSB0aWxsIHdlIGZpbmQgYSBjaGFuZ2UgbG9nIGZpbGUuCi0JKGxldCAoKGZpbGUxIGZpbGUtbmFtZSkKLQkgICAgICBwYXJlbnQtZGlyKQotCSAgKHdoaWxlIChhbmQgKG5vdCAob3IgKGdldC1maWxlLWJ1ZmZlciBmaWxlMSkgKGZpbGUtZXhpc3RzLXAgZmlsZTEpKSkKLQkJICAgICAgKHByb2duIChzZXRxIHBhcmVudC1kaXIKLQkJCQkgICAoZmlsZS1uYW1lLWRpcmVjdG9yeQotCQkJCSAgICAoZGlyZWN0b3J5LWZpbGUtbmFtZQotCQkJCSAgICAgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmlsZTEpKSkpCi0JCQkgICAgIDs7IEdpdmUgdXAgaWYgd2UgYXJlIGFscmVhZHkgYXQgdGhlIHJvb3QgZGlyLgotCQkJICAgICAobm90IChzdHJpbmc9IChmaWxlLW5hbWUtZGlyZWN0b3J5IGZpbGUxKQotCQkJCQkgICBwYXJlbnQtZGlyKSkpKQotCSAgICA7OyBNb3ZlIHVwIHRvIHRoZSBwYXJlbnQgZGlyIGFuZCB0cnkgYWdhaW4uCi0JICAgIChzZXRxIGZpbGUxIChleHBhbmQtZmlsZS1uYW1lIAotCQkJIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IChjaGFuZ2UtbG9nLW5hbWUpKQotCQkJIHBhcmVudC1kaXIpKSkKLQkgIDs7IElmIHdlIGZvdW5kIGEgY2hhbmdlIGxvZyBpbiBhIHBhcmVudCwgdXNlIHRoYXQuCi0JICAoaWYgKG9yIChnZXQtZmlsZS1idWZmZXIgZmlsZTEpIChmaWxlLWV4aXN0cy1wIGZpbGUxKSkKLQkgICAgICAoc2V0cSBmaWxlLW5hbWUgZmlsZTEpKSkpKQotICA7OyBNYWtlIGEgbG9jYWwgdmFyaWFibGUgaW4gdGhpcyBidWZmZXIgc28gd2UgbmVlZG4ndCBzZWFyY2ggYWdhaW4uCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2NoYW5nZS1sb2ctZGVmYXVsdC1uYW1lKSBmaWxlLW5hbWUpCi0gIGZpbGUtbmFtZSkKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBhZGQtY2hhbmdlLWxvZy1lbnRyeSAoJm9wdGlvbmFsIHdob2FtaSBmaWxlLW5hbWUgb3RoZXItd2luZG93IG5ldy1lbnRyeSkKLSAgIkZpbmQgY2hhbmdlIGxvZyBmaWxlIGFuZCBhZGQgYW4gZW50cnkgZm9yIHRvZGF5LgotT3B0aW9uYWwgYXJnIChpbnRlcmFjdGl2ZSBwcmVmaXgpIG5vbi1uaWwgbWVhbnMgcHJvbXB0IGZvciB1c2VyIG5hbWUgYW5kIHNpdGUuCi1TZWNvbmQgYXJnIGlzIGZpbGUgbmFtZSBvZiBjaGFuZ2UgbG9nLiAgSWYgbmlsLCB1c2VzIGBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScuCi1UaGlyZCBhcmcgT1RIRVItV0lORE9XIG5vbi1uaWwgbWVhbnMgdmlzaXQgaW4gb3RoZXIgd2luZG93LgotRm91cnRoIGFyZyBORVctRU5UUlkgbm9uLW5pbCBtZWFucyBhbHdheXMgY3JlYXRlIGEgbmV3IGVudHJ5IGF0IHRoZSBmcm9udDsKLW5ldmVyIGFwcGVuZCB0byBhbiBleGlzdGluZyBlbnRyeS4iCi0gIChpbnRlcmFjdGl2ZSAobGlzdCBjdXJyZW50LXByZWZpeC1hcmcKLQkJICAgICAocHJvbXB0LWZvci1jaGFuZ2UtbG9nLW5hbWUpKSkKLSAgKG9yIGFkZC1sb2ctZnVsbC1uYW1lCi0gICAgICAoc2V0cSBhZGQtbG9nLWZ1bGwtbmFtZSAodXNlci1mdWxsLW5hbWUpKSkKLSAgKG9yIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzCi0gICAgICAoc2V0cSBhZGQtbG9nLW1haWxpbmctYWRkcmVzcyB1c2VyLW1haWwtYWRkcmVzcykpCi0gIChpZiB3aG9hbWkKLSAgICAgIChwcm9nbgotCShzZXRxIGFkZC1sb2ctZnVsbC1uYW1lIChyZWFkLWlucHV0ICJGdWxsIG5hbWU6ICIgYWRkLWxvZy1mdWxsLW5hbWUpKQotCSA7OyBOb3RlIHRoYXQgc29tZSBzaXRlcyBoYXZlIHJvb20gYW5kIHBob25lIG51bWJlciBmaWVsZHMgaW4KLQkgOzsgZnVsbCBuYW1lIHdoaWNoIGxvb2sgc2lsbHkgd2hlbiBpbnNlcnRlZC4gIFJhdGhlciB0aGFuIGRvCi0JIDs7IGFueXRoaW5nIGFib3V0IHRoYXQgaGVyZSwgbGV0IHVzZXIgZ2l2ZSBwcmVmaXggYXJndW1lbnQgc28gdGhhdAotCSA7OyBzL2hlIGNhbiBlZGl0IHRoZSBmdWxsIG5hbWUgZmllbGQgaW4gcHJvbXB0ZXIgaWYgcy9oZSB3YW50cy4KLQkoc2V0cSBhZGQtbG9nLW1haWxpbmctYWRkcmVzcwotCSAgICAgIChyZWFkLWlucHV0ICJNYWlsaW5nIGFkZHJlc3M6ICIgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MpKSkpCi0gIChsZXQgKChkZWZ1biAoZnVuY2FsbCAob3IgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWZ1bmN0aW9uCi0JCQkgICAgJ2FkZC1sb2ctY3VycmVudC1kZWZ1bikpKQotCXBhcmFncmFwaC1lbmQgZW50cnkpCi0KLSAgICAoc2V0cSBmaWxlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgKGZpbmQtY2hhbmdlLWxvZyBmaWxlLW5hbWUpKSkKLQotICAgIDs7IFNldCBFTlRSWSB0byB0aGUgZmlsZSBuYW1lIHRvIHVzZSBpbiB0aGUgbmV3IGVudHJ5LgotICAgIChhbmQgYnVmZmVyLWZpbGUtbmFtZQotCSA7OyBOZXZlciB3YW50IHRvIGFkZCBhIGNoYW5nZSBsb2cgZW50cnkgZm9yIHRoZSBDaGFuZ2VMb2cgZmlsZSBpdHNlbGYuCi0JIChub3QgKHN0cmluZz0gYnVmZmVyLWZpbGUtbmFtZSBmaWxlLW5hbWUpKQotCSAoc2V0cSBlbnRyeSAoaWYgKHN0cmluZy1tYXRjaAotCQkJICAoY29uY2F0ICJeIiAocmVnZXhwLXF1b3RlIChmaWxlLW5hbWUtZGlyZWN0b3J5Ci0JCQkJCQkgICAgIGZpbGUtbmFtZSkpKQotCQkJICBidWZmZXItZmlsZS1uYW1lKQotCQkJIChzdWJzdHJpbmcgYnVmZmVyLWZpbGUtbmFtZSAobWF0Y2gtZW5kIDApKQotCQkgICAgICAgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgYnVmZmVyLWZpbGUtbmFtZSkpKSkKLQotICAgIChpZiAoYW5kIG90aGVyLXdpbmRvdyAobm90IChlcXVhbCBmaWxlLW5hbWUgYnVmZmVyLWZpbGUtbmFtZSkpKQotCShmaW5kLWZpbGUtb3RoZXItd2luZG93IGZpbGUtbmFtZSkKLSAgICAgIChmaW5kLWZpbGUgZmlsZS1uYW1lKSkKLSAgICAob3IgKGVxIG1ham9yLW1vZGUgJ2NoYW5nZS1sb2ctbW9kZSkKLQkoY2hhbmdlLWxvZy1tb2RlKSkKLSAgICAodW5kby1ib3VuZGFyeSkKLSAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQotICAgIChsZXQgKChoZWFkaW5nIChmb3JtYXQgIiVzICAlcyAgPCVzPiIKLQkJCSAgIChmb3JtYXQtdGltZS1zdHJpbmcgIiVZLSVtLSVkIikKLQkJCSAgIGFkZC1sb2ctZnVsbC1uYW1lCi0JCQkgICBhZGQtbG9nLW1haWxpbmctYWRkcmVzcykpKQotICAgICAgKGlmIChsb29raW5nLWF0IChyZWdleHAtcXVvdGUgaGVhZGluZykpCi0JICAoZm9yd2FyZC1saW5lIDEpCi0JKGluc2VydCBoZWFkaW5nICJcblxuIikpKQotCi0gICAgOzsgU2VhcmNoIG9ubHkgd2l0aGluIHRoZSBmaXJzdCBwYXJhZ3JhcGguCi0gICAgKGlmIChsb29raW5nLWF0ICJcbipbXlxuKiBcdF0iKQotCShza2lwLWNoYXJzLWZvcndhcmQgIlxuIikKLSAgICAgIChmb3J3YXJkLXBhcmFncmFwaCAxKSkKLSAgICAoc2V0cSBwYXJhZ3JhcGgtZW5kIChwb2ludCkpCi0gICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLQotICAgIDs7IE5vdyBpbnNlcnQgdGhlIG5ldyBsaW5lIGZvciB0aGlzIGVudHJ5LgotICAgIChjb25kICgocmUtc2VhcmNoLWZvcndhcmQgIl5cXHMgKlxcKlxccyAqJCIgcGFyYWdyYXBoLWVuZCB0KQotCSAgIDs7IFB1dCB0aGlzIGZpbGUgbmFtZSBpbnRvIHRoZSBleGlzdGluZyBlbXB0eSBlbnRyeS4KLQkgICAoaWYgZW50cnkKLQkgICAgICAgKGluc2VydCBlbnRyeSkpKQotCSAgKChhbmQgKG5vdCBuZXctZW50cnkpCi0JCShsZXQgKGNhc2UtZm9sZC1zZWFyY2gpCi0JCSAgKHJlLXNlYXJjaC1mb3J3YXJkCi0JCSAgIChjb25jYXQgKHJlZ2V4cC1xdW90ZSAoY29uY2F0ICIqICIgZW50cnkpKQotCQkJICAgOzsgRG9uJ3QgYWNjZXB0IGBmb28uYmFyJyB3aGVuCi0JCQkgICA7OyBsb29raW5nIGZvciBgZm9vJzoKLQkJCSAgICJcXChcXHMgXFx8WygpLDpdXFwpIikKLQkJICAgcGFyYWdyYXBoLWVuZCB0KSkpCi0JICAgOzsgQWRkIHRvIHRoZSBleGlzdGluZyBlbnRyeSBmb3IgdGhlIHNhbWUgZmlsZS4KLQkgICAocmUtc2VhcmNoLWZvcndhcmQgIl5cXHMgKiRcXHxeXFxzIFxcKiIpCi0JICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQotCSAgIDs7IERlbGV0ZSBleGNlc3MgZW1wdHkgbGluZXM7IG1ha2UganVzdCAyLgotCSAgICh3aGlsZSAoYW5kIChub3QgKGVvYnApKSAobG9va2luZy1hdCAiXlxccyAqJCIpKQotCSAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNpb24gKGZvcndhcmQtbGluZSAxKSAocG9pbnQpKSkpCi0JICAgKGluc2VydCAiXG5cbiIpCi0JICAgKGZvcndhcmQtbGluZSAtMikKLQkgICAoaW5kZW50LXJlbGF0aXZlLW1heWJlKSkKLQkgICh0Ci0JICAgOzsgTWFrZSBhIG5ldyBlbnRyeS4KLQkgICAoZm9yd2FyZC1saW5lIDEpCi0JICAgKHdoaWxlIChsb29raW5nLWF0ICJcXHNXIikKLQkgICAgIChmb3J3YXJkLWxpbmUgMSkpCi0JICAgKHdoaWxlIChhbmQgKG5vdCAoZW9icCkpIChsb29raW5nLWF0ICJeXFxzICokIikpCi0JICAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQpIChzYXZlLWV4Y3Vyc2lvbiAoZm9yd2FyZC1saW5lIDEpIChwb2ludCkpKSkKLQkgICAoaW5zZXJ0ICJcblxuXG4iKQotCSAgIChmb3J3YXJkLWxpbmUgLTIpCi0JICAgKGluZGVudC10byBsZWZ0LW1hcmdpbikKLQkgICAoaW5zZXJ0ICIqICIgKG9yIGVudHJ5ICIiKSkpKQotICAgIDs7IE5vdyBpbnNlcnQgdGhlIGZ1bmN0aW9uIG5hbWUsIGlmIHdlIGhhdmUgb25lLgotICAgIDs7IFBvaW50IGlzIGF0IHRoZSBlbnRyeSBmb3IgdGhpcyBmaWxlLAotICAgIDs7IGVpdGhlciBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIG9yIGF0IHRoZSBmaXJzdCBibGFuayBsaW5lLgotICAgIChpZiBkZWZ1bgotCShwcm9nbgotCSAgOzsgTWFrZSBpdCBlYXN5IHRvIGdldCByaWQgb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0JICAodW5kby1ib3VuZGFyeSkKLQkgIChpbnNlcnQgKGlmIChzYXZlLWV4Y3Vyc2lvbgotCQkJKGJlZ2lubmluZy1vZi1saW5lIDEpCi0JCQkobG9va2luZy1hdCAiXFxzICokIikpIAotCQkgICAgICAiIgotCQkgICAgIiAiKQotCQkgICIoIiBkZWZ1biAiKTogIikpCi0gICAgICA7OyBObyBmdW5jdGlvbiBuYW1lLCBzbyBwdXQgaW4gYSBjb2xvbiB1bmxlc3Mgd2UgaGF2ZSBqdXN0IGEgc3Rhci4KLSAgICAgIChpZiAobm90IChzYXZlLWV4Y3Vyc2lvbgotCQkgKGJlZ2lubmluZy1vZi1saW5lIDEpCi0JCSAobG9va2luZy1hdCAiXFxzICpcXChcXCpcXHMgKlxcKT8kIikpKQotCSAgKGluc2VydCAiOiAiKSkpKSkKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBhZGQtY2hhbmdlLWxvZy1lbnRyeS1vdGhlci13aW5kb3cgKCZvcHRpb25hbCB3aG9hbWkgZmlsZS1uYW1lKQotICAiRmluZCBjaGFuZ2UgbG9nIGZpbGUgaW4gb3RoZXIgd2luZG93IGFuZCBhZGQgYW4gZW50cnkgZm9yIHRvZGF5LgotT3B0aW9uYWwgYXJnIChpbnRlcmFjdGl2ZSBwcmVmaXgpIG5vbi1uaWwgbWVhbnMgcHJvbXB0IGZvciB1c2VyIG5hbWUgYW5kIHNpdGUuCi1TZWNvbmQgYXJnIGlzIGZpbGUgbmFtZSBvZiBjaGFuZ2UgbG9nLiAgXAotSWYgbmlsLCB1c2VzIGBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScuIgotICAoaW50ZXJhY3RpdmUgKGlmIGN1cnJlbnQtcHJlZml4LWFyZwotCQkgICAobGlzdCBjdXJyZW50LXByZWZpeC1hcmcKLQkJCSAocHJvbXB0LWZvci1jaGFuZ2UtbG9nLW5hbWUpKSkpCi0gIChhZGQtY2hhbmdlLWxvZy1lbnRyeSB3aG9hbWkgZmlsZS1uYW1lIHQpKQotOzs7IyMjYXV0b2xvYWQgKGRlZmluZS1rZXkgY3RsLXgtNC1tYXAgImEiICdhZGQtY2hhbmdlLWxvZy1lbnRyeS1vdGhlci13aW5kb3cpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gY2hhbmdlLWxvZy1tb2RlICgpCi0gICJNYWpvciBtb2RlIGZvciBlZGl0aW5nIGNoYW5nZSBsb2dzOyBsaWtlIEluZGVudGVkIFRleHQgTW9kZS4KLVByZXZlbnRzIG51bWVyaWMgYmFja3VwcyBhbmQgc2V0cyBgbGVmdC1tYXJnaW4nIHRvIDggYW5kIGBmaWxsLWNvbHVtbicgdG8gNzQuCi1OZXcgbG9nIGVudHJpZXMgYXJlIHVzdWFsbHkgbWFkZSB3aXRoIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XSBvciBcXFthZGQtY2hhbmdlLWxvZy1lbnRyeS1vdGhlci13aW5kb3ddLgotRWFjaCBlbnRyeSBiZWhhdmVzIGFzIGEgcGFyYWdyYXBoLCBhbmQgdGhlIGVudHJpZXMgZm9yIG9uZSBkYXkgYXMgYSBwYWdlLgotUnVucyBgY2hhbmdlLWxvZy1tb2RlLWhvb2snLiIKLSAgKGludGVyYWN0aXZlKQotICAoa2lsbC1hbGwtbG9jYWwtdmFyaWFibGVzKQotICAoaW5kZW50ZWQtdGV4dC1tb2RlKQotICAoc2V0cSBtYWpvci1tb2RlICdjaGFuZ2UtbG9nLW1vZGUKLQltb2RlLW5hbWUgIkNoYW5nZSBMb2ciCi0JbGVmdC1tYXJnaW4gOAotCWZpbGwtY29sdW1uIDc0Ci0gICAgaW5kZW50LXRhYnMtbW9kZSB0Ci0gICAgdGFiLXdpZHRoIDgpCi0gICh1c2UtbG9jYWwtbWFwIGNoYW5nZS1sb2ctbW9kZS1tYXApCi0gIDs7IExldCBlYWNoIGVudHJ5IGJlaGF2ZSBhcyBvbmUgcGFyYWdyYXBoOgotICA7OyBXZSByZWFsbHkgZG8gd2FudCAiXiIgaW4gcGFyYWdyYXBoLXN0YXJ0IGJlbG93OiBpdCBpcyBvbmx5IHRoZSBsaW5lcyB0aGF0Ci0gIDs7IGJlZ2luIGF0IGNvbHVtbiAwIChkZXNwaXRlIHRoZSBsZWZ0LW1hcmdpbiBvZiA4KSB0aGF0IHdlIGFyZSBsb29raW5nIGZvci4KLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFyYWdyYXBoLXN0YXJ0KSAiXFxzICokXFx8XGZcXHxeXFxzdyIpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhcmFncmFwaC1zZXBhcmF0ZSkgIlxccyAqJFxcfFxmXFx8Xlxcc3ciKQotICA7OyBMZXQgYWxsIGVudHJpZXMgZm9yIG9uZSBkYXkgYmVoYXZlIGFzIG9uZSBwYWdlLgotICA7OyBNYXRjaCBudWxsIHN0cmluZyBvbiB0aGUgZGF0ZS1saW5lIHNvIHRoYXQgdGhlIGRhdGUtbGluZQotICA7OyBpcyBncm91cGVkIHdpdGggd2hhdCBmb2xsb3dzLgotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYWdlLWRlbGltaXRlcikgIl5cXDxcXHxeXGYiKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICd2ZXJzaW9uLWNvbnRyb2wpICduZXZlcikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnYWRhcHRpdmUtZmlsbC1yZWdleHApICJcXHMgKiIpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2ZvbnQtbG9jay1kZWZhdWx0cykKLSAgICAgICAnKGNoYW5nZS1sb2ctZm9udC1sb2NrLWtleXdvcmRzIHQpKQotICAocnVuLWhvb2tzICdjaGFuZ2UtbG9nLW1vZGUtaG9vaykpCi0KLTs7IEl0IG1pZ2h0IGJlIG5pY2UgdG8gaGF2ZSBhIGdlbmVyYWwgZmVhdHVyZSB0byByZXBsYWNlIHRoaXMuICBUaGUgaWRlYSBJCi07OyBoYXZlIGlzIGEgdmFyaWFibGUgZ2l2aW5nIGEgcmVnZXhwIG1hdGNoaW5nIHRleHQgd2hpY2ggc2hvdWxkIG5vdCBiZQotOzsgbW92ZWQgZnJvbSBib2wgYnkgZmlsbGluZy4gIGNoYW5nZS1sb2ctbW9kZSB3b3VsZCBzZXQgdGhpcyB0byAiXlxccyAqXFxzKCIuCi07OyBCdXQgSSBkb24ndCBmZWVsIHVwIHRvIGltcGxlbWVudGluZyB0aGF0IHRvZGF5LgotKGRlZnVuIGNoYW5nZS1sb2ctZmlsbC1wYXJhZ3JhcGggKCZvcHRpb25hbCBqdXN0aWZ5KQotICAiRmlsbCB0aGUgcGFyYWdyYXBoLCBidXQgcHJlc2VydmUgb3BlbiBwYXJlbnRoZXNlcyBhdCBiZWdpbm5pbmcgb2YgbGluZXMuCi1QcmVmaXggYXJnIG1lYW5zIGp1c3RpZnkgYXMgd2VsbC4iCi0gIChpbnRlcmFjdGl2ZSAiUCIpCi0gIChsZXQgKChlbmQgKHNhdmUtZXhjdXJzaW9uIChmb3J3YXJkLXBhcmFncmFwaCkgKHBvaW50KSkpCi0JKGJlZyAoc2F2ZS1leGN1cnNpb24gKGJhY2t3YXJkLXBhcmFncmFwaCkocG9pbnQpKSkKLQkocGFyYWdyYXBoLXN0YXJ0IChjb25jYXQgcGFyYWdyYXBoLXN0YXJ0ICJcXHxcXHMgKlxccygiKSkpCi0gICAgKGZpbGwtcmVnaW9uIGJlZyBlbmQganVzdGlmeSkpKQotDAotKGRlZnZhciBhZGQtbG9nLWN1cnJlbnQtZGVmdW4taGVhZGVyLXJlZ2V4cAotICAiXlxcKFtBLVpdW0EtWl8gXSpbQS1aX11cXHxbLV9hLXpBLVpdK1xcKVsgXHRdKls6PV0iCi0gICIqSGV1cmlzdGljIHJlZ2V4cCB1c2VkIGJ5IGBhZGQtbG9nLWN1cnJlbnQtZGVmdW4nIGZvciB1bmtub3duIG1ham9yIG1vZGVzLiIpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gYWRkLWxvZy1jdXJyZW50LWRlZnVuICgpCi0gICJSZXR1cm4gbmFtZSBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIHBvaW50IGlzIGluLCBvciBuaWwuCi0KLVVuZGVyc3RhbmRzIEMsIExpc3AsIExhVGVYIChcImZ1bmN0aW9uc1wiIGFyZSBjaGFwdGVycywgc2VjdGlvbnMsIC4uLiksCi1UZXhpbmZvIChAbm9kZSB0aXRsZXMpLCBQZXJsLCBhbmQgRm9ydHJhbi4KLQotT3RoZXIgbW9kZXMgYXJlIGhhbmRsZWQgYnkgYSBoZXVyaXN0aWMgdGhhdCBsb29rcyBpbiB0aGUgMTBLIGJlZm9yZQotcG9pbnQgZm9yIHVwcGVyY2FzZSBoZWFkaW5ncyBzdGFydGluZyBpbiB0aGUgZmlyc3QgY29sdW1uIG9yCi1pZGVudGlmaWVycyBmb2xsb3dlZCBieSBgOicgb3IgYD0nLCBzZWUgdmFyaWFibGUKLWBhZGQtbG9nLWN1cnJlbnQtZGVmdW4taGVhZGVyLXJlZ2V4cCcuCi0KLUhhcyBhIHByZWZlcmVuY2Ugb2YgbG9va2luZyBiYWNrd2FyZHMuIgotICAoY29uZGl0aW9uLWNhc2UgbmlsCi0gICAgICAoc2F2ZS1leGN1cnNpb24KLQkobGV0ICgobG9jYXRpb24gKHBvaW50KSkpCi0JICAoY29uZCAoKG1lbXEgbWFqb3ItbW9kZSAnKGVtYWNzLWxpc3AtbW9kZSBsaXNwLW1vZGUgc2NoZW1lLW1vZGUKLQkJCQkJCSAgICBsaXNwLWludGVyYWN0aW9uLW1vZGUpKQotCQkgOzsgSWYgd2UgYXJlIG5vdyBwcmVjaXNlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGRlZnVuLAotCQkgOzsgbWFrZSBzdXJlIGJlZ2lubmluZy1vZi1kZWZ1biBmaW5kcyB0aGF0IG9uZQotCQkgOzsgcmF0aGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZS4KLQkJIChvciAoZW9icCkgKGZvcndhcmQtY2hhciAxKSkKLQkJIChiZWdpbm5pbmctb2YtZGVmdW4pCi0JCSA7OyBNYWtlIHN1cmUgd2UgYXJlIHJlYWxseSBpbnNpZGUgdGhlIGRlZnVuIGZvdW5kLCBub3QgYWZ0ZXIgaXQuCi0JCSAoaWYgKGFuZCAobG9va2luZy1hdCAiXFxzKCIpCi0JCQkgIChwcm9nbiAoZW5kLW9mLWRlZnVuKQotCQkJCSAoPCBsb2NhdGlvbiAocG9pbnQpKSkKLQkJCSAgKHByb2duIChmb3J3YXJkLXNleHAgLTEpCi0JCQkJICg+PSBsb2NhdGlvbiAocG9pbnQpKSkpCi0JCSAgICAgKHByb2duCi0JCSAgICAgICAoaWYgKGxvb2tpbmctYXQgIlxccygiKQotCQkJICAgKGZvcndhcmQtY2hhciAxKSkKLQkJICAgICAgIChmb3J3YXJkLXNleHAgMSkKLQkJICAgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIiAnIikKLQkJICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKLQkJCQkJIChwcm9nbiAoZm9yd2FyZC1zZXhwIDEpIChwb2ludCkpKSkpKQotCQkoKGFuZCAobWVtcSBtYWpvci1tb2RlICcoYy1tb2RlIGMrKy1tb2RlIGMrKy1jLW1vZGUgb2JqYy1tb2RlKSkKLQkJICAgICAgKHNhdmUtZXhjdXJzaW9uIChiZWdpbm5pbmctb2YtbGluZSkKLQkJCQkgICAgICA7OyBVc2UgZXEgaW5zdGVhZCBvZiA9IGhlcmUgdG8gYXZvaWQKLQkJCQkgICAgICA7OyBlcnJvciB3aGVuIGF0IGJvYiBhbmQgY2hhci1hZnRlcgotCQkJCSAgICAgIDs7IHJldHVybnMgbmlsLgotCQkJCSAgICAgICh3aGlsZSAoZXEgKGNoYXItYWZ0ZXIgKC0gKHBvaW50KSAyKSkgP1xcKQotCQkJCQkoZm9yd2FyZC1saW5lIC0xKSkKLQkJCQkgICAgICAobG9va2luZy1hdCAiWyBcdF0qI1sgXHRdKmRlZmluZVsgXHRdIikpKQotCQkgOzsgSGFuZGxlIGEgQyBtYWNybyBkZWZpbml0aW9uLgotCQkgKGJlZ2lubmluZy1vZi1saW5lKQotCQkgKHdoaWxlIChlcSAoY2hhci1hZnRlciAoLSAocG9pbnQpIDIpKSA/XFwpIDtub3QgPTsgbm90ZSBhYm92ZQotCQkgICAoZm9yd2FyZC1saW5lIC0xKSkKLQkJIChzZWFyY2gtZm9yd2FyZCAiZGVmaW5lIikKLQkJIChza2lwLWNoYXJzLWZvcndhcmQgIiBcdCIpCi0JCSAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCi0JCQkJICAgKHByb2duIChmb3J3YXJkLXNleHAgMSkgKHBvaW50KSkpKQotCQkoKG1lbXEgbWFqb3ItbW9kZSAnKGMtbW9kZSBjKystbW9kZSBjKystYy1tb2RlIG9iamMtbW9kZSkpCi0JCSAoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCSA7OyBTZWUgaWYgd2UgYXJlIGluIHRoZSBiZWdpbm5pbmcgcGFydCBvZiBhIGZ1bmN0aW9uLAotCQkgOzsgYmVmb3JlIHRoZSBvcGVuIGJyYWNlLiAgSWYgc28sIGFkdmFuY2UgZm9yd2FyZC4KLQkJICh3aGlsZSAobm90IChsb29raW5nLWF0ICJ7XFx8XFwoXFxzICokXFwpIikpCi0JCSAgIChmb3J3YXJkLWxpbmUgMSkpCi0JCSAob3IgKGVvYnApCi0JCSAgICAgKGZvcndhcmQtY2hhciAxKSkKLQkJIChiZWdpbm5pbmctb2YtZGVmdW4pCi0JCSAoaWYgKHByb2duIChlbmQtb2YtZGVmdW4pCi0JCQkgICAgKDwgbG9jYXRpb24gKHBvaW50KSkpCi0JCSAgICAgKHByb2duCi0JCSAgICAgICAoYmFja3dhcmQtc2V4cCAxKQotCQkgICAgICAgKGxldCAoYmVnIHRlbSkKLQotCQkJIChmb3J3YXJkLWxpbmUgLTEpCi0JCQkgOzsgU2tpcCBiYWNrIG92ZXIgdHlwZWRlZnMgb2YgYXJnbGlzdC4KLQkJCSAod2hpbGUgKGFuZCAobm90IChib2JwKSkKLQkJCQkgICAgIChsb29raW5nLWF0ICJbIFx0XG5dIikpCi0JCQkgICAoZm9yd2FyZC1saW5lIC0xKSkKLQkJCSA7OyBTZWUgaWYgdGhpcyBpcyB1c2luZyB0aGUgREVGVU4gbWFjcm8gdXNlZCBpbiBFbWFjcywKLQkJCSA7OyBvciB0aGUgREVGVU4gbWFjcm8gdXNlZCBieSB0aGUgQyBsaWJyYXJ5LgotCQkJIChpZiAoY29uZGl0aW9uLWNhc2UgbmlsCi0JCQkJIChhbmQgKHNhdmUtZXhjdXJzaW9uCi0JCQkJCShlbmQtb2YtbGluZSkKLQkJCQkJKHdoaWxlICg9IChwcmVjZWRpbmctY2hhcikgP1xcKQotCQkJCQkgIChlbmQtb2YtbGluZSAyKSkKLQkJCQkJKGJhY2t3YXJkLXNleHAgMSkKLQkJCQkJKGJlZ2lubmluZy1vZi1saW5lKQotCQkJCQkoc2V0cSB0ZW0gKHBvaW50KSkKLQkJCQkJKGxvb2tpbmctYXQgIkRFRlVOXFxiIikpCi0JCQkJICAgICAgKD49IGxvY2F0aW9uIHRlbSkpCi0JCQkgICAgICAgKGVycm9yIG5pbCkpCi0JCQkgICAgIChwcm9nbgotCQkJICAgICAgIChnb3RvLWNoYXIgdGVtKQotCQkJICAgICAgIChkb3duLWxpc3QgMSkKLQkJCSAgICAgICAoaWYgKD0gKGNoYXItYWZ0ZXIgKHBvaW50KSkgP1wiKQotCQkJCSAgIChwcm9nbgotCQkJCSAgICAgKGZvcndhcmQtc2V4cCAxKQotCQkJCSAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiICwiKSkpCi0JCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotCQkJCQkJIChwcm9nbiAoZm9yd2FyZC1zZXhwIDEpIChwb2ludCkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAobG9va2luZy1hdCAiXlsrLV0iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtbWV0aG9kLWRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IE9yZGluYXJ5IEMgZnVuY3Rpb24gc3ludGF4LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBiZWcgKHBvaW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChhbmQgKGNvbmRpdGlvbi1jYXNlIG5pbAotCQkJCQkgIDs7IFByb3RlY3QgYWdhaW5zdCAiVW5iYWxhbmNlZCBwYXJlbnMiIGVycm9yLgotCQkJCQkgIChwcm9nbgotCQkJCQkgICAgKGRvd24tbGlzdCAxKSA7IGludG8gYXJnbGlzdAotCQkJCQkgICAgKGJhY2t3YXJkLXVwLWxpc3QgMSkKLQkJCQkJICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKQotCQkJCQkgICAgdCkKLQkJCQkJKGVycm9yIG5pbCkpCi0JCQkJICAgICAgOzsgVmVyaWZ5IGluaXRpYWwgcG9zIHdhcyBhZnRlcgotCQkJCSAgICAgIDs7IHJlYWwgc3RhcnQgb2YgZnVuY3Rpb24uCi0JCQkJICAgICAgKHNhdmUtZXhjdXJzaW9uCi0JCQkJCShnb3RvLWNoYXIgYmVnKQotCQkJCQk7OyBGb3IgdGhpcyBwdXJwb3NlLCBpbmNsdWRlIHRoZSBsaW5lCi0JCQkJCTs7IHRoYXQgaGFzIHRoZSBkZWNsIGtleXdvcmRzLiAgVGhpcwotCQkJCQk7OyBtYXkgYWxzbyBpbmNsdWRlIHNvbWUgb2YgdGhlCi0JCQkJCTs7IGNvbW1lbnRzIGJlZm9yZSB0aGUgZnVuY3Rpb24uCi0JCQkJCSh3aGlsZSAoYW5kIChub3QgKGJvYnApKQotCQkJCQkJICAgIChzYXZlLWV4Y3Vyc2lvbgotCQkJCQkJICAgICAgKGZvcndhcmQtbGluZSAtMSkKLQkJCQkJCSAgICAgIChsb29raW5nLWF0ICJbXlxuXGZdIikpKQotCQkJCQkgIChmb3J3YXJkLWxpbmUgLTEpKQotCQkJCQkoPj0gbG9jYXRpb24gKHBvaW50KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBDb25zaXN0ZW5jeSBjaGVjazogZ29pbmcgZG93biBhbmQgdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHNob3VsZG4ndCB0YWtlIHVzIGJhY2sgYmVmb3JlIEJFRy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg+IChwb2ludCkgYmVnKSkKLQkJCQkgKGxldCAoZW5kIG1pZGRsZSkKLQkJCQkgICA7OyBEb24ndCBpbmNsdWRlIGFueSBmaW5hbCBuZXdsaW5lCi0JCQkJICAgOzsgaW4gdGhlIG5hbWUgd2UgdXNlLgotCQkJCSAgIChpZiAoPSAocHJlY2VkaW5nLWNoYXIpID9cbikKLQkJCQkgICAgICAgKGZvcndhcmQtY2hhciAtMSkpCi0JCQkJICAgKHNldHEgZW5kIChwb2ludCkpCi0JCQkJICAgKGJhY2t3YXJkLXNleHAgMSkKLQkJCQkgICA7OyBOb3cgZmluZCB0aGUgcmlnaHQgYmVnaW5uaW5nIG9mIHRoZSBuYW1lLgotCQkJCSAgIDs7IEluY2x1ZGUgY2VydGFpbiBrZXl3b3JkcyBpZiB0aGV5Ci0JCQkJICAgOzsgcHJlY2VkZSB0aGUgbmFtZS4KLQkJCQkgICAoc2V0cSBtaWRkbGUgKHBvaW50KSkKLQkJCQkgICAoZm9yd2FyZC13b3JkIC0xKQotCQkJCSAgIDs7IElnbm9yZSB0aGVzZSBzdWJwYXJ0cyBvZiBhIGNsYXNzIGRlY2wKLQkJCQkgICA7OyBhbmQgbW92ZSBiYWNrIHRvIHRoZSBjbGFzcyBuYW1lIGl0c2VsZi4KLQkJCQkgICAod2hpbGUgKGxvb2tpbmctYXQgInB1YmxpYyBcXHxwcml2YXRlICIpCi0JCQkJICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0OiIpCi0JCQkJICAgICAoc2V0cSBlbmQgKHBvaW50KSkKLQkJCQkgICAgIChiYWNrd2FyZC1zZXhwIDEpCi0JCQkJICAgICAoc2V0cSBtaWRkbGUgKHBvaW50KSkKLQkJCQkgICAgIChmb3J3YXJkLXdvcmQgLTEpKQotCQkJCSAgIChhbmQgKGJvbHApCi0JCQkJCShsb29raW5nLWF0ICJzdHJ1Y3QgXFx8dW5pb24gXFx8Y2xhc3MgIikKLQkJCQkJKHNldHEgbWlkZGxlIChwb2ludCkpKQotCQkJCSAgIChidWZmZXItc3Vic3RyaW5nIG1pZGRsZSBlbmQpKSkpKSkpKSkKLQkJKChtZW1xIG1ham9yLW1vZGUKLQkJICAgICAgICcoVGVYLW1vZGUgcGxhaW4tVGVYLW1vZGUgTGFUZVgtbW9kZTs7IHRleC1tb2RlLmVsCi0JCQkJICBwbGFpbi10ZXgtbW9kZSBsYXRleC1tb2RlOzsgY211dGV4LmVsCi0JCQkJICApKQotCQkgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQKLQkJICAgICAgIlxcXFxcXChzdWJcXCkqXFwoc2VjdGlvblxcfHBhcmFncmFwaFxcfGNoYXB0ZXJcXCkiIG5pbCB0KQotCQkgICAgIChwcm9nbgotCQkgICAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQotCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKDErIChwb2ludCkpOzsgd2l0aG91dCBpbml0aWFsIGJhY2tzbGFzaAotCQkJCQkgKHByb2duCi0JCQkJCSAgIChlbmQtb2YtbGluZSkKLQkJCQkJICAgKHBvaW50KSkpKSkpCi0JCSgoZXEgbWFqb3ItbW9kZSAndGV4aW5mby1tb2RlKQotCQkgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgIl5Abm9kZVsgXHRdK1xcKFteLFxuXStcXCkiIG5pbCB0KQotCQkgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkgICAgICAgKG1hdGNoLWVuZCAxKSkpKQotCQkoKGVxIG1ham9yLW1vZGUgJ3BlcmwtbW9kZSkKLQkJIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkICJec3ViWyBcdF0rXFwoW14gXHRcbl0rXFwpIiBuaWwgdCkKLQkJICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCi0JCQkJICAgICAgIChtYXRjaC1lbmQgMSkpKSkKLSAgICAgICAgICAgICAgICAoKGVxIG1ham9yLW1vZGUgJ2ZvcnRyYW4tbW9kZSkKLSAgICAgICAgICAgICAgICAgOzsgbXVzdCBiZSBpbnNpZGUgZnVuY3Rpb24gYm9keSBmb3IgdGhpcyB0byB3b3JrCi0gICAgICAgICAgICAgICAgIChiZWdpbm5pbmctb2YtZm9ydHJhbi1zdWJwcm9ncmFtKQotICAgICAgICAgICAgICAgICAobGV0ICgoY2FzZS1mb2xkLXNlYXJjaCB0KSkgOyBjYXNlLWluc2Vuc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgOzsgc2VhcmNoIGZvciBmb3J0cmFuIHN1YnByb2dyYW0gc3RhcnQKLSAgICAgICAgICAgICAgICAgICAoaWYgKHJlLXNlYXJjaC1mb3J3YXJkCi0JCQkgIl5bIFx0XSpcXChwcm9ncmFtXFx8c3Vicm91dGluZVxcfGZ1bmN0aW9uXAotXFx8WyBcdGEtejAtOSpdKlsgXHRdK2Z1bmN0aW9uXFwpIgotCQkJIG5pbCB0KQotICAgICAgICAgICAgICAgICAgICAgICAocHJvZ24KLSAgICAgICAgICAgICAgICAgICAgICAgICA7OyBtb3ZlIHRvIEVPTCBvciBiZWZvcmUgZmlyc3QgbGVmdCBwYXJlbgotICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQgIlsoXG5dIiBuaWwgdCkKLQkJCSAgICAgKHByb2duIChmb3J3YXJkLWNoYXIgLTEpCi0JCQkJICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKSkKLQkJCSAgIChlbmQtb2YtbGluZSkpCi0JCQkgOzsgVXNlIHRoZSBuYW1lIHByZWNlZGluZyB0aGF0LgotICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZ24gKGZvcndhcmQtc2V4cCAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50KSkpKSkpKQotCQkodAotCQkgOzsgSWYgYWxsIGVsc2UgZmFpbHMsIHRyeSBoZXVyaXN0aWNzCi0JCSAobGV0IChjYXNlLWZvbGQtc2VhcmNoKQotCQkgICAoZW5kLW9mLWxpbmUpCi0JCSAgIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1oZWFkZXItcmVnZXhwCi0JCQkJCSAgICgtIChwb2ludCkgMTAwMDApCi0JCQkJCSAgIHQpCi0JCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCi0JCQkJCSAobWF0Y2gtZW5kIDEpKSkpKSkpKQotICAgIChlcnJvciBuaWwpKSkKLQotKGRlZnZhciBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQpCi0KLTs7IFN1YnJvdXRpbmUgdXNlZCB3aXRoaW4gZ2V0LW1ldGhvZC1kZWZpbml0aW9uLgotOzsgQWRkIHRoZSBsYXN0IG1hdGNoIGluIHRoZSBidWZmZXIgdG8gdGhlIGVuZCBvZiBgbWQnLAotOzsgZm9sbG93ZWQgYnkgdGhlIHN0cmluZyBFTkQ7IG1vdmUgdG8gdGhlIGVuZCBvZiB0aGF0IG1hdGNoLgotKGRlZnVuIGdldC1tZXRob2QtZGVmaW5pdGlvbi0xIChlbmQpCi0gIChzZXRxIGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZAotCShjb25jYXQgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kIAotCQkoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpCi0JCWVuZCkpCi0gIChnb3RvLWNoYXIgKG1hdGNoLWVuZCAwKSkpCi0KLTs7IEZvciBvYmplY3RpdmUgQywgcmV0dXJuIHRoZSBtZXRob2QgbmFtZSBpZiB3ZSBhcmUgaW4gYSBtZXRob2QuCi0oZGVmdW4gZ2V0LW1ldGhvZC1kZWZpbml0aW9uICgpCi0gIChsZXQgKChnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQgIlsiKSkKLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkICJeQGltcGxlbWVudGF0aW9uXFxzLSpcXChbQS1aYS16X10qXFwpIiBuaWwgdCkKLQkgIChnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAiICIpKSkKLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgIChjb25kCi0gICAgICAgKChyZS1zZWFyY2gtZm9yd2FyZCAiXlxcKFstK11cXClbIFx0XG5cZlxyXSpcXCgoW14pXSopXFwpP1xccy0qIiBuaWwgdCkKLQkoZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgIiIpCi0JKHdoaWxlIChub3QgKGxvb2tpbmctYXQgIlt7O10iKSkKLQkgIChsb29raW5nLWF0Ci0JICAgIlxcKFtBLVphLXpfXSo6P1xcKVxccy0qXFwoKFteKV0qKVxcKT9bQS1aYS16X10qWyBcdFxuXGZccl0qIikKLQkgIChnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAiIikpCi0JKGNvbmNhdCBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQgIl0iKSkpKSkpCi0KLQotKHByb3ZpZGUgJ2FkZC1sb2cpCi0KLTs7OyBhZGQtbG9nLmVsIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvZXRjL2FkZC1sb2cudmkgYi9ldGMvYWRkLWxvZy52aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiOGM3Ny4uMDAwMDAwMAotLS0gYS9ldGMvYWRkLWxvZy52aQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC5laW4gYi9ldGMvY29uZmlnYnVpbGQuZWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTBlMjE0Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC5laW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotJSFQUy1BZG9iZS0yLjAgRVBTRi0yLjAKLSUlVGl0bGU6IGNvbmZpZ2J1aWxkLmZpZwotJSVDcmVhdG9yOiBmaWcyZGV2IFZlcnNpb24gMy4xIFBhdGNobGV2ZWwgMQotJSVDcmVhdGlvbkRhdGU6IEZyaSBKdW4gMTIgMjA6MTM6MTYgMTk5OAotJSVGb3I6IGlhbkB0aXRvLmN5Z251cy5jb20gKElhbiBMYW5jZSBUYXlsb3IpCi0lJU9yaWVudGF0aW9uOiBQb3J0cmFpdAotJSVCb3VuZGluZ0JveDogMCAwIDMyMiAxNzMKLSUlUGFnZXM6IDAKLSUlQmVnaW5TZXR1cAotJSVJbmNsdWRlRmVhdHVyZTogKlBhZ2VTaXplIExldHRlcgotJSVFbmRTZXR1cAotJSVFbmRDb21tZW50cwotLyRGMnBzRGljdCAyMDAgZGljdCBkZWYKLSRGMnBzRGljdCBiZWdpbgotJEYycHNEaWN0IC9tdHJ4IG1hdHJpeCBwdXQKLS9jb2wtMSB7fSBkZWYKLS9jb2wwIHswLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEgezAuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMiB7MC4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wzIHswLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDQgezEuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNSB7MS4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w2IHsxLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDcgezEuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sOCB7MC4wMDAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2w5IHswLjAwMCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDEwIHswLjAwMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDExIHswLjUzMCAwLjgxMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEyIHswLjAwMCAwLjU2MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEzIHswLjAwMCAwLjY5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE0IHswLjAwMCAwLjgyMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE1IHswLjAwMCAwLjU2MCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDE2IHswLjAwMCAwLjY5MCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDE3IHswLjAwMCAwLjgyMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDE4IHswLjU2MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE5IHswLjY5MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIwIHswLjgyMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIxIHswLjU2MCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDIyIHswLjY5MCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDIzIHswLjgyMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDI0IHswLjUwMCAwLjE5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI1IHswLjYzMCAwLjI1MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI2IHswLjc1MCAwLjM4MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI3IHsxLjAwMCAwLjUwMCAwLjUwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI4IHsxLjAwMCAwLjYzMCAwLjYzMCBzcmdifSBiaW5kIGRlZgotL2NvbDI5IHsxLjAwMCAwLjc1MCAwLjc1MCBzcmdifSBiaW5kIGRlZgotL2NvbDMwIHsxLjAwMCAwLjg4MCAwLjg4MCBzcmdifSBiaW5kIGRlZgotL2NvbDMxIHsxLjAwMCAwLjg0MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotCi1lbmQKLXNhdmUKLS02Mi4wIDIyNi4wIHRyYW5zbGF0ZQotMSAtMSBzY2FsZQotCi0vY2xwIHtjbG9zZXBhdGh9IGJpbmQgZGVmCi0vZWYge2VvZmlsbH0gYmluZCBkZWYKLS9nciB7Z3Jlc3RvcmV9IGJpbmQgZGVmCi0vZ3Mge2dzYXZlfSBiaW5kIGRlZgotL2wge2xpbmV0b30gYmluZCBkZWYKLS9tIHttb3ZldG99IGJpbmQgZGVmCi0vbiB7bmV3cGF0aH0gYmluZCBkZWYKLS9zIHtzdHJva2V9IGJpbmQgZGVmCi0vc2xjIHtzZXRsaW5lY2FwfSBiaW5kIGRlZgotL3NsaiB7c2V0bGluZWpvaW59IGJpbmQgZGVmCi0vc2x3IHtzZXRsaW5ld2lkdGh9IGJpbmQgZGVmCi0vc3JnYiB7c2V0cmdiY29sb3J9IGJpbmQgZGVmCi0vcm90IHtyb3RhdGV9IGJpbmQgZGVmCi0vc2Mge3NjYWxlfSBiaW5kIGRlZgotL3RyIHt0cmFuc2xhdGV9IGJpbmQgZGVmCi0vdG50IHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvcgotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZCBzcmdifQotICBiaW5kIGRlZgotL3NoZCB7ZHVwIGR1cCBjdXJyZW50cmdiY29sb3IgNCAtMiByb2xsIG11bCA0IC0yIHJvbGwgbXVsCi0gIDQgLTIgcm9sbCBtdWwgc3JnYn0gYmluZCBkZWYKLS8kRjJwc0JlZ2luIHskRjJwc0RpY3QgYmVnaW4gLyRGMnBzRW50ZXJlZFN0YXRlIHNhdmUgZGVmfSBkZWYKLS8kRjJwc0VuZCB7JEYycHNFbnRlcmVkU3RhdGUgcmVzdG9yZSBlbmR9IGRlZgotJSVFbmRQcm9sb2cKLQotJEYycHNCZWdpbgotMTAgc2V0bWl0ZXJsaW1pdAotIDAuMDYwMDAgMC4wNjAwMCBzYwotNy41MDAgc2x3Ci0lIFBvbHlsaW5lCi1uIDEwNTAgOTAwIG0gMjEwMCA5MDAgbCAgMjEwMCAxNDI1IGwgIDEwNTAgMTQyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDE1MDAgMTQyNSBtIDE1MDAgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxNTMwLjAwIDE5ODAuMDAgbSAxNTAwLjAwIDIxMDAuMDAgbCAxNDcwLjAwIDE5ODAuMDAgbCAgMTUwMC41MCAxOTgwLjUwIGwgMTUzMC4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDE1MDAgMjYyNSBtIDE1MDAgMzMwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxNTMwLjAwIDMxODAuMDAgbSAxNTAwLjAwIDMzMDAuMDAgbCAxNDcwLjAwIDMxODAuMDAgbCAgMTUwMC41MCAzMTgwLjUwIGwgMTUzMC4wMCAzMTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDI5MjUgOTAwIG0gMzgyNSA5MDAgbCAgMzgyNSAxNDI1IGwgIDI5MjUgMTQyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDExNTUgMjEwMCBtIDEwNTAgMjEwMCAxMDUwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDEwNTAgMjYyNSAyMjIwIDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDIzMjUgMjYyNSAyMzI1IDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDIzMjUgMjEwMCAxMTU1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMjg1MCAyMTAwIG0gNDEyNSAyMTAwIGwgIDQxMjUgMjYyNSBsICAyODUwIDI2MjUgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzMzc1IDE0MjUgbSAzMzc1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzQwNS4wMCAxOTgwLjAwIG0gMzM3NS4wMCAyMTAwLjAwIGwgMzM0NS4wMCAxOTgwLjAwIGwgIDMzNzUuNTAgMTk4MC41MCBsIDM0MDUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA1MTAwIDkwMCBtIDYzMDAgOTAwIGwgIDYzMDAgMTM1MCBsICA1MTAwIDEzNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA1NjI1IDEzNTAgbSA1NjI1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNTY1NS4wMCAxOTgwLjAwIG0gNTYyNS4wMCAyMTAwLjAwIGwgNTU5NS4wMCAxOTgwLjAwIGwgIDU2MjUuNTAgMTk4MC41MCBsIDU2NTUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA1MjA1IDIxMDAgbSA1MTAwIDIxMDAgNTEwMCAyNTIwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA1MTAwIDI2MjUgNjI3MCAyNjI1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA2Mzc1IDI2MjUgNjM3NSAyMjA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA2Mzc1IDIxMDAgNTIwNSAyMTAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU2MjUgMjYyNSBtIDU2MjUgMzMwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NjU1LjAwIDMxODAuMDAgbSA1NjI1LjAwIDMzMDAuMDAgbCA1NTk1LjAwIDMxODAuMDAgbCAgNTYyNS41MCAzMTgwLjUwIGwgNTY1NS4wMCAzMTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDUxMDAgMzMwMCBtIDYyMjUgMzMwMCBsICA2MjI1IDM3NTAgbCAgNTEwMCAzNzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLQlbMSA1MC4wXSA1MC4wMDAwMDAgc2V0ZGFzaAotbiAyODUwIDI0MDAgbSAyMzI1IDI0MDAgbCAgZ3MgY29sLTEgcyBnciAJW10gMCBzZXRkYXNoCi1uIDI0NDUuMDAgMjQzMC4wMCBtIDIzMjUuMDAgMjQwMC4wMCBsIDI0NDUuMDAgMjM3MC4wMCBsICAyNDQ1LjUwIDI0MDAuNTAgbCAyNDQ1LjAwIDI0MzAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLQlbMSA1MC4wXSA1MC4wMDAwMDAgc2V0ZGFzaAotbiA0MTI1IDI0MDAgbSA1MTAwIDI0MDAgbCAgZ3MgY29sLTEgcyBnciAJW10gMCBzZXRkYXNoCi1uIDQ5ODAuMDAgMjM3MC4wMCBtIDUxMDAuMDAgMjQwMC4wMCBsIDQ5ODAuMDAgMjQzMC4wMCBsICA0OTgwLjUwIDI0MDAuNTAgbCA0OTgwLjAwIDIzNzAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTA1MCAzMzAwIG0gMTk1MCAzMzAwIGwgIDE5NTAgMzc1MCBsICAxMDUwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZ3VyZSkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCAyNDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5zdGF0dXMpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMjQwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuc3RhdHVzKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDM2MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLmgpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTUyNTAgMTIwMCBtCi1ncyAxIC0xIHNjIChNYWtlZmlsZS5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTI1MCAyNDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5zdGF0dXMpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTUyNTAgMzYwMCBtCi1ncyAxIC0xIHNjIChNYWtlZmlsZSkgY29sLTEgc2hvdyBncgotJEYycHNFbmQKLXJlc3RvcmUKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC5maWcgYi9ldGMvY29uZmlnYnVpbGQuZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc1OTJkLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC5maWcKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jRklHIDMuMQotUG9ydHJhaXQKLUNlbnRlcgotSW5jaGVzCi0xMjAwIDIKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMTA1MCA5MDAgMjEwMCA5MDAgMjEwMCAxNDI1IDEwNTAgMTQyNSAxMDUwIDkwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTUwMCAxNDI1IDE1MDAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTUwMCAyNjI1IDE1MDAgMzMwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAyOTI1IDkwMCAzODI1IDkwMCAzODI1IDE0MjUgMjkyNSAxNDI1IDI5MjUgOTAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDIzMjUgMjYyNSAyMzI1IDIxMDAgMTA1MCAyMTAwIDEwNTAgMjYyNSAyMzI1IDI2MjUKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMjg1MCAyMTAwIDQxMjUgMjEwMCA0MTI1IDI2MjUgMjg1MCAyNjI1IDI4NTAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzM3NSAxNDI1IDMzNzUgMjEwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1MTAwIDkwMCA2MzAwIDkwMCA2MzAwIDEzNTAgNTEwMCAxMzUwIDUxMDAgOTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA1NjI1IDEzNTAgNTYyNSAyMTAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDYzNzUgMjYyNSA2Mzc1IDIxMDAgNTEwMCAyMTAwIDUxMDAgMjYyNSA2Mzc1IDI2MjUKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDU2MjUgMjYyNSA1NjI1IDMzMDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgNTEwMCAzMzAwIDYyMjUgMzMwMCA2MjI1IDM3NTAgNTEwMCAzNzUwIDUxMDAgMzMwMAotMiAxIDIgMSAtMSA3IDAgMCAtMSAzLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMjg1MCAyNDAwIDIzMjUgMjQwMAotMiAxIDIgMSAtMSA3IDAgMCAtMSAzLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDEyNSAyNDAwIDUxMDAgMjQwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAxMDUwIDMzMDAgMTk1MCAzMzAwIDE5NTAgMzc1MCAxMDUwIDM3NTAgMTA1MCAzMzAwCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDY0NSAxMjAwIDEyMDAgY29uZmlnLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA3MDUgMzAwMCAxMjAwIGNvbmZpZ3VyZVwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgOTkwIDMwMDAgMjQwMCBjb25maWcuc3RhdHVzXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA5OTAgMTIwMCAyNDAwIGNvbmZpZy5zdGF0dXNcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDYwMCAxMjAwIDM2MDAgY29uZmlnLmhcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDg1NSA1MjUwIDEyMDAgTWFrZWZpbGUuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDk5MCA1MjUwIDI0MDAgY29uZmlnLnN0YXR1c1wwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgNjc1IDUyNTAgMzYwMCBNYWtlZmlsZVwwMDEKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC5qaW4gYi9ldGMvY29uZmlnYnVpbGQuamluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGNkOTM5Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC5qaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnYnVpbGQudGluIGIvZXRjL2NvbmZpZ2J1aWxkLnRpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkZDZmZS4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnYnVpbGQudGluCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gICBjb25maWcuaW4gICAgICAgICpjb25maWd1cmUqICAgICAgTWFrZWZpbGUuaW4KLSAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICAgKmNvbmZpZy5zdGF0dXMqPD09PT09PSs9PT09PT09PT09Pipjb25maWcuc3RhdHVzKgotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKLSAgIGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi5laW4gYi9ldGMvY29uZmlnZGV2LmVpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4Mzc4NS4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LmVpbgorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0lIVBTLUFkb2JlLTIuMCBFUFNGLTIuMAotJSVUaXRsZTogY29uZmlnZGV2LmZpZwotJSVDcmVhdG9yOiBmaWcyZGV2IFZlcnNpb24gMy4xIFBhdGNobGV2ZWwgMQotJSVDcmVhdGlvbkRhdGU6IE1vbiBKdW4gMTUgMTc6MzU6MTkgMTk5OAotJSVGb3I6IGlhbkB0aXRvLmN5Z251cy5jb20gKElhbiBMYW5jZSBUYXlsb3IpCi0lJU9yaWVudGF0aW9uOiBQb3J0cmFpdAotJSVCb3VuZGluZ0JveDogMCAwIDM0NCAzMTcKLSUlUGFnZXM6IDAKLSUlQmVnaW5TZXR1cAotJSVJbmNsdWRlRmVhdHVyZTogKlBhZ2VTaXplIExldHRlcgotJSVFbmRTZXR1cAotJSVFbmRDb21tZW50cwotLyRGMnBzRGljdCAyMDAgZGljdCBkZWYKLSRGMnBzRGljdCBiZWdpbgotJEYycHNEaWN0IC9tdHJ4IG1hdHJpeCBwdXQKLS9jb2wtMSB7fSBkZWYKLS9jb2wwIHswLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEgezAuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMiB7MC4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wzIHswLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDQgezEuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNSB7MS4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w2IHsxLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDcgezEuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sOCB7MC4wMDAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2w5IHswLjAwMCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDEwIHswLjAwMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDExIHswLjUzMCAwLjgxMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEyIHswLjAwMCAwLjU2MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEzIHswLjAwMCAwLjY5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE0IHswLjAwMCAwLjgyMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE1IHswLjAwMCAwLjU2MCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDE2IHswLjAwMCAwLjY5MCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDE3IHswLjAwMCAwLjgyMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDE4IHswLjU2MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE5IHswLjY5MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIwIHswLjgyMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIxIHswLjU2MCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDIyIHswLjY5MCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDIzIHswLjgyMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDI0IHswLjUwMCAwLjE5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI1IHswLjYzMCAwLjI1MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI2IHswLjc1MCAwLjM4MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI3IHsxLjAwMCAwLjUwMCAwLjUwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI4IHsxLjAwMCAwLjYzMCAwLjYzMCBzcmdifSBiaW5kIGRlZgotL2NvbDI5IHsxLjAwMCAwLjc1MCAwLjc1MCBzcmdifSBiaW5kIGRlZgotL2NvbDMwIHsxLjAwMCAwLjg4MCAwLjg4MCBzcmdifSBiaW5kIGRlZgotL2NvbDMxIHsxLjAwMCAwLjg0MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotCi1lbmQKLXNhdmUKLS02Mi4wIDM3MC4wIHRyYW5zbGF0ZQotMSAtMSBzY2FsZQotCi0vY2xwIHtjbG9zZXBhdGh9IGJpbmQgZGVmCi0vZWYge2VvZmlsbH0gYmluZCBkZWYKLS9nciB7Z3Jlc3RvcmV9IGJpbmQgZGVmCi0vZ3Mge2dzYXZlfSBiaW5kIGRlZgotL2wge2xpbmV0b30gYmluZCBkZWYKLS9tIHttb3ZldG99IGJpbmQgZGVmCi0vbiB7bmV3cGF0aH0gYmluZCBkZWYKLS9zIHtzdHJva2V9IGJpbmQgZGVmCi0vc2xjIHtzZXRsaW5lY2FwfSBiaW5kIGRlZgotL3NsaiB7c2V0bGluZWpvaW59IGJpbmQgZGVmCi0vc2x3IHtzZXRsaW5ld2lkdGh9IGJpbmQgZGVmCi0vc3JnYiB7c2V0cmdiY29sb3J9IGJpbmQgZGVmCi0vcm90IHtyb3RhdGV9IGJpbmQgZGVmCi0vc2Mge3NjYWxlfSBiaW5kIGRlZgotL3RyIHt0cmFuc2xhdGV9IGJpbmQgZGVmCi0vdG50IHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvcgotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZCBzcmdifQotICBiaW5kIGRlZgotL3NoZCB7ZHVwIGR1cCBjdXJyZW50cmdiY29sb3IgNCAtMiByb2xsIG11bCA0IC0yIHJvbGwgbXVsCi0gIDQgLTIgcm9sbCBtdWwgc3JnYn0gYmluZCBkZWYKLS8kRjJwc0JlZ2luIHskRjJwc0RpY3QgYmVnaW4gLyRGMnBzRW50ZXJlZFN0YXRlIHNhdmUgZGVmfSBkZWYKLS8kRjJwc0VuZCB7JEYycHNFbnRlcmVkU3RhdGUgcmVzdG9yZSBlbmR9IGRlZgotJSVFbmRQcm9sb2cKLQotJEYycHNCZWdpbgotMTAgc2V0bWl0ZXJsaW1pdAotIDAuMDYwMDAgMC4wNjAwMCBzYwotNy41MDAgc2x3Ci0lIFBvbHlsaW5lCi1uIDEwNTAgOTAwIG0gMjEwMCA5MDAgbCAgMjEwMCAxNDI1IGwgIDEwNTAgMTQyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDI5MjUgOTAwIG0gMzk3NSA5MDAgbCAgMzk3NSAxNDI1IGwgIDI5MjUgMTQyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU1NTAgOTAwIG0gNjc1MCA5MDAgbCAgNjc1MCAxMzUwIGwgIDU1NTAgMTM1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDM3NTAgMTgwMCBtIDUwMjUgMTgwMCBsICA1MDI1IDIyNTAgbCAgMzc1MCAyMjUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTE1NSAyMTAwIG0gMTA1MCAyMTAwIDEwNTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMTA1MCAyNjI1IDIwNzAgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjE3NSAyNjI1IDIxNzUgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjE3NSAyMTAwIDExNTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA1NTUwIDMzMDAgbSA2Njc1IDMzMDAgbCAgNjY3NSAzNzUwIGwgIDU1NTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU2NTUgMjEwMCBtIDU1NTAgMjEwMCA1NTUwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDU1NTAgMjYyNSA2NDk1IDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDY2MDAgMjYyNSA2NjAwIDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDY2MDAgMjEwMCA1NjU1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzc1MCAzNjAwIG0gNDg3NSAzNjAwIGwgIDQ4NzUgNDA1MCBsICAzNzUwIDQwNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzODU1IDI3MDAgbSAzNzUwIDI3MDAgMzc1MCAzMDQ1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAzNzUwIDMxNTAgNDU0NSAzMTUwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA0NjUwIDMxNTAgNDY1MCAyODA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA0NjUwIDI3MDAgMzg1NSAyNzAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDI4NTAgNTcwMCBtIDM3NTAgNTcwMCBsICAzNzUwIDYxNTAgbCAgMjg1MCA2MTUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzAzMCA0ODAwIG0gMjkyNSA0ODAwIDI5MjUgNTE0NSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjkyNSA1MjUwIDM2NDUgNTI1MCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMzc1MCA1MjUwIDM3NTAgNDkwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMzc1MCA0ODAwIDMwMzAgNDgwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAxNTAwIDE0MjUgbSAxNTAwIDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTUzMC4wMCAxOTgwLjAwIG0gMTUwMC4wMCAyMTAwLjAwIGwgMTQ3MC4wMCAxOTgwLjAwIGwgIDE1MDAuNTAgMTk4MC41MCBsIDE1MzAuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDE0MjUgbSAzMzAwIDQ4MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzMzMC4wMCA0NjgwLjAwIG0gMzMwMC4wMCA0ODAwLjAwIGwgMzI3MC4wMCA0NjgwLjAwIGwgIDMzMDAuNTAgNDY4MC41MCBsIDMzMzAuMDAgNDY4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDE1NzUgbSAxODc1IDE1NzUgbCAgMTg3NSAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE5MDUuMDAgMTk4MC4wMCBtIDE4NzUuMDAgMjEwMC4wMCBsIDE4NDUuMDAgMTk4MC4wMCBsICAxODc1LjUwIDE5ODAuNTAgbCAxOTA1LjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMzMwMCAxNTc1IG0gNTcwMCAxNTc1IGwgIDU3MDAgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NzMwLjAwIDE5ODAuMDAgbSA1NzAwLjAwIDIxMDAuMDAgbCA1NjcwLjAwIDE5ODAuMDAgbCAgNTcwMC41MCAxOTgwLjUwIGwgNTczMC4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDYyMjUgMTM1MCBtIDYyMjUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiA2MjU1LjAwIDE5ODAuMDAgbSA2MjI1LjAwIDIxMDAuMDAgbCA2MTk1LjAwIDE5ODAuMDAgbCAgNjIyNS41MCAxOTgwLjUwIGwgNjI1NS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDYwNzUgMjYyNSBtIDYwNzUgMzMwMCBsICBncyBjb2wtMSBzIGdyIAotbiA2MTA1LjAwIDMxODAuMDAgbSA2MDc1LjAwIDMzMDAuMDAgbCA2MDQ1LjAwIDMxODAuMDAgbCAgNjA3NS41MCAzMTgwLjUwIGwgNjEwNS4wMCAzMTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDQyMDAgMjI1MCBtIDQyMDAgMjcwMCBsICBncyBjb2wtMSBzIGdyIAotbiA0MjMwLjAwIDI1ODAuMDAgbSA0MjAwLjAwIDI3MDAuMDAgbCA0MTcwLjAwIDI1ODAuMDAgbCAgNDIwMC41MCAyNTgwLjUwIGwgNDIzMC4wMCAyNTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDQyMDAgMzE1MCBtIDQyMDAgMzYwMCBsICBncyBjb2wtMSBzIGdyIAotbiA0MjMwLjAwIDM0ODAuMDAgbSA0MjAwLjAwIDM2MDAuMDAgbCA0MTcwLjAwIDM0ODAuMDAgbCAgNDIwMC41MCAzNDgwLjUwIGwgNDIzMC4wMCAzNDgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDQyMDAgNDA1MCBtIDQyMDAgNDUwMCBsICAzNjc1IDQ1MDAgbCAgMzY3NSA0ODAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDM3MDUuMDAgNDY4MC4wMCBtIDM2NzUuMDAgNDgwMC4wMCBsIDM2NDUuMDAgNDY4MC4wMCBsICAzNjc1LjUwIDQ2ODAuNTAgbCAzNzA1LjAwIDQ2ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMzM3NSA1MjUwIG0gMzM3NSA1NzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDM0MDUuMDAgNTU4MC4wMCBtIDMzNzUuMDAgNTcwMC4wMCBsIDMzNDUuMDAgNTU4MC4wMCBsICAzMzc1LjUwIDU1ODAuNTAgbCAzNDA1LjAwIDU1ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMzMwMCAyOTI1IG0gMzc1MCAyOTI1IGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDM2MzAuMDAgMjg5NS4wMCBtIDM3NTAuMDAgMjkyNS4wMCBsIDM2MzAuMDAgMjk1NS4wMCBsICAzNjMwLjUwIDI5MjUuNTAgbCAzNjMwLjAwIDI4OTUuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTUwMCAyNjI1IG0gMTUwMCAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMzE4MC4wMCBtIDE1MDAuMDAgMzMwMC4wMCBsIDE0NzAuMDAgMzE4MC4wMCBsICAxNTAwLjUwIDMxODAuNTAgbCAxNTMwLjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTA1MCAzMzAwIG0gMjEwMCAzMzAwIGwgIDIxMDAgMzc1MCBsICAxMDUwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA0ODc1IDM4MjUgbSA1MjUwIDM4MjUgbCAgNTI1MCAyNDAwIGwgIDU1NTAgMjQwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NDMwLjAwIDIzNzAuMDAgbSA1NTUwLjAwIDI0MDAuMDAgbCA1NDMwLjAwIDI0MzAuMDAgbCAgNTQzMC41MCAyNDAwLjUwIGwgNTQzMC4wMCAyMzcwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoYWNjb25maWcuaCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZ3VyZS5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTcwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlLmFtKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zOTAwIDIxMDAgbQotZ3MgMSAtMSBzYyAoYWNpbmNsdWRlLm00KSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDI0MDAgbQotZ3MgMSAtMSBzYyAoYXV0b2hlYWRlcikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAzNjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTcwMCAzNjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01NzAwIDI0MDAgbQotZ3MgMSAtMSBzYyAoYXV0b21ha2UpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTM5MDAgMzkwMCBtCi1ncyAxIC0xIHNjIChhY2xvY2FsLm00KSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zOTAwIDMwMDAgbQotZ3MgMSAtMSBzYyAoYWNsb2NhbCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCA2MDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZ3VyZSkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCA1MTAwIG0KLWdzIDEgLTEgc2MgKGF1dG9jb25mKSBjb2wtMSBzaG93IGdyCi0kRjJwc0VuZAotcmVzdG9yZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi5maWcgYi9ldGMvY29uZmlnZGV2LmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzODZlYy4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LmZpZworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNGSUcgMy4xCi1Qb3J0cmFpdAotQ2VudGVyCi1JbmNoZXMKLTEyMDAgMgotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAxMDUwIDkwMCAyMTAwIDkwMCAyMTAwIDE0MjUgMTA1MCAxNDI1IDEwNTAgOTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI5MjUgOTAwIDM5NzUgOTAwIDM5NzUgMTQyNSAyOTI1IDE0MjUgMjkyNSA5MDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgNTU1MCA5MDAgNjc1MCA5MDAgNjc1MCAxMzUwIDU1NTAgMTM1MCA1NTUwIDkwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAzNzUwIDE4MDAgNTAyNSAxODAwIDUwMjUgMjI1MCAzNzUwIDIyNTAgMzc1MCAxODAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDIxNzUgMjYyNSAyMTc1IDIxMDAgMTA1MCAyMTAwIDEwNTAgMjYyNSAyMTc1IDI2MjUKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgNTU1MCAzMzAwIDY2NzUgMzMwMCA2Njc1IDM3NTAgNTU1MCAzNzUwIDU1NTAgMzMwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSA2NjAwIDI2MjUgNjYwMCAyMTAwIDU1NTAgMjEwMCA1NTUwIDI2MjUgNjYwMCAyNjI1Ci0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDM3NTAgMzYwMCA0ODc1IDM2MDAgNDg3NSA0MDUwIDM3NTAgNDA1MCAzNzUwIDM2MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgNDY1MCAzMTUwIDQ2NTAgMjcwMCAzNzUwIDI3MDAgMzc1MCAzMTUwIDQ2NTAgMzE1MAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAyODUwIDU3MDAgMzc1MCA1NzAwIDM3NTAgNjE1MCAyODUwIDYxNTAgMjg1MCA1NzAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDM3NTAgNTI1MCAzNzUwIDQ4MDAgMjkyNSA0ODAwIDI5MjUgNTI1MCAzNzUwIDUyNTAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDE1MDAgMTQyNSAxNTAwIDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMTQyNSAzMzAwIDQ4MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAzCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMTU3NSAxODc1IDE1NzUgMTg3NSAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMwotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzAwIDE1NzUgNTcwMCAxNTc1IDU3MDAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNjIyNSAxMzUwIDYyMjUgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNjA3NSAyNjI1IDYwNzUgMzMwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDIwMCAyMjUwIDQyMDAgMjcwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDIwMCAzMTUwIDQyMDAgMzYwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDQKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDIwMCA0MDUwIDQyMDAgNDUwMCAzNjc1IDQ1MDAgMzY3NSA0ODAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzc1IDUyNTAgMzM3NSA1NzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzAwIDI5MjUgMzc1MCAyOTI1Ci0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDI2MjUgMTUwMCAzMzAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgMzMwMCAyMTAwIDMzMDAgMjEwMCAzNzUwIDEwNTAgMzc1MCAxMDUwIDMzMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCA0Ci0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDQ4NzUgMzgyNSA1MjUwIDM4MjUgNTI1MCAyNDAwIDU1NTAgMjQwMAotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA3ODAgMTIwMCAxMjAwIGFjY29uZmlnLmhcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDg4NSAzMDAwIDEyMDAgY29uZmlndXJlLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA5NDUgNTcwMCAxMjAwIE1ha2VmaWxlLmFtXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA5OTAgMzkwMCAyMTAwIGFjaW5jbHVkZS5tNFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODQwIDEyMDAgMjQwMCBhdXRvaGVhZGVyXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA2NDUgMTIwMCAzNjAwIGNvbmZpZy5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODU1IDU3MDAgMzYwMCBNYWtlZmlsZS5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgNzM1IDU3MDAgMjQwMCBhdXRvbWFrZVwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODEwIDM5MDAgMzkwMCBhY2xvY2FsLm00XDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA1NDAgMzkwMCAzMDAwIGFjbG9jYWxcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDcwNSAzMDAwIDYwMDAgY29uZmlndXJlXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA2NjAgMzAwMCA1MTAwIGF1dG9jb25mXDAwMQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi5qaW4gYi9ldGMvY29uZmlnZGV2LmppbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxMWE3MS4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LmppbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdkZXYudGluIGIvZXRjL2NvbmZpZ2Rldi50aW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjZmMzQuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2Rldi50aW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0gICBhY2NvbmZpZy5oICAgICAgIGNvbmZpZ3VyZS5pbiAgICAgICAgICAgICAgICAgTWFrZWZpbGUuYW0KLSAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgfCAgLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgfAotICAgICAgIHwgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKLSAgICAgICB2ICB2ICAgICAgICAgICAgIHwgICAgYWNpbmNsdWRlLm00ICAgICB8ICAgICB8Ci0gICAqYXV0b2hlYWRlciogICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgdiAgICAgdgotICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgIHYgICAgICAtLS0+KmF1dG9tYWtlKiAKLSAgICAgICB2ICAgICAgICAgICAgICAgIHwtLS0+KmFjbG9jYWwqICAgfCAgICAgICB8ICAgICAgCi0gICBjb25maWcuaW4gICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwgICAgICAgdiAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHYgICAgICB8ICAgTWFrZWZpbGUuaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgYWNsb2NhbC5tNC0tLQotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgdiAgICAgdgotICAgICAgICAgICAgICAgICAgICAgICAqYXV0b2NvbmYqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2Ci0gICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ3VyZSBiL2V0Yy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwMWZjZWYuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDg2MiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KLSMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCi0jIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCi1jYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCi1zJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZwotcyVcWyVcXCYlZwotcyVcXSVcXCYlZwotcyVcJCUkJCVnCi1FT0YKLURFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAotcm0gLWYgY29uZnRlc3QuZGVmcwotCi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlLmluIGIvZXRjL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4NTA2OC4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLUFDX1BSRVJFUSgyLjUpCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1BQ19QUk9HX0lOU1RBTEwKLQotQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ3VyZS50ZXhpIGIvZXRjL2NvbmZpZ3VyZS50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQwMTY3Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWd1cmUudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI2NDQgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBjICUqKnN0YXJ0IG9mIGhlYWRlcgotQHNldGZpbGVuYW1lIGNvbmZpZ3VyZS5pbmZvCi1Ac2V0dGl0bGUgVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotQHNldGNoYXB0ZXJuZXdwYWdlIG9mZgotQGMgJSoqZW5kIG9mIGhlYWRlcgotCi1AZGlyY2F0ZWdvcnkgR05VIGFkbWluCi1AZGlyZW50cnkKLSogY29uZmlndXJlOiAoY29uZmlndXJlKS4JVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotQGVuZCBkaXJlbnRyeQotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0uCi0KLUNvcHlyaWdodCAoQykgMTk5OCBDeWdudXMgU29sdXRpb25zLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZvdW5kYXRpb24uCi1AZW5kIGlmaW5mbwotCi1AdGl0bGVwYWdlCi1AdGl0bGUgVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotQGF1dGhvciBJYW4gTGFuY2UgVGF5bG9yCi0KLUBwYWdlCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTggQ3lnbnVzIFNvbHV0aW9ucwotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbgotYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcAotQHRvcCBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbS4KLQotQG1lbnUKLSogSW50cm9kdWN0aW9uOjoJCUludHJvZHVjdGlvbi4KLSogR2V0dGluZyBTdGFydGVkOjoJCUdldHRpbmcgU3RhcnRlZC4KLSogRmlsZXM6OgkJCUZpbGVzLgotKiBDb25maWd1cmF0aW9uIE5hbWVzOjoJCUNvbmZpZ3VyYXRpb24gTmFtZXMuCi0qIENyb3NzIENvbXBpbGF0aW9uIFRvb2xzOjoJQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHMuCi0qIENhbmFkaWFuIENyb3NzOjoJCUNhbmFkaWFuIENyb3NzLgotKiBDeWdudXMgQ29uZmlndXJlOjoJCUN5Z251cyBDb25maWd1cmUuCi0qIE11bHRpbGliczo6CQkJTXVsdGlsaWJzLgotKiBGQVE6OgkJCQlGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucy4KLSogSW5kZXg6OgkJCUluZGV4LgotQGVuZCBtZW51Ci0KLUBlbmQgaWZpbmZvCi0KLUBub2RlIEludHJvZHVjdGlvbgotQGNoYXB0ZXIgSW50cm9kdWN0aW9uCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW1zLiAgSXQKLWRlc2NyaWJlcyBob3cgYXV0b2NvbmYsIGF1dG9tYWtlLCBsaWJ0b29sLCBhbmQgbWFrZSBmaXQgdG9nZXRoZXIuICBJdAotYWxzbyBpbmNsdWRlcyBhIGRpc2N1c3Npb24gb2YgdGhlIG9sZGVyIEN5Z251cyBjb25maWd1cmUgc3lzdGVtLgotCi1UaGlzIGRvY3VtZW50IGRvZXMgbm90IGRlc2NyaWJlIGluIGRldGFpbCBob3cgdG8gdXNlIGVhY2ggb2YgdGhlIHRvb2xzOwotc2VlIHRoZSByZXNwZWN0aXZlIG1hbnVhbHMgZm9yIHRoYXQuICBJbnN0ZWFkLCBpdCBkZXNjcmliZXMgd2hpY2ggZmlsZXMKLXRoZSBkZXZlbG9wZXIgbXVzdCB3cml0ZSwgd2hpY2ggZmlsZXMgYXJlIG1hY2hpbmUgZ2VuZXJhdGVkIGFuZCBob3cgdGhleQotYXJlIGdlbmVyYXRlZCwgYW5kIHdoZXJlIGNlcnRhaW4gY29tbW9uIHByb2JsZW1zIHNob3VsZCBiZSBhZGRyZXNzZWQuCi0KLUBpZm5vdGh0bWwKLVRoaXMgZG9jdW1lbnQgZHJhd3Mgb24gc2V2ZXJhbCBzb3VyY2VzLCBpbmNsdWRpbmcgdGhlIGF1dG9jb25mIG1hbnVhbCBieQotRGF2aWQgTWFjS2VuemllIChAcHhyZWZ7VG9wLCAsIGF1dG9jb25mIG92ZXJ2aWV3LCBhdXRvY29uZiwgQXV0b2NvbmZ9KSwKLXRoZSBhdXRvbWFrZSBtYW51YWwgYnkgRGF2aWQgTWFjS2VuemllIGFuZCBUb20gVHJvbWV5IChAcHhyZWZ7VG9wLCAsCi1hdXRvbWFrZSBvdmVydmlldywgYXV0b21ha2UsIEdOVSBBdXRvbWFrZX0pLCB0aGUgbGlidG9vbCBtYW51YWwgYnkKLUdvcmRvbiBNYXR6aWdrZWl0IChAcHhyZWZ7VG9wLCAsIGxpYnRvb2wgb3ZlcnZpZXcsIGxpYnRvb2wsIEdOVQotbGlidG9vbH0pLCBhbmQgdGhlIEN5Z251cyBjb25maWd1cmUgbWFudWFsIGJ5IEsuIFJpY2hhcmQgUGl4bGV5LgotQGVuZCBpZm5vdGh0bWwKLUBpZmh0bWwKLVRoaXMgZG9jdW1lbnQgZHJhd3Mgb24gc2V2ZXJhbCBzb3VyY2VzLCBpbmNsdWRpbmcKLUB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b2NvbmYvYXV0b2NvbmZfdG9jLmh0bWwsIHRoZQotYXV0b2NvbmYgbWFudWFsfSBieSBEYXZpZCBNYWNLZW56aWUsCi1AdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2F1dG9tYWtlL2F1dG9tYWtlX3RvYy5odG1sLCB0aGUKLWF1dG9tYWtlIG1hbnVhbH0gYnkgRGF2aWQgTWFjS2VuemllIGFuZCBUb20gVHJvbWV5LAotQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9saWJ0b29sL2xpYnRvb2xfdG9jLmh0bWwsIHRoZQotbGlidG9vbCBtYW51YWx9IGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCBhbmQgdGhlIEN5Z251cyBjb25maWd1cmUgbWFudWFsIGJ5Ci1LLiBSaWNoYXJkIFBpeGxleS4KLUBlbmQgaWZodG1sCi0KLUBtZW51Ci0qIEdvYWxzOjoJCQlHb2Fscy4KLSogVG9vbHM6OgkJCVRoZSB0b29scy4KLSogSGlzdG9yeTo6CQkJSGlzdG9yeS4KLSogQnVpbGRpbmc6OgkJCUJ1aWxkaW5nLgotQGVuZCBtZW51Ci0KLUBub2RlIEdvYWxzCi1Ac2VjdGlvbiBHb2FscwotQGNpbmRleCBnb2FscwotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIGhhcyB0d28gbWFpbiBnb2Fscy4KLQotVGhlIGZpcnN0IGlzIHRvIHNpbXBsaWZ5IHRoZSBkZXZlbG9wbWVudCBvZiBwb3J0YWJsZSBwcm9ncmFtcy4gIFRoZQotc3lzdGVtIHBlcm1pdHMgdGhlIGRldmVsb3BlciB0byBjb25jZW50cmF0ZSBvbiB3cml0aW5nIHRoZSBwcm9ncmFtLAotc2ltcGxpZnlpbmcgbWFueSBkZXRhaWxzIG9mIHBvcnRhYmlsaXR5IGFjcm9zcyBVbml4IGFuZCBldmVuIFdpbmRvd3MKLXN5c3RlbXMsIGFuZCBwZXJtaXR0aW5nIHRoZSBkZXZlbG9wZXIgdG8gZGVzY3JpYmUgaG93IHRvIGJ1aWxkIHRoZQotcHJvZ3JhbSB1c2luZyBzaW1wbGUgcnVsZXMgcmF0aGVyIHRoYW4gY29tcGxleCBNYWtlZmlsZXMuCi0KLVRoZSBzZWNvbmQgaXMgdG8gc2ltcGxpZnkgdGhlIGJ1aWxkaW5nIG9mIHByb2dyYW1zIGRpc3RyaWJ1dGVkIGFzIHNvdXJjZQotY29kZS4gIEFsbCBwcm9ncmFtcyBhcmUgYnVpbHQgdXNpbmcgYSBzaW1wbGUsIHN0YW5kYXJkaXplZCwgdHdvIHN0ZXAKLXByb2Nlc3MuICBUaGUgcHJvZ3JhbSBidWlsZGVyIG5lZWQgbm90IGluc3RhbGwgYW55IHNwZWNpYWwgdG9vbHMgaW4KLW9yZGVyIHRvIGJ1aWxkIHRoZSBwcm9ncmFtLgotCi1Abm9kZSBUb29scwotQHNlY3Rpb24gVG9vbHMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSBpcyBjb21wcmlzZWQgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQKLXRvb2xzLiAgUHJvZ3JhbSBkZXZlbG9wZXJzIG11c3QgYnVpbGQgYW5kIGluc3RhbGwgYWxsIG9mIHRoZXNlIHRvb2xzLgotCi1QZW9wbGUgd2hvIGp1c3Qgd2FudCB0byBidWlsZCBwcm9ncmFtcyBmcm9tIGRpc3RyaWJ1dGVkIHNvdXJjZXMgbm9ybWFsbHkKLWRvIG5vdCBuZWVkIGFueSBzcGVjaWFsIHRvb2xzIGJleW9uZCBhIFVuaXggc2hlbGwsIGEgbWFrZSBwcm9ncmFtLCBhbmQgYQotQyBjb21waWxlci4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBhdXRvY29uZgotcHJvdmlkZXMgYSBnZW5lcmFsIHBvcnRhYmlsaXR5IGZyYW1ld29yaywgYmFzZWQgb24gdGVzdGluZyB0aGUgZmVhdHVyZXMKLW9mIHRoZSBob3N0IHN5c3RlbSBhdCBidWlsZCB0aW1lLgotQGl0ZW0gYXV0b21ha2UKLWEgc3lzdGVtIGZvciBkZXNjcmliaW5nIGhvdyB0byBidWlsZCBhIHByb2dyYW0sIHBlcm1pdHRpbmcgdGhlIGRldmVsb3BlcgotdG8gd3JpdGUgYSBzaW1wbGlmaWVkIEBmaWxle01ha2VmaWxlfS4KLUBpdGVtIGxpYnRvb2wKLWEgc3RhbmRhcmRpemVkIGFwcHJvYWNoIHRvIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1AaXRlbSBnZXR0ZXh0Ci1wcm92aWRlcyBhIGZyYW1ld29yayBmb3IgdHJhbnNsYXRpb24gb2YgdGV4dCBtZXNzYWdlcyBpbnRvIG90aGVyCi1sYW5ndWFnZXM7IG5vdCByZWFsbHkgZGlzY3Vzc2VkIGluIHRoaXMgZG9jdW1lbnQuCi1AaXRlbSBtNAotYXV0b2NvbmYgcmVxdWlyZXMgdGhlIEdOVSB2ZXJzaW9uIG9mIG00OyB0aGUgc3RhbmRhcmQgVW5peCBtNCBkb2VzIG5vdAotc3VmZmljZS4KLUBpdGVtIHBlcmwKLWF1dG9tYWtlIHJlcXVpcmVzIHBlcmwuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEhpc3RvcnkKLUBzZWN0aW9uIEhpc3RvcnkKLUBjaW5kZXggaGlzdG9yeQotCi1UaGlzIGlzIGEgdmVyeSBicmllZiBhbmQgcHJvYmFibHkgaW5hY2N1cmF0ZSBoaXN0b3J5LgotCi1BcyB0aGUgbnVtYmVyIG9mIFVuaXggdmFyaWFudHMgaW5jcmVhc2VkIGR1cmluZyB0aGUgMTk4MHMsIGl0IGJlY2FtZQotaGFyZGVyIHRvIHdyaXRlIHByb2dyYW1zIHdoaWNoIGNvdWxkIHJ1biBvbiBhbGwgdmFyaWFudHMuICBXaGlsZSBpdCB3YXMKLW9mdGVuIHBvc3NpYmxlIHRvIHVzZSBAY29kZXsjaWZkZWZ9IHRvIGlkZW50aWZ5IHBhcnRpY3VsYXIgc3lzdGVtcywKLWRldmVsb3BlcnMgZnJlcXVlbnRseSBkaWQgbm90IGhhdmUgYWNjZXNzIHRvIGV2ZXJ5IHN5c3RlbSwgYW5kIHRoZQotY2hhcmFjdGVyaXN0aWNzIG9mIHNvbWUgc3lzdGVtcyBjaGFuZ2VkIGZyb20gdmVyc2lvbiB0byB2ZXJzaW9uLgotCi1CeSAxOTkyLCBhdCBsZWFzdCB0aHJlZSBkaWZmZXJlbnQgYXBwcm9hY2hlcyBoYWQgYmVlbiBkZXZlbG9wZWQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIE1ldGFjb25maWcgcHJvZ3JhbSwgYnkgTGFycnkgV2FsbCwgSGFybGFuIFN0ZW5uLCBhbmQgUmFwaGFlbAotTWFuZnJlZGkuCi1AaXRlbQotVGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0LCBieSBLLiBSaWNoYXJkIFBpeGxleSwgYW5kIHRoZSBnY2MgY29uZmlndXJlCi1zY3JpcHQsIGJ5IFJpY2hhcmQgU3RhbGxtYW4uICBUaGVzZSB1c2UgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXBwcm9hY2gsCi1hbmQgdGhlIGRldmVsb3BlcnMgY29tbXVuaWNhdGVkIHJlZ3VsYXJseS4KLUBpdGVtCi1UaGUgYXV0b2NvbmYgcHJvZ3JhbSwgYnkgRGF2aWQgTWFjS2VuemllLgotQGVuZCBpdGVtaXplCi0KLVRoZSBNZXRhY29uZmlnIHByb2dyYW0gaXMgc3RpbGwgdXNlZCBmb3IgUGVybCBhbmQgYSBmZXcgb3RoZXIgcHJvZ3JhbXMuCi1JdCBpcyBwYXJ0IG9mIHRoZSBEaXN0IHBhY2thZ2UuICBJIGRvIG5vdCBrbm93IGlmIGl0IGlzIGJlaW5nIGRldmVsb3BlZC4KLQotSW4gMTk5NCwgRGF2aWQgTWFjS2VuemllIGFuZCBvdGhlcnMgbW9kaWZpZWQgYXV0b2NvbmYgdG8gaW5jb3Jwb3JhdGUgYWxsCi10aGUgZmVhdHVyZXMgb2YgQ3lnbnVzIGNvbmZpZ3VyZS4gIFNpbmNlIHRoZW4sIHRoZXJlIGhhcyBiZWVuIGEgc2xvdyBidXQKLXN0ZWFkeSBjb252ZXJzaW9uIG9mIEdOVSBwcm9ncmFtcyBmcm9tIEN5Z251cyBjb25maWd1cmUgdG8gYXV0b2NvbmYuIGdjYwotaGFzIGJlZW4gY29udmVydGVkLCBlbGltaW5hdGluZyB0aGUgZ2NjIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLUdOVSBhdXRvY29uZiB3YXMgcmVndWxhcmx5IG1haW50YWluZWQgdW50aWwgbGF0ZSAxOTk2LiAgQXMgb2YgdGhpcwotd3JpdGluZyBpbiBKdW5lLCAxOTk4LCBpdCBoYXMgbm8gcHVibGljIG1haW50YWluZXIuCi0KLU1vc3QgcHJvZ3JhbXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBtYWtlIHByb2dyYW0sIHdoaWNoIHJlcXVpcmVzIHRoZQotZGV2ZWxvcGVyIHRvIHdyaXRlIE1ha2VmaWxlcyBkZXNjcmliaW5nIGhvdyB0byBidWlsZCB0aGUgcHJvZ3JhbXMuCi1TaW5jZSBtb3N0IHByb2dyYW1zIGFyZSBidWlsdCBpbiBwcmV0dHkgbXVjaCB0aGUgc2FtZSB3YXksIHRoaXMgbGVkIHRvIGEKLWxvdCBvZiBkdXBsaWNhdGlvbi4KLQotVGhlIFggV2luZG93IHN5c3RlbSBpcyBidWlsdCB1c2luZyB0aGUgaW1ha2UgdG9vbCwgd2hpY2ggdXNlcyBhIGRhdGFiYXNlCi1vZiBydWxlcyB0byBlbGltaW5hdGUgdGhlIGR1cGxpY2F0aW9uLiAgSG93ZXZlciwgYnVpbGRpbmcgYSB0b29sIHdoaWNoCi13YXMgZGV2ZWxvcGVkIHVzaW5nIGltYWtlIHJlcXVpcmVzIHRoYXQgdGhlIGJ1aWxkZXIgaGF2ZSBpbWFrZQotaW5zdGFsbGVkLCB2aW9sYXRpbmcgb25lIG9mIHRoZSBnb2FscyBvZiB0aGUgR05VIHN5c3RlbS4KLQotVGhlIG5ldyBCU0QgbWFrZSBwcm92aWRlcyBhIHN0YW5kYXJkIGxpYnJhcnkgb2YgTWFrZWZpbGUgZnJhZ21lbnRzLAotd2hpY2ggcGVybWl0cyBkZXZlbG9wZXJzIHRvIHdyaXRlIHZlcnkgc2ltcGxlIE1ha2VmaWxlcy4gIEhvd2V2ZXIsIHRoaXMKLXJlcXVpcmVzIHRoYXQgdGhlIGJ1aWxkZXIgaW5zdGFsbCB0aGUgbmV3IEJTRCBtYWtlIHByb2dyYW0uCi0KLUluIDE5OTQsIERhdmlkIE1hY0tlbnppZSB3cm90ZSB0aGUgZmlyc3QgdmVyc2lvbiBvZiBhdXRvbWFrZSwgd2hpY2gKLXBlcm1pdHRlZCB3cml0aW5nIGEgc2ltcGxlIGJ1aWxkIGRlc2NyaXB0aW9uIHdoaWNoIHdhcyBjb252ZXJ0ZWQgaW50byBhCi1NYWtlZmlsZSB3aGljaCBjb3VsZCBiZSB1c2VkIGJ5IHRoZSBzdGFuZGFyZCBtYWtlIHByb2dyYW0uICBJbiAxOTk1LCBUb20KLVRyb21leSBjb21wbGV0ZWx5IHJld3JvdGUgYXV0b21ha2UgaW4gUGVybCwgYW5kIGhlIGNvbnRpbnVlcyB0byBlbmhhbmNlCi1pdC4KLQotVmFyaW91cyBmcmVlIHBhY2thZ2VzIGJ1aWx0IGxpYnJhcmllcywgYW5kIGJ5IGFyb3VuZCAxOTk1IHNldmVyYWwKLWluY2x1ZGVkIHN1cHBvcnQgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4KLUhvd2V2ZXIsIHRoZXJlIHdhcyBubyBjb25zaXN0ZW50IGFwcHJvYWNoLiAgSW4gZWFybHkgMTk5NiwgR29yZG9uCi1NYXR6aWdrZWl0IGJlZ2FuIHdvcmtpbmcgb24gbGlidG9vbCwgd2hpY2ggcHJvdmlkZWQgYSBzdGFuZGFyZGl6ZWQKLWFwcHJvYWNoIHRvIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIHdhcyBpbnRlZ3JhdGVkIGludG8KLWF1dG9tYWtlIGZyb20gdGhlIHN0YXJ0LgotCi1UaGUgZGV2ZWxvcG1lbnQgb2YgYXV0b21ha2UgYW5kIGxpYnRvb2wgd2FzIGRyaXZlbiBieSB0aGUgR05JVFMgcHJvamVjdCwKLWEgZ3JvdXAgb2YgR05VIG1haW50YWluZXJzIHdobyBkZXNpZ25lZCBzdGFuZGFyZGl6ZWQgdG9vbHMgdG8gaGVscCBtZWV0Ci10aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBub2RlIEJ1aWxkaW5nCi1Ac2VjdGlvbiBCdWlsZGluZwotCi1Nb3N0IHJlYWRlcnMgb2YgdGhpcyBkb2N1bWVudCBzaG91bGQgYWxyZWFkeSBrbm93IGhvdyB0byBidWlsZCBhIHRvb2wgYnkKLXJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfSBhbmQgQHNhbXB7bWFrZX0uICBUaGlzIHNlY3Rpb24gbWF5IHNlcnZlIGFzIGEKLXF1aWNrIGludHJvZHVjdGlvbiBvciByZW1pbmRlci4KLQotQnVpbGRpbmcgYSB0b29sIGlzIG5vcm1hbGx5IGFzIHNpbXBsZSBhcyBydW5uaW5nIEBzYW1we2NvbmZpZ3VyZX0KLWZvbGxvd2VkIGJ5IEBzYW1we21ha2V9LiAgWW91IHNob3VsZCBub3JtYWxseSBydW4gQHNhbXB7Y29uZmlndXJlfSBmcm9tCi1hbiBlbXB0eSBkaXJlY3RvcnksIHVzaW5nIHNvbWUgcGF0aCB0byByZWZlciB0byB0aGUgQHNhbXB7Y29uZmlndXJlfQotc2NyaXB0IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgcnVuCi1Ac2FtcHtjb25maWd1cmV9IGlzIGNhbGxlZCB0aGUgQGRmbntvYmplY3QgZGlyZWN0b3J5fS4KLQotSW4gb3JkZXIgdG8gdXNlIGEgb2JqZWN0IGRpcmVjdG9yeSB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc291cmNlCi1kaXJlY3RvcnksIHlvdSBtdXN0IGJlIHVzaW5nIHRoZSBHTlUgdmVyc2lvbiBvZiBAc2FtcHttYWtlfSwgd2hpY2ggaGFzCi10aGUgcmVxdWlyZWQgQHNhbXB7VlBBVEh9IHN1cHBvcnQuICBEZXNwaXRlIHRoaXMgcmVzdHJpY3Rpb24sIHVzaW5nIGEKLWRpZmZlcmVudCBvYmplY3QgZGlyZWN0b3J5IGlzIGhpZ2hseSByZWNvbW1lbmRlZDoKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1JdCBrZWVwcyB0aGUgZmlsZXMgZ2VuZXJhdGVkIGR1cmluZyB0aGUgYnVpbGQgZnJvbSBjbHV0dGVyaW5nIHVwIHlvdXIKLXNvdXJjZXMuCi1AaXRlbSAKLUl0IHBlcm1pdHMgeW91IHRvIHJlbW92ZSB0aGUgYnVpbHQgZmlsZXMgYnkgc2ltcGx5IHJlbW92aW5nIHRoZSBlbnRpcmUKLWJ1aWxkIGRpcmVjdG9yeS4KLUBpdGVtCi1JdCBwZXJtaXRzIHlvdSB0byBidWlsZCBmcm9tIHRoZSBzYW1lIHNvdXJjZXMgd2l0aCBzZXZlcmFsIHNldHMgb2YKLWNvbmZpZ3VyZSBvcHRpb25zIHNpbXVsdGFuZW91c2x5LgotQGVuZCBpdGVtaXplCi0KLUlmIHlvdSBkb24ndCBoYXZlIEdOVSBAc2FtcHttYWtlfSwgeW91IHdpbGwgaGF2ZSB0byBydW4gQHNhbXB7Y29uZmlndXJlfQotaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBBbGwgR05VIHBhY2thZ2VzIHNob3VsZCBzdXBwb3J0IHRoaXM7IGluCi1wYXJ0aWN1bGFyLCBHTlUgcGFja2FnZXMgc2hvdWxkIG5vdCBhc3N1bWUgdGhlIHByZXNlbmNlIG9mIEdOVQotQHNhbXB7bWFrZX0uCi0KLUFmdGVyIHJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfSwgeW91IGNhbiBidWlsZCB0aGUgdG9vbHMgYnkgcnVubmluZwotQHNhbXB7bWFrZX0uCi0KLVRvIGluc3RhbGwgdGhlIHRvb2xzLCBydW4gQHNhbXB7bWFrZSBpbnN0YWxsfS4gIEluc3RhbGxpbmcgdGhlIHRvb2xzCi13aWxsIGNvcHkgdGhlIHByb2dyYW1zIGFuZCBhbnkgcmVxdWlyZWQgc3VwcG9ydCBmaWxlcyB0byB0aGUKLUBkZm57aW5zdGFsbGF0aW9uIGRpcmVjdG9yeX0uICBUaGUgbG9jYXRpb24gb2YgdGhlIGluc3RhbGxhdGlvbgotZGlyZWN0b3J5IGlzIGNvbnRyb2xsZWQgYnkgQHNhbXB7Y29uZmlndXJlfSBvcHRpb25zLCBhcyBkZXNjcmliZWQgYmVsb3cuCi0KLUluIHRoZSBDeWdudXMgdHJlZSBhdCBwcmVzZW50LCB0aGUgaW5mbyBmaWxlcyBhcmUgYnVpbHQgYW5kIGluc3RhbGxlZCBhcwotYSBzZXBhcmF0ZSBzdGVwLiAgVG8gYnVpbGQgdGhlbSwgcnVuIEBzYW1we21ha2UgaW5mb30uICBUbyBpbnN0YWxsIHRoZW0sCi1ydW4gQHNhbXB7bWFrZSBpbnN0YWxsLWluZm99LgotCi1BbGwgQHNhbXB7Y29uZmlndXJlfSBzY3JpcHRzIHN1cHBvcnQgYSB3aWRlIHZhcmlldHkgb2Ygb3B0aW9ucy4gIFRoZQotbW9zdCBpbnRlcmVzdGluZyBvbmVzIGFyZSBAc2FtcHstLXdpdGh9IGFuZCBAc2FtcHstLWVuYWJsZX0gb3B0aW9ucwotd2hpY2ggYXJlIGdlbmVyYWxseSBzcGVjaWZpYyB0byBwYXJ0aWN1bGFyIHRvb2xzLiAgWW91IGNhbiB1c3VhbGx5IHVzZQotdGhlIEBzYW1wey0taGVscH0gb3B0aW9uIHRvIGdldCBhIGxpc3Qgb2YgaW50ZXJlc3Rpbmcgb3B0aW9ucyBmb3IgYQotcGFydGljdWxhciBjb25maWd1cmUgc2NyaXB0LgotCi1UaGUgb25seSBnZW5lcmljIG9wdGlvbnMgeW91IGFyZSBsaWtlbHkgdG8gdXNlIGFyZSB0aGUgQHNhbXB7LS1wcmVmaXh9Ci1hbmQgQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9ucy4gIFRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUKLWluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIEBzYW1wey0tcHJlZml4fSBvcHRpb24gd2lsbCBob2xkIG1hY2hpbmUKLWluZGVwZW5kZW50IGZpbGVzIHN1Y2ggYXMgaW5mbyBmaWxlcy4KLQotVGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9uLCB3aGljaCBpcwotbm9ybWFsbHkgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEBzYW1wey0tcHJlZml4fSBkaXJlY3RvcnksIHdpbGwgaG9sZAotbWFjaGluZSBkZXBlbmRlbnQgZmlsZXMgc3VjaCBhcyBleGVjdXRhYmxlcy4KLQotVGhlIGRlZmF1bHQgZm9yIEBzYW1wey0tcHJlZml4fSBpcyBAZmlsZXsvdXNyL2xvY2FsfS4gIFRoZSBkZWZhdWx0IGZvcgotQHNhbXB7LS1leGVjLXByZWZpeH0gaXMgdGhlIHZhbHVlIHVzZWQgZm9yIEBzYW1wey0tcHJlZml4fS4KLQotVGhlIGNvbnZlbnRpb24gdXNlZCBpbiBDeWdudXMgcmVsZWFzZXMgaXMgdG8gdXNlIGEgQHNhbXB7LS1wcmVmaXh9Ci1vcHRpb24gb2YgQGZpbGV7L3Vzci9jeWdudXMvQHZhcntyZWxlYXNlfX0sIHdoZXJlIEB2YXJ7cmVsZWFzZX0gaXMgdGhlCi1uYW1lIG9mIHRoZSByZWxlYXNlLCBhbmQgdG8gdXNlIGEgQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9uIG9mCi1AZmlsZXsvdXNyL2N5Z251cy9AdmFye3JlbGVhc2V9L0gtQHZhcntob3N0fX0sIHdoZXJlIEB2YXJ7aG9zdH0gaXMgdGhlCi1jb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIGhvc3Qgc3lzdGVtIChAcHhyZWZ7Q29uZmlndXJhdGlvbiBOYW1lc30pLgotCi1EbyBub3QgdXNlIGVpdGhlciB0aGUgc291cmNlIG9yIHRoZSBvYmplY3QgZGlyZWN0b3J5IGFzIHRoZSBpbnN0YWxsYXRpb24KLWRpcmVjdG9yeS4gIFRoYXQgd2lsbCBqdXN0IGxlYWQgdG8gY29uZnVzaW9uLgotCi1Abm9kZSBHZXR0aW5nIFN0YXJ0ZWQKLUBjaGFwdGVyIEdldHRpbmcgU3RhcnRlZAotCi1UbyBzdGFydCB1c2luZyB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIHdpdGggeW91ciBzb2Z0d2FyZQotcGFja2FnZSwgeW91IG11c3Qgd3JpdGUgdGhyZWUgZmlsZXMsIGFuZCB5b3UgbXVzdCBydW4gc29tZSB0b29scyB0bwotbWFudWFsbHkgZ2VuZXJhdGUgYWRkaXRpb25hbCBmaWxlcy4KLQotQG1lbnUKLSogV3JpdGUgY29uZmlndXJlLmluOjoJCVdyaXRlIGNvbmZpZ3VyZS5pbi4KLSogV3JpdGUgTWFrZWZpbGUuYW06OgkJV3JpdGUgTWFrZWZpbGUuYW0uCi0qIFdyaXRlIGFjY29uZmlnLmg6OgkJV3JpdGUgYWNjb25maWcuaC4KLSogR2VuZXJhdGUgZmlsZXM6OgkJR2VuZXJhdGUgZmlsZXMuCi0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlOjoJRXhhbXBsZS4KLUBlbmQgbWVudQotCi1Abm9kZSBXcml0ZSBjb25maWd1cmUuaW4KLUBzZWN0aW9uIFdyaXRlIGNvbmZpZ3VyZS5pbgotQGNpbmRleCBAZmlsZXtjb25maWd1cmUuaW59LCB3cml0aW5nCi0KLVlvdSBtdXN0IGZpcnN0IHdyaXRlIHRoZSBmaWxlIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGlzIGlzIGFuIGF1dG9jb25mCi1pbnB1dCBmaWxlLCBhbmQgdGhlIGF1dG9jb25mIG1hbnVhbCBkZXNjcmliZXMgaW4gZGV0YWlsIHdoYXQgdGhpcyBmaWxlCi1zaG91bGQgbG9vayBsaWtlLgotCi1Zb3Ugd2lsbCB3cml0ZSB0ZXN0cyBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSB0byBjaGVjayBmb3IKLWNvbmRpdGlvbnMgdGhhdCBtYXkgY2hhbmdlIGZyb20gb25lIHN5c3RlbSB0byBhbm90aGVyLCBzdWNoIGFzIHRoZQotcHJlc2VuY2Ugb2YgcGFydGljdWxhciBoZWFkZXIgZmlsZXMgb3IgZnVuY3Rpb25zLgotCi1Gb3IgZXhhbXBsZSwgbm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQgdGhlIEBzYW1we2dldHRpbWVvZmRheX0gZnVuY3Rpb24uCi1JZiB5b3Ugd2FudCB0byB1c2UgdGhlIEBzYW1we2dldHRpbWVvZmRheX0gZnVuY3Rpb24gd2hlbiBpdCBpcwotYXZhaWxhYmxlLCBhbmQgdG8gdXNlIHNvbWUgb3RoZXIgZnVuY3Rpb24gd2hlbiBpdCBpcyBub3QsIHlvdSB3b3VsZAotY2hlY2sgZm9yIHRoaXMgYnkgcHV0dGluZyBAc2FtcHtBQ19DSEVDS19GVU5DUyhnZXR0aW1lb2ZkYXkpfSBpbgotQGZpbGV7Y29uZmlndXJlLmlufS4KLQotV2hlbiB0aGUgY29uZmlndXJlIHNjcmlwdCBpcyBydW4gYXQgYnVpbGQgdGltZSwgdGhpcyB3aWxsIGFycmFuZ2UgdG8KLWRlZmluZSB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIEBzYW1we0hBVkVfR0VUVElNRU9GREFZfSB0byB0aGUgdmFsdWUgMSBpZgotdGhlIEBzYW1we2dldHRpbWVvZmRheX0gZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBhbmQgdG8gbm90IGRlZmluZSB0aGUKLW1hY3JvIGF0IGFsbCBpZiB0aGUgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZS4gIFlvdXIgY29kZSBjYW4gdGhlbiB1c2UKLUBzYW1weyNpZmRlZn0gdG8gdGVzdCB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gY2FsbCBAc2FtcHtnZXR0aW1lb2ZkYXl9LgotCi1JZiB5b3UgaGF2ZSBhbiBleGlzdGluZyBib2R5IG9mIGNvZGUsIHRoZSBAc2FtcHthdXRvc2Nhbn0gcHJvZ3JhbSBtYXkKLWhlbHAgaWRlbnRpZnkgcG90ZW50aWFsIHBvcnRhYmlsaXR5IHByb2JsZW1zLCBhbmQgaGVuY2UgY29uZmlndXJlIHRlc3RzCi10aGF0IHlvdSB3aWxsIHdhbnQgdG8gdXNlLgotQGlmbm90aHRtbAotQHhyZWZ7SW52b2tpbmcgYXV0b3NjYW4sICwgLCBhdXRvY29uZiwgdGhlIGF1dG9jb25mIG1hbnVhbH0uCi1AZW5kIGlmbm90aHRtbAotQGlmaHRtbAotU2VlIEB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b2NvbmYvYXV0b2NvbmZfNC5odG1sLCB0aGUKLWF1dG9zY2FuIGRvY3VtZW50YXRpb259LgotQGVuZCBpZmh0bWwKLQotQW5vdGhlciBoYW5keSB0b29sIGZvciBhbiBleGlzdGluZyBib2R5IG9mIGNvZGUgaXMgQHNhbXB7aWZuYW1lc30uICBUaGlzCi13aWxsIHNob3cgeW91IGFsbCB0aGUgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscyB0aGF0IHRoZSBjb2RlIGFscmVhZHkKLXVzZXMuCi1AaWZub3RodG1sCi1AeHJlZntJbnZva2luZyBpZm5hbWVzLCAsICwgYXV0b2NvbmYsIHRoZSBhdXRvY29uZiBtYW51YWx9LgotQGVuZCBpZm5vdGh0bWwKLUBpZmh0bWwKLVNlZSBAdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2F1dG9jb25mL2F1dG9jb25mXzUuaHRtbCwgdGhlCi1pZm5hbWVzIGRvY3VtZW50YXRpb259LgotQGVuZCBpZmh0bWwKLQotQmVzaWRlcyB0aGUgcG9ydGFiaWxpdHkgdGVzdHMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHlvdXIgcGFydGljdWxhcgotcGFja2FnZSwgZXZlcnkgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIHNob3VsZCBjb250YWluIHRoZSBmb2xsb3dpbmcKLW1hY3Jvcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBBQ19JTklUCi1AY2luZGV4IEBzYW1we0FDX0lOSVR9Ci1UaGlzIG1hY3JvIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgbmFtZSBvZiBhIGZpbGUgaW4geW91cgotcGFja2FnZS4gIEZvciBleGFtcGxlLCBAc2FtcHtBQ19JTklUKGZvby5jKX0uCi0KLUBpdGVtIEFDX1BSRVJFUShAdmFye1ZFUlNJT059KQotQGNpbmRleCBAc2FtcHtBQ19QUkVSRVF9Ci1UaGlzIG1hY3JvIGlzIG9wdGlvbmFsLiAgSXQgbWF5IGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YKLUBzYW1we2F1dG9jb25mfSB0aGF0IHlvdSBhcmUgdXNpbmcuICBUaGlzIHdpbGwgcHJldmVudCB1c2VycyBmcm9tCi1ydW5uaW5nIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBAc2FtcHthdXRvY29uZn0gYW5kIHBlcmhhcHMgZ2V0dGluZyBhbgotaW52YWxpZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdC4gIEZvciBleGFtcGxlLCBAc2FtcHtBQ19QUkVSRVEoMi4xMil9LgotCi1AaXRlbSBBTV9JTklUX0FVVE9NQUtFCi1AY2luZGV4IEBzYW1we0FNX0lOSVRfQVVUT01BS0V9Ci1UaGlzIG1hY3JvIHRha2VzIHR3byBhcmd1bWVudHM6IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlLCBhbmQgYSB2ZXJzaW9uCi1udW1iZXIuICBGb3IgZXhhbXBsZSwgQHNhbXB7QU1fSU5JVF9BVVRPTUFLRShmb28sIDEuMCl9LiAgKFRoaXMgbWFjcm8gaXMKLW5vdCBuZWVkZWQgaWYgeW91IGFyZSBub3QgdXNpbmcgYXV0b21ha2UpLgotCi1AaXRlbSBBTV9DT05GSUdfSEVBREVSCi1AY2luZGV4IEBzYW1we0FNX0NPTkZJR19IRUFERVJ9Ci1UaGlzIG1hY3JvIG5hbWVzIHRoZSBoZWFkZXIgZmlsZSB3aGljaCB3aWxsIGhvbGQgdGhlIHByZXByb2Nlc3NvciBtYWNybwotZGVmaW5pdGlvbnMgYXQgcnVuIHRpbWUuICBOb3JtYWxseSB0aGlzIHNob3VsZCBiZSBAZmlsZXtjb25maWcuaH0uICBZb3VyCi1zb3VyY2VzIHdvdWxkIHRoZW4gdXNlIEBzYW1weyNpbmNsdWRlICJjb25maWcuaCJ9IHRvIGluY2x1ZGUgaXQuCi0KLVRoaXMgbWFjcm8gbWF5IG9wdGlvbmFsbHkgbmFtZSB0aGUgaW5wdXQgZmlsZSBmb3IgdGhhdCBoZWFkZXIgZmlsZTsgYnkKLWRlZmF1bHQsIHRoaXMgaXMgQGZpbGV7Y29uZmlnLmguaW59LCBidXQgdGhhdCBmaWxlIG5hbWUgd29ya3MgcG9vcmx5IG9uCi1ET1MgZmlsZXN5c3RlbXMuICBUaGVyZWZvcmUsIGl0IGlzIG9mdGVuIGJldHRlciB0byBuYW1lIGl0IGV4cGxpY2l0bHkgYXMKLUBmaWxle2NvbmZpZy5pbn0uCi0KLVRoaXMgaXMgd2hhdCB5b3Ugc2hvdWxkIG5vcm1hbGx5IHB1dCBpbiBAZmlsZXtjb25maWd1cmUuaW59OgotQGV4YW1wbGUKLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggQHNhbXB7QUNfQ09ORklHX0hFQURFUn0KLShJZiB5b3UgYXJlIG5vdCB1c2luZyBhdXRvbWFrZSwgdXNlIEBzYW1we0FDX0NPTkZJR19IRUFERVJ9IHJhdGhlciB0aGFuCi1Ac2FtcHtBTV9DT05GSUdfSEVBREVSfSkuCi0KLUBpdGVtIEFNX01BSU5UQUlORVJfTU9ERQotQGNpbmRleCBAc2FtcHtBTV9NQUlOVEFJTkVSX01PREV9Ci1UaGlzIG1hY3JvIGFsd2F5cyBhcHBlYXJzIGluIEN5Z251cyBjb25maWd1cmUgc2NyaXB0cy4gIE90aGVyIHByb2dyYW1zCi1tYXkgb3IgbWF5IG5vdCB1c2UgaXQuCi0KLUlmIHRoaXMgbWFjcm8gaXMgdXNlZCwgdGhlIEBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uIGlzCi1yZXF1aXJlZCB0byBlbmFibGUgYXV0b21hdGljIHJlYnVpbGRpbmcgb2YgZ2VuZXJhdGVkIGZpbGVzIHVzZWQgYnkgdGhlCi1jb25maWd1cmUgc3lzdGVtLiAgVGhpcyBvZiBjb3Vyc2UgcmVxdWlyZXMgdGhhdCBkZXZlbG9wZXJzIGJlIGF3YXJlIG9mLAotYW5kIHVzZSwgdGhhdCBvcHRpb24uCi0KLUlmIHRoaXMgbWFjcm8gaXMgbm90IHVzZWQsIHRoZW4gdGhlIGdlbmVyYXRlZCBmaWxlcyB3aWxsIGFsd2F5cyBiZQotcmVidWlsdCBhdXRvbWF0aWNhbGx5LiAgVGhpcyB3aWxsIGNhdXNlIHByb2JsZW1zIGlmIHRoZSB3cm9uZyB2ZXJzaW9ucwotb2YgYXV0b2NvbmYsIGF1dG9tYWtlLCBvciBvdGhlcnMgYXJlIGluIHRoZSBidWlsZGVyJ3MgQHNhbXB7UEFUSH0uCi0KLShJZiB5b3UgYXJlIG5vdCB1c2luZyBhdXRvbWFrZSwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzIG1hY3JvKS4KLQotQGl0ZW0gQUNfRVhFRVhUCi1AY2luZGV4IEBzYW1we0FDX0VYRUVYVH0KLUBjaW5kZXggQHNhbXB7QU1fRVhFRVhUfQotRWl0aGVyIHRoaXMgbWFjcm8gb3IgQHNhbXB7QU1fRVhFRVhUfSBhbHdheXMgYXBwZWFycyBpbiBDeWdudXMgY29uZmlndXJlCi1maWxlcy4gIE90aGVyIHByb2dyYW1zIG1heSBvciBtYXkgbm90IHVzZSBvbmUgb2YgdGhlbS4KLQotVGhpcyBtYWNybyBsb29rcyBmb3IgdGhlIGV4ZWN1dGFibGUgc3VmZml4IHVzZWQgb24gdGhlIGhvc3Qgc3lzdGVtLiAgT24KLVVuaXggc3lzdGVtcywgdGhpcyBpcyB0aGUgZW1wdHkgc3RyaW5nLiAgT24gV2luZG93cyBzeXN0ZW1zLCB0aGlzIGlzCi1Ac2FtcHsuZXhlfS4gIFRoaXMgbWFjcm8gZGlyZWN0cyBhdXRvbWFrZSB0byB1c2UgdGhlIGV4ZWN1dGFibGUgc3VmZml4Ci1hcyBhcHByb3ByaWF0ZSB3aGVuIGNyZWF0aW5nIHByb2dyYW1zLiAgVGhpcyBtYWNybyBkb2VzIG5vdCB0YWtlIGFueQotYXJndW1lbnRzLgotCi1UaGUgQHNhbXB7QUNfRVhFRVhUfSBmb3JtIGlzIG5ldywgYW5kIGlzIHBhcnQgb2YgYSBDeWdudXMgcGF0Y2ggdG8KLWF1dG9jb25mIHRvIHN1cHBvcnQgY29tcGlsaW5nIHdpdGggVmlzdWFsIEMrKy4gIE9sZGVyIHByb2dyYW1zIHVzZQotQHNhbXB7QU1fRVhFRVhUfSBpbnN0ZWFkLgotCi0oUHJvZ3JhbXMgd2hpY2ggZG8gbm90IHVzZSBhdXRvbWFrZSB1c2UgbmVpdGhlciBAc2FtcHtBQ19FWEVFWFR9IG5vcgotQHNhbXB7QU1fRVhFRVhUfSkuCi0KLUBpdGVtIEFDX1BST0dfQ0MKLUBjaW5kZXggQHNhbXB7QUNfUFJPR19DQ30KLUlmIHlvdSBhcmUgd3JpdGluZyBDIGNvZGUsIHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgdG8gdXNlIHRoaXMgbWFjcm8uICBJdAotbG9jYXRlcyB0aGUgQyBjb21waWxlciB0byB1c2UuICBJdCBkb2VzIG5vdCB0YWtlIGFueSBhcmd1bWVudHMuCi0KLUhvd2V2ZXIsIGlmIHRoaXMgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIGlzIGZvciBhIGxpYnJhcnkgd2hpY2ggaXMgdG8KLWJlIGNvbXBpbGVkIGJ5IGEgY3Jvc3MgY29tcGlsZXIgd2hpY2ggbWF5IG5vdCBmdWxseSB3b3JrLCB0aGVuIHlvdSB3aWxsCi1ub3Qgd2FudCB0byB1c2UgQHNhbXB7QUNfUFJPR19DQ30uICBJbnN0ZWFkLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSBhCi12YXJpYW50IHdoaWNoIGRvZXMgbm90IGNhbGwgdGhlIG1hY3JvIEBzYW1we0FDX1BST0dfQ0NfV09SS1N9LiAgRXhhbXBsZXMKLWNhbiBiZSBmb3VuZCBpbiB2YXJpb3VzIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZXMgZm9yIGxpYnJhcmllcyB0aGF0IGFyZQotY29tcGlsZWQgd2l0aCBjcm9zcyBjb21waWxlcnMsIHN1Y2ggYXMgbGliaWJlcnR5IG9yIGxpYmdsb3NzLiAgVGhpcyBpcwotZXNzZW50aWFsbHkgYSBidWcgaW4gYXV0b2NvbmYsIGFuZCB0aGVyZSB3aWxsIHByb2JhYmx5IGJlIGEgYmV0dGVyCi13b3JrYXJvdW5kIGF0IHNvbWUgcG9pbnQuCi0KLUBpdGVtIEFDX1BST0dfQ1hYCi1AY2luZGV4IEBzYW1we0FDX1BST0dfQ1hYfQotSWYgeW91IGFyZSB3cml0aW5nIEMrKyBjb2RlLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSB0aGlzIG1hY3JvLiAgSXQKLWxvY2F0ZXMgdGhlIEMrKyBjb21waWxlciB0byB1c2UuICBJdCBkb2VzIG5vdCB0YWtlIGFueSBhcmd1bWVudHMuICBUaGUKLXNhbWUgY3Jvc3MgY29tcGlsZXIgY29tbWVudHMgYXBwbHkgYXMgZm9yIEBzYW1we0FDX1BST0dfQ0N9LgotCi1AaXRlbSBBTV9QUk9HX0xJQlRPT0wKLUBjaW5kZXggQHNhbXB7QU1fUFJPR19MSUJUT09MfQotSWYgeW91IHdhbnQgdG8gYnVpbGQgbGlicmFyaWVzLCBhbmQgeW91IHdhbnQgdG8gcGVybWl0IHRoZW0gdG8gYmUKLXNoYXJlZCwgb3IgeW91IHdhbnQgdG8gbGluayBhZ2FpbnN0IGxpYnJhcmllcyB3aGljaCB3ZXJlIGJ1aWx0IHVzaW5nCi1saWJ0b29sLCB0aGVuIHlvdSB3aWxsIG5lZWQgdGhpcyBtYWNyby4gIFRoaXMgbWFjcm8gaXMgcmVxdWlyZWQgaW4gb3JkZXIKLXRvIHVzZSBsaWJ0b29sLgotCi1AY2luZGV4IEBzYW1we0FNX0RJU0FCTEVfU0hBUkVEfQotQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGNhdXNlIGFsbCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgYXMgc2hhcmVkCi1saWJyYXJpZXMuICBUbyBwcmV2ZW50IHRoaXMtLXRvIGNoYW5nZSB0aGUgZGVmYXVsdC0tdXNlCi1Ac2FtcHtBTV9ESVNBQkxFX1NIQVJFRH0gYmVmb3JlIEBzYW1we0FNX1BST0dfTElCVE9PTH0uICBUaGUgY29uZmlndXJlCi1vcHRpb25zIEBzYW1wey0tZW5hYmxlLXNoYXJlZH0gYW5kIEBzYW1wey0tZGlzYWJsZS1zaGFyZWR9IG1heSBiZSB1c2VkCi10byBvdmVycmlkZSB0aGUgZGVmYXVsdCBhdCBidWlsZCB0aW1lLgotCi1AaXRlbSBBQ19ERUZJTkUoX0dOVV9TT1VSQ0UpCi1AY2luZGV4IEBzYW1we19HTlVfU09VUkNFfQotR05VIHBhY2thZ2VzIHNob3VsZCBub3JtYWxseSBpbmNsdWRlIHRoaXMgbGluZSBiZWZvcmUgYW55IG90aGVyIGZlYXR1cmUKLXRlc3RzLiAgVGhpcyBkZWZpbmVzIHRoZSBtYWNybyBAc2FtcHtfR05VX1NPVVJDRX0gd2hlbiBjb21waWxpbmcsIHdoaWNoCi1kaXJlY3RzIHRoZSBsaWJjIGhlYWRlciBmaWxlcyB0byBwcm92aWRlIHRoZSBzdGFuZGFyZCBHTlUgc3lzdGVtCi1pbnRlcmZhY2VzIGluY2x1ZGluZyBhbGwgR05VIGV4dGVuc2lvbnMuICBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkLAotY2VydGFpbiBHTlUgZXh0ZW5zaW9ucyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KLQotQGl0ZW0gQUNfT1VUUFVUCi1AY2luZGV4IEBzYW1we0FDX09VVFBVVH0KLVRoaXMgbWFjcm8gdGFrZXMgYSBsaXN0IG9mIGZpbGUgbmFtZXMgd2hpY2ggdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIHNob3VsZAotcHJvZHVjZS4gIFRoaXMgaXMgbm9ybWFsbHkgYSBsaXN0IG9mIG9uZSBvciBtb3JlIEBmaWxle01ha2VmaWxlfSBmaWxlcwotaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiAgSWYgeW91ciBwYWNrYWdlIGxpdmVzIGVudGlyZWx5IGluIGEgc2luZ2xlCi1kaXJlY3RvcnksIHlvdSB3b3VsZCB1c2Ugc2ltcGx5IEBzYW1we0FDX09VVFBVVChNYWtlZmlsZSl9LiAgSWYgeW91IGFsc28KLWhhdmUsIGZvciBleGFtcGxlLCBhIEBmaWxle2xpYn0gc3ViZGlyZWN0b3J5LCB5b3Ugd291bGQgdXNlCi1Ac2FtcHtBQ19PVVRQVVQoTWFrZWZpbGUgbGliL01ha2VmaWxlKX0uCi1AZW5kIHRhYmxlCi0KLUlmIHlvdSB3YW50IHRvIHVzZSBsb2NhbGx5IGRlZmluZWQgbWFjcm9zIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufQotZmlsZSwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIHdyaXRlIGEgQGZpbGV7YWNpbmNsdWRlLm00fSBmaWxlIHdoaWNoCi1kZWZpbmVzIHRoZW0gKGlmIG5vdCB1c2luZyBhdXRvbWFrZSwgdGhpcyBmaWxlIGlzIGNhbGxlZAotQGZpbGV7YWNsb2NhbC5tNH0pLiAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwdXQgc2VwYXJhdGUgbWFjcm9zIGluIGFuCi1AZmlsZXttNH0gc3ViZGlyZWN0b3J5LCBhbmQgcHV0IEBzYW1we0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00fSBpbiB5b3VyCi1AZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBzbyB0aGF0IHRoZSBAc2FtcHthY2xvY2FsfSBwcm9ncmFtIHdpbGwgYmUgYWJsZQotdG8gZmluZCB0aGVtLgotCi1UaGUgZGlmZmVyZW50IG1hY3JvIHByZWZpeGVzIGluZGljYXRlIHdoaWNoIHRvb2wgZGVmaW5lcyB0aGUgbWFjcm8uCi1NYWNyb3Mgd2hpY2ggc3RhcnQgd2l0aCBAc2FtcHtBQ199IGFyZSBwYXJ0IG9mIGF1dG9jb25mLiAgTWFjcm9zIHdoaWNoCi1zdGFydCB3aXRoIEBzYW1we0FNX30gYXJlIHByb3ZpZGVkIGJ5IGF1dG9tYWtlIG9yIGxpYnRvb2wuCi0KLUBub2RlIFdyaXRlIE1ha2VmaWxlLmFtCi1Ac2VjdGlvbiBXcml0ZSBNYWtlZmlsZS5hbQotQGNpbmRleCBAZmlsZXtNYWtlZmlsZS5hbX0sIHdyaXRpbmcKLQotWW91IG11c3Qgd3JpdGUgdGhlIGZpbGUgQGZpbGV7TWFrZWZpbGUuYW19LiAgVGhpcyBpcyBhbiBhdXRvbWFrZSBpbnB1dAotZmlsZSwgYW5kIHRoZSBhdXRvbWFrZSBtYW51YWwgZGVzY3JpYmVzIGluIGRldGFpbCB3aGF0IHRoaXMgZmlsZSBzaG91bGQKLWxvb2sgbGlrZS4KLQotVGhlIGF1dG9tYWtlIGNvbW1hbmRzIGluIEBmaWxle01ha2VmaWxlLmFtfSBtb3N0bHkgbG9vayBsaWtlIHZhcmlhYmxlCi1hc3NpZ25tZW50cyBpbiBhIEBmaWxle01ha2VmaWxlfS4gIGF1dG9tYWtlIHJlY29nbml6ZXMgc3BlY2lhbCB2YXJpYWJsZQotbmFtZXMsIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCBtYWtlIHJ1bGVzIHRvIHRoZSBvdXRwdXQgYXMgbmVlZGVkLgotCi1UaGVyZSB3aWxsIGJlIG9uZSBAZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBmb3IgZWFjaCBkaXJlY3RvcnkgaW4geW91cgotcGFja2FnZS4gIEZvciBlYWNoIGRpcmVjdG9yeSB3aXRoIHN1YmRpcmVjdG9yaWVzLCB0aGUgQGZpbGV7TWFrZWZpbGUuYW19Ci1maWxlIHNob3VsZCBjb250YWluIHRoZSBsaW5lCi1Ac21hbGxleGFtcGxlCi1TVUJESVJTID0gQHZhcntkaXJ9IEB2YXJ7ZGlyfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBlYWNoIEB2YXJ7ZGlyfSBpcyB0aGUgbmFtZSBvZiBhIHN1YmRpcmVjdG9yeS4KLQotRm9yIGVhY2ggQGZpbGV7TWFrZWZpbGUuYW19LCB0aGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nCi1AZmlsZXtNYWtlZmlsZX0gaW4gdGhlIEBzYW1we0FDX09VVFBVVH0gbWFjcm8gaW4gQGZpbGV7Y29uZmlndXJlLmlufS4KLQotRXZlcnkgQGZpbGV7TWFrZWZpbGUuYW19IHdyaXR0ZW4gYXQgQ3lnbnVzIHNob3VsZCBjb250YWluIHRoZSBsaW5lCi1Ac21hbGxleGFtcGxlCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHB1dHMgYXV0b21ha2UgaW50byBDeWdudXMgbW9kZS4gIFNlZSB0aGUgYXV0b21ha2UgbWFudWFsIGZvcgotZGV0YWlscy4KLQotWW91IG1heSB0byBpbmNsdWRlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAc2FtcHthdXRvbWFrZX0gdGhhdCB5b3UgYXJlCi11c2luZyBvbiB0aGUgQHNhbXB7QVVUT01BS0VfT1BUSU9OU30gbGluZS4gIEZvciBleGFtcGxlLAotQHNtYWxsZXhhbXBsZQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyAxLjMKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgd2lsbCBwcmV2ZW50IHVzZXJzIGZyb20gcnVubmluZyBhbiBlYXJsaWVyIHZlcnNpb24gb2YKLUBzYW1we2F1dG9tYWtlfSBhbmQgcGVyaGFwcyBnZXR0aW5nIGFuIGludmFsaWQgQGZpbGV7TWFrZWZpbGUuaW59LgotCi1JZiB5b3VyIHBhY2thZ2UgYnVpbGRzIGEgcHJvZ3JhbSwgdGhlbiBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoYXQKLXByb2dyYW0gaXMgYnVpbHQgeW91IHdpbGwgbm9ybWFsbHkgd2FudCBhIGxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotYmluX1BST0dSQU1TID0gQHZhcntwcm9ncmFtfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotd2hlcmUgQHZhcntwcm9ncmFtfSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbS4gIFlvdSB3aWxsIHRoZW4gd2FudCBhCi1saW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLUB2YXJ7cHJvZ3JhbX1fU09VUkNFUyA9IEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBlYWNoIEB2YXJ7ZmlsZX0gaXMgdGhlIG5hbWUgb2YgYSBzb3VyY2UgZmlsZSB0byBsaW5rIGludG8gdGhlCi1wcm9ncmFtIChlLmcuLCBAc2FtcHtmb28uY30pLgotCi1JZiB5b3VyIHBhY2thZ2UgYnVpbGRzIGEgbGlicmFyeSwgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgbGlicmFyeSB0bwotZXZlciBiZSBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhhdAotbGlicmFyeSBpcyBidWlsdCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1saWJfTElCUkFSSUVTID0gbGliQHZhcntuYW1lfS5hCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBAc2FtcHtsaWJAdmFye25hbWV9LmF9IGlzIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5LiAgWW91IHdpbGwgdGhlbgotd2FudCBhIGxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotbGliQHZhcntuYW1lfV9hX1NPVVJDRVMgPSBAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotd2hlcmUgZWFjaCBAdmFye2ZpbGV9IGlzIHRoZSBuYW1lIG9mIGEgc291cmNlIGZpbGUgdG8gYWRkIHRvIHRoZQotbGlicmFyeS4KLQotSWYgeW91ciBwYWNrYWdlIGJ1aWxkcyBhIGxpYnJhcnksIGFuZCB5b3Ugd2FudCB0byBwZXJtaXQgYnVpbGRpbmcgdGhlCi1saWJyYXJ5IGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGF0IGxpYnJhcnkgaXMKLWJ1aWx0IHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgYSBsaW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLWxpYl9MVExJQlJBUklFUyA9IGxpYkB2YXJ7bmFtZX0ubGEKLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgdXNlIG9mIEBzYW1we0xUTElCUkFSSUVTfSwgYW5kIHRoZSBAc2FtcHsubGF9IGV4dGVuc2lvbiwgaW5kaWNhdGUgYQotbGlicmFyeSB0byBiZSBidWlsdCB1c2luZyBsaWJ0b29sLiAgQXMgdXN1YWwsIHlvdSB3aWxsIHRoZW4gd2FudCBhIGxpbmUKLWxpa2UKLUBzbWFsbGV4YW1wbGUKLWxpYkB2YXJ7bmFtZX1fbGFfU09VUkNFUyA9IEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgc3RyaW5ncyBAc2FtcHtiaW59IGFuZCBAc2FtcHtsaWJ9IHRoYXQgYXBwZWFyIGFib3ZlIGluCi1Ac2FtcHtiaW5fUFJPR1JBTVN9IGFuZCBAc2FtcHtsaWJfTElCUkFSSUVTfSBhcmUgbm90IGFyYml0cmFyeS4gIFRoZXkKLXJlZmVyIHRvIHBhcnRpY3VsYXIgZGlyZWN0b3JpZXMsIHdoaWNoIG1heSBiZSBzZXQgYnkgdGhlIEBzYW1wey0tYmluZGlyfQotYW5kIEBzYW1wey0tbGliZGlyfSBvcHRpb25zIHRvIEBmaWxle2NvbmZpZ3VyZX0uICBJZiB0aG9zZSBvcHRpb25zIGFyZQotbm90IHVzZWQsIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIEBzYW1wey0tcHJlZml4fSBvcgotQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9ucyB0byBAZmlsZXtjb25maWd1cmV9LiAgSXQgaXMgcG9zc2libGUgdG8gdXNlCi1vdGhlciBuYW1lcyBpZiB0aGUgcHJvZ3JhbSBvciBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gc29tZSBvdGhlcgotZGlyZWN0b3J5LgotCi1UaGUgQGZpbGV7TWFrZWZpbGUuYW19IGZpbGUgbWF5IGFsc28gY29udGFpbiBhbG1vc3QgYW55dGhpbmcgdGhhdCBtYXkKLWFwcGVhciBpbiBhIG5vcm1hbCBAZmlsZXtNYWtlZmlsZX0uICBhdXRvbWFrZSBhbHNvIHN1cHBvcnRzIG1hbnkgb3RoZXIKLXNwZWNpYWwgdmFyaWFibGVzLCBhcyB3ZWxsIGFzIGNvbmRpdGlvbmFscy4KLQotU2VlIHRoZSBhdXRvbWFrZSBtYW51YWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBub2RlIFdyaXRlIGFjY29uZmlnLmgKLUBzZWN0aW9uIFdyaXRlIGFjY29uZmlnLmgKLUBjaW5kZXggQGZpbGV7YWNjb25maWcuaH0sIHdyaXRpbmcKLQotSWYgeW91IGFyZSBnZW5lcmF0aW5nIGEgcG9ydGFiaWxpdHkgaGVhZGVyIGZpbGUsIChpLmUuLCB5b3UgYXJlIHVzaW5nCi1Ac2FtcHtBTV9DT05GSUdfSEVBREVSfSBpbiBAZmlsZXtjb25maWd1cmUuaW59KSwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvCi13cml0ZSBhIEBmaWxle2FjY29uZmlnLmh9IGZpbGUuICBJdCB3aWxsIGhhdmUgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nCi1saW5lcy4KLQotQHNtYWxsZXhhbXBsZQotLyogTmFtZSBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gb2YgcGFja2FnZS4gICovCi0jdW5kZWYgVkVSU0lPTgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyByZXF1aXJlbWVudCBpcyByZWFsbHkgYSBidWcgaW4gdGhlIHN5c3RlbSwgYW5kIHRoZSByZXF1aXJlbWVudCBtYXkKLWJlIGVsaW1pbmF0ZWQgYXQgc29tZSBsYXRlciBkYXRlLgotCi1UaGUgQGZpbGV7YWNjb25maWcuaH0gZmlsZSB3aWxsIGFsc28gc2ltaWxhciBjb21tZW50IGFuZCBAc2FtcHsjdW5kZWZ9Ci1saW5lcyBmb3IgYW55IHVudXN1YWwgbWFjcm9zIGluIHRoZSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIGluY2x1ZGluZwotYW55IG1hY3JvIHdoaWNoIGFwcGVhcnMgaW4gYSBAc2FtcHtBQ19ERUZJTkV9IG1hY3JvLgotCi1JbiBwYXJ0aWN1bGFyLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBHTlUgcGFja2FnZSBhbmQgdGhlcmVmb3JlIGluY2x1ZGUKLUBzYW1we0FDX0RFRklORShfR05VX1NPVVJDRSl9IGluIEBmaWxle2NvbmZpZ3VyZS5pbn0gYXMgc3VnZ2VzdGVkIGFib3ZlLAoteW91IHdpbGwgbmVlZCBsaW5lcyBsaWtlIHRoaXMgaW4gQGZpbGV7YWNjb25maWcuaH06Ci1Ac21hbGxleGFtcGxlCi0vKiBFbmFibGUgR05VIGV4dGVuc2lvbnMuICAqLwotI3VuZGVmIF9HTlVfU09VUkNFCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ob3JtYWxseSB0aGUgQHNhbXB7YXV0b2hlYWRlcn0gcHJvZ3JhbSB3aWxsIGluZm9ybSB5b3Ugb2YgYW55IHN1Y2gKLXJlcXVpcmVtZW50cyBieSBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gaXQgaXMgcnVuLiAgSG93ZXZlciwgaWYKLXlvdSBkbyBhbnl0aGluZyBwYXJ0aWN1bGFyIG9kZCBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgeW91Ci13aWxsIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJpZ2h0IGVudHJpZXMgYXBwZWFyIGluCi1AZmlsZXthY2NvbmZpZy5ofSwgc2luY2Ugb3RoZXJ3aXNlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBtYXkgbm90IGJlCi1hdmFpbGFibGUgaW4gdGhlIEBmaWxle2NvbmZpZy5ofSBmaWxlIHdoaWNoIHlvdXIgY29kZSB3aWxsIHVzZS4KLQotKFRoZWUgQHNhbXB7UEFDS0FHRX0gYW5kIEBzYW1we1ZFUlNJT059IGxpbmVzIGFyZSBub3QgcmVxdWlyZWQgaWYgeW91Ci1hcmUgbm90IHVzaW5nIGF1dG9tYWtlLCBhbmQgaW4gdGhhdCBjYXNlIHlvdSBtYXkgbm90IG5lZWQgYQotQGZpbGV7YWNjb25maWcuaH0gZmlsZSBhdCBhbGwpLgotCi1Abm9kZSBHZW5lcmF0ZSBmaWxlcwotQHNlY3Rpb24gR2VuZXJhdGUgZmlsZXMKLQotT25jZSB5b3UgaGF2ZSB3cml0dGVuIEBmaWxle2NvbmZpZ3VyZS5pbn0sIEBmaWxle01ha2VmaWxlLmFtfSwKLUBmaWxle2FjY29uZmlnLmh9LCBhbmQgcG9zc2libHkgQGZpbGV7YWNpbmNsdWRlLm00fSwgeW91IG11c3QgdXNlCi1hdXRvY29uZiBhbmQgYXV0b21ha2UgcHJvZ3JhbXMgdG8gcHJvZHVjZSB0aGUgZmlyc3QgdmVyc2lvbnMgb2YgdGhlCi1nZW5lcmF0ZWQgZmlsZXMuICBUaGlzIGlzIGRvbmUgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YKLWNvbW1hbmRzLgotCi1Ac21hbGxleGFtcGxlCi1hY2xvY2FsCi1hdXRvY29uZgotYXV0b2hlYWRlcgotYXV0b21ha2UKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2FtcHthY2xvY2FsfSBhbmQgQHNhbXB7YXV0b21ha2V9IGNvbW1hbmRzIGFyZSBwYXJ0IG9mIHRoZSBhdXRvbWFrZQotcGFja2FnZSwgYW5kIHRoZSBAc2FtcHthdXRvY29uZn0gYW5kIEBzYW1we2F1dG9oZWFkZXJ9IGNvbW1hbmRzIGFyZSBwYXJ0Ci1vZiB0aGUgYXV0b2NvbmYgcGFja2FnZS4KLQotSWYgeW91IGFyZSB1c2luZyBhIEBmaWxle200fSBzdWJkaXJlY3RvcnkgZm9yIHlvdXIgbWFjcm9zLCB5b3Ugd2lsbCBuZWVkCi10byB1c2UgdGhlIEBzYW1wey1JIG00fSBvcHRpb24gd2hlbiB5b3UgcnVuIEBzYW1we2FjbG9jYWx9LgotCi1JZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIHVzZSB0aGUgQHNhbXB7LWF9IG9wdGlvbiB3aGVuCi1ydW5uaW5nIEBzYW1we2F1dG9tYWtlfSBjb21tYW5kIGluIG9yZGVyIHRvIGNvcHkgdGhlIHJlcXVpcmVkIHN1cHBvcnQKLWZpbGVzIGludG8geW91ciBzb3VyY2UgZGlyZWN0b3J5LgotCi1JZiB5b3UgYXJlIHVzaW5nIGxpYnRvb2wsIHlvdSBtdXN0IGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBsaWJ0b29sIHBhY2thZ2UKLXdpdGggdGhlIHNhbWUgQHNhbXB7LS1wcmVmaXh9IGFuZCBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb25zIGFzIHlvdQotdXNlZCB3aXRoIHRoZSBhdXRvY29uZiBhbmQgYXV0b21ha2UgcGFja2FnZXMuICBZb3UgbXVzdCBkbyB0aGlzIGJlZm9yZQotcnVubmluZyBhbnkgb2YgdGhlIGFib3ZlIGNvbW1hbmRzLiAgSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIEN5Z251cwotdHJlZSwgeW91IHdpbGwgbmVlZCB0byBydW4gdGhlIEBzYW1we2xpYnRvb2xpemV9IHByb2dyYW0gdG8gY29weSB0aGUKLWxpYnRvb2wgc3VwcG9ydCBmaWxlcyBpbnRvIHlvdXIgZGlyZWN0b3J5LgotCi1PbmNlIHlvdSBoYXZlIG1hbmFnZWQgdG8gcnVuIHRoZXNlIGNvbW1hbmRzIHdpdGhvdXQgZ2V0dGluZyBhbnkgZXJyb3JzLAoteW91IHNob3VsZCBjcmVhdGUgYSBuZXcgZW1wdHkgZGlyZWN0b3J5LCBhbmQgcnVuIHRoZSBAc2FtcHtjb25maWd1cmV9Ci1zY3JpcHQgd2hpY2ggd2lsbCBoYXZlIGJlZW4gY3JlYXRlZCBieSBAc2FtcHthdXRvY29uZn0gd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLiAgVGhpcyB3aWxsIGdpdmUgeW91IGEgc2V0IG9mCi1NYWtlZmlsZXMgd2hpY2ggd2lsbCBpbmNsdWRlIHJ1bGVzIHRvIGF1dG9tYXRpY2FsbHkgcmVidWlsZCBhbGwgdGhlCi1nZW5lcmF0ZWQgZmlsZXMuCi0KLUFmdGVyIGRvaW5nIHRoYXQsIHdoZW5ldmVyIHlvdSBoYXZlIGNoYW5nZWQgc29tZSBvZiB0aGUgaW5wdXQgZmlsZXMgYW5kCi13YW50IHRvIHJlZ2VuZXJhdGVkIHRoZSBvdGhlciBmaWxlcywgZ28gdG8geW91ciBvYmplY3QgZGlyZWN0b3J5IGFuZCBydW4KLUBzYW1we21ha2V9LiAgRG9pbmcgdGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gdHJ5aW5nIHRvIHJlYnVpbGQgdGhlCi1maWxlcyBtYW51YWxseSwgYmVjYXVzZSB0aGVyZSBhcmUgY29tcGxleCBvcmRlciBkZXBlbmRlbmNpZXMgYW5kIGl0IGlzCi1lYXN5IHRvIGZvcmdldCBzb21ldGhpbmcuCi0KLUBub2RlIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlCi1Ac2VjdGlvbiBFeGFtcGxlCi0KLUxldCdzIGNvbnNpZGVyIGEgdHJpdmlhbCBleGFtcGxlLgotCi1TdXBwb3NlIHdlIHdhbnQgdG8gd3JpdGUgYSBzaW1wbGUgdmVyc2lvbiBvZiBAc2FtcHt0b3VjaH0uICBPdXIgcHJvZ3JhbSwKLXdoaWNoIHdlIHdpbGwgY2FsbCBAc2FtcHtwb2tlfSwgd2lsbCB0YWtlIGEgc2luZ2xlIGZpbGUgbmFtZSBhcmd1bWVudCwKLWFuZCB1c2UgdGhlIEBzYW1we3V0aW1lfSBzeXN0ZW0gY2FsbCB0byBzZXQgdGhlIG1vZGlmaWNhdGlvbiBhbmQgYWNjZXNzCi10aW1lcyBvZiB0aGUgZmlsZSB0byB0aGUgY3VycmVudCB0aW1lLiAgV2Ugd2FudCB0aGlzIHByb2dyYW0gdG8gYmUKLWhpZ2hseSBwb3J0YWJsZS4KLQotV2UnbGwgZmlyc3Qgc2VlIHdoYXQgdGhpcyBsb29rcyBsaWtlIHdpdGhvdXQgdXNpbmcgYXV0b2NvbmYgYW5kCi1hdXRvbWFrZSwgYW5kIHRoZW4gc2VlIHdoYXQgaXQgbG9va3MgbGlrZSB3aXRoIHRoZW0uCi0KLUBtZW51Ci0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDE6OgkJRmlyc3QgVHJ5LgotKiBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAyOjoJCVNlY29uZCBUcnkuCi0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDM6OgkJVGhpcmQgVHJ5LgotKiBHZW5lcmF0ZSBGaWxlcyBpbiBFeGFtcGxlOjoJCUdlbmVyYXRlIEZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDEKLUBzdWJzZWN0aW9uIEZpcnN0IFRyeQotCi1IZXJlIGlzIG91ciBmaXJzdCB0cnkgYXQgQHNhbXB7cG9rZS5jfS4gIE5vdGUgdGhhdCB3ZSd2ZSB3cml0dGVuIGl0Ci13aXRob3V0IEFOU0kvSVNPIEMgcHJvdG90eXBlcywgc2luY2Ugd2Ugd2FudCBpdCB0byBiZSBoaWdobHkgcG9ydGFibGUuCi0KLUBleGFtcGxlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGltZS5oPgotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLUB7Ci0gIGlmIChhcmdjICE9IDIpCi0gICAgQHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiBwb2tlIGZpbGVcbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBpZiAodXRpbWUgKGFyZ3ZbMV0sIE5VTEwpIDwgMCkKLSAgICBAewotICAgICAgcGVycm9yICgidXRpbWUiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIEB9Ci0KLSAgZXhpdCAoMCk7Ci1AfQotQGVuZCBleGFtcGxlCi0KLVdlIGFsc28gd3JpdGUgYSBzaW1wbGUgQGZpbGV7TWFrZWZpbGV9LgotCi1AZXhhbXBsZQotQ0MgPSBnY2MKLUNGTEFHUyA9IC1nIC1PMgotCi1hbGw6IHBva2UKLQotcG9rZTogcG9rZS5vCi0JJChDQykgLW8gcG9rZSAkKENGTEFHUykgJChMREZMQUdTKSBwb2tlLm8KLUBlbmQgZXhhbXBsZQotCi1TbyBmYXIsIHNvIGdvb2QuCi0KLVVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBhIGZldyBwcm9ibGVtcy4KLQotT24gb2xkZXIgVW5peCBzeXN0ZW1zIGRlcml2ZWQgZnJvbSBCU0QgNC4zLCB0aGUgQHNhbXB7dXRpbWV9IHN5c3RlbSBjYWxsCi1kb2VzIG5vdCBhY2NlcHQgYSBzZWNvbmQgYXJndW1lbnQgb2YgQHNhbXB7TlVMTH0uICBPbiB0aG9zZSBzeXN0ZW1zLCB3ZQotbmVlZCB0byBwYXNzIGEgcG9pbnRlciB0byBAc2FtcHtzdHJ1Y3QgdXRpbWJ1Zn0gc3RydWN0dXJlLgotVW5mb3J0dW5hdGVseSwgZXZlbiBvbGRlciBzeXN0ZW1zIGRvbid0IGRlZmluZSB0aGF0IHN0cnVjdHVyZTsgb24gdGhvc2UKLXN5c3RlbXMsIHdlIG5lZWQgdG8gcGFzcyBhbiBhcnJheSBvZiB0d28gQHNhbXB7bG9uZ30gdmFsdWVzLgotCi1UaGUgaGVhZGVyIGZpbGUgQGZpbGV7c3RkbGliLmh9IHdhcyBpbnZlbnRlZCBieSBBTlNJIEMsIGFuZCBvbGRlcgotc3lzdGVtcyBkb24ndCBoYXZlIGEgY29weS4gIFdlIGluY2x1ZGVkIGl0IGFib3ZlIHRvIGdldCBhIGRlY2xhcmF0aW9uIG9mCi1Ac2FtcHtleGl0fS4KLQotV2UgY2FuIGZpbmQgc29tZSBvZiB0aGVzZSBwb3J0YWJpbGl0eSBwcm9ibGVtcyBieSBydW5uaW5nCi1Ac2FtcHthdXRvc2Nhbn0sIHdoaWNoIHdpbGwgY3JlYXRlIGEgQGZpbGV7Y29uZmlndXJlLnNjYW59IGZpbGUgd2hpY2ggd2UKLWNhbiB1c2UgYXMgYSBwcm90b3R5cGUgZm9yIG91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUuICBJIHdvbid0IHNob3cKLXRoZSBvdXRwdXQsIGJ1dCBpdCB3aWxsIG5vdGljZSB0aGUgcG90ZW50aWFsIHByb2JsZW1zIHdpdGggQHNhbXB7dXRpbWV9Ci1hbmQgQGZpbGV7c3RkbGliLmh9LgotCi1JbiBvdXIgQGZpbGV7TWFrZWZpbGV9LCB3ZSBkb24ndCBwcm92aWRlIGFueSB3YXkgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbS4KLVRoaXMgZG9lc24ndCBtYXR0ZXIgbXVjaCBmb3Igc3VjaCBhIHNpbXBsZSBleGFtcGxlLCBidXQgYSByZWFsIHByb2dyYW0KLXdpbGwgbmVlZCBhbiBAc2FtcHtpbnN0YWxsfSB0YXJnZXQuICBGb3IgdGhhdCBtYXR0ZXIsIHdlIHdpbGwgYWxzbyB3YW50Ci1hIEBzYW1we2NsZWFufSB0YXJnZXQuCi0KLUBub2RlIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDIKLUBzdWJzZWN0aW9uIFNlY29uZCBUcnkKLQotSGVyZSBpcyBvdXIgc2Vjb25kIHRyeSBhdCB0aGlzIHByb2dyYW0uCi0KLVdlIG1vZGlmeSBAZmlsZXtwb2tlLmN9IHRvIHVzZSBwcmVwcm9jZXNzb3IgbWFjcm9zIHRvIGNvbnRyb2wgd2hhdAotZmVhdHVyZXMgYXJlIGF2YWlsYWJsZS4gIChJJ3ZlIGNoZWF0ZWQgYSBiaXQgYnkgdXNpbmcgdGhlIHNhbWUgbWFjcm8KLW5hbWVzIHdoaWNoIGF1dG9jb25mIHdpbGwgdXNlKS4KLQotQGV4YW1wbGUKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgSEFWRV9VVElNRV9ICi0jaW5jbHVkZSA8dXRpbWUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfVVRJTUVfTlVMTAotCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWZuZGVmIEhBVkVfU1RSVUNUX1VUSU1CVUYKLQotc3RydWN0IHV0aW1idWYKLUB7Ci0gIGxvbmcgYWN0aW1lOwotICBsb25nIG1vZHRpbWU7Ci1AfTsKLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLXV0aW1lX25vdyAoZmlsZSkKLSAgICAgY2hhciAqZmlsZTsKLUB7Ci0gIHN0cnVjdCB1dGltYnVmIG5vdzsKLQotICBub3cuYWN0aW1lID0gbm93Lm1vZHRpbWUgPSB0aW1lIChOVUxMKTsKLSAgcmV0dXJuIHV0aW1lIChmaWxlLCAmbm93KTsKLUB9Ci0KLSNkZWZpbmUgdXRpbWUoZiwgcCkgdXRpbWVfbm93IChmKQotCi0jZW5kaWYgLyogSEFWRV9VVElNRV9OVUxMICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLUB7Ci0gIGlmIChhcmdjICE9IDIpCi0gICAgQHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiBwb2tlIGZpbGVcbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBpZiAodXRpbWUgKGFyZ3ZbMV0sIE5VTEwpIDwgMCkKLSAgICBAewotICAgICAgcGVycm9yICgidXRpbWUiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIEB9Ci0KLSAgZXhpdCAoMCk7Ci1AfQotQGVuZCBleGFtcGxlCi0KLUhlcmUgaXMgdGhlIGFzc29jaWF0ZWQgQGZpbGV7TWFrZWZpbGV9LiAgV2UndmUgYWRkZWQgc3VwcG9ydCBmb3IgdGhlCi1wcmVwcm9jZXNzb3IgZmxhZ3Mgd2UgdXNlLiAgV2UndmUgYWxzbyBhZGRlZCBAc2FtcHtpbnN0YWxsfSBhbmQKLUBzYW1we2NsZWFufSB0YXJnZXRzLgotCi1AZXhhbXBsZQotIyBTZXQgdGhpcyB0byB5b3VyIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi1iaW5kaXIgPSAvdXNyL2xvY2FsL2JpbgotCi0jIFVuY29tbWVudCB0aGlzIGlmIHlvdSBoYXZlIHRoZSBzdGFuZGFyZCBBTlNJL0lTTyBDIGhlYWRlciBmaWxlcy4KLSMgU1REQ19IRFJTID0gLURTVERDX0hFQURFUlMKLQotIyBVbmNvbW1lbnQgdGhpcyBpZiB5b3UgaGF2ZSB1dGltZS5oLgotIyBVVElNRV9IID0gLURIQVZFX1VUSU1FX0gKLQotIyBVbmNvbW1lbnQgdGhpcyBpZiB1dGltZSAoRklMRSwgTlVMTCkgd29ya3Mgb24geW91ciBzeXN0ZW0uCi0jIFVUSU1FX05VTEwgPSAtREhBVkVfVVRJTUVfTlVMTAotCi0jIFVuY29tbWVudCB0aGlzIGlmIHN0cnVjdCB1dGltYnVmIGlzIGRlZmluZWQgaW4gdXRpbWUuaC4KLSMgVVRJTUJVRiA9IC1ESEFWRV9TVFJVQ1RfVVRJTUJVRgotCi1DQyA9IGdjYwotQ0ZMQUdTID0gLWcgLU8yCi0KLUFMTF9DRkxBR1MgPSAkKFNURENfSERSUykgJChVVElNRV9IKSAkKFVUSU1FX05VTEwpICQoVVRJTUJVRikgJChDRkxBR1MpCi0KLWFsbDogcG9rZQotCi1wb2tlOiBwb2tlLm8KLQkkKENDKSAtbyBwb2tlICQoQUxMX0NGTEFHUykgJChMREZMQUdTKSBwb2tlLm8KLQotLmMubzoKLQkkKENDKSAtYyAkKEFMTF9DRkxBR1MpIHBva2UuYwotCi1pbnN0YWxsOiBwb2tlCi0JY3AgcG9rZSAkKGJpbmRpcikvcG9rZQotCi1jbGVhbjoKLQlybSBwb2tlIHBva2UubwotQGVuZCBleGFtcGxlCi0KLVNvbWUgcHJvYmxlbXMgd2l0aCB0aGlzIGFwcHJvYWNoIHNob3VsZCBiZSBjbGVhci4KLQotVXNlcnMgd2hvIHdhbnQgdG8gY29tcGlsZSBwb2tlIHdpbGwgaGF2ZSB0byBrbm93IGhvdyBAc2FtcHt1dGltZX0gd29ya3MKLW9uIHRoZWlyIHN5c3RlbXMsIHNvIHRoYXQgdGhleSBjYW4gdW5jb21tZW50IHRoZSBAZmlsZXtNYWtlZmlsZX0KLWNvcnJlY3RseS4KLQotVGhlIGluc3RhbGxhdGlvbiBpcyBkb25lIHVzaW5nIEBzYW1we2NwfSwgYnV0IG1hbnkgc3lzdGVtcyBoYXZlIGFuCi1Ac2FtcHtpbnN0YWxsfSBwcm9ncmFtIHdoaWNoIG1heSBiZSB1c2VkLCBhbmQgd2hpY2ggc3VwcG9ydHMgb3B0aW9uYWwKLWZlYXR1cmVzIHN1Y2ggYXMgc3RyaXBwaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvdXQgb2YgdGhlIGluc3RhbGxlZAotYmluYXJ5LgotCi1UaGUgdXNlIG9mIEBmaWxle01ha2VmaWxlfSB2YXJpYWJsZXMgbGlrZSBAc2FtcHtDQ30sIEBzYW1we0NGTEFHU30gYW5kCi1Ac2FtcHtMREZMQUdTfSBmb2xsb3dzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIEdOVSBzdGFuZGFyZHMuICBUaGlzIGlzCi1jb252ZW5pZW50IGZvciBhbGwgcGFja2FnZXMsIHNpbmNlIGl0IHJlZHVjZXMgc3VycHJpc2VzIGZvciB1c2Vycy4KLUhvd2V2ZXIsIGl0IGlzIGVhc3kgdG8gZ2V0IHRoZSBkZXRhaWxzIHdyb25nLCBhbmQgd2luZCB1cCB3aXRoIGEKLXNsaWdodGx5IG5vbnN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMwotQHN1YnNlY3Rpb24gVGhpcmQgVHJ5Ci0KLUZvciBvdXIgdGhpcmQgdHJ5IGF0IHRoaXMgcHJvZ3JhbSwgd2Ugd2lsbCB3cml0ZSBhIEBmaWxle2NvbmZpZ3VyZS5pbn0KLXNjcmlwdCB0byBkaXNjb3ZlciB0aGUgY29uZmlndXJhdGlvbiBmZWF0dXJlcyBvbiB0aGUgaG9zdCBzeXN0ZW0sIHJhdGhlcgotdGhhbiByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZWRpdCB0aGUgQGZpbGV7TWFrZWZpbGV9LiAgV2Ugd2lsbCBhbHNvIHdyaXRlCi1hIEBmaWxle01ha2VmaWxlLmFtfSByYXRoZXIgdGhhbiBhIEBmaWxle01ha2VmaWxlfS4KLQotVGhlIG9ubHkgY2hhbmdlIHRvIEBmaWxle3Bva2UuY30gaXMgdG8gYWRkIGEgbGluZSBhdCB0aGUgc3RhcnQgb2YgdGhlCi1maWxlOgotQHNtYWxsZXhhbXBsZQotI2luY2x1ZGUgImNvbmZpZy5oIgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIG5ldyBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaXMgYXMgZm9sbG93cy4KLQotQGV4YW1wbGUKLUFDX0lOSVQocG9rZS5jKQotQU1fSU5JVF9BVVRPTUFLRShwb2tlLCAxLjApCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLUFDX1BST0dfQ0MKLUFDX0hFQURFUl9TVERDCi1BQ19DSEVDS19IRUFERVJTKHV0aW1lLmgpCi1BQ19FR1JFUF9IRUFERVIodXRpbWJ1ZiwgdXRpbWUuaCwgQUNfREVGSU5FKEhBVkVfU1RSVUNUX1VUSU1CVUYpKQotQUNfRlVOQ19VVElNRV9OVUxMCi1BQ19PVVRQVVQoTWFrZWZpbGUpCi1AZW5kIGV4YW1wbGUKLQotVGhlIGZpcnN0IGZvdXIgbWFjcm9zIGluIHRoaXMgZmlsZSwgYW5kIHRoZSBsYXN0IG9uZSwgd2VyZSBkZXNjcmliZWQKLWFib3ZlOyBzZWUgQHJlZntXcml0ZSBjb25maWd1cmUuaW59LiAgSWYgd2Ugb21pdCB0aGVzZSBtYWNyb3MsIHRoZW4gd2hlbgotd2UgcnVuIEBzYW1we2F1dG9tYWtlfSB3ZSB3aWxsIGdldCBhIHJlbWluZGVyIHRoYXQgd2UgbmVlZCB0aGVtLgotCi1UaGUgb3RoZXIgbWFjcm9zIGFyZSBzdGFuZGFyZCBhdXRvY29uZiBtYWNyb3MuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gQUNfSEVBREVSX1NUREMKLUNoZWNrIGZvciBzdGFuZGFyZCBDIGhlYWRlcnMuCi1AaXRlbSBBQ19DSEVDS19IRUFERVJTCi1DaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBoZWFkZXIgZmlsZSBleGlzdHMuCi1AaXRlbSBBQ19FR1JFUF9IRUFERVIKLUNoZWNrIGZvciBhIHBhcnRpY3VsYXIgc3RyaW5nIGluIGEgcGFydGljdWxhciBoZWFkZXIgZmlsZSwgaW4gdGhpcyBjYXNlCi1jaGVja2luZyBmb3IgQHNhbXB7dXRpbWJ1Zn0gaW4gQGZpbGV7dXRpbWUuaH0uCi1AaXRlbSBBQ19GVU5DX1VUSU1FX05VTEwKLUNoZWNrIHdoZXRoZXIgQHNhbXB7dXRpbWV9IGFjY2VwdHMgYSBOVUxMIHNlY29uZCBhcmd1bWVudCB0byBzZXQgdGhlCi1maWxlIGNoYW5nZSB0aW1lIHRvIHRoZSBjdXJyZW50IHRpbWUuCi1AZW5kIHRhYmxlCi0KLVNlZSB0aGUgYXV0b2NvbmYgbWFudWFsIGZvciBhIG1vcmUgY29tcGxldGUgZGVzY3JpcHRpb24uCi0KLVRoZSBuZXcgQGZpbGV7TWFrZWZpbGUuYW19IGZpbGUgaXMgYXMgZm9sbG93cy4gIE5vdGUgaG93IHNpbXBsZSB0aGlzIGlzCi1jb21wYXJlZCB0byBvdXIgZWFybGllciBAZmlsZXtNYWtlZmlsZX0uCi0KLUBleGFtcGxlCi1iaW5fUFJPR1JBTVMgPSBwb2tlCi0KLXBva2VfU09VUkNFUyA9IHBva2UuYwotQGVuZCBleGFtcGxlCi0KLVRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgYnVpbGQgYSBzaW5nbGUgcHJvZ3JhbSBuYW1lIEBzYW1we3Bva2V9LiAgSXQKLXNob3VsZCBiZSBpbnN0YWxsZWQgaW4gdGhlIGJpbmFyeSBkaXJlY3RvcnksIHdoaWNoIHdlIGNhbGxlZAotQHNhbXB7YmluZGlyfSBlYXJsaWVyLiAgVGhlIHByb2dyYW0gQHNhbXB7cG9rZX0gaXMgYnVpbHQgZnJvbSB0aGUgc291cmNlCi1maWxlIEBmaWxle3Bva2UuY30uCi0KLVdlIG11c3QgYWxzbyB3cml0ZSBhIEBmaWxle2FjY29uZmlnLmh9IGZpbGUuICBCZXNpZGVzIEBzYW1we1BBQ0tBR0V9IGFuZAotQHNhbXB7VkVSU0lPTn0sIHdoaWNoIG11c3QgYmUgbWVudGlvbmVkIGZvciBhbGwgcGFja2FnZXMgd2hpY2ggdXNlCi1hdXRvbWFrZSwgd2UgbXVzdCBpbmNsdWRlIEBzYW1we0hBVkVfU1RSVUNUX1VUSU1CVUZ9LCBzaW5jZSB3ZSBtZW50aW9uZWQKLWl0IGluIGFuIEBzYW1we0FDX0RFRklORX0uCi0KLUBleGFtcGxlCi0vKiBOYW1lIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIFdoZXRoZXIgdXRpbWUuaCBkZWZpbmVzIHN0cnVjdCB1dGltYnVmLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlVDVF9VVElNQlVGCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgR2VuZXJhdGUgRmlsZXMgaW4gRXhhbXBsZQotQHN1YnNlY3Rpb24gR2VuZXJhdGUgRmlsZXMKLQotV2UgbXVzdCBub3cgZ2VuZXJhdGUgdGhlIG90aGVyIGZpbGVzLCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzLgotCi1Ac21hbGxleGFtcGxlCi1hY2xvY2FsCi1hdXRvY29uZgotYXV0b2hlYWRlcgotYXV0b21ha2UKLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4gd2UgcnVuIEBzYW1we2F1dG9oZWFkZXJ9LCBpdCB3aWxsIHJlbWluZCB1cyBvZiBhbnkgbWFjcm9zIHdlIGZvcmdvdAotdG8gYWRkIHRvIEBmaWxle2FjY29uZmlnLmh9LgotCi1XaGVuIHdlIHJ1biBAc2FtcHthdXRvbWFrZX0sIGl0IHdpbGwgd2FudCB0byBhZGQgc29tZSBmaWxlcyB0byBvdXIKLWRpc3RyaWJ1dGlvbi4gIEl0IHdpbGwgYWRkIHRoZW0gYXV0b21hdGljYWxseSBpZiB3ZSB1c2UgdGhlCi1Ac2FtcHstLWFkZC1taXNzaW5nfSBvcHRpb24uCi0KLUJ5IGRlZmF1bHQsIEBzYW1we2F1dG9tYWtlfSB3aWxsIHJ1biBpbiBHTlUgbW9kZSwgd2hpY2ggbWVhbnMgdGhhdCBpdAotd2lsbCB3YW50IHVzIHRvIGNyZWF0ZSBjZXJ0YWluIGFkZGl0aW9uYWwgZmlsZXM7IGFzIG9mIHRoaXMgd3JpdGluZywgaXQKLXdpbGwgd2FudCBAZmlsZXtORVdTfSwgQGZpbGV7UkVBRE1FfSwgQGZpbGV7QVVUSE9SU30sIGFuZAotQGZpbGV7Q2hhbmdlTG9nfSwgYWxsIG9mIHdoaWNoIGFyZSBmaWxlcyB3aGljaCBzaG91bGQgYXBwZWFyIGluIGEKLXN0YW5kYXJkIEdOVSBkaXN0cmlidXRpb24uICBXZSBjYW4gZWl0aGVyIGFkZCB0aG9zZSBmaWxlcywgb3IgcnVuCi1Ac2FtcHthdXRvbWFrZX0gd2l0aCB0aGUgQHNhbXB7LS1mb3JlaWdufSBvcHRpb24uCi0KLVJ1bm5pbmcgdGhlc2UgdG9vbHMgd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIGZpbGVzLCBhbGwgb2Ygd2hpY2ggYXJlCi1kZXNjcmliZWQgaW4gdGhlIG5leHQgY2hhcHRlci4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUBmaWxle2FjbG9jYWwubTR9Ci1AaXRlbQotQGZpbGV7Y29uZmlndXJlfQotQGl0ZW0KLUBmaWxle2NvbmZpZy5pbn0KLUBpdGVtCi1AZmlsZXtNYWtlZmlsZS5pbn0KLUBpdGVtCi1AZmlsZXtzdGFtcC1oLmlufQotQGVuZCBpdGVtaXplCi0KLUBub2RlIEZpbGVzCi1AY2hhcHRlciBGaWxlcwotCi1BcyB3YXMgc2VlbiBpbiB0aGUgcHJldmlvdXMgY2hhcHRlciwgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotdXNlcyBhIG51bWJlciBvZiBkaWZmZXJlbnQgZmlsZXMuICBUaGUgZGV2ZWxvcGVyIG11c3Qgd3JpdGUgYSBmZXcgZmlsZXMuCi1UaGUgb3RoZXJzIGFyZSBnZW5lcmF0ZWQgYnkgdmFyaW91cyB0b29scy4KLQotVGhlIHN5c3RlbSBpcyByYXRoZXIgZmxleGlibGUsIGFuZCBjYW4gYmUgdXNlZCBpbiBtYW55IGRpZmZlcmVudCB3YXlzLgotSW4gZGVzY3JpYmluZyB0aGUgZmlsZXMgdGhhdCBpdCB1c2VzLCBJIHdpbGwgZGVzY3JpYmUgdGhlIGNvbW1vbiBjYXNlLAotYW5kIG1lbnRpb24gc29tZSBvdGhlciBjYXNlcyB0aGF0IG1heSBhcmlzZS4KLQotQG1lbnUKLSogRGV2ZWxvcGVyIEZpbGVzOjoJCURldmVsb3BlciBGaWxlcy4KLSogQnVpbGQgRmlsZXM6OgkJCUJ1aWxkIEZpbGVzLgotKiBTdXBwb3J0IEZpbGVzOjoJCVN1cHBvcnQgRmlsZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgRGV2ZWxvcGVyIEZpbGVzCi1Ac2VjdGlvbiBEZXZlbG9wZXIgRmlsZXMKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZmlsZXMgd3JpdHRlbiBvciBnZW5lcmF0ZWQgYnkgdGhlIGRldmVsb3Blcgotb2YgYSBwYWNrYWdlLgotCi1AbWVudQotKiBEZXZlbG9wZXIgRmlsZXMgUGljdHVyZTo6CURldmVsb3BlciBGaWxlcyBQaWN0dXJlLgotKiBXcml0dGVuIERldmVsb3BlciBGaWxlczo6CVdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzLgotKiBHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzOjoJR2VuZXJhdGVkIERldmVsb3BlciBGaWxlcy4KLUBlbmQgbWVudQotCi1Abm9kZSBEZXZlbG9wZXIgRmlsZXMgUGljdHVyZQotQHN1YnNlY3Rpb24gRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmUKLQotSGVyZSBpcyBhIHBpY3R1cmUgb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSB3cml0dGVuIGJ5IHRoZSBkZXZlbG9wZXIsIHRoZQotZ2VuZXJhdGVkIGZpbGVzIHdoaWNoIHdvdWxkIGJlIGluY2x1ZGVkIHdpdGggYSBjb21wbGV0ZSBzb3VyY2UKLWRpc3RyaWJ1dGlvbiwgYW5kIHRoZSB0b29scyB3aGljaCBjcmVhdGUgdGhvc2UgZmlsZXMuCi1AaWZpbmZvCi1UaGUgZmlsZSBuYW1lcyBhcmUgcGxhaW4gdGV4dCBhbmQgdGhlIHRvb2wgbmFtZXMgYXJlIGVuY2xvc2VkIGJ5Ci1Ac2FtcHsqfSBjaGFyYWN0ZXJzCi1AZW5kIGlmaW5mbwotQGlmbm90aW5mbwotVGhlIGZpbGUgbmFtZXMgYXJlIGluIHJlY3RhbmdsZXMgd2l0aCBzcXVhcmUgY29ybmVycyBhbmQgdGhlIHRvb2wgbmFtZXMKLWFyZSBpbiByZWN0YW5nbGVzIHdpdGggcm91bmRlZCBjb3JuZXJzCi1AZW5kIGlmbm90aW5mbwotKGUuZy4sIEBzYW1we2F1dG9oZWFkZXJ9IGlzIHRoZSBuYW1lIG9mIGEgdG9vbCwgbm90IHRoZSBuYW1lIG9mIGEgZmlsZSkuCi0KLUBpbWFnZXtjb25maWdkZXZ9Ci0KLUBub2RlIFdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzCi1Ac3Vic2VjdGlvbiBXcml0dGVuIERldmVsb3BlciBGaWxlcwotCi1UaGUgZm9sbG93aW5nIGZpbGVzIHdvdWxkIGJlIHdyaXR0ZW4gYnkgdGhlIGRldmVsb3Blci4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBjb25maWd1cmUuaW4KLUBjaW5kZXggQGZpbGV7Y29uZmlndXJlLmlufQotVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiBzY3JpcHQuICBUaGlzIHNjcmlwdCBjb250YWlucyBpbnZvY2F0aW9ucyBvZgotYXV0b2NvbmYgbWFjcm9zLiAgSXQgbWF5IGFsc28gY29udGFpbiBvcmRpbmFyeSBzaGVsbCBzY3JpcHQgY29kZS4gIFRoaXMKLWZpbGUgd2lsbCBjb250YWluIGZlYXR1cmUgdGVzdHMgZm9yIHBvcnRhYmlsaXR5IGlzc3Vlcy4gIFRoZSBsYXN0IHRoaW5nCi1pbiB0aGUgZmlsZSB3aWxsIG5vcm1hbGx5IGJlIGFuIEBzYW1we0FDX09VVFBVVH0gbWFjcm8gbGlzdGluZyB3aGljaAotZmlsZXMgdG8gY3JlYXRlIHdoZW4gdGhlIGJ1aWxkZXIgcnVucyB0aGUgY29uZmlndXJlIHNjcmlwdC4gIFRoaXMgZmlsZQotaXMgYWx3YXlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIEdOVSBjb25maWd1cmUgc3lzdGVtLiAgQHhyZWZ7V3JpdGUKLWNvbmZpZ3VyZS5pbn0uCi0KLUBpdGVtIE1ha2VmaWxlLmFtCi1AY2luZGV4IEBmaWxle01ha2VmaWxlLmFtfQotVGhpcyBpcyB0aGUgYXV0b21ha2UgaW5wdXQgZmlsZS4gIEl0IGRlc2NyaWJlcyBob3cgdGhlIGNvZGUgc2hvdWxkIGJlCi1idWlsdC4gIEl0IGNvbnNpc3RzIG9mIGRlZmluaXRpb25zIG9mIGF1dG9tYWtlIHZhcmlhYmxlcy4gIEl0IG1heSBhbHNvCi1jb250YWluIG9yZGluYXJ5IE1ha2VmaWxlIHRhcmdldHMuICBUaGlzIGZpbGUgaXMgb25seSBuZWVkZWQgd2hlbiB1c2luZwotYXV0b21ha2UgKG5ld2VyIHRvb2xzIG5vcm1hbGx5IHVzZSBhdXRvbWFrZSwgYnV0IHRoZXJlIGFyZSBzdGlsbCBvbGRlcgotdG9vbHMgd2hpY2ggaGF2ZSBub3QgYmVlbiBjb252ZXJ0ZWQsIGluIHdoaWNoIHRoZSBkZXZlbG9wZXIgd3JpdGVzCi1AZmlsZXtNYWtlZmlsZS5pbn0gZGlyZWN0bHkpLiAgQHhyZWZ7V3JpdGUgTWFrZWZpbGUuYW19LgotCi1AaXRlbSBhY2NvbmZpZy5oCi1AY2luZGV4IEBmaWxle2FjY29uZmlnLmh9Ci1XaGVuIHRoZSBjb25maWd1cmUgc2NyaXB0IGNyZWF0ZXMgYSBwb3J0YWJpbGl0eSBoZWFkZXIgZmlsZSwgYnkgdXNpbmcKLUBzYW1we0FNX0NPTkZJR19IRUFERVJ9IChvciwgaWYgbm90IHVzaW5nIGF1dG9tYWtlLAotQHNhbXB7QUNfQ09ORklHX0hFQURFUn0pLCB0aGlzIGZpbGUgaXMgdXNlZCB0byBkZXNjcmliZSBtYWNyb3Mgd2hpY2ggYXJlCi1ub3QgcmVjb2duaXplZCBieSB0aGUgQHNhbXB7YXV0b2hlYWRlcn0gY29tbWFuZC4gIFRoaXMgaXMgbm9ybWFsbHkgYQotZmFpcmx5IHVuaW50ZXJlc3RpbmcgZmlsZSwgY29uc2lzdGluZyBvZiBhIGNvbGxlY3Rpb24gb2YgQHNhbXB7I3VuZGVmfQotbGluZXMgd2l0aCBjb21tZW50cy4gIE5vcm1hbGx5IGFueSBjYWxsIHRvIEBzYW1we0FDX0RFRklORX0gaW4KLUBmaWxle2NvbmZpZ3VyZS5pbn0gd2lsbCByZXF1aXJlIGEgbGluZSBpbiB0aGlzIGZpbGUuIEB4cmVme1dyaXRlCi1hY2NvbmZpZy5ofS4KLQotQGl0ZW0gYWNpbmNsdWRlLm00Ci1AY2luZGV4IEBmaWxle2FjaW5jbHVkZS5tNH0KLVRoaXMgZmlsZSBpcyBub3QgYWx3YXlzIHJlcXVpcmVkLiAgSXQgZGVmaW5lcyBsb2NhbCBhdXRvY29uZiBtYWNyb3MuCi1UaGVzZSBtYWNyb3MgbWF5IHRoZW4gYmUgdXNlZCBpbiBAZmlsZXtjb25maWd1cmUuaW59LiAgSWYgeW91IGRvbid0IG5lZWQKLWFueSBsb2NhbCBhdXRvY29uZiBtYWNyb3MsIHRoZW4geW91IGRvbid0IG5lZWQgdGhpcyBmaWxlIGF0IGFsbC4gIEluCi1mYWN0LCBpbiBnZW5lcmFsLCB5b3UgbmV2ZXIgbmVlZCBsb2NhbCBhdXRvY29uZiBtYWNyb3MsIHNpbmNlIHlvdSBjYW4KLXB1dCBldmVyeXRoaW5nIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0sIGJ1dCBzb21ldGltZXMgYSBsb2NhbCBtYWNybyBpcwotY29udmVuaWVudC4KLQotTmV3ZXIgdG9vbHMgbWF5IG9taXQgQGZpbGV7YWNpbmNsdWRlLm00fSwgYW5kIGluc3RlYWQgdXNlIGEKLXN1YmRpcmVjdG9yeSwgdHlwaWNhbGx5IG5hbWVkIEBmaWxle200fSwgYW5kIGRlZmluZQotQHNhbXB7QUNMT0NBTF9BTUZMQUdTID0gLUkgbTR9IGluIEBmaWxle01ha2VmaWxlLmFtfSB0byBmb3JjZQotQHNhbXB7YWNsb2NhbH0gdG8gbG9vayB0aGVyZSBmb3IgbWFjcm8gZGVmaW5pdGlvbnMuICBUaGUgbWFjcm8KLWRlZmluaXRpb25zIGFyZSB0aGVuIHBsYWNlZCBpbiBzZXBhcmF0ZSBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeS4KLQotVGhlIEBmaWxle2FjaW5jbHVkZS5tNH0gZmlsZSBpcyBvbmx5IHVzZWQgd2hlbiB1c2luZyBhdXRvbWFrZTsgaW4gb2xkZXIKLXRvb2xzLCB0aGUgZGV2ZWxvcGVyIHdyaXRlcyBAZmlsZXthY2xvY2FsLm00fSBkaXJlY3RseSwgaWYgaXQgaXMgbmVlZGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzCi1Ac3Vic2VjdGlvbiBHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzCi0KLVRoZSBmb2xsb3dpbmcgZmlsZXMgd291bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZlbG9wZXIuCi0KLVdoZW4gdXNpbmcgYXV0b21ha2UsIHRoZXNlIGZpbGVzIGFyZSBub3JtYWxseSBub3QgZ2VuZXJhdGVkIG1hbnVhbGx5Ci1hZnRlciB0aGUgZmlyc3QgdGltZS4gIEluc3RlYWQsIHRoZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IGNvbnRhaW5zCi1ydWxlcyB0byBhdXRvbWF0aWNhbGx5IHJlYnVpbGQgdGhlIGZpbGVzIGFzIHJlcXVpcmVkLiAgV2hlbgotQHNhbXB7QU1fTUFJTlRBSU5FUl9NT0RFfSBpcyB1c2VkIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0gKHRoZSBub3JtYWwKLWNhc2UgaW4gQ3lnbnVzIGNvZGUpLCB0aGUgYXV0b21hdGljIHJlYnVpbGRpbmcgcnVsZXMgd2lsbCBvbmx5IGJlCi1kZWZpbmVkIGlmIHlvdSBjb25maWd1cmUgdXNpbmcgdGhlIEBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0KLW9wdGlvbi4KLQotV2hlbiB1c2luZyBhdXRvbWF0aWMgcmVidWlsZGluZywgaXQgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGF0IGFsbCB0aGUKLXZhcmlvdXMgdG9vbHMgaGF2ZSBiZWVuIGJ1aWx0IGFuZCBpbnN0YWxsZWQgb24geW91ciBAc2FtcHtQQVRIfS4gIFVzaW5nCi1hdXRvbWF0aWMgcmVidWlsZGluZyBpcyBoaWdobHkgcmVjb21tZW5kZWQsIHNvIG11Y2ggc28gdGhhdCBJJ20gbm90Ci1nb2luZyB0byBleHBsYWluIHdoYXQgeW91IGhhdmUgdG8gZG8gaWYgeW91IGRvbid0IHVzZSBpdC4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBjb25maWd1cmUKLUBjaW5kZXggQGZpbGV7Y29uZmlndXJlfQotVGhpcyBpcyB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGljaCB3aWxsIGJlIHJ1biB3aGVuIGJ1aWxkaW5nIHRoZQotcGFja2FnZS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGJ5IEBzYW1we2F1dG9jb25mfSBmcm9tIEBmaWxle2NvbmZpZ3VyZS5pbn0KLWFuZCBAZmlsZXthY2xvY2FsLm00fS4gIFRoaXMgaXMgYSBzaGVsbCBzY3JpcHQuCi0KLUBpdGVtIE1ha2VmaWxlLmluCi1AY2luZGV4IEBmaWxle01ha2VmaWxlLmlufQotVGhpcyBpcyB0aGUgZmlsZSB3aGljaCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIHR1cm4gaW50byB0aGUKLUBmaWxle01ha2VmaWxlfSBhdCBidWlsZCB0aW1lLiAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieQotQHNhbXB7YXV0b21ha2V9IGZyb20gQGZpbGV7TWFrZWZpbGUuYW19LiAgSWYgeW91IGFyZW4ndCB1c2luZyBhdXRvbWFrZSwKLXlvdSBtdXN0IHdyaXRlIHRoaXMgZmlsZSB5b3Vyc2VsZi4gIFRoaXMgZmlsZSBpcyBwcmV0dHkgbXVjaCBhIG5vcm1hbAotQGZpbGV7TWFrZWZpbGV9LCB3aXRoIHNvbWUgY29uZmlndXJlIHN1YnN0aXR1dGlvbnMgZm9yIGNlcnRhaW4KLXZhcmlhYmxlcy4KLQotQGl0ZW0gYWNsb2NhbC5tNAotQGNpbmRleCBAZmlsZXthY2xvY2FsLm00fQotVGhpcyBmaWxlIGlzIGNyZWF0ZWQgYnkgdGhlIEBzYW1we2FjbG9jYWx9IHByb2dyYW0sIGJhc2VkIG9uIHRoZQotY29udGVudHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSBhbmQgQGZpbGV7YWNpbmNsdWRlLm00fSAob3IsIGFzIG5vdGVkIGluCi10aGUgZGVzY3JpcHRpb24gb2YgQGZpbGV7YWNpbmNsdWRlLm00fSBhYm92ZSwgb24gdGhlIGNvbnRlbnRzIG9mIGFuCi1AZmlsZXttNH0gc3ViZGlyZWN0b3J5KS4gIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiBhdXRvY29uZgotbWFjcm9zIHdoaWNoIEBzYW1we2F1dG9jb25mfSB3aWxsIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGZpbGUKLUBmaWxle2NvbmZpZ3VyZX0uICBUaGVzZSBhdXRvY29uZiBtYWNyb3MgbWF5IGJlIGRlZmluZWQgYnkgeW91IGluCi1AZmlsZXthY2luY2x1ZGUubTR9IG9yIHRoZXkgbWF5IGJlIGRlZmluZWQgYnkgb3RoZXIgcGFja2FnZXMgc3VjaCBhcwotYXV0b21ha2UsIGxpYnRvb2wgb3IgZ2V0dGV4dC4gIElmIHlvdSBhcmVuJ3QgdXNpbmcgYXV0b21ha2UsIHlvdSB3aWxsCi1ub3JtYWxseSB3cml0ZSB0aGlzIGZpbGUgeW91cnNlbGY7IGluIHRoYXQgY2FzZSwgaWYgQGZpbGV7Y29uZmlndXJlLmlufQotdXNlcyBvbmx5IHN0YW5kYXJkIGF1dG9jb25mIG1hY3JvcywgdGhpcyBmaWxlIHdpbGwgbm90IGJlIG5lZWRlZCBhdCBhbGwuCi0KLUBpdGVtIGNvbmZpZy5pbgotQGNpbmRleCBAZmlsZXtjb25maWcuaW59Ci1AY2luZGV4IEBmaWxle2NvbmZpZy5oLmlufQotVGhpcyBmaWxlIGlzIGNyZWF0ZWQgYnkgQHNhbXB7YXV0b2hlYWRlcn0gYmFzZWQgb24gQGZpbGV7YWNjb25maWcuaH0gYW5kCi1AZmlsZXtjb25maWd1cmUuaW59LiAgQXQgYnVpbGQgdGltZSwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBkZWZpbmUKLXNvbWUgb2YgdGhlIG1hY3JvcyBpbiBpdCB0byBjcmVhdGUgQGZpbGV7Y29uZmlnLmh9LCB3aGljaCBtYXkgdGhlbiBiZQotaW5jbHVkZWQgYnkgeW91ciBwcm9ncmFtLiAgVGhpcyBwZXJtaXRzIHlvdXIgQyBjb2RlIHRvIHVzZSBwcmVwcm9jZXNzb3IKLWNvbmRpdGlvbmFscyB0byBjaGFuZ2UgaXRzIGJlaGF2aW91ciBiYXNlZCBvbiB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQotaG9zdCBzeXN0ZW0uICBUaGlzIGZpbGUgbWF5IGFsc28gYmUgY2FsbGVkIEBmaWxle2NvbmZpZy5oLmlufS4KLQotQGl0ZW0gc3RhbXAuaC1pbgotQGNpbmRleCBAZmlsZXtzdGFtcC1oLmlufQotVGhpcyByYXRoZXIgdW5pbnRlcmVzdGluZyBmaWxlLCB3aGljaCBJIG9taXR0ZWQgZnJvbSB0aGUgcGljdHVyZSwgaXMKLWdlbmVyYXRlZCBieSBAc2FtcHthdXRvbWFrZX0uICBJdCBhbHdheXMgY29udGFpbnMgdGhlIHN0cmluZwotQHNhbXB7dGltZXN0YW1wfS4gIEl0IGlzIHVzZWQgYXMgYSB0aW1lc3RhbXAgZmlsZSBpbmRpY2F0aW5nIHdoZXRoZXIKLUBmaWxle2NvbmZpZy5pbn0gaXMgdXAgdG8gZGF0ZS4gIFVzaW5nIGEgdGltZXN0YW1wIGZpbGUgbWVhbnMgdGhhdAotQGZpbGV7Y29uZmlnLmlufSBjYW4gYmUgbWFya2VkIGFzIHVwIHRvIGRhdGUgd2l0aG91dCBhY3R1YWxseSBjaGFuZ2luZwotaXRzIG1vZGlmaWNhdGlvbiB0aW1lLiAgVGhpcyBpcyB1c2VmdWwgc2luY2UgQGZpbGV7Y29uZmlnLmlufSBkZXBlbmRzCi11cG9uIEBmaWxle2NvbmZpZ3VyZS5pbn0sIGJ1dCBpdCBpcyBlYXN5IHRvIGNoYW5nZSBAZmlsZXtjb25maWd1cmUuaW59Ci1pbiBhIHdheSB3aGljaCBkb2VzIG5vdCBhZmZlY3QgQGZpbGV7Y29uZmlnLmlufS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQnVpbGQgRmlsZXMKLUBzZWN0aW9uIEJ1aWxkIEZpbGVzCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGZpbGVzIHdoaWNoIGFyZSBjcmVhdGVkIGF0IGNvbmZpZ3VyZSBhbmQKLWJ1aWxkIHRpbWUuICBUaGVzZSBhcmUgdGhlIGZpbGVzIHdoaWNoIHNvbWVib2R5IHdobyBidWlsZHMgdGhlIHBhY2thZ2UKLXdpbGwgc2VlLgotCi1PZiBjb3Vyc2UsIHRoZSBkZXZlbG9wZXIgd2lsbCBhbHNvIGJ1aWxkIHRoZSBwYWNrYWdlLiAgVGhlIGRpc3RpbmN0aW9uCi1iZXR3ZWVuIGRldmVsb3BlciBmaWxlcyBhbmQgYnVpbGQgZmlsZXMgaXMgbm90IHRoYXQgdGhlIGRldmVsb3BlciBkb2VzCi1ub3Qgc2VlIHRoZSBidWlsZCBmaWxlcywgYnV0IHRoYXQgc29tZWJvZHkgd2hvIG9ubHkgYnVpbGRzIHRoZSBwYWNrYWdlCi1kb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBkZXZlbG9wZXIgZmlsZXMuCi0KLUBtZW51Ci0qIEJ1aWxkIEZpbGVzIFBpY3R1cmU6OgkJQnVpbGQgRmlsZXMgUGljdHVyZS4KLSogQnVpbGQgRmlsZXMgRGVzY3JpcHRpb246OglCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbi4KLUBlbmQgbWVudQotCi1Abm9kZSBCdWlsZCBGaWxlcyBQaWN0dXJlCi1Ac3Vic2VjdGlvbiBCdWlsZCBGaWxlcyBQaWN0dXJlCi0KLUhlcmUgaXMgYSBwaWN0dXJlIG9mIHRoZSBmaWxlcyB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgYXQgYnVpbGQgdGltZS4KLUBmaWxle2NvbmZpZy5zdGF0dXN9IGlzIGJvdGggYSBjcmVhdGVkIGZpbGUgYW5kIGEgc2hlbGwgc2NyaXB0IHdoaWNoIGlzCi1ydW4gdG8gY3JlYXRlIG90aGVyIGZpbGVzLCBhbmQgdGhlIHBpY3R1cmUgYXR0ZW1wdHMgdG8gc2hvdyB0aGF0LgotCi1AaW1hZ2V7Y29uZmlnYnVpbGR9Ci0KLUBub2RlIEJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uCi1Ac3Vic2VjdGlvbiBCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbgotCi1UaGlzIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSBjcmVhdGVkIGF0IGJ1aWxkIHRpbWUuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gY29uZmlnLnN0YXR1cwotQGNpbmRleCBAZmlsZXtjb25maWcuc3RhdHVzfQotVGhlIGZpcnN0IHN0ZXAgaW4gYnVpbGRpbmcgYSBwYWNrYWdlIGlzIHRvIHJ1biB0aGUgQGZpbGV7Y29uZmlndXJlfQotc2NyaXB0LiAgVGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwgY3JlYXRlIHRoZSBmaWxlCi1AZmlsZXtjb25maWcuc3RhdHVzfSwgd2hpY2ggaXMgaXRzZWxmIGEgc2hlbGwgc2NyaXB0LiAgV2hlbiB5b3UgZmlyc3QKLXJ1biBAZmlsZXtjb25maWd1cmV9LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIEBmaWxle2NvbmZpZy5zdGF0dXN9LgotQW4gQGZpbGV7TWFrZWZpbGV9IGRlcml2ZWQgZnJvbSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGUuaW59Ci13aWxsIGNvbnRhaW4gcnVsZXMgdG8gYXV0b21hdGljYWxseSBydW4gQGZpbGV7Y29uZmlnLnN0YXR1c30gYWdhaW4gd2hlbgotbmVjZXNzYXJ5IHRvIHJlY3JlYXRlIGNlcnRhaW4gZmlsZXMgaWYgdGhlaXIgaW5wdXRzIGNoYW5nZS4KLQotQGl0ZW0gTWFrZWZpbGUKLUBjaW5kZXggQGZpbGV7TWFrZWZpbGV9Ci1UaGlzIGlzIHRoZSBmaWxlIHdoaWNoIG1ha2Ugd2lsbCByZWFkIHRvIGJ1aWxkIHRoZSBwcm9ncmFtLiAgVGhlCi1AZmlsZXtjb25maWcuc3RhdHVzfSBzY3JpcHQgd2lsbCB0cmFuc2Zvcm0gQGZpbGV7TWFrZWZpbGUuaW59IGludG8KLUBmaWxle01ha2VmaWxlfS4KLQotQGl0ZW0gY29uZmlnLmgKLUBjaW5kZXggQGZpbGV7Y29uZmlnLmh9Ci1UaGlzIGZpbGUgZGVmaW5lcyBDIHByZXByb2Nlc3NvciBtYWNyb3Mgd2hpY2ggQyBjb2RlIGNhbiB1c2UgdG8gYWRqdXN0Ci1pdHMgYmVoYXZpb3VyIG9uIGRpZmZlcmVudCBzeXN0ZW1zLiAgVGhlIEBmaWxle2NvbmZpZy5zdGF0dXN9IHNjcmlwdAotd2lsbCB0cmFuc2Zvcm0gQGZpbGV7Y29uZmlnLmlufSBpbnRvIEBmaWxle2NvbmZpZy5ofS4KLQotQGl0ZW0gY29uZmlnLmNhY2hlCi1AY2luZGV4IEBmaWxle2NvbmZpZy5jYWNoZX0KLVRoaXMgZmlsZSBkaWQgbm90IGZpdCBuZWF0bHkgaW50byB0aGUgcGljdHVyZSwgYW5kIEkgb21pdHRlZCBpdC4gIEl0IGlzCi11c2VkIGJ5IHRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB0byBjYWNoZSByZXN1bHRzIGJldHdlZW4gcnVucy4gIFRoaXMKLWNhbiBiZSBhbiBpbXBvcnRhbnQgc3BlZWR1cC4gIElmIHlvdSBtb2RpZnkgQGZpbGV7Y29uZmlndXJlLmlufSBpbiBzdWNoCi1hIHdheSB0aGF0IHRoZSByZXN1bHRzIG9mIG9sZCB0ZXN0cyBzaG91bGQgY2hhbmdlIChwZXJoYXBzIHlvdSBoYXZlCi1hZGRlZCBhIG5ldyBsaWJyYXJ5IHRvIEBzYW1we0xERkxBR1N9KSwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIHJlbW92ZQotQGZpbGV7Y29uZmlnLmNhY2hlfSB0byBmb3JjZSB0aGUgdGVzdHMgdG8gYmUgcmVydW4uCi0KLVRoZSBhdXRvY29uZiBtYW51YWwgZXhwbGFpbnMgaG93IHRvIHNldCB1cCBhIHNpdGUgc3BlY2lmaWMgY2FjaGUgZmlsZS4KLVRoaXMgY2FuIHNwZWVkIHVwIHJ1bm5pbmcgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHRzIG9uIHlvdXIgc3lzdGVtLgotCi1AaXRlbSBzdGFtcC5oCi1AY2luZGV4IEBmaWxle3N0YW1wLWh9Ci1UaGlzIGZpbGUsIHdoaWNoIEkgb21pdHRlZCBmcm9tIHRoZSBwaWN0dXJlLCBpcyBzaW1pbGFyIHRvCi1AZmlsZXtzdGFtcC1oLmlufS4gIEl0IGlzIHVzZWQgYXMgYSB0aW1lc3RhbXAgZmlsZSBpbmRpY2F0aW5nIHdoZXRoZXIKLUBmaWxle2NvbmZpZy5ofSBpcyB1cCB0byBkYXRlLiAgVGhpcyBpcyB1c2VmdWwgc2luY2UgQGZpbGV7Y29uZmlnLmh9Ci1kZXBlbmRzIHVwb24gQGZpbGV7Y29uZmlnLnN0YXR1c30sIGJ1dCBpdCBpcyBlYXN5IGZvcgotQGZpbGV7Y29uZmlnLnN0YXR1c30gdG8gY2hhbmdlIGluIGEgd2F5IHdoaWNoIGRvZXMgbm90IGFmZmVjdAotQGZpbGV7Y29uZmlnLmh9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBTdXBwb3J0IEZpbGVzCi1Ac2VjdGlvbiBTdXBwb3J0IEZpbGVzCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gcmVxdWlyZXMgc2V2ZXJhbCBzdXBwb3J0IGZpbGVzIHRvIGJlCi1pbmNsdWRlZCB3aXRoIHlvdXIgZGlzdHJpYnV0aW9uLiAgWW91IGRvIG5vdCBub3JtYWxseSBuZWVkIHRvIGNvbmNlcm4KLXlvdXJzZWxmIHdpdGggdGhlc2UuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgbW9zdCBhcmUgYWxyZWFkeQotcHJlc2VudC4gIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIGluc3RhbGxlZCB3aXRoIHlvdXIgc291cmNlIGJ5Ci1Ac2FtcHthdXRvbWFrZX0gKHdpdGggdGhlIEBzYW1wey0tYWRkLW1pc3Npbmd9IG9wdGlvbikgYW5kCi1Ac2FtcHtsaWJ0b29saXplfS4KLQotWW91IGRvbid0IGhhdmUgdG8gcHV0IHRoZSBzdXBwb3J0IGZpbGVzIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LiAgWW91Ci1jYW4gcHV0IHRoZW0gaW4gYSBzdWJkaXJlY3RvcnksIGFuZCB1c2UgdGhlIEBzYW1we0FDX0NPTkZJR19BVVhfRElSfQotbWFjcm8gaW4gQGZpbGV7Y29uZmlndXJlLmlufSB0byB0ZWxsIEBzYW1we2F1dG9tYWtlfSBhbmQgdGhlCi1AZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aGVyZSB0aGV5IGFyZS4KLQotSW4gdGhpcyBzZWN0aW9uLCBJIGRlc2NyaWJlIHRoZSBzdXBwb3J0IGZpbGVzLCBzbyB0aGF0IHlvdSBjYW4ga25vdyB3aGF0Ci10aGV5IGFyZSBhbmQgd2h5IHRoZXkgYXJlIHRoZXJlLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIEFCT1VULU5MUwotQWRkZWQgYnkgYXV0b21ha2UgaWYgeW91IGFyZSB1c2luZyBnZXR0ZXh0LiAgVGhpcyBpcyBhIGRvY3VtZW50YXRpb24KLWZpbGUgYWJvdXQgdGhlIGdldHRleHQgcHJvamVjdC4KLUBpdGVtIGFuc2kya25yLmMKLVVzZWQgYnkgYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSBpZiB5b3UgcHV0IEBzYW1we2Fuc2kya25yfQotaW4gQHNhbXB7QVVUT01BS0VfT1BUSU9OU30gaW4gQGZpbGV7TWFrZWZpbGUuYW19LiAgVGhpcyBwZXJtaXRzCi1jb21waWxpbmcgQU5TSSBDIGNvZGUgd2l0aCBhIEsmUiBDIGNvbXBpbGVyLgotQGl0ZW0gYW5zaTJrbnIuMQotVGhlIG1hbiBwYWdlIHdoaWNoIGdvZXMgd2l0aCBAZmlsZXthbnNpMmtuci5jfS4KLUBpdGVtIGNvbmZpZy5ndWVzcwotQSBzaGVsbCBzY3JpcHQgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgY29uZmlndXJhdGlvbiBuYW1lIGZvciB0aGUgc3lzdGVtIG9uCi13aGljaCBpdCBpcyBydW4uCi1AaXRlbSBjb25maWcuc3ViCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBjYW5vbmljYWxpemVzIGEgY29uZmlndXJhdGlvbiBuYW1lIGVudGVyZWQgYnkgYQotdXNlci4KLUBpdGVtIGVsaXNwLWNvbXAKLVVzZWQgdG8gY29tcGlsZSBFbWFjcyBMSVNQIGZpbGVzLgotQGl0ZW0gaW5zdGFsbC1zaAotQSBzaGVsbCBzY3JpcHQgd2hpY2ggaW5zdGFsbHMgYSBwcm9ncmFtLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBjb25maWd1cmUKLXNjcmlwdCBjYW4gbm90IGZpbmQgYW4gaW5zdGFsbCBiaW5hcnkuCi1AaXRlbSBsdGNvbmZpZwotVXNlZCBieSBsaWJ0b29sLiAgVGhpcyBpcyBhIHNoZWxsIHNjcmlwdCB3aGljaCBjb25maWd1cmVzIGxpYnRvb2wgZm9yCi10aGUgcGFydGljdWxhciBzeXN0ZW0gb24gd2hpY2ggaXQgaXMgdXNlZC4KLUBpdGVtIGx0bWFpbi5zaAotVXNlZCBieSBsaWJ0b29sLiAgVGhpcyBpcyB0aGUgYWN0dWFsIGxpYnRvb2wgc2NyaXB0IHdoaWNoIGlzIHVzZWQsIGFmdGVyCi1pdCBpcyBjb25maWd1cmVkIGJ5IEBmaWxle2x0Y29uZmlnfSB0byBidWlsZCBhIGxpYnJhcnkuCi1AaXRlbSBtZGF0ZS1zaAotQSBzaGVsbCBzY3JpcHQgdXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IHRvIHByZXR0eQotcHJpbnQgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZS4gIFRoaXMgaXMgdXNlZCB0byBtYWludGFpbiB2ZXJzaW9uCi1udW1iZXJzIGZvciB0ZXhpbmZvIGZpbGVzLgotQGl0ZW0gbWlzc2luZwotQSBzaGVsbCBzY3JpcHQgdXNlZCBpZiBzb21lIHRvb2wgaXMgbWlzc2luZyBlbnRpcmVseS4gIFRoaXMgaXMgdXNlZCBieQotYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSB0byBhdm9pZCBjZXJ0YWluIHNvcnRzIG9mCi10aW1lc3RhbXAgcHJvYmxlbXMuCi1AaXRlbSBta2luc3RhbGxkaXJzCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBjcmVhdGVzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgYWxsIHBhcmVudAotZGlyZWN0b3JpZXMuICBUaGlzIGlzIHVzZWQgYnkgYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfQotZHVyaW5nIGluc3RhbGxhdGlvbi4KLUBpdGVtIHRleGluZm8udGV4Ci1SZXF1aXJlZCBpZiB5b3UgaGF2ZSBhbnkgdGV4aW5mbyBmaWxlcy4gIFRoaXMgaXMgdXNlZCB3aGVuIGNvbnZlcnRpbmcKLVRleGluZm8gZmlsZXMgaW50byBEVkkgdXNpbmcgQHNhbXB7dGV4aTJkdml9IGFuZCBAVGVYe30uCi1AaXRlbSB5bHdyYXAKLUEgc2hlbGwgc2NyaXB0IHVzZWQgYnkgYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSB0byBydW4KLXByb2dyYW1zIGxpa2UgQHNhbXB7Ymlzb259LCBAc2FtcHt5YWNjfSwgQHNhbXB7ZmxleH0sIGFuZCBAc2FtcHtsZXh9LgotVGhlc2UgcHJvZ3JhbXMgZGVmYXVsdCB0byBwcm9kdWNpbmcgb3V0cHV0IGZpbGVzIHdpdGggYSBmaXhlZCBuYW1lLCBhbmQKLXRoZSBAZmlsZXt5bHdyYXB9IHNjcmlwdCBydW5zIHRoZW0gaW4gYSBzdWJkaXJlY3RvcnkgdG8gYXZvaWQgZmlsZSBuYW1lCi1jb25mbGljdHMgd2hlbiB1c2luZyBhIHBhcmFsbGVsIG1ha2UgcHJvZ3JhbS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQ29uZmlndXJhdGlvbiBOYW1lcwotQGNoYXB0ZXIgQ29uZmlndXJhdGlvbiBOYW1lcwotQGNpbmRleCBjb25maWd1cmF0aW9uIG5hbWVzCi1AY2luZGV4IGNvbmZpZ3VyYXRpb24gdHJpcGxldHMKLUBjaW5kZXggdHJpcGxldHMKLUBjaW5kZXggaG9zdCBuYW1lcwotQGNpbmRleCBob3N0IHRyaXBsZXRzCi1AY2luZGV4IGNhbm9uaWNhbCBzeXN0ZW0gbmFtZXMKLUBjaW5kZXggc3lzdGVtIG5hbWVzCi1AY2luZGV4IHN5c3RlbSB0eXBlcwotCi1UaGUgR05VIGNvbmZpZ3VyZSBzeXN0ZW0gbmFtZXMgYWxsIHN5c3RlbXMgdXNpbmcgYSBAZGZue2NvbmZpZ3VyYXRpb24KLW5hbWV9LiAgQWxsIHN1Y2ggbmFtZXMgdXNlZCB0byBiZSB0cmlwbGV0cyAodGhleSBtYXkgbm93IGNvbnRhaW4gZm91cgotcGFydHMgaW4gY2VydGFpbiBjYXNlcyksIGFuZCB0aGUgdGVybSBAZGZue2NvbmZpZ3VyYXRpb24gdHJpcGxldH0gaXMKLXN0aWxsIHNlZW4uCi0KLUBtZW51Ci0qIENvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uOjoJQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb24uCi0qIFVzaW5nIENvbmZpZ3VyYXRpb24gTmFtZXM6OgkJVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbgotQHNlY3Rpb24gQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb24KLQotVGhpcyBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybQotQHZhcntjcHV9LUB2YXJ7bWFudWZhY3R1cmVyfS1AdmFye29wZXJhdGluZ19zeXN0ZW19LiAgSW4gc29tZSBjYXNlcywKLXRoaXMgaXMgZXh0ZW5kZWQgdG8gYSBmb3VyIHBhcnQgZm9ybToKLUB2YXJ7Y3B1fS1AdmFye21hbnVmYWN0dXJlcn0tQHZhcntrZXJuZWx9LUB2YXJ7b3BlcmF0aW5nX3N5c3RlbX0uCi0KLVdoZW4gdXNpbmcgYSBjb25maWd1cmF0aW9uIG5hbWUgaW4gYSBjb25maWd1cmUgb3B0aW9uLCBpdCBpcyBub3JtYWxseQotbm90IG5lY2Vzc2FyeSB0byBzcGVjaWZ5IGFuIGVudGlyZSBuYW1lLiAgSW4gcGFydGljdWxhciwgdGhlCi1AdmFye21hbnVmYWN0dXJlcn0gZmllbGQgaXMgb2Z0ZW4gb21pdHRlZCwgbGVhZGluZyB0byBzdHJpbmdzIHN1Y2ggYXMKLUBzYW1we2kzODYtbGludXh9IG9yIEBzYW1we3NwYXJjLXN1bm9zfS4gIFRoZSBzaGVsbCBzY3JpcHQKLUBmaWxle2NvbmZpZy5zdWJ9IHdpbGwgdHJhbnNsYXRlIHRoZXNlIHNob3J0ZW5lZCBzdHJpbmdzIGludG8gdGhlCi1jYW5vbmljYWwgZm9ybS4gIGF1dG9jb25mIHdpbGwgYXJyYW5nZSBmb3IgQGZpbGV7Y29uZmlnLnN1Yn0gdG8gYmUgcnVuCi1hdXRvbWF0aWNhbGx5IHdoZW4gaXQgaXMgbmVlZGVkLgotCi1UaGUgZmllbGRzIG9mIGEgY29uZmlndXJhdGlvbiBuYW1lIGFyZSBhcyBmb2xsb3dzOgotCi1AdGFibGUgQHZhcgotQGl0ZW0gY3B1Ci1UaGUgdHlwZSBvZiBwcm9jZXNzb3IuICBUaGlzIGlzIHR5cGljYWxseSBzb21ldGhpbmcgbGlrZSBAc2FtcHtpMzg2fSBvcgotQHNhbXB7c3BhcmN9LiAgTW9yZSBzcGVjaWZpYyB2YXJpYW50cyBhcmUgdXNlZCBhcyB3ZWxsLCBzdWNoIGFzCi1Ac2FtcHttaXBzZWx9IHRvIGluZGljYXRlIGEgbGl0dGxlIGVuZGlhbiBNSVBTIHByb2Nlc3Nvci4KLUBpdGVtIG1hbnVmYWN0dXJlcgotQSBzb21ld2hhdCBmcmVlZm9ybSBmaWVsZCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1hbnVmYWN0dXJlciBvZiB0aGUKLXN5c3RlbS4gIFRoaXMgaXMgb2Z0ZW4gc2ltcGx5IEBzYW1we3Vua25vd259LiAgT3RoZXIgY29tbW9uIHN0cmluZ3MgYXJlCi1Ac2FtcHtwY30gZm9yIGFuIElCTSBQQyBjb21wYXRpYmxlIHN5c3RlbSwgb3IgdGhlIG5hbWUgb2YgYSB3b3Jrc3RhdGlvbgotdmVuZG9yLCBzdWNoIGFzIEBzYW1we3N1bn0uCi1AaXRlbSBvcGVyYXRpbmdfc3lzdGVtCi1UaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aGljaCBpcyBydW4gb24gdGhlIHN5c3RlbS4gIFRoaXMgd2lsbAotYmUgc29tZXRoaW5nIGxpa2UgQHNhbXB7c29sYXJpczIuNX0gb3IgQHNhbXB7aXJpeDYuM30uICBUaGVyZSBpcyBubwotcGFydGljdWxhciByZXN0cmljdGlvbiBvbiB0aGUgdmVyc2lvbiBudW1iZXIsIGFuZCBzdHJpbmdzIGxpa2UKLUBzYW1we2FpeDQuMS40LjB9IGFyZSBzZWVuLiAgRm9yIGFuIGVtYmVkZGVkIHN5c3RlbSwgd2hpY2ggaGFzIG5vCi1vcGVyYXRpbmcgc3lzdGVtLCB0aGlzIGZpZWxkIG5vcm1hbGx5IGluZGljYXRlcyB0aGUgdHlwZSBvZiBvYmplY3QgZmlsZQotZm9ybWF0LCBzdWNoIGFzIEBzYW1we2VsZn0gb3IgQHNhbXB7Y29mZn0uCi1AaXRlbSBrZXJuZWwKLVRoaXMgaXMgdXNlZCBtYWlubHkgZm9yIEdOVS9MaW51eC4gIEEgdHlwaWNhbCBHTlUvTGludXggY29uZmlndXJhdGlvbgotbmFtZSBpcyBAc2FtcHtpNTg2LXBjLWxpbnV4LWdudWxpYmMxfS4gIEluIHRoaXMgY2FzZSB0aGUga2VybmVsLAotQHNhbXB7bGludXh9LCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgQHNhbXB7Z251bGliYzF9LgotQGVuZCB0YWJsZQotCi1UaGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy5ndWVzc30gd2lsbCBub3JtYWxseSBwcmludCB0aGUgY29ycmVjdAotY29uZmlndXJhdGlvbiBuYW1lIGZvciB0aGUgc3lzdGVtIG9uIHdoaWNoIGl0IGlzIHJ1bi4gIEl0IGRvZXMgYnkKLXJ1bm5pbmcgQHNhbXB7dW5hbWV9IGFuZCBieSBleGFtaW5pbmcgb3RoZXIgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQotc3lzdGVtLgotCi1CZWNhdXNlIEBmaWxle2NvbmZpZy5ndWVzc30gY2FuIG5vcm1hbGx5IGRldGVybWluZSB0aGUgY29uZmlndXJhdGlvbgotbmFtZSBmb3IgYSBtYWNoaW5lLCBpdCBpcyBub3JtYWxseSBvbmx5IG5lY2Vzc2FyeSB0byBzcGVjaWZ5IGEKLWNvbmZpZ3VyYXRpb24gbmFtZSB3aGVuIGJ1aWxkaW5nIGEgY3Jvc3MtY29tcGlsZXIgb3Igd2hlbiBidWlsZGluZyB1c2luZwotYSBjcm9zcy1jb21waWxlci4KLQotQG5vZGUgVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lcwotQHNlY3Rpb24gVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lcwotCi1BIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBzb21ldGltZXMgaGF2ZSB0byBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gYQotY29uZmlndXJhdGlvbiBuYW1lLiAgWW91IHdpbGwgbmVlZCB0byBkbyB0aGlzIGlmIHlvdSBoYXZlIHRvIGNvbXBpbGUKLWNvZGUgZGlmZmVyZW50bHkgYmFzZWQgb24gc29tZXRoaW5nIHdoaWNoIGNhbiBub3QgYmUgdGVzdGVkIHVzaW5nIGEKLXN0YW5kYXJkIGF1dG9jb25mIGZlYXR1cmUgdGVzdC4KLQotSXQgaXMgbm9ybWFsbHkgYmV0dGVyIHRvIHRlc3QgZm9yIHBhcnRpY3VsYXIgZmVhdHVyZXMsIHJhdGhlciB0aGFuIHRvCi10ZXN0IGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLiAgVGhpcyBpcyBiZWNhdXNlIGFzIFVuaXggZXZvbHZlcywKLWRpZmZlcmVudCBzeXN0ZW1zIGNvcHkgZmVhdHVyZXMgZnJvbSBvbmUgYW5vdGhlci4gIEV2ZW4gaWYgeW91IG5lZWQgdG8KLWRldGVybWluZSB3aGV0aGVyIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBiYXNlZCBvbiBhIGNvbmZpZ3VyYXRpb24KLW5hbWUsIHlvdSBzaG91bGQgZGVmaW5lIGEgbWFjcm8gd2hpY2ggZGVzY3JpYmVzIHRoZSBmZWF0dXJlLCByYXRoZXIgdGhhbgotZGVmaW5pbmcgYSBtYWNybyB3aGljaCBkZXNjcmliZXMgdGhlIHBhcnRpY3VsYXIgc3lzdGVtIHlvdSBhcmUgb24uCi0KLVRlc3RpbmcgZm9yIGEgcGFydGljdWxhciBzeXN0ZW0gaXMgbm9ybWFsbHkgZG9uZSB1c2luZyBhIGNhc2Ugc3RhdGVtZW50Ci1pbiBAZmlsZXtjb25maWd1cmUuaW59LiAgVGhlIGNhc2Ugc3RhdGVtZW50IG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2UKLXRoZSBmb2xsb3dpbmcsIGFzc3VtaW5nIHRoYXQgQHNhbXB7aG9zdH0gaXMgYSBzaGVsbCB2YXJpYWJsZSBob2xkaW5nIGEKLWNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUgKHdoaWNoIHdpbGwgYmUgdGhlIGNhc2UgaWYKLUBmaWxle2NvbmZpZ3VyZS5pbn0gdXNlcyB0aGUgQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9IG9yCi1Ac2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfSBtYWNybykuCi0KLUBzbWFsbGV4YW1wbGUKLWNhc2UgIiRAe2hvc3RAfSIgaW4KLWlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopIGRvIHNvbWV0aGluZyA7Owotc3BhcmMqLXN1bi1zb2xhcmlzMi5bNTY3ODldKikgZG8gc29tZXRoaW5nIDs7Ci1zcGFyYyotc3VuLXNvbGFyaXMqKSBkbyBzb21ldGhpbmcgOzsKLW1pcHMqLSotZWxmKikgZG8gc29tZXRoaW5nIDs7Ci1lc2FjCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JdCBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHRvIHVzZSBAc2FtcHsqfSBhZnRlciB0aGUgb3BlcmF0aW5nIHN5c3RlbQotZmllbGQsIGluIG9yZGVyIHRvIG1hdGNoIHRoZSB2ZXJzaW9uIG51bWJlciB3aGljaCB3aWxsIGJlIGdlbmVyYXRlZCBieQotQGZpbGV7Y29uZmlnLmd1ZXNzfS4KLQotSW4gbW9zdCBjYXNlcyB5b3UgbXVzdCBiZSBjYXJlZnVsIHRvIG1hdGNoIGEgcmFuZ2Ugb2YgcHJvY2Vzc29yIHR5cGVzLgotRm9yIG1vc3QgcHJvY2Vzc29yIGZhbWlsaWVzLCBhIHRyYWlsaW5nIEBzYW1weyp9IHN1ZmZpY2VzLCBhcyBpbgotQHNhbXB7bWlwcyp9IGFib3ZlLiAgRm9yIHRoZSBpMzg2IGZhbWlseSwgc29tZXRoaW5nIGFsb25nIHRoZSBsaW5lcyBvZgotQHNhbXB7aVszNDU2XTg2fSBzdWZmaWNlcyBhdCBwcmVzZW50LiAgRm9yIHRoZSBtNjhrIGZhbWlseSwgeW91IHdpbGwKLW5lZWQgc29tZXRoaW5nIGxpa2UgQHNhbXB7bTY4Kn0uICBPZiBjb3Vyc2UsIGlmIHlvdSBkbyBub3QgbmVlZCB0byBtYXRjaAotb24gdGhlIHByb2Nlc3NvciwgaXQgaXMgc2ltcGxlciB0byBqdXN0IHJlcGxhY2UgdGhlIGVudGlyZSBmaWVsZCBieSBhCi1Ac2FtcHsqfSwgYXMgaW4gQHNhbXB7Ki0qLWlyaXgqfS4KLQotQG5vZGUgQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHMKLUBjaGFwdGVyIENyb3NzIENvbXBpbGF0aW9uIFRvb2xzCi1AY2luZGV4IGNyb3NzIHRvb2xzCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gY2FuIGJlIHVzZWQgdG8gYnVpbGQgQGRmbntjcm9zcwotY29tcGlsYXRpb259IHRvb2xzLiAgQSBjcm9zcyBjb21waWxhdGlvbiB0b29sIGlzIGEgdG9vbCB3aGljaCBydW5zIG9uCi1vbmUgc3lzdGVtIGFuZCBwcm9kdWNlcyBjb2RlIHdoaWNoIHJ1bnMgb24gYW5vdGhlciBzeXN0ZW0uCi0KLUBtZW51Ci0qIENyb3NzIENvbXBpbGF0aW9uIENvbmNlcHRzOjoJCUNyb3NzIENvbXBpbGF0aW9uIENvbmNlcHRzLgotKiBIb3N0IGFuZCBUYXJnZXQ6OgkJCUhvc3QgYW5kIFRhcmdldC4KLSogVXNpbmcgdGhlIEhvc3QgVHlwZTo6CQkJVXNpbmcgdGhlIEhvc3QgVHlwZS4KLSogU3BlY2lmeWluZyB0aGUgVGFyZ2V0OjogICAgICAgCVNwZWNpZnlpbmcgdGhlIFRhcmdldC4KLSogVXNpbmcgdGhlIFRhcmdldCBUeXBlOjoJCVVzaW5nIHRoZSBUYXJnZXQgVHlwZS4KLSogQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlOjoJQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlCi1AZW5kIG1lbnUKLQotQG5vZGUgQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHMKLUBzZWN0aW9uIENyb3NzIENvbXBpbGF0aW9uIENvbmNlcHRzCi0KLUBjaW5kZXggY3Jvc3MgY29tcGlsZXIKLUEgY29tcGlsZXIgd2hpY2ggcHJvZHVjZXMgcHJvZ3JhbXMgd2hpY2ggcnVuIG9uIGEgZGlmZmVyZW50IHN5c3RlbSBpcyBhCi1jcm9zcyBjb21waWxhdGlvbiBjb21waWxlciwgb3Igc2ltcGx5IGEgQGRmbntjcm9zcyBjb21waWxlcn0uCi1TaW1pbGFybHksIHdlIHNwZWFrIG9mIGNyb3NzIGFzc2VtYmxlcnMsIGNyb3NzIGxpbmtlcnMsIGV0Yy4KLQotSW4gdGhlIG5vcm1hbCBjYXNlLCBhIGNvbXBpbGVyIHByb2R1Y2VzIGNvZGUgd2hpY2ggcnVucyBvbiB0aGUgc2FtZQotc3lzdGVtIGFzIHRoZSBvbmUgb24gd2hpY2ggdGhlIGNvbXBpbGVyIHJ1bnMuICBXaGVuIGl0IGlzIG5lY2Vzc2FyeSB0bwotZGlzdGluZ3Vpc2ggdGhpcyBjYXNlIGZyb20gdGhlIGNyb3NzIGNvbXBpbGF0aW9uIGNhc2UsIHN1Y2ggYSBjb21waWxlcgotaXMgY2FsbGVkIGEgQGRmbntuYXRpdmUgY29tcGlsZXJ9LiAgU2ltaWxhcmx5LCB3ZSBzcGVhayBvZiBuYXRpdmUKLWFzc2VtYmxlcnMsIGV0Yy4KLQotQWx0aG91Z2ggdGhlIGRlYnVnZ2VyIGlzIG5vdCBzdHJpY3RseSBzcGVha2luZyBhIGNvbXBpbGF0aW9uIHRvb2wsIGl0IGlzCi1uZXZlcnRoZWxlc3MgbWVhbmluZ2Z1bCB0byBzcGVhayBvZiBhIGNyb3NzIGRlYnVnZ2VyOiBhIGRlYnVnZ2VyIHdoaWNoCi1pcyB1c2VkIHRvIGRlYnVnIGNvZGUgd2hpY2ggcnVucyBvbiBhbm90aGVyIHN5c3RlbS4gIEV2ZXJ5dGhpbmcgdGhhdCBpcwotc2FpZCBiZWxvdyBhYm91dCBjb25maWd1cmluZyBjcm9zcyBjb21waWxhdGlvbiB0b29scyBhcHBsaWVzIHRvIHRoZQotZGVidWdnZXIgYXMgd2VsbC4KLQotQG5vZGUgSG9zdCBhbmQgVGFyZ2V0Ci1Ac2VjdGlvbiBIb3N0IGFuZCBUYXJnZXQKLUBjaW5kZXggaG9zdCBzeXN0ZW0KLUBjaW5kZXggdGFyZ2V0IHN5c3RlbQotCi1XaGVuIGJ1aWxkaW5nIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzLCB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBzeXN0ZW1zCi1pbnZvbHZlZDogdGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4sIGFuZCB0aGUgc3lzdGVtIGZvcgotd2hpY2ggdGhlIHRvb2xzIGdlbmVyYXRlIGNvZGUuCi0KLVRoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuIGlzIGNhbGxlZCB0aGUgQGRmbntob3N0fSBzeXN0ZW0uCi0KLVRoZSBzeXN0ZW0gZm9yIHdoaWNoIHRoZSB0b29scyBnZW5lcmF0ZSBjb2RlIGlzIGNhbGxlZCB0aGUgQGRmbnt0YXJnZXR9Ci1zeXN0ZW0uCi0KLUZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIGEgY29tcGlsZXIgd2hpY2ggcnVucyBvbiBhIEdOVS9MaW51eAotc3lzdGVtIGFuZCBnZW5lcmF0ZXMgRUxGIHByb2dyYW1zIGZvciBhIE1JUFMgZW1iZWRkZWQgc3lzdGVtLiAgSW4gdGhpcwotY2FzZSB0aGUgR05VL0xpbnV4IHN5c3RlbSBpcyB0aGUgaG9zdCwgYW5kIHRoZSBNSVBTIEVMRiBzeXN0ZW0gaXMgdGhlCi10YXJnZXQuICBTdWNoIGEgY29tcGlsZXIgY291bGQgYmUgY2FsbGVkIGEgR05VL0xpbnV4IGNyb3NzIE1JUFMgRUxGCi1jb21waWxlciwgb3IsIGVxdWl2YWxlbnRseSwgYSBAc2FtcHtpMzg2LWxpbnV4LWdudX0gY3Jvc3MKLUBzYW1we21pcHMtZWxmfSBjb21waWxlci4KLQotTmF0dXJhbGx5LCBtb3N0IHByb2dyYW1zIGFyZSBub3QgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMuICBGb3IgdGhvc2UKLXByb2dyYW1zLCBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHNwZWFrIG9mIGEgdGFyZ2V0LiAgSXQgb25seSBtYWtlcwotc2Vuc2UgdG8gc3BlYWsgb2YgYSB0YXJnZXQgZm9yIHRvb2xzIGxpa2UgQHNhbXB7Z2NjfSBvciB0aGUKLUBzYW1we2JpbnV0aWxzfSB3aGljaCBhY3R1YWxseSBwcm9kdWNlIHJ1bm5pbmcgY29kZS4gIEZvciBleGFtcGxlLCBpdAotZG9lcyBub3QgbWFrZSBzZW5zZSB0byBzcGVhayBvZiB0aGUgdGFyZ2V0IG9mIGEgdG9vbCBsaWtlIEBzYW1we2Jpc29ufQotb3IgQHNhbXB7bWFrZX0uCi0KLU1vc3QgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMgY2FuIGFsc28gc2VydmUgYXMgbmF0aXZlIHRvb2xzLiAgRm9yIGEKLW5hdGl2ZSBjb21waWxhdGlvbiB0b29sLCBpdCBpcyBzdGlsbCBtZWFuaW5nZnVsIHRvIHNwZWFrIG9mIGEgdGFyZ2V0LgotRm9yIGEgbmF0aXZlIHRvb2wsIHRoZSB0YXJnZXQgaXMgdGhlIHNhbWUgYXMgdGhlIGhvc3QuICBGb3IgZXhhbXBsZSwgZm9yCi1hIEdOVS9MaW51eCBuYXRpdmUgY29tcGlsZXIsIHRoZSBob3N0IGlzIEdOVS9MaW51eCwgYW5kIHRoZSB0YXJnZXQgaXMKLWFsc28gR05VL0xpbnV4LgotCi1Abm9kZSBVc2luZyB0aGUgSG9zdCBUeXBlCi1Ac2VjdGlvbiBVc2luZyB0aGUgSG9zdCBUeXBlCi0KLUluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIGhvc3Qgc3lzdGVtIGlzIHRoZSBzeXN0ZW0gb24gd2hpY2ggeW91IHJ1biB0aGUKLUBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0LCBhbmQgb24gd2hpY2ggeW91IGJ1aWxkIHRoZSB0b29scyAoZm9yIHRoZSBjYXNlCi13aGVuIHRoZXkgZGlmZmVyLCBAcHhyZWZ7Q2FuYWRpYW4gQ3Jvc3N9KS4KLQotQGNpbmRleCBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0KLUlmIHlvdXIgY29uZmlndXJlIHNjcmlwdCBuZWVkcyB0byBrbm93IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlCi1ob3N0IHN5c3RlbSwgYW5kIHRoZSBwYWNrYWdlIGlzIG5vdCBhIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wgYW5kCi10aGVyZWZvcmUgZG9lcyBub3QgaGF2ZSBhIHRhcmdldCwgcHV0IEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfSBpbgotQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoaXMgbWFjcm8gd2lsbCBhcnJhbmdlIHRvIGRlZmluZSBhIGZldyBzaGVsbAotdmFyaWFibGVzIHdoZW4gdGhlIEBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0IGlzIHJ1bi4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBob3N0Ci1UaGUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgaG9zdC4gIFRoaXMgd2lsbCBub3JtYWxseSBiZQotZGV0ZXJtaW5lZCBieSBydW5uaW5nIHRoZSBAZmlsZXtjb25maWcuZ3Vlc3N9IHNoZWxsIHNjcmlwdCwgYWx0aG91Z2ggdGhlCi11c2VyIGlzIHBlcm1pdHRlZCB0byBvdmVycmlkZSB0aGlzIGJ5IHVzaW5nIGFuIGV4cGxpY2l0IEBzYW1wey0taG9zdH0KLW9wdGlvbi4KLUBpdGVtIGhvc3RfYWxpYXMKLUluIHRoZSB1bnVzdWFsIGNhc2UgdGhhdCB0aGUgdXNlciB1c2VkIGFuIGV4cGxpY2l0IEBzYW1wey0taG9zdH0gb3B0aW9uLAotdGhpcyB3aWxsIGJlIHRoZSBhcmd1bWVudCB0byBAc2FtcHstLWhvc3R9LiAgSW4gdGhlIG5vcm1hbCBjYXNlLCB0aGlzCi13aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBAc2FtcHtob3N0fSB2YXJpYWJsZS4KLUBpdGVtIGhvc3RfY3B1Ci1AaXRlbXggaG9zdF92ZW5kb3IKLUBpdGVteCBob3N0X29zCi1UaGUgZmlyc3QgdGhyZWUgcGFydHMgb2YgdGhlIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUuCi1AZW5kIHRhYmxlCi0KLVRoZSBzaGVsbCB2YXJpYWJsZXMgbWF5IGJlIHVzZWQgYnkgcHV0dGluZyBzaGVsbCBjb2RlIGluCi1AZmlsZXtjb25maWd1cmUuaW59LiAgRm9yIGFuIGV4YW1wbGUsIHNlZSBAcmVme1VzaW5nIENvbmZpZ3VyYXRpb24KLU5hbWVzfS4KLQotQG5vZGUgU3BlY2lmeWluZyB0aGUgVGFyZ2V0Ci1Ac2VjdGlvbiBTcGVjaWZ5aW5nIHRoZSBUYXJnZXQKLQotQnkgZGVmYXVsdCwgdGhlIEBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwgYXNzdW1lIHRoYXQgdGhlIHRhcmdldCBpcwotdGhlIHNhbWUgYXMgdGhlIGhvc3QuICBUaGlzIGlzIHRoZSBtb3JlIGNvbW1vbiBjYXNlOyBmb3IgZXhhbXBsZSwgaXQKLWxlYWRzIHRvIGEgbmF0aXZlIGNvbXBpbGVyIHJhdGhlciB0aGFuIGEgY3Jvc3MgY29tcGlsZXIuCi0KLUBjaW5kZXggQHNhbXB7LS10YXJnZXR9IG9wdGlvbgotQGNpbmRleCB0YXJnZXQgb3B0aW9uCi1AY2luZGV4IGNvbmZpZ3VyZSB0YXJnZXQKLUlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCwgeW91IG11c3Qgc3BlY2lmeSB0aGUKLXRhcmdldCBleHBsaWNpdGx5IGJ5IHVzaW5nIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIHdoZW4geW91IHJ1bgotQHNhbXB7Y29uZmlndXJlfS4gIFRoZSBhcmd1bWVudCB0byBAc2FtcHstLXRhcmdldH0gaXMgdGhlIGNvbmZpZ3VyYXRpb24KLW5hbWUgb2YgdGhlIHN5c3RlbSBmb3Igd2hpY2ggeW91IHdpc2ggdG8gZ2VuZXJhdGUgY29kZS4KLUB4cmVme0NvbmZpZ3VyYXRpb24gTmFtZXN9LgotCi1Gb3IgZXhhbXBsZSwgdG8gYnVpbGQgdG9vbHMgd2hpY2ggZ2VuZXJhdGUgY29kZSBmb3IgYSBNSVBTIEVMRiBlbWJlZGRlZAotc3lzdGVtLCB5b3Ugd291bGQgdXNlIEBzYW1wey0tdGFyZ2V0IG1pcHMtZWxmfS4KLQotQG5vZGUgVXNpbmcgdGhlIFRhcmdldCBUeXBlCi1Ac2VjdGlvbiBVc2luZyB0aGUgVGFyZ2V0IFR5cGUKLQotQGNpbmRleCBAc2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfQotV2hlbiB3cml0aW5nIEBmaWxle2NvbmZpZ3VyZS5pbn0gZm9yIGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCwgeW91IHdpbGwKLW5lZWQgdG8gdXNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXJnZXQuICBUbyBkbyB0aGlzLCBwdXQKLUBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19IGluIEBmaWxle2NvbmZpZ3VyZS5pbn0uCi0KLUBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19IHdpbGwgbG9vayBmb3IgYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIGFuZAotY2Fub25pY2FsaXplIGl0IHVzaW5nIHRoZSBAZmlsZXtjb25maWcuc3VifSBzaGVsbCBzY3JpcHQuICBJdCB3aWxsIGFsc28KLXJ1biBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0gKEBweHJlZntVc2luZyB0aGUgSG9zdCBUeXBlfSkuCi0KLVRoZSB0YXJnZXQgdHlwZSB3aWxsIGJlIHJlY29yZGVkIGluIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzLiAgTm90ZQotdGhhdCB0aGUgaG9zdCB2ZXJzaW9ucyBvZiB0aGVzZSB2YXJpYWJsZXMgd2lsbCBhbHNvIGJlIGRlZmluZWQgYnkKLUBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfS4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSB0YXJnZXQKLVRoZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSB0YXJnZXQuCi1AaXRlbSB0YXJnZXRfYWxpYXMKLVRoZSBhcmd1bWVudCB0byB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbi4gIElmIHRoZSB1c2VyIGRpZCBub3Qgc3BlY2lmeQotYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgQHNhbXB7aG9zdF9hbGlhc30uCi1AaXRlbSB0YXJnZXRfY3B1Ci1AaXRlbXggdGFyZ2V0X3ZlbmRvcgotQGl0ZW14IHRhcmdldF9vcwotVGhlIGZpcnN0IHRocmVlIHBhcnRzIG9mIHRoZSBjYW5vbmljYWwgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gbmFtZS4KLUBlbmQgdGFibGUKLQotTm90ZSB0aGF0IGlmIEBzYW1we2hvc3R9IGFuZCBAc2FtcHt0YXJnZXR9IGFyZSB0aGUgc2FtZSBzdHJpbmcsIHlvdSBjYW4KLWFzc3VtZSBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLiAgSWYgdGhleSBhcmUgZGlmZmVyZW50LCB5b3UgY2FuIGFzc3VtZSBhCi1jcm9zcyBjb25maWd1cmF0aW9uLgotCi1JdCBpcyBhcmd1YWJseSBwb3NzaWJsZSBmb3IgQHNhbXB7aG9zdH0gYW5kIEBzYW1we3RhcmdldH0gdG8gcmVwcmVzZW50Ci10aGUgc2FtZSBzeXN0ZW0sIGJ1dCBmb3IgdGhlIHN0cmluZ3MgdG8gbm90IGJlIGlkZW50aWNhbC4gIEZvciBleGFtcGxlLAotaWYgQHNhbXB7Y29uZmlnLmd1ZXNzfSByZXR1cm5zIEBzYW1we3NwYXJjLXN1bi1zdW5vczQuMS40fSwgYW5kIHNvbWVib2R5Ci1jb25maWd1cmVzIHdpdGggQHNhbXB7LS10YXJnZXQgc3BhcmMtc3VuLXN1bm9zNC4xfSwgdGhlbiB0aGUgc2xpZ2h0Ci1kaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMgb2YgU3VuT1MgbWF5IGJlIHVuaW1wb3J0YW50IGZvcgoteW91ciB0b29sLiAgSG93ZXZlciwgaW4gdGhlIGdlbmVyYWwgY2FzZSBpdCBjYW4gYmUgcXVpdGUgZGlmZmljdWx0IHRvCi1kZXRlcm1pbmUgd2hldGhlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gY29uZmlndXJhdGlvbiBuYW1lcyBhcmUKLXNpZ25pZmljYW50IG9yIG5vdC4gIFRoZXJlZm9yZSwgYnkgY29udmVudGlvbiwgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIGEKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gd2l0aG91dCBzcGVjaWZ5aW5nIGEgQHNhbXB7LS1ob3N0fSBvcHRpb24sIGl0IGlzCi1hc3N1bWVkIHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gY29uZmlndXJlIGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbC4KLQotVGhlIHZhcmlhYmxlcyBAc2FtcHt0YXJnZXR9IGFuZCBAc2FtcHt0YXJnZXRfYWxpYXN9IHNob3VsZCBiZSBoYW5kbGVkCi1kaWZmZXJlbnRseS4KLQotSW4gZ2VuZXJhbCwgd2hlbmV2ZXIgdGhlIHVzZXIgbWF5IGFjdHVhbGx5IHNlZSBhIHN0cmluZywKLUBzYW1we3RhcmdldF9hbGlhc30gc2hvdWxkIGJlIHVzZWQuICBUaGlzIGluY2x1ZGVzIGFueXRoaW5nIHdoaWNoIG1heQotYXBwZWFyIGluIHRoZSBmaWxlIHN5c3RlbSwgc3VjaCBhcyBhIGRpcmVjdG9yeSBuYW1lIG9yIHBhcnQgb2YgYSB0b29sCi1uYW1lLiAgSXQgYWxzbyBpbmNsdWRlcyBhbnkgdG9vbCBvdXRwdXQsIHVubGVzcyBpdCBpcyBjbGVhcmx5IGxhYmVsbGVkCi1hcyB0aGUgY2Fub25pY2FsIHRhcmdldCBjb25maWd1cmF0aW9uIG5hbWUuICBUaGlzIHBlcm1pdHMgdGhlIHVzZXIgdG8KLXVzZSB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB0byBzcGVjaWZ5IGhvdyB0aGUgdG9vbCB3aWxsIGFwcGVhciB0bwotdGhlIG91dHNpZGUgd29ybGQuCi0KLU9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIGNoZWNraW5nIGZvciBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHRhcmdldAotc3lzdGVtLCBAc2FtcHt0YXJnZXR9IHNob3VsZCBiZSB1c2VkLiAgVGhpcyBpcyBiZWNhdXNlIGEgd2lkZSB2YXJpZXR5IG9mCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9ucyBtYXkgbWFwIGludG8gdGhlIHNhbWUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24KLW5hbWUuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGR1cGxpY2F0ZSB0aGUgY2Fub25pY2FsaXphdGlvbiBkb25lIGJ5Ci1Ac2FtcHtjb25maWcuc3VifSBpbiB5b3VyIG93biBjb2RlLgotCi1CeSBjb252ZW50aW9uLCBjcm9zcyB0b29scyBhcmUgaW5zdGFsbGVkIHdpdGggYSBwcmVmaXggb2YgdGhlIGFyZ3VtZW50Ci11c2VkIHdpdGggdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIGFsc28ga25vd24gYXMgQHNhbXB7dGFyZ2V0X2FsaWFzfQotKEBweHJlZntVc2luZyB0aGUgVGFyZ2V0IFR5cGV9KS4gIElmIHRoZSB1c2VyIGRvZXMgbm90IHVzZSB0aGUKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIGFuZCB0aHVzIGlzIGJ1aWxkaW5nIGEgbmF0aXZlIHRvb2wsIG5vIHByZWZpeCBpcwotdXNlZC4KLQotRm9yIGV4YW1wbGUsIGlmIGdjYyBpcyBjb25maWd1cmVkIHdpdGggQHNhbXB7LS10YXJnZXQgbWlwcy1lbGZ9LCB0aGVuCi10aGUgaW5zdGFsbGVkIGJpbmFyeSB3aWxsIGJlIG5hbWVkIEBzYW1we21pcHMtZWxmLWdjY30uICBJZiBnY2MgaXMKLWNvbmZpZ3VyZWQgd2l0aG91dCBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIHRoZW4gdGhlIGluc3RhbGxlZCBiaW5hcnkKLXdpbGwgYmUgbmFtZWQgQHNhbXB7Z2NjfS4KLQotVGhlIGF1dG9jb25mIG1hY3JvIEBzYW1we0FDX0FSR19QUk9HUkFNfSB3aWxsIGhhbmRsZSB0aGlzIGZvciB5b3UuICBJZgoteW91IGFyZSB1c2luZyBhdXRvbWFrZSwgbm8gbW9yZSBuZWVkIGJlIGRvbmU7IHRoZSBwcm9ncmFtcyB3aWxsCi1hdXRvbWF0aWNhbGx5IGJlIGluc3RhbGxlZCB3aXRoIHRoZSBjb3JyZWN0IHByZWZpeGVzLiAgT3RoZXJ3aXNlLCBzZWUKLXRoZSBhdXRvY29uZiBkb2N1bWVudGF0aW9uIGZvciBAc2FtcHtBQ19BUkdfUFJPR1JBTX0uCi0KLUBub2RlIENyb3NzIFRvb2xzIGluIHRoZSBDeWdudXMgVHJlZQotQHNlY3Rpb24gQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlCi0KLVRoZSBDeWdudXMgdHJlZSBpcyB1c2VkIGZvciB2YXJpb3VzIHBhY2thZ2VzIGluY2x1ZGluZyBnZGIsIHRoZSBHTlUKLWJpbnV0aWxzLCBhbmQgZWdjcy4gIEl0IGlzIGFsc28sIG9mIGNvdXJzZSwgdXNlZCBmb3IgQ3lnbnVzIHJlbGVhc2VzLgotCi1JbiB0aGUgQ3lnbnVzIHRyZWUsIHRoZSB0b3AgbGV2ZWwgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgdXNlcyB0aGUgb2xkCi1DeWdudXMgY29uZmlndXJlIHN5c3RlbSwgbm90IGF1dG9jb25mLiAgVGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZS5pbn0KLWlzIHdyaXR0ZW4gdG8gYnVpbGQgcGFja2FnZXMgYmFzZWQgb24gd2hhdCBpcyBpbiB0aGUgc291cmNlIHRyZWUsIGFuZAotc3VwcG9ydHMgYnVpbGRpbmcgYSBsYXJnZSBudW1iZXIgb2YgdG9vbHMgaW4gYSBzaW5nbGUKLUBzYW1we2NvbmZpZ3VyZX0vQHNhbXB7bWFrZX0gc3RlcC4KLQotVGhlIEN5Z251cyB0cmVlIG1heSBiZSBjb25maWd1cmVkIHdpdGggYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLiAgVGhlCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9uIGFwcGxpZXMgcmVjdXJzaXZlbHkgdG8gZXZlcnkgc3ViZGlyZWN0b3J5LCBhbmQKLXBlcm1pdHMgYnVpbGRpbmcgYW4gZW50aXJlIHNldCBvZiBjcm9zcyB0b29scyBhdCBvbmNlLgotCi1AbWVudQotKiBIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzOjoJCUhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXMuCi0qIFRhcmdldCBMaWJyYXJ5IENvbmZpZ3VyZSBTY3JpcHRzOjoJVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHMuCi0qIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZTo6ICAgICAgICAgTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlLgotKiBUYXJnZXQgbGliaWJlcnR5OjoJCQlUYXJnZXQgbGliaWJlcnR5Ci1AZW5kIG1lbnUKLQotQG5vZGUgSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllcwotQHN1YnNlY3Rpb24gSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllcwotCi1UaGUgQ3lnbnVzIHRyZWUgZGlzdGluZ3Vpc2hlcyBob3N0IGxpYnJhcmllcyBmcm9tIHRhcmdldCBsaWJyYXJpZXMuCi0KLUhvc3QgbGlicmFyaWVzIGFyZSBidWlsdCB3aXRoIHRoZSBjb21waWxlciB1c2VkIHRvIGJ1aWxkIHRoZSBwcm9ncmFtcwotd2hpY2ggcnVuIG9uIHRoZSBob3N0LCB3aGljaCBpcyBjYWxsZWQgdGhlIGhvc3QgY29tcGlsZXIuICBUaGlzIGluY2x1ZGVzCi1saWJyYXJpZXMgc3VjaCBhcyBAc2FtcHtiZmR9IGFuZCBAc2FtcHt0Y2x9LiAgVGhlc2UgbGlicmFyaWVzIGFyZSBidWlsdAotd2l0aCB0aGUgaG9zdCBjb21waWxlciwgYW5kIGFyZSBsaW5rZWQgaW50byBwcm9ncmFtcyBsaWtlIHRoZSBiaW51dGlscwotb3IgZ2NjIHdoaWNoIHJ1biBvbiB0aGUgaG9zdC4KLQotVGFyZ2V0IGxpYnJhcmllcyBhcmUgYnVpbHQgd2l0aCB0aGUgdGFyZ2V0IGNvbXBpbGVyLiAgSWYgZ2NjIGlzIHByZXNlbnQKLWluIHRoZSBzb3VyY2UgdHJlZSwgdGhlbiB0aGUgdGFyZ2V0IGNvbXBpbGVyIGlzIHRoZSBnY2MgdGhhdCBpcyBidWlsdAotdXNpbmcgdGhlIGhvc3QgY29tcGlsZXIuICBUYXJnZXQgbGlicmFyaWVzIGFyZSBsaWJyYXJpZXMgc3VjaCBhcwotQHNhbXB7bmV3bGlifSBhbmQgQHNhbXB7bGlic3RkYysrfS4gIFRoZXNlIGxpYnJhcmllcyBhcmUgbm90IGxpbmtlZCBpbnRvCi10aGUgaG9zdCBwcm9ncmFtcywgYnV0IGFyZSBpbnN0ZWFkIG1hZGUgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aCBwcm9ncmFtcwotYnVpbHQgd2l0aCB0aGUgdGFyZ2V0IGNvbXBpbGVyLgotCi1Gb3IgdGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uLCBhc3N1bWUgdGhhdCBnY2MgaXMgcHJlc2VudCBpbiB0aGUgc291cmNlCi10cmVlLCBzbyB0aGF0IGl0IHdpbGwgYmUgdXNlZCB0byBidWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KLQotVGhlcmUgaXMgYSBjb21wbGljYXRpb24gaGVyZS4gIFRoZSBjb25maWd1cmUgcHJvY2VzcyBuZWVkcyB0byBrbm93IHdoaWNoCi1jb21waWxlciB5b3UgYXJlIGdvaW5nIHRvIHVzZSB0byBidWlsZCBhIHRvb2w7IG90aGVyd2lzZSwgdGhlIGZlYXR1cmUKLXRlc3RzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5LiAgVGhlIEN5Z251cyB0cmVlIGhhbmRsZXMgdGhpcyBieSBub3QKLWNvbmZpZ3VyaW5nIHRoZSB0YXJnZXQgbGlicmFyaWVzIHVudGlsIHRoZSB0YXJnZXQgY29tcGlsZXIgaXMgYnVpbHQuICBJbgotb3JkZXIgdG8gcGVybWl0IGV2ZXJ5dGhpbmcgdG8gYnVpbGQgdXNpbmcgYSBzaW5nbGUKLUBzYW1we2NvbmZpZ3VyZX0vQHNhbXB7bWFrZX0sIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0YXJnZXQgbGlicmFyaWVzCi1pcyBhY3R1YWxseSB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBtYWtlIHN0ZXAuCi0KLVdoZW4gdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbmZpZ3VyZWQsIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIGlzCi1ub3QgdXNlZC4gIEluc3RlYWQsIHRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiBpcyB1c2VkIHdpdGggdGhlIGFyZ3VtZW50Ci1vZiB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBmb3IgdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbi4gIElmIG5vCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9uIHdhcyB1c2VkIGZvciB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLCB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uIHdpbGwgYmUgcGFzc2VkIHdpdGggdGhlIG91dHB1dCBvZiB0aGUKLUBmaWxle2NvbmZpZy5ndWVzc30gc2hlbGwgc2NyaXB0LiAgQW55IEBzYW1wey0tYnVpbGR9IG9wdGlvbiBpcyBwYXNzZWQKLWRvd24gdW5jaGFuZ2VkLgotCi1UaGlzIHRyYW5zbGF0aW9uIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpcyBkb25lIGJlY2F1c2Ugc2luY2UgdGhlCi10YXJnZXQgbGlicmFyaWVzIGFyZSBjb21waWxlZCB3aXRoIHRoZSB0YXJnZXQgY29tcGlsZXIsIHRoZXkgYXJlIGJlaW5nCi1idWlsdCBpbiBvcmRlciB0byBydW4gb24gdGhlIHRhcmdldCBvZiB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLiAgQnkKLXRoZSBkZWZpbml0aW9uIG9mIGhvc3QsIHRoaXMgbWVhbnMgdGhhdCB0aGVpciBob3N0IHN5c3RlbSBpcyB0aGUgc2FtZSBhcwotdGhlIHRhcmdldCBzeXN0ZW0gb2YgdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbi4KLQotVGhlIHNhbWUgcHJvY2VzcyBpcyB1c2VkIGZvciBib3RoIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24gYW5kIGEgY3Jvc3MKLWNvbmZpZ3VyYXRpb24uICBFdmVuIHdoZW4gdXNpbmcgYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgdGhlIHRhcmdldAotbGlicmFyaWVzIHdpbGwgYmUgY29uZmlndXJlZCBhbmQgYnVpbHQgdXNpbmcgdGhlIG5ld2x5IGJ1aWx0IGNvbXBpbGVyLgotVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciB0aGUgQysrIGxpYnJhcmllcywgc2luY2UgdGhlcmUgaXMgbm8KLXJlYXNvbiB0byBhc3N1bWUgdGhhdCB0aGUgQysrIGNvbXBpbGVyIHVzZWQgdG8gYnVpbGQgdGhlIGhvc3QgdG9vbHMgKGlmCi10aGVyZSBldmVuIGlzIG9uZSkgdXNlcyB0aGUgc2FtZSBBQkkgYXMgdGhlIGcrKyBjb21waWxlciB3aGljaCB3aWxsIGJlCi11c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotCi1UaGVyZSBpcyBvbmUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24gYW5kIGEgY3Jvc3MKLWNvbmZpZ3VyYXRpb24uICBJbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUKLW5vcm1hbGx5IGNvbmZpZ3VyZWQgYW5kIGJ1aWx0IGFzIHNpYmxpbmdzIG9mIHRoZSBob3N0IHRvb2xzLiAgSW4gYSBjcm9zcwotY29uZmlndXJhdGlvbiwgdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIG5vcm1hbGx5IGJ1aWx0IGluIGEgc3ViZGlyZWN0b3J5Ci13aG9zZSBuYW1lIGlzIHRoZSBhcmd1bWVudCB0byBAc2FtcHstLXRhcmdldH0uICBUaGlzIGlzIG1haW5seSBmb3IKLWhpc3RvcmljYWwgcmVhc29ucy4KLQotVG8gc3VtbWFyaXplLCBydW5uaW5nIEBzYW1we2NvbmZpZ3VyZX0gaW4gdGhlIEN5Z251cyB0cmVlIGNvbmZpZ3VyZXMgYWxsCi10aGUgaG9zdCBsaWJyYXJpZXMgYW5kIHRvb2xzLCBidXQgZG9lcyBub3QgY29uZmlndXJlIGFueSBvZiB0aGUgdGFyZ2V0Ci1saWJyYXJpZXMuICBSdW5uaW5nIEBzYW1we21ha2V9IHRoZW4gZG9lcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQnVpbGQgdGhlIGhvc3QgbGlicmFyaWVzLgotQGl0ZW0KLUJ1aWxkIHRoZSBob3N0IHByb2dyYW1zLCBpbmNsdWRpbmcgZ2NjLiAgTm90ZSB0aGF0IHdlIGNhbGwgZ2NjIGJvdGggYQotaG9zdCBwcm9ncmFtIChzaW5jZSBpdCBydW5zIG9uIHRoZSBob3N0KSBhbmQgYSB0YXJnZXQgY29tcGlsZXIgKHNpbmNlIGl0Ci1nZW5lcmF0ZXMgY29kZSBmb3IgdGhlIHRhcmdldCkuCi1AaXRlbQotVXNpbmcgdGhlIG5ld2x5IGJ1aWx0IHRhcmdldCBjb21waWxlciwgY29uZmlndXJlIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotQGl0ZW0KLUJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotQGVuZCBpdGVtaXplCi0KLVRoZSBzdGVwcyBuZWVkIG5vdCBiZSBkb25lIGluIHByZWNpc2VseSB0aGlzIG9yZGVyLCBzaW5jZSB0aGV5IGFyZQotYWN0dWFsbHkgY29udHJvbGxlZCBieSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0cy4KLQotQG5vZGUgVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHMKLUBzdWJzZWN0aW9uIFRhcmdldCBMaWJyYXJ5IENvbmZpZ3VyZSBTY3JpcHRzCi0KLVRoZXJlIGFyZSBhIGZldyB0aGluZ3MgeW91IG11c3Qga25vdyBpbiBvcmRlciB0byB3cml0ZSBhIGNvbmZpZ3VyZQotc2NyaXB0IGZvciBhIHRhcmdldCBsaWJyYXJ5LiAgVGhpcyBpcyBqdXN0IGEgcXVpY2sgc2tldGNoLCBhbmQgYmVnaW5uZXJzCi1zaG91bGRuJ3Qgd29ycnkgaWYgdGhleSBkb24ndCBmb2xsb3cgZXZlcnl0aGluZyBoZXJlLgotCi1UaGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgY29uZmlndXJlZCBhbmQgYnVpbHQgdXNpbmcgYSBuZXdseSBidWlsdCB0YXJnZXQKLWNvbXBpbGVyLiAgVGhlcmUgbWF5IG5vdCBiZSBhbnkgc3RhcnR1cCBmaWxlcyBvciBsaWJyYXJpZXMgZm9yIHRoaXMKLXRhcmdldCBjb21waWxlci4gIEluIGZhY3QsIHRob3NlIGZpbGVzIHdpbGwgcHJvYmFibHkgYmUgYnVpbHQgYXMgcGFydCBvZgotc29tZSB0YXJnZXQgbGlicmFyeSwgd2hpY2ggbmF0dXJhbGx5IG1lYW5zIHRoYXQgdGhleSB3aWxsIG5vdCBleGlzdCB3aGVuCi15b3VyIHRhcmdldCBsaWJyYXJ5IGlzIGNvbmZpZ3VyZWQuCi0KLVRoaXMgbWVhbnMgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IgYSB0YXJnZXQgbGlicmFyeSBtYXkgbm90IHVzZQotYW55IHRlc3Qgd2hpY2ggcmVxdWlyZXMgZG9pbmcgYSBsaW5rLiAgVGhpcyB1bmZvcnR1bmF0ZWx5IGluY2x1ZGVzIG1hbnkKLXVzZWZ1bCBhdXRvY29uZiBtYWNyb3MsIHN1Y2ggYXMgQHNhbXB7QUNfQ0hFQ0tfRlVOQ1N9LiAgYXV0b2NvbmYgbWFjcm9zCi13aGljaCBkbyBhIGNvbXBpbGUgYnV0IG5vdCBhIGxpbmssIHN1Y2ggYXMgQHNhbXB7QUNfQ0hFQ0tfSEVBREVSU30sIG1heQotYmUgdXNlZC4KLQotVGhpcyBpcyBhIHNldmVyZSByZXN0cmljdGlvbiwgYnV0IG5vcm1hbGx5IG5vdCBhIGZhdGFsIG9uZSwgYXMgdGFyZ2V0Ci1saWJyYXJpZXMgY2FuIG9mdGVuIGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXIgdGFyZ2V0IGxpYnJhcmllcywgYW5kCi10aHVzIGtub3cgd2hpY2ggZnVuY3Rpb25zIHdpbGwgYmUgYXZhaWxhYmxlLgotCi1BcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBhdXRvY29uZiBtYWNybyBAc2FtcHtBQ19QUk9HX0NDfSBkb2VzIGEgbGluayB0bwotbWFrZSBzdXJlIHRoYXQgdGhlIGNvbXBpbGVyIHdvcmtzLiAgVGhpcyBtYXkgZmFpbCBpbiBhIHRhcmdldCBsaWJyYXJ5LAotc28gdGFyZ2V0IGxpYnJhcmllcyBtdXN0IHVzZSBhIGRpZmZlcmVudCBzZXQgb2YgbWFjcm9zIHRvIGxvY2F0ZSB0aGUKLWNvbXBpbGVyLiAgU2VlIHRoZSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaW4gYSBkaXJlY3RvcnkgbGlrZQotQGZpbGV7bGliaWJlcnR5fSBvciBAZmlsZXtsaWJnbG9zc30gZm9yIGFuIGV4YW1wbGUuCi0KLUFzIG5vdGVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0YXJnZXQgbGlicmFyaWVzIGFyZSBzb21ldGltZXMgYnVpbHQKLWluIGRpcmVjdG9yaWVzIHdoaWNoIGFyZSBzaWJsaW5ncyB0byB0aGUgaG9zdCB0b29scywgYW5kIGFyZSBzb21ldGltZXMKLWJ1aWx0IGluIGEgc3ViZGlyZWN0b3J5LiAgVGhlIEBzYW1wey0td2l0aC10YXJnZXQtc3ViZGlyfSBjb25maWd1cmUKLW9wdGlvbiB3aWxsIGJlIHBhc3NlZCB3aGVuIHRoZSBsaWJyYXJ5IGlzIGNvbmZpZ3VyZWQuICBJdHMgdmFsdWUgd2lsbCBiZQotYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSB0YXJnZXQgbGlicmFyeSBpcyBhIHNpYmxpbmcuICBJdHMgdmFsdWUgd2lsbCBiZQotdGhlIG5hbWUgb2YgdGhlIHN1YmRpcmVjdG9yeSBpZiB0aGUgdGFyZ2V0IGxpYnJhcnkgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0KLUlmIHRoZSBvdmVyYWxsIGJ1aWxkIGlzIG5vdCBhIG5hdGl2ZSBidWlsZCAoaS5lLiwgdGhlIG92ZXJhbGwgY29uZmlndXJlCi11c2VkIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uKSwgdGhlbiB0aGUgbGlicmFyeSB3aWxsIGJlIGNvbmZpZ3VyZWQKLXdpdGggdGhlIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24uICBUaGUgdmFsdWUgb2YgdGhpcyBvcHRpb24gd2lsbAotYmUgdGhlIGhvc3Qgc3lzdGVtIG9mIHRoZSBvdmVyYWxsIGJ1aWxkLiAgUmVjYWxsIHRoYXQgdGhlIGhvc3Qgc3lzdGVtIG9mCi10aGUgbGlicmFyeSB3aWxsIGJlIHRoZSB0YXJnZXQgb2YgdGhlIG92ZXJhbGwgYnVpbGQuICBJZiB0aGUgb3ZlcmFsbAotYnVpbGQgaXMgYSBuYXRpdmUgYnVpbGQsIHRoZSBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uIHdpbGwgbm90IGJlCi11c2VkLgotCi1BIGxpYnJhcnkgd2hpY2ggY2FuIGJlIGJ1aWx0IGJvdGggc3RhbmRhbG9uZSBhbmQgYXMgYSB0YXJnZXQgbGlicmFyeSBtYXkKLXdhbnQgdG8gaW5zdGFsbCBpdHNlbGYgaW50byBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgZGVwZW5kaW5nIHVwb24gdGhlCi1jYXNlLiAgV2hlbiBidWlsdCBzdGFuZGFsb25lLCBvciB3aGVuIGJ1aWx0IG5hdGl2ZSwgdGhlIGxpYnJhcnkgc2hvdWxkCi1iZSBpbnN0YWxsZWQgaW4gQHNhbXB7JChsaWJkaXIpfS4gIFdoZW4gYnVpbHQgYXMgYSB0YXJnZXQgbGlicmFyeSB3aGljaAotaXMgbm90IG5hdGl2ZSwgdGhlIGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiBAc2FtcHskKHRvb2xkaXIpL2xpYn0uCi1UaGUgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbiBtYXkgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVzZQotY2FzZXMuCi0KLVRoaXMgc2FtZSB0ZXN0IG9mIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBtYXkgYmUgdXNlZCB0byBzZWUgd2hldGhlciBpdAotaXMgT0sgdG8gdXNlIGxpbmsgdGVzdHMgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuICBJZiB0aGUKLUBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24gaXMgbm90IHVzZWQsIHRoZW4gdGhlIGxpYnJhcnkgaXMgYmVpbmcKLWJ1aWx0IGVpdGhlciBzdGFuZGFsb25lIG9yIG5hdGl2ZSwgYW5kIGEgbGluayBzaG91bGQgd29yay4KLQotQG5vZGUgTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlCi1Ac3Vic2VjdGlvbiBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWUKLQotVGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZX0gaW4gdGhlIEN5Z251cyB0cmVlIGRlZmluZXMgdGFyZ2V0cyBmb3IKLWV2ZXJ5IGtub3duIHN1YmRpcmVjdG9yeS4KLQotRm9yIGV2ZXJ5IHN1YmRpcmVjdG9yeSBAdmFye2Rpcn0gd2hpY2ggaG9sZHMgYSBob3N0IGxpYnJhcnkgb3IgcHJvZ3JhbSwKLXRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0IEBzYW1we2FsbC1AdmFye2Rpcn19IHdpbGwgYnVpbGQgdGhhdCBsaWJyYXJ5Ci1vciBwcm9ncmFtLgotCi1UaGVyZSBhcmUgZGVwZW5kZW5jaWVzIGFtb25nIGhvc3QgdG9vbHMuICBGb3IgZXhhbXBsZSwgYnVpbGRpbmcgZ2NjCi1yZXF1aXJlcyBmaXJzdCBidWlsZGluZyBnYXMsIGJlY2F1c2UgdGhlIGdjYyBidWlsZCBwcm9jZXNzIGludm9rZXMgdGhlCi10YXJnZXQgYXNzZW1ibGVyLiAgVGhlc2UgZGVwZW5kZW5jaWVzIGFyZSByZWZsZWN0ZWQgaW4gdGhlIHRvcCBsZXZlbAotQGZpbGV7TWFrZWZpbGV9LgotCi1Gb3IgZXZlcnkgc3ViZGlyZWN0b3J5IEB2YXJ7ZGlyfSB3aGljaCBob2xkcyBhIHRhcmdldCBsaWJyYXJ5LCB0aGUKLUBmaWxle01ha2VmaWxlfSB0YXJnZXQgQHNhbXB7Y29uZmlndXJlLXRhcmdldC1AdmFye2Rpcn19IHdpbGwgY29uZmlndXJlCi10aGF0IGxpYnJhcnkuICBUaGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBAc2FtcHthbGwtdGFyZ2V0LUB2YXJ7ZGlyfX0KLXdpbGwgYnVpbGQgdGhhdCBsaWJyYXJ5LgotCi1FdmVyeSBAc2FtcHtjb25maWd1cmUtdGFyZ2V0LUB2YXJ7ZGlyfX0gdGFyZ2V0IGRlcGVuZHMgdXBvbgotQHNhbXB7YWxsLWdjY30sIHNpbmNlIGdjYywgdGhlIHRhcmdldCBjb21waWxlciwgaXMgcmVxdWlyZWQgdG8gY29uZmlndXJlCi10aGUgdG9vbC4gIEV2ZXJ5IEBzYW1we2FsbC10YXJnZXQtQHZhcntkaXJ9fSB0YXJnZXQgZGVwZW5kcyB1cG9uIHRoZQotY29ycmVzcG9uZGluZyBAc2FtcHtjb25maWd1cmUtdGFyZ2V0LUB2YXJ7ZGlyfX0gdGFyZ2V0LgotCi1UaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciB0YXJnZXRzIHdoaWNoIG1heSBiZSBvZiBpbnRlcmVzdCBmb3IgZWFjaAotZGlyZWN0b3J5OiBAc2FtcHtpbnN0YWxsLUB2YXJ7ZGlyfX0sIEBzYW1we2NsZWFuLUB2YXJ7ZGlyfX0sIGFuZAotQHNhbXB7Y2hlY2stQHZhcntkaXJ9fS4gIFRoZXJlIGFyZSBhbHNvIGNvcnJlc3BvbmRpbmcgQHNhbXB7dGFyZ2V0fQotdmVyc2lvbnMgb2YgdGhlc2UgZm9yIHRoZSB0YXJnZXQgbGlicmFyaWVzICwgc3VjaCBhcwotQHNhbXB7aW5zdGFsbC10YXJnZXQtQHZhcntkaXJ9fS4KLQotQG5vZGUgVGFyZ2V0IGxpYmliZXJ0eQotQHN1YnNlY3Rpb24gVGFyZ2V0IGxpYmliZXJ0eQotCi1UaGUgQGZpbGV7bGliaWJlcnR5fSBzdWJkaXJlY3RvcnkgaXMgY3VycmVudGx5IGEgc3BlY2lhbCBjYXNlLCBpbiB0aGF0Ci1pdCBpcyB0aGUgb25seSBkaXJlY3Rvcnkgd2hpY2ggaXMgYnVpbHQgYm90aCB1c2luZyB0aGUgaG9zdCBjb21waWxlciBhbmQKLXVzaW5nIHRoZSB0YXJnZXQgY29tcGlsZXIuCi0KLVRoaXMgaXMgYmVjYXVzZSB0aGUgZmlsZXMgaW4gQGZpbGV7bGliaWJlcnR5fSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZQotaG9zdCB0b29scywgYW5kIHRoZXkgYXJlIGFsc28gaW5jb3Jwb3JhdGVkIGludG8gdGhlIEBmaWxle2xpYnN0ZGMrK30KLXRhcmdldCBsaWJyYXJ5IGFzIHN1cHBvcnQgY29kZS4KLQotVGhpcyBkdWFsaXR5IGRvZXMgbm90IHBvc2UgYW55IHBhcnRpY3VsYXIgZGlmZmljdWx0aWVzLiAgSXQgbWVhbnMgdGhhdAotdGhlcmUgYXJlIHRhcmdldHMgZm9yIGJvdGggQHNhbXB7YWxsLWxpYmliZXJ0eX0gYW5kCi1Ac2FtcHthbGwtdGFyZ2V0LWxpYmliZXJ0eX0uCi0KLUluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHdoZW4gdGFyZ2V0IGxpYnJhcmllcyBhcmUgbm90IGJ1aWx0IGluIGEKLXN1YmRpcmVjdG9yeSwgdGhlIHNhbWUgb2JqZWN0cyBhcmUgbm9ybWFsbHkgdXNlZCBhcyBib3RoIHRoZSBob3N0IGJ1aWxkCi1hbmQgdGhlIHRhcmdldCBidWlsZC4gIFRoaXMgaXMgbm9ybWFsbHkgT0ssIHNpbmNlIGxpYmliZXJ0eSBjb250YWlucwotb25seSBDIGNvZGUsIGFuZCBpbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uIHRoZSByZXN1bHRzIG9mIHRoZSBob3N0Ci1jb21waWxlciBhbmQgdGhlIHRhcmdldCBjb21waWxlciBhcmUgbm9ybWFsbHkgaW50ZXJvcGVyYWJsZS4KLQotSXJpeCA2IGlzIGFnYWluIGFuIGV4Y2VwdGlvbiBoZXJlLCBzaW5jZSB0aGUgU0dJIG5hdGl2ZSBjb21waWxlcgotZGVmYXVsdHMgdG8gdXNpbmcgdGhlIEBzYW1we08zMn0gQUJJLCBhbmQgZ2NjIGRlZmF1bHRzIHRvIHVzaW5nIHRoZQotQHNhbXB7TjMyfSBBQkkuICBPbiBJcml4IDYsIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBidWlsdCBpbiBhCi1zdWJkaXJlY3RvcnkgZXZlbiBmb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgYXZvaWRpbmcgdGhpcyBwcm9ibGVtLgotCi1UaGVyZSBhcmUgY3VycmVudGx5IG5vIG90aGVyIGxpYnJhcmllcyBidWlsdCBmb3IgYm90aCB0aGUgaG9zdCBhbmQgdGhlCi10YXJnZXQsIGJ1dCB0aGVyZSBpcyBubyBjb25jZXB0dWFsIHByb2JsZW0gd2l0aCBhZGRpbmcgbW9yZS4KLQotQG5vZGUgQ2FuYWRpYW4gQ3Jvc3MKLUBjaGFwdGVyIENhbmFkaWFuIENyb3NzCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzCi1AY2luZGV4IGJ1aWxkaW5nIHdpdGggYSBjcm9zcyBjb21waWxlcgotQGNpbmRleCBjcm9zcyBjb21waWxlciwgYnVpbGRpbmcgd2l0aAotCi1JdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSB0byBidWlsZCBhCi1wcm9ncmFtIHdoaWNoIHdpbGwgcnVuIG9uIGEgc3lzdGVtIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzeXN0ZW0gb24KLXdoaWNoIHRoZSB0b29scyBhcmUgYnVpbHQuICBJbiBvdGhlciB3b3JkcywgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQKLXByb2dyYW1zIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0KLVRoaXMgaXMgcmVmZXJyZWQgdG8gYXMgYSBAZGZue0NhbmFkaWFuIENyb3NzfS4KLQotQG1lbnUKLSogQ2FuYWRpYW4gQ3Jvc3MgRXhhbXBsZTo6CQlDYW5hZGlhbiBDcm9zcyBFeGFtcGxlLgotKiBDYW5hZGlhbiBDcm9zcyBDb25jZXB0czo6CQlDYW5hZGlhbiBDcm9zcyBDb25jZXB0cy4KLSogQnVpbGQgQ3Jvc3MgSG9zdCBUb29sczo6CQlCdWlsZCBDcm9zcyBIb3N0IFRvb2xzLgotKiBCdWlsZCBhbmQgSG9zdCBPcHRpb25zOjoJCUJ1aWxkIGFuZCBIb3N0IE9wdGlvbnMuCi0qIENDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWU6OgkJQ2FuYWRpYW4gQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlLgotKiBDQ3Jvc3MgaW4gQ3lnbnVzIFRyZWU6OgkJQ2FuYWRpYW4gQ3Jvc3MgaW4gQ3lnbnVzIFRyZWUuCi0qIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3M6OgkJU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDYW5hZGlhbiBDcm9zcyBFeGFtcGxlCi1Ac2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBFeGFtcGxlCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIENhbmFkaWFuIENyb3NzLgotCi1XaGlsZSBydW5uaW5nIG9uIGEgR05VL0xpbnV4LCB5b3UgY2FuIGJ1aWxkIGEgcHJvZ3JhbSB3aGljaCB3aWxsIHJ1biBvbgotYSBTb2xhcmlzIHN5c3RlbS4gIFlvdSB3b3VsZCB1c2UgYSBHTlUvTGludXggY3Jvc3MgU29sYXJpcyBjb21waWxlciB0bwotYnVpbGQgdGhlIHByb2dyYW0uCi0KLU9mIGNvdXJzZSwgeW91IGNvdWxkIG5vdCBydW4gdGhlIHJlc3VsdGluZyBwcm9ncmFtIG9uIHlvdXIgR05VL0xpbnV4Ci1zeXN0ZW0uICBZb3Ugd291bGQgaGF2ZSB0byBjb3B5IGl0IG92ZXIgdG8gYSBTb2xhcmlzIHN5c3RlbSBiZWZvcmUgeW91Ci13b3VsZCBydW4gaXQuCi0KLU9mIGNvdXJzZSwgeW91IGNvdWxkIGFsc28gc2ltcGx5IGJ1aWxkIHRoZSBwcm9ncmFtcyBvbiB0aGUgU29sYXJpcwotc3lzdGVtIGluIHRoZSBmaXJzdCBwbGFjZS4gIEhvd2V2ZXIsIHBlcmhhcHMgdGhlIFNvbGFyaXMgc3lzdGVtIGlzIG5vdAotYXZhaWxhYmxlIGZvciBzb21lIHJlYXNvbjsgcGVyaGFwcyB5b3UgYWN0dWFsbHkgZG9uJ3QgaGF2ZSBvbmUsIGJ1dCB5b3UKLXdhbnQgdG8gYnVpbGQgdGhlIHRvb2xzIGZvciBzb21lYm9keSBlbHNlIHRvIHVzZS4gIE9yIHBlcmhhcHMgeW91cgotR05VL0xpbnV4IHN5c3RlbSBpcyBtdWNoIGZhc3RlciB0aGFuIHlvdXIgU29sYXJpcyBzeXN0ZW0uCi0KLUEgQ2FuYWRpYW4gQ3Jvc3MgYnVpbGQgaXMgbW9zdCBmcmVxdWVudGx5IHVzZWQgd2hlbiBidWlsZGluZyBwcm9ncmFtcyB0bwotcnVuIG9uIGEgbm9uLVVuaXggc3lzdGVtLCBzdWNoIGFzIERPUyBvciBXaW5kb3dzLiAgSXQgbWF5IGJlIHNpbXBsZXIgdG8KLWNvbmZpZ3VyZSBhbmQgYnVpbGQgb24gYSBVbml4IHN5c3RlbSB0aGFuIHRvIHN1cHBvcnQgdGhlIGNvbmZpZ3VyYXRpb24KLW1hY2hpbmVyeSBvbiBhIG5vbi1Vbml4IHN5c3RlbS4KLQotQG5vZGUgQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHMKLUBzZWN0aW9uIENhbmFkaWFuIENyb3NzIENvbmNlcHRzCi0KLVdoZW4gYnVpbGRpbmcgYSBDYW5hZGlhbiBDcm9zcywgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBkaWZmZXJlbnQgc3lzdGVtcwotaW52b2x2ZWQ6IHRoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIGFyZSBiZWluZyBidWlsdCwgYW5kIHRoZSBzeXN0ZW0KLW9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1bi4KLQotVGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgYXJlIGJlaW5nIGJ1aWx0IGlzIGNhbGxlZCB0aGUgQGRmbntidWlsZH0KLXN5c3RlbS4KLQotVGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4gaXMgY2FsbGVkIHRoZSBob3N0IHN5c3RlbS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBTb2xhcmlzIHByb2dyYW0gb24gYSBHTlUvTGludXgKLXN5c3RlbSwgYXMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRoZSBidWlsZCBzeXN0ZW0gd291bGQgYmUgR05VL0xpbnV4LAotYW5kIHRoZSBob3N0IHN5c3RlbSB3b3VsZCBiZSBTb2xhcmlzLgotCi1JdCBpcywgb2YgY291cnNlLCBwb3NzaWJsZSB0byBidWlsZCBhIGNyb3NzIGNvbXBpbGVyIHVzaW5nIGEgQ2FuYWRpYW4KLUNyb3NzIChpLmUuLCBidWlsZCBhIGNyb3NzIGNvbXBpbGVyIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIpLiAgSW4gdGhpcwotY2FzZSwgdGhlIHN5c3RlbSBmb3Igd2hpY2ggdGhlIHJlc3VsdGluZyBjcm9zcyBjb21waWxlciBnZW5lcmF0ZXMgY29kZQotaXMgY2FsbGVkIHRoZSB0YXJnZXQgc3lzdGVtLiAgKEZvciBhIG1vcmUgY29tcGxldGUgZGlzY3Vzc2lvbiBvZiBob3N0Ci1hbmQgdGFyZ2V0IHN5c3RlbXMsIEBweHJlZntIb3N0IGFuZCBUYXJnZXR9KS4KLQotQW4gZXhhbXBsZSBvZiBidWlsZGluZyBhIGNyb3NzIGNvbXBpbGVyIHVzaW5nIGEgQ2FuYWRpYW4gQ3Jvc3Mgd291bGQgYmUKLWJ1aWxkaW5nIGEgV2luZG93cyBjcm9zcyBNSVBTIEVMRiBjb21waWxlciBvbiBhIEdOVS9MaW51eCBzeXN0ZW0uICBJbgotdGhpcyBjYXNlIHRoZSBidWlsZCBzeXN0ZW0gd291bGQgYmUgR05VL0xpbnV4LCB0aGUgaG9zdCBzeXN0ZW0gd291bGQgYmUKLVdpbmRvd3MsIGFuZCB0aGUgdGFyZ2V0IHN5c3RlbSB3b3VsZCBiZSBNSVBTIEVMRi4KLQotVGhlIG5hbWUgQ2FuYWRpYW4gQ3Jvc3MgY29tZXMgZnJvbSB0aGUgY2FzZSB3aGVuIHRoZSBidWlsZCwgaG9zdCwgYW5kCi10YXJnZXQgc3lzdGVtcyBhcmUgYWxsIGRpZmZlcmVudC4gIEF0IHRoZSB0aW1lIHRoYXQgdGhlc2UgaXNzdWVzIHdlcmUKLWFsbCBiZWluZyBoYXNoZWQgb3V0LCBDYW5hZGEgaGFkIHRocmVlIG5hdGlvbmFsIHBvbGl0aWNhbCBwYXJ0aWVzLgotCi1Abm9kZSBCdWlsZCBDcm9zcyBIb3N0IFRvb2xzCi1Ac2VjdGlvbiBCdWlsZCBDcm9zcyBIb3N0IFRvb2xzCi0KLUluIG9yZGVyIHRvIGNvbmZpZ3VyZSBhIHByb2dyYW0gZm9yIGEgQ2FuYWRpYW4gQ3Jvc3MgYnVpbGQsIHlvdSBtdXN0Ci1maXJzdCBidWlsZCBhbmQgaW5zdGFsbCB0aGUgc2V0IG9mIGNyb3NzIHRvb2xzIHlvdSB3aWxsIHVzZSB0byBidWlsZCB0aGUKLXByb2dyYW0uCi0KLVRoZXNlIHRvb2xzIHdpbGwgYmUgYnVpbGQgY3Jvc3MgaG9zdCB0b29scy4gIFRoYXQgaXMsIHRoZXkgd2lsbCBydW4gb24KLXRoZSBidWlsZCBzeXN0ZW0sIGFuZCB3aWxsIHByb2R1Y2UgY29kZSB0aGF0IHJ1bnMgb24gdGhlIGhvc3Qgc3lzdGVtLgotCi1JdCBpcyBlYXN5IHRvIGNvbmZ1c2UgdGhlIG1lYW5pbmcgb2YgYnVpbGQgYW5kIGhvc3QgaGVyZS4gIEFsd2F5cwotcmVtZW1iZXIgdGhhdCB0aGUgYnVpbGQgc3lzdGVtIGlzIHdoZXJlIHlvdSBhcmUgZG9pbmcgdGhlIGJ1aWxkLCBhbmQgdGhlCi1ob3N0IHN5c3RlbSBpcyB3aGVyZSB0aGUgcmVzdWx0aW5nIHByb2dyYW0gd2lsbCBydW4uICBUaGVyZWZvcmUsIHlvdQotbmVlZCBhIGJ1aWxkIGNyb3NzIGhvc3QgY29tcGlsZXIuCi0KLUluIGdlbmVyYWwsIHlvdSBtdXN0IGhhdmUgYSBjb21wbGV0ZSBjcm9zcyBlbnZpcm9ubWVudCBpbiBvcmRlciB0byBkbwotdGhlIGJ1aWxkLiAgVGhpcyBub3JtYWxseSBtZWFucyBhIGNyb3NzIGNvbXBpbGVyLCBjcm9zcyBhc3NlbWJsZXIsIGFuZAotc28gZm9ydGgsIGFzIHdlbGwgYXMgbGlicmFyaWVzIGFuZCBpbmNsdWRlIGZpbGVzIGZvciB0aGUgaG9zdCBzeXN0ZW0uCi0KLUBub2RlIEJ1aWxkIGFuZCBIb3N0IE9wdGlvbnMKLUBzZWN0aW9uIEJ1aWxkIGFuZCBIb3N0IE9wdGlvbnMKLUBjaW5kZXggY29uZmlndXJpbmcgYSBjYW5hZGlhbiBjcm9zcwotQGNpbmRleCBjYW5hZGlhbiBjcm9zcywgY29uZmlndXJpbmcKLQotV2hlbiB5b3UgcnVuIEBmaWxle2NvbmZpZ3VyZX0sIHlvdSBtdXN0IHVzZSBib3RoIHRoZSBAc2FtcHstLWJ1aWxkfSBhbmQKLUBzYW1wey0taG9zdH0gb3B0aW9ucy4KLQotQGNpbmRleCBAc2FtcHstLWJ1aWxkfSBvcHRpb24KLUBjaW5kZXggYnVpbGQgb3B0aW9uCi1AY2luZGV4IGNvbmZpZ3VyZSBidWlsZCBzeXN0ZW0KLVRoZSBAc2FtcHstLWJ1aWxkfSBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YKLXRoZSBidWlsZCBzeXN0ZW0uICBUaGlzIGNhbiBub3JtYWxseSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlCi1AZmlsZXtjb25maWcuZ3Vlc3N9IHNoZWxsIHNjcmlwdCwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gdXNlCi1Ac2FtcHstLWJ1aWxkPWBjb25maWcuZ3Vlc3NgfS4KLQotQGNpbmRleCBAc2FtcHstLWhvc3R9IG9wdGlvbgotQGNpbmRleCBob3N0IG9wdGlvbgotQGNpbmRleCBjb25maWd1cmUgaG9zdAotVGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mCi10aGUgaG9zdCBzeXN0ZW0uCi0KLUFzIHdlIGV4cGxhaW5lZCBlYXJsaWVyLCBAZmlsZXtjb25maWcuZ3Vlc3N9IGlzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0Ci12YWx1ZSBmb3IgdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIChAcHhyZWZ7VXNpbmcgdGhlIEhvc3QgVHlwZX0pLiAgV2UKLWNhbiBub3cgc2VlIHRoYXQgc2luY2UgQGZpbGV7Y29uZmlnLmd1ZXNzfSByZXR1cm5zIHRoZSB0eXBlIG9mIHN5c3RlbSBvbgotd2hpY2ggaXQgaXMgcnVuLCBpdCByZWFsbHkgaWRlbnRpZmllcyB0aGUgYnVpbGQgc3lzdGVtLiAgU2luY2UgdGhlIGhvc3QKLXN5c3RlbSBpcyBub3JtYWxseSB0aGUgc2FtZSBhcyB0aGUgYnVpbGQgc3lzdGVtIChpLmUuLCBwZW9wbGUgZG8gbm90Ci1ub3JtYWxseSBidWlsZCB1c2luZyBhIGNyb3NzIGNvbXBpbGVyKSwgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UgdGhlCi1yZXN1bHQgb2YgQGZpbGV7Y29uZmlnLmd1ZXNzfSBhcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGhvc3Qgc3lzdGVtIHdoZW4KLXRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiBpcyBub3QgdXNlZC4KLQotSXQgbWlnaHQgc2VlbSB0aGF0IGlmIHRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiB3ZXJlIHVzZWQgd2l0aG91dCB0aGUKLUBzYW1wey0tYnVpbGR9IG9wdGlvbiB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNvdWxkIHJ1bgotQGZpbGV7Y29uZmlnLmd1ZXNzfSB0byBkZXRlcm1pbmUgdGhlIGJ1aWxkIHN5c3RlbSwgYW5kIHByZXN1bWUgYQotQ2FuYWRpYW4gQ3Jvc3MgaWYgdGhlIHJlc3VsdCBvZiBAZmlsZXtjb25maWcuZ3Vlc3N9IGRpZmZlcmVkIGZyb20gdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbi4gIEhvd2V2ZXIsIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHNvbWUgY29uZmlndXJlCi1zY3JpcHRzIGFyZSByb3V0aW5lbHkgcnVuIHVzaW5nIGFuIGV4cGxpY2l0IEBzYW1wey0taG9zdH0gb3B0aW9uLCByYXRoZXIKLXRoYW4gdXNpbmcgdGhlIGRlZmF1bHQgZnJvbSBAZmlsZXtjb25maWcuZ3Vlc3N9LiAgQXMgbm90ZWQgZWFybGllciwgaXQKLWlzIGRpZmZpY3VsdCBvciBpbXBvc3NpYmxlIHRvIHJlbGlhYmx5IGNvbXBhcmUgY29uZmlndXJhdGlvbiBuYW1lcwotKEBweHJlZntVc2luZyB0aGUgVGFyZ2V0IFR5cGV9KS4gIFRoZXJlZm9yZSwgYnkgY29udmVudGlvbiwgaWYgdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiBpcyB1c2VkLCBidXQgdGhlIEBzYW1wey0tYnVpbGR9IG9wdGlvbiBpcyBub3QgdXNlZCwKLXRoZW4gdGhlIGJ1aWxkIHN5c3RlbSBkZWZhdWx0cyB0byB0aGUgaG9zdCBzeXN0ZW0uCi0KLUBub2RlIENDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWUKLUBzZWN0aW9uIENhbmFkaWFuIENyb3NzIG5vdCBpbiBDeWdudXMgVHJlZS4KLQotSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCB5b3UgbXVzdCBleHBsaWNpdGx5IHNwZWNpZnkgdGhlCi1jcm9zcyB0b29scyB3aGljaCB5b3Ugd2FudCB0byB1c2UgdG8gYnVpbGQgdGhlIHByb2dyYW0uICBUaGlzIGlzIGRvbmUgYnkKLXNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBydW5uaW5nIHRoZSBAZmlsZXtjb25maWd1cmV9Ci1zY3JpcHQuCi0KLVlvdSBtdXN0IG5vcm1hbGx5IHNldCBhdCBsZWFzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIEBzYW1we0NDfSwKLUBzYW1we0FSfSwgYW5kIEBzYW1we1JBTkxJQn0gdG8gdGhlIGNyb3NzIHRvb2xzIHdoaWNoIHlvdSB3YW50IHRvIHVzZSB0bwotYnVpbGQuCi0KLUZvciBzb21lIHByb2dyYW1zLCB5b3UgbXVzdCBzZXQgYWRkaXRpb25hbCBjcm9zcyB0b29scyBhcyB3ZWxsLCBzdWNoIGFzCi1Ac2FtcHtBU30sIEBzYW1we0xEfSwgb3IgQHNhbXB7Tk19LgotCi1Zb3Ugd291bGQgc2V0IHRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byB0aGUgYnVpbGQgY3Jvc3MgdG9vbHMgd2hpY2gKLXlvdSBhcmUgZ29pbmcgdG8gdXNlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBidWlsZGluZyBhIFNvbGFyaXMgcHJvZ3JhbSBvbiBhIEdOVS9MaW51eAotc3lzdGVtLCBhbmQgeW91ciBHTlUvTGludXggY3Jvc3MgU29sYXJpcyBjb21waWxlciB3ZXJlIG5hbWVkCi1Ac2FtcHtzb2xhcmlzLWdjY30sIHRoZW4geW91IHdvdWxkIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBzYW1we0NDfSB0byBAc2FtcHtzb2xhcmlzLWdjY30uCi0KLUBub2RlIENDcm9zcyBpbiBDeWdudXMgVHJlZQotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3MgaW4gQ3lnbnVzIFRyZWUKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MgaW4gY3lnbnVzIHRyZWUKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgYSBDYW5hZGlhbiBDcm9zcyB3aGVuCi11c2luZyB0aGUgQ3lnbnVzIHRyZWUuCi0KLUBtZW51Ci0qIFN0YW5kYXJkIEN5Z251cyBDQ3Jvc3M6OglCdWlsZGluZyBhIE5vcm1hbCBQcm9ncmFtLgotKiBDcm9zcyBDeWdudXMgQ0Nyb3NzOjoJCUJ1aWxkaW5nIGEgQ3Jvc3MgUHJvZ3JhbS4KLUBlbmQgbWVudQotCi1Abm9kZSBTdGFuZGFyZCBDeWdudXMgQ0Nyb3NzCi1Ac3Vic2VjdGlvbiBCdWlsZGluZyBhIE5vcm1hbCBQcm9ncmFtCi0KLVdoZW4gY29uZmlndXJpbmcgYSBDYW5hZGlhbiBDcm9zcyBpbiB0aGUgQ3lnbnVzIHRyZWUsIGFsbCB0aGUKLWFwcHJvcHJpYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBzZXQgdG8KLUBzYW1we0B2YXJ7aG9zdH0tQHZhcnt0b29sfX0sIHdoZXJlIEB2YXJ7aG9zdH0gaXMgdGhlIHZhbHVlIHVzZWQgZm9yIHRoZQotQHNhbXB7LS1ob3N0fSBvcHRpb24sIGFuZCBAdmFye3Rvb2x9IGlzIHRoZSBuYW1lIG9mIHRoZSB0b29sIChlLmcuLAotQHNhbXB7Z2NjfSwgQHNhbXB7YXN9LCBldGMuKS4gIFRoZXNlIHRvb2xzIG11c3QgYmUgb24geW91ciBAc2FtcHtQQVRIfS4KLQotQWRkaW5nIGEgcHJlZml4IG9mIEB2YXJ7aG9zdH0gd2lsbCBnaXZlIHRoZSB1c3VhbCBuYW1lIGZvciB0aGUgYnVpbGQKLWNyb3NzIGhvc3QgdG9vbHMuICBUbyBzZWUgdGhpcywgY29uc2lkZXIgdGhhdCB3aGVuIHRoZXNlIGNyb3NzIHRvb2xzCi13ZXJlIGJ1aWx0LCB0aGV5IHdlcmUgY29uZmlndXJlZCB0byBydW4gb24gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgdG8KLXByb2R1Y2UgY29kZSBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAgVGhhdCBpcywgdGhleSB3ZXJlIGNvbmZpZ3VyZWQgd2l0aCBhCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9uIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhlIHN5c3RlbSB3aGljaCB3ZSBhcmUgbm93Ci1jYWxsaW5nIHRoZSBob3N0LiAgUmVjYWxsIHRoYXQgdGhlIGRlZmF1bHQgbmFtZSBmb3IgaW5zdGFsbGVkIGNyb3NzCi10b29scyB1c2VzIHRoZSB0YXJnZXQgc3lzdGVtIGFzIGEgcHJlZml4IChAcHhyZWZ7VXNpbmcgdGhlIFRhcmdldAotVHlwZX0pLiAgU2luY2UgdGhhdCBpcyB0aGUgc3lzdGVtIHdoaWNoIHdlIGFyZSBub3cgY2FsbGluZyB0aGUgaG9zdCwKLUB2YXJ7aG9zdH0gaXMgdGhlIHJpZ2h0IHByZWZpeCB0byB1c2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgY29uZmlndXJlIHdpdGggQHNhbXB7LS1idWlsZD1pMzg2LWxpbnV4LWdudX0gYW5kCi1Ac2FtcHstLWhvc3Q9c29sYXJpc30sIHRoZW4gdGhlIEN5Z251cyB0cmVlIHdpbGwgYXV0b21hdGljYWxseSBkZWZhdWx0Ci10byB1c2luZyB0aGUgY29tcGlsZXIgQHNhbXB7c29sYXJpcy1nY2N9LiAgWW91IG11c3QgaGF2ZSBwcmV2aW91c2x5Ci1idWlsdCBhbmQgaW5zdGFsbGVkIHRoaXMgY29tcGlsZXIsIHByb2JhYmx5IGJ5IGRvaW5nIGEgYnVpbGQgd2l0aCBubwotQHNhbXB7LS1ob3N0fSBvcHRpb24gYW5kIHdpdGggYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIG9mCi1Ac2FtcHtzb2xhcmlzfS4KLQotQG5vZGUgQ3Jvc3MgQ3lnbnVzIENDcm9zcwotQHN1YnNlY3Rpb24gQnVpbGRpbmcgYSBDcm9zcyBQcm9ncmFtCi0KLVRoZXJlIGFyZSBhZGRpdGlvbmFsIGNvbnNpZGVyYXRpb25zIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgY3Jvc3MKLWNvbXBpbGVyLCByYXRoZXIgdGhhbiBhIG5hdGl2ZSBjb21waWxlciwgaW4gdGhlIEN5Z251cyB0cmVlIHVzaW5nIGEKLUNhbmFkaWFuIENyb3NzLgotCi1XaGVuIHlvdSBidWlsZCBhIGNyb3NzIGNvbXBpbGVyIHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgdGhlbiB0aGUgdGFyZ2V0Ci1saWJyYXJpZXMgd2lsbCBub3JtYWxseSBiZSBidWlsdCB3aXRoIHRoZSBuZXdseSBidWlsdCB0YXJnZXQgY29tcGlsZXIKLShAcHhyZWZ7SG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllc30pLiAgSG93ZXZlciwgdGhpcyB3aWxsIG5vdCB3b3JrIHdoZW4KLWJ1aWxkaW5nIHdpdGggYSBDYW5hZGlhbiBDcm9zcy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgbmV3bHkgYnVpbHQgdGFyZ2V0Ci1jb21waWxlciB3aWxsIGJlIGEgcHJvZ3JhbSB3aGljaCBydW5zIG9uIHRoZSBob3N0IHN5c3RlbSwgYW5kIHRoZXJlZm9yZQotd2lsbCBub3QgYmUgYWJsZSB0byBydW4gb24gdGhlIGJ1aWxkIHN5c3RlbS4KLQotVGhlcmVmb3JlLCB3aGVuIGJ1aWxkaW5nIGEgY3Jvc3MgY29tcGlsZXIgd2l0aCB0aGUgQ3lnbnVzIHRyZWUsIHlvdSBtdXN0Ci1maXJzdCBpbnN0YWxsIGEgc2V0IG9mIGJ1aWxkIGNyb3NzIHRhcmdldCB0b29scy4gIFRoZXNlIHRvb2xzIHdpbGwgYmUKLXVzZWQgd2hlbiBidWlsZGluZyB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KLQotTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgcmVxdWlyZW1lbnQgb2YgYSBDYW5hZGlhbiBDcm9zcyBpbiBnZW5lcmFsLiAgRm9yCi1leGFtcGxlLCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBidWlsZCBqdXN0IHRoZSBob3N0IGNyb3NzIHRhcmdldCB0b29scwotb24gdGhlIGJ1aWxkIHN5c3RlbSwgdG8gY29weSB0aGUgdG9vbHMgdG8gdGhlIGhvc3Qgc3lzdGVtLCBhbmQgdG8gYnVpbGQKLXRoZSB0YXJnZXQgbGlicmFyaWVzIG9uIHRoZSBob3N0IHN5c3RlbS4gIFRoZSByZXF1aXJlbWVudCBmb3IgYnVpbGQKLWNyb3NzIHRhcmdldCB0b29scyBpcyBpbXBvc2VkIGJ5IHRoZSBDeWdudXMgdHJlZSwgd2hpY2ggZXhwZWN0cyB0byBiZQotYWJsZSB0byBidWlsZCBib3RoIGhvc3QgcHJvZ3JhbXMgYW5kIHRhcmdldCBsaWJyYXJpZXMgaW4gYSBzaW5nbGUKLUBzYW1we2NvbmZpZ3VyZX0vQHNhbXB7bWFrZX0gc3RlcC4gIEJlY2F1c2UgaXQgYnVpbGRzIHRoZXNlIGluIGEgc2luZ2xlCi1zdGVwLCBpdCBleHBlY3RzIHRvIGJlIGFibGUgdG8gYnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMgb24gdGhlIGJ1aWxkCi1zeXN0ZW0sIHdoaWNoIG1lYW5zIHRoYXQgaXQgbXVzdCB1c2UgYSBidWlsZCBjcm9zcyB0YXJnZXQgdG9vbGNoYWluLgotCi1Gb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2FudCB0byBidWlsZCBhIFdpbmRvd3MgY3Jvc3MgTUlQUyBFTEYgY29tcGlsZXIKLW9uIGEgR05VL0xpbnV4IHN5c3RlbS4gIFlvdSBtdXN0IGhhdmUgcHJldmlvdXNseSBpbnN0YWxsZWQgYm90aCBhCi1HTlUvTGludXggY3Jvc3MgV2luZG93cyBjb21waWxlciBhbmQgYSBHTlUvTGludXggY3Jvc3MgTUlQUyBFTEYKLWNvbXBpbGVyLgotCi1JbiBvcmRlciB0byBidWlsZCB0aGUgV2luZG93cyAoY29uZmlndXJhdGlvbiBuYW1lIEBzYW1we2kzODYtY3lnd2luMzJ9KQotY3Jvc3MgTUlQUyBFTEYgKGNvbmZpZ3VyZSBuYW1lIEBzYW1we21pcHMtZWxmfSkgY29tcGlsZXIsIHlvdSBtaWdodAotZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIChsb25nIGNvbW1hbmQgbGluZXMgYXJlIGJyb2tlbiBhY3Jvc3MKLWxpbmVzIHdpdGggYSB0cmFpbGluZyBiYWNrc2xhc2ggYXMgYSBjb250aW51YXRpb24gY2hhcmFjdGVyKS4KLQotQGV4YW1wbGUKLW1rZGlyIGxpbnV4LXgtY3lnd2luMzIKLWNkIGxpbnV4LXgtY3lnd2luMzIKLUB2YXJ7c3JjZGlyfS9jb25maWd1cmUgLS10YXJnZXQgaTM4Ni1jeWd3aW4zMiAtLXByZWZpeD1AdmFye2luc3RhbGxkaXJ9IFwKLSAgLS1leGVjLXByZWZpeD1AdmFye2luc3RhbGxkaXJ9L0gtaTM4Ni1saW51eAotbWFrZQotbWFrZSBpbnN0YWxsCi1jZCAuLgotbWtkaXIgbGludXgteC1taXBzLWVsZgotY2QgbGludXgteC1taXBzLWVsZgotQHZhcntzcmNkaXJ9L2NvbmZpZ3VyZSAtLXRhcmdldCBtaXBzLWVsZiAtLXByZWZpeD1AdmFye2luc3RhbGxkaXJ9IFwKLSAgLS1leGVjLXByZWZpeD1AdmFye2luc3RhbGxkaXJ9L0gtaTM4Ni1saW51eAotbWFrZQotbWFrZSBpbnN0YWxsCi1jZCAuLgotbWtkaXIgY3lnd2luMzIteC1taXBzLWVsZgotY2QgY3lnd2luMzIteC1taXBzLWVsZgotQHZhcntzcmNkaXJ9L2NvbmZpZ3VyZSAtLWJ1aWxkPWkzODYtbGludXgtZ251IC0taG9zdD1pMzg2LWN5Z3dpbjMyIFwKLSAgLS10YXJnZXQ9bWlwcy1lbGYgLS1wcmVmaXg9QHZhcnt3aW5pbnN0YWxsZGlyfSBcCi0gIC0tZXhlYy1wcmVmaXg9QHZhcnt3aW5pbnN0YWxsZGlyfS9ILWkzODYtY3lnd2luMzIKLW1ha2UKLW1ha2UgaW5zdGFsbAotQGVuZCBleGFtcGxlCi0KLVlvdSB3b3VsZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mIEB2YXJ7d2luaW5zdGFsbGRpcn0gb3ZlciB0byB0aGUKLVdpbmRvd3MgbWFjaGluZSwgYW5kIHJ1biB0aGUgcmVzdWx0aW5nIHByb2dyYW1zLgotCi1Abm9kZSBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzCi1Ac2VjdGlvbiBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzCi0KLUlmIHlvdSB3YW50IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gYnVpbGQgYSBwcm9ncmFtIHlvdSBhcmUgZGV2ZWxvcGluZwotdXNpbmcgYSBDYW5hZGlhbiBDcm9zcywgeW91IG11c3QgdGFrZSBzb21lIGNhcmUgd2hlbiB3cml0aW5nIHlvdXIKLWNvbmZpZ3VyZSBhbmQgbWFrZSBydWxlcy4gIFNpbXBsZSBjYXNlcyB3aWxsIG5vcm1hbGx5IHdvcmsgY29ycmVjdGx5LgotSG93ZXZlciwgaXQgaXMgbm90IGhhcmQgdG8gd3JpdGUgY29uZmlndXJlIGFuZCBtYWtlIHRlc3RzIHdoaWNoIHdpbGwKLWZhaWwgaW4gYSBDYW5hZGlhbiBDcm9zcy4KLQotQG1lbnUKLSogQ0Nyb3NzIGluIENvbmZpZ3VyZTo6CQlTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzIGluIENvbmZpZ3VyZSBTY3JpcHRzLgotKiBDQ3Jvc3MgaW4gTWFrZTo6CQlTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzIGluIE1ha2VmaWxlcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDQ3Jvc3MgaW4gQ29uZmlndXJlCi1Ac3Vic2VjdGlvbiBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzIGluIENvbmZpZ3VyZSBTY3JpcHRzCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzIGluIGNvbmZpZ3VyZQotCi1JbiBhIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgYWZ0ZXIgY2FsbGluZyBAc2FtcHtBQ19QUk9HX0NDfSwgeW91IGNhbgotZmluZCBvdXQgd2hldGhlciB0aGlzIGlzIGEgQ2FuYWRpYW4gQ3Jvc3MgY29uZmlndXJlIGJ5IGV4YW1pbmluZyB0aGUKLXNoZWxsIHZhcmlhYmxlIEBzYW1we2Nyb3NzX2NvbXBpbGluZ30uICBJbiBhIENhbmFkaWFuIENyb3NzLCB3aGljaCBtZWFucwotdGhhdCB0aGUgY29tcGlsZXIgaXMgYSBjcm9zcyBjb21waWxlciwgQHNhbXB7Y3Jvc3NfY29tcGlsaW5nfSB3aWxsIGJlCi1Ac2FtcHt5ZXN9LiAgSW4gYSBub3JtYWwgY29uZmlndXJhdGlvbiwgQHNhbXB7Y3Jvc3NfY29tcGlsaW5nfSB3aWxsIGJlCi1Ac2FtcHtub30uCi0KLVlvdSBvcmRpbmFyaWx5IGRvIG5vdCBuZWVkIHRvIGtub3cgdGhlIHR5cGUgb2YgdGhlIGJ1aWxkIHN5c3RlbSBpbiBhCi1jb25maWd1cmUgc2NyaXB0LiAgSG93ZXZlciwgaWYgeW91IGRvIG5lZWQgdGhhdCBpbmZvcm1hdGlvbiwgeW91IGNhbiBnZXQKLWl0IGJ5IHVzaW5nIHRoZSBtYWNybyBAc2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfSwgdGhlIHNhbWUgbWFjcm8gdGhhdCBpcwotdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBzeXN0ZW0uICBUaGlzIG1hY3JvIHdpbGwgc2V0IHRoZSB2YXJpYWJsZXMKLUBzYW1we2J1aWxkfSwgQHNhbXB7YnVpbGRfYWxpYXN9LCBAc2FtcHtidWlsZF9jcHV9LCBAc2FtcHtidWlsZF92ZW5kb3J9LAotYW5kIEBzYW1we2J1aWxkX29zfSwgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgc2ltaWxhciBAc2FtcHt0YXJnZXR9IGFuZAotQHNhbXB7aG9zdH0gdmFyaWFibGVzLCBleGNlcHQgdGhhdCB0aGV5IGRlc2NyaWJlIHRoZSBidWlsZCBzeXN0ZW0uCi0KLVdoZW4gd3JpdGluZyB0ZXN0cyBpbiBAZmlsZXtjb25maWd1cmUuaW59LCB5b3UgbXVzdCByZW1lbWJlciB0aGF0IHlvdQotd2FudCB0byB0ZXN0IHRoZSBob3N0IGVudmlyb25tZW50LCBub3QgdGhlIGJ1aWxkIGVudmlyb25tZW50LgotCi1NYWNyb3MgbGlrZSBAc2FtcHtBQ19DSEVDS19GVU5DU30gd2hpY2ggdXNlIHRoZSBjb21waWxlciB3aWxsIHRlc3QgdGhlCi1ob3N0IGVudmlyb25tZW50LiAgVGhhdCBpcyBiZWNhdXNlIHRoZSB0ZXN0cyB3aWxsIGJlIGRvbmUgYnkgcnVubmluZyB0aGUKLWNvbXBpbGVyLCB3aGljaCBpcyBhY3R1YWxseSBhIGJ1aWxkIGNyb3NzIGhvc3QgY29tcGlsZXIuICBJZiB0aGUKLWNvbXBpbGVyIGNhbiBmaW5kIHRoZSBmdW5jdGlvbiwgdGhhdCBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBwcmVzZW50Ci1pbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4KLQotVGVzdHMgbGlrZSBAc2FtcHt0ZXN0IC1mIC9kZXYvcHR5cDB9LCBvbiB0aGUgb3RoZXIgaGFuZCwgd2lsbCB0ZXN0IHRoZQotYnVpbGQgZW52aXJvbm1lbnQuICBSZW1lbWJlciB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1bm5pbmcgb24gdGhlCi1idWlsZCBzeXN0ZW0sIG5vdCB0aGUgaG9zdCBzeXN0ZW0uICBJZiB5b3VyIGNvbmZpZ3VyZSBzY3JpcHRzIGV4YW1pbmVzCi1maWxlcywgdGhvc2UgZmlsZXMgd2lsbCBiZSBvbiB0aGUgYnVpbGQgc3lzdGVtLiAgV2hhdGV2ZXIgeW91IGRldGVybWluZQotYmFzZWQgb24gdGhvc2UgZmlsZXMgbWF5IG9yIG1heSBub3QgYmUgdGhlIGNhc2Ugb24gdGhlIGhvc3Qgc3lzdGVtLgotCi1Nb3N0IGF1dG9jb25mIG1hY3JvcyB3aWxsIHdvcmsgY29ycmVjdGx5IGZvciBhIENhbmFkaWFuIENyb3NzLiAgVGhlIG1haW4KLWV4Y2VwdGlvbiBpcyBAc2FtcHtBQ19UUllfUlVOfS4gIFRoaXMgbWFjcm8gdHJpZXMgdG8gY29tcGlsZSBhbmQgcnVuIGEKLXRlc3QgcHJvZ3JhbS4gIFRoaXMgd2lsbCBmYWlsIGluIGEgQ2FuYWRpYW4gQ3Jvc3MsIGJlY2F1c2UgdGhlIHByb2dyYW0KLXdpbGwgYmUgY29tcGlsZWQgZm9yIHRoZSBob3N0IHN5c3RlbSwgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsIG5vdCBydW4KLW9uIHRoZSBidWlsZCBzeXN0ZW0uCi0KLVRoZSBAc2FtcHtBQ19UUllfUlVOfSBtYWNybyBwcm92aWRlcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0byB0ZWxsIHRoZQotY29uZmlndXJlIHNjcmlwdCB3aGF0IHRvIGRvIGluIGEgQ2FuYWRpYW4gQ3Jvc3MuICBJZiB0aGF0IGFyZ3VtZW50IGlzCi1ub3QgcHJlc2VudCwgeW91IHdpbGwgZ2V0IGEgd2FybmluZyB3aGVuIHlvdSBydW4gQHNhbXB7YXV0b2NvbmZ9OgotQHNtYWxsZXhhbXBsZQotd2FybmluZzogQUNfVFJZX1JVTiBjYWxsZWQgd2l0aG91dCBkZWZhdWx0IHRvIGFsbG93IGNyb3NzIGNvbXBpbGluZwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB0ZWxscyB5b3UgdGhhdCB0aGUgcmVzdWx0aW5nIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwgbm90IHdvcmsKLXdpdGggYSBDYW5hZGlhbiBDcm9zcy4KLQotSW4gc29tZSBjYXNlcyB3aGlsZSBpdCBtYXkgYmV0dGVyIHRvIHBlcmZvcm0gYSB0ZXN0IGF0IGNvbmZpZ3VyZSB0aW1lLAotaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSB0ZXN0IGF0IHJ1biB0aW1lLiAgSW4gc3VjaCBhIGNhc2UgeW91Ci1jYW4gdXNlIHRoZSBjcm9zcyBjb21waWxpbmcgYXJndW1lbnQgdG8gQHNhbXB7QUNfVFJZX1JVTn0gdG8gdGVsbCB5b3VyCi1wcm9ncmFtIHRoYXQgdGhlIHRlc3QgY291bGQgbm90IGJlIHBlcmZvcm1lZCBhdCBjb25maWd1cmUgdGltZS4KLQotVGhlcmUgYXJlIGEgZmV3IG90aGVyIGF1dG9jb25mIG1hY3JvcyB3aGljaCB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoCi1hIENhbmFkaWFuIENyb3NzOiBhIHBhcnRpYWwgbGlzdCBpcyBAc2FtcHtBQ19GVU5DX0dFVFBHUlB9LAotQHNhbXB7QUNfRlVOQ19TRVRQR1JQfSwgQHNhbXB7QUNfRlVOQ19TRVRWQlVGX1JFVkVSU0VEfSwgYW5kCi1Ac2FtcHtBQ19TWVNfUkVTVEFSVEFCTEVfU1lTQ0FMTFN9LiAgVGhlIEBzYW1we0FDX0NIRUNLX1NJWkVPRn0gbWFjcm8gaXMKLWdlbmVyYWxseSBub3QgdmVyeSB1c2VmdWwgd2l0aCBhIENhbmFkaWFuIENyb3NzOyBpdCBwZXJtaXRzIGFuIG9wdGlvbmFsCi1hcmd1bWVudCBpbmRpY2F0aW5nIHRoZSBkZWZhdWx0IHNpemUsIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGF0Ci10aGUgY29ycmVjdCBkZWZhdWx0IHNob3VsZCBiZS4KLQotQG5vZGUgQ0Nyb3NzIGluIE1ha2UKLUBzdWJzZWN0aW9uIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gTWFrZWZpbGVzLgotQGNpbmRleCBjYW5hZGlhbiBjcm9zcyBpbiBtYWtlZmlsZQotCi1UaGUgbWFpbiBDYW5hZGlhbiBDcm9zcyBpc3N1ZSBpbiBhIEBmaWxle01ha2VmaWxlfSBhcmlzZXMgd2hlbiB5b3Ugd2FudAotdG8gdXNlIGEgc3Vic2lkaWFyeSBwcm9ncmFtIHRvIGdlbmVyYXRlIGNvZGUgb3IgZGF0YSB3aGljaCB5b3Ugd2lsbCB0aGVuCi1pbmNsdWRlIGluIHlvdXIgcmVhbCBwcm9ncmFtLgotCi1JZiB5b3UgY29tcGlsZSB0aGlzIHN1YnNpZGlhcnkgcHJvZ3JhbSB1c2luZyBAc2FtcHskKENDKX0gaW4gdGhlIHVzdWFsCi13YXksIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJ1biBpdC4gIFRoaXMgaXMgYmVjYXVzZSBAc2FtcHskKENDKX0gd2lsbAotYnVpbGQgYSBwcm9ncmFtIGZvciB0aGUgaG9zdCBzeXN0ZW0sIGJ1dCB0aGUgcHJvZ3JhbSBpcyBiZWluZyBidWlsdCBvbgotdGhlIGJ1aWxkIHN5c3RlbS4KLQotWW91IG11c3QgaW5zdGVhZCB1c2UgYSBjb21waWxlciBmb3IgdGhlIGJ1aWxkIHN5c3RlbSwgcmF0aGVyIHRoYW4gdGhlCi1ob3N0IHN5c3RlbS4gIEluIHRoZSBDeWdudXMgdHJlZSwgdGhpcyBtYWtlIHZhcmlhYmxlCi1Ac2FtcHskKENDX0ZPUl9CVUlMRCl9IHdpbGwgaG9sZCBhIGNvbXBpbGVyIGZvciB0aGUgYnVpbGQgc3lzdGVtLgotCi1Ob3RlIHRoYXQgeW91IHNob3VsZCBub3QgaW5jbHVkZSBAZmlsZXtjb25maWcuaH0gaW4gYSBmaWxlIHlvdSBhcmUKLWNvbXBpbGluZyB3aXRoIEBzYW1weyQoQ0NfRk9SX0JVSUxEKX0uICBUaGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2lsbAotYnVpbGQgQGZpbGV7Y29uZmlnLmh9IHdpdGggaW5mb3JtYXRpb24gZm9yIHRoZSBob3N0IHN5c3RlbS4gIEhvd2V2ZXIsCi15b3UgYXJlIGNvbXBpbGluZyB0aGUgZmlsZSB1c2luZyBhIGNvbXBpbGVyIGZvciB0aGUgYnVpbGQgc3lzdGVtIChhCi1uYXRpdmUgY29tcGlsZXIpLiAgU3Vic2lkaWFyeSBwcm9ncmFtcyBhcmUgbm9ybWFsbHkgc2ltcGxlIGZpbHRlcnMgd2hpY2gKLWRvIG5vIHVzZXIgaW50ZXJhY3Rpb24sIGFuZCBpdCBpcyBub3JtYWxseSBwb3NzaWJsZSB0byB3cml0ZSB0aGVtIGluIGEKLWhpZ2hseSBwb3J0YWJsZSBmYXNoaW9uIHNvIHRoYXQgdGhlIGFic2VuY2Ugb2YgQGZpbGV7Y29uZmlnLmh9IGlzIG5vdAotY3J1Y2lhbC4KLQotQGNpbmRleCBAc2FtcHtIT1NUX0NDfQotVGhlIGdjYyBAZmlsZXtNYWtlZmlsZS5pbn0gc2hvd3MgYSBjb21wbGV4IHNpdHVhdGlvbiBpbiB3aGljaCBjZXJ0YWluCi1maWxlcywgc3VjaCBhcyBAZmlsZXtydGwuY30sIG11c3QgYmUgY29tcGlsZWQgaW50byBib3RoIHN1YnNpZGlhcnkKLXByb2dyYW1zIHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtIGFuZCBpbnRvIHRoZSBmaW5hbCBwcm9ncmFtLiAgVGhpcwotYXBwcm9hY2ggbWF5IGJlIG9mIGludGVyZXN0IGZvciBhZHZhbmNlZCBidWlsZCBzeXN0ZW0gaGFja2Vycy4gIE5vdGUKLXRoYXQgdGhlIGJ1aWxkIHN5c3RlbSBjb21waWxlciBpcyByYXRoZXIgY29uZnVzaW5nbHkgY2FsbGVkCi1Ac2FtcHtIT1NUX0NDfS4KLQotQG5vZGUgQ3lnbnVzIENvbmZpZ3VyZQotQGNoYXB0ZXIgQ3lnbnVzIENvbmZpZ3VyZQotQGNpbmRleCBjeWdudXMgY29uZmlndXJlCi0KLVRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCBwcmVkYXRlcyBhdXRvY29uZi4gIEFsbCBvZiBpdHMgaW50ZXJlc3RpbmcKLWZlYXR1cmVzIGhhdmUgYmVlbiBpbmNvcnBvcmF0ZWQgaW50byBhdXRvY29uZi4gIE5vIG5ldyBwcm9ncmFtcyBzaG91bGQKLWJlIHdyaXR0ZW4gdG8gdXNlIHRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdC4KLQotSG93ZXZlciwgdGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0IGlzIHN0aWxsIHVzZWQgaW4gYSBmZXcgcGxhY2VzOiBhdAotdGhlIHRvcCBvZiB0aGUgQ3lnbnVzIHRyZWUgYW5kIGluIGEgZmV3IHRhcmdldCBsaWJyYXJpZXMgaW4gdGhlIEN5Z251cwotdHJlZS4gIFVudGlsIHRob3NlIHVzZXMgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggYXV0b2NvbmYsIHNvbWUgYnJpZWYKLW5vdGVzIGFyZSBhcHByb3ByaWF0ZSBoZXJlLiAgVGhpcyBpcyBub3QgY29tcGxldGUgZG9jdW1lbnRhdGlvbiwgYnV0IGl0Ci1zaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIHRoaXMgYXMgYSBndWlkZSB3aGlsZSBleGFtaW5pbmcgdGhlIHNjcmlwdHMKLXRoZW1zZWx2ZXMuCi0KLUBtZW51Ci0qIEN5Z251cyBDb25maWd1cmUgQmFzaWNzOjoJCUN5Z251cyBDb25maWd1cmUgQmFzaWNzLgotKiBDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXM6OglDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3MKLUBzZWN0aW9uIEN5Z251cyBDb25maWd1cmUgQmFzaWNzCi0KLUN5Z251cyBjb25maWd1cmUgZG9lcyBub3QgdXNlIGFueSBnZW5lcmF0ZWQgZmlsZXM7IHRoZXJlIGlzIG5vIHByb2dyYW0KLWNvcnJlc3BvbmRpbmcgdG8gQHNhbXB7YXV0b2NvbmZ9LiAgSW5zdGVhZCwgdGhlcmUgaXMgYSBzaW5nbGUgc2hlbGwKLXNjcmlwdCBuYW1lZCBAc2FtcHtjb25maWd1cmV9IHdoaWNoIG1heSBiZSBmb3VuZCBhdCB0aGUgdG9wIG9mIHRoZQotQ3lnbnVzIHRyZWUuICBUaGlzIHNoZWxsIHNjcmlwdCB3YXMgd3JpdHRlbiBieSBoYW5kOyBpdCB3YXMgbm90Ci1nZW5lcmF0ZWQgYnkgYXV0b2NvbmYsIGFuZCBpdCBpcyBpbmNvcnJlY3QsIGFuZCBpbmRlZWQgaGFybWZ1bCwgdG8gcnVuCi1Ac2FtcHthdXRvY29uZn0gaW4gdGhlIHRvcCBsZXZlbCBvZiBhIEN5Z251cyB0cmVlLgotCi1DeWdudXMgY29uZmlndXJlIHdvcmtzIGluIGEgcGFydGljdWxhciBkaXJlY3RvcnkgYnkgZXhhbWluaW5nIHRoZSBmaWxlCi1AZmlsZXtjb25maWd1cmUuaW59IGluIHRoYXQgZGlyZWN0b3J5LiAgVGhhdCBmaWxlIGlzIGJyb2tlbiBpbnRvIGZvdXIKLXNlcGFyYXRlIHNoZWxsIHNjcmlwdHMuCi0KLVRoZSBmaXJzdCBpcyB0aGUgY29udGVudHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSB1cCB0byBhIGxpbmUgdGhhdAotc3RhcnRzIHdpdGggQHNhbXB7IyBwZXItaG9zdDp9LiAgVGhpcyBpcyB0aGUgY29tbW9uIHBhcnQuCi0KLVRoZSBzZWNvbmQgaXMgdGhlIHJlc3Qgb2YgQGZpbGV7Y29uZmlndXJlLmlufSB1cCB0byBhIGxpbmUgdGhhdCBzdGFydHMKLXdpdGggQHNhbXB7IyBwZXItdGFyZ2V0On0uICBUaGlzIGlzIHRoZSBwZXIgaG9zdCBwYXJ0LgotCi1UaGUgdGhpcmQgaXMgdGhlIHJlc3Qgb2YgQGZpbGV7Y29uZmlndXJlLmlufSB1cCB0byBhIGxpbmUgdGhhdCBzdGFydHMKLXdpdGggQHNhbXB7IyBwb3N0LXRhcmdldDp9LiAgVGhpcyBpcyB0aGUgcGVyIHRhcmdldCBwYXJ0LgotCi1UaGUgZm91cnRoIGlzIHRoZSByZW1haW5kZXIgb2YgQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoaXMgaXMgdGhlIHBvc3QKLXRhcmdldCBwYXJ0LgotCi1JZiBhbnkgb2YgdGhlc2UgY29tbWVudCBsaW5lcyBhcmUgbWlzc2luZywgdGhlIGNvcnJlc3BvbmRpbmcgc2hlbGwKLXNjcmlwdCBpcyBlbXB0eS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGZpcnN0IGV4ZWN1dGUgdGhlIGNvbW1vbiBwYXJ0LiAgVGhpcyBtdXN0IHNldCB0aGUKLXNoZWxsIHZhcmlhYmxlIEBzYW1we3NyY3RyaWdnZXJ9IHRvIHRoZSBuYW1lIG9mIGEgc291cmNlIGZpbGUsIHRvCi1jb25maXJtIHRoYXQgQ3lnbnVzIGNvbmZpZ3VyZSBpcyBsb29raW5nIGF0IHRoZSByaWdodCBkaXJlY3RvcnkuICBUaGlzCi1tYXkgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZXMgQHNhbXB7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSBhbmQKLUBzYW1we3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30uCi0KLUN5Z251cyBjb25maWd1cmUgd2lsbCBuZXh0IHNldCB0aGUgQHNhbXB7YnVpbGR9IGFuZCBAc2FtcHtob3N0fSBzaGVsbAotdmFyaWFibGVzLCBhbmQgZXhlY3V0ZSB0aGUgcGVyIGhvc3QgcGFydC4gIFRoaXMgbWF5IHNldCB0aGUgc2hlbGwKLXZhcmlhYmxlIEBzYW1we2hvc3RfbWFrZWZpbGVfZnJhZ30uCi0KLUN5Z251cyBjb25maWd1cmUgd2lsbCBuZXh0IHNldCB0aGUgQHNhbXB7dGFyZ2V0fSB2YXJpYWJsZSwgYW5kIGV4ZWN1dGUKLXRoZSBwZXIgdGFyZ2V0IHBhcnQuICBUaGlzIG1heSBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlCi1Ac2FtcHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30uCi0KLUFueSBvZiB0aGVzZSBzY3JpcHRzIG1heSBzZXQgdGhlIEBzYW1we3N1YmRpcnN9IHNoZWxsIHZhcmlhYmxlLiAgVGhpcwotdmFyaWFibGUgaXMgYSBsaXN0IG9mIHN1YmRpcmVjdG9yaWVzIHdoZXJlIGEgQGZpbGV7TWFrZWZpbGUuaW59IGZpbGUgbWF5Ci1iZSBmb3VuZC4gIEN5Z251cyBjb25maWd1cmUgd2lsbCBhdXRvbWF0aWNhbGx5IGxvb2sgZm9yIGEKLUBmaWxle01ha2VmaWxlLmlufSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFRoZSBAc2FtcHtzdWJkaXJzfQotc2hlbGwgdmFyaWFibGUgaXMgbm90IG5vcm1hbGx5IHVzZWQsIGFuZCBJIGJlbGlldmUgdGhhdCB0aGUgb25seQotZGlyZWN0b3J5IHdoaWNoIHVzZXMgaXQgYXQgcHJlc2VudCBpcyBAZmlsZXtuZXdsaWJ9LgotCi1Gb3IgZWFjaCBAZmlsZXtNYWtlZmlsZS5pbn0sIEN5Z251cyBjb25maWd1cmUgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZQotYSBAZmlsZXtNYWtlZmlsZX0gYnkgYWRkaW5nIGRlZmluaXRpb25zIGZvciBAc2FtcHttYWtlfSB2YXJpYWJsZXMgc3VjaAotYXMgQHNhbXB7aG9zdH0gYW5kIEBzYW1we3RhcmdldH0sIGFuZCBhdXRvbWF0aWNhbGx5IGVkaXRpbmcgdGhlIHZhbHVlcwotb2YgQHNhbXB7bWFrZX0gdmFyaWFibGVzIHN1Y2ggYXMgQHNhbXB7cHJlZml4fSBpZiB0aGV5IGFyZSBwcmVzZW50LgotCi1BbHNvLCBpZiBhbnkgb2YgdGhlIEBzYW1we21ha2VmaWxlX2ZyYWd9IHNoZWxsIHZhcmlhYmxlcyBhcmUgc2V0LCBDeWdudXMKLWNvbmZpZ3VyZSB3aWxsIGludGVycHJldCB0aGVtIGFzIGZpbGUgbmFtZXMgcmVsYXRpdmUgdG8gZWl0aGVyIHRoZQotd29ya2luZyBkaXJlY3Rvcnkgb3IgdGhlIHNvdXJjZSBkaXJlY3RvcnksIGFuZCB3aWxsIHJlYWQgdGhlIGNvbnRlbnRzIG9mCi10aGUgZmlsZSBpbnRvIHRoZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9LiAgVGhlIGZpbGUgY29udGVudHMgd2lsbCBiZQotcmVhZCBpbiBhZnRlciB0aGUgZmlyc3QgbGluZSBpbiBAZmlsZXtNYWtlZmlsZS5pbn0gd2hpY2ggc3RhcnRzIHdpdGgKLUBzYW1weyMjIyN9LgotCi1UaGVzZSBAZmlsZXtNYWtlZmlsZX0gZnJhZ21lbnRzIGFyZSB1c2VkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvdXIgZm9yIGEKLXBhcnRpY3VsYXIgaG9zdCBvciB0YXJnZXQuICBUaGV5IHNlcnZlIHRvIHNlbGVjdCBwYXJ0aWN1bGFyIGZpbGVzIHRvCi1jb21waWxlLCBhbmQgdG8gZGVmaW5lIHBhcnRpY3VsYXIgcHJlcHJvY2Vzc29yIG1hY3JvcyBieSBwcm92aWRpbmcKLXZhbHVlcyBmb3IgQHNhbXB7bWFrZX0gdmFyaWFibGVzIHdoaWNoIGFyZSB0aGVuIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLgotQ3lnbnVzIGNvbmZpZ3VyZSwgdW5saWtlIGF1dG9jb25mLCBub3JtYWxseSBkb2VzIG5vdCBkbyBmZWF0dXJlIHRlc3RzLAotYW5kIG5vcm1hbGx5IHJlcXVpcmVzIHN1cHBvcnQgdG8gYmUgYWRkZWQgbWFudWFsbHkgZm9yIGVhY2ggbmV3IGhvc3QuCi0KLVRoZSBAZmlsZXtNYWtlZmlsZX0gZnJhZ21lbnQgc3VwcG9ydCBpcyBzaW1pbGFyIHRvIHRoZSBhdXRvY29uZgotQHNhbXB7QUNfU1VCU1RfRklMRX0gbWFjcm8uCi0KLUFmdGVyIGNyZWF0aW5nIGVhY2ggQGZpbGV7TWFrZWZpbGV9LCB0aGUgcG9zdCB0YXJnZXQgc2NyaXB0IHdpbGwgYmUgcnVuCi0oaS5lLiwgaXQgbWF5IGJlIHJ1biBzZXZlcmFsIHRpbWVzKS4gIFRoaXMgc2NyaXB0IG1heSBmdXJ0aGVyIGN1c3RvbWl6ZQotdGhlIEBmaWxle01ha2VmaWxlfS4gIFdoZW4gaXQgaXMgcnVuLCB0aGUgc2hlbGwgdmFyaWFibGUgQHNhbXB7TWFrZWZpbGV9Ci13aWxsIGhvbGQgdGhlIG5hbWUgb2YgdGhlIEBmaWxle01ha2VmaWxlfSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZQotZGlyZWN0b3J5IGNvbXBvbmVudC4KLQotTGlrZSBhbiBhdXRvY29uZiBnZW5lcmF0ZWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQsIEN5Z251cyBjb25maWd1cmUKLXdpbGwgY3JlYXRlIGEgZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuc3RhdHVzfSB3aGljaCwgd2hlbiBydW4sIHdpbGwKLWF1dG9tYXRpY2FsbHkgcmVjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uICBUaGUgQGZpbGV7Y29uZmlnLnN0YXR1c30gZmlsZQotd2lsbCBzaW1wbHkgZXhlY3V0ZSB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQgYWdhaW4gd2l0aCB0aGUKLWFwcHJvcHJpYXRlIGFyZ3VtZW50cy4KLQotQW55IG9mIHRoZSBwYXJ0cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IG1heSBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlcwotQHNhbXB7ZmlsZXN9IGFuZCBAc2FtcHtsaW5rc30uICBDeWdudXMgY29uZmlndXJlIHdpbGwgc2V0IHVwIHN5bWxpbmtzCi1mcm9tIHRoZSBuYW1lcyBpbiBAc2FtcHtsaW5rc30gdG8gdGhlIGZpbGVzIG5hbWVkIGluIEBzYW1we2ZpbGVzfS4gIFRoaXMKLWlzIHNpbWlsYXIgdG8gdGhlIGF1dG9jb25mIEBzYW1we0FDX0xJTktfRklMRVN9IG1hY3JvLgotCi1GaW5hbGx5LCBhbnkgb2YgdGhlIHBhcnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gbWF5IHNldCB0aGUgc2hlbGwKLXZhcmlhYmxlIEBzYW1we2NvbmZpZ2RpcnN9IHRvIGEgc2V0IG9mIHN1YmRpcmVjdG9yaWVzLiAgSWYgaXQgaXMgc2V0LAotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIHJlY3Vyc2l2ZWx5IHJ1biB0aGUgY29uZmlndXJlIHByb2Nlc3MgaW4gZWFjaAotc3ViZGlyZWN0b3J5LiAgSWYgdGhlIHN1YmRpcmVjdG9yeSB1c2VzIEN5Z251cyBjb25maWd1cmUsIGl0IHdpbGwKLWNvbnRhaW4gYSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgYnV0IG5vIEBmaWxle2NvbmZpZ3VyZX0gZmlsZSwgaW4KLXdoaWNoIGNhc2UgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGludm9rZSBpdHNlbGYgcmVjdXJzaXZlbHkuICBJZiB0aGUKLXN1YmRpcmVjdG9yeSBoYXMgYSBAZmlsZXtjb25maWd1cmV9IGZpbGUsIEN5Z251cyBjb25maWd1cmUgYXNzdW1lcyB0aGF0Ci1pdCBpcyBhbiBhdXRvY29uZiBnZW5lcmF0ZWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQsIGFuZCBzaW1wbHkgaW52b2tlcwotaXQgZGlyZWN0bHkuCi0KLUBub2RlIEN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllcwotQHNlY3Rpb24gQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzCi1AY2luZGV4IEBmaWxle2xpYnN0ZGMrK30gY29uZmlndXJlCi1AY2luZGV4IEBmaWxle2xpYmlvfSBjb25maWd1cmUKLUBjaW5kZXggQGZpbGV7bGliZysrfSBjb25maWd1cmUKLQotVGhlIEMrKyBsaWJyYXJ5IGNvbmZpZ3VyZSBzeXN0ZW0sIHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIsIGRlc2VydmVzCi1zcGVjaWFsIG1lbnRpb24uICBJdCB1c2VzIEN5Z251cyBjb25maWd1cmUsIGJ1dCBpdCBkb2VzIGZlYXR1cmUgdGVzdGluZwotbGlrZSB0aGF0IGRvbmUgYnkgYXV0b2NvbmYgZ2VuZXJhdGVkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0cy4gIFRoaXMKLWFwcHJvYWNoIGlzIHVzZWQgaW4gdGhlIGxpYnJhcmllcyBAZmlsZXtsaWJpb30sIEBmaWxle2xpYnN0ZGMrK30sIGFuZAotQGZpbGV7bGliZysrfS4KLQotTW9zdCBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9IGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gb3V0IGJ5IHRoZSBzaGVsbAotc2NyaXB0IEBmaWxle2xpYmlvL2NvbmZpZy5zaGFyZWR9LiAgRWFjaCBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgc2V0cwotY2VydGFpbiBzaGVsbCB2YXJpYWJsZXMsIGFuZCB0aGVuIGludm9rZXMgQGZpbGV7Y29uZmlnLnNoYXJlZH0gdG8gY3JlYXRlCi10d28gcGFja2FnZSBAZmlsZXtNYWtlZmlsZX0gZnJhZ21lbnRzLiAgVGhlc2UgZnJhZ21lbnRzIGFyZSB0aGVuCi1pbmNvcnBvcmF0ZWQgaW50byB0aGUgcmVzdWx0aW5nIEBmaWxle01ha2VmaWxlfSBieSB0aGUgQ3lnbnVzIGNvbmZpZ3VyZQotc2NyaXB0LgotCi1UaGUgZmlsZSBAZmlsZXtfR19jb25maWcuaH0gaXMgY3JlYXRlZCBpbiB0aGUgQGZpbGV7bGliaW99IG9iamVjdAotZGlyZWN0b3J5IGJ5IHJ1bm5pbmcgdGhlIHNoZWxsIHNjcmlwdCBAZmlsZXtsaWJpby9nZW4tcGFyYW1zfS4gIFRoaXMKLXNoZWxsIHNjcmlwdCB1c2VzIGZlYXR1cmUgdGVzdHMgdG8gZGVmaW5lIG1hY3JvcyBhbmQgdHlwZWRlZnMgaW4KLUBmaWxle19HX2NvbmZpZy5ofS4KLQotQG5vZGUgTXVsdGlsaWJzCi1AY2hhcHRlciBNdWx0aWxpYnMKLUBjaW5kZXggbXVsdGlsaWJzCi0KLUZvciBzb21lIHRhcmdldHMgZ2NjIG1heSBoYXZlIGRpZmZlcmVudCBwcm9jZXNzb3IgcmVxdWlyZW1lbnRzIGRlcGVuZGluZwotdXBvbiBjb21tYW5kIGxpbmUgb3B0aW9ucy4gIEFuIG9idmlvdXMgZXhhbXBsZSBpcyB0aGUKLUBzYW1wey1tc29mdC1mbG9hdH0gb3B0aW9uIHN1cHBvcnRlZCBvbiBzZXZlcmFsIHByb2Nlc3NvcnMuICBUaGlzIG9wdGlvbgotbWVhbnMgdGhhdCB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFyZSBub3QgYXZhaWxhYmxlLCB3aGljaCBtZWFucwotdGhhdCBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIG11c3QgYmUgZG9uZSBieSBjYWxsaW5nIGFuIGVtdWxhdGlvbgotc3Vicm91dGluZSByYXRoZXIgdGhhbiBieSB1c2luZyBtYWNoaW5lIGluc3RydWN0aW9ucy4KLQotRm9yIHN1Y2ggb3B0aW9ucywgZ2NjIGlzIG9mdGVuIGNvbmZpZ3VyZWQgdG8gY29tcGlsZSB0YXJnZXQgbGlicmFyaWVzCi10d2ljZTogb25jZSB3aXRoIEBzYW1wey1tc29mdC1mbG9hdH0gYW5kIG9uY2Ugd2l0aG91dC4gIFdoZW4gZ2NjCi1jb21waWxlcyB0YXJnZXQgbGlicmFyaWVzIG1vcmUgdGhhbiBvbmNlLCB0aGUgcmVzdWx0aW5nIGxpYnJhcmllcyBhcmUKLWNhbGxlZCBAZGZue211bHRpbGlic30uCi0KLU11bHRpbGlicyBhcmUgbm90IHJlYWxseSBwYXJ0IG9mIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0sIGJ1dAotd2UgZGlzY3VzcyB0aGVtIGhlcmUgc2luY2UgdGhleSByZXF1aXJlIHN1cHBvcnQgaW4gdGhlIEBmaWxle2NvbmZpZ3VyZX0KLXNjcmlwdHMgYW5kIEBmaWxle01ha2VmaWxlfXMgdXNlZCBmb3IgdGFyZ2V0IGxpYnJhcmllcy4KLQotQG1lbnUKLSogTXVsdGlsaWJzIGluIGdjYzo6CQkgICAgICAgIE11bHRpbGlicyBpbiBnY2MuCi0qIE11bHRpbGlicyBpbiBUYXJnZXQgTGlicmFyaWVzOjoJTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgTXVsdGlsaWJzIGluIGdjYwotQHNlY3Rpb24gTXVsdGlsaWJzIGluIGdjYwotCi1JbiBnY2MsIG11bHRpbGlicyBhcmUgZGVmaW5lZCBieSBzZXR0aW5nIHRoZSB2YXJpYWJsZQotQHNhbXB7TVVMVElMSUJfT1BUSU9OU30gaW4gdGhlIHRhcmdldCBAZmlsZXtNYWtlZmlsZX0gZnJhZ21lbnQuICBTZXZlcmFsCi1vdGhlciBAc2FtcHtNVUxUSUxJQn0gdmFyaWFibGVzIG1heSBhbHNvIGJlIGRlZmluZWQgdGhlcmUuICBAeHJlZntUYXJnZXQKLUZyYWdtZW50LCAsIFRoZSBUYXJnZXQgTWFrZWZpbGUgRnJhZ21lbnQsIGdjYywgVXNpbmcgYW5kIFBvcnRpbmcgR05VCi1DQ30uCi0KLUlmIHlvdSBoYXZlIGJ1aWx0IGdjYywgeW91IGNhbiBzZWUgd2hhdCBtdWx0aWxpYnMgaXQgdXNlcyBieSBydW5uaW5nIGl0Ci13aXRoIHRoZSBAc2FtcHstcHJpbnQtbXVsdGktbGlifSBvcHRpb24uICBUaGUgb3V0cHV0IEBzYW1wey47fSBtZWFucwotdGhhdCBubyBtdWx0aWxpYnMgYXJlIHVzZWQuICBJbiBnZW5lcmFsLCB0aGUgb3V0cHV0IGlzIGEgc2VxdWVuY2Ugb2YKLWxpbmVzLCBvbmUgcGVyIG11bHRpbGliLiAgVGhlIGZpcnN0IHBhcnQgb2YgZWFjaCBsaW5lLCB1cCB0byB0aGUKLUBzYW1wezt9LCBpcyB0aGUgbmFtZSBvZiB0aGUgbXVsdGlsaWIgZGlyZWN0b3J5LiAgVGhlIHNlY29uZCBwYXJ0IGlzIGEKLWxpc3Qgb2YgY29tcGlsZXIgb3B0aW9ucyBzZXBhcmF0ZWQgYnkgQHNhbXB7QEB9IGNoYXJhY3RlcnMuCi0KLU11bHRpbGlicyBhcmUgYnVpbHQgaW4gYSB0cmVlIG9mIGRpcmVjdG9yaWVzLiAgVGhlIHRvcCBvZiB0aGUgdHJlZSwKLXJlcHJlc2VudGVkIGJ5IEBzYW1wey59IGluIHRoZSBsaXN0IG9mIG11bHRpbGliIGRpcmVjdG9yaWVzLCBpcyB0aGUKLWRlZmF1bHQgbGlicmFyeSB0byB1c2Ugd2hlbiBubyBzcGVjaWFsIGNvbXBpbGVyIG9wdGlvbnMgYXJlIHVzZWQuICBUaGUKLXN1YmRpcmVjdG9yaWVzIG9mIHRoZSB0cmVlIGhvbGQgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgdG8gdXNlIHdoZW4KLXBhcnRpY3VsYXIgY29tcGlsZXIgb3B0aW9ucyBhcmUgdXNlZC4KLQotQG5vZGUgTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXMKLUBzZWN0aW9uIE11bHRpbGlicyBpbiBUYXJnZXQgTGlicmFyaWVzCi0KLVRoZSB0YXJnZXQgbGlicmFyaWVzIGluIHRoZSBDeWdudXMgdHJlZSBhcmUgYXV0b21hdGljYWxseSBidWlsdCB3aXRoCi1tdWx0aWxpYnMuICBUaGF0IG1lYW5zIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzLgotCi1UaGlzIGRlZmF1bHQgaXMgc2V0IGluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCBieSBhZGRpbmcKLUBzYW1wey0tZW5hYmxlLW11bHRpbGlifSB0byB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGNvbmZpZ3VyZQotd2hlbiBpdCBpcyBydW4gZm9yIHRoZSB0YXJnZXQgbGlicmFyaWVzIChAcHhyZWZ7SG9zdCBhbmQgVGFyZ2V0Ci1MaWJyYXJpZXN9KS4KLQotRWFjaCB0YXJnZXQgbGlicmFyeSB1c2VzIHRoZSBzaGVsbCBzY3JpcHQgQGZpbGV7Y29uZmlnLW1sLmlufSwgd3JpdHRlbgotYnkgRG91ZyBFdmFucywgdG8gcHJlcGFyZSB0byBidWlsZCB0YXJnZXQgbGlicmFyaWVzLiAgVGhpcyBzaGVsbCBzY3JpcHQKLWlzIGludm9rZWQgYWZ0ZXIgdGhlIEBmaWxle01ha2VmaWxlfSBoYXMgYmVlbiBjcmVhdGVkIGJ5IHRoZQotQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQuICBJZiBtdWx0aWxpYnMgYXJlIG5vdCBlbmFibGVkLCBpdCBkb2VzIG5vdGhpbmcsCi1vdGhlcndpc2UgaXQgbW9kaWZpZXMgdGhlIEBmaWxle01ha2VmaWxlfSB0byBzdXBwb3J0IG11bHRpbGlicy4KLQotVGhlIEBmaWxle2NvbmZpZy1tbC5pbn0gc2NyaXB0IG1ha2VzIG9uZSBjb3B5IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gZm9yCi1lYWNoIG11bHRpbGliIGluIHRoZSBhcHByb3ByaWF0ZSBzdWJkaXJlY3RvcnkuICBXaGVuIGNvbmZpZ3VyaW5nIGluIHRoZQotc291cmNlIGRpcmVjdG9yeSAod2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKSwgaXQgd2lsbCBidWlsZCBhIHN5bWxpbmsKLXRyZWUgb2YgdGhlIHNvdXJjZXMgaW4gZWFjaCBzdWJkaXJlY3RvcnkuCi0KLVRoZSBAZmlsZXtjb25maWctbWwuaW59IHNjcmlwdCBzZXRzIHNldmVyYWwgdmFyaWFibGVzIGluIHRoZSB2YXJpb3VzCi1AZmlsZXtNYWtlZmlsZX1zLiAgVGhlIEBmaWxle01ha2VmaWxlLmlufSBtdXN0IGhhdmUgZGVmaW5pdGlvbnMgZm9yCi10aGVzZSB2YXJpYWJsZXMgYWxyZWFkeTsgQGZpbGV7Y29uZmlnLW1sLmlufSBzaW1wbHkgY2hhbmdlcyB0aGUgZXhpc3RpbmcKLXZhbHVlcy4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gc2hvdWxkIHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UKLXZhcmlhYmxlcyB3aGljaCB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBpbiB0aGUgc3ViZGlyZWN0b3JpZXMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gTVVMVElTUkNUT1AKLUBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcyB0byBhIHNlcXVlbmNlIG9mIEBzYW1wey4uL30gc3RyaW5ncywKLXdoZXJlIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpcyB0aGUgbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiB0aGUKLXNvdXJjZSB0cmVlLiAgVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHRoZSBlbXB0eSBzdHJpbmcuCi1AaXRlbSBNVUxUSUJVSUxEVE9QCi1AZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMgdG8gYSBzZXF1ZW5jZSBvZiBAc2FtcHsuLi99IHN0cmluZ3MsCi13aGVyZSB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaXMgbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiB0aGUgb2JqZWN0Ci1kaXJlY3RvcnkuICBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgdGhlIGVtcHR5IHN0cmluZy4gIFRoaXMgd2lsbAotZGlmZmVyIGZyb20gQHNhbXB7TVVMVElTUkNUT1B9IHdoZW4gY29uZmlndXJpbmcgaW4gdGhlIHNvdXJjZSB0cmVlCi0od2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4KLUBpdGVtIE1VTFRJRElSUwotSW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZX0gb25seSwgQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzCi10byB0aGUgbGlzdCBvZiBtdWx0aWxpYiBzdWJkaXJlY3Rvcmllcy4gIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSB0aGUKLWVtcHR5IHN0cmluZy4KLUBpdGVtIE1VTFRJU1VCRElSCi1AZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMgdG8gdGhlIGluc3RhbGxlZCBzdWJkaXJlY3RvcnkgbmFtZSB0bwotdXNlIGZvciB0aGlzIHN1YmRpcmVjdG9yeSwgd2l0aCBhIGxlYWRpbmcgQHNhbXB7L30uICBUaGUgZGVmYXVsdCB2YWx1ZQotc2hvbGQgYmUgdGhlIGVtcHR5IHN0cmluZy4KLUBpdGVtIE1VTFRJRE8KLUBpdGVteCBNVUxUSUNMRUFOCi1JbiB0aGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBvbmx5LCBAZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0Ci10aGVzZSB2YXJpYWJsZXMgdG8gY29tbWFuZHMgdG8gdXNlIHdoZW4gZG9pbmcgYSByZWN1cnNpdmUgbWFrZS4gIFRoZXNlCi12YXJpYWJsZXMgc2hvdWxkIGJvdGggZGVmYXVsdCB0byB0aGUgc3RyaW5nIEBzYW1we3RydWV9LCBzbyB0aGF0IGJ5Ci1kZWZhdWx0IG5vdGhpbmcgaGFwcGVucy4KLUBlbmQgdGFibGUKLQotQWxsIHJlZmVyZW5jZXMgdG8gdGhlIHBhcmVudCBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBzaG91bGQgdXNlIHRoZQotdmFyaWFibGUgQHNhbXB7TVVMVElTUkNUT1B9LiAgSW5zdGVhZCBvZiB3cml0aW5nIEBzYW1weyQoc3JjZGlyKS8uLn0sCi15b3UgbXVzdCB3cml0ZSBAc2FtcHskKHNyY2RpcikvJChNVUxUSVNSQ1RPUCkuLn0uCi0KLVNpbWlsYXJseSwgcmVmZXJlbmNlcyB0byB0aGUgcGFyZW50IG9mIHRoZSBvYmplY3QgZGlyZWN0b3J5IHNob3VsZCB1c2UKLXRoZSB2YXJpYWJsZSBAc2FtcHtNVUxUSUJVSUxEVE9QfS4KLQotSW4gdGhlIGluc3RhbGxhdGlvbiB0YXJnZXQsIHRoZSBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiB0aGUKLXN1YmRpcmVjdG9yeSBAc2FtcHtNVUxUSVNVQkRJUn0uICBJbnN0ZWFkIG9mIGluc3RhbGxpbmcKLUBzYW1weyQobGliZGlyKS9saWJmb28uYX0sIGluc3RhbGwKLUBzYW1weyQobGliZGlyKSQoTVVMVElTVUJESVIpL2xpYmZvby5hfS4KLQotVGhlIEBmaWxle2NvbmZpZy1tbC5pbn0gc2NyaXB0IGFsc28gbW9kaWZpZXMgdGhlIHRvcCBsZXZlbAotQGZpbGV7TWFrZWZpbGV9IHRvIGFkZCBAc2FtcHttdWx0aS1kb30gYW5kIEBzYW1we211bHRpLWNsZWFufSB0YXJnZXRzCi13aGljaCBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIG11bHRpbGlicy4KLQotVGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gc2hvdWxkIGluY2x1ZGUgdGhlIGZvbGxvd2luZwotY29tbWFuZDoKLUBzbWFsbGV4YW1wbGUKLUBAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIERPPWFsbCBtdWx0aS1kbwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyBhc3N1bWVzIHRoYXQgQHNhbXB7JChGTEFHU19UT19QQVNTKX0gaXMgZGVmaW5lZCBhcyBhIHNldCBvZgotdmFyaWFibGVzIHRvIHBhc3MgdG8gYSByZWN1cnNpdmUgaW52b2NhdGlvbiBvZiBAc2FtcHttYWtlfS4gIFRoaXMgd2lsbAotYnVpbGQgYWxsIHRoZSBtdWx0aWxpYnMuICBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgQHNhbXB7TVVMVElET30KLWlzIEBzYW1we3RydWV9LCBzbyBieSBkZWZhdWx0IHRoaXMgY29tbWFuZCB3aWxsIGRvIG5vdGhpbmcuICBJdCB3aWxsCi1vbmx5IGRvIHNvbWV0aGluZyBpbiB0aGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBpZiBtdWx0aWxpYnMgd2VyZQotZW5hYmxlZC4KLQotVGhlIEBzYW1we2luc3RhbGx9IHRhcmdldCBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9IHNob3VsZCBpbmNsdWRlIHRoZQotZm9sbG93aW5nIGNvbW1hbmQ6Ci1Ac21hbGxleGFtcGxlCi1AQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBETz1pbnN0YWxsIG11bHRpLWRvCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JbiBnZW5lcmFsLCBhbnkgb3BlcmF0aW9uLCBvdGhlciB0aGFuIGNsZWFuLCB3aGljaCBzaG91bGQgYmUgcGVyZm9ybWVkCi1vbiBhbGwgdGhlIG11bHRpbGlicyBzaG91bGQgdXNlIGEgQHNhbXB7JChNVUxUSURPKX0gbGluZSwgc2V0dGluZyB0aGUKLXZhcmlhYmxlIEBzYW1we0RPfSB0byB0aGUgdGFyZ2V0IG9mIGVhY2ggcmVjdXJzaXZlIGNhbGwgdG8gQHNhbXB7bWFrZX0uCi0KLVRoZSBAc2FtcHtjbGVhbn0gdGFyZ2V0cyAoQHNhbXB7Y2xlYW59LCBAc2FtcHttb3N0bHljbGVhbn0sIGV0Yy4pIHNob3VsZAotdXNlIEBzYW1weyQoTVVMVElDTEVBTil9LiAgRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHtjbGVhbn0gdGFyZ2V0IHNob3VsZAotZG8gdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBAJChNVUxUSUNMRUFOKSBETz1jbGVhbiBtdWx0aS1jbGVhbgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgRkFRCi1AY2hhcHRlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucwotCi1AdGFibGUgQGFzaXMKLUBpdGVtIFdoaWNoIGRvIEkgcnVuIGZpcnN0LCBAc2FtcHthdXRvY29uZn0gb3IgQHNhbXB7YXV0b21ha2V9PwotRXhjZXB0IHdoZW4geW91IGZpcnN0IGFkZCBhdXRvY29uZiBvciBhdXRvbWFrZSBzdXBwb3J0IHRvIGEgcGFja2FnZSwgeW91Ci1zaG91bGRuJ3QgcnVuIGVpdGhlciBieSBoYW5kLiAgSW5zdGVhZCwgY29uZmlndXJlIHdpdGggdGhlCi1Ac2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbiwgYW5kIGxldCBAc2FtcHttYWtlfSB0YWtlIGNhcmUgb2YKLWl0LgotCi1AY2luZGV4IHVuZGVmaW5lZCBtYWNyb3MKLUBpdGVtIEBzYW1we2F1dG9jb25mfSBzYXlzIHNvbWV0aGluZyBhYm91dCB1bmRlZmluZWQgbWFjcm9zLgotVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlIG1hY3JvcyBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gd2hpY2ggYXJlCi1ub3QgZGVmaW5lZCBieSBAc2FtcHthdXRvY29uZn0uICBZb3UgbWF5IGJlIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mCi1Ac2FtcHthdXRvY29uZn07IHRyeSBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBhIG5ld2VyIG9uZS4gIE1ha2Ugc3VyZSB0aGUKLW5ld2x5IGluc3RhbGxsZWQgQHNhbXB7YXV0b2NvbmZ9IGlzIGZpcnN0IG9uIHlvdXIgQHNhbXB7UEFUSH0uICBBbHNvLAotc2VlIHRoZSBuZXh0IHF1ZXN0aW9uLgotCi1AY2luZGV4IEBzYW1we0NZX0dOVV9HRVRURVhUfSBpbiBAZmlsZXtjb25maWd1cmV9Ci1AY2luZGV4IEBzYW1we0FNX1BST0dfTElCVE9PTH0gaW4gQGZpbGV7Y29uZmlndXJlfQotQGl0ZW0gTXkgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgaGFzIHN0dWZmIGxpa2UgQHNhbXB7Q1lfR05VX0dFVFRFWFR9IGluIGl0LgotVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlIG1hY3JvcyBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gd2hpY2ggc2hvdWxkCi1iZSBkZWZpbmVkIGluIHlvdXIgQGZpbGV7YWNsb2NhbC5tNH0gZmlsZSwgYnV0IGFyZW4ndC4gIFRoaXMgdXN1YWxseQotbWVhbnMgdGhhdCBAc2FtcHthY2xvY2FsfSB3YXMgbm90IGFibGUgdG8gYXBwcm9wcmlhdGUgZGVmaW5pdGlvbnMgb2YgdGhlCi1tYWNyb3MuICBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQgYWxsIHRoZSBwYWNrYWdlcyB5b3UgbmVlZC4KLUluIHBhcnRpY3VsYXIsIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZCBsaWJ0b29sICh0aGlzIGlzIHdoZXJlCi1Ac2FtcHtBTV9QUk9HX0xJQlRPT0x9IGlzIGRlZmluZWQpIGFuZCBnZXR0ZXh0ICh0aGlzIGlzIHdoZXJlCi1Ac2FtcHtDWV9HTlVfR0VUVEVYVH0gaXMgZGVmaW5lZCwgYXQgbGVhc3QgaW4gdGhlIEN5Z251cyB2ZXJzaW9uIG9mCi1nZXR0ZXh0KS4KLQotQGNpbmRleCBAZmlsZXtNYWtlZmlsZX0sIGdhcmJhZ2UgY2hhcmFjdGVycwotQGl0ZW0gTXkgQGZpbGV7TWFrZWZpbGV9IGhhcyBAc2FtcHtAQH0gY2hhcmFjdGVycyBpbiBpdC4KLVRoaXMgbWF5IG1lYW4gdGhhdCB5b3UgdHJpZWQgdG8gdXNlIGFuIGF1dG9jb25mIHN1YnN0aXR1dGlvbiBpbiB5b3VyCi1AZmlsZXtNYWtlZmlsZS5pbn0gd2l0aG91dCBhZGRpbmcgdGhlIGFwcHJvcHJpYXRlIEBzYW1we0FDX1NVQlNUfSBjYWxsCi10byB5b3VyIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LiAgT3IgaXQgbWF5IGp1c3QgbWVhbiB0aGF0IHlvdSBuZWVkIHRvCi1yZWJ1aWxkIEBmaWxle01ha2VmaWxlfSBpbiB5b3VyIGJ1aWxkIGRpcmVjdG9yeS4gIFRvIHJlYnVpbGQKLUBmaWxle01ha2VmaWxlfSBmcm9tIEBmaWxle01ha2VmaWxlLmlufSwgcnVuIHRoZSBzaGVsbCBzY3JpcHQKLUBmaWxle2NvbmZpZy5zdGF0dXN9IHdpdGggbm8gYXJndW1lbnRzLiAgSWYgeW91IG5lZWQgdG8gZm9yY2UKLUBmaWxle2NvbmZpZ3VyZX0gdG8gcnVuIGFnYWluLCBmaXJzdCBydW4gQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9LgotVGhlc2UgcnVucyBhcmUgbm9ybWFsbHkgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IEBmaWxle01ha2VmaWxlfSB0YXJnZXRzLAotYnV0IGlmIHlvdXIgQGZpbGV7TWFrZWZpbGV9IGhhcyBnb3R0ZW4gbWVzc2VkIHVwIHlvdSdsbCBuZWVkIHRvIGhlbHAKLXRoZW0gYWxvbmcuCi0KLUBjaW5kZXggQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9Ci1AaXRlbSBXaHkgZG8gSSBoYXZlIHRvIHJ1biBib3RoIEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfSBhbmQgQHNhbXB7Y29uZmlnLnN0YXR1c30/Ci1Ob3JtYWxseSwgeW91IGRvbid0OyB0aGV5IHdpbGwgYmUgcnVuIGF1dG9tYXRpY2FsbHkgYnkgQGZpbGV7TWFrZWZpbGV9Ci10YXJnZXRzLiAgSWYgeW91IGRvIG5lZWQgdG8gcnVuIHRoZW0sIHVzZSBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30KLXRvIHJ1biB0aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgYWdhaW4gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlCi1maXJzdCB0aW1lIHlvdSByYW4gaXQuICBVc2UgQHNhbXB7Y29uZmlnLnN0YXR1c30gKHdpdGggbm8gYXJndW1lbnRzKSB0bwotcmVnZW5lcmF0ZSBhbGwgZmlsZXMgKEBmaWxle01ha2VmaWxlfSwgQGZpbGV7Y29uZmlnLmh9LCBldGMuKSBiYXNlZCBvbgotdGhlIHJlc3VsdHMgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuICBUaGUgdHdvIGNhc2VzIGFyZSBzZXBhcmF0ZSBiZWNhdXNlCi1pdCBpc24ndCBhbHdheXMgbmVjZXNzYXJ5IHRvIHJlZ2VuZXJhdGUgYWxsIHRoZSBmaWxlcyBhZnRlciBydW5uaW5nCi1Ac2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30uICBUaGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldHMgZ2VuZXJhdGVkCi1ieSBhdXRvbWFrZSB3aWxsIHVzZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIEBzYW1we0NPTkZJR19GSUxFU30gYW5kCi1Ac2FtcHtDT05GSUdfSEVBREVSU30gdG8gb25seSByZWdlbmVyYXRlIGZpbGVzIGFzIHRoZXkgYXJlIG5lZWRlZC4KLQotQGl0ZW0gV2hhdCBpcyB0aGUgQ3lnbnVzIHRyZWU/Ci1UaGUgQ3lnbnVzIHRyZWUgaXMgdXNlZCBmb3IgdmFyaW91cyBwYWNrYWdlcyBpbmNsdWRpbmcgZ2RiLCB0aGUgR05VCi1iaW51dGlscywgYW5kIGVnY3MuICBJdCBpcyBhbHNvLCBvZiBjb3Vyc2UsIHVzZWQgZm9yIEN5Z251cyByZWxlYXNlcy4KLUl0IGlzIHRoZSBidWlsZCBzeXN0ZW0gd2hpY2ggd2FzIGRldmVsb3BlZCBhdCBDeWdudXMsIHVzaW5nIHRoZSBDeWdudXMKLWNvbmZpZ3VyZSBzY3JpcHQuICBJdCBwZXJtaXRzIGJ1aWxkaW5nIG1hbnkgZGlmZmVyZW50IHBhY2thZ2VzIHdpdGggYQotc2luZ2xlIGNvbmZpZ3VyZSBhbmQgbWFrZS4gIFRoZSBjb25maWd1cmUgc2NyaXB0cyBpbiB0aGUgdHJlZSBhcmUgYmVpbmcKLWNvbnZlcnRlZCB0byBhdXRvY29uZiwgYnV0IHRoZSBnZW5lcmFsIGJ1aWxkIHN0cnVjdHVyZSByZW1haW5zIGludGFjdC4KLQotQGl0ZW0gV2h5IGRvIEkgaGF2ZSB0byBrZWVwIHJlYnVpbGRpbmcgYW5kIHJlaW5zdGFsbGluZyB0aGUgdG9vbHM/Ci1JIGtub3csIGl0J3MgYSBwYWluLiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIGJ1Z3MgaW4gdGhlIHRvb2xzCi10aGVtc2VsdmVzIHdoaWNoIG5lZWQgdG8gYmUgZml4ZWQsIGFuZCBlYWNoIHRpbWUgdGhhdCBoYXBwZW5zIGV2ZXJ5Ym9keQotd2hvIHVzZXMgdGhlIHRvb2xzIG5lZWQgdG8gcmVpbnN0YWxsIG5ldyB2ZXJzaW9ucyBvZiB0aGVtLiAgSSBkb24ndCBrbm93Ci1pZiB0aGVyZSBpcyBnb2luZyB0byBiZSBhIGNsZXZlciBmaXggdW50aWwgdGhlIHRvb2xzIHN0YWJpbGl6ZS4KLQotQGl0ZW0gV2h5IG5vdCBqdXN0IGhhdmUgYSBDeWdudXMgdHJlZSBAc2FtcHttYWtlfSB0YXJnZXQgdG8gdXBkYXRlIHRoZSB0b29scz8KLVRoZSB0b29scyB1bmZvcnR1bmF0ZWx5IG5lZWQgdG8gYmUgaW5zdGFsbGVkIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkLgotVGhhdCBtZWFucyB0aGF0IHRoZXkgbXVzdCBiZSBidWlsdCB1c2luZyBhbiBhcHByb3ByaWF0ZSBwcmVmaXgsIGFuZCBpdAotc2VlbXMgdW53aXNlIHRvIGFzc3VtZSB0aGF0IGV2ZXJ5IGNvbmZpZ3VyYXRpb24gdXNlcyBhbiBhcHByb3ByaWF0ZQotcHJlZml4LiAgSXQgbWlnaHQgYmUgcG9zc2libGUgdG8gbWFrZSB0aGVtIHdvcmsgaW4gcGxhY2UsIG9yIGl0IG1pZ2h0IGJlCi1wb3NzaWJsZSB0byBpbnN0YWxsIHRoZW0gaW4gc29tZSBzdWJkaXJlY3Rvcnk7IHNvIGZhciB0aGVzZSBhcHByb2FjaGVzCi1oYXZlIG5vdCBiZWVuIGltcGxlbWVudGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWQgSW5kZXgKLQotQHByaW50aW5kZXggY3AKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9ldGMvbWFrZS1zdGRzLnRleGkgYi9ldGMvbWFrZS1zdGRzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDk3NjQuLjAwMDAwMDAKLS0tIGEvZXRjL21ha2Utc3Rkcy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLUBjb21tZW50IFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBib3RoIHN0YW5kYXJkcy50ZXhpIGFuZCBtYWtlLnRleGluZm8uCi1AY29tbWVudCBJdCB3YXMgYnJva2VuIG91dCBvZiBzdGFuZGFyZHMudGV4aSBvbiAxLzYvOTMgYnkgcm9sYW5kLgotCi1Abm9kZSBNYWtlZmlsZSBDb252ZW50aW9ucwotQGNoYXB0ZXIgTWFrZWZpbGUgQ29udmVudGlvbnMKLUBjb21tZW50IHN0YW5kYXJkcy50ZXhpIGRvZXMgbm90IHByaW50IGFuIGluZGV4LCBidXQgbWFrZS50ZXhpbmZvIGRvZXMuCi1AY2luZGV4IG1ha2VmaWxlLCBjb252ZW50aW9ucyBmb3IKLUBjaW5kZXggY29udmVudGlvbnMgZm9yIG1ha2VmaWxlcwotQGNpbmRleCBzdGFuZGFyZHMgZm9yIG1ha2VmaWxlcwotCi1UaGlzCi1AaWZpbmZvCi1ub2RlCi1AZW5kIGlmaW5mbwotQGlmdGV4Ci1AaWZzZXQgQ09ERVNURAotc2VjdGlvbgotQGVuZCBpZnNldAotQGlmY2xlYXIgQ09ERVNURAotY2hhcHRlcgotQGVuZCBpZmNsZWFyCi1AZW5kIGlmdGV4Ci1kZXNjcmliZXMgY29udmVudGlvbnMgZm9yIHdyaXRpbmcgdGhlIE1ha2VmaWxlcyBmb3IgR05VIHByb2dyYW1zLgotCi1AbWVudQotKiBNYWtlZmlsZSBCYXNpY3M6OgkJR2VuZXJhbCBDb252ZW50aW9ucyBmb3IgTWFrZWZpbGVzCi0qIFV0aWxpdGllcyBpbiBNYWtlZmlsZXM6OglVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCi0qIENvbW1hbmQgVmFyaWFibGVzOjoJCVZhcmlhYmxlcyBmb3IgU3BlY2lmeWluZyBDb21tYW5kcwotKiBEaXJlY3RvcnkgVmFyaWFibGVzOjoJCVZhcmlhYmxlcyBmb3IgSW5zdGFsbGF0aW9uIERpcmVjdG9yaWVzCi0qIFN0YW5kYXJkIFRhcmdldHM6OgkJU3RhbmRhcmQgVGFyZ2V0cyBmb3IgVXNlcnMKLSogSW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXM6OiAgVGhyZWUgY2F0ZWdvcmllcyBvZiBjb21tYW5kcyBpbiB0aGUgYGluc3RhbGwnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZTogbm9ybWFsLCBwcmUtaW5zdGFsbCBhbmQgcG9zdC1pbnN0YWxsLgotQGVuZCBtZW51Ci0KLUBub2RlIE1ha2VmaWxlIEJhc2ljcwotQHNlY3Rpb24gR2VuZXJhbCBDb252ZW50aW9ucyBmb3IgTWFrZWZpbGVzCi0KLUV2ZXJ5IE1ha2VmaWxlIHNob3VsZCBjb250YWluIHRoaXMgbGluZToKLQotQGV4YW1wbGUKLVNIRUxMID0gL2Jpbi9zaAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotdG8gYXZvaWQgdHJvdWJsZSBvbiBzeXN0ZW1zIHdoZXJlIHRoZSBAY29kZXtTSEVMTH0gdmFyaWFibGUgbWlnaHQgYmUKLWluaGVyaXRlZCBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIChUaGlzIGlzIG5ldmVyIGEgcHJvYmxlbSB3aXRoIEdOVQotQGNvZGV7bWFrZX0uKQotCi1EaWZmZXJlbnQgQGNvZGV7bWFrZX0gcHJvZ3JhbXMgaGF2ZSBpbmNvbXBhdGlibGUgc3VmZml4IGxpc3RzIGFuZAotaW1wbGljaXQgcnVsZXMsIGFuZCB0aGlzIHNvbWV0aW1lcyBjcmVhdGVzIGNvbmZ1c2lvbiBvciBtaXNiZWhhdmlvci4gIFNvCi1pdCBpcyBhIGdvb2QgaWRlYSB0byBzZXQgdGhlIHN1ZmZpeCBsaXN0IGV4cGxpY2l0bHkgdXNpbmcgb25seSB0aGUKLXN1ZmZpeGVzIHlvdSBuZWVkIGluIHRoZSBwYXJ0aWN1bGFyIE1ha2VmaWxlLCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZmlyc3QgbGluZSBjbGVhcnMgb3V0IHRoZSBzdWZmaXggbGlzdCwgdGhlIHNlY29uZCBpbnRyb2R1Y2VzIGFsbAotc3VmZml4ZXMgd2hpY2ggbWF5IGJlIHN1YmplY3QgdG8gaW1wbGljaXQgcnVsZXMgaW4gdGhpcyBNYWtlZmlsZS4KLQotRG9uJ3QgYXNzdW1lIHRoYXQgQGZpbGV7Ln0gaXMgaW4gdGhlIHBhdGggZm9yIGNvbW1hbmQgZXhlY3V0aW9uLiAgV2hlbgoteW91IG5lZWQgdG8gcnVuIHByb2dyYW1zIHRoYXQgYXJlIGEgcGFydCBvZiB5b3VyIHBhY2thZ2UgZHVyaW5nIHRoZQotbWFrZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IGl0IHVzZXMgQGZpbGV7Li99IGlmIHRoZSBwcm9ncmFtIGlzIGJ1aWx0IGFzCi1wYXJ0IG9mIHRoZSBtYWtlIG9yIEBmaWxleyQoc3JjZGlyKS99IGlmIHRoZSBmaWxlIGlzIGFuIHVuY2hhbmdpbmcgcGFydAotb2YgdGhlIHNvdXJjZSBjb2RlLiAgV2l0aG91dCBvbmUgb2YgdGhlc2UgcHJlZml4ZXMsIHRoZSBjdXJyZW50IHNlYXJjaAotcGF0aCBpcyB1c2VkLgotCi1UaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBAZmlsZXsuL30gKHRoZSBAZGZue2J1aWxkIGRpcmVjdG9yeX0pIGFuZAotQGZpbGV7JChzcmNkaXIpL30gKHRoZSBAZGZue3NvdXJjZSBkaXJlY3Rvcnl9KSBpcyBpbXBvcnRhbnQgYmVjYXVzZQotdXNlcnMgY2FuIGJ1aWxkIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5IHVzaW5nIHRoZSBAc2FtcHstLXNyY2Rpcn0gb3B0aW9uCi10byBAZmlsZXtjb25maWd1cmV9LiAgQSBydWxlIG9mIHRoZSBmb3JtOgotCi1Ac21hbGxleGFtcGxlCi1mb28uMSA6IGZvby5tYW4gc2Vkc2NyaXB0Ci0gICAgICAgIHNlZCAtZSBzZWRzY3JpcHQgZm9vLm1hbiA+IGZvby4xCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdpbGwgZmFpbCB3aGVuIHRoZSBidWlsZCBkaXJlY3RvcnkgaXMgbm90IHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlCi1AZmlsZXtmb28ubWFufSBhbmQgQGZpbGV7c2Vkc2NyaXB0fSBhcmUgaW4gdGhlIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotCi1XaGVuIHVzaW5nIEdOVSBAY29kZXttYWtlfSwgcmVseWluZyBvbiBAc2FtcHtWUEFUSH0gdG8gZmluZCB0aGUgc291cmNlCi1maWxlIHdpbGwgd29yayBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHNpbmdsZSBkZXBlbmRlbmN5IGZpbGUsCi1zaW5jZSB0aGUgQGNvZGV7bWFrZX0gYXV0b21hdGljIHZhcmlhYmxlIEBzYW1weyQ8fSB3aWxsIHJlcHJlc2VudCB0aGUKLXNvdXJjZSBmaWxlIHdoZXJldmVyIGl0IGlzLiAgKE1hbnkgdmVyc2lvbnMgb2YgQGNvZGV7bWFrZX0gc2V0IEBzYW1weyQ8fQotb25seSBpbiBpbXBsaWNpdCBydWxlcy4pICBBIE1ha2VmaWxlIHRhcmdldCBsaWtlCi0KLUBzbWFsbGV4YW1wbGUKLWZvby5vIDogYmFyLmMKLSAgICAgICAgJChDQykgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAtYyBiYXIuYyAtbyBmb28ubwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1zaG91bGQgaW5zdGVhZCBiZSB3cml0dGVuIGFzCi0KLUBzbWFsbGV4YW1wbGUKLWZvby5vIDogYmFyLmMKLSAgICAgICAgJChDQykgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQEAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotaW4gb3JkZXIgdG8gYWxsb3cgQHNhbXB7VlBBVEh9IHRvIHdvcmsgY29ycmVjdGx5LiAgV2hlbiB0aGUgdGFyZ2V0IGhhcwotbXVsdGlwbGUgZGVwZW5kZW5jaWVzLCB1c2luZyBhbiBleHBsaWNpdCBAc2FtcHskKHNyY2Rpcil9IGlzIHRoZSBlYXNpZXN0Ci13YXkgdG8gbWFrZSB0aGUgcnVsZSB3b3JrIHdlbGwuICBGb3IgZXhhbXBsZSwgdGhlIHRhcmdldCBhYm92ZSBmb3IKLUBmaWxle2Zvby4xfSBpcyBiZXN0IHdyaXR0ZW4gYXM6Ci0KLUBzbWFsbGV4YW1wbGUKLWZvby4xIDogZm9vLm1hbiBzZWRzY3JpcHQKLSAgICAgICAgc2VkIC1lICQoc3JjZGlyKS9zZWRzY3JpcHQgJChzcmNkaXIpL2Zvby5tYW4gPiAkQEAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUdOVSBkaXN0cmlidXRpb25zIHVzdWFsbHkgY29udGFpbiBzb21lIGZpbGVzIHdoaWNoIGFyZSBub3Qgc291cmNlCi1maWxlcy0tLWZvciBleGFtcGxlLCBJbmZvIGZpbGVzLCBhbmQgdGhlIG91dHB1dCBmcm9tIEF1dG9jb25mLCBBdXRvbWFrZSwKLUJpc29uIG9yIEZsZXguICBTaW5jZSB0aGVzZSBmaWxlcyBub3JtYWxseSBhcHBlYXIgaW4gdGhlIHNvdXJjZQotZGlyZWN0b3J5LCB0aGV5IHNob3VsZCBhbHdheXMgYXBwZWFyIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBub3QgaW4gdGhlCi1idWlsZCBkaXJlY3RvcnkuICBTbyBNYWtlZmlsZSBydWxlcyB0byB1cGRhdGUgdGhlbSBzaG91bGQgcHV0IHRoZQotdXBkYXRlZCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLQotSG93ZXZlciwgaWYgYSBmaWxlIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgZGlzdHJpYnV0aW9uLCB0aGVuIHRoZQotTWFrZWZpbGUgc2hvdWxkIG5vdCBwdXQgaXQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgYnVpbGRpbmcgYQotcHJvZ3JhbSBpbiBvcmRpbmFyeSBjaXJjdW1zdGFuY2VzIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBzb3VyY2UgZGlyZWN0b3J5Ci1pbiBhbnkgd2F5LgotCi1UcnkgdG8gbWFrZSB0aGUgYnVpbGQgYW5kIGluc3RhbGxhdGlvbiB0YXJnZXRzLCBhdCBsZWFzdCAoYW5kIGFsbCB0aGVpcgotc3VidGFyZ2V0cykgd29yayBjb3JyZWN0bHkgd2l0aCBhIHBhcmFsbGVsIEBjb2Rle21ha2V9LgotCi1Abm9kZSBVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCi1Ac2VjdGlvbiBVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCi0KLVdyaXRlIHRoZSBNYWtlZmlsZSBjb21tYW5kcyAoYW5kIGFueSBzaGVsbCBzY3JpcHRzLCBzdWNoIGFzCi1AY29kZXtjb25maWd1cmV9KSB0byBydW4gaW4gQGNvZGV7c2h9LCBub3QgaW4gQGNvZGV7Y3NofS4gIERvbid0IHVzZSBhbnkKLXNwZWNpYWwgZmVhdHVyZXMgb2YgQGNvZGV7a3NofSBvciBAY29kZXtiYXNofS4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IGFuZCB0aGUgTWFrZWZpbGUgcnVsZXMgZm9yIGJ1aWxkaW5nIGFuZAotaW5zdGFsbGF0aW9uIHNob3VsZCBub3QgdXNlIGFueSB1dGlsaXRpZXMgZGlyZWN0bHkgZXhjZXB0IHRoZXNlOgotCi1AYyBkZCBmaW5kCi1AYyBndW56aXAgZ3ppcCBtZDVzdW0KLUBjIG1rZmlmbyBta25vZCB0ZWUgdW5hbWUgCi0KLUBleGFtcGxlCi1jYXQgY21wIGNwIGRpZmYgZWNobyBlZ3JlcCBleHByIGZhbHNlIGdyZXAgaW5zdGFsbC1pbmZvCi1sbiBscyBta2RpciBtdiBwd2Qgcm0gcm1kaXIgc2VkIHNsZWVwIHNvcnQgdGFyIHRlc3QgdG91Y2ggdHJ1ZQotQGVuZCBleGFtcGxlCi0KLVRoZSBjb21wcmVzc2lvbiBwcm9ncmFtIEBjb2Rle2d6aXB9IGNhbiBiZSB1c2VkIGluIHRoZSBAY29kZXtkaXN0fSBydWxlLgotCi1TdGljayB0byB0aGUgZ2VuZXJhbGx5IHN1cHBvcnRlZCBvcHRpb25zIGZvciB0aGVzZSBwcm9ncmFtcy4gIEZvcgotZXhhbXBsZSwgZG9uJ3QgdXNlIEBzYW1we21rZGlyIC1wfSwgY29udmVuaWVudCBhcyBpdCBtYXkgYmUsIGJlY2F1c2UKLW1vc3Qgc3lzdGVtcyBkb24ndCBzdXBwb3J0IGl0LgotCi1JdCBpcyBhIGdvb2QgaWRlYSB0byBhdm9pZCBjcmVhdGluZyBzeW1ib2xpYyBsaW5rcyBpbiBtYWtlZmlsZXMsIHNpbmNlIGEKLWZldyBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgdGhlbS4KLQotVGhlIE1ha2VmaWxlIHJ1bGVzIGZvciBidWlsZGluZyBhbmQgaW5zdGFsbGF0aW9uIGNhbiBhbHNvIHVzZSBjb21waWxlcnMKLWFuZCByZWxhdGVkIHByb2dyYW1zLCBidXQgc2hvdWxkIGRvIHNvIHZpYSBAY29kZXttYWtlfSB2YXJpYWJsZXMgc28gdGhhdCB0aGUKLXVzZXIgY2FuIHN1YnN0aXR1dGUgYWx0ZXJuYXRpdmVzLiAgSGVyZSBhcmUgc29tZSBvZiB0aGUgcHJvZ3JhbXMgd2UKLW1lYW46Ci0KLUBleGFtcGxlCi1hciBiaXNvbiBjYyBmbGV4IGluc3RhbGwgbGQgbGRjb25maWcgbGV4Ci1tYWtlIG1ha2VpbmZvIHJhbmxpYiB0ZXhpMmR2aSB5YWNjCi1AZW5kIGV4YW1wbGUKLQotVXNlIHRoZSBmb2xsb3dpbmcgQGNvZGV7bWFrZX0gdmFyaWFibGVzIHRvIHJ1biB0aG9zZSBwcm9ncmFtczoKLQotQGV4YW1wbGUKLSQoQVIpICQoQklTT04pICQoQ0MpICQoRkxFWCkgJChJTlNUQUxMKSAkKExEKSAkKExEQ09ORklHKSAkKExFWCkKLSQoTUFLRSkgJChNQUtFSU5GTykgJChSQU5MSUIpICQoVEVYSTJEVkkpICQoWUFDQykKLUBlbmQgZXhhbXBsZQotCi1XaGVuIHlvdSB1c2UgQGNvZGV7cmFubGlifSBvciBAY29kZXtsZGNvbmZpZ30sIHlvdSBzaG91bGQgbWFrZSBzdXJlCi1ub3RoaW5nIGJhZCBoYXBwZW5zIGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGUgcHJvZ3JhbSBpbiBxdWVzdGlvbi4KLUFycmFuZ2UgdG8gaWdub3JlIGFuIGVycm9yIGZyb20gdGhhdCBjb21tYW5kLCBhbmQgcHJpbnQgYSBtZXNzYWdlIGJlZm9yZQotdGhlIGNvbW1hbmQgdG8gdGVsbCB0aGUgdXNlciB0aGF0IGZhaWx1cmUgb2YgdGhpcyBjb21tYW5kIGRvZXMgbm90IG1lYW4KLWEgcHJvYmxlbS4gIChUaGUgQXV0b2NvbmYgQHNhbXB7QUNfUFJPR19SQU5MSUJ9IG1hY3JvIGNhbiBoZWxwIHdpdGgKLXRoaXMuKQotCi1JZiB5b3UgdXNlIHN5bWJvbGljIGxpbmtzLCB5b3Ugc2hvdWxkIGltcGxlbWVudCBhIGZhbGxiYWNrIGZvciBzeXN0ZW1zCi10aGF0IGRvbid0IGhhdmUgc3ltYm9saWMgbGlua3MuCi0KLUFkZGl0aW9uYWwgdXRpbGl0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdmlhIE1ha2UgdmFyaWFibGVzIGFyZToKLQotQGV4YW1wbGUKLWNoZ3JwIGNobW9kIGNob3duIG1rbm9kCi1AZW5kIGV4YW1wbGUKLQotSXQgaXMgb2sgdG8gdXNlIG90aGVyIHV0aWxpdGllcyBpbiBNYWtlZmlsZSBwb3J0aW9ucyAob3Igc2NyaXB0cykKLWludGVuZGVkIG9ubHkgZm9yIHBhcnRpY3VsYXIgc3lzdGVtcyB3aGVyZSB5b3Uga25vdyB0aG9zZSB1dGlsaXRpZXMKLWV4aXN0LgotCi1Abm9kZSBDb21tYW5kIFZhcmlhYmxlcwotQHNlY3Rpb24gVmFyaWFibGVzIGZvciBTcGVjaWZ5aW5nIENvbW1hbmRzCi0KLU1ha2VmaWxlcyBzaG91bGQgcHJvdmlkZSB2YXJpYWJsZXMgZm9yIG92ZXJyaWRpbmcgY2VydGFpbiBjb21tYW5kcywgb3B0aW9ucywKLWFuZCBzbyBvbi4KLQotSW4gcGFydGljdWxhciwgeW91IHNob3VsZCBydW4gbW9zdCB1dGlsaXR5IHByb2dyYW1zIHZpYSB2YXJpYWJsZXMuCi1UaHVzLCBpZiB5b3UgdXNlIEJpc29uLCBoYXZlIGEgdmFyaWFibGUgbmFtZWQgQGNvZGV7QklTT059IHdob3NlIGRlZmF1bHQKLXZhbHVlIGlzIHNldCB3aXRoIEBzYW1we0JJU09OID0gYmlzb259LCBhbmQgcmVmZXIgdG8gaXQgd2l0aAotQGNvZGV7JChCSVNPTil9IHdoZW5ldmVyIHlvdSBuZWVkIHRvIHVzZSBCaXNvbi4KLQotRmlsZSBtYW5hZ2VtZW50IHV0aWxpdGllcyBzdWNoIGFzIEBjb2Rle2xufSwgQGNvZGV7cm19LCBAY29kZXttdn0sIGFuZAotc28gb24sIG5lZWQgbm90IGJlIHJlZmVycmVkIHRvIHRocm91Z2ggdmFyaWFibGVzIGluIHRoaXMgd2F5LCBzaW5jZSB1c2VycwotZG9uJ3QgbmVlZCB0byByZXBsYWNlIHRoZW0gd2l0aCBvdGhlciBwcm9ncmFtcy4KLQotRWFjaCBwcm9ncmFtLW5hbWUgdmFyaWFibGUgc2hvdWxkIGNvbWUgd2l0aCBhbiBvcHRpb25zIHZhcmlhYmxlIHRoYXQgaXMKLXVzZWQgdG8gc3VwcGx5IG9wdGlvbnMgdG8gdGhlIHByb2dyYW0uICBBcHBlbmQgQHNhbXB7RkxBR1N9IHRvIHRoZQotcHJvZ3JhbS1uYW1lIHZhcmlhYmxlIG5hbWUgdG8gZ2V0IHRoZSBvcHRpb25zIHZhcmlhYmxlIG5hbWUtLS1mb3IKLWV4YW1wbGUsIEBjb2Rle0JJU09ORkxBR1N9LiAgKFRoZSBuYW1lcyBAY29kZXtDRkxBR1N9IGZvciB0aGUgQwotY29tcGlsZXIsIEBjb2Rle1lGTEFHU30gZm9yIHlhY2MsIGFuZCBAY29kZXtMRkxBR1N9IGZvciBsZXgsIGFyZQotZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGUsIGJ1dCB3ZSBrZWVwIHRoZW0gYmVjYXVzZSB0aGV5IGFyZSBzdGFuZGFyZC4pCi1Vc2UgQGNvZGV7Q1BQRkxBR1N9IGluIGFueSBjb21waWxhdGlvbiBjb21tYW5kIHRoYXQgcnVucyB0aGUKLXByZXByb2Nlc3NvciwgYW5kIHVzZSBAY29kZXtMREZMQUdTfSBpbiBhbnkgY29tcGlsYXRpb24gY29tbWFuZCB0aGF0Ci1kb2VzIGxpbmtpbmcgYXMgd2VsbCBhcyBpbiBhbnkgZGlyZWN0IHVzZSBvZiBAY29kZXtsZH0uCi0KLUlmIHRoZXJlIGFyZSBDIGNvbXBpbGVyIG9wdGlvbnMgdGhhdCBAZW1waHttdXN0fSBiZSB1c2VkIGZvciBwcm9wZXIKLWNvbXBpbGF0aW9uIG9mIGNlcnRhaW4gZmlsZXMsIGRvIG5vdCBpbmNsdWRlIHRoZW0gaW4gQGNvZGV7Q0ZMQUdTfS4KLVVzZXJzIGV4cGVjdCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgQGNvZGV7Q0ZMQUdTfSBmcmVlbHkgdGhlbXNlbHZlcy4KLUluc3RlYWQsIGFycmFuZ2UgdG8gcGFzcyB0aGUgbmVjZXNzYXJ5IG9wdGlvbnMgdG8gdGhlIEMgY29tcGlsZXIKLWluZGVwZW5kZW50bHkgb2YgQGNvZGV7Q0ZMQUdTfSwgYnkgd3JpdGluZyB0aGVtIGV4cGxpY2l0bHkgaW4gdGhlCi1jb21waWxhdGlvbiBjb21tYW5kcyBvciBieSBkZWZpbmluZyBhbiBpbXBsaWNpdCBydWxlLCBsaWtlIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLUNGTEFHUyA9IC1nCi1BTExfQ0ZMQUdTID0gLUkuICQoQ0ZMQUdTKQotLmMubzoKLSAgICAgICAgJChDQykgLWMgJChDUFBGTEFHUykgJChBTExfQ0ZMQUdTKSAkPAotQGVuZCBzbWFsbGV4YW1wbGUKLQotRG8gaW5jbHVkZSB0aGUgQHNhbXB7LWd9IG9wdGlvbiBpbiBAY29kZXtDRkxBR1N9LCBiZWNhdXNlIHRoYXQgaXMgbm90Ci1AZW1waHtyZXF1aXJlZH0gZm9yIHByb3BlciBjb21waWxhdGlvbi4gIFlvdSBjYW4gY29uc2lkZXIgaXQgYSBkZWZhdWx0Ci10aGF0IGlzIG9ubHkgcmVjb21tZW5kZWQuICBJZiB0aGUgcGFja2FnZSBpcyBzZXQgdXAgc28gdGhhdCBpdCBpcwotY29tcGlsZWQgd2l0aCBHQ0MgYnkgZGVmYXVsdCwgdGhlbiB5b3UgbWlnaHQgYXMgd2VsbCBpbmNsdWRlIEBzYW1wey1PfQotaW4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7Q0ZMQUdTfSBhcyB3ZWxsLgotCi1QdXQgQGNvZGV7Q0ZMQUdTfSBsYXN0IGluIHRoZSBjb21waWxhdGlvbiBjb21tYW5kLCBhZnRlciBvdGhlciB2YXJpYWJsZXMKLWNvbnRhaW5pbmcgY29tcGlsZXIgb3B0aW9ucywgc28gdGhlIHVzZXIgY2FuIHVzZSBAY29kZXtDRkxBR1N9IHRvCi1vdmVycmlkZSB0aGUgb3RoZXJzLgotCi1AY29kZXtDRkxBR1N9IHNob3VsZCBiZSB1c2VkIGluIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlIEMgY29tcGlsZXIsCi1ib3RoIHRob3NlIHdoaWNoIGRvIGNvbXBpbGF0aW9uIGFuZCB0aG9zZSB3aGljaCBkbyBsaW5raW5nLgotCi1FdmVyeSBNYWtlZmlsZSBzaG91bGQgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtJTlNUQUxMfSwgd2hpY2ggaXMgdGhlCi1iYXNpYyBjb21tYW5kIGZvciBpbnN0YWxsaW5nIGEgZmlsZSBpbnRvIHRoZSBzeXN0ZW0uCi0KLUV2ZXJ5IE1ha2VmaWxlIHNob3VsZCBhbHNvIGRlZmluZSB0aGUgdmFyaWFibGVzIEBjb2Rle0lOU1RBTExfUFJPR1JBTX0KLWFuZCBAY29kZXtJTlNUQUxMX0RBVEF9LiAgKFRoZSBkZWZhdWx0IGZvciBlYWNoIG9mIHRoZXNlIHNob3VsZCBiZQotQGNvZGV7JChJTlNUQUxMKX0uKSAgVGhlbiBpdCBzaG91bGQgdXNlIHRob3NlIHZhcmlhYmxlcyBhcyB0aGUgY29tbWFuZHMKLWZvciBhY3R1YWwgaW5zdGFsbGF0aW9uLCBmb3IgZXhlY3V0YWJsZXMgYW5kIG5vbmV4ZWN1dGFibGVzCi1yZXNwZWN0aXZlbHkuICBVc2UgdGhlc2UgdmFyaWFibGVzIGFzIGZvbGxvd3M6Ci0KLUBleGFtcGxlCi0kKElOU1RBTExfUFJPR1JBTSkgZm9vICQoYmluZGlyKS9mb28KLSQoSU5TVEFMTF9EQVRBKSBsaWJmb28uYSAkKGxpYmRpcikvbGliZm9vLmEKLUBlbmQgZXhhbXBsZQotCi1PcHRpb25hbGx5LCB5b3UgbWF5IHByZXBlbmQgdGhlIHZhbHVlIG9mIEBjb2Rle0RFU1RESVJ9IHRvIHRoZSB0YXJnZXQKLWZpbGVuYW1lLiAgRG9pbmcgdGhpcyBhbGxvd3MgdGhlIGluc3RhbGxlciB0byBjcmVhdGUgYSBzbmFwc2hvdCBvZiB0aGUKLWluc3RhbGxhdGlvbiB0byBiZSBjb3BpZWQgb250byB0aGUgcmVhbCB0YXJnZXQgZmlsZXN5c3RlbSBsYXRlci4gIERvIG5vdAotc2V0IHRoZSB2YWx1ZSBvZiBAY29kZXtERVNURElSfSBpbiB5b3VyIE1ha2VmaWxlLCBhbmQgZG8gbm90IGluY2x1ZGUgaXQKLWluIGFueSBpbnN0YWxsZWQgZmlsZXMuICBXaXRoIHN1cHBvcnQgZm9yIEBjb2Rle0RFU1RESVJ9LCB0aGUgYWJvdmUKLWV4YW1wbGVzIGJlY29tZToKLQotQGV4YW1wbGUKLSQoSU5TVEFMTF9QUk9HUkFNKSBmb28gJChERVNURElSKSQoYmluZGlyKS9mb28KLSQoSU5TVEFMTF9EQVRBKSBsaWJmb28uYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmZvby5hCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1BbHdheXMgdXNlIGEgZmlsZSBuYW1lLCBub3QgYSBkaXJlY3RvcnkgbmFtZSwgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBvZgotdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kcy4gIFVzZSBhIHNlcGFyYXRlIGNvbW1hbmQgZm9yIGVhY2ggZmlsZSB0byBiZQotaW5zdGFsbGVkLgotCi1Abm9kZSBEaXJlY3RvcnkgVmFyaWFibGVzCi1Ac2VjdGlvbiBWYXJpYWJsZXMgZm9yIEluc3RhbGxhdGlvbiBEaXJlY3RvcmllcwotCi1JbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgc2hvdWxkIGFsd2F5cyBiZSBuYW1lZCBieSB2YXJpYWJsZXMsIHNvIGl0IGlzCi1lYXN5IHRvIGluc3RhbGwgaW4gYSBub25zdGFuZGFyZCBwbGFjZS4gIFRoZSBzdGFuZGFyZCBuYW1lcyBmb3IgdGhlc2UKLXZhcmlhYmxlcyBhcmUgZGVzY3JpYmVkIGJlbG93LiAgVGhleSBhcmUgYmFzZWQgb24gYSBzdGFuZGFyZCBmaWxlc3lzdGVtCi1sYXlvdXQ7IHZhcmlhbnRzIG9mIGl0IGFyZSB1c2VkIGluIFNWUjQsIDQuNEJTRCwgTGludXgsIFVsdHJpeCB2NCwgYW5kCi1vdGhlciBtb2Rlcm4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLVRoZXNlIHR3byB2YXJpYWJsZXMgc2V0IHRoZSByb290IGZvciB0aGUgaW5zdGFsbGF0aW9uLiAgQWxsIHRoZSBvdGhlcgotaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHNob3VsZCBiZSBzdWJkaXJlY3RvcmllcyBvZiBvbmUgb2YgdGhlc2UgdHdvLAotYW5kIG5vdGhpbmcgc2hvdWxkIGJlIGRpcmVjdGx5IGluc3RhbGxlZCBpbnRvIHRoZXNlIHR3byBkaXJlY3Rvcmllcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBwcmVmaXgKLUEgcHJlZml4IHVzZWQgaW4gY29uc3RydWN0aW5nIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgdmFyaWFibGVzIGxpc3RlZAotYmVsb3cuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtwcmVmaXh9IHNob3VsZCBiZSBAZmlsZXsvdXNyL2xvY2FsfS4KLVdoZW4gYnVpbGRpbmcgdGhlIGNvbXBsZXRlIEdOVSBzeXN0ZW0sIHRoZSBwcmVmaXggd2lsbCBiZSBlbXB0eSBhbmQKLUBmaWxley91c3J9IHdpbGwgYmUgYSBzeW1ib2xpYyBsaW5rIHRvIEBmaWxley99LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAcHJlZml4QEB9LikKLQotUnVubmluZyBAc2FtcHttYWtlIGluc3RhbGx9IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgb2YgQGNvZGV7cHJlZml4fQotZnJvbSB0aGUgb25lIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW0gc2hvdWxkIEB2YXJ7bm90fSByZWNvbXBpbGUKLXRoZSBwcm9ncmFtLgotCi1AaXRlbSBleGVjX3ByZWZpeAotQSBwcmVmaXggdXNlZCBpbiBjb25zdHJ1Y3RpbmcgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHNvbWUgb2YgdGhlCi12YXJpYWJsZXMgbGlzdGVkIGJlbG93LiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7ZXhlY19wcmVmaXh9IHNob3VsZAotYmUgQGNvZGV7JChwcmVmaXgpfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGV4ZWNfcHJlZml4QEB9LikKLQotR2VuZXJhbGx5LCBAY29kZXskKGV4ZWNfcHJlZml4KX0gaXMgdXNlZCBmb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCi1tYWNoaW5lLXNwZWNpZmljIGZpbGVzIChzdWNoIGFzIGV4ZWN1dGFibGVzIGFuZCBzdWJyb3V0aW5lIGxpYnJhcmllcyksCi13aGlsZSBAY29kZXskKHByZWZpeCl9IGlzIHVzZWQgZGlyZWN0bHkgZm9yIG90aGVyIGRpcmVjdG9yaWVzLgotCi1SdW5uaW5nIEBzYW1we21ha2UgaW5zdGFsbH0gd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBvZiBAY29kZXtleGVjX3ByZWZpeH0KLWZyb20gdGhlIG9uZSB1c2VkIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIHNob3VsZCBAdmFye25vdH0gcmVjb21waWxlIHRoZQotcHJvZ3JhbS4KLUBlbmQgdGFibGUKLQotRXhlY3V0YWJsZSBwcm9ncmFtcyBhcmUgaW5zdGFsbGVkIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGJpbmRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBleGVjdXRhYmxlIHByb2dyYW1zIHRoYXQgdXNlcnMgY2FuIHJ1bi4KLVRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvYmlufSwgYnV0IHdyaXRlIGl0IGFzCi1AZmlsZXskKGV4ZWNfcHJlZml4KS9iaW59LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAYmluZGlyQEB9LikKLQotQGl0ZW0gc2JpbmRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBleGVjdXRhYmxlIHByb2dyYW1zIHRoYXQgY2FuIGJlIHJ1biBmcm9tCi10aGUgc2hlbGwsIGJ1dCBhcmUgb25seSBnZW5lcmFsbHkgdXNlZnVsIHRvIHN5c3RlbSBhZG1pbmlzdHJhdG9ycy4gIFRoaXMKLXNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL3NiaW59LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQoZXhlY19wcmVmaXgpL3NiaW59LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc2JpbmRpckBAfS4pCi0KLUBpdGVtIGxpYmV4ZWNkaXIKLUBjb21tZW50IFRoaXMgcGFyYWdyYXBoIGFkanVzdGVkIHRvIGF2b2lkIG92ZXJmdWxsIGhib3ggLS1yb2xhbmQgNWp1bDk0Ci1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdG8gYmUgcnVuIGJ5IG90aGVyCi1wcm9ncmFtcyByYXRoZXIgdGhhbiBieSB1c2Vycy4gIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBub3JtYWxseSBiZQotQGZpbGV7L3Vzci9sb2NhbC9saWJleGVjfSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQoZXhlY19wcmVmaXgpL2xpYmV4ZWN9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbGliZXhlY2RpckBAfS4pCi1AZW5kIHRhYmxlCi0KLURhdGEgZmlsZXMgdXNlZCBieSB0aGUgcHJvZ3JhbSBkdXJpbmcgaXRzIGV4ZWN1dGlvbiBhcmUgZGl2aWRlZCBpbnRvCi1jYXRlZ29yaWVzIGluIHR3byB3YXlzLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotU29tZSBmaWxlcyBhcmUgbm9ybWFsbHkgbW9kaWZpZWQgYnkgcHJvZ3JhbXM7IG90aGVycyBhcmUgbmV2ZXIgbm9ybWFsbHkKLW1vZGlmaWVkICh0aG91Z2ggdXNlcnMgbWF5IGVkaXQgc29tZSBvZiB0aGVzZSkuCi0KLUBpdGVtCi1Tb21lIGZpbGVzIGFyZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgYW5kIGNhbiBiZSBzaGFyZWQgYnkgYWxsCi1tYWNoaW5lcyBhdCBhIHNpdGU7IHNvbWUgYXJlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgYW5kIGNhbiBiZSBzaGFyZWQKLW9ubHkgYnkgbWFjaGluZXMgb2YgdGhlIHNhbWUga2luZCBhbmQgb3BlcmF0aW5nIHN5c3RlbTsgb3RoZXJzIG1heSBuZXZlcgotYmUgc2hhcmVkIGJldHdlZW4gdHdvIG1hY2hpbmVzLgotQGVuZCBpdGVtaXplCi0KLVRoaXMgbWFrZXMgZm9yIHNpeCBkaWZmZXJlbnQgcG9zc2liaWxpdGllcy4gIEhvd2V2ZXIsIHdlIHdhbnQgdG8KLWRpc2NvdXJhZ2UgdGhlIHVzZSBvZiBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzLCBhc2lkZSBmcm9tIG9iamVjdAotZmlsZXMgYW5kIGxpYnJhcmllcy4gIEl0IGlzIG11Y2ggY2xlYW5lciB0byBtYWtlIG90aGVyIGRhdGEgZmlsZXMKLWFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCwgYW5kIGl0IGlzIGdlbmVyYWxseSBub3QgaGFyZC4KLQotVGhlcmVmb3JlLCBoZXJlIGFyZSB0aGUgdmFyaWFibGVzIE1ha2VmaWxlcyBzaG91bGQgdXNlIHRvIHNwZWNpZnkKLWRpcmVjdG9yaWVzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGRhdGFkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBkYXRhCi1maWxlcy4gIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvc2hhcmV9LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQocHJlZml4KS9zaGFyZX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBkYXRhZGlyQEB9LikKLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHNlZSBAZmlsZXskKGluZm9kaXIpfQotYW5kIEBmaWxleyQoaW5jbHVkZWRpcil9IGJlbG93LgotCi1AaXRlbSBzeXNjb25mZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHJlYWQtb25seSBkYXRhIGZpbGVzIHRoYXQgcGVydGFpbiB0byBhCi1zaW5nbGUgbWFjaGluZS0tdGhhdCBpcyB0byBzYXksIGZpbGVzIGZvciBjb25maWd1cmluZyBhIGhvc3QuICBNYWlsZXIKLWFuZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gZmlsZXMsIEBmaWxley9ldGMvcGFzc3dkfSwgYW5kIHNvIGZvcnRoIGJlbG9uZwotaGVyZS4gIEFsbCB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIG9yZGluYXJ5IEFTQ0lJIHRleHQKLWZpbGVzLiAgVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvZXRjfSwgYnV0Ci13cml0ZSBpdCBhcyBAZmlsZXskKHByZWZpeCkvZXRjfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQHN5c2NvbmZkaXJAQH0uKQotCi1EbyBub3QgaW5zdGFsbCBleGVjdXRhYmxlcyBoZXJlIGluIHRoaXMgZGlyZWN0b3J5ICh0aGV5IHByb2JhYmx5IGJlbG9uZwotaW4gQGZpbGV7JChsaWJleGVjZGlyKX0gb3IgQGZpbGV7JChzYmluZGlyKX0pLiAgQWxzbyBkbyBub3QgaW5zdGFsbAotZmlsZXMgdGhhdCBhcmUgbW9kaWZpZWQgaW4gdGhlIG5vcm1hbCBjb3Vyc2Ugb2YgdGhlaXIgdXNlIChwcm9ncmFtcwotd2hvc2UgcHVycG9zZSBpcyB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN5c3RlbSBleGNsdWRlZCkuCi1UaG9zZSBwcm9iYWJseSBiZWxvbmcgaW4gQGZpbGV7JChsb2NhbHN0YXRlZGlyKX0uCi0KLUBpdGVtIHNoYXJlZHN0YXRlZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGZpbGVzIHdoaWNoCi10aGUgcHJvZ3JhbXMgbW9kaWZ5IHdoaWxlIHRoZXkgcnVuLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUKLUBmaWxley91c3IvbG9jYWwvY29tfSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9jb219LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc2hhcmVkc3RhdGVkaXJAQH0uKQotCi1AaXRlbSBsb2NhbHN0YXRlZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGRhdGEgZmlsZXMgd2hpY2ggdGhlIHByb2dyYW1zIG1vZGlmeSB3aGlsZQotdGhleSBydW4sIGFuZCB0aGF0IHBlcnRhaW4gdG8gb25lIHNwZWNpZmljIG1hY2hpbmUuICBVc2VycyBzaG91bGQgbmV2ZXIKLW5lZWQgdG8gbW9kaWZ5IGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSdzCi1vcGVyYXRpb247IHB1dCBzdWNoIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gc2VwYXJhdGUgZmlsZXMgdGhhdCBnbwotaW4gQGZpbGV7JChkYXRhZGlyKX0gb3IgQGZpbGV7JChzeXNjb25mZGlyKX0uICBAZmlsZXskKGxvY2Fsc3RhdGVkaXIpfQotc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvdmFyfSwgYnV0IHdyaXRlIGl0IGFzCi1AZmlsZXskKHByZWZpeCkvdmFyfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGxvY2Fsc3RhdGVkaXJAQH0uKQotCi1AaXRlbSBsaWJkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIG9iamVjdCBmaWxlcyBhbmQgbGlicmFyaWVzIG9mIG9iamVjdCBjb2RlLiAgRG8gbm90Ci1pbnN0YWxsIGV4ZWN1dGFibGVzIGhlcmUsIHRoZXkgcHJvYmFibHkgb3VnaHQgdG8gZ28gaW4gQGZpbGV7JChsaWJleGVjZGlyKX0KLWluc3RlYWQuICBUaGUgdmFsdWUgb2YgQGNvZGV7bGliZGlyfSBzaG91bGQgbm9ybWFsbHkgYmUKLUBmaWxley91c3IvbG9jYWwvbGlifSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQoZXhlY19wcmVmaXgpL2xpYn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBsaWJkaXJAQH0uKQotCi1AaXRlbSBpbmZvZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBJbmZvIGZpbGVzIGZvciB0aGlzIHBhY2thZ2UuICBCeQotZGVmYXVsdCwgaXQgc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWwvaW5mb30sIGJ1dCBpdCBzaG91bGQgYmUgd3JpdHRlbgotYXMgQGZpbGV7JChwcmVmaXgpL2luZm99LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAaW5mb2RpckBAfS4pCi0KLUBpdGVtIGxpc3BkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgYW55IEVtYWNzIExpc3AgZmlsZXMgaW4gdGhpcyBwYWNrYWdlLiAgQnkKLWRlZmF1bHQsIGl0IHNob3VsZCBiZSBAZmlsZXsvdXNyL2xvY2FsL3NoYXJlL2VtYWNzL3NpdGUtbGlzcH0sIGJ1dCBpdAotc2hvdWxkIGJlIHdyaXR0ZW4gYXMgQGZpbGV7JChwcmVmaXgpL3NoYXJlL2VtYWNzL3NpdGUtbGlzcH0uCi0KLUlmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIHRoZSBkZWZhdWx0IGFzIEBzYW1we0BAbGlzcGRpckBAfS4KLUluIG9yZGVyIHRvIG1ha2UgQHNhbXB7QEBsaXNwZGlyQEB9IHdvcmssIHlvdSBuZWVkIHRoZSBmb2xsb3dpbmcgbGluZXMKLWluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlOgotCi1AZXhhbXBsZQotbGlzcGRpcj0nJEB7ZGF0YWRpckB9L2VtYWNzL3NpdGUtbGlzcCcKLUFDX1NVQlNUKGxpc3BkaXIpCi1AZW5kIGV4YW1wbGUKLQotQGl0ZW0gaW5jbHVkZWRpcgotQGMgcmV3cml0dGVuIHRvIGF2b2lkIG92ZXJmdWxsIGhib3ggLS1yb2xhbmQKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgaGVhZGVyIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGJ5IHVzZXIKLXByb2dyYW1zIHdpdGggdGhlIEMgQHNhbXB7I2luY2x1ZGV9IHByZXByb2Nlc3NvciBkaXJlY3RpdmUuICBUaGlzCi1zaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlfSwgYnV0IHdyaXRlIGl0IGFzCi1AZmlsZXskKHByZWZpeCkvaW5jbHVkZX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBpbmNsdWRlZGlyQEB9LikKLQotTW9zdCBjb21waWxlcnMgb3RoZXIgdGhhbiBHQ0MgZG8gbm90IGxvb2sgZm9yIGhlYWRlciBmaWxlcyBpbiBkaXJlY3RvcnkKLUBmaWxley91c3IvbG9jYWwvaW5jbHVkZX0uICBTbyBpbnN0YWxsaW5nIHRoZSBoZWFkZXIgZmlsZXMgdGhpcyB3YXkgaXMKLW9ubHkgdXNlZnVsIHdpdGggR0NDLiAgU29tZXRpbWVzIHRoaXMgaXMgbm90IGEgcHJvYmxlbSBiZWNhdXNlIHNvbWUKLWxpYnJhcmllcyBhcmUgb25seSByZWFsbHkgaW50ZW5kZWQgdG8gd29yayB3aXRoIEdDQy4gIEJ1dCBzb21lIGxpYnJhcmllcwotYXJlIGludGVuZGVkIHRvIHdvcmsgd2l0aCBvdGhlciBjb21waWxlcnMuICBUaGV5IHNob3VsZCBpbnN0YWxsIHRoZWlyCi1oZWFkZXIgZmlsZXMgaW4gdHdvIHBsYWNlcywgb25lIHNwZWNpZmllZCBieSBAY29kZXtpbmNsdWRlZGlyfSBhbmQgb25lCi1zcGVjaWZpZWQgYnkgQGNvZGV7b2xkaW5jbHVkZWRpcn0uCi0KLUBpdGVtIG9sZGluY2x1ZGVkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgQHNhbXB7I2luY2x1ZGV9IGhlYWRlciBmaWxlcyBmb3IgdXNlIHdpdGgKLWNvbXBpbGVycyBvdGhlciB0aGFuIEdDQy4gIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvaW5jbHVkZX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgeW91IGNhbiB3cml0ZSBpdCBhcyBAc2FtcHtAQG9sZGluY2x1ZGVkaXJAQH0uKQotCi1UaGUgTWFrZWZpbGUgY29tbWFuZHMgc2hvdWxkIGNoZWNrIHdoZXRoZXIgdGhlIHZhbHVlIG9mCi1AY29kZXtvbGRpbmNsdWRlZGlyfSBpcyBlbXB0eS4gIElmIGl0IGlzLCB0aGV5IHNob3VsZCBub3QgdHJ5IHRvIHVzZQotaXQ7IHRoZXkgc2hvdWxkIGNhbmNlbCB0aGUgc2Vjb25kIGluc3RhbGxhdGlvbiBvZiB0aGUgaGVhZGVyIGZpbGVzLgotCi1BIHBhY2thZ2Ugc2hvdWxkIG5vdCByZXBsYWNlIGFuIGV4aXN0aW5nIGhlYWRlciBpbiB0aGlzIGRpcmVjdG9yeSB1bmxlc3MKLXRoZSBoZWFkZXIgY2FtZSBmcm9tIHRoZSBzYW1lIHBhY2thZ2UuICBUaHVzLCBpZiB5b3VyIEZvbyBwYWNrYWdlCi1wcm92aWRlcyBhIGhlYWRlciBmaWxlIEBmaWxle2Zvby5ofSwgdGhlbiBpdCBzaG91bGQgaW5zdGFsbCB0aGUgaGVhZGVyCi1maWxlIGluIHRoZSBAY29kZXtvbGRpbmNsdWRlZGlyfSBkaXJlY3RvcnkgaWYgZWl0aGVyICgxKSB0aGVyZSBpcyBubwotQGZpbGV7Zm9vLmh9IHRoZXJlIG9yICgyKSB0aGUgQGZpbGV7Zm9vLmh9IHRoYXQgZXhpc3RzIGNhbWUgZnJvbSB0aGUgRm9vCi1wYWNrYWdlLgotCi1UbyB0ZWxsIHdoZXRoZXIgQGZpbGV7Zm9vLmh9IGNhbWUgZnJvbSB0aGUgRm9vIHBhY2thZ2UsIHB1dCBhIG1hZ2ljCi1zdHJpbmcgaW4gdGhlIGZpbGUtLS1wYXJ0IG9mIGEgY29tbWVudC0tLWFuZCBAY29kZXtncmVwfSBmb3IgdGhhdCBzdHJpbmcuCi1AZW5kIHRhYmxlCi0KLVVuaXgtc3R5bGUgbWFuIHBhZ2VzIGFyZSBpbnN0YWxsZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gbWFuZGlyCi1UaGUgdG9wLWxldmVsIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgbWFuIHBhZ2VzIChpZiBhbnkpIGZvciB0aGlzCi1wYWNrYWdlLiAgSXQgd2lsbCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL21hbn0sIGJ1dCB5b3Ugc2hvdWxkCi13cml0ZSBpdCBhcyBAZmlsZXskKHByZWZpeCkvbWFufS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQG1hbmRpckBAfS4pCi0KLUBpdGVtIG1hbjFkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgc2VjdGlvbiAxIG1hbiBwYWdlcy4gIFdyaXRlIGl0IGFzCi1AZmlsZXskKG1hbmRpcikvbWFuMX0uCi1AaXRlbSBtYW4yZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHNlY3Rpb24gMiBtYW4gcGFnZXMuICBXcml0ZSBpdCBhcwotQGZpbGV7JChtYW5kaXIpL21hbjJ9Ci1AaXRlbSBAZG90c3t9Ci0KLUBzdHJvbmd7RG9uJ3QgbWFrZSB0aGUgcHJpbWFyeSBkb2N1bWVudGF0aW9uIGZvciBhbnkgR05VIHNvZnR3YXJlIGJlIGEKLW1hbiBwYWdlLiAgV3JpdGUgYSBtYW51YWwgaW4gVGV4aW5mbyBpbnN0ZWFkLiAgTWFuIHBhZ2VzIGFyZSBqdXN0IGZvcgotdGhlIHNha2Ugb2YgcGVvcGxlIHJ1bm5pbmcgR05VIHNvZnR3YXJlIG9uIFVuaXgsIHdoaWNoIGlzIGEgc2Vjb25kYXJ5Ci1hcHBsaWNhdGlvbiBvbmx5Ln0KLQotQGl0ZW0gbWFuZXh0Ci1UaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgdGhlIGluc3RhbGxlZCBtYW4gcGFnZS4gIFRoaXMgc2hvdWxkIGNvbnRhaW4KLWEgcGVyaW9kIGZvbGxvd2VkIGJ5IHRoZSBhcHByb3ByaWF0ZSBkaWdpdDsgaXQgc2hvdWxkIG5vcm1hbGx5IGJlIEBzYW1wey4xfS4KLQotQGl0ZW0gbWFuMWV4dAotVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gZm9yIGluc3RhbGxlZCBzZWN0aW9uIDEgbWFuIHBhZ2VzLgotQGl0ZW0gbWFuMmV4dAotVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gZm9yIGluc3RhbGxlZCBzZWN0aW9uIDIgbWFuIHBhZ2VzLgotQGl0ZW0gQGRvdHN7fQotVXNlIHRoZXNlIG5hbWVzIGluc3RlYWQgb2YgQHNhbXB7bWFuZXh0fSBpZiB0aGUgcGFja2FnZSBuZWVkcyB0byBpbnN0YWxsIG1hbgotcGFnZXMgaW4gbW9yZSB0aGFuIG9uZSBzZWN0aW9uIG9mIHRoZSBtYW51YWwuCi1AZW5kIHRhYmxlCi0KLUFuZCBmaW5hbGx5LCB5b3Ugc2hvdWxkIHNldCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIHNyY2RpcgotVGhlIGRpcmVjdG9yeSBmb3IgdGhlIHNvdXJjZXMgYmVpbmcgY29tcGlsZWQuICBUaGUgdmFsdWUgb2YgdGhpcwotdmFyaWFibGUgaXMgbm9ybWFsbHkgaW5zZXJ0ZWQgYnkgdGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2hlbGwgc2NyaXB0LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0Y29uZiwgdXNlIEBzYW1we3NyY2RpciA9IEBAc3JjZGlyQEB9LikKLUBlbmQgdGFibGUKLQotRm9yIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLUBjIEkgaGF2ZSBjaGFuZ2VkIHNvbWUgb2YgdGhlIGNvbW1lbnRzIGhlcmUgc2xpZ2h0bHkgdG8gZml4IGFuIG92ZXJmdWxsCi1AYyBoYm94LCBzbyB0aGUgbWFrZSBtYW51YWwgY2FuIGZvcm1hdCBjb3JyZWN0bHkuIC0tcm9sYW5kCi0jIENvbW1vbiBwcmVmaXggZm9yIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLSMgTk9URTogVGhpcyBkaXJlY3RvcnkgbXVzdCBleGlzdCB3aGVuIHlvdSBzdGFydCB0aGUgaW5zdGFsbC4KLXByZWZpeCA9IC91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0jIFdoZXJlIHRvIHB1dCB0aGUgZXhlY3V0YWJsZSBmb3IgdGhlIGNvbW1hbmQgYGdjYycuCi1iaW5kaXIgPSAkKGV4ZWNfcHJlZml4KS9iaW4KLSMgV2hlcmUgdG8gcHV0IHRoZSBkaXJlY3RvcmllcyB1c2VkIGJ5IHRoZSBjb21waWxlci4KLWxpYmV4ZWNkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWJleGVjCi0jIFdoZXJlIHRvIHB1dCB0aGUgSW5mbyBmaWxlcy4KLWluZm9kaXIgPSAkKHByZWZpeCkvaW5mbwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91ciBwcm9ncmFtIGluc3RhbGxzIGEgbGFyZ2UgbnVtYmVyIG9mIGZpbGVzIGludG8gb25lIG9mIHRoZQotc3RhbmRhcmQgdXNlci1zcGVjaWZpZWQgZGlyZWN0b3JpZXMsIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBncm91cCB0aGVtCi1pbnRvIGEgc3ViZGlyZWN0b3J5IHBhcnRpY3VsYXIgdG8gdGhhdCBwcm9ncmFtLiAgSWYgeW91IGRvIHRoaXMsIHlvdQotc2hvdWxkIHdyaXRlIHRoZSBAY29kZXtpbnN0YWxsfSBydWxlIHRvIGNyZWF0ZSB0aGVzZSBzdWJkaXJlY3Rvcmllcy4KLQotRG8gbm90IGV4cGVjdCB0aGUgdXNlciB0byBpbmNsdWRlIHRoZSBzdWJkaXJlY3RvcnkgbmFtZSBpbiB0aGUgdmFsdWUgb2YKLWFueSBvZiB0aGUgdmFyaWFibGVzIGxpc3RlZCBhYm92ZS4gIFRoZSBpZGVhIG9mIGhhdmluZyBhIHVuaWZvcm0gc2V0IG9mCi12YXJpYWJsZSBuYW1lcyBmb3IgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGlzIHRvIGVuYWJsZSB0aGUgdXNlciB0bwotc3BlY2lmeSB0aGUgZXhhY3Qgc2FtZSB2YWx1ZXMgZm9yIHNldmVyYWwgZGlmZmVyZW50IEdOVSBwYWNrYWdlcy4gIEluCi1vcmRlciBmb3IgdGhpcyB0byBiZSB1c2VmdWwsIGFsbCB0aGUgcGFja2FnZXMgbXVzdCBiZSBkZXNpZ25lZCBzbyB0aGF0Ci10aGV5IHdpbGwgd29yayBzZW5zaWJseSB3aGVuIHRoZSB1c2VyIGRvZXMgc28uCi0KLUBub2RlIFN0YW5kYXJkIFRhcmdldHMKLUBzZWN0aW9uIFN0YW5kYXJkIFRhcmdldHMgZm9yIFVzZXJzCi0KLUFsbCBHTlUgcHJvZ3JhbXMgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyB0YXJnZXRzIGluIHRoZWlyIE1ha2VmaWxlczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBhbGwKLUNvbXBpbGUgdGhlIGVudGlyZSBwcm9ncmFtLiAgVGhpcyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0LiAgVGhpcwotdGFyZ2V0IG5lZWQgbm90IHJlYnVpbGQgYW55IGRvY3VtZW50YXRpb24gZmlsZXM7IEluZm8gZmlsZXMgc2hvdWxkCi1ub3JtYWxseSBiZSBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgRFZJIGZpbGVzIHNob3VsZCBiZSBtYWRlCi1vbmx5IHdoZW4gZXhwbGljaXRseSBhc2tlZCBmb3IuCi0KLUJ5IGRlZmF1bHQsIHRoZSBNYWtlIHJ1bGVzIHNob3VsZCBjb21waWxlIGFuZCBsaW5rIHdpdGggQHNhbXB7LWd9LCBzbwotdGhhdCBleGVjdXRhYmxlIHByb2dyYW1zIGhhdmUgZGVidWdnaW5nIHN5bWJvbHMuICBVc2VycyB3aG8gZG9uJ3QgbWluZAotYmVpbmcgaGVscGxlc3MgY2FuIHN0cmlwIHRoZSBleGVjdXRhYmxlcyBsYXRlciBpZiB0aGV5IHdpc2guCi0KLUBpdGVtIGluc3RhbGwKLUNvbXBpbGUgdGhlIHByb2dyYW0gYW5kIGNvcHkgdGhlIGV4ZWN1dGFibGVzLCBsaWJyYXJpZXMsIGFuZCBzbyBvbiB0bwotdGhlIGZpbGUgbmFtZXMgd2hlcmUgdGhleSBzaG91bGQgcmVzaWRlIGZvciBhY3R1YWwgdXNlLiAgSWYgdGhlcmUgaXMgYQotc2ltcGxlIHRlc3QgdG8gdmVyaWZ5IHRoYXQgYSBwcm9ncmFtIGlzIHByb3Blcmx5IGluc3RhbGxlZCwgdGhpcyB0YXJnZXQKLXNob3VsZCBydW4gdGhhdCB0ZXN0LgotCi1EbyBub3Qgc3RyaXAgZXhlY3V0YWJsZXMgd2hlbiBpbnN0YWxsaW5nIHRoZW0uICBEZXZpbC1tYXktY2FyZSB1c2VycyBjYW4KLXVzZSB0aGUgQGNvZGV7aW5zdGFsbC1zdHJpcH0gdGFyZ2V0IHRvIGRvIHRoYXQuCi0KLUlmIHBvc3NpYmxlLCB3cml0ZSB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0IHJ1bGUgc28gdGhhdCBpdCBkb2VzIG5vdAotbW9kaWZ5IGFueXRoaW5nIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHByb2dyYW0gd2FzIGJ1aWx0LCBwcm92aWRlZAotQHNhbXB7bWFrZSBhbGx9IGhhcyBqdXN0IGJlZW4gZG9uZS4gIFRoaXMgaXMgY29udmVuaWVudCBmb3IgYnVpbGRpbmcgdGhlCi1wcm9ncmFtIHVuZGVyIG9uZSB1c2VyIG5hbWUgYW5kIGluc3RhbGxpbmcgaXQgdW5kZXIgYW5vdGhlci4KLQotVGhlIGNvbW1hbmRzIHNob3VsZCBjcmVhdGUgYWxsIHRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCBmaWxlcyBhcmUgdG8gYmUKLWluc3RhbGxlZCwgaWYgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0LiAgVGhpcyBpbmNsdWRlcyB0aGUgZGlyZWN0b3JpZXMKLXNwZWNpZmllZCBhcyB0aGUgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZXMgQGNvZGV7cHJlZml4fSBhbmQKLUBjb2Rle2V4ZWNfcHJlZml4fSwgYXMgd2VsbCBhcyBhbGwgc3ViZGlyZWN0b3JpZXMgdGhhdCBhcmUgbmVlZGVkLgotT25lIHdheSB0byBkbyB0aGlzIGlzIGJ5IG1lYW5zIG9mIGFuIEBjb2Rle2luc3RhbGxkaXJzfSB0YXJnZXQKLWFzIGRlc2NyaWJlZCBiZWxvdy4KLQotVXNlIEBzYW1wey19IGJlZm9yZSBhbnkgY29tbWFuZCBmb3IgaW5zdGFsbGluZyBhIG1hbiBwYWdlLCBzbyB0aGF0Ci1AY29kZXttYWtlfSB3aWxsIGlnbm9yZSBhbnkgZXJyb3JzLiAgVGhpcyBpcyBpbiBjYXNlIHRoZXJlIGFyZSBzeXN0ZW1zCi10aGF0IGRvbid0IGhhdmUgdGhlIFVuaXggbWFuIHBhZ2UgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW5zdGFsbGVkLgotCi1UaGUgd2F5IHRvIGluc3RhbGwgSW5mbyBmaWxlcyBpcyB0byBjb3B5IHRoZW0gaW50byBAZmlsZXskKGluZm9kaXIpfQotd2l0aCBAY29kZXskKElOU1RBTExfREFUQSl9IChAcHhyZWZ7Q29tbWFuZCBWYXJpYWJsZXN9KSwgYW5kIHRoZW4gcnVuCi10aGUgQGNvZGV7aW5zdGFsbC1pbmZvfSBwcm9ncmFtIGlmIGl0IGlzIHByZXNlbnQuICBAY29kZXtpbnN0YWxsLWluZm99Ci1pcyBhIHByb2dyYW0gdGhhdCBlZGl0cyB0aGUgSW5mbyBAZmlsZXtkaXJ9IGZpbGUgdG8gYWRkIG9yIHVwZGF0ZSB0aGUKLW1lbnUgZW50cnkgZm9yIHRoZSBnaXZlbiBJbmZvIGZpbGU7IGl0IGlzIHBhcnQgb2YgdGhlIFRleGluZm8gcGFja2FnZS4KLUhlcmUgaXMgYSBzYW1wbGUgcnVsZSB0byBpbnN0YWxsIGFuIEluZm8gZmlsZToKLQotQGNvbW1lbnQgVGhpcyBleGFtcGxlIGhhcyBiZWVuIGNhcmVmdWxseSBmb3JtYXR0ZWQgZm9yIHRoZSBNYWtlIG1hbnVhbC4KLUBjb21tZW50IFBsZWFzZSBkbyBub3QgcmVmb3JtYXQgaXQgd2l0aG91dCB0YWxraW5nIHRvIHJvbGFuZEBnbnUuYWkubWl0LmVkdS4KLUBzbWFsbGV4YW1wbGUKLSQoREVTVERJUikkKGluZm9kaXIpL2Zvby5pbmZvOiBmb28uaW5mbwotICAgICAgICAkKFBPU1RfSU5TVEFMTCkKLSMgVGhlcmUgbWF5IGJlIGEgbmV3ZXIgaW5mbyBmaWxlIGluIC4gdGhhbiBpbiBzcmNkaXIuCi0gICAgICAgIC1pZiB0ZXN0IC1mIGZvby5pbmZvOyB0aGVuIGQ9LjsgXAotICAgICAgICAgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLSAgICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC9mb28uaW5mbyAkKERFU1RESVIpJEBAOyBcCi0jIFJ1biBpbnN0YWxsLWluZm8gb25seSBpZiBpdCBleGlzdHMuCi0jIFVzZSBgaWYnIGluc3RlYWQgb2YganVzdCBwcmVwZW5kaW5nIGAtJyB0byB0aGUKLSMgbGluZSBzbyB3ZSBub3RpY2UgcmVhbCBlcnJvcnMgZnJvbSBpbnN0YWxsLWluZm8uCi0jIFdlIHVzZSBgJChTSEVMTCkgLWMnIGJlY2F1c2Ugc29tZSBzaGVsbHMgZG8gbm90Ci0jIGZhaWwgZ3JhY2VmdWxseSB3aGVuIHRoZXJlIGlzIGFuIHVua25vd24gY29tbWFuZC4KLSAgICAgICAgaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24nIFwKLSAgICAgICAgICAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLSAgICAgICAgICBpbnN0YWxsLWluZm8gLS1kaXItZmlsZT0kKERFU1RESVIpJChpbmZvZGlyKS9kaXIgXAotICAgICAgICAgICAgICAgICAgICAgICAkKERFU1RESVIpJChpbmZvZGlyKS9mb28uaW5mbzsgXAotICAgICAgICBlbHNlIHRydWU7IGZpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1XaGVuIHdyaXRpbmcgdGhlIEBjb2Rle2luc3RhbGx9IHRhcmdldCwgeW91IG11c3QgY2xhc3NpZnkgYWxsIHRoZQotY29tbWFuZHMgaW50byB0aHJlZSBjYXRlZ29yaWVzOiBub3JtYWwgb25lcywgQGRmbntwcmUtaW5zdGFsbGF0aW9ufQotY29tbWFuZHMgYW5kIEBkZm57cG9zdC1pbnN0YWxsYXRpb259IGNvbW1hbmRzLiAgQHhyZWZ7SW5zdGFsbCBDb21tYW5kCi1DYXRlZ29yaWVzfS4KLQotQGl0ZW0gdW5pbnN0YWxsCi1EZWxldGUgYWxsIHRoZSBpbnN0YWxsZWQgZmlsZXMtLS10aGUgY29waWVzIHRoYXQgdGhlIEBzYW1we2luc3RhbGx9Ci10YXJnZXQgY3JlYXRlcy4KLQotVGhpcyBydWxlIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBjb21waWxhdGlvbiBpcyBkb25lLAotb25seSB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgZmlsZXMgYXJlIGluc3RhbGxlZC4KLQotVGhlIHVuaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSBkaXZpZGVkIGludG8gdGhyZWUgY2F0ZWdvcmllcywganVzdCBsaWtlCi10aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgQHhyZWZ7SW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXN9LgotCi1AaXRlbSBpbnN0YWxsLXN0cmlwCi1MaWtlIEBjb2Rle2luc3RhbGx9LCBidXQgc3RyaXAgdGhlIGV4ZWN1dGFibGUgZmlsZXMgd2hpbGUgaW5zdGFsbGluZwotdGhlbS4gIEluIG1hbnkgY2FzZXMsIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgdGFyZ2V0IGNhbiBiZSB2ZXJ5IHNpbXBsZToKLQotQHNtYWxsZXhhbXBsZQotaW5zdGFsbC1zdHJpcDoKLSAgICAgICAgJChNQUtFKSBJTlNUQUxMX1BST0dSQU09JyQoSU5TVEFMTF9QUk9HUkFNKSAtcycgXAotICAgICAgICAgICAgICAgIGluc3RhbGwKLUBlbmQgc21hbGxleGFtcGxlCi0KLU5vcm1hbGx5IHdlIGRvIG5vdCByZWNvbW1lbmQgc3RyaXBwaW5nIGFuIGV4ZWN1dGFibGUgdW5sZXNzIHlvdSBhcmUgc3VyZQotdGhlIHByb2dyYW0gaGFzIG5vIGJ1Z3MuICBIb3dldmVyLCBpdCBjYW4gYmUgcmVhc29uYWJsZSB0byBpbnN0YWxsIGEKLXN0cmlwcGVkIGV4ZWN1dGFibGUgZm9yIGFjdHVhbCBleGVjdXRpb24gd2hpbGUgc2F2aW5nIHRoZSB1bnN0cmlwcGVkCi1leGVjdXRhYmxlIGVsc2V3aGVyZSBpbiBjYXNlIHRoZXJlIGlzIGEgYnVnLgotCi1AY29tbWVudCBUaGUgZ3JhdHVpdG91cyBibGFuayBsaW5lIGhlcmUgaXMgdG8gbWFrZSB0aGUgdGFibGUgbG9vayBiZXR0ZXIKLUBjb21tZW50IGluIHRoZSBwcmludGVkIE1ha2UgbWFudWFsLiAgUGxlYXNlIGxlYXZlIGl0IGluLgotQGl0ZW0gY2xlYW4KLQotRGVsZXRlIGFsbCBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGFyZSBub3JtYWxseSBjcmVhdGVkIGJ5Ci1idWlsZGluZyB0aGUgcHJvZ3JhbS4gIERvbid0IGRlbGV0ZSB0aGUgZmlsZXMgdGhhdCByZWNvcmQgdGhlCi1jb25maWd1cmF0aW9uLiAgQWxzbyBwcmVzZXJ2ZSBmaWxlcyB0aGF0IGNvdWxkIGJlIG1hZGUgYnkgYnVpbGRpbmcsIGJ1dAotbm9ybWFsbHkgYXJlbid0IGJlY2F1c2UgdGhlIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIHRoZW0uCi0KLURlbGV0ZSBAZmlsZXsuZHZpfSBmaWxlcyBoZXJlIGlmIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkaXN0cmlidXRpb24uCi0KLUBpdGVtIGRpc3RjbGVhbgotRGVsZXRlIGFsbCBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGFyZSBjcmVhdGVkIGJ5Ci1jb25maWd1cmluZyBvciBidWlsZGluZyB0aGUgcHJvZ3JhbS4gIElmIHlvdSBoYXZlIHVucGFja2VkIHRoZSBzb3VyY2UKLWFuZCBidWlsdCB0aGUgcHJvZ3JhbSB3aXRob3V0IGNyZWF0aW5nIGFueSBvdGhlciBmaWxlcywgQHNhbXB7bWFrZQotZGlzdGNsZWFufSBzaG91bGQgbGVhdmUgb25seSB0aGUgZmlsZXMgdGhhdCB3ZXJlIGluIHRoZSBkaXN0cmlidXRpb24uCi0KLUBpdGVtIG1vc3RseWNsZWFuCi1MaWtlIEBzYW1we2NsZWFufSwgYnV0IG1heSByZWZyYWluIGZyb20gZGVsZXRpbmcgYSBmZXcgZmlsZXMgdGhhdCBwZW9wbGUKLW5vcm1hbGx5IGRvbid0IHdhbnQgdG8gcmVjb21waWxlLiAgRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHttb3N0bHljbGVhbn0KLXRhcmdldCBmb3IgR0NDIGRvZXMgbm90IGRlbGV0ZSBAZmlsZXtsaWJnY2MuYX0sIGJlY2F1c2UgcmVjb21waWxpbmcgaXQKLWlzIHJhcmVseSBuZWNlc3NhcnkgYW5kIHRha2VzIGEgbG90IG9mIHRpbWUuCi0KLUBpdGVtIG1haW50YWluZXItY2xlYW4KLURlbGV0ZSBhbG1vc3QgZXZlcnl0aGluZyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGNhbiBiZQotcmVjb25zdHJ1Y3RlZCB3aXRoIHRoaXMgTWFrZWZpbGUuICBUaGlzIHR5cGljYWxseSBpbmNsdWRlcyBldmVyeXRoaW5nCi1kZWxldGVkIGJ5IEBjb2Rle2Rpc3RjbGVhbn0sIHBsdXMgbW9yZTogQyBzb3VyY2UgZmlsZXMgcHJvZHVjZWQgYnkKLUJpc29uLCB0YWdzIHRhYmxlcywgSW5mbyBmaWxlcywgYW5kIHNvIG9uLgotCi1UaGUgcmVhc29uIHdlIHNheSBgYGFsbW9zdCBldmVyeXRoaW5nJycgaXMgdGhhdCBydW5uaW5nIHRoZSBjb21tYW5kCi1Ac2FtcHttYWtlIG1haW50YWluZXItY2xlYW59IHNob3VsZCBub3QgZGVsZXRlIEBmaWxle2NvbmZpZ3VyZX0gZXZlbiBpZgotQGZpbGV7Y29uZmlndXJlfSBjYW4gYmUgcmVtYWRlIHVzaW5nIGEgcnVsZSBpbiB0aGUgTWFrZWZpbGUuICBNb3JlIGdlbmVyYWxseSwKLUBzYW1we21ha2UgbWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkIG5vdCBkZWxldGUgYW55dGhpbmcgdGhhdCBuZWVkcyB0bwotZXhpc3QgaW4gb3JkZXIgdG8gcnVuIEBmaWxle2NvbmZpZ3VyZX0gYW5kIHRoZW4gYmVnaW4gdG8gYnVpbGQgdGhlCi1wcm9ncmFtLiAgVGhpcyBpcyB0aGUgb25seSBleGNlcHRpb247IEBjb2Rle21haW50YWluZXItY2xlYW59IHNob3VsZAotZGVsZXRlIGV2ZXJ5dGhpbmcgZWxzZSB0aGF0IGNhbiBiZSByZWJ1aWx0LgotCi1UaGUgQHNhbXB7bWFpbnRhaW5lci1jbGVhbn0gdGFyZ2V0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgYSBtYWludGFpbmVyIG9mCi10aGUgcGFja2FnZSwgbm90IGJ5IG9yZGluYXJ5IHVzZXJzLiAgWW91IG1heSBuZWVkIHNwZWNpYWwgdG9vbHMgdG8KLXJlY29uc3RydWN0IHNvbWUgb2YgdGhlIGZpbGVzIHRoYXQgQHNhbXB7bWFrZSBtYWludGFpbmVyLWNsZWFufSBkZWxldGVzLgotU2luY2UgdGhlc2UgZmlsZXMgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sIHdlIGRvbid0Ci10YWtlIGNhcmUgdG8gbWFrZSB0aGVtIGVhc3kgdG8gcmVjb25zdHJ1Y3QuICBJZiB5b3UgZmluZCB5b3UgbmVlZCB0bwotdW5wYWNrIHRoZSBmdWxsIGRpc3RyaWJ1dGlvbiBhZ2FpbiwgZG9uJ3QgYmxhbWUgdXMuCi0KLVRvIGhlbHAgbWFrZSB1c2VycyBhd2FyZSBvZiB0aGlzLCB0aGUgY29tbWFuZHMgZm9yIHRoZSBzcGVjaWFsCi1AY29kZXttYWludGFpbmVyLWNsZWFufSB0YXJnZXQgc2hvdWxkIHN0YXJ0IHdpdGggdGhlc2UgdHdvOgotCi1Ac21hbGxleGFtcGxlCi1AQGVjaG8gJ1RoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyBpdCcKLUBAZWNobyAnZGVsZXRlcyBmaWxlcyB0aGF0IG1heSBuZWVkIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4nCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBUQUdTCi1VcGRhdGUgYSB0YWdzIHRhYmxlIGZvciB0aGlzIHByb2dyYW0uCi1AYyBBRFI6IGhvdz8KLQotQGl0ZW0gaW5mbwotR2VuZXJhdGUgYW55IEluZm8gZmlsZXMgbmVlZGVkLiAgVGhlIGJlc3Qgd2F5IHRvIHdyaXRlIHRoZSBydWxlcyBpcyBhcwotZm9sbG93czoKLQotQHNtYWxsZXhhbXBsZQotaW5mbzogZm9vLmluZm8KLQotZm9vLmluZm86IGZvby50ZXhpIGNoYXAxLnRleGkgY2hhcDIudGV4aQotICAgICAgICAkKE1BS0VJTkZPKSAkKHNyY2RpcikvZm9vLnRleGkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotWW91IG11c3QgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtNQUtFSU5GT30gaW4gdGhlIE1ha2VmaWxlLiAgSXQgc2hvdWxkCi1ydW4gdGhlIEBjb2Rle21ha2VpbmZvfSBwcm9ncmFtLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBUZXhpbmZvCi1kaXN0cmlidXRpb24uCi0KLU5vcm1hbGx5IGEgR05VIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIEluZm8gZmlsZXMsIGFuZCB0aGF0IG1lYW5zIHRoZQotSW5mbyBmaWxlcyBhcmUgcHJlc2VudCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIFRoZXJlZm9yZSwgdGhlIE1ha2UKLXJ1bGUgZm9yIGFuIGluZm8gZmlsZSBzaG91bGQgdXBkYXRlIGl0IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgV2hlbgotdXNlcnMgYnVpbGQgdGhlIHBhY2thZ2UsIG9yZGluYXJpbHkgTWFrZSB3aWxsIG5vdCB1cGRhdGUgdGhlIEluZm8gZmlsZXMKLWJlY2F1c2UgdGhleSB3aWxsIGFscmVhZHkgYmUgdXAgdG8gZGF0ZS4KLQotQGl0ZW0gZHZpCi1HZW5lcmF0ZSBEVkkgZmlsZXMgZm9yIGFsbCBUZXhpbmZvIGRvY3VtZW50YXRpb24uCi1Gb3IgZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotZHZpOiBmb28uZHZpCi0KLWZvby5kdmk6IGZvby50ZXhpIGNoYXAxLnRleGkgY2hhcDIudGV4aQotICAgICAgICAkKFRFWEkyRFZJKSAkKHNyY2RpcikvZm9vLnRleGkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotWW91IG11c3QgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtURVhJMkRWSX0gaW4gdGhlIE1ha2VmaWxlLiAgSXQgc2hvdWxkCi1ydW4gdGhlIHByb2dyYW0gQGNvZGV7dGV4aTJkdml9LCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBUZXhpbmZvCi1kaXN0cmlidXRpb24uQGZvb3Rub3Rle0Bjb2Rle3RleGkyZHZpfSB1c2VzIEBUZVh7fSB0byBkbyB0aGUgcmVhbCB3b3JrCi1vZiBmb3JtYXR0aW5nLiBAVGVYe30gaXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggVGV4aW5mby59ICBBbHRlcm5hdGl2ZWx5LAotd3JpdGUganVzdCB0aGUgZGVwZW5kZW5jaWVzLCBhbmQgYWxsb3cgR05VIEBjb2Rle21ha2V9IHRvIHByb3ZpZGUgdGhlIGNvbW1hbmQuCi0KLUBpdGVtIGRpc3QKLUNyZWF0ZSBhIGRpc3RyaWJ1dGlvbiB0YXIgZmlsZSBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIHRhciBmaWxlIHNob3VsZCBiZQotc2V0IHVwIHNvIHRoYXQgdGhlIGZpbGUgbmFtZXMgaW4gdGhlIHRhciBmaWxlIHN0YXJ0IHdpdGggYSBzdWJkaXJlY3RvcnkKLW5hbWUgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgaXQgaXMgYSBkaXN0cmlidXRpb24gZm9yLiAgVGhpcwotbmFtZSBjYW4gaW5jbHVkZSB0aGUgdmVyc2lvbiBudW1iZXIuCi0KLUZvciBleGFtcGxlLCB0aGUgZGlzdHJpYnV0aW9uIHRhciBmaWxlIG9mIEdDQyB2ZXJzaW9uIDEuNDAgdW5wYWNrcyBpbnRvCi1hIHN1YmRpcmVjdG9yeSBuYW1lZCBAZmlsZXtnY2MtMS40MH0uCi0KLVRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGNyZWF0ZSBhIHN1YmRpcmVjdG9yeSBhcHByb3ByaWF0ZWx5Ci1uYW1lZCwgdXNlIEBjb2Rle2xufSBvciBAY29kZXtjcH0gdG8gaW5zdGFsbCB0aGUgcHJvcGVyIGZpbGVzIGluIGl0LCBhbmQKLXRoZW4gQGNvZGV7dGFyfSB0aGF0IHN1YmRpcmVjdG9yeS4KLQotQ29tcHJlc3MgdGhlIHRhciBmaWxlIGZpbGUgd2l0aCBAY29kZXtnemlwfS4gIEZvciBleGFtcGxlLCB0aGUgYWN0dWFsCi1kaXN0cmlidXRpb24gZmlsZSBmb3IgR0NDIHZlcnNpb24gMS40MCBpcyBjYWxsZWQgQGZpbGV7Z2NjLTEuNDAudGFyLmd6fS4KLQotVGhlIEBjb2Rle2Rpc3R9IHRhcmdldCBzaG91bGQgZXhwbGljaXRseSBkZXBlbmQgb24gYWxsIG5vbi1zb3VyY2UgZmlsZXMKLXRoYXQgYXJlIGluIHRoZSBkaXN0cmlidXRpb24sIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB1cCB0byBkYXRlIGluIHRoZQotZGlzdHJpYnV0aW9uLgotQGlmc2V0IENPREVTVEQKLUB4cmVme1JlbGVhc2VzLCAsIE1ha2luZyBSZWxlYXNlc30uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBDT0RFU1RECi1AeHJlZntSZWxlYXNlcywgLCBNYWtpbmcgUmVsZWFzZXMsIHN0YW5kYXJkcywgR05VIENvZGluZyBTdGFuZGFyZHN9LgotQGVuZCBpZmNsZWFyCi0KLUBpdGVtIGNoZWNrCi1QZXJmb3JtIHNlbGYtdGVzdHMgKGlmIGFueSkuICBUaGUgdXNlciBtdXN0IGJ1aWxkIHRoZSBwcm9ncmFtIGJlZm9yZQotcnVubmluZyB0aGUgdGVzdHMsIGJ1dCBuZWVkIG5vdCBpbnN0YWxsIHRoZSBwcm9ncmFtOyB5b3Ugc2hvdWxkIHdyaXRlCi10aGUgc2VsZi10ZXN0cyBzbyB0aGF0IHRoZXkgd29yayB3aGVuIHRoZSBwcm9ncmFtIGlzIGJ1aWx0IGJ1dCBub3QKLWluc3RhbGxlZC4KLUBlbmQgdGFibGUKLQotVGhlIGZvbGxvd2luZyB0YXJnZXRzIGFyZSBzdWdnZXN0ZWQgYXMgY29udmVudGlvbmFsIG5hbWVzLCBmb3IgcHJvZ3JhbXMKLWluIHdoaWNoIHRoZXkgYXJlIHVzZWZ1bC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBpbnN0YWxsY2hlY2sKLVBlcmZvcm0gaW5zdGFsbGF0aW9uIHRlc3RzIChpZiBhbnkpLiAgVGhlIHVzZXIgbXVzdCBidWlsZCBhbmQgaW5zdGFsbAotdGhlIHByb2dyYW0gYmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3RzLiAgWW91IHNob3VsZCBub3QgYXNzdW1lIHRoYXQKLUBmaWxleyQoYmluZGlyKX0gaXMgaW4gdGhlIHNlYXJjaCBwYXRoLgotCi1AaXRlbSBpbnN0YWxsZGlycwotSXQncyB1c2VmdWwgdG8gYWRkIGEgdGFyZ2V0IG5hbWVkIEBzYW1we2luc3RhbGxkaXJzfSB0byBjcmVhdGUgdGhlCi1kaXJlY3RvcmllcyB3aGVyZSBmaWxlcyBhcmUgaW5zdGFsbGVkLCBhbmQgdGhlaXIgcGFyZW50IGRpcmVjdG9yaWVzLgotVGhlcmUgaXMgYSBzY3JpcHQgY2FsbGVkIEBmaWxle21raW5zdGFsbGRpcnN9IHdoaWNoIGlzIGNvbnZlbmllbnQgZm9yCi10aGlzOyB5b3UgY2FuIGZpbmQgaXQgaW4gdGhlIFRleGluZm8gcGFja2FnZS4KLUBjIEl0J3MgaW4gL2dkL2dudS9saWIvbWtpbnN0YWxsZGlycy4KLVlvdSBjYW4gdXNlIGEgcnVsZSBsaWtlIHRoaXM6Ci0KLUBjb21tZW50IFRoaXMgaGFzIGJlZW4gY2FyZWZ1bGx5IGZvcm1hdHRlZCB0byBsb29rIGRlY2VudCBpbiB0aGUgTWFrZSBtYW51YWwuCi1AY29tbWVudCBQbGVhc2UgYmUgc3VyZSBub3QgdG8gbWFrZSBpdCBleHRlbmQgYW55IGZ1cnRoZXIgdG8gdGhlIHJpZ2h0Li0tcm9sYW5kCi1Ac21hbGxleGFtcGxlCi0jIE1ha2Ugc3VyZSBhbGwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIChlLmcuICQoYmluZGlyKSkKLSMgYWN0dWFsbHkgZXhpc3QgYnkgbWFraW5nIHRoZW0gaWYgbmVjZXNzYXJ5LgotaW5zdGFsbGRpcnM6IG1raW5zdGFsbGRpcnMKLSAgICAgICAgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChiaW5kaXIpICQoZGF0YWRpcikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGxpYmRpcikgJChpbmZvZGlyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobWFuZGlyKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyBydWxlIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBjb21waWxhdGlvbiBpcyBkb25lLgotSXQgc2hvdWxkIGRvIG5vdGhpbmcgYnV0IGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluc3RhbGwgQ29tbWFuZCBDYXRlZ29yaWVzCi1Ac2VjdGlvbiBJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllcwotCi1AY2luZGV4IHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHMKLUBjaW5kZXggcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMKLVdoZW4gd3JpdGluZyB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0LCB5b3UgbXVzdCBjbGFzc2lmeSBhbGwgdGhlCi1jb21tYW5kcyBpbnRvIHRocmVlIGNhdGVnb3JpZXM6IG5vcm1hbCBvbmVzLCBAZGZue3ByZS1pbnN0YWxsYXRpb259Ci1jb21tYW5kcyBhbmQgQGRmbntwb3N0LWluc3RhbGxhdGlvbn0gY29tbWFuZHMuCi0KLU5vcm1hbCBjb21tYW5kcyBtb3ZlIGZpbGVzIGludG8gdGhlaXIgcHJvcGVyIHBsYWNlcywgYW5kIHNldCB0aGVpcgotbW9kZXMuICBUaGV5IG1heSBub3QgYWx0ZXIgYW55IGZpbGVzIGV4Y2VwdCB0aGUgb25lcyB0aGF0IGNvbWUgZW50aXJlbHkKLWZyb20gdGhlIHBhY2thZ2UgdGhleSBiZWxvbmcgdG8uCi0KLVByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIG1heSBhbHRlciBvdGhlciBmaWxlczsKLWluIHBhcnRpY3VsYXIsIHRoZXkgY2FuIGVkaXQgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgb3IgZGF0YSBiYXNlcy4KLQotUHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcyBhcmUgdHlwaWNhbGx5IGV4ZWN1dGVkIGJlZm9yZSB0aGUgbm9ybWFsCi1jb21tYW5kcywgYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgcnVuIGFmdGVyIHRoZQotbm9ybWFsIGNvbW1hbmRzLgotCi1UaGUgbW9zdCBjb21tb24gdXNlIGZvciBhIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmQgaXMgdG8gcnVuCi1AY29kZXtpbnN0YWxsLWluZm99LiAgVGhpcyBjYW5ub3QgYmUgZG9uZSB3aXRoIGEgbm9ybWFsIGNvbW1hbmQsIHNpbmNlCi1pdCBhbHRlcnMgYSBmaWxlICh0aGUgSW5mbyBkaXJlY3RvcnkpIHdoaWNoIGRvZXMgbm90IGNvbWUgZW50aXJlbHkgYW5kCi1zb2xlbHkgZnJvbSB0aGUgcGFja2FnZSBiZWluZyBpbnN0YWxsZWQuICBJdCBpcyBhIHBvc3QtaW5zdGFsbGF0aW9uCi1jb21tYW5kIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciB0aGUgbm9ybWFsIGNvbW1hbmQgd2hpY2gKLWluc3RhbGxzIHRoZSBwYWNrYWdlJ3MgSW5mbyBmaWxlcy4KLQotTW9zdCBwcm9ncmFtcyBkb24ndCBuZWVkIGFueSBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLCBidXQgd2UgaGF2ZSB0aGUKLWZlYXR1cmUganVzdCBpbiBjYXNlIGl0IGlzIG5lZWRlZC4KLQotVG8gY2xhc3NpZnkgdGhlIGNvbW1hbmRzIGluIHRoZSBAY29kZXtpbnN0YWxsfSBydWxlIGludG8gdGhlc2UgdGhyZWUKLWNhdGVnb3JpZXMsIGluc2VydCBAZGZue2NhdGVnb3J5IGxpbmVzfSBhbW9uZyB0aGVtLiAgQSBjYXRlZ29yeSBsaW5lCi1zcGVjaWZpZXMgdGhlIGNhdGVnb3J5IGZvciB0aGUgY29tbWFuZHMgdGhhdCBmb2xsb3cuCi0KLUEgY2F0ZWdvcnkgbGluZSBjb25zaXN0cyBvZiBhIHRhYiBhbmQgYSByZWZlcmVuY2UgdG8gYSBzcGVjaWFsIE1ha2UKLXZhcmlhYmxlLCBwbHVzIGFuIG9wdGlvbmFsIGNvbW1lbnQgYXQgdGhlIGVuZC4gIFRoZXJlIGFyZSB0aHJlZQotdmFyaWFibGVzIHlvdSBjYW4gdXNlLCBvbmUgZm9yIGVhY2ggY2F0ZWdvcnk7IHRoZSB2YXJpYWJsZSBuYW1lCi1zcGVjaWZpZXMgdGhlIGNhdGVnb3J5LiAgQ2F0ZWdvcnkgbGluZXMgYXJlIG5vLW9wcyBpbiBvcmRpbmFyeSBleGVjdXRpb24KLWJlY2F1c2UgdGhlc2UgdGhyZWUgTWFrZSB2YXJpYWJsZXMgYXJlIG5vcm1hbGx5IHVuZGVmaW5lZCAoYW5kIHlvdQotQGVtcGh7c2hvdWxkIG5vdH0gZGVmaW5lIHRoZW0gaW4gdGhlIG1ha2VmaWxlKS4KLQotSGVyZSBhcmUgdGhlIHRocmVlIHBvc3NpYmxlIGNhdGVnb3J5IGxpbmVzLCBlYWNoIHdpdGggYSBjb21tZW50IHRoYXQKLWV4cGxhaW5zIHdoYXQgaXQgbWVhbnM6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgJChQUkVfSU5TVEFMTCkgICAgICMgQHJ7UHJlLWluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChQT1NUX0lOU1RBTEwpICAgICMgQHJ7UG9zdC1pbnN0YWxsIGNvbW1hbmRzIGZvbGxvdy59Ci0gICAgICAgICQoTk9STUFMX0lOU1RBTEwpICAjIEBye05vcm1hbCBjb21tYW5kcyBmb2xsb3cufQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IGRvbid0IHVzZSBhIGNhdGVnb3J5IGxpbmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgQGNvZGV7aW5zdGFsbH0KLXJ1bGUsIGFsbCB0aGUgY29tbWFuZHMgYXJlIGNsYXNzaWZpZWQgYXMgbm9ybWFsIHVudGlsIHRoZSBmaXJzdCBjYXRlZ29yeQotbGluZS4gIElmIHlvdSBkb24ndCB1c2UgYW55IGNhdGVnb3J5IGxpbmVzLCBhbGwgdGhlIGNvbW1hbmRzIGFyZQotY2xhc3NpZmllZCBhcyBub3JtYWwuCi0KLVRoZXNlIGFyZSB0aGUgY2F0ZWdvcnkgbGluZXMgZm9yIEBjb2Rle3VuaW5zdGFsbH06Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgJChQUkVfVU5JTlNUQUxMKSAgICAgIyBAcntQcmUtdW5pbnN0YWxsIGNvbW1hbmRzIGZvbGxvdy59Ci0gICAgICAgICQoUE9TVF9VTklOU1RBTEwpICAgICMgQHJ7UG9zdC11bmluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChOT1JNQUxfVU5JTlNUQUxMKSAgIyBAcntOb3JtYWwgY29tbWFuZHMgZm9sbG93Ln0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVR5cGljYWxseSwgYSBwcmUtdW5pbnN0YWxsIGNvbW1hbmQgd291bGQgYmUgdXNlZCBmb3IgZGVsZXRpbmcgZW50cmllcwotZnJvbSB0aGUgSW5mbyBkaXJlY3RvcnkuCi0KLUlmIHRoZSBAY29kZXtpbnN0YWxsfSBvciBAY29kZXt1bmluc3RhbGx9IHRhcmdldCBoYXMgYW55IGRlcGVuZGVuY2llcwotd2hpY2ggYWN0IGFzIHN1YnJvdXRpbmVzIG9mIGluc3RhbGxhdGlvbiwgdGhlbiB5b3Ugc2hvdWxkIHN0YXJ0Ci1AZW1waHtlYWNofSBkZXBlbmRlbmN5J3MgY29tbWFuZHMgd2l0aCBhIGNhdGVnb3J5IGxpbmUsIGFuZCBzdGFydCB0aGUKLW1haW4gdGFyZ2V0J3MgY29tbWFuZHMgd2l0aCBhIGNhdGVnb3J5IGxpbmUgYWxzby4gIFRoaXMgd2F5LCB5b3UgY2FuCi1lbnN1cmUgdGhhdCBlYWNoIGNvbW1hbmQgaXMgcGxhY2VkIGluIHRoZSByaWdodCBjYXRlZ29yeSByZWdhcmRsZXNzIG9mCi13aGljaCBvZiB0aGUgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1bi4KLQotUHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgc2hvdWxkIG5vdCBydW4gYW55Ci1wcm9ncmFtcyBleGNlcHQgZm9yIHRoZXNlOgotCi1AZXhhbXBsZQotWyBiYXNlbmFtZSBiYXNoIGNhdCBjaGdycCBjaG1vZCBjaG93biBjbXAgY3AgZGQgZGlmZiBlY2hvCi1lZ3JlcCBleHBhbmQgZXhwciBmYWxzZSBmZ3JlcCBmaW5kIGdldG9wdCBncmVwIGd1bnppcCBnemlwCi1ob3N0bmFtZSBpbnN0YWxsIGluc3RhbGwtaW5mbyBraWxsIGxkY29uZmlnIGxuIGxzIG1kNXN1bQotbWtkaXIgbWtmaWZvIG1rbm9kIG12IHByaW50ZW52IHB3ZCBybSBybWRpciBzZWQgc29ydCB0ZWUKLXRlc3QgdG91Y2ggdHJ1ZSB1bmFtZSB4YXJncyB5ZXMKLUBlbmQgZXhhbXBsZQotCi1AY2luZGV4IGJpbmFyeSBwYWNrYWdlcwotVGhlIHJlYXNvbiBmb3IgZGlzdGluZ3Vpc2hpbmcgdGhlIGNvbW1hbmRzIGluIHRoaXMgd2F5IGlzIGZvciB0aGUgc2FrZQotb2YgbWFraW5nIGJpbmFyeSBwYWNrYWdlcy4gIFR5cGljYWxseSBhIGJpbmFyeSBwYWNrYWdlIGNvbnRhaW5zIGFsbCB0aGUKLWV4ZWN1dGFibGVzIGFuZCBvdGhlciBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBhbmQgaGFzIGl0cyBvd24KLW1ldGhvZCBvZiBpbnN0YWxsaW5nIHRoZW0tLS1zbyBpdCBkb2VzIG5vdCBuZWVkIHRvIHJ1biB0aGUgbm9ybWFsCi1pbnN0YWxsYXRpb24gY29tbWFuZHMuICBCdXQgaW5zdGFsbGluZyB0aGUgYmluYXJ5IHBhY2thZ2UgZG9lcyBuZWVkIHRvCi1leGVjdXRlIHRoZSBwcmUtaW5zdGFsbGF0aW9uIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcy4KLQotUHJvZ3JhbXMgdG8gYnVpbGQgYmluYXJ5IHBhY2thZ2VzIHdvcmsgYnkgZXh0cmFjdGluZyB0aGUKLXByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgSGVyZSBpcyBvbmUgd2F5IG9mCi1leHRyYWN0aW5nIHRoZSBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzOgotCi1Ac21hbGxleGFtcGxlCi1tYWtlIC1uIGluc3RhbGwgLW8gYWxsIFwKLSAgICAgIFBSRV9JTlNUQUxMPXByZS1pbnN0YWxsIFwKLSAgICAgIFBPU1RfSU5TVEFMTD1wb3N0LWluc3RhbGwgXAotICAgICAgTk9STUFMX0lOU1RBTEw9bm9ybWFsLWluc3RhbGwgXAotICB8IGdhd2sgLWYgcHJlLWluc3RhbGwuYXdrCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZXJlIHRoZSBmaWxlIEBmaWxle3ByZS1pbnN0YWxsLmF3a30gY291bGQgY29udGFpbiB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi0kMCB+IC9eXHRbIFx0XSoobm9ybWFsX2luc3RhbGx8cG9zdF9pbnN0YWxsKVsgXHRdKiQvIEB7b24gPSAwQH0KLW9uIEB7cHJpbnQgJDBAfQotJDAgfiAvXlx0WyBcdF0qcHJlX2luc3RhbGxbIFx0XSokLyBAe29uID0gMUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgcmVzdWx0aW5nIGZpbGUgb2YgcHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcyBpcyBleGVjdXRlZCBhcyBhIHNoZWxsCi1zY3JpcHQgYXMgcGFydCBvZiBpbnN0YWxsaW5nIHRoZSBiaW5hcnkgcGFja2FnZS4KZGlmZiAtLWdpdCBhL2V0Yy9zdGFuZGFyZHMudGV4aSBiL2V0Yy9zdGFuZGFyZHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwYmY4Yi4uMDAwMDAwMAotLS0gYS9ldGMvc3RhbmRhcmRzLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkzICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvIEBjIC0qLXRleGluZm8tKi0KLUBjICUqKnN0YXJ0IG9mIGhlYWRlcgotQHNldGZpbGVuYW1lIHN0YW5kYXJkcy5pbmZvCi1Ac2V0dGl0bGUgR05VIENvZGluZyBTdGFuZGFyZHMKLUBjIFRoaXMgZGF0ZSBpcyBhdXRvbWFnaWNhbGx5IHVwZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGlzIGZpbGU6Ci1Ac2V0IGxhc3R1cGRhdGUgTWFyY2ggMTMsIDE5OTgKLUBjICUqKmVuZCBvZiBoZWFkZXIKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogU3RhbmRhcmRzOiAoc3RhbmRhcmRzKS4gICAgICAgIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGMgQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldGNoYXB0ZXJuZXdwYWdlIG9mZgotCi1AYyBUaGlzIGlzIHVzZWQgYnkgYSBjcm9zcyByZWYgaW4gbWFrZS1zdGRzLnRleGkKLUBzZXQgQ09ERVNURCAgMQotQGlmdGV4Ci1Ac2V0IENIQVBURVIgY2hhcHRlcgotQGVuZCBpZnRleAotQGlmaW5mbwotQHNldCBDSEFQVEVSIG5vZGUKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLUdOVSBDb2RpbmcgU3RhbmRhcmRzCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgaWZpbmZvCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotQGF1dGhvciBSaWNoYXJkIFN0YWxsbWFuCi1AYXV0aG9yIGxhc3QgdXBkYXRlZCBAdmFsdWV7bGFzdHVwZGF0ZX0KLUBwYWdlCi0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAotZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24gYXBwcm92ZWQKLWJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AsIFByZWZhY2UsIChkaXIpLCAoZGlyKQotQHRvcCBWZXJzaW9uCi0KLUxhc3QgdXBkYXRlZCBAdmFsdWV7bGFzdHVwZGF0ZX0uCi1AZW5kIGlmaW5mbwotCi1AbWVudQotKiBQcmVmYWNlOjogICAgICAgICAgICAgICAgICAgICBBYm91dCB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMKLSogSW50ZWxsZWN0dWFsIFByb3BlcnR5OjogICAgICAgS2VlcGluZyBGcmVlIFNvZnR3YXJlIEZyZWUKLSogRGVzaWduIEFkdmljZTo6ICAgICAgICAgICAgICAgR2VuZXJhbCBQcm9ncmFtIERlc2lnbgotKiBQcm9ncmFtIEJlaGF2aW9yOjogICAgICAgICAgICBQcm9ncmFtIEJlaGF2aW9yIGZvciBBbGwgUHJvZ3JhbXMKLSogV3JpdGluZyBDOjogICAgICAgICAgICAgICAgICAgTWFraW5nIFRoZSBCZXN0IFVzZSBvZiBDCi0qIERvY3VtZW50YXRpb246OiAgICAgICAgICAgICAgIERvY3VtZW50aW5nIFByb2dyYW1zCi0qIE1hbmFnaW5nIFJlbGVhc2VzOjogICAgICAgICAgIFRoZSBSZWxlYXNlIFByb2Nlc3MKLUBlbmQgbWVudQotCi1Abm9kZSBQcmVmYWNlCi1AY2hhcHRlciBBYm91dCB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMKLQotVGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzIHdlcmUgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGFuZCBvdGhlciBHTlUKLVByb2plY3Qgdm9sdW50ZWVycy4gIFRoZWlyIHB1cnBvc2UgaXMgdG8gbWFrZSB0aGUgR05VIHN5c3RlbSBjbGVhbiwKLWNvbnNpc3RlbnQsIGFuZCBlYXN5IHRvIGluc3RhbGwuICBUaGlzIGRvY3VtZW50IGNhbiBhbHNvIGJlIHJlYWQgYXMgYQotZ3VpZGUgdG8gd3JpdGluZyBwb3J0YWJsZSwgcm9idXN0IGFuZCByZWxpYWJsZSBwcm9ncmFtcy4gIEl0IGZvY3VzZXMgb24KLXByb2dyYW1zIHdyaXR0ZW4gaW4gQywgYnV0IG1hbnkgb2YgdGhlIHJ1bGVzIGFuZCBwcmluY2lwbGVzIGFyZSB1c2VmdWwKLWV2ZW4gaWYgeW91IHdyaXRlIGluIGFub3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBUaGUgcnVsZXMgb2Z0ZW4KLXN0YXRlIHJlYXNvbnMgZm9yIHdyaXRpbmcgaW4gYSBjZXJ0YWluIHdheS4KLQotQ29ycmVjdGlvbnMgb3Igc3VnZ2VzdGlvbnMgZm9yIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGJlIHNlbnQgdG8KLUBlbWFpbHtnbnVAQGdudS5vcmd9LiAgSWYgeW91IG1ha2UgYSBzdWdnZXN0aW9uLCBwbGVhc2UgaW5jbHVkZSBhCi1zdWdnZXN0ZWQgbmV3IHdvcmRpbmcgZm9yIGl0OyBvdXIgdGltZSBpcyBsaW1pdGVkLiAgV2UgcHJlZmVyIGEgY29udGV4dAotZGlmZiB0byB0aGUgQGZpbGV7c3RhbmRhcmRzLnRleGl9IG9yIEBmaWxle21ha2Utc3Rkcy50ZXhpfSBmaWxlcywgYnV0IGlmCi15b3UgZG9uJ3QgaGF2ZSB0aG9zZSBmaWxlcywgcGxlYXNlIG1haWwgeW91ciBzdWdnZXN0aW9uIGFueXdheS4KLQotVGhpcyByZWxlYXNlIG9mIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcyB3YXMgbGFzdCB1cGRhdGVkCi1AdmFsdWV7bGFzdHVwZGF0ZX0uCi0KLUBub2RlIEludGVsbGVjdHVhbCBQcm9wZXJ0eQotQGNoYXB0ZXIgS2VlcGluZyBGcmVlIFNvZnR3YXJlIEZyZWUKLQotVGhpcyBAdmFsdWV7Q0hBUFRFUn0gZGlzY3Vzc2VzIGhvdyB5b3UgY2FuIG1ha2Ugc3VyZSB0aGF0IEdOVSBzb2Z0d2FyZQotcmVtYWlucyB1bmVuY3VtYmVyZWQuCi0KLUBtZW51Ci0qIFJlYWRpbmcgTm9uLUZyZWUgQ29kZTo6ICAgICAgIFJlZmVycmluZyB0byBQcm9wcmlldGFyeSBQcm9ncmFtcwotKiBDb250cmlidXRpb25zOjogICAgICAgICAgICAgICBBY2NlcHRpbmcgQ29udHJpYnV0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIFJlYWRpbmcgTm9uLUZyZWUgQ29kZQotQHNlY3Rpb24gUmVmZXJyaW5nIHRvIFByb3ByaWV0YXJ5IFByb2dyYW1zCi0KLURvbid0IGluIGFueSBjaXJjdW1zdGFuY2VzIHJlZmVyIHRvIFVuaXggc291cmNlIGNvZGUgZm9yIG9yIGR1cmluZwoteW91ciB3b3JrIG9uIEdOVSEgIChPciB0byBhbnkgb3RoZXIgcHJvcHJpZXRhcnkgcHJvZ3JhbXMuKQotCi1JZiB5b3UgaGF2ZSBhIHZhZ3VlIHJlY29sbGVjdGlvbiBvZiB0aGUgaW50ZXJuYWxzIG9mIGEgVW5peCBwcm9ncmFtLAotdGhpcyBkb2VzIG5vdCBhYnNvbHV0ZWx5IG1lYW4geW91IGNhbid0IHdyaXRlIGFuIGltaXRhdGlvbiBvZiBpdCwgYnV0Ci1kbyB0cnkgdG8gb3JnYW5pemUgdGhlIGltaXRhdGlvbiBpbnRlcm5hbGx5IGFsb25nIGRpZmZlcmVudCBsaW5lcywKLWJlY2F1c2UgdGhpcyBpcyBsaWtlbHkgdG8gbWFrZSB0aGUgZGV0YWlscyBvZiB0aGUgVW5peCB2ZXJzaW9uCi1pcnJlbGV2YW50IGFuZCBkaXNzaW1pbGFyIHRvIHlvdXIgcmVzdWx0cy4KLQotRm9yIGV4YW1wbGUsIFVuaXggdXRpbGl0aWVzIHdlcmUgZ2VuZXJhbGx5IG9wdGltaXplZCB0byBtaW5pbWl6ZQotbWVtb3J5IHVzZTsgaWYgeW91IGdvIGZvciBzcGVlZCBpbnN0ZWFkLCB5b3VyIHByb2dyYW0gd2lsbCBiZSB2ZXJ5Ci1kaWZmZXJlbnQuICBZb3UgY291bGQga2VlcCB0aGUgZW50aXJlIGlucHV0IGZpbGUgaW4gY29yZSBhbmQgc2NhbiBpdAotdGhlcmUgaW5zdGVhZCBvZiB1c2luZyBzdGRpby4gIFVzZSBhIHNtYXJ0ZXIgYWxnb3JpdGhtIGRpc2NvdmVyZWQgbW9yZQotcmVjZW50bHkgdGhhbiB0aGUgVW5peCBwcm9ncmFtLiAgRWxpbWluYXRlIHVzZSBvZiB0ZW1wb3JhcnkgZmlsZXMuICBEbwotaXQgaW4gb25lIHBhc3MgaW5zdGVhZCBvZiB0d28gKHdlIGRpZCB0aGlzIGluIHRoZSBhc3NlbWJsZXIpLgotCi1Pciwgb24gdGhlIGNvbnRyYXJ5LCBlbXBoYXNpemUgc2ltcGxpY2l0eSBpbnN0ZWFkIG9mIHNwZWVkLiAgRm9yIHNvbWUKLWFwcGxpY2F0aW9ucywgdGhlIHNwZWVkIG9mIHRvZGF5J3MgY29tcHV0ZXJzIG1ha2VzIHNpbXBsZXIgYWxnb3JpdGhtcwotYWRlcXVhdGUuCi0KLU9yIGdvIGZvciBnZW5lcmFsaXR5LiAgRm9yIGV4YW1wbGUsIFVuaXggcHJvZ3JhbXMgb2Z0ZW4gaGF2ZSBzdGF0aWMKLXRhYmxlcyBvciBmaXhlZC1zaXplIHN0cmluZ3MsIHdoaWNoIG1ha2UgZm9yIGFyYml0cmFyeSBsaW1pdHM7IHVzZQotZHluYW1pYyBhbGxvY2F0aW9uIGluc3RlYWQuICBNYWtlIHN1cmUgeW91ciBwcm9ncmFtIGhhbmRsZXMgTlVMcyBhbmQKLW90aGVyIGZ1bm55IGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0IGZpbGVzLiAgQWRkIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UKLWZvciBleHRlbnNpYmlsaXR5IGFuZCB3cml0ZSBwYXJ0IG9mIHRoZSBwcm9ncmFtIGluIHRoYXQgbGFuZ3VhZ2UuCi0KLU9yIHR1cm4gc29tZSBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSBpbnRvIGluZGVwZW5kZW50bHkgdXNhYmxlIGxpYnJhcmllcy4KLU9yIHVzZSBhIHNpbXBsZSBnYXJiYWdlIGNvbGxlY3RvciBpbnN0ZWFkIG9mIHRyYWNraW5nIHByZWNpc2VseSB3aGVuCi10byBmcmVlIG1lbW9yeSwgb3IgdXNlIGEgbmV3IEdOVSBmYWNpbGl0eSBzdWNoIGFzIG9ic3RhY2tzLgotCi0KLUBub2RlIENvbnRyaWJ1dGlvbnMKLUBzZWN0aW9uIEFjY2VwdGluZyBDb250cmlidXRpb25zCi0KLUlmIHNvbWVvbmUgZWxzZSBzZW5kcyB5b3UgYSBwaWVjZSBvZiBjb2RlIHRvIGFkZCB0byB0aGUgcHJvZ3JhbSB5b3UgYXJlCi13b3JraW5nIG9uLCB3ZSBuZWVkIGxlZ2FsIHBhcGVycyB0byB1c2UgaXQtLS10aGUgc2FtZSBzb3J0IG9mIGxlZ2FsCi1wYXBlcnMgd2Ugd2lsbCBuZWVkIHRvIGdldCBmcm9tIHlvdS4gIEBlbXBoe0VhY2h9IHNpZ25pZmljYW50Ci1jb250cmlidXRvciB0byBhIHByb2dyYW0gbXVzdCBzaWduIHNvbWUgc29ydCBvZiBsZWdhbCBwYXBlcnMgaW4gb3JkZXIKLWZvciB1cyB0byBoYXZlIGNsZWFyIHRpdGxlIHRvIHRoZSBwcm9ncmFtLiAgVGhlIG1haW4gYXV0aG9yIGFsb25lIGlzIG5vdAotZW5vdWdoLgotCi1TbywgYmVmb3JlIGFkZGluZyBpbiBhbnkgY29udHJpYnV0aW9ucyBmcm9tIG90aGVyIHBlb3BsZSwgcGxlYXNlIHRlbGwKLXVzLCBzbyB3ZSBjYW4gYXJyYW5nZSB0byBnZXQgdGhlIHBhcGVycy4gIFRoZW4gd2FpdCB1bnRpbCB3ZSB0ZWxsIHlvdQotdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIHRoZSBzaWduZWQgcGFwZXJzLCBiZWZvcmUgeW91IGFjdHVhbGx5IHVzZSB0aGUKLWNvbnRyaWJ1dGlvbi4KLQotVGhpcyBhcHBsaWVzIGJvdGggYmVmb3JlIHlvdSByZWxlYXNlIHRoZSBwcm9ncmFtIGFuZCBhZnRlcndhcmQuICBJZgoteW91IHJlY2VpdmUgZGlmZnMgdG8gZml4IGEgYnVnLCBhbmQgdGhleSBtYWtlIHNpZ25pZmljYW50IGNoYW5nZXMsIHdlCi1uZWVkIGxlZ2FsIHBhcGVycyBmb3IgdGhhdCBjaGFuZ2UuCi0KLVRoaXMgYWxzbyBhcHBsaWVzIHRvIGNvbW1lbnRzIGFuZCBkb2N1bWVudGF0aW9uIGZpbGVzLiAgRm9yIGNvcHlyaWdodAotbGF3LCBjb21tZW50cyBhbmQgY29kZSBhcmUganVzdCB0ZXh0LiAgQ29weXJpZ2h0IGFwcGxpZXMgdG8gYWxsIGtpbmRzIG9mCi10ZXh0LCBzbyB3ZSBuZWVkIGxlZ2FsIHBhcGVycyBmb3IgYWxsIGtpbmRzLgotCi1Zb3UgZG9uJ3QgbmVlZCBwYXBlcnMgZm9yIGNoYW5nZXMgb2YgYSBmZXcgbGluZXMgaGVyZSBvciB0aGVyZSwgc2luY2UKLXRoZXkgYXJlIG5vdCBzaWduaWZpY2FudCBmb3IgY29weXJpZ2h0IHB1cnBvc2VzLiAgQWxzbywgeW91IGRvbid0IG5lZWQKLXBhcGVycyBpZiBhbGwgeW91IGdldCBmcm9tIHRoZSBzdWdnZXN0aW9uIGlzIHNvbWUgaWRlYXMsIG5vdCBhY3R1YWwgY29kZQotd2hpY2ggeW91IHVzZS4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd3JpdGUgYSBkaWZmZXJlbnQgc29sdXRpb24gdG8gdGhlCi1wcm9ibGVtLCB5b3UgZG9uJ3QgbmVlZCB0byBnZXQgcGFwZXJzLgotCi1XZSBrbm93IHRoaXMgaXMgZnJ1c3RyYXRpbmc7IGl0J3MgZnJ1c3RyYXRpbmcgZm9yIHVzIGFzIHdlbGwuICBCdXQgaWYKLXlvdSBkb24ndCB3YWl0LCB5b3UgYXJlIGdvaW5nIG91dCBvbiBhIGxpbWItLS1mb3IgZXhhbXBsZSwgd2hhdCBpZiB0aGUKLWNvbnRyaWJ1dG9yJ3MgZW1wbG95ZXIgd29uJ3Qgc2lnbiBhIGRpc2NsYWltZXI/ICBZb3UgbWlnaHQgaGF2ZSB0byB0YWtlCi10aGF0IGNvZGUgb3V0IGFnYWluIQotCi1UaGUgdmVyeSB3b3JzdCB0aGluZyBpcyBpZiB5b3UgZm9yZ2V0IHRvIHRlbGwgdXMgYWJvdXQgdGhlIG90aGVyCi1jb250cmlidXRvci4gIFdlIGNvdWxkIGJlIHZlcnkgZW1iYXJyYXNzZWQgaW4gY291cnQgc29tZSBkYXkgYXMgYQotcmVzdWx0LgotCi1XZSBoYXZlIG1vcmUgZGV0YWlsZWQgYWR2aWNlIGZvciBtYWludGFpbmVycyBvZiBwcm9ncmFtczsgaWYgeW91IGhhdmUKLXJlYWNoZWQgdGhlIHN0YWdlIG9mIGFjdHVhbGx5IG1haW50YWluaW5nIGEgcHJvZ3JhbSBmb3IgR05VICh3aGV0aGVyCi1yZWxlYXNlZCBvciBub3QpLCBwbGVhc2UgYXNrIHVzIGZvciBhIGNvcHkuCi0KLUBub2RlIERlc2lnbiBBZHZpY2UKLUBjaGFwdGVyIEdlbmVyYWwgUHJvZ3JhbSBEZXNpZ24KLQotVGhpcyBAdmFsdWV7Q0hBUFRFUn0gZGlzY3Vzc2VzIHNvbWUgb2YgdGhlIGlzc3VlcyB5b3Ugc2hvdWxkIHRha2UgaW50bwotYWNjb3VudCB3aGVuIGRlc2lnbmluZyB5b3VyIHByb2dyYW0uCi0KLUBtZW51Ci0qIENvbXBhdGliaWxpdHk6OiAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBpbXBsZW1lbnRhdGlvbnMKLSogVXNpbmcgRXh0ZW5zaW9uczo6ICAgICAgICAgICAgVXNpbmcgbm9uLXN0YW5kYXJkIGZlYXR1cmVzCi0qIEFOU0kgQzo6ICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIEFOU0kgQyBmZWF0dXJlcwotKiBTb3VyY2UgTGFuZ3VhZ2U6OiAgICAgICAgICAgICBVc2luZyBsYW5ndWFnZXMgb3RoZXIgdGhhbiBDCi1AZW5kIG1lbnUKLQotQG5vZGUgQ29tcGF0aWJpbGl0eQotQHNlY3Rpb24gQ29tcGF0aWJpbGl0eSB3aXRoIE90aGVyIEltcGxlbWVudGF0aW9ucwotCi1XaXRoIG9jY2FzaW9uYWwgZXhjZXB0aW9ucywgdXRpbGl0eSBwcm9ncmFtcyBhbmQgbGlicmFyaWVzIGZvciBHTlUKLXNob3VsZCBiZSB1cHdhcmQgY29tcGF0aWJsZSB3aXRoIHRob3NlIGluIEJlcmtlbGV5IFVuaXgsIGFuZCB1cHdhcmQKLWNvbXBhdGlibGUgd2l0aCBAc2N7YW5zaX0gQyBpZiBAc2N7YW5zaX0gQyBzcGVjaWZpZXMgdGhlaXIgYmVoYXZpb3IsIGFuZAotdXB3YXJkIGNvbXBhdGlibGUgd2l0aCBAc2N7UE9TSVh9IGlmIEBzY3tQT1NJWH0gc3BlY2lmaWVzIHRoZWlyCi1iZWhhdmlvci4KLQotV2hlbiB0aGVzZSBzdGFuZGFyZHMgY29uZmxpY3QsIGl0IGlzIHVzZWZ1bCB0byBvZmZlciBjb21wYXRpYmlsaXR5Ci1tb2RlcyBmb3IgZWFjaCBvZiB0aGVtLgotCi1Ac2N7YW5zaX0gQyBhbmQgQHNje1BPU0lYfSBwcm9oaWJpdCBtYW55IGtpbmRzIG9mIGV4dGVuc2lvbnMuICBGZWVsIGZyZWUKLXRvIG1ha2UgdGhlIGV4dGVuc2lvbnMgYW55d2F5LCBhbmQgaW5jbHVkZSBhIEBzYW1wey0tYW5zaX0sCi1Ac2FtcHstLXBvc2l4fSwgb3IgQHNhbXB7LS1jb21wYXRpYmxlfSBvcHRpb24gdG8gdHVybiB0aGVtIG9mZi4KLUhvd2V2ZXIsIGlmIHRoZSBleHRlbnNpb24gaGFzIGEgc2lnbmlmaWNhbnQgY2hhbmNlIG9mIGJyZWFraW5nIGFueSByZWFsCi1wcm9ncmFtcyBvciBzY3JpcHRzLCB0aGVuIGl0IGlzIG5vdCByZWFsbHkgdXB3YXJkIGNvbXBhdGlibGUuICBUcnkgdG8KLXJlZGVzaWduIGl0cyBpbnRlcmZhY2UuCi0KLU1hbnkgR05VIHByb2dyYW1zIHN1cHByZXNzIGV4dGVuc2lvbnMgdGhhdCBjb25mbGljdCB3aXRoIFBPU0lYIGlmIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7UE9TSVhMWV9DT1JSRUNUfSBpcyBkZWZpbmVkIChldmVuIGlmIGl0IGlzCi1kZWZpbmVkIHdpdGggYSBudWxsIHZhbHVlKS4gIFBsZWFzZSBtYWtlIHlvdXIgcHJvZ3JhbSByZWNvZ25pemUgdGhpcwotdmFyaWFibGUgaWYgYXBwcm9wcmlhdGUuCi0KLVdoZW4gYSBmZWF0dXJlIGlzIHVzZWQgb25seSBieSB1c2VycyAobm90IGJ5IHByb2dyYW1zIG9yIGNvbW1hbmQKLWZpbGVzKSwgYW5kIGl0IGlzIGRvbmUgcG9vcmx5IGluIFVuaXgsIGZlZWwgZnJlZSB0byByZXBsYWNlIGl0Ci1jb21wbGV0ZWx5IHdpdGggc29tZXRoaW5nIHRvdGFsbHkgZGlmZmVyZW50IGFuZCBiZXR0ZXIuICAoRm9yIGV4YW1wbGUsCi1AY29kZXt2aX0gaXMgcmVwbGFjZWQgd2l0aCBFbWFjcy4pICBCdXQgaXQgaXMgbmljZSB0byBvZmZlciBhIGNvbXBhdGlibGUKLWZlYXR1cmUgYXMgd2VsbC4gIChUaGVyZSBpcyBhIGZyZWUgQGNvZGV7dml9IGNsb25lLCBzbyB3ZSBvZmZlciBpdC4pCi0KLUFkZGl0aW9uYWwgdXNlZnVsIGZlYXR1cmVzIG5vdCBpbiBCZXJrZWxleSBVbml4IGFyZSB3ZWxjb21lLgotCi1Abm9kZSBVc2luZyBFeHRlbnNpb25zCi1Ac2VjdGlvbiBVc2luZyBOb24tc3RhbmRhcmQgRmVhdHVyZXMKLQotTWFueSBHTlUgZmFjaWxpdGllcyB0aGF0IGFscmVhZHkgZXhpc3Qgc3VwcG9ydCBhIG51bWJlciBvZiBjb252ZW5pZW50Ci1leHRlbnNpb25zIG92ZXIgdGhlIGNvbXBhcmFibGUgVW5peCBmYWNpbGl0aWVzLiAgV2hldGhlciB0byB1c2UgdGhlc2UKLWV4dGVuc2lvbnMgaW4gaW1wbGVtZW50aW5nIHlvdXIgcHJvZ3JhbSBpcyBhIGRpZmZpY3VsdCBxdWVzdGlvbi4KLQotT24gdGhlIG9uZSBoYW5kLCB1c2luZyB0aGUgZXh0ZW5zaW9ucyBjYW4gbWFrZSBhIGNsZWFuZXIgcHJvZ3JhbS4KLU9uIHRoZSBvdGhlciBoYW5kLCBwZW9wbGUgd2lsbCBub3QgYmUgYWJsZSB0byBidWlsZCB0aGUgcHJvZ3JhbQotdW5sZXNzIHRoZSBvdGhlciBHTlUgdG9vbHMgYXJlIGF2YWlsYWJsZS4gIFRoaXMgbWlnaHQgY2F1c2UgdGhlCi1wcm9ncmFtIHRvIHdvcmsgb24gZmV3ZXIga2luZHMgb2YgbWFjaGluZXMuCi0KLVdpdGggc29tZSBleHRlbnNpb25zLCBpdCBtaWdodCBiZSBlYXN5IHRvIHByb3ZpZGUgYm90aCBhbHRlcm5hdGl2ZXMuCi1Gb3IgZXhhbXBsZSwgeW91IGNhbiBkZWZpbmUgZnVuY3Rpb25zIHdpdGggYSBgYGtleXdvcmQnJyBAY29kZXtJTkxJTkV9Ci1hbmQgZGVmaW5lIHRoYXQgYXMgYSBtYWNybyB0byBleHBhbmQgaW50byBlaXRoZXIgQGNvZGV7aW5saW5lfSBvcgotbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlci4KLQotSW4gZ2VuZXJhbCwgcGVyaGFwcyBpdCBpcyBiZXN0IG5vdCB0byB1c2UgdGhlIGV4dGVuc2lvbnMgaWYgeW91IGNhbgotc3RyYWlnaHRmb3J3YXJkbHkgZG8gd2l0aG91dCB0aGVtLCBidXQgdG8gdXNlIHRoZSBleHRlbnNpb25zIGlmIHRoZXkKLWFyZSBhIGJpZyBpbXByb3ZlbWVudC4KLQotQW4gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBhcmUgdGhlIGxhcmdlLCBlc3RhYmxpc2hlZCBwcm9ncmFtcyAoc3VjaCBhcwotRW1hY3MpIHdoaWNoIHJ1biBvbiBhIGdyZWF0IHZhcmlldHkgb2Ygc3lzdGVtcy4gIFN1Y2ggcHJvZ3JhbXMgd291bGQKLWJlIGJyb2tlbiBieSB1c2Ugb2YgR05VIGV4dGVuc2lvbnMuCi0KLUFub3RoZXIgZXhjZXB0aW9uIGlzIGZvciBwcm9ncmFtcyB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YKLWNvbXBpbGF0aW9uOiBhbnl0aGluZyB0aGF0IG11c3QgYmUgY29tcGlsZWQgd2l0aCBvdGhlciBjb21waWxlcnMgaW4KLW9yZGVyIHRvIGJvb3RzdHJhcCB0aGUgR05VIGNvbXBpbGF0aW9uIGZhY2lsaXRpZXMuICBJZiB0aGVzZSByZXF1aXJlCi10aGUgR05VIGNvbXBpbGVyLCB0aGVuIG5vIG9uZSBjYW4gY29tcGlsZSB0aGVtIHdpdGhvdXQgaGF2aW5nIHRoZW0KLWluc3RhbGxlZCBhbHJlYWR5LiAgVGhhdCB3b3VsZCBiZSBubyBnb29kLgotCi1Abm9kZSBBTlNJIEMKLUBzZWN0aW9uIEBzY3thbnNpfSBDIGFuZCBwcmUtQHNje2Fuc2l9IEMKLQotRG8gbm90IGV2ZXIgdXNlIHRoZSBgYHRyaWdyYXBoJycgZmVhdHVyZSBvZiBAc2N7YW5zaX0gQy4KLQotQHNje2Fuc2l9IEMgaXMgd2lkZXNwcmVhZCBlbm91Z2ggbm93IHRoYXQgaXQgaXMgb2sgdG8gd3JpdGUgbmV3IHByb2dyYW1zCi10aGF0IHVzZSBAc2N7YW5zaX0gQyBmZWF0dXJlcyAoYW5kIHRoZXJlZm9yZSB3aWxsIG5vdCB3b3JrIGluCi1ub24tQHNje2Fuc2l9IGNvbXBpbGVycykuICBBbmQgaWYgYSBwcm9ncmFtIGlzIGFscmVhZHkgd3JpdHRlbiBpbgotQHNje2Fuc2l9IEMsIHRoZXJlJ3Mgbm8gbmVlZCB0byBjb252ZXJ0IGl0IHRvIHN1cHBvcnQgbm9uLUBzY3thbnNpfQotY29tcGlsZXJzLgotCi1Ib3dldmVyLCBpdCBpcyBlYXN5IHRvIHN1cHBvcnQgbm9uLUBzY3thbnNpfSBjb21waWxlcnMgaW4gbW9zdCBwcm9ncmFtcywKLXNvIHlvdSBtaWdodCBzdGlsbCBjb25zaWRlciBkb2luZyBzbyB3aGVuIHlvdSB3cml0ZSBhIHByb2dyYW0uICBJbnN0ZWFkCi1vZiB3cml0aW5nIGZ1bmN0aW9uIGRlZmluaXRpb25zIGluIEBzY3thbnNpfSBwcm90b3R5cGUgZm9ybSwKLQotQGV4YW1wbGUKLWludAotZm9vIChpbnQgeCwgaW50IHkpCi1AZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13cml0ZSB0aGUgZGVmaW5pdGlvbiBpbiBwcmUtQHNje2Fuc2l9IHN0eWxlIGxpa2UgdGhpcywKLQotQGV4YW1wbGUKLWludAotZm9vICh4LCB5KQotICAgICBpbnQgeCwgeTsKLUBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWFuZCB1c2UgYSBzZXBhcmF0ZSBkZWNsYXJhdGlvbiB0byBzcGVjaWZ5IHRoZSBhcmd1bWVudCBwcm90b3R5cGU6Ci0KLUBleGFtcGxlCi1pbnQgZm9vIChpbnQsIGludCk7Ci1AZW5kIGV4YW1wbGUKLQotWW91IG5lZWQgc3VjaCBhIGRlY2xhcmF0aW9uIGFueXdheSwgaW4gYSBoZWFkZXIgZmlsZSwgdG8gZ2V0IHRoZSBiZW5lZml0Ci1vZiBAc2N7YW5zaX0gQyBwcm90b3R5cGVzIGluIGFsbCB0aGUgZmlsZXMgd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLUFuZCBvbmNlIHlvdSBoYXZlIGl0LCB5b3UgbG9zZSBub3RoaW5nIGJ5IHdyaXRpbmcgdGhlIGZ1bmN0aW9uCi1kZWZpbml0aW9uIGluIHRoZSBwcmUtQHNje2Fuc2l9IHN0eWxlLgotCi1JZiB5b3UgZG9uJ3Qga25vdyBub24tQHNje2Fuc2l9IEMsIHRoZXJlJ3Mgbm8gbmVlZCB0byBsZWFybiBpdDsganVzdAotd3JpdGUgaW4gQHNje2Fuc2l9IEMuCi0KLUBub2RlIFNvdXJjZSBMYW5ndWFnZQotQHNlY3Rpb24gVXNpbmcgTGFuZ3VhZ2VzIE90aGVyIFRoYW4gQwotCi1Vc2luZyBhIGxhbmd1YWdlIG90aGVyIHRoYW4gQyBpcyBsaWtlIHVzaW5nIGEgbm9uLXN0YW5kYXJkIGZlYXR1cmU6IGl0Ci13aWxsIGNhdXNlIHRyb3VibGUgZm9yIHVzZXJzLiAgRXZlbiBpZiBHQ0Mgc3VwcG9ydHMgdGhlIG90aGVyIGxhbmd1YWdlLAotdXNlcnMgbWF5IGZpbmQgaXQgaW5jb252ZW5pZW50IHRvIGhhdmUgdG8gaW5zdGFsbCB0aGUgY29tcGlsZXIgZm9yIHRoYXQKLW90aGVyIGxhbmd1YWdlIGluIG9yZGVyIHRvIGJ1aWxkIHlvdXIgcHJvZ3JhbS4gIEZvciBleGFtcGxlLCBpZiB5b3UKLXdyaXRlIHlvdXIgcHJvZ3JhbSBpbiBDKyssIHBlb3BsZSB3aWxsIGhhdmUgdG8gaW5zdGFsbCB0aGUgQysrIGNvbXBpbGVyCi1pbiBvcmRlciB0byBjb21waWxlIHlvdXIgcHJvZ3JhbS4gIFRodXMsIGl0IGlzIGJldHRlciBpZiB5b3Ugd3JpdGUgaW4gQy4KLQotQnV0IHRoZXJlIGFyZSB0aHJlZSBzaXR1YXRpb25zIHdoZW4gdGhlcmUgaXMgbm8gZGlzYWR2YW50YWdlIGluIHVzaW5nCi1zb21lIG90aGVyIGxhbmd1YWdlOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotSXQgaXMgb2theSB0byB1c2UgYW5vdGhlciBsYW5ndWFnZSBpZiB5b3VyIHByb2dyYW0gY29udGFpbnMgYW4KLWludGVycHJldGVyIGZvciB0aGF0IGxhbmd1YWdlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91ciBwcm9ncmFtIGxpbmtzIHdpdGggR1VJTEUsIGl0IGlzIG9rIHRvIHdyaXRlIHBhcnQgb2YKLXRoZSBwcm9ncmFtIGluIFNjaGVtZSBvciBhbm90aGVyIGxhbmd1YWdlIHN1cHBvcnRlZCBieSBHVUlMRS4KLQotQGl0ZW0KLUl0IGlzIG9rYXkgdG8gdXNlIGFub3RoZXIgbGFuZ3VhZ2UgaW4gYSB0b29sIHNwZWNpZmljYWxseSBpbnRlbmRlZCBmb3IKLXVzZSB3aXRoIHRoYXQgbGFuZ3VhZ2UuCi0KLVRoaXMgaXMgb2theSBiZWNhdXNlIHRoZSBvbmx5IHBlb3BsZSB3aG8gd2FudCB0byBidWlsZCB0aGUgdG9vbCB3aWxsIGJlCi10aG9zZSB3aG8gaGF2ZSBpbnN0YWxsZWQgdGhlIG90aGVyIGxhbmd1YWdlIGFueXdheS4KLQotQGl0ZW0KLUlmIGFuIGFwcGxpY2F0aW9uIGlzIG9mIGludGVyZXN0IHRvIGEgbmFycm93IGNvbW11bml0eSwgdGhlbiBwZXJoYXBzCi1pdCdzIG5vdCBpbXBvcnRhbnQgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGluY29udmVuaWVudCB0byBpbnN0YWxsLgotQGVuZCBpdGVtaXplCi0KLUMgaGFzIG9uZSBvdGhlciBhZHZhbnRhZ2Ugb3ZlciBDKysgYW5kIG90aGVyIGNvbXBpbGVkIGxhbmd1YWdlczogbW9yZQotcGVvcGxlIGtub3cgQywgc28gbW9yZSBwZW9wbGUgd2lsbCBmaW5kIGl0IGVhc3kgdG8gcmVhZCBhbmQgbW9kaWZ5IHRoZQotcHJvZ3JhbSBpZiBpdCBpcyB3cml0dGVuIGluIEMuCi0KLUBub2RlIFByb2dyYW0gQmVoYXZpb3IKLUBjaGFwdGVyIFByb2dyYW0gQmVoYXZpb3IgZm9yIEFsbCBQcm9ncmFtcwotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBkZXNjcmliZXMgaG93IHRvIHdyaXRlIHJvYnVzdCBzb2Z0d2FyZS4gSXQgYWxzbwotZGVzY3JpYmVzIGdlbmVyYWwgc3RhbmRhcmRzIGZvciBlcnJvciBtZXNzYWdlcywgdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UsCi1hbmQgaG93IGxpYnJhcmllcyBzaG91bGQgYmVoYXZlLgotCi1AbWVudQotKiBTZW1hbnRpY3M6OiAgICAgICAgICAgICAgICAgICBXcml0aW5nIHJvYnVzdCBwcm9ncmFtcwotKiBMaWJyYXJpZXM6OiAgICAgICAgICAgICAgICAgICBMaWJyYXJ5IGJlaGF2aW9yCi0qIEVycm9yczo6ICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMKLSogVXNlciBJbnRlcmZhY2VzOjogICAgICAgICAgICAgU3RhbmRhcmRzIGZvciBjb21tYW5kIGxpbmUgaW50ZXJmYWNlcwotKiBPcHRpb24gVGFibGU6OiAgICAgICAgICAgICAgICBUYWJsZSBvZiBsb25nIG9wdGlvbnMuCi0qIE1lbW9yeSBVc2FnZTo6ICAgICAgICAgICAgICAgIFdoZW4gYW5kIGhvdyB0byBjYXJlIGFib3V0IG1lbW9yeSBuZWVkcwotQGVuZCBtZW51Ci0KLUBub2RlIFNlbWFudGljcwotQHNlY3Rpb24gV3JpdGluZyBSb2J1c3QgUHJvZ3JhbXMKLQotQXZvaWQgYXJiaXRyYXJ5IGxpbWl0cyBvbiB0aGUgbGVuZ3RoIG9yIG51bWJlciBvZiBAZW1waHthbnl9IGRhdGEKLXN0cnVjdHVyZSwgaW5jbHVkaW5nIGZpbGUgbmFtZXMsIGxpbmVzLCBmaWxlcywgYW5kIHN5bWJvbHMsIGJ5IGFsbG9jYXRpbmcKLWFsbCBkYXRhIHN0cnVjdHVyZXMgZHluYW1pY2FsbHkuICBJbiBtb3N0IFVuaXggdXRpbGl0aWVzLCBgYGxvbmcgbGluZXMKLWFyZSBzaWxlbnRseSB0cnVuY2F0ZWQnJy4gIFRoaXMgaXMgbm90IGFjY2VwdGFibGUgaW4gYSBHTlUgdXRpbGl0eS4KLQotVXRpbGl0aWVzIHJlYWRpbmcgZmlsZXMgc2hvdWxkIG5vdCBkcm9wIE5VTCBjaGFyYWN0ZXJzLCBvciBhbnkgb3RoZXIKLW5vbnByaW50aW5nIGNoYXJhY3RlcnMgQGVtcGh7aW5jbHVkaW5nIHRob3NlIHdpdGggY29kZXMgYWJvdmUgMDE3N30uICBUaGUKLW9ubHkgc2Vuc2libGUgZXhjZXB0aW9ucyB3b3VsZCBiZSB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGludGVuZGVkIGZvcgotaW50ZXJmYWNlIHRvIGNlcnRhaW4gdHlwZXMgb2YgcHJpbnRlcnMgdGhhdCBjYW4ndCBoYW5kbGUgdGhvc2UgY2hhcmFjdGVycy4KLQotQ2hlY2sgZXZlcnkgc3lzdGVtIGNhbGwgZm9yIGFuIGVycm9yIHJldHVybiwgdW5sZXNzIHlvdSBrbm93IHlvdSB3aXNoIHRvCi1pZ25vcmUgZXJyb3JzLiAgSW5jbHVkZSB0aGUgc3lzdGVtIGVycm9yIHRleHQgKGZyb20gQGNvZGV7cGVycm9yfSBvcgotZXF1aXZhbGVudCkgaW4gQGVtcGh7ZXZlcnl9IGVycm9yIG1lc3NhZ2UgcmVzdWx0aW5nIGZyb20gYSBmYWlsaW5nCi1zeXN0ZW0gY2FsbCwgYXMgd2VsbCBhcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpZiBhbnkgYW5kIHRoZSBuYW1lIG9mIHRoZQotdXRpbGl0eS4gIEp1c3QgYGBjYW5ub3Qgb3BlbiBmb28uYycnIG9yIGBgc3RhdCBmYWlsZWQnJyBpcyBub3QKLXN1ZmZpY2llbnQuCi0KLUNoZWNrIGV2ZXJ5IGNhbGwgdG8gQGNvZGV7bWFsbG9jfSBvciBAY29kZXtyZWFsbG9jfSB0byBzZWUgaWYgaXQKLXJldHVybmVkIHplcm8uICBDaGVjayBAY29kZXtyZWFsbG9jfSBldmVuIGlmIHlvdSBhcmUgbWFraW5nIHRoZSBibG9jawotc21hbGxlcjsgaW4gYSBzeXN0ZW0gdGhhdCByb3VuZHMgYmxvY2sgc2l6ZXMgdG8gYSBwb3dlciBvZiAyLAotQGNvZGV7cmVhbGxvY30gbWF5IGdldCBhIGRpZmZlcmVudCBibG9jayBpZiB5b3UgYXNrIGZvciBsZXNzIHNwYWNlLgotCi1JbiBVbml4LCBAY29kZXtyZWFsbG9jfSBjYW4gZGVzdHJveSB0aGUgc3RvcmFnZSBibG9jayBpZiBpdCByZXR1cm5zCi16ZXJvLiAgR05VIEBjb2Rle3JlYWxsb2N9IGRvZXMgbm90IGhhdmUgdGhpcyBidWc6IGlmIGl0IGZhaWxzLCB0aGUKLW9yaWdpbmFsIGJsb2NrIGlzIHVuY2hhbmdlZC4gIEZlZWwgZnJlZSB0byBhc3N1bWUgdGhlIGJ1ZyBpcyBmaXhlZC4gIElmCi15b3Ugd2lzaCB0byBydW4geW91ciBwcm9ncmFtIG9uIFVuaXgsIGFuZCB3aXNoIHRvIGF2b2lkIGxvc3NhZ2UgaW4gdGhpcwotY2FzZSwgeW91IGNhbiB1c2UgdGhlIEdOVSBAY29kZXttYWxsb2N9LgotCi1Zb3UgbXVzdCBleHBlY3QgQGNvZGV7ZnJlZX0gdG8gYWx0ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9jayB0aGF0IHdhcwotZnJlZWQuICBBbnl0aGluZyB5b3Ugd2FudCB0byBmZXRjaCBmcm9tIHRoZSBibG9jaywgeW91IG11c3QgZmV0Y2ggYmVmb3JlCi1jYWxsaW5nIEBjb2Rle2ZyZWV9LgotCi1JZiBAY29kZXttYWxsb2N9IGZhaWxzIGluIGEgbm9uaW50ZXJhY3RpdmUgcHJvZ3JhbSwgbWFrZSB0aGF0IGEgZmF0YWwKLWVycm9yLiAgSW4gYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbSAob25lIHRoYXQgcmVhZHMgY29tbWFuZHMgZnJvbSB0aGUKLXVzZXIpLCBpdCBpcyBiZXR0ZXIgdG8gYWJvcnQgdGhlIGNvbW1hbmQgYW5kIHJldHVybiB0byB0aGUgY29tbWFuZAotcmVhZGVyIGxvb3AuICBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBraWxsIG90aGVyIHByb2Nlc3NlcyB0byBmcmVlIHVwCi12aXJ0dWFsIG1lbW9yeSwgYW5kIHRoZW4gdHJ5IHRoZSBjb21tYW5kIGFnYWluLgotCi1Vc2UgQGNvZGV7Z2V0b3B0X2xvbmd9IHRvIGRlY29kZSBhcmd1bWVudHMsIHVubGVzcyB0aGUgYXJndW1lbnQgc3ludGF4Ci1tYWtlcyB0aGlzIHVucmVhc29uYWJsZS4KLQotV2hlbiBzdGF0aWMgc3RvcmFnZSBpcyB0byBiZSB3cml0dGVuIGluIGR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbiwgdXNlCi1leHBsaWNpdCBDIGNvZGUgdG8gaW5pdGlhbGl6ZSBpdC4gIFJlc2VydmUgQyBpbml0aWFsaXplZCBkZWNsYXJhdGlvbnMKLWZvciBkYXRhIHRoYXQgd2lsbCBub3QgYmUgY2hhbmdlZC4KLUBjIEFEUjogd2h5PwotCi1UcnkgdG8gYXZvaWQgbG93LWxldmVsIGludGVyZmFjZXMgdG8gb2JzY3VyZSBVbml4IGRhdGEgc3RydWN0dXJlcyAoc3VjaAotYXMgZmlsZSBkaXJlY3RvcmllcywgdXRtcCwgb3IgdGhlIGxheW91dCBvZiBrZXJuZWwgbWVtb3J5KSwgc2luY2UgdGhlc2UKLWFyZSBsZXNzIGxpa2VseSB0byB3b3JrIGNvbXBhdGlibHkuICBJZiB5b3UgbmVlZCB0byBmaW5kIGFsbCB0aGUgZmlsZXMKLWluIGEgZGlyZWN0b3J5LCB1c2UgQGNvZGV7cmVhZGRpcn0gb3Igc29tZSBvdGhlciBoaWdoLWxldmVsIGludGVyZmFjZS4KLVRoZXNlIHdpbGwgYmUgc3VwcG9ydGVkIGNvbXBhdGlibHkgYnkgR05VLgotCi1CeSBkZWZhdWx0LCB0aGUgR05VIHN5c3RlbSB3aWxsIHByb3ZpZGUgdGhlIHNpZ25hbCBoYW5kbGluZyBmdW5jdGlvbnMgb2YKLUBzY3tCU0R9IGFuZCBvZiBAc2N7UE9TSVh9LiAgU28gR05VIHNvZnR3YXJlIHNob3VsZCBiZSB3cml0dGVuIHRvIHVzZQotdGhlc2UuCi0KLUluIGVycm9yIGNoZWNrcyB0aGF0IGRldGVjdCBgYGltcG9zc2libGUnJyBjb25kaXRpb25zLCBqdXN0IGFib3J0LgotVGhlcmUgaXMgdXN1YWxseSBubyBwb2ludCBpbiBwcmludGluZyBhbnkgbWVzc2FnZS4gIFRoZXNlIGNoZWNrcwotaW5kaWNhdGUgdGhlIGV4aXN0ZW5jZSBvZiBidWdzLiAgV2hvZXZlciB3YW50cyB0byBmaXggdGhlIGJ1Z3Mgd2lsbCBoYXZlCi10byByZWFkIHRoZSBzb3VyY2UgY29kZSBhbmQgcnVuIGEgZGVidWdnZXIuICBTbyBleHBsYWluIHRoZSBwcm9ibGVtIHdpdGgKLWNvbW1lbnRzIGluIHRoZSBzb3VyY2UuICBUaGUgcmVsZXZhbnQgZGF0YSB3aWxsIGJlIGluIHZhcmlhYmxlcywgd2hpY2gKLWFyZSBlYXN5IHRvIGV4YW1pbmUgd2l0aCB0aGUgZGVidWdnZXIsIHNvIHRoZXJlIGlzIG5vIHBvaW50IG1vdmluZyB0aGVtCi1lbHNld2hlcmUuCi0KLURvIG5vdCB1c2UgYSBjb3VudCBvZiBlcnJvcnMgYXMgdGhlIGV4aXQgc3RhdHVzIGZvciBhIHByb2dyYW0uCi1AZW1waHtUaGF0IGRvZXMgbm90IHdvcmt9LCBiZWNhdXNlIGV4aXQgc3RhdHVzIHZhbHVlcyBhcmUgbGltaXRlZCB0byA4Ci1iaXRzICgwIHRocm91Z2ggMjU1KS4gIEEgc2luZ2xlIHJ1biBvZiB0aGUgcHJvZ3JhbSBtaWdodCBoYXZlIDI1NgotZXJyb3JzOyBpZiB5b3UgdHJ5IHRvIHJldHVybiAyNTYgYXMgdGhlIGV4aXQgc3RhdHVzLCB0aGUgcGFyZW50IHByb2Nlc3MKLXdpbGwgc2VlIDAgYXMgdGhlIHN0YXR1cywgYW5kIGl0IHdpbGwgYXBwZWFyIHRoYXQgdGhlIHByb2dyYW0gc3VjY2VlZGVkLgotCi1JZiB5b3UgbWFrZSB0ZW1wb3JhcnkgZmlsZXMsIGNoZWNrIHRoZSBAY29kZXtUTVBESVJ9IGVudmlyb25tZW50Ci12YXJpYWJsZTsgaWYgdGhhdCB2YXJpYWJsZSBpcyBkZWZpbmVkLCB1c2UgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLWluc3RlYWQgb2YgQGZpbGV7L3RtcH0uCi0KLUBub2RlIExpYnJhcmllcwotQHNlY3Rpb24gTGlicmFyeSBCZWhhdmlvcgotCi1UcnkgdG8gbWFrZSBsaWJyYXJ5IGZ1bmN0aW9ucyByZWVudHJhbnQuICBJZiB0aGV5IG5lZWQgdG8gZG8gZHluYW1pYwotc3RvcmFnZSBhbGxvY2F0aW9uLCBhdCBsZWFzdCB0cnkgdG8gYXZvaWQgYW55IG5vbnJlZW50cmFuY3kgYXNpZGUgZnJvbQotdGhhdCBvZiBAY29kZXttYWxsb2N9IGl0c2VsZi4KLQotSGVyZSBhcmUgY2VydGFpbiBuYW1lIGNvbnZlbnRpb25zIGZvciBsaWJyYXJpZXMsIHRvIGF2b2lkIG5hbWUKLWNvbmZsaWN0cy4KLQotQ2hvb3NlIGEgbmFtZSBwcmVmaXggZm9yIHRoZSBsaWJyYXJ5LCBtb3JlIHRoYW4gdHdvIGNoYXJhY3RlcnMgbG9uZy4KLUFsbCBleHRlcm5hbCBmdW5jdGlvbiBhbmQgdmFyaWFibGUgbmFtZXMgc2hvdWxkIHN0YXJ0IHdpdGggdGhpcwotcHJlZml4LiAgSW4gYWRkaXRpb24sIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBvZiB0aGVzZSBpbiBhbnkgZ2l2ZW4KLWxpYnJhcnkgbWVtYmVyLiAgVGhpcyB1c3VhbGx5IG1lYW5zIHB1dHRpbmcgZWFjaCBvbmUgaW4gYSBzZXBhcmF0ZQotc291cmNlIGZpbGUuCi0KLUFuIGV4Y2VwdGlvbiBjYW4gYmUgbWFkZSB3aGVuIHR3byBleHRlcm5hbCBzeW1ib2xzIGFyZSBhbHdheXMgdXNlZAotdG9nZXRoZXIsIHNvIHRoYXQgbm8gcmVhc29uYWJsZSBwcm9ncmFtIGNvdWxkIHVzZSBvbmUgd2l0aG91dCB0aGUKLW90aGVyOyB0aGVuIHRoZXkgY2FuIGJvdGggZ28gaW4gdGhlIHNhbWUgZmlsZS4KLQotRXh0ZXJuYWwgc3ltYm9scyB0aGF0IGFyZSBub3QgZG9jdW1lbnRlZCBlbnRyeSBwb2ludHMgZm9yIHRoZSB1c2VyCi1zaG91bGQgaGF2ZSBuYW1lcyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtffS4gIFRoZXkgc2hvdWxkIGFsc28gY29udGFpbgotdGhlIGNob3NlbiBuYW1lIHByZWZpeCBmb3IgdGhlIGxpYnJhcnksIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aXRoCi1vdGhlciBsaWJyYXJpZXMuICBUaGVzZSBjYW4gZ28gaW4gdGhlIHNhbWUgZmlsZXMgd2l0aCB1c2VyIGVudHJ5Ci1wb2ludHMgaWYgeW91IGxpa2UuCi0KLVN0YXRpYyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBjYW4gYmUgdXNlZCBhcyB5b3UgbGlrZSBhbmQgbmVlZCBub3QKLWZpdCBhbnkgbmFtaW5nIGNvbnZlbnRpb24uCi0KLUBub2RlIEVycm9ycwotQHNlY3Rpb24gRm9ybWF0dGluZyBFcnJvciBNZXNzYWdlcwotCi1FcnJvciBtZXNzYWdlcyBmcm9tIGNvbXBpbGVycyBzaG91bGQgbG9vayBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye3NvdXJjZS1maWxlLW5hbWV9OkB2YXJ7bGluZW5vfTogQHZhcnttZXNzYWdlfQotQGVuZCBleGFtcGxlCi0KLUVycm9yIG1lc3NhZ2VzIGZyb20gb3RoZXIgbm9uaW50ZXJhY3RpdmUgcHJvZ3JhbXMgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotQHZhcntwcm9ncmFtfTpAdmFye3NvdXJjZS1maWxlLW5hbWV9OkB2YXJ7bGluZW5vfTogQHZhcnttZXNzYWdlfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlbiB0aGVyZSBpcyBhbiBhcHByb3ByaWF0ZSBzb3VyY2UgZmlsZSwgb3IgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotQHZhcntwcm9ncmFtfTogQHZhcnttZXNzYWdlfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlbiB0aGVyZSBpcyBubyByZWxldmFudCBzb3VyY2UgZmlsZS4KLQotSW4gYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbSAob25lIHRoYXQgaXMgcmVhZGluZyBjb21tYW5kcyBmcm9tIGEKLXRlcm1pbmFsKSwgaXQgaXMgYmV0dGVyIG5vdCB0byBpbmNsdWRlIHRoZSBwcm9ncmFtIG5hbWUgaW4gYW4gZXJyb3IKLW1lc3NhZ2UuICBUaGUgcGxhY2UgdG8gaW5kaWNhdGUgd2hpY2ggcHJvZ3JhbSBpcyBydW5uaW5nIGlzIGluIHRoZQotcHJvbXB0IG9yIHdpdGggdGhlIHNjcmVlbiBsYXlvdXQuICAoV2hlbiB0aGUgc2FtZSBwcm9ncmFtIHJ1bnMgd2l0aAotaW5wdXQgZnJvbSBhIHNvdXJjZSBvdGhlciB0aGFuIGEgdGVybWluYWwsIGl0IGlzIG5vdCBpbnRlcmFjdGl2ZSBhbmQKLXdvdWxkIGRvIGJlc3QgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgdGhlIG5vbmludGVyYWN0aXZlIHN0eWxlLikKLQotVGhlIHN0cmluZyBAdmFye21lc3NhZ2V9IHNob3VsZCBub3QgYmVnaW4gd2l0aCBhIGNhcGl0YWwgbGV0dGVyIHdoZW4KLWl0IGZvbGxvd3MgYSBwcm9ncmFtIG5hbWUgYW5kL29yIGZpbGUgbmFtZS4gIEFsc28sIGl0IHNob3VsZCBub3QgZW5kCi13aXRoIGEgcGVyaW9kLgotCi1FcnJvciBtZXNzYWdlcyBmcm9tIGludGVyYWN0aXZlIHByb2dyYW1zLCBhbmQgb3RoZXIgbWVzc2FnZXMgc3VjaCBhcwotdXNhZ2UgbWVzc2FnZXMsIHNob3VsZCBzdGFydCB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIuICBCdXQgdGhleSBzaG91bGQgbm90Ci1lbmQgd2l0aCBhIHBlcmlvZC4KLQotQG5vZGUgVXNlciBJbnRlcmZhY2VzCi1Ac2VjdGlvbiBTdGFuZGFyZHMgZm9yIENvbW1hbmQgTGluZSBJbnRlcmZhY2VzCi0KLVBsZWFzZSBkb24ndCBtYWtlIHRoZSBiZWhhdmlvciBvZiBhIHV0aWxpdHkgZGVwZW5kIG9uIHRoZSBuYW1lIHVzZWQKLXRvIGludm9rZSBpdC4gIEl0IGlzIHVzZWZ1bCBzb21ldGltZXMgdG8gbWFrZSBhIGxpbmsgdG8gYSB1dGlsaXR5Ci13aXRoIGEgZGlmZmVyZW50IG5hbWUsIGFuZCB0aGF0IHNob3VsZCBub3QgY2hhbmdlIHdoYXQgaXQgZG9lcy4KLQotSW5zdGVhZCwgdXNlIGEgcnVuIHRpbWUgb3B0aW9uIG9yIGEgY29tcGlsYXRpb24gc3dpdGNoIG9yIGJvdGgKLXRvIHNlbGVjdCBhbW9uZyB0aGUgYWx0ZXJuYXRlIGJlaGF2aW9ycy4KLQotTGlrZXdpc2UsIHBsZWFzZSBkb24ndCBtYWtlIHRoZSBiZWhhdmlvciBvZiB0aGUgcHJvZ3JhbSBkZXBlbmQgb24gdGhlCi10eXBlIG9mIG91dHB1dCBkZXZpY2UgaXQgaXMgdXNlZCB3aXRoLiAgRGV2aWNlIGluZGVwZW5kZW5jZSBpcyBhbgotaW1wb3J0YW50IHByaW5jaXBsZSBvZiB0aGUgc3lzdGVtJ3MgZGVzaWduOyBkbyBub3QgY29tcHJvbWlzZSBpdAotbWVyZWx5IHRvIHNhdmUgc29tZW9uZSBmcm9tIHR5cGluZyBhbiBvcHRpb24gbm93IGFuZCB0aGVuLgotCi1JZiB5b3UgdGhpbmsgb25lIGJlaGF2aW9yIGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIG91dHB1dCBpcyB0byBhCi10ZXJtaW5hbCwgYW5kIGFub3RoZXIgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgb3V0cHV0IGlzIGEgZmlsZSBvciBhCi1waXBlLCB0aGVuIGl0IGlzIHVzdWFsbHkgYmVzdCB0byBtYWtlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHRoZSBvbmUgdGhhdAotaXMgdXNlZnVsIHdpdGggb3V0cHV0IHRvIGEgdGVybWluYWwsIGFuZCBoYXZlIGFuIG9wdGlvbiBmb3IgdGhlIG90aGVyCi1iZWhhdmlvci4KLQotQ29tcGF0aWJpbGl0eSByZXF1aXJlcyBjZXJ0YWluIHByb2dyYW1zIHRvIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBvdXRwdXQKLWRldmljZS4gIEl0IHdvdWxkIGJlIGRpc2FzdHJvdXMgaWYgQGNvZGV7bHN9IG9yIEBjb2Rle3NofSBkaWQgbm90IGRvIHNvCi1pbiB0aGUgd2F5IGFsbCB1c2VycyBleHBlY3QuICBJbiBzb21lIG9mIHRoZXNlIGNhc2VzLCB3ZSBzdXBwbGVtZW50IHRoZQotcHJvZ3JhbSB3aXRoIGEgcHJlZmVycmVkIGFsdGVybmF0ZSB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQotb3V0cHV0IGRldmljZSB0eXBlLiAgRm9yIGV4YW1wbGUsIHdlIHByb3ZpZGUgYSBAY29kZXtkaXJ9IHByb2dyYW0gbXVjaAotbGlrZSBAY29kZXtsc30gZXhjZXB0IHRoYXQgaXRzIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCBpcyBhbHdheXMKLW11bHRpLWNvbHVtbiBmb3JtYXQuCi0KLUl0IGlzIGEgZ29vZCBpZGVhIHRvIGZvbGxvdyB0aGUgQHNje1BPU0lYfSBndWlkZWxpbmVzIGZvciB0aGUKLWNvbW1hbmQtbGluZSBvcHRpb25zIG9mIGEgcHJvZ3JhbS4gIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIHVzZQotQGNvZGV7Z2V0b3B0fSB0byBwYXJzZSB0aGVtLiAgTm90ZSB0aGF0IHRoZSBHTlUgdmVyc2lvbiBvZiBAY29kZXtnZXRvcHR9Ci13aWxsIG5vcm1hbGx5IHBlcm1pdCBvcHRpb25zIGFueXdoZXJlIGFtb25nIHRoZSBhcmd1bWVudHMgdW5sZXNzIHRoZQotc3BlY2lhbCBhcmd1bWVudCBAc2FtcHstLX0gaXMgdXNlZC4gIFRoaXMgaXMgbm90IHdoYXQgQHNje1BPU0lYfQotc3BlY2lmaWVzOyBpdCBpcyBhIEdOVSBleHRlbnNpb24uCi0KLVBsZWFzZSBkZWZpbmUgbG9uZy1uYW1lZCBvcHRpb25zIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8gdGhlCi1zaW5nbGUtbGV0dGVyIFVuaXgtc3R5bGUgb3B0aW9ucy4gIFdlIGhvcGUgdG8gbWFrZSBHTlUgbW9yZSB1c2VyCi1mcmllbmRseSB0aGlzIHdheS4gIFRoaXMgaXMgZWFzeSB0byBkbyB3aXRoIHRoZSBHTlUgZnVuY3Rpb24KLUBjb2Rle2dldG9wdF9sb25nfS4KLQotT25lIG9mIHRoZSBhZHZhbnRhZ2VzIG9mIGxvbmctbmFtZWQgb3B0aW9ucyBpcyB0aGF0IHRoZXkgY2FuIGJlCi1jb25zaXN0ZW50IGZyb20gcHJvZ3JhbSB0byBwcm9ncmFtLiAgRm9yIGV4YW1wbGUsIHVzZXJzIHNob3VsZCBiZSBhYmxlCi10byBleHBlY3QgdGhlIGBgdmVyYm9zZScnIG9wdGlvbiBvZiBhbnkgR05VIHByb2dyYW0gd2hpY2ggaGFzIG9uZSwgdG8gYmUKLXNwZWxsZWQgcHJlY2lzZWx5IEBzYW1wey0tdmVyYm9zZX0uICBUbyBhY2hpZXZlIHRoaXMgdW5pZm9ybWl0eSwgbG9vayBhdAotdGhlIHRhYmxlIG9mIGNvbW1vbiBsb25nLW9wdGlvbiBuYW1lcyB3aGVuIHlvdSBjaG9vc2UgdGhlIG9wdGlvbiBuYW1lcwotZm9yIHlvdXIgcHJvZ3JhbSAoQHB4cmVme09wdGlvbiBUYWJsZX0pLgotCi1JdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIGZvciBmaWxlIG5hbWVzIGdpdmVuIGFzIG9yZGluYXJ5IGFyZ3VtZW50cyB0bwotYmUgaW5wdXQgZmlsZXMgb25seTsgYW55IG91dHB1dCBmaWxlcyB3b3VsZCBiZSBzcGVjaWZpZWQgdXNpbmcgb3B0aW9ucwotKHByZWZlcmFibHkgQHNhbXB7LW99IG9yIEBzYW1wey0tb3V0cHV0fSkuICBFdmVuIGlmIHlvdSBhbGxvdyBhbiBvdXRwdXQKLWZpbGUgbmFtZSBhcyBhbiBvcmRpbmFyeSBhcmd1bWVudCBmb3IgY29tcGF0aWJpbGl0eSwgdHJ5IHRvIHByb3ZpZGUgYW4KLW9wdGlvbiBhcyBhbm90aGVyIHdheSB0byBzcGVjaWZ5IGl0LiAgVGhpcyB3aWxsIGxlYWQgdG8gbW9yZSBjb25zaXN0ZW5jeQotYW1vbmcgR05VIHV0aWxpdGllcywgYW5kIGZld2VyIGlkaW9zeW5jcmFjaWVzIGZvciB1c2VycyB0byByZW1lbWJlci4KLQotQWxsIHByb2dyYW1zIHNob3VsZCBzdXBwb3J0IHR3byBzdGFuZGFyZCBvcHRpb25zOiBAc2FtcHstLXZlcnNpb259Ci1hbmQgQHNhbXB7LS1oZWxwfS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtLXZlcnNpb24KLVRoaXMgb3B0aW9uIHNob3VsZCBkaXJlY3QgdGhlIHByb2dyYW0gdG8gaW5mb3JtYXRpb24gYWJvdXQgaXRzIG5hbWUsCi12ZXJzaW9uLCBvcmlnaW4gYW5kIGxlZ2FsIHN0YXR1cywgYWxsIG9uIHN0YW5kYXJkIG91dHB1dCwgYW5kIHRoZW4gZXhpdAotc3VjY2Vzc2Z1bGx5LiAgT3RoZXIgb3B0aW9ucyBhbmQgYXJndW1lbnRzIHNob3VsZCBiZSBpZ25vcmVkIG9uY2UgdGhpcwotaXMgc2VlbiwgYW5kIHRoZSBwcm9ncmFtIHNob3VsZCBub3QgcGVyZm9ybSBpdHMgbm9ybWFsIGZ1bmN0aW9uLgotCi1UaGUgZmlyc3QgbGluZSBpcyBtZWFudCB0byBiZSBlYXN5IGZvciBhIHByb2dyYW0gdG8gcGFyc2U7IHRoZSB2ZXJzaW9uCi1udW1iZXIgcHJvcGVyIHN0YXJ0cyBhZnRlciB0aGUgbGFzdCBzcGFjZS4gIEluIGFkZGl0aW9uLCBpdCBjb250YWlucwotdGhlIGNhbm9uaWNhbCBuYW1lIGZvciB0aGlzIHByb2dyYW0sIGluIHRoaXMgZm9ybWF0OgotCi1AZXhhbXBsZQotR05VIEVtYWNzIDE5LjMwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgcHJvZ3JhbSdzIG5hbWUgc2hvdWxkIGJlIGEgY29uc3RhbnQgc3RyaW5nOyBAZW1waHtkb24ndH0gY29tcHV0ZSBpdAotZnJvbSBAY29kZXthcmd2WzBdfS4gIFRoZSBpZGVhIGlzIHRvIHN0YXRlIHRoZSBzdGFuZGFyZCBvciBjYW5vbmljYWwKLW5hbWUgZm9yIHRoZSBwcm9ncmFtLCBub3QgaXRzIGZpbGUgbmFtZS4gIFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGZpbmQKLW91dCB0aGUgcHJlY2lzZSBmaWxlIG5hbWUgd2hlcmUgYSBjb21tYW5kIGlzIGZvdW5kIGluIEBjb2Rle1BBVEh9LgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBhIHN1YnNpZGlhcnkgcGFydCBvZiBhIGxhcmdlciBwYWNrYWdlLCBtZW50aW9uIHRoZQotcGFja2FnZSBuYW1lIGluIHBhcmVudGhlc2VzLCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1lbWFjc3NlcnZlciAoR05VIEVtYWNzKSAxOS4zMAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotSWYgdGhlIHBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhpcwotcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyLCB5b3UgY2FuIG1lbnRpb24gdGhlIHBhY2thZ2UgdmVyc2lvbiBudW1iZXIKLWp1c3QgYmVmb3JlIHRoZSBjbG9zZS1wYXJlbnRoZXNpcy4KLQotSWYgeW91IEBzdHJvbmd7bmVlZH0gdG8gbWVudGlvbiB0aGUgdmVyc2lvbiBudW1iZXJzIG9mIGxpYnJhcmllcyB3aGljaAotYXJlIGRpc3RyaWJ1dGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgcGFja2FnZSB3aGljaCBjb250YWlucyB0aGlzIHByb2dyYW0sCi15b3UgY2FuIGRvIHNvIGJ5IHByaW50aW5nIGFuIGFkZGl0aW9uYWwgbGluZSBvZiB2ZXJzaW9uIGluZm8gZm9yIGVhY2gKLWxpYnJhcnkgeW91IHdhbnQgdG8gbWVudGlvbi4gIFVzZSB0aGUgc2FtZSBmb3JtYXQgZm9yIHRoZXNlIGxpbmVzIGFzIGZvcgotdGhlIGZpcnN0IGxpbmUuCi0KLVBsZWFzZSBkbyBub3QgbWVudGlvbiBhbGwgb2YgdGhlIGxpYnJhcmllcyB0aGF0IHRoZSBwcm9ncmFtIHVzZXMgYGBqdXN0Ci1mb3IgY29tcGxldGVuZXNzJyctLS10aGF0IHdvdWxkIHByb2R1Y2UgYSBsb3Qgb2YgdW5oZWxwZnVsIGNsdXR0ZXIuCi1QbGVhc2UgbWVudGlvbiBsaWJyYXJ5IHZlcnNpb24gbnVtYmVycyBvbmx5IGlmIHlvdSBmaW5kIGluIHByYWN0aWNlIHRoYXQKLXRoZXkgYXJlIHZlcnkgaW1wb3J0YW50IHRvIHlvdSBpbiBkZWJ1Z2dpbmcuCi0KLVRoZSBmb2xsb3dpbmcgbGluZSwgYWZ0ZXIgdGhlIHZlcnNpb24gbnVtYmVyIGxpbmUgb3IgbGluZXMsIHNob3VsZCBiZSBhCi1jb3B5cmlnaHQgbm90aWNlLiAgSWYgbW9yZSB0aGFuIG9uZSBjb3B5cmlnaHQgbm90aWNlIGlzIGNhbGxlZCBmb3IsIHB1dAotZWFjaCBvbiBhIHNlcGFyYXRlIGxpbmUuCi0KLU5leHQgc2hvdWxkIGZvbGxvdyBhIGJyaWVmIHN0YXRlbWVudCB0aGF0IHRoZSBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUsCi1hbmQgdGhhdCB1c2VycyBhcmUgZnJlZSB0byBjb3B5IGFuZCBjaGFuZ2UgaXQgb24gY2VydGFpbiBjb25kaXRpb25zLiAgSWYKLXRoZSBwcm9ncmFtIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHUEwsIHNheSBzbyBoZXJlLiAgQWxzbyBtZW50aW9uIHRoYXQKLXRoZXJlIGlzIG5vIHdhcnJhbnR5LCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuCi0KLUl0IGlzIG9rIHRvIGZpbmlzaCB0aGUgb3V0cHV0IHdpdGggYSBsaXN0IG9mIHRoZSBtYWpvciBhdXRob3JzIG9mIHRoZQotcHJvZ3JhbSwgYXMgYSB3YXkgb2YgZ2l2aW5nIGNyZWRpdC4KLQotSGVyZSdzIGFuIGV4YW1wbGUgb2Ygb3V0cHV0IHRoYXQgZm9sbG93cyB0aGVzZSBydWxlczoKLQotQHNtYWxsZXhhbXBsZQotR05VIEVtYWNzIDE5LjM0LjUKLUNvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUdOVSBFbWFjcyBjb21lcyB3aXRoIE5PIFdBUlJBTlRZLAotdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LgotWW91IG1heSByZWRpc3RyaWJ1dGUgY29waWVzIG9mIEdOVSBFbWFjcwotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLUZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIG1hdHRlcnMsCi1zZWUgdGhlIGZpbGVzIG5hbWVkIENPUFlJTkcuCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Zb3Ugc2hvdWxkIGFkYXB0IHRoaXMgdG8geW91ciBwcm9ncmFtLCBvZiBjb3Vyc2UsIGZpbGxpbmcgaW4gdGhlIHByb3BlcgoteWVhciwgY29weXJpZ2h0IGhvbGRlciwgbmFtZSBvZiBwcm9ncmFtLCBhbmQgdGhlIHJlZmVyZW5jZXMgdG8KLWRpc3RyaWJ1dGlvbiB0ZXJtcywgYW5kIGNoYW5naW5nIHRoZSByZXN0IG9mIHRoZSB3b3JkaW5nIGFzIG5lY2Vzc2FyeS4KLQotVGhpcyBjb3B5cmlnaHQgbm90aWNlIG9ubHkgbmVlZHMgdG8gbWVudGlvbiB0aGUgbW9zdCByZWNlbnQgeWVhciBpbgotd2hpY2ggY2hhbmdlcyB3ZXJlIG1hZGUtLS10aGVyZSdzIG5vIG5lZWQgdG8gbGlzdCB0aGUgeWVhcnMgZm9yIHByZXZpb3VzCi12ZXJzaW9ucycgY2hhbmdlcy4gIFlvdSBkb24ndCBoYXZlIHRvIG1lbnRpb24gdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gaW4KLXRoZXNlIG5vdGljZXMsIGlmIHRoYXQgaXMgaW5jb252ZW5pZW50LCBzaW5jZSBpdCBhcHBlYXJlZCBpbiB0aGUgZmlyc3QKLWxpbmUuCi0KLUBpdGVtIC0taGVscAotVGhpcyBvcHRpb24gc2hvdWxkIG91dHB1dCBicmllZiBkb2N1bWVudGF0aW9uIGZvciBob3cgdG8gaW52b2tlIHRoZQotcHJvZ3JhbSwgb24gc3RhbmRhcmQgb3V0cHV0LCB0aGVuIGV4aXQgc3VjY2Vzc2Z1bGx5LiAgT3RoZXIgb3B0aW9ucyBhbmQKLWFyZ3VtZW50cyBzaG91bGQgYmUgaWdub3JlZCBvbmNlIHRoaXMgaXMgc2VlbiwgYW5kIHRoZSBwcm9ncmFtIHNob3VsZAotbm90IHBlcmZvcm0gaXRzIG5vcm1hbCBmdW5jdGlvbi4KLQotTmVhciB0aGUgZW5kIG9mIHRoZSBAc2FtcHstLWhlbHB9IG9wdGlvbidzIG91dHB1dCB0aGVyZSBzaG91bGQgYmUgYSBsaW5lCi10aGF0IHNheXMgd2hlcmUgdG8gbWFpbCBidWcgcmVwb3J0cy4gIEl0IHNob3VsZCBoYXZlIHRoaXMgZm9ybWF0OgotCi1AZXhhbXBsZQotUmVwb3J0IGJ1Z3MgdG8gQHZhcnttYWlsaW5nLWFkZHJlc3N9LgotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi0KLUBub2RlIE9wdGlvbiBUYWJsZQotQHNlY3Rpb24gVGFibGUgb2YgTG9uZyBPcHRpb25zCi0KLUhlcmUgaXMgYSB0YWJsZSBvZiBsb25nIG9wdGlvbnMgdXNlZCBieSBHTlUgcHJvZ3JhbXMuICBJdCBpcyBzdXJlbHkKLWluY29tcGxldGUsIGJ1dCB3ZSBhaW0gdG8gbGlzdCBhbGwgdGhlIG9wdGlvbnMgdGhhdCBhIG5ldyBwcm9ncmFtIG1pZ2h0Ci13YW50IHRvIGJlIGNvbXBhdGlibGUgd2l0aC4gIElmIHlvdSB1c2UgbmFtZXMgbm90IGFscmVhZHkgaW4gdGhlIHRhYmxlLAotcGxlYXNlIHNlbmQgQGVtYWlse2dudUBAZ251Lm9yZ30gYSBsaXN0IG9mIHRoZW0sIHdpdGggdGhlaXIKLW1lYW5pbmdzLCBzbyB3ZSBjYW4gdXBkYXRlIHRoZSB0YWJsZS4KLQotQGMgUGxlYXNlIGxlYXZlIG5ld2xpbmVzIGJldHdlZW4gaXRlbXMgaW4gdGhpcyB0YWJsZTsgaXQncyBtdWNoIGVhc2llcgotQGMgdG8gdXBkYXRlIHdoZW4gaXQgaXNuJ3QgY29tcGxldGVseSBzcXVhc2hlZCB0b2dldGhlciBhbmQgdW5yZWFkYWJsZS4KLUBjIFdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzaG9ydCBvcHRpb24gZm9yIGEgbG9uZyBvcHRpb24gbmFtZSwgcHV0Ci1AYyBhIHNlbWljb2xvbiBiZXR3ZWVuIHRoZSBsaXN0cyBvZiB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UgdGhlbSwgbm90IGEKLUBjIHBlcmlvZC4gICAtLWZyaWVkbWFuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYWZ0ZXItZGF0ZQotQHNhbXB7LU59IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGFsbAotQHNhbXB7LWF9IGluIEBjb2Rle2R1fSwgQGNvZGV7bHN9LCBAY29kZXtubX0sIEBjb2Rle3N0dHl9LCBAY29kZXt1bmFtZX0sCi1hbmQgQGNvZGV7dW5leHBhbmR9LgotCi1AaXRlbSBhbGwtdGV4dAotQHNhbXB7LWF9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBhbG1vc3QtYWxsCi1Ac2FtcHstQX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBhcHBlbmQKLUBzYW1wey1hfSBpbiBAY29kZXtldGFnc30sIEBjb2Rle3RlZX0sIEBjb2Rle3RpbWV9OwotQHNhbXB7LXJ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGFyY2hpdmUKLUBzYW1wey1hfSBpbiBAY29kZXtjcH0uCi0KLUBpdGVtIGFyY2hpdmUtbmFtZQotQHNhbXB7LW59IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBhcmdsZW5ndGgKLUBzYW1wey1sfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGFzY2lpCi1Ac2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGFzc2lnbgotQHNhbXB7LXZ9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBhc3N1bWUtbmV3Ci1Ac2FtcHstV30gaW4gTWFrZS4KLQotQGl0ZW0gYXNzdW1lLW9sZAotQHNhbXB7LW99IGluIE1ha2UuCi0KLUBpdGVtIGF1dG8tY2hlY2sKLUBzYW1wey1hfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBhdXRvLXBhZ2VyCi1Ac2FtcHstYX0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBhdXRvLXJlZmVyZW5jZQotQHNhbXB7LUF9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGF2b2lkLXdyYXBzCi1Ac2FtcHstbn0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBiYWNrd2FyZC1zZWFyY2gKLUBzYW1wey1CfSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIGJhc2VuYW1lCi1Ac2FtcHstZn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGJhdGNoCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gYmF1ZAotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGJlZm9yZQotQHNhbXB7LWJ9IGluIEBjb2Rle3RhY30uCi0KLUBpdGVtIGJpbmFyeQotQHNhbXB7LWJ9IGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXtkaWZmfS4KLQotQGl0ZW0gYml0cy1wZXItY29kZQotQHNhbXB7LWJ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBibG9jay1zaXplCi1Vc2VkIGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXt0YXJ9LgotCi1AaXRlbSBibG9ja3MKLUBzYW1wey1ifSBpbiBAY29kZXtoZWFkfSBhbmQgQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGJyZWFrLWZpbGUKLUBzYW1wey1ifSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBicmllZgotVXNlZCBpbiB2YXJpb3VzIHByb2dyYW1zIHRvIG1ha2Ugb3V0cHV0IHNob3J0ZXIuCi0KLUBpdGVtIGJ5dGVzCi1Ac2FtcHstY30gaW4gQGNvZGV7aGVhZH0sIEBjb2Rle3NwbGl0fSwgYW5kIEBjb2Rle3RhaWx9LgotCi1AaXRlbSBjQHR7Kyt9Ci1Ac2FtcHstQ30gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBjYXRlbmF0ZQotQHNhbXB7LUF9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGNkCi1Vc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHRvIHVzZS4KLQotQGl0ZW0gY2hhbmdlcwotQHNhbXB7LWN9IGluIEBjb2Rle2NoZ3JwfSBhbmQgQGNvZGV7Y2hvd259LgotCi1AaXRlbSBjbGFzc2lmeQotQHNhbXB7LUZ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gY29sb25zCi1Ac2FtcHstY30gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gY29tbWFuZAotQHNhbXB7LWN9IGluIEBjb2Rle3N1fTsKLUBzYW1wey14fSBpbiBHREIuCi0KLUBpdGVtIGNvbXBhcmUKLUBzYW1wey1kfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjb21wYXQKLVVzZWQgaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGNvbXByZXNzCi1Ac2FtcHstWn0gaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGNvbmNhdGVuYXRlCi1Ac2FtcHstQX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gY29uZmlybWF0aW9uCi1Ac2FtcHstd30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gY29udGV4dAotVXNlZCBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gY29weWxlZnQKLUBzYW1wey1XIGNvcHlsZWZ0fSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gY29weXJpZ2h0Ci1Ac2FtcHstQ30gaW4gQGNvZGV7cHR4fSwgQGNvZGV7cmVjb2RlfSwgYW5kIEBjb2Rle3dkaWZmfTsKLUBzYW1wey1XIGNvcHlyaWdodH0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGNvcmUKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBjb3VudAotQHNhbXB7LXF9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIGNvdW50LWxpbmtzCi1Ac2FtcHstbH0gaW4gQGNvZGV7ZHV9LgotCi1AaXRlbSBjcmVhdGUKLVVzZWQgaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIGN1dC1tYXJrCi1Ac2FtcHstY30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGN4cmVmCi1Ac2FtcHsteH0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSBkYXRlCi1Ac2FtcHstZH0gaW4gQGNvZGV7dG91Y2h9LgotCi1AaXRlbSBkZWJ1ZwotQHNhbXB7LWR9IGluIE1ha2UgYW5kIEBjb2Rle200fTsKLUBzYW1wey10fSBpbiBCaXNvbi4KLQotQGl0ZW0gZGVmaW5lCi1Ac2FtcHstRH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBkZWZpbmVzCi1Ac2FtcHstZH0gaW4gQmlzb24gYW5kIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gZGVsZXRlCi1Ac2FtcHstRH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZGVyZWZlcmVuY2UKLUBzYW1wey1MfSBpbiBAY29kZXtjaGdycH0sIEBjb2Rle2Nob3dufSwgQGNvZGV7Y3Bpb30sIEBjb2Rle2R1fSwKLUBjb2Rle2xzfSwgYW5kIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGRlcmVmZXJlbmNlLWFyZ3MKLUBzYW1wey1EfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIGRpYWNyaXRpY3MKLUBzYW1wey1kfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBkaWN0aW9uYXJ5LW9yZGVyCi1Ac2FtcHstZH0gaW4gQGNvZGV7bG9va30uCi0KLUBpdGVtIGRpZmYKLUBzYW1wey1kfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBkaWdpdHMKLUBzYW1wey1ufSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBkaXJlY3RvcnkKLVNwZWNpZnkgdGhlIGRpcmVjdG9yeSB0byB1c2UsIGluIHZhcmlvdXMgcHJvZ3JhbXMuICBJbiBAY29kZXtsc30sIGl0Ci1tZWFucyB0byBzaG93IGRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMgcmF0aGVyIHRoYW4gdGhlaXIgY29udGVudHMuICBJbgotQGNvZGV7cm19IGFuZCBAY29kZXtsbn0sIGl0IG1lYW5zIHRvIG5vdCB0cmVhdCBsaW5rcyB0byBkaXJlY3Rvcmllcwotc3BlY2lhbGx5LgotCi1AaXRlbSBkaXNjYXJkLWFsbAotQHNhbXB7LXh9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gZGlzY2FyZC1sb2NhbHMKLUBzYW1wey1YfSBpbiBAY29kZXtzdHJpcH0uCi0KLUBpdGVtIGRyeS1ydW4KLUBzYW1wey1ufSBpbiBNYWtlLgotCi1AaXRlbSBlZAotQHNhbXB7LWV9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBlbGlkZS1lbXB0eS1maWxlcwotQHNhbXB7LXp9IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIGVuZC1kZWxldGUKLUBzYW1wey14fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGVuZC1pbnNlcnQKLUBzYW1wey16fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGVudGlyZS1uZXctZmlsZQotQHNhbXB7LU59IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBlbnZpcm9ubWVudC1vdmVycmlkZXMKLUBzYW1wey1lfSBpbiBNYWtlLgotCi1AaXRlbSBlb2YKLUBzYW1wey1lfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIGVwb2NoCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gZXJyb3ItbGltaXQKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBlcnJvci1vdXRwdXQKLUBzYW1wey1vfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGVzY2FwZQotQHNhbXB7LWJ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gZXhjbHVkZS1mcm9tCi1Ac2FtcHstWH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZXhlYwotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGV4aXQKLUBzYW1wey14fSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIGV4aXQtMAotQHNhbXB7LWV9IGluIEBjb2Rle3Vuc2hhcn0uCi0KLUBpdGVtIGV4cGFuZC10YWJzCi1Ac2FtcHstdH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGV4cHJlc3Npb24KLUBzYW1wey1lfSBpbiBAY29kZXtzZWR9LgotCi1AaXRlbSBleHRlcm4tb25seQotQHNhbXB7LWd9IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gZXh0cmFjdAotQHNhbXB7LWl9IGluIEBjb2Rle2NwaW99OwotQHNhbXB7LXh9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGZhY2VzCi1Ac2FtcHstZn0gaW4gQGNvZGV7ZmluZ2VyfS4KLQotQGl0ZW0gZmFzdAotQHNhbXB7LWZ9IGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gZmF0YWwtd2FybmluZ3MKLUBzYW1wey1FfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGZpbGUKLUBzYW1wey1mfSBpbiBAY29kZXtpbmZvfSwgQGNvZGV7Z2F3a30sIE1ha2UsIEBjb2Rle210fSwgYW5kIEBjb2Rle3Rhcn07Ci1Ac2FtcHstbn0gaW4gQGNvZGV7c2VkfTsKLUBzYW1wey1yfSBpbiBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIGZpZWxkLXNlcGFyYXRvcgotQHNhbXB7LUZ9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBmaWxlLXByZWZpeAotQHNhbXB7LWJ9IGluIEJpc29uLgotCi1AaXRlbSBmaWxlLXR5cGUKLUBzYW1wey1GfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGZpbGVzLWZyb20KLUBzYW1wey1UfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBmaWxsLWNvbHVtbgotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIGZsYWctdHJ1bmNhdGlvbgotQHNhbXB7LUZ9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGZpeGVkLW91dHB1dC1maWxlcwotQHNhbXB7LXl9IGluIEJpc29uLgotCi1AaXRlbSBmb2xsb3cKLUBzYW1wey1mfSBpbiBAY29kZXt0YWlsfS4KLQotQGl0ZW0gZm9vdG5vdGUtc3R5bGUKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBmb3JjZQotQHNhbXB7LWZ9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0sIGFuZCBAY29kZXtybX0uCi0KLUBpdGVtIGZvcmNlLXByZWZpeAotQHNhbXB7LUZ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBmb3JtYXQKLVVzZWQgaW4gQGNvZGV7bHN9LCBAY29kZXt0aW1lfSwgYW5kIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGZyZWV6ZS1zdGF0ZQotQHNhbXB7LUZ9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZnVsbG5hbWUKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBnYXAtc2l6ZQotQHNhbXB7LWd9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGdldAotQHNhbXB7LXh9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGdyYXBoaWMKLUBzYW1wey1pfSBpbiBAY29kZXt1bH0uCi0KLUBpdGVtIGdyYXBoaWNzCi1Ac2FtcHstZ30gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gZ3JvdXAKLUBzYW1wey1nfSBpbiBAY29kZXtpbnN0YWxsfS4KLQotQGl0ZW0gZ3ppcAotQHNhbXB7LXp9IGluIEBjb2Rle3Rhcn0gYW5kIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBoYXNoc2l6ZQotQHNhbXB7LUh9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gaGVhZGVyCi1Ac2FtcHstaH0gaW4gQGNvZGV7b2JqZHVtcH0gYW5kIEBjb2Rle3JlY29kZX0KLQotQGl0ZW0gaGVhZGluZwotQHNhbXB7LUh9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIGhlbHAKLVVzZWQgdG8gYXNrIGZvciBicmllZiB1c2FnZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gaGVyZS1kZWxpbWl0ZXIKLUBzYW1wey1kfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gaGlkZS1jb250cm9sLWNoYXJzCi1Ac2FtcHstcX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBpZGxlCi1Ac2FtcHstdX0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gaWZkZWYKLUBzYW1wey1EfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlCi1Ac2FtcHstSX0gaW4gQGNvZGV7bHN9OwotQHNhbXB7LXh9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGlnbm9yZS1hbGwtc3BhY2UKLUBzYW1wey13fSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlLWJhY2t1cHMKLUBzYW1wey1CfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGlnbm9yZS1ibGFuay1saW5lcwotQHNhbXB7LUJ9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtY2FzZQotQHNhbXB7LWZ9IGluIEBjb2Rle2xvb2t9IGFuZCBAY29kZXtwdHh9OwotQHNhbXB7LWl9IGluIEBjb2Rle2RpZmZ9IGFuZCBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS1lcnJvcnMKLUBzYW1wey1pfSBpbiBNYWtlLgotCi1AaXRlbSBpZ25vcmUtZmlsZQotQHNhbXB7LWl9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGlnbm9yZS1pbmRlbnRhdGlvbgotQHNhbXB7LUl9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gaWdub3JlLWluaXQtZmlsZQotQHNhbXB7LWZ9IGluIE9sZW8uCi0KLUBpdGVtIGlnbm9yZS1pbnRlcnJ1cHRzCi1Ac2FtcHstaX0gaW4gQGNvZGV7dGVlfS4KLQotQGl0ZW0gaWdub3JlLW1hdGNoaW5nLWxpbmVzCi1Ac2FtcHstSX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS1zcGFjZS1jaGFuZ2UKLUBzYW1wey1ifSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlLXplcm9zCi1Ac2FtcHstaX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gaW5jbHVkZQotQHNhbXB7LWl9IGluIEBjb2Rle2V0YWdzfTsKLUBzYW1wey1JfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGluY2x1ZGUtZGlyCi1Ac2FtcHstSX0gaW4gTWFrZS4KLQotQGl0ZW0gaW5jcmVtZW50YWwKLUBzYW1wey1HfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBpbmZvCi1Ac2FtcHstaX0sIEBzYW1wey1sfSwgYW5kIEBzYW1wey1tfSBpbiBGaW5nZXIuCi0KLUBpdGVtIGluaXRpYWwKLUBzYW1wey1pfSBpbiBAY29kZXtleHBhbmR9LgotCi1AaXRlbSBpbml0aWFsLXRhYgotQHNhbXB7LVR9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpbm9kZQotQHNhbXB7LWl9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gaW50ZXJhY3RpdmUKLUBzYW1wey1pfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LCBAY29kZXtybX07Ci1Ac2FtcHstZX0gaW4gQGNvZGV7bTR9OwotQHNhbXB7LXB9IGluIEBjb2Rle3hhcmdzfTsKLUBzYW1wey13fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBpbnRlcm1peC10eXBlCi1Ac2FtcHstcH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGpvYnMKLUBzYW1wey1qfSBpbiBNYWtlLgotCi1AaXRlbSBqdXN0LXByaW50Ci1Ac2FtcHstbn0gaW4gTWFrZS4KLQotQGl0ZW0ga2VlcC1nb2luZwotQHNhbXB7LWt9IGluIE1ha2UuCi0KLUBpdGVtIGtlZXAtZmlsZXMKLUBzYW1wey1rfSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBraWxvYnl0ZXMKLUBzYW1wey1rfSBpbiBAY29kZXtkdX0gYW5kIEBjb2Rle2xzfS4KLQotQGl0ZW0gbGFuZ3VhZ2UKLUBzYW1wey1sfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIGxlc3MtbW9kZQotQHNhbXB7LWx9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gbGV2ZWwtZm9yLWd6aXAKLUBzYW1wey1nfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbGluZS1ieXRlcwotQHNhbXB7LUN9IGluIEBjb2Rle3NwbGl0fS4KLQotQGl0ZW0gbGluZXMKLVVzZWQgaW4gQGNvZGV7c3BsaXR9LCBAY29kZXtoZWFkfSwgYW5kIEBjb2Rle3RhaWx9LgotCi1AaXRlbSBsaW5rCi1Ac2FtcHstbH0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIGxpbnQKLUBpdGVteCBsaW50LW9sZAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gbGlzdAotQHNhbXB7LXR9IGluIEBjb2Rle2NwaW99OwotQHNhbXB7LWx9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGxpc3QKLUBzYW1wey10fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBsaXRlcmFsCi1Ac2FtcHstTn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBsb2FkLWF2ZXJhZ2UKLUBzYW1wey1sfSBpbiBNYWtlLgotCi1AaXRlbSBsb2dpbgotVXNlZCBpbiBAY29kZXtzdX0uCi0KLUBpdGVtIG1hY2hpbmUKLU5vIGxpc3Rpbmcgb2Ygd2hpY2ggcHJvZ3JhbXMgYWxyZWFkeSB1c2UgdGhpczsKLXNvbWVvbmUgc2hvdWxkIGNoZWNrIHRvCi1zZWUgaWYgYW55IGFjdHVhbGx5IGRvLCBhbmQgdGVsbCBAZW1haWx7Z251QEBnbnUub3JnfS4KLQotQGl0ZW0gbWFjcm8tbmFtZQotQHNhbXB7LU19IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIG1haWwKLUBzYW1wey1tfSBpbiBAY29kZXtoZWxsb30gYW5kIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gbWFrZS1kaXJlY3RvcmllcwotQHNhbXB7LWR9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBtYWtlZmlsZQotQHNhbXB7LWZ9IGluIE1ha2UuCi0KLUBpdGVtIG1hcHBlZAotVXNlZCBpbiBHREIuCi0KLUBpdGVtIG1heC1hcmdzCi1Ac2FtcHstbn0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBtYXgtY2hhcnMKLUBzYW1wey1ufSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG1heC1saW5lcwotQHNhbXB7LWx9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWF4LWxvYWQKLUBzYW1wey1sfSBpbiBNYWtlLgotCi1AaXRlbSBtYXgtcHJvY3MKLUBzYW1wey1QfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG1lc2cKLUBzYW1wey1UfSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBtZXNzYWdlCi1Ac2FtcHstVH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gbWluaW1hbAotQHNhbXB7LWR9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBtaXhlZC11dWVuY29kZQotQHNhbXB7LU19IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBtb2RlCi1Ac2FtcHstbX0gaW4gQGNvZGV7aW5zdGFsbH0sIEBjb2Rle21rZGlyfSwgYW5kIEBjb2Rle21rZmlmb30uCi0KLUBpdGVtIG1vZGlmaWNhdGlvbi10aW1lCi1Ac2FtcHstbX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gbXVsdGktdm9sdW1lCi1Ac2FtcHstTX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gbmFtZS1wcmVmaXgKLUBzYW1wey1hfSBpbiBCaXNvbi4KLQotQGl0ZW0gbmVzdGluZy1saW1pdAotQHNhbXB7LUx9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gbmV0LWhlYWRlcnMKLUBzYW1wey1hfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbmV3LWZpbGUKLUBzYW1wey1XfSBpbiBNYWtlLgotCi1AaXRlbSBuby1idWlsdGluLXJ1bGVzCi1Ac2FtcHstcn0gaW4gTWFrZS4KLQotQGl0ZW0gbm8tY2hhcmFjdGVyLWNvdW50Ci1Ac2FtcHstd30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG5vLWNoZWNrLWV4aXN0aW5nCi1Ac2FtcHsteH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG5vLWNvbW1vbgotQHNhbXB7LTN9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gbm8tY3JlYXRlCi1Ac2FtcHstY30gaW4gQGNvZGV7dG91Y2h9LgotCi1AaXRlbSBuby1kZWZpbmVzCi1Ac2FtcHstRH0gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBuby1kZWxldGVkCi1Ac2FtcHstMX0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBuby1kZXJlZmVyZW5jZQotQHNhbXB7LWR9IGluIEBjb2Rle2NwfS4KLQotQGl0ZW0gbm8taW5zZXJ0ZWQKLUBzYW1wey0yfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIG5vLWtlZXAtZ29pbmcKLUBzYW1wey1TfSBpbiBNYWtlLgotCi1AaXRlbSBuby1saW5lcwotQHNhbXB7LWx9IGluIEJpc29uLgotCi1AaXRlbSBuby1waXBpbmcKLUBzYW1wey1QfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tcHJvZgotQHNhbXB7LWV9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gbm8tcmVnZXgKLUBzYW1wey1SfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIG5vLXNvcnQKLUBzYW1wey1wfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIG5vLXNwbGl0Ci1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gbm8tc3RhdGljCi1Ac2FtcHstYX0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBuby10aW1lCi1Ac2FtcHstRX0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBuby10aW1lc3RhbXAKLUBzYW1wey1tfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tdmFsaWRhdGUKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBuby13YWl0Ci1Vc2VkIGluIEBjb2Rle2VtYWNzY2xpZW50fS4KLQotQGl0ZW0gbm8td2FybgotVXNlZCBpbiB2YXJpb3VzIHByb2dyYW1zIHRvIGluaGliaXQgd2FybmluZ3MuCi0KLUBpdGVtIG5vZGUKLUBzYW1wey1ufSBpbiBAY29kZXtpbmZvfS4KLQotQGl0ZW0gbm9kZW5hbWUKLUBzYW1wey1ufSBpbiBAY29kZXt1bmFtZX0uCi0KLUBpdGVtIG5vbm1hdGNoaW5nCi1Ac2FtcHstZn0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIG5zdHVmZgotQHNhbXB7LW59IGluIEBjb2Rle29iamR1bXB9LgotCi1AaXRlbSBudWxsCi1Ac2FtcHstMH0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBudW1iZXIKLUBzYW1wey1ufSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBudW1iZXItbm9uYmxhbmsKLUBzYW1wey1ifSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBudW1lcmljLXNvcnQKLUBzYW1wey1ufSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIG51bWVyaWMtdWlkLWdpZAotQHNhbXB7LW59IGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXtsc30uCi0KLUBpdGVtIG54Ci1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gb2xkLWFyY2hpdmUKLUBzYW1wey1vfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBvbGQtZmlsZQotQHNhbXB7LW99IGluIE1ha2UuCi0KLUBpdGVtIG9uZS1maWxlLXN5c3RlbQotQHNhbXB7LWx9IGluIEBjb2Rle3Rhcn0sIEBjb2Rle2NwfSwgYW5kIEBjb2Rle2R1fS4KLQotQGl0ZW0gb25seS1maWxlCi1Ac2FtcHstb30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gb25seS1wcm9mCi1Ac2FtcHstZn0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBvbmx5LXRpbWUKLUBzYW1wey1GfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG91dHB1dAotSW4gdmFyaW91cyBwcm9ncmFtcywgc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotQGl0ZW0gb3V0cHV0LXByZWZpeAotQHNhbXB7LW99IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBvdmVycmlkZQotQHNhbXB7LW99IGluIEBjb2Rle3JtfS4KLQotQGl0ZW0gb3ZlcndyaXRlCi1Ac2FtcHstY30gaW4gQGNvZGV7dW5zaGFyfS4KLQotQGl0ZW0gb3duZXIKLUBzYW1wey1vfSBpbiBAY29kZXtpbnN0YWxsfS4KLQotQGl0ZW0gcGFnaW5hdGUKLUBzYW1wey1sfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcGFyYWdyYXBoLWluZGVudAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIHBhcmVudHMKLUBzYW1wey1wfSBpbiBAY29kZXtta2Rpcn0gYW5kIEBjb2Rle3JtZGlyfS4KLQotQGl0ZW0gcGFzcy1hbGwKLUBzYW1wey1wfSBpbiBAY29kZXt1bH0uCi0KLUBpdGVtIHBhc3MtdGhyb3VnaAotQHNhbXB7LXB9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBwb3J0Ci1Ac2FtcHstUH0gaW4gQGNvZGV7ZmluZ2VyfS4KLQotQGl0ZW0gcG9ydGFiaWxpdHkKLUBzYW1wey1jfSBpbiBAY29kZXtjcGlvfSBhbmQgQGNvZGV7dGFyfS4KLQotQGl0ZW0gcG9zaXgKLVVzZWQgaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIHByZWZpeC1idWlsdGlucwotQHNhbXB7LVB9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gcHJlZml4Ci1Ac2FtcHstZn0gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0gcHJlc2VydmUKLVVzZWQgaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7Y3B9LgotCi1AaXRlbSBwcmVzZXJ2ZS1lbnZpcm9ubWVudAotQHNhbXB7LXB9IGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gcHJlc2VydmUtbW9kaWZpY2F0aW9uLXRpbWUKLUBzYW1wey1tfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gcHJlc2VydmUtb3JkZXIKLUBzYW1wey1zfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBwcmVzZXJ2ZS1wZXJtaXNzaW9ucwotQHNhbXB7LXB9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHByaW50Ci1Ac2FtcHstbH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHByaW50LWNoYXJzCi1Ac2FtcHstTH0gaW4gQGNvZGV7Y21wfS4KLQotQGl0ZW0gcHJpbnQtZGF0YS1iYXNlCi1Ac2FtcHstcH0gaW4gTWFrZS4KLQotQGl0ZW0gcHJpbnQtZGlyZWN0b3J5Ci1Ac2FtcHstd30gaW4gTWFrZS4KLQotQGl0ZW0gcHJpbnQtZmlsZS1uYW1lCi1Ac2FtcHstb30gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBwcmludC1zeW1kZWZzCi1Ac2FtcHstc30gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBwcmludGVyCi1Ac2FtcHstcH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBwcm9tcHQKLUBzYW1wey1wfSBpbiBAY29kZXtlZH0uCi0KLUBpdGVtIHF1ZXJ5LXVzZXIKLUBzYW1wey1YfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gcXVlc3Rpb24KLUBzYW1wey1xfSBpbiBNYWtlLgotCi1AaXRlbSBxdWlldAotVXNlZCBpbiBtYW55IHByb2dyYW1zIHRvIGluaGliaXQgdGhlIHVzdWFsIG91dHB1dC4gIEBzdHJvbmd7Tm90ZTp9IGV2ZXJ5Ci1wcm9ncmFtIGFjY2VwdGluZyBAc2FtcHstLXF1aWV0fSBzaG91bGQgYWNjZXB0IEBzYW1wey0tc2lsZW50fSBhcyBhCi1zeW5vbnltLgotCi1AaXRlbSBxdWlldC11bnNoYXIKLUBzYW1wey1RfSBpbiBAY29kZXtzaGFyfQotCi1AaXRlbSBxdW90ZS1uYW1lCi1Ac2FtcHstUX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSByY3MKLUBzYW1wey1ufSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcmUtaW50ZXJ2YWwKLVVzZWQgaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIHJlYWQtZnVsbC1ibG9ja3MKLUBzYW1wey1CfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSByZWFkbm93Ci1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gcmVjb24KLUBzYW1wey1ufSBpbiBNYWtlLgotCi1AaXRlbSByZWNvcmQtbnVtYmVyCi1Ac2FtcHstUn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gcmVjdXJzaXZlCi1Vc2VkIGluIEBjb2Rle2NoZ3JwfSwgQGNvZGV7Y2hvd259LCBAY29kZXtjcH0sIEBjb2Rle2xzfSwgQGNvZGV7ZGlmZn0sCi1hbmQgQGNvZGV7cm19LgotCi1AaXRlbSByZWZlcmVuY2UtbGltaXQKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSByZWZlcmVuY2VzCi1Ac2FtcHstcn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gcmVnZXgKLUBzYW1wey1yfSBpbiBAY29kZXt0YWN9IGFuZCBAY29kZXtldGFnc30uCi0KLUBpdGVtIHJlbGVhc2UKLUBzYW1wey1yfSBpbiBAY29kZXt1bmFtZX0uCi0KLUBpdGVtIHJlbG9hZC1zdGF0ZQotQHNhbXB7LVJ9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gcmVsb2NhdGlvbgotQHNhbXB7LXJ9IGluIEBjb2Rle29iamR1bXB9LgotCi1AaXRlbSByZW5hbWUKLUBzYW1wey1yfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gcmVwbGFjZQotQHNhbXB7LWl9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gcmVwb3J0LWlkZW50aWNhbC1maWxlcwotQHNhbXB7LXN9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSByZXNldC1hY2Nlc3MtdGltZQotQHNhbXB7LWF9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSByZXZlcnNlCi1Ac2FtcHstcn0gaW4gQGNvZGV7bHN9IGFuZCBAY29kZXtubX0uCi0KLUBpdGVtIHJldmVyc2VkLWVkCi1Ac2FtcHstZn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHJpZ2h0LXNpZGUtZGVmcwotQHNhbXB7LVJ9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHNhbWUtb3JkZXIKLUBzYW1wey1zfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBzYW1lLXBlcm1pc3Npb25zCi1Ac2FtcHstcH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gc2F2ZQotQHNhbXB7LWd9IGluIEBjb2Rle3N0dHl9LgotCi1AaXRlbSBzZQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIHNlbnRlbmNlLXJlZ2V4cAotQHNhbXB7LVN9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHNlcGFyYXRlLWRpcnMKLUBzYW1wey1TfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIHNlcGFyYXRvcgotQHNhbXB7LXN9IGluIEBjb2Rle3RhY30uCi0KLUBpdGVtIHNlcXVlbmNlCi1Vc2VkIGJ5IEBjb2Rle3JlY29kZX0gdG8gY2hvc2UgZmlsZXMgb3IgcGlwZXMgZm9yIHNlcXVlbmNpbmcgcGFzc2VzLgotCi1AaXRlbSBzaGVsbAotQHNhbXB7LXN9IGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gc2hvdy1hbGwKLUBzYW1wey1BfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzaG93LWMtZnVuY3Rpb24KLUBzYW1wey1wfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gc2hvdy1lbmRzCi1Ac2FtcHstRX0gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gc2hvdy1mdW5jdGlvbi1saW5lCi1Ac2FtcHstRn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHNob3ctdGFicwotQHNhbXB7LVR9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIHNpbGVudAotVXNlZCBpbiBtYW55IHByb2dyYW1zIHRvIGluaGliaXQgdGhlIHVzdWFsIG91dHB1dC4KLUBzdHJvbmd7Tm90ZTp9IGV2ZXJ5IHByb2dyYW0gYWNjZXB0aW5nCi1Ac2FtcHstLXNpbGVudH0gc2hvdWxkIGFjY2VwdCBAc2FtcHstLXF1aWV0fSBhcyBhIHN5bm9ueW0uCi0KLUBpdGVtIHNpemUKLUBzYW1wey1zfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHNvcnQKLVVzZWQgaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBzb3VyY2UKLUBzYW1wey1XIHNvdXJjZX0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIHNwYXJzZQotQHNhbXB7LVN9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHNwZWVkLWxhcmdlLWZpbGVzCi1Ac2FtcHstSH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHNwbGl0LWF0Ci1Ac2FtcHstRX0gaW4gQGNvZGV7dW5zaGFyfS4KLQotQGl0ZW0gc3BsaXQtc2l6ZS1saW1pdAotQHNhbXB7LUx9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBzcXVlZXplLWJsYW5rCi1Ac2FtcHstc30gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gc3RhcnQtZGVsZXRlCi1Ac2FtcHstd30gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBzdGFydC1pbnNlcnQKLUBzYW1wey15fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHN0YXJ0aW5nLWZpbGUKLVVzZWQgaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7ZGlmZn0gdG8gc3BlY2lmeSB3aGljaCBmaWxlIHdpdGhpbgotYSBkaXJlY3RvcnkgdG8gc3RhcnQgcHJvY2Vzc2luZyB3aXRoLgotCi1AaXRlbSBzdGF0aXN0aWNzCi1Ac2FtcHstc30gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBzdGRpbi1maWxlLWxpc3QKLUBzYW1wey1TfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gc3RvcAotQHNhbXB7LVN9IGluIE1ha2UuCi0KLUBpdGVtIHN0cmljdAotQHNhbXB7LXN9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIHN0cmlwCi1Ac2FtcHstc30gaW4gQGNvZGV7aW5zdGFsbH0uCi0KLUBpdGVtIHN0cmlwLWFsbAotQHNhbXB7LXN9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gc3RyaXAtZGVidWcKLUBzYW1wey1TfSBpbiBAY29kZXtzdHJpcH0uCi0KLUBpdGVtIHN1Ym1pdHRlcgotQHNhbXB7LXN9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBzdWZmaXgKLUBzYW1wey1TfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LgotCi1AaXRlbSBzdWZmaXgtZm9ybWF0Ci1Ac2FtcHstYn0gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0gc3VtCi1Ac2FtcHstc30gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBzdW1tYXJpemUKLUBzYW1wey1zfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIHN5bWJvbGljCi1Ac2FtcHstc30gaW4gQGNvZGV7bG59LgotCi1AaXRlbSBzeW1ib2xzCi1Vc2VkIGluIEdEQiBhbmQgQGNvZGV7b2JqZHVtcH0uCi0KLUBpdGVtIHN5bmNsaW5lcwotQHNhbXB7LXN9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gc3lzbmFtZQotQHNhbXB7LXN9IGluIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gdGFicwotQHNhbXB7LXR9IGluIEBjb2Rle2V4cGFuZH0gYW5kIEBjb2Rle3VuZXhwYW5kfS4KLQotQGl0ZW0gdGFic2l6ZQotQHNhbXB7LVR9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gdGVybWluYWwKLUBzYW1wey1UfSBpbiBAY29kZXt0cHV0fSBhbmQgQGNvZGV7dWx9LgotQHNhbXB7LXR9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gdGV4dAotQHNhbXB7LWF9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSB0ZXh0LWZpbGVzCi1Ac2FtcHstVH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHRpbWUKLVVzZWQgaW4gQGNvZGV7bHN9IGFuZCBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIHRvLXN0ZG91dAotQHNhbXB7LU99IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHRvdGFsCi1Ac2FtcHstY30gaW4gQGNvZGV7ZHV9LgotCi1AaXRlbSB0b3VjaAotQHNhbXB7LXR9IGluIE1ha2UsIEBjb2Rle3JhbmxpYn0sIGFuZCBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSB0cmFjZQotQHNhbXB7LXR9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gdHJhZGl0aW9uYWwKLUBzYW1wey10fSBpbiBAY29kZXtoZWxsb307Ci1Ac2FtcHstVyB0cmFkaXRpb25hbH0gaW4gQGNvZGV7Z2F3a307Ci1Ac2FtcHstR30gaW4gQGNvZGV7ZWR9LCBAY29kZXttNH0sIGFuZCBAY29kZXtwdHh9LgotCi1AaXRlbSB0dHkKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSB0eXBlZGVmcwotQHNhbXB7LXR9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gdHlwZWRlZnMtYW5kLWMrKwotQHNhbXB7LVR9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gdHlwZXNldC1tb2RlCi1Ac2FtcHstdH0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gdW5jb21wcmVzcwotQHNhbXB7LXp9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHVuY29uZGl0aW9uYWwKLUBzYW1wey11fSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gdW5kZWZpbmUKLUBzYW1wey1VfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIHVuZGVmaW5lZC1vbmx5Ci1Ac2FtcHstdX0gaW4gQGNvZGV7bm19LgotCi1AaXRlbSB1cGRhdGUKLUBzYW1wey11fSBpbiBAY29kZXtjcH0sIEBjb2Rle2N0YWdzfSwgQGNvZGV7bXZ9LCBAY29kZXt0YXJ9LgotCi1AaXRlbSB1c2FnZQotVXNlZCBpbiBAY29kZXtnYXdrfTsgc2FtZSBhcyBAc2FtcHstLWhlbHB9LgotCi1AaXRlbSB1dWVuY29kZQotQHNhbXB7LUJ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSB2YW5pbGxhLW9wZXJhdGlvbgotQHNhbXB7LVZ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSB2ZXJib3NlCi1QcmludCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHByb2dyZXNzLiAgTWFueSBwcm9ncmFtcyBzdXBwb3J0IHRoaXMuCi0KLUBpdGVtIHZlcmlmeQotQHNhbXB7LVd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlci4KLQotQGl0ZW0gdmVyc2lvbi1jb250cm9sCi1Ac2FtcHstVn0gaW4gQGNvZGV7Y3B9LCBAY29kZXtsbn0sIEBjb2Rle212fS4KLQotQGl0ZW0gdmdyaW5kCi1Ac2FtcHstdn0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSB2b2x1bWUKLUBzYW1wey1WfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSB3aGF0LWlmCi1Ac2FtcHstV30gaW4gTWFrZS4KLQotQGl0ZW0gd2hvbGUtc2l6ZS1saW1pdAotQHNhbXB7LWx9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSB3aWR0aAotQHNhbXB7LXd9IGluIEBjb2Rle2xzfSBhbmQgQGNvZGV7cHR4fS4KLQotQGl0ZW0gd29yZC1yZWdleHAKLUBzYW1wey1XfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSB3cml0YWJsZQotQHNhbXB7LVR9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIHplcm9zCi1Ac2FtcHsten0gaW4gQGNvZGV7Z3Byb2Z9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBNZW1vcnkgVXNhZ2UKLUBzZWN0aW9uIE1lbW9yeSBVc2FnZQotCi1JZiBpdCB0eXBpY2FsbHkgdXNlcyBqdXN0IGEgZmV3IG1lZyBvZiBtZW1vcnksIGRvbid0IGJvdGhlciBtYWtpbmcgYW55Ci1lZmZvcnQgdG8gcmVkdWNlIG1lbW9yeSB1c2FnZS4gIEZvciBleGFtcGxlLCBpZiBpdCBpcyBpbXByYWN0aWNhbCBmb3IKLW90aGVyIHJlYXNvbnMgdG8gb3BlcmF0ZSBvbiBmaWxlcyBtb3JlIHRoYW4gYSBmZXcgbWVnIGxvbmcsIGl0IGlzCi1yZWFzb25hYmxlIHRvIHJlYWQgZW50aXJlIGlucHV0IGZpbGVzIGludG8gY29yZSB0byBvcGVyYXRlIG9uIHRoZW0uCi0KLUhvd2V2ZXIsIGZvciBwcm9ncmFtcyBzdWNoIGFzIEBjb2Rle2NhdH0gb3IgQGNvZGV7dGFpbH0sIHRoYXQgY2FuCi11c2VmdWxseSBvcGVyYXRlIG9uIHZlcnkgbGFyZ2UgZmlsZXMsIGl0IGlzIGltcG9ydGFudCB0byBhdm9pZCB1c2luZyBhCi10ZWNobmlxdWUgdGhhdCB3b3VsZCBhcnRpZmljaWFsbHkgbGltaXQgdGhlIHNpemUgb2YgZmlsZXMgaXQgY2FuIGhhbmRsZS4KLUlmIGEgcHJvZ3JhbSB3b3JrcyBieSBsaW5lcyBhbmQgY291bGQgYmUgYXBwbGllZCB0byBhcmJpdHJhcnkKLXVzZXItc3VwcGxpZWQgaW5wdXQgZmlsZXMsIGl0IHNob3VsZCBrZWVwIG9ubHkgYSBsaW5lIGluIG1lbW9yeSwgYmVjYXVzZQotdGhpcyBpcyBub3QgdmVyeSBoYXJkIGFuZCB1c2VycyB3aWxsIHdhbnQgdG8gYmUgYWJsZSB0byBvcGVyYXRlIG9uIGlucHV0Ci1maWxlcyB0aGF0IGFyZSBiaWdnZXIgdGhhbiB3aWxsIGZpdCBpbiBjb3JlIGFsbCBhdCBvbmNlLgotCi1JZiB5b3VyIHByb2dyYW0gY3JlYXRlcyBjb21wbGljYXRlZCBkYXRhIHN0cnVjdHVyZXMsIGp1c3QgbWFrZSB0aGVtIGluCi1jb3JlIGFuZCBnaXZlIGEgZmF0YWwgZXJyb3IgaWYgQGNvZGV7bWFsbG9jfSByZXR1cm5zIHplcm8uCi0KLUBub2RlIFdyaXRpbmcgQwotQGNoYXB0ZXIgTWFraW5nIFRoZSBCZXN0IFVzZSBvZiBDCi0KLVRoaXMgQHZhbHVle0NIQVBURVJ9IHByb3ZpZGVzIGFkdmljZSBvbiBob3cgYmVzdCB0byB1c2UgdGhlIEMgbGFuZ3VhZ2UKLXdoZW4gd3JpdGluZyBHTlUgc29mdHdhcmUuCi0KLUBtZW51Ci0qIEZvcm1hdHRpbmc6OiAgICAgICAgICAgICAgICAgIEZvcm1hdHRpbmcgWW91ciBTb3VyY2UgQ29kZQotKiBDb21tZW50czo6ICAgICAgICAgICAgICAgICAgICBDb21tZW50aW5nIFlvdXIgV29yawotKiBTeW50YWN0aWMgQ29udmVudGlvbnM6OiAgICAgICBDbGVhbiBVc2Ugb2YgQyBDb25zdHJ1Y3RzCi0qIE5hbWVzOjogICAgICAgICAgICAgICAgICAgICAgIE5hbWluZyBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucwotKiBTeXN0ZW0gUG9ydGFiaWxpdHk6OiAgICAgICAgICBQb3J0YWJpbGl0eSBiZXR3ZWVuIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtcwotKiBDUFUgUG9ydGFiaWxpdHk6OiAgICAgICAgICAgICBTdXBwb3J0aW5nIHRoZSByYW5nZSBvZiBDUFUgdHlwZXMKLSogU3lzdGVtIEZ1bmN0aW9uczo6ICAgICAgICAgICAgUG9ydGFiaWxpdHkgYW5kIGBgc3RhbmRhcmQnJyBsaWJyYXJ5IGZ1bmN0aW9ucwotKiBJbnRlcm5hdGlvbmFsaXphdGlvbjo6ICAgICAgICBUZWNobmlxdWVzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbgotKiBNbWFwOjogICAgICAgICAgICAgICAgICAgICAgICBIb3cgeW91IGNhbiBzYWZlbHkgdXNlIEBjb2Rle21tYXB9LgotQGVuZCBtZW51Ci0KLUBub2RlIEZvcm1hdHRpbmcKLUBzZWN0aW9uIEZvcm1hdHRpbmcgWW91ciBTb3VyY2UgQ29kZQotCi1JdCBpcyBpbXBvcnRhbnQgdG8gcHV0IHRoZSBvcGVuLWJyYWNlIHRoYXQgc3RhcnRzIHRoZSBib2R5IG9mIGEgQwotZnVuY3Rpb24gaW4gY29sdW1uIHplcm8sIGFuZCBhdm9pZCBwdXR0aW5nIGFueSBvdGhlciBvcGVuLWJyYWNlIG9yCi1vcGVuLXBhcmVudGhlc2lzIG9yIG9wZW4tYnJhY2tldCBpbiBjb2x1bW4gemVyby4gIFNldmVyYWwgdG9vbHMgbG9vawotZm9yIG9wZW4tYnJhY2VzIGluIGNvbHVtbiB6ZXJvIHRvIGZpbmQgdGhlIGJlZ2lubmluZ3Mgb2YgQyBmdW5jdGlvbnMuCi1UaGVzZSB0b29scyB3aWxsIG5vdCB3b3JrIG9uIGNvZGUgbm90IGZvcm1hdHRlZCB0aGF0IHdheS4KLQotSXQgaXMgYWxzbyBpbXBvcnRhbnQgZm9yIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIHN0YXJ0IHRoZSBuYW1lIG9mIHRoZQotZnVuY3Rpb24gaW4gY29sdW1uIHplcm8uICBUaGlzIGhlbHBzIHBlb3BsZSB0byBzZWFyY2ggZm9yIGZ1bmN0aW9uCi1kZWZpbml0aW9ucywgYW5kIG1heSBhbHNvIGhlbHAgY2VydGFpbiB0b29scyByZWNvZ25pemUgdGhlbS4gIFRodXMsCi10aGUgcHJvcGVyIGZvcm1hdCBpcyB0aGlzOgotCi1AZXhhbXBsZQotc3RhdGljIGNoYXIgKgotY29uY2F0IChzMSwgczIpICAgICAgICAvKiBOYW1lIHN0YXJ0cyBpbiBjb2x1bW4gemVybyBoZXJlICovCi0gICAgIGNoYXIgKnMxLCAqczI7Ci1AeyAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW4gYnJhY2UgaW4gY29sdW1uIHplcm8gaGVyZSAqLwotICBAZG90c3t9Ci1AfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotb3IsIGlmIHlvdSB3YW50IHRvIHVzZSBAc2N7YW5zaX0gQywgZm9ybWF0IHRoZSBkZWZpbml0aW9uIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLXN0YXRpYyBjaGFyICoKLWNvbmNhdCAoY2hhciAqczEsIGNoYXIgKnMyKQotQHsKLSAgQGRvdHN7fQotQH0KLUBlbmQgZXhhbXBsZQotCi1JbiBAc2N7YW5zaX0gQywgaWYgdGhlIGFyZ3VtZW50cyBkb24ndCBmaXQgbmljZWx5IG9uIG9uZSBsaW5lLAotc3BsaXQgaXQgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaW50Ci1sb3RzX29mX2FyZ3MgKGludCBhbl9pbnRlZ2VyLCBsb25nIGFfbG9uZywgc2hvcnQgYV9zaG9ydCwKLSAgICAgICAgICAgICAgZG91YmxlIGFfZG91YmxlLCBmbG9hdCBhX2Zsb2F0KQotQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUZvciB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIHdlIHByZWZlciBjb2RlIGZvcm1hdHRlZCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pZiAoeCA8IGZvbyAoeSwgeikpCi0gIGhhaGEgPSBiYXJbNF0gKyA1OwotZWxzZQotICBAewotICAgIHdoaWxlICh6KQotICAgICAgQHsKLSAgICAgICAgaGFoYSArPSBmb28gKHosIHopOwotICAgICAgICB6LS07Ci0gICAgICBAfQotICAgIHJldHVybiArK3ggKyBiYXIgKCk7Ci0gIEB9Ci1AZW5kIGV4YW1wbGUKLQotV2UgZmluZCBpdCBlYXNpZXIgdG8gcmVhZCBhIHByb2dyYW0gd2hlbiBpdCBoYXMgc3BhY2VzIGJlZm9yZSB0aGUKLW9wZW4tcGFyZW50aGVzZXMgYW5kIGFmdGVyIHRoZSBjb21tYXMuICBFc3BlY2lhbGx5IGFmdGVyIHRoZSBjb21tYXMuCi0KLVdoZW4geW91IHNwbGl0IGFuIGV4cHJlc3Npb24gaW50byBtdWx0aXBsZSBsaW5lcywgc3BsaXQgaXQKLWJlZm9yZSBhbiBvcGVyYXRvciwgbm90IGFmdGVyIG9uZS4gIEhlcmUgaXMgdGhlIHJpZ2h0IHdheToKLQotQGV4YW1wbGUKLWlmIChmb29fdGhpc19pc19sb25nICYmIGJhciA+IHdpbiAoeCwgeSwgeikKLSAgICAmJiByZW1haW5pbmdfY29uZGl0aW9uKQotQGVuZCBleGFtcGxlCi0KLVRyeSB0byBhdm9pZCBoYXZpbmcgdHdvIG9wZXJhdG9ycyBvZiBkaWZmZXJlbnQgcHJlY2VkZW5jZSBhdCB0aGUgc2FtZQotbGV2ZWwgb2YgaW5kZW50YXRpb24uICBGb3IgZXhhbXBsZSwgZG9uJ3Qgd3JpdGUgdGhpczoKLQotQGV4YW1wbGUKLW1vZGUgPSAoaW5tb2RlW2pdID09IFZPSURtb2RlCi0gICAgICAgIHx8IEdFVF9NT0RFX1NJWkUgKG91dG1vZGVbal0pID4gR0VUX01PREVfU0laRSAoaW5tb2RlW2pdKQotICAgICAgICA/IG91dG1vZGVbal0gOiBpbm1vZGVbal0pOwotQGVuZCBleGFtcGxlCi0KLUluc3RlYWQsIHVzZSBleHRyYSBwYXJlbnRoZXNlcyBzbyB0aGF0IHRoZSBpbmRlbnRhdGlvbiBzaG93cyB0aGUgbmVzdGluZzoKLQotQGV4YW1wbGUKLW1vZGUgPSAoKGlubW9kZVtqXSA9PSBWT0lEbW9kZQotICAgICAgICAgfHwgKEdFVF9NT0RFX1NJWkUgKG91dG1vZGVbal0pID4gR0VUX01PREVfU0laRSAoaW5tb2RlW2pdKSkpCi0gICAgICAgID8gb3V0bW9kZVtqXSA6IGlubW9kZVtqXSk7Ci1AZW5kIGV4YW1wbGUKLQotSW5zZXJ0IGV4dHJhIHBhcmVudGhlc2VzIHNvIHRoYXQgRW1hY3Mgd2lsbCBpbmRlbnQgdGhlIGNvZGUgcHJvcGVybHkuCi1Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbmRlbnRhdGlvbiBsb29rcyBuaWNlIGlmIHlvdSBkbyBpdCBieSBoYW5kLAotYnV0IEVtYWNzIHdvdWxkIG1lc3MgaXQgdXA6Ci0KLUBleGFtcGxlCi12ID0gcnVwLT5ydV91dGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfdXRpbWUudHZfdXNlYy8xMDAwCi0gICAgKyBydXAtPnJ1X3N0aW1lLnR2X3NlYyoxMDAwICsgcnVwLT5ydV9zdGltZS50dl91c2VjLzEwMDA7Ci1AZW5kIGV4YW1wbGUKLQotQnV0IGFkZGluZyBhIHNldCBvZiBwYXJlbnRoZXNlcyBzb2x2ZXMgdGhlIHByb2JsZW06Ci0KLUBleGFtcGxlCi12ID0gKHJ1cC0+cnVfdXRpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3V0aW1lLnR2X3VzZWMvMTAwMAotICAgICArIHJ1cC0+cnVfc3RpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3N0aW1lLnR2X3VzZWMvMTAwMCk7Ci1AZW5kIGV4YW1wbGUKLQotRm9ybWF0IGRvLXdoaWxlIHN0YXRlbWVudHMgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotZG8KLSAgQHsKLSAgICBhID0gZm9vIChhKTsKLSAgQH0KLXdoaWxlIChhID4gMCk7Ci1AZW5kIGV4YW1wbGUKLQotUGxlYXNlIHVzZSBmb3JtZmVlZCBjaGFyYWN0ZXJzIChjb250cm9sLUwpIHRvIGRpdmlkZSB0aGUgcHJvZ3JhbSBpbnRvCi1wYWdlcyBhdCBsb2dpY2FsIHBsYWNlcyAoYnV0IG5vdCB3aXRoaW4gYSBmdW5jdGlvbikuICBJdCBkb2VzIG5vdCBtYXR0ZXIKLWp1c3QgaG93IGxvbmcgdGhlIHBhZ2VzIGFyZSwgc2luY2UgdGhleSBkbyBub3QgaGF2ZSB0byBmaXQgb24gYSBwcmludGVkCi1wYWdlLiAgVGhlIGZvcm1mZWVkcyBzaG91bGQgYXBwZWFyIGFsb25lIG9uIGxpbmVzIGJ5IHRoZW1zZWx2ZXMuCi0KLQotQG5vZGUgQ29tbWVudHMKLUBzZWN0aW9uIENvbW1lbnRpbmcgWW91ciBXb3JrCi0KLUV2ZXJ5IHByb2dyYW0gc2hvdWxkIHN0YXJ0IHdpdGggYSBjb21tZW50IHNheWluZyBicmllZmx5IHdoYXQgaXQgaXMgZm9yLgotRXhhbXBsZTogQHNhbXB7Zm10IC0gZmlsdGVyIGZvciBzaW1wbGUgZmlsbGluZyBvZiB0ZXh0fS4KLQotUGxlYXNlIHdyaXRlIHRoZSBjb21tZW50cyBpbiBhIEdOVSBwcm9ncmFtIGluIEVuZ2xpc2gsIGJlY2F1c2UgRW5nbGlzaAotaXMgdGhlIG9uZSBsYW5ndWFnZSB0aGF0IG5lYXJseSBhbGwgcHJvZ3JhbW1lcnMgaW4gYWxsIGNvdW50cmllcyBjYW4KLXJlYWQuICBJZiB5b3UgZG8gbm90IHdyaXRlIEVuZ2xpc2ggd2VsbCwgcGxlYXNlIHdyaXRlIGNvbW1lbnRzIGluCi1FbmdsaXNoIGFzIHdlbGwgYXMgeW91IGNhbiwgdGhlbiBhc2sgb3RoZXIgcGVvcGxlIHRvIGhlbHAgcmV3cml0ZSB0aGVtLgotSWYgeW91IGNhbid0IHdyaXRlIGNvbW1lbnRzIGluIEVuZ2xpc2gsIHBsZWFzZSBmaW5kIHNvbWVvbmUgdG8gd29yayB3aXRoCi15b3UgYW5kIHRyYW5zbGF0ZSB5b3VyIGNvbW1lbnRzIGludG8gRW5nbGlzaC4KLQotUGxlYXNlIHB1dCBhIGNvbW1lbnQgb24gZWFjaCBmdW5jdGlvbiBzYXlpbmcgd2hhdCB0aGUgZnVuY3Rpb24gZG9lcywKLXdoYXQgc29ydHMgb2YgYXJndW1lbnRzIGl0IGdldHMsIGFuZCB3aGF0IHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YKLWFyZ3VtZW50cyBtZWFuIGFuZCBhcmUgdXNlZCBmb3IuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSBpbgotd29yZHMgdGhlIG1lYW5pbmcgb2YgdGhlIEMgYXJndW1lbnQgZGVjbGFyYXRpb25zLCBpZiBhIEMgdHlwZSBpcyBiZWluZwotdXNlZCBpbiBpdHMgY3VzdG9tYXJ5IGZhc2hpb24uICBJZiB0aGVyZSBpcyBhbnl0aGluZyBub25zdGFuZGFyZCBhYm91dAotaXRzIHVzZSAoc3VjaCBhcyBhbiBhcmd1bWVudCBvZiB0eXBlIEBjb2Rle2NoYXIgKn0gd2hpY2ggaXMgcmVhbGx5IHRoZQotYWRkcmVzcyBvZiB0aGUgc2Vjb25kIGNoYXJhY3RlciBvZiBhIHN0cmluZywgbm90IHRoZSBmaXJzdCksIG9yIGFueQotcG9zc2libGUgdmFsdWVzIHRoYXQgd291bGQgbm90IHdvcmsgdGhlIHdheSBvbmUgd291bGQgZXhwZWN0IChzdWNoIGFzLAotdGhhdCBzdHJpbmdzIGNvbnRhaW5pbmcgbmV3bGluZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHdvcmspLCBiZSBzdXJlCi10byBzYXkgc28uCi0KLUFsc28gZXhwbGFpbiB0aGUgc2lnbmlmaWNhbmNlIG9mIHRoZSByZXR1cm4gdmFsdWUsIGlmIHRoZXJlIGlzIG9uZS4KLQotUGxlYXNlIHB1dCB0d28gc3BhY2VzIGFmdGVyIHRoZSBlbmQgb2YgYSBzZW50ZW5jZSBpbiB5b3VyIGNvbW1lbnRzLCBzbwotdGhhdCB0aGUgRW1hY3Mgc2VudGVuY2UgY29tbWFuZHMgd2lsbCB3b3JrLiAgQWxzbywgcGxlYXNlIHdyaXRlCi1jb21wbGV0ZSBzZW50ZW5jZXMgYW5kIGNhcGl0YWxpemUgdGhlIGZpcnN0IHdvcmQuICBJZiBhIGxvd2VyLWNhc2UKLWlkZW50aWZpZXIgY29tZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlbnRlbmNlLCBkb24ndCBjYXBpdGFsaXplIGl0IQotQ2hhbmdpbmcgdGhlIHNwZWxsaW5nIG1ha2VzIGl0IGEgZGlmZmVyZW50IGlkZW50aWZpZXIuICBJZiB5b3UgZG9uJ3QKLWxpa2Ugc3RhcnRpbmcgYSBzZW50ZW5jZSB3aXRoIGEgbG93ZXIgY2FzZSBsZXR0ZXIsIHdyaXRlIHRoZSBzZW50ZW5jZQotZGlmZmVyZW50bHkgKGUuZy4sIGBgVGhlIGlkZW50aWZpZXIgbG93ZXItY2FzZSBpcyBAZG90c3t9JycpLgotCi1UaGUgY29tbWVudCBvbiBhIGZ1bmN0aW9uIGlzIG11Y2ggY2xlYXJlciBpZiB5b3UgdXNlIHRoZSBhcmd1bWVudAotbmFtZXMgdG8gc3BlYWsgYWJvdXQgdGhlIGFyZ3VtZW50IHZhbHVlcy4gIFRoZSB2YXJpYWJsZSBuYW1lIGl0c2VsZgotc2hvdWxkIGJlIGxvd2VyIGNhc2UsIGJ1dCB3cml0ZSBpdCBpbiB1cHBlciBjYXNlIHdoZW4geW91IGFyZSBzcGVha2luZwotYWJvdXQgdGhlIHZhbHVlIHJhdGhlciB0aGFuIHRoZSB2YXJpYWJsZSBpdHNlbGYuICBUaHVzLCBgYHRoZSBpbm9kZQotbnVtYmVyIE5PREVfTlVNJycgcmF0aGVyIHRoYW4gYGBhbiBpbm9kZScnLgotCi1UaGVyZSBpcyB1c3VhbGx5IG5vIHB1cnBvc2UgaW4gcmVzdGF0aW5nIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbgotdGhlIGNvbW1lbnQgYmVmb3JlIGl0LCBiZWNhdXNlIHRoZSByZWFkZXIgY2FuIHNlZSB0aGF0IGZvciBoaW1zZWxmLgotVGhlcmUgbWlnaHQgYmUgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIGNvbW1lbnQgaXMgc28gbG9uZyB0aGF0IHRoZSBmdW5jdGlvbgotaXRzZWxmIHdvdWxkIGJlIG9mZiB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uCi0KLVRoZXJlIHNob3VsZCBiZSBhIGNvbW1lbnQgb24gZWFjaCBzdGF0aWMgdmFyaWFibGUgYXMgd2VsbCwgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotLyogTm9uemVybyBtZWFucyB0cnVuY2F0ZSBsaW5lcyBpbiB0aGUgZGlzcGxheTsKLSAgIHplcm8gbWVhbnMgY29udGludWUgdGhlbS4gICovCi1pbnQgdHJ1bmNhdGVfbGluZXM7Ci1AZW5kIGV4YW1wbGUKLQotRXZlcnkgQHNhbXB7I2VuZGlmfSBzaG91bGQgaGF2ZSBhIGNvbW1lbnQsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzaG9ydAotY29uZGl0aW9uYWxzIChqdXN0IGEgZmV3IGxpbmVzKSB0aGF0IGFyZSBub3QgbmVzdGVkLiAgVGhlIGNvbW1lbnQgc2hvdWxkCi1zdGF0ZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBjb25kaXRpb25hbCB0aGF0IGlzIGVuZGluZywgQGVtcGh7aW5jbHVkaW5nCi1pdHMgc2Vuc2V9LiAgQHNhbXB7I2Vsc2V9IHNob3VsZCBoYXZlIGEgY29tbWVudCBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24KLUBlbXBoe2FuZCBzZW5zZX0gb2YgdGhlIGNvZGUgdGhhdCBmb2xsb3dzLiAgRm9yIGV4YW1wbGU6Ci0KLUBleGFtcGxlCi1AZ3JvdXAKLSNpZmRlZiBmb28KLSAgQGRvdHN7fQotI2Vsc2UgLyogbm90IGZvbyAqLwotICBAZG90c3t9Ci0jZW5kaWYgLyogbm90IGZvbyAqLwotQGVuZCBncm91cAotQGdyb3VwCi0jaWZkZWYgZm9vCi0gIEBkb3Rze30KLSNlbmRpZiAvKiBmb28gKi8KLUBlbmQgZ3JvdXAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWJ1dCwgYnkgY29udHJhc3QsIHdyaXRlIHRoZSBjb21tZW50cyB0aGlzIHdheSBmb3IgYSBAc2FtcHsjaWZuZGVmfToKLQotQGV4YW1wbGUKLUBncm91cAotI2lmbmRlZiBmb28KLSAgQGRvdHN7fQotI2Vsc2UgLyogZm9vICovCi0gIEBkb3Rze30KLSNlbmRpZiAvKiBmb28gKi8KLUBlbmQgZ3JvdXAKLUBncm91cAotI2lmbmRlZiBmb28KLSAgQGRvdHN7fQotI2VuZGlmIC8qIG5vdCBmb28gKi8KLUBlbmQgZ3JvdXAKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBTeW50YWN0aWMgQ29udmVudGlvbnMKLUBzZWN0aW9uIENsZWFuIFVzZSBvZiBDIENvbnN0cnVjdHMKLQotUGxlYXNlIGV4cGxpY2l0bHkgZGVjbGFyZSBhbGwgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucy4KLURvbid0IG9taXQgdGhlbSBqdXN0IGJlY2F1c2UgdGhleSBhcmUgQGNvZGV7aW50fXMuCi0KLURlY2xhcmF0aW9ucyBvZiBleHRlcm5hbCBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9ucyB0byBhcHBlYXIgbGF0ZXIgaW4gdGhlCi1zb3VyY2UgZmlsZSBzaG91bGQgYWxsIGdvIGluIG9uZSBwbGFjZSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUKLShzb21ld2hlcmUgYmVmb3JlIHRoZSBmaXJzdCBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHRoZSBmaWxlKSwgb3IgZWxzZQotc2hvdWxkIGdvIGluIGEgaGVhZGVyIGZpbGUuICBEb24ndCBwdXQgQGNvZGV7ZXh0ZXJufSBkZWNsYXJhdGlvbnMgaW5zaWRlCi1mdW5jdGlvbnMuCi0KLUl0IHVzZWQgdG8gYmUgY29tbW9uIHByYWN0aWNlIHRvIHVzZSB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMgKHdpdGgKLW5hbWVzIGxpa2UgQGNvZGV7dGVtfSkgb3ZlciBhbmQgb3ZlciBmb3IgZGlmZmVyZW50IHZhbHVlcyB3aXRoaW4gb25lCi1mdW5jdGlvbi4gIEluc3RlYWQgb2YgZG9pbmcgdGhpcywgaXQgaXMgYmV0dGVyIGRlY2xhcmUgYSBzZXBhcmF0ZSBsb2NhbAotdmFyaWFibGUgZm9yIGVhY2ggZGlzdGluY3QgcHVycG9zZSwgYW5kIGdpdmUgaXQgYSBuYW1lIHdoaWNoIGlzCi1tZWFuaW5nZnVsLiAgVGhpcyBub3Qgb25seSBtYWtlcyBwcm9ncmFtcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCwgaXQgYWxzbwotZmFjaWxpdGF0ZXMgb3B0aW1pemF0aW9uIGJ5IGdvb2QgY29tcGlsZXJzLiAgWW91IGNhbiBhbHNvIG1vdmUgdGhlCi1kZWNsYXJhdGlvbiBvZiBlYWNoIGxvY2FsIHZhcmlhYmxlIGludG8gdGhlIHNtYWxsZXN0IHNjb3BlIHRoYXQgaW5jbHVkZXMKLWFsbCBpdHMgdXNlcy4gIFRoaXMgbWFrZXMgdGhlIHByb2dyYW0gZXZlbiBjbGVhbmVyLgotCi1Eb24ndCB1c2UgbG9jYWwgdmFyaWFibGVzIG9yIHBhcmFtZXRlcnMgdGhhdCBzaGFkb3cgZ2xvYmFsIGlkZW50aWZpZXJzLgotCi1Eb24ndCBkZWNsYXJlIG11bHRpcGxlIHZhcmlhYmxlcyBpbiBvbmUgZGVjbGFyYXRpb24gdGhhdCBzcGFucyBsaW5lcy4KLVN0YXJ0IGEgbmV3IGRlY2xhcmF0aW9uIG9uIGVhY2ggbGluZSwgaW5zdGVhZC4gIEZvciBleGFtcGxlLCBpbnN0ZWFkCi1vZiB0aGlzOgotCi1AZXhhbXBsZQotQGdyb3VwCi1pbnQgICAgZm9vLAotICAgICAgIGJhcjsKLUBlbmQgZ3JvdXAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdyaXRlIGVpdGhlciB0aGlzOgotCi1AZXhhbXBsZQotaW50IGZvbywgYmFyOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotb3IgdGhpczoKLQotQGV4YW1wbGUKLWludCBmb287Ci1pbnQgYmFyOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotKElmIHRoZXkgYXJlIGdsb2JhbCB2YXJpYWJsZXMsIGVhY2ggc2hvdWxkIGhhdmUgYSBjb21tZW50IHByZWNlZGluZyBpdAotYW55d2F5LikKLQotV2hlbiB5b3UgaGF2ZSBhbiBAY29kZXtpZn0tQGNvZGV7ZWxzZX0gc3RhdGVtZW50IG5lc3RlZCBpbiBhbm90aGVyCi1AY29kZXtpZn0gc3RhdGVtZW50LCBhbHdheXMgcHV0IGJyYWNlcyBhcm91bmQgdGhlIEBjb2Rle2lmfS1AY29kZXtlbHNlfS4KLVRodXMsIG5ldmVyIHdyaXRlIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIGlmIChiYXIpCi0gICAgd2luICgpOwotICBlbHNlCi0gICAgbG9zZSAoKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWFsd2F5cyBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pZiAoZm9vKQotICBAewotICAgIGlmIChiYXIpCi0gICAgICB3aW4gKCk7Ci0gICAgZWxzZQotICAgICAgbG9zZSAoKTsKLSAgQH0KLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgaGF2ZSBhbiBAY29kZXtpZn0gc3RhdGVtZW50IG5lc3RlZCBpbnNpZGUgb2YgYW4gQGNvZGV7ZWxzZX0KLXN0YXRlbWVudCwgZWl0aGVyIHdyaXRlIEBjb2Rle2Vsc2UgaWZ9IG9uIG9uZSBsaW5lLCBsaWtlIHRoaXMsCi0KLUBleGFtcGxlCi1pZiAoZm9vKQotICBAZG90c3t9Ci1lbHNlIGlmIChiYXIpCi0gIEBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdpdGggaXRzIEBjb2Rle3RoZW59LXBhcnQgaW5kZW50ZWQgbGlrZSB0aGUgcHJlY2VkaW5nIEBjb2Rle3RoZW59LXBhcnQsCi1vciB3cml0ZSB0aGUgbmVzdGVkIEBjb2Rle2lmfSB3aXRoaW4gYnJhY2VzIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIEBkb3Rze30KLWVsc2UKLSAgQHsKLSAgICBpZiAoYmFyKQotICAgICAgQGRvdHN7fQotICBAfQotQGVuZCBleGFtcGxlCi0KLURvbid0IGRlY2xhcmUgYm90aCBhIHN0cnVjdHVyZSB0YWcgYW5kIHZhcmlhYmxlcyBvciB0eXBlZGVmcyBpbiB0aGUKLXNhbWUgZGVjbGFyYXRpb24uICBJbnN0ZWFkLCBkZWNsYXJlIHRoZSBzdHJ1Y3R1cmUgdGFnIHNlcGFyYXRlbHkKLWFuZCB0aGVuIHVzZSBpdCB0byBkZWNsYXJlIHRoZSB2YXJpYWJsZXMgb3IgdHlwZWRlZnMuCi0KLVRyeSB0byBhdm9pZCBhc3NpZ25tZW50cyBpbnNpZGUgQGNvZGV7aWZ9LWNvbmRpdGlvbnMuICBGb3IgZXhhbXBsZSwKLWRvbid0IHdyaXRlIHRoaXM6Ci0KLUBleGFtcGxlCi1pZiAoKGZvbyA9IChjaGFyICopIG1hbGxvYyAoc2l6ZW9mICpmb28pKSA9PSAwKQotICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotaW5zdGVhZCwgd3JpdGUgdGhpczoKLQotQGV4YW1wbGUKLWZvbyA9IChjaGFyICopIG1hbGxvYyAoc2l6ZW9mICpmb28pOwotaWYgKGZvbyA9PSAwKQotICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotQGVuZCBleGFtcGxlCi0KLURvbid0IG1ha2UgdGhlIHByb2dyYW0gdWdseSB0byBwbGFjYXRlIEBjb2Rle2xpbnR9LiAgUGxlYXNlIGRvbid0IGluc2VydCBhbnkKLWNhc3RzIHRvIEBjb2Rle3ZvaWR9LiAgWmVybyB3aXRob3V0IGEgY2FzdCBpcyBwZXJmZWN0bHkgZmluZSBhcyBhIG51bGwKLXBvaW50ZXIgY29uc3RhbnQsIGV4Y2VwdCB3aGVuIGNhbGxpbmcgYSB2YXJhcmdzIGZ1bmN0aW9uLgotCi1Abm9kZSAgTmFtZXMKLUBzZWN0aW9uIE5hbWluZyBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucwotCi1UaGUgbmFtZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIGEgcHJvZ3JhbSBzZXJ2ZSBhcwotY29tbWVudHMgb2YgYSBzb3J0LiAgU28gZG9uJ3QgY2hvb3NlIHRlcnNlIG5hbWVzLS0taW5zdGVhZCwgbG9vayBmb3IKLW5hbWVzIHRoYXQgZ2l2ZSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlhYmxlIG9yCi1mdW5jdGlvbi4gIEluIGEgR05VIHByb2dyYW0sIG5hbWVzIHNob3VsZCBiZSBFbmdsaXNoLCBsaWtlIG90aGVyCi1jb21tZW50cy4KLQotTG9jYWwgdmFyaWFibGUgbmFtZXMgY2FuIGJlIHNob3J0ZXIsIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBvbmx5IHdpdGhpbgotb25lIGNvbnRleHQsIHdoZXJlIChwcmVzdW1hYmx5KSBjb21tZW50cyBleHBsYWluIHRoZWlyIHB1cnBvc2UuCi0KLVBsZWFzZSB1c2UgdW5kZXJzY29yZXMgdG8gc2VwYXJhdGUgd29yZHMgaW4gYSBuYW1lLCBzbyB0aGF0IHRoZSBFbWFjcwotd29yZCBjb21tYW5kcyBjYW4gYmUgdXNlZnVsIHdpdGhpbiB0aGVtLiAgU3RpY2sgdG8gbG93ZXIgY2FzZTsgcmVzZXJ2ZQotdXBwZXIgY2FzZSBmb3IgbWFjcm9zIGFuZCBAY29kZXtlbnVtfSBjb25zdGFudHMsIGFuZCBmb3IgbmFtZS1wcmVmaXhlcwotdGhhdCBmb2xsb3cgYSB1bmlmb3JtIGNvbnZlbnRpb24uCi0KLUZvciBleGFtcGxlLCB5b3Ugc2hvdWxkIHVzZSBuYW1lcyBsaWtlIEBjb2Rle2lnbm9yZV9zcGFjZV9jaGFuZ2VfZmxhZ307Ci1kb24ndCB1c2UgbmFtZXMgbGlrZSBAY29kZXtpQ2FudFJlYWRUaGlzfS4KLQotVmFyaWFibGVzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBjb21tYW5kLWxpbmUgb3B0aW9ucyBoYXZlIGJlZW4KLXNwZWNpZmllZCBzaG91bGQgYmUgbmFtZWQgYWZ0ZXIgdGhlIG1lYW5pbmcgb2YgdGhlIG9wdGlvbiwgbm90IGFmdGVyCi10aGUgb3B0aW9uLWxldHRlci4gIEEgY29tbWVudCBzaG91bGQgc3RhdGUgYm90aCB0aGUgZXhhY3QgbWVhbmluZyBvZgotdGhlIG9wdGlvbiBhbmQgaXRzIGxldHRlci4gIEZvciBleGFtcGxlLAotCi1AZXhhbXBsZQotQGdyb3VwCi0vKiBJZ25vcmUgY2hhbmdlcyBpbiBob3Jpem9udGFsIHdoaXRlc3BhY2UgKC1iKS4gICovCi1pbnQgaWdub3JlX3NwYWNlX2NoYW5nZV9mbGFnOwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLVdoZW4geW91IHdhbnQgdG8gZGVmaW5lIG5hbWVzIHdpdGggY29uc3RhbnQgaW50ZWdlciB2YWx1ZXMsIHVzZQotQGNvZGV7ZW51bX0gcmF0aGVyIHRoYW4gQHNhbXB7I2RlZmluZX0uICBHREIga25vd3MgYWJvdXQgZW51bWVyYXRpb24KLWNvbnN0YW50cy4KLQotVXNlIGZpbGUgbmFtZXMgb2YgMTQgY2hhcmFjdGVycyBvciBsZXNzLCB0byBhdm9pZCBjcmVhdGluZyBncmF0dWl0b3VzCi1wcm9ibGVtcyBvbiBvbGRlciBTeXN0ZW0gViBzeXN0ZW1zLiAgWW91IGNhbiB1c2UgdGhlIHByb2dyYW0KLUBjb2Rle2Rvc2Noa30gdG8gdGVzdCBmb3IgdGhpcy4gIEBjb2Rle2Rvc2Noa30gYWxzbyB0ZXN0cyBmb3IgcG90ZW50aWFsCi1uYW1lIGNvbmZsaWN0cyBpZiB0aGUgZmlsZXMgd2VyZSBsb2FkZWQgb250byBhbiBNUy1ET1MgZmlsZQotc3lzdGVtLS0tc29tZXRoaW5nIHlvdSBtYXkgb3IgbWF5IG5vdCBjYXJlIGFib3V0LgotCi1Abm9kZSBTeXN0ZW0gUG9ydGFiaWxpdHkKLUBzZWN0aW9uIFBvcnRhYmlsaXR5IGJldHdlZW4gU3lzdGVtIFR5cGVzCi0KLUluIHRoZSBVbml4IHdvcmxkLCBgYHBvcnRhYmlsaXR5JycgcmVmZXJzIHRvIHBvcnRpbmcgdG8gZGlmZmVyZW50IFVuaXgKLXZlcnNpb25zLiAgRm9yIGEgR05VIHByb2dyYW0sIHRoaXMga2luZCBvZiBwb3J0YWJpbGl0eSBpcyBkZXNpcmFibGUsIGJ1dAotbm90IHBhcmFtb3VudC4KLQotVGhlIHByaW1hcnkgcHVycG9zZSBvZiBHTlUgc29mdHdhcmUgaXMgdG8gcnVuIG9uIHRvcCBvZiB0aGUgR05VIGtlcm5lbCwKLWNvbXBpbGVkIHdpdGggdGhlIEdOVSBDIGNvbXBpbGVyLCBvbiB2YXJpb3VzIHR5cGVzIG9mIEBzY3tjcHV9LiAgVGhlCi1hbW91bnQgYW5kIGtpbmRzIG9mIHZhcmlhdGlvbiBhbW9uZyBHTlUgc3lzdGVtcyBvbiBkaWZmZXJlbnQgQHNje2NwdX1zCi13aWxsIGJlIGNvbXBhcmFibGUgdG8gdGhlIHZhcmlhdGlvbiBhbW9uZyBMaW51eC1iYXNlZCBHTlUgc3lzdGVtcyBvcgotYW1vbmcgQlNEIHN5c3RlbXMgdG9kYXkuICBTbyB0aGUga2luZHMgb2YgcG9ydGFiaWxpdHkgdGhhdCBhcmUgYWJzb2x1dGVseQotbmVjZXNzYXJ5IGFyZSBxdWl0ZSBsaW1pdGVkLgotCi1CdXQgbWFueSB1c2VycyBkbyBydW4gR05VIHNvZnR3YXJlIG9uIG5vbi1HTlUgVW5peCBvciBVbml4LWxpa2Ugc3lzdGVtcy4KLVNvIHN1cHBvcnRpbmcgYSB2YXJpZXR5IG9mIFVuaXgtbGlrZSBzeXN0ZW1zIGlzIGRlc2lyYWJsZSwgYWx0aG91Z2ggbm90Ci1wYXJhbW91bnQuCi0KLVRoZSBlYXNpZXN0IHdheSB0byBhY2hpZXZlIHBvcnRhYmlsaXR5IHRvIG1vc3QgVW5peC1saWtlIHN5c3RlbXMgaXMgdG8KLXVzZSBBdXRvY29uZi4gIEl0J3MgdW5saWtlbHkgdGhhdCB5b3VyIHByb2dyYW0gbmVlZHMgdG8ga25vdyBtb3JlCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgaG9zdCBwbGF0Zm9ybSB0aGFuIEF1dG9jb25mIGNhbiBwcm92aWRlLCBzaW1wbHkKLWJlY2F1c2UgbW9zdCBvZiB0aGUgcHJvZ3JhbXMgdGhhdCBuZWVkIHN1Y2gga25vd2xlZGdlIGhhdmUgYWxyZWFkeSBiZWVuCi13cml0dGVuLgotCi1Bdm9pZCB1c2luZyB0aGUgZm9ybWF0IG9mIHNlbWktaW50ZXJuYWwgZGF0YSBiYXNlcyAoZS5nLiwgZGlyZWN0b3JpZXMpCi13aGVuIHRoZXJlIGlzIGEgaGlnaGVyLWxldmVsIGFsdGVybmF0aXZlIChAY29kZXtyZWFkZGlyfSkuCi0KLUFzIGZvciBzeXN0ZW1zIHRoYXQgYXJlIG5vdCBsaWtlIFVuaXgsIHN1Y2ggYXMgTVNET1MsIFdpbmRvd3MsIHRoZQotTWFjaW50b3NoLCBWTVMsIGFuZCBNVlMsIHN1cHBvcnRpbmcgdGhlbSBpcyB1c3VhbGx5IHNvIG11Y2ggd29yayB0aGF0IGl0Ci1pcyBiZXR0ZXIgaWYgeW91IGRvbid0LgotCi1UaGUgcGxhbm5lZCBHTlUga2VybmVsIGlzIG5vdCBmaW5pc2hlZCB5ZXQsIGJ1dCB5b3UgY2FuIHRlbGwgd2hpY2gKLWZhY2lsaXRpZXMgaXQgd2lsbCBwcm92aWRlIGJ5IGxvb2tpbmcgYXQgdGhlIEdOVSBDIExpYnJhcnkgTWFudWFsLiAgVGhlCi1HTlUga2VybmVsIGlzIGJhc2VkIG9uIE1hY2gsIHNvIHRoZSBmZWF0dXJlcyBvZiBNYWNoIHdpbGwgYWxzbyBiZQotYXZhaWxhYmxlLiAgSG93ZXZlciwgaWYgeW91IHVzZSBNYWNoIGZlYXR1cmVzLCB5b3UnbGwgcHJvYmFibHkgaGF2ZQotdHJvdWJsZSBkZWJ1Z2dpbmcgeW91ciBwcm9ncmFtIHRvZGF5LgotCi1Abm9kZSBDUFUgUG9ydGFiaWxpdHkKLUBzZWN0aW9uIFBvcnRhYmlsaXR5IGJldHdlZW4gQHNje2NwdX1zCi0KLUV2ZW4gR05VIHN5c3RlbXMgd2lsbCBkaWZmZXIgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBhbW9uZyBAc2N7Y3B1fQotdHlwZXMtLS1mb3IgZXhhbXBsZSwgZGlmZmVyZW5jZSBpbiBieXRlIG9yZGVyaW5nIGFuZCBhbGlnbm1lbnQKLXJlcXVpcmVtZW50cy4gIEl0IGlzIGFic29sdXRlbHkgZXNzZW50aWFsIHRvIGhhbmRsZSB0aGVzZSBkaWZmZXJlbmNlcy4KLUhvd2V2ZXIsIGRvbid0IG1ha2UgYW55IGVmZm9ydCB0byBjYXRlciB0byB0aGUgcG9zc2liaWxpdHkgdGhhdCBhbgotQGNvZGV7aW50fSB3aWxsIGJlIGxlc3MgdGhhbiAzMiBiaXRzLiAgV2UgZG9uJ3Qgc3VwcG9ydCAxNi1iaXQgbWFjaGluZXMKLWluIEdOVS4KLQotRG9uJ3QgYXNzdW1lIHRoYXQgdGhlIGFkZHJlc3Mgb2YgYW4gQGNvZGV7aW50fSBvYmplY3QgaXMgYWxzbyB0aGUKLWFkZHJlc3Mgb2YgaXRzIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUuICBUaGlzIGlzIGZhbHNlIG9uIGJpZy1lbmRpYW4KLW1hY2hpbmVzLiAgVGh1cywgZG9uJ3QgbWFrZSB0aGUgZm9sbG93aW5nIG1pc3Rha2U6Ci0KLUBleGFtcGxlCi1pbnQgYzsKLUBkb3Rze30KLXdoaWxlICgoYyA9IGdldGNoYXIoKSkgIT0gRU9GKQotICB3cml0ZShmaWxlX2Rlc2NyaXB0b3IsICZjLCAxKTsKLUBlbmQgZXhhbXBsZQotCi1XaGVuIGNhbGxpbmcgZnVuY3Rpb25zLCB5b3UgbmVlZCBub3Qgd29ycnkgYWJvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotcG9pbnRlcnMgb2YgdmFyaW91cyB0eXBlcywgb3IgYmV0d2VlbiBwb2ludGVycyBhbmQgaW50ZWdlcnMuICBPbiBtb3N0Ci1tYWNoaW5lcywgdGhlcmUncyBubyBkaWZmZXJlbmNlIGFueXdheS4gIEFzIGZvciB0aGUgZmV3IG1hY2hpbmVzIHdoZXJlCi10aGVyZSBpcyBhIGRpZmZlcmVuY2UsIGFsbCBvZiB0aGVtIHN1cHBvcnQgQHNje2Fuc2l9IEMsIHNvIHlvdSBjYW4gdXNlCi1wcm90b3R5cGVzIChjb25kaXRpb25hbGl6ZWQgdG8gYmUgYWN0aXZlIG9ubHkgaW4gQHNje2Fuc2l9IEMpIHRvIG1ha2UKLXRoZSBjb2RlIHdvcmsgb24gdGhvc2Ugc3lzdGVtcy4KLQotSW4gY2VydGFpbiBjYXNlcywgaXQgaXMgb2sgdG8gcGFzcyBpbnRlZ2VyIGFuZCBwb2ludGVyIGFyZ3VtZW50cwotaW5kaXNjcmltaW5hdGVseSB0byB0aGUgc2FtZSBmdW5jdGlvbiwgYW5kIHVzZSBubyBwcm90b3R5cGUgb24gYW55Ci1zeXN0ZW0uICBGb3IgZXhhbXBsZSwgbWFueSBHTlUgcHJvZ3JhbXMgaGF2ZSBlcnJvci1yZXBvcnRpbmcgZnVuY3Rpb25zCi10aGF0IHBhc3MgdGhlaXIgYXJndW1lbnRzIGFsb25nIHRvIEBjb2Rle3ByaW50Zn0gYW5kIGZyaWVuZHM6Ci0KLUBleGFtcGxlCi1lcnJvciAocywgYTEsIGEyLCBhMykKLSAgICAgY2hhciAqczsKLSAgICAgaW50IGExLCBhMiwgYTM7Ci1AewotICBmcHJpbnRmIChzdGRlcnIsICJlcnJvcjogIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgcywgYTEsIGEyLCBhMyk7Ci1AfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotSW4gcHJhY3RpY2UsIHRoaXMgd29ya3Mgb24gYWxsIG1hY2hpbmVzLCBhbmQgaXQgaXMgbXVjaCBzaW1wbGVyIHRoYW4gYW55Ci1gYGNvcnJlY3QnJyBhbHRlcm5hdGl2ZS4gIEJlIHN1cmUgQGVtcGh7bm90fSB0byB1c2UgYSBwcm90b3R5cGUKLWZvciBzdWNoIGZ1bmN0aW9ucy4KLQotSG93ZXZlciwgYXZvaWQgY2FzdGluZyBwb2ludGVycyB0byBpbnRlZ2VycyB1bmxlc3MgeW91IHJlYWxseSBuZWVkIHRvLgotVGhlc2UgYXNzdW1wdGlvbnMgcmVhbGx5IHJlZHVjZSBwb3J0YWJpbGl0eSwgYW5kIGluIG1vc3QgcHJvZ3JhbXMgdGhleQotYXJlIGVhc3kgdG8gYXZvaWQuICBJbiB0aGUgY2FzZXMgd2hlcmUgY2FzdGluZyBwb2ludGVycyB0byBpbnRlZ2VycyBpcwotZXNzZW50aWFsLS0tc3VjaCBhcywgYSBMaXNwIGludGVycHJldGVyIHdoaWNoIHN0b3JlcyB0eXBlIGluZm9ybWF0aW9uIGFzCi13ZWxsIGFzIGFuIGFkZHJlc3MgaW4gb25lIHdvcmQtLS1pdCBpcyBvayB0byBkbyBzbywgYnV0IHlvdSdsbCBoYXZlIHRvCi1tYWtlIGV4cGxpY2l0IHByb3Zpc2lvbnMgdG8gaGFuZGxlIGRpZmZlcmVudCB3b3JkIHNpemVzLgotCi1Abm9kZSBTeXN0ZW0gRnVuY3Rpb25zCi1Ac2VjdGlvbiBDYWxsaW5nIFN5c3RlbSBGdW5jdGlvbnMKLQotQyBpbXBsZW1lbnRhdGlvbnMgZGlmZmVyIHN1YnN0YW50aWFsbHkuICBAc2N7YW5zaX0gQyByZWR1Y2VzIGJ1dCBkb2VzIG5vdAotZWxpbWluYXRlIHRoZSBpbmNvbXBhdGliaWxpdGllczsgbWVhbndoaWxlLCBtYW55IHVzZXJzIHdpc2ggdG8gY29tcGlsZQotR05VIHNvZnR3YXJlIHdpdGggcHJlLUBzY3thbnNpfSBjb21waWxlcnMuICBUaGlzIGNoYXB0ZXIgZ2l2ZXMKLXJlY29tbWVuZGF0aW9ucyBmb3IgaG93IHRvIHVzZSB0aGUgbW9yZSBvciBsZXNzIHN0YW5kYXJkIEMgbGlicmFyeQotZnVuY3Rpb25zIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGxvc3Mgb2YgcG9ydGFiaWxpdHkuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Eb24ndCB1c2UgdGhlIHZhbHVlIG9mIEBjb2Rle3NwcmludGZ9LiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi1jaGFyYWN0ZXJzIHdyaXR0ZW4gb24gc29tZSBzeXN0ZW1zLCBidXQgbm90IG9uIGFsbCBzeXN0ZW1zLgotCi1AaXRlbQotQGNvZGV7bWFpbn0gc2hvdWxkIGJlIGRlY2xhcmVkIHRvIHJldHVybiB0eXBlIEBjb2Rle2ludH0uICBJdCBzaG91bGQKLXRlcm1pbmF0ZSBlaXRoZXIgYnkgY2FsbGluZyBAY29kZXtleGl0fSBvciBieSByZXR1cm5pbmcgdGhlIGludGVnZXIKLXN0YXR1cyBjb2RlOyBtYWtlIHN1cmUgaXQgY2Fubm90IGV2ZXIgcmV0dXJuIGFuIHVuZGVmaW5lZCB2YWx1ZS4KLQotQGl0ZW0KLURvbid0IGRlY2xhcmUgc3lzdGVtIGZ1bmN0aW9ucyBleHBsaWNpdGx5LgotCi1BbG1vc3QgYW55IGRlY2xhcmF0aW9uIGZvciBhIHN5c3RlbSBmdW5jdGlvbiBpcyB3cm9uZyBvbiBzb21lIHN5c3RlbS4KLVRvIG1pbmltaXplIGNvbmZsaWN0cywgbGVhdmUgaXQgdG8gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgdG8gZGVjbGFyZQotc3lzdGVtIGZ1bmN0aW9ucy4gIElmIHRoZSBoZWFkZXJzIGRvbid0IGRlY2xhcmUgYSBmdW5jdGlvbiwgbGV0IGl0Ci1yZW1haW4gdW5kZWNsYXJlZC4KLQotV2hpbGUgaXQgbWF5IHNlZW0gdW5jbGVhbiB0byB1c2UgYSBmdW5jdGlvbiB3aXRob3V0IGRlY2xhcmluZyBpdCwgaW4KLXByYWN0aWNlIHRoaXMgd29ya3MgZmluZSBmb3IgbW9zdCBzeXN0ZW0gbGlicmFyeSBmdW5jdGlvbnMgb24gdGhlCi1zeXN0ZW1zIHdoZXJlIHRoaXMgcmVhbGx5IGhhcHBlbnM7IHRodXMsIHRoZSBkaXNhZHZhbnRhZ2UgaXMgb25seQotdGhlb3JldGljYWwuICBCeSBjb250cmFzdCwgYWN0dWFsIGRlY2xhcmF0aW9ucyBoYXZlIGZyZXF1ZW50bHkgY2F1c2VkCi1hY3R1YWwgY29uZmxpY3RzLgotCi1AaXRlbQotSWYgeW91IG11c3QgZGVjbGFyZSBhIHN5c3RlbSBmdW5jdGlvbiwgZG9uJ3Qgc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZXMuCi1Vc2UgYW4gb2xkLXN0eWxlIGRlY2xhcmF0aW9uLCBub3QgYW4gQHNje2Fuc2l9IHByb3RvdHlwZS4gIFRoZSBtb3JlIHlvdQotc3BlY2lmeSBhYm91dCB0aGUgZnVuY3Rpb24sIHRoZSBtb3JlIGxpa2VseSBhIGNvbmZsaWN0LgotCi1AaXRlbQotSW4gcGFydGljdWxhciwgZG9uJ3QgdW5jb25kaXRpb25hbGx5IGRlY2xhcmUgQGNvZGV7bWFsbG9jfSBvcgotQGNvZGV7cmVhbGxvY30uCi0KLU1vc3QgR05VIHByb2dyYW1zIHVzZSB0aG9zZSBmdW5jdGlvbnMganVzdCBvbmNlLCBpbiBmdW5jdGlvbnMKLWNvbnZlbnRpb25hbGx5IG5hbWVkIEBjb2Rle3htYWxsb2N9IGFuZCBAY29kZXt4cmVhbGxvY30uICBUaGVzZQotZnVuY3Rpb25zIGNhbGwgQGNvZGV7bWFsbG9jfSBhbmQgQGNvZGV7cmVhbGxvY30sIHJlc3BlY3RpdmVseSwgYW5kCi1jaGVjayB0aGUgcmVzdWx0cy4KLQotQmVjYXVzZSBAY29kZXt4bWFsbG9jfSBhbmQgQGNvZGV7eHJlYWxsb2N9IGFyZSBkZWZpbmVkIGluIHlvdXIgcHJvZ3JhbSwKLXlvdSBjYW4gZGVjbGFyZSB0aGVtIGluIG90aGVyIGZpbGVzIHdpdGhvdXQgYW55IHJpc2sgb2YgdHlwZSBjb25mbGljdC4KLQotT24gbW9zdCBzeXN0ZW1zLCBAY29kZXtpbnR9IGlzIHRoZSBzYW1lIGxlbmd0aCBhcyBhIHBvaW50ZXI7IHRodXMsIHRoZQotY2FsbHMgdG8gQGNvZGV7bWFsbG9jfSBhbmQgQGNvZGV7cmVhbGxvY30gd29yayBmaW5lLiAgRm9yIHRoZSBmZXcKLWV4Y2VwdGlvbmFsIHN5c3RlbXMgKG1vc3RseSA2NC1iaXQgbWFjaGluZXMpLCB5b3UgY2FuIHVzZQotQHN0cm9uZ3tjb25kaXRpb25hbGl6ZWR9IGRlY2xhcmF0aW9ucyBvZiBAY29kZXttYWxsb2N9IGFuZAotQGNvZGV7cmVhbGxvY30tLS1vciBwdXQgdGhlc2UgZGVjbGFyYXRpb25zIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMKLXNwZWNpZmljIHRvIHRob3NlIHN5c3RlbXMuCi0KLUBpdGVtCi1UaGUgc3RyaW5nIGZ1bmN0aW9ucyByZXF1aXJlIHNwZWNpYWwgdHJlYXRtZW50LiAgU29tZSBVbml4IHN5c3RlbXMgaGF2ZQotYSBoZWFkZXIgZmlsZSBAZmlsZXtzdHJpbmcuaH07IG90aGVycyBoYXZlIEBmaWxle3N0cmluZ3MuaH0uICBOZWl0aGVyCi1maWxlIG5hbWUgaXMgcG9ydGFibGUuICBUaGVyZSBhcmUgdHdvIHRoaW5ncyB5b3UgY2FuIGRvOiB1c2UgQXV0b2NvbmYgdG8KLWZpZ3VyZSBvdXQgd2hpY2ggZmlsZSB0byBpbmNsdWRlLCBvciBkb24ndCBpbmNsdWRlIGVpdGhlciBmaWxlLgotCi1AaXRlbQotSWYgeW91IGRvbid0IGluY2x1ZGUgZWl0aGVyIHN0cmluZ3MgZmlsZSwgeW91IGNhbid0IGdldCBkZWNsYXJhdGlvbnMgZm9yCi10aGUgc3RyaW5nIGZ1bmN0aW9ucyBmcm9tIHRoZSBoZWFkZXIgZmlsZSBpbiB0aGUgdXN1YWwgd2F5LgotCi1UaGF0IGNhdXNlcyBsZXNzIG9mIGEgcHJvYmxlbSB0aGFuIHlvdSBtaWdodCB0aGluay4gIFRoZSBuZXdlciBAc2N7YW5zaX0KLXN0cmluZyBmdW5jdGlvbnMgc2hvdWxkIGJlIGF2b2lkZWQgYW55d2F5IGJlY2F1c2UgbWFueSBzeXN0ZW1zIHN0aWxsCi1kb24ndCBzdXBwb3J0IHRoZW0uICBUaGUgc3RyaW5nIGZ1bmN0aW9ucyB5b3UgY2FuIHVzZSBhcmUgdGhlc2U6Ci0KLUBleGFtcGxlCi1zdHJjcHkgICBzdHJuY3B5ICAgc3RyY2F0ICAgc3RybmNhdAotc3RybGVuICAgc3RyY21wICAgIHN0cm5jbXAKLXN0cmNociAgIHN0cnJjaHIKLUBlbmQgZXhhbXBsZQotCi1UaGUgY29weSBhbmQgY29uY2F0ZW5hdGUgZnVuY3Rpb25zIHdvcmsgZmluZSB3aXRob3V0IGEgZGVjbGFyYXRpb24gYXMKLWxvbmcgYXMgeW91IGRvbid0IHVzZSB0aGVpciB2YWx1ZXMuICBVc2luZyB0aGVpciB2YWx1ZXMgd2l0aG91dCBhCi1kZWNsYXJhdGlvbiBmYWlscyBvbiBzeXN0ZW1zIHdoZXJlIHRoZSB3aWR0aCBvZiBhIHBvaW50ZXIgZGlmZmVycyBmcm9tCi10aGUgd2lkdGggb2YgQGNvZGV7aW50fSwgYW5kIHBlcmhhcHMgaW4gb3RoZXIgY2FzZXMuICBJdCBpcyB0cml2aWFsIHRvCi1hdm9pZCB1c2luZyB0aGVpciB2YWx1ZXMsIHNvIGRvIHRoYXQuCi0KLVRoZSBjb21wYXJlIGZ1bmN0aW9ucyBhbmQgQGNvZGV7c3RybGVufSB3b3JrIGZpbmUgd2l0aG91dCBhIGRlY2xhcmF0aW9uCi1vbiBtb3N0IHN5c3RlbXMsIHBvc3NpYmx5IGFsbCB0aGUgb25lcyB0aGF0IEdOVSBzb2Z0d2FyZSBydW5zIG9uLgotWW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBkZWNsYXJlIHRoZW0gQHN0cm9uZ3tjb25kaXRpb25hbGx5fSBvbiBhCi1mZXcgc3lzdGVtcy4KLQotVGhlIHNlYXJjaCBmdW5jdGlvbnMgbXVzdCBiZSBkZWNsYXJlZCB0byByZXR1cm4gQGNvZGV7Y2hhciAqfS4gIEx1Y2tpbHksCi10aGVyZSBpcyBubyB2YXJpYXRpb24gaW4gdGhlIGRhdGEgdHlwZSB0aGV5IHJldHVybi4gIEJ1dCB0aGVyZSBpcwotdmFyaWF0aW9uIGluIHRoZWlyIG5hbWVzLiAgU29tZSBzeXN0ZW1zIGdpdmUgdGhlc2UgZnVuY3Rpb25zIHRoZSBuYW1lcwotQGNvZGV7aW5kZXh9IGFuZCBAY29kZXtyaW5kZXh9OyBvdGhlciBzeXN0ZW1zIHVzZSB0aGUgbmFtZXMKLUBjb2Rle3N0cmNocn0gYW5kIEBjb2Rle3N0cnJjaHJ9LiAgU29tZSBzeXN0ZW1zIHN1cHBvcnQgYm90aCBwYWlycyBvZgotbmFtZXMsIGJ1dCBuZWl0aGVyIHBhaXIgd29ya3Mgb24gYWxsIHN5c3RlbXMuCi0KLVlvdSBzaG91bGQgcGljayBhIHNpbmdsZSBwYWlyIG9mIG5hbWVzIGFuZCB1c2UgaXQgdGhyb3VnaG91dCB5b3VyCi1wcm9ncmFtLiAgKE5vd2FkYXlzLCBpdCBpcyBiZXR0ZXIgdG8gY2hvb3NlIEBjb2Rle3N0cmNocn0gYW5kCi1AY29kZXtzdHJyY2hyfSBmb3IgbmV3IHByb2dyYW1zLCBzaW5jZSB0aG9zZSBhcmUgdGhlIHN0YW5kYXJkIEBzY3thbnNpfQotbmFtZXMuKSAgRGVjbGFyZSBib3RoIG9mIHRob3NlIG5hbWVzIGFzIGZ1bmN0aW9ucyByZXR1cm5pbmcgQGNvZGV7Y2hhcgotKn0uICBPbiBzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhvc2UgbmFtZXMsIGRlZmluZSB0aGVtIGFzIG1hY3JvcwotaW4gdGVybXMgb2YgdGhlIG90aGVyIHBhaXIuICBGb3IgZXhhbXBsZSwgaGVyZSBpcyB3aGF0IHRvIHB1dCBhdCB0aGUKLWJlZ2lubmluZyBvZiB5b3VyIGZpbGUgKG9yIGluIGEgaGVhZGVyKSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIG5hbWVzCi1AY29kZXtzdHJjaHJ9IGFuZCBAY29kZXtzdHJyY2hyfSB0aHJvdWdob3V0OgotCi1AZXhhbXBsZQotI2lmbmRlZiBIQVZFX1NUUkNIUgotI2RlZmluZSBzdHJjaHIgaW5kZXgKLSNlbmRpZgotI2lmbmRlZiBIQVZFX1NUUlJDSFIKLSNkZWZpbmUgc3RycmNociByaW5kZXgKLSNlbmRpZgotCi1jaGFyICpzdHJjaHIgKCk7Ci1jaGFyICpzdHJyY2hyICgpOwotQGVuZCBleGFtcGxlCi1AZW5kIGl0ZW1pemUKLQotSGVyZSB3ZSBhc3N1bWUgdGhhdCBAY29kZXtIQVZFX1NUUkNIUn0gYW5kIEBjb2Rle0hBVkVfU1RSUkNIUn0gYXJlCi1tYWNyb3MgZGVmaW5lZCBpbiBzeXN0ZW1zIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucyBleGlzdC4KLU9uZSB3YXkgdG8gZ2V0IHRoZW0gcHJvcGVybHkgZGVmaW5lZCBpcyB0byB1c2UgQXV0b2NvbmYuCi0KLUBub2RlIEludGVybmF0aW9uYWxpemF0aW9uCi1Ac2VjdGlvbiBJbnRlcm5hdGlvbmFsaXphdGlvbgotCi1HTlUgaGFzIGEgbGlicmFyeSBjYWxsZWQgR05VIGdldHRleHQgdGhhdCBtYWtlcyBpdCBlYXN5IHRvIHRyYW5zbGF0ZSB0aGUKLW1lc3NhZ2VzIGluIGEgcHJvZ3JhbSBpbnRvIHZhcmlvdXMgbGFuZ3VhZ2VzLiAgWW91IHNob3VsZCB1c2UgdGhpcwotbGlicmFyeSBpbiBldmVyeSBwcm9ncmFtLiAgVXNlIEVuZ2xpc2ggZm9yIHRoZSBtZXNzYWdlcyBhcyB0aGV5IGFwcGVhcgotaW4gdGhlIHByb2dyYW0sIGFuZCBsZXQgZ2V0dGV4dCBwcm92aWRlIHRoZSB3YXkgdG8gdHJhbnNsYXRlIHRoZW0gaW50bwotb3RoZXIgbGFuZ3VhZ2VzLgotCi1Vc2luZyBHTlUgZ2V0dGV4dCBpbnZvbHZlcyBwdXR0aW5nIGEgY2FsbCB0byB0aGUgQGNvZGV7Z2V0dGV4dH0gbWFjcm8KLWFyb3VuZCBlYWNoIHN0cmluZyB0aGF0IG1pZ2h0IG5lZWQgdHJhbnNsYXRpb24tLS1saWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1wcmludGYgKGdldHRleHQgKCJQcm9jZXNzaW5nIGZpbGUgYCVzJy4uLiIpKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgcGVybWl0cyBHTlUgZ2V0dGV4dCB0byByZXBsYWNlIHRoZSBzdHJpbmcgQGNvZGV7IlByb2Nlc3NpbmcgZmlsZQotYCVzJy4uLiJ9IHdpdGggYSB0cmFuc2xhdGVkIHZlcnNpb24uCi0KLU9uY2UgYSBwcm9ncmFtIHVzZXMgZ2V0dGV4dCwgcGxlYXNlIG1ha2UgYSBwb2ludCBvZiB3cml0aW5nIGNhbGxzIHRvCi1AY29kZXtnZXR0ZXh0fSB3aGVuIHlvdSBhZGQgbmV3IHN0cmluZ3MgdGhhdCBjYWxsIGZvciB0cmFuc2xhdGlvbi4KLQotVXNpbmcgR05VIGdldHRleHQgaW4gYSBwYWNrYWdlIGludm9sdmVzIHNwZWNpZnlpbmcgYSBAZGZue3RleHQgZG9tYWluCi1uYW1lfSBmb3IgdGhlIHBhY2thZ2UuICBUaGUgdGV4dCBkb21haW4gbmFtZSBpcyB1c2VkIHRvIHNlcGFyYXRlIHRoZQotdHJhbnNsYXRpb25zIGZvciB0aGlzIHBhY2thZ2UgZnJvbSB0aGUgdHJhbnNsYXRpb25zIGZvciBvdGhlciBwYWNrYWdlcy4KLU5vcm1hbGx5LCB0aGUgdGV4dCBkb21haW4gbmFtZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlCi1wYWNrYWdlLS0tZm9yIGV4YW1wbGUsIEBzYW1we2ZpbGV1dGlsc30gZm9yIHRoZSBHTlUgZmlsZSB1dGlsaXRpZXMuCi0KLVRvIGVuYWJsZSBnZXR0ZXh0IHRvIHdvcmsgd2VsbCwgYXZvaWQgd3JpdGluZyBjb2RlIHRoYXQgbWFrZXMKLWFzc3VtcHRpb25zIGFib3V0IHRoZSBzdHJ1Y3R1cmUgb2Ygd29yZHMgb3Igc2VudGVuY2VzLiAgV2hlbiB5b3Ugd2FudAotdGhlIHByZWNpc2UgdGV4dCBvZiBhIHNlbnRlbmNlIHRvIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBkYXRhLCB1c2UgdHdvIG9yCi1tb3JlIGFsdGVybmF0aXZlIHN0cmluZyBjb25zdGFudHMgZWFjaCBjb250YWluaW5nIGEgY29tcGxldGUgc2VudGVuY2VzLAotcmF0aGVyIHRoYW4gaW5zZXJ0aW5nIGNvbmRpdGlvbmFsaXplZCB3b3JkcyBvciBwaHJhc2VzIGludG8gYSBzaW5nbGUKLXNlbnRlbmNlIGZyYW1ld29yay4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHdoYXQgbm90IHRvIGRvOgotCi1AZXhhbXBsZQotcHJpbnRmICgiJWQgZmlsZSVzIHByb2Nlc3NlZCIsIG5maWxlcywKLSAgICAgICAgbmZpbGVzICE9IDEgPyAicyIgOiAiIik7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgcHJvYmxlbSB3aXRoIHRoYXQgZXhhbXBsZSBpcyB0aGF0IGl0IGFzc3VtZXMgdGhhdCBwbHVyYWxzIGFyZSBtYWRlCi1ieSBhZGRpbmcgYHMnLiAgSWYgeW91IGFwcGx5IGdldHRleHQgdG8gdGhlIGZvcm1hdCBzdHJpbmcsIGxpa2UgdGhpcywKLQotQGV4YW1wbGUKLXByaW50ZiAoZ2V0dGV4dCAoIiVkIGZpbGUlcyBwcm9jZXNzZWQiKSwgbmZpbGVzLAotICAgICAgICBuZmlsZXMgIT0gMSA/ICJzIiA6ICIiKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXRoZSBtZXNzYWdlIGNhbiB1c2UgZGlmZmVyZW50IHdvcmRzLCBidXQgaXQgd2lsbCBzdGlsbCBiZSBmb3JjZWQgdG8gdXNlCi1gcycgZm9yIHRoZSBwbHVyYWwuICBIZXJlIGlzIGEgYmV0dGVyIHdheToKLQotQGV4YW1wbGUKLXByaW50ZiAoKG5maWxlcyAhPSAxID8gIiVkIGZpbGVzIHByb2Nlc3NlZCIKLSAgICAgICAgIDogIiVkIGZpbGUgcHJvY2Vzc2VkIiksCi0gICAgICAgIG5maWxlcyk7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGlzIHdheSwgeW91IGNhbiBhcHBseSBnZXR0ZXh0IHRvIGVhY2ggb2YgdGhlIHR3byBzdHJpbmdzCi1pbmRlcGVuZGVudGx5OgotCi1AZXhhbXBsZQotcHJpbnRmICgobmZpbGVzICE9IDEgPyBnZXR0ZXh0ICgiJWQgZmlsZXMgcHJvY2Vzc2VkIikKLSAgICAgICAgIDogZ2V0dGV4dCAoIiVkIGZpbGUgcHJvY2Vzc2VkIikpLAotICAgICAgICBuZmlsZXMpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBjYW4gYmUgYW55IG1ldGhvZCBvZiBmb3JtaW5nIHRoZSBwbHVyYWwgb2YgdGhlIHdvcmQgZm9yIGBgZmlsZScnLCBhbmQKLWFsc28gaGFuZGxlcyBsYW5ndWFnZXMgdGhhdCByZXF1aXJlIGFncmVlbWVudCBpbiB0aGUgd29yZCBmb3IKLWBgcHJvY2Vzc2VkJycuCi0KLUEgc2ltaWxhciBwcm9ibGVtIGFwcGVhcnMgYXQgdGhlIGxldmVsIG9mIHNlbnRlbmNlIHN0cnVjdHVyZSB3aXRoIHRoaXMKLWNvZGU6Ci0KLUBleGFtcGxlCi1wcmludGYgKCIjICBJbXBsaWNpdCBydWxlIHNlYXJjaCBoYXMlcyBiZWVuIGRvbmUuXG4iLAotICAgICAgICBmLT50cmllZF9pbXBsaWNpdCA/ICIiIDogIiBub3QiKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUFkZGluZyBAY29kZXtnZXR0ZXh0fSBjYWxscyB0byB0aGlzIGNvZGUgY2Fubm90IGdpdmUgY29ycmVjdCByZXN1bHRzIGZvcgotYWxsIGxhbmd1YWdlcywgYmVjYXVzZSBuZWdhdGlvbiBpbiBzb21lIGxhbmd1YWdlcyByZXF1aXJlcyBhZGRpbmcgd29yZHMKLWF0IG1vcmUgdGhhbiBvbmUgcGxhY2UgaW4gdGhlIHNlbnRlbmNlLiAgQnkgY29udHJhc3QsIGFkZGluZwotQGNvZGV7Z2V0dGV4dH0gY2FsbHMgZG9lcyB0aGUgam9iIHN0cmFpZ2h0Zm93YXJkbHkgaWYgdGhlIGNvZGUgc3RhcnRzCi1vdXQgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotcHJpbnRmIChmLT50cmllZF9pbXBsaWNpdAotICAgICAgICA/ICIjICBJbXBsaWNpdCBydWxlIHNlYXJjaCBoYXMgYmVlbiBkb25lLlxuIiwKLSAgICAgICAgOiAiIyAgSW1wbGljaXQgcnVsZSBzZWFyY2ggaGFzIG5vdCBiZWVuIGRvbmUuXG4iKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBNbWFwCi1Ac2VjdGlvbiBNbWFwCi0KLURvbid0IGFzc3VtZSB0aGF0IEBjb2Rle21tYXB9IGVpdGhlciB3b3JrcyBvbiBhbGwgZmlsZXMgb3IgZmFpbHMKLWZvciBhbGwgZmlsZXMuICBJdCBtYXkgd29yayBvbiBzb21lIGZpbGVzIGFuZCBmYWlsIG9uIG90aGVycy4KLQotVGhlIHByb3BlciB3YXkgdG8gdXNlIEBjb2Rle21tYXB9IGlzIHRvIHRyeSBpdCBvbiB0aGUgc3BlY2lmaWMgZmlsZSBmb3IKLXdoaWNoIHlvdSB3YW50IHRvIHVzZSBpdC0tLWFuZCBpZiBAY29kZXttbWFwfSBkb2Vzbid0IHdvcmssIGZhbGwgYmFjayBvbgotZG9pbmcgdGhlIGpvYiBpbiBhbm90aGVyIHdheSB1c2luZyBAY29kZXtyZWFkfSBhbmQgQGNvZGV7d3JpdGV9LgotCi1UaGUgcmVhc29uIHRoaXMgcHJlY2F1dGlvbiBpcyBuZWVkZWQgaXMgdGhhdCB0aGUgR05VIGtlcm5lbCAodGhlIEhVUkQpCi1wcm92aWRlcyBhIHVzZXItZXh0ZW5zaWJsZSBmaWxlIHN5c3RlbSwgaW4gd2hpY2ggdGhlcmUgY2FuIGJlIG1hbnkKLWRpZmZlcmVudCBraW5kcyBvZiBgYG9yZGluYXJ5IGZpbGVzLicnICBNYW55IG9mIHRoZW0gc3VwcG9ydAotQGNvZGV7bW1hcH0sIGJ1dCBzb21lIGRvIG5vdC4gIEl0IGlzIGltcG9ydGFudCB0byBtYWtlIHByb2dyYW1zIGhhbmRsZQotYWxsIHRoZXNlIGtpbmRzIG9mIGZpbGVzLgotCi1Abm9kZSBEb2N1bWVudGF0aW9uCi1AY2hhcHRlciBEb2N1bWVudGluZyBQcm9ncmFtcwotCi1AbWVudQotKiBHTlUgTWFudWFsczo6ICAgICAgICAgICAgICAgICBXcml0aW5nIHByb3BlciBtYW51YWxzLgotKiBNYW51YWwgU3RydWN0dXJlIERldGFpbHM6OiAgICBTcGVjaWZpYyBzdHJ1Y3R1cmUgY29udmVudGlvbnMuCi0qIE5FV1MgRmlsZTo6ICAgICAgICAgICAgICAgICAgIE5FV1MgZmlsZXMgc3VwcGxlbWVudCBtYW51YWxzLgotKiBDaGFuZ2UgTG9nczo6ICAgICAgICAgICAgICAgICBSZWNvcmRpbmcgQ2hhbmdlcwotKiBNYW4gUGFnZXM6OiAgICAgICAgICAgICAgICAgICBNYW4gcGFnZXMgYXJlIHNlY29uZGFyeS4KLSogUmVhZGluZyBvdGhlciBNYW51YWxzOjogICAgICAgSG93IGZhciB5b3UgY2FuIGdvIGluIGxlYXJuaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gb3RoZXIgbWFudWFscy4KLUBlbmQgbWVudQotCi1Abm9kZSBHTlUgTWFudWFscwotQHNlY3Rpb24gR05VIE1hbnVhbHMKLQotVGhlIHByZWZlcnJlZCB3YXkgdG8gZG9jdW1lbnQgcGFydCBvZiB0aGUgR05VIHN5c3RlbSBpcyB0byB3cml0ZSBhCi1tYW51YWwgaW4gdGhlIFRleGluZm8gZm9ybWF0dGluZyBsYW5ndWFnZS4gIFNlZSB0aGUgVGV4aW5mbyBtYW51YWwsCi1laXRoZXIgdGhlIGhhcmRjb3B5LCBvciB0aGUgb24tbGluZSB2ZXJzaW9uIGF2YWlsYWJsZSB0aHJvdWdoCi1AY29kZXtpbmZvfSBvciB0aGUgRW1hY3MgSW5mbyBzdWJzeXN0ZW0gKEBrYmR7Qy1oIGl9KS4KLQotUHJvZ3JhbW1lcnMgb2Z0ZW4gZmluZCBpdCBtb3N0IG5hdHVyYWwgdG8gc3RydWN0dXJlIHRoZSBkb2N1bWVudGF0aW9uCi1mb2xsb3dpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHdoaWNoIHRoZXkga25vdy4gIEJ1dAotdGhpcyBzdHJ1Y3R1cmUgaXMgbm90IG5lY2Vzc2FyaWx5IGdvb2QgZm9yIGV4cGxhaW5pbmcgaG93IHRvIHVzZSB0aGUKLXByb2dyYW07IGl0IG1heSBiZSBpcnJlbGV2YW50IGFuZCBjb25mdXNpbmcgZm9yIGEgdXNlci4KLQotQXQgZXZlcnkgbGV2ZWwsIGZyb20gdGhlIHNlbnRlbmNlcyBpbiBhIHBhcmFncmFwaCB0byB0aGUgZ3JvdXBpbmcgb2YKLXRvcGljcyBpbnRvIHNlcGFyYXRlIG1hbnVhbHMsIHRoZSByaWdodCB3YXkgdG8gc3RydWN0dXJlIGRvY3VtZW50YXRpb24KLWlzIGFjY29yZGluZyB0byB0aGUgY29uY2VwdHMgYW5kIHF1ZXN0aW9ucyB0aGF0IGEgdXNlciB3aWxsIGhhdmUgaW4gbWluZAotd2hlbiByZWFkaW5nIGl0LiAgU29tZXRpbWVzIHRoaXMgc3RydWN0dXJlIG9mIGlkZWFzIG1hdGNoZXMgdGhlCi1zdHJ1Y3R1cmUgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzb2Z0d2FyZSBiZWluZyBkb2N1bWVudGVkLS0tYnV0Ci1vZnRlbiB0aGV5IGFyZSBkaWZmZXJlbnQuICBPZnRlbiB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiBsZWFybmluZyB0bwotd3JpdGUgZ29vZCBkb2N1bWVudGF0aW9uIGlzIGxlYXJuaW5nIHRvIG5vdGljZSB3aGVuIHlvdSBhcmUgc3RydWN0dXJpbmcKLXRoZSBkb2N1bWVudGF0aW9uIGxpa2UgdGhlIGltcGxlbWVudGF0aW9uLCBhbmQgdGhpbmsgYWJvdXQgYmV0dGVyCi1hbHRlcm5hdGl2ZXMuCi0KLUZvciBleGFtcGxlLCBlYWNoIHByb2dyYW0gaW4gdGhlIEdOVSBzeXN0ZW0gcHJvYmFibHkgb3VnaHQgdG8gYmUKLWRvY3VtZW50ZWQgaW4gb25lIG1hbnVhbDsgYnV0IHRoaXMgZG9lcyBub3QgbWVhbiBlYWNoIHByb2dyYW0gc2hvdWxkCi1oYXZlIGl0cyBvd24gbWFudWFsLiAgVGhhdCB3b3VsZCBiZSBmb2xsb3dpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUKLWltcGxlbWVudGF0aW9uLCByYXRoZXIgdGhhbiB0aGUgc3RydWN0dXJlIHRoYXQgaGVscHMgdGhlIHVzZXIKLXVuZGVyc3RhbmQuCi0KLUluc3RlYWQsIGVhY2ggbWFudWFsIHNob3VsZCBjb3ZlciBhIGNvaGVyZW50IEBlbXBoe3RvcGljfS4gIEZvciBleGFtcGxlLAotaW5zdGVhZCBvZiBhIG1hbnVhbCBmb3IgQGNvZGV7ZGlmZn0gYW5kIGEgbWFudWFsIGZvciBAY29kZXtkaWZmM30sIHdlCi1oYXZlIG9uZSBtYW51YWwgZm9yIGBgY29tcGFyaXNvbiBvZiBmaWxlcycnIHdoaWNoIGNvdmVycyBib3RoIG9mIHRob3NlCi1wcm9ncmFtcywgYXMgd2VsbCBhcyBAY29kZXtjbXB9LiAgQnkgZG9jdW1lbnRpbmcgdGhlc2UgcHJvZ3JhbXMKLXRvZ2V0aGVyLCB3ZSBjYW4gbWFrZSB0aGUgd2hvbGUgc3ViamVjdCBjbGVhcmVyLgotCi1UaGUgbWFudWFsIHdoaWNoIGRpc2N1c3NlcyBhIHByb2dyYW0gc2hvdWxkIGRvY3VtZW50IGFsbCBvZiB0aGUKLXByb2dyYW0ncyBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgYWxsIG9mIGl0cyBjb21tYW5kcy4gIEl0IHNob3VsZCBnaXZlCi1leGFtcGxlcyBvZiB0aGVpciB1c2UuICBCdXQgZG9uJ3Qgb3JnYW5pemUgdGhlIG1hbnVhbCBhcyBhIGxpc3Qgb2YKLWZlYXR1cmVzLiAgSW5zdGVhZCwgb3JnYW5pemUgaXQgbG9naWNhbGx5LCBieSBzdWJ0b3BpY3MuICBBZGRyZXNzIHRoZQotcXVlc3Rpb25zIHRoYXQgYSB1c2VyIHdpbGwgYXNrIHdoZW4gdGhpbmtpbmcgYWJvdXQgdGhlIGpvYiB0aGF0IHRoZQotcHJvZ3JhbSBkb2VzLgotCi1JbiBnZW5lcmFsLCBhIEdOVSBtYW51YWwgc2hvdWxkIHNlcnZlIGJvdGggYXMgdHV0b3JpYWwgYW5kIHJlZmVyZW5jZS4KLUl0IHNob3VsZCBiZSBzZXQgdXAgZm9yIGNvbnZlbmllbnQgYWNjZXNzIHRvIGVhY2ggdG9waWMgdGhyb3VnaCBJbmZvLAotYW5kIGZvciByZWFkaW5nIHN0cmFpZ2h0IHRocm91Z2ggKGFwcGVuZGl4ZXMgYXNpZGUpLiAgQSBHTlUgbWFudWFsCi1zaG91bGQgZ2l2ZSBhIGdvb2QgaW50cm9kdWN0aW9uIHRvIGEgYmVnaW5uZXIgcmVhZGluZyB0aHJvdWdoIGZyb20gdGhlCi1zdGFydCwgYW5kIHNob3VsZCBhbHNvIHByb3ZpZGUgYWxsIHRoZSBkZXRhaWxzIHRoYXQgaGFja2VycyB3YW50LgotCi1UaGF0IGlzIG5vdCBhcyBoYXJkIGFzIGl0IGZpcnN0IHNvdW5kcy4gIEFycmFuZ2UgZWFjaCBjaGFwdGVyIGFzIGEKLWxvZ2ljYWwgYnJlYWtkb3duIG9mIGl0cyB0b3BpYywgYnV0IG9yZGVyIHRoZSBzZWN0aW9ucywgYW5kIHdyaXRlIHRoZWlyCi10ZXh0LCBzbyB0aGF0IHJlYWRpbmcgdGhlIGNoYXB0ZXIgc3RyYWlnaHQgdGhyb3VnaCBtYWtlcyBzZW5zZS4gIERvCi1saWtld2lzZSB3aGVuIHN0cnVjdHVyaW5nIHRoZSBib29rIGludG8gY2hhcHRlcnMsIGFuZCB3aGVuIHN0cnVjdHVyaW5nIGEKLXNlY3Rpb24gaW50byBwYXJhZ3JhcGhzLiAgVGhlIHdhdGNod29yZCBpcywgQGVtcGh7YXQgZWFjaCBwb2ludCwgYWRkcmVzcwotdGhlIG1vc3QgZnVuZGFtZW50YWwgYW5kIGltcG9ydGFudCBpc3N1ZSByYWlzZWQgYnkgdGhlIHByZWNlZGluZyB0ZXh0Ln0KLQotSWYgbmVjZXNzYXJ5LCBhZGQgZXh0cmEgY2hhcHRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFudWFsIHdoaWNoCi1hcmUgcHVyZWx5IHR1dG9yaWFsIGFuZCBjb3ZlciB0aGUgYmFzaWNzIG9mIHRoZSBzdWJqZWN0LiAgVGhlc2UgcHJvdmlkZQotdGhlIGZyYW1ld29yayBmb3IgYSBiZWdpbm5lciB0byB1bmRlcnN0YW5kIHRoZSByZXN0IG9mIHRoZSBtYW51YWwuICBUaGUKLUJpc29uIG1hbnVhbCBwcm92aWRlcyBhIGdvb2QgZXhhbXBsZSBvZiBob3cgdG8gZG8gdGhpcy4KLQotRG9uJ3QgdXNlIFVuaXggbWFuIHBhZ2VzIGFzIGEgbW9kZWwgZm9yIGhvdyB0byB3cml0ZSBHTlUgZG9jdW1lbnRhdGlvbjsKLW1vc3Qgb2YgdGhlbSBhcmUgdGVyc2UsIGJhZGx5IHN0cnVjdHVyZWQsIGFuZCBnaXZlIGluYWRlcXVhdGUKLWV4cGxhbmF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGNvbmNlcHRzLiAgKFRoZXJlIGFyZSwgb2YgY291cnNlCi1leGNlcHRpb25zLikgIEFsc28gVW5peCBtYW4gcGFnZXMgdXNlIGEgcGFydGljdWxhciBmb3JtYXQgd2hpY2ggaXMKLWRpZmZlcmVudCBmcm9tIHdoYXQgd2UgdXNlIGluIEdOVSBtYW51YWxzLgotCi1QbGVhc2UgZG8gbm90IHVzZSB0aGUgdGVybSBgYHBhdGhuYW1lJycgdGhhdCBpcyB1c2VkIGluIFVuaXgKLWRvY3VtZW50YXRpb247IHVzZSBgYGZpbGUgbmFtZScnICh0d28gd29yZHMpIGluc3RlYWQuICBXZSB1c2UgdGhlIHRlcm0KLWBgcGF0aCcnIG9ubHkgZm9yIHNlYXJjaCBwYXRocywgd2hpY2ggYXJlIGxpc3RzIG9mIGZpbGUgbmFtZXMuCi0KLVBsZWFzZSBkbyBub3QgdXNlIHRoZSB0ZXJtIGBgaWxsZWdhbCcnIHRvIHJlZmVyIHRvIGVycm9uZW91cyBpbnB1dCB0byBhCi1jb21wdXRlciBwcm9ncmFtLiAgUGxlYXNlIHVzZSBgYGludmFsaWQnJyBmb3IgdGhpcywgYW5kIHJlc2VydmUgdGhlIHRlcm0KLWBgaWxsZWdhbCcnIGZvciB2aW9sYXRpb25zIG9mIGxhdy4KLQotQG5vZGUgTWFudWFsIFN0cnVjdHVyZSBEZXRhaWxzCi1Ac2VjdGlvbiBNYW51YWwgU3RydWN0dXJlIERldGFpbHMKLQotVGhlIHRpdGxlIHBhZ2Ugb2YgdGhlIG1hbnVhbCBzaG91bGQgc3RhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHByb2dyYW1zIG9yCi1wYWNrYWdlcyBkb2N1bWVudGVkIGluIHRoZSBtYW51YWwuICBUaGUgVG9wIG5vZGUgb2YgdGhlIG1hbnVhbCBzaG91bGQKLWFsc28gY29udGFpbiB0aGlzIGluZm9ybWF0aW9uLiAgSWYgdGhlIG1hbnVhbCBpcyBjaGFuZ2luZyBtb3JlCi1mcmVxdWVudGx5IHRoYW4gb3IgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2dyYW0sIGFsc28gc3RhdGUgYSB2ZXJzaW9uCi1udW1iZXIgZm9yIHRoZSBtYW51YWwgaW4gYm90aCBvZiB0aGVzZSBwbGFjZXMuCi0KLUVhY2ggcHJvZ3JhbSBkb2N1bWVudGVkIGluIHRoZSBtYW51YWwgc2hvdWxkIHNob3VsZCBoYXZlIGEgbm9kZSBuYW1lZAotQHNhbXB7QHZhcntwcm9ncmFtfSBJbnZvY2F0aW9ufSBvciBAc2FtcHtJbnZva2luZyBAdmFye3Byb2dyYW19fS4gIFRoaXMKLW5vZGUgKHRvZ2V0aGVyIHdpdGggaXRzIHN1Ym5vZGVzLCBpZiBhbnkpIHNob3VsZCBkZXNjcmliZSB0aGUgcHJvZ3JhbSdzCi1jb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBob3cgdG8gcnVuIGl0ICh0aGUgc29ydCBvZiBpbmZvcm1hdGlvbiBwZW9wbGUKLXdvdWxkIGxvb2sgaW4gYSBtYW4gcGFnZSBmb3IpLiAgU3RhcnQgd2l0aCBhbiBAc2FtcHtAQGV4YW1wbGV9Ci1jb250YWluaW5nIGEgdGVtcGxhdGUgZm9yIGFsbCB0aGUgb3B0aW9ucyBhbmQgYXJndW1lbnRzIHRoYXQgdGhlIHByb2dyYW0KLXVzZXMuCi0KLUFsdGVybmF0aXZlbHksIHB1dCBhIG1lbnUgaXRlbSBpbiBzb21lIG1lbnUgd2hvc2UgaXRlbSBuYW1lIGZpdHMgb25lIG9mCi10aGUgYWJvdmUgcGF0dGVybnMuICBUaGlzIGlkZW50aWZpZXMgdGhlIG5vZGUgd2hpY2ggdGhhdCBpdGVtIHBvaW50cyB0bwotYXMgdGhlIG5vZGUgZm9yIHRoaXMgcHVycG9zZSwgcmVnYXJkbGVzcyBvZiB0aGUgbm9kZSdzIGFjdHVhbCBuYW1lLgotCi1UaGVyZSB3aWxsIGJlIGF1dG9tYXRpYyBmZWF0dXJlcyBmb3Igc3BlY2lmeWluZyBhIHByb2dyYW0gbmFtZSBhbmQKLXF1aWNrbHkgcmVhZGluZyBqdXN0IHRoaXMgcGFydCBvZiBpdHMgbWFudWFsLgotCi1JZiBvbmUgbWFudWFsIGRlc2NyaWJlcyBzZXZlcmFsIHByb2dyYW1zLCBpdCBzaG91bGQgaGF2ZSBzdWNoIGEgbm9kZSBmb3IKLWVhY2ggcHJvZ3JhbSBkZXNjcmliZWQuCi0KLUBub2RlIE5FV1MgRmlsZQotQHNlY3Rpb24gVGhlIE5FV1MgRmlsZQotCi1JbiBhZGRpdGlvbiB0byBpdHMgbWFudWFsLCB0aGUgcGFja2FnZSBzaG91bGQgaGF2ZSBhIGZpbGUgbmFtZWQKLUBmaWxle05FV1N9IHdoaWNoIGNvbnRhaW5zIGEgbGlzdCBvZiB1c2VyLXZpc2libGUgY2hhbmdlcyB3b3J0aAotbWVudGlvbmluZy4gIEluIGVhY2ggbmV3IHJlbGVhc2UsIGFkZCBpdGVtcyB0byB0aGUgZnJvbnQgb2YgdGhlIGZpbGUgYW5kCi1pZGVudGlmeSB0aGUgdmVyc2lvbiB0aGV5IHBlcnRhaW4gdG8uICBEb24ndCBkaXNjYXJkIG9sZCBpdGVtczsgbGVhdmUKLXRoZW0gaW4gdGhlIGZpbGUgYWZ0ZXIgdGhlIG5ld2VyIGl0ZW1zLiAgVGhpcyB3YXksIGEgdXNlciB1cGdyYWRpbmcgZnJvbQotYW55IHByZXZpb3VzIHZlcnNpb24gY2FuIHNlZSB3aGF0IGlzIG5ldy4KLQotSWYgdGhlIEBmaWxle05FV1N9IGZpbGUgZ2V0cyB2ZXJ5IGxvbmcsIG1vdmUgc29tZSBvZiB0aGUgb2xkZXIgaXRlbXMKLWludG8gYSBmaWxlIG5hbWVkIEBmaWxle09ORVdTfSBhbmQgcHV0IGEgbm90ZSBhdCB0aGUgZW5kIHJlZmVycmluZyB0aGUKLXVzZXIgdG8gdGhhdCBmaWxlLgotCi1Abm9kZSBDaGFuZ2UgTG9ncwotQHNlY3Rpb24gQ2hhbmdlIExvZ3MKLQotS2VlcCBhIGNoYW5nZSBsb2cgdG8gZGVzY3JpYmUgYWxsIHRoZSBjaGFuZ2VzIG1hZGUgdG8gcHJvZ3JhbSBzb3VyY2UKLWZpbGVzLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyBzbyB0aGF0IHBlb3BsZSBpbnZlc3RpZ2F0aW5nIGJ1Z3MgaW4gdGhlCi1mdXR1cmUgd2lsbCBrbm93IGFib3V0IHRoZSBjaGFuZ2VzIHRoYXQgbWlnaHQgaGF2ZSBpbnRyb2R1Y2VkIHRoZSBidWcuCi1PZnRlbiBhIG5ldyBidWcgY2FuIGJlIGZvdW5kIGJ5IGxvb2tpbmcgYXQgd2hhdCB3YXMgcmVjZW50bHkgY2hhbmdlZC4KLU1vcmUgaW1wb3J0YW50bHksIGNoYW5nZSBsb2dzIGNhbiBoZWxwIHlvdSBlbGltaW5hdGUgY29uY2VwdHVhbAotaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gZGlmZmVyZW50IHBhcnRzIG9mIGEgcHJvZ3JhbSwgYnkgZ2l2aW5nIHlvdSBhCi1oaXN0b3J5IG9mIGhvdyB0aGUgY29uZmxpY3RpbmcgY29uY2VwdHMgYXJvc2UgYW5kIHdobyB0aGV5IGNhbWUgZnJvbS4KLQotQG1lbnUKLSogQ2hhbmdlIExvZyBDb25jZXB0czo6ICAgICAgICAgCi0qIFN0eWxlIG9mIENoYW5nZSBMb2dzOjogICAgICAgIAotKiBTaW1wbGUgQ2hhbmdlczo6ICAgICAgICAgICAgICAKLSogQ29uZGl0aW9uYWwgQ2hhbmdlczo6ICAgICAgICAgCi1AZW5kIG1lbnUKLQotQG5vZGUgQ2hhbmdlIExvZyBDb25jZXB0cwotQHN1YnNlY3Rpb24gQ2hhbmdlIExvZyBDb25jZXB0cwotCi1Zb3UgY2FuIHRoaW5rIG9mIHRoZSBjaGFuZ2UgbG9nIGFzIGEgY29uY2VwdHVhbCBgYHVuZG8gbGlzdCcnIHdoaWNoCi1leHBsYWlucyBob3cgZWFybGllciB2ZXJzaW9ucyB3ZXJlIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHZlcnNpb24uCi1QZW9wbGUgY2FuIHNlZSB0aGUgY3VycmVudCB2ZXJzaW9uOyB0aGV5IGRvbid0IG5lZWQgdGhlIGNoYW5nZSBsb2cKLXRvIHRlbGwgdGhlbSB3aGF0IGlzIGluIGl0LiAgV2hhdCB0aGV5IHdhbnQgZnJvbSBhIGNoYW5nZSBsb2cgaXMgYQotY2xlYXIgZXhwbGFuYXRpb24gb2YgaG93IHRoZSBlYXJsaWVyIHZlcnNpb24gZGlmZmVyZWQuCi0KLVRoZSBjaGFuZ2UgbG9nIGZpbGUgaXMgbm9ybWFsbHkgY2FsbGVkIEBmaWxle0NoYW5nZUxvZ30gYW5kIGNvdmVycyBhbgotZW50aXJlIGRpcmVjdG9yeS4gIEVhY2ggZGlyZWN0b3J5IGNhbiBoYXZlIGl0cyBvd24gY2hhbmdlIGxvZywgb3IgYQotZGlyZWN0b3J5IGNhbiB1c2UgdGhlIGNoYW5nZSBsb2cgb2YgaXRzIHBhcmVudCBkaXJlY3RvcnktLWl0J3MgdXAgdG8KLXlvdS4KLQotQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyB0byByZWNvcmQgY2hhbmdlIGxvZyBpbmZvcm1hdGlvbiB3aXRoIGEgdmVyc2lvbgotY29udHJvbCBzeXN0ZW0gc3VjaCBhcyBSQ1Mgb3IgQ1ZTLiAgVGhpcyBjYW4gYmUgY29udmVydGVkIGF1dG9tYXRpY2FsbHkKLXRvIGEgQGZpbGV7Q2hhbmdlTG9nfSBmaWxlLgotCi1UaGVyZSdzIG5vIG5lZWQgdG8gZGVzY3JpYmUgdGhlIGZ1bGwgcHVycG9zZSBvZiB0aGUgY2hhbmdlcyBvciBob3cgdGhleQotd29yayB0b2dldGhlci4gIElmIHlvdSB0aGluayB0aGF0IGEgY2hhbmdlIGNhbGxzIGZvciBleHBsYW5hdGlvbiwgeW91J3JlCi1wcm9iYWJseSByaWdodC4gIFBsZWFzZSBkbyBleHBsYWluIGl0LS0tYnV0IHBsZWFzZSBwdXQgdGhlIGV4cGxhbmF0aW9uCi1pbiBjb21tZW50cyBpbiB0aGUgY29kZSwgd2hlcmUgcGVvcGxlIHdpbGwgc2VlIGl0IHdoZW5ldmVyIHRoZXkgc2VlIHRoZQotY29kZS4gIEZvciBleGFtcGxlLCBgYE5ldyBmdW5jdGlvbicnIGlzIGVub3VnaCBmb3IgdGhlIGNoYW5nZSBsb2cgd2hlbgoteW91IGFkZCBhIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBhIGNvbW1lbnQgYmVmb3JlIHRoZQotZnVuY3Rpb24gZGVmaW5pdGlvbiB0byBleHBsYWluIHdoYXQgaXQgZG9lcy4KLQotSG93ZXZlciwgc29tZXRpbWVzIGl0IGlzIHVzZWZ1bCB0byB3cml0ZSBvbmUgbGluZSB0byBkZXNjcmliZSB0aGUKLW92ZXJhbGwgcHVycG9zZSBvZiBhIGJhdGNoIG9mIGNoYW5nZXMuCi0KLVRoZSBlYXNpZXN0IHdheSB0byBhZGQgYW4gZW50cnkgdG8gQGZpbGV7Q2hhbmdlTG9nfSBpcyB3aXRoIHRoZSBFbWFjcwotY29tbWFuZCBAa2Jke00teCBhZGQtY2hhbmdlLWxvZy1lbnRyeX0uICBBbiBlbnRyeSBzaG91bGQgaGF2ZSBhbgotYXN0ZXJpc2ssIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIGZpbGUsIGFuZCB0aGVuIGluIHBhcmVudGhlc2VzIHRoZSBuYW1lCi1vZiB0aGUgY2hhbmdlZCBmdW5jdGlvbnMsIHZhcmlhYmxlcyBvciB3aGF0ZXZlciwgZm9sbG93ZWQgYnkgYSBjb2xvbi4KLVRoZW4gZGVzY3JpYmUgdGhlIGNoYW5nZXMgeW91IG1hZGUgdG8gdGhhdCBmdW5jdGlvbiBvciB2YXJpYWJsZS4KLQotQG5vZGUgU3R5bGUgb2YgQ2hhbmdlIExvZ3MKLUBzdWJzZWN0aW9uIFN0eWxlIG9mIENoYW5nZSBMb2dzCi0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgY2hhbmdlIGxvZyBlbnRyaWVzOgotCi1AZXhhbXBsZQotKiByZWdpc3Rlci5lbCAoaW5zZXJ0LXJlZ2lzdGVyKTogUmV0dXJuIG5pbC4KLShqdW1wLXRvLXJlZ2lzdGVyKTogTGlrZXdpc2UuCi0KLSogc29ydC5lbCAoc29ydC1zdWJyKTogUmV0dXJuIG5pbC4KLQotKiB0ZXgtbW9kZS5lbCAodGV4LWJpYnRleC1maWxlLCB0ZXgtZmlsZSwgdGV4LXJlZ2lvbik6Ci1SZXN0YXJ0IHRoZSB0ZXggc2hlbGwgaWYgcHJvY2VzcyBpcyBnb25lIG9yIHN0b3BwZWQuCi0odGV4LXNoZWxsLXJ1bm5pbmcpOiBOZXcgZnVuY3Rpb24uCi0KLSogZXhwci5jIChzdG9yZV9vbmVfYXJnKTogUm91bmQgc2l6ZSB1cCBmb3IgbW92ZV9ibG9ja190b19yZWcuCi0oZXhwYW5kX2NhbGwpOiBSb3VuZCB1cCB3aGVuIGVtaXR0aW5nIFVTRSBpbnNucy4KLSogc3RtdC5jIChhc3NpZ25fcGFybXMpOiBSb3VuZCBzaXplIHVwIGZvciBtb3ZlX2Jsb2NrX2Zyb21fcmVnLgotQGVuZCBleGFtcGxlCi0KLUl0J3MgaW1wb3J0YW50IHRvIG5hbWUgdGhlIGNoYW5nZWQgZnVuY3Rpb24gb3IgdmFyaWFibGUgaW4gZnVsbC4gIERvbid0Ci1hYmJyZXZpYXRlIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG5hbWVzLCBhbmQgZG9uJ3QgY29tYmluZSB0aGVtLgotU3Vic2VxdWVudCBtYWludGFpbmVycyB3aWxsIG9mdGVuIHNlYXJjaCBmb3IgYSBmdW5jdGlvbiBuYW1lIHRvIGZpbmQgYWxsCi10aGUgY2hhbmdlIGxvZyBlbnRyaWVzIHRoYXQgcGVydGFpbiB0byBpdDsgaWYgeW91IGFiYnJldmlhdGUgdGhlIG5hbWUsCi10aGV5IHdvbid0IGZpbmQgaXQgd2hlbiB0aGV5IHNlYXJjaC4KLQotRm9yIGV4YW1wbGUsIHNvbWUgcGVvcGxlIGFyZSB0ZW1wdGVkIHRvIGFiYnJldmlhdGUgZ3JvdXBzIG9mIGZ1bmN0aW9uCi1uYW1lcyBieSB3cml0aW5nIEBzYW1weyogcmVnaXN0ZXIuZWwgKEB7aW5zZXJ0LGp1bXAtdG9AfS1yZWdpc3Rlcil9OwotdGhpcyBpcyBub3QgYSBnb29kIGlkZWEsIHNpbmNlIHNlYXJjaGluZyBmb3IgQGNvZGV7anVtcC10by1yZWdpc3Rlcn0gb3IKLUBjb2Rle2luc2VydC1yZWdpc3Rlcn0gd291bGQgbm90IGZpbmQgdGhhdCBlbnRyeS4KLQotU2VwYXJhdGUgdW5yZWxhdGVkIGNoYW5nZSBsb2cgZW50cmllcyB3aXRoIGJsYW5rIGxpbmVzLiAgV2hlbiB0d28KLWVudHJpZXMgcmVwcmVzZW50IHBhcnRzIG9mIHRoZSBzYW1lIGNoYW5nZSwgc28gdGhhdCB0aGV5IHdvcmsgdG9nZXRoZXIsCi10aGVuIGRvbid0IHB1dCBibGFuayBsaW5lcyBiZXR3ZWVuIHRoZW0uICBUaGVuIHlvdSBjYW4gb21pdCB0aGUgZmlsZQotbmFtZSBhbmQgdGhlIGFzdGVyaXNrIHdoZW4gc3VjY2Vzc2l2ZSBlbnRyaWVzIGFyZSBpbiB0aGUgc2FtZSBmaWxlLgotCi1Abm9kZSBTaW1wbGUgQ2hhbmdlcwotQHN1YnNlY3Rpb24gU2ltcGxlIENoYW5nZXMKLQotQ2VydGFpbiBzaW1wbGUga2luZHMgb2YgY2hhbmdlcyBkb24ndCBuZWVkIG11Y2ggZGV0YWlsIGluIHRoZSBjaGFuZ2UKLWxvZy4KLQotV2hlbiB5b3UgY2hhbmdlIHRoZSBjYWxsaW5nIHNlcXVlbmNlIG9mIGEgZnVuY3Rpb24gaW4gYSBzaW1wbGUgZmFzaGlvbiwKLWFuZCB5b3UgY2hhbmdlIGFsbCB0aGUgY2FsbGVycyBvZiB0aGUgZnVuY3Rpb24sIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFrZQotaW5kaXZpZHVhbCBlbnRyaWVzIGZvciBhbGwgdGhlIGNhbGxlcnMgdGhhdCB5b3UgY2hhbmdlZC4gIEp1c3Qgd3JpdGUgaW4KLXRoZSBlbnRyeSBmb3IgdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCwgYGBBbGwgY2FsbGVycyBjaGFuZ2VkLicnCi0KLUBleGFtcGxlCi0qIGtleWJvYXJkLmMgKEZjb21tYW5kX2V4ZWN1dGUpOiBOZXcgYXJnIFNQRUNJQUwuCi1BbGwgY2FsbGVycyBjaGFuZ2VkLgotQGVuZCBleGFtcGxlCi0KLVdoZW4geW91IGNoYW5nZSBqdXN0IGNvbW1lbnRzIG9yIGRvYyBzdHJpbmdzLCBpdCBpcyBlbm91Z2ggdG8gd3JpdGUgYW4KLWVudHJ5IGZvciB0aGUgZmlsZSwgd2l0aG91dCBtZW50aW9uaW5nIHRoZSBmdW5jdGlvbnMuICBKdXN0IGBgRG9jCi1maXhlcycnIGlzIGVub3VnaCBmb3IgdGhlIGNoYW5nZSBsb2cuCi0KLVRoZXJlJ3Mgbm8gbmVlZCB0byBtYWtlIGNoYW5nZSBsb2cgZW50cmllcyBmb3IgZG9jdW1lbnRhdGlvbiBmaWxlcy4KLVRoaXMgaXMgYmVjYXVzZSBkb2N1bWVudGF0aW9uIGlzIG5vdCBzdXNjZXB0aWJsZSB0byBidWdzIHRoYXQgYXJlIGhhcmQKLXRvIGZpeC4gIERvY3VtZW50YXRpb24gZG9lcyBub3QgY29uc2lzdCBvZiBwYXJ0cyB0aGF0IG11c3QgaW50ZXJhY3QgaW4gYQotcHJlY2lzZWx5IGVuZ2luZWVyZWQgZmFzaGlvbi4gIFRvIGNvcnJlY3QgYW4gZXJyb3IsIHlvdSBuZWVkIG5vdCBrbm93Ci10aGUgaGlzdG9yeSBvZiB0aGUgZXJyb25lb3VzIHBhc3NhZ2U7IGl0IGlzIGVub3VnaCB0byBjb21wYXJlIHdoYXQgdGhlCi1kb2N1bWVudGF0aW9uIHNheXMgd2l0aCB0aGUgd2F5IHRoZSBwcm9ncmFtIGFjdHVhbGx5IHdvcmtzLgotCi1Abm9kZSBDb25kaXRpb25hbCBDaGFuZ2VzCi1Ac3Vic2VjdGlvbiBDb25kaXRpb25hbCBDaGFuZ2VzCi0KLUMgcHJvZ3JhbXMgb2Z0ZW4gY29udGFpbiBjb21waWxlLXRpbWUgQGNvZGV7I2lmfSBjb25kaXRpb25hbHMuICBNYW55Ci1jaGFuZ2VzIGFyZSBjb25kaXRpb25hbDsgc29tZXRpbWVzIHlvdSBhZGQgYSBuZXcgZGVmaW5pdGlvbiB3aGljaCBpcwotZW50aXJlbHkgY29udGFpbmVkIGluIGEgY29uZGl0aW9uYWwuICBJdCBpcyB2ZXJ5IHVzZWZ1bCB0byBpbmRpY2F0ZSBpbgotdGhlIGNoYW5nZSBsb2cgdGhlIGNvbmRpdGlvbnMgZm9yIHdoaWNoIHRoZSBjaGFuZ2UgYXBwbGllcy4KLQotT3VyIGNvbnZlbnRpb24gZm9yIGluZGljYXRpbmcgY29uZGl0aW9uYWwgY2hhbmdlcyBpcyB0byB1c2Ugc3F1YXJlCi1icmFja2V0cyBhcm91bmQgdGhlIG5hbWUgb2YgdGhlIGNvbmRpdGlvbi4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlLCBkZXNjcmliaW5nIGEgY2hhbmdlIHdoaWNoIGlzIGNvbmRpdGlvbmFsIGJ1dAotZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIG9yIGVudGl0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdDoKLQotQGV4YW1wbGUKLSogeHRlcm0uYyBbU09MQVJJUzJdOiBJbmNsdWRlIHN0cmluZy5oLgotQGVuZCBleGFtcGxlCi0KLUhlcmUgaXMgYW4gZW50cnkgZGVzY3JpYmluZyBhIG5ldyBkZWZpbml0aW9uIHdoaWNoIGlzIGVudGlyZWx5Ci1jb25kaXRpb25hbC4gIFRoaXMgbmV3IGRlZmluaXRpb24gZm9yIHRoZSBtYWNybyBAY29kZXtGUkFNRV9XSU5ET1dfUH0gaXMKLXVzZWQgb25seSB3aGVuIEBjb2Rle0hBVkVfWF9XSU5ET1dTfSBpcyBkZWZpbmVkOgotCi1AZXhhbXBsZQotKiBmcmFtZS5oIFtIQVZFX1hfV0lORE9XU10gKEZSQU1FX1dJTkRPV19QKTogTWFjcm8gZGVmaW5lZC4KLUBlbmQgZXhhbXBsZQotCi1IZXJlIGlzIGFuIGVudHJ5IGZvciBhIGNoYW5nZSB3aXRoaW4gdGhlIGZ1bmN0aW9uIEBjb2Rle2luaXRfZGlzcGxheX0sCi13aG9zZSBkZWZpbml0aW9uIGFzIGEgd2hvbGUgaXMgdW5jb25kaXRpb25hbCwgYnV0IHRoZSBjaGFuZ2VzIHRoZW1zZWx2ZXMKLWFyZSBjb250YWluZWQgaW4gYSBAc2FtcHsjaWZkZWYgSEFWRV9MSUJOQ1VSU0VTfSBjb25kaXRpb25hbDoKLQotQGV4YW1wbGUKLSogZGlzcG5ldy5jIChpbml0X2Rpc3BsYXkpIFtIQVZFX0xJQk5DVVJTRVNdOiBJZiBYLCBjYWxsIHRnZXRlbnQuCi1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyBhbiBlbnRyeSBmb3IgYSBjaGFuZ2UgdGhhdCB0YWtlcyBhZmZlY3Qgb25seSB3aGVuCi1hIGNlcnRhaW4gbWFjcm8gaXMgQGVtcGh7bm90fSBkZWZpbmVkOgotCi1AZXhhbXBsZQotKGdldGhvc3RuYW1lKSBbIUhBVkVfU09DS0VUU106IFJlcGxhY2Ugd2l0aCB3aW5zb2NrIHZlcnNpb24uCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgTWFuIFBhZ2VzCi1Ac2VjdGlvbiBNYW4gUGFnZXMKLQotSW4gdGhlIEdOVSBwcm9qZWN0LCBtYW4gcGFnZXMgYXJlIHNlY29uZGFyeS4gIEl0IGlzIG5vdCBuZWNlc3Nhcnkgb3IKLWV4cGVjdGVkIGZvciBldmVyeSBHTlUgcHJvZ3JhbSB0byBoYXZlIGEgbWFuIHBhZ2UsIGJ1dCBzb21lIG9mIHRoZW0gZG8uCi1JdCdzIHlvdXIgY2hvaWNlIHdoZXRoZXIgdG8gaW5jbHVkZSBhIG1hbiBwYWdlIGluIHlvdXIgcHJvZ3JhbS4KLQotV2hlbiB5b3UgbWFrZSB0aGlzIGRlY2lzaW9uLCBjb25zaWRlciB0aGF0IHN1cHBvcnRpbmcgYSBtYW4gcGFnZQotcmVxdWlyZXMgY29udGludWFsIGVmZm9ydCBlYWNoIHRpbWUgdGhlIHByb2dyYW0gaXMgY2hhbmdlZC4gIFRoZSB0aW1lCi15b3Ugc3BlbmQgb24gdGhlIG1hbiBwYWdlIGlzIHRpbWUgdGFrZW4gYXdheSBmcm9tIG1vcmUgdXNlZnVsIHdvcmsuCi0KLUZvciBhIHNpbXBsZSBwcm9ncmFtIHdoaWNoIGNoYW5nZXMgbGl0dGxlLCB1cGRhdGluZyB0aGUgbWFuIHBhZ2UgbWF5IGJlCi1hIHNtYWxsIGpvYi4gIFRoZW4gdGhlcmUgaXMgbGl0dGxlIHJlYXNvbiBub3QgdG8gaW5jbHVkZSBhIG1hbiBwYWdlLCBpZgoteW91IGhhdmUgb25lLgotCi1Gb3IgYSBsYXJnZSBwcm9ncmFtIHRoYXQgY2hhbmdlcyBhIGdyZWF0IGRlYWwsIHVwZGF0aW5nIGEgbWFuIHBhZ2UgbWF5Ci1iZSBhIHN1YnN0YW50aWFsIGJ1cmRlbi4gIElmIGEgdXNlciBvZmZlcnMgdG8gZG9uYXRlIGEgbWFuIHBhZ2UsIHlvdSBtYXkKLWZpbmQgdGhpcyBnaWZ0IGNvc3RseSB0byBhY2NlcHQuICBJdCBtYXkgYmUgYmV0dGVyIHRvIHJlZnVzZSB0aGUgbWFuCi1wYWdlIHVubGVzcyB0aGUgc2FtZSBwZXJzb24gYWdyZWVzIHRvIHRha2UgZnVsbCByZXNwb25zaWJpbGl0eSBmb3IKLW1haW50YWluaW5nIGl0LS0tc28gdGhhdCB5b3UgY2FuIHdhc2ggeW91ciBoYW5kcyBvZiBpdCBlbnRpcmVseS4gIElmCi10aGlzIHZvbHVudGVlciBsYXRlciBjZWFzZXMgdG8gZG8gdGhlIGpvYiwgdGhlbiBkb24ndCBmZWVsIG9ibGlnZWQgdG8KLXBpY2sgaXQgdXAgeW91cnNlbGY7IGl0IG1heSBiZSBiZXR0ZXIgdG8gd2l0aGRyYXcgdGhlIG1hbiBwYWdlIGZyb20gdGhlCi1kaXN0cmlidXRpb24gdW50aWwgc29tZW9uZSBlbHNlIGFncmVlcyB0byB1cGRhdGUgaXQuCi0KLVdoZW4gYSBwcm9ncmFtIGNoYW5nZXMgb25seSBhIGxpdHRsZSwgeW91IG1heSBmZWVsIHRoYXQgdGhlCi1kaXNjcmVwYW5jaWVzIGFyZSBzbWFsbCBlbm91Z2ggdGhhdCB0aGUgbWFuIHBhZ2UgcmVtYWlucyB1c2VmdWwgd2l0aG91dAotdXBkYXRpbmcuICBJZiBzbywgcHV0IGEgcHJvbWluZW50IG5vdGUgbmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYW4KLXBhZ2UgZXhwbGFpbmluZyB0aGF0IHlvdSBkb24ndCBtYWludGFpbiBpdCBhbmQgdGhhdCB0aGUgVGV4aW5mbyBtYW51YWwKLWlzIG1vcmUgYXV0aG9yaXRhdGl2ZS4gIFRoZSBub3RlIHNob3VsZCBzYXkgaG93IHRvIGFjY2VzcyB0aGUgVGV4aW5mbwotZG9jdW1lbnRhdGlvbi4KLQotQG5vZGUgUmVhZGluZyBvdGhlciBNYW51YWxzCi1Ac2VjdGlvbiBSZWFkaW5nIG90aGVyIE1hbnVhbHMKLQotVGhlcmUgbWF5IGJlIG5vbi1mcmVlIGJvb2tzIG9yIGRvY3VtZW50YXRpb24gZmlsZXMgdGhhdCBkZXNjcmliZSB0aGUKLXByb2dyYW0geW91IGFyZSBkb2N1bWVudGluZy4KLQotSXQgaXMgb2sgdG8gdXNlIHRoZXNlIGRvY3VtZW50cyBmb3IgcmVmZXJlbmNlLCBqdXN0IGFzIHRoZSBhdXRob3Igb2YgYQotbmV3IGFsZ2VicmEgdGV4dGJvb2sgY2FuIHJlYWQgb3RoZXIgYm9va3Mgb24gYWxnZWJyYS4gIEEgbGFyZ2UgcG9ydGlvbgotb2YgYW55IG5vbi1maWN0aW9uIGJvb2sgY29uc2lzdHMgb2YgZmFjdHMsIGluIHRoaXMgY2FzZSBmYWN0cyBhYm91dCBob3cKLWEgY2VydGFpbiBwcm9ncmFtIHdvcmtzLCBhbmQgdGhlc2UgZmFjdHMgYXJlIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGZvcgotZXZlcnlvbmUgd2hvIHdyaXRlcyBhYm91dCB0aGUgc3ViamVjdC4gIEJ1dCBiZSBjYXJlZnVsIG5vdCB0byBjb3B5IHlvdXIKLW91dGxpbmUgc3RydWN0dXJlLCB3b3JkaW5nLCB0YWJsZXMgb3IgZXhhbXBsZXMgZnJvbSBwcmVleGlzdGluZyBub24tZnJlZQotZG9jdW1lbnRhdGlvbi4gIENvcHlpbmcgZnJvbSBmcmVlIGRvY3VtZW50YXRpb24gbWF5IGJlIG9rOyBwbGVhc2UgY2hlY2sKLXdpdGggdGhlIEZTRiBhYm91dCB0aGUgaW5kaXZpZHVhbCBjYXNlLgotCi1Abm9kZSBNYW5hZ2luZyBSZWxlYXNlcwotQGNoYXB0ZXIgVGhlIFJlbGVhc2UgUHJvY2VzcwotCi1NYWtpbmcgYSByZWxlYXNlIGlzIG1vcmUgdGhhbiBqdXN0IGJ1bmRsaW5nIHVwIHlvdXIgc291cmNlIGZpbGVzIGluIGEKLXRhciBmaWxlIGFuZCBwdXR0aW5nIGl0IHVwIGZvciBGVFAuICBZb3Ugc2hvdWxkIHNldCB1cCB5b3VyIHNvZnR3YXJlIHNvCi10aGF0IGl0IGNhbiBiZSBjb25maWd1cmVkIHRvIHJ1biBvbiBhIHZhcmlldHkgb2Ygc3lzdGVtcy4gIFlvdXIgTWFrZWZpbGUKLXNob3VsZCBjb25mb3JtIHRvIHRoZSBHTlUgc3RhbmRhcmRzIGRlc2NyaWJlZCBiZWxvdywgYW5kIHlvdXIgZGlyZWN0b3J5Ci1sYXlvdXQgc2hvdWxkIGFsc28gY29uZm9ybSB0byB0aGUgc3RhbmRhcmRzIGRpc2N1c3NlZCBiZWxvdy4gIERvaW5nIHNvCi1tYWtlcyBpdCBlYXN5IHRvIGluY2x1ZGUgeW91ciBwYWNrYWdlIGludG8gdGhlIGxhcmdlciBmcmFtZXdvcmsgb2YKLWFsbCBHTlUgc29mdHdhcmUuCi0KLUBtZW51Ci0qIENvbmZpZ3VyYXRpb246OiAgICAgICAgICAgICAgIEhvdyBDb25maWd1cmF0aW9uIFNob3VsZCBXb3JrCi0qIE1ha2VmaWxlIENvbnZlbnRpb25zOjoJTWFrZWZpbGUgQ29udmVudGlvbnMKLSogUmVsZWFzZXM6OiAgICAgICAgICAgICAgICAgICAgTWFraW5nIFJlbGVhc2VzCi1AZW5kIG1lbnUKLQotQG5vZGUgQ29uZmlndXJhdGlvbgotQHNlY3Rpb24gSG93IENvbmZpZ3VyYXRpb24gU2hvdWxkIFdvcmsKLQotRWFjaCBHTlUgZGlzdHJpYnV0aW9uIHNob3VsZCBjb21lIHdpdGggYSBzaGVsbCBzY3JpcHQgbmFtZWQKLUBjb2Rle2NvbmZpZ3VyZX0uICBUaGlzIHNjcmlwdCBpcyBnaXZlbiBhcmd1bWVudHMgd2hpY2ggZGVzY3JpYmUgdGhlCi1raW5kIG9mIG1hY2hpbmUgYW5kIHN5c3RlbSB5b3Ugd2FudCB0byBjb21waWxlIHRoZSBwcm9ncmFtIGZvci4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IG11c3QgcmVjb3JkIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc28KLXRoYXQgdGhleSBhZmZlY3QgY29tcGlsYXRpb24uCi0KLU9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0byBtYWtlIGEgbGluayBmcm9tIGEgc3RhbmRhcmQgbmFtZSBzdWNoIGFzCi1AZmlsZXtjb25maWcuaH0gdG8gdGhlIHByb3BlciBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBjaG9zZW4gc3lzdGVtLgotSWYgeW91IHVzZSB0aGlzIHRlY2huaXF1ZSwgdGhlIGRpc3RyaWJ1dGlvbiBzaG91bGQgQGVtcGh7bm90fSBjb250YWluIGEKLWZpbGUgbmFtZWQgQGZpbGV7Y29uZmlnLmh9LiAgVGhpcyBpcyBzbyB0aGF0IHBlb3BsZSB3b24ndCBiZSBhYmxlIHRvCi1idWlsZCB0aGUgcHJvZ3JhbSB3aXRob3V0IGNvbmZpZ3VyaW5nIGl0IGZpcnN0LgotCi1Bbm90aGVyIHRoaW5nIHRoYXQgQGNvZGV7Y29uZmlndXJlfSBjYW4gZG8gaXMgdG8gZWRpdCB0aGUgTWFrZWZpbGUuICBJZgoteW91IGRvIHRoaXMsIHRoZSBkaXN0cmlidXRpb24gc2hvdWxkIEBlbXBoe25vdH0gY29udGFpbiBhIGZpbGUgbmFtZWQKLUBmaWxle01ha2VmaWxlfS4gIEluc3RlYWQsIGl0IHNob3VsZCBpbmNsdWRlIGEgZmlsZSBAZmlsZXtNYWtlZmlsZS5pbn0gd2hpY2gKLWNvbnRhaW5zIHRoZSBpbnB1dCB1c2VkIGZvciBlZGl0aW5nLiAgT25jZSBhZ2FpbiwgdGhpcyBpcyBzbyB0aGF0IHBlb3BsZQotd29uJ3QgYmUgYWJsZSB0byBidWlsZCB0aGUgcHJvZ3JhbSB3aXRob3V0IGNvbmZpZ3VyaW5nIGl0IGZpcnN0LgotCi1JZiBAY29kZXtjb25maWd1cmV9IGRvZXMgd3JpdGUgdGhlIEBmaWxle01ha2VmaWxlfSwgdGhlbiBAZmlsZXtNYWtlZmlsZX0KLXNob3VsZCBoYXZlIGEgdGFyZ2V0IG5hbWVkIEBmaWxle01ha2VmaWxlfSB3aGljaCBjYXVzZXMgQGNvZGV7Y29uZmlndXJlfQotdG8gYmUgcmVydW4sIHNldHRpbmcgdXAgdGhlIHNhbWUgY29uZmlndXJhdGlvbiB0aGF0IHdhcyBzZXQgdXAgbGFzdAotdGltZS4gIFRoZSBmaWxlcyB0aGF0IEBjb2Rle2NvbmZpZ3VyZX0gcmVhZHMgc2hvdWxkIGJlIGxpc3RlZCBhcwotZGVwZW5kZW5jaWVzIG9mIEBmaWxle01ha2VmaWxlfS4KLQotQWxsIHRoZSBmaWxlcyB3aGljaCBhcmUgb3V0cHV0IGZyb20gdGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZAotaGF2ZSBjb21tZW50cyBhdCB0aGUgYmVnaW5uaW5nIGV4cGxhaW5pbmcgdGhhdCB0aGV5IHdlcmUgZ2VuZXJhdGVkCi1hdXRvbWF0aWNhbGx5IHVzaW5nIEBjb2Rle2NvbmZpZ3VyZX0uICBUaGlzIGlzIHNvIHRoYXQgdXNlcnMgd29uJ3QgdGhpbmsKLW9mIHRyeWluZyB0byBlZGl0IHRoZW0gYnkgaGFuZC4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZCB3cml0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7Y29uZmlnLnN0YXR1c30KLXdoaWNoIGRlc2NyaWJlcyB3aGljaCBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2VyZSBzcGVjaWZpZWQgd2hlbiB0aGUKLXByb2dyYW0gd2FzIGxhc3QgY29uZmlndXJlZC4gIFRoaXMgZmlsZSBzaG91bGQgYmUgYSBzaGVsbCBzY3JpcHQgd2hpY2gsCi1pZiBydW4sIHdpbGwgcmVjcmVhdGUgdGhlIHNhbWUgY29uZmlndXJhdGlvbi4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZCBhY2NlcHQgYW4gb3B0aW9uIG9mIHRoZSBmb3JtCi1Ac2FtcHstLXNyY2Rpcj1AdmFye2Rpcm5hbWV9fSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgc291cmNlcyBhcmUgZm91bmQKLShpZiBpdCBpcyBub3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gYnVpbGQKLXRoZSBwcm9ncmFtIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LCBzbyB0aGF0IHRoZSBhY3R1YWwgc291cmNlIGRpcmVjdG9yeQotaXMgbm90IG1vZGlmaWVkLgotCi1JZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IEBzYW1wey0tc3JjZGlyfSwgdGhlbiBAY29kZXtjb25maWd1cmV9IHNob3VsZAotY2hlY2sgYm90aCBAZmlsZXsufSBhbmQgQGZpbGV7Li59IHRvIHNlZSBpZiBpdCBjYW4gZmluZCB0aGUgc291cmNlcy4gIElmCi1pdCBmaW5kcyB0aGUgc291cmNlcyBpbiBvbmUgb2YgdGhlc2UgcGxhY2VzLCBpdCBzaG91bGQgdXNlIHRoZW0gZnJvbQotdGhlcmUuICBPdGhlcndpc2UsIGl0IHNob3VsZCByZXBvcnQgdGhhdCBpdCBjYW5ub3QgZmluZCB0aGUgc291cmNlcywgYW5kCi1zaG91bGQgZXhpdCB3aXRoIG5vbnplcm8gc3RhdHVzLgotCi1Vc3VhbGx5IHRoZSBlYXN5IHdheSB0byBzdXBwb3J0IEBzYW1wey0tc3JjZGlyfSBpcyBieSBlZGl0aW5nIGEKLWRlZmluaXRpb24gb2YgQGNvZGV7VlBBVEh9IGludG8gdGhlIE1ha2VmaWxlLiAgU29tZSBydWxlcyBtYXkgbmVlZCB0bwotcmVmZXIgZXhwbGljaXRseSB0byB0aGUgc3BlY2lmaWVkIHNvdXJjZSBkaXJlY3RvcnkuICBUbyBtYWtlIHRoaXMKLXBvc3NpYmxlLCBAY29kZXtjb25maWd1cmV9IGNhbiBhZGQgdG8gdGhlIE1ha2VmaWxlIGEgdmFyaWFibGUgbmFtZWQKLUBjb2Rle3NyY2Rpcn0gd2hvc2UgdmFsdWUgaXMgcHJlY2lzZWx5IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIGFsc28gdGFrZSBhbiBhcmd1bWVudCB3aGljaCBzcGVjaWZpZXMgdGhlCi10eXBlIG9mIHN5c3RlbSB0byBidWlsZCB0aGUgcHJvZ3JhbSBmb3IuICBUaGlzIGFyZ3VtZW50IHNob3VsZCBsb29rIGxpa2UKLXRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye2NwdX0tQHZhcntjb21wYW55fS1AdmFye3N5c3RlbX0KLUBlbmQgZXhhbXBsZQotCi1Gb3IgZXhhbXBsZSwgYSBTdW4gMyBtaWdodCBiZSBAc2FtcHttNjhrLXN1bi1zdW5vczQuMX0uCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBuZWVkcyB0byBiZSBhYmxlIHRvIGRlY29kZSBhbGwgcGxhdXNpYmxlCi1hbHRlcm5hdGl2ZXMgZm9yIGhvdyB0byBkZXNjcmliZSBhIG1hY2hpbmUuICBUaHVzLCBAc2FtcHtzdW4zLXN1bm9zNC4xfQotd291bGQgYmUgYSB2YWxpZCBhbGlhcy4gIEZvciBtYW55IHByb2dyYW1zLCBAc2FtcHt2YXgtZGVjLXVsdHJpeH0gd291bGQKLWJlIGFuIGFsaWFzIGZvciBAc2FtcHt2YXgtZGVjLWJzZH0sIHNpbXBseSBiZWNhdXNlIHRoZSBkaWZmZXJlbmNlcwotYmV0d2VlbiBVbHRyaXggYW5kIEBzY3tCU0R9IGFyZSByYXJlbHkgbm90aWNlYWJsZSwgYnV0IGEgZmV3IHByb2dyYW1zCi1taWdodCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZW0uCi1AYyBSZWFsIDQuNEJTRCBub3cgcnVucyBvbiBzb21lIFN1bnMuCi0KLVRoZXJlIGlzIGEgc2hlbGwgc2NyaXB0IGNhbGxlZCBAZmlsZXtjb25maWcuc3VifSB0aGF0IHlvdSBjYW4gdXNlCi1hcyBhIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgc3lzdGVtIHR5cGVzIGFuZCBjYW5vbmljYWxpemUgYWxpYXNlcy4KLQotT3RoZXIgb3B0aW9ucyBhcmUgcGVybWl0dGVkIHRvIHNwZWNpZnkgaW4gbW9yZSBkZXRhaWwgdGhlIHNvZnR3YXJlCi1vciBoYXJkd2FyZSBwcmVzZW50IG9uIHRoZSBtYWNoaW5lLCBhbmQgaW5jbHVkZSBvciBleGNsdWRlIG9wdGlvbmFsCi1wYXJ0cyBvZiB0aGUgcGFja2FnZToKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAtLWVuYWJsZS1AdmFye2ZlYXR1cmV9QHJ7W309QHZhcntwYXJhbWV0ZXJ9QHJ7XX0KLUNvbmZpZ3VyZSB0aGUgcGFja2FnZSB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvcHRpb25hbCB1c2VyLWxldmVsCi1mYWNpbGl0eSBjYWxsZWQgQHZhcntmZWF0dXJlfS4gIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGNob29zZSB3aGljaAotb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5jbHVkZS4gIEdpdmluZyBhbiBvcHRpb25hbCBAdmFye3BhcmFtZXRlcn0gb2YKLUBzYW1we25vfSBzaG91bGQgb21pdCBAdmFye2ZlYXR1cmV9LCBpZiBpdCBpcyBidWlsdCBieSBkZWZhdWx0LgotCi1ObyBAc2FtcHstLWVuYWJsZX0gb3B0aW9uIHNob3VsZCBAc3Ryb25ne2V2ZXJ9IGNhdXNlIG9uZSBmZWF0dXJlIHRvCi1yZXBsYWNlIGFub3RoZXIuICBObyBAc2FtcHstLWVuYWJsZX0gb3B0aW9uIHNob3VsZCBldmVyIHN1YnN0aXR1dGUgb25lCi11c2VmdWwgYmVoYXZpb3IgZm9yIGFub3RoZXIgdXNlZnVsIGJlaGF2aW9yLiAgVGhlIG9ubHkgcHJvcGVyIHVzZSBmb3IKLUBzYW1wey0tZW5hYmxlfSBpcyBmb3IgcXVlc3Rpb25zIG9mIHdoZXRoZXIgdG8gYnVpbGQgcGFydCBvZiB0aGUgcHJvZ3JhbQotb3IgZXhjbHVkZSBpdC4KLQotQGl0ZW0gLS13aXRoLUB2YXJ7cGFja2FnZX0KLUBjIEBye1t9PUB2YXJ7cGFyYW1ldGVyfUBye119Ci1UaGUgcGFja2FnZSBAdmFye3BhY2thZ2V9IHdpbGwgYmUgaW5zdGFsbGVkLCBzbyBjb25maWd1cmUgdGhpcyBwYWNrYWdlCi10byB3b3JrIHdpdGggQHZhcntwYWNrYWdlfS4KLQotQGMgIEdpdmluZyBhbiBvcHRpb25hbCBAdmFye3BhcmFtZXRlcn0gb2YKLUBjIEBzYW1we25vfSBzaG91bGQgb21pdCBAdmFye3BhY2thZ2V9LCBpZiBpdCBpcyB1c2VkIGJ5IGRlZmF1bHQuCi0KLVBvc3NpYmxlIHZhbHVlcyBvZiBAdmFye3BhY2thZ2V9IGluY2x1ZGUgCi1Ac2FtcHtnbnUtYXN9IChvciBAc2FtcHtnYXN9KSwgQHNhbXB7Z251LWxkfSwgQHNhbXB7Z251LWxpYmN9LAotQHNhbXB7Z2RifSwKLUBzYW1we3h9LCAKLWFuZAotQHNhbXB7eC10b29sa2l0fS4KLQotRG8gbm90IHVzZSBhIEBzYW1wey0td2l0aH0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSB0byB1c2UgdG8KLWZpbmQgY2VydGFpbiBmaWxlcy4gIFRoYXQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygd2hhdCBAc2FtcHstLXdpdGh9Ci1vcHRpb25zIGFyZSBmb3IuCi0KLUBpdGVtIC0tbmZwCi1UaGUgdGFyZ2V0IG1hY2hpbmUgaGFzIG5vIGZsb2F0aW5nIHBvaW50IHByb2Nlc3Nvci4KLQotQGl0ZW0gLS1nYXMKLVRoZSB0YXJnZXQgbWFjaGluZSBhc3NlbWJsZXIgaXMgR0FTLCB0aGUgR05VIGFzc2VtYmxlci4KLVRoaXMgaXMgb2Jzb2xldGU7IHVzZXJzIHNob3VsZCB1c2UgQHNhbXB7LS13aXRoLWdudS1hc30gaW5zdGVhZC4KLQotQGl0ZW0gLS14Ci1UaGUgdGFyZ2V0IG1hY2hpbmUgaGFzIHRoZSBYIFdpbmRvdyBTeXN0ZW0gaW5zdGFsbGVkLgotVGhpcyBpcyBvYnNvbGV0ZTsgdXNlcnMgc2hvdWxkIHVzZSBAc2FtcHstLXdpdGgteH0gaW5zdGVhZC4KLUBlbmQgdGFibGUKLQotQWxsIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0cyBzaG91bGQgYWNjZXB0IGFsbCBvZiB0aGVzZSBgYGRldGFpbCcnCi1vcHRpb25zLCB3aGV0aGVyIG9yIG5vdCB0aGV5IG1ha2UgYW55IGRpZmZlcmVuY2UgdG8gdGhlIHBhcnRpY3VsYXIKLXBhY2thZ2UgYXQgaGFuZC4gIEluIHBhcnRpY3VsYXIsIHRoZXkgc2hvdWxkIGFjY2VwdCBhbnkgb3B0aW9uIHRoYXQKLXN0YXJ0cyB3aXRoIEBzYW1wey0td2l0aC19IG9yIEBzYW1wey0tZW5hYmxlLX0uICBUaGlzIGlzIHNvIHVzZXJzIHdpbGwKLWJlIGFibGUgdG8gY29uZmlndXJlIGFuIGVudGlyZSBHTlUgc291cmNlIHRyZWUgYXQgb25jZSB3aXRoIGEgc2luZ2xlIHNldAotb2Ygb3B0aW9ucy4KLQotWW91IHdpbGwgbm90ZSB0aGF0IHRoZSBjYXRlZ29yaWVzIEBzYW1wey0td2l0aC19IGFuZCBAc2FtcHstLWVuYWJsZS19Ci1hcmUgbmFycm93OiB0aGV5IEBzdHJvbmd7ZG8gbm90fSBwcm92aWRlIGEgcGxhY2UgZm9yIGFueSBzb3J0IG9mIG9wdGlvbgoteW91IG1pZ2h0IHRoaW5rIG9mLiAgVGhhdCBpcyBkZWxpYmVyYXRlLiAgV2Ugd2FudCB0byBsaW1pdCB0aGUgcG9zc2libGUKLWNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiBHTlUgc29mdHdhcmUuICBXZSBkbyBub3Qgd2FudCBHTlUgcHJvZ3JhbXMgdG8KLWhhdmUgaWRpb3N5bmNyYXRpYyBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi0KLVBhY2thZ2VzIHRoYXQgcGVyZm9ybSBwYXJ0IG9mIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIG1heSBzdXBwb3J0IGNyb3NzLWNvbXBpbGF0aW9uLgotSW4gc3VjaCBhIGNhc2UsIHRoZSBob3N0IGFuZCB0YXJnZXQgbWFjaGluZXMgZm9yIHRoZSBwcm9ncmFtIG1heSBiZQotZGlmZmVyZW50LiAgVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZCBub3JtYWxseSB0cmVhdCB0aGUKLXNwZWNpZmllZCB0eXBlIG9mIHN5c3RlbSBhcyBib3RoIHRoZSBob3N0IGFuZCB0aGUgdGFyZ2V0LCB0aHVzIHByb2R1Y2luZwotYSBwcm9ncmFtIHdoaWNoIHdvcmtzIGZvciB0aGUgc2FtZSB0eXBlIG9mIG1hY2hpbmUgdGhhdCBpdCBydW5zIG9uLgotCi1UaGUgd2F5IHRvIGJ1aWxkIGEgY3Jvc3MtY29tcGlsZXIsIGNyb3NzLWFzc2VtYmxlciwgb3Igd2hhdCBoYXZlIHlvdSwgaXMKLXRvIHNwZWNpZnkgdGhlIG9wdGlvbiBAc2FtcHstLWhvc3Q9QHZhcntob3N0dHlwZX19IHdoZW4gcnVubmluZwotQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgc3BlY2lmaWVzIHRoZSBob3N0IHN5c3RlbSB3aXRob3V0IGNoYW5naW5nIHRoZQotdHlwZSBvZiB0YXJnZXQgc3lzdGVtLiAgVGhlIHN5bnRheCBmb3IgQHZhcntob3N0dHlwZX0gaXMgdGhlIHNhbWUgYXMKLWRlc2NyaWJlZCBhYm92ZS4KLQotQm9vdHN0cmFwcGluZyBhIGNyb3NzLWNvbXBpbGVyIHJlcXVpcmVzIGNvbXBpbGluZyBpdCBvbiBhIG1hY2hpbmUgb3RoZXIKLXRoYW4gdGhlIGhvc3QgaXQgd2lsbCBydW4gb24uICBDb21waWxhdGlvbiBwYWNrYWdlcyBhY2NlcHQgYQotY29uZmlndXJhdGlvbiBvcHRpb24gQHNhbXB7LS1idWlsZD1AdmFye2hvc3R0eXBlfX0gZm9yIHNwZWNpZnlpbmcgdGhlCi1jb25maWd1cmF0aW9uIG9uIHdoaWNoIHlvdSB3aWxsIGNvbXBpbGUgdGhlbSwgaW4gY2FzZSB0aGF0IGlzIGRpZmZlcmVudAotZnJvbSB0aGUgaG9zdC4KLQotUHJvZ3JhbXMgZm9yIHdoaWNoIGNyb3NzLW9wZXJhdGlvbiBpcyBub3QgbWVhbmluZ2Z1bCBuZWVkIG5vdCBhY2NlcHQgdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiwgYmVjYXVzZSBjb25maWd1cmluZyBhbiBlbnRpcmUgb3BlcmF0aW5nIHN5c3RlbSBmb3IKLWNyb3NzLW9wZXJhdGlvbiBpcyBub3QgYSBtZWFuaW5nZnVsIHRoaW5nLgotCi1Tb21lIHByb2dyYW1zIGhhdmUgd2F5cyBvZiBjb25maWd1cmluZyB0aGVtc2VsdmVzIGF1dG9tYXRpY2FsbHkuICBJZgoteW91ciBwcm9ncmFtIGlzIHNldCB1cCB0byBkbyB0aGlzLCB5b3VyIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IGNhbiBzaW1wbHkKLWlnbm9yZSBtb3N0IG9mIGl0cyBhcmd1bWVudHMuCi0KLUBjb21tZW50IFRoZSBtYWtlZmlsZSBzdGFuZGFyZHMgYXJlIGluIGEgc2VwYXJhdGUgZmlsZSB0aGF0IGlzIGFsc28KLUBjb21tZW50IGluY2x1ZGVkIGJ5IG1ha2UudGV4aW5mby4gIERvbmUgYnkgcm9sYW5kQGdudS5haS5taXQuZWR1IG9uIDEvNi85My4KLUBjb21tZW50IEZvciB0aGlzIGRvY3VtZW50LCB0dXJuIGNoYXB0ZXJzIGludG8gc2VjdGlvbnMsIGV0Yy4KLUBsb3dlcnNlY3Rpb25zCi1AaW5jbHVkZSBtYWtlLXN0ZHMudGV4aQotQHJhaXNlc2VjdGlvbnMKLQotQG5vZGUgUmVsZWFzZXMKLUBzZWN0aW9uIE1ha2luZyBSZWxlYXNlcwotCi1QYWNrYWdlIHRoZSBkaXN0cmlidXRpb24gb2YgQGNvZGV7Rm9vIHZlcnNpb24gNjkuOTZ9IHVwIGluIGEgZ3ppcHBlZCB0YXIKLWZpbGUgd2l0aCB0aGUgbmFtZSBAZmlsZXtmb28tNjkuOTYudGFyLmd6fS4gIEl0IHNob3VsZCB1bnBhY2sgaW50byBhCi1zdWJkaXJlY3RvcnkgbmFtZWQgQGZpbGV7Zm9vLTY5Ljk2fS4KLQotQnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIHByb2dyYW0gc2hvdWxkIG5ldmVyIG1vZGlmeSBhbnkgb2YgdGhlIGZpbGVzCi1jb250YWluZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbi4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgdGhlIGZpbGVzIHRoYXQgZm9ybQotcGFydCBvZiB0aGUgcHJvZ3JhbSBpbiBhbnkgd2F5IG11c3QgYmUgY2xhc3NpZmllZCBpbnRvIEBkZm57c291cmNlCi1maWxlc30gYW5kIEBkZm57bm9uLXNvdXJjZSBmaWxlc30uICBTb3VyY2UgZmlsZXMgYXJlIHdyaXR0ZW4gYnkgaHVtYW5zCi1hbmQgbmV2ZXIgY2hhbmdlZCBhdXRvbWF0aWNhbGx5OyBub24tc291cmNlIGZpbGVzIGFyZSBwcm9kdWNlZCBmcm9tCi1zb3VyY2UgZmlsZXMgYnkgcHJvZ3JhbXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIE1ha2VmaWxlLgotCi1OYXR1cmFsbHksIGFsbCB0aGUgc291cmNlIGZpbGVzIG11c3QgYmUgaW4gdGhlIGRpc3RyaWJ1dGlvbi4gIEl0IGlzIG9rYXkKLXRvIGluY2x1ZGUgbm9uLXNvdXJjZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uLCBwcm92aWRlZCB0aGV5IGFyZQotdXAtdG8tZGF0ZSBhbmQgbWFjaGluZS1pbmRlcGVuZGVudCwgc28gdGhhdCBidWlsZGluZyB0aGUgZGlzdHJpYnV0aW9uCi1ub3JtYWxseSB3aWxsIG5ldmVyIG1vZGlmeSB0aGVtLiAgV2UgY29tbW9ubHkgaW5jbHVkZSBub24tc291cmNlIGZpbGVzCi1wcm9kdWNlZCBieSBCaXNvbiwgQGNvZGV7bGV4fSwgQFRlWHt9LCBhbmQgQGNvZGV7bWFrZWluZm99OyB0aGlzIGhlbHBzIGF2b2lkCi11bm5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBvdXIgZGlzdHJpYnV0aW9ucywgc28gdGhhdCB1c2VycyBjYW4KLWluc3RhbGwgd2hpY2hldmVyIHBhY2thZ2VzIHRoZXkgd2FudCB0byBpbnN0YWxsLgotCi1Ob24tc291cmNlIGZpbGVzIHRoYXQgbWlnaHQgYWN0dWFsbHkgYmUgbW9kaWZpZWQgYnkgYnVpbGRpbmcgYW5kCi1pbnN0YWxsaW5nIHRoZSBwcm9ncmFtIHNob3VsZCBAc3Ryb25ne25ldmVyfSBiZSBpbmNsdWRlZCBpbiB0aGUKLWRpc3RyaWJ1dGlvbi4gIFNvIGlmIHlvdSBkbyBkaXN0cmlidXRlIG5vbi1zb3VyY2UgZmlsZXMsIGFsd2F5cyBtYWtlCi1zdXJlIHRoZXkgYXJlIHVwIHRvIGRhdGUgd2hlbiB5b3UgbWFrZSBhIG5ldyBkaXN0cmlidXRpb24uCi0KLU1ha2Ugc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZGlzdHJpYnV0aW9uIHVucGFja3MgKGFzCi13ZWxsIGFzIGFueSBzdWJkaXJlY3RvcmllcykgYXJlIGFsbCB3b3JsZC13cml0YWJsZSAob2N0YWwgbW9kZSA3NzcpLgotVGhpcyBpcyBzbyB0aGF0IG9sZCB2ZXJzaW9ucyBvZiBAY29kZXt0YXJ9IHdoaWNoIHByZXNlcnZlIHRoZQotb3duZXJzaGlwIGFuZCBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZXMgZnJvbSB0aGUgdGFyIGFyY2hpdmUgd2lsbCBiZQotYWJsZSB0byBleHRyYWN0IGFsbCB0aGUgZmlsZXMgZXZlbiBpZiB0aGUgdXNlciBpcyB1bnByaXZpbGVnZWQuCi0KLU1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiBhcmUgd29ybGQtcmVhZGFibGUuCi0KLU1ha2Ugc3VyZSB0aGF0IG5vIGZpbGUgbmFtZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGlzIG1vcmUgdGhhbiAxNAotY2hhcmFjdGVycyBsb25nLiAgTGlrZXdpc2UsIG5vIGZpbGUgY3JlYXRlZCBieSBidWlsZGluZyB0aGUgcHJvZ3JhbQotc2hvdWxkIGhhdmUgYSBuYW1lIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuICBUaGUgcmVhc29uIGZvciB0aGlzIGlzCi10aGF0IHNvbWUgc3lzdGVtcyBhZGhlcmUgdG8gYSBmb29saXNoIGludGVycHJldGF0aW9uIG9mIHRoZSBQT1NJWAotc3RhbmRhcmQsIGFuZCByZWZ1c2UgdG8gb3BlbiBhIGxvbmdlciBuYW1lLCByYXRoZXIgdGhhbiB0cnVuY2F0aW5nIGFzCi10aGV5IGRpZCBpbiB0aGUgcGFzdC4KLQotRG9uJ3QgaW5jbHVkZSBhbnkgc3ltYm9saWMgbGlua3MgaW4gdGhlIGRpc3RyaWJ1dGlvbiBpdHNlbGYuICBJZiB0aGUgdGFyCi1maWxlIGNvbnRhaW5zIHN5bWJvbGljIGxpbmtzLCB0aGVuIHBlb3BsZSBjYW5ub3QgZXZlbiB1bnBhY2sgaXQgb24KLXN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHN5bWJvbGljIGxpbmtzLiAgQWxzbywgZG9uJ3QgdXNlIG11bHRpcGxlCi1uYW1lcyBmb3Igb25lIGZpbGUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLCBiZWNhdXNlIGNlcnRhaW4gZmlsZQotc3lzdGVtcyBjYW5ub3QgaGFuZGxlIHRoaXMgYW5kIHRoYXQgcHJldmVudHMgdW5wYWNraW5nIHRoZQotZGlzdHJpYnV0aW9uLgotCi1UcnkgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBmaWxlIG5hbWVzIHdpbGwgYmUgdW5pcXVlIG9uIE1TLURPUy4gIEEKLW5hbWUgb24gTVMtRE9TIGNvbnNpc3RzIG9mIHVwIHRvIDggY2hhcmFjdGVycywgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhCi1wZXJpb2QgYW5kIHVwIHRvIHRocmVlIGNoYXJhY3RlcnMuICBNUy1ET1Mgd2lsbCB0cnVuY2F0ZSBleHRyYQotY2hhcmFjdGVycyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHBlcmlvZC4gIFRodXMsCi1AZmlsZXtmb29iYXJoYWNrZXIuY30gYW5kIEBmaWxle2Zvb2JhcmhhY2tlci5vfSBhcmUgbm90IGFtYmlndW91czsgdGhleQotYXJlIHRydW5jYXRlZCB0byBAZmlsZXtmb29iYXJoYS5jfSBhbmQgQGZpbGV7Zm9vYmFyaGEub30sIHdoaWNoIGFyZQotZGlzdGluY3QuCi0KLUluY2x1ZGUgaW4geW91ciBkaXN0cmlidXRpb24gYSBjb3B5IG9mIHRoZSBAZmlsZXt0ZXhpbmZvLnRleH0geW91IHVzZWQKLXRvIHRlc3QgcHJpbnQgYW55IEBmaWxleyoudGV4aW5mb30gb3IgQGZpbGV7Ki50ZXhpfSBmaWxlcy4KLQotTGlrZXdpc2UsIGlmIHlvdXIgcHJvZ3JhbSB1c2VzIHNtYWxsIEdOVSBzb2Z0d2FyZSBwYWNrYWdlcyBsaWtlIHJlZ2V4LAotZ2V0b3B0LCBvYnN0YWNrLCBvciB0ZXJtY2FwLCBpbmNsdWRlIHRoZW0gaW4gdGhlIGRpc3RyaWJ1dGlvbiBmaWxlLgotTGVhdmluZyB0aGVtIG91dCB3b3VsZCBtYWtlIHRoZSBkaXN0cmlidXRpb24gZmlsZSBhIGxpdHRsZSBzbWFsbGVyIGF0Ci10aGUgZXhwZW5zZSBvZiBwb3NzaWJsZSBpbmNvbnZlbmllbmNlIHRvIGEgdXNlciB3aG8gZG9lc24ndCBrbm93IHdoYXQKLW90aGVyIGZpbGVzIHRvIGdldC4KLQotQGNvbnRlbnRzCi0KLUBieWUKLUxvY2FsIHZhcmlhYmxlczoKLXVwZGF0ZS1kYXRlLWxlYWRpbmctcmVnZXhwOiAiQGMgVGhpcyBkYXRlIGlzIGF1dG9tYWdpY2FsbHkgdXBkYXRlZCB3aGVuIHlvdSBzYXZlIHRoaXMgZmlsZTpcbkBzZXQgbGFzdHVwZGF0ZSAiCi11cGRhdGUtZGF0ZS10cmFpbGluZy1yZWdleHA6ICIiCi1ldmFsOiAobG9hZCAiL2dkL2dudW9yZy91cGRhdGUtZGF0ZS5lbCIpCi1ldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3VwZGF0ZS1kYXRlKQotRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL0NPTlRSSUJVVE9SUyBiL2dhcy9DT05UUklCVVRPUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmQwM2UuLjAwMDAwMDAKLS0tIGEvZ2FzL0NPTlRSSUJVVE9SUworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0oVGhpcyBmaWxlIGlzIHVuZGVyIGNvbnN0cnVjdGlvbi4pCQkJLSotIHRleHQgLSotCi0KLUlmIHlvdSd2ZSBjb250cmlidXRlZCB0byBnYXMgYW5kIHlvdXIgbmFtZSBpc24ndCBsaXN0ZWQgaGVyZSwgaXQgaXMKLW5vdCBtZWFudCBhcyBhIHNsaWdodC4gIEkganVzdCBkb24ndCBrbm93IGFib3V0IGl0LiAgRW1haWwgbWUsCi1yYWVidXJuQGN5Z251cy5jb20gYW5kIEknbGwgY29ycmVjdCB0aGUgc2l0dWF0aW9uLgotCi1UaGlzIGZpbGUgd2lsbCBldmVudHVhbGx5IGJlIGRlbGV0ZWQ6IFRoZSBnZW5lcmFsIGluZm8gd2lsbCBnbyBpbnRvCi10aGUgZG9jdW1lbnRhdGlvbiwgYW5kIGluZm8gb24gc3BlY2lmaWMgZmlsZXMgd2lsbCBnbyBpbnRvIGFuIEFVVEhPUlMKLWZpbGUsIGFzIHJlcXVlc3RlZCBieSB0aGUgRlNGLgotCi0rKysrKysrKysrKysrKysrCi0KLURlYW4gRWxzbmVyIHdyb3RlIHRoZSBvcmlnaW5hbCBnYXMgZm9yIHZheC4gIFttb3JlIGRldGFpbHM/XQotCi1KYXkgRmVubGFzb24gbWFpbnRhaW5lZCBnYXMgZm9yIGEgd2hpbGUsIGFkZGluZyBzdXBwb3J0IGZvcgotZ2RiLXNwZWNpZmljIGRlYnVnIGluZm9ybWF0aW9uIGFuZCB0aGUgNjhrIHNlcmllcyBtYWNoaW5lcywgbW9zdCBvZgotdGhlIHByZXByb2Nlc3NpbmcgcGFzcywgYW5kIGV4dGVuc2l2ZSBjaGFuZ2VzIGluIG1lc3NhZ2VzLmMsCi1pbnB1dC1maWxlLmMsIHdyaXRlLmMuCi0KLUsuIFJpY2hhcmQgUGl4bGV5IG1haW50YWluZWQgZ2FzIGZvciBhIHdoaWxlLCBhZGRpbmcgdmFyaW91cwotZW5oYW5jZW1lbnRzIGFuZCBtYW55IGJ1ZyBmaXhlcywgaW5jbHVkaW5nIG1lcmdpbmcgc3VwcG9ydCBmb3Igc2V2ZXJhbAotcHJvY2Vzc29ycywgYnJlYWtpbmcgZ2FzIHVwIHRvIGhhbmRsZSBtdWx0aXBsZSBvYmplY3QgZmlsZSBmb3JtYXQKLWJhY2tlbmRzIChpbmNsdWRpbmcgaGVhdnkgcmV3cml0ZSwgdGVzdGluZywgYW4gaW50ZWdyYXRpb24gb2YgdGhlIGNvZmYKLWFuZCBiLm91dCBiYWNrZW5kcyksIGFkZGluZyBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBoZWF2eSB0ZXN0aW5nIGFuZAotdmVyaWZpY2F0aW9uIG9mIGNyb3NzIGFzc2VtYmxlcnMgYW5kIGZpbGUgc3BsaXRzIGFuZCByZW5hbWluZywKLWNvbnZlcnRlZCBnYXMgdG8gc3RyaWN0bHkgYW5zaSBDIGluY2x1ZGluZyBmdWxsIHByb3RvdHlwZXMsIGFkZGVkCi1zdXBwb3J0IGZvciBtNjgwWzM0XTAgJiBjcHUzMiwgY29uc2lkZXJhYmxlIHdvcmsgb24gaTk2MCBpbmNsdWRpbmcgYQotY29mZiBwb3J0IChpbmNsdWRpbmcgY29uc2lkZXJhYmxlIGFtb3VudHMgb2YgcmV2ZXJzZSBlbmdpbmVlcmluZyksIGEKLXNwYXJjIG9wY29kZSBmaWxlIHJld3JpdGUsIGRlY3N0YXRpb24sIHJzNjAwMCwgYW5kIGhwMzAwaHB1eCBob3N0Ci1wb3J0cywgdXBkYXRlZCAia25vdyIgYXNzZXJ0aW9ucyBhbmQgbWFkZSB0aGVtIHdvcmssIG11Y2ggb3RoZXIKLXJlb3JnYW5pemF0aW9uLCBjbGVhbnVwLCBhbmQgbGludC4KLQotS2VuIFJhZWJ1cm4gY3VycmVudGx5IG1haW50YWlucyBnYXMsIGFuZCB3cm90ZSB0aGUgaGlnaC1sZXZlbCBCRkQKLWludGVyZmFjZSBjb2RlIHRvIHJlcGxhY2UgbW9zdCBvZiB0aGUgY29kZSBpbiBmb3JtYXQtc3BlY2lmaWMgSS9PCi1tb2R1bGVzLgotCi1UaGUgb3JpZ2luYWwgVmF4LVZNUyBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSBEYXZpZCBMLiBLYXNodGFuLgotRXJpYyBZb3VuZ2RhbGUgYW5kIFBhdCBSYW5raW4gaGF2ZSBkb25lIG11Y2ggd29yayB3aXRoIGl0IHNpbmNlLgotCi1UaGUgSW50ZWwgODAzODYgbWFjaGluZSBkZXNjcmlwdGlvbiB3YXMgd3JpdHRlbiBieSBFbGlvdCBEcmVzc2VsaGF1cy4KLQotTWluaCBUcmFuLUxlIGF0IEludGVsbGlDb3JwIGNvbnRyaWJ1dGVkIHNvbWUgQUlYIDM4NiBzdXBwb3J0LgotCi1UaGUgTW90b3JvbGEgODhrIG1hY2hpbmUgZGVzY3JpcHRpb24gd2FzIGNvbnRyaWJ1dGVkIGJ5IERldm9uIEJvd2VuIG9mCi1CdWZmYWxvIFVuaXZlcnNpdHkgYW5kIFRvcmJqb3JuIEdyYW5sdW5kIG9mIHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZgotQ29tcHV0ZXIgU2NpZW5jZS4KLQotS2VpdGggS25vd2xlcyBhdCB0aGUgT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHdyb3RlIHRoZSBvcmlnaW5hbCBNSVBTCi1iYWNrIGVuZCAodGMtbWlwcy5jLCB0Yy1taXBzLmgpLCBhbmQgY29udHJpYnV0ZWQgUm9zZSBmb3JtYXQgc3VwcG9ydAotdGhhdCBoYXNuJ3QgYmVlbiBtZXJnZWQgaW4geWV0LiAgUmFscGggQ2FtcGJlbGwgd29ya2VkIHdpdGggdGhlIE1JUFMKLWNvZGUgdG8gc3VwcG9ydCBhLm91dCBmb3JtYXQuCi0KLVN1cHBvcnQgZm9yIHRoZSBaaWxvZyBaOGsgYW5kIEhpdGFjaGkgSDgvMzAwLCBIOC81MDAgYW5kIFNIIHByb2Nlc3NvcnMKLSh0Yy16OGssIHRjLWg4MzAwLCB0Yy1oODUwMCwgdGMtc2gpLCBhbmQgSUVFRSA2OTUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0ob2JqLWllZWUpLCB3YXMgd3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU29sdXRpb25zLgotU3RldmUgYWxzbyBtb2RpZmllZCB0aGUgQ09GRiBiYWNrIGVuZCAob2JqLWNvZmZiZmQpIHRvIHVzZSBCRkQgZm9yCi1zb21lIGxvdy1sZXZlbCBvcGVyYXRpb25zLCBmb3IgdXNlIHdpdGggdGhlIEhpdGFjaGksIDI5ayBhbmQgWmlsb2cKLXRhcmdldHMuCi0KLUpvaG4gR2lsbW9yZSBidWlsdCB0aGUgQU1EIDI5MDAwIHN1cHBvcnQsIGFkZGVkIC5pbmNsdWRlIHN1cHBvcnQsIGFuZAotc2ltcGxpZmllZCB0aGUgY29uZmlndXJhdGlvbiBvZiB3aGljaCB2ZXJzaW9ucyBhY2NlcHQgd2hpY2gKLXBzZXVkby1vcHMuICBIZSB1cGRhdGVkIHRoZSA2OGsgbWFjaGluZSBkZXNjcmlwdGlvbiBzbyB0aGF0IE1vdG9yb2xhJ3MKLW9wY29kZXMgYWx3YXlzIHByb2R1Y2VkIGZpeGVkLXNpemUgaW5zdHJ1Y3Rpb25zIChlLmcuIGpzciksIHdoaWxlCi1zeW50aGV0aWMgaW5zdHJ1Y3Rpb25zIHJlbWFpbmVkIHNocmlua2FibGUgKGpic3IpLiAgSm9obiBmaXhlZCBtYW55Ci1idWdzLCBpbmNsdWRpbmcgdHJ1ZSB0ZXN0ZWQgY3Jvc3MtY29tcGlsYXRpb24gc3VwcG9ydCwgYW5kIG9uZSBidWcgaW4KLXJlbGF4YXRpb24gdGhhdCB0b29rIGEgd2VlayBhbmQgcmVxdWlyZWQgdGhlIHByb3ZlcmJpYWwgb25lLWJpdCBmaXguCi0KLUlhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzIFNvbHV0aW9ucyBtZXJnZWQgdGhlIE1vdG9yb2xhIGFuZCBNSVQKLXN5bnRheGVzIGZvciB0aGUgNjhrLCBjb21wbGV0ZWQgc3VwcG9ydCBmb3Igc29tZSBDT0ZGIHRhcmdldHMgKDY4aywKLWkzODYgU1ZSMywgYW5kIFNDTyBVbml4KSwgd3JvdGUgdGhlIEVDT0ZGIHN1cHBvcnQgYmFzZWQgb24gTWljaGFlbAotTWVpc3NuZXIncyBtaXBzLXRmaWxlIHByb2dyYW0sIHdyb3RlIHRoZSBQb3dlclBDIGFuZCBSUy82MDAwIHN1cHBvcnQsCi1hbmQgbWFkZSBhIGZldyBvdGhlciBtaW5vciBwYXRjaGVzLiAgSGUgaGFuZGxlZCB0aGUgYmludXRpbHMgcmVsZWFzZXMKLWZvciB2ZXJzaW9ucyAyLjcgdGhyb3VnaCAyLjkuCi0KLURhdmlkIEVkZWxzb2huIGNvbnRyaWJ1dGVkIGZpeGVzIGZvciB0aGUgUG93ZXJQQyBhbmQgQUlYIHN1cHBvcnQuCi0KLVN0ZXZlIENoYW1iZXJsYWluIG1hZGUgZ2FzIGFibGUgdG8gZ2VuZXJhdGUgbGlzdGluZ3MuCi0KLVN1cHBvcnQgZm9yIHRoZSBIUDkwMDAvMzAwIHdhcyBjb250cmlidXRlZCBieSBHbGVubiBFbmdlbCBvZiBIUC4KLQotU3VwcG9ydCBmb3IgRUxGIGZvcm1hdCBmaWxlcyBoYXMgYmVlbiB3b3JrZWQgb24gYnkgTWFyayBFaWNoaW4gb2YKLUN5Z251cyBTb2x1dGlvbnMgKG9yaWdpbmFsLCBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uKSwgUGV0ZQotSG9vZ2VuYm9vbSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIChIUFBBIG1haW5seSksIE1pY2hhZWwgTWVpc3NuZXIKLW9mIHRoZSBPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24gKGkzODYgbWFpbmx5KSwgYW5kIEtlbiBSYWVidXJuIG9mCi1DeWdudXMgU29sdXRpb25zIChzcGFyYywgaW5pdGlhbCA2NC1iaXQgc3VwcG9ydCkuCi0KLVNldmVyYWwgZW5naW5lZXJzIGF0IEN5Z251cyBTb2x1dGlvbnMgaGF2ZSBhbHNvIHByb3ZpZGVkIG1hbnkgc21hbGwKLWJ1ZyBmaXhlcyBhbmQgY29uZmlndXJhdGlvbiBlbmhhbmNlbWVudHMuCi0KLVRoZSBpbml0aWFsIEFscGhhIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IENhcm5lZ2llLU1lbGxvbgotVW5pdmVyc2l0eS4gIEFkZGl0aW9uYWwgd29yayB3YXMgZG9uZSBieSBLZW4gUmFlYnVybiBvZiBDeWdudXMKLVNvbHV0aW9ucy4gIFJpY2hhcmQgSGVuZGVyc29uIHRoZW4gcmV3cm90ZSBtdWNoIG9mIHRoZSBBbHBoYSBzdXBwb3J0LgotCi1JYW4gRGFsbCB1cGRhdGVkIHRoZSBzdXBwb3J0IGNvZGUgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIDMyMDAwCi1zZXJpZXMsIGFuZCBhZGRlZCBzdXBwb3J0IGZvciBNYWNoIDMgYW5kIE5ldEJTRCBydW5uaW5nIG9uIHRoZSBQQzUzMi4KLQotS2xhdXMgS2FlbXBmIHBvcnRlZCB0aGUgYXNzZW1ibGVyIGFuZCB0aGUgYmludXRpbHMgdG8gb3BlblZNUy9BbHBoYS4KLQotU3RldmUgSGF3b3J0aCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydWN0aW9uIGMzMAotKHRtczMyMGMzMCkuCi0KLUguSi4gTHUgaGFzIGNvbnRyaWJ1dGVkIG1hbnkgcGF0Y2hlcyBhbmQgbXVjaCB0ZXN0aW5nLgotCi1BbGFuIE1vZHJhIHJld29ya2VkIG11Y2ggb2YgdGhlIGkzODYgYmFja2VuZCwgaW1wcm92aW5nIHRoZSBlcnJvcgotY2hlY2tpbmcsIHVwZGF0aW5nIHRoZSBjb2RlLCBhbmQgaW1wcm92aW5nIHRoZSAxNiBiaXQgc3VwcG9ydCwgdXNpbmcKLXBhdGNoZXMgZnJvbSB0aGUgd29yayBvZiBNYXJ0eW5hcyBLdW5pZ2VsaXMgYW5kIEguSi4gTHUuCi0KLU1hbnkgb3RoZXJzIGhhdmUgY29udHJpYnV0ZWQgbGFyZ2Ugb3Igc21hbGwgYnVnZml4ZXMgYW5kIGVuaGFuY2VtZW50cy4gIElmCi15b3UndmUgY29udHJpYnV0ZWQgc2lnbmlmaWNhbnQgd29yayBhbmQgYXJlIG5vdCBtZW50aW9uZWQgb24gdGhpcyBsaXN0LCBhbmQKLXdhbnQgdG8gYmUsIGxldCB1cyBrbm93LiAgU29tZSBvZiB0aGUgaGlzdG9yeSBoYXMgYmVlbiBsb3N0OyB3ZSBhcmVuJ3QKLWludGVudGlvbmFsbHkgbGVhdmluZyBhbnlvbmUgb3V0LgpkaWZmIC0tZ2l0IGEvZ2FzL0NPUFlJTkcgYi9nYXMvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NDliZS4uMDAwMDAwMAotLS0gYS9nYXMvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2dhcy9DaGFuZ2VMb2cgYi9nYXMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2UzNzg1Li4wMDAwMDAwCi0tLSBhL2dhcy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzODkyICswLDAgQEAKLTE5OTktMDctMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IFVzZSBzeW1ib2xfZ2V0X29iaigpIHJhdGVociB0aGFuCi0JYWNjZXNzaW5nIHN5bWJvbFAgZGlyZWN0bHkuCi0KLVR1ZSBKdWwgIDYgMTA6NDE6NDIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX3N5bWJvbCk6IEFsd2F5cyBwdW50ICIkZ2xvYmFsJCIgc3ltYm9sCi0JZm9yIEVMRi4KLQotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChBUk1fRVhUX1Y1KTogRGVmaW5lLgotCShBUk1fQVJDSF9WNSwgQVJNX0FSQ0hfVjVUKTogRGVmaW5lLgotCShtZF9iZWdpbik6IERldGVjdCBBUk0gdjUgYXJjaGl0ZWN0dXJlcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IGFybSB2NSBzcGVjaWZpY2F0aW9uLgotCShtZF9zaG93X3VzYWdlKTogRG9jdW1tZW50IC1tYXJtdjUgc3dpdGNoLgotCi0JKiBkb2MvYy1hcm0udGV4aTogRG9jdW1lbnQgLW1hcm12NSBjb21tYW5kIGxpbmUgb3B0aW9uLgotCQotCSogY29uZmlnL3RjLWFybS5jIChkb19hZHJsKTogTmV3IGZ1bmN0aW9uLiAgSW1wbGVtZW50IEFEUkwgcHNldWRvCi0Jb3AuCi0JKHZhbGlkYXRlX2ltbWVkaWF0ZV90d29wYXJ0KTogTmV3IGZ1bmN0aW9uLiAgRGV0ZXJtaW5lIGlmIGEKLQljb25zdGFudCBjYW4gYmUgY29tcHV0ZWQgYnkgdHdvIEFERCBpbnN0cnVjdGlvbnMuCi0JKG91dHB1dF9pbnN0KTogUmVtb3ZlIGl0cyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIC0gaXQgd2FzIG5ldmVyCi0JdXNlZC4KLQkobWRfYXBwbHlfZml4Myk6IFN1cHBvcnQgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURSwgdXNlZCB0bwotCWltcGxlbWVtdCB0aGUgQURSTCBwc2V1ZG8gb3AuCi0JKHRjX2dlbl9yZWxvYyk6IEdlbmVyYXRlIGEgc3VpdGFibGUgZXJyb3IgbWVzc2FnZSBpZiBhbiBBRFJMCi0JaW5zdHJ1Y3Rpb24gdHJpZXMgdG8gZ2VuZXJhdGUgYSByZWFsIHJlbG9jLgotCi0JKiBkb2MvYy1hcm0udGV4aTogRG9jdW1lbnQgTk9QLCBBRFIgYW5kIEFEUkwgcHNldWRvIG9wcy4KLQotVGh1IEp1bCAgMSAxNTozMzoxMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogQ29udmVydCB0aGUgb3Bjb2RlIGFuZCBhbGwgY29tcGxldGVycwotCWludG8gbG93ZXIgY2FzZS4KLQotMTk5OS0wNi0yNyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ190ZXh0X3ApOiBVc2UgMS8wIGluc3RlYWQgb2YgdHJ1ZS9mYWxzZSBmb3IKLQlub24gQkZEX0FTU0VNQkxFUiBjYXNlLgotCi0xOTk5LTA2LTI2ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBNYXJrIHdyaXRhYmxlIHNlY3Rpb25zIGFzCi0JZGF0YS4KLQotMTk5OS0wNi0yNiAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IERvbid0IGNhbGwKLQlvdXRfZW5kX3NlcXVlbmNlKCkgd2hlbiB0aGUgYWRkcmVzcyBkZWNyZWFzZXMgZHVlIHRvIGEgbmV3IGZyYWcuCi0JKGdlbl9kaXJfbGlzdCk6IFNldCBscy5maWxlW2ldLmRpciB0byBqICsgMSAobm90IGopIGJlY2F1c2UgZmlsZQotCW51bWJlcmluZyBzdGFydHMgd2l0aCAxLgotCi0xOTk5LTA2LTIzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIC5jb21tIGZvciBFTEYgYW5kIGFsbG93Ci0JLnNlY3Rpb24gZm9yIENPRkYuCi0JKG1jb3JlX3NfdGV4dCk6IENhbGwgb2JqX2VsZl90ZXh0IGZvciBFTEYgdGFyZ2V0LgotCShtY29yZV9zX2RhdGEpOiBDYWxsIG9ial9lbGZfZGF0YSBmb3IgRUxGIHRhcmdldC4KLQkobWNvcmVfc19zZWN0aW9uKTogTm8gbG9uZ2VyIEVMRiBzcGVjaWZpYy4gIENhbGwgb2JqX2NvZmZfc2VjdGlvbgotCWZvciBDT0ZGIHRhcmdldC4KLQkobWNvcmVfc19ic3MpOiBOZXcgZnVuY3Rpb246ICBEdW1wIGxpdGVyYWwgdGFibGUgYmVmb3JlIGNoYW5naW5nCi0Jc2VjdGlvbnMuCi0JKG1jb3JlX3NfY29tbSk6IE5ldyBmdW5jdGlvbjogIER1bXAgbGl0ZXJhbCB0YWJsZSBiZWZvcmUgY2hhbmdpbmcKLQlzZWN0aW9ucy4KLQkKLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uLCBvYmpfZWxmX2RhdGEsIG9ial9lbGZfdGV4dCk6Ci0JTm8gbG9uZ2VyIHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX2NvbW1vbiwgb2JqX2VsZl9kYXRhLCBvYmpfZWxmX3RleHQpOgotCVByb3ZpZGUgcHJvdG90eXBlcyBmb3IgdGhlc2UgZnVuY3Rpb25zLgotCi0xOTk5LTA2LTIyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfdGV4dF9wKTogUmV3cml0ZSBub24gQkZEX0FTU0VNQkxFUiBjYXNlIHRvIHVzZQotCWEgbGlzdCBvZiBuYW1lcywgdG8gdHJ5IG9ial9zZWdtZW50X25hbWUsIGFuZCB0byB0cnkgYWJicmV2aWF0ZWQKLQluYW1lcyB3aGVuIHVzaW5nIENPRkYgd2l0aG91dCBsb25nIHNlY3Rpb24gbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBNb3JlIHVzZSBvZiBzeW1ib2wgYWNjZXNzb3IgZnVuY3Rpb25zLgotCSogY29uZmlnL3RjLWFyYy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWZyMzAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTg2MC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1jb3JlLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1hcmMuYyAoZ2V0X2FyY19leHBfcmVsb2NfdHlwZSk6IENoYW5nZSB1c2VzIG9mCi0Jc3lfdmFsdWUgd2l0aCBhcHByb3ByaWF0ZSBhY2Nlc3NvciBmdW5jdGlvbnMuCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKEFUX1dPUkRfUCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX2Vjb2ZmX3NldF9leHQpOiBDaGFuZ2UgdXNlcyBvZiBic3ltIHRvCi0JdXNlIHN5bWJvbF9nZXRfYmZkc3ltIGluc3RlYWQuCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2NvbW0pOiBMaWtld2lzZS4KLQotMTk5OS0wNi0yMiAgSm9uYXRoYW4gTGFybW91ciAgPGpsYXJtb3VyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFyYy5jICh0Y19nZW5fcmVsb2MpOiBVc2Ugc3ltYm9sX2dldF9iZmRzeW0gdG8gZ2V0IGF0Ci0JdGhlIHN5bWJvbCwgcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBic3ltIG1lbWJlci4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWQzMHYuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWNvcmUuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXRpYzMwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMjEgMTY6NDU6MTkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGUpOiBSZW5hbWVkIGZyb20gZWxmMzJfaHBwYV9yZWxvY190eXBlLgotCShocHBhX2dlbl9yZWxvY190eXBlKTogQ29uZGl0aW9uYWxpemUgb24gQkZENjQuCi0JKHRjX2dlbl9yZWxvYyk6IFJlLWVuYWJsZSBFTEYgcmVsb2NhdGlvbnMuCi0JKiB0Yy1ocHBhLmggKFRBUkdFVF9GT1JNQVQpOiBIYW5kbGUgZWxmNjQtaHBwYSBmb3JtYXQuCi0KLTE5OTktMDYtMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGxkc3RfZXh0ZW5kKTogQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkCi0Jd2FybmluZy4KLQkoZG9fbGRzdCk6IE1vdmUgYXNzaWdubWVudCBvdXQgb2YgaWYgY29uZGl0aW9uLgotCShtZF9hcHBseV9maXgzKTogQWRkIGNhc3RzIHRvIGF2b2lkIHByaW50ZiBmb3JtYXQgd2FybmluZ3MuICBBZGQKLQlwYXJlbnRoZXNlcyB0byBhdm9pZCB3YXJuaW5nLgotCi0xOTk5LTA2LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogVXNlIHN5bWJvbF9nZXRfYmZkc3ltKCkKLQltYWNybyB0byBnZXQgYXQgdGhlIEJGRCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgR0FTIHN5bWJvbC4KLQotMTk5OS0wNi0xOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYzogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBMaWtld2lzZS4KLQotRnJpIEp1biAxOCAxNDozNDoxOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYzogR2VuZXJhbCBjbGVhbnVwcyBvZiBFTEYgc3VwcG9ydC4gIE5vIG1vcmUgc3BhY2VzCi0JYW5kIHN1YnNwYWNlcyBmb3IgRUxGLgotCShHREJfREVCVUdfU1BBQ0VfTkFNRSk6IERlbGV0ZSBkZWZpbml0aW9uIGZvciBFTEYuCi0JKEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUpOiBMaWtld2lzZS4KLQkoR0RCX1NZTUJPTFNfU1VCU1BBQ0VfTkFNRSk6IExpa2V3aXNlCi0JKFVOV0lORF9TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoc3BhY2Uvc3Vic3BhY2UgcmVsYXRlZCBzdHJ1Y3R1cmVzKTogQ29uZGl0aW9uYWxpemUgZGVmaW5pdGlvbnMKLQlvbiBPQkpfU09NLgotCShzcGFjZS9zdWJzcGFjZSBkaXJlY3RpdmVzIGFuZCBzdXBwb3J0IHJvdXRpbmVzKTogQ29uZGl0aW9uYWxpemUKLQlkZWZpbml0aW9ucyBhbmQgcmVmZXJlbmNlcy91c2VzIG9uIE9CSl9TT00uCi0JKGxhYmVsX3N5bWJvbF9zdHJ1Y3QpOiBGb3IgRUxGLCB0cmFjayB0aGUgc3ltYm9sJ3Mgc2VnbWVudC4gIEZvcgotCVNPTSB0cmFjayBpdHMgc3BhY2UuCi0JKHBhX2RlZmluZV9sYWJlbCwgcGFfdW5kZWZpbmVfbGFiZWwsIHBhX2dldF9sYWJlbCk6IENvcnJlc3BvbmRpbmcKLQljaGFuZ2VzLgotCShVU0VfQUxJQVNFUyk6IEtpbGwgZm9yIGJvdGggU09NICYgRUxGLgotCShwYV9kZWZfc3Vic3BhY2VzLCBwYV9kZWZfc3BhY2VzKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShwYV9zcGFjZSwgcGFfc3Vic3BhY2UpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKHBhX3NwYWNlc19iZWdpbik6IENvcnJlc3BvbmRpbmcgY2hhZ25lcy4KLQkobWRfYmVnaW4pOiBEbyBub3QgbXVjayBhcm91bmQgd2l0aCBzcGFjZS9zdWJzcGFjZSBzdHVmZiBmb3IKLQlPQkpfRUxGLgotCShtZF9hcHBseV9maXgpOiBUZW1wb3JhcmlseSBkaXNhYmxlIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1ZmYKLQlmb3IgT0JKX0VMRi4KLQkodGNfZ2VuX3JlbG9jKTogVGVtcG9yYXJpbHkgZGlzYWJsZSByZWxvY2F0aW9uIGdlbmVyYXRpb24gZm9yCi0JT0JKX0VMRgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBTaW1pbGFybHkuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodGh1bWJfc2V0KTogTmV3IHBzZXVkbyBvcC4KLQkodGV4dCwgZGF0YSwgc2VjdGlvbik6IE92ZXJyaWRlIHRoZXNlIHBzZXVkbyBvcHMgd2l0aCBBUk0KLQlzcGVjaWZpYyB2ZXJzaW9ucy4KLQkoc190aHVtYl9zZXQpOiBOZXcgZnVuY3Rpb246IFBlcmZvcm0gdGhlIHNhbWUgYXMgYSAuc2V0IHBzZXVkbwotCW9wLCBidXQgYWxzbyBtYXJrIHRoZSBhbGlhcydlZCBzeW1ib2wgYXMgYmVpbmcgYSBUaHVtYgotCWZ1bmN0aW9uLgotCShhcm1fc190ZXh0KTogTmV3IGZ1bmN0aW9uOiBQZXJmb3JtIHRoZSBzYW1lIGFzIHRoZSAudGV4dAotCXBzZXVkbyBvcCwgYnV0IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUgY2hhbmdpbmcKLQlzZWN0aW9ucy4gCi0JKGFybV9zX2RhdGEpOiBOZXcgZnVuY3Rpb246IFBlcmZvcm0gdGhlIHNhbWUgYXMgdGhlIC5kYXRhCi0JcHNldWRvIG9wLCBidXQgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGJlZm9yZSBjaGFuZ2luZwotCXNlY3Rpb25zLiAKLQkoYXJtX3Nfc2VjdGlvbik6IE5ldyBmdW5jdGlvbjogUGVyZm9ybSB0aGUgc2FtZSBhcyB0aGUKLQkuc2VjdGlvbiBwc2V1ZG8gb3AsIGJ1dCBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVmb3JlIGNoYW5naW5nIAotCXNlY3Rpb25zLiAKLQkoYXJtX2NsZWFudXApOiBEbyBub3QgcmVzZXQgdGhlIGN1cnJlbnQgc2VjdGlvbiBiZWZvcmUgZHVtcGluZwotCXRoZSBsaXRlcmFsIHBvb2wuCi0KLTE5OTktMDYtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2xvbmdvcHRzKTogRml4IE9QVElPTl9XQVJOX1VOTUFUQ0hFRCBhbmQKLQlPUFRJT05fTk9fV0FSTl9VTk1BVENIRUQgZW50cmllcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogR2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYW4gdW5yZWNvZ25pc2VkCi0Jb3B0aW9uIGlzIGVuY291bnRlcmVkLgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkb19ub3RfaWdub3JlX2hhc2gpOiBOZXcgdmFyaWFibGUuCi0JKGdldF9vcGVyYW5kcyk6IFdoZW4gcGFyc2luZyBhbiBleHByZXNzaW9uIGFmdGVyIGFuICdAJyBzeW1ib2wKLQloYXMgYmVlbiBkZXRlY3RlZCwgZG8gbm90IGlnbm9yZSAnIycgc3ltYm9scy4KLQkobWRfb3BlcmFuZCk6IE9ubHkgaWdub3JlICcjJyBzeW1ib2xzIGlmIGRvX25vdF9pZ25vcmVfaGFzaCBpcwotCWZhbHNlLiAKLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEsuIFJpY2hhcmQgUGl4bGV5IDxyaWNoQG5vaXIuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAocHBjLSotdnh3b3JrcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEyICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZiBHT1RQQyByZWxvY3MuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFJhdGhlciB0aGFuIG5ldmVyIHJlZHVjaW5nIHJlbG9jCi0Jd2hpY2ggcmVmZXIgdG8gc3ltYm9scyBpbiBsaW5rb25jZSBzZWN0aW9ucywgcGVybWl0IHJlZHVjaW5nIHRoZQotCXJlbG9jcyBpZiB0aGUgc3ltYm9sIGlzIGxvY2FsLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfdGV4dF9wKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoc3Vic2VnX3RleHRfcCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGRvX2FsaWduKTogVXNlIHN1YnNlZ190ZXh0X3AgdG8gc2V0IHRoZSBkZWZhdWx0IGZpbGwuCi0JKiB3cml0ZS5jIChzdWJzZWdzX2ZpbmlzaCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9tYXliZV90ZXh0KTogRG9uJ3QgZGVmaW5lLgotCShtZF9kb19hbGlnbik6IFVzZSBzdWJzZWdfdGV4dF9wIHRvIHNldCB0aGUgZGVmYXVsdCBmaWxsLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQotMTk5OS0wNi0xMiAgRGF2aWQgTydCcmllbiAgPG9icmllbkBmcmVlYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmluOiAoaVszNDU2XTg2LSotZnJlZWJzZCopOiBOb3cgZGVmYXVsdHMgdG8gRUxGLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZHdhcmYyZGJnLmM6IEluY2x1ZGUgZWxmL2R3YXJmMi5oIHdpdGggIiIsIG5vdCA8Pi4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ltbWVkaWF0ZSk6IFJlbW92ZSB1bnVzZWQgbGFiZWwKLQlzZWdfdW5pbXBsZW1lbnRlZC4KLQotCSogc3RydWMtc3ltYm9sLmg6IFB1dCBsb2NhbF9zeW1ib2wgY29kZSBpbiBpZmRlZiBCRkRfQVNTRU1CTEVSLgotCSogc3ltYm9scy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogUmVmZXIgZGlyZWN0bHkgdG8KLQlzeV9uZXh0IGZpZWxkIHdoZW4gdGFraW5nIGFkZHJlc3MsIHJhdGhlciB0aGFuIHN5bWJvbF9uZXh0LgotCi0JKiBkd2FyZjJkYmcuYzogQ2hhbmdlIGJmZF92bWEgdG8gYWRkcmVzc1QgYW5kIGJmZF9zaWduZWRfdm1hIHRvCi0Jb2Zmc2V0VC4KLQkob3V0X3NldF9hZGRyKTogRG9uJ3QgdXNlIEJZVEVTX1BFUl9BRERSRVNTLiAgSW5zdGVhZCwgZ2V0IHRoZQotCXZhbHVlIGZyb20gdGhlIG91dHB1dCBmaWxlIGFyY2hpdGVjdHVyZS4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBJZmRlZiBCRkRfQVNTRU1CTEVSIHNwZWNpZmljIGNvZGUuCi0JKiBkd2FyZjJkYmcuaDogQ2hhbmdlIGJmZF92bWEgdG8gYWRkcmVzc1QuCi0KLTE5OTktMDYtMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkd2FyZjJkYmcuaDogVXNlIFBBUkFNUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0KLTE5OTktMDYtMTEgIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIGZvciBpOTYwIEVMRi4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHNfbGVhZnByb2MpOiBEb24ndCBjYWxsIHRjX3NldF9iYWxfb2ZfY2FsIGlmCi0JT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4KTogU2ltcGxpZnkgQkZEX0FTU0VNQkxFUiBoYW5kbGluZy4KLQotMTk5OS0wNi0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IFJlbW92ZSBwdXNoc2VjdGlvbiBhbmQKLQlwb3BzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHJlbG9jIHN3aXRjaC4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBPbmx5IGRlY2xhcmUgaW5lc2NhcGUgaWYKLQlRVU9URVNfSU5fSU5TTi4KLQotCSogaXRibC1vcHMuYyAoaXRibF9kaXNhc3NlbWJsZSk6IENoYW5nZSBzcHJpbnRmIGZvcm1hdCBzdHJpbmdzIHRvCi0JbWF0Y2ggcGFyYW1ldGVycy4KLQkoZmluZF9lbnRyeV9ieXZhbCk6IEFkZCBwYXJlbnMgdG8gYXZvaWQgd2FybmluZy4KLQotCSogYXMuYzogSWYgSEFWRV9JVEJMX0NQVSwgaW5jbHVkZSAiaXRibC1vcHMuaCIuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBEb24ndCBwZXJtaXQgc3VidHJhY3Rpb24gb2YKLQl1bmRlZmluZWQgc3ltYm9scy4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0gICAgICAgICogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRG9uJ3QgdXNlIHNpZGUtZWZmZWN0IGV4cHJlc3Npb24KLQl3aXRoIGlzb2N0YWwuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzeW50aGV0aXplX3NldHV3LCBzeW50aGV0aXplX3NldHN3LAotCXN5bnRoZXRpemVfc2V0eCk6IE5ldyBmdW5jdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogQnJva2VuIHRoZSBzcGVjaWFsIGNhc2VzIGludG8gdGhlIGFib3ZlCi0JZnVuY3Rpb25zLiBNYWtlIGNvbXBpbGVyIGhhcHB5IGlmIHNpemVvZihiZmRfdm1hKT09NC4KLQlGaXggc2V0aGkgZ2VuZXJhdGVkIGZyb20gc2V0L3NldHV3LiBJZiBpbnN0cnVjdGlvbnMgaGF2ZSBhIHJlbGxvYywKLQlhbHdheXMgY2xlYXIgdGhlIGZpZWxkcyB0byBiZSByZWxvY2F0ZWQgaW4gdGhlIG9wY29kZS4KLQkoc3BhcmNfaXApOiBSZW1vdmUgc3BlY2lhbF9jYXNlIGdsb2JhbCB2YXJpYWJsZS4KLQotMTk5OS0wNi0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSm9obiBXLiBXb3puYWNrIDxqd296bmFja0Bjb25jZW50cmljLm5ldD46Ci0JKiBpdGJsLW9wcy5jIChpdGJsX2dldF9yZWdfdmFsKTogQWRkIHB2YWwgcGFyYW1ldGVyLiAgUmV0dXJuCi0JaW5kaWNhdGlvbiBvZiBzdWNjZXNzIHJhdGhlciB0aGFuIGEgdmFsdWUuCi0JKGl0YmxfZ2V0X3ZhbCk6IExpa2V3aXNlLgotCShpdGJsX2dldF9maWVsZCk6IFVzZSBzdHJjc3BuLiAgQ2hhbmdlIGRlbGltaXRlcnMgdG8gaW5jbHVkZQotCXBhcmVucy4KLQkqIGl0Ymwtb3BzLmggKGl0YmxfZ2V0X3JlZ192YWwpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGl0YmxfZ2V0X3ZhbCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFVwZGF0ZSBjYWxsIHRvIGl0YmxfZ2V0X3JlZ192YWwuCi0KLQkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IENvbnZlcnQgbG9jYWwgc3ltYm9scyB0bwotCXJlZ3VsYXIgc3ltYm9scy4KLQotMTk5OS0wNi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgQVJNOTIwIGFuZAotCUFSTTkyMHQuIAotCi0xOTk5LTA2LTA3ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hc3NlbWJsZSk6IEZpeCB1cCBzZXR4LCBzdXBwb3J0IHNldHN3LgotCU9wdGltaXplIHNldCBpZiBzaXplb2YoYmZkX3ZtYSkgPT0gNjQuCi0JKHNwYXJjX2lwKTogRml4IHNldGhpIC0gd2l0aG91dCAlaGkoKSBpdCBzaG91bGQgZ2VuZXJhdGUKLQlSX1NQQVJDXzIyIHJlbG9jLCBub3QgUl9TUEFSQ19ISTIyLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDMjIuCi0KLTE5OTktMDYtMDcgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2JlZ2luKTogSGFuZGxlIG5hdGl2ZSB3b3Jkc2l6ZSBhbGlhc2VzLgotCShzX25jb25zKTogTmV3IGZ1bmN0aW9uLgotCShuYXRpdmVfb3BfdGFibGUpOiBOZXcgdGFibGUuCi0JKHNwYXJjX2lwKTogQmUgbW9yZSBzdHJpY3Qgb24gJWhpKCkgZXRjLjsgcHJlcGFyZSBhc3NlbWJsZXIgZm9yCi0JUl9TUEFSQ19PTE8xMCBoYW5kbGluZy4KLQotTW9uIEp1biAgNyAxMDoyMjoxNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBleHByLmggKHN0cnVjdCBleHByZXNzaW9uUyk6IFJldmVydCBsYXN0IGNoYW5nZTsgd2lkZW4gWF9vcC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9iZWdpbik6IENoZWNrIHRoZSBmaWVsZCBpcyB3aWRlIGVub3VnaC4KLQotTW9uIEp1biAgNyAxMToyNToxNiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCBjb25maWcvdGMtZnIzMC5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCBjb25maWcvdGMtZnIzMC5oLgotCShUQVJHX0VOVl9IRklMRVMpOiBBZGQgY29uZmlnL3RlLWVwb2MtcGUuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBJbiBNUkkgbW9kZSBpZiBjYWxsZWQgYXMKLQlgY29tbW9uJyBwYXNzIG9uIHRvIHNfbXJpX2NvbW1vbi4KLQkoZWxmX3BzZXVkb190YWJsZSk6IFBhc3MgMSB0byBvYmpfZWxmX2NvbW1vbiBmb3IgYGNvbW1vbicuIAotCi0xOTk5LTA2LTA2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBEb24ndCBmcmVlIHRoZSByZXR1cm4KLQl2YWx1ZSBvZiBkZW1hbmRfY29weV9DX3N0cmluZy4KLQotMTk5OS0wNi0wNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogTWlycm9yIHRoZSBzZWN0aW9uIHN5bWJvbAotCWNyZWF0aW9uIGxvZ2ljIGZyb20gb2JqX2VsZl9jcmVhdGVfc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWIpOiBBZGQgcHVzaHNlY3Rpb24vcG9wc2VjdGlvbi4KLQkoc2VjdGlvbl9zdGFjayk6IE5ldy4KLQkoc3BlY2lhbF9zZWN0aW9ucyk6IE1ha2UgY29uc3QuCi0JKG9ial9lbGZfc2VjdGlvbik6IEd1dCBhbmQgcmV3cml0ZSBwYXJzaW5nLgotCShvYmpfZWxmX2NoYW5nZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIGJyb2tlbiBvdXQgb2Ygb2JqX2VsZl9zZWN0aW9uLgotCShvYmpfZWxmX3BhcnNlX3NlY3Rpb25fbGV0dGVycyk6IExpa2V3aXNlLgotCShvYmpfZWxmX3NlY3Rpb25fd29yZCk6IExpa2V3aXNlLgotCShvYmpfZWxmX3NlY3Rpb25fdHlwZSk6IExpa2V3aXNlLgotCShvYmpfZWxmX3ByZXZpb3VzKTogVHJlYXQgYXMgYSB0b2dnbGUuCi0JKG9ial9lbGZfcG9wc2VjdGlvbik6IE5ldy4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NlY3Rpb25fd29yZCk6IFRha2Ugc3RyK2xlbiBub3QgcHRyX3N0ci4KLQkocHBjX3NlY3Rpb25fdHlwZSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXBwYy5oOiBMaWtld2lzZS4KLQotCSogZXhwci5oIChzdHJ1Y3QgZXhwcmVzc2lvblMpOiBEb24ndCBtYWtlIFhfb3AgYSBiaXRmaWVsZC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBVcGRhdGUgZm9yIHN5bWJvbCBoYW5kbGluZyBjaGFuZ2VzLgotCShtZF9hcHBseV9maXgpIFtjYXNlIEdQUkVMXTogVXNlIG5vd19zZWcgaW5zdGVhZCBvZiBhYnNvbHV0ZV9zZWN0aW9uLgotCShsb2FkX2V4cHJlc3Npb24sIGVtaXRfaXJfbG9hZCwgZW1pdF9sb2Fkc3RvcmUsIGVtaXRfanNyam1wKTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMDUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jICgqKTogQ29udmVydCB0byBLJlIgKyBwcm90b3R5cGVzLgotCShkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IEtpbGwgdW51c2VkIHZhcmlhYmxlcy4KLQkoZHdhcmYyX2ZpbmlzaCk6IExpa2V3aXNlLgotCShkd2FyZjJfd2hlcmUpOiBMaWtld2lzZS4KLQkoZHdhcmYyX2RpcmVjdGl2ZV9maWxlKTogSWYgd2UndmUgb25seSBnb3QgYSBzdHJpbmcsCi0JaGFuZCBvZmYgdG8gc19hcHBfZmlsZS4KLQkqIGVjb2ZmLmM6IE1vdmUgdGhlIGluY2x1ZGUgb2YgZWNvZmYuaC4KLQkqIHN5bWJvbHMuaCAoU19JU19GVU5DVElPTik6IFByb3RvdHlwZS4KLQotCSogcmVhZC5jIChMRVhfSEFTSCk6IFN1cHBseSBhIGRlZmF1bHQuCi0JKGxleF90eXBlKTogVXNlIGl0LgotCShzX2dsb2JsKTogVXBkYXRlIGBjJyBhZnRlciBza2lwcGluZyB3aGl0ZXNwYWNlLgotCSogcmVhZC5oIChMRVhfRU5EX05BTUUsIGlzX25hbWVfZW5kZXIpOiBOZXcuCi0JKiBleHByLmMgKGdldF9zeW1ib2xfZW5kKTogUmVzcGVjdCBpdC4KLQotMTk5OS0wNi0wNCAgTWFyayBLbGVpbiA8bWtsZWluQGRpcy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogQ29udmVydCBsb2NhbCBzeW1ib2wgZHVtbXlfc3ltYm9sCi0JdG8gcmVhbCBpZiBPQkpfU09NCi0JKHRjX2dlbl9yZWxvYyk6IFN0aWxsIG5lZWQgYmZkX2Fic19zeW1ib2wgaW4gc29tZSByZWxvY3MuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjZ2VuLmM6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKiBjb25maWcvdGMtbTMyci5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYXJtLmg6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKiBjb25maWcvdGMtYXJtLmM6IExpa2V3aXNlLgotCShzeW1ib2xfbWFrZV9lbXB0eSk6IFJlbW92ZS4gIEp1c3QgdXNlIHN5bWJvbF9jcmVhdGUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX3NldF90Yyk6IENvcnJlY3QgbmFtZS4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSgkKE9CSlMpKTogRG9uJ3QgZGVwZW5kIHVwb24gc3RydWMtc3ltYm9sLmguCi0JKC5kZXAxLCAudGNkZXAsIC5vYmpkZXApOiBDcmVhdGUgaXRibC1wYXJzZS5oLgotCSogZGVwLWluLnNlZDogRG9uJ3QgcmVtb3ZlIHN0cnVjLXN5bWJvbC5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoU3ltYm9scyk6IERlc2NyaWJlIGNoYW5nZXMgaW4gc3ltYm9sCi0JaGFuZGxpbmcuCi0KLTE5OTktMDYtMDMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IFVzZSBzZWN0aW9uX3N5bWJvbAotCWluc3RlYWQgb2YgZG9pbmcgdGhlIHdvcmsgYnkgaGFuZC4KLQotMTk5OS0wNi0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChJTklUSUFMX1NUQVRFKTogTmV3IG1hY3JvIGVuY2Fwc3VsYXRpbmcgaW5pdGlhbAotCXN0YXRlIG9mIGxpbmUgc3RhdGUtbWFjaGluZS4KLQkoc3RydWN0IGxzKTogQ29sbGVjdCBEV0FSRjIgbGluZSBzdGF0ZS1tYWNoaW5lIHN0YXRlIGluIG5ldyBtZW1iZXIKLQlTTS4gIEFkZCBtZW1iZXIgRU1QVFlfU0VRVUVOQ0UgdG8ga2VlcCB0cmFjayBpZiBhIGNvZGUgc2VxdWVuY2UKLQlyZXN1bHRlZCBpbiBhbnkgRFdBUkYyIGRpcmVjdGl2ZXMuCi0JKHJlc2V0X3N0YXRlX21hY2hpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKG91dF9lbmRfc2VxdWVuY2UpOiBEaXR0by4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBXaGVuIHN3aXRjaGluZyBzZWN0aW9ucyBvciBzd2l0Y2hpbmcgdG8gYQotCWxvd2VyIHRleHQgYWRkcmVzcywgY2FsbCBvdXRfZW5kX3NlcXVlbmNlKCkgZmlyc3QgdG8gdGVybWluYXRlIHRoZQotCXByZXZpb3VzIGNvZGUgc2VxdWVuY2UgYXMgY29kZSBzZXF1ZW5jZXMgTVVTVCBoYXZlIG1vbm90b25pY2FsbHkKLQlpbmNyZWFzaW5nIGFkZHJlc3Nlcy4KLQkoZHdhcmYyX2ZpbmlzaCk6IENhbGwgb3V0X2VuZF9zZXF1ZW5jZSgpIGluc3RlYWQgb2Ygb3BlbiBjb2RpbmcgaXQuCi0KLTE5OTktMDYtMDMgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIG9wdGlvbiAtZ2R3YXJmMiB0byBhbGxvdyByZXF1ZXN0aW5nCi0JRFdBUkYyIGRlYnVnIGluZm8gKGxpbmUgaW5mb3JtYXRpb24gb25seSwgYXQgdGhpcyBwb2ludCkuCi0JKiBhcy5oOiBVcGRhdGUgY29tbWVudCBhYm91dCBzdXBwb3J0ZWQgZGVidWcgZm9ybWF0cy4KLQkqIGR3YXJmMmRiZy5jLCBkd2FyZjJkYmcuaDogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuYW0gKEdBU19DRklMRVMsIEhGSUxFUywgR0VORVJJQ19PQkpTKTogQWRkIHRoZW0uCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IERvbid0IHVzZSBbIGZvciBwYXJlbnMgaWYgd2Ugd2FudCBhbiBpbmRleCBvcC4KLQkob3BfZW5jb2RpbmcpOiBTd2l0Y2ggWyBpbnRvIE9faW5kZXgsIGlmIGRlc2lyZWQuCi0JKG9wX3JhbmspOiBSZW51bWJlciB3aXRoIE9faW5kZXggb24gYm90dG9tLgotCShleHByKTogSWYgT19pbmRleCwgbWF0Y2ggY2xvc2luZyBicmFja2V0LgotCSogZXhwci5oIChPX2luZGV4KTogTmV3LgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENvbmRpdGlvbmFsbHkgYWxsb3cgbWF0Y2hlZCAiCi0JaW4gbGluZXMgcGFzc2VkIHRvIG1kX2Fzc2VtYmxlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkIGBjb21tb24nLgotCi0xOTk5LTA2LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBzdG9yaW5nIGxvY2FsIHN5bWJvbHMgaW4gYSBzbWFsbCBzdHJ1Y3R1cmUgdG8gc2F2ZQotCW1lbW9yeSB3aGVuIGFzc2VtYmxpbmcgbGFyZ2UgZmlsZXMuCi0JKiBhcy5oOiBEb24ndCBpbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShzeW1ib2xTKTogQWRkIHR5cGVkZWYuCi0JKiBzeW1ib2xzLmM6IEluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKGxvY2FsX2hhc2gpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzYXZlX3N5bWJvbF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgZnJvbSBzeW1ib2xfY3JlYXRlLgotCShzeW1ib2xfY3JlYXRlKTogQ2FsbCBzYXZlX3N5bWJvbF9uYW1lLgotCShsb2NhbF9zeW1ib2xfY291bnQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb2NhbF9zeW1ib2xfY29udmVyc2lvbl9jb3VudCk6IExpa2V3aXNlLgotCShMT0NBTF9TWU1CT0xfQ0hFQ0spOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9tYWtlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobG9jYWxfc3ltYm9sX2NvbnZlcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2xvbik6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLiAgQ3JlYXRlIGxvY2FsIHN5bWJvbCBmb3IgbG9jYWwKLQlsYWJlbCBuYW1lLgotCShzeW1ib2xfdGFibGVfaW5zZXJ0KTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuCi0JKHN5bWJvbF9maW5kX29yX21ha2UpOiBDcmVhdGUgbG9jYWwgc3ltYm9sIGZvciBsb2NhbCBsYWJlbCBuYW1lLgotCShzeW1ib2xfZmluZF9iYXNlKTogQ2hlY2sgZm9yIGxvY2FsIHN5bWJvbC4KLQkoc3ltYm9sX2FwcGVuZCwgc3ltYm9sX2luc2VydCk6IENoZWNrIGZvciBsb2NhbCBzeW1ib2xzLgotCShzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycywgc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgotCSh2ZXJpZnlfc3ltYm9sX2NoYWluKTogTGlrZXdpc2UuCi0JKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgbG9jYWwgc3ltYm9scy4KLQkocmVzb2x2ZV9sb2NhbF9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShyZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLgotCShTX0lTX0ZVTkNUSU9OLCBTX0lTX0VYVEVSTkFMLCBTX0lTX1dFQUssIFNfSVNfQ09NTU9OKTogTGlrZXdpc2UuCi0JKFNfSVNfREVGSU5FRCwgU19JU19ERUJVRywgU19JU19MT0NBTCwgU19HRVRfTkFNRSk6IExpa2V3aXNlLgotCShTX0dFVF9TRUdNRU5ULCBTX1NFVF9TRUdNRU5ULCBTX1NFVF9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX0NMRUFSX0VYVEVSTkFMLCBTX1NFVF9XRUFLLCBTX1NFVF9OQU1FKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9wcmV2aW91cywgc3ltYm9sX25leHQpOiBOZXcgZnVuY3Rpb25zLgotCShzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQkoc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9zZXRfZnJhZywgc3ltYm9sX2dldF9mcmFnKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3VzZWQsIHN5bWJvbF9jbGVhcl91c2VkLCBzeW1ib2xfdXNlZF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MsIHN5bWJvbF91c2VkX2luX3JlbG9jX3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX21hcmtfbXJpX2NvbW1vbiwgc3ltYm9sX2NsZWFyX21yaV9jb21tb24pOiBMaWtld2lzZS4KLQkoc3ltYm9sX21yaV9jb21tb25fcCk6IExpa2V3aXNlLgotCShzeW1ib2xfbWFya193cml0dGVuLCBzeW1ib2xfY2xlYXJfd3JpdHRlbik6IExpa2V3aXNlLgotCShzeW1ib2xfd3JpdHRlbl9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3Jlc29sdmVkLCBzeW1ib2xfcmVzb2x2ZWRfcCk6IExpa2V3aXNlLgotCShzeW1ib2xfc2VjdGlvbl9wLCBzeW1ib2xfZXF1YXRlZF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9jb25zdGFudF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9nZXRfYmZkc3ltLCBzeW1ib2xfc2V0X2JmZHN5bSk6IExpa2V3aXNlLgotCShzeW1ib2xfZ2V0X29iaiwgc3ltYm9sX3NldF9vYmopOiBMaWtld2lzZS4KLQkoc3ltYm9sX2dldF90Yywgc3ltYm9sX3NldF90Yyk6IExpa2V3aXNlLgotCShzeW1ib2xfYmVnaW4pOiBJbml0aWFsaXplIGxvY2FsX2hhc2guCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuCi0JKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogUHJpbnQgbG9jYWwgc3ltYm9sIHN0YXRpc3RpY3MuCi0JKiBzeW1ib2xzLmg6IEluY2x1ZGUgInN0cnVjLXN5bWJvbC5oIiBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQlEZWNsYXJlIG5ldyBzeW1ib2xzLmMgZnVuY3Rpb25zLiAgTW92ZSBtYW55IGRlY2xhcmF0aW9ucyBoZXJlIGZyb20KLQlzdHJ1Yy1zeW1ib2wuaC4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IERlZmluZSBpZiBuZWVkZWQuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IERvbid0IHNldC4KLQkoc3RydWN0IHN5bWJvbCk6IE1vdmUgYnN5bSB0byBtYWtlIGl0IGNsZWFybHkgdGhlIGZpcnN0IGZpZWxkLgotCVJlbW92ZSBUQVJHRVRfU1lNQk9MX0ZJRUxEUy4KLQkoc3ltYm9sUyk6IERvbid0IHR5cGVkZWYuCi0JKHN0cnVjdCBicm9rZW5fd29yZCk6IFJlbW92ZS4KLQkoTl9UWVBFX3NlZywgc2VnX05fVFlQRSk6IE1vdmUgdG8gc3ltYm9sLmguCi0JKFNFR01FTlRfVE9fU1lNQk9MX1RZUEUsIE5fUkVHSVNURVIpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2luc2VydCwgc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgotCShzeW1ib2xfcHJldmlvdXMsIHN5bWJvbF9hcHBlbmQpOiBMaWtld2lzZS4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbiwgdmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBsb2NhbF9zeW1ib2wpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcCwgbG9jYWxfc3ltYm9sX21hcmtfY29udmVydGVkKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCwgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9nZXRfZnJhZywgbG9jYWxfc3ltYm9sX3NldF9mcmFnKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfZ2V0X3JlYWxfc3ltYm9sKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfc2V0X3JlYWxfc3ltYm9sKTogRGVmaW5lLgotCURlZmluZS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCByZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogQWRkIGxvY2FsIGZpZWxkLiAgSWYKLQlFQ09GRl9ERUJVR0dJTkcsIGFkZCBFQ09GRiBmaWVsZHMuCi0JKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUywgVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvb2JqLW11bHRpLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogQWRkIGxvY2FsIGZpZWxkLiAgSWYKLQlFQ09GRl9ERUJVR0dJTkcsIGFkZCBFQ09GRiBmaWVsZHMuCi0JKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUywgVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKEVDT0ZGX0RFQlVHX1RBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLW1jb3JlLmg6IERvbid0IGluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgbWNvcmVfdGNfc3kpOiBEZWZpbmUuCi0JKFRDX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUuCi0JKiBNYW55IGZpbGVzOiBVc2Ugc3ltYm9sUyBpbnN0ZWFkIG9mIHN0cnVjdCBzeW1ib2wuICBVc2UgbmV3Ci0JYWNjZXNzb3IgZnVuY3Rpb25zIHJhdGhlciB0aGFuIHJlZmVycmluZyB0byBzeW1ib2xTIGZpZWxkcwotCWRpcmVjdGx5LgotCi0JKiByZWFkLmMgKHNfbXJpX2NvbW1vbik6IERvbid0IGFkZCBpbiB2YWx1ZSBvZiBsaW5lX2xhYmVsLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gd2hlbgotCWNoZWNraW5nIGZvciBTRUNfTElOS19PTkNFLgotCi0JKiBjb25maWcvdGMtc2guaCAoc2hfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCi0JKiBhcHAuYyAoaW5wdXRfYnVmZmVyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwX3B1c2gpOiBTYXZlIHNhdmVkX2lucHV0IGluIGFsbG9jYXRlZCBidWZmZXIuCi0JKGFwcF9wb3ApOiBSZXN0b3JlZCBzYXZlZF9pbnB1dC4KLQkoZG9fc2NydWJfY2hhcnMpOiBDaGFuZ2UgZ2V0IHBhcmFtZXRlciB0byB0YWtlIGNoYXIgKiBhbmQgaW50IGFzCi0JYXJndW1lbnRzLiAgQ2hhbmdlIEdFVCBtYWNybyB0byBwYXNzIGlucHV0X2J1ZmZlciB0byBnZXQKLQlmdW5jdGlvbi4gIERvbid0IHNhdmUgaW5wdXQgaW50byBhbGxvY2F0ZWQgYnVmZmVyLgotCSogYXMuaCAoZG9fc2NydWJfY2hhcnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfZ2V0KTogQ2hhbmdlIHRvIHRha2UgY2hhciAqIGFuZCBpbnQuCi0JUmVhZCBkYXRhIGludG8gcGFzc2VkIGluIGJ1ZmZlci4gIFJlbW92ZSBzdGF0aWMgYnVmZmVyLgotCSogcmVhZC5jIChzY3J1Yl9mcm9tX3N0cmluZyk6IENoYW5nZSB0byB0YWtlIGNoYXIgKiBhbmQgaW50LiAgQ29weQotCWRhdGEgaW50byBwYXNzZWQgaW4gYnVmZmVyLgotCi0JKiBoYXNoLmg6IE5lYXRlbi4gIERlY2xhcmUgaGFzaF90cmF2ZXJzZS4KLQkqIGhhc2guYzogQ29tcGxldGUgcmV3cml0ZSBiYXNlZCBvbiBCRkQgaGFzaGluZyBjb2RlLgotCSogZ2FzcC5jIChjaHVua3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IENhbGwgaGFzaF9qYW0gd2l0aCBOVUxMIHJhdGhlciB0aGFuCi0JaGFzaF9kZWxldGUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEFkZCBwaXBlbGluZSBvZmZzZXQgaW50byByZWxvYwotCWFkZGVuZCB1bmxlc3MgdGhlIHRhcmdldCB1c2VzIGFuIG9sZCBBQkkuCi0KLU1vbiBNYXkgMjQgMTM6MzY6NTUgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCS1XY2hhci1zdWJzY3JpcHRzIGNsZWFudXAKLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogVXNlIHVuc2lnbmVkIGNoYXIgdmFyaWFibGUsIHNvCi0gCWNhbGxzIHRvIGlzYXNjaWksaXNjbnRybCBhcmUgY29ycmVjdC4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBDYXN0IGFyZyB0byBpc2RpZ2l0LCBldC4gYWwuIHdpdGgKLQkodW5zaWduZWQgY2hhcikuCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZW50LGVjb2ZmX3N0YWIpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsbWlwczE2X2lwKTogRGl0dG8uCi0JKG15X2dldFNtYWxsRXhwcmVzc2lvbixnZXRfbnVtYmVyLHNfbWlwc19lbnQpOiBEaXR0by4KLQotMTk5OS0wNS0yOCAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQG1hdGVtYXRpay5zdS5zZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENoZWNrIGZvciBkaXNhbGxvd2VkIGluZGV4IHJlZ2lzdGVyCi0Jd2lkdGggZm9yIENvbGRmaXJlLgotCShhcmNoX2NvbGRmaXJlX3ApOiBOZXcgI2RlZmluZS4KLQkobTY4a19pcCwgbTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgYXJjaF9jb2xkZmlyZV9wLgotCi0xOTk5LTA1LTI4ICBMaW51cyBOb3JkYmVyZyAgPGxpbnVzLm5vcmRiZXJnQGNhbml0LnNlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbnN0YWxsX29wZXJhbmQpOiBBZGQgcGxhY2VzIGBuJywgYG8nLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWRkIGZvcm1hdHMgYEUnLCBgRycsIGBIJy4KLQkoaW5zdGFsbF9vcGVyYW5kKTogQWRkIHBsYWNlIGBOJy4KLQkoaW5pdF90YWJsZSk6IEFkZCByZWdpc3RlcnMgQUNDLCBNQUNTUiwgTUFTSy4KLQotCSogY29uZmlnL202OGstcGFyc2UuaCAobTY4a19yZWdpc3Rlcik6IEFkZCBBQ0MsIE1BQ1NSLCBNQVNLLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBDaGFuZ2UgbWNmNTIwMCAtLT4gbWNmLgotCShhcmNocyk6IEFkZCBtY2Y1MjA2ZSwgbWNmNTMwNy4KLQkobTY4a19pcCk6IEFkZCBmb3JtYXQgYHUnLgotCShpbnN0YWxsX29wZXJhbmQpOiBBZGQgcGxhY2UgYG0nLCBgTScsIGBoJy4KLQkoaW5pdF90YWJsZSk6IEFkZCB1cHBlci9sb3dlciByZWdpc3RlcnMuCi0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKG02OGtfcmVnaXN0ZXIpOiBBZGQgdXBwZXIvbG93ZXIgcmVnaXN0ZXJzLgotCi0xOTk5LTA1LTI4ICBNYXJ0aW4gRG9yZXkgIDxtZG9yZXlAbWFkZ2UuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jOiBTZXZlcmFsIG1pbm9yIGNoYW5nZXMgdG8gYWRkIEVMRiBhbmQKLQlCRkRfQVNTRU1CTEVSIHN1cHBvcnQuCi0JKiBjb25maWcvdGMtaTk2MC5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTI1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBPbmx5IGRvIDE5OTktMDUtMTcgZnhfcGNyZWwKLQlyZWxvYyBjaGFuZ2VzIHdoZW4gZGVmaW5lZChCRkRfQVNTRU1CTEVSKS4KLQotMTk5OS0wNS0xNyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBSZW1vdmUgRiBhbmQgTUFQIG1hY3Jvcy4KLQotCSogd3JpdGUuYyAod3JpdGVfcHJpbnRfc3RhdGlzdGljcyk6IE91dHB1dCB0byBmaWxlLCBub3Qgc3RkZXJyLgotCi0JKiBleHByLmMgKGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyLDY0KTogUHJvdG90eXBlLgotCi0JKiByZWFkLmMgKHNfbGNvbW1faW50ZXJuYWwsIHNpemVvZl9zbGViMTI4LCBzaXplb2ZfdWxlYjEyOCwKLQlvdXRwdXRfc2xlYjEyOCwgb3V0cHV0X3VsZWIxMjgsIG91dHB1dF9iaWdfc2xlYjEyOCwKLQlvdXRwdXRfYmlnX3VsZWIxMjgsIG91dHB1dF9iaWdfbGViMTI4KTogUHJvdG90eXBlLgotCShvdXRwdXRfYmlnX3NsZWIxMjgsIG91dHB1dF9iaWdfdWxlYjEyOCk6IE1ha2UgaW5saW5lLgotCShvdXRwdXRfYmlnX2xlYjEyOCk6IFJlbW92ZSBpbmxpbmUKLQotCUZyb20gTWFjaWVqIFcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogQ29udmVydCBCRkRfUkVMT0NfMTYgd2l0aAotCWZ4X3BjcmVsIHNldCB0byBCRkRfUkVMT0NfMTZfUENSRUwuICBTaW1pbGFybHkgZm9yIEJGRF9SRUxPQ184LgotCUhhbmRsZSBCRkRfUkVMT0NfMTZfUENSRUwgYW5kIEJGRF9SRUxPQ184X1BDUkVMLiAgUmV0dXJuIGNoYW5nZWQKLQl2YWx1ZSBmb3IgY29ycmVjdCBvdmVyZmxvdyBjaGVjayBpbiB3cml0ZS5jOmZpeHVwX3NlZ21lbnQuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogTW92ZSBiaXRmaWVsZCBvdmVyZmxvdyBjaGVja3MgdG8gYWZ0ZXIKLQl0aGUgbWRfYXBwbHlfZml4IGNhbGwuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IE1lbnRpb24gbWRfYXBwbHlfZml4IG1vZGlmeWluZwotCXZhbHVlVCAqdmFsIGFyZ3VtZW50LgotCi1GcmkgTWF5IDE0IDEwOjUyOjEzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBDb3JyZWN0bHkgcm91bmQgYQotCWRlbm9ybWFsaXplZCBudW1iZXIuICBGaXggb2ZmLWJ5LW9uZSBpbiByYW5nZSBjaGVja2luZyBmb3IKLQlleHBvbmVudCBpbiBhIGRlbm9ybWFsLiAKLQotMTk5OS0wNS0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKHBhcnNlX3JlZyk6IEFjY2VwdCAnc3AnIGFzIGEgdmFsaWQgcmVnaXN0ZXIKLQluYW1lLiAKLQotVGh1IE1heSAxMyAwOTo0Njo1OSAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1ydGVtc2VsZiosIHNoLSotcnRlbXNlbGYqKTogTmV3IHRhcmdldHMuCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoSW52TWVtKTogTmV3IGZsYWcuICBBZGQgdG8gQW55TWVtLgotCShSZXZlcnNlUmVnUmVnbWVtKTogUmVtb3ZlLgotCShJbW1FeHQpOiBOZXcgZmxhZy4gIFJlbnVtYmVyIHNvbWUgb2YgdGhlIG9wY29kZV9tb2RpZmllciBiaXRzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBUZXN0IGZvciBQSUlJIFNJTUQgYW5kIEFNRAotCTNETm93ISB2aWEgSW1tRXh0IG9wY29kZV9tb2RpZmllci4gIFJlbW92ZSBSZXZlcnNlUmVnUmVnbWVtCi0Ja2x1ZGdlLgotCi0JRnJvbSAgRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgotCSogY29uZmlnL3RjLWkzODYuaCAoUmVnWE1NKTogTmV3IGZvciBQL0lJSS4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IEFkZCBzdXBwb3J0IGZvciBQL0lJSS4KLQotU2F0IE1heSAgOCAyMzoyODo1MCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtbXBwYzY0YnJpZGdlLgotCShtZF9iZWdpbik6IEFsbG93IHBwYzMyIGluc25zIGluIHBwYzY0YnJpZGdlIG1vZGUuCi0JKHBwY19pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBTSUdOT1BUIGluIHBwYzY0IG1vZGUuCi0KLVRodSBNYXkgIDYgMjM6MTM6MzkgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbW1lZGlhdGUpOiBTa2lwIHdoaXRlc3BhY2UgYmVmb3JlCi0JY29tcGxhaW5pbmcgYWJvdXQganVuayBhZnRlciBleHByZXNzaW9uLgotCShpMzg2X2Rpc3BsYWNlbWVudCk6IExpa2V3aXNlLgotCi1UaHUgTWF5ICA2IDE5OjUwOjE0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2ZpbmRfYmFzZSk6IFVzZSBtZW1jcHkgaW5zdGVhZCBvZiBzdHJjcHkuCi0JRG9uJ3QgY29weSBiZWZvcmUgZG93bmNhc2VpbmcuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIHRjLW02OGsuYzogSW5jbHVkZSBlbGYvbTY4ay5oLgotICAgICAgICAobTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IE5ldyByb3V0aW5lLgotICAgICAgICAqIHRjLW02OGsuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgbTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZyk6Ci0gICAgICAgIERlZmluZS4KLSAKLU1vbiBNYXkgIDMgMTA6MjY6MDMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgMjIgYml0IGZtdCBpbnNuIGxpa2UgYQotCTE3IGJpdCBmbXQgaW5zbi4KLQotMTk5OS0wNC0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1jb3JlX3Nfc2VjdGlvbik6IER1bXAgbGl0ZXJhbHMgYmVmb3JlCi0JY2hhbmdpbmcgc2VjdGlvbi4KLQotMTk5OS0wNC0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX2FwcGx5X2ZpeDMpOiBJbnNlcnQgcmVsb2MgYWRkZW5kIGludG8gaW5zbgotCWZvciBDT0ZGL1BFIHBvcnQuCi0KLU1vbiBBcHIgMjYgMTI6MzQ6MzcgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuaCAoVENfRklYX1RZUEUpOiBEZWxldGUsIGNnZW4gZmllbGRzIG1vdmVkIHRvIHdyaXRlLmguCi0JKFRDX0lOSVRfRklYX0RBVEEpOiBEZWxldGUuCi0JKiBjb25maWcvdGMtbTMyci5oIChUQ19GSVhfVFlQRSk6IERlbGV0ZSwgY2dlbiBmaWVsZHMgbW92ZWQgdG8gd3JpdGUuaC4KLQkoVENfSU5JVF9GSVhfREFUQSk6IERlbGV0ZS4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBOZXcgbWVtYmVyIGZ4X2NnZW4sIGlmZGVmIFVTSU5HX0NHRU4uCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9jZ2VuIG1lbWJlci4KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwLGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBVcGRhdGUuCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZS4KLQkobWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogVXBkYXRlLgotCShGWF9PUElORk9fUl9UWVBFKTogVXBkYXRlLgotCi0JKiBmcmFncy5jIChmcmFnX3ZhcixmcmFnX3ZhcmlhbnQpOiBJbml0aWFsaXplIGZyX2NnZW4gaGVyZS4KLQkqIGNvbmZpZy90Yy1mcjMwLmggKFRDX0ZSQUdfSU5JVCk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKFRDX0ZSQUdfSU5JVCk6IERlbGV0ZS4KLQkqIGZyYWdzLmggKHN0cnVjdCBmcmFnKTogTWFrZSBvcGluZGV4LCBvcGluZm8gaW50cy4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoRlhfT1BJTkZPX1JfVFlQRSk6IERlbGV0ZSwgdW51c2VkLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWVkIGZ1bmN0aW9uIGZyb20KLQltZF9hcHBseV9maXguIAotCShtZF9hcHBseV9maXgzKTogRG8gbm90IGZpeCB1cCBhYnNvbHV0ZSByZWxvY2F0aW9ucyBhZ2FpbnN0Ci0Jc3ltYm9saWMgdmFsdWVzLgotCi0JKiBjb25maWcvdGMtbWNvcmUuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotMTk5OS0wNC0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBpbnRlcmNlcHRzIGZvciBzZWN0aW9uCi0JY2hhbmdlcyBhbmQgZGF0YS1pbi10ZXh0IGRpcmVjdGl2ZXMuCi0JKG1jb3JlX2NvbnMpOiBOZXcgZnVuY3Rpb246IGludGVyY2VwdCBjb25zKCkgb3BlcmF0aW9ucy4KLQkobWNvcmVfZmxvYXRfY29ucyk6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IGZsb2F0X2NvbnMoKQotCW9wZXJhdGlvbnMuIAotCShtY29yZV9zdHJpbmdlcik6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IHN0cmluZ2VyKCkgb3BlcmF0aW9ucy4KLQotMTk5OS0wNC0xOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IENoYW5nZSBnZW5lcmF0ZV9hc21fbGluZW5vIGZpZWxkIHRvCi0JdGFrZSBubyBwYXJhbWV0ZXJzLgotCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfR0VORVJBVEVfQVNNX0xJTkVOTyk6IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGZpbmRfb3Bjb2RlX21hdGNoKTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4KLQkoZmluZF9tYWNyb19tYXRjaCk6IExpa2V3aXNlLgotCShsb2FkX2V4cHJlc3Npb24pOiBQYXJlbnRoZXNpemUgJiYgd2l0aGluIHx8LgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lLgotCi0xOTk5LTA0LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIG92ZXJyaWRlcyBmb3IgLmJzcwotCS50ZXh0IC5kYXRhIC5zZWN0aW9uIHBzZXVkbyBvcHMuCi0JKG1jb3JlX3Nfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0JKG1jb3JlX3NfdGV4dCk6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0JKG1jb3JlX3NfZGF0YSk6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzMyYml0bW9kZSk6IE5ldy4KLQkobWRfYmVnaW4pOiBTZXQgbWlwc18zMmJpdG1vZGUgaWYgbmVlZGVkLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogRG9uJ3Qgc2V0IEVGX01JUFNfQVJDSC4KLQlTZXQgRUZfTUlQU18zMkJJVE1PREUuCi0KLUZyaSBBcHIgMTYgMTI6MjY6MzkgMTk5OSAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3NlY3Rpb25fc3ltYm9sKTogRml4IHR5cG8gaW4gcHJldmlvdXMKLQljaGFuZ2UuCi0KLTE5OTktMDQtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUgdG8gMS4KLQotVGh1IEFwciAxNSAxNjo1MjowOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfZ2V0X2Fic29sdXRlX2V4cmVzc2lvbik6IFRyeSB0byBoYW5kbGUgIjUgJXIzIiAKLQlleHByZXNzaW9ucyBjb3JyZWN0bHkuCi0KLQotMTk5OS0wNC0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTZXQgRUZfTUlQU19BUkNILgotCi1Nb24gQXByIDEyIDIzOjQ1OjA3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnMycpOiBOZXcgY2FzZSBmb3IgUEEyLjAgZm1weWZhZGQKLQlhbmQgZm1weW5mYWRkIGluc3RydWN0aW9ucy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZW52aXJvbik6IERlY2xhcmUgaXQsIGlmIG5lZWRlZC4KLQkqIGFzLmMgKGR1bXBfc3RhdGlzdGljcyk6IERvbid0IGRlY2xhcmUgZW52aXJvbi4KLQkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW1tZWRpYXRlKTogQWNjZXB0IEBHT1QgcmVsb2NhdGlvbnMuCi0JKGkzODZfZGlzcGxhY2VtZW50KTogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciByZXBsYWNlbWVudCBidWZmZXIuCi0JQ2xlYW4gdXAgcmVwbGFjZW1lbnQgYnVmZmVyIGluaXRpYWxpemF0aW9uLgotCi0xOTk5LTA0LTExICBCb2IgTWFuc29uIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPjoKLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IERvbid0IGNyZWF0ZSBhIG5ldyBzeW1ib2wgaWYgb25lCi0JYWxyZWFkeSBleGlzdHM7IGluc3RlYWQsIHVzZSB0aGUgZXhpc3Rpbmcgb25lLCBidXQgc2V0IGl0cyBzZWdtZW50Ci0JYW5kIGZyYWcgZGF0YSBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zZWN0aW9uX3N5bWJvbCk6IExpa2V3aXNlLgotCi1TYXQgQXByIDEwIDIwOjEwOjAyIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IENhbGwgYXNfYmFkIGluc3RlYWQgb2YgYWJvcnQuCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCByb3V0aW5lcyBmb3IgTUNvcmUKLQlhc3NlbWJsZXIuCi0JKiBjb25maWcvdGMtbWNvcmUuaDogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBNQ29yZSBhc3NlbWJsZXIuIAotCSogY29uZmlnL29iai1jb2ZmLmM6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXQuCi0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogZG9jL2FsbC50ZXhpOiBTZXQgTUNPUkUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgTUNvcmUgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0JCi0JKiB3cml0ZS5oOiBQcmV2ZW50IG11bHRpcGxlIGluY2x1c2lvbi4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFzaW50bC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQkqIGFzLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUgc3lzdGVtCi0JZG9lcyBub3QgZGVmaW5lIGl0LgotCSogZ2FzcC5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlIHN5c3RlbQotCWRvZXMgbm90IGRlZmluZSBpdC4KLQotCSogTWFrZWZpbGUuYW0gKG02OGstcGFyc2UuYyk6IElmIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UKLQlkaXJlY3RvcnksIGNvcHkgbTY4ay1wYXJzZS55IGludG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBiZWZvcmUKLQlydW5uaW5nIHlsd3JhcCwgdG8gcmVtb3ZlIHNwdXJpb3VzIGRpZmZlcmVuY2VzIHdoZW4gZ2VuZXJhdGluZwotCXNuYXBzaG90cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBKdXN0IGFsbG9jYXRlIHRoZSBudW1iZXIgb2YKLQlieXRlcyBuZWNlc3NhcnksIHJhdGhlciB0aGFuIGFsd2F5cyBhbGxvY2F0aW5nIDEwMjQuCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKiByZWFkLmMgKGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IEFkZCBjYXNlcyB0byBzd2l0Y2guICBSZWluZGVudC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfc2NhbGUpOiBBZGQgcmV0dXJuIHZhbHVlLgotCShidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB0ZW1wX2Rpc3AyLgotCShpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHdhcm5pbmcuCi0JKGkzODZfaW50ZWxfb3BlcmFuZCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgZW5kX29mX29wZXJhbmRfc3RyaW5nLgotCShpMzg2X29wZXJhbmQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG9wZXJhbmRfbW9kaWZpZXIuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBwYXJlbnMgdG8gYXZvaWQgd2FybmluZy4KLQotMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG1pcHMqLSotdnh3b3JrcyogdGFyZ2V0OyBoYXZlIGl0IGRlZmluZQotCU1JUFNfU1RBQlNfRUxGLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy90ZS1lcG9jLXBlLmg6IE5ldyBmaWxlLiAgRGVmaW5lIG1hY3JvcyBzcGVjaWZpYyB0bwotCWFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvbmZpZy90Yy1hcm0uaDogU2VsZWN0IGVwb2MtcGUtYXJtIHRhcmdldCBmb3JtYXQgaWYgY29uZmlndXJlZAotCWZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0KLU1vbiBNYXIgMjkgMTA6MTU6NDAgQ1NUIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6ICBBZGp1c3QgdmFsdWUgZm9yIGxpbmtvbmNlIHNlY3Rpb25zLgotCi1XZWQgTWFyIDI0IDE0OjExOjEwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IENsZWFuIHVwIGNvZGUgdG8KLQlkZXRlY3QgIixuIiB3aXRob3V0IGEgY29uZGl0aW9uLgotCShwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0cik6IExpa2V3aXNlLgotCi0KLVR1ZSBNYXIgMjMgMTE6Mjg6MjMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd+Jyk6IFRoZSBjb25kaXRpb24gZm9yIGEgYnJhbmNoIG9uIGJpdAotCWluc3RydWN0aW9uIGlzIGVuY29kZWQgd2l0aCBvbmUgYml0LgotCi0KLTE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogTWVudGlvbiB0aGF0Ci0JbGluZV9zZXBhcmF0b3JfY2hhcnMgc2hvdWxkIG5vdCBpbmNsdWRlIG5ld2xpbmUuICBGcm9tIHRoaQotCTx0dG5AbWluZ2xlLmdsdWcub3JnPi4KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gbTMycl9jZ2VuX2NwdV9vcGVuLgotCi1TdW4gTWFyIDIxIDE4OjA4OjE4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgJzYnIGluIGFuIG9wY29kZS4KLQotVGh1IE1hciAxOCAxMDo1NTozMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ2EnKTogRG8gbm90IGNhbGwgcGFfcGFyc2VfLi4uX2NtcHN1Yl9jbXBsdHIuCi0KLQotVGh1IE1hciAxOCAwMjozMDowNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ2QnKTogRG8gbm90IGFsbG93ICIsbiIuCi0JCi0xOTk5LTAzLTE1ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogQ2hhbmdlICctJyBiYWNrIHRvIGEgc3ltYm9sIGNoYXIKLQlzbyB3ZSBjYW4gdXNlIG11bHRpcGxlIG9wY29kZXMgb24gYSBsaW5lIGFnYWluLgotCi0JKiBjb25maWcvdGMtZDMwdi5jOiBCeSBkZWZhdWx0LCB3YXJuIGlmIGEgc3ltYm9sIGhhcwotCXRoZSBzYW1lIG5hbWUgYXMgYSByZWdpc3Rlci4gIFBsdXMgc29tZSBtaW5vcgotCXVwZGF0ZXMgZnJvbSB0aGUgYnJhbmNoLgotCi0xOTk5LTAzLTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogSGFuZGxlIEJGRF9SRUxPQ184LAotCUJGRF9SRUxPQ18xNiBhbmQgQkZEX1JFTE9DXzY0LgotCi0xOTk5LTAzLTEyICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGV4cHIuYyAoZXhwcik6IEFkZCBtaXNzaW5nIGVsc2UuCi0KLTE5OTktMDMtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ1BVX1RZUEVTKTogQWRkIGZyMzAuCi0JKGNnZW4ubyk6IEFkZCAkKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIGRlcGVuZGVuY3kuCi0JKGZyMzAsbTMyciBkZXBlbmRlbmNpZXMpOiBVcGRhdGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9yZWNvcmRfZml4dXApOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEaXR0by4KLQkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBDYWxsIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtLgotCShnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogRGl0dG8uICBVcGRhdGUgY2FsbCB0byBzZXRfdm1hX29wZXJhbmQuCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bS4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGl0dG8uCi0KLTE5OTktMDMtMDkgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCBtZXNzYWdlLgotCi0xOTk5LTAzLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIFN5bnRheCk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoZXMKLQlhbmQgTERSIHJlZyw9PGV4cHI+IGluc3RydWN0aW9uLgotCi0JKiBjb25maWcvdGMtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciAtbWNwdT1hcm04MTAsIC1tY3B1PWFybTkgYW5kCi0JLW1jcHU9YXJtOXRkbWkuCi0KLUZyaSBGZWIgMTkgMDk6MzY6MzAgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNLUNoYXJzKTogRml4IHR5cG8gaW4gdXNlIG9mICdAJy4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVRoaXMgcGF0Y2ggd2FzIGNyZWF0ZWQgYnk6IFNjb3R0IEJhbWJyb3VnaAotCTxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0JCi0JKiBhcHAuYzogCi0JICBTcGVjaWFsIGNhc2VkICdAJyBjaGFyYWN0ZXIuICBUaGUgJ0AnIGNoYXJhY3RlciBpcyB1c2VkIGFzIHRoZQotCSAgQVJNIGFzc2VtYmxlciBjb21tZW50IGNoYXJhY3RlciwgYXMgYSBzcGVjaWFsIGNoYXJhY3RlciAKLQkgIGFuZCBpbiBFTEYgLnN5bXZlciBwc2V1ZG8tb3AncywgYW5kIGFzIGEgc3BlY2lhbCBjaGFyYWN0ZXIgaW4KLQkgIC50eXBlIGFuZCAuc2VjdGlvbiBwc2V1ZG8tb3BzLgotCShzeW12ZXJfcHNldWRvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3ltdmVyX3N0YXRlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3RydWN0IGFwcF9zYXZlKTogQWRkIGZpZWxkICdzeW12ZXJfc3RhdGUnLgotCShhcHBfcHVzaCk6IFNhdmUgZ2xvYmFsIHN5bXZlcl9zdGF0ZSBpbnQgc3RydWN0IGFwcF9zYXZlLgotCShhcHBfcG9wKTogUmVzdG9yZSBnbG9iYWwgc3ltdmVyX3N0YXRlIGZyb20gc3RydWN0IGFwcF9zYXZlLgotICAJKGRvX3NjcnViX2NoYXJzKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mICdAJyBjaGFyYWN0ZXIgaW4KLQkuc3ltdmVyIHBzZXVkby1vcHMuIAotCi0JKiBjb25maWd1cmUuaW46IE1vZGlmaWVkIHRvIHJlY29nbml6ZSBhcm12KiB1bmFtZSBzeW50YXggZnJvbSBBUk0KLQlMaW51eCBrZXJuZWwuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgJyUnIGFzIHdlbGwgYXMgJ0AnIGFzCi0JYSBwcmVmaXggdG8gdGhlIHNlY3Rpb24ncyB0eXBlLgotCShvYmpfZWxmX3R5cGUpOiBBbGxvdyAnJScgYXMgd2VsbCBhcyAnQCcgYW5kICcjJyBhcyBwcmVmaXhlcyB0bwotCXRoZSB0eXBlJ3MgdHlwZW5hbWUuCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogQWRkIHN1cHBvcnQgZm9yIFBJQyBnZW5lcmF0aW9uOgotCShwaWNfY29kZSk6IE5ldyBib29sZWFuLgotCShvYmpfcmVsb2NhdGVfZXh0ZXJuKTogRGVmaW5lLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUKLQkoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KLQkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmaW5lLgotCQotCSogY29uZmlnL3RjLWFybS5jOiBBZGQgc3VwcG9ydCBmb3IgUElDIGdlbmVyYXRpb246Ci0JKGxpbmVfc2VwZXJhdG9yX2NoYXJzKTogQWxsb3cgJzsnIGFzIGEgc2VwZXJhdG9yIGZvciBMaW51eC4KLQkoaXNfaW1tZWRpYXRlX3ByZWZpeCk6IE5ldyBtYWNyby4KLQkoYXJtX3BhcnNlX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShzX2FybV9lbGZfY29ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZG9fYnJhbmNoKTogU3BlY2lhbCBjYXNlIGZvciBCRkRfUkVMT0NfQVJNX1BMVDMyLgotCShtZF91bmRlZmluZWRfc3ltYm9sKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciB0aGUgR2xvYmFsIE9mZnNldAotCSAgVGFibGUncyBzeW1ib2wuCi0JKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgUElDIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIFBJQyByZWxvY3MuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAnLWsnIGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8KLQkgIGVuYWJsZSBQSUMgZ2VuZXJhdGlvbi4KLQkoY29uc19maXhfbmV3X2FybSk6IE5ldyBmdW5jdGlvbi4KLQkoc19hcm1fZWxmX2NvbnMpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBGZWIgMTYgMTY6MzE6NTMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50cyBmb3IgdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2luY2x1ZGUubTQ6IExpa2V3aXNlLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTE1ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcDogY2FzZSAnbycpOiBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgZm9yCi0Jbm9uLWNvbnN0YW50IG9mZnNldCBmcm9tIGEgYmFzZSByZWdpc3Rlci4KLQotMTk5OS0wMi0xNCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQHJhZWJ1cm4ub3JnPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvd191c2FnZSk6IFB1dCBcIGJlZm9yZSBuZXdsaW5lIGluCi0Jc3RyaW5ncyBhbHdheXMuCi0KLVNhdCBGZWIgMTMgMTQ6MTA6MTAgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGNwdV90eXBlcyk6IEVuYWJsZSBFVjYgUEFMY29kZSB3aXRoIC1tMjEyNjQuCi0JKGVtaXRfaW5zbik6IExvb2sgZm9yIHBjLXJlbGF0aXZlIGFuZCBuby1vdmVyZmxvdyBzcGVjaWZpZXJzIG9uCi0JaW50ZXJuYWwgcmVsb2NhdGlvbiB0eXBlcy4KLQotMTk5OS0wMi0xMyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGkgKE1JUFMgT3B0cyk6IFVwZGF0ZWQgbGlzdCBvZiAtbU5OTk4gYW5kCi0JLW1jcHU9Tk5OTiBmbGFncy4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIGFsbCB0aGUgbWlwc19OTk5OIHZhcmlhYmxlczsganVzdCB1c2UKLQltaXBzX2NwdSBpbnN0ZWFkLgotCShtaXBzXzQ2NTAsIG1pcHNfNDAxMCwgbWlwc180MTAwKTogVmFyaWFibGVzIHJlbW92ZWQuCi0JKGhpbG9faW50ZXJsb2NrcywgZ3ByX2ludGVybG9ja3MsIGFwcGVuZF9pbnNuLCBtYWNyb19idWlsZCwgbWFjcm8sCi0JbWFjcm8yLCBtaXBzMTZfbWFjcm8sIG1pcHNfaXApOiBUZXN0IG1pcHNfY3B1LCBub3QgdGhlIG1pcHNfTk5OTgotCXZhcmlhYmxlcy4KLQkobWRfYmVnaW4pOiBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nIHRoZSBtaXBzX05OTk4gdmFyaWFibGVzOwotCW1pcHNfY3B1IGlzIHNldCwgYW5kIHRoYXQncyBnb29kIGVub3VnaCBub3cuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhdmUgdGhlIC1tTk5OTiBvcHRpb25zIHNldCBtaXBzX2NwdSBpbnN0ZWFkIG9mCi0JdGhlIG1pcHNfTk5OTiB2YXJpYWJsZS4gIFRoZSAtbm8tbU5OTk4gZmxhZ3MgYXJlIG5vdyBuby1vcHMuCi0JKHNob3cpOiBOZXcgZnVuY3Rpb24sIHRvIGhhbmRsZSB3cmFwcGluZyBpbiB0aGUgQ1BVIGxpc3RzLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlIGxpc3RzIG9mIC1tY3B1IGFuZCAtbU5OTk4gc3dpdGNoZXMuCi0KLVNhdCBGZWIgMTMgMDA6MTc6MjYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbnRlbF9vcGVyYW5kKTogSWdub3JlIGBTSE9SVCcgcmF0aGVyCi0JdGhhbiB0cmVhdCBhcyBhbiBpbW1lZGlhdGUgc3BlY2lmaWVyLgotCi1UaHUgRmViIDExIDE2OjE4OjMxIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFByb3RvdHlwZSBtYW55IGZ1bmN0aW9ucy4KLQkoc2V0X2ludGVsX3N5bnRheCk6IEFjY2VwdCBgcHJlZml4Jy9gbm9wcmVmaXgnIHNwZWNpZmllcnMuCi0JKGkzODZfaW1tZWRpYXRlKTogUmVtb3ZlIHVudXNlZCBzZWNvbmQgYXJndW1lbnQuCi0JKGkzODZfaW50ZWxfb3BlcmFuZCk6IEZpeCBpMzg2X2lzX3JlZyB0eXBvLgotCShpMzg2X29wZXJhbmQpOiBVc2UgYWxsb3dfbmFrZWRfcmVnLgotCShvdXRwdXRfaW52YWxpZCk6IE1ha2Ugb3BlcmFuZCBpbnQgZm9yIEsmUi4KLQotVGh1IEZlYiAxMSAxMToyMTowMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9hc19uZXdfU09VUkNFUyk6IFVuY29tbWVudC0tZml4ZWQgYnkgYXV0b21ha2UKLQlwYXRjaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IENoYW5nZSBjZ2VuLW9wYy5oIHRvIGNnZW4tZGVzYy5oLgotCShjZ2VuLm8pOiBEaXR0by4KLQkoRVhUUkFfYXNfbmV3X1NPVVJDRVMpOiBDb21tZW50IG91dC4KLQkoLnRjZGVwKTogPGFyY2g+LW9wYy5oIHJlbmFtZWQgdG8gPGFyY2g+LWRlc2MuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTMuICBSZWRvIHVzaW5nX2NnZW4gaGFuZGxpbmcuCi0JRGVsZXRlIGNhbGwgdG8gQU1fQ1lHV0lOMzIuICBSZXBsYWNlIEFNX0VYRUVYVCB3aXRoIEFDX0VYRUVYVC4KLQkoQUNfT1VUUFVUKTogPGFyY2g+LW9wYy5oIHJlbmFtZWQgdG8gPGFyY2g+LWRlc2MuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBjZ2VuLmM6IEluY2x1ZGUgY2dlbi1kZXNjLmgsIG5vdCBjZ2VuLW9wYy5oLgotCSgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGdhc19jZ2VuX2NwdV9kZXNjKTogUmVuYW1lZCBmcm9tIGdhc19jZ2VuX29wY29kZV9kZXNjLgotCUNHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JQ0dFTl9PUEVSQU5EX0FUVFIgcmVuYW1lZCB0byBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRS4KLQkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwKTogUmVtb3ZlIHVubmVjZXNzYXJ5ICE9IDAgdGVzdC4KLQkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERpdHRvLgotCShnYXNfY2dlbl9maW5pc2hfaW5zbik6IERpdHRvLiAgUmVmZXIgdG8gb3BlcmFuZCB0YWJsZSB2aWEgY3B1Ci0JZGVzY3JpcHRvciwgbm90IGdsb2JhbCB2YXJpYWJsZS4KLQkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IFJlZmVyIHRvIG9wZXJhbmRfdGFibGUgdmlhIGNwdQotCWRlc2NyaXB0b3IsIG5vdCBnbG9iYWwgdmFyaWFibGUuICBSZWZlciB0byBpbnNlcnRfb3BlcmFuZCBoYW5kbGVyCi0JdmlhIGNwdSBkZXNjcmlwdG9yLCBub3QgZ2xvYmFsIGZ1bmN0aW9uLgotCSogY2dlbi5oICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKiBjb25maWcvdGMtZnIzMC5jOiBJbmNsdWRlIG9wY29kZXMvZnIzMC1kZXNjLmguCi0JKCopOiBnYXNfY2dlbl9vcGNvZGVfZGVzYyByZW5hbWVkIHRvIGdhc19jZ2VuX2NwdV9kZXNjLgotCUNHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JVXBkYXRlIGNhbGwgdG8gQ0dFTl9PUEVSQU5EX1RZUEUsQ0dFTl9JTlNOX09QRVJBTkRTLgotCSogY29uZmlnL3RjLW0zMnIuYzogRGl0dG8uCi0JKGFzc2VtYmxlX3R3b19pbnNucyk6IFVwZGF0ZSBjYWxscyB0byBjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkobWRfY29udmVydF9mcmFnKTogVXBkYXRlIGNhbGwgdG8gQ0dFTl9PUEVSQU5EX0VOVFJZLgotCi0xOTk5LTAyLTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggaGFuZGxpbmcgb2YgbGFiZWwxIC0gbGFiZWwyCi0JcmVsb2NhdGlvbnMgZm9yIEVMRiB0YXJnZXRzLgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAyLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmg6IFRpZHkgT0JKX0VMRiBhbmQgT0JKX0NPRkYgZGVmaW5pdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotCWZvciBDT0ZGIHBvcnRzLgotCi1XZWQgRmViICAzIDExOjM1OjQ3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgcGNhNTYgYW5kIGV2NiBvcHRpb25zLgotCi1Nb24gRmViICAxIDIwOjM3OjMwIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWkzODYuaCAoTE9OR19ET1VCTEVfTU5FTV9TVUZGSVgpOiAgRGVmaW5lLgotICAgICAgICAoSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpOiAgRGVmaW5lLgotICAgICAgICAoQllURV9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoV09SRF9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoRFdPUkRfUFRSKTogIERlZmluZS4KLSAgICAgICAgKFhXT1JEX1BUUik6ICBEZWZpbmUuCi0gICAgICAgIChTSE9SVCk6ICBEZWZpbmUuCi0gICAgICAgIChPRkZTRVRfRkxBVCk6ICBEZWZpbmUuCi0gICAgICAgIChGTEFUKTogIERlZmluZS4KLSAgICAgICAgKE5PTkVfRk9VTkQpOiAgRGVmaW5lLgotICAgICAgICAoTm9fZFN1Zik6ICBEZWZpbmUuCi0gICAgICAgIChOb194U3VmKTogIERlZmluZS4KLSAgICAgICAgKiBjb25maWcvdGMtaTM4Ni5jICAoc2V0X2ludGVsX3N5bnRheCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGludGVsX3N5bnRheCk6ICBEZWNsYXJlLgotICAgICAgICAoYWxsb3dfbmFrZWRfcmVnKTogIERlY2xhcmUuCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiAgU3VwcG9ydCAuaW50ZWxfc3ludGF4IGFuZCAuYXR0X3N5bnRheC4KLSAgICAgICAgKGludGVsX2Zsb2F0X29wZXJhbmQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChtZF9hc3NlbWJsZSk6ICBIYW5kbGUgSU5URUxfRFdPUkRfTU5FTV9TVUZGSVguCi0gICAgICAgIEhhbmRsZSBicmFja2V0cyBhcyB3ZWxsIGFzIHBhcmVucy4gIENhbGwgaTM4Nl9pbnRlbF9vcGVyYW5kIGZvcgotICAgICAgICBpbnRlbCBzeW50YXguICBSZXZlcnNlIG9wZXJhbmRzIGlmIGFwcHJvcHJpYXRlLiAgSGFuZGxlIG5ldwotICAgICAgICBzdWZmaXhlcy4gIEhhbmRsZSBtb3Z6eCBhbmQgbW92c3guCi0gICAgICAgIChpMzg2X2lzX3JlZyk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfaW1tZWRpYXRlKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9zY2FsZSk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfZGlzcGxhY2VtZW50KTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9vcGVyYW5kX21vZGlmaWVyKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfcGFyc2Vfc2VnKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfaW50ZWxfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfb3BlcmFuZCk6ICBDYWxsIGkzODZfZGlzcGxhY2VtZW50LCBpMzg2X2ltbWVkaWF0ZSwKLSAgICAgICAgaTM4Nl9zY2FsZSwgZXRjLiAgaW5zdGVhZCBvZiBoYW5kbGluZyBpbmxpbmUuCi0gICAgICAgIChwYXJzZV9yZWdpc3Rlcik6ICBIYW5kbGUgcmVnaXN0ZXJzIHdpdGhvdXQgcHJlZml4LgotCi1Nb24gRmViICAxIDEyOjI0OjU4IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGFybS0qLW9hYmkpOiAgTmV3LgotICAgICAgICAodGh1bWItKi1vYWJpKTogIE5ldy4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKHRhcmdldF9vYWJpKTogIERlY2xhcmUuCi0gICAgICAgIChtZF9hcHBseV9maXgzKTogU3VwcG9ydCBSRUwgcmVsb2NzLgotICAgICAgICAobWRfcGFyc2Vfb3B0aW9uKTogIEhhbmRsZSAtb2FiaS4KLSAgICAgICAgKGVsZjMyX2FybV90YXJnZXRfZm9ybWF0KTogIE5ldyByb3V0aW5lLgotICAgICAgICAobWRfbG9uZ29wdHMpOiAgQWRkIE9QVElPTl9PQUJJLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIFJlZGVmaW5lIFRBUkdFVF9GT1JNQVQuCi0KLQotMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSGFuZGxlIG91dCBvZiByYW5nZSBlcnJvci4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoZnIzMF9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkoZnIzMF9mb3JjZV9yZWxvY2F0aW9uKTogRGVmYXVsdCB0byAwLgotCi0JKiBjb25maWcvdGMtZnIzMC5oIChvYmpfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IERvIG5vdCBhcHBseSBmaXhlcyB0byBWVEFCTEUKLQlyZWxvY3MuIAotCi0xOTk5LTAxLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRG8gbm90IGdlbmVyYXRlIGEgc2VxdWVudGlhbAotCW1lcmdlIG9mIHR3byBpbnN0cnVjdGlvbnMgaWYgdGhlIGxlZnQgaW5zdHJ1Y2l0b24ga2lsbHMgdGhlIHJpZ2h0LgotCi0xOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluOiBSZWRvIHRlc3QgZm9yIHVzaW5nIGNnZW4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfYWRqdXN0X3N5bXRhYik6IFByZXZlbnQgYWNjaWRlbnRhbAotCXJlZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvLgotCi1UdWUgSmFuICA1IDIxOjU4OjAzIDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZnJvYl9maWxlKTogRGlzYWJsZSAiVW5tYXRjaGVkICVoaSByZWxvYyIKLQl3YXJuaW5nLgotCi0xOTk4LTEyLTI5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBGb3IgbWlwczE2LCBpbnNlcnQgYSBub3AgYmV0d2VlbgotCWEgcmVhZCBvZiBISSBvciBMTyBhbmQgYW4gaW1tZWRpYXRseSBmb2xsb3dpbmcgYnJhbmNoLgotCi0xOTk4LTEyLTI5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBBbm90aGVyIGNvcnJlY3Rpb24gdG8gdGhlIHNldHRpbmcgb2YKLQltaXBzX2VhYmk2NC4KLQotMTk5OC0xMi0yMyAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQ29ycmVjdCB0eXBlLW8gaW4gc2V0dGluZyBvZiBtaXBzX2VhYmk2NC4KLQotMTk5OC0xMi0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYXNzZW1ibGUpOiBFbWl0IGEgTk9QIGFmdGVyIGEgcmVsYXhhYmxlIDE2Ci0JYml0IGluc24gd2hlbiBvcHRpbWl6aW5nLCBzbyB0aGF0IHBhcmFsbGVsaXNlZCBpbnN0cnVjdGlvbnMgd2lsbAotCXN0YXJ0IG9uIGEgMzIgYml0IGJvdW5kYXJ5LgotCi0xOTk4LTEyLTE5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lYWJpNjQpOiBOZXcuCi0JKG1kX2JlZ2luKTogU2V0IG1pcHNfZWFiaTY0LgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogVXNlIGl0LgotCi0xOTk4LTEyLTE4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IAotCUNvcnJlY3Qgc2V0dGluZyBvZiBBQkkgaW4gZV9mbGFncy4KLQotV2VkIERlYyAxNiAxNjoxNzoyMiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2Fzc2VtYmxlKTogV2FybiBhYm91dCBpbnZhbGlkIGluc3RydWN0aW9ucyBpbiBkZWxheSBzbG90cy4KLQotMTk5OC0xMi0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luLG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB2cjQxMTEuCi0JCi0xOTk4LTEyLTE1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IE1hcmsgYXMgYW4gZXJyb3IsIHJhdGhlciB0aGFuIGEKLQl3YXJuaW5nLCB2YWx1ZXMgdGhhdCBkb24ndCBmaXQgaW4gdGhlIGZpZWxkLgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19hYmlfc3RyaW5nKTogTmV3LgotCShtZF9wYXJzZV9vcHRpb24sbWRfbG9uZ29wdHMpOiBBZGQgbWFiaS4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IFNldCBlX2ZsYWdzIGJhc2VkIG9uIG1hYmkgZmxhZy4KLQotMTk5OC0xMi0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB2cjQxMTEuIAotCi05OC0xMi0xMSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IENoYW5nZSBtZXNzYWdlIGdpdmVuIGlmIHRoZQotCWluc3RydWN0aW9uIHJlcXVpcmVzIEg4LzMwMEggbW9kZSBhbmQgd2UncmUgbm90IGluIEhtb2RlLCB0bwotCXN1Z2dlc3QgdGhhdCBpdCBtYXkgYmUgdGhlIG9wZXJhbmQgbW9kZXMgdGhhdCBhcmUgdGhlIHByb2JsZW0sIG5vdAotCW5lY2Vzc2FyaWx5IHRoZSBvcGNvZGUuCi0KLTE5OTgtMTItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IEFkZCBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIuCi0KLVR1ZSBEZWMgIDggMTk6NTE6NTAgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEtKi1tcGVpeCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3NvbV9jb21waWxlcik6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLXNvbS5jIChjb21waWxlcl9zZWVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkob2JqX3NvbV9jb21waWxlcik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFVwZGF0ZSB0Y19kYXRhIHVzZXMgZm9yIGNoYW5nZSB0byBiZmQvc29tLmguCi0gCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImNvbXBpbGVyIiBpZiBPQkpfU09NLgotCShwYV90eXBlX2FyZ3MpOiBTZXQgaHBwYV9wcml2X2xldmVsLgotCShwYV9jb21waWxlcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24gaWYgT0JKX1NPTS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIERlYyAgOCAxNTowMDo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAob3V0cHV0X2xlYjEyOCk6IERvbid0IG1hcmsgYXMgaW5saW5lLgotCi0xOTk4LTEyLTA4ICBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3ZieXRlKTogUHJvdG90eXBlIGFuZCBuZXcgZnVuY3Rpb24gZm9yIAotCUFJWCAudmJ5dGUgdW5hbGlnbmVkIGRhdGEgc3VwcG9ydC4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkICd2Ynl0ZScgdG8gbGlzdCBvZiB2YWxpZCBwc2V1ZG9zLgotCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFkZCBlaF9mcmFtZSB0byBsaXN0IG9mIEVMRiByZWxvY2F0YWJsZSAKLQlzZWN0aW9ucy4KLQotMTk5OC0xMi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUsIGRvX2Fzc2VtYmxlKTogSW1wcm92ZSBlcnJvbmVvdXMKLQlpbnB1dCBoYW5kbGluZy4gCi0KLU1vbiBEZWMgIDcgMDk6NDg6MzQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKGVsZjMyX2FybV9mb3JjZV9yZWxvY2F0aW9uKTogIENoZWNrIGZvcgotICAgICAgICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSC4KLQotU3VuIERlYyAgNiAxMjo0NjozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU197QklHLExJVFRMRX1fRU5ESUFOIGFmdGVyCi0JY2hlY2tpbmcgdGhlIHRhcmdldCB0eXBlLgotCShtaXBzLWRlYy1ic2QqKTogU2V0IGVuZGlhbiB0byBsaXR0bGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlDT0ZGIHdlYWsgc3ltYm9sIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNYXJrIEVsYnJlY2h0Ci0JPHNub3diYWxsM0B1c2EubmV0PjoKLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX1dFQUspOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfd2Vhayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9ial9jb2ZmX2VuZGVmKSBbYm90aCB2ZXJzaW9uc106IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoeWFua19zeW1ib2xzKTogTGlrZXdpc2UuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgIndlYWsiLgotCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gQXltZXJpYyBWaW5jZW50Ci0JPGF5bWVyaWMudmluY2VudEBlbWkudS1ib3JkZWF1eC5mcj4uCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggY3VycmVudCB0b29scy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGVtaXRfbGRncCk6IEdpdmUgYW4gZXJyb3IgbWVzc2FnZSByYXRoZXIgdGhhbgotCWFuIGFzc2VydGlvbiBmYWlsdXJlIGZvciBhIGNhc2Ugd2UgY2FuJ3QgaGFuZGxlIHdoZW4gT0JKX0VDT0ZGLgotCi0JKiBleHByLmMgKG9wZXJhdG9yKTogQW5kIHdpdGggMHhmZiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNpZ25lZAotCWNoYXIuCi0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogR2VuZXJhdGUKLQlCRkRfUkVMT0NfRlIzMF80OCBpbnN0ZWFkIG9mIEJGRF9SRUxPQ19GUjMwXzMyLgotCi0xOTk4LTEyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IEVuYWJsZSByZWxvY3MgZm9yCi0JTERJOjIwIGluc24uCi0KLVRodSBOb3YgMjYgMTE6MjM6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBSZXN0b3JlIHByZXZpb3VzIGNhbGN1bGF0aW9uCi0Jb2YgcGNyZWwgcG9pbnQuCi0KLVR1ZSBOb3YgMjQgMTc6MjE6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogRml4IGNhbGN1bGF0aW9uIG9mCi0JcGNyZWwgcG9pbnQuCi0KLVR1ZSBOb3YgMjQgMTQ6NTQ6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN0YXRpYyAnZXR5cGUnIGhhdmUgZmlsZQotCXNjb3BlLgotCShkMTB2X2NsZWFudXApOiBPbmx5IGdlbmVyYXRlIHByZXZpb3VzIGluc24gaWYgYSBtdWx0aWxpbmUgaW5zbiBpcwotCW5vdCBwZW5kaW5nLgotCi1GcmkgTm92IDIwIDExOjQxOjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogQWRkIHN1cHBvcnQgZm9yCi0JRlIzMF9PUEVSQU5EX0kzMi4gCi0KLVRodSBOb3YgMTkgMTU6MDE6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW1hcm03eHh4IGFuZAotCS1tYXJtNnh4eCBjb21tYW5kIGxpbmUgc3dpdGNoZXMuCi0KLTE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERFUCk6IFVzZSAkKHNyY2RpcikvLi4vbWtkZXAuCi0JKGl0Ymwtb3BzLm8pOiBEZWxldGUgZHVwbGljYXRlIGRlcGVuZGVuY2llcy4KLQlSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQlBZGQgZnIzMCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIE5vdiAxNyAxMzo0Mjo0MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0Ci0Jb3Bjb2RlIGxpc3QuCi0JKiBsaXN0aW5nLmM6IElnbm9yZSBsaW5lIHRlcm1pbmF0b3IgY2hhcmFjdGVycyBmb3VuZCBpbnNpZGUKLQlzdHJpbmdzLiAKLQotVGh1IE5vdiAxMiAxOToyMToyNCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2dhcy5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDEyIDEwOjU0OjE2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKGZyMzBfaXNfY29sb25faW5zbik6IE5ldyBuYW1lIGZvcgotCWZyMzBfaXNfbGFiZWxfc3RhcnQoKS4gIEFsc28gY2hlY2tzIGZvciBkZWxheSBzbG90IGluc25zLgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChmcjMwX2lzX2xhYmVsX3N0YXJ0KTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUKLQlGUjMwIGluc3RydWN0aW9ucyB3aGljaCBjb250YWluIGEgY29sb24gaW4gdGhlIG1uZW1vbmljLgotCi0JKiBjb25maWcvdGMtZnIzMC5oIChUQ19TVEFSVF9MQUJFTCk6IERlZmluZSB0aGlzIG1hY3JvLgotCi1XZWQgTm92IDExIDA5OjU4OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IFJlbW92ZWQgY3VycmVudGx5IHN1cGVyZmxvdXMgY29kZS4KLQotVHVlIE5vdiAxMCAxMzoxMzowNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IFR3ZWFraW5nIHNvIHRoYXQgaXQgd2lsbCBjb21waWxlLgotCi1UdWUgTm92IDEwIDE0OjQxOjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWQxMHYuaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KLSAgICAgICAgKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiAgRGVmaW5lLgotICAgICAgICAoZDEwdl9mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCi0gICAgICAgICogY29uZmlnL3RjLWQxMHYuYyAodGNfZ2VuX3JlbG9jKTogIEhhbmRsZSBWdGFibGUgcmVsb2NzLgotICAgICAgICAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgVnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKGQxMHZfZml4X2FkanVzdGFibGUpOiAgTmV3LgotICAgICAgICAoZDEwdl9mb3JjZV9yZWxvY2F0aW9uKTogIE5ldy4KLQotTW9uIE5vdiAgOSAxNDoyNTowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jOiBDaGFuZ2UgZGVmYXVsdCBiZWhhdmlvdXIgdG8gaWdub3JlIHBvdGVudGlhbAotCWNvbmZsaWN0cyBiZXR3ZWVuIHJlZ2lzdGVyIG5hbWUgYW5kIHN5bWJvbCBuYW1lcy4KLQotV2VkIE5vdiAgNCAxODo0MjowMCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGZyMzAtKi0qLgotCSogY29uZmlnL3RjLWZyMzAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0JKiBwby9nYXMucG90OiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAgMiAyMDo1NDoxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV90d29faW5zbnMpOiBFbnN1cmUgYm90aCBpbnNucwotCWFyZSAxNiBiaXQgaW5zbnMuCi0KLU1vbiBOb3YgIDIgMjA6MTA6MTggMTk5OCAgTWFydGluIHZvbiBMb2V3aXMgIDxsb2V3aXNAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IFNldCBjaGFyYWN0ZXJzIGFib3ZlIDEyNyB0byBiZSBzeW1ib2wKLQljaGFyYWN0ZXJzLgotCShkb19zY3J1Yl9jaGFycyk6IEFkZCBzb21lIGNhc3RzIHRvIHVuc2lnbmVkIGNoYXIgdG8gYXZvaWQKLQl1bndhbnRlZCBzaWduIGV4dGVuc2lvbi4KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBTZXQgY2hhcmFjdGVycyBhYm91dCAxMjcgdG8gYmUgc3ltYm9sCi0JY2hhcmFjdGVycy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2JlZ2luKTogU2V0IGlkZW50aWZpZXJfY2hhcnMgYW5kCi0Jb3BlcmFuZF9jaGFycyBmb3IgdmFsdWVzIGFib3ZlIDEyNy4KLQotTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgT2N0IDI3IDEzOjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYzogQWRkIHN1cHBvcnQgZm9yIHByb2R1Y2luZyBhIGxpc3RpbmcgZnJvbSBwaXBlZAotCWlucHV0LiAKLQotVHVlIE9jdCAyNyAwODo1Njo0NCAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaGlsb19pbnRlcmxvY2tzKTogUmVtb3ZlIG1pcHNfMzkwMC4KLQkoYXBwZW5kX2luc24pOiBBY2NvdW50IGZvciB0aGUgdHgzOSdzIG11bHRpcGx5IGJlaGF2aW9yLgotCi0xOTk4LTEwLTI2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoYXNzZW1ibGVfdHdvX2luc25zKTogUmVuYW1lIGFzc2VtYmxlX3R3b19pbnNucwotCWZyb20gYXNzZW1ibGVfcGFyYWxsZWxfaW5zbnMuICBBZGQgc3VwcG9ydCBmb3IgJy0+JyB0byBpbmRpY2F0ZQotCWV4cGxpY2l0bHkgc2VyaWFsaXppbmcgdGhlIGluc3RydWN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotU2F0IE9jdCAyNCAxNToxMjoxOSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zaC5jIChzaF9maXhfYWRqdXN0YWJsZSk6ICBBZGp1c3QgRVhURVJOIGFuZAotICAgICAgICBXRUFLIGhhbmRsaW5nLgotCi1UaHUgT2N0IDIyIDEyOjQxOjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogIFJldmVydCBsYXN0IGNoYW5nZS4KLQotVGh1IE9jdCAyMiAxMDowMzoxNSAxOTk4ICBSb24gVW5yYXUgIDxydW5yYXVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyA6IHN1cHBvcnQgZnJhbWUgYW5kIHJlZ21hc2svZnJlZ21hc2sgd2hlbgotCSAgTUlQU19TVEFCU19FTEYgaXMgc3BlY2lmaWVkLgotCi1XZWQgT2N0IDIxIDExOzM0OjUxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIE9ubHkgaW5jbHVkZSBpZiBPQkpfRUxGLgotICAgICAgICAobWRfYXBwbHlfZml4KTogIERvbid0IHJldHVybiAxIGZvciBWVEFCTEUgcmVsb2NzLgotICAgICAgICAqIGNvbmZpZy90Yy1zaC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lIG9ubHkgaWYgT0JKX0VMRi4KLQotVHVlIE9jdCAyMCAxMToxODoyOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRvYy9jLWkzODYudGV4aTogUmVwbGFjZSBvY2N1cmVuY2VzIG9mICJvcGNvZGUiIHdpdGgKLQkiaW5zdHJ1Y3Rpb24gbW5lbW9uaWMiLCAiaW5zdHJ1Y3Rpb24iLCBvciAibW5lbW9uaWMiIHdoZW4KLQlyZWZlcnJpbmcgdG8gdGhlIG5hbWUgb2YgYW4gaW5zdHJ1Y3Rpb24uICBVc2UgIm9wY29kZSIgd2hlbgotCXJlZmVycmluZyB0byB0aGUgc2VxdWVuY2Ugb2YgbWFjaGluZSBieXRlcy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAob3Bjb2RlX2NoYXJzKTogUmVuYW1lIHRvIG1uZW1vbmljX2NoYXJzLgotCShpc19vcGNvZGVfY2hhcik6IFJlbmFtZSB0byBpc19tbmVtb25pY19jaGFyLgotCShtZF9hc3NlbWJsZSBhbmQgaTM4Nl9vcGVyYW5kKTogQ29ycmVjdCBlcnJvciBtZXNzYWdlcyBmcm9tCi0gICAgICAgICJvcGNvZGUiIHRvICJpbnN0cnVjdGlvbiBtbmVtb25pYyIKLQlSZW5hbWUgdGhyb3VnaG91dCBvcGNvZGVbXSAtPiBtbmVtb25pY1tdLCBvcHAgLT4gbW5lbV9wLAotCU1BWF9PUENPREVfU0laRSAtPiBNQVhfTU5FTV9TSVpFLAotCURXT1JEX09QQ09ERV9TVUZGSVggLT4gRFdPUkRfTU5FTV9TVUZGSVgsCi0JV09SRF9PUENPREVfU1VGRklYIC0+IFdPUkRfTU5FTV9TVUZGSVgsCi0JQllURV9PUENPREVfU1VGRklYIC0+IEJZVEVfTU5FTV9TVUZGSVgsCi0JU0hPUlRfT1BDT0RFX1NVRkZJWCAtPiBTSE9SVF9NTkVNX1NVRkZJWAotCUxPTkdfT1BDT0RFX1NVRkZJWCAtPiBMT05HX01ORU1fU1VGRklYCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKCpfTU5FTV9TVUZGSVgpOiBSZW5hbWUgZnJvbSAqX09QQ09ERV9TVUZGSVguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoZWNrIGZvciBnYXJiYWdlIGFmdGVyCi0JcmVnaXN0ZXIgbmFtZS4KLQotVHVlIE9jdCAyMCAxMDo0OTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGFuZ2UgaGFuZGxpbmcgb2YgUENSRUwgcmVsb2MKLSAJZm9yIEJGRF9BU1NFTUJMRVIgdG8gb25seSBjaGFuZ2UgdmFsdWUgd2hlbiBDT0ZGIGlmIFRFX1BFLgotCi1Nb24gT2N0IDE5IDIwOjIwOjQyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNoLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiAgSGFuZGxlIFZUIHJlbG9jcy4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeCk6ICBMaWtld2lzZS4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBMaWtld2lzZS4KLSAgICAgICAgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KLQotTW9uIE9jdCAxOSAxMjozNTo0MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9maW5pc2hfaW5zbik6IFVwZGF0ZSBoYW5kbGluZyBvZiBDR0VOX0lOVF9JTlNOX1AuCi0JKiBjZ2VuLmggKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfaW5zbik6IENHRU5fSU5UX0lOU04gLT4gQ0dFTl9JTlRfSU5TTl9QLgotCWNnZW5faW5zbl90IC0+IENHRU5fSU5TTl9JTlQuCi0JKG1ha2VfcGFyYWxsZWwpOiBVcGRhdGUgaGFuZGxpbmcgb2YgQ0dFTl9JTlRfSU5TTl9QLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogRGl0dG8uCi0JKHRhcmdldF9tYWtlX3BhcmFsbGVsKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFVzZSBpdC4KLQotTW9uIE9jdCAxOSAxMzoxNjoxMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZm9yY2VfcmVsb2NhdGlvbik6ICBGaXggdHlwby4KLQotU3VuIE9jdCAxOCAxODo0ODo1NyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3VyZSB0aGUgZW50aXJlIG9wY29kZSBpcwotCWNvbnZlcnRlZCBpbnRvIGxvd2VyIGNhc2UuCi0KLUZyaSBPY3QgMTYgMTM6MzY6MzQgQ0RUIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgotICAgICAgICAoZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jKTogIExpa2V3aXNlLgotICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgICogY29uZmlnL3RjLW0zMnIuYyAobTMycl9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0gICAgICAgIChtMzJyX2ZvcmNlX3JlbG9jYXRpb24pOiAgSGFuZGxlIFZUQUJMRSByZWxvY3MuCi0KLVdlZCBPY3QgMTQgMTE6MzM6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBEaXJlY3RpdmVzKTogRG9jdW1lbnQgLmx0b3JuIGRpcmVjdGl2ZS4KLQotTW9uIE9jdCAxMiAxMTowNzoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogQ29udmVydCBzZWNvbmQgb3Bjb2RlCi0JdG8gbG93ZXIgY2FzZSBiZWZvcmUgcGFyc2luZy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBJZ25vcmUgY29uZmxpY3RzIHdoZW4gZXhwbGljaXRseQotCXBhcmFsbGVsIGluc25zIG1vZGlmdCBidXRzIGluIHRoZSBQU1cgYXMgYSBzaWRlIGVmZmVjdC4KLQotVGh1IE9jdCAgOCAxMDoxODozMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IFRlc3QgZm9yIG1pc3NpbmcgZmxhZyBhbmQKLQljb250cm9sIHJlZ2lzdGVycy4KLQkKLQkobWRfYXBwbHlfZml4Myk6IEZpeCBlcnJvciBtZXNzYWdlcyB0byBhdm9pZAotCWFzc3VtcHRpb24gYWJvdXQgcHJlc2VuY2Ugb2YgYSBzeW1ib2wuCi0KLQkocGFyYWxsZWxfb2spOiBEaXNhbGxvdyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgdGhhdCBib3RoIG1vZGlmeSB0aGUKLQlzYW1lIGZsYWcgcmVnaXN0ZXIuCi0KLQkoZmluZF9mb3JtYXQpOiBHZW5lcmF0ZSBhIHdhcm5pbmcgaWYgYW4gb2RkIG51bWJlcmVkIHJlZ2lzdGVyIGlzCi0JdXNlZCBhcyB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4gYSBtdXRsaS1yZWdpc3RlciBpbnN0cnVjdGlvbi4KLQotV2VkIE9jdCAgNyAxNDowOToxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogRG8gbm90IGFzc3VtZSB0aGF0IGJhZAotCXJlbG9jYXRpb25zIGFyZSBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIGEgc3ltYm9sLgotCi1UdWUgT2N0ICA2IDA5OjMxOjE1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogdGMtc3BhcmMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCi0gICAgICAgIChlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCi0gICAgICAgICogdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgdnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBIYW5kbGUgdnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgotCi1Nb24gT2N0ICA1IDA5OjI1OjMyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWduc3UuY29tPgotCi0gICAgICAgICogc3ltYm9scy5jIChTX0lTX0ZVTkNUSU9OKTogIE5ldy4KLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lLgotICAgICAgICAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCi0gICAgICAgICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiAgRGVjbGFyZS4KLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jICh0Y19nZW5fcmVsb2MpOiAgVXNlIG9mZnNldCBpbnN0ZWFkCi0gICAgICAgIG9mIGZ4X2FkZG51bWJlciBmb3IgVlRBQkxFIHJlbG9jIGFkZGVuZHMuCi0gICAgICAgIChtZF9hcHBseV9maXgzKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgotICAgICAgICAodjg1MF9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0gICAgICAgICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgotCi1Nb24gT2N0ICA1IDAwOjQ4OjUyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChmcF9vcGVyYW5kX2Zvcm1hdCk6IEFkZCBzb21lIGFkZGl0aW9uYWwgZm9ybWF0cy4KLQkocGFfaXApOiBEbyBub3QgYXV0b21hdGljYWxseSBwcm9tb3RlIGludG8gcGEyLjAgbW9kZS4KLQkocGFfbGV2ZWwpOiBIYW5kbGUgIi5sZXZlbCAyLjAiLgotCi1TdW4gT2N0ICA0IDIwOjU3OjQzIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgQU1EXzNETk9XX09QQ09ERS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRlbXBsYXRlLmV4dGVuc2lvbl9vcGNvZGUpOiBDaGFuZ2UgdG8KLSAgICAgICAgdW5zaWduZWQgaW50IHRvIGFsbG93IGZ1bGwgcmFuZ2Ugb2YgOC1iaXQgb3Bjb2RlIHN1ZmZpeGVzLgotCShOb25lKTogUmVkZWZpbmUgYXMgMHhmZmZmLgotCi0JRnJvbSBKZWZmIEIgRXBsZXIgPGplcGxlckB1c2dzLmdvdj4KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1TSU1EKTogTmV3IHNlY3Rpb24uCi0KLVRodSBPY3QgIDEgMTU6Mzc6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChkaXNjYXJkX3Jlc3Rfb2ZfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaDogRGVjbGFyZSBpdC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX21hc2ssIHNfYWxwaGFfZnJhbWUpOiBVc2UgaXQuCi0KLVRodSBPY3QgIDEgMTA6MzM6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbmRfb3Bjb2RlKTogQ29wZSB3aXRoIHRoZSBjYXNlIHdoZXJlIGEgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzCi0JYSBzeW1ib2wgbmFtZS4KLQotV2VkIFNlcCAzMCAxMDo1MjozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogUmVuYW1lIHRvCi0Jdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24uCi0JKHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uKTogRG8gbm90IHJlc29sdmVzIHN5bWJvbHMgaW4gb3RoZXIKLQlzZWN0aW9ucy4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IERlZmluZS4KLQotTW9uIFNlcCAyOCAxMTowMToyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEdlbmVyYXRlIGFuIGVycm9yIGlmIGEgcmVnaXN0ZXIKLQlpcyBzdXBwbGllZCBmb3IgYW4gb3BlcmFuZCB0aGF0IHNob3VsZCBub3QgYmUgYSByZWdpc3Rlci4KLQotRnJpIFNlcCAyNSAxMDowNDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogQnV0IGRvIGFsbG93IGRlbGF5ZWQgYnJhbmNoCi0JaW5zdHJ1Y3Rpb25zIHRvIGhhdmUgYW5vdGhlciBpbnN0cnVjdGlvbiBpbiB0aGUgcmlnaHQgYmluLgotCi1UaHUgU2VwIDI0IDA5OjI4OjM0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEbyBub3QgYWxsb3cgaW5zdHJ1Y3Rpb25zIGluCi0JdGhlIHJpZ2h0IGNvbnRhaW5lciBpZiB0aGUgbGVmdCBjb250YWluZXIgaG9sZHMgYSBicmFuY2gKLQlpbnN0cnVjdGlvbi4gCi0KLVdlZCBTZXAgMjMgMTA6NTQ6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocmVnX25hbWVfc2VhcmNoKTogT25seSB3YXJuIGlmIGEgbmFtZSBtYXRjaGVzCi0JYm90aCBhIHJlZ2lzdGVyIG5hbWUgYW5kIHN5bWJvbCBuYW1lLgotCShmaW5kX2Zvcm1hdCk6IEFsbG93IGNvcnJlY3QgcGFyc2luZyBvZiBNVlRTWVMgYW5kIE1WRlNZUyBpbnNucy4KLQotVHVlIFNlcCAyMiAxNzo0OToxNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogSW1wbGVtZW50IEVJVEhFUl9CVVRfUFJFRkVSX01VCi0JZXhlY3V0aW9uIHVuaXQgY2xhc3MuCi0KLQkocmVnX25hbWVfc2VhcmNoKTogSWYgYSBuYW1lIG1hdGNoZXMgYSByZWdpc3RlciBhbmQgYSBzeW1ib2wsCi0JcHJlZmVyIHRoZSByZWdpc3Rlci4KLQkoZmluZF9mb3JtYXQpOiBEaXNhbGxvdyBmbGFnIHJlZ2lzdGVycyB3aGVuIGEgZ2VuZXJhbCBwdXJwb3NlCi0JcmVnaXN0ZXIgaXMgcmVxdWlyZWQuCi0JSWYgYSBudW1iZXIgaXMgcmVxdWlyZWQsIGJ1dCBhIHJlZ2lzdGVyIGhhcyBiZWVuIGdpdmVuLCBjaGVjayB0bwotCXNlZSBpZiBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyIGV4aXN0cywgYW5kIGlmCi0Jc28sIHVzZSB0aGF0IHN5bWJvbC4KLQotVHVlIFNlcCAyMiAxNjo0MDo1MiAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVDT0ZGX0RFQlVHR0lORyk6IEFkZCBtaXNzaW5nIHBhcmVucy4KLQotVHVlIFNlcCAyMiAxNTo0NDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IERvIG5vdCBhY2NlcHQgZmxhZyByZWdpc3RlcnMgYXMKLQlnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgotCShmaW5kX2Zvcm1hdCk6IElmIGFuIGltbWVkaWF0ZSB2YWx1ZSBpcyBleHBlY3RlZCBhdCBhIGdpdmVuIHBsYWNlCi0JaW4gYSBmb3JtYXQsIGJ1dCBhIHJlZ2lzdGVyIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQgaW5zdGVhZCwgY2hlY2sKLQl0byBzZWUgaWYgdGhhdCByZWdpc3RlciBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkCi0Jc3ltYm9sIGFuZCBpZiBpdCBkb2VzLCB0aGVuIHVzZSB0aGUgc3ltYm9sIGluc3RlYWQuCi0JKHJlZ19uYW1lX3NlYXJjaCk6IElmIGEgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzIGEgc3ltYm9sIG5hbWUsCi0JcHJlZmVyIHRoZSByZWdpc3RlciBuYW1lIHRvIHRoZSBzeW1ib2wgbmFtZS4KLQotTW9uIFNlcCAyMSAxMDo0Mjo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2RvX2FsaWduKTogQWZ0ZXIgaW5zZXJ0aW5nIE5PUHMsIHJlc2V0Ci0JdGhlIHByZXZpb3VzIGluc24gdG8gZW1wdHkuCi0KLTE5OTgtMDktMjAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBEbyBub3QgYnJlYWsgc3RyaW5nIGludG8gdHdvCi0JcGllY2VzLCBmb3JjaW5nIHRoZSB1c2Ugb2YgYW4gQU5TSSBjb21waWxlci4KLQotU3VuIFNlcCAyMCAwMDo1ODoxMiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IE5ldyBtYWNyby4gIEZvcmNlIHZ0YWJsZQotCXJlbG9jcy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogRG8gbm90aGluZyBmb3IgdnRhYmxlIHJlbG9jcy4KLQotVHVlIFNlcCAxNSAwODo1MTowNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogIEhhbmRsZSBhcm0KLSAgICAgICAgYXNzZW1ibGVyIHN5bnRheC4KLSAgICAgICAgKG9ial9lbGZfdnRhYmxlX2VudHJ5KTogIExpa2V3aXNlLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIGZvciBPQkpfRUxGLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBWVEFCTEUgcmVsb2NhdGlvbnMuCi0gICAgICAgICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLSAgICAgICAgKGFybV9maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgotICAgICAgICAoZWxmMzJfYXJtX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcuCi0gICAgICAgIChhcm1lbGZfZnJvYl9zeW1ib2wpOiAgUmVtb3ZlIGNvZmYtc3R5bGUgc3ltYm9sIHN1cHBvcnQuCi0KLVdlZCBTZXAgIDkgMTE6Mjc6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRml4IHR5cG8gaW4gbGFzdCBwYXRjaC4KLQotVHVlIFNlcCAgOCAxODoxMDowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogIE1vdmUgI2lmZGVmCi0gICAgICAgIE9CSl9DT0ZGIHNvIHRoYXQgcm91dGluZSBpcyBkZWZpbmVkIGZvciBhLm91dCBmb3JtYXQuCi0KLVR1ZSBTZXAgIDggMTU6NTY6MTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRGV0ZWN0IG5vbi1zZWdtZW50IHJlZ2lzdGVycwotCXVzZWQgYXMgc2VnbWVudCBwcmVmaXhlcy4KLQotU2F0IFNlcCAgNSAxOTowMDozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVob3B0LmMgKGNoZWNrX2VoX2ZyYW1lKTogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIEZERSwgYW5kIGRvbid0Ci0Jb3B0aW1pemUgYWNyb3NzIEZERSBib3VuZGFyaWVzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IFByZXNlcnZlIGFueSBsaW5rIG9uY2UKLQlmbGFncyB3aGVuIHNldHRpbmcgdGhlIHNlY3Rpb24gZmxhZ3MuCi0KLUZyaSBTZXAgIDQgMTc6MDc6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChvYmpfYWRqdXN0X3N5bXRhYik6IEZpeGVkIHR5cG8uCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybWVsZl9hZGp1c3Rfc3ltdGFiKTogUmVmb3JtYXR0ZWQuCi0KLUZyaSBTZXAgIDQgMTM6NTc6NDMgMTk5OCAgSmFrdWIgSmVsaW5layA8ampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX3NpZ25lZF9yYW5nZSk6IFNpZ24gZXh0ZW5kIDMyLWJpdCB3b3JkcwotCXRvIHRoZSBob3N0IHdpZHRoLgotCi1XZWQgU2VwICAyIDExOjMxOjE0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfZ3Jvdyk6IEluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgc3RydWN0IGluIHRoZQotCW9ic3RhY2sgY2h1bmsgc2l6ZS4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBBZGp1c3QgdGhlIHNlZ2luZm8gZnJjaGFpbiBzdGFydAotCWlmIHRoZSBuZXcgc3Vic2VnIGNvbWVzIGJlZm9yZSB0aGUgb2xkLgotCi1UdWUgU2VwICAxIDE1OjAxOjMzIDE5OTggIEpha3ViIEplbGluZWsgPGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IGFsbCBkaWdpdHMgaW4gYW4gaW5zdHJ1Y3Rpb24KLQl0byBoYW5kbGUgZWRnZTggYW5kIGVkZ2UxNi4KLQotTW9uIEF1ZyAzMSAwOTo1MToxNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogUHJpbnQgZXJyb3IgbWVzc2FnZQotCWJlZm9yZSB3ZSBjbG9iYmVyIHRoZSBzeW1ib2wgaW52b2x2ZWQuCi0KLU1vbiBBdWcgMzEgMTA6NTg6MDYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmM6ICBSZW1vdmUgT0JKX0VMRiBkZWZpbml0aW9ucyBmb3IgCi0gICAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgYW5kIFNfU0VUX1NUT1JBR0VfQ0xBU1MuICBPbmx5Ci0gICAgICAgIHVzZSBhcm1fYWRqdXN0X3N5bXRhYiBmb3IgT0JKX0NPRkYuCi0gICAgICAgIChhcm1lbGZfYWRqdXN0X3N5bXRhYik6ICBOZXcgUm91dGluZS4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmg6ICBEZWZpbmUgb2JqX2FkanVzdF9zeW10YWIgdG8KLSAgICAgICAgYXJtZWxmX2FkanVzdF9zeW10YWIgZm9yIE9CSl9FTEYuCi0gICAgICAgIAotU2F0IEF1ZyAyOSAyMjoxODo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgYWxsIGkzODYtZWxmIHRhcmdldHMgdXNlIGJmZF9nYXMuCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcuCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBmaXggdnRhYmxlIHJlbG9jcy4KLQkobWRfYXBwbHlfZml4Myk6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgdGhlbS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBBbHdheXMgZGVmaW5lLCBjYWxsaW5nCi0JdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uLgotCi1Nb24gQXVnIDI0IDEzOjQwOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfc2hvd191c2FnZSk6IEltcHJvdmUgZm9ybWF0dGluZyBvZiAtLWhlbHAgb3V0cHV0LgotCi1GcmkgQXVnIDIxIDE4OjQzOjQ4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogQ29weSBwcmV2aW91cyBvcGNvZGUgb3ZlcgotCWN1cnJlbnQgb3Bjb2RlIGFmdGVyIHdyaXRpbmcgdGhlIGZpcnN0IGluc3R1cmN0aW9uIG9mIGEgcmV2ZXJzZQotCXNlcXVlbnRpYWwgcGFpci4gCi0JCi1GcmkgQXVnIDIxIDA3OjMwOjM1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogQWRkIHByb3RvdHlwZS4KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogTWFrZSBub24tc3RhdGljLgotCi1UaHUgQXVnIDIwIDIzOjE3OjA0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBPbmx5IHdhcm4gZm9yIGFkZHJlc3MvZGF0YSBzaXplCi0JcHJlZml4ZXMuCi0KLVRodSBBdWcgMjAgMTQ6NDU6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChhcm1fZml4X2FkanVzdGFibGUpOiBEbyBub3QgYWRqdXN0IHJlbG9jYXRpb25zCi0JYWdhaW5zdCBUaHVtYiBmdW5jdGlvbiBuYW1lcywgYXMgdGhlIGxpbmtlciBuZWVkcyB0aGlzIGluZm9ybWF0aW9uLgotCi0xOTk4LTA4LTIwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogQ2hlY2sgYWxzbyB0aGF0IHRoZXJlIGlzIG5vIGFkdmFuY2UgaW4gb3BlcmFuZAotCWFmdGVyIGF0b2ZfZ2VuZXJpYyBpbiBvcmRlciB0byBkZWNpZGUgImlzIGl0IGxhYmVsIDBmIG9yIGZsb2F0aW5nCi0JcG9pbnQgbnVtYmVyPyIuCi0KLVdlZCBBdWcgMTkgMDk6MzA6MTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYzogUmVwbGFjZSBkb3VibGUgZGFzaCBwcmVmaXggdG8gTTMyUiBzcGVjaWZpYwotCWNvbW1hbmQgbGluZSBvcHRpb25zIHdpdGggYSBzaW5nbGUgZGFzaC4KLQkqIGRvYy9jLW0zMnIudGV4aTogUmVwbGFjZSBkb3VibGUgZGFzaCBwcmVmaXggd2l0aCBhIHNpbmdsZSBkYXNoLgotCi1UdWUgQXVnIDE4IDExOjU5OjQzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiB0Yy1hcm0uaDogRGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZSBmb3IgT0JKX0VMRi4KLSAgICAgICAqIHRjLWFybS5jIChhcm1fZml4X2FkanVzdGFibGUpOiBOZXcgcm91dGluZS4KLQotMTk5OC0wOC0xMyAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19hbGlnbiwgc19jb21tLCBzX21yaV9jb21tb24sIHNfZmFpbCwgc19nbG9ibCwgc19zcGFjZSwKLQlzX2Zsb2F0X3NwYWNlLCBzX3N0cnVjdCwgY29uc193b3JrZXIpOiBNb3ZlIGlnbm9yZV9yZXN0X29mX2xpbmUgb3IKLQlkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lIGJlZm9yZSBtcmlfY29tbWVudF9lbmQuCi0JKGVxdWFscyk6IENoZWNrIGdhcmJhZ2UgYWZ0ZXIgZXhwcmVzc2lvbiBiZWZvcmUKLQltcmlfY29tbWVudF9lbmQgaW4gTVJJIG1vZGUuCi0KLVRodSBBdWcgMTMgMTU6MDg6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgTV9TR0VfSS9NX1NHRVVJX0kgY2FzZSBmb3IgYQotCXNtYWxsIGltbWVkaWF0ZSBjb25zdGFudCB0byB1c2UgdGhlIGNvbnN0YW50IGl0c2VsZiByYXRoZXIgdGhhbgotCWFsd2F5cyB1c2luZyAxLgotCi1XZWQgQXVnIDEyIDE4OjQ3OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZW50ZXIpOiBDYWxsIGFzX2JhZCByYXRoZXIgdGhhbiBhYm9ydC4KLQkocGFfbGVhdmUpOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxMiAxMzoyNTowMyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBhIHdhcm5pbmcgZm9yIHN0YW5kLWFsb25lCi0JcHJlZml4ZXMuCi0JKGkzODZfb3BlcmFuZCk6IEZpeCBhbiBlcnJvciBtZXNzYWdlLgotCi1UdWUgQXVnIDExIDE0OjQ0OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0gRGlyZWN0aXZlcyk6IERvY3VtZW50IC5yZXEgZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHJlZ19yZXF1aXJlZF9oZXJlKTogRGlzcGxheSBlcnJvbmVvdXMgc3RyaW5nIGlmCi0JdGhlIHJlZ2lzdGVyIG5hbWUgY291bGQgbm90IGJlIGRlY29kZWQuCi0JRG8gbm90IHNldCBpbnN0Lmluc3RydWN0aW9uIGlmIHRoZSBzaWZ0IGlzIC0xLgotCi1Nb24gQXVnIDEwIDE1OjM5OjU2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBCaWFzIFdFQUsgc3ltYm9scyBqdXN0IGFzCi0Jd2UgZG8gZm9yIEVYVEVSTi4KLQotTW9uIEF1ZyAxMCAxNTowNjoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQWx3YXlzIHBlcmZvcm0gYWxpZ25tZW50IHJlcXVlc3QsCi0JZXZlbiBpZiBpdCBpcyBiZWxpdmVkIHRvIGJlIHVubmVjZXNzYXJ5LgotCi1Nb24gQXVnIDEwIDE3OjQ4OjA5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCWNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IFNpemUgaW1tZWRpYXRlIGNvbnN0YW50cyBieQotCXN1ZmZpeCAoZXJyb25lb3VzbHkgcmVtb3ZlZCBhcyBwYXJ0IG9mIEp1bHkgNyBjaGFuZ2UpLgotCi1TdW4gQXVnICA5IDIwOjQ1OjMyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL29iai1lbGYuaDogIENoZWNrIGZvciByZWRlZmluaXRpb24gb2Ygb2JqX2Zyb2Jfc3ltYm9sLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYzogIERlZmluZSBTX0dFVF9TVE9SQUdFX0NMQVNTIGFuZCBTX1NFVF9TVE9SQUdFX0NMQVNTLgotICAgICAgICAoYXJtZWxmX2Zyb2Jfc3ltYm9sKTogIE5ldyBSb3V0aW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBvYmpfZnJvYl9zeW1ib2wgaWYgT0JKX0VMRi4KLQotU2F0IEF1ZyAgOCAxNToyMToyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3Qgd2VhayBzeW1zLgotCi1XZWQgQXVnICA1IDE1OjU0OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBTZXQgQkZEIHByaXZhdGUgZmxhZ3MgZGVwZW5kaW5nIHVwb24KLQljb21tYW5kIGxpbmUgc3dpdGNoZXMgcGFzc2VkIHRvIGFzc2VtYmxlci4KLQotTW9uIEF1ZyAgMyAxNDowMjo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChHQVNfQ0dFTl9NQVhfRklYVVBTKTogR0FTXyBwcmVwZW5kZWQsIGFsbCB1c2VzIHVwZGF0ZWQuCi0JKGdhc19jZ2VuX29wY29kZV9kZXNjKTogRGVjbGFyZS4KLQkoZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCk6IERlY2xhcmUuCi0JKCopOiBQcmVwZW5kIGdhc18gdG8gZ2FzIHNwZWNpZmljIGZucyB0byBkZW5vdGUgdGhlbSBhcyBzdWNoLgotCUFsbCB1c2VzIHVwZGF0ZWQuCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX29wY29kZV9kZXNjKTogTmV3IGdsb2JhbAotCShnYXNfY2dlbl9pbml0X3BhcnNlKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX2luaXRfcGFyc2UuCi0JKHF1ZXVlX2ZpeHVwKTogUmVuYW1lZCBmcm9tIGNnZW5fcXVldWVfZml4dXAuCi0JKCopOiBQcmVwZW5kIGdhc18gdG8gZ2FzIHNwZWNpZmljIGZucyB0byBkZW5vdGUgdGhlbSBhcyBzdWNoLgotCUFsbCB1c2VzIHVwZGF0ZWQuCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUgY2FsbCB0byBpbnNlcnRfb3BlcmFuZC4KLQkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fZmluaXNoX2luc24uCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFJlbW92ZSB1c2Ugb2YgQ0dFTl9TWU0uCi0JT3BlbiBvcGNvZGUgdGFibGUgYW5kIGluaXRpYWxpemUgaXQuCi0JKG1ha2VfcGFyYWxsZWwpOiBVc2UgZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MuCi0JKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBEaXR0by4gIFJlbW92ZSB1c2Ugb2YgQ0dFTl9TWU0uCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0KLVNhdCBBdWcgIDEgMTk6Mjc6MzAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZGVidWdfaW5mb190eXBlKTogQWRkIGVudHJpZXMgZm9yIHVuc3BlY2lmaWVkIGFuZCBkd2FyZiouCi0JKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogVGFrZSBubyBhcmd1bWVudHM7IGNhbGwKLQlhc193aGVyZSBvdXJzZWx2ZXMuICBQcm92aWRlIGEgc3R1YiBmb3IgIUVDT0ZGX0RFQlVHR0lORy4KLQkqIGVjb2ZmLmg6IE1vdmUgRUNPRkZfREVCVUdHSU5HIHByb3RlY3Rpb24gaW5zaWRlIEdBU19FQ09GRl9ILgotCU1vdmUgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyBvdXRzaWRlIEVDT0ZGX0RFQlVHR0lORyBwcm90ZWN0aW9uLgotCSogcmVhZC5jIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBUaWR5IEVDT0ZGIGJpdHMuICBVc2UKLQlERUJVR19VTlNQRUNJRklFRCByYXRoZXIgdGhhbiBERUJVR19OT05FIGZvciBpbml0aWFsIHRlc3QuCi0JKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpIFtUQ19BTFBIQV06IERlZmluZSB0byBhIHZhcmlhYmxlLgotCShTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogQ29uZGl0aW9uYWxpemUgb24gdmFsdWUgb2YgRUNPRkZfREVCVUdHSU5HLgotCShJTklUX1NUQUJfU0VDVElPTik6IExpa2V3aXNlLgotCShPQkpfUFJPQ0VTU19TVEFCKTogTGlrZXdpc2UuCi0JCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfbG9uZ29wdHMpOiBOZXcgb3B0aW9ucyAtbWRlYnVnLy1uby1tZGVidWcuCi0JKG1kX3BhcnNlX29wdGlvbik6IFdhdGNoIGZvciB0aGVtLgotCShhbHBoYV9jdXJfZW50X3N5bSwgYWxwaGFfZmxhZ19tZGVidWcpOiBOZXcgdmFyaWFibGVzLgotCShtZF9iZWdpbik6IEtpbGwgbmV2ZXJkZWYgY29kZS4KLQkoc19hbHBoYV9lbnQsIHNfYWxwaGFfZW5kLCBzX2FscGhhX21hc2ssIHNfYWxwaGFfZnJhbWUpOiBOZXcuCi0JKHNfYWxwaGFfcHJvbG9ndWUpOiBXYXRjaCBhbHBoYV9jdXJfZW50X3N5bS4KLQkoc19hbHBoYV9jb2ZmX3dyYXBwZXIpOiBOZXcuCi0JKG1kX3BzZXVkb190YWJsZSk6IFRyYXAgYWxsIEVDT0ZGIHBzZXVkb3MuCi0JCi1GcmkgSnVsIDMxIDE2OjQ1OjU0IDE5OTggIFJvbiBVbnJhdSA8cnVucmF1QGN5Z251cy5jb20+Ci0KLQlTdGFydCBvZiBjaGFuZ2VzIHRvIHJlbW92ZSBtZGVidWcgc2VjdGlvbiBmcm9tIG1pcHMqLWVsZgotCUJhc2VkIG9uIE1JUFNfU1RBQl9FTEYgZGVmaW5pdGlvbgotCSogYWNjb25maWcuaDogdW5kZWYgaWYgbm90IGNvbmZpZ3VyZWQKLQkqIGNvbmZpZy5pbjogdW5kZWYgaWYgbm90IGNvbmZpZ3VyZWQKLQkqIGNvbmZpZy9taXBzLWVsZi5oOiBvbmx5IHNldCBFQ09GRiBkZWJ1Z2dpbmcgaWYgbm90IHN0YWJzLWluLWVsZgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19lbnQpOiBzZXQgQlNGX0ZVTkNUSU9OCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IGZsdXNoIGZyYWcKLQotRnJpIEp1bCAzMSAxNjoxNDo0NSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogKGFybS0qLWVsZik6ICBIYW5kbGUuCi0gICAgICAgICh0aHVtYi0qLWVsZik6IEhhbmRsZS4KLSAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotICAgICAgICAqIHJlYWQuYyAoc3RyaW5nZXIpOiBGaXggdHlwbyBpbiBjb21tZW50LgotICAgICAgICAqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgotICAgICAgICBUQ19BUk0gYW5kIE9CSl9FTEYuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jIChtZF9zZWN0aW9uX2FsaWduKTogIERvbid0IGFsaWduIGR3YXJmIGRlYnVnCi0gICAgICAgIHNlY3Rpb25zLgotICAgICAgICAodGNfZ2VuX3JlbG9jKTogIEFsd2F5cyBzZXQgdGhlIHJlbG9jIGFkZGVuZCB0byBmaXhwLT5meF9vZmZzZXQKLSAgICAgICAgZm9yIE9CSl9FTEYuCi0KLVRodSBKdWwgMzAgMjE6Mzg6NDMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoe2N1cixwcmV2fV9sZWZ0X2tpbGxzX3JpZ2h0X3ApOiBOZXcgdmFyaWFibGVzLgotCSh3cml0ZV8yX3Nob3J0KTogRW1pdCB3YXJuaW5nIGlmIG5ldyBmbGFnIGlzIHNldC4KLQkoZG9fYXNzZW1ibGUpOiBTZXQgZmxhZ3MgaWYgbGVmdCBpbnN0cnVjdGlvbiBpcyBvbmUgb2Ygc3BlY2lhbAotCSJyaWdodC1pbnN0cnVjdGlvbi1raWxsZXIiIHR5cGUuCi0KLVR1ZSBKdW4gMjggMTg6MTI6MjggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0JCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfbnVtYmVyX3RvX2NoYXJzLCBjb25zX2ZpeF9uZXdfc3BhcmMpOgotCUFsd2F5cyBvdXRwdXQgd29yZHMgaW4gZGVidWdfaW5mbyBzZWN0aW9uIGFzIGJpZyBlbmRpYW4uCi0JKHNwYXJjX3RhcmdldF9mb3JtYXQpOiBDaG9vc2UgY29ycmVjdCBiZmQgdGFyZ2V0LgotCShtZF9hcHBseV9maXgzKTogUmVuYW1lIEJGRF9SRUxPQ19TUEFSQ18zMkxFIHRvIEJGRF9SRUxPQ19TUEFSQ19SRVYzMi4KLQkKLVR1ZSBKdWwgMjggMTE6MDE6MjEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEZpeCAiZXJybXNnIiBpbml0aWFsaXphdGlvbgotCXRvIHdvcmsgd2l0aCBpbnRlcm5hdGlvbmFsaXphdGlvbiBjb2RlLiAgSXNzdWUgYW4gZXJyb3Igd2hlbiB0d28KLQlvcGVyYW5kcyBtYXRjaCB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBtYXRjaC4KLQotTW9uIEp1bCAyNyAxNjoyNTo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGluc3RhbGxfdG9vbGRpcik6IEFsbG93IHRhcmdldCB0byBzcGVjaWZ5IHdoZXRoZXIKLQlpdCB3YW50cyB0byBiZSBpbnN0YWxsZWQgaW4gJCh0b29sZGlyKS9iaW4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogU2V0IGluc3RhbGwtZXhlYy10b29sZGlyCi0JZGVwZW5kZW5jeSB2aWEgY29uZmlndXJlLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdWwgMjQgMTk6NTg6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IFNwbGl0IGludG8gdHdvIC4uLgotCShpbnN0YWxsLWV4ZWMtYmluZGlyLGluc3RhbGwtZXhlYy10b29sZGlyKTogTmV3IHJ1bGVzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdWwgMjQgMTY6MzE6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDI0IDA5OjEzOjQ2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoY2dlbl9tZF9hcHBseV9maXgzKTogVXBkYXRlIGNhbGwgdG8gbWRfY2dlbl9sb29rdXBfcmVsb2MuCi0JKGNnZW5fdGNfZ2VuX3JlbG9jKTogVXNlIHhtYWxsb2MsIG5vdCBiZmRfYWxsb2MuCi0JKiBjZ2VuLmggKGNnZW5fbWRfYXBwbHlfZml4MyxjZ2VuX3RjX2dlbl9yZWxvYyk6IERlY2xhcmUuCi0JKG1kX2NnZW5fbG9va3VwX3JlbG9jKSk6IERlY2xhcmUuCi0JKG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTMyci5oIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBEZWNsYXJlLgotCShtMzJyX3JlbGF4X2ZyYWcpOiBEZWNsYXJlLgotCShjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEZWNscyBtb3ZlZCB0byBjZ2VuLmguCi0JKGNnZW5fcmVjb3JkX2ZpeHVwX2V4cCxjZ2VuX3RjX2dlbl9yZWxvYyk6IERpdHRvLgotCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERlbGV0ZSBkZWNsLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9jcHVfZGVzYyk6ICNpZiAwIG91dC4KLQkoYXNzZW1ibGVfbm9wKTogRGVsZXRlLgotCShleHBhbmRfZGVidWdfc3ltcyk6IERlbGV0ZSB1bnVzZWQgYGV4cCcuCi0JKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogUmVuYW1lZCBmcm9tIENHRU5fU1lNIChsb29rdXBfcmVsb2MpLgotCUFkZCBkZWZhdWx0IGNhc2UgZm9yIC1XYWxsLgotCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IEFkZCBkZWZhdWx0IGNhc2UgZm9yIC1XYWxsLgotCShtZF9hdG9mKTogRGVsZXRlIHVudXNlZCB3b3JkUC4KLQotVGh1IEp1bCAyMyAxMzoxOTo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdXJlICJlcnJtc2ciIGhhcyBhIG5vbi1OVUxMCi0JdmFsdWUuCi0KLVdlZCBKdWwgMjIgMTQ6MzY6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24gZm9yIC5lbmQsIC5leGl0bSwgLmZhaWwsCi0JLmlmYywgLmlmZXFzLCAuaWZnZSwgLmlmZ3QsIC5pZmxlLCAuaWZsdCwgLmlmbmMsIC5pZm5lLCAuaWZuZXMsCi0JLnByaW50LCAucHVyZ2VtLCBhbmQgLnN0cnVjdC4gIFJlbW92ZSBkb2N1bWVudGF0aW9uIGZvcgotCS5hcHAtZmlsZS4KLQotVHVlIEp1bCAyMSAxNjo1MDo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBzZXRfb3BlcmFuZCByZW5hbWVkIHRvIHNldF92bWFfb3BlcmFuZC4KLQlVcGRhdGUgY2FsbCB0byBpbnNlcnRfb3BlcmFuZC4KLQotRnJpIEp1bCAxNyAxMTo0MjoyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtc19zaG93X3VzYWdlKTogRm9ybWF0dGluZyBjaGFuZ2VzLgotCi1XZWQgSnVsIDE1IDE1OjM4OjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgdHJhaWxpbmcKLQl3aGl0ZXNwYWNlIGFmdGVyIGEgcHJlZml4IG9wZXJhdG9yLgotCi1UdWUgSnVsIDE0IDE1OjMyOjU2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgotCi1UdWUgSnVsIDE0IDEyOjMzOjQ0IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsb2cyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19yZXNlcnZlKTogVXNlIGxvZzIgdG8gY29udmVydCBhbGlnbm1lbnQgYmVmb3JlIGNhbGxpbmcKLQlyZWNvcmRfYWxpZ25tZW50LgotCShzX2NvbW1vbik6IFVzZSBsb2cyIHRvIGNvbnZlcnQgYWxpZ25tZW50IGJlZm9yZSBjYWxsaW5nCi0JcmVjb3JkX2FsaWdubWVudCBhbmQgZnJhZ19hbGlnbi4KLQkoc3BhcmNfY29uc19hbGlnbik6IFVzZSBsb2cyLgotCi1UdWUgSnVsIDE0IDExOjU4OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IFNldCBzeW1ib2wgc2l6ZSBpZiBPQkpfRUxGLgotCShzX2NvbW1vbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaGFuZGxlX2FsaWduKTogUmVpbmRlbnQgYSBiaXQuICBDb3JyZWN0Ci0JaW5pdGlhbGl6YXRpb24gb2Ygd2FkZHIuCi0JKHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0KLVR1ZSBKdWwgMTQgMTE6MDA6MTYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBkb2MvYy1pMzg2LnRleGk6IEZpeCBhIHR5cG8uICBVc2UgdGhlIHRlcm0gODAtYml0IHJlYWwgcmF0aGVyCi0JdGhhbiB0ZW1wb3JhcnkgcmVhbC4KLQotTW9uIEp1bCAxMyAxMzo1NTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogRG9uJ3QgYWxpZ24gdGhlIHNlZ21lbnRzIGlmIHRoZXJlIHdlcmUKLQlhbnkgZXJyb3JzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBDb3JyZWN0IG51bWJlciBvZiBieXRlcyB3aGVuCi0JY29weWluZyBhdXggaW5mb3JtYXRpb24uCi0KLQkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IENhdGNoIGF0dGVtcHRzIHRvIHR1cm4gYW4gT19iaWcKLQlleHByZXNzaW9uIGludG8gYSBzeW1ib2wuCi0KLU1vbiBKdWwgMTMgMTM6Mjk6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtb2RlX2Zyb21fZGlzcF9zaXplKTogQ2hhbmdlIGFyZyBhbmQgcmV0dXJuCi0JdHlwZSB0byB1bnNpZ25lZCBpbnQuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIHR5cGUgdXNlZCB0byBzdG9yZSBvZmZzZXRzIGZyb20gdW5zaWduZWQKLQlsb25nIHRvIGxvbmcuCi0JKGkzODZfb3BlcmFuZCk6IFN3aXRjaCBlcnJvciBjaGVjayB0byBvbmx5IGNhbGwgUkVTVE9SRV9FTkRfU1RSSU5HCi0Jb25jZSBhZnRlciBwYXJzZV9yZWdpc3Rlci4KLQotRnJpIEp1bCAxMCAxNjowMDowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9zaG93X3VzYWdlKTogQ2hhbmdlZCBmb3JtYXQgdG8gbWF0Y2ggdGhhdAotCW9mIGdjYywgbGQsIGV0Yy4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IENoYW5nZWQgZm9ybWF0IHRvIG1hdGNoIHRoYXQgb2YgZ2NjLCBsZCwgZXRjLgotCi1UaHUgSnVsICA5IDEyOjA5OjU3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHZ0YWJsZQotCXJlbG9jcy4KLQkobWRfYXBwbHlfZml4XzIpOiBGb3JjZSB0aGUgc3ltYm9sIG9mIHRoZSB2dGFibGUgcmVsb2MgdG8gYmUKLQl3ZWFrLgotCi1UaHUgSnVsICA5IDExOjMxOjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL01ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEp1bCAgOCAxMjoxODo1NiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLCBjYXNlICdpJyBhbmQgJ2onKTogTWFzayBvZmYgaGlnaCBiaXRzCi0gICAgICAgIGZvciAlbG8gZXhwcmVzc2lvbnMuCi0gICAgICAgIChtaXBzX2lwLCBjYXNlICd1Jyk6IE1vdmUgcmFuZ2UgY2hlY2sgYWZ0ZXIgY29kZSB0byBtYXNrCi0gICAgICAgIG9mZiBiaXRzIGluICVoaS8lbG8gZXhwcmVzc2lvbnMuICBNYXNrIG9mZiBoaWdoIGJpdHMgZm9yCi0gICAgICAgICVsbyBleHByZXNzaW9ucy4KLQotVHVlIEp1bCAgNyAxNzo1NzozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9NYWtlZmlsZS5hbSAoZ2FzdmVyLnRleGkpOiBOZXcgdGFyZ2V0LgotCShhcy5pbmZvLCBhcy5kdmkpOiBEZXBlbmRzIHVwb24gZ2FzdmVyLnRleGkuCi0JKiBkb2MvYXMudGV4aW5mbzogSW5jbHVkZSBnYXN2ZXIudGV4aS4gIE1lbnRpb24gdmVyc2lvbiBudW1iZXIgb24KLQl0aXRsZSBwYWdlIGFuZCBpbiB0b3Agbm9kZS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1bCAgNyAxMTo0MjoxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbGlzdGluZyk6IEZvciBFRElDVF9MSVNULCBza2lwIGFsbCBsaW5lcyB1cCB0bwotCWJ1dCBub3QgaW5jbHVkaW5nIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGVkaWN0LgotCSogbGlzdGluZy5oIChMSVNUSU5HX0VPRik6IE5ldy4KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogQ2FsbCBpdC4KLQotVHVlIEp1bCAgNyAxMzowMDozNyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IERvbid0IHNldCB0aGUgc2l6ZSBvZiBhbgotIAlpbW1lZGlhdGUgYWRkcmVzcyBiYXNlZCBzb2xlbHkgb24gdGhlIHN1ZmZpeCBhbmQgdGhlIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRkIGFzc2VydGlvbiB0byBtYWtlIHN1cmUKLQlvdmVybGFwMiBkb2VzIG5vdCBzZXQgSW1tLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzcGFjZV9jaGFycyk6IFJlbW92ZS4gVGhlIHNjcnViYmVyIGNvbnZlcnRzCi0Jc2VxdWVuY2VzIG9mIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UuCi0JKGlzX3NwYWNlX2NoYXJzKTogSnVzdCBjb21wYXJlIHdpdGggc3BhY2UuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSBzcGFjZV9jaGFycy4KLQkobWRfYXNzZW1ibGUpOiBKdXN0IHNraXAgYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuCi0JKGkzODZfb3BlcmFuZCk6IFJld3JpdGUgYmFzZS1pbmRleCBwYXJzaW5nIHRvIHVzZSBuZXcKLQlwYXJzZV9yZWdpc3RlciwgYW5kIHRvIHNraXAgd2hpdGUgc3BhY2UuICBTa2lwIHdoaXRlIHNwYWNlIGluIGEKLQludW1iZXIgb2Ygb3RoZXIgcGxhY2VzIHRvby4gIERvbid0IGdpdmUgZXJyb3IgbWVzc2FnZSBpZgotCXBhcnNlX3JlZ2lzdGVyIGZhaWxzLgotCShwYXJzZV9yZWdpc3Rlcik6IENoYW5nZSByZWdfc3RyaW5nIHBhcmFtZXRlciB0byBiZSBub24tY29uc3QuCi0JQWRkIGVuZF9vcCBwYXJhbWV0ZXIuICBTa2lwIHdoaXRlIHNwYWNlIGFmdGVyIHRoZSBgJScsIGFuZCByZXR1cm4KLQllbmQgb2YgcmVnaXN0ZXIgc3RyaW5nLiAgR2l2ZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW4KLQljYWxsZXIuCi0KLUZyaSBKdWwgIDMgMTU6MzQ6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXR0IFNlbWVyc2t5IDxtYXR0c0BzY2QuaHAuY29tPjoKLQkqIGV4cHIuYyAob3BfZW5jb2RpbmcpOiBNYWtlIGNvbnN0LgotCShleHByX3NldF9wcmVjZWRlbmNlKTogTmV3IGZ1bmN0aW9uLgotCShleHByX2JlZ2luKTogRG9uJ3Qgc2V0IG9wZXJhdG9yIHJhbmtpbmdzLCBqdXN0IGNhbGwKLQlleHByX3NldF9wcmVjZWRlbmNlLgotCSogZXhwci5oIChleHByX3NldF9wcmVjZWRlbmNlKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoc19tcmkpOiBDYWxsIGV4cHJfc2V0X3ByZWNlZGVuY2UuCi0KLVRodSBKdWwgIDIgMTY6MjQ6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU3RhdGVtZW50cyk6IFJlbW92ZSBwYXJhZ3JhcGggZGlzY3Vzc2luZwotCWNvbnRpbnVpbmcgbGluZXMgd2l0aCBhIGJhY2tzbGFzaC4gIFRoaXMgaGFzbid0IHdvcmtlZCBmb3IgeWVhcnMsCi0JaWYgaXQgZXZlciBkaWQuCi0KLVRodSBKdWwgIDIgMTQ6MDY6MjIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLSAgICAgICAgKiBvYmotdm1zLmM6IEFkZCBDKysgc3VwcG9ydCB3aXRoIGN0b3JzL2R0b3JzIHNlY3Rpb25zLiAgQWRkIHdlYWsKLQlzeW1ib2wgZGVmaW5pdGlvbnMuCi0JKEN0b3JzX1N5bWJvbHMsIER0b3JzX1N5bWJvbHMpOiBOZXcgc3ltYm9sIGNoYWlucy4KLQkocHNfQ1RPUlMsIHBzX0RUT1JTKTogTmV3IHNlY3Rpb24gdHlwZXMuCi0JKHZtc19maXh1cF94dG9yc19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uCi0JKEN0b3JzX1BzZWN0LCBEdG9yc19Qc2VjdCk6IERlZmluZS4KLQkoSVNfR1hYX1hUT1IpOiBEZWZpbmUKLQkoZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBDaGFuZ2UgY2hlY2sgb2YgZ3h4X2J1Z19maXhlZCB0byAwLgotCUZpbHRlciBzdGF0aWMgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIGFuZCBhZGQgdG8KLQlDdG9yc19TeW1ib2xzL0R0b3JzX1N5bWJvbHMgY2hhaW4uCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSk6IFdyaXRlIEN0b3JzX1N5bWJvbHMvRHRvcnNfU3ltYm9scyB0bwotCWFwcHJvcHJpYXRlIHNlY3Rpb24uCi0KLSAgICAgICAgKiB0Yy1hbHBoYS5oIChUQVJHRVRfRk9STUFUKTogUmVuYW1lICJldmF4LWFscGhhIiB0byAidm1zLWFscGhhIi4KLQkqIG1ha2VmaWxlLnZtczogTWVyZ2UgdmF4L3ZtcyBzdXBwb3J0LgotCi1XZWQgSnVsICAxIDIwOjA2OjIwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQsIG9ial9lbGZfdnRhYmxlX2VudHJ5KTogTmV3LgotCShlbGZfcHNldWRvX3RhYmxlKTogQWRkIHRoZW0uCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSB2dGFibGUgcmVsb2NzLgotCShtZF9hcHBseV9maXgpOiBBY2NlcHQgdGhlbS4KLQkobWlwc19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB0aGVtLgotCSh0Y19nZW5fcmVsb2MpOiBNdW5nIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkgZm9yIFJlbC4KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFjY2VwdCB2dGFibGUgcmVsb2NzLgotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04pOiBGb3JjZSB2dGFibGUgcmVsb2NzLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB0aGVtLgotCi1XZWQgSnVsICAxIDE2OjM1OjMyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0dFTl9DUFVfUFJFRklYKTogTmV3IHZhcmlhYmxlLgotCShjZ2VuLm8pOiBVc2UgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogQUNfU1VCU1QgY2dlbl9jcHVfcHJlZml4LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1XZWQgSnVsICAxIDIxOjM4OjU2IDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaCAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTJfREVMQVlfTEVOR1RIKTogRGVmaW5lLgotCUNoYW5nZWQgYWxsIHVzZXJzIG9mIENPTkQxMl9ERUxBWS4KLQotRnJpIEp1biAyNiAxMToyMToxMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHNldF9hcmNoX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBwc2V1ZG8tb3BzIHRvIHNldCB0aGUgY3VycmVudCBtYWNoaW5lIHR5cGUuCi0JKG1kX2JlZ2luKTogRGVmYXVsdCB0byBtbjEwMzAwIG1vZGUuCi0JKG1kX2Fzc2VtYmxlKTogT25seSBhY2NlcHQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY29yZSBtbjEwMzAwCi0JY2hpcCBhbmQgdGhlIGFjdGl2ZSBtYWNoaW5lIHR5cGUuCi0KLVdlZCBKdW4gMjQgMTk6MDY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogR2l2ZSB0aGUgc3RydWN0IGEgbmFtZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oICh0Y19yZWxvY19tYW5nbGUpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLWg4NTAwLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtc2guaCAoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLXc2NS5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXo4ay5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCi1XZWQgSnVuIDI0IDEzOjQ1OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogIFJlc3RvcmUgb2xkIHNlY3Rpb24KLSAgICAgICAgYWZ0ZXIgY29tbW9uIHByb2Nlc3NpbmcuCi0KLVdlZCBKdW4gMjQgMTE6NTA6NTQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKENyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUpOiBGb3JjZSBiaW5hcnkgZmlsZS4KLQotVHVlIEp1biAyMyAxNzo0NzozMSAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChkb19hX2ZpeF9pbW0sIGJ1aWxkX2J5dGVzKTogUmVwbGFjZSBjYXN0IHRvCi0JY2hhciB3aXRoIGNvZGUgdGhhdCBleHBsaWNpdGx5IHNpZ24tZXh0ZW5kcy4KLQotVHVlIEp1biAyMyAxMzo1NDo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiBSZXN0b3JlIHRleHQgc2VjdGlvbiBhcyB0aGUgY3VycmVudAotCXNlY3Rpb24gYWZ0ZXIgY3JlYXRpbmcgY2FsbCB0YWJsZSBzZWN0aW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTWU1fQVVYSU5GTyk6IE5ldyBtYWNybyB0byBjb25jZWFsIHVnbHkKLQljb2RlLiAKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogUmVwbGFjZSBjb21wbGV4IGV4cHJlc2lvbgotCXdpdGggY2FsbCB0byBtYWNybyBTWU1fQVVYSU5GTy4KLQotVHVlIEp1biAyMyAxNTowOToyNyAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQotCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEp1biAyMiAxOTo1Mjo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3N5bWJvbF9tZXJnZSk6IEZpeCBjb3B5aW5nIG9mIGF1eGlsaWFyeQotCWluZm9ybWF0aW9uLgotCi1Nb24gSnVuIDIyIDE1OjE4OjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQmUgcHJlcGFyZWQgZm9yIGEgc3BhY2UgYmV0d2VlbgotCXRoZSBvcGVuIHBhcmVudGhlc2lzIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmQsCi0JYmVjYXVzZSBvZiB0aGUgSnVuZSAxNiBjaGFuZ2UuCi0KLVN1biBKdW4gMjEgMjE6Mjc6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIHdlYWsgc3ltYm9scyBjb3JyZWN0bHkgaWYKLQlCRkRfQVNTRU1CTEVSLgotCi1TdW4gSnVuIDIxIDEyOjI2OjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGQzMHZfYWxpZ24pOiBBbHdheXMgcGVyZm9ybSBhbGlnbm1lbnQgcmVxdWVzdCwKLQlldmVuIGlmIGl0IGlzIGJlbGl2ZWQgdG8gYmUgdW5uZWNlc3NhcnkuCi0KLUZyaSBKdW4gMTkgMTM6NTc6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IE5ldmVyIGFkanVzdCByZWxvY3MgYWdhaW5zdCB3ZWFrCi0Jc3ltYm9scy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotRnJpIEp1biAxOSAwOTo1MDoxNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBEbyBub3QgaGFyZGNvZGUgdGhlCi0Jc2hpZnQgYW1vdW50IGZvciBhIHJlcGVhdGVkIG9wZXJhbmQuICBUaGUgc2hpZnQgYW1vdW50IGZvciB0aGUKLQlyZXBlYXRlZCBjb3B5IGNvbWVzIGZyb20gdGhlIHNpemUgb2YgdGhlIG9wZXJhbmQuCi0KLUZyaSBKdW4gMTkgMDA6NDQ6MTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X29wZXJhbmQpOiBGaXggdHlwb3MgaW4gbGRtL3N0bSBzdXBwb3J0LgotCi1XZWQgSnVuIDE3IDEzOjA3OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCAtbWlwc04gdXNhZ2UuCi0KLVR1ZSBKdW4gMTYgMTM6MDY6MjEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJZiB0Y19zeW1ib2xfY2hhcnMgaXMgZGVmaW5lZCwgdHJlYXQgYWxsCi0JY2hhcmFjdGVycyBpbiBpdCBhcyBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX3N5bWJvbF9jaGFycyk6IERlZmluZS4KLQkoZXh0cmFfc3ltYm9sX2NoYXJzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGV4dHJhX3N5bWJvbF9jaGFycyk6IERlZmluZS4KLQkoY29tbWVudF9jaGFycyk6IERvbid0IHVzZSAnLycgYXMgY29tbWVudCBzdGFydCBpZiBURV9MSU5VWC4KLQkobGluZV9jb21tZW50X2NoYXJzKTogU2V0IHRvICcvJyBpZiBURV9MSU5VWC4KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1wcmVmaXhlcyk6IFVwZGF0ZS4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCB0Y19zeW1ib2xfY2hhcnMuCi0KLUZyaSBKdW4gMTIgMTM6MzY6NTQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLTE5OTgtMDYtMTIgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hcHBseV9maXgzKTogQ2hlY2tpbmcgZGlzcGxhY2VtZW50Ci0JY29uc3RyYWludCBpbiBpbnN0cnVjdGlvbnMgUkVQICYgUkVQSS4KLQotVGh1IEp1biAxMSAwODo1Njo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogQ2F0Y2ggQkZEX1JFTE9DXzgsCi0JQkZEX1JFTE9DXzE2LCBCRkRfUkVMT0NfNjQgYW5kIGlzc3VlIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2VzLiAgCi0KLQkoY2hlY2tfcmFuZ2UpOiBJZiB0aGUgb3BlcmFuZCBpcyBzaGlmdGVkLCB0aGVuIHNoaWZ0IHRoZSBudW1iZXIKLQliZWZvcmUgY2hlY2tpbmcgaXRzIHJhbmdlLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IEFkZCBtb3JlIGNoZWNrcyBmb3IgTlVMTCBwb2ludGVycy4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IFNldCBTRUNfQ09NTU9OIGJpdCBvbiBzcGVjaWFsCi0JY29tbW9uIHNlY3Rpb25zLgotCi1XZWQgSnVuIDEwIDE3OjI2OjM1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IENyZWF0ZSBzcGVjaWFsIHNlY3Rpb25zIGFzIG5lZWRlZC4KLQotMTk5OC0wNi0xMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBBZGRpdGlvbiBvZiBzd2FwcGluZwotCWluc3RydWN0aW9ucyBmb3Igc2VxdWVudGlhbCBhbmQgcmV2ZXJzZSBzZXF1ZW50aWFsIG9yZGVyIHdoZW4KLQlnaXZlbiBvcmRlciBpcyBub3QgcG9zc2libGUuCi0KLVR1ZSBKdW4gIDkgMTM6NTI6NTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShERVBfSU5DTFVERVMpOiBGaXggcmVmZXJlbmNlIHRvIGludGwgYnVpbGQgZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdW4gIDkgMTI6MjA6MDUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBkb2MvYy1pMzg2LnRleGk6IFVwZGF0ZSAxNiBiaXQgZG9jdW1lbnRhdGlvbi4KLQotCSogY29uZmlnL3RjLWkzODYuaDogQ2hhbmdlIERhdGExNiB0byBTaXplMTYsIERhdGEzMiB0byBTaXplMzIsCi0JSWdub3JlRGF0YVNpemUgdG8gSWdub3JlU2l6ZSBhcyB0aGV5IGFyZSB1c2VkIGZvciBhZGRyZXNzIHNpemUgYXMKLQl3ZWxsIGFzIGRhdGEgc2l6ZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IExpa2V3aXNlLiAgQWRkIGNvZGUgdG8gcmVqZWN0IGFkZHIzMi9kYXRhMzIgaW4KLQkzMi1iaXQgbW9kZSwgc2ltaWxhcmx5IGFkZHIxNi9kYXRhMTYgYW5kIHZhcmlhbnRzLgotCi1Nb24gSnVuICA4IDE4OjMyOjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogRml4IGhhbmRsaW5nIG9mIHJldmVyc2UKLQlzZXF1ZW50aWFsIHdvcmQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zLgotCQotCShkb19hc3NlbWJsZSk6IEFkZCBleHRyYSBjb21tYW5kIGxpbmUgYXJndW1lbnQsIHRvIGFsbG93IG11bDMyCi0JYXR0cmlidXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3MgcGFyYWxsZWwgaW5zbnMuCi0JKG1kX2Fzc2VtYmxlKTogSW5zZXJ0IE5PUHMgYmV0d2VlbiBleHBsaWNpdGx5IHBhcmFsbGVsIGluc25zIHdoaWNoCi0JY29udGFpbiBhbiAzMiBiaXQgbXVsdGlwbHkgYW5kIGEgMTYgbXVsdGlwbHkuCi0KLU1vbiBKdW4gIDggMTI6MjA6MzAgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSRVBORSByZW5hbWVkIHRvIFJFUE5FX1BSRUZJWF9PUENPREUsIGFuZAotCWxpa2V3aXNlIGZvciBSRVBFLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChyZWxvYyk6IEFkZCBicmFjZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogUmVuYW1lIGJpIHRvIHNpYiB0byBiZQotCWNvbnNpc3RlbnQgd2l0aCBJbnRlbCBuYW1pbmcuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChiYXNlX2luZGV4X2J5dGUpOiBSZW5hbWUgdG8gc2liX2J5dGUuICBEb24ndAotCXVzZSBiaXRmaWVsZHMgaW4gc2liX2J5dGUuCi0JKG1vZHJtX2J5dGUpOiBEb24ndCB1c2UgYml0ZmllbGRzIGhlcmUgZWl0aGVyLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjdXJyZW50X3RlbXBsYXRlcyk6IEFkZCBjb25zdC4KLQkocGFyc2VfcmVnaXN0ZXIpOiBBZGQgY29uc3QgdG8gcmV0dXJuLCBwYXJhbSwgYW5kIGNoYXIgKnMuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBjb25zdCB0byByZWdfZW50cnkgKnIuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0ZW1wbGF0ZXMpOiBBZGQgY29uc3QgdG8gc3RhcnQsIGVuZC4KLQotCUluc3BpcmVkIGJ5IGNvZGUgZm9yIDE2IGJpdCBnYXMgc3VwcG9ydCBmcm9tIE1hcnR5bmFzIEt1bmlnZWxpcwotCTxtYXJ0eW5hc0BubTMua3R1Lmx0PjoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRkIGZ1bGwgc3VwcG9ydCBmb3IgMTYgYml0Ci0JbW9kcm0sIGFuZCBKdW1wLCBKdW1wQnl0ZSwgSnVtcER3b3JkLCBKdW1wSW50ZXJTZWdtZW50IGluc25zLgotCSh1c2VzX21lbV9hZGRybW9kZSk6IFJlbW92ZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBBZGQgc3VwcG9ydCBoZXJlIHRvby4KLQkobWRfcmVsYXhfdGFibGUpOiBSZXdyaXRlIGludGVyZmFjZSB0byBtZF9yZWxheCBmb3IgMTYgYml0Ci0Jc3VwcG9ydC4KLQkoQllURSwgV09SRCwgRFdPUkQsIFVOS05PV05fU0laRSk6IFJlbW92ZS4KLQkob3Bjb2RlX3N1ZmZpeF90b190eXBlKTogUmVtb3ZlLgotCShDT0RFMTYsIFNNQUxMLCBTTUFMTDE2LCBCSUcsIEJJRzE2KTogRGVmaW5lLgotCShTSVpFX0ZST01fUkVMQVhfU1RBVEUpOiBNb2RpZnkgdG8gc3VpdCBhYm92ZS4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBzdXBwb3J0IGZvciAxNiBiaXQgYmFzZS9pbmRleCByZWdzLAotCWltbWVkaWF0ZXMsIGFuZCBkaXNwbGFjZW1lbnRzLiAgUmVtb3ZlIHNvbWUgdW5uZWNlc3NhcnkgY2FzdHMsIGFuZAotCWxvY2FsaXNlIGVuZF9vZl9vcGVyYW5kX3N0cmluZywgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCwKLQlkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCB2YXJpYWJsZXMuICBBZGQgR0NDX0FTTV9PX0hBQ0suCi0JKiBjb25maWcvdGMtaTM4Ni5oIChOT19CQVNFX1JFR0lTVEVSXzE2KTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwcmVmaXhfaGFzaCk6IFJlbW92ZS4KLQkobWRfYmVnaW4pOiBSZXdyaXRlIHdpdGhvdXQgb2JzdGFja3MuICBSZW1vdmUgcHJlZml4IGhhc2ggdGFibGUKLQloYW5kbGluZy4gIFJld3JpdGUgbGV4aWNhbCB0YWJsZSBoYW5kbGluZy4KLQkoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogRG9uJ3QgcHJpbnQgcHJlZml4IHN0YXRpc3RpY3MuCi0JKG1kX2Fzc2VtYmxlKTogUmV3cml0ZSBpbnN0cnVjdGlvbiBwYXJzZXIgc28gdGhhdCBsaW5lIGlzIG5vdAotCWNvbnZlcnRlZCB0byBsb3dlciBjYXNlLiAgRG9uJ3QgZG8gYSBoYXNoX2ZpbmQgZm9yIHByZWZpeGVzLAotCWluc3RlYWQgcmVjb2duaXNlIHRoZW0gdmlhIG9wY29kZSBtb2RpZmllci4KLQkoZXhwZWN0aW5nX29wZXJhbmQsIHBhcmVuX25vdF9iYWxhbmNlZCk6IExvY2FsaXNlIHZhcmlhYmxlcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKElzUHJlZml4KTogRGVmaW5lLgotCShwcmVmaXhfZW50cnkpOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFBSRUZJWF9TRVBFUkFUT1IpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChQUkVGSVhfU0VQQVJBVE9SKTogRGVmaW5lIGhlcmUgaW5zdGVhZCwgdXNpbmcKLQknXFwnIGluIGNhc2Ugd2hlcmUgY29tbWVudF9jaGFycyBjb250YWlucyAnLycuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKE1BVENIKTogRW5zdXJlIGdpdmVuIG9wZXJhbmQgYW5kIHRlbXBsYXRlCi0JbWF0Y2ggZm9yIEp1bXBBYnNvbHV0ZS4gIE1ha2VzIGUuZy4gYGxqbXAgdGFibGUoJWVieCknIGludmFsaWQ7Ci0JeW91IG11c3Qgd3JpdGUgYGxqbXAgKnRhYmxlKCVlYngpJy4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogY29uZmlnL3RjLWkzODYuYyAoQkZEX1JFTE9DXzE2LCBCRkRfUkVMT0NfMTZfUENSRUwpOiBEZWZpbmUKLQlhcyAwIGlmbmRlZiBCRkRfQVNTRU1CTEVSLgotCShtZF9hc3NlbWJsZSk6IEFsbG93IGltbWVkaWF0ZSBvcGVyYW5kcyB3aXRob3V0IHN1ZmZpeCBvcgotCW90aGVyIHJlZyBvcGVyYW5kIHRvIGRlZmF1bHQgaW4gc2l6ZSB0byB0aGUgY3VycmVudCBjb2RlIHNpemUuCi0KLU1vbiBKdW4gIDggMDk6NDU6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiAgUmVzdG9yZSBjcmVhdGlvbiBvZgotICAgICAgICAuY2FsbF90YWJsZV90ZXh0IGFuZCAuY2FsbF90YWJsZV9kYXRhIHNlY3Rpb25zLgotCi1TYXQgSnVuICA2IDAwOjAyOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogU2V0IGV4ZWN1dGlvbiB0eXBlIHRvIHVua25vd24KLQlhZnRlciBlbWl0dGluZyBhIHdvcmQgb2Ygbm9vcHMuCi0KLUZyaSBKdW4gIDUgMjM6Mjc6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtb2RlX2Zyb21fZGlzcF9zaXplKTogRGlzcDE2IGlzIG1vZGUgMi4KLQkoaTM4Nl9vcGVyYW5kKTogU2ltcGxpZnkgY2hlY2tzIGZvciB2YWxpZCBiYXNlL2luZGV4IGNvbWJpbmF0aW9ucy4KLQlEaXNhbGxvdyBgaW4gNCglZHgpLCVhbCcuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogTWFrZSByZWdzLCBiYXNlX3JlZywgYW5kCi0JaW5kZXhfcmVnIGNvbnN0LgotCShhZGRfcHJlZml4KTogQ2hhbmdlIHBhcmFtZXRlciBmcm9tIGNoYXIgdG8gaW50LgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChVZ2gpOiBEZWZpbmUgb3Bjb2RlIG1vZGlmaWVyLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBQcmludCB3YXJuaW5ncyBmb3IgVWdoIGluc25zLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFJld3JpdGUgTUFUQ0ggYW5kCi0JQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCBtYWNyb3MgdG8gY2hlY2sgcmVnaXN0ZXIgdHlwZXMgbW9yZQotCXRob3JvdWdobHkuICBDaGVjayBmb3IgaWxsZWdhbCBzdWZmaXgvb3BlcmFuZCBjb21iaW5hdGlvbnMKLQl3aGVuIG1hdGNoaW5nIGluc25zIHdpdGggb3BlcmFuZHMuICBIYW5kbGUgbmV3IGBzJyBzdWZmaXgsIGFuZAotCWFzc29jaWF0ZWQgRmxvYXRNRiBvcGNvZGUgbW9kaWZpZXIgZm9yIGZsb2F0IGluc25zIHdpdGggbWVtb3J5Ci0Jb3BlcmFuZHMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChGbG9hdE1GKTogRGVmaW5lIG5ldyBvcGNvZGUgbW9kaWZpZXIuCi0JKE5vX3NTdWYsIE5vX2JTdWYsIE5vX3dTdWYsIE5vX2xTdWYpOiBMaWtld2lzZS4KLQkoU0hPUlRfT1BDT0RFX1NVRkZJWCwgTE9OR19PUENPREVfU1VGRklYKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYzogUmVuYW1lIFdPUkRfUFJFRklYX09QQ09ERSB0bwotCURBVEFfUFJFRklYX09QQ09ERSB0aHJvdWdob3V0LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChSRUdJU1RFUl9XQVJOSU5HUyk6IERlZmluZS4KLQkobWRfYXNzZW1ibGUpOiBSZXdyaXRlIHN1ZmZpeC9yZWdpc3RlciBvcGVyYW5kIGNoZWNraW5nIGNvZGUgdG8gYmUKLQltb3JlIHRob3JvdWdoLiAgUmVtb3ZlIEFiczgsMTYsMzIuICBDaGFuZ2Ugb2NjdXJyZW5jZXMgb2YgTWVtIHRvCi0JQW55TWVtLCB0aGUgYmV0dGVyIHRvIGdyZXAuCi0JKHBpKTogUmVtb3ZlIEFicy4KLQkoaTM4Nl9vcGVyYW5kKTogRG9uJ3Qgc2V0IE1lbSBiaXRzIGluIGkudHlwZXNbdGhpc19vcGVyYW5kXSB3aGVuCi0JZ2l2ZW4gYSBtZW1vcnkgb3BlcmFuZC4gIERvbid0IHNldCBBYnMgYml0cyBlaXRoZXIuCi0JKHR5cGVfbmFtZXMpOiBSZW1vdmUgTWVtKiwgQWJzKi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE1lbTgsIE1lbTE2LCBNZW0zMiwgQWJzOCwgQWJzMTYsIEFiczMyKTogRG9uJ3QKLQlkZWZpbmUgb3Bjb2RlX21vZGlmaWVycyBhcyB0aGVzZSBjYXNlcyBhcmUgaGFuZGxlZCBieSBEaXNwOCwKLQlEaXNwMTYsIERpc3AzMiBhbmQgc3VmZml4IGNoZWNrcy4KLQkoQ09NRVNfSU5fQk9USF9ESVJFQ1RJT05TKTogUmVtb3ZlLgotCShGbG9hdFIpOiBEZWZpbmUuIEl0J3MgT0sgdG8gc2hhcmUgdGhlIGJpdCB3aXRoIFJldmVyc2VSZWdSZWdtZW0uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZW1pdCBvcGVyYW5kIHNpemUgcHJlZml4Ci0JaWYgSWdub3JlRGF0YVNpemUgbW9kaWZpZXIgZ2l2ZW4uICBSZW1vdmUgU2hvcnRmb3JtVyBtb2RpZmllcgotCXRlc3QuICBBZGQgdGVzdCBmb3IgU2hvcnRGb3JtIGluIFcgYmFzZV9vcGNvZGUgbW9kaWZpY2F0aW9uLgotCU1lcmdlIFNlZzJTaG9ydEZvcm0gYW5kIFNlZzNTaG9ydEZvcm0gY29kZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFNob3J0Rm9ybVcpOiBSZW1vdmUuCi0JKElnbm9yZURhdGFTaXplKTogRGVmaW5lLgotCi1GcmkgSnVuICA1IDEwOjUwOjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogU3RvcmUgcHJldmlvdXMgc2VnbWVudCBzdGF0ZQotCXdpdGggcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBKdW4JIDMgMTg6MjE6NTYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChTQ0FMRTFfV0hFTl9OT19JTkRFWCk6IERlZmluZS4KLQkoZWJwLCBlc3ApOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlcy4KLQkoTUFUQ0gpOiBSZW1vdmUgdGVzdCBmb3IgSW5PdXRQb3J0UmVnLgotCShpMzg2X29wZXJhbmQpOiBQcm9wZXJseSBoYW5kbGUgSW5PdXRQb3J0UmVnIGhlcmUgaW5zdGVhZC4KLQlEaXNhbGxvd3MgYGluYiAoJWR4LDIpJywgYGluYiAlZXM6KCVkeCknIGFuZCBgbW92ICglZHgpLCVheCcKLQkobWRfYXNzZW1ibGUpOiBTaW1wbGlmeSBhbmQgY29ycmVjdCBtb2RybSBhbmQgc2liIGdlbmVyYXRpb24uCi0JKGkzODZfb3BlcmFuZCk6IEFkZCB3YXJuaW5nIGZvciBzY2FsZSB3aXRob3V0IGluZGV4LgotCVJld3JpdGUgY2hlY2tzIGZvciB2YWxpZCBiYXNlL2luZGV4IGNvbWJpbmF0aW9ucy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoRU5EX1NUUklOR19BTkRfU0FWRSk6IFByb3RlY3QgYXJndW1lbnRzIG9mCi0JbWFjcm9zIGFuZCBlbmNsb3NlIGluIGRvIHdoaWxlKDApLgotCShSRVNUT1JFX0VORF9TVFJJTkcpOiBMaWtld2lzZS4KLQkobWRfYXNzZW1ibGUpOiBBZGQgb25lIHRvIHByaW50ZWQgb3BlcmFuZCBudW1iZXIgc28gd2Ugc3RhcnQKLQlmcm9tIDEgbm90IDAuICBBZGQgc29tZSBtb3JlIGdldHRleHQgaW52b2NhdGlvbnMuCi0JKGkzODZfb3BlcmFuZCk6IEZpeCBgJSVzJyAtPiBgJSUlcycuIEluYyBwcmludGVkIG9wZXJhbmQKLQludW1iZXIgaGVyZSB0b28uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFdBSVRfUFJFRklYLCBMT0NLUkVQX1BSRUZJWCwgQUREUl9QUkVGSVgsCi0JREFUQV9QUkVGSVgsIFNFR19QUkVGSVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzdHJ1Y3QgX2kzODZfaW5zbik6IFJlbW92ZSB3YWl0X3ByZWZpeCBmaWVsZC4KLQkoY2hlY2tfcHJlZml4KTogUmVtb3ZlIGZ1bmN0aW9uLgotCShhZGRfcHJlZml4KTogTmV3IGZ1bmN0aW9uLiAgQWRkIHByZWZpeCB0byBpLnByZWZpeCBhcyB3ZWxsIGFzCi0JZG9pbmcgY2hlY2tzLgotCShtZF9hc3NlbWJsZSk6IENoYW5nZXMgZm9yIGFkZF9wcmVmaXguCVJlbW92ZSBoYWNrIGZvciB3YWl0Ci0JcHJlZml4LCBpbnN0ZWFkIGFsd2F5cyBvdXRwdXQgcHJlZml4ZXMgaW4gZml4ZWQgb3JkZXIuCVRlc3QKLQlmb3IgamN4ei9sb29wIHdoZW4gc2VsZWN0aW5nIGJldHdlZW4gd29yZCAmIGR3b3JkIG9wZXJhdGlvbnMsCi0JYW5kIGFkZCBhZGRyZXNzIHNpemUgcHJlZml4IHJhdGhlciB0aGFuIG9wZXJhbmQgc2l6ZSBwcmVmaXguCi0JUmVtb3ZlIG9wZXJhbmQgLT4gYWRkcmVzcyBzaXplIGhhY2sgd2hlbiBlbWl0dGluZyBqY3h6L2xvb3AuCi0JKGkzODZfb3BlcmFuZCk6IFJlbW92ZSBPX0Fic2VudCBjaGVjayBhcyBpdCdzIGRvbmUgaW4gZXhwci4KLQotV2VkIEp1biAgMyAxNTowOToxMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG01MjAwIGFzIGEgY3B1X3R5cGUgb2YgbTY4ay4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKdW4gIDMgMTQ6MTE6NTkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQWRkIG1vcmUgY2FsbHMKLQl0byByZWxheGFibGVfc3ltYm9sIHRvIHByZXZlbnQgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBzeW1ib2wgZnJvbQotCWJlaW5nIHJlbGF4ZWQuCi0KLVdlZCBKdW4gIDMgMTQ6MTA6MzYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChyZWxheGFibGVfc3ltYm9sKTogSWYgVEFSR0VUX09TIGlzICJlbGYiLCBhbGwKLQlzeW1ib2xzIGFyZSByZWxheGFibGUuCi0KLVdlZCBKdW4gIDMgMDk6MTY6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiAgRG9uJ3QgY3JlYXRlIHNwZWNpYWwKLSAgICAgICAgc2VjdGlvbnMgYnkgZGVmYXVsdC4KLSAKLVR1ZSBKdW4gIDIgMTQ6NTI6NTYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZvciBkaXYgYW5kIHVkaXYsIGNsb3NlIHRoZQotCXJlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQotVHVlIEp1biAgMiAxNTozNjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIE1hdHQgU2VtZXJza3kgPG1hdHRzQHNjZC5ocC5jb20+OgotCSogbWFjcm8uYyAobWFjcm9fbXJpX21vZGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBtYWNyby5oIChtYWNyb19tcmlfbW9kZSk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHNfbXJpKTogQ2FsbCBtYWNyb19tcmlfbW9kZSB3aGVuIHN3aXRjaGluZyBpbiBhbmQgb3V0IG9mCi0JTVJJIG1vZGUuCi0KLVR1ZSBKdW4gIDIgMTM6MzI6MjIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBBbGxvdyBhbGlnbm1lbnQgcGFyYW1ldGVyIGluCi0JT0JKX0VWQVggY2FzZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IERlZmVyIHJlc3RvcmluZyBjaGFyYWN0ZXIKLQl1bnRpbCBhZnRlciB4c3RyZHVwIGluIE9CSl9FVkFYIGNhc2UuCi0KLVR1ZSBKdW4gIDIgMTM6MTE6MTMgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfY3JlYXRlX3Nob3J0X2p1bXApOiBGaXggb2ZmIGJ5IHR3byBidWcgaW4KLQlvZmZzZXQgY2FsY3VsYXRpb24uICBBbHNvLCB1c2UgVkFYX0JSVyBmcm9tIHZheC1pbnN0LmggaW5zdGVhZAotCW9mIGhhcmRjb2RlZCBtYWdpYyBudW1iZXIuCi0JKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBVc2UgVkFYX0pNUCBhbmQgVkFYX0FCU09MVVRFX01PREUgbWFjcm9zLgotCi1UdWUgSnVuICAyIDA5OjI1OjM0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZG9fc19mdW5jKTogTmV3IGZ1bmN0aW9uLgotCShzX2Z1bmMpOiBDYWxsIGl0LgotCSogcmVhZC5oIChkb19zX2Z1bmMpOiBBZGQgcHJvdG90eXBlLgotCi1Nb24gSnVuICAxIDEyOjQ3OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBPbmx5IGZpbGwgY29kZSBzZWN0aW9ucyB3aXRoCi0Jbm9wcyBpZiBmaWxsIHBhdHRlcm4gbm90IHNwZWNpZmllZC4KLQotTW9uIEp1biAgMSAxNDowODozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEFuZHJldyBDcmFidHJlZSA8YW5kcmV3Y0B0eXBob29uLnJvc2UuaHAuY29tPjoKLQkqIGNvbmZpZy90ZS1nbzMyLmggKFRFX0dPMzIpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChMT0NBTF9MQUJFTCk6IERvbid0IGRlZmluZSBpZiBURV9HTzMyLgotCi1TdW4gTWF5IDMxIDE1OjQzOjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlJbXBsZW1lbnQgLmZ1bmMvLmVuZGZ1bmMgcHNldWRvLW9wcy4KLQkqIHJlYWQuaCAoc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMsc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMpOiBEZWNsYXJlLgotCShzX2Z1bmMpOiBEZWNsYXJlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIC5mdW5jLC5lbmRmdW5jLgotCShzX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fZnVuYyxzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoaW5fZG9jX2Z1bmNfcCxjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKTogTmV3IHN0YXRpYyBnbG9iYWxzLgotCShzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogRW1pdCBmdW5jdGlvbiByZWxhdGl2ZSBzdGFicyBpZiBpbiAuZnVuYy4KLQotRnJpIE1heSAyOSAxODoxMzoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hMjlrLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaHBwYS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWk4NjAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdGljMzAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy13NjUuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IERvbid0IGRlZmluZSBtZF9zaG9ydF9qdW1wX3NpemUsCi0gCW1kX2xvbmdfanVtcF9zaXplLCBtZF9jcmVhdGVfc2hvcnRfanVtcCBvciBtZF9jcmVhdGVfbG9uZ19qdW1wLgotCSogY29uZmlnL3RjLWFscGhhLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFscGhhLmg6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFybS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk4NjAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTk2MC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1wcGMuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdGljMzAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdzY1LmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXo4ay5jOiBMaWtld2lzZS4KLQotRnJpIE1heSAyOSAxNjowMzoyNiAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3RjLXZheC5jIChfKTogRGVsZXRlIHRoaXMgbWFjcm8gdXNlZCBmb3IgcGxhY2Vob2xkZXIKLQl2YWx1ZXMgaW4gdmF4X29wZXJhbmRfd2lkdGhfc2l6ZTsgaXQgY29uZmxpY3RzIHdpdGggdGhlIF8oKSBtYWNybwotCXVzZWQgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotCi1GcmkgTWF5IDI5IDEzOjQ2OjA3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfZmluZF9iYXNlKTogRml4IGNhc2UgaW5zZW5zaXRpdmUgc3ltYm9sIG5hbWUKLQljb2RlLiAgRnJvbSBDaHJpcyBNb2xsZXIgPG1vbGxlckBib3BzLmNvbT4uCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEtsYXVzIEthZW1wZiA8a2thZW1wZkBwcm9naXMuZGU+OgotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBicm9rZW5fd29yZCk6IEFkZCBzZWcgYW5kIHN1YnNlZyBmaWVsZHMuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IEluaXRpYWxpemUgc2VnIGFuZCBzdWJzZWcgZmllbGRzIG9mIGEgbmV3Ci0JYnJva2VuIHdvcmQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFN3aXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgc2VnbWVudAotCWFuZCBzdWJzZWdtZW50IHdoZW4gcHJvY2Vzc2luZyBhIGJyb2tlbiB3b3JkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtcmlfYXNzZW1ibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2FsbCBtcmlfYXNzZW1ibGUgcmF0aGVyIHRoYW4KLQltZF9hc3NlbWJsZS4KLQkoc19tcmlfZWxzZSwgc19tcmlfYnJlYWssIHNfbXJpX25leHQsIHNfbXJpX2Zvcik6IExpa2V3aXNlLgotCShzX21yaV9lbmRmLCBzX21yaV9lbmR3KTogTGlrZXdpc2UuCi0KLVdlZCBNYXkgMjcgMTE6MTY6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfb3JnKTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpZiBpdCBpcyBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvd191c2FnZSk6IEFkZCBcblwgdG8gbmV3IHN0cmluZy4KLQotVHVlIE1heSAyNiAxOToyNzo1MiAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQSk6IE5ldy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIGZvciBzYW1lLgotCShzcGFyY19tZF9lbmQpOiBTZXQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgotCShtZF9hcHBseV9maXgzLCB0Y19nZW5fcmVsb2MpOiBBbGxvdyBCRkRfUkVMT0NfU1BBUkNfMzJMRS4KLQkoY29uc19maXhfbmV3X3NwYXJjKTogQWRkZWQgdG8gY3JlYXRlIEJGRF9SRUxPQ19TUEFSQ18zMkxFLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoY29uc19maXhfbmV3X3NwYXJjKTogQWRkZWQuCi0JCi1UaHUgTWF5IDIxIDE1OjAyOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZmluZF9yZWFsX3N0YXJ0KTogUmVsYXggZGVmaW5pdGlvbiBvZiBsb2NhbAotCWxhYmVscy4KLQotVHVlIE1heSAxOSAxNjo1OTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQXBwbHkgYWRkcmVzcyBhZGp1c3RtZW50IHRvIGFsbAotCXN5bWJvbHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIG5vdCBqdXN0IHRoZSBsYXN0IG9uZSBzcGVjaWZpZWQuCi0KLVR1ZSBNYXkgMTkgMDg6MjU6MTkgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19oYW5kbGVfYWxpZ24pOiBVc2UgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbgotICAgICAgICBvciBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIHRvIHdyaXRlIGRhdGEuCi0KLU1vbiBNYXkgMTggMTc6MDk6MzAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSZW1vdmUgYXJ0aWZpY2lhbGx5IGNyZWF0ZWQKLQlyZWdpc3RlciBuYW1lIHN5bWJvbHMuCi0KLU1vbiBNYXkgMTggMTM6NDc6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSAic2VnbWVudCIgdG8gInNlY3Rpb24iIGluCi0JZXJyb3IgbWVzc2FnZS4KLQotTW9uIE1heSAxOCAxNjo1NTo0MCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSBzeW0xLXN5bTIgbWVzc2FnZSBhZ2Fpbi4KLQotTW9uIE1heSAxOCAwOTozMTo0MyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3Igc3ltMS1zeW0yCi0JZXJyb3JzIHdoZW4gc3ltMSBpcyBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGZyb20gc3ltMi4KLQotV2VkIE1heSAxMyAxMDoxNjozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jICh3YXJuX3VubWF0Y2hlZF9oaWdoKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoT1BUSU9OX1dBUk5fUEFSQUxMRUwpOiBSZW5hbWUgZnJvbSBPUFRJT05fV0FSTi4KLQkoT1BUSU9OX05PX1dBUk5fUEFSQUxMRUwpOiBSZW5hbWUgZnJvbSBPUFRJT05fTk9fV0FSTi4KLQkobWRfbG9uZ29wdHMpOiBSZWNvZ25pemUgLS17bm8tLH13YXJuLXVubWF0Y2hlZC1oaWdoLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkobWRfc2hvd191c2FnZSk6IExpa2V3aXNlLgotCShtMzJyX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKGdlbmVyYXRlX2ZpbGVfZGVidWcsZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogTmV3IGZ1bmN0aW9ucy4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCB0aGVtLgotCSogcmVhZC5oIChzdGFic19nZW5lcmF0ZV9hc21fZmlsZSk6IERlY2xhcmUuCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJhdGVfYXNtX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBNb3ZlIGZpbGUgbmFtZSBoYW5kbGluZyBpbnRvCi0JZ2VuZXJhdGVfYXNtX2ZpbGUuCi0KLVR1ZSBNYXkgMTIgMTI6MDM6NDQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoY3VyX211bDMyX3AsIHByZXZfbXVsMzJfcCk6IE1ha2Ugc3RhdGljLgotICAgICAgICAoZDMwdl9jdXJyZW50X2FsaWduLCBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnKTogTmV3IHZhcmlhYmxlcy4KLSAgICAgICAgKGQzMHZfbGFzdF9sYWJlbCk6IE5ldyB2YXJpYWJsZS4KLSAgICAgICAgKGQzMHZfYWxpZ24sIHNfZDMwdl9hbGlnbiwgc19kMzB2X3RleHQpOiBOZXcgZnVuY3Rpb25zLgotICAgICAgICAoc19kMzB2X2RhdGEsIHNfZDMwdl9zZWN0aW9uKTogTGlrZXdpc2UuCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIHRoZW0uCi0gICAgICAgIChtZF9iZWdpbik6IEluaXRpYWxpemUgZDMwdl9jdXJyZW50X2FsaWduX3NlZy4KLSAgICAgICAgKG1kX2Fzc2VtYmxlKTogQ2FsbCBkMzB2X2FsaWduIHdoZW4gbmVlZGVkIGJ5IGtub3duIGN1cnJlbnQgYWxpZ25tZW50LgotICAgICAgICAoZDMwdl9mcm9iX2xhYmVsLCBkMzB2X2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb25zLgotICAgICAgICAqIGNvbmZpZy90Yy1kMzB2LmggKG1kX2RvX2FsaWduKTogUmVtb3ZlLgotICAgICAgICAodGNfZnJvYl9sYWJlbCk6IENhbGwgZDMwdl9mcm9iX2xhYmVsLgotICAgICAgICAobWRfY29uc19hbGlnbik6IE5ldy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZmluZF9mb3JtYXQpOiBDb252ZXJ0IGNvbXBsZXggZXhwcmVzc2lvbnMgdG8gCi0JZXhwcmVzc2lvbiBzeW1ib2xzIGJlZm9yZSBwcm9jZXNzaW5nLiAgQ2xlYW4gdXAgY29kZSBmb3JtYXR0aW5nLgotCi1TdW4gTWF5IDEwIDIyOjM1OjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotVGh1IE1heSAgNyAxNTo0OTowNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlICJicmEiIGp1c3QgbGlrZSAiam1wIgotCWluc3RydWN0aW9ucy4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0KLVRodSBNYXkgIDcgMTE6NDc6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFVwZGF0ZSB3aXRoIGBtYWtlIGRlcC1hbScuCi0JKEhGSUxFUyk6IEFkZCBjZ2VuLmguCi0JKGNnZW4ubyk6IERlcGVuZCBvbiBjZ2VuLmguCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEb24ndCBwYXNzIG5ld2xpbmUgdG8gYXNfd2Fybl93aGVyZS4KLQotVGh1IE1heSAgNyAxMzoyMDo1NiAxOTk4ICBBbmRlcnMgQmxvbWRlbGwgIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+Ci0KLQkqIGdhc3AuYyAoZ3JhYl9sYWJlbCk6IFBlcm1pdCBhIGxhYmVsIHRvIGJlIGEgcHJlcHJvY2Vzc29yCi0JdmFyaWFibGUgYnkgcGVybWl0dGluZyBhIGxhYmVsIHRvIHN0YXJ0IHdpdGggYSBiYWNrc2xhc2guCi0KLVRodSBNYXkgIDcgMTI6NTA6MzMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAodmFsaWRhdGVfbWlwc19pbnNuKTogUmVtb3ZlZCBoYWNrCi0JZm9yIHByZXZpb3VzbHkgaW5hY2Nlc3NpYmxlIGJpdGZpZWxkcyBpbiBzb21lIElOU05fVFJBUAotCWluc3RydWN0aW9ucy4KLQotVGh1IE1heSAgNyAxMToxMzowMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFib3J0IHdpdGggZXJyb3IgbWVzc2FnZQotCWlmIG9wY29kZSBvcGVyYW5kcyBkbyBub3QgbWF0Y2guCi0JCi1UaHUgTWF5ICA3IDA5OjM2OjA2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkLCB2YWxpZGF0ZV9taXBzX2luc24pOiBJbXBsZW1lbnQKLQkncScgb3BlcmFuZCBmb3JtYXQgZm9yIDIwLWJpdCAiYnJlYWsiLyJzZGJicCIgaW5zdHJ1Y3Rpb25zLgotCShtaXBzX2lwKTogVHJ1bmNhdGUgb3ZlcmZsb3dlZCAiYnJlYWsiICdjJyBvcGVyYW5kLiAgSW1wbGVtZW50Ci0Jc2ltaWxhciBuZXcgJ3EnIG9wZXJhbmQuCi0KLVRodSBNYXkgIDcgMDc6NDc6MTQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9hc21fZmluaXNoX2luc24pOiBGaXggdHlwby4KLQotVGh1IE1heSAgNyAwMjoxOToxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBOZXcgZmlsZS4KLQkqIGNnZW4uYzogSW5jbHVkZSBpdC4KLQkoTUFYX0ZJWFVQUyk6IFJlbmFtZWQgdG8gQ0dFTl9NQVhfRklYVVBTLgotCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFJlc3VsdCBpcyBub3cgdm9pZC4gIE5ldyBhcmcgYHJlc3VsdCcuCi0JQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IEluY2x1ZGUgY2dlbi5oLgotCShtMjNyX2luc24pOiBOZXcgbWVtYmVycyBudW1fZml4dXBzLGZpeHVwcy4KLQotV2VkIE1heSAgNiAxNjoyOToxOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IFNsaWdodGx5IHJld29yayBzb21lIGNvZGUKLQl0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgotCi1XZWQgTWF5ICA2IDE1OjI2OjM0IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLiAgUGFzcyBDQyB2YWx1ZSB3aGVuCi0JY2FsbGluZyBtYWtlLgotCi0gICAgICAgICogbWFrZWZpbGUudm1zIChPQkpTKTogQWRkIGVob3B0Lm9iagotCi1XZWQgTWF5ICA2IDE1OjExOjEyIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBkb2MvYy12YXgudGV4aTogQ29ycmVjdCBhbmQgZXh0ZW5kIHZheC92bXMgZG9jdW1lbnRhdGlvbi4KLQotV2VkIE1heSAgNiAxMTo1MTo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFjY2VwdCBhIG5ldyBwYXJhbWV0ZXIgcmVxdWVzdGluZwotCWEgc2hvcnQgZm9ybWF0IGluc24uCi0JKG1kX2Fzc2VtYmxlKTogU2V0IGl0IGZvciBleHBsaWNpdGx5IHBhY2tlZCBpbnNucy4KLQkKLVR1ZSBNYXkgIDUgMTM6MjM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogRG8gbm90IHRha2UgYWRkcmVzcyBvZgotCW5hdGl2ZSBmaWVsZHMgd2hlbiBwZXJmb3JtaW5nIHRoZSBtZW1jcHkuCi0KLVR1ZSBNYXkgIDUgMTM6MTA6NDEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvLG1hY3JvMik6IEltcGxlbWVudCAKLQlNX0RNVUxPX0ksIE1fTVVMT19JLCBNX0RNVUxPVV9JLCBhbmQgTV9NVUxPVV9JLgotCi1Nb24gTWF5ICA0IDE3OjQ5OjE0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBDaGFuZ2VkIHRvIGtlZXAKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IGdsb2JhbGx5IHZpc2libGUgc3ltYm9scy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHJlbGF4YWJsZV9zeW1ib2wpOiBOZXcgbWFjcm8uCi0JKG02OGtfaXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXNlIGl0LgotCSh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogQWxzbyBoYW5kbGUgd2VhayBzeW1ib2xzLgotCi1Nb24gTWF5ICA0IDE2OjEyOjIzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogS2VlcCByZWxvY3MgZm9yIGFsbAotCXJlZmVyZW5jZXMgdG8gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogV2hlbiBPQkpfRUxGLCBkb24ndCBhZGQgdGhlCi0gCXZhbHVlcyBpbiB0d2ljZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBpZiB0aGUgc3ltYm9sIGlzCi0gCWV4dGVybmFsbHkgZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0FPVVRdOiBXaGVuIFBJQywKLQlkb24ndCBhZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZQotCXN5bWJvbC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogV2hlbiBnZW5lcmF0aW5nIGEub3V0IFBJQywKLQlmb3IgYSBQQyByZWxhdGl2ZSBmaXh1cCBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZSBkZWZpbmVkCi0Jc3ltYm9sLCBhcnJhbmdlIHRvIHN0b3JlIG9iamVjdCBmaWxlIGFuZCBhZGRlbmQgdmFsdWVzIGFzIHRob3VnaAotCXRoZSBzeW1ib2wgd2VyZSBub3QgZGVmaW5lZC4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBBcHIgMzAgMTM6MDk6MzkgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+Ci0KLQkqIHJlYWQuYyAoc2l6ZW9mX2xlYjEyOCk6IFJlZmVyZW5jZWQgZXh0ZXJuYWxseSBieSB3cml0ZS5jIHNvCi0JZG9uJ3QgaW5saW5lLgotCi1XZWQgQXByIDI5IDE1OjQ1OjU3IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jICh7LGV4cGFuZF99ZGVidWdfc3ltKTogTmV3IGZ1bmN0aW9ucyB0byByZWNvcmQKLQlhbmQgZXhwYW5kIGEgJ2RlYnVnJyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uCi0JdGhhdCBkb2VzIG5vdCBjYXVzZSBhIHNob3J0IGluc3RydWN0aW9uIHRvIGJlIGZpbGxlZCB3aXRoIGEgTk9QLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgLmRlYnVnc3ltLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogQWRkIGNhbGxzIHRvIGV4cGFuZF9kZWJ1Z19zeW0gYXMKLQlhcHByb3ByaWF0ZS4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotVHVlIEFwciAyOCAxOToxNjoyNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogZ2FzcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc2ludGwuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1UdWUgQXByIDI4IDE4OjMzOjIzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3Nob3dfdXNhZ2UpOiBDb3JyZWN0IGdldHRleHQgdHlwby4KLQkKLVR1ZSBBcHIgMjggMTI6MTY6MzAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBDaGFuZ2UgYWxsIGNhbGxzIHRvIGJ6ZXJvIHRvIHVzZSBtZW1zZXQuCi0JKHBhX2lwKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkodGNfZ2VuX3JlbG9jLCBtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQkocGFfZmluZF9zcGFjZV9ieV9udW1iZXIpOiBMaWtld2lzZS4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKHBhX2Jsb2NrKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3NvbV9jb3B5cmlnaHQpOiBEZWNsYXJlLgotCi1UdWUgQXByIDI4IDExOjM1OjU2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IERvIG5vdCB1c2UgZHVtbXkgZmlyc3RfbGluZW5vCi0JZm9yIGxpbmUgbnVtYmVycyBmb3IgYXNzZW1ibHkgc291cmNlLgotCi1Nb24gQXByIDI3IDE1OjU4OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEFwciAyNyAxMjowNzozMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IE5ldyBhcmcgcmVsYXhfcC4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0KLU1vbiBBcHIgMjcgMTU6MTY6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oOiBDaGFuZ2Ugc3ltYm9sUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0byBzdHJ1Y3QKLQlzeW1ib2wuCi0KLVN1biBBcHIgMjYgMTM6NDQ6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggaTE4biB0eXBvLgotCi1TYXQgQXByIDI1IDIwOjEyOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9jdXJfcHJvY19zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5oOiBQcm90b3lwZSBpdC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIFtFTEZdIChzX2FscGhhX3Byb2xvZ3VlKTogTmV3IGZ1bmN0aW9uLgotCVtFVkFYXSAoc19hbHBoYV9wcm9sb2d1ZSk6IERlbGV0ZS4KLQkobWRfcHNldWRvX3RhYmxlKTogVXBkYXRlLgotCi1TYXQgQXByIDI1IDE0OjAwOjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfYXNzZW1ibGUpOiBDaGFuZ2UgYnBfZXJyb3JfbXNnIGZyb20gc3RhdGljCi0JYXJyYXkgdG8gbG9jYWwgcG9pbnRlci4KLQkoZ2V0X2FyZ3MsIHBhcnNlX2V4cHIpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLUZyaSBBcHIgMjQgMTI6NDc6NDIgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0KLQkqIHJlYWQuYyAoc19zZXQpOiBDYXN0IHhtYWxsb2MgcmV0dXJuIHZhbHVlIHRvIGZyYWdTICouCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRnVuY3Rpb24gbWFkZSBzdGF0aWMgdG8gbWF0Y2gKLQlwcmV2aW91cyBmb3J3YXJkIGRlY2xhcmF0aW9uLgotCShpbnNlcnRfcmVnLCBpbml0X3JlZ3RhYmxlLCBtZF9jb252ZXJ0X2ZyYWdfMSk6IExpa2V3aXNlLgotCi1GcmkgQXByIDI0IDA5OjI2OjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEFkZCBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MgdG8gZXJyb3IKLQlzdHJpbmdzLiAgCi0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGNhbl9tYWtlX3BhcmFsbGVsKTogQWRkIGludGVybmF0aW9uYWxpc2F0aW9uCi0JbWFjcm9zIHRvIGVycm9yIHN0cmluZ3MuCi0KLVRodSBBcHIgMjMgMTk6MjM6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IENvcnJlY3QgdGVzdCBvZiB3aGV0aGVyIGEKLQlyZWxvYyBpcyBpbiB0aGUgVE9DIGNzZWN0LgotCShtZF9hcHBseV9maXgzKTogQ29ycmVjdCBnZXR0ZXh0IHR5cG8uCi0KLVRodSBBcHIgMjMgMTQ6NTg6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChmaW5kX3JlYWxfc3RhcnQpOiBJZ25vcmUgc3ltYm9scyBzdGFydGluZyB3aXRoCi0JLkwgLSB0aGV5IGFyZSBsb2NhbCBsYWJlbHMgYW5kIHRoZSBicmFuY2hlcyBhcmUgbm90IHJlYWxseQotCWZ1bmN0aW9uIGNhbGxzIGJ1dCByYXRoZXIgZmFyIGp1bXBzLgotCi1XZWQgQXByIDIyIDE1OjU3OjIxIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAxNDo1MjozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogUHJpbnQgb3BlcmFuZCBudW1iZXIgcmF0aGVyIHRoYW4KLQl1c2luZyBvcmRpbmFsX25hbWVzLgotCShpMzg2X29wZXJhbmQpOiBMaWtld2lzZS4KLQotVHVlIEFwciAyMSAyMjozNDoyNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoSU5UTExJQlMpOiBEZWZpbmUgdG8gd29yayBhcm91bmQgYXBwYXJlbnQgYXV0b21ha2UKLQlidWcuCi0JQWxsIE1ha2VmaWxlczogUmVnZW5lcmF0ZWQuCi0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCi0JSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KLQkqIGRlcC1pbi5zZWQ6IEFkZGVkIGFzaW50bC5oLgotCSogcG8vTWFrZS1pbjogTmV3IGZpbGUuCi0JKiBnYXNwLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIGFuZCB0ZXh0ZG9tYWluLgotCUluY2x1ZGUgImFzaW50bC5oIi4KLQkqIHJlYWQuYyAoWl8pOiBSZW5hbWVkIGZyb20gYF8nLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBBZGRlZCBwby4KLQkoUE9URklMRVMpOiBuZXcgbWFjcm8uCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkoJChPQkpTKSk6IEFkZGVkIGFzaW50bC5oLgotCShIRklMRVMpOiBMaWtld2lzZS4KLQkoSU5DTFVERVMpOiBBZGRlZCAtRExPQ0FMRURJUiwgLUkkKHRvcF9zcmNkaXIpLy4uL2ludGwuCi0JKGFzX25ld19MREFERCk6IEFkZGVkICQoSU5UTExJQlMpLgotCShhc19uZXdfREVQRU5ERU5DSUVTKTogQWRkZWQgJChJTlRMREVQUykuCi0JKGdhc3BfbmV3X0xEQUREKTogQWRkZWQgJChJTlRMTElCUykuCi0JKGdhc3BfbmV3X0RFUEVOREVOQ0lFUyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsdC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIEdlbmVyYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLgotCShBTExfTElOR1VBUyk6IERlZmluZS4KLQkqIG1hY3JvLmM6IEluY2x1ZGUgImFzaW50bC5oIi4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIGFuZCB0ZXh0ZG9tYWluLgotCSogYXMuaDogSW5jbHVkZSAiYXNpbnRsLmgiLgotCSogY29uZmlnL3RjLWkzODYuYyAob3JkaW5hbF9uYW1lcyk6IFJlbW92ZWQuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlZCBlcnJvciB0ZXh0IHRvIGF2b2lkIG9yZGluYWxfbmFtZXMuCi0JKGkzODZfb3BlcmFuZCk6IExpa2V3aXNlLgotCShyZWxvYyk6IEFkZGVkIGFzX2JhZCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYmFkX2FyZ3MpOiBOb3cgYSAjZGVmaW5lLgotCShiYWRfcGMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19zdGFiX3BhcnNlKTogQ2hhbmdlZCB0eXBlIG9mCi0JYGxvbmdfY29uc3RfbXNnJy4KLQkoZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBVbmlmaWVkIHN0cmluZ3MgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogY29uZmlnL3RjLW02OGsuYyAoZ2V0X3JlbG9jX2NvZGUpOiBBZGRlZCBzb21lIGFzX2JhZCBjYWxscyB0bwotCWF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAocmVsb2MpOiBBZGRlZCBhc19iYWQgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZGVkIGFzX2JhZF93aGVyZSB0byBhdm9pZAotCWkxOG4gcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogQWRkZWQgYXNfYmFkIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ2hhbmdlZCBDKysgY29tbWVudCBpbnRvIEMKLQljb21tZW50LgotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IEFkZGVkIGFzX3dhcm4gdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IEFkZGVkIGFuIGZwcmludGYgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogY29uZC5jIChjb25kX2ZpbmlzaF9jaGVjayk6IEFkZGVkIGFzX2JhZCBjYWxsIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGV4cHIuYyAoZXhwcik6IEFkZGVkIGFzX3dhcm4gY2FsbCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCSogbWVzc2FnZXMuYyAoYXNfYXNzZXJ0KTogQ2hhbmdlZCBjb2RlIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKGFzX2Fib3J0KTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBBZGRlZCBhc19iYWQgY2FsbCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCShzX3NwYWNlKTogTGlrZXdpc2UuCi0JKiBwby9NYWtlLWluLCBwby9QT1RGSUxFUy5pbiwgcG8vZ2FzLnBvdDogTmV3IGZpbGVzLgotCi1UdWUgQXByIDIxIDE3OjAxOjIyIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoY2hlY2tfcHJlZml4KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgc3BsaXQgb3V0Ci0JZnJvbSBtZF9hc3NlbWJsZS4KLQkoc3RydWN0IF9pMzg2X2luc24pOiBBZGQgd2FpdF9wcmVmaXggZmllbGQuCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHdhaXRfcHJlZml4IGxvY2FsIHZhcmlhYmxlLiAgVXNlCi0JY2hlY2tfcHJlZml4IHdoZW4gYWRkaW5nIGEgcHJlZml4LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjdXJyZW50X3RlbXBsYXRlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIGN1cnJlbnRfdGVtcGxhdGVzIGxvY2FsIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSwgaTM4Nl9vcGVyYW5kKTogSW1wcm92ZSBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBpbgotCW1hbnkgcGxhY2VzLiAgQWRkIFJFU1RPUkVfRU5EX1NUUklORyBpbiBtYW55IHBsYWNlcyBiZWZvcmUgZXJyb3IKLQlyZXR1cm4uICBDbGFyaWZ5IHNvbWUgY29tbWVudHMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogQ2hhbmdlIHNlZyBmaWVsZCB0byBhIHR3bwotCWVsZW1lbnQgYXJyYXkuCi0JKG1kX2Fzc2VtYmxlKTogUGFyc2Ugc3RyaW5nIGluc3RydWN0aW9uIG9wZXJhbmRzLCBsb29raW5nIGZvcgotCXNlZ21lbnQgb3ZlcnJpZGUgcHJlZml4ZXMuICBDaGVjayBmb3IgaW52YWxpZCBzZWdtZW50IHByZWZpeGVzIG9uCi0Jc3RyaW5nIGluc3RydWN0aW9uLgotCShpMzg2X29wZXJhbmQpOiBpLnNlZ1tdIGFuZCBtYXggbWVtX29wZXJhbmQgY2hhbmdlcyBmb3Igc3RyaW5nCi0JaW5zbnMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChFc1NlZyk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWkzODYuaCAocmVnS2x1ZGdlKTogRGVmaW5lLgotCShpY2xyS2x1ZGdlLCBpbXVsS2x1ZGdlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBNZXJnZSBpbXVsS2x1ZGdlIGFuZCBpY2xyS2x1ZGdlCi0JY29kZS4gIE1vdmUgUmV2ZXJzZVJlZ1JlZ21lbSBmdWRnZXMgaW50byBNb2RybSBjYXNlLiAgUmVvcmRlcgotCW9wY29kZV9tb2RpZmllciBjaGVja3MgdG8gbG9vayBmb3IgbW9yZSBjb21tb24gY2FzZXMgZmlyc3QuICBBZGQKLQlkZWZhdWx0X3NlZyBmb3IgSXNTdHJpbmcgY2FzZS4KLQotVHVlIEFwciAyMSAxNjoxODoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9QUk9HX0xFWCByYXRoZXIgdGhhbiBBQ19QUk9HX0xFWCBhbmQKLQlBQ19ERUNMX1lZVEVYVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBhbmQgbGlidG9vbC4KLQkqIGFjbG9jYWwubTQsIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotCSogZG9jL01ha2VmaWxlLmFtIChhcy5kdmkpOiBOZXcgdGFyZ2V0LgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TYXQgQXByIDE4IDAxOjIxOjA0IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIHNwYXJjODZ4IHN1cHBvcnQuCi0JCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobG9va3VwX2FyY2gpOiBBZGRlZCBhcmNoX3R5cGUgdG8gc3RydWN0Ci0Jc3BhcmNfYXJjaC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogV2FybiBpZiAtRUwgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChTUEFSQ19CSUVORElBTikgQWx3YXlzIGRlZmluZS4KLQkKLVNhdCBBcHIgMTggMDE6MTk6MDEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE5vdGUgd2hlbiB3ZSB1c2UgZ2V0IG1hdGNoIG9uCi0gICAgICAgIHRoZSBmdWxsIGluc3RydWN0aW9uIG5hbWUuCi0KLVdlZCBBcHIgMTUgMTU6MTc6MjcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSkgW09fc3ltYm9sXTogQWxzbyBzdG9yZSB0aGUgc3ltYm9sCi0JYmFjayBpbnRvIHRoZSBleHByZXNzaW9uIHRvIGhhbmRsZSBhZGQvc3ViIHNpbXBsaWZpY2F0aW9uIGNvcnJlY3RseS4KLQotV2VkIEFwciAxNSAwNzowNjowNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKGhpbG9faW50ZXJsb2Nrcyk6IFJlbW92ZSA0MzAwLgotCi1Nb24gQXByIDEzIDE2OjUxOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fbXNyKTogU3VwcG9ydCB1bmRvY3VtZW50ZWQgJ21zciBjcHNyX2ZsZywKLQkjPG4+JyBpbnN0cnVjdGlvbi4KLQotVGh1IEFwciAgOSAxMDoyOTo0MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKG1heF9pbmRlbnRfbGV2ZWwpOiBOZXcgZ2xvYmFsLgotCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IFVzZSBpdC4KLQkqIGV4cHIuaCAoZXhwcl9idWlsZF9kb3QpOiBEZWNsYXJlLgotCSogZXhwci5jIChleHByX2J1aWxkX2RvdCk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIEFwciAgOCAxNjoxNjoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHByaW50X2JpbmFyeSk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfZXhwcl8xKTogQ2FsbCBpdC4KLQotTW9uIEFwciAgNiAxMjowNjozOSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSAiI0IiKTogSW5zdGFsbCB0aGUgb2Zmc2V0IG9mIHRoZQotCW9wZXJhbmQgaW4gdGhlIG9wY29kZS4KLQotRnJpIEFwciAgMyAxMTo1ODoxOSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IFJlb3JkZXIgb3BlcmFuZCBmbGFncyBhbmQgb3Bjb2RlIG1vZGlmaWVyCi0JZmxhZ3MgZm9yIGNsYXJpdHkuICBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zOiBVbmtub3duLAotCUltbVVua25vd24sIERpc3BVbmtub3duLCBOb01vZHJtLgotCSogY29uZmlnL3RjLWkzODYuYyAodHlwZV9uYW1lcyk6IEFkZCBtaXNzaW5nIERlYnVnIHR5cGUuCi0JKG1kX2Fzc2VtYmxlKTogQmV0dGVyIGR1cGxpY2F0ZSBwcmVmaXggY2hlY2tpbmcuICBRdWlja2VyIHN0cmluZwotCWluc3RydWN0aW9uIGNoZWNrIHZpYSBuZXcgb3Bjb2RlX21vZGlmaWVyIGZsYWcuCi0KLUZyaSBBcHIgIDMgMTE6NDQ6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoSW52b2tpbmcpOiBDbGFyaWZ5IC1XYSBleGFtcGxlLgotCi1GcmkgQXByICAzIDA5OjEyOjIzIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjZXR1cy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IEFkZCB3ZWFrZXh0IGVudHJ5LiAKLQkoc19taXBzX3dlYWtleHQpOiBEZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IERvbid0IGRlZmluZSBpZiBkZWZpbmVkKFRDX01JUFMpLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogRG9uJ3QgYWRkIHdlYWtleHQgaWYgCi0JZGVmaW5lZChUQ19NSVBTKS4JCi0JCi1UaHUgQXByICAyIDIyOjQyOjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAodGNfZ2VuX3JlbG9jKTogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMKLQlpcyBhbiBlcnJvciBpZiB0aGUgdmFsdWUgY2FuIG5vdCBiZSBjb21wdXRlZCBhdCBhc3NlbWJseSB0aW1lLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuLXJlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBBcHIgIDIgMTY6MzY6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKG1haW4pOiBTZXQgbmV4dCBmaWVsZCBvZiBuZXcgaW5jbHVkZV9wYXRoIHN0cnVjdHVyZSB0bwotCU5VTEwuICBGcm9tIEF2ZXJ5IFBlbm5hcnVuIDxhdmVyeXBAZ2RjLmNhPi4KLQotCSogcmVhZC5jIChzX21yaV9zZWN0KTogQ2FsbCBhc19iYWQgcmF0aGVyIHRoYW4gYWJvcnQgZm9yIGFuCi0JdW5zdXBwb3J0ZWQgTVJJIHRhcmdldC4KLQotV2VkIEFwciAgMSAxMTowODoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV92YWxpZGF0ZV9maXgpOiBOZXcgZnVuY3Rpb24uICBEZXRlcm1pbmUgaWYKLQl0aGUgZGVzdGluYXRpb24gb2YgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGFsdGVyZWQuCi0JKGZpbmRfcmVhbF9zdGFydCk6IE5ldyBmdW5jdGlvbjogIExvY2F0ZSB0aGUgcmVhbCwgVGh1bWIgY29kZWQKLQlzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLgotCShkb190X2JyYW5jaDIzKTogQWx0ZXIgdGhlIGRlc3RpbmF0aW9uIG9mIGJyYW5jaGVzIHRvIFRodW1iCi0JZnVuY3Rpb25zLiAKLQotCSogY29uZmlnL3RjLWFybS5oOiBEZWZpbmUgVENfVkFMSURBVEVfRklYLgotCi1UdWUgTWFyIDMxIDEzOjI3OjMzIDE5OTggIERlYW4gTS4gRGVhdmVyICA8ZGVhdmVyQGFtdC50YXkxLmRlYy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZGVjb2RlX3NoaWZ0KTogSGFuZGxlIGFkZHJlc3NpbmcgbW9kZSAyIHcvcnJ4Ci0JYWxzby4KLQotV2VkIEFwciAgMSAxMzoxMzoyMCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jL2FzLnRleGluZm86IFVzZSBAaXRlbXggZm9yIGEgc2Vjb25kYXJ5IGl0ZW0gaW4gYSB0YWJsZS4KLQkqIGRvYy9jLWhwcGEudGV4aTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMzEgMTc6NTI6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKERFUF9JTkNMVURFUyk6IE5ldyB2YXJpYWJsZS4KLQkoLmRlcDEpOiBDaGFuZ2UgdG8gd29yayB3aGVuIHNyY2RpciBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aC4KLQkoLnRjZGVwLCAub2JqZGVwLCAuZGVwMiwgZGVwLnNlZCk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzAgMTI6NDY6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oLCBjb25maWcvdGMtaTM4Ni5jOiBSZXZlcnQgTWFyY2ggMjQKLQlMaW5lYXJBZGRyZXNzIHBhdGNoLgotCi0JKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLU1vbiBNYXIgMzAgMTE6MjI6MDggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChGV2FpdCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBmd2FpdCBwcmVmaXggYmVmb3JlIGFueQotCW90aGVyIHByZWZpeGVzLiAgQ2hlY2sgRldhaXQgZmxhZyBpbiBvcGNvZGUgdGFibGUgdG8gc2VlIHdoaWNoCi0JaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgYW4gZndhaXQgcHJlZml4LgotCi1Nb24gTWFyIDMwIDEwOjEyOjAwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogQWx3YXlzIGNyZWF0ZSBhIHN0YWIgc3RyaW5nCi0Jc2VjdGlvbi4KLQotU2F0IE1hciAyOCAyMjoyODowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBMaWtld2lzZS4KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwgb3BlcmFuZCk6IExpa2V3aXNlLgotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IExpa2V3aXNlLgotCSogZ2FzcC5jIChsZXZlbF8wLCBjaGFuZ2VfYmFzZSwgZG9pbnN0cik6IExpa2V3aXNlLgotCSogaGFzaC5jIChoYXNoX2Fzayk6IExpa2V3aXNlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX3BhZ2UsIGNhbGNfaGV4LCBwcmludF9saW5lcyk6IExpa2V3aXNlLgotCShkZWJ1Z2dpbmdfcHNldWRvKTogTGlrZXdpc2UuCi0JKiBtYWNyby5jIChkZWZpbmVfbWFjcm8sIGNoZWNrX21hY3JvKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSwgc19hbGlnbiwgc19mbG9hdF9zcGFjZSk6IExpa2V3aXNlLgotCShpZ25vcmVfcmVzdF9vZl9saW5lLCBmbG9hdF9jb25zKTogTGlrZXdpc2UuCi0JKiBzeW1ib2xzLmMgKGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lKTogTGlrZXdpc2UuCi0JKiB3cml0ZS5jIChyZWNvcmRfYWxpZ25tZW50LCBjdnNfZnJhZ190b19maWxsKTogTGlrZXdpc2UuCi0JKGZpeHVwX3NlZ21lbnQsIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4pOiBMaWtld2lzZS4KLQkobnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbik6IExpa2V3aXNlLgotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbiwgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQkoc3BhcmNfaXAsIHBhcnNlX2tleXdvcmRfYXJnLCBzX2NvbW1vbik6IExpa2V3aXNlLgotCSogcmVhZC5jIChvdXRwdXRfYmlnX3NsZWIxMjgpOiBJbml0aWFsaXplIGxvY2FscyB0byBhdm9pZAotCXdhcm5pbmdzLgotCShvdXRwdXRfYmlnX3VsZWIxMjgsIGVxdWFscyk6IExpa2V3aXNlLgotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IENoYW5nZSBudW1iZXJfb2ZfZGlnaXRzXyogbG9jYWxzCi0JdG8gdW5zaWduZWQgaW50LiAgQ2hhbmdlIHplcm9zIHRvIHVuc2lnbmVkIGludC4KLQkqIGNvbmQuYyAoc19pZik6IEFkZCByZXR1cm4gdG8gZGVmYXVsdCBjYXNlLgotCSogZnJhZ3MuYyAoZnJhZ19ub3dfZml4KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGFkZHJlc3NULgotCSogZnJhZ3MuaCAoZnJhZ19ub3dfZml4KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGlzdGluZy5jIChmaWxlX2luZm9fc3RydWN0KTogQ2hhbmdlIGxpbmVudW0gdG8gdW5zaWduZWQgaW50LgotCShzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCk6IENoYW5nZSBobGxfbGluZSB0byB1bnNpZ25lZCBpbnQuCi0JKHByaW50X3NvdXJjZSk6IFVwZGF0ZSBmb3JtYXQgc3RyaW5nLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBDaGFuZ2Ugc2NhbiB0byB1bnNpZ25lZCBpbnQsIGFuZCBkb24ndAotCWJvdGhlciB0byBpbml0aWFsaXplIGl0LgotCSogc3ltYm9scy5jIChkb2xsYXJfbGFiZWxfY291bnQpOiBDaGFuZ2UgdG8gdW5zaWduZWQgbG9uZy4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVtb3ZlIHVudXNlZCBsYWJlbCByZWR1Y2VfZml4dXAuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfbWVtb3J5X21vZGVsKTogT25seSBkZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBBZGQgcmV0dXJuIHRvIGRlZmF1bHQgY2FzZS4KLQotRnJpIE1hciAyNyAxMjo0Njo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDaGVjayBsZWdhbCBhZGRyZXNzaW5nIG1vZGVzIGZvcgotIAltY2Y1MjAwIGp1c3QgYXMgd2UgZG8gZm9yIG02ODAwMC4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBMaWtld2lzZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQotRnJpIE1hciAyNyAxMDozMDowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiAgU3RvcmUgcmVsb2NhdGlvbiBhZGRlbmQgaW4KLQlmaXh1cCBpbnN0ZWFkIG9mIGluc3RydWN0aW9uLgotCi1UaHUgTWFyIDI2IDIzOjA3OjE4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBTd2FwIHRlbXBsYXRlIGFyZ3VtZW50cyB0bwotCUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggbWFjcm8gaW4gcmV2ZXJzZSBkaXJlY3Rpb24gdGVzdC4KLQlUaGlzIG1hY3JvIGlzIGN1cnJlbnRseSBzeW1tZXRyaWMsIHNvIHBhc3NpbmcgdGhlbSB0aGUgd3JvbmcKLQl3YXkgZGlkbid0IGNhdXNlIGFueSBwcm9ibGVtLCBidXQgbWF5IGlmIHRoZSBtYWNybyBpcyBjaGFuZ2VkCi0JaW4gdGhlIGZ1dHVyZS4KLQlBZnRlciBjb3B5aW5nIHRlbXBsYXRlIHRvIGkudG0sIHVzZSBpLnRtLiByYXRoZXIgdGhhbiB0LT4gdG8KLQlhY2Nlc3MgZmllbGRzLCBhbmQgbWFrZSB0IGEgY29uc3QqCi0JTW92ZSBpLnRtLm9wZXJhbmRfdHlwZXNbXSBzd2FwIHRvIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb3B5LgotCi1XZWQgTWFyIDI1IDEzOjQ0OjE4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGV4cHIuaCAoZXhwcl9idWlsZF91Y29uc3RhbnQpOiBBZGQgcHJvdG90eXBlLgotCShleHByX2J1aWxkX3VuYXJ5LGV4cHJfYnVpbGRfYmluYXJ5KTogQWRkIHByb3RvdHlwZXMuCi0JKiBleHByLmMgKGV4cHJfYnVpbGRfdWNvbnN0YW50KTogTmV3IGZ1bmN0aW9uLgotCShleHByX2J1aWxkX3VuYXJ5LGV4cHJfYnVpbGRfYmluYXJ5KTogTmV3IGZ1bmN0aW9ucy4KLQotV2VkIE1hciAyNSAxMzoxMDo0MiAxOTk4ICBCcnVubyBIYWlibGUgIDxicnVub0BsaW51aXgubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotCi0gICAgICAgICogZ2FzcC5jIChJUyopOiBDYXN0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIsIG5vdCB1bnNpZ25lZCBpbnQuCi0gICAgICAgICogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBJbmNyZWFzZSBidWZmZXIgc2l6ZS4KLSAgICAgICAgKiBtZXNzYWdlcy5jIChhc193YXJuKTogTGlrZXdpc2UuCi0JKGFzX3dhcm5fd2hlcmUsIGFzX2JhZCwgYXNfYmFkX3doZXJlKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMjUgMTI6NTk6MDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgTWFyIDI0IDE2OjUxOjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX2NsZWFudXAsIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogQ2FsbAotCW0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2suCi0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgZnVuY3Rpb24gdG8KLQllbWl0IGEgbm9wIGlmIGEgc2VjdGlvbiBlbmRzIHdpdGggYSAxNiBiaXQgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBNYXIgMjQgMTk6NDg6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfYnNzKTogQ29tcGlsZSB1bmNvbmRpdGlvbmFsbHkuICBDYWxsCi0Jc19sY29tbSByYXRoZXIgdGhhbiBvYmpfY29mZl9sY29tbS4KLQkob2JqX3BzZXVkb190YWJsZSk6IENvbXBpbGUgLmJzcyBwc2V1ZG8tb3AgdW5jb25kaXRpb25hbGx5LgotCi1UdWUgTWFyIDI0IDE4OjMwOjU4IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoTGluZWFyQWRkcmVzcyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSWYgTGluZWFyQWRkcmVzcyBpcyBzZXQgZm9yIHRoZQotCWluc3RydWN0aW9uLCBkb24ndCB1c2UgYSBkZWZhdWx0IHNlZ21lbnQuCi0KLU1vbiBNYXIgMjMgMTg6NTM6NDAgMTk5OCAgSm9lbCBTaGVycmlsbCAgPGpvZWxAT0FSY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogKHNoKi0qLXJ0ZW1zKik6IFN3aXRjaGVkIGZyb20gRUxGIHRvIENPRkYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjAgMTk6MTU6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVGh1IE1hciAxOSAxNjowMzoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBmaXggY29kZSB0byB0ZXN0IHRoZSByYW5nZSBvZgotCVBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uLiAKLQotCQotV2VkIE1hciAxOCAwOToyOTo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi0xOTk4LTAzLTE3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaXRibC1sZXgubCAoeXl3cmFwKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZCBhcyBhCi0JbWFjcm8uCi0KLUZyaSBNYXIgMTMgMTY6MzE6MzggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBkZXBlbmQuYyAocXVvdGVfc3RyaW5nX2Zvcl9tYWtlKTogTmV3IGZ1bmN0aW9uLgotCSh3cmFwX291dHB1dCk6IFVzZSBpdC4KLQotVGh1IE1hciAxMiAxODoyODoyMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgYnNzIGZsYWcgaW4gc2VnX2luZm8KLQlzdHJ1Y3R1cmUgaWYgdHlwZSBpcyBTSFRfTk9CSVRTLiAgW0J1ZyBmaXggY291cnRlc3kgb2YgcnRoXQotCi1TYXQgRmViIDI4IDE3OjI4OjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG9ydG9wdHMsIG1kX2xvbmdvcHRzLCBtZF9wYXJzZV9vcHRpb24pOgotCVJlY29nbml6ZSAtR04gYW5kIC1yZWxheC4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIGdwIHNpemUgZnJvbSAtRyBzd2l0Y2guCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBBbHdheXMgZm9yY2UgaWYgLXJlbGF4LgotCShhbHBoYV9hbGlnbik6IFRha2UgYSBuZXcgYXJndW1lbnQgdGhhdCB3aWxsIHNwZWNpZnkgd2hlbiB0byAKLQllbWl0IGFuIFJfQUxQSEFfQUxJR04gcmVsb2NhdGlvbiAodGhvdWdoIHdlIGRvbid0IGRvIHRoYXQgbm93KS4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuICBFbWl0IG5vcCBhbGlnbm1lbnQgcGFkZGluZyBhcyBub3ArdW5vcCBwYWlyLgotCi1TYXQgRmViIDI4IDE3OjA2OjIyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgW1RDX0FMUEhBXTogSW5jbHVkZSA8ZWxmL2FscGhhLmg+LgotCSogY29uZmlnL3RjLWFscGhhLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogTmV3LgotCi1UaHUgRmViIDI2IDE1OjQ5OjA0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRGVsYXllZCBqc3IgaW5zdHJ1Y3Rpb25zIGRvbid0Ci0JcmVxdWlyZSBwYWRkaW5nIHRvIHRoZSBuZXh0IGxvbmcgd29yZCBib3VuZGFyeS4KLQotTW9uIEZlYiAyMyAxMToyOTowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiAjaW5jbHVkZSBzeW1jYXQuaC4KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IExpa2V3aXNlLgotCi1Nb24gRmViIDIzIDEwOjI3OjQwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgY2FzZSAnUCcpOiBNYWtlICdQJyBhcmd1bWVudHMgYmUKLQlhYnNvbHV0ZSBleHByZXNzaW9ucyBpbnN0ZWFkIG9mICckJyBwcmVmaXhlZCByZWdpc3RlciBuYW1lcy4KLQotU2F0IEZlYiAyMSAyMjozNjo1MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfc2V0KTogUmVjb3JkIGZpbGUgYW5kIGxpbmUgaW5mbyBmb3Igc3ltYm9scyB3aGVuIC1hcy4KLQkocHNldWRvX3NldCk6IERvbid0IG92ZXJ3cml0ZSB0aGF0IGR1bW15IGZyYWdtZW50LgotCi1GcmkgRmViIDIwIDE1OjAzOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNlY3Rpb24iLgotCShwcGNfbmFtZWRfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVRodSBGZWIgMTkgMjI6MjU6NDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtcHBjLmMgKHBwY19iaWVpKTogQ2FjaGUgdGhlIGxhc3Qgc3ltYm9sIHdlIGluc2VydGVkCi0Jc28gd2UgZG9uJ3QgaGF2ZSB0byBzY2FuIHRoZSBlbnRpcmUgbGlzdC4KLQotVHVlIEZlYiAxNyAxNzowMjoxNSAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBGb3IgdGhlIGV4cGxpY2l0bHkgcGFyYWxsZWwKLSAJY2FzZSwgYWxsb3cgdGhlIHBhcmFsbGVsIGluc3RydWN0aW9ucyB0byBtb2RpZnkgdGhlIHNhbWUgZmxhZwotIAliaXRzLgotCi1UaHUgRmViIDE5IDE2OjA4OjE1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBDYXRlZ29yaXplIHN5bWJvbHMgYnkKLQl1bmRlZmluZWRfc2VjdGlvbiByYXRoZXIgdGhhbiBzeV9mcmFnLT5saW5lID09IE5VTEwuCi0KLVdlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgotCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgotCi1UdWUgRmViIDE3IDE4OjU4OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fbWRfYXBwbHlfZml4Myk6IERlbGV0ZSBjYWxsIHRvIHZhbGlkYXRlX29wZXJhbmQuCi0JVGVzdCByZXN1bHQgb2YgaW5zZXJ0X29wZXJhbmQgZm9yIGVycm9yLgotCi1GcmkgRmViIDEzIDE2OjQxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBBZGQgY3lnbnVzLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0JKiBkb2MvTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBGZWIgMTMgMDA6NDc6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IEhhbmRsZSBvcGVyYW5kIHR5cGUgJ0MnLgotCShtYWNybyk6IEZpeCBoYW5kbGluZyBvZiBNX0NPUFswLTNdLgotCi1UaHUgRmViIDEyIDE0OjA2OjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb3NzIEhhcnZleSA8cm9zc0B0ZXJhZmxvcC5jb20+OgotCSogbWFjcm8uYyAoSVNTRVApOiBPbmx5IHRyZWF0ICc8JyBhbmQgJz4nIGFzIHNlcGFyYXRvciBjaGFyYWN0ZXJzCi0JaWYgbWFjcm9fYWx0ZXJuYXRlIG9yIG1hY3JvX21yaS4KLQkoZ2V0c3RyaW5nKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGJ5dGUgY29uc3RhbnRzIGJldHdlZW4gPCBhbmQgPi4KLQkoZ2V0X2FueV9zdHJpbmcpOiAnPCcgb25seSBzdGFydHMgYSBzdHJpbmcgaWYgbWFjcm9fYWx0ZXJuYXRlIG9yCi0JbWFjcm9fbXJpLgotCShtYWNyb19leHBhbmRfYm9keSk6IFBlcm1pdCBrZXl3b3JkIHBhcmFtZXRlcnMgZm9sbG93aW5nCi0JcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RlLW5ic2QuaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhcy5oIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogTW92ZSBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApOiAuLi50bwotCWhlcmUsIGFuZCBtYWtlIHN0YXRpYy4KLQotCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBPbmx5IHVzZSBzZWdfaW5mbyBpZgotCUJGRF9BU1NFTUJMRVIgb3IgTUFOWV9TRUdNRU5UUy4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBMaWtld2lzZS4KLQkqIGRvYy9hcy50ZXhpbmZvIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTEgMjM6MjY6MjggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogRG9uJ3QgdXNlIG1pcHMgSUlJIG9yIG1pcHMgSVYKLQlpbnNucyByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIGEgcG9pbnRlciBpZiB3ZSdyZSBpbiBtaXBzIEkgb3IKLQlNSVBTIElJIG1vZGUuCi0gICAgICAgIChtYWNybywgbWFjcm8yLCBzX2NwcmVzdG9yZSwgc19jcGFkZCk6IExpa2V3aXNlLgotCi1UaHUgRmViIDEyIDAzOjQxOjAwIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLUZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6Ci0JKiB0Yy1kMTB2LmMgKHBhcmFsbGVsX29rLCBmaW5kX29wY29kZSk6Ci0JU3BsaXQgT1BFUkFORF9BQ0MgaW50byBPUEVSQU5EX0FDQzAgYW5kIE9QRVJBTkRfQUNDMS4KLQlJbnRyb2R1Y2UgT1BFUkFORF9HUFIuCi0KLVdlZCBGZWIgMTEgMTY6Mjg6MTMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2ZpbGwpOiBIYW5kbGUgbm9uLWNvbnN0YW50IHJlcGVhdCBjb3VudHMgYnkgY3JlYXRpbmcKLQlhbiByc19zcGFjZSBmcmFnbWVudC4KLQotVHVlIEZlYiAxMCAxODozMTozMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoYW5nZSBlcnJvciBhZGRlZCBKYW4gMiAxOTk4Ci0JZnJvbSBhc19iYWQgdG8gYXNfd2Fybi4KLQotVHVlIEZlYiAxMCAxODowNDowMCAxOTk4ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogYXMuYzogKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IFVzZSBbVEVYVHxEQVRBfEJTU11fU0VDVElPTl9OQU1FCi0JKiBhcy5oOiBEZWZpbmUgZGVmYXVsdCB2YWx1ZXMgb2YgW1RFWFR8REFUQXxCU1NdX1NFQ1RJT05fTkFNRQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2JlZ2luKTogVXNlIFtURVhUfERBVEF8QlNTXV9TRUNUSU9OX05BTUUKLQotVHVlIEZlYiAxMCAxNzo1ODoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVob3B0LmMgKGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50KTogSWYgbm90IEJGRF9BU1NFTUJMRVIsIHVzZQotCXNlZ19maXhfcm90UCByYXRoZXIgdGhhbiBmaXhfcm9vdCBmcm9tIHNlZ19pbmZvLgotCi1UdWUgRmViIDEwIDE1OjMyOjIyIDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgotCi0JKiBleHByLmM6IEFkZCBzdXBwb3J0IGZvciAweDFfMl8zXzQgYmlnbnVtcy4KLQotVHVlIEZlYiAxMCAxNDo0Mzo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IFRyZWF0IFxyIGFzIHdoaXRlc3BhY2UuCi0KLU1vbiBGZWIgIDkgMTQ6MTY6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TYXQgRmViICA3IDE1OjMzOjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBGZWIgIDYgMTY6MDg6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiBtaXBzX2NwdSBpcyBzZXQsIHRoZW4gdXNlIGl0IGFzCi0gICAgICAgIHRoZSBhcmd1bWVudCB0byBiZmRfc2V0X2FyY2hfbWFjaC4KLSAgICAgICAgKGxvYWRfYWRkcmVzcyk6IFVzZSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIHRvIGRldGVybWluZSB0aGUKLSAgICAgICAgYml0IHNpemUgb2YgYW4gYWRkcmVzcyBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQgdGhlIGlzYSBsZXZlbC4KLSAgICAgICAgKG1hY3JvLCBtYWNybzIsIHNfY3ByZXN0b3JlLCBzX2NwYWRkKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgIDYgMTQ6NDQ6MzQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tdjg1MGFueSBjb21tYW5kIGxpbmUgb3B0aW9uLgotCi1UaHUgRmViICA1IDEyOjM5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWhvcHQuYzogTmV3IGZpbGUuCi0JKiBhcy5oIChlbnVtIF9yZWxheF9zdGF0ZSk6IEFkZCByc19jZmEuCi0JKGNoZWNrX2VoX2ZyYW1lLCBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IERlY2xhcmUuCi0JKGVoX2ZyYW1lX3JlbGF4X2ZyYWcsIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IENhbGwgY2hlY2tfZWhfZnJhbWUuCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogSGFuZGxlIHJzX2NmYS4KLQkocmVsYXhfc2VnbWVudCk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoR0FTX0NGSUxFUyk6IEFkZCBlaG9wdC5jLgotCShHRU5FUklDX09CSlMpOiBBZGQgZWhvcHQuby4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoRnJhZ3MpOiBEb2N1bWVudCByc19jZmEuCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIC0tdHJhZGl0aW9uYWwtZm9ybWF0LgotCShwYXJzZV9hcmdzKTogQWNjZXB0IC0tdHJhZGl0aW9uYWwtZm9ybWF0LgotCSogYXMuaCAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpOiBEZWNsYXJlLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogSWYgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQsCi0Jc2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQgb24gc3Rkb3V0cHV0LgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLXRyYWRpdGlvbmFsLWZvcm1hdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEKLQlmaXh1cCBmb3IgYW4gdW5tYXRjaGVkICVoaSByZWxvYywgaXQgZG9lcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEKLQl2YXJpYW50IGZyYWcuCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGRvYy9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDQgMTU6NDE6NTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoY2hlY2tfZm9yX3NpZGVfZWZmZWN0cyk6IE5ldyBmdW5jdGlvbi4KLQkoY2FuX21ha2VfcGFyYWxsZWwpOiBBZGQgY2hlY2tzIGZvciBpbnN0cnVjdGlvbiBzaWRlIGVmZmVjdHMKLQljbGFzaGluZyB3aXRoIHRoZSBvdGhlciBpbnN0cnVjdGlvbi4KLQkoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IEltcHJvdmUgd2FybmluZyBtZXNzYWdlcy4gIFJldHVybiBlcnJvcgotCW1lc3NhZ2UgZnJvbSBub24tc3dhcHBlZCBpbnN0cnVjdGlvbiBvcmRlci4KLQotV2VkIEZlYiAgNCAyMDowMDoyNiAxOTk4ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEB0ZWtuZW1hLmRlbW9uLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IFJlbmFtZSBhcm1fYWZ0ZXJfcGFzc19ob29rKCkgdG8gYXJtX2NsZWFudXAoKS4KLQotCSogY29uZmlnL3RjLWFybS5oOiBSZXBsYWNlIG1kX2FmdGVyX3Bhc3NfaG9vayBkZWZpbml0aW9uIHdpdGggYQotIAltZF9jbGVhbnVwIGRlZmluaXRpb24uICBUaGlzIG1vdmVzIHRoZSBmb3JjZWQgbGl0ZXJhbCBvdXRwdXQgdG8KLSAJdGhlIGVuZCBvZiB0aGUgc291cmNlIHBhc3MsIGFuZCBhdm9pZHMgbWFjcm8ncyBpbnNlcnRpbmcgbGl0ZXJhbHMKLSAJaW50byB0aGUgY29kZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFjcm8gZXhwYW5zaW9uLgotCi1XZWQgRmViICA0IDEzOjE3OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0VMRl06IEEgcmVsb2MgYWdhaW5zdAotCWEgZ2FzIGludGVybmFsIHN5bWJvbCBpcyBhZGp1c3RhYmxlLgotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgotCi0JKiBhcy5oOiBJZiBnY2MgdmVyc2lvbiBncmVhdGVyIHRoYW4gMi42LCB1c2UgYF9fZm9ybWF0X18nIGFuZAotCWBfX3ByaW50Zl9fJyBpbiBmdW5jdGlvbiBhdHRyaWJ1dGVzLCByYXRoZXIgdGhhbiBgZm9ybWF0JyBhbmQKLQlgcHJpbnRmJy4KLQotTW9uIEZlYiAgMiAxODozODoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBPbmx5IGluY2x1ZGUgZWxmL3NwYXJjLmggaWYgT0JKX0VMRi4KLQotTW9uIEZlYiAgMiAxODozMDozNCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JQWRkIHRtczMyMGMzMCBzdXBwb3J0OgotCSogY29uZmlnL3RjLXRpYzMwLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLXRpYzMwLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmLmg6IElmIFRDX1RJQzMwLCBpbmNsdWRlIGNvZmYvdGljMzAuaCBhbmQgZGVmaW5lCi0JVEFSR0VUX0ZPUk1BVCBhcyAiY29mZi10aWMzMCIuCi0JKiBjb25maWd1cmUuaW4gKHRpYzMwLSotKmFvdXQqLCB0aWMzMC0qLSpjb2ZmKik6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDUFVfVFlQRVMpOiBBZGQgdGljMzAuCi0JKENQVV9PQkpfVkFMSUQpOiB0aWMzMC1hb3V0IGlzIHZhbGlkLgotCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCBjb25maWcvdGMtdGljMzAuYy4KLQkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgY29uZmlnL3RjLXRpYzMwLmguCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDEwOjIwOjM3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSW1wcm92ZW1lbnRzIHRvIGVycm9yIG1lc3NhZ2VzLgotCi1Nb24gRmViICAyIDEyOjM5OjA1IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IENoYW5nZSBCRkRfUkVMT0NfSEkxNiBhbmQKLSAJQkZEX1JFTE9DX0hJMTZfUyB0byBzdG9yZSB0aGUgaGlnaCBiaXRzIG9mIGFueSB2YWx1ZS4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IFVuZG8gY2hhbmdlIG9mIEZyaSBKdW4gMjcuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERvbid0IGxldCB0aGUKLQlhc3NlbWJsZXIgY2FsY3VsYXRlIHJlbG9jYXRpb25zIHRvIGFueSBleHRlcm5hbCBzeW1ib2wgYXQgYWxsLgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKSBbT0JKX0VMRl06IENvcnJlY3QgYnVncwotCWludm9sdmluZyBnZW5lcmF0aW9uIG9mIHBjLXJlbGF0aXZlIHJlbG9jcy4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKSBbT0JKX0VMRl06IFRoZSBqb2IgdGhpcyBjb2RlIHVzZWQgdG8gZG8KLQloYXMgYmVlbiBtb3ZlZCB0byBtZF9hcHBseV9maXgzLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggdGVzdCBmb3IgdG9vLWZhciBicmFuY2guCi0JKHBwY19lbGZfc3VmZml4KTogV2FybiBhYm91dCAnaWRlbnRpZmllcitjb25zdGFudEBnb3QnIHN5bnRheCwKLQl3aGljaCBhY3R1YWxseSBtZWFucyAodGhlIGFkZHJlc3Mgb2YgaWRlbnRpZmllcidzIEdPVCBlbnRyeSkgKwotCWNvbnN0YW50LCB3aGljaCBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bC4KLQotRnJpIEphbiAzMCAxMTowMjozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWFkLmggKGluY2x1ZGVfZGlycyk6IERlY2xhcmUuCi0JKGluY2x1ZGVfZGlyX2NvdW50LGluY2x1ZGVfZGlyX21heGxlbik6IERlY2xhcmUuCi0KLUZyaSBKYW4gMzAgMTE6NDc6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENvcnJlY3QgY2hlY2sgZm9yIHNoYXJlZCBvcGNvZGVzIGxpYnJhcnkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGxpc3RpbmcuYyAoYnVmZmVyX2xpbmUpOiBJZiB3ZSBjYW4ndCBvcGVuIHRoZSBmaWxlLCBzZXQgYXRfZW5kLgotCShsaXN0aW5nX3ByaW50KTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBmaS4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAocmVnbGlzdHBhaXIpOiBIYW5kbGUgcmVnaXN0ZXIgbGlzdCBpbgotCWVpdGhlciBvcmRlci4KLQotCSogY29uZmlnL3Ztcy1jb25mLmg6IERvbid0IHVuZGVmIFZFUlNJT04uCi0KLVRodSBKYW4gMjkgMTQ6NDI6NDQgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmFtIChDT05GSUdfT0JKUyk6IE5ldyB2YXJpYWJsZSwgY29udGFpbmluZyBwYXJ0IG9mIG9sZAotCU9CSlMgdmFyaWFibGUuCi0JKEdFTkVSSUNfT0JKUyk6IE5ldyB2YXJpYWJsZSwgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb2xkIE9CSlMKLQl2YXJpYWJsZS4KLQkoT0JKUyk6IE5vdyBqdXN0ICQoQ09ORklHX09CSlMpIGFuZCAkKEdFTkVSSUNfT0JKUykuCi0JKCQoc3JjZGlyKS9tYWtlLWdhcy5jb20pOiBSZW5hbWUgZnJvbSBtYWtlLWdhcy5jb20uCi0JKHN0YW1wLW1rLmNvbSk6IFJlcGxhY2UgJChPQkpTKSB3aXRoICQoR0VORVJJQ19PQkpTKS4KLQkoRVhUUkFfRElTVCk6IERlZmluZS4KLQkqIHZtc2NvbmYuc2g6IEhhbmRsZSB7dGFyZy1jcHUsIG9iai1mb3JtYXQsIGF0b2YtdGFyZ30gbW9kdWxlcwotCWV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gdmlhIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcy4KLQkoZ2NjLWFzLm9wdCk6IE5ldyBmaWxlIGNyZWF0ZWQgd2hlbiBtYWtlLWdhcy5jb20gaXMgcnVuLgotCSogY29uZmlnLWdhcy5jb206IENyZWF0ZSB7dGFyZy1jcHUuaCwgb2JqLWZvcm1hdC5oLCB0YXJnLWVudi5oLAotCWl0YmwtY3B1Lmh9IHRvICNpbmNsdWRlIGFwcHJvcHJpYXRlIGZpbGUgcmF0aGVyIHRoYW4gY29weWluZyB0aGF0Ci0JZmlsZS4KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBTeW5jaHJvbml6ZSB3aXRoIGN1cnJlbnQgY29uZmlnLmluLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKYW4gMjkgMTg6NDg6MTkgMTk5OCAgQmlsbCBNb3llciAgPGJpbGxtQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQWRkZWQgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsLgotCShwYXJhbGxlbF9vayk6IFJlbGF4ZWQgcGFyYWxsZWwgc3ViaW5zdHJ1Y3Rpb24gZGVwZW5kZW5jeSBjaGVjay4KLQotV2VkIEphbiAyOCAxNDozNTowMCAxOTk4ICBCaWxsIE1veWVyIDxiaWxsbUBjeWdudXMuY29tPgotCi0JKiBhcy5oIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogYWRkZWQgbmV3IGZsYWcuCi0JKiB0Yy1kMTB2LmMgKG1kX3BhcnNlX29wdGlvbixtZF9sb25nb3B0cyk6IGFkZGVkICItLW5vd2FybnN3YXAiIAotCWNvbW1hbmQgbGluZSBhcmd1bWVudC4KLQkqIHRjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IGVtaXQgIlN3YXBwaW5nIGluc3RydWN0aW9ucyIKLQl3YXJuaW5nIG9ubHkgaWYgZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCBpcyBmYWxzZS4KLQotV2VkIEphbiAyOCAxNjo0MToxOSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbWluZ3czMiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDI4IDE0OjUxOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IHNldCB0aGUgc2VnbWVudCBpZiBpdAotCWhhc24ndCBjaGFuZ2VkLCBhbmQgdGhpcyBpcyBPQkpfQU9VVCB3aXRob3V0IEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0xPQ0FMKTogQ29ycmVjdCB0eXBvLS1wYXNzIGFyZ3VtZW50IHRvCi0JU19HRVRfU0VHTUVOVC4KLQotV2VkIEphbiAyOCAxMzo1NDo1MCAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCWFzLmggKHVubGluayk6IFJldmVyc2UgMTMtRmViLTk3IGNoYW5nZTsgdXNlIG9mIHVubGluayB2cyByZW1vdmUKLQlkZXBlbmRzIHVwb24gSEFWRV97VU5MSU5LLFJFTU9WRX0gdmFsdWVzIHJhdGhlciB0aGFuIGhvc3QKLQljb21waWxlci4KLQotV2VkIEphbiAyOCAxMzo0ODowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04pOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjggMDk6NTI6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IERpc3BsYXkgaW5zdHJ1Y3Rpb24gd2hlbgotCWFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotCi1UdWUgSmFuIDI3IDEzOjMyOjAxIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotc2NvMy4ydjUqKTogRGVmYXVsdHMgdG8gRUxGIG5vdy4KLQkoaTM4Ni0qLXNjbzMuMnY1KmNvZmYpOiBOZXcgdGFyZ2V0LgotCShpMzg2LSotc2NvMy4yKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBKYW4gMjcgMTE6MDY6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogVGlkeSBlcnJvciBtZXNzYWdlIHByb2R1Y3Rpb24uCi0KLVR1ZSBKYW4gMjcgMTI6MjQ6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgbmV3IHZhcmlhYmxlIG5ld2ltbSB0byBob2xkCi0JdmFsaWRhdGVfaW1tZWRpYXRlIHJldHVybiB2YWx1ZSBpbiB0aGUgcmlnaHQgdHlwZSBmb3IgY29tcGFyaXNvbnMKLQl0byBGQUlMLgotCi1UdWUgSmFuIDI3IDA2OjUxOjU5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAoTUFYX0JZVEVTKTogVXNlIGxpc3RpbmcgdmFyaWFibGVzIG5vdCBjb25zdGFudHMuCi0JKGRhdGFfYnVmZmVyKTogTm8gbG9uZ2VyIGFuIGFycmF5LCBidXQgYSBwb2ludGVyLgotCShjYWxjX2hleCk6IHNpemVvZihkYXRhX2J1ZmZlcikgLT4gTUFYX0JZVEVTLgotCShsaXN0aW5nX2xpc3RpbmcpOiBBbGxvY2F0ZSBkYXRhX2J1ZmZlci4KLQotVHVlIEphbiAyNyAwNjozODozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIC0tbGlzdGluZy1saHMtd2lkdGgsIC0tbGlzdGluZy1saHMtd2lkdGgyLAotCS0tbGlzdGluZy1yaHMtd2lkdGgsIC0tbGlzdGluZy1jb250LWxpbmVzLgotCShzaG93X3VzYWdlKTogVXBkYXRlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX2xoc193aWR0aCwgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kKTogTmV3IHZhcnMuCi0JKGxpc3RpbmdfbGhzX2NvbnRfbGluZXMsIGxpc3RpbmdfcmhzX3dpZHRoKTogTmV3IHZhcnMuCi0JKHByaW50X2xpbmVzKTogVXNlIHRoZSB2YXJpYWJsZXMgaW5zdGVhZCBvZiB0aGUgY29uc3RhbnRzLgotCShsaXN0aW5nX2xpc3RpbmcpOiBMaWtld2lzZS4JCi0JKiBsaXN0aW5nLmg6IERlY2xhcmUgdGhlIG5ldyB2YXJzLgotCQotVHVlIEphbiAyNyAwNTozMjowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIC0ta2VlcC1sb2NhbHMgYWxpYXMgZm9yIC1MLgotCUFkZCAtLXN0cmlwLWxvY2FsLWFic29sdXRlLgotCShzaG93X3VzYWdlKTogVXBkYXRlLgotCSogYXMuaCAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSk6IE5ldyBmbGFnLgotCSogc3ltYm9scy5jIChTX0lTX0xPQ0FMKTogVXNlIGl0LgotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCi1Nb24gSmFuIDI2IDEzOjA3OjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IERldGVjdCBpZiBleHBsaWNpdGx5IHBhcmFsbGVsIGluc3RydWN0aW9ucwotCW1pZ2h0IGhhdmUgYW4gaW8gY29uZmxpY3QgYW5kIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlLiAKLQotVGh1IEphbiAyMiAxNzo1MTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fc2F2ZV9maXh1cHMsIGNnZW5fcmVzdG9yZV9maXh1cHMsCi0JY2dlbl9zd2FwX2ZpeHVwcyk6IEZ1bmN0aW9ucyB0byBzYXZlLCByZXN0b3JlIGFuZCBzd2FwIHRoZSBmaXh1cAotCWNoYWluIHdpdGggYSBiYWNrdXAgY29weS4KLQkoY2dlbl9hc21fZmluaXNoX2luc24pOiBSZXR1cm5zIGFkZHJlc3Mgb2YgY29uc3RydWN0ZWQgaW5zbi4KLQotV2VkIEphbiAyMSAxNjo0OToxMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mb19zdHJ1Y3QpOiBSZW1vdmUgRklMRSwgYWRkIFBPUy4KLQkobGFzdF9vcGVuX2ZpbGVfaW5mbywgbGFzdF9vcGVuX2ZpbGUpOiBOZXc7IGEgb25lIGVudHJ5IEZJTEUqIGNhY2hlLgotCShmaWxlX2luZm8pOiBEb24ndCBvcGVuIHRoZSBmaWxlLgotCShidWZmZXJfbGluZSk6IENoZWNrIGZvciB0aGUgZmlsZSBpbiB0aGUgbGFzdF9vcGVuIGNhY2hlLCB1cGRhdGluZwotCWFzIG5lY2Vzc2FyeS4KLQkocHJpbnRfc291cmNlKTogRG9uJ3QgcmVmZXJlbmNlIGZpbGVfaW5mby0+ZmlsZS4KLQkobGlzdGluZ19saXN0aW5nKTogTGlrZXdpc2UuCi0JKGxpc3RpbmdfcHJpbnQpOiBDbG9zZSB0aGUgZmlsZSBpbiB0aGUgY2FjaGUsIGlmIGFueS4KLQotRnJpIEphbiAxNiAxNDo1MTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZHdhcmZfZmlsZV9zdHJpbmcpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGVtaXRfZXhwcik6IExvb2sgZm9yIGNvbnN0YW50IHNlcXVlbmNlIHRoYXQgbGVhZHMgdXAgdG8gYSBmaWxlCi0JbmFtZSBpbiBEV0FSRiBkZWJ1Z2dpbmcgb3V0cHV0LgotCShzdHJpbmdlcik6IFVzZSBkd2FyZl9maWxlX3N0cmluZyB0byBkZWNpZGUgd2hldGhlciB0byBhY2NlcHQgYQotCXN0cmluZyBhcyBhIGZpbGUgbmFtZS4KLQotRnJpIEphbiAxNiAxMTozMDozNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1tNjhrLmMgKG02OGtfaXApOiBSZW1vdmUgYWJzbC0+cmVnbHN0IE1SSSBoYWNrLgotCShjcmFja19vcGVyYW5kKTogQWRkIHJlZy0+cmVnbHN0IE1SSSBoYWNrLgotCShyX3NlZyk6IFB1dCByZWdsc3Qgc3ltYm9scyBpbiByZWdfc2VjdGlvbi4KLQkobTY4a19mcm9iX3N5bWJvbCk6IEZyb2IgcmVnbHN0IHN5bWJvbHMgaW50byBhYnNvbHV0ZV9zZWN0aW9uLgotCi1UaHUgSmFuIDE1IDE0OjE5OjAxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLXNoLmMgKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBTR1IgJiBEQlIuCi0KLVRodSBKYW4gMTUgMTM6NDY6NDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtaDgzMDAuYyAocGFyc2VfcmVnKTogVGFrZSB0aGUgbGVuZ3RoIG9mIHRoZSBzeW1ib2wgaW50bwotCWFjY291bnQgd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIGEgcmVnaXN0ZXIgbmFtZS4KLQkqIHRjLWg4NTAwLmMgKHBhcnNlX3JlZyk6IExpa2V3aXNlLgotCi1XZWQgSmFuIDE0IDE3OjUyOjMzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYzogRm9ybWF0dGluZyBjaGFuZ2VzIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCi0KLVdlZCBKYW4gMTQgMTU6NDE6NDEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFJld29yayBkaXZpc2lvbiBjb2RlIHRvIGF2b2lkIHVuZmlsbGVkCi0JZGVsYXkgc2xvdC4KLQotV2VkIEphbiAxNCAxODowNDoyMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBKaW0gV2lsc29uCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IFJlbW92ZSBub24tYW5zaSBkZWZhdWx0IGNhc2UuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBjcm9zcyBzZWN0aW9uIFBDIHJlbGF0aXZlIHJlbG9jcwotCWNvcnJlY3RseS4KLQotV2VkIEphbiAxNCAxNTowMjoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHRlc3QgcGluZm8gZmxhZ3MgaWYgSU5TTl9NQUNSTy4KLQotTW9uIEphbiAxMiAxMzowNDo1NyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiAjaW5jbHVkZSBzZXRqbXAuaC4gIENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKGV4cHJfam1wX2J1Zik6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IEFsbG93IHVzZSBvZiBsb25nam1wIGluIHBhcnNpbmcgdG8gaGFuZGxlIGVycm9ycy4KLQkoY2dlbl9tZF9vcGVyYW5kKTogTmV3IGZ1bmN0aW9uLgotCSogdGMtbTMyci5jOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVzZSBDR0VOX0lOU05fTU5FTU9OSUMuCi0KLVR1ZSBKYW4gIDYgMTU6MzY6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX1NFVF9TRUdNRU5UKTogRG9uJ3Qgc2V0IHRoZSBzZWdtZW50IGZvciBzZWN0aW9uIHN5bXMuCi0JKFNfSVNfRVhURVJOQUwsIFNfSVNfTE9DQUwpOiBDb3JyZWN0IHBhcmVudGhldGljYXRpb24uCi0KLUZyaSBKYW4gIDIgMTY6MDg6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBHaXZlIGFuIGVycm9yIGlmIHRoZXJlIGFyZQotCXVucmVjb2duaXplZCBjaGFyYWN0ZXJzIGFmdGVyIGFuIGV4cHJlc3Npb24uCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTY5NwpkaWZmIC0tZ2l0IGEvZ2FzL0NoYW5nZUxvZy05Mjk1IGIvZ2FzL0NoYW5nZUxvZy05Mjk1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE0OGU2Li4wMDAwMDAwCi0tLSBhL2dhcy9DaGFuZ2VMb2ctOTI5NQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTEwICswLDAgQEAKLVNhdCBEZWMgMzAgMjM6NDI6NTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogU2ltcGxpZnkuICBDb3JyZWN0bHkgaGFuZGxlIHN5bSArIG9mZnNldAotCWFkZHJlc3NlcyBmb3Igc3RhdGljIHZhcmlhYmxlcy4KLQotVGh1IERlYyAyMSAxMjo1NDozMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWFwcGluZyk6IE1ha2UgQGdvdCBnaXZlIGEgcmVhbCBHT1QgcmVsb2NhdGlvbiwKLQlhbmQgeGdvdCBnaXZlIHRoZSBvbGQgdG9jMTYgcmVsb2NhdGlvbi4KLQkobWRfYXBwbHlfZml4Myk6IFN1cHBvcnQgYWxsIEdPVCByZWxvY2F0aW9ucy4KLQotV2VkIERlYyAyMCAxNDo1NzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfYWRkcmVzcyk6IENvcnJlY3RseSBoYW5kbGUgYSBjb25zdGFudCBpbgotCVNWUjRfUElDIGNhc2UuICBGcm9tIFJpY2hhcmQgS2VubmVyIDxrZW5uZXJAdmxzaTEudWx0cmEubnl1LmVkdT4uCi0KLUZyaSBEZWMgMTUgMTQ6MjU6MDcgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogUmVjb2duaXplIFNIMyByZWdpc3RlcnMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBBX1NTUiwgQV9TUEMgYW5kIEFfUkVHX0IuCi0JKGJ1aWxkX01ieXRlcyk6IEhhbmRsZSBSRUdfQi4KLQotRnJpIERlYyAxNSAxNjowNzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2F1eCk6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCi0KLUZyaSBEZWMgMTUgMTI6MTE6NDggMTk5NSAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBJZiBsaW5raW5nLCBlZGl0IEFMTF9DRkxBR1MgdG8gQ0ZMQUdTLgotCi1UaHUgRGVjIDE0IDE1OjA5OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IHRoZSBzX2FsaWduIGZpZWxkIHRvCi0JdGhlIG51bWJlciBvZiBieXRlcywgcmF0aGVyIHRoYW4gdG8gdGhlIHBvd2VyIG9mIDIuCi0KLVR1ZSBEZWMgMTIgMTI6MTk6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVENMRUFOX0hFUkUpOiBOZXcgdmFyaWFibGUuCi0JKGRpc3RjbGVhbik6IFVzZSBpdC4KLQkobWFpbnRhaW5lci1jbGVhbik6IERlcGVuZCB1cG9uIGNsZWFuLWhlcmUgcmF0aGVyIHRoYW4gY2xlYW4sCi0JZGlzdGNsZWFuLCBhbmQgY2xlYW4taW5mby4gIFJ1biBtYWtlIG1haW50YWluZXItY2xlYW4gaW4gZG9jLgotCVJlbW92ZSBmaWxlcyBsaXN0ZWQgaW4gRElTVENMRUFOX0hFUkUuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogU3BsaXQgb3V0IGZyb20KLQlkaXN0Y2xlYW4uICBEZXBlbmQgdXBvbiBjbGVhbi1pbmZvIGFuZCBkaXN0Y2xlYW4uCi0KLU1vbiBEZWMgMTEgMTY6MjM6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtYWMtYXMucjogRml4IGNvcHlyaWdodCBhbmQgdmVyc2lvbiBzdHJpbmdzLgotCShjZnJnKTogVXNlIFBST0dfTkFNRSBpbnN0ZWFkIG9mIGxpdGVyYWwgbmFtZS4KLQotTW9uIERlYyAxMSAxNDoxNDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgdGNfdW5yZWNvZ25pemVkX2xpbmUgaXMgZGVmaW5lZCwKLQljYWxsIGl0LgotCSogY29uZmlnL3RjLWEyOWsuaCAodGNfdW5yZWNvZ25pemVkX2xpbmUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYTI5ay5jIChhMjlrX3VucmVjb2duaXplZF9saW5lKTogTmV3IGZ1bmN0aW9uLgotCShtZF9vcGVyYW5kKTogSGFuZGxlIGEyOWsgc3R5bGUgbG9jYWwgZG9sbGFyIGxhYmVscy4KLQotV2VkIERlYyAgNiAxNzo1Mjo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaDogSWYgT0JKX01BWUJFX0VMRiwgZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFLgotCi1UdWUgRGVjICA1IDEzOjI2OjM0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfZmlsbCk6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlzIGRlZmluZWQsIGNhbGwKLQlpdC4KLQotTW9uIERlYyAgNCAxNToxMDo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbiwgZmlsbF9zZWN0aW9uLCBmaXh1cF9tZGVwcyk6Ci0JVHJlYXQgcnNfYWxpZ25fY29kZSBsaWtlIHJzX2FsaWduLgotCi1TdW4gRGVjICAzIDE2OjQ2OjU0IDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogY29uZmlnL3RjLWFybS5jIChjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBTZXQgcHJlX2luYyB3aGVuCi0JY29udmVydGluZyBhbiBhYnNvbHV0ZSBhZGRyZXNzIGludG8gYSBQQy1yZWxhdGl2ZSBvbmUuCi0KLUZyaSBEZWMgIDEgMTE6NTc6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBEb24ndCBhbHdheXMgdXNlIHRlLWdlbmVyaWMuaCBmb3IgZW11bGF0aW9uLgotCShwb3dlcnBjLWFwcGxlLW1hY29zKTogVXNlIGVtdWxhdGlvbiB0ZS1tYWNvcy5oLgotCSogbXB3LW1ha2Uuc2VkIChpbnN0YWxsLCBpbnN0YWxsLW9ubHkpOiBFZGl0IGluIE1hYy1zcGVjaWZpYwotCWluc3RhbGwgcHJvY2VkdXJlLgotCi1GcmkgRGVjICAxIDEwOjU5OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJbXByb3ZlIG1lc3NhZ2UgYWJvdXQgdW5zdXBwb3J0ZWQgRUxGIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBDb3JyZWN0IGNoZWNrIGZvciB3aGV0aGVyIGZpbGwKLQlwYXR0ZXJuIGlzIHplcm8uICBGcm9tIE1hbmZyZWQgSG9sbHN0ZWluLgotCi1UaHUgTm92IDMwIDEzOjI1OjQ5IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19wZV9zZWN0aW9uKTogVG8gZ2V0IHRoZSBhbGlnbm1lbnQgcmlnaHQgZm9yCi0JdGhlIHZhcmlvdXMgaWRhdGEgc2VjdGlvbnMsIHdlIGNoZWNrIHRoZSBuYW1lIG9uIHRoZSAuc2VjdGlvbiBwc2V1ZG8uCi0KLVRodSBOb3YgMzAgMTE6MjM6NDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogSWYgVENfTTg4SyBpcyBkZWZpbmVkLCBkbyBub3QKLQlhZGQgc2VjdGlvbidzIHBhZGRyIHRvIGFkZF9udW1iZXI7IGNvbXBhdGliaWxpdHkgdG8gbmF0aXZlIGFzIGFuZAotCWxkIGZvcmJpZHMuCi0KLVdlZCBOb3YgMjkgMjM6MTQ6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVHJlYXQgbTY4ay1zeXN2NCBsaWtlIG02OGstZWxmLCBub3QgbTY4ay1zeXN2My4KLQotCSogaGFzaC5jIChzdHJ1Y3QgaGFzaF9lbnRyeSk6IE1vdmVkIGhlcmUuLi4KLQkqIGhhc2guaCAoc3RydWN0IGhhc2hfZW50cnkpOiAuLi5mcm9tIGhlcmUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IERvbid0IGZyZWUgYW5kIGNsZWFyIHN5X29iagotCWlmIGl0J3MgYWxyZWFkeSBrbm93biB0byBiZSBudWxsLgotCi1XZWQgTm92IDI5IDEzOjAwOjIwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogRG9uJ3QgYWRqdXN0IHRoZSB2YWx1ZSBmb3IgMzIKLQliaXQgcmVsb2NzIGNvbnZlcnRlZCB0byBQQyByZWxhdGl2ZSByZWxvY3MuICBUaGlzIHR1cm5lZCBvdXQgdG8KLQlhZGQgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgLnRleHQgdHdpY2UuCi0KLVR1ZSBOb3YgMjggMTA6NDI6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogSW4gJ3MnIGNhc2UsIGZyZWUgc3RyaW5nIGZyb20KLQlvYnN0YWNrLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBSZW1vdmUgdW51c2VkIGZpZWxkCi0Jc3lfbmFtZV9vZmZzZXQuCi0JKiBjb25maWcvb2JqLW11bHRpLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUykgW09CSl9NQVlCRV9FTEZdOgotCURpdHRvLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogTWFrZSBiaXRmaWVsZHMgdW5zaWduZWQuCi0KLQkqIGV4cHIuaCAoc3RydWN0IGV4cHJlc3Npb25TKTogTWFrZSBYX29wIGFuZCBYX3Vuc2lnbmVkIGJpdGZpZWxkcywKLQlhbmQgbW92ZSB0aGVtIHRvZ2V0aGVyLiAgT24gbW9zdCBzeXN0ZW1zIHRoaXMgd2lsbCByZWR1Y2UgdGhlCi0Jc3RydWN0dXJlIHNpemUgYnkgb25lIHdvcmQuCi0JKG9wZXJhdG9yVCk6IERlZmluZSBPX21heC4KLQkqIGV4cHIuYyAoZXhwcl9iZWdpbik6IFZlcmlmeSB0aGF0IFhfb3AgaXMgd2lkZSBlbm91Z2ggdG8gaG9sZAotCU9fbWF4LgotCi0JKiByZWFkLmMgKHBvcF9pbnNlcnQpOiBQcmludCBlcnJvciByZXR1cm5lZCBieSBoYXNoIHRhYmxlCi0JaW5zZXJ0aW9uIGNvZGUuCi0KLQkqIGFzLmMgKGR1bXBfc3RhdGlzdGljcyk6IFNwbGl0IG91dCBmcm9tIG1haW47IGR1bXAgc29tZSBoYXNoCi0JdGFibGUgc3RhdHMgYW5kIHRhcmdldC1zcGVjaWZpYyBzdGF0cy4KLQkoc3RhcnRfdGltZSk6IE5vIGxvbmdlciBhdXRvbWF0aWMgdG8gbWFpbi4KLQkobWFpbik6IFNldCBmaWxlLWxldmVsIHN0YXJ0X3RpbWUgYW5kIGNhbGwgZHVtcF9zdGF0aXN0aWNzIGF0Ci0JZXhpdC4gIEV4aXQgYnkgY2FsbGluZyB4ZXhpdC4KLQkoc2hvd191c2FnZSk6IE1ha2UgLS1zdGF0aXN0aWNzIGRlc2NyaXB0aW9uIGxlc3Mgc3BlY2lmaWMuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkqIHdyaXRlLmMgKHdyaXRlX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKG5fZml4dXBzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZml4X25ld19pbnRlcm5hbCk6IEluY3JlbWVudCBpdC4KLQkqIHJlYWQuYyAocmVhZF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChyZWFkX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogc3ltYm9sLmMgKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogc3ltYm9sLmggKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIGhhc2guYyAoaGFzaF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogaGFzaC5oIChoYXNoX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWkzODYuaCAoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkodGNfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBtYWNyby4KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsLCBhc19hc3NlcnQsIGFzX2Fib3J0KTogVXNlIHhleGl0LCBub3QKLQlleGl0LgotCi0JKiBoYXNoLmMgKERFTEVURUQpOiBSZXdyaXRlIHRvIHVzZSBhIHZhbGlkIGJ1dCB1bmlxdWUgYWRkcmVzcy4KLQkoU1RBUlRfUE9XRVIpOiBSZWR1Y2UgdG8gMTAuCi0JKGVudW0gc3RhdF9lbnVtKTogTmV3IGVudW1lcmF0b3IsIHJlcGxhY2luZyBTVEFUXyogaW5kZXggbWFjcm9zLgotCUFkZCBuZXcgdmFsdWVzIGZvciBjb3VudGluZyBzdHJjbXAgY2FsbHMuCi0JKEdST1dfRkFDVE9SKTogTmV3IG1hY3JvLgotCShoYXNoX2dyb3cpOiBVc2UgR1JPV19GQUNUT1IuICBSZXdyaXRlIGZvciBxdWljayByZXR1cm5zIGluc3RlYWQKLQlvZiBuZXN0aW5nIGJsb2Nrcy4KLQkoRlVMTF9WQUxVRSk6IE5ldyBtYWNyby4gIFVzZSAxLzQgb2YgdGFibGUgc2l6ZSBpbnN0ZWFkIG9mIDEvMi4KLQkoaGFzaF9uZXcpOiBVc2UgRlVMTF9WQUxVRS4KLQkoc3RydWN0IGhhc2hfY29udHJvbCk6IERlZmluaXRpb24gbW92ZWQgaGVyZS4KLQkoaGFzaF9jb2RlKTogRG9uJ3QgbWFzayB0byBsb3cgYml0cy4KLQkoaGFzaF9hc2spOiBNYXNrIHJldHVybmVkIGhhc2ggY29kZSBoZXJlLiAgQ2hlY2sgaGFzaCB2YWx1ZSBiZWZvcmUKLQljYWxsaW5nIHN0cmNtcDsgY291bnQgc3RyY21wIGNhbGxzLgotCSogaGFzaC5oIChzdHJ1Y3QgaGFzaF9jb250cm9sKTogRGVjbGFyZSwgZG9uJ3QgZGVmaW5lLCBoZXJlLgotCShIQVNIX1NUQVRMRU5HVEgpOiBEZWxldGVkLgotCShzdHJ1Y3QgaGFzaF9lbnRyeSk6IEFkZCBmaWVsZCBmb3IgaGFzaCBjb2RlLgotCShoYXNoX3NheSwgaGFzaF9hcHBseSk6IERvbid0IGRlY2xhcmUuCi0KLQkqIGhhc2guYyAoZGVzdHJveSk6IFJldHVybiB2b2lkLgotCShhcHBsaWNhdGVlKTogRGl0dG8uCi0JKG1haW4pOiBGaXggZGVjbGFyYXRpb25zLgotCShoYXNoX2FwcGx5KTogUmV0dXJuIHZvaWQuICBBcmd1bWVudCBgZnVuY3Rpb24nIHJldHVybnMgdm9pZC4gIFB1dAotCWluc2lkZSAiI2lmZGVmIFRFU1QiLgotCShoYXNoX3NheSk6IERlZmluZSBvbmx5IGlmIFRFU1QgaXMgZGVmaW5lZC4KLQkqIGhhc2guaCAoaGFzaF9hcHBseSwgaGFzaF9zYXkpOiBEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQotTW9uIE5vdiAyNyAxMzoxODoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNy4KLQotVHVlIE5vdiAyMSAxODozOTowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotTW9uIE5vdiAyMCAxNzoyNjowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2RlYnVnX25hbWVfc2VjdGlvbl9zaXplKTogUmVtb3ZlLgotCShwcGNfc3RhYngpOiBEb24ndCBpbmNyZW1lbnQgcHBjX2RlYnVnX25hbWVfc2VjdGlvbl9zaXplLgotCShwcGNfYmMpOiBMaWtld2lzZS4KLQkocHBjX2Zyb2JfZmlsZSk6IFJlbW92ZS4KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZnJvYl9maWxlKTogRG9uJ3QgZGVmaW5lLgotCShwcGNfZnJvYl9maWxlKTogRG9uJ3QgZGVjbGFyZS4KLQotTW9uIE5vdiAyMCAxMzozNzowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF9hbHBoYSk6IE1lbnRpb24gYWxwaGEtb3Bjb2RlLmguCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IEluY2x1ZGUgb25lLW9wZXJhbmQgdmFyaWFudHMgb2Ygam1wIGFuZAotCWpzci4KLQotCSogY29uZmlnL3RlLWRlbHQ4OC5oOiBSZW5hbWVkIGZyb20gdGUtZGVsdGE4OC5oLCB0byBhdm9pZCBjb25mbGljdAotCXdpdGggdGUtZGVsdGEuaCBpbiA4LjMgZmlsZSBzeXN0ZW1zLgotCSogY29uZmlndXJlLmluOiBBZGp1c3RlZC4KLQotVGh1IE5vdiAxNiAxMjo0OTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZXJyKTogUmVtb3ZlOyBqdXN0IHVzZSB0aGUgb25lIGluIHJlYWQuYy4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAoeXlsZXgpOiBJbiBNUkkgbW9kZSwgJ0AnIGNhbiBzdGFydCBhbiBvY3RhbAotCW51bWJlci4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEhhbmRsZSBNUkkgc3VmZml4ZXMgYWZ0ZXIgdW5hZG9ybmVkIDAuCi0KLVRodSBOb3YgMTYgMDA6MjE6NDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlWZXJzaW9uIDIuNiByZWxlYXNlZC4KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byAyLjYuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENoYW5nZSB1c2Ugb2YgbWRfZG9fYWxpZ24KLQl0byBwYXNzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIGZpbGwgdmFsdWUsIHRvIG1hdGNoIG90aGVyIHVzZXMuCi0KLVdlZCBOb3YgMTUgMDM6NTI6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19GSVhfVFlQRSk6IEFkZCBtaXNzaW5nIHNlbWljb2xvbi4KLQotCSogYXMuYyAobWFpbik6IE1vdmUgbWRfZW5kIGNhbGwgdG8ganVzdCBhZnRlciBjYWxsIHRvCi0JcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzLiAgRGVsZXRlIGNwdS1zcGVjaWZpYyBjb2RlIGhlcmUuCi0JKiBjb25maWcvdGMtaTk2MC5oIChtZF9lbmQpOiBOZXcgbWFjcm8sIGNhbGxzIGJydGFiX2VtaXQuCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2VuZCk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2VuZCk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGhlcmUKLQlmcm9tIEhBTkRMRV9BTElHTiBtYWNyby4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEhBTkRMRV9BTElHTik6IENhbGwgaXQuCi0KLQlNb24gSnVsIDMxIDE0OjUzOjE5IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiBjYXN0IGZpbGwgYW5kIDB4OTAgdG8gY2hhcgotIAliZWZvcmUgY29tcGFyaW5nCi0KLQlNb24gTWF5ICAxIDEwOjkxOjQ5IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiAgTWFrZSAiLmFsaWduIG4sMHg5MCIgZ2VuZXJhdGUKLQltdWx0aS1ieXRlIG5vcHMgdG8gYXZvaWQgY2hhbmdpbmcgZ2NjLiAgVGhlIG5lY2Vzc2FyeSBnY2MgY2hhbmdlCi0JbWlnaHQgYnJlYWsgb2xkIGFzc2VtYmxlcnMuCi0KLQlTYXQgQXByIDIyIDIwOjUzOjA1IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24sIEhBTkRMRV9BTElHTik6ICBBZGQgbWFjcm9zIHRvCi0JZ2VuZXJhdGUgb3B0aW1hbCBtdWx0aS1ieXRlIG5vcCBpbnN0cnVjdGlvbnMgZm9yICIuYWxpZ24gbiIKLQkiLmFsaWduIG4sMHg5MCIsIGFuZCBhbGlnbnMgcmVxdWlyaW5nIG1vcmUgdGhhbiAxNSBieXRlcyBvZgotCXBhZGRpbmcgc3RpbGwgZ2VuZXJhdGUgbXVsdGlwbGUgMHg5MCdzIGFzIGJlZm9yZS4KLQotTW9uIE5vdiAxMyAxNzo0MDoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfbXJpX3VudGlsKTogQ2FsbCBwb3BfbXJpX2NvbnRyb2wuCi0KLU1vbiBOb3YgMTMgMjA6Mzk6MDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBwYy0qLW1hY29zKiwgcHBjLSotbXB3Kik6IE5ldyBjb25maWd1cmF0aW9ucy4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCSogbXB3LW1ha2Uuc2VkOiBSZW9yZGVyIGNvbW1hbmRzIHRvIG1ha2Ugc2VkIGhhcHBpZXIuCi0JKiBjb25maWcvdGUtbWFjb3MuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtcHBjLmggKFRBUkdFVF9GT1JNQVQpOiBTZXQgY29ycmVjdGx5IGZvciBQb3dlck1hYy4KLQotU3VuIE5vdiAxMiAyMToxNDo1NiAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogRml4IG9mZi1ieS0yIGJ1ZyBpbiBsZW5ndGggY2hlY2sgZm9yCi0JY29uZGl0aW9uYWwgYnJhbmNoZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCi1UaHUgTm92ICA5IDE2OjE0OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYXBwbHlfZml4KTogV2FybiBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KLQlnZW5lcmF0ZSBhIHJlbG9jIHdoaWNoIHRoZSBsaW5rZXIgd2lsbCBub3QgaGFuZGxlIGNvcnJlY3RseS4gIEZpeAotCW92ZXJmbG93IGNoZWNraW5nLS1SX0lSRUwgaXMgMTggYml0cywgbm90IDE3LgotCi1XZWQgTm92ICA4IDE5OjU5OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBzdWJ0cmFjdCBtZF9wY3JlbF9mcm9tCi0JZnJvbSBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIFRDX0EyOUsuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKGxpbmVfc2VwYXJhdG9yX2NoYXJzKTogUmVzdG9yZSAnQCcuICBFeGlzdGluZwotCWNvZGUgZGVwZW5kcyB1cG9uIGl0LgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9vcGVyYW5kKTogSGFuZGxlICRmbG9hdCwgJGRvdWJsZSwgYW5kCi0JJGV4dGVuZC4gIEJhc2VkIG9uIGNvZGUgZnJvbSBFcmljIEZyZXVkZW50aGFsCi0JPGZyZXVkZW50aGFsQG55dS5lZHU+LgotCSogY29uZmlnL3RjLWEyOWsuaCAoTEVYX0RPTExBUik6IERlZmluZS4KLQkqIHJlYWQuYyAoTEVYX0RPTExBUik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX0RPTExBUi4KLQotV2VkIE5vdiAgOCAxNjozODoxNCAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGEyOWstbnl1LXN5bTEpOiBOZXcgdGFyZ2V0LCBqdXN0IGxpa2Ugb3RoZXIgYTI5awotCXRhcmdldHMuCi0KLVdlZCBOb3YgIDggMTE6Mzg6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19kb3RfZmlsZV9zeW1ib2wpOiBDYXN0IHhtYWxsb2MgcmV0dXJuLgotCi1UdWUgTm92ICA3IDA5OjE0OjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGRlZCBCRkRfUkVMT0NfUlZBLiBDdXJyZW50bHkKLQl1c2VkIG9ubHkgYnkgImRsbHRvb2wuYyIuCi0KLU1vbiBOb3YgIDYgMTg6NTE6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogVW5kZWZpbmUgaW5saW5lIGlmIG5vdCBfX0dOVUNfXy4KLQkobWRfcHNldWRvX3RhYmxlKTogRG9uJ3QgZGVmaW5lICJleHRlcm4iLgotCi1TYXQgTm92ICA0IDAwOjUxOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmllaSk6IEZvcmNlIHN5bWJvbCBpbnRvIHRleHRfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9zaG93X3VzYWdlKTogUHV0IGJhY2tzbGFzaCBhdCBlbmQgb2YgbGluZS4KLQotRnJpIE5vdiAgMyAxMzowMjo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogRG9uJ3Qgd2FybiBhYm91dCA9PSB3aXRoIGEKLQlub25leGlzdGVudCBwYXJhbWV0ZXIsIGluIGNhc2UgaXQgaXMgaW4gYSBjb21tZW50IGZpZWxkLgotCi0JKiBhcy5jIChtYWluKTogT24gVENfQTI5SywgY2FsbCBtYWNyb19pbml0IHdpdGggbWFjcm9fYWx0ZXJuYXRlCi0Jc2V0IHRvIDEuCi0JKiBtYWNyby5jIChnZXRfYW55X3N0cmluZyk6IERvbid0IGtlZXAgcXVvdGVzIGlmIG1hY3JvX3N0cmlwX2F0IGlzCi0Jc2V0LCBldmVuIGlmIG1hY3JvX2FsdGVybmF0ZSBpcyBzZXQuCi0JKGdldF9hcG9zdF90b2tlbik6IElmIG1hY3JvX3N0cmlwX2F0LCBvbmx5IHNraXAga2luZCBpZiBpdCBpcyAnQCcuCi0JKHN1Yl9hY3R1YWwpOiBJZiBtYWNyb19zdHJpcF9hdCwgYW5kIGtpbmQgaXMgJ0AnLCBkb24ndCBsb29rIHVwCi0JdGhlIHRva2VuIHVubGVzcyBpdCBlbmRlZCBpbiAnQCcuCi0JKiBjb25maWcvdGMtYTI5ay5jIChsaW5lX3NlcGFyYXRvcl9jaGFycyk6IFJlbW92ZSAnQCcuCi0JKiBkb2MvYy1hMjlrLnRleGk6IERvY3VtZW50IG1hY3JvIHVzYWdlIG9uIEEyOUsuCi0KLVRodSBOb3YgIDIgMjM6MDc6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSGFuZGxlIG5ldyAnVycgcGxhY2UsIG1lYW5pbmcgYQotCXNpZ25lZCB3b3JkLgotCShpbnN0YWxsX29wZXJhbmQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogQWRkICJleHRlcm4iLgotCi1XZWQgTm92ICAxIDE1OjE3OjAyIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb25maWd1cmUuaW4gKG04OGstbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLWRlbHRhODguaDogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgbWRfZG9fYWxpZ24gaWYgaXQgaXMKLQlkZWZpbmVkLgotCSogY29uZmlnL3RjLW04OGsuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUuCi0JKG1kX2RvX2FsaWduKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW04OGsuYzogSW5jbHVkZSAic3Vic2Vncy5oIi4KLQkobTg4a19kb19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RlLWRlbHRhLmggKFNUUklQX1VOREVSU0NPUkUpOiBEb24ndCBkZWZpbmUuCi0JKENPRkZfTk9MT0FEX1BST0JMRU0pOiBEZWZpbmUuCi0JKExPQ0FMX0xBQkVMU19ET0xMQVIsIExPQ0FMX0xBQkVMU19GQik6IERlZmluZS4KLQotV2VkIE5vdiAgMSAxNjowNzo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBGb3IgYSBqdW1wIGluc3RydWN0aW9uIHdpdGgKLQlub24tY29uc3RhbnQgdGFyZ2V0LCByZXF1aXJlIDcgYXZhaWxhYmxlIGJ5dGVzIGluIHRoZSBjdXJyZW50Ci0JZnJhZywgbm90IDYuCi0KLVR1ZSBPY3QgMzEgMTU6Mzc6MTYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5oOiBJbmNsdWRlIGJmZC9lbGYtYmZkLmggcmF0aGVyIHRoYW4KLQliZmQvbGliZWxmLmguCi0KLVR1ZSBPY3QgMzEgMTY6MzQ6MjggMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLWxpbnV4Kik6IFVzZSBlY29mZi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4pOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoZWNvZmZfc2V0dXBfZXh0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogV2FybiBhYm91dCB3ZWFrIGNvbW1vbiBzeW1ib2xzLgotCSogZWNvZmYuaCAoZWNvZmZfZGlyZWN0aXZlX2V4dGVybik6IERlY2xhcmUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoU19JU19XRUFLKTogTmV3IGZ1bmN0aW9uLgotCSogc3ltYm9scy5oIChTX0lTX1dFQUspOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkICJleHRlcm4iIGFuZAotCSJ3ZWFrZXh0Ii4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogUmVtb3ZlICJleHRlcm4iLgotCShzX2V4dGVybik6IFJlbW92ZS4KLQotVHVlIE9jdCAzMSAxMzoyOTowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2xnbG9ibCk6IERvIHRoZSByaWdodCB0aGluZy4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmIpOiBDYWxsIFNGX1NFVF9QUk9DRVNTLgotCShwcGNfZWIpOiBMaWtld2lzZS4gIFNldCB0aGUgc3RvcmFnZSBjbGFzcyB0byBDX0JMT0NLLCBub3QgQ19GQ04uCi0JKHBwY19mcm9iX3N5bWJvbCk6IERvbid0IGNoYW5nZSBDX0JMT0NLIHN5bWJvbHMgdG8gQ19ISURFWFQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IGNhbGwKLQlTQV9TRVRfU1lNX0VORE5EWCB3aXRoIHRoZSBjdXJyZW50IHN5bWJvbDsgY2FsbCBpdCB3aXRoIHRoZSBuZXh0Ci0Jb25lLiAgSWYgT0JKX1hDT0ZGLCB0cnkgdG8gZmlndXJlIG91dCB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgZ29pbmcKLQl0byBiZSBkcm9wcGVkLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiYmMiIGFuZCAiZWMiLgotCShwcGNfc3RhYl9zeW1ib2wpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcGNfY2hhbmdlX2NzZWN0KTogQ2hlY2sgdGhhdCBwcGNfdG9jX2NzZWN0IGlzIG5vdCBOVUxMLgotCShwcGNfc3RhYngpOiBTZXQgcHBjX3N0YWJfc3ltYm9sIGFyb3VuZCBjYWxsIHRvIHN5bWJvbF9tYWtlLiAgU2V0Ci0Jc3lfdGMucmVhbF9uYW1lIHRvIHRoZSBzdGFiIHN0cmluZy4KLQkocHBjX2JjLCBwcGNfZWMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkocHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSk6IElmIHBwY19zdGFiX3N5bWJvbCBpcyBzZXQsIGRvbid0Ci0JZG8gYW55dGhpbmcuCi0JKHBwY19zeW1ib2xfbmV3X2hvb2spOiBJZiBwcGNfc3RhYl9zeW1ib2wgaXMgc2V0LCBkb24ndCBsb29rIGZvciBhCi0Jc3VmZml4LgotCShwcGNfZnJvYl9zeW1ib2wpOiBTZXQgQlNGX05PVF9BVF9FTkQgZm9yIHN5bWJvbHMgd2l0aCBjc2VjdCBhdXgKLQllbnRyaWVzLgotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wdXNoKTogUmVzZXQgc2JfaW5kZXguCi0KLU1vbiBPY3QgMzAgMTc6NTI6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IERvbid0IGNyZWF0ZSBhIGZyYWcgaW4gdGhlIGFic29sdXRlCi0Jc2VjdGlvbi4KLQotU2F0IE9jdCAyOCAwMTowMjowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJkYXRhIiBhbmQgInRleHQiLgotCShwcGNfY3NlY3QpOiBNb3ZlIG1vc3Qgb2YgdGhlIGNvZGUgdG8gcHBjX2NoYW5nZV9jc2VjdCwgYW5kIGNhbGwKLQlpdC4KLQkocHBjX2NoYW5nZV9jc2VjdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHRha2VuIGZyb20gcHBjX2NzZWN0LgotCShwcGNfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHBwY19zYXdfYWJzKTogTmV3IHN0YXRpYyB2YXJhYmxlLgotCShwcGNfZnJvYl9zeW1ib2wpOiBDcmVhdGUgYXV4IGVudHJ5IGZvciBhYnNvbHV0ZSBzeW1ib2xzLiAgV2FybiBpZgotCWEgc3ltYm9sIGhhcyBubyBjc2VjdC4KLQkocHBjX2FkanVzdF9zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2FkanVzdF9zeW10YWIpOiBEZWZpbmUgaWYgT0JKX1hDT0ZGLgotCShwcGNfYWRqdXN0X3N5bXRhYik6IERlY2xhcmUgaWYgT0JKX1hDT0ZGLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIHRjX2FkanVzdF9zeW10YWIgaXMgZGVmaW5lZCwKLQljYWxsIGl0IGp1c3QgYmVmb3JlIHRoZSBjYWxsIHRvIG9ial9hZGp1c3Rfc3ltdGFiLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9maW5kX29yX21ha2UpOiBDaGFuZ2UgbmFtZSB0byBiZSBjb25zdC4KLQkqIHN5bWJvbHMuaCAoc3ltYm9sX2ZpbmRfb3JfbWFrZSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotVGh1IE9jdCAyNiAxOToxODoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKEFsaWduKTogTWVudGlvbiBTSC4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1EaXJlY3RpdmVzLCAuZXZlbik6IERlc2NyaWJlIGJlaGF2aW9yLCBub3QKLQkuYWxpZ24gdmFsdWUuCi0JKiBkb2MvYy16OGsudGV4aSAoWjgwMDAgRGlyZWN0aXZlcywgZ2xvYmFsKTogRml4IG1pbm9yIHR5cG8uCi0JKFo4MDAwIERpcmVjdGl2ZXMsIGV2ZW4pOiBEb24ndCBnaXZlIG51bWVyaWMgYWxpZ24gdmFsdWUsIGluc3RlYWQKLQlleHBsYWluIGJlaGF2aW9yLgotCi1UaHUgT2N0IDI2IDExOjQ1OjAzIDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogdGMtYXJtLmMgKGRvX2xkc3QpOiBBc3NlbWJsZSBsZHIvc3RyIHIwLCBbcjFdIGFzIGEgcHJlLWluY3JlbWVudAotCWluc3RydWN0aW9uLgotCi1XZWQgT2N0IDI1IDExOjU5OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIEFsc28gbWFrZSBpbmZvLgotCShtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6ICBBbHNvIG1ha2UgY2xlYW4taW5mby4KLQotVHVlIE9jdCAyNCAxNToyMTozMyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBuZXcgIi5uc3Vic3BhIiBvcGNvZGUuCi0JKHBhX3N1YnNwYWNlKTogRm9yICIubnN1YnNwYSIsIGFsd2F5cyBjcmVhdGUgYSBuZXcgc3Vic3BhY2UKLQl3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLCBldmVuIGlmIG9uZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZQotCXNhbWUgbmFtZS4KLQotVHVlIE9jdCAyNCAxNDo1MDozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKTogUmVuYW1lIGZyb20KLQlUQ19GT1JDRV9SRUxPQ0FUSU9OLCB0YWtpbmcgYW4gYWRkaXRpb25hbCBzZWN0aW9uIGFyZ3VtZW50LiAgSWYKLQl0aGUgc2VjdGlvbiBvZiB0aGUgdGFyZ2V0IHN5bWJvbCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQKLQlzZWN0aW9uLCBhbHdheXMgZm9yY2UgdGhlIHJlbG9jYXRpb24gdG8gYmUgdXNlZC4KLQkoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogTmV3IG1hY3JvIHRvIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IFJlbmFtZSBmcm9tIHRoZQotCW1kX3BjcmVsX2Zyb20gZnVuY3Rpb24sIHRha2luZyBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gYXJndW1lbnQuCi0JSW52b2tlIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTiBpbnN0ZWFkIG9mIFRDX0ZPUkNFX1JFTE9DQVRJT04uCi0KLQkqIHdyaXRlLmMgKFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTik6IERlZmluZSBpbiB0ZXJtcyBvZiB0aGUKLQlvbGRlciBUQ19GT1JDRV9SRUxPQ0FUSU9OIGlmIG5vdCBkZWZpbmVkLgotCShNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBJZiBub3QgZGVmaW5lZCwgaW52b2tlIG1kX3BjcmVsX2Zyb20uCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgTURfUENSRUxfRlJPTV9TRUNUSU9OIGluc3RlYWQgb2YKLQltZF9wY3JlbF9mcm9tLCBhbmQgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OIGluc3RlYWQgb2YKLQlUQ19GT1JDRV9SRUxPQ0FUSU9OLgotCQotTW9uIE9jdCAyMyAxNjoyMDowNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaW5wdXQtc2NydWIuYyAoYXNfd2hlcmUpOiBTZXQgbmFtZSB0byBudWxsIHBvaW50ZXIgaWYgd2UgZG9uJ3QKLQloYXZlIGEgZmlsZSBuYW1lLgotCSogbWVzc2FnZXMuYyAoaWRlbnRpZnkpOiBPbmx5IHByaW50IGZpbGVuYW1lIGlmIG5vbi1udWxsLgotCShhc19zaG93X3doZXJlKTogRGl0dG8sIGZvciBsaW5lIG51bWJlciB0b28uCi0JKGFzX3dhcm5faW50ZXJuYWwsIGFzX2JhZF9pbnRlcm5hbCk6IERpdHRvLgotCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IElmIHRoZSBpbnB1dCBmaWxlIGNhbid0IGJlCi0Jb3BlbmVkLCBjb25zaWRlciBpdCBhbiBlcnJvci4KLQotTW9uIE9jdCAyMyAxMToxNTo0NCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQWRkZWQgbWlwc180MTAwIGNvbnRyb2wsIGFuZCBzdXBwb3J0IGZvcgotIAlhY2NlcHRpbmcgdGhlIDQxMDAgYXMgYSBNSVBTIGFyY2hpdGVjdHVyZSB2YXJpYW50IChtZF9iZWdpbiwKLSAJbWFjcm9fYnVpbGQsIG1pcHNfaXAsIG1kX3BhcnNlX29wdGlvbikuIEFkZGluZyBzdWl0YWJsZQotIAljb21tYW5kLWxpbmUgT1BUSU9OcywgYW5kIHVwZGF0aW5nIHRoZSBoZWxwIHRleHQgKG1kX3Nob3dfdXNhZ2UpLgotCQotV2VkIE9jdCAxOCAxMzoyMDozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfYmVnaW4pOiBPbmx5IHNldCBhYnNvbHV0ZV9mcmNoYWluLmZpeF8qIHdoZW4KLQlCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQuCi0KLQkqIFVzZSBvbmUgYWN0aXZlIGZyYWcgYW5kIG9uZSBvYnN0YWNrIHBlciBmcmFnIGNoYWluOgotCSogZnJhZ3MuYyAoZnJhZ3MpOiBWYXJpYWJsZSBkZWxldGVkLgotCShmcmFnX2FsbG9jKTogTmV3IGZ1bmN0aW9uLgotCShmcmFnX2dyb3csIGZyYWdfbW9yZSwgZnJhZ192YXJpYW50LCBmcmFnX25vd19maXgsCi0JZnJhZ19hcHBlbmRfMV9jaGFyKTogUmVmZXIgdG8gZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayBpbnN0ZWFkIG9mCi0JZnJhZ3MgdmFyaWFibGUuCi0JKGZyYWdfbmV3KTogRGl0dG8uICBWZXJpZnkgdGhhdCBmcmNoX2xhc3QgYW5kIGZyYWdfbm93IG1hdGNoIG9uCi0JZW50cnkgYW5kIGV4aXQsIGFuZCB0aGF0IG9sZCBmcmFnX25vdyBoYXMgbm9uLXplcm8gdHlwZS4gIFJlcGxhY2UKLQkia25vdyIgdXNlcyB3aXRoICJhc3NlcnQiLiAgVXNlIGZyYWdfYWxsb2MgaW5zdGVhZCBvZiBtdWNraW5nIHdpdGgKLQlvYnN0YWNrIGFsaWdubWVudC4KLQkqIGZyYWdzLmggKGZyYWdzKTogRGVjbGFyYXRpb24gZGVsZXRlZC4KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IGZyY2hhaW4pOiBBZGQgbmV3IGZpZWxkIGZyY2hfZnJhZ19ub3cuCi0JKiBzdWJzZWdzLmMgKGZyY2hhaW5zLCBkdW1teV9mcmFnLCBhYnNvbHV0ZV9mcmNoYWluKTogTmV3IHN0YXRpYwotCXZhcmlhYmxlcy4KLQkoc3Vic2Vnc19iZWdpbik6IEluaXRpYWxpemUgZnJjaGFpbnMgb2JzdGFjay4gIFVuZGVyIGdjYywgZG9uJ3QKLQlnaXZlIGl0IGFueSBzdHJpY3RlciBhbGlnbm1lbnQgdGhhbiBmcmNoYWluUyBzdHJ1Y3R1cmVzIG5lZWQuICBEbwotCW5vdCBpbml0aWFsaXplIGZyYWdzIG9ic3RhY2suICBTZXQgZnJhZ19ub3cgdG8gcG9pbnQgdG8KLQlkdW1teV9vYnN0YWNrLiAgSW5pdGlhbGl6ZSBhYnNvbHV0ZV9mcmNoYWluLgotCShzdWJzZWdfc2V0X3Jlc3QpOiBTYXZlIGFuZCByZXN0b3JlIGZyYWdfbm93IGluIGZyY2hfZnJhZ19ub3cKLQlmaWVsZCBvZiBmcmNoYWluUy4gIERvbid0IGNyZWF0ZSBuZXcgZnJhZ3Mgb24gc2VjdGlvbiBzd2l0Y2gsIGFuZAotCXVzZSBmcmFnX2FsbG9jIHdoZW4gY3JlYXRpbmcgYSBuZXcgZnJhZyBjaGFpbi4gIEZvciBhYnNvbHV0ZQotCXNlY3Rpb24sIHNldCBmcmNoYWluX25vdyB0byBhYnNvbHV0ZV9mcmNoYWluLiAgVmVyaWZ5IHRoYXQKLQlmcmNoX2xhc3QgYW5kIGZyYWdfbm93IG1hdGNoIG9uIGVudHJ5IGFuZCBleGl0LiAgSW5pdGlhbGl6ZQotCXBlci1jaGFpbiBvYnN0YWNrLCBhbmQgdW5kZXIgZ2NjLCBzZXQgcmVxdWlyZWQgYWxpZ25tZW50IHRvIHRoYXQKLQluZWVkZWQgYnkgZnJhZ1Mgc3RydWN0dXJlLgotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlcl8xKTogVmVyaWZ5IGZyX3R5cGUgaXMgbm9uemVyby4KLQotCSogc3RhYnMuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IE9ubHkgY29weSBpbnB1dCBzdHJpbmcgaWYgYQotCWZyZXNoIGNvcHkgaXMgbmVlZGVkLCBub3QgaWYgdGhlIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMuCi0JKHNfc3RhYl9nZW5lcmljKTogQ2FjaGUgc3RhYiBzZWN0aW9uIG5hbWUgdG8gYnlwYXNzIGxvb2t1cHMsIHNpbmNlCi0JdXN1YWxseSBpdCB3aWxsIG1hdGNoLiAgQ291bGQgYmUgbWFkZSBmYXN0ZXIgc3RpbGwgYnkgY2hhbmdpbmcgdGhlCi0JbWVtb3J5IGFsbG9jYXRpb24gcnVsZXMuCi0JKHNfeHN0YWIpOiBDYWNoZSBzZWN0aW9uIG5hbWUgdG8gYnlwYXNzIHJlcGVhdGVkIHN0cmluZwotCWFsbG9jYXRpb24uCi0KLQkqIGZyYWdzLmMgKGZyYWdfbmV3KTogRGVsZXRlZCByZWdpc3RlciBkZWNsYXJhdGlvbnMuCi0KLQkqIGxpc3RpbmcuYyAoZnJhZ19ub3cpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBhcy5jIChjaHVua3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKGRlYnVnX21lbW9yeSk6IE5ldyB2YXJpYWJsZS4KLQkobWFpbik6IElmIGRlYnVnX21lbW9yeSBpcyBzZXQsIHJlZHVjZSBjaHVua3NpemUgYW5kCi0JX2JmZF9jaHVua3NpemUuCi0JKiBhcy5oIChjaHVua3NpemUpOiBEZWNsYXJlIGl0LgotCSogcmVhZC5jIChyZWFkX2JlZ2luKTogVXNlIGl0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvcnRvcHRzKTogSW5jbHVkZSAnZycuCi0JKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSBpdC4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBNYWtlZmlsZSBhbmQgY29uZmlnLnN0YXR1cyBmcm9tCi0JdGVzdHN1aXRlIGRpcmVjdG9yeS4KLQkoY2xlYW4taGVyZSk6IERvbid0IGRlbGV0ZSB0ZXN0c3VpdGUuICBJbnN0ZWFkLCBkZWxldGUgb25seSB0aGUKLQlmaWxlcyB3aXRoaW4gaXQgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQgYnkgcnVubmluZyB0ZXN0cy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24pOiBDYWxsCi0JZnJhZ19ub3dfZml4IGluc3RlYWQgb2YgYWNjZXNzaW5nIG9ic3RhY2sgaW5mbyBkaXJlY3RseS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoc19sdG9yZyk6IERpdHRvLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IENhbGwgZnJhZ19ncm93IGluc3RlYWQgb2YKLQlvYnN0YWNrX3Jvb20uCi0KLVdlZCBPY3QgMTggMTI6MjI6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKGFvdXRfcHJvY2Vzc19zdGFiKTogSW5zZXJ0IGRlYnVnIHN5bWJvbCBpbnRvIHN5bWJvbAotCWNoYWluIGFmdGVyIHBhcnNpbmcgdmFsdWUgZXhwcmVzc2lvbiwgaWYgYW55LCB0byBhdm9pZCBzZXBhcmF0aW5nCi0JY29udGludWVkIC5zdGFicyBsaW5lcy4KLQotTW9uIE9jdCAxNiAxMDo1Njo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWxmX3BzZXVkb190YWJsZSk6IFJlbW92ZS4KLQkobWlwc19wb3BfaW5zZXJ0KTogRG9uJ3QgY2FsbCBwb3BfaW5zZXJ0IG9uIG1pcHNfZWxmX3BzZXVkb190YWJsZS4KLQotTW9uIE9jdCAxNiAwNzowNzozNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogVXNlIG5ldyBmbGFncyBQUENfT1BDT0RFX0NPTU1PTiBmb3IKLQktbWNvbSBzdXBwb3J0IGFuZCBQUENfT1BDT0RFX0FOWSBmb3IgLW1hbnkuCi0JKG1kX3BhcnNlX29wdGlvbik6IERpdHRvLgotCShwcGNfYXJjaCk6IERpdHRvLgotCShtZF9iZWdpbik6IEZvciBkdXBsaWNhdGUgaW5zdHJ1Y3Rpb25zLCBwcmludCBhbGwgZHVwbGljYXRlcwotCWJlZm9yZSBhYm9ydGluZy4KLQotU3VuIE9jdCAxNSAyMjowNjoxNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBTdXBwb3J0IGZvciAtbWNvbSB0byB0dXJuIG9uCi0JY29tbW9uIG1vZGUgb3BlcmF0aW9uLgotCShtZF9zaG93X3VzYWdlKTogQWRkIC1tY29tIHRvIHVzYWdlIG1lc3NhZ2UuCi0KLUZyaSBPY3QgMTMgMTM6MzI6NDUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcF9yYW5rKTogQWRkIE9fc3ltYm9sX3J2YS4KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogQWRkIE9fc3ltYm9sX3J2YS4KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBTZXQgT19zeW1ib2xfcnZhIHdoZW4gbmVjZXNzYXJ5LgotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBVbmRlcnN0YW5kIE9fc3ltYm9sX3J2YS4KLQotVHVlIE9jdCAxMCAxMTozNDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IENvcnJlY3Qgc19jb25zIGFyZ3VtZW50cy4gIEZyb20gTWljaGFlbAotCUpvb3N0ZW4gPGpvb3N0QG9yaS5jYWRsYWIuZGU+LgotCi1Nb24gT2N0ICA5IDE5OjU5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfbWFjcm8pOiBNYWtlIGNvdW50IHVuc2lnbmVkLgotCShwcGNfYmllaSk6IFNldCBzZWdtZW50IHRvIG5vd19zZWcgYW5kIHZhbHVlIHRvIGNvZmZfbl9saW5lX25vcy4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogSGFuZGxlIENfQklOQ0wgYW5kIENfRUlOQ0wgc3ltYm9scyBieSBzZXR0aW5nCi0JdGhlIGZpeF9saW5lIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfbl9saW5lX25vcyk6IFJlbmFtZSBmcm9tIG5fbGluZV9ub3MsIGFuZAotCW1ha2Ugbm9uLXN0YXRpYy4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9uX2xpbmVfbm9zKTogRGVjbGFyZS4KLQotRnJpIE9jdCAgNiAxNjoyNDoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQVJHX1dJVEgoYmZkLWFzc2VtYmxlcikpOiBGaXggaGVscCBtZXNzYWdlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IENvbnZlcnQgc3BlY2lmaWVkIGJ5dGUKLQlhbGlnbm1lbnQgdG8gcG93ZXIgb2YgdHdvLiAgU2V0IHNpemUgb2YgbG9jYWwgYnNzIHN5bWJvbC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAodGNfZ2VuX3JlbG9jKTogRml4IHR5cG8gaW4gdmFyaWFibGUgbmFtZS4KLQotRnJpIE9jdCAgNiAxNToyMjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNiLmMsIG1hY3JvLmM6IERlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgPHN0cmluZy5oPiBvcgotCTxzdHJpbmdzLmg+IGp1c3QgYXMgYXMuaCBkb2VzLgotCi1GcmkgT2N0ICA2IDA5OjU1OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzaXRlLmV4cCk6IEZpeCBzZXR0aW5nIG9mICRzcmNkaXIuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXRvZik6IEZpeCBsaXR0bGUtZW5kaWFuIG91dHB1dC4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoQVJNX0JJX0VORElBTik6IE1vdmUgZGVmaW5pdGlvbiBzbyBkZWZpbmVkIGZvcgotCWFsbCBjb2ZmIHRhcmdldHMuCi0KLVRodSBPY3QgIDUgMjA6MTc6MzAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBTcGxpdCBvdXQgdGhlIE5TMzJrIGZhbWlseSBkb2N1bWVudGF0aW9uLAotCWRlc3BpdGUgaXRzIGJlaW5nIGNvbW1lbnRlZCBvdXQgZm9yIG5vdy4KLQkqIGRvYy9jLW5zMzJrLnRleGk6IE5ldyBmaWxlLgotCi0JKiBzYi5jLCBtYWNyby5jOiBJbmNsdWRlIHN0cmluZy5oLgotCi0JKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IE9ubHkgY2hlY2sgKi5vOyB3ZSBkb24ndCBjYXJlIGlmCi0JdGltZXN0YW1wcyBpbnNlcnRlZCBieSB0aGUgbmF0aXZlIGxpbmtlciBkaWZmZXIuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9hbGlnbik6IE9ubHkgZmlsbCB3aXRoIGEgbm8tb3AgcGF0dGVybgotCWlmIGFsaWdubWVudCBzdHJpY3RlciB0aGFuIDQgYnl0ZXMgaXMgcmVxdWVzdGVkOyBpbiB0aGF0IGNhc2UsCi0JYWxpZ24gdG8gYSA0LWJ5dGUgYm91bmRhcnkgZmlyc3QuCi0KLQlUaHUgU2VwIDI4IDE5OjM1OjI3IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfUlNZTV9QYXJzZSk6IGVsaW1pbmF0ZSAibWlnaHQgYmUgdXNlZAotCXVuaW5pdGlhbGl6ZWQiIHdhcm5pbmcgZm9yIGBNYXhfU291cmNlX09mZnNldCcuCi0KLVdlZCBPY3QgIDQgMTY6MTc6MDIgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocGFyc2VfdG9jX2VudHJ5KTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIFt0b2NdCi0JcXVhbGlmaWVycyBhbmQgZGV0ZWN0IGVycm9ycyBpZiBwcmVzZW50LgotCShtZF9hc3NlbWJsZSk6IEFkZCBjYWxsIHRvIHBhcnNlX3RvY19lbnRyeS4gQWxzbyBhZGRlZCBzb21lIHN1cHBvcnQKLQlmb3IgdGhlIFt0b2N2XSBxdWFsaWZpZXIuCi0JKHBwY19wZV90b2NkKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQgZGF0YSBpbiB0aGUgdG9jIHNlY3Rpb24uCi0KLVdlZCBPY3QgIDQgMTQ6MDM6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mcm9iX3N5bWJvbCk6IERvbid0IGNyZWF0ZSBhbiBhdXggZW50cnkgZm9yCi0JYW4gYWJzb2x1dGUgc3ltYm9sLgotCi1UdWUgT2N0ICAzIDEyOjE4OjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaXN3b3JkKTogQWNjZXB0IGFsbCB2YWx1ZXMgZnJvbSAtNjU1MzYgdG8KLQkrNjU1MzUsCXNvIH5WQUwgd2lsbCBub3QgYmUgcmVqZWN0ZWQuCi0KLQkqIGNvbmQuYyAoc19lbmRpZik6IENhbGwgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4gIEluIE1SSSBtb2RlLAotCXNraXAgY2hhcmFjdGVycyBhZnRlciB0aGUgcHNldWRvLW9wLgotCShzX2Vsc2UpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBEb24ndCBsb29rIHBhc3QgYnVmZmVyX2xpbWl0LgotCShzX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgc2tpcCBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBmaWxlIG5hbWUuCi0KLU1vbiBPY3QgIDIgMTY6MTU6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtNjhrX3JlZ19wYXJzZSk6IEluIE1SSSBtb2RlLCBwZXJtaXQKLQlwZXJpb2RzIGluIHJlZ2lzdGVyIG5hbWVzLgotCi1TYXQgU2VwIDMwIDIzOjAzOjMxIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IERQIHJlbGF0aXZlIHJlbG9jcwotCWFyZSBub3QgYWRqdXN0YWJsZSBpbiBTT00gdG8gYXZvaWQgY29uZnVzaW5nIHRoZSBvcHRpbWl6aW5nCi0JbGlua2VyLgotCi1GcmkgU2VwIDI5IDE1OjE4OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBzb21lIHN1cHBvcnQgZm9yIGk5NjAgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBlbmRpYW4uCi0JKGdldF9hcmdzKTogRG9uJ3QgZGlzY2FyZCBhIHNwYWNlIGJldHdlZW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuCi0JKGdldF9jZGlzcCk6IENoYW5nZSB0ZXh0X3NlY3Rpb24gdG8gbm93X3NlZy4KLQkoc19lbmRpYW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWk5NjAuaCAoTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVCk6IERlZmluZS4KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogQWRkIE9fbG9naWNhbF9ub3QsIE9fbG9naWNhbF9hbmQsIGFuZAotCU9fbG9naWNhbF9vci4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFRyZWF0ICchJyBhcyBsb2dpY2FsIG5vdCBvcGVyYXRvci4gIElmCi0JVENfSTk2MCwgaW4gTVJJIG1vZGUgcGVybWl0IGBzaXplb2Ygc2VjbmFtZScgYW5kIGBzdGFydG9mCi0Jc2VjbmFtZScuCi0JKG9wX3JhbmspOiBCdW1wIHZhbHVlcyBieSAyIHRvIG1ha2Ugcm9vbSBmb3IgJiYgYW5kIHx8LiAgQWRkCi0JZW50cmllcyBmb3IgISwgJiYsIGFuZCB8fC4KLQkoZXhwcl9iZWdpbik6IE9ubHkgZG8gTVJJIGNoYW5nZXMgaWYgVENfTTY4Sy4KLQkob3BlcmF0b3IpOiBSZWNvZ25pemUgfHwgYW5kICYmLgotCShleHByKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBuZXcgb3BlcmF0b3JUIHZhbHVlcy4KLQkocHJpbnRfZXhwcl8xKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgZGVidWcsIGVyciwgaXJlcCwgaXJlcGMsIHByaW50LCBwdXJnZW0sCi0JYW5kIHJlcC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIE1SSV9NT0RFX05FRURTX1BTRVVET19ET1QuCi0JKG1yaV9jb21tZW50X2ZpZWxkKTogT25seSBoYW5kbGUgd2VpcmQgY29tbWVudHMgaWYgVENfTTY4Sy4KLQkoc19lcnIpOiBOZXcgZnVuY3Rpb24uCi0JKHNfb3JnKTogT25seSBwdW50IGluIE1SSSBtb2RlIGlmIFRDX002OEsuCi0JKHNfbXJpX3NlY3QpOiBXcml0ZSBUQ19JOTYwIHZlcnNpb24uCi0JKHNfcHJpbnQsIHNfcHVyZ2VtKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHJlYWQuaCAoc19lcnIsIHNfcHJpbnQsIHNfcHVyZ2VtKTogRGVjbGFyZS4KLQkqIGNvbmQuYyAoc19pZmVxcyk6IEltcGxlbWVudC4KLQkoaWdub3JlX2lucHV0KTogSGFuZGxlIE1SSV9NT0RFX05FRURTX1BTRVVET19ET1QuCi0JKiBtYWNyby5jIChtYWNyb19zdHJpcF9hdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1hY3JvX2luaXQpOiBBZGQgc3RyaXBfYXQgcGFyYW1ldGVyLgotCShkb19mb3JtYWxzKTogSWYgbWFjcm9fc3RyaXBfYXQsIGNoYW5nZSBOQVJHIHRvICROQVJHLgotCShkZWZpbmVfbWFjcm8pOiBTa2lwIGEgY29tbWEgYWZ0ZXIgdGhlIG1hY3JvIG5hbWUuCi0JKGdldF9hcG9zdF90b2tlbik6IFNraXAgY2hhcmFjdGVyIGlmIG1hY3JvX3N0cmlwX2F0LCBldmVuIGlmCi0JbWFjcm9fbXJpLgotCShtYWNyb19leHBhbmRfYm9keSk6IElmIG1hY3JvX3N0cmlwX2F0LCBkb24ndCByZWNvZ25pemUgcGFyYW1ldGVycwotCWluIHN0cmluZ3MgdW5sZXNzIHRoZXkgYXJlIHByZWNlZGVkIGJ5IGFuICdAJy4gIElmIG1hY3JvX3N0cmlwX2F0LAotCXBhc3MgJ0AnIGFzIHN0cmlwIGNoYXJhY3RlciB0byBzdWJfYWN0dWFsLiAgSWYgbWFjcm9fc3RyaXBfYXQsCi0Jc3RyaXAgJ0AnIGNoYXJhY3RlcnMuCi0JKG1hY3JvX2V4cGFuZCk6IElmIG1hY3JvX3N0cmlwX2F0LCBjaGFuZ2UgTkFSRyB0byAkTkFSRy4KLQkoZGVsZXRlX21hY3JvKTogTmV3IGZ1bmN0aW9uLgotCShleHBhbmRfaXJwKTogU2tpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyAnIicgY2hhcmFjdGVycyBpZiBpcnBjLgotCSogbWFjcm8uaCAobWFjcm9faW5pdCk6IE1lbnRpb24gbmV3IHN0cmlwX2F0IHBhcmFtZXRlci4KLQkoZGVsZXRlX21hY3JvKTogRGVjbGFyZS4KLQkqIGFzLmMgKG1haW4pOiBJZiBUQ19JOTYwLCBwYXNzIGZsYWdfbXJpIHRvIG1hY3JvX2luaXQgYXMKLQlzdHJpcF9hdDsgb3RoZXJ3aXNlLCBwYXNzIDAuCi0JKiBnYXNwLmMgKHByb2Nlc3NfcHNldWRvX29wKTogUGFzcyAwIHRvIG1hY3JvX2luaXQgYXMgc3RyaXBfYXQuCi0JKG1haW4pOiBMaWtld2lzZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBpOTYwIE1SSSBtb2RlLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiAtLWRlZnN5bS4KLQotVGh1IFNlcCAyOCAxOToyNTowNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFRyYW5zbGF0ZSAicG93ZXJwYyIgaW50byAicHBjIiwgcmVtb3ZlIGdlbiBvZgotCVZFUlNJT04sIG1vdmUgZ2VuIG9mICJjb25mIiBoZXJlIGZyb20gbWFrZWZpbGUuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlIFVuaXggbWFrZWZpbGUKLQlpbnRvIE1QVyBzeW50YXguCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbWFjLWFzLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2UgZmlsZS4KLQkqIGFzLmggKGlubGluZSk6IERvbid0IGRlY2lkZSBhYm91dCBkZWZpbmluZyBpZiBfX01XRVJLU19fLAotCXJlbW92ZSByZWR1bmRhbnQgY29uZGl0aW9uYWwgYW5kIGRlZmluaXRpb24uCi0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogRml4IHN5bnRheCBmb3IgT0JKX1BST0NFU1NfU1RBQi4KLQotVGh1IFNlcCAyOCAxNTo0MzoxNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW1vdmVkIHNvbWUgVEVfUEUgc3BlY2lmaWMgCi0JbWFuaXB1bGF0aW9ucywgc2luY2UgSSBjYW4ndCBwcm92ZSB0aGV5J3JlIG5lZWRlZC4KLQkobWRfYmVnaW4pOiBSZW1vdmVkIGluaXRfcmVndGFibGUsIGluc2VydF9yZWcsIGFuZCB0aGUgY2FsbCBwb2ludHMuCi0JKHJlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb24uIFBhcnNlcyBhIHJlZ2lzdGVyIG5hbWUsIGlmIGFwcHJvcHJpYXRlLgotCShtZF9hc3NlbWJsZSk6IEFkZGVkIGNhbGwgdG8gcmVnaXN0ZXJfbmFtZSB0byBoYW5kbGUgc3ltYm9saWMgbmFtZXMuCi0JKHBwY19wZV9zZWN0aW9uKTogUmVtb3ZlZCBhbGwgZHVwbGljYXRlIElNQUdFIGRlZmluZXMsIGFuZCBpbmNsdWRlCi0JY29mZi9wZS5oIGluc3RlYWQuCi0KLVRodSBTZXAgMjggMTI6MDk6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lLgotCShwcGNfcGVfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcGVfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBTZXAgMjggMDE6MTE6NTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgZm9yIGFybS1jb2ZmLgotCi1XZWQgU2VwIDI3IDEyOjUzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX0lTX0xPQ0FMKTogQWxsIHN5bWJvbHMgaW4gcmVnX3NlY3Rpb24gYXJlIGxvY2FsLgotCi0JKiBjb25maWcvdGMtcHBjLmggKE9CSl9YQ09GRik6IERlZmluZSBpZiBPQkpfQ09GRiBhbmQgbm90IFRFX1BFLgotCUNoYW5nZSBPQkpfQ09GRiBjaGVja3MgdG8gY2hlY2sgT0JKX1hDT0ZGIGluc3RlYWQuCi0JKFRBUkdFVF9GT1JNQVQpOiBGdWxseSBwYXJlbnRoZXNpemUuCi0JKExFWF9RTSk6IERlZmluZSBpZiBURV9QRS4KLQkqIGNvbmZpZy90Yy1wcGMuYzogUmVwbGFjZSBPQkpfQ09GRiBieSBPQkpfWENPRkYgdGhyb3VnaG91dC4KLQlSZW1vdmUgY2hlY2tzIG9mIFRFX1BFIHdpdGhpbiAjaWZkZWYgT0JKX1hDT0ZGIHNlY3Rpb25zLgotCShpbml0X3JlZ3RhYmxlKTogTWFrZSBpIHVuc2lnbmVkLgotCShwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbik6IFJlbmFtZSBmcm9tIHNldEN1cnJlbnRTZWN0aW9uLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuCi0JKHBwY19hcmNoKTogUmV0dXJuIGFmdGVyIGFzX2ZhdGFsIHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShtZF9hc3NlbWJsZSk6IE9ubHkgZGVjbGFyZSByZWxvYyBpZiBPQkpfRUxGLiAgQWRkIGRlZmF1bHQgdG8KLQlzd2l0Y2ggb24gZml4dXBzW2ldLnJlbG9jIHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShJTUFHRV9TR05fTE5LX09USEVSKTogRml4IG5lc3RlZCBjb21tZW50LgotCShwcGNfcGVfZnVuY3Rpb24pOiBEb24ndCBjYWxsIHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUuCi0JKHBwY19mcm9iX3N5bWJvbCk6IFJlbW92ZSBURV9QRSBzZWN0aW9uIGNoZWNrcy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBSZXR1cm4gYWZ0ZXIgYWJvcnQgdG8gYXZvaWQgZ2NjCi0Jd2FybmluZy4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBCRkRfUkVMT0NfMTZfR09UX1BDUkVMIHRvIHN3aXRjaC4KLQkqIHJlYWQuYyAoTEVYX1FNKTogRGVmaW5lIGFzIDAgaWYgbm90IGRlZmluZWQuCi0JKGxleF90eXBlKTogVXNlIExFWF9RTSBmb3IgJz8nLgotCi0JKiBjb25maWd1cmUuaW46IE5vIG5lZWQgdG8gY2hlY2sgd2hldGhlciAke2NwdV90eXBlfSBpcyBwb3dlcnBjOwotCWl0IG5ldmVyIHdpbGwgYmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMjcgMTE6MzM6MzggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW1vdmUgU2VwIDI2IGNoYW5nZXMgdG8gdGhpcwotCWZ1bmN0aW9uLCBrZWVwaW5nIG90aGVyIFNlcC4gMjYgY2hhbmdlcy4KLQotV2VkIFNlcCAyNyAxMDoyOToxMyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGRlZCBzdXBwb3J0IGZvciBwcGNsZS0qLVtwZXx3aW5udF0KLQkodGFyZ2V0X2ZyYWcpOiBSZW1vdmVkIGFuIGV4dHJhbmVvdXMgUFBDIGRlZmluaXRpb24uCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBTYW1lCi0JKiBjb25maWcvdGMtcHBjLmg6Ci0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEJhc2Ugc3VwcG9ydCBmb3IgbmV3IG9yIGFsdGVyZWQKLQlwc2V1ZG8gb3BzIC0gPHByZXZpb3VzLCBwZGF0YSwgeWRhdGEsIHJlbGRhdGEsIHJkYXRhLCB1YWxvbmcsIHpub3AsCi0Jc2VjdGlvbiwgY29tbSwgZnVuY3Rpb24+IFRoZXJlIHdpbGwgYmUgbW9yZS4KLQkocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogUHJlZGVmaW5lZCByZWcgdGFibGUgdG8gbmFtZSByZWdpc3RlcnMsIGV0YwotCShtZF9iZWdpbik6IFNldHVwIHJlZyB0YWJsZSBpbml0aWFsaXphdGlvbgotCShtZF9hc3NlbWJsZSk6IEluaXRpYWwgW3RvY114KHJ0b2MpIHN1cHBvcnQKLQkocHBjX2Zyb2JfbGFiZWwpOiBSZW1vdmVkIHNvbWUgeGNvZmYgc3BlY2lmaWMgcHJvY2Vzc2luZyBmcm9tIFRFX1BFCi0JKHBwY19mcm9iX3N5bWJvbCk6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIG1vcmUgcHJlZGVmaW5lZCBzZWN0aW9ucwotICAgICAgICAocHBjX2Zyb2Jfc2VjdGlvbik6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKLQkocHBjX2ZpeF9hZGp1c3RhYmxlKTogUmVtb3ZlZCBmcm9tIFRFX1BFIG1haW5saW5lCi0JKG1kX2FwcGx5X2ZpeDMpOiBGb3IgVEVfUEUgdG9jIGVudHJpZXMsIHdlIGRvbid0IG5lZWQgdG8gbWVzcyAKLSAgICAgICAgd2l0aCBmeF9hZGRudW1iZXIuIFJlbW92ZWQgZm9yIHRoZSB0aW1lIGJlaW5nLgotCShsb3RzKTogUHV0IGJhY2sgbWlzc2luZyBhc3NpZ25tZW50cyB0byBwcGNfY3VycmVudF9jc2VjdC4KLQotVHVlIFNlcCAyNiAxNDo1Nzo1OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBTdXBwb3J0IGFsbCBvZiB0aGUgVi40Ci0JcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfY29ucyk6IFJlbW92ZSByZXN0cmljdGlvbiB0aGF0IEAgc3VmZml4ZXMgbXVzdCBiZSBkb25lCi0Jd2l0aCAubG9uZy4gIEFkZCBlcnJvciBpZiByZWxvY2F0aW9uIGRvZXMgbm90IGZpdCBpbiB0aGUgbnVtYmVyIG9mCi0JYnl0ZXMgcHJvdmlkZWQuCi0JKG1kX2Fzc2VtYmxlKTogRm9yIGFic29sdXRlIGJyYW5jaGVzLCBtYXAgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMKLQliYWNrIGludG8gYW4gZXF1aXZhbGVudCBhYnNvbHV0ZSByZWxvY2F0aW9uLgotCShtZF9wY3JlbF9mcm9tKTogSWYgVENfRk9SQ0VfUkVMT0NBVElPTiBpcyB0cnVlLCByZWxvY2F0aW9uIG9mZnNldAotCWlzIDAsIG5vdCBzZWdtZW50IHN0YXJ0LgotCShtZF9hcHBseV9maXgzKTogRG9uJ3QgYm90aGVyIHdyaXRpbmcgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uLAotCXNpbmNlIGl0IGlzIGlnbm9yZWQsIGdpdmVuIHRoYXQgd2UgdXNlIFJFTEEgcmVsb2NhdGlvbnMgZm9yIEVMRi4KLQotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lIHRvIGZvcmNlIGFsbAotCWJyYW5jaCBwcmVkaWN0aW9uIHJlbG9jYXRpb25zIHRvIGFsd2F5cyBiZSBlbWl0dGVkLgotCi1Nb24gU2VwIDI1IDE2OjA4OjQzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IExvd2VyIGNhc2UgcmVsb2MgYmVmb3JlCi0JdGVzdGluZy4KLQkobWRfYXNzZW1ibGUpOiBCZSBtb3JlIHJvYnVzdCBpbiB0ZXJtcyBvZiByZWxvY2F0aW9ucy4KLQkobWRfYXBwbHlfZml4Myk6IEFsbG93IDE0IGJpdCByZWxvY3MgdG8gYmUgZW1pdHRlZCBmb3IgZXh0ZXJuYWwKLQlzeW1ib2xzIGluIGFkZGl0aW9uIHRvIDI2IGJpdCByZWxvY3MuICBQcm9wZXJseSBpbnNlcnQgMjYvMTQgYml0Ci0JcmVsb2MgdmFsdWUgZmllbGRzIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4JCi0KLU1vbiBTZXAgMjUgMDA6MjM6MTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2F0b2YpOiBPdXRwdXQgbGl0dGxlIGVuZGlhbiBjb25zdGFudHMgaW4KLQlsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogUGFzcyAmdHlwZSwgbm90IHR5cGUsCi0Jc19tcmlfc2VjdC4KLQotCSogY29uZmlndXJlLmluOiBGaXggdHlwbzogZm10LWVsZiB0byBmbXQ9ZWxmLgotCi1GcmkgU2VwIDIyIDE2OjM0OjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFJld3JpdGUgdG8gdXNlIGEgdGFibGUgb2YKLQlzdHJpbmdzIGFuZCByZWxvY2F0aW9ucyB0aGV5IHJlcHJlc2VudC4gIEFkZCBAYnJ7LG59dGFrZW4gZm9yCi0JYnJhbmNoIHRha2VuL25vdCB0YWtlbiBzdXBwb3J0LgotCShtZF9hcHBseV9maXgzKTogQWRkIEJGRF9SRUxPQ19QUENfQjE2X0JSeyxOfVRBS0VOIHN1cHBvcnQuCi0KLVRodSBTZXAgMjEgMjE6MTA6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogLW1yZWxvY2F0YWJsZS1saWIgbm93IG9ubHkKLQlzZXRzIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgYW5kIG5vdCBhbHNvIEVGX1BQQ19SRUxPQ0FUQUJMRS4KLQotVGh1IFNlcCAyMSAxNjozMDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldCk6IFBlcm1pdCBTRUdfQUJTT0xVVEUgaW4ga25vdyBleHByZXNzaW9uLgotCSogZXhwci5jIChleHByKTogQWNjb3VudCBmb3IgbmV3IG9wZXJhdG9yVCB2YWx1ZXMgaW4ga25vdwotCWV4cHJlc3Npb24uCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDbGVhciBmaXhwLT5meF9zdWJzeSBpZiB0aGUgcmVsb2NhdGlvbgotCWlzIGZ1bGx5IHJlc29sdmVkLgotCi1UaHUgU2VwIDIxIDE0OjExOjQ5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mbGFncyk6IE5ldyB2YXJpYWJsZSB0byBob2xkIHRoZSBmbGFnIGJpdHMKLQl0byBzZXQgaW4gdGhlIEVMRiBoZWFkZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXJlbG9jYXRhYmxlLWxpYi4gIE1ha2UgYm90aAotCS1tcmVsb2NhdGFibGUgYW5kIC1tcmVsb2NhdGFibGUtbGliIHNldCBwcGNfZmxhZ3MuCi0JKG1kX2JlZ2luKTogU2V0IEVMRiBmbGFncyB3aXRoIHBwY19mbGFncy4KLQotV2VkIFNlcCAyMCAxMzowMTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uICBBZGQgR05VIHN0YW5kYXJkIG1haW50YWluZXItY2xlYW4gZWNob3MuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4KLQotVHVlIFNlcCAxOSAxMTozMTozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgaW1tZWRpYXRlIG9wZXJhbmRzIGZvciAnJScuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgaW1tZWRpYXRlIG9wZXJhbmRzIGZvciAnfCcuCi0JUmVwbGFjZSAnUCcgd2l0aCAnMCcsICcxJywgYW5kICcyJy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAocGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IENoYW5nZSBsZWZ0c3RvcAotCWFuZCByaWdodHN0b3AgdG8gbm90IGJlIGNvbnN0LgotCShwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBMaWtld2lzZS4gIFVzZSBtNjhrX2lwX29wIHRvIGV4YW1pbmUKLQl0aGUgb3BlcmFuZCwgbm90IG02OGtfcmVnX3BhcnNlLgotCShzX21yaV9pZik6IEluIE1SSSBtb2RlLCBzdG9wIGF0IHRoZSBmaXJzdCAnKicuCi0JKHNfbXJpX3doaWxlKTogTGlrZXdpc2UuCi0JKHNfbXJpX2Vsc2UpOiBJbiBNUkkgbW9kZSwgaWdub3JlIHRyYWlsaW5nIGNoYXJhY3RlcnMuCi0JKHNfbXJpX2VuZGksIHNfbXJpX2JyZWFrLCBzX21yaV9uZXh0LCBzX21yaV9mb3IpOiBMaWtld2lzZS4KLQkoc19tcmlfZW5kZiwgc19tcmlfcmVwZWF0LCBzX21yaV91bnRpbCwgc19tcmlfZW5kdyk6IExpa2V3aXNlLgotCSogY29uZmlnL202OGstcGFyc2UueTogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmg6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0KLU1vbiBTZXAgMTggMTU6MjI6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2hhbmdlIGxlZnRzdGFydAotCWFuZCByaWdodHN0YXJ0IHRvIG5vdCBiZSBjb25zdC4KLQkocGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogTGlrZXdpc2UuICBJZiB0aGUgbGVmdCBzaWRlIG9mIHRoZQotCWNvbXBhcmlzb24gaXMgYSByZWdpc3RlciwgYW5kIHRoZSByaWdodCBzaWRlIGlzIG5vdCwgc3dhcCB0aGUgdHdvCi0Jc2lkZXMuCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtNjhrX3JlZ19wYXJzZSk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKG02OGtfcmVnX3BhcnNlKTogRGVjbGFyZS4KLQotCSogcmVhZC5jIChtcmlfY29tbWVudF9maWVsZCk6IE5ldyBmdW5jdGlvbi4KLQkobXJpX2NvbW1lbnRfZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzX2FsaWduX2J5dGVzKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkLgotCShzX2FsaWduX3B0d28sIHNfY29tbSwgc19tcmlfY29tbW9uLCBzX2ZhaWwsIHNfZ2xvYmwpOiBMaWtld2lzZS4KLQkoc19mbG9hdF9zcGFjZSwgc19zdHJ1Y3QpOiBMaWtld2lzZS4KLQkoc19zcGFjZSk6IFVzZSBtcmlfY29tbWVudF9maWVsZCByYXRoZXIgdGhhbiBkb2luZyBpdCBieSBoYW5kLgotCShjb25zX3dvcmtlciwgZXF1YWxzKTogTGlrZXdpc2UuCi0JKHNfZW5kKTogSWdub3JlIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggJyonIG9yICchJy4KLQkqIHJlYWQuaCAobXJpX2NvbW1lbnRfZmllbGQpOiBEZWNsYXJlLgotCShtcmlfY29tbWVudF9lbmQpOiBEZWNsYXJlLgotCSogY29uZC5jIChzX2lmKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkLgotCSogY29uZmlnL3RjLW02OGsuYyAoc19jaGlwLCBzX3JlZyk6IExpa2V3aXNlLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSGFuZGxlIEFCUy1zeW0gaW4gLXN5bSBjYXNlIHJhdGhlciB0aGFuCi0Jc3ltLXN5bSBjYXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4gIFBlcm1pdCBuZWdhdGl2ZQotCXN5bWJvbHMgaWYgVENfTTY4Sy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogSWYgZnhfdGNiaXQgaXMgc2V0LCByZXR1cm4KLQlSX1JFTExPTkdfTkVHLgotCSh0Y19nZW5fcmVsb2MpOiBJZiBmeF90Y2JpdCBpcyBzZXQsIGFib3J0LgotCShtZF9hcHBseV9maXhfMik6IEZvciBhIG5lZ2F0aXZlIHJlbG9jLCBtb3ZlIGZ4X3N1YnN5IHRvIGZ4X2FkZHN5LAotCWFuZCBzZXQgZnhfdGNiaXQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfcmVnKTogSWdub3JlIGNvbW1lbnQgZmllbGQgaW4gTVJJIG1vZGUuCi0KLU1vbiBTZXAgMTggMTQ6NDQ6MDQgMTk5NSAgQXJuZSBILiBKdXVsICA8YXJuZWpAcHZ2LnVuaXQubm8+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVN1biBTZXAgMTcgMjI6MTc6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbmRpYW4gdG8gbGl0dGxlIGZvciBtaXBzLSotdWx0cml4Ki4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIFNlcCAxNSAxMzoxNjo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoY3VycmVudF9sb2NhdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uICBIYW5kbGUgbWFnaWMKLQlzeW1ib2wgYC4nOyBpbiBhYnNvbHV0ZSBzZWN0aW9uLCByZXR1cm4gYSBjb25zdGFudC4KLQkob3BlcmFuZCk6IENhbGwgY3VycmVudF9sb2NhdGlvbiBmb3IgJy4nIGFuZCAnJCcsIGluc3RlYWQgb2YgZG9pbmcKLQlpdCBpbmxpbmUuICBJbiBNUkkgbW9kZSwgY2FsbCBjdXJyZW50X2xvY2F0aW9uIGZvciAnKicuCi0KLUZyaSBTZXAgMTUgMjE6Mzk6MjkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IENoYW5nZSBzb21lICJDT05TVCIgcmVmZXJlbmNlcyB0byAiY29uc3QiLgotCi1GcmkgU2VwIDE1IDE3OjI3OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVHVlIFNlcCAxMiAxNzowODoyMyAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3N0YWJfcGFyc2UpOiBzaW1wbGlmeSBmaXJzdCBsb29wOwotCXVzZSBTX0dFVF9OQU1FL21vZGlmeS9TX1NFVF9OQU1FIHNlcXVlbmNlIGluc3RlYWQgb2YgYWJ1c2luZwotCVNfR0VUX05BTUUgd2hlbiB1cGRhdGluZyBzeW1ib2wgbmFtZS4KLQkobG9jYWxfc3ltYm9sc19EU1QpOiBmaXJzdCBwcmVmaXgvcG9zdGZpeCB0eXBvIGZyb20gSnVseSAyMXN0LgotCVtwbHVzIGNvbW1lbnQgcmVmb3JtYXR0aW5nIC0ta3JdCi0KLVdlZCBTZXAgMTMgMTI6MzM6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNUKTogTmV3IHZhcmlhYmxlLgotCShDSEVDS0ZMQUdTKTogUmVtb3ZlLgotCShzaXRlLmV4cCk6IE5ldyB0YXJnZXQuCi0JKGNoZWNrKTogUmV3cml0ZSB0byBpbnZva2UgcnVudGVzdCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gcmVjdXJyaW5nCi0JZG93biBpbnRvIHRlc3RzdWl0ZS4KLQkoY2xlYW4taGVyZSk6IFJlbW92ZSB0ZXN0c3VpdGUgZGlyZWN0b3J5LgotCShjbGVhbiwgZGlzdGNsZWFuKTogRG9uJ3QgcmVjdXIgaW50byB0ZXN0c3VpdGUuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNhbGwgQUNfQ09ORklHX1NVQkRJUlModGVzdHN1aXRlKS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ2hhbmdlIHRvIHRoZSBzZWdtZW50IHdlIGFyZQotCXJlbGF4aW5nLCBpbiBjYXNlIG1kX2NvbnZlcnRfZnJhZywgY2FsbGVkIGJ5IGN2dF9mcmFnX3RvX2ZpbGwsCi0Jd2FudHMgdG8gY2FsbCBmaXhfbmV3LgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFBlcm1pdCBQQyByZWxhdGl2ZSBjb2RlIGlmIHRoZQotCXNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpcyB0aGUgY3VycmVudCBzZWdtZW50LCBub3QganVzdCBpbgotCXRleHRfc2VjdGlvbi4KLQkobWRfY29udmVydF9mcmFnXzEpOiBEb24ndCBjYWxsIHN1YnNlZ19jaGFuZ2UuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0KLVR1ZSBTZXAgMTIgMTA6MzY6NDAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hdG9mKTogRml4IGRlYnVnZ2luZyBwcmludGYsIGFuZCBsZWF2ZSBpdAotCW91dCBieSBkZWZhdWx0LgotCi1Nb24gU2VwIDExIDExOjM5OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2NvbmZpZ3VyZS5pbjogUmVtb3ZlIHVudXNlZCBmaWxlLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBHcmFiIGFsbCBhdmFpbGFibGUgc3BhY2VzIGF0IHN0YXJ0IG9mCi0JbGluZSBiZWZvcmUgcHJlc2VydmluZyBhIHNpbmdsZSBzcGFjZS4gIFJlbW92ZSBzdGF0ZSA9PSAwIHRlc3QKLQl3aGljaCB3aWxsIG5ldmVyIHN1Y2NlZWQuCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IERlbGV0ZSBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUKLQlmb3JtYWwgaGFzaCB0YWJsZS4KLQkobWFjcm9fZXhwYW5kKTogSW4gTVJJIG1vZGUsIHN0b3Agd2hlbiB3aGl0ZXNwYWNlIGlzIHNlZW4gaW4gdGhlCi0JYXJndW1lbnQgbGlzdC4KLQotCSogc2IuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCSogbWFjcm8uYzogTGlrZXdpc2UuICBBbHNvIGluY2x1ZGUgPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCi0KLUZyaSBTZXAgIDggMDA6Mjc6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJbiBNUkkgbW9kZSwga2VlcCBhIHNwYWNlIGJlZm9yZSBhCi0JcG9zc2libGUgY29tbWVudCBjaGFyYWN0ZXIuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSW4gTVJJIG1vZGUsIGlnbm9yZSBhbnl0aGluZyBhZnRlcgotCWFuIGluc3RydWN0aW9uIHdoaWNoIHRha2VzIG5vIG9wZXJhbmRzLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgZ2FzcCBpbiAkKHRvb2xkaXIpLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBhIG5vbiB6ZXJvIGJhc2UgcmVnaXN0ZXIgZm9yCi0JTV9Ve0wsU317RCxXLEh9X0EuCi0KLQkqIGdhc3AuYyAoc2hvd191c2FnZSk6IFB1dCBwcm9ncmFtX25hbWUgYXJndW1lbnQgaW4gZmlyc3QgZnByaW50ZiwKLQlub3Qgc2Vjb25kLgotCi1UaHUgU2VwICA3IDEyOjMzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSGFuZGxlIDA4IGFuZCAwOSBpbiBNUkkgbW9kZS4KLQkqIG1hY3JvLmMgKElTU0VQKTogUmVtb3ZlIGR1cGxpY2F0ZWQgYCInIGNoYXJhY3Rlci4KLSAJKGdldF9hbnlfc3RyaW5nKTogQ29weSBzb21lIGNoYXJhY3RlcnMgZm9yIHdoaWNoIElTU0VQIGlzIHRydWU6Ci0JJzsnLCAnPicsICcoJywgJyknLiAgT3RoZXJ3aXNlIHdlIGNhbiBnZXQgaW4gYW4gaW5maW5pdGUgbG9vcC4KLQkqIHJlYWQuYyAoc19zcGFjZSk6IEluIE1SSSBtb2RlLCB0aGUgZXhwcmVzc2lvbnMgc3RvcCBhdCB0aGUgZmlyc3QKLQl1bnF1b3RlZCBzcGFjZS4KLQkoY29uc193b3JrZXIpOiBJbiBNUkkgbW9kZSwgcmVzdG9yZSB0aGUgdGVybWluYXRpbmcgY2hhcmFjdGVyIGF0Ci0JdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi0KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBEb24ndCB1c2UgI2VsaWY7IG9sZCBjb21waWxlcnMgZG9uJ3QKLQlzdXBwb3J0IGl0LgotCi1XZWQgU2VwICA2IDIxOjEzOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSW4gTVJJIG1vZGUsIHNpbGVudGx5IGVuZCBxdW90ZWQgc3RyaW5ncwotCWF0IG5ld2xpbmUgY2hhcmFjdGVycy4gIEluIE1SSSBtb2RlLCBhbHdheXMga2VlcCBzcGFjZXMgaW4gdGhlCi0Jb3BlcmFuZHMgZmllbGQuICBJbiBNUkkgbW9kZSwgdHJlYXQgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIGFzIGEKLQlyZWd1bGFyIGNvbW1lbnQgY2hhcmFjdGVyIGZvbGxvd2luZyBhIHNwYWNlLgotCSogY29uZC5jIChpZ25vcmVfaW5wdXQpOiBVc2Ugc3RybmNhc2VjbXAgcmF0aGVyIHRoYW4gc3RybmNtcCB3aGVuCi0JbG9va2luZyBmb3Igc3BlY2lhbCBwc2V1ZG8tb3BzLgotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IEluIE1SSSBtb2RlLCB0aGUgZXhwcmVzc2lvbnMgc3RvcCBhdCB0aGUKLQlmaXJzdCB1bnF1b3RlZCBzcGFjZS4KLQkoZXF1YWxzKTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgIDYgMTU6MDM6NTMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoZ2V0X29wZXJhbmRzKTogUmVhZCB0aGlyZCBhcmcgaWYgaXQgZXhpc3RzLgotCU90aGVyd2lzZSwgY2xlYXIgaXQuCi0JKGdldF9zcGVjaWZpYywgY2FzZSBGX0ZSMCk6IEFkZC4KLQotV2VkIFNlcCAgNiAxNTowMzo1MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChnZXRfc3BlY2lmaWMpOiBEZWxldGUgYXJnX3RvX3Rlc3QuCi0JKG1kX2Fzc2VtYmxlKTogSW5jcmVhc2Ugb3BlcmFuZCBhcnJheSBmcm9tIDIgdG8gMy4KLQotVHVlIFNlcCAgNSAxNjo0NzozNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlbW92ZSBDWUdOVVMgTE9DQUwgY29tbWVudHMuCi0JKG1kX2JlZ2luKTogVXNlIDAvMSBpbnN0ZWFkIG9mIFRSVUUvRkFMU0UuCi0JKG1kX3Nob3dfdXNhZ2UpOiBCcmVhayB1cCBsb25nIGZvcm1hdCBzdHJpbmcgZm9yIHRoZSBiZW5lZml0Ci0Jb2YgbGFtZSBjb21waWxlcnMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zaG93X3VzYWdlKTogRGl0dG8uCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBEaXR0by4KLQkqIG1hY3JvLmMgKGNoZWNrX21hY3JvKTogQ2FzdCByZXN1bHQgb2YgaGFzaF9maW5kLgotCi1UdWUgU2VwICA1IDE0OjQ2OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFdoZW4gdGVzdGluZyBmb3IgYSBmcmVlKCkgZGVjbGFyYXRpb24gaW4gc3lzdGVtCi0JaGVhZGVyIGZpbGVzLCBjYXN0IHRoZSBhZGRyZXNzIHRvIGEgZnVuY3Rpb24gcG9pbnRlciwgbm90IHRvIGFuCi0JaW50ZWdlci4KLQotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IENhbGwgVENfSU5JVF9GSVhfREFUQSBpZiBUQ19GSVhfVFlQRQotCWlzIGRlZmluZWQuICBEb24ndCBpbml0aWFsaXplIGZ4X2Jzci4gIFZlcmlmeSB0aGF0IGZ4X3NpemUgZmllbGQKLQlpcyB3aWRlIGVub3VnaCB0byBob2xkIHN0b3JlZCB2YWx1ZS4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBDaGFuZ2UgdGNfZml4X2RhdGEgdG8gdHlwZSBUQ19GSVhfVFlQRSBpZgotCXRoYXQgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIG9taXQgaXQuICBEZWxldGUgZnhfYnNyLiAgQ2hhbmdlCi0JZnhfc2l6ZSB0byB1bnNpZ25lZCBjaGFyLgotCSogY29uZmlnL3RjLWk5NjAuaCAoVENfRklYX1RZUEUsIGZ4X2JzciwgVENfSU5JVF9GSVhfREFUQSk6IE5ldwotCW1hY3Jvcy4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19GSVhfVFlQRSwgZnhfYnNyLCBUQ19JTklUX0ZJWF9EQVRBKTogTmV3Ci0JbWFjcm9zLgotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfRklYX1RZUEUpOiBEZWZpbmUgYXMgUFRSLgotCi0JKiBjb25maWcvdGMtaTg2MC5jIChtZF9hcHBseV9maXgpOiBEZWxldGUgY29kZSBmb3IgY2hlY2tpbmcKLQlmeF9pbV9kaXNwLCBhbmQgZm9yIGhhbmRsaW5nIG5vbi16ZXJvIHZhbHVlcywgc2luY2UgaXQgbmV2ZXIgZ2V0cwotCXNldCBhZnRlciBiZWluZyBpbml0aWFsaXplZCB0byB6ZXJvLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogTWFrZSBmeF9pbV9kaXNwIGFsd2F5cyAyIGJpdHMsIHNpbmNlIHRoZQotCW9ubHkgdGMtKiBmaWxlcyBhY3R1YWxseSB1c2luZyBpdCBuZWVkIHRoYXQgbXVjaC4KLQotCU5TMzJLIGNoYW5nZXMgZnJvbSBJYW4gRGFsbDoKLQkqIGNvbmZpZ3VyZS5pbjogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAotCW5zMzJrLXBjNTMyLWxpdGVzKiBsaWtlIG5zMzJrLXBjNTMyLW5ldGJzZCouCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lIHRvIDEuCi0KLUZyaSBTZXAgIDEgMTc6MDI6MTUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEdldCBUQ19GT1JDRV9SRUxPQ0FUSU9OIHVwIHRoZQotCXJpZ2h0IHdheSEKLQotRnJpIFNlcCAgMSAwODoyMDoxOSAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBiZWF1dHkuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbiwgbWRfYmVnaW4sIG1kX3Nob3dfdXNhZ2UpOgotCUFkZCBzdXBwb3J0IGZvciAiLW1jcHU9dnI0MzAwIiBhcyBwcm9jZXNzb3IgaWRlbnRpZmllci4KLQotVGh1IEF1ZyAzMSAxNjo0MTowNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogUmVtb3ZlIGNoYW5nZSBvZiAyOXRoLgotCSogY29uZmlnL3RjLXtpMzg2LGFybX0uaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IEtlZXAgUlZBIHJlbG9jcy4KLQotVHVlIEF1ZyAyOSAxOTo0Mjo1OCAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCkgW2Nhc2UgUE9TVC9QUkUvQkFTRV06IEZpeCB0eXBvIHdoZW4KLSAJbG9va2luZyBhdCBvdXRlciBkaXNwbGFjZW1lbnQuICBEb24ndCBzZXQgdGhlIHBvc3RpbmRleCBiaXQgaWYgdGhlCi0gCWluZGV4IHN1cHByZXNzIGJpdCBpcyBzZXQgKGZvciBtZW1vcnkgaW5kaXJlY3QgYWRkcmVzc2luZyBtb2RlKS4KLQotVGh1IEF1ZyAzMSAwNjo0OTozNyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRjX2dlbl9yZWxvYyk6IERlbGV0ZSBkdXBsaWNhdGVkIGNvZGUuCi0KLVdlZCBBdWcgMzAgMjM6NTE6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBGcmVlIHNhdmVkX2lucHV0IHdoZW4gdGhlIGZyb20gYnVmZmVyCi0JZXhhY3RseSBmaWxscyB0aGUgdG8gYnVmZmVyLgotCi1XZWQgQXVnIDMwIDEzOjQ2OjM5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChwYXJzZV9rZXl3b3JkX2FyZywgcGFyc2VfY29uc3RfZXhwcl9hcmcpOiBOZXcgZm5zLgotCShzcGFyY19pcCk6IENhbGwgdGhlbSBmb3IgYXNpLCBtZW1iYXIsIGFuZCBwcmVmZXRjaCBwYXJzaW5nLgotCi1UdWUgQXVnIDI5IDE1OjQ1OjM3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZW1iYXJfbWFza3MpOiBEZWxldGVkLgotCShzcGFyY19pcCk6IENsZWFuIHVwIEFTSSBhbmQgbWVtYmFyIHN1cHBvcnQuCi0KLVR1ZSBBdWcgMjkgMTM6MjA6MjcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogUnZhIGlzIG5ldyBlbnRyeS4KLQkoY29uc193b3JrZXIpOiBOZXcsIHNwbGl0IGZyb20gY29ucy4gIEhhbmRsZXMgcnZhLgotCShjb25zLCBzX3J2YSk6IENhbGwgY29uc193b3JrZXIuCi0JKiByZWFkLmggKHNfcnZhKTogTmV3IGRlY2xhcmF0aW9uLgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IHRocm93IGF3YXkgcnZhIHJlbG9jcy4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4LCB0Y19nZW5fcmVsb2MpOiBIYW5kbGUgUlZBLgotCSogY29uZmlnL3RjLWkzODYuYyAodGNfY29mZl9maXgydHlwZSk6IEhhbmRsZSBSVkEuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19DT1VOVF9SRUxPQyk6IFJlbWVtYmVyIFJWQXMuCi0JKFRDX1JWQV9SRUxPQyk6IE5ldyBkZWZpbml0aW9uLgotCi1TdW4gQXVnIDI3IDE3OjQxOjA1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fc3dpKTogQWxsb3cgb3B0aW9uYWwgbGVhZGluZyAnIycuCi0KLVNhdCBBdWcgMjYgMTc6MjQ6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKTogSWYgVEVfREVMVEEgaXMgZGVmaW5lZCwKLQlpbmNsdWRlICcjJy4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKE5PX1BTRVVET19ET1QpOiBEZWZpbmUgaWYgVEVfREVMVEEgaXMKLQlkZWZpbmVkLgotCi0JKiBjb25maWcvdGUtZGVsdGEuaDogSW5jbHVkZSBvYmotZm9ybWF0LmguCi0JKiBjb25maWcvdGUtc2NvMzg2Lmg6IExpa2V3aXNlLgotCSogY29uZmlnL3RlLXN5c3YzMi5oOiBMaWtld2lzZS4KLQotCSogYXBwLmMgKHNjcnViX2ZpbGUpOiBSZW1vdmUuCi0JKHNjcnViX2Zyb21fZmlsZSwgc2NydWJfdG9fZmlsZSk6IFJlbW92ZS4KLQkoc2NydWJfc3RyaW5nLCBzY3J1Yl9sYXN0X3N0cmluZyk6IFJlbW92ZS4KLQkoc2NydWJfZnJvbV9zdHJpbmcsIHNjcnViX3RvX3N0cmluZyk6IFJlbW92ZS4KLQkoc2F2ZWRfaW5wdXQsIHNhdmVkX2lucHV0X2xlbik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3QgYXBwX3NhdmVkKTogUmVtb3ZlIHNjcnViX3N0cmluZywgc2NydWJfbGFzdF9zdHJpbmcsIGFuZAotCXNjcnViX2ZpbGUgZmllbGRzLiAgQWRkIHNhdmVkX2lucHV0IGFuZCBzYXZlZF9pbnB1dF9sZW4gZmllbGRzLgotCShhcHBfcHVzaCk6IEFkanVzdCBzYXZlZCBmaWVsZHMgZm9yIGNoYW5nZXMgaW4gc3RydWN0IGFwcF9zYXZlLgotCUluaXRpYWxpemUgc3RhdGUgYW5kIHNhdmVkX2lucHV0LgotCShhcHBfcG9wKTogQWRqdXN0IHNhdmVkIGZpZWxkcyBmb3IgY2hhbmdlcyBpbiBzdHJ1Y3QgYXBwX3NhdmUuCi0JKGRvX3NjcnViX2NoYXJzKTogUmVuYW1lIGZyb20gZG9fc2NydWJfbmV4dF9jaGFyIGFuZCByZXdyaXRlIHRvCi0JcHJvY2VzcyBhIGJ1ZmZlciBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgotCShtYWluLCBhc193YXJuKTogUmVtb3ZlIG9ic29sZXRlIHRlc3RpbmcgY29kZS4KLQkqIGFzLmggKGRvX3NjcnViX25leHRfY2hhcik6IERvbid0IGRlY2xhcmUuCi0JKGRvX3NjcnViX2NoYXJzKTogRGVjbGFyZS4KLQkoc2NydWJfZnJvbV9maWxlLCBzY3J1Yl9mcm9tX3N0cmluZyk6IERvbid0IGRlY2xhcmUuCi0JKHNjcnViX3RvX2ZpbGUsIHNjcnViX3RvX3N0cmluZyk6IERvbid0IGRlY2xhcmUuCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfZ2V0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKTogQ2FsbCBkb19zY3J1Yl9jaGFycyByYXRoZXIgdGhhbgotCWRvX3NjcnViX25leHRfY2hhci4KLQkqIHJlYWQuYyAoc2NydWJfc3RyaW5nLCBzY3J1Yl9zdHJpbmdfZW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHNjcnViX2Zyb21fc3RyaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCBkb19zY3J1Yl9jaGFycyByYXRoZXIgdGhhbgotCWRvX3NjcnViX25leHRfY2hhci4KLQotVGh1IEF1ZyAyNCAxODo1MDoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAoYXNfYWJvcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBzYi5jIChzYl9idWlsZCk6IFJldmVydCB5ZXN0ZXJkYXkncyBwYXRjaC4KLQotCSogTWFrZWZpbGUuaW4gKGdhc3AubmV3KTogRGVwZW5kIHVwb24gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hLgotCUp1c3QgbGluayBhZ2FpbnN0IGxpYmliZXJ0eSwgbm90IGFnYWluc3QgJChMSUJTKS4KLQotV2VkIEF1ZyAyMyAxNToxODoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNiLmMgKHNiX2J1aWxkKTogVW5kZWZpbmUgYWJvcnQgYmVmb3JlIGNhbGxpbmcgaXQsIHNpbmNlIGdhc3AKLQlkb2VzIG5vdCBwcm92aWRlIGFzX2Fib3J0LgotCi1XZWQgQXVnIDIzIDEwOjQwOjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChzZXRfdGFyZ2V0X2VuZGlhbik6IE5ldyBzdGF0aWMgdG8gc2F5IHdoZXRoZXIKLQl3ZSd2ZSBpbml0aWFsaXplZCB0YXJnZXRfYmlnX2VuZGlhbiBvciBub3QuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBzZXRfdGFyZ2V0X2VuZGlhbiBpZiB3ZSBzZXQgdGhlIHZhcmlhYmxlCi0JdGFyZ2V0X2JpZ19lbmRpYW4uCi0JKG1kX2JlZ2luKTogT25seSBzZXQgdGFyZ2V0X2JpZ19lbmRpYW4gaWYgIXNldF90YXJnZXRfZW5kaWFuLgotCi1UdWUgQXVnIDIyIDAzOjAwOjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVNhdCBBdWcgMTkgMTg6MDg6MTYgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERTVF9TX0NfU1JDX1NFVFJFQ19XLCBEU1RfU19DX1NSQ19ERUZMSU5FU19CKToKLQlOZXcgbWFjcm9zLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uLAotCVZNU19UQlRfU291cmNlX0xpbmVzKTogTWFrZSB0cmFjZWJhY2sgaW5mbyBiZSByb2J1c3QgZW5vdWdoIHRvCi0JaGFuZGxlIGh1Z2Ugc291cmNlIGZpbGVzLgotCShWTVNfVEJUX1NvdXJjZV9GaWxlKTogUmVvcmdhbml6ZSB0aGUgbmF0aXZlLSB2cyBjcm9zcy1hc3NlbWJseQotCXN1cHBvcnQgc28gdGhhdCBhY3R1YWwgb2JqZWN0IGZpbGUgb3V0cHV0IGlzIGNsZWFyZXIuCi0JKFZNU19UQlRfU291cmNlX0ZpbGU6IEZhYiwgTmFtLCBEYXRlX1hhYiwgRmlsZV9IZWFkZXJfWGFiKToKLQlSZXBsYWNlIHN0YXRpYyB2YXJpYWJsZXMgd2l0aCBhdXRvbWF0aWMgb25lcy4KLQotCVNhdCBBdWcgMTIgMjA6MTg6MTUgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKE1vZHVsZV9OYW1lKTogbmV3IGZpbGUgc2NvcGUgdmFyaWFibGUuCi0JKFZNU19UQlRfTW9kdWxlX0JlZ2luKTogdXNlIGl0IGluc3RlYWQgb2YgbG9jYWwgdmFyaWFibGUuCi0JKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IGRpdHRvOyBhc3NpZ24gaXRzIHZhbHVlIGhlcmUuCi0JKFdyaXRlX1ZNU19FT01fUmVjb3JkKTogc2Vjb25kIGFyZ3VtZW50IGhhcyB0eXBlIHZhbHVlVC4KLQkoVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSk6ICBzaW1wbGlmeSBzZWFyY2ggbG9vcDsgcmV0dXJuCi0JdHlwZSBpcyBvZmZzZXRUOyBzZWNvbmQgYXJndW1lbnQgaXMgdW5zaWduZWQuCi0KLQlTYXQgSnVuIDE3IDE5OjA1OjI1IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBtZXNzYWdlcy5jIChhc19wZXJyb3IpOiBVc2UgeHN0cmVycm9yIGluc3RlYWQgb2Ygc3RyZXJyb3IuCi0KLU1vbiBBdWcgMjEgMTM6NTc6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC0tZGVmc3ltIFNZTT1WQUxVRS4KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMuMTogRG9jdW1lbnQgLS1kZWZzeW0uCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTVJJIG1vZGUsIGRvbid0IGVuZCB0aGUKLQlzdGF0ZW1lbnQgaW5zaWRlIGEgcXVvdGF0aW9uLgotCShzX3NwYWNlKTogRG9uJ3Qgd2FybiBhYm91dCBhIHplcm8gcmVwZWF0IGNvdW50IGluIE1SSSBtb2RlLgotCSogY29uZmlnL3RjLW02OGsuYyAoY3JhY2tfb3BlcmFuZCk6IEluIE1SSSBtb2RlLCBkb24ndCBjb3VudAotCXBhcmVudGhlc2VzIGluc2lkZSBxdW90ZXMuCi0JKG1kX2Fzc2VtYmxlKTogSW4gTVJJIG1vZGUsIGFueXRoaW5nIGFmdGVyIHRoZSBvcGVyYW5kcyBmaWVsZCBpcyBhCi0JY29tbWVudC4KLQkocGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IEFkanVzdCBzdGFydCBhbmQgc3RvcCB0byByZW1vdmUKLQlzcGFjZXMuCi0JKHNfbXJpX2Zvcik6IExpa2V3aXNlLgotCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBSZXN0b3JlIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHN5bWJvbCBuYW1lLAotCWluIGNhc2UgaXQgaXMgYSBuZXdsaW5lLgotCShzX2lmKTogSWYgaWdub3JpbmcgdGhlIGN1cnJlbnQgdHJlZSwgZG9uJ3QgdHJ5IHRvIHBhcnNlIHRoZQotCWV4cHJlc3Npb24uCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBMRVhfSVNfU1RSSU5HUVVPVEUgb3IKLQlMRVhfSVNfT05FQ0hBUl9RVU9URSBpcyBzZWVuIGluCXN0YXRlIDEwLCBwcmVzZXJ2ZSBvbmUgc3BhY2UuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBpcnAsIGlycGMsIG1hY3JvLCBhbmQgcmVwdC4gTVJJIG1vZGUKLQlub3cgc3VwcG9ydHMgbWFjcm9zLCBpZmMsIGlmbmMsIGlycCwgaXJwYywgcmVwdCwgYW5kIGVuZHIsIHdpdGhvdXQKLQl1c2luZyBnYXNwLgotCi0JQWRkIHN1cHBvcnQgZm9yIG1hY3Jvcy4KLQkqIGFzLmM6IEluY2x1ZGUgc2IuaCBhbmQgbWFjcm8uaC4KLQkobWF4X21hY3JvX25leHQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShtYWluKTogQ2FsbCBtYWNyb19pbml0LgotCShtYWNyb19leHByKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGFzLmggKG1heF9tYWNyb19uZXN0KTogRGVjbGFyZS4KLQkqIHJlYWQuYyAobGluZV9sYWJlbCk6IFJlbmFtZSBmcm9tIG1yaV9saW5lX2xhYmVsLiAgQ2hhbmdlIGFsbAotCXVzZXMuCi0JKHBvdGFibGUpOiBBZGQgZXhpdG0sIGlycCwgaXJwYywgbWFjcm8sIG1leGl0LCByZXB0LgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBBbHdheXMgY2xlYXIgbGluZV9sYWJlbCBhdCB0aGUgc3RhcnQgb2YgYQotCWxpbmUsIG5vdCBqdXN0IHdoZW4gZmxhZ19tcmkgb3IgTEFCRUxTX1dJVEhPVVRfQ09MT05TLiAgRml4Ci0JTVJJL0xBQkVMU19XSVRIT1VUX0NPTE9OUyBoYW5kbGluZy4gIEluIE1SSSBtb2RlLCBwZXJtaXQgbGFiZWw6Ci0JZXF1IHZhbC4gIFNldCBsaW5lX2xhYmVsIHdoZW4gY2FsbGluZyBjb2xvbi4gIEluIE1SSSBtb2RlLCBhCi0JbGVhZGluZyAnLicgZG9lcyBub3QgaW1wbHkgYSBwc2V1ZG8tb3AuICBDaGVjayBmb3IgbWFjcm8gZXhwYW5zaW9uCi0JYmVmb3JlIGNhbGxpbmcgbWRfYXNzZW1ibGUuCi0JKHNfaXJwKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfbGluZV9zYik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfbWFjcm8pOiBOZXcgZnVuY3Rpb24uCi0JKHNfbWV4aXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNfcmVwdCk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAobGluZV9sYWJlbCk6IFJlbmFtZSBmcm9tIG1yaV9saW5lX2xhYmVsLgotCShzX2lycCwgc19yZXB0KTogRGVjbGFyZS4KLQkoc19tYWNybywgc19tZXhpdCk6IERlY2xhcmUuCi0JKiBpbnB1dC1zY3J1Yi5jOiBJbmNsdWRlIHNiLmguCi0JKHNiX2luZGV4LCBmcm9tX3NiKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1hY3JvX25lc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzdHJ1Y3QgaW5wdXRfc2F2ZSk6IEFkZCBzYl9pbmRleCBhbmQgZnJvbV9zYiBmaWVsZHMuICBDaGFuZ2UKLQluZXh0X3NhdmVkX2ZpbGUgZmllbGQgdG8gYmUgc3RydWN0IGlucHV0X3NhdmUgKi4KLQkobmV4dF9zYXZlZF9maWxlKTogQ2hhbmdlZCB0byBiZSBzdHJ1Y3QgaW5wdXRfc2F2ZSAqLgotCShpbnB1dF9zY3J1Yl9wdXNoKTogQ2hhbmdlIHRvIHJldHVybiB0eXBlIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JU2F2ZSBzYl9pbmRleCBhbmQgZnJvbV9zYi4KLQkoaW5wdXRfc2NydWJfcG9wKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIHRvIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JUmVzdG9yZSBzYl9pbmRleCBhbmQgZnJvbV9zYi4KLQkoaW5wdXRfc2NydWJfaW5jbHVkZV9zYik6IE5ldyBmdW5jdGlvbi4KLQkoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBIYW5kbGUgcmVhZGluZyBmcm9tIGZyb21fc2IuCi0JKGJ1bXBfbGluZV9jb3VudGVycyk6IE9ubHkgaW5jcmVtZW50IGxpbmVzIGlmIG5vdCB1c2luZyBmcm9tX3NiLgotCSogY29uZmlnL3RjLW02OGsuYyAob3B0X3RhYmxlKTogQWRkIG5lc3QuCi0JKG9wdF9uZXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGdhc3AuYzogSW5jbHVkZSBzYi5oIGFuZCBtYWNyby5oLiAgTW92ZSBhbGwgc2IgcmVsYXRlZCBmdW5jdGlvbnMKLQlhbmQgZGVmaW5pdGlvbnMgdG8gc2IuaCBhbmQgc2IuYy4gIE1vdmUgYWxsIG1hY3JvIHJlbGF0ZWQKLQlmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIHRvIG1hY3JvLmggYW5kIG1hY3JvLmMuCi0JKiBzYi5oLCBzYi5jOiBOZXcgZmlsZXMsIGV4dHJhY3RlZCBmcm9tIGdhc3AuYy4KLQkqIG1hY3JvLmgsIG1hY3JvLmM6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBBZGQgc2IubyBhbmQgbWFjcm8ubwotCShHQVNQT0JKUyk6IERlZmluZS4KLQkoZ2FzcC5uZXcpOiBEZXBlbmQgdXBvbiAkKEdBU1BPQkpTKS4gIFVzZSAkKEdBU1BPQkpTKSB0byBsaW5rLgotCShUQVJHX0NQVV9ERVBfbTY4ayk6IERlcGVuZCB1cG9uIHN1YnNlZ3MuaC4KLQkoZ2FzcC5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KLQkoc2Iubyk6IE5ldyB0YXJnZXQuCi0JKG1hY3JvLm8pOiBOZXcgdGFyZ2V0LgotCShhcy5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KLQkoaW5wdXQtc2NydWIubyk6IERlcGVuZCB1cG9uIHNiLmguCi0JKHJlYWQubyk6IERlcGVuZCB1cG9uIHNiLmggYW5kIG1hY3JvLmguCi0KLQkqIGNvbmQuYyAoZ2V0X21yaV9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX2lmYyk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBpZmMgYW5kIGlmbmMuCi0JKiByZWFkLmggKHNfaWZjKTogRGVjbGFyZS4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogSW4gTVJJIG1vZGUsIHNldCBsZXggb2YgJyB0bwotCUxFWF9JU19TVFJJTkdRVU9URS4KLQotTW9uIEF1ZyAyMSAxMzo0MTozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IEFsbG93IEBIQSwgQEwsIGFuZCBASCBzdWZmaXhlcyBvbgotCWNvbnN0YW50IGV4cHJlc3Npb25zLgotCi1TdW4gQXVnIDIwIDE1OjU0OjM3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9yZWxvY19zaXplKTogQWRkIGNvbnN0IHRvIGRlY2xhcmF0aW9uLgotCi1GcmkgQXVnIDE4IDEwOjU4OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgZXhwZWN0IHF1b3RlcyBhcm91bmQgdGhlCi0JZmlsZSBuYW1lLgotCSogbGlzdGluZy5jIChsaXN0aW5nX3RpdGxlKTogRG9uJ3QgcmVxdWlyZSB0aGUgdGl0bGUgdG8gYmUgcXVvdGVkLgotCi0JKiBnYXNwLmMgKGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSk6IEFsd2F5cyBzdWJ0cmFjdCAxIGZyb20KLQlsaW5lY291bnQgYmVmb3JlIHByaW50aW5nIGl0LgotCShwcm9jZXNzX2ZpbGUpOiBJbiBNUkkgbW9kZSwgbGluZXMgYmVnaW5uaW5nIHdpdGggJyonIG9yICchJyBhcmUKLQljb21tZW50cy4KLQkoZG9fcmVnKTogSW4gTVJJIG1vZGUsIGRvbid0IHJlcXVpcmUgcGFyZW50aGVzZXMuCi0JKGRvX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgcmVxdWlyZXMgcXVvdGVzLiAgSWYgdGhlIGZpbGUgY2FuCi0Jbm90IGJlIGZvdW5kIGluIHRoZSBpbmNsdWRlIHBhdGgsIHRyeSBvcGVuaW5nIGl0IGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LiAgUHJpbnQgdGhlIGZpbGUgbmFtZSBjb3JyZWN0bHkgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JKGNoYXJ0eXBlX2luaXQpOiBJbiBNUkkgbW9kZSwgc2V0IEZJUlNUQklUIGZvciAnLicuCi0JKG1haW4pOiBTZXQgY29tbWVudF9jaGFyIHRvICc7JyB3aGVuIGVudGVyaW5nIE1SSSBtb2RlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkobTY4a19pcCk6IFBhc3MgNjQgcmF0aGVyIHRoYW4gLTEgdG8gYWRkX0ZpeCBpbiAnQicgJ0InIGNhc2UuCi0JKG1kX3BjcmVsX2Zyb20pOiBJZiBmeF9wY3JlbF9hZGp1c3QgaXMgNjQsIHVzZSAtMSBpbnN0ZWFkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBGb3IgT0JKX0FPVVQgY2FzZSwgYWRqdXN0Ci0JQkZEX1JFTE9DXzE2IGFuZCBCRkRfUkVMT0NfMzIgcmVsb2NzLgotCi1XZWQgQXVnIDE2IDE0OjQ4OjQ0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoYWxsb2NhKTogVXNlIHZvaWQqIGRlY2xhcmF0aW9uIG9uIEhQL1VYLgotCi1XZWQgQXVnIDE2IDEyOjQ5OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IElmIFBJQywgb25seSBjaGFuZ2UgUENSRUxfUzIKLQl0byBXUExUMzAgZm9yIGFuIHVuZGVmaW5lZCBvciBleHRlcm5hbCBzeW1ib2wuICBEb24ndCBjb25zaWRlcgotCVBDMTAgb3IgUEMyMiB0byBiZSBhIFBDIHJlbGF0aXZlIHJlbG9jIHdoZW4gY2hvb3NpbmcgYmV0d2VlbgotCWZ4X2FkZG51bWJlciBhbmQgZnhfb2Zmc2V0LgotCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX251bWJlcl90b19jaGFycyk6IERvbid0IGRvIGl0IGhlcmUsIGNhbGwKLQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuLgotCSogY29uZmlnL3RjLXo4ay5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogQWRkIHN1cHBvcnQgZm9yIC5zdGFydG9mLiBhbmQgLnNpemVvZi4gYnkKLQl1c2luZyBtYWdpYyBzeW1ib2wgbmFtZXMgd2hpY2ggdGhlIGxpbmtlciB3aWxsIHJlY29nbml6ZQotCXNwZWNpYWxseS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBUYWtlIG91dCBub3RlIHRoYXQgLnN0YXJ0b2YuIGFuZCAuc2l6ZW9mLiBhcmUKLQlub3Qgc3VwcG9ydGVkLgotCi1UdWUgQXVnIDE1IDE1OjA4OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wKLQlkaXJlY3RpdmVzOiBpZiwgaWYuYiwgaWYudywgaWYubCwgZWxzZSwgZWxzZS5zLCBlbHNlLmwsIGVuZGksCi0JYnJlYWssIGJyZWFrLnMsIGJyZWFrLmwsIG5leHQsIG5leHQucywgbmV4dC5sLCBmb3IsIGZvci5iLCBmb3IudywKLQlmb3IubCwgZW5kZiwgcmVwZWF0LCB1bnRpbCwgdW50aWwuYiwgdW50aWwudywgdW50aWwubCwgd2hpbGUsCi0Jd2hpbGUuYiwgd2hpbGUudywgd2hpbGUubCwgZW5kdy4KLQkoZW51bSBtcmlfY29udHJvbF90eXBlKTogRGVmaW5lLgotCShzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyk6IERlZmluZS4KLQkobXJpX2NvbnRyb2xfc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfY29udHJvbF9pbmRleCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1yaV9jb250cm9sX2xhYmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHVzaF9tcmlfY29udHJvbCwgcG9wX21yaV9jb250cm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHBhcnNlX21yaV9jb25kaXRpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3dhcF9tcmlfY29uZGl0aW9uLCByZXZlcnNlX21yaV9jb25kaXRpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX21yaV9pZiwgc19tcmlfZWxzZSwgc19tcmlfZW5kaSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV9icmVhaywgc19tcmlfbmV4dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV9mb3IsIHNfbXJpX2VuZGYpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19tcmlfcmVwZWF0LCBzX21yaV91bnRpbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV93aGlsZSwgc19tcmlfZW5kdyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCSogZ2FzcC5jIChtcmlraW5mbyk6IFJlbW92ZSBJRi4KLQkqIGV4cHIuYyAoZ2V0X3N5bWJvbF9lbmQpOiBBY2NlcHQgXDAwMSBhcyBwYXJ0IG9mIGEgbmFtZS4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENoYW5nZSBwYXJhbWV0ZXIgdG8gY29uc3QgY2hhciAqLgotCSogc3ltYm9scy5oIChjb2xvbik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotTW9uIEF1ZyAxNCAyMDo1MTo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQWx3YXlzIGRvIGl0IHRoZSBCRkRfRkFTVF9TRUNUSU9OX0ZJTEwKLQl3YXkuICBSZWZvcm1hdCBhbmQgcmVpbmRlbnQgdGhhdCBjb2RlIHRvIEdOVSBzdGFuZGFyZHMuCi0JKEJGRF9GQVNUX1NFQ1RJT05fRklMTCk6IERvbid0IGRlZmluZS4KLQotTW9uIEF1ZyAxNCAxNDowODowNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG9uJ3QgdHJ5IHRvIGFwcGx5IEJFR0lOX0JSVEFCCi0Jb3IgRU5EX0JSVEFCIGZpeHVwcy4KLQotTW9uIEF1ZyAxNCAxNTo0NTowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAoZG9fYWxpZ24sIGdldF9hbnlfc3RyaW5nKTogTWFyayBhcyBzdGF0aWMuCi0JKGRvX2Fzc2lnbmEsIGRvX2Fzc2lnbmMsIG5ld19maWxlKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfcmVnKTogUmVuYW1lIGxvY2FsIG9wIHRvIHJvcCB0byBhdm9pZAotCWNvbmZ1c2lvbiB3aXRoIG1hY3JvIG9wLgotCi0JKiBnYXNwLmMgKHN0cmlwX2NvbW1lbnRzKTogQ29tbWVudCBvdXQ7IGl0J3Mgbm90IHVzZWQuCi0JKGRvX2VuZCk6IEFkZCBwYXJhbWV0ZXIuICBJbiBNUkkgbW9kZSwgcHJpbnQgaXQgb3V0LgotCShkb19pcnApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdWJfYWN0dWFsKTogQ2hhbmdlIHBhcmFtZXRlciBtIHRvIGZvcm1hbF9oYXNoLCBjaGFuZ2luZyB0eXBlCi0JZnJvbSBtYWNyb19lbnRyeWggKiB0byBoYXNoX3RhYmxlICouCi0JKG1hY3JvX2V4cGFuZF9ib2R5KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW1hY3JvX2V4cGFuZC4KLQkobWFjcm9fZXhwYW5kKTogQ2FsbCBtYWNyb19leHBhbmRfYm9keS4KLQkoS18qKTogRnVsbHkgcGFyZW50aGVzaXplLgotCShLX0lSUCwgS19JUlBDKTogRGVmaW5lLgotCShtcmlraW5mbyk6IEFkZCBJUlAgYW5kIElSUEMuCi0JKHByb2Nlc3NfcHNldWRvX29wKTogSW4gTVJJIG1vZGUsIHByaW50IG91dCBFTkQgcHNldWRvLW9wLiAgUGFzcwotCWxpbmUgdG8gZG9fZW5kLiAgSGFuZGxlIEtfSVJQIGFuZCBLX0lSUEMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfb3B0KTogUmVzZXQgKmlucHV0X2xpbmVfcG9pbnRlciBldmVuIGlmIHdlCi0JZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgb3B0aW9uLgotCi1TdW4gQXVnIDEzIDE3OjAzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IEhhbmRsZSBhYnNvbHV0ZV9zZWN0aW9uLgotCSogd3JpdGUuYyAocmVjb3JkX2FsaWdubWVudCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFNraXAgaW5zbnMgd2l0aCBhbiBpbmFwcHJvcHJpYXRlCi0JSVNBIGxldmVsLgotCi1TdW4gQXVnIDEzIDAwOjM1OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IKLQkiYmVnaW5fYnJ0YWIiIGFuZCAiZW5kX2JydGFiIiBwc2V1ZG8tb3BzLgotCShwYV9icnRhYik6IE5ldyBmdW5jdGlvbi4KLQkodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZSBSX0JFR0lOX0JSVEFCIGFuZCBSX0VORF9CUlRBQi4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NhdGlvbnMgZm9yIEJSVEFCIGZpeHVwcwotCXdoZW4gT0JKX1NPTSBpcyBkZWZpbmVkLgotCi1GcmkgQXVnIDExIDIwOjM0OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRFX09CSlMpOiBBZGQgZW1wdHkgZGVmaW5pdGlvbi4KLQotRnJpIEF1ZyAxMSAxOToxNjowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAoY2hhbmdlX2Jhc2UpOiBEb24ndCB0cmVhdCAnIHNwZWNpYWxseSBpbiBNUkkgbW9kZS4KLQkocHJvY2Vzc19maWxlKTogRG9uJ3Qgd2FybiBhYm91dCBtaXNzaW5nIEVORCBpbiBNUkkgbW9kZS4KLQkoZG9faWYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnZXRfbXJpX3N0cmluZywgZG9faWZjKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGJ1ZmZlcl9hbmRfbmVzdCk6IFRyZWF0IE1SSSBtb2RlIGxpa2UgYWx0ZXJuYXRlIHN5bnRheCBtb2RlLgotCShkb19hZW5kcik6IENoYW5nZSBlcnJvciBtZXNzYWdlIGluIE1SSSBtb2RlLgotCShkb19hcmVwZWF0KTogVXNlIFJFUFQvRU5EUiBpbiBNUkkgbW9kZS4KLQkoZG9fZm9ybWFscyk6IEluIE1SSSBtb2RlLCBhZGQgc3BlY2lhbCBOQVJHIGZvcm1hbC4KLQkobWFjcm9fZXhwYW5kKTogVmFyaW91cyBjaGFuZ2VzIGZvciBNUkkgbW9kZTogcGVybWl0IGEgcXVhbGlmaWVyCi0Jb24gdGhlIG1hY3JvIG5hbWU7IHNldCBzcGVjaWFsIE5BUkcgZm9ybWFsOyBwZXJtaXQgdW5uYW1lZAotCXBvc2l0aW9uYWwgYXJndW1lbnRzOyB1c2UgJiYgdG8gY29uY2F0ZW5hdGUgbmFtZWQgcGFyYW1ldGVyczsKLQlwZXJtaXQgXGQgdG8gc3BlY2lmeSBhbiB1bm5hbWVkIHBhcmFtZXRlcjsgcGVybWl0IG5hbWVkIHBhcmFtZXRlcnMKLQl0byBub3Qgc3RhcnQgd2l0aCBcOyB1c2UgPT0gdG8gc2VlIGlmIGEgcGFyYW1ldGVyIGV4aXN0cy4KLQkoZ2V0c3RyaW5nKTogSW4gTVJJIG1vZGUsIGFsbG93IDw+IHRvIHF1b3RlIGEgc3RyaW5nLgotCShLX0lGRVEsIEtfSUZORSwgS19JRkxULCBLX0lGTEUsIEtfSUZHRSwgS19JRkdUKTogRGVmaW5lLgotCShLX0lGQywgS19JRk5DKTogRGVmaW5lLgotCShzdHJ1Y3Qga2V5d29yZCk6IE5hbWUgc3RydWN0dXJlIHVzZWQgaW4ga2luZm8gYXJyYXkuCi0JKG1yaWtpbmZvKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiBEb24ndCByZXF1aXJlIGxlYWRpbmcgJy4nIGluIE1SSSBtb2RlLgotCUhhbmRsZSBuZXcgTVJJIHBzZXVkby1vcCBkZWZpbml0aW9ucy4KLQkoYWRkX2tleXdvcmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIHByb2Nlc3NfaW5pdC4KLQkocHJvY2Vzc19pbml0KTogVXNlIGFkZF9rZXl3b3JkLiAgSW4gTVJJIG1vZGUsIGFkZCBtcmlraW5mbyB0YWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJtcmkiLgotCShzaG93X3VzYWdlKTogTWVudGlvbiAtTS8tLW1yaS4KLQkobWFpbik6IENhbGwgcHJvY2Vzc19pbml0IGFmdGVyIHByb2Nlc3NpbmcgYXJndW1lbnRzLiAgSGFuZGxlIC1NLgotCSogZG9jL2dhc3AudGV4aTogRG9jdW1lbnQgLU0vLS1tcmkuCi0KLQkqIGdhc3AuYzogSW5jbHVkZSBhbnNpZGVjbC5oLiAgTWFrZSBhbGwgbG9jYWwgZnVuY3Rpb25zIHN0YXRpYy4KLSAgICAgICAgQWRkIHByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLgotCShtcmkpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShzYl9hZGRfY2hhcik6IENoYW5nZSBwYXJhbWV0ZXIgYyBmcm9tIGNoYXIgdG8gaW50LgotCShzYl9hZGRfc3RyaW5nKTogTWFrZSBwYXJhbWV0ZXIgcyBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQkoc2JfYWRkX2J1ZmZlcik6IExpa2V3aXNlLgotCShjaGVja2NvbnN0KTogQ2hhbmdlIHBhcmFtZXRlciBvcCBmcm9tIGNoYXIgdG8gaW50LgotCShleHBfZ2V0X2Ficyk6IE1ha2UgcGFyYW1ldGVyIGVtc2cgaW50byBhIGNvbnN0IHBvaW50ZXIuCi0JKGRvX3Jlcyk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZSBmcm9tIGNoYXIgdG8gaW50LgotCShidWZmZXJfYW5kX25lc3QpOiBNYWtlIHBhcmFtZXRlcnMgZnJvbSBhbmQgdG8gaW50byBjb25zdAotCXBvaW50ZXJzLgotCShkb19zZGF0YSk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZSBmcm9tIGNoYXIgdG8gaW50LgotCShuZXdfZmlsZSk6IE1ha2UgcGFyYW1ldGVyIG5hbWUgaW50byBhIGNvbnN0IHBvaW50ZXIuCi0JKGRvX2RlZmluZSk6IE1ha2UgcGFyYW1ldGVyIHN0cmluZyBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX251bWJlcl90b19jaGFycyk6IERvbid0IGRvIGl0IGhlcmUsIGNhbGwKLQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCi1GcmkgQXVnIDExIDEzOjIzOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIG5ldyBmaWVsZCBmeF9ub19vdmVyZmxvdy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IElmIGZ4X25vX292ZXJmbG93IGlzIG5vbi16ZXJvLCBkb24ndAotCWNvbXBsYWluIGlmIHRoZSBhZGRlbmQgaXMgdG9vIGxhcmdlLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogU2V0IGZ4X25vX292ZXJmbG93IGlmIHRoZSBoYWxmCi0Jd29yZCByZWxvY2F0aW9ucyBCRkRfUkVMT0Nfe0xPMTYsSEkxNixISTE2X1N9LgotCi1UaHUgQXVnIDEwIDIwOjU2OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbXJpX3NlY3QpIFtCRkRfQVNTRU1CTEVSXTogRml4IHR5cG9zIGluIGNob29zaW5nIGFuZAotCXNldHRpbmcgc2VjdGlvbiBmbGFncy4KLQotVGh1IEF1ZyAxMCAwMDozODoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkqIGRvYy9hcy4xOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFdoZW4gcmVjb2duaXppbmcgJyMnLCB1c2UgaXNieXRlIGFuZAotCWl3b3JkIHJhdGhlciB0aGFuIGV4cHI4IGFuZCBleHByMTYuICBXaGVuIHJlY29nbml6aW5nICdNJywgdXNlCi0JaXNzYnl0ZSByYXRoZXIgdGhhbiBleHByOC4gIFdoZW4gcmVjb2duaXppbmcgJ1EnIGFuZCAndCcsIGp1c3QKLQljaGVjayBmb3IgT19jb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHByOC4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKGV4cHI4LCBleHByMTYpOiBEb24ndCBkZWZpbmUuCi0JKiBNYWtlZmlsZS5pbiAobTY4ay1wYXJzZS5vKTogRGVwZW5kIHVwb24gbTY4ay1wYXJzZS5oLCBub3QKLQltNjhrLXBhcnNlLnkuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBzcGMsIHR0bCwgeGNvbSwgeHJlZi4KLQkoc19tcmlfc2VjdCk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAoc19tcmlfc2VjdCk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbikgKGJvdGggdmVyc2lvbnMpOiBJbiBNUkkKLQltb2RlLCBjYWxsIHNfbXJpX3NlY3QuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgc2VjdC5zIGFuZCBzZWN0aW9uLnMuICBNb3ZlIHNlY3Qgb3V0c2lkZQotCW9mIGlmbmRlZiBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCBzZWN0aW9uLnMsIHNlY3QsCi0Jc2VjdC5zLgotCShvYmpfZWxmX3NlY3Rpb24pOiBJbiBNUkkgbW9kZSwgY2FsbCBzX21yaV9zZWN0LgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIHJlc3RvcmUsIHNhdmUuCi0JKHN0cnVjdCBzYXZlX29wdHMpOiBEZWZpbmUuCi0JKHNhdmVfc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3NhdmUsIHNfcmVzdG9yZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCi0JKiByZWFkLmMgKHNfc2V0KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBwdHIuCi0JKGhleF9mbG9hdCk6IENoZWNrIHRhcmdldF9iaWdfZW5kaWFuLgotCShlcXVhbHMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHAuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWhwcGEuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTg2MC5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW04OGsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdGFob2UuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAobGl0dGxlKTogU2V0IHRhcmdldF9iaWdfZW5kaWFuLgotCShtZF9iZWdpbik6IExpa2V3aXNlLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkoYnVpbGRfcmVsYXgpOiBDaGVjayB0YXJnZXRfYmlnX2VuZGlhbiByYXRoZXIgdGhhbiBzaGwuCi0JKGJ1aWxkX015dGVzLCBtZF9hdG9mKTogTGlrZXdpc2UuCi0JKG1kX2NvbnZlcnRfZnJhZywgbWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKG1kX251bWJlcl90b19jaGFycyk6IExpa2V3aXNlLgotCQotV2VkIEF1ZyAgOSAxMDo1MTo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfYWJzcGNhZGQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtNjhrX3F1aWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobTY4a19yZWwzMik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBvcHQgYW5kIHJlZy4KLQkobTY4a19pcCk6IFBlcm1pdCBhYnNvbHV0ZSBzeW1ib2xzIGluICdsJy8nTCcgcmVjb2duaXRpb24uICBDaGVjawotCW02OGtfcXVpY2sgaW4gJ00nIGFuZCAnUScgcmVjb2duaXRpb24uICBDaGVjayBtNjhrX2Fic3BjYWRkIGluCi0JRElTUCBoYW5kbGluZy4gIENoZWNrIG02OGtfcmVsMzIgaW4gQkFTRS9QT1NUL1BSRSBoYW5kbGluZy4KLQkobWRfYmVnaW4pOiBJbiBNUkkgbW9kZSwgaW5pdGlhbGl6ZSBtNjhrX2Fic3BjYWRkIGFuZCBtNjhrX3JlbDMyLgotCUluIE1SSSBtb2RlLCBjaGFuZ2UgdW5zaXplZCBicmFuY2ggYWxpYXNlcyB0byBiZSB2YXJpYWJsZSBzaXplZC4KLQkoc3RydWN0IG9wdF9hY3Rpb24pOiBEZWZpbmUuCi0JKG9wdF90YWJsZSk6IERlZmluZS4KLQkoc19vcHQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShza2lwX3RvX2NvbW1hKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3B0X2NoaXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvcHRfbGlzdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9wdF9saXN0X3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX3JlZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBhcy5oIChmbGFnX2tlZXBfbG9jYWxzKTogQ2hhbmdlIGZyb20gdW5zaWduZWQgY2hhciB0byBpbnQuCi0JKGZsYWdfbm9fd2FybmluZ3MpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChtcmlfbGluZV9sYWJlbCk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkocG90YWJsZSk6IEFkZCBub3BhZ2UsIHBhZ2UsIHBsZW4uCi0JKHNfb3JnKTogRXJyb3IgaWYgaW4gTVJJIG1vZGUuCi0JKiByZWFkLmggKG1yaV9saW5lX2xhYmVsKTogRGVjbGFyZS4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19ub3BhZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaXN0aW5nLmggKGxpc3Rpbmdfbm9wYWdlKTogRGVjbGFyZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfYmVnaW4pOiBTZXQgc3lfZnJhZyBvZiBhYnNfc3ltYm9sIHRvCi0JJnplcm9fYWRkcmVzc19mcmFnLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IENoZWNrIHRoYXQgc3ltYm9sIGlzIG5vdCBOVUxMCi0JYmVmb3JlIGNoZWNraW5nIHN5X21yaV9jb21tb24uCi0JKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAoYWJzX3NlY3Rpb25fb2Zmc2V0KTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkocG90YWJsZSk6IEFkZCBvZmZzZXQsIHN0cnVjdC4KLQkoZG9fb3JnKTogTmV3IHN0YXRpYyBmdW5jdGlvbjsgaGFuZGxlIGNoYW5naW5nIHRoZSBvcmlnaW4gaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4KLQkoc19vcmcpOiBVc2UgZG9fb3JnLgotCShzX3NldCk6IExpa2V3aXNlLgotCShlcXVhbHMpOiBMaWtld2lzZS4KLQkoc19zcGFjZSk6IEluIGFic29sdXRlX3NlY3Rpb24sIGp1c3QgaW5jcmVhc2UgYWJzX3NlY3Rpb25fb2Zmc2V0LgotCShzX3N0cnVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoZW1pdF9leHByKTogSGFuZGxlIGFic29sdXRlX3NlY3Rpb24gc3BlY2lhbGx5LgotCSogcmVhZC5oIChhYnNfc2VjdGlvbl9vZmZzZXQpOiBEZWNsYXJlLgotCShzX3N0cnVjdCk6IERlY2xhcmUuCi0JKiBmcmFncy5jIChmcmFnX21vcmUpOiBXYXJuIGlmIGluIGFic29sdXRlX3NlY3Rpb24uCi0JKGZyYWdfbm93X2ZpeCk6IEluIGFic29sdXRlX3NlY3Rpb24sIHJldHVybiBhYnNfc2VjdGlvbl9vZmZzZXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBJZiBzd2l0Y2hpbmcgdG8gYWJzb2x1dGVfc2VjdGlvbiwKLQlqdXN0IHNldCBub3dfc2VnIGFuZCBub3dfc3Vic2VnLgotCShzdWJzZWdfc2V0X3Jlc3QpOiBTcGVjaWFsIGhhbmRsaW5nIHdoZW4gc3dpdGNoaW5nIHRvIG9yIGZyb20KLQlhYnNvbHV0ZV9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2Zsb2F0X2NvcG51bSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBmb3B0IGFuZCBtYXNrMi4KLQkobTY4a19pcCk6IFVzZSBtNjhrX2Zsb2F0X2NvcG51bSwgbm90IENPUE5VTSwgd2hlbiBzZXR0aW5nCi0JY29wcm9jZXNzb3IgcmVnaXN0ZXIgdG8gdXNlLiAgSW4gY2FzZSAnSScgd2hlbiBjaGVja2luZyBvcGVyYW5kcywKLQljb3JyZWN0IGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG51bWJlcnMuICBJbiBjYXNlICdJJyB3aGVuIHNldHRpbmcKLQlvcGVyYW5kcywgZG9uJ3QgYWRkIDEuCi0JKHNfZm9wdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChDT1BOVU0pOiBEb24ndCBkZWZpbmUuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBpZmVxLCBpZmdlLCBpZmd0LCBpZmxlLCBpZmx0LCBpZm5lLgotCUNoYW5nZSBpZiB0byBwYXNzIE9fbmUgdG8gc19pZi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogRG9uJ3QgZGVmaW5lIGFuIGxhYmVsIHdpdGhvdXQgYSBjb2xvbiBpZgotCWlnbm9yZV9pbnB1dCByZXR1cm5zIHRydWUuCi0JKiBjb25kLmMgKHNfaWYpOiBUcmVhdCBhcmd1bWVudCBhcyBhbiBvcGVyYXRvclQgZGVzY3JpYmluZyBob3cgdG8KLQljb21wYXJlIHRoZSBhcmd1bWVudCBhZ2FpbnN0IHplcm8uCi0JKGlnbm9yZV9pbnB1dCk6IERvbid0IHJlcXVpcmUgYW4gaW5pdGlhbCBkb3QgaW4gTVJJIG1vZGUsIG9yIGlmCi0JTk9fUFNFVURPX0RPVCBpcyBkZWZpbmVkLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgZGNiLCBkY2IuYiwgZGNiLmQsIGRjYi5sLCBkY2IucywgZGNiLncsCi0JZGNiLngsIGRzLmQsIGRzLnAsIGRzLnMsIGRzLngsIGVsc2VjLCBlbmRjLCBmYWlsLCBmb3JtYXQsIGxsZW4sCi0Jbm9mb3JtYXQuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IElmIHBzZXVkby1vcCBoYW5kbGVyIGlzIHNfZW5kLCBxdWl0Ci0JaW1tZWRpYXRlbHkuCi0JKHNfZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzX2ZhaWwpOiBOZXcgZnVuY3Rpb24uCi0JKHNfZmxvYXRfc3BhY2UpOiBOZXcgZnVuY3Rpb24uCi0JKGhleF9mbG9hdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZsb2F0X2NvbnMpOiBVc2UgaGV4X2Zsb2F0LgotCSogcmVhZC5oIChzX2ZhaWwpOiBEZWNsYXJlLgotCShzX2Zsb2F0X3NwYWNlKTogRGVjbGFyZS4KLQkqIGNvbmQuYyAoc19lbmQpOiBSZW1vdmUuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHNpemUpOiBUcmVhdCBhcmd1bWVudCBhcyBpbmRpY2F0aW5nIHdoZXRoZXIKLQlhIGhlaWdodCBpcyBleHBlY3RlZC4KLQotCSogcmVhZC5jIChtcmlfcGVuZGluZ19hbGlnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEhhbmRsZSBtcmlfcGVuZGluZ19hbGlnbi4KLQkoY29ucyk6IFNldCBtcmlfcGVuZGluZ19hbGlnbiBpZiBhcHByb3ByaWF0ZS4KLQotCSogY29uZmlndXJlLmluOiBNb3ZlIHJhbmRvbSBzcGVjaWFsIHRhcmdldCBoYW5kbGluZyBiZWZvcmUKLQlwb3NzaWJsZSBicmVhay4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEF1ZyAgOCAyMzo0MToyNSAxOTk1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29uc2lzdGVudGx5IHVzZSAke3RhcmdldF9jcHVfdHlwZX0gcmF0aGVyIHRoYW4KLQkke2NwdV90eXBlfSBhZnRlciB0aGUgbG9vcC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluICh0YXJnLWNwdS5vKTogVXNlIEB0YXJnZXRfY3B1X3R5cGVAIHJhdGhlciB0aGFuCi0JQGNwdV90eXBlQC4KLQotVHVlIEF1ZyAgOCAxNzoyNzoxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5oIChvcGVyYXRvclQpOiBSZW1vdmUgY29tbWEgYWZ0ZXIgbGFzdCBlbnVtZXJhdG9yIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBTb21lIHdoaXRlc3BhY2UgY2xlYW51cCBmcm9tIFBhdCBSYW5raW4uCi0KLQkqIGFzLmggKGFsbG9jYSk6IElmIF9fU1REQ19fLCBkZWNsYXJlIHZvaWQqIGluc3RlYWQgb2YgY2hhciouCi0KLQlXZWQgQXVnICAyIDE4OjU0OjM3IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIsCi0JQ2xvc2VfVk1TX09iamVjdF9GaWxlKTogUmVvcmdhbml6ZSB0aGUgYCNpZiAhVk1TJyBjcm9zcy1hc3NtZWJsZXIKLQlzdXBwb3J0IGNvZGUuCi0JKENsb3NlX1ZNU19PYmplY3RfRmlsZSk6IENhbGwgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgdG8gZmx1c2gKLQlvdXRwdXQgYnVmZmVyLS1qdXN0IGluIGNhc2UtLWJlZm9yZSBjbG9zaW5nIHRoZSBmaWxlLgotCi1UdWUgQXVnICA4IDEzOjA3OjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoYXJjaHMpOiBBZGQgNjhlYzAwMCwgNjhoYzAwMCwgNjhoYzAwMSwKLQk2OGVjMDIwLCA2OGVjMDMwLCA2OGVjMDQwLCBhbmQgNjgzMzAuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBjaGlwIGFuZCBjb21saW5lLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSBzdHJjYXNlY21wIHdoZW4gY29tcGFyaW5nIGRlZmF1bHRfY3B1Ci0JYWdhaW5zdCBhcmNoaXRlY3R1cmVzLgotCShtcmlfY2hpcCwgc19jaGlwKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogQWRkIHN5X21yaV9jb21tb24gYml0LgotCSogcmVhZC5oIChtcmlfY29tb25fc3ltYm9sKTogRGVjbGFyZS4KLQkoc19tcmlfY29tbW9uKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAobXJpX2xpbmVfbGFiZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfY29tbW9uX3N5bWJvbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHBvdGFibGUpOiBBZGQgImNvbW1vbiIgYW5kICJjb21tb24ucyIuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEluIE1SSSBtb2RlLCBzZXQgbXJpX2xpbmVfbGFiZWwgZm9yIGEgbGFiZWwKLQlhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgotCShzX21yaV9jb21tb24pOiBOZXcgZnVuY3Rpb24uCi0JKHNfc3BhY2UpOiBIYW5kbGUgbXJpX2NvbW1vbl9zeW1ib2wuCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBmcm9tIHZvaWQgdG8gc3ltYm9sUyAqLAotCWFuZCByZXR1cm4gbmV3IHN5bWJvbC4gIElmIG1yaV9jb21tb25fc3ltYm9sIGlzIHNldCwgYXR0YWNoIHRoZQotCW5ldyBzeW1ib2wgdG8gaXQuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIGFuIHN5X21yaV9jb21tb24gc3ltYm9sLgotCSogc3ltYm9scy5oIChjb2xvbik6IENoYW5nZSByZXR1cm4gdmFsdWUgaW4gZGVjbGFyYXRpb24uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENsZWFyIG1yaV9jb21tb25fc3ltYm9sLgotCShzdWJzZWdfc2V0IChib3RoIHZlcnNpb25zKSk6IExpa2V3aXNlLgotCSogZnJhZ3MuYyAoZnJhZ19tb3JlKTogV2FybiBpZiBtcmlfY29tbW9uX3N5bWJvbCBpcyBub3QgTlVMTC4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2tpcCBzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogRGlzY2FyZCBzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0JKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2UgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeV9tcmlfY29tbW9uIHN5bWJvbHMKLQl0byBiZSBhZ2FpbnN0IHRoZSBjb21tb24gc3ltYm9sIGl0c2VsZi4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh5YW5rX3N5bWJvbHMpOiBEaXNjYXJkIHN5X21yaV9jb21tb24gc3ltYm9scy4KLQkoZml4dXBfc2VnbWVudCk6IENoYW5nZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5X21yaV9jb21tb24gc3ltYm9scwotCXRvIGJlIGFnYWluc3QgdGhlIGNvbW1vbiBzeW1ib2wgaXRzZWxmLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBEaXNjYXJkCi0Jc3lfbXJpX2NvbW1vbiBzeW1ib2xzLgotCi0JKiBkb2MvYy1tNjhrLnRleGk6IEFkZCBkb2N1bWVudGF0aW9uIGZvciBDUFUgc3BlY2lmaWMgb3B0aW9ucywgYW5kCi0JZm9yIE1vdG9yb2xhIHN5bnRheC4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAobW90b3JvbGFfb3BlcmFuZCk6IEZvciAoJXBjKSwgc2V0IG1vZGUgdG8KLQlESVNQLCBub3QgQkFTRS4KLQotVHVlIEF1ZyAgOCAwMjozMTozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAocmVsYXhfYWxpZ24pOiBBZGQgZXh0cmEgcGFkZGluZyBmb3IgbGlua3JlbGF4IG9ubHkgaWYKLQlMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZIGlzIGRlZmluZWQuCi0JKiBjb25maWcvdGMtaTk2MC5oIChMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZKTogRGVmaW5lIGl0LgotCSogZG9jL2ludGVybmFscy50ZXhpIChSZWxheGF0aW9uKTogV3JpdGUgdXAgc29tZSBzdHVmZiBvbiBsaW5rZXIKLQlyZWxheGluZyBhbmQgTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWS4KLQotTW9uIEF1ZyAgNyAxNzoxODoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnk6IE5ldyBmaWxlOiBiaXNvbiBncmFtbWFyIGZvciBtNjhrIG9wZXJhbmRzLAotCWluY2x1ZGluZyBzdXBwb3J0IGZvciBNb3Rvcm9sYSBzeW50YXguCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oOiBOZXcgZmlsZTsgZGVmaW5pdGlvbnMgc2hhcmVkIGJldHdlZW4KLQltNjhrLXBhcnNlLnkgYW5kIHRjLW02OGsuYy4KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEluY2x1ZGUgbTY4ay1wYXJzZS5oLgotCShlbnVtIG9wZXJhbmRfdHlwZSk6IE1vdmUgdG8gbTY4ay1wYXJzZS5oLCB3aGVyZSBpdCBpcyBuYW1lZAotCW02OGtfb3BlcmFuZF90eXBlLiAgUmVuYW1lIGFsbCB1c2VzLiAgUmVhcnJhbmdlIHNvbWV3aGF0LiAgQWRkCi0JRlBSRUcuICBSZW5hbWUgQU9GRiB0byBESVNQLiAgUmVuYW1lIEFJTkRYIHRvIEJBU0UuICBSZW5hbWUgQVBPRFgKLQl0byBQT1NULiAgUmVuYW1lIEFQUkRYIHRvIFBSRS4gIFJlbW92ZSBBTUlORC4gIFJlbmFtZSBNU0NSIHRvCi0JQ09OVFJPTC4gIFJlbW92ZSBESU5EUi4KLQkoc3RydWN0IG02OGtfZXhwKTogTW92ZSB0byBtNjhrLXBhcnNlLmguICBSZW1vdmUgZV9iZWcsIGVfZW5kIGFuZAotCWVfc2VnIGZpZWxkcy4gIFJlbmFtZSBlX2V4cCB0byBleHAuICBSZW5hbWUgZV9zaXogdG8gc2l6ZSwgYW5kCi0JY2hhbmdlIHR5cGUgdG8gZW51bSBtNjhrX3NpemUuICBDaGFuZ2UgYWxsIHVzZXMuCi0JKGVudW0gX3JlZ2lzdGVyKTogTW92ZSB0byBtNjhrLXBhcnNlLmgsIHdoZXJlIGl0IGlzIG5hbWVkCi0JbTY4a19yZWdpc3Rlci4gIFJlbmFtZSBhbGwgdXNlcy4gIEFkZCBaREFUQTAtNyBhbmQgWkFERFIwLTcuCi0JKHN0cnVjdCBtNjhrX29wKTogTW92ZSB0byBtNjhrLXBhcnNlLmguICBDaGFuZ2UgYWxsIGZpZWxkcy4KLQkoc2VnKTogRG9uJ3QgZGVmaW5lLgotCShhZGRfZXhwKTogUmVtb3ZlLgotCShGQUlMLCBPSyk6IFJlbW92ZS4KLQkobTY4a19yZWdfcGFyc2UpOiBNb3ZlIHRvIG02OGstcGFyc2UueSwgYW5kIHJld3JpdGUuCi0JKFNLSVBfV0hJVEUsIFNLSVBfVyk6IFJlbW92ZS4KLQkodHJ5X21vdG9faW5kZXgsIHRyeV9pbmRleCk6IFJlbW92ZS4KLQkobTY4a19pcF9vcCk6IE1vdmUgdG8gbTY4ay1wYXJzZS55LCBhbmQgcmV3cml0ZSB0byB1c2UgZ3JhbW1hci4KLQkobWFpbik6IFJlbW92ZSBvYnNvbGV0ZSB0ZXN0IGZ1bmN0aW9uLgotCShtNjhrX2lwKTogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gdXNlIG5ldyBncmFtbWFyLgotCShnZXRfcmVncyk6IFJlbW92ZS4KLQkoY3JhY2tfb3BlcmFuZCk6IG02OGtfaXBfb3Agbm93IHJldHVybnMgMCBvbiBzdWNjZXNzLgotCShpbml0X3RhYmxlKTogQWRkIHNzcCwgemQwLTcgYW5kIHphMC03LgotCShtZF9hc3NlbWJsZSk6IE1ha2UgZXIgY29uc3QuICBDb3JyZWN0IGxvb3Agb3ZlciBvcGVyYW5kcyB3aGVuCi0JbG9va2luZyBmb3IgZXJyb3IgbWVzc2FnZS4KLQkobWRfYmVnaW4pOiBTZXQgYWx0X25vdGVuZF90YWJsZSBmb3IgJygnIGFuZCAnQCcuCi0JKGdldF9udW0pOiBFeHByZXNzaW9uIGlzIGFscmVhZHkgcGFyc2VkLiAgRG9uJ3Qgc2V0IHNlZy4KLQkqIGNvbmZpZ3VyZS5pbjogSWYgY3B1X3R5cGUgaXMgbTY4aywgcHV0IG02OGstcGFyc2UubyBpbgotCWV4dHJhLW9iamVjdHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIG02OGstcGFyc2UuYy4KLQkoQklTT04pOiBVc2UgLi4vYmlzb24vYmlzb24gaWYgaXQgZXhpc3RzLgotCShCSVNPTkZMQUdTKTogRGVmaW5lIGFzIGVtcHR5LgotCShUQVJHX0NQVV9ERVBfbTY4ayk6IERlcGVuZCB1cG9uICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oLgotCShtNjhrLXBhcnNlLmMsIG02OGstcGFyc2Uubyk6IE5ldyB0YXJnZXRzLgotCi1Nb24gQXVnICA3IDAyOjU0OjIwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogSGFuZGxlIG5ldyBGUCByZWdpc3RlcnMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlcy4KLQotRnJpIEF1ZyAgNCAxMjoyOToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BfZW5jb2RpbmcpOiBNYWtlIG5vbi1jb25zdC4gIERvbid0IHNldCAnIicgdG8KLSAgICAgICAgT19iaXRfbm90LgotCShleHByX2JlZ2luKTogU2V0IG9wX2VuY29kaW5nWyciJ10gaW4gTVJJIG1vZGUuCi0KLVdlZCBBdWcgIDIgMTg6Mzk6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBSZW1vdmUgQlJFQUtfVVBfQklHX0RFQ0wgc3R1ZmYuCi0JKHN0cnVjdCBtNjhrX2luY2FudCk6IENoYW5nZSBtX29wZXJhbmRzIGZpZWxkIHRvIGJlIGNvbnN0LgotCShzdHJ1Y3QgbTY4a19pdCk6IENoYW5nZSBhcmdzIGZpZWxkIHRvIGJlIGNvbnN0LgotCShtNjhrX2lwKTogQ2hhbmdlIGxvY2FsIHZhcmlhYmxlIHMgdG8gYmUgY29uc3QuCi0JKG9wY29kZV9wdHIpOiBSZW1vdmUuCi0JKG1kX2JlZ2luKTogVXNlIG02OGtfbnVtb3Bjb2Rlcywgbm90IG51bW9wY29kZXMuICBVc2UKLQltNjhrX29wY29kZXMsIG5vdCByZW1vdmVkIG9wY29kZV9wdHIuICBVc2UgbTY4a19udW1hbGlhc2VzLCBub3QKLQludW1hbGlhc2VzLgotCi1UdWUgQXVnICAxIDE3OjM1OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IEFkZCAiY29udHJvbCIsICJzdGF0dXMiLCAiaWFkZHIiLAotCSJzZmNyIiwgYW5kICJkZmNyIiBhcyBzeW5vbnltcyBmb3IgZXhpc3RpbmcgZW50cmllcy4KLQkobWRfYmVnaW4pOiBJbiBNUkkgbW9kZSwgZm9yY2UgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIHRvIDEuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlbW92ZWQgdW51c2VkIGxvY2FscyBpIGFuZCBhcmNoLiAgQ2hhbmdlIHR5cGUKLQlvZiBhcmNoIChhbm90aGVyIG9uZSkgdG8gdW5zaWduZWQgbG9uZy4KLQkodGNfY29mZl9zaXplbWFjaGRlcCk6IEFkZCByZXR1cm4gYWZ0ZXIgYWJvcnQgdG8gYXZvaWQgd2FybmluZy4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgTVJJIHN0eWxlIGxhYmVscyBhbmQgZXhwcmVzc2lvbnMuCi0JKiBhcy5oIChmbGFnX21yaSk6IERlY2xhcmUvZGVmaW5lLgotCSogYXMuYyAoc2hvd191c2FnZSk6IE1lbnRpb24gLU0gYW5kIGl0cyBzeW5vbnltIC0tbXJpLgotCShwYXJzZV9hcmdzKTogQWRkICdNJyB0byBzdGRfc2hvcnRvcHRzLiAgQWRkICJtcmkiIHRvCi0Jc3RkX2xvbmdvcHRzLiAgU2V0IGZsYWdfbXJpIGlmIC1NIGlzIHNlZW4uCi0JKG1haW4pOiBDYWxsIHBhcnNlX2FyZ3MgYmVmb3JlIGlucHV0X3NjcnViX2JlZ2luLiAgQ2FsbAotCWV4cHJfYmVnaW4uCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBEb24ndCBzZXQgbGV4IGZvciAnIicgb3IgJ1wnJyBpbiBNUkkKLQltb2RlLiAgRG8gc2V0IGxleCBmb3IgJzsnLCAnKicsIGFuZCAnIScgaW4gTVJJIG1vZGUuCi0JKGRvX3NjcnViX25leHRfY2hhcik6IFJlbW92ZSBNUkkgaWZkZWYgaW4gTEVYX0lTX1dISVRFU1BBQ0UgY2FzZS4KLQlJbiBNUkkgbW9kZSwga2VlcCBzcGFjZXMgYmV0d2VlbiBsYWJlbHMgYW5kIGNvbG9ucy4gIFJlbW92ZSBNUkkKLQlpZm5kZWYgYXJvdW5kIExFWF9JU19PTkVDSEFSX1FVT1RFIGNhc2UuICBJbiBNUkkgbW9kZSwgZG9uJ3QgdXNlCi0JJyEnIG9yICcqJyBhcyBjb21tZW50IGNoYXJhY3RlcnMgZXZlbiBpZiB0aGV5IGFyZSBpbgotCWNvbW1lbnRfY2hhcnMuCi0JKiByZWFkLmggKGxleF90eXBlKTogTm8gbG9uZ2VyIGNvbnN0LgotCSogcmVhZC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShsZXhfdHlwZSk6IE5vIGxvbmdlciBjb25zdC4KLQkocmVhZF9iZWdpbik6IEluIE1SSSBtb2RlLCBzZXQgbGV4X3R5cGUgb2YgJz8nIHRvIDMuCi0JKHBvdGFibGUpOiBBZGQgZGMsIGRjLmIsIGRjLmQsIGRjLmwsIGRjLnMsIGRjLncsIGRjLngsIGRzLCBkcy5iLAotCWRzLmwsIGRzLncsIGFuZCB4ZGVmLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGFuZ2UgTEFCRUxTX1dJVEhPVVRfQ09MT04gaWZkZWYgdG8gY2hlY2sKLQlmb3IgTVJJIG1vZGUgYXQgcnVudGltZSByYXRoZXIgdGhhbiBjb21waWxlIHRpbWUuICBIYW5kbGUgdGhlIEVRVQotCXBzZXVkby1vcCBpbiBNUkkgbW9kZS4gIFJlbW92ZSBib2d1cyBNUkkgaWZkZWYgYXJvdW5kIGRvbmVfcHNldWRvLgotCUNoYW5nZSBOT19QU0VVRE9fRE9UIGlmZGVmIHRvIGFsc28gdGFrZSBlZmZlY3QgZm9yIE1SSSBtb2RlIGF0Ci0JcnVudGltZS4KLQkoY29ucyk6IEluIE1SSSBtb2RlLCBhbHdheXMgY2FsbCBwYXJzZV9tcmlfY29ucyByYXRoZXIgdGhhbgotCVRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTi4KLQkocGFyc2VfbXJpX2NvbnMpOiBBbHdheXMgY29tcGlsZSwgbm90IGp1c3Qgd2hlbiBNUkkgaXMgZGVmaW5lZC4KLQlDYWxsIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiwgbm90IGV4cHJlc3Npb24sIHdoZW4gdGhlIGlucHV0IGlzCi0Jbm90IGEgc3RyaW5nIGNvbnN0YW50LiAgSGFuZGxlIEEgYW5kIEUgbW9kaWZpZXJzLgotCShmbG9hdF9jb25zKTogQWNjZXB0IDp4eHh4LCB3aGVyZSB0aGUgeCdzIGFyZSBoZXggZGlnaXRzLgotCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19lcSwgT19uZSwgT19sdCwgT19sZSwgT19nZSwgT19ndC4KLQkoZXhwcl9iZWdpbik6IERlY2xhcmUuCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJbiBNUkkgbW9kZSwgaWYgdGhlIGJhc2Ugd2FzIG5vdAotCXNwZWNpZmllZCwgbG9vayBmb3IgYSBzdWZmaXggb24gdGhlIG51bWJlciB0byBzZXQgdGhlIGJhc2UuCi0JKG1yaV9jaGFyX2NvbnN0YW50KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3BlcmFuZCk6IFJlbW92ZSBNUkkgaWZkZWYuICBJbiBNUkkgbW9kZSwgZG8gdmFyaW91cyB0aGluZ3M6IFBhc3MKLQkwIGFzIHRoZSBiYXNlIHdoZW4gY2FsbGluZyBpbnRlZ2VyX2NvbnN0YW50IGlmIHRoZXJlIHdhcyBubwotCXByZWZpeC4gIENoZWNrIGZvciBhIGhleCBjb25zdGFudCBzdWZmaXggaWYgd2hlbiBhIGxlYWRpbmcgJzAnIGlzCi0Jc2Vlbi4gIERvbid0IGFjY2VwdCAweCBvciAwYiBhcyBhIHByZWZpeC4gIENoZWNrIGZvciBFJ2NoYXJzJyBhbmQKLQlBJ2NoYXJzJy4gIEhhbmRsZSBNUkkgY2hhcmFjdGVyIGNvbnN0YW50cy4gIFRyZWF0ICciJyBhcyB0aGUKLQl1bmFyeSBiaXR3aXNlIG5vdCBvcGVyYXRvci4gIFRyZWF0ICQgYXMgdGhlIHByb2dyYW0gY291bnRlciwgb3IgYXMKLQl0aGUgcHJlZml4IGZvciBhIGhleCBjb25zdGFudC4gIFRyZWF0ICUgYXMgdGhlIHByZWZpeCBmb3IgYSBiaW5hcnkKLQljb25zdGFudCBhbmQgQCBhcyB0aGUgcHJlZml4IGZvciBhbiBvY3RhbCBjb25zdGFudC4gIFRyZWF0IDogYXMKLQl0aGUgcHJlZml4IGZvciBhIGhleCBjb25zdGFudC4KLQkob3BfZW5jb2RpbmcpOiBTZXQgJyInIHRvIE9fYml0X25vdCwgJzwnIHRvIE9fbHQsIGFuZCAnPicgdG8gT19ndC4KLQkob3BfcmFuayk6IE5vIGxvbmdlciBjb25zdC4gIENoYW5nZSByYW5rIHZhbHVlcy4KLQkoZXhwcl9iZWdpbik6IE5ldyBmdW5jdGlvbi4KLQkob3BlcmF0b3IpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShleHByKTogVXNlIG9wZXJhdG9yLiAgRG9uJ3QgYm90aGVyIHRvIG1lbnRpb24gdGhlIG9wZXJhdG9yIGluCi0Jd2FybmluZ3MuICBSZW1vdmUgYm9ndXMgI2lmIDAgY29kZS4gIEhhbmRsZSBuZXcgb3BlcmF0b3JUIHZhbHVlcy4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBJbiBNUkkgbW9kZSwgYWNjZXB0IHVuZGVyc2NvcmVzCi0JYXJvdW5kIHRoZSBleHBvbmVudCBpbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLgotCSogc3ltYm9scy5oIChzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHN5bWJvbF9jcmVhdGUpOiBDaGVjayBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlLgotCShzeW1ib2xfZmluZF9iYXNlKTogTGlrZXdpc2UuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCShwcmludF9leHByXzEpOiBMaWtld2lzZS4KLQkoU19JU19MT0NBTCk6IEluIE1SSSBtb2RlLCBuYW1lcyBiZWdpbm5pbmcgd2l0aCB0d28gJz8nIGNoYXJhY3RlcnMKLQlhcmUgbG9jYWwuCi0KLVR1ZSBBdWcgIDEgMTE6MzU6MTggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogTWFrZSBzb21lIGVycm9yIG1lc3NhZ2VzIG1vcmUKLQlleHBsaWN0LgotCi1Nb24gSnVsIDMxIDIxOjQwOjQ3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JU2F0IEp1bCAyOSAxODo1NToyMyAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoQ09QWV9TSE9SVCwgQ09QWV9MT05HLCBQVVRfU0hPUlQsIFBVVF9MT05HKToKLQlNYWtlIGV4cGFuc2lvbiBiZSBzYWZlIGZvciB1c2UgaW4gZXhwcmVzc2lvbnMuCi0JKFBVVF9DT1VOVEVEX1NUUklORyk6IEJyYWNrZXQgZXhwYW5zaW9uIHdpdGggYGRvIHsuLi59IHdoaWxlICgwKScKLQlyYXRoZXIgdGhhbiBqdXN0IGB7Li4ufScuCi0KLU1vbiBKdWwgMzEgMTg6MTk6MjYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChtYWluKTogUGFyc2UgLUkgb3B0aW9uLgotCShkb19pbmNsdWRlKTogTG9vayB0aHJvdWdoIGluY2x1ZGUgbGlzdC4KLQkqIGdhc3AuYyAoY2hhbmdlX2Jhc2UpOiBEb24ndCBtb2RpZnkgbnVtYmVycyBpbiBzdHJpbmdzLiAKLQotTW9uIEp1bCAzMSAxMjoxNjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUuICBGcm9tIE5pY2xhcwotCUFuZGVyc3NvbiA8bmljYW5AaWRhLmxpdS5zZT4uCi0KLVRodSBKdWwgMjcgMjA6NDc6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgZG8gZnVydGhlciBwY3JlbAotCXByb2Nlc3NpbmcgYWZ0ZXIgY29udmVydGluZyBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZQotCXNhbWUgc2VnbWVudC4gIEZyb20gSmltIFdpbHNvbi4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbGludXhvbGRsZCk6IEFkZCBhcyBzeW5vbnltIGZvcgotCWkzODYtKi1saW51eCphb3V0Ki4gIEZyb20gRnJlZCBGaXNoLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEp1bCAyNyAxNjoxNDo1NiAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoZW51bSBwc190eXBlIHtwc19URVhULHBzX0RBVEEscHNfQ09NTU9OLAotCXBzX0NPTlNUfSk6IE5ldyBjb25zdGFudHMuCi0JKFZNU19Qc2VjdF9TcGVjKTogVXNlIHRoZW0gaW5zdGVhZCBvZiBsaXRlcmFsIHN0cmluZ3MuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSwgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBBZGp1c3QgY2FsbGVycy4KLQotV2VkIEp1bCAyNiAxODozMTozNSAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoY29uc3RfZmxhZyk6IENoYW5nZSBmcm9tIGNoYXIgdG8gdW5zaWduZWQgY2hhci4KLQkqIGNvbmZpZy9vYmotdm1zLmggKGNvbnN0X2ZsYWcpOiBEaXR0by4KLQkoc3RydWN0IG5saXN0KTogUmVwbGFjZSB1bmlvbiBuX3VuIGFuZCBuX3VuLntuX25hbWUsbl9uZXh0LG5fc3RyeH0KLQlmaWVsZHMgd2l0aCBqdXN0IG5fbmFtZTsgZGVsZXRlIGZpZWxkIG5fdmFsdWU7IGNoYW5nZSBuX290aGVyIGZyb20KLQljaGFyIHRvIHVuc2lnbmVkIGNoYXIgYW5kIG5fZGVzYyBmcm9tIHNob3J0IHRvIGludDsgaW5zZXJ0IGV4cGxpY2l0Ci0JcGFkZGluZyBmb3IgYWxpZ25tZW50LgotCi1Nb24gSnVsIDI0IDIwOjA2OjE3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHN0cnVjdCBzZWdfaW5mb190cmFzaCk6IE1ha2UgYml0ZmllbGQgdHlwZXMgdmFsaWQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTG9jYWwgYWRkX251bWJlciBzaG91bGQgbm90Ci0JYmUgZGVjbGFyZWQgcmVnaXN0ZXIgc2luY2UgaXRzIGFkZHJlc3MgaXMgdGFrZW4gZm9yCi0JTURfQVBQTFlfRklYMy4KLQotCUZyaSBKdWwgMjEgMTU6Mjg6MTggMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQlTcGxpdCBodWdlIHZtc193cml0ZV9vYmplY3RfZmlsZSByb3V0aW5lIGludG8gbWFuYWdhYmxlIHBpZWNlcy4KLQotCSogY29uZmlnL29iai12bXMuYyAodm1zX2ZpeHVwX3RleHRfc2VjdGlvbiwgc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQsCi0Jdm1zX2ZpeHVwX2RhdGFfc2VjdGlvbiwgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnksIGxvY2FsX3N5bWJvbHNfRFNULAotCXZtc19idWlsZF9EU1QpOiBOZXcgcm91dGluZXMuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGhlbS4KLQkoc3RydWN0IHZtc19vYmpfc3RhdGUpOiBOZXcgZmlsZSBzY29wZSB2YXJpYWJsZSB1c2VkIGJ5IHRoZSBhYm92ZS4KLQotTW9uIEp1bCAyNCAxNDoxMDoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInVzZXMiLgotCShzX3VzZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCBzdWJzZWdfY2hhbmdlIGJlZm9yZSBjYWxsaW5nIGZpeF9uZXcuCi0JKHNoX2hhbmRsZV9hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkoU1dJVENIX1RBQkxFKTogRGVmaW5lLgotCShzaF9mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgUl9TSF9VU0VTLCBSX1NIX0NPVU5UIGFuZCBSX1NIX0FMSUdOLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IExpa2V3aXNlLiAgQWxzbyBoYW5kbGUgc3dpdGNoIHRhYmxlCi0JZW50cmllcy4KLQkqIGNvbmZpZy90Yy1zaC5oIChIQU5ETEVfQUxJR04pOiBEZWZpbmUuCi0JKHNoX2hhbmRsZV9hbGlnbik6IERlY2xhcmUuCi0JKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0JKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiBEZWNsYXJlLgotCShUQ19DT1VOVF9SRUxPQyk6IFNpbXBsaWZ5OyByZWx5IG9uIFRDX0ZPUkNFX1JFTE9DQVRJT04gaW5zdGVhZC4KLQkodGNfZnJvYl9maWxlKTogRGVmaW5lLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHRjX2Zyb2JfZmlsZSBpZiBpdAotCWlzIGRlZmluZWQuCi0JKGZpeHVwX21kZXBzKTogQ2FsbCBIQU5ETEVfQUxJR04gaWYgaXQgaXMgZGVmaW5lZC4KLQkoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIHRvIGRlY2lkZSB3aGV0aGVyIHRvCi0JY2xlYXIgdGhlIHN5bWJvbCBmaWVsZHMgb2YgZml4UC4KLQotRnJpIEp1bCAyMSAyMjozODowMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19TREFSRUwKLQlyZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogRGl0dG8uCi0KLVRodSBKdWwgMjAgMTM6MDA6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFJlbmFtZSBhcmd1bWVudCBzZWcgdG8gc2VjLAotCXNpbmNlIHNlZyBpcyBhIG1hY3JvIG5hbWUgaW4gdGhpcyBmaWxlLgotCi0JKiBjb25maWd1cmUuaW4gKGFybS0qLXJpc2NpeCopOiBEb24ndCBzZXQgZW11bGF0aW9uLgotCi1XZWQgSnVsIDE5IDE2OjA4OjI5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChURV9QRSk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoQllURV9PUkRFUik6IERlbGV0ZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IFByb3ZpZGUgdmFsdWUgZm9yIE9CSl9DT0ZGIGFuZCBURV9QRS4KLQkoQVJNX0JJX0VORElBTik6IERlZmluZSBpZiBPQkpfQ09GRiBhbmQgVEVfUEUuCi0JKiBjb25maWcvdGMtYXJtLmMgKGJ5dGVfb3JkZXIpOiBEZWxldGUuCi0JKG1kX251bWJlcl90b19jaGFycyk6IFJlZmVyZW5jZSB0YXJnZXRfYmlnX2VuZGlhbiwgbm90IGJ5dGVfb3JkZXIuCi0JKG1kX2NoYXJzX3RvX251bWJlcik6IExpa2V3aXNlLgotCShtZF9sb25nb3B0cyk6IEFkZCAtRUIvLUVMIGlmIEFSTV9CSV9FTkRJQU4uCi0JKG1kX3BhcnNlX29wdGlvbnMpOiBSZWNvZ25pemUgLUVCLy1FTC4KLQkobWRfc2hvd191c2FnZSk6IExpc3QgLUVCLy1FTC4KLQotV2VkIEp1bCAxOSAxMTo0OToyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAocHJvY2Vzc19hc3NpZ25zKTogVXNlIHRvdXBwZXIgYmVmb3JlIGNvbXBhcmluZyBhZ2FpbnN0Ci0JdXBwZXIgY2FzZSBsZXR0ZXIuCi0JKHdoYXRjb25kKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9yZWxheCk6IFJlbmFtZSBmcm9tIHJlbGF4LCBhbmQgbWFrZSBnbG9iYWwuCi0JUmVuYW1lZCBhbGwgdXNlcy4KLQkoaW5zZXJ0KTogUGFzcyBhIHNpemUgb2YgMiwgbm90IDQuCi0JKGJ1aWxkX3JlbGF4KTogUmVtb3ZlIHVudXNlZCBsZW4gdmFyaWFibGUuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1saXR0bGUgb3B0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBBZGQgc2VnVCBhcmd1bWVudC4gIFJld3JpdGUgdG8gZ2VuZXJhdGUgcmVsb2NzCi0JcmF0aGVyIHRoYW4gdG8gZ2VuZXJhdGUgY29tcGxldGUgaW5zdHJ1Y3Rpb25zIGhlcmUuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkanVzdCBhbmQgY2xhcmlmeSBSX1NIX1BDUkVMSU1NOEJZNCBjYXNlIGZvcgotCWNoYW5nZXMgaW4gaW5zZXJ0IGFuZCBtZF9wY3JlbF9mcm9tLiAgQWRkIGNhc2VzIGZvciBSX1NIX1BDRElTUAotCWFuZCBSX1NIX1BDRElTUDhCWTIuCi0JKG1kX3BjcmVsX2Zyb20pOiBEb24ndCBzdWJ0cmFjdCAxLCBhZGQgMi4KLQkodGNfY29mZl9maXgycnR5cGUpOiBSZW1vdmUuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXNoLmggKFRDX0NPRkZfRklYMlJUWVBFKTogSnVzdCByZXR1cm4gZnhfcl90eXBlLgotCShzaF9yZWxheCk6IERlY2xhcmUuCi0JKFRDX0NPVU5UX1JFTE9DKTogSWYgcmVsYXhpbmcsIGNvdW50IFBDIHJlbGF0aXZlIHJlbG9jcy4KLQkoVENfUkVMT0NfTUFOR0xFKTogRGVmaW5lLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0JKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBEZWNsYXJlLgotCSogdGMuaCAobWRfY29udmVydF9mcmFnKTogQWRkIHNlZ1QgcGFyYW1ldGVyIHRvIG5vbiBCRkRfQVNTRU1CTEVSCi0JZGVjbGFyYXRpb24uCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogQWRkIHNlYyBhcmd1bWVudCB0byBub24KLQlCRkRfQVNTRU1CTEVSIHZlcnNpb24uICBQYXNzIGl0IHRvIG1kX2NvbnZlcnRfZnJhZy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBQYXNzIFNFR19URVhUIHRvIGN2c19mcmFnX3RvX2ZpbGwuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFBhc3Mgc2VnbWVudCBpbmZvIHRvCi0JVENfUkVMT0NfTUFOR0xFLgotCShmaXh1cF9tZGVwcyk6IFBhc3Mgc2VnbWVudCB0eXBlIHRvIG1kX2NvbnZlcnRfZnJhZy4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEFkZCBzZWdUIGFyZ3VtZW50LgotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4NTAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTg2MC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5oIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy10YWhvZS5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdzY1LmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXo4ay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChUQ19SRUxPQ19NQU5HTEUpOiBBZGQgc2VnbWVudCBhcmd1bWVudC4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChUQ19SRUxPQ19NQU5HTEUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy13NjUuaCAoVENfUkVMT0NfTUFOR0xFKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtejhrLmggKFRDX1JFTE9DX01BTkdMRSk6IExpa2V3aXNlLgotCi1Nb24gSnVsIDE3IDE1OjAyOjU0IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOiBEZWxldGUgYXMgZmlsZQotCXNjb3BlIHZhcmlhYmxlcy4KLQkoRGVmaW5lX1JvdXRpbmUsIERlZmluZV9Mb2NhbF9TeW1ib2xzKTogVGFrZSBDdXJyZW50X1JvdXRpbmUgYW5kCi0JVGV4dF9Qc2VjdCBhcyBhcmd1bWVudHMuCi0JKFZNU19EQkdfRGVmaW5lX1JvdXRpbmUpOiBEZWxldGUuCi0JKFZNU19UQlRfQmxvY2tfRW5kKTogQ2hhbmdlIGBTaXplJyBhcmd1bWVudCBmcm9tIGludCB0byB2YWx1ZVQuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogdGV4dCBhbmQgZGF0YSBmaXh1cCBsb29wcyk6IERpZmZlcmVuY2UKLQlvZiB0d28gc3ltYm9scyBoYXMgdHlwZSBvZmZzZXRUIHJhdGhlciB0aGFuIGludDsgY29udmVydCB3aXRoCi0JbWRfbnVtYmVyX3RvX2NoYXJzIGJlZm9yZSBwYXNzaW5nIHRvIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YS4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiBkZWJ1ZyBzeW1ib2wgbG9vcCk6IENhbGwgRGVmaW5lX1JvdXRpbmUKLQlpbnN0ZWFkIG9mIFZNU19EQkdfRGVmaW5lX1JvdXRpbmUuCi0KLVNhdCBKdWwgMTUgMDA6MDE6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBBZGQgQGZpeHVwIHNvIHRoYXQgdGhlCi0JY29tcGlsZXIgY2FuIG1hcmsgd2hpY2ggcmVsb2NzIG5vdCB0byBjb21wbGFpbiBhYm91dCB3aXRoCi0JLW1yZWxvY2F0YWJsZS4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBZGQgLmZpeHVwIHRvIHNlY3Rpb25zIG5vdCB0byBjb21wbGFpbgotCWFib3V0LCBhbmQgYWxzbyBkb24ndCBjb21wbGFpbiBmb3IgQkZEX1JFTE9DX0NUT1IgcmVsb2NhdGlvbnMgaW4KLQl3cml0YWJsZSBub24tY29kZSBzZWdtZW50cy4KLQkobWRfYXBwbHlfZml4KTogVHJlYXQgQkZEX1JFTE9DX0NUT1IganVzdCBsaWtlIEJGRF9SRUxPQ18zMi4KLQotRnJpIEp1bCAxNCAxOTo1NDoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgU1BBUkMgU3VuT1MgUElDOgotCSogY29uZmlnL3RjLXNwYXJjLmggKHNwYXJjX3BpY19jb2RlKTogQWx3YXlzIGRlY2xhcmUsIG5vdCBqdXN0Ci0Jd2hlbiBPQkpfRUxGLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUgd2hlbiBPQkpfQU9VVC4KLQkodGNfZml4X2FkanVzdGFibGUpOiBOZXcgZGVmaW5pdGlvbiBmb3IgT0JKX0FPVVQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfcGljX2NvZGUpOiBBbHdheXMgZGVmaW5lLCBub3QganVzdCB3aGVuCi0JT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4KTogQWRqdXN0IHJlbG9jIGFkZGVuZCBmb3IgT0JKX0FPVVQgYW5kIFBJQy4gIEluCi0JQkZEX1JFTE9DXzMyX1BDUkVMX1MyIGNhc2UsIGRvbid0IGluY3JlbWVudCB2YWwgZm9yIGFuIGV4dGVybmFsCi0Jc3ltYm9sIHdoZW4gUElDLgotCSh0Y19nZW5fcmVsb2MpOiBHZW5lcmF0ZSBkaWZmZXJlbnQgUElDIHJlbG9jcyB3aGVuIE9CSl9BT1VULCBhcwotCXdlbGwgYXMgd2hlbiBPQkpfRUxGLgotCShtZF9zaG9ydG9wdHMpOiBJZiBPQkpfQU9VVCwgaW5jbHVkZSBgaycuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9BT1VULCBoYW5kbGUgJ2snLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtayBpZiBPQkpfQU9VVCwgYW5kIC1LUElDIGlmIE9CSl9FTEYuCi0JKG1kX3BjcmVsX2Zyb20pOiBEb24ndCBhZGQgaW4gc2l6ZSBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoZW4KLQlQSUMuCi0KLVRodSBKdWwgMTMgMjE6MTY6NDMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFVOREVGSU5FRF9ESUZGRVJFTkNFX09LKTogRGVmaW5lIGZvciBTT00uCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jIGZvciBib3RoCi0Jc3ltYm9scyBpbiBhIGZpeHVwIHdoZXJlIGEgZGVmaW5lZCBzeW1ib2wgaXMgc3VidHJhY3RlZCBmcm9tIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCAod2hlbiBVTkRFRklORURfRElGRkVSRU5DRV9PSyBpcyBkZWZpbmVkKS4KLQkoZml4dXBfc2VnbWVudCk6IERvIG5vdGhpbmcgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGlmCi0JVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sgaXMgZGVmaW5lZC4KLQotV2VkIEp1bCAxMiAyMzozMzo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogU3VwcG9ydCBNRF9BUFBMWV9GSVgzLgotCi1XZWQgSnVsIDEyIDAxOjEyOjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXhfbmV3KTogVXNlIGludCwgbm90IHNob3J0IGludCwgZm9yIGFyZ3VtZW50IHR5cGUuCi0JKGZpeF9uZXdfZXhwKTogRGl0dG8uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotcmlzY2l4Kik6IERvbid0IHNldCBlbXVsYXRpb25zLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChOT19FQ09GRl9ERUJVR0dJTkcpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HCi0Jd2Fzbid0IHByZXZpb3VzbHkgZGVmaW5lZC4KLQkoc19leHRlcm4pOiBEb24ndCBzZXQgZWNvZmZfZXh0ZXJuX3NpemUgaWYgTk9fRUNPRkZfREVCVUdHSU5HLgotCShub3BpY19uZWVkX3JlbGF4KTogRG9uJ3QgY2hlY2sgaXQgaWYgTk9fRUNPRkZfREVCVUdHSU5HLgotCShtYWNyb19idWlsZCkgWyFVU0VfU1REQVJHXTogRG9uJ3QgdXNlIHZhcmlhZGljIHByb3RvdHlwZS4KLQkobWlwc19sb2NhbF9sYWJlbCkgW05PX0VDT0ZGX0RFQlVHR0lOR106IERvbid0IHByZXNlcnZlIHBvdGVudGlhbAotCUVDT0ZGIGRlYnVnZ2luZyBzeW1ib2xzLgotCi0JKiBlbXVsLmggKHN0cnVjdCBlbXVsYXRpb24pOiBVc2UgdW5zaWduZWQsIG5vdCB1bnNpZ25lZCBjaGFyLCBmb3IKLQliaXRmaWVsZHMuCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWFybS5jIChzeW1ib2xfbWFrZV9lbXB0eSkgW0JGRF9BU1NFTUJMRVJdOiBTZXQKLQl1ZGF0YS5wLCBub3QgdWRhdGEuCi0KLVR1ZSBKdWwgMTEgMTQ6MzA6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC1tNDAxMCBhbmQgLW1uby00MDEwLgotCi1UdWUgSnVsIDExIDE0OjI4OjU1IDE5OTUgIEplZmYgU3BpZWdlbCAgPGplZmZzQGxzaWwuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzQwMTApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbnRlcmxvY2tzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBDaGVjayBmb3IgYSBjcHUgb2YgInI0MDEwIi4gIFNldCBtaXBzXzQwMTAgY29ycmVjdGx5LgotCUlmIG1pcHNfNDY1MCBvciBtaXBzXzQwMTAsIHNldCBpbnRlcmxvY2tzLgotCShhcHBlbmRfaW5zbik6IENoZWNrIGludGVybG9ja3MsIG5vdCBtaXBzXzQ2NTAuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBMaWtld2lzZS4KLQkobWlwc19pcCk6IE9ubHkgcGVybWl0IElOU05fNDAxMCBpbnN0cnVjdGlvbnMgaWYgbWlwc180MDEwLgotCShtZF9sb25nb3B0cyk6IEFkZCAibTQwMTAiIGFuZCAibm8tbTQwMTAiLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgLW1jcHU9cjQwMTAuICBIYW5kbGUgLW00MDEwIGFuZAotCS1uby1tNDAxMC4KLQkobWRfc2hvd191c2FnZSk6IERvY3VtZW50IC1tNDAxMCBhbmQgLW5vLW00MDEwLgotCi1UdWUgSnVsIDExIDEzOjIyOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoc3RydWN0IGVmZHIpOiBBZGQgbmV3IGZpZWxkIGZha2UuCi0JKGluaXRfZmlsZSk6IEluaXRpYWxpemUgZmFrZS4KLQkoYWRkX2ZpbGUpOiBBZGQgbmV3IHBhcmFtZXRlciBmYWtlLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl9idWlsZF9kZWJ1Zyk6IERvbid0IHdhcm4gYWJvdXQgYSBtaXNzaW5nIC5lbmQgZm9yIGEgZmFrZQotCWZpbGUuCi0KLU1vbiBKdWwgMTAgMTY6MDE6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBTcGxpdCBvdXQgbW9zdCBjcHUgY2hhcHRlcnMuLi4KLQkqIGRvYy9jLSoudGV4aTogLi4udG8gaGVyZS4KLQotCSogcmVhZC5jIChwb19oYXNoKTogTm93IHN0YXRpYy4KLQotTW9uIEp1bCAxMCAxMzo0NzoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSC5KLiBMdSA8aGpsQG55bmV4c3QuY29tPjoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgZnJvbSBtZF9hcHBseV9maXgxLgotCUFjY2VwdCBwb2ludGVyIHRvIHZhbHVlIGFuZCBzZWdtZW50LiAgRml4IE9CSl9FTEYgUENSRUwgY2FzZSB0bwotCWhhbmRsZSBnbG9iYWwgZGVmaW5lZCBzeW1ib2xzIGNvcnJlY3RseS4KLQkobWRfYXBwbHlfZml4KTogUmVtb3ZlIGJvdGggdmVyc2lvbnMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaW46IFdoZW4gc3dpdGNoaW5nIG9uICR7Y3B1fSwgdXNlICR7Y3B1fSwgbm90Ci0JJFt0YXJnZXRfY3B1fSwgaW4gZGVmYXVsdCBjYXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgSnVsICA4IDEzOjI3OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENhbGwgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgb24KLQlzdWJfc3ltYm9sUCwgaW4gY2FzZSBpdCBpc24ndCBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCi1GcmkgSnVsICA3IDExOjE3OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2xjb21tKTogRm9yIC5sY29tbSAxLCBzZXQgYWxpZ24gdG8gMCwgbm90IDEuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogSWYgU0ZfR0VUX0ZVTkNUSU9OLCBzZXQKLQlCU0ZfRlVOQ1RJT04uCi0JKHN5bWJvbF9nbG9iYWxQLCBzeW1ib2xfZ2xvYmFsX2xhc3RQKTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKHlhbmtfc3ltYm9scyk6IFNvcnQgZGVmaW5lZCBnbG9iYWwgc3ltYm9scyB0byB0aGUgZW5kLCBqdXN0Ci0JYmVmb3JlIHRoZSB1bmRlZmluZWQgc3ltYm9scy4KLQkoZ2x1ZV9zeW1ib2xzKTogQWRkIHR3byBhcmd1bWVudHMsIGFuZCB1c2UgdGhlbSBpbnN0ZWFkIG9mCi0JcmVmZXJyaW5nIGRpcmVjdGx5IHRvIGdsb2JhbCB2YXJpYWJsZXMuCi0JKGNyYXdsX3N5bWJvbHMpOiBDYWxsIGdsdWVfc3ltYm9scyB0d2ljZSwgb25jZSBmb3IgZGVmaW5lZCBnbG9iYWxzCi0JYW5kIG9uY2UgZm9yIHVuZGVmaW5lZC4gIEFkZCBjb3JyZXNwb25kaW5nIGtub3cgY2FsbHMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBbHdheXMgYWNjZXB0IFx2LiAgRG9uJ3QgbWFrZSBpdAotCWNvbmRpdGlvbmFsIG9uIEJBQ0tTTEFTSF9WLgotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoQkFDS1NMQVNIX1YpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChCQUNLU0xBU0hfVik6IERvbid0IGRlZmluZS4KLQotCUFkZCBTUEFSQyBFTEYgUElDIHN1cHBvcnQuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogUGFzcyBmaXhQIHRvIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCwKLQlub3QgZml4UC0+Znhfcl90eXBlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX3BpY19jb2RlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4gCi0JKG1kX2FwcGx5X2ZpeCk6IElmIGdlbmVyYXRpbmcgUElDLCBhZGp1c3QgZnhfYWRkbnVtYmVyIGZvciBhbnkgbm9uCi0JUEMgcmVsYXRpdmUgcmVsb2MuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGdlbmVyYXRpbmcgUElDLCBhZGp1c3QgdmFyaW91cyByZWxvYyB0eXBlcy4KLQlSZW1vdmUgZnhfcGNyZWwgYXNzZXJ0LCBzaW5jZSBpdCBpcyBubyBsb25nZXIgdHJ1ZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1LIFBJQy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChzcGFyY19waWNfY29kZSk6IERlY2xhcmUgaWYgT0JKX0VMRi4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lIGlmIE9CSl9FTEYuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBQSUMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBUYWtlIGEgZml4cCwgbm90IGEKLQlyZWxvYyB0eXBlLgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBBZGQgZGVwZW5kZW5jeSBvbiBjb25mLmluLCBzbyB0aGF0IGNvbmYKLQlpcyByZWJ1aWx0IHdoZW4gY29uZi5pbiBjaGFuZ2VzLgotCi1UaHUgSnVsICA2IDE2OjQ5OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBBbGwgZmlsZXM6IFVwZGF0ZWQgRlNGIGFkZHJlc3MuCi0KLVRodSBKdWwgIDYgMTY6MzA6MzQgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IERvbid0IGNvbGxhcHNlIG11bHRpcGxlIC5maWxlIGNvbW1hbmRzIGludG8KLQlhIHNpbmdsZSBmaWxlIHN0cnVjdHVyZS4KLQkoZWNvZmZfYnVpbGRfbGluZW5vKTogU2V0IGlsaW5lQmFzZSB0byBzdW0gb2YgcHJldmlvdXMgZmlsZSdzCi0JaWxpbmVCYXNlIGFuZCBjbGluZS4KLQotVGh1IEp1bCAgNiAxMjo1NDoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gSmVycnkgQmxha2VseSA8Z2VycnlfYmxha2xleUB3ZWxsZmxlZXQuY29tPjoKLQkqIGFzLmMgKGxpc3RpbmdfZmlsZW5hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzaG93X3VzYWdlKTogTWVudGlvbiAtYT1maWxlLgotCShwYXJzZV9hcmdzKTogU3VwcG9ydCA9IG9wdGlvbiBvZiAtYSB0byBzZXQgbmFtZSBvZiBsaXN0aW5nIGZpbGUuCi0JKG1haW4pOiBQYXNzIGxpc3RpbmdfZmlsZW5hbWUgdG8gbGlzdGluZ19wcmludC4KLQkqIGxpc3RpbmcuYyAobGlzdF9maWxlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodmFyaW91cyk6IFJlcGxhY2UgcHJpbnRmIHdpdGggZnByaW50ZiB0byBsaXN0X2ZpbGUuCi0JKGxpc3RpbmdfcHJpbnQpOiBJZiBuYW1lIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCBvcGVuIGl0IGFzCi0JbGlzdF9maWxlLgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtYT1maWxlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogRG9uJ3QgcGVybWl0IHJlZGVmaW5pdGlvbiwgZXZlbgotCWlmIHRoZSBzeW1ib2wgd2FzIGFscmVhZHkgaW4gYnNzX3NlY3Rpb24uICBGaXggd2FybmluZyBtZXNzYWdlLgotCi0JKiBsaXN0aW5nLmMgKHN0cnVjdCBmaWxlX2luZm9fc3RydWN0KTogUmVuYW1lIGVuZF9wZW5kaW5nIGZpZWxkIHRvCi0JYXRfZW5kLgotCShmaWxlX2luZm8pOiBJbml0aWFsaXplIGF0X2VuZCwgbm90IGVuZF9wZW5kaW5nLgotCShidWZmZXJfbGluZSk6IElmIGF0X2VuZCBzZXQsIGp1c3QgcmV0dXJuIGltbWVkaWF0ZWx5LiAgRG9uJ3QKLQl3b3JyeSBhYm91dCBlbmRfcGVuZGluZyBjYXNlcy4gIFNldCBhdF9lbmQgd2hlbiBFT0YgaXMgcmVhZC4KLQkocHJpbnRfc291cmNlKTogQ2hlY2sgYXRfZW5kLCBub3QgZW5kX3BlbmRpbmcuCi0JKGxpc3RpbmdfbGlzdGluZyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoYWxwaGFfZG9fYWxpZ24pOiBEb24ndCBkZWNsYXJlLgotCShtZF9kb19hbGlnbik6IERvbid0IGRlZmluZS4KLQkodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQkoYWxwaGFfZGVmaW5lX2xhYmVsKTogRGVjbGFyZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWZpbmUuCi0JKGFscGhhX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChpbnNuX2xhYmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXV0b19hbGlnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBjYXNlcyBmb3IgLnRleHQsIC5kYXRhLCAuYWxpZ24sIC5ieXRlLAotCS5od29yZCwgLmludCwgLmxvbmcsIC5vY3RhLCAucXVhZCwgLnNob3J0LCAud29yZCwgLmRvdWJsZSwgLmZsb2F0LAotCWFuZCAuc2luZ2xlLiAgQ2hhbmdlIC50X2Zsb2F0aW5nLCAuc19mbG9hdGluZywgLmZfZmxvYXRpbmcsCi0JLmdfZmxvYXRpbmcsIGFuZCAuZF9mbG9hdGluZyB0byB1c2Ugc19hbHBoYV9mbG9hdF9jb25zIHJhdGhlciB0aGFuCi0JZmxvYXRfY29ucy4KLQkoc19hbHBoYV90ZXh0LCBzX2FscGhhX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19yZGF0YSwgc19zZGF0YSk6IENsZWFyIGluc25fbGFiZWwgYW5kIHNldCBhdXRvX2FsaWduLgotCShzX2dwcmVsMzIpOiBJZiBhdXRvX2FsaWduLCBhbGlnbi4gIENsZWFyIGluc25fbGFiZWwuCi0JKGVtaXRfaW5zbik6IENsZWFyIGluc25fbGFiZWwuCi0JKHNfYWxwaGFfYWxpZ24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9hbGlnbik6IE1ha2Ugc3RhdGljLiAgVGFrZSBsYWJlbCBhcmd1bWVudC4KLQkoYWxwaGFfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX2FscGhhX2NvbnMsIHNfYWxwaGFfZmxvYXRfY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShhbHBoYV9kZWZpbmVfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBKdWwgIDUgMjI6NDk6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmYuaW46IFJlZ2VuZXJhdGUgd2l0aCBhdXRvcmVjb25mLgotCi0JTW9uIEp1bCAgMyAxOTo0Nzo1MyAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogVXNlIGZ1bGwgcHJvdG90eXBlLgotCSh2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwsIHRjX2Zyb2JfbGFiZWwpOiBNb3ZlIHRoZW0gdG8gZ3JvdXAKLQl3aXRoIG90aGVyIHByb3RvdHlwZXMuCi0JW1dBTlRfVk1TX09CSl9ERUZTXTogT25seSBkZWZpbmUgdGhlIG1hbnkgT0JKX3gsIERCR194LCBhbmQgRFNUX3gKLQltYWNyb3Mgd2hlbiB0aGlzIGlzIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLXZtcy5jOiBGdWxseSBwcm90b3R5cGUgYWxsIGxvY2FsIGZ1bmN0aW9ucy4KLQlbc3ltYm9sUywgZnJhZ1NdOiBVc2UgY29uc2lzdGVudGx5IGluc3RlYWQgb2YgdGhlaXIgc3RydWN0IHRhZ3MuCi0JW1dBTlRfVk1TX09CSl9ERUZTXTogRGVmaW5lIHRoaXMuCi0JKHNfY29uc3QpOiBNYWtlIGRlZmluaXRpb24gY29ycmVjdGx5IG1hdGNoIGFjdHVhbCB1c2FnZS4KLQkoVk1TX3N0YWJfcGFyc2UpOiBNYWtlIGBleHBlY3RlZF90eXBlJyBhcmcgYmUgaW50IHJhdGhlciB0aGFuIGNoYXIuCi0JKGdldF9WTVNfdGltZV9vbl91bml4KTogRGVmaW5lIGFzIGBzdGF0aWMgdm9pZCcuCi0JKGhhc2hfc3RyaW5nKTogTWFrZSBkZWZpbml0aW9uIG1hdGNoIGFjdHVhbCB1c2FnZTsgYXJndW1lbnQgaXMKLQlgY2hhciBjb25zdCAqJyByYXRoZXIgdGhhbiBgdW5zaWduZWQgY2hhciAqJy4KLQkoVk1TX0Nhc2VfSGFja19TeW1ib2wsIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcywgVk1TX1BzZWN0X1NwZWMsCi0JVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyk6IERlY2xhcmUgc3RyaW5nIGFyZ3MgYXMgYGNvbnN0IGNoYXIgKicuCi0JW0lTX0dYWF9WVEFCTEVdOiBOZXcgbWFjcm8uCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogR1NEIGxvb3ApOiBVc2UgaXQuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogZGF0YSBzZWdtZW50KTogUmVvcmdhbml6ZSBgZmlsbCcgbG9vcC4KLQotV2VkIEp1bCAgNSAxMjowMTo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG9ydG9wdHMpOiBBZGQgIks6IiBpZiBPQkpfRUxGLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiBPQkpfRUxGLCBjaGVjayBmb3IgLUsuICBEaWUgaWYgLUsgUElDLCBzaW5jZQotCVBJQyBjb2RlIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQ2hhbmdlIHN0ZF9zaG9ydG9wdHMgdG8gYmUgYW4gYXJyYXkgcmF0aGVyCi0JdGhhbiBhIGNvbnN0YW50IHN0cmluZy4gIE9ubHkgaW5jbHVkZSAnSycgaWYgV09SS0lOR19ET1RfV09SRCBpcwotCW5vdCBkZWZpbmVkLiAgT25seSBjaGVjayBmb3IgJ0snIGluIHRoYXQgY2FzZSBhcyB3ZWxsLgotCSogYXMuaCAoZmxhZ193YXJuX2Rpc3BsYWNlbWVudCk6IE9ubHkgZGVjbGFyZSBpZiBXT1JLSU5HX0RPVF9XT1JECi0JaXMgbm90IGRlZmluZWQuCi0KLQkqIGNvbmYuaW46IEFkZCB1bmRlZiBvZiBIQVZFX1NCUksuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9saW5lKTogQ2FsbCBsaXN0aW5nX3NvdXJjZV9saW5lLCBpbgotCWJvdGggQkZEX0FTU0VNQkxFUiBhbmQgbm9uIEJGRF9BU1NFTUJMRVIgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uLgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX0VYVEVSTkFMKTogV2FybiBpZiBzeW1ib2wgaXMgd2Vhay4KLQkoU19DTEVBUl9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX1NFVF9XRUFLKTogV2FybiBpZiBzeW1ib2wgaXMgZ2xvYmFsLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQKLQl0byBwdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbnRvIGEgc2V0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIEBjb25maWd1cmVfaW5wdXRAOyBpdCdzIG5vdCBuZWVkZWQgaW4KLQlmaWxlcyBuYW1lZCBNYWtlZmlsZS4KLQotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIuc2V0IiBzbyB0aGF0IHRoZQotCWV4cGxpY2l0IHBzZXVkby1vcCB3b3Jrcywgd2hpbGUgY29udGludWluZyB0byB0cmVhdCAic2V0IiBhcyBhbgotCWluc3RydWN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9kZWJ1Z2dpbmdfc2Vlbik6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9kZWYpOiBTZXQgZWNvZmZfZGVidWdnaW5nX3NlZW4uCi0JKGVjb2ZmX3N0YWIpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmg6IE1ha2UgaWRlbXBvdGVudC4KLQkoZWNvZmZfZGVidWdnaW5nX3NlZW4pOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBlY29mZi5oLgotCShtaXBzX2RlYnVnKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19zdHJpbmdlciwgc19taXBzX3NwYWNlKTogUmVtb3ZlIHVubmVlZGVkIGRlY2xhcmF0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSW4gY2FzZSAnZycsIHNldCBtaXBzX2RlYnVnIHRvIGRlYnVnZ2luZyBsZXZlbC4KLQkobWlwc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBDYWxsIG1pcHNfbG9jYWxfbGFiZWwuCi0JKG1pcHNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgotCi1XZWQgSnVsICA1IDAwOjU5OjIyIDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhcy5jIChtYWluKTogIE9ubHkgdXNlIHNicmsgd2hlbiBIQVZFX1NCUksgZGVmaW5lZC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCB0ZXN0IGZvciBzYnJrLgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB1c2luZyBhdXRvY29uZiAyLjQuCi0KLU1vbiBKdWwgIDMgMTU6NTg6MTYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBCdW1wIHRvIDYuCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlCi0JcmVsb2NhdGlvbnMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byAocG9zc2libHkgZXh0ZXJuYWwpCi0Jc3ltYm9scy4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IEZvciBTT00sIHJlamVjdCByZWR1Y3Rpb25zIGludm9sdmluZwotCXRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3IgZXhwcmVzc2lvbnMKLQlpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuCi0KLU1vbiBKdWwgIDMgMTQ6MjI6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlWy5pbl0gKGkzODYtKi13aW4zMik6IE5ldyBob3N0IGFuZCB0YXJnZXQuCi0KLVRodSBKdW4gMjkgMTc6MjU6NDMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIGxvbmcgZmlsZW5hbWVzIG5vbi1iZmQgY29mZi4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaWxlbmFtZV9saXN0X2hlYWQsIGZpbGVuYW1lX2xpc3RfdGFpbCk6IE5ldy4KLQkoeWFua19zeW1ib2xzKTogTm90aWNlIGFuZCByZWNvcmQgZmlsZW5hbWVzIHdoaWNoIGFyZSB0b28gbG9uZy4KLQkod19zdHJpbmdzKTogV3JpdGUgb3V0IGZpbGVuYW1lIHN0cmluZ3MuCi0JKGNfZG90X2ZpbGVfc3ltYm9scyk6IFB1dCBsb25nIGZpbGVuYW1lcyBvbnRvIGxpc3QuCi0KLVdlZCBKdW4gMjggMTc6MzM6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBQRSBkb2Vzbid0IHVzZQotCXRoZSBzdHJhbmdlIGNvbW1vbiBzeW1ib2wgZm9ybWF0IHRoYXQgb3RoZXIgMzg2cyBmb3JtYXRzCi0JZG8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9iZWdpbik6IElmIExFWF9BVCBkZWZpbmVkIHRoZW4KLQknQCcgaXMgaW4gdGhlIHNldCBvZiBpZGVudGlmaWVycy4KLQkoaTM4Nl9vcGVyYW5kKTogSWYgTEVYX0FULCB0aGVuIGRvbid0IGxvb2sgZm9yIEBnb3RvIHN0dWZmLgotCSogY29uZmlnL3RlLXBlLmg6IERlZmluZSBMRVhfQVQuCi0KLVdlZCBKdW4gMjggMTc6NDk6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChIOC81MDAgRmxvYXRpbmcgUG9pbnQpOiBJbmRpY2F0ZSB0aGF0IElFRUUgRlAKLQludW1iZXJzIGFyZSBmb3IgdGhlIHN0YW5kYXJkIGVtdWxhdGlvbiBjb2RlLgotCShTSCBGbG9hdGluZyBQb2ludCk6IERpdHRvLgotCShPdmVydmlldyk6IERlc2NyaWJlIG5ldyAtLWVtdWxhdGlvbiBvcHRpb24gZm9yIE1JUFMuCi0JKiBkb2MvKi5tNDogRGVsZXRlZC4KLQotVGh1IEp1biAyMiAxOToyNjoyNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU3VuIE1heSAgNyAxMTo1Mzo0MSBNRFQgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBpMzg2LSotbW9zcyogdGFyZ2V0LgotCi1UaHUgSnVuIDIyIDE0OjQxOjIzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYXN0IGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lCi0JYXJndW1lbnQgdG8gY2hhciAqIHRvIGF2b2lkIHdhcm5pbmcuCi0KLVdlZCBKdW4gMjEgMTg6MDc6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluc3dvcmQpOiBJbmNyZW1lbnQgdGhlIGZyYWcgb2Zmc2V0cy4KLQkoc3RydWN0IG02OGtfaXQpOiBBZGQgcmVsb2NbXS5wY3JlbF9maXggZmllbGQgdG8gaG9sZCBwYy1yZWwKLQlmaXh1cC4KLQkoYWRkX2ZpeCk6IEFjY2VwdCBhZGRpdGlvbmFsIHBhcmFtZXRlciwgdGhlIHBjLXJlbCBmaXh1cC4gQWxsCi0JY2FsbGVycyBjaGFuZ2VkLiAgRml4IG9mZnNldCBhZGRyZXNzIGlmIHdpZHRoID09ICdiJy4KLQkobTY4a19pcCkgW2Nhc2UgQUlORFhdOiBBbGxvdyBleHBsaWNpdCBzaXplIHNwZWMuICBEb24ndCBtYWtlIHRoZQotCW91dGVyIGRpc3BsYWNlbWVudCBwYy1yZWxhdGl2ZS4KLQkobWRfcGNyZWxfZnJvbSk6IE1ha2UgaXQgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGV4dGVuc2lvbiB3b3JkIG9mCi0JdGhlIG9wZXJhbmQuCi0JKG9wY29kZV9wdHIpOiBNYWtlIGl0IGEgbWFjcm8gaWYgRE9fQlJFQUtfVVBfQklHX0RFQ0wgaXMKLQl1bmRlZmluZWQuCi0JKG1kX2NvbnZlcnRfZnJhZ18xKTogRG9uJ3QgcmVmZXJlbmNlIGZyYWdQLT5mcl9vcGNvZGVbMi4uXS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpIFtjYXNlIFRBQiAoRkJSQU5DSCwgU1pfVU5ERUYpXToKLQlUdXJuIG9uIGxvbmcgYml0LgotCShtNjhrX2lwKSBbY2FzZSAnQyddOiBEb24ndCBzZXQgc2V0IGxvbmcgYml0LCBzZXQgaXQgaW4gdGhlIG9wY29kZQotIAl0YWJsZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpIFtjYXNlIFRBQiAoUENJTkRFWCwgU1pfVU5ERUYpXToKLQlWYXJpYWJsZSBwYXJ0IGluY3JlYXNlcyBieSBmb3VyLCBub3Qgc2l4LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCkgW1RDX002OEtdOiBEb24ndCBkbyBmdXJ0aGVyIHBjcmVsCi0JcHJvY2Vzc2luZyBhZnRlciBjb252ZXJ0aW5nIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlCi0Jc2FtZSBzZWdtZW50LgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgY29uZGl0aW9uYWxpemUgdGhlIHBjcmVsIGZpeCBvbgotCVRDX002OEsuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCwgY2FzZSAnQScpOiBJZiBBU0kgaXMgbm90IGEgIiMiCi0JdmFsdWUsIGRvbid0IHNoaWZ0IGl0IGFuIGV4dHJhIHRpbWUuCi0KLVdlZCBKdW4gMjEgMTQ6MTg6MzcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChkb19wcmludCwgZG9fZm9ybSwgYnVmZmVyX2FuZF9uZXN0KTogVXNlIGNhc2UgaW5zZW5zaXRpdmUKLQlzdHJpbmcgY29tcGFyZXMuCi0KLVR1ZSBKdW4gMjAgMTQ6NTU6MDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FzdCB0aW1lKCkgYXJndW1lbnQgdG8KLQl0aW1lX3QgKi4KLQotVHVlIEp1biAyMCAxMjowMDo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogRml4IHR5cG8gaW4gbGFzdAotCWNoYW5nZS4KLQotTW9uIEp1biAxOSAxNToyNzoxNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogWmVybyBvdXQgbWVtb3J5Ci0JZnJvbSBmcmFnX21vcmUgY2FsbHMuCi0KLVRodSBKdW4gMTUgMTY6NTM6MzcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogRG9uJ3QgdXNlICJiZmQvIiB3aGVuIGluY2x1ZGluZyBsaWJiZmQuaAotCWFuZCBsaWJjb2ZmLmguCi0JKGZpbGxfc2VjdGlvbik6IENhbGwgUFJPR1JFU1MuCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBBZGQgYmZkIHNyY2Rpci4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIGJmZF9nYXMgZmxhZyBhbmQgc2V0IGZvciBlYWNoIGNvbmZpZy4KLQkoaTM4Ni11bmtub3duLWdvMzIsIG02OGstdW5rbm93bi1jb2ZmKTogUmVjb2duaXplLgotCSogbXB3LW1ha2UuaW4gKEhBQ0tfT19SQU1BLCBPQkpfQ09GRl9PTUlUX1RJTUVTVEFNUCk6IEFkZCB0bwotCWNvbmZpZy5oLgotCi1UaHUgSnVuIDE1IDEwOjA0OjI2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoTE9DQUxfTEFCRUwpOiBQcmVwZW5kICcuJyBpZiBub3QgT0JKX0FPVVQuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDEyIDIyOjI1OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IENoZWNrIGZvciBpbnZhbGlkIHJlZ2lzdGVyIGluIHNpbmdsZQotCXByZWNpc2lvbiBmbXB5YWRkIGFuZCBmbXB5c3ViIGluc3RydWN0aW9ucy4KLQotVGh1IEp1biAgOCAxOTozMzowMiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAobXluYW1lKTogRGVsZXRlIGFsbCByZWZlcmVuY2VzLgotCShWTVNfc3RhYl9wYXJzZSwgV3JpdGVfVk1TX01IRF9SZWNvcmRzLCBWTVNfQ2FzZV9IYWNrX1N5bWJvbCk6Ci0JUmVwbGFjZSBwcmludGYgY2FsbHMgd2l0aCBhc190c2t0c2suCi0JKFBVVF9MT05HLCBQVVRfU0hPUlQpOiBVc2UgQ09QWV9MT05HLCBDT1BZX1NIT1JULgotCShWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEpOiBNb3ZlIHNlY29uZCBidWZmZXIgY2FwYWNpdHkgY2hlY2sKLQliZWxvdyBib3R0b20gb2YgbG9vcDsgZmlyc3QgY2hlY2sgYXQgdG9wIHN1ZmZpY2VzIGZvciBsb29wIGl0c2VsZi4KLQkoZmluZF9maWxlKTogUmVtb3ZlIHJlZHVuZGFudCBwb2ludGVyIGNoZWNrcyBpbiBmaXJzdCB0d28gbG9vcHM7Ci0JcmVwbGFjZSB0aGlyZCBsb29wIHdpdGggcG9pbnRlciB0byBsYXN0IGxpc3QgZWxlbWVudCBkZXRlcm1pbmVkCi0JaW4gZmlyc3QgbG9vcC4KLQotVHVlIEp1biAgNiAxMzo1MzowNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBIYW5kbGUgZGVmaW5lZCBhYnNvbHV0ZSBzeW1ib2xzIGFzCi0JQVNJIHZhbHVlcy4KLQotCSogY29uZmlnL29iai12bXMuYyAodm1zX3dyaXRlX29iamVjdF9maWxlLCBjYXNlIE5fREFUQSk6IFVzZQotCXN0cmNtcCBhZ2FpbnN0IEZBS0VfTEFCRUxfTkFNRSBpbnN0ZWFkIG9mIGNoZWNraW5nIHRoaXJkCi0JY2hhcmFjdGVyLiAgKFN1Z2dlc3RlZCBieSBQYXQgUmFua2luLikKLQotTW9uIEp1biAgNSAyMDoxMDo0NiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCUFkZCBzdXBwb3J0IGZvciBOX0FCUyBhbmQgTl9BQlN8Tl9FWFQgdHlwZSBzeW1ib2xzLgotCi0JKiBjb25maWcvb2JqLXZtcy5oIChMU1lfU19NX3tERUYsUkVMfSwgRU5WX1NfTV97REVGLE5FU1RFRH0pOgotCU5ldyBtYWNyb3MgZm9yIGxvY2FsIHN5bWJvbHMgKGZyb20gPGxzeWRlZi5oPiBhbmQgPGVudmRlZi5oPikuCi0JKiBjb25maWcvb2JqLXZtcy5jIChDdXJyZW50X0Vudmlyb25tZW50KTogTmV3IGZpbGUtc2NvcGUgdmFyaWFibGUuCi0JKFZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCk6IE5ldyByb3V0aW5lLgotCShHQkxTWU1fTENMKTogTmV3IG1hY3JvLgotCShWTVNfR2xvYmFsX1N5bWJvbF9TcGVjKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMgdG9vLgotCShWTVNfUHNlY3RfU3BlYyk6IFNldCBHTE9CQUxWQUxVRV9CSVQgZm9yIGFic29sdXRlIHN5bWJvbHMuCi0JKFZNU19FbWl0X0dsb2JhbHZhbHVlcyk6IEhhbmRsZSBsb2NhbCBhbmQgZ2xvYmFsIGFic29sdXRlIHN5bWJvbHMuCi0JKFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSk6IERpdHRvLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IEdTRCBzeW1ib2wgbG9vcCk6IERpdHRvLgotCi1Nb24gSnVuICA1IDE2OjEwOjQwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCi1Nb24gSnVuICA1IDAyOjE3OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IEFsd2F5cyB1c2UgR05VIEVMRiBjb25maWcuCi0KLVdlZCBNYXkgMzEgMTc6NDk6MTggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBVcGRhdGUgKnN5bWJvbFBQCi0JaW4gYGVsc2UnIGNsYXVzZSB3aGVuIHJlbW92aW5nIGEgc3ltYm9sLiAgQWxzbywgcmV2aXNlIGNvbW1lbnRzCi0JdG8gbWF0Y2ggdGhlIGNvZGUuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSAoR1NEIHN5bWJvbCBsb29wLCBjYXNlIE5fREFUQSkpOiBOZXZlcgotCW91dHB1dCBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIGxvY2FsIG51bWVyaWMgbGFiZWxzLgotCi1UdWUgTWF5IDMwIDE4OjI5OjEwIDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogY29uZmlndXJlLmluIChhcmNoaXRlY3R1cmUgdmFyaWFudHMsIGNhc2VzIGFybWViIGFuZCBhcm0qKTogUmVtb3ZlCi0Jc3BhY2VzIHJvdW5kIGFzc2lnbm1lbnQgdG8gZW5kaWFuLgotCi1UdWUgTWF5IDMwIDEyOjMxOjMxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgZm9yIHVuZGVmaW5lZCBsb2NhbCBkb2xsYXIKLQlhbmQgZmIgbGFiZWxzLgotCi0JKiBzeW1ib2xzLmMgKGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lKTogRXh0cmFjdCBpbnN0YW5jZSBudW1iZXIKLQlmcm9tIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgotCi1TYXQgTWF5IDI3IDIxOjI4OjQ5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RlLWRweDIuaDogSW5jbHVkZSBvYmotZm9ybWF0LmguCi0JKENPRkZfTUFHSUMpOiBSZW5hbWVkIGZyb20gRklMRV9IRUFERVJfTUFHSUMuCi0KLVdlZCBNYXkgMjQgMTM6NDU6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW4sIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmYuaDoKLQlBZGQgc3VwcG9ydCBmb3IgQVJNIHBlCi0KLVR1ZSBNYXkgMjMgMTc6MDA6MzIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNgotCWFuZCBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOS4KLQotVHVlIE1heSAyMyAxOToxODozMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKSBbISBVU0VfRU1VTEFUSU9OU106IEFsd2F5cyBwcmludCBhbiBlcnJvcgotCW1lc3NhZ2UuCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRG9jdW1lbnQgb2JqX2FwcF9maWxlIGFuZAotCVRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCi1Nb24gTWF5IDIyIDIwOjAzOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBBZGQgZXh0cmEgbGVhZGluZyBhcmd1bWVudCwgZm9yIDQgTWF5Ci0JY2hhbmdlLgotCSogZWNvZmYuaCAoZWNvZmZfc3RhYik6IEZpeCBkZWNsYXJhdGlvbi4KLQkqIG9iai5oIChmb3JtYXRfb3BzLnByb2Nlc3Nfc3RhYik6IEluY2x1ZGUgcHJvdG90eXBlLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1BST0NFU1NfU1RBQik6IFBhc3MgdGhyb3VnaCBzZWcgYXJndW1lbnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9QUk9DRVNTX1NUQUIpOiBEaXR0by4KLQotCSogY29uZmlnL2UtbWlwc2VsZi5jIChtaXBzZWxmKTogTmV3IGVtdWxhdGlvbiBtb2RlLCBkb2Vzbid0IGNoYW5nZQotCWVuZGlhbm5lc3MgZnJvbSBjb25maWd1cmVkIGRlZmF1bHQuCi0JKiBjb25maWcvZS1taXBzZWNvZmYuYyAobWlwc2Vjb2ZmKTogRGl0dG8uCi0JKiBjb25maWd1cmUuaW4gKG1pcHMgZWNvZmYvZWxmIHRhcmdldHMpOiBJbmNsdWRlIHRoZW0uCi0JKiBhcy5jIChtaXBzZWxmLCBtaXBzZWNvZmYpOiBEZWNsYXJlLgotCi0JKiBhcy5jIChlbXVsYXRpb25fbmFtZSk6IE5ldyB2YXJpYWJsZS4KLQkoc2VsZWN0X2VtdWxhdGlvbl9tb2RlKTogU2V0IGVtdWxhdGlvbl9uYW1lLiAgRG9uJ3QgY2hhbmdlIGFyZ3YuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1lbXVsYXRpb247IGNvbXBsYWluIGlmIHRoZSBzdXBwbGllZCBuYW1lCi0JaXNuJ3Qgd2hhdCBzZWxlY3RfZW11bGF0aW9uX25hbWUgY2FtZSB1cCB3aXRoLgotCi1TdW4gTWF5IDIxIDIxOjM2OjE3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBSZXZlcnNlIGNoYW5nZXMgZnJvbSBEZWMuIDE5dGggd2hpY2gKLQljaGFuZ2VkIHRoZSB3YXkgdW53aW5kcyB3ZXJlIGJ1aWx0IGZvciBFTEYuICBSZWx5IG9uIHJlbG9jYXRpb24KLQlzeW1ib2wgcmVkdWN0aW9ucyB0byBhdm9pZCBwbGFjaW5nIHRoZSBlbmQgb2YgZnVuY3Rpb24gbWFya2VyCi0Jc3ltYm9scyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4KLQotU2F0IE1heSAyMCAxMjozMTozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlBZGRlZCBpbXByb3ZlZCBWTVMgc3VwcG9ydCBmcm9tIFBhdCBSYW5raW46Ci0KLQlGcmkgMTkgTWF5IDE2OjUxOjQwIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChBT1VUX1NUQUJTKTogRGVmaW5lLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChmcHVzaCwgcnB1c2gpOiBOZXcgcm91dGluZXMuCi0JKHB1c2gpOiBSZXBsYWNlZCBieSB0aGUgYWJvdmUuCi0JKGZpbmRfc3ltYm9sKTogU2xpZ2h0IHJlb3JnYW5pemF0aW9uIHRvIGV4cG9zZSB0YWlsIHJlY3Vyc2lvbi4KLQotCUZyaSBNYXIgMTcgMTg6NDA6MzYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6ICBkZWxldGUgdGhpcy4KLQkqIHZtc2NvbmYuc2ggKG1ha2UtZ2FzLmNvbSk6ICBidWlsZCAuLi9saWJpYmVydHkvbGliZXJ0eS5vbGIKLQlmaXJzdCBpZiBuZWNlc3Nhcnk7IGxpbmsgZ2FzIGFnYWluc3QgaXQuCi0KLUZyaSBNYXkgMTkgMTY6Mzc6MzkgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBnYXNwLmMgKGlzdHJ1ZSk6IENvcnJlY3RseSB0ZXN0IGZvciBzdHJpbmcgaW5lcXVhbGl0eS4KLQotVGh1IE1heSAxOCAwNDoyNToxMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBjb25maWcvdGMtYXJtLmMgKENQX1Rfe1ByZSxVRCxXQn0pOiBEZWZpbmUsIGJpdHMgaW4gY28tcHJvY2Vzc29yCi0JaW5zdHJ1Y3Rpb25zLgotCShbbHNdZm1fZmxhZ3MpOiBDb3JyZWN0IGVycm9yIGluIGJpdG1hc2tzLgotCShjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBEZWxldGUgc2Vjb25kIHBhcmFtZXRlciwgRkxBR1MuICBBbGwKLQljYWxsZXJzIGNoYW5nZWQuICBSZW1vdmUgYWxsIGRlYWQgY29kZSByZWZlcnJpbmcgdG8gRkxBR1MuICBJZgotCWFkZHJlc3MgaXMganVzdCAiW1JlZ10iIHRoZW4gY29udmVydCBpbnRvIGEgUFJFLUlOQ1JFTUVOVCBVUCBmb3JtYXQuCi0JKGRvX2ZwX2xkbXN0bSk6IEhhbmRsZSBmdWxsLWRlc2NlbmRpbmcgYW5kIGVtcHR5LWFzY2VuZGluZyBzdGFjawotCWZvcm1hdHMgZXhwbGljaXRseS4KLQotCSogY29uZmlnL3RjLWFybS5jIChpbnRlcm5hbEVycm9yKTogRGVmaW5lLgotCShBUk1fezEsMiwyNTAsMyw2LDcsN0RNLEFOWSwyVVAsQUxMLDNVUCw2VVAsTE9OR01VTH0pOiBEZWZpbmUgcHJvY2Vzc29yCi0JdmFyaWFudHMuCi0JKEZQVV97Q09SRSxGUEExMCxGUEExMSxOT05FLEFMTCxNRU1NVUxUSX0pOiBEZWZpbmUgZmxvYXRpbmcgcG9pbnQKLQl2YXJpYW50cy4KLQkoe0NQVSxGUFV9X0RFRkFVTFQpOiBEZWZpbmUuCi0JKGNwdV92YXJpYW50KTogTmV3IHZhcmlhYmxlLgotCShhc21fZmxnKTogQ2hhbmdlIG1vcmVfZmxhZ3MgdG8gZmxhZ19iaXRzLgotCUFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLgotCShGTEFHX3tTLFAsQixULEVELEZELEZBLEVBLElCLElBLERCLERBLEx9KTogRGVsZXRlLgotCShzX2ZsYWdbXSwgbGRzdF9mbGFnc1tdLCBieXRlX2ZsYWdbXSwgY21wX2ZsYWdzW10sIGxkbV9mbGFnc1tdLAotCSBzdG1fZmxhZ3NbXSwgbGZtX2ZsYWdzW10sIHNmbV9mbGFnc1tdLCByb3VuZF9mbGFnc1tdLCBleGNlcHRfZmxhZ3NbXSwKLQkgY3Bsb25nX2ZsYWdbXSk6IE5ldyB2YXJpYWJsZXMuCi0JKGFzbV9vcGNvZGUsIGluc25zW10pOiBOZXcgZm9ybWF0LCBhZGQgdmVyc2lvbiBzdXBwb3J0LgotCShhcm1fZmxnX2hzaCk6IERlbGV0ZS4KLQkoZG9fbXVsLCBkb19tbGEpOiBSZW1vdmUgIldhcm5pbmciIGZyb20gd2FybmluZyBtZXNzYWdlcy4KLQkoZG9fYXJpdCk6IFNpbXBsaWZ5LgotCShkb19zd2FwKTogTWFrZSBlcnJvciBtZXNzYWdlIG1vcmUgYXBwcm9wcmlhdGUuCi0JKG1kX2JlZ2luKTogQnVpbGQgaGFzaCB0YWJsZXMgc3RhcnRpbmcgYXQgZmlyc3QgZW50cnkgaW4gdGFibGVzLgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBDb3BlIHdpdGggYmlnL2xpdHRsZS1lbmRpYW4gc2VsZWN0aW9uLgotCShtZF9jaGFyc190b19udW1iZXIpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IFJld3JpdGUgdG8gbWFrZSBlbmRpYW4gaW5kZXBlbmRlbnQuCi0JKHRjX2dlbl9yZWxvYyk6IEJldHRlciBlcnJvciBtZXNzYWdlcy4KLQkobWRfYXNzZW1ibGUpOiBSZWplY3Qgb3Bjb2RlcyBmb3JiaWRkZW4gYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjcHUKLQl2YXJpYW50LiAgUmV3cml0ZSBoYW5kbGluZyBjb2RlIGZvciBpbnN0cnVjdGlvbiBmbGFncy4KLQkobWRfc2hvcnRvcHRzKTogQWRkIG9wdGlvbiAibToiLgotCShtZF9wYXJzZV9vcHRpb24pOiBHZXQgdGhlIGRlc2lyZWQgY3B1L2ZwdSB2YXJpYW50LgotCi0JRnJvbTogRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQkqIGNvbmZpZ3VyZS5pbiAoYXJjaGl0ZWN0dXJlIHZhcmlhbnRzKTogQ2hlY2sgZm9yICJhcm1lYiIgYW5kICJhcm0qIiwKLQlzZXQgZW5kaWFubmVzcyBhY2NvcmRpbmdseS4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogTmV3IGhvb2tzIG1kX3N0YXJ0X2xpbmVfaG9vayBhbmQKLQltZF9hZnRlcl9wYXNzX2hvb2suCi0JKiBjb25maWcvYXJtLXtiaWcsbGl0fS5tdDogTmV3IGZpbGVzCi0JKiBjb25maWcvdGMtYXJtLmggKHtMSVRUTEUsQklHfV9FTkRJQU4sIEJZVEVfT1JERVIpOiBEZWZpbmUuCi0JKFRBUkdFVF9GT1JNQVQpOiBTZWxlY3QgZGVwZW5kaW5nIG9uIGVuZGlhbm5lc3MgYW5kIGVtdWxhdGlvbiBhbmQKLQlvYmplY3QgZm9ybWF0LgotCShtZF9hZnRlcl9wYXNzX2hvb2ssIG1kX3N0YXJ0X2xpbmVfaG9vayk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uYzogSW5jbHVkZSBzdWJzZWdzLmgsIHN5bWJvbHMuaCBhbmQgbGlzdGluZy5oLgotCShzaGlmdFtdKTogQWRkIHVwcHBlciBjYXNlIGVxdWl2YWxlbnRzLgotCShDUF9UX1tYWV0sIFRSQU5TX0JJVCk6IERlZmluZS4KLQkoY29uZHNbXSk6IERlbGV0ZSBpbml0aWFsIE5VTEwgZW50cnksIGFkZCAibG8iIGVudHJ5IGFzIHN5bm9ueW0gZm9yCi0JImNjIi4KLQkoTE9OR0VTVF9GTEFHLCBmbGFnc1tdKTogRGVsZXRlLgotCShhcm1fcHNyKTogTmV3IHN0cnVjdHVyZS4KLQkocHNyc1tdKTogTmV3IHZhcmlhYmxlLgotCShQU1JfQUxMKTogRGVmaW5lLgotCShMT05HRVNUX0lOU1QpOiBCdW1wIHRvIDUuCi0JKExJVEVSQUxfTUFTSywgQ09ORF9NQVNLLCBPUENPREVfTUFTSywgREFUQV9PUF9TSElGVCk6IERlZmluZS4KLQkoT1BDT0RFX3tBTkQsRU9SLFNVQixSU0IsQURELEFEQyxTQkMsUlNDLFRTVCxURVEsQ01QLENNTixPUlIsTU9WLEJJQywKLQkgTVZOfSk6IERlZmluZS4KLQkoaW5zbnNbXSk6IEFkZCBzbXVsbCwgdW11bGwsIHNtbGFsLCB1bWxhbCwgbGRmbSwgc3RmbSwgbXNyIGFuZCBtcnMKLQlpbnN0cnVjdGlvbnMuICBBZGQgbm9wIGFuZCBhZHIgcHNldWRvIG9wcy4KLQkocmVnX3RhYmxlKTogQWRkIEFQQ1MgcmVnaXN0ZXIgbmFtZSB2YXJpYW50cy4KLQkoYXJtX3Bzcl9oc2gpOiBOZXcgaGFzaCB0YWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkICJsdG9yZyIsICJwb29sIiwgImV4dGVuZCIsICJsZG91YmxlIiBhbmQKLQkicGFja2VkIi4KLQkoTUFYX0xJVEVSQUxfUE9PTF9TSVpFKTogRGVmaW5lLgotCShzdHJ1Y3QgbGl0ZXJhbFMpOiBOZXcgc3RydWN0dXJlLgotCShsaXRlcmFscywgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UsIGxpdF9wb29sX251bSwgY3VycmVudF9wb29sUCk6IE5ldwotCXZhcmlhYmxlcy4KLQkoYWRkX3RvX2xpdF9wb29sLCBzeW1ib2xfbG9jYXRlLCBzeW1ib2xfbWFrZV9lbXB0eSk6IE5ldyBmdW5jdGlvbnMuCi0JKHZhbGlkYXRlX2ltbWVkaWF0ZSk6IFJldHVybiBGQUlMIG9uIGZhaWx1cmUuCi0JKHNfbHRvcmcpOiBOZXcgZnVuY3Rpb24uCi0JKHBzcl9yZXF1aXJlZF9oZXJlLCBwc3JmX3JlcXVpcmVkX2hlcmUpOiBOZXcgZnVuY3Rpb25zLgotCShjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBOZXcgcGFyYW1ldGVyLCBmbGFnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgotCUlmIGZsYWcgaXMgbm9uLXplcm8sIHJlc3RyaWN0IHRoZSBsZWdhbCBhZGRyZXNzaW5nIG1vZGVzLgotCShkb19ub3AsIGRvX21ycywgZG9fbXNyLCBkb19tdWxsKTogTmV3IGZ1bmN0aW9ucy4KLQkobmVnYXRlX2RhdGFfb3ApOiBOZXcgZnVuY3Rpb24uCi0JKGRhdGFfb3AyKTogYWNjZXB0ICN4LHkgbWVhbmluZyB4IHJvdGF0ZWQgcmlnaHQgYnkgeSwgYnV0IG9ubHkgd2hlbgotCXN1aXRhYmxlIGNvbnN0YW50cy4gIElmIGltbWVkaWF0ZSBpcyBub3QgbGVnYWwsIHRyeSBjaGFuZ2luZyB0aGUKLQlvcGNvZGUuCi0JKGRvX2Fkcik6IE5ldyBmdW5jdGlvbi4KLQkoZG9fbGRzdCk6IGFjY2VwdCAibGRyIHJlZywgPWV4cHIiLiAgUHV0IGV4cHIgaW4gdGhlIHBvb2wgaWYgaXQgY2FuJ3QKLQliZSBkb25lIGFzIGFuIGltbWVkaWF0ZS4KLQkoZG9fZnBfbGRzdCk6IFVzZSBDUF9UX1tYWV0sIG5vdCBpbW1lZGlhdGUgdmFsdWVzLgotCShkb19mcF9sZG1zdG0pOiBOZXcgZnVuY3Rpb24uCi0JKGFybV9wc3JfcGFyc2UpOiBOZXcgZnVuY3Rpb24uCi0JKG91dHB1dF9pbnN0KTogVXNlIElOU05fU0laRSBpbiBjYWxsIHRvIG1kX251bWJlcl90b19jaGFycy4KLQkobWRfYXNzZW1ibGUpOiBBZGQgaGFjayBzbyB0aGF0ICJMYWJlbCBpbnN0cnVjdGlvbiIgY2F1c2VzIGFsaWdubWVudCBvZgotCXRoZSBsYWJlbC4KLQkoYXJtX2FmdGVyX3Bhc3NfaG9vaywgYXJtX3N0YXJ0X2xpbmVfaG9vaywgYXJtX2Zyb2Jfc3ltYm9sKTogTmV3Ci0JZnVuY3Rpb25zLgotCi1XZWQgTWF5IDE3IDA1OjI1OjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9zaG93X3VzYWdlKTogQWRkIFwncyBhdCBlbmQgb2YgbGluZXMgaW4KLQlzdHJpbmdzIGZvciBub24tR0NDIGNvbXBpbGVycy4KLQotVHVlIE1heSAxNiAxOTozNjowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3BvcF9pbnNlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2Zvcm1hdF9vcHMpOiBVc2UgaXQuCi0JKG9ial9lY29mZl9mcm9iX3N5bWJvbCk6IE5vdyBzdGF0aWMuCi0KLVdlZCBNYXkgMTcgMDA6NTk6MTIgMTk5NSAgQW5kcmV3IENhZ25leSAtIGFrYSBOb2lkICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9iZWdpbik6IFdhcyBhc3N1bWluZyB0aGF0IGFuIGluc3RydWN0aW9uIHdhcwotCWJpZ2VuZGlhbiBhbmQgaGVuY2UgMTZiaXQgcmVsb2NzIHdpdGhpbmcgaW5zdHJ1Y3Rpb25zIHdvdWxkCi0JQUxXQVlTIGJlIGF0IGFkZHJlc3NlcyBpKzItaSszLiAgSW4gTEUgbW9kZSBpdCBpcyBpKzAtaSsxLgotCi1UdWUgTWF5IDE2IDE2OjI5OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAob2JqX2Zyb2Jfc3ltYm9sLCBvYmpfZnJvYl9maWxlLCBTX0dFVF9TSVpFLAotCVNfU0VUX1NJWkUsIFNfR0VUX0FMSUdOLCBTX1NFVF9BTElHTiwgb2JqX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsCi0JT0JKX1BST0NFU1NfU1RBQik6IE5ldyBtYWNyb3MuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBQcm90ZWN0IGFnYWluc3QgcmVkZWZpbmluZyB0aGVtIGFsc28gd2hlbgotCWluY2x1ZGluZyBvYmotZWxmLmguICBUZXN0IG9ubHkgT0JKX0VMRiBmb3IgaW5jbHVkaW5nIGVsZi9taXBzLmguCi0JKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogTmV3IGZ1bmN0aW9uLiAgU2V0IGJ5dGVfb3JkZXIgaGVyZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTm90IGhlcmUuCi0JKGJ5dGVfb3JkZXIpOiBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBEZWNsYXJlLgotCSh0Y19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgbWFjcm8uCi0KLQkqIHJlYWQuYyAoc19sY29tbSk6IERvIEVMRi9FQ09GRiB0ZXN0IGF0IHJ1biB0aW1lLCBub3QgY29tcGlsZQotCXRpbWUuCi0KLUZyaSBNYXkgMTIgMTQ6MTc6NDcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUEUgb2JqZWN0IGZpbGVzLgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmUgKGkzODYtKi1wZSwgaTM4Ni0qLSpudCk6IEFkZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ29wZSB3aXRoIFBFIHdpZXJkbmVzcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChURV9QRSk6IE5ldyB0YXJnZXQgZm9ybWF0LgotCi1UaHUgTWF5IDExIDE0OjU4OjIxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKE5FRURfRUNPRkZfREVCVUcpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HCi0Jd2FzIGRlZmluZWQgYnkgaGVhZGVyIGZpbGVzLiAgVGVzdCBpbiBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzCi0JaW5zdGVhZCBvZiBFQ09GRl9ERUJVR0dJTkcuCi0JKGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZSk6IE1ha2UgZW1wdHkgaWYgTkVFRF9FQ09GRl9ERUJVRyBpcyBub3QKLQlkZWZpbmVkLgotCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rLCBlbGZfZnJvYl9zeW1ib2wsCi0JZWxmX2Zyb2JfZmlsZSk6IE9ubHkgY2FsbCBlY29mZiByb3V0aW5lcyBpZiBORUVEX0VDT0ZGX0RFQlVHIGlzCi0JZGVmaW5lZC4KLQkoZWxmX2Vjb2ZmX3NldF9leHQsIGVsZl9nZXRfZXh0ciwgZWxmX3NldF9pbmRleCk6IERlZmluZSBvbmx5IGlmCi0JTkVFRF9FQ09GRl9ERUJVRyBpcyBkZWZpbmVkLgotCShlbGZfZm9ybWF0X29wcyk6IFJlZmVyZW5jZSBlbGZfZWNvZmZfc2V0X2V4dCBvbmx5IGlmCi0JTkVFRF9FQ09GRl9ERUJVRy4KLQotV2VkIE1heSAxMCAxODowOToxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoT0JKUyk6IEluY2x1ZGUgQGV4dHJhX29iamVjdHNALgotCShvYmotZWxmLm8sIG9iai1lY29mZi5vLCBlLW1pcHNlbGYubywgZS1taXBzZWNvZmYubyk6IE5ldyBydWxlcwotCWZvciBidWlsZGluZyB0aGVzZSBpbmRlcGVuZGVudGx5LgotCSogZW11bC10YXJnZXQuaCwgY29uZmlnL2UtbWlwc2VsZi5jLCBjb25maWcvZS1taXBzZWNvZmYuYzogTmV3Ci0JZmlsZXMuCi0KLQkqIGFjY29uZmlnLmggKERFRkFVTFRfRU1VTEFUSU9OLCBFTVVMQVRJT05TLCBVU0VfRU1VTEFUSU9OUywKLQlPQkpfTUFZQkVfKiwgSTM4NkNPRkYsIE02OEtDT0ZGLCBNODhLQ09GRik6IE5ldyBtYWNyb3MuCi0JKiBhY2xvY2FsLm00IChHQVNfVU5JUSk6IE5ldyBtYWNyby4KLQotCSogYXMuYyAoZW11bGF0aW9ucywgbl9lbXVsYXRpb25zKSBbVVNFX0VNVUxBVElPTlNdOiBOZXcgdmFyaWFibGUuCi0JKHNlbGVjdF9lbXVsYXRpb25fbW9kZSwgZGVmYXVsdF9lbXVsX2JmZF9uYW1lLCBjb21tb25fZW11bF9pbml0KQotCVtVU0VfRU1VTEFUSU9OU106IE5ldyBmdW5jdGlvbnMuCi0JKG1haW4pIFtVU0VfRU1VTEFUSU9OU106IENhbGwgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIGJlZm9yZSBvdGhlcgotCWluaXRpYWxpemF0aW9uLgotCSogZW11bC5oOiBOZXcgZmlsZS4KLQkqIGFzLmggW1VTRV9FTVVMQVRJT05TXTogSW5jbHVkZSBpdC4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgZW5hYmxlLXRhcmdldHMgb3B0aW9uLiAgSXRlcmF0ZSBvdmVyIHRhcmdldAotCWxpc3QsIGJ1aWxkaW5nIHVwIGEgbGlzdCBvZiBvYmplY3QgZmlsZSBmb3JtYXRzIGFuZCBlbXVsYXRpb24KLQljb25maWd1cmF0aW9ucy4gIChPbmx5IHN1cHBvcnRzIGVtdWxhdGlvbnMgZm9yIE1JUFMgQ1BVIHNvIGZhci4pCi0JSWYgbXVsdGlwbGUgZm9ybWF0cyBhcmUgbmVlZGVkLCBzZXQgb2JqX2Zvcm1hdCB0byBtdWx0aSBhbmQgYWRkCi0JZm9ybWF0IGNvbmZpZyBmaWxlcyB0byBleHRyYV9maWxlcy4gIElmIGVtdWxhdGlvbiBtb2RlcyBhcmUKLQluZWVkZWQsIGFkZCB0aGUgcmVsZXZhbnQgZmlsZXMgdG8gZXh0cmFfZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEkzODZDT0ZGLCBNNjhLQ09GRiwgTTg4S0NPRkYgZm9yIHRob3NlCi0JY29uZmlndXJhdGlvbnMuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBGaWxlbmFtZSBhcmd1bWVudCBub3cKLQlwb2ludHMgdG8gY29uc3QuCi0JKiBlY29mZi5oIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogVXBkYXRlZCBkZWNsYXJhdGlvbi4KLQotCSogb2JqLmggKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEb24ndCBkZWNsYXJlIGZ1bmN0aW9uIGlmIGl0J3MKLQlhbHJlYWR5IGEgbWFjcm8uCi0KLQkqIHJlYWQuYyAoc19zcGFjZSwgY29ucywgc3RyaW5nZXIpOiBJZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpcwotCWRlZmluZWQsIGNhbGwgaXQgb24gZW50cnkuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBJZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotCWlzIGRlZmluZWQsIGNhbGwgaXQgb24gZW50cnkuICBJZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBpcwotCWRlZmluZWQsIGNhbGwgaXQgYmVmb3JlIHJldHVybmluZyBub3JtYWxseS4KLQotCSogcmVhZC5oICh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUuCi0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IEFkZGVkIG5ldyBmdW5jdGlvbiBwb2ludGVyIGZpZWxkcwotCWVjb2ZmX3NldF9leHQsIHJlYWRfYmVnaW5faG9vaywgc3ltYm9sX25ld19ob29rLgotCShlY29mZl9mb3JtYXRfb3BzLCBlbGZfZm9ybWF0X29wcyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc19nZXRfc2l6ZSwgZWxmX3Nfc2V0X3NpemUsCi0JZWxmX3NfZ2V0X2FsaWduLCBlbGZfc19zZXRfYWxpZ24sIGVsZl9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLAotCWVsZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKGVsZl9mb3JtYXRfb3BzKTogTmV3IHZhcmlhYmxlLgotCShlbGZfZnJvYl9zeW1ib2wpOiBOb3cgdGFrZXMgYWRkaXRpb25hbCBpbnQqIGFyZ3VtZW50LgotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX2Zyb2Jfc3ltYm9sKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShlbGZfcG9wX2luc2VydCk6IERlY2xhcmUuCi0JKG9ial9wb3BfaW5zZXJ0KTogRGVmaW5lIHRvIGNhbGwgZWxmX3BvcF9pbnNlcnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jLAotCW9ial9lY29mZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2Zvcm1hdF9vcHMpOiBOZXcgdmFyaWFibGUuCi0KLQkqIGNvbmZpZy90ZS1nZW5lcmljLmg6IElmIE9CSl9IRUFERVIgaXMgZGVmaW5lZCwgdXNlIGl0IGFzIHRoZQotCWZpbGVuYW1lIHRvIGluY2x1ZGUgaW4gcGxhY2Ugb2Ygb2JqLWZvcm1hdC5oLgotCSogY29uZmlnL3RlLW11bHRpLmg6IE5ldyBmaWxlLCBjb3BpZWQgZnJvbSB0ZS1nZW5lcmljLmguCi0JKiBjb25maWcvb2JqLWVsZi5jIChPQkpfSEVBREVSKTogRGVmaW5lIGl0IHRvICJvYmotZWxmLmgiLgotCSogY29uZmlnL29iai1lY29mZi5jIChPQkpfSEVBREVSKTogRGVmaW5lIGl0IHRvICJvYmotZWNvZmYuaCIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKEVDT0ZGX0RFQlVHR0lORyk6IERlZmF1bHQgdG8gMC4KLQkob2JqX3JlYWRfYmVnaW5faG9vaywgb2JqX3N5bWJvbF9uZXdfaG9vaywgZWxmX2Zyb2Jfc3ltYm9sLAotCWVsZl9mcm9iX2ZpbGUpOiBUZXN0IGl0IGF0IHJ1biB0aW1lLgotCShvYmpfZWNvZmZfc2V0X2V4dCwgZWxmX2dldF9leHRyLCBlbGZfc2V0X2luZGV4KTogRGVmaW5lCi0JdW5jb25kaXRpb25hbGx5LgotCShlbGZfcHNldWRvX3RhYmxlKTogUmVuYW1lZCBmcm9tIG9ial9wc2V1ZG9fdGFibGUsIG5vdyBzdGF0aWMuCi0JKGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZSk6IFNwbGl0IG9mZiBpbnRvIHNlcGFyYXRlIHRhYmxlLiAgRGVmaW5lCi0JaXQgdW5jb25kaXRpb25hbGx5LgotCShlbGZfcG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkob2JqX3BvcF9pbnNlcnQpOiBOZXcgbWFjcm8uCi0JKG9ial9lY29mZl9zZXRfZXh0KSBbIU9CSl9NQVlCRV9FTEZdOiBEZWZpbmUgdG8gZWxmX2Vjb2ZmX3NldF9leHQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9lY29mZl9zZXRfZXh0KTogRGVmaW5lIHRvIGVjb2ZmX3NldF9leHQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCShtaXBzX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgotCShtZF9wb3BfaW5zZXJ0KTogQ2FsbCBpdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogSWYgT0JKX01BWUJFX0VMRiBpcyBkZWZpbmVkLCBpbmNsdWRlCi0Jb2JqLWVsZi5oLCBidXQgcHJlc2VydmUgT1VUUFVUX0ZMQVZPUiBhbmQgcHJvdGVjdCBzb21lIG90aGVyCi0JbWFjcm9zIGZyb20gcmVkZWZpbml0aW9uLgotCShFQ09GRl9ERUJVR0dJTkcpOiBEZWZhdWx0IHRvIDAuICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkIHRvCi0JcnVuLXRpbWUgdGVzdHMgb3IgbWFkZSB1bmNvbmRpdGlvbmFsLgotCShzX3N0cmluZ2VyLCBzX21pcHNfc3BhY2UsIHNfZWxmX3NlY3Rpb24pOiBEZWxldGVkLgotCShtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCByZWZlciB0byB0aGVtLiAgU3BsaXQgdGFibGUgaW50byB0aHJlZQotCXNlY3Rpb25zLCBmb3IgTUlQUywgbm9uLUVDT0ZGX0RFQlVHR0lORywgYW5kIEVMRi4KLQkobWlwc19wb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VuYWJsZV9hdXRvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkobWRfcG9wX2luc2VydCk6IE5ldyBtYWNyby4KLQkobWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlY2xhcmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IG1hY3JvLgotCShtaXBzX2VuYWJsZV9hdXRvX2FsaWduKTogRGVjbGFyZS4KLQkobWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgbWFjcm8sIGNhbGxzCi0JbWlwc19lbmFibGVfYXV0b19hbGlnbi4KLQotVHVlIE1heSAgOSAxNzowNzo0MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCi0JKiBjb25maWcvcHBjLWJpZy5tdDogTmV3IGZpbGUgZm9yIGJpZyBlbmRpYW4gUG93ZXJQQyBzeXN0ZW1zLgotCSogY29uZmlnL3BwYy1saXQubXQ6IE5ldyBmaWxlIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3lzdGVtcy4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWFsIHdpdGggbGl0dGxlIGFuZCBiaWcgZW5kaWFuIEVMRiB2YXJpYW50cy4KLQkoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUgYXMgMSwgbm90IGVtcHR5LgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19iaWdfZW5kaWFuKTogRGVsZXRlIHZhcmlhYmxlLCB1c2UKLQl0YXJnZXRfYmlnX2VuZGlhbiBpbnN0ZWFkLgotCShtZF9wYXJzZV9vcHRpb24pOiBQYXJzZSAtbWxpdHRsZSBhbmQgLW1saXR0bGUtZW5kaWFuIHRvIHVzZQotCWxpdHRsZSBlbmRpYW4gc3VwcG9ydC4gIFBhcnNlIC1tYmlnIGFuZCAtbWJpZy1lbmRpYW4gdG8gdXNlIGJpZwotCWVuZGlhbiBzdXBwb3J0LgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlIHRvIHJlZmxlY3QgY3VycmVudCBzd2l0Y2hlcy4KLQkocHBjX3NldF9jcHUpOiBSZWNvZ25pemUgcG93ZXJwY2xlIGFzIGxpdHRsZSBlbmRpYW4gUG93ZXJQQy4gIFVzZQotCWFzX2ZhdGFsLCBub3QgYWJvcnQgaWYgdW5rbm93biBtYWNoaW5lLgotCi1UdWUgTWF5ICA5IDEwOjU4OjQxIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBDYXN0ICp2YWxwIHRvIGFuIGludGVnZXIgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IHNpZ25lZCB2YWx1ZXMuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IE1ha2UgImRpc3RhbmNlIiBhbiBpbnRlZ2VyLgotCi1UdWUgTWF5ICA5IDAwOjQ3OjAzIDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpIFtCRkRfQVNTRU1CTEVSXTogTmV3IHR5cGUuCi0JKHRoaXNfZm9ybWF0KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUgbmV3IHZhcmlhYmxlLCBpZiBub3QKLQlhbHJlYWR5IGRlZmluZWQgYXMgYSBtYWNyby4KLQotTW9uIE1heSAgOCAyMTo0NDoxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHNlZ19pbmZvKTogUHJvdmlkZSBkdW1teSB2ZXJzaW9uIGZvcgotCW5vbi1CRkRfQVNTRU1CTEVSLCBub24tTUFOWV9TRUdNRU5UUyBjb25maWd1cmF0aW9uLiAgSXQgc2hvdWxkCi0JbmV2ZXIgZ2V0IGludm9rZWQsIGJ1dCB0aGlzIGlzIGVhc2llciB0aGFuIGNvbmRpdGlvbmFsaXppbmcgc29tZQotCW9mIHRoZSB1c2VzLgotCShzdHJ1Y3Qgc2VnX2luZm9fdHJhc2gpOiBEdW1teSB0eXBlIHVzZWQgYnkgYWJvdmUgdG8gbWFrZSBjb2RlCi0JY29tcGlsZS4KLQotRnJpIE1heSAgNSAxNDo0NzoxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERlZmluZSB0byAxLCBub3QKLQllbXB0eS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotc29tLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEaXR0by4KLQotVGh1IE1heSAgNCAxOToyNjo1NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogQWx3YXlzIGRlZmluZS4gIElmCi0JU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBpc24ndCBzZXQsIGFib3J0LgotCShTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmYXVsdCB0byB6ZXJvLgotCShhb3V0X3Byb2Nlc3Nfc3RhYik6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20gc19zdGFiX2dlbmVyaWMuCi0JKE9CSl9QUk9DRVNTX1NUQUIpIFtBT1VUX1NUQUJTXTogRGVmaW5lIHRvIGNhbGwgYW91dF9wcm9jZXNzX3N0YWIsCi0JaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoc19zdGFiX2dlbmVyaWMpOiBUZXN0IFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgYXQgcnVuIHRpbWUuICBJZgotCWl0J3Mgbm90IHNldCwgYW5kIE9CSl9QUk9DRVNTX1NUQUIgaXNuJ3QgZGVmaW5lZCwgYWJvcnQuICBBbHdheXMKLQlwYXNzIHNpeCBhcmd1bWVudHMgdG8gT0JKX1BST0NFU1NfU1RBQi4KLQkqIHJlYWQuaCAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IERlY2xhcmUgdW5jb25kaXRpb25hbGx5LgotCSogY29uZmlnL29iai1hb3V0LmggKEFPVVRfU1RBQlMpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoQU9VVF9TVEFCUyk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT0JKX1BST0NFU1NfU1RBQik6IEFkZCBuZXcgZmlyc3QgYXJndW1lbnQsCi0JaWdub3JlZC4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9QUk9DRVNTX1NUQUIpIFtFQ09GRl9ERUJVR0dJTkddOiBEaXR0by4KLQotCSogY29uZmlnL29iai1lY29mZi5oIChFQ09GRl9ERUJVR0dJTkcpOiBEZWZpbmUgdG8gMSwgbm90IGVtcHR5LgotCSogY29uZmlnL29iai1lbGYuaCAoRUNPRkZfREVCVUdHSU5HKTogRGl0dG8uICBUZXN0IHZhbHVlLCBub3QKLQl3aGV0aGVyIGl0J3MgZGVmaW5lZC4KLQotV2VkIE1heSAgMyAyMTozODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5oIChMT0NBTF9MQUJFTFNfRE9MTEFSLCBMT0NBTF9MQUJFTFNfRkIpOiBJZiBub3QgYWxyZWFkeQotCWRlZmluZWQsIGRlZmluZSB0aGVtIHRvIHplcm8uCi0JKiBjb25maWcvdGMtKi5oLCBjb25maWcvdGUtKi5oOiBJZiBkZWZpbmluZyB0aGVtLCBkZWZpbmUgdGhlbSB0bwotCWJlIDEgaW5zdGVhZCBvZiBlbXB0eS4KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwgb3BlcmFuZCk6IFRlc3QgdGhlbSBhdCBydW4gdGltZQotCWluc3RlYWQgb2YgY29tcGlsZSB0aW1lLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBEaXR0by4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBEaXR0by4KLQkoZG9sbGFyXyosIGRlZmluZV9kb2xsYXJfbGFiZWwsIGZiXyopOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5oIChkb2xsYXJfKiwgZGVmaW5lX2RvbGxhcl9sYWJlbCwgZmJfKik6IERlY2xhcmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLVdlZCBNYXkgIDMgMTM6MDg6NTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvIG5vdGhpbmcgZm9yIGFuIG91dCBvZiByYW5nZQotCVBDIHJlbGF0aXZlIGNhbGwgc2luY2UgdGhvc2Ugb25seSBvY2N1ciBpbiBjYXNlcyB3aGVyZSB0aGUgbGlua2VyCi0JY2FuIGZpeCB0aGVtIHVwLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3Igb3V0IG9mIHJhbmdlIFBDCi0JcmVsYXRpdmUgY2FsbHMuCi0KLVR1ZSBNYXkgIDIgMTY6MzQ6NDcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZSAoaHBwYSotKi1saXRlcyopOiBIYW5kbGUganVzdCBsaWtlIGhwcGEqLSotKmVsZiouCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCi1UdWUgTWF5ICAyIDExOjIyOjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkocG9wX292ZXJyaWRlX29rLCBwb3BfdGFibGVfbmFtZSk6IE5ldyB2YXJpYWJsZXMuCi0JKG1kX3BvcF9pbnNlcnQsIG9ial9wb3BfaW5zZXJ0KTogTmV3IG1hY3Jvcy4KLQkocG9iZWdpbik6IFVzZSB0aGVtLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVc2UgVVNFX1NUREFSRyBhbmQgVVNFX1ZBUkFSR1MgaW5zdGVhZCBvZgotCU5PX1NUREFSRyAmYy4KLQotCSogcmVhZC5jICh0YXJnZXRfYmlnX2VuZGlhbik6IElmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGlzCi0JZGVmaW5lZCwgaW5pdGlhbGl6ZSB0byAxLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190YXJnZXRfZm9ybWF0KTogQ2hhbmdlZCB0byBhIGZ1bmN0aW9uLAotCWNoZWNraW5nIGZsYXZvciBhbmQgYnl0ZSBvcmRlciBhdCBydW4gdGltZS4KLQkobWRfcGFyc2Vfb3B0aW9uLCBjYXNlcyBPUFRJT05fRUIgYW5kIE9QVElPTl9FTCk6IFNldAotCXRhcmdldF9iaWdfZW5kaWFuIGhlcmUuCi0JKG1kX2JlZ2luKTogTm90IGhlcmUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX3RhcmdldF9mb3JtYXQpOiBBZGp1c3QgZGVjbGFyYXRpb24uCi0JKFRBUkdFVF9GT1JNQVQpOiBDYWxsIG1pcHNfdGFyZ2V0X2Zvcm1hdC4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCk6IERlZmluZSBpbiB0ZXJtcyBvZgotCU9VVFBVVF9GTEFWT1IuCi0JKiBjb25maWcvdGMtbWlwcy5jIChnX3N3aXRjaF92YWx1ZSwgZ19zd2l0Y2hfc2Vlbik6IERlZmluZQotCXVuY29uZGl0aW9uYWxseS4KLQkobWRfYmVnaW4sIG1pcHNfaXAsIG1kX3BhcnNlX29wdGlvbiwgc19jaGFuZ2Vfc2VjLCBzX29wdGlvbiwKLQlzX2FiaWNhbGxzLCBub3BpY19uZWVkX3JlbGF4KTogQ2hlY2sgVVNFX0dMT0JBTF9QT0lOVEVSX09QVCBhdCBydW4KLQl0aW1lLCBpbnN0ZWFkIG9mIGNvbXBpbGluZyBjb25kaXRpb25hbGx5IG9uIEdQT1BULgotCShHUE9QVCk6IERvbid0IGRlZmluZS4KLQkobWRfc2hvcnRvcHRzKTogQWx3YXlzIGluY2x1ZGUgLUcuCi0JKFJEQVRBX1NFQ1RJT05fTkFNRSk6IFNlbGVjdCBhdCBydW4gdGltZS4KLQkobWRfYmVnaW4pOiBUZXN0IGZvciBFTEYgZm9ybWF0IGF0IHJ1biB0aW1lIGluc3RlYWQgb2YgY29tcGlsZSB0aW1lLgotCShtaXBzX2lwLCBzX2NoYW5nZV9zZWMpOiBEaXR0by4KLQkobWRfcGFyc2Vfb3B0aW9uLCBjYXNlcyBPUFRJT05fQ0FMTF9TSEFSRUQgYW5kIE9QVElPTl9OT05fU0hBUkVEKToKLQlEaXR0by4KLQkoT1BUSU9OX0NBTExfU0hBUkVELCBPUFRJT05fTk9OX1NIQVJFRCwgbWlwc19yZWdtYXNrX2ZyYWcpOiBEZWZpbmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLVR1ZSBNYXkgIDIgMDA6MTc6MDQgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfKik6IE5ldyB2YXJpYWJsZXMuCi0JKHRhcmctY3B1Lm8pOiBEZXBlbmQgb24gb25lLCBzZWxlY3RlZCBieSBhdXRvY29uZiBzdWJzdGl0dXRpb24sCi0JaW5zdGVhZCBvZiBUQVJHX0NQVV9ERVBFTkRFTlRTLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlICRjcHVfdHlwZSwgJG9ial9mb3JtYXQsICRhdG9mLCBhbmQKLQkkZW11bGF0aW9uIGludG8gTWFrZWZpbGUuaW4uCi0JKiBjb25maWcvaDgzMDAubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaDg1MDAubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaTM4NmNvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL202OGsubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvbTY4a2NvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL204OGtjb2ZmLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbWlwcy1saXQubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL3NoLm10OiBEZWxldGVkLgotCSogY29uZmlnL3c2NS5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy96OGsubXQ6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy90ZS1kcHgyLmggKGRweDIpOiBEZWxldGVkIHVudXNlZCBtYWNyby4KLQkqIGNvbmZpZy90ZS1nZW5lcmljLmggKFRFX0dFTkVSSUMpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1nbzMyLmggKFRFX0dPMzIpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1ocDMwMC5oIChURV9IUDMwMCk6IERpdHRvLgotCSogY29uZmlnL3RlLWhwcGEuaCAoUEEsIF9URV9QQV9IKTogRGl0dG8uCi0JKiBjb25maWcvdGUtaWM5NjAuaCAoVEVfSUM5NjApOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1uYnNkNTMyLmggKFRFX05FVEJTRDUzMik6IERpdHRvLgotCSogY29uZmlnL3RlLXBjNTMybWFjaC5oIChURV9QQzUzMk1BQ0gpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1wcGNudy5oIChURV9QUENOVyk6IERpdHRvLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChzY291bml4KTogRGl0dG8uCi0KLU1vbiBNYXkgIDEgMTU6NTk6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2FwcF9maWxlKTogSWYgb2JqX2FwcF9maWxlIGlzIGRlZmluZWQsIGNhbGwgaXQgd2l0aAotCXN0cmluZyBhcyBhcmd1bWVudC4gIERvbid0IGNhbGwgY19kb3RfZmlsZV9zeW1ib2wgb3IKLQllbGZfZmlsZV9zeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2FwcF9maWxlKTogRGVmaW5lIGFzIGNfZG90X2ZpbGVfc3ltYm9sLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2FwcF9maWxlKTogRGVmaW5lIGFzIGVsZl9maWxlX3N5bWJvbC4KLQotCSogYXMuaCAoT1VUUFVUX0ZMQVZPUik6IERvbid0IGRlZmluZSBoZXJlLgotCSogY29uZmlnL29iai1hb3V0LmggKE9VVFBVVF9GTEFWT1IpIFtCRkRfQVNTRU1CTEVSXTogRGVmaW5lLgotCSogY29uZmlnL29iai1ib3V0LmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoT1VUUFVUX0ZMQVZPUikgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPVVRQVVRfRkxBVk9SKTogRGVmaW5lLgotCi1UaHUgQXByIDI3IDIwOjA3OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogVXNlIG9uZSBpbiBzcmNkaXIgaWYgcHJlc2VudC4KLQkoUlVOVEVTVEZMQUdTKTogRGVmaW5lLgotCi1XZWQgQXByIDI2IDE1OjU0OjEwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBtb3JlIHBvcnRhYmxlIGFsaWdubWVudCBoYW5kbGluZyBpbiBhc3NlbWJseSBjb2RlLAotCWJhc2VkIG9uIHBhdGNoZXMgZnJvbSBCcnlhbiBGb3JkIDxiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1PjoKLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZGVkIGJhbGlnbiBhbmQgcDJhbGlnbiwgZm9yIGFsaWduaW5nIGJ5Ci0JYnl0ZXMgb3IgcG93ZXJzIG9mIHR3byBpbmRlcGVuZGVudCBvZiB3aGF0ICIuYWxpZ24iIGRvZXMgZm9yIGEKLQlnaXZlbiB0YXJnZXQuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgdGhlbS4KLQotVHVlIEFwciAyNSAxMToxMjowNCAxOTk1ICBSb2IgU2F2b3llICA8cm9iQHRoZXB1Yi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogTG9vayBmb3IgbTY4ay0qLXZ4d29ya3MqIHJhdGhlciB0aGFuCi0JanVzdCBtNjhrLXdycy12eHdvcmtzIHNvIGdhcyBjYW4gYmUgY29uZmlndXJlZCBmb3IKLQltNjhrLXZ4d29ya3M1LjEuCi0KLUZyaSBBcHIgMjEgMTU6MTk6MDYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IElmIGZ4X3JfdHlwZSBpcyB6ZXJvLCBoYW5kbGUKLQlmeF9zaXplIG9mIDEsIGFuZCBhYm9ydCBvbiB1bnJlY29nbml6ZWQgc2l6ZXMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGaXggYnVnIGluIGxhc3QgY2hhbmdlIHJlZ2FyZGluZwotCW5vbi1pc3ZhciBjYXNlLgotCi1TdW4gQXByIDE2IDAxOjUyOjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAobWRfcmVsYXhfdGFibGUsIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOgotCU1pc3NlZCB0aGlzIG9uZSBpbiAxMSBBcHIgY2hhbmdlcy4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IEZpeCB0eXBvLgotCi1UaHUgQXByIDEzIDE4OjE4OjA4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBJbnN0ZWFkIG9mIGFib3J0aW5nIG9uIGxhcmdlCi0JZGlzcGxhY2VtZW50cywgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIERvbid0IGludm9rZSB0aGUgY29kZSB0aGF0Ci0JZm9sbG93ZWQgdGhlIGFib3J0IGNhbGwgdW50aWwgaXQncyBiZWVuIHZlcmlmaWVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zaG93X3VzYWdlKTogQWRkIDY4MDYwIHRvIGxpc3QuICBTcGxpdCBjcHUKLQlsaXN0IGludG8gdGhyZWUgbGluZXMuCi0KLVRodSBBcHIgMTMgMTQ6MzQ6MzYgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQGFkZGVyLmN5Z251cy5jb20+Ci0KLQkqIHRjLW02OGsuYyAobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBUZXN0IGZvciBtNjgzNjAuCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBtNjgzNjAuCi0JKiB0Yy1tNjhrLmggKFRBUkdFVF9XT1JEX1NJWkUpOiBEZWZpbmUuCi0JKFRBUkdFVF9BUkNIKTogRGVmaW5lLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJZiBUQVJHRVRfV09SRF9TSVpFIGlzIGRlZmluZWQsCi0Jc2lnbi1leHRlbmQgYXBwcm9wcmlhdGVseS4KLQotVGh1IEFwciAxMyAxMToyMDoxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBQcm9wZXJseSB1c2UgUEFSQU1TIHRvCi0JaGlkZSBwcm90b3R5cGUgZnJvbSBub24tQU5TSSBjb21waWxlcnMsIGFuZCBkb24ndCB1c2UgQU5TSSBzeW50YXgKLQlmb3IgYXJndW1lbnRzLgotCi1XZWQgQXByIDEyIDEyOjIwOjE5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiAoVERFRklORVMpOiBQdXQgZW1wdHkgZGVmaW5pdGlvbiBpbnRvCi0JbWFrZWZpbGUgZnJhZ21lbnQuCi0JKiBtcHctbWFrZS5pbiAoeG1hbGxvYy5jLm8pOiBSZW1vdmUuCi0JKGFzLm5ldyk6IERlcGVuZCBvbiBWZXJzaW9uLnIuCi0JKFZlcnNpb24ucik6IEdlbmVyYXRlIGZyb20gdmVyc2lvbiBpbmZvLgotCi0JKiBtcHctbWFrZS5pbjogRGVsZXRlIHJlZmVyZW5jZXMgdG8gaGV4LXZhbHVlLmMuCi0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBtYXBwaW5nIGZyb20gY29uZmlncyB0byBvYmplY3QgZmlsZSBmb3JtYXRzLAotCWdldCBWRVJTSU9OIGZyb20gTWFrZWZpbGUuaW4gYW5kIGFkZCB0byBtay50bXAuCi0JKG1pcHMtaWR0LWVjb2ZmKSBbVERFRklORVNdOiBBZGQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKiBtcHctbWFrZS5pbiAoVkVSU0lPTiwgZ0MpOiBEb24ndCBkZWZpbmUuCi0JKEFMTF9DRkxBR1MpOiBSZW1vdmUgLWQgZmxhZ3MuCi0JKGNvbmZpZy5oKTogUmVtb3ZlIGRlZmluaXRpb24gb2YgTVBXLCBhZGQgSEFWRV9TVERBUkdfSCwKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBtcHctbWFrZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCBkZWZpbml0aW9uIG9mIEhBVkVfU1REQVJHX0gsCi0JaW5jbHVkZSBvZiA6OmxpYmliZXJ0eTouCi0JKGNvbmZpZy5oKTogSWZkZWYgY29udGVudHMgb24gR0FTX1ZFUlNJT04uCi0KLQkqIG1wdy1tYWtlLmluIChhcy5jKTogQ29tcGlsZSB3aXRoIEMgbm90IGdDLgotCShjb25maWctc3RhbXApOiBUb3VjaCBjb3JyZWN0bHkuCi0JKGluc3RhbGwtb25seSk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBEZXBlbmQgb24gYWxsIGFuZCBpbnN0YWxsLW9ubHkuCi0KLQkqIG1wdy1jb25maWcuaW46IFBhcnNlIHRhcmdldCBhbmQgdXNlIHRvIGdlbmVyYXRlIGZvcndhcmQgaW5jbHVkZXMKLQl0byB0Yy0sIG9iai0sIGFuZCBhdG9mLSBmaWxlcywgdXNlIHRlLWdlbmVyaWMuaCBmb3IgZW11bGF0aW9uLgotCSogbXB3LW1ha2UuaW4gKFZFUlNJT04pOiBEZWZpbmUuCi0JKGFzLmMpOiBDb21waWxlIHdpdGggR0NDLgotCShUQVJHX09CSkVDVFMsIENMSUJTKTogRGVmaW5lLgotCShhcy5uZXcpOiBVc2UgTERGTEFHUywgVEFSR19PQkpFQ1RTLCBDTElCUyBhbmQgRVhUUkFMSUJTIGluIGxpbmsKLQljb21tYW5kLgotCShjb25maWcuaCwgY29uZmlnLXN0YW1wKTogQnVpbGQuCi0KLQkqIG1wdy1tYWtlLmluIChDLCBDRkxBR1MpOiBSZW1vdmVkIGRlZmluaXRpb25zLgotCShBTExfQ0ZMQUdTKTogRGVmaW5lLgotCVNldCBkZWZhdWx0IHJ1bGUgdG8gdXNlIHtDQ30gaW5zdGVhZCBvZiB7Q30uCi0KLQkqIG1wdy1tYWtlLmluIChpbnN0YWxsKTogTW92ZWQgaGVyZSBmcm9tIG1wdy1idWlsZC5pbi4KLQkqIG1wdy1idWlsZC5pbjogUmVtb3ZlZCwgZnVuY3Rpb25hbGl0eSBpbiBtcHctbWFrZS5pbgotCi0JKiBtcHctbWFrZS5pbiAoQ0ZMQUdTKTogQWRkIG1vcmUgaW5jbHVkZSBwYXRocy4KLQotCSogbXB3LWNvbmZpZy5pbiAodmFyYXJncy5oLCBzeXMvKi5oKTogRG9uJ3QgY3JlYXRlIHdoZW4KLQljb25maWd1cmluZy4KLQkqIG1wdy1tYWtlLmluIChDRkxBR1MpOiBBZGQgLXcgZmxhZy4KLQotCSogbXB3LW1ha2UuaW46IFJlcGxhY2UgOC1iaXQgY2hhcnMgd2l0aCB0aGVpciBuYW1lcy4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0KLVR1ZSBBcHIgMTEgMDE6NDI6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF0IGxlYXN0IGF1dG9jb25mIDIuMywgYmVjYXVzZSBlYXJsaWVyCi0JdmVyc2lvbnMgbG9zZSBvbiBzb21lIEFJWCB2ZXJzaW9ucy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG02OGstKi1lbGYuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKSBbT0JKX0VMRl06IEluY2x1ZGUgJyMnLgotCShtZF9wc2V1ZG9fdGFibGUpIFtPQkpfRUxGXTogSWdub3JlICJzd2JlZyIuCi0JKG1kX2JlZ2luKTogU2V0IGFsdF9ub3RlbmRfdGFibGVbJyYnXSwgc28gc3ZyNC1zdHlsZSBpbW1lZGlhdGUKLQlvcGVyYW5kcyBhcmUgYWNjZXB0ZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IEFyZ3VtZW50IFZBTFAgc2hvdWxkIHBvaW50IHRvIHZhbHVlVC4KLQkobWRfY29udmVydF9mcmFnKTogQXJndW1lbnQgU0VDIHNob3VsZCBiZSB0eXBlIHNlZ1QuCi0JKG1kX3Nob3J0b3B0cykgW09CSl9FTEZdOiBBY2NlcHQgJ1EnIHdpdGggYW4gYXJndW1lbnQuCi0JKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSBpdC4KLQkobWRfY29udmVydF9mcmFnXzEpOiBBZGQgaW4gZnJhZyBhZGRyZXNzIGZvciB0aGUgc3ltYm9sIGluIHRoZQotCWRpc3BsYWNlbWVudCBjYWxjdWxhdGlvbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpIFtPQkpfRUxGXTogVXNlICJlbGYzMi1tNjhrIi4KLQkoVEFSR0VUX0FSQ0gpOiBEZWZpbmUuCi0JKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCkgW09CSl9FTEZdOiBEZWZhdWx0IHRvIDAuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUsIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6IEhhbmRsZQotCXRoZXNlIHRoZSBzYW1lIHdheSBmb3IgT0JKX0VMRiBhcyBmb3IgTTY4S0NPRkYuCi0KLQkqIGdkYmluaXQuaW46IEFkZCBicmVha3BvaW50IGluIGFzX2Fib3J0LgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogSWYgb2Zmc2V0IGlzIGxlc3MgdGhhbiB6ZXJvLAotCWNvbXBsYWluIGFib3V0IGl0IHNwZWNpZmljYWxseSwgaW5zdGVhZCBvZiByZXBvcnRpbmcgYW4gYXNzZXJ0aW9uCi0JZmFpbHVyZS4KLQkocmVsYXhfc2VnbWVudCk6IENvbXBsYWluIGFib3V0IC5vcmcgYmFja3dhcmRzLCB0aGVuIGlnbm9yZSBpdC4KLQlEbyBnZW5lcmljIHJzX21hY2hpbmVfZGVwZW5kZW50IHJlbGF4YXRpb24gb25seSBpZgotCVRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgaXMgZGVmaW5lZCwgYW5kIHVzZSBpdHMgdmFsdWUgZm9yIHRoZSBiYXNlCi0Jb2YgdGhlIHRhYmxlLgotCSogdGMuaCAobWRfcmVsYXhfdGFibGUpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKiBhcy5oIChzdHJ1Y3QgcmVsYXhfdHlwZSk6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB0eXBlLgotCSogY29uZmlnL3RjLWEyOWsuYzogRGVsZXRlZCBtZF9yZWxheF90YWJsZS4KLQkqIGNvbmZpZy90Yy17YWxwaGEsYXJtLGg4MzAwLGhwcGEsaTg2MCxtODhrLG1pcHMscHBjLHNwYXJjLHo4a30uYzoKLQlEaXR0by4KLQkqIGNvbmZpZy90Yy17aDg1MDAsaTM4NixpOTYwLG5zMzJrLHNoLHRhaG9lLHZheCx3NjV9Lmg6IERlY2xhcmUKLQltZF9yZWxheF90YWJsZSBoZXJlLCBhbmQgZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgdG8gZXhwYW5kCi0JdG8gbWRfcmVsYXhfdGFibGUuCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobWRfcmVsYXhfdGFibGUpOiBObyBsb25nZXIgY29uc3QuCi0JKiBjb25maWcvdGMtdzY1LmMgKG1kX3JlbGF4X3RhYmxlKTogRGl0dG8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvcnRfanVtcF9zaXplLCBtZF9sb25nX2p1bXBfc2l6ZSk6Ci0JRGVsZXRlZC4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRGVzY3JpYmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBhbmQKLQlXT1JLSU5HX0RPVF9XT1JELiAgTWVudGlvbiBtZF8qX2p1bXBfc2l6ZSAoYnV0IGRlc2NyaXB0aW9uIG5lZWRzCi0JdG8gYmUgZmxlc2hlZCBvdXQgbGF0ZXIpLiAgTm90ZSBtNjhrIFBDSU5ERVggbW9kZSBoYXMgYmVlbiBjaGVja2VkCi0JaW4uCi0KLU1vbiBBcHIgMTAgMTU6NTc6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHNwbGl0Ci0Jb3V0IGZyb20gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXguCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ2FsbCBpdC4KLQkobG9hZF9hZGRyZXNzLCBtYWNybyk6IEluIE5PX1BJQyBicmFuY2hlcywgaWYgbm9waWNfbmVlZF9yZWxheAotCXJldHVybnMgbm9uemVybywgZG9uJ3QgYXR0ZW1wdCBHUCBvcHRpbWl6YXRpb24uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKFBDSU5ERVgpOiBOZXcgbWFjcm8uCi0JKG1kX3JlbGF4X3RhYmxlKTogTm8gbG9uZ2VyIGNvbnN0LiAgQWRkIFBDSU5ERVggZW50cmllcy4KLQkobTY4a19pcCk6IEZvciBBSU5EWCB3aXRoIHNpbXBsZSBzeW1ib2wgb3BlcmFuZCwgZ2VuZXJhdGUgYQotCVBDSU5ERVggZnJhZyBpZiBQQyBpcyB1c2VkLCBvciBkbyBub3JtYWwgbm9uLUFJTkRYIHByb2Nlc3NpbmcgZm9yCi0JYWRkcmVzcyByZWdpc3Rlci4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBJZiBjcHUgaXMgNjgwMDAgb3IgNjgwMTAsIGZpeAotCW1kX3JlbGF4X3RhYmxlIHRvIHByZXZlbnQgcmVsYXhhdGlvbiBvZiBQQ0lOREVYL0JZVEUgbW9kZSB0bwotCVNIT1JULCBzaW5jZSB0aGV5IGRvbid0IHN1cHBvcnQgdGhhdCBtb2RlLgotCShtZF9jb252ZXJ0X2ZyYWdfMSwgY2FzZSBQQ0xFQS9MT05HKTogQWRkIDQgdG8gb2Zmc2V0LCBub3QgMi4gIEFkZAotCXN1cHBvcnQgZm9yIG5ldyBQQ0lOREVYIG1vZGVzLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFByb2Nlc3MgUENJTkRFWC9TWl9VTkRFRiBtb2RlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWdfMSwgY2FzZSBQQ0xFQS9TSE9SVCk6IEFkZCAyIHRvCi0Jb2Zmc2V0LgotCShtNjhrX2lwLCBjYXNlIG1vc3QgcHVuY3R1YXRpb24vQU9GRik6IElmIHVzaW5nIFBDLCBjYWxsIGFkZF9mcmFnCi0JdXNpbmcgUENMRUEuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IERvbid0IGV4cGxpY2l0bHkgaW5jbHVkZSBjb25maWcuaC4gIERlbGV0ZWQgYQotCWJ1bmNoIG9mICIjaWYgMCIgY29kZSBhbmQgdXNlbGVzcyBjb21tZW50cy4KLQkoc3RydWN0IG02OGtfY3B1KTogTmV3IHR5cGUuCi0JKGFyY2hzLCBuX2FyY2hzKTogTmV3IHZhcmlhYmxlcywgd2l0aCBzaW5nbGUgbGlzdCBvZiBuYW1lL2VudW0KLQltYXBwaW5nIGFuZCBhbGlhc2VzLgotCShtNjhrX2lwKTogRGVsZXRlIHRoZSB0YWJsZSBoZXJlLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSB0aGUgbmV3IHRhYmxlIGhlcmUgaW5zdGVhZCBvZgotCW9wZW4tY29kaW5nIGl0LgotCShtZF9wYXJzZV9vcHRpb24sIGNhc2UgJ20nKTogRGl0dG8uCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBGaXggcnVsZSBmb3IgcnVubmluZyBjb25maWcuc3RhdHVzLgotCShpbnRlcm5hbHMuZHZpLCBpbnRlcm5hbHMucHMsIGludGVybmFscy5wczQpOiBOZXcgdGFyZ2V0cywgbm90Ci0JYnVpbHQgYnkgZGVmYXVsdC4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBBZGQgbG91ZCBkaXNjbGFpbWVyLiAgUmVmaWxsIHRvIDc5IGNvbHVtbnMsCi0Jc3BlY2lmeSBmaWxsLWNvbHVtbiBpbiBsb2NhbC12YXJpYWJsZXMgc2VjdGlvbi4gIENoYW5nZQotCXN1YmhlYWRpbmdzIHRvIHN1YnNlY3Rpb25zIHNvIHRoZXkgY2FuIGJlIGNyb3NzLXJlZmVyZW5jZWQuCi0JRGVzY3JpYmUgYnJva2VuIHdvcmRzLCBmcmFncywgZnJhZyBjaGFpbnMsIGdlbmVyaWMgcmVsYXhhdGlvbiwKLQlyZWxheCB0YWJsZSwgbTY4ayByZWxheGF0aW9uLCBtNjhrIGFkZHJlc3NpbmcgbW9kZXMsIHRlc3Qgc3VpdGUKLQljb2RlLiAgQWRkIGEgZmV3IHdvcmRzIGFib3V0IHZhcmlvdXMgZmlsZSBmb3JtYXRzLgotCi0JKiBkb2MvYXMudGV4aW5mbyAobTY4ayk6IFJlY29tbWVuZCB1c2luZyBgJScgd2l0aCByZWdpc3RlcnMgYXMgdGhlCi0Jbm9ybWFsIGNhc2UsIGluc3RlYWQgb2YgdGhlIGV4Y2VwdGlvbmFsIGNhc2UuCi0KLVRodSBNYXIgMzAgMTQ6Mzg6NDcgMTk5NSAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBsaW51eCB0byBkZWZhdWx0IHRvIGVsZi4gIFVzaW5nCi0JaVszNDVdODYtKi1saW51eGFvdXQgd2lsbCBkZWZhdWx0cyB0byBhLm91dC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE1hciAyOSAxNzoxNjozMCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBDYXN0IG5lZ2F0aXZlIG9mZnNldHMgdG8gb2Zmc2V0VAotCShmb3IgaG9zdGluZyBvbiA2NCBiaXQgbWFjaGluZXMpLgotCi1UdWUgTWFyIDIxIDE2OjUzOjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLW1pcHM0IGFuZCAtbTQ2NTAuCi0KLUZyaSBNYXIgMTcgMTY6NDc6MTMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEFkZCBQUk9HUkVTUyBtYWNyb3MuCi0KLUZyaSBNYXIgMTcgMTI6NDA6MzQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBNYWtlIHN1cmUgdG8gYWx3YXlzIHJlc2V0IHRoZSBmcmFnCi0JYW5kIHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzLgotCi1UaHUgTWFyIDE2IDE3OjI2OjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgbm9uIFBDIHJlbGF0aXZlCi0JcG9pbnRlcnMgaW4gdGhlIC5jdG9ycyBhbmQgLmR0b3JzIHNlY3Rpb24gYWxzbyB3aGVuIHVzaW5nIHRoZQotCS1tcmVsb2NhdGFibGUgb3B0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBTdXBwb3J0IC1tNDAzIGFzIGEgUG93ZXJQQyBjb21wdXRlci4KLQkobWRfc2hvd191c2FnZSk6IERpdHRvLgotCi1XZWQgTWFyIDE1IDE0OjQ1OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpOiBUaGUgY3VyX3Njb3BlIGZpZWxkIG9mIGEgZmlsX3B0cgotCW1heSBiZSBOVUxMIHdoZW4gZ2l2ZW4gc3RyYW5nZSBpbnB1dC4gIERvbid0IGNvcmUgZHVtcC4KLQotVHVlIE1hciAxNCAyMTozNjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBEb24ndCB1c2UgYWRkaXUgZm9yIGRsaSBvZiBhbgotCXVuc2lnbmVkIHNlZW1pbmdseSBuZWdhdGl2ZSBudW1iZXIuICBEb24ndCBib3RoZXIgc2hpZnRpbmcgYSB6ZXJvCi0JdmFsdWUuCi0JKG1pcHNfaXApOiBGb3IgY2FzZSAnaicsIGlmIHRoZXJlIGFyZSBtb3JlIGFsdGVybmF0aXZlcywgYW5kIHRoZQotCUlTQSBsZXZlbCBpcyBhdCBsZWFzdCAzLCBkb24ndCBhY2NlcHQgYW4gdW5zaWduZWQgc2VlbWluZ2x5Ci0JbmVnYXRpdmUgbnVtYmVyLgotCi1UdWUgTWFyIDE0IDE5OjE2OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19hcHBfbGluZSk6IEZpeCBsYXN0IHBhdGNoIHRvIGRlYWwgd2l0aCBhIGxpbmUgbnVtYmVyCi0Jb2YgMS4KLQotVHVlIE1hciAxNCAxNzowMDo1NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBVc2UgYXNfd2Fybl93aGVyZSwgbm90Ci0JYXNfYmFkX3doZXJlIHRvIGdpdmUgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gZXJyb3IuCi0KLU1vbiBNYXIgMTMgMTc6MDM6NDYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiAgaXNzdWUgYSB3YXJuaW5nIGlmIGEgY29uc3RhbnQKLQlpcyB1c2VkIGFzIGFuIG9wZXJhbmQgd2hlcmUgYW4gaW1tZWRpYXRlIHZhbHVlIGlzIG5vdCBhbGxvd2VkLgotCi1GcmkgTWFyIDEwIDE5OjIxOjE5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBSZWRvIG15IDEwIEphbiBjaGFuZ2UsIGJ1dCBnZXQgaXQgcmlnaHQgdGhpcwotCXRpbWUuIDotKQotCShmaXh1cF9zZWdtZW50KTogSWYgbGlua3JlbGF4IGlzIHNldCwganVzdCByZXR1cm4uCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgdHJlYXQgaDgzMDAgYW5kIHo4ayBzcGVjaWFsbHkgd2l0aAotCXJlZ2FyZCB0byBmaXh1cHMuCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfYmVnaW4pOiBTZXQgbGlua3JlbGF4LgotCSogY29uZmlnL3RjLXo4ay5jIChtZF9iZWdpbik6IERpdHRvLgotCi1UaHUgTWFyICA5IDE4OjAxOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfaGVhZGVyX2FwcGVuZCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dC4KLQotVGh1IE1hciAgOSAxMzo1MTozMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JRGVsZXRlIHRoaXMgcGF0Y2gsIGl0IGJyZWFrcyB0aGUgaDgzMDAgYXNzZW1ibGVyLgotCVR1ZSBKYW4gMTAgMTM6MzQ6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IHRyZWF0IGg4MzAwIGFuZCB6OGsKLQlzcGVjaWFsbHkgd2l0aCByZWdhcmQgdG8gZml4dXBzLgotCi1UaHUgTWFyICA5IDEyOjI4OjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtcmVsb2NhdGFibGUpOiBDaGFuZ2UgdHlwZSB0byBib29sZWFuLgotCShtZF9iZWdpbik6IFNldCB0aGUgRUZfUFBDX1JFTE9DQVRBQkxFIGlmIC1tcmVsb2NhdGFibGUuCi0KLVdlZCBNYXIgIDggMTU6Mzk6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IENoZWNrIGZvciBhIGNwdSBzdHJpbmcgb2YgcjgwMDAgb3IKLQlyMTAwMDAuICBJZiBtaXBzX2lzYSBpcyA0LCBzZXQgdGhlIG1hY2hpbmUgbnVtYmVyIHRvIDgwMDAuCi0JKGFwcGVuZF9pbnNuKTogSWYgbWlwc19pc2EgaXMgYXQgbGVhc3QgNCwgZG9uJ3QgZ2VuZXJhdGUgbm9wcyBmb3IKLQljb3Byb2Nlc3NvciBkZWxheXMuICBDaGVjayBJTlNOX1JFQURfRlBSX1Igd2hlbiBzZXR0aW5nCi0JbWlwc19jcHJtYXNrWzFdLgotCShtaXBzX2VtaXRfZGVsYXlzKTogSWYgbWlwc19pc2EgaXMgYXQgbGVhc3QgNCwgZG9uJ3QgZ2VuZXJhdGUgbm9wcwotCWZvciBjb3Byb2Nlc3NvciBkZWxheXMuCi0JKG1pcHNfaXApOiBDaGVjayBmb3IgSU5TTl9JU0E0IGluc3RydWN0aW9ucy4gIEhhbmRsZSBuZXcgYXJndW1lbnQKLQl0eXBlcyAnaCcsICdSJywgJ04nLCBhbmQgJ00nLgotCShtZF9sb25nb3B0cyk6IEFjY2VwdCAibWlwczQiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLW1pcHM0LCBhbmQgLW1jcHU9MTAwMDAgYW5kIC1tY3B1PTgwMDAuCi0JKHNfbWlwc3NldCk6IFBlcm1pdCAuc2V0IG1pcHM0LgotCi1XZWQgTWFyICA4IDA5OjM2OjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IC5zdGFiIHNlY3Rpb25zIHRvCi0JaGF2ZSBub24gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2l0aCAtbXJlbG9jYXRhYmxlLgotCi1XZWQgTWFyICA4IDAyOjU3OjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG9wY29kZV9wdHIpOiBSZXR1cm4gcG9pbnRlciB0byBjb25zdC4KLQkobWRfYmVnaW4pOiBNYWtlIGhhc2ggdGFibGUgZXJyb3JzIGZhdGFsLiAgUHJvY2VzcyBvcGNvZGUgYWxpYXNlcwotCWFmdGVyIG1haW4gb3Bjb2RlIHRhYmxlLgotCShtZF9hcHBseV9maXhfMiwgY2FzZSA0KTogUmVjb2RlIHNldHRpbmcgb2YgbG93ZXJfbGltaXQgdG8gYXZvaWQKLQlnY2Mgd2FybmluZy4KLQotVHVlIE1hciAgNyAxNjowNzoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgU1BBUkMgVjksIGZyb20gRG91ZyBFdmFucwotCTxkamVAY3lnbnVzLmNvbT4uCi0KLU1vbiBNYXIgIDYgMDk6NTg6MzQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IENoYW5nZSBhbGwgb2NjdXJlbmNlcyBvZiBwYS04OSB3aXRoIHBhLTExIHRvCi0JYmUgY29uc2lzdGVudCB3aXRoIGN1cnJlbnQgbmFtaW5nIGNvbnZlbnRpb25zLgotCShtZF9iZWdpbik6IFNldCBhIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUuCi0JKHBhX2lwKTogSWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVzIGEgbmV3ZXIgbWFjaGluZSB0eXBlCi0JdGhhbiB0aGUgY3VycmVudCBtYWNoaW5lIHR5cGUsIHRoZW4gdXBkYXRlIHRoZSBjdXJyZW50IG1hY2hpbmUKLQl0eXBlLgotCShuZWVkX3BhMTFfb3Bjb2RlKTogTGlrZXdpc2UuCi0KLVN1biBNYXIgIDUgMTk6Mzg6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd6Jyk6IERvbid0IGxvc2UgYXJndW1lbnQKLQlyZWxvY2F0aW9uIGJpdHMgZm9yIGFic29sdXRlIGNhbGxzLgotCi1GcmkgTWFyICAzIDE3OjQxOjUwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC4qIChtZF9vcGVyYW5kKTogQ2hhbmdlIGVtcHR5IGZ1bmN0aW9uIHRvIGVtcHR5Ci0JbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IE1ha2UgSDgvMzAwLUggd2FybmluZyBtZXNzYWdlCi0JY2xlYXJlci4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBJZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgZmFpbHMsCi0JcHJpbnQgYSBtZXNzYWdlIGFuZCBleGl0LCBpbnN0ZWFkIG9mIGFib3J0aW5nLgotCi1GcmkgTWFyICAzIDE2OjI2OjE5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdGMuaCAobWRfYXBwbHlfZml4Myk6IElmIE1EX0FQUExZX0ZJWDMgaXMgZGVmaW5lZCwgZGVjbGFyZQotCW1kX2FwcGx5X2ZpeDMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBNRF9BUFBMWV9GSVgzIGlzIGRlZmluZWQsIGNhbGwKLQltZF9hcHBseV9maXgzIHdpdGggdGhlIG5vcm1hbCAyIGFyZ3VtZW50cyBhbmQgdGhlIGN1cnJlbnQgc2VnbWVudAotCXBvaW50ZXIgaW5zdGVhZCBvZiBtZF9hcHBseV9maXguCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFdhcm4gaWYgLW1yZWxvY2F0YWJsZQotCWFuZCBhIG5vbiBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIHRoYXQgaXNuJ3QgaW4gdGhlIC5nb3QyIHNlZ21lbnQKLQl3YXMgcGVyZm9ybWVkLgotCShtZF9hcHBseV9maXgzKTogUmVuYW1lIGZyb20gbWRfYXBwbHlfZml4IGFuZCB0YWtlIHNlZ21lbnQgcG9pbnRlcgotCWFzIHRoaXJkIGFyZ3VtZW50LiAgSWYgRUxGIG9iamVjdCBmb3JtYXQsIGNhbGwgcHBjX2VsZl92YWxpZGF0ZV9maXgKLQlmb3Igbm9ybWFsIHJlbG9jYXRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiBFTEYgb2JqZWN0IGZvcm1hdCwgcmVjb2duaXplIHRoZQotCS1tcmVsb2NhdGFibGUgc3dpdGNoLgotCi1UaHUgTWFyICAyIDE2OjM0OjQ0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoQU9VVF9NQUNIVFlQRSk6IERlZmluZSBhcyAxMDAsIG5vdCAwLgotCi1UdWUgRmViIDI4IDE4OjI5OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYywgY29uZmlnL3RjLWFybS5oIChtZF9vcGVyYW5kKTogUmVwbGFjZWQgZW1wdHkKLQlmdW5jdGlvbiBpbiAuYyBmaWxlIHdpdGggZW1wdHkgbWFjcm8gaW4gLmggZmlsZS4KLQkqIGNvbmZpZy90Yy1oODUwMC4qLCBjb25maWcvdGMtaHBwYS4qLCBjb25maWcvdGMtaTM4Ni4qLAotCWNvbmZpZy90Yy1pODYwLiosIGNvbmZpZy90Yy1pOTYwLiosIGNvbmZpZy90Yy1uczMyay4qLAotCWNvbmZpZy90Yy1wcGMuKiwgY29uZmlnL3RjLXNoLiosIGNvbmZpZy90Yy1zcGFyYy4qLAotCWNvbmZpZy90Yy10YWhvZS4qLCBjb25maWcvdGMtdmF4LiosIGNvbmZpZy90Yy13NjUuKiwKLQljb25maWcvdGMtejhrLio6IERpdHRvLgotCSogY29uZmlnL3RjLW02OGsuKjogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1vdGVfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBkb3RzIGZyb20gb3Bjb2RlCi0JbmFtZXMuCi0KLQkqIHJlYWQuYyAoc19hcHBfbGluZSk6IElnbm9yZSBub24tcG9zaXRpdmUgbGluZSBudW1iZXJzLgotCi1UdWUgRmViIDI4IDE1OjM0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBQTFQgb3IKLQlHT1QgcmVsb2NzIGVpdGhlci4KLQotTW9uIEZlYiAyNyAxMzowMzo0MSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBhMjlrLSotdnh3b3JrcyBjb25maWd1cmF0aW9uLgotCi1GcmkgRmViIDI0IDE0OjQxOjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFRha2UgZGJsIGFyZ3VtZW50IHRvIGRldGVybWluZQotCWhhbmRsaW5nIG9mIHNpZ25lZCAzMiBiaXQgdmFsdWVzIGluIDY0IGJpdCBtb2Rlcy4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShtYWNybyk6IEhhbmRsZSBNX0RMSSBhbmQgTV9ETEFfQUIuCi0KLVdlZCBGZWIgMjIgMjM6MTA6NTYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvbid0IHN1YnRyYWN0IHRoZSB2YWx1ZSBvZiB0aGUKLQlhZGQgc3ltYm9sIGlmIGl0J3MgYSBjb21tb24gc3ltYm9sICh0aGUgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sCi0JaXMgaXRzIHNpemUsIG5vdCBhIHZhbHVlIGluIHRoZSB0cmFkaXRpb25hbCBzZW5zZSkuCi0KLVdlZCBGZWIgMjIgMjE6MTI6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IElmIGxpc3RpbmdfcHJldl9saW5lIGlzIGNhbGxlZCwKLQljYWxsIGZyYWdfZ3JvdyB0byBtYWtlIHN1cmUgdGhlcmUgaXMgc3RpbGwgcm9vbSBmb3IgYSB2YXJpYW50LgotCi1GcmkgRmViIDE3IDE0OjUwOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIDJieXRlLCA0Ynl0ZSBhbmQgOGJ5dGUKLQlpZiBPQkpfRUxGLiAgRnJvbSBnYXJ5QEludHJlcGlkLkNPTSAoR2FyeSBGdW5jaykuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IFdhcm4gaWYgYSBzeW1ib2wgaXMgYm90aAotCXdlYWsgYW5kIGNvbW1vbi4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IExpa2V3aXNlLgotCi1GcmkgRmViIDE3IDEyOjQzOjQ3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCByZWRlZmluZSBieXRlIHVuZGVyCi0JRUxGLgotCShwcGNfZWxmX2NvbnMpOiBEb24ndCBzdXBwb3J0IEBwY3JlbCBhbnkgbW9yZSwgc2luY2UgRElGRl9FWFBSX09LCi0JYWxsb3dzIHRoZSBub3JtYWwgZXhwcmVzc2lvbnMgdG8gZ2VuZXJhdGUgaXQuCi0JKG1kX2FwcGx5X2ZpeCk6IENvbnZlcnQgQkZEX1JFTE9DXzMyIHdpdGggcGNyZWwgYml0IHNldCBpbnRvCi0JQkZEX1JFTE9DXzMyX1BDUkVMLiAgQWJvcnQgaWYgZWl0aGVyIEJGRF9SRUxPQ18xNiBvciBCRkRfUkVMT0NfOAotCW5lZWQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lIHRvIGFsbG93IFBDIHJlbGF0aXZlCi0JZXhwcmVzc2lvbnMgdG8gYmUgaGFuZGxlZC4KLQotVGh1IEZlYiAxNiAxNDozMDoxMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IE1vdmUgbWRfb3BlcmFuZCBoYW5kbGluZyB0byBkZWZhdWx0IGNhc2UKLQkoc28gaXQgd29ya3MpLgotCi1XZWQgRmViIDE1IDE2OjA4OjQ3IDE5OTUgIEphc29uIE1vbGVuZGEgIDxjcmFzaEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDg1MDAuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQWRkIGlnbm9yZWQKLQlwYXJhbWV0ZXIsIHRvIG1hdGNoIHByb3RvdHlwZS4KLQotV2VkIEZlYiAxNSAxNTowNzowMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgRUxGLCBnbyB0byBwcGNfZWxmX2NvbnMKLQlpbnN0ZWFkIG9mIGNvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBTaG93IGFsbCBvZiB0aGUgUG93ZXJQYyBvcHRpb25zLgotCShwcGNfZWxmX3N1ZmZpeCk6IE5ldyBmdW5jdGlvbiB0byByZWNvZ25pemUgRUxGIHN1ZmZpeGVzIHRoYXQKLQlzcGVjaWZ5IGEgcmVsb2NhdGlvbiwgc3VjaCBhcyBAR09ULgotCShwcGNfZWxmX2NvbnMpOiBSZXBsYWNlbWVudCBmb3IgdGhlIHN0YW5kYXJkIGNvbnMgZnVuY3Rpb24gdGhhdAotCWtub3dzIGFib3V0IHRoZSBFTEYgc3VmZml4ZXMuCi0JKHBwY19maXh1cCk6IEFkZCByZWxvYyBmaWVsZCB0byBob2xkIG5vbi1zdGFuZGFyZCByZWxvY2F0aW9uLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBFTEYgc3VmZml4ZXMgbGlrZSBAR09ULgotCShtZF9jcmVhdGVfc2hvcnRfanVtcCk6IER1bW15IGluIGNhc2UgV09SS0lOR19ET1RfV09SRCBpcyBub3QKLQlkZWZpbmVkLgotCShtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKG1kX3Nob3J0X2p1bXBfc2l6ZSk6IERpdHRvLgotCShtZF9sb25nX2p1bXBfc2l6ZSk6IERpdHRvLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzMyX1BDUkVMLCBCRkRfUkVMT0NfTE8xNiwKLQlCRkRfUkVMT0NfSEkxNiwgQkZEX1JFTE9DX0hJMTZfUywgQkZEX1JFTE9DX1BQQ19UT0MxNiwgYW5kCi0JQkZEX1JFTE9DXzE2IHJlbG9jYXRpb25zLiAgSWYgcmVsb2NhdGlvbiBjYW4gbm90IGJlIGZvdW5kLCBwcmludAotCXRoZSBkZWNpbWFsIHZhbHVlIG9mIHRoZSByZWxvY2F0aW9uLgotCi1XZWQgRmViIDE1IDExOjQ2OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQWNjZXB0IEJGRF9SRUxPQ18xNiwgZm9yCi0JRFdBUkYuICBGcm9tIGdhcnlASW50cmVwaWQuQ09NIChHYXJ5IEZ1bmNrKS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBIYW5kbGUgTV9Ve0wsU31EW19BXSAodW5hbGlnbmVkIGRvdWJsZQotCWxvYWRzIGFuZCBzdG9yZXMpLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG8gYWRqdXN0IGdsb2JhbAotCXN5bWJvbHMgaWYgT0JKX0FPVVQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRG9uJ3QgdXNlIHRoZSB0YXJnZXQgcmVnaXN0ZXIgYXMgYQotCWJhc2UgcmVnaXN0ZXIgd2hlbiBidWlsZGluZyB0aGUgYWRkcmVzcyBmb3IgTV9Me1csRH17TCxSfV9BQi4KLQotTW9uIEZlYiAxMyAxNDo0NDozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKEtUMCwgS1QxKTogRGVmaW5lLgotCShtaXBzX2lwKTogUmVjb2duaXplICRrdDAgYW5kICRrdDEgYXMgcmVnaXN0ZXIgbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IElmIE9CSl9FTEYsIHN1YnRyYWN0IG91dCB0aGUKLQl2YWx1ZSBvZiBhIGRlZmluZWQgc3ltYm9sOyB0aGUgdmFsdWUgd2FzIGFkZGVkIGluIGJ5Ci0JZml4dXBfc2VnbWVudC4gIFRoaXMgd2FzIHByZXZpb3VzbHkgY29ycmVjdGVkLCBpZiB0aGUgcmVsb2Mgd2FzCi0JY2hhbmdlZCB0byBiZSBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIGluIHRjX2dlbl9yZWxvYy4KLQotRnJpIEZlYiAxMCAxNDowNDowNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBVc2UgU19JU19FWFRFUk4KLQlyYXRoZXIgdGhhbiAhU19JU19MT0NBTC4KLQotVGh1IEZlYiAgOSAxODoxNjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRqdXN0IGNvbmRpdGlvbnMgZm9yIGNoYW5naW5nCi0JQkZEX1JFTE9DXzMyIHRvIEJGRF9SRUxPQ18zODZfR09UUEMgdG8gaGFuZGxlIGEgc3dpdGNoIGluIGZyYWdzLgotCVBhdGNoIG9yaWdpbmFsbHkgZnJvbSBSb2IgUnlhbiA8cm9ickBjbXUuZWR1Pi4KLQotCSogY29uZmlnL3RjLWkzODYuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlIHJldHVybiB2YWx1ZS4KLQkoaTM4Nl9vcGVyYW5kKTogRG9uJ3QgdXNlIGFuIGFzc2lnbm1lbnQgZGlyZWN0bHkgYXMgYSBjb25kaXRpb24uCi0KLVRodSBGZWIgIDkgMTA6Mzc6MTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEluIHNvbWUgY2FzZXMgc3VidHJhY3QgdGhlCi0JdmFsdWUgb2YgdGhlIGFkZCBzeW1ib2wgZnJvbSB2YWxwLiAgT2Zmc2V0cyBicmFpbmRhbWFnZSBpbiB0aGUKLQkibWFjaGluZSBpbmRlcGVuZGVudCIgZml4dXBfc2VnbWVudC4KLQotV2VkIEZlYiAgOCAxODo1MToyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtZXNzYWdlcy5jIChhc19hYm9ydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGFzX2Fib3J0KTogRGVjbGFyZSBpdC4KLQkoYWJvcnQpOiBOZXcgbWFjcm8uCi0KLQlUaHUgSmFuIDE5IDE4OjEwOjA1IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvdm1zLWNvbmYuaCAoSEFWRV9VTklTVERfSCk6ICBkZWZpbmUgaXQgdW5jb25kaXRpb25hbGx5LgotCSogY29uZmlnLWdhcy5jb206ICB0ZXN0IGZvciBhdmFpbGFiaWxpdHkgb2YgPHVuaXN0ZC5oPjsgY3JlYXRlIGEKLQlydWRpbWVudGFyeSBvbmUgaWYgbmVjZXNzYXJ5LgotCi1UdWUgRmViICA3IDEzOjM0OjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgcG93ZXJwYy0qLWVhYmkgc3VwcG9ydCwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKLQlwb3dlcnBjLSotZWxmLgotCShjb25maWd1cmUpOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCi0KLU1vbiBGZWIgIDYgMDM6Mzc6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBCcnlhbiBGb3JkIDxiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1PiBmb3IgaTM4NgotCTE2LWJpdCBhbmQgbXNkb3Mgc3VwcG9ydDoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGZsYWdfMTZiaXRfY29kZSk6IE5ldyB2YXJpYWJsZS4KLQkoc2V0XzE2Yml0X2NvZGVfZmxhZyk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkZWQgZW50cmllcyAiY29kZTE2IiBhbmQgImNvZGUzMiIuCi0JKG1kX2Fzc2VtYmxlKTogRW5zdXJlIHRoYXQgY29ycmVjdCBkYXRhLXNpemUgcHJlZml4ZXMgZ2V0IGVtaXR0ZWQsCi0JYmFzZWQgb24gdGhlIGN1cnJlbnQgbW9kZS4gIEVuc3VyZSB0aGF0IDMyLWJpdCBhZGRyZXNzaW5nIHdpbGwKLQlhbHdheXMgYmUgZG9uZS4gIE1vdmUgc2VnbWVudC1wcmVmaXggaGFuZGxpbmcgY29kZS4gIChXaHk/KSAgVXNlCi0JMTYtYml0IGp1bXBzIGZvciAxNi1iaXQgY29kZSwgMzItYml0IGp1bXBzIGZvciAzMi1iaXQgY29kZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE1BWF9QUkVGSVhFUyk6IEJ1bXAgdG8gNS4KLQkoRGF0YTE2LCBEYXRhMzIpOiBEZWZpbmUuCi0JKiBkb2MvYXMudGV4aW5mbyAoaTM4Ni0xNmJpdCk6IE5ldyBub2RlLgotCSogY29uZmlndXJlLmluIChpMzg2LSotbXNkb3MqKTogTmV3IHRhcmdldCwgdXNpbmcgYS5vdXQgZm9ybWF0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEZlYiAgMiAxNToyMToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChjcHUzMl9jb250cm9sX3JlZ3MpOiBOZXcgbWFjcm8uCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIGl0LCBmb3IgY3B1MzIgcHJvY2Vzc29ycy4KLQotCVR1ZSBKYW4gMzEgMTc6MjA6NDUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZtc190aXJfc3RhY2tfcHNlY3QpOiAgbmV3IHJvdXRpbmU7Ci0JKFZNU19TZXRfRGF0YSwgVk1TX1NldF9Qc2VjdCwgVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlLAotCVZNU19UQlRfUm91dGluZV9CZWdpbiwgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uKTogIHVzZSBpdDsKLQkoVk1TX0dsb2JhbF9TeW1ib2xfU3BlYywgVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCk6ICB0cmVhdAotCVBzZWN0X051bWJlciBhcyBgdW5zaWduZWQnLgotCi0JVGh1IEphbiAyNiAxNzowNjoyOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYzogIHBlcmZvcm1hbmNlIHR1bmluZy4KLQkoVk1TX1N5bWJvbF90eXBlX2xpc3QpOiAgY29udmVydCBmcm9tIHNpbmdsZSBsaXN0IGhlYWQgdG8gc21hbGwKLQlhcnJheSBvZiBsaXN0IGhlYWRzOwotCShTWU1UWVBfSEFTSCk6ICBuZXcgbWFjcm8gZm9yIGFjY2Vzc2luZyBWTVNfU3ltYm9sX3R5cGVfbGlzdFtdOwotCShmaW5kX3N5bWJvbCwgc2V0dXBfYmFzaWNfdHlwZSwgVk1TX3R5cGVkZWZfcGFyc2UpOiAgdXNlIGl0OwotCShWTVNfUlNZTV9QYXJzZSk6ICBtb3ZlIFNfR0VUX1ZBTFVFKCkgaW5zaWRlIHN3aXRjaCB0byBhdm9pZAotCWNhbGxpbmcgaXQgZm9yIHVuaW50ZXJlc3RpbmcgY2FzZXMuCi0KLVdlZCBGZWIgIDEgMjM6NTI6NDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEdvIGFoZWFkIGFuZCBjYWxsCi0JaHBwYV9maWVsZF9hZGp1c3QgdG8gZ2V0IGEgbmV3IHZhbHVlIGZvciBSX0RBVEFfT05FX1NZTUJPTAotCXJlbG9jYXRpb25zIGluIFNPTS4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlZmluZSBzb21ld2hhdC4KLQotRnJpIEphbiAyNyAyMToyOTo1MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoTk9fU1RSSU5HX0VTQ0FQRVMpOiBEb24ndCBkZWZpbmUgaWYgd2UgYXJlCi0JdXNpbmcgRUxGLgotCi1UaHUgSmFuIDI2IDE5OjAzOjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBBZGQgcGFyZW5zIGFyb3VuZCB8IGluc2lkZSAmLgotCShza2lwX2NvbG9udGhpbmcpOiBTZXQgTF84IGlmICI6OCIgaXMgc3BlY2lmaWVkLgotCi1UaHUgSmFuIDI2IDE4OjM4OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9iZWdpbik6IFBlcm1pdCBtZmRlYyB0byBiZSBkdXBsaWNhdGVkIG9uIHRoZQotCTYwMS4gIENoZWNrIHRoYXQgdGhlIGVycm9yIHJldHVybiBmcm9tIGhhc2hfaW5zZXJ0IGlzICJleGlzdHMiLgotCi1UaHUgSmFuIDI2IDExOjM1OjMzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciBjb25maWd1cmluZyBwb3dlcnBjLSotZWFiaS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChHT1Rfc3ltYm9sKTogRGVmaW5lIGlmIG9iamVjdCBmb3JtYXQgaXMgRUxGLgotCi0JKiBjb25maWcvdGMtcHBjLmggKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlZmluZSBpZiBvYmplY3QKLQlmb3JtYXQgaXMgRUxGIGFuZCBub3QgZGVmaW5lZCB0byBiZSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIi4KLQotV2VkIEphbiAyNSAxNjoyMzoxMyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHRjLXNoLmMgKGxpdHRsZSk6IEFkZCBhcmd1bWVudCBJR05PUkUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBzcGFjZSBmb3IgY29uc2lzdGVudCBmb3JtYXR0aW5nLgotCShDT05EOF9SQU5HRSwgQ09ORDEyX1JBTkdFKTogRGVsZXRlIHVudXNlZCBtYWNyb3MuCi0JKENPTkQ4X0YsIENPTkQ4X00sIENPTkQxMl9GLCBDT05EMTJfTSwgVU5DT05EMTJfRiwgVU5DT05EMTJfTSk6Ci0JQ29ycmVjdCBtaW5pbXVtIGFuZCBtYXhpbXVtIGJyYW5jaCBvZmZzZXRzLiAgQWRkIGNvbW1lbnRzIGV4cGxhaW5pbmcKLQl3aHkgdGhlc2UgbnVtYmVycyBhcmUgY29ycmVjdC4KLQotV2VkIEphbiAyNSAxNTozMjowOSAxOTk1ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgbXB3cjIgYXMgYSBzeW5vbnltIGZvcgotCW1wd3J4OyBtcHBjMzIsIG02MDMsIGFuZCBtNjA0IGFzIHN5bm9ueW1zIGZvciBtcHBjOyBhbmQgbXBwYzY0IGFuZAotCW02MjAgZm9yIFBvd2VyUEM2NCBtb2RlLgotCShwcGNfc3ltYm9sX25ld19ob29rKTogQWRkIFQwIGFzIHN5bm9ueW0gZm9yIFRDMCBzdWZmaXguCi0KLVR1ZSBKYW4gMjQgMTY6NDQ6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXZheC5jICh2aXApOiBJbnRyb2R1Y2UgbmV3IHB0ci10by1jb25zdCBsb2NhbCB2YXJpYWJsZQotCWZvciBzY2FubmluZyBvcGVyYW5kIHN0cmluZy4KLQotCVNhdCBKYW4gMjEgMTc6NTA6MzggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy92YXgtaW5zdC5oIChzdHJ1Y3Qgdm9wLCBmaWVsZHMgYHZvcF93YXJuJywgYHZvcF9lcnJvcicpOgotCW1ha2UgdGhlbSBwb2ludGVycyB0byBjb25zdCBjaGFyOwotCShzdHJ1Y3Qgdml0LCBmaWVsZCBgdml0X2Vycm9yJyk6ICBkaXR0by4KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChtZF9hdG9mKTogIHJlbmFtZSBsb2NhbCBgbGl0dGxlbnVtX3BvaW50ZXInCi0JdG8gYGxpdHRsZW51bVAnIHRvIGF2b2lkIHNoYWRvd2luZyBmaWxlIHNjb3BlIHZhcmlhYmxlLgotCSogY29uZmlnL3RjLXZheC5jICh2aXBfYmVnaW4sIHZpcF9vcF9kZWZhdWx0cywgdmlwX29wXzEpOiAgbWFrZQotCXN0cmluZyBhcmd1bWVudHMgYmUgcG9pbnRlcnMgdG8gY29uc3QgY2hhcjsKLQkodmlwKTogIG1ha2UgYGFsbG9wZXJyJyBjb25zdCBjaGFyICo7Ci0JKHZpcF9vcCk6IG1ha2UgYGVycicgYW5kIGB3cm4nIGNvbnN0IGNoYXIgKjsgcmVuYW1lIGBhY2Nlc3MnIHRvCi0JYGFjY2Vzc19tb2RlJyB0byBhdm9pZCBzaGFkb3dpbmcgbGlicmFyeSBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGBzeW1ib2xfbmFtZScpOiAgbWFrZSBpdCBjb25zdCBjaGFyICo7Ci0JKGdldF9zdHJ1Y3RfbmFtZSk6ICBjYXN0IG9uZSB1c2Ugb2YgYHN5bWJvbF9uYW1lJyB0byBjaGFyICoKLQlbY2FsbGVyIGd1YXJhbnRlZXMgdGhhdCBpdCB3b24ndCBtb2RpZnkgdGhlIHBvaW50ZXIncyB0YXJnZXRdOwotCShQVVRfQ09VTlRFRF9TVFJJTkcpOiAgdXNlIHBvaW50ZXIgdG8gY29uc3QgY2hhcjsKLQkoVk1TX3R5cGVkZWZfcGFyc2UpOiAgbWFrZSBgcG50MicgY29uc3QgY2hhciAqOwotCShXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiAgbWFrZSBgY3AnIGNvbnN0IGNoYXIgKjsKLQkoVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzLCBhcnJheSBgQXR0cmlidXRlcycpOiAgbWFrZSBjb25zdCwKLQlhbmQgbWFrZSBmaWVsZCBgTmFtZScgcG9pbnRlciB0byBjb25zdCBjaGFyOwotCi0JKiBhcy5oIChgc2VnX25hbWVbXScgZGVjbGFyYXRpb24pOiAgcG9pbnRlcnMgdG8gY29uc3QgY2hhcjsKLQkoc3RydWN0IF9wc2V1ZG9fdHlwZSwgZmllbGQgYHBvY19uYW1lJyk6ICBwb2ludGVyIHRvIGNvbnN0IGNoYXIuCi0JKiBzdWJzZWdzLmMgKGBzZWdfbmFtZVtdJyBkZWZpbml0aW9uKTogIGRpdHRvOwotCSogaGFzaC5jIChoYXNoX2Fzayk6ICByZW5hbWUgYXJndW1lbnQgYGFjY2VzcycgdG8gYGFjY2Vzc190eXBlJwotCXRvIGF2b2lkIHNoYWRvd2luZyBsaWJyYXJ5IGZ1bmN0aW9uLgotCSogd3JpdGUuYyAodmFyaWFibGUgYHRoZV9vYmplY3RfZmlsZScpOiAgbW92ZSBmcm9tIGZpbGUgc2NvcGUKLQl0byBibG9jayBzY29wZSB3aXRoaW4gd3JpdGVfb2JqZWN0X2ZpbGUoKTsgZnJlZSBpdCBhZnRlciB1c2U7Ci0JKGZpeHVwX3NlZ21lbnQpOiAgY29uZGl0aW9uYWxseSBleGNsdWRlIGl0IGZvciBPQkpfVk1TLgotCShjdnRfZnJhZ190b19maWxsKTogIHJlbmFtZSBhcmd1bWVudCBgaGVhZGVycycgdG8gYGhlYWRlcnNQJwotCXRvIGF2b2lkIHNoYWRvd2luZyBmaWxlIHNjb3BlIHZhcmlhYmxlLgotCi1Nb24gSmFuIDIzIDIxOjQyOjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnRCcpOiBGaXggdHlwbyB3aGljaCBjYXVzZWQKLQltaXNjb21waWxhdGlvbiBvZiAiZGlhZyIgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gSmFuIDIzIDE1OjUxOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0KLU1vbiBKYW4gMjMgMTQ6MDc6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guaCAodGNfaW5pdF9hZnRlcl9hcmdzKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB0YWJsZS4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHAuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IENhc3QgZnJfYWRkcmVzcyB0byB1bnNpZ25lZCBsb25nIGZvciBwcmludGYuCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBhc193YXJuX3doZXJlIHJhdGhlciB0aGFuIGFzX3dhcm4uCi0JKHNoX2luaXRfYWZ0ZXJfYXJncyk6IFJlbW92ZSBlbXB0eSBmdW5jdGlvbi4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251KmVsZiopOiBOZXcgdGFyZ2V0LgotCi1TYXQgSmFuIDIxIDE5OjAyOjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogaGFzaC5jIChoYXNoX2Fzayk6IElmIHdlIGZpbmQgdGhlIHNsb3QgYWZ0ZXIgd3JhcHBpbmcgYXJvdW5kLAotCWJyZWFrIG91dCBvZiB0aGUgbG9vcC4gIEZpeGVzIGJ1ZyBpbiBKYW4gMTggY2hhbmdlLgotCi1GcmkgSmFuIDIwIDE3OjA3OjMxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGhhc2guYyAoaGFzaF9jb2RlKTogVW5kbyBsYXN0IGNoYW5nZS4KLQotVGh1IEphbiAxOSAxNDo0OTo0NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcyB0byBrZWVwCi0JZ2NjIHF1aWV0LgotCShncGRpc3BfaGkxNl9ob3d0byk6IERvbid0IHVzZSAiY29uc3QiIHdpdGggcmVsb2NfaG93dG9fdHlwZS4KLQkoaW5fcmFuZ2Vfc2lnbmVkKTogQWRkIHBhcmVucyBhcm91bmQgc3VidHJhY3Rpb24gaW5zaWRlIHNoaWZ0LgotCSogZ2FzcC5jIChkb19kYXRhKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZSAib3BuYW1lIi4KLQkoaXN0cnVlKTogUHJvdmlkZSBhIGRlZmF1bHQgY2FzZSB0byBzZXQgInJlcyIgYW5kIGtlZXAgImdjYyAtV2FsbCIKLQlxdWlldC4KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogRGVsZXRlZCB1bnVzZWQgdmFyaWFibGUuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogRGVjbGFyZS4KLQkqIGhhc2guYyAoaGFzaF9hc2spOiBEZWxldGUgZGlzYWJsZWQgbm9uLXN0cmNtcCB2ZXJzaW9uIG9mIHRoZQotCWNvZGUsIGFuZCBhdXRvbWF0aWMgdmFyaWFibGVzIHVzZWQgb25seSBpbiB0aG9zZSBzZWN0aW9ucy4KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBPbmx5IGRlZmluZSBsb2NhbCB2YXJpYWJsZQotCSJwcmV2X2ZpeCIgaWYgQkZEX0FTU0VNQkxFUi4KLQkqIGZsb251bS1rb25zdC5jIChkdW1teTEpOiBSZXR1cm4gdm9pZC4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBSZW1vdmUgdHdvIGNvbXBhcmlzb25zIG9mCi0JdW5zaWduZWQgbnVtYmVycyB2ZXJzdXMgemVyby4KLQkqIGFzLmggKGJjb3B5KTogSWYgbmVpdGhlciBtZW1jcHkgbm9yIGJjb3B5IGlzIGRlZmluZWQgYXMgYSBtYWNybywKLQlkZWZpbmUgdG8gdXNlIG1lbWNweS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMsIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogUmV2ZXJ0IDIgSnVuZSBjaGFuZ2VzLgotCVR1cm5zIG91dCB3ZSBuZXZlciBnb3QgdGhlIGFzc2lnbm1lbnQgZG9uZSBhZnRlciBhbGwuCi0KLQlDbGVhbnVwIG9mIFZBWCBhbmQgVk1TIGNvZGUsIGZyb20gUGF0IFJhbmtpbjoKLQkqIGNvbmZpZy9vYmotdm1zLmM6IENoYW5nZWQgZXhwb3J0ZWQgZnVuY3Rpb24gbmFtZXMgdG8gbG93ZXIgY2FzZS4KLQkoQ2hhbmdlZCBjYWxsIHNpdGVzIGluIHdyaXRlLmMuKSAgRGVjbGFyZSBWTVMgc3lzdGVtIGZ1bmN0aW9uCi0JbmFtZXMgdXNlZCwgY29uZGl0aW9uYWwgb24gYWN0dWFsbHkgYmVpbmcgb24gVk1TLiAgQ2hhbmdlZCBtYW55Ci0JZnVuY3Rpb25zIHRoYXQgcmV0dXJuZWQgbm8gdXNlZnVsIHZhbHVlIHRvIG5vdyBiZSBkZWNsYXJlZCB0bwotCXJldHVybiB2b2lkLiAgUmVtb3ZlZCBtYW55IHVudXNlZCB2YXJpYWJsZXMuICBTdXBwbHkgbWlzc2luZwotCXJldHVybiBzdGF0ZW1lbnRzIG9yIHZhbHVlcy4gIFN1cHBseSBgZGVmYXVsdCcgY2FzZSBpbiBzd2l0Y2gKLQlzdGF0ZW1lbnRzLiAgRW5zdXJlIGxvY2FsIHZhcmlhYmxlcyBnZXQgaW5pdGlhbGl6ZWQuCi0JKiBjb25maWcvdGMtdmF4LmM6IE1pbm9yIGNoYW5nZXMgdG8gc2lsZW5jZSAiZ2NjIC1XYWxsIi4KLQkqIGNvbmZpZy9vYmotdm1zLmgsIGNvbmZpZy90Yy12YXguaDogQWRkZWQgc29tZSBtaXNzaW5nCi0JZGVjbGFyYXRpb25zLgotCi1XZWQgSmFuIDE4IDEzOjQ5OjI2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGF0b2YtZ2VuZXJpYy5jIChmbG9udW1fcHJpbnQpIFtUUkFDRV06IE5ldyBmdW5jdGlvbi4KLQkoYXRvZl9nZW5lcmljKSBbVFJBQ0VdOiBQcmludCBtdWx0aXBsaWVyIGJlZm9yZSBtdWx0aXBsaWNhdGlvbiwKLQlhbmQgcHJpbnQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGJlZm9yZSBhbmQgYWZ0ZXIgY29weS4KLQotCSogZmxvbnVtLW11bHQuYyAoZmxvbnVtX211bHRpcCk6IEF2b2lkIHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zCi0JYXJvdW5kIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbi4KLQotCSogYXRvZi1nZW5lcmljLmMgKEFTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UKTogRGVmaW5lLgotCShhdG9mX2dlbmVyaWMpIFtBU1NVTUVfREVDSU1BTF9NQVJLX0lTX0RPVF06IENoZWNrIGZvciAnLicKLQlleHBsaWNpdGx5IGluc3RlYWQgb2YgY2FsbGluZyBzdHJjaHIuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFdoZW4gc2Nhbm5pbmcgc3VjY2Vzc2l2ZSBvcGNvZGUKLQl0YWJsZSBlbnRyaWVzLCBjaGVjayBuYW1lcyBmb3IgcG9pbnRlciBlcXVhbGl0eSBiZWZvcmUgZG9pbmcKLQlzdHJpbmcgY29tcGFyaXNvbnMuCi0KLQkqIGhhc2guYyAoaGFzaF9hc2spOiBDYWxsIHN0cmNtcCBpbnN0ZWFkIG9mIGV4cGFuZGluZyBpdCBpbmxpbmUuCi0JKGhhc2hfY29kZSk6IFJlcGxhY2VkIHdpdGggYSB2ZXJzaW9uIGZyb20gYmZkLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBDT0ZGX0ZMQUdTIGlzbid0Ci0JZGVmaW5lZCwgZGVmYXVsdCBpdCB0byB6ZXJvLgotCi1XZWQgSmFuIDE4IDEyOjE2OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IENsZWFyIGZ4X2JzciBvbiB0aG9zZSB0YXJnZXRzIHdoaWNoCi0JdXNlIGl0LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBQYXJlbnRoZXNpemUgJiYgd2l0aGluIHx8LgotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBMaWtld2lzZS4KLQkobGlzdF9zeW1ib2xfdGFibGUpOiBVc2UgJWx1IHRvIHByaW50IHNpemVvZi4KLQkqIHN5bWJvbHMuYzogQ29tbWVudCBvdXQgdW51c2VkIGZ1bmN0aW9uIGluZGVudC4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBDYXN0IHBvaW50ZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBPbmx5IGRlY2xhcmUgc3ltYm9sX3B0ciBpZiBpdAotCXdpbGwgYmUgdXNlZC4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9iZWdpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcmVnLgotCShnZXRfb3BlcmFuZCk6IERlY2xhcmUgdHlwZSBvZiBwYXJhbWV0ZXIgZGlyZWN0aW9uLiAgUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlIHNpemUuCi0JKGdldF9zcGVjaWZpYyk6IEZpeCBjb21tZW50IHRvIGF2b2lkIG5lc3RlZCBjb21tZW50cy4KLQkoY2hlY2tfb3BlcmFuZCk6IENhc3QgWF9hZGRfbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkoYnVpbGRfYnl0ZXMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcyBvdXRwdXRfcHRyLCBwYXJ0LCBhbmQKLQloaWdoLgotCShidWlsZF9ieXRlcyk6IENhc3QgWF9hZGRfbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkoY2xldmVyX21lc3NhZ2UpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHNjYW4uCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQkqIHRjLWg4MzAwLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0KLVR1ZSBKYW4gMTcgMTA6NTg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzQ2NTApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IEhhbmRsZSBhIGNwdSBzdHJpbmcgb2YgIjQ2NTAiLiAgSWYgbWlwc180NjUwIHdhcyBub3QKLQlpbml0aWFsaXplZCwgc2V0IGl0IHRvIDAuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3QgaW5zZXJ0IG5vcHMgYXJvdW5kIEhJIGFuZCBMTyBvbiBhIDQ2NTAuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBMaWtld2lzZS4KLQkobWlwc19pcCk6IFVzZSBJTlNOX0lTQSBtYXNrIHRvIGNoZWNrIElTQSBvZiBpbnN0cnVjdGlvbi4gIENoZWNrCi0JZm9yIElOU05fNDY1MC4KLQkobWRfbG9uZ29wdHMpOiBBZGQgbTQ2NTAgYW5kIG5vLW00NjUwLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbWlwcy1jcHU9NDY1MC4gIEhhbmRsZSAtbTQ2NTAgYW5kCi0JLW5vLW00NjUwLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBNSVBTIG9wdGlvbnMuCi0KLVNhdCBKYW4gMTQgMjM6NDg6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAam9ubnk+Ci0KLQkqIGNvbmZpZy90Yy13NjUuYywgY29uZmlnL3RjLXc2NS5oLCBjb25maWcvdzY1Lm10OiBOZXdmaWxlcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBDb3BlIHdpdGggdzY1LgotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IFJlY29nbml6ZSB3NjUuCi0KLVRodSBKYW4gMTIgMTc6NTY6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcikgW19fR05VQ19fICYmIF9fT1BUSU1JWkVfX106IElmIGBnZXQnCi0JZnVuY3Rpb24gaXMgc2NydWJfZnJvbV9maWxlLCBjYWxsIHNjcnViX2Zyb21fZmlsZSBkaXJlY3RseSwgYW5kCi0JZ2V0IGdjYydzIGlubGluaW5nIGNhcGFiaWxpdHkgaW50byB0aGUgYWN0LgotCi0JKiBNYWtlZmlsZS5pbiAoVk1TX09USEVSX09CSlMpOiBBZGQgLi4vbGliaWJlcnR5L2hleC5vLgotCShPQkpTKTogRGVsZXRlIGhleC12YWx1ZS5vLgotCShSRUFMX1NPVVJDRVMpOiBEZWxldGUgaGV4LXZhbHVlLmMuCi0JKGhleC12YWx1ZS5vKTogRGVsZXRlIGRlcGVuZGVuY2llcy4KLQkqIGhleC12YWx1ZS5jOiBEZWxldGVkLgotCSogYXMuYyAobWFpbik6IENhbGwgaGV4X2luaXQuCi0JKiBleHByLmMsIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguICBSZXBsYWNlCi0JaGV4X3ZhbHVlIGFycmF5IHJlZmVyZW5jZXMgd2l0aCBoZXhfKiBtYWNyb3MuCi0KLVdlZCBKYW4gMTEgMTc6NTE6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmggKENPRkZfRkxBR1MpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoQ09GRl9GTEFHUyksIGNvbmZpZy90Yy1zaC5oIChDT0ZGX0ZMQUdTKSwKLQljb25maWcvdGMtejhrLmggKENPRkZfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKEtFRVBfUkVMT0NfSU5GTyk6IE1ha2Ugc3VyZSBpdCdzIGFsd2F5cwotCWRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2VzIEFPRkYgYW5kIEFJTkRFWCk6IERvbid0Ci0JZ2VuZXJhdGUgNjgwMjAgYWRkcmVzc2luZyBtb2RlcyBmb3IgYSA2ODAwMCBwcm9jZXNzb3IuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBjYXNlcyBQQ1JFTCBhbmQgUENMRUEpOiBEaXR0by4KLQotVHVlIEphbiAxMCAxMzozNDoxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCB0cmVhdCBoODMwMCBhbmQgejhrCi0Jc3BlY2lhbGx5IHdpdGggcmVnYXJkIHRvIGZpeHVwcy4KLQotTW9uIEphbiAgOSAxNjoyMjoyOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChSRUxBWF9SRUxPQzEsIFJFTEFYX1JFTE9DMik6IENhc3QgdmFsdWVzIHRvCi0JYmZkX3ZtYSBiZWZvcmUgc3VidHJhY3RpbmcuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzaXplX3NlY3Rpb24pOiBIYW5kbGUgcnNfc3BhY2UgbGlrZSByc19maWxsLAotCWJ1dCBtYWtlIHN1cmUgZnJfc3ltYm9sIGlzIG51bGwuCi0JKGZpbGxfc2VjdGlvbik6IERpdHRvLgotCi1TdW4gSmFuICA4IDE2OjE0OjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZpeCBoYW5kbGluZyBvZiBmbG9hdGluZyBwb2ludAotCXZhbHVlcyB3aGVuIEdQT1BUIGlzIG5vdCBkZWZpbmVkLgotCi1GcmkgSmFuICA2IDE2OjU5OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYzogSW5jbHVkZSBzdHJpbmcuaC4gIFB1dCBjb25maWcuaCBiZWZvcmUgb3RoZXIgaW5jbHVkZXMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IERlbGF5IGNhbGxzIHRvIGVtaXRfYWRkNjQgdW50aWwKLQlhZnRlciBhbnkgcmVtYWluaW5nIG9wZXJhbmRzIGFyZSBhbHNvIGtub3duIHRvIG1hdGNoLgotCi1GcmkgRGVjIDMwIDE4OjIxOjQxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBCdWlsZCBhIGZvcm1hdCBzdHJpbmcgYmFzZWQgb24KLQl0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgdG8gYmUgcHJpbnRlZCwgYXMgbG9uZyBhcyAidW5zaWduZWQgbG9uZyIgaXMKLQlhdCBsZWFzdCBhcyB3aWRlLCBhZnRlciBoYW5kbGluZyB0aGUgc3BlY2lhbCBjYXNlIG9mIDQtYnl0ZQotCXZhbHVlcy4KLQotCSogTWFrZWZpbGUuaW4gKGRlcGVuZGVuY2llcyk6IE1ha2UgJChPQkpTKSBkZXBlbmQgb24gYXMuaCBhbmQKLQlldmVyeXRoaW5nIGl0IGluY2x1ZGVzLiAgRGVsZXRlIHRob3NlIGZpbGVzIGZyb20gcGVyLWZpbGUKLQlkZXBlbmRlbmNpZXMuCi0KLQkqIGFzLmggKHJlbGF4X3N1YnN0YXRlVCk6IE5vdyBkZWZpbmVkIHRvIGJlIHVuc2lnbmVkIGludC4KLQkocmVsYXhfc3RhdGVUKTogU2VwYXJhdGUgdHlwZWRlZiBmcm9tIGVudW0gZGVmaW5pdGlvbi4KLQkoZW51bSBfcmVsYXhfc3RhdGUpOiBSZW9yZGVyZWQgZm9yIGJldHRlciBwdW5jdHVhdGlvbi4gIEFkZGVkIG5ldwotCXZhbHVlcyByc19hbGlnbl9jb2RlIGFuZCByc19zcGFjZS4KLQkobGluZW5vLCBzdHJ1Y3QgbGluZW5vX3N0cnVjdCk6IFVudXNlZCwgZGVsZXRlZC4KLQotCSogYXMuaDogTm8gbG9uZ2VyIGluY2x1ZGUgYXNzZXJ0LmguCi0JKGFzX2Fzc2VydCk6IERlY2xhcmUuCi0JKGFzc2VydCk6IE5ldyBkZWZpbml0aW9uLCBjYWxscyBhc19hc3NlcnQgbG9uZ2VyIG5lZWRlZC4KLQkoX19QUkVUVFlfRlVOQ1RJT05fXyk6IFByb3ZpZGUgZGVmYXVsdCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgZ2NjLgotCSogbWVzc2FnZXMuYyAoYXNfYXNzZXJ0KTogTmV3IGZ1bmN0aW9uLgotCSogZ2RiaW5pdC5pbjogUHV0IGEgYnJlYWtwb2ludCB0aGVyZS4KLQotCSogcmVhZC5jIChzX3NwYWNlKTogUmV3cml0ZSB0byBoYW5kbGUgZ2VuZXJhbCBleHByZXNzaW9ucy4KLQlHZW5lcmF0ZSByc19zcGFjZSBmcmFncyBmb3Igbm9uLWNvbnN0YW50IHZhbHVlcy4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBUcmVhdCByc19hbGlnbl9jb2RlIGFuZCByc19zcGFjZQotCWxpa2UgcnNfYWxpZ24gYW5kIHJzX29yZy4gIFZlcmlmeSB0aGF0IGZyX29mZnNldCBpcyBub24tbmVnYXRpdmUsCi0JYW5kIGZvcmNlIGZyYWcgdHlwZSB0byByc19maWxsIG9ubHkgYWZ0ZXIgYXNzZXJ0aW9uIGNoZWNrcy4KLQkocmVsYXhfc2VnbWVudCk6IFRyZWF0IHJzX2FsaWduX2NvZGUgbGlrZSByc19hbGlnbi4gIFRyZWF0Ci0JcnNfc3BhY2UgbGlrZSByc19vcmcgaW4gdGhlIGZpcnN0IHN3aXRjaDsgaW4gdGhlIHNlY29uZCwgZm9yY2UgdGhlCi0Jb3BlcmFuZCB0byBhIGNvbnN0YW50LCBhbmQgdXNlIGl0IGZvciB0aGUgZ3Jvd3RoIHNpemUuCi0KLVdlZCBEZWMgMjggMjA6NTc6MzcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlKTogRm9yIHNlY3Rpb25zIHdpdGggdGhlIFpFUk8KLQlhdHRyaWJ1dGUsIHNldCB0aGUgImJzcyIgZmllbGQgaW4gdGhlIGFwcHJvcHJpYXRlIHNlZ2luZm8gc3RydWN0dXJlLgotCi1XZWQgRGVjIDI4IDE1OjAxOjAxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaDogSW5jbHVkZSBvYnN0YWNrLmguCi0KLVR1ZSBEZWMgMjcgMTg6MTY6MDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBFbmFibGUgYWxpZ24qIGNvbXBvbmVudHMgbm93LgotCi1UdWUgRGVjIDIwIDE0OjU2OjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfaW5pdCk6IENhbGwgb2JzdGFja19iZWdpbiBvbiBgZnJhZ3MnLgotCSogc3Vic2Vncy5jIChzdWJzZWdzX2JlZ2luKTogRG9uJ3QgZG8gaXQgaGVyZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGZyYWdfaW5pdCBiZWZvcmUgc3Vic2Vnc19iZWdpbi4KLQotCSogZnJhZ3MuYyAoZnJhZ19hcHBlbmRfMV9jaGFyKTogTmV3IGZ1bmN0aW9uLgotCSogZnJhZ3MuaCAoZnJhZ19hcHBlbmRfMV9jaGFyKTogRGVjbGFyZSBpdC4KLQkoRlJBR19BUFBFTkRfMV9DSEFSKTogQ2FsbCBpdC4gIE9sZCBkZWZpbml0aW9uIGlzIGNvbW1lbnRlZCBvdXQKLQlmb3Igbm93LgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IEFkZGVkIChidXQgY29tbWVudGVkIG91dCkgbmV3IGZpZWxkcyBmb3IKLQl0cmFja2luZyBjdXJyZW50IGFsaWdubWVudC4KLQkoZnJhZ19ub3dfZml4KTogQ2hhbmdlZCBtYWNybyB0byBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQkqIGZyYWdzLmMgKGZyYWdfbm93X2ZpeCk6IERlZmluZSBmdW5jdGlvbiBoZXJlLgotCShmcmFnX25ldyk6IFVzZSBpdCBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBgZnJhZ3MnIGRpcmVjdGx5LgotCSogZnJhZ3MuaCAoZnJhZ3MpOiBDaGFuZ2UgY29tbWVudCB0byBpbmRpY2F0ZSBpdCBzaG91bGRuJ3QgYmUKLQlhY2Nlc3NlZCBkaXJlY3RseS4KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IGZyY2hhaW4pOiBOZXcgZmllbGQgZnJjaF9vYnN0YWNrLCBpbnRlbmRlZCB0bwotCWV2ZW50dWFsbHkgcmVwbGFjZSBnbG9iYWwgYGZyYWdzJyBvYnN0YWNrLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBVc2UgZnJhZ19ub3dfZml4IGluc3RlYWQgb2YKLQlhY2Nlc3NpbmcgYGZyYWdzJyBkaXJlY3RseS4gIEluaXRpYWxpemUgZmllbGRzIG9mIG5ldyBmcmNoYWluUwotCWV4cGxpY2l0bHkgaW5zdGVhZCBvZiB3aXRoIG1lbXNldC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9sbikgWyFCRkRfQVNTRU1CTEVSXTogVXNlCi0JZnJhZ19ub3dfZml4LgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19sb2MpLCBjb25maWcvb2JqLXZtcy5jCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZiksIHN5bWJvbHMuYyAoY29sb24pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBVc2Ugb2Zmc2V0VCBhbmQgYWRkcmVzc1QKLQlpbnN0ZWFkIG9mIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcuCi0JKG1kX2FwcGx5X2ZpeCk6IENhc3QgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oLCBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1lbGYuaCwKLQljb25maWcvb2JqLXNvbS5oLCBjb25maWcvdGMtaDg1MDAuYywgY29uZmlnL3RjLWhwcGEuYywKLQljb25maWcvdGMtaHBwYS5oLCBjb25maWcvdGMtc2guYywgY29uZmlnL3RjLXo4ay5jOiBEb24ndCByZWx5IG9uCi0JdXNlIG9mICIuLiIgd2hlbiBpbmNsdWRpbmcgaGVhZGVyIGZpbGVzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFJlZm9ybWF0IGNvbmRpdGlvbiBpbiBhbiBgaWYnCi0Jc3RhdGVtZW50LgotCi0JKiBNYWtlZmlsZS5pbiAoU1VCRElSX0lOQ0xVREVTKTogRGVsZXRlZC4KLQotVHVlIERlYyAyMCAxMzo0MDozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBJbmNsdWRlIGJmZC9saWJjb2ZmLmgsIG5vdCBsaWJjb2ZmLmguCi0KLU1vbiBEZWMgMTkgMTY6NTM6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmV3cml0ZSB0byBoYW5kbGUgT19iaWcgNjQgYml0Ci0JY29uc3RhbnRzLgotCShtaXBzX2lwKTogQWNjZXB0IE9fYmlnIGNvbnN0YW50cyBpbiBjYXNlICdJJy4gIENoYW5nZSBjYXNlCi0JJ2knLydqJyB0byB0cmVhdCBhbiBPX2JpZyBjb25zdGFudCBhcyBhbiBvdXQgb2YgcmFuZ2UgdmFsdWUuCi0KLU1vbiBEZWMgMTkgMTQ6MTU6MDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlKTogTWFrZSBzdXJlIFNFQ19IQVNfQ09OVEVOVFMgaXMKLQljbGVhciBmb3IgYSBzZWN0aW9uIHdpdGggdGhlICJaRVJPIiBhdHRyaWJ1dGUuCi0KLQkqIFJlZHVjZSB1c2VsZXNzIHN5bWJvbHMgZm9yIEVMRiBpbiBhbiBhdHRlbXB0IHRvIG1ha2Ugc21hbGxlcgotCW9iamVjdHMgYW5kIHNwZWVkIHVwIHRoZSBsaW5rZXIuCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdHJ1Y3QgY2FsbF9pbmZvKTogUmVwbGFjZSBlbmRfc3ltYm9sIGZpZWxkCi0Jd2l0aCBhIHNpemUgZmllbGQuCi0JKGhwcGFfZWxmX21hcmtfZW5kX2Z1bmN0aW9uKTogRGVsZXRlIHVubmVlZGVkIGZ1bmN0aW9uLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBGb3IgdGhlIDJuZCB1bndpbmQgcmVsb2NhdGlvbiwgdXNlCi0JdGhlIGZ1bmN0aW9uIHN5bWJvbCArIGZ1bmN0aW9uIHNpemUgaW5zdGVhZCBvZiBhIHNwZWNpYWwgc3ltYm9sCi0JZm9yIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgotCShwcm9jZXNzX2V4aXQpOiBDb21wdXRlIHRoZSBmdW5jdGlvbiBzaXplIGhlcmUuICBEb24ndCBjYWxsCi0JaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gYW55bW9yZS4KLQkocGFfcHJvY2VuZCk6IExpa2V3aXNlLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogT25seSByZWplY3QgMzJiaXQgcmVsb2NhdGlvbnMgZm9yIFNPTS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IFNpbXBsaWZ5LgotCi1Nb24gRGVjIDE5IDEzOjQ5OjA3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG1pcHMtc29ueS1ic2QgYW5kIG1pcHMtZGVjLWJzZCwgYnV0Ci0JcmVqZWN0IG90aGVyIHZlbmRvcnMgdW50aWwgd2UgY2FuIGJlIHN1cmUgd2UncmUgY29uc2lzdGVudCB3aXRoCi0JYmZkLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDcmVhdGVfVk1TX09iamVjdF9GaWxlKTogSW5zdGVhZCBvZiBmb3JtYXR0aW5nCi0JYSBidWZmZXIgdG8gcGFzcyB0byBgZXJyb3InLCBqdXN0IGNhbGwgYGFzX2ZhdGFsJyBkaXJlY3RseS4KLQkoVk1TX1BzZWN0X1NwZWMpOiBEaXR0by4KLQkoVk1TX1RCVF9Nb2R1bGVfQmVnaW4sIFZNU19UQlRfU291cmNlX0ZpbGUsIGdlbjEsCi0JVk1TX3R5cGVkZWZfcGFyc2UsIFZNU19MU1lNX1BhcnNlLCBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMpOiBDYWxsCi0JYXNfdHNrdHNrIGluc3RlYWQgb2YgcHJpbnRmLgotCShWTVNfVEJUX01vZHVsZV9CZWdpbiwgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uLAotCVZNU19UQlRfU291cmNlX0ZpbGUsIFZNU19UQlRfU291cmNlX0xpbmVzLAotCVZNU19TdG9yZV9SZXBlYXRlZF9EYXRhLCBWTVNfQ2hlY2tfRm9yX01haW4pOiBVc2UgZXhwbGljaXQKLQlpbnRlZ2VycyByYXRoZXIgdGhhbiBzaXplb2YgZXhwcmVzc2lvbnMgdXNpbmcgYmFzaWMgaW50ZWdlciB0eXBlcywKLQlpbiBjYXNlIGhvc3QgYW5kIHRhcmdldCBhcmVuJ3QgdGhlIHNhbWUuICBVc2UgbWVtY3B5IG9yIENPUFlfKgotCW1hY3JvcyBpbnN0ZWFkIG9mIHBvc3NpYmx5IHVuYWxpZ25lZCB3b3JkIG9yIGxvbmd3b3JkIGFzc2lnbm1lbnQuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogTmV3IG1hY3JvLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlLAotCVZNU19DaGVja19Gb3JfTWFpbiwgVk1TX3dyaXRlX29iamVjdF9maWxlKTogVXNlIHN5X29iaiBpbnN0ZWFkIG9mCi0JZm9yY2luZyBzeV9udW1iZXIgdG8gaG9sZCBhIHBvaW50ZXIuCi0KLUZyaSBEZWMgMTYgMTQ6NDA6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogRG9uJ3QgZmlsbCBpbiBtZF9yZWxheF90YWJsZSBoZXJlLgotCShtZF9yZWxheF90YWJsZSk6IFVzZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwYXJzZV9leHAsIGdldF9vcGVyYW5kcywgY2xldmVyX21lc3NhZ2UsCi0JbWRfYXNzZW1ibGUsIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgbWRfdW5kZWZpbmVkX3N5bWJvbCwKLQl0Y19oZWFkZXJzX2hvb2ssIG1kX29wZXJhbmQsIG1kX251bWJlcl90b19jaGFycyk6IERvbid0IHVzZSBERUZVTi4KLQotCSogTWFrZWZpbGUuaW4gKENIRUNLRkxBR1MpOiBEb24ndCBwYXNzIEFTX0ZPUl9UQVJHRVQsCi0JQ0NfRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VULCBOTV9GT1JfVEFSR0VUOyB0aGV5J3JlIG5vdAotCXVzZWQuCi0JKEFTX0ZPUl9UQVJHRVQsIENDX0ZPUl9UQVJHRVQsIE9CSkRVTVAsIE9CSkRVTVBfRk9SX1RBUkdFVCwgTk0sCi0JTk1fRk9SX1RBUkdFVCk6IERvbid0IGRlZmluZS4KLQkoVk1TX09USEVSX09CSlMpOiBBZGQgeG1hbGxvYy5vIGFuZCB4ZXhpdC5vIGZyb20gbGliaWJlcnR5LgotCSh0b29sZGlyKTogVXNlIGV4ZWNfcHJlZml4LCBub3QgbGliZGlyLgotCi1GcmkgRGVjIDE2IDExOjA3OjEwIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IEluY2x1ZGUgbGliY29mZi5oLCBub3QgLi4vYmZkL2xpYmNvZmYuaC4KLQotCSogYXMuaDogSW5jbHVkZSBwcm9ncmVzcy5oLgotCSogYXMuYyAobWFpbik6IENhbGwgU1RBUlRfUFJPR1JFU1MgYW5kIEVORF9QUk9HUkVTUy4KLQkobWFpbiwgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ2FsbCBQUk9HUkVTUy4KLQotRnJpIERlYyAxNiAwMDo0NjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGJmZF9pc191bmRfc2VjdGlvbiBhbmQKLQliZmRfaXNfYWJzX3NlY3Rpb24gcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgJmJmZF91bmRfc2VjdGlvbgotCWFuZCAmYmZkX2Fic19zZWN0aW9uLgotCi1UaHUgRGVjIDE1IDE1OjI3OjE0IDE5OTQgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogVXNlIGEgbG9jYWwgdmFyaWFibGUgd2hlbgotCWluaXRpYWxpemluZyBtZF9yZWxheF90YWJsZSB0byBhdm9pZCBlcnJvcnMgYWJvdXQgbW9kaWZ5aW5nIGEKLQljb25zdCBkYXRhIHN0cnVjdHVyZS4KLQotVHVlIERlYyAxMyAxNTo0MjoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAodGNfZ2VuX3JlbG9jKTogUmVtb3ZlIE9CSl9FTEYgaGFjayB3aGljaAotCWFwcGVhcnMgdG8gbm8gbG9uZ2VyIGJlIG5lZWRlZC4KLQotVHVlIERlYyAxMyAwODowNDoxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogQWNjZXB0IEJGRF9SRUxPQ19QQ1JFTCogd2l0aG91dAotCXJlcXVpcmluZyB0aGF0IHRoZSBYX29wX3N5bWJvbCBiZSBpbiB0aGUgdGV4dF9zZWN0aW9uLgotCShtYWNybyk6IENoYW5nZSB0aGUgdGVzdCBmb3IgYSBsZWdlbCBleHByZXNzaW9uIGRpZmZlcmVuY2UgdG8KLQljb3JyZXNwb25kIHRvIGNoYW5nZXMgaW4gcHNldWRvX3NldCBpbiByZWFkLmMuCi0KLUZyaSBEZWMgIDkgMjE6MDQ6MTcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKSBbUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFXTogVXNlCi0JYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogSWYgdGhlcmUgaXMgbm8gY3VycmVudAotCXJvdXRpbmUsIGp1c3QgcmV0dXJuLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXAsIGNhc2UgJ0InLCBzdWJjYXNlICdjJyk6IFVzZSBvcGNvZGUKLQl2YWx1ZSBmcm9tIHBhdHRlcm4gaW5zdGVhZCBvZiBhc3N1bWluZyBqc3IuCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGptcCk6IEFkZCBhICIxLEJjIiBmb3JtLgotCi1UaHUgRGVjICA4IDE3OjQ4OjI1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChOTV9GT1JfVEFSR0VUKTogVXNlIC4uL2JpbnV0aWxzL25tLm5ldywgbm90IGp1c3QKLQlwbGFpbiBubS4KLQotCSogY29uZmlndXJlLmluIChuczMyay1wYzUzMi1tYWNoKik6IFNlbGVjdCBjb3JyZWN0IGVtdWxhdGlvbi4KLQkobWlwcy1zb255LWJzZCopOiBVc2UgZWNvZmYuCi0JKG1pcHMtKi1nbnUqKTogTmV3IHRhcmdldCwgdXNpbmcgYW91dCBmb3JtYXQsIGZyb20gUm9sYW5kIE1jR3JhdGguCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDI5IDEzOjU4OjEwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlVc2UgbGliaWJlcnR5IHZlcnNpb24gb2YgeG1hbGxvYzoKLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMpOiBEZWxldGUgeG1hbGxvYy5jLgotCShPQkpTKTogRGVsZXRlIHhtYWxsb2Muby4KLQkoeG1hbGxvYy5vKTogRGVsZXRlIGRlcGVuZGVuY2llcy4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSBvbmNlIHByb2dyYW0gbmFtZSBpcwotCWtub3duLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoaW5fcmFuZ2Vfc2lnbmVkLCBpbl9yYW5nZV91bnNpZ25lZCk6IE5ldwotCXJvdXRpbmVzLCBzcGxpdCBmcm9tIGluX3JhbmdlLgotCShpbl9yYW5nZSk6IERlbGV0ZWQuICBBbGwgY2FsbHMgY2hhbmdlZCB0byBpbl9yYW5nZV8qc2lnbmVkLgotCShjcmVhdGVfbGl0YV9zZWN0aW9uKTogTWFjcm8gZGVsZXRlZC4gIFNpbmdsZSB1c2UgZXhwYW5kZWQgaW4KLQlwbGFjZS4KLQkoYWxwaGFfaXApOiBIYW5kbGUgYHQnIGFuZCBgOCcgb3BlcmFuZCB0eXBlcy4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ18xMl9QQ1JFTC4gIFByaW50IG5hbWUgb2YKLQl1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlcy4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogQWRkZWQgSEFMVCBhbmQgRFJBSU5BLiAgRGlzYWJsZWQgTU9WSSwKLQlzaW5jZSBpdCBkb2Vzbid0IHdvcmssIGFuZCBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIG5hdGl2ZQotCWFzc2VtYmxlci4KLQotCSogaW5wdXQtc2NydWIuYzogQ2hhbmdlIHdvcmRpbmcgb2YgYSBjb21tZW50IHRvIGF2b2lkIGludGVyZmVyZW5jZQotCXdpdGggQ3lnbnVzIHNvdXJjZS1jb250cm9sIHRvb2xzLgotCi0JKiBhcy5oIChlcnJubykgW05FRURfREVDTEFSQVRJT05fRVJSTk9dOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogTGlzdCBidXNjciBhbmQgcGNyIGNvbnRyb2wKLQlyZWdpc3RlcnMuCi0JKG02OGtfaXAsIGNhc2UgJ0onKTogSGFuZGxlIHRoZW0uCi0KLQlEZWxldGUgc2lnbmFsIGhhbmRsZXIgY29kZS4gIEl0J3MgYmVlbiBkaXNhYmxlZCBzaW5jZSBNYXJjaCAxOTkzCi0Jd2l0aG91dCBjb21wbGFpbnRzLgotCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBzaWduYWwuaC4KLQkoZ290X3NpZyk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLCBkZWNsYXJhdGlvbiBkZWxldGVkLgotCShTSUdUWSk6IE1hY3JvIGRlbGV0ZWQuCi0JKG1haW4pOiBEZWxldGVkIGRpc2FibGVkIGNvZGUgZm9yIGVzdGFibGlzaGluZyBzaWduYWwgaGFuZGxlci4KLQotTW9uIE5vdiAyOCAxMTozNzozNSAxOTk0ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSW5zZXJ0IG1pc3NpbmcgbmV3bGluZSBhdCBlbmQgb2YgZmlsZQotCWxpa2Ugd2FybmluZyBzYXlzIHdlIGRvLgotCi1Nb24gTm92IDI4IDAwOjExOjE1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChwYV9jaGVja19lb2YpOiBEZWNsYXJlIG5ldyBleHRlcm4gZnVuY3Rpb24uCi0JKHRjX2Zyb2JfZmlsZSk6IERlZmluZSB0byBjYWxsIHBhX2NoZWNrX2VvZi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UpOiBOZXcKLQlmdW5jdGlvbiB0byB2ZXJpZnkgdGhlIGN1cnJlbnQgc3BhY2UgYW5kIHN1YnNwYWNlIGFyZSByZWFzb25hYmxlLgotCUNhbGwgZm9yIHRoZSBhcHByb3ByaWF0ZSBwc2V1ZG8tb3BzIGFuZCBiZWZvcmUgaW5zdHJ1Y3Rpb24gcGFyc2luZy4KLQkocGFfY2hlY2tfZW9mKTogTmV3IGZ1bmN0aW9uIHRvIHZlcmlmeSBlbnRlci9leGl0IGFuZCBwcm9jL3Byb2NlbmQKLQlwYWlycyBtYXRjaCBhdCBFT0YuCi0JKHBhX2NvZGUpOiBTaW1wbGlmeS4KLQotCSogY29uZmlnL29iai1zb20uYzogRGVsZXRlICNpZiAwIGNvZGUuCi0KLVdlZCBOb3YgMjMgMTk6MzY6MDkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpOiBTZWxlY3QgYmV0d2VlbiBjb2ZmLXNobCBhbmQKLQljb2ZmLXNoLgotCSogY29uZmlnL3NoLm1oIChUQVJHX0NQVV9ERVBFTkRFTlRTKTogR2V0IGl0IHJpZ2h0LgotCSogY29uZmlnL3RjLXNoLmMgIChsaXR0bGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IE5vdGljZSBuZXcgb3B0aW9uLgotCShidWlsZF9yZWxheCwgYnVpbGRfTXl0ZXMsIG1kX2F0b2YsIG1kX2NvbnZlcnRfZnJhZywgbWRfYXBwbHlfZml4KToKLQlDb3BlIHdpdGggbGl0dGxlIGVuZGlhbiBkYXRhLgotCSogY29uZmlnL3RjLXNoLmggKENPRkZfTUFHSUMsIExJU1RJTkdfSEVBREVSKTogRW5kaWFuIGRlcGVuZGVudC4KLQotV2VkIE5vdiAyMyAxMDo1NDozOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jLCBFTEYgdmFyaWFudCk6IFJldmVydCBsYXN0Ci0JY2hhbmdlLiAgVGhlIHJlYWwgYnVnIHdhcyBpbiBiZmQvZWxmY29kZS5oIGFuZCBoYXMgYmVlbiBmaXhlZC4KLQotVHVlIE5vdiAyMiAyMzozMToyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jLCBFTEYgdmFyaWFudCk6IEFkZCBzZWN0aW9uLT52bWEKLQl0byB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4KLQotVHVlIE5vdiAyMiAxNDozNzo1OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9YRk9STSk6IEZpeCB0eXBvLgotCi1UdWUgTm92IDIyIDEwOjIzOjI1IDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfc2V0KTogSWdub3JlIHRoZSAuc2V0IChubyltb3ZlIGFuZAotCSAgLnNldCAobm8pdm9sYXRpbGUgZGlyZWN0aXZlcy4KLQotVHVlIE5vdiAxNSAyMTo0NDoxMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBNYWtlIHN1cmUgdG8gYWx3YXlzIHJlc2V0Ci0JY3VycmVudF9zdWJzcGFjZS4KLQkocGFfdGV4dCwgcGFfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9hbGlnbik6IE5ldyBmdW5jdGlvbi4gIEFsaWducyB0aGUgY3VycmVudAotCW9mZnNldCB3aXRoaW4gdGhlIGN1cnJlbnQgc3Vic3BhY2UgYWxvbmcgd2l0aCB1cGRhdGluZyB0aGUKLQlhbGlnbm1lbnQgb2YgdGhlIHN1YnNwYWNlIGl0c2VsZi4KLQkocGFfc3Vic3BhY2UpOiBEZWZhdWx0IGFsaWdubWVudCB0byBvbmUgYnl0ZSByYXRoZXJuIHRoYW4gemVybwotCWJ5dGVzIHRvIGF2b2lkIHNldHRpbmcgYWxpZ25tZW50IHRvIGxvZzIoMCkuCi0JKG1kX3BzZXVkb190YWJsZSk6IFVzZSBwYV9hbGlnbm1lbnQgZm9yIC5hbGlnbi4KLQotVHVlIE5vdiAxNSAxNToyNDo0NSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IEFsd2F5cyBwdXQgYSBzcGFjZSBhZnRlciAiZmF0YWwgZXJyb3I6IgotCXdoZW4gcHJpbnRpbmcgbWVzc2FnZS4KLQotVHVlIE5vdiAxNSAxMToxMDo0MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAob2JqX2Zyb2Jfc3ltYm9sKTogRGVsZXRlLgotCSh0Y19mcm9iX3N5bWJvbCk6IE1ha2UgZGVmaW5pdGlvbiBjb25kaXRpb25hbCBvbiBPQkpfU09NIG9yCi0JT0JKX0VMRi4gIEZvciBFTEYgc3VidHJhY3Qgb3V0IHN5bWJvbC0+c2VjdGlvbi0+dm1hIGZvciBub24gY29tbW9uCi0Jc3ltYm9scy4KLQotV2VkIE5vdiAgOSAxNDo1MzowMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGUtZGVsdGEuaDogTmV3IGZpbGUsIGRlcml2ZWQgZnJvbSB0ZS1zeXN2MzIuaC4KLQotV2VkIE5vdiAgOSAxMTo1Mjo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2JmKTogQWx3YXlzIHNldCBjb2ZmX2xpbmVfYmFzZS4KLQotTW9uIE5vdiAgNyAwMTo1ODo0OSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdG8gMi41LjMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ29tcGFyZSBnZW5lcmljIGNwdSBuYW1lIGFnYWluc3QgInNwYXJjIiwgbm90Ci0JInNwYXJjKiIsIHNpbmNlIHNwYXJjIHZhcmlhbnRzIHNob3VsZCBiZSBjaGFuZ2VkIHRvICJzcGFyYyIuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xLgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChvY3RhbCwgdG9IZXgpOiBWYXJpYWJsZXMgZGVsZXRlZC4KLQkoaXNvY3RhbCk6IE1hY3JvIGRlbGV0ZWQuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSB0aGVtLgotCShtYWNoaW5lX2lwLCBjYXNlICdQJy8nQScpOiBGb3IgYWJzb2x1dGUgb3BlcmFuZCwgZ2VuZXJhdGUgYW4KLQllcnJvciBtZXNzYWdlIGlmIGl0J3Mgb3V0IG9mIHJhbmdlLgotCShtZF9hcHBseV9maXgsIGNhc2UgUkVMT0NfSlVNUFRBUkcpOiBDaGVjayByYW5nZSBmb3IgUEMtcmVsYXRpdmUKLQlqdW1wcy4KLQkobWRfYXBwbHlfZml4KTogRGVsZXRlIGNvZGUgaW5zaWRlICIjaWYgMCIuCi0KLVRodSBOb3YgIDMgMjA6MjA6NDAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2dvMzIubWg6IFVudXNlZCBmaWxlIGRlbGV0ZWQuCi0KLQkqIHJlYWQuYyAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBJbmRpY2F0ZSB0aGF0IHRoZSBlcnJvciBtYXkKLQltZXJlbHkgYmUgdGhhdCB0aGUgZXhwcmVzc2lvbiBjYW4ndCBjdXJyZW50bHkgYmUgcmVkdWNlZC4KLQotVGh1IE5vdiAgMyAxNjowOTo1OSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBURV9OZXRCU0QgZGVmaW5lIGFzCi0JICAiYS5vdXQtbTY4ay1uZXRic2QiLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBURV9OZXRCU0QgZGVmaW5lIGFzCi0JICAiYS5vdXQtc3BhcmMtbmV0YnNkIi4KLQotCSogY29uZmlnL3RlLW5ic2QuaDogTmV3IGZpbGUsIE5ldEJTRCB0YXJnZXQgZW11bGF0aW9uCi0JKiBjb25maWcvdGUtbmV0YnNkLmg6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbmV0YnNkKixtNjgqLSotbmV0YnNkKixzcGFyYyotKi1uZXRic2QqKToKLQkgIFNldCBiZmRfZ2FzLiAgVXNlIG5ic2QgZW11bGF0aW9uLgotCi1UaHUgTm92ICAzIDE3OjQ0OjQ3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gbmV0IDIuNS4yIHJlbGVhc2UgYnJhbmNoOgotCi0JKiBjb25maWd1cmUuaW46IFB1dCBBQ19ERUZJTkUoc3BhcmN2OSkgb24gaXRzIG93biBsaW5lLCBzbyB0aGF0Ci0JdGhlIHNoZWxsIHZhcmlhYmxlIHNldHRpbmdzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgcGVybWFuZW50LiAgRm9yCi0JQ1BVcyByZXF1aXJpbmcgYmZkX2dhcz15ZXMsIHNlbGVjdCBpdCBiYXNlZCBvbiBDUFUgb25seSwgbm90Ci0JaW5kaXZpZHVhbCB0YXJnZXQgbmFtZXMuICBIYW5kbGUgbTY4ay1ocC1ocHV4Kiwgbm90IGp1c3QgLWhwdXguCi0KLQkqIGNvbmZpZy90Yy16OGsuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQWRkIGR1bW15IGFyZ3VtZW50Ci0JdG8gbWF0Y2ggcHJvdG90eXBlIGluIG9iai1jb2ZmLmguCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2tpcCB0ZXN0cyBmb3IgZGVmaW5pbmcgV0FOVF9GT1BFTl9CSU4gYW5kCi0JSUJNX0NPTVBJTEVSX1NVWC4KLQkqIGFjY29uZmlnLmg6IERlbGV0ZWQgdGhlbS4KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMC4KLQkqIGNvbmZpZy9nbzMyLmNmZywgY29uZmlnL3Ztcy1jb25mLmg6IFVwZGF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yLCBtZF9jb252ZXJ0X2ZyYWdfMSk6IEFsd2F5cyB1c2UKLQlJQk1fQ09NUElMRVJfU1VYIHZlcnNpb24gb2YgY29kZSwgd2l0aCBjb21tZW50cyBpbmRpY2F0aW5nIHdoeS4KLQotCSogbGlzdGluZy5jIChmaWxlX2luZm8pOiBVc2UgdGV4dCBtb2RlIHdoZW4gb3BlbmluZyBmaWxlIGZvciByZWFkLgotCVVzZSAiciIgZGlyZWN0bHksIG5vIG1hY3JvLgotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX29wZW4pOiBEb24ndCB1c2UgRk9QRU5fUlQsIGp1c3QgdXNlCi0JInIiLgotCSogcmVhZC5jIChzX2luY2x1ZGUpOiBEaXR0by4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IFRyeSBib3RoICJ3YiIgYW5kICJ3IiwgZG9uJ3QKLQlib3RoZXIgd2l0aCBGT1BFTl8qIG1hY3Jvcy4KLQkqIGFzLmg6IERvbid0IGluY2x1ZGUgZm9wZW4tKi5oLgotCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IE1ha2UgInJldCIgd2l0aCBubyBvcGVyYW5kcyBlcXVpdmFsZW50IHRvCi0JInJldCB6ZXJvLChyYSkiLCB0byBtYXRjaCBPU0YxIGFuZCB0byBiZSBjb25zaXN0ZW50IHdpdGggYm90aAotCW9uZS1vcGVyYW5kIGZvcm1zLgotCi0JUGF0Y2hlcyBmcm9tIERKIERlbG9yaWU6Ci0JKiBhcy5oIChhbGxvY2EpOiB1bmRlZiBhbGxvY2EgYmVmb3JlIGRlZmluaW5nIGl0IGp1c3QgaW4gY2FzZQotCSogY29uZmlnL2dvMzIuY2ZnOiBuZXcgZmlsZSBmb3IgYXV0b2NvbmYgdmFsdWVzCi0JKiBjb25maWcvdGUtZ28zMi5oOiBuZXcgZmlsZQotCSogY29uZmlndXJlLmJhdDogbmV3IGZvciBhdXRvY29uZgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEZpeCB0eXBvIGluIEdPVFBDIGNoZWNrOyBoYWQgPQotCWZvciA9PS4KLQotCSogY29uZmlndXJlLmluOiBJZiB0YXJnZXRfZnJhZyBkb2Vzbid0IGV4aXN0LCB1c2UgL2Rldi9udWxsLgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogRm9yIG5vbi1WTVMgc3lzdGVtcywgcmUtYWRkIGB2JyB0bwotCXN0ZF9zaG9ydG9wdHMuICBBZGQgInZlcmJvc2UiIHRvIGxpc3Qgb2YgbG9uZyBvcHRpb25zLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFdoZW4gZ2VuZXJhdGluZyBhbiBhYnNvbHV0ZSBzZWN0aW9uCi0Jc3ltYm9sIGFzIGEgcGxhY2Vob2xkZXIsIGRvbid0IG1hcmsgaXQgYXMgdXNlZCBpbiBhIHJlbG9jYXRpb24KLQllbnRyeSwgaGVyZS4KLQotCSogTWFrZWZpbGUuaW4gKGNvbXBhcmlzb24pOiBDb21wYXJlIHVzaW5nIG1ha2VmaWxlIGNvZGUgZnJvbSBnY2MsCi0Jc3RyaXBwZWQgZG93biB0byBkaXNjYXJkIHN1YmRpciBzdHVmZiBhbmQgYWRhcHRlZCB0byBnaXZlIGEKLQlub24temVybyBleGl0IHN0YXR1cyBpZiBlaXRoZXIgZmlsZSBkaWZmZXJzLgotCi1UaHUgTm92ICAzIDE1OjQzOjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogRml4IFJFTEFYX0VOQ09ERSBhcmd1bWVudHMgZm9yCi0JTk9fUElDIGNhc2UuCi0KLVR1ZSBOb3YgIDEgMTY6MTA6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2NoYW5nZV9zZWMpOiBJZiBub3QgR1BPUFQsIGRvbid0IHBlcm1pdAotCXN3aXRjaGluZyB0byB0aGUgcmVhZG9ubHkgZGF0YSBzZWN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfdHlwZSk6IEZpeCB3YXJuaW5nIG1lc3NhZ2UuCi0KLVN1biBPY3QgMzAgMDA6NTc6MzUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3Byb2MpOiBEZWxldGUgZGlzYWJsZWQgY29kZSB0byBwdXQgZWFjaAotCXByb2MgaW4gaXRzIG93biBzdWJzcGFjZSwgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdC4KLQotVHVlIE9jdCAyNSAxNDo0NDozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRW5zdXJlIHRoYXQgbWlwczIgY2FzZSBvZiBNX0xJX0REIGluCi0JLnJkYXRhIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19jcHUpOiBJbml0aWFsaXplIHRvIC0xLgotCShtZF9iZWdpbik6IERvbid0IG1pcHNfY3B1IGlmIGl0IHdhcyBhbHJlYWR5IHNldC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRm9yIC1taXBzTiwgZG9uJ3Qgc2V0IG1pcHNfY3B1IGlmIGl0IHdhcwotCWFscmVhZHkgc2V0LiAgRm9yIC1tY3B1PSwganVzdCBzZXQgbWlwc19jcHUsIG5vdCBtaXBzX2lzYS4KLQotRnJpIE9jdCAyMSAyMDo0MjoyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IElmIE9CSl9FTEYsIGhhbmRsZSAuc2VjdGlvbi4KLQkoc19lbGZfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogRG9uJ3QgYWJvcnQgaWYgd2UgZG9uJ3QgcmVjb2duaXplCi0JdGhlIHNlY3Rpb24gd2hlbiBzZXR0aW5nIHRoZSBzdG9yYWdlIGNsYXNzOyBkZWZhdWx0IHRvIHNjX0RhdGEuCi0KLVRodSBPY3QgMjAgMDA6NDM6MzggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IFNldCBuZXdfdmFsIHRvIDggZm9yIGFsbAotCWZpeHVwcyB0byBicmFuY2ggaW5zdHJ1Y3Rpb25zIChub3QganVzdCBwYy1yZWxhdGl2ZSBvbmVzKSB3aGljaAotCXdpbGwgZ2VuZXJhdGUgU09NIHJlbG9jYXRpb25zLgotCi1XZWQgT2N0IDE5IDEzOjQxOjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWEyOWsuYzogSW5jbHVkZSBjdHlwZS5oIHdpdGggYW5nbGUgYnJhY2tldHMuCi0JKGRlZmluZV9zb21lX3JlZ3MpOiBBZGQgbmV3IHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgZGVmaW5lZCBvbiB0aGUKLQkyOTA0MC4KLQkocGFyc2Vfb3BlcmFuZCk6IEFkZCBhcmd1bWVudCBvcHQuICBJZiBub24temVybywgZG9uJ3Qgd2FybiBhYm91dAotCWEgbWlzc2luZyBvcGVyYW5kLgotCShtYWNoaW5lX2lwKTogSWYgaGFuZGxpbmcgYXJndW1lbnQgdHlwZSAnSScsIHBhc3Mgb3B0IGFzIG5vbi16ZXJvCi0JdG8gcGFyc2Vfb3BlcmFuZC4gIEhhbmRsZSBuZXcgb3B0aW9uYWwgb3BlcmFuZCB0eXBlICdJJy4KLQkobWRfdW5kZWZpbmVkX3N5bWJvbCk6IEhhbmRsZSBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzIChzck5OKS4KLQotVHVlIE9jdCAxOCAwMDo0NToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHJlbnVtYmVyX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBCRkRfQVNTRU1CTEVSIGZ1bmN0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgaXQgYWZ0ZXIgcmVtb3ZpbmcgZ2FzIGNyZWF0ZWQgc2VjdGlvbnMuCi0KLU1vbiBPY3QgMTcgMTg6MDY6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9jcmVhdGUpOiBVc2UgdWRhdGEucCwgbm90IGp1c3QgdWRhdGEuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWNvZmZfc2V0X2V4dCk6IExpa2V3aXNlLgotCShlbGZfZ2V0X2V4dHIpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGFzX3doZXJlIGlzCi0JdW5zaWduZWQgaW50ICosIG5vdCBpbnQgKi4KLQotTW9uIE9jdCAxNyAwMjoyNjozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogRWxpbWluYXRlIGFsbCB1c2VzIG9mIGZ4X2FkZG51bWJlci4KLQkodGNfZ2VuX3JlbG9jKTogU2ltcGxpZnkuICBJdCdzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc2V0IGEKLQlyZWxvYydzIGFkZGVuZCBmaWVsZCB0byB6ZXJvIGZvciBmdW5jdGlvbiBzeW1ib2xzLgotCShtZF9hcHBseV9maXgpOiBTaW1wbGlmeS4gIEZvciBmaXh1cHMgd2hpY2ggd2lsbCByZXF1aXJlIGEgU09NCi0JcmVsb2MsIGp1c3QgY2xlYXIgb3V0IHRoZSBuZWNlc3NhcnkgYml0cyBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUZyaSBPY3QgMTQgMTk6MDY6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogVXNlIGJpc29uIC15LCBub3QgYmlzb24uCi0KLVRodSBPY3QgMTMgMTk6MjI6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNS4KLQkoY2xlYW4taGVyZSk6IERlbGV0ZSBzdGFtcC1tay5jb20uCi0JKGRpc3RjbGVhbik6IERlbGV0ZSAuZ2RiaW5pdC4KLQkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgotCi1XZWQgT2N0IDEyIDIwOjMwOjUxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1uYnNkNTMyLmg6IFJlbmFtZWQgZnJvbSB0ZS1uZXRic2Q1MzIuaC4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBBZGp1c3RlZC4KLQotV2VkIE9jdCAxMiAxNjozMzozOCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jcGx1cy1kZW0uYzogUmVtb3ZlZC4gIEl0IGlzbid0IHVzZWQuICBFdmVuIGlmIGl0IHdhcywKLQkgIGl0J3MgYmV0dGVyIHRvIHVzZSB0aGUgb25lIGluIGxpYmliZXJ0eS4KLQotV2VkIE9jdCAxMiAxODo0ODozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fc3ltYm9sKTogVW5kbyBsYXN0Ci0JY2hhbmdlOyBpdCBicmVha3MgdGhlIHJzNjAwMCBzdXBwb3J0LCBhbmQgZG9lc24ndCBzZWVtIHRvIGJlCi0JbmVlZGVkLgotCi1XZWQgT2N0IDEyIDExOjU2OjUwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuaCx0ZS1uZXRic2Q1MzIuaCAoVEFSR0VUX0ZPUk1BVCk6IENoYW5nZWQgdG8KLQkgIGEub3V0LTxhcmNoPi1uZXRic2QgdG8gbWF0Y2ggY29ycmVzcG9uZGluZyBjaGFuZ2VzIGluIEJGRC4KLQotV2VkIE9jdCAxMiAxMTowNjoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogUmVzb2x2ZSBzeW1ib2wgdmFsdWVzCi0JcmF0aGVyIHRoYW4gZXhwbGljaXRseSBhZGRpbmcgdGhlIGZyYWcgYWRkcmVzcy4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogQWRkIGEgemVybyBlbnRyeSB0byBtYXJrCi0JdGhlIGVuZCBvZiB0aGUgbGluZSBudW1iZXJzOyB0aGlzIHJlcGxhY2VzIHRoZSB6ZXJvIGVudHJ5IHdoaWNoCi0JdXNlZCB0byBiZSBhZGRlZCBieSBjb2ZmX2FkZF9saW5lc3ltLCByZW1vdmVkIE9jdCA3LgotCShjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBJZ25vcmUgc2VjdGlvbnMgd2l0aCBubyBzZWdpbmZvLgotCi1XZWQgT2N0IDEyIDAxOjQxOjM3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBDcmVhdGUgYQotCSJzdGFnZSIgc3ltbGluayB0byB0aGUgYXBwcm9wcmlhdGUgc3RhZ2UqIGRpcmVjdG9yeSwgYW5kIHVzZSBpdAotCWluc3RlYWQgaW4gdGhlIC1CIG9wdGlvbnMuCi0JKGNvbXBhcmlzb24pOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCi1UdWUgT2N0IDExIDE2OjQ4OjExIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBGb3Igbm9uLWEub3V0IHJlbG9jYXRpb25zLCBpZgotCXBjLXJlbGF0aXZlLCB1c2UgZnhfb2Zmc2V0IG9ubHksIGlnbm9yZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24uCi0KLVR1ZSBPY3QgMTEgMTU6MjQ6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgdXNlIFNfSVNfTE9DQUwgd2hlbiBjaGVja2luZwotCWZvciBhbiBlbWJlZGRlZCBQSUMgc3dpdGNoIGV4cHJlc3Npb24sIHNpbmNlIHRoZSBkZWZpbml0aW9uIG9mCi0JU19JU19MT0NBTCB3YXMgY2hhbmdlZC4KLQotVHVlIE9jdCAxMSAxNTowNToxMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbXBhcmlzb24pOiBXaGVuIGNvbXBhcmluZyBhcy5uZXcgb3IgZ2FzcC5uZXcsIHRyeQotCXJ1bm5pbmcgdGhlIGJpbmFyeSB0aHJvdWdoIHNlZCB0byBhdm9pZCBkaWZmZXJlbmNlcyBkdWUgdG8KLQkic3RhZ2UxIiBvciAic3RhZ2UyIiBoYXZpbmcgYmVlbiB3cml0dGVuIGludG8gdGhlIGJpbmFyeS4KLQotU2F0IE9jdCAgOCAwMTo0ODowNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCUVMRiBzeW1ib2wgc2l6ZSBoYW5kbGluZywgYmFzZWQgb24gY29kZSBmcm9tIEVyaWMgWW91bmdkYWxlOgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBOZXcgbWFjcm8uICBBZGRzIGFuCi0JZXhwcmVzc2lvbiBwb2ludGVyIHRvIHRoZSBzeW1ib2wgc3RydWN0dXJlLCB1c2VkIGZvciBgc2l6ZScKLQlleHByZXNzaW9ucyB0aGF0IGNvdWxkbid0IGJlIHJlZHVjZWQgdG8gY29uc3RhbnRzIHdoZW4gaW5pdGlhbGx5Ci0JcHJvY2Vzc2VkLgotCShlbGZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9zeW1ib2wpOiBDYWxsIGVsZl9mcm9iX3N5bWJvbCBhbHdheXMsIHJhdGhlciB0aGFuCi0JZWNvZmZfZnJvYl9zeW1ib2wgb25seSBpZiBFQ09GRl9ERUJVR0dJTkcgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWxldGVkIHVudXNlZCBjb2RlLgotCUNsZWFyIHN5X29iaiBmaWVsZC4KLQkob2JqX2VsZl9zaXplKTogRGVsZXRlZCB1bnVzZWQgY29kZS4gIElmIHNpemUgaXMgbm9uLXJlZHVjaWJsZQotCWV4cHJlc3Npb24sIGFsbG9jYXRlIHNvbWUgc3RvcmFnZSBmb3IgdGhlIHN5X29iaiBmaWVsZCBhbmQgY29weQotCXRoZSBleHByZXNzaW9uLgotCShlbGZfZnJvYl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uICBDb21wdXRlcyBzaXplcywgY2FsbHMKLQllY29mZl9mcm9iX3N5bWJvbCBpZiBhcHByb3ByaWF0ZS4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEZvciBpMzg2IGVsZiBhbmQgY29mZiAoZm9yIG5vdyksIGRvbid0Ci0JYWRkIGluIHZhbHVlIG9mIHN5bWJvbCBmcm9tIGFub3RoZXIgZGVmaW5lZCBzZWN0aW9uIG9mIHRoZSBmaWxlLgotCi1GcmkgT2N0ICA3IDE3OjU0OjAyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tODhrLmggKFRDX0tFRVBfRlhfT0ZGU0VUKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBUZXN0IG9ubHkgVENfS0VFUF9GWF9PRkZTRVQsCi0JcmF0aGVyIHRoYW4gYm90aCBpdCBhbmQgVENfTTg4Sy4KLQkoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2Zyb2Jfc2VjdGlvbik6IEZvciBub24tZW1wdHkgc2VjdGlvbnMsIGNyZWF0ZSBhdXggZW50cnkgZm9yCi0JdGhlIHNlY3Rpb24gc3ltYm9sLCBpbmRpY2F0aW5nIHRoZSBzaXplLgotCShuX2xpbmVfbm9zKTogTmV3IHZhcmlhYmxlLgotCShhZGRfbGluZW5vKTogSW5jcmVtZW50IGl0LgotCShjb2ZmX2FkZF9saW5lc3ltKTogSW5jcmVtZW50IG5fbGluZV9ub3MsIGRvbid0IGNhbGwgYWRkX2xpbmVuby4KLQkoY29mZl9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb247IG1hcCBjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMgb3ZlcgotCXNlY3Rpb25zLgotCShvYmpfY29mZl9saW5lKTogT25seSByZXNldCBsaW5lX2Jhc2UgZm9yIC5iZiBzeW1ib2xzLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcywgY29mZl9mcm9iX2ZpbGUpOgotCURlY2xhcmUuCi0JKG9ial9mcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IFJlbmFtZWQgZnJvbQotCW9ial9mcm9iX2ZvcndhcmRfc3ltYm9sLCBhbmQgcmV3cml0dGVuIGZvciBuZXcgcGFyYW1ldGVyIGxpc3QuCi0KLQlNb24gT2N0ICAzIDIxOjAyOjM4IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChTX0lTX0xPQ0FMKTogZml4IG9ic29sZXRlIGZsYWdzZWVuW10gcmVmZXJlbmNlLgotCi1XZWQgT2N0ICA1IDExOjQ5OjI2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWNjZXB0IC5lc2l6ZSBhbmQgLmV0eXBlCi0JYXMgc3lub255bXMgZm9yIC5zaXplIGFuZCAudHlwZS4KLQotV2VkIE9jdCAgNSAwMDowODoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc2VjdGlvbik6IFJlbW92ZSBhc3NlcnQgYWJvdXQKLQlzZWN0aW9uIGFsaWdubWVudC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zZWN0aW9uX2FsaWduKTogVXNlIHNlY3Rpb24gYWxpZ25tZW50LCBub3QKLQl4dmVjIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQotRnJpIFNlcCAzMCAxOTowNToyMCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogdm1zY29uZi5zaCAobWFrZS1nYXMuY29tKTogaGFuZGxlIERDTCB2ZXJpZmljYXRpb24gdG8gZW5hYmxlCi0Jc2Vuc2libGUgZmVlZGJhY2sgdG8gdGhlIHVzZXIgd2hpbGUgZ2FzIGlzIGJlaW5nIGJ1aWx0LgotCi1GcmkgU2VwIDMwIDE2OjIzOjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUsIGxpc3Rpbmcgb25seSBtYWtlLWdhcy5jb20KLQlmb3Igbm93LgotCShkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0OyBidWlsZHMgRElTVFNUVUZGLgotCShyZWFsY2xlYW4pOiBTZXBhcmF0ZSB0YXJnZXQsIGRlcGVuZCBvbiBjbGVhbiBhbmQgZGlzdGNsZWFuLCB0aGVuCi0JZGVsZXRlIERJU1RTVFVGRi4KLQkqIG1ha2UtZ2FzLmNvbTogRGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl92YWxpZGF0ZV9maXgpIFtCRkRfQVNTRU1CTEVSXTogTmV3Ci0JZnVuY3Rpb24uICBDb252ZXJ0cyByZWxvYyBmb3IgImZvby1HT1QiIHRvIEJGRF9SRUxPQ18zODZfR09UT0ZGCi0JcmVsb2MgZm9yICJmb28iLgotCShpMzg2X29wZXJhbmQpOiBEb24ndCBsb29rIHVwIHNlY3Rpb24gc3ltYm9sIGZvcgotCXVuZGVmaW5lZF9zZWN0aW9uLgotCShyZWxvYyk6IEFsd2F5cyBwZXJtaXQgcmV0dXJuIG9mIDgtIGFuZCAxNi1iaXQgcmVsb2NhdGlvbiB0eXBlcy4KLQlBZGQgYSBzcGFjZSBhZnRlciAicGMtcmVsYXRpdmUiIGluIHRoZSBlcnJvciBtZXNzYWdlLgotCSh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKSBbQkZEX0FTU0VNQkxFUl06IFJlamVjdAotCUJGRF9SRUxPQ18zODZfR09UT0ZGIHJlbG9jcy4KLQkoaTM4Nl9vcGVyYW5kKTogRm9yIGFueSBHT1RPRkYgcmVsb2MsIGNvbnZlcnQgaXQgdG8gYSBCRkRfUkVMT0NfMzIKLQl3aXRoIGEgImZvby1HT1QiIHZhbHVlLgotCSogY29uZmlnL3RjLWkzODYuaCAoaTM4Nl92YWxpZGF0ZV9maXgpOiBEZWNsYXJlIGl0LgotCShUQ19WQUxJREFURV9GSVgpOiBOZXcgbWFjcm8gLS0gY2FsbCBpdC4KLQkoTk9QX09QQ09ERSk6IENhc3QgdG8gYGNoYXInIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBhcy5oOiBJZiBfX1NURENfXyBpcyBub3QgZGVmaW5lZCBhbmQgdmFyYXJncy5oIGlzIGF2YWlsYWJsZSwgdXNlCi0JaXQgcmF0aGVyIHRoYW4gc3RkYXJnLmguCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGRlZCBuZXcgYml0ZmllbGQgZnhfcGx0LCBmb3IgZml4dXBzCi0JcmVmZXJyaW5nIHRvIFBMVCBlbnRyaWVzLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IEluaXRpYWxpemUgZnhfcGx0IHRvIHplcm8uCi0JKGFkanVzdF9yZWxvY19zeW1zKTogUmUtZmV0Y2ggYHN5bScgYWZ0ZXIgdG9wIG9mIHJlZHVjdGlvbiBsb29wLgotCURvbid0IGFkanVzdCBmeF9vZmZzZXQgYnkgZnJhZyBhZGRyZXNzLCBzaW5jZSBTX0dFVF9WQUxVRSBub3cKLQlpbmNsdWRlcyB0aGUgZnJhZyBhZGRyZXNzLgotCShmaXh1cF9zZWdtZW50KTogQ2hhbmdlZCBsb2NhbCB2YXIgUENSRUwgdG8gdHlwZSBpbnQsIGFkZGVkIFBMVC4KLQlJZiBQQy1yZWxhdGl2ZSBmaXh1cCByZWZlcnMgdG8gYSBQTFQgZW50cnkgZm9yIGEgc3ltYm9sIGluIHRoZQotCWN1cnJlbnQgc2VjdGlvbiwgZG9uJ3QgcmVkdWNlIGl0LgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6ICBFeGl0IGxvb3AgdGhyb3VnaCBhIGxhYmVsLiAgSWYKLQlERUJVRzUgaXMgZGVmaW5lZCwgcHJpbnQgb3V0IGVhY2ggZml4dXAgYmVmb3JlIGFuZCBhZnRlcgotCXByb2Nlc3NpbmcuCi0JKGZpeHVwX3NlZ21lbnQpOiBJZiBERUJVRzUgaXMgZGVmaW5lZCwgcHJpbnQgb3V0IGVhY2ggZml4dXAgYmVmb3JlCi0JYW5kIGFmdGVyIHByb2Nlc3NpbmcuCi0JKHByaW50X2ZpeHVwKTogQWRkZWQgcHJvdG90eXBlLiAgU2hvdyBhZGRyZXNzIG9uIGZpcnN0IGxpbmUuICBTaG93Ci0JZnhfb2Zmc2V0IGFuZCBmeF9zdWJzeS4gIFshQkZEX0FTU0VNQkxFUl06IE9ubHkgc2hvdyBmeF9yX3R5cGUgaWYKLQlORUVEX0ZYX1JfVFlQRSBpcyBkZWZpbmVkLgotCi0JKiBzeW1ib2xzLmMgKHByaW50X3N5bWJvbF92YWx1ZV8xKTogQ2hlY2sgU19JU19MT0NBTCwgU19JU19FWFRFUk4sCi0JU19JU19ERUJVRywgU19JU19ERUZJTkVEIGFsc28uCi0KLVRodSBTZXAgMjkgMTg6NTc6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCBvbiAuZ2RiaW5pdC4KLQkoLmdkYmluaXQpOiBSZWJ1aWxkIGZyb20gZ2RiaW5pdC5pbiBieSBydW5uaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIGdkYmluaXQuaW46IERlZmluZSBuZXcgZnVuY3Rpb24gInBmIi4gIEZpeCBkb2Mgb24gInBlIiBhbmQgInBzIi4KLQotCSogd3JpdGUuYyAocHJpbnRfZml4dXApOiBQcmludCBzb3VyY2UgbG9jYXRpb24gb24gZmlyc3QgbGluZS4KLQlTaG93IGZ4X3JfdHlwZSBhbmQgZnhfYWRkc3kgZmllbGRzLgotCi1XZWQgU2VwIDI4IDE0OjU2OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGJmZF9nYXMgZm9yIGFsbCBzcGFyYyB0YXJnZXRzIGluIG9uZSBwbGFjZSwKLQlpbnN0ZWFkIG9mIHNlcGFyYXRlbHkgZm9yIGVhY2guICBDb3JyZWN0bHkgaGFuZGxlIHVzZXItc3VwcGxpZWQKLQkiLS1lbmFibGUtYmZkLWdhcyIgb3B0aW9uLgotCi0JKiBnZGJpbml0LmluOiBNb3ZlICJicmVhayBhYm9ydCIgdG8gZW5kLCBpbiBjYXNlIGdkYiBjb21wbGFpbnMuCi0KLQkqIGFzLmggKFBSSU5URl9XSEVSRV9MSUtFLCBQUklOVF9MSUtFKSBbVVNFX1NUREFSRywgIV9fR05VQ19fXToKLQlVc2UgUEFSQU1TIG1hY3JvLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fc3ltYm9sKTogRG9uJ3QgZG8gYW55Ci0JcHJvY2Vzc2luZyBpZiBhZGRfc3ltYm9sIGlzIHVuZGVmaW5lZCBvciBpbiBleHByX3NlY3Rpb24uCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fYWRkKTogRm9yIHN5bWJvbCBwbHVzCi0JY29uc3RhbnQtdmFsdWVkIHN5bWJvbCwgY29udmVydCB0byBPX3N5bWJvbCBhbmQgcmUtcmVkdWNlLgotCShTX0dFVF9WQUxVRSk6IElmIHN5bWJvbCBuZWVkcyByZXNvbHZpbmcsIHJlc29sdmUgaXQuCi0JKGluZGVudF9sZXZlbCk6IE5vIGxvbmdlciBzdGF0aWMuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogRG9uJ3QgcHJpbnQgZnJhZyBhZGRyZXNzIGlmIGl0IG1hdGNoZXMKLQl6ZXJvX2FkZHJlc3NfZnJhZy4gIERvbid0IHByaW50ICJyZXNvbHZpbmciIGlmIGFscmVhZHkgcmVzb2x2ZWQuCi0JUHJpbnQgc2VnbWVudCBuYW1lLiAgRG9uJ3QgY2FsbCBwcmludF9leHByXzEgb24gYW4gdW5kZWZpbmVkCi0Jc3ltYm9sLgotCShwcmludF9leHByXzEpOiBGaXggd2hpdGVzcGFjZSBiZWZvcmUgcHJpbnRpbmcgWF9hZGRfbnVtYmVyLgotCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBObyBsb25nZXIgc3RhdGljLiAgVXNlIHN5bWJvbF9jcmVhdGUsCi0Jbm90IHN5bWJvbF9uZXcsIGZvciBzeW1ib2xzIGhvbGRpbmcgZXhwcmVzc2lvbiB2YWx1ZXMuCi0JKiBleHByLmggKG1ha2VfZXhwcl9zeW1ib2wpOiBNb3ZlIGRlY2xhcmF0aW9uIGhlcmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IEhhbmRsZSBPX2FkZCBieSBjcmVhdGluZyBhbgotCWV4cHJlc3Npb24tdmFsdWVkIHN5bWJvbCwgYW5kIGNhbGxpbmcgZml4X25ld19leHAgcmVjdXJzaXZlbHkuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogSWYgYSBmaXh1cCdzIHN5bWJvbCB2YWx1ZSBpcyBhIHN1bSBvZiBhbgotCXVuZGVmaW5lZCBzeW1ib2wgYW5kIGEgY29uc3RhbnQsIGZvbGQgdGhlIGNvbnN0YW50IGludG8gdGhlIGZpeHVwLAotCWFuZCByZWZlciB0byB0aGUgdW5kZWZpbmVkIHN5bWJvbCBkaXJlY3RseS4gIFRoZW4gcHJvY2VzcyB0aGUKLQlmaXh1cCBhZ2FpbiBmcm9tIHNjcmF0Y2guCi0JKHdyaXRlX29iamVjdF9maWxlKTogQmVmb3JlIGNhbGxpbmcgYWRqdXN0X3JlbG9jX3N5bXMsIG1ha2UgYSBwYXNzCi0JdGhyb3VnaCB0aGUgc3ltYm9sIGxpc3QgdHJ5aW5nIHRvIHJlc29sdmUgdmFsdWVzLgotCi0JKiB3cml0ZS5jIChwcmludF9maXh1cCk6IE5ldyByb3V0aW5lLCBmb3IgZGVidWdnaW5nLgotCSh3cml0ZV9yZWxvY3MpOiBDYWxsIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICBEZWxldGVkIHZhcmlvdXMKLQloYWNrcyBmb3Igd29ya2luZyBhcm91bmQgcHJvYmxlbXMgd2l0aCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjQuOTAuCi0KLVdlZCBTZXAgMjggMTE6NTA6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2FzcC5vKTogRGVwZW5kcyB1cG9uIGNvbmZpZy5oLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkobWRfYXBwbHlfZml4KTogSWYgYW4gdW5jb25kaXRpb25hbCBiIG9yIGJhbCBvdmVyZmxvd3MsIGFuZCB3ZSBhcmUKLQlub3QgYXNzZW1ibGluZyBQSUMgY29kZSwgcmVwbGFjZSBpdCB3aXRoIGEgaiBvciBqYWwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IENvcnJlY3QgYnJhbmNoIG92ZXJmbG93IHRlc3QuCi0JVXNlIGFzX2JhZF93aGVyZSBhbmQgYXNfd2Fybl93aGVyZSByYXRoZXIgdGhhbiBhc19iYWQgYW5kIGFzX3dhcm4uCi0KLU1vbiBTZXAgMjYgMTc6MTU6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBBZGQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB0bwotCWFzX2ZhdGFsIGNhbGxzLiAgSGFuZGxlIGJmZF9yZWxvY19vdmVyZmxvdyBjYXNlIHNwZWNpZmljYWxseSB3aGVuCi0JUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFLgotCi1GcmkgU2VwIDIzIDE2OjExOjI4IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFzLmggKFVTRV9TVERBUkcsIFVTRV9WQVJBUkdTKTogRGVmaW5lIG9uZSBvciBuZWl0aGVyIG9mIHRoZXNlCi0JaGVyZS4gIFVzZSB0aGVtIGZvciBkZWNpZGluZyB3aGljaCBQUklOVEYqTElLRSBtYWNybyBkZWZpbml0aW9ucwotCXRvIHVzZS4KLQkqIG1lc3NhZ2VzLmM6IFVzZSB0aGVtLCBpbnN0ZWFkIG9mIE5PX1NUREFSRywgTk9fVkFSQVJHUy4KLQlbIVVTRV9TVERBUkcgJiYgIVVTRV9WQVJBUkdTXSAodmFfYWxpc3QsIHZhX2RjbCwgLi4uKTogUHJvdmlkZQotCWRlZmF1bHQgZGVmaW5pdGlvbnMgbWF0Y2hpbmcgd2hhdCB3ZSB3ZXJlIGRvaW5nIGJlZm9yZS4KLQkoYXNfdHNrdHNrKTogUmVtb3ZlIHRoZSBub24tc3RkYXJnLCBub24tdmFyYXJncyB2ZXJzaW9uLCBhbmQKLQlhbHdheXMgdXNlIHRoZSB2YXJhcmdzIGZvcm0gaWYgbm90IHVzaW5nIHN0ZGFyZy4gIEl0J3Mgc2FmZSB0bwotCWFsd2F5cyB1c2UgdmZwcmludGYsIGJlY2F1c2UgbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpdCBpZiB0aGUKLQluYXRpdmUgc3lzdGVtIGRvZXNuJ3QuICBBbHNvLCBhbHdheXMgbWFrZSBmb3JtYXQgYmUgY29uc3QuCi0JKGFzX3dhcm4sIGFzX3dhcm5fd2hlcmUsIGFzX2JhZCwgYXNfYmFkX3doZXJlLCBhc19mYXRhbCk6IERpdHRvLgotCi1GcmkgU2VwIDIzIDE0OjQyOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEFsd2F5cyB1c2UgYWRkaXUgd2hlbiBhZGRpbmcgYQotCWNvbnN0YW50IHRvICR6ZXJvLS1ubyBuZWVkIHRvIHVzZSBkYWRkaXUuCi0JKG1hY3JvKTogSGFjayB0aGUgLW1pcHMzIG92ZXJmbG93IHRlc3RzIHRvIG5vdCBmYWlsIHdoZW4gb2Zmc2V0VAotCWlzIG9ubHkgMzIgYml0cy4KLQotCSogc3ltYm9scy5oIChjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKTogRGVjbGFyZS4KLQotVGh1IFNlcCAyMiAyMTo1ODoyNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmM6IEJ1Z2ZpeGVzIGJhc2VkIGluIHBhcnQgb24gcGF0Y2hlcyBmcm9tIFBhdWwKLQlLcmFuZW5idXJnLgotCShsaXN0aW5nX25ld2xpbmUpOiBDaGVjayBmaWxlbmFtZSBhcyB3ZWxsIGFzIGxpbmUgbnVtYmVyIHdoZW4KLQlkZWNpZGluZyB3aGV0aGVyIHRvIHJlY29yZCBpdC4KLQkobGlzdF9zeW1ib2xfdGFibGUpIFtTX0lTX1JFR0lTVEVSXTogQ2hlY2sgdGhhdCBTX0lTX1JFR0lTVEVSIGlzCi0JZmFsc2UgKGlmIGRlZmluZWQpIGFzIHdlbGwgYXMgY2hlY2tpbmcgZm9yIHJlZ19zZWN0aW9uLgotCShsaXN0aW5nX2xpc3RpbmcpOiBJdGVyYXRlIGZldGNoaW5nIGxpbmVzIHdoaWxlIGxpbmUgbnVtYmVyIGlzIHRvbwotCWxvdywgYW5kIHdlIGhhdmVuJ3QgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogQ2hhbmdlZCBIQVZFX0RFTEVURSB0byBIQVZFX1JFTU9WRS4KLQotVGh1IFNlcCAyMiAxMzozOToxMCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAeDEuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IGNoZWNrIGlmCi0JY3VycmVudF9zdGFic19maWxlbmFtZSBpcyBOVUxMIGJlZm9yZSBzdHJjbXAuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGZpeCBhIGJ1ZyBpbiBnZW5lcmF0ZV9hc21fbGluZW5vCi0JY2hlY2tpbmcuCi0KLVdlZCBTZXAgMjEgMTg6MTc6MzUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2hvLSouaDogTm93LXVudXNlZCBmaWxlcyBkZWxldGVkLgotCi0JKiBzeW1ib2xzLmMgKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBOZXcgZnVuY3Rpb24uICBDb3BpZXMgQkZECi0Jc3ltYm9sIGZsYWdzIGFuZCBjYWxscyBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUy4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBDYWxsIGl0LCBpZiBYX2FkZF9udW1iZXIgaXMKLQl6ZXJvLiAgRG9uJ3QgY2FsbCBvYmpfZnJvYl9mb3J3YXJkX3N5bWJvbC4KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IENhbGwgY29weV9zeW1ib2xfYXR0cmlidXRlcywgYnV0IG9ubHkgaWYKLQlYX2FkZF9udW1iZXIgaXMgemVyby4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKTogRGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWk5NjAuYzogTG90cyBvZiB3aGl0ZXNwYWNlLCBjb21tZW50IHJlZm9ybWF0dGluZywKLQl1c2luZyBHTlUgaW5kZW50LgotCShzdHJjaHIpOiBEb24ndCBkZWNsYXJlLgotCVtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgY29tcGlsZSBtZF9jb252ZXJ0X2ZyYWcsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX3JpX3RvX2NoYXJzLAotCW1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLgotCShicnRhYl9lbWl0KTogVXNlIGRhdGFfc2VjdGlvbiwgbm90IFNFR19EQVRBLgotCi0JTW9uIFNlcCAxOSAxNzoxNDo0NCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL3Ztcy1jb25mLmg6IG5ldyBmaWxlLCBtYW51YWxseSBkZXJpdmVkIGZyb20gY29uZi5pbi4KLQkqIGNvbmZpZy1nYXMuY29tOiB1c2UgaXQsIGFuZCBlbGltaW5hdGUgb2Jzb2xldGUgImhvc3QuaCIuCi0KLVdlZCBTZXAgMjEgMTE6MTE6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19jdXJyZW50X2Jsb2NrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHBjX3N0YWJ4KTogU2V0IHN5X3RjLndpdGhpbiBvZiBhIENfU1RTWU0gc3ltYm9sIHRvCi0JcHBjX2N1cnJlbnRfYmxvY2suICBEb24ndCBtb3ZlIGFyb3VuZCBhbnkgc3RhYiBzeW1ib2wsIGp1c3QgdGhvc2UKLQlmb3IgY29tbW9uIHN5bWJvbHMuCi0JKHBwY19icyk6IFNldCBwcGNfY3VycmVudF9ibG9jay4KLQkocHBjX2VzKTogQ2xlYXIgcHBjX2N1cnJlbnRfYmxvY2suCi0JKHBwY19mcm9iX3N5bWJvbCk6IFNldCB0aGUgdmFsdWUgb2YgYSBDX1NUU1lNIHN5bWJvbCB0byB0aGUgb2Zmc2V0Ci0JZnJvbSB0aGUgY3NlY3Qgb2YgdGhlIGVuY2xvc2luZyBibG9jay4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbnNfc2luY2VfY2FjaGVfYWNjZXNzKTogUmVtb3ZlLgotCShhcHBlbmRfaW5zbik6IFJlbW92ZSBzZXR0aW5nIG9mIGluc25zX3NpbmNlX2NhY2hlX2FjY2VzcywgYW5kCi0Jc3BlY2lhbCA0NjAwIGhhbmRsaW5nOyBpdCB0dXJucyBvdXQgbm90IHRvIGJlIHJlcXVpcmVkLgotCi1UdWUgU2VwIDIwIDE2OjEzOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvcnRvcHRzKTogUmVtb3ZlIEUuCi0JKG1kX2xvbmdvcHRzKTogQWRkIEVCIGFuZCBFTC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1FQiBhbmQgLUVMIGFzIHNlcGFyYXRlIG9wdGlvbnMsIHJhdGhlcgotCXRoYW4gYXMgYSBzaW5nbGUgLUUgb3B0aW9uIHdpdGggYW4gYXJndW1lbnQuCi0KLU1vbiBTZXAgMTkgMTI6NDI6MDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBSZWplY3QgcmVkdWN0aW9ucwotCWludm9sdmluZyBnbG9iYWwgc3ltYm9scyB0b28uCi0KLU1vbiBTZXAgMTkgMTI6MTI6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYXMuaDogVGVzdCBORUVEX0RFQ0xBUkFUSU9OXyosIG5vdCBORUVEXypfREVDTEFSQVRJT04uCi0KLQkqIGNvbmZpZ3VyZS5pbjogVGVzdCBmb3IgcmVtb3ZlLCBub3QgZGVsZXRlLiAgRml4IGNyb3NzLWFzc2VtYmxlcgotCXRlc3QuCi0JKiBhcy5oOiBUZXN0IEhBVkVfUkVNT1ZFLCBub3QgSEFWRV9ERUxFVEU7IGRlZmluZSB1bmxpbmsgdG8KLQlyZW1vdmUsIG5vdCBkZWxldGUuCi0KLQkqIHJlYWQuYyAocHNldWRvX3NldCwgY2FzZSBPX3N5bWJvbCk6IElmCi0JT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgaXMgZGVmaW5lZCwgaW52b2tlIGl0LgotCVtCRkRfQVNTRU1CTEVSXTogQ29weSBCU0ZfRlVOQ1RJT04gc2V0dGluZyB0b28uCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IERlZmluZS4KLQotCVdlZCBBdWcgMTAgMTk6MTU6MzAgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERTR19TX0NfVUJJVFUsIERTVF9LX1ZGTEFHU19EU0MsIERTVF9LX1RTX0FUT00sCi0JbWFueSBvdGhlcnMpOiBuZXcgbWFjcm9zOyB2YWx1ZXMgb2J0YWluZWQgZnJvbSAiRFNUUkVDUkRTLlNETCIuCi0JKiBjb25maWcvb2JqLXZtcy5oICh2YXJpb3VzKTogdXNlIHRoZW0uCi0JKFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUik6IG5ldyBtYWNybywgZm9yIHNlbGVjdGluZyBiaXRmaWVsZAotCXJlcHJlc2VudGF0aW9uIChvbmx5IGVudW0gYml0ZmllbGRzIGNhbiBhdm9pZCBiZWluZyBiaXRzdHJpbmdzKS4KLQkoYml0ZmllbGRfc3VmZml4LCBzZXR1cF9iYXNpY190eXBlKTogbmV3IHJvdXRpbmVzLgotCShWTVNfdHlwZWRlZl9wYXJzZSk6IHVzZSB0aGVtLiAgTm93IHJlY29nbml6ZSBiaXRmaWVsZHMgb2YgYWxsCi0JaW50ZWdyYWwgdHlwZXMsIG5vdCBqdXN0IHR5cGUgYGludCcuICBDYXZlYXQ6ICB0aGUgcmVwcmVzZW50YXRpb24KLQl1c2VkIGZvciBiaXRmaWVsZHMgc3RpbGwgZG9lcyBub3Qgd29yayBmb3Igb2JqZWN0cyBwbGFjZWQgaW4KLQlyZWdpc3RlcnMsIGFuZCBnY2MncyBvcHRpbWl6ZXIgc29tZXRpbWVzIHB1dHMgc21hbGwgc3RydWN0cyB0aGVyZS4KLQotCVR1ZSBKdW4gMTQgMTc6MzE6NDQgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHJlYWQuYyAoc190ZXh0KSBbI2lmIE9CSl9WTVNdOiBjbGVhciB0aGUgSU5fREVGQVVMVF9TRUNUSU9OCi0JYml0IGZyb20gY29uc3RfZmxhZy4KLQkqIGNvbmZpZy9vYmotdm1zLmggKElOX0RFRkFVTFRfU0VDVElPTik6IGRlZmluZSB0aGlzIG1hY3JvLgotCSh0Y19mcm9iX2xhYmVsKTogZGVmaW5lIHRoaXMgdG8gY2FsbCB2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwsCi0JYW5kIGRlY2xhcmUgdGhlIGxhdHRlci4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZheF9nX2RvdWJsZXMpOiBkZWNsYXJlIHRoaXMgZmlsZS1zY29wZQotCXZhcmlhYmxlLgotCShjb25zdF9mbGFnKTogaW5pdGlhbGl6ZSB0byBJTl9ERUZBVUxUX1NFQ1RJT04gaW5zdGVhZCBvZiAwLgotCSh2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwpOiBuZXcgcm91dGluZSAodGNfZnJvYl9sYWJlbCkuCi0JKFZNU19UQlRfUm91dGluZV9FbmQpOiBkb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIGBnY2NfY29tcGlsZWQuJwotCWFuZCBgZ2NjMl9jb21waWxlZC4nIGxhYmVsczsgdGhleSB3b24ndCByZWFjaCBoZXJlIGFueSBtb3JlLgotCShWTVNfdHlwZWRlZl9wYXJzZSkgW2Nhc2UgJ3InXTogZm9yIHR5cGVzIGBkb3VibGUnIGFuZCBgY29tcGxleAotCWRvdWJsZScsIHVzZSBgdmF4X2dfZG91YmxlcycgZmxhZyB0byBzZWxlY3QgdHlwZSBvZiBkb3VibGUuCi0JKFZNU193cml0ZV9vYmplY3RfZmlsZSkgW3RyYWNlYmFjayBzZXR1cF06IGRvbid0IHBhc3Mgc3ltYm9scwotCXdpdGggdGhlIElOX0RFRkFVTFRfU0VDVElPTiBhdHRyaWJ1dGUgdG8gdGhlIFRCVF9Sb3V0aW5lX0JlZ2luCi0JYW5kIFRCVF9Sb3V0aW5lX0VuZCBmdW5jdGlvbnMuCi0KLQlNb24gSnVuICA2IDIwOjUyOjIwIDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfVEJUX1JvdXRpbmVfRW5kKTogY2FjaGUgdGhlIHJlc3VsdCBvZgotCVNfR0VUX1ZBTFVFKCkgdG8gYXZvaWQgbWFueSByZXBlYXRlZCBmdW5jdGlvbiBjYWxscy4KLQkoVk1TX0NoZWNrX0Zvcl9NYWluKSBbI2lmIEhBQ0tfREVDX0NfU1RBUlRVUF06IGNhcGl0YWxpemUKLQlfQyRNQUlOX0FSR1MgaW4gYWR2YW5jZSwgaW4gY2FzZSAtaDMgKGxlYXZlIHN5bWJvbCBuYW1lIGFzLWlzKQotCWdldHMgcmVxdWVzdGVkLiAgW0FsbCB0aGUgSEFDS19ERUNfQ19TVEFSVFVQIGNvZGUgYXBwZWFycyB0bwotCWJlIG9ic29sZXRlOyBnY2MgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IGZvciB2bXMgdGFyZ2V0LiAgSXQncwotCWFsc28gbWlzbmFtZWQsIGJlY2F1c2UgaXQgaXMgZm9yIHRoZSAiVkFYIEMiIHJ1bi10aW1lIGxpYnJhcnksCi0Jbm90IHRoZSBuZXdlciAiREVDIEMiIG9uZSB3aGljaCBoYXMgbXVjaCBkaWZmZXJlbnQgc3RhcnR1cCBjb2RlLl0KLQl7dmFyaW91c306IHVzZSBgU19TRVRfeHh4KHN5bWJvbCxuZXdfdmFsdWUpJyByYXRoZXIgdGhhbgotCWBTX0dFVF94eHgoc3ltYm9sKSA9IG5ld192YWx1ZScuCi0KLU1vbiBTZXAgMTkgMTI6MDU6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19kb3RfZmlsZV9zeW1ib2wpOiBVc2UgYmZkX2Fic19zZWN0aW9uX3B0ciwKLQlub3QgJmJmZF9hYnNfc2VjdGlvbi4KLQotVGh1IFNlcCAxNSAxODozNjozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoY2xlYW5fdXBfZXhwcmVzc2lvbik6IFVzZSBhZGRyZXNzVCwgbm90IGJmZF92bWEuCi0KLVR1ZSBTZXAgMTMgMjA6MDU6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGV4cHIuYyAoZXhwcik6IERvbid0IHJlZHVjZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUKLQlzYW1lIGZyYWcgaWYgdGhlIHN5bWJvbHMgYXJlIG5vdCBpbiBub3JtYWwgc2VjdGlvbnMuCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKFNfU0VUX09USEVSLCBTX1NFVF9UWVBFKTogRGVsZXRlIGEub3V0IGNydWQuCi0JKFNfU0VUX0RFU0MsIFNfR0VUX09USEVSLCBTX0dFVF9UWVBFLCBTX0dFVF9ERVNDKTogTGlrZXdpc2UuCi0JKG9ial9hdHRhY2hfdW53aW5kX2luZm8pOiBEbyBub3QgZGVmaW5lLiAgTm90IG5lZWRlZCBhbnltb3JlLgotCSogY29uZmlnL3RjLWhwcGEuYzogRGVsZXRlIHdoaXRlc3BhY2UgYXQgRU9MLgotCShzdHJ1Y3QgaHBwYV9maXhfc3RydWN0KTogRGVsZXRlIGZ4X3Vud2luZCBmaWVsZCBhbmQgYWxsIHJlZmVyZW5jZXMuCi0JKGZpeF9uZXdfaHBwYSk6IExhc3QgYXJnIGlzIG5vdyBhIHBvaW50ZXIgdG8gYW4gaW50LiAgRG8gbm90Ci0JY2FsbCBvYmpfYXR0YWNoX3Vud2luZF9pbmZvIGFueW1vcmUuICBGb3IgU09NIFJfRU5UUlkgYW5kIFJfRVhJVAotCWZpeHVwcywgc3RvcmUgMzJiaXRzIG9mIHVud2luZCBpbmZvcm1hdGlvbiBpbiB0aGUgZnhfYWRkbnVtYmVyCi0JZmllbGQgb2YgdGhlIGZpeHVwLgotCShtZF9hc3NlbWJsZSwgcGFfZW50cnksIHByb2Nlc3NfZXhpdCwgcGFfcHJvY2VuZCk6IEZvciBTT00gUl9FTlRSWQotCWFuZCBSX0VYSVQgZml4dXBzLCBwYXNzIGEgTlVMTCBwb2ludGVyIHRvIGZpeF9uZXdfaHBwYSwgYW5kIGEKLQlwb2ludGVyIHRvIDMyIGJpdHMgb2YgdW53aW5kIGluZm8uCi0JKHRjX2dlbl9yZWxvYyk6IEZvciBTT00gUl9FTlRSWSBhbmQgUl9FWElUIGZpeHVwcywgc2V0IHRoZSBzeW1ib2wKLQlwb2ludGVyIHRvIHRoZSBkdW1teSBzeW1ib2w7IHNldCB0aGUgYWRkZW5kIGZpZWxkIHRvIGZ4X2FkZG51bWJlci4KLQkocGFfY29tbSwgcGFfZXF1LCBwYV90eXBlX2FyZ3MsIHBhX2ltcG9ydCk6IFVzZSBiZmRfWFhYX3NlY3Rpb25fcHRyCi0JcmF0aGVyIHRoYW4gJmJmZF9YWFhfc2VjdGlvbi4KLQotVHVlIFNlcCAxMyAyMToxNTozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSk6IEZvciBHT1RQQyByZWxvY3MsIGRlY3JlbWVudAotCXZhbHVlIGJ5IG9uZTsgZGlzY2FyZCBhZGp1c3RtZW50cyBwcmV2aW91c2x5IGJlaW5nIG1hZGUuICBGcm9tCi0JRXJpYyBZb3VuZ2RhbGUuCi0KLQlWTVMtIGFuZCBWYXgtcmVsYXRlZCBjaGFuZ2VzIGZyb20gUGF0IFJhbmtpbjoKLQkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6IGFkZCBjb25jYXQsIGdldG9wdCwgYW5kIGdldG9wdDEuCi0JKiB2bXNjb25mLnNoOiBubyBsb25nZXIgaGF2ZSBtYWtlLWdhcy5jb20gZWNobyB0ZXh0IGFib3V0IG5lZWRpbmcKLQl0byBtb2RpZnkgdGhlIGdjYy12bXMgZHJpdmVyIHdoZW4gaW50ZW5kaW5nIHRvIHVzZSB3aXRoIGdjYyAxLnguCi0JKiBhcy5jIChwYXJzZV9vcHRpb25zKTogc3VwcHJlc3MgJ3YnIGZyb20gc3RkX3Nob3J0X29wdGlvbnMgYW5kCi0JZWxpbWluYXRlIFZNUy1zcGVjaWZpYyBjb25kaXRpb25hbCBpbml0aWFsaXphdGlvbjsKLQlbZGVmYXVsdCBjYXNlXTogY2hlY2sgZm9yICctdicgaWYgbWRfcGFyc2Vfb3B0aW9ucyBkb2Vzbid0IHJlY29nbml6ZQotCWFuIG9wdGlvbjsKLQlbZGVmYXVsdCBjYXNlLCAjaWYgVk1TXTogY2hlY2sgZm9yIGZpbGVuYW1lIGFyZ3VtZW50IHdoZW4gJy12JyBzZWVuOwotCVtjYXNlICd2J106IGRlbGV0ZS4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBkb24ndCByZWx5IG9uIGB0aGlzX2FkZF9udW1iZXInCi0JZm9yIE9fYmlnIGxpdGVyYWwgb3BlcmFuZHMgKGRvdWJsZSBmbG9hdHMgYW5kIGxvbmcgbG9uZyBpbnRzKTsKLQlbVk1TLCBtZF9zaG9ydG9wdHNdOiBhZGQgc2Vjb25kIGNvbG9uIGFmdGVyICd2JzsKLQkobWRfcGFyc2Vfb3B0aW9ucykgW1ZNUywgY2FzZSAndiddOiAgY2hlY2sgZm9yIGFyZ3VtZW50LCBzbwotCWNhbGxlciBjYW4gaGFuZGxlIGAtdicgdy9vIGFyZy4KLQotVHVlIFNlcCAxMyAxNjo0NTowOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6ICBJZiBUQ19LRUVQX0ZYX09GRlNFVAotCWlzIGRlZmluZWQsIHB1dCB0aGUgdHhfb2Zmc2V0IGludG8gdGhlIHJfb2Zmc2V0LgotCSogY29uZmlnL3RjLXNoLmMgKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAjCi0JKHRjX3JlbG9jX21hbmdsZSk6IERlbGV0ZWQuCi0JKiBjb25maWcvdGMtc2guaCAoVENfS0VFUF9GWF9PRkZTRVQpOiBEZWZpbmUuCi0JKFRDX1JFTE9DX01BTkdMRSk6IERlbGV0ZS4KLQotVHVlIFNlcCAxMyAxNjoyMDozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBmbG9udW0ta29uc3QuYzogQ2hhbmdlIHByZXByb2Nlc3NvciB0ZXN0cyBvZiBIT19WTVMgdG8ganVzdCBWTVMuCi0JKiBoZXgtdmFsdWUuYzogRGl0dG8uCi0JKiBjb25maWcvb2JqLXZtcy5jOiBEaXR0by4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUmVwbGFjZSBhc19iYWQvZXhpdCBzZXF1ZW5jZSB3aXRoCi0JYSBjYWxsIHRvIGFzX2ZhdGFsLgotCSogY29uZmlnL3RjLWk4NjAuYyAoaTg2MF9pcCk6IERpdHRvLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IERpdHRvLgotCSogYXMuYyAocGFyc2VfYXJncyk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogUmVwbGFjZSBhc193YXJuL2V4aXQgc2VxdWVuY2Ugd2l0aCBhCi0JY2FsbCB0byBhc19mYXRhbC4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBVc2UgRVhJVF9GQUlMVVJFLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlLCBvdXRwdXRfZmlsZV9jbG9zZSwKLQlvdXRwdXRfZmlsZV9jcmVhdGUsIG91dHB1dF9maWxlX2Nsb3NlKTogRGl0dG8uCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IERpdHRvLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uLCBvYmpfc29tX2NvcHlyaWdodCk6IERpdHRvLgotCSogY29uZmlnL29iai1pZWVlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy12YXguYyAobWFpbik6IFVzZSBFWElUX1NVQ0NFU1MuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtYWluKTogRGl0dG8uCi0KLQkqIGhhc2guYyAobWFpbik6IFBhc3MgYSB2YWx1ZSB0byBleGl0KCkuCi0KLQkqIGFzLmggKEVYSVRfU1VDQ0VTUywgRVhJVF9GQUlMVVJFKTogTW92ZWQgaGVyZS4KLQkqIGFzLmM6IC4uLmZyb20gaGVyZS4KLQkocGFyc2VfYXJncyk6IFVzZSB0aGVtIGFsd2F5cy4KLQkobWFpbik6IFVzZSBleGl0IHJhdGhlciB0aGFuIHJldHVybi4KLQotCSogTWFrZWZpbGUuaW4gKCpfRk9SX1RBUkdFVCwgSU5TVEFMTF9YRk9STSwgaW5zdGFsbCwgdW5pbnN0YWxsKToKLQlSZXdyaXRlIGhhbmRsaW5nIG9mIHByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVGVzdCBmb3IgZnVuY3Rpb25zIHVubGluayBhbmQgZGVsZXRlLgotCSogYXMuaDogSWYgdW5saW5rIGlzbid0IGF2YWlsYWJsZSBidXQgZGVsZXRlIGlzLCBkZWZpbmUgdW5saW5rIHRvCi0JYmUgZGVsZXRlLgotCi0JVXBkYXRlIGZvciBhdXRvY29uZiAxLjExODoKLQkqIGdkYmluaXQuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGZyb20gb2xkIC5nZGJpbml0LgotCSogLmdkYmluaXQ6IERlbGV0ZWQuCi0JKiBhY2xvY2FsLm00IChHQVNfR0RCSU5JVCk6IERlbGV0ZWQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBpdC4gIEluc3RlYWQsIGdlbmVyYXRlIC5nZGJpbml0IGZyb20KLQlnZGJpbml0LmluLiAgRG9uJ3Qgc3Vic3RpdHV0ZSBjcHVfdHlwZSwgb2JqX2Zvcm1hdCwgZW11bGF0aW9uLAotCWF0b2YuICBTd2l0Y2hlZCBvcmRlciBvZiBBQ19MSU5LX0ZJTEVTIGFyZ3VtZW50cy4gIFVzZSBBQ19QUkVSRVEKLQl0byBlbnN1cmUgdGhhdCBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZiBhcmVuJ3QgdXNlZC4KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBAY29uZmlndXJlX2lucHV0QCBsaW5lLgotCShjb25maWd1cmUpOiBEZWxldGVkIHJ1bGUuCi0KLVR1ZSBTZXAgMTMgMTI6MDg6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IEFmdGVyIGhhbmRsaW5nIHRoZSBkaWZmZXJlbmNlCi0Jb2YgdHdvIHN5bWJvbHMgZnJvbSB0aGUgc2FtZSBzZWdtZW50LCBzZXQgZnhfc3Vic3kgdG8gTlVMTCwgdG8KLQlzYXRpc2Z5IGV4aXN0aW5nIFRDX0NPVU5UX1JFTE9DIG1hY3Jvcy4KLQotVHVlIFNlcCAxMyAwMTo0NzowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhY2xvY2FsLm00IChHQVNfR0RCSU5JVCk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGl0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIFNlcCAxMiAyMDo1NjozOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIC5nZGJpbml0IChwZSwgcHMpOiBEZWZpbmUgbmV3IGNvbW1hbmRzLgotCSogc3ltYm9scy5jIChpbmRlbnRfbGV2ZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbmRlbnQsIHByaW50X2V4cHJfMSwgcHJpbnRfc3ltYm9sX3ZhbHVlXzEsIHByaW50X3N5bWJvbF92YWx1ZSwKLQlwcmludF9leHByKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IEFkZCBhICJ0aGlzIGZpbGUgZ2VuZXJhdGVkIGJ5IG1ha2UiCi0JbWVzc2FnZSB0byBjb25maWcuaC4KLQotCVBJQyBpbXBsZW1lbnRhdGlvbiBmb3IgaTM4Ni1saW51eCwgYmFzZWQgb24gY29kZSBmcm9tIEVyaWMKLQlZb3VuZ2RhbGUgYW5kIFBhdWwgS3JhbmVuYnVyZywgd2l0aCBzb21lIHdvcmsgb2YgbXkgb3duOgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogVGVzdCBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAgb24gZml4dXAKLQliZWZvcmUgcHJvY2Vzc2luZyBzYW1lLXNlY3Rpb24gcGNyZWwgcmVsb2NhdGlvbnMuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmF1bHQgdG8gMS4KLQotCSogZXhwci5jIChtYWtlX2V4cHJfc3ltYm9sKTogSWYgb3BlcmF0b3IgaXMgT19zeW1ib2wgYW5kCi0JWF9hZGRfbnVtYmVyIGlzIHplcm8sIGp1c3QgcmV0dXJuIHRoZSBzeW1ib2wuICBJZiBvcGVyYXRvciBpcwotCU9fY29uc3RhbnQsIHJlc29sdmUgdGhlIHN5bWJvbCdzIHZhbHVlIGJlZm9yZSByZXR1cm5pbmcuCi0JKG9wZXJhbmQpOiBQZXJtaXQgdXNlIG9mICJbXSIgZm9yIGdyb3VwaW5nLgotCShjbGVhbl91cF9leHByZXNzaW9uKTogRm9yIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlIHNhbWUKLQlmcmFnLCBhZGQgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlaXIgb2Zmc2V0cyBpbnRvIFhfYWRkX251bWJlci4KLQkoZXhwcik6IFJlZHVjZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHNhbWUgZnJhZyB0byB0aGVpcgotCWRpZmZlcmVuY2UuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFRDX1JFTE9DKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QgX2kzODZfaW5zbik6IE5ldyBmaWVsZCBkaXNwX3JlbG9jLgotCShHT1Rfc3ltYm9sKTogTmV3IHZhcmlhYmxlLgotCShvcGVyYW5kX3NwZWNpYWxfY2hhcnMpOiBBZGRlZCBzcXVhcmUtYnJhY2tldHMgYW5kIGF0LXNpZ24uCi0JKHJlbG9jKSBbQkZEX0FTU0VNQkxFUl06IEFkZGVkIG5ldyBhcmd1bWVudCBPVEhFUjsgaWYgaXQgaXMgbm90Ci0JTk9fUkVMT0MsIGp1c3QgcmV0dXJuIGl0LgotCShyZWxvYykgWyEgQkZEX0FTU0VNQkxFUl06IEFkZCB0aGlyZCBhcmd1bWVudCB0byBkdW1teSBtYWNyby4KLQkoQkZEX1JFTE9DXzM4Nl9QTFQzMiwgX0dPVDMyLCBfR09UT0ZGKSBbISBCRkRfQVNTRU1CTEVSXTogTW9yZQotCWR1bW15IG1hY3Jvcy4KLQkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4gIFJldHVybnMgemVybyBpZiBzeW1ib2wgaW4KLQlmaXh1cCBpcyBub3QgbG9jYWwsIHRvIHByZXZlbnQgcmVsb2NhdGlvbnMgYWdhaW5zdCBleHRlcm5hbHMgZnJvbQotCWJlaW5nIGRyb3BwZWQuCi0JKG1kX2Fzc2VtYmxlKTogSW5pdGlhbGl6ZSBkaXNwX3JlbG9jIGZpZWxkIHRvIE5PX1JFTE9DLiAgUGFzcwotCWRpc3BfcmVsb2MgZmllbGQgdG8gcmVsb2MoKSBmdW5jdGlvbiwgYW5kIHVzZSBUQ19SRUxPQyB0byBnZW5lcmF0ZQotCXZhbHVlIHRvIHBhc3MgdG8gZml4X25ld19leHAuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIDMyLWJpdCByZWxvYyBhZ2FpbnN0IEdPVF9zeW1ib2wgaW50byBhIEdPVFBDCi0JcmVsb2MuCi0JKGkzODZfb3BlcmFuZCk6IEluaXRpYWxpemUgZGlzcF9yZWxvYyBmaWVsZCB0byBOT19SRUxPQy4gIEhhbmRsZQotCUBHT1RPRkYsIEBQTFQsIEBHT1Qgb3BlcmFuZHMuICBGb3IgR09UT0ZGIHJlbG9jYXRpb25zIHdpdGggbG9jYWwKLQlzeW1ib2xzLCBmb3JjZSBnZW5lcmF0aW9uIG9mIHRoZSBzZWN0aW9uIHN5bWJvbC4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJZiBHT1Rfc3ltYm9sIGV4aXN0cywgZGVjaWRlCi0Jd2UncmUgZ2VuZXJhdGluZyBQSUMgY29kZSwgYW5kIGNvbnZlcnQgcmVsb2NhdGlvbnMgYWdhaW5zdAotCXVuZGVmaW5lZCBzeW1ib2xzIGZyb20gUENSRUwgdG8gUExUMzIuCi0JKG1kX2FwcGx5X2ZpeF8xKSBbT0JKX0VMRl06IEZpeCB1cCB2YWx1ZXMgZm9yIGR5bmFtaWMtbGlua2luZwotCXJlbG9jcy4KLQkobWRfdW5kZWZpbmVkX3N5bWJvbCk6IE5vdGljZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgYW5kIHNldAotCWFuZCByZXR1cm4gR09UX3N5bWJvbCBpZiBpdCBtYXRjaGVzLgotCShGLCBNQVApOiBNb3ZlIG1hY3JvIGRlZmluaXRpb25zIG91dHNpZGUgZnVuY3Rpb24uCi0JKHRjX2dlbl9yZWxvYyk6IE9ubHkgc3dpdGNoIG9uIHNpemUgYW5kIHBjcmVsIGlmIGNvZGUgd2Fzbid0Ci0JYWxyZWFkeSBzdXBwbGllZCBhcyBQTFQzMi4gR09UMzIsIEdPVE9GRiwgb3IgR09UUEMuICBDb252ZXJ0Ci0JQkZEX1JFTE9DXzMyIHVzaW5nIEdPVF9zeW1ib2wgaW50byBHT1RQQy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX1JFTE9DLCB0Y19maXhfYWRqdXN0YWJsZSwKLQlUQ19SRUxPQ19HTE9CQUxfT0ZGU0VUX1RBQkxFLCBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBOZXcKLQltYWNyb3MuCi0JKE5FRURfRlhfUl9UWVBFKTogRGVmaW5lLgotCShMT0NBTF9MQUJFTCk6IEFjY2VwdCAiLlgiIHByZWZpeCB0b28uCi0JKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlZmF1bHQgdG8gIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIuCi0KLU1vbiBTZXAgMTIgMTc6NTE6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3R5cGUpOiBSZXdyaXRlIHRvIGFjY2VwdCBzeW50YXgKLQlyZXBvcnRlZGx5IHRvIGJlIHVzZWQgb24gSXJpeCA2LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgLmdsb2JsIGFuZCAuZ2xvYmFsLgotCShzX21pcHNfZ2xvYmwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uOyBuZWVkZWQgZm9yIElyaXggNSBzdXBwb3J0LgotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IElmIEJTRl9GVU5DVElPTiBpcyBzZXQgZm9yIGFuCi0JZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8gdHlwZSwgc2V0IHRoZSB0eXBlIHRvIHN0X1Byb2MgcmF0aGVyIHRoYW4KLQlzdF9HbG9iYWwuICBEb24ndCBzZXQgdGhlIGluZGV4IG9mIGFuIGV4dGVybmFsIHN0X1Byb2Mgb3IKLQlzdF9TdGF0aWNQcm9jIHN5bWJvbCB1bmxlc3MgaXQgaXMgYWxzbyBhIGxvY2FsIHN5bWJvbC4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGFzX3doZXJlIGlzCi0JdW5zaWduZWQgaW50ICosIG5vdCBpbnQgKi4KLQotVGh1IFNlcCAgOCAxNzoxODoyNCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggOiBDaGFuZ2UgbmFtZXMgdG8gIE9CSl9HRU5FUkFURV9BU01fTElORU5PLAotCWFuZCBnZW5lcmF0ZV9hc21fbGluZW5vLgotCSogY29uZmlnL29iai1lbGYuaCA6IGRpdHRvLgotCSogcmVhZC5oIDogZGl0dG8uCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGlmIG5vIGZpbGUgd2hlbiBpbnN0IGlzIHJlYWQsIHNldAotCWdlbmVyYXRlX2FzbV9saW5lbm8gdG8gdHJ1ZS4KLQkqIGVjb2ZmLmggOiBjaGFuZ2UgbmFtZSB0byBnZW5lcmF0ZV9hc21fbGluZW5vIGFuZCBhZGQgZnVuY3Rpb24KLQllY29mZl9ub19jdXJyZW50X2ZpbGUuCi0JKiBlY29mZi5jIDogY2hhbmdlIG5hbWUgdG8gZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pIDogbmV3IGZ1bmN0aW9uLCB0byBnZW5lcmF0ZQotCWVjb2ZmIHN0eWxlIGxpbmUgZm9yIGFzbSBmaWxlLgotCi1UaHUgU2VwICA4IDE5OjQzOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IERvIGFuIGZwcmludGYgdG8gc3RkZXJyIHJhdGhlcgotCXRoYW4gYSBwcmludGYuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgYXNfYmFkX3doZXJlIHJhdGhlciB0aGFuIGFzX2JhZC4KLQotV2VkIFNlcCAgNyAxNzoyMToxMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMte2g4MzAwLHNofS5bY2hdICh0Y19jb2ZmX3N5bWJvbF9lbWl0KTogRnVuY3Rpb24gZG9pbmcKLQlub3RoaW5nIGJlY29tZXMgbWFjcm8gZG9pbmcgbm90aGluZy4KLQotV2VkIFNlcCAgNyAxOToxMDowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cy4KLQkoY29uZmlnLnN0YXR1cyk6IFJ1biBjb25maWcuc3RhdHVzIGZyb20gLiBpbnN0ZWFkIG9mIHNyY2Rpci4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogVXNlIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIHRvCi0JZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlIHRoYXQgY291bGRuJ3QgYmUgaGFuZGxlZC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4gIERlbGV0ZWQgYWJvcnQgY2FsbAotCWFmdGVyIGNhbGwgdG8gYXNfZmF0YWwuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWxpbnV4Kik6IERvbid0IHNldCBiZmRfZ2FzLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgTk1fRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VULAotCWluc3RhbGwsIHVuaW5zdGFsbCk6IERvbid0IHVzZSAiYnJva2Vuc2VkIiBoYWNrIGFueSBtb3JlLCB0aGUgbmV3Ci0JYXV0b2NvbmYgY29kZSBzaG91bGQgbmV2ZXIgbGV0IHByb2dyYW1fdHJhbnNmb3JtX25hbWUgYmUgZW1wdHkuCi0KLQlVcGRhdGUgZm9yIGF1dG9jb25mIGJldGEgMS4xMTI6Ci0JKiBhY2xvY2FsLm00IChHQVNfQ0hFQ0tfREVDTF9ORUVERUQsIEdBU19XT1JLSU5HX0FTU0VSVCk6IE5ldwotCW1hY3Jvcy4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHRoZW0uICBVc2UgQUNfQVJHX1BST0dSQU0gKG5vdyBwcm92aWRlZCBieQotCWF1dG9jb25mKSBpbnN0ZWFkIG9mIG15IGhhY2tlZC11cCBBQ19QUk9HUkFNX1RSQU5TRk9STV9OQU1FLiAgTW92ZQotCXRlc3QgZm9yIENST1NTX0NPTVBJTEUganVzdCBiZWZvcmUgQUNfRlVOQ19BTExPQ0EsIGFuZCBlbWl0IGEKLQltZXNzYWdlIHRvIHRyeSB0byBlYXNlIGNvbmZ1c2lvbiBhYm91dCBhdXRvY29uZidzCi0JImNyb3NzLWNvbXBpbGluZyIgbWVzc2FnZS4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fTUFMTE9DLCBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUsCi0JTkVFRF9ERUNMQVJBVElPTl9FUlJOTyk6IFJlbmFtZWQgZnJvbSBORUVEXypfREVDTEFSQVRJT04uCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlZ2VuZXJhdGVkLgotCi1XZWQgU2VwICA3IDEyOjQ5OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGVjayAke2hvc3R9IGFuZCAke3RhcmdldH0gcmF0aGVyIHRoYW4KLQkke2hvc3RfY2Fub259IGFuZCAke3RhcmdldF9jYW5vbn0uCi0JKiBjb25maWd1cmU6IExpa2V3aXNlLgotCi1UdWUgU2VwICA2IDExOjQyOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19jcHUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbnNuc19zaW5jZV9jYWNoZV9hY2Nlc3MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IFNldCBtaXBzX2NwdSBhcyB3ZWxsIGFzIG1pcHNfaXNhLgotCShhcHBlbmRfaW5zbik6IElmIG1pcHNfY3B1IGlzIDQ2MDAsIHJlcXVpcmUgZm91ciBub3AgaW5zdHJ1Y3Rpb25zCi0JYmV0d2VlbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBhY2Nlc3NlcyB0aGUgY2FjaGUgYW5kIGNlcnRhaW4gQ0FDSEUKLQlpbnN0cnVjdGlvbnMuICBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHNlZW4gc2luY2UKLQlhbiBpbnN0cnVjdGlvbiB3aGljaCBhY2Nlc3NlcyB0aGUgY2FjaGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBtaXBzX2NwdSBhcyB3ZWxsIGFzIG1pcHNfaXNhLgotCi1Nb24gU2VwICA1IDA3OjA5OjAwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKFZQQVRIKTogRGVmaW5lIHVzaW5nIEBzcmNkaXJALgotCShwcmVmaXgsIHByb2dyYW1fdHJhbnNmb3JtX25hbWUsIGV4ZWNfcHJlZml4KTogVXNlIGF1dG9jb25mIHN0eWxlCi0JQC1zdWJzdGl0dXRpb25zLgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGNvbmZpZy9oby1yaXNjaXguaCwgY29uZmlnL3RjLWFybS5jLCBjb25maWcvdGMtYXJtLmg6IE5ldyBmaWxlcwotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgdGhlIGFybS4KLQotRnJpIFNlcCAgMiAxNjowNTo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGFkZF9maWxlKTogRG9uJ3QgdHJ5IHRvIGdlbmVyYXRlIGxpbmUgbnVtYmVycyBpZiB0aGUKLQlzeW1ib2wgdGFibGUgaGFzIGJlZW4gZnJvemVuLgotCi1UaHUgU2VwICAxIDE5OjQ4OjAxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBVc2UgQUNfREVGVU4sIGFuZCBvbWl0IEFDX1BST1ZJREUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHVzZXItc3BlY2lmaWVkIGJmZC1hc3NlbWJsZXIgb3B0aW9uIHdpdGgKLQlzZXBhcmF0ZSB2YXJpYWJsZSBmcm9tIHByZWZlcnJlZCBjb25maWd1cmF0aW9uLCB1bnRpbCB0aGUgdHdvIGFyZQotCXJlc29sdmVkLiAgSW5kaWNhdGUgYmZkX2dhcz1wcmVmZXJyZWQgZm9yIGxpbnV4IGEub3V0LiAgVXNlCi0JQUNfUFJPR1JBTV9UUkFOU0ZPUk1fTkFNRSwgZm9yIHdoaWNoIGEgcGF0Y2ggaGFzIGJlZW4gc2VudCB0byBkam0uCi0JKiBNYWtlZmlsZS5pbiAodGFyZ2V0X2FsaWFzLCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogRGVmaW5lLAotCXVzaW5nIGF1dG9jb25mIEAtc3Vic3RpdHV0aW9ucy4KLQotV2VkIEF1ZyAzMSAxNzo0MzowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhdG9mLWdlbmVyaWMuYzogRGVsZXRlZCBhbGxvY2EgaGFuZGxpbmcgaGVyZS4KLQotCSogTWFrZWZpbGUuaW4gKHByZWZpeCwgZXhlY19wcmVmaXgpOiBVc2UgQC1zdWJ0aXR1dGlvbnMuCi0KLQkqIGFjbG9jYWwubTQgKEFDX09VVFBVVF9MSU5LUyk6IERlbGV0ZWQgcmVkZWZpbml0aW9uLCBzaW5jZQotCWF1dG9jb25mIDEuMTA5IGhhcyB0aGlzIGZpeGVkLgotCSogY29uZmlndXJlLmluOiBEb24ndCBjaGFuZ2UgcXVvdGUgY2hhcmFjdGVycyBhcm91bmQgQUNfTVNHX0VSUk9SCi0JaW52b2NhdGlvbi4gIERvbid0IHVzZSBBQ19IRUFERVJfU1REQywgc2luY2UgaXQgcmVxdWlyZXMgcnVubmluZyBhCi0JcHJvZ3JhbS4gIENhY2hlIE5FRURfKl9ERUNMQVJBVElPTiB2YWx1ZXMuCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlZ2VuZXJhdGVkIHdpdGggYSBtb2RpZmllZCBhdXRvY29uZiAxLjEwOS4KLQotCSogYXMuaCAodm9sYXRpbGUpOiBEb24ndCB0ZXN0IG9yIGRlZmluZSBoZXJlOyBub3QgbmVlZGVkLgotCShhbGxvY2EpOiBSZXBsYWNlIGFsbG9jYS1jb25mLmggaW5jbHVzaW9uIHdpdGggY29kZSByZWNvbW1lbmRlZCBpbgotCWF1dG9jb25mIGRvY3VtZW50YXRpb24uICBJbmNsdWRlIGNvbmZpZy5oIGZpcnN0LgotCi1XZWQgQXVnIDMxIDExOjIwOjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfREVGSU5FRCk6IEFic29sdXRlIHN5bWJvbHMgYXJlIGRlZmluZWQKLQlhbHNvLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogSW5pdGlhbGl6ZSBiZmRfZ2FzIHRvIG5vLgotCi1UdWUgQXVnIDMwIDE5OjMxOjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IEluY2x1ZGUgYWxsb2NhLWNvbmYuaCBmcm9tICJsaWJpYmVydHkiLCBub3QKLQkiLi4vbGliaWJlcnR5Ii4KLQotTW9uIEF1ZyAyOSAxNjoxMTozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4KTogRG9uJ3QgZ2VuZXJhdGUgYSByZWxvYyB3aGVuIGEKLQlzeW1ib2wgaXMgdXNlZCBhcyBhbiBvZmZzZXQgaW50byBhIENTRUNUIHRoYXQgaXMgbm90IGEgVE9DLiAgVGhlc2UKLQl0eXBlcyBvZiBsb2FkcyBhcmUgZ2VuZXJhdGVkIGJ5IGdjYyAtbW1pbmltYWwtdG9jLgotCi1TdW4gQXVnIDI4IDEzOjIyOjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoZmxhZ18qKTogQWRkZWQgY29tbWVudHMgZGVzY3JpYmluZyBtZWFuaW5ncyBvZiBzb21lIG9mCi0JdGhlc2UgdmFyaWFibGVzLgotCShzdHJ1Y3QgZnJhZyk6IEFkZCBzb21lIGNvbW1lbnRzIGFib3V0IHRoZSBuczMyay1zcGVjaWZpYyBmaWVsZHMKLQlhbmQgd2h5IHRoZXkncmUgaGVyZS4KLQkoU0laRU9GX1NUUlVDVF9GUkFHKTogQ2FzdCBhZGRyZXNzZXMgdG8gY2hhciosIG5vdCBpbnQuCi0JKGZsYWdfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBTZXQgZmxhZ19wcmludF9zdGF0aXN0aWNzIGluc3RlYWQgb2YKLQlzdGF0aXN0aWNzX2ZsYWcuICBPcHRpb25zIGFycmF5IGlzIG5vdyBjb25zdC4gIEFkZGVkIG5ldyBvcHRpb24KLQkiZHVtcC1jb25maWciOyBpZiBzcGVjaWZpZWQsIHByaW50IFRBUkdFVF9BTElBUywgVEFSR0VUX0NBTk9OSUNBTCwKLQlUQVJHRVRfQ1BVLCBUQVJHRVRfT0JKX0ZPUk1BVCwgYW5kIFRBUkdFVF9GT1JNQVQsIGlmIGRlZmluZWQuCi0JKG1haW4pOiBDaGFuZ2UgdGVzdCB0byBjaGVjayBmbGFnX3ByaW50X3N0YXRpc3RpY3MuCi0JKHN0YXRpc3RpY3NfZmxhZyk6IERlbGV0ZWQuCi0KLQkqIGZyYWdzLmMgKGZyYWdfdmFyaWFudCk6IFJlbW92ZWQgUENSRUxfQURKVVNUIGFuZCBCU1IgYXJndW1lbnRzLgotCUFsd2F5cyBpbml0aWFsaXplIHRoZW0gdG8gemVyby4KLQkqIGZyYWdzLmggKGZyYWdfdmFyaWFudCk6IEZpeGVkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGdldF9jZGlzcCk6IERvbid0IHBhc3MgdGhlIGV4dHJhIHplcm8gYXJncy4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChjb252ZXJ0X2lpZik6IERvbid0IHBhc3MgdGhlIGFyZ3VtZW50czsgY2FjaGUKLQl0aGUgdmFsdWUgb2YgZnJhZ19ub3cgYW5kIGZpbGwgaW4gdGhlIGZpZWxkcyBsYXRlci4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogUmVtb3ZlIG5ldwotCWNvbmZpZ3VyZS1nZW5lcmF0ZWQgZmlsZXMuCi0KLVNhdCBBdWcgMjcgMjA6MjY6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tKQotCi0JQ29udmVyc2lvbiB0byBhdXRvY29uZjoKLQkqIGFjY29uZmlnLmgsIGFjbG9jYWwubTQ6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0dGVuIChleGNlcHQgZm9yIHNvbWUgdGFyZ2V0LXNwZWNpZmljIGNvZGUpCi0JZm9yIGF1dG9jb25mLgotCSogY29uZi5pbiwgY29uZmlndXJlOiBOZXcgZmlsZXMsIGdlbmVyYXRlZCBmcm9tIHRoZSBhYm92ZS4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIG1hZ2ljIHNlcXVlbmNlIGluZGljYXRpbmcgaW5zZXJ0aW9uIG9mCi0JbWFrZWZpbGUgZnJhZ21lbnRzLgotCShWUEFUSCwgc3JjZGlyLCBDQywgTElCUywgT0JKUyBkZXBlbmRlbmNpZXMpOiBVc2UgQC1zdWJzdGl0dXRpb25zCi0JZnJvbSBjb25maWd1cmUuCi0JKExJTktFRF9IRUFERVJTKTogRGVsZXRlZCBhLm91dC5nbnUuaCwgYS5vdXQuaCwgYW5kIGhvc3QuaC4KLQkoY29uZmlnLnN0YXR1cywgY29uZmlndXJlKTogUmV3cml0ZSBydWxlcy4KLQkoY29uZmlnLXN0YW1wKTogRGVwZW5kIG9uIGNvbmYuICBTa2lwIHZhcmlhYmxlcyB0aGF0IGNvbmZpZ3VyZSBpcwotCW5vdyBzdWJzdGl0dXRpbmcgaXRzZWxmLgotCSgqLm8gZGVwZW5kZW5jaWVzKTogRGVsZXRlZCBob3N0LmguCi0JKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogRG9uJ3QgZGVsZXRlIGhvc3QuaC4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgc3RkaW8uaCwgc3RyaW5nLmgsIHN5cy90eXBlcy5oLiAgSW5jbHVkZQotCXNpZ25hbC5oIGFmdGVyIGFzLmguCi0JKiBhcy5oOiBJbmNsdWRlIGFsbG9jYS1jb25mLmggZmlyc3QuICBJbmNsdWRlIGN0eXBlLmgsIHN0cmluZy5oLAotCXN0cmluZ3MuaCwgc3RkbGliLmgsIHVuaXN0ZC5oLCBzeXMvdHlwZXMuaCwgZm9wZW4tYmluLmgsCi0JZm9wZW4tc2FtZS5oLCBhcyBzdWdnZXN0ZWQgYnkgYXV0b2NvbmYgdGVzdCByZXN1bHRzLgotCVtCUk9LRU5fQVNTRVJUXTogRG9uJ3QgaW5jbHVkZSBhc3NlcnQuaC4KLQkoc3RyZHVwKTogRGVjbGFyZS4KLQkodm9sYXRpbGUsIGNvbnN0KTogRGVmaW5lIGlmIG5vdCBfX1NURENfXyBhbmQgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkobWFsbG9jLCByZWFsbG9jKSBbTkVFRF9NQUxMT0NfREVDTEFSQVRJT05dOiBEZWNsYXJlLgotCShmcmVlKSBbTkVFRF9GUkVFX0RFQ0xBUkFUSU9OXTogRGVjbGFyZS4KLQkqIGdhc3AuYzogSW5jbHVkZSBjb25maWcuaCwgc3RkbGliLmggKGlmIEhBVkVfU1RETElCX0gpLiAgRG9uJ3QKLQlpbmNsdWRlIGhvc3QuaC4KLQkobWFsbG9jKSBbTkVFRF9NQUxMT0NfREVDTEFSQVRJT05dOiBEZWNsYXJlLgotCSogbWVzc2FnZXMuYzogSW5jbHVkZSBhcy5oIGZpcnN0LiAgSW5jbHVkZSBlcnJuby5oIG9ubHkgaWYKLQlIQVZFX0VSUk5PX0guICBJZiBIQVZFX1ZBUkFSR1NfSCBhbmQgbm90IF9fU1REQ19fLCB1bmRlZmluZQotCUhBVkVfU1REQVJHX0guICBTZXQgTk9fU1REQVJHIGFuZCBOT19WQVJBUkdTIGFzIGFwcHJvcHJpYXRlLgotCSogZG9jL01ha2VmaWxlLmluIChzcmNkaXIsIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSwKLQlJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYgQC1zdWJzdGl0dXRpb25zLgotCi0JKiBpbnB1dC1maWxlLmM6IERvbid0IGluY2x1ZGUgYXNzZXJ0LmggaGVyZSwgJ2NhdXNlIGFzLmggYWxyZWFkeQotCWluY2x1ZGVzIGl0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogQWRkZWQgdmFyaW91cyBwcm90b3R5cGVzIGZvciBzdGF0aWMKLQlmdW5jdGlvbnMuCi0JKGluX3JhbmdlKTogTmV3IGZ1bmN0aW9uLCB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgY2FuIGZpdCBpbiBhbgotCU4tYml0IGZpZWxkLgotCShidWlsZF9tZW0sIGJ1aWxkX29wZXJhdGVfbik6IE5ldyBmdW5jdGlvbnMgZm9yIGNvbnN0cnVjdGluZwotCW9wY29kZSB2YWx1ZXMuCi0JKGVtaXRfc2xsX24sIGVtaXRfbGRhaF9udW0sIGVtaXRfYWRkcV9yLCBlbWl0X2xkYV9uKTogTmV3Ci0JZnVuY3Rpb25zIGZvciBlbWl0dGluZyBzaW5nbGUgaW5zdHJ1Y3Rpb25zLCBubyBsb25nZXIgcmVxdWlyaW5nIGEKLQlyZWN1cnNpdmUgY2FsbCB0byBtZF9hc3NlbWJsZS4KLQkoZW1pdF9hZGQ2NCk6IE5ldyBmdW5jdGlvbiBmb3IgZXhwYW5kaW5nIGEgUkVHOj1SRUcrQ09OU1QKLQlvcGVyYXRpb24gaW50byBvbmUgb3IgbW9yZSBpbnN0cnVjdGlvbnMsIHRvIGhhbmRsZSB3aWRlIGNvbnN0YW50cy4KLQkoY2xlYXJfaW5zbik6IE5ldyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBGaWxsIGl0IGluIHdpdGggemVyb3MgYW5kIEJGRF9SRUxPQ19OT05FIHZhbHVlcy4KLQkoYWxwaGFfaXApOiBVc2UgaXQgdG8gaW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZSBpbnNucy4KLQkoYWxwaGFfaXAsIGxhYmVsICJpbW1lZGlhdGUiIGFuZCBjYXNlcyAnUCcsICdHJyk6IFVzZSBlbWl0X2FkZDY0Ci0JZm9yIGNhbGN1bGF0aW9ucy4KLQotRnJpIEF1ZyAyNiAxNDo0NjoxNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBSZXZlcnNlIHN0aWxsLXdyb25nIHRlc3Qgb2YKLQlFTUlUX1NFQ1RJT05fU1lNQk9MUy4KLQotCSogd3JpdGUuYyAoQkZEX0ZBU1RfU0VDVElPTl9GSUxMKTogQWx3YXlzIGRlZmluZS4KLQkod3JpdGVfY29udGVudHMpOiBJZiBmaWxsX3NpemUgaXMgMSwgdXNlIG1lbXNldCBpbnN0ZWFkIG9mIGxvb3BpbmcKLQljYWxsaW5nIG1lbWNweS4KLQotV2VkIEF1ZyAyNCAxMjo0NjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMKTogRGVmaW5lIGFzIDAsIGZvciBjb21wYXRpYmlsaXR5Ci0Jd2l0aCBuYXRpdmUgTUlQUyBhc3NlbWJsZXIuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4Kik6IERvbid0IHNldCBlbXVsYXRpb24uCi0JKiBjb25maWcvdGUtaXJpeC5oOiBSZW1vdmUuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N5bWJvbF9uZXdfaG9vayk6IERvbid0IGFkZCBhIG5ldyBmaWxlIGlmIHdlCi0JaGF2ZW4ndCBzZWVuIGFueSBpbnB1dCBmaWxlcyB5ZXQuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYmVnaW4pOiBKdXN0IGNhbGwgc3ltYm9sX2NyZWF0ZSwgcmF0aGVyCi0JdGhhbiBjYWxsaW5nIHN5bWJvbF9uZXcgYW5kIHRoZW4gcmVtb3ZpbmcgdGhlIHN5bWJvbCBmcm9tIHRoZQotCWxpc3QuCi0KLQkqIGFzLmMgKG1haW4pOiBNb3ZlIGEgaW5zaWRlIHRoZSAjaWYgMCBibG9jayB3aGljaCB1c2VzIGl0LgotCSogZWNvZmYuYyAoY3VycmVudF9zdGFic19maWxlbmFtZSk6IE1ha2UgY29uc3QuCi0JKiBmcmFncy5oIChmcmFnX2FsaWduX3BhdHRlcm4pOiBEZWNsYXJlLgotCSogZ2FzcC5jIChuZXdfZmlsZSk6IENhc3QgaXNwIHRvIGxvbmcsIGFuZCB1c2UgJWxkIHRvIHByaW50IGl0LgotCSogY29uZmlnL3RjLWFscGhhLmggKG1kX29wZXJhbmQpOiBBZGQgY2FzdCB0byB2b2lkLgotCShhbHBoYV9kb19hbGlnbik6IERlY2xhcmUgYXJndW1lbnQgdHlwZXMuCi0JKHRjX2dldF9yZWdpc3Rlcik6IERlY2xhcmUuCi0JKGFscGhhX2Zyb2JfZWNvZmZfZGF0YSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtYWxwaGEuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKHNfbWFzayk6IERvbid0IGRlY2xhcmU7IGRvZXMgbm90IGV4aXN0LgotCShsaW5lX2NvbW1lbnRfY2hhcnMpOiBSZW1vdmUgLyogZnJvbSBkZXNjcmlwdGl2ZSBjb21tZW50LgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHJlZy4KLQkodGNfZ2VuX3JlbG9jKTogRG9uJ3QgYm90aGVyIHRvIGNvbXBhcmUgdW5zaWduZWQgdG8gemVyby4KLQkoc19iYXNlKTogQ29ycmVjdCB3YXJuaW5nIHRvIGFjdHVhbGx5IHByaW50IHJlZ2lzdGVyIG51bWJlci4KLQkobWRfYmVnaW4pOiBSZW1vdmUgdW51c2VkIGxvY2FscyByZXR2YWwsIGxvc2UsIGFuZCBpLgotCShhbHBoYV9maXhfYWRqdXN0YWJsZSk6IE1vdmUgZGVmYXVsdCBjYXNlIGluc2lkZSBzd2l0Y2ggdG8gYXZvaWQKLQl3YXJuaW5nLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgcmVsb2NfYWRkciwgcCwgc3ltLAotCWFuZCBhZGRlbmQuCi0JKGVtaXRfYnl0ZV9tYW5pcF9yKTogRGVjbGFyZSB0eXBlcyBmb3IgYWxsIGFyZ3VtZW50cy4KLQkoZW1pdF9leHRyYWN0X3IsIGVtaXRfaW5zZXJ0X3IsIGVtaXRfbWFza19yKTogTGlrZXdpc2UuCi0JKGVtaXRfc2lnbl9leHRlbmQsIGVtaXRfYmlzX3IsIHNfcHJvYyk6IExpa2V3aXNlLgotCShhbHBoYV9pcCk6IFVzZSBzcHJpbnRfdmFsdWUgdG8gcHJpbnQgb2Zmc2V0VCB2YWx1ZS4gIFJlbW92ZQotCXVudXNlZCBsb2NhbCBzaXplLiAgUmVtb3ZlIHVudXNlZCBsYWJlbCBnZXRfbWFjcm8uCi0JKGFscGhhX2RvX2FsaWduKTogTWFrZSBmaWxsIGNvbnN0LgotCShtZF9hcHBseV9maXgpOiBSZW1vdmUgdW51c2VkIGxhYmVsIGNoZWNrX3pvdi4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaTU4NiBhcyBhIHN5bm9ueW0gZm9yIGlbMzRdODYuCi0KLVR1ZSBBdWcgMjMgMTI6MzI6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19saW5lX25ldyk6IENoYW5nZSBsaW5lX251bWJlciBhcmd1bWVudCBmcm9tCi0JdW5zaWduZWQgc2hvcnQgdG8gaW50IHNvIHRoYXQgdGhlIHR5cGUgaW4gdGhlIHByb3RvdHlwZSBtYXRjaGVzCi0JdGhlIHByb21vdGVkIHR5cGUgaW4gdGhlIGRlZmluaXRpb24uCi0JKHN0YWNrX2RlbGV0ZSk6IENvbW1lbnQgb3V0OyBub3QgdXNlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBEZWNsYXJlIGlmIG5vdAotCUJGRF9BU1NFTUJMRVIsIG5vdCBpZiBCRkRfQVNTRU1CTEVSLiAgRGVjbGFyZSBhcmd1bWVudCB0eXBlLgotCSogY29uZmlnL3RjLW02OGsuaCAodGNfY29mZl9zaXplbWFjaGRlcCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgaWdub3JlZAotCWFyZ3VtZW50LgotCi1UdWUgQXVnIDE2IDAxOjQ4OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFVuZG8gbGFzdCBjaGFuZ2UuICBTZXQgc3lfZnJhZyBmb3IKLQl0aGUgY29tbW9uIHN5bWJvbCB0byB0aGUgemVybyBhZGRyZXNzIGZyYWcgKHRoZSBjb3JyZWN0IGZpeCkuCi0KLVR1ZSBBdWcgMTYgMDE6NDg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogVW5kbyBsYXN0IGNoYW5nZS4gIFNldCBzeV9mcmFnIGZvcgotCXRoZSBjb21tb24gc3ltYm9sIHRvIHRoZSB6ZXJvIGFkZHJlc3MgZnJhZyAodGhlIGNvcnJlY3QgZml4KS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFNldCBzeV9yZXNvbHZlZCBmb3IgdGhlIGNvbW1vbgotCXN5bWJvbC4KLQotRnJpIEF1ZyAxMiAxNzo1MTo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRHJvcCAiZWwiIGZyb20gdGhlIGVuZCBvZgotCVRBUkdFVF9DUFUuICBDaGVjayBmb3IgbWlwczY0b3Jpb24uCi0KLVR1ZSBBdWcgIDkgMTk6NDM6NDUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIHBwYy0qLW5ldHdhcmUuCi0JKiBjb25maWcvdGUtcHBjbncuaDogIE5ldyBmaWxlIHRvIHN1cHBvcnQgUG93ZXItUEMvTmV0d2FyZQotCWNvbmZpZ3VyYXRpb25zLiAgQ3VycmVudGx5LCBpdCBqdXN0IGVuYWJsZXMgdGhlIHVzZSBvZiBiYWNrc2xhc2gKLQllc2NhcGVzIGluIHN0cmluZyBkaXJlY3RpdmVzLgotCi1UdWUgQXVnICA5IDExOjEyOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc3RhYngpOiBDYWxsIGV4cHJlc3Npb24gZGlyZWN0bHksIHJhdGhlcgotCXRoYW4gdmlhIHBzZXVkb19zZXQuICBJZiBleHByZXNzaW9uIGlzIGEgc3ltYm9sLCBtb3ZlIHN0YWIgc3ltYm9sCi0JdG8ganVzdCBhZnRlciBzeW1ib2wgZnJvbSBleHByZXNzaW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9wcm9jcyk6IERvbid0IGZvcmNlIGFkciBvZiBmaXJzdCBmZHIgdG8gYmUKLQl6ZXJvLiAgVW5kb2VzIGNoYW5nZSBvZiBKdW5lIDQsIDE5OTMuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWNwdT00NDAwLCA0NjAwLCBhbmQKLQlvcmlvbi4KLQotTW9uIEF1ZyAgOCAxNjoyODowOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBSZW1vdmUgRk9QRU5fV0IgcGF0Y2ggb2YgQXVnIDYuCi0JKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSBmb3IgaG8tZ28zMiBjb3JyZWN0bHkuCi0JKiBjb25maWcvaG8tZ28zMi5oOiBGaXggY29weXJpZ2h0LgotCi1Nb24gQXVnICA4IDExOjU5OjUxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogRGVsZXRlIHJlZHVuZGFudAotCXVwcGVyLWNhc2UgdmVyc2lvbnMgb2YgdGhlIHBzZXVkby1vcHMuCi0KLU1vbiBBdWcgIDggMTM6NDI6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSWYgd2UgYXJlIGdvaW5nIHRvIGdlbmVyYXRlIGEKLQlub24gUEMgcmVsYXRpdmUgcmVsb2MsIGRvbid0IHB1dCB0aGUgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZS4KLQotU2F0IEF1ZyAgNiAwMToxNTowMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBJZiBGT1BFTl9XQiBpcyBub3QgZGVmaW5lZCwgZG8gdGhlIHJpZ2h0IHRoaW5nIGluIGEgZ28zMgotCWVudmlyb25tZW50LgotCi1Nb24gSnVsIDExIDExOjM0OjUyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwaW50KTogTmV3IGZ1bmN0aW9uIGZvciBoYW5kbGluZyB2YXJ5aW5nCi0Jc2l6ZSBvZiBpbnQgcHNldWRvIG9wLgotCSogZG9jL2FzLnRleGluZm86IEZpeCB0eXBvIGRlc2NyaWJpbmcgLmg4MzAwaCBwc2VkdW9wLgotCi1Nb24gQXVnICAxIDAyOjQwOjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3NwYWNlKTogSW5pdGlhbGl6ZSBzZF9zdWJzcGFjZXMKLQlmaWVsZCBpbiB0aGUgc3BhY2UgY2hhaW4uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KLQlocHBhX2dlbl9yZWxvY190eXBlLgotCi1UaHUgSnVsIDI4IDE1OjQ1OjM3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IENoZWNrIG1vcmUgY2FyZWZ1bGx5IGZvcgotCWNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyZXMuCi0JKG1kX3BhcnNlX29wdGlvbikgW05PX1Y5XTogQ29tcGxhaW4gaWYgdjkgd2FzIHNlbGVjdGVkLgotCShtZF9zaG93X3VzYWdlKTogRGVyaXZlIGFyY2hpdGVjdHVyZSBsaXN0IGluIHVzYWdlIG1lc3NhZ2UgZnJvbQotCWFyY2hpdGVjdHVyZV9wbmFtZSBhcnJheS4KLQkoY3lwcmVzcyk6IE1hY3JvIGRlbGV0ZWQuCi0JKG9wX2hhc2gpOiBEb24ndCBpbml0aWFsaXplLgotCShzX2NvbW1vbik6IFVzZSBiZmRfdW5kX3NlY3Rpb25fcHRyIGluc3RlYWQgb2YgYmZkX3VuZF9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoQlNSKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IFVzZSBpdCBmb3IgcmlnaHQtc2hpZnQgb3BlcmF0aW9ucyBvZiAzMiBiaXRzIG9yIG1vcmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEltcGxlbWVudCBuZXcgb3BlcmFuZCB0eXBlICd4Jy4KLQotVHVlIEp1bCAyNiAxODoyMToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogTW92ZWQgY29tbW9uIGluY2x1ZGVzIGFuZCBUQVJHRVRfRk9STUFUCi0JZGVmaW5pdGlvbnMgdG9nZXRoZXIuCi0JKFdPUktJTkdfRE9UX1dPUkQsIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQsCi0JT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIsIEJGRF9IRUFERVJTLCBCRkQpIFshQkZEX0FTU0VNQkxFUl06Ci0JTW92ZWQgdGhlc2UgZGVmaW5pdGlvbnMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBiZWZvcmUgdGhlCi0JaW5jbHVkZXMuCi0JKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMsIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTKTogQWx3YXlzCi0JZGVmaW5lIHRoZXNlLgotCShTX0dFVF9aRVJPRVMpOiBEZWxldGVkLgotCShTX1NFVF9aRVJPRVMpOiBNb3ZlZCB0byBvYmotY29mZi5jLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfKiBwc3VlZG8tb3AgZm5zKTogRGVsZXRlZAotCWZvcndhcmQgZGVjbGFyYXRpb25zLgotCShvYmpfcHNldWRvX3RhYmxlKTogTW92ZWQgdG8gb25lIHZlcnNpb24gZW5kIG9mIGZpbGUsCi0JY29uZGl0aW9uYWxpemVkIGludGVybmFsbHkuCi0JKHN0YWNrIHR5cGVkZWYsIHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wLAotCXRhZ19oYXNoLCB0YWdfaW5pdCwgdGFnX2luc2VydCwgdGFnX2ZpbmQsIHRhZ19maW5kX29yX21ha2UpOiBNb3ZlZAotCXRvIG9uZSBjb21iaW5lZCB2ZXJzaW9uIGF0IHRvcCBvZiBmaWxlLCB1bmNvbmRpdGlvbmFsLiAgRGVsZXRlZAotCWZvcndhcmQgZGVjbGFyYXRpb25zLgotCShzX2dldF9uYW1lKTogTW92ZWQgb25lIGNvcHkgb2YgZGVjbGFyYXRpb25zIHRvIHN0YXJ0IG9mIGZpbGUuCi0JKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOiBEaXR0by4gIERvbid0IGluaXRpYWxpemUuCi0JKFNfU0VUX1pFUk9FUyk6IE1vdmVkIGhlcmUgZnJvbSBvYmotY29mZi5oLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IElmIFRDX0NPRkZfU0VUX01BQ0hJTkUgaXMgZGVmaW5lZCwgY2FsbCBpdCBvbgotCXRoZSBmaWxlIGhlYWRlcnMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzZWdfaW5mb19vZmZfYnlfNCk6IE5vdyBjb25zdCBhbmQgc3RhdGljLgotCShTRUdfSU5GT19GUk9NX1NFR19OVU1CRVIpOiBVbnVzZWQgbWFjcm8gZGVsZXRlZC4KLQkocHJldmlvdXNfZmlsZV9zeW1ib2wsIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9leHRlcm5QLAotCXN5bWJvbF9leHRlcm5fbGFzdFAsIGxhc3RfZnVuY3Rpb25QKSBbIUJGRF9BU1NFTUJMRVJdOiBEb24ndAotCWJvdGhlciBleHBsaWNpdGx5IGluaXRpYWxpemluZyB0byB6ZXJvIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCkgW1RDX0k5NjBdOiBVc2UgU0ZfR0VUX0JBTE5BTUUKLQlhbmQgU0ZfR0VUX0NBTExOQU1FIGluc3RlYWQgb2YgdGhlIFRDX1NfSVNfIHZlcnNpb25zLgotCi0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19DT0ZGX1NFVF9NQUNISU5FKTogTmV3IG1hY3JvLiAgQ2FsbHMKLQl0Y19oZWFkZXJzX2hvb2suCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRhcmdfaGFzX2ljbGFzcyk6IFVzZSBJX0NYIHwgSV9DWDIgd2hlcmUgSV9DWAotCXdhcyB1c2VkIHByZXZpb3VzbHkuCi0JKHRjX2hlYWRlcnNfaG9vayk6IElmIElfQ1gyIGlzIGZvdW5kLCBzZXQgZmxhZ3MgdG8gRl9JOTYwQ0EuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHBvX2hhc2gpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgotCShuZXh0X29iamVjdF9maWxlX2NoYXJQKTogRGl0dG8uCi0JKHJlZ25hbWVzLCBhcmVncywgY29qKTogTm93IGNvbnN0LgotCShwYXJzZV9tZW1vcCk6IFN0YXRpYyBhcnJheSBkZWZfc2NhbGUgbm93IGNvbnN0LgotCShtZF9iZWdpbik6IENhc3QgYXdheSBjb25zdCB3aGVuIHBhc3NpbmcgaGFzaCByb3V0aW5lcyBhZGRyZXNzZXMKLQlvZiB2YWx1ZXMgaW4gcmVnbmFtZXMgb3IgYXJlZ3MuCi0JKG1kX2xvbmdvcHRzKTogQWRkZWQgImxpbmstcmVsYXgiIGFuZCAibm8tcmVsYXgiIGh5cGhlbmF0ZWQgZm9ybXMuCi0JQ29udGludWUgdG8gYWNjZXB0IG9uZS13b3JkIGZvcm1zLgotCShzdHJ1Y3QgdGFiZW50cnksIGFyY2hfdGFiKTogTW92ZWQgdG8gdG9wIGxldmVsIGZyb20gaW5zaWRlCi0JbWRfcGFyc2Vfb3B0aW9uLiAgTm93IGNvbnN0LgotCShtZF9zaG93X3VzYWdlKTogVXNlIGFyY2hfdGFiIHRvIGdlbmVyYXRlIHVzYWdlIG1lc3NhZ2UuICBQcmludAotCWh5cGhlbmF0ZWQgZm9ybXMgb2YgcmVsYXggb3B0aW9ucy4KLQotCSogY29uZmlnL3RjLWk5NjAuaCAoREVGSU5FX0k5NjBfQU9VVCwgVENfU19JU18qLCBUQ19TXypfU1lTUFJPQywKLQlUQ19TX0ZPUkNFX1RPXyopOiBNb3ZlZCBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IC4uLiB0byBoZXJlLiAgQ2hhbmdlZCBERUZJTkVfSTk2MF9BT1VUIHN0dWZmCi0JdG8gdGVzdCBPQkpfQU9VVCBhbmQgT0JKX0JPVVQgZGlyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmggKENUUkwsIENPQlIsIENPSiwgUkVHLCBNRU0qLCBGQlJBLCBDQUxMSiwKLQlNMS1NMywgUkVHX09QQywgUl8qLCBTRlIsIExJVCwgRlAsIE9QLCBSLCBSUywgUkwsIFJTTCwgRiwKLQl7UixGfXssTH17Miw0fSwgTSwgU0ZSX09LLCBMSVRfT0ssIEZQX09LLCBSRUdfQUxJR04sIE1FTU9QLCBJXyopOgotCU1hY3JvcyBkZWxldGVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChBUkNIX0pYKTogRGVmaW5lLgotCShhcmNoX3RhYik6IEluY2x1ZGUgSlguCi0JKHRhcmdfaGFzX3NmciwgdGFyZ19oYXNfaWNsYXNzKTogSGFuZGxlIEpYLgotCSh0Y19oZWFkZXJzX2hvb2spOiBTZXQgZmxhZ3MgdG8gRl9JOTYwSlggZm9yIGk5NjBKWC4KLQotRnJpIEp1bCAxNSAxNTozNjo1MSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSGFkIGxhc3QgY2hhbmdlIGJhY2t3YXJkcy4KLQotVGh1IEp1bCAxNCAxMzoyMTowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYXRvZi1uczMyay5jOiBEZWxldGVkLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBVc2UKLQliZmRfaW5kX3NlY3Rpb25fcHRyIGFuZCBiZmRfdW5kX3NlY3Rpb25fcHRyLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENvbXBhcmUgc2VnVCB2YWx1ZXMgZGlyZWN0bHksCi0Jd2l0aG91dCBjYXN0aW5nIHRvIGludCBmaXJzdC4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2JlZ2luKTogUmV0dXJuIHZhbHVlIGZyb20gaGFzaF9pbnNlcnQKLQlzaG91bGQgYmUgcG9pbnRlciB0byBjb25zdC4gIERvbid0IGNhbGwgZXhpdCBleHBsaWNpdGx5IGFmdGVyCi0JY2FsbGluZyBhc19mYXRhbDsgaXQgd29uJ3QgcmV0dXJuLgotCShjb252ZXJ0X2lpZik6IE1ha2UgbG9jYWwgdmFyaWFibGUgaiBiZSBwb2ludGVyIHRvIGJpdF9maXhTLCBzaW5jZQotCXRoYXQncyBob3cgaXQncyB1c2VkLgotCShlbmNvZGVfb3BlcmFuZCwgY2FzZSAnYicpOiBJZ25vcmUgc3ByaW50ZiByZXR1cm4gdmFsdWUuICBEb24ndCB0cnkKLQljb252ZXJ0aW5nIGZyZWVwdHIgdG8gaW50IGFuZCBiYWNrLgotCi0JTWVyZ2VkIGluIE5TMzJLIHN1cHBvcnQgdXBkYXRlIGZyb20gSWFuIERhbGwgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSk6Ci0KLQkqIGNvbmZpZy90ZS1wYzUzMm1hY2guaDogTmV3IGZpbGUuIHBjNTMyLW1hY2ggdGFyZ2V0IGVtdWxhdGlvbi4KLQotCSogY29uZmlnL3RlLW5ldGJzZDUzMi5oOiBOZXcgZmlsZS4gTmV0YnNkNTMyIHRhcmdldCBlbXVsYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgZGVmaW5pdGlvbiBvZiBOT1BfT1BDT0RFLgotCi0JKiBjb25maWcvdGMtbnMzMmsuaDogQWRkIHByb3RvdHlwZSBmb3IgZml4X25ld19uczMya19leHAuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgQkZEX0FTU0VNQkxFUiBzdXBwb3J0LgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAodGNfZ2VuX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZml4X25ld19uczMya19leHApOiBHZXQgcmVsb2MgdHlwZQotCWRpZmZlcmVudGx5IGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBHZXQgcmVsb2MKLQl0eXBlIGRpZmZlcmVudGx5IGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfY3JlYXRlX2xvbmdfanVtcCk6IFNpemUgb2Ygb3Bjb2RlIGlzIG9uZQotCW5vdCAyLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfY29udmVydF9mcmFnKTogQ29kZSBmb3IgdGhlIEJGRF9BU1NFTUJMRVIKLQljYXNlLiBBbHNvIHVzZSBzbWFydCBtZF9wY3JlbF9hZGp1c3QgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9hcHBseV9maXgpOiBDb2RlIGZvciB0aGUgQkZEX0FTU0VNQkxFUgotCWNhc2UuIEFsc28gdXNlIHNtYXJ0IG1kX2ZpeF9wY3JlbF9hZGp1c3QgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9maXhfcGNyZWxfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGNhbgotCWZpbmQgb2Zmc2V0IGZyb20gb3Bjb2RlIHRvIG9wZXJhbmQgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcKLQlhbmQgaW4gdGhlIHByZXNlbmNlIG9mIHJlbGF4aW5nLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfcGNyZWxfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGNhbgotCWZpbmQgb2Zmc2V0IGZyb20gb3Bjb2RlIHRvIG9wZXJhbmQgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcKLQlhbmQgaW4gdGhlIHByZXNlbmNlIG9mIHJlbGF4aW5nLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfbnVtYmVyX3RvX2Rpc3ApOiBDaGVjayByYW5nZXMgcHJvcGVybHkuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9hdG9mKTogdXNlIGF0b2ZfaWVlZSBpbnN0ZWFkIG9mIHNwZWNpYWwKLQlhdG9mX25zMzJrLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAocmVsb2MpOiBOZXcgKHN0YXRpYykgZnVuY3Rpb24gZm9yCi0JQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogTW9yZSBjb3JyZWN0IHBjIHJlbGF0aXZlIGNvZGUuCi0JbWRfcmVsYXggbXVzdCBiZSBhYmxlIHRvIGZpbmQgb3Bjb2RlIGFkZHJlc3MgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBNb3JlIGV4dGVuc2l2ZSBjb21tZW50cy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGVuY29kZV9vcGVyYW5kKTogU3VwcG9ydCBuZXcgb3BlcmFuZCBjbGFzc2VzIEkKLQlhbmQgWi4gRHJvcCBRLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZml4X25ld19uczMya19leHApOiBuZXcgZnVuY3Rpb24gYW5kCi0JY29ycmVzcG9uZGluZyBwcm90b3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBtYWtlIDMyNTMyIGRlZmF1bHQgbWFjaGluZSBpbnN0ZWFkIG9mIDMyMDMyLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYzogaW5jbHVkZSBvcGNvZGUvbnMzMmsuaCBhZnRlciBhcy5oCi0KLQkqIGFvdXRfZ251Lmg6IHJfZGlzcCBuZWVkcyB0byBiZSAyIGJpdHMgZm9yIFRDX05TMzJLCi0KLQkqIHdyaXRlLmg6IGZ4X2ltX2Rpc3AgbmVlZHMgdG8gYmUgMiBiaXRzIGJpZyBmb3IgVENfTlMzMksKLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IFVzZSBUQ19QQ1JFTF9BREpVU1QgbWFjcm8gKGlmIGRlZmluZWQpCi0JaW5zdGVhZCBvZiBhZGRpbmcgcGNyZWxfYWRqdXN0LgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEFkanVzdCB0b19hZGRyIGZvciB0aGUKLQlCUk9LRU5fRE9UX1dPUkQgZmVhdHVyZSBmb3IgdGhlIEJGRF9BU1NFTUJMRVIgY2FzZS4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgVENfQ09OU19GSVhfTkVXIGlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQWRkIGNvZGUgKGN1cnJlbnRseSBpZgotCUJGRF9GQVNUX1NFQ1RJT05fRklMTCBpcyBkZWZpbmVkKSB0byBtYWtlIGxhcmdlIGZpbGxzIGEgbG90IGZhc3Rlci4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbnMzMmsgZnJvbSBzcGVjaWFsIEZQIGxpc3QuIEFsbCB0aGUgbnMzMmsKLQlzZXJpZXMgdXNlIGllZWUgZmxvYXQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG5zMzJrLXBjNTMyLW1hY2ggYW5kIG5zMzJrLXBjNTMyLW5ldGJzZCB0YXJnZXRzCi0KLQkqIGFzLmg6IGluY2x1ZGUgZXhwci5oIGJlZm9yZSB0YXJnLWVudi5oLiBTb21lIHRhcmdldCBkZXBlbmRlbnQgZmlsZQotCXdhbnQgdG8gdXNlIGV4cHIgc3RydWN0dXJlcy4KLQotV2VkIEp1bCAxMyAxNDo0OTowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDaGFuZ2UgcnAgdG8gYmUgYSBjb25zdCBwb2ludGVyLgotCShtZF9wYXJzZV9vcHRpb24pOiBDbGVhciBjcHUgZmllbGQgb2YgY3VycmVudF9hcmNoaXRlY3R1cmUgYmVmb3JlCi0Jc2V0dGluZyBhIG5ldyBjcHUgdHlwZS4gIENsZWFyIG5vXzY4ODgxIGZvciBtNjg4ODEgb3IgbTY4ODgyLgotCUNsZWFyIG5vXzY4ODUxIGZvciBtNjg4NTEuCi0KLVR1ZSBKdWwgMTIgMjE6Mjc6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXN5c3YuaCAocmVhbGxvYyk6IERlY2xhcmUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IE5ldyBmdW5jdGlvbiwgbW9zdCBvZiB0aGUgZ3V0cyBvZiB0aGUKLQlvbGQgc3ltYm9sX25ldyBmdW5jdGlvbi4KLQkoc3ltYm9sX25ldyk6IE5vdyBqdXN0IGNoZWNrcyBzeW1ib2xfdGFibGVfZnJvemVuLCBjYWxscwotCXN5bWJvbF9jcmVhdGUsIGFuZCBlbnRlcnMgdGhlIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgbm90IHRydWUsCi0JYW5kIHRoZSBzeW1ib2wgdGFibGUgaXMgZnJvemVuLCBjYWxsIHN5bWJvbF9jcmVhdGUgaW5zdGVhZCBvZgotCXN5bWJvbF9uZXcuCi0JKiBzeW1ib2xzLmggKHN5bWJvbF9jcmVhdGUsIHN5bWJvbF90YWJsZV9mcm96ZW4pOiBEZWNsYXJlLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKTogQWx3YXlzIGEgZnVuY3Rpb24gbm93LgotCSogc3RydWMtc3ltYm9sLmggKHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKTogRGVsZXRlZCBtYWNybwotCXZlcnNpb24uCi0KLQkqIHN5bWJvbHMuYyAoZGVidWdfdmVyaWZ5X3N5bWNoYWluKTogTmV3IG1hY3JvLCBkZWZpbmVkIHRvIGJlCi0JdmVyaWZ5X3N5bWJvbF9jaGFpbiBvciBhIGNhc3QgdG8gdm9pZCwgZGVwZW5kaW5nIG9uIERFQlVHX1NZTVMuCi0JKG1hbnkgZnVuY3Rpb25zKTogSW52b2tlIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiB1bmNvbmRpdGlvbmFsbHkuCi0KLVR1ZSBKdWwgMTIgMTI6MDY6NDIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQHgxLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogY2hhbmdlIGNhbGxpbmcgaW50ZXJmYWNlIG9mCi0JT0JKX0dFTkVSQVRFX0FTTV9MSU5FX1NUQUIuCi0JKiBjb25maWcvb2JqLWVsZi5oOiBkaXR0by4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZGl0dG8uCi0JKiBlY29mZi5oOiBjaGFuZ2UgY2FsbGluZyBpbnRlcmZhY2Ugb2YKLQllY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiByZWNvcmQgb2YgZmlsZW5hbWUgdG8gaGFuZGxlIGNhc2Ugb2YgaW5jbHVkZQotCWZpbGVzLCBhbHNvIGNoYW5nZSBkZWZhdWx0IGJ1aWx0LWluIHR5cGUgZnJvbSBpbnQgdG8gdm9pZCBmb3IKLQlhc20gZmlsZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBoYW5kbGUgY2FzZSBvZiBpbmNsdWRlCi0JZmlsZXMuCi0KLU1vbiBKdWwgMTEgMTc6MjA6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEluIGNhc2UgTV9MQV9BQiwgU1ZSNF9QSUMsIGxhcmdlCi0JY29uc3RhbnQsIGFuZCBjYXNlIGxkZF9zdGQsIHNldCBtaXBzX29wdGltaXplIHRvIDIgdGVtcG9yYXJpbHkgdG8KLQlhdm9pZCBpbnNlcnRpbmcgYW4gdW5leHBlY3RlZCBub3AgaW5zdHJ1Y3Rpb24uCi0KLVNhdCBKdWwgIDkgMDA6MDU6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9saW5lbm8pOiBIYW5kbGUgY291bnQgY29ycmVjdGx5IGZvciBsYXN0Ci0JbGluZSBudW1iZXIuCi0KLUZyaSBKdWwgIDggMTU6MjI6MDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChwcm9jZXNzX3BzZXVkb19vcCk6IFBhc3MgcmlnaHQgYXJncyB0byBkbyBkb19haWYuCi0JKGdldF9hbnlfc3RyaW5nKTogTmV3IGFyZyAncHJldGVuZF9xdW90ZScuCi0JKGdldF9hbmRfcHJvY2VzcywgZG9fZm9ybWFscywgbWFjcm9fZXhwYW5kLCBkb19zZGF0YSwKLQlwcm9jZXNzX3BzZXVkb19vcCk6IFVzZSBuZXcgYXJnLgotCi1GcmkgSnVsICA4IDEyOjIzOjQ0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogZGVmaW5lIG1hY3JvIE9CSl9HRU5FUkFURV9BU01fTElORV9TVEFCLgotCSogY29uZmlnL29iai1lbGYuaDogZGl0dG8uCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGdlbmVyYXRlIGxpbmUgc3RhYnMgZm9yIGFzbSBmaWxlLgotCSogcmVhZC5oOiBhZGQgZXh0ZXJuIGdlbmVyYXRlX2FzbV9saW5lX3N0YWIuCi0JKiBlY29mZi5oIDogYWRkIHByb3RvdHlwZSBmb3IgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYigpLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBpZiB0aGVyZSdzIG5vIGZpbGVuYW1lIHByb3ZpZGVkLCBzZXQgc3dpdGNoCi0JdG8gZ2VuZXJhdGUgbGluZSBzdGFicyBmb3IgLnMgZmlsZS4KLQkqIGVjb2ZmLmMgKGFkZF9wcm9jZWR1cmUpOiBhZGQgc3RhYnMgc3ltYm9sIGZvciAuZW50IGRpcmVjdGl2ZS4KLQkqIGVjb2ZmLmMgKGdlbmVyYXRlX2Vjb2ZmX3N0YWIpOiBjcmVhdGVzIGFuIGFydGlmaWNpYWwgc3RhYnMuCi0JKiBlY29mZi5jIChnZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogZ2VuZXJhdGUgYSBhcnRpZml0aWFsIGxhYmVsCi0JZm9yIGVhY2ggbGluZSBhbmQgZ2VuZXJhdGUgYSBzdGFibiBmb3IgdGhlIGxpbmUuCi0KLVRodSBKdWwgIDcgMTc6MDQ6MDMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChnZXRfYW55X3N0cmluZyk6IENvcGUgd2l0aCBnZXR0aW5nIGEgc3RyaW5nIHdpdGggYW4KLQlhbHRlcm5hdGUgYmFzZSBzcGVjaWZpZXIuCi0JKGRvX2FpZiwgZG9fYWVsc2UpOiBPbmx5IGVuYWJsZSBvdXRwdXQgaWYgZXhwcmVzc2lvbiBpcyB0cnVlIGFuZCBwcmV2aW91cwotCWxldmVsIHdhcyBvbi4KLQkoY2hhcnR5cGVfaW5pdCk6ICBBZGQgQkFTRUJJVCBjaGFydHlwZS4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiAgTm90aWNlIG5lc3RlZWQgQUlGcy4KLQotVGh1IEp1bCAgNyAxMjozMDoyMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBoODMwMC5jIChkb19hX2ZpeF9pbW0pOiBDb2RlIGZvciAyIGJpdCByZWxvYyB0eXBlIHVzaW5nIGluIHRyYXBhCi0JaW5zbi4gIChmaXggcHIgNTE2NSwgNTE3NCkKLQotVGh1IEp1bCAgNyAxMTozMTozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoUl9ETFRfUkVMKTogSWYgaXQgaXNuJ3QgZGVmaW5lZCwgdGhlbiBkZWZpbmUKLQl0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZSB0byBhdm9pZCBsb3Npbmcgb24gb2xkIGhwdXggc3lzdGVtcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlamVjdCByZWR1Y3Rpb25zIGZvcgotCXN5bWJvbHMgaW4gRExUIHJlbGF0aXZlIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogWmVybyBvdXQgdGhlIGFkZGVuZCBmaWVsZCBmb3IgRExUIHJlbGF0aXZlIHJlbG9jcy4KLQotV2VkIEp1bCAgNiAwMTowNzo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3RjKTogSWYgbm90IE9CSl9DT0ZGLCBmb3JjZSBUT0MgZW50cnkgdG8KLQlhbGlnbiB0byBhIGZvdXIgYnl0ZSBib3VuZGFyeS4KLQotVHVlIEp1bCAgNSAxNTo0MjowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogSGFuZGxlIDMyLWJpdCBhZGRlbmRzLgotCShncGRpc3BfaGkxNl9ob3d0byk6IE5vdyBwb2ludHMgdG8gY29uc3QuCi0JKGxvYWRfaW5zbl90YWJsZSwgYWxwaGFfaXApOiBGaXggdXNlcyBvZiBjb25zdC4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBVcGRhdGVzIHRvIENPRkYgZGVzY3JpcHRpb24uICBBZGRlZCAiQGVuZAotCWRlZm1hYyIgYXMgbmVlZGVkLCBhbmQgc29tZSBleHRyYSBoZWFkaW5nIGFuZCAiQGJ5ZSIgc28gaXQnbGwKLQlmb3JtYXQgYXMgYSBzZXBhcmF0ZSBkb2N1bWVudC4KLQotVHVlIEp1bCAgNSAxMzo1NDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfR0VUX0FMSUdOLCBTX1NFVF9BTElHTik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogU2V0IGFsaWdubWVudCBvZiBjb21tb24KLQlzeW1ib2wuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50IG9mCi0JY29tbW9uIHN5bWJvbC4KLQotTW9uIEp1bCAgNCAxODoyOTo0MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaXNfY29tcGxleCk6IE5ldyBtYWNyby4KLQkoY29uc19maXhfbmV3X2hwcGEpOiAiSGFuZGxlIiBjb21wbGV4IGV4cHJlc3Npb25zLgotCi1GcmkgSnVsICAxIDAwOjQ4OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IHNfYWxpZ24gZmllbGQgZnJvbQotCXNlY3Rpb25fYWxpZ25tZW50IGFycmF5LgotCi1UaHUgSnVuIDMwIDE1OjA1OjI4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIGJmZF9jb21fc2VjdGlvbl9wdHIuCi0JKiBhcy5oIChhYnNvbHV0ZV9zZWN0aW9uLCB1bmRlZmluZWRfc2VjdGlvbik6IFVzZSBuZXcgQkZEIG1hY3JvcwotCWJmZF9hYnNfc2VjdGlvbl9wdHIgYW5kIGJmZF91bmRfc2VjdGlvbl9wdHIuCi0KLVRodSBKdW4gMzAgMTQ6MzY6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZvciBNX0xJX1NTLCBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdAotCWJhc2VkIG9uIGNvbnRlbnRzIG9mIGltbV9leHByIGFuZCBvZmZzZXRfZXhwciwgcmF0aGVyIHRoYW4KLQltaXBzX3BpYy4gIEZvciBNX0xJX0RELCBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdCBiYXNlZCBvbiBzZWdtZW50Ci0JbmFtZSBvZiBvZmZzZXRfZXhwciwgcmF0aGVyIHRoYW4gbWlwc19waWMuCi0JKG1pcHNfaXApOiBJZiBnX3N3aXRjaF92YWx1ZSA8IDQsIHVzZSBpbW1lZGlhdGUgdmFsdWVzIGZvciAnbCcuCi0JSWYgZ19zd2l0Y2hfdmFsdWUgPCA4LCB1c2UgLnJkYXRhIHJhdGhlciB0aGFuIC5saXQgZm9yICdMJy4KLQotV2VkIEp1biAyOSAxNzozMDo0NiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBCcmVhayBsb25nIHN0cmluZyBpbnRvIHNob3J0ZXIgb25lcy4KLQkocGFyc2VfYXJncyk6IEFkZCAtdiwgcHJpbnRzIHZlcnNpb24gaWQgYW5kIGNvbnRpbnVlcy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3Nob3dfdXNhZ2UpOiBCcmVhayBsb25nIHN0cmluZy4KLQotTW9uIEp1biAyNyAwOTo0NzoxNiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqICBjb25maWcvdGMtaTM4Ni5jIChtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgIi1WIiBhbmQgIi1RIiBpZgotCU9CSl9FTEYgaXMgZGVmaW5lZC4KLQotU3VuIEp1biAyNiAxNjozMDo0OCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKG1haW4pIFtIT1NUX1NQRUNJQUxfSU5JVF06IE5ldyBob29rLCBmb3IgaG9zdC1zcGVjaWZpYwotCWluaXRpYWxpemF0aW9uLgotCi1XZWQgSnVuIDIyIDAwOjI0OjU1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUgZm9yIE9CSl9FTEYuCi0JTW9yZSBnYXMvYmZkIGxvc3NhZ2UgZXhwb3NlZCBieSB0aGUgbmV3IGxpbmtlciBjb2RlLgotCi1UdWUgSnVuIDIxIDExOjMyOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogQ2xlYXIgc2VnaW5mbyBhZnRlciBhbGxvY2F0aW5nIGl0LgotCShzdWJzZWdfZ2V0KTogUGFzcyBhY3R1YWwgc2l6ZSBvZiBzZWdpbmZvIHRvIG1lbXNldC4KLQotCSogc3Vic2Vncy5jIChhYnNfc2VnX2luZm8sIHVuZF9zZWdfaW5mbyk6IERlZmluZSBpZiBCRkRfQVNTRU1CTEVSLgotCShzdWJzZWdfY2hhbmdlKTogU3RvcmUgc2VnX2luZm8gZm9yIGJmZF9hYnNfc2VjdGlvbl9wdHIgaW4KLQlhYnNfc2VnX2luZm8sIGFuZCBzdG9yZSBzZWdfaW5mbyBmb3IgYmZkX3VuZF9zZWN0aW9uX3B0ciBpbgotCXVuZF9zZWdfaW5mby4KLQkoc3Vic2VnX2dldCk6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3Qgc2V0IG91dHB1dF9zZWN0aW9uIGlmIGl0IGlzCi0JYWxyZWFkeSBzZXQuCi0JKHNlZ19pbmZvKTogRGVmaW5lIGFzIGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWdfaW5mbyk6IERlY2xhcmUgYXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gZGVmaW5pbmcKLQlhcyBtYWNyby4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IENhbGwgc2VnX2luZm8gcmF0aGVyIHRoYW4KLQliZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEuCi0KLU1vbiBKdW4gMjAgMTY6MzA6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwcGMtKi1lbGYqKTogTmV3IHRhcmdldCwgbGlrZSAtc3lzdjQqLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiAiMGYiIGlzIGZvbGxvd2VkIGJ5ICdcMCcsIGRvbid0IGRvIGVvbAotCWNoZWNrcy4KLQotTW9uIEp1biAyMCAxNToxNzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2F1eCk6IENhbGwgc3dhcF90aXJfb3V0IGFuZCBzd2FwX3JuZHhfb3V0Ci0JdmlhIGJhY2tlbmQgcG9pbnRlciwgbm90IGRpcmVjdGx5LgotCi1GcmkgSnVuIDE3IDE4OjA1OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IE1ha2Ugc3VyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLQllbGVtZW50IGluIHRoZSBmb3IgbG9vcC4KLQotRnJpIEp1biAxNyAxMTowMTowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogTWlzYyB0cml2aWFsIGNoYW5nZXMgdG8gbWFrZSBnY2MgLVdhbGwgaGFwcHkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCi1XZWQgSnVuIDE1IDIwOjQ0OjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBDYXN0IHhtYWxsb2MgcmV0dXJuIHZhbHVlLgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogSWYgJChkZWZzKSBjb250YWlucyBtdWx0aXBsZSB3b3JkcywKLQllbWl0IGEgI2RlZmluZSBsaW5lIGZvciBlYWNoLgotCSogY29uZmlndXJlLmluOiBGb3Igc3BhcmM2NCB0YXJnZXQsIHVzZSBzcGFyYyBjcHUgZmlsZXMgYW5kIGFkZAotCXNwYXJjdjkgdG8gZXh0cmFfZGVmcy4gIE5vIGxvbmdlciB0cmVhdCBzcGFyYzY0LSotYW91dCogc3BlY2lhbGx5LgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWVtYmFyX21hc2tzKTogTm93IHN0YXRpYyBhbmQgY29uc3QuCi0JKG1kX3Nob3dfdXNhZ2UpIFshTk9fVjldOiBBZGQgLUF2OSB0byB1c2FnZSBtZXNzYWdlLgotCShjdXJyZW50X2FyY2hpdGVjdHVyZSkgW3NwYXJjdjldOiBJbml0aWFsaXplIHRvIHY5LgotCShtZF9iZWdpbikgW3NwYXJjdjldOiBEb24ndCBib3RoZXIgY2hhbmdpbmcgaXQgdW5jb25kaXRpb25hbGx5Ci0JaGVyZS4KLQkoc19yZXNlcnZlKTogRG9uJ3QgcGFzcyB1bmV4cGVjdGVkIGFyZ3VtZW50IHRvIGFzX2JhZCB3aXRoCi0JYmFkLXNlZ21lbnQgbWVzc2FnZS4KLQotCSogYXMuaCAoYmZkX2FsbG9jX2J5X3NpemVfdCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGludF90b19nZW4pOiBDb21tZW50ZWQgb3V0IHVudXNlZCByb3V0aW5lLgotCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlZCBjaGVjayBvZiBvcGVyYW5kIHNlY3Rpb24uCi0KLQlGcmkgSnVuICAzIDE3OjI1OjA4IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChEQkdfU19DX0NPTVBMWDQsIERCR19TX0NfQ09NUExYOCk6IGRlZmluZQotCXRoZXNlIG5ldyBWTVMgc3ltYm9sLXR5cGUgbWFjcm9zIGZvciBgY29tcGxleCBmbG9hdCcgYW5kCi0JYGNvbXBsZXggZG91YmxlJyBzdXBwb3J0LiAgVGhlaXIgdmFsdWVzIGNvbWUgZnJvbSB0aGUgZXhpc3RpbmcKLQlEU0MkS19EVFlQRV9GQyBhbmQgRFNDJEtfRFRZUEVfREMgbWFjcm9zIGluIDxkZXNjcmlwLmg+LgotCShEQkdfU19DX1JFQUw4X0csIERCR19TX0NfQ09NUExYOF9HKTogR19mbG9hdCB2ZXJzaW9ucyBvZgotCVJFQUw4IGFuZCBDT01QTFg4OyBub3QgdXNlZCB5ZXQsIGJlY2F1c2UgZ2NjIG91dHB1dHMgdGhlIHNhbWUKLQkuc3RhYnMgZm9yIGBkb3VibGUnIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgLW1nJyBpcyB1c2VkLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3R5cGVkZWZfcGFyc2UpIFtjYXNlICdyJ106IGFkZCBlbnRyaWVzCi0JZm9yIGdjYzIncyBwcmVkZWZpbmVkIHR5cGVzICJjb21wbGV4IGZsb2F0IiwgImNvbXBsZXggZG91YmxlIiwKLQlhbmQgImNvbXBsZXggbG9uZyBkb3VibGUiIChpZGVudGljYWwgdG8gY29tcGxleCBkb3VibGUpLgotCi1XZWQgSnVuIDE1IDEyOjMyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBVc2UgQ19TVEFUIGZvciB0aGUgLnRleHQKLQlzZWN0aW9uIHN5bWJvbCwgbm90IENfTEFCRUwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBQZXJtaXQgYSBtb2RpZmllciBpbiAnbycgY2FzZSwgYW5kCi0JcGVybWl0IG5vbiBjb25zdGFudCBleHByZXNzaW9ucyBpbiAndScgY2FzZS4gIExldHMgYGBsdWkKLQkkOCwlaGkoZm9vKTsgbHcgJDgsJWxvKGZvbykoJDgpJycgd29yayBjb3JyZWN0bHkuCi0KLU1vbiBKdW4gMTMgMTI6MDg6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQKLQl0byBwdXQgYSBjb21tb24gc3ltYm9sIGluIGEgc2V0LgotCi1TYXQgSnVuIDExIDE2OjQxOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCB3ZWFrIHN5bWJvbHMgYXMgYW4gZXh0ZW5zaW9uIHRvIGEub3V0LgotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogT25seSBwcmVzZXJ2ZSBleHRlcm5hbCBiaXQgZm9yIE9CSl9BT1VUIGFuZAotCU9CSl9CT1VUIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL2FvdXRfZ251LmggKE5fV0VBS1UsIE5fV0VBS0EsIE5fV0VBS1QsIE5fV0VBS0QsIE5fV0VBS0IpOgotCURlZmluZSBhcyBpbiAuLi9pbmNsdWRlL2FvdXQvYW91dDY0LmguCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBJZiBub3QgQkZEX0FTU0VNQkxFUiwKLQlkZWZpbmUgYXMgY2hhci4KLQkoU19HRVRfV0VBSywgU19TRVRfV0VBSyk6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkICJ3ZWFrIi4KLQkob2JqX2VtaXRfc3ltYm9scyk6IEFkanVzdCB0eXBlIG9mIHdlYWsgc3ltYm9scy4KLQkob2JqX2FvdXRfd2Vhayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLUZyaSBKdW4gMTAgMTM6NDg6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBEb24ndCBzZXQgYW55IGZsYWdzIGJhc2VkIG9uCi0JdGhlIHR5cGUgb2YgYSBzcGVjaWFsIHNlY3Rpb24uCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiBJbmNsdWRlIDxzdGRsaWIuaD4uICBEb24ndCBkZWNsYXJlIG1hbGxvYywKLQlyZWFsbG9jLCBmcmVlLCBvciBhdG9sLgotCi1XZWQgSnVuICA4IDA2OjI4OjM3IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBEZWxldGUgYXMubmV3IGRlcGVuZGVuY3ksIHNvIHRoYXQKLQlyZWdyZXNzaW9uIHRlc3QgZG9lc24ndCB0cmlnZ2VyIGFuIGFzc2VtYmxlciBidWlsZC4KLQotVHVlIEp1biAgNyAxMzozMzoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbiwgcmVhbGNsZWFuKTogTmV3IHRhcmdldHMuCi0JKiBkb2MvTWFrZWZpbGUuaW4sIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLU1vbiBKdW4gIDYgMTM6MTA6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChSREFUQV9TRUNUSU9OX05BTUUpOiBEZWZpbmUuCi0JKG1hY3JvKTogQ29ycmVjdCBNX0xJX1NTIFNWUjRfUElDL0VNQkVEREVEX1BJQyBjYXNlLiAgQWZ0ZXIgTV9MSV9ECi0Jb3IgTV9MX0RPQiBvciBsYWJlbCBkb2IsIGZvcmNlIGEgbmV3IGZyYWcgdG8gYXZvaWQgZ2V0dGluZwotCWNvbmZ1c2VkIGluIHRjX2dlbl9yZWxvYy4KLQkobWlwc19pcCk6IFVzZSBSREFUQV9TRUNUSU9OX05BTUUsIG5vdCAucmRhdGEuCi0JKHNfY2hhbmdlX3NlYyk6IExpa2V3aXNlLgotCi1GcmkgSnVuICAzIDIzOjM1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgbWVtc2V0IHRvIHplcm8gb3V0IG1lbW9yeSwgcmF0aGVyIHRoYW4KLQlnb2luZyB0aHJvdWdoIG1kX251bWJlcl90b19jaGFycy4gIFRoaXMgcGVybWl0cyBoYW5kbGluZyBzeW1ib2xpYwotCWFyZ3VtZW50cyB3aGVuIHRoZSBzaXplIGlzIGxhcmdlciB0aGFuIHNpemVvZiAodmFsdWVUKSwgaWYKLQlUQ19DT05TX0ZJWF9ORVcgaXMgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZSBjYXNlIChhcyBpdCBpcyBvbiBNSVBTKS4KLQotRnJpIEp1biAgMyAxMjo1MDoxMyAxOTk0ICBEYXZpZCBKLiBNYWNLZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpLCBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvd191c2FnZSksCi0JY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCB1cCBtZXNzYWdlcy4KLQotCSogYXMuaDogUmVwbGFjZSBmbGFnc2VlbiB3aXRoIHNlcGFyYXRlIHZhcmlhYmxlcy4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBTZXQgdGhlbS4gIERvbid0IGFjY2VwdCAtMSBvcHRpb24sIG9yIC12Ci0JZXhwbGljaXRseSAoaXQncyBhIHN5bm9ueW0gZm9yIC0tdmVyc2lvbikuCi0JKiBhcy5jLCBpbnB1dC1zY3J1Yi5jLCBtZXNzYWdlcy5jLCByZWFkLmMsIHN5bWJvbHMuYywgd3JpdGUuYywKLQljb25maWcvb2JqLWFvdXQuYywgY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotYm91dC5jLAotCWNvbmZpZy9vYmotYm91dC5oLCBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1jb2ZmLmgsCi0JY29uZmlnL29iai12bXMuYywgY29uZmlnL3RjLWhwcGEuYywgY29uZmlnL3RjLWkzODYuYywKLQljb25maWcvdGMtaTk2MC5jLCBjb25maWcvdGMtbTY4ay5jLCBjb25maWcvdGMtbWlwcy5jLAotCWNvbmZpZy90Yy12YXguYzogVXNlIHRoZSBuZXcgZmxhZyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBmbGFnc2Vlbi4KLQkqIGNvbmZpZy90Yy12YXguYyBbT0JKX1ZNU106IFJlY29nbml6ZSAtKywgLTEsIC12LCBhbmQgZG9jdW1lbnQgaW4KLQl1c2FnZS4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFJlbW92ZSB0YXJnZXQgc3BlY2lmaWMgbWVzc2FnZXM7Ci0JaW5zdGVhZCwgY2FsbCBtZF9zaG93X3VzYWdlLgotCShwYXJzZV9hcmdzKTogVXNlIGdldG9wdF9sb25nX29ubHkuICBUYWtlIHBvaW50ZXJzIHRvIGFyZ2MgYW5kCi0JYXJndi4KLQkobWFpbik6IFBhc3MgcGFyc2VfYXJncyBwb2ludGVycy4KLQkqIGFzLmg6IFJlbW92ZSAzIHZhcmlhYmxlcyB0aGF0IGFyZSByZWR1bmRhbnQgd2l0aCBmbGFnc2Vlbi4KLQkqIGFzLmMsIG1lc3NhZ2VzLmM6IENoYW5nZSB0aGVpciB1c2VycyB0byB1c2UgZmxhZ3NlZW4uCi0JRGVmaW5lIGdldG9wdCBzdHVmZi4KLQkqIHRjLmg6IFVwZGF0ZSBtZF9wYXJzZV9vcHRpb24gZGVjbC4gIEFkZCBtZF9zaG93X3VzYWdlIGRlY2wuCi0JKiBjb25maWcvdGMtKi5jOiBBZGQgbWRfc2hvcnRvcHRzLCBtZF9sb25nb3B0cywKLQltZF9sb25nb3B0c19zaXplLCBtZF9zaG93X3VzYWdlLiAgQ2hhbmdlIGNhbGxpbmcgY29udmVudGlvbiBmb3IKLQltZF9wYXJzZV9vcHRpb24uICBSZW1vdmUgbWRfcGFyc2VfbG9uZ19vcHRpb24uCi0JKiBjb25maWcvdGMtbnMzMmsuYzogUmVuYW1lIGBzdHJ1Y3Qgb3B0aW9uJyB0byBgc3RydWN0IG5zMzJrX29wdGlvbicuCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBEb24ndCBkZWZpbmUgbWRfcGFyc2Vfb3B0aW9uLgotCi1UaHUgSnVuICAyIDEzOjU0OjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc2hvd191c2FnZSk6IE5ldyBmdW5jdGlvbi4KLQkocGFyc2VfYXJncyk6IENvZGUgbW92ZWQgZnJvbSBtYWluLgotCVJlY29nbml6ZSAtLWhlbHAgYW5kIC0tdmVyc2lvbi4KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBEZWZpbmUgVENfTlMzMksuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgYWxsIG9mIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgY29tbWFuZAotCWxpbmUgb3B0aW9ucy4KLQotVGh1IEp1biAgMiAxMjowNzoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKGhhc2hfbmV3X3RhYmxlKTogQ2xlYXIgbmV3bHkgYWxsb2NhdGVkIHRhYmxlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChlbnVtIF9yZWdpc3Rlcik6IEFkZCA2ODA2MCBjb250cm9sIHJlZ2lzdGVycwotCUJVU0NSIGFuZCBQQ1IuCi0JKGxhc3RfbW92ZWNfcmVnKTogTmV3IG1hY3JvLgotCShtNjgwMDBfY29udHJvbF9yZWdzLCBtNjgwMTBfY29udHJvbF9yZWdzLCBtNjgwMjBfY29udHJvbF9yZWdzLAotCW02ODA0MF9jb250cm9sX3JlZ3MsIG02ODA2MF9jb250cm9sX3JlZ3MpOiBOZXcgYXJyYXlzLgotCShjb250cm9sX3JlZ3MpOiBOZXcgcG9pbnRlci4KLQkobTY4a19pcCk6IFVzZSBjb250cm9sX3JlZ3MgaW5zdGVhZCBvZiB0ZXN0aW5nIENQVSBldmVyeSB0aW1lLgotCVVzZSBsYXN0X21vdmVjX3JlZyB0b28uICBJbiBlcnJvciBtZXNzYWdlcywgaGFuZGxlIDY4MDYwLCBhbmQKLQlwcmludCA2ODA2MCBmb3IgbWZsb2F0LCB0b28uCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogSGFuZGxlICI2ODA2MCIuICBVc2UgbTY4MDQwdXAgZm9yIG1ha2luZwotCW02ODg1MSBjaG9pY2UuICBTZXQgY29udHJvbF9yZWdzLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgIjY4MDYwIi4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0dGluZyBjcHVfdHlwZSwgcmVjb2duaXplIG02ODA2MCB0b28uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbIUJGRF9BU1NFTUJMRVJdCi0JW0RJRkZfRVhQUl9PS106IERvIGNvbnZlcnNpb24gdG8gcGMtcmVsYXRpdmUgZm9yIGRpZmZlcmVuY2UsIGV2ZW4KLQlpZiBwY3JlbCBpcyBhbHJlYWR5IHNldC4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIHRoaXNfZ2NjX3JlcXVpcmVzX3RoZV9nbnVfYXNzZW1ibGVyIGluIGFsbAotCWxvd2VyLWNhc2UsIGluIGNhc2Ugd2UncmUgaWdub3JpbmcgY2FzZSBvZiBvcGNvZGVzIGluIHRoZSBpbnB1dAotCWZpbGUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvICguc2VjdGlvbik6IERvY3VtZW50IGFzIHVuYXZhaWxhYmxlIGZvciBhLm91dAotCXR5cGUgZm9ybWF0cy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1hY2hpbmUpOiBOZXcgdmFyaWFibGUuCi0JKGxvYWRfaW5zbik6IE5ldyBtYWNyby4KLQkobG9hZF9pbnNuX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9iZWdpbik6IENhbGwgbG9hZF9pbnNuX3RhYmxlLCBvbmNlIGZvciBiYXNpYyBpbnN0cnVjdGlvbnMgYW5kCi0Jb25jZSBmb3IgYXBwcm9wcmlhdGUgUEFMIGluc3RydWN0aW9uIHRhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgYG1hY2hpbmUnIGJhc2VkIG9uIC1tIyMjIyMgYXJndW1lbnRzLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oIChhbHBoYV9wYWwyMTA2NF9vcGNvZGVzKTogU3BsaXQgb3V0IGZyb20KLQlhbHBoYV9vcGNvZGVzLgotCShhbHBoYV9wYWwyMTE2NF9vcGNvZGVzKTogTmV3IHRhYmxlLgotCShOVU0yMTA2NE9QQ09ERVMsIE5VTTIxMTY0T1BDT0RFUyk6IE5ldyBtYWNyb3MuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGkzODYtKi1uZXRic2QwLjgpOiBVc2UgMzg2YnNkIGVtdWxhdGlvbi4KLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tZ2FzcCk6IFVzZSAkJGRpciB3aGVuIGluc3RhbGxpbmcKLQlmaWxlLgotCi1XZWQgSnVuICAxIDEwOjQ4OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZvcmNlIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB0byBiZQotCWFsaWduZWQgY29ycmVjdGx5LgotCi1GcmkgTWF5IDI3IDEwOjA1OjUzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JTWVyZ2VkIGluIGNoYW5nZXMgZnJvbSBnYXMtMi4zIG5ldCByZWxlYXNlOgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuMy4xLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBSZXBsYWNlZCB1bmNoZWNrZWQgdXNlcyBvZiBtYWxsb2Mgd2l0aAotCXhtYWxsb2MuCi0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBPbmx5IHRlc3QgQkZENjQsIG5vdAotCUJGRF9BU1NFTUJMRVIgdG9vLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCkgW0JGRF9BU1NFTUJMRVJdCi0JW0RJRkZfRVhQUl9PS106IERvbid0IGNoZWNrIHBjcmVsLCBqdXN0IGNvbnZlcnQgaXQuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IFJlbW92ZWQgbG90cyBvZiBleHRyYSBzZW1pY29sb25zIGFmdGVyCi0JY29tcG91bmQgc3RhdGVtZW50cy4KLQkoc3RyY2hyKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgotCi0JKiBjb25maWcvaG8tdmF4LmggKHJlYWxsb2MpOiBEZWNsYXJlLgotCi0JKiBjb25maWcvaG8tdm1zLmggKHN0cmNociwgc3RyZHVwKTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BhcnNlX29wdGlvbikgW09CSl9FTEZdOiBBY2NlcHQgYW5kIGlnbm9yZQotCW9wdGlvbiBgLXEnLgotCi0JV2VkIE1heSAxOCAyMDo1MDozNSAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAoREJHX1NfQ19TUVVBRCwgREJHX1NfQ19VUVVBRCk6IGRlZmluZSB0aGVzZQotCW5ldyBWTVMgc3ltYm9sLXR5cGUgbWFjcm9zOyBzaWduZWQgYW5kIHVuc2lnbmVkIHF1YWR3b3JkIGludGVnZXJzLAotCWZvciBgbG9uZyBsb25nJyBzdXBwb3J0LiAgVGhlaXIgdmFsdWVzIGNvbWUgZnJvbSB0aGUgZXhpc3RpbmcKLQlEU0MkS19EVFlQRV9RVSBhbmQgRFNDJEtfRFRZUEVfUSBtYWNyb3MgaW4gPGRlc2NyaXAuaD4uICBUaGUKLQlWTVMgZGVidWdnZXIgbm93IHJlY29nbml6ZXMgYGxvbmcgbG9uZycgdmFyaWFibGVzIGNvcnJlY3RseS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU190eXBlZGVmX3BhcnNlKSBbY2FzZSAnciddOiBhZGQgZW50cmllcwotCWZvciBnY2MyJ3MgcHJlZGVmaW5lZCB0eXBlcyAibG9uZyBkb3VibGUiIChzYW1lIGFzIGRvdWJsZSwgYXMKLQlwZXIgZ2NjJ3MgY3VycmVudCBzdGF0ZSksICJsb25nIGxvbmcgaW50IiwgImxvbmcgbG9uZyB1bnNpZ25lZAotCWludCIsIGFuZCBmaW5hbCBgb3RoZXJ3aXNlJyBjYXNlICh0byBhdm9pZCB1bmluaXRpYWxpemVkIHR5cGUKLQlhbmQgc2l6ZSBmaWVsZHMpLiAgW2NhdmVhdDogIHByZWRlZmluZWQgdHlwZXMgImNvbXBsZXggaW50IiwKLQkiY29tcGxleCBmbG9hdCIsICJjb21wbGV4IGRvdWJsZSIsIGFuZCAiY29tcGxleCBsb25nIGRvdWJsZSIgYXJlCi0Jc3RpbGwgbWlzc2luZy5dCi0KLQkqIGNvbmZpZy9oby12bXMuaCAoRVhJVF9GQUlMVVJFKTogZGVmaW5lIGFzIDB4MTAwMDAwMDIgaW5zdGVhZAotCW9mIDAsIGJlY2F1c2UgdGhlIGxhdHRlciBpbmRpY2F0ZXMgc3VjY2VzcyByYXRoZXIgdGhhbiBmYWlsdXJlCi0Jd2hlbiBwYXNzZWQgdG8gYGV4aXQnIG9yIHJldHVybiBmcm9tIGBtYWluJyBjb21waWxlZCBieSBnY2MyLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChhcnJheV9zdWZmaXgsIGdlbmVyYXRlX3N1ZmZpeCk6IHJlcGxhY2UgdHdvCi0JaGFyZGNvZGVkIGAweGEzJ3Mgd2l0aCBtYWNybyBEQkdfU19DX0FEVkFOQ0VEX1RZUEUgZnJvbSBvYmotdm1zLmguCi0JKFZNU190eXBlZGVmX3BhcnNlKTogZWxpbWluYXRlIHJlZHVuZGFudCBpZi10aGVuLWVsc2Ugd2hlbgotCWFsbG9jYXRpbmcgbmV3IHN5bWJvbCBlbnRyeSBhbmQgbGlua2luZyBpdCB0byBWTVNfU3ltYm9sX3R5cGVfbGlzdC4KLQotCVR1ZSBNYXkgMTcgMjA6NDc6MzEgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IGRvbid0IHRyeSB0byBpbnRlcnByZXQKLQl0aGUgY29udGVudHMgb2YgdGhlIEdBU19WRVJTSU9OIHN0cmluZyB3aGVuIGZhbGxpbmcgYmFjayB0byBpdCBmb3IKLQlsYW5ndWFnZSBwcm9jZXNzb3IgaWRlbnRpZmljYXRpb24uCi0KLQkqIG1ha2UtZ2FzLmNvbSwgdm1zY29uZi5zaCAoRU5WSVJPTik6IGZpeCBtaXNzcGVsbGluZyBvZgotCWBwc2VjdF9hdHRyJyBpbiBsaW5rZXIgb3B0aW9ucy4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCi0JKiBjb25maWcvdGUtZ28zMi5oOiBbbmV3XSBnbzMyJ3MgZW52aXJvbm1lbnQKLQotRnJpIE1heSAyMCAxNzo1OTozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVycyBmb3Igc3Ryc3RyLgotCi1UaHUgTWF5IDE5IDE1OjQwOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEb24ndCBjaGFuZ2UgdGhlIHNpemUgaWYKLQlPQkpfRUxGLgotCi1XZWQgTWF5IDE4IDEzOjA4OjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZWRpcmVjdCBsbiBvdXRwdXQgdG8gL2Rldi9udWxsLiAgSWYgbG4KLQlmYWlscyBvbiBnYXNwLCBpbnN0YWxsIGdhc3AubmV3LCBub3QgZ2FzcC4KLQotV2VkIE1heSAxOCAwOToxNjozNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBVc2UgUl9IUFBBX0FCU19DQUxMLCBub3QgUl9IUFBBIGZvcgotCWFic29sdXRlIGNhbGxzLgotCi1UdWUgTWF5IDE3IDEyOjUwOjQ2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9mcF9jbXBfY29uZCk6IFJlcG9ydCBhbiBlcnJvcgotCW9uIGEgcGFydGlhbCBjb21wbGV0ZXIgbWF0Y2guCi0KLU1vbiBNYXkgMTYgMTI6MDM6NDkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IENoYW5nZSAuaHBwYV91bndpbmQgdG8gLlBBUklTQy51bndpbmQKLQl0aHJvdWdob3V0IGNvZGUuCi0JKGlzX2NvbXBsZXgpOiBEZWxldGUgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydCBmb3IgY29tcGxleCByZWxvY2F0aW9uCi0JdHlwZXMuCi0JKHRjX2dlbl9yZWxvYyk6IERlbGV0ZSBzcGVjaWFsIHVud2luZCBjcnVkIGZvciBFTEYuICBTaW1wbGlmeSBhbmQKLQlyZXdyaXRlIEVMRiBjb2RlIGJhc2VkIG9uIDk0LTAyLTAyIFBBIEVMRiBkcmFmdCBzcGVjLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBVc2Ugc3RhbmRhcmQgUEFSSVNDX0RJUjMyIHJlbG9jcyBmb3IKLQl0aGUgdW53aW5kIGRlc2NyaXB0b3JzLgotCi1GcmkgTWF5ICA2IDE0OjEzOjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiBOZXcgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIGdvMzIgY3Jvc3NpbmcuCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PWdvMzIpOiBVc2UgbmV3IGZyYWdtZW50LgotCi1GcmkgTWF5ICA2IDE0OjM1OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShtYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogV2hlbiB1c2luZyAtbWFueSwgcGVybWl0IGNvbXBhcmlzb24KLQlpbnN0cnVjdGlvbnMgdG8gYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIHRoZSBvcGNvZGUgdGFibGUuCi0KLVRodSBNYXkgIDUgMTk6MTQ6NDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGUgdG8gMi4yLjkwLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgcGVybWl0IGFkZGl0aW9ucwotCXRvIHRoZSBzeW1ib2wgdGFibGUgaWYgaXQncyBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZSBvdXRwdXQgYmZkLgotCShzeW1ib2xfYmVnaW4pIFshIEVNSVRfU0VDVElPTl9TWU1CT0xTXSBbUkVMT0NfUkVRVUlSRVNfU1lNQk9MXToKLQlEb24ndCB1c2UgYmZkX2Fic19zZWN0aW9uLnN5bWJvbCBmb3IgZ2FzIGFic29sdXRlIHN5bWJvbC4KLQotCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4sIGNsZWFuLWR2aSwgY2xlYW4taW5mbyk6IERlbGV0ZSBnYXNwCi0JZmlsZXMgdG9vLgotCi1UaHUgTWF5ICA1IDE4OjEyOjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbWl0X2RlbGF5cyk6IE1ha2UgY2FsbCB0bwotCW1pcHNfbm9fcHJldl9pbnNuIHVuY29uZGl0aW9uYWwuCi0KLVRodSBNYXkgIDUgMTc6MjU6MzggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmKi4qOiBNZXJnZWQgY29mZmJmZCB2ZXJzaW9ucyBpbnRvIGNvZmYgdmVyc2lvbnMsCi0Jd2l0aCBhIHNpbmdsZSAiI2lmZGVmIEJGRF9BU1NFTUJMRVIiIGNvbnRyb2xsaW5nIG1vc3Qgb2YgaXQgZm9yCi0Jbm93LiAgRGVsZXRlZCBvYmotY29mZmJmZC4qIGZpbGVzLgotCSogY29uZmlndXJlLmluOiBBbHdheXMgdXNlIG9iai1jb2ZmLiogZm9yIENPRkYgdGFyZ2V0cy4KLQotV2VkIE1heSAgNCAxMzozNDoxMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGUtZHB4Mi5oIChUQVJHRVRfRk9STUFULCBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpOgotCURlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay1idWxsLXN5c3YzKik6IEVuYWJsZS4KLQotCSogY29uZmlnL2NvZmZfZ251Lmg6IERlbGV0ZWQuCi0KLVdlZCBNYXkgIDQgMTE6Mjk6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogSWYgbm90IFRFX1NVTjMsIGRlZmluZSBhcwotCSJhLm91dC16ZXJvLmJpZyIuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogTWFrZSBjb21tb24gc3ltYm9sIGFuZCBQQwotCXJlbGF0aXZlIGFkanVzdG1lbnRzIHdoZW4gVEVfTFlOWCBpcyBkZWZpbmVkIGFzIHdlbGwgYXMgd2hlbgotCVRDX0kzODYgaXMgZGVmaW5lZC4KLQotV2VkIE1heSAgNCAwMjoyOToyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoc3Ryc3RyKTogUmVzdG9yZSBkZWNsYXJhdGlvbi4KLQkoc3Vic2VnX2dldCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIG9ial9hZGp1c3Rfc3ltdGFiIGlzIGRlZmluZWQsCi0JaW52b2tlIGl0LiAgVGhlbiBjYWxsIHNldF9zeW10YWIsIGFuZCBmaW5hbGx5IGludm9rZSAqX2Zyb2JfZmlsZQotCWhvb2tzLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfYWRqdXN0X3N5bXRhYik6IFJlbmFtZWQgZnJvbQotCWNvZmZfZnJvYl9maWxlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfYWRqdXN0X3N5bXRhYik6IENoYW5nZWQgZGVjbGFyYXRpb24KLQlhY2NvcmRpbmdseS4KLQkob2JqX2FkanVzdF9zeW10YWIpOiBNYWNybyBhbHNvIGNoYW5nZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWdudSopOiBOZXcgdGFyZ2V0LCBoYW5kbGVkIGxpa2UgaTM4Ni1tYWNoLgotCi1UdWUgTWF5ICAzIDIxOjA0OjE2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKSBbVENfSTk2MF06IFNlbGVjdCBsaXR0bGUKLQllbmRpYW4gdmVyc2lvbi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogRGl0dG8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc2VjdGlvbik6IFJvdW5kIHVwIHRoZSBzaXplIG9mCi0JZXZlcnkgc2VjdGlvbiB0byBhIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQsIHNvIHRoYXQgQkZEIGRvZXNuJ3QKLQlzdXJwcmlzZSB1cy4KLQotCUVsaW1pbmF0ZSBtYW55IHNpbXBsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gQ09GRiBiYWNrIGVuZHM6Ci0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBSZW1vdmVkIGFsbCB1c2VzIG9mIERFRlVOIGFuZCBERUZVTl9WT0lELgotCU1hZGUgbWlub3Igc3R5bGlzdGljIGNoYW5nZXMsIGRlbGV0ZWQgc29tZSByZWdpc3RlciBkZWNsYXJhdGlvbnMuCi0JKHN0YWNrX3RvcCk6IERlbGV0ZWQuCi0JKHN5bWJvbF90b19jaGFycyk6IFVzZSBhYnNvbHV0ZV9zZWN0aW9uIGFuZCByZWdfc2VjdGlvbiBpbnN0ZWFkIG9mCi0JdGhlIGNvcnJlc3BvbmRpbmcgU0VHXyogc3ltYm9scy4KLQkob2JqX2NvZmZfZW5kZWYsIHRhZ19maW5kX29yX21ha2UsIGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkoc3RhY2sgdHlwZWRlZiwgc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3ApOgotCU1vdmVkIHRvIGp1c3QgYWZ0ZXIgcHNldWRvLW9wIHRhYmxlLiAgQWxsIGZ1bmN0aW9ucyBub3cgc3RhdGljLgotCShzdGFja19kZWxldGUpOiBSZW1vdmVkIGRlY2xhcmF0aW9uLgotCSh0YWdfaW5pdCwgdGFnX2luc2VydCwgdGFnX2ZpbmRfb3JfbWFrZSwgdGFnX2ZpbmQpOiBNb3ZlZCB0byBqdXN0Ci0JYWZ0ZXIgc3RhY2sgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IFJlb3JkZXJlZCBzb21lIGRlY2xhcmF0aW9ucyBhbmQgbWFjcm9zLgotCShzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6IERvbid0IGRlY2xhcmUuCi0JKHN0YWNrIHR5cGVkZWYpOiBEZWxldGVkLgotCShTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTKTogQWx3YXlzIHVuZGVmIHRoZW4gZGVmaW5lOyBkb24ndCB0ZXN0LgotCShTWU1fQVVYRU5UKTogTmV3IG1hY3JvLgotCShTQV9HRVRfKiwgU0FfU0VUXyopOiBEZWZpbmUgaW4gdGVybXMgb2YgU1lNX0FVWEVOVCB3aGVuIGZlYXNpYmxlLgotCShTRl9HRVRfKiwgU0ZfU0VUXyopOiBEZWZpbmUgaW4gdGVybXMgb2YgU0ZfR0VUIHdoZW4gZmVhc2libGUuCi0JKFNBX0dFVF9TWU1fVEFHTkRYLCBTQV9HRVRfU1lNX0VORE5EWCwgU0FfU0VUX1NZTV9UQUdORFgsCi0JU0FfU0VUX1NZTV9FTkRORFgsIG9iamVjdF9oZWFkZXJzIHR5cGVkZWYsIGRhdGFfc2VjdGlvbl9oZWFkZXIsCi0JdGV4dF9zZWN0aW9uX2hlYWRlcik6IERlbGV0ZSBub24tQkZEX0hFQURFUlMgdmVyc2lvbnMsIHNpbmNlIHdlCi0JYWx3YXlzIGRlZmluZSB0aGF0IHN5bWJvbCBub3cuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzdGFja190b3ApOiBEZWxldGVkLgotCShvYmpfY29mZl9lbmRlZiwgb2JqX2NvZmZfZGltLCBvYmpfY29mZl9saW5lLCBvYmpfY29mZl9zaXplLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLCBvYmpfY29mZl92YWwpOiBDaGFuZ2UKLQlhcmd1bWVudCBuYW1lIGZyb20gImlnbm9yZWQiIHRvICJpZ25vcmUiLgotCShvYmpfY29mZl92YWwpOiBVc2UgZnJhZ19ub3dfZml4LgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBJR05PUkVfREVCVUcgdmVyc2lvbiwgc2luY2UgaXQgZG9lc24ndAotCWdldCB1c2VkLgotCShzdGFjayB0eXBlZGVmLCBzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6Ci0JTW92ZWQgdG8ganVzdCBhZnRlciBwc2V1ZG8tb3AgdGFibGUuICBBbGwgZnVuY3Rpb25zIG5vdyBzdGF0aWMuCi0JKHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZF9vcl9tYWtlLCB0YWdfZmluZCk6IE1vdmVkIHRvIGp1c3QKLQlhZnRlciBzdGFjayBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogUmVvcmRlcmVkIHNvbWUgZGVjbGFyYXRpb25zIGFuZCBtYWNyb3MuCi0JUHJvdGVjdGVkIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkoc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3ApOiBEb24ndCBkZWNsYXJlLgotCShzdGFjayB0eXBlZGVmKTogRGVsZXRlZC4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IEFsd2F5cyB1bmRlZiB0aGVuIGRlZmluZTsgZG9uJ3QgdGVzdC4KLQkoc3Rkb3V0cHV0KTogRGVsZXRlZCBkZWNsYXJhdGlvbi4KLQkoVEFSR0VUX0ZPUk1BVCkgW1RDX0kzODZdOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCi1Nb24gTWF5ICAyIDE3OjA5OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IFVzZSBmaXhfdGFpbCBmaWVsZCBldmVuIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IEluaXRpYWxpemUgZml4X3RhaWwgZmllbGQuCi0JKHN1YnNlZ19nZXQpOiBMaWtld2lzZS4KLQkqIHdyaXRlLmMgKGZyYWdzX2NoYWluZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmaXhfbmV3X2ludGVybmFsKTogSWYgZnJhZ3NfY2hhaW5lZCBpcyBzZXQsIHVzZSBmaXhfcm9vdCBhbmQKLQlmaXhfdGFpbCBmcm9tIHNlZ19pbmZvIChub3dfc2VnKSwgcmF0aGVyIHRoYW4gZnJjaGFpbl9ub3cuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBTZXQgZml4X3RhaWwgZmllbGQuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogU2V0IGZyYWdzX2NoYWluZWQuCi0KLVRodSBBcHIgMjggMDE6Mzk6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfb3B0aW9uKTogT25seSByZWZlciB0byBnX3N3aXRjaF8qIHZhcmlhYmxlcwotCWlmIEdQT1BUIGlzIGRlZmluZWQuCi0JKHNfYWJpY2FsbHMpOiBEaXR0by4KLQkobWRfYXBwbHlfZml4KTogQ2FzdCBjaGFyKiB0byB1bnNpZ25lZCBjaGFyKiB0byBhdm9pZCBwb2ludGVyCi0JbWlzbWF0Y2guCi0KLVdlZCBBcHIgMjcgMTE6MDY6MzIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ28zMik6IFVzZXMgY29mZiBub3cuCi0JKiBnYXNwLmMgKG1haW4pOiBOb3cgdGFrZXMgLUQgb24gY29tbWFuZCBsaW5lLgotCShzaG93X3VzYWdlKTogRGVzY3JpYmUgbmV3IG9wdGlvbnMuCi0KLVR1ZSBBcHIgMjYgMTc6MTA6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IFByaW50ICJOTyBERUZJTkVEIFNZTUJPTFMiIGFuZAotCSJOTyBVTkRFRklORUQgU1lNQk9MUyIgaWYgdGhlcmUgYXJlbid0IGFueSwgaW5zdGVhZCBvZiBkaXNwbGF5aW5nCi0JdGhlIGhlYWRlciB3aXRoIGFuIGVtcHR5IGxpc3QuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBDaGVjayBDT0ZGX05PTE9BRF9QUk9CTEVNCi0JYWxzbyBiZWZvcmUgc2V0dGluZyBTVFlQX05PTE9BRCBmb3IgLmJzcyBzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpOiBOZXcgdmFyaWFibGUuCi0JSW5pdGlhbGl6ZWQgdG8gdmFsdWUgb2YgUkVHSVNURVJfUFJFRklYX09QVElPTkFMLCBpZiBkZWZpbmVkLCBvcgotCXplcm8uCi0JKG02OGtfcmVnX3BhcnNlKTogSWYgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIGlzIHNldCwgcGVybWl0Ci0JcmVnaXN0ZXIgcHJlZml4IHRvIGJlIGFic2VudC4KLQkobTY4a19pcF9vcCk6IEFjY2VwdCBgJicgYWxzbyBmb3IgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQkoaW5zZXJ0X3JlZyk6IERvbid0IGJvdGhlciB3aXRoICh0d28hPykgc2FuaXR5IGNoZWNrcyBvZiB0aGUKLQlzeW1ib2wgdGFibGUgd2hlbiBpbnNlcnRpbmcgZWFjaCByZWdpc3Rlci4KLQkobTY4a19wYXJzZV9sb25nX29wdGlvbik6IE5ldyBmdW5jdGlvbi4gIFNldAotCWZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCBpZiAicmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIiBpcyBwYXNzZWQuCi0JKiBjb25maWcvdGMtbTY4ay5oIChSRUdJU1RFUl9QUkVGSVgpOiBBbHdheXMgZGVmaW5lIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYKTogRG9uJ3QgZGVmaW5lLgotCShSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLCBkZWZpbmUgYXMgemVybwotCW9yIG9uZSBkZXBlbmRpbmcgb24gTTY4S0NPRkYuCi0KLQlTb21lIGNoYW5nZXMgdG8gaGVscCBBcG9sbG8gc3VwcG9ydCwgZnJvbSB0cm95QGNibWUudW5zdy5lZHUuYXU6Ci0JKiBjb25maWcvdGMtbTY4ay5jIChEQVRBLCBBRERSLCBTUCwgRlBSRUcsIENPUE5VTSwgQkFELCBCQUMpOgotCURlZmluZSBhcyBtYWNyb3MgaW5zdGVhZCBvZiBlbnVtZXJhdG9ycywgc2luY2UgdGhlIEFwb2xsbyBjb21waWxlcgotCWNhbid0IGhhbmRsZSAiZW51bVZhbDEsIGVudW1WYWwyID0gZW51bVZhbDEiIHdoZW4gZGVmaW5pbmcgYW4gZW51bQotCXR5cGUuCi0JKG1ha2VfcGNyZWxfYWJzb2x1dGUpIFtOT19QQ1JFTF9SRUxPQ1NdOiBOZXcgZnVuY3Rpb24uCi0JKHRjX2NvZmZfZml4MnJ0eXBlKSBbTk9fUENSRUxfUkVMT0NTXTogR2VuZXJhdGUgb25seSBSX1JFTEJZVEUsCi0JUl9ESVIxNiwgYW5kIFJfRElSMzIgcmVsb2NzLgotCSogY29uZmlnL3RjLW02OGsuaCBbVEVfQVBPTExPXSAoQ09GRl9NQUdJQywgQ09GRl9BT1VUSERSX01BR0lDKToKLQlVc2UgQXBvbGxvIHZlcnNpb25zLgotCVtURV9BUE9MTE9dIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUik6IFVuZGVmaW5lLiAgVGhhdCBpcywKLQlkbyBpbmNsdWRlIHRoZSBvcHRpb25hbCBoZWFkZXIgZm9yIEFwb2xsbyB0YXJnZXQuCi0JKENPRkZfTUFHSUMpOiBEb24ndCBkZWZpbmUgYXMgTUM2OE1BR0lDIGlmIGl0J3MgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5oIFtURV9ERUxUQV0gKExFWF9QQ1QpOiBEZWZpbmUgYXMgMSwgc28gdGhhdCBgJScKLQljYW4gYmUgdXNlZCB3aXRoaW4gYSBsYWJlbCBuYW1lLgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IERlY2xhcmUuCi0JKHRjX2luaXRfYWZ0ZXJfYXJncyk6IERlZmluZSBhcyBtNjhrX2luaXRfYWZ0ZXJfYXJncy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogTmV3IGZ1bmN0aW9uLAotCWNvbnRhaW5pbmcgb25lLXNob3QgY29kZSBmcm9tIG1kX2Fzc2VtYmxlLiAgQWRkZWQgd2FybmluZyBmb3IKLQljb21iaW5hdGlvbiBvZiA2ODA0MCBhbmQgNjg4NTEuCi0JKG1kX2Fzc2VtYmxlKTogU3RhcnR1cC10aW1lIGNvZGUgZGVsZXRlZC4KLQotTW9uIEFwciAyNSAxNjoxOToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoY2xlYW4sIGRpc3RjbGVhbik6IFJlbW92ZSBhc2NvbmZpZy50ZXhpLgotCi1TdW4gQXByIDI0IDAwOjEzOjA4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IDEzIGJpdCBpbW1lZGlhdGUgY29uc3RhbnQgKGZvciBicmVhawotCWluc3RydWN0aW9uKSBpcyB1bnNpZ25lZC4KLQotRnJpIEFwciAyMiAxNzo1ODoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogVXNlIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUKLQlhbmQgYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyB0byBzZXQgdGhlIEdQIHZhbHVlIGFuZCB0aGUgcmVnaXN0ZXIKLQltYXNrcywgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIG5vdyBvYnNvbGV0ZSBmYWtlIC5yZWdpbmZvIHNlY3Rpb24uCi0KLUZyaSBBcHIgMjIgMTU6MTc6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IERvbid0IHByaW50IHJlZ2lzdGVyIHN5bWJvbHMgYXMKLQl1bmRlZmluZWQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogRG9uJ3QgbmVlZCB0byBzdHJpcAotCXVuZGVyc2NvcmVzLCBzaW5jZSBzeW1ib2xfbmV3IHdpbGwgYWxyZWFkeSBoYXZlIGRvbmUgaXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IERpdHRvLgotCi0JKiBhcy5jIChtYWluKTogSWYgdGNfaW5pdF9hZnRlcl9hcmdzIGlzIGRlZmluZWQsIGludm9rZSBpdCBhZnRlcgotCWFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KLQotCVNvbWUgY2hhbmdlcyB0byBoZWxwIEFwb2xsbyBzdXBwb3J0LCBmcm9tIHRyb3lAY2JtZS51bnN3LmVkdS5hdToKLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcykgW1RFX0FQT0xMT106IENyZWF0ZSAud3RleHQKLQlzZWN0aW9uIGluc3RlYWQgb2YgLnRleHQuICBDYWxsIGNyZWF0ZV90YXJnZXRfc2VnbWVudHMuCi0JKiByZWFkLmMgKGRlbWFuZF9jb3B5X3N0cmluZyk6IE5vIGxvbmdlciBzdGF0aWMuCi0KLVRodSBBcHIgMjEgMTU6NTA6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFBlcm1pdCBicmFuY2hlcyB0byBiZSBzd2l0Y2hlZAotCXdpdGggdGhlIHByZWNlZGluZyBpbnN0cnVjdGlvbiBldmVuIGlmIC5zZXQgbm9ib3B0IGhhcyBiZWVuIHNlZW4uCi0JLnNldCBub2JvcHQgYWN0dWFsbHkgY29udHJvbHMgd2hldGhlciB0byBicmluZyB1cCBhbiBpbnN0cnVjdGlvbgotCWZyb20gdGhlIGJyYW5jaCB0YXJnZXQsIHdoaWNoIGdhcyBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydC4KLQotV2VkIEFwciAyMCAxODo0NjoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCwgY29uZmlnL29iai1jb2ZmLmM6IERlbGV0ZWQgYWxsIGNvZGUgdXNlZCBvbmx5Ci0Jd2hlbiBCRkRfQVNTRU1CTEVSIGlzIG5vdCBkZWZpbmVkLCBhbmQgYWxsIGNvbmRpdGlvbmFscyByZWxhdGluZwotCXRvIHN1Y2ggY29kZS4gIE5vIHN1Y2ggdGFyZ2V0cyByZW1haW4uCi0KLQlGaXhlcyBmb3Igc3RhYnMtaW4tY29mZjoKLQkqIGNvbmZpZy9vYmotY29mZi5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkoY29mZl9mcm9iX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uLAotCWNvZmZfZnJvYl9zZWN0aW9uKTogRGVjbGFyZS4KLQkob2JqX2Zyb2Jfc2VjdGlvbik6IE5ldyBtYWNybzsgdXNlcyBjb2ZmX2Zyb2Jfc2VjdGlvbi4KLQkoSU5JVF9TVEFCX1NFQ1RJT04pOiBOZXcgbWFjcm87IHVzZXMgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zZWN0aW9uX2FsaWduKTogQWx3YXlzIHJvdW5kIHVwIHRvCi0JbXVsdGlwbGUgb2YgYWxpZ25tZW50IHBvd2VyIHNwZWNpZmllZCBpbiBiZmQgdGFyZ2V0IHZlY3Rvci4KLQotCSogZ2FzcC5jOiBJbmNsdWRlIGN0eXBlLmguCi0KLU1vbiBBcHIgMTggMjE6MDg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvYXMudGV4aW5mbzogUmVuYW1lZCBhc2RvYy1jb25maWcudGV4aSB0bwotCWFzY29uZmlnLnRleGkuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvLWFzLCBpbnN0YWxsLWluZm8tZ2FzcCk6IEdldCBmaWxlCi0JbmFtZXMgZnJvbSBzb3VyY2UgZGlyZWN0b3J5IHdpdGhvdXQgcGF0aG5hbWUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IFdoaWxlIGxvb2tpbmcgZm9yCi0JcmVnaXN0ZXIgbWFzaywgc2tpcCBlbXB0eSBmaWxsIGZyYWdzIGNhdXNlZCBieSBlbmFibGluZyBsaXN0aW5nCi0Jb3V0cHV0LgotCi0JKiBjb25maWcvaG8tc3lzdi5oOiBJbmNsdWRlIHN0cmluZy5oLgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IE5ldyAod2VsbCwgcmVjZW50bHkgYWRkZWQpIGZpbGUuICBKdXN0IGFkZGVkCi0JaW5mbyBvbiBhc193YXJuIGFuZCBmcmllbmRzLgotCi1Nb24gQXByIDE4IDE0OjI4OjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogVXNlIHRoZSBidWlsdC1pbgotCWRlZmF1bHRzIGZvciBkZWZpbmVkLCBwcml2YXRlLCBhbmQgc3BudW0gZmllbGRzIGZvciB0aGUKLQkkVEVYVCQgYW5kICRQUklWQVRFJCBzcGFjZXMuICBEbyBub3QgY2xvYmJlciBzcG51bS4gIERvCi0Jbm90IHJlc2V0IHRoZSBzZWdtZW50IGlmIGp1c3QgdXBkYXRpbmcgYSBzcGFjZS4KLQkocGFfc3BhY2VzX2JlZ2luKTogU2V0IEJGRCBzZWN0aW9uIGZsYWdzIGZvciBhbGwgYnVpbHQtaW4KLQlzdWJzcGFjZXMuCi0KLUZyaSBBcHIgMTUgMTA6NTE6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChmaXJzdF9wcm9jX3B0cik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFkZF9wcm9jZWR1cmUpOiBTZXQgZmlyc3RfcHJvY19wdHIgaWYgaXQgaGFzbid0IGJlZW4gc2V0LgotCShlY29mZl9idWlsZF9saW5lbm8pOiBJZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGRvZXMgbm90IHN0YXJ0IGF0Ci0JYWRkcmVzcyB6ZXJvLCBpbnNlcnQgYSBkdW1teSBsaW5lIHRvIGNvbXBlbnNhdGUuCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBNYWtlIGdhc3AubmV3Ci0JYXMgd2VsbCBhcyBhcy5uZXcuCi0KLVRodSBBcHIgMTQgMTU6MTI6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogVHJ5IHRvIHBhcnNlICIwZiIgYW5kICIwYiIgc2VxdWVuY2VzIGFzCi0JZmxvYXRpbmcgcG9pbnQgYW5kIGJpbmFyeSBudW1iZXJzIHJlc3BlY3RpdmVseTsgaWYgaXQgZG9lc24ndAotCXdvcmssIHRyZWF0IHRoZW0gYXMgbG9jYWwgbGFiZWxzLgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSAkKE9CSlMpIGRlcGVuZCBvbiAkKEFMTF9PQkpfREVQUykuCi0JKiBjb25maWd1cmUuaW46IFNldCBBTExfT0JKX0RFUFMgaW4gb3V0cHV0IE1ha2VmaWxlLgotCi0JQmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSA8QkFJTEVZQGhtaXZheC5odW1nZW4udXBlbm4uZWR1PgotCShDaGFybGVzIEJhaWxleSk6Ci0JKiB2bXNjb25mLnNoOiBJbiBnZW5lcmF0ZWQgZmlsZSwgZ2V0ICIub2JqIiBzdWZmaXggcmlnaHQsIGJ1aWxkCi0Jc291cmNlIGZpbGVzIGZyb20gb3RoZXIgZGlyZWN0b3JpZXMgaW50byBvYmplY3RzIGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LCBhbmQgc3BlY2lmeSBQU0VDVCBhdHRyaWJ1dGVzIGV4cGxpY2l0bHkgdG8gbGlua2VyLgotCUFsc28gYWRkZWQgbWlzc2luZyBsYWJlbC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1tay5jb20pOiBSZWZlcmVuY2UgbmV3IHZhcmlhYmxlCi0JVk1TX09USEVSX09CSlMgZm9yIGxpc3Qgb2Ygbm9uLWxvY2FsIG9iamVjdCBmaWxlcywgaW5zdGVhZCBvZgotCWxpc3RpbmcgdGhlbSBoZXJlLgotCShWTVNfT1RIRVJfT0JKUyk6IE5ldyB2YXJpYWJsZSwgYWRkZWQgbW9yZSBsaWJpYmVydHkgZmlsZXMuCi0JKiBtYWtlLWdhcy5jb206IFJlZ2VuZXJhdGVkLgotCi0JKiBjb25maWcvaG8tdm1zLmggKHVubGluayk6IERlZmluZSBhcyBkZWxldGUuCi0KLQkqIGNvbmZpZy1nYXMuY29tOiBGaXggcXVvdGluZyBvbiBUQVJHRVRfQ0FOT05JQ0FMIGRlZmluaXRpb24uCi0JRGVsZXRlIGZpbGVzIGJlZm9yZSBjcmVhdGluZyB0aGVtLgotCi1UaHUgQXByIDE0IDEzOjM0OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlLXN0YWdlMSwgZGUtc3RhZ2UyLCBkZS1zdGFnZTMpOiBVc2Ugcm0gLWYuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogUGVybWl0IEJGRF9SRUxPQ19QQ1JFTF9MTzE2IGZvcgotCWNlcnRhaW4gY2FzZXMgb2YgJ2knLCAnaicgYW5kICdvJy4gIENoYW5nZSAndScgdG8gdGFrZSBhbgotCWFyZ3VtZW50LCB0aGUgcmVsb2MgdHlwZS4KLQkobG9hZF9yZWdpc3Rlcik6IFBhc3MgcmVsb2MgdHlwZSB0byBtYWNyb19idWlsZCBmb3IgJ3UnLgotCShtYWNybyk6IExpa2V3aXNlLiAgRm9yIE1fTEFfQUIgcGVybWl0IGEgZGlmZmVyZW5jZSBleHByZXNzaW9uCi0Jd2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIGJldHdlZW4gYW4gYXJiaXRyYXJ5IHN5bWJvbCBhbmQKLQlhIHN5bWJvbCBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBhbmQKLQlCRkRfUkVMT0NfUENSRUxfTE8xNiB0byBiZSBlbWl0dGVkLgotCShtZF9hcHBseV9maXgpOiBDaGVjayB0aGF0IG1vc3QgcmVsb2NzIGFyZSBub3QgUEMgcmVsYXRpdmUuCi0JSGFuZGxlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgYW5kIEJGRF9SRUxPQ19QQ1JFTF9MTzE2LgotCSh0Y19nZW5fcmVsb2MpOiBDaGFuZ2UgI2Vycm9yIHRvIGFzX2ZhdGFsLiAgSGFuZGxlCi0JQkZEX1JFTE9DX1BDUkVMX0xPMTYgYW5kIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MuCi0KLVR1ZSBBcHIgMTIgMTg6MjU6MTMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfYmVnaW4pOiBDYWxsIG1lbXNldCB3aXRoIGFyZ3MgaW4gdGhlIGNvcnJlY3QKLQlvcmRlci4KLQkoc3Vic2VnX2dldCk6IENsZWFyIG5ld2x5IGFsbG9jYXRlZCBzZWdpbmZvLCBzZXQgaXRzIHBvaW50ZXIgc2xvdHMKLQl0byBOVUxMIGluc3RlYWQgb2YgMC4KLQotTW9uIEFwciAxMSAwOTowMDo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IEhhbmRsZSBjYXNlIHdoZXJlIGxhYmVsIHdhcwotCWRlZmluZWQgYWZ0ZXIgdGhlIC5wcm9jIGRpcmVjdGl2ZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IEdpdmUgYW4gZXJyb3IgaWYgd2UgZW5jb3VudGVyIGEKLQlwcm9jZW5kIGZvciBhIHByb2NlZHVyZSB3aXRob3V0IGEgbmFtZS4KLQotVGh1IEFwciAgNyAxNDoyODozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogUGFzcyBOVUxMIGZvciBleHByZXNzaW9uIGFyZ3VtZW50IHRvCi0JbWFjcm9fYnVpbGQgZm9yIG5vcmkgY2FzZS4KLQkoU1dJVENIX1RBQkxFKTogRGVmaW5lLgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBhIHJlbG9jYXRpb24gZm9yIGEgc3dpdGNoIHRhYmxlCi0JZW50cnkuCi0JKG1kX2FwcGx5X2ZpeCk6IFdyaXRlIHN3aXRjaCB0YWJsZSBlbnRyeSB2YWx1ZSBpbnRvIGZpbGUuCi0JKHRjX2dlbl9yZWxvYyk6IFVzZSBCRkRfUkVMT0NfR1BSRUwzMiBmb3IgYSBzd2l0Y2ggdGFibGUgZW50cnksCi0JYW5kIHNldCB0aGUgYWRkZW5kIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kCi0JdGhlIHN1YnRyYWhlbmQuCi0KLVRodSBBcHIgIDcgMTA6Mzg6MTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19zeW1ib2wpOiBEZWxldGUuICBObyBsb25nZXIgdXNlZC4KLQkoZWxmX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zLCBocHBhX3RjX3N5bWJvbCk6IERlbGV0ZSBleHRlcm4gZGVjbHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IERlbGV0ZSBmdW5jdGlvbi4KLQkoaHBwYV90Y19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IERlbGV0ZSBlbGZfdGNfc3ltYm9sIGFuZAotCWVsZl90Y19tYWtlX3NlY3Rpb25zIHN0dWZmLiAgSXQgd2FzIHRoZXJlIHRvIHN1cHBvcnQgUEEgYnJhaW5kYW1hZ2UKLQl3aGljaCBoYXMgYmVlbiBmaXhlZCwgYW5kIGluIHRoZSBjYXNlIG9mIGVsZl90Y19tYWtlX3NlY3Rpb25zIGlzCi0JcmVkdW5kYW50IHdpdGggZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcuCi0KLVdlZCBBcHIgIDYgMjA6NDg6MzAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qZWxmKik6IERvbid0IHJlcXVpcmUgIi1ocC0iIGZvciB0aGUKLQltYW51ZmFjdHVyZXIuCi0KLVR1ZSBBcHIgIDUgMTU6NDg6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRm9yIGNhc2UgJ28nLCB3aGVuIGdlbmVyYXRpbmcKLQllbWJlZGRlZCBQSUMgY29kZSwgYWNjZXB0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxvY2FsIHN5bWJvbHMKLQlhcyBiZWluZyBjb25zdGFudC4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogT25seSBmb3JjZSBhIHJlbG9jIHRvIGJlIGdlbmVyYXRlZCBmb3IgYQotCVBDIHJlbGF0aXZlIGZpeHVwLgotCShtZF9hcHBseV9maXgpOiBGb3IgQkZEX1JFTE9DXzMyIGFuZCBCRkRfUkVMT0NfTE8xNiwgcHV0IHRoZSBmaXh1cAotCXZhbHVlIGludG8gdGhlIGZpbGUgaWYgdGhlIGZpeHVwIHdpbGwgbm90IGdlbmVyYXRlIGEgcmVsb2MuCi0KLVR1ZSBBcHIgIDUgMTE6MTQ6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogSWYgc2VjdGlvbiBwYXNzZWQgaXNuJ3QgYnNzLAotCWRvbid0IHNwZXcgcmVtYWluZGVyIG9mIGlucHV0IGZpbGUgaW4gZXJyb3IgbWVzc2FnZS4KLQkodGNfZ2VuX3JlbG9jKTogSWYgYmZkX3JlbG9jX3R5cGVfbG9va3VwIHJldHVybnMgbnVsbCwgcHJpbnQgZXJyb3IKLQltZXNzYWdlIHdpdGggcmVsb2MgdHlwZSBhbmQgdHJ5IHRvIHByb2Nlc3MgcmVtYWluZGVyIG9mIGZpbGUuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvLWFzLCBpbnN0YWxsLWluZm8tZ2FzcCk6IE5ldwotCXRhcmdldHMsIG5vdyBleHBsaWNpdGx5IGNoZWNraW5nICQoc3JjZGlyKSBmb3IgaW5mbyBmaWxlcy4KLQkoaW5zdGFsbC1pbmZvKTogRGVwZW5kIG9uIGJvdGggb2YgdGhlbTsgZG8gbm90aGluZyBtb3JlLgotCi1Nb24gQXByICA0IDE3OjA2OjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCB0aGlua28gaW4gRUxGIHZlcnNpb24uCi0KLU1vbiBBcHIgIDQgMTI6Mzk6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19pbnNlcnRfb3BlcmFuZCk6IENoZWNrIFBQQ19PUEVSQU5EX1NJR05FRAotCWZsYWcgcmF0aGVyIHRoYW4gc2lnbmVkcCBmaWVsZC4gIE9ubHkgcGVybWl0IGV4dGVuZGVkIHJhbmdlIGlmCi0JUFBDX09QRVJBTkRfU0lHTk9QVCBmbGFnIGlzIHNldCBhbmQgYXNzZW1ibGluZyBpbiAzMiBiaXQgbW9kZS4KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIERhdmlkIEVkZWxzb2huIChlZGVsc29obkBucGFjLnN5ci5lZHUpLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19zaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHBjX2FyY2gpOiBDaGVjayBmb3IgUFBDX09QQ09ERV9QUEMgYmVmb3JlIFBQQ19PUENPREVfUE9XRVIuCi0JKG1kX2JlZ2luKTogSWYgYW4gaW5zdHJ1Y3Rpb24gaGFzIGEgc2l6ZSBzcGVjaWZpYyBmbGFnIHNldCwgb25seQotCWFkZCBpdCBpZiB3ZSBhcmUgYXNzZW1ibGluZyB0aGF0IHNpemUuCi0KLVRodSBNYXIgMzEgMTY6NTE6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogQWRkIGEgZ3J1ZXNvbWUgaGFjayB0byBnZXQKLQljcm9zcyBzZWN0aW9uIFBDIHJlbGF0aXZlIHJlbG9jcyByaWdodCBmb3IgQ09GRiBhbmQgRUxGLgotCi1Nb24gTWFyIDI4IDE0OjM4OjIzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogQWx3YXlzIGRlZmluZS4KLQkoT0JKX1BST0NFU1NfU1RBQik6IERvbid0IGRlZmluZS4KLQotTW9uIE1hciAyOCAxMjo0MDoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbHMpOiBEb24ndCBsZXQgQkZEIGNsb2JiZXIKLQl0aGUgdHlwZSBvZiBzeW1ib2wgc2V0IHN5bWJvbHMgd2hpY2ggaGFwcGVuIHRvIGJlIGluIHRoZSBhYnNvbHV0ZQotCW9yIHVuZGVmaW5lZCBzZWN0aW9uLgotCi1Nb24gTWFyIDI4IDEyOjM1OjAwIDE5OTQgIERhdmlkIEVkZWxzb2huICAoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KQotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCAtbXB3cnggKFBPV0VSLzIgYWthCi0JUklPUzIpLCAtbXB3ciAoUE9XRVIgYWthIFJJT1MxKSwgLW1wcGMgKFBvd2VyUEMgYWthIE1QQzYwMy82MDQpLAotCWFuZCAtbWFueSAoYWxsIGFyY2hpdGVjdHVyZXMpLgotCi1TdW4gTWFyIDI3IDE0OjA0OjE5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBTZXQgYWRkZW5kIGZvciByZWxvY2F0aW9uCi0JaW52b2x2aW5nIGEgZnVuY3Rpb24gc3ltYm9sIHdoaWNoIGlzIG5vdCBhIHBsYWJlbCB0byB6ZXJvLgotCShtZF9hcHBseV9maXgpOiBOZXZlciBwYXNzIGEgZnVuY3Rpb24gc3ltYm9sIHRvIGZpZWxkX2FkanVzdC4KLQotRnJpIE1hciAyNSAxNzozNTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IElmIE5fRVhUIGlzIHNldCBmb3IgYW4KLQlOX0lORFIgc3ltYm9sLCBzZXQgQlNGX0VYUE9SVCBhbmQgY2xlYXIgQlNGX0xPQ0FMLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IElmIEVNQkVEREVEX1BJQywgZG9uJ3Qgc3dhcCBhCi0JYnJhbmNoIHdpdGggYW4gaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzICRhdCwgaW4gY2FzZSB0aGUgYnJhbmNoIGlzCi0JbGF0ZXIgZXhwYW5kZWQuCi0JKG1hY3JvKTogSWYgRU1CRURERURfUElDLCBjYXNlIE1fSkFMX0EgbWF5IHVzZSAkYXQuCi0JKG1kX3BjcmVsX2Zyb20pOiBJZiBub3QgT0JKX0FPVVQsIHJldHVybiA0IGZvciBhbiB1bmRlZmluZWQgc3ltYm9sCi0JdG8gbWFrZSBpdCBwY3JlbF9vZmZzZXQuCi0JKHRjX2dlbl9yZWxvYyk6IElmIG5vdCBPQkpfQU9VVCwgc2V0IHRoZSByZWxvYyBhZGRlbmQgdG8KLQlyZWxvYy0+YWRkcmVzczsgYW5vdGhlciBncnVlc29tZSBoYWNrIHRvIGdldCBnYXMgcmVsb2MgaGFuZGxpbmcgdG8KLQlkbyB0aGUgcmlnaHQgdGhpbmcuCi0KLVRodSBNYXIgMjQgMjE6Mjk6MjkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogT25seSBzZXQgR1AgcHJvbG9nIHNpemUgaWYgdXNpbmcKLQlQViByZWdpc3Rlci4KLQkoVDEyKTogTmV3IG1hY3JvLgotCShlbWl0X2luc24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogQ2FsbCBpdC4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IEhhbmRsZSBCRkRfUkVMT0NfMjYsIGZvciBjYWxsX3BhbAotCWluc3RydWN0aW9ucy4KLQkobGl0dXNlX3BlbmRpbmcpOiBOZXcgdmFyaWFibGUuICBTZXQgYnkgYW55dGhpbmcgdGhhdCBnZW5lcmF0ZXMgYQotCUxJVEVSQUwgcmVsb2MsIGNsZWFyZWQgYnkgYW55dGhpbmcgdGhhdCBnZW5lcmF0ZXMgYSBMSVRVU0UgcmVsb2MsCi0JdGVzdGVkIGJ5IGNvZGUgdGhhdCBtaWdodCB3YW50IHRvIGVtaXQgYSBMSVRVU0UgcmVsb2MuCi0JKGVtaXRfdW5hbGlnbmVkX2lvKTogTmV3IGZ1bmN0aW9uLiAgQ3VycmVudGx5IGNhbGxzIG1kX2Fzc2VtYmxlLAotCWJ1dCBpdCBzaG91bGQgZXZlbnR1YWxseSBiZSBjb252ZXJ0ZWQgdG8gZ2VuZXJhdGUgdGhlIGluc24gaXRzZWxmCi0JYW5kIGNhbGwgZW1pdF9pbnNuIGRpcmVjdGx5LgotCShlbWl0X2xvYWRfdW5hbCwgZW1pdF9zdG9yZV91bmFsLCBlbWl0X2J5dGVfbWFuaXBfciwKLQllbWl0X2V4dHJhY3RfciwgZW1pdF9pbnNlcnRfciwgZW1pdF9tYXNrX3IsIGVtaXRfc2lnbl9leHRlbmQsCi0JZW1pdF9iaXNfcik6IExpa2V3aXNlLgotCShhbHBoYV9pcCwgY2FzZSAnSScpOiBIYW5kbGUgd2l0aCBCRkRfUkVMT0NfMjMuCi0JKGFscGhhX2lwLCBsYWJlbCBnZXRfbWFjcm8pOiBEb24ndCBlbWl0IHRoZSBmaW5hbCBpbnN0cnVjdGlvbiBpZgotCXRoZSBvcGNvZGUgaXMgemVyby4KLQkoYWxwaGFfaXAsIGNhc2UgJ0InLCBzdWJjYXNlICdkJyk6IE5ldyBjYXNlLCBmb3Igc3Vid29yZCBhbmQKLQl1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBtYWNyb3MuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfMjYuICBHZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGlmCi0JdGhlIHZhbHVlIGNhbid0IGJlIHJlc29sdmVkLgotCi1XZWQgTWFyIDIzIDE2OjA2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogRm9yIC1tZW1iZWRkZWQtcGljLCBmb3JjZQotCXRoZSAtRyB2YWx1ZSB0byAweDdmZmZmZmZmLiAgRm9yIFNWUjQgUElDIG9wdGlvbnMsIGRvbid0IGNhbGwKLQliZmRfc2V0X2dwX3NpemUgaGVyZSwgaXQncyBkb25lIGluIG1kX2JlZ2luLiAgRG9uJ3QgcGVybWl0IC1HIHdpdGgKLQktbWVtYmVkZGVkLXBpYy4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXgpOiBTZXQgZml4UC0+ZnhfZG9uZSBhcHByb3ByaWF0ZWx5LgotCShzX2NoYW5nZV9zZWMpOiBGb3IgRU1CRURERURfUElDLCBjaGFuZ2UgLmRhdGEgYW5kIC5yZGF0YSB0bwotCS5zZGF0YS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0JKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IERlY2xhcmUuCi0JKFRDX0hBTkRMRV9GWF9ET05FKTogRGVmaW5lLgotCi1UdWUgTWFyIDIyIDEzOjU4OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoZW51bSBtaXBzX3BpY19sZXZlbCk6IE5ldyBlbnVtLgotCShtaXBzX3BpYyk6IENoYW5nZSBmcm9tIGludCB0byBlbnVtIG1pcHNfcGljX2xldmVsLiAgQ2hhbmdlIGFsbAotCXVzZXMgKDAgYmVjb21lcyBOT19QSUMsIDIgYmVjb21lcyBTVlI0X1BJQykuCi0JKGxvYWRfYWRkcmVzcyk6IEhhbmRsZSBFTUJFRERFRF9QSUMuCi0JKG1hY3JvKTogSGFuZGxlIEVNQkVEREVEX1BJQyBpbiBhbGwgUElDIGNhc2VzLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgLW1lbWJlZGRlZC1waWMgdG8gdXNlIEVNQkVEREVEX1BJQy4gIElmCi0JT0JKX0VMRiwgYWNjZXB0IC1LUElDIGFuZCAtY2FsbF9zaGFyZWQgdG8gdXNlIFNWUjRfUElDIGFuZCBhY2NlcHQKLQktbm9uX3NoYXJlZCB0byB1c2UgTk9fUElDICh0aGlzIGlzIGhvdyB0aGUgSXJpeCA1IGFzc2VtYmxlcgotCXdvcmtzKS4gIERvIG5vdCBwZXJtaXQgLUcgd2l0aCBTVlI0X1BJQy4KLQkoc19hYmljYWxscyk6IFdhcm4gaWYgLUcgd2FzIHVzZWQsIGFuZCBmb3JjZSAtRyAwLgotCSh0Y19nZW5fcmVsb2MpOiBTZXQgcmVsb2MtPmFkZGVuZCB0byAwIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGZvcgotCWFueXRoaW5nIGJ1dCBhLm91dCwgbm90IGp1c3QgZm9yIEVMRi4gIEZvciBFQ09GRiwgZG9uJ3QgZ2VuZXJhdGUgYQotCUJGRF9SRUxPQ18xNl9QQ1JFTF9TMiByZWxvYyB1bmxlc3MgdXNpbmcgRU1CRURERURfUElDLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IERlZmluZSB0byBiZSAxLgotCi1TdW4gTWFyIDIwIDE2OjMxOjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3NwYWNlKTogVXNlIGludHMsIG5vdCBjaGFycyBhcwotCXBhcmFtZXRlcnMgdG8gYXZvaWQgbG9zaW5nIHdoZW4gY29tcGlsaW5nIHdpdGggSFAgQ0MuCi0JKGNyZWF0ZV9uZXdfc3Vic3BhY2UsIHVwZGF0ZV9zdWJzcGFjZSwgZml4X25ld19ocHBhKTogTGlrZXdpc2UuCi0KLVN1biBNYXIgMjAgMTQ6NDM6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IElmIGBkZWZzJyBpcyBkZWZpbmVkLCBlbWl0IGEKLQlwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIHRvIGNyZWF0ZSBhIG1hY3JvIG5hbWVkIGJ5IHRoaXMgdmFsdWUgaW50bwotCWNvbmZpZy5uZXc7IGRvbid0IGV4cGxpY2l0bHkgZ28gZm9yIEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBgZGVmcycsIG5vdCBgQkZEREVGJy4gIFNldCBpdCB0bwotCU1BTllfU0VHTUVOVFMgZm9yIGFueSBvYmotY29mZmJmZCB0YXJnZXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoQkZEX0hFQURFUlMsIEJGRCk6IERlZmluZS4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgQkZELCBNQU5ZX1NFR01FTlRTLAotCW9yIEJGRF9IRUFERVJTLgotCShMT0NBTF9MT0FETElCRVMpOiBEZWxldGVkLgotCSogY29uZmlnL202OGtjb2ZmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSB0aG9zZSBtYWNyb3MuCi0JKiBjb25maWcvbTg4a2NvZmYubXQgKFRERUZJTkVTKTogRGl0dG8uCi0JKiBjb25maWcvZWJtb24yOWsubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaDgzMDBoZHMubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaWM5NjBjb2ZmLm10OiBEZWxldGVkLgotCSogY29uZmlnL3NwYXJjLm10OiBEZWxldGVkLgotCSogY29uZmlnL2g4MzAwLm10IChMT0NBTF9MT0FETElCRVMsIFRERUZJTkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9oODUwMC5tdCAoTE9DQUxfTE9BRExJQkVTLCBUREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvc2gubXQgKExPQ0FMX0xPQURMSUJFUywgVERFRklORVMpOiBEZWxldGVkLgotCSogY29uZmlnL3o4ay5tdCAoTE9DQUxfTE9BRExJQkVTKTogRGVsZXRlZC4KLQkoVERFRklORVMpOiBEb24ndCBkZWZpbmUgdGhlIGNvZmZiZmQgbWFjcm9zLgotCi0JKiBNYWtlZmlsZS5pbjogSW5zZXJ0IG1ha2VmaWxlIGZyYWdtZW50cyBiZWZvcmUgT0JKUyBkZWZpbml0aW9uLgotCShPQkpTKTogQWRkICQoVEVfT0JKUykuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogU3VwcGx5ICJzZWN0aW9uIgotCXVuY29uZGl0aW9uYWxseS4KLQotCSogd3JpdGUuYyAoc2V0X3N5bXRhYik6IERlZmluZSBvbmx5IGlmIEJGRF9BU1NFTUJMRVIuCi0KLVN1biBNYXIgMjAgMTI6MDY6MDUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChTVEFHRVNUVUZGKTogQWRkIGdhc3AubmV3LgotCi1GcmkgTWFyIDE4IDIwOjA5OjE2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHN5bWJvbF90YWJsZV9mcm96ZW4pOiBOZXcgdmFyaWFibGUsIHRvIGJlIHNldCBhZnRlcgotCWJmZF9zZXRfc3ltdGFiIGlzIGNhbGxlZC4KLQkoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IE5vdGUgd2hldGhlciBhIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sCi0Jb3Igbm90LgotCShhZGp1c3RfcmVsb2Nfc3ltcyk6IEZvciBub3csIGFsd2F5cyBzdXBwbHkgYW4gYWJzb2x1dGUgc3ltYm9sIGZvcgotCWZpeHVwcyB3aXRob3V0IHN5bWJvbHMgYnV0IG5vdCB5ZXQgYGRvbmUnLiAgVXNlIHNlY3Rpb25fc3ltYm9sIHRvCi0JZ2V0IHRoZSBzeW1ib2wsIGluc3RlYWQgb2YgZ29pbmcgZGlyZWN0bHkgZm9yIGFic19zeW1ib2wuCi0JKHdyaXRlX3JlbG9jcykgW0RFQlVHNF06IEFib3J0IGlmIGFueSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgYQotCXJlbG9jIGlzIG5vdCBhIHNlY3Rpb24gc3ltYm9sIGFuZCBpcyBub3QgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQkoc2V0X3N5bXRhYik6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBmcm9tIHdyaXRlX29iamVjdF9maWxlLgotCUNvdW50cyBzeW1ib2wgdGFibGUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGFuIGVhcmxpZXIgY291bnQuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBzZXRfc3ltdGFiLCBidXQgZG8gaXQgYWZ0ZXIgcG90ZW50aWFsbHkKLQlpbnZva2luZyB0aGUgKl9mcm9iX2ZpbGUgbWFjcm9zLiAgRG9uJ3QgYm90aGVyIGNvdW50aW5nIHN5bWJvbHMuCi0JQ2FsbCBzeW1ib2xfcmVtb3ZlLCBpbnN0ZWFkIG9mIGV4cGFuZGluZyBpdCBpbiBwbGFjZS4gIE1vdmVkIHRoZQotCWNvbmRpdGlvbmFsaXplZCBgb2JqZWN0X2ZpbGVfc2l6ZScgZGVjbGFyYXRpb24gZG93biB0bwotCWNvbmRpdGlvbmFsaXplZCBibG9jayB3aGVyZSBpdCdzIHVzZWQuICBXaGVuIHVzaW5nIHRoZSBhYnNvbHV0ZQotCXN5bWJvbCBmb3IgYSBmaXh1cCB3aXRob3V0IGEgc3ltYm9sLCBzZXQgc3lfdXNlZF9pbl9yZWxvYy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBzZWN0aW9uX3N5bWJvbCB0byBnZXQKLQl0aGUgY29ycmVjdCBzeW1ib2wgZm9yIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogVXNlIHN5bWJvbF9uZXcgaW5zdGVhZCBvZgotCXN5bWJvbF9tYWtlLCBzaW5jZSB3ZSBtYXkgd2FudCBpdCB0byBnbyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCi0JTWFrZSB0aGUgbmV3IHN5bWJvbCBoYXZlIGludGVybmFsIGxpbmthZ2UuICBJZgotCW9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyBzYXlzIGl0J3Mgb2theSwgdXNlIHRoZSBCRkQgc2VjdGlvbgotCXN5bWJvbCB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIEdBUyBzeW1ib2wuCi0JKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IERlZmF1bHQgdG8gYWx3YXlzIHJldHVybmluZyAwLgotCSogY29uZmlnL29iai1hb3V0LmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYykgW0JGRF9BU1NFTUJMRVJdOgotCU5ldyBtYWNyby4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL3RjLXNwYXJjLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShpbl9zaWduZWRfcmFuZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogVXNlIGl0LgotCShzcGFyY19pcCwgY2FzZSAnaScpOiBVc2UgQkZEX1JFTE9DX1NQQVJDMTMsIG5vdCBfQkFTRTEzLgotCShzcGFyY19pcCwgbGFiZWwgImltbWVkaWF0ZSIpOiBSZWplY3QgY29uc3RhbnRzIGZvciBwY3JlbAotCWluc3RydWN0aW9ucyBvbmx5IGlmIHRoZSByZWxvY2F0aW9uIHR5cGUgaW5kaWNhdGVzIGEgImNhbGwiCi0JaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvZmZzZXQgaXMgd2l0aGluIHJhbmdlIG9mIGEgImptcGwgJWcwIi4gIElmCi0JaXQncyBub3QgaW4gcmFuZ2UsIHVzZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wgcGx1cyBhbiBvZmZzZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBpbl9zaWduZWRfcmFuZ2UuICBDb21iaW5lZCBfU1BBUkMxMyBhbmQKLQlfQkFTRTEzIGNhc2VzLgotCSh0Y19nZW5fcmVsb2MpOiBQZXJtaXQgQkZEX1JFTE9DX1NQQVJDMTMuCi0KLQkqIGNvbmZpZy9pYzk2MGNvZmYubXQgKFRERUZJTkVTKTogRml4ZWQgdHlwbyAoTUFOWV9TRUNUSU9OUywgbm90Ci0JTUFOWV9TRUdNRU5UUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRWxpbWluYXRlZCBhbGwgdGFyZ2V0cyB1c2luZyBvYmotY29mZiBidXQgbm90Ci0JZGVmaW5pbmcgQkZEX0FTU0VNQkxFUjsgSSB0aGluayBhbGwgc3VjaCB0YXJnZXRzIHRoYXQgYXJlCi0Jc3VwcG9ydGVkIHdpbGwgYmUgbWF0Y2hlZCBieSByZWFsIENQVS1PUyBjb21iaW5hdGlvbnMgZWFybGllciBpbgotCXRoZSBjYXNlIHN0YXRlbWVudC4KLQkodGFyZ2V0cyAqLSotY29mZiosICotc3lzdiosICotKi1zY28qLCAqLSotc3lzdjMyKTogRGVsZXRlZC4gIE1hZGUKLQlzb21lIGNvbW1lbnRzIGFib3V0IHRoZSBkcHgyIGNvbmZpZ3VyYXRpb24sIGJ1dCBsZWZ0IGl0IGRpc2FibGVkLAotCXNpbmNlIGl0IGNvdWxkbid0IGJlIHJlYWNoZWQgYmVmb3JlLgotCSh0YXJnZXQgYTI5ay1hbWQtZWJtb25vbGQpOiBEZWxldGVkLgotCi1UaHUgTWFyIDE3IDEzOjM2OjA5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pbXBvcnQpOiBDb3JyZWN0bHkgaGFuZGxlIGltcG9ydGluZyBvZiBhbgotCWFscmVhZHkgZGVmaW5lZCBzeW1ib2wuCi0KLVdlZCBNYXIgMTYgMTc6MTE6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogT25seSBhY2NlcHQgb3Zlcmx5IGxhcmdlIHZhbHVlcyBmb3IKLQl0aGUgJ2onIG9wZXJhbmQgaWYgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgYWx0ZXJuYXRpdmVzIGZvciB0aGlzCi0JaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChhZGp1c3Rfc3RhYl9zZWN0aW9uKTogSW5pdGlhbGl6ZQotCXN0YWJzdHJzZWcgdG8gU0VHX1VOS05PV04sIG5vdCAtMS4gIEFmdGVyIGxvb3AsIGNoZWNrIHdoZXRoZXIgaXQKLQlpcyBub3QgU0VHX1VOS05PV04gcmF0aGVyIHRoYW4gY2hlY2tpbmcgd2hldGhlciBpdCBpcyA+PSAwLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2FsaWduKTogVGFrZSBuZXcgYXJndW1lbnQsIGxhYmVsLCBhbmQgdXNlCi0JaXQgaW5zdGVhZCBvZiBnbG9iYWwgaW5zbl9sYWJlbC4KLQkoc19hbGlnbiwgc19jb25zLCBzX2Zsb2F0X2NvbnMsIHNfZ3B3b3JkKTogU2F2ZSBpbnNuX2xhYmVsIGJlZm9yZQotCWNhbGwgdG8gbWlwc19lbWl0X2RlbGF5IGFuZCBwYXNzIGl0IHRvIG1pcHNfYWxpZ24uCi0KLVdlZCBNYXIgMTYgMTE6NTQ6MTIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2VxdSk6IEhhbmRsZSBib3RoIC5yZWcgYW5kIC5lcXUgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jYWxsaW5mbyk6IEFjY2VwdCAibWlsbGljb2RlIiBhcyBhbgotCWFyZ3VtZW50IHRvIGEgLmNhbGxpbmZvIGRpcmVjdGl2ZS4gIERvbid0IGxvb3AgZm9yZXZlciBvbiBlcnJvcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2VxdSk6IFVzZSBwYV9wYXJzZV9udW1iZXIgc28gdGhhdCB3ZSBjYW4KLQl1c2UgcHJlLWRlZmluZWQgcmVnaXN0ZXJzIGFzIGFyZ3VtZW50cy4KLQotTW9uIE1hciAxNCAxNDoyOTo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENoZWNrIGJvdGggU19JU19MT0NBTCBhbmQKLQlTX0lTX0VYVEVSTkFMIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBkaXNjYXJkIGEgc3ltYm9sLgotCi0JKiBjb25maWctZ2FzLmNvbTogU2NhbiBNYWtlZmlsZS5pbiwgbm90IHZlcnNpb24uYywgZm9yIGN1cnJlbnQKLQl2ZXJzaW9uIG51bWJlci4gIERlbGV0ZSBhbGwgdmVyc2lvbnMgb2YgdGVtcCBmaWxlcyB3aGVuIGZpbmlzaGVkCi0Jd2l0aCB0aGVtLiAgQ3JlYXRlIGNvbmZpZy5oLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplKTogQ2FjaGUgc3ltYm9sCi0JdmFsdWVzIHRvIHJlZHVjZSBudW1iZXIgb2YgbG9va3VwcyB3aXRoIFNfR0VUX1ZBTFVFLiAgU2tpcCBkZWJ1ZwotCXN5bWJvbHMgdG8gYXZvaWQgImEgcmVhbGx5IG5hc3R5IGJ1ZyIuICAoRnJvbSBIb2xnZXIgVGV1dHNjaCwKLQlob2xnZXJAYm90YnNvLnJoZWluLW1haW4uZGUuKQotCShWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBGb3IgIl9fdnQuKiIgc3ltYm9scywgc2V0IFNfR0VUX09USEVSCi0JZmllbGQuICAoQWxzbyBmcm9tIEhvbGdlciBUZXV0c2NoLikgIFdhdGNoIGZvciBhIHdvdWxkLWJlIHJlZ2lzdGVyCi0JbWFzayB0aGF0IHNwYW5zIGZyYWdzLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfbGluZSk6IFNldCBzeW1ib2wgbG5ubyBmaWVsZCB3aXRoCi0JdGhpc19iYXNlLCBub3QgbGluZV9iYXNlLiAgKFBhdGNoIGZyb20gQW5kcmVhcyBBcmVucywKLQlhcmlAb2JlbGl4LmF2LnJ3dGgtYWFjaGVuLmRlLikKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBSZXRhaW4gc3ltYm9scyB0aGF0Ci0JbG9vayBsb2NhbCBpZiB0aGV5J3JlIGV4cG9ydGVkIG9yIHVuZGVmaW5lZC4gIFVzZWQgdG8gYmUgZG9uZSBmb3IKLQlpOTYwIG9ubHkuCi0KLQkqIHJlYWQuYyAoc19sY29tbSwgc19jb21tKTogUHJpbnQgc3ltYm9sIG5hbWUgYmVpbmcgcmVkZWZpbmVkLgotCUdldCBpdCBmcm9tIHRoZSBsb29rZWQtdXAgc3ltYm9sLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBzdHJpbmcgZnJvbQotCXRoZSBpbnB1dCBzdHJlYW0sIHdoaWNoIGlzIG5vIGxvbmdlciBudWxsLXRlcm1pbmF0ZWQuCi0JKExFWF9QQ1QpOiBOZXcgbWFjcm8sIGRlZmF1bHRzIHRvIDAuCi0JKGxleF90eXBlKTogVXNlIGl0IGZvciBgJScuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIGAtaCMnIG9wdGlvbiBmb3IgVk1TLgotCSh2aXBfb3ApOiBOb3cgc3RhdGljLCBhbmQgcmV0dXJucyB2b2lkLiAgQ2FsbGVycyBjaGFuZ2VkLiAgQWRkZWQKLQlmb3J3YXJkIGRlY2wuCi0JKHZpcCk6IERpdHRvLiAgQ2FsbCBhc19mYXRhbCBkaXJlY3RseSBpZiBhIHByb2dyYW0gYnVnIGlzCi0JZGV0ZWN0ZWQuCi0JKG9wX2hhc2gpOiBMZXQgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBzdWZmaWNlLgotCi0JKiBNYWtlZmlsZS5pbiAobGl0ZXJhbC5vKTogUHJvdmlkZSBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IG5ldyBtYWtlZmlsZSB2YXJpYWJsZSBPUENPREVTX0xJQi4KLQkqIE1ha2VmaWxlLmluIChMSUJTKTogVXNlIGl0LgotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nYXMuY29tLCBzdGFtcC1tay5jb20pOiBOZXcgdGFyZ2V0cy4KLQkqIHZtc2NvbmYuc2g6IE5ldyBmaWxlLgotCSogbWFrZS1nYXMuY29tOiBSZWdlbmVyYXRlZCBmcm9tIG5ldyBzY3JpcHQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbHlueG9zKik6IEhhbmRsZSBhbnkgdmVyc2lvbiBudW1iZXIKLQlzdWZmaXggYWZ0ZXIgImx5bnhvcyIuICBTZXQgZW11bGF0aW9uIHRvIGx5bnguCi0KLU1vbiBNYXIgMTQgMTE6MzA6NDkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCi1GcmkgTWFyIDExIDIyOjI1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wY3JlbF9mcm9tKTogUmV0dXJuIDAgZm9yIHVuZGVmaW5lZCBFTEYKLQlzeW1ib2xzLgotCShwcGNfaXNfdG9jX3N5bSk6IENoYW5nZSAudG9jIHRvIC5nb3QuCi0JKG1kX2FwcGx5X2ZpeCk6IENoYW5nZSBoYW5kbGluZyBvZiBFTEYgcmVsb2NzLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotRnJpIE1hciAxMSAxNzo0MjoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDbG9zZV9WTVNfT2JqZWN0X0ZpbGUpOiBBZGQgY29tbWVudCBwb2ludGluZwotCW91dCBzb21lIGNvZGUgdGhhdCBkb2Vzbid0IGJlbG9uZyBpbiB0aGlzIGZpbGUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmg6IEluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgotCShOX0dTWU0sIC4uLiwgTl9MRU5HKTogRGVsZXRlZC4KLQkoTk9fUkVMT0MpOiBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcgYXMgcGFydCBvZiBlbnVtIHJlbG9jX3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgY29tbWVudCBxdWVzdGlvbmluZyBuZWVkIGZvciBhbGwgdGhlCi0JY2hhcmFjdGVycyBpbiBGTFRfQ0hBUlMuCi0KLQkqIGFzLmMgKG1haW4pIFtPQkpfVk1TXTogRG9uJ3QgY2FsbCBvdXRwdXRfZmlsZV9jbG9zZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBTZXQgc3RyaWN0IG9yZGVyIGZvcgotCXNlY3Rpb25zIHdpdGggcmVjb2duaXplZCBuYW1lcywgYmVmb3JlIGNvbXB1dGluZyBWTUEgdmFsdWVzLgotCi1GcmkgTWFyIDExIDE3OjU2OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEFjY2VwdCBudW1iZXJzIGJldHdlZW4gMHg4MDAwIGFuZAotCTB4ZmZmZiBmb3IgJ2onIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBNSVBTIGFzc2VtYmxlci4gIFRoZXNlCi0JbnVtYmVycyBhcmUgYWN0dWFsbHkgdHJlYXRlZCBhcyBuZWdhdGl2ZS4KLQotVGh1IE1hciAxMCAxMzozNjoyOSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpOiBMb2NhbCBsYWJlbHMgYXJlIC5MZm9vLgotCi1UdWUgTWFyICA4IDIxOjE3OjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBNaW5vciBmb3JtYXR0aW5nL3N0eWxpc3RpYyBjaGFuZ2VzLCBwbHVzOgotCShvYmpfY29mZl9zZWN0aW9uKTogRGVjbGFyZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IE1ha2UgaXQgYXZhaWxhYmxlIG9ubHkgaWYgTUFOWV9TRUNUSU9OUy4KLQkob2JqX3N5bWJvbF90b19jaGFycykgW0NST1NTX0NPTVBJTEVdOiBTb21lIGF0dGVtcHMgdG8gbWFrZSB0aGlzCi0Jd29yay4gIEl0IHN0aWxsIGRvZXNuJ3QuICBJdCBub3cgZmFpbHMgdG8gY29tcGlsZSwgaW5zdGVhZCBvZgotCXNpbGVudGx5IGNvbXBpbGluZyB0byBkbyBub3RoaW5nLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZpbmUgb25seSBpZgotCU1BTllfU0VDVElPTlMuCi0JKE9CSl9QUk9DRVNTX1NUQUIpIFshIE1BTllfU0VDVElPTlNdOiBOZXcgbWFjcm8sIGp1c3QgZW1pdHMKLQl3YXJuaW5nLgotCi0JSGFuZGxlIEFscGhhIGxvYWQtaW1tZWRpYXRlLUZQIHBzZXVkby1pbnN0cnVjdGlvbnM6Ci0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGxkaWYsIGxkaWcsIGxkaXMsIGxkaXQpOiBOZXcgcGF0dGVybnMuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobGl0OF9zZWMsIGxpdDRfc2VjLCBsaXQ4X3N5bSwgbGl0NF9zeW0pOiBOZXcKLQl2YXJpYWJsZXMuCi0JKGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGNyZWF0ZV9saXRhX3NlY3Rpb24pOiBOb3cgYSBtYWNyby4KLQkoZ2V0X2xpdDhfb2Zmc2V0LCBnZXRfbGl0NF9vZmZzZXQpOiBOZXcgZnVuY3Rpb25zLgotCShtYXliZV9zZXRfZ3ApOiBOZXcgZnVuY3Rpb24uCi0JKHNlbGVjdF9ncF92YWx1ZSk6IENhbGwgaXQuCi0JKGxvYWRfZXhwcmVzc2lvbik6IFByZXNlcnZlIGFkZGVuZCBpZiBzeW1ib2wgaXMgYSBzZWN0aW9uIHN5bWJvbC4KLQkoYWxwaGFfaXApOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSBgRicgZm9yIGZsb2F0aW5nLXBvaW50Ci0JY29uc3RhbnRzOyBzdG9yZSB0aGVtIGluIC5saXR7NCw4fSBzZWN0aW9ucy4KLQkoYWxwaGFfaXAsIGNhc2UgJ0cnKTogRW1pdCBMSVRVU0UgcmVsb2NhdGlvbnMgZm9yIHN5bWJvbCBleHBycy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc21hbGxlc3RfaW1tX3R5cGUpOiBOZXZlciByZXR1cm4gSW1tMS4KLQotVHVlIE1hciAgOCAxNDoxODoxNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod19zdHJpbmdzKTogT25seSBjb3B5IHN0cmluZ3Mgb3V0IGlmCi0JdGhlaXIgc3ltYm9scyBhcmUgZ29pbmcgdG8gYmUgd3JpdHRlbi4KLQotVHVlIE1hciAgOCAxMTo0OToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IERlY2xhcmUgYXJndW1lbnRzIGNvbnN0LgotCSogYXMuaCAoYXNfcGVycm9yKTogQ2hhbmdlIGRlY2xhcmF0aW9uLgotCi1Nb24gTWFyICA3IDE2OjA4OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogV2hlbiBjYWxsaW5nIGZyYWdfZ3JvdywgYWxsb3cKLQlmb3IgdGhlICh1cCB0bykgdHdvIG5vcHMgd2hpY2ggbWF5IGJlIGluc2VydGVkIGJ5IGFwcGVuZF9pbnNuIGlmCi0JbWlwc19vcHRpbWl6ZSBpcyAwLgotCShtYWNybyk6IExpa2V3aXNlLgotCi1UaHUgTWFyICAzIDExOjM3OjU1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAobWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlcik6Ci0JQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZyBmcm9tIGdjYy4KLQotV2VkIE1hciAgMiAxMDozMTowMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQWRkIGEgZmV3IGNhc3RzIHRvIG1ha2UgSFAgQyBjb21waWxlciBoYXBweS4KLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uLCBvYmpfc29tX2NvcHlyaWdodCk6IEJlCi0JcHJlcGFyZWQKLQl0byBoYW5kbGUgYW4gZXJyb3IgZnJvbSBiZmRfc29tX2F0dGFjaF9hdXhfaGRyLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBXcmFwIEVMRiBzcGVjaWZpYyBkZWNscyBpbnNpZGUgYW4gaWZkZWYuCi0KLU1vbiBGZWIgMjggMTU6MDM6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2F0b2YpOiBPbWl0IHdhcm5pbmcgYWJvdXQgRlAgdmFsdWVzLgotCShsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgISB0byBsaXN0LgotCShtZF9hcHBseV9maXgpOiBEbyBwcm9jZXNzIDMyLSBhbmQgNjQtYml0IHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfbGNvbW0pOiBQdXQgIiNpZiAwIiBhcm91bmQgdGhlCi0JdW51c2VkIHBhcnRzIChtb3N0IG9mIHRoZSBmdW5jdGlvbikuCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogQ2FzdCBhbGxvY2EgcmVzdWx0LgotCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi1jb2ZmLCBpOTYwLSotdnh3b3JrczUuKik6IFVzZSBjb2ZmYmZkLCBhbmQKLQlnYXNfdGFyZ2V0IGljOTYwY29mZi4KLQkqIGNvbmZpZy9pYzk2MGNvZmYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggW1RDX0k5NjBdOiBJbmNsdWRlIGNvZmYvaTk2MC5oLgotCShUQVJHRVRfRk9STUFUKSBbVENfSTk2MF06IFVzZSBjb2ZmLUludGVsLWxpdHRsZS4KLQkqIGNvbmZpZy90ZS1pYzk2MC5oIChDUk9TU19DT01QSUxFKTogRG9uJ3QgdW5kZWYgdGhpcy4gIFdlJ2xsCi0JYWx3YXlzIGJ1aWxkIGxpdHRsZS1lbmRpYW4gb2JqZWN0IGZpbGVzLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcmVsb2Nfc2l6ZSk6IERvbid0IGRlZmluZSBhdCBhbGwgaWYgQkZEIG9yCi0JQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLgotCShtZW1fZm10KTogU2luY2UgQ09GRiBkb2Vzbid0IGhhbmRsZSBjYWxseCByZWxvY2F0aW9ucyB5ZXQsIHRyZWF0Ci0JdGhlbSBsaWtlIG5vcm1hbCAzMi1iaXQgcmVsb2NhdGlvbnMuCi0JKG1kX2FwcGx5X2ZpeCk6IEZvciBjYWxseCByZWxvY2F0aW9ucywgc3RvcmUgemVyby4KLQkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBTdG9yZSBzeW1ib2wgaW5kZXggZm9yIGFsbCBjYWxseAotCXJlbG9jYXRpb25zLCByZWdhcmRsZXNzIG9mIGxpbmstcmVsYXggc2V0dGluZy4KLQkodGNfY29mZl9maXgycnR5cGUsIHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb25zLgotCShpOTYwX2hhbmRsZV9hbGlnbikgWyEgT0JKX0JPVVRdOiBJZiBsaW5rLXJlbGF4IG9wdGlvbiBpcwotCXNlbGVjdGVkLCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBjbGVhciBpdC4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKEJGRF9BUkNILCBDT0ZGX0ZMQUdTLCBDT0ZGX01BR0lDLAotCVRDX0NPVU5UX1JFTE9DLCBUQ19DT0ZGX0ZJWDJSVFlQRSwgVENfQ09GRl9TSVpFTUFDSERFUCwKLQl0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBtYWNyb3MuCi0JKHRjX2NvZmZfZml4MnJ0eXBlLCB0Y19jb2ZmX3NpemVtYWNoZGVwKTogRGVjbGFyZS4KLQotRnJpIEZlYiAyNSAyMDo1Njo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19zeW1ib2wpOiBDYWxsIFBBIEVMRiBCRkQgdmVyc2lvbi4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKHBhX2J1aWxkX3N5bWV4dG5fc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKGhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocGFfZXhwb3J0KTogRGVsZXRlIGNhbGwgdG8gcGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChocHBhX3RjX3N5bWJvbCk6IEFkZCBleHRlcm4gZGVjbC4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IERlbGV0ZSBleHRlcm4gZGVjbC4KLQkoaHBwYV90Y19zeW1ib2wpOiBEZWxldGUgZXh0ZXJuIGRlY2wuCi0KLUZyaSBGZWIgMjUgMTM6MTU6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogQ29ycmVjdCB0ZXN0IGZvciB3aGV0aGVyIHRvCi0JZmlsbCBhIHNlY3Rpb24gKGZyb20gTWluaCBUcmFuLUxlIDxUUkFOTEVAaW50ZWxsaWNvcnAuY29tPikuCi0KLVRodSBGZWIgMjQgMTE6MzA6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCByZXF1aXJlIHZlcnNpb24gbnVtYmVyIGZvciBpMzg2LSotbWFjaC4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkZWQgIi50aGlzX0dDQ19yZXF1aXJlc190aGVfR05VX2Fzc2VtYmxlciIsCi0Jd2hpY2ggaXMgaWdub3JlZCBieSBnYXMsIGJ1dCB3aWxsIGNhdXNlIG90aGVyIGFzc2VtYmxlcnMgdG8gY2hva2UuCi0JSW50ZW5kZWQgZm9yIHVzZSBieSBnY2MgcG9ydHMgdGhhdCByZXF1aXJlIGdhcyBpbnN0ZWFkIG9mIG5hdGl2ZQotCWFzc2VtYmxlcnMuCi0KLVRodSBGZWIgMjQgMDc6MTA6MzEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9oby1ocHBhb3NmLmg6IEZpeCBicmFpbm8gaW4gdGVzdCBmb3IgQU5TSS1DLgotCi1XZWQgRmViIDIzIDE2OjUxOjQzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IEdpdmUgdGhlIHVzZXIgYSByZWFzb25hYmxlIGVycm9yCi0JbWVzc2FnZSByYXRoZXIgdGhhbiAiYXNzZXJ0aW9uIGZhaWxlZCIgaWYgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0JZmFpbHMuCi0KLVR1ZSBGZWIgMjIgMTA6MDc6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tbWFjaDMuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgMjEgMTE6NDE6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9kZWJ1Zyk6IERvbid0IHNldCBoZHItPm1hZ2ljIGhlcmUuICBJdCBpcwotCW5vdyBzZXQgaW4gYmZkL2Vjb2ZmbGluay5jOmVjb2ZmX3dyaXRlX3N5bWhkci4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHdyaXRlX29iamVjdF9maWxlKTogdXNlIGJmZF9nZXRfZXJyb3IgKCksCi0Jbm90IGJmZF9lcnJvci4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChzX2xjb21tKTogVXNlIGFuIGFsaWdubWVudCBwb3dlciBvZiAzIGZvciA4IGJ5dGUgLmxjb21tCi0JdmFyaWFibGVzLgotCi0JKiBjb25maWcvaG8taHB1eC5oIChCUk9LRU5fQVNTRVJUKTogRGVmaW5lIGlmIG5vdCBfX0dOVUNfXy4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBVc2UgY29ycmVjdCBhcmd1bWVudHMgdG8gbWVtY3B5Ci0JKGJyb2tlbiAxOSBKdWwgMTk5MykuICBGcm9tIGtqZEBwZXNjYWRlcm8uc3RhbmZvcmQuZWR1IChLZW5uZXRoCi0JRHVkYSkuCi0KLVN1biBGZWIgMjAgMTg6MDE6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfY29mZl9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogRm9yICJzZWN0aW9uIiwgdXNlCi0Jb2JqX2NvZmZfc2VjdGlvbi4KLQkob2JqX2NvZmZfc2VjdGlvbik6IFJld3JpdGUuCi0KLUZyaSBGZWIgMTggMTQ6MTY6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbWFjaDMqKTogTmV3IHRhcmdldDsgdXNlcyBCRkQuCi0JKiBjb25maWcvdGUtbWFjaC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWFvdXQuaCAob2JqX2FvdXRfZnJvYl9maWxlKTogRGVjbGFyZSBpdC4KLQkoZnJvYl9maWxlKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4XzEpIFtURV9NYWNoXTogRG9uJ3QgYWRqdXN0Ci0JcGNyZWwzMiByZWxvY2F0aW9ucy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRBUkdFVF9GT1JNQVQpIFtURV9NYWNoXTogVXNlIGEub3V0LW1hY2gzLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFJlbW92ZWQgcmVnaXN0ZXIgZGVjbGFyYXRpb25zLgotCi1UaHUgRmViIDE3IDE2OjI1OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVNvbWUgc3VwcG9ydCBmb3IgUG93ZXJQQyBFTEYuCi0JKiBjb25maWd1cmUuaW46IElmIGNwdSBpcyBwb3dlcnBjKiwgdXNlIHBwYy4KLQkocHBjLSotc3lzdjQqKTogVXNlIG9iamVjdCBmb3JtYXQgZWxmLgotCSogY29uZmlnL3RjLXBwYy5oOiBPbmx5IGRlY2xhcmUgYSBudW1iZXIgb2YgdGhpbmdzIGlmIE9CSl9DT0ZGIGlzCi0JZGVmaW5lZC4KLQkoVEFSR0VUX0FSQ0gpOiBNYWtlIGl0IGNhbGwgcHBjX2FyY2guCi0JKHBwY19hcmNoKTogRGVjbGFyZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IFNldCBiYXNlZCBvbiBPQkpfQ09GRiBvciBPQkpfRUxGLgotCShOT19TVFJJTkdfRVNDQVBFUyk6IERlZmluZS4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSBmb3IgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1wcGMuYzogT25seSBkZWZpbmUgYSBudW1iZXIgb2YgZnVuY3Rpb25zIG9mIE9CSl9DT0ZGCi0JaXMgZGVmaW5lZC4KLQkobWRfcHNldWRvX3RhYmxlKTogTW9zdCBwc2V1ZG8tb3BzIGFyZSBPQkpfQ09GRiBzcGVjaWZpYy4gIEFkZGVkCi0JT0JKX0NPRkYgc3BlY2lmaWMgImJpIiBhbmQgImVpIi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRml4IGhhbmRsaW5nIG9mIC11LiAgTWFrZSAtbTYwMSBzZXQKLQlQUENfT1BDT0RFXzYwMS4gIElmIE9CSl9FTEYsIGFjY2VwdCAtViBhbmQgLVEuCi0JKHBwY19zZXRfY3B1KTogTmV3IGZ1bmN0aW9uLgotCShwcGNfYXJjaCk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYmVnaW4pOiBDYWxsIHBwY19zZXRfY3B1LgotCShwcGNfaW5zZXJ0X29wZXJhbmQpOiBGb3IgYSBzaWduZWQgb3BlcmFuZCBhY2NlcHQgYW4gdW5zaWduZWQKLQl2YWx1ZSwgZm9yIElCTSBjb21wYXRpYmlsaXR5LgotCShwcGNfYnl0ZSk6IERvbid0IGNhbGwgc3RyaW5nZXIgZm9yIHN0cmluZ3M7IGluc3RlYWQsIHRyZWF0IHR3bwotCWRvdWJsZSBxdW90ZXMgYXMgYSBzaW5nbGUgZG91YmxlIHF1b3RlLgotCShwcGNfY29tbSk6IFNldCBzeV90Yy5vdXRwdXQgZm9yIGEgLmxjb21tIHN5bWJvbC4KLQkocHBjX2JpZWkpOiBOZXcgZnVuY3Rpb24uCi0JKHBwY190Yyk6IElmIG5vdCBPQkpfQ09GRiwgaWdub3JlIGZpcnN0IGFyZ3VtZW50LgotCShwcGNfZml4X2FkanVzdGFibGUpOiBDYWxsIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KLQkocHBjX2lzX3RvY19zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBwcGNfaXNfdG9jX3N5bS4gIEhhbmRsZSBCRkRfUkVMT0NfMTYgYW5kCi0JQkZEX1JFTE9DXzguCi0KLVRodSBGZWIgMTcgMDk6Mjk6MzcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc19wZXJyb3IpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9nZXRfZXJyb3IgYW5kCi0JYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgotCi1UdWUgRmViIDE1IDIwOjIzOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBpOTYwLXZ4d29ya3MgdmVyc2lvbnMgPiA1LjAgYXMgY29mZi4KLQlEZWZhdWx0IGlzIHN0aWxsIGJvdXQgaWYgbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWQuCi0KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBVc2Ugc3dpdGNoIGFuZCBzdHJjYXNlY21wIGluc3RlYWQKLQlvZiBsYXJnZSBudW1iZXIgb2YgY29tcGFyZXMgd2hlbiBsb29raW5nIGZvciBpbmYvbmFuIHZhbHVlcy4KLQotRnJpIEZlYiAxMSAxMzoxMzoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRG8gdW5hbGlnbmVkIGxvYWRzIGFuZCBzdG9yZXMKLQljb3JyZWN0bHkgd2hlbiBiaWcgZW5kaWFuLCBhbmQgZ2l2ZSBlcnJvcnMgb24gb3ZlcmZsb3cgcmF0aGVyIHRoYW4KLQlnZW5lcmF0aW5nIGluY29ycmVjdCBjb2RlLgotCi1UaHUgRmViIDEwIDExOjI0OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotCSogcmVhZC5jIChkb19hbGlnbik6IERvbid0IGRlZmluZSBsYWJlbCBqdXN0X3JlY29yZF9hbGlnbm1lbnQKLQl1bmxlc3MgaXQgbWlnaHQgYmUgdXNlZC4KLQotCSogYXMuYyAobWFpbik6IElmIG1kX3BhcnNlX2xvbmdfb3B0aW9uIGlzIGRlZmluZWQsIGNhbGwgaXQgd2l0aCBhCi0JbG9uZyBvcHRpb24uCi0JKiBjb25maWcvdGMtbWlwcy5oIChtZF9wYXJzZV9sb25nX29wdGlvbik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfdHJhcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogUmVwb3J0IGFuIGVycm9yIGlmIG1pcHNfdHJhcCBpcyBzZXQgYXQgSVNBIGxldmVsIDEuCi0JKG1hY3JvKTogSWYgbWlwc190cmFwLCB1c2UgdHJhcCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZiBicmVhawotCWluc3RydWN0aW9ucyBmb3Igb3ZlcmZsb3cgYW5kIGRpdmlkZSBieSB6ZXJvIGRldGVjdGlvbi4KLQkobWlwc19wYXJzZV9sb25nX29wdGlvbik6IE5ldyBmdW5jdGlvbi4gIFN1cHBvcnQgLS10cmFwLAotCS0tbm8tYnJlYWssIC0tYnJlYWsgYW5kIC0tbm8tdHJhcC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJ6ZXJvIi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IFJlbW92ZSAiemVybyIuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxMCAwMToyNDoyNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZWplY3QgaW50ZWdlciB2YWx1ZXMgZm9yCi0JcGMtcmVsYXRpdmUgb3BlcmFuZCBmaWVsZHMuICBUaGlzIGZvcmNlcyAiY2FsbCAwIiB0byBiZWNvbWUgImptcGwKLQklZzAsJW83IiB3aXRoIG5vIHJlbG9jYXRpb25zIG5lZWRlZC4KLQotV2VkIEZlYiAgOSAxMzowODozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFzLmggKHhtYWxsb2MsIHhyZWFsbG9jKTogRGVjbGFyZSB1c2luZyBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IFVzZSBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSWYgTk9fU1RSSU5HX0VTQ0FQRVMgaXMgZGVmaW5lZCwKLQlkb24ndCB0cmVhdCBiYWNrc2xhc2ggc3BlY2lhbGx5IGluc2lkZSBzdHJpbmdzLgotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDkgMDk6NDI6NDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgbWVtc2V0Ci0JaW5zdGVhZCBvZiBtZW1jcHkgdG8gemVybyB0aGUgaW5pdGlhbCBzdGFiIHN5bWJvbCwgZHVoLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCi1UdWUgRmViICA4IDE3OjI1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ2FsbCBtZW1zZXQgd2l0aCB0aGUgYXJndW1lbnRzIGluCi0JdGhlIHJpZ2h0IG9yZGVyLiAgRXhwbGljaXRseSBjbGVhciBmaXhfcm9vdCBhbmQgZml4X3RhaWwgZmllbGRzLgotCi1UdWUgRmViICA4IDE2OjAwOjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogRm9yIGFic19zeW1ib2wsIHNldCAqcHVudAotCWFuZCBkbyBub3RoaW5nIGVsc2UuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2JlZ2luKTogSW5pdGlhbGl6ZSB2YWx1ZSBvZiBhYnNfc3ltYm9sCi0JcHJvcGVybHkuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGFic19zeW1ib2wgaW5zdGVhZCBvZiBjYWxsaW5nCi0Jc2VjdGlvbl9zeW1ib2wuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKTogRml4ICIvKiIgaW4gY29tbWVudCB0byBzaWxlbmNlCi0JY29tcGxhaW50IGZyb20gImdjYyAtV2FsbCIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQsIGxpa2UgYWxwaGEtKi1vc2YqLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoR1BfQURKVVNUTUVOVCk6IE1vdmUgZGVmaW5pdGlvbiB0byBzdGFydCBvZgotCWZpbGUuCi0JKHRjX2dlbl9yZWxvYyk6IFJlbW92ZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGBjb2RlJywgYW5kIGNvZGUKLQl0aGF0IHRyaWVkIHRvIHVzZSBpdCAoaW5jb3JyZWN0bHkpLiAgRm9yIExJVEVSQUwgcmVsb2MsIHNldCBhZGRlbmQKLQl0byBuZWdhdGl2ZSBvZiBHUCB2YWx1ZS4KLQkobG9hZF9zeW1ib2xfYWRkcmVzcyk6IERvbid0IGFkanVzdCByZXR1cm4gdmFsdWUgYnkgR1BfQURKVVNUTUVOVC4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogUHJpbnQgc29tZSBzZW5zaWJsZSBlcnJvciBtZXNzYWdlIGlmCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiByZXR1cm5zIGJmZF9yZWxvY19vdmVyZmxvdy4KLQotTW9uIEZlYiAgNyAxNTo0OToyNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qZWxmKik6IE5ldyBjb25maWd1cmF0aW9uIGZvciBQQSBFTEYuCi0JKGhwcGEqLSotb3NmKik6IERlZmF1bHQgb2JqZWN0IGZvcm1hdCBpcyBTT00uCi0KLU1vbiBGZWIgIDcgMTY6MDc6MzUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2F0b2YpOiBXYXJuIHRoYXQgZmxvYXRpbmctcG9pbnQgdmFsdWVzCi0JbWlnaHQgbm90IGFzc2VtYmxlIHByb3Blcmx5LgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldCBhbHBoYS0qLW9zZiopOiBEb24ndCBzZXQgImRldj15ZXMiIGFueQotCW1vcmUuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBQYXJlbnRoZXNpemUgb3BlcmF0aW9ucyBpbgotCXJhbmdlIGNoZWNraW5nLCB0byBhdm9pZCBwcmVjZWRlbmNlIHF1ZXN0aW9ucy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFkZHIzMik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBpdCBmb3IgIi0zMmFkZHIiLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogSWYgYWRkcjMyIGlzIHNldCwgdXNlIGxkbCBpbnN0ZWFkIG9mIGxkcS4KLQotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IENhbGN1bGF0ZSBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMKLQlhbmQgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMgaW4gaW50ZWdlciBhcml0aG1ldGljLCB0bwotCWVsaW1pbmF0ZSB0aGUgb25seSBzb3VyY2VzIG9mIGRlcGVuZGVuY2Ugb24gZmxvYXRpbmcgcG9pbnQKLQlzdXBwb3J0LCB3aGljaCBkb2Vzbid0IHdvcmsgeWV0IG9uIHRoZSBBbHBoYS4KLQotTW9uIEZlYiAgNyAwMzo1NjowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKSBbVENfQUxQSEFdOiBTcGVjaWZ5IHZlcnNpb24gc3RhbXAgYXMKLQkweDMwYiBmb3IgQWxwaGEgZm9yIG5vdywgdW50aWwgIi52ZXJzdGFtcCIgaXMgaGFuZGxlZC4KLQotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogVXNlIHNlZ2luZm8tPmZyY2hhaW5QLCB3aGljaAotCWFjdHVhbGx5IHJlZmVycyB0byB0aGUgbGl0ZXJhbCBwb29sIHNlY3Rpb24sIHJhdGhlciB0aGFuCi0JZnJjaGFpbl9ub3csIHdoaWNoIHJlZmVycyB0byB3aGF0ZXZlciBzZWN0aW9uIHRoZSBhc3NlbWJsZXIgd2FzCi0JaW4uCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBPbmx5IGRvIHJhbmdlIGNoZWNraW5nIGlmIHNpemUgb2YgZml4dXAKLQlpcyBzbWFsbGVyIHRoYW4gd29yZCBzaXplLiAgT3RoZXJ3aXNlLCB3ZSBhbHdheXMgd2luZCB1cCB3aXRoCi0JemVyb3MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zZWN0aW9uX2FsaWduKTogQ2hhbmdlIHNlY29uZCBhcmd1bWVudCBhbmQKLQlyZXR1cm4gdHlwZSB0byB2YWx1ZVQsIHRvIGFncmVlIHdpdGggdGMuaC4KLQkoYWxwaGFfZG9fYWxpZ24pOiBMb2NhbCBzdGF0aWMgYXJyYXkgbm9wX3BhdHRlcm4gaXMgbm93IHVuc2lnbmVkCi0JY2hhciwgdG8gYXZvaWQgb3ZlcmZsb3cgd2FybmluZ3MuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfc2VjdGlvbl9hbGlnbik6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBFbnN1cmUgdGhhdCBlY29mZl9kYXRhIGZvcgotCW91dHB1dCBiZmQgaXMgbm9uLW51bGwgYmVmb3JlIGluZGlyZWN0aW5nIHRocm91Z2ggaXQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEpOiBSZW5hbWVkIGZyb20KLQlhbHBoYV9mcm9iX2ZpbGUuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAodGNfZnJvYl9maWxlKTogTWFjcm8gZGVsZXRlZC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKSBbVENfQUxQSEFdOiBDYWxsCi0JYWxwaGFfZnJvYl9lY29mZl9kYXRhLCB0aGVuIGZpbGwgaW4gb3B0aW9uYWwtaGVhZGVyIGluZm8gd2l0aCBncAotCXZhbHVlIGFuZCByZWdpc3RlciBtYXNrcy4KLQotU3VuIEZlYiAgNiAxNjoxMzo0NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChoaXV4KTogRml4ZXMgZnJvbSBtLWthc2FockBzcmFtaGMuc3JhLmNvLkpQLgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogU2FtZSBjaGFuZ2UKLQlhcyBjb2ZmYmZkIGFuZCBlbGYgYmVsb3cuICBaZXJvIHRoZSBpbml0aWFsIHN0YWIgc3ltYm9sIGFmdGVyCi0JYWxsb2NhdGluZyBpdC4KLQotU2F0IEZlYiAgNSAxMjozMDozMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFplcm8gdGhlCi0JaW5pdGlhbCBzdGFiIHN5bWJvbCBhZnRlciBhbGxvY2F0aW5nIGl0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCi1TYXQgRmViICA1IDExOjUzOjMxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IGFkZGJbdGZdIHNob3VsZCBvbmx5IGFjY2VwdAotCW5vbi1uZWdhdGVkIGNvbmRpdGlvbiBjb21wbGV0ZXJzLiAgQWRkIHN1cHBvcnQgZm9yIGFkZGIgcHNldWRvLW9wCi0Jd2hpY2ggYWNjZXB0cyBib3RoIG5lZ2F0ZWQgYW5kIG5vbi1uZWdhdGVkIGNvbXBsZXRlcnMuCi0KLVNhdCBGZWIgIDUgMDA6MTU6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwMCopOiBVc2UgY3B1X3R5cGUgcHBjLgotCShwcGMtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIGNvZmYgYW5kIGZvcmNlIGJmZF9nYXMuCi0JKiBjb25maWcvdGMtcHBjLmgsIGNvbmZpZy90Yy1wcGMuYzogTmV3IGZpbGVzIGZvciBQb3dlclBDL1BPV0VSCi0JKFJTLzYwMDApIHN1cHBvcnQuICBBdCB0aGUgbW9tZW50LCBvbmx5IFhDT0ZGIGlzIHN1cHBvcnRlZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKFNBX1NFVF9TWU1fRU5ETkRYKTogTWFkZSBub24tc3RhdGljLgotCShTX1NFVF9EQVRBX1RZUEUpOiBMaWtld2lzZS4KLQkoY29mZl9sYXN0X2Z1bmN0aW9uKTogUmVuYW1lZCBmcm9tIGxvY2FsIHN0YXRpYyBsYXN0X2Z1bmN0aW9uUCBpbgotCWNvZmZfZnJvYl9zeW1ib2wgYW5kIG1hZGUgZXh0ZXJuYWxseSB2aXNpYmxlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGxvY2FsIHN0YXRpYyBzZXRfZW5kOyB1c2UgaXQgdG8gdHJ5IHRvCi0JYXZvaWQgY2FsbGluZyBTQV9TRVRfU1lNX0VORE5EWCBvbiBhIHN5bWJvbCB0aGF0IHdpbGwgYmUgcHVudGVkLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfU0VUX0RBVEFfVFlQRSk6IERlY2xhcmUuCi0JKFNBX1NFVF9TWU1fRU5ETkRYKTogRGVjbGFyZS4KLQkoY29mZl9sYXN0X2Z1bmN0aW9uKTogRGVjbGFyZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSWYgRE9MTEFSX0RPVCBpcyBkZWZpbmVkLCBhY2NlcHQgYCQnIGFzCi0JZXF1aXZhbGVudCB0byBgLicgdG8gbWVhbiB0aGUgY3VycmVudCBsb2NhdGlvbi4KLQotCSogcmVhZC5jIChMRVhfQlIpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCi0JKGxleF90eXBlKTogVXNlIExFWF9CUiBhcyB0aGUgdHlwZSBvZiBgeycsYH0nLGBbJyxgXScuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IElmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBpcwotCWRlZmluZWQsIGNhbGwgaXQgd2l0aCBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lLiAgSWYKLQl0Y19zeW1ib2xfbmV3X2hvb2sgaXMgZGVmaW5lZCwgY2FsbCBpdCBvbiB0aGUgbmV3IHN5bWJvbC4KLQkoc3ltYm9sX2ZpbmRfYmFzZSk6IElmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBpcyBkZWZpbmVkLAotCWNhbGwgaXQgb24gYSBjb3B5IG9mIHRoZSBuYW1lIGFyZ3VtZW50LgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFNpbXBsaWZpZWQgdXNhZ2Ugb2Ygb2JqX2Zyb2Jfc3ltYm9sCi0JYW5kIHRjX2Zyb2Jfc3ltYm9sLiAgQWx3YXlzIGNhbGwgYm90aCBpZiB0aGUgc3ltYm9sIGlzIGdvaW5nIHRvIGJlCi0Jb3V0cHV0LgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogVXNlICVsZCByYXRoZXIgdGhhbiAlZCB3aGVuIHByaW50aW5nCi0JZnJhZ1AtPmZyX3ZhciwgYW5kIGNhc3QgaXQgdG8gbG9uZy4KLQotCUNoYW5nZWQgcmVsb2NzIHRvIGJlIGJhc2VkIG9uIHN1YnNlZ21lbnRzICh3aGVuIEJGRF9BU1NFTUJMRVIpLgotCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IElmIEJGRF9BU1NFTUJMRVIsIGFkZGVkIG5ldyBmaWVsZHMKLQlmaXhfcm9vdCBhbmQgZml4X3RhaWwuCi0JKHNlZ21lbnRfaW5mb190eXBlKTogSWYgQkZEX0FTU0VNQkxFUiwgZG9uJ3QgZGVmaW5lIGZpeF90YWlsCi0JZmllbGQuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSWYgQkZEX0FTU0VNQkxFUiwgc2V0IGZpeF9yb290UCBhbmQKLQlmaXhfdGFpbFAgYmFzZWQgb24gZnJjaGFpbl9ub3csIG5vdCBzZWdfaW5mbyAobm93X3NlZykuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBDaGFpbiB0aGUgc3Vic2VnbWVudCByZWxvY3MgdG9nZXRoZXIuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBEb24ndCBjbGVhciBmaXhfdGFpbCBmaWVsZC4KLQkoc3Vic2VnX2dldCk6IExpa2V3aXNlLgotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgdmlhCi0JZnJjaGFpbl9ub3csIG5vdCBzZWdpbmZvLgotCi1UaHUgRmViICAzIDIzOjA3OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IENoYW5nZWQKLQllY29mZl91bmRlZmluZWQgdG8gZWNvZmZfZXh0ZXJuX3NpemUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZXh0ZXJuKTogU2V0IGVjb2ZmX2V4dGVybl9zaXplIHRvIHRoZQotCWV4dGVybmFsIHN5bWJvbCBzaXplLCByYXRoZXJuIHRoYW4gc2V0dGluZyB0aGUgc3ltYm9sIHZhbHVlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IENoZWNrIGJvdGggZWNvZmZfZXh0ZXJuX3NpemUgYW5kCi0Jc3ltYm9sIHZhbHVlIHRvIHNlZSBpZiBHUCByZWZlcmVuY2luZyBjYW4gYmUgdXNlZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N5bWJvbF9uZXdfaG9vayk6IENsZWFyIGVjb2ZmX2V4dGVybl9zaXplLCBub3QKLQllY29mZl91bmRlZmluZWQuCi0JKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2hlY2sgZWNvZmZfdW5kZWZpbmVkLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogR2V0IHNpemUgb2YgYW4gdW5kZWZpbmVkIHN5bWJvbCBmcm9tCi0Jc3ltLT5lY29mZl9leHRlcm5fc2l6ZSwgbm90IFNfR0VUX1ZBTFVFIChzeW0pLgotCi1XZWQgRmViICAyIDEzOjU1OjA4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIGJ1ZyBpbiBsb3NpbmcgaHB1eCBzZWQuCi0KLVdlZCBGZWIgIDIgMTE6NDA6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChmaWxlX21pcHNfaXNhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBTZXQgaXQuCi0JKHNfbWlwc3NldCk6IEFkZCBzdXBwb3J0IGZvciAuc2V0IG1pcE4gdG8gc2V0IHRoZSBJU0EgbGV2ZWwuCi0KLQkqIGdhc3AuYyAoa2luZm8pOiBGdWxseSBicmFja2V0IGluaXRpYWxpemVyLgotCi1UdWUgRmViICAxIDE5OjI4OjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAobWFsbG9jKTogRG9uJ3QgZGVjbGFyZSwgc2luY2UgaG9zdC5oIG9yIHN5c3RlbSBoZWFkZXIKLQlmaWxlcyBtYXkgZGVjbGFyZSBpdCBkaWZmZXJlbnRseS4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChpbnRfdG9fZ2VuKTogTm93IHN0YXRpYy4KLQotCSogY29uZmlnL2hvLWkzODZhaXguaDogSW5jbHVkZSBzeXMvdHlwZXMuaCBhbmQgc3RkbGliLmgsIG5vdAotCWhvLXN5c3YuaC4gIEJhc2VkIGxvb3NlbHkgb24gYSBwYXRjaCBmcm9tIE1pbmggVHJhbi1MZS4KLQotVHVlIEZlYiAgMSAxMDo1MDoxNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBnYXNwLmM6IEluY2x1ZGUgaG9zdC5oLgotCi1UdWUgRmViICAxIDEyOjEzOjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE1ha2UgYW4gdW5zdXBwb3J0ZWQgaW5zdHJ1Y3Rpb24gYQotCXdhcm5pbmcsIG5vdCBhbiBlcnJvci4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLAotCWRvdF9ic3Nfc3ltYm9sKTogRG9uJ3QgZGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuCi0JKG9ial9zeW1ib2xfdG9fY2hhcnMpOiBiZmRfY29mZl9zd2FwX2F1eF9vdXQgbm93IHRha2VzIG1vcmUKLQlhcmd1bWVudHMuCi0JKGNvZmZfbGluZV9iYXNlKTogUmVuYW1lZCBmcm9tIGxpbmVfYmFzZS4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKGNvZmZfYWRkX2xpbmVzeW0pOiBSZW5hbWVkIGZyb20gYWRkX2xpbmVfc3ltLiAgTWFkZSBub24tc3RhdGljLgotCUNoYW5nZWQgYWxsIHVzZXMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogSWYgVENfUFBDLCBpbmNsdWRlIGNvZmYvcnM2MDAwLmguCi0JKFNfU0VUX1NUT1JBR0VfQ0xBU1MsIFNfR0VUX1NUT1JBR0VfQ0xBU1MpOiBEZWNsYXJlIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoY29mZl9saW5lX2Jhc2UpOiBEZWNsYXJlLgotCShjb2ZmX2FkZF9saW5lc3ltKTogRGVjbGFyZSBpZiBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHN5bWJvbF90b19jaGFycyk6IGJmZF9jb2ZmX3N3YXBfYXV4X291dAotCW5vdyB0YWtlcyBtb3JlIGFyZ3VtZW50cy4KLQotTW9uIEphbiAzMSAxNzo1NToxNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHN0YXRpc3RpY3NfZmxhZyk6IFJlbmFtZWQgZnJvbSBxdWlldF9mbGFnLgotCShtYWluKTogR2V0IHN0YXRpc3RpY3Mgd2l0aCAtLXN0YXRpc3RpY3MgaW5zdGVhZCBvZiAtbm9xdWlldC4KLQotTW9uIEphbiAzMSAwNzoxOTozMCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogU3VwcG9ydCBmb3IgR251IEFTc2VtYmxlciBQcmVwcm9jZXNzb3IuCi0JKiBnYXNwLmM6IE5ldyBmaWxlLgotCSogcmVhZC5jIChzX2xjb21tKTogQWxpZ24gbGNvbW0gZGF0YS4KLQkqIGNvbmZpZy90Yy16OGsuYyAodGNfcmVsb2NfbWFuZ2xlKTogRG9uJ3QgYWxsb3cgc3VidHJhY3Rpb24KLQlmcm9tIGRpZmZlcmVudCBzZWN0aW9ucy4KLQotU3VuIEphbiAzMCAxNDo1ODoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIHRjX2Zyb2JfZmlsZSBpcyBkZWZpbmVkLCBjYWxsIGl0Ci0JanVzdCBiZWZvcmUgY2FsbGluZyBvYmpfZnJvYl9maWxlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2dwX3ZhbHVlKTogUmVuYW1lZCBmcm9tIGdwX3ZhbHVlCi0JKHJlZmVyZW5jZXMgY2hhbmdlZCksIGFuZCBtYWRlIG5vbi1zdGF0aWMuCi0JKGdldEV4cHJlc3Npb24pOiBSZXR1cm4gdm9pZC4KLQkoc2VsZWN0X2dwX3ZhbHVlKTogQWJvcnQgaWYgZ3BfdmFsdWUgaXMgbm9uLXplcm8uICBEZWxldGUgY2FsbCB0bwotCW5vbi1leGlzdGVudCBiZmRfc2V0X2dwX3ZhbHVlLgotCShhbHBoYV92YWxpZGF0ZV9maXgpOiBGdW5jdGlvbiBkZWxldGVkLgotCShhbHBoYV9mcm9iX3N5bWJvbCk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGFscGhhX2xvY2FsX2xhYmVsKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoYWxwaGFfZnJvYl9maWxlKTogUmVuYW1lZCBmcm9tIGFscGhhX2VuZC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChhbHBoYV9mcm9iX3N5bWJvbCwgYWxwaGFfdmFsaWRhdGVfZml4LAotCWFscGhhX2xvY2FsX2xhYmVsLCBhbHBoYV9lbmQpOiBEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQkoYWxwaGFfZ3BfdmFsdWUsIGFscGhhX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKHRjX2Zyb2Jfc3ltYm9sLCBUQ19WQUxJREFURV9GSVgsIG1kX2VuZCk6IE1hY3JvcyBkZWxldGVkLgotCShMT0NBTF9MQUJFTCk6IE1vdmUgY29kZSBoZXJlIGZyb20gdGMtYWxwaGEuYzphbHBoYV9sb2NhbF9sYWJlbC4KLQkobWRfY29udmVydF9mcmFnKTogU2ltcGxpZmllZCBzbGlnaHRseS4KLQkodGNfZnJvYl9maWxlKTogTmV3IG1hY3JvLgotCi0JKiByZWFkLmMgKGRvX2FsaWduKTogTmV3IGZ1bmN0aW9uLCBtb3N0IG9mIGd1dHMgb2Ygc19hbGlnbl8qCi0JZnVuY3Rpb25zLiAgTG9vayBmb3IgbWRfZG9fYWxpZ24gbWFjcm8sIGdpdmUgaXQgYSBjaGFuY2UgdG8gYnlwYXNzCi0JYWxsIGJ1dCByZWNvcmRpbmcgb2Ygc2VjdGlvbiBhbGlnbm1lbnQuCi0JKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IENhbGwgZG9fYWxpZ24uCi0JKHNfbGNvbW0pIFtUQ19BTFBIQV06IEFsaWduIG9iamVjdCB0byBsYXJnZXN0IHBvd2VyIG9mIHR3byB0aGF0Ci0JZGl2aWRlcyBvYmplY3Qgc2l6ZS4KLQotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbl9wYXR0ZXJuKTogTmV3IGZ1bmN0aW9uLgotCShmcmFnX2FsaWduKTogUmV3cml0ZSBmb3IgY2xhcml0eS4KLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBPX2NvbnN0YW50IGV4cHJlc3Npb24uCi0JKHZpcF9iZWdpbik6IFJldHVybnMgcG9pbnRlciB0byBjb25zdCBjaGFyLiAgQ2FzdCBoYXNoX2luc2VydCBhcmcKLQl0byBQVFIgdG8gYXZvaWQgY29tcGlsZXIgY29tcGxhaW50cyBhYm91dCBjb25zdC4KLQkobWRfYmVnaW4pOiBMb2NhbCB2YXJpYWJsZSBlcnJ0eHQgbXVzdCBwb2ludCB0byBjb25zdC4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgaG9zdCB2YXgtKi11bHRyaXgqIGxpa2UgdmF4LSotYnNkKi4gIERvbid0Ci0JYm90aGVyIHdpdGggKi0qLXVsdHJpeCBvciAqLSotc3lzdiosIGV4Y2VwdCAqLSotc3lzdiwgc2luY2Ugb25seQotCXRoZSBsYXN0IGhhcyBhbiBleGlzdGluZyBob3N0IHN1cHBvcnQgZmlsZS4gIERvIGhhbmRsZSB2YXgtYnNkIGFuZAotCXZheC11bHRyaXggdGFyZ2V0cy4KLQotRnJpIEphbiAyOCAxMToyNjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uX2hlYWRlcl9hcHBlbmQpOiBEbyBub3QKLQlkZWNsYXJlIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHN0YWNrX3BvcCk6IENvcnJlY3QgdGVzdCBmb3Igc3RhY2sgdW5kZXJmbG93LgotCShvYmpfY29mZl9lbmRlZiwgb2JqX2NvZmZfZGltLCBvYmpfY29mZl9saW5lLCBvYmpfY29mZl9zaXplLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLCBvYmpfY29mZl92YWwpOiBEZWNsYXJlCi0JdHlwZSBvZiBpZ25vcmVkIGFyZ3VtZW50IHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShhbGlnbik6IFJlbW92ZWQgdW51c2VkIGZ1bmN0aW9uLgotCi1UaHUgSmFuIDI3IDE4OjE0OjE5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jLCBjb25maWcvdGMtYWxwaGEuaCwgY29uZmlnL2FscGhhLW9wY29kZS5oOiBOZXcKLQlmaWxlcywgYmFzZWQgb24gcG9ydCBvZiBnYXMtMS4zOCBjb250cmlidXRlZCBieSBDTVUsIHVzaW5nIGEub3V0Ci0JdmFyaWFudC4gIFVwZGF0ZWQgZm9yIGdhcy0yLnggYW5kIEVDT0ZGLiAgRmxvYXRpbmctcG9pbnQgY29uc3RhbnRzCi0JYXJlIHN0aWxsIGJyb2tlbiwgYm9vdHN0cmFwIHRlc3RpbmcgaW5jb21wbGV0ZS4KLQotCSogbGl0ZXJhbC5jOiBDb21tZW50IGNoYW5nZXMuCi0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19zb3VyY2VfZmlsZSk6IENoZWNrIGZvciBudWxsIGxpc3RpbmdfdGFpbAotCWJlZm9yZSBpbmRpcmVjdGluZyB0aHJvdWdoIGl0LgotCi0JKiBleHByLmggKHN0cnVjdCBleHByZXNzaW9uUyk6IEFkZGVkIHN0cnVjdCB0YWcuCi0KLQkqIGFzLmg6IElmIF9fR05VQ19fIGFuZCBpbmxpbmUgYXJlIGJvdGggdW5kZWZpbmVkLCBkZWZpbmUgaW5saW5lCi0JYXdheS4KLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IERvbid0IGFzc3VtZSB0aGF0IGZyX3ZhciBmb3IKLQlyc19hbGlnbiBvciByc19vcmcgZnJhZ3Mgd2lsbCBiZSAxLgotCShyZWxheF9zZWdtZW50KTogRm9yIHJzX2FsaWduLCBpZiBmcl92YXIgaXMgbm90IDEsIGNvbXBsYWluIGlmCi0JcmVxdWlyZWQgcGFkZGluZyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgc2l6ZSBvZiB0aGUgcGFkIHBhdHRlcm4uCi0JKGZpeHVwX3NlZ21lbnQpOiBMZWF2ZSBncC1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhbG9uZS4gIEZvciBwY3JlbAotCXJlbG9jYXRpb25zIHJlZmVycmluZyB0byB0aGUgc2FtZSBzZWdtZW50LCBjbGVhciBmeF9wY3JlbCB3aGVuCi0JY2xlYXJpbmcgZnhfYWRkc3kuCi0JKiBhcy5oOiBBZGp1c3QgY29tbWVudHMgb24gcnNfYWxpZ24uCi0KLQkqIGF0b2YtZ2VuZXJpYy5jOiBTb21lIHJlZm9ybWF0dGluZy4KLQkoYXRvZl9nZW5lcmljKTogQmUgY2FyZWZ1bCB3aGVuIG1peGluZyBzaWduZWQvdW5zaWduZWQgdmFsdWVzIG9mCi0JZGlmZmVyZW50IHNpemVzLgotCi0JKiB3cml0ZS5jLCBjb25maWcvb2JqLXthb3V0LGJvdXQsY29mZip9LmMsIGNvbmZpZy90Yy1zcGFyYy5jOgotCVF1ZXJ5IHRoZSBmeF9kb25lIGZpZWxkIGluc3RlYWQgb2YgZnhfYWRkc3kgdG8gc2VlIGlmIHRoZSBmaXh1cAotCXN0aWxsIG5lZWRzIHRvIGJlIGFwcGxpZWQuICBTZXQgZnhfZG9uZSBhbmQgY2xlYXIgZnhfYWRkc3kgYm90aCwKLQlmb3Igbm93LiAgSWYgVENfSEFORExFU19GWF9ET05FIGlzbid0IGRlZmluZWQsIGFzc3VtZSBtZF9hcHBseV9maXgKLQl3aWxsIG9ubHkgY2xlYXIgZnhfYWRkc3ksIGFuZCBzZXQgZnhfZG9uZSBhY2NvcmRpbmdseSBhZnRlcgotCXJldHVybmluZy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQ19IQU5ETEVTX0ZYX0RPTkUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogU2V0IGZ4X2RvbmUgZm9yIG5vbi1wY3JlbCBmaXgKLQl3aXRoIG5vIGZ4X2FkZHN5LgotCi0JKiBzeW1ib2xzLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLCBkb3RfYnNzX3N5bWJvbCk6Ci0JRGVsZXRlZC4KLQkoc3ltYm9sX2JlZ2luKTogTW92ZWQgdG8gZW5kIG9mIGZpbGUsIHNvIGZ1bmN0aW9uIGlubGluaW5nIGNhbgotCXdvcmsgYmV0dGVyLgotCShmYl9sYWJlbF9jb3VudCwgZmJfbGFiZWxfbWF4KTogRGVmYXVsdCBDIHN0YXRpYyBpbml0aWFsaXplcnMgYXJlCi0Jc3VmZmljaWVudC4KLQkqIHN5bWJvbHMuaCAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsIGRvdF9ic3Nfc3ltYm9sKToKLQlEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb3RfdGV4dF9zeW1ib2wsIGRvdF9kYXRhX3N5bWJvbCwKLQlkb3RfYnNzX3N5bWJvbCk6IERlZmluZWQgaGVyZSwgc3RhdGljLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyBbQkZEX0FTU0VNQkxFUl06IFVuZGVmIE5PX1JFTE9DIGJlZm9yZQotCWluY2x1ZGluZyBhb3V0L2FvdXQ2NC5oLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIEVNSVRfU0VDVElPTl9TWU1CT0xTIGlzIGZhbHNlLAotCWRvbid0IHdyaXRlIG91dCBhIHNlY3Rpb24gc3ltYm9sIGV2ZW4gaWYgaXQncyB1c2VkIGluIGEKLQlyZWxvY2F0aW9uOyBhc3N1bWUgcmVsb2NhdGlvbnMgd2lsbCBoYW5kbGUgc2VjdGlvbiBudW1iZXJzCi0Jc29tZWhvdy4gIFJlbmFtZSAicHVudF9pdCIgbGFiZWwgdG8gInB1bnRfaXRfaWZfdW51c2VkIiB0byByZWZsZWN0Ci0JaXQncyB0cnVlIHVzZS4KLQkoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEZWZhdWx0IHRvIDEuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3QgY3JlYXRlIGEgbmV3IHN5bWJvbCBmb3IgYW4gYWJzb2x1dGUKLQlyZWZlcmVuY2U7IGp1c3QgdXNlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4KLQkod3JpdGVfcmVsb2NzKTogTWFrZSBwcmludG91dCBvZiByZWxvYyB2YWx1ZXMgZGVwZW5kZW50IG9uIGZsYWcKLQlERUJVRzMsIG5vdCBERUJVRzIuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEZWZpbmUgYXMgMC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEaXR0by4KLQotVGh1IEphbiAyNyAxNjo0Mzo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBObyBsb25nZXIgbWFrZSAneycgYSB2YWxpZCBjaGFyYWN0ZXIgZm9yCi0Jc3ltYm9sIG5hbWVzLgotCi0JKiBhcy5jIChtYWluKTogUHJpbnQgbG9uZyB2YWx1ZXMgdXNpbmcgJWxkLgotCi0JKiBtZXNzYWdlcy5jIChhc193YXJuX2ludGVybmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXNfd2FybiwgMyB2ZXJzaW9ucyk6IFVzZSBhc193YXJuX2ludGVybmFsLgotCShhc193YXJuX3doZXJlLCAzIHZlcnNpb25zKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoYXNfd2Fybl93aGVyZSk6IERlY2xhcmUuCi0KLVR1ZSBKYW4gMjUgMTg6MzA6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcy5jIChxdWlldF9mbGFnKTogTmV3IGZsYWcuCi0JKG1haW4pOiBJZiAtbm9xdWlldCBnaXZlbiwgZGlzcGxheSBleGVjdXRpb24gdGltZSBhbmQgbWVtb3J5IHVzZWQuCi0KLVR1ZSBKYW4gMjUgMTU6NTM6MTEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGRvYy97YWxsLnRleGksYXMudGV4aW5mb306IEFkZCBkb2N1bWVudGF0aW9uIGZvciBIUFBBIHBvcnQuCi0KLU1vbiBKYW4gMjQgMTk6MTg6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4gIFB1dCB1bmRlZmluZWQKLQlzeW1ib2xzIG9mIGtub3duIHNpemUgaW4gdGhlIHVuZGVmaW5lZCBzZWN0aW9uLiAgUHV0IHNtYWxsIGNvbW1vbgotCXN5bWJvbHMgaW4gYSAuc2NvbW1vbiBzZWN0aW9uLgotCSogZWNvZmYuaCAoZWNvZmZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3dyaXRlX3N5bWJvbF9wLCBvYmpfZWxmX3dyaXRlX3N5bWJvbCwKLQlvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCB1bnVzZWQgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2Jfc3ltYm9sLCBvYmpfd3JpdGVfc3ltYm9sKTogUmVtb3ZlZAotCXVudXNlZCBtYWNyb3MuCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wsIG9ial9lbGZfd3JpdGVfc3ltYm9sKTogUmVtb3ZlZCBkZWNsYXJhdGlvbnMKLQlvZiB1bnVzZWQgZnVuY3Rpb25zLgotCShvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HLgotCi0JKiB0Yy1taXBzLmMgKGdfc3dpdGNoX3NlZW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgZ19zd2l0Y2hfc2VlbiBmb3IgLUcgb3B0aW9uLgotCShzX29wdGlvbik6IElmIGNyZWF0aW5nIFBJQyBjb2RlLCBmb3JjZSB0aGUgR1Agc2l6ZSB0byBiZSAwLiAgV2FybgotCWlmIC1HIHN3aXRjaCB1c2VkIHdpdGggYSBub24temVybyB2YWx1ZS4KLQotCSogc3ltYm9scy5jIChTX0lTX0NPTU1PTik6IFVzZSBiZmRfaXNfY29tX3NlY3Rpb24gcmF0aGVyIHRoYW4KLQljb21wYXJpbmcgYWdhaW5zdCBiZmRfY29tX3NlY3Rpb24uCi0KLU1vbiBKYW4gMjQgMTQ6MTI6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2xjb21tKTogVHJlYXQgQWxwaGEgbGlrZSBNSVBTIGluIGhhbmRsaW5nIG9mIC5zYnNzCi0Jc2VjdGlvbi4KLQotVGh1IEphbiAyMCAxMzoxNzo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBGb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZCB3aXRoIHVudXN1YWwgZnAKLQljaGFyIGZyb20gRkxUX0NIQVJTLCBwcmVzZXJ2ZSB0aGUgY2hhcmFjdGVyLiAgUGF0Y2ggZnJvbSBMaXNhCi0JUmVwa2EuCi0KLVdlZCBKYW4gMTkgMjM6MTU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgYWxsIGRhdGEgYWxsb2NhdGlvbgotCXBzZXVkby1vcHM6IC5od29yZCwgLmludCwgLmxvbmcsIC5vY3RhLCAucXVhZCwgLnNob3J0LCAuc2luZ2xlLgotCi1UdWUgSmFuIDE4IDE1OjUxOjU5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9lbmRlZik6IEZvciBDX0VGQ04sIENfQkxPQ0sgYW5kCi0JQ19GQ04gYXNzdW1lIC52YWwgaGFzIGJlZW4gc2V0IHRvIC4KLQotVHVlIEphbiAxOCAxNjoxOTo1OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogRGlzYWJsZSBtdWx0aXBsZSAkQ09ERSQgc3Vic3BhY2UgY29kZS4gIEl0Ci0JY29uZnVzZXMgR0RCIGZvciBzb21lIHVua25vd24gcmVhc29uLgotCSogY29mbmlnL29iai1zb20uYzogTGlrZXdpc2UuCi0KLVR1ZSBKYW4gMTggMTk6MDU6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogSGFuZGxlIGR1cGxpY2F0ZXMgb2YgdmFsdWVzCi0JYWxyZWFkeSB3cml0dGVuIHRvIGxpdGVyYWwgcG9vbC4KLQotVHVlIEphbiAxOCAxNzoyMzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFRyeSB0byBnZXQgc3ltYm9scwotCXdpdGggZXhwbGljaXRseSBtYXJrZWQgc3RhYnMgdGhyb3VnaCBCRkQ6IGlmIGEgc3ltYm9sIG1hcmtlZAotCU5fVU5ERiB8IE5fRVhUIGlzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBtb3ZlIGl0IHRvIHRoZQotCXVuZGVmaW5lZCBzZWN0aW9uOyBtb3ZlIGEgc3ltYm9sIG1hcmtlZCBOX0lORFIgaW50bwotCWJmZF9pbmRfc2VjdGlvbiBhbmQgc2V0IHRoZSBCU0ZfSU5ESVJFQ1QgZmxhZzsgc2V0IHRoZQotCUJTRl9XQVJOSU5HIGZsYWcgZm9yIGEgc3ltYm9sIG1ha3JlZCBOX1dBUk5JTkcuCi0KLU1vbiBKYW4gMTcgMTU6NDA6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBEZWNsYXJlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogUmV0dXJuIHR5cGUgaXMgdm9pZC4KLQotTW9uIEphbiAxNyAwMDoxODo1NSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBFeHBsaWNpdGx5IGNoZWNrIGZvciBjb21tYSBiZWZvcmUgJ3UnCi0JYW5kICdmJyB0ZW1wbGF0ZSBvcGVyYW5kLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnTicsICdPJywgJ28nLCAnMCcsICcxJywgJ3UnLAotCWFuZCAnMicgaW4gY29wciBhbmQgc2Z1IGluc3RydWN0aW9uIHRlbXBsYXRlcy4KLQotU3VuIEphbiAxNiAxNjo0NDoyMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXMuaCAoc3Vic2VnX2ZvcmNlX25ldyk6IEFkZCBwcm90b3R5cGUuCi0KLVNhdCBKYW4gMTUgMDk6MjA6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsbG93IGxpbmVzIGxpa2UgIiBmb29sYWIgOiIuCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogRml4IGNvbXB1dGF0aW9uIG9mIG1hc2suCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBGaXggbG9vcCB0ZXJtaW5hdGlvbiB0ZXN0LgotCi1UaHUgSmFuIDEzIDE2OjE1OjE1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoY3VycmVudF9maWxlX2lkeCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFkZF9maWxlKTogVXNlIGFuZCBpbmNyZW1lbnQgY3VycmVudF9maWxlX2lkeCBpbnN0ZWFkIG9mIGluZHgKLQlwYXJhbWV0ZXIuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogTWFrZSBhbGwgYml0ZmllbGRzIHVuc2lnbmVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChpOTYwX3ZhbGlkYXRlX2ZpeCk6IEFkZGVkIGFyZ3VtZW50Ci0JYWRkX3N5bWJvbFBQLiAgSW5kaXJlY3QgdGhyb3VnaCBpdCB0byBnZXQgImFkZF9zeW1ib2xQIi4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKGk5NjBfdmFsaWRhdGVfZml4KTogU3VwcGx5IHByb3RvdHlwZS4KLQkoVENfVkFMSURBVEVfRklYKTogUGFzcyBhZGRyZXNzIG9mIGFkZF9zeW1ib2xQLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1uZXRic2QqKTogTmV3IHRhcmdldCwgdXNpbmcgdGUtbmV0YnNkLmguCi0JKGkzODYtKi1uZXRic2QwLjgpOiBOZXcgdGFyZ2V0LCBsaWtlIDM4NmJzZC4KLQotCSogY29uZmlndXJlLmluOiBTZXQgQkZEREVGIGluIE1ha2VmaWxlIHRvICJkZWZpbmUiIG9yICJ1bmRlZiIuCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgpOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQlEZWZpbmUgb3IgdW5kZWYgQkZEX0FTU0VNQkxFUiBhcyBzcGVjaWZpZWQgYnkgJChCRkRERUYpLgotCShBTExfQ0ZMQUdTKTogT21pdCAkKEJGRERFRikuCi0JKiBhcy5oOiBJbmNsdWRlIGNvbmZpZy5oLgotCShzdHJ1Y3Qgc3ltYm9sKTogQWRkZWQgZm9yd2FyZCBkZWNsYXJhdGlvbi4KLQkoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IEZpeCBkZWNsYXJhdGlvbi4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgY29uZmlnLmguCi0KLQkqIGxpdGVyYWwuYyAoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IFRha2Ugc3ltYm9sIGFuZCBhZGRlbmQgYXMKLQlhcmd1bWVudHMsIGluc3RlYWQgb2YgZXhwcmVzc2lvbiwgZm9yIG5vdy4gIEZpeCBjYWxjdWxhdGlvbiBvZgotCW9mZnNldCB0byByZXR1cm4uCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpIFtORUVEX0xJVEVSQUxfUE9PTF06IEFkZCBmaWVsZAotCWxpdGVyYWxfcG9vbF9zaXplLgotCi1UaHUgSmFuIDEzIDEyOjE0OjIxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2dldCk6IEFjY2VwdCBuZXcgYXJndW1lbnQgImZvcmNlX25ldyIuICBJZgotCXNldCB0aGVuIGEgbmV3IHNlZ21lbnQgaXMgYWx3YXlzIGNyZWF0ZWQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShzdWJzZWdfZm9yY2VfbmV3KTogTmV3IGZ1bmN0aW9uLiAgU2ltaWxhciB0byBzdWJzZWdfbmV3LCBidXQKLQlhbHdheXMgZm9yY2UgYSBuZXcgc2VnbWVudCB0byBiZSBjcmVhdGVkLgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChzb21fZnJvYl9maWxlKTogQ2FsbCBhZGp1c3RfY29kZV9zZWN0aW9ucwotCWZvciBlYWNoIHNlY3Rpb24uCi0JKGFkanVzdF9jb2RlX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLiAgQWRqdXN0cyB0aGUgVk1BIGZvciBhbGwgdGhlCi0JJENPREUkIHN1YnNwYWNlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXNzZW1ibGUpOiBBbHNvIGhhbmRsZSBjcmVhdGluZyBhIGZpeHVwCi0JZm9yIHRoZSB1bndpbmQgZGVzY3JpcHRvcnMgaWYgYSBmdW5jdGlvbidzIGxhYmVsIGZvbGxvd3MgdGhlCi0JLlBST0MgYW5kIC5FTlRSWSBkaXJlY3RpdmVzLgotCShwYV9lbnRyeSk6IERvbid0IHNldCBCU0ZfRlVOQ1RJT04gZm9yIHRoZSBsYWJlbCBzeW1ib2wgaGVyZTsgaXQKLQlpcyBkb25lIGVsc2V3aGVyZS4gIERvbid0IGNyZWF0ZSBhIGZpeHVwIGZvciB0aGUgdW53aW5kCi0JZGVzY3JpcHRvcnMgaWYgdGhlIGZ1bmN0aW9uJ3MgbGFiZWwgaGFzIG5vdCBiZWVuIGRlZmluZWQgeWV0LgotCShwYV9wcm9jKTogRm9yIFNPTSwgcGxhY2UgZWFjaCBwcm9jZWR1cmUgd2l0aGluIGEgbmV3ICRDT0RFJAotCXN1YnNwYWNlLiAgQWRqdXN0IHRoZSBzZWdtZW50IGFuZCBmcmFnIGZvciB0aGUgYXNzb2NpYXRlZAotCWZ1bmN0aW9uIGxhYmVsIGlmIGl0IGV4aXN0cy4KLQotV2VkIEphbiAxMiAyMjowNTozMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfc3RydWN0KTogQWRkIG5ldyAic2VnbWVudCIgZmllbGQuCi0JKGhwcGFfZml4X25ldyk6IEluaXRpYWxpemUgc2VnbWVudCBmaWVsZC4KLQkobWRfYXBwbHlfZml4KTogRG8gbm90aGluZyBmb3IgcGMtcmVsYXRpdmUgZml4dXAgd2hpY2ggaW52b2x2ZXMKLQljcm9zc2luZyBhIHNlZ21lbnQgYm91bmRhcnkuCi0JKHBhX3Byb2NlbmQpOiBVbmRlZmluZSB0aGUgY3VycmVudCBsYWJlbCBhZnRlciBoYW5kbGluZyAuUFJPQwotCWFuZCAuUFJPQ0VORCBkaXJlY3RpdmVzLgotCShkdW1teV9zeW1ib2wpOiBNYWtlIHR5cGUgInN5bWJvbFMgKiIuICBDaGFuZ2UgcmVmZXJlbmNlcyBhcwotCWFwcHJvcHJpYXRlLgotCi1XZWQgSmFuIDEyIDEzOjI5OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYXN0IGFycmF5IGFyZ3VtZW50IHRvIHVuc2lnbmVkCi0JY2hhci4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzeW1zZWdpbmZvLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBwdW50X2l0IGlmIGl0IHdvbid0IGJlIHVzZWQuCi0JKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkZWZpbmUgc2tpcCBpZiBpdCB3b24ndCBiZSB1c2VkLgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGFzIG1pcHNfdGFyZ2V0X2Zvcm1hdC4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IERlZmluZSB3aXRoIGFwcHJvcHJpYXRlCi0JZGVmYXVsdCBkZWZpbml0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiAtRUwgb3IgLUVCIGlzIHVzZWQsIGNoYW5nZSBieXRlX29yZGVyIGFuZAotCW1pcHNfdGFyZ2V0X2Zvcm1hdCBhcyBhcHByb3ByaWF0ZS4KLQotVHVlIEphbiAxMSAyMTo1MjozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFub3RoZXIgYXR0ZW1wdCB0byBmaXggYnVncwotCWRlYWxpbmcgd2l0aCBsYWJlbHMgd2l0aG91dCBjb2xvbnMgKGZvciBIUFBBIGFuZCBNUkkpLgotCi1UdWUgSmFuIDExIDE3OjAxOjA2IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFRydW5jYXRlIGFyZ3MgdG8gJWhpLyVsbyB0byAzMiBiaXRzLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBGaXggY29tcHV0YXRpb24gb2YgdG9vX21hbnlfZGlnaXRzLgotCVZhcmlhYmxlIGRpZ2l0XzIgcmVuYW1lZCB0byBzdGFydC4gIEZpeCBjaGVjayBmb3Igd2hldGhlciBudW1iZXIKLQl3aWxsIGZpdCBpbiAzMiBiaXRzLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgdmFsdWVUIGluc3RlYWQgb2YgbG9uZy4KLQotVHVlIEphbiAxMSAxMzowMToyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IElmIFRDX01JUFMsIGluY2x1ZGUgZWxmL21pcHMuaC4KLQkoc3BlY2lhbF9zZWN0aW9ucyk6IERlZmluZS4KLQkob2JqX2VsZl9zcGVjaWFsX3NlY3Rpb24pOiBHZXQgZGVmYXVsdCB0eXBlcyBhbmQgYXR0cmlidXRlcyBmcm9tCi0JbGlzdCBvZiBzcGVjaWFsIHNlY3Rpb25zLgotCSogY29uZmlnL3RjLW1pcHMuYyAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRm9yY2UgLnNkYXRhIGFuZCAuc2JzcwotCXNlY3Rpb25zIHRvIGJlIGNsb3NlIHRvZ2V0aGVyLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3RlZCAkYXQgd2FybmluZ3MgaW4gYSBjb3VwbGUgb2YKLQlzcG90cy4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX3ByZXZfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpc3RpbmcuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKGxpc3RpbmdfcHJldl9saW5lKTogTmV3IGZ1bmN0aW9uLgotCShjYWxjX2hleCk6IFJlc2V0IGJ5dGVfaW5fZnJhZyB0byB6ZXJvIGZvciBlYWNoIG5ldyBmcmFnLgotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBDYWxsIGxpc3RpbmdfcHJldl9saW5lIGFmdGVyCi0JZW1pdHRpbmcgbm9wIGluc3RydWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChsaXN0aW5nLm8pOiBEZXBlbmRzIHVwb24gc3Vic2Vncy5oLgotCi1Nb24gSmFuIDEwIDA5OjUyOjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFB1dCBjaGVjayBmb3IgbWlzc2luZyBsYWJlbCBvbiAuUFJPQwotCWhlcmUuICBIYW5kbGUgY2FzZSB3aGVyZSBsYWJlbCBtYXkgYmUgZGVmaW5lZCBhZnRlciB0aGUgLlBST0MuCi0JKHBhX3Byb2MpOiBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIHByb2NlZHVyZSdzIGxhYmVsIGlzbid0Ci0JZGVmaW5lZCBiZWZvcmUgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotU3VuIEphbiAgOSAwNDo0MzozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RlLW5ldGJzZC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRBUkdFVF9GT1JNQVQpIFtURV9OZXRCU0RdOiBVc2UgYmZkIHRhcmdldAotCWEub3V0LW5ldGJzZC0zODYgZm9yIHRoaXMgY29uZmlndXJhdGlvbi4KLQotRnJpIEphbiAgNyAxNzozODoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBEb24ndCBjbG9iYmVyIHRoZSBFQ09GRiBzeW1ib2wgaW5mb3JtYXRpb24KLQl3aXRoIHRoZSBhc3NvY2lhdGVkIHN0YWJzIGluZm9ybWF0aW9uLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogTmV2ZXIgc2V0IHRoZSB0eXBlIG9mIHN0YWJzIHN5bWJvbHMgdG8KLQlzdF9HbG9iYWwuICBEb24ndCB1cGRhdGUgdGhlIHN5bWJvbCBpbmRleCBvciBpZmQgaWYgdGhlIGdhcyBzeW1ib2wKLQlpcyBub3QgdGhlIHNhbWUgYXMgdGhlIEVDT0ZGIHN5bWJvbCAod2hpY2ggaXMgbm93IHRoZSBjYXNlIGZvcgotCXN0YWJzIHN5bWJvbHMpLgotCi1GcmkgSmFuICA3IDExOjE0OjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBBZGQgYSBMT1NJTkdfQ09NUElMRVIgaWZkZWYgdGhhdAotCXNwbGl0cyB0aGUgZnVuY3Rpb24uCi0JKG1hY3JvMik6IE5ldyBmdW5jdGlvbiwgaWYgTE9TSU5HX0NPTVBJTEVSIGRlZmluZWQuCi0KLUZyaSBKYW4gIDcgMDk6Mzg6MjUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6ICBEb24ndCBldmVyIGZpbGwgcGFzdCB0aGUKLQllbmQgb2YgYSBzZWN0aW9uLiAod3JpdGVfb2JqZWN0X2ZpbGUpOiBUZW1wb3JhcnkgZml4IC0gc2V0dXAKLQlzdGRvdXRwdXQuCi0KLVRodSBKYW4gIDYgMTg6MDU6MjEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZiBhZGRlbmRzIGluCi0Jbm9uLXBjcmVsX29mZnNldCByZWxvY2F0aW9ucy4KLQotVGh1IEphbiAgNiAwMTowNjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBXYXJuIGFib3V0IHVzaW5nICQxIGFzIHdlbGwgYXMgJGF0Ci0Jd2l0aG91dCAuc2V0IG5vYXQuCi0KLVdlZCBKYW4gIDUgMTQ6MjI6MjIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGl0ZXJhbC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBMaXN0IGl0LgotCi0JKiBhcy5oIChERUJVRyk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGV4cHJlc3Npb25TLCBzdHJ1Y3QgZml4KTogRGVjbGFyZSBpbiBjYXNlIHRoZXkncmUgdXNlZCBpbgotCXByb3RvdHlwZXMuCi0JKGFkZF90b19saXRlcmFsX3Bvb2wpIFtCRkRfQVNTRU1CTEVSXTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9BT1VUXTogRml4IGZvciBuZXcgbmFtZXMKLQlpbiBiZmQuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2dldCk6IE5ldyBmdW5jdGlvbi4gIENyZWF0ZXMgc2VnbWVudCBpZgotCW5lZWRlZCwgcmV0dXJucyBwb2ludGVyLCBidXQgZG9lc24ndCBjaGFuZ2UgY3VycmVudCBzZWdtZW50LgotCShzdWJzZWdfbmV3KTogVXNlIGl0LgotCi1UdWUgSmFuICA0IDE1OjEyOjQzIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogQWRkICQoc3JjZGlyKS8uLiB0byBwbGFjZXMgdG8gc2VhcmNoLgotCSogY29uZmlnL29iai1lY29mZi5jOiBJbmNsdWRlIGZpbGVzIGFzICJiZmQvIiBpbnN0ZWFkIG9mICIuLi9iZmQvIi4KLQkqIGFwcC5jLCBmbG9udW0uaCwgaGV4LXZhbHVlLmMgKGNvbnN0KTogQ2hhbmdlICNpZiB0byBiZSBtb3JlCi0JcG9ydGFibGUuCi0KLVR1ZSBKYW4gIDQgMjI6MTE6MzQgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tdnN0YS5oLCBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBWU1RhCi0JbWljcm8ta2VybmVsLgotCi1UaHUgRGVjIDMwIDE1OjI3OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBub3cgdGFrZXMgYW4KLQlhZGRpdGlvbmFsIGFyZ3VtZW50LCB0byByZXR1cm4gYW4gZXJyb3Igc3RyaW5nICh3aGljaCB3ZSBpZ25vcmUpLgotCi1XZWQgRGVjIDI5IDE0OjM3OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBGaWVsZCB0Y19maXhfZGF0YSBzaG91bGQgYmUgdHlwZSBQVFIsIG5vdAotCXZvaWQqLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4gIEFkZGVkCi0Jc2luZ2xlLWJpdCBmaWVsZCAiZnhfZG9uZSIuCi0KLVN1biBEZWMgMjYgMTQ6MzE6NDcgMTk5MyAgVG9yYmpvcm4gR3Jhbmx1bmQgICh0ZWdlQGFkZGVyLmN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQ29udmVydCB0byBsb3dlciBjYXNlLgotCURlbGV0ZSBzcHVyaW91cyByZWdpc3RlciBuYW1lcyAiJXI0TCIsIGV0Yy4KLQkoc2VsZWN0b3JfdGFibGUpOiBTb3J0IGFuZCBjb252ZXJ0IHRvIGxvd2VyIGNhc2UuCi0JKGNvbnNfZml4X25ld19ocHBhKTogYHJlbG9jX3R5cGUnID0+IGByZWxfdHlwZScuCi0JKHBhX2lwKTogQWx3YXlzIHVzZSBzdHJjbXAgZm9yIG5vbi10ZXh0IGFuZCBzdHJjYXNlY21wIGZvciB0ZXh0LgotCShyZWdfbmFtZV9zZWFyY2gpOiBSZXdyaXRlIHRvIGNhbGwgc3RyY2FzZWNtcCBvbmx5IG9uY2UgcGVyCi0JaXRlcmF0aW9uLgotCShwYV9jaGtfZmllbGRfc2VsZWN0b3IpOiBSZXdyaXRlIHRvIHVzZSBiaW5hcnkgc2VhcmNoLgotCShwYV9wYXJzZV9uZWdfYWRkX2NtcGx0cik6IFVzZSBzdHJjYXNlY21wIGZvciBjb21wbGV0ZXIgY29tcGFyaXNvbnMuCi0JKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiAkVEVYVCQgYW5kICRQUklWQVRFJCBhcmUgc3ltYm9sczsgdXNlIGNhc2UKLQlzZW5zaXRpdmUgY29tcGFyaXNvbnMuCi0JKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBDYW5vbmljYWxpemUgc3RybmNhc2VjbXAgYXJnIHRvIGxvd2VyIGNhc2UuCi0JKHBhX3NwYWNlKTogIiR0ZXh0JCIgPT4gIiRURVhUJCI7ICIkcHJpdmF0ZSQiID0+ICIkUFJJVkFURSQiLiAgVXNlCi0JY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBmb3IgYWxsIHN5bWJvbGljIG5hbWVzLgotCShwYV9zdWJzcGFjZSk6IENhbm9uaWNhbGl6ZSBzdHJuY2FzZWNtcCBhcmcgdG8gbG93ZXIgY2FzZS4KLQkocGFfc3Vic3BhY2Vfc3RhcnQpOiBVc2UgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBmb3Igc3ltYm9saWMgbmFtZXMuCi0KLU1vbiBEZWMgMjAgMTA6Mzc6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpIFtSRUxPQ19SRVFVSVJFU19TWU1CT0xdOiBJZiBubwotCXN5bWJvbCBpcyBwcmVzZW50IChpLmUuLCByZWxvY2F0aW9uIGFnYWluc3QgYWJzb2x1dGUpLCBjcmVhdGUgYQotCXBob255IGxvY2FsIHN5bWJvbCwgYW5kIHVzZSBpdCBpbiB0aGUgcmVsb2MuCi0JKGZpeHVwX3NlZ21lbnQpOiBXaGVuIGFkanVzdGluZyBhIHJlbG9jIHdpdGggYW4gYWJzb2x1dGUgc3ltYm9sLAotCWhhdmUgVENfRk9SQ0VfUkVMT0NBVElPTiBjb250cm9sIGNsZWFyaW5nIGFkZF9zeW1ib2xQIHRvby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChSRUxPQ19SRVFVSVJFU19TWU1CT0wpOiBEZWZpbmUsIGZvciBPQkpfQ09GRi4KLQotCSogc3ltYm9scy5jIChTX0lTX0VYVEVSTkFMLCBTX0lTX0xPQ0FMKTogRG9uJ3QgdXNlIGJvdGggQlNGX0VYUE9SVAotCWFuZCBCU0ZfR0xPQkFMLCBzaW5jZSB0aGV5J3JlIHRoZSBzYW1lLgotCi0JKiBhcy5jIChtYWluKTogT25seSBpbnZva2UgbWRfZW5kIGlmIGl0J3MgZGVmaW5lZCBhcyBhIG1hY3JvLgotCSogdGMuaCAobWRfZW5kKTogRG9uJ3QgZGVjbGFyZSBpdC4KLQkqIGNvbmZpZy90Yy0qLltjaF0gKG1kX2VuZCk6IERlbGV0ZWQsIGluIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgZG8KLQlhbnl0aGluZy4KLQkqIGNvbmZpZy90Yy12YXguYyAodmlwX2VuZCk6IERlbGV0ZWQgbnVsbCBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX21pcHNfZW5kKTogUmVuYW1lZCBmcm9tIG1kX2VuZC4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1kX21pcHNfZW5kKTogRGVjbGFyZS4KLQkobWRfZW5kKTogTmV3IG1hY3JvLCBjYWxscyBtZF9taXBzX2VuZC4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCBjbG9zZSBvdXRwdXQgZmlsZS4KLQkqIGFzLmMgKG1haW4pOiBDbG9zZSBvdXRwdXQgZmlsZSAoaWYgbmVlZGVkKSBhZnRlciBjYWxsaW5nCi0JbGlzdGluZ19wcmludCwgd2hpY2ggc2hvdWxkIGJlIGFmdGVyIGNhbGxpbmcgd3JpdGVfb2JqZWN0X2ZpbGUsCi0Jd2hpY2ggc2V0cyB0aGUgZnJhZyBhZGRyZXNzZXMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9saW5lLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfc2l6ZSwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLAotCW9ial9jb2ZmX3ZhbCk6IEFkZCB1bnVzZWQgaW50IGFyZ3VtZW50IHRvIHNhdGlzZnkgcHJvdG90eXBlczsgZ29lcwotCXdpdGggSWFuJ3MgMTAgU2VwIGNoYW5nZXMuCi0JKFNfR0VUX0RBVEFfVFlQRSwgU19TRVRfREFUQV9UWVBFLCBTX0dFVF9TVE9SQUdFX0NMQVNTLAotCVNfU0VUX1NUT1JBR0VfQ0xBU1MpOiBOb3cgZnVuY3Rpb24gaW5zdGVhZCBvZiBtYWNyb3MuCi0JKG9ial9lbWl0X2xpbmVubykgW0JGRF9BU1NFTUJMRVJdOiBEZWxldGVkLgotCSh0YWdfaW5zZXJ0KTogTG9jYWwgdmFyIEVSUk9SX1NUUklORyBpcyBjb25zdC4gIFVzZSAiY29uc3QiIG5vdAotCSJDT05TVCIgZm9yIGFyZ3VtZW50IE5BTUUuICBGaXhlZCBwcm90b3R5cGUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIGV4cGxpY2l0ICIjaWYgMSIgZGlyZWN0aXZlLiAgSWYKLQlTX0lTX0VYVEVSTkFMLCBzZXQgc3RvcmFnZSBjbGFzcyB0byBDX0VYVC4KLQkoc19nZXRfbmFtZSk6IFVzZSAiY29uc3QiIG5vdCAiQ09OU1QiLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfR0VUX0RBVEFfVFlQRSwgU19TRVRfREFUQV9UWVBFLAotCVNfR0VUX1NUT1JBR0VfQ0xBU1MsIFNfU0VUX1NUT1JBR0VfQ0xBU1MpOiBEZWxldGVkLgotCShvYmpfZW1pdF9saW5lbm8pOiBEZWNsYXJlIG9ubHkgZm9yIG5vbi1CRkRfQVNTRU1CTEVSLiAgRm9yCi0JQkZEX0FTU0VNQkxFUiwgZGVmaW5lIGFzIG1hY3JvIHRoYXQgYWJvcnRzLgotCShvYmpfZXh0cmFfc3R1ZmYsIHRjX2hlYWRlcnNfaG9vayk6IERlY2xhcmUgb25seSBmb3IKLQlub24tQkZEX0FTU0VNQkxFUi4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IEZpeCBwcm90b3R5cGUuCi0KLVN1biBEZWMgMTkgMDA6Mzc6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogVGVzdCBvZiBwY3JlbF9vZmZzZXQgaGFkIHNlbnNlCi0JcmV2ZXJzZWQuCi0KLVRodSBEZWMgMTYgMjE6MTM6MTEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSAiZHVtbXlfbGFiZWwiLgotCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogRm9yIHJlbG9jYXRpb25zIHdoaWNoIGhhdmUgbm8gc3ltYm9sLAotCXNldCBzeW1fcHRyX3B0ciB0byBkdW1teV9sYWJlbC4gIEF2b2lkcyBsb3NzYWdlIGluIGdlbmVyaWMgQkZEIGNvZGUuCi0KLVRodSBEZWMgMTYgMTY6MDc6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChsZXhfdHlwZSk6IE5vIGxvbmdlciBtYWtlICdbJyBhIHZhbGlkIGNoYXJhY3RlciBmb3IKLQlzeW1ib2wgbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBMb2NhbCB2YXJpYWJsZQotCU5CWVRFU19SX0xFTkdUSCBub3cgY29uc3QuCi0KLQkqIGNvbmZpZy9vYmotKi5jLCBjb25maWcvdGMtKi5jOiBPbWl0IHN1cGVyZmx1b3VzICJyZXR1cm4iCi0Jc3RhdGVtZW50cyBhdCBlbmRzIG9mIGZ1bmN0aW9ucy4gIERvbid0IGNoZWNrIGZvciBudWxsIHJldHVybiBmcm9tCi0JaGFzaF9uZXcsIHNpbmNlIGl0IHdvbid0IHJldHVybiBhdCBhbGwgaWYgdGhlcmUncyBubyBtZW1vcnkKLQlhdmFpbGFibGUuICBBbHNvLCBjaGVjayBmb3IgbnVsbCByZXR1cm4gZnJvbSBoYXNoX2luc2VydCwgcmF0aGVyCi0JdGhhbiB6ZXJvLWxlbmd0aCBzdHJpbmcsIGFzIHN1Y2Nlc3MgaW5kaWNhdG9yLgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWN0aW9uX3N5bWJvbCk6IERlY2xhcmUuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFVzZSBpdC4KLQotV2VkIERlYyAxNSAxNTozOTo1MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IE5ldyB2YXJpYWJsZS4KLQkoQ0hFQ0tGTEFHUyk6IFBhc3MgaXQgZG93bi4KLQotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2ZyYW1lKTogUGVybWl0IGV4dHJhIHRyYWlsaW5nIG9wZXJhbmRzOwotCXVudXNlZCBmb3Igbm93LCBidXQgc3VwcGxpZWQgYnkgQWxwaGEgT1NGMSBjb21waWxlci4KLQotCSogYXMuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JKGludF90b19nZW4pOiBEb24ndCBkZWNsYXJlLgotCi0JKiBjb25maWcvYXRvZi12YXguYyAoYXRvZl92YXgpOiBOVUxMIGlzIG5vdCBhIHZhbGlkIGNoYXJhY3RlcgotCWNvbnN0YW50LgotCi1UdWUgRGVjIDE0IDIxOjM4OjI1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotb3NmKik6IERvIG5vdCBjb25zaWRlciB0aGlzIGEgZGV2ZWxvcG1lbnRhbAotCWNvbmZpZ3VyYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBjYXNlcyB3aGVyZSBubwotCXJlbG9jYXRpb24gd2lsbCBiZSBlbWl0dGVkIGZvciAzMmJpdCBmb3JtYXRzLgotCi1Nb24gRGVjIDEzIDIzOjMzOjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEbyBub3QgY2FsbCBocHBhX2ZpZWxkX2FkanVzdAotCWZvciBhbnkgb2YgdGhlICdUJyBmaWVsZCBzZWxlY3RvcnMuCi0KLVNhdCBEZWMgMTEgMTE6MjM6MTIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChidWlsZF9ieXRlcyk6IEdldCByZWxvYyB0eXBlIHJpZ2h0IGZvciBhCi0JJXBhZ2Ugb3BlcmF0aW9uLiAobWRfYXNzZW1ibGUpOiBEb24ndCBtb2RpZnkgaW5wdXRfbGluZV9wb2ludGVyLgotCShtZGNvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy16OGsuYyAoZ2V0X29wZXJhbmQpOiBEZWxldGUgYm9ndXMgY2hlY2suCi0KLVdlZCBEZWMgIDggMTY6MzE6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChudW1iZXJfdG9fY2hhcnNfKik6IERlbGV0ZSBib2d1cyByYW5nZSBjaGVjay4KLQotCSogb3V0cHV0LWZpbGUuYyAoVEFSR0VUX0FSQ0gpOiBObyBkZWZhdWx0LgotCi1UdWUgRGVjICA3IDE2OjAyOjUzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBUcnVuY2F0ZSBkaXNwcyBiZWZvcmUgY2FsbGluZwotCW1kX251bWJlcl90b19jaGFycy4gIChtZF9hc3NlbWJsZSk6IERvbid0IG1vZGlmeQotCWlucHV0X2xpbmVfcG9pbnRlci4KLQotTW9uIERlYyAgNiAxMTo0OTowMyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCB1cGRhdGUgaW5wdXRfbGluZV9wb2ludGVyLgotCi1Nb24gRGVjICA2IDExOjIwOjAyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5bY2hdIChvYmpfcmVhZF9iZWdpbl9ob29rKTogUmVtb3ZlIGxhc3QgY2hhbmdlLgotCUJyZWFrcyB3aXRoIHRoZSBIUCBjb21waWxlcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBjYWxsX2luZm8pOiBSZW1vdmUgZmllbGRzIHdoaWNoIHdlcmUKLQlzZXQgYnV0IG5ldmVyIHVzZWQuICBSZW1vdmUgYWxsIGNvZGUgd2hpY2ggc2V0cyB0aG9zZSBmaWVsZHMuCi0JKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogTGlrZXdpc2UuCi0JKHBhX2Rlc2MpOiBEZWxldGUgdXNlbGVzcyBmdW5jdGlvbi4gIERlbGV0ZSBhbGwgcmVmZXJlbmNlcy4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTm8gbmVlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm9yCi0JdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4KLQotU3VuIERlYyAgNSAxNzowNToyOSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uKTogUGFzcyB2ZXJzaW9uIHN0cmluZyB0bwotCVNPTSBCRkQgYmFja2VuZC4KLQkob2JqX3NvbV9jb3B5cmlnaHQpOiBOZXcgZnVuY3Rpb24uICBNdWNoIGxpa2Ugb2JqX3NvbV92ZXJzaW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChvYmpfY29weXJpZ2h0KTogRGVmaW5lIGFzIGFwcHJvcHJpYXRlIGZvcgotCVNPTSBhbmQgRUxGLgotCShwYV9jb3B5cmlnaHQpOiBKdXN0IGEgc3R1YiBub3cuCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3JlYWRfYmVnaW5faG9vayk6IFByb3ZpZGUgZHVtbXkgZGVmaW5pdGlvbi4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEZWxldGUuICBTT00gaXNuJ3QgbWFraW5nIHVzZSBvZiB0aGVtLgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIHJlbG9jYXRpb24KLQlleHBhbnNpb24gZHVlIHRvIHJvdW5kaW5nIG1vZGUgc2VsZWN0b3JzLiAgSGFuZGxlIFJfW1JEU05dX01PREUKLQlyZWxvY2F0aW9ucyBmb3Igc2VsZWN0aW5nIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGV2YWx1YXRlX2Fic29sdXRlKTogU3VwcG9ydCBlX3Jyc2VsIGFuZAotCWVfcmxzZWwgZmllbGQgc2VsZWN0b3JzLgotCi1GcmkgRGVjICAzIDE4OjMzOjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaDogSWYgRUNPRkZfREVCVUdHSU5HLCB1bmRlZgotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMgYW5kIElOSVRfU1RBQl9TRUNUSU9OLCBhbmQgZGVmaW5lCi0JT0JKX1BST0NFU1NfU1RBQiB0byBjYWxsIGVjb2ZmX3N0YWIuCi0JKiBjb25maWcvb2JqLWVsZi5jOiBEb24ndCBjb21waWxlIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gaWYKLQlJTklUX1NUQUJfU0VDVElPTiBpcyBub3QgZGVmaW5lZC4KLQotRnJpIERlYyAgMyAxMDo1Njo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRGVsZXRlIG9sZCB3cmFwcGVyIGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXhfMSk6IFJlbmFtZSB0byBtZF9hcHBseV9maXguICBGaXggYXJndW1lbnQgZGVjbHMuCi0JRml4IGNvbW1lbnRzIGluIHZhcmlvdXMgcGxhY2VzLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCUF2b2lkIGRlcmVmZXJlbmNpbmcgYSBOVUxMIGZ4X2FkZHN5LgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBBdm9pZCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBmeF9hZGRzeS4KLQotCUZyaSBEZWMgIDMgMDk6NDc6MzAgMTk5MyAgUGV0ZSBIb29nZW5ib29tICAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCi0JKiB0Yy1ocHBhLmM6ICh0Y19nZW5fcmVsb2MpOiBBZGRlbmQgZm9yIGEgcGxhYmVsIHJlbG9jYXRpb24gc2hvdWxkCi0JYmUgZWl0aGVyIDAgb3IgMiAobm8gc3RhdGljIGxpbmsgb3Igc3RhdGljIGxpbmsgcmVxdWlyZWQpLiAgQWx3YXlzCi0JYXNzdW1lIG5vIHN0YXRpYyBsaW5rLgotCi1UaHUgRGVjICAyIDExOjUyOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogTWFrZSBhZGp1c3RtZW50IHRvIGFkZGVuZCBiZQotCWRlcGVuZGVudCBvbiBob3d0byBmaWVsZHMsIG5vdCBvbiBmb3JtYXQgZmxhdm91ci4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBOZXcgZmllbGRzIHN5X29iaiBhbmQgc3lfdGMsCi0JZGVmaW5lZCBhcyB0eXBlcyBPQkpfU1lNRklFTERfVFlQRSBhbmQgVENfU1lNRklFTERfVFlQRSwgaWYgdGhvc2UKLQltYWNyb3MgYXJlIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVENfU1lNRklFTERfVFlQRSwgT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTLCBJOTYwX1NZTV9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKHN5X3RjLCBzeV9vYmopOiBEZWZpbmUgc28gdGhhdCB0aGUgZmllbGRzIGxvb2sgbGlrZSB0aGV5IHVzZWQgdG8sCi0JdW50aWwgYWxsIHJlZmVyZW5jZXMgZ2V0IGNoYW5nZWQuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBMb3RzIG9mIHZhcmlhYmxlcyBubyBsb25nZXIgcmVnaXN0ZXIuCi0JUmVvcmRlcmVkIHNvbWUgY29kZSBmb3IgZWFzaWVyIHJlYWRpbmcuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGltKTogZGltX2luZGV4IG5vIGxvbmdlciByZWdpc3Rlci4KLQlEZWxldGVkIHN1cGVyZmx1b3VzIHJldHVybiBzdGF0ZW1lbnQuCi0JKG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsIG9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdHlwZSwKLQlvYmpfY29mZl92YWwsIHRhZ19pbml0LCB0YWdfaW5zZXJ0KTogRGVsZXRlZCBzdXBlcmZsdW91cyByZXR1cm4KLQlzdGF0ZW1lbnQuCi0JKGFsaWduLCBvYmpfY29mZl9zZWN0aW9uKTogRGVsZXRlZCBkZWJ1Z2dpbmcgcHJpbnRmcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRGlzY2FyZCBzb21lIHJlZ2lzdGVyIGRlY2xzLgotCVVzZSBhc3NpZ25tZW50IHJhdGhlciB0aGFuIG1lbWNweSB0byBjb3B5IHRlbXBsYXRlLgotCShvcF9oYXNoLCByZWdfaGFzaCwgcHJlZml4X2hhc2gpOiBEZWZhdWx0IEMgaW5pdGlhbGl6YXRpb24gb2YKLQlzdGF0aWNzIGlzIHN1ZmZpY2llbnQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAocHJpbnRfaW5zbik6IEFycmF5IFJlbG9jIGlzIG5vdyBjb25zdCwgYW5kCi0JcG9pbnRzIHRvIGNvbnN0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCk6IE9ubHkgdXNlIGNvZmYtc3BhcmMtbHlueCBpZgotCVRFX0xZTlg7IHVzZSBjb2ZmLXNwYXJjIG90aGVyd2lzZS4KLQlbVVNFX05BVElWRV9IRUFERVJTXTogRGVsZXRlIHRoaXMgY29kZTsgaXQgaXNuJ3QgdXNlZC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENhbGwgVENfVkFMSURBVEVfRklYLCBpZiBkZWZpbmVkLAotCWJlZm9yZSBwcm9jZXNzaW5nIGEgZml4dXAuICBDYWxsIFRDX0FESlVTVF9SRUxPQ19DT1VOVCBqdXN0IGJlZm9yZQotCXJldHVybmluZy4gIFJlbW92ZSBzb21lIGk5NjAtY29mZi1zcGVjaWZpYyBjb2RlLgotCShUQ19BREpVU1RfUkVMT0NfQ09VTlQpOiBEZWZhdWx0IHRvIGRvaW5nIG5vdGhpbmcuCi0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19BREpVU1RfUkVMT0NfQ09VTlQpIFtPQkpfQ09GRl06IERlZmluZS4KLQkoaTk2MF92YWxpZGF0ZV9maXgpOiBEZWNsYXJlLgotCShUQ19WQUxJREFURV9GSVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTk2MC5jIChpOTYwX3ZhbGlkYXRlX2ZpeCk6IE5ldyBmdW5jdGlvbi4KLQotCSogd3JpdGUuYyAobnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbik6IE5ldyBmdW5jdGlvbi4gIFdyaXRlIG91dAotCWJ5dGVzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIsIGRvaW5nIHNpemUgYW5kIHJhbmdlIGNoZWNraW5nLgotCShudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuKTogTmV3IGZ1bmN0aW9uLCBzaW1pbGFyLgotCSogd3JpdGUuaDogRGVjbGFyZSB0aGVtLgotCSogY29uZmlnL3RjLSouYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogVXNlIHRoZW0uCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2FwcGx5X2ZpeCk6IERpdHRvLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4KTogRGl0dG8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBSZWFycmFuZ2VkIGNvZGUgZm9yIGhhbmRsaW5nIGxpbmUgbnVtYmVyCi0JZGF0YS4KLQkobGluZV9mc3ltKTogUmVuYW1lZCBmcm9tIGZ1bmN0aW9uX2xpbmVvZmYgaW4gQkZEX0FTU0VNQkxFUiBjYXNlLAotCXNpbmNlIHRoZSB1c2FnZSBpcyBkaWZmZXJlbnQgZnJvbSBub24tQkZEX0FTU0VNQkxFUiBjYXNlLgotCShpbl9mdW5jdGlvbiwgY2xlYXJfZnVuY3Rpb24sIHNldF9mdW5jdGlvbik6IE5ldyBtYWNyb3MsIHRvCi0JY29tYmluZSBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGluIGRpZmZlcm5ldCB3YXlzIGluCi0JQkZEX0FTU0VNQkxFUiBhbmQgbm9uLS4uLiBjb2RlLiAgVXNlZCBpbiBvdGhlciBmdW5jdGlvbnMgdGhhdCB1c2VkCi0JdG8gY2hlY2sgZnVuY3Rpb25fbGluZW9mZiAmYy4KLQkob2JqX2VtaXRfbGluZW5vKTogU3BsaXQgaW50byB0d28gY29waWVzLCBvbmUgZm9yIEJGRF9BU1NFTUJMRVIsCi0Jb25lIGZvciBub3QuICBOb24tQkZEX0FTU0VNQkxFUiB2ZXJzaW9uIG5vdyBoYXMgdGVtcG9yYXJ5IHZhcmlhYmxlCi0JdG8gY29udGFpbiBjaGFyKiBwb2ludGVyIHBvaW50ZWQgdG8gYnkgY2hhcioqIGFyZ3VtZW50LiAgQWx3YXlzCi0JZm9sbG93IENST1NTX0NPTVBJTEUgY29kZTsgZWFzaWVyIHRvIHJlYWQgdGhhdCB3YXkuCi0JKG9ial9jb2ZmX2xuKTogRG9uJ3QgY2FsbCBhZGRfbGluZW5vIG9yIGNfbGluZV9uZXcgaWYgYXBwbGluZSBpcwotCXNldC4KLQkob2JqX2NvZmZfZW5kZWYpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IKLQkiLmJmIiwgaXQncyBiZWVuIGRvbmUgZWxzZXdoZXJlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogSWYgaWxuZSBudW1iZXIgZGF0YSBpcyBwZW5kaW5nLCBjYWxsCi0JYWRkX2xpbmVzeW0gdG8gZmx1c2ggaXQuCi0JKGNvZmZfZnJvYl9maWxlKTogRG9uJ3QgZG8gdGhhdCBoZXJlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfZnJvYl9maWxlKTogRGVjbGFyZS4KLQkob2JqX2Zyb2JfZmlsZSk6IERlZmluZSwgdG8gY2FsbCBpdC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4OiBEZWZpbmUgdGhlbSBhcyBtYWNyb3MgY2FsbGluZwotCWFzX2ZhdGFsLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IERvbid0IGRlZmluZSB0aGVtIGFzIGZ1bmN0aW9ucy4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgdGFyZ2V0IGFscGhhLSotb3NmKi4gIChObyBjcHUgZmlsZXMgeWV0LikKLQotV2VkIERlYyAgMSAyMzozNzoxNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUgKGNsZWFuKTogRGVwZW5kIG9uIGNsZWFuLWhlcmUuCi0KLVdlZCBEZWMgIDEgMTE6MzU6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLWdvMzIuaDogSW5jbHVkZSBmb3Blbi1iaW4uaC4KLQkqIGFzLmg6IElmIEZPUEVOX1dCIGlzbid0IGRlZmluZWQsIGluY2x1ZGUgZm9wZW4tc2FtZS5oLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogVXNlIEZPUEVOX1dCIGluc3RlYWQgb2YgInciLgotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX29wZW4pOiBVc2UgRk9QRU5fUlQgaW5zdGVhZCBvZiAiciIuCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mbyk6IFVzZSBGT1BFTl9SQiBpbnN0ZWFkIG9mICJyYiIuCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IFVzZSBGT1BFTl9SVCBpbnN0ZWFkIG9mICJyIi4KLQotCSogc3RhYnMuYzogSW5jbHVkZSBvYnN0YWNrLmguCi0KLQkqIHRjLmggKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEb24ndCBkZWNsYXJlIGlmIGl0J3MgYWxyZWFkeQotCWRlZmluZWQgYXMgYSBtYWNyby4KLQkobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRGl0dG8uCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcikgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX2Vycm1zZyBpbnN0ZWFkCi0Jb2Ygc3RyZXJyb3IuICBDbGVhciBiZmRfZXJyb3IuCi0KLQkqIGNvbmZpZy90ZS1seW54LmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZSwgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCi1XZWQgRGVjICAxIDEwOjQxOjU2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkocGFfcHJvY2Vzc19leGl0LCBwYV9wcm9jZW5kKTogQ2FsbCBpdCBmb3IgRUxGIG9iamVjdHMuCi0KLVdlZCBEZWMgIDEgMTI6MTA6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFN1YnRyYWN0IDggZnJvbSBvZmZzZXQgaW4gbm9uIFBJQyBsLmQKLQljYXNlLiAgU2VlIGNvbW1lbnQuICBGcm9tIHdpbHNvbkBjeWdudXMuY29tOiBmb3IgTV9MX0RBQiwgc2V0Ci0JY29wcm9jIGJlZm9yZSBkb2luZyBnb3RvIGxkLgotCi1UdWUgTm92IDMwIDEzOjQwOjMwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB3cml0ZS5jIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogUHJvdmlkZSBhIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkoZml4dXBfc2VnbWVudCk6IEFsbG93IHRoZSB0YXJnZXQgbWFjaGluZSB0byBzcGVjaWZ5IHRoYXQgYQotCXJlbG9jYXRpb24gbXVzdCBiZSBnZW5lcmF0ZWQgZm9yIGEgcGFydGljdWxhciBmaXh1cC4gIFJlbW92ZQotCSNpZm5kZWYgVENfSFBQQSBoYWNrLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IE5ldmVyIGNoYW5nZSBmeF9hZGRzeSB0bwotCWJlIE5VTEwuICBPbmx5IGZpeHVwX3NlZ21lbnQgaXMgc3VwcG9zZWQgdG8gZG8gdGhhdC4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgTm92IDMwIDExOjIxOjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0YWJzLm8pOiBBZGRlZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRG9uJ3QgY2FsbCBiZmRfc2V0X3N5bXRhYi4KLQotU3VuIE5vdiAyOCAxMjoxMTo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IE91dHB1dCBhIFRBQiBiZWZvcmUgYW55Ci0JLmFwcCogZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBNYWtlIHN1cmUgYSBzdWJfc3ltYm9sCi0JZXhpc3RzIGJlZm9yZSB0cnlpbmcgdG8gcGVlayBhdCBpdHMgbmFtZS4KLQkocGFfc3BhY2UpOiBEbyBub3QgY2FsbCBwYV9hbGlnbl9zdWJzZWcuICBTZWUgaHBwYS91bnNvcnRlZC9hbGlnbjMucwotCWZvciB0ZXN0Y2FzZS4KLQkocGFfYWxpZ25fc3Vic2VnKTogRGVsZXRlIHVudXNlZC91bndhbnRlZCBmdW5jdGlvbi4KLQotU2F0IE5vdiAyNyAyMjo0OTowNyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBGaXggdGVzdCBmb3Igd2hlbiB0byBzdGljayBhIGNvbG9uCi0Jb24gdGhlIGVuZCBvZiBhIGxhYmVsLiAgTWFrZSBjb2RlIGNvbmRpdGlvbmFsIG9uIGVpdGhlciBNUkkgb3IKLQlMQUJFTFNfV0lUSE9VVF9DT0xPTlMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBhIGxpbmUgYmVnaW5zIHdpdGggd2hpdGVzcGFjZSwgbGVhdmUKLQl0aGUgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGFsb25lLiAgRWF0IGFsbCBvdGhlcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKExBQkVMU19XSVRIT1VUX0NPTE9OUyk6IERlZmluZS4KLQotV2VkIE5vdiAyNCAwMToyMjo1NCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IERvIG5vdCBjYWxsIHByb2Nlc3NfZXhpdC4KLQkoZXhpdF9wcm9jZXNzaW5nX2NvbXBsZXRlKTogRGVsZXRlIHVud2FudGVkIHZhcmlhYmxlIGFuZCBhbGwKLQlyZWZlcmVuY2VzLgotCi1XZWQgTm92IDI0IDAyOjMxOjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0dXBfZXh0KTogUmVuYW1lZCBmcm9tIGVjb2ZmX2J1aWxkX2V4dC4KLQlDaGFuZ2VkIHRvIG5vdCBhY3R1YWxseSBidWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLCBhcwotCXRoYXQgaXMgbm93IGRvbmUgYnkgdGhlIEVDT0ZGIGJhY2sgZW5kLgotCShlY29mZl9idWlsZF9kZWJ1Zyk6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiBlY29mZi5oIChvYmpfZWNvZmZfc2V0X2V4dCk6IERlY2xhcmUuICAgb2JqLWZvcm1hdC5jIGZ1bmN0aW9uCi0JY2FsbGVkIGJ5IGVjb2ZmX3NldHVwX2V4dC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogSWYgZGVidWdfaW5mbyBjb3VudCBpcyAwLAotCXNldCBjb3JyZXNwb25kaW5nIHBvaW50ZXIgdG8gTlVMTC4gIERvbid0IHNldCByYXdfc2l6ZSBhbmQKLQlyYXdfc3ltZW50cy4KLQkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBSZW1vdmVkLgotCShvYmpfZWNvZmZfc2V0X2V4dCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX3NldF9zeW1faW5kZXgpOiBEb24ndCBkZWZpbmUuCi0JKG9ial9lY29mZl9zZXRfc3ltX2luZGV4KTogRG9uJ3QgZGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lY29mZl9zZXRfZXh0LCBlbGZfZ2V0X2V4dHIsCi0JZWxmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMgdXNlZCBmb3IgRUNPRkZfREVCVUdHSU5HLgotCShlbGZfZnJvYl9maWxlKTogUmV3b3JrZWQgRUNPRkYgZGVidWcgZ2VuZXJhdGlvbiB0byB1c2UKLQluZXcgZnVuY3Rpb25zIGluIGJmZC9lY29mZmxpbmsuYy4KLQotU3VuIE5vdiAyMSAyMzo1NDo1MiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcyk6IE9ubHkgY3JlYXRlIHRoZSB1bndpbmQKLQlzdWJzcGFjZSBmb3IgRUxGLiAgSW4gdGhlIFNPTSB3b3JsZCwgdGhlIGxpbmtlciBpcyByZXNwb25zaWJsZQotCWZvciBjcmVhdGluZyB0aGUgdW53aW5kIHN1YnNwYWNlcy4KLQotRnJpIE5vdiAxOSAxNjoyNTowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBVc2UgUEFSQU1TIHJhdGhlciB0aGFuIEVYRlVOLgotCSh5YW5rX3N5bWJvbHMpOiBEb24ndCBjYWxsIFNfU0VUX0VYVEVSTkFMIGlmIHRoZSBzdG9yYWdlIGNsYXNzIGlzCi0JYWxyZWFkeSBzZXQuICBGaXhlcyAuZGVmIHZhcjsgLnZhbCBleHRlcm5hbF92YXI7IC5zY2wgMzsgLmVuZGVmLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlIHJldHVybiB0eXBlLiAgUmVtb3ZlCi0JdW51c2VkIHZhcmlhYmxlcy4KLQotCSogY29uZmlnL3RjLWkzODYuaDogRGVjbGFyZSB0Y19jb2ZmX2ZpeDJydHlwZSBhbmQKLQl0Y19jb2ZmX3NpemVtYWNoZGVwLgotCi1GcmkgTm92IDE5IDA0OjMzOjU5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXNhYmxlIG9ial9jaGVja19maWxlX3N5bWJvbHMKLQlob29rOyBvbmx5IGJhY2sgZW5kIHVzaW5nIGl0IHdhc24ndCB1c2luZyBpdCBjb3JyZWN0bHkuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQWx3YXlzIGNhbGwgb2JqX2Zyb2Jfc3ltYm9sIGFuZAotCXRjX2Zyb2Jfc3ltYm9sOyBhbHdheXMgcmV0YWluIHN5bWJvbCBpZiBpdCdzIHVzZWQgYnkgYSByZWxvY2F0aW9uLAotCXJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGVzZSByb3V0aW5lcyBpbmRpY2F0ZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogUmVuYW1lZCBmcm9tCi0JY29mZl9jaGVja19maWxlX3N5bWJvbHMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2NoZWNrX2ZpbGVfc3ltYm9scyk6IERlbGV0ZWQuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9zeW1ib2wpOiBDYWxsIGl0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbiwgb2JqX2VtaXRfc3RyaW5ncywKLQlvYmpfcHJlX3dyaXRlX2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKGNfc2VjdGlvbl9oZWFkZXIpOiBEaXR0by4gIERlbGV0ZSBzdXBlcmZsdW91cyByZXR1cm4gYXQgZW5kIG9mCi0JZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIFtUQ19TUEFSQ106IEluY2x1ZGUgY29mZi9zcGFyYy5oLCBhbmQgc3BlY2lmeQotCWNvZmYtc3BhcmMtbHlueC4KLQkoU0FfR0VUX1NZTV9UQUdORFgpOiBVc2UgQkZEX0hFQURFUlMgdmVyc2lvbiBmb3IgQkZEX0FTU0VNQkxFUgotCXRvby4KLQkoY19zZWN0aW9uX2hlYWRlcik6IFJld3JpdGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY29udGFpbnMgbm8KLQlwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZXMuICBEb24ndCBkZWNsYXJlIGl0IGF0IGFsbCBpZgotCUJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbHlueG9zKTogTmV3IHRhcmdldCwgdXNpbmcgY29mZiBhbmQKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBzdGFicy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBMaXN0IGl0LgotCSogcmVhZC5jIChTVEFCX1NFQ1RJT05fTkFNRSwgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FLAotCWdldF9zdGFiX3N0cmluZ19vZmZzZXQsIHNfc3RhYl9nZW5lcmljLCBzX3N0YWIsIHNfeHN0YWIsIHNfZGVzYyk6Ci0JTW92ZWQgdG8gbmV3IGZpbGUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgY29mZiBmaWxlcyBsaWtlIGVsZgotCWZpbGVzLgotCi1XZWQgTm92IDE3IDE3OjIzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotaXJpeDUqKTogTmV3IHRhcmdldC4gIFVzZSBlbGYgYW5kIG1pcHMtYmlnLgotCSogY29uZmlnL29iai1lbGYuYzogSWYgRUNPRkZfREVCVUdHSU5HLCBpbmNsdWRlIGVjb2ZmLmguCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGRlZmluZSBFQ09GRgotCXBzZXVkby1vcHMuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2spOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGNhbGwKLQllY29mZl9yZWFkX2JlZ2luX2hvb2suCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGNhbGwKLQllY29mZl9zeW1ib2xfbmV3X2hvb2suCi0JKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBDYXN0IGFsbG9jYSByZXN1bHQuCi0JKGVsZl9mcm9iX2ZpbGUpOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGZpbmlzaCB1cCBFQ09GRiBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiBhbmQgd3JpdGUgaXQgb3V0IGludG8gLm1kZWJ1ZyBzZWN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTKTogTmV3IG1hY3JvLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IFVzZSBFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMuCi0JKEVDT0ZGX0RFQlVHR0lORyk6IERlZmluZSBpZiBUQ19NSVBTLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IElmIEVDT0ZGX0RFQlVHR0lORywgb3ZlcnJpZGUgdG8gYWRkCi0JZmllbGRzIHJlcXVpcmVkIGJ5IEVDT0ZGLgotCSogY29uZmlnL3RjLW1pcHMuYzogQ2hlY2sgRUNPRkZfREVCVUdHSU5HIHJhdGhlciB0aGFuCi0JT0JKX0VDT0ZGIGluIG1hbnkgY2FzZXMuCi0JKG1pcHNfYW55X25vcmVvcmRlcik6IE5ldyB2YXJpYWJsZS4KLQkobWlwc19jcHJlc3RvcmVfb2Zmc2V0KTogSW5pdGlhbGl6ZSB0byAtMS4KLQkobWlwc19mcmFtZV9yZWcpOiBOZXcgdmFyaWFibGUuCi0JKFJFTEFYX0VOQ09ERSwgUkVMQVhfT0xELCBSRUxBWF9ORVcsIFJFTEFYX1JFTE9DMSwKLQlSRUxBWF9SRUxPQzIsIFJFTEFYX1JFTE9DMywgUkVMQVhfV0FSTik6IE5ldyBtYWNyb3MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEhhbmRsZSAiZ3B3b3JkIiBhbmQgImNwYWRkIi4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIG9rIHRvIGZhbHNlLiAgSWYgT0JKX0VMRiwgc2V0IGFsaWdubWVudAotCW9mIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0byA0LiAgU2V0IGFsaWdubWVudCBvZgotCS5yZWdpbmZvIHNlY3Rpb24gdG8gMi4gIElmIEVDT0ZGX0RFQlVHR0lORywgY3JlYXRlIC5tZGVidWcKLQlzZWN0aW9uLgotCShBTElHTl9FUlIsIEFMSUdOX0VSUjIpOiBSZW1vdmVkIHVudXNlZCBhbmQgdXNlbGVzcyBhbGlnbm1lbnQKLQljaGVjay4KLQkoYXBwZW5kX2luc24sIG1hY3JvX2J1aWxkLCBtYWNyb19idWlsZF9sdWkpOiBUYWtlIHBsYWNlCi0JYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShhcHBlbmRfaW5zbik6IElmIGFwcGVuZGluZyBhIG5vcCwgZG9uJ3QgZW1pdCBvbmUuCi0JKG1hY3JvX2J1aWxkKTogQ2hhbmdlZCBhc3NlcnRpb24gZm9yICdpJywgJ2onLCAnbycgY2FzZS4KLQkoZ3BfcmVmZXJlbmNlKTogUmVtb3ZlZC4KLQkobG9hZF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgotCShtYWNybyk6IElmIG1pcHNfbm9yZW9yZGVyIGlzIHVzZWQsIHNldCBtaXBzX2FueV9ub3Jlb3JkZXIuCi0JRXh0ZW5zaXZlIGNoYW5nZXMgdG8gaGFuZGxlIEdQIGFuZCBQSUMgc3ltYm9scyBkaWZmZXJlbnRseS4KLQlCdWlsZCBib3RoIHBvc3NpYmxlIGNvZGUgY2hvaWNlcyB1c2luZyBhIHZhcmlhbnQgZnJhZywgYW5kCi0JbWFrZSBhIGZpbmFsIGRlY2lzaW9uIGF0IHRoZSBlbmQgb2YgYXNzZW1ibHkgd2hlbiBhbGwKLQlpbmZvcm1hdGlvbiBpcyBrbm93bi4gIEFkZGVkIFBJQyBzdXBwb3J0IGZvciBhbGwgc3ltYm9sCi0JcmVmZXJlbmNlcy4KLQkobWlwc19pcCk6IERvbid0IHBlcm1pdCBhbnl0aGluZyBidXQgYSBudW1iZXIgYWZ0ZXIgJCBmb3IgYQotCWNvcHJvY2Vzc29yIHJlZ2lzdGVyLiAgRG9uJ3QgdXNlIC5saXQ0IG9yIC5saXQ4IHNlY3Rpb25zIHdoZW4KLQlnZW5lcmF0aW5nIFBJQyBjb2RlLiAgSWYgT0JKX0VMRiwgc2V0IGFsaWdubWVudCBvZiAubGl0NCBvcgotCS5saXQ4IHNlY3Rpb24gdG8gNC4KLQkobWRfYXBwbHlfZml4KTogQWNjZXB0IGFuZCBpZ25vcmUgR09UMTYgYW5kIEdQUkVMMzIgcmVsb2NzLgotCShzX2NoYW5nZV9zZWMpOiBTZXQgYWxpZ25tZW50IG9mIEVMRiAucm9kYXRhIG9yIC5zZGF0YSBzZWN0aW9uCi0JdG8gNC4KLQkoc19taXBzc2V0KTogSWYgLnNldCBub3Jlb3JkZXIsIHNldCBtaXBzX2FueV9ub3Jlb3JkZXIuCi0JKHNfY3Bsb2FkKTogSWdub3JlIC5jcGxvYWQgaWYgbm90IGdlbmVyYXRpbmcgUElDIGNvZGUuICBXYXJuCi0JaWYgLmNwbG9hZCBpcyBub3QgaW4gbm9yZW9yZGVyIHNlY3Rpb24uCi0JKHNfY3ByZXN0b3JlKTogSWdub3JlIC5jcHJlc3RvcmUgaWYgbm90IGdlbmVyYXRpbmcgUElDIGNvZGUuCi0JKHNfZ3B3b3JkLCBzX2NwYWRkKTogTmV3IGZ1bmN0aW9ucy4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogQWRkZWQgZnJhbWUgYXJndW1lbnQ7IGlmIHRydWUsIHNldAotCW1pcHNfZnJhbWVfcmVnIHRvIHJldHVybiB2YWx1ZS4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRG9uJ3QgZXJyb3Igb3V0LCBidXQgaW5zdGVhZAotCWRldGVybWluZSBob3cgbXVjaCBhIGZyYWcgc2hvdWxkIGdyb3cuCi0JKHRjX2dlbl9yZWxvYyk6IFJldHVybiBtdWx0aXBsZSByZWxvY3MgaWYgYXBwcm9wcmlhdGUsIGFzCi0JZGV0ZXJtaW5lZCBieSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheC4KLQkobWRfY29udmVydF9mcmFnKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogU2V0IEVMRiBoZWFkZXIgZmxhZ3MgYmFzZWQgb24KLQltaXBzX2FueV9ub3Jlb3JkZXIgYW5kIG1pcHNfcGljLgotCSogY29uZmlnL3RjLW1pcHMuaCAoUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFKTogRGVmaW5lLgotCShNQVhfUkVMT0NfRVhQQU5TSU9OKTogRGVmaW5lIHRvIGJlIDMuCi0JKG1kX3JlbGF4X2ZyYWcpOiBEZWZpbmUgdG8gYmUgMC4KLQkobWRfY29udmVydF9mcmFnKTogRG9uJ3QgZGVmaW5lLgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBDaGFuZ2VkIGRlY2xhcmF0aW9uLgotCi0JKiBlY29mZi5oLCBlY29mZi5jOiBOZXcgZmlsZXMgcHVsbGVkIG91dCBvZiBjb25maWcvb2JqLWVjb2ZmLmMgdG8KLQlzdXBwb3J0IGdlbmVyYXRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBNSVBTIEVMRgotCXRhcmdldHMuICBDb21waWxlZCBvbmx5IGlmIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLiAgQ2hhbmdlZAotCWhhbmRsaW5nIG9mIGV4dGVybmFsIHN5bWJvbHM6IGl0IG5vdyBhbHdheXMgZ2VuZXJhdGVzIGV4YWN0bHkKLQl0aG9zZSBleHRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzeW1ib2wgbGlzdC4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMpOiBBZGRlZCBlY29mZi5jLgotCShSRUFMX0hFQURFUlMpOiBBZGRlZCBlY29mZi5oLgotCShPQkpTKTogQWRkZWQgZWNvZmYuby4KLQkoZWNvZmYubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IEFsbW9zdCBlbnRpcmVseSBtb3ZlZCBpbnRvIGVjb2ZmLmMuCi0JUmVtYWluaW5nIGNvZGUgbW9zdGx5IGp1c3QgY2FsbHMgZWNvZmYuYyBjb2RlLgotCSogY29uZmlnL29iai1lY29mZi5oOiBEZWZpbmUgRUNPRkZfREVCVUdHSU5HLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IE1ha2UgZWNvZmZfc3ltYm9sIGEgcG9pbnRlciB0byBhCi0Jc3RydWN0IGxvY2Fsc3ltLgotCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rKTogRGVmaW5lIHRvIGNhbGwKLQlmdW5jdGlvbnMgaW4gZWNvZmYuYy4KLQkoZWNvZmZfc3RhYik6IERvbid0IGRlY2xhcmUgKG5vdyBkZWNsYXJlZCBpbiBlY29mZi5oKS4KLQkob2JqX3NldF9zeW1faW5kZXgpOiBEZWZpbmUuCi0JKG9ial9lY29mZl9zZXRfc3ltX2luZGV4KTogRGVjbGFyZS4KLQotCSogZnJhZ3MuaCAoZnJhZ19ncm93KTogRGVjbGFyZS4KLQkqIGZyYWdzLmMgKGZyYWdfZ3Jvdyk6IE1hZGUgbm9uLXN0YXRpYy4KLQotCSogd3JpdGUuYyAoaXNfZG5yYW5nZSk6IERvIG5vdCBkZWZpbmUgaWYgbWRfcmVsYXhfZnJhZyBpcyBkZWZpbmVkLgotCShyZWxheF9zZWdtZW50KTogSWYgbWRfcmVsYXhfZnJhZyBpcyBkZWZpbmVkLCB1c2UgaXQgdG8gaGFuZGxlIGEKLQlmcmFnIG9mIHR5cGUgcnNfbWFjaGluZV9kZXBlbmRlbnQgcmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoCi0JbWRfcmVsYXhfdGFibGUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgd2UgZmluZCBhIGJhZCBwc2V1ZG8tb3AsCi0JZG8gYSBjb250aW51ZSB0byBnbyBvbiB0byB0aGUgbmV4dCBsaW5lIHJhdGhlciB0aGFuIGEgYnJlYWsuCi0JUmVtb3ZlZCBkdXBsaWNhdGUgYmFkIHBzZXVkby1vcCBjb2RlIHdoaWNoIHdhcyBuZXZlciBleGVjdXRlZC4KLQotCSogcmVhZC5jIChzX2xjb21tKTogRG8gbm90IHJlcXVpcmUgYSBjb21tYSBhZnRlciB0aGUgbmFtZS4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IENoYW5nZWQgaGFkb25lIGZpZWxkIHRvIGJpdGZpZWxkLgotCUFkZGVkIGJzcyBiaXRmaWVsZC4KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IFNldCBic3MgZmxhZyBmb3IgYnNzX3NlY3Rpb24uCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBTZXQgYnNzIGZsYWcgZm9yIC5zYnNzIHNlY3Rpb24gaWYgdXNlZC4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IERvbid0IHNldCBTRUNfSEFTX0NPTlRFTlRTIGZvciBhCi0JYnNzIHNlY3Rpb24uICBTZXQgU0VDX1JFTE9DIGlmIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbnMsIGV2ZW4gZm9yCi0JYSB6ZXJvIHNpemUgc2VjdGlvbi4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSW4gUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFIGNhc2UsIGJhc2UKLQlkYXRhIG9mZnNldCBvbiByZWxvY1swXS0+YWRkcmVzcyByYXRoZXIgdGhhbiByZWxvY1tqXS0+YWRkcmVzcywgc28KLQl0aGF0IG11bHRpcGxlIHJlbG9jcyBjYW4gYWZmZWN0IGRpZmZlcmVudCBtZW1vcnkgbG9jYXRpb25zLgotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlciwgcmVsYXhfYW5kX3NpemVfc2VnLAotCWFkanVzdF9yZWxvY19zeW1zLCB3cml0ZV9yZWxvY3MpOiBNYWtlIHRoaXJkIGFyZ3VtZW50IFBUUiwgbm90Ci0JY2hhciAqLCB0byBtYXRjaCBkZWZpbml0aW9uIG9mIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IERvbid0IGludGVycHJldCBhIGNvbW1lbnQgY2hhcmFjdGVyCi0JYXMgc3RhcnRpbmcgYSBDUFAgbGluZSBkaXJlY3RpdmUgdW5sZXNzIGl0IGlzIGEgJyMnIGFuZCBpcyB0aGUKLQl2ZXJ5IGZpcnN0IGNoYXJhY3RlcnMgb24gdGhlIGxpbmUgKGkuZS4sIGRvIG5vdCBwZXJtaXQgbGVhZGluZwotCXdoaXRlc3BhY2UpLgotCi0JKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE1ha2UgZmlsZSBhcmd1bWVudCBub24tY29uc3QsIHRvIG1hdGNoCi0JY2FsbGVycy4KLQotVHVlIE5vdiAxNiAyMDozODoyMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBGaXggdGhpbmtvIGluIDIxYml0IHJhbmdlIGNoZWNrLgotCi1TYXQgTm92IDEzIDE4OjIyOjQ4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBDb3BlIHdpdGggSU1NMTYgdHlwZSB0b28uCi0JKiBjb25maWcvdGMtejhrLmMgKGJ1aWxkX2J5dGVzLCBtZF9hcHBseV9maXgpOiBVbmRlcnN0YW5kIG5ESVNQNwotCXJlbG9jcy4KLQotRnJpIE5vdiAxMiAxNjo1MTo0NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuW2NoXTogRml4IGFzc29ydGVkIHRyaXZpYWwgaW5kZW50aW9uIHByb2JsZW1zLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uKTogQWRkIG1pc3NpbmcgJzsnLgotCShzb21fZnJvYl9maWxlKTogRGVsZXRlIHdoaXRlc3BhY2UgYXQgRU9MLgotCi1GcmkgTm92IDEyIDE1OjI2OjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgZm9sbG93aW5nIDIuMiByZWxlYXNlLgotCi1GcmkgTm92IDEyIDE0OjUyOjE3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBVc2UgYSByZWFsIHR5cGUgZm9yIHRoZQotCWZpZWxkIHNlbGVjdG9yLCByYXRoZXIgdGhhbiBhbiBpbnQuICBBbGwgdXNlcyBvZiBmaWVsZCBzZWxlY3RvcnMKLQlmaXhlZC4KLQkodGNfZ2VuX3JlbG9jKTogRm9yIFNPTSBQTEFCRUxzLCBhbHdheXMgc2V0IGFkZGVuZCB0byB6ZXJvIGZvciBub3cuCi0JKG1kX2FwcGx5X2ZpeF8xKTogRG8gbm90IGNhbGwgaHBwYV9maWVsZF9hZGp1c3QgZm9yIGFueSBQTEFCRUwKLQlmaWVsZC4KLQotCVRodSBOb3YgMTEgMTU6NDk6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3R5cGVfYXJncyk6IEZvciAuaW1wb3J0IHN0YXRlbWVudHMsCi0Jc2lsZW50bHkgaWdub3JlIGF0dGVtcHQgdG8gY2hhbmdlIHRoZSBzeW1ib2wgdHlwZSBmb3IgYSBmdW5jdGlvbgotCWZyb20gU1RfRU5UUlkgdG8gU1RfQ09ERSBvbiAuaW1wb3J0LgotCi1XZWQgTm92IDEwIDE2OjE5OjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuaCAoZml4Uyk6IFJlbmFtZSBmeF9jYWxsaiBmaWVsZCB0byBmeF90Y2JpdC4KLQkqIHdyaXRlLmMsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmZiZmQuYywKLQljb25maWcvdGMtaTk2MC5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBOb3YgIDkgMDA6NDk6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgY29uZmlnLXN0YW1wIGFuZCBjb25maWcuaAotCi0JKiBjb25maWcvdGMtaHBwYS5jIChldmFsdWF0ZV9hYnNvbHV0ZSk6IEF2b2lkIHJlbHlpbmcgb24KLQlBTlNJLUMgZmVhdHVyZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3R5cGVfYXJncyk6IFJlbmFtZWQgZnJvbSBwYV9leHBvcnRfYXJncy4KLQlBY2NlcHQgbmV3IGFyZ3VtZW50ICJpc19leHBvcnQiLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4gIFdoZW4KLQlwcm9jZXNzaW5nIGEgLmV4cG9ydCBkaXJlY3RpdmUgZm9yIGEgZnVuY3Rpb24sIGRvIG5vdCBhbGxvdwotCXRoZSB1c2VyIHRvIHNldCB0aGUgdHlwZSB0byAiQ09ERSIsIGluc3RlYWQgd2FybiBhbmQgc2V0IHRoZQotCXR5cGUgdG8gIkVOVFJZIi4KLQotTW9uIE5vdiAgOCAxMjowNTowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIHByaW50SW5zbik6IEhhbmRsZSAnaycgKGZyb20gVGVkCi0JTGVtb24gPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4pLgotCShtaXBzX2lwKTogUGVybWl0IG9kZCBudW1iZXJlZCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaWYgLW1pcHMzLgotCShtYWNybyk6IFVzZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMIHJlbG9jYXRpb24gZm9yIE1fTElfU1MuCi0KLU1vbiBOb3YgIDggMDc6NDU6MDEgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgaDgzMDBoLCB3ZSBoYXZlIG11bHRpbGliIG5vdy4KLQotTW9uIE5vdiAgOCAwNjowOToxOCAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFN1cHBvcnQgZ2VuZXJpYyBuZXR3YXJlIGFzIGJlaW5nIEVMRiBmb3JtYXQuCi0JCQlSZWNvZ25pc2UgdW5peHdhcmUgaWYgdGhlIHVzZXIgc3VwcGxpZXMgaXQuCi0KLVN1biBOb3YgIDcgMDE6MDI6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEZpcnN0IGN1dCBhdCBjbGVhbmluZyB1cCBQQSBpbnN0cnVjdGlvbiBwYXJzaW5nLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBBY2NlcHQgcG9pbnRlciB0bwotCWluc24gc3RydWN0dXJlIGFzIGFuIGFyZ3VtZW50LCBhbmQgYSBwb2ludGVyIHRvIGEgc3RyaW5nLiAgQWxsCi0JY2FsbGVycyBjaGFuZ2VkLiAgQWx3YXlzIHJlYWQgYW55IGZpZWxkIHNlbGVjdG9yIGhlcmUuICBDYWxsCi0JZXZhbHVhdGUgYWJzb2x1dGUgdG8gZ2V0IGEgcmV0dXJuIHZhbHVlLgotCShldmFsdWF0ZV9hYnNvbHV0ZSk6IEFkZGVwdCBwb2ludGVyIHRvIGluc24gc3RydWN0dXJlIGFzIGl0cwotCWFyZ3VtZW50LiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSk6IE5ldyBtYWNybyBmb3IgaW5zZXJ0aW5nIGEgYml0ZmllbGQKLQlpbnRvIGFuIGluc3RydWN0aW9uIGFuZCBjb250aW51aW5nIHRoZSBtYWluIHBhX2lwIGxvb3AuCi0JKENIRUNLX0ZJRUxEKTogTmV3IG1hY3JvIGZvciBzaW1wbGUgcmFuZ2UgY2hlY2tpbmcgb2YgZmllbGRzLgotCShwYV9pcCk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGVzLiAgVXNlIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUKLQlhbmQgQ0hFQ0tfRklFTEQuICBBbGwgaW1tZWRpYXRlIGZpZWxkcyBub3cgcGFzcyB0aHJvdWdoCi0JcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gd2hpY2ggd2lsbCBhbHNvIGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuCi0JRGVsZXRlIGRlYWQgY29kZS4gIFNpbXBsaWZ5LgotCShtZF9hcHBseV9maXhfMSk6IFVzZSBDSEVDS19GSUVMRCB0byB2ZXJpZnkgYW55IGZpeGVzIHRoYXQgYXJlCi0JYXBwbGllZCBhcmUgaW4gcmFuZ2UuICBVc2UgYmZkX3B1dF8zMiByYXRoZXIgdGhhbiBpbnNlcnRpbmcgZWFjaAotCWJ5dGUgb2YgdGhlIGZpeGVkIGluc3RydXRpb24gaW50byB0aGUgYnVmZmVyIG91cnNlbHZlcy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERlbGV0ZSB7U0VHLEdMT0JBTH1fRElGRl9BTExPV0VEIGNvZGUsCi0JaXQgd2FzIFBBIHNwZWNpZmljIGFuZCBpcyBubyBsb25nZXIgbmVlZGVkIChpdCdzIG5vdyBoYW5kbGVkCi0Jd2l0aGluIHRoZSBQQSBiYWNrZW5kKS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFNFR19ESUZGX0FMTE9XRUQpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IElmIHRoZSBzdWJ0cmFjdCBzeW1ib2wgZm9yCi0JYSBmaXh1cCBpcyAkZ2xvYmFsJCBjaGFuZ2UgaXQgdG8gTlVMTCBhcyAkZ2xvYmFsJCBpcyByZWFsbHkgb25seQotCW5lZWRlZCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgdGhlIGJhc2UgdHlwZSBvZiByZWxvY2F0aW9uIHRvIHVzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY3JlYXRlX25ld19zdWJzcGFjZSk6IEluaXRpYWxpemUgc3Vic3BhY2VfZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGEtaXAsIGNhc2UgJ3onKTogTWFrZSBmaWVsZCBzZWxlY3RvcnMgd29yawotCWZvciAneicgb3BlcmFuZHMgKHRhcmdldCBvZiBibGUgYnJhbmNoKS4KLQotU2F0IE5vdiAgNiAyMjo0MTo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogKHVwZGF0ZV9zdWJzcGFjZSk6IEZpeCB0eXBlIGFuZCBuYW1lIG9mIGxhc3QKLQlwYXJhbWV0ZXIuICBBbGwgY2FsbGVycyBmaXhlZC4KLQkobWRfYmVnaW4sIHBhX2Noa19maWVsZF9zZWxlY3RvciwgcGFfZW50cnkpOiBMaW50LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjb25zX2ZpeF9uZXdfaHBwYSk6IFJlc2V0IGZpZWxkIHNlbGVjdG9yCi0JdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBpdCdzIGJlZW4gdXNlZC4KLQotRnJpIE5vdiAgNSAxMjowODoyMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IENoYW5nZQotCXNwYWNlL3N1YnNwYWNlIHNvcnQga2V5cyBmb3IgdGhlIHN0YWIgc2VjdGlvbnMgc28gYXMgdG8gYXZvaWQKLQlidWdzIGluIHRoZSBocCBsaW5rZXIgYW5kIHB4ZGIuCi0KLVRodSBOb3YgIDQgMTc6MDA6MDUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogVXBkYXRlIHBvaW50ZXIgdG8gbGFzdAotCWZyYWcgZm9yIGEgc2VnbWVudCBpbiB0aGUgc2VnaW5mbyBzdHJ1Y3R1cmUuCi0KLVRodSBOb3YgMDQgMDk6MDk6MzUgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogIE1ha2VmaWxlLmluOiBDaGFuZ2VkIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVdlZCBOb3YgIDMgMTI6MTY6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBIYW5kbGUgY29udmVyc2lvbiBvZiBzdWJ0cmFjdGlvbiB0bwotCXBjLXJlbGF0aXZlIGFkZHJlc3NpbmcgZXZlbiBpZiBwYy1yZWxhdGl2ZSBmbGFnIGlzIGFscmVhZHkgc2V0LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogVXNlIHN0cmNociwgbm90IGluZGV4LiAgRG9uJ3QKLQlkZWNsYXJlIGVpdGhlci4KLQotCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgaW50ZXJtZWRpYXRlIGZpbGVzIGZyb20gZHZpCi0JYnVpbGQsIGJ1dCBub3QgdGhlIGR2aSBvciBpbmZvIGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKGNsZWFuLWhlcmUpOiBOZXcgdGFyZ2V0OyBjbGVhbnMgdXAgY3VycmVudAotCWRpcmVjdG9yeSBvbmx5LgotCShkaXN0Y2xlYW4pOiBVc2UgaXQgaW5zdGVhZCBvZiBjbGVhbi4KLQotCSogcmVhZC5jIChzX3hzdGFiKTogRG9uJ3QgdXNlIGFsbG9jYS4KLQotCSogbWVzc2FnZXMuYyAoaWRlbnRpZnkpOiBOZXcgcm91dGluZTsgcHJpbnQgbWVzc2FnZSBpZGVudGlmeWluZwotCWZvbGxvd2luZyBtZXNzYWdlcyBhcyBjb21pbmcgZnJvbSBhc3NlbWJsZXIuCi0JKGFzX3Nob3dfd2hlcmUsIGFzX2JhZF9pbnRlcm5hbCwgYXNfYmFkX3doZXJlKTogQ2FsbCBpdC4KLQkoYXNfZmF0YWwpOiBEb24ndCBuZWVkIHRvIGlkZW50aWZ5IHByb2dyYW0gYW55IG1vcmUuCi0KLVR1ZSBOb3YgIDIgMTg6MDQ6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHJlbG9jIHN3aXRjaC4KLQotCSogcmVhZC5jIChzX2xjb21tKTogUHV0IHNtYWxsIG9iamVjdHMgaW4gLnNic3MgZm9yIE1JUFMgRUxGIGFzCi0Jd2VsbCBhcyBNSVBTIEVDT0ZGLgotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhbGlnbmVkLgotCi1UdWUgTm92ICAyIDE1OjA3OjA3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB0Yy1ocHBhLmM6IEFkZCAlZHAgYW5kICVycCBhcyBzeW5vbnltcyBmb3IgJXIyNyBhbmQgJXIyIGluIHRoZQotCXByZWRlZmluZWQgcmVnaXN0ZXIgdGFibGUuCi0JKHBhX3BhcnNlX251bWJlcik6IEhhbmRsZSAlcnAgaW4gY29tbW9uIHJlZ2lzdGVyIHNob3J0Y3V0IGNvZGUuCi0JQ29uc2lzdGVudGx5IHNldCByZXR1cm4gdmFsdWUgdG8gLTEgZm9yIGFuIGVycm9yLiAgQ2xlYW4gdXAgZXJyb3IKLQltZXNzYWdlcyBhbmQgb25seSBwcmludCB0aGVtIHdoZW4gInByaW50X2Vycm9ycyIgaXMgdHJ1ZS4gIEhhbmRsZQotCWVtcHR5IHN0cmluZyBjYXNlIGxpa2UgdGhlIEhQIGFzc2VtYmxlciAtLSBhc3N1bWUgYSB2YWx1ZSBvZgotCXplcm8uCi0KLQkqIGNvbmZpZy9oby1ocHV4Lmg6IERvIG5vdCBpbmNsdWRlIGhvLXN5c3YuaC4gIEluc3RlYWQgaW5jbHVkZQotCXN0YW5kYXJkIGhwdXggaW5jbHVkZSBmaWxlcyB0byBwaWNrIHVwIHZhcmlvdXMgZnVuY3Rpb24gZGVjbHMuCi0KLQkqIGNvbmZpZy9oby1ocHBhb3NmLmg6IERlbGV0ZSBfSU8qIG1hY3Jvcy4gIFRoZXkgYXJlIGRlZmluZWQgaW4KLQlzdGRpby5oLiAgRGVsZXRlIGJvZ3VzIGRlY2xhcmF0aW9uIG9mIGZyZWUuICBHZXQgcGF0aCB0bwotCWFsbG9jYS1jb25mLmggcmlnaHQuCi0KLVR1ZSBOb3YgIDIgMTM6NTc6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEZpeCBjaGVja3MgZm9yIGNoYXJhY3RlcnMgZm9sbG93aW5nICIwYiIgb3IKLQkiMGYiLgotCi1Nb24gTm92ICAxIDIxOjM3OjA0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfYXR0YWNoX3Vud2luZF9pbmZvKTogRGVmaW5lIGFzIGEgaG9vawotCXNvIEdBUyBjYW4gYXR0YWNoIHVud2luZCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIHRvIGEgQkZEIHN5bWJvbC4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IElmIG5lY2Vzc2FyeSBhdHRhY2ggdW53aW5kCi0JZGVzY3JpcHRvciBpbmZvcm1hdGlvbiB0byB0aGUgQkZEIHN5bWJvbC4KLQkobWRfYXBwbHlfZml4KTogUl9IUFBBX0VOVFJZIGFuZCBSX0hQUEFfRVhJVCBjYW4gbmV2ZXIgYmUgImFwcGxpZWQiLAotCXRoZXkgYXJlIHNpbXBseSBtYXJrZXJzLiAgTWFrZSBSX0hQUEFfVU5XSU5EXyogaGFuZGxpbmcgT0JKX0VMRgotCWRlcGVuZGVudC4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogV2hvbGUgZnVuY3Rpb24gaXMgT0JKX0VMRiBkZXBlbmRlbnQuCi0JKHBhX2VudHJ5KTogQnVpbGQgYSBSX0hQUEFfRU5UUlkgcmVsb2NhdGlvbiB3aGVuIGNvbmZpZ3VyZWQgZm9yIFNPTS4KLQkocGFfZXhpdCk6IExpa2V3aXNlLCBidXQgYnVpbHQgYSBSX0hQUEFfRVhJVCByZWxvY2F0aW9uLiAgRG8gbm90Ci0JYnVpbGQgImVuZC1vZi1mdW5jdGlvbiIgc3ltYm9scyBmb3IgU09NLCB0aGV5IGFyZSBub3QgbmVlZGVkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwcm9jZXNzX2V4aXQpOiBDcmVhdGUgdGVtcG9yYXJ5IHN5bWJvbHMgd2l0aAotCWNvcnJlY3QgcHJlZml4ZXMgc28gdGhleSBjYW4gYmUgZWxpbWluYXRlZCBsYXRlci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY2FsbF9pbmZvIHN0cnVjdCk6IERlbGV0ZSB1bnVzZWQgImZyYW1lIiBmaWVsZC4KLQkocGFfY2FsbGluZm8pOiBJbnNlcnQgZnJhbWVzaXplIGludG8gdGhlIHVud2luZCBpbmZvcm1hdGlvbiBhcwotCXNvb24gYXMgaXQncyBhdmFpbGFibGUuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IERvIG5vdCBpbnNlcnQgZnJhbWVzaXplIGludG8gdGhlIHVud2luZAotCWluZm9ybWF0aW9uIGhlcmUuCi0KLQkqIEFkZCBzdXBwb3J0IGZvciBtYXJrZXIgdHlwZSByZWxvY2F0aW9ucy4gIFRoZXNlIG1hcmsgYXJlYXMKLQlvZiBpbnRlcmVzdCB0byB0aGUgbGlua2VyLiAgRU5UUlkvRVhJVCByZWxvY2F0aW9ucyBmb3IgU09NIGFyZQotCWFuIGV4YW1wbGUgb2YgbWFya2VyIHJlbG9jYXRpb25zLgotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSW5zdGVhZCBvZiBhc3N1bWluZyBzaXplIG9mIGEgcmVsb2NhdGlvbgotCWlzIDQgYnl0ZXMsIHBpY2sgdXAgdGhlIHNpemUgZnJvbSByZWxvY2F0aW9uIGl0c2VsZi4KLQkoZml4dXBfc2VnbWVudCk6IERvIG5vdCBjb21wbGFpbiB0aGF0IGEgdmFsdWUgaXMgdG9vIHNtYWxsIGZvcgotCW1hcmtlciByZWxvY2F0aW9ucy4KLQotCSogc3RydWMtc3ltYm9sLmg6IEFkZCBuZXcgInN5X3VzZWQiIGZpZWxkIHRvIHRoZSBzeW1ib2wgc3RydWN0dXJlLgotCSogZXhwci5jIChvcGVyYW5kKTogU2V0IHN5X3VzZWQgZm9yIGFueSBzeW1ib2wgdXNlZCBhcyBhbiBvcGVyYW5kLgotCShleHByKTogTGlrZXdpc2UgZm9yIGFueSBzeW1ib2wgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZnJvYl9zeW1ib2wpOiBEZWZpbmUuICBQdW50IGltcG9ydGVkCi0Jc3ltYm9scyB3aGljaCBhcmUgbmV2ZXIgdXNlZCBhbmQgYWJzb2x1dGUgc3ltYm9scyB3aGljaCBsb2NhbCBzY29wZS4KLQotCSogY29uZmlnL29iai1zb20uaCAob2JqX2Zyb2JfZmlsZSk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24pOiBTZXQgYWxpZ25tZW50Ci0Jb2Ygc3RhYiBzZWN0aW9ucy4gIE1ha2Ugc3BhY2UgZm9yIHRoZSBzcGVjaWFsIHN0YWIgZW50cnkuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogQWRqdXN0IHRoZSBzcGVjaWFsIGVudHJ5IGluIHRoZQotCXN0YWJzIHNlY3Rpb24uCi0JKHNvbV9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uICBTaW1wbHkgY2FsbHMgYWRqdXN0X3N0YWJfc2VjdGlvbnMKLQlmb3IgZWFjaCBzZWN0aW9uLgotCi1Nb24gTm92ICAxIDE3OjU0OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoUElDX0NBTExfUkVHLCBTUCwgRlApOiBEZWZpbmUuCi0JKG1pcHNfcGljLCBtaXBzX2NwcmVzdG9yZV9vZmZzZXQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWRfcHNldWRvX3RhYmxlKTogSGFuZGxlIC5hYmljYWxscywgLmNwbG9hZCwgYW5kIC5jcHJlc3RvcmUuCi0JSWdub3JlIC5iZ25iIGFuZCAuZW5kYi4KLQkoZ3BfcmVmZXJlbmNlKTogX2dwX2Rpc3AgaXMgbmV2ZXIgYWRkcmVzc2VkIG9mZiBHUC4KLQkobWFjcm9fYnVpbGQpOiBJZ25vcmUgbWFjcm9zIHdoaWxlIHNlYXJjaGluZyBmb3IgaW5zbi4gIEZvciBjYXNlcwotCWksIGosIGFuZCBvLCBhY2NlcHQgdGhlIHJlbG9jIHR5cGUgYXMgYW4gYXJndW1lbnQgcmF0aGVyIHRoYW4KLQlhc3N1bWluZyBCRkRfUkVMT0NfTE8xNi4gIERvbid0IHRyeSB0byBjb252ZXJ0IEJGRF9SRUxPQ19MTzE2IHRvCi0JQkZEX1JFTE9DX01JUFNfR1BSRUwuICBBZGRlZCBuZXcgY2FzZSBhLgotCShzZXRfYXQsIGxvYWRfcmVnaXN0ZXIsIG1hY3JvKTogQ2hhbmdlZCBjYWxscyB0byBtYWNyb19idWlsZCB0bwotCXBhc3MgbmV3IGFyZ3VtZW50IGZvciBpLCBqIGFuZCBvIGNhc2VzLgotCShtYWNybyk6IEhhbmRsZSBNX0pBTF8xLCBNX0pBTF8yIGFuZCBNX0pBTF9BLiAgVGhlc2UgcmVxdWlyZQotCXNwZWNpYWwgaGFuZGxpbmcgd2hlbiBnZW5lcmF0aW5nIFNWUjQgUElDIGNvZGUuCi0JKG1pcHNfaXAsIHRjX2dldF9yZWdpc3Rlciwgc19mcmFtZSk6IFVzZSBtYWNyb3MgRlAsIFNQLCBHUCBhbmQgQVQKLQlyYXRoZXIgdGhhbiBoYXJkIGNvZGVkIGNvbnN0YW50cy4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwgYW5kCi0JQkZEX1JFTE9DX01JUFNfQ0FMTDE2LgotCShzX29wdGlvbik6IFNldCBtaXBzX3BpYyBiYXNlZCBvbiAub3B0aW9uIHBpY04uCi0JKHNfYWJpY2FsbHMpOiBOZXcgZnVuY3Rpb247IHNldCBtaXBzX3BpYyB0byAyLgotCShzX2NwbG9hZCk6IE5ldyBmdW5jdGlvbjsgaGFuZGxlIC5jcGxvYWQuCi0JKHNfY3ByZXN0b3JlKTogTmV3IGZ1bmN0aW9uOyBoYW5kbGUgLmNwcmVzdG9yZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIC5iZ25iLAotCS5lbmRiIGFuZCAudmVyc3RhbXAsIHNldHRpbmcgdGhlbSB0byBzX2lnbm9yZS4KLQotU3VuIE9jdCAzMSAwMDozNjo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbik6IEFkZCBuZXcgc3NkX2RlZmluZWQKLQlmaWVsZC4gIERlZmluZSBTVUJTUEFDRV9ERUZJTkVEIGFjY2Vzc29yIG1hY3JvLgotCShwYV9zdWJzcGFjZSk6IEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgc3Vic3BhY2UgYXR0cmlidXRlcyBmb3IKLQlidWlsdC1pbiBzdWJzcGFjZXMuICBTZXQgc3NkX2RlZmluZWQgYXQgdGhlIGVuZCBvZiBmY24gLS0gdGhhdAotCXdheSB0aGUgYXR0cmlidXRlcyBjYW4gb25seSBiZSBjaGFuZ2VkIG9uY2UuICBQYXNzIG5ld2x5IGFsbG9jYXRlZAotCW5hbWUgdG8gaXNfZGVmaW5lZF9zdWJzcGFjZSwgbm90IGEgcG9pbnRlciB0byB0aGUgaW5wdXQgbGluZS4KLQlGaXggdHlwbyBpbiBzcGFjZS9zdWJzcGFjZSByZXdvcmsuCi0JKGlzX2RlZmluZWRfc3Vic3BhY2UpOiBEZWxldGUgdW51c2VkIDJuZCBhcmcuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pbXBvcnQpOiBJZiBjdXJyZW50bHkgaW4gdGhlIHRleHQgc2VnbWVudAotCWFuZCBhIHN5bWJvbCBpcyBpbXBvcnRlZCB3aXRob3V0IHR5cGUgaW5mb3JtYXRpb24sIHNldCBCU0ZfRlVOQ1RJT04KLQlmb3IgdGhlIHN5bWJvbC4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IENvcnJlY3QgdGVzdCB0byBkZXRlcm1pbmUgaWYKLQl0aGUgc2VjdGlvbidzIHNpemUgd2FzIHJvdW5kZWQgdXAuCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9zZXRfc3ltYm9sX3R5cGUpOiBEZWZpbmUgYSBob29rIHNvIEdBUwotCWNhbiBwcm9wZXJseSBzZXQgYWxsIHRoZSBTT00gc3ltYm9sIHR5cGVzLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3ltYm9sX3R5cGUpOiBOZXcgZW51bSB0byByZXByZXNlbnQgdGhlCi0Jc3ltYm9sIHR5cGVzIHdoaWNoIGNhbiBiZSBzZXQgZnJvbSBhbiBJTVBPUlQvRVhQT1JUIHN0YXRlbWVudC4KLQkocGFfZXhwb3J0X2FyZ3MpOiBTZXQgdGhlIHBhX3N5bWJvbF90eXBlIHR5cGUgYmFzZWQgb24gYXJndW1lbnRzLgotCUlmIGRlZmluZWQsIGNhbGwgb2JqX3NldF9zeW1ib2xfdHlwZSB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gb24KLQl0byB0aGUgQkZEIGJhY2tlbmQuCi0KLQkqIHJlYWQuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFNldCBTRUNfREVCVUdHSU5HIGZvciBhbnkKLQlzdGFiIHNlY3Rpb24gd2UgbWFrZS4KLQkoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KLQotU2F0IE9jdCAzMCAxNDoyNjoyMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIG9mIHRoZSBmYWtlIGxhYmVsLgotCSogd3JpdGUuaCAoTE9DQUxfTEFCRUwpOiBEZWxldGUgRE9UX0xBQkVMX1BSRUZJWCBjb2RlLiAgSW5zdGVhZAotCWFzc3VtZSBiYWNrZW5kcyB3aWxsIGRlZmluZSBMT0NBTF9MQUJFTCBpZiBhbnl0aGluZyBvdGhlciB0aGFuCi0JJ0wnIGlzIHVzZWQgdG8gZGVub3RlIGEgbG9jYWwgbGFiZWwuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IE5ldyBtYWNyby4gIERlZmluZXMgdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGZvcgotCXRoZSAiZmFrZSIgbGFiZWwuCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBEZWxldGUgRE9UX0xBQkVMX1BSRUZJWCBjb2RlCi0JYW5kIGluc3RlYWQgc2ltcGx5IHVzZSB0aGUgc3RyaW5nIGRlZmluZWQgYnkgRkFLRV9MQUJFTF9OQU1FLgotCShvcGVyYW5kKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHNfc3RhYl9nZW5lcmljKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaHBwYS5oIChGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgYXMgTCQwXDAwMSBzbyBpdCdzCi0Ja25vd24gdG8gYmUgYSBsb2NhbCBsYWJlbC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTY4ay5oIChET1RfTEFCRUxfUFJFRklYKTogRGVsZXRlLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChET1RfTEFCRUxfUFJFRklYKTogRGVsZXRlLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lLgotCi0JUmV3b3JrIHNwYWNlL3N1YnNwYWNlIGhhbmRsaW5nIGluIFBBIGNvZGUgdG8gZnVsbHkgc3VwcG9ydAotCVNPTSBzcGFjZXMvc3Vic3BhY2VzLgotCSogY29uZmlnL3RjLWhwcGEuYyAoVVNFX0FMSUFTRVMpOiBOZXcgb2JqZWN0LWZvcm1hdCBkZXBlbmRlbnQgZGVmaW5lCi0JdG8gY29udHJvbCB0aGUgdXNlIG9mIHNwYWNlL3N1YnNwYWNlIG5hbWUgYWxpYXNlcy4KLQkodXBkYXRlX3N1YnNwYWNlKTogQWNjZXB0IHNwYWNlIGNoYWluIGVudHJ5IGZvciBjb250YWluaW5nIHNwYWNlCi0JYXMgYSBuZXcgcGFyYW1ldGVyLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkocGFfZ2V0X2xhYmVsKTogVXNlIGN1cnJlbnRfc3BhY2UgcmF0aGVyIHRoYW4gcGFfc2VnbWVudF90b19zcGFjZS4KLQkocGFfZGVmaW5lX2xhYmVsKTogTGlrZXdpc2UuCi0JKHBhX3VuZGVmaW5lX2xhYmVsKTogTGlrZXdpc2UuCi0JKG1kX2JlZ2luKTogQ2hhbmdlIGludG8gdGhlIChwb3NzaWJseSBtb2RpZmllZCkgdGV4dF9zZWN0aW9uLgotCShwYV9wYXJzZV9zcGFjZV9zdG10KTogQ3JlYXRlIGEgbmV3IHNlZ21lbnQvc3BhY2UgaWYgY3JlYXRlX2ZsYWcKLQlpcyB0cnVlLCBhbmQgdGhlIHNwYWNlIG5hbWUgaXMgbm90IG9uZSBvZiB0aGUgdHdvIHByZWRlZmluZWQgc3BhY2VzLgotCShwYV9zdWJzcGFjZSk6IFVzZSBjdXJyZW50X3NwYWNlIHJhdGhlciB0aGFuIGEgbG9va3VwIHZpYQotCXBhX3NlZ21lbnRfdG9fc3BhY2UuICBSZXNldCBCRkQgc2VjdGlvbiBmbGFncyBhcyByZXF1aXJlZCBieQotCXRoZSAuc3Vic3BhY2UgZGlyZWN0aXZlLiAgTGlrZXdpc2UgZm9yIHRoZSBzZWN0aW9uIGFsaWdubWVudC4KLQlQYXNzIHRoZSBjdXJyZW50IHNwYWNlIHRvIHVwZGF0ZV9zdWJzcGFjZSBhbmQgY3JlYXRlX25ld19zdWJzcGFjZS4KLQkocGFfc3BhY2VzX2JlZ2luKTogT25seSB1c2Ugc3BhY2Uvc3Vic3BhY2UgYWxpYXNlcyBpZiBVU0VfQUxJQVNFUwotCWlzIHRydWUuICBXaGVuIG5vdCB1c2luZyBhbGlhc2VzLCBjcmVhdGUgYSBCRkQgc2VjdGlvbiBmb3IgZWFjaAotCXN1YnNwYWNlIGVuY291bnRlcmVkLiAgV2hlbiBub3QgdXNpbmcgYWxpYXNlcyByZXBsYWNlIHRoZSBkZWZhdWx0Ci0JdGV4dCwgZGF0YSwgYW5kIGJzcyBzZWdtZW50cyB3aXRoIG5ldyBvbmVzLgotCShjcmVhdGVfbmV3X3N1YnNwYWNlKTogV2hlbiBub3QgdXNpbmcgYWxpYXNlcyBlYWNoIHN1YnNwYWNlIGhhcyBhCi0Jc2VjdGlvbi9zZWdtZW50IGFuZCBzdWJzZWdtZW50cyBhcmUgbm90IG5lZWRlZCwgc28gc2V0IHRoZSBzdWJzZWdtZW50Ci0JdG8gemVyby4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IElmIG5lZWRlZCwgY2FsbAotCW9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIHRvIHBhc3Mgc3BhY2UgYXR0cmlidXRlcyB0byB0aGUKLQlCRkQgYmFja2VuZC4KLQkoY3JlYXRlX25ld19zcGFjZSk6IExpa2V3aXNlLgotCShjcmVhdGVfbmV3X3N1YnNwYWNlKTogTGlrZXdpc2UgZm9yIHN1YnNwYWNlIGF0dHJpYnV0ZXMgdXNpbmcKLQlvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcy4KLQkodXBkYXRlX3N1YnNwYWNlKTogTGlrZXdpc2UgZm9yIHN1YnNwYWNlIGF0dHJpYnV0ZXMgdXNpbmcKLQlvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IEdldCBzZWdtZW50IGFuZCBzb3J0IGtleQotCWZvciAkVEVYVCQgYW5kICRQUklWQVRFJCBmcm9tIHRoZSBkZWZhdWx0IHNwYWNlIHN0cnVjdHVyZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXhwb3J0X2FyZ3MpOiBBbHdheXMgc2V0IEJTRl9GVU5DVElPTgotCWFzIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogUHJlbGltaW5hcnkgc3RhYiBhdCBoYW5kbGluZwotCVNPTSByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IERlbGV0ZSBpbmNvcnJlY3QgY2hlY2sgZm9yIHN5bWJvbAotCXJlZGVmaW5pdGlvbi4KLQotCSogY29uZmlnL29iai1zb20uW2NoXTogTmV3IGZpbGVzIGZvciBTT00gc3VwcG9ydC4gIE5vdGUgU09NCi0Jc3VwcG9ydCBpcyBub3QgeWV0IGNvbXBsZXRlIGluIEdBUyBvciBCRkQuCi0KLQkqIGNvbmZpZy9oby1ocHBhYnNkLmg6ICBEZWxldGUgSU8qIG1hY3JvcywgdGhleSBhcmUgZGVmaW5lZCBpbgotCXN0ZGlvLmguICBEZWxldGUgZGVjbGFyYXRpb24gb2YgZnJlZS4gIEluY2x1ZGUgc3RkbGliLmgsIHVuaXN0ZC5oLAotCWFuZCBzdHJpbmcuaC4KLQotRnJpIE9jdCAyOSAxMzoyNjoxMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIHNlY3Rpb24gbmFtZXMgdXNlZCBmb3IgZW1iZWRkZWQKLQlzdGFicyBzdXBwb3J0LiAgTmVlZGVkIGZvciBTT00uCi0JKiByZWFkLmMgKFNUQUJfU0VDVElPTl9OQU1FKTogRGVmYXVsdCB0aGUgbmFtZSBvZiB0aGUgc3RhYiBzZWN0aW9uCi0JdG8gIi5zdGFiIi4KLQkoU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FKTogTGlrZXdpc2UgZm9yIHRoZSBzdGFiIHN0cmluZ3Mgc2VjdGlvbi4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IElzIG5vdyBwYXNzZWQgdGhlIGZ1bGwgbmFtZSBmb3IgdGhlCi0Jc3RhYiBzdHJpbmcgc2VjdGlvbiByYXRoZXIgdGhhbiBhIG5hbWUgcHJlZml4LiAgQWxsIHJlZmVyZW5jZXMKLQljaGFuZ2VkLgotCShzX3N0YWJfZ2VuZXJpYyk6IE5ldyBhcmd1bWVudCBmb3IgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24gbmFtZS4KLQlhbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCShzX3hzdGFiKTogQXBwZW5kICJzdHIiIHRvIHRoZSBzdGFiIHNlY3Rpb24gbmFtZSB0byBnZXQgdGhlCi0Jc3RhYiBzdHJpbmcgc2VjdGlvbiBuYW1lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogQXBwZW5kICJzdHIiCi0JdG8gc3RhYiBzZWN0aW9uIG5hbWUgdG8gZ2V0IHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uIG5hbWUuICBQYXNzCi0JdGhlIGZ1bGwgbmFtZSBvZiB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiB0byBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9iZWdpbik6IERpc2FibGUgIi1SIiBvcHRpb24gdG8gZm9sZAotCXRleHRhbmQgZGF0YSBzZWdtZW50cy4gIFdhcm4gdXNlciAiLVIiIGlzIHVuc3VwcG9ydGVkIG9uIHRoZQotCVBBLgotCi1UaHUgT2N0IDI4IDEyOjM2OjEzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBEZWZhdWx0IGFsaWdubWVudCBpcyA4IGZvcgotCS5hbGlnbiBhbmQgLkFMSUdOIGRpcmVjdGl2ZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NwYWNlKTogRG8gbm90IHJlcG9ydCBhbiBlcnJvciBmb3IgYSAuc3BhY2UKLQlkaXJlY3RpdmUgd2hpY2ggZG9lcyBub3QgZGVmaW5lIGEgIndlbGwta25vd24iIHNwYWNlIGFuZCBkb2VzCi0Jbm90IGluY2x1ZGUgYSBzcGFjZSBudW1iZXIgYXMgYW4gYXJndW1lbnQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMpOiBDb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHRoZQotCSJkZWZpbmVkIiwgImxvYWRhYmxlIiwgImNvZGVfb25seSIgYW5kICJzcGFjZV9pbmRleCIgZmllbGRzLgotCShwYV9kZWZfc3BhY2VzKTogQ29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiB0aGUgInNwbnVtIiwgImRlZmluZWQiLAotCWFuZCAicHJpdmF0ZSIgZmllbGRzLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIG5ldyB0Y19maXhfZGF0YSBmaWVsZCBmb3IgdGhlIHZhcmlvdXMKLQliYWNrZW5kcyB0byBhdHRhY2ggbWFjaGluZSBkZXBlbmRlbnQgZml4dXAgaW5mb3JtYXRpb24gdG8uCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBuZXcgdGNfZml4X2RhdGEgZmllbGQuCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBEZWxldGUgdW5uZWNlc3NhcnkgZml4X2ZpeFAgYW5kCi0JZnhfbmV4dCBmaWVsZHMuCi0JKGhwcGFfZmluZF9ocHBhX2ZpeCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSBmdW5jdGlvbi4gIEZpeCBhbGwKLQljYWxsZXJzIHRvIGdldCBIUFBBIGZpeHVwIGluZm9ybWF0aW9uIGZyb20gdGhlIHRjX2ZpeF9kYXRhIGZpZWxkCi0JaW4gdGhlIEdBUyBmaXh1cC4KLQkoaHBwYV9maXhfcm9vdCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSB2YXJpYWJsZS4KLQkoZml4X25ld19ocHBhKTogQXR0YWNoIEhQUEEgZml4dXAgZGF0YSB0byB0aGUgR0FTIGZpeHVwLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zZXRfc3RhcnRfc3ltYm9sKTsgRGVsZXRlIHVud2FudGVkCi0JZnVuY3Rpb24uICBGaXggYWxsIGNhbGxlcnMuCi0JKHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBEZWxldGUgdW51c2VkIHNzZF9zdGFydF9zeW0gZmllbGQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCi0JaWYgYSBwYXJ0aWN1bGFyIGZpeHVwIGlzIGFkanVzdGFibGUuCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19maXhfYWRqdXN0YWJsZSk6IENhbGwgaHBwYV9maXhfYWRqdXN0YWJsZSB0bwotCXBlcmZvcm0gdGhlIHJlYWwgd29yay4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFKTogTW92ZSBkZWZpbml0aW9uIG91dAotCW9mIE9CSl9YWFggY29uZGl0aW9uYWxzLgotCShNQVhfUkVMT0NfRVhQQU5TSU9OKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGxvZzIpOiBSZW5hbWVkIGZyb20gaXNfcG93ZXJfb2ZfMi4gIEZpeCBhbGwKLQljYWxsZXJzLiBOb3cgcmV0dXJucyBsb2cyIChOKSBmb3IgcG9zaXRpdmUgTiB3aGljaCBhcmUgYW4gZXhhY3QKLQlwb3dlciBvZiB0d28gb3IgLTEgZm9yIGFuIGVycm9yLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jYWxsaW5mbyk6IFJhbmdlIGNoZWNrIHZhbHVlcyBwcm92aWRlZCBmb3IKLQlFTlRSWV9HUiwgRU5UUllfRlIgYW5kIEVOVFJZX1NSLiAgUHJvcGVybHkgYWRqdXN0IHZhdWVzIGJlZm9yZQotCWluc2VydGluZyB0aGVtIGludG8gdGhlIHVud2luZCB0YWJsZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoTkVFRFNfRklYVVApOiBEZWxldGUgZGVmaW5pdGlvbiBhbmQgYWxsIHJlZmVyZW5jZXMuCi0JKGhwcGFfZ2VuX3JlbG9jX3R5cGUpOiBOZXcgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbnQgbWFjcm8uCi0JKHBhX2lwKTogRGVsZXRlIHRvbnMgb2YgY29kZSB3aGljaCB3YXMgZWl0aGVyIE9CSl9TT00gb3IgT0JKX0VMRgotCWNvbmRpdGlvbmFsLiAgVGhlIGNvZGUgY2FuIChhbmQgd2lsbCkgYmUgc2hhcmVkIGJldHdlZW4gU09NICYgRUxGCi0JZm9ybWF0cyBpbiB0aGUgbmVhciBmdXR1cmUuCi0JKGNvbnNfZml4X25ld19ocHBhLCBtZF9hcHBseV9maXhfMSk6IExpa2V3aXNlLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UsIHByb2Nlc3NfZXhpdCwgcGFfZXhpdCk6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBVc2UgaHBwYV9nZW5fcmVsb2MgcmF0aGVyIHRoYW4gYW4gb2JqZWN0IGZvcm1hdAotCXNwZWNpZmljIGNhbGwuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBTZXQgdGhlIHNlZ21lbnQgZm9yIGEgY29tbW9uIHN5bWJvbAotCXRvIGJmZF91bmRfc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl92ZXJzaW9uKTogQWRkIGV4dGVybiBwcm90b3R5cGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYS0qLWJzZCopOiBOZXcgY29uZmlndXJhdGlvbi4KLQlCRkQgaXMgYWx3YXlzIHVzZWQgZm9yIEdBUyBnZW5lcmF0aW5nIFNPTSBvYmplY3RzLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jIGlmIGFuCi0JYWRqdXN0bWVudCBpcyByZWplY3RlZCBieSB0aGUgdGFyZ2V0IG1hY2hpbmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2JpZ19jb25zKTogRGVsZXRlIGZ1bmN0aW9uIGFuZCBpdHMKLQlkZWNsYXJhdGlvbi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQgdG8gdXNlIHBhX2NvbnMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBGaXggaW5kZW50aW9uIGFuZCBvcGVuL2Nsb3NlIGJyYWNlCi0JcHJvYmxlbS4KLQotCUZyb20gUGV0ZSBIb29nZW5ib29tOgotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXRvZik6IFJldHVybiBhIE5VTEwgb24gc3VjY2VzcyByYXRoZXIgdGhhbgotCWFuIGVtcHR5IHN0cmluZy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IEFkdmFuY2UKLQlpbnB1dF9saW5lX3BvaXRuZXIgd2hlbiBhbiBpbnZhbGlkIGFyZ3VtZW50IGlzIGVuY291bnRlcmVkLgotCi1UaHUgT2N0IDI4IDEzOjA5OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYmVnaW4pOiBXaGVuIG9wY29kZXMgYXJlIG1hc2hlZCB0b2dldGhlciBpbgotCXRoZSB0YWJsZSwgcmVxdWlyZSB0aGF0IHRoZSBvbmUgd2l0aG91dCBiaXQgMHgxMDAwMDAwIHNldCBjb21lCi0JZmlyc3QuICBSZXF1aXJlIGZ1cnRoZXIgdGhhdCBpdCBiZSBjYXNlICdiJyBvciAnUCcuICBUaGUgYTI5awotCW9wY29kZSB0YWJsZSBhbHJlYWR5IG1lZXRzIHRoZXNlIGNvbnN0cmFpbnRzLgotCShtYWNoaW5lX2lwKTogV2hlbiBoYW5kbGluZyBjYXNlICdpJyBvciAnQScsIG1ha2Ugc3VyZSB0aGF0IHRoZQotCWFwcHJvcHJpYXRlIG9wY29kZSByZWFsbHkgZXhpc3RzIGJ5IGxvb2tpbmcgYXQgdGhlIG5leHQgZW50cnkgaW4KLQl0aGUgb3Bjb2RlIHRhYmxlLgotCi1XZWQgT2N0IDI3IDExOjQ4OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEFkanVzdCBvZmZzZXRzIGZvciBQQyByZWxhdGl2ZQotCWZpeHVwcy4gIEFkZCA2IGZvciBsb25nIDcuMyBjYXNlLCAyIGZvciBzaG9ydCA3LjIgY2FzZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfZWNvZmZfZW50KTogSWdub3JlIGFuIG9wdGlvbmFsIG51bWJlcgotCWFmdGVyIGEgLmVudCBkaXJlY3RpdmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBIYW5kbGUgJz4nIGNhc2UgKHNoaWZ0IGFtb3VudAotCWJldHdlZW4gMzIgYW5kIDYzIGZvciBkb3VibGUgc2hpZnQgaW5zdHJ1Y3Rpb24pLiAgRG8gJiAweDFmIHJhdGhlcgotCXRoYW4gJSAzMi4KLQkocHJpbnRJbnNuKTogSGFuZGxlICc+Jy4KLQotVHVlIE9jdCAyNiAxNjo1ODozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jICh0Y19hb3V0X2ZpeF90b19jaGFycyk6IE91dHB1dCB0aGUgc3ltYm9sCi0JbnVtYmVyIGluIHRoZSByaWdodCBwbGFjZS4gIFVudGVzdGVkLiAgUHJvYmFibHkgZG9lcyBub3Qgd29yayBmb3IKLQljcm9zcyBhc3NlbWJseS4gIEZyb20gY2FnbmV5QGNzLmFkZWxhaWRlLmVkdS5hdSAoQW5kcmV3IENhZ25leSkuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogRXJyb3IgaWYgYSBzaG9ydCBicmFuY2ggdXNlcwotCWFuIGlsbGVnYWwgb2Zmc2V0IG9mIDAgb3IgLTEuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBBbGlnbiAuc3RhYgotCXNlY3Rpb24gdG8gYSBsb25nd29yZCBib3VuZGFyeS4KLQotVHVlIE9jdCAyNiAxMDoyNDozMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENIRUNLRkxBR1MpOiBQYXNzIGRvd24gUlVOVEVTVEZMQUdTLgotCi0JRnJvbSBKZWZmIExhdzoKLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEVMRjMyX0hQUEFfUl9BRERFTkQgLT4KLQlIUFBBX1JfQURERU5ELgotCi1Nb24gT2N0IDI1IDE0OjA2OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRml4IHVwIG1lbWJhciBhcmd1bWVudCBoYW5kbGluZy4KLQotTW9uIE9jdCAyNSAxMToxNzo1OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc2guYyAoYnVpbGRfTWJ5dGVzKTogV3JpdGUgdGhlIHJlbG9jcyB0byB0aGUgY29ycmVjdAotCWFkZHJlc3MuIChtZF9hc3NlbWJsZSk6IE1ha2UgZXJyb3IgaGFuZGxpbmcgYSBiaXQgbW9yZSBncmFjZWZ1bC4KLQkobWRfYXBwbHlfZml4KTogIERvbid0IHdhcm4gb24gbm9uIGFsaWduZWQgZGlzcGxhY2VtZW50LgotCi0JKiBjb25maWcvdGMtejhrLmMgKGdldF9zcGVjaWZpYywgYnVpbHRfYnl0ZXMpOiAgVW5kZXJzdGFuZCBhbGwgdGhlCi0JYXNwZWN0cyBvZiBsZGEuCi0KLU1vbiBPY3QgMjUgMTA6MjA6MzEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogVXNlICIkPCoiIHNvIFZQQVRIIHdpbGwgZmluZAotCWFzLmluZm8qIGV2ZW4gaWYgdGhleSdyZSBpbiAkKHNyY2RpcikgKGUuZy4sIGZvciBGU0YKLQlkaXN0cmlidXRpb25zKS4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogRm9yIHJlbG9jcyB0aGF0IGFyZSBwY19yZWxhdGl2ZSBhbmQKLQlwY3JlbF9vZmZzZXQgYW5kIG5vdCBwYXJ0aWFsX2lucGxhY2UsIGFkanVzdCByZWxvYy0+YWRkZW5kIHRvCi0JY29tcGVuc2F0ZSBmb3IgYSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGJ1Zy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmg6IFJlbW92ZWQgcmVtYWluaW5nIG5vbi1CRkRfQVNTRU1CTEVSIGNvZGUuCi0JKiBjb25maWcvdGMtc3BhcmMuYzogRGl0dG8uCi0JKHRjX2dlbl9yZWxvYyk6IEluY2x1ZGUgZnhfb2Zmc2V0IGZvciBwY3JlbCBmaXh1cHMuCi0KLVN1biBPY3QgMjQgMTY6NDk6MDAgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkB4MS5jeWdudXMuY29tKQotCi0JKiB0Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBkd29yZCBwc2V1ZG8gb3AuCi0KLUZyaSBPY3QgMjIgMjA6NDA6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jOiByZXBsYWNlZCBhbGwgdmFyaWFibGVzIGNhbGxlZCBGb3JtYXQgd2l0aCAnZm9ybWF0JywKLQkgIGZvciBjb25zaXN0ZW5jeSB0aHJvdWdob3V0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIG1pcHMqLSBpbnN0ZWFkIG9mIG1pcHMsIG1pcHMqZWwgZm9yIGxpdHRsZQotCWVuZGlhbiBjb25maWd1cmF0aW9ucwotCi1GcmkgT2N0IDIyIDE0OjQ1OjQ5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW5wdXQtc2NydWIuYyAocGh5c2ljYWxfaW5wdXRfZmlsZSwgbG9naWNhbF9pbnB1dF9maWxlLAotCXBoeXNpY2FsX2lucHV0X2xpbmUsIGxvZ2ljYWxfaW5wdXRfbGluZSk6IE1hZGUgc3RhdGljLgotCShhc193aGVyZSk6IFJldHVybiBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGRvbid0IHByaW50Ci0JdGhlbSBvdXQuCi0JKiBtZXNzYWdlcy5jIChhc19zaG93X3doZXJlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4gIE90aGVyCi0JZnVuY3Rpb25zIHVzZSBpdCBpbnN0ZWFkIG9mIGFzX3doZXJlLgotCShhc19iYWRfaW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhc19iYWQpOiBVc2UgYXNfYmFkX2ludGVybmFsLgotCShhc19iYWRfd2hlcmUpOiBOZXcgZnVuY3Rpb24sIGxpa2UgYXNfYmFkIGJ1dCB0YWtpbmcgYSBmaWxlIG5hbWUKLQlhbmQgbGluZSBudW1iZXIuCi0JKiBhcy5oIChhc19iYWRfd2hlcmUpOiBEZWNsYXJlLgotCShhc193aGVyZSk6IENoYW5nZSBwcm90b3R5cGUgZm9yIG5ldyBhcmd1bWVudHMuCi0JKiB3cml0ZS5oIChmaXhTKTogQWRkZWQgZmllbGRzIGZ4X2ZpbGUgYW5kIGZ4X2xpbmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogU2F2ZSBmaWxlIGFuZCBsaW5lIG51bWJlciBpbiBmaXguCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgotCSogaW5wdXQtZmlsZS5jIChmX2luLCBmaWxlX25hbWUpOiBNYWRlIHN0YXRpYy4KLQkqIGNvbmQuYyAoc3RydWN0IGZpbGVfbGluZSk6IEp1c3QgdXNlIGZpbGUgYW5kIGxpbmUgZmllbGRzLgotCShzX2Vsc2UpOiBVc2UgYXNfd2hlcmUgYW5kIGFzX2JhZF93aGVyZSwgbm90IGdldF9maWxlX2xpbmUgYW5kCi0Jc2V0X2ZpbGVfbGluZS4KLQkoZ2V0X2ZpbGVfbGluZSwgc2V0X2ZpbGVfbGluZSk6IFJlbW92ZWQuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUpOiBVc2UgYXNfd2hlcmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIGFzX3doZXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBVc2UgYXNfYmFkX3doZXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAodGNfZ2VuX3JlbG9jKTogVXNlIGFzX2JhZF93aGVyZSwgbm90IGFzc2VydC4KLQotVGh1IE9jdCAyMSAxMjo1MjowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuaDogRG9uJ3QgZGVmaW5lIFJFR0lTVEVSX1BSRUZJWCBvcgotCU9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCBpZiBlaXRoZXIgaXMgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRGVsZXRlIHNvbWUgY29kZSBpbiAiI2lmIDAiLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBiZmRfZ2FzIGZvciBhbGwgc3BhcmMgdGFyZ2V0cy4gIEFkZGVkIGZhY2lsaXR5Ci0JZm9yIGtlZXBpbmcgb3IgcmVqZWN0aW5nIGNvbmZpZ3VyYXRpb25zIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50OwotCWRlZmF1bHQgaXMgdG8gYXNzdW1lIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIGFuZCByZWplY3QgY29uZmlncwotCXN0aWxsIGJlaW5nIHdvcmtlZCBvbi4gIE1hcmsgRWxmIGNvbmZpZ3VyYXRpb25zIChleGNlcHQgc3BhcmMgYW5kCi0JaTM4NikgYXMgZGV2ZWxvcG1lbnRhbC4gIERlbGV0ZWQgY2FzZXMgbWF0Y2hpbmcgc29tZSBnZW5lcmljIG5hbWVzCi0JaW4gZmF2b3Igb2YgbW9yZSBzcGVjaWZpYyBuYW1lcy4gIChFLmcuLCB3aGVuIHdlIGdldCBBbHBoYQotCXN1cHBvcnQsIHdlJ2xsIHN0aWxsIG9ubHkgc3VwcG9ydCBWTVMgZm9yIFZheC4pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9lbmQpOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfZW5kKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoQkZEX1JFTE9DXyopOiBEZWxldGUgbWFjcm9zIHRoYXQgdXNlZCB0byBoZWxwIGtlZXAgdGhlIG5vbi1iZmQKLQl2ZXJzaW9uIGNvbXBpbGluZy4gIEFsbCBzcGFyYyB0YXJnZXRzIHdpbGwgdXNlIGJmZCBub3cuCi0JKiB0Yy5oIChtZF9lbmQpOiBEb24ndCBkZWNsYXJlIGlmIGl0J3MgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlciBIb29nZW5ib29tOgotCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaW1pdCBvY3RhbCBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvCi0JdGhyZWUgZGlnaXRzLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBNYWpvciBjbGVhbnVwLiAgVXNlIEdOVS1zdHlsZSBjb21tZW50cy4gIFdhcm4KLQlhZ2FpbnN0IHBsYWNpbmcgYWRkaXRpb25hbCBvYmplY3QtZmlsZSBkZXBlbmRlbnQgY29kZSBoZXJlLiAgV2FybgotCWFnYWluc3QgY29udGFtaW5hdGluZyBhbGwgb2YgR0FTIHdpdGggdGhlIGludGVybmFscyBvZiB0Yy1ocHBhLmMKLQl0aHJvdWdoIGluY2x1c2lvbiBvZiB0Yy1ocHBhLmguICBEZWxldGUgYWxsIGZvcndhcmQgZGVjbGFyYXRpb25zCi0JZm9yIGZ1bmN0aW9ucyBvbmx5IHVzZWQgd2l0aGluIHRjLWhwcGEuYywgbGlrZXdpc2UgZm9yIHN0cnVjdHVyZXMsCi0JdmFyaWFibGVzLCBhbmQgI2RlZmluZXMuICBUcnkgdG8gZ3JvdXAgT0JKX0VMRiBhbmQgT0JKX1NPTQotCWNvbmRpdGlvbmFsIGNvZGUgaW4gYSBmZXcgc21hbGwgcGxhY2VzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBNYWpvciBjbGVhbnVwLiAgVXNlIEdOVS1zdHlsZSBjb21tZW50cy4gIEdyb3VwCi0Jc3RydWN0dXJlcywgZ2xvYmFsIHZhcmlhYmxlcywgZm9yd2FyZCBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuCi0JUmVkdWNlIChvciBpbiBzb21lIGNhc2VzIGVsaW1pbmF0ZSkgT0JKX0VMRiBhbmQgT0JKX1NPTQotCWNvbmRpdGlvbmFsIGNvZGUgLS0gdHJ5IHRvIGdyb3VwIGNvbmRpdGlvbmFsIGNvZGUgdG9nZXRoZXIKLQlpbnRvIGEgZmV3IHBsYWNlcy4gICBNYWtlIGFsbCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyB3aGljaAotCWFyZSBvbmx5IHVzZWQgd2l0aGluIHRjLWhwcGEuYyBzdGF0aWMuICBQQVJBTWl6ZSBhbGwgZnVuY3Rpb25zLgotCUFkZCBjb21tZW50cyB0byBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkIGZ1bmN0aW9ucywgdmFyaWFibGVzLAotCSNkZWZpbmVzLCBldGMuICBEZWxldGUgdW51c2VkIG1lbWJlcnMgd2l0aGluIHN0cnVjdHVyZXMuICBEZWxldGUKLQlsZGlsO2JsZSBoYWNrcyAtLSBpdCBpcyBiZWxpZXZlZCB0aGV5IHdlcmUgaW5zdGFsbGVkIHRvIHdvcmsKLQlhcm91bmQgb2xkIGdhcyBidWdzLiAgIEF2b2lkIHVzaW5nIG1peGVkIGNhc2UgZm9yIGxvY2FsCi0JZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBzdHJ1Y3R1cmVzLiAgRml4IGZvcm1hdHRpbmcgcHJvYmxlbXMKLQlub3QgZm91bmQgYnkgR05VLWluZGVudC4gIEFkZCBGSVhNRSBub3RpY2VzIGZvciB0aGluZ3Mgd2hpY2gKLQlzaG91bGQgYmUgd29ya2VkIG9uIHRoZSBuZWFyIGZ1dHVyZS4gIERlbGV0ZSBsb3RzIG9mIG9sZAotCXVzZWxlc3MgKDEuMzYgUEEtU09NKSBjb2RlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiAoZml4X25ld19ocHBhKTogSW5pdGlhbGl6ZSB0aGUgZnhfcl90eXBlCi0JZmllbGQgb2YgdGhlIGZpeFMgc3RydWN0dXJlLiAgTmVlZGVkIHRvIGJ1aWxkIHVud2luZAotCWRlc2NyaXB0b3JzIGNvcnJlY3RseS4KLQotCSogd3JpdGUuYzogKGZpeHVwX3NlZ21lbnQpOiBBbGxvdyBleHByZXNzaW9ucyBzdWNoIGFzCi0Jc3ltMS1zeW0yK2NvbnN0IGFzIGxvbmcgYXMgc3ltMiBpcyAkZ2xvYmFsJC4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBQcm92aWRlIGEgaG9vayBzbyB0aGF0IGEgdGFyZ2V0Ci0JY3B1IGNvbmZpZ3VyYXRpb24gY2FuIHJlamVjdCBjZXJ0YWluIHJlbG9jYXRpb24gcmVkdWN0aW9ucy4KLQkqIHRjLWhwcGEuaCAodGNfZml4X2FkanVzdGFibGUpOiBOZXcgbWFjcm8uICBPbmx5IGFjY2VwdCByZWxvY2F0aW9ucwotCXdoaWNoIGRvIG5vdCBpbnZvbHZlIGZ1bmN0aW9uIHN5bWJvbHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlaW5kZW50IHdpdGggR05VLWluZGVudC4gIERlbGV0ZSByZWZlcmVuY2VzCi0JdG8gT0JKX09TRlJPU0UuICBGaXggdHlwb3MgKE9CSl9TT01FIC0+IE9CSl9TT00pLiAgRGVsZXRlIHVudXNlZAotCVNUQUJfRklYVVAgbWFjcm8uCi0JKiBjb25maWcvdGMtaHBwYS5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4XzEpOiBVc2UgZWxmX3N5bWJvbF90eXBlLCBpbnN0ZWFkCi0Jb2YgZWxmMzJfc3ltYm9sX3R5cGUuCi0JKHBhX2V4cG9ydF9hcmdzKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkocGFfZGVzYyk6IERvIG5vdCBjYWxsIG9ial9lbGZfZGVzYy4gIChJcyBwYV9kZXNjIGV2ZW4gbmVlZGVkCi0JYW55bW9yZT8pCi0JKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IERvIG5vdCBkZWNsYXJlIGVsZl9nZXRfc3ltdGFiX21hcCBhbnkKLQlvcmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IChtZF9zZWN0aW9uX2FsaWduKTogQWxpZ24gYWxsIHNlY3Rpb25zIHRvCi0JYSBtdWx0aXBsZSBvZiB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgcmF0aGVyIHRoYW4gYWx3YXlzIGEKLQltdWx0aXBsZSBvZiA4LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IElmIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0JYml0cyBhcmUgemVybyAoZWcgdGhleSBzcGVjaWZ5IG5vIHJlbG9jYXRpb25zKSwgdGhlbiBkbyBub3QgZXZlbgotCWJvdGhlciBhZGRpbmcgdGhlaXIgZW50cmllcyB0byB0aGVzeW1leHRuIHNlY3Rpb24uCi0KLVRodSBPY3QgMjEgMTU6NDQ6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgLXNwYXJjCi0Jb3B0aW9uLCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBTdW5PUyBtYWtlIGRlZmF1bHQgLnMubyBydWxlLgotCi1XZWQgT2N0IDIwIDEyOjI2OjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXAsIGxhYmVsICJpbW1lZGlhdGUiKTogQ29udmVydCByZWxvY3MKLQlvcGVyYXRpbmcgb24gdXBwZXIgMzIgYml0cyBvZiBpbW1lZGlhdGUgY29uc3RhbnRzIHRvIGxvd2VyLWhhbGYKLQlyZWxvY3Mgd2l0aCBhZGp1c3RlZCBjb25zdGFudHMuCi0KLVR1ZSBPY3QgMTkgMTg6MTM6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIHRvIGJlIGV4dGVybmFsIHZhcmlhYmxlCi0JbTY4a19hb3V0X21hY2h0eXBlLgotCSogY29uZmlnL3RjLW02OGsuYyAob21hZ2ljKTogUmVtb3ZlIG9ic29sZXRlIGFuZCB1bnVzZWQgdmFyaWFibGUuCi0JKG02OGtfYW91dF9tYWNodHlwZSk6IE5ldyB2YXJpYWJsZSwgaWYgT0JKX0FPVVQuCi0JKG1kX2Fzc2VtYmxlKTogSW5pdGlhbGl6ZSBtNjhrX2FvdXRfbWFjaHR5cGUgYmFzZWQgb24KLQljdXJyZW50X2FyY2hpdGVjdHVyZSwgaWYgT0JKX0FPVVQuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2UgdG8gb21hZ2ljLgotCi1UaHUgT2N0IDE0IDE2OjUxOjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogSWdub3JlIC5saXZlcmVnIHBzZXVkby1vcC4KLQkoc19vcHRpb24pOiBJZ25vcmUgLm9wdGlvbiBPKiBhbmQgLm9wdGlvbiBwaWMqLgotCShzX2VudCk6IFNraXAgd2hpdGVzcGFjZSBiZXR3ZWVuIHN5bWJvbCBhbmQgb3B0aW9uYWwgZGlnaXQuCi0JKG15X2dldFNtYWxsRXhwcmVzc2lvbik6IEhhbmRsZSAoJHh4KSBjb3JyZWN0bHk6IGFzc3VtZSAwKCR4eCkuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBbHdheXMgYWNjZXB0ICd4JyBhbmQgJ1gnIGFzIGVzY2FwZQotCWNoYXJhY3RlcnMgaW4gc3RhdGUgNi4KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IEFjY2VwdCBcWGgqIGFuZCBceGgqIHdoZXJlIGgqIGFyZQotCWhleGlkZWNpbWFsIGRpZ2l0cy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4XzEpOiBNYWtlIGNyb3NzIHNlZ21lbnQgY2FsbHMgd29yawotCWZvciBFTEYgYnkgaGFja2luZyBhcm91bmQgYml6YXJyZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGJlaGF2aW91cgotCXRoYXQgSSBkb24ndCBkYXJlIGNoYW5nZS4KLQotVGh1IE9jdCAxNCAxMTozMzoyNSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogY29uZmlnL3RjLWkzODYuYzogKG1kX2JlZ2luKTogRG8gbm90IHplcm8gc3RhdGljIGFycmF5cy4gIERvbid0Ci0JY2FsbCBzdHJjaHIgZm9yIGVhY2ggY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgY2hhciwKLQlpbnN0ZWFkIGFkZCBhIHNlY29uZCBsb29wIG92ZXIgc3BlY2lhbF9jaGFycy4gIFNldCBhbGlnbm1lbnQKLQlvZiB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdG8gNC4KLQkocGksIHRlLCBwdCwgcGUsIHBzKTogQWRkIGRlY2xhcmF0aW9ucyBzbyB0aGF0IERFQlVHMzg2IGNhbiBiZQotCXVzZWQgYWdhaW4uCi0JKHJlbG9jKTogRG9uJ3QgcmV0dXJuIDggYW5kIDE2IGJpdCBub24tUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgb24KLQlFTEYsIHNpbmNlIHRoZSBFTEYgb2JqZWN0IGZvcm1hdCBkb2VzIG5vdCBoYXZlIHRoZXNlIHR5cGUgb2YKLQlyZWxvY2F0aW9ucy4gIENoYW5nZSB0aGUgYWJvcnQgaW50byBhcyBhc19iYWQgYW5kIHJldHVybgotCUJGRF9SRUxPQ19OT05FIHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MuCi0JKG1kX2Fzc2VtYmxlKTogS2VlcCB0cmFjayBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2l6ZS4gIEFsbG93IHdoaXRlCi0Jc3BhY2UgYmV0d2VlbiB0aGUgJCBhbmQgdGhlIGNvbnN0YW50IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKLQlnYXNlcyBhbmQgb3RoZXIgYXNzZW1ibGVycy4KLQkoaTM4Nl9vcGVyYW5kKTogU2tpcCBzcGFjZXMgYmV0d2VlbiAkIGFuZCBleHByZXNzaW9uLgotCSh0Y19nZW5fcmVsb2MpOiBEb24ndCBhbGxvdyBhbnl0aGluZyBidXQgMzIgYml0IHJlbG9jYXRpb25zIG9uCi0JRUxGLiAgQ29udmVydCBhYm9ydCBpbnRvIGFuIGFzX2JhZCBhbmQgYXNzZXJ0IGludG8gYXNfZmF0YWwuCi0KLVdlZCBPY3QgMTMgMTY6NTA6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCkgW0RJRkZfRVhQUl9PS106IElmCi0Jc3ViX3N5bWJvbFAgaXMgaW4gdGhlIGN1cnJlbnQgc2VnbWVudCwgY29udmVydCB0byBhIFBDLXJlbGF0aXZlCi0JZml4dXAgYW5kIGRpc2NhcmQgdGhlIHN5bWJvbC4KLQotV2VkIE9jdCAxMyAxNDowMDowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEhhbmRsZSBzdF9FbmQgc3ltYm9sCi0JZm9yIHN0X1N0YXRpY1Byb2MganVzdCBsaWtlIHN0X1Byb2MuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IE1vdmVkICNlbmRpZiBmb3IgT0JKX0JPVVQKLQlzbyB0aGF0IE9CSl9CT1VUIGRvZXNuJ3QgZm9yZ2V0IHRvIGFkanVzdCBhbGwgdGhlIGZyYWdtZW50cyBpbiB0aGUKLQkuYnNzIHNlY3Rpb24uCi0KLVR1ZSBPY3QgMTIgMTc6MjY6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJZiBPQkpfRUxGLCBpbmNsdWRlIGVsZi9taXBzLmguCi0JKG1pcHNfcmVnbWFza19mcmFnKTogTmV3IHN0YXRpYyB2YXJpYWJsZSwgaWYgT0JKX0VMRi4KLQkobWRfYmVnaW4pOiBJZiBPQkpfRUxGLCBjcmVhdGUgLnJlZ2luZm8gc2VjdGlvbiBhbmQgc2V0Ci0JbWlwc19yZWdtYXNrX2ZyYWcgdG8gYSBmcmFnLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLCBpZiBPQkpfRUxGLiAgU2V0Ci0JbWlwc19yZWdtYXNrX2ZyYWcgdG8gcmVnaXN0ZXIgbWFzayBpbmZvcm1hdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nKTogTmV3IG1hY3JvLCBkZWZpbmVkCi0JaWYgT0JKX0VMRi4KLQotVHVlIE9jdCAxMiAwMzozMzoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogVXNlIG15bmFtZSB3aGVuIHByaW50aW5nIG1lc3NhZ2VzLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9iZWdpbik6IFVzZSBudWxsIHBvaW50ZXIsIG5vdCBlbXB0eSBzdHJpbmcsCi0JYXMgaW5pdGlhbCAicmV0dXJuIiB2YWx1ZSBpbiBjYXNlIGhhc2hpbmcgaXNuJ3QgbmVlZGVkLgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwsIG5vdCBlbXB0eSBzdHJpbmcsIG9uCi0Jc3VjY2Vzcy4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9hdG9mKSwgY29uZmlnL3RjLWg4NTAwLmMgKG1kX2F0b2YpLAotCWNvbmZpZy90Yy1ocHBhLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtaTg2MC5jIChtZF9hdG9mKSwKLQljb25maWcvdGMtaTk2MC5jIChtZF9hdG9mKSwgY29uZmlnL3RjLW04OGsuYyAobWRfYXRvZiksCi0JY29uZmlnL3RjLW5zMzJrLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtc2guYyAobWRfYXRvZik6IERpdHRvLgotCi1Nb24gT2N0IDExIDE2OjQ2OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQlmaXggZm9yIHByIDM1NzEKLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBTcGVjaWFsIGFjdGlvbiBpZiA4IGJpdAotCWFkZHJlc3Mgc2Vlbi4gKGNoZWNrX29wZXJhbmQpOiBEb24ndCBjb21wbGFpbiBpZiB0cnVuY2F0aW5nIHRvcAotCWJpdHMgb2YgYW4gOCBiaXQgYWRkcmVzcy4gIChidWlsZF9ieXRlcyk6IEFsbG93IGFuIGltbWVkaWF0ZSBhbmQKLQlhbiBhYnNvbHV0ZSBpbiB0aGUgc2FtZSBpbnNuLgotCi1Nb24gT2N0IDExIDE3OjE4OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEb24ndCBjcmFzaCBpZiBzZWdpbmZvIGlzIE5VTEwuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogV3JpdGUgb3V0IHJlZ2lzdGVyIG1hc2tzCi0JYnkgbW9kaWZ5aW5nIC5yZWdpbmZvIHNlY3Rpb24sIG5vdCBieSBkaXJlY3RseSBtb2RpZnlpbmcgQkZECi0JYmFja2VuZCBkYXRhLgotCi1Nb24gT2N0IDExIDE0OjExOjMyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXN1bm9zLmg6IHJlbW92ZSBleHRlcm4gdGltZSBkZWNsYXJhdGlvbgotCi1Nb24gT2N0IDExIDE2OjE0OjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwpOiBEbyBtZW50aW9uIHRoYXQgaXQncyB0aGUgYXNzZW1ibGVyIHRoYXQKLQlnb3QgdGhlIGZhdGFsIGVycm9yLgotCi1GcmkgT2N0ICA4IDE0OjA5OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19ncHJtYXNrLCBtaXBzX2Nwcm1hc2spOiBOZXcgdmFyaWFibGVzIHRvCi0JaG9sZCByZWdpc3RlciBtYXNrcy4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIHRoZW0gdG8gemVyby4KLQkoYXBwZW5kX2luc24pOiBVcGRhdGUgbWlwc19ncHJtYXNrIGFuZCBtaXBzX2Nwcm1hc2suICBBbHNvIGFkZAotCXJlZ2lzdGVyIHZhcmlhYmxlcyBwaW5mbyBhbmQgcHJldl9waW5mby4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1pcHNfZ3BybWFzaywgbWlwc19jcHJtYXNrKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogSWYgVENfTUlQUywgc2V0IGdwcm1hc2sKLQlhbmQgY3BybWFzayBmcm9tIG1pcHNfZ3BybWFzayBhbmQgbWlwc19jcHJtYXNrLgotCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgVEFSR0VUX0ZPUk1BVCBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLW1pcHMuYyAoR1BPUFQpOiBEZWZpbmUgaWYgT0JKX0VDT0ZGIG9yIE9CSl9FTEYuCi0JKHZhcmlvdXMpOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gR1AgcmVmZXJlbmNlcyB0byBhcHBseSBpZgotCUdQT1BULCBub3QgaWYgT0JKX0VDT0ZGLgotCShzX2NoYW5nZV9zZWMpOiBSZWFycmFuZ2Ugc29tZXdoYXQuICBJZiBPQkpfRUxGLCB1c2UgLnJvZGF0YQotCWluc3RlYWQgb2YgLnJkYXRhLiAgSWYgT0JKX0VMRiwgc2V0IHNlY3Rpb24gZmxhZ3MgZm9yIC5yb2RhdGEgYW5kCi0JLnNkYXRhIHNlY3Rpb25zLgotCShzX2ZyYW1lLCBzX2xvYywgc19tYXNrKTogQ29tbWVudCBvdXQgZW50aXJlIGZ1bmN0aW9ucywgcmF0aGVyCi0JdGhhbiBqdXN0IGJvZHkuICBUaGV5J3JlIG5vdCB1c2VkIGFueWhvdy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGNwdV90eXBlIHRvIG1pcHMgZm9yIG1pcHMqLiAgQWNjZXB0Ci0JbWlwcy0qLWVsZmwqIGFuZCBtaXBzLSotZWxmKi4KLQotVGh1IE9jdCAgNyAxODozNjoyOSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBBbGxvdyB0aGUgYWxpZ25tZW50IGZpZWxkIHRvCi0Jbm90IGJlIHNwZWNpZmllZC4KLQotV2VkIE9jdCAgNiAxMzowMTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNvbnNfZml4X25ld19taXBzKTogTmV3IGZ1bmN0aW9uLiAgVHVybgotCUJGRF9SRUxPQ182NCBpbnRvIEJGRF9SRUxPQ18zMi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRDX0NPTlNfRklYX05FVyk6IERlZmluZS4KLQkoY29uc19maXhfbmV3X21pcHMpOiBEZWNsYXJlLgotCi0JQ2hhbmdlcyB0byBsZXQgY29ucyBoYW5kbGUgYmlnbnVtcyBsaWtlIGdlbmVyYWwgZXhwcmVzc2lvbnMuCi0JKiBleHByLmggKGV4cHJlc3Npb25TKTogTmV3IGZpZWxkIFhfdW5zaWduZWQuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJbml0aWFsaXplIFhfdW5zaWduZWQgdG8gMS4gIFNldCBpdCB0byAwIGZvcgotCXVuYXJ5IG1pbnVzIGNhc2UuCi0JKGV4cHIpIEZpeCB0eXBvIHJlc3VsdFAgdG8gcmlnaHQgaWYgbWlzc2luZyBvcGVyYW5kLiAgU2V0Ci0JWF91bnNpZ25lZCB0byAxIHdoZW4gYnVpbGRpbmcgbmV3IGV4cHJlc3Npb24uCi0JKiByZWFkLmMgKHBvdGFibGUpOiBNYWtlICJvY3RhIiBhbmQgInF1YWQiIGNhbGwgY29ucywgbm90Ci0JYmlnX2NvbnMuCi0JKGNvbnMpOiBIYW5kbGUgYmlnbnVtcy4gIElmIGdpdmVuIGFuIE9fY29uc3RhbnQgKHNtYWxsIGludGVnZXIpIHRvCi0JZmlsbCBhIGJpZyBzcGFjZSwgdHVybiBpdCBpbnRvIGEgYmlnbnVtLgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogU2V0IFhfdW5zaWduZWQgZmllbGQuCi0JKGJpZ251bV9sb3csIGJpZ251bV9saW1pdCwgYmlnbnVtX2hpZ2gsIGdyb3dfYmlnbnVtLCBiaWdfY29ucyk6Ci0JUmVtb3ZlZC4KLQkqIHJlYWQuaCAoYmlnX2NvbnMpOiBSZW1vdmUgcHJvdG90eXBlLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IGdpdmUgYSB3YXJuaW5nIGlmIGEKLQlzeW1ib2wgaW4gZXhwcl9zZWN0aW9uIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JKFNfU0VUX1ZBTFVFKTogQ2xlYXIgWF91bnNpZ25lZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgZmFpbGVkIG9uIGEKLQlzeW1ib2wgd2UgYXJlIHdyaXRpbmcgb3V0LCBnaXZlIGEgd2FybmluZy4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChwYXJzZV9yZWdsaXN0KTogU2V0IFhfdW5zaWduZWQuCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBDaGFuZ2UgIm9jdGEiIGFuZCAicXVhZCIgdG8KLQljYWxsIHBhX2NvbnMsIG5vdCBwYV9iaWdfY29ucy4KLQkocGFfYmlnX2NvbnMpOiBSZW1vdmUuCi0JKiBjb25maWcvdGMtaHBwYS5oIChwYV9iaWdfY29ucyk6IFJlbW92ZSBkZWNsYXJhdGlvbi4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSAicXVhZCIgdG8gY2FsbCBjb25zLAotCW5vdCBiaWdfY29ucy4KLQotVHVlIE9jdCAgNSAxMDo1MzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChDb3B5aW5nKTogbmV3IG5vZGUsIHRvIGhhbmRsZSB0aGUgcmVjZW50IGNoYW5nZXMKLQlpbiB0aGUgdGV4aW5mby9ncGwudGV4aW5mbyBmaWxlCi0KLU1vbiBPY3QgIDQgMTc6MTA6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGJpZ19jb25zKTogSGFuZGxlICIwIiBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogU2V0IHRhcmdldF9iaWdfZW5kaWFuIGNvcnJlY3RseS4KLQotTW9uIE9jdCAgNCAxNTozNzo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBNb2RlIDcuMyBvcGVyYW5kIHVzaW5nIFBDIHNob3VsZAotCWhhdmUgcGMtcmVsYXRpdmUgZml4dXAuCi0JKG1kX3BhcnNlX29wdGlvbik6IE1vdmUgIi1rIiBjYXNlIGRvd24gbmVhciAiLXBpYyIgY2FzZS4KLQotCSogY29uZmlndXJlLmluOiBBbHBoYWJldGl6ZSBsaXN0IG9mIGNwdSB0eXBlIGFsdGVybmF0aXZlcy4gIEVuYWJsZQotCU9TIHZhbHVlcyBvZiAibGludXgqZWxmKiIgYW5kICJsaW51eCpjb2ZmKiIgdG8gc2VsZWN0IHRob3NlCi0JZm9ybWF0cywgd2l0aCBsaW51eCBlbXVsYXRpb24uICBEb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIHVwcGVyLQotCW9yIG1peGVkLWNhc2UgdmVyc2lvbnMgb2YgIm9zZSIuCi0KLVRodSBTZXAgMzAgMTE6MDU6MzUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3o4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBhZGQgInVuc2VnIi4KLQotV2VkIFNlcCAyOSAxNjoxNToxMSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLW9wY29kZS5oIChtODhrX29wY29kZXMpOiBjb3JyZWN0IGEgZmV3IG1pc3Rha2VzCi0JICBmb3VuZCB3aGlsZSBleHRlbmRpbmcgdGhlIGRpc3Nhc3NlbWJsZXIuCi0KLVR1ZSBTZXAgMjggMTI6MDI6MDQgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFNwbGl0IGkzODYgTHlueE9TIG91dCBmcm9tIG90aGVyIGNvZmYgdGFyZ2V0cywKLQlhZGQgYSBzcGVjaWZpYyBMeW54IGVtdWxhdGlvbi4KLQlBZGQgbTY4ayBMeW54T1MgdGFyZ2V0LgotCSogY29uZmlnL3RjLWkzODYuYzogRGVmaW5lIHNwZWNpZmljIEx5bnggdGFyZ2V0IGZvcm1hdC4KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IERlZmluZSBzcGVjaWZpYyBMeW54IHRhcmdldCBmb3JtYXQuCi0JKiBjb25maWcvdGUtbHlueC5oOiBOZXcgZmlsZS4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IERvbid0IHNldCBUQVJHRVRfRk9STUFUIHRvIGJlCi0JImNvZmYte2kzODYsbTY4a30iIGlmIFRBUkdFVF9GT1JNQVQgYWxyZWFkeSBkZWZpbmVkLgotCShJTklUX1NUQUJfU0VDVElPTik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBJbmNsdWRlIDx0aW1lLmg+LgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IExvb2sgZm9yIC5zdGFiIHNlY3Rpb25zIGFuZCBjYWxsCi0JYWRqdXN0X3N0YWJfc2VjdGlvbi4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwgZmlsbHMgaW4gdGhlIGZpcnN0IHN5bWJvbAotCW9mIGEgc3RhYiBzZWN0aW9uIHdpdGggbnVtYmVyIG9mIHN5bWJvbHMgYW5kIHN0cmluZyB0YWJsZSBzaXplLgotCShvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwgY3JlYXRlcyB0aGUgaW5pdGlhbAotCXN5bWJvbCBmb3IgYSBzdGFiIHNlY3Rpb24uCi0KLU1vbiBTZXAgMjcgMTU6MjE6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYXRvZi12YXguYyAobWRfYXRvZik6IFJldHVybiBudWxsIG9uIHN1Y2Nlc3MgaW5zdGVhZCBvZgotCWVtcHR5IHN0cmluZy4KLQkqIGNvbmZpZy9hdG9mLXRhaG9lLmMgKG1kX2F0b2YpOiBEaXR0by4KLQkqIHJlYWQuYyAoZmxvYXRfY29ucyk6IEV4cGVjdCBhIG51bGwgcG9pbnRlciBmb3Igc3VjY2Vzcywgbm90IGFuCi0JZW1wdHkgc3RyaW5nLgotCi0JKiBoYXNoLmMgKGhhc2hfaW5zZXJ0LCBoYXNoX2phbSwgaGFzaF9ncm93KTogUmV0dXJuIG51bGwgcG9pbnRlcgotCW9uIHN1Y2Nlc3MsIGluc3RlYWQgb2YgZW1wdHkgc3RyaW5nLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQotCSogY29uZmlnL3RjLXZheC5jOiBVc2UgUEFSQU1TIGluIGRlY2xhcmF0aW9ucy4KLQkodmlwX29wKTogVXNlIE5VTEwgaW5zdGVhZCBvZiBlbXB0eSBzdHJpbmcgZm9yIHN1Y2Nlc3MgaW4gZXJyb3IKLQlhbmQgd2FybmluZyBmaWVsZHMuCi0KLVN1biBTZXAgMjYgMjM6NDU6MjkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKGV4cHIpIFtESUZGX0VYUFJfT0tdOiBQZXJtaXQgc3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMKLQlpbiBkaWZmZXJlbnQgZGVmaW5lZCBzZWdtZW50cy4KLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IExvY2FsaXplICJhaW0iIHZhcmlhYmxlLiAgSWYKLQlESUZGX0VYUFJfT0ssIGRvbid0IGltcG9zZSBjaGVja3Mgb24gc3ltYm9sIHNlZ21lbnQgdHlwZXMuCi0JKGZpeHVwX3NlZ21lbnQpIFtESUZGX0VYUFJfT0tdOiBJZiBzdWJfc3ltYm9sUCBpcyBpbiB0aGUgY3VycmVudAotCXNlZ21lbnQsIGNvbnZlcnQgdG8gYSBQQy1yZWxhdGl2ZSBmaXh1cCBhbmQgZGlzY2FyZCB0aGUgc3ltYm9sLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChmbGFnX3dhbnRfcGljKTogTmV3IHZhcmlhYmxlLCBtb3N0bHkgaWdub3JlZC4KLQkobWRfcGFyc2Vfb3B0aW9uKSBbVEVfU1VOM106IFNldCBpdCBmb3IgIi1rIi4KLQkobTY4a19pcCk6IEdlbmVyYXRlIHByb3BlciBmaXh1cCBmb3IgbW9kZSA3LjMuCi0JKiBjb25maWcvdGMtbTY4ay5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUuCi0KLVNhdCBTZXAgMjUgMDU6MDg6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19pbmNhbnQsIGdldG9uZSwgZ2V0dHdvKTogTW92ZWQKLQllYXJsaWVyIGluIHRoZSBmaWxlLgotCShpbnNvcCwgYWRkX2V4cCk6IE5vdyBkZWZpbmVkIGFzIGZ1bmN0aW9ucywgZm9yIHJlYWRhYmlsaXR5LgotCShpbnNvcCk6IE5vdyB0YWtlcyB0d28gYXJndW1lbnRzOyBjYWxsZXJzIGNoYW5nZWQuCi0KLUZyaSBTZXAgMjQgMTI6Mzc6NTkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTg4ay5jIChnZXRfbzYpOiBuZXcgZnVuY3Rpb24uCi0JICAoZ2V0X2JmLCBnZXRfY21wLCBnZXRfY25kLCBnZXRfY3IsIGdldF9mY3IsIGdldF9pbW0xNiwgZ2V0X3JlZywKLQkgIGdldF92ZWM5LCBnZXR2YWwsIGdldF9wY3IsIGNhbGNvcCwgbWF0Y2hfbmFtZSk6IG1ha2Ugc3RhdGljIGFuZAotCSAgcHJvdG90eXBlLgotCSAgKHNfZmlsZSk6IHJlbW92ZSBleHRyYW5lb3VzIGZvcndhcmQgZGVjbC4KLQkgIChtZF9iZWdpbik6IGFkZCBjb25zdCB0byByZXR2YWwgZGVjbC4KLQkgIChjYWxjb3ApOiBjb3BlIHdpdGggaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYXJndW1lbnRzLiAgSGFuZGxlICdvJwotCSAgdHlwZSBhcmd1bWVudCwgdGhlIG82IGZpZWxkIG9mIHRoZSBwcm90IGluc24uCi0JICAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiByZXR1cm4gYSBkdW1teSB2YWx1ZS4KLQotCSogY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IGNvbW1lbnQgY2hhbmdlOyBvNiBmaWVsZCBpcwotCSAgaW4gYml0cyAxMCB0aHJvdWdoIDcuICBmbHQuW2R4c11zIHJlcXVpcmVzIGFuIHIgcmVnaXN0ZXIgaW4gdGhlCi0JICBzZWNvbmQgYXJndW1lbnQuICBOZXcgaW5zdHJ1Y3Rpb24gbGRhLnguICBOZXcgaW5zdHJ1Y3Rpb24gbXVscwotCSAgKGFsaWFzIGZvciBtdWwpLgotCi1GcmkgU2VwIDI0IDEzOjQzOjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlY3Vyc2UgbGlrZSBjbGVhbi4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBTZXQgQkZEIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotCWJhc2VkIG9uIE1JUFMgSVNBIGxldmVsLgotCi1UaHUgU2VwIDIzIDE3OjU4OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAobWFpbik6ICJleGhhdXN0ZWQiLCBub3QgImV4aHVhc3RlZCIuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogQWRkIHN5X3VzZWRfaW5fcmVsb2MgZmllbGQuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IE5ldmVyIHN0cmlwIHN5bWJvbHMgd2l0aCBzeV91c2VkX2luX3JlbG9jCi0Jc2V0LgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBSZXdyb3RlIHRvIGhhbmRsZSBib3RoCi0JU29sYXJpcyBhbmQgU1ZSNCBzdHlsZSAuc2VjdGlvbiBwc2V1ZG8tb3BzLgotCShvYmpfZWxmX2lkZW50KTogU2V0IFNFQ19SRUFET05MWSBmb3IgLmNvbW1lbnQgc2VjdGlvbi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJZiB0aGlzIGlzIEVMRiwgYW5kIHdlJ3JlCi0JZ2VuZXJhdGluZyBhIHJlbG9jLCBkb24ndCBhcHBseSBhIGZpeC4KLQotVGh1IFNlcCAyMyAxMzoxNjo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChyZWxheF9hbGlnbik6IE5vdyBzdGF0aWMuCi0KLU1vbiBTZXAgMjAgMTk6MjM6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBNYWtlIG5vbi1zdGF0aWMuICBNYWtlCi0JYXJndW1lbnRzIGNvbnN0LiAgRG9uJ3QgYWxpZ24gc3RyaW5ncyB0byA0IGJ5dGUgYm91bmRhcmllcy4KLQkqIHJlYWQuaDogRGVjbGFyZSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogU2V0IFNFQ19BTExPQyBhcyB3ZWxsIGFzCi0JU0VDX0xPQUQgZm9yIHByb2diaXRzIHNlY3Rpb24uCi0JKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogY29uZmlnL29iai1lbGYuaCAoSU5JVF9TVEFCX1NFQ1RJT04pOiBDYWxsCi0Jb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbi4KLQkoT0JKX1BST0NFU1NfU1RBQik6IFJlbW92ZWQgZGVmaW5pdGlvbi4KLQotRnJpIFNlcCAxNyAxODoxMjozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfR0VUX1NJWkUpOiBEZWZpbmUuCi0JKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobGluZV9jb21tZW50X2NoYXJzKTogSW5pdGlhbGl6ZSBpbiBhbGwgY2FzZXMuCi0KLVRodSBTZXAgMTYgMTQ6MjM6MDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0Yy5oOiBEZWNsYXJlIHRjX2dlbl9yZWxvYyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgdXBvbgotCVJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IE9ubHkgc2V0IGZsYWdzIHdoZW4gZmlyc3QKLQljcmVhdGluZyB0aGUgc2VjdGlvbi4KLQotV2VkIFNlcCAxNSAxMjoxNTo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBhIHRyYXAgaW5zdHJ1Y3Rpb24KLQl3aXRoIGEgYnJhbmNoLgotCi1UdWUgU2VwIDE0IDEzOjMxOjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9kYXRhLCBvYmpfZWxmX3RleHQpOiBOZXcgZnVuY3Rpb25zOwotCXNldCBwcmV2aW91c19zZWN0aW9uIGFuZCBwcmV2aW91c19zdWJzZWN0aW9uIGFuZCB0aGVuIGNhbGwgc19kYXRhCi0JYW5kIHNfdGV4dCwgcmVzcGVjdGl2ZWx5LgotCShvYmpfcHNldWRvX3RhYmxlKTogQWRkIGRhdGEgYW5kIHRleHQuCi0JKG9ial9lbGZfc2VjdGlvbik6IEFkZCBTRUNfTE9BRCB0byBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mCi0JZmxhZ3MuICBUcmVhdCAucm9kYXRhMSBsaWtlIC5yb2RhdGEuICBTZXQgU0VDX0xPQUQgYXMgd2VsbCBhcwotCVNFQ19BTExPQyBmb3IgImFsbG9jIiBzdHJpbmcuICBEb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpbmQgdGhlCi0Jc2VjdGlvbjsganVzdCB1c2Ugc3Vic2VnX25ldy4KLQotCSogcmVhZC5jIChjaGFuZ2VfdG9fc2VjdGlvbik6IFJlbW92ZWQuICBUaGlzIGlzIG5vdyBkb25lIGJ5Ci0Jc3Vic2VnX25ldy4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFJlYXJyYW5nZWQgc29tZXdoYXQuICBDcmVhdGUgdGhlIHNlY3Rpb24KLQl1c2luZyBzdWJzZWdfbmV3LiAgU3RvcmUgdGhlIHN0cmluZyBpbmRleCBpbiBzZWdfaW5mbywgcmF0aGVyIHRoYW4KLQlpbiBhIHN0YXRpYyB2YXJpYWJsZS4gIEZvcmNlIHRoZSBmaXJzdCBzdHJpbmcgdG8gYmUgZW1wdHkuICBVc2UKLQlmcmFnX21vcmUgcmF0aGVyIHRoYW4gRlJBR19BUFBFTkRfMV9DSEFSLgotCShzX3N0YWJfZ2VuZXJpYyk6IFJld3JvdGUuCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWRkZWQgc3RhYnUgdW5pb24uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBJbml0aWFsaXplIHN0YWJfc3RyaW5nX3NpemUgdG8gMC4KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBEb24ndCBpbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkob2JqX2FvdXRfc3RhYiwgb2JqX2FvdXRfZGVzYyk6IFJlbW92ZWQuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRlc2MgYW5kIHN0YWJYIGVudHJpZXMuCi0JKiBjb25maWcvb2JqLWJvdXQuYzogU2FtZSBjaGFuZ2VzIGFzIGNvbmZpZy9vYmotYW91dC5jLgotCSogY29uZmlnL29iai1ib3V0LmggKFNfU0VUX1RZUEUpOiBEZWZpbmUuCi0JKHRjX2JvdXRfZml4X3RvX2NoYXJzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zdGFiKTogUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYyBhbmQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGN1cnJlbnRfc3RhYl9zeW1ib2wpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9zeW1ib2xfdHlwZSk6IFJlbW92ZWQgbl9zdHJ4LCBuX3R5cGUsCi0Jbl9vdGhlciwgbl9kZXNjIGFuZCBuX3ZhbHVlIGZpZWxkcy4KLQkoU197UyxHfUVUX3tPRkZTRVQsT1RIRVIsVFlQRSxERVNDfSk6IFJlbW92ZWQuCi0JKE1BS0VfU1RBQl9TWU1CT0wpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfZWNvZmZfc3RhYik6IFJlbmFtZWQgdG8gZWNvZmZfc3RhYi4KLQlDaGFuZ2VkIGFyZ3VtZW50cyBhbmQgcmVtb3ZlZCBwYXJzaW5nIGNvZGUuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIHN0YWJYIGVudHJpZXMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKGVjb2ZmX3N0YWIpOiBEZWNsYXJlLgotCShPQkpfUFJPQ0VTU19TVEFCKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuYzogRG9uJ3QgaW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCi0JKG9ial9lbGZfc3RhYiwgb2JqX2VsZl94c3RhYiwgb2JqX2VsZl9kZXNjLAotCWVsZl9zdGFiX3N5bWJvbF9zdHJpbmcsIGVsZl9zdGFiX3N5bWJvbCwgb2JqX2VsZl9zdGFiX2dlbmVyaWMpOgotCVJlbW92ZWQuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRlc2MsIHN0YWJYIGFuZCB4c3RhYnMgZW50cmllcy4KLQkob2JqX2VsZl92ZXJzaW9uKTogVXNlIHN1YnNlZ19uZXcsIG5vdCBiZmRfbWFrZV9zZWN0aW9uLiAgRG9uJ3QKLQlzZXQgU0VDX0xPQUQgZm9yIC5ub3RlIHNlY3Rpb24uCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogR2V0IGZyYWcgcG9pbnRlciBmcm9tIHNlZ19pbmZvLCByYXRoZXIKLQl0aGFuIGxvb2tpbmcgdGhyb3VnaCBmcmFncy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfe1MsR31FVF97T1RIRVIsVFlQRSxERVNDfSk6IFJlbW92ZWQuCi0JKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMsIElOSVRfU1RBQl9TRUNUSU9OLCBPQkpfUFJPQ0VTU19TVEFCKToKLQlEZWZpbmUuCi0JKiBjb25maWcvb2JqLXZtcy5jIChvYmpfYW91dF9zdGFiKTogUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNfU0VUX1RZUEUpOiBEZWZpbmUuCi0KLQkqIGFzLmg6IERlY2xhcmUgbGlzdGluZy4KLQkqIHJlYWQuYzogRG9uJ3QgZGVjbGFyZSBsaXN0aW5nLgotCShlbWl0X2V4cHIpOiBDYXN0IGZpeF9uZXdfZXhwIGFyZ3VtZW50LgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogQ29ycmVjdCBwcmludGYgZm9ybWF0LgotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkqIHdyaXRlLmg6IERlY2xhcmUgdGV4dF9sYXN0X2ZyYWcgYW5kIGRhdGFfbGFzdF9mcmFnLgotCSogY29uZmlnL29iai1ib3V0LmMgKG9ial9ib3V0X2xpbmUpOiBBZGRlZCBkdW1teSBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBBZGQgc29tZSBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk5NjAuYzogTGlrZXdpc2UuICBBbHNvIGZ1bGx5IGJyYWNrZXQgc3RydWN0dXJlCi0JaW5pdGlhbGl6YXRpb25zLCBmaXggcHJpbnRmIGZvcm1hdHMsIGFuZCByZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotTW9uIFNlcCAxMyAxNjo0ODozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19kZXNjKTogT25seSBjb21waWxlIGFuZCB1c2UgaWYgU19TRVRfREVTQyBpcyBkZWZpbmVkLgotCSogc3RydWMtc3ltYm9sLmg6IERlY2xhcmUgdmVyaWZ5X3N5bWJvbF9jaGFpbiBhbmQKLQl2ZXJpZnlfc3ltYm9sX2NoYWluXzIgZXZlbiBpZiBub3QgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUy4KLQkqIHN5bWJvbHMuYyAodmVyaWZ5X3N5bWJvbF9jaGFpbik6IFJlbW92ZWQgdXNlbGVzcyBleHByZXNzaW9uLgotCSogd3JpdGUuYyAoaGVhZGVycywgdGhlX29iamVjdF9maWxlKTogT25seSB1c2UgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUiBhbmQgbm90IEJGRC4KLQkoZml4dXBfc2VnbWVudCwgY3ZzX2ZyYWdfdG9fZmlsbCk6IE9ubHkgdXNlIGlmIEJGRF9BU1NFTUJMRVIgb3IKLQlub3QgQkZELgotCShtZXJnZV9kYXRhX2ludG9fdGV4dCk6IE9ubHkgdXNlIGlmIEJGRF9BU1NFTUJMRVIgb3IgKG5vdCBCRkQgYW5kCi0Jbm90IE9CSl9BT1VUKS4KLQkqIHdyaXRlLmg6IERlY2xhcmUgcmVsYXhfc2VnbWVudC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChzdGFja19wb3AsIHN0YWNrX3B1c2gsIHN0YWNrX2luaXQpOiBNYWRlCi0Jc3RhdGljLgotCShzdGFja190b3ApOiBDb21tZW50ZWQgb3V0LCBzaW5jZSBpdCdzIG5vdCB1c2VkLgotCUZpeGVkIHVwIHBzZXVkby1vcCBmdW5jdGlvbnMgdG8gdGFrZSBhbiBpZ25vcmVkIGludCBhcmd1bWVudC4KLQkoc2l6ZV9zZWN0aW9uKTogQWRkZWQgZGVmYXVsdCBCQURfQ0FTRSB0byBzd2l0Y2guCi0JQ2hhbmdlZCBiemVybyBjYWxscyB0byBtZW1zZXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoU19JU19MT0NBTCk6IENhbGwgc3RyY2hyIG9uIFNfR0VUX05BTUUKLQkocyksIG5vdCBvbiBzIGl0c2VsZi4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKHNfdXNlKTogVGFrZSBpZ25vcmVkIGludCBhcmd1bWVudC4gIE9ubHkKLQlkZWZpbmUgaWYgT0JKX0NPRkYgaXMgbm90IGRlZmluZWQuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiAoZml0c19pbl9zaWduZWRfYnl0ZSwgc21hbGxlc3RfaW1tX3R5cGUpOiBNYWtlCi0JYXJndW1lbnQgc2lnbmVkIGFnYWluLgotCSogY29uZmlnL3RjLW02OGsuYyAoc19ic3MsIHNfZXZlbiwgc19wcm9jKTogVGFrZSBpZ25vcmVkIGludAotCWFyZ3VtZW50LgotCShtNjhrX2lwKTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXphdGlvbiBvZiBhcmNocy4KLQlDb3JyZWN0IHNldmVyYWwgZm9ybWF0cyBmb3IgX19MSU5FX18gdG8gYmUgJWQgcmF0aGVyIHRoYW4gJXMuCi0JKGluaXRfdGFibGUpOiBGdWxseSBicmFja2V0IGluaXRpYWxpemF0aW9uLgotCUNhc3QgdmFsdWVzIGxhcmdlciB0aGFuIDB4N2YgYXNzaWduZWQgdG8gZnJfb3Bjb2RlIHRvIGNoYXIuCi0KLQkqIHN1YnNlZ3MuYzogUmVuYW1lZCBub24tQkZEX0FTU0VNQkxFUiBzdWJzZWdfbmV3IHRvIHN1YnNlZ19zZXQuCi0JV3JvdGUgbm9uLUJGRF9BU1NFTUJMRVIgc3Vic2VnX25ldy4gIE5vdyBzdWJzZWdfbmV3IGFsd2F5cyB0YWtlcyBhCi0Jc2VjdGlvbiBuYW1lLCBhbmQgc3Vic2VnX3NldCBhbHdheXMgdGFrZXMgYSBzZWdULiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzIGFzIGFwcHJvcHJpYXRlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgIChjaGFuZ2VfdG9fc2VjdGlvbik6IFJlbmFtZWQgdG8KLQlvYmpfY29mZl9hZGRfc2VnbWVudC4gIENvcnJlY3RlZC4gIE1hZGUgY2FsbGVycyB1c2Ugc3Vic2VnX25ldy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChvYmpfc2VnbWVudF9uYW1lLCBvYmpfYWRkX3NlZ21lbnQpOgotCURlZmluZS4KLQotTW9uIFNlcCAxMyAxMzoxNTowMyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpOiBSZW1vdmUgdGVzdCBmb3IgbmFtZVswXSA9PSAnTCcuCi0KLUZyaSBTZXAgMTAgMTE6MjI6MDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX1NFVF9TSVpFKTogQWN0dWFsbHkgc2V0IHRoZSBzaXplLgotCi0JR2NjIGxpbnQuCi0JKiBBZGRlZCBhIG51bWJlciBvZiBjYXN0cyB0byBmdW5jdGlvbiBjYWxscy4KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbiksIGFzLmMgKG1haW4pLCBleHByLmMgKGludGVnZXJfY29uc3RhbnQsCi0Jb3BlcmFuZCwgZXhwciksIHJlYWQuYyAocmVhZF9iZWdpbiwgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZLAotCXJlYWRfYV9zb3VyY2VfZmlsZSwgc19hbGlnbl9ieXRlcywgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSwKLQlpZ25vcmVfcmVzdF9vZl9saW5lLCBiaWdfY29ucywgaXNfaXRfZW5kX29mX3N0YXRlbWVudCwgc19pZ25vcmUpLAotCXJlYWQuaCAoaXNfbmFtZV9iZWdpbm5lciwgaXNfcGFydF9vZl9uYW1lKSwgY29uZmlnL29iai1lbGYuYwotCShvYmpfZWxmX3NlY3Rpb24pLCBjb25maWcvdGMtaTM4Ni5jIChwYXJzZV9yZWdpc3RlciksCi0JY29uZmlnL3RjLXNwYXJjLmMgKGlzb2N0YWwsIHNfcHJvYyk6IENhc3QgY2hhcgotCWFycmF5IGluZGljZXMgdG8gdW5zaWduZWQgY2hhci4KLQkqIGFwcC5jIChwcm9jZXNzX2VzY2FwZSk6IE1ha2Ugc3RhdGljLiAgQWRkIHByb3RvdHlwZS4gIENoYW5nZQotCWFyZ3VtZW50IGZyb20gY2hhciB0byBpbnQuCi0JKiBhcy5jOiBJbmNsdWRlIG91dHB1dC1maWxlLmggZm9yIHByb3RvdHlwZXMuICBDb21tZW50IG91dCB1bnVzZWQKLQlmdW5jdGlvbiBnb3Rfc2lnLgotCSogTWFrZWZpbGUuaW4gKGFzLm8pOiBEZXBlbmQgb24gb3V0cHV0LWZpbGUuaC4KLQkqIGFzLmggKEJBRF9DQVNFKTogQ2FzdCB2YWwgYXJndW1lbnQgdG8gbG9uZywgYW5kIHVzZSAlbGQuCi0JKHBzZXVkb190eXBlUyk6IEFkZCBwcm90b3R5cGUgdG8gcG9jX2hhbmRsZXIgZmllbGQuCi0JKHByaW50X3ZlcnNpb25faWQpOiBBZGQgcHJvdG90eXBlLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IENoYW5nZSBzaXplIGFyZ3VtZW50cyB0byB1bnNpZ25lZCBsb25nLgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGQgcHJvdG90eXBlcyBmb3IgZnVuY3Rpb24gYXJndW1lbnRzLgotCShoYWRfZXJyb3JzLCBoYWRfd2FybmluZ3MsIHNjcnViX2Zyb21fZmlsZSk6IFJlbW92ZSBkdXBsaWNhdGUKLQlkZWNsYXJhdGlvbnMuCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogTWFrZSBzaXplIHZhcmlhYmxlcyB1bnNpZ25lZC4KLQkqIGNvbmQuYyAoaWdub3JlX2lucHV0KTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgdmFyaWFibGUgcHRyLgotCSogZXhwci5jIChmbG9hdGluZ19jb25zdGFudCwgaW50ZWdlcl9jb25zdGFudCk6IE1ha2Ugc3RhdGljLiAgQWRkCi0JcHJvdG90eXBlcy4KLQkqIGZsb251bS1jb3B5LmMgKGZsb251bV9jb3B5KTogTWFrZSBzaXplIHZhcmlhYmxlcyB1bnNpZ25lZC4KLQkqIGZyYWdzLmg6IEFkZCBwcm90b3R5cGUgZm9yIGZyYWdfaW5pdC4KLQkqIGhhc2guaCwgaGFzaC5jOiBDaGFuZ2UgaGFzaCB2YWx1ZXMgZnJvbSBjaGFyICogdG8gUFRSLCBtYWtlIGhhc2gKLQlzdHJpbmdzIGNvbnN0LCBtYWtlIHJldHVybmVkIGVycm9yIHN0cmluZ3MgY29uc3QgY2hhciAqLiAgQWRkZWQKLQlwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMuCi0JKiBpbnB1dC1maWxlLmgsIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSk6IFJldHVybgotCXVuc2lnbmVkIGludC4KLQkqIGlucHV0LXNjcnViLmMgKGJ1ZmZlcl9sZW5ndGgpOiBNYWtlIHVuc2lnbmVkLgotCShpbnB1dF9zY3J1Yl9wdXNoLCBpbnB1dF9zY3J1Yl9wb3ApOiBNYWtlIHN0YXRpYy4KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBDYXN0IHNwcmludGYgYXJndW1lbnQgdG8gdW5zaWduZWQKLQlsb25nIGFuZCB1c2UgJWx4LiAgUHJpbnQgbmFtZSBvZiBzZWdtZW50IHJhdGhlciB0aGFuIGFkZHJlc3Mgb2YKLQlzdHJ1Y3R1cmUuCi0JKGxpc3RpbmdfbGlzdCwgbGlzdGluZ190aXRsZSk6IENoYW5nZSBhcmd1bWVudCB0byBpbnQuCi0JKGxpc3RpbmdfZWplY3QsIGxpc3RpbmdfZmxhZ3MsIGxpc3RpbmdfcHNpemUpOiBBZGQgaW50IGFyZ3VtZW50LgotCSogbGlzdGluZy5oOiBDb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uIGNoYW5nZXMuCi0JKiBvYmouaCAob2JqX2VtaXRfc3ltYm9scyk6IFJlbmFtZSBwcm90b3R5cGUgYXJndW1lbnQgdG8gYXZvaWQKLQlzaGFkb3dpbmcuCi0JKiByZWFkLmg6IENoYW5nZSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiBwcm90b3R5cGUgdG8gcmV0dXJuCi0Jb2Zmc2V0VC4gIEFkZCBwcm90b3R5cGUgZm9yIG5leHRfY2hhcl9vZl9zdHJpbmcuICBWYXJpb3VzCi0JcHJvdG90eXBlIGNoYW5nZXMuCi0JKiByZWFkLmM6IFJlbW92ZSBwcm90b3R5cGUgZm9yIG5leHRfY2hhcl9vZl9zdHJpbmcuCi0JKHBvYmVnaW4pOiBNYWtlIGVycnR4dCBjb25zdC4gIE1ha2UgbmV3X2xlbmd0aCwgdG1wX2xlbiBhbmQgbnVtCi0JdW5zaWduZWQuCi0JKHNfYWJvcnQsIHNfYWxpZ25fcHR3bywgc19jb21tLCBzX2RhdGEsIHNfYXBwX2xpbmUsIHNfZmlsbCwKLQlzX2dsb2JsLCBzX2xzeW0sIHNfb3JnLCBzX3NldCwgc190ZXh0LCBzX2Rlc2MpOiBBZGQgaW50IGFyZ3VtZW50LgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoc19jb21tKTogQ2hhbmdlIHRlbXAgZnJvbSB2YWx1ZVQgdG8gb2Zmc2V0VC4gIENhc3QgdG8gbG9uZyB3aGVuCi0JcHJpbnRpbmcgYW5kIHVzZSAlbGQgKG9ubHkgZm9yIGVycm9yIG1lc3NhZ2VzIGFueWhvdykuCi0JKHNfbG9uZywgc19pbnQpOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9ucy4KLQkoY29ucyk6IENoYW5nZSBhcmd1bWVudCB0byBpbnQuCi0JKGVtaXRfZXhwcik6IFVzZSAlbHggd2hlbiBwcmludGluZyBsb25ncy4KLQkoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBSZXR1cm4gb2Zmc2V0VCwgbm90IGxvbmcuCi0JKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBDb21tZW50IG91dCB1bmxlc3MKLQlTRVBBUkFURV9TVEFCX1NFQ1RJT05TLgotCShzX3N0YWJfZ2VuZXJpYyk6IFJlbW92ZSB1bnVzZWQgb2Zmc2V0LiAgRGVmaW5lIHNlZ19pc19uZXcgb25seQotCWlmIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMuICBVc2UgdG9QIG9ubHkgaW4gbG9jYWwgYmxvY2suCi0JKiBzdHJ1Yy1zeW1ib2wuaCAodmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogQWRkIHByb3RvdHlwZS4KLQkqIHN5bWJvbHMuYzogUmVtb3ZlIG5lc3RlZCBjb21tZW50LgotCShzeW1ib2xfbmV3KTogUmVuYW1lIHZhbHVlIHRvIHZhbHUuCi0JKGNvbG9uKTogVXNlICVsZCBhbmQgY2FzdCB0byBsb25nIGluIGVycm9yIG1lc3NhZ2UuCi0JKiBzeW1ib2xzLmg6IFJlbW92ZSBkdXBsaWNhdGUgdmVyaWZ5X3N5bWJvbF9jaGFpbiBkZWNsYXJhdGlvbi4KLQkqIHRjLmg6IFJlbW92ZSB1bnVzZWQgbWRfZW1pdF9yZWxvY2F0aW9ucyBkZWNsYXJhdGlvbi4KLQkodGNfZ2VuX3JlbG9jKTogQWRkIGRlY2xhcmF0aW9uLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IENoYW5nZSBmaXJzdCBhcmd1bWVudCBuYW1lIGRlcGVuZGluZwotCW9uIEJGRF9BU1NFTUJMRVIuCi0JKHdyaXRlX3JlbG9jcyk6IFJlbW92ZSB1bnVzZWQgb2Zmc2V0LCBmcmFncy4gIFJlbW92ZSB0Y19nZW5fcmVsb2MKLQlkZWNsYXJhdGlvbnMuICBNYWtlIG4gdW5zaWduZWQuCi0JKHdyaXRlX2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZCBpLCBuLCByZWxvY3MsIGZpeHAuICBSZW5hbWUgZnJhZ3MKLQl0byBmIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEZWZpbmUgZnJhZ1Agb25seSBpZiBub3QgQkZEX0FTU0VNQkxFUiBvciBub3QKLQlXT1JLSU5HX0RPVF9XT1JELiAgUmVtb3ZlIHVudXNlZCBrZWVwLiAgT25seSBkZWNsYXJlIHB1bnQgYW5kCi0JcHVudF9pdCBpZiB0aGV5IHdpbGwgYmUgdXNlZC4gIE1ha2UgaSBhbmQgbiB1bnNpZ25lZC4KLQkoZml4dXBfc2VnbWVudCk6IENhc3QgdG8gbG9uZyBhbmQgdXNlICVsZCBpbiBlcnJvciBtZXNzYWdlLgotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IE1ha2Ugc2l6ZSBhcmd1bWVudCB1bnNpZ25lZC4KLQkqIGNvbmZpZy9vYmotYW91dC5oOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQuICBBZGQgcHJvdG90eXBlIGZvcgotCW9ial9hb3V0X2Zyb2Jfc3ltYm9sLgotCShvYmpfYW91dF9saW5lLCBvYmpfYW91dF9kZXNjKTogQWRkIGludCBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogQ2hhbmdlZCBidWlsZCByb3V0aW5lcyB0byB1c2UgYW4gdW5zaWduZWQKLQlvZmZzZXQuCi0JKGFkZF9zdHJpbmcpOiBNYWtlIGxlbiB1bnNpZ25lZCBsb25nLgotCShvYmpfZWNvZmZfc3RhYik6IFVzZSAlbHUgaW4gZXJyb3IgbWVzc2FnZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogQ29tbWVudCBvdXQgdW51c2VkIGxhYmVsCi0JYWxsb2NhdGVfYnNzLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogUmV0dXJuIDAgKGN1cnJlbnRseSBicm9rZW4pLgotCShvYmpfZWxmX2Rlc2MsIG9ial9lbGZfdmVyc2lvbiwgb2JqX2VsZl9zaXplLCBvYmpfZWxmX3R5cGUsCi0Jb2JqX2VsZl9pZGVudCwgb2JqX2VsZl93ZWFrLCBvYmpfZWxmX2xvY2FsLCBvYmpfZWxmX2NvbW1vbiwKLQlvYmpfZWxmX2xpbmUsIG9ial9lbGZfcHJldmlvdXMpOiBBZGQgaW50IGFyZ3VtZW50LgotCShvYmpfZWxmX3dyaXRlX3N5bWJvbF9wKTogTWFrZSBzdGF0aWMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3dyaXRlX3N5bWJvbCk6IEFkZCBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtaHBwYS5oOiBSZW1vdmUgZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbgotCXJlYWQuaC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKEVOQ09ERV9SRUxBWF9TVEFURSk6IENhc3QgdG8gcmVsYXhfc3Vic3RhdGVULgotCShzX2Jzcyk6IEFkZCBpbnQgYXJndW1lbnQuCi0JKGZpdHNfaW5fc2lnbmVkX2J5dGUsIHNtYWxsZXN0X2ltbV90eXBlKTogTWFrZSBhcmd1bWVudCB1bnNpZ25lZC4KLQkoZHVtbXkpOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFJlbmFtZSBsb2NhbCBvIHRvIG9wIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkodGNfZ2VuX3JlbG9jKTogUmVuYW1lIGxvY2FsIHJlbG9jIHRvIHJlbCB0byBhdm9pZCBzaGFkb3dpbmcuCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2RhdGExLCBzX2RhdGEyKTogQWRkIGludCBhcmd1bWVudC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIG1kX2FwcGx5X2ZpeCk6IENhc3QgdG8gbG9uZyBhbmQgdXNlCi0JJWxkIGluIGVycm9yIG1lc3NhZ2VzLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IFJlbW92ZSBkdXBsaWNhdGUgZGVjbGFyYXRpb25zLgotCShnZXRFeHByZXNzaW9uKTogUmV3cml0ZSBjb25kaXRpb24gdG8gYXZvaWQgZW1wdHkgY29uZGl0aW9uYWwKLQlib2R5LgotCShzX3JlZywgc19wcm9jLCBzX3Jlc2VydmUsIHNfY29tbW9uLCBzX3NlZywgc194d29yZCk6IEFkZCBpbnQKLQlhcmd1bWVudC4KLQotVGh1IFNlcCAgOSAxNzoxMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXc6Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2Fzc2VtYmxlKTogRml4IHR5cG8uCi0JKHBhX2lwKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGxhYmVscy4gIERvIG5vdCBjaGVjayBmb3IKLQl1bnNpZ25lZCB2YWx1ZXMgYmVpbmcgPCAwLCBpdCBjYW4ndCBoYXBwZW4uCi0JKGlzX3NhbWVfZnJhZyk6IFJldHVybiBhIHZhbHVlIGluIHJlY3Vyc2l2ZSBjYWxsIGNhc2UuCi0JKHBhX2NhbGxpbmZvKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGxhYmVscy4KLQkocGFfY29tbSk6IExpa2V3aXNlLgotCShwYV9jb3B5cmlnaHQpOiBMaWtld2lzZS4KLQkocGFfZXhwb3J0KTogTGlrZXdpc2UuCi0JKHBhX2ltcG9ydCk6IExpa2V3aXNlLgotCShwYV9wYXJhbSk6IExpa2V3aXNlLgotCShwYV9zcGFjZSk6IExpa2V3aXNlLgotCShwYV9zdWJzcGFjZSk6IExpa2V3aXNlLgotCi1UaHUgU2VwICA5IDE1OjA1OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LCBzX3N0YWJfZ2VuZXJpYyk6IElmCi0JQkZEX0FTU0VNQkxFUiwgY2FsbCBzdWJzZWdfc2V0IHJhdGhlciB0aGFuIHN1YnNlZ19uZXcuCi0KLVdlZCBTZXAgIDggMTU6MDk6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgU0VDX0xPQUQgd2hlbiB1c2luZwotCWRlZmF1bHQgZmxhZyB2YWx1ZXMuCi0KLVR1ZSBTZXAgIDcgMTA6MjI6NTIgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiByZWFkLmM6IChjaGFuZ2VfdG9fc2VjdGlvbik6IERvbid0IGluY2x1ZGUgYm9keSBpZiBub3QgTUFOWV9TRUNUSU9OUy4KLQotCSogcmVhZC5jOiAoc19zdGFiLCBzX3hzdGFiLCBzX2Rlc2MpOiBOZXcgZnVuY3Rpb25zIHRvIHBhcnNlCi0JdmFyaW91cyBzdGFiLXJlbGF0ZWQgZGlyZWN0aXZlcy4KLQkqIHJlYWQuaDogKHNfc3RhYiwgc194c3RhYiwgc19kZXNjKTogTmV3IGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiB3cml0ZS5jOiAobWVyZ2VfZGF0YV9pbnRvX3RleHQpOiBGaXggaWZkZWYgdGFuZ2xlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGN1cnJlbnRfc3RhYl9zeW1ib2wpOiBGYWtlIHN5bWJvbAotCWZvciBzdGFiIHJlYWRlciB0byB1c2UuCi0JKiBjb25maWcvb2JqLWNvZmZiZmRoLmggKG9ial9zeW1ib2xfdHlwZSk6IEFkZGVkIGZpZWxkcyBmb3IKLQlzdGFiIHJlYWRlciwgbWFjcm9zIHRvIGFjY2Vzcy4KLQotRnJpIFNlcCAgMyAxNjo0NDowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9zeW1ib2wpOiBObyBsb25nZXIgc3BlY2lhbC1jYXNlZCBvbgotCXNwYXJjdjksIHNpbmNlIGVsZl9zeW1ib2xfdHlwZSBpcyBub3cgaW5kZXBlbmRlbnQgb2Ygc2l6ZS4KLQotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3N5bWJvbCk6IEZpeGVkIG5hbWUgb2YgZWxmX3N5bWJvbF90eXBlLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChzdHJ1Y3QgZGVmYXVsdF9zdWJzcGFjZV9kaWN0LCBzdHJ1Y3QKLQlkZWZhdWx0X3NwYWNlX2RpY3QpOiBGaWVsZCAic29ydCIgaXMgbm93IHVuc2lnbmVkIGNoYXIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMsIHBhX2RlZl9zcGFjZXMpOiBBbGlnbgotCWNvbHVtbnMgZm9yIGVhc2llciByZWFkaW5nLgotCShiY21wLCBpbmRleCk6IERlbGV0ZWQgVVNHLXNwZWNpZmljIGRlZmluaXRpb25zLiAgU2hvdWxkIGJlIGRlYWx0Ci0Jd2l0aCBpbiBoby0qLmgsIG9yIGluIGxpYmliZXJ0eS4gIENoYW5nZWQgbWVudGlvbiBvZiBpbmRleCB0bwotCXN0cmNoci4KLQkobGFiZWxfc3ltYm9sUCwgbGFiZWxfc3ltYm9sX2RlZmluZWQsIGNhbGxpbmZvX2ZvdW5kLAotCXdpdGhpbl9lbnRyeV9leGl0LCBleGl0X3Byb2Nlc3NpbmdfY29tcGxldGUsIHdpdGhpbl9wcm9jZWR1cmUsCi0JcGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3NwYWNlcywgcGFfcHNldWRvX29wX21vdmVzX3BjLAotCWxhYmVsX3N5bWJvbHNfcm9vdFAsIHBhX2dldF9sYWJlbCwgcGFfbGFiZWxfaXNfZGVmaW5lZCwKLQlwYV91bmRlZmluZV9sYWJlbCk6IE5vdyBzdGF0aWMuCi0JKG1vdmVycyk6IE5vdyBjb25zdCwgaW4gYWRkaXRpb24gdG8gcG9pbnRpbmcgdG8gY29uc3QgZGF0YS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGxhYmVsX3N5bWJvbFNfcm9vdFAsIHBhX2dldF9sYWJlbCwKLQlwYV9sYWJlbF9pc19kZWZpbmVkLCBwYV91bmRlZmluZV9sYWJlbCwgcGFfcHNldWRvX29wX21vdmVzX3BjKToKLQlEZWxldGUgZGVjbGFyYXRpb25zLgotCi0JTWVyZ2VkIG1vcmUgY2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlIEhvb2dlbmJvb206Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMsIHBhX2RlZl9zdWJzcGFjZXMpOiBSZW1vdmUKLQllbnRyaWVzIGZvciAuc3RhYiBhbmQgLnN0YWJzdHIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogIFNldCB0aGUKLQlTRUNfTE9BRCBhdHRyaWJ1dGUgZm9yIHRoZSAuc3RhYnN0ciBzZWN0aW9uLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBTZXQgdGhlIFNFQ19MT0FEIGF0dHJpYnV0ZSBmb3IgdGhlCi0JLnN0YWIgc2VjdGlvbi4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiAgQ2hhbmdlICcjaWYgMScgdG8gJyNpZiAwJy4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiAgSW5jb3JyZWN0IGJ5dGUgY291bnQgb24gY2FsbCB0bwotCW1kX251bWJlcl90b19jaGFycyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19zeW1ib2wpOiBTdGF0aWMgZnVuY3Rpb25zIG5lZWQKLQlhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgdG9vLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdHJpbmdlcik6IENvcnJlY3RseSBoYW5kbGUgZXNjYXBpbmcKLQljaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBhcHBlYXIgdW5hbHRlcmVkIGluIHRoZSBvdXRwdXQgc3RyaW5nIChmb3IKLQlleGFtcGxlIGFuIGVzY2FwZWQgZG91YmxlLXF1b3RlKS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIpOiBBbHdheXMKLQlpbml0aWFsaXplIG5hbWUuCi0JKHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhKTogUmVtb3ZlIHByb3RvdHlwZQotCWZvciBub3cuCi0JKGNvbnNfZml4X25ld19ocHBhKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBGaXggdHlwZSBvZiB2YWxwIHRvIG1hdGNoCi0JcHJvdG90eXBlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogRGVsZXRlIGV4dGVybiBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zCi0JZm91bmQgaW4gbGliaHBwYS5oLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zcGFjZSk6IFJld29yayB0byBhdm9pZCB1bndhbnRlZCAjaWZkZWYKLQlPQkpfRUxGIGNvbmRpdGlvbmFscy4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKExPQ0FMX0xBQkVMKTogQ29ycmVjdGx5IGlkZW50aWZ5IGxvY2FsIGxhYmVscwotCW9uIHRoZSBQQS4KLQotVGh1IFNlcCAgMiAxMDo0Mzo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogQWNjZXB0ICd6JywgYW5kIGlnbm9yZSBpdC4KLQkobWFjcm8pOiBVc2UgInoscyx0IiBmb3IgZGl2IGluc3RydWN0aW9ucyB0byBtYXRjaCBjb3JyZXNwb25kaW5nCi0JY2hhbmdlIGluIG9wY29kZSB0YWJsZS4KLQkobWlwc19pcCk6IEFkZGVkICd6Jy0tbXVzdCBiZSB6ZXJvIHJlZ2lzdGVyLgotCi1XZWQgU2VwICAxIDE1OjU2OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKSBbUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFXTogRGVjbGFyZQotCXRjX2dlbl9yZWxvYyBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICJjYXNlIiBpbnN0ZWFkIG9mICJpZiIgd2hlbiBwb3NzaWJsZS4gIFJld3JvdGUKLQlNYWtlZmlsZSBlZGl0aW5nIHRvIHJlZHVjZSB3b3JrIGRvbmUuICBUcmVhdCAiaHBwYSoiIGFzICJocHBhIi4KLQotV2VkIFNlcCAgMSAxMjoxOTowNyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9zZWN0aW9uKTogYWRkICdkJyBhcyBhbiBhbGlhcyBmb3IKLQkgIHNlY3Rpb24gdHlwZSBvZiBkYXRhLiAgJ2QnIHNlZW1zIHRvIGJlIHVzZWQgZm9yIG04OGsuCi0KLVdlZCBBdWcgMjUgMjI6MzM6MjIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2FsaWduLCBzX3N0cmluZ2VyLCBzX2NvbnMsIHNfZmxvYXRfY29ucywKLQlzX21pcHNfc3BhY2UpOiBTZXQgaW5zbl9sYWJlbCB0byBOVUxMIHRvIGF2b2lkIGNoYW5naW5nIGl0IGF0IHRoZQotCW5leHQgLmFsaWduIHN0YXRlbWVudC4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGphbCB3aXRoIGluc3RydWN0aW9uIHRoYXQgc2V0cyB0aGUKLQlyZWdpc3RlciB0aGF0IGphbCBzZXRzLgotCi1XZWQgQXVnIDI1IDE2OjE1OjU3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTg4MTEwLgotCi1XZWQgQXVnIDI1IDEzOjM3OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gUGV0ZSBIb29nZW5ib29tIGFuZCBKZWZmIExhdyBhdCBVdGFoOgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogU0VDX0FMTE9DIHNob3VsZAotCW5vdCBiZSBvbiBmb3IgLmhwcGFfdW53aW5kLgotCShtZF9wc2V1ZG9fdGFibGUpOiAuUEFSQU0gYW5kIC5wYXJhbSBhcmUgdmFsaWQgcHNldWRvLW9wcyBmb3IgR0FTLgotCShwYV9wYXJhbSk6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgLlBBUkFNIGRpcmVjdGl2ZXMuCi0JKHBhX2lwKTogUGFzcyAiaXNicmFuY2giIGFyZ3VtZW50IGRvd24gdG8gcGFfcGFyc2VfKl9jb21wbHRyCi0JZnVuY3Rpb25zLiAgSGFuZGxlICd8JyBmb3IgbW92YjsgYWxsb3cgbW92YixuLgotCShwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IERlbGV0ZSBvbGQgdXNlbGVzcwotCXZlcnNpb24uICBIYW5kbGUgY2FzZXMgd2hlcmUgbm8gY29tcGxldGVyIGV4aXN0cyBmb3IKLQljb21iLG4gb3IgYWRkYixuLgotCShwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0cik6IEhhbmRsZSBjYXNlcyB3aGVyZSBubwotCWNvbXBsZXRlciBleGlzdHMgZm9yIGNvbWIsbiBvciBhZGRiLG4uICBNYWtlIGxvZ2ljCi0JbWlycm9yIHRoYXQgb2YgcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIuCi0JKHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKiB0Yy1ocHBhLmggKHBhX3BhcmFtKTogRGVjbGFyZS4KLQotVHVlIEF1ZyAyNCAxNTo0MTozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBOb3cgc3RhdGljLgotCUFkZGVkIGZvcndhcmQgZGVjbGFyYXRpb24uCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIFBldGUgSG9vZ2VuYm9vbSBhbmQgSmVmZiBMYXcgYXQgVXRhaDoKLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IEFyZ3VtZW50cyB3ZXJlIGluY29ycmVjdCBvbgotCWNhbGwgdG8gZWxmX3RjX21ha2Vfc2VjdGlvbnMuCi0JKG9ial9lbGZfdmVyc2lvbik6IEEgLm5vdGUgc2VjdGlvbiBzaG91bGRuJ3QgaGF2ZSB0aGUgU0VDX0FMTE9DCi0JYXR0cmlidXRlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBBZGQgc29tZSBwcm9jZXNzaW5nIHRvCi0JaGFuZGxlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2J1aWxkX3N5bWV4dG5fc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBhIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4KLQkocGFfZXhwb3J0X2FyZ3MpOiBNYWtlIGNhbGwgdG8gcGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uLgotCShocHBhX3RjX3N5bWJvbCwgaHBwYV90Y19tYWtlX3NlY3Rpb25zLAotCWhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb25zLgotCSogY29uZmlnL3RjLWhwcGEuaDogVXBkYXRlIGVsZl90Y19zeW1ib2wgYW5kIGVsZl90Y19tYWtlX3NlY3Rpb25zCi0JbWFjcm9zLgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFBsYWNlIGNoZWNrIGZvciBUQ19DT05TX0ZJWF9ORVcgaW4gdGhlCi0JQkZEX0FTU0VNQkxFUiBicmFuY2ggYXMgd2VsbC4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogSWYgRUxGIGlzIHRoZSB0YXJnZXQgb2JqZWN0IGZvcm1hdCwgZGVmaW5lCi0Jc29tZSBFTEYtIGFuZCBocHBhLXNwZWNpZmljIHR5cGVzIGFuZCBjb25zdGFudHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGdldEV4cHJlc3Npb24pOiBGaXggYSB0eXBvLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBUQ19FUVVBTF9JTl9JTlNOIHRvIGRldGVybWluZQotCWlmIGEgYD0nIGlzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEhhbmRsZSBjYXNlIHdoZXJlIGVuZC1vZi1saW5lIG1hcmtlcnMgYXJlCi0JYWxzbyB1c2VkIHdpdGhpbiBpbnN0cnVjdGlvbnMuCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19FUVVBTF9JTl9JTlNOLCBUQ19FT0xfSU5fSU5TTik6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4XzEpOiBLZWVwIHJlbG9jYXRpb25zIGZvcgotCW91dC1vZi1yYW5nZSBicmFuY2hlcy8nY2FsbHMgdXNpbmcgImJsIiBvciBjYWxscyB3aGljaCBtYXkgbmVlZAotCWFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YnMuICBEbyBub3QgbmVlZC9rZWVwIHJlbG9jYXRpb25zIGZvcgotCWNvbmRpdGlvbmFsIGJyYW5jaGVzLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRml4IGNhbGN1bGF0aW9uIG9mIGZ1bmN0aW9uIHNpemUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdmVyc2lvbik6IE1hcmsgLm5vdGUgc2VjdGlvbiBhcwotCVJFQURPTkxZLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSk6IFBhc3MgZXhwLCBub3QgdGhlCi0JYWRkcmVzcyBvZiBleHAsIHRvIGV4cHJlc3Npb24uCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFR1cm4gU0VDX0hBU19DT05URU5UUyBmbGFnIG9uLgotCShtZF9hcHBseV9maXhfMSk6IERlbGV0ZSB1bndhbnRlZCBjb21tZW50cy4KLQkocHJvY2Vzc19leGl0KTogU3ltYm9scyBtYXJraW5nIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBhcmUgYWx3YXlzCi0JQlNGX0xPQ0FMLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBJbmNsdWRlIGVsZjMyLWhwcGEuaCBmcm9tIEJGRCB0cmVlLgotCShwYV9zcGFjZSk6IERlY2xhcmUgYW5kIGluaXRpYWxpemUgZ2RiX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBDaGFuZ2UKLQllbGZfdGNfZmluYWxfcHJvY2Vzc2luZ19ob29rIHRvIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBGaXggYXJndW1lbnQgbGlzdCB0byBtYXRjaAotCWFyZ3VtZW50IHR5cGUgZGVjbGFyYXRpb25zLgotCShnZXRFeHByZXNzaW9uKTogRml4IHR5cG8uCi0JKHBhX2V4cG9ydF9hcmdzKTogQ2hhbmdlIGVsZl9zeW1ib2xfdHlwZSB0byBlbGYzMl9zeW1ib2xfdHlwZS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLiAgTmFtZSBjaGFuZ2VkIGZyb20KLQllbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nX2hvb2suCi0JKHN0YXJ0X3N5bWJvbF9yb290LCBzdGFydF9zeW1ib2xfbGFzdCk6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTik6IEZpeCB0eXBvLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBSZXBsYWNlICJzeW1ib2xTIiB3aXRoICJzdHJ1Y3Qgc3ltYm9sIiB0bwotCWF2b2lkIGNoYW5naW5nIGluY2x1ZGUgb3JkZXJpbmcuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd5Jyk6IEhhbmRsZSBqdXN0IGxpa2UgJ3QnLgotCi1Nb24gQXVnIDIzIDEyOjQ3OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc2V0X2F0KTogQWRkZWQgdW5zaWduZWRwIGFyZ3VtZW50LiAgVXNlCi0JbG9hZF9yZWdpc3Rlci4KLQkoc2V0X2F0X3Vuc2lnbmVkKTogUmVtb3ZlZDsgY2hhbmdlZCBjYWxsZXJzIHRvIHVzZSBzZXRfYXQuCi0JKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmVkIHVudXNlZCBpcCBhcmd1bWVudC4gIENoYW5nZWQgY2FsbGVycy4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBhbmQgYnJhbmNoIGxpa2VseS4KLQkobWFjcm9fYnVpbGQpOiBIYW5kbGUgJ3UnLgotCShsb2FkX3JlZ2lzdGVyKTogSGFuZGxlIDY0IGJpdCBjb25zdGFudHMuCi0JKG1hY3JvKTogQWRkZWQgTV9EQUJTLCByZW1vdmVkIE1fQUJTVS4gIE51bWVyb3VzIGNoYW5nZXMgdG8KLQlzdXBwb3J0IDY0IGJpdCBjb25zdGFudHMuCi0JKG1pcHNfaXApOiBVc2UgaGV4IGNvbnN0YW50cyBpbiByYW5nZSBjaGVja3MgZm9yIGNsYXJpdHkuCi0JKG1kX251bWJlcl90b19jaGFycyk6IFN1cHBvcnQgOCBieXRlIHZhbHVlcy4KLQotRnJpIEF1ZyAyMCAxNjo1MDo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tODhrLmg6IHVwZGF0ZWQgY29weXJpZ2h0cy4KLQkgIChUQ19DT05TX1JFTE9DKTogZGVjbGFyZSB0byBiZSBSRUxPQ18zMi4KLQotRnJpIEF1ZyAyMCAxMToxNjo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXNhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIG1pcHNfaXNhIGJhc2VkIG9uIFRBUkdFVF9DUFUuICBEb24ndCBzYW5pdHkKLQljaGVjayBtYWNyb3MuICBTZXQgdGV4dCBhbGlnbm1lbnQgYW5kIEdQIHNpemUgaGVyZS4KLQkobWRfYXNzZW1ibGUpOiBEb24ndCBzZXQgdGV4dCBhbGlnbm1lbnQgYW5kIEdQIHNpemUgaGVyZS4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBpbnNlcnQgTk9QcyBmb3IgbG9hZCBkZWxheXMgaWYgbWlwc19pc2EgPj0gMi4KLQlVc2UgdGhlIHJpZ2h0IG1hc2sgYW5kIHNoaWZ0IGZvciBXUklURV9GUFJfVCBhbmQgV1JJVEVfRlBSX1MuICBBZGQKLQlhIE5PUCBhZnRlciBhIGJyYW5jaCBsaWtlbHkuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBEb24ndCBpbnNlcnQgTk9QUyBmb3IgbG9hZCBkZWxheXMgaWYgbWlwc19pc2EKLQk+PSAyLgotCShtYWNybyk6IFN1cHBvcnQgcjYwMDAgYW5kIHI0MDAwIG1hY3Jvcy4KLQkobWlwc19pcCk6IENoZWNrIGluc24gSVNBIGxldmVsIGFnYWluc3QgbWlwc19pc2EgYmVmb3JlIHVzaW5nIGl0LgotCUFkZGVkICd4JyBjYXNlIGZvciBpZ25vcmVkIHJlZ2lzdGVyLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLW1pcHNOIGFuZCAtbWNwdT1YWC4KLQotRnJpIEF1ZyAyMCAwMToyNjo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBIYW5kbGUgIi56ZXJvIi4KLQotVGh1IEF1ZyAxOSAxMjoxNToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2xvY2FsKTogRnVuY3Rpb24gbW92ZWQgYW5kIHJlbmFtZWQuLi4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfbG9jYWwpOiAuLi50byBoZXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSksIGNvbmZpZy9vYmotZWxmLmMKLQkob2JqX3BzZXVkb190YWJsZSk6IE1vdmUgaGFuZGxpbmcgb2YgIi5sb2NhbCIuCi0KLQkqIHRjLmggKG1kX3BhcnNlX29wdGlvbik6IERvbid0IGRlY2xhcmUgaWYgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChOT19SRUxPQykgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUgYXMKLQlCRkRfUkVMT0NfTk9ORS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTmV3IG1hY3JvLCBjb252ZXJ0ZWQgZnJvbSBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGNvbW1lbnRfY2hhcnMpIFtPQkpfRUxGXTogSW5jbHVkZSAiLyIuCi0JKGxpbmVfY29tbWVudF9jaGFycykgW09CSl9FTEYgfHwgVEVfSTM4NkFJWF06IERvbid0IGluY2x1ZGUgIi8iLgotCShtZF9hc3NlbWJsZSk6IENhc3QgMHhlOSB0byBjaGFyIGV4cGxpY2l0bHksIHRvIGF2b2lkIGNvbXBpbGVyCi0Jd2FybmluZy4KLQkobWRfYXNzZW1ibGUsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKToKLQlDYWxsIHJlbG9jIGZvciBmaXhfbmV3IHR5cGUsIG9yIHVzZSBjb3JyZWN0IGVudW1lcmF0b3IsIGluc3RlYWQgb2YKLQlhbHdheXMgdXNpbmcgTk9fUkVMT0MuCi0JKGkzODZfb3BlcmFuZCk6IENoYW5nZSAiaWZuZGVmIEkzODZDT0ZGIiB0byAiaWZkZWYgT0JKX0FPVVQiIGZvcgotCXRlc3RzIGZvciB2YWxpZCBzZWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogQ29tcGVuc2F0ZSBmb3IgZnJhZyBzdGFydAotCWFkZHJlc3MuCi0JKG1kX2FwcGx5X2ZpeF8xKSBbQkZEX0FTU0VNQkxFUl06IEZvciBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi0Jc3ltYm9sLCBjb21wZW5zYXRlIGZvciBsb2NhdGlvbiBvZiByZWxvYy4KLQkocmVsb2MsIEJGRF9SRUxPQ18zMiwgQkZEX1JFTE9DXzMyX1BDUkVMKSBbIUJGRF9BU1NFTUJMRVJdOiBEZWZpbmUKLQl0byByZXR1cm4gemVyby4KLQotV2VkIEF1ZyAxOCAxNjo1MToyOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IFVuZGVmIE5PX1JFTE9DIGJlZm9yZSBpbmNsdWRpbmcgYW91dC9hb3V0NjQuaC4KLQkob2JqX2VsZl93ZWFrKTogTmV3IGZ1bmN0aW9uLgotCShvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlICIud2VhayIuCi0JKG9ial9lbGZfc2VjdGlvbik6IElmIHNlY3Rpb24gZGlyZWN0aXZlIGluY2x1ZGVzIGEgc3RyaW5nLCBpZ25vcmUKLQlpdCBmb3Igbm93LiAgQWNjZXB0ICJwcm9nYml0cyIgZmxhZy4KLQkob2JqX2VsZl90eXBlKTogQWNjZXB0IGBAJyBiZWZvcmUgZmxhZyBuYW1lLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpIFtCRkRfQVNTRU1CTEVSXTogR2V0IHJpZCBvZiBgaWYoMSknCi0JY29uZGl0aW9uLgotCShmaXh1cF9zZWdtZW50KSBbQkZEX0FTU0VNQkxFUl06IFVzZSBiZmRfaXNfY29tX3NlY3Rpb24sIHJhdGhlcgotCXRoYW4gY2hlY2tpbmcgZm9yIGJmZF9jb21fc2VjdGlvbiBkaXJlY3RseS4KLQkoZml4dXBfc2VnbWVudCk6IFNpbXBsaWZ5IHJhbmdlIGNoZWNrLgotCShmaXh1cF9zZWdtZW50KSBbT0JKX0NPRkYgJiYgVENfSTk2MF06IFNpbXBsaWZ5IGNwcCBjb25kaXRpb24KLQl0ZXN0LgotCi0JKiBzeW1ib2xzLmggKFNfU0VUX1dFQUspOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChTX1NFVF9XRUFLKTogTmV3IGZ1bmN0aW9uLgotCShTX1NFVF9FWFRFUk5BTCwgU19DTEVBUl9FWFRFUk5BTCk6IERvbid0IGJvdGhlciB3aXRoIEJTRl9FWFBPUlQsCi0JaXQncyBub3QgYSBzZXBhcmF0ZSBmbGFnIGFueSBtb3JlLiAgQ2xlYXIgQlNGX1dFQUsuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFRyZWF0ICJzdHJpbmciIGxpa2UgImFzY2l6Ii4KLQotV2VkIEF1ZyAxOCAxNTozMDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBicmFuY2ggaW5zdHJ1Y3Rpb25zCi0JaWYgLnNldCBub2JvcHQgb3IgLnNldCB2b2xhdGlsZS4KLQkoZ3BfcmVmZXJlbmNlKTogLmxpdDggYW5kIC5saXQ0IGFyZSBhY2Nlc3NlZCB2aWEgdGhlIEdQIHJlZ2lzdGVyLgotCShtYWNybyk6IEFkZGVkIGNhc2VzIE1fTElfUywgTV9MSV9TUy4gIEZpeGVkIE1fTElfRCBhbmQgTV9MSV9ERC4KLQkobWlwc19pcCk6IEFkZGVkIGNhc2VzICdGJywgJ0wnLCAnZicsICdsJyBmb3IgZmxvYXRpbmcgcG9pbnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IFJlbmFtZWQgc29tZSB2YXJpYWJsZXMgdG8gYXZvaWQgc2hhZG93Ci0Jd2FybmluZ3MuCi0KLU1vbiBBdWcgMTYgMTQ6MTY6MDIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19DT01NT04pOiBhZGQgbWlzc2luZyBiYWNrc2xhc2gKLQotCSogY29uZmlndXJlLmluICh6OGstKi17Y29mZixzaW19KTogdXNlIGNvZmZiZmQgZm9yIHRoaXMgdGFyZ2V0Ci0KLVRodSBBdWcgMTIgMTE6NDc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogU3VnZ2VzdGVkIGJ5Ci0JZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKTogRG9uJ3QgYWNjZXB0IHN5bWJvbGljCi0JbmFtZXMgZm9yICdFJyBhbmQgJ0cnIGFyZ3VtZW50IHR5cGVzIChjb3Byb2Nlc3NvciByZWdpc3RlcnMpIGFuZAotCWRvbid0IHdhcm4gaWYgJDEgaXMgdXNlZCBvbiB0aGUgY29wcm9jZXNzb3IuCi0JKG1hY3JvKTogSGFuZGxlIE1fe0wsU31XQ3swLDIsM31fQUIgY29ycmVjdGx5LgotCi1Nb24gQXVnICA5IDEyOjA5OjE0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogVXNlIEJGRF9SRUxPQ18xNiBmb3IgMi1ieXRlIHZhbHVlcy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZQotCUJGRF9SRUxPQ18xNi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCi1Nb24gQXVnICA5IDEzOjM2OjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAobWVyZ2VfZGF0YV9pbnRvX3RleHQpOiBEZWZpbmUgb25seSBpZiBCRkRfQVNTRU1CTEVSIGlzCi0JZGVmaW5lZCBvciBCRkQgaXMgbm90LgotCShyZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMpOiBEZWNsYXJlIGxvY2FsIHZhcmlhYmxlIGZyYWdQLgotCi1GcmkgQXVnICA2IDE1OjIyOjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfMzIpOiBGaWxsIGluCi0JYnl0ZXMgd2l0aCByZWFsIHZhbHVlcywgbm90IHplcm9zLgotCi1GcmkgQXVnICA2IDEwOjU3OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotcmlzY29zKiwgbWlwcy0qLXN5c3YqKTogTmV3ICh1bnRlc3RlZCkKLQl0YXJnZXRzLCB1c2luZyBlY29mZiBhbmQgbWlwcy1iaWcuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQKLQlKb2huc29uKTogQWRkZWQgY2FzZSBmb3IgJ0MnIGZvciBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjb2Rlcy4KLQotVGh1IEF1ZyAgNSAxMzowODo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIGNhc2UgQkZEX1JFTE9DXzY0KTogRmlsbCBpbgotCWJ5dGVzIHdpdGggcmVhbCB2YWx1ZXMsIG5vdCB6ZXJvcy4KLQkobWRfcHNldWRvX3RhYmxlKTogQ2FsbCBjb25zIGZvciAudWF4d29yZC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX3BzZXVkb190YWJsZSk6IEhhbmRsZSAiLjhieXRlIi4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgQkZEX1JFTE9DXzY0IGZvciA4LWJ5dGUgZXhwcmVzc2lvbnMuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVGVzdCBERUJVR19TWU1TIGluc3RlYWQgb2YgREVCVUcKLQlmb3IgdmVyaWZ5aW5nIHN5bWJvbCBjaGFpbi4KLQkobWVyZ2VfZGF0YV9pbnRvX3RleHQsIHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IE5ldwotCWZ1bmN0aW9ucywgc3BsaXQgb3V0IGZyb20gd3JpdGVfb2JqZWN0X2ZpbGUuCi0KLVR1ZSBBdWcgIDMgMTU6NDM6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYywgaW4gZGlzYWJsZWQgY29kZSk6IElmCi0JZGVidWcgc2VjdGlvbiBpcyBuZXcsIGFsbG9jYXRlIGFuIGV4dHJhIDEyIGJ5dGVzIGF0IGl0cyBzdGFydC4gIElmCi0JIi5zdGFicyIgdHlwZSBpcyBOX1NPLCBmaWxsIGluIGZpbGVuYW1lIHN5bWJvbCBmaWVsZCBvZiB0aGF0IGZpcnN0Ci0JZW50cnkuICBSZXR1cm4gZWFybHkgaWYgImdvb2YiLCB0byBzaW1wbGlmeSBsYXRlciBjb2RlIHNsaWdodGx5LgotCShhZGp1c3Rfc3RhYl9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2Zyb2JfZmlsZSk6IEFwcGx5IGFkanVzdF9zdGFiX3NlY3Rpb25zIHRvIGVhY2ggc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3ByZXZpb3VzKTogTm8gbG9uZ2VyCi0Jc3RhdGljLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3ByZXZpb3VzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIHRoZW0gZm9yICJwdXNoc2VjdGlvbiIKLQlhbmQgInBvcHNlY3Rpb24iLCBhbmQgY2FsbCBjb25zIGZvciAidWF3b3JkIiBhbmQgInVhaGFsZiIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdmVyc2lvbik6IFVzZSBFbmdsaXNoIGluIGVycm9yCi0JbWVzc2FnZXMuCi0KLVR1ZSBBdWcgIDMgMTE6Mjk6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IFVwZGF0ZWQgZm9yIEJGRCBFQ09GRiBjaGFuZ2VzLiAgTm93IGdldHMgdGhlCi0Jc3dhcHBpbmcgcm91dGluZXMgYW5kIGV4dGVybmFsIHN0cnVjdHVyZSBzaXplcyB2aWEgdGhlCi0JZWNvZmZfYmFja2VuZCBpbmZvcm1hdGlvbi4gIE5vIGxvbmdlciBpbmNsdWRlcyBjb2ZmL21pcHMuaC4KLQotTW9uIEF1ZyAgMiAxNzozNTo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZ2V0X3RhZyk6IFNhdmUgdGFnIG5hbWUgaW4gcGVybWFuZW50IG1lbW9yeQotCWFuZCBpbiBoYXNoX3B0ci0+c3RyaW5nLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogUmVzZXQgc3RhdGUgdG8gMCBhZnRlciAuYXBwbGluZSBpZgotCWZpbGUgbmFtZSBpcyBub3Qgc2Vlbi4KLQotTW9uIEF1ZyAgMiAxMTo1MTo0MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIGNhc2UgQkZEX1JFTE9DXzY0KTogTmV3IGNhc2UsCi0JcGFyYWxsZWwgdG8gQkZEX1JFTE9DXzMyLgotCSh0Y19nZW5fcmVsb2MpOiBBY2NlcHQgQkZEX1JFTE9DXzY0LgotCi1UaHUgSnVsIDI5IDIyOjIxOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYzogRG9uJ3QgdXNlIHNob3J0IGludCBpbiBhIHByb3RvdHlwZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogTWFrZSByZXR1cm4gdmFsdWUgc2ltcGx5IGRlcGVuZCBvbiBjb250ZW50cyBvZgotCXJldHVybmVkIGV4cHJlc3Npb24uCi0KLVRodSBKdWwgMjkgMTg6Mzg6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHNwYXJjKi1hb3V0IGFuZCBzcGFyYyotdnh3b3JrcyBhcmUgQkZEIGFzc2VtYmxlcnMKLQotVGh1IEp1bCAyOSAxODozODozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiByZW1vdmUgc29tZSBvbGQgZnVuY3Rpb24gZGVjbHMgdGhhdCBjb25mbGljdAotCXcvIEFOU0ksIGFuZCB3aGljaCB3ZXJlbid0IG5lZWRlZCBhbnl3YXkKLQotV2VkIEp1bCAyOCAxNjozNDo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9iX3N5bWJvbCk6IFJlbmFtZWQgZnJvbSB0Y19mcm9iX3N5bWJvbCwKLQlhbmQgZGlzYWJsZWQgc2luY2UgaXQgYnJlYWtzIElhbidzIG5ldyBzeW1ib2wtdmFsdWUgY29kZS4KLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogQWNjZXB0IG1vcmUgZGlnaXRzIGlmIEJGRDY0LgotCi1XZWQgSnVsIDI4IDExOjMwOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IElmIHdlIGhhdmUgYSBub3JtYWwgY29uc3RhbnQgd2hlbiB3ZQotCWV4cGVjdCBhIGJpZ251bSwgdHVybiBpdCBpbnRvIGEgYmlnbnVtLiAgT3V0cHV0IGV4dHJhIHplcm9lcwotCWJlZm9yZSBhIHNob3J0IGJpZ251bSwgcmF0aGVyIHRoYW4gYWZ0ZXIuCi0KLVR1ZSBKdWwgMjcgMTU6NTQ6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBDb25kaXRpb25hbGl6ZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGNhbGwKLQlvbiBERUJVR19TWU1TLCBub3QgREVCVUcuCi0JKHN5bWJvbF9yZW1vdmUpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2luc2VydCk6IExpa2V3aXNlLgotCi1UdWUgSnVsIDI3IDA4OjQ1OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19vcHRpbWl6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFwcGVuZF9pbnNuKTogSWYgbWlwc19vcHRpbWl6ZSA9PSAwLCBhbHdheXMgaW5zZXJ0IE5PUAotCWluc3RydWN0aW9ucy4gIElmIG1pcHNfb3B0aW1pemUgPCAyLCBkb24ndCBzd2FwIGJyYW5jaGVzLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiAtT3ggb3IgLWd4LCBzZXQgbWlwc19vcHRpbWl6ZSBhY2NvcmRpbmdseS4KLQotTW9uIEp1bCAyNiAxODowMjo0MyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IGlmIHRlc3RzdWl0ZSBkb2VzIG5vdCBleGlzdCwgdGhlbiBza2lwIGl0LgotCi1GcmkgSnVsIDIzIDE0OjEzOjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAocHJldl9pbnNuX3VucmVvcmRlcmVkLAotCXByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBicmFuY2ggaW5zdHJ1Y3Rpb24gaWYKLQlwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCAoc2VlIGNvbW1lbnQpLgotCShtaXBzX25vX3ByZXZfaW5zbik6IENsZWFyIHRoZSB1bnJlb3JkZXJlZCB2YXJpYWJsZXMuCi0JKHNfbWlwc3NldCk6IFdoZW4gdHVybmluZyBvbiByZW9yZGVyaW5nLCBzZXQgdGhlIHVucmVvcmRlcmVkCi0JdmFyaWFibGVzLgotCi1GcmkgSnVsIDIzIDEzOjA5OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogU2VjdGlvbnMgIi5pbml0IiBhbmQgIi5maW5pIgotCWFyZSBhbHNvIG1hZ2ljLCBhbmQgaGF2ZSBzcGVjaWFsIGRlZmF1bHQgZmxhZyBzZXR0aW5ncy4KLQkob2JqX2VsZl9mcm9iX3N5bWJvbCk6IFNpbmNlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIGZ1bmN0aW9uCi0JaXNuJ3QgdXNlZCwgZG9uJ3QgYm90aGVyIGNhbGxpbmcgb2JqX2VsZl93cml0ZV9zeW1ib2xfcCwgc2luY2UgaXQKLQlkb2Vzbid0IGFjY29tcGxpc2ggYW55dGhpbmcgZWxzZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBSb3VuZCB1cCBzZWN0aW9uIHNpemUgb25seQotCWZvciBhLm91dCBmb3JtYXQuCi0KLQkqIHN5bWJvbHMuYzogRG9uJ3QgZGVmaW5lIERFQlVHIGJ5IGRlZmF1bHQuCi0KLVRodSBKdWwgMjIgMTI6MDk6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IEhhbmRsZSBhIE9fdW1pbnVzIGV4cHJlc3Npb24uCi0KLQkqIGV4cHIuYyAoZXhwcik6IERvbid0IGxldCBhYnNvbHV0ZV9zZWN0aW9uIG92ZXJyaWRlCi0JdW5kZWZpbmVkX3NlY3Rpb24gZm9yIHRoZSByZXR1cm4gdmFsdWUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTk9fUFNFVURPX0RPVCBjYXNlLCBpZiB3ZSBmaW5kIGEKLQlwc2V1ZG8tb3Agd2l0aCBhIHBvY19oYW5kbGVyIGZpZWxkIG9mIE5VTEwsIGlnbm9yZSBpdCBhbmQgdHJlYXQgaXQKLQlhcyBhbiBpbnN0cnVjdGlvbiBpbnN0ZWFkLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJzZXQiIHdpdGggYSBOVUxMCi0JcG9jX2hhbmRsZXIgZmllbGQuCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChtZF9iZWdpbik6IFVzZSBhIGxvY2FsIHZhcmlhYmxlIHdoZW4KLQlpbml0aWFsaXppbmcgbWRfcmVsYXhfdGFibGUgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgbW9kaWZ5aW5nIGEKLQlzdXBwb3NlZGx5IGNvbnN0IGRhdGEgc3RydWN0dXJlLgotCi1UaHUgSnVsIDIyIDEwOjU4OjUxIDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmM6IE9ubHkgaW5jbHVkZSBhb3V0L2FvdXQ2NC5oIGlmIEJGRF9BU1NFTUJMRVIKLQlpcyBkZWZpbmVkLgotCi1XZWQgSnVsIDIxIDE3OjMyOjAyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHtob3N0fSk6ICBNYXAgKi0qLXN5c3Y0KiB0byBnYXNfaG9zdD1zeXN2LgotCSogY29uZmlndXJlLmluIChjYXNlICR7Z2VuZXJpY190YXJnZXR9KTogIEFkZCBpWzM0XTg2LSotc3lzdjQqCi0JY2FzZSB0byBzZXQgb2JqX2Zvcm1hdD1lbGYuICBNdXN0IGdvIGJlZm9yZSBpMzg2LSotc3lzdiogY2FzZSB0aGF0Ci0Jc2V0cyBvYmpfZm9ybWF0PWNvZmZic2QuICBBZGQgKi0qLXN5c3Y0KiB0byAqLSotZWxmIGFuZAotCSotKi1zb2xhcmlzIGNhc2UsIGFuZCBtb3ZlIHRvIGJlZm9yZSAqLXN5c3YqIGNhc2UgdGhhdCB3YW50cyB0bwotCXNldCBvYmpfZm9ybWF0IHRvIGNvZmYuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBDaGFuZ2UgYWxsICdleHAuWF9vcCcgdG8KLQknZXhwLT5YX29wJy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeCk6ICBGaXggdmFscCB0byBiZSAndmFsdWVUIConIGZvcgotCUJGRF9BU1NFTUJMRVIgY2FzZS4KLQotV2VkIEp1bCAyMSAxMjo0Nzo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBJbmNsdWRlIGFvdXQvYW91dDY0LmguCi0JKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogU2V0IEJTRl9ERUJVR0dJTkcgZm9yIGEgY29uc3RydWN0b3IKLQlzeW1ib2wsIHNvIHRoYXQgQkZEIGRvZXNuJ3QgdGFtcGVyIHdpdGggdGhlIHR5cGUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgTk9fUFNFVURPX0RPVCBpcyBkZWZpbmVkLCBsb29rCi0JdXAgb3Bjb2RlcyBhcyBwc2V1ZG8tb3BzIGV2ZW4gaWYgdGhleSBkb24ndCBzdGFydCB3aXRoICcuJy4KLQkqIGNvbmZpZy90Yy1tODhrLmggKE5PX1BTRVVET19ET1QpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZWQgc3BlY2lhbCBwc2V1ZG8tb3AKLQloYW5kbGluZy4KLQkobWRfYXBwbHlfZml4KTogU2V0IGZ4X29mZnNldCB0byB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgcmVsb2MuCi0JT3V0cHV0IHRoZSBsb3cgMTYgYml0cyBmb3IgUkVMT0NfSEkxNiwgbm90IHRoZSBoaWdoIDE2IGJpdHMuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IElmIFRDX004OEssIHNldCB0aGUKLQlyX29mZnNldCBmaWVsZCBvZiB0aGUgcmVsb2MgdG8gdGhlIGZpeHVwIG9mZnNldC4KLQkoZml4dXBfc2VnbWVudHMpOiBJZiBUQ19NODhLLCBkb24ndCB3YXJuIGFib3V0IGZpeHVwIG92ZXJmbG93cy4KLQkqIGRvYy9hcy50ZXhpbmZvOiBNaW5vciB1cGRhdGVzLgotCi1UdWUgSnVsIDIwIDE5OjI4OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gcGVybWl0IHN5bWJvbHMgdG8gY29udGFpbiBhbnkgZXhwcmVzc2lvbgotCXR5cGUgYW5kIHRvIGRlbGF5IHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB1bnRpbCB0aGUKLQl2YWx1ZSBpcyBhY3R1YWxseSBuZWVkZWQuICBUaGlzIHBlcm1pdHMgc2V0dGluZyBzeW1ib2xzIHRvIHZhbHVlcwotCWNhbGN1bGF0ZWQgYmFzZWQgb24gb2JqZWN0IGNvZGUgc2l6ZS4gIEV4cHJlc3Npb25zIHdlcmUgY2hhbmdlZCB0bwotCW5vIGxvbmdlciBiZSBpbiBhIHNlY3Rpb24sIHRvIHN0b3AgdGhlIG92ZXJsb2FkaW5nIG9mIHNlZ21lbnQgYW5kCi0JZXhwcmVzc2lvbiB0eXBlIHRoYXQgcHJldmlvdXNseSBvY2N1cnJlZC4KLQotCSogYXMuYyAoYmlnX3NlY3Rpb24sIHBhc3MxX3NlY3Rpb24sIGRpZmZfc2VjdGlvbiwgYWJzZW50X3NlY3Rpb24pOgotCVJlbW92ZWQuCi0JKGV4cHJfc2VjdGlvbik6IEFkZGVkICh1c2VkIGZvciBkdW1teSBzeW1ib2xzIHdoaWNoIGhvbGQKLQlpbnRlcm1lZGlhdGUgZXhwcmVzc2lvbiB2YWx1ZXMpLgotCShwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDcmVhdGUgZXhwcl9zZWN0aW9uLCBkbyBub3QgY3JlYXRlIHRoZQotCXNlY3Rpb25zIG5vdyByZW1vdmVkLgotCSogYXMuaCAoc2VnVCk6IFJlbW92ZWQgU0VHX0FCU0VOVCwgU0VHX1BBU1MxLCBTRUdfQklHLCBhbmQKLQlTRUdfRElGRkVSRU5DRS4gIEFkZGVkIFNFR19FWFBSLgotCShTRUdfTk9STUFMKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogc3Vic2Vncy5jIChzZWdfbmFtZSwgc3Vic2Vnc19iZWdpbik6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpdHRvLgotCSogY29uZmlnL29iai1hb3V0LmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotYm91dC5jIChzZWdfTl9UWVBFKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQotCSogZXhwci5oIChvcGVyYXRvclQpOiBNb3ZlZCBpbiBmcm9tIGV4cHIuYywgYWRkZWQgc29tZSB2YWx1ZXMuCi0JKGV4cHJlc3Npb25TKTogQWRkZWQgWF9vcCBmaWVsZCwgcmVtb3ZlZCBYX3NlZyBmaWVsZDsgcmVuYW1lZAotCVhfc3VidHJhY3Rfc3ltYm9sIHRvIFhfb3Bfc3ltYm9sLgotCSogZXhwci5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byBhc3NpZ24gZXhwcmVzc2lvbiB0eXBlcyByYXRoZXIgdGhhbgotCXNlY3Rpb25zIGFuZCB0byBzaW1wbGlmeSB0aGUgcGFyc2luZy4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaXhfbmV3KTogUmVtb3ZlZCBzdWJfc3ltYm9sIGFyZ3VtZW50LgotCShmaXhfbmV3X2V4cCk6IE5ldyBmdW5jdGlvbiwgdGFrZXMgZXhwcmVzc2lvbiBhcmd1bWVudC4KLQkqIHdyaXRlLmg6IFByb3RvdHlwZSBjaGFuZ2VzIGZvciBmaXhfbmV3IGFuZCBmaXhfbmV3X2V4cC4KLQkqIGNvbmQuYyAoc19pZik6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiByZWFkLmMgKHNfbHN5bSwgcHNldWRvX3NldCwgZW1pdF9leHByLCBwYXJzZV9iaXRmaWVsZF9jb25zLAotCXBhcnNlX3JlcGVhdF9jb25zLCBnZXRfc2VnbWVudGVkX2V4cHJlc3Npb24sCi0JZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IERpdHRvLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSwgU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKToKLQlEaXR0by4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGVmLCBvYmpfY29mZl92YWwpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9kZWYsIG9ial9jb2ZmX3ZhbCwKLQlvYmpfY29mZl9lbmRlZiwgeWFua19zeW1ib2xzKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYywgb2JqX2VsZl9zaXplKTogRGl0dG8uCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9hc3NlbWJsZSwgcGFyc2Vfb3BlcmFuZCwgbWFjaGluZV9pcCwKLQlwcmludF9pbnNuLCBtZF9vcGVyYW5kKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaDgzMDAuYyAocGFyc2VfZXhwLCBjb2xvbm1vZDI0LCBjaGVja19vcGVyYW5kLAotCWRvX2FfZml4X2ltbSwgYnVpbGRfYnl0ZXMpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChwYXJzZV9leHAsIHNraXBfY29sb250aGluZywgcGFyc2VfcmVnbGlzdCwKLQlnZXRfc3BlY2lmaWMsIGNoZWNrLCBpbnNlcnQsIG1kX2NvbnZlcnRfZnJhZyk6IERpdHRvLgotCSogY29uZmlnL3RjLWhwcGEuYyAodGhlX2luc24sIGZpeF9uZXdfaHBwYSwgY29uc19maXhfbmV3X2hwcGEsCi0JbWRfYXNzZW1ibGUsIHBhX2lwLCBnZXRFeHByZXNzaW9uLCBnZXRBYnNvbHV0ZUV4cHJlc3Npb24sCi0JZXZhbHVhdGVBYnNvbHV0ZSwgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlLCBwYV9lbnRyeSwKLQlwcm9jZXNzX2V4aXQpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFNUQUJfRklYVVAsIGlzX0RQX3JlbGF0aXZlLCBpc19QQ19yZWxhdGl2ZSwKLQlpc19jb21wbGV4KTogRGl0dG8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwZSwgbWRfYXNzZW1ibGUsIGkzODZfb3BlcmFuZCwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfY3JlYXRlX2xvbmdfanVtcCk6IERpdHRvLgotCSogY29uZmlnL3RjLWk4NjAuYyAobWRfYXNzZW1ibGUsIGdldEV4cHJlc3Npb24sIHByaW50X2luc24pOgotCURpdHRvLgotCSogY29uZmlnL3RjLWk5NjAuYyAocGFyc2VfZXhwciwgc3Vicywgc2VncywgbWRfY29udmVydF9mcmFnLAotCWdldF9jZGlzcCwgbWVtX2ZtdCwgcGFyc2VfbGRjb25zdCwgcmVsYXhfY29iciwgc19zeXNwcm9jLAotCWk5NjBfaGFuZGxlX2FsaWduKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19leHAsIHN0cnVjdCBtNjhrX2l0LCBzZWcsIG9wLAotCXN1YnMsIGFkZF9maXgsIGlzdmFyLCBtNjhrX2lwLCBtZF9hc3NlbWJsZSwgbWRfY29udmVydF9mcmFnXzEsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXAsIGdldF9udW0pOgotCURpdHRvLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfYXNzZW1ibGUsIGdldF9pbW0xNiwgZ2V0X3BjciwKLQltZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCk6IERpdHRvLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXNzZW1ibGUsIGFwcGVuZF9pbnNuLCBncF9yZWZlcmVuY2UsCi0JbWFjcm9fYnVpbGQsIG1hY3JvLCBteV9nZXRFeHByZXNzaW9uKTogRGl0dG8uICBBbHNvIHJlbW92ZWQKLQlnZXRfb3B0aW9uYWxfYWJzb2x1dGVfZXhwcmVzc2lvbjsganVzdCB1c2UgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24KLQlpbnN0ZWFkLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKGdldF9hZGRyX21vZGUsIGV2YWx1YXRlX2V4cHIsIGNvbnZlcnRfaWlmLAotCWZpeF9uZXdfbnMzMmssIGZpeF9uZXdfbnMzMmtfZXhwLCBjb25zX2ZpeF9uZXdfbnMzMmspOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChmaXhfbmV3X25zMzJrIHByb3RvdHlwZSk6IERpdHRvLgotCSogY29uZmlnL3RjLXNoLmMgKHBhcnNlX2V4cCwgY2hlY2ssIGluc2VydCwgbWRfY29udmVydF9mcmFnKToKLQlEaXR0by4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hc3NlbWJsZSwgc3BhcmNfaXAsIGdldEV4cHJlc3Npb24sCi0JcHJpbnRfaW5zbik6IERpdHRvLgotCSogY29uZmlnL3RjLXRhaG9lLmMgKHN0cnVjdCB0b3AsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LAotCXRpcF9vcCwgbWRfYXNzZW1ibGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy12YXguYyAoc2VnX29mX29wZXJhbmQsIG1kX2Fzc2VtYmxlLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKiBjb25maWcvdGMtejhrLmMgKHBhcnNlX2V4cCwgY2hlY2tfb3BlcmFuZCwgbmV3Zml4KTogRGl0dG8uCi0KLVR1ZSBKdWwgMjAgMTI6MTc6MTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGkzODYtbHlueCBpcyB0aGUgc2FtZSBhcyBpMzg2LWNvZmYKLQotTW9uIEp1bCAxOSAxNToyMToyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfcHJldmlvdXMpOiBOZXcgZnVuY3Rpb24uCi0JKHByZXZpb3VzX3NlY3Rpb24sIHByZXZpb3VzX3N1YnNlY3Rpb24pOiBOZXcgdmFycy4KLQkob2JqX2VsZl9zZWN0aW9uKTogU2F2ZSBjdXJyZW50IHBsYWNlIGluIGNhc2UgRFdBUkYgY29kZSB3YW50cyB1cwotCXRvIHBvcCBiYWNrIHRvIGl0LiAgSGFuZGxlIHVucXVvdGVkIHNlY3Rpb24gbmFtZSBhcyB3ZWxsIGFzIHF1b3RlZAotCXNlY3Rpb24gbmFtZS4gIERvbid0IGNyYXNoIG9uIGludmFsaWQgc3RyaW5ncy4KLQkob2JqX3BzZXVkb190YWJsZSk6IEhhbmRsZSBuZXcgcHNldWRvcyAicHJldmlvdXMiLCAiMmJ5dGUiLCBhbmQKLQkiNGJ5dGUiLgotCi0JKiBjb25maWcvb2JqLWVsZi5oOiBEb24ndCBpbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogRGVjbGFyZSBhcmcgYXMgc3RydWN0IHN5bWJvbCAqLgotCi0JKiB0Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCkgW09CSl9FTEZdOiBMb2NhbCBsYWJlbHMgY2FuIHN0YXJ0IHdpdGgKLQkiTCIgb3IgIl8uTF8iLgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG9mZiBmcm9tCi0Jd3JpdGVfY29udGVudHMuICBVc2UgbWVtc2V0IGluc3RlYWQgb2YgYnplcm8uCi0JKHdyaXRlX29iamVjdF9maWxlKTogQXBwbHkgd3JpdGVfcmVsb2NzIHRvIGVhY2ggc2VjdGlvbiBiZWZvcmUKLQlhcHBseWluZyB3cml0ZV9jb250ZW50cy4KLQotCSogcmVhZC5jIChyZWFkX2JlZ2luKTogQ2FsbCBvYnN0YWNrX2JlZ2luIHdpdGggdmFsdWVzIGNsb3NlciB0byAxSwotCW11bHRpcGxlcy4KLQkocmVhZF9hX3NvdXJjZV9maWxlLCBiaWdfY29ucywgZmxvYXRfY29ucyk6IFVzZSBtZW1jcHkgaW5zdGVhZCBvZgotCWJjb3B5LgotCi1Nb24gSnVsIDE5IDE0OjMwOjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcF9vcCk6IERvbid0IGRlY3JlbWVudCBzdHJlbmQgd2hlbgotCWNhbGN1bGF0aW5nIG9wUC0+aXNpejsgdGhpcyBwZXJtaXRzIHRoZSBleHByZXNzaW9uIHNpemUgdG8gYmUKLQlkZXRlcm1pbmVkIGFzIHdlbGwsIGxhdGVyIG9uLgotCi0JKiBleHByLmMgKGNsZWFuX3VwX2V4cHJlc3Npb24pOiBEb24ndCBjYW5jZWwgdGhlIHN1YnRyYWN0aW9uIG9mCi0JdW5kZWZpbmVkIHN5bWJvbHMuCi0KLQkqIHJlYWQuYyAoc19kYXRhKSwgY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2RhdGEpOiBJZiAtUiwKLQlzd2l0Y2ggdG8gdGV4dCBzZWN0aW9uIHJhdGhlciB0aGFuIGRhdGEgc2VjdGlvbi4KLQotTW9uIEp1bCAxOSAxMjozNTozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2UgQUlORFgpOiBBZGQgNiB0byBvcGVyYW5kCi0JZXhwcmVzc2lvbiAodG8gdGFrZSB0aGUgcGMtcmVsIGluc3RydWN0aW9uIGl0c2VsZiBpbnRvIGFjY291bnQpCi0JYmVmb3JlIHVzaW5nIHRoZSBleHByZXNzaW9uLCBpbnN0ZWFkIG9mIGFmdGVyLgotCi1GcmkgSnVsIDE2IDA4OjU2OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChmbG9hdF9jb25zKTogU2ltcGxpZmllZCBwYXJzaW5nIGxvZ2ljLiAgSWYKLQlSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLCBhY2NlcHQgYSByZXBlYXQgY291bnQuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBSYXRoZXIgdGhhbiBhIHNwZWNpYWwgY2FzZSBmb3IgVENfSFBQQSwKLQl1c2UgbmV3IG1hY3JvIHRjX2Zyb2JfbGFiZWwuCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBNYW55IGNoYW5nZXMgdG8gc3VwcG9ydCBzaW1wbGUgYXNzZW1ibGVyCi0Jb3B0aW1pemF0aW9uLgotCShpbnNuX2xhYmVsLCBwcmV2X2luc24sIHByZXZfcHJldl9pbnNuLCBkdW1teV9vcGNvZGUsCi0JcHJldl9pbnNuX3ZhbGlkLCBwcmV2X2luc25fZnJhZywgcHJldl9pbnNuX3doZXJlLAotCXByZXZfaW5zbl9maXhwLCBwcmV2X2luc25faXNfZGVsYXlfc2xvdCk6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZXMuCi0JKGluc25fdXNlc19yZWcsIG1pcHNfbm9fcHJldl9pbnNuLCBtaXBzX2VtaXRfZGVsYXlzLAotCW1pcHNfYWxpZ24sIHNfc3RyaW5nZXIsIHNfbWlwc19zcGFjZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShtaXBzX2RlZmluZV9sYWJlbCk6IE5ldyBnbG9iYWwgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEZvciAiYXNjaWkiLCAiYXNjaXoiLCAiYXNjaWl6IiwgY2FsbAotCXNfc3RyaW5nZXIuICBDaGFuZ2VkIGFyZ3VtZW50IHRvIGZsb2F0X2NvbnMgZnJvbSAwIG9yIDEgdG8gJ2YnCi0Jb3IgJ2QnLiAgRm9yICJzcGFjZSIgY2FsbCBzX21pcHNfc3BhY2UuCi0JKG1kX2JlZ2luKTogQ2FsbCBtaXBzX25vX3ByZXZfaW5zbi4KLQkoYXBwZW5kX2luc24pOiBPbmx5IGluc2VydCBuZWNlc3NhcnkgTk9QIGluc3RydWN0aW9ucy4KLQkobWFjcm8pOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMgYmVmb3JlIHNldHRpbmcgbWlwc19ub3Jlb3JkZXIuCi0JSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgbWlwc19ub3Jlb3JkZXIgcmF0aGVyIHRoYW4gdXNpbmcKLQlzYXZlX3Jlb3JkZXJfY29uZGl0aW9uLiAgRG9uJ3QgYm90aGVyIHRvIHVzZSBub3Jlb3JkZXIgaW4KLQlNX0xfRE9CIGFuZCBNX0xfREFCLCBzaW5jZSBhcHBlbmRfaW5zbiB3aWxsIG5vdCBpbnNlcnQgYSBOT1AuCi0JKG1kX2F0b2YpOiBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjb3JyZWN0bHkgZm9yIGJvdGgKLQliaWcgYW5kIGxpdHRsZSBlbmRpYW4gdGFyZ2V0cy4KLQkoc19hbGlnbiwgc19jb25zKTogQ2FsbCBtaXBzX2FsaWduIHJhdGhlciB0aGFuIGZyYWdfYWxpZ24uCi0JKHNfY2hhbmdlX3NlZywgc19jb25zKTogQ2FsbCBtaXBzX2VtaXRfZGVsYXlzLgotCShzX2Zsb2F0X2NvbnMpOiBMZXQgZmxvYXRfY29ucyBkbyB0aGUgd29yay4KLQkoc19taXBzc2V0KTogQ2FsbCBtaXBzX2VtaXRfZGVsYXlzIHdoZW4gc2V0dGluZyBub3Jlb3JkZXIuCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2xhYmVsKTogRGVmaW5lIHRvIGJlCi0JbWlwc19kZWZpbmVfbGFiZWwuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scywgZWNvZmZfYnVpbGRfcHJvY3MsCi0JZWNvZmZfZnJvYl9maWxlcyk6IENvbnNpc3RlbnRseSB1c2UgU19HRVRfVkFMVUUgcmF0aGVyIHRoYW4KLQliZmRfYXN5bWJvbF92YWx1ZS4gIFdhcm4gaWYgdGFraW5nIGRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbgotCWRpZmZlcmVudCBzZWdtZW50cy4KLQotVGh1IEp1bCAxNSAxMTo1MTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRGlzY2FyZCBhbGwgb3BlbiBzY29wZXMsCi0Jd2l0aCBhIHdhcm5pbmcuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogSWYgVENfTTg4SywgZG9uJ3QgYWRqdXN0Ci0JYnkgbWRfcGNyZWxfZnJvbSBpZiB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0IGEgc3ltYm9sICh3ZSBzdGlsbAotCW5lZWQgbWRfcGNyZWxfZnJvbSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIHdpdGhpbiB0aGUgc2FtZQotCWZpbGUpLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcGNyZWxfZnJvbSk6IENvcnJlY3RlZCByZXR1cm4gdmFsdWUuCi0JKG9tYWdpYyk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlLgotCi0JKiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBtODhrLWNvZmYuCi0JKiBjb25maWd1cmUuaW4gKG04OGstKi1jb2ZmKik6IE5ldyB0YXJnZXQuICBVc2UgY29mZmJmZCBhbmQKLQltODhrY29mZi4KLQkqIGNvbmZpZy9tODhrY29mZi5tdDogTmV3IGZpbGUuCi0JKiByZWFkLmMgKGxleF90eXBlKTogTmV3IG1hY3JvIExFWF9BVCB0byBzZXQgbGV4IHR5cGUgb2YgJ0AnLgotCShwc2V1ZG9fc2V0KTogSGFuZGxlIGRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbiBkaWZmZXJlbnQgZnJhZ21lbnRzCi0JYnkgc2F2aW5nIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiBhcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBSZXNvbHZlIGRpZmZlcmVuY2UKLQlleHByZXNzaW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfcHNldWRvX3RhYmxlKTogSWYgVENfTTg4SywgYWNjZXB0Ci0JInNkZWYiIGFzIGEgc3lub255bSBmb3IgImRlZiIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogSWYgVENfTTg4SywgaW5jbHVkZSBjb2ZmL204OGsuaCBhbmQgc2V0Ci0JVEFSR0VUX0ZPUk1BVC4KLQkoU19JU19MT0NBTCk6IEFueSBzeW1ib2wgd2hpY2ggaW5jbHVkZXMgXDAwMSBpbiB0aGUgbmFtZSBpcyBsb2NhbC4KLQkqIGNvbmZpZy90Yy1tODhrLmMsIGNvbmZpZy90Yy1tODhrLmg6IE51bWVyb3VzIGNoYW5nZXMgdG8gYnJpbmcKLQltODhrIHBvcnQgdXAgdG8gZGF0ZSwgYW5kIHRvIGFkZCBDT0ZGIHN1cHBvcnQuCi0KLVdlZCBKdWwgMTQgMTU6MDk6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBSZW1vdmVkIHN5X2ZvcndhcmQgYW5kIHJlcGxhY2VkIGl0IHdpdGggYW4gdW5kZWZpbmVkIGV4cHJlc3Npb24KLQlhcyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IFJlbW92ZWQgc3lfZm9yd2FyZCBmaWVsZC4gIEFkZGVkCi0Jc3lfcmVzb2x2ZWQgYW5kIHN5X3Jlc29sdmluZyBzaW5nbGUgYml0IGZpZWxkcy4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IERvbid0IGluaXRpYWxpemUgc3lfZm9yd2FyZCBmaWVsZC4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBOZXcgZnVuY3Rpb24gdG8gYWRqdXN0IHN5bWJvbCB2YWx1ZSBieQotCWZyYWdtZW50IGFkZHJlc3MsIHVzaW5nIHJlY3Vyc2lvbiB0byByZXNvbHZlIGZvcndhcmQgc3ltYm9scy4KLQkqIHN5bWJvbHMuaDogQWRkZWQgcHJvdG90eXBlIGZvciBuZXcgZnVuY3Rpb24uCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBTZXQgc3ltYm9sUC0+c3lfdmFsdWUgdG8gYW4gdW5kZWZpbmVkCi0JZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBzZXR0aW5nIHN5bWJvbFAtPnN5X2ZvcndhcmQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgotCXN5bWJvbHMsIGtlZXBpbmcgdGhlIGNvbW1vbiBjYXNlICh0aGUgb2xkIGJlaGF2aW91cikgaW5saW5lLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCBzeV9mb3J3YXJkCi0JaGFuZGxpbmcgKHN1YnN1bWVkIGJ5IHdyaXRlLmMgY2hhbmdlKS4KLQkqIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfdmFsKTogU2V0Ci0Jc3lfdmFsdWUgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9lbmRlZiwgeWFua19zeW1ib2xzKTogQ2hlY2sKLQlleHByZXNzaW9uIHNlZ21lbnQgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KLQkoeWFua19zeW1ib2xzKTogVXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlLgotCShjcmF3bF9zeW1ib2xzKTogUmVtb3ZlZCBleHRyYSBwYXNzIG92ZXIgc3ltYm9scy4KLQkqIGNvbmZpZy9vYmotYW91dC5jLCBjb25maWcvb2JqLWJvdXQuYywgY29uZmlnL29iai1jb2ZmLmMsCi0JY29uZmlnL29iai12bXMuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFJlbW92ZWQgZXh0cmEgcGFzcyBvdmVyCi0Jc3ltYm9scyB3aGljaCBoYW5kbGVkIHN5X2ZvcndhcmQ7IHVzZSByZXNvbHZlX3N5bWJvbF92YWx1ZQotCWluc3RlYWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCwgY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKToKLQlEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IENoZWNrIGV4cHJlc3Npb24KLQlzZWdtZW50IHJhdGhlciB0aGFuIHN5X2ZvcndhcmQuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfQ2hlY2tfRm9yX01haW4pOiBEb24ndCBpbml0aWFsaXplCi0Jc3lfZm9yd2FyZDsgZG8gaW5pdGlhbGl6ZSBzeV9yZXNvbHZlZCBhbmQgc3lfcmVzb2x2aW5nLgotCSogY29uZmlnL3RjLWhwcGEuaCAoU1RBQl9GSVhVUCk6IFVzZSBzeV92YWx1ZSwgbm90IHN5X2ZvcndhcmQuCi0KLQkqIENoYW5nZXMgdG8ga2VlcCBhIGZ1bGwgZXhwcmVzc2lvbiBhcyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIG5vdAotCWp1c3QgYSBsb25nd29yZDoKLQkqIHN0cnVjLXN5bWJvbC5oOiBOZXcgZmllbGQgc3lfdmFsdWUuCi0JKiBhcy5oOiBJbmNsdWRlIGV4cHIuaCBiZWZvcmUgc3RydWMtc3ltYm9sLmguCi0JKiBleHByLmg6IFVzZSBzdHJ1Y3Qgc3ltYm9sIHJhdGhlciB0aGFuIHN5bWJvbFMuCi0JKiBzeW1ib2xzLmMgKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IFJld3JvdGUgdG8gcmV0cmlldmUgdmFsdWUKLQlvZiBzeV92YWx1ZSBmaWVsZDsgY29tcGlsZSB1bmNvbmRpdGlvbmFsbHksIG5vdCBqdXN0IGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkqIHN5bWJvbHMuaDogQ29tcGlsZSBTX3tTR31FVF9WQUxVRSBwcm90b3R5cGVzIHVuY29uZGl0aW9uYWxseS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IEJGRCBzeW1ib2wgdmFsdWUgdG8gZ2FzIHN5bWJvbAotCXZhbHVlLgotCSogY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotYm91dC5oLCBjb25maWcvb2JqLWNvZmYuaCwKLQljb25maWcvb2JqLWNvZmZiZmQuaCwgY29uZmlnL29iai1nZW5lcmljLmgsIGNvbmZpZy9vYmotdm1zLmgKLQkoU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogUmVtb3ZlZCBtYWNybyBkZWZpbml0aW9ucy4KLQkqIGNvbmZpZy9vYmotaWVlZS5jIChTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1jb2ZmLmgsIG9iai1jb2ZmYmZkLmg6IFJld3JvdGUgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlCi0JU19HRVRfVkFMVUUgcmF0aGVyIHRoYW4gb3N0X2VudHJ5Lm5fdmFsdWUuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3N5bWJvbF90b19jaGFycyksIGNvbmZpZy9vYmotYm91dC5jCi0JKG9ial9zeW1ib2xfdG9fY2hhcnMpLCBjb25maWcvb2JqLWNvZmYuYyAob2JqX3N5bWJvbF90b19jaGFycyksCi0JY29uZmlnL29iai1jb2ZmYmZkLmMgKHN5bWJvbF90b19jaGFycyk6IEdldCB2YWx1ZSB0byB3cml0ZSBvdXQKLQl1c2luZyBTX0dFVF9WQUxVRS0tZG9uJ3QgYXNzdW1lIGl0IGlzIGFscmVhZHkgc2V0LgotCSogY29uZmlnL29iai1pZWVlLmMgKGRvX3N5bWJvbHMpOiBTZXQgQkZEIHN5bWJvbCB2YWx1ZSB0byBnYXMKLQlzeW1ib2wgdmFsdWUuCi0JKiBjb25maWcvb2JqLXZtcy5jICh2YXJpb3VzKTogRG9uJ3QgYXNzaWduIGRpcmVjdGx5IHRvCi0JU19HRVRfVkFMVUU7IHVzZSBTX1NFVF9WQUxVRSBpbnN0ZWFkLgotCi1XZWQgSnVsIDE0IDA5OjM1OjIzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBzcGFyYzY0LSotYW91dCogdXNlIGJmZCBnYXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGg4MzAwaC4KLQotVHVlIEp1bCAxMyAxMjowOTo0NCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobGluZV9jb21tZW50X2NoYXJzKTogQWRkIGhhc2guCi0JKHBhcnNlX2V4cCwgc2tpcF9jb2xvbnRoaW5nLCBidWlsZF9ieXRlcyk6IEFkZCBzdXBwb3J0IGZvcgotCVJfSDg1MDBfSElHSDE2IHJlbG9jYXRpb24gdHlwZS4KLQotTW9uIEp1bCAxMiAxMToxNTozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgYEAnIHRvIGludHJvZHVjZSBhbgotCWF0dHJpYnV0ZSBuYW1lLiAgSGFuZGxlIGBleGVjaW5zdHInIGF0dHJpYnV0ZS4KLQotTW9uIEp1bCAxMiAwNzoyMjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB3YXJuIG9uICdpJyBvciAnaicgbWlzbWF0Y2ggaWYKLQl0aGVyZSBpcyBhbm90aGVyIGFsdGVybmF0aXZlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBKdWwgIDkgMTc6MzE6MzQgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm86IHVwZGF0ZXMgZm9yIEg4LzMwMEgKLQotVGh1IEp1bCAgOCAxNDo0MTo0MyAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwKLQltZF9udW1iZXJfdG9fY2hhcnMsIG1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZCB0byB1c2UgdmFsdWVULAotCWFkZHJlc3NULCB0byBtYXRjaCB0Yy5oLgotCi1UaHUgSnVsICA4IDE0OjE1OjA1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogUmV2YW1wIHRvIGhhbmRsZSBib3RoIHN5bnRheGVzLAotCWluZGVwZW5kZW50IG9mIGZvcm1hdC4KLQotVGh1IEp1bCAgOCAwNzoyNToyNSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoVENfQ09OU19SRUxPQyk6IFVzZSBSX1JFTExPTkcgaWYgaDgvMzAwaC4KLQotV2VkIEp1bCAgNyAxODoxMTowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIENST1NTPS1EQ1JPU1NfQ09NUElMRSBpZiBpdCBpcyBhIGNyb3NzCi0JYnVpbGQ7IGFsc28gcmVjb2duaXplIGg4MzAwLSotY29mZgotCi1XZWQgSnVsICA3IDEwOjIxOjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc3ltYm9scy5jIChmYl9sYWJlbF9pbnN0YW5jZSwgZmJfbGFiZWxfaW5zdGFuY2VfaW5jKTogRG9uJ3QgZHVtcAotCWNvcmUganVzdCBiZWNhdXNlIHNvbWVib2R5IHVzZXMgYSBsYWJlbCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4KLQotCSogY29uZmlnL21pcHMtb3Bjb2RlLmg6IE1vdmVkIHRvIG9wY29kZS9taXBzLmguCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIG9wY29kZS9taXBzLmggcmF0aGVyIHRoYW4KLQltaXBzLW9wY29kZS5oLgotCShhcHBlbmRfaW5zbik6IEFuIGV4dHJhIE5PUCBpcyBvbmx5IG5lZWRlZCBhZnRlciBpbnN0cnVjdGlvbnMKLQl3aGljaCBzZXQgSEkgb3IgTE8sIG5vdCBhZnRlciBpbnN0cnVjdGlvbnMgd2hpY2ggcmVhZCBpdC4KLQkobWFjcm9fYnVpbGQsIG1pcHNfaXApOiBTdXBwb3J0IG5ldyAnRScsICdHJyBhbmQgJ0InIGFyZ3VtZW50cy4KLQkobWFjcm8pOiBjZmMxIGFuZCBjdGMxIG5vdyB0YWtlICJ0LEciIHJhdGhlciB0aGFuICJ0LGQiLgotCSogY29uZmlnL3RjLW1pcHMuaCAoc3RydWN0IG1pcHNfb3Bjb2RlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL21pcHMtYmlnLm10LCBjb25maWcvbWlwcy1saXQubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOgotCVNldCB0byAkKHNyY2RpcikvLi4vaW5jbHVkZS9vcGNvZGUvbWlwcy5oLgotCi0JR2V0IHRoZSBNSVBTIGFzc2VtYmxlciB1cCB0byBzcGVlZCB3aXRoIG90aGVyIGdhcyBjaGFuZ2VzOgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3NldF92bWEsIGVjb2ZmX2Zyb2Jfc3ltYm9sKToKLQlSZW1vdmVkOyBkb24ndCBjaGFuZ2UgdGhlIHN5bWJvbCB2YWx1ZS4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scywgZWNvZmZfYnVpbGRfcHJvY3MsIGVjb2ZmX2Zyb2JfZmlsZSk6IFVzZQotCWJmZF9hc3ltYm9sX3ZhbHVlIHJhdGhlciB0aGFuIFNfR0VUX1ZBTFVFIHRvIGluY2x1ZGUgc2VjdGlvbgotCXZtYSBpbiBzeW1ib2wgdmFsdWUuCi0JKGVjb2ZmX2Zyb2JfZmlsZSk6IElnbm9yZSBCU0ZfU0VDVElPTl9TWU0gc3ltYm9scywgc2luY2UgRUNPRkYKLQlkb2Vzbid0IG91dHB1dCB0aGVtLiAgU2V0IHRoZSB2bWEgb2Ygc2VjdGlvbnMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmg6IERvbid0IGRlZmluZSBvYmpfZnJvYl9zeW1ib2wuCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBBZGp1c3RtZW50IGJ5IHNlY3Rpb24gdm1hIGlzIG5vCi0JbG9uZ2VyIG5lY2Vzc2FyeS4KLQkodmFyaW91cyk6IHVzZSB2YWx1ZVQgcmF0aGVyIHRoYW4gbG9uZy4KLQotV2VkIEp1bCAgNyAwODozMzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChFTlY2NCk6IERlZmluZSBmb3IgdjkuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3h3b3JkKTogRm9yIG51bWJlcnMsIGNhbGwgYmlnX2NvbnMuCi0JKHNwYXJjX2lwLCBtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBzb21lIHNwYXJjNjQKLQlyZWxvY2F0aW9uIHR5cGVzLgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBIYW5kbGUgOC1ieXRlIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfc3ltYm9sKTogRm9yIHY5LCB1c2UgNjQtYml0IHN5bWJvbCB0eXBlLgotCi0JKiBhcy5oICh2YWx1ZVQpOiBUeXBlZGVmIG1vdmVkIGhlcmUuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAodmFsdWVUKTogLi4uZnJvbSBoZXJlLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBMb2NhbHMgZnJvbV9hZGRyLCB0b19hZGRyLAotCXRhYmxlX2FkZHIgYXJlIG5vdyBhZGRyZXNzVC4gIFN1cHBseSBwcm90b3R5cGUgZm9yIGJmZF9hbGxvYyBmb3IKLQlub3cuCi0JKGZpeHVwX3NlZ21lbnQpOiBMb2NhbCBhZGRfbnVtYmVyIGlzIG5vdyB2YWx1ZVQuICBDb3JyZWN0IHNvbWUKLQlyYW5nZS1jaGVja2luZyBidWdzLgotCShyZWxheF9hbGlnbik6IFR5cGUgYGludCcgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIHRoZSBleHBvbmVudC4KLQkoZml4X25ldyk6IEFyZ3VtZW50IG9mZnNldCBpcyB0eXBlIG9mZnNldFQuICBMb2NhbHMgc2l6ZSBhbmQKLQluZXdzaXplIGFyZSB0eXBlIHZhbHVlVC4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBGaWVsZHMgZnhfb2Zmc2V0IGFuZCBmeF9hZGRudW1iZXIgYXJlIG5vdwotCXR5cGUgdmFsdWVULgotCShmaXhfbmV3KTogRml4IHByb3RvdHlwZS4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IFN5bWJvbCB2YWx1ZSBpcyB0eXBlIHZhbHVlVC4KLQkoU19TRVRfVkFMVUUsIFNfR0VUX1ZBTFVFKTogTGlrZXdpc2UuCi0JKFNfSVNfKik6IFNwZWNpZnkgaW50IHJldHVybiB0eXBlIGV4cGxpY2l0bHkuCi0JKiBzeW1ib2xzLmggKHN5bWJvbF9uZXcsIFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IEZpeGVkCi0JcHJvdG90eXBlcy4KLQkqIHJlYWQuYyAoc19jb21tKTogVmFsdWVzIHJlYWQgYXJlIHR5cGUgdmFsdWVULgotCSogZXhwci5oIChleHByZXNzaW9uUyk6IEZpZWxkIFhfYWRkX251bWJlciBpcyBhbiBvZmZzZXRULgotCSogdGMuaCAobWRfY3JlYXRlX2xvbmdfanVtcCwgbWRfY3JlYXRlX3Nob3J0X2p1bXAsCi0JbWRfc2VjdGlvbl9hbGlnbik6IEFkZHJlc3NlcyBhcmUgbm93IHR5cGUgYWRkcmVzc1QuCi0JKG1kX251bWJlcl90b19jaGFycywgbWRfYXBwbHlfZml4KTogUGFzcyB2YWx1ZSBhcyB2YWx1ZVQuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwKLQltZF9udW1iZXJfdG9fY2hhcnMsIG1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEluaXRpYWxpemUgYGxlbicgdmFyaWFibGUgdG8gbWFrZQotCWdjYyBzaHV0IHVwLgotCShtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwgbWRfbnVtYmVyX3RvX2NoYXJzLAotCW1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IFBlcm1pdCB1c2UgZm9yIG90aGVyIHRoYW4gYS5vdXQKLQlmb3JtYXQuCi0JKHNfY29tbW9uKTogSGFuZGxlIFNvbGFyaXMtMiB2ZXJzaW9uLgotCi0JKiBjb25maWcvaG8tZ2VuZXJpYy5oIChmcmVlKTogUmV0dXJucyB2b2lkIGlmIF9fU1REQ19fLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX2Zyb2Jfc3ltYm9sLCBlbGZfZnJvYl9maWxlLAotCWVsZl9maWxlX3N5bWJvbCk6IERlY2xhcmUuCi0KLQkqIGV4cHIuYyAoZmxvYXRpbmdfY29uc3RhbnQsIGludGVnZXJfY29uc3RhbnQpOiBOb3cgcmV0dXJuIHZvaWQuCi0KLVRodSBKdWwgIDEgMTI6MTM6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1hdGNoIG9uIHNwYXJjKi1mdWppdHN1LW5vbmUgcmF0aGVyIHRoYW4KLQlzcGFyY2xpdGUqLWZ1aml0c3Utbm9uZS4KLQotV2VkIEp1biAzMCAxMToxMjowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoY29ucyk6IENvbmRpdGlvbmFsaXplIHBhcnNpbmcgb2YgZXhwcmVzc2lvbi4gIE1vdmUKLQlwdXR0aW5nIHZhbHVlIGludG8gb2JqZWN0IGZpbGUgaW50byBzZXBhcmF0ZSBmdW5jdGlvbi4gIFNlcGFyYXRlCi0Jb3V0IE1SSSBhbmQgV0FOVF9CSVRGSUVMRFMgY2FzZXMgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMuCi0JKGVtaXRfZXhwcik6IE5ldyBmdW5jdGlvbiB0byB3cml0ZSBkYXRhIGludG8gb2JqZWN0IGZpbGUuCi0JQ29uZGl0aW9uYWxpemUgb24gVENfQ09OU19GSVhfTkVXIGFuZCBUQ19DT05TX1JFTE9DIHJhdGhlciB0aGFuIG9uCi0JcHJvY2Vzc29yIHR5cGVzLgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIGJpdGZpZWxkIGV4cHJlc3Npb25zCi0JYXMgdXNlZCBieSBpOTYwIGFzc2VtYmxlcnMuICBPbmx5IGNvbXBpbGVkIGlmCi0JQklURklFTERfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLgotCShwYXJzZV9tcmlfY29ucyk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSBNUkkgc3R5bGUgc3RyaW5ncy4gIE9ubHkKLQljb21waWxlZCBpZiBNUkkgaXMgZGVmaW5lZC4KLQkocGFyc2VfcmVwZWF0X2NvbnMpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgcmVwZWF0IGNvdW50cy4gIE9ubHkKLQljb21waWxlZCBpZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLgotCSogcmVhZC5oIChlbWl0X2V4cHIpOiBBZGRlZCBkZWNsYXJhdGlvbiBvZiBuZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtYTI5ay5oIChUQ19DT05TX1JFTE9DKTogRGVmaW5lIHRvIGJlIFJFTE9DXzMyLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gYmUgUl9SRUxXT1JELgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEpOiBOZXcgZnVuY3Rpb24gdG8KLQlwYXJzZSBhIEhQUEEgZXhwcmVzc2lvbiwgcmF0aGVyIHRoYW4gc3BlY2lhbCBjYXNlIGluIGNvbnMKLQlmdW5jdGlvbi4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBOZXcgZnVuY3Rpb24gdG8gZW1pdCBhbiBIUFBBIGZpeHVwLCByYXRoZXIKLQl0aGFuIHNwZWNpYWwgY2FzZSBpbiBlbWl0X2V4cHIgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04sIFRDX0NPTlNfRklYX05FVyk6Ci0JRGVmaW5lIHRvIHVzZSBuZXcgZnVuY3Rpb25zIGZyb20gdGMtaHBwYS5jLgotCSogY29uZmlnL3RjLWk5NjAuaCAoQklURklFTERfQ09OU19FWFBSRVNTSU9OUyk6IERlZmluZS4KLQkoV0FOVF9CSVRGSUVMRFMpOiBSZW1vdmVkOyBub3cgb2Jzb2xldGUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChjb25zX2ZpeF9uZXdfbnMzMmspOiBOZXcgZnVuY3Rpb24gdG8gZW1pdCBhbgotCU5TMzJLIGZpeHVwLCByYXRoZXIgdGhhbiBzcGVjaWFsIGNhc2UgaW4gZW1pdF9leHByIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0NPTlNfRklYX05FVyk6IERlZmluZSB0byBiZQotCWNvbnNfZml4X25ld19uczMyay4gIEFsc28gdXNlIFBBUkFNUyByYXRoZXIgdGhhbiBjaGVja2luZwotCV9fU1REQ19fLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gUkVMT0NfMzIuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZywgYWRqdXN0X3JlbG9jX3N5bXMsIHdyaXRlX2NvbnRlbnRzKToKLQlEb24ndCBjb3JlIGR1bXAgaWYgZ2FzIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCBhIHNlY3Rpb24uCi0KLVdlZCBKdW4gMzAgMDY6MjE6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBJZiBzcGFyY3Y5IGlzIGRlZmluZWQsIHJlc2V0Ci0JY3VycmVudF9hcmNoaXRlY3R1cmUgdG8gdjkgYXV0b21hdGljYWxseS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBVc2UgZWxmNjQtc3BhcmMgZm9yIHY5LgotCi0JKiBjb25maWcvdGMtc3BhcmM2NC5oLCBjb25maWcvdGMtc3BhcmM2NC5jOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFVzZSBzcGFyYzY0IGNwdSBmaWxlcyBmb3IgdjksIGFuZCBkZWZhdWx0IHRvIGVsZgotCWZvcm1hdC4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQWx3YXlzIGZ1bGx5IHByb2Nlc3MgYSBzZWN0aW9uLgotCVNlY3Rpb24gc2l6ZSBpcyBsYXN0IGZyYWcncyAodm0pYWRkcmVzcyBwbHVzIGl0cyBzaXplLiAgSWYgbm8KLQlyZWxvY2F0aW9ucyBhcmUgcHJlc2VudCwgZm9yY2UgU0VDX1JFTE9DIGZsYWcgY2xlYXIuCi0JKGR1bXBfc2VjdGlvbl9yZWxvY3MpOiBOZXcgZGVidWdnaW5nIHJvdXRpbmUuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogTmV3IHJvdXRpbmUsIGJyb2tlbiBvdXQgZnJvbSB3cml0ZV9jb250ZW50cy4KLQlEb24ndCBhZGp1c3QgcmVsb2NzIHRoYXQgYXJlIGFscmVhZHkgcmVsYXRpdmUgdG8gc2VjdGlvbiBzeW1ib2wuCi0JTG9vayBmb3Igb2JqX2ZpeF9hZGp1c3RhYmxlIG1hY3JvIHRvIGtub3cgd2hhdCBlbHNlIHRvIHNraXAsCi0JaW5zdGVhZCBvZiBvYmpfd3JpdGVfc3ltYm9sLiAgTG9vayBmb3Igc2VjdGlvbiBzeW1ib2wgc3RvcmVkIGluCi0Jc2VjdGlvbiBpbmZvcm1hdGlvbi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBNYXAgYWRqdXN0X3JlbG9jX3N5bXMgb3ZlciBhbGwgc2VjdGlvbnMuCi0JKHdyaXRlX2NvbnRlbnRzKTogQ2xlYXIgU0VDX1JFTE9DIGZsYWcgaWYgbm8gcmVsb2NhdGlvbnMgYXJlCi0JZm91bmQuCi0KLQkqIGFzLmggKF9fUFRSX1RPX0lOVCwgX19JTlRfVE9fUFRSKTogTmV3IHZlcnNpb25zIGZvciBTYWJlciwgdG8KLQlrZWVwIGl0IHF1aWV0LgotCi0JKiB3cml0ZS5jIChyZW1vdmVfc3Vic2Vncyk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQotRnJpIEp1biAyNSAxNDo0Mjo1MyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwsIGR2aSwgaW5mbywgaW5zdGFsbC1pbmZvLCBjbGVhbi1pbmZvKTogZG8gbm90Ci0JICBlY2hvIHJlY3Vyc2lvbiBsaW5lcy4KLQkgIChpbnN0YWxsLWluZm8sIGNsZWFuLWluZm8pOiBjb2xsYXBzZSBpbnRvIHRoZSBkdmkgYW5kIGluZm8gcnVsZS4KLQotRnJpIEp1biAyNSAxMDo0NzoyNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZW1vdmUgc3VwcG9ydCBmb3IgJWQvJXEgZnAgcmVncy4KLQlBbGwgZnAgcmVncyBhcmUgbm93IHNwZWNpZmllZCBhcyAlZi4KLQkocHJpdl9yZWdfdGFibGUpOiBmcHEgLT4gZnEuCi0KLUZyaSBKdW4gMjUgMDM6NDM6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGFzLmggKHN0cnN0cik6IERpc2FibGUgZGVjbGFyYXRpb24gZm9yIG5vdy4KLQkoZnByaW50X3ZhbHVlLCBzcHJpbnRfdmFsdWUpOiBEZWNsYXJlLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IFVzZSBtZW1zZXQgdG8gY2xlYXIgbmV3IGZyYWcuCi0JKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogSW5pdGlhbGl6ZSBhbGwgc2VnaW5mbyBmaWVsZHMuCi0KLQkqIGV4cHIuYyAoZXhwcl9wYXJ0KTogTWFkZSBzYW5pdHkgY2hlY2tzIGEub3V0LXNwZWNpZmljLgotCShleHByKTogRGlzYWJsZWQgc2FuaXR5IGNoZWNrcy4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSkgW0JGRF9BU1NFTUJMRVJdOiBBZGQgZmllbGQgZm9yCi0Jc2VjdGlvbiBzeW1ib2wuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBJbml0aWFsaXplIHNlY3Rpb24gc3ltYm9sIHBvaW50ZXIKLQl3aGVuIHNldHRpbmcgdXAgYSBuZXcgc2VjdGlvbi4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KSBbQkZEX0FTU0VNQkxFUl06IFBvaW50IEJGRCBzeW1ib2wncyB1ZGF0YQotCWZpZWxkIGJhY2sgYXQgZ2FzIHN5bWJvbCBzdHJ1Y3R1cmUuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDYXN0IG9ic3RhY2tfbmV4dF9mcmVlIHZhbHVlIHRvIGNoYXIqIGJlZm9yZQotCWRvaW5nIGFyaXRobWV0aWMgb24gaXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IExpa2V3aXNlLgotCSogYXMuaCAoZnJhZ19ub3dfZml4KTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9maWxlX3N5bWJvbCk6IFVzZSBzdWJzZWdfbmV3IGluc3RlYWQgb2YKLQljYWxsaW5nIGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSBkaXJlY3RseSwgYW5kIGNhbGwgc3Vic2VnX3NldAotCWluc3RlYWQgb2Ygc3Vic2VnX2NoYW5nZS4gIE5vdyByZXR1cm5zIHZvaWQuCi0JKG9ial9lbGZfd3JpdGVfc3ltYm9sKTogT25seSBjaGVjayBsb2NhbCBzeW1ib2xzIGZvciBub3cuCi0JKGVsZl9zdGFiX3N5bWJvbCk6IE5vdyBzdGF0aWMgYW5kIHZvaWQsIGFuZCBkaXNhYmxlZCB1bnRpbCBpdAotCXdvcmtzIGNvbXBsZXRlbHkuCi0JKG9ial9lbGZfc2l6ZSk6IEZvciBleHByZXNzaW9uIHZhbHVlcywgZmFpbCBzaWxlbnRseSBmb3Igbm93LgotCShvYmpfc3ltYm9sX25ld19ob29rKTogRG8gbm90aGluZy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMgotCXJlbG9jYXRpb24uCi0JKHNfbG9jYWwpIFtPQkpfRUxGXTogTmV3IGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpIFtPQkpfRUxGXTogQ2FsbCBpdCBmb3IgImxvY2FsIi4KLQkoc19jb21tb24pOiBSZWFycmFuZ2UgdG8gaGFuZGxlIFNvbGFyaXMgLmNvbW1vbiBwc2V1ZG8sIHdoaWNoIG1heQotCXNvbWV0aW1lcyB1c2UgYnNzIHNwYWNlIGluc3RlYWQgb2YgY29tbW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBBZGQgbmV3IGBsb2NhbCcgZmllbGQuCi0KLVRodSBKdW4gMjQgMTY6MzM6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHNldCBob3N0IGNvbmZpZyB0byBocHV4IGZvciBocHBhKi1ocC1ocHV4Ci0KLVRodSBKdW4gMjQgMTM6MzU6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChhcHBfcG9wLCBhcHBfcHVzaCk6IEZpeCBidWcgcmVwb3J0ZWQgYnkgQ2hyaXMgQXJ0aHVyLgotCi1UdWUgSnVuIDIyIDAxOjA0OjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBEb24ndCBzcGVjaWFsLWNhc2UgYS5vdXQgLVIgZmxhZyBoZXJlLgotCSogY29uZmlnL29iai1hb3V0LmMgKHNfc2VjdCk6IERvIGl0IGhlcmUuCi0KLQkqIGFzLmggKEJBRF9DQVNFKTogRG9uJ3QgbWFrZSBzb21lIGxhbWUgY29tcGlsZXJzIHRoaW5rIHdlIHdhbnQKLQlzdWJzdGl0dXRpb24gaW5zaWRlIHN0cmluZ3MuCi0KLQkqIGFzLmMgKHByaW50X3ZlcnNpb25faWQpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG9mZiBmcm9tIG1haW4uCi0JKG1haW4pOiBDYWxsIGl0LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BhcnNlX29wdGlvbikgW09CSl9FTEZdOiBQcmludCB2ZXJzaW9uIGlkCi0JZm9yIC1WLiAgSWdub3JlIC1RIGFuZCAtcyBvcHRpb25zIGZvciBub3cuCi0KLU1vbiBKdW4gMjEgMTc6Mzc6NTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFrZSBpbnN0YWxsYXRpb24gJiBidWlsZHMgd29yayBhZ2FpbiBmb3IgY3Jvc3NlcwotCi1TdW4gSnVuIDIwIDE4OjE4OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogUmV3cml0ZSB0byBwcmludCB3aWRlICg+MzIgYml0cykKLQlzeW1ib2wgdmFsdWVzIGNvcnJlY3RseS4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEZWxldGVkIHVudXNlZCB2YXJpYWJsZXMuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2Ugc3ByaW50X3ZhbHVlLgotCi0JKiBtZXNzYWdlcy5jIChzcHJpbnRfdmFsdWUsIGZwcmludF92YWx1ZSk6IE5ldyByb3V0aW5lcy4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3N0YWJfc3ltYm9sKTogTm93IHJldHVybnMgdm9pZC4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiBGaXggdHlwbyBpbiBsb2dpYy4KLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogTG9vayBpbiAuLi9iZmQgZm9yIGJmZC5oLgotCi0JKiBhcy5oIChhZGRyZXNzVCwgb2Zmc2V0VCk6IE5ldyB0eXBlcywgdXNpbmcgQkZEIHR5cGVzIGlmCi0JYXZhaWxhYmxlLgotCShyZWxheF9hZGRyZXNzVCwgc3RydWN0IGZyYWcpOiBVc2UgdGhlbS4KLQkqIHN0cnVjLXN5bWJvbC5oICh2YWx1ZVQsIHN0cnVjdCBicm9rZW5fd29yZCk6IExpa2V3aXNlLgotCi0JKiBhcy5oIChzdWJzZWdfbmV3KSBbQkZEX0FTU0VNQkxFUl06IE5hbWUgYXJndW1lbnQgaXMgY29uc3QuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogTmFtZSBhcmd1bWVudCBpcyBjb25zdC4KLQotVGh1IEp1biAxNyAxNjo1Mzo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2Fub25pY2FsaXplIGluc3RhbGwuc2g7IGZvciB1c2Ugd2l0aGluCi0JdGhpcyBkaXJlY3RvcnkgKGFuZCBzdWJkaXJzKQotCi1TdW4gSnVuIDIwIDAyOjM0OjA0IDE5OTMgIEFzaGxleSBTYXVsc2J1cnkgKGFuc0BzaWNzLnNlKQotCi0JKiBtODhrLW9wY29kZS5oIDogZml4ZWQgdGlueSB0aW55IG1pc3Rha2UgLSB4Y3Igd2FzIGluY29ycmVjdGx5Ci0Jc3BlY2lmaWVkLCBzaG91bGQgaGF2ZSBib3RoIFMxIGFuZCBTMiBmaWVsZHMgaWRlbnRpY2FsCi0JSWYgb25seSBmaW5kaW5nIHRoZSBwcm9ibGVtIHdhcyBhcyBmYXN0IGFzIGZpeGluZyB0aGUgYnVnICEhISEKLQotVHVlIEp1biAxNSAxNjowMTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogRG8gd3JpdGUgb3V0IG5vbi1sb2FkYWJsZSBzZWN0aW9ucy4KLQlEZWJ1ZyBzZWN0aW9ucyBjYW4gZmFsbCBpbiB0aGlzIGNhdGVnb3J5LgotCi0JKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBDYWxsIGVsZl9maWxlX3N5bWJvbCBmb3IgRUxGIGZpbGVzLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2ZpbGVfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogUmVuYW1lZCBmcm9tIHBhXy4uLiwKLQlhZGRlZCBhcmd1bWVudCB0byBzcGVjaWZ5IHNlY3Rpb24gYmFzZSBuYW1lLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IFJlbmFtZWQgZnJvbSAuLi5fc3RhYi4gIE5ldyBhcmd1bWVudAotCXNwZWNpZmllcyBzZWN0aW9uIGJhc2UgbmFtZS4KLQkob2JqX2VsZl9zdGFiKTogTmV3IGZ1bmN0aW9uLCBjYWxscyBvYmpfZWxmX3N0YWJfZ2VuZXJpYyB3aXRoCi0JIi5zdGFiIiBhcyBzZWN0aW9uIGJhc2UgbmFtZS4KLQkob2JqX2VsZl94c3RhYik6IE5ldyBmdW5jdGlvbiwgY2FsbHMgb2JqX2VsZl9zdGFiX2dlbmVyaWMuCi0JKG9ial9lbGZfdHlwZSk6IEhhbmRsZSAib2JqZWN0Ii4gIFVzZSBiaXR3aXNlLW9yIHRvIG1lcmdlIGluCi0Jc3ltYm9sIGZsYWdzIHJhdGhlciB0aGFuIHNpbXBseSByZXBsYWNpbmcsIHNvIGdsb2JhbC9sb2NhbCBmbGFncwotCWFyZSBwcmVzZXJ2ZWQuCi0JKG9ial9lbGZfaWRlbnQpOiBSZXdyaXRlLgotCi1UdWUgSnVuIDE1IDE3OjAzOjI1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydDsgdXNlIElOU1RBTExfWEZPUk0KLQotV2VkIEp1biAgOSAxMToyNjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IC5hbGlnbiB1c2VzIGEgcG93ZXIgb2YgdHdvCi0JZm9yIGFueSBhLm91dCB0YXJnZXQsIG5vdCBqdXN0IExpbnV4IGFuZCAzODZCU0QuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChET1RfTEFCRUxfUFJFRklYKTogRG8gbm90IGRlZmluZSBmb3IgYW55IGEub3V0Ci0JdGFyZ2V0LgotCi1Nb24gSnVuICA3IDEzOjMzOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW04OGsuYzogRG9uJ3QgaW5jbHVkZSBmbG9udW0uaCwgbWQuaCwgbTg4ay5oLiAgVGhleQotCWRvbid0IGV4aXN0IG9yIGR1cGxpY2F0ZSBvdGhlciBpbmNsdXNpb25zLgotCi0JKiBjb25maWcvdGMtdmF4LmggKE5PX1JFTE9DKTogRGVmaW5lLgotCi1Nb24gSnVuICA3IDA5OjU1OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEZpeCBwYXJzaW5nIG9mIGFzaSBudW1iZXIuCi0JRml4IGVycm9yIG1lc3NhZ2UuCi0KLVNhdCBKdW4gIDUgMTk6MzI6NTIgMTk5MyAgVG9yYmpvcm4gR3Jhbmx1bmQgICh0ZWdlQG5hZGEua3RoLnNlKQotCi0JKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IEFkZCA4ODExMCBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvY29uZmlnL3RjLW04OGsuYyAoZ2V0X3JlZyk6IE5ldyBhcmcgcmVnX3ByZWZpeC4gIENvbXBhcmUgZmlyc3QKLQljaGFyIHRvIHJlZ19wcmVmaXggaW5zdGVhZCBvZiB0byAncicuCi0JKGNhbGNvcCk6IENoYW5nZSBjYWxscyB0byBnZXRfcmVnLgotCShjYWxjb3ApOiBIYW5kbGUgbmV3IGNhc2UgJ3gnIHRvIHNldCByZWdfcHJlZml4LgotCShjYWxjb3ApOiBTZXQgcmVnX3ByZWZpeCB0byAncicgYWZ0ZXIgZWFjaCBjYWxsIHRvIGdldF9yZWcuCi0JKGNtcHNsb3QpOiBBZGQgODgxMTAgY29uZGl0aW9ucy4KLQotCSogZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oOiBTd2FwIGNhc2VzIGZvciAicm90IiBmb3IgY29uc2lzdGVuY3kuCi0KLQkqIGdhcy9jb25maWcvdGMtbTg4ay5jIChnZXRfYmYpOiBBbHdheXMgcmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIKLQliZWZvcmUgcmV0dXJuaW5nLgotCi0JKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IE1ha2UgZXF1YWwgbW5lbW9uaWNzCi0JYWRqYWNlbnQ7IG1vdi5zIGFuZCBtb3YuZCBzd2FwcGVkLgotCShtODhrX29wY29kZXMpOiBGaXggdHlwbyBgcjInIC0+IGAyJy4KLQotRnJpIEp1biAgNCAxNTo1OTozMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaDgzMDAuYzogU3VwcG9ydCBmb3IgSDgvMzAwLUggb3Bjb2Rlcy4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHdfc3RyaW5ncyk6IFN0cmluZyB0YWJsZSBsZW5ndGggaXMgNAotCWJ5dGVzLCBubyBtYXR0ZXIgd2hhdCB0aGUgaG9zdCBpbnQgc2l6ZSBpcy4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW9zZiopOiBOZXcuCi0KLUZyaSBKdW4gIDQgMDc6NTE6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lY29mZmwqKTogTmV3IHRhcmdldDsgdXNlIGVjb2ZmIGFuZAotCW1pcHMtbGl0LgotCShtaXBzLSotZWNvZmYqKTogQWRkZWQgdHJhaWxpbmcgJyonLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3Byb2NzKTogRm9yY2UgdGhlIGFkciBvZiB0aGUKLQlmaXJzdCBGRFIgaW4gYSBmaWxlIHRvIGJlIHplcm8uCi0KLVRodSBKdW4gIDMgMTQ6MDk6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEp1bXAgdG8gMi4xLjQuCi0KLQkqIGNvbmZpZy9oby1ocHBhYnNkLmg6IE5ldyBmaWxlLCBmcm9tIFBldGVyIEhvb2dlbmJvb20uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2Fzc2VtYmxlKTogQ2FsbCBiZmRfc2V0X2dwX3NpemUgb25seSBmb3IKLQlFQ09GRiBmb3JtYXQuCi0KLVR1ZSBKdW4gIDEgMTU6MjE6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hc3NlbWJsZSk6IFRoZSA2ODA0MCBjcHUgZG9lc24ndCB3YW50IGEKLQlzZXBhcmF0ZSAnODUxIG1tdS4KLQotCSogY29uZmlnL29iai1lbGYuYywgY29uZmlnL29iai1lbGYuaDogVXBkYXRlIGZvciBuZXcgdHlwZSwgbWFjcm8sCi0JYW5kIHJvdXRpbmUgbmFtZXMuICBBc3N1bWluZyAzMiBiaXRzIGZvciBub3cuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBMb29rIGZvciBtYWNybwotCWVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2ssIGluc3RlYWQgb2YgYXNzdW1pbmcgYSBmdW5jdGlvbgotCWFsd2F5cyBleGlzdHMuCi0JKiBjb25maWcvdGMtaHBwYS5jIChlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nX2hvb2spOiBSZW5hbWVkIGZyb20KLQl0Y19maW5hbF9wcm9jZXNzaW5nX2hvb2suCi0JKiBjb25maWcvdGMtaHBwYS5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZ19ob29rKTogVXNlIGl0LgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChlbGZfdGNfc3ltYm9sLCBlbGZfdGNfbWFrZV9zZWN0aW9ucyk6IE1hY3JvcwotCW1vdmVkIGhlcmUgZnJvbSBvYmotZWxmLmguCi0JKiBjb25maWcvb2JqLWVsZi5oOiBEb24ndCBpbmNsdWRlIENQVS1zcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0KLVN1biBNYXkgMzAgMTY6NDk6MzcgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBmYXN0LmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyYXRpb25zIHNob3VsZCBtYXRjaCBvbiAnaHBwYSonIG5vdCAnaHBwYScuCi0KLQkqIHJlYWQuYzogQWRkIHN1cHBvcnQgZm9yIEhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4IChkZW5vdGVkCi0Jd2l0aCAnI2lmZGVmIFRDX0hQUEEnKS4KLQotCSogc3ltYm9scy5jOiBBZGQgc3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXggKGRlbm90ZWQKLQl3aXRoICcjaWZkZWYgVENfSFBQQScpLgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6ICBBZGQgc3VwcG9ydCBmb3IgSFBQQS1zdHlsZQotCXJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvb2JqLWVsZi5jOiBTdGFiIHN5bWJvbHMgd2VyZW4ndCB3cml0dGVuIHByb3Blcmx5LgotCShvYmpfZWxmX3ZlcnNpb24pOgotCShvYmpfZWxmX2Rlc2MpOgotCShvYmpfZWxmX3dyaXRlX3N5bWJvbCk6Ci0JKG9ial9lbGZfd3JpdGVfc3ltYm9sX3ApOgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKToKLQkoZWxmX3N0YWJfc3ltYm9sKToKLQkoZWxmX2Zyb2JfZmlsZSk6Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFN1cHBvcnQgZm9yIEhQUEEgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucy4KLQlSZW1vdmUgc29tZSB1bnVzZWQgY29kZS4gIFN1cHBvcnQgZm9yIEhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2UKLQlzeW50YXguCi0KLQkqIGFwcC5jOgotCi0JKiBzeW1ib2xzLmM6Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmg6Ci0JKG9ial93cml0ZV9zeW1ib2wpOgotCShvYmpfZnJvYl9maWxlKToKLQkoZWxmX3RjX3N5bWJvbCk6Ci0JKGVsZl90Y19tYWtlX3NlY3Rpb25zKToKLQotCSogY29uZmlnL3RjLWhwcGEuaDoKLQotU3VuIE1heSAzMCAyMTo0NDo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcmVhZF9iZWdpbl9ob29rLCBhZGRfZmlsZSk6IEFzc3VtZQotCWhhc2hfbmV3IHdpbGwgaGF2ZSBzdWNjZWVkZWQgaWYgaXQgcmV0dXJucy4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2JlZ2luKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogTm93IG5ieXRlc19yX2xlbmd0aCBpcwotCWNvbnN0LgotCShtb2RlX2Zyb21fZGlzcF9zaXplLCBvcGNvZGVfc3VmZmljX3RvX3R5cGUpOiBOb3cgaW5saW5lIHVuZGVyCi0JZ2NjLgotCShmaXRzX2luX3tzaWduZWQsdW5zaWduZWR9X3tieXRlLHdvcmR9KTogTGlrZXdpc2UuCi0KLQkqIGV4cHIuYzogRGVsZXRlIHJlZ2lzdGVyIGRlY2xhcmF0aW9uczsgZ2NjIGlnbm9yZXMgdGhlbSBhbnl3YXlzLgotCi1GcmkgTWF5IDI4IDE5OjAzOjMyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaGFzaC5jIChoYXNoX25ldyk6IFVzZSB4bWFsbG9jLCBzaW5jZSBtYW55IGNhbGxlcnMgZG9uJ3QgY2hlY2sKLQlmb3IgZmFpbHVyZS4KLQotVGh1IE1heSAyNyAxMzowMjoxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGZyYWdzLmMgKHplcm9fYWRkcmVzc19mcmFnLCBic3NfYWRkcmVzc19mcmFnKTogVGhlc2UgYXJlCi0JZXh0ZXJuYWwuCi0KLQkqIHRjLmggKG1kX3JlbG9jX3NpemUpOiBUaGlzIGlzIGNvbnN0LgotCSogY29uZmlnL3RjLXthMjlrLGg4MzAwLGg4NTAwLGkzODYsaTg2MCxpOTYwLG02OGssbnMzMmssejhrfS5jCi0JKG1kX3JlbG9jX3NpemUpOiBOb3cgY29uc3QuCi0KLQkqIGNvbmZpZy9hb3V0X2dudS5oIChlbnVtIG1hY2hpbmVfdHlwZSwgZW51bSByZWxvY190eXBlKTogRGVsZXRlCi0JdHJhaWxpbmcgY29tbWFzLgotCSogYXMuaCAoZW51bSBfc2VnVCk6IERpdHRvLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoTl9UWVBFX3NlZyk6IFRoaXMgc2hvdWxkIGJlIGNvbnN0LgotCi1UaHUgTWF5IDI3IDExOjQzOjU5IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGFkZF9maWxlKTogQ2FzdCBmaWxlX25hbWUgdG8gY2hhciAqIGluCi0JbGlzdGluZ19zb3VyY2VfZmlsZSBjYWxsLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogQ2FzdCBmaXJzdCBhcmd1bWVudAotCW9mIHN1YnNlZ19uZXcgY2FsbCB0byBlbGltaW5hdGUgY29uc3QgYXR0cmlidXRlLgotCShvYmpfZWxmX3N0YWIpOiBEaXR0by4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IENhc3QgZmlyc3QgYXJndW1lbnQgb2YgYnplcm8gY2FsbCB0byBjaGFyICouCi0KLQkqIHJlYWQuYyAoc19hbGlnbl9ieXRlcyk6IFByb3Blcmx5IHJlY29yZCBhbGlnbm1lbnQuCi0KLQkqIGV4cHIuYyAoX18pOiBVbmRlZmluZSBfXyBtYWNybyBiZWZvcmUgdXNlLCBzaW5jZSBPU0YvMSB1c2VzIGl0Ci0JZm9yIHRoZSBwcm90b3R5cGUvbm8gcHJvdG90eXBlIG1hY3JvLgotCi0JKiBhcy5jIChnb3Rfc2lnKTogRG9uJ3QgZG8gcmV0dXJuICgoU0lHVFkpIDApLCBTSUdUWSBtaWdodCB3ZWxsIGJlCi0Jdm9pZC4KLQotCSogYXMuaCAocmVsYXhfc3RhdGVUIGVudW0pOiBEZWxldGUgdHJhaWxpbmcgY29tbWEuCi0KLVRodSBNYXkgMjcgMTE6MDc6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBMZXQgbGluZV9jb21tZW50X2NoYXJzIG92ZXJyaWRlCi0JY29tbWVudF9jaGFycy4KLQkoZG9fc2NydWJfbmV4dF9jaGFyKTogSWYgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIGlzIG5vdCBhdCB0aGUKLQlzdGFydCBvZiBhIGxpbmUsIHRyZWF0IGl0IGFzIGEgY29tbWVudCBjaGFyYWN0ZXIgaWYgaXQgaXMgb25lLgotCUZvciBhIENQUCBsaW5lIGNvbW1lbnQgdXNlIHBzZXVkby1vcCAuYXBwbGluZSByYXRoZXIgdGhhbiAubGluZS4KLQkqIGlucHV0LXNjcnViLmMgKGxvZ2ljYWxfaW5wdXRfbGluZSk6IE1ha2UgaW50IHJhdGhlciB0aGFuCi0JdW5zaWduZWQuCi0JKGlucHV0X3NjcnViX3B1c2gsIGlucHV0X3NjcnViX2JlZ2luKTogSW5pdGlhbGl6ZQotCWxvZ2ljYWxfaW5wdXRfbGluZSB0byAtMSByYXRoZXIgdGhhbiAwLgotCShidW1wX2xpbmVfY291bnRlcnMpOiBJbmNyZW1lbnQgbG9naWNhbF9pbnB1dF9saW5lLgotCShuZXdfbG9naWNhbF9saW5lKTogSWYgbGluZV9udW1iZXIgaXMgLTIsIGRlY3JlbWVudAotCWxvZ2ljYWxfaW5wdXRfbGluZS4KLQkoYXNfd2hlcmUpOiBVc2UgbG9naWNhbF9pbnB1dF9saW5lIGV2ZW4gaWYgaXQgaXMgMC4KLQkqIHJlYWQuaCAoc19hcHBfZmlsZSBwcm90b3R5cGUpOiBOb3cgdGFrZXMgYW4gaW50IGFyZ3VtZW50LgotCSogcmVhZC5jIChwb3RhYmxlKTogTWFrZSAuYXBwZmlsZSBjYWxsIHNfYXBwX2ZpbGUgd2l0aCAxLiAgTmV3Ci0JLmFwcGxpbmUgcHNldWRvLW9wIGNhbGxzIHNfYXBwX2xpbmUuCi0JKHNfYXBwX2ZpbGUpOiBJZiAuYXBwZmlsZSwgY2FsbCBuZXdfbG9naWNhbF9saW5lIHdpdGggLTIgdG8KLQlhY2NvdW50IGZvciBuZXdsaW5lIGluc2VydGVkIGJ5IGRvX3NjcnViX25leHRfY2hhci4gIElmIGxpc3RpbmcsCi0JY2FsbCBsaXN0aW5nX3NvdXJjZV9maWxlLgotCShzX2FwcF9saW5lKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBmYWtlIHBzZXVkby1vcCAuYXBwbGluZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogTWFrZSAuYXBwbGluZSBjYWxsCi0Jb2JqX2NvZmZfbG4uCi0JKG9ial9jb2ZmX2xuKTogQWRkZWQgYXJndW1lbnQgdG8gaW5kaWNhdGUgd2hldGhlciAuYXBwbGluZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfcHNldWRvX3RhYmxlKTogTWFrZSAuYXBwbGluZSBjYWxsCi0Jb2JqX2NvZmZfbG4uCi0JKG9ial9jb2ZmX2xuKTogQWRkZWQgYXJndW1lbnQgdG8gaW5kaWNhdGUgd2hldGhlciAuYXBwbGluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZmlsZSk6IFBhc3MgYXJndW1lbnQgdG8gc19hcHBfZmlsZS4KLQotVHVlIE1heSAyNSAxMTo1OTowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0dFVF9WQUxVRSk6IFJlbW92ZWQgdW5uZWNlc3NhcnkgY2FzdC4KLQotVGh1IE1heSAyMCAxOToxNDoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogU3RyYWlnaHRlbiBvdXQgY2hlY2sgZm9yCi0JaW52YWxpZCB2YWx1ZXMuCi0KLVdlZCBNYXkgMTkgMDc6MzM6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg1MDAwLmMgKGJ1aWxkX2J5dGVzKTogVW5kZXJzdGFuZCBAcmQgbW9kZSBhbmQgYnVpbGQKLQlyZWxvY2F0aW9ucyBjb3JyZWN0bHkuCi0KLU1vbiBNYXkgMTcgMTU6MDY6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogTGVhdmUgb3V0IFRFWEkyRFZJIGZvciBub3csIGJlY2F1c2UKLQlpdCdzIHdyb25nLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IEFwcGx5IHJhbmdlIGNoZWNrcyBhbmQgd2FybgotCWlmIHZhbHVlIGlzIG91dCBvZiByYW5nZS4KLQotCVBhdGNoIGZyb20gTWluaCBUcmFuLUxlOgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRm9yIGluL291dCBwb3J0IHJlZ2lzdGVyIHVzZWQKLQlhcyBiYXNlIHJlZywgaW5jbHVkZSBJbk91dFBvcnRSZWcgaW4gb3BlcmFuZCB0eXBlLgotCShNQVRDSCk6IEFjY2VwdCBvdmVybGFwIHZhbHVlIG9mIEluT3V0UG9ydFJlZy4KLQotTW9uIE1heSAxNyAwOToyOTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUsIG9ial9lY29mZl9sb2MsIG9ial9lY29mZl9zdGFiKToKLQlBZGQgY2FsbHMgdG8gbGlzdGluZyByb3V0aW5lcyB0byBwcm9kdWNlIGNvbWJpbmVkIHNvdXJjZS9hc3NlbWJsZXIKLQlsaXN0aW5ncy4KLQkob2JqX2Vjb2ZmX3N0YWIpOiBDcmVhdGUgYSBmaWxlIHBvaW50ZXIgaWYgbm9uZSB1c2VkIHlldC4KLQkoZWNvZmZfZnJvYl9maWxlKTogU2V0IHN5bWNvdW50IHRvIGNvcnJlY3QgdmFsdWUuCi0KLUZyaSBNYXkgMTQgMDY6NTM6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byB2ZXJzaW9uIDIuMSwgaW4gcHJlcGFyYXRpb24gZm9yCi0JcmVsZWFzZS4KLQotCSogY29uZmlnL29iai1hb3V0LmggKEhfR0VUX0hFQURFUl9TSVpFLCBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSk6Ci0JRGVmaW5lIGluIHRlcm1zIG9mIGNvbnN0YW50cywgbm90IEMgc3RydWN0dXJlIHNpemVzLgotCi0JKiBjb25maWcvdGMtcnM2MDAwLmMsIGNvbmZpZy90Yy1yczYwMDAuaDogRGVsZXRlIGVtcHR5IGZpbGVzLgotCi1UaHUgTWF5IDEzIDE3OjAxOjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9oZWFkZXJfYXBwZW5kKTogRG9uJ3QgZGVmaW5lIGlmIGl0J3MKLQlkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKiBjb25maWcvb2JqLWhwMzAwLmggKG9ial9oZWFkZXJfYXBwZW5kKTogRGVmaW5lIGl0IGFzIGEgbWFjcm8uCi0JKiBjb25maWcvb2JqLWhwMzAwLmMgKGhwMzAwX2hlYWRlcl9hcHBlbmQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCBib3RoZXIgY2xlYW5pbmcgdXAgZG9jIGZpbGVzOwotCXRoZXkgYXJlbid0IGdvaW5nIHRvIGJlIGluIHRoaXMgZGlyZWN0b3J5LgotCi1UaHUgTWF5IDEzIDA3OjUxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIGFic29sdXRlCi0Jc3ltYm9scy4KLQotCSogdGMuaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IERvbid0IGRlZmluZSBoZXJlLgotCSogY29uZmlnL3RjLXNoLmggKFRDX0NPRkZfU0laRU1BQ0hERVApOiBEZWZpbmUgaGVyZSBpbnN0ZWFkLgotCi1Nb24gTWF5IDEwIDA2OjAxOjEyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfU3ltYm9sX3R5cGVfbGlzdCk6IERvbid0IGJvdGhlciB3aXRoCi0JaW5pdGlhbGl6YXRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0cyk6IFRyZWF0IG02OCotKi1zeXN2KiBsaWtlIG02OGstKi1jb2ZmLgotCi1XZWQgTWF5ICA1IDE0OjAwOjQ5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBDb3JyZWN0IGZsb2F0aW5nIHBvaW50IGRvdWJsZSB3b3JkCi0JbG9hZHMgYW5kIHN0b3JlcyBmb3IgYmlnIGVuZGlhbiB0YXJnZXQuCi0KLVdlZCBNYXkgIDUgMDg6Mzk6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJlcGxhY2UgU0VHXyogd2l0aCAqX3NlY3Rpb24sIGZpeCB1cCBzdWJzZWdfKgotCWNhbGxzLiAgRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLgotCSogY29uZmlnL29iai1jb2ZmLmM6IExpa2V3aXNlLgotCi0JRUxGIHN1cHBvcnQsIG1vc3RseSBjb250cmlidXRlZCBieSBVdGFoOgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3N0YWIsIG9ial9lbGZfbGluZSwKLQlvYmpfZWxmX3R5cGUpOiBSZXdyaXRlLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sLCBlbGZfc3RhYl9zeW1ib2xfc3RyaW5nLCBlbGZfc3RhYl9zeW1ib2wsCi0Jb2JqX2VsZl9kZXNjLCBvYmpfZWxmX3ZlcnNpb24sIG9ial9zeW1ib2xfbmV3X2hvb2ssIG9ial9lbGZfc2l6ZSk6Ci0JTmV3IGZ1bmN0aW9ucy4KLQkob2JqX2VsZl9pZGVudCk6IER1bW15LgotCSogY29uZmlnL29iai1lbGYuaCAoRkFMU0UsIFRSVUUsIFNfKiwgdGNfZnJvYl9zeW1ib2wsCi0JVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBOZXcgbWFjcm9zLgotCShnZGJfc2VjdGlvbik6IE5ldyB2YXJpYWJsZSBkZWNsLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hdG9mKTogUmV0dXJuIHplcm8sIG5vdCBlbXB0eSBzdHJpbmcsIG9uCi0Jc3VjY2Vzcy4KLQotCUJGRF9BU1NFTUJMRVIgY29uZGl0aW9uYWwgY2hhbmdlczoKLQkqIGNvbmZpZy9vYmotY29mZi5jIChsaW5lbm9fcm9vdFAsIHNlZ19OX1RZUEUsICpfc2VjdGlvbl9oZWFkZXIpOgotCURvbid0IGRlZmluZSB0aGVzZS4KLQkoU0FfU0VUX1NZTV9FTkRORFgsIFNBX1NFVF9TWU1fVEFHTkRYKTogTmV3IGZ1bmN0aW9ucy4KLQkoZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uKTogRGl0dG8uCi0JKG9ial9jb2ZmX2VuZGVmKTogQ2FsbCBmZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24uCi0JKHN0cnVjdCBsaW5lX25vKTogTmV3IHR5cGUuCi0JKGNfc3ltYm9sX21lcmdlKTogTmV3IHdheSBmb3IgY29weWluZyBhdXggZmllbGRzLgotCShjX2RvdF9maWxlX3N5bWJvbCk6IFB1dCBzeW1ib2wgaW4gYWJzb2x1dGUgc2VjdGlvbiwgYW5kIHNldCBmbGFnCi0JQlNGX0RFQlVHR0lORy4KLQkoZnVuY3Rpb25fbGluZW9mZik6IE5ldyBzeW1ib2wuCi0JKGZ1bmN0aW9uX2xpbmVvZmYsIHRleHRfbGluZW5vX251bWJlciwgb3VyX2xpbmVub19udW1iZXIsCi0JbGluZW5vX2xhc3RQKTogRG9uJ3QgZGVmaW5lLgotCShjX2xpbmVfbmV3KTogRG9uJ3QgZGVmaW5lLgotCShvYmpfZW1pdF9saW5lbm8sIG9ial9jb2ZmX2VuZGVmKTogVXNlIGFib3J0IGNhbGxzIGFzLCB1aCwKLQlwbGFjZWhvbGRlcnMsIHVudGlsCi0JbGluZS1udW1iZXIgcmVjb3JkaW5nIGdldHMgaW1wbGVtZW50ZWQuCi0JKG9ial9uZXdfc3ltYm9sX2hvb2spOiBOZXcgY29kZSBmb3IgaGFuZGxpbmcgYXV4IGZpZWxkcy4KLQkoYWRkX2xpbmVubywgYWRkX2xpbmVzeW0pOiBOZXcgZnVuY3Rpb25zLgotCShvYmpfY29mZl9sbik6IENhbGwgYWRkX2xpbmVubywgbm90IGNfbGluZV9uZXcuCi0JKG9ial9jb2ZmX2VuZGVmKTogTmV3IGNvZGUgZm9yIGhhbmRsaW5nIHN5bWJvbCBuYW1lcy4gIE5ldyBsaW5lbm8KLQljb2RlLiAgTG9vayBmb3Igc2VjdGlvbiBuYW1lICIqREVCVUcqIiBmb3IgZGVidWdnaW5nIHNlY3Rpb24uCi0JKGFsaWduLCBjb2ZmX2NoZWNrX2ZpbGVfc3ltYm9scywgb2JqX2NvZmZfc2VjdGlvbiwKLQljb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogUmVvcmRlcmVkIHNvbWUgaW5jbHVkZXMuCi0JKEJZVEVfT1JERVJJTkcsIEZJTEVfSEVBREVSX01BR0lDLCBzZWdfTl9UWVBFLCBOX1RZUEVfc2VnLAotCURFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSwgQU9VVEhEUiwgQU9VVEhEUlNJWkUpOiBEb24ndAotCWRlZmluZSB0aGVzZS4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMsIEk5NjBfU1lNX0ZJRUxEUyk6IE5ldyBtYWNyb3MuCi0JKFNZTV9BVVhFTlQpOiBOZXcgbWFjcm8gKGZvciBub24tQkZEX0FTU0VNQkxFUiB0b28pIGZvciBhY2Nlc3NpbmcKLQlhdXggZW50cmllcy4gIE1vc3QgU0FfKiBtYWNyb3Mgbm93IHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkuCi0JKFNfKik6IFVzZSBgYnN5bScgZmllbGQsIGFuZCBhY2Nlc3MgQkZEIHByaXZhdGUgZGF0YS4KLQkoU0ZfKik6IFVzZSBgc3lfZmxhZ3MnIHN5bWJvbCBmaWVsZCBmb3IgbW9zdCBvZiB0aGVzZS4KLQkoSF8qLCBvYmplY3RfaGVhZGVycywgbGluZW5vLCBsaW5lbm9fKlAsIE9CSl9FTUlUX0xJTkVOTyk6IERvbid0Ci0JZGVmaW5lLgotCSgqX3NlY3Rpb25faGVhZGVyKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOiBDaGFuZ2VkCi0JaW50ZXJmYWNlLgotCSh0Y19nZW5fcmVsb2MpIFtJMzg2Q09GRl06IE5ldyBmdW5jdGlvbi4KLQkodGNfYW91dF9maXhfdG9fY2hhcnMsIHRjX2NvZmZfZml4MnJ0eXBlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0FSQ0gsIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogTmV3Ci0JbWFjcm9zLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc3RhY2tfaW5pdCk6IERvbid0IGRvIGFzc2lnbm1lbnRzIGluc2lkZQotCWNvbmRpdGlvbnMuCi0JKG9ial9jb2ZmX2RlZik6IFNpbXBsaWZpZWQgaGFuZGxpbmcgb2Ygc3ltYm9sIG5hbWUgYSBiaXQuCi0JKHRhZ19pbnNlcnQpOiBOYW1lIGFyZ3VtZW50IGlzIG5vdyBwb2ludGVyIHRvIENPTlNULgotCShvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogQ29tbWVudGVkIG91dC4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IFVzZSBQQVJBTVMgbWFjcm8gaW4gcHJvdG90eXBlcy4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKSBbQkZEX0FTU0VNQkxFUl06IERvbid0IGluZGlyZWN0Ci0JdGhyb3VnaCBmcmNoYWluUCBwb2ludGVyIGlmIGl0IGlzIG51bGwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogV2FybiBpZiBCRkQgbW9kZSBpcyBleHBsaWNpdGx5IHR1cm5lZCBvZmYgYnV0IGlzCi0JcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHRhcmdldC4KLQkobWlwcyBlY29mZiB0YXJnZXRzKTogRG9uJ3QgbmVlZCB0byBzZXQgYmZkX2dhcyBoZXJlOyBpdCBnZXRzCi0JdGFrZW4gY2FyZSBvZiBsYXRlci4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGNyYXdsX3N5bWJvbHMpOiBEb24ndCBjbGVhciBzeV9mb3J3YXJkCi0JZmllbGQuCi0JKHlhbmtfc3ltYm9scyk6IE1lcmdlIHN5bWJvbHMgb25seSBpZiBzeV9mb3J3YXJkIGlzIG51bGwuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKEFPVVRfTUFDSFRZUEUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeQotCWRlZmluZWQuCi0KLQkqIHRjLmggKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBTZWN0aW9uIGFyZyBpcyBub3QKLQlwb2ludGVyLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKSBbQkZEX0FTU0VNQkxFUl06IERpdHRvLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpIFtPQkpfRUxGXTogQW55dGhpbmcgc3RhcnRpbmcKLQl3aXRoICIuIiBpcyBhIGxvY2FsIGxhYmVsLgotCi0JKiBjb25maWcvdGUtaHBwYS5oLCBjb25maWcvdGMtaHBwYS5oLCBjb25maWcvdGMtaHBwYS5jOiBOZXcgY29uZmlnCi0JZmlsZXMuCi0KLQkqIGNvbmZpZy90ZS1saW51eC5oLCBjb25maWcvdGUtMzg2YnNkLmg6IE5ldyBjb25maWcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1saW51eCwgaTM4Ni0qLWJzZCk6IFVzZSB0aGVtLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBmb3JtYXQgYmFzZWQgb24gdGFyZ2V0Ci0JZW52aXJvbm1lbnQuCi0JKERPVF9MQUJFTF9QUkVGSVgpOiBEb24ndCBkZWZpbmUgZm9yIDM4NmJzZCBvciBMaW51eC4KLQotV2VkIE1heSAgNSAxMzoxNDowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoaW5pdF9maWxlKTogU2V0IGZNZXJnZSB0byAwIHNpbmNlIGRieCBzZWVtcwotCXRvIHdhbnQgaXQgdGhhdCB3YXkuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBUdXJuIGxvY2FsIHN0X1Byb2Mgc3ltYm9scyBpbnRvCi0Jc3RfU3RhdGljUHJvYyBzeW1ib2xzLiAgU2V0IGluZGV4IGZpZWxkIG9mIGV4dGVybmFsIHN0X1Byb2MgYW5kCi0Jc3Rfc3RhdGljUHJvYyBzeW1ib2xzIGNvcnJlY3RseS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKE5PX0xJU1RJTkcpOiBEb24ndCBkZWZpbmUuICBQZW9wbGUgbWlnaHQgd2FudAotCWxpc3RpbmdzLgotCi1UdWUgTWF5ICA0IDIxOjIyOjU0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1ocDMwMC5oLCBjb25maWcvb2JqLWhwMzAwLmMsIGNvbmZpZy90ZS1ocDMwMC5oOiBOZXcKLQlmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWhwdXgpOiBVc2UgdGhlbS4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9wcmVfd3JpdGVfaG9vayk6IFVzZSBBT1VUX1ZFUlNJT04gaWYKLQlkZWZpbmVkLCBvdGhlcndpc2UgemVyby4KLQotCSogY29uZmlnL2FvdXRfZ251LmggKE9NQUdJQyk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLU1vbiBNYXkgIDMgMTU6NTk6MzIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IGFueSBhYnMgZXhwcmVzc2lvbiBhcyBhbgotCWFkZHJlc3Mgc3BhY2UgbnVtYmVyLgotCi1XZWQgQXByIDI4IDE5OjExOjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoVEFSR0VUX0RFRkFVTFQpOiBEb24ndCBkZWZhdWx0IHRoaXMgYXQgYWxsLgotCi0JKiBjb25maWcvdGMtYTI5ay5jOiBJbmNsdWRlIGN0eXBlLmguCi0JKGRlZmluZV9zb21lX3JlZ3MpOiBBZGRlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXJzIGZvciAyOTA1MC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoY29tbWVudF9jaGFycykgW1RFX0kzODZBSVhdOiBJbmNsdWRlICIvIi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBTVFlQX1JFRyBoZXJlLgotCShjaGFuZ2VfdG9fc2VjdGlvbik6IFNldCBpdCBoZXJlIGluc3RlYWQuCi0KLVdlZCBBcHIgMjggMTM6NDA6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogTWFrZSB1cCBhIC5maWxlIGlmIG9uZQotCWhhc24ndCBiZWVuIHNlZW4geWV0LgotCShhZGRfZWNvZmZfc3ltYm9sKTogRG9uJ3QgcmVmZXIgdG8gY3VyX2ZpbGVfcHRyIGlmIGl0IGlzIE5VTEwuCi0KLU1vbiBBcHIgMjYgMTg6Mjk6MDUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jaCwgY29uZmlnL3RjLXNoLmg6IE5ldyBmaWxlcyBzdXBwb3J0aW5nIEhpdGFjaGkKLQlTSC4KLQotTW9uIEFwciAyNiAxMjoyODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEZpeCB1bmFyeSBwbHVzIG9wZXJhdG9yIChwcmV2aW91c2x5IHdhcyB0aGUKLQlzYW1lIGFzICd+JyBvcGVyYXRvciEpLgotCi1XZWQgQXByIDIxIDAwOjIwOjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IERlZmluZSBldmVuIGlmIEJGRCBpcyBkZWZpbmVkLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvIGRlZmluZSBpZiBCRkRfQVNTRU1CTEVSLiAgSW52b2tlCi0Jb2JqX2NoZWNrX2ZpbGVfc3ltYm9scyBpZiBkZWZpbmVkLiAgQ2FsbCB2ZXJpZnlfc3ltYm9sX2NoYWluXzIKLQlpbnN0ZWFkIG9mIG9wZW4tY29kaW5nIGl0LiAgRml4IHNvbWUgYnVncyBpbiBwYXRjaGluZyB1cCBzeW1ib2wKLQljaGFpbi4KLQkocmVsYXhfc2VnbWVudCk6IE1ha2Ugc29tZSBjb2RlIHdlICJvdWdodCB0byBiZSBhYmxlIHRvIiB1c2UgZm9yCi0JYWxsIHRhcmdldHMgbm8gbG9uZ2VyIGNvbmRpdGlvbmFsaXplZCBvbiBuczMyayB0YXJnZXQ7IGluc3RlYWQsIGRvCi0JaXQgYWx3YXlzLCBhbmQgaWYgdGhlIGFwcHJvcHJpYXRlIGNvbmRpdGlvbnMgZmFpbCwgYWJvcnQuCi0KLQkqIHN5bWJvbHMuYyAoREVCVUcpOiBFbmFibGVkLgotCShzeW1ib2xfbmV3KTogTWFrZSBzdXJlIGJmZF9tYWtlX2VtcHR5X3N5bWJvbCB3b3Jrcy4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogTmV3IGZ1bmN0aW9uOyB0YWtlcyBvbmUgc3ltYm9sIGFzCi0JYXJndW1lbnQsIGFueXdoZXJlIGluIHRoZSBjaGFpbi4KLQkoZG9sbGFyX2xhYmVsKik6IFVzZSBkZWZhdWx0IGluaXRpYWxpemVycy4KLQotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ2FsbCBtZF9iZWdpbiBoZXJlLi4uCi0JKG1haW4pOiAuLi5hbmQgbm90IGhlcmUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBVc2UgYS5vdXQtc3Vub3MtYmlnIGZvciBhLm91dC4KLQkodGNfZnJvYl9zeW1ib2wpOiBOZXcgbWFjcm86IEdldCByaWQgb2Ygc3ltYm9scyBpbiByZWdfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAob21hZ2ljKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShhZGRfZml4LCBhZGRfZnJhZyk6IE5vdyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBtYWNyb3MuCi0JKG02OGtfcmVnX3BhcnNlLCBtNjhrX2lwLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgZ2V0X251bSwKLQlzX2RhdGExLCBzX2RhdGEyLCBzX2Jzcyk6IFVzZSBuZXcgKl9zZWN0aW9uIG5hbWVzLCBmb3IKLQljb21wYXRpYmlsaXR5IHdpdGggQkZEX0FTU0VNQkxFUiBtb2RlOyByZXdyaXRlIHN3aXRjaCBzdGF0ZW1lbnRzCi0JdG8gaGFuZGxlIG5vbi1pbnRlZ3JhbCBzZWdULgotCSh0Y19jb2ZmX2ZpeDJydHlwZSwgdGNfYW91dF9maXhfdG9fY2hhcnMsCi0JdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCSh0Y19nZW5fcmVsb2MpOiBOZXcgcm91dGluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQkobWRfYXBwbHlfZml4LCBtZF9hcHBseV9maXhfMik6IFJlbmFtZWQgb2xkIG1kX2FwcGx5X2ZpeCB0bwotCW1kX2FwcGx5X2ZpeF8yOyBuZXcgbWRfYXBwbHlfZml4IGRlZmluaXRpb24gdmFyaWVzIGludGVyZmFjZQotCWRlcGVuZGluZyBvbiBCRkRfQVNTRU1CTEVSLgotCShtZF9jb252ZXJ0X2ZyYWcsIG1kX2NvbnZlcnRfZnJhZ18xKTogTGlrZXdpc2UuICBVc2UgbmV3ICpfc2VjdGlvbgotCW5hbWVzLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCSh2ZXJzaW9uX3N0cmluZyk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogVXNlIEdBU19WRVJTSU9OIGluc3RlYWQuCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZik6IE5ldyBmdW5jdGlvbiwgdGFrZW4gZnJvbSBWTVMgY29kZSBpbgotCXN5bWJvbHMuYy4KLQkoX2RvcHJudCk6IERlbGV0ZWQuCi0JKFZNU19TdG9yZV9TdHJ1Y3QsIFZNU19EZWZfU3RydWN0LCBWTVNfU2V0X1N0cnVjdCwKLQlWTVNfVEJUX0Jsb2NrX0VuZCwgZ2V0X1ZNU190aW1lX29uX3VuaXgsIGdlbmVyYXRlX3N1ZmZpeCwKLQlWTVNfUHNlY3RfU3BlYyk6IEZpeGVkIHRvIGNvbXBpbGUgdW5kZXIgdHJhZGl0aW9uYWwgQy4KLQkqIGNvbmZpZy9vYmotdm1zLmg6IFVzZSBQQVJBTVMgbWFjcm8uCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZik6IERlY2xhcmUuCi0JKFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTik6IE5ldyBtYWNyby4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBSZW1vdmUgc29tZSBWTVMtc3BlY2lmaWMgY29kZSwgbG9vayBmb3IKLQlSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04gbWFjcm8gaW5zdGVhZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IERvbid0IHRyeSBleHBhbmRpbmcgREJjYwotCWluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLWkzODYuYzogUmVvcmRlcmVkIHNvbWUgZnVuY3Rpb25zIHNvIGlubGluaW5nIG1pZ2h0Ci0Jd29yay4gIFVzZSBQQVJBTVMgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCShyZWxvYyk6IE5ldyByb3V0aW5lLgotCShtZF9hc3NlbWJsZSk6IFJlYXJyYW5nZSBzd2l0Y2ggc3RhdGVtZW50cyB0byB3b3JrIHdpdGgKLQlub24taW50ZWdyYWwgc2VnVC4KLQotCSogc3RydWMtc3ltYm9sLmggW0JGRF9BU1NFTUJMRVJdOiBVbmRlZmluZQotCVNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgYmVmb3JlIGRlZmluaW5nIGl0LgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IE5vdyBzdGF0aWMuCi0KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IEJldHRlciBlcnJvciBtZXNzYWdlIGZvciBkaWZmZXJlbmNlIG9mCi0Jc3ltYm9scyBpbiBkaWZmZXJlbnQgZnJhZ3MuCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFBhc3MgZG93biBzb21lIG5ldyB2YXJpYWJsZXMsIGluZGljYXRpbmcKLQlwYXRobmFtZSBvciBwcm9ncmFtIG5hbWUgZm9yIGNjLCBubSwgb2JqZHVtcC4KLQotCSogYXMuaCAoT1VUUFVUX0ZMQVZPUik6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBVc2UgT1VUUFVUX0ZMQVZPUi4KLQotCSogY29uZmlndXJlLmluOiBJbml0aWFsaXplIGJmZF9nYXMgcHJvcGVybHkuICBXYXJuIHRoYXQgRUxGCi0Jc3VwcG9ydCBpcyBpbmNvbXBsZXRlLgotCi1UaHUgQXByIDE1IDIyOjM5OjA1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChmbG9hdF9jb25zKTogQWNjZXB0IG51bGwgcG9pbnRlciByZXR1cm4gZnJvbSBtZF9hdG9mLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXRvZik6IFJldHVybiBudWxsIGZvciBzdWNjZXNzLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2F0b2YpOiBEaXR0by4KLQotVGh1IEFwciAxNSAxNjowNDozOSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMudGV4aW5mbzogZm9ybWF0dGluZyBhbmQgY29tbWVudCBjbGVhbnVwczsgc2hvdyBTUEFSQwotCWFsdGVybmF0aXZlIG9wdGlvbnMgaW4gc2FtZSBzdHlsZSBhcyBvdGhlciBtYWNoaW5lczsgc2ltcGxpZnkgc29tZQotCWNvbmRpdGlvbmFsIHVzZTsgaW5jbHVkZSBHUEwgYXMgc2VwYXJhdGUgZmlsZSAoZnJvbSB0ZXhpbmZvIGRpcikKLQotCSogZG9jL01ha2VmaWxlLmluOiAoYXMuaW5mbykgaW5jbHVkZSBkaXJlY3RvcnkgY29udGFpbmluZyBHUEwgaW4KLQltYWtlaW5mbyBzZWFyY2ggcGF0aAotCi0JKiBkb2MvaDgudGV4aTogbmV3IGZpbGU7IGNvbmRpdGlvbmFsIHNldHRpbmdzIGZvciBHQVMgbWFudWFsCi0Jb24gSGl0YWNoaSBjaGlwcwotCi1UdWUgQXByIDEzIDE1OjMxOjQwIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBtZW50aW9uIFNQQVJDIGFyY2hpdGVjdHVyZSBvcHRpb25zLgotCi1GcmkgQXByICA5IDE3OjQzOjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlYXJyYW5nZWQgd2hpdGVzcGFjZSBpbiBwZXItaG9zdC9wZXItdGFyZ2V0Ci0Jc2VjdGlvbnMuICBBZGRlZCBob29rcyBmb3IgZHJvcHBpbmcgaW4gSFBQQSBzdXBwb3J0IChub3QgaW5jbHVkZWQKLQl5ZXQpLiAgU2VwYXJhdGUgb3V0IG92ZXJyaWRlcyBvZiB2YXJpYWJsZXMgYmFzZWQgb24gdGFyZ2V0IGZvcm1hdAotCWFuZCBiZmQtZ2FzIHNlbGVjdGlvbiBmcm9tIGFjdHVhbCB0YXJnZXQtc3BlY2lmaWMgY29tbWFuZHMuICBBZGQKLQllcnJvciBtZXNzYWdlIGZvciByZWNvZ25pemVkIGJ1dCB1bnN1cHBvcnRlZCBmb3JtYXQgbmFtZS4KLQotRnJpIEFwciAgOSAwOTowNTo0NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoZWNvZmZfYnVpbGRfbGluZW5vKTogTWFrZSBpbGluZU1heCBpbgotCXN5bWJvbGljIGhlYWRlciBtYXRjaCBjbGluZSBpbiBGRFI7IHRoZSBuYXRpdmUgbGlua2VyIHNlZW1zIHRvCi0Jd2FudCB0aGF0LgotCi1UaHUgQXByICA4IDE1OjUxOjI4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluOiBhcy50ZXhpbmZvIGlzIGluICQoc3JjZGlyKS4gIFVzZQotCSQoc3JjZGlyKS9hcy50ZXhpbmZvIGV4cGxpY2l0bHkgaW4gc2V2ZXJhbCBwbGFjZXMKLQotVGh1IEFwciAgOCAxNToxNTowMiAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVwZGF0ZSBkdmksIGNsZWFuIHRhcmdldHMgZm9yIG5ldyBzb3VyY2UKLQkJCSAgIGZpbGUgc3RydWN0dXJlCi0KLVRodSBBcHIgIDggMTI6NTI6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tZGVjc3RhdG4uaDogRGVmaW5lIEJST0tFTl9BU1NFUlQgaWYgbm90IF9fR05VQ19fLAotCXJhdGhlciB0aGFuIHVuZGVmaW5pbmcga25vdy4KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggdWx0cml4Kiwgbm90IGp1c3QgdWx0cml4LgotCi1XZWQgQXByICA3IDIwOjE4OjEwIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBjb252ZXJ0ZWQgY29uZGl0aW9uYWwgbWFya3VwIHRvIHVzZSBuZXcKLQlUZXhpbmZvIGZhY2lsaXRpZXMsIGF2b2lkaW5nIG00LgotCi0JKiBkb2MvYXMtYWxsLnRleGluZm8sIGFsbC5tNCwgcHJldGV4Lm00OiBkZWxldGVkLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHJlY2FzdCBkb2MgY29uZmlndXJhdGlvbiB0byB1c2UgYSBsaW5rIHRvIGFuCi0JaW5jbHVkZWQgdGV4aW5mbyBmaWxlLgotCi0JKiBkb2MvYWxsLnRleGk6IHNldHRpbmdzIGZvciBnZW5lcmljIGZvcm0gb2YgZG9jdW1lbnRhdGlvbi4KLQotVHVlIEFwciAgNiAxMTo1NjoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoY29ucyk6IFplcm8gb3V0IGZyYWcgd2hlbiBjcmVhdGluZyByZWxvYy4KLQotTW9uIEFwciAgNSAwOTo0MTo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGdwX3JlZmVyZW5jZSk6IENlcnRhaW4gbWFnaWMgc3ltYm9scyBjYW4gbmV2ZXIKLQliZSByZWZlcmVuY2VkIG9mZiB0aGUgR1AgcmVnaXN0ZXIuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBIYW5kbGUgc3RhdGVzIDkgYW5kIDEwIGNvcnJlY3RseQotCXdoZW4gZGVhbGluZyB3aXRoIGNoYXJhY3RlcnMgb2YgdHlwZSBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVCwKLQlMRVhfSVNfU1RSSU5HUVVPVEUsIGFuZCBMRVhfSVNfT05FQ0hBUl9RVU9URS4KLQotCSogY29uZmlnL3RlLWlyaXguaDogTmV3IGZpbGU7IGlyaXggbmVlZHMgYSBkaWZmZXJlbnQgTE9DQUxfTEFCRUwKLQlkZWZpbml0aW9uIGZyb20gb3RoZXIgTUlQUyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChtaXBzLSotaXJpeCk6IFVzZSBlbXVsYXRpb24gaXJpeC4KLQotU3VuIEFwciAgNCAxNToyMTowOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4NTAwLmM6IEdldCByZWxheCBzaXplIG9mIGJyYW5jaCBpbnN0cnVjdGlvbnMgcmlnaHQsCi0JKGdldF9vcGVyYW5kKTogUGFyc2UgQHNwKyBjb3JyZWN0bHkuCi0KLUZyaSBBcHIgIDIgMTU6NTk6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKSBbQkZEX0FTU0VNQkxFUl06IERvbid0IGluY2x1ZGUKLQlDT0ZGIHNlY3Rpb24gaGVhZGVyIGZpZWxkLgotCi0JKiBjb25maWd1cmUuaW46IFByaW50IGVycm9yIG1lc3NhZ2UgaWYgaG9zdCBvciB0YXJnZXQgaXMgbm90Ci0Jc3VwcG9ydGVkLgotCi0JKiBjb25maWd1cmUuaW46IElmIHdpdGgtYmZkLWFzc2VtYmxlciwgdXNlIG9iai1jb2ZmIGluc3RlYWQgb2YKLQlvYmotY29mZmJmZC4KLQotCSogY29uZmlnL2hvLWdlbmVyaWMuaDogSW5jbHVkZSBzdHJpbmcuaC4KLQotRnJpIEFwciAgMiAwODo1NDo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMKTogVHJlYXQgYW55IGxhYmVsIHN0YXJ0aW5nIHdpdGgKLQknJCcgYXMgbG9jYWwsIGZvciBhbnkgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IE9wdGltaXphdGlvbnMgdG8gYnJhbmNoaW5nIGNvZGUgYW5kIGEKLQljb3VwbGUgb2YgYnVnIGZpeGVzIGZyb20gcmFscGhjQHB5cnBzNS5lbmcucHlyYW1pZC5jb20gKFJhbHBoCi0JQ2FtcGJlbGwpLgotCi0JKiBjb25maWcvaG8taXJpeC5oOiBOZXcgZmlsZTsgaWYgbm90IGdjYywgZGVmaW5lIEJST0tFTl9BU1NFUlQuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXgqKTogU2V0IGdhc19ob3N0IHRvIGlyaXguCi0KLVdlZCBNYXIgMzEgMTc6NTM6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBTZXQgb3V0cHV0X3NlY3Rpb24gb2YgbmV3IHNlY3Rpb24uCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtbHlfcGFzcyk6IERvbid0IHNldCBvdXRwdXRfc2VjdGlvbiBoZXJlLgotCSogZXhwci5jIChleHByX3BhcnQsIGV4cHIpOiBUdXJuIG9mZiBzZWN0aW9uIGFzc2VydGlvbnMgZm9yIEVDT0ZGLAotCXNpbmNlIGl0IGhhcyBhZGRpdGlvbmFsIHNlY3Rpb25zLgotCSogcmVhZC5jIChzX2xjb21tKTogRm9yIE1JUFMgRUNPRkYsIHB1dCBzbWFsbCBvYmplY3RzIGluIC5zYnNzLAotCW5vdCBic3Nfc2VjdGlvbi4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBBZGRlZAotCWVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IEluaXRpYWxpemUKLQllY29mZl91bmRlZmluZWQgZmllbGQuCi0JKGFkZF9maWxlKTogSWYgdXNpbmcgc3RhYnMsIGp1c3Qgb3V0cHV0IGEgc3RhYnMgc3ltYm9sIHJhdGhlciB0aGFuCi0JY3JlYXRpbmcgYSBuZXcgZmRyLgotCShvYmpfZWNvZmZfYmVnaW4sIG9ial9lY29mZl9iZW5kKTogSWdub3JlIGxpbmUgbnVtYmVyIGJ5IHJlYWRpbmcKLQlpdCB3aXRoIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uLCByYXRoZXIgdGhhbiBza2lwcGluZyBpdCBieSBoYW5kLgotCShvYmpfZWNvZmZfbG9jKTogSWYgdXNpbmcgc3RhYnMsIGp1c3Qgb3V0cHV0IGEgc3RhYnMgc3ltYm9sIHJhdGhlcgotCXRoYW4gRUNPRkYgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi0JKG9ial9lY29mZl9zdGFiKTogQWNjZXB0IG5vbi16ZXJvIHZhbHVlcyBmb3Igc3RhYnMgbGluZSBudW1iZXIuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBTZXQgaWZpbGVzeW0gY29ycmVjdGx5LiAgU2V0IHN0b3JhZ2UgY2xhc3MKLQl0byBzbWFsbCwgdW5kZWZpbmVkIGFuZC9vciByZWFkb25seSBzZWN0aW9ucyBpZiBhcHByb3ByaWF0ZS4KLQlEb24ndCBvdXRwdXQgc3ltYm9sIG5hbWVzIGNvbnRhaW5pbmcgXDAwMSBjaGFyYWN0ZXJzLgotCShlY29mZl9mcm9iX2ZpbGUpOiBNYWtlIHN1cmUgYXQgbGVhc3Qgb25lIGZkciBpcyBvdXRwdXQuCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgVENfTUlQUy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGdfc3dpdGNoX3ZhbHVlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYXNzZW1ibGUpOiBTZXQgZ3Agc2l6ZSBvZiBvdXRwdXQgQkZELgotCShncF9yZWZlcmVuY2UpOiBOZXcgZnVuY3Rpb247IHJldHVybnMgMSBpZiBleHByZXNzaW9uIGNhbiBiZQotCWFjY2Vzc3NlZCB2aWEgZ3AuICBBbHdheXMgcmV0dXJucyAwIGlmIG5vdCB1c2luZyBFQ09GRi4KLQkobWFjcm9fYnVpbGQpOiBDb252ZXJ0IEJGRF9SRUxPQ19MTzE2IHRvIEJGRF9SRUxPQ19NSVBTX0dQUkVMIGlmCi0JcG9zc2libGUuCi0JKG1hY3JvKTogR2VuZXJhdGUgc2VxdWVuY2VzIHVzaW5nIGdwIGlmIHBvc3NpYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZ25vcmUgLUVMIGFuZCAtRUIuICBQYXJzZSAtRy4KLQkobWRfYXBwbHlfZml4KTogQWRkZWQgQkZEX1JFTE9DX01JUFNfR1BSRUwgdG8gaWdub3JlZCBjYXNlLgotCShzX2NoYW5nZV9zZWMpOiBIYW5kbGUgLnJkYXRhIGFuZCAuc2RhdGEgZm9yIEVDT0ZGLgotCShzX2V4dGVybik6IE1hcmsgc3ltYm9sIGFzIGV4dGVybmFsLiAgU2V0IGVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KLQotVHVlIE1hciAzMCAxMDoxMTo0MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IERvbid0IGNhbGwgYXNfcGVycm9yIGZvcgotCWZpbGVuYW1lIHJlamVjdGVkIGJ5IGFwcGxpY2F0aW9uLgotCi0JKiBhcy5jIChtYWluKSBbQkZEX0FTU0VNQkxFUl06IElmIGVycm9ycyBvY2N1ciwgY2xvc2UgYW5kIHVubGluawotCXRoZSBvdXRwdXQgZmlsZS4KLQotCSogZG9jL2FzLnRleGluZm86IERvbid0IHVzZSBAdmFsdWUgaW4gbm9kZSBuYW1lcyBmb3IgdGhlIG1vbWVudDsKLQlyZWZlcmVuY2VzIGRvbid0IGFwcGVhciB0byB3b3JrIHJpZ2h0LgotCi0JKiBhcy5oIChjb25zdCwgdm9sYXRpbGUpOiBQdXQgdGhlc2UgZGVmaW5pdGlvbnMgYmFjaywgYW5kIHVzZQotCXRoZW0uCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBGaXJzdCBwYXNzIGF0IHVzaW5nIG5ldyB0ZXhpbmZvIGZlYXR1cmVzIC0tCi0JdmFyaWFibGVzLCBjb25kaXRpb25hbCB0ZXN0cy4gIEZhciBmcm9tIGNvbXBsZXRlLgotCi1Nb24gTWFyIDI5IDE2OjA1OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiBUZW1wb3JhcnkgaGFjayB0byBoYW5kbGUgc29tZSA2NC1iaXQgY29uc3RhbnRzLiAgVGhpcwotCXNob3VsZCBiZSByZWRvbmUgbGF0ZXIuCi0JKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KLQkoYmlnX2NvbnMpOiBJZiBpdCdzIHNldCwgcmV2ZXJzZSBvcmRlciBvZiBieXRlcyBiZWluZyBjb3BpZWQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4uCi0KLQkqIHJlYWQuYyAoc19pZ25vcmUpOiBEZWxldGUgZGVjbGFyYXRpb24gb2YgaXNfZW5kX29mX2xpbmUuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jICh5YW5rX3N5bWJvbHMpOiBCdWlsZCBsaXN0IG9mIGZpbGUgc3ltYm9sCi0JZm9yd2FyZCBwb2ludGVycyBwcm9wZXJseS4KLQotTW9uIE1hciAyOSAxMzo0NzozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBGaXggYnVnIHdoZXJlIG5yZWxvY3MKLQl3YXNuJ3QgYmVpbmcgc3RvcmVkIGludG8gc2NuaGRyLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IEFkZCBwcm90b3R5cGUgb2Ygc19nZXRfc2VnbWVudC4KLQkqIHJlYWQuYyAoVENfU1RBUlRfTEFCRUwpOiBEZWZhdWx0IGRlZmluaXRpb24uCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBUQ19TVEFSVF9MQUJFTCBtYWNybyB0byB3b3JrIG91dAotCWlmIGEgbGFiZWwgaGFzIGJlZW4gc2Vlbi4KLQotTW9uIE1hciAyOSAxMjo1Njo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRERFRiBhbmQgQkZETElCIGF0IHRoZSB0b3Agb2YgTWFrZWZpbGUsIG5vdAotCXRoZSBib3R0b20gKG1ha2UgZXhwYW5kcyB2YXJpYWJsZXMgaW4gZGVwZW5kZW5jaWVzIHdoZW4gdGhlCi0JZGVwZW5kZW5jaWVzIGFyZSByZWFkLCBub3Qgd2hlbiB0aGV5IGFyZSB1c2VkKS4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBOT0xPQUQgYml0IGZvcgotCWEyOWsgLmJzcyBzZWN0aW9uOyB0aGUgbW9uZGZlIHByb2dyYW0gZG9lc24ndCBsaWtlIGl0LgotCi1TdW4gTWFyIDI4IDA4OjEyOjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBVc2UgUEFSQU1TIG1hY3JvLCBhbmQgdXNlIENPTlNUIGluc3RlYWQgb2YKLQljb25zdC4KLQkoY3VycmVudF9hcmNoaXRlY3R1cmUpOiBEb24ndCBuZWVkIGluaXRpYWxpemVyLgotCi1GcmkgTWFyIDI2IDA4OjEyOjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZG9jL25vbmUubTQ6IERlZmluZSBaODAwMC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoYXMtKi50ZXhpbmZvKTogUmVmZXIgdG8gJChzcmNkaXIpLiAgUmVtb3ZlIHRoZQotCXRleGluZm8gZmlsZSBiZWZvcmUgcmVjcmVhdGluZyBpdC4KLQkoVEVYSTJEVkkpOiBOZWVkIHRvIHNldCBURVhJTlBVVFMgaWYgIm1ha2UgYXMuZHZpIiBpcyB0byB3b3JrIGluCi0JdGhpcyBkaXJlY3RvcnkuCi0JKHNyY2Rpcik6IERlbGV0ZSBzZWNvbmQsIGJvZ3VzIGRlZmluaXRpb24uCi0JKGFzLmluZm8pOiBMb29rIGZvciBhcy0qLnRleGluZm8gaW4gY3VycmVudCBkaXJlY3RvcnkgcmF0aGVyIHRoYW4KLQlpbiAkKHNyY2RpcikuCi0JKGFzLmR2aSk6IERpdHRvLgotCShkdmkpOiBOZXcgcnVsZS4KLQkqIGRvYy9jb25maWd1cmUuaW46IENyZWF0ZSBsaW5rcyB0byBhbGwgYXMtKi50ZXhpbmZvIGZpbGVzIGluIHRoZQotCXNvdXJjZSBkaXJlY3RvcnksIGlmIHRoYXQncyBub3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCi0JKiBjb25maWd1cmUuaW4gKHBlci1ob3N0KTogIEFjY2VwdCBNSVBTIGhvc3Qgd2l0aCBCU0QgdmVyc2lvbgotCW51bWJlci4KLQkocGVyLXRhcmdldCk6IENsYXNzaWZ5IGk0ODYgYXMgaTM4Ni4gIFVzZSBnZW5lcmljIGNwdV90eXBlIGluc3RlYWQKLQlvZiB0YXJnZXRfY3B1IGluIHNlbGVjdGluZyBmb3JtYXQgZXRjLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogVXNlIC5hcHBmaWxlLCBub3QgLmFwcC1maWxlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQ2hhbmdlIC5hcHAtZmlsZSB0byAuYXBwZmlsZS4KLQotCSogY29uZmlnL2hvLWRlY3N0YXRuLmg6IFJlbmFtZWQgZnJvbSBoby1kZWNzdGF0aW9uLmguCi0JKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgotCi0JKiBjb25maWcvb2JqLWJmZC1zdW5vcy4qOiBVbnVzZWQ7IGRlbGV0ZWQuCi0KLQkqIE1ha2VmaWxlLmluICh2ZXJzaW9uLmMsIHZlcnMtc3RhbXApOiBEZWxldGVkLgotCShjb25maWcuaCk6IERlZmluZSBHQVNfVkVSU0lPTi4KLQkqIGFzLmMgKHZlcnNpb25fc3RyaW5nKTogRGVsZXRlZCBkZWNsYXJhdGlvbi4KLQkobWFpbik6IExvb2sgZm9yIEdBU19WRVJTSU9OIGluc3RlYWQuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBVcGRhdGVkIGRlc2NyaXB0aW9uIG9mIC1hKiAobGlzdGluZykgb3B0aW9ucywKLQlhbmQgZGVzY3JpYmUgaG93IHRvIHBhc3MgdGhlbSB0aHJvdWdoIGZyb20gZ2NjLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IERvbid0IGFsbG9jYXRlIHN0b3JhZ2Ugb3IKLQlwcm9jZXNzIHJlbG9jcyBpZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcyB0byBwcm9jZXNzLiAgQXZvaWRzCi0JbWFsbG9jL2ZyZWUgYnVnIG9uIFNDTyB0b28uCi0KLQkqIGFzLmg6IE1vdmUgbG9jYWwgaW5jbHVkZSBmaWxlcyBiZWxvdyBzeXN0ZW0gaW5jbHVkZSBmaWxlcywgdG8KLQlhdm9pZCBzb21lIHJlZGVmaW5pdGlvbiBjb21wbGFpbnRzIG9uIHNvbWUgc3lzdGVtcy4KLQkoY29uc3QsIHZvbGF0aWxlKTogRG9uJ3QgbmVlZCB0aGVzZSBjb25kaXRpb25hbGx5IGRlZmluZWQgaWYgd2UKLQl1c2UgQ09OU1QgYW5kIFZPTEFUSUxFIGZyb20gYW5zaWRlY2wuaC4KLQkoc2VnX25hbWUpOiBVc2UgQ09OU1QsIG5vdCBjb25zdC4KLQotRnJpIE1hciAyNiAxMDoyMjowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlaW5kZW50ZWQgdG8gR05VIHN0YW5kYXJkcy4KLQotVGh1IE1hciAyNSAwODo1OToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogUmVtb3ZlIGEyOWsgc3BlY2lhbCBjYXNlLgotCShmaXh1cF9zZWdtZW50KTogQWRkIGEyOWsgc3BlY2lhbCBjYXNlOyB0aGUgbGlua2VyIGlzIG5vdCBwcmVwYXJlZAotCXRvIHNlZSBhIHNlZ21lbnQgb2Zmc2V0IGhlcmUuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGRlZCBuZXcgc3RhdGUsIDEwLCBtb2RpZnlpbmcgc3RhdGUKLQk5IHRvIG9ubHkga2VlcCBhIHNwYWNlIGluIGJldHdlZW4gaWRlbnRpZmllciBjaGFyYWN0ZXJzLgotCi1XZWQgTWFyIDI0IDAyOjE2OjIyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGR2aSB0YXJnZXQ7IGFzLSQoY29uZmlnKS50ZXhpbmZvIG1pZ2h0IGxpdmUgaW4KLQlzcmNkaXIsIG1pZ2h0IGJlIGluIG9iamRpci4KLQotCSogZG9jL01ha2VmaWxlLmluOiBkdmkgZGVwZW5kcyBvbiBhcy5kdmkKLQotTW9uIE1hciAyMiAyMzo1OToxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1Nb24gTWFyIDIyIDE2OjI1OjU3IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWRkIHN1cHBvcnQgZm9yIG1lbWJhciBtYXNrIG5hbWVzLgotCUFkZCBtaXNzaW5nIGNvbG9ucyBpbiBwcmVmZXRjaCBlcnJvciBtZXNzYWdlcy4gIEFkZCBzdXBwb3J0IGZvcgotCUFTSSBuYW1lcy4KLQotTW9uIE1hciAyMiAxMDoxOTowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogVXNlICRBVCBmb3IgYW55IGZsb2F0aW5nIHBvaW50IGxvYWQuCi0KLVNhdCBNYXIgMjAgMTI6NTA6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHVydGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEZvciBvcGVyYW5kIHR5cGUgJ00nLCByZWplY3QKLQliaWdudW1zLCBidXQgZG9uJ3QgZW1pdCBlcnJvciBtZXNzYWdlLgotCi1GcmkgTWFyIDE5IDIxOjAyOjE5IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRhcmctY3B1Lm8pOiBEZXBlbmQgb24gY29uZmlnLmguCi0KLVdlZCBNYXIgMTcgMTY6NDQ6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWRkZWQgbmV3IHN0YXRlLCA5LCB0byBhdm9pZAotCWRyb3BwaW5nIGEgc3BhY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFuIGlkZW50aWZpZXIuCi0JKiBleHByLmMsIHdyaXRlLmM6IFJld3JvdGUgYXNzZXJ0IGV4cHJlc3Npb25zIHRvIG5vdCB1c2UgbXVsdGlwbGUKLQlsaW5lczsgSSBkb24ndCB0aGluayB0aGF0IGNhbiBiZSBkb25lIHBvcnRhYmx5LgotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBVc2UgJEFUIGlmIHRhcmdldCByZWdpc3RlciBpcyB6ZXJvIGluCi0JbG9hZCBpbnN0cnVjdGlvbiwgd2hpY2ggaXQgY2FuIGJlIGZvciBhIGZsb2F0aW5nIHBvaW50IGxvYWQuCi0KLU1vbiBNYXIgMTUgMTI6MTc6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IENvbXB1dGUgdGhlIHJlbG9jcyBiZWZvcmUgd3JpdGluZyBvdXQKLQl0aGUgc2VjdGlvbiBjb250ZW50cy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCwgY29uZmlnL29iai1lY29mZi5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGdldAotCXN5bWJvbCB0YWJsZSBhbmQgdmFsdWVzIHJpZ2h0LgotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBJZiBPQkpfRUNPRkYsIGFueSBsYWJlbCBzdGFydGluZwotCXdpdGggJEwgaXMgbG9jYWwuCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBJZiBPQkpfRUNPRkYsIGFkanVzdCB0aGUgYWRkZW5kCi0JYnkgdGhlIHNlY3Rpb24gdm1hLgotCi0JKiBjb25maWcvejhrLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogVGhlIHJlbGV2YW50IGZpbGUgaXMKLQl6OGstb3BjLmgsIG5vdCB6OGsuaC4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmKTogQ29ycmVjdCB0ZXN0IGZvciAuYmYKLQlzeW1ib2wuCi0KLUZyaSBNYXIgMTIgMTg6MzM6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBzcGFyYy1zdW4tc29sYXJpczIqIGluc3RlYWQgb2YgLXNvbGFyaXMyCi0KLUZyaSBNYXIgMTIgMTI6MDA6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBleHByLmMsIHdyaXRlLmM6IFVsdHJpeCBuYXRpdmUgNC4yIGNjIHJlcXVpcmVzIGFzc2VydCBjb25kaXRpb24KLQl0byBiZSBvbiBhIHNpbmdsZSBsaW5lLgotCi1UaHUgTWFyIDExIDE3OjU2OjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5oKTogQ3JlYXRlIGZpbGUsIHdyaXRpbmcgb3V0IGRlZmluaXRpb25zIG9mCi0JdGFyZ2V0IGNwdSwgYWxpYXMsIGFuZCBjYW5vbmljYWwgbmFtZS4KLQkoQUxMX0NGTEFHUyk6IE5vIGxvbmdlciBkZWZpbmUgVEFSR0VUX0NQVS4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUHJpbnQgYSBtZXNzYWdlLCBpbnN0ZWFkIG9mIHF1aXR0aW5nCi0Jc2lsZW50bHkuCi0KLQkqIGFzLmMgKG1haW4pOiBEb24ndCBjYXRjaCBhbnkgc2lnbmFscywgZm9yIG5vdy4KLQotCSogdmVyc2lvbi5jOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW46IEdlbmVyYXRlIGl0LCBwdXR0aW5nIGluIG9ubHkgdGhlIHZlcnNpb24gbnVtYmVyCi0JaXRzZWxmLgotCShWRVJTSU9OKTogTmV3IHZhcmlhYmxlLgotCSogYXMuYzogSW5jbHVkZSBjb25maWcuaC4KLQkobWFpbik6IFJlZm9ybWF0dGVkIHZlcnNpb24gc3RyaW5nLiAgSW5jbHVkZSB0YXJnZXQgYWxpYXMuICBEb24ndAotCXByaW50IGlmIG5vdCByZXF1ZXN0ZWQgKGkuZS4sIHVua25vd24gLXYgYXJndW1lbnQpLgotCi0JKiBhcy5jIChzdHJhbGxvYyk6IERlbGV0ZWQuCi0JKG1haW4pOiBDYWxsIHN0cmR1cCBpbnN0ZWFkLgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBhbGwgNjgzMDAgc2VyaWVzIGNoaXBzLgotCSogY29uZmlnL3RjLW02OGsuYzogSW5jbHVkZSBjb25maWcuaC4KLQkobWRfYXNzZW1ibGUpOiBBc3N1bWUgVEFSR0VUX0NQVSBpcyBkZWZpbmVkLiAgQWNjZXB0IHNvbWUgNjgzMDAKLQlzZXJpZXMgY3B1cyBhcyBkZWZhdWx0cy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IHNvbWUgbTY4MzAwIHNlcmllcyBDUFVzIGFzIGRlZmF1bHRzLgotCi1XZWQgTWFyIDEwIDE3OjQxOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBEZWZpbmUgdG8gbm9ybWFsIHZhbHVlcyBpZgotCW5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKG1haW4sIGdvdF9zaWcpOiBVc2UgdGhlbS4KLQkqIGNvbmZpZy9oby12bXMuaCAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBSZXZlcnNlIGRlZmF1bHQKLQl2YWx1ZXMuCi0KLVR1ZSBNYXIgIDkgMDc6NDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMsIGNvbmZpZy9vYmotZWNvZmYuaDogUHJlbGltaW5hcnkgRUNPRkYKLQlzdXBwb3J0LgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGJhc2VkIG9uIE9CSl9BT1VUIHZzLgotCU9CSl9FQ09GRiBhcyB3ZWxsIGFzIFRBUkdFVF9CWVRFU18qX0VORElBTi4KLQkoc3RydWN0IGxvYywgc3RydWN0IHByb2MsIHN0cnVjdCBmaWxlKTogTW92ZWQgdG8gdGMtbWlwcy5jIHdpdGhpbgotCSNpZm5kZWYgT0JKX0VDT0ZGIGJsb2NrLCBzaW5jZSBFQ09GRiB1c2VzIGRpZmZlcmVudCB2ZXJzaW9ucy4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlYXJyYW5nZWQgZm9yIEVDT0ZGIHN1cHBvcnQuICBBZGRlZAotCXByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLiAgTW92ZWQgZXhpc3RpbmcgbWluaW1hbAotCWRlYnVnZ2luZyBmb3JtYXQgc3VwcG9ydCBpbmZvICNpZm5kZWYgT0JKX0VDT0ZGIGJsb2Nrcy4KLQkobWFjcm9fYnVpbGRfbHVpKTogRWxpbWluYXRlZCBzaWduX2V4dGVuZCBhcmd1bWVudCwgYmVjYXVzZSBFQ09GRgotCWRvZXMgbm90IHN1cHBvcnQgYSBub24gc2lnbiBleHRlbmRlZCBoaWdoIDE2IGJpdHMgcmVsb2MuICBBZGp1c3RlZAotCWFsbCBjYWxsZXJzIGFjY29yZGluZ2x5LgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBSZW5hbWVkIGZyb20gZ2V0X3JlZ2lzdGVyLCBhbmQgbWFkZSBub24tc3RhdGljLgotCi0JKiBjb25maWcvbWlwcy1iaWcubXQsIGNvbmZpZy9taXBzLWxpdC5tdDogTmV3IGZpbGVzLiAgRGVmaW5lCi0JVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gYW5kIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOLAotCXJlc3BlY3RpdmVseS4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWJzZCopOiBVc2UgZ2FzX3RhcmdldCBtaXBzLWxpdC4KLQkobWlwcy0qLXVsdHJpeCosIG1pcHMtKi1pcml4KiwgbWlwcy0qLWVjb2ZmKTogTmV3IHRhcmdldHMsIHVzaW5nCi0Jb2JqX2Zvcm1hdCBlY29mZiBhbmQgZ2FzX3RhcmdldCBtaXBzLWxpdCBvciBtaXBzLWJpZy4KLQotVHVlIE1hciAgOSAwNzo0MzowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jOiBCdW1wIHRvIHZlcnNpb24gMi4wLjEuCi0KLVR1ZSBNYXIgIDkgMDc6NDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlcik6IENoZWNrIHRoYXQgc2VnX2luZm8gKHNlY3Rpb24pCi0JaXMgbm90IE5VTEwuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBvYmpfZnJvYl9maWxlIGFmdGVyIHNldHRpbmcgdGhlIHN5bWJvbHMsCi0Jbm90IGJlZm9yZS4KLQotVHVlIE1hciAgOSAwMDowMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogVmVyc2lvbiAyLjAgcmVsZWFzZWQuCi0KLU1vbiBNYXIgIDggMTQ6NTc6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19DT1VOVF9SRUxPQyk6IExvb2sgZm9yIGZ4X2FkZHN5IG9ubHkuCi0KLUZyaSBNYXIgIDUgMDk6MDU6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmg6IERlZmluZSBzdHJpbmdlciBoZXJlLgotCXJlYWQuYywgY29uZmlnL29iai1pZWVlLmMsIGNvbmZpZy9vYmotdGNtODhrLmM6IE5vdCBhbnkgb2YgdGhlc2UKLQlwbGFjZXMuCi0KLVRodSBNYXIgIDQgMTE6NTI6MjMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19zcGFjZSk6IE11bHRpcGx5IHJlcGVhdCBjb3VudCBieSBtdWx0LCBub3QgZmlsbC4KLQotVGh1IE1hciAgNCAwNToyMDo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiBJbmNsdWRlIGN0eXBlLmguCi0KLVdlZCBNYXIgIDMgMTA6NDE6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlOgotCSogbWFrZS1nYXMuY29tOiBGaW5kIG9ic3RhY2sub2JqIGlmIGl0J3Mgbm90IGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LgotCSogcmVhZC5jIChzX2lnbm9yZSk6IERvbid0IGRlY2xhcmUgaXNfZW5kX29mX2xpbmUuICBJdCdzCi0JcmVkdW5kYW50LCBhbmQgdHJpZ2dlcnMgYSBWTVMgZ2NjIGNvbXBpbGVyIGJ1Zy4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBNYWNybyBTVUJfU0VHTUVOVF9BTElHTiBub3cgdGFrZXMKLQljdXJyZW50IHNlZ21lbnQgYXMgYW4gYXJndW1lbnQuICAoSWdub3JlZCBpbiBhbGwgY2FzZXMgYnV0IFZNUy4pCi0JQWxsIGNhbGxlcnMgYW5kIGRlZmluaXRpb25zIGNoYW5nZWQuCi0KLVR1ZSBNYXIgIDIgMTE6NTY6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmM6IENsZWFuZWQgdXAgYSBiaXQsIGFkZGVkIHByb3RvdHlwZXMsIG1hZGUgTk9fTElTVElORwotCWNhc2UgY29tcGlsZSBhZ2Fpbi4KLQotVHVlIE1hciAgMiAwODo1MzozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoaXNieXRlKTogQWNjZXB0IGFsbCB2YWx1ZXMgZnJvbSAtMjU1IHRvICsyNTUsCi0Jc28gIn4weDgwIiB3b24ndCBiZSByZWplY3RlZC4KLQotCSogY29uZmlnL29iai1lbGYuYzogTm8gbG9uZ2VyIGluY2x1ZGUgZWxmL3JlbG9jLmguCi0JKG9ial9lbGZfc2VjdGlvbik6IFNldCBTRUNfUkVBRE9OTFkgYW5kIFNFQ19DT0RFIGZvciB0ZXh0IHNlY3Rpb24uCi0JKG9ial9lbGZfc3RhYiwgb2JqX2VsZl9kZXNjKTogRGVsZXRlZCBkby1ub3RoaW5nIGFuZCBjb21tZW50ZWQtb3V0Ci0Jcm91dGluZXMuCi0JKG9ial9lbGZfeHN0YWIpOiBOZXcgcm91dGluZS4KLQkob2JqX2VsZl9zZXRfc2l6ZSk6IENhbGwgYXNfd2Fybiwgbm90IGZwcmludGYuICBQYXNzIGRlc2lyZWQKLQlhcmd1bWVudCB0byBzX2lnbm9yZS4gIFB1dCAiI2lmIDAiIGFyb3VuZCB1bnVzZWQgY29kZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IFVzZSBzX2lnbm9yZSBpbnN0ZWFkIG9mIGRvLW5vdGhpbmcgcm91dGluZXMuCi0JQ2FsbCBlbGZfeHN0YWJzIGZvciAuc3RhYnMgYW5kIC54c3RhYnMgb3BlcmF0b3JzLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9FTEZdOiBOb3cgImVsZjMyLXNwYXJjIi4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogU2V0IFNFQ19SRUxPQyBvbmx5IGlmIGZpeHVwcyBhcmUKLQlwcmVzZW50LgotCi0JKiBjb25maWd1cmUuaW46IG1pcHMtYnNkIGNvbmZpZ3VyYXRpb24gd2FzIG1pc3NpbmcgZm9ybWF0IHNwZWMuCi0JU2hvdWxkIHVzZSBhb3V0LgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBEZXBlbmRzIG9uIGNvbmZpZ3VyZS5pbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBjaGVjayBmb3IgYWxpZ25tZW50IG9mCi0JZnJhZyBpbiBtZW1vcnk7IGFsaWdubWVudCBvZiBpbnN0cnVjdGlvbnMgaW4gc2VjdGlvbiBpcyBhIHNlcGFyYXRlCi0JbWF0dGVyLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZF9sdWkpOiBGaXggc29tZSBhc3N1bXB0aW9ucyBvZiBBTlNJCi0JQyBhdmFpbGFiaWxpdHkuCi0KLQkqIGxpc3RpbmcuaDogQWx3YXlzIHByb3ZpZGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBub3QgbWFjcm9zLCBzbwotCXBjYyB3b24ndCBsb3NlLgotCi1UdWUgTWFyICAyIDAwOjUwOjQzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBDT05UUklCVVRPUlM6ICBVcGRhdGUgR2lsbW9yZSBlbnRyeS4KLQotTW9uIE1hciAgMSAxMjowMzoxNiAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6ICBDb3JyZWN0bHkgYXNzZW1ibGUgcHJlZmV0Y2gKLQlpbnN0cnVjdGlvbnMuICBBY2NlcHQgaW50ZWdlciBwcmVmZXRjaCBmdW5jdGlvbiBudW1iZXJzLgotCi1XZWQgRmViIDI0IDE0OjU4OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfeHdvcmQpOiBOb3cgY2FsbCBiaWdfY29ucywgc28gbGFyZ2UKLQljb25zdGFudHMgYXJlIGFjY2VwdGVkLCBidXQgc3ltYm9saWMgdmFsdWVzIGFyZSBub3QuICBHQ0Mgd2lsbCBub3QKLQlnZW5lcmF0ZSB0aGUgbGF0dGVyIGN1cnJlbnRseS4KLQotCSogZnJhZ3MuYyAoZnJhZ19pbml0KTogTmV3IGZ1bmN0aW9uLgotCSh6ZXJvX2FkZHJlc3NfZnJhZywgYnNzX2FkZHJlc3NfZnJhZyk6IE5vdyBpbml0aWFsaXplZCBhdCBydW4KLQl0aW1lLgotCSogYXMuYyAobWFpbik6IENhbGwgZnJhZ19pbml0LgotCi1XZWQgRmViIDI0IDEwOjMyOjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEluIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQgY2FzZToKLQlEb24ndCB1bmdldCBjaDIgaWYgd2UgZGlkbid0IGdldCBpdC4KLQotV2VkIEZlYiAyNCAwNDoxNDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluIChURVhJRElSKTogVXBkYXRlZCBmb3IgbmV3IGxheW91dC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogQWRkIHN1cHBvcnQgZm9yIEVMRiB2ZXJzaW9uLgotCSh0Y19nZW5fcmVsb2MpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9BUkNILCBUQVJHRVRfRk9STUFUKSBbQkZEX0FTU0VNQkxFUl06Ci0JTmV3IG1hY3Jvcy4KLQkobWRfY29udmVydF9mcmFnKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRm9yIFBDLXJlbGF0aXZlIGFkZHJlc3Npbmcgb2YgYQotCXN5bWJvbCwgZml4IHRoZSBvZmZzZXQgc28gIisyIiBpc24ndCByZXF1aXJlZC4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobGluZV9jb21tZW50X2NoYXJzLCBsaW5lX3NlcGFyYXRvcl9jaGFycyk6Ci0JRGVmaW5lIGFzIGNvbW1vbi9ic3MuCi0JKG9wX2hhc2gsIHJlZ19oYXNoLCBhcmVnX2hhc2gsIGljbGFzc2VzX3NlZW4sIGJyX2NudCk6IERlZmF1bHQgQwotCWluaXRpYWxpemVycyBhcmUgc3VmZmljaWVudC4KLQotCSogY29uZmlnL29iai1hb3V0LmggW0JGRF9BU1NFTUJMRVJdOiBJbmNsdWRlIGxpYmFvdXQuaCBmcm9tIGJmZC4KLQkoVEFSR0VUX0ZPUk1BVCkgW0JGRF9BU1NFTUJMRVJdOiBEZWZhdWx0IHRvICJhLm91dCIuCi0JKFNfU0VUXyosIFNfR0VUXyosIG9ial9mcm9iX3N5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgbWFjcm9zLgotCShTX1NFVF9UWVBFKSBbIUJGRF9BU1NFTUJMRVJdOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvb2JqLWFvdXQuYzogVXNlIFBBUkFNUyBtYWNybyBmb3IgZGVjbGFyYXRpb25zLiAgUmVtb3ZlCi0JIklHTk9SRV9ERUJVRyIgY29uZGl0aW9uYWwsIHNpbmNlIGJvdGggYnJhbmNoZXMgYXJlIGlkZW50aWNhbC4KLQlVc2UgU19TRVRfVFlQRSwgU19HRVRfVFlQRSwgYW5kIFNfR0VUX0RFU0MgaW5zdGVhZCBvZiBkaXJlY3RseQotCXJlZmVyZW5jaW5nIHN5bWJvbCBzdHJ1Y3R1cmUgbWVtYmVycy4KLQkob2JqX2FvdXRfZnJvYl9zeW1ib2wpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IFJlb3JkZXJlZCBhIGNvdXBsZSBvZiBmaWVsZHMgZm9yIGJldHRlcgotCXBhY2tpbmcuCi0KLQkqIHdyaXRlLmMgKHJlY29yZF9hbGlnbm1lbnQpIFtCRkRfQVNTRU1CTEVSXTogUmVjb3JkIGl0IGluIHRoZQotCXNlY3Rpb24gaW5mby4KLQkod3JpdGVfY29udGVudHMpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBBbHdheXMgaGFuZGxlIC1SIGhlcmUuICBDYWxsCi0JZml4X25ldyB3aXRoIEJGRF9SRUxPQ19OT05FIGluc3RlYWQgb2YgMCBvciBOT19SRUxPQy4gIENhbGwKLQlvYmpfZnJvYl9maWxlLCBvYmpfZnJvYl9zeW1ib2wsIHRjX2Zyb2Jfc3ltYm9sIGlmIGRlZmluZWQuCi0JKGZpeHVwX3NlZ21lbnQpOiBNYWtlIHN1cmUgY29tbW9uLXNlY3Rpb24gc3ltYm9scyBnZXQgdHJlYXRlZCB0aGUKLQlzYW1lIGFzIHVuZGVmaW5lZCBzeW1ib2xzLgotCShmaXhfbmV3KSBbQkZEX0FTU0VNQkxFUl06IEFyZ3VtZW50IHJfdHlwZSBpcyBvZiB0eXBlCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLiAgVXNlIHNlZ19maXhfe3Jvb3QsdGFpbH1QIGRlcml2ZWQgZnJvbQotCXNlY3Rpb24gaW5mby4KLQkqIHdyaXRlLmggKGZpeF9uZXcpOiBVcGRhdGUgcHJvdG90eXBlLgotCi0JKiB0Yy5oIChtZF9vcGVyYW5kLCBtZF9jb252ZXJ0X2ZyYWcsIHRjX2hlYWRlcnNfaG9vaywKLQltZF9zZWN0aW9uX2FsaWduLCBtZF91bmRlZmluZWRfc3ltYm9sKTogRG9uJ3QgcHJvdmlkZSBwcm90b3R5cGVzCi0JaWYgdGhlc2UgYXJlIGRlZmluZWQgYXMgbWFjcm9zLgotCShtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogQkZEIHZlcnNpb24gbmVlZHMgYmZkIGFuZAotCXNlY3Rpb24gcGFzc2VkLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBBcmd1bWVudCBOQU1FIGlzIG5vdyBwb2ludGVyIHRvIGNvbnN0LgotCVNpbXBsaWZpZWQgU1RSSVBfVU5ERVJTQ09SRSBjb2RlLiAgUmVtb3ZlIGFzc3VtcHRpb25zIGFib3V0IG51bGwKLQlwb2ludGVycyBpbiBmcmVzaGx5IGFsbG9jYXRlZCBzdG9yYWdlLiAgW0JGRF9BU1NFTUJMRVJdOiBHZXQgbmV3Ci0JQkZEIHN5bWJvbC4KLQkoY29sb24pOiBEaXNwbGF5IG90aGVyL2Rlc2MgZmllbGRzIG9mIHJlZGVmaW5lZCBzeW1ib2wgb25seSBpZgotCVNfR0VUX09USEVSIGFuZCBTX0dFVF9ERVNDIGFyZSBkZWZpbmVkLgotCShzeW1ib2xfbWFrZSk6IEFyZ3VtZW50IE5BTUUgaXMgbm93IHBvaW50ZXIgdG8gY29uc3QuCi0JKHN5bWJvbF9maW5kLCBzeW1ib2xfZmluZF9iYXNlKTogTGlrZXdpc2UuCi0JKFNfSVNfKiwgU19HRVRfKiwgU19TRVRfKikgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb25zLgotCSogc3ltYm9scy5oOiBGaXggcHJvdG90eXBlcyBmb3IgbmV3IGNvbnN0IGFyZ3VtZW50cy4gIEFkZAotCXByb3RvdHlwZXMgZm9yIEJGRF9BU1NFTUJMRVIgU18qIGZ1bmN0aW9ucy4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKSBbQkZEX0FTU0VNQkxFUl06IEJGRCB2ZXJzaW9uIG9mIGNvZGUKLQlmb3IgY2hhbmdpbmcgdG8gYW4gZXhpc3Rpbmcgc2VjdGlvbi4KLQkoc3Vic2VnX25ld19yZXN0KSBbQkZEX0FTU0VNQkxFUl06IFNwbGl0IG9mZiBmcm9tIHN1YnNlZ19uZXcsCi0JY2FsbGVkIGJ5IHN1YnNlZ19uZXcgYW5kIHN1YnNlZ19zZXQuCi0JKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogUmV3cml0dGVuIHRvIGNoYW5nZSB0byBuZXcgc2VjdGlvbiwKLQlnaXZlbiBzZWN0aW9uIG5hbWUgYW5kIHN1YnNlZyBudW1iZXIuCi0JKHN1YnNlZ19zZXQpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uOyBjaGFuZ2UgdG8gYSBwb3NzaWJseQotCW5ldyBzZWN0aW9uL3N1YnNlY3Rpb24uCi0KLQkqIHJlYWQuYzogRG9uJ3QgaW5jbHVkZSBjdHlwZS5oLgotCShjb25zKSBbQkZEX0FTU0VNQkxFUl06IEZvciB1bmRlZmluZWQgc3ltYm9scywgdXNlIEJGRF9SRUxPQ18zMgotCWZvciBub3c7IHNob3VsZCBiZSBtYWNoaW5lLWRlcGVuZGVudC4KLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgKi0qLWVsZiBhbmQgKi0qLXNvbGFyaXMqIGFzIEVMRiBmb3JtYXQKLQl0YXJnZXRzLCBmb3JjaW5nIEJGRCB1c2UuCi0KLVdlZCBGZWIgMTcgMTg6NTk6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYzogVXNlIFBBUkFNUyBtYWNybyBmb3Igc3RhdGljIGZ1bmN0aW9uCi0JZGVjbGFyYXRpb25zLiAgVXNlIEJGRF9SRUxPQ18gbWFjcm9zIGV2ZXJ5d2hlcmUsIHdpdGgKLQljb21wYXRpYmlsaXR5IG1hY3JvcyBkZWNsYXJlZCBmb3Igbm9uLUJGRCBtb2RlLgotCShzdHJ1Y3Qgc3BhcmNfaXQpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotCWluc3RlYWQgb2YgZW51bSByZWxvY190eXBlLgotCShlbWl0X3NwYXJjX3JlbG9jKTogQ29tbWVudGVkLW91dCBmdW5jdGlvbiBkZWxldGVkLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEZWxldGVkLgotCSh0Y19hb3V0X3ByZV93cml0ZV9ob29rKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShtZF9hcHBseV9maXgpOiBDaGFuZ2VkIGNhbGxpbmcgc2VxdWVuY2UgKGNvbmRpdGlvbmFsbHkpIGZvciBCRkQKLQl2ZXJzaW9uLgotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2NvbnZlcnRfZnJhZyk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X3N0YWIpOiBSZWZlciB0byB1bmRlZmluZWRfc2VjdGlvbiwKLQlub3QgU0VHX1VOS05PV04uICBVc2UgU19TRVRfVFlQRSwgU19HRVRfVFlQRSwgU19HRVRfREVTQyBpbnN0ZWFkCi0Jb2YgcmVmZXJlbmNpbmcgZmllbGRzIGRpcmVjdGx5LgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogTmV3IGZ1bmN0aW9uOyBleHRyYWN0ZWQgZnJvbQotCXdyaXRlX29iamVjdF9maWxlLgotCSh3cml0ZV9vYmplY3RfZmlsZSkgWyEgQkZEX0FTU0VNQkxFUl06IENhbGwgaXQuCi0JKHJlbGF4X2FuZF9zaXplX3NlZykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb247IHJlbGF4IHNlY3Rpb24KLQlhbmQgc2V0IGl0cyBzaXplIGFuZCBmbGFncy4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpIFtCRkRfQVNTRU1CTEVSXTogUmVwbGFjZSBzb21lCi0JZmllbGRzIHdpdGggQkZEIGVxdWl2YWxlbnRzLiAgVHVybiBvbiBiYWNrLXBvaW50ZXJzLCBhbmQgYWRkCi0JdGFyZ2V0LXNwZWNpZmljIGZpZWxkcyBhdCBlbmQuCi0KLVRodSBGZWIgMTEgMDk6MjA6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IHZhZGRyIGhlcmUuCi0JKHdyaXRlX29iamVjdF9maWxlKTogU2V0IGl0IGhlcmUgaW5zdGVhZCwgc28gdGhhdCBmaXh1cF9zZWdtZW50Ci0JY2FuIHNlZSB0aGUgY29ycmVjdCB2YWx1ZS4KLQotTW9uIEZlYiAgOCAxMzo1NjoxNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYW5kCi0JYmFpbCBvdXQgYmVmb3JlIHByb2Nlc3NpbmcgY29udGVudHMuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBOZXcgZnVuY3Rpb24sIGRvZXMgbW9zdCBvZiB0aGUgd29yawotCW9mIHJlbW92ZV9zdWJzZWdzLgotCShjaGFpbl9mcmNoYWluc190b2dldGhlcikgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0JKHJlbW92ZV9zdWJzZWdzKSBbISBCRkRdOiBDYWxsIGl0LgotCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBDb252ZXJ0ZWQgdG8gdXNlIEJGRAotCXN0cnVjdHVyZXMgYW5kIHJvdXRpbmVzLgotCi0JKiBjb25maWcvb2JqLWVsZi4qOiBOZXcgZmlsZXMuCi0KLQkqIGNvbmZpZy9taXBzLm10LCBjb25maWcvcnM2MDAwLm10OiBEZWxldGVkLgotCi0JKiBjb25maWcvaDgzMDAubXQ6IERvbid0IHNwZWNpZnkgY29tcGlsZXIgaGVyZS4KLQotCSogY29uZmlnL3o4ay5tdDogVGhlIHo4ayBjb2RlIGRlcGVuZHMgb24gdGhlIHo4ayBvcGNvZGUgdGFibGUsCi0Jbm90IHRoZSBoODMwMCBvbmUuCi0JKiBjb25maWcvdGMtejhrLmg6IENvbW1lbnQgZml4LgotCi0JKiB3cml0ZS5jOiBSZW9yZGVyZWQgc29tZSBmdW5jdGlvbnMgZm9yIGJldHRlciBpbmxpbmluZy4KLQkoZml4dXBfc2VnbWVudCk6IExpbmtyZWxheCBjb2RlIGlzIG5vIGxvbmdlciBjb25kaXRpb25hbCBvbgotCVRDX0k5NjAuCi0KLVRodSBGZWIgIDQgMTI6NDU6MTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97aDg1MDAubXQsIHRjLWg4NTAwLmMsIHRjLWg4NTAwLmgsIG9iai1jb2ZmYmZkLmMsCi0Jb2JqLWNvZmZiZmQuaH06IHN1cHBvcnQgZm9yIHRoZSBIOC81MDAKLQotV2VkIEZlYiAgMyAxOToyODoxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNVQl9TRUdNRU5UX0FMSUdOKTogRGVmaW5lIFZNUyB2ZXJzaW9uIGhlcmUuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IE5vdCBoZXJlLgotCShmaXhfbmV3KTogSW5pdGlhbGl6ZSBmeF9hZGRudW1iZXIuCi0KLQkqIGxpc3RpbmcuYzogRG9uJ3QgaW5jbHVkZSB0YXJnZXQtY3B1LmggZXhwbGljaXRseSwgc2luY2UgYXMuaAotCWluY2x1ZGVzIGl0LgotCi1UaHUgSmFuIDI4IDAwOjM1OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5oIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVjbGFyZSBuZXh0X29iamVjdF9maWxlX2NoYXJQLAotCSpfZml4X3Jvb3QsICpfZml4X3RhaWwsIHNlZ19maXhfcm9vdFAsIHNlZ19maXhfdGFpbFAuCi0JKHN0cnVjdCBmaXgpOiBSZW9yZGVyZWQgZmllbGRzIGZvciBjb21wYWN0bmVzcyBhbmQgZWZmaWNpZW5jeS4KLQlDb252ZXJ0ZWQgc29tZSBsb2dpY2FsIGZpZWxkcyB0byAxLWJpdCBmaWVsZHMuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oOiBVc2UgUEFSQU1TLgotCVtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVmaW5lL2RlY2xhcmUgQU9VVF9NQUNIVFlQRSwgc2VnX05fVFlQRSwKLQlOX1RZUEVfc2VnLCBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUuCi0KLQkqIHJlYWQuYzogRG9uJ3QgaW5jbHVkZSBsaXN0aW5nLmg7IGFzLmggaW5jbHVkZXMgaXQuICBSZW1vdmVkCi0JRE9OVERFRiBjb2RlLgotCVtCRkRfQVNTRU1CTEVSXTogSW5jbHVkZSBzdWJzZWdzLmguCi0JKG9sZF9idWZmZXIsIG5ld19icm9rZW5fd29yZHMpOiBEZWZhdWx0IGluaXRpYWxpemF0aW9uIGlzCi0Jc3VmZmljaWVudC4KLQotCSogb3V0cHV0LWZpbGUuYyBbQkZEX0FTU0VNQkxFUl06IEluY2x1ZGUgYmZkLmgsIGRlZmF1bHQgVEFSR0VUX01BQ0gKLQl0byAwLCBkZWZpbmUgc3Rkb3V0cHV0LgotCShvdXRwdXRfZmlsZV9jcmVhdGUpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBiZmRfcGVycm9yIG9uIGZhaWx1cmUuCi0JQ2FsbCBiZmRfc2V0X2FyY2hfbWFjaC4KLQkob3V0cHV0X2ZpbGVfY2xvc2UpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBiZmRfY2xvc2UsIG5vdAotCWJmZF9jbG9zZV9hbGxfZG9uZS4gIENhbGwgYmZkX3BlcnJvciBvbiBmYWlsdXJlLgotCShvdXRwdXRfZmlsZV9hcHBlbmQpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb25maWcvbTY4a2NvZmYubXQgKExPQ0FMX0xPQURMSUJFUyk6IERlbGV0ZSBkZWZpbml0aW9uLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWx3YXlzIGRlZmluZS4gIE9taXQgZmllbGQgc2NuaGRyCi0JaWYgbm90IE1BTllfU0VHTUVOVFMuICBEZWZpbmUgbmV3IGZpZWxkIGJmZF9zZWN0aW9uIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoc2VnX2luZm8pOiBOZXcgbWFjcm8uCi0KLQkqIGV4cHIuYywgaW5wdXQtc2NydWIuYzogVXNlIFBBUkFNUyBtYWNyby4gIERlbGV0ZWQgdW51c2VkCi0JdmFyaWFibGVzLCBhbmQgc29tZSBpcnJlbGV2YW50IGNvbW1lbnRzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEluY2x1ZGUgJChCRkRERUYpLgotCShMSUJTKTogSW5jbHVkZSAkKEJGRExJQikuICBEb24ndCBib3RoZXIgd2l0aCAkKENMSUIpLgotCSogY29uZmlndXJlLmluOiAgUGVybWl0IC0td2l0aC1iZmQtYXNzZW1ibGVyIG5vdywgd2l0aCBhIHdhcm5pbmcuCi0JVmFyaWFibGUgbmVlZF9iZmQgaXMgbm93IGEgYm9vbGVhbiwgYXMgaXMgbmV3IHZhcmlhYmxlIGJmZF9nYXMuCi0JU2V0IEJGRERFRiBhbmQgQkZETElCIGluIE1ha2VmaWxlIHdoZW4gYXBwcm9wcmlhdGUuCi0KLQkqIGFzLmM6IFJlbW92ZWQgIiNpZmRlZiBET05UREVGIiBhbmQgIiNpZmRlZiBjb21tZW50IiBjb2RlLgotCShtYWluKTogUmVmZXIgdG8gZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0IGluc3RlYWQgb2YKLQlmbGFnc2VlblsnWiddLgotCi0JKiBhcy5jIChtYWluKSBbQkZEX0FTU0VNQkxFUl06IE9wZW4gb3V0cHV0IGJmZC4KLQkoKl9zZWN0aW9uKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZSB0aGVtLgotCShwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpIFtCRkRfQVNTRU1CTEVSXTogSW5pdGlhbGl6ZSB0aGVtLCBhbmQKLQlzZXQgc2VjdGlvbiBmbGFncyB3aGVuIGFwcHJvcHJpYXRlLgotCSogYXMuaCAoU0VHX05PUk1BTCkgW0JGRF9BU1NFTUJMRVJdOiBSZXF1aXJlIHRoYXQgdGhlIHNwZWNpZmllZAotCXNlY3Rpb24gaXMgbm90IGFic29sdXRlLCB1bmRlZmluZWQsIG9yIGFuIGFzc2VtYmxlciBpbnRlcm5hbCBvbmUuCi0JKGFic29sdXRlX3NlY3Rpb24sIHVuZGVmaW5lZF9zZWN0aW9uKTogQWx3YXlzIGRlZmluZS4KLQkqIGV4cHIuYywgcmVhZC5jLCBzeW1ib2xzLmM6IFJlZmVyIHRvICpfc2VjdGlvbiwgbm90IFNFR18qOyBicmVhawotCXN3aXRjaCBzdGF0ZW1lbnRzIGludG8gaWYtZWxzZSB0cmVlcy4KLQkqIHN5bWJvbHMuYyBbTUFOWV9TRUdNRU5UU106IERlbGV0ZWQgcmVkdW5kYW50IGRlZmluaXRpb25zIG9mCi0JU0VHX0JTUyBhbmQgU0VHX0RBVEEuCi0KLQkqIGFzLmggKGZyYWdfbm93X2ZpeCk6IE5ldyBtYWNyby4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBVc2UgaXQuCi0KLVdlZCBKYW4gMjcgMjE6NDM6NTMgUFNUIDE5OTMgIFJhbHBoIENhbXBiZWxsICAocmFscGhjQHB5cmFtaWQuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvdGMtbWlwcy5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvaG8tbWlwc2JzZC5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvbWlwcy1vcGNvZGUuaDogIEFkZGVkIG1pcHMgc3VwcG9ydCBmb3IgbWlwcy1kZWMtYnNkLgotCSogY29uZmlndXJlLmluOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBhdG9mLWdlbmVyaWMuYzogIERlZmluZSBUUlVFIGFuZCBGQUxTRSBpZiBub3QgZGVmaW5lZC4KLQotVGh1IEphbiAyMSAxMjo0ODoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHZlcnNpb24uYzogQnVtcGVkIHZlcnNpb24gbnVtYmVyIHRvIDEuOTMuMDUuCi0KLVdlZCBKYW4gMjAgMTc6MTE6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBEb24ndCB1c2UgI2VsaWYuCi0JKG9ial9lbWl0X2xpbmVubyk6IERvbid0IG5lZWQgcmV0dXJuIGF0IGVuZCBvZiB2b2lkIGZ1bmN0aW9uLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IFJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KLQkodGNfYW91dF9maXhfdG9fY2hhcnMpOiBBcnJheSBuYnl0ZXNfcl9sZW5ndGggaXMgbm93IGNvbnN0LgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19DT1VOVF9SRUxPQyk6IERvbid0IGVtaXQgcmVsb2MgaWYgb25seQotCW9mZnNldCBmaWVsZCBpcyBzZXQuCi0KLUZyaSBKYW4gIDggMDU6NDQ6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBGb3IgJXVoaSBhbmQgJXVsbywgaWYgbm90Ci0JRU5WNjQsIGVtaXQgbm8gcmVsb2MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEZvciAiLnh3b3JkIiwgY2FsbCBzX3h3b3JkLgotCShzX3h3b3JkKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZCwgd2Fybl9vbl9idW1wLAotCW1kX3JlbGF4X3RhYmxlKTogVXNlIGRlZmF1bHQgemVybyBpbml0aWFsaXphdGlvbi4KLQkoc19yZXNlcnZlKTogU2luY2UgU0VHX0UyIGlzIGVxdWl2YWxlbnQgdG8gU0VHX0JTUywganVzdCB1c2UgdGhlCi0JbGF0dGVyLCBpbnN0ZWFkIG9mIHNlbGVjdGluZyB3aXRoIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCi0KLVRodSBKYW4gIDcgMDg6NTg6MjEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbmlzZSBhbGwgc3BhcmNsaXRlIHZhcmlhbnRzCi0KLVRodSBKYW4gIDcgMDU6MjU6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfZGF0YSkgWyFCRkRfQVNTRU1CTEVSXTogRml4IHR5cG8gaW4gNCBKYW4gY2hhbmdlIC0tCi0JYWNjaWRlbnRhbGx5IGNoYW5nZWQgdG8gdXNlIHN1YnNlZ19jaGFuZ2Ugd2hlcmUgaXQgc2hvdWxkIGhhdmUKLQliZWVuIHN1YnNlZ19uZXcuCi0KLVR1ZSBKYW4gIDUgMDg6NDI6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBjb21tYSBvciBuZXdsaW5lIGlzIGEKLQlsb2dpY2FsIGVuZC1vZi1saW5lIGNoYXJhY3RlciwgdXNlIHRoZSBuZXdsaW5lIGNhc2UuCi0JRnJvbSBFcmljIFlvdW5nZGFsZToKLQkob3BlcmFuZCk6IFNldCBYX2FkZF9udW1iZXIgZmllbGQgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0JKG9wZXJhbmQpOiBUcmVhdCB6ZXJvIGJ5dGUgYXMgZW5kLW9mLW9wZXJhbmQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAocGVyLXRhcmdldCk6IExvb2sgZm9yIHdpdGhfYmZkX2Fzc2VtYmxlciBvcHRpb24uCi0JRm9yIG5vdywgb25seSBhY2NlcHQgIm5vIiwgdW50aWwgdGhlIG1lcmdlIGlzIGRvbmUuCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIEVyaWMgWW91bmdkYWxlICh5b3VuZ2RhbGVAdjY1NTBjLm5ybC5uYXZ5Lm1pbCk6Ci0JKiBhcy5jLCBmbG9udW0ta29uc3QuYywgaGV4LXZhbHVlLmMsIGlucHV0LWZpbGUuYywgdmVyc2lvbi5jLAotCSAgY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotdm1zLmM6IFZNUyAtPiBIT19WTVMuCi0JKiByZWFkLmM6IEZpbmlzaCBjb252ZXJzaW9uIHRvIFNfKiBtYWNyb3MgaW4gdGhlIFZNUyBvbmx5Ci0JICBwYXJ0cyBvZiB0aGUgcHJvZ3JhbS4gQWRkICJjb25zdCIgbW9kaWZpZXIgdG8gaGV4X3ZhbHVlLgotCSogYXMuYywgcmVhZC5jLCBzeW1ib2xzLmMsIHdyaXRlLmM6IENoYW5nZSAiaWZkZWYgVk1TIiB0bwotCSAgImlmZGVmIE9CSl9WTVMiLgotCSogZXhwci5jOiBBZGQgImNvbnN0IiBtb2RpZmllciB0byBoZXhfdmFsdWUuCi0JKiBzeW1ib2xzLmM6IEZpbmlzaCBjb252ZXJzaW9uIHRvIFNfKiBtYWNyb3MgaW4gdGhlIFZNUyBvbmx5Ci0JICBwYXJ0cyBvZiB0aGUgcHJvZ3JhbS4gIEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvCi0JICBtZF9bbG9uZyxzaG9ydF1fanVtcF9zaXplLiBSZW1vdmUgZGVjbGFyYXRpb24gb2YgY29uc3RfZmxhZwotCSAgKHdoaWNoIHdpbGwgYmUgZGVjbGFyZWQgaW4gb2JqLXZtcy5oKS4KLQkqIHdyaXRlLmM6IEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvIG1kX1tsb25nLHNob3J0XV9qdW1wX3NpemUuCi0JICBGaXggYXJndW1lbnRzIHRvIFZNU193cml0ZV9vYmplY3RfZmlsZS4KLQkqIGNvbmZpZy1nYXMuY29tOiBOZXcgZmlsZS4gIFNjcmlwdCBmb3IgVk1TIHN5c3RlbXMgdG8gc2V0IHVwIHRoZQotCSAgY29uZmlndXJhdGlvbiB0byBidWlsZCBnYXMgZm9yIFZNUywgYW5kIGNyZWF0ZSBjb25maWcuc3RhdHVzLgotCSogbWFrZS1nYXMuY29tOiBSZWRvbmUgdG8gd29yayB3aXRoIG5ldyBzY2hlbWUuCi0JKiBvYmotdm1zLmM6IFBhdGNoIHRvIGZpeCBidWcgd2hlcmUgd2Ugd2VyZSBub3QgY29ycmVjdGx5IHBhcnNpbmcgdGhlCi0JICBzdGFicyBkaXJlY3RpdmVzLgotCSogb2JqLXZtcy5jOiAgRGVmaW5lIG1hY3JvcyBDT1BZX0xPTkcgYW5kIENPUFlfU0hPUlQgd2hpY2gKLQkgIHdpbGwgc3dhcCBieXRlcyBpZiBuZWVkZWQgb24gYSBiaWcgZW5kaWFuIHN5c3RlbS4gIFVzZSB0aHJvdWdob3V0Ci0JICBhcyBuZWVkZWQuCi0JKiBvYmotdm1zLmMgKG9ial9hb3V0X3N0YWIpOiAgQWRkIGNvZGUgdG8gZ2VuZXJhdGUgbGlzdGluZyBmaWxlLgotCSogb2JqLXZtcy5jIChWTVNfdHlwZWRlZl9wYXJzZSk6IEFkZCBhbGlhcyB0byBjb3JyZWN0bHkgaGFuZGxlIGNlcnRhaW4KLQkgIHR5cGVzIG9mIG1hbGZvcm1lZCBzdGFicy4gIENoYW5nZSBwYXJzaW5nIGFsZ29yaXRobSBzbyB0aGF0IHdlIGFyZQotCSAgbW9yZSBjZXJ0YWluIG9mIGhhdmluZyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgbmVlZCBvbiBoYW5kLgotCSogb2JqLXZtcy5jIChmaW5hbF9mb3J3YXJkX3JlZmVyZW5jZSk6ICBOZXcgZnVuY3Rpb24sIHVzZWQgdG8gaGVscAotCSAgcmVzb2x2ZSB0aGUgZGF0YSB0eXBlcyBvZiBhcyBtYW55IHN0cnVjdCBlbGVtZW50cyBhcyBwb3NzaWJsZQotCSAgd2hlbiBzb21lIHBhcnQgb2YgdGhlIHN0cnVjdCBpcyBub3QgZnVsbHkgZGVmaW5lZCBieSB0aGUgY29tcGlsZXIuCi0JKiBvYmotdm1zLmMgKFZNU19MU1lNX1BhcnNlKTogIENvcnJlY3RseSBoYW5kbGUgY2FzZSBvZiBjb250aW51YXRpb24KLQkgIHN0YWJzIGRpcmVjdGl2ZXMuCi0JKiBvYmotdm1zLmMgKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IERlZmluZSBhbGwgdnRhYmxlIHBzZWN0cwotCSAgYXMgc3ltYm9scyBhcyB3ZWxsIGluIHRoZSBvYmplY3QgZmlsZS4gIExvb2sgZm9yIGV4dGVybmFsIGZ1bmN0aW9ucwotCSAgdGhhdCBzdGFydCB3aXRoICJfX3Z0LiIsIGFuZCB0dXJuIHRoZW0gaW50byB2YXJpYWJsZXMsIHNpbmNlIHRoZQotCSAgZysrIGNvbXBpbGVyIGlzIGluY2FwYWJsZSBvZiBkb2luZyB0aGlzLgotCSogdGMtdmF4LmM6IEFkZCAnMScgb3B0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgR0NDCi0JICB2ZXJzaW9ucy4KLQkqIGJpZ251bS1jb3B5LmMgKGJpZ251bV9jb3B5KTogRml4IGJ1ZyB3aGVyZSB3ZSBwYWQgd2l0aCB6ZXJvZXMuCi0JKiBpbnB1dC1zY3J1Yi5jIChhc193aGVyZSk6IEZpeCBidWcgd2hlcmUgYXMgd291bGQgY3Jhc2ggaWYgd2UgZGlkIG5vdAotCSAgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgeWV0LgotCSogY29uZmlnL2hvLXZtcy5oOiBkZWZpbmUgSE9fVk1TLCBub3QgSE9fVkFYLgotCi1Nb24gSmFuICA0IDA1OjE3OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfZGF0YSk6IEFsd2F5cyB1c2UgImRhdGFfc2VjdGlvbiIsIHNpbmNlIGl0J2xsIG1hcCB0bwotCVNFR19EQVRBIG9yIFNFR19FMSBpZiBuZWVkZWQuCi0JKHNfbGNvbW0pOiBMaWtld2lzZSB3aXRoIGJzc19zZWN0aW9uLgotCShzX2ZpbGwpOiBVc2UgbWVtc2V0LCBub3QgYnplcm8uCi0KLVRodSBEZWMgMzEgMDQ6Mjk6MjcgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogRGVsZXRlZCBzb21lIGNvZGUgdW5kZXIgIiNpZmRlZiBET05UREVGIiB0aGF0IHdhcyBmb3IKLQloYW5kbGluZyBHREIgc3ltYm9sIHRhYmxlIGRhdGEuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChzZWdtZW50X25hbWUpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQkoc2VnX25hbWUpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoc2VnbWVudF9uYW1lLCBzZWdfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai12bXMuaCAoc2VnbWVudF9uYW1lLCBzZWdfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmLmggKHNlZ21lbnRfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKHNlZ21lbnRfbmFtZSk6IERpdHRvLgotCi0JKiBDaGFuZ2VzIGZvciBCRkRfQVNTRU1CTEVSOgotCSogb2JqLmggKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBEZWNsYXJlIG9ubHkgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUi4KLQkob2JqX2hlYWRlcl9hcHBlbmQsIG9ial9wcmVfd3JpdGVfaG9vayk6IERpdHRvLgotCSogYXMuaCAoc3Rkb3V0cHV0KTogTmV3IHZhciwgZGVmaW5lZCBvbmx5IGlmIEJGRF9BU1NFTUJMRVIuCi0JKHNlZ1QpIFtCRkRfQVNTRU1CTEVSXTogTmV3IHR5cGVkZWYgZm9yICJhc2VjdGlvbiAqIi4KLQkoc2VnbWVudF9uYW1lKSBJZiBCRkRfQVNTRU1CTEVSLCBsb29rIHVwIEJGRCBzZWN0aW9uIG5hbWU7Ci0Jb3RoZXJ3aXNlLCB1c2Ugc2VnX25hbWUgYXJyYXkuCi0JKHNlZ19uYW1lKTogRGVjbGFyZSBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShzZWN0aW9uX2FsaWdubWVudCk6IERlY2xhcmUgb25seSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkoYmlnX3NlY3Rpb24sIHJlZ19zZWN0aW9uLCBwYXNzMV9zZWN0aW9uLCBkaWZmX3NlY3Rpb24sCi0JYWJzZW50X3NlY3Rpb24sIHRleHRfc2VjdGlvbiwgZGF0YV9zZWN0aW9uLCBic3Nfc2VjdGlvbik6IElmCi0JQkZEX0FTU0VNQkxFUiwgZGVjbGFyZSBhcyB2YXJpYWJsZXM7IG90aGVyd2lzZSwgZGVjbGFyZSBhcyBtYWNyb3MsCi0JbWFwcGluZyB0byBzZWdUIGVudW0gdmFsdWVzLgotCSh0Y19hb3V0X2ZpeF90b19jaGFycywgbmV4dF9vYmplY3RfZmlsZV9jaGFyUCk6IEZvcmNlIHBhcnNlIGVycm9ycwotCWlmIHRoZXNlIGFyZSB1c2VkIG9yIGRlZmluZWQsIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHN1YnNlZ19zZXQsIHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogRnVuY3Rpb25hbGl0eSBvZiBvbGQKLQlzdWJzZWdfbmV3IHNwbGl0IGludG8gdHdvIGZ1bmN0aW9ucy4KLQkoU0VHX05PUk1BTCk6IEZvciBCRkRfQVNTRU1CTEVSLCBhbHdheXMgcmV0dXJuIHRydWUsIGZvciBub3cuCi0KLQkqIGFzLmggKHZvbGF0aWxlKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQkoaGFkX2Vycm9ycywgaGFkX3dhcm5pbmdzKTogUHJvdmlkZSBwcm90b3R5cGVzIGZvciBBTlNJIEMgZXZlbiBpZgotCU5PX1NUREFSRy4KLQkoYXNfYmFkLCBhc19mYXRhbCwgYXNfdHNrdHNrLCBhc193YXJuKTogRm9yIEdOVSBDIHZlcnNpb24gMiwKLQlkZWNsYXJlIHdpdGggZm9ybWF0IGF0dHJpYnV0ZSBmb3IgLVdmb3JtYXQgY2hlY2tpbmcuCi0KLVdlZCBEZWMgMzAgMTA6MTg6NTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYywgY29uZmlnL3RjLSouYzogRG9uJ3QgaW5jbHVkZSByZWFkLmgsIHNpbmNlIGl0IGlzIGFscmVhZHkKLQlpbmNsdWRlZCBieSBhcy5oLgotCi0JKiBUaGVzZSBhcmUgYmFzZWQgb24gcGF0Y2hlcyBmcm9tIE1pbmggVHJhbi1sZQotCTxtdHJhbmxlQHBhcmlzLmludGVsbGljb3JwLmNvbT4uCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtaWJtLWFpeCopOiBBY2NlcHQgaTQ4NiBmb3IgaG9zdC4gIFVzZQotCW9ial9mb3JtYXQgY29mZmJmZCBhbmQgZ2FzX3RhcmdldCBpMzg2Y29mZiBmb3IgdGFyZ2V0LgotCShpWzM0XTg2LSotaXNjKik6IE5ldyBob3N0ICh1c2VzIHN5c3YpLgotCSogY29uZmlnL2kzODZhaXgubXQ6IFJlbW92ZWQgKG5vIGxvbmdlciB1c2VkKS4KLQkqIGNvbmZpZy9taC1pMzg2YWl4IChSQU5MSUIpOiBVc2UgdHJ1ZSByYXRoZXIgdGhhbiAvYmluL3RydWUuCi0JKE1JTlVTX0cpOiBSZW1vdmVkLgotCShMREZMQUdTKTogQWRkZWQsIGRlZmluZWQgYXMgLXNobGliLgotCSogY29uZmlnL3RlLWkzODZhaXguaCAoUkVWRVJTRV9TT1JUX1JFTE9DUyk6IFVuZGVmaW5lLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChMT0NBTF9MQUJFTCk6IERvbid0IGRlZmluZS4KLQkoRE9UX0xBQkVMX1BSRUZJWCk6IERlZmluZS4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIERPVF9MQUJFTF9QUkVGSVgsIHVzZSAuTDBcMDAxIGFzIGEgbGFiZWwKLQluYW1lIHJhdGhlciB0aGFuIEwwXDAwMS4KLQkqIHJlYWQuYyAoc19sY29tbSk6IE1ha2UgYSBmcmFnIGluIFNFR19CU1MgcmF0aGVyIHRoYW4gdXNpbmcKLQlsb2NhbF9ic3NfY291bnRlci4KLQkqIHN5bWJvbHMuYywgc3ltYm9scy5oIChsb2NhbF9ic3NfY291bnRlcik6IFJlbW92ZWQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGJzcyBubyBsb25nZXIgdXNlcwotCWxvY2FsX2Jzc19jb3VudGVyLiAgUGFzcyBjb3JyZWN0IGRhdGEgYW5kIGJzcyBzaXplIHRvCi0JVk1TX3dyaXRlX29iamVjdF9maWxlLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogQWNjZXB0IGJzcyBzaXplIGFzCi0JYXJndW1lbnQsIHJhdGhlciB0aGFuIHVzaW5nIGxvY2FsX2Jzc19jb3VudGVyLgotCSogY29uZmlnL3RjLW04OGsuYyAoc19ic3MpOiBEb24ndCB1c2UgbG9jYWxfYnNzX2NvdW50ZXIuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogRG9uJ3QgdXNlIGxvY2FsX2Jzc19jb3VudGVyLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGhhZF9saW5lbm8sIGhhZF9yZWxvYyk6IFJlbW92ZWQuCi0JKHNpemVfc2VjdGlvbik6IFJlc3RvcmVkIHNhbml0eSBjaGVjay4KLQkoZG9fcmVsb2NzX2Zvcik6IEJhc2Ugc2VjdGlvbiBhZGRyZXNzIG9uIHNfcGFkZHIgcmF0aGVyIHRoYW4KLQljb21wdXRpbmcgaXQuICBBZGp1c3QgYTI5ayBSX0lISUhBTEYgc3BlY2lhbCBjYXNlIHRvIGFjY291bnQgZm9yCi0Jc2VjdGlvbiBwYWRkciAodXNlZCB0byByZXF1aXJlIHBhZGRyIHRvIGJlIHplcm8pLiAgSWYgdGhlcmUgYXJlIG5vCi0JcmVjbG9zLCBzZXQgc19yZWxwdHIgdG8gMC4gIFNldCByZWxvY2F0aW9uIHNpemUgaW4gb2JqZWN0X2hlYWRlcnMuCi0JKGZpbGxfc2VjdGlvbik6IEFsd2F5cyBzZXQgc192YWRkciBoZXJlLCByZW1vdmluZwotCVpFUk9fQkFTRURfU0VHTUVOVFMgY2FzZS4gIEZvcmNlIHNfc2NucHRyIGZvciBic3MgdG8gMC4gIERvbid0IHNldAotCU5PTE9BRCBmb3IgaTM4NiAuYnNzLCBiZWNhdXNlIGl0IGNvbmZ1c2VzIHRoZSBTVlIzIG5hdGl2ZSBsaW5rZXIuCi0JU2V0IFNUWVBfSU5GTyBmb3IgLmNvbW1lbnQuCi0JKGNvZmZfaGVhZGVyX2FwcGVuZCk6IFVzZSBvYmplY3QgaGVhZGVycyBhbmQgSF97U0VULEdFVH1fKiBtYWNyb3MuCi0JTWFrZSBhb3V0aGRyIHdyaXRpbmcgZGVwZW5kIG9uIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSLgotCShjcmF3bF9zeW1ib2xzKTogSGFuZGxlIDggY2hhcmFjdGVyIHNlY3Rpb24gbmFtZSBjb3JyZWN0bHkuICBVc2UKLQlIX3tTRVQsR0VUfV8qIG1hY3Jvcy4KLQkoZG9fbGluZW5vc19mb3IpOiBTZXQgbGluZW5vIHNpemUgaW4gb2JqZWN0X2hlYWRlcnMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogVXNlIEhfe1NFVCxHRVR9XyogbWFjcm9zLiAgRG9uJ3QgYm90aGVyIHRvCi0Jc2V0IHNfdmFkZHIgaGVyZS4gIElmIHN0cmluZ19ieXRlX2NvdW50IHJlbWFpbnMgNCwgc2V0IGl0IGJhY2sgdG8KLQkwLCBhbmQgb25seSB3cml0ZSBzdHJpbmdzIG91dCBpZiB0aGVyZSBhcmUgc29tZS4gIENhbGwKLQlmaWxsX3NlY3Rpb24gYmVmb3JlIGRvX3JlbG9jc19mb3IgYW5kIGRvX2xpbmVub3NfZm9yLgotCShvYmpfY29mZl9zZWN0aW9uKTogSGFuZGxlIG9wdGlvbmFsIHF1b3RlZCBzZWNvbmQgYXJndW1lbnQgZ2l2aW5nCi0Jc2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MuCi0JKG9ial9jb2ZmX2Jzcyk6IEFkZGVkIHRvIGhhbmRsZSAuYnNzLgotCShvYmpfY29mZl9pZGVudCk6IEFkZGVkIHRvIGhhbmRsZSAuaWRlbnQgKHB1dHMgc3RyaW5nIGluIC5jb21tZW50Ci0Jc2VjdGlvbikuCi0JKG9ial9jb2ZmX2xjb21tKTogUHV0IGNvbW1vbiBzeW1ib2xzIGluIC5ic3MsIG5vdCAuZGF0YS4KLQkoZml4dXBfbWRlcHMpOiBDaGFuZ2UgdG8gc2VnbWVudC4gIENhbGwgZnJhZ193YW5lIGFmdGVyCi0JbWRfY29udmVydF9mcmFnLgotCShmaXh1cF9zZWdtZW50KTogRXhwbGljaXRseSBjaGVjayBTX0lTX0NPTU1PTiBiZWZvcmUgbWFraW5nIDM4NgotCWFkanVzdG1lbnQgKGFscmVhZHkgaGFwcGVuZWQgb25seSBmb3IgY29tbW9uIHN5bWJvbHMsIGJ1dCB0aGlzIGlzCi0JY2xlYXJlcikuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzX2Jzcyk6IERvbid0IHVzZSBpZiBJMzg2Q09GRi4KLQkobWRfcHNldWRvX3RhYmxlKTogSWdub3JlIC5vcHRpbSBhbmQgLm5vb3B0LgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWkzODYuaCAoUkVWRVJTRV9TT1JUX1JFTE9DUyk6IFVuZGVmLCBmb3IgU1ZSMwotCWNvbXBhdGliaWxpdHkuCi0JKExPQ0FMX0xBQkVMKTogUmVtb3ZlZCBkZWZpbml0aW9uLgotCShET1RfTEFCRUxfUFJFRklYKTogRGVmaW5lZC4KLQotTW9uIERlYyAyOCAxMDozMjowNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGFwcF9wdXNoKTogVXNlIG1lbWNweSwgbm90IGJjb3B5LgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBGb3IgXCIsIHJldHVybiAiIG5vdCAnLgotCShzeW1ib2xfY2hhcnMpOiBOb3cgY29uc3QuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIG5vdCBMT0NBTF9MQUJFTFNfRkIsIGRvbid0IGxvb2sgZm9yICIwZiIKLQlhbmQgIjBiIi4gIElmIExPQ0FMX0xBQkVMU19ET0xMQVIsIGNoZWNrIGZvciAiMCQiLgotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogRG9uJ3QgdXNlICNlbGlmLgotCi0JKiBjb25maWcvaG8tc3Vub3MuaDogRG9uJ3QgaW5jbHVkZSBzeXMvc3RkdHlwZXMuaDsgNC4wLjMgZG9lc24ndAotCWhhdmUgaXQuICAoUmVwb3J0ZWQgYnkgTm9haCBGcmllZG1hbiwgZnJpZWRtYW5AZ251LmFpLm1pdC5lZHUuKQotCi1XZWQgRGVjIDE2IDEyOjEyOjMzIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYywgb2JqLWllZWUuYzogZG9uJ3QgZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOIGlmIGl0IGlzCi0JYWxyZWFkeSBkZWZpbmVkLgotCi1UdWUgRGVjIDE1IDEyOjQwOjExIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBhbGxvdyBzaW5nbGUgcXVvdGUgc3RyaW5ncyBpZiBzbwotCWNvbmZpZ3VyZWQuCi0KLQkqIGNvbmZpZy8qejhrKjogY2hlY2twb2ludAotCi1TdW4gRGVjIDEzIDAwOjA0OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBhdm9pZCBjYWxsaW5nIHhtYWxsb2MgKDApLgotCi1TYXQgRGVjIDEyIDE1OjI2OjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jOiBDYWxsIHhtYWxsb2MsIG5vdCBtYWxsb2M7IGRvbid0IGRlY2xhcmUgbWFsbG9jLgotCi0JKiBDaGFuZ2VzIHRvIHN1cHBvcnQgU0NPIDMuMnY0OgotCSogcmVhZC5jIChzX2FsaWduX2J5dGVzLCBzX2FsaWduX3B0d28pOiBJZiBub3QgU0VHX0RBVEEgb3IKLQlTRUdfQlNTLCBmaWxsIHdpdGggTk9QX09QQ09ERS4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdDogQWRkIG9wY29kZS9pMzg2LmggdG8gVEFSR19DUFVfREVQRU5ERU5UUy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogSW5jcmVtZW50IGFkZHIgZXZlbiBpZiBub3QKLQl1c2luZyBaRVJPX0JBU0VEX1NFR01FTlRTLgotCShmaWxsX3NlY3Rpb24pOiBJZiBaRVJPX0JBU0VEX1NFR01FTlRTLCBzZXQgc2VnbWVudCBhZGRyZXNzZXMsIGJ1dAotCW5ldmVyIHNldCBzZWdtZW50IGFkZHJlc3MgZm9yIFNFR19FMiAoLmJzcykgYW5kIGRvbid0IHdyaXRlIG91dAotCVNFR19FMiBjb250ZW50cy4gIFNldCAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgdG8gU1RZUF9URVhULgotCShvYmpfY29mZl9lbmRlZik6IERvbid0IG1lcmdlIGxhYmVscyBvciBzeW1ib2xzIGF3YWl0aW5nIGZvcndhcmQKLQlkZWZpbml0aW9ucywgYW5kIGRvbid0IG1lcmdlIHRhZ3Mgd2l0aCBub24tdGFncy4gIENoZWNrIGZvciAuYmYKLQlyYXRoZXIgdGhhbiBqdXN0IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNlY29uZCBjaGFyYWN0ZXIgaXMgYiBhbmQKLQl0aGUgdGhpcmQgY2hhcmFjdGVyIGlzIGYuCi0JKG9ial9jb2ZmX3ZhbCk6IGdjYyBjYW4gZ2VuZXJhdGUgdmFsdWVzIHdoaWNoIHdlIGRvbid0IGhhbmRsZQotCWNvcnJlY3RseTsgZGlzY2FyZCBpbmZvcm1hdGlvbiBmb3Igbm93LCBzaW5jZSBpdCBvbmx5IGFmZmVjdHMgdGhlCi0JZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSh0YWdfZmluZF9vcl9uYW1lKTogRG9uJ3QgaW5zZXJ0IHRhZ3MgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQkoeWFua19zeW1ib2xzKTogRG9uJ3QgbWVyZ2UgbGFiZWxzLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBTVUJfU0VHTUVOVF9BTElHTiBpZiBpdCBpcwotCWFscmVhZHkgZGVmaW5lZC4gIEZpbGwgc3Vic2VnbWVudHMgd2l0aCBOT1BfT1BDT0RFLCBub3QgMC4gIERvbid0Ci0Jc2V0IHNlZ21lbnQgYWRkcmVzcyBpZiBaRVJPX0JBU0VEX1NFR01FTlRTLgotCShvYmpfY29mZl9zZWN0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgYSB0cmFpbGluZyBxdW90ZWQgc3RyaW5nLCBhcwotCXVzZWQgaW4gQVQmVCBpMzg2IHN5bnRheC4KLQkoZml4dXBfc2VnbWVudCk6IFRha2Ugc2VnbWVudCBhcyBhcmd1bWVudC4gIE9uIHRoZSBpMzg2LCBhZGp1c3QgUEMKLQlyZWxhdGl2ZSBhZGRlbmRzIGJ5IHRoZSBzZWdtZW50IHZhZGRyLgotCSogdGMtaTM4Ni5oOiBEZWZpbmUgU1VCX1NFR01FTlRfQUxJR04uCi0JKiB0Yy1hMjlrLmg6IERlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTLgotCSogdGMtaTM4Ni5jOiAoaTM4Nl9vcGVyYW5kKTogSWYgSTM4NkNPRkYsIGFjY2VwdCBhbnkgc2VnbWVudCB0eXBlLgotCi1UdWUgRGVjICA4IDAwOjA2OjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEluY2x1ZGUgbGliY29mZi5oLgotCi0JKiB2ZXJzaW9uLmM6IE5vdyB2ZXJzaW9uIDEuOTMuCi0KLU1vbiBEZWMgIDcgMDA6Mzk6MDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IEZvciAzODZic2QgYW5kIGxpbnV4LCBkbwotCXBvd2VyLW9mLXR3byBhbGlnbm1lbnQgZm9yIC5hbGlnbi4KLQotCSogYXMuaDogSWYgQlJPS0VOX0FTU0VSVCwganVzdCByZWRlZmluZSBgYXNzZXJ0JyB0byBiZSB0cml2aWFsLAotCWFuZCBsZWF2ZSBldmVyeXRoaW5nIGVsc2UgYWxvbmUuCi0KLUZyaSBEZWMgIDQgMTY6NTg6NDIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXMubmV3KTogRG9uJ3QgYm90aGVyIHNhdmluZyBhcy5vbGQuCi0KLQkqIHdyaXRlLmM6IENvbmRpdGlvbmFsaXplIG9uIE9CSl9WTVMsIG5vdCBWTVMuCi0JKG1hZ2ljX251bWJlcl9mb3Jfb2JqZWN0X2ZpbGUpOiBEb24ndCBkZWZpbmUgaWYgT0JKX1ZNUy4KLQotCSogY29uZmlnL29iai12bXMuYzogQ2hhbmdlcyBmb3IgdHJhZGl0aW9uYWwgQy4KLQotVGh1IERlYyAgMyAwMToyNDowNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLWdlbmVyaWMuaCAobWFsbG9jLCByZWFsbG9jKTogRGVjbGFyZS4KLQotCSogTG90cyBvZiBjb21tZW50L3doaXRlc3BhY2UgY2hhbmdlcy4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IFNvbWUgZmllbGRzIHJlb3JkZXJlZCwgbmFycm93ZWQuCi0KLQkqIHJlYWQuYyAoTUFTS19DSEFSKTogRGVmaW5lIHVzaW5nIEMgdHlwZXMsIG5vdCBtYWdpYyBudW1iZXIuCi0KLQkqIGFzLmMsIGlucHV0LWZpbGUuYzogRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLgotCi0JKiBhcHAuYywgYXMuaDogRG9jIGZpeC4KLQotCSogZmxvbnVtLWtvbnN0LmMsIGZsb251bS1tdWx0LmM6IEluY2x1ZGUgYW5zaWRlY2wuaC4KLQotCSogYXMuaCAoeG1hbGxvYyk6IEFyZ3VtZW50IGlzIGxvbmcuCi0KLQkqIHhtYWxsb2MuYyAoZXJyb3IpOiBSZW1vdmUgZGVjbGFyYXRpb247IGFzLmggdGFrZXMgY2FyZSBvZiBpdC4KLQotCSogZG9jL2FzLnRleGluZm86IFJlZ3JvdXBlZCBkb2N1bWVudGF0aW9uIG9mIHNvbWUgY29tbWFuZC1saW5lCi0Jb3B0aW9ucy4gIFVwZGF0ZWQgb3B0aW9ucyBkb2N1bWVudGF0aW9uIGZvciBtNjhrLiAgU29tZSBtaW5vcgotCXdvcmRpbmcvcHVuY3R1YXRpb24gY2hhbmdlcy4KLQotTW9uIE5vdiAzMCAxMTo0MjoxMSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IHRhcmdldCBPUyAidm1zIi4KLQotCSogc3ltYm9scy5jOiAgTWVyZ2VkIEFOU0kgYW5kIG5vbi1BTlNJIGZ1bmN0aW9uIGRlY2xzLCB1c2luZwotCVBBUkFNUyBtYWNyby4KLQotCSogeG1hbGxvYy5jOiBKdXN0IGluY2x1ZGUgYXMuaCwgZG9uJ3QgYm90aGVyIHRyeWluZyB0byBmaWd1cmUgb3V0Ci0Jb3RoZXIgaGVhZGVyIGZpbGVzLgotCi0JKiBzdHJzdHIuYywgc3RyZXJyb3IuYzogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluOiBEZWxldGVkIHJlZmVyZW5jZXMuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBEb24ndCBpbmNsdWRlIGhlYWRlciBmaWxlIGZvciBzdHJpbmcKLQlkZWNsYXJhdGlvbnM7IGxlYXZlIHRoYXQgdG8gaG8tKi5oLgotCi1GcmkgTm92IDI3IDA0OjExOjM2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybiBhdCBjYW1icmlkZ2UtbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jb2ZmX2dudS5oIFtUQ19JODYwXTogR3Vlc3NlcyBmb3IgcmVsb2MgdHlwZSB2YWx1ZXMsCi0JaW1wb3J0ZWQgZnJvbSBGU0Ygc291cmNlcy4KLQotCSogbWVzc2FnZXMuYyAoc3RyZXJyb3IpOiBEZWNsYXJlIHVuY29uZGl0aW9uYWxseS4KLQotCSogYXMuaDogRGVsZXRlIGFsbG9jYSBhbmQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAobWFzayk6IE5vdyBjb25zdC4KLQotCSogb2JzdGFjay5jLCBvYnN0YWNrLmg6IERlbGV0ZWQuCi0KLQkqIGFzLmggKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KTogTmV3IGZsYWcuCi0JKiBhcy5jIChtYWluKTogU2V0IGl0IGZvciAtUi4KLQotCSogYXMuaCAoZmxhZ19zdXBwcmVzc193YXJuaW5ncyk6IE5ldyBmbGFnLgotCSogYXMuYyAobWFpbik6IFNldCBpdCBmb3IgLVcuCi0JKiBtZXNzYWdlcy5jIChhc193YXJuKTogQ2hlY2sgaXQgaW5zdGVhZCBvZiBmbGFnc2VlblsnVyddLgotCi0JKiBhcy5oIChmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQpOiBOZXcgZmxhZy4KLQkqIGFzLmMgKG1haW4pOiBTZXQgaXQgZm9yIC1aLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaDogRGVmaW5lIE5FRURfRlhfUl9UWVBFLgotCSogY29uZmlnL3RjLWEyOWsuaDogRGl0dG8uCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogRG9uJ3QgY29uZGl0aW9uYWxpemUgZnhfcl90eXBlIGZpZWxkIG9uIFRDCi0JbWFjcm9zLgotCi0JKiBhcy5oOiBNZXJnZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbHMsIHVzaW5nIFBBUkFNUwotCW1hY3JvLgotCSogYmlnbnVtLmgsIGV4cHIuaCwgZmxvbnVtLmgsIGZyYWdzLmgsIGlucHV0LWZpbGUuaCwgbGlzdGluZy5oLAotCW9iai5oLCBvdXRwdXQtZmlsZS5oLCByZWFkLmgsIHN0cnVjLXN5bWJvbC5oLCBzeW1ib2xzLmgsIHRjLmgsCi0Jd3JpdGUuaDogTGlrZXdpc2UuCi0JKiByZWFkLmM6IExpa2V3aXNlLgotCi0JKiB4bWFsbG9jLmM6IENvbmRpdGlvbmFsaXplIG9uIEhBVkVfTUFMTE9DX0gsIG5vdCBVU0cuICBGb2xkIGluCi0JeHJlYWxsb2MgZnJvbSB4cmVhbGxvYy5jLgotCSogeHJlYWxsb2MuYzogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBBZGp1c3RlZC4KLQotCSogY29uZmlndXJlLmluOiBGb3IgaG9zdCBDUFUgYTI5aywgcnM2MDAwLCB2YXgsIGNvbnNpZGVyIHVzaW5nIGJzZAotCW9yIHZtcyBoby0gZmlsZXMuCi0KLQkqIGNvbmZpZy9oby1zeXN2LmggKHNldGJ1ZmZlciwgSE9fVVNHKTogRGVsZXRlZC4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChhdG9mX2llZWUpOiBFeHBvbmVudCBmaWVsZCBpc24ndCBhIHBvaW50ZXI7Ci0JZG9uJ3QgaW5pdGlhbGl6ZSBpdCB3aXRoIE5VTEwuCi0KLQkqIGNvbmZpZy9oby12YXguaCAoTV9WQVgpOiBEZWxldGVkOyB3YXMgdW51c2VkLgotCi0JKiBSRUFETUUtdm1zLCBjb25maWcvaG8tdm1zLmgsIGNvbmZpZy9vYmotdm1zLmMsIGNvbmZpZy9vYmotdm1zLmg6Ci0JTmV3IGZpbGVzIGltcG9ydGVkIGZyb20gRlNGIHZlcnNpb24sIGNvbnRyaWJ1dGVkIGJ5IEVyaWMgWW91bmdkYWxlLgotCSogUkVBRE1FLXZtcy1kYmcsIGNvbmZpZy92bXM6IERlbGV0ZWQuCi0KLQkqIENoYW5nZUxvZywgY29uZmlnL0NoYW5nZUxvZzogTWVyZ2VkLgotCi0JKiBjb25maWcvKnRhaG9lKiwgY29uZmlndXJlLmluOiBUYWhvZSBzdXBwb3J0IGJyb3VnaHQgaW4gZnJvbSBGU0YKLQl2ZXJzaW9uLgotCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IEVsaW1pbmF0ZSBjYWxsIHRvIHNldHZidWYuCi0JW1VTR10gKHNldGJ1ZmZlcik6IERlbGV0ZWQgbWFjcm8uCi0KLU1vbiBOb3YgMjMgMTE6MDA6MTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFsbCBmaWxlczogV2hpdGVzcGFjZSBjaGFuZ2VzIGZvciBHTlUgaW5kZW50YXRpb24gc3R5bGUsIGRvbmUgYnkKLQlHTlUgYGluZGVudCcuICBTb21lIGNsZWFudXAgc3RpbGwgbmVlZGVkLCBlc3BlY2lhbGx5IG9mIGNvbW1lbnRzLgotCi0JKiBjb25maWd1cmUuaW46IE5vIHRlLTM4NmJzZC5oIGZpbGUgZXhpc3RzOyBkb24ndCB0cnkgdG8gdXNlIGl0LgotCi0JKiBvYmotY29mZi5jIChvYmpfY29mZl9lbmRlZik6IFVzZSBhc193YXJuLCBub3QgZnByaW50Zi4KLQotCSogdGMtbTY4ay5jIChtZF9hc3NlbWJsZSk6IERvbid0IGNvbXBsYWluIGFib3V0IDY4MDAwIHdpdGggNjg4ODE7Ci0JY291bGQgYmUgZG9pbmcgZW11bGF0aW9uLgotCi1UaHUgTm92IDE5IDExOjQ3OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JejgwMDAgZG9jdW1lbnRhdGlvbgotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvYWxsLm00LCBkb2MvYXMtYWxsLnRleGluZm8sIGRvYy9hcy50ZXhpbmZvOgotCWFsbCBtb2RpZmllZC4KLQotVHVlIE5vdiAxMCAwOTo0OToyNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5vLCBvYmotZm9ybWF0Lm8pOiBhZGRlZCBkZXBlbmRlbmN5IG9uIHN1YnNlZ3MuaC4KLQotCSogc3Vic2Vncy5oOiBhZGQgZXh0ZXJuIHRvIHNlZ21lbnRfaW5mbyBkZWNsYXJhdGlvbi4KLQotCSogcmVhZC5oOiBhZGRlZCBleHRlcm4gZGVjbGFyYXRpb25zIGZvciBjb21tZW50X2NoYXJzLAotCWxpbmVfY29tbWVudF9jaGFycywgYW5kIGxpbmVfc2VwYXJhdG9yX2NoYXJzLgotCXJlYWQuYywgYXBwLmM6IHJlbW92ZWQgZGVmaW5pdGlvbnMgb2YgY29tbWVudF9jaGFycywKLQlsaW5lX2NvbW1lbnRfY2hhcnMsIGFuZCBsaW5lX3NlcGFyYXRvcl9jaGFycy4KLQotCSogdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IElmIFJFR0lTVEVSX1BSRUZJWCBpc24ndCBkZWZpbmVkLAotCXN0aWxsIGFjY2VwdCAoYnV0IGRvbid0IHJlcXVpcmUpIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCBiZWZvcmUKLQl0aGUgcmVnaXN0ZXIgbmFtZS4KLQkoaW5zZXJ0X3JlZyk6IHB1dCBSRUdJU1RFUl9QUkVGSVggYmVmb3JlIHJlZ2lzdGVyIG5hbWVzIGJlZm9yZQotCXB1dHRpbmcgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCSogdGMtbTY4ay5oIChPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgpOiBEZWZpbmUgdG8gYmUgIiUiLCBpZiBub3QKLQlNNjhLQ09GRi4KLQotCSogb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogc2V0IFNUWVBfTk9MT0FEIGJpdCBmb3IgLmJzcwotCXNlY3Rpb24uCi0KLQkqIGF0b2YtaWVlZS5jLCBhdG9mLW5zMzJrLmMsIHRjLSouYzogbWFkZSBFWFBfQ0hBUlMsIEZMVF9DSEFSUywKLQljb21tZW50X2NoYXJzLCBsaW5lX2NvbW1lbnRfY2hhcnMgYW5kIGxpbmVfc2VwZXJhdG9yX2NoYXJzCi0JY29uc2lzdGVudGx5IGNvbnN0LCBhbmQgYWx3YXlzIGluaXRpYWxpemVkIHRoZW0uICBJbmNsdWRlZCByZWFkLmguCi0KLVRodSBOb3YgIDUgMTc6NTU6NDEgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiB0Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFkZCBjb2RlIHRvIGZsYWcgZXJyb3IgaWYgYW4gYWJzb2x1dGUKLQljb25zdGFudCB3aWxsIG5vdCBmaXQgaW4gYW4gaW1tZWRpYXRlIGZpZWxkLgotCShtZF9hcHBseV9maXgsIFJFTE9DX0JBU0UxMyBjYXNlKTogQ2hlY2sgZm9yIHJlbG9jYXRpb24gb3ZlcmZsb3cuCi0KLVdlZCBOb3YgIDQgMDc6NTA6NDYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmLmMgKGNhbGxqX3RhYmxlKTogRGVsZXRlIGdsb2JhbCB2YXJpYWJsZS4KLQkob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBEZWZpbmUgaXQgbG9jYWxseSBoZXJlLCBhbmQgb25seSBpZgotCVRDX0k5NjAgaXMgZGVmaW5lZC4KLQotCSogdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IFVuZGVyc2NvcmUgaXMgcGFydCBvZiBhIHN5bWJvbCBuYW1lLgotCShtNjhrX2lwKTogRG9uJ3Qgd2FybiBhYm91dCBiaWdudW0gdXNlZCBhcyBmbG9hdCBiaXQtcGF0dGVybi4KLQotCSogb2JqLWNvZmYuYzogUmVwbGFjZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0Jd2l0aCBhIHNpbmdsZSBzZXQgdXNpbmcgUEFSQU1TIG1hY3JvLgotCi0JKiB0Yy1pOTYwLmMgKHRjX2JvdXRfZml4X3RvX2NoYXJzKTogQml0LWZpZWxkIGZpeHVwcyB3YW50IGEgbGVuZ3RoCi0Jb2YgMi4KLQotCSogdGMtaTk2MC5jOiBNaXNzZWQgYSBjb3VwbGUgb2YgMC0+Tk9fUkVMT0MgY29udmVyc2lvbnMuCi0KLQkqIHRjLWk5NjAuaCAoTl9CQUxOQU1FLCBOX0NBTExOQU1FKTogRGVmaW5lIGFzIGNoYXItdHlwZSB2YWx1ZXMsCi0Jc28gd2lkZW5pbmcgd29ya3MgY29uc2lzdGVudGx5LgotCi1XZWQgT2N0IDI4IDA4OjUyOjM0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiB2ZXJzaW9uLmM6IFB1dCBjb25kaXRpb25hbCAiY29uc3QiIGJlZm9yZSB2ZXJzaW9uX3N0cmluZywgbm90Ci0JYmVmb3JlIGR1bW15IGZ1bmN0aW9uIGZvciBWTVMuICBOb3cgdmVyc2lvbiAxLjkxLjAzLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogTmVlZCBkb3VibGUtXCBiZWZvcmUgYDAwMCcgdG8gc2hvdwotCXByaW50ZWQgcmVwIG9mIG51bGwgY2hhcmFjdGVyLgotCi1GcmkgT2N0IDIzIDE0OjQwOjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBjaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfY2xvc2VfYWxsX2RvbmUuCi0KLVR1ZSBPY3QgMjAgMTI6MTg6MDggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBTdXBwb3J0IGZvciBpMzg2LXN5c3YuCi0Jb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvciwgd3JpdGVfb2JqZWN0X2ZpbGUpOiBzZXQgc2VnbWVudAotCWFkZHJlc3NlcyB0byByZWFzb25hYmxlIHNpemVzLiAgTmV3IGRlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTIGNhbgotCWJlIHVzZWQgdG8gc2V0IHRoZW0gYWxsIHRvIHplcm8gYXMgd2FzIGRvbmUgYmVmb3JlLgotCShmaWxsX3NlY3Rpb24pOiBzZWdtZW50IGFkZHJlc3NlcyBub3cgc2V0IGluIHdyaXRlX29iamVjdF9maWxlLgotCShmaWxsX3NlY3Rpb24pOiBEb24ndCBzZXQgU1RZUF9OT0xPQUQgZm9yIC5ic3Mgc2VjdGlvbi4KLQkoZml4dXBfc2VnbWVudCk6IDM4NiB1c2VzIHN0cmFuZ2UgY29tbW9uIHN5bWJvbCBmb3JtYXQuCi0JdGMtaTM4Ni5jICh0Y19jb2ZmX2ZpeDJydHlwZSk6IHVzZSBSX0RJUjMyLCBub3QgUl9SRUxMT05HLCBmb3IKLQljb21wYXRpYmlsaXR5IHdpdGggU1ZSMy4yIGxpbmtlci4KLQkqIGNvbmZpZ3VyZS5pbjogaTM4Ni1zeXN2IGFuZCBpMzg2LXNjbyB1c2UgY29mZmJmZC4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IGRpc2NhcmQgd2hpdGVzcGFjZSBhZnRlciBhIGxhYmVsLgotCi1TYXQgT2N0IDEwIDEyOjMzOjQ1IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gU3VuT1MgNCBhbmQgU29sYXJpczIgZm9yIFN1bjQKLQlob3N0cywgdXNlIHRoZSBzeXN2IGNvbmZpZ3VyYXRpb24gZm9yIHNvbGFyaXMyCi0KLU1vbiBPY3QgIDUgMDk6Mjg6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkgZml4IGk5NjArbm9uLWJmZCBjb2ZmIGJpdCByb3QuCi0JKiBvYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCwgb2JqX2NvZmZfbG4sIG9ial9jb2ZmX2xpbmUpOgotCXN1cHBvcnQgZm9yIEMgc291cmNlIGxpc3RpbmdzLiAob2JqX2NvZmZfZW5kZWYpOiBsb29rIGluIHRoZSByaWdodAotCXBhcnQgb2YgdGhlIHN5bWJvbCBmb3IgdGhlIHN5bWJvbCBuYW1lCi0KLQkqIHRjLW02OGsuYyAoZ2V0X251bSk6IG1ha2UgaXQgd29yayBmb3IgYWxsIHNlZ21lbnRzLCBub3QganVzdCB0aGUKLQlmaXJzdCB0aHJlZS4KLQotTW9uIE9jdCAgNSAwMzozMDozNiAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGkzODYtKi1ic2QgZW11bGF0aW9uLgotCi1UaHUgT2N0ICAxIDIzOjA1OjEyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgdGhlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGZvciBob3N0IGFuZCB0YXJnZXQKLQotVHVlIFNlcCAyOSAxMjoyMjo1MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBkb24ndCBmaXh1cCBmb3IgdGhlIHo4awotCSogdGMtejhrLmM6IGxvdHMgb2YgYnVnIGZpeGVzCi0KLVR1ZSBTZXAgMjkgMTA6NTE6NTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0Yy1pOTYwLmgsIHRjLWk5NjAuYzogYXZvaWQgdGhlIEFOU0kgcHJlcHJvY2Vzc29yIGFkZGl0aW9uCi0JI2VsaWYsIHNpbmNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgb2xkIGNvbXBpbGVycy4KLQloby1yczYwMDAuaCwgdGMtbTY4ay5jOiB0aGUgbmF0aXZlIFJTLzYwMDAgY29tcGlsZXIgbWlzY29tcGlsZXMgYQotCWNvdXBsZSBvZiBleHByZXNzaW9ucyBpbiB0Yy1tNjhrLmMuCi0KLU1vbiBTZXAgMjggMjE6MTg6MjQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGNvbnMpOiBJZiBOT19SRUxPQyBpcyBkZWZpbmVkLCB1c2UgaXQuCi0KLQkqIHRjLWk5NjAuYyAoZ2V0X2NkaXNwKTogVXNlIE5PX1JFTE9DLCBub3QgMCwgaW4gY2FsbCB0byBmaXhfbmV3LgotCi1GcmkgU2VwIDI1IDE4OjE4OjUyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5oOiBpZiBNNjhLQ09GRiwgZGVmaW5lIERPVF9MQUJFTF9QUkVGSVggKHRvIHJlcXVpcmUKLQlsb2NhbCBsYWJlbHMgdG8gc3RhcnQgd2l0aCBhIC4pIGFuZCBzZXQgUkVHSVNURVJfUFJFRklYIHRvICUuCi0JdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IGFjY2VwdCBSRUdJU1RFUl9QUkVGSVggaWYgZGVmaW5lZC4KLQotRnJpIFNlcCAyNSAxNzo1Mzo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYzogIENvbW1lbnQgY2hhbmdlcy4KLQotRnJpIFNlcCAyNSAxNDoxMjo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3lyaWF0aC5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBUZXN0IGlmIF9fU1REQ19fIGlzIGRlZmluZWQgb25seSwgZG9uJ3QgdGVzdCBpdHMgdmFsdWUuCi0JKiBtZXNzYWdlcy5jOiBJZiBfX1NURENfXyBpcyBub3QgZGVmaW5lZCwgZGVmaW5lIE5PX1NUREFSRy4KLQotVGh1IFNlcCAyNCAxMjo0MjozMiAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChkZWJ1Z2dpbmdfcHNldWRvKTogQWRkIHN0YWJzIGFuZCBzdGFibiBhcyB0aGluZ3MgdG8KLQlpZ25vcmUuCi0KLVR1ZSBTZXAgMjIgMTM6MDI6MDcgMTk5MiAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IsZmlsbF9zZWN0aW9uKTogbm93IGFsbG9jYXRlIGFsbAotCXNlY3Rpb25zIHN0YXJ0aW5nIGZyb20gemVybywgcmF0aGVyIHRoYW4gbWFraW5nIHRoZW0gY29uc2VjdXRpdmUuCi0JVGhpcyBtYWtlcyBzdWJzZXF1ZW50IHJlbG9jIGNhbGN1bGF0aW9ucyBlYXNpZXIsIGVzcCBpZiB0aGUgb2JqZWN0Ci0JZm9ybWF0IGRvZXNuJ3QgdW5kZXJzdGFuZCBhZGRlbmRzLiAob2JqX2NvZmZfbGNvbW0pOiAobWF5YmUgdGVtcG9yYXJpbHkpCi0JYWxsb2NhdGUgbGNvbW0gaW4gLmRhdGEgcmF0aGVyIHRoYW4gaW4gLmJzcy4gIEl0IHNlZW1zIHRoYXQgc29tZQotCXRvb2xzIGNhbid0IGNvcGUgd2l0aCBhIG5vbi16ZXJvIHNpemVkIGJzcyBiZWZvcmUgbGlua2FnZS4KLQotVHVlIFNlcCAyMiAxNToxMDo1MSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYzogUmVwbGFjZSAiZW51bSBtNjhrX2FyY2hpdGVjdHVyZSIgd2l0aCAiaW50IgotCXRocm91Z2hvdXQuICBUaGF0IGVudW0gbm8gbG9uZ2VyIG1lYW5zIHdoYXQgd2UgdGhvdWdodCBpdCBtZWFudC4KLQotCSogdGMtbTY4ay5jIChtZF9hc3NlbWJsZSwgbWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldwotCSItbW5vLTY4OFs1OF0xIiBvcHRpb25zLgotCi0JKiB0Yy1tNjhrLmM6IEFkZGVkIENQVTMyIHN1cHBvcnQuCi0KLUZyaSBTZXAgMTggMDg6MDI6MTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYyAobTY4a19pcCk6IEFuKGRpc3ApIGlzIG5vdCBwYyByZWxhdGl2ZS4KLQotVHVlIFNlcCAxNSAxNzoyNTowNSAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5uZXcpOiBSZW1vdmUgZGVwZW5kZW5jZSBvbiBMT0NBTF9MT0FETElCRVMuCi0JQ2hhbmdlIExJQkRFUFMgZGVwZW5kZW5jZSB0byBMSUJTLgotCi1UdWUgU2VwIDE1IDE1OjMyOjAyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpZiAkKHRvb2xkaXIpIGV4aXN0cywgaW5zdGFsbCBhcyBpbgotCSQodG9vbGRpcikvYmluLgotCi1TdW4gU2VwIDEzIDIwOjMwOjEwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQWRkZWQgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRCBkZWZpbmUgdG8gZ2l2ZSBhbiBlcnJvciBpZiBhbnkKLQkud29yZCBpcyA8IC0zMjc2OCBvciA+IDMyNzY3LiAgVGhlIC1KIGZsYWcgY2F1c2VzIHRoZSBlcnJvciB0byBiZQotCWlnbm9yZWQuICBUaGlzIGlzIHRvIGNhdGNoIG92ZXItc2l6ZWQgc3dpdGNoZXMgZ2VuZXJhdGVkIGJ5IGdjYyBvbgotCXN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgYnJva2VuIC53b3JkIGhhY2suCi0JYXMuYyAobWFpbik6IHBlcm1pdCAtSiBpZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgotCXdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBjaGVjayBmb3Igc2lnbmVkIC53b3JkIG92ZXJmbG93IGlmCi0JV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IGZpeGVkIG1pc3NpbmcgcGFyZW5zIGluIGV4cHJlc3Npb24KLQljaGVja2luZyBmb3IgYnl0ZSBvciB3b3JkIG92ZXJmbG93LgotCi0JKiBvYmotY29mZmJmZC5oOiBkZWZpbmUgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQlvYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogY2hlY2sgZm9yIHNpZ25lZCAud29yZCBvdmVyZmxvdyBpZgotCVdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQuCi0KLQkqIG9iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBmaXhlZCBtaXNzaW5nIHBhcmVucyBpbgotCWV4cHJlc3Npb24gY2hlY2tpbmcgZm9yIGJ5dGUgb3Igd29yZCBvdmVyZmxvdy4KLQotRnJpIFNlcCAxMSAxMDoyMTowNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIGkzODYgY29mZgotCSogb2JqLWNvZmZiZmQuaCA6IGFkZGVkIHN0dWZmCi0JKiB0Yy1pMzg2LmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogbmV3IGZ1bmN0aW9uCi0JKiB0Yy1pMzg2LmggOiBuZXcgY29mZiBkZWZpbmVzCi0KLVRodSBTZXAgMTAgMDk6MjM6MTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wdXNoKTogY2FsbCBpbnB1dF9maWxlX2JlZ2luLCBub3QKLQlpbnB1dF9zY3J1Yl9iZWdpbi4KLQltZXNzYWdlcy5jIChhc19wZXJyb3IpOiBwcmludCAiOiAiIGJldHdlZW4gdGhlIHBhc3NlZCBpbiBlcnJvciBhbmQKLQl0aGUgc3RyZXJyb3IsIGxpa2UgcGVycm9yIGRvZXMuCi0KLVdlZCBTZXAgIDkgMTE6MDY6MjUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIGdhc190YXJnZXQgaW5zdGVhZCBvZiBtb2RpZnlpbmcgdGFyZ2V0X2NwdS4KLQlGcm9tIFN0ZXZlIENoYW1iZXJsYWluOgotCU1ha2VmaWxlLmluOiBIYW5kbGUgbTY4Ki0qLWNvZmYqLgotCXJlYWQuYywgcmVhZC5oOiBhZGQgbXVsdCBhcmd1bWVudCB0byBzX3NwYWNlCi0KLQkqIHRjLW02OGsuYyAobTY4a19pcCwgbTY4a19pcF9vcCwgZ2V0X251bSwgdHJ5X21vdG9faW5kZXgpOiBtZXJnZQotCSBNb3Rvcm9sYSBhbmQgTUlUIHN5bnRheDsgZ2FzIGNhbiBub3cgYXNzZW1ibGUgZWl0aGVyIHR5cGUgb2YKLQkgZmlsZS4KLQl0Yy1tNjhrbW90ZS5jLCB0Yy1tNjhrbW90ZS5oOiByZW1vdmVkIG5vdyBzdXBlcmZsdW91cyBmaWxlcy4KLQlGcm9tIFN0ZXZlIENoYW1iZXJsYWluOgotCW02OGtjb2ZmLm10OiBmb3IgbTY4ayBDT0ZGLgotCW9iai1jb2ZmYmZkLmM6IChmaXh1cF9tZGVwcykgYWRkZWQKLQkgKHNpemVfc2VjdGlvbikgcmVtb3ZlZCBiYWQgc2FuaXR5IGNoZWNrCi0JIChmaWxsX3NlY3Rpb24pIGFkZGVkIHJzX21hY2hpbmVfZGVwZW5kZW50IGNhc2UKLQkgKHdyaXRlX29iamVjdF9maWxlKSBjYWxsIGZpeHVwX21kZXBzCi0JIChmaXh1cF9zZWdtZW50KSBzZXQgZnhfc3Vic3kgdG8gMC4KLQlvYmotY29mZmJmZC5oOiBkZWZpbmUgV09SS0lOR19ET1RfV09SRCAodG9vIGhhcmQgdG8gc3VwcG9ydCkgYW5kCi0JIGhhbmRsZSBtNjhrLgotCXRjLW02OGsuYywgY29uZmlnL3RjLW02OGsuaDogYWRkZWQgbTY4ayBDT0ZGIHN1cHBvcnQgYW5kIE1vdG9yYWxhCi0JIHBzZXVkbyBvcHMuCi0KLVR1ZSBTZXAgIDggMTc6MTA6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTElCUyk6IEluY2x1ZGUgb3Bjb2RlIGxpYnJhcnkuCi0KLUZyaSBTZXAgIDQgMTg6MjA6NTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGdldF9udW0sIGNhc2UgU0VHX0JJRyk6IElmIG9ubHkgc21hbGwgaW50ZWdlcnMKLQlpbmNsdWRpbmcgemVybyBhcmUgYWNjZXB0ZWQsIHBhc3MgKzAuMC4KLQotU3VuIEF1ZyAzMCAyMToyNDo0NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYXAgImFzIiB0aHJvdWdoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgd2hlbgotCWluc3RhbGxpbmcuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogbWFwICJhcyIgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHdoZW4KLQlpbnN0YWxsaW5nLgotCi1TYXQgQXVnIDI5IDEyOjExOjEyIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFzLm5ldyk6IERlcGVuZCBvbiBMT0NBTF9MT0FETElCRVMuCi0KLUZyaSBBdWcgMjggMTY6MjU6MjIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBvYmotYm91dC5oLCBvYmotYm91dC5jIChvYmpfaGVhZGVyX2FwcGVuZCwgb2JqX3N5bWJvbF90b19jaGFycyksCi0JdGMtaTk2MC5jIChtZF9yaV90b19jaGFycyk6IEFsd2F5cyBvdXRwdXQgYm91dCBvYmplY3QgZmlsZSBpbgotCWxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciAodXNlZCB0byB1c2UgZW5kaWFubmVzcyBvZiBob3N0KS4KLQotVHVlIEF1ZyAyNSAxNTo1MDo0OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBOb3cgY29uc3QuICBBbHdheXMgaW5jbHVkZSA2ODg1MQotCWRhdGEsIHNvIHRoYXQgImJjIiBpcyBhdmFpbGFibGUgdG8gNjgwNDAgY2FjaGUgaW5zdHJ1Y3Rpb25zLgotCUFkZGVkICJ0dDAiLCAidHQxIiwgYW5kIDY4ZWMwMzAgdmFyaWFudHMuCi0JKG1kX2Fzc2VtYmxlKTogQ29tcGxhaW4gaWYgNjgwMDAgKG9ubHkpIGFuZCA2ODg4MSBhcmUgc3BlY2lmaWVkLgotCShlbnVtIF9yZWdpc3Rlcik6IEFkZGVkIFRUMCwgVFQxLgotCShtNjhrX2lwLCBjYXNlcyAnMycgYW5kICd0Jyk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlIGNvZGVzLiAgUGFzcwotCWxpbmUgbnVtYmVyIGNvcnJlY3RseSBpbiAiaW50ZXJuYWwgZXJyb3IiIG1lc3NhZ2VzLiAgRG9uJ3QgcHJpbnQKLQlhcmNoaXRlY3R1cmUtbWlzbWF0Y2ggbWVzc2FnZSBmb3Igb3BlcmFuZCBlcnJvcnMuCi0KLQlGcm9tIENvbGluIFNtaXRoIChjb2xpbkB3cnMuY29tKToKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2UgJ18nKTogVXNlIGFkZHdvcmQgdHdpY2UgcmF0aGVyCi0JdGhhbiBpbnN0YWxsX29wZXJhbmQuCi0KLVR1ZSBBdWcgMjUgMTU6MTM6NDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYyAoYnVmZmVyX2xpbmUpOiByZXdpbmQgdG8gdGhlIHN0YXJ0IG9mIGluY2x1ZGUKLQlmaWxlcywgdGhleSBtaWdodCBiZSBpbmNsdWRlZCB0d2ljZS4KLQotCSogejhrLmMsIHo4ay5oLCB6OGsubXQ6IHo4MDAwIHN1cHBvcnQgc3R1ZmYKLQotTW9uIEF1ZyAyNCAxMjo0NTo0MyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmVkIFRBUkdFVF9DUFUgZm9yIEMgY29kZSBzbyB0aGF0IGl0IGNhbiBjaG9vc2UKLQlvbmUgZWxlbWVudCBvZiBhIGZhbWlseS4KLQotCSogdGMtbTY4ay5jOiB1c2UgVEFSR0VUX0NQVSB0byBjaG9vc2UgZGVmYXVsdCBjcHUgdHlwZS4KLQotCSogdGUtZ2VuZXJpYy5oOiBkZWZhdWx0IHRvIExPQ0FMX0xBQkVMU19ET0xMQVIgYW5kIExPQ0FMX0xBQkVMU19GQgotCXNvIHRoYXQgd2UgY2FuIGFzc2VtYmxlIGhhbmQtd3JpdHRlbiBsaWJnY2MgY29kZS4KLQotRnJpIEF1ZyAyMSAxNDozODo0NCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3dhcm4pOiBVc2UgZnB1dHMsIG5vdCBmcHJpbnRmLCB3aXRoIGEgYnVmZmVyIHRoYXQKLQloYXMgYWxyZWFkeSBiZWVuIGZvcm1hdHRlZCAoYnV0IG1heSBzdGlsbCBjb250YWluICUtY2hhcmFjdGVycykuCi0JKGFzX2JhZCk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDE5IDExOjIwOjU5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jLCB0Yy1tNjhrbW90ZS5jOiB0aGUgY2FzMiBpbnN0cnVjdGlvbiBpcyBzdXBwb3NlZCB0byBiZQotCXdyaXR0ZW4gd2l0aCBpbmRpcmVjdGlvbiBvbiB0aGUgbGFzdCB0d28gb3BlcmFuZHMsIHdoaWNoIGNhbiBiZQotCWVpdGhlciBkYXRhIG9yIGFkZHJlc3MgcmVnaXN0ZXJzLiAgQWRkZWQgYSBuZXcgb3BlcmFuZCB0eXBlICdyJwotCXdoaWNoIGFjY2VwdHMgZWl0aGVyIHJlZ2lzdGVyIHR5cGUuICBBZGRlZCAnKCcgdG8gbm90ZW5kIHN0dWZmIGluCi0JdGMtbTY4a21vdGUuYyB0byBhY2NlcHQgKGEwKTooYTIpIGluIGNhczIgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBBdWcgMTkgMDk6MjU6MDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFzLmggKGVudW0gX3JlbGF4X3N0YXRlKTogU3RhcnQgb2ZmIGF0IG9uZSwgbm90IHplcm8sIHRvIGJldHRlcgotCWNhdGNoIHVuaW5pdGlhbGl6ZWQtdmFyaWFibGUgZXJyb3JzLgotCShsaW5rcmVsYXgpOiBEZWNsYXJlIG5ldyB2YXJpYWJsZS4KLQotCSogbWVzc2FnZXMuYyAod2FybmluZ19jb3VudCwgZXJyb3JfY291bnQpOiBEZWZhdWx0IGluaXRpYWxpemVyIGlzCi0Jc3VmZmljaWVudC4KLQotCSogd3JpdGUuYzogTWVyZ2VkIHNvbWUgZGVjbGFyYXRpb25zLCB1c2luZyBQQVJNUyBtYWNyby4KLQkodGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290LCBic3NfZnJhZ19yb290LCB0ZXh0X2xhc3RfZnJhZywKLQlkYXRhX2xhc3RfZnJhZyk6IE5vIGxvbmdlciBzdGF0aWMuCi0JKHdyaXRlX29iamVjdF9maWxlLCBjYXNlIHJzX2FsaWduIG9yIHJzX29yZyk6IElmIEhBTkRMRV9BTElHTiBpcwotCWRlZmluZWQsIGNhbGwgaXQuICBDaGFuZ2Ugc2VnbWVudHMgYmVmb3JlIGNhbGxpbmcgZml4dXBfc2VnbWVudC4KLQkocmVsYXhfYWxpZ24pOiBJZiBsaW5rcmVsYXgsIHByb3ZpZGUgZXh0cmEgcGFkZGluZy4KLQotCSogb2JqLWJvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBFbWl0IGFsaWdubWVudCByZWxvY3MgZGVzcGl0ZQotCXRoZWlyIG5vdCBoYXZpbmcgc3ltYm9scyBhc3NvY2lhdGVkLgotCi0JKiB0Yy1pOTYwLmMgKG5vcmVsYXgsIGluc3RydW1lbnRfYnJhbmNoZXMpOiBEZWZhdWx0IGluaXRpYWxpemVyIGlzCi0Jc3VmZmljaWVudC4KLQkobGlua3JlbGF4KTogRGVsZXRlIHZhcmlhYmxlIGRlZmluaXRpb24uCi0JKG1lbV9mbXQpOiBDYWxsIGZpeF9uZXcgd2l0aCBOT19SRUxPQy4KLQkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBIYW5kbGUgYWxpZ25tZW50IHJlbG9jcy4KLQkoaTk2MF9oYW5kbGVfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKiB0Yy1pOTYwLmggKGxpbmtyZWxheCk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkoSEFORExFX0FMSUdOKTogTmV3IG1hY3JvOyBjYWxscyBpOTYwX2hhbmRsZV9hbGlnbi4KLQkoTkVFRF9GWF9SX1RZUEUsIE5PX1JFTE9DKTogTmV3IG1hY3Jvcy4KLQotVHVlIEF1ZyAxOCAxNDo1OToyMSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NwYXJjLm10OiBOZXcgZmlsZS4gIEdyYWIgc3BhcmMgb3Bjb2RlIHRhYmxlIGZyb20gYmZkCi0JbGlicmFyeS4KLQotVHVlIEF1ZyAxOCAxNDoxNjozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4gIFJlbW92ZWQKLQlNSU5VU19HLCBzZXQgQ0ZMQUdTIHRvIGRlZmF1bHQgdG8gLWcsIGFkZGVkIEZMQUdTX1RPX1BBU1MsIHBhc3NlZAotCUZMQUdTX1RPX1BBU1MgdG8gcmVjdXJzaXZlIG1ha2VzLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotCi1Nb24gQXVnIDE3IDE1OjA5OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wb3AsIGlucHV0X3NjcnViX3B1c2gpOiBtZW1jcHkgd2FzCi0JYmVpbmcgdXNlZCB3aXRoIGFyZ3Mgc3dhcHBlZCwgY2F1c2luZyBvY2Nhc2lvbmFsIGxvc3NhZ2Ugd2hlbgotCXJlZmlsbGluZyBidWZmZXJzIGFmdGVyIGFuIGluY2x1ZGUgZmlsZS4KLQotTW9uIEF1ZyAxNyAxMzoxODo1MSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfdHNrdHNrKTogVXNlIGNvcnJlY3QgQU5TSSBmb3JtIGZvciBzdGRhcmcKLQl2ZXJzaW9uLiAgRGlzY2FyZCBib2d1cyBET05UREVGIHZlcnNpb24uCi0JKGFzX3dhcm4sIGFzX2JhZCwgYXNfZmF0YWwpOiBMaWtld2lzZS4KLQotRnJpIEF1ZyAxNCAxODozMToxNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IElmIGluc3RydWN0aW9uIGlzIGludmFsaWQgZm9yIHRoZQotCXNlbGVjdGVkIGFyY2hpdGVjdHVyZSwgcHJpbnQgYSBtZXNzYWdlIHNheWluZyBzbyBhbmQgbGlzdGluZyB3aGF0Ci0JcHJvY2Vzc29ycyBzdXBwb3J0IGl0LCByYXRoZXIgdGhhbiBzYXlpbmcgIm9wZXJhbmRzIG1pc21hdGNoIi4KLQotVGh1IEF1ZyAxMyAxMzo1MzoxOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYXMuaCBbQlJPS0VOX0FTU0VSVF06IElmIGRlZmluZWQsIHR1cm4gb2ZmIGFsbCBhc3NlcnRpb24gY2hlY2tzLgotCi0JKiBjb25maWcvaG8tcnM2MDAwLmggKE1fUlM2MDAwKTogRG9uJ3QgZGVmaW5lIGl0LgotCShmcmVlKTogRGVjbGFyZSBpdC4KLQkoQlJPS0VOX0FTU0VSVCk6IERlZmluZSBpdCBpZiBub3QgX19TVERDX18uCi0KLVR1ZSBBdWcgMTEgMTI6NTg6MTQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLm10OiBOZXcgZmlsZS4KLQotTW9uIEF1ZyAxMCAxNDozNzowOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jOiAiLmFsaWduIE4iIG1lYW5zIGFsaWduIHRvIE4tYnl0ZSBib3VuZGFyeSAqb25seSoKLQlpZiBUTl9TVU4zOyBvdGhlcndpc2UgYWxpZ24gdG8gMioqTi1ieXRlIGJvdW5hcnkuCi0KLVRodSBBdWcgIDYgMTI6MTA6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19maWxsKTogbWFrZSB0aGUgLmZpbGwgc2l6ZSBjbGFtcGVkIGVycm9yIGEgd2FybiBhbmQKLQlmaXggYnVnIHdoZXJlIDAncyB3ZXJlIGFsd2F5cyBwbGFjZWQuCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBpZiBhIDo4IGlzIHNlZW4gYWZ0ZXIgYW4gb3BlcmFuZCwgZmlsbCB0b3AKLQl0d28gYnl0ZXMgb2YgYW55IGNvbnN0YW50IHdpdGggMHhmZjoKLQotV2VkIEF1ZyAgNSAxMjowMjo0MCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogZml4IHRoZSAuYWxpZ24gdGhpbmcKLQl0aGUgcmlnaHQgd2F5OyBmb3IganVzdCB0aGUgNjhrLiBTdW4gMyAuYWxpZ24gaXMgbmJ5dGVzLCBub3QgcHR3by4KLQotV2VkIEF1ZyAgNSAwMTo1NDozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jICh0cnlfaW5kZXgpOiAgRXJyb3IgaWYgaW5kZXggc2NhbGluZyBzcGVjaWZpZWQgYW5kCi0JYXNzZW1ibGluZyBmb3IgYW4gb2xkZXIgQ1BVIHRoYW4gYSA2ODAyMC4KLQotU2F0IEF1ZyAgMSAxOToxMDoxMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogSWYgcGMtcmVsYXRpdmUsIHRha2UKLQlmeF9vZmZzZXQgaW50byBhY2NvdW50LgotCi1GcmkgSnVsIDMxIDIxOjUzOjI4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMgaG9zdCk6IEFjY2VwdCAidWx0cml4IiB3aXRoIHZlcnNpb24gbnVtYmVyLgotCi0JKiBleHByLmMgKGZsb2F0aW5nX2NvbnN0YW50KTogU2VwYXJhdGUgIj0tIiB0byBhdm9pZCBjb25mdXNpbmcKLQlhbmNpZW50IG9yIGJyb2tlbiBjb21waWxlcnMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBNaXNtYXRjaCBlcnJvciBjb3VsZCBhbHNvIGluZGljYXRlCi0JcHJvY2Vzc29yL29wY29kZSBtaXNtYXRjaCwgc28gcmV3b3JkIHRoZSBlcnJvciBtZXNzYWdlLgotCShtZF9hc3NlbWJsZSk6IElmIG5vIENQVSBoYXMgYmVlbiBzZXQgKGV2ZW4gaWYgRlBVL1BNTVUKLQljaGFyYWN0ZXJpc3RpY3MgaGF2ZSBiZWVuKSwgZGVmYXVsdCB0byA2ODAyMC4gIERvbid0IG5lZWQgZXh0cmEKLQlxdW90ZXMgYXJvdW5kIGVycm9yIHN0cmluZy4KLQotRnJpIEp1bCAzMSAxMjoyNjozNCAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFJldmVydCBzYWMncyBpbmNvcnJlY3QgY2hhbmdlIG1hZGUgSnVsIDEzLgotCUFsaWduIHJlYWxseSBpcyBzdXBwb3NlZCB0byBiZSBwdHdvIG5vdCBuYnl0ZXMuCi0KLU1vbiBKdWwgMjAgMDI6NTE6NTkgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogX0RvXyBpbmNsdWRlIGxpYmliZXJ0eS4gIChmcm9tIHNlZikKLQotRnJpIEp1bCAxNyAxNToxNToyOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogSGFuZGxlICIwZiIgYW5kICIwYiIgbGFiZWwgcmVmZXJlbmNlcwotCXByb3Blcmx5LgotCi1UaHUgSnVsIDE2IDA4OjIwOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogaWYgcmVsYXhpbmcsIGRvbid0IGRvIGFueXRoaW5nLgotCSogY29uZmlnL29iai1ib3V0LltjaF0gOiBtYWludGFpbiB0aGUgYV9yZWxheGFibGUgZmlsZSBoZWFkZXIgaW5mbwotCSogY29uZmlnL3RjLWk5NjAuYzogbmV3IG9wdGlvbiAtbGlua3JlbGF4Ci0KLU1vbiBKdWwgMTMgMTQ6MTE6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoZXhwcik6IGFsbG93IFNFR19CU1MgaW4gZXhwcmVzc2lvbnMKLQkqIHJlYWQuYyAocG90YWJsZSk6IGFsaWduIHNob3VsZCBiZSBuYnl0ZXMsIG5vdCBwdHdvIQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBleHRyYSBnbHVlIGZvciBuZXcgYnNzIGF0dHJpYnV0ZXMKLQkocmVsYXhfc2VnbWVudCk6IFNFR19CU1MgaXMgb2sgbm93Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogY2FuIG5vdyBwYXJzZSBtb3JlIEAoIG1vZGVzCi0KLU1vbiBKdWwgIDYgMTc6MDk6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogbWFyayAubGl0IHNlY3Rpb25zIGFzIFNUWVBfTElUCi0KLU1vbiBKdW4gIDEgMTY6MjA6MjIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgaGF2aW5nIHN1bjMgZW11bGF0aW9uIG1vZGUgZm9yCi0Jdnh3b3JrcyBlbnZpcm9ubWVudC4KLQotCi1UdWUgSnVuIDMwIDIwOjI1OjU0IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBwcm9ncmFtX3N1ZmZpeCAocGFyYWxsZWwgdG8gcHJvZ3JhbV9wcmVmaXgpCi0KLVdlZCBKdW4gMjQgMTA6NTc6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChwcm9jZXNzX2VzY2FwZSk6IG5ldyBmdW5jdGlvbiB0byBoYW5kbGUgZXNjYXBlcyB0aGUgcmlnaHQKLQl3YXksIChkb19zY3J1Yl9uZXh0X2NoYXIpOiB1c2UgbmV3IGZ1bmN0aW9uCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBkbyBpZmRlZi9pZm5kZWYgcmlnaHQKLQkqIHJlYWQuYyAoc19maWxsKTogbWFrZSB0aGUgLCBleHByZXNzaW9ucyBvcHRpb25hbCBsaWtlIHRoZSBkb2MKLQlzYXlzCi0JKiBjb25maWcvdGMtaDgzMDAuW2NoXTogYmV0dGVyIHdhcm5pbmdzCi0KLVR1ZSBKdW4gIDkgMDc6NTQ6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19iZWdpbik6IGNyZWF0ZSBic3MwX2ZyY2hhaW5QIGluIHRoZSBzYW1lIHdhcwotCWFzIGRhdGEwX2ZyY2hhaW5QCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogdmFyaW91cyBjaGFuZ2VzIHRvIGhhbmRsZSBkYXRhIGluCi0JdGhlIEJTUyBzZWdtZW50IGluIG11Y2ggdGhlIHNhbWUgd2FzIGFzIHN0dWZmIGluIHRoZSBEQVRBIHNlZ21lbnQuCi0KLQkqIHRjLW02OGsuYyAobTY4a2lwKTogRml4IHR5cG8gc28gdGhhdCBvbmx5IGFyY2gncyA+PTY4MDIwIGRvCi0JcGNyZWwgZGF0YSBzdHVmZi4gKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogd2hlbiByZWxheGluZyBhCi0JNjgwMTAgYnh4IGludG8gYSBicmErNiBqbXB4eCwgcHV0IHRoZSBieXRlcyBvZiB0aGUgam1wIG9wY29kZSBpbnRvCi0JdGhlIHJpZ2h0IHBsYWNlLiAoc19ic3MpOiBEb24ndCBwdXQgLmJzcyBzdHVmZiBpbnRvIFNFR19EQVRBLCBwdXQKLQlpdCBpbnRvIFNFR19CU1MKLQotVGh1IEp1biAgNCAxMTo1OToxMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jKGV4cHIpOiBhbGxvdyBTRUdfUkVHSVNURVIgaW4gZXhwcmVzc2lvbnMuCi0JKiByZWFkLmMocHNldWRvX3NldCk6IHJlZ2lzdGVyIGV4cHJlc3Npb25zIGNhbiBiZSB0aGUgc291cmNlIG9mIGEKLQlzZXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBOb3cgLVIgZm9yY2VzIGFsbCBjaGFuZ2VzIHRvIFNFR19EQVRBIHRvCi0JZ290byBTRUdfVEVYVCAoaWYgYS5vdXQpCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIGEub3V0IGRvbid0IHVzZSB0aGUgb2xkIHdheSBmb3IKLQktUi4KLQkqIGNvbmZpZy9vYmotYS5vdXQgKHNfc2VjdCk6IGNvbXBsYWluIGlmIHRoZSB1c2VyIHRyaWVzIHRvIHVzZSBhCi0Jc3Vic2VnbWVudCB3aXRoIGEgdmFsdWUgd2hpY2ggbWlnaHQgaW50ZXJmZXJlIHdpdGggb3V0IC1SIGhhY2tlcnkuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IGxvb2t1cCBuYW1lcyBpbiBzeW1ib2wgdGFibGUKLQlyYXRoZXIgdGhhbiB1c2UgdWdseSBpZiB0cmVlLiAoaW5pdF9yZWd0YWJsZSk6IGluc2VydCByZWdpc3RlcgotCW5hbWVzIGludG8gc3ltYm9sIHRhYmxlLgotCi1UdWUgSnVuICAyIDE2OjQ3OjA5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBrZWVwIHRoZSBmaXhfdGFpbCBjbGVhbiwgd2hpY2gKLQlmaXhlcyBhIGJ1ZyBpbiAtUiB3aGVyZSByZWxvY2F0aW9ucyB3ZXJlIGJlaW5nIGxvc3QuCi0KLU1vbiBKdW4gIDEgMTY6MjA6MjIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgaGF2aW5nIHN1bjMgZW11bGF0aW9uIG1vZGUgZm9yCi0Jdnh3b3JrcyBlbnZpcm9ubWVudC4KLQotU3VuIE1heSAzMSAwNTozMzowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgYW4gbTY4awotCi1UaHUgTWF5IDI4IDExOjIyOjAyIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgc3BhcmNsaXRlIGFzIGEgc3BhcmMgdmFyaWFudC4KLQotCSogdGMtc3BhcmMuYzogVXNlIG5ldyBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AgbWFjcm8uICBNZW50aW9uIG5ldwotCS1Bc3BhcmNsaXRlIGZsYWcuCi0KLVR1ZSBNYXkgMjYgMTY6NDc6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IGxpbnQKLQkqIGxpc3RpbmcuYywgZXhwci5jOiBwYXRjaGVzIGZyb20gQW5kcmV3IFNtaXRoCi0KLVRodSBNYXkgMTQgMTc6MjI6NDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVzZSBtNCByYXRoZXIgdGhhbiBnbTQuCi0KLU1vbiBNYXkgIDQgMTg6NTY6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmM6IHVzZSBpcyBhIHN5bm9ueW0gZm9yIHNlY3Rpb24sIChkb19yZWxvY3NfZm9yKToKLQljYWxjIHRoZSBiYXNlIG9mIHJlbG9jcyBjb3JyZWN0bHkuCi0JKiB0Yy1hMjlrLmMgKHBhcnNlX29wZXJhbmQpOiBhbGxvdyBleHByZXNzaW9ucyB0byBiZSBpbiBhbnkgc2VjdGlvbi4KLQotTW9uIEFwciAyNyAxMzoxMzozMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogYXMuYywgd3JpdGUuYzogdXNlIC1LIHJhdGhlciB0aGFuIC1rIGZvciB0aGUgYnJva2VuIHdvcmQgd2FybmluZwotCSAgb3B0aW9uLgotCi1UdWUgQXByIDIxIDEzOjM1OjMwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZG8gbm90IHByaW50IHJlY3Vyc2lvbiBsaW5lcy4KLQotV2VkIEFwciAxNSAyMToxOTozMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB0aGUgdG9vbGRpciBjb3B5IG9mIGdhcyBnb2VzIGRpcmVjdGx5IGluIHRvb2xkaXIuCi0KLVR1ZSBBcHIgMTQgMTQ6NTA6MjIgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRm9yIGIub3V0IGZvcm1hdCwgcm91bmQgdXAgc2VjdGlvbgotCXN0YXJ0IGFkZHJlc3NlcyB0byBtYXRjaCByZXF1aXJlZCBhbGlnbm1lbnQuCi0KLVRodSBBcHIgIDkgMDU6NDU6MjkgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogSW5zdGFsbCBpbnRvICQodG9vbGRpcikvYmluLCBzaW5jZSB0aGF0J3MKLQl3aGVyZSBnY2MgbG9va3MgZm9yIGl0LgotCi1UdWUgQXByICA3IDE1OjEyOjE1IDE5OTIgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZWQgc29tZSBsaW5lcyB0byBiZSBsZXNzIGNvbmZ1c2luZyBmb3Igc29tZQotCW1ha2VzLgotCi0JKiBpbnB1dC1maWxlLmM6ICBDb25kaXRpb25hbGl6ZSBvbiBfSU9GQkYsIG5vdCBWTVMuCi0KLQkqIHJlYWQuYywgd3JpdGUuYzogIENoYW5nZSBhIHNlcmllcyBvZiBpZmRlZi9lbGlmIHRvCi0JaWZkZWYvZWxzZS9pZmRlZiBldGMuCi0KLUZyaSBNYXIgMjcgMTI6MjE6MTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHN5bWJvbHMuYyAoZmJfbGFiZWxfaW5pdCk6IGZpeCBzaXplb2YgdG8gbWVtc2V0LgotCi1GcmkgTWFyIDEzIDE1OjQ1OjQ0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCB0aGUgbWFuIHBhZ2UuCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gTUFLRUlORk8gZXhwbGljaXRseSBvbiBpbmZvLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVzZSAkKE1BS0VJTkZPKSBub3QgbWFrZWluZm8uCi0KLUZyaSBNYXIgMTMgMDg6MDM6MDMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZsb251bS1jb25zdC5jOiByZW5hbWVkIGZsb251bS1rb25zdC5jIHRvIHN0b3AgZG9zIG5hbWUKLQljb25mbGljdC4KLQotVGh1IE1hciAxMiAwNDo0MjozOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5oLCB0ZS1zdW4zLmg6IG1vdmVkIExPQ0FMX0xBQkVMU19GQiBkZWZpbml0aW9uIGZyb20KLQkgIHRjLW02OGsuaCB0byB0ZS1zdW4zLmguCi0KLVdlZCBNYXIgMTEgMjM6MzI6NDIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdnh3b3JrczY4IGdldHMgdGUtc3VuMy5oLgotCi0JKiBleHByLmM6IHJlbW92ZSBsaW1pdGF0aW9uIHRoYXQgbG9jYWxfbGFiZWxzX2RvbGxhciBvcgotCSAgbG9jYWxfbGFiZWxzX2ZiIG11c3QgYmUgPCAxMC4KLQotCSogc3ltYm9scy5jOiByZW1vdmUgbG9jYWxfbGFiZWxzX2RvbGxhciwgcmVwbGFjZSB3aXRoIGEgZnVuY3Rpb24KLQkgIGludGVyZmFjZSBmb3IgYSBzcGFyc2UgYXJyYXkuICBBbGwgdXNlcnMgYWRqdXN0ZWQuCi0KLQkqIHRlLXN1bjMuaDogYWRkIExPQ0FMX0xBQkVMU19ET0xMQVIuCi0KLVNhdCBNYXIgIDcgMDA6MDY6MjUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGNvbW1lbnRlZCBvdXQgbGluZSBmb3IgYnVpbGRpbmcgYXMtYWxsLnRleGluZm8uCi0JICBUaGlzIGlzIHRlbXBvcmFyeS4KLQotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy1hbGwudGV4aW5mbzogYWRkZWQgbWVudSBpdGVtIGhvb2tzLgotCi1GcmkgTWFyICA2IDIxOjU3OjE4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UdWUgTWFyICAzIDE1OjQ1OjU2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LgotCi1TdW4gTWFyICAxIDA0OjQzOjE5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUue2MsaH0gKGZpeF9uZXcpOiBNYWtlIHRoZXNlIGRlY2xhcmF0aW9ucyBjb25zaXN0ZW50LgotCi1TYXQgRmViIDI5IDEzOjU5OjEwIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0cmVycm9yLm8pOiBBZGQgcnVsZSBzbyB0aGF0IGJyb2tlbiBTdW4gbWFrZSBjYW4KLQl3b3JrIGluIHN1YmRpcnMuCi0KLVdlZCBGZWIgMjYgMTk6MjY6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYywgb2JqLWNvZmZiZmQuYyA6IGZpeCBoODMwMCBzcGVjaWZpYyBiaXQgcm90Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IGlmIGNhbid0IHdvcmsgb3V0IHdoYXQgc29ydCBvZiBvcGVyYW5kIGl0IGlzLAotCXRoZW4gbG9vayB0aHJvdWdoIEZMVF9DSEFSUyBmb3IgYSBoaW50LgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotVHVlIEZlYiAyNSAxNDoxNzoxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jOiBJZiBhbiBleHByZXNzaW9uIGlzIHNpbmdsZSBjb21tYSwgdGhlbiByZXR1cm4gd2l0aAotCVNFR19BQlNFTlQgcmF0aGVyIHRoYW4gYW4gZXJyb3IgLSBzaW5jZSB0aGUgc3BhcmMgZnJvbnQgZW5kIGRvZXMKLQlyZWFsbHkgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0aGluZ3MgbGlrZSBmYmdlLGEKLQotCSogYXMuaDogaW5jbHVkZSBiZmQuaCBpZiB1c2luZyBtYW55IHNlY3Rpb25zCi0JKiBleHByLmM6IExPQ0FMX0xBQkVMU19GQiBoYWQgYmVlbiBjaGFuZ2VkIHRvIGxvd2VyIGNhc2UgLSBzbwotCWxvY2FsIGxhYmVscyBkaWRuJ3Qgd29yay4KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBkb24ndCBjb3JlIGR1bXAgd2hlbiB0aGVyZSdzIG5vCi0Jc3ltYm9sIHRoZXJlLgotCSogd3JpdGUuYywgd3JpdGUuaDogY2FsbCBmaXhfbmV3IHdpdGggdGhlIHJpZ2h0IG51bWJlciBvZiBhcmdzIG9uCi0JdGhlIEg4LgotCSogY29uZmlnL3RjLWg4MzAwLltjaF0gOiBmaXggYnVncyByZXBvcnRlZCBieSBITVNJLCBhbmQgbWFrZQotCWVycm9ycyBuaWNlcwotCi1TYXQgRmViIDIyIDEyOjI2OjI4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcHAuYzogTVJJIGNvbXBhdGliaWxpdHkgLSBhbGxvdyBzaW5nbGUgcXVvdGUgdG8gc3RhcnQgYSBzdHJpbmcuCi0JKiBhcy5jOiBmaXggdHlwbyByZWNlbnRseSBpbnRyb2R1Y2VkLgotCSogYXMuaCA6IERvbid0IGluY2x1ZGUgYW91dC9yZWxvYy5oIC0gaXQncyBub3QgcmlnaHQgZm9yIENPRkYhCi0JKiBleHByLmM6IE11Y2ggcmV3cml0aW5nLCB0byBhY2NvbW9kYXRlIE1SSSBzeW50YXggZm9yCi0JZXhwcmVzc2lvbnMuIEFsc28gZWFzaWVyIHRvIHJlYWQgbm93LgotCSogbGlzdGluZy5jOiBQdXQgYmFjayBkZWZ1bnMKLQkqIHJlYWQuYzogbW9kaWZpZWQgdG8gYWNjZXB0IE1SSSBzeW50YXgsIHB1dCBiYWNrIGxpc3RpbmcgcHNldWRvCi0Jb3BzIHNvIHRoYXQgYW4gYXNzZW1ibGVyIGJ1aWx0IHdpdGggTk9fTElTVElORyBpZ25vcmVzIGxpc3Qgb3BzCi0JcmF0aGVyIHRoYW4gcHVrZXMuCi0JKiB3cml0ZS5jLCB3cml0ZS5oOiBmaXhzIC0gb25seSBrZWVwIGEgcmVsb2MgdHlwZSBpbiBhIGZpeCBpZiB0aGUgdGFyZ2V0Ci0JbWFjaGluZSBpcyBhIFNQQVJDIG9yIGEgMjlLLgotCSogY29uZmlnL29iai1hb3V0LmM6IGFkZGVkIHNfc2VjdCBwc2V1ZG8gb3AKLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBsaW50cywgc2V0IHRoZSBmaWxlaGRyIGZsYWdzIHJpZ2h0IGFuZAotCWZpbGwgaW4gdGhlIHRpbWVzdGFtcC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBTaW5jZSB3ZSBkb24ndCBpbmNsdWRlIGFvdXQvcmVsb2MuaAotCWFueW1vcmUsIGRlZmluZSBhbGwgdGhlIHJlbG9jcyB3aGljaCB0aGUgdGMtPHg+IGJpdCB3aWxsIHVzZSBzbyB3ZQotCWNhbiB0cmFuc2xhdGUgZnJvbSB0aGVtIHRvIHRoZSBjb2ZmIHR5cGVzLgotCSogY29uZmlnL3RjLWEyOWsuYzogcmVsb2NfdHlwZSBpc24ndCBhbmUgZW51bSBhbnkgbW9yZQotCSogY29uZmlnL3RjLW02OGsuYzogQWRkZWQgTk9fUkVMT0MgZGVmaW5pdGlvbi4KLQotRnJpIEZlYiAyMSAwNjoyMTowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwdXQgaGVhZGVyIGZpbGVzIGJlZm9yZSBDIHNvdXJjZSBmb3IgVEFHUzsgcmVtb3ZlCi0JICByZWZlcmVuY2VzIHRvIG5vbi1leGlzdGVudCBzeXNjYWxscy5oLgotCi0JKiByZWFkLmMsIHdyaXRlLmMgc3Vic2Vncy5jOiBiYWNrIG91dCB0aGUgLmJzcyBjaGFuZ2VzLgotCi0JKiBvYmotYW91dC5jOiBkbyBub3QgaW5jbHVkZSBzdGFiLmdudS5oIGlmIE5PX0xJU1RJTkcuCi0KLQkqIHRjLWk4NjAuYywgYS5vdXQuZ251Lmg6IG1vdmUgaTg2MCByZWxvY3MgdG8gYSBwcm9wZXIgcGxhY2UuCi0KLQkqIGEub3V0Lmg6IHJlbW92ZWQuCi0KLUZyaSBGZWIgMjEgMDE6MDg6NDggMTk5MiAgTWluaCBUcmFuLUxlIChUUkFOTEVASU5URUxMSUNPUlAuQ09NKQotCi0JKiBzeW1ib2xzLmMgKGxvY2FsX2xhYmVsX25hbWUpOiBzeW1ib2xzIG5vdyBzdGFydCB3aXRoIF5BLgotCi0JKiByZWFkLmMsIHN1YnNlZ3MuYywgd3JpdGUuYyBvYmotY29mZi5jOiBhZGRlZCBoYW5kbGluZyBvZgotCSAgYC5ic3NgIHBzZXVkbyBvcCBmb3IgdW5pdGlhbGl6ZWQgZGF0YS4gVGhlIG5ldyBnY2MgKDEuMzcuOXgpCi0JICBnZW5lcmF0ZSB0aGVzZSBzZWN0aW9ucy4gIC5hbGlnbjogd2lsbCB1c2UgTk9QX09QQ09ERSBvciAwCi0JICBmb3IgcGFkZGluZy4gVGhpcyBpcyBqdXN0IGZvciBiZWluZyBuaWNlIHRvIHRoZQotCSAgZGlzYXNzZW1ibGVyLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBjaGFuZ2VkIHRvIGdlbmVyYXRlIGxvY2FsIGxhYmVsICJcMDAxTDAiCi0JICBzdGFydGluZyB3aXRoIGEgXkEgc28gdGhhdCBpdCBpcyByZWNvZ25pemVkIGFzIGEgbG9jYWwgbGFiZWwuCi0KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IHplcm8gYnNzX2ZpeF9yb290LCB0b28uCi0KLQkqIHRjLWkzODYuYzogdGMtaTM4Ni5jOiBhZGRlZCBoYW5kbGluZyBvZiB0aGUgZm9sbG93aW5nIG9wY29kZXM6Ci0JICBpL28gb3Bjb2RlcyAtIGluYiwgaW53LCBvdXRiIGFuZCBvdXR3LiAgc3RyaW5nIG1hbmlwdWxhdGlvbiB3aXRoCi0JICBhdHQgc3ludGF4IC0gc2NtcCwgc2xvZCwgc21vdiwgc3NjYSwgc3N0by4KLQotCSogb2JqLWNvZmYuYzogKGZvciBhaXgzODYpIE1vdmVkIHRoZSBzeW1ib2xzIC50ZXh0LCAuZGF0YSBhbmQgLmJzcwotCSAgdG8ganVzdCBhZnRlciAuZmlsZSAuCi0KLQkgIEluIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4oKSB3aGVyZSBpdCB0cmllcyB0byBwdXQgdGhlIGV4dGVybmFsCi0JICBzeW1ib2xzIGFwYXJ0LCB3aXRoIHRoZSBjb25kaXRpb246Ci0JICAgICghU19JU19ERUZJTkVEKHN5bWJvbFApICYmCi0JICAgICAhU19JU19ERUJVRyhzeW1ib2xQKSAmJgotCSAgICAgIVNGX0dFVF9TVEFUSUNTKHN5bWJvbFApKQotCSAgaXQgd2FzIG1vdmluZyB0b28gbWFueSBzeW1ib2xzIG91dC4gU28gSSBzd2l0Y2ggaXQgYmFjayB0byB0aGUKLQkgIGNvbmRpdGlvbjoKLQkgICAgKFNfR0VUX1NUT1JBR0VfQ0xBU1Moc3ltYm9sUCkgPT0gQ19FWFQgJiYgIVNGX0dFVF9GVU5DVElPTihzeW1ib2xQKSkKLQotCSAgSW4gb2JqX2VtaXRfcmVsb2NhdGlvbnMoKSBhZGRlZCB0aGUgY29uZGl0aW9uYWwgb24gS0VFUF9SRUxPQ19JTkZPCi0JICBzbyB0aGF0IHdlIGRvbid0IHVzZSB0aGUgRl9SRUxGTEcgd2hpY2ggbWFrZSB0aGUgbGlua2VyIGNvbXBsYWluCi0JICB0aGF0IHNvbWVib2R5IGhhcyBzdHJpcHBlZCB0aGUgcmVsb2NhdGlvbiBpbmZvLgotCi0JICBBbHNvLCB0aGUgQUlYIGxkIHByb2dyYW0gcmVxdWlyZSB0aGF0IHRoZSByZWxvY2F0aW9uIHRhYmxlCi0JICBpcyBzb3J0ZWQgYnkgcl92YWRkciBsaWtlIHRoZSBzdGFuZGFyZCBBVFQgYXNzZW1ibGVyIGRvZXMuCi0KLQkgIFtoZSBhbHNvIGNoYW5nZWQgdGhlIHNpemVvZihzdHJ1Y3QgLi4uKSdzIGludG8gdGhlIGNvZmYKLQkgIHN0eWxlIEZPT1NaIG1hY3Jvcy4gIEknbSBub3Qgc3VyZSB0aGlzIGlzIHJpZ2h0LCBidXQgSSBjYW4ndAotCSAgcmVtZW1iZXIgd2h5LiAgeG94b3JpY2guXQotCi1GcmkgRmViIDIxIDAxOjA4OjQ4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBkb2M6IHVzZSB0aGUgZG9jLiAgQnVpbGQgaXQsIGluc3RhbGwKLQkgIGl0LCBjbGVhbiBpdCwgZXRjLgotCi1UdWUgRmViIDE4IDAyOjIxOjI1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkLmM6IHdoaXRlIHNwYWNlIGFuZCBjb21tZW50cyBvbmx5LgotCi0JKiBjb25maWd1cmUuaW46IHVzZSB0aGUgbmV3IGF0b2YtbnMzMi5jIGZvciBuczMyay4KLQotCSogd3JpdGUuYzogY29tbWVudCBjaGFuZ2Ugb25seS4KLQotCSogdGMtbTg4ay5baGNdOiBwdWxsZWQgaW4gZnJvbSBoYWNrJ3MgdW5maW5pc2hlZCB3b3JrLiAgVGhlc2UKLQkgIGFyZW4ndCB5ZXQgaW50ZWdyYXRlZC4KLQotCSogdGMtaTg2MC5baGNdOiBibGV3IG9mZiB0aGUgZHVzdC4gIFNvbWV0aGluZyBtdXN0IHN0aWxsIGJlIGRvbmUKLQkgIGFib3V0IGNvbmZsaWN0aW5nIHJlbG9jYXRpb24gdHlwZXMuCi0KLQkqIHRjLW5zMzJrLmM6IFJlcGxhY2VkIHByZXZpb3VzIHRjX2FvdXRfZml4X3RvX2NoYXJzIHN0dWIgd2l0aCB0aGUKLQkgIHJlYWwgdGhpbmcuCi0KLQkqIHRjLWk5NjAuYywgdGMtc3BhcmMuYzogd2hpdGUgc3BhY2UgYW5kIGNvbW1lbnRzIG9ubHkuCi0KLQkqIHRjLWEyOWsuaDogZGVsZXRlIGR1cGxpY2F0ZSBtYWNybyBkZWZpbml0aW9uLgotCi0JKiBuZXcgZmlsZSBhdG9mLW5zMzJrLmMgY29waWVkIGZyb20gaGFjaydzIGxhc3QgdW5yZWxlYXNlZCBnYXMuCi0KLU1vbiBGZWIgMTcgMDc6NTE6MDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBhY3R1YWxseSBtYWtlIHRjX2FvdXRfZml4X3RvX2NoYXJzIHdvcmsKLQkgIHJhdGhlciB0aGFuIGFib3J0LgotCi0JKiBuZWFybHkgZXZlcnl0aGluZy4gIGZsdXNoIENoYW5nZUxvZywgcGFja2FnZSBhcyBnYXMtMS45Mi4xLgotCSAgQ2hhbmdlTG9nJ3MgcHJpb3IgdG8gdGhpcyBhcmUgc2tldGNoeSBhdCBiZXN0LiAgSSBoYXZlIGxvZ3MuCi0JICBUaGV5IGp1c3QgYXJlbid0IENoYW5nZUxvZ3MuCmRpZmYgLS1naXQgYS9nYXMvQ2hhbmdlTG9nLTk2OTcgYi9nYXMvQ2hhbmdlTG9nLTk2OTcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMmFmODIuLjAwMDAwMDAKLS0tIGEvZ2FzL0NoYW5nZUxvZy05Njk3CisrKyAvZGV2L251bGwKQEAgLTEsNTk2MCArMCwwIEBACi1XZWQgRGVjIDMxIDEyOjI5OjQ3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBDb3JyZWN0IGJyYW5jaCByYW5nZXMuCi0KLU1vbiBEZWMgMjIgMTM6MDY6MDUgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGkzODYqLWdvMzItcnRlbXMqKTogRml4IHRvIGJlIHRoZSBzYW1lIGFzCi0JaVszNDU2XTg2LWdvMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBEZWMgMjIgMTI6NTQ6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFRoZSA0NjUwIGRvZXNuJ3QgcGVybWl0IE1fTERDMV9BQiwKLQlNX1NEQzFfQUIsIE1fTF9ET0IsIE1fTF9EQUIsIE1fU19EQUIsIG9yIE1fU19ET0IuCi0JKG1pcHNfaXApOiBBbHdheXMgY2hlY2sgZm9yIEZQX0QsIG5vdCBqdXN0IGZvciBpbnN0cnVjdGlvbnMgdGhhdAotCWFyZSBub3QgcGFydCBvZiB0aGUgcmVndWxhciBJU0EuCi0KLVRodSBEZWMgMTggMTY6NDk6MjggMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoYnVpbGRfaW5zbik6IE1ha2UgYG51bWJlcicgYSBsb25nIGZvciA2NC1iaXQgaG9zdHMuCi0KLVRodSBEZWMgMTggMTY6NDI6NTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGNwdV90eXBlcyk6IDIxMTY0cGMvcGNhNTYgZG9lcyBub3QgaGF2ZSBDSVguCi0KLVdlZCBEZWMgMTcgMjE6MjM6MDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQgMzJiaXQgYmlnbnVtKTogTWFzayBvZmYgYml0cyBvdXRzaWRlCi0JdGhlIHJhbmdlIHdlIGNhcmUgYWJvdXQuCi0KLVdlZCBEZWMgMTcgMTU6Mjk6MDMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3Nob3J0b3B0cyk6IEFkZCAnbicgYW5kICdOJyBvcHRpb25zLgotCShleGVjX3R5cGVfZW51bSk6IEVudW1lcmF0aW9uIGdpdmluZyBhbGwgb2YgdGhlIGV4ZWMgdHlwZXMuCi0JKHdhcm5fbm9wcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUgdG8gZ2l2ZSBub3Agd2FybmluZyBsZXZlbC4KLQkoe2N1cixwcmV2fV9tdWwzMl9wKTogTmV3IHN0YXRpYyB2YXJpYWJsZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIKLQl0aGUgY3VycmVudC9wcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIDMyLWJpdCBtdWx0aXBseS4KLQkoT3B0aW1pemluZyk6IE1ha2Ugc3RhdGljLgotCShOT1B7MixfTEVGVCxfUklHSFR9KTogTWFjcm9zIGZvciB3b3JkIG9mIG5vcHMgYW5kIGxlZnQvcmlnaHQKLQlub3BzLgotCShkMzB2X2luc2VydF9vcGVyYW5kKTogRGVsZXRlIGRlY2xhcmF0aW9uIG9mIHVudXNlZCBmdW5jdGlvbi4KLQkod3JpdGVfMl9zaG9ydCk6IE1ha2UgZXhlY190eXBlIGFyZ3VtZW50IGVudW0sIG5vdCBpbnQuCi0JKHBhcmFsbGVsX29rKTogRGl0dG8uCi0JKGNoZWNrX3JhbmdlKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZShzKS4KLQkoYnVpbGRfaW5zbik6IERpdHRvLgotCShmaW5kX2Zvcm1hdCk6IERpdHRvLgotCShtZF9hcHBseV9maXgzKTogRGl0dG8uCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCAtbiBhbmQgLU4uCi0JKG1kX3BhcnNlX29wdGlvbik6IFBhcnNlIC1uIGFuZCAtTi4KLQkod3JpdGVfMV9zaG9ydCk6IElmIC1uLCB3YXJuIGFib3V0IGFkZGluZyBhIG5vcC4gIFVzZQotCU5PUF97TEVGVCxSSUdIVH0uCi0JKHdyaXRlXzJfc2hvcnQpOiBVc2UgZW51bWVyYXRpb24gdmFsdWVzIGluc3RlYWQgb2YgaGFyZCBjb2RlZAotCWludGVnZXJzLiAgUmVzZXQgZXhlY190eXBlIGZvciBkZWZhdWx0IG9wZXJhdGlvbnMuICBGb3IgZXhwbGljaXQKLQlwYXJhbGxlbCBvcGVyYXRpb25zLCBjYWxsIHBhcmFsbGVsX29rIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzCi0Jb2suICBJZiB3cml0aW5nIG91dCBhIHBhcmFsbGVsIG9wZXJhdGlvbiwgYW5kIHRoZSBwcmV2aW91cwotCWluc3RydWN0aW9uIHdhcyBhIDMyLWJpdCBtdWx0aXBseSwgaW5kaWNhdGUgY3VycmVudCBpbnN0cnVjdGlvbgotCWlzLgotCShwYXJhbGxlbF9vayk6IEFsbG93IGFkZC90eCAuLi4gdG8gYmUgZG9uZSBpbiBwYXJhbGxlbCB3aXRoCi0JYW5vdGhlciBhZGQvdHggLi4uIGFzc3VtaW5nIHRoZSBncHIgcmVnaXN0ZXJzIGRvbid0IG92ZXJsYXAuCi0JKG1kX2Fzc2VtYmxlKTogVXNlIGV4ZWMgdHlwZSBlbnVtZXJhdGlvbiB2YWx1ZXMsIG5vdCBoYXJkIGNvZGVkCi0JaW50cy4gIENoZWNrIGZvciBsb2FkcyBvciAxNi1iaXQgbXVsdGlwbGllcyBmb2xsb3dpbmcgaW4gdGhlIG5leHQKLQljeWNsZSBhZnRlciBhIDMyLWJpdCBtdWx0aXBseS4gIEFkZCBub3BzIGlmIHRoYXQgaXMgdGhlIGNhc2UuCi0JKGRvX2Fzc2VtYmxlKTogQ29weSBwcmV2X211bDMyX3AgdG8gY3VyX211bDMyX3AsIGFuZCBzZXQKLQljdXJfbXVsMzJfcCBpZiBjdXJyZW50IGluc3RydWN0aW9uIGlzIGEgMzItYml0IG11bHRpcGx5LgotCShmaW5kX2Zvcm1hdCk6IENoYW5nZSBzcGFjaW5nIGFuZCBsYXlvdXQuCi0KLVR1ZSBEZWMgMTYgMTY6NTU6NDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jICh0aWM4MF9yZWxheCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2xvbmdvcHRzKTogQWRkIG5ldyBPUFRJT05fUkVMQVggYW5kIE9QVElPTl9OT19SRUxBWCBvcHRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3IHJlbGF4IG9wdGlvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCBuZXcgcmVsYXggb3B0aW9ucy4KLQkoZmluZF9vcGNvZGUpOiBEb24ndCB1c2Ugc2hvcnQgZm9ybXMgb2YgUEMgcmVsYXRpdmUgYnJhbmNoZXMgaWYKLQl0aWM4MF9yZWxheCBpcyBzZXQuCi0KLVR1ZSBEZWMgMTYgMTU6MjY6MDMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogUmVtb3ZlIG5vbi1yZWdpc3RlciBiaXRzIGZyb20KLQl1c2VkL3NldCBmbGFnIGZpZWxkcy4gIE1ha2UgZmxhZyB2YXJzIHVuc2lnbmVkIGxvbmcuICBVc2UKLQlGTEFHX0F7MCwxfSBmb3IgYWNjdW11bGF0b3JzLiAgQWxsb3cgYW55IDIgaW5zbnMgdG8gYmUgZG9uZSBpbgotCXBhcmFsbGVsIGlmIHRoZXkgdXNlIHRoZSBzYW1lIGNvbmRpdGlvbmFsIGZsYWcgd2l0aCByZXZlcnNlZAotCW1lYW5pbmcuICBBbGxvdyAyIGFkZC9zdWIgaW5zbnMgdGhhdCBzZXQgdGhlIGNhcnJ5IG9yIG92ZXJmbG93Ci0JZmxhZ3MgYnV0IGRvIG5vdCBxdWVyeSB0aGVtIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwuICBEb24ndCBhbGxvdyAyCi0Jd29yZCBzdG9yZSBvcGVyYXRpb25zIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwgd2l0aCBBRERwcHAgb3IKLQlTVUJwcHAuICBEb24ndCBhbGxvdyBsb2FkcyB0byBiZSBkb25lIGluIHBhcmFsbGVsIHdpdGggMTYgYml0Ci0JbXVsdGlwbGllcy4KLQotVHVlIERlYyAxNiAwOToyMDo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IFByZXZlbnQgdXNlIG9mIGludGVyd29ya2luZyBzdXBwb3J0IGZvcgotCW5vbi1DT0ZGIHRhcmdldHMuCi0KLU1vbiBEZWMgMTUgMTU6MjA6MzIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FsbC50ZXhpOiBBZGQgTTMyUiBjcHUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBvZiBtMzJyIHByb2Nlc3Nvci4KLQotCSogZG9jL2MtbTMyci50ZXhpOiBOZXcgZmlsZSwgZG9jdW1lbnRpbmcgbTMyciBzcGVjaWZpYyBmZWF0dXJlcy4gIAotCi0KLU1vbiBEZWMgMTUgMTA6MzI6MjggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogQ29ycmVjdGx5IGluc2VydCAnUCcgb3BlcmFuZHMgaW50bwotCXRoZSBpbnN0cnVjdGlvbi4KLQotRnJpIERlYyAxMiAxMTo0NDoyMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBIYW5kbGUgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZQotCWxvbmcgKDMyIGJpdCkgUEMgcmVsYXRpdmUgb2Zmc2V0cy4gIEZpeCBwbGFjZXMgdGhhdCBwcmV2aW91c2x5Ci0JbWlzdXNlZCBSX01QUENSIGZvciAxNSBiaXQgb2Zmc2V0cyB0byB1c2UgdGhlIG5ldyBSX01QUENSMTVXIHR5cGUuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkZCBjYXNlIHRvIGhhbmRsZSBsb25nIFBDIHJlbGF0aXZlIG9mZnNldHMuCi0KLUZyaSBEZWMgMTIgMTA6MzU6MDEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBPcHRpb25zKTogRG9jdW1lbnQgc3VwcG9ydCBmb3IgbmV3IEFSTQotCXByb2Nlc3NvciBuYW1lcy4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgbmV3IEFSTQotCXByb2Nlc3NvciBuYW1lcy4KLQotVGh1IERlYyAxMSAxNzo0Njo1MCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRG9uJ3Qgb3ZlcndyaXRlIG9wY29kZSB0YWJsZSBkYXRhLgotCShpbnNvcCwgbTY4a19pcCk6IE1ha2UgYG9wY29kZScgY29uc3Qgc28gaXQgZG9lc24ndCBoYXBwZW4gYWdhaW4uCi0KLUZyaSBEZWMgIDUgMTE6MjM6NTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBGaXggQkZEX1JFTE9DXzMyIGFnYWluc3QgYQotCXN5bWJvbCArIG9mZnNldC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBVc2UKLQlTSFRfVjg1MF97U3xUfFp9Q09NTU9OIHRvIG1hcmsgc3BlY2lhbCBjb21tb24gc2VjdGlvbnMuCi0KLVR1ZSBEZWMgIDIgMTc6MDU6MTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogQnJvdWdodCB1cCB0byBkYXRlIHdpdGggdGhlIGJyYW5jaC4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChTV0lUQ0hfVEFCTEVfQ09OUyk6IEhhbmRsZSAoZml4KS0+Znhfc2l6ZSA9PSAxLgotCShTV0lUQ0hfVEFCTEUpOiBIYW5kbGUgQkZEX1JFTE9DXzguCi0JKG1kX2FwcGx5X2ZpeCk6ICNpZm5kZWYgQkZEX0FTU0VNQkxFUiBjb2RlOiBIYW5kbGUgZml4UC0+Znhfc2l6ZSA9PSAxLgotCShjb2ZmX3JlbG9jX21hcCk6IEFkZCBCRkRfUkVMT0NfOF9QQ1JFTCBlbnRyeS4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBTV0lUQ0hfVEFCTEUgY2FzZTogSGFuZGxlIEJGRF9SRUxPQ184LgotCi1TYXQgTm92IDIyIDE2OjE5OjIyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKHJhbmdlX3NpZ25lZF8xNiwgcmFuZ2Vfc2lnbmVkXzMyKTogV29yayBhcm91bmQgYW4KLQlhcHBhcmVudCBidWcgaW4gZ2NjJ3MgbG9uZyBsb25nIHN1cHBvcnQgY3Jvc3NpbmcgZnJvbSB4ODYuCi0KLVNhdCBOb3YgMjIgMTQ6MjY6MDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jOiBCcm91Z2h0IHVwIHRvIGRhdGUgd2l0aCBsYXRlc3QgY2hhbmdlcyBvbiBhcm0KLQlicmFuY2guIAotCi1TYXQgTm92IDIyIDE1OjUwOjA5IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWctZ2FzLmNvbTogR2V0IHZlcnNpb24gaW5mbyBmcm9tIGNvbmZpZ3VyZS5pbi4KLQotCSogbWFrZWZpbGUudm1zOiBpbmNsdWRlIGRlcGVuZC5vYmogaW4gT0JKUy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfc2VjdGlvbik6IFJlbW92ZSAiLmxjb21tIiBoYW5kbGluZy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2Jhc2VyZWdfY2xvYmJlcmVkKTogUmVtb3ZlIHZhcmlhYmxlIGFuZAotCWFsbCBjb3JyZXNwb25kaW5nIGNvZGUuCi0KLVRodSBOb3YgMjAgMTU6MDY6MDggMTk5NyAgUmljaGFyZCBFYXJuc2hhdyA8cmVhcm5zaGFAYXJtLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChUQVJHRVRfRk9STUFUIGZvciBnZW5lcmljIGEub3V0IHRhcmdldHMpOiBBbGxvdwotCXJ1bi10aW1lIGVuZGlhbiBzZWxlY3Rpb24uCi0KLVdlZCBOb3YgMTkgMTc6NDQ6NDIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHRjLXNoLmMgKHBhcnNlX3JlZyk6IFByb3Blcmx5IHF1b3RlIGZvciBmdjQuCi0KLVdlZCBOb3YgMTkgMjM6NDY6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogQWRkIG1pc3NpbmcgYnJlYWtzIGluIGNhc2Ugb24KLQlzeW1ib2wgdmFsdWUgb3BlcmF0b3IuCi0KLVR1ZSBOb3YgMTggMTg6NDU6MTQgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2ssIGZpbmRfb3Bjb2RlKTogCi0JU3BsaXQgT1BFUkFORF9GTEFHIGludG8gT1BFUkFORF9GRkxBRyBhbmQgT1BFUkFORF9DRkxBRy4KLQotU3VuIE5vdiAxNiAxMDowNTowNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDYXN0IHNlY29uZCBhcmcgb2YKLQltZF9hcHBseV9maXgzIGNhbGwgdG8gdHlwZSAidmFsdWVUICoiLgotCi1UaHUgTm92IDEzIDEzOjUzOjEwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogTWFrZSBGcmVlQlNEIGFuIGFvdXQgLyBpMzg2YnNkCi0gCXZhcmlhbnQuCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCQotVGh1IE5vdiAxMyAxMTowNzoxNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBVc2UgdGhlIG1lbWJlcnNoaXAgZmllbGQKLQlmb3IgSU5TTl9NQUNSTydzLgotCShtaXBzX2lwKTogU2FtZS4KLQotVGh1IE5vdiAxMyAwMjowNDo1NSAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEZvciBPUENPREVfRkFLRSwgYWRkIGNoZWNrIGZvcgotCWZpcnN0IGFyZ3VtZW50IGlmIGl0J3Mgc3VwcG9zZWQgdG8gYmUgYSByZWdpc3Rlci4KLQotVHVlIE5vdiAxMSAxOToyNTowNSAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiAgSWYgZDEwdiwgcmUtaW5zZXJ0IGEgc3BhY2UgYmVmb3JlCi0JYSAnIycgd2hlbiBpbiBzdGF0ZSAxMC4KLQotVHVlIE5vdiAxMSAxMzozMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBJbmNsdWRlICJzdWJzZWdzLmgiLgotCSh0Y19yZWxvY19tYW5nbGUpOiBIYW5kbGUgcmVmZXJlbmNlcyB0byBzeW1ib2xzIHdoaWNoIGFyZSBub3QKLQliZWluZyBvdXRwdXQsIHNvIHRoYXQgcmVmZXJlbmNlcyB0byBgLicgd29yay4KLQotTW9uIE5vdiAxMCAxMzo0MzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDYWxsIGFkZF9maXggd2hlbiBuZWVkZWQgZm9yICdfJwotCWNhc2UuCi0KLQkqIG1hY3JvLmMgKHN1Yl9hY3R1YWwpOiBJZiB3ZSBkb24ndCBmaW5kIGEgcGFyYW1ldGVyIGZvciBhbiAmLAotCWp1c3Qgc3Vic3RpdHV0ZSAmLgotCi1GcmkgTm92ICA3IDIxOjI5OjMyIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogSW4gZGVmYXVsdCBjYXNlLCBjYWxsIGFzX2JhZAotCWluc3RlYWQgb2YgZnByaW50ZiwgdG8gZ2V0ICJhc3NlbWJsZXIgbWVzc2FnZXM6IiBtZXNzYWdlIG91dHB1dAotCWJlZm9yZSBpbnN0ZWFkIG9mIGFmdGVyLgotCi1GcmkgTm92ICA3IDEwOjM2OjIyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmg6IEhhbmRsZSBtdWx0aXBsZSBpbmNsdXNpb24uCi0KLVdlZCBOb3YgIDUgMTA6NTE6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1LgotCSogYXMuaCAoc3RydWN0IGZyYWcsIGZyYWcgc3VwcG9ydCk6IE1vdmVkIGZyb20gaGVyZS4KLQkqIGZyYWdzLmg6IFRvIGhlcmUuCi0JKHN0cnVjdCBmcmFnLCBtZW1iZXIgdGNfZnJhZ19kYXRhKTogTmV3IG1lbWJlciBpZiBUQ19GUkFHX1RZUEUKLQlpcyBkZWZpbmVkLgotCShzdHJ1Y3QgZnJhZywgbWVtYmVyIGZyX2NnZW4pOiBSZW5hbWVkIGZyb20gZnJfdGFyZy5jZ2VuLgotCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFVwZGF0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXBkYXRlLgotCSogY29uZmlnL3RjLW0zMnIuaCAoVENfRlJBR19JTklUKTogUmVuYW1lZCBmcm9tIG1kX2luaXRfZnJhZy4KLQkobWRfY29udmVydF9mcmFnKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoVENfRlJBR19UWVBFKTogRGVmaW5lLgotCShmcmFnX29wY29kZV9mcmFnLGZyYWdfb3Bjb2RlX29mZnNldCxmcmFnX2Jzcik6IFVwZGF0ZS4KLQkoVENfRlJBR19JTklUKTogVXBkYXRlLgotCi1UdWUgTm92ICA0IDE2OjM1OjU3IDE5OTcgIElhbiBEYWxsICA8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KLQotCSogd3JpdGUuYyAocHJpbnRfZml4dXApOiBVc2UgVENfRklYX0RBVEFfUFJJTlQgKGlmIGRlZmluZWQpIHRvCi0JcHJpbnQgb3V0IE1EIGZpZWxkcyBvZiBmaXguCi0JKiBmcmFncy5jIChmcmFnX3ZhciwgZnJhZ192YXJpYW50KTogVXNlIFRDX0ZSQUdfSU5JVCBtYWNybyAoaWYKLSAJZGVmaW5lZCkgdG8gaW5pdGlhbGl6ZSBNRCBmaWVsZHMgaW4gZnJhZy4KLQkqIGFzLmggKHN0cnVjdCBmcmFnLCBuczMyayBzdXBwb3J0KTogUmVuYW1lIG5zMzJrIHRvIGZyX25zMzJrLgotCURlbGV0ZSBwY3JlbF9hZGp1c3QuICBBZGQgZnJfb3Bjb2RlX2ZyYWdQLCBmcl9vcGNvZGVfb2Zmc2V0LgotCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBjb21tZW50cy4gUmVtb3ZlIG9ic29sZXRlCi0gCUJGRF9GQVNUX1NFQ1RJT05fRklMTCBkZWZpbml0aW9uLCBjaGFuZ2UgcHJvdG90eXBlcyBmb3IKLSAJZml4X25ld19uczMyayBhbmQgZml4X25ld19uczMya19leHAgdG8gYWRkIG5ldyBhcmd1bWVudHMKLSAJb3Bjb2RlX2ZyYWcgYW5kIG9wY29kZV9vZmZzZXQgYW5kIHJlbW92ZSBwY3JlbF9hZGp1c3QuCi0JKFRDX0ZJWF9UWVBFKTogYWRkIG9wY29kZV9mcmFnUCBhbmQgb3Bjb2RlX29mZnNldCBmaWVsZHMuCi0JKFRDX0ZJWF9EQVRBX1BSSU5UKTogbmV3IG1hY3JvIHRvIHByaW50IG91dCBUQ19GSVhfVFlQRS4KLQkoVENfRlJBR19JTklUKTogbmV3IG1hY3JvIHRvIGluaXRpYWxpemUgbWFjaGluZSBkZXBlbmRlbnQgZmllbGQgaW4KLSAJZnJhZ3MuCi0JKGZyYWdfb3Bjb2RlX2ZyYWcsIGZyYWdfb3Bjb2RlX29mZnNldCwgZnJhZ19ic3IpOiBtYWNyb3MgdG8gYWNjZXNzCi0gCU1EIGZpZWxkcyBpbiBmcmFnIHN0cnVjdHVyZS4KLQkoZml4X2ltX2Rpc3AsIGZpeF9iaXRfZml4UCwgZml4X29wY29kZV9mcmFnLCBmaXhfb3Bjb2RlX29mZnNldCwKLSAJZml4X2Jzcik6IG1hY3JvcyB0byBhY2Nlc3MgTUQgZmllbGRzIGluIGZpeCBzdHJ1Y3R1cmUuCi0JKiBjb25maWcvdGMtbnMzMmsuYzogQXZvaWQgb3Zlcmxlbmd0aCBsaW5lcy4gQWxpZ24gY29tbWVudHMuICBEb24ndAotIAl1c2Ugc3RydWN0IG9wY29kZV9sb2NhdGlvbiBhcyB0aGVzZSBmaWVsZHMgYXJlIG5vdyBpbiB0aGUgZnJhZwotCXN0cnVjdHVyZS4KLQkoY29udmVydF9paWYpOiBDYWxsIGZyYWdfbW9yZSBhcyBpdCBpcyBuZWVkZWQgaW5zdGVhZAotIAlvZiB0cnlpbmcgdG8gYWxsb2NhdGUgZm9yIHRoZSB3aG9sZSBpbnNuLiBBdm9pZCBjYWxsIG9mIGZyYWdfbW9yZQotIAl3aXRoIG5lZ2F0aXZlIGFyZ3VtZW50LgotCShtZF9wY3JlbF9hZGp1c3QsIG1kX2ZpeF9wY3JlbF9hZGp1c3QsIG1kX2FwcGx5X2ZpeCwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfcGNyZWxfZnJvbSwKLQl0Y19hb3V0X2ZpeF90b19jaGFycyk6IHVzZSBhY2Nlc3NvciBtYWNyb3MgdG8gZ2V0IG1kIGZpZWxkcyBpbiBmaXgKLSAJYW5kIGZyYWcgc3RydWN0dXJlcy4KLQkoZml4X25ld19uczMyaywgZml4X25ld19uczMya19leHApOiBhZGQgbmV3IGFyZ3VtZW50cyBvcGNvZGVfZnJhZyBhbmQKLQlvcGNvZGVfb2Zmc2V0IGFuZCByZW1vdmUgcGNyZWxfYWRqdXN0LgotCShjb252ZXJ0X2lpZiwgY29uc19maXhfbmV3X25zMzJrKTogY2FsbCBmaXhfbmV3X25zMzJrLAotIAlmaXhfbmV3X25zMzJrX2V4cCB3aXRoIGNoYW5nZWQgYXJndW1lbnRzLgotCi1Nb24gTm92ICAzIDEzOjMwOjE3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1kX2JlZ2luKTogUmVvcmdhbml6ZSBzZXR0aW5nIG9mIGRlZmF1bHQgdmFsdWVzIHNvCi0JdGhhdCBtaXBzX2NwdSBkZXBlbmRzIG9uIFRBUkdFVF9DUFUsIGFuZCBtaXBzX29wdHMuaXNhIGRlcGVuZHMgb24KLQltaXBzX2NwdS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlIGFsbCBjb2RlIHRoYXQgc2V0cyBkZWZhdWx0czsgbWRfYmVnaW4KLQloYW5kbGVzIGFsbCBvZiB0aGlzIG5vdy4KLQotU3VuIE5vdiAgMiAxNDo0NjowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChTVEFHRVNUVUZGKTogQ2hhbmdlIGJpbl9QUk9HUkFNUyB0bwotCW5vaW5zdF9QUk9HUkFNUy4KLQkoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzIGluIHRoZQotCVRPQyBzZWN0aW9uIHRvIGJlIGFnYWluc3QgdGhlIGNzZWN0LgotCi1GcmkgT2N0IDMxIDE4OjE5OjU1IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jICh2YWxpZGF0ZV9taXBzX2luc24pOiBOZXcgZnVuY3Rpb24sIGNoZWNrcwotCW1hdGNoIHZlcnN1cyBtYXNrIGJpdHMsIGFuZCBhbHNvIHZlcmlmaWVzIHRoYXQgYWxsIGJpdHMgdG8gYmUKLQlvdXRwdXQgYXJlIGFjdHVhbGx5IHNwZWNpZmllZCBzb21ld2hlcmUuCi0JKG1kX2JlZ2luKTogQ2FsbCBpdCBmb3IgMzItYml0IGluc3RydWN0aW9ucywgaW5zdGVhZCBvZiBkb2luZwotCW1hdGNoL21hc2sgY2hlY2sgaGVyZS4gIEluIGNhc2Ugb2YgZmFpbHVyZSwgcHJpbnQgYSBtZXNzYWdlLCBidXQKLQljaGVjayB0aGUgcmVzdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGJlZm9yZSBleGl0aW5nLgotCi1UaHUgT2N0IDMwIDEzOjQ2OjIwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCB0aHVtYiBBRFIgcHNldWRvIG9wLiAgUGF0Y2gKLQlmcm9tIFRvbnkgVGhvbXBzb24gYXQgQVJNOiBhdGhvbXBzb0Bhcm0uY29tCi0KLVRodSBPY3QgMzAgMTE6MTE6MjYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBBbGxvdyBvZGQgcmVnaXN0ZXJzIGZvciBsZDJ3IGFuZAotCWZyaWVuZHMuCi0KLUZyaSBPY3QgMjQgMTU6NTY6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogV2hlbiBoYW5kbGluZyBAbCwgYWx3YXlzIHNpZ24KLQlleHRlbmQgaWYgdGhlIG9wZXJhbmQgZXhwZWN0cyBhIHNpZ25lZCB2YWx1ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUxTX0RPTExBUik6IERvbid0IGRlZmluZTsgdXNlCi0JZGVmYXVsdCB3aGljaCBpcyB0byBwZXJtaXQgZG9sbGFyIGxhYmVscy4KLQotRnJpIE9jdCAyNCAxMToxOToyMiAxOTk3ICBKYWt1YiBKZWxpbmVrICA8ampAc3Vuc2l0ZS5tZmYuY3VuaS5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX21lbW9yeV9tb2RlbCk6IE5ldyB2YXJpYWJsZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLVRTTy8tUFNPLy1STU8gb3B0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9ucyk6IEhhbmRsZSB0aGVtLgotCShzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IEZvciA2NCBFTEYsIHNldCByZXF1aXJlZAotCW1lbW9yeSBvcmRlcmluZyBpbiBlX2ZsYWdzLiBEZWZhdWx0IHRvIFJNTyBhbmQgbGV0IHRoZSB1c2VyCi0Jb3ZlcnJpZGUgaXQgdGhyb3VnaCBjb21tYW5kIGxpbmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyk6IEFkZC4KLQotV2VkIE9jdCAyMiAxNzo0MjoxMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodjlhX2Fzcl90YWJsZSk6IE5ldyB2YXJpYWJsZS4KLQkoc3BhcmNfaXApOiBIYW5kbGUgdjlhIGFzcidzLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1Pi4KLQotV2VkIE9jdCAyMiAxNzoyMjo1OSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaGFuZGxlX2FsaWduKTogSGFuZGxlIHJzX2FsaWduX2NvZGUuCi0JUGF0Y2ggZnJvbSBKYWt1YiBKZWxpbmVrIDxqakBzdW5zaXRlLm1mZi5jdW5pLmN6Pi4KLQotV2VkIE9jdCAyMiAxMjo1MToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9zbWFsbCk6IE5ldyB2YXJpYWJsZS4KLQkoT1BUSU9OX1NNQUxMKTogRGVmaW5lLgotCShtZF9sb25nb3B0cyk6IEFkZCAic21hbGwiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgT1BUSU9OX1NNQUxMLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtc21hbGwuCi0JKiBjb25maWcvdGMtc2guaCAoc2hfc21hbGwpOiBEZWNsYXJlLgotCShTVUJfU0VHTUVOVF9BTElHTik6IEhhbmRsZSBzaF9zbWFsbC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKTogQ2hlY2sgc2hfc21hbGwgaW4gVENfU0gKLQljYXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgY29uc3RhbnQgaW4gTV9MSV9ECi0JY2FzZSBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLVR1ZSBPY3QgMjEgMTA6MjA6MTEgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeDMsIGNhc2VzIC4uLl9INDQsIC4uLl9ISVgyMik6IExlYXZlCi0Jb3ZlcmZsb3cgc2lnbmFsbGluZyB0byBsaW5rZXIuCi0KLU1vbiBPY3QgMjAgMTQ6NTQ6MDYgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRml4IGZvciBkZWMgYy4KLQotCSogY29uZmlnLWdhcy5jb206IEdpdmUgZXhwbGFuYXRpb24gZm9yIGRlYyBjIHNldHVwIGluIGVycm9yCi0JbWVzc2FnZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IE1ha2UgLmNvbW0gc3ltYm9scyBzZXBhcmF0ZQotCXNlY3Rpb25zIG9uIG9wZW52bXMvYWxwaGEuCi0KLQkqIGNvbmZpZy9vYmotZXZheC5jOiBzdXBwb3J0IC53ZWFrIHBzZXVkby1vcAotCi1Nb24gT2N0IDIwIDEwOjEzOjMyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChkZWZhdWx0X2FyY2hfc2l6ZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHN0cnVjdCBzcGFyY19hcmNoKTogUmVuYW1lIGFyY2hfc2l6ZSB0byBkZWZhdWx0X2FyY2hfc2l6ZS4KLQlOZXcgbWVtYmVyIHVzZXJfb3B0aW9uX3AuCi0JKHNwYXJjX2FyY2hfdGFibGUpOiBBbHdheXMgaW5jbHVkZSB2OSwgdjlhLiAgTmV3IGVudHJ5IHY5LTY0LgotCShpbml0X2RlZmF1bHRfYXJjaCk6IENoZWNrIHdoZXRoZXIgZGVmYXVsdCBhcmNoIGlzIHZhbGlkLgotCVNldCBkZWZhdWx0X2FyY2hfc2l6ZSBpbiBhZGRpdGlvbiB0byBzcGFyY19hcmNoX3NpemUuCi0JKE9QVElPTl8zMixPUFRJT05fNjQpOiBEZWZpbmUuCi0JKG1kX2xvbmdvcHRzKTogTmV3IGVudHJpZXMgZm9yIC0zMiwgLTY0LgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgdGhlbS4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IHRoZW0uICBFbnN1cmUgaW5pdF9kZWZhdWx0X2FyY2ggY2FsbGVkLgotCSogY29uZmlndXJlLmluIChzcGFyYzY0KTogU2V0IGFyY2ggdG8gdjktNjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1TdW4gT2N0IDE5IDEzOjUwOjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoc3Vic2Vnc19maW5pc2gpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQl3cml0ZV9vYmplY3RfZmlsZS4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBTb21lIGNvZGUgbW92ZXMgaW50byBzdWJzZWdzX2ZpbmlzaC4KLQkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogRGVjbGFyZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHN1YnNlZ3NfZmluaXNoLgotCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IENoZWNrIGZvciBlcnJvciByZXR1cm4gZnJvbQotCWRlbWFuZF9jb3B5X3N0cmluZy4KLQotVHVlIE9jdCAxNCAyMDo1MDo1OCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGdldF9saW5lX3NiKTogQWNjZXB0IGFueSBlb2wgbWFya2VyIHdoaWxlIHNjYW5uaW5nIG1hY3Jvcy4KLQotVHVlIE9jdCAxNCAxOToxMjo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2FwcGx5X2ZpeCk6IE5vdGljZSBmeF9wY3JlbCBhbmQgc3Vic3RpdHV0ZQotCXRoZSBjb3JyZWN0IHJlbG9jYXRpb24gd2hlbiBpdCBleGlzdHMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0JKiBjb25maWcvdGMtdjg1MC5oOiBMaWtld2lzZS4KLQotRnJpIE9jdCAxMCAxNjowOTozNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogQWxsb3cgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gaXNzdWUKLSAJd2hlbiBzZWNvbmQgaW5zdHJ1Y3Rpb24gaXMgd3JpdGluZyB0byBmaXJzdCBpbnN0cnVjdGlvbnMgaW5wdXRzLgotCQotTW9uIE9jdCAxMyAxNToyNzoxNyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChQQUdFX1NJWkUpOiBEb3VibGUgdG8gOGsgYXMgYSBoYWNrIHRvIGFsbG93IHNvbWUgQysrCi0JdGVtcGxhdGVkIHByb2dyYW1zIHRvIGJ1aWxkIHdpdGggLWcuCi0KLUZyaSBPY3QgMTAgMTc6NDg6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcmVsYXhfdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgcmVsYXhpbmcKLQl1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgVGhpcyBwYXRjaCBpcyBjb3VydGVzeSBvZiBKaW0gV2lsc29uLiAKLQkobWRfY29udmVydF9mcmFnKTogRml4IHJlbGF4aW5nIG9mIGJyYW5jaGVzLiAgVGhpcyBwYXRjaCBpcwotCWNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uCi0JKG1kX2Fzc2VtYmxlKTogQ3JlYXRlIGRpZmZlcmVudCBmaXh1cHMgZm9yIGNvbmRpdGlvbmFsIGFuZAotCXVuY29uZGl0aW9uYWwgYnJhbmNoZXMuICBUaGlzIHBhdGNoIGlzIGNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRXN0aW1hdGUgc2l6ZSBvZiB2YXJpYWJsZSBwYXJ0IG9mCi0JZml4dXAgYmFzZWQgb24gd2hldGhlciBpdCBpcyBmb3IgYSBjb25kaXRpb25hbCBvciBhbiB1bmNvbmRpdGlvbmFsCi0JYnJhbmNoLiAgVGhpcyBwYXRjaCBpcyBjb3VydGVzeSBvZiBKaW0gV2lsc29uLgotCSh2ODUwX3NkYXRhLCB2ODUwX3RkYXRhLCB2ODUwX3pkYXRhLCB2ODUwX3Nic3MsIHY4NTBfdGJzcywKLQl2ODUwX3pic3MsIHY4NTBfcm9zZGF0YSwgdjg1MF9yb3pkYXRhLCB2ODUwX2Jzcyk6IEFkZCBjYWxsIHRvCi0Jb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCkuIAotCSh2ODUwX2NvbW0pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBuZXcgcHNldWRvIG9wcyAuemNvbW0sIC5zY29tbSBhbmQgLnRjb21tLgotCShtZF9iZWdpbik6IEFkZCBic3MgZmxhZyB0byBzZWdfaW5mbyBvZiBic3Mgc2VjdGlvbnMuCi0KLQlBZGQgc3VwcG9ydCBmb3IgLnNjb21tb24sIC50Y29tbW9uIGFuZCAuemNvbW1vbiBzZWN0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBBZGQgLnNjb21tb24sCi0JLnpjb21tb24sIC50YnNzLCAuY2FsbF90YWJsZV9kYXRhIGFuZCAuY2FsbF90YWJsZV90ZXh0LgotCi1GcmkgT2N0IDEwIDE1OjAxOjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMpOiBTZXQgREVGQVVMVF9BUkNIIGZyb20gY29ycmVjdCB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1GcmkgT2N0IDEwIDExOjIyOjQ1IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXhlcyB0byBtYWtlIHN1cmUgdGhlIEFUX1dPUkQKLQlleHByZXNzaW9uIGlzIG5vdCBjb25mdXNlZCB3aXRoIC0xLgotCi1GcmkgT2N0IDEwIDExOjU0OjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBGbGFnIFNQIGFzIG1vZGlmaWVkIGZvciBALXNwCi0gCW9wZXJhbmQgLSBPUEVSQU5EX0FUTUlOVVMuCi0KLUZyaSBPY3QgMTAgMDA6NDc6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogTm90ZSB0aGF0IGF1dG8gaW5jcmVtZW50IGFuZAotCWRlY3JlbWVudCBtb2RpZnkgdGhlIGluZGV4IHJlZ2lzdGVyLgotCi1UaHUgT2N0ICA5IDE1OjE3OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUm9iaW4gS2lya2hhbSA8Um9iaW4uS2lya2hhbUBtbGIuZG10LmNzaXJvLmF1PjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGFyY2hzKTogQWRkIDY4MzA2LCA2ODMwNywgNjgzMjIsIDY4MzU2LCA2ODMzNCwKLQk2ODMzNiwgNjgzNDEsIDY4MzQ5LgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLU9wdHMpOiBBZGQgLW02OGVjMDAwIC1tNjhoYzAwMCAtbTY4aGMwMDEKLQktbTY4MzA2LCAtbTY4MzA3LCAtbTY4MzIyLCAtbTY4MzU2LCAtbTY4ZWMwMjAsIC1tNjhlYzAzMCwKLQktbTY4ZWMwNDAsIC1tNjhlYzA2MCwgLW02ODMzMCwgLW02ODMzNCwgLW02ODMzNiwgLW02ODM0MSwKLQktbTY4MzQ5LgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKENQVV9ET0NTKTogRGVmaW5lLgotCShhcy5pbmZvKTogRGVwZW5kIHVwb24gJChDUFVfRE9DUykuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIEFNX1BST0dfSU5TVEFMTDsgaXQncyBjYWxsZWQgYnkKLQlBTV9JTklUX0FVVE9NQUtFLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgT2N0ICA5IDAxOjQ0OjM2IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHRjLWQxMHYuaCAoVENfU1RBUlRfTEFCRUwpOiBEb24ndCBkZWZpbmUuCi0JKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0KLVRodSBPY3QgIDkgMDA6MDc6MjMgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IEZpeCBidWcgdGhhdCB3b3VsZG4ndCBhbGxvdwotCXRvIHBhaXIgYSBicmFuY2ggYW5kIGxpbmsgd2l0aCBhbnl0aGluZyBidXQgYW4gZXhlIGluc3RydWN0aW9uLgotCi1XZWQgT2N0ICA4IDE2OjI4OjUzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBEaXNhYmxlIHRoZSBzeW0rY29uc3QgLmdvdAotCW9wdGltaXphdGlvbiB0byByZWR1Y2UgdGhlIGFsaWdubWVudCBzdXJwcmlzZXMgZm9yIGdjYy4KLQotV2VkIE9jdCAgOCAxNjoxMToxNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVENfU1BBUkMpOiBEb24ndCBkZWZpbmUgVEFSR0VUX0ZPUk1BVC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY190YXJnZXRfZm9ybWF0KTogSGFuZGxlIGNvZmYgaGVyZS4KLQkoc3BhcmNfaXApOiBBZGQgJWhpeCwlbG94LgotCShtZF9hcHBseV9maXgzKTogQ2FsbCBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0JQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19TUEFSQ197SElYMjIsTE9YMTB9LgotCSh0Y19nZW5fcmVsb2MpOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1NQQVJDX3tISVgyMixMT1gxMH0uCi0KLVdlZCBPY3QgIDggMTI6MzM6MzIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgYWxwaGEtKi0qIHRvIGFscGhhKi0qLSo7IGNvbmZpZy5ndWVzcyBub3cKLQlyZWNvZ25pemVzIGFscGhhZXY1IGV0Yy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE9jdCAgOCAwMDowNDowNSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBSZXBsYWNlIHRoZSBUQVJHRVRfQ1BVIHZhbHVlCi0Jb2YgbWlwc3IzOTAwIHdpdGggbWlwc3R4MzkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCBwcmludCB0aGUgJ29wY29kZSByZXF1aXJlcyAKLQktbWlwc1hYIG1lc3NhZ2UnIGlmIHRoZSBpbnNuIGlzbid0IGFuIElTQSBpbnNuLgotCi1UdWUgT2N0ICA3IDEyOjQ4OjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUIHN1cHBvcnQpOiBNb3ZlZCB0byB0Yy1zcGFyYy5jLgotCVJlZGVmaW5lIFRBUkdFVF9GT1JNQVQgdG8gY2FsbCBzcGFyY190YXJnZXRfZm9ybWF0LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX3Vuc2lnbmVkX3JhbmdlKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19hcmNoX3NpemUpOiBNYWtlIHN0YXRpYy4KLQkoc3BhcmNfdGFyZ2V0X2Zvcm1hdCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBEZWxldGUgdmFyaWFibGUgaW1tZWRpYXRlX21heC4gIFJld3JpdGUgJWhpL2V0YyByZWxvYwotCWhhbmRsaW5nLiAgQWRkIHN1cHBvcnQgZm9yICVoaCwlaG0sJWxtLCVoNDQsJW00NCwlbDQ0LgotCShvdXRwdXRfaW5zbik6IFNldCBgZnhfbm9fb3ZlcmZsb3cnLgotCShtZF9hcHBseV9maXgzKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ197NyxINDQsTTQ0LEw0NH0uCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICA2IDE0OjA0OjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfc2VjdGlvbik6IFJlbW92ZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogRW5oYW5jZSBlcnJvciBtZXNzYWdlLgotCi1GcmkgT2N0ICAzIDE1OjQwOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kZWYgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgYmVmb3JlCi0JaW5jbHVkaW5nIG9iai1lbGYuaCBpbiBPQkpfTUFZQkVfRUxGIGNhc2UuCi0JKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IFJldHVybiBOVUxMIGFmdGVyIGFib3J0IHRvIGF2b2lkIHdhcm5pbmcuCi0KLQkqIGVjb2ZmLmMgKGdlbmVyYXRlX2Vjb2ZmX3N0YWIpOiBSZW1vdmUgdW51c2VkIHN0YXRpYyBmdW5jdGlvbi4KLQotCSogZXhwci5jIChvcGVyYXRvcik6IEFjY2VwdCA9PS4gIEZyb20gQW5kZXJzIEJsb21kZWxsCi0JPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4uCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoZ2VuX3RvX3dvcmRzKTogV2hlbiBnZW5lcmF0aW5nIGEgZGVub3JtYWwKLQludW1iZXIsIGhhbmRsZSBhbiBvdmVyZmxvdyBpbnRvIHRoZSBzbWFsbGVzdCBub3JtYWxpemVkIG51bWJlci4KLQotTW9uIFNlcCAyOSAxNToyNDo1MiAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGFzLmgsIGlucHV0LXNjcnViLmMgKG5ld19sb2dpY2FsX2xpbmUpOiBOZXcgcmV0dXJuIHZhbHVlLgotCSogcmVhZC5jIChzX2FwcF9maWxlKTogRG9uJ3Qgbm90ZSB0aGUgc2FtZSBmaWxlIHNldmVyYWwgdGltZXMKLQlpbiBhIHJvdy4KLQotVGh1IFNlcCAyNSAxMzowODowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZW1vdmUgYCBvcGVyYW5kIHNwZWNpZmllci4KLQotV2VkIFNlcCAyNCAxNjo1NDo0MCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLWVsZiouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMjQgMTE6MzA6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSGFuZGxlIHEgYW5kIHYgb3BlcmFuZCBzcGVjaWZpZXJzLgotCi0JKiBkb2MvYy1pMzg2LnRleGkgKGkzODYtRmxvYXQpOiBSZW1vdmUgaW5jb3JyZWN0IGFzc2VydGlvbiB0aGF0Ci0JZm4qIGluc3RydWN0aW9ucyBkbyBub3QgaW5zZXJ0IGltcGxpY2l0IGZ3YWl0LiAgVGhpcyB3YXMgY2hhbmdlZAotCUphbiAyOSwgMTk5Ni4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAoeXlsZXgpOiBQZXJtaXQgYW4gZXhwcmVzc2lvbiB0byBiZSB1c2VkIGZvcgotCXRoZSBzY2FsZSBmYWN0b3IuCi0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9hc19uZXdfU09VUkNFUyk6IFNldCB0byBjb25maWcvbTY4ay1wYXJzZS55LAotCW5vdCBtNjhrLXBhcnNlLnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwIDIzIDE3OjQ4OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogQ2xlYXIgbXJpX3N0YXRlIGF0IGVuZCBvZiAubXJpCi0JcHNldWRvLW9wLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChoaWxvX2ludGVybG9ja3MpOiBDaGFuZ2UgZnJvbSBhIHN0YXRpYwotCXZhcmlhYmxlIHRvIGEgbWFjcm8sIHNvIHRoYXQgaXQgdmFyaWVzIHdpdGggdGhlIHZhcmlhYmxlcyB1cG9uCi0Jd2hpY2ggaXQgZGVwZW5kcy4KLQkoZ3ByX2ludGVybG9ja3MsIGNvcF9pbnRlcmxvY2tzKTogTGlrZXdpc2UuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSB0aGVtLgotCi1GcmkgU2VwIDE5IDE3OjA4OjQxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBVc2Ugc3RyY2FzZWNvbXAgaW5zdGVhZAotCW9mIHN0cmNtcCB3aGVyZSBhcHByb3ByaWF0ZS4KLQotVGh1IFNlcCAxOCAxNDoxMTo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcGUgd2l0aCBhIHplcm8gZGF0YSBhcmVhCi0JcmVsb2NhdGlvbiB3aXRoIGEgY29uc3RhbnQgb2Zmc2V0LgotCShtZF9hc3NlbWJsZSk6IFByb2R1Y2UgZXJyb3IgbWVzc2FnZSB3aGVuIHNwZWNpYWwgZGF0YSBhcmVhCi0JcmVsb2NhdGlvbnMgYXJlIHVzZWQgb24gaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZW0uCi0JKG1kX2Fzc2VtYmxlKTogUmVzZXQgcHJvY2Vzc29yIG1hc2sgaWYgZGVmaW5lZCBieSBjb21tYW5kIGxpbmUKLQlzd2l0Y2guIAotCi1UaHUgU2VwIDE4IDExOjI0OjAxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBSZW9yZ2FuaXplIGZpbGUuCi0JKHBhcnNlX2tleXdvcmRfYXJnKTogQWxsb3cgbnVtYmVycyBpbiByZWcgbmFtZXMuCi0JKFNQRUNJQUxfQ0FTRV9OT05FKTogTmV3IG1hY3JvLgotCShtZF9hc3NlbWJsZSk6IFVzZSBpdC4KLQkobG9va3VwX2FyY2gsaW5pdF9kZWZhdWx0X2FyY2gpOiBOZXcgZnVuY3Rpb25zLgotCShkZWZhdWx0X2FyY2gsZGVmYXVsdF9pbml0X3Asc3BhcmNfYXJjaF90YWJsZSk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzcGFyY19hcmNoX3NpemUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtYXhfYXJjaGl0ZWN0dXJlKTogSW5pdGlhbGl6ZSBpbiBpbml0X2RlZmF1bHRfYXJjaC4KLQkobWRfcGFyc2Vfb3B0aW9ucyk6IENhbGwgaW5pdF9kZWZhdWx0X2FyY2ggaWYgbmVjZXNzYXJ5LgotCVJld3JpdGUgLXhhcmNoLy1BIHByb2Nlc3NpbmcuCi0JKG1kX3Nob3dfdXNhZ2UpOiBQcmludCAtQSB2YWx1ZXMgZnJvbSBzcGFyY19hcmNoX3RhYmxlLgotCShtZF9iZWdpbik6IENhbGwgaW5pdF9kZWZhdWx0X2FyY2ggaWYgbmVjZXNzYXJ5LgotCShzcGFyY19tZF9lbmQpOiBIYW5kbGUgYm90aCAzMiBhbmQgNjQgYml0IGVudmlyb25tZW50cy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKTogTGlrZXdpc2UuCi0JKiBhY2NvbmZpZy5oIChTUEFSQ19WOSxTUEFSQ19BUkNINjQpOiBEZWxldGUuCi0JKERFRkFVTFRfQVJDSCk6IEFkZC4KLQkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMpOiBEZWZhdWx0IERFRkFVTFRfQVJDSCBiYXNlZCBvbiB0YXJnZXQgY3B1LgotCShTUEFSQ19WOSxTUEFSQ19BUkNINjQpOiBEZWxldGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWcvdm1zLWNvbmYuaCAoU1BBUkNfVjksU1BBUkNfQVJDSDY0KTogRGVsZXRlLgotCi1XZWQgU2VwIDE3IDE2OjU0OjIwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogUmVjb2RlZCB0byB1c2UgQ0hFQ0tfICgpCi0JbWFjcm8uIAotCShoYW5kbGVfdGRhb2ZmLCBoYW5kbGVfemRhb2ZmLCBoYW5kbGVfc2Rhb2ZmKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0ZWQgdHlwby4KLQkqIGNvbmZpZy90Yy12ODUwLmMgQWRkIG5ldyBzZWN0aW9uczogY2FsbF90YWJsZV9kYXRhIGFuZAotCWNhbGxfdGFibGVfdGV4dC4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBBZGQgc3VwcG9ydCBmb3IgY3RvZmYoKSByZWxvY2F0aW9uIHByZWZpeC4gCi0JKGhhbmRsZV9jdG9mZik6IE5ldyBGdW5jdGlvbi4KLQotCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBEb2N1bWVudCBjYWxsIHRhYmxlIHJlbG9jYXRpb25zLgotCi1UdWUgU2VwIDE2IDE0OjE4OjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogQWRkIHN1cHBvcnQgZm9yIGEgMTYgYml0Ci0JZGlzcGxhY2VtZW50IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi0KLU1vbiBTZXAgMTUgMjE6Mjg6MDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBNYWtlIGRlY2xhcmF0aW9uIG1hdGNoCi0JZGVmaW5pdGlvbi4KLQotTW9uIFNlcCAxNSAxODozMzowNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChwcm9jZXNzb3JfbWFzayk6IE5ldyB2YXJpYWJsZS4KLQkoc2V0X21hY2hpbmUsIG1kX3BhcnNlX29wdGlvbik6IFNldCBwcm9jZXNzb3JfbWFzay4KLQkobWRfYXNzZW1ibGUpOiBDaGVjayB0aGF0IGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSB0byB0YXJnZXQKLQlwcm9jZXNzb3IuIAotCi0JKiBjb25maWcvdGMtdjg1MC5oIChUQVJHRVRfUFJPQ0VTU09SKTogTmV3IGNvbnN0YW50LgotCi1Nb24gU2VwIDE1IDExOjI4OjA0IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gd29yayBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogRm9yIG12ZnN5cyBhbmQgbXZ0c3lzLAotCUNSIGlzIDAgZm9yIFBTV0wgYW5kIFBTV0guCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogRG9uJ3QgYWNjZXB0Ci0JaWxsZWdhbCBjb25kaXRpb24gY29kZXMgZm9yIGNtcHUgaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfRDMwVl85X1BDUkVMCi0JdXNlZCBpbiBkKmkgaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChjaGVja19zaXplKTogTmV3IGZ1bmN0aW9uLiAgQ2hlY2sKLQlyZWxvY2F0aW9ucyBmb3Igb3ZlcmZsb3dzLgotCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBGaXggcmVsb2NhdGlvbnMgYmV0d2VlbiBzZWN0aW9ucy4KLQkobWRfYXBwbHlfZml4Myk6IFVzZSBuZXcgcmVsb2NhdGlvbiB0eXBlcyBmb3IgMTUgYW5kIDIxCi0JYml0IHJlbG9jYXRpb25zIGluIHRoZSByaWdodCBjb250YWluZXIuIE5lZWRlZCBiZWNhdXNlCi0JdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBlaWdodC1ieXRlIGFsaWduZWQKLQlidXQgdGhlIHJlbG9jYXRpb25zIG11c3QgYmUuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0JKGZpbmRfZm9ybWF0KTogSWYgIi5zIiBvciAiLmwiIGFyZSB1c2VkLCBkb24ndCB0cnkKLQl0byBjb21wdXRlIGJyYW5jaCBzaXplcy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBDaGVjayBmb3IgIi5zIiBvcgotCSIubCIgZXh0ZW5zaW9ucyB0byBvcGNvZGUgbmFtZXMuCi0JKGZpbmRfZm9ybWF0KTogR2VuZXJhdGUgdGhlIGNvcnJlY3QgaW5zdHJ1Y3Rpb25zIHdoZW4KLQkiLnMiIG9yICIubCIgYXJlIHVzZWQuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBDaGVjayBmb3Igb2RkIHJlZ2lzdGVycwotCW9uIGluc3RydWN0aW9ucyB0aGF0IHJlcXVpcmUgZXZlbiByZWdpc3RlcnMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmggKG1kX3N0YXJ0X2xpbmVfaG9vayk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3N0YXJ0X2xpbmVfaG9vayk6IE5ldyBob29rLgotCUNoZWNrcyB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBmb3IgYSAiLiIuICBJZiBpdAotCWZpbmRzIG9uZSwgYXNzdW1lIGEgcHNldWRvLW9wIGFuZCBmbHVzaCBhbnkgdW53cml0dGVuCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogRml4IHByb2JsZW0KLQl3aXRoIGRldGVybWluaW5nIHdoZW4gZml4dXBzIHdlcmUgZG9uZS4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEZpeCBidWcgd2hlcmUgdGhlIG51bWVyaWMKLQlwYXJ0IG9mIGEgc3ltYm9sIChmb3IgZXhhbXBsZSwgImZvbys4Iikgd2FzIGJlaW5nIHdyaXR0ZW4KLQlpbnRvIHRoZSBpbnN0cnVjdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlIC53b3JkIHRvIGJlIDMyIGJpdHMgYW5kIGFkZAotCS5od29yZCBhcyAxNiBiaXRzLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IENoZWNrIHRvIHNlZSBpZiBmaXJzdAotCWluc3RydWN0aW9uIGlzIGEganVtcC4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBNYWpvciBjb2RlIHJlb3JnYW5pemF0aW9uLgotCi1XZWQgU2VwIDEwIDEwOjA3OjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdGVkIHNwZWxsaW5nIG1pc3Rha2UuCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgdjg1MCBlbXVsYXRpb24uCi0KLVR1ZSBTZXAgIDkgMTc6MTQ6MzMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENQVV9UWVBFUyk6IEFkZCBhcmMuCi0JKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIHRjLWFyYy5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCB0Yy1hcmMuaC4KLQkoZGVwZW5kZW5jaWVzKTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXJjLSotZWxmKi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcvdGMtYXJjLltjaF06IE5ldyBmaWxlcy4KLQotVHVlIFNlcCAgOSAxMDoxOTozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IERvY3VtZW50IGhpMCgpIHJlbG9jIHByZWZpeC4KLQlDb3JyZWN0IGRlc2NyaXB0aW9uIG9mIGhpKCkgcmVsb2MgcHJlZml4LgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IERvY3VtZW50IG5ldyByZWxvYyBwcmVmaXguCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IEFkZCBoaWxvKCkgcmVsb2MgcHJlZml4LgotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DXzMyLgotCi0JKiBkb2MvYy12ODUwLnRleGk6IERvY3VtZW50IG5ldyBwc2V1ZG8gb3BzIGFuZCBjb21tYW5kIGxpbmUKLQlvcHRpb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChzZXRfbWFjaGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKC52ODUwKTogTmV3IHBzZXVkbyBvcC4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKC52ODUwZSk6IE5ldyBwc2V1ZG8gb3AuCi0JKiBjb25maWcvdGMtdjg1MC5jICgudjg1MGVhKTogTmV3IHBzZXVkbyBvcC4KLQkKLQotTW9uIFNlcCAgOCAyMzowODowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IC1hbGggYW5kIC1hbGQgZm9yIERXQVJGIDE6Ci0JKiBsaXN0aW5nLmMgKHN0cnVjdCBsaXN0X2luZm9fc3RydWN0KTogQWRkIGRlYnVnZ2luZyBmaWVsZC4KLQkobGlzdGluZ19uZXdsaW5lKTogSW5pdGlhbGl6ZSB0aGUgZGVidWdnaW5nIGZpZWxkLiAgSWYgRUxGLCBpZiB0aGUKLQlzZWN0aW9uIHN0YXJ0cyB3aXRoIC5kZWJ1ZyBvciAubGluZSwgc2V0IHRoZSBkZWJ1Z2dpbmcgZmllbGQgaW4KLQl0aGUgbGlzdGluZyBzdHJ1Y3R1cmUuCi0JKGRlYnVnZ2luZ19wc2V1ZG8pOiBBZGQgbGlzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBJZgotCXRoZSBkZWJ1Z2dpbmcgZmllbGQgaXMgc2V0LCBjb25zaWRlciBpdCB0byBiZSBhIGRlYnVnZ2luZyBwc2V1ZG8uCi0JSWYgRUxGLCBza2lwIGJsYW5rIGxpbmVzIGJldHdlZW4gZGVidWdnaW5nIGxpbmVzLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBJZiBFTEYsIGxvb2sgZm9yIGxpbmUgbnVtYmVycy4KLQkoc3RyaW5nZXIpOiBJZiBFTEYsIGxvb2sgZm9yIGZpbGUgbmFtZXMuCi0KLU1vbiBTZXAgIDggMTI6MzM6NDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IE9ubHkgdGVzdCBmb3Igb3ZlcmZsb3cKLQlpZiB0aGVyZSBpcyBubyBpbnNlcnQgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKFRBUkdFVF9NQUNISU5FKTogTmV3IGNvbnN0YW50LgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2luc2VydF9vcGVyYW5kKTogQWRkCi0JLW13YXJuX3Vuc2lnbmVkX292ZXJmbG93LiAKLQkobWRfYmVnaW4pOiBTZXQgQkZEIG1hY2hpbmUgbnVtYmVyIGJhc2VkIG9uIG1hY2hpbmUgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCAtbXY4NTAsIC1tdjg1MGUgYW5kIC1tdjg1MGVhIG9wdGlvbnMuCi0KLU1vbiBTZXAgIDggMTE6MjA6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oOiBEb24ndCBkZWNsYXJlIGFsbG9jYSBpZiBpdCBpcyBhIG1hY3JvLgotCSogbWFjcm8uYzogTGlrZXdpc2UuCi0KLVN1biBTZXAgIDcgMDA6MzA6MTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9wYXJzZV9vcHRpb24pOiBNb3ZlIG1bXSBvdXQgdG8gdG9wIGxldmVsIGFuZAotICAgICAgICByZW5hbWUgdG8gY3B1X3R5cGVzW10uCi0gICAgICAgIChzX2FscGhhX2FyY2gpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImFyY2giLgotCi0gICAgICAgICogY29uZmlnL3RjLWFscGhhLmMgKG1kX2JlZ2luKTogTWVyZ2UgdGhlIHR3byBsb29wcyB0aHJvdWdoIHRoZQotICAgICAgICBvcGNvZGUgdGFibGUuCi0gICAgICAgIChzX2FscGhhX3Byb2MpOiBBZGQgaW5pdGlhbCBTS0lQX1dISVRFU1BBQ0UuCi0gICAgICAgIChzX2FscGhhX3NldCk6IExpa2V3aXNlLiAgVXNlIGdldF9zeW1ib2xfZW5kIGluc3RlYWQgbG9jYWwgd2hpbGUgbG9vcC4KLQotU2F0IFNlcCAgNiAxOTozODoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChzX2xjb21tX2J5dGVzKTogQWRkIHByb3RvdHlwZSAoZm9yIHJlYWwgdGhpcyB0aW1lKS4KLQotVGh1IFNlcCAgNCAxMjoxMDowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IE9ubHkgc2V0IEJTRl9PQkpFQ1QgZm9yCi0Jc3ltYm9scyBvbiBJcml4LgotCi1XZWQgU2VwICAzIDExOjIxOjMzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAxODozMjozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgYXJleAotCXJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogU2ltaWxhcmx5LgotCi1UdWUgU2VwICAyIDE1OjU4OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLXY4NTAudGV4aTogRXhwbGFuYXRpb25zIG9mIG9mZnNldHMgaW4gU0RBL1pEQSBhcmVhcwotCWNvcnJlY2V0ZC4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEFkZCBzdXBwb3J0IGZvciBTREEvVERBL1pEQSBzZWN0aW9ucy4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBEdXBsaWNhdGUgY29kZSBlbGltaW5hdGVkLiAgQWRkIGNvZGUgdG8KLQlyZWNvZ25pc2Ugc3BlY2lhbCBpbnN0cnVjdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogQ2FsY3VsYXRpb24gb2YgdGhlIHNpemUgb2YgYSBmaXh1cHMgY29ycmVjdGVkLgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IEFkZCBTREEvVERBL1pEQQotCXNlY3Rpb25zLiAJCi0KLVR1ZSBTZXAgIDIgMTU6NDA6NTYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFVzZSBvcGNvZGUtPm5hbWUgaW5zdGVhZCBvZgotIAlvcGNvZGUtPm9wY29kZSBhcyB0aGUgc2VudGluYWwuIFplcm8gaXMgYSB2YWxpZCBvcGNvZGUuCi0KLVR1ZSBBdWcgMjYgMTY6NTE6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoTWFjaGluZSBEZXBlbmRlbmNpZXMpOiBBZGQgdjg1MCB0byBtZW51LgotCSogZG9jL2Mtdjg1MC50ZXhpOiBDaGFuZ2Ugbm9kZSBuYW1lIHRvIG1hdGNoIG90aGVyIGNoYXB0ZXIgbm9kZXMuCi0KLVR1ZSBBdWcgMjYgMDk6NDY6MjIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBDb3JyZWN0IG5hbWUgZm9yIHRpbnkgZGF0YSBhcmVhCi0JcG9pbnRlci4gCi0KLVR1ZSBBdWcgMjYgMTI6MjM6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJZiBCRkQ2NCwgZG9uJ3QgbWFrZSBhIGJpZ251bSBpZiB0aGUKLQludW1iZXIgd2lsbCBmaXQgaW4gNjQgYml0cy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IENoZWNrIGV4cGxpY2l0bHkgZm9yIE9fYmlnLAotCXJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLQkqIGFzLmg6IERvbid0IGRlZmluZSBhbGxvY2EgaWYgX19HTlVDX18uICBKdXN0IGRlY2xhcmUgaXQuCi0JKiBtYWNyby5jOiBDb3B5IGFsbG9jYSBoYW5kbGluZyBmcm9tIGFzLmguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IENvcnJlY3QgMTYgYml0IG5vb3BzLiAgRnJvbQotCUdhYnJpZWwgUGF1YmVydCA8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBJbiBKdW1wQnl0ZSBjYXNlLCB3aGVuIGxvb2tpbmcKLQlmb3IgYSBXT1JEX1BSRUZJWF9PUENPREUsIGNoYW5nZSBpdCB0byBBRERSX1BSRUZJWF9PUENPREUgaWYgdGhpcwotCWlzIGpjeHogb3IgYSBsb29wIGluc3RydWN0aW9uLgotCi1Nb24gQXVnIDI1IDE2OjA0OjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCAnaHAnIGFzIGFsaWFzIGZvcgotCXIyLgotCShtZF9iZWdpbik6IFNldCB1cCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgdHlwZS4KLQotTW9uIEF1ZyAyNSAxNDoyNTo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBTdG9yZSB0aGUgdmFsdWUgYmFjayBpbnRvIHRoZQotCXN5bWJvbCBleHByZXNzaW9uLCB0byBoYW5kbGUgYWRkIG9yIHN1YnRyYWN0IHNpbXBsaWZpY2F0aW9uCi0JY29ycmVjdGx5LiAgSGFuZGxlIE9fc3ltYm9sX3J2YS4gIEFkZCBkZWZhdWx0IGNhc2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2NoYW5nZV9jc2VjdCk6IFRlbXBvcmFyaWx5IGxvd2VyIHRoZQotCWNodW5rc2l6ZSB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IHN1YnNlY3Rpb24uCi0JKiBhcy5jIChjaHVua3NpemUpOiBJbml0aWFsaXplIHRvIHplcm8uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENoYW5nZSA1MDAwIHRvIGNodW5rc2l6ZSB3aGVuCi0JY2FsbGluZyBvYnN0YWNrX2JlZ2luLgotCi1Nb24gQXVnIDI1IDExOjIxOjQ4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogUmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgdXBvbgotCWV4aXQuIAotCQotCSogY29uZmlnL3RjLXY4NTAuYyAocGFyc2VfcmVnaXN0ZXJfbGlzdCk6IFN1cHBvcnQgY29uc3RhbnQKLQlleHByZXNzaW9ucyBhcyByZWdpc3RlciBsaXN0cy4KLQotTW9uIEF1ZyAyNSAxMDoxOTozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGk6IENoYW5nZSB0aGUgbWFqb3Igbm9kZSB0byB2ODUwIE1hY2hpbmUKLQlEZXBlbmRlbmNpZXMuIAotCi1GcmkgQXVnIDIyIDExOjE2OjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgaW5jbHVzaW9uIG9mIGMtdjg1MC50ZXhpCi0KLQkqIGRvYy9jLXY4NTAudGV4aTogTmV3IGZpbGUuCi0KLQkqIHJlYWQuYyAoaXNfZW5kX29mX2xpbmUpOiBNYWtlIE5VTCBjaGFyYWN0ZXIgYmUgY29uc2lkZXJlZCB0byBiZQotCWEgbGluZSB0ZXJtaW5hdG9yLgotCi1GcmkgQXVnIDIyIDEwOjQ1OjMzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHBhcnNlX3JlZ2lzdGVyX2xpc3QpOiBBZGQgc3VwcG9ydCBmb3IgY3VybHkKLQlicmFjZSBzeW50YXguCi0JKGNjX25hbWVzKTogQWRkICJlIiBhbmQgIm5lIiBjb25kaXRpb25zLgotCi1UaHUgQXVnIDIxIDExOjAwOjM2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFN1cHBvcnQgYSBkb3VibGUgZGFzaCBhcyBzdGFydGluZyBhCi0JY29tbWVudCB0aGF0IGV4dGVuZHMgdG8gZW5kIG9mIGxpbmUuCi0KLVRodSBBdWcgMjEgMTA6NTQ6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9zZWN0aW9uLCB2ODUwX2Jzcywgdjg1MF9vZmZzZXQpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKG1kX3BzZXVkb190YWJsZSk6IE5ldyBwc2V1ZG8gb3BzOiAuYnNzLCAub2Zmc2V0LCAuc2VjdGlvbgotCi1UaHUgQXVnIDIxIDAwOjU5OjUzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXBkYXRlIHJlY29yZGVkCi0JaW5zbiB3aGVuIGNoYW5naW5nIHRvIGEgZGlmZmVyZW50IGluc3RydWN0aW9uLgotCi1XZWQgQXVnIDIwIDAwOjQ1OjIwIDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogdGMtc2guYyAocGFyc2VfcmVnLCBnZXRfc3BlY2lmaWMsIGJ1aWxkX015dGVzKTogQWRkIFNINAotCWZsb2F0aW5nIHBvaW50IGV4dGVuc2lvbnMuCi0JKHBhcnNlX3JlZyk6IHBhcnNlIHNnciBhbmQgZGJyLgotCi1UdWUgQXVnIDE5IDE3OjA3OjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHN5c3RlbV9yZWdpc3Rlcl9uYW1lKTogU3VwcG9ydCBudW1iZXJzIGZvcgotCXN5c3RlbSByZWdpc3RlciBJRHMuCi0KLVR1ZSBBdWcgMTkgMDg6NTk6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19sY29tbV9pbnRlcm5hbCk6IFJlbmFtZWQgZnJvbSBzX2xjb21tLCBhZGRlZCBhcmcgdG8KLQlmbGFnIHdoZW4gYWxpZ25tZW50IGlzIGluIGJ5dGVzIGluc3RlYWQgb2YgcG93ZXIgb2YgMiwgYW5kIGNvZGUgdG8KLQl1c2UgdGhhdCBmbGFnIHRvIGNvbnZlcnQgYWxpZ25tZW50IHRvIGJ5dGVzLgotCShzX2xjb21tLCBzX2xjb21tX2J5dGVzKTogIE5ldyBoZWxwZXJzIHRoYXQgY2FsbCBzX2xjb21tX2ludGVybmFsLgotCSogcmVhZC5oIChzX2xjb21tX2J5dGVzKTogQWRkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIEFMSUdOTUVOVF9JTl9TX0ZMQUdTIGlzCi0JZGVmaW5lZCwgd3JpdGUgYWxpZ25tZW50IHRvIGFsaWdubWVudCBiaXRzIGluIHNlY3Rpb24gaGVhZGVyIHNfZmxhZ3MKLQlyYXRoZXIgdGhhbiB0aGUgc19hbGlnbiBmaWVsZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChBTElHTk1FTlRfSU5fU19GTEFHUyk6IERlZmluZSBmb3IgVENfVElDODAuCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfcHNldWRvX3RhYmxlKTogVXNlIHNfbGNvbW1fYnl0ZXMgZm9yIGJzcwotCXBzZXVkbywgaW5zdGVhZCBvZiBzX2xjb21tIHdoaWNoIHdhbnRzIGEgcG93ZXIgb2YgdHdvIGZvciBhbGlnbm1lbnQuCi0KLU1vbiBBdWcgMTggMjA6NDI6MjMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAoY2hlY2tfbWFjcm8pOiB1c2UgYWxsb2NhIGluc3RlYWQgb2YgeG1hbGxvYyB0byBwbHVnIGxlYWsuCi0KLU1vbiBBdWcgMTggMjA6MzM6MDYgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IEFkZCAtYW0uCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiKTogRG9uJ3QgYWRkIGxlYWRpbmcgXG4KLQlpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBvbmUuCi0JKiBsaXN0aW5nLmMgKHN0cnVjdCBsaXN0X2luZm9fc3RydWN0KTogQWRkIGxpbmVfY29udGVudHMuCi0JKGxpc3RpbmdfbmV3bGluZSk6IFB1dCB1bnVzZWQgYXJndW1lbnQgdG8gd29yazogaWYgbm9uLW51bGwsIHNhdmUgaXQuLi4KLQkobGlzdGluZ19saXN0aW5nKTogLi4uIGFuZCByZWd1cmdpdGF0ZSBkdXJpbmcgbGlzdGluZyBpbnN0ZWFkIG9mIGxpbmUKLQlmcm9tIGZpbGUuCi0JKiBsaXN0aW5nLmggKExJU1RJTkdfTUFDRVhQKTogTmV3IGRlZmluZS4KLQkoTElTVElOR19ORVdMSU5FKTogQXJndW1lbnQgaXMgTlVMTC4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgZXhwYW5kaW5nIG1hY3JvcywgYnJlYWsgdXAgaW5wdXQKLQlsaW5lcyBhbmQgcGFzcyB0aGVtIHRvIGxpc3RpbmdfbmV3bGluZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAtYWMgYW5kIC1hbS4KLQotCSogY29uZC5jIChzX2lmYyk6IEFkZCBtaXNzaW5nIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuCi0KLU1vbiBBdWcgMTggMTE6MjY6MzYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBuZXcgMTYgYml0IFBDCi0JcmVsYXRpdmUgcmVsb2MuCi0KLU1vbiBBdWcgMTggMTE6MjQ6MjEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIHN1cHBvcnRfdjg1MGUgZmxhZyBhbmQgY29tbWFuZCBsaW5lCi0Jb3B0aW9uLiAKLQkKLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQKLQotCSogY29uZmlndXJlIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldAotCi1Nb24gQXVnIDE4IDExOjI0OjIxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBzdXBwb3J0X3Y4NTBlYSBmbGFnIGFuZCBjb21tYW5kIGxpbmUKLQlvcHRpb24uIAotCQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQKLQotCSogY29uZmlndXJlIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQKLQotRnJpIEF1ZyAxNSAxNDowMDoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogRG9uJ3QgY2QgaW50byB0ZXN0c3VpdGUgdW50aWwgYWZ0ZXIKLQlzZXR0aW5nIEVYUEVDVCBhbmQgVENMX0xJQlJBUlkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYXMuaCAoZW51bSBkZWJ1Z19pbmZvX3R5cGUpOiBEZWZpbmUuCi0JKGRlYnVnX3R5cGUpOiBEZWNsYXJlLgotCSogYXMuYyAoZGVidWdfdHlwZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHNob3dfdXNhZ2UpOiBBZGQgLS1nc3RhYnMuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1nc3RhYnMuCi0JKiByZWFkLmMgKGdlbmVyYXRlX2FzbV9saW5lbm8pOiBSZW1vdmUuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE91dHB1dCBzdGFicyBkZWJ1Z2dpbmcgaWYgYXBwcm9wcmlhdGUuCi0JQ2hhbmdlIGNoZWNrcyBvZiBnZW5lcmF0ZV9hc21fbGluZW5vIHRvIGNoZWNrIGRlYnVnX3R5cGUuICBPbmx5Ci0JZ2VuZXJhdGUgRUNPRkYgZGVidWdnaW5nIGlmIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLgotCSogcmVhZC5oIChnZW5lcmF0ZV9hc21fbGluZW5vKTogRG9uJ3QgZGVjbGFyZS4KLQkoc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IERlY2xhcmUuCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBVc2UgZGVidWdfdHlwZSwgbm90IGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JRG9uJ3QgdHVybiBvZmYgZGVidWdnaW5nLgotCShhZGRfZmlsZSk6IFJlbW92ZSBvbGQgI2lmIDAgY29kZS4KLQkoZWNvZmZfbmV3X2ZpbGUpOiBTZXQgZGVidWdfdHlwZSwgbm90IGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JKGVjb2ZmX2RpcmVjdGl2ZV9lbmQpOiBEb24ndCBnZW5lcmF0ZSBzdGFicyBsaW5lIHN5bWJvbHMuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBEb24ndCBjaGVjayBzdGFic19zZWVuLiAgRG9uJ3Qgc2V0Ci0JZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkobGluZV9sYWJlbF9jbnQpOiBSZW1vdmUuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBSZW1vdmUuCi0JKiBlY29mZi5oIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMuMTogRG9jdW1lbnQgLS1nc3RhYnMuCi0KLVdlZCBBdWcgMTMgMTg6NTg6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUsIG1kX3Nob3dfdXNhZ2UsIG1kX3BhcnNlX29wdGlvbik6Ci0JQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSBpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlLCBtZF9zaG93X3VzYWdlLCBtZF9wYXJzZV9vcHRpb24pOgotCUFkZCBzdXBwb3J0IGZvciB2ODUwZSBpbnN0cnVjdGlvbnMuCi0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEZpeCBlcnJvciByZWNvdmVyeSB0byByZWxvYWQKLQl0ZXh0IG9mIGVudGlyZSBvcGNvZGUuIAotCi1UdWUgQXVnIDEyIDEwOjI3OjM0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRG9jdW1lbnQgcnNfbGViMTI4LgotCi1UdWUgQXVnIDEyIDEyOjE3OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgU0laRV9CWVRFCi0JaW4gQUJTTCBjYXNlLCByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgotCi1Nb24gQXVnIDExIDIxOjQ4OjAwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGVudW0gX3JlbGF4X3N0YXRlKTogQWRkIHJzX2xlYjEyOC4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBzbGViMTI4IGFuZCB1bGViMTI4LgotCShzaXplb2ZfKmxlYjEyOCwgb3V0cHV0XypsZWIxMjgsIGVtaXRfbGViMTI4X2V4cHIsIHNfbGViMTI4KTogTmV3Ci0JZnVuY3Rpb25zLgotCSogcmVhZC5oOiBVcGRhdGUgcHJvdG90eXBlcy4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBTdHJlYW1saW5lIHF1aXRlIGEgYml0LiAgUmV0dXJuCi0JdGhlIHN5bWJvbCB2YWx1ZSwgYWRkIGEgc2Vjb25kIEZJTkFMSVpFIGFyZ3VtZW50IHRoYXQgcHJldmVudHMgCi0JY2hhbmdlcyBmcm9tIGJlaW5nIGNvbWl0dGVkLiAgVXBkYXRlIGFsbCBjYWxsZXJzLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCwgcmVsYXhfc2VnbWVudCk6IEhhbmRsZSByc19sZWIxMjguCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgdGhlIG5ldyBwc2V1ZG9zLgotCi1TdW4gQXVnIDEwIDE0OjUxOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBBZGQgc2l0ZS5iYWssIHNpdGUuZXhwLCBzdGFnZSwKLQlzdGFnZTEsIGFuZCBzdGFnZTIuCi0JKERJU1RDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogZG9jL01ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDYgMDA6MzA6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiBpZiBlbmRpYW4gaXMgc2V0LgotCURvbid0IHNldCB0YXJnIG9yIGdhc190YXJnZXQuICBEZWZpbmUgU0NPX0VMRiBhbmQKLQlUQVJHRVRfU09MQVJJU19DT01NRU5UIHdoZW4gYXBwcm9wcmlhdGUuICBEb24ndCBzdWJzdGl0dXRlIGZvcgotCXRhcmdldF9mcmFnLgotCSogTWFrZWZpbGUuYW06IFJlbW92ZSBAdGFyZ2V0X2ZyYWdALgotCShJTkNMVURFUyk6IFJlbW92ZSAkKElOVEVSTkFMX0NGTEFHUyksICQoQ1JPU1MpLCAkKEhERUZJTkVTKSwgYW5kCi0JJChUREVGSU5FUykuCi0JKGRlcC1hbSk6IE1hcmsgYXMgcGhvbnkuCi0JKiBhY2NvbmZpZy5oOiBBZGQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQsCi0JYW5kIFNDT19FTEYuCi0JKiBjb25maWcvYXJtLWJpZy5tdCwgY29uZmlnL2FybS1saXQubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCwgY29uZmlnL21pcHMtbGl0Lm10OiBSZW1vdmUuCi0JKiBjb25maWcvcHBjLWJpZy5tdCwgY29uZmlnL3BwYy1saXQubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9wcGMtc29sLm10OiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NmNvZmYubXQsIGNvbmZpZy9tNjhrY29mZi5tdDogUmVtb3ZlLgotCSogY29uZmlnL204OGtjb2ZmLm10OiBSZW1vdmUuCi0JKiBjb25maWcvc2NvNS5tdDogUmVtb3ZlLgotCSogY29uZmlndXJlLCBjb25maWcuaW4sIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgpOiBOZXcgdGFyZ2V0LCB0bwotCWZ1cnRoZXIgdHJ5IHRvIGNpcmN1bXZlbnQgdGhlIC55LmggcnVsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXVnICA1IDEyOjMyOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZQotCXNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQotCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBQ19QUk9HX1lBQ0MsCi0JQUNfUFJPR19MRVgsIGFuZCBBQ19ERUNMX1lZVEVYVC4gIENhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLAotCUFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgRG9uJ3QgY2FsbCBDWV9DWUdXSU4zMiBvciBDWV9FWEVFWFQuCi0JKiBjb25maWcuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGJ5IGF1dG9oZWFkZXIuCi0JKiBjb25mLmluOiBSZW1vdmUuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UsIFZFUlNJT04sIGFuZCBVU0lOR19DR0VOLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBhcy5jIChwcmludF92ZXJzaW9uX2lkKTogQ2hhbmdlIEdBU19WRVJTSU9OIHRvIFZFUlNJT04uCi0JKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotdm1zLmM6IChXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiBMaWtld2lzZS4KLQkqIGRvYy9NYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBkb2MvTWFrZWZpbGUuaW4uCi0JKiBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmQuYyAoc19lbHNlKTogSWYgbm90IGxpc3RpbmcgZmFsc2UgY29uZGl0aW9uYWxzLCB0dXJuIGxpc3RpbmcKLQlvZmYgaW4gdGhlIGZhbHNlIGJyYW5jaCBvZiB0aGUgZWxzZS4KLQotTW9uIEF1ZyAgNCAxMToyODozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRml4IGhhbmRsaW5nIG9mIGEgZG91YmxlIGxvYWQgZnJvbSBhCi0Jc3ltYm9sIHBsdXMgYW4gb2Zmc2V0LgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogU2V0IGZNZXJnZSB0byAwIGZvciBhbiBGRFIgd2hpY2gKLQloYXMgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBzeW1ib2wuCi0KLVN1biBBdWcgIDMgMjM6MjM6NTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV91Y29ucyk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6IEFkZCB1bmFsaWduZWQgZGF0YSBwc2V1ZG9zIGZvciBEV0FSRi4KLQotVGh1IEp1bCAzMSAxNToxMzo0MyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSWdub3JlIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50Ci0JbGluZSBpZiB3ZSBlbmNvdW50ZXIgYW4gZXJyb3IuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogU2lnbiBleHRlbmQgY29uc3RhbnRzIHZhbHVlCi0JZm9yIGhpIGFuZCBoaTAgZXhwcmVzc2lvbnMuCi0JKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBFbmFibGUgcmFuZ2UgY2hlY2tpbmcgZm9yIGdlbmVyaWMgMTZiaXQKLQlvcGVyYW5kcy4KLQotVHVlIEp1bCAyOSAxNDoyMDo0MyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogVHVybiBvbiBmeF9ub19vdmVyZmxvdyBmb3IKLQlMTzE2LCBISTE2IGFuZCBISTE2X1MgcmVsb2NzLgotCi1Nb24gSnVsIDI4IDE4OjQxOjQxIDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNybyB0byBsb29rIGZvcgotICAgICAgICB3aW4zMiBkZXBlbmRlbmNpZXMuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0gICAgICAgICogTWFrZWZpbGUuaW46IEFkZCAkKEVYRUVYVCkgdG8gYWxsIGV4ZWN1dGFibGVzLgotCi1GcmkgSnVsIDI1IDEwOjU0OjQzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBJbXByb3ZlIHdhcm5pbmdzIGZvciBvdXQgb2YgcmFuZ2UKLQl1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IGFueXRoaW5nIHdpdGggYSBSUiUgb3IgTFIlCi0JZmllbGQgc2VsZWN0b3IuCi0KLVRodSBKdWwgMjQgMTU6MjE6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBDYXN0IHNwYXJjX29wY29kZXMgdG8gUFRSIGZvciBoYXNoX2luc2VydC4KLQotVGh1IEp1bCAyNCAxNzo1MToyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKGRlZmluZV9tYWNybyk6IE1ha2Ugc3VyZSB0aGUgaW5kZXggaXMgaW4gcmFuZ2UgYmVmb3JlCi0JY2hlY2tpbmcgZm9yICcoJy4KLQotVGh1IEp1bCAyNCAxMjoxMzoxOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBSZW1vdmUgImV4dGVuZGVkIiBhbmQgcmVwbGFjZSB3aXRoCi0gCSJmeCIgYW5kICJmeGZyYWciLiAgQWRkICJmZnJhZyIuICBDaGFuZ2UgY29kZSB0byBpbml0aWFsaXplIGFuZCB1c2UKLQl0aGUgcmlnaHQgZi9mZnJhZyBhbmQgZngvZnhmcmFnIHBhaXJzIHNpbmNlIGluc3RydWN0aW9uIG1heSBiZSBzcGxpdAotIAlhY3Jvc3MgZnJhZ3MuCi0KLVR1ZSBKdWwgMjIgMTg6Mzg6NTYgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBjb25maWcvdGUtZ28zMi5oIChVU0VfQUxJR05fUFRXTyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IElmIFVTRV9BTElHTl9QVFdPIGlzCi0JZGVmaW5lZCwgdXNlIHNfYWxpZ25fcHR3byBmb3IgLmFsaWduLgotCSogY29uZmlndXJlLmluIChpMzg2LSotbXNkb3NkamdwcCopOiBOZXcgdGFyZ2V0LgotCShpMzg2LSotZ28zMiopOiBTZXQgZW0gdG8gZ28zMiBhbmQgdGFyZyB0byBjb2ZmZ28zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEp1bCAyMiAxMjo0MTo0MCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobGFzdF9vcGNvZGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtZF9hc3NlbWJsZSk6IERvbid0IGlzc3VlICJGUCBicmFuY2ggaW4gZGVsYXkgc2xvdCIgd2FybmluZyBpZgotCXRoZSBkZWxheSBzbG90IGhhcyBiZWVuIGFubnVsbGVkLgotCi1UdWUgSnVsIDIyIDEzOjI1OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBDaGVjayBmb3IgUEMgcmVsYXRpdmUgcmVsb2MKLQljb2RlIGlmIEJGRF9BU1NFTUJMRVIuCi0KLU1vbiBKdWwgMjEgMDg6NTc6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChzeXN0ZW1fcmVnaXN0ZXJzKTogRml4IG9yZGVyaW5nIG9mIHJlZ2lzdGVycy4KLQotVHVlIEp1bCAxNSAxNjoyOTo1NCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBJbml0aWFsaXplIGV4dGVuZGVkIHdvcmQgdG8gemVybwotCXdoZW4gaXQgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotTW9uIEp1bCAxNCAyMzoxMDo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogUmVzdG9yZSBjaGVjayBvZiBmbXQgYXJndW1lbnQuCi0JKG1pcHNfaXApOiBGaXggSVNBIGNoZWNrcy4KLQotTW9uIEp1bCAxNCAxOTozMDo1NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBGaXggZW5kaWFubmVzcyBwcm9ibGVtIHdpdGgKLQlPX2JpZyBvcGVyYW5kcy4KLQotU3VuIEp1bCAxMyAyMDo0Mzo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNoZWNrX2Fic29sdXRlX2V4cHIpOiBDaGFuZ2Ugd2FybmluZyB0bwotCWVycm9yLgotCi1GcmkgSnVsIDExIDEwOjE4OjQ3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBSZWZpbmUgY29kZSB0byBjaGVjayBpZiBhbgotCWluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSBvbiBhIHBhcnRpY3VsYXIgY3B1IHZhcmlhbnQuCi0JKG1pcHNfaXApOiBMaWtld2lzZS4KLQotTW9uIEp1bCAgNyAyMjo1MzowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBDaGFuZ2UgaWZuZGVmCi0JT0JKX0FPVVQgdG8gaWZkZWYgT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4Myk6IFdoZW4gbWFuZ2xpbmcgMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jIGZvcgotCUJGRF9BU1NFTUJMRVIsIGhhbmRsZSBvbmUgRUxGIGNhc2UgZm9yIENPRkYgYXMgd2VsbCwgYW5kIGFkZCBhIFBFCi0JY2FzZS4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2Ugc3BlY2lhbCBjYXNlIGZvciBpMzg2LWNvZmYgdG8KLSAJbm90IGFwcGx5IGZvciBpMzg2LXBlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IE9ubHkgY291bnQgZml4dXBzCi0Jd2hpY2ggd2VyZSBub3QgZG9uZS4KLQkoY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogUmVuYW1lIGZyb20gY29mZl9mcm9iX2ZpbGUuCi0JKGNvZmZfZm9ybWF0X29wcyk6IEluaXRpYWxpemUgZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBmaWVsZCByYXRoZXIKLQl0aGFuIGZyb2JfZmlsZSBmaWVsZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX2Zyb2JfZmlsZSk6IERvbid0IGRlY2xhcmUuCi0JKGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlY2xhcmUuCi0JKG9ial9mcm9iX2ZpbGUpOiBEb24ndCBkZWZpbmUuCi0JKG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBTZXQgYmZkX2dhcyB0byB5ZXMgZm9yIGkzODYtKi1jeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEp1bCAgMiAxMjowNTowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTmV2ZXIgc3VidHJhY3Qgc2VjdGlvbgotCWFkZHJlc3MgZnJvbSBQQyByZWxhdGl2ZSByZWxvYyB3aGljaCB3aWxsIGJlIGZ1bGx5IHJlc29sdmVkLgotCi1UdWUgSnVsICAxIDE1OjIzOjA3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAocGFnZV90eXBlKTogUmVuYW1lZCBmcm9tIHBhZ2VfdCB0byBhdm9pZCBjb25mbGljdAotCXdpdGggaHB1eDEwIGhlYWRlciBmaWxlcy4KLQotTW9uIEp1biAzMCAxMjoyNzoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEphc29uIE1lcnJpbGwgPGphc29uQGN5Z251cy5jb20+OgotCSogcmVhZC5jIChkb19hbGlnbik6IElmIEJGRF9BU1NFTUJMRVIsIG9ubHkgdXNlIE5PUF9PUENPREUgaWYKLQlTRUNfQ09ERSBpcyBzZXQuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9tYXliZV90ZXh0KTogRGVmaW5lLgotCShtZF9kb19hbGlnbik6IFVzZSBtZF9tYXliZV90ZXh0LgotCi1GcmkgSnVuIDI3IDE5OjE1OjI3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogT25seSBjaGVjayBmb3IgR09UIHR5cGUKLQlyZWxvY2F0aW9ucywgZG9uJ3QgY2hlY2sgZm9yIHN5bWJvbCBiZWluZyBleHRlcm5hbCwgd2VhaywgZXRjLgotCi1Nb24gSnVuIDE2IDE5OjEyOjUxIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBsZXQgdGhlIGFzc2VtYmxlcgotCWNhbGN1bGF0ZSByZWxvY2F0aW9ucyB0byBhbnkgZXh0ZXJuYWwgc3ltYm9sLCBiZWNhdXNlIHdlIG1pZ2h0IGJlCi0JbGlua2luZyBhIHNoYXJlZCBvYmplY3QgYW5kIHRoZSBzeW1ib2wgbWlnaHQgYmUgb3ZlcnJpZGVuIG9yIG1vdmVkCi0JKGZvciBpbnN0YW5jZSwgbW92ZWQgaW50byBhIHN0YXRpYyBleGVjdXRhYmxlJ3MgLmJzcyBzZWN0aW9uKS4KLQkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVsZXRlLiBUaGlzIGlzIGFuIGkzODYgd2llcmRuZXNzLgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogR09ULWJhc2VkIHJlbG9jYXRpb25zIGNhbid0Ci0JYmUgY2FsY3VsYXRlZCBieSB0aGUgYXNzZW1ibGVyLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgQHBsdCBvciBAbG9jYWwgYnJhbmNoCi0Jd2hvc2UgZGVzdGluYXRpb24gbGllcyBpbiB0aGUgc2FtZSBmaWxlLCBieSBpZ25vcmluZyB0aGUgQHBsdCBvcgotCUBsb2NhbCBhbmQgYWltaW5nIHRoZSBicmFuY2ggYXQgaXRzIGRlc3RpbmF0aW9uLgotCi1Nb24gSnVuIDE2IDEzOjU5OjE4IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IENvcHkgQlNGX09CSkVDVCBmbGFnLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBDb3B5IHNpemUKLQlleHByZXNzaW9uLgotCi0JKiBjb25maWcvb2JqLW11bHRpLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogRGVmaW5lIGluc3RlYWQKLQlvZiBvYmpfY29weV9zeW1ib2xfYXR0cmlidXRlcy4KLQotTW9uIEp1biAxNiAxMjo0NTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogSW4gMzIgYml0IG1vZGUsIHdpdGggYQotCXNpZ25lZCBvcGVyYW5kLCBzaWduIGV4dGVuZCBhIDMyIGJpdCB2YWx1ZSB0byB0aGUgaG9zdCBzaXplLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZMQUdTKTogU3Vic2l0dXRlIGZyb20gY29uZmlndXJlIHNjcmlwdC4gIEZyb20KLQlKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBVc2UgYWxsb2NhIHJhdGhlciB0aGFuIGEgZml4ZWQKLQlidWZmZXIgc2l6ZSB0byBtYWtlIGEgY29weSBvZiB0aGUgc3ltYm9sLgotCi0JKiBNYWtlZmlsZS5pbiAoT0JKUyk6IFB1dCBAZXh0cmFfb2JqZWN0c0Agb24gdGhlIHNhbWUgbGluZSBhcwotCW1hY3JvLm8uCi0KLVRodSBKdW4gMTIgMTI6MTY6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEluIG5vbiBCRkRfQVNTRU1CTEVSIGNvZGUsIGFzIHdlCi0Jc3RlcCB0aHJvdWdoIHRoZSBmcmFncyBjYWxsaW5nIGN2dF9mcmFnX3RvX2ZpbGwsIHN3aXRjaCB0bwotCVNFR19EQVRBIHdoZW4gd2UgcmVhY2ggZGF0YV9mcmFnX3Jvb3QuCi0KLVR1ZSBKdW4gMTAgMTc6MDg6MzQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEFsbG93IGFuIGVtcHR5IHJlZ2lzdGVyCi0JbGlzdCBmb3IgaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSByZWdpc3RlciBsaXN0cy4KLQotVHVlIEp1biAxMCAxMToxODowOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBNYWtlIHRlbXAgdW5zaWduZWQgbG9uZy4KLQotCSogY29uZmlnL3RjLWFybS5jIChhcm1fYWRqdXN0X3N5bXRhYik6IE9ubHkgc2V0IHN0b3JhZ2UgY2xhc3NlcyBpZgotCU9CSl9DT0ZGLgotCi0JKiBjb25maWcvdGMtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvciBtYW55IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHN0cnVjdCBhc21fb3Bjb2RlICk6IEFkZCBwcm90b3R5cGVzIGZvciBwYXJtcyBmaWVsZC4KLQkoc3RydWN0IHRodW1iX29wY29kZSApOiBMaWtld2lzZS4KLQkoZnBfb3AyKTogUmVtb3ZlIHVudXNlZCBmbGFncyBwYXJhbWV0ZXIuCi0JKG91dHB1dF9pbnN0KTogTWFrZSBzdGF0aWMuCi0JKGFybV9hZnRlcl9wYXNzX2hvb2spOiBSZW1vdmUgdW51c2VkIGlnbm9yZSBwYXJhbWV0ZXIuCi0JKiBjb25maWcvdGMtYXJtLmggKGFybV9hZnRlcl9wYXNzX2hvb2spOiBEZWNsYXJlLgotCShhcm1fc3RhcnRfbGluZV9ob29rKTogRGVjbGFyZS4KLQkoYXJtX2Zyb2JfbGFiZWwpOiBEZWNsYXJlLgotCi1Nb24gSnVuICA5IDEyOjU1OjQ1IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGRlcGVuZC5jICh3cmFwX291dHB1dCk6IG5ldyBwcm90b3R5cGUuCi0KLU1vbiBKdW4gIDkgMTI6NTI6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogQ2hlY2sgZm9yIG92ZXJmbG93LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zZWN0aW9uX2FsaWduKTogSWYgYS5vdXQgYW5kIEJGRCwgZm9yY2UKLQlzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4KLQotRnJpIEp1biAgNiAxNzoxNTo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5oIChtZF9jb25zX2FsaWduKTogRGVmaW5lLgotCShzaF9jb25zX2FsaWduKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgLnVhd29yZCBhbmQgLnVhbG9uZy4KLQkoc2hfbm9fYWxpZ25fY29ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfdWFjb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2hfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkoc2hfaGFuZGxlX2FsaWduKTogV2FybiBhYm91dCBtaXNhbGlnbmVkIGRhdGEuCi0JKiBkb2MvYy1zaC50ZXhpOiBEb2N1bWVudCAudWF3b3JkIGFuZCAudWFsb25nLgotCi1UaHUgSnVuICA1IDE1OjM4OjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kKTogSW4gTVJJIG1vZGUsIHRyZWF0IHNpbmdsZSBxdW90ZSBhcyBhCi0Jc2VwYXJhdG9yIGNoYXJhY3RlciB3aGVuIGNoZWNraW5nIGZvciBhIHBvc2l0aW9uYWwgYXJndW1lbnQuCi0KLVR1ZSBKdW4gIDMgMTY6MTU6MTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20KLQlhcm1ULTk3MDMyOC1icmFuY2guCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGFybVQtOTcwMzI4LWJyYW5jaC4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIFRodW1iIGFyY2hpdGVjdHVyZSBzdXBwb3J0IGZyb20KLQlhcm1ULTk3MDMtMjgtYnJhbmNoLgotCi1Nb24gSnVuICAyIDE2OjI1OjA3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hbGwudGV4aTogQWRkIGVuYWJsaW5nIG9mIEFSTSBkb2N1bWVudGF0aW9uLgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIEFSTSBkb2N1bWVudGF0aW9uIGZyb20gYXJtVC05NzAzMjgtYnJhbmNoLgotCi1Nb24gSnVuICAyIDExOjU1OjEyIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCByMzkwMCBzdXBwb3J0LgotCi1UaHUgTWF5IDI5IDEyOjU4OjI2IDE5OTcgIEJlbiBQZmFmZiAgPHBmYWZmYmVuQHBpbG90Lm1zdS5lZHU+Ci0KLQkqIGFzLmM6IChwYXJzZV9hcmdzKSBgLXQnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudC4KLQotV2VkIE1heSAyOCAxNTo0NTowNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2JlZ2luKTogQ2hhbmdlIGNhbGwgdG8KLQljb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MoKSB0byBhIGNhbGwgdG8KLQliZmRfc2V0X3ByaXZhdGVfZmxhZ3MoKS4gCi0KLVdlZCBNYXkgMjggMTY6MTc6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2dlbl9yZWxvYyk6IERvbid0IHRyeSB0byBjb252ZXJ0IHRoZSB0eXBlCi0gCW9mIGEgQkZEX1JFTE9DX1JWQSByZWxvYy4KLQotV2VkIE1heSAyOCAxMDo0ODoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2ZpeF9hZGp1c3RhYmxlKTogUmVqZWN0IGFic29sdXRlIGNhbGxzL2p1bXBzLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBhIHJlbG9jYXRpb24gZm9yIGFuIGFic29sdXRlCi0JY2FsbC9qdW1wLgotCi1Nb24gTWF5IDI2IDEzOjI0OjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IERvbid0IHVzZSBAdmFsdWUgaW4gc2VjdGlvbiBuYW1lcyBvciBpbmRleAotCWVudHJpZXM7IGl0IGNvbmZ1c2VzIHRleGluZm8udGV4LgotCi1GcmkgTWF5IDIzIDAwOjA5OjM1IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFVwZGF0ZWQgZm9yIC1NRCBvcHRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkZWQgZGVwZW5kLmMuCi0JKE9CSlMpOiBBZGRlZCBkZXBlbmQuby4KLQkqIGFzLmggKHN0YXJ0X2RlcGVuZGVuY2llcywgcmVnaXN0ZXJfZGVwZW5kZW5jeSwKLQlwcmludF9kZXBlbmRlbmNpZXMpOiBOZXcgZGVjbGFyYXRpb25zLgotCSogZGVwZW5kLmM6IE5ldyBmaWxlLgotCSogYXMuYyAocGFyc2VfYXJncyk6IEFkZGVkIC1NRCBvcHRpb24uCi0JKG1haW4pOiBDYWxsIHByaW50X2RlcGVuZGVuY2llcy4KLQkoc2hvd191c2FnZSk6IEFkZGVkIGhlbHAgZm9yIC1NRC4KLQkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IENhbGwgcmVnaXN0ZXJfZGVwZW5kZW5jeS4KLQkoc19pbmNsdWRlKTogQ2FsbCByZWdpc3Rlcl9kZXBlbmRlbmN5IHdoZW4gZmlsZSBpcyBmb3VuZC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCByZWdpc3Rlcl9kZXBlbmRlbmN5LgotCi1XZWQgTWF5IDIxIDE3OjM5OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHN5bWJvbF90b19jaGFycyk6IElmIFRFX1BFLCBkb24ndCBhZGQgdGhlCi0Jc2VjdGlvbiBhZGRyZXNzIHRvIHRoZSBzeW1ib2wgdmFsdWUuCi0KLVR1ZSBNYXkgMjAgMTE6MjM6MzEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkLG1pcHNfaXApOiBNb3ZlIHRoZSBJTlNOX0lTQSBmaWVsZAotCWludG8gdGhlIG5ldyBtZW1iZXJzaGlwIGZpZWxkLgotCi1UaHUgTWF5IDE1IDEwOjAwOjUzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBJZiBubyBjcHUgdHlwZSBpcyBzcGVjaWZpZWQgb24gdGhlCi0JY29tbWFuZCBsaW5lIHRoZW4gdGhlIEFSTTcgaXMgbm93IGNob3NlbiBieSBkZWZhdWx0IHdoZW4gc2V0dGluZwotCXRoZSBCRkQgbWFjaGluZSBhbmQgYXJjaGl0ZWN0dXJlLgotCi1XZWQgTWF5IDE0IDA5OjU0OjUzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZ2xvYmFsIHZhcmlhYmxlcyk6IEFkZGVkICd1c2VzX2FwY3NfMjYnIGZsYWcgdG8KLQlob2xkIEFQQ1Mgc2VsZWN0aW9uLgotICAJKG1kX2JlZ2luKTogQWRkZWQgY29kZSB0byBnZW5lcmF0ZSBmbGFncyB0byBiZSBzZXQgaW50byB0aGUgQ09GRgotCWhlYWRlciBhbmQgdGhlIGNhbGxzIHRvIHRoZSBCRkQgZnVuY3Rpb25zIHRvIGRvIHRoaXMuCi0gIAkobWRfcGFyc2Vfb3B0aW9uLCBtZF9zaG93X3VzYWdlKTogQWRkZWQgbmV3IGNvbW1hbmQgbGluZQotCW9wdGlvbnMgLW1hcGNzLTMyLCAtbWFwY3MtMjYsIC1tYXJtdjIsIC1tYXJtdjJhLCAtbWFybXYzLAotCS1tYXJtdjNtLCAtbWFybXY0LCAtbWFybXY0dC4gCi0KLQkqIHRjLWFybS5oIChMT0NBTF9MQUJFTCk6IFJlbW92ZWQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBtYWNybwotCWFzIGl0IGlzIG5ldmVyIHVzZWQuCi0KLVR1ZSBNYXkgMTMgMjI6MjY6MTQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBQcmVmaXggdGVtcG9yYXJ5Ci0JbGFiZWwgbmFtZSB3aXRoICIuIi4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCi1UdWUgTWF5IDEzIDE0OjQ0OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc2V0X2F0KTogQ2hlY2sgZm9yIGJpZ251bS4KLQkoY2hlY2tfYWJzb2x1dGVfZXhwciwgbWFjcm8sIG1pcHMxNl9tYWNybyk6IExpa2V3aXNlLgotCi1UdWUgTWF5IDEzIDEwOjQ1OjU2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfYXBwbHlfZml4KTogQ2hlY2sgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMKLQlmb3Igb3ZlcmZsb3cvdW5kZXJmbG93LCBvbmx5IGluc2VydCBsb3dlciAxNSBiaXRzIGludG8gaW5zdHJ1Y3Rpb24uCi0KLU1vbiBNYXkgMTIgMTM6MzM6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAocGkpOiBDaGVjayBmb3IgUmVnTU1YLgotCi1UaHUgTWF5ICA4IDExOjEwOjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChleHByKTogV2hlbiBzdWJ0cmFjdGluZyB2YWx1ZXMgaW4gdGhlIHNhbWUgZnJhZywKLQlzdWJ0cmFjdCBYX2FkZF9udW1iZXIgcmF0aGVyIHRoYW4gYWRkaW5nIGl0LgotCi1XZWQgTWF5ICA3IDE1OjM5OjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogSnVzdCBwYXNzIE5VTEwgdG8KLSAJbWRfZG9fYWxpZ24sIG5vdCB0aGUgYWRkcmVzcyBvZiBhIGNoYXIgaG9sZGluZyBOT1BfT1BDT0RFLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBjb25zdGFudHMgZm9yIE1fTElfRCBhbmQKLQlNX0xJX0RELgotCShtaXBzX2lwKTogRm9yICdGJywgJ0wnLCAnZicsIGFuZCAnbCcsIGdlbmVyYXRlIGEgY29uc3RhbnQgcmF0aGVyCi0JdGhhbiBhbiBhZGRyZXNzIGlmIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBsb29rcyBzdWZmaWNpZW50bHkKLQlzaW1wbGUuCi0KLVR1ZSBNYXkgIDYgMTI6MTg6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9zZWN0aW9uX2FsaWduKTogSWYgYS5vdXQgYW5kIEJGRCwgZm9yY2UKLQlzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4KLQotTW9uIE1heSAgNSAxNzoxNjo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmQuYzogSW5jbHVkZSAibWFjcm8uaCIuCi0JKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSk6IEFkZCBtYWNyb19uZXN0IGZpZWxkLgotCShpbml0aWFsaXplX2NmcmFtZSk6IEluaXRpYWxpemUgbWFjcm9fbmVzdC4KLQkoY29uZF9maW5pc2hfY2hlY2spOiBBZGQgbmVzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvbmRfZXhpdF9tYWNybyk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGNvbmRfZmluaXNoX2NoZWNrKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShjb25kX2V4aXRfbWFjcm8pOiBEZWNsYXJlLgotCSogaW5wdXQtc2NydWIuYyAobWFjcm9fbmVzdCk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBDYWxsIGNvbmRfZmluaXNoX2NoZWNrLgotCSogbWFjcm8uaCAobWFjcm9fbmVzdCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHNfbWV4aXQpOiBDYWxsIGNvbmRfZXhpdF9tYWNyby4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoUmVnTU1YKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAocGkpOiBDaGVjayBmb3IgYWxsIHJlZ2lzdGVyIHR5cGVzLgotCSh0eXBlX25hbWVzKTogQWRkIFJlZ01NWC4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgUmVnTU1YLgotCi1XZWQgQXByIDMwIDEyOjQ3OjAwIDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc2VjdGlvbl9zeW1ib2wpOiBDbGVhciB0aGUgTE9DQUwgYml0ICNpZmRlZgotCVRFX0RFTFRBLgotCi1UdWUgQXByIDI5IDIwOjIzOjEwIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IEFkZCBuZXcgcGFyYW1ldGVyCi0JYmVmb3JlX3JlbGF4aW5nLiAgVXNlIGl0IHdoZW4gdGVzdGluZyBlY29mZl9leHRlcm5fc2l6ZS4KLQkobG9hZF9hZGRyZXNzLCBtYWNybywgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBGaXggYWxsCi0JY2FsbGVycy4KLQotVHVlIEFwciAyOSAxOTo1NDozNiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCAic3Vic2VjdGlvbiIuCi0gCShvYmpfZWxmX3N1YnNlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1UdWUgQXByIDI5IDE5OjUyOjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfaGVhZGVyX2FwcGVuZCk6IERvbid0IHJlc2V0IHN0cmluZ19zaXplCi0JZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuCi0KLUZyaSBBcHIgMjUgMTQ6MTc6NDYgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBpdGJsLXBhcnNlLmguCi0KLUZyaSBBcHIgMjUgMTI6MDM6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKFBvcnRpbmcgR0FTKTogQ29ycmVjdCBkb2N1bWVudGF0aW9uIGZvcgotCWN1cnJlbnQgY29uZmlndXJlIGhhbmRsaW5nIG9mIHRhcmctY3B1LmgsIGV0LiBhbC4KLQkoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCBsaXN0aW5nIG1hY3Jvcy4KLQotCSogbGlzdGluZy5jIChkYXRhX2J1ZmZlcik6IFNldCBzaXplIGJhc2VkIG9uIG90aGVyIGxpc3RpbmcgbWFjcm9zLAotCXJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyAxMDAuCi0JKGRhdGFfYnVmZmVyX3NpemUpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShjYWxjX2hleCk6IE1ha2UgZGF0YV9idWZmZXJfc2l6ZSBhIGxvY2FsIHZhcmlhYmxlLiAgRG9uJ3QgbGVhdmUKLQlhbnkgc2xvcCB3aGVuIGZpbGxpbmcgZGF0YV9idWZmZXIuCi0KLU1vbiBBcHIgMjEgMTU6MzM6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC5zZXQgYXV0b2V4dGVuZC4KLQotU2F0IEFwciAxOSAyMzowOToyNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQHBldHJhLmFwcGxpLnNlPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1vcGVuYnNkKiwgbTY4ay0qLW9wZW5ic2QqLAotCW1pcHMtZGVjLW9wZW5ic2QqLCBwcGMtKi0qYnNkKiwgbnMzMmstcGM1MzItb3BlbmJzZCosCi0Jc3BhcmMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgQXByIDE5IDIyOjUyOjAzIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogSWYgVENfTUlQUywgc2V0IEJTRl9PQkpFQ1QKLQlmb3IgYWxsIHVuZGVmaW5lZCBzeW1ib2xzLgotCi1GcmkgQXByIDE4IDEzOjM3OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBIYW5kbGUgemVybyBsZW5ndGggY3NlY3RzCi0JY29ycmVjdGx5LgotCi1GcmkgQXByIDE4IDExOjUxOjM1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXByIDE3IDEzOjU5OjQ3IDE5OTcgIFBlciBGb2dlbHN0cm9tICA8cGVmb0BvcGVuYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXByIDE2IDEyOjMxOjI0IDE5OTcgIE1hcnRpbiBIdW50IDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogRml4IHBhcmFsbGVsIGNoZWNraW5nCi0JZm9yIGluc3RydWN0aW9ucyB1c2luZyBjb25kaXRpb25hbCBleGVjdXRpb24uCi0KLVR1ZSBBcHIgMTUgMTg6MTE6NDQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25fdXNlc19yZWcpOiBDb3JyZWN0IHRlc3QgZm9yIGZwciBwYWlycy4KLQotVHVlIEFwciAxNSAxMzowNDo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzcmNyb290KTogUmVtb3ZlLgotIAkoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShhbGwsIGR2aSk6IERvbid0IHNldCBzcmNyb290LgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gYXMubmV3LCBnYXNwLm5ldywgYW5kIGluc3RhbGxkaXJzLiAgVXNlCi0JJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKLQkkKElOU1RBTExfWEZPUk0pIGFuZCAkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCSogZG9jL01ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLQlkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcgJChJTlNUQUxMX1hGT1JNKSBhbmQKLQkkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsLWluZm8tYXMpOiBSdW4gbWtpbnN0YWxsZGlycy4KLQkoaW5zdGFsbC1pbmZvLWdhc3ApOiBMaWtld2lzZS4KLQotTW9uIEFwciAxNCAxMTo1OTowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IENoZWNrIGZvciBkaXZpc2lvbiBieSB6ZXJvLgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogTWFrZWZpbGUuaW46IEFsd2F5cyB1c2UgJChTSEVMTCkgd2hlbiBydW5uaW5nIG1vdmUtaWYtY2hhbmdlLgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEFwciAxMCAxNDo0MDowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9wYXJzZV9vcGVyYW5kLgotCU5ldyBhcmd1bWVudCBgd2FudCcuICBVcGRhdGUgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHZhbHVlcy4KLQlJbml0aWFsaXplIGlmIENHRU5fUEFSU0VfT1BFUkFORF9JTklULgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYmVnaW4pOiBTZXQgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuLgotCShtZF9hc3NlbWJsZSk6IENhbGwgY2dlbl9hc21faW5pdF9wYXJzZS4KLQlVcGRhdGUgY2FsbCB0byBtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbiwgY2FsbCBhc19iYWQgaWYgYXNzZW1ibHkgZmFpbGVkLgotCi1XZWQgQXByICA5IDExOjQ5OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEhhbmRsZSAjai4KLQotVHVlIEFwciAgOCAxNjozNzo1NyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IENyZWF0ZSBmaXh1cCBhdCB0aGUKLQlyaWdodCBhZGRyZXNzIGZvciBjYWxsIGxhYmVsOjMyLHJlZ3MsaW1tLgotCi1Nb24gQXByICA3IDE0OjU4OjIyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2Vfc3RhcnQpOiBJZiBPQkpfRUxGLCB0aGVuIGFsd2F5cyByZXR1cm4KLQl6ZXJvLgotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZnJvYl9zeW1ib2wpOiBEb24ndCByZXNldCB0aGUgdmFsdWUgb2YgdGhlCi0Jc3ltYm9sIGZvciBPQkpfRUxGIGFueW1vcmUuCi0KLU1vbiBBcHIgIDcgMTA6NTQ6NTkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUgZGVwZW5kZW5jaWVzLgotIAkoVEFSR19DUFUpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW4ubyk6IERlcGVuZCBvbiBjZ2VuLmgsICQoVEFSR19DUFUpLW9wYy5oLgotCSguZGVwMSk6IERlbGV0ZSBjcmVhdGluZyBvZiBjZ2VuLW9wYy5oLgotCSgudGNkZXApOiBQdXQgcHJvcGVyIGNvbnRlbnRzIGluIGNnZW4tb3BjLmguCi0JKiBjb25maWd1cmUuaW4gKG0zMnIpOiBEZWxldGUgc2V0dGluZyBvZiBleHRyYV9maWxlcywgZXh0cmFfbGlua3MuCi0JKEFDX09VVFBVVCk6IENyZWF0ZSBjZ2VuLW9wYy5oLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotU2F0IEFwciAgNSAxMzoxOToxMiAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgdG8gYnVpbGQgZ2FzcC5leGUuCi0KLUZyaSBBcHIgIDQgMTY6MTA6MDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAocmVsYXhfZnJhZyk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkqIHdyaXRlLmggKHJlbGF4X2ZyYWcpOiBBZGQgcHJvdG90eXBlIGZvci4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX2RvX2FsaWduKTogTmV3IGFyZyBgbWF4Jy4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQlVcGRhdGUgY2FsbHMgdG8gZnJhZ19hbGlnbiwgZnJhZ19hbGlnbl9wYXR0ZXJuLgotCShmaWxsX2luc24pOiBVcGRhdGUgY2FsbCB0byBtMzJyX2RvX2FsaWduLgotCShtMzJyX3Njb21tKTogVXBkYXRlIGNhbGwgdG8gZnJhZ19hbGlnbi4KLQotCSogY29uZmlnL3RjLW0zMnIuW2NoXTogTmV3IGZpbGVzLgotCSogY2dlbi5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDUFVfVFlQRVMpOiBBZGQgbTMyci4KLQkoVEFSR0VUX0NQVV9DRklMRVMpOiBBZGQgdGMtbTMyci5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCB0Yy1tMzJyLmguCi0JKERJU1RDTEVBTl9IRVJFKTogQWRkIGNnZW4tb3BjLmguCi0JKC5kZXAxLC50Y2RlcCk6IENyZWF0ZSBlbXB0eSBjZ2VuLW9wYy5oLgotCShjZ2VuLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCShkZXBlbmRlbmNpZXMpOiBSZWdlbmVyYXRlLgotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBOZXcgbWVtYmVyIGZyX3RhcmcuCi0JKGZyX3BjcmVsX2FkanVzdCxmcl9ic3IpOiBNb3ZlIGludG8gdW5pb24gZnJfdGFyZy5uczMyay4KLQkqIGNvbmYuaW4gKFVTSU5HX0NHRU4pOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUuaW4gKG0zMnItKi0qKTogQWRkIGVudHJ5IGZvci4KLQlBZGQgY2dlbi5vIHRvIGV4dHJhX29iamVjdHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBmcmFncy5jIChmcmFnX3Zhcik6IGZyX3BjcmVsX2FkanVzdCByZW5hbWVkIHRvCi0JZnJfdGFyZy5uczMyay5wY3JlbF9hZGp1c3QuICBmcl9ic3IgcmVuYW1lZCB0byBmcl90YXJnLm5zMzJrLmJzci4KLQkoZnJhZ192YXJpYW50KTogTGlrZXdpc2UuCi0JKiB3cml0ZS5jIChyZWxheF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoKik6IExpa2V3aXNlLgotCi1GcmkgQXByICA0IDEzOjI2OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfRU9MX0lOX0lOU04pOiBDaGVjayBleHBsaWNpdGx5IGZvciAnIScsCi0JcmF0aGVyIHRoYW4gZm9yIGFueSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IElmIGhwcGFfcmVuX3JlbG9jX3R5cGUgZmFpbHMsCi0JY2FsbCBhYm9ydCAoaS5lLiwgYXNfYWJvcnQpIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBQcm90ZWN0IHVzZXMgb2YgU1RPX01JUFMxNiB3aXRoIGFuIGlmZGVmIG9mCi0JT0JKX0VMRiwgcmF0aGVyIHRoYW4gb2YgU19HRVRfT1RIRVIuCi0KLQkqIE1ha2VmaWxlLmluIChESVNUQ0xFQU5fSEVSRSk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCi0KLVRodSBBcHIgIDMgMTM6MTY6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byAyLjguMS4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1XZWQgQXByICAyIDEyOjI0OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfbWFjcm8pOiBIYW5kbGUgTV9ETVVMIGFuZCBNX01VTC4KLQotVHVlIEFwciAgMSAxODoyOTo0NyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRG9uJ3Qgc2V0IGludGVybG9ja3MgZm9yIDQxMDAuCi0KLVR1ZSBBcHIgIDEgMTY6MjQ6MjggMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy1nYXMuY29tOiBVcGRhdGUgdG8gaGFuZGxlIGJvdGggdmF4IGFuZCBhbHBoYS4KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIHRvIHVzZSBjb25maWctZ2FzLgotCSogY29uZi1hLWdhcy5jb206IFJlbW92ZSBmaWxlLgotCi1UdWUgQXByICAxIDE2OjA4OjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSB1bm5lY2Vzc2FyeSBpdGJsLXBhcnNlLmgsIGlidGwtcGFyc2UuYywgYW5kCi0JaXRibC1sZXguYyBkZXBlbmRlbmNpZXMuICBSZW1vdmUgcnVsZXMgZm9yIGl0YmwtbGV4Lm8sCi0JaXRibC1wYXJzZS5vLCBhbmQgaXRibC1vcHMubzsganVzdCB1c2UgdGhlIG5vcm1hbCAuYy5vIHJ1bGUuCi0KLVR1ZSBBcHIgIDEgMTE6MjU6NTYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChsaW5lX2NvbW1lbnRfY2hhcik6IE1ha2UgJyMnIHN0YXJ0IGNvbW1lbnRzCi0JYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAuUyBmaWxlcyB3aGVyZQotCWNwcCBsZWF2ZXMgdGhlIGZpbGVuYW1lIHRyYW5zaXRpb25zIGJlZ2lubmluZyB3aXRoICcjJy4KLQotVHVlIEFwciAgMSAwMDowNzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IE9ubHkgY29tcGlsZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgYW5kCi0JdGNfY29mZl9zaXplbWFjaGRlcCBpZiBPQkpfQ09GRi4KLQotTW9uIE1hciAzMSAyMzo1Mzo0NCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHJlZ2lzdGVyX25hbWUpOiBEZWNsYXJlLgotCi1Nb24gTWFyIDMxIDE2OjMxOjA0IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluIChocHBhKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMxIDE0OjE1OjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBBZGQgInN0YWJuIi4KLQkobWlwczE2X21hcmtfbGFiZWxzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXBwZW5kX2luc24pOiBDYWxsIG1pcHMxNl9tYXJrX2xhYmVscy4KLQkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgotCShzX2luc24pOiBMaWtld2lzZS4gIERvbid0IGNhbGwgbWlwc19jbGVhcl9pbnNuX2xhYmVscy4KLQkoc19taXBzX3N0YWIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBFTEYgZm9yIG1pcHMtKi1nbnUqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMxIDE0OjAxOjQwIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBTZXQgdG8gImNvZmYtbTY4ay1zeXN2IiBpZgotCVRFX0RFTFRBLgotCi1GcmkgTWFyIDI4IDE4OjAzOjE5IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3IgY29tbW9uYmZkbGliLiAgSWYgaXQgaXMgc2V0LAotCXNldCBPUENPREVTX0xJQiB0byBlbXB0eS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyOCAxNToyNToyNCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotbGludXgqYW91dCosIHNwYXJjLSotbGludXgqKTogTmV3Ci0JdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyOCAxMzowODozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGl0YmwtcGFyc2UueSAoeXllcnJvcik6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZS4KLQotCUZyb20gUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1PjoKLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVtdWxhdGlvbnMgZm9yIG1pcHMtKi1saW51eCotKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc3RydWN0IG1pcHNfc2V0X29wdGlvbnMpOiBEZWZpbmUuCi0JKG1pcHNfb3B0cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHNfaXNhKTogUmVtb3ZlLiAgTm93IGEgZmllbGQgaW4gbWlwc19vcHRzLiAgQ2hhbmdlIGFsbAotCXJlZmVyZW5jZXMuCi0JKG1pcHMxNiwgbWlwczE2X2F1dG9leHRlbmQsIG1pcHNfd2Fybl9hYm91dF9tYWNyb3MpOiBMaWtld2lzZS4KLQkobWlwc19ub3Jlb3JkZXIsIG1pcHNfbm9tb3ZlLCBtaXBzX25vYXQsIG1pcHNfbm9ib3B0KTogTGlrZXdpc2UuCi0JKHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayk6IERlZmluZS4KLQkobWlwc19vcHRzX3N0YWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19taXBzc2V0KTogQWRkIHN1cHBvcnQgZm9yIC5zZXQgcHVzaCBhbmQgLnNldCBwb3AuCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC5zZXQgcHVzaCBhbmQgLnNldCBwb3AuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IERlY2xhcmUgaXQuCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2NoYW5nZV9zZWMpOiBDYWxsIGl0IGlmIE9CSl9FTEYuCi0KLVRodSBNYXIgMjcgMTI6MjM6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogVXBkYXRlIGNvcHlyaWdodCBkYXRlIGluIHZlcnNpb24gbWVzc2FnZS4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuLWhlcmUpOiBSZW1vdmUgZGVwZW5kZW5jeSBmaWxlcy4KLQotCSogcmVhZC5jIChzX2NvbW0pOiBDaGVjayBTX0lTX0NPTU1PTiBhcyB3ZWxsIGFzIFNfSVNfREVGSU5FRC4KLQkoc19tcmlfY29tbW9uKTogQ2hlY2sgU19JU19DT01NT04gdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5jIChjb2xvbik6IENoZWNrIFNfSVNfQ09NTU9OIGFzIHdlbGwgYXMgU19JU19ERUZJTkVELgotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogTGlrZXdpc2UuCi0JKHBwY19wZV9jb21tKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IExpa2V3aXNlLiAgU2V0IHNlZ21lbnQgb2YKLQljb21tb24gc3ltYm9sIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBMaWtld2lzZS4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjcgMDA6Mjk6NDYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBHZXQgdGhlIHJlbG9jcyByaWdodC4KLQotV2VkIE1hciAyNiAxMzozNToxNSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IE9ubHkgZGVmaW5lIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQotV2VkIE1hciAyNiAxMTozMjo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogSGFuZGxlIHZlcnkgbG9uZyBpbnB1dAotCWxpbmVzIGNvcnJlY3RseS4KLQotCSogbGlzdGluZy5jIChwcmludF9saW5lcyk6IEFkZCBsaW5lbm8gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGxpc3RpbmdfbGlzdGluZyk6IE9ubHkgY2FsbCBjYWxjX2hleCBmb3IgdGhlIHJpZ2h0IGxpbmUuCi0JKGxpc3RpbmdfbGlzdCk6IFNldCB0aGUgbmV3IGVkaWN0IGJhc2VkIG9uIHRoZSBjdXJyZW50IGVkaWN0LCBpbgotCW9yZGVyIHRvIGhhbmRsZSBsaXN0aW5nIGNvbW1hbmRzIGluIG1hY3JvcyBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25fdXNlc19yZWcpOiBNYXAgcmVnaXN0ZXIgbnVtYmVycyBpbiBtaXBzMTYKLQlpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmQuYyAoY29uZF9maW5pc2hfY2hlY2spOiBOZXcgZnVuY3Rpb24uCi0JKiBhcy5oIChjb25kX2ZpbmlzaF9jaGVjayk6IERlY2xhcmUuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBjb25kX2ZpbmlzaF9jaGVjay4KLQotVHVlIE1hciAyNSAxNDo0NTo1NCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBJZiB0d28gaW5zdHJ1Y3Rpb25zCi0JYXJlIHN1cHBvc2VkIHRvIGJlIGFzc2VtYmxlZCBpbiBwYXJhbGxlbCBhbmQgdGhlIGZpcnN0IG9uZSBpcwotCWxvbmcsIHByaW50IGFuIGVycm9yIGFuZCBzdG9wLgotCShtZF9hcHBseV9maXgzKTogRG9uJ3QgY2FsY3VsYXRlIGFic29sdXRlIHJlbG9jcy4gIEp1c3Qgd3JpdGUKLQl0aGVtIG91dC4KLQotTW9uIE1hciAyNCAxMjoxMToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGljbHJLbHVkZ2UpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBpY2xyS2x1ZGdlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAodGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWZpbmUgaWYKLQlPQkpfRUNPRkYuCi0JKGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVjbGFyZSBpZiBPQkpfRUNPRkYuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZGVidWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgYWxwaGFfZGVidWcgaWYgLWcgaXMgc2Vlbi4KLSAJKGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIGlmIE9CSl9FQ09GRi4KLQotU3VuIE1hciAyMyAxODowMzozMSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEVuYWJsZSByYW5nZS1jaGVja2luZyBjb2RlLgotCShwb3N0Zml4KTogU3RvcCBhdCBzcGFjZSBvciBjb21tYS4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZS4KLQotU2F0IE1hciAyMiAxMzo0NDoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBhdXRvbWF0aWMgZGVwZW5kZW5jeSBidWlsZGluZy4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi1GcmkgTWFyIDIxIDE1OjQyOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1pZWVlLmMgKHNlZ21lbnRfbmFtZSk6IERvbid0IGRlZmluZSBmdW5jdGlvbiBpZiB0aGlzCi0JaXMgYSBtYWNyby4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWg4MzAwLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLXc2NS5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDYWxsIG9ial9mcm9iX2xhYmVsIGlmIGl0IGlzIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLXZtcy5oIChvYmpfZnJvYl9sYWJlbCk6IFJlbmFtZSBmcm9tIHRjX2Zyb2JfbGFiZWwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IGZpbGVzIGFuZCBsaW5rcy4gIERvbid0IGNhbGwKLQlBQ19MSU5LX0ZJTEVTLiAgU3Vic3RpdHV0ZSB0ZV9maWxlLiAgQ3JlYXRlIHRhcmctY3B1LmgsCi0Jb2JqLWZvcm1hdC5oLCB0YXJnLWVudi5oLCBhbmQgaXRibC1jcHUuaCBpbiBBQ19PVVRQVVQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfQyk6IE5ldyB2YXJpYWJsZS4KLQkoVEFSR19DUFVfTywgVEFSR19DUFVfSCk6IE5ldyB2YXJpYWJsZXMuCi0JKE9CSl9GT1JNQVRfQywgT0JKX0ZPUk1BVF9PLCBPQkpfRk9STUFUX0gpOiBOZXcgdmFyaWFibGVzLgotCShUQVJHX0VOVl9ILCBBVE9GX1RBUkdfQywgQVRPRl9UQVJHX08pOiBOZXcgdmFyaWFibGVzLgotCShTT1VSQ0VTKTogUmVuYW1lIGZyb20gUkVBTF9TT1VSQ0VTLiAgRGVsZXRlIG9sZCBkZWZpbml0aW9uLgotCShMSU5LRURfU09VUkNFUyk6IFJlbW92ZS4KLQkoSEVBREVSUyk6IFJlbmFtZSBmcm9tIFJFQUxfSEVBREVSUy4gIERlbGV0ZSBvbGQgZGVmaW5pdGlvbi4KLQkoTElOS0VEX0hFQURFUlMpOiBSZW1vdmUuCi0JKE9CSlMpOiBVc2UgJChUQVJHX0NQVV9PKSwgZXRjLiwgcmF0aGVyIHRoYW4gdGFyZy1jcHUubywgZXRjLgotCSgkKE9CSlMpKTogRGVwZW5kIHVwb24gJChUQVJHX0VOVl9IKSwgZXRjLiwgcmF0aGVyIHRoYW4KLQl0YXJnLWNwdS5oLCBldGMuCi0JKCQoVEFSR19DUFVfTyksICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSk6IE5ldyB0YXJnZXRzLgotCSh0YXJnLWNwdS5vLCBvYmotZm9ybWF0Lm8sIGF0b2YtdGFyZy5vKTogUmVtb3ZlIHRhcmdldHMuCi0JKGl0YmwtY3B1LmgpOiBSZW1vdmUgdGFyZ2V0LgotCShESVNUQ0xFQU5fSEVSRSk6IFJlbW92ZSB0YXJnLWNwdS5jLCBvYmotZm9ybWF0LmMsIGF0b2YtdGFyZy5jLAotCWF0b2YtdGFyZy5oLgotCi1UaHUgTWFyIDIwIDE5OjE4OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKFN5bWJvbCBOYW1lcyk6IERvbid0IHVzZSBvYnNvbGV0ZSBAY3RybCBtYWNyby4KLQotVGh1IE1hciAyMCAxNjo0OToxNCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobXJpX2NoaXApOiBSZXBsYWNlIGNhbGxzIHRvIGdldF9zeW1ib2xfZW5kIGJ5Ci0Jb3BlbiBjb2RlZCBsb29wIHRoYXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgbmFtZSB0byBzdGFydCB3aXRoIGEKLQluYW1lIGJlZ2lubmVyLgotCi1UaHUgTWFyIDIwIDEzOjQyOjAxIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBmcmFncy5jIChmcmFnX3Zhcik6IENoYW5nZSBvZmZzZXQgcGFyYW1ldGVyIHRvIG9mZnNldFQuCi0JKGZyYWdfdmFyaWFudCk6IExpa2V3aXNlLgotCSogZnJhZ3MuaCAoZnJhZ192YXJpYW50LCBmcmFnX3Zhcik6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19pdCk6IENoYW5nZSBmb2ZmIGZpZWxkIHRvCi0Jb2Zmc2V0VC4KLQkoYWRkX2ZyYWcpOiBDaGFuZ2Ugb2ZmIHBhcmFtZXRlciB0byBvZmZzZXRULgotCSogU2V2ZXJhbCBmaWxlczogQWRkIGNhc3RzIHRvIGNhbGxzIHRvIGZyYWdfdmFyLgotCi0JKiBNYWtlZmlsZS5pbiAobTY4ay1wYXJzZS5jKTogRGVwZW5kIHVwb24gaXRibC1wYXJzZS5jLCB0bwotCXNlcmlhbGl6ZSBhIHBhcmFsbGVsIG1ha2UuCi0JKGl0YmwtcGFyc2UuaCk6IFNwbGl0IHRhcmdldCBvdXQgZnJvbSBpdGJsLXBhcnNlLmMuCi0KLVRodSBNYXIgMjAgMTI6NDg6NDUgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAobW90b3JvbGFfb3BlcmFuZCk6IEFsbG93ICh6ZGlyZWcsRVhQUikuCi0KLQkqIGNvbmZpZy90ZS1kZWx0YS5oIChDT0ZGX0NPTU1PTl9BRERFTkQpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IENoZWNrIENPRkZfQ09NTU9OX0FEREVORCB3aGVuCi0Jc3RvcmluZyB0aGUgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sLgotCi1XZWQgTWFyIDE5IDExOjM3OjU3IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChnbHVlX3N5bWJvbHMpOiBVbnVzZWQgdmFyaWFibGUgc3ltYm9sUAotCXJlbW92ZWQuCi0JKGNyYXdsX3N5bWJvbHMpOiBEbyBub3QgbW9kaWZ5IHN5bWJvbF9yb290UCBhbmQgc3ltYm9sX2xhc3RQIGhlcmU7Ci0JdGhhdCBpcyBkb25lIGJ5IHN5bWJvbF9yZW1vdmUgYW5kIHN5bWJvbF9pbnNlcnQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0xPQ0FMKTogUmV0dXJuIDAgZm9yIGEgZGVidWdnaW5nCi0Jc3ltYm9sLgotCi1XZWQgTWFyIDE5IDExOjA2OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEluIDMyIGJpdCBtb2RlLCB3aGVuIG5vdAotCWRlYWxpbmcgd2l0aCBhIDY0IGJpdCBudW1iZXIsIHBlcm1pdCB0aGUgdXBwZXIgMzIgYml0cyB0byBiZSBzZXQKLQlldmVuIGlmIGJpdCAzMSBpcyBub3Qgc2V0LgotCi1UdWUgTWFyIDE4IDIzOjMwOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJlcXVpdiIuCi0JKHNfc2V0KTogSGFuZGxlIC5lcXVpdiBiYXNlZCBvbiBhcmd1bWVudC4KLQkqIGRvYy9hcy50ZXhpbmZvIChFcXVpdik6IE5ldyBub2RlIHRvIGRvY3VtZW50IC5lcXVpdi4KLQkoRXJyKTogTmV3IG5vZGUgdG8gZG9jdW1lbnQgLmVyci4KLQotVHVlIE1hciAxOCAxNTo1MDoxMyAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogTWFueSBmaWxlczogQWRkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiBhcy5jIChzaG93X3VzYWdlLCBwYXJzZV9hcmdzKTogTWFrZSBzdGF0aWMuCi0JKiBmcmFncy5oIChmcmFnX2FsbG9jKTogRGVjbGFyZS4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogRG9uJ3QgZGVjbGFyZSBmcmFnX2FsbG9jLgotCSogc3ltYm9scy5jIChkb2xsYXJfbGFiZWxfaW5zdGFuY2UpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gbG9uZy4KLQkqIHN5bWJvbHMuaCAocHJpbnRfc3ltYm9sX3ZhbHVlKTogRGVjbGFyZS4KLQkocHJpbnRfZXhwciwgcHJpbnRfZXhwcl8xLCBwcmludF9zeW1ib2xfdmFsdWVfMSk6IERlY2xhcmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IERvbid0IGRlY2xhcmUgbWFrZV9leHByX3N5bWJvbC4KLQkocmVtb3ZlX3N1YnNlZ3MsIHJlbGF4X2ZyYWcpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChhdG9mX3ZheF9zaXplb2YpOiBDaGFuZ2UgbGV0dGVyIHRvIGludC4KLQkod2hhdF9raW5kX29mX2Zsb2F0KTogTGlrZXdpc2UuCi0JKGF0b2ZfdmF4KTogTWFrZSBzdGF0aWMuICBDaGFuZ2Ugd2hhdF9raW5kIHRvIGludC4KLQkobWRfYXRvZik6IENoYW5nZSB3aGF0X3N0YXRlbWVudF90eXBlIHRvIGludC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2Vjb2ZmX3NldF9leHQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKHZheF9tZF9hdG9mKTogRGVjbGFyZS4KLQkobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlIGFuZCB2YXhfbWRfYXRvZi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNldF8xNmJpdF9jb2RlX2ZsYWcpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAoYWRkX2ZpeCk6IENoYW5nZSB3aWR0aCB0byBpbnQuCi0JKGluc2VydF9yZWcpOiBDaGFuZ2UgcmVnbmFtZSB0byBjb25zdC4KLQkobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlLgotCShkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChjbXBfcmVnX2VudHJ5KTogQ2hhbmdlIGFyZ3MgdG8gY29uc3QgUFRSLgotCShwYXJzZV9rZXl3b3JkX2FyZyk6IENoYW5nZSBsb29rdXBfZm4gdG8gdGFrZSBjb25zdCBhcmcuCi0JKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oOiBBZGQgaWZkZWYgZm9yIG11bHRpcGxlIGluY2x1c2lvbi4KLQkodGNfYW91dF9wcmVfd3JpdGVfaG9vayk6IERvbid0IGRlY2xhcmUuCi0KLU1vbiBNYXIgMTcgMTE6MjE6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oIChiZmRfYWxsb2NfYnlfc2l6ZV90KTogRG9uJ3QgZGVjbGFyZS4KLQkqIE1hbnkgZmlsZXM6IFVzZSB4bWFsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvY19ieV9zaXplX3QuCi0KLVN1biBNYXIgMTYgMTM6NDk6MjEgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBEb24ndCBjYWxsIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbi4KLQkoc3ltYm9sX2FwcGVuZCk6IFNldCBzeV9uZXh0IGFuZCBzeV9wcmV2aW91cyB3aGVuIGFkZGluZyBhIHNpbmdsZQotCXN5bWJvbCB0byBhbiBlbXB0eSBsaXN0LiAgQ2FsbCBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4uCi0JKHZlcmlmeV9zeW1ib2xfY2hhaW4pOiBVc2UgYXNzZXJ0LCBub3Qga25vdy4KLQotU2F0IE1hciAxNSAyMDoyNzoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTkVXUzogTm90ZSBCZU9TIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IChwcGMtKi1iZW9zKTogTmV3IHRhcmdldCwgdXNlIGNvZmYgYXMgb2JqZWN0IGZvcm1hdC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCQotU2F0IE1hciAxNSAxOToxNDowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3Igb3V0Ci0Jb2YgcmFuZ2UgYnJhbmNoLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY2llcyBvbiBvYnN0YWNrLmggd2hlcmUgbmVlZGVkLgotCi1GcmkgTWFyIDE0IDE1OjMzOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBIYW5kbGUgdGhlCi0JY2FzZSBvZiBhIHN5bWJvbCBlcXVhdGVkIHRvIGFub3RoZXIgc3ltYm9sIHdoZW4gdXNpbmcgU1ZSNF9QSUMuCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfc3BhcmMpOiBBZGQgb3Bjb2RlL3NwYXJjLmguCi0KLVRodSBNYXIgMTMgMTE6MjA6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhbGwgTElTVElOR19ORVdMSU5FIGJlZm9yZQotCUhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSB3aGVuIGhhbmRsaW5nIGFuIE1SSSBsaW5lIGxhYmVsLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2RhdGEpOiBDYWxsIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0JYW5kIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKG9ial9lbGZfdGV4dCwgb2JqX2VsZl9wcmV2aW91cyk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDEyIDExOjQwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1tdWx0aS5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IERlZmluZSBpZgotCU9CSl9NQVlCRV9FTEYuCi0JKE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lIGFzIHN0cnVjdCBlbGZfb2JqX3N5IGlmCi0JT0JKX01BWUJFX0VMRi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogRG9uJ3QgZGVmaW5lIGlmCi0JT0JKX1NZTUZJRUxEX1RZUEUgaXMgZGVmaW5lZC4KLQotCSogZG9jL2FzLnRleGluZm8gKGJzcyk6IEltcHJvdmUgZGVzY3JpcHRpb24gb2YgLmJzcyBzZWN0aW9uLiAgSW4KLQlFTEYgb3IgQ09GRiwgeW91IGFyZSBwZXJtaXR0ZWQgdG8gc3dpdGNoIGludG8gdGhlIHNlY3Rpb24uCi0JKENvbW0pOiBSZXdyaXRlIGRlc2NyaXB0aW9uIG9mIGNvbW1vbiBzeW1ib2xzLgotCShMY29tbSk6IE1lbnRpb24gdGhhdCBzb21lIHRhcmdldHMgcGVybWl0IGEgdGhpcmQgYXJndW1lbnQuCi0KLVR1ZSBNYXIgMTEgMDE6MTM6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBEb24ndCBjYWxsIFNfQ0xFQVJfRVhURVJOQUwuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGFuZ2UgdHlwZSBvZiBsb2NhbCB0byBpbnQuICBGcm9tIEFsYW4gTW9kcmEKLQk8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+LgotCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogRG9uJ3QgdXNlIGEgc3BlY2lhbCBub3AKLQlhbGlnbm1lbnQgaWYgYSB6ZXJvIGZpbGwgcGF0dGVybiB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChlcXVhbHMpOiBBbHdheXMgcGVybWl0IHJlZ2lzdGVyIG5hbWVzIHRvIGJlIHJlZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19maXhfYWRqdXN0YWJsZSk6IFBlcm1pdCBhIHJlbG9jIGFnYWluc3QgYQotCW1pcHMxNiBzeW1ib2wgdG8gYmUgYWRqdXN0ZWQgaWYgYSBzeW1ib2wgaXMgYmVpbmcgc3VidHJhY3RlZCBmcm9tCi0JaXQuCi0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N5bXZlcik6IENoZWNrIGZvciBkdXBsaWNhdGUgb3IKLQlpbGxlZ2FsIHN5bWJvbCB2ZXJzaW9uIG5hbWVzLgotCShlbGZfZnJvYl9zeW1ib2wpOiBDaGVjayBmb3IgZXh0ZXJuYWwgZGVmYXVsdCB2ZXJzaW9ucy4KLQotU3VuIE1hciAgOSAyMzo0OToxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBjb25maWcvb2JqLWVsZi5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IERlZmluZS4KLQkoT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUgdG8gZWxmX29ial9zeSBzdHJ1Y3QuICBDaGFuZ2UgYWxsCi0JdXNlcnMuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N5bXZlcik6IEp1c3QgcmVjb3JkIHRoZSBuYW1lLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogSW5pdGlhbGl6ZWQgdmVyc2lvbmVkX25hbWUgZmllbGQuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IElmIHRoZXJlIGlzIGEgdmVyc2lvbmVkX25hbWUsIGVpdGhlciByZW5hbWUgdGhlCi0Jc3ltYm9sLCBvciBhZGQgYW4gYWxpYXMgd2l0aCB0aGF0IG5hbWUuCi0KLVRodSBNYXIgIDYgMTM6NTU6MzIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9yZWxheF90YWJsZSk6IERlZmluZS4KLQkobWRfY29udmVydF9mcmFnKTogSW1wbGVtZW50LgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSByZWxheGFibGUgb3BlcmFuZHMvaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJbXBsZW1lbnQuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IEZpeCB0eXBvcy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCB1c2UgYW55IE1OMTAzMDAgc3BlY2lmaWMKLQlyZWxvY3MgYW55bW9yZS4gIFR3ZWFrIGZ4X29mZnNldCBmb3IgcGMtcmVsYXRpdmUgcmVsb2NzLgotCi1XZWQgTWFyICA1IDE1OjQ2OjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZC5jIChzX2lmYyk6IENhbGwgbXJpX2NvbW1lbnRfZmllbGQgYW5kIG1yaV9jb21tZW50X2VuZCB3aGVuCi0JaW4gTVJJIG1vZGUuCi0KLVR1ZSBNYXIgIDQgMTk6MzQ6MjEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNlY3QiIGFuZCAic2VjdGlvbiIKLQlwc2V1ZG8tb3BzLgotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX2JlZ2luKTogRGVjbGFyZSBleHRlcm5hbCB2YXJpYWJsZQotCWNvZmZfZmxhZ3MgYW5kIGluc2VydCBhbiBGX0FSMzJXUiBiaXQgaW50byBpdC4KLQotVHVlIE1hciAgNCAxMDowMTowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZXF1YWxzKTogQWRkIHJlYXNzaWduIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIHJlYWQuaCAoZXF1YWxzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1TYXQgTWFyICAxIDAxOjA0OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBEb24ndCBhc3N1bWUgdGhhdCB3ZQotCWNhbiByZWx5IG9uIHRoZSBmcmFnIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmcmFnIGlzCi0JZWFybGllciBvciBsYXRlci4KLQotRnJpIEZlYiAyOCAxNDo0MDowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmggKExPQ0FMX0xBQkVMKTogT25seSBkZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKFNfTE9DQUxfTkFNRSk6IExpa2V3aXNlLgotCShGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5jIChjb2xvbik6IENhbGwgYmZkX2lzX2xvY2FsX2xhYmVsLCBub3QgTE9DQUxfTEFCRUwsIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoU19JU19MT0NBTCk6IENhbGwgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUsIG5vdCBMT0NBTF9MQUJFTC4KLQkqIGNvbmZpZy90Yy0qLmg6IE9ubHkgZGVmaW5lIExPQ0FMX0xBQkVMIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCURvbid0IGRlZmluZSBGQUtFX0xBQkVMX05BTUUuCi0JKiBjb25maWcvdGUtaWM5NjAuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlZmluZS4KLQkobWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2xvY2FsX2xhYmVsKTogUmVtb3ZlLgotCi0JKiBjb25maWcvdGUtc2NvMzg2Lmg6IFJlbW92ZTsgbm90IHVzZWQuCi0KLVRodSBGZWIgMjcgMTU6Mzk6MTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MCAobWRfcHNldWRvX3RhYmxlKTogQWRkIGFsaWduIHBzZXVkbyBvcCB0byBkbwotCWJ5dGUgYWxpZ25tZW50IHJhdGhlciB0aGFuIHBvd2VyLW9mLXR3byBhbGlnbm1lbnQgdGhhdCBpcyB0aGUKLQlHQVMgZGVmYXVsdC4KLQotVGh1IEZlYiAyNyAxMzoyOTowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGEgcmVsb2Mgd2lkdGggb2YgJ1cnLgotCi0JKiBnYXNwLmMgKGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSk6IENvcnJlY3QgbWlzc3BlbGxpbmcgaW4gZXJyb3IKLQltZXNzYWdlLCBhbmQgYWRkIG5ld2xpbmUuCi0JKHByb2Nlc3NfZmlsZSk6IERvbid0IHByb2Nlc3MgYXNzaWdubWVudHMgaW4gdGhlIGxhYmVsIGlmIHRoaXMgaXMKLQlhIGVxdSBvciBhc3NpZ24gcHNldWRvLW9wLgotCShwcm9jZXNzX3BzZXVkb19vcCk6IFN3YXAgZmlyc3QgYXJndW1lbnQgdG8gZG9fYXNzaWduIGZvciBLX0FTU0lHTgotCWFuZCBLX0VRVSwgdG8gbWF0Y2ggZG9jdW1lbnRhdGlvbi4KLQotVGh1IEZlYiAyNyAxMjowMDowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBBZGQgJ3InIHNlY3Rpb24gYXR0cmlidXRlCi0JdG8gZGVub3RlIHJlYWQtb25seSBkYXRhIHNlY3Rpb25zLgotCi1UaHUgRmViIDI3IDAwOjI2OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBTZXQgQlNGX09CSkVDVCBpbiBmbGFncy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IExpa2V3aXNlLCBpZiBCRkRfQVNTRU1CTEVSLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBTaW1wbGlmeSAwYiBoYW5kbGluZy4gIERvbid0IHRyZWF0IDBiIGFzIGEKLQliaW5hcnkgbnVtYmVyIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnKycgb3IgJy0nLgotCi1XZWQgRmViIDI2IDIwOjQ3OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoRkxUX0NIQVJTKTogQ2hhbmdlIGZyb20gImREIiB0byAiZkYiLgotCShmaW5kX29wY29kZSk6IE1hdGNoIG9wZXJhbmRzIHRoYXQgY2FuIGJlIGZsb2F0cy4KLQkoYnVpbGRfaW5zbik6IEhhbmRsZSBPX2JpZyAoZmxvYXQpIGV4cHJlc3Npb25zIGFuZCBidWlsZAotCWNvcnJlY3Qgb3Bjb2RlLgotCi1XZWQgRmViIDI2IDE4OjE5OjAwIDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQsIGFsc28gbWFrZSBlbXB0eQotCWVtdWxhdGlvbiBsaXN0IGZvciB0aGlzIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCSogdGMtbWlwcy5jIChFQ09GRl9MSVRUTEVfRk9STUFUKTogRGVmaW5lLgotCShtaXBzX3RhcmdldF9mb3JtYXQpOiBVc2UuCi0JKiB0ZS1sbmV3cy5oOiBOZXcgZmlsZS4KLQotV2VkIEZlYiAyNiAxNTozMzo0NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGZpbmRfb3Bjb2RlLCBidWlsZF9pbnNuKTogQ2hhbmdlcyB0byBtYXRjaAotCW9wZXJhbmRzIHdpdGggOm0gb3IgOnMgbW9kaWZpZXJzIGFuZCBnZW5lcmF0ZSB0aGUgcmlnaHQgb3Bjb2RlcwotCWZvciB0aGVtLgotCi1XZWQgRmViIDI2IDExOjU2OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmgpOiBVc2UgJChCSVNPTikgYW5kCi0JJChCSVNPTkZMQUdTKSwgbm90ICQoWUFDQykgYW5kICQoWUFDQ0ZMQUdTKS4KLQotVHVlIEZlYiAyNSAyMjowMjoyMyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbnN0cmluZyk6IFVzZWxlc3MgbG9jYWwgZGVjbGFyYXRpb24gb2YKLQljcmFja19vcGVyYW5kIHJlbW92ZWQuCi0JKiBleHByLmggKGV4cHJlc3Npb25TKTogQ2hhbmdlZCB0eXBlIG9mIFhfb3AgZmllbGQgdG8gb3BlcmF0b3JUIGlmCi0JX19HTlVDX18uCi0KLVR1ZSBGZWIgMjUgMTM6MTc6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGkzODZjb2ZmIGFuZCBpMzg2ZWxmIHRvIGVtdWxhdGlvbiBsaXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogYXMuYyAoaTM4NmNvZmYsIGkzODZlbGYpOiBEZWNsYXJlLgotCSogb2JqLmggKGNvZmZfZm9ybWF0X29wcyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoT0JKX0hFQURFUik6IERlZmluZS4KLQkoY29mZl9vYmpfc3ltYm9sX25ld19ob29rKTogUmVuYW1lIGZyb20gb2JqX3N5bWJvbF9uZXdfaG9vay4KLQkoY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rKTogUmVuYW1lIGZyb20gb2JqX3JlYWRfYmVnaW5faG9vay4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCAidmVyc2lvbiIuCi0JKGNvZmZfcG9wX2luc2VydCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShub19mdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9mb3JtYXRfb3BzKTogTmV3IHZhcmlhYmxlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayk6IERlY2xhcmUuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWZpbmUuCi0JKGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayk6IERlY2xhcmUuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3RhcmdldF9mb3JtYXQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWkzODYuYzogQ2hlY2sgT0JKX01BWUJFX0VMRiBhcyB3ZWxsIGFzIE9CSl9FTEY7IGNoZWNrCi0JT1VUUFVUX0ZMQVZPUiB3aGVuIGFwcHJvcHJpYXRlLgotCShpMzg2X3RhcmdldF9mb3JtYXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAob2JqLWNvZmYubyk6IE5ldyB0YXJnZXQuCi0JKGUtaTM4NmNvZmYubywgZS1pMzg2ZWxmLm8pOiBOZXcgdGFyZ2V0cy4KLQotCUZyb20gU3RlcGhlbiBXaWxsaWFtcyA8c3RldmVAaWNhcnVzLmljYXJ1cy5jb20+OgotCSogY29uZmlnL3RjLWk5NjAuaCAoVENfU1lNRklFTERfVFlQRSk6IERlZmluZSBpZiBPQkpfQ09GRi4KLQkoX3RjX2dldF9iYWxfb2ZfY2FsbCk6IERvbid0IGRlY2xhcmUuCi0JKHRjX2dldF9iYWxfb2ZfY2FsbCk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIGRvbid0IGRlZmluZSBhcyBtYWNyby4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRjX3NldF9iYWxfb2ZfY2FsbCk6IElmIE9CSl9DT0ZGLCBzdG9yZSBiYWxQCi0JaW4gc3lfdGMgZmllbGQsIG5vdCB4X2JhbG50cnkgZmllbGQuCi0JKHRjX2dldF9iYWxfb2ZfY2FsbCk6IFJlbmFtZSBmcm9tIF90Y19nZXRfYmFsX29mX2NhbGwuICBDaGFuZ2UKLQlyZXR1cm4gdHlwZSB0byBzeW1ib2xTICouICBJZiBPQkpfQ09GRiwgcmV0cmlldmUgdmFsdWUgZnJvbSBzeV90YwotCWZpZWxkLCBub3QgeF9iYWxudHJ5IGZpZWxkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBQZXJtaXQgYSAubm90ZSBzZWN0aW9uIHRvCi0JaGF2ZSB0aGUgU0hGX0FMTE9DIGF0dHJpYnV0ZS4KLQotCSogTWFrZWZpbGUuaW4gKCQoT0JKUykpOiBEb24ndCBkZXBlbmQgdXBvbiAkKElUX0hEUlMpLgotCShUQVJHX0NQVV9ERVBfbWlwcyk6IERlcGVuZCB1cG9uICQoc3JjZGlyKS9pdGJsLW9wcy5oLgotCShpdGJsLWxleC5vKTogRGVwZW5kIHVwb24gaXRibC1wYXJzZS5oLgotCi0JKiBpdGJsLXBhcnNlLnkgKHl5ZXJyb3IpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gaW50LiAgQ2hhbmdlIHRvCi0JdXNlIG9sZCBzdHlsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQotCSogTWFrZWZpbGUuaW4gKGl0YmwtbGV4Lm8pOiBSZW1vdmUgLVdhbGwuCi0JKGl0YmwtcGFyc2Uubyk6IExpa2V3aXNlLgotCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBJZiB3ZSBzaG91bGQgb21pdCBjb25kaXRpb25hbHMgZnJvbSBsaXN0aW5ncywKLQljYWxsIGxpc3RpbmdfbGlzdC4KLQkoc19pZiwgc19pZmMsIHNfZW5kaWYsIHNfZWxzZSwgc19pZmVxcyk6IExpa2V3aXNlLgotCSogbGlzdGluZy5jIChsaXN0X2luZm9fc3RydWN0KTogQWRkIEVESUNUX05PTElTVF9ORVhULgotCShsaXN0aW5nX2xpc3RpbmcpOiBIYW5kbGUgRURJQ1RfTk9MSVNUX05FWFQuCi0JKGxpc3RpbmdfbGlzdCk6IEFuIGFyZ3VtZW50IG9mIDIgbWVhbnMgRURJQ1RfTk9MSVNUX05FWFQuCi0JKiBsaXN0aW5nLmggKExJU1RJTkdfTk9DT05EKTogRGVmaW5lLgotCShMSVNUSU5HX1NLSVBfQ09ORCk6IERlZmluZS4KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIGMgYXMgYSBzdWJvcHRpb24gb2YgLWEuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgYyBhcyBhIHN1Ym9wdGlvbiBvZiAtYS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAtYWxjLgotCi1Nb24gRmViIDI0IDIzOjM0OjE0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIFJfQUJTIHR5cGUgZml4dXBzLgotCi1Nb24gRmViIDI0IDE4OjI3OjQzIDE5OTcgIEVyaWMgWW91bmdkYWxlICA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAuc3ltdmVyLgotCi1Nb24gRmViIDI0IDE1OjE5OjU3IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBDaGFuZ2UgcHJlX2RlZmluZWRfcmVnaXN0ZXJzIHRvIAotCWQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgYW5kIHJlZ19uYW1lX2NudCB0byBkMTB2X3JlZ19uYW1lX2NudC4KLQotTW9uIEZlYiAyNCAxMDo0MDo0NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQgc2VjdGlvbi4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cnkgZm9yIGJzcywgd2hpY2ggdGFrZXMKLSAJYW4gYWRkaXRpb25hbCBhbGlnbm1lbnQgYXJndW1lbnQuCi0JKGZpbmRfb3Bjb2RlKTogQWxsb3cgT19zeW1ib2wgcmVsb2NzIGZvciBhbnkgMzIgYml0IGZpZWxkLCBub3QganVzdAotIAliYXNlIHJlbGF0aXZlIG9uZXMuCi0JKGJ1aWxkX2luc24pOiBIYW5kbGUgT19zeW1ib2wgcmVsb2NzIGZvciBhbnkgMzIgYml0IGZpZWxkLCBub3QganVzdAotIAliYXNlIHJlbGF0aXZlIG9uZXMuCi0KLU1vbiBGZWIgMjQgMDI6MjM6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIGRlcGVuZGFuY2llcyBvbiBpdGJsLWNwdS5oLgotCSogYXMuYzogRGVmaW5lIHN0dWJzIGZvciBpdGJsX3BhcnNlIGFuZCBpdGJsX2luaXQgaWYgSEFWRV9JVEJMX0NQVSAKLQlpcyBub3QgZGVmaW5lZC4KLQotTW9uIEZlYiAyNCAwMjowMzowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0Ymwtb3BzLmg6IEluY2x1ZGUgYXMuaC4KLQotTW9uIEZlYiAyNCAwMTowNDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGFzLmM6IFJlbW92ZSAtdCBvcHRpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogTW92ZSBpdGJsLWNwdS5oIHRvIG1pcHMgc3BlY2lmaWMgY29uZmlndXJlLgotCSogaXRibC1vcHMuaDogSW5jbHVkZSBpdGJsLWNwdS5oIG9ubHkgaWYgSEFWRV9JVEJMX0NQVSBpcyBkZWZpbmVkLgotCSogY29uZmlnL3RjLW1pcHMuaDogRGVmaW5lIEhBVkVfSVRCTF9DUFUuCi0KLVN1biBGZWIgMjMgMTg6MDE6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBpdGJsLW9wcy5jOiBEb24ndCBkZWZpbmUgREVCVUcuCi0KLVN1biBGZWIgMjMgMTc6NDk6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGl0YmwtdGVzdC5jIHRvIHJlZmxlY3QgaXRzIG5ldyBsb2NhdGlvbi4KLQotU3VuIEZlYiAyMyAxNTo1MDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0Ymwtb3BzLmM6IEFkZCB0ZXN0IGZvciBpdGJsX2hhdmVfZW50cmllcy4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlbW92ZSB0ZXN0IGZvciBpdGJsX2hhdmVfZW50cmllcy4KLQkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MgdG8gbWlwc19pbml0X2FmdGVyX2FyZ3MuCi0KLVN1biBGZWIgMjMgMTg6MTM6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogUmVtb3ZlIGl0YmwtcGFyc2UueSwgaXRibC1sZXgubCwgYW5kCi0JaXRibC1vcHMuYy4gIEFkZCBpdGJsLXBhcnNlLmMgYW5kIGl0YmwtbGV4LmMuCi0JKExFWCwgTEVYRkxBR1MpOiBEZWZpbmUuCi0JKiBpdGJsLW9wcy5jIChhcHBlbmRfaW5zbnNfYXNfbWFjcm9zKTogUmVtb3ZlIGJvZ3VzIEFTU0VSVC4KLQotU2F0IEZlYiAyMiAyMToyNTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0YmwtcGFyc2UueTogRml4IGluZGVudGF0aW9uIG1pc3Rha2VzIGZyb20gaW5kZW50IHByb2dyYW0uCi0JKiBpdGJsLWxleC5sOiBGaXggaW5kZW50YXRpb24gbWlzdGFrZXMgZnJvbSBpbmRlbnQgcHJvZ3JhbS4KLQkqIGl0Ymwtb3BzLmg6IEFkZCBpbmNsdWRlIGZvciBhbnNpZGVjbC5oLgotCUFkZCBQQVJBTVMgYXJvdW5kIGZ1bmN0aW9uIGFyZ3VtZW50cy4KLQlBZGQgZGVjbGFyYXRpb24gZm9yIGl0YmxfaGF2ZV9lbnRyaWVzLgotCSogaXRibC1vcHMuYzogQWRkIFBBUkFNUyBhcm91bmQgZnVuY3Rpb24gYXJndW1lbnRzLgotCSogTWFrZWZpbGUuaW46IEFkZCBpdGJsIGJ1aWxkIHJ1bGVzLgotCUFkZCBkZXBlbmRhbmNpZXMgZm9yIGl0YmwgZmlsZXMgdG8gbWlwcyB0YXJnZXQuCi0JKiBhcy5jOiBBZGQgaXRibCBzdXBwb3J0LgotCUFkZCBuZXcgb3B0aW9uICItLWluc3R0YmwiIGZvciBkeW5hbWljYWxseSBleHRlbmRpbmcgaW5zdHJ1Y3Rpb24gc2V0LgotCSogYXMuaDogRGVjbGFyZSBpbnN0dGJsX2ZpbGVfbmFtZTsKLQl0aGUgbmFtZSBvZiBmaWxlIGRlZmluaW5nIGV4dGVuc2lvbnMgdG8gdGhlIGJhc2ljIGluc3RydWN0aW9uIHNldCAKLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBBZGQgaXRibC1wYXJzZS5vLCBpdGJsLWxleC5vLCBhbmQgCi0JaXRibC1vcHMubyB0byBleHRyYV9vYmplY3RzIGZvciBtaXBzIGNvbmZpZ3VyYXRpb24uCi0JQWRkIGluY2x1ZGUgZmlsZSBsaW5rIGZyb20gaXRibC1jcHUuaCB0byAKLQljb25maWcvaXRibC0ke3RhcmdldF9jcHVfdHlwZX0uaC4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFsbG93IGNvcHogaW5zdHJ1Y3Rpb25zLgotCUFkZCBub3RlcyBmb3IgZnV0dXJlIGFkZGl0aW9ucyB0byB0aGUgaXRibCBzdXBwb3J0LgotCUFkZCBkZWJ1ZyBtYWNyb3MuCi0JKG1hY3JvKTogQ2FsbCBpdGJsX2Fzc2VtYmxlIHRvIGFzc2VtYmxlIGl0YmwgaW5zdHJ1Y3Rpb25zLgotCVNlZSBpZiBhbiB1bmtub3duIHJlZ2lzdGVyIGlzIHNwZWNpZmllZCBpbiBhbiBpdGJsIGVudHJ5LgotCi1TYXQgRmViIDIyIDIwOjUzOjAxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IEZpeCB0eXBvIGluIG1kX3NlY3Rpb25fYWxpZ24KLQlkZXNjcmlwdGlvbi4KLQkqIGNvbmZpZy90Yy10aWM4MC5oIChORUVEX0ZYX1JfVFlQRSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChmaW5kX29wY29kZSk6IEFkZCBjb2RlIHRvIHN1cHBvcnQgT19zeW1ib2wKLQlvcGVyYW5kcy4KLQkoYnVpbGRfaW5zbik6IEdyYWIgYSBmcmFnIGVhcmx5IHNvIHdlIGNhbiB1c2UgdGhlIGFkZHJlc3MgaW4KLSAJZml4dXBzLiAgVGFrZSBvbmUncyBjb21wbGVtZW50IG9mIEJJVE5VTSB2YWx1ZXMgYmVmb3JlIGluc2VydGlvbgotIAlpbiBvcGNvZGUuICBBZGQgY29kZSB0byBzdXBwb3J0IE9fc3ltYm9sIG9wZXJhbmRzLgotCShtZF9hcHBseV9maXgpOiBSZXBsYWNlIHVuaW1wbGVtZW50ZWQgd2FybmluZyB3aXRoIGltcGxlbWVudGF0aW9uLgotCShtZF9wY3JlbF9mcm9tKTogRGl0dG8uCi0JKHRjX2NvZmZfZml4MnJ0eXBlKTogRGl0dG8uCi0KLUZyaSBGZWIgMjEgMTQ6MzQ6MzEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogTmV3IGZ1bmN0aW9uLiAKLQkqIGNvbmZpZy90Yy1kMzB2Lmg6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IFJldHVybiAwIGlmCi0gICAgICAgIHJlbG9jYXRpb24gaXMgaW4gZGlmZmVyZW50IHNlY3Rpb24uCi0KLUZyaSBGZWIgMjEgMTA6MDg6MjUgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1pcHNfaXApOiBJZiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYgc3lzdGVtLAotCWRvbid0IHNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4KLQotRnJpIEZlYiAyMSAxMTo1NTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAnKicuCi0KLQkqIGFwcC5jIChMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzJORCk6IERvbid0IGRlZmluZS4KLQkoZG9fc2NydWJfYmVnaW4pOiBEb24ndCBzZXQgbGV4WycqJ10uCi0JKGRvX3NjcnViX2NoYXJzKTogV2hlbiBoYW5kbGluZyBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVCwgZG9uJ3QKLSAJY2hlY2sgZm9yIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMk5ELiAgSW5zdGVhZCwganVzdCBjaGVjayBmb3IKLQlhIGxpdGVyYWwgJyonLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbT1zdnI0IGZvciBtNjhrLSotc3lzdjQqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLXN2cjQuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2NvbW1lbnRfY2hhcnMpOiBPbmx5IGluY2x1ZGUgYCMnIGlmCi0JVEVfU1ZSNCBvciBURV9ERUxUQS4KLQotVGh1IEZlYiAyMCAyMjoyNDozOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IENyZWF0ZSBhIGZpeHVwIGZvciB0aGUKLQlzaG9ydCBjb25kaXRpb25hbCBicmFuY2ggYXJvdW5kIGEgbG9uZyB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KLQotVGh1IEZlYiAyMCAxMzo1NjowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9sbiBbYm90aCB2ZXJzaW9uc10pOiBDYWxsCi0JbmV3X2xvZ2ljYWxfbGluZS4KLQotCSogY29uZmlnL3RjLWFybS5jIChmaXhfbmV3X2FybSk6IFVzZSBtYWtlX2V4cHJfc3ltYm9sIHRvIGhhbmRsZSBhCi0JY29tcGxleCBleHByZXNzaW9uLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSWYgYm90aCBsZWZ0IGFuZCByaWdodAotCW9wZXJhbmRzIGFyZSB1bmRlZmluZWQsIHdhcm4gYWJvdXQgYm90aCBvZiB0aGVtLgotCi1XZWQgRmViIDE5IDAwOjUzOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCAic3ltdmVyIi4KLQkob2JqX2VsZl9zeW12ZXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBDb3B5IHRoZSBzdF9vdGhlcgotCWZpZWxkLgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTWFrZSB0eXBlIGFuZCBwcmludGYgZm9ybWF0IGFncmVlLgotCi0JKiByZWFkLmMgKGdldF9saW5lX3NiKTogRG9uJ3QgZW5kIHRoZSBsaW5lIG9uIGEgc2VtaWNvbG9uIGluc2lkZSBhCi0Jc3RyaW5nLgotCi1UdWUgRmViIDE4IDE4OjQyOjUxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jLCBjb25maWcvdGMtZDMwdi5oOiBOZXcgZmlsZXMuCi0KLSAJKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JCi0JKiBjb25maWd1cmUuaW46IEFkZCBjYXNlIGZvciBkMzB2LgotCi1TdW4gRmViIDE2IDE3OjQ3OjI5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfb3BlcmFuZCk6IERlZmluZSB3aXRoIGEgbnVsbCBleHBhbnNpb24sCi0JbGlrZSBhbGwgdGhlIG90aGVyIHRhcmdldHMuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogQWRkIG1pc3Npbmcgd29yZCBpbiAKLQltZF9mbHVzaF9wZW5kaW5nX291dHB1dCBkZXNjcmlwdGlvbi4gIEZpeCB0eXBvIGluIG1kX2NvbnZlcnRfZnJhZwotCWRlc2NyaXB0aW9uLgotCSogY29uZmlnL3RjLXRpYzgwOiBNaW5vciBjb21tZW50IGFkZGl0aW9ucy9jaGFuZ2VzLgotCQotRnJpIEZlYiAxNCAxODowOTo1OSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChMT0NBTF9MQUJFTCk6IE1hY3JvIHJlZGVmaW5lZCBpZiBURV9ERUxUQS4KLQkodGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogTWFjcm8gZGVmaW5lZCBpZiBURV9ERUxUQS4KLSAJKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGVmKTogVXNlCi0JdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlmIGRlZmluZWQuCi0JKG9ial9jb2ZmX3RhZywgb2JqX2NvZmZfdmFsKTogTGlrZXdpc2UuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBSZWplY3QgJ34nIGFzIG9wZXJhdG9yIGlmIGlzX25hbWVfYmVnaW5uZXIuCi0KLUZyaSBGZWIgMTQgMTc6MjQ6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gbm90ZXMgZnJvbSBQZXRlciBFcmlrc3NvbiA8cGV0ZXJAaWZtLmxpdS5zZT4uICBUaGUgdGFyZ2V0Ci0JZG9lcyBub3QgYWN0dWFsbHkgd29yaywgdGhvdWdoOgotCSogY29uZmlndXJlLmluIChpMzg2LXNlcXVlbnQtYnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGMtZHluaXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBEZWZpbmUgVEFSR0VUX0ZPUk1BVCBpZiBURV9EWU5JWC4KLQotCSogcmVhZC5jIChkb19hbGlnbik6IEFkZCBtYXggcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCVJlbW92ZSB1c2VsZXNzIHN0YXRpYyB2YXJpYWJsZXMuCi0JKHNfYWxpZ24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLiAgRG8gY29tbW9uIHBvcnRpb24gb2YKLQlzX2FsaWduX2J5dGVzIGFuZCBzX2FsaWduX3B0d28uCi0JKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IEp1c3QgY2FsbCBzX2FsaWduLgotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IEFkZCBtYXggcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShmcmFnX2FsaWduX3BhdHRlcm4pOiBMaWtld2lzZS4KLQkqIGZyYWdzLmggKGZyYWdfYWxpZ24sIGZyYWdfYWxpZ25fcGF0dGVybik6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTGltaXQgYWxpZ25tZW50IGNoYW5nZSB0byBmcl9zdWJ0eXBlLgotCUZpeCBzb21lIHR5cGVzIHRvIGJlIGFkZHJlc3NULgotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1pZWVlLmMgKHNpemVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWQxMHYuaCAobWRfZG9fYWxpZ24pOiBBZGQgbWF4IHBhcmFtZXRlci4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGFzLmg6IEltcHJvdmUgY29tbWVudHMgb24gcnNfYWxpZ24gYW5kIHJzX2FsaWduX2NvZGUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IGFsaWdubWVudCBhcmd1bWVudHMuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKEZyYWdzKTogRG9jdW1lbnQgdXNlIG9mIGZyX3N1YnR5cGUgZmllbGQgZm9yCi0JcnNfYWxpZ24gYW5kIHJzX2FsaWduX2NvZGUuCi0KLUZyaSBGZWIgMTQgMTU6NTY6MDYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IENoYW5nZWQgb3Bjb2RlIHBhcnNpbmcuCi0KLVRodSBGZWIgMTMgMjA6MDI6MTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy97dGMtYWxwaGEuaCwgdGMtZDEwdi5oLCB0Yy1nZW5lcmljLmgsIHRjLWk5NjAuaCwKLQl0Yy1tbjEwMjAwLmgsIHRjLW1uMTAzMDAuaCwgdGMtc2guaCwgdGMtdmF4LmgsIHRjLXc2NS5ofToKLQlBZGQgZGVmYXVsdCBkZWZpbml0aW9uIG9mIHplcm8gZm9yIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCSogY29uZmlnL3t0Yy1hcm0uaCwgdGMtaHBwYS5oLCB0Yy1pMzg2LmgsIHRjLW1pcHMuaCwgdGMtbnMzMmsuaCwKLSAJdGMtcHBjLmgsIHRjLXNwYXJjLmh9OiBNb3ZlIGRlZmluaXRpb24gb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLQl0byBhIGxvY2F0aW9uIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGluY2x1ZGUgZmlsZXMuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSZW1vdmUgbWlzbGVhZGluZyBjb21tZW50LgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IEFkZCBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbgotCW1kX3VuZGVmaW5lZF9zeW1ib2wuCi0JKiBjb25maWcvdGMtdGljODAuYzogQWRkIGNvZGUgdG8gaW5zZXJ0IHByZWRlZmluZWQgc3ltYm9scyBpbnRvIHRoZQotCXN5bWJvbCB0YWJsZSBzbyB0aGV5IGNhbiBiZSBwYXJzZWQgYnkgdGhlIHN0YW5kYXJkIGV4cHJlc3Npb24gcGFyc2VyLgotCVJlbW92ZSBjdXN0b20gY29kZSB0aGF0IHVzZSB0byBwYXJzZSB0aGVtLgotCSogY29uZmlnL3RjLXRpYzgwLmg6IE1vdmUgZGVmaW5pdGlvbiBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotCXRvIGEgbG9jYXRpb24gY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB0YXJnZXQgaW5jbHVkZSBmaWxlcy4KLQkKLVRodSBGZWIgMTMgMjE6NDQ6MTggMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGFzLmg6IEdOVSBjIHByb3ZpZGVzIHVubGluaygpIGZ1bmN0aW9uLgotCi0JVW5pZnkgc2VjdGlvbiBoYW5kbGluZyBvbiBvcGVuVk1TL0FscGhhOgotCSogY29uZmlnL3RjLWFscGhhLmMoc19hbHBoYV9saW5rKTogUmVtb3ZlLgotCShzX2FscGhhX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JUmVtb3ZlIGNhc2UtaGFja2luZyBvZiBzeW1ib2xzCi0JQWRkIC5jb2RlX2FkZHJlc3MgcHNldWRvLW9wLgotCShCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOiBOZXcgcmVsb2NhdGlvbi4KLQkoc19hbHBoYV9jb2RlX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0JKGFscGhhX2N0b3JzX3NlY3Rpb24sIGFscGhhX2R0b3JzX3NlY3Rpb24pOiBOZXcgc2VjdGlvbnMgZm9yIEMrKwotCXN0YXRpYyBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuCi0JQWRkIGRlYnVnIGNvZGUgZm9yIGNyYXNoIGRlYnVncywgdG8gYmUgcmVtb3ZlZCB3aGVuIHRyYWNlYmFjayBjb2RlCi0JaXMgYWRkZWQgdG8gb2JqZWN0IGNvZGUuCi0JKHNfYWxwaGFfbmFtZSk6IE5ldyBmdW5jdGlvbiBmb3IgLm5hbWUgcHNldWRvLW9wLgotCShhbHBoYV9wcmludF90b2tlbik6IE5ldyBmdW5jdGlvbiB0byBwcmludCB0b2tlbiBleHByZXNzaW9ucyB3aXRoCi0JYWxwaGEgc3BlY2lmaWMgZXh0ZW5zaW9ucy4KLQotCSogbWFrZWZpbGUudm1zOiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIGN1cnJlbnQgZ2NjIHNuYXBzaG90LgotCi1UaHUgRmViIDEzIDE2OjI5OjA0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKFRFWEkyRFZJKTogU2V0IHRvIGp1c3QgbmFtZSBvZiBwcm9ncmFtLgotCShEVklQUyk6IFNldCB0byBkdmlwcy4KLQkocHMsIGFzLnBzLCBnYXNwLnBzKTogTmV3IHRhcmdldHMuCi0JKGludGVybmFscy5pbmZvLCBnYXNwLmR2aSwgaW50ZXJuYWxzLmR2aSk6IFNldCBib3RoIFRFWElOUFVUUwotIAlhbmQgTUFLRUlORk8gZW52IHZhcmlhYmxlcy4KLQkoaW50ZXJuYWxzLnBzKTogVXNlIERWSVBTIG1hY3JvLgotCShjbGVhbik6IFJlbW92ZSBjb3JlIGFuZCBiYWNrdXAgZmlsZXMuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgZnJvbSBidWlsZGluZyBpbnRlcm5hbHMuCi0JKGNsZWFuLWR2aSk6IERpdHRvLgotCSogZG9jL2ludGVybmFscy50ZXhpIChGcmFncyk6IEZpeCB0eXBvLgotCShHQVMgcHJvY2Vzc2luZyk6IERpdHRvLgotCShDUFUgYmFja2VuZCk6IERpdHRvLgotCSogZWNvZmYuYyAoaW5pdF9maWxlKTogVXNlIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHZhbHVlIGRpcmVjdGx5LgotCSogbXB3LWNvbmZpZy5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGFzIDEuCi0JKiByZWFkLmM6IFJlbW92ZSB1Z2x5IGhhY2sgdGhhdCBkZWFsdCB3aXRoIGNvbmZpZyBmaWxlcyBub3QKLQljb3JyZWN0bHkgZGVmaW5pbmcgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKHRhcmdldF9iaWdfZW5kaWFuKTogVXNlIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGRpcmVjdGx5LgotCSogY29uZmlnL2FybS1iaWcubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAxLgotCSogY29uZmlnL2FybS1saXQubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAwLgotCSogY29uZmlnL21pcHMtYmlnLm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMS4KLQkqIGNvbmZpZy9taXBzLWxpdC5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDAuCi0JKiBjb25maWcvcHBjLWxpdC5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDEuCi0JKiBjb25maWcvcHBjLXNvbC5tdDogUmVwbGFjZSBUQVJHRVRfQllURVNfTElUVExFX0VORElBTgotCXdpdGggVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gZGVmaW5lZCB0byAwLgotCSogY29uZmlnL3RjLWFybS5oOiBSZW1vdmUgdXNlIG9mIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOCi0JYW5kIHNpbXBsaWZ5LiAgVGVzdCB2YWx1ZSBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTiwgbm90IGp1c3QKLQl3aGV0aGVyIGl0IGlzIGRlZmluZWQgb3Igbm90LgotCSogY29uZmlnL3RjLW1pcHMuaDogUmVtb3ZlIHVzZSBvZiBUQVJHRVRfQllURVNfTElUVExFX0VORElBTi4KLQkqIGNvbmZpZy90Yy1wcGMuaDogUmVtb3ZlIHVzZSBvZiBUQVJHRVRfQllURVNfTElUVExFX0VORElBTgotCWFuZCBzaW1wbGlmeS4gVGVzdCB2YWx1ZSBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTiwgbm90IGp1c3QKLQl3aGV0aGVyIGl0IGlzIGRlZmluZWQgb3Igbm90LgotCSogY29uZmlnL3RpYzgwLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgdG8gY29mZi10aWM4MC4KLQkoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUgdG8gMC4KLQotVGh1IEZlYiAxMyAxNDo0MDoxNiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBDb3JyZWN0IHRleHQgaW4gYXNfZmF0YWwgZXJyb3IgbWVzc2FnZSwKLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uIC0+IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uCi0KLVRodSBGZWIgMTMgMTQ6NDg6MDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoTEVYX1RJTERFKTogRGVmaW5lIGlmIFRFX0RFTFRBLgotCSogcmVhZC5jIChMRVhfVElMREUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGxleF90eXBlKTogVXNlIExFWF9USUxERS4KLQkqIGV4cHIuYyAoZ2V0X3N5bWJvbF9lbmQpOiBDaGVjayBmaXJzdCBjaGFyIHdpdGggaXNfbmFtZV9iZWdpbm5lciwKLQlub3QgaXNfcGFydF9vZl9uYW1lLgotCi1UaHUgRmViIDEzIDExOjQwOjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgbWlzc2luZyBiYWNrc2xhc2ggYXQgZW5kCi0Jb2YgY29udGludWVkIGxpbmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogQ29ycmVjdCBiYXNlIGFkZHJlc3MKLQlmb3IgYW4gZXh0ZW5kZWQgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChwcmV2X25vcF9mcmFnKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJldl9ub3BfZnJhZ19ob2xkcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcmV2X25vcF9mcmFnX3NpbmNlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwZW5kX2luc24pOiBJZiB3ZSBhcmVuJ3QgcmVvcmRlcmluZywgYW5kIHByZXZfbm9wX2ZyYWcgaXMgbm90Ci0JTlVMTCwgYW5kIHdlIGRvbid0IG5lZWQgYW55IG5vcHMsIHRoZW4gZGVjcmVhc2UgdGhlIHNpemUgb2YKLQlwcmV2X25vcF9mcmFnLiAgRG9uJ3QgaW5zZXJ0IG5vcHMgYmVjYXVzZSBvZiBpbnN0cnVjdGlvbnMgaW4KLQlub3Jlb3JkZXIgc2VjdGlvbnMuICBSZW1lbWJlciB3aGV0aGVyIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbnMKLQl3aGVyZSBpbiBub3Jlb3JkZXIgc2VjdGlvbnMgZXZlbiB3aGVuIG5vdCByZW9yZGVyaW5nLgotCShtaXBzX25vX3ByZXZfaW5zbik6IEFkZCBwcmVzZXJ2ZXIgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBSZWZlciBwcmV2X25vcF9mcmFnIHZhcmlhYmxlcyB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2VtaXRfZGVsYXlzKTogU2V0IHVwIHByZXZfbm9wX2ZyYWcuCi0JKHNfbWlwc3NldCk6IENsZWFyIHByZXZfbm9wX2ZyYWcgaWYgcmVvcmRlcmluZy4KLQotV2VkIEZlYiAxMiAxNDozNjoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUmVtb3ZlIHVzZWxlc3MgY29kZSB3aGljaAotCWhhbmRsZWQgc3dhcHBpbmcgYSBtaXBzMTYganVtcCB3aXRoIGEgbWlwczE2IGluc3RydWN0aW9uIHdpdGggYQotCXJlbG9jLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBXaGVuIGRlYnVnZ2luZywgc2V0Ci0JbWlwc19vcHRpbWl6ZSB0byAxLCBub3QgMC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogSGFuZGxlIGFuIGV4dGVuZCBvcGVyYW5kLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChteV9nZXRFeHByZXNzaW9uKTogSW4gbWlwczE2IG1vZGUsIGlmIGl0IGxvb2tzCi0JbGlrZSB0aGUgZXhwcmVzc2lvbiB3YXMgYmFzZWQgb24gYC4nLCBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZQotCXN5bWJvbC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQgdG8gcHV0IGFuCi0gCWV4dGVuZGVkIGluc3RydWN0aW9uIGluIGEgZGVsYXkgc2xvdCB3aGVuIG5vdCByZW9yZGVyaW5nLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBXYXJuIGlmIGFuIGV4dGVuZGVkIGluc3RydWN0aW9uIGFwcGVhcnMgaW4gYQotCWRlbGF5IHNsb3QuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogQWRkICJpbnNuIi4KLQkoc19pbnNuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLmluc24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQWRkIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyB0byB0aGUKLQlzeW1ib2wgdGFibGUuCi0JKG1pcHMxNl9pcCk6IEZpcnN0IHBhcnNlIHRoZSBleHByZXNzaW9uLCBhbmQgdGhlbiBzZWUgd2hldGhlciBpdAotCWNhbWUgdXAgd2l0aCBhIHJlZ2lzdGVyLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZmlyc3Qgc2VlIHdoZXRoZXIKLQl3ZSBhcmUgbG9va2luZyBhdCBhIHJlZ2lzdGVyLgotCi1UdWUgRmViIDExIDE1OjEzOjM5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYzogTnVtZXJvdXMgY2hhbmdlcyBhbmQgYWRkaXRpb25zIHRvIGZsZXNoCi0Jb3V0IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcHJldmlvdXNseSBqdXN0IHN0dWJzLCBhbmQgZml4IHNvbWUKLQlwcm9ibGVtcyBmb3VuZCB1c2luZyB0aGUgbmV3IFRJYzgwIHRlc3RzdWl0ZSBjYXNlcy4KLQotVHVlIEZlYiAxMSAxNTo1MjoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEhhbmRsZSAlZ3ByZWwgbW9kaWZpZXIuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE91dHB1dCBqdW1wIGluc3RydWN0aW9uIGFzIGEKLQlwYWlyIG9mIDIgYnl0ZSBpbnN0cnVjdGlvbnMsIHJhdGhlciB0aGFuIGFzIGEgc2luZ2xlIDQgYnl0ZQotCWluc3RydWN0aW9uLgotCi1Nb24gRmViIDEwIDIyOjA2OjAwIDE5OTcgIERhd24gUGVyY2hpayAgKGRhd25AY3lnbnVzLmNvbSkKLQotCSogaXRibC1vcHMuYywgaXRibC1sZXgubCwgaXRibC1wYXJzZS55LCBpdGJsLW9wcy5oLAotCWNvbmZpZy9pdGJsLW1pcHMuaDogQWRkIGNvcHlyaWdodCBtZXNzYWdlIGFuZCBmaXggaW5kZW50YXRpb24uCi0KLU1vbiBGZWIgMTAgMTg6MDk6MDAgMTk5NyAgRGF3biBQZXJjaGlrICAoZGF3bkBjeWdudXMuY29tKQotCi0JKiBpdGJsLW9wcy5jOiBOZXcgZmlsZS4gIEFkZCBzdXBwb3J0IGZvciBkeW5hbWljYWxseSByZWFkIAotCWluc3RydWN0aW9uIHJlZ2lzdGVycywgb3Bjb2RlcyBhbmQgZm9ybWF0cy4gIEJ1aWxkIGludGVybmFsIHRhYmxlIAotCWZvciBuZXcgaW5zdHJ1Y3Rpb25zIGFuZCBwcm92aWRlIGNhbGxiYWNrcyBmb3IgYXNzZW1ibGVyIGFuZCAKLQlkaXNhc3NlbWJsZXIuCi0JKiBpdGJsLWxleC5sLCBpdGJsLXBhcnNlLnk6IExleCBhbmQgeWFjYyBwYXJzZXJzIGZvciBpbnN0cnVjdGlvbiAKLQlzcGVjIHRhYmxlLgotCSogaXRibC1vcHMuaDogTmV3IGZpbGUuICBIZWFkZXIgZmlsZSBmb3IgaXRibCBzdXBwb3J0LgotCSogY29uZmlnL2l0YmwtbWlwcy5oOiBOZXcgZmlsZS4gIE1pcHMgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yCi0JaXRibCBzdXBwb3J0LgotCi1GcmkgRmViICA3IDA5OjUyOjM0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBJZiBhIGNvbnN0YW50IG9wZXJhbmQgd29uJ3QKLQlmaXQgaW50byB0aGUgY29uc3RhbnQgZmllbGQgb2YgYSByZWxheGFibGUgb3BlcmFuZCwgdGhlbiBpdCBkb2VzCi0Jbm90IG1hdGNoLgotCi1UaHUgRmViICA2IDIwOjA4OjEyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBUcmVhdAotCWEganNyIHRhcmdldCBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIGp1c3QgbGlrZSBhIGpzciB0bwotCWFuIHVuZGVmaW5lZCB0YXJnZXQuCi0KLVRodSBGZWIgIDYgMTY6NTI6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jYXRpb25zCi0JYWdhaW5zdCBhbnkgbWlwczE2IHN5bWJvbHMsIG5vdCBqdXN0IGV4dGVybmFsbHkgdmlzaWJsZSBvbmVzLgotCShtZF9hcHBseV9maXgpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotV2VkIEZlYiAgNSAxMToxMTowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEFjY2VwdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaW4KLQl0aGUgb3BlcmFuZCBvZiB0aGUgZXhpdCBpbnN0cnVjdGlvbi4KLQotVHVlIEZlYiAgNCAxNDoxMjozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJZiB3ZSBsZWF2ZSBhbiBlcXVhdGVkIHN5bWJvbAotCWFzIE9fc3ltYm9sLCBjb3B5IG92ZXIgdGhlIHNlZ21lbnQuCi0KLU1vbiBGZWIgIDMgMTI6MzU6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBJZiB3ZSBhcmVuJ3QgYWRqdXN0aW5nIHRoaXMKLQlmaXh1cCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbCwgYWRqdXN0IHRoZSB2YWx1ZQotCWFjY29yZGluZ2x5LgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3QgY2hhbmdlIFhfYWRkX251bWJlciBmb3IKLQlhbiBlcXVhdGVkIHN5bWJvbC4KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEF2b2lkIGxvb3Bpbmcgb24gZXF1YXRlZCBzeW1ib2xzLgotCUFkanVzdCBmeF9vZmZzZXQgYnkgWF9hZGRfbnVtYmVyIGZvciBlYWNoIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogQXZvaWQgbG9vcGluZyBvbiBlcXVhdGVkCi0Jc3ltYm9scy4KLQkoZml4dXBfc2VnbWVudCk6IEFkZCBhIGxvb3AgdG8gdHJhY2sgZG93biBlcXVhdGVkIHN5bWJvbHMgYW5kCi0JYWRqdXN0IGZ4X29mZnNldCBhcHByb3ByaWF0ZWx5LgotCi1GcmkgSmFuIDMxIDE1OjIxOjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBBZGQgZW50cmllcyB0byBhbGxvdwotCWptcCAtPiBicmEgcmVsYXhpbmcuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEhhbmRsZSBqbXAtPmJyYSByZWxheGluZy4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgam1wLT5icmEgcmVsYXhpbmcuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0KLUZyaSBKYW4gMzEgMTM6MTU6MDUgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBBZGQgY29tbWVudHMgZXhwbGFpbmluZyB0aGUKLQlub3AgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgSmFuIDMxIDEwOjQ2OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGVuZm9yY2VfYWxpZ25lZF9kYXRhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3BhcmNfY29uc19hbGlnbik6IERvbid0IGRvIGFueXRoaW5nIHVubGVzcyBlbmZvcmNlX2FsaWduZWRfZGF0YQotCWlzIHNldC4KLQkobWRfbG9uZ29wdHMpOiBBZGQgImVuZm9yY2UtYWxpZ25lZC1kYXRhIi4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLS1lbmZvcmNlLWFsaWduZWQtZGF0YS4KLQkqIGRvYy9jLXNwYXJjLnRleGkgKFNwYXJjLUFsaWduZWQtRGF0YSk6IE5ldyBub2RlOyBkb2N1bWVudAotCWVuZm9yY2UtYWxpZ25lZC1kYXRhLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IElmIE9CSl9YQ09GRiwgYWRkICJsb25nIiwKLSAJIndvcmQiLCBhbmQgInNob3J0Ii4KLQkocHBjX3hjb2ZmX2NvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogR2l2ZSBhbiBlcnJvciBpZiBhIC5zcGFjZSBzeW1ib2wgaXMKLQljb21tb24gb3IgdW5kZWZpbmVkLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IERvbid0IGhhbmRsZSBtcmlfcGVuZGluZ19hbGlnbiBpZgotCXRoZSBoYW5kbGVyIGlzIHNfZ2xvYmwgb3Igc19pZ25vcmUuCi0KLVRodSBKYW4gMzAgMTE6NDY6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAibnVtb3BzIi4KLQkqIGNvbmZpZy90Yy10aWM4MC5jOiBNYW55IGFkZGl0aW9ucyB0byBwcmV2aW91cyBwbGFjZWhvbGRlciBmaWxlLgotCSogY29uZmlnL3RjLXRpYzgwLmg6IERpdHRvLgotCi1UaHUgSmFuIDMwIDEyOjI4OjE4IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9hbGlnbl9jb2RlKTogSW1wcm92ZSB0aGUgbm9wIHBhdHRlcm5zLgotCi1UaHUgSmFuIDMwIDEyOjA4OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogQ2FsbCBtaXBzX2ZpeF9hZGp1c3RhYmxlLgotCShtaXBzX2ZpeF9hZGp1c3RhYmxlKTogRGVjbGFyZS4KLQotCUlkZWFzIGZyb20gU3Jpbml2YXMgQWRkYWdhcmxhIDxzcmluaXZhc0BjZG90ZC5lcm5ldC5pbj46Ci0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEFmdGVyIGRvaW5nIGFuIG1yaV9wZW5kaW5nX2FsaWduLAotCWFkanVzdCB0aGUgbGluZV9sYWJlbCBpZiB0aGVyZSBpcyBvbmUuCi0JKHNfc3BhY2UpOiBTZXQgbXJpX3BlbmRpbmdfYWxpZ24gaWYgYW4gb2RkIG51bWJlciBvZiBieXRlcyB3ZXJlCi0Jb3V0cHV0LgotCi1XZWQgSmFuIDI5IDE1OjMxOjEyIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9kb19hbGlnbik6IEFkZCB0aGlzIGhvb2sgdG8gY2FsbAotCWQxMHZfY2xlYW51cCgpIHdoZW4gYSAiLmFsaWduIiBpcyBkZXRlY3RlZC4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBDb3JyZWN0bHkgY2FsY3VsYXRlCi0JYnJhbmNoIGRpc3BsYWNlbWVudCB3aGVuIC5hbGlnbnMgYXJlIHByZXNlbnQuCi0KLVdlZCBKYW4gMjkgMDk6NDI6MTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IERlZmluZS4KLQkobWRfY29udmVydF9mcmFnKTogSW1wbGVtZW50LgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSByZWxheGFibGUgb3BlcmFuZHMvaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJbXBsZW1lbnQuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRGVmaW5lLgotCi1UdWUgSmFuIDI4IDE1OjI3OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBHaXZlIGFuIGVycm9yIGZvciBqdW1wcyB0byBhCi0JbWlzYWxpZ25lZCBhZGRyZXNzLgotCShtZF9hcHBseV9maXgpOiBNYWtlIGEgYnJhbmNoIHRvIGFuIG9kZCBhZGRyZXNzIGFuIGVycm9yIHJhdGhlcgotCXRoYW4gYSB3YXJuaW5nLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9jb252ZXJ0X2ZyYWcpOiBJZiB0aGUgdXNlciBleHBsaWNpdGx5Ci0JcmVxdWVzdGVkIGFuIGV4dGVuZGVkIG9wY29kZSwgcGFzcyB3YXJuIGFzIHRydWUgdG8gbWlwczE2X2ltbWVkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBIYW5kbGUgYSBtaXNzaW5nIGV4cHJlc3Npb24gbGlrZQotCWFuIGV4cGxpY2l0IDAsIHNvIHRoYXQgZXhwbGljaXRseSBleHRlbmRlZCBpbnN0cnVjdGlvbnMgd29yawotCWNvcnJlY3RseS4KLQotTW9uIEphbiAyNyAxNzo0MToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBEb24ndCBnZW5lcmF0ZSBhIGxvY2FsIEVDT0ZGCi0Jc3ltYm9sIGZvciBhIGNvbW1vbiBzeW1ib2wuCi0KLVdlZCBKYW4gMjIgMTA6Mzk6MzkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCVBhdGNoIHByZXN1bWVkIHRvIGhhdmUgYmVlbiBjaGVja2VkIGluIGF3aGlsZSBhZ28gYnV0IHdhc24ndC4KLQlNb24gTm92IDI1IDEwOjQ1OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCSogd3JpdGUuYzogRGVsZXRlICJpZm5kZWYgbWRfcmVsYXhfZnJhZyIgYXJvdW5kIGlzX2RucmFuZ2UuCi0JKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfb3JnKTogTW92ZSBjb2RlIGluc2lkZSBicmFjZXMuICBNb3ZlIGxvY2FscwotCXRhcmdldCxhZnRlciBpbnNpZGUgdG9vLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50KTogR3V0cyBtb3ZlZCB0byAuLi4KLQkocmVsYXhfZnJhZyk6IE5ldyBmdW5jdGlvbi4KLQlDYWxsIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiBpZiBkZWZpbmVkLgotCi1Nb24gSmFuIDIwIDEwOjU2OjQ3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVqZWN0IHBjLXJlbGF0aXZlIGFkZHJlc3NlcyBmb3IgdGhlCi0gCSdwJyBvcGVyYW5kIHNwZWNpZmllci4KLQotTW9uIEphbiAyMCAxMDozOTozNiAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoSEFWRV9MT05HX0JSQU5DSCk6IE5ldyBtYWNybywgcmV0dXJucyB0cnVlIGZvcgotIAltNjhrIGZhbWlseSBjcHVzIHdoaWNoIHN1cHBvcnQgbG9uZyBicmFuY2ggYWRkcmVzc2luZyBtb2Rlcy4KLQkobTY4a19pcCwgbWRfY29udmVydF9mcmFnXzEsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LAotIAltZF9jcmVhdGVfbG9uZ19qdW1wKTogVXNlIGl0LgotCi1Nb24gSmFuIDIwIDEyOjQyOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEb24ndCBzZXQgU0VDX0FMTE9DIG9yIFNFQ19MT0FEIGZvcgotCXRoZSAucmVnaW5mbyBvciAuTUlQUy5vcHRpb25zIHNlY3Rpb24gaWYgY29uZmlndXJlZCBmb3IgYW4KLQllbWJlZGRlZCB0YXJnZXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRG9uJ3Qgc2V0IGludGVybG9ja3MgZm9yCi0JbWlwc180NjUwLgotCi1XZWQgSmFuIDE1IDEzOjUxOjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBNYWtlIHN1cmUgdGhlIHN5bWJvbCBlbmRzIHdpdGgKLQl3aGl0ZXNwYWNlIGJlZm9yZSBjaGVja2luZyB3aGV0aGVyIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnPScuCi0KLVR1ZSBKYW4gMTQgMTU6MDc6MjcgMTk5NyAgUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNjb19pZCk6IE1vdmVkIGZyb20gaGVyZS4uLgotCSogY29uZmlnL29iai1lbGYuYyAoc2NvX2lkKTogLi4udG8gaGVyZS4gIEFkZGluZyB0aGUgaWRlbnRpZmllcgotCXJlYWxseSBpcyBhbiBTQ08gRUxGIHNwZWNpZmljIHRoaW5nLCBub3QganVzdCBhIFNDTyB4ODYgc3BlY2lmaWMKLQl0aGluZy4KLQotTW9uIEphbiAxMyAyMjo0MzowMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogRG9uJ3QgcmVxdWlyZSAnY29mZicuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBKYW4gIDkgMDk6MDg6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IENoZWNrIGZvciBvdmVyZmxvdyBvZiBhIG5lZ2F0aXZlIHZhbHVlCi0JY29ycmVjdGx5LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IGxhYmVsX2xpbmUpOiBEZWZpbmUuCi0JKGxhYmVscywgY3VycmVudF9sYWJlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtZF9hc3NlbWJsZSk6IE1hcmsgY3VycmVudF9sYWJlbCBhcyB0ZXh0LCBhbmQgY2xlYXIgaXQuCi0JKG02OGtfZnJvYl9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkobTY4a19mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KLQkobTY4a19mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVmaW5lLgotCSh0Y19mcm9iX3N5bWJvbCk6IERvbid0IHdhcm4sIGp1c3QgY2FsbCBtNjhrX2Zyb2Jfc3ltYm9sLgotCSh0Y19mcm9iX2NvZmZfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogV2hlbiBkZWZpbmluZyBhIG1hY3JvIGluIE1SSSBtb2RlLAotCWRvbid0IGFkZCB0aGUgc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0KLVR1ZSBKYW4gIDcgMTE6MjE6NDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jICh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgc3ltMS1zeW0yIGZpeHVwcwotCWhlcmUgc2luY2UgZml4dXBfc2VnbWVudCBkb2Vzbid0IChsaW5rcmVsYXggaXMgc2V0KS4KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1Nb24gSmFuICA2IDE1OjE5OjMyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBUd2VhayBmeF9vZmZzZXQgZm9yIHBjLXJlbGF0aXZlCi0JcmVsb2NzLgotCi1GcmkgSmFuICAzIDE2OjQ3OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCk6IFR3ZWFrIGZ4X3JfZmllbGQncyB0eXBlCi0JdG8gYXZvaWQgd2FybmluZ3Mgd2l0aCB0aGUgbmF0aXZlIEhQIGNvbXBpbGVyLgotCShmaXhfbmV3X2hwcGEpOiBTaW1pbGFybHkgZm9yIHRoZSByX3R5cGUgYXJndW1lbnQuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSwgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24pOiBFbmNsb3NlCi0JaW4gYW4gI2lmIE9CSl9FTEYgdG8ga2VlcCBnY2MgLVdhbGwgcXVpZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IEFsd2F5cyBpbml0aWFsaXplICJyZXN1bHQiLgotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IEdlbmVyYXRlIHJlbG9jYXRpb25zLgotCi1GcmkgSmFuICAzIDE4OjE3OjIzIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2V2ZW4pOiBBZGp1c3QgdGhlIGFsaWdubWVudCBvZiB0aGUgY3VycmVudAotCXNlY3Rpb24uCi0KLUZyaSBKYW4gIDMgMTc6MTA6MzMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9maWxlX3N5bWJvbCk6IFdoZW4gdXNpbmcgRUNPRkYgZGVidWdnaW5nLAotCXBhc3Mgb24gdGhlIG5ldyBmaWxlIGhvb2suCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9maXhfYWRqdXN0YWJsZSk6IE5vdCBxdWl0ZSB0aGUgc2FtZSBhcwotCSFhbHBoYV9mb3JjZV9yZWxvY2F0aW9uLCBhcyBsb2NhbCBMSVRFUkFMcyBjYW4gYmUgYWRqdXN0ZWQgdG8gYmUKLQlyZWxhdGl2ZSB0byB0aGUgc2VjdGlvbi4KLQotRnJpIEphbiAgMyAxMjowOToyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh5YW5rX3N5bWJvbHMpOiBJZiB0Y19mcm9iX2NvZmZfc3ltYm9sIGlzCi0JZGVmaW5lZCwgY2FsbCBpdC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2Zyb2Jfc3ltYm9sKTogQ2hlY2sgd2hldGhlciB0ZXh0IGxhYmVsIGlzCi0JYWxpZ25lZCB0byBvZGQgYm91bmRhcnkuCi0JKHRjX2Zyb2JfY29mZl9zeW1ib2wpOiBEZWZpbmUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChTZXQpOiBDaGFuZ2UgcGFyZW50aGVzaXplZCBAeHJlZiB0byBAcHhyZWYuCi0KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogSW4gTVJJIG1vZGUsIGp1c3QgY29weSBhIHNpbmdsZSAmLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQ2FsbCBmcmFnX2dyb3cgYmVmb3JlIGFkZGluZyBhCi0JUENJTkRFWCBmcmFnLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWNjZXB0ICdCJyBhcyBhIHNpemUgZm9yIGFuCi0JaW1tZWRpYXRlIHZhbHVlLgotCShtZF9hc3NlbWJsZSk6IElmIHRoZSBzaXplIGlzICdCJywgc2V0IGZ4X3NpZ25lZC4KLQkobWRfYXBwbHlfZml4XzIpOiBVc2UgZnhfc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIGZ4X3NpZ25lZCBmaWVsZC4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIGZ4X25vX292ZXJmbG93IGFuZAotCWZ4X3NpZ25lZCBmaWVsZHMuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgZnhfc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGVjayBmeF9ub19vdmVyZmxvdyBhbmQKLQlmeF9zaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCi0KLVRodSBKYW4gIDIgMTM6Mzc6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBOT1RFUywgTk9URVMuY29uZmlnOiBSZW1vdmVkLiAgVGhlc2UgYXJlIHJhcmVseSwgaWYgZXZlciwKLQl1cGRhdGVkLCBhbmQgYWxsIHRoZSB1c2VmdWwgaW5mb3JtYXRpb24gaXMgaW4gZG9jL2ludGVybmFscy50ZXhpLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGVjayBmb3IgY29uZGl0aW9uYWwgb3BlcmF0b3JzCi0JYmVmb3JlIGRvaW5nIGFuIE1SSSBwZW5kaW5nIGFsaWdubWVudC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3ApOiBEZWNsYXJlLgotCSh0Y19jb25kaXRpb25hbF9wc2V1ZG9wKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19jb25kaXRpb25hbF9wc2V1ZG9wKTogTmV3IGZ1bmN0aW9uLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IERlc2NyaWJlCi0JdGNfY29uZGl0aW9uYWxfcHNldWRvb3AuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX3JlbDMyX2Zyb21fY21kbGluZSk6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBDaGVjayBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSBiZWZvcmUgc2V0dGluZwotCW02OGtfcmVsMzIuCi0JKG02OGtfbXJpX21vZGVfY2hhbmdlKTogTGlrZXdpc2UuCi0JKG1kX2xvbmdvcHRzKTogQWRkIC0tZGlzcC1zaXplLWRlZmF1bHQtMTYgYW5kCi0JLS1kaXNwLXNpemUtZGVmYXVsdC0zMi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1PcHRzKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQpOiBOZXcgc3RhdGljCi0JdmFyaWFibGUuCi0JKG02OGtfaXApOiBVc2UgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0IHRvIHNldCB0aGUgc2l6ZSBvZiBhIGJhc2UKLQlyZWdpc3RlciB3aG9zZSBzaXplIHdhcyBub3QgZ2l2ZW4uCi0JKG1kX2xvbmdvcHRzKTogQWRkIC0tYmFzZS1zaXplLWRlZmF1bHQtMTYgYW5kCi0JLS1iYXNlLXNpemUtZGVmYXVsdC0zMi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1PcHRzKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQkqIGRvYy9jLW1pcHMudGV4aTogTWVudGlvbiBJU0EgbGV2ZWwgNCwgYW5kIHRoZSAtbWlwczE2IG9wdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbWlwcy0qLWxpbnV4KiB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZXdyaXRlIDY0IGJpdCBoYW5kbGluZyB0bwotCXdvcmsgaWYgdmFsdWVUIGlzIG9ubHkgMzIgYml0cy4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVGhyb3VnaG91dCwgY2hlY2sgdGFyZ2V0X2JpZ19lbmRpYW4gcmF0aGVyCi0gCXRoYW4gYnl0ZV9vcmRlci4KLSAJKGJ5dGVfb3JkZXIpOiBSZW1vdmUuCi0JKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogUmVtb3ZlLgotCSogY29uZmlnL3RjLW1pcHMuaCAoTElUVExFX0VORElBTiwgQklHX0VORElBTik6IERvbid0IGRlZmluZS4KLQkobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWNsYXJlLgotCSh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lIGlmCi0JT0JKX01BWUJFX0VMRi4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDMxIDE1OjEyOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJZiB0aGlzIGlzIHNzdC57aCx3fSBvcgotCXNsZC57aCx3fSBhbmQgdGhlIG9wZXJhbmQgaXMgcmVsb2NhdGFibGUsIGFkanVzdCB0aGUgYWRlbmQgYnkKLQlzaGlmdGluZyBpdCByaWdodCBvbmUgYml0LgotCi1UdWUgRGVjIDMxIDEyOjU2OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGVjayBtcmlfcGVuZGluZ19hbGlnbiBhZnRlcgotCWNoZWNraW5nIGZvciBhIG1hY3JvLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlCi0JPHJmZ0Btb25rZXlzLmNvbT4uCi0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogUmVuYW1lIGZyb20gbWRfYXBwbHlfZml4LCBhbmQKLSAJYWRkIHNlZ21lbnQgYXJndW1lbnQuICBJZiBPQkpfRUxGLCB0cmVhdCBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0gCXN5bWJvbCBpbiBhIGxpbmtvbmNlIHNlY3Rpb24gbGlrZSBhIHJlbG9jYXRpb24gYWdhaW5zdCBhbiBleHRlcm5hbAotIAlzeW1ib2wuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotTW9uIERlYyAzMCAxMTozNTo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9tYWNybyk6IEFkZCBjYXNlIGZvciBNX0FCUy4KLQotRnJpIERlYyAyNyAyMjo1MTo1MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTk9URVMuY29uZmlnIChJbXBsZW1lbnRhdGlvbik6IGFzLmggI2RlZmluZSdzICJHQVMiIG5vdCAiZ2FzIiwKLQlpbmNsdWRlcyBjb25maWcuaCBpbnN0ZWFkIG9mIGhvc3QuaCwgdGMuaCBpbnN0ZWFkIG9mIHRwLmgsIGFuZAotCXRhcmctZW52LmggaW5zdGVhZCBvZiB0YXJnZXQtZW52aXJvbm1lbnQuaC4KLQlBbHNvLCBvYmotZm9ybWF0LmggaW5jbHVkZXMgdGFyZy1jcHUuaCBpbnN0ZWFkIG9mCi0gCXRhcmdldC1wcm9jZXNzb3IuaC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSk6IEFkZCB0aWM4MC0qLWNvZmYgZW50cnkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmL3RpYzgwLmgpOiBJbmNsdWRlIGlmIFRDX1RJQzgwIGRlZmluZWQuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgdG8gImNvZmYtdGljODAiLgotCSogY29uZmlnL3RjLXRpYzgwLmM6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCSogY29uZmlnL3RjLXRpYzgwLmg6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCQotRnJpIERlYyAyNyAxMTo0MjoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChNKTogTWVudGlvbiBleHBsaWNpdGx5IHRoYXQgLU0gY2hhbmdlcyBtYWNybwotCWhhbmRsaW5nLgotCi1UaHUgRGVjIDE5IDEyOjA2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBJZiB0aGUgZml4dXAgc3ltYm9sIGhhcyBiZWVuCi0JZXF1YXRlZCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLCBjb252ZXJ0IHRoZSBmaXh1cCB0byBiZWluZyBhZ2FpbnN0Ci0JdGhlIHRhcmdldCBzeW1ib2wuICBSZW1vdmUgb2Jzb2xldGUgY29kZSBoYW5kbGluZyBhIHNwZWNpYWwgY2FzZQotCWZvciBpMzg2IFBJQy4KLQotV2VkIERlYyAxOCAyMjo1NDozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZSBmb3IgaW5zdGFsbGF0aW9uLgotCi1XZWQgRGVjIDE4IDE2OjAwOjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkb19hc3NlbWJsZSk6IENvcnJlY3QgcHJldmlvdXMgYnVnIGZpeC4KLQotV2VkIERlYyAxOCAxNToyNzo0MCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBGaXggYnVnIHdoaWNoIGNhdXNlZAotCXNlY29uZCBpbnN0cnVjdGlvbiBpbiBhIGxpbmUgdG8gYmUgY2FzZSBzZW5zaXRpemUuCi0KLVdlZCBEZWMgMTggMTA6MDg6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtbjEwMjAwX2luc2VydF9vcGVyYW5kKTogRG9uJ3QKLQlyYW5nZSBjaGVjayBvcGVyYW5kcyB3aXRoIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLIHNldC4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDE3IDEwOjU5OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kbyBwYXJ0IG9mIGxhc3QgRnJpZGF5J3MgYWxpZ25tZW50IGNoYW5nZXMuCi0gCShtZF9iZWdpbik6IEFsd2F5cyBhbGlnbiB0aGUgdGV4dCBzZWN0aW9uIHRvIGEgZm91ciBieXRlCi0JYm91bmRhcnkuCi0JKGFwcGVuZF9pbnNuKTogUmVtb3ZlIGNhbGwgdG8gcmVjb3JkX2FsaWduLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChpbnNuX2xhYmVsKTogUmVtb3ZlLgotCShzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0KTogRGVmaW5lLgotCShpbnNuX2xhYmVscywgZnJlZV9pbnNuX2xhYmVscyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtaXBzX2NsZWFyX2luc25fbGFiZWxzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXBwZW5kX2luc24pOiBNYXJrIGFsbCBtaXBzMTYgdGV4dCBsYWJlbHMsIGFuZCBtYWtlIHRoZW0gb2RkLgotCUhhbmRsZSBhbGwgbGFiZWxzIGFmdGVyIGVtaXR0aW5nIGEgbm9wLCBub3QganVzdCBvbmUuICBDYWxsCi0JbWlwc19jbGVhcl9pbnNuX2xhYmVscyByYXRoZXIgdGhhbiBqdXN0IGNsZWFyaW5nIGluc25fbGFiZWwuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBBZGQgaW5zbnMgcGFyYW1ldGVyLCBhbmQgdXNlIGl0IHRvIGRlY2lkZQotCXdoZXRoZXIgdG8gbWFyayBtaXBzMTYgbGFiZWxzLiAgSGFuZGxlIGFsbCBsYWJlbHMsIG5vdCBqdXN0IG9uZS4KLQlGb3JjZSBtaXBzMTYgbGFiZWxzIHRvIGJlIG9kZC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWlwczE2X2ltbWVkKTogRG9uJ3QgY2hlY2sgZm9yIGFuIG9kZCBicmFuY2ggdGFyZ2V0LgotCShtZF9hcHBseV9maXgpOiBEb24ndCBjaGVjayBtaXBzMTYgbW9kZSBmb3IgYSBicmFuY2ggcmVsb2MuCi0JKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogSWdub3JlIHRoZSBsb3cgYml0IGluIGEgYnJhbmNoIHRhcmdldC4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQ2FsbCBtaXBzX2NsZWFyX2luc25fbGFiZWxzIHJhdGhlciB0aGFuIGp1c3QKLQljbGVhcmluZyBpbnNuX2xhYmVsLgotCShtaXBzX2FsaWduLCBtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0LCBzX2NvbnMpOiBMaWtld2lzZS4KLQkoc19mbG9hdF9jb25zLCBzX2dwd29yZCk6IExpa2V3aXNlLgotCShzX2FsaWduKTogVXNlIGluc25fbGFiZWxzIHJhdGhlciB0aGFuIGluc25fbGFiZWwuCi0JKHNfY29ucywgc19mbG9hdF9jb25zLCBzX2dwd29yZCk6IExpa2V3aXNlLgotCShtaXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZGVmaW5lX2xhYmVsKTogUmV3cml0ZSB0byBhZGQgdG8gaW5zbl9sYWJlbHMgbGlzdC4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSWYgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBjb21lcwotCW91dCBvZGQsIGluY3JlbWVudCBpdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBPbmx5IHVwZGF0ZSBwcmV2X2luc24gd2hlbiBub3QKLQlyZW9yZGVyaW5nIGlmIHBsYWNlIGlzIE5VTEwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IENoZWNrIGZvciBhIG1pc3NpbmcgZXhwcmVzc2lvbgotCXdoZW4gdXNpbmcgdGhlIHJlZ2lzdGVyIGluZGlyZWN0IGFkZHJlc3NpbmcgbW9kZS4KLQotTW9uIERlYyAxNiAxMDowODo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQpOiBEb24ndAotCWNoZWNrIDI0Yml0IG9wZXJhbmRzIGZvciBvdmVyZmxvdy4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1Nb24gRGVjIDE2IDExOjUwOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKFNlY3Rpb24pOiBEb2N1bWVudCBob3cgdG8gdXNlIHRoZSAuc2VjdGlvbgotCXBzZXVkby1vcCBmb3IgQ09GRiBhbmQgRUxGLgotCi1TdW4gRGVjIDE1IDE1OjI2OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBGaXggbGlua29uY2UgY2hlY2sgZm9yIEVMRi4KLQotU2F0IERlYyAxNCAyMjozNzoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHByZXZfaW5zbl9yZWxvY190eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoUkVMQVhfTUlQUzE2X0VOQ09ERSk6IEFkZCBkc2xvdCBhbmQgamFsX2RzbG90IGFyZ3VtZW50cywgYW5kCi0Jc3RvcmUgdGhlbS4gIEFkanVzdCBvdGhlciBSRUxBWF9NSVBTMTYgbWFjcm9zLgotCShSRUxBWF9NSVBTMTZfRFNMT1QpOiBEZWZpbmUuCi0JKFJFTEFYX01JUFMxNl9KQUxfRFNMT1QpOiBEZWZpbmUuCi0JKGFwcGVuZF9pbnNuKTogUGFzcyBuZXcgYXJndW1lbnRzIHRvIFJFTEFYX01JUFMxNl9FTkNPREUuICBDb3JyZWN0Ci0JaGFuZGxpbmcgb2Ygd2hldGhlciBwcmV2aW91cyBpbnN0cnVjdGlvbiBoYXMgYSBmaXh1cC4gIFNldAotCXByZXZfaW5zbl9yZWxvY190eXBlLgotCShtaXBzX25vX3ByZXZfaW5zbik6IENsZWFyIHByZXZfaW5zbl9yZWxvY190eXBlLgotCShtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IFVzZSB0aGUgcmlnaHQgYmFzZSBhZGRyZXNzIGZvciBhIFBDCi0JcmVsYXRpdmUgYWRkIG9yIGxvYWQuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLiAgSWYgYSBQQyByZWxhdGl2ZSBhZGQgb3IgbG9hZCBpcwotCXVzZWQsIHJlY29yZCB0aGUgYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbi4KLQotRnJpIERlYyAxMyAxMzowMDozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3QgcmVkdWNlIGEgcmVsb2MgYWdhaW5zdCBhCi0JbGlua29uY2Ugc2VjdGlvbiBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9tYWNybyk6IFJlbW92ZSBub3AgaW5zdHJ1Y3Rpb25zIGFmdGVyCi0JYnJhbmNoIGluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYKLQlzeXN0ZW0sIGRvbid0IHNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4KLQkoc19jaGFuZ2Vfc2VjKTogTGlrZXdpc2UuCi0JKGFwcGVuZF9pbnNuKTogQ2FsbCByZWNvcmRfYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbi4KLQkobWRfc2VjdGlvbl9hbGlnbik6IERvbid0IGFsaWduIHRoZSBzZWN0aW9uIHNpemUgZm9yIGFuIGVtYmVkZGVkCi0JRUxGIHN5c3RlbS4KLQotVGh1IERlYyAxMiAxNjo0MDo0NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogTWFrZSBzdXJlIHRoYXQgc3ltYm9scyBhcmUKLQlyZXNvbHZlZDsgZXhwcmVzc2lvbiBzeW1ib2xzIG1heSBoYXZlIGJlZW4gc2tpcHBlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0KLVRodSBEZWMgMTIgMTU6MTg6MjEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogTW92ZSBAcGx0IHRvCi0JQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCByZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogU3VwcG9ydCBCRkRfUkVMT0NfMjRfUExUX1BDUkVMLgotCi1UdWUgRGVjIDEwIDEzOjUxOjU1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogUmVtb3ZlIGNvZGUgdGhhdCBjYWxsZWQKLQlwYXJhbGxlbF9vaygpIHdoZW4gdGhlIHByb2dyYW1tZXIgc3BlY2lmaWVkIHBhcmFsbGVsIGluc3RydWN0aW9ucy4KLQotVHVlIERlYyAxMCAxMjoyMzoxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVXBkYXRlIHRvIGhhbmRsZSBlbmRpYW5uZXNzCi0JaXNzdWVzIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBPcGNvZGUgMHgwIGlzIHZhbGlkIQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotVHVlIERlYyAxMCAxMTozNzoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tCi0JaW4gYSBmcmFnIGFmdGVyIGEgbWlwczE2IGluc3RydWN0aW9uIHRvIHN3aXRjaCBpdCB3aXRoIGEganVtcAotCWluc3RydWN0aW9uLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IEdpdmUgYW4gZXJyb3IgZm9yIGFuCi0JYXR0ZW1wdCB0byB1c2UgYSBub24gYWJzb2x1dGUgc3ltYm9sIGluIGFuIGV4dGVuZGluZyBmcmFnLgotCi1Nb24gRGVjICA5IDE2OjQ4OjIwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYzogRmxlc2ggb3V0IGFzc2VtYmxlciBzdXBwb3J0IGZvciBNTjEwMjAwLgotCSogY29uZmlnL3RjLW1uMTAyMDAuaDogTGlrZXdpc2UuCi0KLU1vbiBEZWMgIDkgMTc6MDk6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBBdCB0aGUgZW5kIG9mIGEgQyBjb21tZW50LCBwYXNzIHNwYWNlIHRvCi0JVU5HRVQgcmF0aGVyIHRoYW4gUFVULiAgU2V0IG9sZF9zdGF0ZSBiZWZvcmUgc2V0dGluZyBzdGF0ZSB0byAtMi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBBdm9pZCBhbiBpbmZpbml0ZSBsb29wCi0Jd2hlbiBleHRlbmRpbmcgYmVjYXVzZSB0aGUgdmFsdWUgaXMgZXhhY3RseSBtYXh0aW55ICsgMS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoUkVMQVhfTUlQUzE2X0VOQ09ERSk6IEFkZCBzbWFsbCBhbmQgZXh0Ci0JYXJndW1lbnRzLCBhbmQgc3RvcmUgdGhlbS4gIEFkanVzdCBvdGhlciBSRUxBWF9NSVBTMTYgbWFjcm9zLgotCShSRUxBWF9NSVBTMTZfVVNFUl9TTUFMTCk6IERlZmluZS4KLQkoUkVMQVhfTUlQUzE2X1VTRVJfRVhUKTogRGVmaW5lLgotCShtaXBzMTZfc21hbGwsIG1pcHMxNl9leHQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoYXBwZW5kX2luc24pOiBQYXNzIG1pcHMxNl9zbWFsbCBhbmQgbWlwczE2X2V4dCB0bwotCVJFTEFYX01JUFMxNl9FTkNPREUuCi0JKG1pcHMxNl9pcCk6IFNldCBtaXBzMTZfc21hbGwgYW5kIG1pcHMxNl9leHQuCi0JKG1pcHMxNl9pbW1lZCk6IERvbid0IGNoZWNrIG1pcHMxNl9hdXRvZXh0ZW5kLgotCShtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IENoZWNrIFVTRVJfU01BTEwgYW5kIFVTRVJfRVhULgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBQcmludCBhbiBlcnJvciBmb3IgYW4gb3V0IG9mIHJhbmdlCi0JZml4dXAsIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLQkqIGFzLmMgKG1haW4pOiBVbmxpbmsgdGhlIG91dHB1dCBmaWxlIGlmIHRoZXJlIGFyZSBlcnJvcnMgd2hpbGUKLQlnZW5lcmF0aW5nIHRoZSBmaXh1cHMuCi0KLUZyaSBEZWMgIDYgMTg6NDg6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IERvbid0IGNhbGwKLQlTX0dFVF9WQUxVRS4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBiZWZvcmUgY2FsbGluZwotCVNfR0VUX1ZBTFVFLCBhbmQgZG9uJ3QgYWRkIGluIHRoZSBmcmFnIGFkZHJlc3MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pbW1lZCk6IEFkZCBmaWxlIGFuZCBsaW5lIHBhcmFtZXRlcnMsCi0JYW5kIHVzZSB0aGVtIHdoZW4gcmVwb3J0aW5nIGVycm9ycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotRnJpIERlYyAgNiAxNTozNjozMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmM6IEZpeCB2YXJpb3VzIGdjYyAtV2FsbCB3YXJuaW5ncy4KLQlSZW1vdmUgJyQnIHByZWZpeGluZyBmb3IgcmVnaXN0ZXJzLgotCi1GcmkgRGVjICA2IDAwOjU1OjQ4IDE5OTYgIE1hcnRpbiAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBDaGVjayB0byBzZWUgaWYgcHJldl9zZWcKLQlpcyBpbml0aWFsaXplZCBiZWZvcmUgdXNpbmcgaXQuCi0JKGQxMHZfY2xlYW51cCk6IE5vIGxvbmdlciB1c2VzIGl0cyBhcmd1bWVudCwgc28gbWFrZSBpdCB2b2lkLgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChkMTB2X2NsZWFudXApOiBDaGFuZ2UgcHJvdG90eXBlLgotCQotVGh1IERlYyAgNSAxMTowMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkaXNjYXJkIHRoZSBzeW1ib2wgZm9yIGEgUEMKLQlyZWxhdGl2ZSBmaXh1cCB0byBhbiBhYnNvbHV0ZSBzeW1ib2wuCi0KLVdlZCBEZWMgIDQgMTU6NDI6NDEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlLCBkMTB2X2NsZWFudXApOiBGaXggYnVnCi0Jd2l0aCBtdWx0aXBsZSBzZWN0aW9ucy4KLQotV2VkIERlYyAgNCAxMzowMDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2xvbmdvcHRzKTogUmVuYW1lIG1pcHMtMTYgdG8gbWlwczE2LCBhbmQKLQluby1taXBzLTE2IHRvIG5vLW1pcHMxNi4KLQkoc19taXBzc2V0KTogQWNjZXB0IC5zZXQgbWlwczE2IGFuZCAuc2V0IG5vbWlwczE2LgotCi1XZWQgRGVjICA0IDEwOjM1OjMzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFRha2UgZXhwcmVzc2lvblMgcG9pbnRlcgotCWFyZ3VtZW50LCBhbmQgY2hlY2sgZm9yICsvLSBjb25zdGFudCBmb2xsb3dpbmcgdGhlIHN1ZmZpeCwgZm9sZGluZwotCWl0IGludG8gdGhlIGV4cHJlc3Npb24uCi0JKHBwY19lbGZfY29ucyk6IENoYW5nZSBwcGNfZWxmX3N1ZmZpeCBjYWxscy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkoc2hsaWIpOiBSZXBsYWNlIGJvb2xlYW4gbXJlbG9jYXRhYmxlIHdpdGggZW51bWVyYXRpb24gc2hsaWIuCi0JKG1kX3BhcnNlX29wdGlvbik6IERpc2NyaW1pbmF0ZSBiZXR3ZWVuIFBJQyBzdHlsZSBzaGFyZWQgbGlicmFyaWVzCi0JYW5kIC1tcmVsb2NhdGFibGUuCi0JKHBwY19lbGZfdmFsaWRhdGVfZml4KTogRG9uJ3QgcmVwb3J0IHdhcm5pbmdzIGZvciBQSUMgc3R5bGUgc2hhcmVkCi0JbGlicmFyaWVzLgotCi1UdWUgRGVjICAzIDIzOjE4OjI5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oICh7dGMscHBjfV9jb21tZW50X2NoYXJzKTogRGVmaW5lLCBzbyB0aGF0IHdlIGNhbgotCWNoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXJzLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKGNvbW1lbnRfY2hhcnMpOiBEZWxldGUgaW4gZmF2b3Igb2YKLQl0Y19jb21tZW50X2NoYXJzLgotCShwcGNfe2VhYmksc29sYXJpc31fY29tbWVudF9jaGFycyk6IEVhYmkgYW5kIFNvbGFyaXMgdmVyc2lvbnMgb2YKLQljb21tZW50IGNoYXJzLgotCShwcGNfY29tbWVudF9jaGFycyk6IFNlbGVjdCBhcHByb3ByaWF0ZSBjb21tZW50IGNoYXJzIGJ5IGRlZmF1bHQuCi0JKG1zb2xhcmlzKTogTmV3IGZsYWcgZm9yIC1teyxuby19c29sYXJpcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1LIHBpYy4gIEFkZCBzdXBwb3J0IGZvcgotCS1teyxuby19c29sYXJpcy4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZS4KLQkobWRfYmVnaW4pOiBEbyBub3Qgc2V0IEVMRiBmbGFncyBpZiBTb2xhcmlzLgotCShwcGNfZWxmX3N1ZmZpeCk6IEBsb2NhbCBzZXRzIFJfUFBDX0xPQ0FMMjRQQyByZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX0xPQ0FMMjRQQy4KLQotTW9uIERlYyAgMiAxMzo0ODo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dC4KLQotU3VuIERlYyAgMSAyMTo0NjowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbl9yZWxvYyk6IEdldCB0aGUgYWRkZW5kIGZyb20KLQlmeF9vZmZzZXQsIG5vdCBmeF9hZGRudW1iZXIuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgZG8gYW55Ci0JcmVsb2MgYWRqdXN0bWVudHMuCi0KLVNhdCBOb3YgMzAgMTc6MzQ6NDggMTk5NiAgRWxpb3QgRHJlc3NlbGhhdXMgIDxlbGlvdEB3YWxseS5lZGMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBDb3JyZWN0IG1pc3NwZWxsaW5nOiBiYWxlbmNlZCB0byBiYWxhbmNlZC4KLQotV2VkIE5vdiAyNyAxMzoyNTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBDaGVjayBmb3IgYW4gYWxpZ25tZW50IG9mCi0JNCwgbm90IGFuIGFsaWdubWVudCBvZiAxNi4gIENvcnJlY3RzIEF1Z3VzdCA3IHBhdGNoLgotCi1UdWUgTm92IDI2IDEwOjMzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogRG9uJ3QgZ2l2ZSBhbiBlcnJvciBpZiBubwotCWFsaWdubWVudCBpcyBzcGVjaWZpZWQuCi0KLQlBZGQgc3VwcG9ydCBmb3IgbWlwczE2ICgxNiBiaXQgTUlQUyBpbXBsZW1lbnRhdGlvbik6Ci0JKiBjb25maWcvdGMtbWlwcy5jOiBFeHRlbnNpdmUgYWRkaXRpb25zIGZvciBtaXBzMTYgc3VwcG9ydCwgbm90Ci0JbGlzdGVkIGhlcmUuCi0JKFJFTEFYX09MRCwgUkVMQVhfTkVXKTogVXNlIG9ubHkgNyBiaXRzIGVhY2guCi0JKGluc25fdXNlc19yZWcpOiBDaGFuZ2UgbGFzdCBwYXJhbWV0ZXIgdG8gYW4gZW51bS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMU19ET0xMQVIpOiBEZWZpbmUgYXMgMC4KLQkobWRfcmVsYXhfZnJhZyk6IERlZmluZSBhcyBtaXBzX3JlbGF4X2ZyYWcuCi0JKG1pcHNfcmVsYXhfZnJhZyk6IERlY2xhcmUuCi0JKHN0cnVjdCBtaXBzX2NsX2luc24pOiBBZGQgdXNlX2V4dGVuZCBhbmQgZXh0ZW5kIGZpZWxkcy4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX0dFVF9PVEhFUik6IERlZmluZS4KLQkoU19TRVRfT1RIRVIpOiBEZWZpbmUuCi0KLU1vbiBOb3YgMjUgMTg6MDI6MjkgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSW1wbGVtZW50IGNhc2VzIGZvciBuZXcgPCwgPiwgbSwgbiwKLSAJbyBhbmQgcCBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLU1vbiBOb3YgMjUgMTA6NDU6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmM6IERlbGV0ZSAiaWZuZGVmIG1kX3JlbGF4X2ZyYWciIGFyb3VuZCBpc19kbnJhbmdlLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX29yZyk6IE1vdmUgY29kZSBpbnNpZGUgYnJhY2VzLiAgTW92ZSBsb2NhbHMKLQl0YXJnZXQsYWZ0ZXIgaW5zaWRlIHRvby4KLQkocmVsYXhfc2VnbWVudCwgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudCk6IEd1dHMgbW92ZWQgdG8gLi4uCi0JKHJlbGF4X2ZyYWcpOiBOZXcgZnVuY3Rpb24uCi0JQ2FsbCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gaWYgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG1kX3ByZXBhcmVfcmVsYXhfc2Nhbik6IFJlbmFtZWQgZnJvbQotCU02OEtfQUlNX0tMVURHRS4KLQotTW9uIE5vdiAyNSAwODo0OTozNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKGFkZHJlc3NfcmVnaXN0ZXJzKTogVXNlICckJyBhcyByZWdpc3RlcgotCXByZWZpeCBpbnN0ZWFkIG9mICclJy4KLQkoZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycywgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAoYWRkcmVzc19yZWdpc3RlcnMpOiBVc2UgJyUnIHByZWZpeCBmb3IgcmVncy4KLQkoZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycywgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0bHkgZGV0ZXJtaW5lIHRoZQotCWNvcnJlY3QgbG9jYXRpb24gYW5kIHR5cGUgZm9yIGVhY2ggcmVsb2NhdGlvbi4KLQkobWRfcGNyZWxfZnJvbSk6IFNpbXBsaWZ5LgotCi1GcmkgTm92IDIyIDE1OjQyOjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEltcHJvdmUgd2FybmluZyB3aGVuIGJyYW5jaCBpcwotCWNvbnZlcnRlZCBpbnRvIGJyYW5jaCBhcm91bmQgYnJhbmNoLgotCi1UaHUgTm92IDIxIDExOjU2OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuaCAoRElGRl9FWFBSX09LKTogRG9uJ3QgZGVmaW5lIHRoaXMuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcyBhZ2FpbnN0IHdlYWsgc3ltYm9scyBvciAKLQlwYy1yZWxhdGl2ZSByZWxvY3MuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9iZWdpbik6IFNldCBsaW5rcmVsYXguCi0JKG1kX2Fzc2VtYmxlKTogQ3JlYXRlIGZpeHVwcyBhcyBuZWVkZWQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBHdXQuICBJdCBzaG91bGRuJ3QgZXZlciBnZXQgY2FsbGVkIGFueW1vcmUuCi0KLVR1ZSBOb3YgMTkgMTc6NDg6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IFdoZW4gYXV0b21hdGljYWxseSBjb252ZXJ0aW5nCi0Jc2VyaWFsIG9wcyB0byBwYXJhbGxlbCwgZG8gbm90IGNvbnNpZGVyIGEgYnJhbmNoIGFzIHRoZSBmaXJzdAotCWluc3RydWN0aW9uLgotCi1UdWUgTm92IDE5IDEzOjM1OjIyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNULgotCi1Nb24gTm92IDE4IDE1OjI2OjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IFByb3ZpZGUgcHJvdG90eXBlCi0JdmlhIFBBUkFNUy4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1Nb24gTm92IDE4IDE1OjIyOjI4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBCcmFuY2ggYW5kIGxpbmsgaW5zdHJ1Y3Rpb25zCi0JbW9kaWZ5IHIxMy4KLQkod3JpdGVfMl9zaG9ydCk6IENhbGwgcGFyYWxsZWxfb2sgdG8gY2hlY2sgd2hldGhlciB0d28gc2hvcnQKLQlpbnN0cnVjdGlvbnMgdGhlIHVzZXIgcmVxdWVzdGVkIGV4ZWN1dGUgaW4gcGFyYWxsZWwsIGNhbiBiZQotCWV4ZWN1dGVkIHRoYXQgd2F5LgotCi1UaHUgTm92IDE0IDExOjE3OjQ5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogRml4IGJ1ZyB0aGF0IHdvdWxkbid0Ci0JYWxsb3cgYSBicmFuY2ggYW5kIGxpbmsgaW4gcGFyYWxsZWwgd2l0aCBhbiBleGUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBOb3YgIDggMTM6NTU6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWQxMHYudGV4aTogQWRkIGluZm8gb24gQHdvcmQgbW9kaWZpZXIuCi0KLVdlZCBOb3YgIDYgMTM6NDY6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IE1OMTAzMDBfT1BFUkFORF9TUExJVAotCW9wZXJhbmRzIGFyZSBhc3N1bWVkIHRvIGJlIDMyYml0cy4gIFVzZSAiYml0cyIgZmllbGQgdG8gaG9sZCB0aGUKLQludW1iZXIgb2YgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQuCi0JKG1uMTAzMDBfY2hlY2tfb3BlcmFuZCk6IE1OMTAzMDBfT1BFUkFORF9TUExJVCBvcGVyYW5kcyBhcmUgYXNzdW1lZAotCXRvIGJlIDMyYml0cy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IFNoaWZ0IGxvdyBwYXJ0Ci0Jb2YgYSBNTjEwMzAwX09QRVJBTkRfU1BMSVQgb3BlcmFuZCBieSBvcGVyYW5kLT5zaGlmdC4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEhhbmRsZQotCU1OMTAzMDBfT1BFUkFORF9TUExJVC4KLQotVHVlIE5vdiAgNSAxMzozMDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogSW5zZXJ0IG9wZXJhbmRzIGludG8KLQl0aGUgZXh0ZW5zaW9uIHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGlmIG5lY2Vzc2FyeS4KLQkobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBwb2ludGVyIHRvIGV4dGVuc2lvbiB3b3JkCi0JYXJndW1lbnQuICBNYWtlIGluc24gYSBwb2ludGVyIGFyZ3VtZW50IHRvby4gIFJldHVybiB0eXBlCi0JaXMgbm93IHZvaWQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi1Nb24gTm92ICA0IDEyOjUzOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEhhbmRsZQotCXJlcGVhdGVkIHJlZ2lzdGVyIG9wZXJhbmRzLgotCi1GcmkgTm92ICAxIDEwOjQyOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZGVkIHNlY3Rpb24gb24gcmVwb3J0aW5nIGJ1Z3MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBDaGFuZ2UgdXNlcyBvZiB2b2lkICogdG8gUFRSLiAgQ2hhbmdlIHRoZQotCWFscGhhX21hY3JvIGVtaXQgZmllbGQgdG8gZXhwZWN0IGEgY29uc3QgYXJndW1lbnQsIGFuZCBjaGFuZ2UgdGhlCi0JYXJnIGZpZWxkIHRvIGJlIGNvbnN0LiAgRml4IHNvbWUgc3BhY2luZyB0byBmb2xsb3cgdGhlIEdOVQotCXN0YW5kYXJkLgotCi1GcmkgTm92ICAxIDEwOjMyOjAzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIGtub3dsZWRnZSBvZiAyMTE2NHBjCi0JKHBjYTU2KSBhbmQgMjEyNjQgKGV2NikgY3B1cy4KLQkobWRfYXBwbHlfZml4KTogUHJpdmF0ZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBub3cgbmVnYXRpdmUuCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKGVtaXRfaW5zbik6IExpa2V3aXNlLgotCShlbWl0X2xkWHUpOiBEbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiB0aGUgaGFyZHdhcmUgY2FuIGRvIGJ5dGUgaW5zbnMuCi0JKGVtaXRfc3RYKTogTGlrZXdpc2UuCi0JKGVtaXRfc2V4dFgpOiBMaWtld2lzZS4KLQotVGh1IE9jdCAzMSAxNjozMzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgotCWEgc3ltYm9sIGZvdW5kIGluIGEgcmVsb2MuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIGlmCi0JYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLVdlZCBPY3QgMzAgMjA6MTU6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IFJld3JpdGUsIGFuZCBhZGQgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbi4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW50ZXJuYWxzLmluZm8pOiBOZXcgdGFyZ2V0LgotCi1XZWQgT2N0IDMwIDE0OjU1OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzCi0JYWdhaW5zdCB3ZWFrIHN5bWJvbHMuCi0KLVR1ZSBPY3QgMjkgMTI6Mjg6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IERvbid0IGxvc2UgZm9yIHJlbGF4YWJsZQotCWFkZHJlc3NlcyBsaWtlIC4rNi4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfY29udmVydF9mcmFnKTogTWFrZSBzdXJlIHdlIGluc2VydCB0aGUKLQlmaXh1cCBhdCB0aGUgcmlnaHQgYWRkcmVzcyB3aXRoaW4gdGhlIGZyYWcuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IERvbid0IHNldCBmcmFnUC0+ZnJfZml4Ci0JdG8gYW4gYWJzb2x1dGUgdmFsdWUsIGluc3RlYWQgaW5jcmVtZW50IGl0IGFzIG5lZWRlZC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEZpeCBzb21lIGluZGVudGlvbiBwcm9ibGVtcy4KLQkobWRfcmVsYXhfdGFibGUpOiBEZWZpbmUgZm9yIEQ5LT5EOTkgYnJhbmNoIGRpc3BsYWNlbWVudAotCXJlbGF4aW5nLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEbyBzb21ldGhpbmcgdXNlZnVsIGluc3RlYWQgb2YgYWJvcnRpbmcuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0JKG1kX2Fzc2VtYmxlKTogTm90ZSBpZiB0aGUgbWF0Y2hpbmcgaW5zdHJ1Y3Rpb24gaGFzIGEgcmVsYXhhYmxlCi0Jb3BlcmFuZC4gIElmIGl0IGRvZXMsIGFsbG9jYXRlIGZyYWcgd2l0aCBmcmFnX3ZhciBhbmQgZG9uJ3QKLQlkbyBhbnkgZml4dXBzLgotCi1Nb24gT2N0IDI4IDEwOjQ4OjQwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9jbGVhbnVwKTogTmV3IGZ1bmN0aW9uLiAgVGhpcyBpcyBuZWVkZWQgdG8KLQl3cml0ZSBvdXQgYW55IGJ1ZmZlcmVkIGluc3RydWN0aW9ucyB3aGVuIGEgIi5lbmQiIGlzIGZvdW5kLgotCi1Nb24gT2N0IDI4IDEwOjQzOjQ1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE5ldyBob29rIG1kX2NsZWFudXAoKS4KLQotRnJpIE9jdCAyNSAwMDowMTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogVXNlIG1ha2VfZXhwcl9zeW1ib2wgdG8gYnVpbGQgYW4KLQlleHByZXNzaW9uIHN5bWJvbCBmb3IgYSBjb21wbGV4IGZpeHVwLgotCi1UaHUgT2N0IDI0IDE0OjMxOjA0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBTZXZlcmFsIGRpc2d1c3RpbmcKLQloYWNrcyB0byBpbXByb3ZlIHBhcnNpbmcgb2YgY29tcGxleCBoaSwgbG8sIHpkYSwgZXRjCi0JZXhwcmVzc2lvbnMuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZGVtYW5kIGFuZCBlYXQgYSB0cmFpbGluZyAnKScgYWZ0ZXIgZmluZGluZwotCWEgdjg1MCByZWxvY2F0aW9uIHByZWZpeC4gIFNpZ24gZXh0ZW5kIHRoZSBjb25zdGFudCBpbiBhCi0JQkZEX1JFTE9DX0xPMTYgZXhwcmVzc2lvbi4gIERvIGVhdCBhIHRyYWlsaW5nICcpJyBhZnRlciBhIGNvbXBsZXRlCi0Jb3BlcmFuZC4KLQkocGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTApOiBEb24ndCBlYXQgYSB0cmFpbGluZyAnKScgYWZ0ZXIKLQlmaW5kaW5nIGEgdjg1MCByZWxvY2F0aW9uIHByZWZpeC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKTogRGVmaW5lLgotCShUQ19DT05TX0ZJWF9ORVcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwKTogTmV3IGZ1bmN0aW9uLgotCShjb25zX2ZpeF9uZXdfdjg1MCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtdjg1MC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBUREEgcmVsb2NzLgotCi1XZWQgT2N0IDIzIDE4OjIwOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogR2l2ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UKLQlmb3IgYW4gdW5rbm93biByZWxvY2F0aW9uIHR5cGUuCi0KLVdlZCBPY3QgMjMgMTY6MjE6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgLndvcmQ7IGFsbG9jYXRlcwotCTQgYnl0ZXMgb2Ygc3BhY2UuCi0KLVR1ZSBPY3QgMjIgMjI6MDE6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBUREFPRkYgcmVsb2NzCi0JZGlmZmVyZW50bHkgZm9yIG1vdmVhICYgc3N0L3NsZCBpbnNucy4KLQotVHVlIE9jdCAyMiAxNzowOTozMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogRG9uJ3QgYWxsb3cgaWxsZWdhbCBjb21iaW5hdGlvbnMKLQlvZiBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBPY3QgMjIgMTE6Mjg6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBBZGQgZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBmaWVsZC4KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAob2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zvcm1hdF9vcHMpOiBJbml0aWFsaXplIG5ldwotCWZyb2JfZmlsZV9hZnRlcl9yZWxvY3MgZmllbGQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZm9ybWF0X29wcyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgYmVmb3JlCi0JaW5jbHVkaW5nIG9iai1lbGYuaC4KLQotTW9uIE9jdCAyMSAxMTozODozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNvbnNfZml4X25ld19taXBzKTogT25seSB0cmVhdCA4IGJ5dGUgcmVsb2MKLQlzcGVjaWFsbHkgaWYgbm90IEVMRi4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ182NC4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ182NC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IERvbid0IGluY3JlbWVudCB2YWx1ZSBmb3IgYSBQQwotIAlyZWxhdGl2ZSByZWxvYyB3aGVuIEJGRF9BU1NFTUJMRVIgYW5kIE9CSl9BT1VUIChtb3JlIHVnbHkgZ2FzCi0gCXJlbG9jIGhhY2tpbmcpLgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19ERUZJTkUpOiBub24gQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOgotCURvbid0IGNoZWNrIFNfR0VUX09USEVSLgotCi1GcmkgT2N0IDE4IDE0OjA2OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEFjY2VwdCBhbiBvZGQgZmxvYXRpbmcgcG9pbnQKLQlyZWdpc3RlciB3aXRoIGwucyBvciBzLnMuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfcHNldWRvX3RhYmxlKTogVXNlIG9ial9hb3V0X3R5cGUgZm9yCi0JLnR5cGUgcHNldWRvLW9wLgotCShvYmpfYW91dF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotVGh1IE9jdCAxNyAxNzo1NToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSlMpKTogRGVwZW5kIHVwb24gbGliaWJlcnR5LmguCi0KLVdlZCBPY3QgMTYgMTE6Mjg6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IFJlY29nbml6ZSB6ZGFvZmYsIHRkYW9mZgotCWFuZCBzZGFvZmYgZXhwcmVzc2lvbnMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgotCVRDX1Y4NTAgYW5kIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtdjg1MC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBhbnkKLQlwYy1yZWxhdGl2ZSBmaXh1cHMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BjcmVsX2Zyb20pOiBVbmRvIHllc3RlcmRheSdzIGNoYW5nZXMuCi0JKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTUgMjM6MTk6MDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogRGVmaW5lLgotCi1Nb24gT2N0IDE0IDEzOjU5OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEFkZCBjYXN0IHRvIG9mZnNldFQgd2hlbiB1c2luZwotCWEgY29uc3RhbnQgd2l0aCAmfi4KLQotTW9uIE9jdCAxNCAxMToyNDoyOCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IE1vdmUgRUNPRkYgZGVidWcgcHJvY2Vzc2luZyB0byAuLi4KLQkoZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiAuLi4gaGVyZS4gIE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9tX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogTmV3IG1hY3JvLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsICpmcm9iX2FmdGVyX3JlbG9jcyBhZnRlciB0aGUKLQljYWxsIHRvIHdyaXRlX3JlbG9jcy4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IFVzZSBuZXcgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMIHJlbG9jLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogRG9uJ3QgU0VUX1ZBTFVFIG9uIHRoZSBzZWN0aW9uCi0Jc3ltYm9sLCBhcyB0aGlzIG1lc3NlcyB1cCBsaW5raW5nLiAgSW5zdGVhZCwgZXhwYW5kIHRoZSByZWN1cnNpdmUgY2FsbAotCWlubGluZSBhbmQgY2hhbmdlIHVwIHRoZSBhcHByb3ByaWF0ZSBiaXRzIHRvIGdldCB0aGUgMHg4MDAwIG9mZnNldAotCWluIHRoZSByZWxvYyBhZGRlbmQuCi0KLVRodSBPY3QgMTAgMTc6MzA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBQZXJtaXQgdGhlIGRpZmZlcmVuY2Ugb2YKLQl0d28gc3ltYm9scyBpbiB0aGUgc2FtZSBzZWdtZW50IHRvIGJlIGFkanVzdGVkLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGdldCBjb25mdXNlZCBieSBDUFUtVkVORE9SLWxpbnV4LWdudS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE9jdCAxMCAxNzoyMjoxOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogQ2hhbmdlIG1vc3Qgd2FybmluZ3MgaW50bwotCWVycm9ycy4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBEaXR0by4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkocHBjX3RjKTogRGl0dG8uCi0JKHBwY19wZV9zZWN0aW9uKTogRGl0dG8uCi0JKHBwY19mcm9iX3N5bWJvbCk6IERpdHRvLgotCi1UaHUgT2N0IDEwIDEyOjA1OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBQYXNzIGFuIGV4dHJhIHNoaWZ0IGNvdW50Ci0JdG8gbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCBiYXNlZCBvbiB0aGUgb3Bjb2RlIGZvcm1hdC4KLQkobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBhbmQgdXNlIGV4dHJhIHNoaWZ0IGNvdW50Ci0JcGFyYW1ldGVyLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFVzZSBGTVRfKiBtYWNyb3MgZm9yCi0JZm9ybWF0cyByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIGNvbnN0YW50cy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBGb3JtYXQgRDUgaW5zdHJ1Y3Rpb25zCi0JYXJlIDcgYnl0ZXMgbG9uZy4gIFdyaXRlIG91dCBpbnN0cnVjdGlvbnMgaW4gYmlnLWVuZGlhbiBmb3JtYXQuCi0KLVR1ZSBPY3QgIDggMTQ6NTY6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFR3ZWFrIGZ1cnRoZXIgc28KLQl0aGF0IGFsbCBpbnN0cnVjdGlvbnMgYXJlIHBhcnNlZCBjb3JyZWN0bHkuCi0KLVR1ZSBPY3QgIDggMTM6MDI6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IERvbid0IGRlY2xhcmUuCi0JKiBhcy5jOiBEb24ndCBpbmNsdWRlIGxpYmliZXJ0eS5oLgotCSogZXhwci5jLCByZWFkLmMsIHN0YWJzLmMsIGNvbmZpZy9vYmotY29mZi5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IExpa2V3aXNlLgotCSogbWVzc2FnZXMuYzogTGlrZXdpc2UuCi0JKHhzdHJlcnJvcik6IERvbid0IGRlY2xhcmUuCi0JKiB4bWFsbG9jLmM6IFJlbW92ZS4KLQotTW9uIE9jdCAgNyAxNjo1MzoyMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgUmVtb3ZlLgotCShzeXN0ZW1fcmVnaXN0ZXJzLCBjY19uYW1lcyk6IExpa2V3aXNlLgotCShhZGRyZXNzX3JlZ2lzdGVycywgZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycyk6IE5ldyByZWdpc3RlcgotCWFycmF5cy4KLQkocmVnaXN0ZXJfbmFtZSwgc3lzdGVtX3JlZ2lzdGVyX25hbWUsIGNjX25hbWUpOiBSZW1vdmUuCi0JKG1uMTAzMDBfcmVsb2NfcHJlZml4KTogTGlrZXdpc2UuCi0JKGRhdGFfcmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoYWRkcmVzc19yZWdpc3Rlcl9uYW1lLCBvdGhlcl9yZWdpc3Rlcl9uYW1lKTogTGlrZXdpc2UuCi0JKG1kX2Fzc2VtYmxlKTogUm91Z2ggY3V0IGF0IHBhcnNpbmcgb3BlcmFuZHMuICBSZW1vdmUgbG90cyBvZgotCXVud2FudGVkIGNvZGUuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEaXNhYmxlIGZvciBub3cuCi0KLU1vbiBPY3QgIDcgMTE6Mzg6MzQgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNlbGVjdF9jb250cm9sX3JlZ3MpOiBOZXcgZnVuY3Rpb24sIGV4dHJhY3RlZAotCW91dCBvZiBtNjhrX2luaXRfYWZ0ZXJfYXJncy4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgaXQuCi0JKG1yaV9jaGlwKTogVXNlIGl0IGhlcmUgYXMgd2VsbCB0byB1cGRhdGUgc2V0IG9mIGFsbG93ZWQgY29udHJvbAotCXJlZ3MgZm9yIG1vdmVjLgotCi1Nb24gT2N0ICA3IDExOjI0OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2JlZ2luKTogTmV3IGZ1bmN0aW9uLgotCShvYmpfZWxmX3NlY3Rpb24pOiBBZGQgdGhlIHNlY3Rpb24gc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfYmVnaW4pOiBEZWZpbmUuCi0JKGVsZl9iZWdpbik6IERlY2xhcmUuCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIG9ial9iZWdpbiBpZiBpdCBpcwotCWRlZmluZWQuCi0KLUZyaSBPY3QgIDQgMTg6Mzc6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFN1YnRyYWN0IHRoZSBzZWN0aW9uIGFkZHJlc3MKLQlmcm9tIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgVENfTTY4Sy4KLQotVGh1IE9jdCAgMyAxNToxNTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBNYWtlIC51YWhhbGYsIC51YXdvcmQsIGFuZAotCS51YXh3b3JkIGF2YWlsYWJsZSBldmVuIGlmIG5vdCBPQkpfRUxGLgotCShtZF9hdG9mKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSB3b3JkUC4KLQotVGh1IE9jdCAgMyAwMDoxNjo1MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEweDAwLmMsIGNvbmZpZy90Yy1tbjEweDAwLmg6IE5ldyBmaWxlcwotCWZvciBNYXRzdXNoaXRhIE1OMTB4MDAgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG1uMTB4MDAtKi0qCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVdlZCBPY3QgIDIgMTU6NTQ6MDMgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG9iai1ldmF4Lmg6IG1vdmUgb3BlbnZtcyBkZWZpbml0aW9ucyBmcm9tIGhlcmUgdG8gdGMtYWxwaGEuYy4KLQkqIHRjLWFscGhhLmM6IGFkZCBzdXBwb3J0IGZvciB2bXNfY2FzZV9oYWNrIGxpa2UgaW4gdmF4L3Ztcy4KLQkobG9hZF9leHByZXNzaW9uKTogdHJhY2sgY2xvYmJlcmluZyBvZiBiYXNlIHJlZyBiZWZvcmUgam1wL2pzci4KLQkoc19hbHBoYV9maWxlKTogcGFzcyBjYXNlX2hhY2sgZmxhZ3MgYW5kIHNvdXJjZSBmaWxlbmFtZSB2aWEKLQlzeW1ib2wgdGFibGUgdG8gYmZkLgotCSogdGMtYWxwaGEuaCAoVENfQ09OU19GSVhfTkVXKTogZGVmaW5lCi0KLVR1ZSBPY3QgIDEgMTY6MTY6MDEgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcy0qLWVsZiouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBPY3QgIDEgMTI6Mzc6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbWFjcm8pOiBXYXJuIGlmIGEgbWFjcm8gaGFzIHRoZSBzYW1lIG5hbWUgYXMgYQotCXBzZXVkby1vcC4KLQkoc19zcGFjZSk6IEluIG02OGsgTVJJIG1vZGUsIGFsaWduIHRvIGEgd29yZCBib3VuZGFyeS4KLQkqIG1hY3JvLmMgKGRlZmluZV9tYWNybyk6IEFkZCBuYW1lcCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkqIG1hY3JvLmggKGRlZmluZV9tYWNybyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkocGFyc2VfYXJncyk6IENoYW5nZSB2ZXJzaW9uIHByaW50aW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VCi0Jc3RhbmRhcmRzLgotCSogZ2FzcC5jIChzaG93X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2hhbmdlIHZlcnNpb24gcHJpbnRpbmcgdG8gbWF0Y2ggY3VycmVudCBHTlUgc3RhbmRhcmRzLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogQ29ycmVjdCBhY2Nlc3MgY29udHJvbCB1bml0Ci0JcmVnaXN0ZXIgbnVtYmVycy4gIEZyb20gS2VuIFJvc2UgPHJvc2VAbmV0Y29tLmNvbT4uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgc29tZSBzdGF0aWMgZnVuY3Rpb24gcHJvdG90eXBlcy4KLSAJKGFscGhhX21hY3Jvcyk6IE1vdmUgdG8gdG9wIG9mIGZpbGUuICBNYWtlIHN0YXRpYy4KLQkoYWxwaGFfbnVtX21hY3Jvcyk6IE1vdmUgdG8gdG9wIG9mIGZpbGUuCi0KLVR1ZSBPY3QgIDEgMDk6MzY6MTkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdGMtdjg1MC5oOiAgRGVmaW5lIExPQ0FMX0xBQkVMIHRvIHJlY29nbmlzZSBfLkxfKiBzeW1ib2xzCi0JZ2VuZXJhdGVkIGJ5IERXQVJGLgotCi1TYXQgU2VwIDI4IDAzOjM4OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IFJlbW92ZSBib2d1cyBjb2RlIGluIEJGRDY0IGNhc2UsCi0JYW5kIGp1c3QgY2FsbCBzcHJpbnRmX3ZtYS4KLQotVGh1IFNlcCAyNiAxNjowNDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoZXhwcik6IENoYW5nZSA+Pj0gdG8gPj4gKGZpeCB0eXBvKS4gIChGcm9tIG1laXNzbmVyKS4KLQotVHVlIFNlcCAyNCAxOTowNTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZmxvYXRfY29ucyk6IENhbGwgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgaWYgaXQgaXMKLQlkZWZpbmVkLgotCi1UdWUgU2VwIDI0IDEyOjIyOjE4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9vcGVyYW5kKTogQ3JlYXRlZC4gIEFsbG93cyBvcGVyYW5kcyB0byAKLQlzdGFydCB3aXRoICcjJy4KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX29wZXJhbmQpOiBVbmRlZmluZWQuCi0KLU1vbiBTZXAgMjMgMTI6MTM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChhZGRfZml4KTogVHJlYXQgYSB3aWR0aCBvZiAnMycgbGlrZSAnQicuCi0JKG1kX2Fzc2VtYmxlKTogQSBmaXh1cCB3aWR0aCBvZiAnMycgbWVhbnMgYSAxIGJ5dGUgcmVsb2MuCi0KLVRodSBTZXAgMTkgMTI6MjE6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkanVzdCBQQyByZWxhdGl2ZQotCXJlbG9jIGZvciB0aGUgaTk2MCBmb3IgYSByZWxvYyBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgVGhpcyB1bmRvZXMKLQlvbmUgb2YgdGhlIHR3byBjaGFuZ2VzIG1hZGUgQXVnIDE5LgotCi1XZWQgU2VwIDE4IDEyOjExOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogQm90aCB2ZXJzaW9uczogTW92ZSBDX1NUQVQKLQlzeW1ib2xzIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi1Nb24gU2VwIDE2IDExOjQxOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChleHByKTogQWx3YXlzIHVzZSB1bnNpZ25lZCByaWdodCBzaGlmdHMgZm9yID4+LgotCi1UaHUgU2VwIDEyIDEwOjI1OjQ1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogVXBkYXRlIHR3byB0aHVtYiBpbnN0cnVjdGlvbgotIAlzbG90cyB3aGVuIHByb2Nlc3NpbmcgQkwgZml4dXBzLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG91dHB1dF9pbnN0KTogRW5zdXJlIFRodW1iIEJMIGZpeHVwIGlzIG1hcmtlZAotIAlvbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBTZXAgMTEgMDA6MDk6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogQ3JlYXRlIGFuIGV4cHJlc3Npb24gc3ltYm9sIGZvciBhIGNvbXBsZXgKLQlzdGFicyBleHByZXNzaW9uLCByYXRoZXIgdGhhbiBnaXZpbmcgYW4gZXJyb3IuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX25ld19maWxlKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgYXJlIHN0aWxsIGluCi0JdGhlIHNhbWUgZmlsZS4KLQotVHVlIFNlcCAxMCAxMTo0NTozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRmlsbCBpbiB0aGUgdmFsdWUgZm9yIGEgY29uc3RhbnQKLQlqdW1wLCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIHJlbG9jLgotCi1Nb24gU2VwICA5IDEwOjU3OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGFuIGluc3RydWN0aW9uIHdoaWNoCi0Jc2V0cyBhIGNvbmRpdGlvbiBjb2RlIHdpdGggYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyBhIGNvbmRpdGlvbgotCWNvZGUuCi0JKG1pcHNfaXApOiBJbiBjYXNlcyAnTicgYW5kICdNJywgbG9vayBmb3IgJGZjY04gcmF0aGVyIHRoYW4gYW4KLQlpbW1lZGlhdGUgdmFsdWUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogUmVjb2duaXplIHI1MDAwIGZvciBjcHUuCi0JKG1pcHNfaXApOiBHaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgaWYgdGhlIElTQSBsZXZlbCBpcyB3cm9uZy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1tY3B1PVt2XVtyXTUwMDAuCi0KLVNhdCBTZXAgIDcgMTM6MjU6NTUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChDT1VOVF9UT1BfWkVST0VTKTogQWRkZWQgbWFjcm8gdG8gY291bnQKLSAJbGVhZGluZyB6ZXJvZXMuCi0JKGxvYWRfcmVnaXN0ZXIpOiBFbnN1cmUgaGkzMiBiaXRzIGFyZSBub3QgbG9zdCBkdXJpbmcgbG8zMmJpdAotIAlwcm9jZXNzaW5nLiBGaXggc2hpZnQgb2Zmc2V0IHRoYXQgd2FzIG92ZXJmbG93aW5nIGludG8gdGhlIG5leHQKLSAJaW5zdHJ1Y3Rpb24gZmllbGQuIEFkZCBjb2RlIHRvIGdlbmVyYXRlIHNob3J0ZXIgc2VxdWVuY2VzIGZvcgotIAljb25zdGFudHMgd2l0aCBhIHNpbmdsZSBjb250aWd1b3VzIHNlcWV1ZW5jZSBvZiBvbmVzLgotCi1GcmkgU2VwICA2IDE3OjA3OjEyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkMTB2X2RvdF93b3JkKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQKLQkiQHdvcmQiIHdpdGggdGhlIHdvcmQgcHNldWRvLW9wLgotCShtZF9hcHBseV9maXgzKTogQ2xlYW51cCBhbmQgY2hhbmdlcyB0byBzdXBwb3J0IGNvcnJlY3Qgc2l6ZXMKLQlmb3IgMTYgYW5kIDE4LWJpdCByZWxvY3MuCi0KLUZyaSBTZXAgIDYgMTY6MDA6MjkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYy0qLWFvdXQpOiBTZXQgYGVtJy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcvdGUtc3BhcmNhb3V0Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCUlmZGVmIFRFX1NQQVJDT1VUIGRlZmluZSBUQVJHRVRfRk9STUFUIGFuZCBTUEFSQ19CSUVORElBTi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChJTlNOX0JJR19FTkRJQU4pOiBOZXcgbWFjcm8uCi0JKFNQRUNJQUxfQ0FTRV97U0VUU1csU0VUWH0pOiBEZWZpbmUuCi0JKHtOT1AsT1IsRk1PVlMsU0VUSEksU0xMWCxTUkF9X0lOU04pOiBEZWZpbmUuCi0JKG1kX2JlZ2luKTogRGVsZXRlIHNldHRpbmcgb2YgYHRhcmdldF9iaWdfZW5kaWFuJy4KLQkob3V0cHV0X2luc24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogUmV3cml0ZS4gIEFkZCBgc2V0eCcgc3VwcG9ydC4KLQkoc3BhcmNfaXApOiBIYW5kbGUgYDAnIG9wZXJhbmQgY2hhci4gIFJlY29nbml6ZSBzZXR1dywgc2V0c3csIHNldHgKLQlzcGVjaWFsIGNhc2VzLgotCShtZF9hdG9mKTogQWRkIGxpdHRsZSBlbmRpYW4gc3VwcG9ydC4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogTGlrZXdpc2UuCi0JKG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCShtZF9sb25nb3B0cyk6IFJlY29nbml6ZSAtRUwsLUVCIGlmZGVmIFNQQVJDX0JJRU5ESUFOLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IC1FTCwgLUVCIGlmZGVmIFNQQVJDX0JJRU5ESUFOLgotCi1UaHUgU2VwICA1IDEzOjQwOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfbmV3X2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5oIChlY29mZl9uZXdfZmlsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9hcHBfZmlsZSk6IERlZmluZS4KLQotVGh1IFNlcCAgNSAxMzozOToyNSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IEJpYXMgdGhlIC5saXQ4IHNlY3Rpb24KLQlzeW1ib2wgYnkgMzJrIHNvIHRoYXQgb3VyIDE2LWJpdCBzaWduZWQgb2Zmc2V0IGNhbiBhZGRyZXNzIHRoZQotCWVudGlyZSBjaHVuay4gIFJlcG9ydGVkIGJ5IDxtYXR0QGxrZy5kZWMuY29tPi4KLQotV2VkIFNlcCAgNCAxMDoyMzoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRtcC4KLQotV2VkIFNlcCAgNCAxMToyNDoyOSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmUgdW5uZWNlc3NhcnkgY29kZSB0aGF0Ci0gCXdhcyBjYXVzaW5nIHRoZSBoaWdoIDMyYml0cyBvZiA2NGJpdCBjb25zdGFudHMgdG8gYmUgbG9zdC4KLQkKLVR1ZSBTZXAgIDMgMTM6NTI6NTYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZGVkIGNoYW5nZXMgdG8gc3VwcG9ydCBmdW5jdGlvbgotCXBvaW50ZXJzIGFuZCAiQHdvcmQiIHN5bnRheC4KLQotVHVlIFNlcCAgMyAxMTo1NzoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBjb21tZW50ZWQgb3V0IGFuZCAjaWYgMCdkIGNvZGUuCi0JKHY4NTBfcmVsb2NfcHJlZml4KTogUHJvdmlkZSBwcm90b3R5cGUuCi0JKHBvc3RmaXgsIGdldF9yZWxvYywgYnVpbGRfaW5zbik6IFJlbW92ZSBwcm90b3R5cGVzIGZvciBub25leGlzdGFudAotCWZ1bmN0aW9ucy4KLQkobWRfYmVnaW4sIG1kX2Fzc2VtYmxlLCBtZF9hcHBseV9maXgzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKG1kX2Fzc2VtYmxlKTogQWRkIGRlZmF1bHQgdG8gY2FzZSBzdGF0ZW1lbnQuCi0KLVNhdCBBdWcgMzEgMTY6MDM6MDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvbXB1dGUgc2l6ZSBvZiB0aGUgaW5zdHJjdGlvbgotCWZyb20gdGhlIG9wY29kZS4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXBwbHlfZml4Myk6IERvIHNpbXBsZSBieXRlLCBzaG9ydCBhbmQKLQl3b3JkIGZpeHVwcyB0b28uCi0KLUZyaSBBdWcgMzAgMjM6NTA6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hcHBseV9maXgzKTogVXNlIGxpdHRsZSBlbmRpYW4gZ2V0L3B1dAotCXJvdXRpbmVzIHRvIGZldGNoL3N0b3JlIHRoZSB1cGRhdGVkIGluc3RydWN0aW9uIGZyb20vdG8gbWVtb3J5LgotCSh2ODUwX2luc2VydF9vcGVyYW5kKTogSWYgdGhlIG9wZXJhbmQgaGFzIGEgc3BlY2lhbGl6ZWQgaW5zZXJ0Ci0Jcm91dGluZSwgY2FsbCBpdC4KLQotRnJpIEF1ZyAzMCAxODozNToyNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogQWxpZ24gY2FsbGluZyBjb252ZW50aW9uIHRvCi0gCWJlIGxpa2UgaWRlbnRpY2FsIGZ1bmN0aW9uIGZvdW5kIGluIHRjLXBwYy5jLgotCShnZXRfcmVsb2MpOiBSZW1vdmVkLgotCSh2ODUwX3JlbG9jX3ByZWZpeCk6IE5ldyBmdW5jdGlvbiwgcGFyc2UgbG8oKSwgaGkoKSBhbmQgaGkwKCkuCi0JKG1kX2Fzc2VtYmxlKTogZW1pdCBmaXh1cHMuCi0JKG1kX3BjcmVsX2Zyb20pOiByZW5hbWVkIGZyb20gbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBlbWl0IHByb3BlcgotIAlkaXNwbGFjZW1lbnQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBoYW5kbGUgZml4dXBzL3JlbG9jcy4KLQkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IFJlbW92ZWQgZGVmaW5pdGlvbi4KLQkKLUZyaSBBdWcgMzAgMTg6MTI6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIFNIIEVMRiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluIChzaC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RjLXNoLmggKFRBUkdFVF9BUkNIKTogRGVmaW5lLgotCShXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotIAkoVENfQ09GRl9GSVgyUlRZUEUpOiBPbmx5IGRlZmluZSBpZiBPQkpfQ09GRi4KLQkoQkZEX0FSQ0gsIENPRkZfTUFHSUMsIFRDX0NPVU5UX1JFTE9DKTogTGlrZXdpc2UuCi0JKFRDX1JFTE9DX01BTkdMRSwgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogTGlrZXdpc2UuCi0JKERPX05PVF9TVFJJUCwgTkVFRF9GWF9SX1RZUEUsIFRDX0tFRVBfRlhfT0ZGU0VUKTogTGlrZXdpc2UuCi0JKFRDX0NPRkZfU0laRU1BQ0hERVAsIHRjX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgotCShTVUJfU0VHTUVOVF9BTElHTik6IExpa2V3aXNlLgotCShSRUxPQ18zMik6IERvbid0IGRlZmluZS4KLQkodGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWZpbmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkodGFyZ2V0X2JpZ19lbmRpYW4pOiBEZWNsYXJlIGlmIE9CSl9FTEYuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1zaC5jOiBVc2UgQkZEIHJlbG9jIGNvZGVzIGluc3RlYWQgb2YgU0ggQ09GRiByZWxvYwotCW51bWJlcnMgdGhyb3VnaG91dC4KLQkodGNfY3Jhd2xfc3ltYm9sX2NoYWluKTogT25seSBkZWZpbmUgaWYgT0JKX0NPRkYuCi0JKHRjX2hlYWRlcnNfaG9vaywgdGNfY29mZl9zaXplbWFjaGRlcCk6IExpa2V3aXNlLgotCShzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzKTogRGVmaW5lLgotCShzaF9jb3VudF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jc2hfZnJvYl9maWxlLiAgQWRkIEJGRF9BU1NFTUJMRVIgY29kZS4KLQkoc2hfZnJvYl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHNoX2Zyb2JfZmlsZSk6IENhbGwgc2hfZnJvYl9zZWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBJZiBCRkRfQVNTRU1CTEVSLCBjaGFuZ2UgdHlwZSBvZiBoZWFkZXJzLCBhbmQKLQljYWxsIHNlY3Rpb25fc3ltYm9sIHJhdGhlciB0aGFuIHNlZ19pbmZvIChzZWcpLT5kb3QuCi0JKG1kX3NlY3Rpb25fYWxpZ24pOiBBZGQgT0JKX0VMRiB2ZXJzaW9uLgotCShTV0lUQ0hfVEFCTEVfQ09OUyk6IERlZmluZS4KLQkoU1dJVENIX1RBQkxFKTogVXNlIFNXSVRDSF9UQUJMRV9DT05TLgotCShtZF9hcHBseV9maXgpOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGVzIGlmIEJGRF9BU1NFTUJMRVIuICBPbmx5Ci0JaGFuZGxlIGZ4X3JfdHlwZSA9PSAwIGlmIG5vdCBCRkRfQVNTRU1CTEVSLiAgUmV0dXJuIDAgaWYKLQlCRkRfQVNTRU1CTEVSLgotCShzdHJ1Y3QgcmVsb2NfbWFwKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShjb2ZmX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IFVzZSBjb2ZmX3JlbG9jX21hcCB0byBjb252ZXJ0IGZ4X3JfdHlwZS4KLQkodGNfZ2VuX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGlmIEJGRF9BU1NFTUJMRVIuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJZmRlZiBvdXQgZnhfd2hlcmUgdGVzdCB3aGljaCB0cmlnZ2VycwotCWluYXBwcm9wcmlhdGVseSBmb3IgU0ggRUxGLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgYW5kCi0Jb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IGlmIHRoZXkgYXJlIGRlZmluZWQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIEJGRF9SRUxPQ18xNiwgbm90Ci0JQkZEX1JFTE9DX05PTkUsIHdoZW4gY2FsbGluZyBmaXhfbmV3X2V4cCBmb3IgYSBicm9rZW4gd29yZC4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBGaXggY29udmVyc2lvbiBvZiBieXRlIGNvdW50IHRvIEJGRCByZWxvYwotCWNvZGUuCi0KLUZyaSBBdWcgMzAgMTQ6NDc6MzggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogRml4IHByb2JsZW0gd2l0aCBjYWxjdWxhdGluZyAKLQlicmFuY2ggc2l6ZXMgaW4gYWNyb3NzIHNlY3Rpb25zLgotCi1GcmkgQXVnIDMwIDAwOjQ0OjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLTg1MC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBoaSgpIGNvcnJlY3RseS4gIEhhbmRsZQotCWhpMCgpIHRvby4KLQotV2VkIEF1ZyAyOCAyMzoxMTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2JlZ2luKTogRGVhbCB3aXRoIGVuZCBvZiBvcGNvZGUKLQl0YWJsZSBtYXJrZXIuCi0KLVdlZCBBdWcgMjggMTk6MjA6MDQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogRml4IGEgYnVnIHdoaWNoIGNvdWxkIGdlbmVyYXRlCi0JdGhlIHdyb25nIG9wY29kZSBmb3IgY2FzZXMgbGlrZSBzdDJ3IHdoZXJlIHRoZXJlIGFyZSBtYW55IGZvcm1zCi0Jb2YgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBBdWcgMjcgMTM6NTM6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBtZF9wYXJzZV9uYW1lIGlzIGRlZmluZWQsIGNhbGwgaXQgYmVmb3JlCi0JY2FsbGluZyBzeW1ib2xfZmluZF9vcl9tYWtlLgotCSogY29uZmlnL3RjLXBwYy5oIChtZF9wYXJzZV9uYW1lKTogRGVmaW5lLgotCShwcGNfcGFyc2VfbmFtZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtcHBjLmMgKHJlZ19uYW1lX3NlYXJjaCk6IEFkZCByZWdzIGFuZCByZWdjb3VudAotCXBhcmFtZXRlcnMuCi0JKHJlZ2lzdGVyX25hbWUpOiBVcGRhdGUgY2FsbCB0byByZWdfbmFtZV9zZWFyY2guCi0JKGNyX29wZXJhbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjcl9uYW1lcyk6IE5ldyBzdGF0aWMgY29uc3QgYXJyYXkuCi0JKHBwY19wYXJzZV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IElmIFBQQ19PUEVSQU5EX0NSIGlzIHNldCBpbiB0aGUgb3BlcmFuZCBmbGFncywgc2V0Ci0JY3Jfb3BlcmFuZCBiZWZvcmUgY2FsbGluZyBleHByZXNzaW9uLgotCi1UdWUgQXVnIDI3IDA5OjA1OjUwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogQWRkIG5ldyBhcmd1bWVudCB0bwotCWhwcGFfZ2VuX3JlbG9jX3R5cGUgY2FsbC4KLQotTW9uIEF1ZyAyNiAxODoyNDo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4ZWQgIi53b3JkIi4gIEZpeGVkIHByb2JsZW0gd2l0aCByYW5nZSBjaGVja2luZwotCW9uIGFkZHJlc3Nlcy4gIEltcHJvdmVkIGVycm9yIG1lc3NhZ2VzLgotCSogZG9jL2MtZDEwdi50ZXhpOiBBZGRlZCBkb2NzIGZvciByZWdpc3RlciBwYWlycy4KLQotTW9uIEF1ZyAyNiAxMzozOToyNyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBGaXggYnVnIGluIHBhcmFsbGVsIAotCWNoZWNraW5nIGNvZGUuCi0KLU1vbiBBdWcgMjYgMTQ6Mzg6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChpbml0X2ZpbGUpOiBJbml0aWFsaXplIGZNZXJnZSB0byAxLgotCShhZGRfZmlsZSk6IFJlc3RvcmUgb2xkIGZpbGUgbWVyZ2luZyBjb2RlLCBidXQgb25seSBtZXJnZSBmaWxlcyBpZgotCWZNZXJnZSBpcyBzZXQuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9sb2MpOiBDbGVhciBmTWVyZ2UgZmllbGQgb2YgY3VycmVudCBmaWxlLgotCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogTGlrZXdpc2UuCi0KLUZyaSBBdWcgMjMgMTE6NDA6NDcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWQxMHYudGV4aTogRml4IHR5cG8uIAotCi1GcmkgQXVnIDIzIDEwOjQxOjMyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0IGJpdCBtYXNraW5nIGZvcgotCWhpIGFuZCBsbyBleHByZXNzaW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSb3VnaCBjdXQgYXQgZGVtYW5kaW5nCi0JImVwIiBvciAicjMwIiBpbiBzc3QgYW5kIHNsZCBpbnN0cnVjdGlvbnMuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBhYm9ydC4gIEp1c3Qgd2FybiB0aGF0IHdlIGRvbid0Ci0JaGF2ZSByZWxvY3MgeWV0LgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChDQ19OQU1FX0NOVCk6IERlZmluZS4KLQkoY2NfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgVjg1MF9PUEVSQU5EX0NDIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBmb3JnZXQgdG8gaW5pdGlhbGl6ZQotCSJpbnNuIiEKLQotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogR2VuZXJhbGl6ZSB0byBzZWFyY2gKLQlhbnkgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUuCi0JKHJlZ2lzdGVyX25hbWUpOiBQYXNzIGFwcHJvcHJpYXRlIHRhYmxlIGFuZCBzaXplIHRvIHJlZ19uYW1lX3NlYXJjaC4KLQkoc3lzdGVtX3JlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKFNZU1JFR19OQU1FX0NOVCk6IERlZmluZS4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgb3BlcmFuZHMgd2hpY2ggYXJlIHN5c3RlbSByZWdpc3RlcnMuCi0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IElmIHdlIGZpbmQgYSByZWdpc3RlciwgYnV0IHRoZQotCW9wY29kZSBkb2Vzbid0IHdhbnQgYSByZWdpc3RlciwgdGhlbiB3ZSBkb24ndCBoYXZlIGEgbWF0Y2guCi0JKG1kX2Fzc2VtYmxlKTogR2V0IHNpemUgb2YgdGhlIGluc3RydWN0aW9uIGZyb20gdGhlIG9wY29kZSB0YWJsZS4KLQotVGh1IEF1ZyAyMiAxMDoyMDozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuCi0JKGFzLm5ldyk6IFVzZSAkKEhMREVOVikuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZik6IEF2b2lkIGEgZGl2aXNpb24gYnkgemVybyBlcnJvcgotCWlmIGFuIGFycmF5IGRpbWVuc2lvbiBpcyBub3Qga25vd24uCi0KLVRodSBBdWcgMjIgMTA6NTA6MDAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeCBhIHJlbG9jIGJ1ZyBjYXVzZWQgYnkgbXkgbGFzdCBjaGFuZ2UuIAotCSogZG9jL2MtZDEwdi50ZXhpOiBDbGVhbnVwLgotCQotVHVlIEF1ZyAyMCAxNToxNToxNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtdjg1MC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZSAodjg1MC0qLWVsZik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKHY4NTAtKi1lbGYpOiBOZXcgdGFyZ2V0LgotCQotV2VkIEF1ZyAyMSAxNTo1MDo1NCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtZDEwdi50ZXhpOiBOZXcgZmlsZS4KLQkqIGRvYy9hbGwudGV4aTogQWRkZWQgRDEwViBzdHVmZi4KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGRlZCBEMTBWIHN0dWZmLgotCi1UdWUgQXVnIDIwIDE0OjEwOjAyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBbGwgcmVmZXJlbmNlcyB0byBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkCi0gCW5vdyB1c2UgdGhlIG9wdGltYWwgaW5zdHJ1Y3Rpb24uICAuZmxvYXQgYW5kIC5kb3VibGUgbm93IHdvcmsuIAotCi1Nb24gQXVnIDE5IDE0OjQxOjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBBZGp1c3QgUEMgcmVsYXRpdmUgcmVsb2MgYnkKLQlzZWN0aW9uIGFkZHJlc3MgZm9yIHRoZSBpOTYwIGFzIGlzIGRvbmUgZm9yIHRoZSBpMzg2LgotCi1UaHUgQXVnIDE1IDE2OjM3OjU5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIHdpbGRjYXJkcyBmb3IgY29uZmlnIG1hdGNoaW5nLCBhZGQgbWlwcy0qLSoKLQljYXNlLCBmb3J3YXJkLWluY2x1ZGUgYmZkL2VsZi1iZmQuaC4KLQotVGh1IEF1ZyAxNSAxMzoyNDozMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIG9wY29kZQotICAgICAgICB0YWJsZSB0byBoZWxwIGRldGVybWluaW5lIHdoaWNoIGluc3RydWN0aW9ucyBjYW4gYmUgZG9uZQotICAgICAgICBpbiBwYXJhbGxlbC4gCi0KLVRodSBBdWcgMTUgMTc6MDE6MzEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IE1ham9yIGNoYW5nZXMgdG8gYWRkIFRodW1iIHN1cHBvcnQsIHdpdGggbG90cwotIAlvZiBjaGFuZ2UgaW5wdXQgZnJvbSA8cmVhcm5zaGFAYXJtbHRkLmNvLnVrPi4KLQlSZXZlcnRlZCB0byBJTlNOX1NJWkUgbWFjcm8sIHJhdGhlciB0aGFuIGluc25fc2l6ZSB2YXJpYWJsZS4KLQkoaW5zbnMpOiBBZGRlZCBBUk0gImJ4IiBpbnN0cnVjdGlvbiBzdXBwb3J0LgotCSh0aW5zbnMpOiBBZGRlZCBUaHVtYiBpbnN0cnVjdGlvbiBkZWZpbml0aW9uIHN0cnVjdHVyZS4KLQkoYXJtX3RvcHNfaHNoKTogQWRkZWQgaGFzaCBzdHJ1Y3R1cmUgZm9yIFRodW1iIG9wY29kZXMuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZGVkICIuYXJtIiwgIi50aHVtYiIgYW5kICIuY29kZSIgcHNldWRvLW9wcy4KLQkob3Bjb2RlX3NlbGVjdCxzX2FybSxzX3RodW1iLHNfY29kZSk6IEFkZGVkLgotCShkZWNvZGVfc2hpZnQpOiBBbGxvdyB1cHBlci1jYXNlIFJSWC4KLQkoZG9fbGRzdCk6IFNpbXBsZXIgaGFsZndvcmQgc3VwcG9ydC4KLQkoZG9fbGRtc3RtKTogSW1wcm92ZWQuCi0JKHJlZ19saXN0LCBkb19ieCwgdGh1bWJfcmVnLCB0aHVtYl9hZGRfc3ViLCB0aHVtYl9zaGlmdCwKLSAJdGh1bWJfbW92X2NvbXBhcmUsIHRodW1iX2xvYWRfc3RvcmUsIGRvX3RfYXJpdCwgZG9fdF9hZGQsCi0gCWRvX3RfYXNyLCBkb190X2JyYW5jaCwgZG9fdF9ieCwgZG9fdF9jb21wYXJlLCBkb190X2xkbXN0bSwKLSAJZG9fdF9sZHJiLCBkb190X2xkcmgsIGRvX3RfbGRzLCBkb190X2xzbCwgZG9fdF9sc3IsIGRvX3RfbW92LAotIAlkb190X3B1c2hfcG9wLCBkb190X3N0ciwgZG9fdF9zdHJiLCBkb190X3N0cmgsIGRvX3Rfc3ViLCBkb190X3N3aSwKLSAJZG9fdF9hZHIpOiBBZGRlZC4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfQVJNX1RIVU1CXyogcmVsb2NhdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXRodW1iLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlZCB0byByZWZsZWN0IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLgotCShhcm1fZGF0YV9pbl9jb2RlLCBhcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogQWRkZWQuCi0JKiBjb25maWcvdGMtYXJtLmg6IFByb3ZpZGUgVENfRklYX1RZUEUgdG8gYWxsb3cgcHJpdmF0ZSBBUk0KLSAJZnJhZ21lbnQgaW5mb3JtYXRpb24gdG8gYmUgaGVsZC4KLQotVGh1IEF1ZyAxNSAxNjoxMjowMCAxOTk2ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIHRjLWFybS5jIChtZF9hcHBseV9maXgzKTogQWxzbyBzZXQgZml4UC0+ZnhfZG9uZSBpZiBmeF9hZGRzeSBpcyAKLQlub24tbnVsbCwgYnV0IGlzIGEgY29uc3RhbnQuCi0JKGZpeF9uZXdfYXJtKTogQ2FsbCBtYWtlX2V4cHJfc3ltYm9sIHRvIG1ha2UgdGhlIGV4cHJlc3Npb24gc3ltYm9sCi0Jc28gdGhhdCBlcnJvciByZXBvcnRpbmcgd2lsbCB3b3JrIGNvcnJlY3RseS4KLQotV2VkIEF1ZyAxNCAxMDozNzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzCi0JYWdhaW5zdCB3ZWFrIHN5bWJvbHMuCi0KLVR1ZSBBdWcgMTMgMTc6Mzk6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DVElPTik6IERlZmluZSBpZiBPQkpfWENPRkYuCi0JKHBwY19mb3JjZV9yZWxvY2F0aW9uKTogRGVjbGFyZSBpZiBPQkpfWENPRkYuCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uIGlmCi0JT0JKX1hDT0ZGLgotCi1Nb24gQXVnIDEyIDE2OjQ5OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoQllURV9PUkRFUik6IERvbid0IGRlZmluZS4gIE5vIGxvbmdlciB1c2VkLgotCi1GcmkgQXVnICA5IDE3OjQ4OjI4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXggcHJvYmxlbSB3aXRoIHJlbG9jcy4gCi0KLUZyaSBBdWcgIDkgMTQ6MTY6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBJZiBub3QgQkZEX0FTU0VNQkxFUiwgYWx3YXlzIGFsaWduCi0Jd2l0aCBub3BzIGlmIG5vdCBpbiBkYXRhX3NlY3Rpb24gb3IgYnNzX3NlY3Rpb24uCi0KLVRodSBBdWcgIDggMTI6MzI6NTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQlBZGQgc3VwcG9ydCBmb3Igb3BlblZNUy9BbHBoYS4KLQkqIGFzLmggKFBSSU5URl9MSUtFKTogRG9uJ3QgZGVmaW5lIGlmIFZNUywgZm9yIG5vdy4KLQkqIGNvbmZpZy9vYmotZXZheC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotZXZheC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgc3VwcG9ydCBmb3IgRVZBWCBmb3JtYXQgaWYgT0JKX0VWQVggaXMKLQlkZWZpbmVkLgotCSogY29uZmlnL3RjLWFscGhhLmg6IEFkZCBzdXBwb3J0IGZvciBFVkFYIGZvcm1hdCBpZiBPQkpfRVZBWCBpcwotCWRlZmluZWQuICBBZGQgY2FzZSBmb3IgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIuCi0JKiBjb25maWcvdm1zLWEtY29uZi5oOiBOZXcgZmlsZS4KLQkqIGNvbmYtYS1nYXMuY29tOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHRhcmdldCBhbHBoYS0qLSp2bXMqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbWFrZWZpbGUudm1zOiBOZXcgZmlsZS4KLQkqIHJlYWQuYyAoc19sY29tbSk6IEFsaWduIGJzc19zZWcgb24gOCBieXRlIGJvdW5kYXJ5IGlmIE9CSl9FVkFYLgotCURvbid0IGNhbGwgZmZzIG9uIG9wZW5WTVMvQWxwaGEuCi0KLVdlZCBBdWcgIDcgMTQ6MTk6MDMgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIEdBU19DSEVDS19ERUNMX05FRURFRCBpbmNsdWRlIDxzdHJpbmcuaD4gb3IKLQk8c3RyaW5ncy5oPiBpZiB0aGV5IGV4aXN0LiAgQ2FsbCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQgb24gc3Ryc3RyCi0JYW5kIHNicmsuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9TQlJLKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkLgotCSogYXMuaDogT25seSBpbmNsdWRlIDxzdHJpbmdzLmg+IGlmIEhBVkVfU1RSSU5HU19ILgotCShzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgotCSogYXMuYzogSWYgSEFWRV9TQlJLIGFuZCBORUVEX0RFQ0xBUkFUSU9OX1NCUkssIGRlY2xhcmUgc2Jyay4KLQotV2VkIEF1ZyAgNyAxMTo1MDoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24KLQlieSBhIGNvbnN0YW50IGJlZm9yZSBlbnRlcmluZyB0aGUgbWFpbiBzd2l0Y2guICBSZWplY3QgYXR0ZW1wdHMgdG8KLQlhcHBseSBhbiBhcml0aG1ldGljIGZ1bmN0aW9uIHRvIG5vbi1hYnNvbHV0ZSBzeW1ib2xzLCBleGNlcHQgZm9yCi0JdGhlIHNwZWNpYWwgY2FzZSBvZiBzdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scyBpbiB0aGUgc2FtZQotCXNlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEbyBhbGlnbiBpZiBPQkpfRUxGLCBidXQKLQlub3QgdG8gbW9yZSB0aGFuIGEgMTYgYnl0ZSBib3VuZGFyeS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogQWNjZXB0IGFsbCByZWxvY3M7IHJlbW92ZQotCSNpZm5kZWYgT0JKX0VMRiBsaW5lcy4gIEZyb20gRXJpYyBWYWxldHRlIDx2YWxldHRlQGNyZi5jYW5vbi5mcj4uCi0JKHRjX2dlbl9yZWxvYyk6IElmIG91dCBvZiBtZW1vcnkgY2FsbCBhc19mYXRhbCByYXRoZXIgdGhhbgotCWFzc2VydC4gIElmIG5vIGhvd3RvIGZvdW5kLCBjYWxsIGFzX2JhZF93aGVyZSByYXRoZXIgdGhhbgotCWFzX2ZhdGFsLiAgQ2hhbmdlIHRoZSBlcnJvciBtZXNzYWdlIHNsaWdodGx5LiAgU2V0IGhvd3RvIHRvIGEKLQlub24tTlVMTCB2YWx1ZSBpbiBvcmRlciB0byBrZWVwIGdvaW5nLgotCi1UdWUgQXVnICA2IDEyOjU4OjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBZGRlZCBjb2RlIHRvIHN1cHBvcnQgMzItYml0IGZpeHVwcyBmb3Igc3RhYnMuCi0KLVR1ZSBBdWcgIDYgMTE6MTU6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X3NwZWNpZmljKTogTmV3IG9wZXJhbmQgInNpemUiIGRlcml2ZWQKLQlmcm9tICIuYiIsICIudyIgYW5kICIubCIgZXh0ZW5zaW9ucy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuICBJZgotCXRoZSBiYXNlIGluc3RydWN0aW9uIGhhcyBubyBvcGVyYW5kcywgdGhlbiB1c2UgdGhlIHNpemUgdG8KLQlkZXRlcm1pbmUgd2hpY2ggc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gdG8gdXNlLgotCi1Nb24gQXVnICA1IDE0OjIxOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobWVtX2ZtdCk6IENhbGwgcGFyc2VfZXhwciBiZWZvcmUgZW1pdC4KLQotRnJpIEF1ZyAgMiAxMToyMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEb24ndCBjaGFuZ2UgYWRkciBpZgotCU9CSl9FTEYuCi0KLVRodSBBdWcgIDEgMjM6NTE6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlcy4KLQkKLVdlZCBKdWwgMzEgMTQ6NDY6MTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IERpc2FibGUgcmFuZ2UgY2hlY2tpbmcgb24gMTYtYml0IHZhbHVlcy4KLQotV2VkIEp1bCAzMSAxNjoyNzoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBTZXQgb2tfYXJjaCBmb3IgZXZlcnkgaW5zdHJ1Y3Rpb24sCi0Jbm90IGp1c3QgdGhlIG9uZXMgdGhhdCBkb24ndCBtYXRjaC4KLQotV2VkIEp1bCAzMSAxMTo0NToxNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4ZWQgYnVncyBpbiBzaG9ydCByZWxvY3MgYW5kIHJhbmdlIGNoZWNraW5nLgotCi1XZWQgSnVsIDMxIDE1OjQxOjQyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jOiBDaGFuZ2VkIElOU05fU0laRSB0byB2YXJpYWJsZSBpbnNuX3NpemUsIGFzCi0gCXByZS1jdXJzb3IgdG8gYWRkaW5nIFRodW1iIHN1cHBvcnQuIEFsc28gYWRkZWQgY3B1X3ZhcmlhbnQgZmxhZwotIAlpbmZvcm1hdGlvbiB0byBlYWNoIG9mIHRoZSBhc21fZmxnIHN0cnVjdHVyZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IFVwZGF0ZWQgQVJNNyBwYXJzaW5nIHRvIGFsbG93ICd0JyBmb3IKLSAJdGh1bWIvaGFsZndvcmQgc3VwcG9ydCwgYXN3ZWxsIGFzICdtJyBmb3IgbG9uZyBtdWx0aXBseS4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZWQgaGVscCBtZXNzYWdlLgotCShtZF9hc3NlbWJsZSk6IENoZWNrIHRoYXQgaW5zdHJ1Y3Rpb24gZmxhZ3MgYXJlIGFwcGxpY2F0ZWQgdG8gdGhlCi0gCWN1cnJlbnQgY3B1IHZhcmlhbnQuCi0JKG1kX2FwcGx5X2ZpeDMsIHRjX2dlbl9yZWxvYyk6IEFkZCBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04IGFuZAotIAlCRkRfUkVMT0NfQVJNX0hXTElURVJBTCByZWxvY2F0aW9uIHN1cHBvcnQgZm9yIG5ldyBoYWxmd29yZCBhbmQKLSAJc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMuCi0JKGRvX2xkc3QpOiBHZW5lcmF0ZSBoYWxmd29yZCBhbmQgc2lnbmV4dGVuc2lvbiB2YXJpYW50cyBpZgotIAltbmVtb25pYyBmbGFncyBtYXRjaC4KLQkobGRzdF9leHRlbmQpOiBEbyBub3QgYWxsb3cgc2hpZnRzIGluIHRoZSBvZmZzZXQgZmllbGQgb2YgaGFsZndvcmQKLSAJb3Igc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMuCi0JKHZhbGlkYXRlX29mZnNldF9pbW0pOiBQcm92aWRlIGNoZWNrIG9uIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uCi0gCWltbWVkaWF0ZSByYW5nZS4KLQkoYWRkX3RvX2xpdF9wb29sKTogTWVyZ2UgaWRlbnRpY2FsIGxpdGVyYWwgcG9vbCB2YWx1ZXMuCi0KLVR1ZSBKdWwgMzAgMTQ6Mjg6MjMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzZWxlY3Rvcl90YWJsZSk6IEFkZCAnRScgc2VsZWN0b3IuCi0JKGNvbnNfZml4X25ld19ocHBhKTogRG9uJ3QgY29rZSBvbiBlX2VzZWwuCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgUl9DT01QMiB3aGVuIHVzZWQKLQl0byBoZWxwIGdlbmVyYXRlIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IERvbid0IHRyeSB0byBhcHBseSBmaXh1cHMgd2l0aCBhbiBlX2VzZWwKLQlzZWxlY3Rvci4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IEZpeHVwcyB3aXRoIGVfZXNlbCBzZWxlY3RvcnMKLQlhcmUgbm90IGFkanVzdGFibGUuCi0KLVR1ZSBKdWwgMzAgMTU6NTE6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIDJieXRlLCA0Ynl0ZSwgYW5kIDhieXRlCi0JcHNldWRvLW9wcy4KLQotRnJpIEp1bCAyNiAxMTo0MzowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkZWQgbG90cyBvZiBlcnJvciBjaGVja2luZy4gIEFkZGVkIGhhY2tzCi0JdG8gc3VwcG9ydCBhY2N1bXVsYXRvciBzaGlmdHMuCi0JCi1GcmkgSnVsIDI2IDExOjU2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX1NFVF9FWFRFUk5BTCk6IExldCAud2VhayBvdmVycmlkZS4KLQkoU19DTEVBUl9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX1NFVF9XRUFLKTogUmVtb3ZlIGVycm9yOyBqdXN0IGxldCAud2VhayBvdmVycmlkZS4KLQotVGh1IEp1bCAyNSAxNToyMjo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBOb3cgaGFuZGxlcyBtdWx0aWxpbmUKLQlpbnN0cnVjdGlvbnMuCi0KLVRodSBKdWwgMjUgMTI6MDM6MzMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeCBwYWNrYWdpbmcgYnVnLiBBZGRlZCByYW5nZSBjaGVja2luZy4KLQlBZGRlZCBrbHVkZ2UgZm9yIGRpdnMgaW5zdHJ1Y3Rpb24uICBGaXhlZCBtaW5vciBwcm9ibGVtIHdpdGgKLQltdWx0aXBsZSB0ZXh0IHNlY3Rpb25zLgotCSogY29uZmlnL3RjLWQxMHYuaCAoZDEwdl9jbGVhbnVwKTogQ2hhbmdlIHByb3RvdHlwZS4gCi0JCi1UdWUgSnVsIDIzIDEwOjQ5OjM2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hcHBseV9maXgzKTogRml4IGFsbCBpbnN0cnVjdGlvbgotCWFkZHJlc3NlcyB0byBiZSByaWdodC1zaGlmdGVkIGJ5IDIuCi0KLU1vbiBKdWwgMjIgMTE6MzI6MzYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IE1hbnkgY2hhbmdlcyB0byBnZXQgcmVsb2NzIHdvcmtpbmcuCi0gCShyZWdpc3Rlcl9uYW1lKTogTm8gbG9uZ2VyIGNyZWF0ZXMgYSBzeW1ib2wgZm9yIHJlZ2lzdGVyIG5hbWVzLgotIAkocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogbW92ZWQgdG8gb3Bjb2Rlcy9kMTB2LW9wYy5jLgotCShkMTB2X2luc2VydF9vcGVyYW5kKTogTm93IHdvcmtzIGNvcnJlY3RseSBmb3IgZWl0aGVyIGNvbnRhaW5lci4KLQkqIGNvbmZpZy90Yy1kMTB2LmggKGQxMHZfY2xlYW51cCk6IERlY2xhcmUuIAotCQotTW9uIEp1bCAyMiAxNDowMTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgYW5kCi0JQkZEX1JFTE9DX1BDUkVMX0xPMTYgYXJlIGV4cGVjdGVkIHRvIGJlIFBDIHJlbGF0aXZlLgotCi1Nb24gSnVsIDIyIDEyOjQ2OjU1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiB0Yy1hbHBoYS5jOiBQYXRjaGVzIHRvIHRyYWNrIGN1cnJlbnQgbWluaW11bSBhbGlnbm1lbnQgdG8gcmVkdWNlCi0JdGhlIG51bWJlciBvZiBmcmFnbWVudHMgY3JlYXRlZCB3aXRoIGZyYWdfYWxpZ24uCi0JKGFscGhhX2N1cnJlbnRfYWxpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX2FscGhhX3RleHQpOiBSZXNldCBhbGlnbm1lbnQgdG8gMC4KLQkoc19hbHBoYV9kYXRhLCBzX2FscGhhX3JkYXRhLCBzX2FscGhhX3NkYXRhKTogTGlrZXdpc2UuCi0JKHNfYWxwaGFfc3RyaW5nZXIsIHNfYWxwaGFfc3BhY2UpOiBOZXcgZnVuY3Rpb25zLgotCShzX2FscGhhX2NvbnMsIGFscGhhX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogUmVtb3ZlIGZ1bmN0aW9ucy4KLQkoYWxwaGFfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbiB0byByZXBsYWNlIGJvdGggb2YgdGhlbS4KLQkoZW1pdF9pbnNuKTogT25seSBhbGlnbiBpZiBhbHBoYV9jdXJyZW50X2FsaWduIGlzIGxlc3MgdGhhbiAyOwotCXJlc2V0IGFscGhhX2N1cnJlbnRfYWxpZ24gdG8gMi4KLQkoc19hbHBoYV9ncHJlbDMyKTogTGlrZXdpc2UuCi0JKHNfYWxwaGFfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4gIEJhc2ljYWxseSBkdXBsaWNhdGUgdGhlIG90aGVyCi0JYWxwaGEgc2VjdGlvbiBjaGFuZ2UgaG9va3MuICBPbmx5IGRlZmluZSBmb3IgRUxGLgotCShzX2FscGhhX2Zsb2F0X2NvbnMpOiBTaW1wbGlmeSBhbGlnbm1lbnQgaGFuZGxpbmcuCi0JKG1kX3BzZXVkb190YWJsZSk6IE9ubHkgZGVmaW5lICJyZGF0YSIgYW5kICJzZGF0YSIgaWYgT0JKX0VDT0ZGLgotCUlmIE9CSl9FTEYsIGRlZmluZSAic2VjdGlvbiIsICJzZWN0aW9uLnMiLCAic2VjdCIsIGFuZCAic2VjdC5zIi4KLQlEb24ndCBkZWZpbmUgdGhlIHNfYWxwaGFfY29ucyBwc2V1ZG8tb3BzLiAgRG8gZGVmaW5lCi0Jc19hbHBoYV9zdHJpbmdlciBhbmQgc19hbHBoYV9zcGFjZSBwc2V1ZG8tb3BzLgotCShhbHBoYV9hbGlnbik6IFNraXAgaWYgbGVzcyB0aGFuIGN1cnJlbnQgZGVmYXVsdCBhbGlnbm1lbnQuICBTZXQKLQlkZWZhdWx0IGFsaWdubWVudC4KLQkqIHRjLWFscGhhLmggKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogUmVtb3ZlLgotCShtZF9jb25zX2FsaWduKTogQWRkLgotCi0JKiB0Yy1hbHBoYS5jOiBBZGQgb29kbGVzIG9mIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGNvbW1lbnRzLgotCShtZF9iaWdudW1fdG9fY2hhcnMpOiBSZW1vdmU7IHRoZXJlIGFyZSBubyBjYWxsZXJzLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBzb21lIG1vcmUgdmFyaWFudHMuCi0KLVRodSBKdWwgMTggMTU6NTQ6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBBbmRyZXcgR2llcnRoIDxBTkRSRVdHQG1pY3JvbGlzZS5jby51az46Ci0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotc3lzdjQqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSB1YWhhbGYsIHVhd29yZCwgYW5kCi0JdWF4d29yZCB0byB1c2Ugc191YWNvbnMuCi0JKHNwYXJjX25vX2FsaWduX2NvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3VhY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNwYXJjX2NvbnNfYWxpZ24pOiBJZiBzcGFyY19ub19hbGlnbl9jb25zIGlzIHNldCwganVzdCBjbGVhciBpdAotCWFuZCByZXR1cm4uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IFJlbW92ZSB1bnVzZWQgbGFiZWwgYWxsb2NhdGVfYnNzLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtaXBzLSotaXJpeDYqIHRhcmdldC4gIEhhbmRsZSBJcml4IDYgbGlrZSBJcml4Ci0JNSB3aXRoIHJlZ2FyZCB0byBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogVXNlIHRoZSBjb3JyZWN0IGxlbmd0aCB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgdGhlIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBlcnJvciBtZXNzYWdlLgotCi1UaHUgSnVsIDE4IDEyOjU3OjEwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IEFsbG93IGQxMHYtKi0qLCBkb24ndCByZXF1aXJlIGQxMHYtKi1lbGYqLgotCi1XZWQgSnVsIDE3IDE0OjI1OjEzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1kMTB2Lmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlIChkMTB2LSotZWxmKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLWVsZik6IE5ldyB0YXJnZXQuCi0JCi1GcmkgSnVsIDEyIDIwOjU0OjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBSZWNvZ25pemUgLUsgUElDLgotCi1XZWQgSnVsIDEwIDEyOjM5OjA4IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfYWxpZ24pOiBDaGFuZ2UgZmlsbCBwYXJhbWV0ZXIKLQl0byBhIHBvaW50ZXIuICBUYWtlIE5VTEwgYXMgMCBvciBub3AgZGVwZW5kaW5nIG9uIHNlY3Rpb24uICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4KLQkoc19hbHBoYV9hbGlnbik6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZXMuCi0KLQkqIGRvYy9hcy50ZXhpbmZvICguYWxpZ24pOiBEb2N1bWVudCBhY3Rpb24gb2Ygb21pdHRlZAotCWZpbGwgcGFyYW1ldGVyLgotCi1XZWQgSnVsIDEwIDAwOjIzOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogR2l2ZSBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlCi0Jd2hlbiBhbiB1bnN1cHBvcnRlZCBQQyByZWxhdGl2ZSByZWxvYyBpcyBzZWVuLCByYXRoZXIgdGhhbiBjYWxsaW5nCi0JYWJvcnQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFJlbW92ZSBub3RfY3BwX2xpbmUgbG9jYWwgdmFyaWFibGUuCi0JSW5zdGVhZCwgY2hlY2sgc3RhdGUgd2hlbiAnIycgY29tbWVudCBpcyBzZWVuLgotCi1Nb24gSnVsICA4IDE0OjExOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19yZWdtYXNrX2ZyYWcpOiBPbmx5IGRlZmluZSBpZiBPQkpfRUxGIG9yCi0gCU9CSl9NQVlCRV9FTEYuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGZpeHVwIHdhcyBjaGFuZ2VkIHRvIGJlIFBDIHJlbGF0aXZlLCBjaGFuZ2UKLSAJcmVsb2MgdHlwZSBhY2NvcmRpbmdseS4gIFVzZSBuYW1lIG9mIHJlbG9jIGluIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGFzLmg6IERvbid0IGRlZmluZSBjb25zdCBvciB2b2xhdGlsZS4KLQkqIGZsb251bS5oOiBEb24ndCBkZWZpbmUgY29uc3QuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2dlbl9yZWxvYyk6IENoYW5nZSB0aGUgY29kZSBhcHByb3ByaWF0ZWx5Ci0JaWYgZnhfcGNyZWwgaXMgc2V0LiAgQ29ycmVjdCBzZXR0aW5nIHRoZSBhZGRlbmQgY2FzZSBpbiB0aGUKLQlPQkpfRUxGIGNhc2UgKGZyb20gQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPikuCi0JKG1kX3Nob3dfdXNhZ2UpOiBDb3JyZWN0IC1tZmM1MjAwIHRvIC1tNTIwMC4KLQotRnJpIEp1bCAgNSAxMDozMjo1OCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW02OGsudGV4aTogRG9jdW1lbnQgLW01MjAwIGZsYWcuCi0JKiBkb2MvYXMudGV4aW5mbzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBUaGUgY29sZGZpcmUgZG9lcyBub3Qgc3VwcG9ydCA4eAotIAlzY2FsZSBmYWN0b3IuCi0KLUZyaSBKdWwgIDUgMTE6MDc6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX0VYVEVSTkFMKTogQ2hhbmdlIGFzX3dhcm4gdG8gYXNfYmFkLgotCShTX0NMRUFSX0VYVEVSTkFMLCBTX1NFVF9XRUFLKTogTGlrZXdpc2UuCi0KLVRodSBKdWwgIDQgMTE6NTk6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byBjeWdudXMtMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotVGh1IEp1bCAgNCAxMDoxMTozMyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBPbmx5IHBlcmZvcm0gcmFuZ2UgY2hlY2sgd2hlbgotIAlkZWFsaW5nIHdpdGggT19jb25zdGFudCBleHByZXNzaW9ucy4KLQotV2VkIEp1bCAgMyAxNTowMjoyMSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstcGFyc2UuaCAobTY4a19yZWdpc3Rlcik6IEFkZCBuZXcgY29sZGZpbGUgY29udHJvbAotCXJlZ2lzdGVycy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWNmNTIwMF9jb250cm9sX3JlZ3MpOiBOZXcgdmFyaWFibGUsIAotCWFycmF5IG9mIGNvbnRyb2wgcmVnaXN0ZXJzIGZvciB0aGUgY29sZGZpcmUuCi0JKGNwdV9vZl9hcmNoKTogQWRkZWQgbWNmNTIwMC4KLQkoYXJjaHMpOiBBZGRlZCBtY2Y1MjAwLgotCShpbml0X3RhYmxlKTogQWRkIG5ldyBjb250cm9sIHJlZ2lzdGVycy4KLQkobTY4a19pcCk6IEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBjb250cm9sIHJlZ2lzdGVycy4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfc2hvd191c2FnZSk6IEFkZCAtbTUyMDAgdG8gdXNhZ2UgdGV4dC4KLQotV2VkIEp1bCAgMyAxNjowNTo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQpOiBSZW1vdmUgZGVjbGFyYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gb2YgfHwKLQl3aXRoaW4gJiYuCi0JKG1kX2Fzc2VtYmxlKTogRml4IGhhbmRsaW5nIG9mIEBsIHdpdGggYW4gdW5zaWduZWQgY29uc3RhbnQuICBBZGQKLQlkZWZhdWx0IGNhc2UgdG8gcmVsb2Mgc3dpdGNoLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIGFzIDAgaWYgVEVfMzg2QlNELgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFRvbSBRdWlnZ2xlIDxxdWlnZ2xlQHNnaS5jb20+OgotCSogZWNvZmYuYyAobGFzdF9saW5lbm8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhZGRfcHJvY2VkdXJlKTogU2V0IGxhc3RfbGluZW5vLgotCShlY29mZl9kaXJlY3RpdmVfbG9jKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBMaWtld2lzZS4KLQkoZWNvZmZfZml4X2xvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmggKGVjb2ZmX2ZpeF9sb2MpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBXaGVuIGluc2VydGluZyBub3BzLCBhbmQgdXNpbmcKLQlFQ09GRiBkZWJ1Z2dpbmcsIGNhbGwgZWNvZmZfZml4X2xvYy4KLQotVHVlIEp1bCAgMiAyMzowMjoxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IElmIGFuIG9wZXJhbmQgdHlwZSBpcyAKLQltYXJrZWQgYXMgU1JDX0lOX0RTVCByZXRyaWV2ZSBpdCBmcm9tIHRoZSAiZGVzdGluYXRpb24iIG9wLgotCi1TYXQgSnVuIDI5IDEzOjM4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcm0tKi1yaXNjaXgqKTogU2V0IGVtdWxhdGlvbiB0byByaXNjaXguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtcmlzY2l4Lmg6IE5ldyBmaWxlIHRvIGRlZmluZSBURV9SSVNDSVguCi0KLQkqIGNvbmZpZy90Yy1zaC5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4KLQotRnJpIEp1biAyOCAxNToxNDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogSnVzdCBydW4gY29uZmlnLnN0YXR1cyBhcyBvdGhlcgotCXRvb2xzIGRvLgotCi1GcmkgSnVuIDI4IDExOjA5OjM4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiAoVEFSR0VUX09TKTogQWRkIGRlZmluaXRpb24gdG8gY29uZi4KLQotVGh1IEp1biAyNyAyMDozOTo0MCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUGFyZW50aGVzaXplCi0JY29wX2ludGVybG9ja3MgZXhwcmVzc2lvbnMuCi0KLVRodSBKdW4gMjcgMTI6MTg6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHJpbnQpOiBDbG9zZSB0aGUgbGlzdGluZyBmaWxlIGlmIGl0IGlzIG5vdAotCXN0ZG91dC4gIENsb3NlIHRoZSBvdGhlciBmaWxlcyBvcGVuZWQgZm9yIHRoZSBsaXN0aW5nLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY29uc19hbGlnbik6IERlZmluZS4KLQkoc3BhcmNfY29uc19hbGlnbik6IERlY2xhcmUuCi0JKEhBTkRMRV9BTElHTik6IERlZmluZS4KLQkoc3BhcmNfaGFuZGxlX2FsaWduKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19jb25zX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19oYW5kbGVfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogQ2FsbCBtZF9jb25zX2FsaWduIGlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogQWRkIGZyX2ZpbGUgYW5kIGZyX2xpbmUgZmllbGRzLgotCSogZnJhZ3MuYyAoZnJhZ19uZXcpOiBTZXQgZnJfZmlsZSBhbmQgZnJfbGluZS4KLQkoZnJhZ192YXIpOiBMaWtld2lzZS4KLQkoZnJhZ192YXJpYW50KTogTGlrZXdpc2UuCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogUmVtb3ZlIHVudXNlZCBhbGlnbl9tYXNrIGFuZCBhbGlnbl9vZmZzZXQKLQlmaWVsZHMuCi0KLQkqIGxpc3RpbmcuYyAoY2FsY19oZXgpOiBPZmZzZXQgYnkgZnJfZml4IHdoZW4gZXhhbWluaW5nIGZyX3Zhci4KLQlGcm9tIDx1ZGRlYm9yZ0BjYXJtZW4uc2U+LgotCi1XZWQgSnVuIDI2IDEzOjIxOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotb3NmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEFkZCA2OGVjMDYwIGFzIGEgc3lub255bSBmb3IgNjgwNjAuCi0KLVdlZCBKdW4gMjYgMTY6MjM6MDggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCBjb3BfaW50ZXJsb2NrcywgdG8gYXZvaWQgTk9QIGluc2VydGlvbgotIAliZXR3ZWVuIGNvLXByb2Nlc3NvciBjb21wYXJpc29ucyBhbmQgYnJhbmNoZXMgZm9yIHRoZSBWUjQzMDAuCi0KLU1vbiBKdW4gMjQgMTg6MDI6NTAgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0JSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwKLQlpbmNsdWRlZGlyKTogVXNlIGF1dG9jb25mIHNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0KLU1vbiBKdW4gMjQgMTE6NTg6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfZWplY3QpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBsaXN0aW5nIGlzIDAuCi0JKGxpc3RpbmdfbGlzdCk6IExpa2V3aXNlLgotCShsaXN0aW5nX3NvdXJjZV9saW5lKTogTGlrZXdpc2UuCi0JKGxpc3RpbmdfdGl0bGUpOiBEb24ndCBzYXZlIHRpdGxlIGlmIGxpc3RpbmcgaXMgMC4KLQkobGlzdGluZ19zb3VyY2VfZmlsZSk6IENoZWNrIGxpc3RpbmcgcmF0aGVyIHRoYW4gbGlzdGluZ190YWlsLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKLQl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDIxIDE4OjIyOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEluIGNhc2UgJ2knLydqJywgZG9uJ3QgcmVxdWlyZSBhbgotCWFic29sdXRlIGV4cHJlc3Npb24gaWYgYSByZWxvY2F0aW9uIHR5cGUgd2FzIHNwZWNpZmllZC4KLQotRnJpIEp1biAyMSAxNzo0MDoxNiAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBtZXJsaW4uZ2NzLnJlZHN0b25lLmFybXkubWlsPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDIxIDE2OjAxOjE4IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBhbHBoYS0qLWxpbnV4ZWNvZmYqIHRhcmdldC4gIFVzZSBlbGYgZm9yCi0JYWxwaGEtKi1saW51eCogdGFyZ2V0LiAgRm9yY2UgYmZkX2dhcyBmb3IgYWxwaGEtKi4gIFJlcXVpcmUKLQlvcGNvZGVzIGxpYnJhcnkgZm9yIGFscGhhLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBTdWJzdGFudGlhbCByZXdyaXRlIHRvIGFkZCBFTEYgc3VwcG9ydCBhbmQKLQl1c2UgbmV3IG9wY29kZSB0YWJsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF91bmRlZmluZWRfc3ltYm9sKTogRG9uJ3QgZGVmaW5lLgotCShMT0NBTF9MQUJFTCk6IERlZmluZSBkaWZmZXJlbnRseSBpZiBPQkpfRUxGLgotCShGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogUmVtb3ZlLgotCSogY29uZmlnL29iai1lbGYuaDogSWYgVENfQUxQSEEsIGRlZmluZSBFQ09GRl9ERUJVR0dJTkcuCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQX2FscGhhKTogRGVwZW5kIHVwb24KLQlpbmNsdWRlL29wY29kZS9hbHBoYS5oIHJhdGhlciB0aGFuIGNvbmZpZy9hbHBoYS1vcGNvZGUuaC4KLQotVGh1IEp1biAyMCAxOToxMDoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IEdpdmUgYW4gZXJyb3IgaWYgdGhlCi0JcmVsb2NhdGlvbiBzeW1ib2wgd2FzIG5vdCByZXNvbHZlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogTGlrZXdpc2UuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVmZXRjaCB0aGUgc3ltYm9sIHNlY3Rpb24gYWZ0ZXIKLQljYWxsaW5nIFNfR0VUX1ZBTFVFLCBzaW5jZSBpdCBtYXkgaGF2ZSBjaGFuZ2VkLgotCi0JKiBleHByLmMgKHN0cnVjdCBleHByX3N5bWJvbF9saW5lKTogRGVmaW5lLgotCShleHByX3N5bWJvbF9saW5lcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1ha2VfZXhwcl9zeW1ib2wpOiBBZGQgZW50cnkgdG8gZXhwcl9zeW1ib2xfbGluZXMuCi0JKGV4cHJfc3ltYm9sX3doZXJlKTogTmV3IGZ1bmN0aW9uLgotCSogZXhwci5oOiBVc2UgZXh0ZXJuIG9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQkoZXhwcl9zeW1ib2xfd2hlcmUpOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFRyeSB0byB1c2UgZXhwcl9zeW1ib2xfd2hlcmUKLQlyYXRoZXIgdGhhbiBwcmludGluZyB0aGUgbWVhbmluZ2xlc3MgbmFtZSBvZiBhbiBleHByZXNzaW9uCi0Jc3ltYm9sLgotCi1UaHUgSnVuIDIwIDE1OjU3OjQxIDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9udW1iZXJfdG9fY2hhcnMpOiBEZWxldGVkLgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfbnVtYmVyX3RvX2NoYXJzKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYnVpbGRfb3BlcmF0ZV9uLCBidWlsZF9tZW0pOiBNb3ZlZCBlYXJsaWVyIGluCi0JdGhlIGZpbGUuCi0JKGxvYWRfc3ltYm9sX2FkZHJlc3MsIGxvYWRfZXhwcmVzc2lvbik6IFVzZSBidWlsZF9tZW0uCi0JKGJ1aWxkX29wZXJhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGVtaXRfYWRkcV9yKTogVXNlIGl0LgotCi0JV2VkIE1hciAxMyAyMjoxNDoxNCAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogc3ltYm9scy5jIChjb2xvbik6ICAjaWYgVk1TLCB1c2UgU19TRVRfT1RIRVIgdG8gc3RvcmUgYGNvbnN0X2ZsYWcnLgotCi0JVHVlIE1hciAgNSAxNDozMTo0NSAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3RjLXZheC5oIChOT1BfT1BDT0RFKTogRGVmaW5lLgotCi0JU3VuIEZlYiAgNCAyMTowMTowMyAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuaCAoU19JU19DT01NT04pOiBEZWZpbmUuCi0JKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0JKExPTkdXT1JEX0FMSUdOTUVOVCk6IE5ldyBtYWNyby4KLQkoU1VCX1NFR01FTlRfQUxJR04pOiBVc2UgaXQuCi0KLQlGcmkgSmFuIDI2IDE3OjQ0OjA5IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogUmVjb25jaWxlIHdpdGggY29uZi5pbi4KLQotV2VkIEp1biAxOSAxMTozMTo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGlzX2RucmFuZ2UpOiBPbmx5IGRlZmluZSBpZiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIGlzCi0JZGVmaW5lZC4KLQotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IHRoYXQgYW55IG51bWJlciBvZiBoZXggZGlnaXRzIGNhbgotCWZvbGxvdyBceC4KLQotCSogYXMuYyAoc3RydWN0IGRlZnN5bV9saXN0KTogRGVmaW5lLgotCShkZWZzeW1zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocGFyc2VfYXJncyk6IEp1c3QgcHV0IC0tZGVmc3ltIGFyZ3VtZW50cyBvbiBkZWZzeW1zIGxpc3QsIHJhdGhlcgotCXRoYW4gZGVmaW5pbmcgdGhlbS4KLQkobWFpbik6IERlZmluZSBkZWZzeW1zIGFmdGVyIG91dHB1dCBmaWxlIGlzIGNyZWF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgUFJFIGFuZCBQT1NUIGluZGV4aW5nIG1vZGUgb24KLQljcHUzMi4gIEZyb20gRXJpYyBOb3J1bSA8RXJpYy5Ob3J1bUB1c2Fzay5jYT4uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBJbiBjYXNlcyAnSScsICdpJywgYW5kICdqJywgc2V0Ci0JaW5zbl9lcnJvciByYXRoZXIgdGhhbiBjYWxsaW5nIGNoZWNrX2Fic29sdXRlX2V4cHIuCi0KLQkqIGFzLmMgKGVtdWxhdGlvbl9uYW1lKTogUmVtb3ZlIHVudXNlZCBzdGF0aWMgdmFyaWFibGUuCi0JKGRlZmF1bHRfZW11bF9iZmRfbmFtZSk6IEFkZCByZXR1cm4gTlVMTCB0byBhdm9pZCB3YXJuaW5nLgotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIG5hbWUgYW5kCi0JbmFtZV9lbmQuCi0JKiBmcmFncy5jIChmcmFnX25ldyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgdG1wLgotCSogaGFzaC5jIChoYXNoX2dyb3cpOiBQYXJlbnRoZXNpemUgKyB3aXRoaW4gPDwuCi0JKGhhc2hfcHJpbnRfc3RhdGlzdGljcyk6IFVzZSAlbHUsIG5vdCAlZCwgdG8gcHJpbnQgdW5zaWduZWQKLQlsb25nIHZhcmlhYmxlcy4KLQkqIG1lc3NhZ2VzLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoZnByaW50X3ZhbHVlKTogQWRkIGNhc3QgdG8gYXZvaWQgcHJpbnRmIHdhcm5pbmcuCi0JKHNwcmludF92YWx1ZSk6IExpa2V3aXNlLgotCSogcmVhZC5jOiBJbmNsdWRlICJlY29mZi5oIi4KLQkoZW1pdF9leHByKTogQWRkIGNhc3RzIHRvIGF2b2lkIHByaW50ZiB3YXJuaW5ncy4KLQkqIHJlYWQuaDogVXNlIGV4dGVybiBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCShwb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkqIHN0YWJzLmM6IEluY2x1ZGUgImVjb2ZmLmgiLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB0bXAsCi0JZm9ybWVyX2xhc3RfZnJhZ1AsIGFuZCBuZXdfZnJhZ1AuCi0JKiBzdWJzZWdzLmggKHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKGRlYnVnX3ZlcmlmeV9zeW1jaGFpbik6IENoYW5nZSBtYWNybyB0byBkaXNjYXJkCi0JYXJndW1lbnRzLgotCSogd3JpdGUuYyAoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IExpa2V3aXNlLgotCSogd3JpdGUuaDogVXNlIGV4dGVybiBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCSh3cml0ZV9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9lLW1pcHNlY29mZi5jIChtaXBzZWNvZmZfYmZkX25hbWUpOiBSZXR1cm4gTlVMTCB0byBhdm9pZAotCXdhcm5pbmcuCi0JKiBjb25maWcvZS1taXBzZWxmLmMgKG1pcHNlbGZfYmZkX25hbWUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9lY29mZl9zZXRfZXh0KTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IElmIE9CSl9FTEYsIGFsd2F5cwotCWVtaXQgcmVsb2NhdGlvbnMgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAodGNfZ2VuX3JlbG9jKTogT3V0cHV0IGEgc2Vuc2libGUgZXJyb3IKLSAJbWVzc2FnZSBpZiBiZmRfcmVsb2NfdHlwZV9sb29rdXAgZmFpbHMsIHJhdGhlciB0aGFuIGNhbGxpbmcKLSAJYXNzZXJ0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IEFkZAotCUJGRF9SRUxPQ18xMl9QQ1JFTCB0byBzd2l0Y2guCi0KLVR1ZSBKdW4gMTggMjA6Mjk6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoTE9DQUxfTEFCRUwsRkFLRV9MQUJFTF9OQU1FKTogVXNlIGRlZmF1bHRzIGZvcgotCVRFX1BFIChMZm9vLCBub3QgLkxmb28pLgotCi1UdWUgSnVuIDE4IDE3OjEzOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2ZpbGwpOiBEb24ndCB3YXJuIGFib3V0IGEgemVybyByZXBlYXQgY291bnQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB3YXJuIGFib3V0IHVzaW5nIEFUIGFzIGEKLQljb3Byb2Nlc3NvciByZWdpc3Rlci4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBXaGVuIGNoZWNraW5nIHRoZSBzaXplIG9mIGEKLQlyZWdpc3RlciB0byBzZXQgdGhlIHNpemUgb2YgYW4gaW5zdHJ1Y3Rpb24sIGRvIGEgYml0d2lzZSBhbmQgd2l0aAotCVJlZzggYW5kIFJlZzE2IHJhdGhlciB0aGFuIHJlcXVpcmluZyB0aGUgdHlwZSB0byBiZSBleGFjdGx5IFJlZzgKLQlvciBSZWcxNi4KLQotVHVlIEp1biAxOCAxMzoxOTo1MSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHBhcnNlX3JlZyk6IFR3ZWFrIGVycm9yIG1lc3NhZ2VzLgotCShidWlsZF9ieXRlcyk6IExpa2V3aXNlLgotCShza2lwX2NvbG9udGhpbmcpOiBIYW5kbGUgOjMyIHN1ZmZpeC4KLQkoZ2V0X3NwZWNpZmljKTogUHJvbW90ZSBMXzI0IHRvIExfMzIgaWYgaXQgbWFrZXMgYSBtYXRjaC4KLQlEb24ndCBhbHdheXMgcHJvbW90ZSBMXzggdG8gTF8xNi4KLQkoZG9fYV9maXhfaW1tKTogQ2xlYW4gdXAgTF8zMiBhbmQgTF8yNCBoYW5kbGluZy4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKFNtb2RlKTogTmV3IHZhcmlhYmxlLgotCShoODMwMGhtb2RlKTogVHVybiBvZmYgSG1vZGUuCi0JKGg4MzAwc21vZGUpOiBOZXcgZnVuY3Rpb24uICBUdXJuIG9uIFNtb2RlIGFuZCBIbW9kZS4KLQkobWRfcHNldWRvX3RhYmxlKTogTmV3ICIuaDgzMDBzIiBwc2V1ZG8tb3AuCi0JKHBhcnNlX3JlZyk6IEhhbmRsZSAiZXhyIiByZWdpc3Rlci4KLQkoZ2V0X29wZXJhbmQpOiBIYW5kbGUgYml6YXJyZSBzeW50YXggZm9yICJzdG0ubCIgYW5kICJsZG0ubCIuCi0JSGFuZGxlICJtYWNoIiBhbmQgIm1hY2hsIiBvcGVyYW5kcyBmb3IgbGRtYWMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSAic3RtLmwiIGFuZCAibGRtLmwiLgotCShidWlsZF9ieXRlcyk6IEhhbmRsZSAic3RtLmwiIGFuZCAibGRtLmwiOyBoYW5kbGUgTUFDUkVHIG9wZXJhbmRzLgotCSogY29uZmlnL3RjLWg4MzAwLmggKENPRkZfTUFHSUMpOiBIYW5kbGUgSDgvUyBtYWdpYyBudW1iZXIuCi0JKFNtb2RlKTogRGVjbGFyZS4KLQotTW9uIEp1biAxNyAxNTo1MDo1MyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBSZW9yZGVyIGNoYXB0ZXIgb2YgbWFjaGluZSBkZXBlbmRlbnQgb3B0aW9ucyBzbwotIAl0aGF0IGl0IGlzIHNvcnRlZCBieSBjaGlwIG5hbWUuICAKLQotCSogZG9jL2FzLnRleGluZm86IFVzZSBjb25zaXN0YW50IHNwZWxsaW5nIG9mIFZheC4KLQkqIGRvYy9jLXZheC50ZXhpOiBMaWtld2lzZS4KLQotTW9uIEp1biAxNyAxMToyNjo1NiAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIuYmVnaW5fdHJ5IiBhbmQgIi5lbmRfdHJ5IgotCXBzZXVkbyBvcHMuCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgUl9CRUdJTl9UUlkgYW5kIFJfRU5EX1RSWS4KLQkobWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKHBhX3RyeSk6IE5ldyBmdW5jdGlvbi4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NzIGZvciBCRUdJTl9UUlkgYW5kIEVORF9UUlkuCi0KLVN1biBKdW4gMTYgMjI6NTc6NDcgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiLmxldmVsIiBwc2V1ZG8gb3AuCi0JKHBhX2xldmVsKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgSnVuIDE0IDIwOjA2OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBsaXN0aW5nIGlzIDAuCi0KLVRodSBKdW4gMTMgMTc6NTA6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSWYgc3ltYm9sX3RhYmxlX2Zyb3plbiBpcyBzZXQsIGNhbGwKLQlzeW1ib2xfY3JlYXRlLCBub3Qgc3ltYm9sX25ldy4KLQotV2VkIEp1biAxMiAxNDoxMDo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3Qgc2V0IHN5X3VzZWRfaW5fcmVsb2MgZm9yIGFuCi0JYWJzb2x1dGUgc3ltYm9sIHVubGVzcyBUQ19GT1JDRV9SRUxPQ0FUSU9OIHJldHVybnMgdHJ1ZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHByZXZpb3VzX2ZpbGVfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFTUJMRVIKLQl2ZXJzaW9uLgotCShjX2RvdF9maWxlX3N5bWJvbCk6IEJGRF9BU1NFTUJMRVIgdmVyc2lvbjogRG9uJ3Qgc2V0IHRoZSB2YWx1ZSBvZgotCXRoZSBzeW1ib2wgdG8gYSBwb2ludGVyLiAgRG9uJ3Qgc2V0IHByZXZpb3VzX2ZpbGVfc3ltYm9sLgotCVNpbXBsaWZ5IHN5bWJvbCBsaXN0IHJlYXJyYW5nZW1lbnQuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBkbyBhbnl0aGluZyB3aXRoIENfRklMRSBzeW1ib2xzLgotCShjb2ZmX2FkanVzdF9zeW10YWIpOiBEb24ndCBjaGVjayBwcmV2aW91c19maWxlX3N5bWJvbC4KLQotTW9uIEp1biAxMCAxNDo1MjoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IE5ldyBmdW5jdGlvbiBmb3IgLmxjb21tCi0JZGlyZWN0aXZlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgcHBjX2VsZl9sY29tbS4KLQotTW9uIEp1biAxMCAxMTo0NTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBBY2NlcHQgQUJTTCBmb3IgJ08nLCBzbyB0aGF0IGBiZmV4dHUKLQlkMHsyNDoxfSxkMCcgd29ya3Mgd2l0aG91dCBhbiBpbW1lZGlhdGUgcHJlZml4IG9uIHRoZSBiaXQgbnVtYmVycy4KLQkobWRfYmVnaW4pOiBBZGQgZGlnaXRzIHRvIGFsdF9ub3RlbmRfdGFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IE1ha2UgcyBhIGNvbnN0IHBvaW50ZXIuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImVtcHR5Ii4KLQkoc19lbXB0eSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzdHJ1Y3QgZmlsZW5hbWVfbGlzdCk6IE9ubHkgZGVmaW5lIGlmIG5vdAotCUJGRF9BU1NFTUJMRVIuCi0JKGZpbGVuYW1lX2xpc3RfaGVhZCwgZmlsZW5hbWVfbGlzdF90YWlsKTogTGlrZXdpc2UuCi0JKGNfc2VjdGlvbl9zeW1ib2wpOiBSZW1vdmUgdW51c2VkIEJGRF9BU1NFTUJMRVIgdmVyc2lvbi4KLQkob2JqX2NvZmZfZW5kZWYsIEJGRF9BU1NFTUJMRVIgdmVyc2lvbik6IERvbid0IHNldCB0aGUgZGVidWdnaW5nCi0JZmxhZyBmb3IgQ19NT1MsIENfTU9FLCBDX01PVSwgb3IgQ19FT1Mgc3ltYm9scywgc2luY2UgdGhleSBzaG91bGQKLQloYXZlIGEgc2VjdGlvbiBvZiBOX0FCUyByYXRoZXIgdGhhbiBOX0RFQlVHLiAgSWYgd2UgZG8gYSBtZXJnZSwKLQlyZW1vdmUgdGhlIG5ldyBzeW1ib2wgZnJvbSB0aGUgbGlzdC4KLSAJKG9ial9jb2ZmX2VuZGVmLCBib3RoIHZlcnNpb25zKTogQ2FsbCB0YWdfaW5zZXJ0IGV2ZW4gaWYgdGhlcmUgaXMKLQlhbiBvbGQgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSwgaWYgdGhlIG9sZCBzeW1ib2wgZG9lcyBub3QKLQloYXBwZW4gdG8gYmUgYSB0YWcuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBDaGVjayBTRl9HRVRfVEFHLCBDX0VPRiwgYW5kIENfRklMRSBvdXRzaWRlIG9mCi0JdGhlIFNGX0dFVF9ERUJVRyBjb25kaXRpb24uICBEb24ndCBjYWxsIFNBX1NFVF9TWU1fRU5ETkRYIHdpdGggYQotCXN5bWJvbCB0aGF0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QuCi0JKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IEFsd2F5cyBjYWxsIHNlY3Rpb25fc3ltYm9sIGZvciAudGV4dCwKLQkuZGF0YSwgYW5kIC5ic3MuCi0JKGNvZmZfZnJvYl9zZWN0aW9uKTogTGlrZXdpc2UuICBBbHNvLCByZW1vdmUgdW51c2VkIHZhcmlhYmxlCi0Jc3RybmFtZS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogQ2FsbCBmcmFnX2dyb3cgcmF0aGVyIHRoYW4KLQltYW5pcHVsYXRpbmcgZnJhZ3MgZGlyZWN0bHkuCi0JKG1kX251bWJlcl90b19maWVsZCk6IEFkanVzdCBtZW1fcHRyIGNvcnJlY3RseSBpZiBFTkRJQU4gaXMKLQlkZWZpbmVkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJZiAnLycgaXMgTElORV9DT01NRU5UX1NUQVJULCBjaGVjawotIAl3aGV0aGVyIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnKicgYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlCi0JYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4gIFBlcm1pdCBMSU5FX0NPTU1FTlRfU1RBUlQgdG8gc3RhcnQgYQotCWNvbW1lbnQgaW4gc3RhdGUgMSAoc2VlbiBzb21lIHdoaXRlc3BhY2UpIGFzIHdlbGwsIHRvIG1hdGNoIHRoZQotCWRvY3VtZW50YXRpb24uCi0KLQkqIGdhc3AuYyAoZG9fYWxpZ24pOiBQZXJtaXQgYSBmaWxsIHZhbHVlIGZvciAuYWxpZ24uCi0KLVdlZCBKdW4gIDUgMTc6MDk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBXYXJuIGlmIGEgbmV3bGluZSBpcyBzZWVuIGluIHRoZQotCW1pZGRsZSBvZiBhIHN0cmluZy4gIENhbGwgYnVtcF9saW5lX2NvdW50ZXJzIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVdlZCBKdW4gIDUgMTc6MDg6MzYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBVc2UgTE9DQUxfTEFCRUwuCi0KLVR1ZSBKdW4gIDQgMTA6NTU6MTYgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgY2hlY2sgdG8gc2VlIGlmIHRvb2xkaXIgZXhpc3RzLgotCU1ha2UgJCh0b29sZGlyKSBhbmQgJCh0b29sZGlyKS9iaW4uCi0KLVR1ZSBKdW4gIDQgMTA6MTQ6NTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvcHBjLXNvbC5tdCAoVERFRklORVMpOiBEb24ndCB0dXJuIG9uIC1tcmVnbmFtZXMgYnkKLQlkZWZhdWx0LgotCi1Nb24gSnVuICAzIDExOjM0OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IGNhbGwgYXNfd2FybiBpZiB3ZSBhcmUgc2V0dGluZwotCWluc25fZXJyb3IuICBEb24ndCBwdXQgdGhlIHN0cmluZyAiRVJST1IiIGluIGluc25fZXJyb3IuICBTZXQKLQlpbnNuX2Vycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgYXNfd2FybiBmb3IgYW4gdW5zdXBwb3J0ZWQgb3Bjb2RlLgotCi1TYXQgSnVuICAxIDIxOjUxOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQ2hlY2sgZm9yIGEgNjQgYml0IGZvcm1hdAotCWJlZm9yZSBwZXJtaXR0aW5nIC02NC4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IFJlbW92ZSBkdXBsaWNhdGUKLQliZmRfcGVycm9yLgotCi1GcmkgTWF5IDMxIDAxOjA4OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiAtNjQsIGNyZWF0ZSBhIC5NSVBTLm9wdGlvbnMKLQlzZWN0aW9uIHJhdGhlciB0aGFuIGEgLnJlZ2luZm8gc2VjdGlvbi4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IElmIC02NCwgd3JpdGUgb3V0IDY0IGJpdCBSZWdJbmZvCi0JaW5mb3JtYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBJZiBtaXBzX2lzYSA8IDMsIHBlcm1pdCBhIDMyCi0JYml0IHZhbHVlIHdpdGggdGhlIGhpZ2ggYml0IHNldC4KLQotVGh1IE1heSAzMCAxOTowMDoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19sY29tbSk6IFNldCBzZWN0aW9uIGZsYWdzIGZvciAuc2JzcyBzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzY0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogSWYgbWlwc182NCwgcmV0dXJuIGVsZjY0IHRhcmdldHMgcmF0aGVyIHRoYW4KLQllbGYzMiBvbmVzLgotCShtZF9sb25nb3B0cyk6IEFkZCAiMzIiIGFuZCAiNjQiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLTMyIGFuZCAtNjQuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC0zMiBhbmQgLTY0LgotCShjb25zX2ZpeF9uZXdfbWlwcyk6IElmIG1pcHNfNjQsIGRvbid0IGNvbnZlcnQgYW4gOCBieXRlIHJlbG9jIHRvCi0JYSA0IGJ5dGUgb25lLgotCi1UaHUgTWF5IDMwIDEwOjM2OjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChjb21tZW50X2NoYXJzKTogTWFrZSAnIScgYSBjb21tZW50IGNoYXJhY3RlcgotCWZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogVW5kZXIgUG93ZXJQQyBTb2xhcmlzLCBjb252ZXJ0IGEKLQkuc3RhYmQgd2l0aCA0IGFyZ3VtZW50cyBpbnRvIGEgLnN0YWJuLgotCi1XZWQgTWF5IDI5IDE2OjQzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBXaGVuIHBhc3NpbmcgWF9hZGRfbnVtYmVyIHRvCi0JbWFjcm9fYnVpbGQsIGNhc3QgaXQgdG8gaW50IGZpcnN0LgotCi1UdWUgTWF5IDI4IDEzOjI5OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXo4ay5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgZnhfcl90eXBlIG9mIDAsIGFzCi0JY3JlYXRlZCBieSBlbWl0X2V4cHIuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IElmIGJmZF9tYWtlX2VtcHR5X3N5bWJvbCBmYWlscywgY2FsbAotCWFzX3BlcnJvciByYXRoZXIgdGhhbiBhc3NlcnQuCi0KLUZyaSBNYXkgMjQgMTg6MjQ6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogTWFyayBzZWN0aW9ucyBjcmVhdGVkIHRvIGhvbGQKLQlmbG9hdGluZyBwb2ludCBpbmZvcm1hdGlvbiBhcyByZWFkIG9ubHkuCi0KLUZyaSBNYXkgMjQgMTI6MDc6NTQgMTk5NiAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NldF9jcHUpOiBDaGFuZ2UgZGVmYXVsdHMgdG8gbWF0Y2ggQUlYLgotCi1UaHUgTWF5IDIzIDE3OjM0OjI0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIC5za2lwIGFzIGEgc3lub255bSBmb3IgLnNwYWNlLgotCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IEZvciBQb3dlclBDIEVMRiwgYWxsb3cgLnN0YWJkIHRvIHRha2UKLQk0IGFyZ3VtZW50cywgcHJvdmlkaW5nIHRoZSA0dGggYXJndW1lbnQgaXMgMCwgdG8gYWxsb3cKLQljb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgYXNzZW1ibGVyLgotCi1UaHUgTWF5IDE2IDE1OjUxOjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmggKHN0cnVjdCBzaF9zZWdtZW50X2luZm9fdHlwZSk6IERlZmluZS4KLQkoVENfU0VHTUVOVF9JTkZPX1RZUEUpOiBEZWZpbmUuCi0JKHNoX2Zyb2JfbGFiZWwpOiBEZWNsYXJlLgotCSh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCShzaF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlY2xhcmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX2Fzc2VtYmxlKTogSWYgcmVsYXhpbmcsIGVtaXQgYSBSX1NIX0NPREUKLSAJcmVsb2MgYmVmb3JlIHRoZSBpbnN0cnVjdGlvbiBpZiBuZWNlc3NhcnkuCi0JKHNoX2Zyb2JfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IElnbm9yZSBBTElHTiwgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcwotCXdoZW4gbG9va2luZyBmb3IgdGhlIHJlbG9jIGZvciB0aGUgdGFyZ2V0IG9mIC51c2VzLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggcHJpbnRmIGZvcm1hdCAoJTB4bHggdG8gMHglbHgpLgotCShzaF9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcyB0byBiZQotCWVtaXR0ZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IElnbm9yZSBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IEZvcmNlIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MgdG8gdXNlCi0JdGhlIGFic29sdXRlIHN5bWJvbC4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEFkZCB0Y19zZWdtZW50X2luZm9fZGF0YSBmaWVsZCBpZgotCVRDX1NFR01FTlRfSU5GT19UWVBFIGlzIGRlZmluZWQuCi0KLVdlZCBNYXkgMTUgMTI6MjM6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3VyZSB0aGUgb3Bjb2RlIHN1ZmZpeAotCW1hdGNoZXMgdGhlIHJlZ2lzdGVyIHNpemUuCi0KLVdlZCBNYXkgMTUgMDg6MzM6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY291bnRfZW50cmllc19pbl9jaGFpbik6IElnbm9yZSBGaXh1cHMgd2l0aAotCWZ4X2RvbmUgc2V0LiAKLQkoZG9fcmVsb2NzX2Zvcik6IExpa2V3aXNlLgotCShmaXh1cF9zZWdtZW50KTogRG9uJ3QganVzdCBxdWl0IGlmIGxpbmtyZWxheCBpcyBzZXQuICBUcnkgdG8KLQlhcHBseSBub24gcGMtcmVsYXRpdmUgc3ltMS1zeW0yIGZpeHVwcywgZXZlbiBpZiBsaW5rcmVsYXggaXMKLQlub256ZXJvLgotCi1GcmkgTWF5IDEwIDE0OjE2OjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IEdPVCBhbmQgc2VjdGlvbgotCXJlbGF0aXZlIHJlbG9jYXRpb25zIHdpdGggLW1yZWxvY2F0YWJsZS4gIEFsc28gYWxsb3cgdW5maXhlZAotCXJlbG9jcyBpbiAuZXhfc2hhcmVkLgotCi1UdWUgTWF5ICA3IDExOjI0OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHlhbmtfc3ltYm9scyk6IENoZWNrIHRoYXQgRk5BTUVfT0ZGU0VUIGlzCi0Jbm9uLXplcm8gYmVmb3JlIGFzc3VtaW5nIHRoaXMgaXMgYSBsb25nIGZpbGUgbmFtZS4KLQkod19zdHJpbmdzKTogTGlrZXdpc2UuCi0JKGNfZG90X2ZpbGVfc3ltYm9sKTogU2V0IEZOQU1FX09GRlNFVCB0byAxIGZvciBhIGxvbmcgZmlsZSBuYW1lLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod19zdHJpbmdzKTogTW92ZSBkZWNsYXJhdGlvbiBvZiBpIGluc2lkZQotCSNpZmRlZiBibG9jayB3aGljaCB1c2VzIGl0LgotCi1UdWUgTWF5ICA3IDAwOjQ5OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IFJlbmFtZSBsYXN0IGFyZ3VtZW50IHRvCi0JInJlbGF4bW9kZSIuICBPdXRwdXQgcmVsb2NzIHdoaWNoIGlkZW50aWZ5IHZhcmlvdXMgcmVsYXhpbmcKLQlwb3NzaWJpbGl0aWVzIGZvciBtb3YuW2J3bF0gaW5zdHJ1Y3Rpb25zLgotCShidWlsZF9ieXRlcyk6IFBhc3MgaW4gYSByZWxheGluZyBtb2RlIHRvIGRvX2FfZml4X2ltbS4KLQotTW9uIE1heSAgNiAxNToyNjoyOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKFRDX0hBTkRMRVNfRlhfRE9ORSk6IERlZmluZS4KLQkoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobXlfZ2V0X2V4cHJlc3Npb24pOiBPbmx5IHdhdGNoIGZvciBiYWQgc2VnbWVudHMKLQlpZiBPQkpfQU9VVC4KLQkobWRfYXBwbHlfZml4Myk6IFJlbmFtZWQgZnJvbSBtZF9hcHBseV9maXguCi0JSWYgcGNyZWwgcmVsb2MgYW5kIHN5bWJvbCBpcyBpbiBkaWZmZXJlbnQgc2VjdGlvbiwgdW5kbyBlZmZlY3RzCi0Jb2YgbWRfcGNyZWxfZnJvbS4KLQotU2F0IE1heSAgNCAxMjo0OTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QKLQlhbnkgcmVsb2Mgd2l0aCBhbiBMUiUgb3IgUlIlIGZpZWxkIHNlbGVjdG9yIGZvciBTT00uCi0KLVNhdCBNYXkgIDQgMTE6MjY6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHN1YnNlZ3MuaCB0byBhcHByb3ByaWF0ZSBUQVJHX0NQVV9ERVBfKgotIAl2YXJpYWJsZXMuCi0KLUZyaSBNYXkgIDMgMTc6NTg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IG1lcmdlIGEgc3ltYm9sIHdpdGgKLQlTRl9HRVRfU1RBVElDUyBzZXQuCi0JKHlhbmtfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgTWF5ICAxIDEzOjM4OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IElmIE1BTllfU0VHTUVOVFMgYW5kIG5vdAotCUJGRF9BU1NFTUJMRVIsIGFkZCBuYW1lIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoY29mZl9oZWFkZXJfYXBwZW5kKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkoY3Jhd2xfc3ltYm9scyk6IEp1c3QgdXNlIHRoZSBuYW1lIGZpZWxkIGZvciB0aGUgc3ltYm9sIG5hbWUsCi0Jd2l0aG91dCB3b3JyeWluZyBhYm91dCBudWxsIGJ5dGUgdGVybWluYXRpb24uCi0JKHdfc3RyaW5ncyk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogTGlrZXdpc2UuICBBbHNvLCB1c2UgdGhlIG5hbWUgZmllbGQsIHJhdGhlcgotCXRoYW4gc2NuaGRyLnNfbmFtZS4KLQkob2JqX2NvZmZfYWRkX3NlZ21lbnQpOiBQZXJtaXQgbG9uZyBzZWN0aW9uIG5hbWVzLgotCShvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSB0aGUgbmFtZSBmaWVsZCwgcmF0aGVyIHRoYW4KLQlzY25oZHIuc19uYW1lLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGUtcGUuaCAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGJydGFiX2VtaXQpOiBEb24ndCBzZXQgZnhfaW1fZGlzcCBmaWVsZC4KLQkobWVtX2ZtdCk6IExpa2V3aXNlLgotCShtZF9hcHBseV9maXgpOiBEb24ndCBjaGVjayBmeF9pbV9kaXNwIGZpZWxkLgotCi1UaHUgQXByIDI1IDExOjM5OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgKiBhZnRlciBzcGFyYyotKi12eHdvcmtzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJZiB0Y19jb21tZW50X2NoYXJzIGlzIG5vdCBkZWZpbmVkLAotCWRlZmluZSBpdCB0byBjb21tZW50X2NoYXJzLiAgVXNlIHRjX2NvbW1lbnRfY2hhcnMgcmF0aGVyIHRoYW4KLQljb21tZW50X2NoYXJzLgotCShkb19zY3J1Yl9jaGFycyk6IFVzZSB0Y19jb21tZW50X2NoYXJzIHJhdGhlciB0aGFuIGNvbW1lbnRfY2hhcnMuCi0JKiBjb25maWcvdGMtbTY4ay5oICh0Y19jb21tZW50X2NoYXJzKTogRGVmaW5lLgotCShtNjhrX2NvbW1lbnRfY2hhcnMpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19jb21tZW50X2NoYXJzKTogUmVuYW1lIGZyb20KLQljb21tZW50X2NoYXJzLiAgQ2hhbmdlIGludG8gYSBwb2ludGVyIHJhdGhlciB0aGFuIGFuIGFycmF5LgotCShtZF9sb25nb3B0cyk6IEFkZCAiYml0d2lzZS1vciIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBPUFRJT05fQklUV0lTRV9PUi4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLS1iaXR3aXNlLW9yLgotCSogZG9jL2MtbTY4ay50ZXhpOiBEb2N1bWVudCAtLWJpdHdpc2Utb3IuCi0KLVdlZCBBcHIgMjQgMTE6Mjg6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUHJldmVudCBhdHRlbXB0cyB0byB1c2UgbG9uZyBvZmZzZXRzCi0gCWluIDY4MDAwIG1vZGUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOgotCWNhbGwgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4gIE5vbiBCRkRfQVNTRU1CTEVSIHZlcnNpb246Ci0JY29ycmVjdCBoYW5kbGluZyBvZiBpbnB1dCBsaW5lIHBvaW50ZXIsIGFuZCBjYWxsCi0JZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4KLQotTW9uIEFwciAyMiAxODowMjozNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChpbl9iaXRmaWVsZF9yYW5nZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogTmV3IGNhc2VzIFgsWS4gIFVzZSBTUEFSQ19PUENPREVfQVJDSF9WOV9QLgotCShtZF9hcHBseV9maXgsIGNhc2VzIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwKLQlCRkRfUkVMT0NfU1BBUkNfe1dESVNQMTYsV0RJU1AxOX0pOiBGaXggdW5kZWZpbmVkIGNvZGUuCi0JKG1kX2FwcGx5X2ZpeCk6IE5ldyBjYXNlcyBCRkRfUkVMT0NfU1BBUkNfWzU2XS4KLQkodGNfZ2VuX3JlbG9jKTogTmV3IGNhc2VzIEJGRF9SRUxPQ19TUEFSQ19bNTZdLgotCi1UaHUgQXByIDE4IDE4OjU4OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IEJGRF9BU1NFTUJMRVI6Ci0gCShjb2ZmX2xhc3RfYmYpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogU2V0IGVuZG5keCBvZiBhIC5iZiBzeW1ib2wuCi0JTm9uIEJGRF9BU1NFTUJMRVI6Ci0JKG9ial9jb2ZmX2VuZGVmKTogQ2FsbCBTRl9TRVRfUFJPQ0VTUyBvbiBhIC5iZiBzeW1ib2wuCi0JKGxhc3RfYmZQKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoeWFua19zeW1ib2xzKTogU2V0IGVuZG5keCBvZiBhIC5iZiBzeW1ib2wuCi0KLVRodSBBcHIgMTggMTE6NTM6NTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciBTb2xhcmlzJ3MgLWxlCi0JYW5kIC1zIG9wdGlvbnMuICBBZGQgLWJlIGZvciBnb29kIG1lYXN1cmUuCi0KLVdlZCBBcHIgMTcgMTI6MzE6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfc3BhY2UpOiBTdXBwb3J0IG5vbi1jb25zdGFudCBmaWxsIHZhbHVlLiAgSGFuZGxlIGZpbGwKLQl2YWx1ZSBjb3JyZWN0bHkgZm9yIGEgc2l6ZSBvdGhlciB0aGFuIDEuCi0KLVR1ZSBBcHIgMTYgMTU6MTc6NDAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChteV9nZXRfZmxvYXRfZXhwcmVzc2lvbik6IFVwZGF0ZSBjYWxsIHRvCi0JZ2VuX3RvX3dvcmRzLCBYX1BSRUNJU0lPTiBjaGFuZ2VkIGZyb20gNiB0byA1LgotCi1UdWUgQXByIDE2IDEwOjI1OjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChyZWdpc3Rlcl9uYW1lLHJlZ19uYW1lX3NlYXJjaCk6IE1vdmUgcmVnaXN0ZXIKLQluYW1lIGxvb2t1cCBmcm9tIFBFIHNwZWNpZmljIGNvZGUgdG8gYWxsIHRhcmdldHMuICBBZGQgc3VwcG9ydCBmb3IKLQktbXJlZ25hbWVzLy1tbm8tcmVnbmFtZXMgdG8gY29udHJvbCB3aGV0aGVyIHJlZ2lzdGVyIG5hbWVzIGFyZQotCWV4cGFuZGVkIG9yIG5vdC4KLQkobWRfYXNzZW1ibGUpOiBDYWxsIHJlZ2lzdGVyX25hbWUgZm9yIGFsbCBwbGF0Zm9ybXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXJlZ25hbWVzLy1tbm8tcmVnbmFtZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlKi0qLXNvbGFyaXMpOiBBZGQgc3VwcG9ydC4KLQkocG93ZXJwYyotKi1saW51eCk6IERpdHRvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWcvcHBjLXNvbC5tdDogTmV3IGNvbmZpZyBmaWxlIGZvciBQb3dlclBDIFNvbGFyaXMuCi0KLU1vbiBBcHIgMTUgMTI6MjY6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2Zyb2JfZmlsZSk6IFBlcm1pdCBtdWx0aXBsZSAlaGkgcmVsb2NzIHRvCi0JYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlICVsbyByZWxvYy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdmFsdWVUCi0JYmVmb3JlIGNvbXBhcmluZyBhZ2FpbnN0IE1BWF9HUFJFTF9PRkZTRVQsIHNvIHRoYXQgbmVnYXRpdmUKLQludW1iZXJzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQkobWFjcm8pOiBMaWtld2lzZS4KLQotVGh1IEFwciAxMSAxMjozOTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsYXN0X2luc24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IFdhcm4gYWJvdXQgcHV0dGluZyBmbG9hdGluZyBwb2ludCBicmFuY2hlcyBpbiBhCi0JZGVsYXkgc2xvdC4gIElmIGFyY2hpdGVjdHVyZSBpcyBsZXNzIHRoYW4gdjksIGluc2VydCBOT1AKLQlpbnN0cnVjdGlvbnMgYmV0d2VlbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgYW5kIGZsb2F0aW5nCi0JcG9pbnQgYnJhbmNoZXMuICAoVGhlIFN1bk9TIGFzc2VtYmxlciBkb2VzIGJvdGggdGhlc2Ugb3BlcmF0aW9ucy4pCi0JU2F2ZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvcGNvZGUuCi0JKHNwYXJjX2lwKTogQWRkIHBpbnNuIHBhcmFtZXRlci4gIENoYW5nZSBjYWxsZXIuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ29ycmVjdCBjaGVjawotCWZvciBieXRlIGp1bXAgdG8gbmV4dCBpbnN0cnVjdGlvbiB0byBza2lwIGVtcHR5IGZyYWdzLgotCi1XZWQgQXByIDEwIDE2OjQ4OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogSWYgd2UgYXJlIGdvaW5nIHRvIGNhbGwgZW1pdF9hZGQ2NAotCWZvciBhZGRxIHdpdGggYSAxNiBiaXQgc2lnbmVkIHZhbHVlLCBqdXN0IGVtaXQgYSBsZGEgaW5zdHJ1Y3Rpb24KLQlpbnN0ZWFkLgotCi1XZWQgQXByIDEwIDE0OjM0OjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IERvbid0IGN1dCBvZmYgaGlnaCBiaXRzCi0Jb2YgYSAzMmJpdCBvcGVyYW5kLgotCi1Nb24gQXByICA4IDE0OjQyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDUgMTc6MDE6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X3NwZWNpZmljKTogUmVtb3ZlIHNvbWUgI2lmIDAgY29kZS4KLQkoYnVpbGRfYnl0ZXMpOiBSZW1vdmUgYWxsIEFCU01PViByZWxhdGVkIGNvZGU7IGl0J3MgdW5uZWNlc3NhcnkuCi0KLUZyaSBBcHIgIDUgMTU6MTM6MTAgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYzogRml4IGhhbmRsaW5nIG9mIGRlbm9ybWFsaXplZCBleHRlbmRlZAotCXByZWNpc2lvbiBudW1iZXJzIGFuZCBvdmVyZmxvdy91bmRlcmZsb3cgZGV0ZWN0aW9uLgotCShNQVhfUFJFQ0lTSU9OLCBYX1BSRUNJU0lPTiwgUF9QUkVDSVNJT04pOiBDaGFuZ2VkIGZyb20gNiB0byA1LCB0bwotCW5vdCBpbmNsdWRlIHRoZSAxNiBiaXQgZ2FwIGluIHRoZSBtNjhrIGV4dGVuZGVkIHByZWNpc2lvbiBmb3JtYXQuCi0KLUZyaSBBcHIgIDUgMTQ6Mjk6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBpMzg2LSotZnJlZWJzZGVsZiogdGFyZ2V0OyBmcm9tIEpvaG4gUG9sc3RyYQotCTxqZHBAcG9sc3RyYS5jb20+LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByICA1IDE4OjM5OjI4IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQWxsb3cgbm9uLXplcm8gb2Zmc2V0cyBmcm9tIC5zZGF0YSBzeW1ib2xzIHRvCi0gCWJlIGFjY2Vzc2VkIHVzaW5nIHRoZSAkZ3AgcmVnaXN0ZXIuCi0JKiBjb25maWcvdGMtbWlwcy5oIChNQVhfR1BSRUxfT0ZGU0VUKTogQWRkZWQuCi0KLVdlZCBBcHIgIDMgMTA6NTY6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX21kX2VuZCk6IFNldCBiZmQgbWFjaGluZSBudW1iZXIgdG8KLQliZmRfbWFjaF9zcGFyY19zcGFyY2xldCBpZiBjdXJyZW50X2FyY2hpdGVjdHVyZSBpcyBzcGFyY2xldC4KLQotTW9uIEFwciAgMSAxNjo1NTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBCdW1wIGxpbmUgY291bnRlcnMgYmFzZWQgb24KLQlpbnB1dF9saW5lX3BvaW50ZXJbLTFdLCBub3QgKmlucHV0X2xpbmVfcG9pbnRlci4gIERvbid0IGJvdGhlciB0bwotCWNhbGwgTElTVElOR19ORVdMSU5FLgotCShzX21hY3JvKTogRG9uJ3QgY2FsbCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLgotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogV2hlbiBoYW5kbGluZyBDIHN0eWxlIGNvbW1lbnRzLCB1bmdldAotCWNoMiByYXRoZXIgdGhhbiBjaC4KLQotRnJpIE1hciAyOSAxNjoxNTowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoZW51bSBsaW5rb25jZV90eXBlKTogRGVmaW5lLgotCShzX2xpbmtvbmNlKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAibGlua29uY2UiLgotCShzX2xpbmtvbmNlKTogTmV3IGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEFkZCBsaW5rb25jZSBmaWVsZCB0bwotCU1BTllfU0VHTUVOVFMgJiYgISBCRkRfQVNTRU1CTEVSIHNlY3Rpb24uCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2hhbmRsZV9saW5rX29uY2UpOiBEZWZpbmUgaWYgVEVfUEUuCi0JKG9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UpOiBEZWNsYXJlIGlmIFRFX1BFLgotCSogY29uZmlnL29iai1jb2ZmLmM6IElmIFRFX1BFIGFuZCBub3QgQkZEX0FTU0VNQkxFUiwgI2luY2x1ZGUKLQkiY29mZi9wZS5oIi4KLQkob2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSk6IE5ldyBmdW5jdGlvbiwgZGVmaW5lZCBpZiBURV9QRS4KLQkoY19zZWN0aW9uX3N5bWJvbCk6IElmIFRFX1BFLCBzZXQgdGhlIHhfY29tZGF0IGZpZWxkIGluIHRoZSBhdXgKLQllbnRyeSBiYXNlZCBvbiB0aGUgbGlua29uY2UgZmllbGQgaW4gc2VnbWVudF9pbmZvLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC5saW5rb25jZS4KLQotRnJpIE1hciAyOSAxMTozMToyNyAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMuMTogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgotCi1UaHUgTWFyIDI4IDE1OjI3OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBDYWxsIHRoZSBsaXN0aW5nIGZ1bmN0aW9ucyBiZWZvcmUKLQlkb2luZyB0aGUgcmVzdCBvZiB0aGUgcHJvY2Vzc2luZywgd2hpY2ggbWF5IGludm9sdmUgZnJlZWluZyB0aGUKLQlzdHJpbmcuICBQYXNzIHN0cmluZywgbm90IHN0cmluZyArIHN0cm9mZiwgdG8gT0JKX1BST0NFU1NfU1RBQiBpbgotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMgY2FzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogUmVtb3ZlIG5lc3RlZCBjb21tZW50LgotCSh0Y19nZW5fcmVsb2MpOiBNb3ZlIGxhYmVsIGRvbmUgaW5zaWRlIHRoZSBpZmRlZiBpbiB3aGljaCBpdCBpcwotCXVzZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IFBhc3MgcG9pbnRlcnMgdG8gY29ycmVjdCB0eXBlcyB0byBsaWJocHBhLmgKLQlmdW5jdGlvbnMuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfZmlsZSk6IERlZmluZS4KLQkobWlwc19mcm9iX2ZpbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAoc3RydWN0IG1pcHNfaGlfZml4dXApOiBEZWZpbmUuCi0JKG1pcHNfaGlfZml4dXBfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGltbV91bm1hdGNoZWRfaGkpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IENsZWFyIGltbV9yZWxvYywgaW1tX3VubWF0Y2hlZF9oaSwgYW5kCi0Jb2Zmc2V0X3JlbG9jLiAgUGFzcyBpbW1fdW5tYXRjaGVkX2hpIHRvIGFwcGVuZF9pbnNuLgotCShhcHBlbmRfaW5zbik6IEFkZCB1bm1hdGNoZWRfaGkgcGFyYW1ldGVyLiAgSWYgaXQgaXMgc2V0LCBhZGQgdGhlCi0JbmV3IGZpeHVwIHRvIG1pcHNfaGlfZml4dXBfbGlzdC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWlwc19pcCk6IFNldCBpbW1fdW5tYXRjaGVkX2hpIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgTWFyIDI4IDExOjQ3OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1zb2xhcmlzMiopOiBSZW5hbWVkIGZyb20gc3BhcmMqLSotc29sYXJpczIqLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVHVlIE1hciAyNiAxODoxOToxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lLgotCi1GcmkgTWFyIDIyIDExOjEzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoc3RyZHVwKTogRG9uJ3QgZGVjbGFyZS4KLQkqIHN0YWJzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmgKLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCk6IExpa2V3aXNlLgotCi0JKiBnYXNwLmMgKGNoYW5nZV9iYXNlKTogUmVjb2duaXplIFwoLi4uKSBjb25zdHJ1Y3QgZG9jdW1lbnRlZCB0bwotCXBhc3MgdGhyb3VnaCBlbmNsb3NlZCBjaGFyYWN0ZXJzIGxpdGVyYWxseSB0aHJvdWdoIHRvIHRoZSBvdXRwdXQuCi0JKHByb2Nlc3NfYXNzaWducyk6IExpa2V3aXNlLiAgQWxzbywgYmUgbW9yZSBjYXJlZnVsIHRvIGF2b2lkCi0JbG9va2luZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLQotVGh1IE1hciAyMSAxMzoxODo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9FTEYsIGlnbm9yZSAtayBmb3IKLQlGcmVlQlNEIGNvbXBhdGliaWxpdHkuICBGcm9tIEpvaG4gUG9sc3RyYSA8amRwQHBvbHN0cmEuY29tPi4KLQotV2VkIE1hciAyMCAxODoxMzozMiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jL2FzLnRleGluZm8sIGRvYy9jLWk5NjAudGV4aTogRml4IHR5cG9zLgotCi1XZWQgTWFyIDIwIDE3OjA1OjE2IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogQWRkZWQgY3Z0c3QgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBNYXIgMTggMTM6MTI6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogRG9uJ3QgdHJ5IHRvIG1ha2UgYSBzeW1ib2wgb3V0IG9mIHRoZSBzdGFiCi0Jc3RyaW5nLiAgRXh0cmFjdCB0aGUgYWRkZW5kIGZyb20gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uLgotCi1GcmkgTWFyIDE1IDE3OjEwOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSWYgd2hpdGVzcGFjZSBpcyBzZWVuIGluIHN0YXRlIDExLCBhbmQKLQlMQUJFTFNfV0lUSE9VVF9DT0xPTlMgaXMgbm90IGRlZmluZWQsIGFuZCB3ZSBhcmUgbm90IGluIG02OGsgTVJJCi0JbW9kZSwgY2hhbmdlIHRoZSBzdGF0ZSB0byAzIHJhdGhlciB0aGFuIDEuCi0KLVRodSBNYXIgMTQgMTg6MTg6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoQ19SRUdJU1RFUl9TRUNUSU9OKTogQ2hhbmdlIGZyb20gMjAgdG8gNTAsIHRvCi0JY29ycmVzcG9uZCB0byAxMSBNYXJjaCBjaGFuZ2UuCi0KLVRodSBNYXIgMTQgMTU6Mjc6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoYnVpbGRfYnl0ZXMsIE1FTUlORCBjYXNlKTogR2VuZXJhdGUKLQlhbiBSX01FTV9JTkRJUkVDVCByZWxvYyByYXRoZXIgdGhhbiBSX1JFTEJZVEUuCi0KLVR1ZSBNYXIgMTIgMTI6MjE6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLU1vbiBNYXIgMTEgMTg6NTc6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IEltcHJvdmUgaGFuZGxpbmcgb2YKLQlYX1BSRUNJU0lPTiBudW1iZXJzLiAgQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEFuZHJlYXMgU2Nod2FiCi0JPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4uCi0KLU1vbiBNYXIgMTEgMDk6NTk6NTMgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoU0VHX05PUk1BTCwgU0VHX0xJU1QpOiBCdW1wIHNlZ21lbnQgbGltaXQgZnJvbSAxMCB0byA0MC4KLQkoU0VHX0xBU1QpOiBOZXcuCi0JKiBzdWJzZWdzLmMgKE1BTllfU0VHTUVOVFMpOiBJbmNyZWFzZSBzZWdtZW50IGxpbWl0LgotCSogb2JqLWNvZmYuYyAoc2VnX05fVFlQRSwgc2VnX2luZm9fb2ZmX2J5XzQpOiBMaWtld2lzZS4KLQkoZG9fcmVsb2NzX2Zvciwgd19zeW1ib2xzLCBvYmpfY29mZl9hZGRfc2VnbWVudCwgZG9fbGluZW5vc19mb3IsCi0JY3Jhd2xfc3ltYm9scywgY29mZl9oZWFkZXJfYXBwZW5kKTogTG9vcCB0byBTRUdfTEFTVCByYXRoZXIgdGhhbgotCVNFR19FOS4KLQkKLVRodSBNYXIgIDcgMTU6MTc6MzkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEhhbmRsZSBvcGVyYW5kIGNoYXIgJ08nIChuZWcgcmVnKS4KLQotVGh1IE1hciAgNyAwOToxOToxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKFNVQlNFR19NSUxMSSk6IERlZmluZS4KLQkocGFfZGVmX3N1YnNwYWNlcyk6IEFkZCAkTUlMTElDT0RFJC4KLQkocGFfc3BhY2VzX2JlZ2luKTogU2V0IHNlY3Rpb24gZmxhZ3MgZm9yICRNSUxMSUNPREUkLgotCi1XZWQgTWFyICA2IDE0OjExOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogT25seSBTRUNfTE9BRCBpZiB0aGUgdHlwZSBpcwotCW5vdCBTSFRfTk9CSVRTLiAgRG9uJ3QgdGFtcGVyIHdpdGggZmxhZ3MgYmFzZWQgb24gdHlwZSBpZiBhCi0Jc3BlY2lhbCBzZWN0aW9uIHdhcyBmb3VuZCAocmV2ZXJ0IEZlYiAyOSBjaGFuZ2UpLgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBPbmx5IGFsaWduIHVzaW5nIHRoZSBub3AgcGF0dGVybgotCWlmIGFsaWduaW5nIHRvIGEgbG9uZ3dvcmQgYm91bmRhcnkgb3IgZ3JlYXRlci4KLQotVHVlIE1hciAgNSAxNToxMDo0MyAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IFBhc3MgMSBub3QgMiB0byBmcmFnX2FsaWduLgotCi1Nb24gTWFyICA0IDIwOjUwOjU3IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWN5Z3dpbjMyKTogRG9uJ3QgdXNlIGJmZF9nYXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTWFyICA0IDEwOjEzOjA2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQWRkIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIFJfTjBTRUwgYW5kCi0JUl9OMVNFTCBzaW5jZSB0aGV5J3JlIG5vdCBkZWZpbmVkIGZvciBvbGQgdmVyc2lvbnMgb2YgaHB1eC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRml4IHR5cG8gaW4gUl9DT01QMiBjb2RlLgotCVNldCAic3ltX3B0cl9wdHIiIGFuZCAiYWRkZW5kIiBmaWVsZHMgdG8gZHVtbXkgdmFsdWVzIGZvcgotCVJfTjBTRUwgYW5kIFJfTjFTRUwuCi0KLUZyaSBNYXIgIDEgMTA6MjA6NTIgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGZsb251bS1rb25zdC5jOiBBZGQgdHdvIG1vcmUgY29uc3RhbnRzIGZvciAxZSstMjA0OCBhbmQKLQkxZSstNDA5NiwgYW5kIGNvcnJlY3QgdGhlIG90aGVyIGNvbnN0YW50cy4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBPX2xvZ2ljYWxfbm90LgotCi1UaHUgRmViIDI5IDEzOjU4OjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgcHJlZGVmaW5lZCBzZWN0aW9uCi0JdHlwZXMgdG8gc2V0IHRoZSBub2JpdHMgdHlwZS4gIEF2b2lkIGEgc2hhZG93ZWQgZGVjbGFyYXRpb24uCi0KLVdlZCBGZWIgMjggMTU6Mzg6NTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogRm9yIFNPTSwgZG9uJ3QKLQlyZWR1Y2UgcmVsb2NzIHVzaW5nIGVfbmxyc2VsIGZpZWxkIHNlbGVjdG9ycy4KLQotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBEb24ndCB1c2UgI2VsaWYuICBTb21lIGNvbXBpbGVycwotCWRvbid0IGhhbmRsZSBpdC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc2VsZWN0b3JfdGFibGUpOiBBZGQgIm4iLCAibmwiLCBhbmQgIm5sciIgdG8KLQl0aGUgc2VsZWN0b3IgdGFibGUuCi0JKHBhX2Noa19maWVsZF9zZWxlY3Rvcik6IEhhbmRsZSBuZXcgZmllbGQgc2VsZWN0b3JzIGZvciBTT00uCi0KLVR1ZSBGZWIgMjcgMTQ6NDI6MjcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWxpbnV4KmFvdXQqLCBtNjhrLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtbGludXguaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX0xJTlVYXTogRGVmaW5lIHRvCi0JImEub3V0LW02OGstbGludXgiLgotCSogY29uZmlnL3RjLW02OGsuYyAoY29tbWVudF9jaGFycyk6IERvbid0IGluY2x1ZGUgJyMnIGlmIFRFX0xJTlVYCi0JaXMgZGVmaW5lZC4KLQotTW9uIEZlYiAyNiAxODo1ODo1OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIHRvIGhhbmRsZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCi1Nb24gRmViIDI2IDEwOjM0OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBQcmludCBhbGwgYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQKLQl0aGUgaW5zbiBvbiBtaXNtYXRjaC4KLQotRnJpIEZlYiAyMyAyMTo0NDozOSAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBhMjktY29mZi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEZlYiAyMiAxNjozOTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9jb2ZmX2Zyb2JfZmlsZSk6IERvbid0IGNvbnNpZGVyIHRoZSBhZGRyZXNzCi0Jb2YgdGhlIHNlY3Rpb24gd2hlbiBsb29raW5nIGZvciB0aGUgUl9TSF9VU0VTIGZpeHVwLCBiZWNhdXNlIHRoZQotCWZyYWcgYWRkcmVzc2VzIGhhdmUgbm90IHlldCBiZWVuIGFkanVzdGVkLgotCi0JKiBnZGJpbml0LmluOiBTZXQgYSBicmVha3BvaW50IG9uIGFzX3dhcm5fd2hlcmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQWRkIG1pc3NpbmcgYXJndW1lbnRzIHRvIG1hY3JvX2J1aWxkCi0Jb21pdHRlZCBpbiBsYXN0IGNoYW5nZS4gIEZyb20gSmltIFdpbHNvbiA8d2lsc29uQGN5Z251cy5jb20+LgotCi1XZWQgRmViIDIxIDE3OjAwOjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHRjX3JlbG9jX21hbmdsZSk6IENoYW5nZSByZWxvYyBiYXNlZCBvbiBzaXplCi0JaWYgaXQgaXMgVENfQ09OU19SRUxPQy4gIFNldCBhIHNpemUgb2YgNCB0byBSX1JFTExPTkcuCi0KLVdlZCBGZWIgMjEgMDk6MjU6MzkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlY29nbml6ZSAlYXNyMCBmb3IgdjguCi0KLVR1ZSBGZWIgMjAgMjE6NDg6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChwYXJzZV9rZXl3b3JkX2FyZyk6IEFjY2VwdCBsZWFkaW5nICclJy4KLQkoc3BhcmNfaXApOiBBY2NlcHQgJWFzclsxLi4zMV0gZm9yIHY4IGFuZCAlYXNyWyUxNi4uMzFdIGZvciB2OS4KLQlSZWNvZ25pemUgW3VVXSBmb3JtYXQgYXJncyBhcyBzcGFyY2xldCBjcHJlZ3MuCi0KLVR1ZSBGZWIgMjAgMjI6MjU6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfaGFuZGxlX2FsaWduKTogRG9uJ3QgZW1pdCBSX1NIX0FMSUdOIHJlbG9jcwotCWluIGJzc19zZWN0aW9uLgotCi1Nb24gRmViIDE5IDE0OjE2OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IENoZWNrIFNfSVNfV0VBSyBhcwotCXdlbGwgYXMgU19JU19FWFRFUk5BTC4KLQkodGNfZml4X2FkanVzdGFibGUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJbiBPQkpfRUxGIGNhc2UsIGNoZWNrIGZvcgotCVNfSVNfV0VBSyBhcyB3ZWxsIGFzIFNfSVNfRVhURVJOQUwgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIHJldHVybgotCWVhcmx5LgotCSh0Y19nZW5fcmVsb2MpOiBDaGVjayBTX0lTX1dFQUsgYXMgd2VsIGFzIFNfSVNfRVhURVJOQUwgd2hlbgotCWRlY2lkaW5nIHdoZXRoZXIgdG8gY29udmVydCBCRkRfUkVMT0NfMzJfUENSRUxfUzIgaWYgUElDLgotCi1Nb24gRmViIDE5IDAyOjE1OjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWF4X2FyY2hpdGVjdHVyZSk6IENoYW5nZSB0byBzcGFyY2xpdGUgZm9yCi0JMzIgYml0IGFyY2guCi0JKGRlZmF1bHRfY29tcGF0aWJsZSk6IERlbGV0ZS4KLQkoc3BhcmNfZmZzKTogTmV3IGZ1bmN0aW9uLgotCShtZF9iZWdpbik6IE9ubHkgY2FsbCBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCBvbmNlLgotCShzcGFyY19pcCk6IFJld3JpdGUgYXJjaGl0ZWN0dXJlIG1hdGNoIGFuZCBidW1wIGxvZ2ljLgotCi1TdW4gRmViIDE4IDE1OjAzOjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLSAJdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBGZWIgMTYgMTY6NTM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0ZfQURKX0xOTk9QVFIpOiBEZWZpbmUgKG5vbiBCRkRfQVNTRU1CTEVSKS4KLQkoU0ZfR0VUX0FESl9MTk5PUFRSKTogRGVmaW5lIChub24gQkZEX0FTU0VNQkxFUikuCi0JKFNGX1NFVF9BREpfTE5OT1BUUik6IERlZmluZSAobm9uIEJGRF9BU1NFTUJMRVIpLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogU2V0IEFESl9MTk5PUFRSIHdoZW4gTE5OT1BUUgotCWlzIHNldC4KLQkod19zeW1ib2xzKTogSWYgQURKX0xOTk9QVFIgaXMgc2V0LCBhZGQgdGhlIHNlY3Rpb24gbG5ub3B0ciBmaWVsZAotCXRvIHRoZSBzeW1ib2wgbG5ub3B0ciBmaWVsZCwgdG8gZ2V0IHRoZSBjb3JyZWN0IGZpbGUgb2Zmc2V0LgotCi1UaHUgRmViIDE1IDE0OjQ4OjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogT24gdGhlIFBvd2VyUEMsIGZvcmNlIGFsbAotCXN5bWJvbHMgdGhhdCBhcmUgbm90IGZ1bmN0aW9uLCBmaWxlLCBvciBzZWN0aW9uIHN5bWJvbHMgdG8gYmUKLQlvYmplY3QgdHlwZXMuCi0KLVRodSBGZWIgMTUgMTE6MjA6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBhbmQgc3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShjaGVjayk6IFVzZSAkKFJQQVRIX0VOVlZBUikgcmF0aGVyIHRoYW4gTERfTElCUkFSWV9QQVRILgotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBpNjg2LiAgRnJvbSBILkouIEx1IDxoamxAem9vbS5jb20+OiBpMzg2Ci0JZG9lc24ndCBuZWVkIG9wY29kZXMuICBJZiBjb25maWd1cmluZyBzaGFyZWQsIG9wY29kZXMgbmVlZHMgYmZkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgRmViIDE0IDE2OjMzOjEyIDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCk6IERvbid0IHJldHVybiAnXDAnIGluIHR5cGUuICBTZXQgYWxsCi0JYXBwcm9wcmlhdGUgZmxhZ3MgaW4gQkZEIHNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLXBzb3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1wc29zLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLW02OGsuYyAoY29tbWVudF9jaGFycyk6IERvbid0IGluY2x1ZGUgJyMnIGlmIFRFX1BTT1MKLQlpcyBkZWZpbmVkLgotCi1XZWQgRmViIDE0IDEzOjQzOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluOiBSZW1vdmUgZHVwbGljYXRlIHNldHRpbmcgb2YgY3B1X3R5cGUuICBDaGVjawotCXdoZXRoZXIgb3Bjb2RlcyBsaWJyYXJ5IGlzIHJlcXVpcmVkIGZvciBvbiBhbGwgdGFyZ2V0cywgbm90IGp1c3QKLQlwcmltYXJ5IG9uZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19iaWdfZ290KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19leHRlcm4pOiBEb24ndCBkZWNsYXJlLgotCShyZWdfbmVlZHNfZGVsYXkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYWNyb19idWlsZCk6IFBlcm1pdCBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0JKG1hY3JvX2J1aWxkX2x1aSk6IElmIHBsYWNlIGlzIG5vdCBOVUxMLCB1c2UgdGhlIG51bWJlciBpbiB0aGUKLQlleHByZXNzaW9uLgotCShsb2FkX2FkZHJlc3MpOiBIYW5kbGUgbWlwc19iaWdfZ290IGNhc2UuCi0JKG1hY3JvKTogSGFuZGxlIG1pcHNfYmlnX2dvdCBmb3IgTV9MQV9BQiwgTV9KQUxfQSwgYW5kIGxvYWQgYW5kCi0Jc3RvcmUgbWFjcm9zLgotCShPUFRJT05fWEdPVCk6IERlZmluZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgInhnb3QiIGlmIE9CSl9FTEYuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAteGdvdC4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLXhnb3QuCi0JKG1kX2FwcGx5X2ZpeCk6IFBlcm1pdCBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0KLVdlZCBGZWIgMTQgMTE6MjI6MjcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApIFtvcGVyYW5kIGtpbmQgJyMnXTogV2hlbiBmaXhpbmcKLQl0aGUgYnl0ZSByZWxvY2F0aW9uLCBwb2ludCBpdCB0byB0aGUgbG93IGJ5dGUgb2YgdGhlIHdvcmQuCi0KLVR1ZSBGZWIgMTMgMTU6MzE6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTIgMTU6NTM6NDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGFueSBzcGFyYyogY3B1LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIEZlYiAxMiAxNTo0MToyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAibXJpIiBhbmQgIi5tcmkiLgotCShzX21yaSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAoc19tcmkpOiBEZWNsYXJlLgotCSogYXBwLmMgKHNjcnViX202OGtfbXJpKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobXJpX3BzZXVkbyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGRvX3NjcnViX2JlZ2luKTogQWRkIG02OGtfbXJpIHBhcmFtZXRlci4gIFVzZSBpdCByYXRoZXIgdGhhbgotCWZsYWdfbTY4a19tcmkuICBJbml0aWFsaXplIHNjcnViX202OGtfbXJpLgotCShtcmlfc3RhdGUsIG1yaV9sYXN0X2NoKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBhcHBfc2F2ZSk6IEFkZCBzY3J1Yl9tNjhrX21yaSwgbXJpX3N0YXRlLCBhbmQgbXJpX2xhc3RfY2gKLQlmaWVsZHMuCi0JKGFwcF9wdXNoKTogU2F2ZSBuZXcgZmllbGRzLgotCShhcHBfcG9wKTogUmVzdG9yZSBuZXcgZmllbGRzLgotCShkb19zY3J1Yl9jaGFycyk6IENoZWNrIHNjcnViX202OGtfbXJpIHJhdGhlciB0aGFuIGZsYWdfbXJpX21yaS4KLQlJZiBUQ19NNjhLLCB1c2UgYSB0cml2aWFsIHN0YXRlIG1hY2hpbmUgdG8gbG9vayBmb3Igb2NjdXJyZW5jZXMgb2YKLQl0aGUgLm1yaSBwc2V1ZG8tb3AsIGFuZCBjaGFuZ2UgdGhlIG1vZGUgYXBwcm9wcmlhdGVseS4KLQkqIGFzLmggKGRvX3NjcnViX2JlZ2luKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX2JlZ2luKTogUGFzcyBmbGFnX202OGtfbXJpIHRvCi0JZG9fc2NydWJfYmVnaW4uCi0JKiBjb25maWcvdGMtbTY4ay5jIChyZWdfcHJlZml4X29wdGlvbmFsX3NlZW4pOiBOZXcgc3RhdGljCi0JdmFyaWFibGUuCi0JKG02OGtfbXJpX21vZGVfY2hhbmdlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgcmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuLgotCSogY29uZmlnL3RjLW02OGsuaCAobTY4a19tcmlfbW9kZV9jaGFuZ2UpOiBEZWNsYXJlLgotCShNUklfTU9ERV9DSEFOR0UpOiBEZWZpbmUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLm1yaSBwc2V1ZG8tb3AuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEluIE1SSSBtb2RlLCBkb24ndCB0cmVhdCAnIycgYXMgYQotCWNvbW1lbnQgY2hhcmFjdGVyLgotCi1Nb24gRmViIDEyIDE1OjE2OjI5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JU3VwcG9ydCBmb3IgT0JKX0VMRiBvbiBtNjhrLCBtb3N0bHkgaW5zaWRlICNpZmRlZiBPQkpfRUxGOgotCSogY29uZmlnL202OGstcGFyc2UuaCAoZW51bSBwaWNfcmVsb2NhdGlvbik6IERlZmluZS4KLQkoc3RydWN0IG02OGtfZXhwKTogQWRkIHBpY19yZWxvYyBmaWVsZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZS4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUgdG8gY2FsbCB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlLgotCShOT19SRUxPQyk6IERlZmluZSB0byBCRkRfUkVMT0NfTk9ORSBpZiBCRkRfQVNTRU1CTEVSLCB0byB6ZXJvCi0Jb3RoZXJ3aXNlLgotCSogY29uZmlnL3RjLW02OGsuYzogRGVsZXRlIGRlZmluaXRpb24gb2YgTk9fUkVMT0MuCi0gCShzdHJ1Y3QgbTY4a19pdCk6IEFkZCBwaWNfcmVsb2MgZmllbGQuCi0JKGFkZF9maXgpOiBDb3B5IG92ZXIgcGljX3JlbG9jIGZpZWxkLgotCShtZF9wc2V1ZG9fdGFibGUpOiBJbnRlcnByZXQgLmFsaWduIHBhcmFtZXRlciBhcyBieXRlIGNvdW50LgotCShtb3RlX3BzZXVkb190YWJsZSk6IExpa2V3aXNlLgotCSh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfcmVsb2NfY29kZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBVc2UgaXQgYXMgbGFzdCBhcmd1bWVudCB0byBmaXhfbmV3X2V4cC4KLQkobWRfYXBwbHlfZml4XzIpOiBGb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgZG9uJ3QgcHV0IHRoZQotCWFkZGVuZCBpbnRvIHRoZSBkYXRhLgotCSh0Y19nZW5fcmVsb2MpOiBEaWZmZXJlbnQgYWRkZW5kIGNvbXB1dGF0aW9uIGZvciBPQkpfRUxGLgotCShtNjhrX2lwKTogRG9uJ3QgcmVsYXggYW4gb3BlcmFuZCB0aGF0IHJlcXVpcmVzIHBpYyByZWxvY2F0aW9uLgotCShtZF9iZWdpbik6IEFsaWduIC50ZXh0LCAuZGF0YSBhbmQgLmJzcyBvbiA0IGJ5dGUgYm91bmRhcnkgYnkKLQlkZWZhdWx0LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkZCBzeW1ib2wgdmFsdWUgdG8gYWRkZW5kIGlmCi0gCVRDX002OEsgYW5kIE9CSl9FTEYuCi0JKiBjb25maWcvbTY4ay1wYXJzZS55ICh5eWxleCk6IEhhbmRsZSBAUExUUEMsIGV0Yy4KLQkobW90b3JvbGFfb3BlcmFuZCk6IEFkZCBydWxlIGZvciBgKHphcGMsIEVYUFIpJy4KLQotTW9uIEZlYiAxMiAxMDowNzozMyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IEZpeGVkIHNvIHRoYXQgd2hpdGVzcGFjZQotCSpyZWFsbHkqIGlzIHBlcm1pc3NpYmxlIGJlZm9yZSB0aGUgY29tbWEuCi0KLU1vbiBGZWIgMTIgMDA6MTI6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBBbGlnbiB0byBhIDIgYnl0ZSBib3VuZGFyeSBiZWZvcmUKLQlpbnNlcnRpbmcgbm9wIGluc3RydWN0aW9ucy4KLQotRnJpIEZlYiAgOSAxMDo1NDoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1hdXguaDogQ2hhbmdlIGluY2x1ZGUgb2YgYXV4LmggdG8gYXV4LWNvZmYuaC4KLQotVGh1IEZlYiAgOCAyMDowMjo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IENvcnJlY3Qgc3RvcmFnZQotCWNsYXNzIHNldHRpbmcgZm9yIGEgQ0FMTE5BTUUgc3ltYm9sIGluIENPRkYuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFBhc3MgbmVnYXRpdmUgbnVtYmVycyBmb3IgbmV3IC5iYWxpZ25bd2xdIGFuZAotCS5wMmFsaWduW3dsXSBwc2V1ZG8tb3BzLgotCShzX2FsaWduX2J5dGVzKTogVHJlYXQgYSBuZWdhdGl2ZSBhcmd1bWVudCBhcyBzcGVjaWZ5aW5nIHRoZSBmaWxsCi0JbGVuZ3RoLgotCShzX2FsaWduX3B0d28pOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgNyAxNDoxMjowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBiYWxpZ253LCBiYWxpZ25sLCBwMmFsaWdudywgYW5kIHAyYWxpZ25sLgotCShkb19hbGlnbik6IFRha2UgbmV3IGxlbiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBQYXNzIGl0Ci0JdG8gbWRfZG9fYWxpZ24uCi0JKHNfYWxpZ25fYnl0ZXMpOiBBcmcgbm93IGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxsIHBhdHRlcm4uCi0JKHNfYWxpZ25fcHR3byk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogUGFzcyBsZW5ndGggdG8KLQltZF9kb19hbGlnbi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduKTogVGFrZSBuZXcgbGVuIHBhcmFtZXRlci4KLQkqIGNvbmZpZy90Yy1tODhrLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBwc2V1ZG8tb3BzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfbWRlcHMpOiBEaXZpZGUgb2Zmc2V0IGJ5IGZyX3ZhciwgYXMgaXMKLQlkb25lIGluIGN2dF9mcmFnX3RvX2ZpbGwuCi0KLQkqIGNvbmZpZy90Yy1zaC5oIChzaF9kb19hbGlnbik6IERlY2xhcmUuCi0JKG1kX2RvX2FsaWduKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9saW5lbm8pOiBEb24ndCB0cnkgdG8gc3RvcmUgdGhlIGFkZHJlc3MKLQlkaWZmZXJlbmNlIGlmIHRoZSBuZXh0IGFkZHJlc3MgaXMgYmVmb3JlIHRoZSBjdXJyZW50IG9uZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IG02OGtfY3B1KTogQWRkIGFsaWFzIGZpZWxkLgotCShhcmNocyk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCShtNjhrX2lwKTogRG9uJ3QgbGlzdCBhbGlhcyBuYW1lcyB3aGVuIGxpc3RpbmcgQ1BVcyB3aGljaCBzdXBwb3J0Ci0JYW4gaW5zdHJ1Y3Rpb24uCi0KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHBhcnNlX2FyZ3MgYmVmb3JlIHJlYWRfYmVnaW4uCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJZiBmbGFnX202OGtfbXJpLCBkb24ndCBwdXQgYSBkb3QgaW4KLQlmcm9udCBvZiBnZW5lcmF0ZWQgcHNldWRvLW9wcy4KLQkqIHJlYWQuYyAocG90YWJsZSk6IElnbm9yZSAibmFtZSIuCi0JKHNfYXBwX2ZpbGUpOiBQZXJtaXQgYSBzaW5nbGUgcXVvdGUgYWZ0ZXIgdGhlIHN0cmluZywgc2luY2Ugb25lCi0JbWF5IGFwcGVhciBpbiBtNjhrIE1SSSBtb2RlLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAtLWVuYWJsZS1zaGFyZWQuICBJZiBsaW5raW5nIGFnYWluc3QKLQlzaGFyZWQgQkZEIGFuZCBvcGNvZGVzLCBmaXggbGlicmFyeSBuYW1lIG9uIFN1bk9TLCBhbmQgdHJ5IHRvIHNldAotCS1ycGF0aCByZWFzb25hYmx5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRmViICA2IDE1OjE2OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZmxhZ19tNjhrX21yaSk6IERlY2xhcmUuCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogSWYgVENfTTY4Sywgc2V0IGZsYWdfbTY4a19tcmkgZm9yIC1NLgotCSogTWFueSBmaWxlczogRm9yIE1SSSBzeW50YXggdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgbTY4ayBNUkkKLQlhc3NlbWJsZXIsIGNoZWNrIGZsYWdfbTY4a19tcmkgcmF0aGVyIHRoYW4gZmxhZ19tcmkgb3IKLQlNUklfTU9ERV9ORUVEU19QU0VVRE9fRE9ULgotCi1Nb24gRmViICA1IDE2OjI5OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAoQVJDSF9IWCk6IERlZmluZS4KLQkoYXJjaF90YWIpOiBBZGQgSFguCi0JKHRhcmdfaGFzX3Nmcik6IEhhbmRsZSBBUkNIX0hYLgotCSh0YXJnX2hhc19pY2xhc3MpOiBIYW5kbGUgQVJDSF9IWC4KLQkodGNfY29mZl9maXgycnR5cGUpOiBBZGQgcmV0dXJuIDAgdG8gYXZvaWQgd2FybmluZy4KLQkodGNfaGVhZGVyc19ob29rKTogSWYgdGhlIGFyY2hpdGVjdHVyZSB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHksCi0JdXNlIGl0IHdoZW4gc2V0dGluZyB0aGUgZmxhZ3MuICBTZXQgdGhlIGV4dGVybiB2YXJpYWJsZSBjb2ZmX2ZsYWdzCi0JcmF0aGVyIHRoYW4gaGVhZGVycy0+ZmlsZWhkci5mX2ZsYWdzLCBzaW5jZSB0aGUgbGF0dGVyIGlzIHNldAotCXVuY29uZGl0aW9uYWxseSBpbiBvYmotY29mZi5jLgotCShpOTYwX2hhbmRsZV9hbGlnbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgZml4cC4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGJmZCBhbmQgb3Bjb2RlcyBhcyBzaGFyZWQgbGlicmFyaWVzLCBiYXNlZCBvbgotCXBhdGNoZXMgZnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IFNldCBPUENPREVTIGFuZCBCRkQgdG8gc2VhcmNoIGRpcmVjdG9yaWVzLgotCVN1YnN0aXR1dGUgT1BDT0RFU19ERVAgYW5kIEJGRERFUC4gIE9uIFN1bk9TLCBzZXQgSExERkxBR1MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoTERGTEFHUywgSExERkxBR1MpOiBOZXcgdmFyaWFibGVzLgotCShMSUJERVBTKTogTmV3IHZhcmlhYmxlLgotCShhcy5uZXcwOiBEZXBlbmQgdXBvbiAkKExJQkRFUFMpIHJhdGhlciB0aGFuICQoTElCUykuICBVc2UKLQkkKEhMREZMQUdTKSBpbiBsaW5rLgotCShjaGVjayk6IFNldCBMRF9MSUJSQVJZX1BBVEggaW4gdGhlIGVudmlyb25tZW50LgotCi1GcmkgRmViICAyIDE3OjQxOjUzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBNYWtlIC5zZGF0YTIsIC5zYnNzMiwKLQkuUFBDLkVNQi5zZGF0YTAsIGFuZCAuUFBDLkVNQi5zYnNzMCBzZWN0aW9ucyBhbGwgZGVmYXVsdCB0bwotCXJlYWQtb25seSwgbm90IHJlYWQvd3JpdGUuCi0KLUZyaSBGZWIgIDIgMTQ6MDk6MjUgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9YRk9STSk6IFJlbW92ZSAtZS4KLQotRnJpIEZlYiAgMiAxMjozMjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IFVzZSBTX0lTX0RFRklORUQgYW5kIFNfSVNfQ09NTU9OIHJhdGhlcgotCXRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8gdW5kZWZpbmVkX3NlY3Rpb24uCi0JKHdyaXRlX29iamVjdF9maWxlKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbgotCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFVzZSBTX0lTX0RFRklORUQgYW5kCi0JU19JU19DT01NT04gcmF0aGVyIHRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8KLQl1bmRlZmluZWRfc2VjdGlvbi4KLQkoU19HRVRfVkFMVUUpOiBMaWtld2lzZS4gIEF2b2lkIHJlY3Vyc2lvbiBwcm9ibGVtcyBpZiBTX0lTX0RFRklORUQKLQlvciBTX0lTX0NPTU1PTiBjYWxsIFNfR0VUX1ZBTFVFLgotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfQ09NTU9OKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogSWYgYSByZWxvYyBpcyBlcXVhdGVkCi0JdG8gYW4gdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wsIGNvbnZlcnQgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QKLQl0aGUgdGFyZ2V0IHN5bWJvbC4KLQkob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4KLQl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0NPTU1PTik6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotYm91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IElmIGEgcmVsb2MgaXMgZXF1YXRlZAotCXRvIGFuIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLCBjb252ZXJ0IHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0Ci0JdGhlIHRhcmdldCBzeW1ib2wuCi0JKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFVzZSBTX0lTX0RFRklORUQgYW5kCi0JU19JU19DT01NT04gcmF0aGVyIHRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8KLQl1bmRlZmluZWRfc2VjdGlvbi4KLQkoeWFua19zeW1ib2xzKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbiB1bmRlZmluZWQgb3IKLQljb21tb24gc3ltYm9sLgotCi1UaHUgRmViICAxIDE1OjM0OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCi0JKiBjb25maWd1cmUuaW46IE1ha2Ugc3VyZSB3ZSBvbmx5IGFkZCBtNjhrLXBhcnNlLm8gdG8KLQkke2V4dHJhX29iamVjdHN9IG9uY2UsIG5vIG1hdHRlciBob3cgbWFueSBtNjhrIHRhcmdldHMgaGF2ZSBiZWVuCi0JZW5hYmxlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAzMSAxODozMTo0NiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1jeWd3aW4zMiwgcHBjLSotY3lnd2luMzIpOiBOZXcuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMzEgMTQ6MDM6MTcgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiZXh0ZW5kIiBhbmQgImxkb3VibGUiLgotCSogZG9jL2MtbTY4ay50ZXhpOiBEb2N1bWVudCAuZXh0ZW5kIGFuZCAubGRvdWJsZS4KLQotCSogY29uZmlndXJlLmluIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RlLWF1eC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb21wYXJlX2V4dGVybmFsX3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24KLQlpZiBURV9BVVguCi0JKGRvX3JlbG9jc19mb3IpOiBTb3J0IHJlbG9jcyBpZiBURV9BVVguCi0JKGZpeHVwX3NlZ21lbnQpOiBJZiBURV9BVVgsIHN0b3JlIGNvbW1vbiBzeW1ib2wgdmFsdWUgaW4gc2VnbWVudC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgaWYgVEVfQVVYLgotCi1XZWQgSmFuIDMxIDEyOjI0OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfbWlwc19nbG9ibCk6IFNldCBCU0ZfT0JKRUNUIGlmIGl0IGlzIG5vdAotCUJTRl9GVU5DVElPTi4KLQkoc19jcGxvYWQpOiBTZXQgQlNGX09CSkVDVCBmb3IgX2dwX2Rpc3Agc3ltYm9sLgotCSogcmVhZC5jIChzX2xjb21tKTogSWYgU19TRVRfU0laRSBpcyBkZWZpbmVkLCBzZXQgdGhlIHNpemUgb2YgdGhlCi0Jc3ltYm9sLgotCSogZWNvZmYuYyAoYWRkX3Byb2NlZHVyZSk6IFNldCB0aGUgQlNGX0ZVTkNUSU9OIGZsYWcuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBJZiBTX1NFVF9TSVpFIGlzIGRlZmluZWQsIHNldCB0aGUgc2l6ZSBvZgotCWFuIHVuZGVmaW5lZCBzeW1ib2wgYW5kIHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gc3ltYm9sLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogSWYgVENfTUlQUywgc2V0IEJTRl9PQkpFQ1QKLQlmb3IgYWxsIGNvbW1vbiBzeW1ib2xzLgotCi1UdWUgSmFuIDMwIDEyOjM1OjI0IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChwYXJzZV9tZW1vcCk6IEluIE1SSSBtb2RlLCBkb24ndCB1c2UgaW1wbGljaXQKLQlzY2FsaW5nIG9mIGluZGV4LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBBY2NlcHQgMHggaGV4IGNvbnN0YW50cyBpbiBNUkkgbW9kZSBpZiBub3Qgb24KLQltNjhrLgotCi1Nb24gSmFuIDI5IDEyOjIxOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl90eXBlKTogU2V0IEJTRl9PQkpFQ1QgZmxhZyBmb3IgYSB0eXBlCi0Jb2Ygb2JqZWN0LiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi0JKiBlY29mZi5jIChsb2NhbHN5bV90KTogQWRkIGFkZGVuZCBmaWVsZC4KLQkoYWRkX2Vjb2ZmX3N5bWJvbCk6IEFkZCBhZGRlbmQgYXJndW1lbnQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvZmZfc3ltX3ZhbHVlKTogTWFrZSBzdGF0aWMuCi0JKGNvZmZfc3ltX2FkZGVuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9kZWYpOiBJbml0aWFsaXplIGNvZmZfc3ltX2FkZGVuZC4KLQkoZWNvZmZfZGlyZWN0aXZlX3ZhbCk6IEFjY2VwdCBzeW1ib2wgKyBjb25zdGFudC4KLQkoZWNvZmZfZGlyZWN0aXZlX2VuZGVmKTogUGFzcyBjb2ZmX3N5bV9hZGRlbmQgdG8gYWRkX2Vjb2ZmX3N5bWJvbC4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEluY2x1ZGUgdGhlIGFkZGVuZCBpbiB0aGUgc3ltYm9sIHZhbHVlLgotCi1GcmkgSmFuIDI2IDE5OjI4OjUyIDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogSWdub3JlIG92ZXJmbG93IG9uIAotCUJGRF9SRUxPQ18xNl9HT1RPRkYgYW5kIEJGRF9SRUxPQ19QUENfVE9DMTYuCi0KLUZyaSBKYW4gMjYgMTY6MTQ6MTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBTREEyMSByZWxvY2F0aW9ucyBhcmUgbm93IDQKLQlieXRlcyBpbiBzaXplLCBzbyBvZmZzZXQgYXBwcm9wcmlhdGVseSBpbiBiaWcgZW5kaWFuIG1vZGUgd2hlbgotCXdyaXRpbmcgdGhlIGJvdHRvbSAyIGJ5dGVzLgotCi1UaHUgSmFuIDI1IDIwOjI2OjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoZGVmYXVsdF9jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIGl0LiAgUmV3cml0ZSB3YXJuX29uX2J1bXAgaGFuZGxpbmcuCi0JKHNwYXJjX2lwKTogSWYgbm8gYXJjaGl0ZWN0dXJlIG9yIC1idW1wIHNwZWNpZmllZCwgZG9uJ3QgbWFyayBhcwotCW1pc21hdGNoZWQgdGhvc2UgaW4gZGVmYXVsdF9jb21wYXRpYmxlLgotCi1UaHUgSmFuIDI1IDEyOjIxOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNDTyBFTEYgc3VwcG9ydCBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1zY28qZWxmKik6IFVzZSBmbXQgZWxmLCB0YXJnIHNjbzUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvc2NvNS5tdDogTmV3IGZpbGU7IHNldCBUREVGSU5FUyB0byAtRFNDT19FTEYuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzY29faWQpOiBOZXcgZnVuY3Rpb24sIGlmIFNDT19FTEYuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEZWZpbmUgaWYgU0NPX0VMRi4KLQkoc2NvX2lkKTogRGVjbGFyZSBpZiBTQ09fRUxGLgotCi1UaHUgSmFuIDI1IDAzOjEwOjUzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoaW5pdGlhbF9hcmNoaXRlY3R1cmUsY2FuX2J1bXBfdjlfcCk6IERlbGV0ZWQuCi0JKHttYXgsd2Fybl9hZnRlcn1fYXJjaGl0ZWN0dXJlKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKG1kX2JlZ2luKTogUmVwbGFjZSBOVU1PUENPREVTIHdpdGggc3BhcmNfbnVtX29wY29kZXMuCi0JSWYgYm90aCBhcmNoaXRlY3R1cmUgYW5kIC1idW1wIHJlcXVlc3RlZCwgc2V0IG1heF9hcmNoaXRlY3R1cmUgdG8gbWF4LgotCShzcGFyY19tZF9lbmQpOiBTaW1wbGlmeS4KLQkoc3BhcmNfaXApOiBSZXBsYWNlIHJlZmVyZW5jZXMgdG8gY2FuX2J1bXBfdjlfcCB3aXRoIG1heF9hcmNoaXRlY3R1cmUuCi0JUmV3cml0ZSBjb2RlIHRvIGJ1bXAgYXJjaGl0ZWN0dXJlIGFuZCBjaGVjayBmb3IgY29uZmxpY3RzLgotCShtZF9sb25nb3B0cyk6IFJlY29nbml6ZSAteGFyY2g9e3Y4cGx1cyx2OHBsdXNhfSBmb3IgY29tcGF0aWJpbGl0eQotCXdpdGggU29sYXJpcyBhc3NlbWJsZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLiAgQ2FsbCBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2guCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUuCi0KLVdlZCBKYW4gMjQgMjI6MTE6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogRml4IHJlZmVyZW5jZSB0byAkJHtzcmNkaXJ9LgotCi1Nb24gSmFuIDIyIDA5OjIxOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSAjaWZkZWYgU1BBUkNfQVJDSDY0IGluc3RlYWQgb2YKLQkjaWZkZWYgc3BhcmN2OSB3aGVuIGNob29zaW5nIHZhbHVlLgotCShFTlY2NCk6IERlbGV0ZS4KLQkobWRfZW5kKTogRGVmaW5lLgotCShzcGFyY19tZF9lbmQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKFNQQVJDX1Y5KTogUmVuYW1lZCBmcm9tIHNwYXJjdjkuCi0JKGluaXRpYWxfYXJjaGl0ZWN0dXJlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoY2FuX2J1bXBfdjlfcCk6IExpa2V3aXNlLgotCShOT19WOSk6IERlbGV0ZSBhbGwgb2NjdXJyZW5jZXMuCi0JKHNwYXJjX21kX2VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBOZXcgbG9jYWwgdjlfYXJnX3AuICBSZXdvcmsgZnAgcmVnIG51bWJlciB0ZXN0LgotCURvbid0IGJ1bXAgYXJjaGl0ZWN0dXJlIHRvIHY5IHVubGVzcyBjYW5fYnVtcF92OV9wIHNldC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogLUE8YXJjaD4gcGFzc2VkLCBzZXQgY2FuX2J1bXBfdjlfcCBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmM2NCB0YXJnZXQgY3B1KTogRG9uJ3Qgc2V0IG9ial9mb3JtYXQgaGVyZS4KLQkoU1BBUkNfVjkpOiBSZW5hbWVkIGZyb20gc3BhcmN2OS4KLQkoc3BhcmM2NC0qLWVsZiopOiBEZWZpbmUgU1BBUkNfQVJDSDY0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGFjY29uZmlnLmggKFNQQVJDX1Y5KTogUmVuYW1lZCBmcm9tIHNwYXJjdjkuCi0JKFNQQVJDX0FSQ0g2NCk6IEFkZC4KLQkqIGNvbmYuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnL3Ztc2NvbmYuaDogVXBkYXRlLgotCi1Nb24gSmFuIDIyIDE3OjI0OjQ3IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IE9wdGltaXNlICJkbGkiIGxvYWRzLgotCShtZF9zaG93X3VzYWdlKTogYWRkICItbWNwdT12cjQxMDAiIHRvIGhlbHAgdGV4dC4KLQotTW9uIEphbiAyMiAxMTo1MzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJZiBhIHN5bWJvbCBpcyBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCwgcHJlc2VydmUgdGhlIFhfb3Agb2YgT19zeW1ib2wuCi0JKFNfR0VUX1ZBTFVFKTogRml4IGNoZWNrIHRvIHBlcm1pdCB0aGlzIGNhc2UuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJZiBhIHJlbG9jIGlzIGFnYWluc3QgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wsIGNoYW5nZSB0aGUgcmVsb2MgdG8gYmUgYWdhaW5zdAotCXRoZSBsYXR0ZXIgc3ltYm9sLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfY3NlY3QpOiBBbiB1bm5hbWVkIGNzZWN0IGlzIHN0b3JhZ2UgY2xhc3MKLQlYTUNfUFIuCi0KLU1vbiBKYW4gMjIgMTA6NTk6NDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGYvcHBjLmgpOiBJbmNsdWRlIGVsZi9wcGMuaCBpZiB0YXJnZXQKLQljb21wdXRlciBpcyBQb3dlclBDLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgbW9yZSBlbWJlZGRlZCByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLXBwYy5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IEFkZCBzZWN0aW9ucwotCW1lbnRpb25lZCBpbiB0aGUgZWFiaS4KLQotVGh1IEphbiAxOCAxNzo1ODoxOSAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcmVsZGF0YSk6IENoYW5nZWQgYWxpZ25lbWVudCBvbiByZWxkYXRhX3NlY3Rpb24KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3BkYXRhKTogQ2hhbmdlZCB0aGUgYWxpZ25tZW50IG9uIHBkYXRhX3NlY3Rpb24KLQotTW9uIEphbiAxNSAxNzo0Mzo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWFwcGluZyk6IEFkZCBtb3JlIHJlbG9jYXRpb24gc3VmZml4ZXMuCi0KLVN1biBKYW4gMTQgMjE6Mjk6MzYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgLmdjY19leGNlcHRfdGFibGUKLQlhcyBhIHNlY3Rpb24gaXQgaXMgb2sgdG8gaGF2ZSB1bmFkb3JuZWQgLW1yZWxvY2F0YWJsZSBwb2ludGVycyBpbi4KLQotU2F0IEphbiAxMyAxMTowOTowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NlY3Rpb24qKTogV3JhcCB0aGVzZSBmdW5jdGlvbnMgaW5zaWRlCi0JI2lmZGVmIE9CSl9FTEYuCi0KLUZyaSBKYW4gMTIgMTU6MzI6MDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBZGQgaG9va3Mgc28gbWFjaGluZQotCWRlcGVuZGVudCBzZWN0aW9uIGF0dHJpYnV0ZXMgY2FuIGJlIGhhbmRsZWQuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaDogKG1kX2VsZl9zZWN0aW9uX3tsZXR0ZXIsdHlwZSx3b3JkLGZsYWdzfSk6IE5ldwotCW1hY3JvcyB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkZSBzZWN0aW9uIGZsYWcgYW5kIG9yZGVyZWQgc2VjdGlvbgotCXR5cGUuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zZWN0aW9uX3tsZXR0ZXIsdHlwZSx3b3JkLGZsYWdzfSk6IE5ldwotCWZ1bmN0aW9ucyB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkZSBzZWN0aW9uIGZsYWcgYW5kIG9yZGVyZWQKLQlzZWN0aW9uIHR5cGUuCi0KLUZyaSBKYW4gMTIgMTI6MDQ6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogRG9uJ3QgdHJ5IHRvIGxvb2sgdXAgdGhlIHNlY3Rpb24KLQlzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaGF2ZSBhIHN5bWJvbAotCXdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIHNlY3Rpb24sIGJ1dCBubyBjb25uZWN0aW9uIHRvIGl0LgotCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogT25seSBjYWxsIG1yaV9jb21tZW50X2VuZCBmcm9tIGZsYWdfbXJpLgotCUZyb20gSmFtZXMgQ2FybHNvbiA8Y2FybHNvbkB4eWxvZ2ljcy5jb20+LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBTa2lwIHdoaXRlc3BhY2UgYWZ0ZXIgYSBjbG9zZSBwYXJlbnRoZXNpcy4KLQlGcm9tIEphbWVzIENhcmxzb24gPGNhcmxzb25AeHlsb2dpY3MuY29tPi4KLQotVHVlIEphbiAgMiAxMjo0MzoyMyAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBDYWxsIGFzX2JhZF93aGVyZSBpbnN0ZWFkIG9mCi0JYXNfd2Fybl93aGVyZSBmb3IgcmVsb2NhdGlvbiBvdmVyZmxvdy4KLQkocGFyc2VfcmVnKTogQWNjZXB0IHJlZ2lzdGVyIG5hbWUgb25seSBpZiBuZXh0IGNoYXJhY3RlciBpcwotCW5vdCBhbHBoYW51bWVyaWMuCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTI5NQpkaWZmIC0tZ2l0IGEvZ2FzL01ha2VmaWxlLmFtIGIvZ2FzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ1YjlkLi4wMDAwMDAwCi0tLSBhL2dhcy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDE3MDkgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi0jIyBXb3JrIGFyb3VuZCBhcHBhcmVudCBhdXRvbWFrZSBidWcuCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBkb2MgcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXSA7IHRoZW4gZWNobyAuLi9iaXNvbi9iaXNvbiAteSAtTC4uL2Jpc29uL2Jpc29uIDsgZWxzZSBlY2hvIGJpc29uIC15IDsgZmlgCi1MRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXSA7IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXggOyAgZWxzZSBlY2hvIGZsZXggOyBmaWAKLQotREVQID0gJChzcmNkaXIpLy4uL21rZGVwCi0KLVRBUkdfQ1BVID0gQHRhcmdldF9jcHVfdHlwZUAKLVRBUkdfQ1BVX0MgPSAkKHNyY2RpcikvY29uZmlnL3RjLUB0YXJnZXRfY3B1X3R5cGVALmMKLVRBUkdfQ1BVX08gPSB0Yy1AdGFyZ2V0X2NwdV90eXBlQC5vCi1UQVJHX0NQVV9IID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5oCi1PQkpfRk9STUFUX0MgPSAkKHNyY2RpcikvY29uZmlnL29iai1Ab2JqX2Zvcm1hdEAuYwotT0JKX0ZPUk1BVF9PID0gb2JqLUBvYmpfZm9ybWF0QC5vCi1PQkpfRk9STUFUX0ggPSAkKHNyY2RpcikvY29uZmlnL29iai1Ab2JqX2Zvcm1hdEAuaAotVEFSR19FTlZfSCA9ICQoc3JjZGlyKS9jb25maWcvdGUtQHRlX2ZpbGVALmgKLUFUT0ZfVEFSR19DID0gJChzcmNkaXIpL2NvbmZpZy9hdG9mLUBhdG9mQC5jCi1BVE9GX1RBUkdfTyA9IGF0b2YtQGF0b2ZALm8KLQotIyB1c2UgQHRhcmdldF9jcHVfdHlwZUAgZm9yIHJlZmVyaW5nIHRvIGNvbmZpZ3VyZWQgdGFyZ2V0IG5hbWUKLUlUX0hEUlM9aXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAotSVRfU1JDUz1pdGJsLXBhcnNlLmMgaXRibC1sZXguYyAkKHNyY2RpcikvaXRibC1vcHMuYwotSVRfREVQUz0kKHNyY2RpcikvaXRibC1wYXJzZS55ICQoc3JjZGlyKS9pdGJsLWxleC5sICQoc3JjZGlyKS9jb25maWcvaXRibC1AdGFyZ2V0X2NwdV90eXBlQC5oCi1JVF9PQkpTPWl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KLQotIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQotQ1BVX1RZUEVTID0gXAotCWEyOWsgXAotCWFscGhhIFwKLQlhcmMgXAotCWFybSBcCi0JZDEwdiBcCi0JZDMwdiBcCi0JZnIzMCBcCi0JaDgzMDAgXAotCWg4NTAwIFwKLQlocHBhIFwKLQlpMzg2IFwKLQlpODYwIFwKLQlpOTYwIFwKLQltMzJyIFwKLQltNjhrIFwKLQltODhrIFwKLQltY29yZSBcCi0JbWlwcyBcCi0JbW4xMDIwMCBcCi0JbW4xMDMwMCBcCi0JbnMzMmsgXAotCXBwYyBcCi0Jc2ggXAotCXNwYXJjIFwKLQl0YWhvZSBcCi0JdGljMzAgXAotCXRpYzgwIFwKLQl2YXggXAotCXc2NSBcCi0Jdjg1MCBcCi0JejhrCi0KLSMgT2JqZWN0IGZvcm1hdCB0eXBlcy4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgotIyBXZSBkZWxpYmVyYXRlbHkgb21pdCBzb20sIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgYXMgYSBjcm9zcyBhc3NlbWJsZXIuCi0KLU9CSl9GT1JNQVRTID0gXAotCWFvdXQgXAotCWJvdXQgXAotCWNvZmYgXAotCWVjb2ZmIFwKLQllbGYgXAotCWV2YXggXAotCWhwMzAwIFwKLQlpZWVlIFwKLQl2bXMKLQotIyBUaGlzIGlzIGFuIHNoIGNhc2Ugd2hpY2ggc2V0cyB2YWxpZCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgQ1BVCi0jIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIGMgYW5kIHRoZSBPUyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBvCi0jIGFyZSBzdXBwb3J0ZWQuICBUaGlzIGhlbHBzIGN1dHMgZG93biBvbiB0aGUgYW1vdW50IG9mIGRlcGVuZGVuY3kKLSMgaW5mb3JtYXRpb24uCi0KLUNQVV9PQkpfVkFMSUQgPSBcCi0JdmFsaWQ9IDsgXAotCWNhc2UgJCRvIGluIFwKLQlhb3V0KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBhMjlrIHwgYXJtIHwgaTM4NiB8IGk4NjAgfCBtNjhrIHwgbWlwcyB8IG5zMzJrIHwgc3BhcmMgfCB0YWhvZSB8IHRpYzMwIHwgdmF4KSBcCi0JICAgIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQlib3V0KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBpOTYwKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JY29mZikgdmFsaWQ9eWVzIDs7IFwKLQllY29mZikgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgbWlwcyB8IGFscGhhKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JZWxmKSB2YWxpZD15ZXMgOzsgXAotCWV2YXgpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGFscGhhKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JaHAzMDApIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIG02OGspIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQl2bXMpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIHZheCkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWVzYWM7Ci0KLSMgVGhpcyBpcyBsaWtlIENQVV9PQkpfVkFMSUQsIGZvciB0aGUgb2JqPW11bHRpIGNhc2UuCi0KLUNQVV9NVUxUSV9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJGMgaW4gXAotCWkzODYgfCBtaXBzKSB2YWxpZD15ZXMgOzsgXAotCWVzYWM7Ci0KLSMgUmVndWxhciBzb3VyY2UgZmlsZXMuCi0KLUdBU19DRklMRVMgPSBcCi0JYXBwLmMgXAotCWFzLmMgXAotCWF0b2YtZ2VuZXJpYy5jIFwKLQliaWdudW0tY29weS5jIFwKLQljb25kLmMgXAotCWRlcGVuZC5jIFwKLQlkd2FyZjJkYmcuYyBcCi0JZWNvZmYuYyBcCi0JZWhvcHQuYyBcCi0JZXhwci5jIFwKLQlmbG9udW0tY29weS5jIFwKLQlmbG9udW0ta29uc3QuYyBcCi0JZmxvbnVtLW11bHQuYyBcCi0JZnJhZ3MuYyBcCi0JaGFzaC5jIFwKLQlpbnB1dC1maWxlLmMgXAotCWlucHV0LXNjcnViLmMgXAotCWxpc3RpbmcuYyBcCi0JbGl0ZXJhbC5jIFwKLQltYWNyby5jIFwKLQltZXNzYWdlcy5jIFwKLQlvdXRwdXQtZmlsZS5jIFwKLQlyZWFkLmMgXAotCXNiLmMgXAotCXN0YWJzLmMgXAotCXN1YnNlZ3MuYyBcCi0Jc3ltYm9scy5jIFwKLQl3cml0ZS5jCi0KLUNGSUxFUyA9ICQoR0FTX0NGSUxFUykgZ2FzcC5jIGl0Ymwtb3BzLmMKLQotSEZJTEVTID0gXAotCWFzLmggXAotCWFzaW50bC5oIFwKLQliaWdudW0uaCBcCi0JYml0X2ZpeC5oIFwKLQljZ2VuLmggXAotCWR3YXJmMmRiZy5oIFwKLQllY29mZi5oIFwKLQllbXVsLXRhcmdldC5oIFwKLQllbXVsLmggXAotCWV4cHIuaCBcCi0JZmxvbnVtLmggXAotCWZyYWdzLmggXAotCWhhc2guaCBcCi0JaW5wdXQtZmlsZS5oIFwKLQlpdGJsLW9wcy5oIFwKLQlsaXN0aW5nLmggXAotCW1hY3JvLmggXAotCW9iai5oIFwKLQlvdXRwdXQtZmlsZS5oIFwKLQlyZWFkLmggXAotCXNiLmggXAotCXN0cnVjLXN5bWJvbC5oIFwKLQlzdWJzZWdzLmggXAotCXN5bWJvbHMuaCBcCi0JdGMuaCBcCi0Jd3JpdGUuaAotCi0jIENQVSBmaWxlcyBpbiBjb25maWcuCi0KLVRBUkdFVF9DUFVfQ0ZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmMgXAotCWNvbmZpZy90Yy1hbHBoYS5jIFwKLQljb25maWcvdGMtYXJjLmMgXAotCWNvbmZpZy90Yy1hcm0uYyBcCi0JY29uZmlnL3RjLWQxMHYuYyBcCi0JY29uZmlnL3RjLWQzMHYuYyBcCi0JY29uZmlnL3RjLWZyMzAuYyBcCi0JY29uZmlnL3RjLWg4MzAwLmMgXAotCWNvbmZpZy90Yy1oODUwMC5jIFwKLQljb25maWcvdGMtaHBwYS5jIFwKLQljb25maWcvdGMtaTM4Ni5jIFwKLQljb25maWcvdGMtaTg2MC5jIFwKLQljb25maWcvdGMtaTk2MC5jIFwKLQljb25maWcvdGMtbTMyci5jIFwKLQljb25maWcvdGMtbTY4ay5jIFwKLQljb25maWcvdGMtbTg4ay5jIFwKLQljb25maWcvdGMtbWNvcmUuYyBcCi0JY29uZmlnL3RjLW1pcHMuYyBcCi0JY29uZmlnL3RjLW1uMTAyMDAuYyBcCi0JY29uZmlnL3RjLW1uMTAzMDAuYyBcCi0JY29uZmlnL3RjLW5zMzJrLmMgXAotCWNvbmZpZy90Yy1wcGMuYyBcCi0JY29uZmlnL3RjLXNoLmMgXAotCWNvbmZpZy90Yy1zcGFyYy5jIFwKLQljb25maWcvdGMtdGFob2UuYyBcCi0JY29uZmlnL3RjLXRpYzMwLmMgXAotCWNvbmZpZy90Yy10aWM4MC5jIFwKLQljb25maWcvdGMtdmF4LmMgXAotCWNvbmZpZy90Yy13NjUuYyBcCi0JY29uZmlnL3RjLXY4NTAuYyBcCi0JY29uZmlnL3RjLXo4ay5jCi0KLVRBUkdFVF9DUFVfSEZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmggXAotCWNvbmZpZy90Yy1hbHBoYS5oIFwKLQljb25maWcvdGMtYXJjLmggXAotCWNvbmZpZy90Yy1hcm0uaCBcCi0JY29uZmlnL3RjLWQxMHYuaCBcCi0JY29uZmlnL3RjLWQzMHYuaCBcCi0JY29uZmlnL3RjLWZyMzAuaCBcCi0JY29uZmlnL3RjLWg4MzAwLmggXAotCWNvbmZpZy90Yy1oODUwMC5oIFwKLQljb25maWcvdGMtaHBwYS5oIFwKLQljb25maWcvdGMtaTM4Ni5oIFwKLQljb25maWcvdGMtaTg2MC5oIFwKLQljb25maWcvdGMtaTk2MC5oIFwKLQljb25maWcvdGMtbTMyci5oIFwKLQljb25maWcvdGMtbTY4ay5oIFwKLQljb25maWcvdGMtbTg4ay5oIFwKLQljb25maWcvdGMtbWNvcmUuaCBcCi0JY29uZmlnL3RjLW1pcHMuaCBcCi0JY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0JY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0JY29uZmlnL3RjLW5zMzJrLmggXAotCWNvbmZpZy90Yy1wcGMuaCBcCi0JY29uZmlnL3RjLXNoLmggXAotCWNvbmZpZy90Yy1zcGFyYy5oIFwKLQljb25maWcvdGMtdGFob2UuaCBcCi0JY29uZmlnL3RjLXRpYzMwLmggXAotCWNvbmZpZy90Yy10aWM4MC5oIFwKLQljb25maWcvdGMtdmF4LmggXAotCWNvbmZpZy90Yy13NjUuaCBcCi0JY29uZmlnL3RjLXY4NTAuaCBcCi0JY29uZmlnL3RjLXo4ay5oCi0KLSMgT0JKIGZpbGVzIGluIGNvbmZpZwotCi1PQkpfRk9STUFUX0NGSUxFUyA9IFwKLQljb25maWcvb2JqLWFvdXQuYyBcCi0JY29uZmlnL29iai1ib3V0LmMgXAotCWNvbmZpZy9vYmotY29mZi5jIFwKLQljb25maWcvb2JqLWVjb2ZmLmMgXAotCWNvbmZpZy9vYmotZWxmLmMgXAotCWNvbmZpZy9vYmotZXZheC5jIFwKLQljb25maWcvb2JqLWhwMzAwLmMgXAotCWNvbmZpZy9vYmotaWVlZS5jIFwKLQljb25maWcvb2JqLXNvbS5jIFwKLQljb25maWcvb2JqLXZtcy5jCi0KLU9CSl9GT1JNQVRfSEZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5oIFwKLQljb25maWcvb2JqLWJvdXQuaCBcCi0JY29uZmlnL29iai1jb2ZmLmggXAotCWNvbmZpZy9vYmotZWNvZmYuaCBcCi0JY29uZmlnL29iai1lbGYuaCBcCi0JY29uZmlnL29iai1ldmF4LmggXAotCWNvbmZpZy9vYmotaHAzMDAuaCBcCi0JY29uZmlnL29iai1pZWVlLmggXAotCWNvbmZpZy9vYmotc29tLmggXAotCWNvbmZpZy9vYmotdm1zLmgKLQotIyBFbXVsYXRpb24gaGVhZGVyIGZpbGVzIGluIGNvbmZpZwotCi1UQVJHX0VOVl9IRklMRVMgPSBcCi0JY29uZmlnL3RlLTM4NmJzZC5oIFwKLQljb25maWcvdGUtYXV4LmggXAotCWNvbmZpZy90ZS1kZWx0YS5oIFwKLQljb25maWcvdGUtZGVsdDg4LmggXAotCWNvbmZpZy90ZS1kcHgyLmggXAotCWNvbmZpZy90ZS1keW5peC5oIFwKLQljb25maWcvdGUtZXBvYy1wZS5oIFwKLQljb25maWcvdGUtZ2VuZXJpYy5oIFwKLQljb25maWcvdGUtZ28zMi5oIFwKLQljb25maWcvdGUtaHAzMDAuaCBcCi0JY29uZmlnL3RlLWhwcGEuaCBcCi0JY29uZmlnL3RlLWkzODZhaXguaCBcCi0JY29uZmlnL3RlLWljOTYwLmggXAotCWNvbmZpZy90ZS1saW51eC5oIFwKLQljb25maWcvdGUtbG5ld3MuaCBcCi0JY29uZmlnL3RlLWx5bnguaCBcCi0JY29uZmlnL3RlLW1hY2guaCBcCi0JY29uZmlnL3RlLW1hY29zLmggXAotCWNvbmZpZy90ZS1tdWx0aS5oIFwKLQljb25maWcvdGUtbmJzZC5oIFwKLQljb25maWcvdGUtbmJzZDUzMi5oIFwKLQljb25maWcvdGUtcGM1MzJtYWNoLmggXAotCWNvbmZpZy90ZS1wZS5oIFwKLQljb25maWcvdGUtcHBjbncuaCBcCi0JY29uZmlnL3RlLXBzb3MuaCBcCi0JY29uZmlnL3RlLXJpc2NpeC5oIFwKLQljb25maWcvdGUtc3BhcmNhb3V0LmggXAotCWNvbmZpZy90ZS1zdW4zLmggXAotCWNvbmZpZy90ZS1zdnI0LmggXAotCWNvbmZpZy90ZS1zeXN2MzIuaAotCi0jIE11bHRpIGZpbGVzIGluIGNvbmZpZwotCi1NVUxUSV9DRklMRVMgPSBcCi0JY29uZmlnL2UtaTM4NmNvZmYuYyBcCi0JY29uZmlnL2UtaTM4NmVsZi5jIFwKLQljb25maWcvZS1taXBzZWNvZmYuYyBcCi0JY29uZmlnL2UtbWlwc2VsZi5jCi0KLUNPTkZJR19PQkpTID0gXAotCSQoVEFSR19DUFVfTykgXAotCSQoT0JKX0ZPUk1BVF9PKSBcCi0JJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykKLQotR0VORVJJQ19PQkpTID0gXAotCWFwcC5vIFwKLQlhcy5vIFwKLQlhdG9mLWdlbmVyaWMubyBcCi0JYmlnbnVtLWNvcHkubyBcCi0JY29uZC5vIFwKLQlkZXBlbmQubyBcCi0JZHdhcmYyZGJnLm8gXAotCWVob3B0Lm8gXAotCWV4cHIubyBcCi0JZmxvbnVtLWtvbnN0Lm8gXAotCWZsb251bS1jb3B5Lm8gXAotCWZsb251bS1tdWx0Lm8gXAotCWZyYWdzLm8gXAotCWhhc2gubyBcCi0JaW5wdXQtZmlsZS5vIFwKLQlpbnB1dC1zY3J1Yi5vIFwKLQlsaXRlcmFsLm8gXAotCW1lc3NhZ2VzLm8gXAotCW91dHB1dC1maWxlLm8gXAotCXJlYWQubyBcCi0Jc3Vic2Vncy5vIFwKLQlzeW1ib2xzLm8gXAotCXdyaXRlLm8gXAotCWxpc3RpbmcubyBcCi0JZWNvZmYubyBcCi0Jc3RhYnMubyBcCi0Jc2IubyBcCi0JbWFjcm8ubwotCi1PQkpTID0gJChDT05GSUdfT0JKUykgJChHRU5FUklDX09CSlMpCi0KLVBPVEZJTEVTID0gJChNVUxUSV9DRklMRVMpICQoVEFSR0VUX0VOVl9IRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpIFwKLQkkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCi0JJChIRklMRVMpICQoQ0ZJTEVTKSAkKEdBU19DRklMRVMpCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1ub2luc3RfUFJPR1JBTVMgPSBhcy1uZXcgZ2FzcC1uZXcKLW5vaW5zdF9TQ1JJUFRTID0gLmdkYmluaXQKLQotJChzcmNkaXIpL21ha2UtZ2FzLmNvbTogc3RhbXAtbWsuY29tCi1zdGFtcC1tay5jb206IHZtc2NvbmYuc2ggTWFrZWZpbGUKLQlzaCAkKHNyY2Rpcikvdm1zY29uZi5zaCAkKEdFTkVSSUNfT0JKUykgPiBuZXctbWFrZS5jb20KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbmV3LW1ha2UuY29tICQoc3JjZGlyKS9tYWtlLWdhcy5jb20KLQl0b3VjaCBzdGFtcC1tay5jb20KLQotRVhUUkFfRElTVCA9IG1ha2UtZ2FzLmNvbQotCi1ESVNUU1RVRkYgPSBtYWtlLWdhcy5jb20gbTY4ay1wYXJzZS5jIGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggaXRibC1sZXguYwotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIHRhcmctZW52LmggaXRibC1jcHUuaCBjZ2VuLWRlc2MuaAotCi0jIE5vdyBmaWd1cmUgb3V0IGZyb20gdGhvc2UgdmFyaWFibGVzIGhvdyB0byBjb21waWxlIGFuZCBsaW5rLgotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLSMgVGhpcyBpcyB0aGUgdmFyaWFibGUgYWN0dWFsbHkgdXNlZCB3aGVuIHdlIGNvbXBpbGUuCi0jIFNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkIGZvciBoZWFkZXIgZmlsZXMuCi0jIEJvdGggLiBhbmQgc3JjZGlyIGFyZSB1c2VkLCBpbiB0aGF0IG9yZGVyLAotIyBzbyB0aGF0IHRtLmggYW5kIGNvbmZpZy5oIHdpbGwgYmUgZm91bmQgaW4gdGhlIGNvbXBpbGF0aW9uCi0jIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKHNyY2RpcikvY29uZmlnIC1JJChJTkNESVIpIC1JJChzcmNkaXIpLy4uIC1JJChCRkRESVIpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBUaGlzIHNob3VsZCBiZSBwYXJhbGxlbCB0byBJTkNMVURFUywgYnV0IHNob3VsZCByZXBsYWNlICQoc3JjZGlyKQotIyB3aXRoICQke3NyY2Rpcn0sIGFuZCBzaG91bGQgd29yayBpbiBhIHN1YmRpcmVjdG9yeS4gIFRoaXMgaXMgdXNlZAotIyB3aGVuIGJ1aWxkaW5nIGRlcGVuZGVuY2llcywgYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBidWlsZGluZyBpcyBkb25lCi0jIGluIGEgc3ViZGlyZWN0b3J5LgotREVQX0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAtSSQke3NyY2Rpcn0vY29uZmlnIC1JJCR7c3JjZGlyfS8uLi9pbmNsdWRlIC1JJCR7c3JjZGlyfS8uLiAtSSQke3NyY2Rpcn0vLi4vYmZkIC1JJCR7c3JjZGlyfS8uLi9pbnRsIC1JLi4vLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLSMgSG93IHRvIGxpbmsgd2l0aCBib3RoIG91ciBzcGVjaWFsIGxpYnJhcnkgZmFjaWxpdGllcwotIyBhbmQgdGhlIHN5c3RlbSdzIGluc3RhbGxlZCBsaWJyYXJpZXMuCi0KLUdBU0xJQlMgPSBAT1BDT0RFU19MSUJAIEBCRkRMSUJAIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi0jIEZpbGVzIHRvIGJlIGNvcGllZCBhd2F5IGFmdGVyIGVhY2ggc3RhZ2UgaW4gYnVpbGRpbmcuCi1TVEFHRVNUVUZGID0gKi5vICQobm9pbnN0X1BST0dSQU1TKQotCi0kKE9CSlMpOiBAQUxMX09CSl9ERVBTQAotCi1hc19uZXdfU09VUkNFUyA9ICQoR0FTX0NGSUxFUykKLWFzX25ld19MREFERCA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMTElCUykKLWFzX25ld19ERVBFTkRFTkNJRVMgPSAkKFRBUkdfQ1BVX08pICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSBcCi0JJChleHRyYV9vYmplY3RzKSAkKEdBU0xJQlMpICQoSU5UTERFUFMpCi0KLSMgU3R1ZmYgdGhhdCBldmVyeSBvYmplY3QgZmlsZSBkZXBlbmRzIHVwb24uICBJZiBhbnl0aGluZyBpcyByZW1vdmVkCi0jIGZyb20gdGhpcyBsaXN0LCByZW1vdmUgaXQgZnJvbSBkZXAtaW4uc2VkIGFzIHdlbGwuCi0kKE9CSlMpOiBjb25maWcuaCBhcy5oICQoVEFSR19FTlZfSCkgJChPQkpfRk9STUFUX0gpICQoVEFSR19DUFVfSCkgZmxvbnVtLmggXAotCWV4cHIuaCB3cml0ZS5oIGZyYWdzLmggaGFzaC5oIHJlYWQuaCBzeW1ib2xzLmggdGMuaCBcCi0Jb2JqLmggbGlzdGluZy5oIGJpZ251bS5oIGJpdF9maXguaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYXNpbnRsLmgKLQotZ2FzcF9uZXdfU09VUkNFUyA9IGdhc3AuYyBtYWNyby5jIHNiLmMgaGFzaC5jCi1nYXNwX25ld19MREFERCA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExMSUJTKQotZ2FzcF9uZXdfREVQRU5ERU5DSUVTID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi0KLUVYUEVDVCA9IGBpZiBbIC1mICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKLQkgICBmaWAKLVJVTlRFU1RGTEFHUz0KLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlpZiBbIC1kIHRlc3RzdWl0ZSBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbHNlIFwKLQkgIG1rZGlyIHRlc3RzdWl0ZTsgXAotCWZpCi0Jcm0gLWYgdGVzdHN1aXRlL3NpdGUuZXhwCi0JY3Agc2l0ZS5leHAgdGVzdHN1aXRlL3NpdGUuZXhwCi0Jcm9vdG1lPWBwd2RgOyBleHBvcnQgcm9vdG1lOyBcCi0Jc3JjZGlyPWBjZCAke3NyY2Rpcn07IHB3ZGAgOyBleHBvcnQgc3JjZGlyIDsgXAotCUVYUEVDVD0ke0VYUEVDVH0gOyBleHBvcnQgRVhQRUNUIDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWNkIHRlc3RzdWl0ZTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3JjZGlyfS90ZXN0c3VpdGUgXAotCQkkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLSMgVGhlIGltcGxpY2l0IC5jLm8gcnVsZSBkb2Vzbid0IHdvcmsgZm9yIHRoZXNlLCBwZXJoYXBzIGJlY2F1c2Ugb2YKLSMgdGhlIHZhcmlhYmxlcywgb3IgcGVyaGFwcyBiZWNhdXNlIHRoZSBzb3VyY2VzIGFyZSBub3Qgb24gdnBhdGguCi0kKFRBUkdfQ1BVX08pOiAkKFRBUkdfQ1BVX0MpICQoVEFSR19DUFVfREVQX0B0YXJnZXRfY3B1X3R5cGVAKQotCSQoQ09NUElMRSkgLWMgJChUQVJHX0NQVV9DKQotJChBVE9GX1RBUkdfTyk6ICQoQVRPRl9UQVJHX0MpCi0JJChDT01QSUxFKSAtYyAkKEFUT0ZfVEFSR19DKQotCi0jIGVjb2ZmLmMgb25seSBoYXMgZnVsbCBkZXBlbmRlbmNpZXMgd2hlbiBFQ09GRl9ERUJVR0dJTkcgaXMgZGVmaW5lZCwKLSMgc28gdGhlIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHN0dWZmIGRvZXNuJ3Qgd29yay4KLWVjb2ZmLm8gOiBlY29mZi5jIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0JJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKLQkkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oCi0KLSMgV2UgbmVlZCBhbGwgdGhlc2UgZXhwbGljaXQgcnVsZXMgZm9yIHRoZSBtdWx0aSBzdHVmZi4gIEJlY2F1c2Ugb2YKLSMgdGhlc2UgcnVsZXMsIHdlIGRvbid0IG5lZWQgb25lIGZvciBPQkpfRk9STUFUX08uCi0KLW9iai1hb3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYwotb2JqLWJvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCi1vYmotY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYwotb2JqLWVjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5jCi1vYmotZWxmLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKLW9iai1ldmF4Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYwotb2JqLWhwMzAwLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5jCi1vYmotaWVlZS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKLW9iai1tdWx0aS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotbXVsdGkuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotbXVsdGkuYwotb2JqLXNvbS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCi1vYmotdm1zLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKLQotZS1taXBzZWxmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jCi1lLW1pcHNlY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLWUtaTM4NmNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jCi1lLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYwotCi0jIFRoZSBtNjhrIG9wZXJhbmQgcGFyc2VyLgotCi1FWFRSQV9hc19uZXdfU09VUkNFUyA9IGNvbmZpZy9tNjhrLXBhcnNlLnkKLQotIyBJZiBtNjhrLXBhcnNlLnkgaXMgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LCB0aGVuIHlsd3JhcCB3aWxsIHVzZSBhbgotIyBhYnNvbHV0ZSBwYXRoIHdoZW4gaXQgaW52b2tlcyB5YWNjLCB3aGljaCB3aWxsIGNhdXNlIHlhY2MgdG8gcHV0IHRoZQotIyBhYnNvbHV0ZSBwYXRoIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiAgVGhhdCdzIGEgcGFpbiB3aGVuIGl0IGNvbWVzCi0jIHRvIGdlbmVyYXRpbmcgc25hcHNob3RzLCBiZWNhdXNlIGl0IGludHJvZHVjZXMgc3B1cmlvdXMgZGlmZnMuCi0jIFNpbmNlIHdoZW4gd2UgbWFrZSB0aGUgc25hcHNob3RzICQoc3JjZGlyKSA9ICIuIiwgd2UgY2hlY2sgZm9yIHRoYXQKLSMgY2FzZSBhbmQgaGFuZGxlIGl0IGRpZmZlcmVudGx5LiAgVGhpcyBtZWFucyB0aGF0IGFueWJvZHkgd2hvCi0jIGNvbmZpZ3VyZXMgd2l0aCAkKHNyY2RpcikgPSAiLiIgd2lsbCBoYXZlIHRvIHNldCB0aGVpciBwYXRoIGluIHRoZQotIyBkZWJ1Z2dlciBpZiB0aGV5IHdhbnQgdG8gZGVidWcgbTY4ay1wYXJzZS55LiAgVGhpcyBpcyBiYWQsIGJ1dCBvbgotIyB0aGUgb3RoZXIgaGFuZCBpdCdzIGdvb2QgdGhhdCBwZW9wbGUgd2hvIHVzZSB0aGUgcHJlYnVpbHQKLSMgbTY4ay1wYXJzZS5jIGRvbid0IGdldCBhIHNwdXJpb3VzIGFic29sdXRlIHBhdGguCi1tNjhrLXBhcnNlLmM6ICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55Ci0JZj0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueTsgXAotCWlmIFsgJCRmID0gIi4vY29uZmlnL202OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBsbiAtcyBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGxuIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgY3AgY29uZmlnL202OGstcGFyc2UueSAuID4vZGV2L251bGwgMj4vZGV2L251bGw7IFwKLQkgIGY9bTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaTsgXAotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJCRmIHkudGFiLmMgbTY4ay1wYXJzZS5jIC0tOyBcCi0JaWYgWyAkJGYgPSAibTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIHJtIC1mIG02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmkKLW02OGstcGFyc2UubzogbTY4ay1wYXJzZS5jICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLSMgRG9uJ3QgbGV0IHRoZSAueS5oIHJ1bGUgY2xvYmJlciBtNjhrLXBhcnNlLmguCi1tNjhrLXBhcnNlLmg6IDsgQHRydWUKLSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0KLSMgVGhlIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gbGV4aWNhbCBhbmFseXplciBhbmQgcGFyc2VyLgotCi1pdGJsLWxleC5jOiAkKHNyY2RpcikvaXRibC1sZXgubAotaXRibC1sZXgubzogaXRibC1sZXguYyBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5vOiBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0KLWl0Ymwtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oOiAkKHNyY2RpcikvaXRibC1wYXJzZS55Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvaXRibC1wYXJzZS55IHkudGFiLmMgaXRibC1wYXJzZS5jIHkudGFiLmggaXRibC1wYXJzZS5oIC0tIC1kCi0KLSMgc3RhbmQtYWxvbmUgaXRibCBhc3NlbWJsZXIgJiBkaXNhc3NlbWJsZXIKLQotRVhUUkFfUFJPR1JBTVMgPSBpdGJsLXRlc3QKLWl0YmxfdGVzdF9TT1VSQ0VTID0gaXRibC1wYXJzZS55IGl0YmwtbGV4LmwKLWl0YmxfdGVzdF9MREFERCA9IGl0YmwtdGVzdC1vcHMubyBpdGJsLXRlc3QubyAkKEdBU0xJQlMpIEBMRVhMSUJACi0KLWl0YmwtdGVzdC1vcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0JJChDT01QSUxFKSAtbyBpdGJsLXRlc3Qtb3BzLm8gLURTVEFORF9BTE9ORSAtYyAkKHNyY2RpcikvaXRibC1vcHMuYwotCi1pdGJsLXRlc3QubzogJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0JJChDT01QSUxFKSAtYyAtRFNUQU5EX0FMT05FICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYwotCi0jIENHRU4gaW50ZXJmYWNlLgotCi1DR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAotCi1jZ2VuLm86IGNnZW4uYyBjZ2VuLmggY2dlbi1kZXNjLmggc3Vic2Vncy5oIFwKLQkkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktb3BjLmgKLQotIyBSZW1ha2UgdGhlIGluZm8gZmlsZXMuCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGNvcmUgc3RhbXAtbWsuY29tIFwKLQl0ZXN0c3VpdGUvKi5vIHRlc3RzdWl0ZS8qLm91dCB0ZXN0c3VpdGUvZ2FzLmxvZyB0ZXN0c3VpdGUvZ2FzLnN1bSBcCi0JdGVzdHN1aXRlL3NpdGUuZXhwIHNpdGUuYmFrIHNpdGUuZXhwIHN0YWdlIHN0YWdlMSBzdGFnZTIKLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLnRjZGVwIC5vYmpkZXAgLmRlcDIgLmRlcDEgLmRlcGEgLmRlcCAuZGVwZGlyCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtYmluZGlyIGluc3RhbGwtZXhlYy10b29sZGlyCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogaW5zdGFsbC1leGVjLWJpbmRpciBAaW5zdGFsbF90b29sZGlyQAotCi1pbnN0YWxsLWV4ZWMtYmluZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKQotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi1pbnN0YWxsLWV4ZWMtdG9vbGRpcjogJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgotCW49YGVjaG8gYXMgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBhcy1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQllbHNlIFwKLQkgIHRydWUgOyBcCi0JZmkKLQotIyBUaGVzZSBleGlzdCBmb3IgbWFpbnRlbmFuY2UgcHVycG9zZXMuCi0KLS5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcDIgYm9vdHN0cmFwMyBzdGFnZTEgc3RhZ2UyIHN0YWdlMyBjb21wYXJpc29uCi0KLWJvb3RzdHJhcDogYXMtbmV3Ci0JJChNQUtFKSBzdGFnZTEKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIHN0YWdlMgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi1ib290c3RyYXAyOgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDM6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLSMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCi1zdGFnZTE6Ci0JLW1rZGlyIHN0YWdlMQotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMQotCWlmIFsgLWYgc3RhZ2UxL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMS9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UxIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCi0KLXN0YWdlMjoKLQktbWtkaXIgc3RhZ2UyCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCi0JaWYgWyAtZiBzdGFnZTIvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UyL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTIgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UzOgotCS1ta2RpciBzdGFnZTMKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTMKLQlpZiBbIC1mIHN0YWdlMy9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTMvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMyA7IGxuIC1zIGFzLW5ldyBhcyQoRVhFRVhUKSkgOyBmaQotCi1hZ2FpbnN0PXN0YWdlMgotCi0jIFRoaXMgcnVsZSBpcyBkZXJpdmVkIGZyb20gY29ycmVzcG9uZGluZyBjb2RlIGluIHRoZSBNYWtlZmlsZS5pbiBmb3IgZ2NjLgotIyBUaGUgInRhaWwgKzE2YyIgaXMgdG8gYnlwYXNzIGhlYWRlcnMgd2hpY2ggbWF5IGluY2x1ZGUgdGltZXN0YW1wcyBvcgotIyB0ZW1wb3JhcnkgYXNzZW1ibHkgZmlsZSBuYW1lcy4KLWNvbXBhcmlzb246Ci0JeD0wIDsgXAotCWZvciBmaWxlIGluICoubyA7IGRvIFwKLQkgIHRhaWwgKzE2YyAuLyQkZmlsZSA+IHRtcC1mb28xOyBcCi0JICBpZiB0YWlsICsxNmMgJHthZ2FpbnN0fS8kJGZpbGUgPiB0bXAtZm9vMiAyPi9kZXYvbnVsbCA7IHRoZW4gXAotCSAgICBpZiBjbXAgdG1wLWZvbzEgdG1wLWZvbzIgOyB0aGVuIFwKLQkgICAgICB0cnVlIDsgXAotCSAgICBlbHNlIFwKLQkgICAgICBlY2hvICQkZmlsZSBkaWZmZXJzIDsgXAotCSAgICAgIHg9MSA7IFwKLQkgICAgZmkgOyBcCi0JICBlbHNlIHRydWU7IGZpIDsgXAotCWRvbmUgOyBcCi0JZXhpdCAkJHgKLQktcm0gLWYgdG1wLWZvbyoKLQotLlBIT05ZOiBkZS1zdGFnZTEgZGUtc3RhZ2UyIGRlLXN0YWdlMwotCi1kZS1zdGFnZTE6Ci0JLSAoY2Qgc3RhZ2UxIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UxCi0KLWRlLXN0YWdlMjoKLQktIChjZCBzdGFnZTIgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTIKLQotZGUtc3RhZ2UzOgotCS0gKGNkIHN0YWdlMyA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMwotCi0jIEF1dG9tYXRpYyBkZXBlbmRlbmN5IGNvbXB1dGF0aW9uLiAgVGhpcyBpcyBhIHJlYWwgcGFpbiwgYmVjYXVzZSB0aGUKLSMgZGVwZW5kZW5jaWVzIGNoYW5nZSBiYXNlZCBvbiB0YXJnZXRfY3B1X3R5cGUgYW5kIG9ial9mb3JtYXQuICBXZQotIyBjdXJyZW50bHkgaWdub3JlIGFueSBkZXBlbmRlbmNpZXMgY2F1c2VkIGJ5IGVtdWxhdGlvbiBmaWxlcy4KLQotREVQX0ZJTEVfREVQUyA9ICAkKENGSUxFUykgJChIRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKLQkkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCi0uZGVwOiBkZXAuc2VkICQoREVQX0ZJTEVfREVQUykgLnRjZGVwIC5vYmpkZXAgLmRlcDIKLQlybSAtZiAuZGVwMQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JJChNQUtFKSBERVA9JChERVApIHNyY2Rpcj0kJHtzcmNkaXJ9IFZQQVRIPSQke3NyY2Rpcn0gLmRlcDEKLQlybSAtcmYgLmRlcGRpcgotCXNlZCAtZiBkZXAuc2VkIDwgLmRlcDEgPiAuZGVwYQotCXNlZCAtZiBkZXAuc2VkIDwgLnRjZGVwID4+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAub2JqZGVwID4+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAuZGVwMiA+PiAuZGVwYQotCWVjaG8gJyQkKE9CSlMpOiAkJChERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IC5kZXBhCi0JZWNobyAnJCQoVEFSR19DUFVfTyk6ICQkKFRDREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiAuZGVwYQotCWVjaG8gJyQkKE9CSl9GT1JNQVRfTyk6ICQkKE9CSkRFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gLmRlcGEKLQllY2hvICcjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVknID4+IC5kZXBhCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXBhIC5kZXAKLQotIyBUaGlzIHJ1bGUgbmVlZHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKE1VTFRJX0NGSUxFUykKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZWNobyAnJyA+IHRhcmctY3B1Lmg7IFwKLQllY2hvICcnID4gb2JqLWZvcm1hdC5oOyBcCi0JZWNobyAnJyA+IHRhcmctZW52Lmg7IFwKLQllY2hvICcnID4gaXRibC1jcHUuaDsgXAotCWVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSAkPwotCXNlZCAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgPCAuZGVwZGlyLy5kZXAgPiAuZGVwMQotCXJtIC1mIC5kZXBkaXIvLmRlcAotCi0jIFdvcmsgb3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyBmb3IgdGhlIHRjLSouYyBmaWxlcy4KLS50Y2RlcDogJChUQVJHRVRfQ1BVX0NGSUxFUykKLQlybSAtZiAudGNkZXBhCi0JaWYgWyAtZCAuZGVwZGlyIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAuZGVwZGlyOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgLmRlcGRpcjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gb2JqLWZvcm1hdC5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRlLWdlbmVyaWMuaCInID4gdGFyZy1lbnYuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtcGFyc2UuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvcGNvZGVzLyciJCR7Y30iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL3RjLSQke2N9LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9UQ0RFUF8kJHtjfV8kJHtvfSA9LyIgXAotCQkgIC1lICcxLC9ETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSL2QnIFwKLQkJICAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgXAotCQkgIC1lICcvXiQkL2QnIDwgLmRlcCA+PiAuLi8udGNkZXBhOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ1RDREVQX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcJyA+PiAudGNkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL29ic3RhY2suaCAkJChCRkRESVIpL2xpYmhwcGEuaCBcJyA+PiAudGNkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL29wY29kZS9ocHBhLmggJCQoQkZERElSKS9zb20uaCcgPj4gLnRjZGVwYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnVENERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLnRjZGVwYTsgXAotCSAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLnRjZGVwYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKFRDREVQXyciJCR7Y30iJ19lY29mZikgXCcgPj4gLnRjZGVwYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKFRDREVQXyciJCR7Y30iJ19lbGYpJyA+PiAudGNkZXBhOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIC50Y2RlcGEgLnRjZGVwCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgb2JqLSouYyBmaWxlcy4KLS5vYmpkZXA6ICQoT0JKX0ZPUk1BVF9DRklMRVMpCi0Jcm0gLWYgLm9iamRlcGEKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL29iai0kJHtvfS5jIGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvT0JKREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5vYmpkZXBhOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ09CSkRFUF9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXCcgPj4gLm9iamRlcGEKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IC5vYmpkZXBhCi0JZWNobyAnICAkJChCRkRESVIpL3NvbS5oICAkJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcJyA+PiAub2JqZGVwYQotCWVjaG8gJyAgJCQoSU5DRElSKS9hb3V0L3N0YWIuZGVmJyA+PiAub2JqZGVwYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnT0JKREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5vYmpkZXBhOyBcCi0JICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLm9iamRlcGE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChPQkpERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiAub2JqZGVwYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfZWxmKScgPj4gLm9iamRlcGE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgLm9iamRlcGEgLm9iamRlcAotCi0jIFdvcmsgb3V0IHRoZSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggQ1BVL09CSiBjb21iaW5hdGlvbi4KLSMgTm90ZSB0aGF0IFNPTSBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSBpdCBvbmx5IHdvcmtzIG5hdGl2ZS4KLS5kZXAyOiAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCXJtIC1mIC5kZXAyYQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5kZXAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUF9ocHBhX3NvbSA9ICQkKEJGRERJUikvc29tLmgnID4+IC5kZXAyYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5kZXAyYTsgXAotCSAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IC5kZXAyYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC5kZXAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gLmRlcDJhOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIC5kZXAyYSAuZGVwMgotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAotCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCi0JCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAotCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hcHAubzogYXBwLmMKLWFzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCi0gIHNiLmggbWFjcm8uaAotYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCi1iaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCi1jb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAotZGVwZW5kLm86IGRlcGVuZC5jCi1kd2FyZjJkYmcubzogZHdhcmYyZGJnLmMgZHdhcmYyZGJnLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5vOiBlY29mZi5jIGVjb2ZmLmgKLWVob3B0Lm86IGVob3B0LmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZXhwci5vOiBleHByLmMgJChJTkNESVIpL29ic3RhY2suaAotZmxvbnVtLWNvcHkubzogZmxvbnVtLWNvcHkuYwotZmxvbnVtLWtvbnN0Lm86IGZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5vOiBmbG9udW0tbXVsdC5jCi1mcmFncy5vOiBmcmFncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1oYXNoLm86IGhhc2guYyAkKElOQ0RJUikvb2JzdGFjay5oCi1pbnB1dC1maWxlLm86IGlucHV0LWZpbGUuYyBpbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLm86IGlucHV0LXNjcnViLmMgaW5wdXQtZmlsZS5oIHNiLmgKLWxpc3RpbmcubzogbGlzdGluZy5jIGlucHV0LWZpbGUuaCBzdWJzZWdzLmgKLWxpdGVyYWwubzogbGl0ZXJhbC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1tYWNyby5vOiBtYWNyby5jIHNiLmggbWFjcm8uaAotbWVzc2FnZXMubzogbWVzc2FnZXMuYwotb3V0cHV0LWZpbGUubzogb3V0cHV0LWZpbGUuYyBvdXRwdXQtZmlsZS5oCi1yZWFkLm86IHJlYWQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBzYi5oIG1hY3JvLmggXAotICBlY29mZi5oCi1zYi5vOiBzYi5jIHNiLmgKLXN0YWJzLm86IHN0YWJzLmMgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggZWNvZmYuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN1YnNlZ3Mubzogc3Vic2Vncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1zeW1ib2xzLm86IHN5bWJvbHMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBcCi0gIHN0cnVjLXN5bWJvbC5oCi13cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKLWdhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAotaXRibC1vcHMubzogaXRibC1vcHMuYyBpdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYyBlbXVsLmggXAotICBlbXVsLXRhcmdldC5oCi1lLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYyBlbXVsLmggZW11bC10YXJnZXQuaAotZS1taXBzZWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtbWlwc2VsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi0KLVRDREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotVENERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLVRDREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLVRDREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotVENERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotVENERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL29wY29kZS9hbHBoYS5oICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1UQ0RFUF9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1UQ0RFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1UQ0RFUF9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLVRDREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1UQ0RFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1UQ0RFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1UQ0RFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLVRDREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotVENERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9zeW1jYXQuaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLWRlc2MuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtb3BjLmggXAotICBjZ2VuLmgKLVRDREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaAotVENERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi1UQ0RFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9oODUwMC1vcGMuaAotVENERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKLVRDREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotVENERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKLSAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmJmZC5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1UQ0RFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotVENERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLVRDREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotVENERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1UQ0RFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1UQ0RFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1UQ0RFUF9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi1UQ0RFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi1UQ0RFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotVENERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi1UQ0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotVENERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLVRDREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLVRDREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLVRDREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotVENERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotVENERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvbWNvcmUtb3BjLmgKLVRDREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLVRDREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggXAotICBpdGJsLW9wcy5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotVENERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmgKLVRDREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBpdGJsLW9wcy5oIFwKLSAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotVENERVBfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotVENERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1UQ0RFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1UQ0RFUF9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLVRDREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLVRDREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggJChJTkNESVIpL29ic3RhY2suaAotVENERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLVRDREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLVRDREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaCAkKElOQ0RJUikvZWxmL3BwYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmgKLVRDREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCi1UQ0RFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotVENERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi1UQ0RFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2VsZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotVENERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS90YWhvZS5oCi1UQ0RFUF90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotVENERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi1UQ0RFUF90aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLVRDREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLVRDREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotVENERVBfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotVENERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLVRDREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLVRDREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotVENERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotVENERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi1UQ0RFUF93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3c2NS1vcGMuaAotVENERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaAotVENERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi1UQ0RFUF96OGtfY29mZiA9ICQoc3JjZGlyKS8uLi9vcGNvZGVzL3o4ay1vcGMuaCAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLVRDREVQX3o4a19lbGYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggXAotICAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaAotVENERVBfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmggXAotICAkKEJGRERJUikvc29tLmgKLVRDREVQX2kzODZfbXVsdGkgPSAkKFRDREVQX2kzODZfY29mZikgJChUQ0RFUF9pMzg2X2VsZikKLVRDREVQX21pcHNfbXVsdGkgPSAkKFRDREVQX21pcHNfY29mZikgJChUQ0RFUF9taXBzX2Vjb2ZmKSBcCi0gICQoVENERVBfbWlwc19lbGYpCi1PQkpERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLU9CSkRFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLU9CSkRFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1PQkpERVBfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoQkZERElSKS9saWJlY29mZi5oCi1PQkpERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF90aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF92YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF92YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvc29tLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1PQkpERVBfaTM4Nl9tdWx0aSA9ICQoT0JKREVQX2kzODZfY29mZikgJChPQkpERVBfaTM4Nl9lbGYpCi1PQkpERVBfbWlwc19tdWx0aSA9ICQoT0JKREVQX21pcHNfY29mZikgJChPQkpERVBfbWlwc19lY29mZikgXAotICAkKE9CSkRFUF9taXBzX2VsZikKLURFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmgKLURFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotREVQX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1ERVBfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmgKLURFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaAotREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaAotREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaAotREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaAotREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oCi1ERVBfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmgKLURFUF9ocHBhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaAotREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaAotREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaAotREVQX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaAotREVQX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaAotREVQX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oCi1ERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmgKLURFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmgKLURFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmgKLURFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmgKLURFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oCi1ERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmgKLURFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oCi1ERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oCi1ERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaAotREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oCi1ERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oCi1ERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1ERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaAotREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaAotREVQX3o4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLURFUF9ocHBhX3NvbSA9ICQoQkZERElSKS9zb20uaAotREVQX2kzODZfbXVsdGkgPSAkKERFUF9pMzg2X2NvZmYpICQoREVQX2kzODZfZWxmKQotREVQX21pcHNfbXVsdGkgPSAkKERFUF9taXBzX2NvZmYpICQoREVQX21pcHNfZWNvZmYpIFwKLSAgJChERVBfbWlwc19lbGYpCi0kKE9CSlMpOiAkKERFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0kKFRBUkdfQ1BVX08pOiAkKFRDREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoT0JKX0ZPUk1BVF9PKTogJChPQkpERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9nYXMvTWFrZWZpbGUuaW4gYi9nYXMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Y2FjZDEuLjAwMDAwMDAKLS0tIGEvZ2FzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjUwMyArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BTExfT0JKX0RFUFMgPSBAQUxMX09CSl9ERVBTQAotQVMgPSBAQVNACi1CRkRMSUIgPSBAQkZETElCQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTk0gPSBATk1ACi1PUENPREVTX0xJQiA9IEBPUENPREVTX0xJQkAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWF0b2YgPSBAYXRvZkAKLWNnZW5fY3B1X3ByZWZpeCA9IEBjZ2VuX2NwdV9wcmVmaXhACi1leHRyYV9vYmplY3RzID0gQGV4dHJhX29iamVjdHNACi1pbnN0YWxsX3Rvb2xkaXIgPSBAaW5zdGFsbF90b29sZGlyQAotbCA9IEBsQAotb2JqX2Zvcm1hdCA9IEBvYmpfZm9ybWF0QAotdGFyZ2V0X2NwdV90eXBlID0gQHRhcmdldF9jcHVfdHlwZUAKLXRlX2ZpbGUgPSBAdGVfZmlsZUAKLQotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gZG9jIHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwuLi9iaXNvbi9iaXNvbiA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgIGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLURFUCA9ICQoc3JjZGlyKS8uLi9ta2RlcAotCi1UQVJHX0NQVSA9IEB0YXJnZXRfY3B1X3R5cGVACi1UQVJHX0NQVV9DID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5jCi1UQVJHX0NQVV9PID0gdGMtQHRhcmdldF9jcHVfdHlwZUAubwotVEFSR19DUFVfSCA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuaAotT0JKX0ZPUk1BVF9DID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmMKLU9CSl9GT1JNQVRfTyA9IG9iai1Ab2JqX2Zvcm1hdEAubwotT0JKX0ZPUk1BVF9IID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmgKLVRBUkdfRU5WX0ggPSAkKHNyY2RpcikvY29uZmlnL3RlLUB0ZV9maWxlQC5oCi1BVE9GX1RBUkdfQyA9ICQoc3JjZGlyKS9jb25maWcvYXRvZi1AYXRvZkAuYwotQVRPRl9UQVJHX08gPSBhdG9mLUBhdG9mQC5vCi0KLSMgdXNlIEB0YXJnZXRfY3B1X3R5cGVAIGZvciByZWZlcmluZyB0byBjb25maWd1cmVkIHRhcmdldCBuYW1lCi1JVF9IRFJTID0gaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAotSVRfU1JDUyA9IGl0YmwtcGFyc2UuYyBpdGJsLWxleC5jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi1JVF9ERVBTID0gJChzcmNkaXIpL2l0YmwtcGFyc2UueSAkKHNyY2RpcikvaXRibC1sZXgubCAkKHNyY2RpcikvY29uZmlnL2l0YmwtQHRhcmdldF9jcHVfdHlwZUAuaAotSVRfT0JKUyA9IGl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KLQotIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQotQ1BVX1RZUEVTID0gXAotCWEyOWsgXAotCWFscGhhIFwKLQlhcmMgXAotCWFybSBcCi0JZDEwdiBcCi0JZDMwdiBcCi0JZnIzMCBcCi0JaDgzMDAgXAotCWg4NTAwIFwKLQlocHBhIFwKLQlpMzg2IFwKLQlpODYwIFwKLQlpOTYwIFwKLQltMzJyIFwKLQltNjhrIFwKLQltODhrIFwKLQltY29yZSBcCi0JbWlwcyBcCi0JbW4xMDIwMCBcCi0JbW4xMDMwMCBcCi0JbnMzMmsgXAotCXBwYyBcCi0Jc2ggXAotCXNwYXJjIFwKLQl0YWhvZSBcCi0JdGljMzAgXAotCXRpYzgwIFwKLQl2YXggXAotCXc2NSBcCi0Jdjg1MCBcCi0JejhrCi0KLQotIyBPYmplY3QgZm9ybWF0IHR5cGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCi0jIFdlIGRlbGliZXJhdGVseSBvbWl0IHNvbSwgc2luY2UgaXQgZG9lcyBub3Qgd29yayBhcyBhIGNyb3NzIGFzc2VtYmxlci4KLQotT0JKX0ZPUk1BVFMgPSBcCi0JYW91dCBcCi0JYm91dCBcCi0JY29mZiBcCi0JZWNvZmYgXAotCWVsZiBcCi0JZXZheCBcCi0JaHAzMDAgXAotCWllZWUgXAotCXZtcwotCi0KLSMgVGhpcyBpcyBhbiBzaCBjYXNlIHdoaWNoIHNldHMgdmFsaWQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIENQVQotIyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBjIGFuZCB0aGUgT1MgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgbwotIyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBoZWxwcyBjdXRzIGRvd24gb24gdGhlIGFtb3VudCBvZiBkZXBlbmRlbmN5Ci0jIGluZm9ybWF0aW9uLgotCi1DUFVfT0JKX1ZBTElEID0gXAotCXZhbGlkPSA7IFwKLQljYXNlICQkbyBpbiBcCi0JYW91dCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgYTI5ayB8IGFybSB8IGkzODYgfCBpODYwIHwgbTY4ayB8IG1pcHMgfCBuczMyayB8IHNwYXJjIHwgdGFob2UgfCB0aWMzMCB8IHZheCkgXAotCSAgICB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JYm91dCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgaTk2MCkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWNvZmYpIHZhbGlkPXllcyA7OyBcCi0JZWNvZmYpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIG1pcHMgfCBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWVsZikgdmFsaWQ9eWVzIDs7IFwKLQlldmF4KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWhwMzAwKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBtNjhrKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0Jdm1zKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICB2YXgpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQllc2FjOwotCi0KLSMgVGhpcyBpcyBsaWtlIENQVV9PQkpfVkFMSUQsIGZvciB0aGUgb2JqPW11bHRpIGNhc2UuCi0KLUNQVV9NVUxUSV9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJGMgaW4gXAotCWkzODYgfCBtaXBzKSB2YWxpZD15ZXMgOzsgXAotCWVzYWM7Ci0KLQotIyBSZWd1bGFyIHNvdXJjZSBmaWxlcy4KLQotR0FTX0NGSUxFUyA9IFwKLQlhcHAuYyBcCi0JYXMuYyBcCi0JYXRvZi1nZW5lcmljLmMgXAotCWJpZ251bS1jb3B5LmMgXAotCWNvbmQuYyBcCi0JZGVwZW5kLmMgXAotCWR3YXJmMmRiZy5jIFwKLQllY29mZi5jIFwKLQllaG9wdC5jIFwKLQlleHByLmMgXAotCWZsb251bS1jb3B5LmMgXAotCWZsb251bS1rb25zdC5jIFwKLQlmbG9udW0tbXVsdC5jIFwKLQlmcmFncy5jIFwKLQloYXNoLmMgXAotCWlucHV0LWZpbGUuYyBcCi0JaW5wdXQtc2NydWIuYyBcCi0JbGlzdGluZy5jIFwKLQlsaXRlcmFsLmMgXAotCW1hY3JvLmMgXAotCW1lc3NhZ2VzLmMgXAotCW91dHB1dC1maWxlLmMgXAotCXJlYWQuYyBcCi0Jc2IuYyBcCi0Jc3RhYnMuYyBcCi0Jc3Vic2Vncy5jIFwKLQlzeW1ib2xzLmMgXAotCXdyaXRlLmMKLQotCi1DRklMRVMgPSAkKEdBU19DRklMRVMpIGdhc3AuYyBpdGJsLW9wcy5jCi0KLUhGSUxFUyA9IFwKLQlhcy5oIFwKLQlhc2ludGwuaCBcCi0JYmlnbnVtLmggXAotCWJpdF9maXguaCBcCi0JY2dlbi5oIFwKLQlkd2FyZjJkYmcuaCBcCi0JZWNvZmYuaCBcCi0JZW11bC10YXJnZXQuaCBcCi0JZW11bC5oIFwKLQlleHByLmggXAotCWZsb251bS5oIFwKLQlmcmFncy5oIFwKLQloYXNoLmggXAotCWlucHV0LWZpbGUuaCBcCi0JaXRibC1vcHMuaCBcCi0JbGlzdGluZy5oIFwKLQltYWNyby5oIFwKLQlvYmouaCBcCi0Jb3V0cHV0LWZpbGUuaCBcCi0JcmVhZC5oIFwKLQlzYi5oIFwKLQlzdHJ1Yy1zeW1ib2wuaCBcCi0Jc3Vic2Vncy5oIFwKLQlzeW1ib2xzLmggXAotCXRjLmggXAotCXdyaXRlLmgKLQotCi0jIENQVSBmaWxlcyBpbiBjb25maWcuCi0KLVRBUkdFVF9DUFVfQ0ZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmMgXAotCWNvbmZpZy90Yy1hbHBoYS5jIFwKLQljb25maWcvdGMtYXJjLmMgXAotCWNvbmZpZy90Yy1hcm0uYyBcCi0JY29uZmlnL3RjLWQxMHYuYyBcCi0JY29uZmlnL3RjLWQzMHYuYyBcCi0JY29uZmlnL3RjLWZyMzAuYyBcCi0JY29uZmlnL3RjLWg4MzAwLmMgXAotCWNvbmZpZy90Yy1oODUwMC5jIFwKLQljb25maWcvdGMtaHBwYS5jIFwKLQljb25maWcvdGMtaTM4Ni5jIFwKLQljb25maWcvdGMtaTg2MC5jIFwKLQljb25maWcvdGMtaTk2MC5jIFwKLQljb25maWcvdGMtbTMyci5jIFwKLQljb25maWcvdGMtbTY4ay5jIFwKLQljb25maWcvdGMtbTg4ay5jIFwKLQljb25maWcvdGMtbWNvcmUuYyBcCi0JY29uZmlnL3RjLW1pcHMuYyBcCi0JY29uZmlnL3RjLW1uMTAyMDAuYyBcCi0JY29uZmlnL3RjLW1uMTAzMDAuYyBcCi0JY29uZmlnL3RjLW5zMzJrLmMgXAotCWNvbmZpZy90Yy1wcGMuYyBcCi0JY29uZmlnL3RjLXNoLmMgXAotCWNvbmZpZy90Yy1zcGFyYy5jIFwKLQljb25maWcvdGMtdGFob2UuYyBcCi0JY29uZmlnL3RjLXRpYzMwLmMgXAotCWNvbmZpZy90Yy10aWM4MC5jIFwKLQljb25maWcvdGMtdmF4LmMgXAotCWNvbmZpZy90Yy13NjUuYyBcCi0JY29uZmlnL3RjLXY4NTAuYyBcCi0JY29uZmlnL3RjLXo4ay5jCi0KLQotVEFSR0VUX0NQVV9IRklMRVMgPSBcCi0JY29uZmlnL3RjLWEyOWsuaCBcCi0JY29uZmlnL3RjLWFscGhhLmggXAotCWNvbmZpZy90Yy1hcmMuaCBcCi0JY29uZmlnL3RjLWFybS5oIFwKLQljb25maWcvdGMtZDEwdi5oIFwKLQljb25maWcvdGMtZDMwdi5oIFwKLQljb25maWcvdGMtZnIzMC5oIFwKLQljb25maWcvdGMtaDgzMDAuaCBcCi0JY29uZmlnL3RjLWg4NTAwLmggXAotCWNvbmZpZy90Yy1ocHBhLmggXAotCWNvbmZpZy90Yy1pMzg2LmggXAotCWNvbmZpZy90Yy1pODYwLmggXAotCWNvbmZpZy90Yy1pOTYwLmggXAotCWNvbmZpZy90Yy1tMzJyLmggXAotCWNvbmZpZy90Yy1tNjhrLmggXAotCWNvbmZpZy90Yy1tODhrLmggXAotCWNvbmZpZy90Yy1tY29yZS5oIFwKLQljb25maWcvdGMtbWlwcy5oIFwKLQljb25maWcvdGMtbW4xMDIwMC5oIFwKLQljb25maWcvdGMtbW4xMDMwMC5oIFwKLQljb25maWcvdGMtbnMzMmsuaCBcCi0JY29uZmlnL3RjLXBwYy5oIFwKLQljb25maWcvdGMtc2guaCBcCi0JY29uZmlnL3RjLXNwYXJjLmggXAotCWNvbmZpZy90Yy10YWhvZS5oIFwKLQljb25maWcvdGMtdGljMzAuaCBcCi0JY29uZmlnL3RjLXRpYzgwLmggXAotCWNvbmZpZy90Yy12YXguaCBcCi0JY29uZmlnL3RjLXc2NS5oIFwKLQljb25maWcvdGMtdjg1MC5oIFwKLQljb25maWcvdGMtejhrLmgKLQotCi0jIE9CSiBmaWxlcyBpbiBjb25maWcKLQotT0JKX0ZPUk1BVF9DRklMRVMgPSBcCi0JY29uZmlnL29iai1hb3V0LmMgXAotCWNvbmZpZy9vYmotYm91dC5jIFwKLQljb25maWcvb2JqLWNvZmYuYyBcCi0JY29uZmlnL29iai1lY29mZi5jIFwKLQljb25maWcvb2JqLWVsZi5jIFwKLQljb25maWcvb2JqLWV2YXguYyBcCi0JY29uZmlnL29iai1ocDMwMC5jIFwKLQljb25maWcvb2JqLWllZWUuYyBcCi0JY29uZmlnL29iai1zb20uYyBcCi0JY29uZmlnL29iai12bXMuYwotCi0KLU9CSl9GT1JNQVRfSEZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5oIFwKLQljb25maWcvb2JqLWJvdXQuaCBcCi0JY29uZmlnL29iai1jb2ZmLmggXAotCWNvbmZpZy9vYmotZWNvZmYuaCBcCi0JY29uZmlnL29iai1lbGYuaCBcCi0JY29uZmlnL29iai1ldmF4LmggXAotCWNvbmZpZy9vYmotaHAzMDAuaCBcCi0JY29uZmlnL29iai1pZWVlLmggXAotCWNvbmZpZy9vYmotc29tLmggXAotCWNvbmZpZy9vYmotdm1zLmgKLQotCi0jIEVtdWxhdGlvbiBoZWFkZXIgZmlsZXMgaW4gY29uZmlnCi0KLVRBUkdfRU5WX0hGSUxFUyA9IFwKLQljb25maWcvdGUtMzg2YnNkLmggXAotCWNvbmZpZy90ZS1hdXguaCBcCi0JY29uZmlnL3RlLWRlbHRhLmggXAotCWNvbmZpZy90ZS1kZWx0ODguaCBcCi0JY29uZmlnL3RlLWRweDIuaCBcCi0JY29uZmlnL3RlLWR5bml4LmggXAotCWNvbmZpZy90ZS1lcG9jLXBlLmggXAotCWNvbmZpZy90ZS1nZW5lcmljLmggXAotCWNvbmZpZy90ZS1nbzMyLmggXAotCWNvbmZpZy90ZS1ocDMwMC5oIFwKLQljb25maWcvdGUtaHBwYS5oIFwKLQljb25maWcvdGUtaTM4NmFpeC5oIFwKLQljb25maWcvdGUtaWM5NjAuaCBcCi0JY29uZmlnL3RlLWxpbnV4LmggXAotCWNvbmZpZy90ZS1sbmV3cy5oIFwKLQljb25maWcvdGUtbHlueC5oIFwKLQljb25maWcvdGUtbWFjaC5oIFwKLQljb25maWcvdGUtbWFjb3MuaCBcCi0JY29uZmlnL3RlLW11bHRpLmggXAotCWNvbmZpZy90ZS1uYnNkLmggXAotCWNvbmZpZy90ZS1uYnNkNTMyLmggXAotCWNvbmZpZy90ZS1wYzUzMm1hY2guaCBcCi0JY29uZmlnL3RlLXBlLmggXAotCWNvbmZpZy90ZS1wcGNudy5oIFwKLQljb25maWcvdGUtcHNvcy5oIFwKLQljb25maWcvdGUtcmlzY2l4LmggXAotCWNvbmZpZy90ZS1zcGFyY2FvdXQuaCBcCi0JY29uZmlnL3RlLXN1bjMuaCBcCi0JY29uZmlnL3RlLXN2cjQuaCBcCi0JY29uZmlnL3RlLXN5c3YzMi5oCi0KLQotIyBNdWx0aSBmaWxlcyBpbiBjb25maWcKLQotTVVMVElfQ0ZJTEVTID0gXAotCWNvbmZpZy9lLWkzODZjb2ZmLmMgXAotCWNvbmZpZy9lLWkzODZlbGYuYyBcCi0JY29uZmlnL2UtbWlwc2Vjb2ZmLmMgXAotCWNvbmZpZy9lLW1pcHNlbGYuYwotCi0KLUNPTkZJR19PQkpTID0gXAotCSQoVEFSR19DUFVfTykgXAotCSQoT0JKX0ZPUk1BVF9PKSBcCi0JJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykKLQotCi1HRU5FUklDX09CSlMgPSBcCi0JYXBwLm8gXAotCWFzLm8gXAotCWF0b2YtZ2VuZXJpYy5vIFwKLQliaWdudW0tY29weS5vIFwKLQljb25kLm8gXAotCWRlcGVuZC5vIFwKLQlkd2FyZjJkYmcubyBcCi0JZWhvcHQubyBcCi0JZXhwci5vIFwKLQlmbG9udW0ta29uc3QubyBcCi0JZmxvbnVtLWNvcHkubyBcCi0JZmxvbnVtLW11bHQubyBcCi0JZnJhZ3MubyBcCi0JaGFzaC5vIFwKLQlpbnB1dC1maWxlLm8gXAotCWlucHV0LXNjcnViLm8gXAotCWxpdGVyYWwubyBcCi0JbWVzc2FnZXMubyBcCi0Jb3V0cHV0LWZpbGUubyBcCi0JcmVhZC5vIFwKLQlzdWJzZWdzLm8gXAotCXN5bWJvbHMubyBcCi0Jd3JpdGUubyBcCi0JbGlzdGluZy5vIFwKLQllY29mZi5vIFwKLQlzdGFicy5vIFwKLQlzYi5vIFwKLQltYWNyby5vCi0KLQotT0JKUyA9ICQoQ09ORklHX09CSlMpICQoR0VORVJJQ19PQkpTKQotCi1QT1RGSUxFUyA9ICQoTVVMVElfQ0ZJTEVTKSAkKFRBUkdFVF9FTlZfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKSBcCi0JJChPQkpfRk9STUFUX0NGSUxFUykgJChUQVJHRVRfQ1BVX0hGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAotCSQoSEZJTEVTKSAkKENGSUxFUykgJChHQVNfQ0ZJTEVTKQotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGFzLW5ldyBnYXNwLW5ldwotbm9pbnN0X1NDUklQVFMgPSAuZ2RiaW5pdAotCi1FWFRSQV9ESVNUID0gbWFrZS1nYXMuY29tCi0KLURJU1RTVFVGRiA9IG1ha2UtZ2FzLmNvbSBtNjhrLXBhcnNlLmMgaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCBpdGJsLWxleC5jCi0KLURJU1RDTEVBTkZJTEVTID0gdGFyZy1jcHUuaCBvYmotZm9ybWF0LmggdGFyZy1lbnYuaCBpdGJsLWNwdS5oIGNnZW4tZGVzYy5oCi0KLSMgTm93IGZpZ3VyZSBvdXQgZnJvbSB0aG9zZSB2YXJpYWJsZXMgaG93IHRvIGNvbXBpbGUgYW5kIGxpbmsuCi0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIgPSAkKEJBU0VESVIpL2luY2x1ZGUKLQotIyBUaGlzIGlzIHRoZSB2YXJpYWJsZSBhY3R1YWxseSB1c2VkIHdoZW4gd2UgY29tcGlsZS4KLSMgU3BlY2lmeSB0aGUgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgZm9yIGhlYWRlciBmaWxlcy4KLSMgQm90aCAuIGFuZCBzcmNkaXIgYXJlIHVzZWQsIGluIHRoYXQgb3JkZXIsCi0jIHNvIHRoYXQgdG0uaCBhbmQgY29uZmlnLmggd2lsbCBiZSBmb3VuZCBpbiB0aGUgY29tcGlsYXRpb24KLSMgc3ViZGlyZWN0b3J5IHJhdGhlciB0aGFuIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoc3JjZGlyKS9jb25maWcgLUkkKElOQ0RJUikgLUkkKHNyY2RpcikvLi4gLUkkKEJGRERJUikgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi0jIFRoaXMgc2hvdWxkIGJlIHBhcmFsbGVsIHRvIElOQ0xVREVTLCBidXQgc2hvdWxkIHJlcGxhY2UgJChzcmNkaXIpCi0jIHdpdGggJCR7c3JjZGlyfSwgYW5kIHNob3VsZCB3b3JrIGluIGEgc3ViZGlyZWN0b3J5LiAgVGhpcyBpcyB1c2VkCi0jIHdoZW4gYnVpbGRpbmcgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHRoZSBkZXBlbmRlbmN5IGJ1aWxkaW5nIGlzIGRvbmUKLSMgaW4gYSBzdWJkaXJlY3RvcnkuCi1ERVBfSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkIC1JJCR7c3JjZGlyfS9jb25maWcgLUkkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUgLUkkJHtzcmNkaXJ9Ly4uIC1JJCR7c3JjZGlyfS8uLi9iZmQgLUkkJHtzcmNkaXJ9Ly4uL2ludGwgLUkuLi8uLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBIb3cgdG8gbGluayB3aXRoIGJvdGggb3VyIHNwZWNpYWwgbGlicmFyeSBmYWNpbGl0aWVzCi0jIGFuZCB0aGUgc3lzdGVtJ3MgaW5zdGFsbGVkIGxpYnJhcmllcy4KLQotR0FTTElCUyA9IEBPUENPREVTX0xJQkAgQEJGRExJQkAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLSMgRmlsZXMgdG8gYmUgY29waWVkIGF3YXkgYWZ0ZXIgZWFjaCBzdGFnZSBpbiBidWlsZGluZy4KLVNUQUdFU1RVRkYgPSAqLm8gJChub2luc3RfUFJPR1JBTVMpCi0KLWFzX25ld19TT1VSQ0VTID0gJChHQVNfQ0ZJTEVTKQotYXNfbmV3X0xEQUREID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExMSUJTKQotCi1hc19uZXdfREVQRU5ERU5DSUVTID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExERVBTKQotCi0KLWdhc3BfbmV3X1NPVVJDRVMgPSBnYXNwLmMgbWFjcm8uYyBzYi5jIGhhc2guYwotZ2FzcF9uZXdfTERBREQgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLWdhc3BfbmV3X0RFUEVOREVOQ0lFUyA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExERVBTKQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKLQkgICBmaWAKLQotUlVOVEVTVEZMQUdTID0gCi0KLSMgVGhlIG02OGsgb3BlcmFuZCBwYXJzZXIuCi0KLUVYVFJBX2FzX25ld19TT1VSQ0VTID0gY29uZmlnL202OGstcGFyc2UueQotCi0jIHN0YW5kLWFsb25lIGl0YmwgYXNzZW1ibGVyICYgZGlzYXNzZW1ibGVyCi0KLUVYVFJBX1BST0dSQU1TID0gaXRibC10ZXN0Ci1pdGJsX3Rlc3RfU09VUkNFUyA9IGl0YmwtcGFyc2UueSBpdGJsLWxleC5sCi1pdGJsX3Rlc3RfTERBREQgPSBpdGJsLXRlc3Qtb3BzLm8gaXRibC10ZXN0Lm8gJChHQVNMSUJTKSBATEVYTElCQAotCi0jIENHRU4gaW50ZXJmYWNlLgotCi1DR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAotCi0jIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAotCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKLQl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgotCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIC50Y2RlcCAub2JqZGVwIC5kZXAyIC5kZXAxIC5kZXBhIC5kZXAgLmRlcGRpcgotCi1hZ2FpbnN0ID0gc3RhZ2UyCi0KLSMgQXV0b21hdGljIGRlcGVuZGVuY3kgY29tcHV0YXRpb24uICBUaGlzIGlzIGEgcmVhbCBwYWluLCBiZWNhdXNlIHRoZQotIyBkZXBlbmRlbmNpZXMgY2hhbmdlIGJhc2VkIG9uIHRhcmdldF9jcHVfdHlwZSBhbmQgb2JqX2Zvcm1hdC4gIFdlCi0jIGN1cnJlbnRseSBpZ25vcmUgYW55IGRlcGVuZGVuY2llcyBjYXVzZWQgYnkgZW11bGF0aW9uIGZpbGVzLgotCi1ERVBfRklMRV9ERVBTID0gJChDRklMRVMpICQoSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCi0JJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0NGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQotCi1UQ0RFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLQotVENERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLQotVENERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotCi1UQ0RFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLQotVENERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1UQ0RFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLQotVENERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1UQ0RFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1UQ0RFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotVENERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLQotVENERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi0KLVRDREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLQotVENERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi0KLVRDREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi0KLVRDREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi0KLVRDREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotCi1UQ0RFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliYmZkLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLQotVENERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotVENERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotVENERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi0KLVRDREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotCi1UQ0RFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi0KLVRDREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKLQotVENERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotCi1UQ0RFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLVRDREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLVRDREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi1UQ0RFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLVRDREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotVENERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggXAotICAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi1UQ0RFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvY29uZmlnL204OGstb3Bjb2RlLmgKLQotVENERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotCi1UQ0RFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaAotCi1UQ0RFUF9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotVENERVBfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0KLVRDREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggXAotICBpdGJsLW9wcy5oCi0KLVRDREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBpdGJsLW9wcy5oIFwKLSAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCi1UQ0RFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi0KLVRDREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotCi1UQ0RFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi0KLVRDREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotCi1UQ0RFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggJChJTkNESVIpL29ic3RhY2suaAotCi1UQ0RFUF9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1UQ0RFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi0KLVRDREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaCAkKElOQ0RJUikvZWxmL3BwYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1UQ0RFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotCi1UQ0RFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotCi1UQ0RFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotCi1UQ0RFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLQotVENERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9lbGYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotVENERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotCi1UQ0RFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotVENERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotVENERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLVRDREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotCi1UQ0RFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLVRDREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotCi1UQ0RFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi0KLVRDREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLVRDREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotVENERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLVRDREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotVENERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi0KLVRDREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi0KLVRDREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKLQotVENERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi0KLVRDREVQX3o4a19jb2ZmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1UQ0RFUF96OGtfZWxmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oIFwKLSAgJChCRkRESVIpL2VsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLQotVENERVBfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmggXAotICAkKEJGRERJUikvc29tLmgKLQotVENERVBfaTM4Nl9tdWx0aSA9ICQoVENERVBfaTM4Nl9jb2ZmKSAkKFRDREVQX2kzODZfZWxmKQotVENERVBfbWlwc19tdWx0aSA9ICQoVENERVBfbWlwc19jb2ZmKSAkKFRDREVQX21pcHNfZWNvZmYpIFwKLSAgJChUQ0RFUF9taXBzX2VsZikKLQotT0JKREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLQotT0JKREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1PQkpERVBfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLQotT0JKREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChCRkRESVIpL3NvbS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotCi1PQkpERVBfaTM4Nl9tdWx0aSA9ICQoT0JKREVQX2kzODZfY29mZikgJChPQkpERVBfaTM4Nl9lbGYpCi1PQkpERVBfbWlwc19tdWx0aSA9ICQoT0JKREVQX21pcHNfY29mZikgJChPQkpERVBfbWlwc19lY29mZikgXAotICAkKE9CSkRFUF9taXBzX2VsZikKLQotREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmgKLQotREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotCi1ERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLURFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oCi0KLURFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmgKLQotREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oCi0KLURFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaAotCi1ERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmgKLQotREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmgKLQotREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmgKLQotREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmgKLQotREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmgKLQotREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCi0KLURFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaAotCi1ERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaAotCi1ERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaAotCi1ERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaAotCi1ERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmgKLQotREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oCi0KLURFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaAotCi1ERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaAotCi1ERVBfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oCi0KLURFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oCi0KLURFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaAotCi1ERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaAotCi1ERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmgKLQotREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmgKLQotREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmgKLQotREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotCi1ERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oCi0KLURFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaAotCi1ERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oCi0KLURFUF9ocHBhX3NvbSA9ICQoQkZERElSKS9zb20uaAotREVQX2kzODZfbXVsdGkgPSAkKERFUF9pMzg2X2NvZmYpICQoREVQX2kzODZfZWxmKQotREVQX21pcHNfbXVsdGkgPSAkKERFUF9taXBzX2NvZmYpICQoREVQX21pcHNfZWNvZmYpIFwKLSAgJChERVBfbWlwc19lbGYpCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gIC5nZGJpbml0Ci1ub2luc3RfUFJPR1JBTVMgPSAgYXMtbmV3JChFWEVFWFQpIGdhc3AtbmV3JChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKG5vaW5zdF9QUk9HUkFNUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotaXRibF90ZXN0X09CSkVDVFMgPSAgaXRibC1wYXJzZS5vIGl0YmwtbGV4Lm8KLWl0YmxfdGVzdF9ERVBFTkRFTkNJRVMgPSAgaXRibC10ZXN0LW9wcy5vIGl0YmwtdGVzdC5vIFwKLS4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotaXRibF90ZXN0X0xERkxBR1MgPSAKLWFzX25ld19PQkpFQ1RTID0gIGFwcC5vIGFzLm8gYXRvZi1nZW5lcmljLm8gYmlnbnVtLWNvcHkubyBjb25kLm8gXAotZGVwZW5kLm8gZHdhcmYyZGJnLm8gZWNvZmYubyBlaG9wdC5vIGV4cHIubyBmbG9udW0tY29weS5vIFwKLWZsb251bS1rb25zdC5vIGZsb251bS1tdWx0Lm8gZnJhZ3MubyBoYXNoLm8gaW5wdXQtZmlsZS5vIGlucHV0LXNjcnViLm8gXAotbGlzdGluZy5vIGxpdGVyYWwubyBtYWNyby5vIG1lc3NhZ2VzLm8gb3V0cHV0LWZpbGUubyByZWFkLm8gc2IubyBcCi1zdGFicy5vIHN1YnNlZ3MubyBzeW1ib2xzLm8gd3JpdGUubwotYXNfbmV3X0xERkxBR1MgPSAKLWdhc3BfbmV3X09CSkVDVFMgPSAgZ2FzcC5vIG1hY3JvLm8gc2IubyBoYXNoLm8KLWdhc3BfbmV3X0xERkxBR1MgPSAKLVNDUklQVFMgPSAgJChub2luc3RfU0NSSVBUUykKLQotTEVYX09VVFBVVF9ST09UID0gQExFWF9PVVRQVVRfUk9PVEAKLUxFWExJQiA9IEBMRVhMSUJACi1ZTFdSQVAgPSAkKHRvcF9zcmNkaXIpLy4uL3lsd3JhcAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENPUFlJTkcgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIFwKLU1ha2VmaWxlLmluIE5FV1MgYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZy9tNjhrLXBhcnNlLmMgXAotY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBnZGJpbml0LmluIGl0YmwtbGV4LmMgaXRibC1wYXJzZS5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGl0YmxfdGVzdF9TT1VSQ0VTKSAkKGFzX25ld19TT1VSQ0VTKSAkKEVYVFJBX2FzX25ld19TT1VSQ0VTKSAkKGdhc3BfbmV3X1NPVVJDRVMpCi1PQkpFQ1RTID0gJChpdGJsX3Rlc3RfT0JKRUNUUykgJChhc19uZXdfT0JKRUNUUykgJChnYXNwX25ld19PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubCAubG8gLm8gLnMgLnkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0uZ2RiaW5pdDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgZ2RiaW5pdC5pbgotCWNkICQodG9wX2J1aWxkZGlyKSAmJiBDT05GSUdfRklMRVM9JEA6Z2RiaW5pdC5pbiBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQktdGVzdCAteiAiJChub2luc3RfUFJPR1JBTVMpIiB8fCBybSAtZiAkKG5vaW5zdF9QUk9HUkFNUykKLQotZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1tYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1pdGJsLXRlc3QkKEVYRUVYVCk6ICQoaXRibF90ZXN0X09CSkVDVFMpICQoaXRibF90ZXN0X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgaXRibC10ZXN0JChFWEVFWFQpCi0JJChMSU5LKSAkKGl0YmxfdGVzdF9MREZMQUdTKSAkKGl0YmxfdGVzdF9PQkpFQ1RTKSAkKGl0YmxfdGVzdF9MREFERCkgJChMSUJTKQotCi1hcy1uZXckKEVYRUVYVCk6ICQoYXNfbmV3X09CSkVDVFMpICQoYXNfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgYXMtbmV3JChFWEVFWFQpCi0JJChMSU5LKSAkKGFzX25ld19MREZMQUdTKSAkKGFzX25ld19PQkpFQ1RTKSAkKGFzX25ld19MREFERCkgJChMSUJTKQotCi1nYXNwLW5ldyQoRVhFRVhUKTogJChnYXNwX25ld19PQkpFQ1RTKSAkKGdhc3BfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZ2FzcC1uZXckKEVYRUVYVCkKLQkkKExJTkspICQoZ2FzcF9uZXdfTERGTEFHUykgJChnYXNwX25ld19PQkpFQ1RTKSAkKGdhc3BfbmV3X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoTEVYKSAkKEFNX0xGTEFHUykgJChMRkxBR1MpICQ8ICYmIG12ICQoTEVYX09VVFBVVF9ST09UKS5jICRACi0ueS5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCi1jb25maWcvbTY4ay1wYXJzZS5oOiBjb25maWcvbTY4ay1wYXJzZS5jCi1pdGJsLXBhcnNlLmg6IGl0YmwtcGFyc2UuYwotCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1ERUpBVE9PTCA9ICQoUEFDS0FHRSkKLQotUlVOVEVTVERFRkFVTFRGTEFHUyA9IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHNyY2Rpcgotc2l0ZS5leHA6IE1ha2VmaWxlCi0JQGVjaG8gJ01ha2luZyBhIG5ldyBzaXRlLmV4cCBmaWxlLi4uJwotCUB0ZXN0ICEgLWYgc2l0ZS5iYWsgfHwgcm0gLWYgc2l0ZS5iYWsKLQlAZWNobyAnIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjJyA+ICRALXQKLQlAZWNobyAnIyBEbyBub3QgZWRpdCBoZXJlLiAgSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzJyA+PiAkQC10Ci0JQGVjaG8gJyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0b29sICQoREVKQVRPT0wpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBzcmNkaXIgJChzcmNkaXIpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBvYmpkaXInIGBwd2RgID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfYWxpYXMgJChob3N0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF90cmlwbGV0ICQoaG9zdF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X2FsaWFzICQodGFyZ2V0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X3RyaXBsZXQgJCh0YXJnZXRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX2FsaWFzICQoYnVpbGRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gTm90IEVkaXQgIyMnID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IHNlZCAnMSwvXiMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlLiojIy8gZCcgc2l0ZS5leHAgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgbXYgc2l0ZS5leHAgc2l0ZS5iYWsKLQlAbXYgJEAtdCBzaXRlLmV4cAotaW5mby1hbToKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06Ci1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLURFSkFHTlUKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoU0NSSVBUUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIml0YmwtbGV4bGNvbmZpZy9tNjhrLXBhcnNlaGNvbmZpZy9tNjhrLXBhcnNlY2l0YmwtcGFyc2VoaXRibC1wYXJzZWMiIHx8IHJtIC1mIGl0YmwtbGV4bCBjb25maWcvbTY4ay1wYXJzZWggY29uZmlnL202OGstcGFyc2VjIGl0YmwtcGFyc2VoIGl0YmwtcGFyc2VjCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdFBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgXAotCQljbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCi0JCW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1jbGVhbi1ub2luc3RQUk9HUkFNUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBcCi1kdmktcmVjdXJzaXZlIG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCi1pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0kKHNyY2RpcikvbWFrZS1nYXMuY29tOiBzdGFtcC1tay5jb20KLXN0YW1wLW1rLmNvbTogdm1zY29uZi5zaCBNYWtlZmlsZQotCXNoICQoc3JjZGlyKS92bXNjb25mLnNoICQoR0VORVJJQ19PQkpTKSA+IG5ldy1tYWtlLmNvbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBuZXctbWFrZS5jb20gJChzcmNkaXIpL21ha2UtZ2FzLmNvbQotCXRvdWNoIHN0YW1wLW1rLmNvbQotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi0kKE9CSlMpOiBAQUxMX09CSl9ERVBTQAotCi0jIFN0dWZmIHRoYXQgZXZlcnkgb2JqZWN0IGZpbGUgZGVwZW5kcyB1cG9uLiAgSWYgYW55dGhpbmcgaXMgcmVtb3ZlZAotIyBmcm9tIHRoaXMgbGlzdCwgcmVtb3ZlIGl0IGZyb20gZGVwLWluLnNlZCBhcyB3ZWxsLgotJChPQkpTKTogY29uZmlnLmggYXMuaCAkKFRBUkdfRU5WX0gpICQoT0JKX0ZPUk1BVF9IKSAkKFRBUkdfQ1BVX0gpIGZsb251bS5oIFwKLQlleHByLmggd3JpdGUuaCBmcmFncy5oIGhhc2guaCByZWFkLmggc3ltYm9scy5oIHRjLmggXAotCW9iai5oIGxpc3RpbmcuaCBiaWdudW0uaCBiaXRfZml4LmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGFzaW50bC5oCi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0JaWYgWyAtZCB0ZXN0c3VpdGUgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICBta2RpciB0ZXN0c3VpdGU7IFwKLQlmaQotCXJtIC1mIHRlc3RzdWl0ZS9zaXRlLmV4cAotCWNwIHNpdGUuZXhwIHRlc3RzdWl0ZS9zaXRlLmV4cAotCXJvb3RtZT1gcHdkYDsgZXhwb3J0IHJvb3RtZTsgXAotCXNyY2Rpcj1gY2QgJHtzcmNkaXJ9OyBwd2RgIDsgZXhwb3J0IHNyY2RpciA7IFwKLQlFWFBFQ1Q9JHtFWFBFQ1R9IDsgZXhwb3J0IEVYUEVDVCA7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQljZCB0ZXN0c3VpdGU7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFRoZSBpbXBsaWNpdCAuYy5vIHJ1bGUgZG9lc24ndCB3b3JrIGZvciB0aGVzZSwgcGVyaGFwcyBiZWNhdXNlIG9mCi0jIHRoZSB2YXJpYWJsZXMsIG9yIHBlcmhhcHMgYmVjYXVzZSB0aGUgc291cmNlcyBhcmUgbm90IG9uIHZwYXRoLgotJChUQVJHX0NQVV9PKTogJChUQVJHX0NQVV9DKSAkKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkKLQkkKENPTVBJTEUpIC1jICQoVEFSR19DUFVfQykKLSQoQVRPRl9UQVJHX08pOiAkKEFUT0ZfVEFSR19DKQotCSQoQ09NUElMRSkgLWMgJChBVE9GX1RBUkdfQykKLQotIyBlY29mZi5jIG9ubHkgaGFzIGZ1bGwgZGVwZW5kZW5jaWVzIHdoZW4gRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQsCi0jIHNvIHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeSBzdHVmZiBkb2Vzbid0IHdvcmsuCi1lY29mZi5vIDogZWNvZmYuYyBlY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotCSQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0JJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaAotCi0jIFdlIG5lZWQgYWxsIHRoZXNlIGV4cGxpY2l0IHJ1bGVzIGZvciB0aGUgbXVsdGkgc3R1ZmYuICBCZWNhdXNlIG9mCi0jIHRoZXNlIHJ1bGVzLCB3ZSBkb24ndCBuZWVkIG9uZSBmb3IgT0JKX0ZPUk1BVF9PLgotCi1vYmotYW91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKLW9iai1ib3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYwotb2JqLWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKLW9iai1lY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotb2JqLWVsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi1vYmotZXZheC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKLW9iai1ocDMwMC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotb2JqLWllZWUubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCi1vYmotbXVsdGkubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLW9iai1zb20ubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotb2JqLXZtcy5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0KLWUtbWlwc2VsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotZS1taXBzZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotZS1pMzg2ZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2ZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1pMzg2ZWxmLmMKLQotIyBJZiBtNjhrLXBhcnNlLnkgaXMgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LCB0aGVuIHlsd3JhcCB3aWxsIHVzZSBhbgotIyBhYnNvbHV0ZSBwYXRoIHdoZW4gaXQgaW52b2tlcyB5YWNjLCB3aGljaCB3aWxsIGNhdXNlIHlhY2MgdG8gcHV0IHRoZQotIyBhYnNvbHV0ZSBwYXRoIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiAgVGhhdCdzIGEgcGFpbiB3aGVuIGl0IGNvbWVzCi0jIHRvIGdlbmVyYXRpbmcgc25hcHNob3RzLCBiZWNhdXNlIGl0IGludHJvZHVjZXMgc3B1cmlvdXMgZGlmZnMuCi0jIFNpbmNlIHdoZW4gd2UgbWFrZSB0aGUgc25hcHNob3RzICQoc3JjZGlyKSA9ICIuIiwgd2UgY2hlY2sgZm9yIHRoYXQKLSMgY2FzZSBhbmQgaGFuZGxlIGl0IGRpZmZlcmVudGx5LiAgVGhpcyBtZWFucyB0aGF0IGFueWJvZHkgd2hvCi0jIGNvbmZpZ3VyZXMgd2l0aCAkKHNyY2RpcikgPSAiLiIgd2lsbCBoYXZlIHRvIHNldCB0aGVpciBwYXRoIGluIHRoZQotIyBkZWJ1Z2dlciBpZiB0aGV5IHdhbnQgdG8gZGVidWcgbTY4ay1wYXJzZS55LiAgVGhpcyBpcyBiYWQsIGJ1dCBvbgotIyB0aGUgb3RoZXIgaGFuZCBpdCdzIGdvb2QgdGhhdCBwZW9wbGUgd2hvIHVzZSB0aGUgcHJlYnVpbHQKLSMgbTY4ay1wYXJzZS5jIGRvbid0IGdldCBhIHNwdXJpb3VzIGFic29sdXRlIHBhdGguCi1tNjhrLXBhcnNlLmM6ICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55Ci0JZj0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueTsgXAotCWlmIFsgJCRmID0gIi4vY29uZmlnL202OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBsbiAtcyBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGxuIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgY3AgY29uZmlnL202OGstcGFyc2UueSAuID4vZGV2L251bGwgMj4vZGV2L251bGw7IFwKLQkgIGY9bTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaTsgXAotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJCRmIHkudGFiLmMgbTY4ay1wYXJzZS5jIC0tOyBcCi0JaWYgWyAkJGYgPSAibTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIHJtIC1mIG02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmkKLW02OGstcGFyc2UubzogbTY4ay1wYXJzZS5jICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLSMgRG9uJ3QgbGV0IHRoZSAueS5oIHJ1bGUgY2xvYmJlciBtNjhrLXBhcnNlLmguCi1tNjhrLXBhcnNlLmg6IDsgQHRydWUKLSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0KLSMgVGhlIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gbGV4aWNhbCBhbmFseXplciBhbmQgcGFyc2VyLgotCi1pdGJsLWxleC5jOiAkKHNyY2RpcikvaXRibC1sZXgubAotaXRibC1sZXgubzogaXRibC1sZXguYyBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5vOiBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0KLWl0Ymwtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oOiAkKHNyY2RpcikvaXRibC1wYXJzZS55Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvaXRibC1wYXJzZS55IHkudGFiLmMgaXRibC1wYXJzZS5jIHkudGFiLmggaXRibC1wYXJzZS5oIC0tIC1kCi0KLWl0YmwtdGVzdC1vcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0JJChDT01QSUxFKSAtbyBpdGJsLXRlc3Qtb3BzLm8gLURTVEFORF9BTE9ORSAtYyAkKHNyY2RpcikvaXRibC1vcHMuYwotCi1pdGJsLXRlc3QubzogJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0JJChDT01QSUxFKSAtYyAtRFNUQU5EX0FMT05FICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYwotCi1jZ2VuLm86IGNnZW4uYyBjZ2VuLmggY2dlbi1kZXNjLmggc3Vic2Vncy5oIFwKLQkkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktb3BjLmgKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1kYXRhLWxvY2FsCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1iaW5kaXIgaW5zdGFsbC1leGVjLXRvb2xkaXIKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBpbnN0YWxsLWV4ZWMtYmluZGlyIEBpbnN0YWxsX3Rvb2xkaXJACi0KLWluc3RhbGwtZXhlYy1iaW5kaXI6ICQobm9pbnN0X1BST0dSQU1TKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLWluc3RhbGwtZXhlYy10b29sZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCi0Jbj1gZWNobyBhcyB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICAgIHx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pIGFzLW5ldyQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKTsgXAotCWVsc2UgXAotCSAgdHJ1ZSA7IFwKLQlmaQotCi0jIFRoZXNlIGV4aXN0IGZvciBtYWludGVuYW5jZSBwdXJwb3Nlcy4KLQotLlBIT05ZOiBib290c3RyYXAgYm9vdHN0cmFwMiBib290c3RyYXAzIHN0YWdlMSBzdGFnZTIgc3RhZ2UzIGNvbXBhcmlzb24KLQotYm9vdHN0cmFwOiBhcy1uZXcKLQkkKE1BS0UpIHN0YWdlMQotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDI6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UxIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBzdGFnZTIKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotYm9vdHN0cmFwMzoKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotIyBDb3B5IHRoZSBvYmplY3QgZmlsZXMgZnJvbSBhIHBhcnRpY3VsYXIgc3RhZ2UgaW50byBhIHN1YmRpcmVjdG9yeS4KLXN0YWdlMToKLQktbWtkaXIgc3RhZ2UxCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UxCi0JaWYgWyAtZiBzdGFnZTEvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UxL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTEgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UyOgotCS1ta2RpciBzdGFnZTIKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTIKLQlpZiBbIC1mIHN0YWdlMi9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTIvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMiA7IGxuIC1zIGFzLW5ldyQoRVhFRVhUKSBhcyQoRVhFRVhUKSkgOyBmaQotCi1zdGFnZTM6Ci0JLW1rZGlyIHN0YWdlMwotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMwotCWlmIFsgLWYgc3RhZ2UzL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMy9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UzIDsgbG4gLXMgYXMtbmV3IGFzJChFWEVFWFQpKSA7IGZpCi0KLSMgVGhpcyBydWxlIGlzIGRlcml2ZWQgZnJvbSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gdGhlIE1ha2VmaWxlLmluIGZvciBnY2MuCi0jIFRoZSAidGFpbCArMTZjIiBpcyB0byBieXBhc3MgaGVhZGVycyB3aGljaCBtYXkgaW5jbHVkZSB0aW1lc3RhbXBzIG9yCi0jIHRlbXBvcmFyeSBhc3NlbWJseSBmaWxlIG5hbWVzLgotY29tcGFyaXNvbjoKLQl4PTAgOyBcCi0JZm9yIGZpbGUgaW4gKi5vIDsgZG8gXAotCSAgdGFpbCArMTZjIC4vJCRmaWxlID4gdG1wLWZvbzE7IFwKLQkgIGlmIHRhaWwgKzE2YyAke2FnYWluc3R9LyQkZmlsZSA+IHRtcC1mb28yIDI+L2Rldi9udWxsIDsgdGhlbiBcCi0JICAgIGlmIGNtcCB0bXAtZm9vMSB0bXAtZm9vMiA7IHRoZW4gXAotCSAgICAgIHRydWUgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGVjaG8gJCRmaWxlIGRpZmZlcnMgOyBcCi0JICAgICAgeD0xIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgdHJ1ZTsgZmkgOyBcCi0JZG9uZSA7IFwKLQlleGl0ICQkeAotCS1ybSAtZiB0bXAtZm9vKgotCi0uUEhPTlk6IGRlLXN0YWdlMSBkZS1zdGFnZTIgZGUtc3RhZ2UzCi0KLWRlLXN0YWdlMToKLQktIChjZCBzdGFnZTEgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTEKLQotZGUtc3RhZ2UyOgotCS0gKGNkIHN0YWdlMiA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMgotCi1kZS1zdGFnZTM6Ci0JLSAoY2Qgc3RhZ2UzIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UzCi0KLS5kZXA6IGRlcC5zZWQgJChERVBfRklMRV9ERVBTKSAudGNkZXAgLm9iamRlcCAuZGVwMgotCXJtIC1mIC5kZXAxCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQkkKE1BS0UpIERFUD0kKERFUCkgc3JjZGlyPSQke3NyY2Rpcn0gVlBBVEg9JCR7c3JjZGlyfSAuZGVwMQotCXJtIC1yZiAuZGVwZGlyCi0Jc2VkIC1mIGRlcC5zZWQgPCAuZGVwMSA+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAudGNkZXAgPj4gLmRlcGEKLQlzZWQgLWYgZGVwLnNlZCA8IC5vYmpkZXAgPj4gLmRlcGEKLQlzZWQgLWYgZGVwLnNlZCA8IC5kZXAyID4+IC5kZXBhCi0JZWNobyAnJCQoT0JKUyk6ICQkKERFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gLmRlcGEKLQllY2hvICckJChUQVJHX0NQVV9PKTogJCQoVENERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IC5kZXBhCi0JZWNobyAnJCQoT0JKX0ZPUk1BVF9PKTogJCQoT0JKREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiAuZGVwYQotCWVjaG8gJyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWScgPj4gLmRlcGEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcGEgLmRlcAotCi0jIFRoaXMgcnVsZSBuZWVkcyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi0uZGVwMTogJChDRklMRVMpICQoTVVMVElfQ0ZJTEVTKQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQllY2hvICcnID4gdGFyZy1jcHUuaDsgXAotCWVjaG8gJycgPiBvYmotZm9ybWF0Lmg7IFwKLQllY2hvICcnID4gdGFyZy1lbnYuaDsgXAotCWVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JZWNobyAnJyA+IGl0YmwtcGFyc2UuaDsgXAotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpICQ/Ci0Jc2VkIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyA8IC5kZXBkaXIvLmRlcCA+IC5kZXAxCi0Jcm0gLWYgLmRlcGRpci8uZGVwCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgdGMtKi5jIGZpbGVzLgotLnRjZGVwOiAkKFRBUkdFVF9DUFVfQ0ZJTEVTKQotCXJtIC1mIC50Y2RlcGEKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIkJHtjfSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvdGMtJCR7Y30uYyBkdW1teS5jOyBcCi0JICAgICAgZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwOyBcCi0JICAgICAgJChERVApIC1mIC5kZXAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgZHVtbXkuYzsgXAotCSAgICAgIHNlZCAtZSAicy9kdW1teS5vOiBkdW1teS5jL1RDREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy50Y2RlcGE7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnVENERVBfaHBwYV9zb20gPSAkJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggc3Vic2Vncy5oIFwnID4+IC50Y2RlcGEKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IC50Y2RlcGEKLQllY2hvICcgICQkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaCAkJChCRkRESVIpL3NvbS5oJyA+PiAudGNkZXBhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdUQ0RFUF8nIiQke2N9IidfbXVsdGkgPSBcJyA+PiAudGNkZXBhOyBcCi0JICAgIGVjaG8gJyQkKFRDREVQXyciJCR7Y30iJ19jb2ZmKSBcJyA+PiAudGNkZXBhOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoVENERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiAudGNkZXBhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoVENERVBfJyIkJHtjfSInX2VsZiknID4+IC50Y2RlcGE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgLnRjZGVwYSAudGNkZXAKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBvYmotKi5jIGZpbGVzLgotLm9iamRlcDogJChPQkpfRk9STUFUX0NGSUxFUykKLQlybSAtZiAub2JqZGVwYQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IG9iai1mb3JtYXQuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0ZS1nZW5lcmljLmgiJyA+IHRhcmctZW52Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1jcHUuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvb2JqLSQke299LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9PQkpERVBfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLm9iamRlcGE7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnT0JKREVQX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcJyA+PiAub2JqZGVwYQotCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gLm9iamRlcGEKLQllY2hvICcgICQkKEJGRERJUikvc29tLmggICQkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwnID4+IC5vYmpkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL2FvdXQvc3RhYi5kZWYnID4+IC5vYmpkZXBhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdPQkpERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLm9iamRlcGE7IFwKLQkgICAgZWNobyAnJCQoT0JKREVQXyciJCR7Y30iJ19jb2ZmKSBcJyA+PiAub2JqZGVwYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC5vYmpkZXBhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoT0JKREVQXyciJCR7Y30iJ19lbGYpJyA+PiAub2JqZGVwYTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiAub2JqZGVwYSAub2JqZGVwCi0KLSMgV29yayBvdXQgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBDUFUvT0JKIGNvbWJpbmF0aW9uLgotIyBOb3RlIHRoYXQgU09NIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlIGl0IG9ubHkgd29ya3MgbmF0aXZlLgotLmRlcDI6ICQoVEFSR0VUX0NQVV9IRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpCi0Jcm0gLWYgLmRlcDJhCi0JaWYgWyAtZCAuZGVwZGlyIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAuZGVwZGlyOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgLmRlcGRpcjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9ERVBfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLmRlcDJhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnREVQX2hwcGFfc29tID0gJCQoQkZERElSKS9zb20uaCcgPj4gLmRlcDJhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLmRlcDJhOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLmRlcDJhOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19lY29mZikgXCcgPj4gLmRlcDJhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19lbGYpJyA+PiAuZGVwMmE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgLmRlcDJhIC5kZXAyCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZCBcCi0JCS1lICJzIUBJTkNESVJAISQke3NyY2Rpcn0vLi4vaW5jbHVkZSEiIFwKLQkJLWUgInMhQEJGRERJUkAhJCR7c3JjZGlyfS8uLi9iZmQhIiBcCi0JCS1lICJzIUBTUkNESVJAISQke3NyY2Rpcn0hIgotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWFwcC5vOiBhcHAuYwotYXMubzogYXMuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBvdXRwdXQtZmlsZS5oIFwKLSAgc2IuaCBtYWNyby5oCi1hdG9mLWdlbmVyaWMubzogYXRvZi1nZW5lcmljLmMKLWJpZ251bS1jb3B5Lm86IGJpZ251bS1jb3B5LmMKLWNvbmQubzogY29uZC5jIG1hY3JvLmggc2IuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1kZXBlbmQubzogZGVwZW5kLmMKLWR3YXJmMmRiZy5vOiBkd2FyZjJkYmcuYyBkd2FyZjJkYmcuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKLWVjb2ZmLm86IGVjb2ZmLmMgZWNvZmYuaAotZWhvcHQubzogZWhvcHQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1leHByLm86IGV4cHIuYyAkKElOQ0RJUikvb2JzdGFjay5oCi1mbG9udW0tY29weS5vOiBmbG9udW0tY29weS5jCi1mbG9udW0ta29uc3QubzogZmxvbnVtLWtvbnN0LmMKLWZsb251bS1tdWx0Lm86IGZsb251bS1tdWx0LmMKLWZyYWdzLm86IGZyYWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLWhhc2gubzogaGFzaC5jICQoSU5DRElSKS9vYnN0YWNrLmgKLWlucHV0LWZpbGUubzogaW5wdXQtZmlsZS5jIGlucHV0LWZpbGUuaAotaW5wdXQtc2NydWIubzogaW5wdXQtc2NydWIuYyBpbnB1dC1maWxlLmggc2IuaAotbGlzdGluZy5vOiBsaXN0aW5nLmMgaW5wdXQtZmlsZS5oIHN1YnNlZ3MuaAotbGl0ZXJhbC5vOiBsaXRlcmFsLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLW1hY3JvLm86IG1hY3JvLmMgc2IuaCBtYWNyby5oCi1tZXNzYWdlcy5vOiBtZXNzYWdlcy5jCi1vdXRwdXQtZmlsZS5vOiBvdXRwdXQtZmlsZS5jIG91dHB1dC1maWxlLmgKLXJlYWQubzogcmVhZC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIHNiLmggbWFjcm8uaCBcCi0gIGVjb2ZmLmgKLXNiLm86IHNiLmMgc2IuaAotc3RhYnMubzogc3RhYnMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3Vic2Vncy5vOiBzdWJzZWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLXN5bWJvbHMubzogc3ltYm9scy5jICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oIFwKLSAgc3RydWMtc3ltYm9sLmgKLXdyaXRlLm86IHdyaXRlLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaAotZ2FzcC5vOiBnYXNwLmMgc2IuaCBtYWNyby5oCi1pdGJsLW9wcy5vOiBpdGJsLW9wcy5jIGl0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi1lLW1pcHNlY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMgZW11bC5oIFwKLSAgZW11bC10YXJnZXQuaAotZS1taXBzZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMgZW11bC5oIGVtdWwtdGFyZ2V0LmgKLSQoT0JKUyk6ICQoREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoVEFSR19DUFVfTyk6ICQoVENERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotJChPQkpfRk9STUFUX08pOiAkKE9CSkRFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ2FzL05FV1MgYi9nYXMvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxN2Q1OC4uMDAwMDAwMAotLS0gYS9nYXMvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0tKi0gdGV4dCAtKi0KLQotQ2hhbmdlcyBpbiAyLjEwOgotCi1TdXBwb3J0IGZvciB0aGUgTW90b3JvbGxhIE1Db3JlIDIxMCBwcm9jZXNzb3IgYWRkZWQuCi0KLUEgbmV3IHBzZXVkby1vcCAuaW50ZWxfc3ludGF4IGhhcyBiZWVuIGltcGxlbWVudGVkIHRvIGFsbG93IGdhcyB0byBwYXJzZSBpMzg2IGFzc2VtYmx5Ci1wcm9ncmFtcyB3aXRoIGludGVsIHN5bnRheC4KLQotTmV3IHBzZXVkby1vcHMgLmZ1bmMsLmVuZGZ1bmMgdG8gYWlkIGluIGRlYnVnZ2luZyB1c2VyLXdyaXR0ZW4gYXNzZW1ibGVyIGNvZGUuCi0KLUZ1bGwgMTYtYml0IG1vZGUgc3VwcG9ydCBmb3IgaTM4Ni4KLQotR3JlYXRseSBpbXByb3ZlZCBpbnN0cnVjdGlvbiBvcGVyYW5kIGNoZWNraW5nIGZvciBpMzg2LiAgVGhpcyBjaGFuZ2Ugd2lsbAotcHJvZHVjZSBlcnJvcnMgb3Igd2FybmluZ3Mgb24gaW5jb3JyZWN0IGFzc2VtYmx5IGNvZGUgdGhhdCBwcmV2aW91cyB2ZXJzaW9ucyBvZgotZ2FzIGFjY2VwdGVkLiAgSWYgeW91IGdldCB1bmV4cGVjdGVkIG1lc3NhZ2VzIGZyb20gY29kZSB0aGF0IHdvcmtlZCB3aXRoIG9sZGVyCi12ZXJzaW9ucyBvZiBnYXMsIHBsZWFzZSBkb3VibGUgY2hlY2sgdGhlIGNvZGUgYmVmb3JlIHJlcG9ydGluZyBhIGJ1Zy4KLQotV2VhayBzeW1ib2wgc3VwcG9ydCBhZGRlZCBmb3IgQ09GRiB0YXJnZXRzLgotCi1NaXRzdWJpc2hpIEQzMFYgc3VwcG9ydCBhZGRlZC4KLQotVGV4YXMgSW5zdHJ1bWVudHMgYzgwICh0bXMzMjBjODApIHN1cHBvcnQgYWRkZWQuCi0KLWk5NjAgRUxGIHN1cHBvcnQgYWRkZWQuCi0KLUNoYW5nZXMgaW4gMi45OgotCi1UZXhhcyBJbnN0cnVtZW50cyBjMzAgKHRtczMyMGMzMCkgc3VwcG9ydCBhZGRlZC4KLQotVGhlIGFzc2VtYmxlciBub3cgb3B0aW1pemVzIHRoZSBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IGVnY3MKLWFuZCBnY2MgMi44LiAgVGhlIG5ldyAtLXRyYWRpdGlvbmFsLWZvcm1hdCBvcHRpb24gZGlzYWJsZXMgdGhpcyBvcHRpbWl6YXRpb24uCi0KLUFkZGVkIC0tZ3N0YWJzIG9wdGlvbiB0byBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLVRoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBtIChlLmcuLCAtYWxtKSB0byBleHBhbmQgbWFjcm9zIGluIGEKLWxpc3RpbmcuCi0KLUFkZGVkIC1NRCBvcHRpb24gdG8gcHJpbnQgZGVwZW5kZW5jaWVzLgotCi1DaGFuZ2VzIGluIDIuODoKLQotQmVPUyBzdXBwb3J0IGFkZGVkLgotCi1NSVBTMTYgc3VwcG9ydCBhZGRlZC4KLQotTW90b3JvbGEgQ29sZEZpcmUgNTIwMCBzdXBwb3J0IGFkZGVkIChjb25maWd1cmUgZm9yIG02OGsgYW5kIHVzZSAtbTUyMDApLgotCi1BbHBoYS9WTVMgc3VwcG9ydCBhZGRlZC4KLQotbTY4ayBvcHRpb25zIC0tYmFzZS1zaXplLWRlZmF1bHQtMTYsIC0tYmFzZS1zaXplLWRlZmF1bHQtMzIsCi0tLWRpc3Atc2l6ZS1kZWZhdWx0LTE2LCBhbmQgLS1kaXNwLXNpemUtZGVmYXVsdC0zMiBhZGRlZC4KLQotVGhlIGFsaWdubWVudCBkaXJlY3RpdmVzIG5vdyB0YWtlIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUKLW1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcKLW1vcmUgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4KLQotVGhlIEVMRiBhc3NlbWJsZXIgaGFzIGEgbmV3IHBzZXVkby1vcCwgLnN5bXZlciwgdXNlZCBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCi0KLVRoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBjIChlLmcuLCAtYWxjKSwgdG8gc2tpcCBmYWxzZSBjb25kaXRpb25hbHMKLWluIGxpc3RpbmdzLgotCi1BZGRlZCBuZXcgcHNldWRvLW9wLCAuZXF1aXY7IGl0J3MgbGlrZSAuZXF1LCBleGNlcHQgdGhhdCBpdCBpcyBhbiBlcnJvciBpZiB0aGUKLXN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLUNoYW5nZXMgaW4gMi43OgotCi1UaGUgUG93ZXJQQyBhc3NlbWJsZXIgbm93IGFsbG93cyB0aGUgdXNlIG9mIHN5bWJvbGljIHJlZ2lzdGVyIG5hbWVzIChyMCwgZXRjLikKLWlmIC1tcmVnbmFtZXMgaXMgdXNlZC4gIFN5bWJvbGljIG5hbWVzIHByZWNlZGVkIGJ5IGEgJyUnICglcjAsIGV0Yy4pIGNhbiBiZQotdXNlZCBhbnkgdGltZS4gIFBvd2VyUEMgODYwIG1vdmUgdG8vZnJvbSBTUFIgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBhZGRlZC4KLQotQWxwaGEgTGludXggKEVMRikgc3VwcG9ydCBhZGRlZC4KLQotUG93ZXJQQyBFTEYgc3VwcG9ydCBhZGRlZC4KLQotbTY4ayBMaW51eCAoRUxGKSBzdXBwb3J0IGFkZGVkLgotCi1pOTYwIEh4L0p4IHN1cHBvcnQgYWRkZWQuCi0KLWkzODYvUG93ZXJQQyBnbnUtd2luMzIgc3VwcG9ydCBhZGRlZC4KLQotU0NPIEVMRiBzdXBwb3J0IGFkZGVkLiAgRm9yIE9wZW5TZXJ2ZXIgNSB0YXJnZXRzIChpMzg2LXVua25vd24tc2NvMy4ydjUpIHRoZQotZGVmYXVsdCBpcyB0byBidWlsZCBDT0ZGLW9ubHkgc3VwcG9ydC4gIFRvIGdldCBhIHNldCBvZiB0b29scyB0aGF0IGdlbmVyYXRlIEVMRgotKHRoZXknbGwgdW5kZXJzdGFuZCBib3RoIENPRkYgYW5kIEVMRiksIHlvdSBtdXN0IGNvbmZpZ3VyZSB3aXRoCi10YXJnZXQ9aTM4Ni11bmtub3duLXNjbzMuMnY1ZWxmLgotCi1tODhrLW1vdG9yb2xhLXN5c3YzKiBzdXBwb3J0IGFkZGVkLgotCi1DaGFuZ2VzIGluIDIuNjoKLQotR2FzIG5vdyBkaXJlY3RseSBzdXBwb3J0cyBtYWNyb3MsIHdpdGhvdXQgcmVxdWlyaW5nIEdBU1AuCi0KLUdhcyBub3cgaGFzIGFuIE1SSSBhc3NlbWJsZXIgY29tcGF0aWJpbGl0eSBtb2RlLiAgVXNlIC1NIG9yIC0tbXJpIHRvIHNlbGVjdCBNUkkKLW1vZGUuICBUaGUgcHNldWRvLW9wIGBgLm1yaSAxJycgd2lsbCBzd2l0Y2ggaW50byB0aGUgTVJJIG1vZGUgdW50aWwgdGhlIGBgLm1yaQotMCcnIGlzIHNlZW47IHRoaXMgY2FuIGJlIGNvbnZlbmllbnQgZm9yIGlubGluZSBhc3NlbWJsZXIgY29kZS4KLQotQWRkZWQgLS1kZWZzeW0gU1lNPVZBTFVFIG9wdGlvbi4KLQotQWRkZWQgLW1pcHM0IHN1cHBvcnQgdG8gTUlQUyBhc3NlbWJsZXIuCi0KLUFkZGVkIFBJQyBzdXBwb3J0IHRvIFNvbGFyaXMgYW5kIFNQQVJDIFN1bk9TIDQgYXNzZW1ibGVyLgotCi1DaGFuZ2VzIGluIDIuNDoKLQotQ29udmVydGVkIHRoaXMgZGlyZWN0b3J5IHRvIHVzZSBhbiBhdXRvY29uZi1nZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdC4KLQotQVJNIHN1cHBvcnQsIGZyb20gUmljaGFyZCBFYXJuc2hhdy4KLQotVXBkYXRlZCBWTVMgc3VwcG9ydCwgZnJvbSBQYXQgUmFua2luLCBpbmNsdWRpbmcgY29uc2lkZXJhYmx5IGltcHJvdmVkIGRlYnVnZ2luZwotc3VwcG9ydC4KLQotU3VwcG9ydCBmb3IgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzIGluIHRoZSA2ODA2MC4KLQotSGFuZGxlcyAoaWdub3JlcykgYSBuZXcgZGlyZWN0aXZlICIudGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLCB0bwotcHJvdmlkZSBmb3IgcG9zc2libGUgZnV0dXJlIGdjYyBjaGFuZ2VzLCBmb3IgdGFyZ2V0cyB3aGVyZSBnYXMgcHJvdmlkZXMgc29tZQotZmVhdHVyZXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbmF0aXZlIGFzc2VtYmxlci4gIElmIHRoZSBuYXRpdmUgYXNzZW1ibGVyIGlzCi11c2VkLCBpdCBzaG91bGQgYmVjb21lIG9idmlvdXMgcHJldHR5IHF1aWNrbHkgd2hhdCB0aGUgcHJvYmxlbSBpcy4KLQotVXNhZ2UgbWVzc2FnZSBpcyBhdmFpbGFibGUgd2l0aCAiLS1oZWxwIi4KLQotVGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yIChnYXNwKSBpcyBpbmNsdWRlZC4gIChBY3R1YWxseSwgaXQgd2FzIGluIDIuMwotYWxzbywgYnV0IGRpZG4ndCBnZXQgaW50byB0aGUgTkVXUyBmaWxlLikKLQotV2VhayBzeW1ib2wgc3VwcG9ydCBmb3IgYS5vdXQuCi0KLUEgYnVnIGluIHRoZSBsaXN0aW5nIGNvZGUgd2hpY2ggY291bGQgY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBoYXMgYmVlbiBmaXhlZC4KLUJ1Z3MgaW4gbGlzdGluZ3Mgd2hlbiBnZW5lcmF0aW5nIGEgQ09GRiBvYmplY3QgZmlsZSBoYXZlIGFsc28gYmVlbiBmaXhlZC4KLQotSW5pdGlhbCBpMzg2LXN2cjQgUElDIGltcGxlbWVudGF0aW9uIGZyb20gRXJpYyBZb3VuZ2RhbGUsIGJhc2VkIG9uIGNvZGUgYnkgUGF1bAotS3JhbmVuYnVyZy4KLQotSW1wcm92ZWQgQWxwaGEgc3VwcG9ydC4gIEltbWVkaWF0ZSBjb25zdGFudHMgY2FuIGhhdmUgYSBtdWNoIGxhcmdlciByYW5nZSBub3cuCi1TdXBwb3J0IGZvciB0aGUgMjExNjQgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgRGlnaXRhbC4KLQotVXBkYXRlZCBuczMyayAocGM1MzItbWFjaCwgbmV0YnNkNTMyKSBzdXBwb3J0IGZyb20gSWFuIERhbGwuCi0KLUNoYW5nZXMgaW4gMi4zOgotCi1NYWNoIGkzODYgc3VwcG9ydCwgYnkgRGF2aWQgTWFja2VuemllIGFuZCBLZW4gUmFlYnVybi4KLQotUlMvNjAwMCBhbmQgUG93ZXJQQyBzdXBwb3J0IGJ5IElhbiBUYXlsb3IuCi0KLVZNUyBjb21tYW5kIHNjcmlwdHMgKG1ha2UtZ2FzLmNvbSwgY29uZmlnLWdhcy5jb20pIGhhdmUgYmVlbiB3b3JrZWQgb24gYSBiaXQsCi1iYXNlZCBvbiBtYWlsIHJlY2VpdmVkIGZyb20gdmFyaW91cyBwZW9wbGUuICBUaGUgYC1oIycgb3B0aW9uIHNob3VsZCB3b3JrIGFnYWluCi10b28uCi0KLUhQLVBBIHdvcmssIGJ5IEplZmYgTGF3LiAgTm90ZSwgZm9yIHRoZSBQQSwgZ2FzLTIuMyBoYXMgYmVlbiBkZXNpZ25lZCB0byB3b3JrCi13aXRoIGdkYi00LjEyIGFuZCBnY2MtMi42LiAgQXMgZ2NjLTIuNiBoYXMgbm90IGJlZW4gcmVsZWFzZWQgeWV0LCBhIHNwZWNpYWwKLXZlcnNpb24gb2YgZ2NjLTIuNS44IGhhcyBiZWVuIHBhdGNoZWQgdG8gd29yayB3aXRoIGdhcy0yLjMuICBZb3UgY2FuIHJldHJpZXZlCi10aGlzIHNwZWNpYWwgdmVyc2lvbiBvZiBnY2MtMi41LjggdmlhIGFub255bW91cyBmdHAgZnJvbSBqYWd1YXIuY3MudXRhaC5lZHUKLWluIHRoZSAiZGlzdCIgZGlyZWN0b3J5LgotCi1WYXggc3VwcG9ydCBpbiBnYXMgZml4ZWQgZm9yIEJTRCwgc28gaXQgYnVpbGRzIGFuZCBzZWVtcyB0byBydW4gYSBjb3VwbGUgc2ltcGxlCi10ZXN0cyBva2F5LiAgSSBoYXZlbid0IHB1dCBpdCB0aHJvdWdoIGV4dGVuc2l2ZSB0ZXN0aW5nLiAgKEdOVSBtYWtlIGlzCi1jdXJyZW50bHkgcmVxdWlyZWQgZm9yIEJTRCA0LjMgYnVpbGRzLikKLQotU3VwcG9ydCBmb3IgdGhlIERFQyBBbHBoYSwgcnVubmluZyBPU0YvMSAoRUNPRkYgZm9ybWF0KS4gIFRoZSBnYXMgc3VwcG9ydCBpcwotYmFzZWQgb24gY29kZSBkb25hdGVkIGJ5IENNVSwgd2hpY2ggdXNlZCBhbiBhLm91dC1iYXNlZCBmb3JtYXQuICBJJ20gYWZyYWlkIHRoZQotYWxwaGEtYS5vdXQgc3VwcG9ydCBpcyBwcmV0dHkgYmFkbHkgbWFuZ2xlZCwgYW5kIG11Y2ggb2YgaXQgcmVtb3ZlZDsgbWFraW5nIGl0Ci13b3JrIHdpbGwgcmVxdWlyZSByZXdyaXRpbmcgaXQgYXMgQkZEIHN1cHBvcnQgZm9yIHRoZSBmb3JtYXQgYW55d2F5cy4KLQotSXJpeCA1IHN1cHBvcnQuCi0KLVRoZSB0ZXN0IHN1aXRlcyBoYXZlIGJlZW4gZml4ZWQgdXAgYSBiaXQsIHNvIHRoYXQgdGhleSBzaG91bGQgd29yayB3aXRoIGEKLWNvdXBsZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgZXhwZWN0IGFuZCBkZWphZ251LgotCi1TeW1ib2xzJyB2YWx1ZXMgYXJlIG5vdyBoYW5kbGVkIGludGVybmFsbHkgYXMgZXhwcmVzc2lvbnMsIHBlcm1pdHRpbmcgbW9yZQotZmxleGliaWxpdHkgaW4gZXZhbHVhdGluZyB0aGVtIGluIHNvbWUgY2FzZXMuICBTb21lIGRldGFpbHMgb2YgcmVsb2NhdGlvbgotaGFuZGxpbmcgaGF2ZSBhbHNvIGNoYW5nZWQsIGFuZCBzaW1wbGUgY29uc3RhbnQgcG9vbCBtYW5hZ2VtZW50IGhhcyBiZWVuIGFkZGVkLAotdG8gbWFrZSB0aGUgQWxwaGEgcG9ydCBlYXNpZXIuCi0KLU5ldyBvcHRpb24gIi0tc3RhdGlzdGljcyIgZm9yIHByaW50aW5nIG91dCBwcm9ncmFtIHJ1biB0aW1lcy4gIFRoaXMgaXMgaW50ZW5kZWQKLXRvIGJlIHVzZWQgd2l0aCB0aGUgZ2NjICItUSIgb3B0aW9uLCB3aGljaCBwcmludHMgb3V0IHRpbWVzIHNwZW50IGluIHZhcmlvdXMKLXBoYXNlcyBvZiBjb21waWxhdGlvbi4gIChZb3Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBvZiB0aGVtIHByaW50ZWQgb3V0IHdpdGgKLSJnY2MgLVEgLVdhLC0tc3RhdGlzdGljcyIsIEkgdGhpbmsuKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMi4yOgotCi1SUy82MDAwIEFJWCBhbmQgTUlQUyBTR0kgSXJpeCA1IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCi0KLUNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHN0aWxsIGluIGRldmVsb3BtZW50IChhbmQgdGhlcmVmb3JlIGFyZSBjb252ZW5pZW50IHRvCi1oYXZlIGxpc3RlZCBpbiBjb25maWd1cmUuaW4pIHN0aWxsIGdldCByZWplY3RlZCB3aXRob3V0IGEgbWlub3IgY2hhbmdlIHRvCi1nYXMvTWFrZWZpbGUuaW4sIHNvIHBlb3BsZSBub3QgZG9pbmcgZGV2ZWxvcG1lbnQgd29yayBzaG91bGRuJ3QgZ2V0IHRoZQotaW1wcmVzc2lvbiB0aGF0IHN1cHBvcnQgZm9yIHN1Y2ggY29uZmlndXJhdGlvbnMgaXMgYWN0dWFsbHkgYmVsaWV2ZWQgdG8gYmUKLXJlbGlhYmxlLgotCi1UaGUgcHJvZ3JhbSBuYW1lICh1c3VhbGx5ICJhcyIpIGlzIHByaW50ZWQgd2hlbiBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgaXMKLWRpc3BsYXllZC4gIFRoaXMgc2hvdWxkIHByZXZlbnQgc29tZSBjb25mdXNpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiBvY2Nhc2lvbmFsCi1tZXNzYWdlcyBhYm91dCAiaW50ZXJuYWwgZXJyb3JzIi4KLQotRUxGIHN1cHBvcnQgaXMgZmFsbGluZyBpbnRvIHBsYWNlLiAgU3VwcG9ydCBmb3IgdGhlIDM4NiBzaG91bGQgYmUgd29ya2luZy4KLVN1cHBvcnQgZm9yIFNQQVJDIFNvbGFyaXMgaXMgaW4uICBIUFBBIHN1cHBvcnQgZnJvbSBVdGFoIGlzIGJlaW5nIGludGVncmF0ZWQuCi0KLVN5bWJvbCB2YWx1ZXMgYXJlIG1haW50YWluZWQgYXMgZXhwcmVzc2lvbnMgaW5zdGVhZCBvZiBiZWluZyBpbW1lZGlhdGVseSBib2lsZWQKLWRvd24gdG8gYWRkLXN5bWJvbCwgc3ViLXN5bWJvbCwgYW5kIGNvbnN0YW50LiAgVGhpcyBwZXJtaXRzIHNsaWdodGx5IG1vcmUKLWNvbXBsZXggY2FsY3VsYXRpb25zIGludm9sdmluZyBzeW1ib2xzIHdob3NlIHZhbHVlcyBhcmUgbm90IGFscmVhZGV5IGtub3duLgotCi1EQlgtc3R5bGUgZGVidWdnaW5nIGluZm8gKCJzdGFicyIpIGlzIG5vdyBzdXBwb3J0ZWQgZm9yIENPRkYgZm9ybWF0cy4KLUlmIGFueSBzdGFicyBkaXJlY3RpdmVzIGFyZSBzZWVuIGluIHRoZSBzb3VyY2UsIEdBUyB3aWxsIGNyZWF0ZSB0d28gbmV3Ci1zZWN0aW9uczogYSAiLnN0YWIiIGFuZCBhICIuc3RhYnN0ciIgc2VjdGlvbi4gIFRoZSBmb3JtYXQgb2YgdGhlIC5zdGFiCi1zZWN0aW9uIGlzIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIGEub3V0IHN5bWJvbCBmb3JtYXQsIGFuZCAuc3RhYnN0ciBpcwotaXRzIHN0cmluZyB0YWJsZS4gIEZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgeW91IG11c3QgaGF2ZSBjb25maWd1cmVkIEdDQwotdG8gZ2VuZXJhdGUgc3RhYnMgKGJ5IGRlZmluaW5nIERCWF9ERUJVR0dJTkdfSU5GTyksIGFuZCBtdXN0IGhhdmUgYSBHREIKLXRoYXQgY2FuIHVzZSB0aGUgc3RhYiBzZWN0aW9ucyAoNC4xMSBvciBsYXRlcikuCi0KLUx5bnhPUywgb24gaTM4NiBhbmQgbTY4ayBwbGF0Zm9ybXMsIGlzIG5vdyBzdXBwb3J0ZWQuICBTUEFSQyBMeW54T1MKLXN1cHBvcnQgaXMgaW4gcHJvZ3Jlc3MuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjE6Ci0KLVNldmVyYWwgc21hbGwgZml4ZXMgZm9yIGkzODYtYWl4IChQUy8yKSBzdXBwb3J0IGZyb20gTWluaCBUcmFuLUxlIGhhdmUgYmVlbgotaW5jb3Jwb3JhdGVkLCBidXQgbm90IHdlbGwgdGVzdGVkIHlldC4KLQotQWx0ZXJlZCB0aGUgb3Bjb2RlIHRhYmxlIHNwbGl0IGZvciBtNjhrOyBpdCBzaG91bGQgcmVxdWlyZSBsZXNzIFZNIHRvIGNvbXBpbGUKLXdpdGggZ2NjIG5vdy4KLQotU29tZSBtaW5vciBhZGp1c3RtZW50cyB0byBhZGQgKENvbnZlcmdlbnQgVGVjaG5vbG9naWVzJykgTWluaWZyYW1lIHN1cHBvcnQsCi1zdWdnZXN0ZWQgYnkgUm9uYWxkIENvbGUuCi0KLUhQUEEgc3VwcG9ydCAocnVubmluZyBPU0Ygb25seSwgbm90IEhQVVgpIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFV0YWguICBUaGlzCi1pbmNsdWRlcyBpbXByb3ZlZCBFTEYgc3VwcG9ydCwgd2hpY2ggSSd2ZSBzdGFydGVkIGFkYXB0aW5nIGZvciBTUEFSQyBTb2xhcmlzCi0yLnguICBJbnRlZ3JhdGlvbiBpc24ndCBjb21wbGV0ZWx5LCBzbyBpdCBwcm9iYWJseSB3b24ndCB3b3JrLgotCi1IUDkwMDAvMzAwIHN1cHBvcnQsIGRvbmF0ZWQgYnkgSFAsIGhhcyBiZWVuIG1lcmdlZCBpbi4KLQotSWFuIFRheWxvciBoYXMgZmluaXNoZWQgdGhlIE1JUFMgRUNPRkYgKFVsdHJpeCwgSXJpeCkgc3VwcG9ydC4KLQotQmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAoZS5nLiwgaHBwYS1ocHV4KS4KLQotVGVzdCBzdWl0ZSBmcmFtZXdvcmsgaXMgc3RhcnRpbmcgdG8gYmVjb21lIHJlYXNvbmFibGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjA6Ci0KLU1vc3RseSBidWcgZml4ZXMuCi0KLVNvbWUgbW9yZSBtZXJnaW5nIG9mIEJGRCBhbmQgRUxGIGNvZGUsIGJ1dCBFTEYgc3RpbGwgZG9lc24ndCB3b3JrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMS45NDoKLQotQkZEIG1lcmdlIGlzIHBhcnRseSBkb25lLiAgQWR2ZW50dXJvdXMgc291bHMgbWF5IHRyeSBnaXZpbmcgY29uZmlndXJlIHRoZQotIi0td2l0aC1iZmQtYXNzZW1ibGVyIiBvcHRpb24uICBDdXJyZW50bHksIEVMRiBmb3JtYXQgcmVxdWlyZXMgaXQsIGEub3V0IGZvcm1hdAotYWNjZXB0cyBpdDsgU1BBUkMgQ1BVIGFjY2VwdHMgaXQuICBJdCdzIHRoZSBkZWZhdWx0IG9ubHkgZm9yIE9TICJlbGYiIG9yCi0ic29sYXJpcyIuICAoRUxGIGlzbid0IHJlYWxseSBzdXBwb3J0ZWQgeWV0LiAgSXQgbmVlZHMgd29yay4gIEkndmUgZ290IHNvbWUKLWNvZGUgZnJvbSBVdGFoIGZvciBIUC1QQSBFTEYsIGFuZCBmcm9tIERHIGZvciBtODhrIEVMRiwgYnV0IHRoZXkncmUgbm90IGZ1bGx5Ci1tZXJnZWQgeWV0LikKLQotVGhlIDY4SyBvcGNvZGUgdGFibGUgaGFzIGJlZW4gc3BsaXQgaW4gaGFsZi4gIEl0IHNob3VsZCBub3cgY29tcGlsZSB1bmRlciBnY2MKLXdpdGhvdXQgY29uc3VtaW5nIHJpZGljdWxvdXMgYW1vdW50cyBvZiBtZW1vcnkuCi0KLUEgY291cGxlIGRhdGEgc3RydWN0dXJlcyBoYXZlIGJlZW4gcmVkdWNlZCBpbiBzaXplLiAgVGhpcyBzaG91bGQgcmVzdWx0IGluCi1zYXZpbmcgYSBsaXR0bGUgYml0IG9mIHNwYWNlIGF0IHJ1bnRpbWUuCi0KLVN1cHBvcnQgZm9yIE1JUFMsIGZyb20gT1NGIGFuZCBSYWxwaCBDYW1wYmVsbCwgaGFzIGJlZW4gbWVyZ2VkIGluLiAgVGhlIE9TRgotY29kZSBwcm92aWRlZCBST1NFIGZvcm1hdCBzdXBwb3J0LCB3aGljaCBJIGhhdmVuJ3QgbWVyZ2VkIGluIHlldC4gIChJIGNhbiBtYWtlCi1pdCBhdmFpbGFibGUsIGlmIGFueW9uZSB3YW50cyB0byB0cnkgaXQgb3V0LikgIFJhbHBoJ3MgY29kZSwgZm9yIEJTRCA0LjQsCi1zdXBwb3J0cyBhLm91dCBmb3JtYXQuICBXZSBkb24ndCBoYXZlIEVDT0ZGIHN1cHBvcnQgaW4ganVzdCB5ZXQ7IGl0J3MgY29taW5nLgotCi1TdXBwb3J0IGZvciB0aGUgSGl0YWNoaSBIOC81MDAgaGFzIGJlZW4gYWRkZWQuCi0KLVZNUyBob3N0IGFuZCB0YXJnZXQgc3VwcG9ydCBzaG91bGQgYmUgd29ya2luZyBub3csIHRoYW5rcyBjaGllZmx5IHRvIEVyaWMKLVlvdW5nZGFsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DaGFuZ2VzIGluIDEuOTMuMDE6Ci0KLUZvciBtNjhrLCBzdXBwb3J0IGZvciBtb3JlIHByb2Nlc3NvcnMgaGFzIGJlZW4gYWRkZWQ6IDY4MDQwLCBDUFUzMiwgNjg4NTEuCi0KLUZvciBpMzg2LCAuYWxpZ24gaXMgbm93IHBvd2VyLW9mLXR3bzsgd2FzIG51bWJlci1vZi1ieXRlcy4KLQotRm9yIG02OGssICIlIiBpcyBub3cgYWNjZXB0ZWQgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLiAgRm9yIENPRkYgZm9ybWF0LCB3aGljaAotZG9lc24ndCB1c2UgdW5kZXJzY29yZSBwcmVmaXhlcyBmb3IgQyBsYWJlbHMsIGl0IGlzIHJlcXVpcmVkLCBzbyB2YXJpYWJsZSAiYTAiCi1jYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSByZWdpc3Rlci4KLQotTGFzdCBwdWJsaWMgcmVsZWFzZSB3YXMgMS4zOC4gIExvdHMgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHNpbmNlIHRoZW4sIGxvdHMKLW9mIG5ldyBDUFVzIGFuZCBmb3JtYXRzLCBsb3RzIG9mIGJ1Z3MgZml4ZWQuCi0KLQwKLUxvY2FsIHZhcmlhYmxlczoKLWZpbGwtY29sdW1uOiA3OQotRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL1JFQURNRSBiL2dhcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzI3ZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0JCVJFQURNRSBmb3IgR0FTCi0KLUEgbnVtYmVyIG9mIHRoaW5ncyBoYXZlIGNoYW5nZWQgc2luY2UgdmVyc2lvbiAxIGFuZCB0aGUgd29uZGVyZnVsIHdvcmxkIG9mIGdhcwotbG9va3MgdmVyeSBkaWZmZXJlbnQuICBUaGVyZSdzIHN0aWxsIGEgbG90IG9mIGlycmVsZXZhbnQgZ2FyYmFnZSBseWluZyBhcm91bmQKLXRoYXQgd2lsbCBiZSBjbGVhbmVkIHVwIGluIHRpbWUuICBEb2N1bWVudGF0aW9uIGlzIHNjYXJjZSwgYXMgYXJlIGxvZ3Mgb2YgdGhlCi1jaGFuZ2VzIG1hZGUgc2luY2UgdGhlIGxhc3QgZ2FzIHJlbGVhc2UuICBNeSBhcG9sb2dpZXMsIGFuZCBJJ2xsIHRyeSB0byBnZXQKLXNvbWV0aGluZyB1c2VmdWwuCi0KLVVucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0gU3VtbWFyeQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLVRvIGJ1aWxkIGp1c3QgdGhlIGFzc2VtYmxlciwgbWFrZSB0aGUgdGFyZ2V0IGFsbC1nYXMuCi0KLURvY3VtZW50YXRpb24KLT09PT09PT09PT09PT0KLQotVGhlIEdBUyByZWxlYXNlIGluY2x1ZGVzIHRleGluZm8gc291cmNlIGZvciBpdHMgbWFudWFsLCB3aGljaCBjYW4gYmUgcHJvY2Vzc2VkCi1pbnRvIGBpbmZvJyBvciBgZHZpJyBmb3Jtcy4KLQotVGhlIERWSSBmb3JtIGlzIHN1aXRhYmxlIGZvciBwcmludGluZyBvciBkaXNwbGF5aW5nOyB0aGUgY29tbWFuZHMgZm9yIGRvaW5nCi10aGlzIHZhcnkgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLiAgT24gbWFueSBzeXN0ZW1zLCBgbHByIC1kJyB3aWxsIHByaW50IGEgRFZJCi1maWxlLiAgT24gb3RoZXJzLCB5b3UgbWF5IG5lZWQgdG8gcnVuIGEgcHJvZ3JhbSBzdWNoIGFzIGBkdmlwcycgdG8gY29udmVydCB0aGUKLURWSSBmaWxlIGludG8gYSBmb3JtIHlvdXIgc3lzdGVtIGNhbiBwcmludC4KLQotSWYgeW91IHdpc2ggdG8gYnVpbGQgdGhlIERWSSBmaWxlLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgVGVYIGluc3RhbGxlZCBvbiB5b3VyCi1zeXN0ZW0uICBZb3UgY2FuIHJlYnVpbGQgaXQgYnkgdHlwaW5nOgotCi0JY2QgZ2FzL2RvYwotCW1ha2UgYXMuZHZpCi0KLVRoZSBJbmZvIGZvcm0gaXMgdmlld2FibGUgd2l0aCB0aGUgR05VIEVtYWNzIGBpbmZvJyBzdWJzeXN0ZW0sIG9yIHRoZQotc3RhbmRhbG9uZSBgaW5mbycgcHJvZ3JhbSwgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIEdOVSBUZXhpbmZvIGRpc3RyaWJ1dGlvbi4KLVRvIGJ1aWxkIHRoZSBpbmZvIGZpbGVzLCB5b3Ugd2lsbCBuZWVkIHRoZSBgbWFrZWluZm8nIHByb2dyYW0uICBUeXBlOgotCi0JY2QgZ2FzL2RvYwotCW1ha2UgaW5mbwotCi1TcGVjaWZ5aW5nIG5hbWVzIGZvciBob3N0cyBhbmQgdGFyZ2V0cwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgVGhlIHNwZWNpZmljYXRpb25zIHVzZWQgZm9yIGhvc3RzIGFuZCB0YXJnZXRzIGluIHRoZSBgY29uZmlndXJlJwotc2NyaXB0IGFyZSBiYXNlZCBvbiBhIHRocmVlLXBhcnQgbmFtaW5nIHNjaGVtZSwgYnV0IHNvbWUgc2hvcnQKLXByZWRlZmluZWQgYWxpYXNlcyBhcmUgYWxzbyBzdXBwb3J0ZWQuICBUaGUgZnVsbCBuYW1pbmcgc2NoZW1lIGVuY29kZXMKLXRocmVlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZm9sbG93aW5nIHBhdHRlcm46Ci0KLSAgICAgQVJDSElURUNUVVJFLVZFTkRPUi1PUwotCi0gICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzIGBzdW40JyBhcyBhIEhPU1QgYXJndW1lbnQgb3IgaW4gYQotYC0tdGFyZ2V0PVRBUkdFVCcgb3B0aW9uLiAgVGhlIGVxdWl2YWxlbnQgZnVsbCBuYW1lIGlzCi1gc3BhcmMtc3VuLXN1bm9zNCcuCi0KLSAgIFRoZSBgY29uZmlndXJlJyBzY3JpcHQgYWNjb21wYW55aW5nIEdBUyBkb2VzIG5vdCBwcm92aWRlIGFueSBxdWVyeQotZmFjaWxpdHkgdG8gbGlzdCBhbGwgc3VwcG9ydGVkIGhvc3QgYW5kIHRhcmdldCBuYW1lcyBvciBhbGlhc2VzLiAKLWBjb25maWd1cmUnIGNhbGxzIHRoZSBCb3VybmUgc2hlbGwgc2NyaXB0IGBjb25maWcuc3ViJyB0byBtYXAKLWFiYnJldmlhdGlvbnMgdG8gZnVsbCBuYW1lczsgeW91IGNhbiByZWFkIHRoZSBzY3JpcHQsIGlmIHlvdSB3aXNoLCBvcgoteW91IGNhbiB1c2UgaXQgdG8gdGVzdCB5b3VyIGd1ZXNzZXMgb24gYWJicmV2aWF0aW9ucy0tZm9yIGV4YW1wbGU6Ci0KLSAgICAgJSBzaCBjb25maWcuc3ViIHN1bjQKLSAgICAgc3BhcmMtc3VuLXN1bm9zNDExCi0gICAgICUgc2ggY29uZmlnLnN1YiBzdW4zCi0gICAgIG02OGstc3VuLXN1bm9zNDExCi0gICAgICUgc2ggY29uZmlnLnN1YiBkZWNzdGF0aW9uCi0gICAgIG1pcHMtZGVjLXVsdHJpeDQyCi0gICAgICUgc2ggY29uZmlnLnN1YiBocDMwMGJzZAotICAgICBtNjhrLWhwLWJzZAotICAgICAlIHNoIGNvbmZpZy5zdWIgaTM4NnYKLSAgICAgaTM4Ni11bmtub3duLXN5c3YKLSAgICAgJSBzaCBjb25maWcuc3ViIGk3ODZ2Ci0gICAgIEludmFsaWQgY29uZmlndXJhdGlvbiBgaTc4NnYnOiBtYWNoaW5lIGBpNzg2dicgbm90IHJlY29nbml6ZWQKLQotCi1gY29uZmlndXJlJyBvcHRpb25zCi09PT09PT09PT09PT09PT09PT09Ci0KLSAgIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdCBhcmUKLW1vc3Qgb2Z0ZW4gdXNlZnVsIGZvciBidWlsZGluZyBHQVMuICBgY29uZmlndXJlJyBhbHNvIGhhcyBzZXZlcmFsIG90aGVyCi1vcHRpb25zIG5vdCBsaXN0ZWQgaGVyZS4KLQotICAgICBjb25maWd1cmUgWy0taGVscF0KLSAgICAgICAgICAgICAgIFstLXByZWZpeD1ESVJdCi0gICAgICAgICAgICAgICBbLS1zcmNkaXI9UEFUSF0KLSAgICAgICAgICAgICAgIFstLWhvc3Q9SE9TVF0KLSAgICAgICAgICAgICAgIFstLXRhcmdldD1UQVJHRVRdCi0gICAgICAgICAgICAgICBbLS13aXRoLU9QVElPTl0KLSAgICAgICAgICAgICAgIFstLWVuYWJsZS1PUFRJT05dCi0KLVlvdSBtYXkgaW50cm9kdWNlIG9wdGlvbnMgd2l0aCBhIHNpbmdsZSBgLScgcmF0aGVyIHRoYW4gYC0tJyBpZiB5b3UKLXByZWZlcjsgYnV0IHlvdSBtYXkgYWJicmV2aWF0ZSBvcHRpb24gbmFtZXMgaWYgeW91IHVzZSBgLS0nLgotCi1gLS1oZWxwJwotICAgICBQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gYGNvbmZpZ3VyZScsIGFuZCBleGl0LgotCi1gLXByZWZpeD1ESVInCi0gICAgIENvbmZpZ3VyZSB0aGUgc291cmNlIHRvIGluc3RhbGwgcHJvZ3JhbXMgYW5kIGZpbGVzIHVuZGVyIGRpcmVjdG9yeQotICAgICBgRElSJy4KLQotYC0tc3JjZGlyPVBBVEgnCi0gICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKLSAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgotCi1gLS1ob3N0PUhPU1QnCi0gICAgIENvbmZpZ3VyZSBHQVMgdG8gcnVuIG9uIHRoZSBzcGVjaWZpZWQgSE9TVC4gIE5vcm1hbGx5IHRoZQotICAgICBjb25maWd1cmUgc2NyaXB0IGNhbiBmaWd1cmUgdGhpcyBvdXQgYXV0b21hdGljYWxseS4KLQotICAgICBUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZQotICAgICBob3N0cy4KLQotYC0tdGFyZ2V0PVRBUkdFVCcKLSAgICAgQ29uZmlndXJlIEdBUyBmb3IgY3Jvc3MtYXNzZW1ibGluZyBwcm9ncmFtcyBmb3IgdGhlIHNwZWNpZmllZAotICAgICBUQVJHRVQuICBXaXRob3V0IHRoaXMgb3B0aW9uLCBHQVMgaXMgY29uZmlndXJlZCB0byBhc3NlbWJsZSAubyBmaWxlcwotICAgICB0aGF0IHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lIChIT1NUKSBhcyBHQVMgaXRzZWxmLgotCi0gICAgIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlCi0gICAgIHRhcmdldHMuCi0KLWAtLWVuYWJsZS1PUFRJT04nCi0gICAgIFRoZXNlIGZsYWdzIHRlbGwgdGhlIHByb2dyYW0gb3IgbGlicmFyeSBiZWluZyBjb25maWd1cmVkIHRvIAotICAgICBjb25maWd1cmUgaXRzZWxmIGRpZmZlcmVudGx5IGZyb20gdGhlIGRlZmF1bHQgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgaG9zdC90YXJnZXQgY29tYmluYXRpb24uICBTZWUgYmVsb3cgZm9yIGEgbGlzdCBvZiBgLS1lbmFibGUnCi0gICAgIG9wdGlvbnMgcmVjb2duaXplZCBpbiB0aGUgZ2FzIGRpc3RyaWJ1dGlvbi4KLQotYGNvbmZpZ3VyZScgYWNjZXB0cyBvdGhlciBvcHRpb25zLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNvbmZpZ3VyaW5nCi1vdGhlciBHTlUgdG9vbHMgcmVjdXJzaXZlbHk7IGJ1dCB0aGVzZSBhcmUgdGhlIG9ubHkgb3B0aW9ucyB0aGF0IGFmZmVjdAotR0FTIG9yIGl0cyBzdXBwb3J0aW5nIGxpYnJhcmllcy4KLQotVGhlIGAtLWVuYWJsZScgb3B0aW9ucyByZWNvZ25pemVkIGJ5IHNvZnR3YXJlIGluIHRoZSBnYXMgZGlzdHJpYnV0aW9uIGFyZToKLQotYC0tZW5hYmxlLXRhcmdldHM9Li4uJwotICAgICBUaGlzIGNhdXNlcyBvbmUgb3IgbW9yZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbnMgdG8gYmUgYWRkZWQgdG8gdGhvc2UgZm9yCi0gICAgIHdoaWNoIEJGRCBzdXBwb3J0IGlzIGNvbXBpbGVkLiAgQ3VycmVudGx5IGdhcyBjYW5ub3QgdXNlIGFueSBmb3JtYXQgb3RoZXIKLSAgICAgdGhhbiBpdHMgY29tcGlsZWQtaW4gZGVmYXVsdCwgc28gdGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsLgotCi1gLS1lbmFibGUtYmZkLWFzc2VtYmxlcicKLSAgICAgVGhpcyBjYXVzZXMgdGhlIGFzc2VtYmxlciB0byB1c2UgdGhlIG5ldyBjb2RlIGJlaW5nIG1lcmdlZCBpbnRvIGl0IHRvIHVzZQotICAgICBCRkQgZGF0YSBzdHJ1Y3R1cmVzIGludGVybmFsbHksIGFuZCB1c2UgQkZEIGZvciB3cml0aW5nIG9iamVjdCBmaWxlcy4KLSAgICAgRm9yIG1vc3QgdGFyZ2V0cywgdGhpcyBpc24ndCBzdXBwb3J0ZWQgeWV0LiAgRm9yIG1vc3QgdGFyZ2V0cyB3aGVyZSBpdCBoYXMKLSAgICAgYmVlbiBkb25lLCBpdCdzIGFscmVhZHkgdGhlIGRlZmF1bHQuICBTbyBnZW5lcmFsbHkgeW91IHdvbid0IG5lZWQgdG8gdXNlCi0gICAgIHRoaXMgb3B0aW9uLgotCi1TdXBwb3J0ZWQgcGxhdGZvcm1zCi09PT09PT09PT09PT09PT09PT09Ci0KLUF0IHRoaXMgcG9pbnQgSSBiZWxpZXZlIGdhcyB0byBiZSBhbnNpIG9ubHkgY29kZSBmb3IgbW9zdCB0YXJnZXQgY3B1J3MuICBUaGF0Ci1pcywgdGhlcmUgc2hvdWxkIGJlIHJlbGF0aXZlbHkgZmV3LCBpZiBhbnkgaG9zdCBzeXN0ZW0gZGVwZW5kZW5jaWVzLiAgU28KLXBvcnRpbmcgKGFzIGEgY3Jvc3MtYXNzZW1ibGVyKSB0byBob3N0cyBub3QgeWV0IHN1cHBvcnRlZCBzaG91bGQgYmUgZmFpcmx5Ci1lYXN5LiAgUG9ydGluZyB0byBhIG5ldyB0YXJnZXQgc2hvdWxkbid0IGJlIHRvbyB0b3VnaCBpZiBpdCdzIGEgdmFyaWFudCBvZiBvbmUKLWFscmVhZHkgc3VwcG9ydGVkLgotCi1OYXRpdmUgYXNzZW1ibGluZyBzaG91bGQgd29yayBvbjoKLQotCXN1bjMKLQlzdW40Ci0JMzg2YnNkCi0JYnNkLzM4NgotCWRlbHRhIChtNjhrLXN5c3YgZnJvbSBNb3Rvcm9sYSkKLQlkZWx0YTg4IChtODhrLXN5c3YgZnJvbSBNb3Rvcm9sYSkKLQlHTlUvbGludXgKLQltNjhrIGhwdXggOC4wIChocHV4IDcuMCBtYXkgYmUgYSBwcm9ibGVtKQotCXZheCBic2QsIHVsdHJpeCwgdm1zCi0JaHA5MDAwczMwMAotCWRlY3N0YXRpb24KLQlpcml4IDQKLQlpcml4IDUKLQltaW5pZnJhbWUgKG02OGstc3lzdiBmcm9tIENvbnZlcmdlbnQgVGVjaG5vbG9naWVzKQotCWkzODYtYWl4IChwcy8yKQotCWhwcGEgKGhwdXggNC4zYnNkLCBvc2YxKQotCUFJWAotCXVuaXh3YXJlCi0Jc2NvIDMuMnY0LjIKLQlzY28gb3BlbnNlcnZlciA1LjAgKGEuay5hLiAzLjJ2NS4wICkKLQlzcGFyYyBzb2xhcmlzCi0JbnMzMmsgKG5ldGJzZCwgbGl0ZXMpCi0KLUkgYmVsaWV2ZSB0aGF0IGdhcyBhcyBhIGNyb3NzLWFzc2VtYmxlciBjYW4gY3VycmVudGx5IGJlIHRhcmdldHRlZCBmb3IKLW1vc3Qgb2YgdGhlIGFib3ZlIGhvc3RzLCBwbHVzCi0KLQlkZWNzdGF0aW9uLWJzZCAoYS5vdXQgZm9ybWF0LCB0byBiZSB1c2VkIGluIEJTRCA0LjQpCi0JZWJtb24yOWsKLQlnbzMyIChET1Mgb24gaTM4Niwgd2l0aCBESkdQUCAtLSBvbGQgYS5vdXQgdmVyc2lvbikKLQloOC8zMDAsIGg4LzUwMCAoSGl0YWNoaSkKLQlpMzg2LWFpeCAocHMvMikKLQlpOTYwLWNvZmYKLQltaXBzIGVjb2ZmIChkZWNzdGF0aW9uLXVsdHJpeCwgaXJpcywgbWlwcyBtYWdudW0sIG1pcHMtaWR0LWVjb2ZmKQotCU1pdHN1YmlzaGkgZDEwdiBhbmQgZDMwdgotCW5pbmR5OTYwCi0JcG93ZXJwYyBFQUJJCi0JU0ggKEhpdGFjaGkpCi0Jc2NvMzg2Ci0JVEkgdGljMzAgYW5kIHRpYzgwCi0JdmF4IGJzZCBvciB1bHRyaXg/Ci0Jdm1zCi0Jdnh3b3JrczY4awotCXZ4d29ya3M5NjAKLQl6ODAwMCAoWmlsb2cpCi0KLU1JUFMgRUNPRkYgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCwgYnV0IEdBUyB3aWxsIG5vdCBydW4gYSBDLXN0eWxlCi1wcmVwcm9jZXNzb3IuICBJZiB5b3Ugd2FudCB0aGF0LCByZW5hbWUgeW91ciBmaWxlIHRvIGhhdmUgYSAiLlMiIHN1ZmZpeCwgYW5kCi1ydW4gZ2NjIG9uIGl0LiAgT3IgcnVuICJnY2MgLXhhc3NlbWJsZXItd2l0aC1jcHAgZm9vLnMiLgotCi1TdXBwb3J0IGZvciBFTEYgc2hvdWxkIHdvcmsgbm93IGZvciBzcGFyYywgaHBwYSwgaTM4NiwgYWxwaGEsIG02OGssCi1NSVBTLCBwb3dlcnBjLgotCi1TdXBwb3J0IGZvciBzZXF1ZW50IChuczMyayksIHRhaG9lLCBpODYwLCBtODhrIG1heSBiZSBzdWZmZXJpbmcgZnJvbSBiaXRyb3QuCi0KLUlmIHlvdSB0cnkgb3V0IGdhcyBvbiBzb21lIGhvc3Qgb3IgdGFyZ2V0IG5vdCBsaXN0ZWQgYWJvdmUsIHBsZWFzZSBsZXQgbWUga25vdwotdGhlIHJlc3VsdHMsIHNvIEkgY2FuIHVwZGF0ZSB0aGUgbGlzdC4KLQotQ29tcGlsZXIgU3VwcG9ydCBIYWNrcwotPT09PT09PT09PT09PT09PT09PT09PQotCi1PbiBhIGZldyB0YXJnZXRzLCB0aGUgYXNzZW1ibGVyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHN1cHBvcnQgYSBmZWF0dXJlCi10aGF0IGlzIHBvdGVudGlhbGx5IHVzZWZ1bCB3aGVuIGFzc2VtYmxpbmcgY29tcGlsZXIgb3V0cHV0LCBidXQgd2hpY2gKLW1heSBjb25mdXNlIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzLiAgSWYgYXNzZW1ibGVyIGVuY291bnRlcnMgYQotLndvcmQgcHNldWRvLW9wIG9mIHRoZSBmb3JtIHN5bWJvbDEtc3ltYm9sMiAodGhlIGRpZmZlcmVuY2Ugb2YgdHdvCi1zeW1ib2xzKSwgYW5kIHRoZSBkaWZmZXJlbmNlIG9mIHRob3NlIHR3byBzeW1ib2xzIHdpbGwgbm90IGZpdCBpbiAxNgotYml0cywgdGhlIGFzc2VtYmxlciB3aWxsIGNyZWF0ZSBhIGJyYW5jaCBhcm91bmQgYSBsb25nIGp1bXAgdG8KLXN5bWJvbDEsIGFuZCBpbnNlcnQgdGhpcyBpbnRvIHRoZSBvdXRwdXQgZGlyZWN0bHkgYmVmb3JlIHRoZSBuZXh0Ci1sYWJlbDogVGhlIC53b3JkIHdpbGwgKGluc3RlYWQgb2YgY29udGFpbmluZyBnYXJiYWdlLCBvciBnaXZpbmcgYW4KLWVycm9yIG1lc3NhZ2UpIGNvbnRhaW4gKHRoZSBhZGRyZXNzIG9mIHRoZSBsb25nIGp1bXApLXN5bWJvbDIuICBUaGlzCi1hbGxvd3MgdGhlIGFzc2VtYmxlciB0byBhc3NlbWJsZSBqdW1wIHRhYmxlcyB0aGF0IGp1bXAgdG8gbG9jYXRpb25zCi12ZXJ5IGZhciBhd2F5IGludG8gY29kZSB0aGF0IHdvcmtzIHByb3Blcmx5LiAgSWYgdGhlIG5leHQgbGFiZWwgaXMKLW1vcmUgdGhhbiAzMksgYXdheSBmcm9tIHRoZSAud29yZCwgeW91IGxvc2UgKHNpbGVudGx5KTsgUk1TIGNsYWltcwotdGhpcyB3aWxsIG5ldmVyIGhhcHBlbi4gIElmIHRoZSAtSyBvcHRpb24gaXMgZ2l2ZW4sIHlvdSB3aWxsIGdldCBhCi13YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGlzIGhhcHBlbnMuCi0KLQotUkVQT1JUSU5HIEJVR1MgSU4gR0FTCi09PT09PT09PT09PT09PT09PT09PT0KLQotQnVncyBpbiBnYXMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZy4gIFRoZXkgbWF5IGJlCi1jcm9zcy1wb3N0ZWQgdG8gYnVnLWdjYyBpZiB0aGV5IGFmZmVjdCB0aGUgdXNlIG9mIGdhcyB3aXRoIGdjYy4gIFRoZXkKLXNob3VsZCBub3QgYmUgcmVwb3J0ZWQganVzdCB0byBidWctZ2NjLCBzaW5jZSBJIGRvbid0IHJlYWQgdGhhdCBsaXN0LAotYW5kIHRoZXJlZm9yZSB3b3VsZG4ndCBzZWUgdGhlbS4KLQotSWYgeW91IHJlcG9ydCBhIGJ1ZyBpbiBHQVMsIHBsZWFzZSByZW1lbWJlciB0byBpbmNsdWRlOgotCi1BIGRlc2NyaXB0aW9uIG9mIGV4YWN0bHkgd2hhdCB3ZW50IHdyb25nLCBhbmQgZXhhY3RseSB3aGF0IHNob3VsZCBoYXZlCi1oYXBwZW5lZCBpbnN0ZWFkLgotCi1UaGUgdHlwZSBvZiBtYWNoaW5lIChWQVgsIDY4MDIwLCBldGMpIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChCU0QsIFN1bk9TLCBEWU5JWCwKLVZNUywgZXRjKSBHQVMgd2FzIHJ1bm5pbmcgb24uCi0KLVRoZSBjb25maWd1cmF0aW9uIG5hbWUocykgZ2l2ZW4gdG8gdGhlICJjb25maWd1cmUiIHNjcmlwdC4gIFRoZQotImNvbmZpZy5zdGF0dXMiIGZpbGUgc2hvdWxkIGhhdmUgdGhpcyBpbmZvcm1hdGlvbi4KLQotVGhlIG9wdGlvbnMgZ2l2ZW4gdG8gR0FTIGF0IHJ1biB0aW1lLgotCi1UaGUgYWN0dWFsIGlucHV0IGZpbGUgdGhhdCBjYXVzZWQgdGhlIHByb2JsZW0uCi0KLUl0IGlzIHNpbGx5IHRvIHJlcG9ydCBhIGJ1ZyBpbiBHQVMgd2l0aG91dCBpbmNsdWRpbmcgYW4gaW5wdXQgZmlsZSBmb3IgR0FTLgotRG9uJ3QgYXNrIHVzIHRvIGdlbmVyYXRlIHRoZSBmaWxlIGp1c3QgYmVjYXVzZSB5b3UgbWFkZSBpdCBmcm9tIGZpbGVzIHlvdQotdGhpbmsgd2UgaGF2ZSBhY2Nlc3MgdG8uCi0KLTEuIFlvdSBtaWdodCBiZSBtaXN0YWtlbi4KLTIuIEl0IG1pZ2h0IHRha2UgdXMgYSBsb3Qgb2YgdGltZSB0byBpbnN0YWxsIHRoaW5ncyB0byByZWdlbmVyYXRlIHRoYXQgZmlsZS4KLTMuIFdlIG1pZ2h0IGdldCBhIGRpZmZlcmVudCBmaWxlIGZyb20gdGhlIG9uZSB5b3UgZ290LCBhbmQgbWlnaHQgbm90IHNlZSBhbnkKLSAgIGJ1Zy4KLQotVG8gc2F2ZSB1cyB0aGVzZSBkZWxheXMgYW5kIHVuY2VydGFpbnRpZXMsIGFsd2F5cyBzZW5kIHRoZSBpbnB1dCBmaWxlIGZvciB0aGUKLXByb2dyYW0gdGhhdCBmYWlsZWQuICBBIHNtYWxsZXIgdGVzdCBjYXNlIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtIGlzIG9mCi1jb3Vyc2UgcHJlZmVyYWJsZSwgYnV0IGJlIHN1cmUgaXQgaXMgYSBjb21wbGV0ZSBpbnB1dCBmaWxlLCBhbmQgdGhhdCBpdCByZWFsbHkKLWRvZXMgZGVtb25zdHJhdGUgdGhlIHByb2JsZW07IGJ1dCBpZiBwYXJpbmcgaXQgZG93biB3b3VsZCBjYXVzZSBsYXJnZSBkZWxheXMKLWluIGZpbGluZyB0aGUgYnVnIHJlcG9ydCwgZG9uJ3QgYm90aGVyLgotCi1JZiB0aGUgaW5wdXQgZmlsZSBpcyB2ZXJ5IGxhcmdlLCBhbmQgeW91IGFyZSBvbiB0aGUgaW50ZXJuZXQsIHlvdSBtYXkgd2FudCB0bwotbWFrZSBpdCBhdmFsaWFibGUgZm9yIGFub255bW91cyBGVFAgaW5zdGVhZCBvZiBtYWlsaW5nIGl0LiAgSWYgeW91IGRvLCBpbmNsdWRlCi1pbnN0cnVjdGlvbnMgZm9yIEZUUCdpbmcgaXQgaW4geW91ciBidWcgcmVwb3J0LgotCi1JZiB5b3UgZXhwZWN0IHRvIGJlIGNvbnRyaWJ1dGluZyBhIGxhcmdlIG51bWJlciBvZiB0ZXN0IGNhc2VzLCBpdCB3b3VsZCBiZQotaGVscGZ1bCBpZiB5b3Ugd291bGQgbG9vayBhdCB0aGUgdGVzdCBzdWl0ZSBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZSAoYmFzZWQgb24KLXRoZSBEZWphIEdudSB0ZXN0aW5nIGZyYW1ld29yaywgYXZhaWxhYmxlIGZyb20gdGhlIHVzdWFsIGZ0cCBzaXRlcykgYW5kIHdyaXRlCi10ZXN0IGNhc2VzIHRvIGZpdCBpbnRvIHRoYXQgZnJhbWV3b3JrLiAgVGhpcyBpcyBjZXJ0YWlubHkgbm90IHJlcXVpcmVkLgpkaWZmIC0tZ2l0IGEvZ2FzL1JFQURNRS12bXMgYi9nYXMvUkVBRE1FLXZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2YzYwMy4uMDAwMDAwMAotLS0gYS9nYXMvUkVBRE1FLXZtcworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0JVGhpcyBkb2N1bWVudCBleHBsYWlucyBhIGNvdXBsZSBvZiB0aGluZ3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gVk1TLgotVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gImNoYXB0ZXJzIiwgdGhlIGZpcnN0IGRlYWxzIHdpdGggY3Jvc3MtYXNzZW1ibHkgCi1pc3N1ZXMsIGFuZCB0aGUgc2Vjb25kIGRlYWxzIHdpdGggdGhlIFZNUyBkZWJ1Z2dlciBhbmQgR05VLUNDLgotCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKiogTm90ZXMgZm9yIENyb3NzIEFzc2VtYmx5IHdpdGggVk1TICoqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUlmIHlvdSB3aXNoIHRvIGJ1aWxkIGdhcyBvbiBhIG5vbi1WTVMgc3lzdGVtIHRvIGNyb3NzLWFzc2VtYmxlLCAKLXlvdSBzaG91bGQgdXNlOgotCi1jb25maWd1cmUgJHtob3N0dHlwZX0gLXRhcmdldD12bXMKLQotYW5kIHRoZW4gZm9sbG93IHRoZSB1c3VhbCBwcm9jZWR1cmUuICBUaGUgb2JqZWN0IGZpbGVzIGdlbmVyYXRlZCBvbgotVW5peCB3aWxsIGJlIGNvcnJlY3QgZnJvbSBhIGJpbmFyeSBwb2ludCBvZiB2aWV3LCBidXQgdGhlIHJlYWwgdHJpY2sgaXMKLWdldHRpbmcgdGhlbSB0byB0aGUgVk1TIG1hY2hpbmUuICBUaGUgZm9ybWF0IG9mIHRoZSBvYmplY3QgZmlsZSBpcwotYSB2YXJpYWJsZS1sZW5ndGggcmVjb3JkLCBidXQgZWFjaCByZWNvcmQgY29udGFpbnMgYmluYXJ5IGRhdGEuICBnYXMKLXdyaXRlcyB0aGUgcmVjb3JkcyBpbiB0aGUgc2FtZSBmb3JtYXQgdGhhdCBWTVMgd291bGQgZXhwZWN0LAotbmFtZWx5IGEgdHdvLWJ5dGUgY291bnQgZm9sbG93ZWQgYnkgdGhhdCBudW1iZXIgb2YgYnl0ZXMuCi0KLQlJZiB5b3UgdHJ5IHRvIGNvcHkgdGhlIGZpbGUgdG8gYSBWTVMgc3lzdGVtIHVzaW5nIGZ0cCwgdGhlIGZ0cAotcHJvdG9jb2wgd2lsbCBzY3JldyB1cCB0aGUgZmlsZSBieSBsb29raW5nIGZvciBudWxscyAocmVjb3JkIHRlcm1pbmF0b3IgZm9yCi11bml4KSBhbmQgaXQgd2lsbCBpbnNlcnQgaXQncyBvd24gcmVjb3JkIHRlcm1pbmF0b3JzIGF0IHRoYXQgcG9pbnQuICBUaGlzCi13aWxsIG9idmlvdXNseSBjb3JydXB0IHRoZSBmaWxlLiAKLQotCUlmIHlvdSB0cnkgdG8gdHJhbnNmZXIgdGhlIGZpbGUgd2l0aCBmdHAgaW4gYmluYXJ5IG1vZGUsIHRoZQotZmlsZSBpdHNlbGYgd2lsbCBub3QgYmUgY29ycnVwdCwgYnV0IFZNUyB3aWxsIHRoaW5rIHRoYXQgdGhlIGZpbGUgY29udGFpbnMKLWZpeGVkLWxlbmd0aCByZWNvcmRzIG9mIDUxMiBieXRlcy4gIFlvdSBjYW4gdXNlIHRoZSBwdWJsaWMtZG9tYWluIEZJTEUgCi11dGlsaXR5IHRvIGNoYW5nZSB0aGlzIHdpdGggYSBjb21tYW5kIGxpa2U6Ci0KLSRGSUxFIGZvby5vL3R5cGU9dmFyaWFibGUKLQotSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgdXRpbGl0eSBhdmFpbGFibGUsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjYW4gYmUgCi11c2VkIHRvIHBlcmZvcm0gdGhpcyB0YXNrOgotCi0JI2luY2x1ZGUgPGZhYi5oPgotCQotCSNkZWZpbmUgUk1FJENfU0VUUkZNIDEKLQkgCi0Jc3RydWN0IEZBQiAqIGZhYjsKLQkKLQltYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKXsKLQkJaW50IGksIHN0YXR1czsKLQkJZmFiID0gKHN0cnVjdCBGQUIqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBGQUIpKTsKLQkJKmZhYiA9IGNjJHJtc19mYWI7CS8qIGluaXRpYWxpemUgRkFCKi8KLQkJZmFiLT5mYWIkYl9mYWMgPSBGQUIkTV9QVVQ7Ci0JCWZhYi0+ZmFiJGxfZm9wIHw9IEZBQiRNX0VTQzsKLQkJZmFiLT5mYWIkbF9jdHggPSBSTUUkQ19TRVRSRk07Ci0JCWZhYi0+ZmFiJHdfaWZpID0gMDsKLQkJZm9yKGk9MTtpPGFyZ2M7aSsrKXsKLQkJICBwcmludGYoIlNldHRpbmcgJXMgdG8gdmFyaWFibGUgbGVuZ3RoIHJlY29yZHMuXG4iLGFyZ3ZbaV0pOwotCQkgIGZhYi0+ZmFiJGxfZm5hID0gYXJndltpXTsKLQkgICAgICAgCSAgZmFiLT5mYWIkYl9mbnMgPSBzdHJsZW4oYXJndltpXSk7Ci0JCSAgc3RhdHVzID0gc3lzJG9wZW4oZmFiLDAsMCk7Ci0JCSAgaWYoKHN0YXR1cyAmIDcpICE9IDEpIGxpYiRzaWduYWwoc3RhdHVzKTsKLQkJICBmYWItPmZhYiRiX3JmbSA9IEZBQiRDX1ZBUjsKLQkJICBzdGF0dXMgPSBzeXMkbW9kaWZ5KGZhYiwwLDApOwotCQkgIGlmKChzdGF0dXMgJiA3KSAhPSAxKSBsaWIkc2lnbmFsKHN0YXR1cyk7Ci0JCSAgc3RhdHVzID0gc3lzJGNsb3NlKGZhYiwwLDApOwotCQkgIGlmKChzdGF0dXMgJiA3KSAhPSAxKSBsaWIkc2lnbmFsKHN0YXR1cyk7Ci0JCX07Ci0JfQotCi0JSWYgeW91IGhhdmUgTkZTIHJ1bm5pbmcgb24gdGhlIFZNUyBzeXN0ZW0sIHdoYXQgeW91IG5lZWQgdG8gZG8KLWRlcGVuZHMgdXBvbiB3aGljaCBORlMgc29mdHdhcmUgeW91IGFyZSBydW5uaW5nIG9uIHRoZSBWTVMgc3lzdGVtLiAgVGhlcmUKLWFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgVENQL0lQIHBhY2thZ2VzIGZvciBWTVMgYXZhaWxhYmxlLCBhbmQgb25seSB2ZXJ5Ci1saW1pdGVkIHRlc3RpbmcgaGFzIGJlZW4gcGVyZm9ybWVkLiAgIEluIHRoZSB0ZXN0cyB0aGF0IGhhcyBiZWVuIGRvbmUgc28KLWZhciwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHdpbGwgYWx3YXlzIGJlIGNvcnJlY3Qgd2hlbiB0cmFuc2ZlcnJpbmcgdGhlCi1maWxlIHZpYSBORlMsIGJ1dCB0aGUgcmVjb3JkIGF0dHJpYnV0ZXMgbWF5IG9yIG1heSBub3QgYmUgY29ycmVjdC4gCi0KLQlPbmUgcHJvcHJpZXRhcnkgVENQL0lQL05GUyBwYWNrYWdlIGZvciBWTVMgaXMga25vd24gdG8gCi1hdXRvbWF0aWNhbGx5IGZpeCB0aGUgcmVjb3JkIGF0dHJpYnV0ZXMgb2YgdGhlIG9iamVjdCBmaWxlIGlmIHlvdSBORlMgbW91bnQKLWEgdW5peCBkaXNrIGZyb20gdGhlIFZNUyBzeXN0ZW0sIGFuZCBpZiB0aGUgZmlsZSBoYXMgYSAiLm9iaiIgZXh0ZW5zaW9uIG9uCi10aGUgdW5peCBzeXN0ZW0uICBPdGhlciBUQ1AvSVAgcGFja2FnZXMgbWlnaHQgZG8gdGhpcyBmb3IgeW91IGFzIHdlbGwsIGJ1dAotdGhleSBoYXZlIG5vdCBiZWVuIGNoZWNrZWQuCi0KLU5vIG1hdHRlciB3aGF0IG1ldGhvZCB5b3UgdXNlIHRvIGdldCB0aGUgZmlsZSB0byB0aGUgVk1TIHN5c3RlbSwgaXQgaXMKLWFsd2F5cyBhIGdvb2QgaWRlYSB0byBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyB0aGUgY29ycmVjdCB0eXBlIGJ5Ci1kb2luZyBhICIkZGlyL2Z1bGwiIG9uIHRoZSBvYmplY3QgZmlsZS4gVGhlIGRlc2lyZWQgcmVjb3JkIGF0dHJpYnV0ZXMgd2lsbAotYmUgIk5vbmUiLiAgVW5kZXNpcmFibGUgcmVjb3JkIGF0dHJpYnV0ZXMgd2lsbCBiZSAiU3RyZWFtLUxGIiBvciBhbnl0aGluZwotZWxzZS4gCi0KLU9uY2UgeW91IGdldCB0aGUgZmlsZXMgb24gdGhlIFZNUyBzeXN0ZW0sIHlvdSBjYW4gY2hlY2sgdGhlaXIgaW50ZWdyaXR5IAotd2l0aCB0aGUgIiRhbmFsL29iaiIgY29tbWFuZC4gIChOYXR1cmFsbHkgYXQgc29tZSBwb2ludCB5b3Ugc2hvdWxkIHJlbmFtZQotdGhlIC5vIGZpbGVzIHRvIC5vYmopLiAgQXMgZmFyIGFzIHRoZSBkZWJ1Z2dlciBpcyBjb25jZXJuZWQsIHRoZSByZWNvcmRzIAotd2lsbCBiZSBjb3JyZWN0LCBidXQgdGhlIGRlYnVnZ2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCB0aGUgc291cmNlIGZpbGVzLAotc2luY2UgaXQgb25seSBoYXMgdGhlIGZpbGUgbmFtZSwgYW5kIG5vdCB0aGUgZnVsbCBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KLVlvdSBtdXN0IGdpdmUgdGhlIGRlYnVnZ2VyIHNvbWUgaGVscCBieSB0ZWxsaW5nIGl0IHdoaWNoIGRpcmVjdG9yaWVzIHRvIAotc2VhcmNoIGZvciB0aGUgaW5kaXZpZHVhbCBmaWxlcyAtIG9uY2UgeW91IGhhdmUgZG9uZSB0aGlzIHlvdSBzaG91bGQgYmUgCi1hYmxlIHRvIHByb2NlZWQgbm9ybWFsbHkuCi0KLQlJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2UgbmFtZXMgZm9yIHlvdXIgZmlsZXMgd2hpY2ggd2lsbCBiZSB2YWxpZAotdW5kZXIgVk1TLCBzaW5jZSBvdGhlcndpc2UgeW91IHdpbGwgaGF2ZSBubyB3YXkgb2YgZ2V0dGluZyB0aGUgZGVidWdnZXIgdG8KLWZpbmQgdGhlIHNvdXJjZSBmaWxlIHdoZW4gZGV1Z2dpbmcuCi0KLVRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgb2JqZWN0IGZpbGUgbm9ybWFsbHkgY29udGlucyBzcGVjaWZpYwotaW5mb3JtYXRpb24gdGhhdCB0aGUgZGVidWdnZXIgY2FuIHVzZSB0byBwb3NpdGl2ZWx5IGlkZW50aWZ5IGEgZmlsZSwgYW5kIGlmCi15b3UgYXJlIGFzc2VtYmxpbmcgb24gYSB1bml4IHN5c3RlbSB0aGlzIGluZm9ybWF0aW9uIHNpbXBseSBkb2VzIG5vdCBleGlzdAotaW4gYSBtZWFuaW5nZnVsIHdheS4gIFlvdSBtdXN0IGhlbHAgdGhlIGRlYnVnZ2VyIGJ5IHVzaW5nIHRoZSAiU0VUIEZJTEU9IgotY29tbWFuZCB0byB0ZWxsIHRoZSBkZWJ1Z2dlciB3aGVyZSB0byBsb29rIGZvciBzb3VyY2UgZmlsZXMuIFRoZSBkZWJ1Z2dlcgotcmVjb3JkcyB3aWxsIGJlIGNvcnJlY3QsIGV4Y2VwdCB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBiZSBpbml0aWFsbHkKLWFibGUgdG8gZmluZCB0aGUgc291cmNlIGZpbGVzLiAgWW91IGNhbiB1c2UgdGhlICJTRVQgRklMRSIgY29tbWFuZCB0byB0ZWxsCi10aGUgZGVidWdnZXIgd2hlcmUgdG8gbG9vayBmb3IgdGhlIHNvdXJjZSBmaWxlcy4gCi0KLUkgaGF2ZSBvbmx5IHRlc3RlZCB0aGlzIHdpdGggYSBTVnI0IGk0ODYgbWFjaGluZSwgYW5kIGV2ZXJ5dGhpbmcgc2VlbXMgdG8KLXdvcmsgT0ssIHdpdGggdGhlIGxpbWl0ZWQgdGVzdGluZyB0aGF0IEkgaGF2ZSBkb25lLiAgT3RoZXIgbWFjaGluZXMgbWF5Ci1vciBtYXkgbm90IHdvcmsuICBZb3Ugc2hvdWxkIHJlYWQgdGhlIGNoYXB0ZXJzIG9uIGNyb3NzLWNvbXBpbGVycyBpbiB0aGUgZ2NjCi1tYW51YWwgYmVmb3JlIGZvb2xpbmcgd2l0aCB0aGlzLiAgU2luY2UgZ2FzIGRvZXMgbm90IG5lZWQgdG8gZG8gYW55IGZsb2F0aW5nCi1wb2ludCBhcml0aG1ldGljLCB0aGUgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIHRoYXQgYXJlIGdlbmVyYXRlZCBoZXJlIHNob3VsZAotYmUgY29ycmVjdCAtIHRoZSBvbmx5IGNvbmNlcm4gaXMgd2l0aCBjb25zdGFudCBmb2xkaW5nIGluIHRoZSBtYWluIGNvbXBpbGVyLgotVGhlIHJhbmdlIGFuZCBwcmVjaXNpb24gb2YgZmxvYXRzIGFuZCBkb3VibGVzIGFyZSBzaW1pbGFyIG9uIHRoZSA0ODYgKHdpdGggCi1hIGJ1aWx0aW4gODAzODcpIGFuZCB0aGUgVkFYLCBhbHRob3VnaCB0aGVyZSBpcyBhIGZhY3RvciBvZiAyIHRvIDQKLWRpZmZlcmVuY2UgaW4gdGhlIHJhbmdlLiAgVGhlIGRvdWJsZSwgYXMgaW1wbGVtZW50ZWQgb24gdGhlIDQ4NiwgaXMgcXVpdGUKLXNpbWlsYXIgdG8gdGhlIEdfRkxPQVQgb24gdGhlIFZBWC4gCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKiogTm90ZXMgZm9yIHVzaW5nIEdOVSBDQyB3aXRoIHRoZSBWTVMgZGVidWdnZXIqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi0JMSkgWW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IEdOVS1DLCBhcyB3aXRoIGFueSBvdGhlciBkZWNlbnQgY29tcGlsZXIsCi13aWxsIGRvIHRoaW5ncyB3aGVuIG9wdGltaXphdGlvbiBpcyB0dXJuZWQgb24gdGhhdCB5b3UgbWF5IG5vdCBleHBlY3QuIAotU29tZXRpbWVzIGludGVybWVkaWF0ZSByZXN1bHRzIGFyZSBub3Qgd3JpdHRlbiB0byB2YXJpYWJsZXMsIGlmIHRoZXkgYXJlIG9ubHkKLXVzZWQgaW4gb25lIHBsYWNlLCBhbmQgc29tZXRpbWVzIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBhdCBhbGwgd2lsbCBub3QgYmUKLXdyaXR0ZW4gdG8gdGhlIHN5bWJvbCB0YWJsZS4gIEFsc28sIHBhcmFtZXRlcnMgdG8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgb2Z0ZW4KLWluYWNjZXNzaWJsZS4gWW91IGNhbiBzZWUgdGhlIGFzc2VtYmx5IGNvZGUgZXF1aXZhbGVudCBieSB1c2luZyBLUDcgaW4gdGhlCi1kZWJ1Z2dlciwgYW5kIGZyb20gdGhpcyB5b3UgY2FuIHRlbGwgaWYgaW4gZmFjdCBhIHZhcmlhYmxlIHNob3VsZCBoYXZlIHRoZQotdmFsdWUgdGhhdCB5b3UgZXhwZWN0LiAgWW91IGNhbiBmaW5kIG91dCBpZiBhIHZhcmlhYmxlIGxpdmVzIHdpdGhpbmcgYSByZWdpc3RlcgotYnkgZG9pbmcgYSAnc2hvdyBzeW1ib2wvYWRkcicuCi0KLQkyKSBPdmVybHkgY29tcGxleCBkYXRhIHR5cGVzLCBzdWNoIGFzOgotCi1pbnQgKCooKigqKCooKigqIHNhcnI2KVsxXSlbMV0pWzJdKVszXSlbNF0pWzVdOwotCi13aWxsIG5vdCBiZSBkZWJ1Z2dlZCBwcm9wZXJseSwgc2luY2UgdGhlIGRlYnVnZ2luZyByZWNvcmQgb3ZlcmZsb3dzIGFuIGludGVybmFsCi1kZWJ1Z2dlciBidWZmZXIuICBnY2MtYXMgd2lsbCBjb252ZXJ0IHRoZXNlIHRvICp2b2lkIGFzIGZhciBhcyB0aGUgZGVidWdnZXIKLXN5bWJvbCB0YWJsZSBpcyBjb25jZXJuZWQsIHdoaWNoIHdpbGwgYXZvaWQgYW55IHByb2JsZW1zLCBhbmQgdGhlIGFzc2VtYmxlcgotd2lsbCBnaXZlIHlvdSBhIG1lc3NhZ2UgaW5mb3JtaW5nIHlvdSB0aGF0IHRoaXMgaGFzIGhhcHBlbmVkLgotCi0JMykgWW91IG11c3QsIG9mIGNvdXJzZSwgY29tcGlsZSBhbmQgbGluayB3aXRoIC9kZWJ1Zy4gIElmIHlvdSBsaW5rCi13aXRob3V0IGRlYnVnLCB5b3Ugc3RpbGwgZ2V0IHRyYWNlYmFjayB0YWJsZSBpbiB0aGUgZXhlY3V0YWJsZSwgYnV0IHRoZXJlIGlzIG5vCi1zeW1ib2wgdGFibGUgZm9yIHZhcmlhYmxlcy4KLQotCTQpIEluY2x1ZGVkIGluIHRoZSBwYXRjaGVzIHRvIFZNUy5DIGFyZSBmaXhlcyB0byB0d28gYnVncyB0aGF0IGFyZQotdW5yZWxhdGVkIHRvIHRoZSBjaGFuZ2VzIHRoYXQgSSBoYXZlIG1hZGUuICBPbmUgb2YgdGhlc2UgbWFkZSBpdCBpbXBvc3NpYmxlIHRvCi1kZWJ1ZyBzbWFsbCBwcm9ncmFtcyBzb21ldGltZXMsIGFuZCB0aGUgb3RoZXIgY2F1c2VkIHRoZSBkZWJ1Z2dlciB0byBiZWNvbWUKLWNvbmZ1c2VkIGFib3V0IHdoaWNoIHJvdXRpbmUgaXQgd2FzIGluLCBhbmQgZ2l2ZSB0aGlzIGluY29ycmVjdCBpbmZvIGluCi10cmFjZWJhY2tzLgotCi0JNSkgSWYgeW91IGFyZSB1c2luZyB0aGUgR05VLUMrKyBjb21waWxlciwgeW91IHNob3VsZCBtb2RpZnkgdGhlCi1jb21waWxlciBkcml2ZXIgZmlsZSBHTlVfQ0M6WzAwMDAwMF1HQ0MuQ09NIChvciBHWFguQ09NKS4gIElmIHlvdSBoYXZlIGEKLXNlcGVyYXRlIEdYWC5DT00sIHRoZW4geW91IG5lZWQgdG8gY2hhbmdlIG9uZSBsaW5lIGluIEdYWC5DT00gdG86Ci0kIGlmIGYkbG9jYXRlKCJEIixwMikgLm5lLiBQMl9MZW5ndGggdGhlbiBEZWJ1ZyA9ICIgIiItRzAiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGljZSB6ZXJvLS0tPiAgXgotSWYgeW91IGFyZSB1c2luZyBhIEdDQy5DT00gdGhhdCBkb2VzIGJvdGggQyBhbmQgQysrLCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0bwotR0NDLkNPTToKLQotJCEKLSQhIFVzZSBvbGQgc3R5bGUgZGVidWdnaW5nIHJlY29yZHMgZm9yIFZNUwotJCEKLSQgaWYgKERlYnVnLm5lcy4iIiApLmFuZC4gUGx1cyB0aGVuIERlYnVnID0gIiAiIi1HMCIiIgotCi1hZnRlciB0aGUgdmFyaWFibGVzIFBsdXMgYW5kIERlYnVnIGFyZSBzZXQuICBUaGUgcmVhc29uIGZvciB0aGlzLCBpcyB0aGF0IEMrKwotY29tcGlsZXIgYnkgZGVmYXVsdCBnZW5lcmF0ZXMgZGVidWdnaW5nIHJlY29yZHMgdGhhdCBhcmUgbW9yZSBjb21wbGV4LAotd2l0aCBtYW55IG5ldyBzeW50YWN0aWNhbCBlbGVtZW50cyB0aGF0IGFsbG93IGZvciB0aGUgbmV3IGZlYXR1cmVzIG9mIHRoZQotbGFuZ3VhZ2UuICBUaGUgLUcwIHN3aXRjaCB0ZWxscyB0aGUgQysrIGNvbXBpbGVyIHRvIHVzZSB0aGUgb2xkIHN0eWxlIGRlYnVnZ2luZwotcmVjb3Jkcy4gIFVudGlsIHRoZSBkZWJ1Z2dlciB1bmRlcnN0YW5kcyBDKysgdGhlcmUgaXMgbm90IGFueSBwb2ludCB0byB0cnkgYW5kCi11c2UgdGhlIGV4cGFuZGVkIHN5bnRheC4KLQotCTYpIFdoZW4geW91IGhhdmUgbmVzdGVkIHNjb3BlcywgaS5lLjoKLW1haW4oKXsKLQlpbnQgaTsKLQl7aW50IGk7Ci0JCXtpbnQgaTsKLX07fTt9Ci1hbmQgeW91IHNheSAiRVhBTSBpIiB0aGUgZGVidWdnZXIgbmVlZHMgdG8gZmlndXJlIG91dCB3aGljaCB2YXJpYWJsZSB5b3UKLWFjdHVhbGx5IHdhbnQgdG8gcmVmZXJlbmNlLiAgSSBoYXZlIGFycmFuZ2VkIHRoaW5ncyB0byBkZWZpbmUgYSBibG9jayB0byB0aGUKLWRlYnVnZ2VyIHdoZW4geW91IHVzZSBicmFja2V0cyB0byBlbnRlciBhIG5ldyBzY29wZSwgc28gaW4gdGhlIGV4YW1wbGUgYWJvdmUsCi10aGUgdmFyaWFibGVzIHdvdWxkIGJlIGRlc2NyaWJlZCBhczoKLVRFU1RcbWFpblxpCi1URVNUXG1haW5cJDBcaQotVEVTVFxtYWluXCQwXCQwXGkKLUF0IGVhY2ggbGV2ZWwsIHRoZSBibG9jayBuYW1lIGlzIGEgbnVtYmVyIHdpdGggYSBkb2xsYXIgc2lnbiBwcmVmaXgsIHRoZQotbnVtYmVycyBzdGFydCB3aXRoIDAgYW5kIGNvdW50IHVwd2FyZC4gIFdoZW4geW91IHNheSBFWEFNIGksIHRoZSBkZWJ1Z2dlciBsb29rcwotYXQgdGhlIGN1cnJlbnQgUEMsIGFuZCBkZWNpZGVzIHdoaWNoIGJsb2NrIGl0IGlzIGN1cnJlbnRseSBpbi4gIEl0IHdvcmtzIGZyb20KLXRoZSBpbm5lcm1vc3QgbGV2ZWwgb3V0d2FyZCB1bnRpbCBpdCBmaW5kcyBhIGJsb2NrIHRoYXQgaGFzIHRoZSB2YXJpYWJsZSAiaSIKLWRlZmluZWQuICBZb3UgY2FuIGFsd2F5cyBzcGVjaWZ5IHRoZSBzY29wZSBleHBsaWNpdGx5LgotCi0JNykgIFdpdGggQysrLCB0aGVyZSBjYW4gYmUgYSBsb3Qgb2YgaW5saW5lIGZ1bmN0aW9ucywgYW5kIGl0IHdvdWxkIGJlCi1yYXRoZXIgcmVzdHJpY3RpdmUgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZGVidWcgdGhlIHByb2dyYW0gYnkgY29udmVydGluZyBhbGwgb2YKLXRoZSBpbmxpbmUgZnVuY3Rpb25zIHRvIG5vcm1hbCBmdW5jdGlvbnMuICBXaGF0IEkgaGF2ZSBkb25lIGlzIHRvIGVzc2VudGlhbGx5Ci0iYWRkIiAod2l0aCB0aGUgZGVidWdnZXIpIHNvdXJjZSBsaW5lcyBmcm9tIHRoZSBpbmNsdWRlIGZpbGVzIHRoYXQgY29udGFpbiB0aGUKLWlubGluZSBmdW5jdGlvbnMuICBUaHVzIHdoZW4geW91IHN0ZXAgaW50byBhbiBpbmxpbmUgZnVuY3Rpb24gaXQgYXBwZWFycyBhcyBpZgoteW91IGhhdmUgY2FsbGVkIHRoZSBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gZXhhbWluZSB2YXJpYWJsZXMgYW5kIHNvIGZvcnRoLiAKLVRoZXJlIGFyZSBzZXZlcmFsICp2ZXJ5KiBpbXBvcnRhbnQgZGlmZmVyZW5jZXMsIGhvd2V2ZXIuICBGaXJzdCBvZiBhbGwsIHNpbmNlCi10aGVyZSBpcyBubyBmdW5jdGlvbiBjYWxsIGludm9sdmVkLCB5b3UgY2Fubm90IHN0ZXAgb3ZlciB0aGUgaW5saW5lIGZ1bmN0aW9uCi1jYWxsIC0geW91IGFsd2F5cyBzdGVwIGludG8gaXQuIFNlY29uZGx5LCBzaW5jZSB0aGUgc2FtZSBzb3VyY2UgbGluZXMgYXJlIHVzZWQKLWluIG1hbnkgbG9jYXRpb25zLCB0aGVyZSBpcyBhIHNlcGVyYXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBmb3IgKmVhY2gqIHVzYWdlLiAKLVdpdGhvdXQgdGhpcywgYnJlYWtwb2ludHMgZG8gbm90IHdvcmssIHNpbmNlIHdlIG11c3QgaGF2ZSBhIDEtdG8tMSBtYXBwaW5nCi1iZXR3ZWVuIHNvdXJjZSBsaW5lcyBhbmQgUEMuCi0JU2luY2UgeW91IGNhbm5vdCBzdGVwIG92ZXIgaW5saW5lIGZ1bmN0aW9uIGNhbGxzLCBpdCBjYW4gYmUgYSByZWFsIHBhaW4KLWlmIHlvdSBhcmUgbm90IHJlYWxseSBpbnRlcmVzdGVkIGluIHdoYXQgaXMgZ29pbmcgb24gZm9yIHRoYXQgZnVuY3Rpb24gY2FsbC4KLVdoYXQgSSBoYXZlIGRvbmUgaXMgdG8gdXNlIHRoZSAiLUQiIHN3aXRjaCBmb3IgdGhlIGFzc2VtYmxlciB0byB0b2dnbGUgdGhlCi1mb2xsb3dpbmcgYmVoYXZpb3IuICBXaXRoIHRoZSAiLUQiIHN3aXRjaCwgYWxsIGlubGluZSBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkIGluCi10aGUgb2JqZWN0IGZpbGUsIGFuZCB5b3UgY2FuIGRlYnVnIGV2ZXJ5dGhpbmcuICBXaXRob3V0IHRoZSAiLUQiIHN3aXRjaAotKGRlZmF1bHQgY2FzZSB3aXRoIFZNUyBpbXBsZW1lbnRhdGlvbiksIGlubGluZSBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkICpvbmx5KiBpZgotdGhleSBkaWQgbm90IGNvbWUgZnJvbSBzeXN0ZW0gaGVhZGVyIGZpbGVzIChpLmUuIGZyb20gR05VX0NDX0lOQ0xVREU6IG9yCi1HTlVfR1hYX0lOQ0xVREU6KS4gIFRodXMsIHdpdGhvdXQgdGhlIHN3aXRjaCB0aGUgdXNlciBvbmx5IGRlYnVncyBoaXMvaGVyIG93bgotaW5saW5lIGZ1bmN0aW9ucywgYW5kIG5vdCB0aGUgc3lzdGVtIG9uZXMuIChUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSBkbwotYSBsb3Qgb2Ygc3RyZWFtIEkvTyBpbiBDKyspLiAgVGhpcyBwcm9iYWJseSB3aWxsIG5vdCBwcm92aWRlIGVub3VnaCBncmFudWxhcml0eQotZm9yIG1hbnkgdXNlcnMsIGJ1dCBmb3Igbm93IHRoaXMgaXMgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsLCBhbmQgSSB3b3VsZAotbGlrZSB0byByZWZsZWN0IHVwb24gaXQgYW5kIGdldCBzb21lIGZlZWRiYWNrIGJlZm9yZSBJIGdvIGFueSBmdXJ0aGVyLiAKLVBvc3NpYmxlIHNvbHV0aW9ucyBpbmNsdWRlIGFuIGludGVyYWN0aXZlIHByb21wdGluZywgYSBsb2dpY2FsIG5hbWUsIG9yIGEgbmV3Ci1jb21tYW5kIGxpbmUgb3B0aW9uIGluIGdjYy5jICh3aGljaCBpcyB0aGVuIHBhc3NlZCB0aHJvdWdoIHNvbWVob3cgdG8gdGhlIGd1dHMKLW9mIHRoZSBhc3NlbWJsZXIpLgotCVRoZSBpbmxpbmUgZnVuY3Rpb25zIGZyb20gaGVhZGVyIGZpbGVzIGFwcGVhciBhZnRlciB0aGUgc291cmNlIGNvZGUKLWZvciB0aGUgc291cmNlIGZpbGUuICBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGl0c2VsZiBpcwotbnVtYmVyZWQgd2l0aCB0aGUgc2FtZSBsaW5lIG51bWJlcnMgdGhhdCB5b3UgZ2V0IHdpdGggYW4gZWRpdG9yLiAgSW4gYWRkaXRpb24sCi10aGUgZW50aXJlIGhlYWRlciBmaWxlIGlzIG5vdCBpbmNsdWRlZCwgc2luY2UgdGhlIGFzc2VtYmxlciBtYWtlcyBhIGxpc3Qgb2YKLXRoZSBtaW4gYW5kIG1heCBzb3VyY2UgbGluZXMgdGhhdCBhcmUgdXNlZCwgYW5kIG9ubHkgaW5jbHVkZXMgdGhvc2UgbGluZXMgZnJvbQotdGhlIGZpcnN0IHRvIHRoZSBsYXN0IGFjdHVhbGx5IHVzZWQuIChJdCBpcyBlYXN5IHRvIGNoYW5nZSBpdCB0byBpbmNsdWRlIHRoZQotd2hvbGUgZmlsZSkuCi0KLQk4KSBXaGVuIHlvdSBhcmUgZGVidWdnaW5nIEMrKyBvYmplY3RzLCB0aGUgb2JqZWN0ICJ0aGlzIiBpcyByZWZlcmVkIHRvCi1hcyAiJHRoaXMiLiAgQWN0dWFsbHksIHRoZSBjb21waWxlciB3cml0ZXMgaXQgYXMgIi50aGlzIiwgYnV0IHRoZSBwZXJpb2QgaXMKLW5vdCBnb29kIGZvciB0aGUgZGVidWdnZXIsIHNvIEkgaGF2ZSBhIHJvdXRpbmUgdG8gY29udmVydCBpdCB0byBhICQuICAoSXQKLWFjdHVhbGx5IGNvbnZlcnRzIGFsbCBwZXJpb2RzIHRvICQsIGJ1dCBvbmx5IGZvciB2YXJpYWJsZXMsIHNpbmNlIHRoaXMgd2FzCi1pbnRlbmRlZCB0byBhbGxvdyB1cyB0byBhY2Nlc3MgInRoaXMiLgotCi0JOSkgSWYgeW91IHVzZSB0aGUgYXNtKCIuLi4iKSBrZXl3b3JkIGZvciBnbG9iYWwgc3ltYm9scywgeW91IHdpbGwgbm90Ci1iZSBhYmxlIHRvIHNlZSB0aGF0IHN5bWJvbCB3aXRoIHRoZSBkZWJ1Z2dlci4gIFRoZSByZWFzb24gaXMgdGhhdCB0aGVyZSBhcmUgdHdvCi1yZWNvcmRzIGZvciB0aGUgc3ltYm9sIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIG9mIHRoZSBhc3NlbWJsZXIuICBPbmUKLWNvbnRhaW5zIHRoZSBpbmZvIHN1Y2ggYXMgcHNlY3QgbnVtYmVyIGFuZCBvZmZzZXQsIGFuZCB0aGUgb3RoZXIgb25lIGNvbnRhaW5zCi10aGUgaW5mb3JtYXRpb24gaGF2aW5nIHRvIGRvIHdpdGggdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFyaWFibGUuICBJbiBvcmRlciB0bwotZGVidWcgYXMgc3ltYm9sLCB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGNvb3JlbGF0ZSB0aGVzZSByZWNvcmRzLCBhbmQgdGhlIG9ubHkKLXdheSB0byBkbyB0aGlzIGlzIGJ5IG5hbWUuICBUaGUgcmVjb3JkIHdpdGggdGhlIHN0b3JhZ2UgYXR0cmlidXRlcyB3aWxsIHRha2UKLXRoZSBuYW1lIHVzZWQgaW4gdGhlIGFzbSBkaXJlY3RpdmUsIGFuZCB0aGUgcmVjb3JkIHRoYXQgc3BlY2lmaWVzIHRoZSBkYXRhIHR5cGUKLWhhcyB0aGUgYWN0dWFsIHZhcmlhYmxlIG5hbWUsIGFuZCB0aHVzIHdoZW4geW91IHVzZSB0aGUgYXNtIGRpcmVjdGl2ZSB0byBjaGFuZ2UKLWEgdmFyaWFibGUgbmFtZSwgdGhlIHN5bWJvbCBiZWNvbWVzIGludmlzaWJsZS4KLQotCTEwKSBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIgKCBHTlUtQyAxLjM3LjkyIGFuZCBlYXJsaWVyKSBwbGFjZQotZ2xvYmFsIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdC4gIFRoaXMgaXMgdW5mb3J0dW5hdGUsIHNpbmNlIHRvIHRoZSBsaW5rZXIKLXRoaXMgYXBwZWFycyB0byBiZSBhbiBlbnRyeSBwb2ludC4gIEkgc2VudCBhIHBhdGNoIHRvIHRoZSBjb21waWxlciB0byBSTVMsCi13aGljaCB3aWxsIGdlbmVyYXRlIGEgLmNvbnN0IHNlY3Rpb24gZm9yIHRoZXNlIHZhcmlhYmxlcywgYW5kIHBhdGNoZWQgdGhlCi1hc3NlbWJsZXIgdG8gcHV0IHRoZXNlIHZhcmlhYmxlcyBpbnRvIGEgcHNlY3QganVzdCBsaWtlIHRoYXQgZm9yIG5vcm1hbAotdmFyaWFibGVzLCBleGNlcHQgdGhhdCB0aGV5IGFyZSBtYXJrZWQgTk9XUlQuICBzdGF0aWMgY29uc3RhbnRzIGFyZSBzdGlsbAotcGxhY2VkIGluIHRoZSB0ZXh0IHBzZWN0LCBzaW5jZSB0aGVyZSBpcyBubyBuZWVkIGZvciBhbnkgZXh0ZXJuYWwgYWNjZXNzLgpkaWZmIC0tZ2l0IGEvZ2FzL2FjaW5jbHVkZS5tNCBiL2dhcy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTJjMTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLWRubCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQobmFtZSwgdHlwZWRlZm5hbWUsIHR5cGVkZWYsIGhlYWRlcnMpCi1BQ19ERUZVTihHQVNfQ0hFQ0tfREVDTF9ORUVERUQsWwotQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yICQxKQotQUNfQ0FDSEVfVkFMKGdhc19jdl9kZWNsX25lZWRlZF8kMSwKLUFDX1RSWV9MSU5LKFskNF0sCi1bCi10eXBlZGVmICQzOwotJDIgeDsKLXggPSAoJDIpICQxOwotXSwgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKSlkbmwKLUFDX01TR19SRVNVTFQoJGdhc19jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi1kbmwKLWRubCBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAotZG5sIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi1kbmwgd29ya2luZyBwcm9wZXJseSEKLWRubCBHQVNfV09SS0lOR19BU1NFUlQKLUFDX0RFRlVOKEdBU19XT1JLSU5HX0FTU0VSVCwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3b3JraW5nIGFzc2VydCBtYWNyb10pCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2Fzc2VydF9vaywKLUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD5dLCBbCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotXSwgZ2FzX2N2X2Fzc2VydF9vaz15ZXMsIGdhc19jdl9hc3NlcnRfb2s9bm8pKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2Fzc2VydF9vaykKLXRlc3QgJGdhc19jdl9hc3NlcnRfb2sgPSB5ZXMgfHwgQUNfREVGSU5FKEJST0tFTl9BU1NFUlQsIDEsIFthc3NlcnQgYnJva2VuP10pCi1dKWRubAotZG5sCi1kbmwgU2luY2UgbWFueSBCb3VybmUgc2hlbGwgaW1wbGVtZW50YXRpb25zIGxhY2sgc3Vicm91dGluZXMsIHVzZSB0aGlzCi1kbmwgaGFjayB0byBzaW1wbGlmeSB0aGUgY29kZSBpbiBjb25maWd1cmUuaW4uCi1kbmwgR0FTX1VOSVEobGlzdHZhcikKLUFDX0RFRlVOKEdBU19VTklRLAotW19nYXNfdW5pcV9saXN0PSJbJF0kMSIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1kbmwgUHJvdGVjdCBhZ2FpbnN0IGVtcHR5IGlucHV0IGxpc3QuCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15IFskXV9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSBbJF1fZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiBbJF1fZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgWyRdX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IlskXV9nYXNfdW5pcV9uZXdsaXN0IFskXV9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLSQxPVskXV9nYXNfdW5pcV9uZXdsaXN0Ci1dKWRubApkaWZmIC0tZ2l0IGEvZ2FzL2FjbG9jYWwubTQgYi9nYXMvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiZTQ2OC4uMDAwMDAwMAotLS0gYS9nYXMvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExNzUgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLWRubCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQobmFtZSwgdHlwZWRlZm5hbWUsIHR5cGVkZWYsIGhlYWRlcnMpCi1BQ19ERUZVTihHQVNfQ0hFQ0tfREVDTF9ORUVERUQsWwotQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yICQxKQotQUNfQ0FDSEVfVkFMKGdhc19jdl9kZWNsX25lZWRlZF8kMSwKLUFDX1RSWV9MSU5LKFskNF0sCi1bCi10eXBlZGVmICQzOwotJDIgeDsKLXggPSAoJDIpICQxOwotXSwgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKSlkbmwKLUFDX01TR19SRVNVTFQoJGdhc19jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi1kbmwKLWRubCBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAotZG5sIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi1kbmwgd29ya2luZyBwcm9wZXJseSEKLWRubCBHQVNfV09SS0lOR19BU1NFUlQKLUFDX0RFRlVOKEdBU19XT1JLSU5HX0FTU0VSVCwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3b3JraW5nIGFzc2VydCBtYWNyb10pCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2Fzc2VydF9vaywKLUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD5dLCBbCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotXSwgZ2FzX2N2X2Fzc2VydF9vaz15ZXMsIGdhc19jdl9hc3NlcnRfb2s9bm8pKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2Fzc2VydF9vaykKLXRlc3QgJGdhc19jdl9hc3NlcnRfb2sgPSB5ZXMgfHwgQUNfREVGSU5FKEJST0tFTl9BU1NFUlQsIDEsIFthc3NlcnQgYnJva2VuP10pCi1dKWRubAotZG5sCi1kbmwgU2luY2UgbWFueSBCb3VybmUgc2hlbGwgaW1wbGVtZW50YXRpb25zIGxhY2sgc3Vicm91dGluZXMsIHVzZSB0aGlzCi1kbmwgaGFjayB0byBzaW1wbGlmeSB0aGUgY29kZSBpbiBjb25maWd1cmUuaW4uCi1kbmwgR0FTX1VOSVEobGlzdHZhcikKLUFDX0RFRlVOKEdBU19VTklRLAotW19nYXNfdW5pcV9saXN0PSJbJF0kMSIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1kbmwgUHJvdGVjdCBhZ2FpbnN0IGVtcHR5IGlucHV0IGxpc3QuCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15IFskXV9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSBbJF1fZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiBbJF1fZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgWyRdX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IlskXV9nYXNfdW5pcV9uZXdsaXN0IFskXV9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLSQxPVskXV9nYXNfdW5pcV9uZXdsaXN0Ci1dKWRubAotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCi1bQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCi1bQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCi1bQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19TVUJTVChMRCkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1BQ19TVUJTVChOTSkKLV0pCi0KLSMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCi0jIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KLUFDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKLVsjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLWNoYW5nZXF1b3RlKCwpZG5sCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWNoYW5nZXF1b3RlKCwpZG5sCi1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLWNoYW5nZXF1b3RlKFssXSlkbmwKLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0JICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLUFDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKLV0pCi0KLSMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCi1BQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCi1bQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLUFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLV0pCi0KLSMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KLUFDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCi1bYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi1dKQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWwotQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKLUFDX0NIRUNLX0xJQihtLCBjb3MpCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKLSAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KLSAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7Ci0gICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OwotICAgIGVzYWMKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0KLWRubCBBTV9QUk9HX0xFWAotZG5sIExvb2sgZm9yIGZsZXgsIGxleCBvciBtaXNzaW5nLCB0aGVuIHJ1biBBQ19QUk9HX0xFWCBhbmQgQUNfREVDTF9ZWVRFWFQKLUFDX0RFRlVOKEFNX1BST0dfTEVYLAotW21pc3NpbmdfZGlyPWlmZWxzZShbJDFdLCxgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYCwkMSkKLUFDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsICIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IikKLUFDX1BST0dfTEVYCi1BQ19ERUNMX1lZVEVYVF0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvZ2FzL2FwcC5jIGIvZ2FzL2FwcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTFjMGYwLi4wMDAwMDAwCi0tLSBhL2dhcy9hcHAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTcgKzAsMCBAQAotLyogVGhpcyBpcyB0aGUgQXNzZW1ibGVyIFByZS1Qcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIE1vZGlmaWVkIGJ5IEFsbGVuIFdpcmZzLUJyb2NrLCBJbnN0YW50aWF0aW9ucyBJbmMgMi85MCAqLwotLyogQXBwLCB0aGUgYXNzZW1ibGVyIHByZS1wcm9jZXNzb3IuICBUaGlzIHByZS1wcm9jZXNzb3Igc3RyaXBzIG91dCBleGNlc3MKLSAgIHNwYWNlcywgdHVybnMgc2luZ2xlLXF1b3RlZCBjaGFyYWN0ZXJzIGludG8gYSBkZWNpbWFsIGNvbnN0YW50LCBhbmQgdHVybnMKLSAgICMgPG51bWJlcj4gPGZpbGVuYW1lPiA8Z2FyYmFnZT4gaW50byBhIC5saW5lIDxudW1iZXI+XG4uZmlsZSA8ZmlsZW5hbWU+Ci0gICBwYWlyLiAgVGhpcyBuZWVkcyBiZXR0ZXIgZXJyb3ItaGFuZGxpbmcuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgkJCS8qIEZvciBCQURfQ0FTRSgpIG9ubHkgKi8KLQotI2lmIChfX1NURENfXyAhPSAxKQotI2lmbmRlZiBjb25zdAotI2RlZmluZSBjb25zdCAgLyogZW1wdHkgKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIFdoZXRoZXIgd2UgYXJlIHNjcnViYmluZyBpbiBtNjhrIE1SSSBtb2RlLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotICAgZmxhZ19tNjhrX21yaSwgYmVjYXVzZSB0aGUgdHdvIGZsYWdzIHdpbGwgYmUgYWZmZWN0ZWQgYnkgdGhlIC5tcmkKLSAgIHBzZXVkby1vcCBhdCBkaWZmZXJlbnQgdGltZXMuICAqLwotc3RhdGljIGludCBzY3J1Yl9tNjhrX21yaTsKLQotLyogVGhlIHBzZXVkby1vcCB3aGljaCBzd2l0Y2hlcyBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlLiAgU2VlIHRoZQotICAgY29tbWVudCBpbiBkb19zY3J1Yl9jaGFycy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBtcmlfcHNldWRvW10gPSAiLm1yaSAwIjsKLQotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotLyogVGhlIHBzZXVkby1vcCBmb3Igd2hpY2ggd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgYEAnIGNoYXJhY3RlcnMuIAotICAgU2VlIHRoZSBjb21tZW50IGluIGRvX3NjcnViX2NoYXJzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICAgc3ltdmVyX3BzZXVkb1tdID0gIi5zeW12ZXIiOwotc3RhdGljIGNvbnN0IGNoYXIgKiBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgbGV4WzI1Nl07Ci1zdGF0aWMgY29uc3QgY2hhciBzeW1ib2xfY2hhcnNbXSA9Ci0iJC5fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiOwotCi0jZGVmaW5lIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UCQkxCi0jZGVmaW5lIExFWF9JU19XSElURVNQQUNFCQkyCi0jZGVmaW5lIExFWF9JU19MSU5FX1NFUEFSQVRPUgkJMwotI2RlZmluZSBMRVhfSVNfQ09NTUVOVF9TVEFSVAkJNAotI2RlZmluZSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUCTUKLSNkZWZpbmUJTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1QJNgotI2RlZmluZQlMRVhfSVNfU1RSSU5HUVVPVEUJCTgKLSNkZWZpbmUJTEVYX0lTX0NPTE9OCQkJOQotI2RlZmluZQlMRVhfSVNfTkVXTElORQkJCTEwCi0jZGVmaW5lCUxFWF9JU19PTkVDSEFSX1FVT1RFCQkxMQotI2lmZGVmIFRDX1Y4NTAKLSNkZWZpbmUgTEVYX0lTX0RPVUJMRURBU0hfMVNUCQkxMgotI2VuZGlmCi0jaWZkZWYgVENfTTMyUgotI2RlZmluZSBMRVhfSVNfRE9VQkxFQkFSXzFTVAkJMTMKLSNlbmRpZgotI2RlZmluZSBJU19TWU1CT0xfQ09NUE9ORU5UKGMpCQkobGV4W2NdID09IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UKQotI2RlZmluZSBJU19XSElURVNQQUNFKGMpCQkobGV4W2NdID09IExFWF9JU19XSElURVNQQUNFKQotI2RlZmluZSBJU19MSU5FX1NFUEFSQVRPUihjKQkJKGxleFtjXSA9PSBMRVhfSVNfTElORV9TRVBBUkFUT1IpCi0jZGVmaW5lIElTX0NPTU1FTlQoYykJCQkobGV4W2NdID09IExFWF9JU19DT01NRU5UX1NUQVJUKQotI2RlZmluZSBJU19MSU5FX0NPTU1FTlQoYykJCShsZXhbY10gPT0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVCkKLSNkZWZpbmUJSVNfTkVXTElORShjKQkJCShsZXhbY10gPT0gTEVYX0lTX05FV0xJTkUpCi0KLXN0YXRpYyBpbnQgcHJvY2Vzc19lc2NhcGUgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEZJWE1FLXNvb246IFRoZSBlbnRpcmUgbGV4ZXIvcGFyc2VyIHRoaW5neSBzaG91bGQgYmUKLSAgIGJ1aWx0IHN0YXRpY2FsbHkgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGR5bmFtaWNhbGx5Ci0gICBlYWNoIGFuZCBldmVyeSB0aW1lIHRoZSBhc3NlbWJsZXIgaXMgcnVuLiAgeG94b3JpY2guICovCi0KLXZvaWQgCi1kb19zY3J1Yl9iZWdpbiAobTY4a19tcmkpCi0gICAgIGludCBtNjhrX21yaTsKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgaW50IGM7Ci0KLSAgc2NydWJfbTY4a19tcmkgPSBtNjhrX21yaTsKLQotICBsZXhbJyAnXSA9IExFWF9JU19XSElURVNQQUNFOwotICBsZXhbJ1x0J10gPSBMRVhfSVNfV0hJVEVTUEFDRTsKLSAgbGV4WydcciddID0gTEVYX0lTX1dISVRFU1BBQ0U7Ci0gIGxleFsnXG4nXSA9IExFWF9JU19ORVdMSU5FOwotICBsZXhbJzsnXSA9IExFWF9JU19MSU5FX1NFUEFSQVRPUjsKLSAgbGV4Wyc6J10gPSBMRVhfSVNfQ09MT047Ci0KLSAgaWYgKCEgbTY4a19tcmkpCi0gICAgewotICAgICAgbGV4WyciJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0KLSNpZm5kZWYgVENfSFBQQQotICAgICAgbGV4WydcJyddID0gTEVYX0lTX09ORUNIQVJfUVVPVEU7Ci0jZW5kaWYKLQotI2lmZGVmIFNJTkdMRV9RVU9URV9TVFJJTkdTCi0gICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogTm90ZTogaWYgYW55IG90aGVyIGNoYXJhY3RlciBjYW4gYmUgTEVYX0lTX1NUUklOR1FVT1RFLCB0aGUgbG9vcAotICAgICBpbiBzdGF0ZSA1IG9mIGRvX3NjcnViX2NoYXJzIG11c3QgYmUgY2hhbmdlZC4gICovCi0KLSAgLyogTm90ZSB0aGF0IHRoZXNlIG92ZXJyaWRlIHRoZSBwcmV2aW91cyBkZWZhdWx0cywgZS5nLiBpZiAnOycgaXMgYQotICAgICBjb21tZW50IGNoYXIsIHRoZW4gaXQgaXNuJ3QgYSBsaW5lIHNlcGFyYXRvci4gICovCi0gIGZvciAocCA9IHN5bWJvbF9jaGFyczsgKnA7ICsrcCkKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotICAgIH0JCQkJLyogZGVjbGFyZSBzeW1ib2wgY2hhcmFjdGVycyAqLwotCi0gIGZvciAoYyA9IDEyODsgYyA8IDI1NjsgKytjKQotICAgIGxleFtjXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotCi0jaWZkZWYgdGNfc3ltYm9sX2NoYXJzCi0gIC8qIFRoaXMgbWFjcm8gcGVybWl0cyB0aGUgcHJvY2Vzc29yIHRvIHNwZWNpZnkgYWxsIGNoYXJhY3RlcnMgd2hpY2gKLSAgICAgbWF5IGFwcGVhcnMgaW4gYW4gb3BlcmFuZC4gIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzY3J1YmJlciBmcm9tCi0gICAgIGRpc2NhcmRpbmcgbWVhbmluZ2Z1bCB3aGl0ZXNwYWNlIGluIGNlcnRhaW4gY2FzZXMuICBUaGUgaTM4NgotICAgICBiYWNrZW5kIHVzZXMgdGhpcyB0byBzdXBwb3J0IHByZWZpeGVzLCB3aGljaCBjYW4gY29uZnVzZSB0aGUKLSAgICAgc2NydWJiZXIgYXMgdG8gd2hldGhlciBpdCBpcyBwYXJzaW5nIG9wZXJhbmRzIG9yIG9wY29kZXMuICAqLwotICBmb3IgKHAgPSB0Y19zeW1ib2xfY2hhcnM7ICpwOyArK3ApCi0gICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVDsKLSNlbmRpZgotCi0gIC8qIFRoZSBtNjhrIGJhY2tlbmQgd2FudHMgdG8gYmUgYWJsZSB0byBjaGFuZ2UgY29tbWVudF9jaGFycy4gICovCi0jaWZuZGVmIHRjX2NvbW1lbnRfY2hhcnMKLSNkZWZpbmUgdGNfY29tbWVudF9jaGFycyBjb21tZW50X2NoYXJzCi0jZW5kaWYKLSAgZm9yIChwID0gdGNfY29tbWVudF9jaGFyczsgKnA7IHArKykKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19DT01NRU5UX1NUQVJUOwotICAgIH0JCQkJLyogZGVjbGFyZSBjb21tZW50IGNoYXJzICovCi0KLSAgZm9yIChwID0gbGluZV9jb21tZW50X2NoYXJzOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICB9CQkJCS8qIGRlY2xhcmUgbGluZSBjb21tZW50IGNoYXJzICovCi0KLSAgZm9yIChwID0gbGluZV9zZXBhcmF0b3JfY2hhcnM7ICpwOyBwKyspCi0gICAgewotICAgICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfTElORV9TRVBBUkFUT1I7Ci0gICAgfQkJCQkvKiBkZWNsYXJlIGxpbmUgc2VwYXJhdG9ycyAqLwotCi0gIC8qIE9ubHkgYWxsb3cgc2xhc2gtc3RhciBjb21tZW50cyBpZiBzbGFzaCBpcyBub3QgaW4gdXNlLgotICAgICBGSVhNRTogVGhpcyBpc24ndCByaWdodC4gIFdlIHNob3VsZCBhbHdheXMgcGVybWl0IHRoZW0uICAqLwotICBpZiAobGV4WycvJ10gPT0gMCkKLSAgICB7Ci0gICAgICBsZXhbJy8nXSA9IExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOwotICAgIH0KLQotICBpZiAobTY4a19tcmkpCi0gICAgewotICAgICAgbGV4WydcJyddID0gTEVYX0lTX1NUUklOR1FVT1RFOwotICAgICAgbGV4Wyc7J10gPSBMRVhfSVNfQ09NTUVOVF9TVEFSVDsKLSAgICAgIGxleFsnKiddID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICAgIC8qIFRoZSBNUkkgZG9jdW1lbnRhdGlvbiBzYXlzICchJyBpcyBMRVhfSVNfQ09NTUVOVF9TVEFSVCwgYnV0Ci0gICAgICAgICB0aGVuIGl0IGNhbid0IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4gICovCi0gICAgICBsZXhbJyEnXSA9IExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQ7Ci0gICAgfQotCi0jaWZkZWYgVENfVjg1MAotICBsZXhbJy0nXSA9IExFWF9JU19ET1VCTEVEQVNIXzFTVDsKLSNlbmRpZgotI2lmZGVmIFRDX00zMlIKLSAgbGV4Wyd8J10gPSBMRVhfSVNfRE9VQkxFQkFSXzFTVDsKLSNlbmRpZgotI2lmZGVmIFRDX0QzMFYKLSAgLyogbXVzdCBkbyB0aGlzIGlzIHdlIHdhbnQgVkxJVyBpbnN0cnVjdGlvbiB3aXRoICItPiIgb3IgIjwtIiAqLwotICBsZXhbJy0nXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotI2VuZGlmCi19CQkJCS8qIGRvX3NjcnViX2JlZ2luKCkgKi8KLQotLyogU2F2ZWQgc3RhdGUgb2YgdGhlIHNjcnViYmVyICovCi1zdGF0aWMgaW50IHN0YXRlOwotc3RhdGljIGludCBvbGRfc3RhdGU7Ci1zdGF0aWMgY2hhciAqb3V0X3N0cmluZzsKLXN0YXRpYyBjaGFyIG91dF9idWZbMjBdOwotc3RhdGljIGludCBhZGRfbmV3bGluZXM7Ci1zdGF0aWMgY2hhciAqc2F2ZWRfaW5wdXQ7Ci1zdGF0aWMgaW50IHNhdmVkX2lucHV0X2xlbjsKLXN0YXRpYyBjaGFyIGlucHV0X2J1ZmZlclszMiAqIDEwMjRdOwotc3RhdGljIGNvbnN0IGNoYXIgKm1yaV9zdGF0ZTsKLXN0YXRpYyBjaGFyIG1yaV9sYXN0X2NoOwotCi0vKiBEYXRhIHN0cnVjdHVyZSBmb3Igc2F2aW5nIHRoZSBzdGF0ZSBvZiBhcHAgYWNyb3NzICNpbmNsdWRlJ3MuICBOb3RlIHRoYXQKLSAgIGFwcCBpcyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgdG8gdGhlIHBhcnNpbmcgb2YgdGhlIC5pbmNsdWRlJ3MsIHNvIG91cgotICAgc3RhdGUgYXQgdGhlIHRpbWUgLmluY2x1ZGUgaXMgaW50ZXJwcmV0ZWQgaXMgY29tcGxldGVseSB1bnJlbGF0ZWQuCi0gICBUaGF0J3Mgd2h5IHdlIGhhdmUgdG8gc2F2ZSBpdCBhbGwuICAqLwotCi1zdHJ1Y3QgYXBwX3NhdmUKLSAgewotICAgIGludCAgICAgICAgICBzdGF0ZTsKLSAgICBpbnQgICAgICAgICAgb2xkX3N0YXRlOwotICAgIGNoYXIgKiAgICAgICBvdXRfc3RyaW5nOwotICAgIGNoYXIgICAgICAgICBvdXRfYnVmW3NpemVvZiAob3V0X2J1ZildOwotICAgIGludCAgICAgICAgICBhZGRfbmV3bGluZXM7Ci0gICAgY2hhciAqICAgICAgIHNhdmVkX2lucHV0OwotICAgIGludCAgICAgICAgICBzYXZlZF9pbnB1dF9sZW47Ci0gICAgaW50ICAgICAgICAgIHNjcnViX202OGtfbXJpOwotICAgIGNvbnN0IGNoYXIgKiBtcmlfc3RhdGU7Ci0gICAgY2hhciAgICAgICAgIG1yaV9sYXN0X2NoOwotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICAgIGNvbnN0IGNoYXIgKiBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLSAgfTsKLQotY2hhciAqCi1hcHBfcHVzaCAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgYXBwX3NhdmUgKnNhdmVkOwotCi0gIHNhdmVkID0gKHN0cnVjdCBhcHBfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKCpzYXZlZCkpOwotICBzYXZlZC0+c3RhdGUgPSBzdGF0ZTsKLSAgc2F2ZWQtPm9sZF9zdGF0ZSA9IG9sZF9zdGF0ZTsKLSAgc2F2ZWQtPm91dF9zdHJpbmcgPSBvdXRfc3RyaW5nOwotICBtZW1jcHkgKHNhdmVkLT5vdXRfYnVmLCBvdXRfYnVmLCBzaXplb2YgKG91dF9idWYpKTsKLSAgc2F2ZWQtPmFkZF9uZXdsaW5lcyA9IGFkZF9uZXdsaW5lczsKLSAgaWYgKHNhdmVkX2lucHV0ID09IE5VTEwpCi0gICAgc2F2ZWQtPnNhdmVkX2lucHV0ID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNhdmVkLT5zYXZlZF9pbnB1dCA9IHhtYWxsb2MgKHNhdmVkX2lucHV0X2xlbik7Ci0gICAgICBtZW1jcHkgKHNhdmVkLT5zYXZlZF9pbnB1dCwgc2F2ZWRfaW5wdXQsIHNhdmVkX2lucHV0X2xlbik7Ci0gICAgICBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuID0gc2F2ZWRfaW5wdXRfbGVuOwotICAgIH0KLSAgc2F2ZWQtPnNjcnViX202OGtfbXJpID0gc2NydWJfbTY4a19tcmk7Ci0gIHNhdmVkLT5tcmlfc3RhdGUgPSBtcmlfc3RhdGU7Ci0gIHNhdmVkLT5tcmlfbGFzdF9jaCA9IG1yaV9sYXN0X2NoOwotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICBzYXZlZC0+c3ltdmVyX3N0YXRlID0gc3ltdmVyX3N0YXRlOwotI2VuZGlmCi0KLSAgLyogZG9fc2NydWJfYmVnaW4oKSBpcyBub3QgdXNlZnVsLCBqdXN0IHdhc3RlcyB0aW1lLiAqLwotCi0gIHN0YXRlID0gMDsKLSAgc2F2ZWRfaW5wdXQgPSBOVUxMOwotCi0gIHJldHVybiAoY2hhciAqKSBzYXZlZDsKLX0KLQotdm9pZCAKLWFwcF9wb3AgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3QgYXBwX3NhdmUgKnNhdmVkID0gKHN0cnVjdCBhcHBfc2F2ZSAqKSBhcmc7Ci0KLSAgLyogVGhlcmUgaXMgbm8gZG9fc2NydWJfZW5kICgpLiAqLwotICBzdGF0ZSA9IHNhdmVkLT5zdGF0ZTsKLSAgb2xkX3N0YXRlID0gc2F2ZWQtPm9sZF9zdGF0ZTsKLSAgb3V0X3N0cmluZyA9IHNhdmVkLT5vdXRfc3RyaW5nOwotICBtZW1jcHkgKG91dF9idWYsIHNhdmVkLT5vdXRfYnVmLCBzaXplb2YgKG91dF9idWYpKTsKLSAgYWRkX25ld2xpbmVzID0gc2F2ZWQtPmFkZF9uZXdsaW5lczsKLSAgaWYgKHNhdmVkLT5zYXZlZF9pbnB1dCA9PSBOVUxMKQotICAgIHNhdmVkX2lucHV0ID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoc2F2ZWQtPnNhdmVkX2lucHV0X2xlbiA8PSBzaXplb2YgaW5wdXRfYnVmZmVyKTsKLSAgICAgIG1lbWNweSAoaW5wdXRfYnVmZmVyLCBzYXZlZC0+c2F2ZWRfaW5wdXQsIHNhdmVkLT5zYXZlZF9pbnB1dF9sZW4pOwotICAgICAgc2F2ZWRfaW5wdXQgPSBpbnB1dF9idWZmZXI7Ci0gICAgICBzYXZlZF9pbnB1dF9sZW4gPSBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuOwotICAgICAgZnJlZSAoc2F2ZWQtPnNhdmVkX2lucHV0KTsKLSAgICB9Ci0gIHNjcnViX202OGtfbXJpID0gc2F2ZWQtPnNjcnViX202OGtfbXJpOwotICBtcmlfc3RhdGUgPSBzYXZlZC0+bXJpX3N0YXRlOwotICBtcmlfbGFzdF9jaCA9IHNhdmVkLT5tcmlfbGFzdF9jaDsKLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLSAgc3ltdmVyX3N0YXRlID0gc2F2ZWQtPnN5bXZlcl9zdGF0ZTsKLSNlbmRpZgotCi0gIGZyZWUgKGFyZyk7Ci19CQkJCS8qIGFwcF9wb3AoKSAqLwotCi0vKiBAQCBUaGlzIGFzc3VtZXMgdGhhdCBcbiAmYyBhcmUgdGhlIHNhbWUgb24gaG9zdCBhbmQgdGFyZ2V0LiAgVGhpcyBpcyBub3QKLSAgIG5lY2Vzc2FyaWx5IHRydWUuICAqLwotc3RhdGljIGludCAKLXByb2Nlc3NfZXNjYXBlIChjaCkKLSAgICAgaW50IGNoOwotewotICBzd2l0Y2ggKGNoKQotICAgIHsKLSAgICBjYXNlICdiJzoKLSAgICAgIHJldHVybiAnXGInOwotICAgIGNhc2UgJ2YnOgotICAgICAgcmV0dXJuICdcZic7Ci0gICAgY2FzZSAnbic6Ci0gICAgICByZXR1cm4gJ1xuJzsKLSAgICBjYXNlICdyJzoKLSAgICAgIHJldHVybiAnXHInOwotICAgIGNhc2UgJ3QnOgotICAgICAgcmV0dXJuICdcdCc7Ci0gICAgY2FzZSAnXCcnOgotICAgICAgcmV0dXJuICdcJyc7Ci0gICAgY2FzZSAnIic6Ci0gICAgICByZXR1cm4gJ1wiJzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGNoOwotICAgIH0KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBpbnB1dCBjaGFyYWN0ZXJzLiAgVGhlIEdFVAotICAgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcmV0cmlldmUgbW9yZSBpbnB1dCBjaGFyYWN0ZXJzLiAgR0VUIHNob3VsZAotICAgc2V0IGl0cyBwYXJhbWV0ZXIgdG8gcG9pbnQgdG8gYSBidWZmZXIsIGFuZCByZXR1cm4gdGhlIGxlbmd0aCBvZgotICAgdGhlIGJ1ZmZlcjsgaXQgc2hvdWxkIHJldHVybiAwIGF0IGVuZCBvZiBmaWxlLiAgVGhlIHNjcnViYmVkIG91dHB1dAotICAgY2hhcmFjdGVycyBhcmUgcHV0IGludG8gdGhlIGJ1ZmZlciBzdGFydGluZyBhdCBUT1NUQVJUOyB0aGUgVE9TVEFSVAotICAgYnVmZmVyIGlzIFRPTEVOIGJ5dGVzIGluIGxlbmd0aC4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIKLSAgIG9mIHNjcnViYmVkIGNoYXJhY3RlcnMgcHV0IGludG8gVE9TVEFSVC4gIFRoaXMgd2lsbCBiZSBUT0xFTiB1bmxlc3MKLSAgIGVuZCBvZiBmaWxlIHdhcyBzZWVuLiAgVGhpcyBmdW5jdGlvbiBpcyBhcnJhbmdlZCBhcyBhIHN0YXRlCi0gICBtYWNoaW5lLCBhbmQgc2F2ZXMgaXRzIHN0YXRlIHNvIHRoYXQgaXQgbWF5IHJldHVybiBhdCBhbnkgcG9pbnQuCi0gICBUaGlzIGlzIHRoZSB3YXkgdGhlIG9sZCBjb2RlIHVzZWQgdG8gd29yay4gICovCi0KLWludAotZG9fc2NydWJfY2hhcnMgKGdldCwgdG9zdGFydCwgdG9sZW4pCi0gICAgIGludCAoKmdldCkgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLSAgICAgY2hhciAqdG9zdGFydDsKLSAgICAgaW50IHRvbGVuOwotewotICBjaGFyICp0byA9IHRvc3RhcnQ7Ci0gIGNoYXIgKnRvZW5kID0gdG9zdGFydCArIHRvbGVuOwotICBjaGFyICpmcm9tOwotICBjaGFyICpmcm9tZW5kOwotICBpbnQgZnJvbWxlbjsKLSAgcmVnaXN0ZXIgaW50IGNoLCBjaDIgPSAwOwotCi0gIC8qU3RhdGUgMDogYmVnaW5uaW5nIG9mIG5vcm1hbCBsaW5lCi0JICAxOiBBZnRlciBmaXJzdCB3aGl0ZXNwYWNlIG9uIGxpbmUgKGZsdXNoIG1vcmUgd2hpdGUpCi0JICAyOiBBZnRlciBmaXJzdCBub24td2hpdGUgKG9wY29kZSkgb24gbGluZSAoa2VlcCAxd2hpdGUpCi0JICAzOiBhZnRlciBzZWNvbmQgd2hpdGUgb24gbGluZSAoaW50byBvcGVyYW5kcykgKGZsdXNoIHdoaXRlKQotCSAgNDogYWZ0ZXIgcHV0dGluZyBvdXQgYSAubGluZSwgcHV0IG91dCBkaWdpdHMKLQkgIDU6IHBhcnNpbmcgYSBzdHJpbmcsIHRoZW4gZ28gdG8gb2xkLXN0YXRlCi0JICA2OiBwdXR0aW5nIG91dCBcIGVzY2FwZSBpbiBhICJkIHN0cmluZy4KLQkgIDc6IEFmdGVyIHB1dHRpbmcgb3V0IGEgLmFwcGZpbGUsIHB1dCBvdXQgc3RyaW5nLgotCSAgODogQWZ0ZXIgcHV0dGluZyBvdXQgYSAuYXBwZmlsZSBzdHJpbmcsIGZsdXNoIHVudGlsIG5ld2xpbmUuCi0JICA5OiBBZnRlciBzZWVpbmcgc3ltYm9sIGNoYXIgaW4gc3RhdGUgMyAoa2VlcCAxd2hpdGUgYWZ0ZXIgc3ltY2hhcikKLQkgMTA6IEFmdGVyIHNlZWluZyB3aGl0ZXNwYWNlIGluIHN0YXRlIDkgKGtlZXAgd2hpdGUgYmVmb3JlIHN5bWNoYXIpCi0JIDExOiBBZnRlciBzZWVpbmcgYSBzeW1ib2wgY2hhcmFjdGVyIGluIHN0YXRlIDAgKGVnIGEgbGFiZWwgZGVmaW5pdGlvbikKLQkgLTE6IG91dHB1dCBzdHJpbmcgaW4gb3V0X3N0cmluZyBhbmQgZ28gdG8gdGhlIHN0YXRlIGluIG9sZF9zdGF0ZQotCSAtMjogZmx1c2ggdGV4dCB1bnRpbCBhICcqJyAnLycgaXMgc2VlbiwgdGhlbiBnbyB0byBzdGF0ZSBvbGRfc3RhdGUKLSNpZmRlZiBUQ19WODUwCi0gICAgICAgICAxMjogQWZ0ZXIgc2VlaW5nIGEgZGFzaCwgbG9va2luZyBmb3IgYSBzZWNvbmQgZGFzaCBhcyBhIHN0YXJ0IG9mIGNvbW1lbnQuCi0jZW5kaWYKLSNpZmRlZiBUQ19NMzJSCi0JIDEzOiBBZnRlciBzZWVpbmcgYSB2ZXJ0aWNhbCBiYXIsIGxvb2tpbmcgZm9yIGEgc2Vjb25kIHZlcnRpY2FsIGJhciBhcyBhIHBhcmFsbGVsIGV4cHJlc3Npb24gc2VwZXJhdG9yLgotI2VuZGlmCi0JICAqLwotCi0gIC8qIEkgYWRkZWQgc3RhdGVzIDkgYW5kIDEwIGJlY2F1c2UgdGhlIE1JUFMgRUNPRkYgYXNzZW1ibGVyIHVzZXMKLSAgICAgY29uc3RydWN0cyBsaWtlIGBgLmxvYyAxIDIwJycuICBUaGlzIHdhcyB0dXJuaW5nIGludG8gYGAubG9jCi0gICAgIDEyMCcnLiAgU3RhdGVzIDkgYW5kIDEwIGVuc3VyZSB0aGF0IGEgc3BhY2UgaXMgbmV2ZXIgZHJvcHBlZCBpbgotICAgICBiZXR3ZWVuIGNoYXJhY3RlcnMgd2hpY2ggY291bGQgYXBwZWFyIGluIGEgaWRlbnRpZmllci4gIElhbgotICAgICBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgotCi0gICAgIEkgYWRkZWQgc3RhdGUgMTEgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiTGZvbyBhZGQgJXIyNSwlcjI2LCVyMjciIHdvcmtzCi0gICAgIGNvcnJlY3RseSBvbiB0aGUgUEEgKGFuZCBhbnkgb3RoZXIgdGFyZ2V0IHdoZXJlIGNvbG9ucyBhcmUgb3B0aW9uYWwpLgotICAgICBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1LgotCi0gICAgIEkgYWRkZWQgc3RhdGUgMTMgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiY21wIHIxLCByMiB8fCB0cmFwICMxIiBkb2VzIG5vdAotICAgICBnZXQgc3F1YXNoZWQgaW50byAiY21wIHIxLHIyfHx0cmFwIzEiLCB3aXRoIHRoZSBhbGwgaW1wb3J0YW50IHNwYWNlCi0gICAgIGJldHdlZW4gdGhlICd0cmFwJyBhbmQgdGhlICcjMScgYmVpbmcgZWxpbWluYXRlZC4gIG5pY2tjQGN5Z251cy5jb20gICovCi0KLSAgLyogVGhpcyBtYWNybyBnZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4gICovCi0KLSNkZWZpbmUgR0VUKCkJCQkJCQkJXAotICAoZnJvbSA8IGZyb21lbmQJCQkJCQlcCi0gICA/ICogKHVuc2lnbmVkIGNoYXIgKikgKGZyb20rKykJCQkJXAotICAgOiAoc2F2ZWRfaW5wdXQgPSBOVUxMLAkJCQkJXAotICAgICAgZnJvbWxlbiA9ICgqZ2V0KSAoaW5wdXRfYnVmZmVyLCBzaXplb2YgaW5wdXRfYnVmZmVyKSwJXAotICAgICAgZnJvbSA9IGlucHV0X2J1ZmZlciwJCQkJCVwKLSAgICAgIGZyb21lbmQgPSBmcm9tICsgZnJvbWxlbiwJCQkJCVwKLSAgICAgIChmcm9tbGVuID09IDAJCQkJCQlcCi0gICAgICAgPyBFT0YJCQkJCQkJXAotICAgICAgIDogKiAodW5zaWduZWQgY2hhciAqKSAoZnJvbSsrKSkpKQotCi0gIC8qIFRoaXMgbWFjcm8gcHVzaGVzIGEgY2hhcmFjdGVyIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbS4gICovCi0KLSNkZWZpbmUgVU5HRVQodWNoKSAoKi0tZnJvbSA9ICh1Y2gpKQotCi0gIC8qIFRoaXMgbWFjcm8gcHV0cyBhIGNoYXJhY3RlciBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLiAgSWYgdGhpcwotICAgICBjaGFyYWN0ZXIgZmlsbHMgdGhlIG91dHB1dCBidWZmZXIsIHRoaXMgbWFjcm8ganVtcHMgdG8gdGhlIGxhYmVsCi0gICAgIFRPRlVMTC4gIFdlIHVzZSB0aGlzIHJhdGhlciB1Z2x5IGFwcHJvYWNoIGJlY2F1c2Ugd2UgbmVlZCB0bwotICAgICBoYW5kbGUgdHdvIGRpZmZlcmVudCB0ZXJtaW5hdGlvbiBjb25kaXRpb25zOiBFT0Ygb24gdGhlIGlucHV0Ci0gICAgIHN0cmVhbSwgYW5kIGEgZnVsbCBvdXRwdXQgYnVmZmVyLiAgSXQgd291bGQgYmUgc2ltcGxlciBpZiB3ZQotICAgICBhbHdheXMgcmVhZCBpbiB0aGUgZW50aXJlIGlucHV0IHN0cmVhbSBiZWZvcmUgcHJvY2Vzc2luZyBpdCwgYnV0Ci0gICAgIEkgZG9uJ3Qgd2FudCB0byBtYWtlIHN1Y2ggYSBzaWduaWZpY2FudCBjaGFuZ2UgdG8gdGhlIGFzc2VtYmxlcidzCi0gICAgIG1lbW9yeSB1c2FnZS4gICovCi0KLSNkZWZpbmUgUFVUKHBjaCkJCQlcCi0gIGRvCQkJCQlcCi0gICAgewkJCQkJXAotICAgICAgKnRvKysgPSAocGNoKTsJCQlcCi0gICAgICBpZiAodG8gPj0gdG9lbmQpCQkJXAotICAgICAgICBnb3RvIHRvZnVsbDsJCQlcCi0gICAgfQkJCQkJXAotICB3aGlsZSAoMCkKLQotICBpZiAoc2F2ZWRfaW5wdXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcm9tID0gc2F2ZWRfaW5wdXQ7Ci0gICAgICBmcm9tZW5kID0gZnJvbSArIHNhdmVkX2lucHV0X2xlbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcm9tbGVuID0gKCpnZXQpIChpbnB1dF9idWZmZXIsIHNpemVvZiBpbnB1dF9idWZmZXIpOwotICAgICAgaWYgKGZyb21sZW4gPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGZyb20gPSBpbnB1dF9idWZmZXI7Ci0gICAgICBmcm9tZW5kID0gZnJvbSArIGZyb21sZW47Ci0gICAgfQotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIFRoZSBjYXNlcyBpbiB0aGlzIHN3aXRjaCBlbmQgd2l0aCBjb250aW51ZSwgaW4gb3JkZXIgdG8KLSAgICAgICAgIGJyYW5jaCBiYWNrIHRvIHRoZSB0b3Agb2YgdGhpcyB3aGlsZSBsb29wIGFuZCBnZW5lcmF0ZSB0aGUKLSAgICAgICAgIG5leHQgb3V0cHV0IGNoYXJhY3RlciBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUuICAqLwotICAgICAgc3dpdGNoIChzdGF0ZSkKLQl7Ci0JY2FzZSAtMToKLQkgIGNoID0gKm91dF9zdHJpbmcrKzsKLQkgIGlmICgqb3V0X3N0cmluZyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgb2xkX3N0YXRlID0gMzsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgLTI6Ci0JICBmb3IgKDs7KQotCSAgICB7Ci0JICAgICAgZG8KLQkJewotCQkgIGNoID0gR0VUICgpOwotCi0JCSAgaWYgKGNoID09IEVPRikKLQkJICAgIHsKLQkJICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIpKTsKLQkJICAgICAgZ290byBmcm9tZW9mOwotCQkgICAgfQotCi0JCSAgaWYgKGNoID09ICdcbicpCi0JCSAgICBQVVQgKCdcbicpOwotCQl9Ci0JICAgICAgd2hpbGUgKGNoICE9ICcqJyk7Ci0KLQkgICAgICB3aGlsZSAoKGNoID0gR0VUICgpKSA9PSAnKicpCi0JCTsKLQotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50IikpOwotCQkgIGdvdG8gZnJvbWVvZjsKLQkJfQotCi0JICAgICAgaWYgKGNoID09ICcvJykKLQkJYnJlYWs7Ci0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICB9Ci0KLQkgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgVU5HRVQgKCcgJyk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgNDoKLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgZWxzZSBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKLQkgICAgUFVUIChjaCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSkKLQkJY2ggPSBHRVQgKCk7Ci0JICAgICAgaWYgKGNoID09ICciJykKLQkJewotCQkgIFVOR0VUIChjaCk7Ci0JCSAgaWYgKHNjcnViX202OGtfbXJpKQotCQkgICAgb3V0X3N0cmluZyA9ICJcblx0YXBwZmlsZSAiOwotCQkgIGVsc2UKLQkJICAgIG91dF9zdHJpbmcgPSAiXG5cdC5hcHBmaWxlICI7Ci0JCSAgb2xkX3N0YXRlID0gNzsKLQkJICBzdGF0ZSA9IC0xOwotCQkgIFBVVCAoKm91dF9zdHJpbmcrKyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB3aGlsZSAoY2ggIT0gRU9GICYmIGNoICE9ICdcbicpCi0JCSAgICBjaCA9IEdFVCAoKTsKLQkJICBzdGF0ZSA9IDA7Ci0JCSAgUFVUIChjaCk7Ci0JCX0KLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlIDU6Ci0JICAvKiBXZSBhcmUgZ29pbmcgdG8gY29weSBldmVyeXRoaW5nIHVwIHRvIGEgcXVvdGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgIHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYSBiYWNrc2xhc2guICBXZSB0cnkgdG8KLSAgICAgICAgICAgICBvcHRpbWl6ZSB0aGUgY29weWluZyBpbiB0aGUgc2ltcGxlIGNhc2Ugd2l0aG91dCB1c2luZyB0aGUKLSAgICAgICAgICAgICBHRVQgYW5kIFBVVCBtYWNyb3MuICAqLwotCSAgewotCSAgICBjaGFyICpzOwotCSAgICBpbnQgbGVuOwotCi0JICAgIGZvciAocyA9IGZyb207IHMgPCBmcm9tZW5kOyBzKyspCi0JICAgICAgewotCQljaCA9ICpzOwotCQkvKiBUaGlzIGNvbmRpdGlvbiBtdXN0IGJlIGNoYW5nZWQgaWYgdGhlIHR5cGUgb2YgYW55Ci0gICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhcmFjdGVyIGNhbiBiZSBMRVhfSVNfU1RSSU5HUVVPVEUuICAqLwotCQlpZiAoY2ggPT0gJ1xcJwotCQkgICAgfHwgY2ggPT0gJyInCi0JCSAgICB8fCBjaCA9PSAnXCcnCi0JCSAgICB8fCBjaCA9PSAnXG4nKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgbGVuID0gcyAtIGZyb207Ci0JICAgIGlmIChsZW4gPiB0b2VuZCAtIHRvKQotCSAgICAgIGxlbiA9IHRvZW5kIC0gdG87Ci0JICAgIGlmIChsZW4gPiAwKQotCSAgICAgIHsKLQkJbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKLQkJdG8gKz0gbGVuOwotCQlmcm9tICs9IGxlbjsKLQkgICAgICB9Ci0JICB9Ci0KLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIHN0cmluZzogaW5zZXJ0ZWQgJ1wiJyIpKTsKLQkgICAgICBzdGF0ZSA9IG9sZF9zdGF0ZTsKLQkgICAgICBVTkdFVCAoJ1xuJyk7Ci0JICAgICAgUFVUICgnIicpOwotCSAgICB9Ci0JICBlbHNlIGlmIChsZXhbY2hdID09IExFWF9JU19TVFJJTkdRVU9URSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0jaWZuZGVmIE5PX1NUUklOR19FU0NBUEVTCi0JICBlbHNlIGlmIChjaCA9PSAnXFwnKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSA2OwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0jZW5kaWYKLQkgIGVsc2UgaWYgKHNjcnViX202OGtfbXJpICYmIGNoID09ICdcbicpCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IHF1aWV0bHkgdGVybWluYXRlIHRoZSBzdHJpbmcuICBUaGlzIHBlcm1pdHMgbGluZXMgbGlrZQotCQkgICBibmUJbGFiZWwJbG9vcCBpZiB3ZSBoYXZlbid0IHJlYWNoIGVuZCB5ZXQKLQkJICovCi0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBQVVQgKCdcJycpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlIDY6Ci0JICBzdGF0ZSA9IDU7Ci0JICBjaCA9IEdFVCAoKTsKLQkgIHN3aXRjaCAoY2gpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgc3RyaW5ncyBicm9rZW4gYWNyb3NzIGxpbmVzLCBieSB0dXJuaW5nICdcbicgaW50bwotCQkgJ1xcJyBhbmQgJ24nLiAgKi8KLQkgICAgY2FzZSAnXG4nOgotCSAgICAgIFVOR0VUICgnbicpOwotCSAgICAgIGFkZF9uZXdsaW5lcysrOwotCSAgICAgIFBVVCAoJ1xcJyk7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnIic6Ci0JICAgIGNhc2UgJ1xcJzoKLQkgICAgY2FzZSAnYic6Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICduJzoKLQkgICAgY2FzZSAncic6Ci0JICAgIGNhc2UgJ3QnOgotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICcwJzoKLQkgICAgY2FzZSAnMSc6Ci0JICAgIGNhc2UgJzInOgotCSAgICBjYXNlICczJzoKLQkgICAgY2FzZSAnNCc6Ci0JICAgIGNhc2UgJzUnOgotCSAgICBjYXNlICc2JzoKLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgYnJlYWs7Ci0jaWYgZGVmaW5lZChJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUykgfCBkZWZpbmVkKE9OTFlfU1RBTkRBUkRfRVNDQVBFUykKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc193YXJuIChfKCJVbmtub3duIGVzY2FwZSAnXFwlYycgaW4gc3RyaW5nOiBJZ25vcmVkIiksIGNoKTsKLQkgICAgICBicmVhazsKLSNlbHNlICAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBBY2NlcHQgXHggYXMgeCBmb3IgYW55IHggKi8KLQkgICAgICBicmVhazsKLSNlbmRpZiAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQotCSAgICBjYXNlIEVPRjoKLQkgICAgICBhc193YXJuIChfKCJFbmQgb2YgZmlsZSBpbiBzdHJpbmc6ICdcIicgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgUFVUICgnIicpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBQVVQgKGNoKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSA3OgotCSAgY2ggPSBHRVQgKCk7Ci0JICBzdGF0ZSA9IDU7Ci0JICBvbGRfc3RhdGUgPSA4OwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgODoKLQkgIGRvCi0JICAgIGNoID0gR0VUICgpOwotCSAgd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoY2gpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPSywgd2UgYXJlIHNvbWV3aGVyZSBpbiBzdGF0ZXMgMCB0aHJvdWdoIDQgb3IgOSB0aHJvdWdoIDExICovCi0KLSAgICAgIC8qIGZsdXNoY2hhcjogKi8KLSAgICAgIGNoID0gR0VUICgpOwotCi0gICAgcmVjeWNsZToKLQotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICAgICAgLyogV2UgbmVlZCB0byB3YXRjaCBvdXQgZm9yIC5zeW12ZXIgZGlyZWN0aXZlcy4gIFNlZSB0aGUgY29tbWVudCBsYXRlcgotCSBpbiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChzeW12ZXJfc3RhdGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkgJiYgY2ggPT0gc3ltdmVyX3BzZXVkb1swXSkKLQkgICAgc3ltdmVyX3N0YXRlID0gc3ltdmVyX3BzZXVkbyArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGFkdmFuY2UgdG8gdGhlIG5leHQgc3RhdGUgaWYgd2UgZmluZCB0aGUgcmlnaHQKLQkgICAgIGNoYXJhY3Rlci4gICovCi0JICBpZiAoY2ggIT0gJ1wwJyAmJiAoKnN5bXZlcl9zdGF0ZSA9PSBjaCkpCi0JICAgICsrc3ltdmVyX3N0YXRlOwotCSAgZWxzZSBpZiAoKnN5bXZlcl9zdGF0ZSAhPSAnXDAnKQotCSAgICAvKiBXZSBkaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyLCBvciB3ZSBkaWRuJ3QKLQkgICAgICAgZ2V0IGEgdmFsaWQgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFmdGVyIHNlZWluZyB0aGUKLQkgICAgICAgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLwotCSAgICBzeW12ZXJfc3RhdGUgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgcmVhZCB0aGUgZW50aXJlIHBzZXVkby1vcC4gIElmIHRoaXMgaXMgdGhlIGVuZAotCQkgb2YgdGhlIGxpbmUsIGdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gICovCi0JICAgICAgaWYgKElTX05FV0xJTkUgKGNoKSkKLQkJc3ltdmVyX3N0YXRlID0gTlVMTDsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBUQ19BUk0gJiYgT0JKX0VMRiAqLwotCi0jaWZkZWYgVENfTTY4SwotICAgICAgLyogV2Ugd2FudCB0byBoYXZlIHBzZXVkby1vcHMgd2hpY2ggY29udHJvbCB3aGV0aGVyIHdlIGFyZSBpbgotICAgICAgICAgTVJJIG1vZGUgb3Igbm90LiAgVW5mb3J0dW5hdGVseSwgc2luY2UgbTY4ayBNUkkgbW9kZSBhZmZlY3RzCi0gICAgICAgICB0aGUgc2NydWJiZXIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIGEgc3BlY2lhbCBwdXJwb3NlCi0gICAgICAgICByZWNvZ25pemVyIGhlcmUuICAqLwotICAgICAgaWYgKG1yaV9zdGF0ZSA9PSBOVUxMKQotCXsKLQkgIGlmICgoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKQotCSAgICAgICYmIGNoID09IG1yaV9wc2V1ZG9bMF0pCi0JICAgIG1yaV9zdGF0ZSA9IG1yaV9wc2V1ZG8gKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhZHZhbmNlIHRvIHRoZSBuZXh0IHN0YXRlIGlmIHdlIGZpbmQgdGhlIHJpZ2h0Ci0JICAgICBjaGFyYWN0ZXIsIG9yIGlmIHdlIG5lZWQgYSBzcGFjZSBjaGFyYWN0ZXIgYW5kIHdlIGdldCBhbnkKLQkgICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVyLCBvciBpZiB3ZSBuZWVkIGEgJzAnIGFuZCB3ZSBnZXQgYQotCSAgICAgJzEnICh0aGlzIGlzIHNvIHRoYXQgd2Ugb25seSBuZWVkIG9uZSBzdGF0ZSB0byBoYW5kbGUKLQkgICAgIGBgLm1yaSAwJycgYW5kIGBgLm1yaSAxJycpLiAgKi8KLQkgIGlmIChjaCAhPSAnXDAnCi0JICAgICAgJiYgKCptcmlfc3RhdGUgPT0gY2gKLQkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnICcKLQkJICAgICAgJiYgbGV4W2NoXSA9PSBMRVhfSVNfV0hJVEVTUEFDRSkKLQkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnMCcKLQkJICAgICAgJiYgY2ggPT0gJzEnKSkpCi0JICAgIHsKLQkgICAgICBtcmlfbGFzdF9jaCA9IGNoOwotCSAgICAgICsrbXJpX3N0YXRlOwotCSAgICB9Ci0JICBlbHNlIGlmICgqbXJpX3N0YXRlICE9ICdcMCcKLQkJICAgfHwgKGxleFtjaF0gIT0gTEVYX0lTX1dISVRFU1BBQ0UKLQkJICAgICAgICYmIGxleFtjaF0gIT0gTEVYX0lTX05FV0xJTkUpKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIGNoYXJhY3Rlciwgb3Igd2UgZGlkbid0Ci0JCSBnZXQgYSB2YWxpZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYWZ0ZXIgc2VlaW5nIHRoZQotCQkgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZQotCQkgYmVnaW5uaW5nLiAgKi8KLQkgICAgICBtcmlfc3RhdGUgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSByZWFkIHRoZSBlbnRpcmUgcHNldWRvLW9wLiAgbWlwc19sYXN0X2NoIGlzCi0gICAgICAgICAgICAgICAgIGVpdGhlciAnMCcgb3IgJzEnIGluZGljYXRpbmcgd2hldGhlciB0byBlbnRlciBvcgotICAgICAgICAgICAgICAgICBsZWF2ZSBNUkkgbW9kZS4gICovCi0JICAgICAgZG9fc2NydWJfYmVnaW4gKG1yaV9sYXN0X2NoID09ICcxJyk7Ci0JICAgICAgbXJpX3N0YXRlID0gTlVMTDsKLQotCSAgICAgIC8qIFdlIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBjaGFyYWN0ZXIgYXMgdXN1YWwuICBUaGUKLSAgICAgICAgICAgICAgICAgbWFpbiBnYXMgcmVhZGVyIG11c3QgYWxzbyBoYW5kbGUgdGhlIC5tcmkgcHNldWRvLW9wCi0gICAgICAgICAgICAgICAgIHRvIGNvbnRyb2wgZXhwcmVzc2lvbiBwYXJzaW5nIGFuZCB0aGUgbGlrZS4gICovCi0JICAgIH0KLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGNoID09IEVPRikKLQl7Ci0JICBpZiAoc3RhdGUgIT0gMCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgICAgIHN0YXRlID0gMDsKLQkgICAgICBQVVQgKCdcbicpOwotCSAgICB9Ci0JICBnb3RvIGZyb21lb2Y7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGxleFtjaF0pCi0JewotCWNhc2UgTEVYX0lTX1dISVRFU1BBQ0U6Ci0JICBkbwotCSAgICB7Ci0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgIH0KLQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgSVNfV0hJVEVTUEFDRSAoY2gpKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQotCSAgaWYgKHN0YXRlID09IDApCi0JICAgIHsKLQkgICAgICAvKiBQcmVzZXJ2ZSBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhdCB0aGUKLQkJIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotCSAgICAgIHN0YXRlID0gMTsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoSVNfQ09NTUVOVCAoY2gpCi0JICAgICAgfHwgY2ggPT0gJy8nCi0JICAgICAgfHwgSVNfTElORV9TRVBBUkFUT1IgKGNoKSkKLQkgICAgewotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJewotCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCi0JCSAgVU5HRVQgKGNoKTsKLQkJICBQVVQgKCcgJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UncmUgaW4gc3RhdGUgMiBvciAxMSwgd2UndmUgc2VlbiBhIG5vbi13aGl0ZQotCSAgICAgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuICBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIKLQkgICAgIGlzICc6JywgdGhpcyBpcyB3aGl0ZXNwYWNlIGFmdGVyIGEgbGFiZWwgbmFtZSB3aGljaCB3ZQotCSAgICAgbm9ybWFsbHkgbXVzdCBpZ25vcmUuICBJbiBNUkkgbW9kZSwgdGhvdWdoLCBzcGFjZXMgYXJlCi0JICAgICBub3QgcGVybWl0dGVkIGJldHdlZW4gdGhlIGxhYmVsIGFuZCB0aGUgY29sb24uICAqLwotCSAgaWYgKChzdGF0ZSA9PSAyIHx8IHN0YXRlID09IDExKQotCSAgICAgICYmIGxleFtjaF0gPT0gTEVYX0lTX0NPTE9OCi0JICAgICAgJiYgISBzY3J1Yl9tNjhrX21yaSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMTsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHN0YXRlKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBzdGF0ZSsrOwotCSAgICAgIGdvdG8gcmVjeWNsZTsJLyogUHVudGVkIGxlYWRpbmcgc3AgKi8KLQkgICAgY2FzZSAxOgotCSAgICAgIC8qIFdlIGNhbiBhcnJpdmUgaGVyZSBpZiB3ZSBsZWF2ZSBhIGxlYWRpbmcgd2hpdGVzcGFjZQotCQkgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBzdGF0ZSA9IDM7Ci0JICAgICAgaWYgKHRvICsgMSA8IHRvZW5kKQotCQl7Ci0JCSAgLyogT3B0aW1pemUgY29tbW9uIGNhc2UgYnkgc2tpcHBpbmcgVU5HRVQvR0VULiAgKi8KLQkJICBQVVQgKCcgJyk7CS8qIFNwIGFmdGVyIG9wY28gKi8KLQkJICBnb3RvIHJlY3ljbGU7Ci0JCX0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzOgotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJewotCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCi0JCSAgVU5HRVQgKGNoKTsKLQkJICBQVVQgKCcgJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBnb3RvIHJlY3ljbGU7CS8qIFNwIGluIG9wZXJhbmRzICovCi0JICAgIGNhc2UgOToKLQkgICAgY2FzZSAxMDoKLQkgICAgICBpZiAoc2NydWJfbTY4a19tcmkpCi0JCXsKLQkJICAvKiBJbiBNUkkgbW9kZSwgd2Uga2VlcCB0aGVzZSBzcGFjZXMuICAqLwotCQkgIHN0YXRlID0gMzsKLQkJICBVTkdFVCAoY2gpOwotCQkgIFBVVCAoJyAnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIHN0YXRlID0gMTA7CS8qIFNwIGFmdGVyIHN5bWJvbCBjaGFyICovCi0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICBjYXNlIDExOgotCSAgICAgIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTEFCRUxTX1dJVEhPVVRfQ09MT05TCi0JCSAgfHwgMQotI2VuZGlmCi0JCSAgKQotCQlzdGF0ZSA9IDE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2Uga25vdyB0aGF0IGNoIGlzIG5vdCAnOicsIHNpbmNlIHdlIHRlc3RlZCB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlIGFib3ZlLiAgVGhlcmVmb3JlIHRoaXMgaXMgbm90IGEgbGFiZWwsIHNvIGl0Ci0gICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBvcGNvZGUsIGFuZCB3ZSd2ZSBqdXN0IHNlZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlIGFmdGVyIGl0LiAgKi8KLQkJICBzdGF0ZSA9IDM7Ci0JCX0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsJLyogU3AgYWZ0ZXIgbGFiZWwgZGVmaW5pdGlvbi4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgQkFEX0NBU0UgKHN0YXRlKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOgotCSAgY2gyID0gR0VUICgpOwotCSAgaWYgKGNoMiA9PSAnKicpCi0JICAgIHsKLQkgICAgICBmb3IgKDs7KQotCQl7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgY2gyID0gR0VUICgpOwotCQkgICAgICBpZiAoY2gyICE9IEVPRiAmJiBJU19ORVdMSU5FIChjaDIpKQotCQkJYWRkX25ld2xpbmVzKys7Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKGNoMiAhPSBFT0YgJiYgY2gyICE9ICcqJyk7Ci0KLQkJICB3aGlsZSAoY2gyID09ICcqJykKLQkJICAgIGNoMiA9IEdFVCAoKTsKLQotCQkgIGlmIChjaDIgPT0gRU9GIHx8IGNoMiA9PSAnLycpCi0JCSAgICBicmVhazsKLQotCQkgIC8qIFRoaXMgVU5HRVQgd2lsbCBlbnN1cmUgdGhhdCB3ZSBjb3VudCBuZXdsaW5lcwotICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5LiAgKi8KLQkJICBVTkdFVCAoY2gyKTsKLQkJfQotCi0JICAgICAgaWYgKGNoMiA9PSBFT0YpCi0JCWFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IikpOwotCi0JICAgICAgY2ggPSAnICc7Ci0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoY2gyICE9IEVPRikKLQkJVU5HRVQgKGNoMik7Ci0JICAgICAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCi0JCXN0YXRlID0gMzsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19TVFJJTkdRVU9URToKLQkgIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIC8qIFByZXNlcnZlIHRoZSB3aGl0ZXNwYWNlIGluIGZvbyAiYmFyIiAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQotCSAgICAgIC8qIFBVVCBkaWRuJ3QganVtcCBvdXQuICBXZSBjb3VsZCBqdXN0IGJyZWFrLCBidXQgd2UKLSAgICAgICAgICAgICAgICAga25vdyB3aGF0IHdpbGwgaGFwcGVuLCBzbyBvcHRpbWl6ZSBhIGJpdC4gICovCi0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgICAgb2xkX3N0YXRlID0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gOSkKLQkgICAgb2xkX3N0YXRlID0gMzsKLQkgIGVsc2UKLQkgICAgb2xkX3N0YXRlID0gc3RhdGU7Ci0JICBzdGF0ZSA9IDU7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIElFRUVfU1RZTEUKLQljYXNlIExFWF9JU19PTkVDSEFSX1FVT1RFOgotCSAgaWYgKHN0YXRlID09IDEwKQotCSAgICB7Ci0JICAgICAgLyogUHJlc2VydmUgdGhlIHdoaXRlc3BhY2UgaW4gZm9vICdiJyAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgY2ggPSBHRVQgKCk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgYWZ0ZXIgYSBvbmUtY2hhcmFjdGVyIHF1b3RlOyBcXDAgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgY2ggPSAwOwotCSAgICB9Ci0JICBpZiAoY2ggPT0gJ1xcJykKLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBlc2NhcGUgY2hhcmFjdGVyIikpOwotCQkgIGNoID0gJ1xcJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJY2ggPSBwcm9jZXNzX2VzY2FwZSAoY2gpOwotCSAgICB9Ci0JICBzcHJpbnRmIChvdXRfYnVmLCAiJWQiLCAoaW50KSAodW5zaWduZWQgY2hhcikgY2gpOwotCi0JICAvKiBOb25lIG9mIHRoZXNlICd4IGNvbnN0YW50cyBmb3IgdXMuICBXZSB3YW50ICd4Jy4gICovCi0JICBpZiAoKGNoID0gR0VUICgpKSAhPSAnXCcnKQotCSAgICB7Ci0jaWZkZWYgUkVRVUlSRV9DSEFSX0NMT1NFX1FVT1RFCi0JICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIikpOwotI2Vsc2UKLQkgICAgICBpZiAoY2ggIT0gRU9GKQotCQlVTkdFVCAoY2gpOwotI2VuZGlmCi0JICAgIH0KLQkgIGlmIChzdHJsZW4gKG91dF9idWYpID09IDEpCi0JICAgIHsKLQkgICAgICBQVVQgKG91dF9idWZbMF0pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoc3RhdGUgPT0gOSkKLQkgICAgb2xkX3N0YXRlID0gMzsKLQkgIGVsc2UKLQkgICAgb2xkX3N0YXRlID0gc3RhdGU7Ci0JICBzdGF0ZSA9IC0xOwotCSAgb3V0X3N0cmluZyA9IG91dF9idWY7Ci0JICBQVVQgKCpvdXRfc3RyaW5nKyspOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgTEVYX0lTX0NPTE9OOgotCSAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCi0JICAgIHN0YXRlID0gMzsKLQkgIGVsc2UgaWYgKHN0YXRlICE9IDMpCi0JICAgIHN0YXRlID0gMTsKLQkgIFBVVCAoY2gpOwotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19ORVdMSU5FOgotCSAgLyogUm9sbCBvdXQgYSBidW5jaCBvZiBuZXdsaW5lcyBmcm9tIGluc2lkZSBjb21tZW50cywgZXRjLiAgKi8KLQkgIGlmIChhZGRfbmV3bGluZXMpCi0JICAgIHsKLQkgICAgICAtLWFkZF9uZXdsaW5lczsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICB9Ci0JICAvKiBmYWxsIHRocnUgaW50by4uLiAqLwotCi0JY2FzZSBMRVhfSVNfTElORV9TRVBBUkFUT1I6Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0jaWZkZWYgVENfVjg1MAotCWNhc2UgTEVYX0lTX0RPVUJMRURBU0hfMVNUOgotCSAgY2gyID0gR0VUKCk7Ci0JICBpZiAoY2gyICE9ICctJykKLQkgICAgewotCSAgICAgIFVOR0VUIChjaDIpOwotCSAgICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAgIH0KLQkgIC8qIHJlYWQgYW5kIHNraXAgdG8gZW5kIG9mIGxpbmUgKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBjaCA9IEdFVCAoKTsKLQkgICAgfQotCSAgd2hpbGUgKGNoICE9IEVPRiAmJiBjaCAhPSAnXG4nKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgICB9Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKCdcbicpOwotCSAgYnJlYWs7Ci0jZW5kaWYJICAgIAotI2lmZGVmIFRDX00zMlIKLQljYXNlIExFWF9JU19ET1VCTEVCQVJfMVNUOgotCSAgY2gyID0gR0VUKCk7Ci0JICBpZiAoY2gyICE9ICd8JykKLQkgICAgewotCSAgICAgIFVOR0VUIChjaDIpOwotCSAgICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAgIH0KLQkgIC8qIFJlc2V0IGJhY2sgdG8gc3RhdGUgMSBhbmQgcHJldGVuZCB0aGF0IHdlIGFyZSBwYXJzaW5nIGEgbGluZSBmcm9tCi0JICAgICBqdXN0IGFmdGVyIHRoZSBmaXJzdCB3aGl0ZSBzcGFjZS4gICovCi0JICBzdGF0ZSA9IDE7Ci0JICBQVVQgKCd8Jyk7Ci0JICBQVVQgKCd8Jyk7Ci0JICBicmVhazsKLSNlbmRpZgkgICAgCi0JY2FzZSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOgotCSAgLyogRklYTUUtc29tZWRheTogVGhlIHR3byBjaGFyYWN0ZXIgY29tbWVudCBzdHVmZiB3YXMgYmFkbHkKLQkgICAgIHRob3VnaHQgb3V0LiAgT24gaTM4Niwgd2Ugd2FudCAnLycgYXMgbGluZSBjb21tZW50IHN0YXJ0Ci0JICAgICBBTkQgd2Ugd2FudCBDIHN0eWxlIGNvbW1lbnRzLiAgaGVuY2UgdGhpcyBoYWNrLiAgVGhlCi0JICAgICB3aG9sZSBsZXhpY2FsIHByb2Nlc3Mgc2hvdWxkIGJlIHJld29ya2VkLiAgeG94b3JpY2guICAqLwotCSAgaWYgKGNoID09ICcvJykKLQkgICAgewotCSAgICAgIGNoMiA9IEdFVCAoKTsKLQkgICAgICBpZiAoY2gyID09ICcqJykKLQkJewotCQkgIG9sZF9zdGF0ZSA9IDM7Ci0JCSAgc3RhdGUgPSAtMjsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFVOR0VUIChjaDIpOwotCQl9Ci0JICAgIH0gLyogYmFkIGhhY2sgKi8KLQotCSAgaWYgKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkJLyogT25seSBjb21tZW50IGF0IHN0YXJ0IG9mIGxpbmUuICAqLwotCSAgICB7Ci0JICAgICAgaW50IHN0YXJ0Y2g7Ci0KLQkgICAgICBzdGFydGNoID0gY2g7Ci0KLQkgICAgICBkbwotCQl7Ci0JCSAgY2ggPSBHRVQgKCk7Ci0JCX0KLQkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSk7Ci0JICAgICAgaWYgKGNoID09IEVPRikKLQkJewotCQkgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGNvbW1lbnQ7IG5ld2xpbmUgaW5zZXJ0ZWQiKSk7Ci0JCSAgUFVUICgnXG4nKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JyB8fCBzdGF0ZSAhPSAwIHx8IHN0YXJ0Y2ggIT0gJyMnKQotCQl7Ci0JCSAgLyogTm90IGEgY3BwIGxpbmUuICAqLwotCQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgIUlTX05FV0xJTkUgKGNoKSkKLQkJICAgIGNoID0gR0VUICgpOwotCQkgIGlmIChjaCA9PSBFT0YpCi0JCSAgICBhc193YXJuIChfKCJFT0YgaW4gQ29tbWVudDogTmV3bGluZSBpbnNlcnRlZCIpKTsKLQkJICBzdGF0ZSA9IDA7Ci0JCSAgUFVUICgnXG4nKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIExva3MgbGlrZSBgIyAxMjMgImZpbGVuYW1lIicgZnJvbSBjcHAuICAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgb2xkX3N0YXRlID0gNDsKLQkgICAgICBzdGF0ZSA9IC0xOwotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJb3V0X3N0cmluZyA9ICJcdGFwcGxpbmUgIjsKLQkgICAgICBlbHNlCi0JCW91dF9zdHJpbmcgPSAiXHQuYXBwbGluZSAiOwotCSAgICAgIFBVVCAoKm91dF9zdHJpbmcrKyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotI2lmZGVmIFRDX0QxMFYKLQkgIC8qIEFsbCBpbnNucyBlbmQgaW4gYSBjaGFyIGZvciB3aGljaCBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCBpcyB0cnVlLgotCSAgICAgVHJhcCBpcyB0aGUgb25seSBzaG9ydCBpbnNuIHRoYXQgaGFzIGEgZmlyc3Qgb3BlcmFuZCB0aGF0IGlzCi0JICAgICBuZWl0aGVyIHJlZ2lzdGVyIG5vciBsYWJlbC4KLQkgICAgIFdlIG11c3QgcHJldmVudCBleGVmMGYgfHx0cmFwICMxIHRvIGRlZ2VuZXJhdGUgdG8gZXhlZjBmIHx8dHJhcCMxIC4KLQkgICAgIFdlIGNhbid0IG1ha2UgJyMnIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UIGJlY2F1c2UgaXQgaXMgYWxyZWFkeQotCSAgICAgTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVC4gIEhvd2V2ZXIsIGl0IGlzIHRoZSBvbmx5IGNoYXJhY3RlciBpbgotCSAgICAgbGluZV9jb21tZW50X2NoYXJzIGZvciBkMTB2LCBoZW5jZSB3ZSBjYW4gcmVjb2duaXplIGl0IGFzIHN1Y2guICAqLwotCSAgLyogQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggd291bGQgYmUgdG8gcmVzZXQgdGhlIHN0YXRlIHRvIDEgd2hlbgotCSAgICAgd2Ugc2VlICd8fCcsICc8Jy0gb3IgJy0+JywgYnV0IHRoYXQgc2VlbXMgdG8gYmUgb3ZlcmtpbGwuICAqLwotCSAgaWYgKHN0YXRlID09IDEwKSBQVVQgKCcgJyk7Ci0jZW5kaWYKLQkgIC8qIFdlIGhhdmUgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIHdoaWNoIGlzIG5vdCBhdCB0aGUKLQkgICAgIHN0YXJ0IG9mIGEgbGluZS4gIElmIHRoaXMgaXMgYWxzbyBhIG5vcm1hbCBjb21tZW50Ci0JICAgICBjaGFyYWN0ZXIsIGZhbGwgdGhyb3VnaC4gIE90aGVyd2lzZSB0cmVhdCBpdCBhcyBhIGRlZmF1bHQKLQkgICAgIGNoYXJhY3Rlci4gICovCi0JICBpZiAoc3RyY2hyICh0Y19jb21tZW50X2NoYXJzLCBjaCkgPT0gTlVMTAotCSAgICAgICYmICghIHNjcnViX202OGtfbXJpCi0JCSAgfHwgKGNoICE9ICchJyAmJiBjaCAhPSAnKicpKSkKLQkgICAgZ290byBkZV9mYXVsdDsKLQkgIGlmIChzY3J1Yl9tNjhrX21yaQotCSAgICAgICYmIChjaCA9PSAnIScgfHwgY2ggPT0gJyonIHx8IGNoID09ICcjJykKLQkgICAgICAmJiBzdGF0ZSAhPSAxCi0JICAgICAgJiYgc3RhdGUgIT0gMTApCi0JICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgTEVYX0lTX0NPTU1FTlRfU1RBUlQ6Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0JICAvKiBPbiB0aGUgQVJNLCBgQCcgaXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLgotCSAgICAgVW5mb3J0dW5hdGVseSB0aGlzIGlzIGFsc28gYSBzcGVjaWFsIGNoYXJhY3RlciBpbiBFTEYgLnN5bXZlcgotCSAgICAgZGlyZWN0aXZlcyAoYW5kIC50eXBlLCB0aG91Z2ggd2UgZGVhbCB3aXRoIHRob3NlIGFub3RoZXIgd2F5KS4gIFNvCi0JICAgICB3ZSBjaGVjayBpZiB0aGlzIGxpbmUgaXMgc3VjaCBhIGRpcmVjdGl2ZSwgYW5kIHRyZWF0IHRoZSBjaGFyYWN0ZXIKLQkgICAgIGFzIGRlZmF1bHQgaWYgc28uICBUaGlzIGlzIGEgaGFjay4gICovCi0JICBpZiAoKHN5bXZlcl9zdGF0ZSAhPSBOVUxMKSAmJiAoKnN5bXZlcl9zdGF0ZSA9PSAwKSkKLQkgICAgZ290byBkZV9mYXVsdDsKLSNlbmRpZgotCSAgZG8KLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICB9Ci0JICB3aGlsZSAoY2ggIT0gRU9GICYmICFJU19ORVdMSU5FIChjaCkpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIpKTsKLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoJ1xuJyk7Ci0JICBicmVhazsKLQotCWNhc2UgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ6Ci0JICBpZiAoc3RhdGUgPT0gMTApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIGNoYXJhY3RlciBmb2xsb3dpbmcgYW5vdGhlciBzeW1ib2wKLQkJIGNoYXJhY3Rlciwgd2l0aCB3aGl0ZXNwYWNlIGluIGJldHdlZW4uICBXZSBza2lwcGVkCi0JCSB0aGUgd2hpdGVzcGFjZSBlYXJsaWVyLCBzbyBvdXRwdXQgaXQgbm93LiAgKi8KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgICBQVVQgKCcgJyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHN0YXRlID09IDMpCi0JICAgIHN0YXRlID0gOTsKLQotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBjYXNlLiAgUXVpY2tseSBjb3B5IENIIGFuZCBhbGwgdGhlCi0gICAgICAgICAgICAgZm9sbG93aW5nIHN5bWJvbCBjb21wb25lbnQgb3Igbm9ybWFsIGNoYXJhY3RlcnMuICAqLwotCSAgaWYgKHRvICsgMSA8IHRvZW5kCi0JICAgICAgJiYgbXJpX3N0YXRlID09IE5VTEwKLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLQkgICAgICAmJiBzeW12ZXJfc3RhdGUgPT0gTlVMTAotI2VuZGlmCi0JICAgICAgKQotCSAgICB7Ci0JICAgICAgY2hhciAqczsKLQkgICAgICBpbnQgbGVuOwotCi0JICAgICAgZm9yIChzID0gZnJvbTsgcyA8IGZyb21lbmQ7IHMrKykKLQkJewotCQkgIGludCB0eXBlOwotCi0JCSAgY2gyID0gKiAodW5zaWduZWQgY2hhciAqKSBzOwotCQkgIHR5cGUgPSBsZXhbY2gyXTsKLQkJICBpZiAodHlwZSAhPSAwCi0JCSAgICAgICYmIHR5cGUgIT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgIGlmIChzID4gZnJvbSkKLQkJewotCQkgIC8qIEhhbmRsZSB0aGUgbGFzdCBjaGFyYWN0ZXIgbm9ybWFsbHksIGZvcgotICAgICAgICAgICAgICAgICAgICAgc2ltcGxpY2l0eS4gICovCi0JCSAgLS1zOwotCQl9Ci0JICAgICAgbGVuID0gcyAtIGZyb207Ci0JICAgICAgaWYgKGxlbiA+ICh0b2VuZCAtIHRvKSAtIDEpCi0JCWxlbiA9ICh0b2VuZCAtIHRvKSAtIDE7Ci0JICAgICAgaWYgKGxlbiA+IDApCi0JCXsKLQkJICBQVVQgKGNoKTsKLQkJICBpZiAobGVuID4gOCkKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKLQkJICAgICAgdG8gKz0gbGVuOwotCQkgICAgICBmcm9tICs9IGxlbjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHN3aXRjaCAobGVuKQotCQkJewotCQkJY2FzZSA4OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDc6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgNjogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSA1OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDQ6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgMzogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSAyOiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDE6ICp0bysrID0gKmZyb20rKzsKLQkJCX0KLQkJICAgIH0gCi0JCSAgY2ggPSBHRVQgKCk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWRlZmF1bHQ6Ci0JZGVfZmF1bHQ6Ci0JICAvKiBTb21lIHJlbGF0aXZlbHkgYG5vcm1hbCcgY2hhcmFjdGVyLiAgKi8KLQkgIGlmIChzdGF0ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSAxMTsJLyogTm93IHNlZWluZyBsYWJlbCBkZWZpbml0aW9uICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDEpCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IDI7CS8qIERpdHRvICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDkpCi0JICAgIHsKLQkgICAgICBpZiAobGV4W2NoXSAhPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCkKLQkJc3RhdGUgPSAzOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qTk9UUkVBQ0hFRCovCi0KLSBmcm9tZW9mOgotICAvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICAqLwotICByZXR1cm4gdG8gLSB0b3N0YXJ0OwotCi0gdG9mdWxsOgotICAvKiBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLiAgU2F2ZSBhbnkgaW5wdXQgd2UgaGF2ZSBub3QgeWV0Ci0gICAgIHByb2Nlc3NlZC4gICovCi0gIGlmIChmcm9tZW5kID4gZnJvbSkKLSAgICB7Ci0gICAgICBzYXZlZF9pbnB1dCA9IGZyb207Ci0gICAgICBzYXZlZF9pbnB1dF9sZW4gPSBmcm9tZW5kIC0gZnJvbTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzYXZlZF9pbnB1dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRvIC0gdG9zdGFydDsKLX0KLQotLyogZW5kIG9mIGFwcC5jICovCmRpZmYgLS1naXQgYS9nYXMvYXMuYyBiL2dhcy9hcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdhM2ZlLi4wMDAwMDAwCi0tLSBhL2dhcy9hcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxOSArMCwwIEBACi0vKiBhcy5jIC0gR0FTIG1haW4gcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoKLSAqIE1haW4gcHJvZ3JhbSBmb3IgQVM7IGEgMzItYml0IGFzc2VtYmxlciBvZiBHTlUuCi0gKiBVbmRlcnN0YW5kcyBjb21tYW5kIGFyZ3VtZW50cy4KLSAqIEhhcyBhIGZldyByb3V0aW5lcyB0aGF0IGRvbid0IGZpdCBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgdGhleQotICogYXJlIHNoYXJlZC4KLSAqCi0gKgotICoJCQlidWdzCi0gKgotICogOiBpbml0aWFsaXNlcnMKLSAqCVNpbmNlIG5vLW9uZSBlbHNlIHNheXMgdGhleSB3aWxsIHN1cHBvcnQgdGhlbSBpbiBmdXR1cmU6IEkKLSAqIGRvbid0IHN1cHBvcnQgdGhlbSBub3cuCi0gKgotICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jZGVmaW5lIENPTU1PTgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0KLSNpZmRlZiBIQVZFX0lUQkxfQ1BVCi0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLSNlbHNlCi0jZGVmaW5lIGl0YmxfcGFyc2UoaXRibF9maWxlKSAxCi0jZGVmaW5lIGl0YmxfaW5pdCgpCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU0JSSwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotZXh0ZXJuIFBUUiBzYnJrICgpOwotI2VuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIHBhcnNlX2FyZ3MgUEFSQU1TICgoaW50ICosIGNoYXIgKioqKSk7Ci1zdGF0aWMgdm9pZCBkdW1wX3N0YXRpc3RpY3MgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzIFBBUkFNUyAoKGludCBhcmdjLCBjaGFyICoqYXJndikpOwotc3RhdGljIGludCBtYWNyb19leHByIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotCi1pbnQgbGlzdGluZzsJCQkvKiB0cnVlIGlmIGEgbGlzdGluZyBpcyB3YW50ZWQgKi8KLQotc3RhdGljIGNoYXIgKmxpc3RpbmdfZmlsZW5hbWUgPSBOVUxMOwkvKiBOYW1lIG9mIGxpc3RpbmcgZmlsZS4gICovCi0KLS8qIFR5cGUgb2YgZGVidWdnaW5nIHRvIGdlbmVyYXRlLiAgKi8KLQotZW51bSBkZWJ1Z19pbmZvX3R5cGUgZGVidWdfdHlwZSA9IERFQlVHX05PTkU7Ci0KLS8qIE1heGltdW0gbGV2ZWwgb2YgbWFjcm8gbmVzdGluZy4gICovCi0KLWludCBtYXhfbWFjcm9fbmVzdCA9IDEwMDsKLQotY2hhciAqbXluYW1lOwkJCS8qIGFyZ3ZbMF0gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zZWdUIHJlZ19zZWN0aW9uLCBleHByX3NlY3Rpb247Ci1zZWdUIHRleHRfc2VjdGlvbiwgZGF0YV9zZWN0aW9uLCBic3Nfc2VjdGlvbjsKLSNlbmRpZgotCi0vKiBUaGUgZGVmYXVsdCBvYnN0YWNrIGNodW5rIHNpemUuICBJZiB3ZSBzZXQgdGhpcyB0byB6ZXJvLCB0aGUKLSAgIG9ic3RhY2sgY29kZSB3aWxsIHVzZSB3aGF0ZXZlciB3aWxsIGZpdCBpbiBhIDQwOTYgYnl0ZSBibG9jay4gICovCi1pbnQgY2h1bmtzaXplID0gMDsKLQotLyogVG8gbW9uaXRvciBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmVjdGl2ZWx5LCBtYWtlIHRoaXMgbm9uLXplcm8uCi0gICBUaGVuIHRoZSBjaHVuayBzaXplcyBmb3IgZ2FzIGFuZCBiZmQgd2lsbCBiZSByZWR1Y2VkLiAgKi8KLWludCBkZWJ1Z19tZW1vcnkgPSAwOwotCi0vKiBXZSBidWlsZCBhIGxpc3Qgb2YgZGVmc3ltcyBhcyB3ZSByZWFkIHRoZSBvcHRpb25zLCBhbmQgdGhlbiBkZWZpbmUKLSAgIHRoZW0gYWZ0ZXIgd2UgaGF2ZSBpbml0aWFsaXplZCBldmVyeXRoaW5nLiAgKi8KLQotc3RydWN0IGRlZnN5bV9saXN0Ci17Ci0gIHN0cnVjdCBkZWZzeW1fbGlzdCAqbmV4dDsKLSAgY2hhciAqbmFtZTsKLSAgdmFsdWVUIHZhbHVlOwotfTsKLQotc3RhdGljIHN0cnVjdCBkZWZzeW1fbGlzdCAqZGVmc3ltczsKLQotLyogS2VlcCBhIHJlY29yZCBvZiB0aGUgaXRibCBmaWxlcyB3ZSByZWFkIGluLiAqLwotCi1zdHJ1Y3QgaXRibF9maWxlX2xpc3QKLXsKLSAgc3RydWN0IGl0YmxfZmlsZV9saXN0ICpuZXh0OwotICBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqaXRibF9maWxlczsKLQwKLXZvaWQKLXByaW50X3ZlcnNpb25faWQgKCkKLXsKLSAgc3RhdGljIGludCBwcmludGVkOwotICBpZiAocHJpbnRlZCkKLSAgICByZXR1cm47Ci0gIHByaW50ZWQgPSAxOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmcHJpbnRmIChzdGRlcnIsIF8oIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIHVzaW5nIEJGRCB2ZXJzaW9uICVzIiksCi0JICAgVkVSU0lPTiwgVEFSR0VUX0FMSUFTLCBCRkRfVkVSU0lPTik7Ci0jZWxzZQotICBmcHJpbnRmIChzdGRlcnIsIF8oIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIiksIFZFUlNJT04sIFRBUkdFVF9BTElBUyk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlVzYWdlOiAlcyBbb3B0aW9uLi4uXSBbYXNtZmlsZS4uLl1cbiIpLCBteW5hbWUpOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotT3B0aW9uczpcblwKLSAgLWFbc3ViLW9wdGlvbi4uLl0JdHVybiBvbiBsaXN0aW5nc1xuXAotICAgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG5cCi0gICAgYyAgIG9taXQgZmFsc2UgY29uZGl0aW9uYWxzXG5cCi0gICAgZCAgIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXNcblwKLSAgICBoICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuXAotICAgIGwgICBpbmNsdWRlIGFzc2VtYmx5XG5cCi0gICAgbSAgIGluY2x1ZGUgbWFjcm8gZXhwYW5zaW9uc1xuXAotICAgIG4gICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcblwKLSAgICBzICAgaW5jbHVkZSBzeW1ib2xzXG5cCi0gICAgTCAgIGluY2x1ZGUgbGluZSBkZWJ1ZyBzdGF0aXN0aWNzIChpZiBhcHBsaWNhYmxlKVxuXAotICAgID1maWxlIHNldCBsaXN0aW5nIGZpbGUgbmFtZSAobXVzdCBiZSBsYXN0IHN1Yi1vcHRpb24pXG4iKSk7Ci0gIAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLUQJCSAgICAgICAgICBwcm9kdWNlIGFzc2VtYmxlciBkZWJ1Z2dpbmcgbWVzc2FnZXNcblwKLSAgLS1kZWZzeW0gU1lNPVZBTCAgICAgICAgZGVmaW5lIHN5bWJvbCBTWU0gdG8gZ2l2ZW4gdmFsdWVcblwKLSAgLWYJCSAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuXAotICAtLWdzdGFicwkgICAgICAgICAgZ2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uXG5cCi0gIC0taGVscAkJICBzaG93IHRoaXMgbWVzc2FnZSBhbmQgZXhpdFxuXAotICAtSSBESVIJCSAgYWRkIERJUiB0byBzZWFyY2ggbGlzdCBmb3IgLmluY2x1ZGUgZGlyZWN0aXZlc1xuXAotICAtSgkJICAgICAgICAgIGRvbid0IHdhcm4gYWJvdXQgc2lnbmVkIG92ZXJmbG93XG5cCi0gIC1LCQkgICAgICAgICAgd2FybiB3aGVuIGRpZmZlcmVuY2VzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuXAotICAtTCwtLWtlZXAtbG9jYWxzICAgICAgICBrZWVwIGxvY2FsIHN5bWJvbHMgKGUuZy4gc3RhcnRpbmcgd2l0aCBgTCcpXG4iKSk7Ci0gIAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLU0sLS1tcmkJICAgICAgICAgIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcblwKLSAgLS1NRCBGSUxFCSAgICAgICAgICB3cml0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGluIEZJTEUgKGRlZmF1bHQgbm9uZSlcblwKLSAgLW5vY3BwCQkgIGlnbm9yZWRcblwKLSAgLW8gT0JKRklMRQkgICAgICAgICAgbmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IE9CSkZJTEUgKGRlZmF1bHQgYS5vdXQpXG5cCi0gIC1SCQkgICAgICAgICAgZm9sZCBkYXRhIHNlY3Rpb24gaW50byB0ZXh0IHNlY3Rpb25cblwKLSAgLS1zdGF0aXN0aWNzCSAgICAgICAgICBwcmludCB2YXJpb3VzIG1lYXN1cmVkIHN0YXRpc3RpY3MgZnJvbSBleGVjdXRpb25cblwKLSAgLS1zdHJpcC1sb2NhbC1hYnNvbHV0ZSAgc3RyaXAgbG9jYWwgYWJzb2x1dGUgc3ltYm9sc1xuXAotICAtLXRyYWRpdGlvbmFsLWZvcm1hdAkgIFVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyIHdoZW4gcG9zc2libGVcblwKLSAgLS12ZXJzaW9uCQkgIHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuXAotICAtVwkJCSAgc3VwcHJlc3Mgd2FybmluZ3NcblwKLSAgLS1pdGJsIElOU1RUQkwJICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG5cCi0JCQkgIG1hdGNoaW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBkZWZpbmVkIGluIGZpbGUgSU5TVFRCTFxuXAotICAtdwkJCSAgaWdub3JlZFxuXAotICAtWAkJCSAgaWdub3JlZFxuXAotICAtWgkJCSAgZ2VuZXJhdGUgb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnNcbiIpKTsKLSAgCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWxpc3RpbmctbGhzLXdpZHRoCSAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mXG5cCi0JCQkgIHRoZSBsaXN0aW5nXG5cCi0gIC0tbGlzdGluZy1saHMtd2lkdGgyCSAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgY29udGludWF0aW9uIGxpbmVzXG5cCi0JCQkgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG5cCi0JCQkgIHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgbGluZVxuXAotICAtLWxpc3RpbmctcmhzLXdpZHRoCSAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuXAotCQkJICB0aGUgc291cmNlIGZpbGVcblwKLSAgLS1saXN0aW5nLWNvbnQtbGluZXMJICBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB1c2VkXG5cCi0JCQkgIGZvciB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mIHRoZSBsaXN0aW5nXG4iKSk7Ci0KLSAgbWRfc2hvd191c2FnZSAoc3RyZWFtKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci19Ci0KLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotI2RlZmluZSBFTVVMQVRJT05fRU5WSVJPTiAiQVNfRU1VTEFUSU9OIgotCi1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBtaXBzYmVsZiwgbWlwc2xlbGYsIG1pcHNlbGY7Ci1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBtaXBzYmVjb2ZmLCBtaXBzbGVjb2ZmLCBtaXBzZWNvZmY7Ci1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBpMzg2Y29mZiwgaTM4NmVsZjsKLQotc3RhdGljIHN0cnVjdCBlbXVsYXRpb24gKmNvbnN0IGVtdWxhdGlvbnNbXSA9IHsgRU1VTEFUSU9OUyB9Owotc3RhdGljIGNvbnN0IGludCBuX2VtdWxhdGlvbnMgPSBzaXplb2YgKGVtdWxhdGlvbnMpIC8gc2l6ZW9mIChlbXVsYXRpb25zWzBdKTsKLQotc3RhdGljIHZvaWQgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi1zdGF0aWMgdm9pZAotc2VsZWN0X2VtdWxhdGlvbl9tb2RlIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBpOwotICBjaGFyICpwLCAqZW0gPSAwOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgaWYgKCFzdHJuY21wICgiLS1lbSIsIGFyZ3ZbaV0sIDQpKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGkgPT0gYXJnYykKLSAgICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLSAgcCA9IHN0cmNociAoYXJndltpXSwgJz0nKTsKLSAgaWYgKHApCi0gICAgcCsrOwotICBlbHNlCi0gICAgcCA9IGFyZ3ZbaSsxXTsKLQotICBpZiAoIXAgfHwgISpwKQotICAgIGFzX2ZhdGFsIChfKCJtaXNzaW5nIGVtdWxhdGlvbiBtb2RlIG5hbWUiKSk7Ci0gIGVtID0gcDsKLQotIGRvX2RlZmF1bHQ6Ci0gIGlmIChlbSA9PSAwKQotICAgIGVtID0gZ2V0ZW52IChFTVVMQVRJT05fRU5WSVJPTik7Ci0gIGlmIChlbSA9PSAwKQotICAgIGVtID0gREVGQVVMVF9FTVVMQVRJT047Ci0KLSAgaWYgKGVtKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2VtdWxhdGlvbnM7IGkrKykKLQlpZiAoIXN0cmNtcCAoZW11bGF0aW9uc1tpXS0+bmFtZSwgZW0pKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaSA9PSBuX2VtdWxhdGlvbnMpCi0JYXNfZmF0YWwgKF8oInVucmVjb2duaXplZCBlbXVsYXRpb24gbmFtZSBgJXMnIiksIGVtKTsKLSAgICAgIHRoaXNfZW11bGF0aW9uID0gZW11bGF0aW9uc1tpXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0aGlzX2VtdWxhdGlvbiA9IGVtdWxhdGlvbnNbMF07Ci0KLSAgdGhpc19lbXVsYXRpb24tPmluaXQgKCk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZGVmYXVsdF9lbXVsX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotY29tbW9uX2VtdWxfaW5pdCAoKQotewotICB0aGlzX2Zvcm1hdCA9IHRoaXNfZW11bGF0aW9uLT5mb3JtYXQ7Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUgPT0gMikKLSAgICB0aGlzX2VtdWxhdGlvbi0+bGVhZGluZ191bmRlcnNjb3JlID0gdGhpc19mb3JtYXQtPmRmbF9sZWFkaW5nX3VuZGVyc2NvcmU7Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5kZWZhdWx0X2VuZGlhbiAhPSAyKQotICAgIHRhcmdldF9iaWdfZW5kaWFuID0gdGhpc19lbXVsYXRpb24tPmRlZmF1bHRfZW5kaWFuOwotCi0gIGlmICh0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID09IDApCi0gICAgewotICAgICAgaWYgKHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUpCi0JdGhpc19lbXVsYXRpb24tPmZha2VfbGFiZWxfbmFtZSA9ICJMMFwwMDEiOwotICAgICAgZWxzZQotCS8qIFdoYXQgb3RoZXIgcGFyYW1ldGVycyBzaG91bGQgd2UgdGVzdD8gICovCi0JdGhpc19lbXVsYXRpb24tPmZha2VfbGFiZWxfbmFtZSA9ICIuTDBcMDAxIjsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFNpbmNlIGl0IGlzIGVhc3kgdG8gZG8gaGVyZSB3ZSBpbnRlcnByZXQgdGhlIHNwZWNpYWwgYXJnICItIgotICogdG8gbWVhbiAidXNlIHN0ZGluIiBhbmQgd2Ugc2V0IHRoYXQgYXJndltdIHBvaW50aW5nIHRvICIiLgotICogQWZ0ZXIgd2UgaGF2ZSBtdW5nZWQgYXJndltdLCB0aGUgb25seSB0aGluZ3MgbGVmdCBhcmUgc291cmNlIGZpbGUKLSAqIG5hbWUocykgYW5kICIiKHMpIGRlbm90aW5nIHN0ZGluLiBUaGVzZSBmaWxlIG5hbWVzIGFyZSB1c2VkCi0gKiAocGVyaGFwcyBtb3JlIHRoYW4gb25jZSkgbGF0ZXIuCi0gKgotICogY2hlY2sgZm9yIG5ldyBtYWNoaW5lLWRlcCBjbWRsaW5lIG9wdGlvbnMgaW4KLSAqIG1kX3BhcnNlX29wdGlvbiBkZWZpbml0aW9ucyBpbiBjb25maWcvdGMtKi5jCi0gKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKHBhcmdjLCBwYXJndikKLSAgICAgaW50ICpwYXJnYzsKLSAgICAgY2hhciAqKipwYXJndjsKLXsKLSAgaW50IG9sZF9hcmdjLCBuZXdfYXJnYzsKLSAgY2hhciAqKm9sZF9hcmd2LCAqKm5ld19hcmd2OwotCi0gIC8qIFN0YXJ0aW5nIHRoZSBzaG9ydCBvcHRpb24gc3RyaW5nIHdpdGggJy0nIGlzIGZvciBwcm9ncmFtcyB0aGF0Ci0gICAgIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0Ci0gICAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAotICAgICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLiAgKi8KLQotICBjaGFyICpzaG9ydG9wdHM7Ci0gIGV4dGVybiBDT05TVCBjaGFyICptZF9zaG9ydG9wdHM7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIHN0ZF9zaG9ydG9wdHNbXSA9Ci0gICAgewotICAgICAgJy0nLCAnSicsCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAgIC8qIC1LIGlzIG5vdCBtZWFuaW5nZnVsIGlmIC53b3JkIGlzIG5vdCBiZWluZyBoYWNrZWQuICAqLwotICAgICAgJ0snLAotI2VuZGlmCi0gICAgICAnTCcsICdNJywgJ1InLCAnVycsICdaJywgJ2YnLCAnYScsICc6JywgJzonLCAnRCcsICdJJywgJzonLCAnbycsICc6JywKLSNpZm5kZWYgVk1TCi0gICAgICAvKiAtdiB0YWtlcyBhbiBhcmd1bWVudCBvbiBWTVMsIHNvIHdlIGRvbid0IG1ha2UgaXQgYSBnZW5lcmljCi0gICAgICAgICBvcHRpb24uICAqLwotICAgICAgJ3YnLAotI2VuZGlmCi0gICAgICAndycsICdYJywKLSAgICAgIC8qIE5ldyBvcHRpb24gZm9yIGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQgKHNlZSBhbHNvIC0taXRibCBiZWxvdykgKi8KLSAgICAgICd0JywgJzonLAotICAgICAgJ1wwJwotICAgIH07Ci0gIHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzOwotICBleHRlcm4gc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdOwotICBleHRlcm4gc2l6ZV90IG1kX2xvbmdvcHRzX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIHN0ZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fSEVMUCAoT1BUSU9OX1NURF9CQVNFKQotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVMUH0sCi0gICAgeyJrZWVwLWxvY2FscyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTCd9LAotICAgIHsibXJpIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCi0jZGVmaW5lIE9QVElPTl9OT0NQUCAoT1BUSU9OX1NURF9CQVNFICsgMSkKLSAgICB7Im5vY3BwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0NQUH0sCi0jZGVmaW5lIE9QVElPTl9TVEFUSVNUSUNTIChPUFRJT05fU1REX0JBU0UgKyAyKQotICAgIHsic3RhdGlzdGljcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBVElTVElDU30sCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OIChPUFRJT05fU1REX0JBU0UgKyAzKQotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTn0sCi0jZGVmaW5lIE9QVElPTl9EVU1QQ09ORklHIChPUFRJT05fU1REX0JBU0UgKyA0KQotICAgIHsiZHVtcC1jb25maWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RVTVBDT05GSUd9LAotI2RlZmluZSBPUFRJT05fVkVSQk9TRSAoT1BUSU9OX1NURF9CQVNFICsgNSkKLSAgICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotI2RlZmluZSBPUFRJT05fRU1VTEFUSU9OIChPUFRJT05fU1REX0JBU0UgKyA2KQotICAgIHsiZW11bGF0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTVVMQVRJT059LAotI2RlZmluZSBPUFRJT05fREVGU1lNIChPUFRJT05fU1REX0JBU0UgKyA3KQotICAgIHsiZGVmc3ltIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUZTWU19LAotI2RlZmluZSBPUFRJT05fSU5TVFRCTCAoT1BUSU9OX1NURF9CQVNFICsgOCkKLSAgICAvKiBOZXcgb3B0aW9uIGZvciBleHRlbmRpbmcgaW5zdHJ1Y3Rpb24gc2V0IChzZWUgYWxzbyAtdCBhYm92ZSkuCi0gICAgICAgVGhlICItdCBmaWxlIiBvciAiLS1pdGJsIGZpbGUiIG9wdGlvbiBleHRlbmRzIHRoZSBiYXNpYyBzZXQgb2YKLSAgICAgICB2YWxpZCBpbnN0cnVjdGlvbnMgYnkgcmVhZGluZyAiZmlsZSIsIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgYQotICAgICAgIGxpc3Qgb2YgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIFRoZSBhZGRpdGlvbmFsIG9wY29kZXMgYW5kIHRoZWlyCi0gICAgICAgZm9ybWF0cyBhcmUgYWRkZWQgdG8gdGhlIGJ1aWx0LWluIHNldCBvZiBpbnN0cnVjdGlvbnMsIGFuZAotICAgICAgIG1uZW1vbmljcyBmb3IgbmV3IHJlZ2lzdGVycyBtYXkgYWxzbyBiZSBkZWZpbmVkLiAgKi8KLSAgICB7Iml0YmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lOU1RUQkx9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDkpCi0gICAgeyJsaXN0aW5nLWxocy13aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19MSFNfV0lEVEh9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyIChPUFRJT05fU1REX0JBU0UgKyAxMCkKLSAgICB7Imxpc3RpbmctbGhzLXdpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDJ9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDExKQotICAgIHsibGlzdGluZy1yaHMtd2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfUkhTX1dJRFRIfSwKLSNkZWZpbmUgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUyAoT1BUSU9OX1NURF9CQVNFICsgMTIpCi0gICAgeyJsaXN0aW5nLWNvbnQtbGluZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FU30sCi0jZGVmaW5lIE9QVElPTl9ERVBGSUxFIChPUFRJT05fU1REX0JBU0UgKyAxMykKLSAgICB7Ik1EIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERVBGSUxFfSwKLSNkZWZpbmUgT1BUSU9OX0dTVEFCUyAoT1BUSU9OX1NURF9CQVNFICsgMTQpCi0gICAgeyJnc3RhYnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dTVEFCU30sCi0jZGVmaW5lIE9QVElPTl9TVFJJUF9MT0NBTF9BQlNPTFVURSAoT1BUSU9OX1NURF9CQVNFICsgMTUpCi0gICAgeyJzdHJpcC1sb2NhbC1hYnNvbHV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSSVBfTE9DQUxfQUJTT0xVVEV9LAotI2RlZmluZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUIChPUFRJT05fU1REX0JBU0UgKyAxNikKLSAgICB7InRyYWRpdGlvbmFsLWZvcm1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUfSwKLSNkZWZpbmUgT1BUSU9OX0dEV0FSRjIgKE9QVElPTl9TVERfQkFTRSArIDE3KQotICAgIHsiZ2R3YXJmMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fR0RXQVJGMn0KLSAgfTsKLQotICAvKiBDb25zdHJ1Y3QgdGhlIG9wdGlvbiBsaXN0cyBmcm9tIHRoZSBzdGFuZGFyZCBsaXN0IGFuZCB0aGUKLSAgICAgdGFyZ2V0IGRlcGVuZGVudCBsaXN0LiAgKi8KLSAgc2hvcnRvcHRzID0gY29uY2F0IChzdGRfc2hvcnRvcHRzLCBtZF9zaG9ydG9wdHMsIChjaGFyICopIE5VTEwpOwotICBsb25nb3B0cyA9IChzdHJ1Y3Qgb3B0aW9uICopIHhtYWxsb2MgKHNpemVvZiAoc3RkX2xvbmdvcHRzKSArIG1kX2xvbmdvcHRzX3NpemUpOwotICBtZW1jcHkgKGxvbmdvcHRzLCBzdGRfbG9uZ29wdHMsIHNpemVvZiAoc3RkX2xvbmdvcHRzKSk7Ci0gIG1lbWNweSAoKGNoYXIgKikgbG9uZ29wdHMgKyBzaXplb2YgKHN0ZF9sb25nb3B0cyksCi0JICBtZF9sb25nb3B0cywgbWRfbG9uZ29wdHNfc2l6ZSk7Ci0KLSAgLyogTWFrZSBhIGxvY2FsIGNvcHkgb2YgdGhlIG9sZCBhcmd2LiAgKi8KLSAgb2xkX2FyZ2MgPSAqcGFyZ2M7Ci0gIG9sZF9hcmd2ID0gKnBhcmd2OwotCi0gIC8qIEluaXRpYWxpemUgYSBuZXcgYXJndiB0aGF0IGNvbnRhaW5zIG5vIG9wdGlvbnMuICAqLwotICBuZXdfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiAob2xkX2FyZ2MgKyAxKSk7Ci0gIG5ld19hcmd2WzBdID0gb2xkX2FyZ3ZbMF07Ci0gIG5ld19hcmdjID0gMTsKLSAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBnZXRvcHRfbG9uZ19vbmx5IGlzIGxpa2UgZ2V0b3B0X2xvbmcsIGJ1dCAnLScgYXMgd2VsbCBhcyAnLS0nIGNhbgotCSBpbmRpY2F0ZSBhIGxvbmcgb3B0aW9uLiAgKi8KLSAgICAgIGludCBsb25naW5kOwotICAgICAgaW50IG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChvbGRfYXJnYywgb2xkX2FyZ3YsIHNob3J0b3B0cywgbG9uZ29wdHMsCi0JCQkJICAgJmxvbmdpbmQpOwotCi0gICAgICBpZiAob3B0YyA9PSAtMSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChvcHRjKQotCXsKLQlkZWZhdWx0OgotCSAgLyogbWRfcGFyc2Vfb3B0aW9uIHNob3VsZCByZXR1cm4gMSBpZiBpdCByZWNvZ25pemVzIG9wdGMsCi0JICAgICAwIGlmIG5vdC4gICovCi0JICBpZiAobWRfcGFyc2Vfb3B0aW9uIChvcHRjLCBvcHRhcmcpICE9IDApCi0JICAgIGJyZWFrOwotCSAgLyogYC12JyBpc24ndCBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhbCBzaG9ydF9vcHRzIGxpc3QsIHNvIGNoZWNrIGZvcgotCSAgICAgaXQgZXhwbGljaXR5IGhlcmUgYmVmb3JlIGRlY2lkaW5nIHdlJ3ZlIGdvdHRlbiBhIGJhZCBhcmd1bWVudC4gICovCi0JICBpZiAob3B0YyA9PSAndicpCi0JICAgIHsKLSNpZmRlZiBWTVMKLQkgICAgICAvKiBUZWxsaW5nIGdldG9wdCB0byB0cmVhdCAtdidzIHZhbHVlIGFzIG9wdGlvbmFsIGNhbiByZXN1bHQKLQkJIGluIGl0IHBpY2tpbmcgdXAgYSBmb2xsb3dpbmcgZmlsZW5hbWUgYXJndW1lbnQgaGVyZS4gIFRoZQotCQkgVk1TIGNvZGUgaW4gbWRfcGFyc2Vfb3B0aW9uIGNhbiByZXR1cm4gMCBpbiB0aGF0IGNhc2UsCi0JCSBidXQgaXQgaGFzIG5vIHdheSBvZiBwdXNoaW5nIHRoZSBmaWxlbmFtZSBhcmd1bWVudCBiYWNrLiAgKi8KLQkgICAgICBpZiAob3B0YXJnICYmICpvcHRhcmcpCi0JCW5ld19hcmd2W25ld19hcmdjKytdID0gb3B0YXJnLCAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKLQkgICAgICBlbHNlCi0jZWxzZQotCSAgICAgIGNhc2UgJ3YnOgotI2VuZGlmCi0JICAgICAgY2FzZSBPUFRJT05fVkVSQk9TRToKLQkJcHJpbnRfdmVyc2lvbl9pZCAoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLypGQUxMVEhSVSovCi0KLQljYXNlICc/JzoKLQkgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0KLQljYXNlIDE6CQkJLyogRmlsZSBuYW1lLiAgKi8KLQkgIGlmICghc3RyY21wIChvcHRhcmcsICItIikpCi0JICAgIG9wdGFyZyA9ICIiOwotCSAgbmV3X2FyZ3ZbbmV3X2FyZ2MrK10gPSBvcHRhcmc7Ci0JICBuZXdfYXJndltuZXdfYXJnY10gPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9IRUxQOgotCSAgc2hvd191c2FnZSAoc3Rkb3V0KTsKLQkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0KLQljYXNlIE9QVElPTl9OT0NQUDoKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fU1RBVElTVElDUzoKLQkgIGZsYWdfcHJpbnRfc3RhdGlzdGljcyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1NUUklQX0xPQ0FMX0FCU09MVVRFOgotCSAgZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVDoKLQkgIGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBhc3NlbWJsZXIgJXNcbiIpLCBWRVJTSU9OKTsKLQkgIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLQkgIHByaW50ZiAoXygiVGhpcyBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQgZm9yIGEgdGFyZ2V0IG9mIGAlcycuXG4iKSwKLQkJICBUQVJHRVRfQUxJQVMpOwotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX0VNVUxBVElPTjoKLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotCSAgaWYgKHN0cmNtcCAob3B0YXJnLCB0aGlzX2VtdWxhdGlvbi0+bmFtZSkpCi0JICAgIGFzX2ZhdGFsIChfKCJtdWx0aXBsZSBlbXVsYXRpb24gbmFtZXMgc3BlY2lmaWVkIikpOwotI2Vsc2UKLQkgIGFzX2ZhdGFsIChfKCJlbXVsYXRpb25zIG5vdCBoYW5kbGVkIGluIHRoaXMgY29uZmlndXJhdGlvbiIpKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9EVU1QQ09ORklHOgotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJhbGlhcyA9ICVzXG4iKSwgVEFSR0VUX0FMSUFTKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiY2Fub25pY2FsID0gJXNcbiIpLCBUQVJHRVRfQ0FOT05JQ0FMKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiY3B1LXR5cGUgPSAlc1xuIiksIFRBUkdFVF9DUFUpOwotI2lmZGVmIFRBUkdFVF9PQkpfRk9STUFUCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oImZvcm1hdCA9ICVzXG4iKSwgVEFSR0VUX09CSl9GT1JNQVQpOwotI2VuZGlmCi0jaWZkZWYgVEFSR0VUX0ZPUk1BVAotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJiZmQtdGFyZ2V0ID0gJXNcbiIpLCBUQVJHRVRfRk9STUFUKTsKLSNlbmRpZgotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX0RFRlNZTToKLQkgIHsKLQkgICAgY2hhciAqczsKLQkgICAgbG9uZyBpOwotCSAgICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm47Ci0KLQkgICAgZm9yIChzID0gb3B0YXJnOyAqcyAhPSAnXDAnICYmICpzICE9ICc9JzsgcysrKQotCSAgICAgIDsKLQkgICAgaWYgKCpzID09ICdcMCcpCi0JICAgICAgYXNfZmF0YWwgKF8oImJhZCBkZWZzeW07IGZvcm1hdCBpcyAtLWRlZnN5bSBuYW1lPXZhbHVlIikpOwotCSAgICAqcysrID0gJ1wwJzsKLQkgICAgaSA9IHN0cnRvbCAocywgKGNoYXIgKiopIE5VTEwsIDApOwotCSAgICBuID0gKHN0cnVjdCBkZWZzeW1fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gZGVmc3ltczsKLQkgICAgbi0+bmFtZSA9IG9wdGFyZzsKLQkgICAgbi0+dmFsdWUgPSBpOwotCSAgICBkZWZzeW1zID0gbjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSU5TVFRCTDoKLQljYXNlICd0JzoKLQkgIHsKLQkgICAgLyogb3B0YXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluc3RydWN0aW9uIAotCSAgICAgICBmb3JtYXRzLCBvcGNvZGVzLCByZWdpc3RlciBuYW1lcywgZXRjLiAqLwotCSAgICBzdHJ1Y3QgaXRibF9maWxlX2xpc3QgKm47Ci0KLQkgICAgaWYgKG9wdGFyZyA9PSBOVUxMKQotCSAgICAgIHsKLQkJYXNfd2FybiAoIF8oIk5vIGZpbGUgbmFtZSBmb2xsb3dpbmcgLXQgb3B0aW9uXG4iKSApOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICBuID0gKHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gaXRibF9maWxlczsKLQkgICAgbi0+bmFtZSA9IG9wdGFyZzsKLQkgICAgaXRibF9maWxlcyA9IG47Ci0KLQkgICAgLyogUGFyc2UgdGhlIGZpbGUgYW5kIGFkZCB0aGUgbmV3IGluc3RydWN0aW9ucyB0byBvdXIgaW50ZXJuYWwKLQkgICAgICAgdGFibGUuICBJZiBtdWx0aXBsZSBpbnN0cnVjdGlvbiB0YWJsZXMgYXJlIHNwZWNpZmllZCwgdGhlIAotCSAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgdGFibGUgZ2V0cyBhcHBlbmRlZCBvbnRvIHRoZSBleGlzdGluZyAKLQkgICAgICAgaW50ZXJuYWwgdGFibGUuICovCi0JICAgIGl0YmxfZmlsZXMtPm5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgICBpZiAoaXRibF9wYXJzZSAoaXRibF9maWxlcy0+bmFtZSkgIT0gMCkKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0ZGVyciwgXygiRmFpbGVkIHRvIHJlYWQgaW5zdHJ1Y3Rpb24gdGFibGUgJXNcbiIpLCAKLQkJCSBpdGJsX2ZpbGVzLT5uYW1lKTsKLQkJZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0RFUEZJTEU6Ci0JICBzdGFydF9kZXBlbmRlbmNpZXMgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0dTVEFCUzoKLQkgIGRlYnVnX3R5cGUgPSBERUJVR19TVEFCUzsKLQkgIGJyZWFrOwotIAotCWNhc2UgT1BUSU9OX0dEV0FSRjI6Ci0JICBkZWJ1Z190eXBlID0gREVCVUdfRFdBUkYyOwotCSAgYnJlYWs7Ci0KLQljYXNlICdKJzoKLQkgIGZsYWdfc2lnbmVkX292ZXJmbG93X29rID0gMTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLQljYXNlICdLJzoKLQkgIGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQgPSAxOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgJ0wnOgotCSAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0xJU1RJTkdfTEhTX1dJRFRIOgotCSAgbGlzdGluZ19saHNfd2lkdGggPSBhdG9pKG9wdGFyZyk7Ci0JICBpZiAobGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIDwgbGlzdGluZ19saHNfd2lkdGgpCi0JICAgIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IGxpc3RpbmdfbGhzX3dpZHRoOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyOgotCSAgewotCSAgICBpbnQgdG1wID0gYXRvaShvcHRhcmcpOwotCSAgICBpZiAodG1wID4gbGlzdGluZ19saHNfd2lkdGgpCi0JICAgICAgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kID0gdG1wOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEg6Ci0JICBsaXN0aW5nX3Joc193aWR0aCA9IGF0b2kob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUzoKLQkgIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMgPSBhdG9pKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCSAgZmxhZ19tcmkgPSAxOwotI2lmZGVmIFRDX002OEsKLQkgIGZsYWdfbTY4a19tcmkgPSAxOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgJ1InOgotCSAgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdXJzoKLQkgIGZsYWdfbm9fd2FybmluZ3MgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdaJzoKLQkgIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ2EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHdoaWxlICgqb3B0YXJnKQotCQl7Ci0JCSAgc3dpdGNoICgqb3B0YXJnKQotCQkgICAgewotCQkgICAgY2FzZSAnYyc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19OT0NPTkQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZCc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19OT0RFQlVHOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2gnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfSExMOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2wnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTElTVElORzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdtJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX01BQ0VYUDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICduJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX05PRk9STTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdzJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX1NZTUJPTFM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnPSc6Ci0JCSAgICAgIGxpc3RpbmdfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcgKyAxKTsKLQkJICAgICAgb3B0YXJnICs9IHN0cmxlbiAobGlzdGluZ19maWxlbmFtZSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYXNfZmF0YWwgKF8oImludmFsaWQgbGlzdGluZyBvcHRpb24gYCVjJyIpLCAqb3B0YXJnKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgb3B0YXJnKys7Ci0JCX0KLQkgICAgfQotCSAgaWYgKCFsaXN0aW5nKQotCSAgICBsaXN0aW5nID0gTElTVElOR19ERUZBVUxUOwotCSAgYnJlYWs7Ci0KLQljYXNlICdEJzoKLQkgIC8qIERFQlVHIGlzIGltcGxlbWVudGVkOiBpdCBkZWJ1Z3MgZGlmZmVyZW50ICovCi0JICAvKiB0aGluZ3MgZnJvbSBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLiAqLwotCSAgZmxhZ19kZWJ1ZyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgZmxhZ19ub19jb21tZW50cyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ0knOgotCSAgewkJCS8qIEluY2x1ZGUgZmlsZSBkaXJlY3RvcnkgKi8KLQkgICAgY2hhciAqdGVtcCA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0JICAgIGFkZF9pbmNsdWRlX2RpciAodGVtcCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSAnbyc6Ci0JICBvdXRfZmlsZV9uYW1lID0geHN0cmR1cCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAndyc6Ci0JICBicmVhazsKLQotCWNhc2UgJ1gnOgotCSAgLyogLVggbWVhbnMgdHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzICovCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHNob3J0b3B0cyk7Ci0gIGZyZWUgKGxvbmdvcHRzKTsKLQotICAqcGFyZ2MgPSBuZXdfYXJnYzsKLSAgKnBhcmd2ID0gbmV3X2FyZ3Y7Ci19Ci0KLXN0YXRpYyBsb25nIHN0YXJ0X3RpbWU7Ci0KLWludCAKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG1hY3JvX2FsdGVybmF0ZTsKLSAgaW50IG1hY3JvX3N0cmlwX2F0OwotICBpbnQga2VlcF9pdDsKLQotICBzdGFydF90aW1lID0gZ2V0X3J1bl90aW1lICgpOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgaWYgKGRlYnVnX21lbW9yeSkKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgZXh0ZXJuIGxvbmcgX2JmZF9jaHVua3NpemU7Ci0gICAgICBfYmZkX2NodW5rc2l6ZSA9IDY0OwotI2VuZGlmCi0gICAgICBjaHVua3NpemUgPSA2NDsKLSAgICB9Ci0KLSNpZmRlZiBIT1NUX1NQRUNJQUxfSU5JVAotICBIT1NUX1NQRUNJQUxfSU5JVCAoYXJnYywgYXJndik7Ci0jZW5kaWYKLQotICBteW5hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKG15bmFtZSk7Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKG15bmFtZSwgMCk7Ci0KLSNpZm5kZWYgT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRQotI2RlZmluZSBPQkpfREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FICJhLm91dCIKLSNlbmRpZgotCi0gIG91dF9maWxlX25hbWUgPSBPQkpfREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FOwotCi0gIGhleF9pbml0ICgpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX2luaXQgKCk7Ci0gIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lIChteW5hbWUpOwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotICBzZWxlY3RfZW11bGF0aW9uX21vZGUgKGFyZ2MsIGFyZ3YpOwotI2VuZGlmCi0KLSAgUFJPR1JFU1MgKDEpOwotICBzeW1ib2xfYmVnaW4gKCk7Ci0gIGZyYWdfaW5pdCAoKTsKLSAgc3Vic2Vnc19iZWdpbiAoKTsKLSAgcGFyc2VfYXJncyAoJmFyZ2MsICZhcmd2KTsgCi0gIHJlYWRfYmVnaW4gKCk7Ci0gIGlucHV0X3NjcnViX2JlZ2luICgpOwotICBleHByX2JlZ2luICgpOwotCi0gIGlmIChmbGFnX3ByaW50X3N0YXRpc3RpY3MpCi0gICAgeGF0ZXhpdCAoZHVtcF9zdGF0aXN0aWNzKTsKLQotICBtYWNyb19hbHRlcm5hdGUgPSAwOwotICBtYWNyb19zdHJpcF9hdCA9IDA7Ci0jaWZkZWYgVENfSTk2MAotICBtYWNyb19zdHJpcF9hdCA9IGZsYWdfbXJpOwotI2VuZGlmCi0jaWZkZWYgVENfQTI5SwotICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBBTUQgMjlLIGZhbWlseSBtYWNybyBhc3NlbWJsZXIKLSAgICAgc3BlY2lmaWNhdGlvbi4gICovCi0gIG1hY3JvX2FsdGVybmF0ZSA9IDE7Ci0gIG1hY3JvX3N0cmlwX2F0ID0gMTsKLSNlbmRpZgotCi0gIG1hY3JvX2luaXQgKG1hY3JvX2FsdGVybmF0ZSwgZmxhZ19tcmksIG1hY3JvX3N0cmlwX2F0LCBtYWNyb19leHByKTsKLQotICBQUk9HUkVTUyAoMSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIG91dHB1dF9maWxlX2NyZWF0ZSAob3V0X2ZpbGVfbmFtZSk7Ci0gIGFzc2VydCAoc3Rkb3V0cHV0ICE9IDApOwotI2VuZGlmCi0KLSNpZmRlZiB0Y19pbml0X2FmdGVyX2FyZ3MKLSAgdGNfaW5pdF9hZnRlcl9hcmdzICgpOwotI2VuZGlmCi0KLSAgaXRibF9pbml0ICgpOwotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgZnVsbHkgaW5pdGlhbGl6ZWQsIGFuZCBoYXZlIGNyZWF0ZWQgdGhlIG91dHB1dAotICAgICBmaWxlLCBkZWZpbmUgYW55IHN5bWJvbHMgcmVxdWVzdGVkIGJ5IC0tZGVmc3ltIGNvbW1hbmQgbGluZQotICAgICBhcmd1bWVudHMuICAqLwotICB3aGlsZSAoZGVmc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIHN0cnVjdCBkZWZzeW1fbGlzdCAqbmV4dDsKLQotICAgICAgc3ltID0gc3ltYm9sX25ldyAoZGVmc3ltcy0+bmFtZSwgYWJzb2x1dGVfc2VjdGlvbiwgZGVmc3ltcy0+dmFsdWUsCi0JCQkmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltKTsKLSAgICAgIG5leHQgPSBkZWZzeW1zLT5uZXh0OwotICAgICAgZnJlZSAoZGVmc3ltcyk7Ci0gICAgICBkZWZzeW1zID0gbmV4dDsKLSAgICB9Ci0KLSAgUFJPR1JFU1MgKDEpOwotCi0gIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyAoYXJnYywgYXJndik7CS8qIEFzc2VtYmxlIGl0LiAqLwotCi0gIGNvbmRfZmluaXNoX2NoZWNrICgtMSk7Ci0KLSNpZmRlZiBtZF9lbmQKLSAgbWRfZW5kICgpOwotI2VuZGlmCi0KLSAgaWYgKHNlZW5fYXRfbGVhc3RfMV9maWxlICgpCi0gICAgICAmJiAoZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0IHx8IGhhZF9lcnJvcnMgKCkgPT0gMCkpCi0gICAga2VlcF9pdCA9IDE7Ci0gIGVsc2UKLSAgICBrZWVwX2l0ID0gMDsKLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpCi0gIC8qIFRoaXMgdXNlZCB0byBiZSBkb25lIGF0IHRoZSBzdGFydCBvZiB3cml0ZV9vYmplY3RfZmlsZSBpbgotICAgICB3cml0ZS5jLCBidXQgdGhhdCBjYXVzZWQgcHJvYmxlbXMgd2hlbiBkb2luZyBsaXN0aW5ncyB3aGVuCi0gICAgIGtlZXBfaXQgd2FzIHplcm8uICBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGFib3ZlIG1kX2VuZCwgYnV0Ci0gICAgIEkgZGlkbid0IHdhbnQgdG8gcmlzayB0aGUgY2hhbmdlLiAgKi8KLSAgc3Vic2Vnc19maW5pc2ggKCk7Ci0jZW5kaWYKLQotICBpZiAoa2VlcF9pdCkKLSAgICB3cml0ZV9vYmplY3RfZmlsZSAoKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGxpc3RpbmdfcHJpbnQgKGxpc3RpbmdfZmlsZW5hbWUpOwotI2VuZGlmCi0KLSNpZm5kZWYgT0JKX1ZNUyAvKiBkb2VzIGl0cyBvd24gZmlsZSBoYW5kbGluZyAqLwotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChrZWVwX2l0KQotI2VuZGlmCi0gICAgb3V0cHV0X2ZpbGVfY2xvc2UgKG91dF9maWxlX25hbWUpOwotI2VuZGlmCi0KLSAgaWYgKGhhZF9lcnJvcnMgKCkgPiAwICYmICEgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0KQotICAgIGtlZXBfaXQgPSAwOwotCi0gIGlmICgha2VlcF9pdCkKLSAgICB1bmxpbmsgKG91dF9maWxlX25hbWUpOwotCi0gIGlucHV0X3NjcnViX2VuZCAoKTsKLQotICBFTkRfUFJPR1JFU1MgKG15bmFtZSk7Ci0KLSAgLyogVXNlIHhleGl0IGluc3RlYWQgb2YgcmV0dXJuLCBiZWNhdXNlIHVuZGVyIFZNUyBlbnZpcm9ubWVudHMgdGhleQotICAgICBtYXkgbm90IHBsYWNlIHRoZSBzYW1lIGludGVycHJldGF0aW9uIG9uIHRoZSB2YWx1ZSBnaXZlbi4gICovCi0gIGlmIChoYWRfZXJyb3JzICgpID4gMCkKLSAgICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQotICAvKiBPbmx5IGdlbmVyYXRlIGRlcGVuZGVuY3kgZmlsZSBpZiBhc3NlbWJsZXIgd2FzIHN1Y2Nlc3NmdWwuICAqLwotICBwcmludF9kZXBlbmRlbmNpZXMgKCk7Ci0KLSAgeGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N0YXRpc3RpY3MgKCkKLXsKLSNpZmRlZiBIQVZFX1NCUksKLSAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7Ci0jZW5kaWYKLSAgbG9uZyBydW5fdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHN0YXJ0X3RpbWU7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdG90YWwgdGltZSBpbiBhc3NlbWJseTogJWxkLiUwNmxkXG4iKSwKLQkgICBteW5hbWUsIHJ1bl90aW1lIC8gMTAwMDAwMCwgcnVuX3RpbWUgJSAxMDAwMDAwKTsKLSNpZmRlZiBIQVZFX1NCUksKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksCi0JICAgbXluYW1lLCAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7Ci0jZW5kaWYKLQotICBzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHdyaXRlX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHN5bWJvbF9wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotICByZWFkX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0KLSNpZmRlZiB0Y19wcmludF9zdGF0aXN0aWNzCi0gIHRjX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfcHJpbnRfc3RhdGlzdGljcwotICBvYmpfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLSNlbmRpZgotfQotDAotCi0vKgkJCXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcygpCi0gKgotICogSGVyZSB0byBhdHRlbXB0IDEgcGFzcyBvdmVyIGVhY2ggaW5wdXQgZmlsZS4KLSAqIFdlIHNjYW4gYXJndlsqXSBsb29raW5nIGZvciBmaWxlbmFtZXMgb3IgZXhhY3RseSAiIiB3aGljaCBpcwotICogc2hvcnRoYW5kIGZvciBzdGRpbi4gQW55IGFyZ3YgdGhhdCBpcyBOVUxMIGlzIG5vdCBhIGZpbGUtbmFtZS4KLSAqIFdlIHNldCBuZWVkX3Bhc3NfMiBUUlVFIGlmLCBhZnRlciB0aGlzLCB3ZSBzdGlsbCBoYXZlIHVucmVzb2x2ZWQKLSAqIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtICh1bmtub3duIHZhbHVlKSstKHVua25vd24gdmFsdWUpLgotICoKLSAqIE5vdGUgdGhlIHVuKnggc2VtYW50aWNzOiB0aGVyZSBpcyBvbmx5IDEgbG9naWNhbCBpbnB1dCBmaWxlLCBidXQgaXQKLSAqIG1heSBiZSBhIGNhdGVuYXRpb24gb2YgbWFueSAncGh5c2ljYWwnIGlucHV0IGZpbGVzLgotICovCi1zdGF0aWMgdm9pZCAKLXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgc2F3X2FfZmlsZSA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotI2VuZGlmCi0KLSAgbmVlZF9wYXNzXzIgPSAwOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgICAgc2VnbWVudF9pbmZvW2ldLmZpeF9yb290ID0gMDsKLSAgfQotICAvKiBDcmVhdGUgdGhlIHRocmVlIGZpeGVkIG9uZXMgKi8KLSAgewotICAgIHNlZ1Qgc2VnOwotCi0jaWZkZWYgVEVfQVBPTExPCi0gICAgc2VnID0gc3Vic2VnX25ldyAoIi53dGV4dCIsIDApOwotI2Vsc2UKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLnRleHQiLCAwKTsKLSNlbmRpZgotICAgIGFzc2VydCAoc2VnID09IFNFR19FMCk7Ci0gICAgc2VnID0gc3Vic2VnX25ldyAoIi5kYXRhIiwgMCk7Ci0gICAgYXNzZXJ0IChzZWcgPT0gU0VHX0UxKTsKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLmJzcyIsIDApOwotICAgIGFzc2VydCAoc2VnID09IFNFR19FMik7Ci0jaWZkZWYgVEVfQVBPTExPCi0gICAgY3JlYXRlX3RhcmdldF9zZWdtZW50cyAoKTsKLSNlbmRpZgotICB9Ci0KLSNlbHNlIC8qIG5vdCBNQU5ZX1NFR01FTlRTICovCi0gIHRleHRfZml4X3Jvb3QgPSBOVUxMOwotICBkYXRhX2ZpeF9yb290ID0gTlVMTDsKLSAgYnNzX2ZpeF9yb290ID0gTlVMTDsKLSNlbmRpZiAvKiBub3QgTUFOWV9TRUdNRU5UUyAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotICAvKiBDcmVhdGUgdGhlIHN0YW5kYXJkIHNlY3Rpb25zLCBhbmQgdGhvc2UgdGhlIGFzc2VtYmxlciB1c2VzCi0gICAgIGludGVybmFsbHkuICAqLwotICB0ZXh0X3NlY3Rpb24gPSBzdWJzZWdfbmV3IChURVhUX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKERBVEFfU0VDVElPTl9OQU1FLCAwKTsKLSAgYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3IChCU1NfU0VDVElPTl9OQU1FLCAwKTsKLSAgLyogQEAgRklYTUUgLS0gd2UncmUgc2V0dGluZyB0aGUgUkVMT0MgZmxhZyBzbyB0aGF0IHNlY3Rpb25zIGFyZSBhc3N1bWVkCi0gICAgIHRvIGhhdmUgcmVsb2NzLCBvdGhlcndpc2Ugd2UgZG9uJ3QgZmluZCBvdXQgaW4gdGltZS4gKi8KLSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZKSk7Ci0gIC8qIEBAIEZJWE1FIC0tIFNFQ19DT0RFIHNlZW1zIHRvIG1lYW4gY29kZSBvbmx5LCByYXRoZXIgdGhhbiBjb2RlIHBvc3NpYmx5LiovCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQykpOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUgJiBTRUNfQUxMT0MpOwotICBzZWdfaW5mbyAoYnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotICBzdWJzZWdfbmV3IChCRkRfQUJTX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIHN1YnNlZ19uZXcgKEJGRF9VTkRfU0VDVElPTl9OQU1FLCAwKTsKLSAgcmVnX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiKkdBUyBgcmVnJyBzZWN0aW9uKiIsIDApOwotICBleHByX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiKkdBUyBgZXhwcicgc2VjdGlvbioiLCAwKTsKLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotCi0gIC8qIFRoaXMgbWF5IGFkZCBzeW1ib2wgdGFibGUgZW50cmllcywgd2hpY2ggcmVxdWlyZXMgaGF2aW5nIGFuIG9wZW4gQkZELAotICAgICBhbmQgc2VjdGlvbnMgYWxyZWFkeSBjcmVhdGVkLCBpbiBCRkRfQVNTRU1CTEVSIG1vZGUuICAqLwotICBtZF9iZWdpbiAoKTsKLQotI2lmZGVmIG9ial9iZWdpbgotICBvYmpfYmVnaW4gKCk7Ci0jZW5kaWYKLQotICBhcmd2Kys7CQkJLyogc2tpcCBhcmd2WzBdICovCi0gIGFyZ2MtLTsJCQkvKiBza2lwIGFyZ3ZbMF0gKi8KLSAgd2hpbGUgKGFyZ2MtLSkKLSAgICB7Ci0gICAgICBpZiAoKmFyZ3YpCi0JewkJCS8qIElzIGl0IGEgZmlsZS1uYW1lIGFyZ3VtZW50PyAqLwotCSAgUFJPR1JFU1MgKDEpOwotCSAgc2F3X2FfZmlsZSsrOwotCSAgLyogYXJndi0+IiIgaWYgc3RkaW4gZGVzaXJlZCwgZWxzZS0+ZmlsZW5hbWUgKi8KLQkgIHJlYWRfYV9zb3VyY2VfZmlsZSAoKmFyZ3YpOwotCX0KLSAgICAgIGFyZ3YrKzsJCQkvKiBjb21wbGV0ZWQgdGhhdCBhcmd2ICovCi0gICAgfQotICBpZiAoIXNhd19hX2ZpbGUpCi0gICAgcmVhZF9hX3NvdXJjZV9maWxlICgiIik7Ci19CQkJCS8qIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcygpICovCi0KLS8qIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgbWFjcm8gY29kZSBhbmQgZ2FzIGV4cHJlc3Npb24gaGFuZGxpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1tYWNyb19leHByIChlbXNnLCBpZHgsIGluLCB2YWwpCi0gICAgIGNvbnN0IGNoYXIgKmVtc2c7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICp2YWw7Ci17Ci0gIGNoYXIgKmhvbGQ7Ci0gIGV4cHJlc3Npb25TIGV4OwotCi0gIHNiX3Rlcm1pbmF0ZSAoaW4pOwotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGluLT5wdHIgKyBpZHg7Ci0gIGV4cHJlc3Npb24gKCZleCk7Ci0gIGlkeCA9IGlucHV0X2xpbmVfcG9pbnRlciAtIGluLT5wdHI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLSAgICBhc19iYWQgKCIlcyIsIGVtc2cpOwotCi0gICp2YWwgPSAoaW50KSBleC5YX2FkZF9udW1iZXI7Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogZW5kIG9mIGFzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9hcy5oIGIvZ2FzL2FzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjkwMmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2FzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NDUgKzAsMCBAQAotLyogYXMuaCAtIGdsb2JhbCBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVMKLSNkZWZpbmUgR0FTIDEKLS8qCi0gKiBJIHRoaW5rIHRoaXMgc3R1ZmYgaXMgbGFyZ2VseSBvdXQgb2YgZGF0ZS4gIHhveG9yaWNoLgotICoKLSAqIENBUElUQUxJU0VEIG5hbWVzIGFyZSAjZGVmaW5lZC4KLSAqICJsb3dlcmNhc2VIIiBpcyAjZGVmaW5lZCBpZiAibG93ZXJjYXNlLmgiIGhhcyBiZWVuICNpbmNsdWRlLWQuCi0gKiAibG93ZXJjYXNlVCIgaXMgYSB0eXBlZGVmIG9mICJsb3dlcmNhc2UiIG9iamVjdHMuCi0gKiAibG93ZXJjYXNlUCIgaXMgdHlwZSAicG9pbnRlciB0byBvYmplY3Qgb2YgdHlwZSAnbG93ZXJjYXNlJyIuCi0gKiAibG93ZXJjYXNlUyIgaXMgdHlwZWRlZiBzdHJ1Y3QgLi4uIGxvd2VyY2FzZVMuCi0gKgotICogI2RlZmluZSBERUJVRyB0byBlbmFibGUgYWxsIHRoZSAia25vdyIgYXNzZXJ0aW9uIHRlc3RzLgotICogI2RlZmluZSBTVVNQRUNUIHdoZW4gZGVidWdnaW5nIGhhc2ggY29kZS4KLSAqICNkZWZpbmUgQ09NTU9OIGFzICJleHRlcm4iIGZvciBhbGwgbW9kdWxlcyBleGNlcHQgb25lLCB3aGVyZSB5b3UgI2RlZmluZQotICoJQ09NTU9OIGFzICIiLgotICogSWYgVEVTVCBpcyAjZGVmaW5lZCwgdGhlbiB3ZSBhcmUgdGVzdGluZyBhIG1vZHVsZTogI2RlZmluZSBDT01NT04gYXMgIiIuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBjb2RlIHJlY29tbWVuZGVkIGluIHRoZSBhdXRvY29uZiBkb2N1bWVudGF0aW9uLCBhbG1vc3QKLSAgIHZlcmJhdGltLiAgSWYgaXQgZG9lc24ndCB3b3JrIGZvciB5b3UsIGxldCBtZSBrbm93LCBhbmQgbm90aWZ5Ci0gICBkam1AZ251LmFpLm1pdC5lZHUgYXMgd2VsbC4gICovCi0vKiBBZGRlZCAjdW5kZWYgZm9yIERKIERlbG9yaWUuICBUaGUgcmlnaHQgZml4IGlzIHRvIGVuc3VyZSB0aGF0IGFzLmgKLSAgIGlzIGluY2x1ZGVkIGZpcnN0LCBiZWZvcmUgZXZlbiBhbnkgc3lzdGVtIGhlYWRlciBmaWxlcywgaW4gYWxsIGZpbGVzCi0gICB0aGF0IHVzZSBpdC4gIEtSIDE5OTQuMTEuMDMgKi8KLS8qIEFkZGVkIHZvaWQqIHZlcnNpb24gZm9yIFNUREMgY2FzZS4gIFRoaXMgaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoCi0gICB0aGUgZGVjbGFyYXRpb24gaW4gYmlzb24uc2ltcGxlLCB1c2VkIGZvciBtNjhrIG9wZXJhbmQgcGFyc2luZy4KLSAgIC0tS1IgMTk5NS4wOC4wOCAqLwotLyogRm9yY2Ugdm9pZCogZGVjbCBmb3IgaHB1eC4gIFRoaXMgaXMgd2hhdCBCaXNvbiB1c2VzLiAgLS1LUiAxOTk1LjA4LjE2ICovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgaWZuZGVmIGFsbG9jYQotIyAgaWZkZWYgX19TVERDX18KLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICBlbHNlCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgICBpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfX2hwdXgpCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgICBlbHNlCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICAgZW5kaWYgLyogYWxsb2NhICovCi0jICBlbmRpZiAvKiBfQUlYICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0vKiBOb3csIHRlbmQgdG8gdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24uICAqLwotCi0vKiBTeXN0ZW0gaW5jbHVkZSBmaWxlcyBmaXJzdC4uLiAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0vKiBmb3Igc2l6ZV90LCBwaWRfdCAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLS8qIFRoZSBmaXJzdCBnZXRvcHQgdmFsdWUgZm9yIG1hY2hpbmUtaW5kZXBlbmRlbnQgbG9uZyBvcHRpb25zLgotICAgMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotI2RlZmluZSBPUFRJT05fU1REX0JBU0UgMTUwCi0vKiBUaGUgZmlyc3QgZ2V0b3B0IHZhbHVlIGZvciBtYWNoaW5lLWRlcGVuZGVudCBsb25nIG9wdGlvbnMuCi0gICAxNzAgZ2l2ZXMgdGhlIHN0YW5kYXJkIG9wdGlvbnMgcm9vbSB0byBncm93LiAgKi8KLSNkZWZpbmUgT1BUSU9OX01EX0JBU0UgMTcwCi0KLSNpZmRlZiBERUJVRwotI3VuZGVmIE5ERUJVRwotI2VuZGlmCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCBfX0dOVUNfTUlOT1JfXyA8PSA1Ci0jZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gICgoY2hhciopMCkKLSNlbmRpZgotI2lmIDAKLQotLyogSGFuZGxlIGxvc3NhZ2Ugd2l0aCBhc3NlcnQuaC4gICovCi0jaWZuZGVmIEJST0tFTl9BU1NFUlQKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbHNlIC8qIEJST0tFTl9BU1NFUlQgKi8KLSNpZm5kZWYgTkRFQlVHCi0jZGVmaW5lIGFzc2VydChwKSAoKHApID8gMCA6IChhc19hc3NlcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXyksIDApKQotI2Vsc2UKLSNkZWZpbmUgYXNzZXJ0KHApICgocCksIDApCi0jZW5kaWYKLSNlbmRpZiAvKiBCUk9LRU5fQVNTRVJUICovCi0KLSNlbHNlCi0KLSNkZWZpbmUgYXNzZXJ0KFApICgoUCkgPyAwIDogKGFzX2Fzc2VydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKSwgMCkpCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKQkJYXNfYWJvcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXykKLQotI2VuZGlmCi0KLQotLyogTm93IEdOVSBoZWFkZXIgZmlsZXMuLi4gKi8KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpbmNsdWRlIDxiZmQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotCi0vKiBEZWZpbmUgdGhlIHN0YW5kYXJkIHByb2dyZXNzIG1hY3Jvcy4gICovCi0jaW5jbHVkZSA8cHJvZ3Jlc3MuaD4KLQotLyogVGhpcyBkb2Vzbid0IGdldCB0YWtlbiBjYXJlIG9mIGFueXdoZXJlLiAgKi8KLSNpZm5kZWYgX19NV0VSS1NfXyAgLyogTWV0cm93ZXJrcyBDIGNob2tlcyBvbiB0aGUgImRlZmluZWQgKGlubGluZSkiICovCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSAmJiAhZGVmaW5lZCAoaW5saW5lKQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotI2VuZGlmIC8qICFfX01XRVJLU19fICovCi0KLS8qIE90aGVyIHN0dWZmIGZyb20gY29uZmlnLmguICAqLwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLWV4dGVybiBQVFIgbWFsbG9jICgpOwotZXh0ZXJuIFBUUiByZWFsbG9jICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBWTVMuICAqLwotI2lmICEgZGVmaW5lZCAoSEFWRV9VTkxJTkspICYmIGRlZmluZWQgKEhBVkVfUkVNT1ZFKQotI2RlZmluZSB1bmxpbmsgcmVtb3ZlCi0jZW5kaWYKLQotLyogSGFjayB0byBtYWtlICJnY2MgLVdhbGwiIG5vdCBjb21wbGFpbiBhYm91dCBvYnN0YWNrIG1hY3Jvcy4gICovCi0jaWYgIWRlZmluZWQgKG1lbWNweSkgJiYgIWRlZmluZWQgKGJjb3B5KQotI2RlZmluZSBiY29weShzcmMsZGVzdCxzaXplKQltZW1jcHkoZGVzdCxzcmMsc2l6ZSkKLSNlbmRpZgotCi0vKiBNYWtlIFNhYmVyIGhhcHBpZXIgb24gb2JzdGFjay5oLiAgKi8KLSNpZmRlZiBTQUJFUgotI3VuZGVmICBfX1BUUl9UT19JTlQKLSNkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoaW50KShQKSkKLSN1bmRlZiAgX19JTlRfVE9fUFRSCi0jZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKGNoYXIgKikoUCkpCi0jZW5kaWYKLQotI2lmbmRlZiBfX0xJTkVfXwotI2RlZmluZSBfX0xJTkVfXyAidW5rbm93biIKLSNlbmRpZiAvKiBfX0xJTkVfXyAqLwotCi0jaWZuZGVmIF9fRklMRV9fCi0jZGVmaW5lIF9fRklMRV9fICJ1bmtub3duIgotI2VuZGlmIC8qIF9fRklMRV9fICovCi0KLSNpZm5kZWYgRk9QRU5fV0IKLSNpZmRlZiBHTzMyCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRVhJVF9TVUNDRVNTCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAwCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAxCi0jZW5kaWYKLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKLSNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIHhmcmVlCi0KLSNkZWZpbmUgeGZyZWUgZnJlZQotCi0jaW5jbHVkZSAiYXNpbnRsLmgiCi0KLSNkZWZpbmUgQkFEX0NBU0UodmFsKSBcCi17IFwKLSAgICAgIGFzX2ZhdGFsKF8oIkNhc2UgdmFsdWUgJWxkIHVuZXhwZWN0ZWQgYXQgbGluZSAlZCBvZiBmaWxlIFwiJXNcIlxuIiksIFwKLQkgICAgICAgKGxvbmcpIHZhbCwgX19MSU5FX18sIF9fRklMRV9fKTsgXAotCSAgIH0KLQwKLSNpbmNsdWRlICJmbG9udW0uaCIKLQotLyogVGhlc2UgYXJlIGFzc2VtYmxlci13aWRlIGNvbmNlcHRzICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gYmZkICpzdGRvdXRwdXQ7Ci10eXBlZGVmIGJmZF92bWEgYWRkcmVzc1Q7Ci10eXBlZGVmIGJmZF9zaWduZWRfdm1hIG9mZnNldFQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGFkZHJlc3NUOwotdHlwZWRlZiBsb25nIG9mZnNldFQ7Ci0jZW5kaWYKLQotLyogVHlwZSBvZiBzeW1ib2wgdmFsdWUsIGV0Yy4gIEZvciB1c2UgaW4gcHJvdG90eXBlcy4gICovCi10eXBlZGVmIGFkZHJlc3NUIHZhbHVlVDsKLQotI2lmbmRlZiBDT01NT04KLSNpZmRlZiBURVNUCi0jZGVmaW5lIENPTU1PTgkJCS8qIGRlY2xhcmUgb3VyIENPTU1PTnMgc3RvcmFnZSBoZXJlLiAqLwotI2Vsc2UKLSNkZWZpbmUgQ09NTU9OIGV4dGVybgkJLyogb3VyIGNvbW1vbnMgbGl2ZSBlbHN3aGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLS8qIENPTU1PTiBub3cgZGVmaW5lZCAqLwotCi0jaWZkZWYgREVCVUcKLSNpZm5kZWYga25vdwotI2RlZmluZSBrbm93KHApIGFzc2VydChwKQkvKiBWZXJpZnkgb3VyIGFzc3VtcHRpb25zISAqLwotI2VuZGlmIC8qIG5vdCB5ZXQgZGVmaW5lZCAqLwotI2Vsc2UKLSNkZWZpbmUga25vdyhwKQkJCS8qIGtub3coKSBjaGVja3MgYXJlIG5vLW9wLmVkICovCi0jZW5kaWYKLQwKLS8qIGlucHV0X3NjcnViLmMgKi8KLQotLyoKLSAqIFN1cHBsaWVzIHNhbml0aXNlZCBidWZmZXJzIHRvIHJlYWQuYy4KLSAqIEFsc28gdW5kZXJzdGFuZHMgcHJpbnRpbmcgbGluZS1udW1iZXIgcGFydCBvZiBlcnJvciBtZXNzYWdlcy4KLSAqLwotDAotCi0vKiBzdWJzZWdzLmMgICAgIFN1Yi1zZWdtZW50cy4gQWxzbywgc2VnbWVudCg9ZXhwcmVzc2lvbiB0eXBlKXMuKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0jaW5jbHVkZSAiYmZkLmgiCi0jZGVmaW5lIE5fU0VHTUVOVFMgNDAKLSNkZWZpbmUgU0VHX05PUk1BTCh4KSAoKHgpID49IFNFR19FMCAmJiAoeCkgPD0gU0VHX0UzOSkKLSNkZWZpbmUgU0VHX0xJU1QgU0VHX0UwLFNFR19FMSxTRUdfRTIsU0VHX0UzLFNFR19FNCxTRUdfRTUsU0VHX0U2LFNFR19FNyxTRUdfRTgsU0VHX0U5LFwKLQkJIFNFR19FMTAsU0VHX0UxMSxTRUdfRTEyLFNFR19FMTMsU0VHX0UxNCxTRUdfRTE1LFNFR19FMTYsU0VHX0UxNyxTRUdfRTE4LFNFR19FMTksXAotCQkgU0VHX0UyMCxTRUdfRTIxLFNFR19FMjIsU0VHX0UyMyxTRUdfRTI0LFNFR19FMjUsU0VHX0UyNixTRUdfRTI3LFNFR19FMjgsU0VHX0UyOSxcCi0JCSBTRUdfRTMwLFNFR19FMzEsU0VHX0UzMixTRUdfRTMzLFNFR19FMzQsU0VHX0UzNSxTRUdfRTM2LFNFR19FMzcsU0VHX0UzOCxTRUdfRTM5Ci0jZGVmaW5lIFNFR19URVhUIFNFR19FMAotI2RlZmluZSBTRUdfREFUQSBTRUdfRTEKLSNkZWZpbmUgU0VHX0JTUyBTRUdfRTIKLSNkZWZpbmUgU0VHX0xBU1QgU0VHX0UzOQotI2Vsc2UKLSNkZWZpbmUgTl9TRUdNRU5UUyAzCi0jZGVmaW5lIFNFR19OT1JNQUwoeCkgKCh4KSA9PSBTRUdfVEVYVCB8fCAoeCkgPT0gU0VHX0RBVEEgfHwgKHgpID09IFNFR19CU1MpCi0jZGVmaW5lIFNFR19MSVNUIFNFR19URVhULFNFR19EQVRBLFNFR19CU1MKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gX3NlZ1QKLSAgewotICAgIFNFR19BQlNPTFVURSA9IDAsCi0gICAgU0VHX0xJU1QsCi0gICAgU0VHX1VOS05PV04sCi0gICAgU0VHX0dPT0YsCQkJLyogT25seSBoYXBwZW5zIGlmIEFTIGhhcyBhIGxvZ2ljIGVycm9yLiAqLwotICAgIC8qIEludmVudGVkIHNvIHdlIGRvbid0IGNyYXNoIHByaW50aW5nICovCi0gICAgLyogZXJyb3IgbWVzc2FnZSBpbnZvbHZpbmcgd2VpcmQgc2VnbWVudC4gKi8KLSAgICBTRUdfRVhQUiwJCQkvKiBJbnRlcm1lZGlhdGUgZXhwcmVzc2lvbiB2YWx1ZXMuICovCi0gICAgU0VHX0RFQlVHLAkJCS8qIERlYnVnIHNlZ21lbnQgKi8KLSAgICBTRUdfTlRWLAkJCS8qIFRyYW5zZmVydCB2ZWN0b3IgcHJlbG9hZCBzZWdtZW50ICovCi0gICAgU0VHX1BUViwJCQkvKiBUcmFuc2ZlcnQgdmVjdG9yIHBvc3Rsb2FkIHNlZ21lbnQgKi8KLSAgICBTRUdfUkVHSVNURVIJCS8qIE15dGhpY2FsOiBhIHJlZ2lzdGVyLXZhbHVlZCBleHByZXNzaW9uICovCi0gIH0gc2VnVDsKLQotI2RlZmluZSBTRUdfTUFYSU1VTV9PUkRJTkFMIChTRUdfUkVHSVNURVIpCi0jZWxzZQotdHlwZWRlZiBhc2VjdGlvbiAqc2VnVDsKLSNkZWZpbmUgU0VHX05PUk1BTChTRUcpCQkoKFNFRykgIT0gYWJzb2x1dGVfc2VjdGlvbglcCi0JCQkJICYmIChTRUcpICE9IHVuZGVmaW5lZF9zZWN0aW9uCVwKLQkJCQkgJiYgKFNFRykgIT0gcmVnX3NlY3Rpb24JXAotCQkJCSAmJiAoU0VHKSAhPSBleHByX3NlY3Rpb24pCi0jZW5kaWYKLXR5cGVkZWYgaW50IHN1YnNlZ1Q7Ci0KLS8qIFdoYXQgc3Vic2VnIHdlIGFyZSBhY2NyZXRpbmcgbm93PyAqLwotQ09NTU9OIHN1YnNlZ1Qgbm93X3N1YnNlZzsKLQotLyogU2VnbWVudCBvdXIgaW5zdHJ1Y3Rpb25zIGVtaXQgdG8uICovCi1DT01NT04gc2VnVCBub3dfc2VnOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBzZWdtZW50X25hbWUoU0VHKQliZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBTRUcpCi0jZWxzZQotZXh0ZXJuIGNoYXIgY29uc3QgKmNvbnN0IHNlZ19uYW1lW107Ci0jZGVmaW5lIHNlZ21lbnRfbmFtZShTRUcpCXNlZ19uYW1lWyhpbnQpIChTRUcpXQotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGludCBzZWN0aW9uX2FsaWdubWVudFtdOwotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gc2VnVCByZWdfc2VjdGlvbiwgZXhwcl9zZWN0aW9uOwotLyogU2hvdWxkbid0IHRoZXNlIGJlIGVsaW1pbmF0ZWQgc29tZWRheT8gICovCi1leHRlcm4gc2VnVCB0ZXh0X3NlY3Rpb24sIGRhdGFfc2VjdGlvbiwgYnNzX3NlY3Rpb247Ci0jZGVmaW5lIGFic29sdXRlX3NlY3Rpb24JYmZkX2Fic19zZWN0aW9uX3B0cgotI2RlZmluZSB1bmRlZmluZWRfc2VjdGlvbgliZmRfdW5kX3NlY3Rpb25fcHRyCi0jZWxzZQotI2RlZmluZSByZWdfc2VjdGlvbgkJU0VHX1JFR0lTVEVSCi0jZGVmaW5lIGV4cHJfc2VjdGlvbgkJU0VHX0VYUFIKLSNkZWZpbmUgdGV4dF9zZWN0aW9uCQlTRUdfVEVYVAotI2RlZmluZSBkYXRhX3NlY3Rpb24JCVNFR19EQVRBCi0jZGVmaW5lIGJzc19zZWN0aW9uCQlTRUdfQlNTCi0jZGVmaW5lIGFic29sdXRlX3NlY3Rpb24JU0VHX0FCU09MVVRFCi0jZGVmaW5lIHVuZGVmaW5lZF9zZWN0aW9uCVNFR19VTktOT1dOCi0jZW5kaWYKLQotLyogcmVsYXgoKSAqLwotCi1lbnVtIF9yZWxheF9zdGF0ZQotICB7Ci0gICAgLyogVmFyaWFibGUgY2hhcnMgdG8gYmUgcmVwZWF0ZWQgZnJfb2Zmc2V0IHRpbWVzLgotICAgICAgIEZyX3N5bWJvbCB1bnVzZWQuIFVzZWQgd2l0aCBmcl9vZmZzZXQgPT0gMCBmb3IgYQotICAgICAgIGNvbnN0YW50IGxlbmd0aCBmcmFnLiAqLwotICAgIHJzX2ZpbGwgPSAxLAotCi0gICAgLyogQWxpZ24uICBUaGUgZnJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBwb3dlciBvZiAyIHRvIHdoaWNoIHRvCi0gICAgICAgYWxpZ24uICBUaGUgZnJfdmFyIGZpZWxkIGhvbGRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUKLSAgICAgICBmaWxsIHBhdHRlcm4uICBUaGUgZnJfc3VidHlwZSBmaWVsZCBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAgICAgICBieXRlcyB0byBza2lwIHdoZW4gYWxpZ25pbmcsIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0gICAgcnNfYWxpZ24sCi0KLSAgICAvKiBBbGlnbiBjb2RlLiAgVGhlIGZyX29mZnNldCBmaWVsZCBob2xkcyB0aGUgcG93ZXIgb2YgMiB0byB3aGljaAotICAgICAgIHRvIGFsaWduLiAgVGhpcyB0eXBlIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IG1hY2hpbmUgc3BlY2lmaWMKLSAgICAgICBjb2RlLCB3aGljaCBpcyBub3JtYWxseSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIGZpbGwKLSAgICAgICBwYXR0ZXJuLiAgVGhlIGZyX3N1YnR5cGUgZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gICAgICAgYnl0ZXMgdG8gc2tpcCB3aGVuIGFsaWduaW5nLCBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotICAgIHJzX2FsaWduX2NvZGUsCi0KLSAgICAvKiBPcmc6IEZyX29mZnNldCwgZnJfc3ltYm9sOiBhZGRyZXNzLiAxIHZhcmlhYmxlIGNoYXI6IGZpbGwKLSAgICAgICBjaGFyYWN0ZXIuICovCi0gICAgcnNfb3JnLAotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAvKiBKRjogZ3VucG9pbnQgKi8KLSAgICByc19icm9rZW5fd29yZCwKLSNlbmRpZgotCi0gICAgLyogbWFjaGluZS1zcGVjaWZpYyByZWxheGFibGUgKG9yIHNpbWlsYXJseSBhbHRlcmFibGUpIGluc3RydWN0aW9uICovCi0gICAgcnNfbWFjaGluZV9kZXBlbmRlbnQsCi0KLSAgICAvKiAuc3BhY2UgZGlyZWN0aXZlIHdpdGggZXhwcmVzc2lvbiBvcGVyYW5kIHRoYXQgbmVlZHMgdG8gYmUgY29tcHV0ZWQKLSAgICAgICBsYXRlci4gIFNpbWlsYXIgdG8gcnNfb3JnLCBidXQgZGlmZmVyZW50LgotICAgICAgIGZyX3N5bWJvbDogb3BlcmFuZAotICAgICAgIDEgdmFyaWFibGUgY2hhcjogZmlsbCBjaGFyYWN0ZXIgICovCi0gICAgcnNfc3BhY2UsCi0KLSAgICAvKiBBIERXQVJGIGxlYjEyOCB2YWx1ZTsgb25seSBFTEYgdXNlcyB0aGlzLiAgVGhlIHN1YnR5cGUgaXMgMCBmb3IKLSAgICAgICB1bnNpZ25lZCwgMSBmb3Igc2lnbmVkLiAgKi8KLSAgICByc19sZWIxMjgsCi0KLSAgICAvKiBFeGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gd2hpY2ggd2UgbWF5IGJlIGFibGUgdG8gb3B0aW1pemUuICAqLwotICAgIHJzX2NmYQotICB9OwotCi10eXBlZGVmIGVudW0gX3JlbGF4X3N0YXRlIHJlbGF4X3N0YXRlVDsKLQotLyogVGhpcyB0eXBlIGlzIHVzZWQgaW4gcHJvdG90eXBlcywgc28gaXQgY2FuJ3QgYmUgYSB0eXBlIHRoYXQgd2lsbCBiZQotICAgd2lkZW5lZCBmb3IgYXJndW1lbnQgcGFzc2luZy4gICovCi10eXBlZGVmIHVuc2lnbmVkIGludCByZWxheF9zdWJzdGF0ZVQ7Ci0KLS8qIEVub3VnaCBiaXRzIGZvciBhZGRyZXNzLCBidXQgc3RpbGwgYW4gaW50ZWdlciB0eXBlLgotICAgQ291bGQgYmUgYSBwcm9ibGVtLCBjcm9zcy1hc3NlbWJsaW5nIGZvciA2NC1iaXQgbWFjaGluZXMuICAqLwotdHlwZWRlZiBhZGRyZXNzVCByZWxheF9hZGRyZXNzVDsKLQwKLS8qIG1haW4gcHJvZ3JhbSAiYXMuYyIgKGNvbW1hbmQgYXJndW1lbnRzIGV0YykgKi8KLQotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19ub19jb21tZW50czsgLyogLWYgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfZGVidWc7IC8qIC1EICovCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX3NpZ25lZF9vdmVyZmxvd19vazsgLyogLUogKi8KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ193YXJuX2Rpc3BsYWNlbWVudDsgLyogLUsgKi8KLSNlbmRpZgotCi0vKiBUcnVlIGlmIGxvY2FsIHN5bWJvbHMgc2hvdWxkIGJlIHJldGFpbmVkLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19rZWVwX2xvY2FsczsgLyogLUwgKi8KLQotLyogVHJ1ZSBpZiB3ZSBhcmUgYXNzZW1ibGluZyBpbiBNUkkgbW9kZS4gICovCi1DT01NT04gaW50IGZsYWdfbXJpOwotCi0vKiBUcnVlIGlmIHdlIGFyZSBhc3NlbWJsaW5nIGluIG02OGsgTVJJIG1vZGUuICAqLwotQ09NTU9OIGludCBmbGFnX202OGtfbXJpOwotCi0vKiBTaG91bGQgdGhlIGRhdGEgc2VjdGlvbiBiZSBtYWRlIHJlYWQtb25seSBhbmQgYXBwZW5kZWQgdG8gdGhlIHRleHQKLSAgIHNlY3Rpb24/ICAqLwotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQ7IC8qIC1SICovCi0KLS8qIFRydWUgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIGluaGliaXRlZC4gICovCi1DT01NT04gaW50IGZsYWdfbm9fd2FybmluZ3M7IC8qIC1XICovCi0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gZ2VuZXJhdGUgb3V0cHV0IGV2ZW4gaWYgbm9uLWZhdGFsIGVycm9ycwotICAgYXJlIGRldGVjdGVkLiAgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dDsgLyogLVogKi8KLQotLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBhc3NlbWJsZXIgc2hvdWxkIG91dHB1dCB0aW1lIGFuZCBzcGFjZSB1c2FnZS4gKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfcHJpbnRfc3RhdGlzdGljczsKLQotLyogVHJ1ZSBpZiBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzIGFyZSB0byBiZSBzdHJpcHBlZC4gICovCi1DT01NT04gaW50IGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGU7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgdHJhZGl0aW9uYWwgZm9ybWF0IG9iamVjdCBmaWxlLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQ7Ci0KLS8qIG5hbWUgb2YgZW1pdHRlZCBvYmplY3QgZmlsZSAqLwotQ09NTU9OIGNoYXIgKm91dF9maWxlX25hbWU7Ci0KLS8qIG5hbWUgb2YgZmlsZSBkZWZpbmluZyBleHRlbnNpb25zIHRvIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzZXQgKi8KLUNPTU1PTiBjaGFyICppbnN0dGJsX2ZpbGVfbmFtZTsKLQotLyogVFJVRSBpZiB3ZSBuZWVkIGEgc2Vjb25kIHBhc3MuICovCi1DT01NT04gaW50IG5lZWRfcGFzc18yOwotCi0vKiBUUlVFIGlmIHdlIHNob3VsZCBkbyBubyByZWxheGluZywgYW5kCi0gICBsZWF2ZSBsb3RzIG9mIHBhZGRpbmcuICAqLwotQ09NTU9OIGludCBsaW5rcmVsYXg7Ci0KLS8qIFRSVUUgaWYgd2Ugc2hvdWxkIHByb2R1Y2UgYSBsaXN0aW5nLiAgKi8KLWV4dGVybiBpbnQgbGlzdGluZzsKLQotLyogVHlwZSBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2Ugc2hvdWxkIGdlbmVyYXRlLiAgV2UgY3VycmVudGx5Ci0gICBzdXBwb3J0IHN0YWJzLCBFQ09GRiwgYW5kIERXQVJGMi4gICovCi0KLWVudW0gZGVidWdfaW5mb190eXBlCi0gIHsKLSAgICBERUJVR19VTlNQRUNJRklFRCwKLSAgICBERUJVR19OT05FLAotICAgIERFQlVHX1NUQUJTLAotICAgIERFQlVHX0VDT0ZGLAotICAgIERFQlVHX0RXQVJGLAotICAgIERFQlVHX0RXQVJGMgotICB9OwotCi1leHRlcm4gZW51bSBkZWJ1Z19pbmZvX3R5cGUgZGVidWdfdHlwZTsKLQwKLS8qIE1heGltdW0gbGV2ZWwgb2YgbWFjcm8gbmVzdGluZy4gICovCi1leHRlcm4gaW50IG1heF9tYWNyb19uZXN0OwotCi0vKiBPYnN0YWNrIGNodW5rIHNpemUuICBLZWVwIGxhcmdlIGZvciBlZmZpY2llbnQgc3BhY2UgdXNlLCBtYWtlIHNtYWxsIHRvCi0gICBpbmNyZWFzZSBtYWxsb2MgY2FsbHMgZm9yIG1vbml0b3JpbmcgbWVtb3J5IGFsbG9jYXRpb24uICAqLwotZXh0ZXJuIGludCBjaHVua3NpemU7Ci0KLXN0cnVjdCBfcHNldWRvX3R5cGUKLSAgewotICAgIC8qIGFzc2VtYmxlciBtbmVtb25pYywgbG93ZXIgY2FzZSwgbm8gJy4nICovCi0gICAgY29uc3QgY2hhciAqcG9jX25hbWU7Ci0gICAgLyogRG8gdGhlIHdvcmsgKi8KLSAgICB2b2lkICgqcG9jX2hhbmRsZXIpIFBBUkFNUyAoKGludCkpOwotICAgIC8qIFZhbHVlIHRvIHBhc3MgdG8gaGFuZGxlciAqLwotICAgIGludCBwb2NfdmFsOwotICB9OwotCi10eXBlZGVmIHN0cnVjdCBfcHNldWRvX3R5cGUgcHNldWRvX3R5cGVTOwotCi0vKiBQcmVmZXIgdmFyYXJncyBmb3Igbm9uLUFOU0kgY29tcGlsZXIsIHNpbmNlIHNvbWUgd2lsbCBiYXJmIGlmIHRoZQotICAgZWxsaXBzaXMgZGVmaW5pdGlvbiBpcyB1c2VkIHdpdGggYSBuby1hcmd1bWVudHMgZGVjbGFyYXRpb24uICAqLwotI2lmIGRlZmluZWQgKEhBVkVfVkFSQVJHU19IKSAmJiAhZGVmaW5lZCAoX19TVERDX18pCi0jdW5kZWYgSEFWRV9TVERBUkdfSAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NUREFSR19IKQotI2RlZmluZSBVU0VfU1REQVJHCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoVVNFX1NUREFSRykgJiYgZGVmaW5lZCAoSEFWRV9WQVJBUkdTX0gpCi0jZGVmaW5lIFVTRV9WQVJBUkdTCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9TVERBUkcKLSNpZiAoX19HTlVDX18gPj0gMikgJiYgIWRlZmluZWQoVk1TKQotLyogZm9yIHVzZSB3aXRoIC1XZm9ybWF0ICovCi0KLSNpZiBfX0dOVUNfTUlOT1JfXyA8IDYKLS8qIFN1cHBvcnQgZm9yIGRvdWJsZSB1bmRlcnNjb3JlcyBpbiBhdHRyaWJ1dGUgbmFtZXMgd2FzIGFkZGVkIGluIGdjYwotICAgMi42LCBzbyBhdm9pZCB0aGVtIGlmIHdlIGFyZSB1c2luZyBhbiBlYXJsaWVyIHZlcnNpb24uICAqLwotI2RlZmluZSBfX3ByaW50Zl9fIHByaW50ZgotI2RlZmluZSBfX2Zvcm1hdF9fIGZvcm1hdAotI2VuZGlmCi0KLSNkZWZpbmUgUFJJTlRGX0xJS0UoRkNOKSBcCi0gIHZvaWQgRkNOIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgXAotICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAyKSkpCi0jZGVmaW5lIFBSSU5URl9XSEVSRV9MSUtFKEZDTikgXAotICB2b2lkIEZDTiAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBcCi0gICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSkKLQotI2Vsc2UgLyogX19HTlVDX18gPCAyIHx8IGRlZmluZWQoVk1TKSAqLwotCi0jZGVmaW5lIFBSSU5URl9MSUtFKEZDTikJdm9pZCBGQ04gUEFSQU1TICgoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKQotI2RlZmluZSBQUklOVEZfV0hFUkVfTElLRShGQ04pCXZvaWQgRkNOIFBBUkFNUyAoKGNoYXIgKmZpbGUsIFwKLQkJCQkJCSAgdW5zaWduZWQgaW50IGxpbmUsIFwKLQkJCQkJICAJICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZChWTVMpICovCi0KLSNlbHNlIC8qICEgVVNFX1NUREFSRyAqLwotCi0jZGVmaW5lIFBSSU5URl9MSUtFKEZDTikJdm9pZCBGQ04gKCkKLSNkZWZpbmUgUFJJTlRGX1dIRVJFX0xJS0UoRkNOKQl2b2lkIEZDTiAoKQotCi0jZW5kaWYgLyogISBVU0VfU1REQVJHICovCi0KLVBSSU5URl9MSUtFIChhc19iYWQpOwotUFJJTlRGX0xJS0UgKGFzX2ZhdGFsKTsKLVBSSU5URl9MSUtFIChhc190c2t0c2spOwotUFJJTlRGX0xJS0UgKGFzX3dhcm4pOwotUFJJTlRGX1dIRVJFX0xJS0UgKGFzX2JhZF93aGVyZSk7Ci1QUklOVEZfV0hFUkVfTElLRSAoYXNfd2Fybl93aGVyZSk7Ci0KLXZvaWQgYXNfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLXZvaWQgYXNfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotCi12b2lkIGZwcmludF92YWx1ZSBQQVJBTVMgKChGSUxFICpmaWxlLCBhZGRyZXNzVCB2YWx1ZSkpOwotdm9pZCBzcHJpbnRfdmFsdWUgUEFSQU1TICgoY2hhciAqYnVmLCBhZGRyZXNzVCB2YWx1ZSkpOwotCi1pbnQgaGFkX2Vycm9ycyBQQVJBTVMgKCh2b2lkKSk7Ci1pbnQgaGFkX3dhcm5pbmdzIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCBwcmludF92ZXJzaW9uX2lkIFBBUkFNUyAoKHZvaWQpKTsKLWNoYXIgKmFwcF9wdXNoIFBBUkFNUyAoKHZvaWQpKTsKLWNoYXIgKmF0b2ZfaWVlZSBQQVJBTVMgKChjaGFyICpzdHIsIGludCB3aGF0X2tpbmQsIExJVFRMRU5VTV9UWVBFICogd29yZHMpKTsKLWNoYXIgKmlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgY2hhciAqcG9zaXRpb24pKTsKLWNoYXIgKmlucHV0X3NjcnViX25ld19maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci1jaGFyICppbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciBQQVJBTVMgKChjaGFyICoqYnVmcCkpOwotaW50IGRvX3NjcnViX2NoYXJzIFBBUkFNUyAoKGludCAoKmdldCkgKGNoYXIgKiwgaW50KSwgY2hhciAqdG8sIGludCB0b2xlbikpOwotaW50IGdlbl90b193b3JkcyBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqIHdvcmRzLCBpbnQgcHJlY2lzaW9uLAotCQkJICBsb25nIGV4cG9uZW50X2JpdHMpKTsKLWludCBoYWRfZXJyIFBBUkFNUyAoKHZvaWQpKTsKLWludCBpZ25vcmVfaW5wdXQgUEFSQU1TICgodm9pZCkpOwotdm9pZCBjb25kX2ZpbmlzaF9jaGVjayBQQVJBTVMgKChpbnQpKTsKLXZvaWQgY29uZF9leGl0X21hY3JvIFBBUkFNUyAoKGludCkpOwotaW50IHNlZW5fYXRfbGVhc3RfMV9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgYXBwX3BvcCBQQVJBTVMgKChjaGFyICphcmcpKTsKLXZvaWQgYXNfaG93bXVjaCBQQVJBTVMgKChGSUxFICogc3RyZWFtKSk7Ci12b2lkIGFzX3BlcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICpncmlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLXZvaWQgYXNfd2hlcmUgUEFSQU1TICgoY2hhciAqKm5hbWVwLCB1bnNpZ25lZCBpbnQgKmxpbmVwKSk7Ci12b2lkIGJ1bXBfbGluZV9jb3VudGVycyBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGRvX3NjcnViX2JlZ2luIFBBUkFNUyAoKGludCkpOwotdm9pZCBpbnB1dF9zY3J1Yl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X3NjcnViX2Nsb3NlIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfc2NydWJfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLWludCBuZXdfbG9naWNhbF9saW5lIFBBUkFNUyAoKGNoYXIgKmZuYW1lLCBpbnQgbGluZV9udW1iZXIpKTsKLXZvaWQgc3Vic2Vnc19iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIHN1YnNlZ19jaGFuZ2UgUEFSQU1TICgoc2VnVCBzZWcsIGludCBzdWJzZWcpKTsKLXNlZ1Qgc3Vic2VnX25ldyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBzdWJzZWdUIHN1YnNlZykpOwotc2VnVCBzdWJzZWdfZm9yY2VfbmV3IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN1YnNlZ1Qgc3Vic2VnKSk7Ci12b2lkIHN1YnNlZ19zZXQgUEFSQU1TICgoc2VnVCBzZWcsIHN1YnNlZ1Qgc3Vic2VnKSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc2VnVCBzdWJzZWdfZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0jZW5kaWYKLWludCBzdWJzZWdfdGV4dF9wIFBBUkFNUyAoKHNlZ1QpKTsKLQotdm9pZCBzdGFydF9kZXBlbmRlbmNpZXMgUEFSQU1TICgoY2hhciAqKSk7Ci12b2lkIHJlZ2lzdGVyX2RlcGVuZGVuY3kgUEFSQU1TICgoY2hhciAqKSk7Ci12b2lkIHByaW50X2RlcGVuZGVuY2llcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0cnVjdCBleHByZXNzaW9uUzsKLXN0cnVjdCBmaXg7Ci10eXBlZGVmIHN0cnVjdCBzeW1ib2wgc3ltYm9sUzsKLXN0cnVjdCByZWxheF90eXBlOwotdHlwZWRlZiBzdHJ1Y3QgZnJhZyBmcmFnUzsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGxpdGVyYWwuYyAqLwotdmFsdWVUIGFkZF90b19saXRlcmFsX3Bvb2wgUEFSQU1TICgoc3ltYm9sUyAqLCB2YWx1ZVQsIHNlZ1QsIGludCkpOwotI2VuZGlmCi0KLWludCBjaGVja19laF9mcmFtZSBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvblMgKiwgdW5zaWduZWQgaW50ICopKTsKLWludCBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBQQVJBTVMgKChmcmFnUyAqKSk7Ci1pbnQgZWhfZnJhbWVfcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqKSk7Ci12b2lkIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLSNpbmNsdWRlICJleHByLmgiCQkvKiBCZWZvcmUgdGFyZy0qLmggKi8KLQotLyogdGhpcyBvbmUgc3RhcnRzIHRoZSBjaGFpbiBvZiB0YXJnZXQgZGVwZW5kYW50IGhlYWRlcnMgKi8KLSNpbmNsdWRlICJ0YXJnLWVudi5oIgotCi0jaW5jbHVkZSAid3JpdGUuaCIKLSNpbmNsdWRlICJmcmFncy5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJyZWFkLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotCi0jaW5jbHVkZSAidGMuaCIKLSNpbmNsdWRlICJvYmouaCIKLQotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0jaW5jbHVkZSAiZW11bC5oIgotI2VuZGlmCi0jaW5jbHVkZSAibGlzdGluZy5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19ET0xMQVIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAwCi0jZW5kaWYKLQotI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDAKLSNlbmRpZgotCi0jaWZuZGVmIFRFWFRfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFRFWFRfU0VDVElPTl9OQU1FCSIudGV4dCIKLSNkZWZpbmUgREFUQV9TRUNUSU9OX05BTUUJIi5kYXRhIgotI2RlZmluZSBCU1NfU0VDVElPTl9OQU1FCSIuYnNzIgotI2VuZGlmCi0KLSNlbmRpZiAvKiBHQVMgKi8KLQotLyogZW5kIG9mIGFzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9hc2ludGwuaCBiL2dhcy9hc2ludGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczM2M4NS4uMDAwMDAwMAotLS0gYS9nYXMvYXNpbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBhc2ludGwuaCAtIGdhcy1zcGVjaWZpYyBoZWFkZXIgZm9yIGdldHRleHQgY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvYXRvZi1nZW5lcmljLmMgYi9nYXMvYXRvZi1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjlmMjEuLjAwMDAwMDAKLS0tIGEvZ2FzL2F0b2YtZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qIGF0b2ZfZ2VuZXJpYy5jIC0gdHVybiBhIHN0cmluZyBvZiBkaWdpdHMgaW50byBhIEZsb251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICgwKQotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgKDEpCi0jZW5kaWYKLQotI2lmZGVmIFRSQUNFCi1zdGF0aWMgdm9pZCBmbG9udW1fcHJpbnQgUEFSQU1TICgoY29uc3QgRkxPTlVNX1RZUEUgKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglHaXZlbiBhIHN0cmluZyBvZiBkZWNpbWFsIGRpZ2l0cyAsIHdpdGggb3B0aW9uYWwgZGVjaW1hbAkqCi0gKgltYXJrIGFuZCBvcHRpb25hbCBkZWNpbWFsIGV4cG9uZW50IChwbGFjZSB2YWx1ZSkgb2YgdGhlCQkqCi0gKglsb3dlc3Rfb3JkZXIgZGVjaW1hbCBkaWdpdDogcHJvZHVjZSBhIGZsb2F0aW5nIHBvaW50CQkqCi0gKgludW1iZXIuIFRoZSBudW1iZXIgaXMgJ2dlbmVyaWMnIGZsb2F0aW5nIHBvaW50OiBvdXIJCSoKLSAqCWNhbGxlciB3aWxsIGVuY29kZSBpdCBmb3IgYSBzcGVjaWZpYyBtYWNoaW5lIGFyY2hpdGVjdHVyZS4JKgotICoJCQkJCQkJCQkqCi0gKglBc3N1bXB0aW9ucwkJCQkJCQkqCi0gKgkJdXNlcyBiYXNlIChyYWRpeCkgMgkJCQkJKgotICoJCXRoaXMgbWFjaGluZSB1c2VzIDIncyBjb21wbGVtZW50IGJpbmFyeSBpbnRlZ2VycwkqCi0gKgkJdGFyZ2V0IGZsb251bXMgdXNlICIgICAgICAiICAgICAgICAgIiAgICAgICAiCQkqCi0gKgkJdGFyZ2V0IGZsb251bXMgZXhwb25lbnRzIGZpdCBpbiBhIGxvbmcJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0KLSAgU3ludGF4OgotCi0gIDxmbG9udW0+IDo6PSA8b3B0aW9uYWwtc2lnbj4gPGRlY2ltYWwtbnVtYmVyPiA8b3B0aW9uYWwtZXhwb25lbnQ+Ci0gIDxvcHRpb25hbC1zaWduPiA6Oj0gJysnIHwgJy0nIHwge2VtcHR5fQotICA8ZGVjaW1hbC1udW1iZXI+IDo6PSA8aW50ZWdlcj4KLSAgfCA8aW50ZWdlcj4gPHJhZGl4LWNoYXJhY3Rlcj4KLSAgfCA8aW50ZWdlcj4gPHJhZGl4LWNoYXJhY3Rlcj4gPGludGVnZXI+Ci0gIHwgPHJhZGl4LWNoYXJhY3Rlcj4gPGludGVnZXI+Ci0KLSAgPG9wdGlvbmFsLWV4cG9uZW50PiA6Oj0ge2VtcHR5fQotICB8IDxleHBvbmVudC1jaGFyYWN0ZXI+IDxvcHRpb25hbC1zaWduPiA8aW50ZWdlcj4KLQotICA8aW50ZWdlcj4gOjo9IDxkaWdpdD4gfCA8ZGlnaXQ+IDxpbnRlZ2VyPgotICA8ZGlnaXQ+IDo6PSAnMCcgfCAnMScgfCAnMicgfCAnMycgfCAnNCcgfCAnNScgfCAnNicgfCAnNycgfCAnOCcgfCAnOScKLSAgPGV4cG9uZW50LWNoYXJhY3Rlcj4gOjo9IHtvbmUgY2hhcmFjdGVyIGZyb20gInN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzIn0KLSAgPHJhZGl4LWNoYXJhY3Rlcj4gOjo9IHtvbmUgY2hhcmFjdGVyIGZyb20gInN0cmluZ19vZl9kZWNpbWFsX21hcmtzIn0KLQotICAqLwotCi1pbnQKLWF0b2ZfZ2VuZXJpYyAoYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciwKLQkgICAgICBzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrcywKLQkgICAgICBzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywKLQkgICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKQotICAgICAvKiByZXR1cm4gcG9pbnRlciB0byBqdXN0IEFGVEVSIG51bWJlciB3ZSByZWFkLiAqLwotICAgICBjaGFyICoqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlcjsKLSAgICAgLyogQXQgbW9zdCBvbmUgcGVyIG51bWJlci4gKi8KLSAgICAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfbWFya3M7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzOwotICAgICBGTE9OVU1fVFlQRSAqYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgbWVhbnMgT0suICovCi0gIGNoYXIgKmZpcnN0X2RpZ2l0OwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbDsKLSAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbDsKLSAgbG9uZyBkZWNpbWFsX2V4cG9uZW50OwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGU7Ci0gIGNoYXIgZGlnaXRzX3NpZ25fY2hhcjsKLQotICAvKgotICAgKiBTY2FuIHRoZSBpbnB1dCBzdHJpbmcsIGFic3RyYWN0aW5nICgxKWRpZ2l0cyAoMilkZWNpbWFsIG1hcmsgKDMpIGV4cG9uZW50LgotICAgKiBJdCB3b3VsZCBiZSBzaW1wbGVyIHRvIG1vZGlmeSB0aGUgc3RyaW5nLCBidXQgd2UgZG9uJ3Q7IGp1c3QgdG8gYmUgbmljZQotICAgKiB0byBjYWxsZXIuCi0gICAqIFdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBkaWdpdHMgd2UgaGF2ZSwgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlIGZvcgotICAgKiB0aGUgZGlnaXRzJyB2YWx1ZS4KLSAgICovCi0KLSAgY2hhciAqcDsKLSAgY2hhciBjOwotICBpbnQgc2Vlbl9zaWduaWZpY2FudF9kaWdpdDsKLQotI2lmZGVmIEFTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UCi0gIGFzc2VydCAoc3RyaW5nX29mX2RlY2ltYWxfbWFya3NbMF0gPT0gJy4nCi0JICAmJiBzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrc1sxXSA9PSAwKTsKLSNkZWZpbmUgSVNfREVDSU1BTF9NQVJLKGMpCSgoYykgPT0gJy4nKQotI2Vsc2UKLSNkZWZpbmUgSVNfREVDSU1BTF9NQVJLKGMpCSgwICE9IHN0cmNociAoc3RyaW5nX29mX2RlY2ltYWxfbWFya3MsIChjKSkpCi0jZW5kaWYKLQotICBmaXJzdF9kaWdpdCA9ICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyOwotICBjID0gKmZpcnN0X2RpZ2l0OwotCi0gIGlmIChjID09ICctJyB8fCBjID09ICcrJykKLSAgICB7Ci0gICAgICBkaWdpdHNfc2lnbl9jaGFyID0gYzsKLSAgICAgIGZpcnN0X2RpZ2l0Kys7Ci0gICAgfQotICBlbHNlCi0gICAgZGlnaXRzX3NpZ25fY2hhciA9ICcrJzsKLQotICBzd2l0Y2ggKGZpcnN0X2RpZ2l0WzBdKQotICAgIHsKLSAgICBjYXNlICduJzoKLSAgICBjYXNlICdOJzoKLSAgICAgIGlmICghc3RybmNhc2VjbXAgKCJuYW4iLCBmaXJzdF9kaWdpdCwgMykpCi0JewotCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9IDA7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5leHBvbmVudCA9IDA7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sZWFkZXIgPQotCSAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sb3c7Ci0JICAqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciA9IGZpcnN0X2RpZ2l0ICsgMzsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6Ci0gICAgY2FzZSAnSSc6Ci0gICAgICBpZiAoIXN0cm5jYXNlY21wICgiaW5mIiwgZmlyc3RfZGlnaXQsIDMpKQotCXsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPQotCSAgICBkaWdpdHNfc2lnbl9jaGFyID09ICcrJyA/ICdQJyA6ICdOJzsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxlYWRlciA9Ci0JICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKLQotCSAgZmlyc3RfZGlnaXQgKz0gMzsKLQkgIGlmICghc3RybmNhc2VjbXAgKCJpbml0eSIsIGZpcnN0X2RpZ2l0LCA1KSkKLQkgICAgZmlyc3RfZGlnaXQgKz0gNTsKLQotCSAgKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIgPSBmaXJzdF9kaWdpdDsKLQotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwgPSAwOwotICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwgPSAwOwotICBkZWNpbWFsX2V4cG9uZW50ID0gMDsKLSAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IDA7Ci0gIGZvciAocCA9IGZpcnN0X2RpZ2l0OwotICAgICAgICgoKGMgPSAqcCkgIT0gJ1wwJykKLQkmJiAoIWMgfHwgIUlTX0RFQ0lNQUxfTUFSSyAoYykpCi0JJiYgKCFjIHx8ICFzdHJjaHIgKHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLCBjKSkpOwotICAgICAgIHArKykKLSAgICB7Ci0gICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCXsKLQkgIGlmIChzZWVuX3NpZ25pZmljYW50X2RpZ2l0IHx8IGMgPiAnMCcpCi0JICAgIHsKLQkgICAgICArK251bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWw7Ci0JICAgICAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpcnN0X2RpZ2l0Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnJlYWs7CQkvKiBwIC0+IGNoYXIgYWZ0ZXIgcHJlLWRlY2ltYWwgZGlnaXRzLiAqLwotCX0KLSAgICB9CQkJCS8qIEZvciBlYWNoIGRpZ2l0IGJlZm9yZSBkZWNpbWFsIG1hcmsuICovCi0KLSNpZm5kZWYgT0xEX0ZMT0FUX1JFQURTCi0gIC8qIElnbm9yZSB0cmFpbGluZyAwJ3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBUaGUgb3JpZ2luYWwgY29kZSBoZXJlCi0gICAqIChpZmRlZidkIG91dCkgZG9lcyBub3QgZG8gdGhpcywgYW5kIG51bWJlcnMgbGlrZQotICAgKgk0LjI5NDk2NzI5NjAwMDAwMDAwMDAwZSswOQkoMioqMzEpCi0gICAqIGNvbWUgb3V0IGluZXhhY3QgZm9yIHNvbWUgcmVhc29uIHJlbGF0ZWQgdG8gbGVuZ3RoIG9mIHRoZSBkaWdpdAotICAgKiBzdHJpbmcuCi0gICAqLwotICBpZiAoYyAmJiBJU19ERUNJTUFMX01BUksgKGMpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB6ZXJvcyA9IDA7CS8qIExlbmd0aCBvZiBjdXJyZW50IHN0cmluZyBvZiB6ZXJvcyAqLwotCi0gICAgICBmb3IgKHArKzsgKGMgPSAqcCkgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpOyBwKyspCi0JewotCSAgaWYgKGMgPT0gJzAnKQotCSAgICB7Ci0JICAgICAgemVyb3MrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsICs9IDEgKyB6ZXJvczsKLQkgICAgICB6ZXJvcyA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2Vsc2UKLSAgaWYgKGMgJiYgSVNfREVDSU1BTF9NQVJLIChjKSkKLSAgICB7Ci0gICAgICBmb3IgKHArKzsKLQkgICAoKChjID0gKnApICE9ICdcMCcpCi0JICAgICYmICghYyB8fCAhc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywgYykpKTsKLQkgICBwKyspCi0JewotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbWF5IGJlIHJldHJhY3RlZCBiZWxvdy4gKi8KLQkgICAgICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwrKzsKLQotCSAgICAgIGlmICggLyogc2Vlbl9zaWduaWZpY2FudF9kaWdpdCB8fCAqLyBjID4gJzAnKQotCQl7Ci0JCSAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IFRSVUU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCFzZWVuX3NpZ25pZmljYW50X2RpZ2l0KQotCQl7Ci0JCSAgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQkJCS8qIEZvciBlYWNoIGRpZ2l0IGFmdGVyIGRlY2ltYWwgbWFyay4gKi8KLSAgICB9Ci0KLSAgd2hpbGUgKG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbAotCSAmJiBmaXJzdF9kaWdpdFtudW1iZXJfb2ZfZGlnaXRzX2JlZm9yZV9kZWNpbWFsCi0JCQkrIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbF0gPT0gJzAnKQotICAgIC0tbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsOwotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKGMgPT0gJ18nKQotCWMgPSAqKytwOwotICAgIH0KLSAgaWYgKGMgJiYgc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywgYykpCi0gICAgewotICAgICAgY2hhciBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyOwotCi0gICAgICBjID0gKisrcDsKLSAgICAgIGlmIChmbGFnX202OGtfbXJpKQotCXsKLQkgIHdoaWxlIChjID09ICdfJykKLQkgICAgYyA9ICorK3A7Ci0JfQotICAgICAgaWYgKGMgJiYgc3RyY2hyICgiKy0iLCBjKSkKLQl7Ci0JICBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyID0gYzsKLQkgIGMgPSAqKytwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyID0gJysnOwotCX0KLQotICAgICAgZm9yICg7IChjKTsgYyA9ICorK3ApCi0JewotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgewotCSAgICAgIGRlY2ltYWxfZXhwb25lbnQgPSBkZWNpbWFsX2V4cG9uZW50ICogMTAgKyBjIC0gJzAnOwotCSAgICAgIC8qCi0JICAgICAgICogQlVHISBJZiB3ZSBvdmVyZmxvdyBoZXJlLCB3ZSBsb3NlIQotCSAgICAgICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXIgPT0gJy0nKQotCXsKLQkgIGRlY2ltYWxfZXhwb25lbnQgPSAtZGVjaW1hbF9leHBvbmVudDsKLQl9Ci0gICAgfQotCi0gICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyID0gcDsKLQotCi0KLSAgbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGUgPQotICAgIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwgKyBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWw7Ci0gIHJldHVybl92YWx1ZSA9IDA7Ci0gIGlmIChudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZSA9PSAwKQotICAgIHsKLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsJLyogTm90IHN0cmljdGx5IG5lY2Vzc2FyeSAqLwotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bGVhZGVyCi0JPSAtMSArIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPSBkaWdpdHNfc2lnbl9jaGFyOwotICAgICAgLyogV2UgaGF2ZSBqdXN0IGNvbmNvY3RlZCAoKy8tKTAuMEUwICovCi0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgY291bnQ7CQkvKiBOdW1iZXIgb2YgdXNlZnVsIGRpZ2l0cyBsZWZ0IHRvIHNjYW4uICovCi0KLSAgICAgIExJVFRMRU5VTV9UWVBFICpkaWdpdHNfYmluYXJ5X2xvdzsKLSAgICAgIHVuc2lnbmVkIGludCBwcmVjaXNpb247Ci0gICAgICB1bnNpZ25lZCBpbnQgbWF4aW11bV91c2VmdWxfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlOwotICAgICAgdW5zaWduZWQgaW50IG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXM7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnM7Ci0gICAgICBGTE9OVU1fVFlQRSBwb3dlcl9vZl8xMF9mbG9udW07Ci0gICAgICBGTE9OVU1fVFlQRSBkaWdpdHNfZmxvbnVtOwotCi0gICAgICBwcmVjaXNpb24gPSAoYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+aGlnaAotCQkgICAtIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdwotCQkgICArIDEpOwkvKiBOdW1iZXIgb2YgZGVzdGluYXRpb24gbGl0dGxlbnVtcy4gKi8KLQotICAgICAgLyogSW5jbHVkZXMgZ3VhcmQgYml0cyAodHdvIGxpdHRsZW51bXMgd29ydGgpICovCi0jaWYgMCAvKiBUaGUgaW50ZWdlciB2ZXJzaW9uIGJlbG93IGlzIHZlcnkgY2xvc2UsIGFuZCBpdCBkb2Vzbid0Ci0JIHJlcXVpcmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCAod2hpY2ggaXMgY3VycmVudGx5IGJ1Z2d5IG9uCi0JIHRoZSBBbHBoYSkuICAqLwotICAgICAgbWF4aW11bV91c2VmdWxfZGlnaXRzID0gKCgoZG91YmxlKSAocHJlY2lzaW9uIC0gMikpCi0JCQkgICAgICAgKiAoKGRvdWJsZSkgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykpCi0JCQkgICAgICAgLyAoTE9HX1RPX0JBU0VfMl9PRl8xMCkpCi0JKyAyOwkJCS8qIDIgOjogZ3VhcmQgZGlnaXRzLiAqLwotI2Vsc2UKLSAgICAgIG1heGltdW1fdXNlZnVsX2RpZ2l0cyA9ICgoKHByZWNpc2lvbiAtIDIpKQotCQkJICAgICAgICogKCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKSkKLQkJCSAgICAgICAqIDEwMDAwMDAgLyAzMzIxOTI4KQotCSsgMjsJCQkvKiAyIDo6IGd1YXJkIGRpZ2l0cy4gKi8KLSNlbmRpZgotCi0gICAgICBpZiAobnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGUgPiBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMpCi0JewotCSAgbnVtYmVyX29mX2RpZ2l0c190b191c2UgPSBtYXhpbXVtX3VzZWZ1bF9kaWdpdHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlID0gbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGU7Ci0JfQotCi0gICAgICAvKiBDYXN0IHRoZXNlIHRvIFNJR05FRCBMT05HIGZpcnN0LCBvdGhlcndpc2UsIG9uIHN5c3RlbXMgd2l0aAotCSBMT05HIHdpZGVyIHRoYW4gSU5UIChzdWNoIGFzIEFscGhhIE9TRi8xKSwgdW5zaWduZWRuZXNzIG1heQotCSBjYXVzZSB1bmV4cGVjdGVkIHJlc3VsdHMuICAqLwotICAgICAgZGVjaW1hbF9leHBvbmVudCArPSAoKGxvbmcpIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwKLQkJCSAgIC0gKGxvbmcpIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlKTsKLQotI2lmIDAKLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzCi0JPSAoKCgoZG91YmxlKSBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSkgKiBMT0dfVE9fQkFTRV8yX09GXzEwKSArIDEpOwotI2Vsc2UKLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzCi0JPSAobnVtYmVyX29mX2RpZ2l0c190b191c2UgKiAzMzIxOTI4IC8gMTAwMDAwMCArIDEpOwotI2VuZGlmCi0KLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzCi0JPSAobW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMKLQkgICAvIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkrIDI7Ci0KLSAgICAgIC8qIENvbXB1dGUgKGRpZ2l0cykgcGFydC4gSW4gIjEyLjM0RTU2IiB0aGlzIGlzIHRoZSAiMTIzNCIgcGFydC4KLQkgQXJpdGhtZXRpYyBpcyBleGFjdCBoZXJlLiBJZiBubyBkaWdpdHMgYXJlIHN1cHBsaWVkIHRoZW4gdGhpcwotCSBwYXJ0IGlzIGEgMCB2YWx1ZWQgYmluYXJ5IGludGVnZXIuICBBbGxvY2F0ZSByb29tIHRvIGJ1aWxkIHVwCi0JIHRoZSBiaW5hcnkgbnVtYmVyIGFzIGxpdHRsZW51bXMuICBXZSB3YW50IHRoaXMgbWVtb3J5IHRvCi0JIGRpc2FwcGVhciB3aGVuIHdlIGxlYXZlIHRoaXMgZnVuY3Rpb24uICBBc3N1bWUgbm8gYWxpZ25tZW50Ci0JIHByb2JsZW1zID0+IChyb29tIGZvciBuIG9iamVjdHMpID09IG4gKiAocm9vbSBmb3IgMQotCSBvYmplY3QpLiAgKi8KLQotICAgICAgc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcyA9IG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzOwotICAgICAgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnMgPSBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zCi0JKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICAgICAgZGlnaXRzX2JpbmFyeV9sb3cgPSAoTElUVExFTlVNX1RZUEUgKikKLQlhbGxvY2EgKHNpemVfb2ZfZGlnaXRzX2luX2NoYXJzKTsKLQotICAgICAgbWVtc2V0ICgoY2hhciAqKSBkaWdpdHNfYmluYXJ5X2xvdywgJ1wwJywgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnMpOwotCi0gICAgICAvKiBEaWdpdHNfYmluYXJ5X2xvd1tdIGlzIGFsbG9jYXRlZCBhbmQgemVyb2VkLiAqLwotCi0gICAgICAvKgotICAgICAgICogUGFyc2UgdGhlIGRlY2ltYWwgZGlnaXRzIGFzIGlmICogZGlnaXRzX2xvdyB3YXMgaW4gdGhlIHVuaXRzIHBvc2l0aW9uLgotICAgICAgICogRW1pdCBhIGJpbmFyeSBudW1iZXIgaW50byBkaWdpdHNfYmluYXJ5X2xvd1tdLgotICAgICAgICoKLSAgICAgICAqIFVzZSBhIGxhcmdlLXByZWNpc2lvbiB2ZXJzaW9uIG9mOgotICAgICAgICogKCgoMXN0LWRpZ2l0KSAqIDEwICsgMm5kLWRpZ2l0KSAqIDEwICsgM3JkLWRpZ2l0IC4uLikgKiAxMCArIGxhc3QtZGlnaXQKLSAgICAgICAqLwotCi0gICAgICBmb3IgKHAgPSBmaXJzdF9kaWdpdCwgY291bnQgPSBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZTsgY291bnQ7IHArKywgLS1jb3VudCkKLQl7Ci0JICBjID0gKnA7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBNdWx0aXBseSBieSAxMC4gQXNzdW1lIGNhbiBuZXZlciBvdmVyZmxvdy4KLQkgICAgICAgKiBBZGQgdGhpcyBkaWdpdCB0byBkaWdpdHNfYmluYXJ5X2xvd1tdLgotCSAgICAgICAqLwotCi0JICAgICAgbG9uZyBjYXJyeTsKLQkgICAgICBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0JICAgICAgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9saW1pdDsKLQotCSAgICAgIGxpdHRsZW51bV9saW1pdCA9IGRpZ2l0c19iaW5hcnlfbG93Ci0JCSsgbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHMKLQkJLSAxOwotCi0JICAgICAgY2FycnkgPSBjIC0gJzAnOwkvKiBjaGFyIC0+IGJpbmFyeSAqLwotCi0JICAgICAgZm9yIChsaXR0bGVudW1fcG9pbnRlciA9IGRpZ2l0c19iaW5hcnlfbG93OwotCQkgICBsaXR0bGVudW1fcG9pbnRlciA8PSBsaXR0bGVudW1fbGltaXQ7Ci0JCSAgIGxpdHRsZW51bV9wb2ludGVyKyspCi0JCXsKLQkJICBsb25nIHdvcms7Ci0KLQkJICB3b3JrID0gY2FycnkgKyAxMCAqIChsb25nKSAoKmxpdHRsZW51bV9wb2ludGVyKTsKLQkJICAqbGl0dGxlbnVtX3BvaW50ZXIgPSB3b3JrICYgTElUVExFTlVNX01BU0s7Ci0JCSAgY2FycnkgPSB3b3JrID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJfQotCi0JICAgICAgaWYgKGNhcnJ5ICE9IDApCi0JCXsKLQkJICAvKgotCQkgICAqIFdlIGhhdmUgYSBHUk9TUyBpbnRlcm5hbCBlcnJvci4KLQkJICAgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0JCSAgICovCi0JCSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICsrY291bnQ7CQkvKiAnLicgZG9lc24ndCBhbHRlciBkaWdpdHMgdXNlZCBjb3VudC4gKi8KLQkgICAgfQotCX0KLQotCi0gICAgICAvKgotICAgICAgICogRGlnaXRzX2JpbmFyeV9sb3dbXSBwcm9wZXJseSBlbmNvZGVzIHRoZSB2YWx1ZSBvZiB0aGUgZGlnaXRzLgotICAgICAgICogRm9yZ2V0IGFib3V0IGFueSBoaWdoLW9yZGVyIGxpdHRsZW51bXMgdGhhdCBhcmUgMC4KLSAgICAgICAqLwotICAgICAgd2hpbGUgKGRpZ2l0c19iaW5hcnlfbG93W3NpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMgLSAxXSA9PSAwCi0JICAgICAmJiBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zID49IDIpCi0Jc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcy0tOwotCi0gICAgICBkaWdpdHNfZmxvbnVtLmxvdyA9IGRpZ2l0c19iaW5hcnlfbG93OwotICAgICAgZGlnaXRzX2Zsb251bS5oaWdoID0gZGlnaXRzX2JpbmFyeV9sb3cgKyBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zIC0gMTsKLSAgICAgIGRpZ2l0c19mbG9udW0ubGVhZGVyID0gZGlnaXRzX2Zsb251bS5oaWdoOwotICAgICAgZGlnaXRzX2Zsb251bS5leHBvbmVudCA9IDA7Ci0gICAgICAvKgotICAgICAgICogVGhlIHZhbHVlIG9mIGRpZ2l0c19mbG9udW0gLiBzaWduIHNob3VsZCBub3QgYmUgaW1wb3J0YW50LgotICAgICAgICogV2UgaGF2ZSBhbHJlYWR5IGRlY2lkZWQgdGhlIG91dHB1dCdzIHNpZ24uCi0gICAgICAgKiBXZSB0cnVzdCB0aGF0IHRoZSBzaWduIHdvbid0IGluZmx1ZW5jZSB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIG51bWJlciEKLSAgICAgICAqIFNvIHdlIGdpdmUgaXQgYSB2YWx1ZSBmb3IgdGhlc2UgcmVhc29uczoKLSAgICAgICAqICgxKSBjb3VydGVzeSB0byBodW1hbnMgcmVhZGluZy9kZWJ1Z2dpbmcKLSAgICAgICAqICAgICB0aGVzZSBudW1iZXJzIHNvIHRoZXkgZG9uJ3QgZ2V0IGV4Y2l0ZWQgYWJvdXQgc3RyYW5nZSB2YWx1ZXMKLSAgICAgICAqICgyKSBpbiBmdXR1cmUgdGhlcmUgbWF5IGJlIG1vcmUgbWVhbmluZyBhdHRhY2hlZCB0byBzaWduLAotICAgICAgICogICAgIGFuZCB3aGF0IHdhcwotICAgICAgICogICAgIGhhcm1sZXNzIG5vaXNlIG1heSBiZWNvbWUgZGlzcnVwdGl2ZSwgaWxsLWNvbmRpdGlvbmVkIChvciB3b3JzZSkKLSAgICAgICAqICAgICBpbnB1dC4KLSAgICAgICAqLwotICAgICAgZGlnaXRzX2Zsb251bS5zaWduID0gJysnOwotCi0gICAgICB7Ci0JLyoKLQkgKiBDb21wdXRlIHRoZSBtYW50c3NhICgmIGV4cG9uZW50KSBvZiB0aGUgcG93ZXIgb2YgMTAuCi0JICogSWYgc3VjZXNzZnVsLCB0aGVuIG11bHRpcGx5IHRoZSBwb3dlciBvZiAxMCBieSB0aGUgZGlnaXRzCi0JICogZ2l2aW5nIHJldHVybl9iaW5hcnlfbWFudGlzc2EgYW5kIHJldHVybl9iaW5hcnlfZXhwb25lbnQuCi0JICovCi0KLQlMSVRUTEVOVU1fVFlQRSAqcG93ZXJfYmluYXJ5X2xvdzsKLQlpbnQgZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZTsKLQkvKiBUaGlzIHJlZmVycyB0byB0aGUgIi01NiIgaW4gIjEyLjM0RS01NiIuICovCi0JLyogRkFMU0U6IGRlY2ltYWxfZXhwb25lbnQgaXMgcG9zaXRpdmUgKG9yIDApICovCi0JLyogVFJVRTogIGRlY2ltYWxfZXhwb25lbnQgaXMgbmVnYXRpdmUgKi8KLQlGTE9OVU1fVFlQRSB0ZW1wb3JhcnlfZmxvbnVtOwotCUxJVFRMRU5VTV9UWVBFICp0ZW1wb3JhcnlfYmluYXJ5X2xvdzsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zOwotCXVuc2lnbmVkIGludCBzaXplX29mX3Bvd2VyX2luX2NoYXJzOwotCi0Jc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zID0gcHJlY2lzaW9uOwotCS8qIFByZWNpc2lvbiBoYXMgYSBidWlsdC1pbiBmdWRnZSBmYWN0b3Igc28gd2UgZ2V0IGEgZmV3IGd1YXJkIGJpdHMuICovCi0KLQlkZWNpbWFsX2V4cG9uZW50X2lzX25lZ2F0aXZlID0gZGVjaW1hbF9leHBvbmVudCA8IDA7Ci0JaWYgKGRlY2ltYWxfZXhwb25lbnRfaXNfbmVnYXRpdmUpCi0JICB7Ci0JICAgIGRlY2ltYWxfZXhwb25lbnQgPSAtZGVjaW1hbF9leHBvbmVudDsKLQkgIH0KLQotCS8qIEZyb20gbm93IG9uOiB0aGUgZGVjaW1hbCBleHBvbmVudCBpcyA+IDAuIEl0cyBzaWduIGlzIHNlcGFyYXRlLiAqLwotCi0Jc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyA9IHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcwotCSAgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSArIDI7Ci0KLQlwb3dlcl9iaW5hcnlfbG93ID0gKExJVFRMRU5VTV9UWVBFICopIGFsbG9jYSAoc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyk7Ci0JdGVtcG9yYXJ5X2JpbmFyeV9sb3cgPSAoTElUVExFTlVNX1RZUEUgKikgYWxsb2NhIChzaXplX29mX3Bvd2VyX2luX2NoYXJzKTsKLQltZW1zZXQgKChjaGFyICopIHBvd2VyX2JpbmFyeV9sb3csICdcMCcsIHNpemVfb2ZfcG93ZXJfaW5fY2hhcnMpOwotCSpwb3dlcl9iaW5hcnlfbG93ID0gMTsKLQlwb3dlcl9vZl8xMF9mbG9udW0uZXhwb25lbnQgPSAwOwotCXBvd2VyX29mXzEwX2Zsb251bS5sb3cgPSBwb3dlcl9iaW5hcnlfbG93OwotCXBvd2VyX29mXzEwX2Zsb251bS5sZWFkZXIgPSBwb3dlcl9iaW5hcnlfbG93OwotCXBvd2VyX29mXzEwX2Zsb251bS5oaWdoID0gcG93ZXJfYmluYXJ5X2xvdyArIHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcyAtIDE7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLnNpZ24gPSAnKyc7Ci0JdGVtcG9yYXJ5X2Zsb251bS5sb3cgPSB0ZW1wb3JhcnlfYmluYXJ5X2xvdzsKLQl0ZW1wb3JhcnlfZmxvbnVtLmhpZ2ggPSB0ZW1wb3JhcnlfYmluYXJ5X2xvdyArIHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcyAtIDE7Ci0JLyoKLQkgKiAocG93ZXIpID09IDEuCi0JICogU3BhY2UgZm9yIHRlbXBvcmFyeV9mbG9udW0gYWxsb2NhdGVkLgotCSAqLwotCi0JLyoKLQkgKiAuLi4KLQkgKgotCSAqIFdISUxFCW1vcmUgYml0cwotCSAqIERPCWZpbmQgbmV4dCBiaXQgKHdpdGggcGxhY2UgdmFsdWUpCi0JICoJbXVsdGlwbHkgaW50byBwb3dlciBtYW50aXNzYQotCSAqIE9ECi0JICovCi0JewotCSAgaW50IHBsYWNlX251bWJlcl9saW1pdDsKLQkgIC8qIEFueSAxMF4oMl5uKSB3aG9zZSAibiIgZXhjZWVkcyB0aGlzICovCi0JICAvKiB2YWx1ZSB3aWxsIGZhbGwgb2ZmIHRoZSBlbmQgb2YgKi8KLQkgIC8qIGZsb251bV9YWFhYX3Bvd2Vyc19vZl90ZW5bXS4gKi8KLQkgIGludCBwbGFjZV9udW1iZXI7Ci0JICBjb25zdCBGTE9OVU1fVFlQRSAqbXVsdGlwbGljYW5kOwkvKiAtPiAxMF4oMl5uKSAqLwotCi0JICBwbGFjZV9udW1iZXJfbGltaXQgPSB0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuOwotCi0JICBtdWx0aXBsaWNhbmQgPSAoZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZQotCQkJICA/IGZsb251bV9uZWdhdGl2ZV9wb3dlcnNfb2ZfdGVuCi0JCQkgIDogZmxvbnVtX3Bvc2l0aXZlX3Bvd2Vyc19vZl90ZW4pOwotCi0JICBmb3IgKHBsYWNlX251bWJlciA9IDE7LyogUGxhY2UgdmFsdWUgb2YgdGhpcyBiaXQgb2YgZXhwb25lbnQuICovCi0JICAgICAgIGRlY2ltYWxfZXhwb25lbnQ7LyogUXVpdCB3aGVuIG5vIG1vcmUgMSBiaXRzIGluIGV4cG9uZW50LiAqLwotCSAgICAgICBkZWNpbWFsX2V4cG9uZW50ID4+PSAxLCBwbGFjZV9udW1iZXIrKykKLQkgICAgewotCSAgICAgIGlmIChkZWNpbWFsX2V4cG9uZW50ICYgMSkKLQkJewotCQkgIGlmIChwbGFjZV9udW1iZXIgPiBwbGFjZV9udW1iZXJfbGltaXQpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBkZWNpbWFsIGV4cG9uZW50IGhhcyBhIG1hZ25pdHVkZSBzbyBncmVhdAotCQkJIHRoYXQgb3VyIHRhYmxlcyBjYW4ndCBoZWxwIHVzIGZyYWdtZW50IGl0LgotCQkJIEFsdGhvdWdoIHRoaXMgcm91dGluZSBpcyBpbiBlcnJvciBiZWNhdXNlIGl0Ci0JCQkgY2FuJ3QgaW1hZ2luZSBhIG51bWJlciB0aGF0IGJpZywgc2lnbmFsIGFuCi0JCQkgZXJyb3IgYXMgaWYgaXQgaXMgdGhlIHVzZXIncyBmYXVsdCBmb3IKLQkJCSBwcmVzZW50aW5nIHN1Y2ggYSBiaWcgbnVtYmVyLiAgKi8KLQkJICAgICAgcmV0dXJuX3ZhbHVlID0gRVJST1JfRVhQT05FTlRfT1ZFUkZMT1c7Ci0JCSAgICAgIC8qIHF1aXQgb3V0IG9mIGxvb3AgZ3JhY2VmdWxseSAqLwotCQkgICAgICBkZWNpbWFsX2V4cG9uZW50ID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0jaWZkZWYgVFJBQ0UKLQkJICAgICAgcHJpbnRmICgiYmVmb3JlIG11bHRpcGx5LCBwbGFjZV9udW1iZXIgPSAlZC4sIHBvd2VyX29mXzEwX2Zsb251bTpcbiIsCi0JCQkgICAgICBwbGFjZV9udW1iZXIpOwotCi0JCSAgICAgIGZsb251bV9wcmludCAoJnBvd2VyX29mXzEwX2Zsb251bSk7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotI2lmZGVmIFRSQUNFCi0JCSAgICAgIHByaW50ZiAoIm11bHRpcGxpZXI6XG4iKTsKLQkJICAgICAgZmxvbnVtX3ByaW50IChtdWx0aXBsaWNhbmQgKyBwbGFjZV9udW1iZXIpOwotCQkgICAgICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0jZW5kaWYKLQkJICAgICAgZmxvbnVtX211bHRpcCAobXVsdGlwbGljYW5kICsgcGxhY2VfbnVtYmVyLAotCQkJCSAgICAgJnBvd2VyX29mXzEwX2Zsb251bSwgJnRlbXBvcmFyeV9mbG9udW0pOwotI2lmZGVmIFRSQUNFCi0JCSAgICAgIHByaW50ZiAoImFmdGVyIG11bHRpcGx5OlxuIik7Ci0JCSAgICAgIGZsb251bV9wcmludCAoJnRlbXBvcmFyeV9mbG9udW0pOwotCQkgICAgICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0jZW5kaWYKLQkJICAgICAgZmxvbnVtX2NvcHkgKCZ0ZW1wb3JhcnlfZmxvbnVtLCAmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLSNpZmRlZiBUUkFDRQotCQkgICAgICBwcmludGYgKCJhZnRlciBjb3B5OlxuIik7Ci0JCSAgICAgIGZsb251bV9wcmludCAoJnBvd2VyX29mXzEwX2Zsb251bSk7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCQkgICAgfSAvKiBJZiB0aGlzIGJpdCBvZiBkZWNpbWFsX2V4cG9uZW50IHdhcyBjb21wdXRhYmxlLiovCi0JCX0gLyogSWYgdGhpcyBiaXQgb2YgZGVjaW1hbF9leHBvbmVudCB3YXMgc2V0LiAqLwotCSAgICB9IC8qIEZvciBlYWNoIGJpdCBvZiBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgZXhwb25lbnQgKi8KLSNpZmRlZiBUUkFDRQotCSAgcHJpbnRmICgiYWZ0ZXIgY29tcHV0aW5nIHBvd2VyX29mXzEwX2Zsb251bTpcbiIpOwotCSAgZmxvbnVtX3ByaW50ICgmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLQkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCX0KLQotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogcG93ZXJfb2ZfMTBfZmxvbnVtIGlzIHBvd2VyIG9mIHRlbiBpbiBiaW5hcnkgKG1hbnRpc3NhKSAsIChleHBvbmVudCkuCi0gICAgICAgKiBJdCBtYXkgYmUgdGhlIG51bWJlciAxLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IE5FRUQgdG8gbXVsdGlwbHkuCi0gICAgICAgKgotICAgICAgICogTXVsdGlwbHkgKGRlY2ltYWwgZGlnaXRzKSBieSBwb3dlcl9vZl8xMF9mbG9udW0uCi0gICAgICAgKi8KLQotICAgICAgZmxvbnVtX211bHRpcCAoJnBvd2VyX29mXzEwX2Zsb251bSwgJmRpZ2l0c19mbG9udW0sIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpOwotICAgICAgLyogQXNzZXJ0IHNpZ24gb2YgdGhlIG51bWJlciB3ZSBtYWRlIGlzICcrJy4gKi8KLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPSBkaWdpdHNfc2lnbl9jaGFyOwotCi0gICAgfQotICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotfQotCi0jaWZkZWYgVFJBQ0UKLXN0YXRpYyB2b2lkCi1mbG9udW1fcHJpbnQgKGYpCi0gICAgIGNvbnN0IEZMT05VTV9UWVBFICpmOwotewotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIGNoYXIgbGl0dGxlbnVtX2Zvcm1hdFsxMF07Ci0gIHNwcmludGYgKGxpdHRsZW51bV9mb3JtYXQsICIgJSUwJWR4Iiwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiAyKTsKLSNkZWZpbmUgcHJpbnRfbGl0dGxlbnVtKExQKQkocHJpbnRmIChsaXR0bGVudW1fZm9ybWF0LCBMUCkpCi0gIHByaW50ZiAoImZsb251bSBAJXAgJWMgZSVsZCIsIGYsIGYtPnNpZ24sIGYtPmV4cG9uZW50KTsKLSAgaWYgKGYtPmxvdyA8IGYtPmhpZ2gpCi0gICAgZm9yIChscCA9IGYtPmhpZ2g7IGxwID49IGYtPmxvdzsgbHAtLSkKLSAgICAgIHByaW50X2xpdHRsZW51bSAoKmxwKTsKLSAgZWxzZQotICAgIGZvciAobHAgPSBmLT5sb3c7IGxwIDw9IGYtPmhpZ2g7IGxwKyspCi0gICAgICBwcmludF9saXR0bGVudW0gKCpscCk7Ci0gIHByaW50ZiAoIlxuIik7Ci0gIGZmbHVzaCAoc3Rkb3V0KTsKLX0KLSNlbmRpZgotCi0vKiBlbmQgb2YgYXRvZl9nZW5lcmljLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9iaWdudW0tY29weS5jIGIvZ2FzL2JpZ251bS1jb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmZjYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL2JpZ251bS1jb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBiaWdudW1fY29weS5jIC0gY29weSBhIGJpZ251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qCi0gKgkJCWJpZ251bV9jb3B5ICgpCi0gKgotICogQ29weSBhIGJpZ251bSBmcm9tIGluIHRvIG91dC4KLSAqIElmIHRoZSBvdXRwdXQgaXMgc2hvcnRlciB0aGFuIHRoZSBpbnB1dCwgY29weSBsb3dlci1vcmRlciBsaXR0bGVudW1zLgotICogUmV0dXJuIDAgb3IgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBsaXR0bGVudW1zIGRyb3BwZWQuCi0gKiBBc3N1bWVzIGxpdHRsZW51bSBhcnJheXMgYXJlIGRlbnNlbHkgcGFja2VkOiBubyB1bnVzZWQgY2hhcnMgYmV0d2VlbgotICogdGhlIGxpdHRsZW51bXMuIFVzZXMgbWVtY3B5KCkgdG8gbW92ZSBsaXR0bGVudW1zLCBhbmQgd2FudHMgdG8KLSAqIGtub3cgbGVuZ3RoIChpbiBjaGFycykgb2YgdGhlIGlucHV0IGJpZ251bS4KLSAqLwotCi0vKiB2b2lkICovCi1pbnQKLWJpZ251bV9jb3B5IChpbiwgaW5fbGVuZ3RoLCBvdXQsIG91dF9sZW5ndGgpCi0gICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICppbjsKLSAgICAgcmVnaXN0ZXIgaW50IGluX2xlbmd0aDsJLyogaW4gc2l6ZW9mKGxpdHRsZW51bSlzICovCi0gICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpvdXQ7Ci0gICAgIHJlZ2lzdGVyIGludCBvdXRfbGVuZ3RoOwkvKiBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KLXsKLSAgaW50IHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZDsKLQotICBpZiAob3V0X2xlbmd0aCA8IGluX2xlbmd0aCkKLSAgICB7Ci0gICAgICBMSVRUTEVOVU1fVFlQRSAqcDsJLyogLT4gbW9zdCBzaWduaWZpY2FudCAobm9uLXplcm8pIGlucHV0Ci0JCQkJICAgICAgbGl0dGxlbnVtLiAqLwotCi0gICAgICBtZW1jcHkgKCh2b2lkICopIG91dCwgKHZvaWQgKikgaW4sCi0JICAgICAgKHVuc2lnbmVkIGludCkgb3V0X2xlbmd0aCA8PCBMSVRUTEVOVU1fU0hJRlQpOwotICAgICAgZm9yIChwID0gaW4gKyBpbl9sZW5ndGggLSAxOyBwID49IGluOyAtLXApCi0JewotCSAgaWYgKCpwKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPSBwIC0gaW4gLSBpbl9sZW5ndGggKyAxOwotCi0gICAgICBpZiAoc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkIDwgMCkKLQl7Ci0JICBzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZW1jcHkgKChjaGFyICopIG91dCwgKGNoYXIgKikgaW4sCi0JICAgICAgKHVuc2lnbmVkIGludCkgaW5fbGVuZ3RoIDw8IExJVFRMRU5VTV9TSElGVCk7Ci0KLSAgICAgIGlmIChvdXRfbGVuZ3RoID4gaW5fbGVuZ3RoKQotCXsKLQkgIG1lbXNldCAoKGNoYXIgKikgKG91dCArIGluX2xlbmd0aCksCi0JCSAgJ1wwJywKLQkJICAodW5zaWduZWQgaW50KSAob3V0X2xlbmd0aCAtIGluX2xlbmd0aCkgPDwgTElUVExFTlVNX1NISUZUKTsKLQl9Ci0KLSAgICAgIHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkKTsKLX0JCQkJLyogYmlnbnVtX2NvcHkoKSAqLwotCi0vKiBlbmQgb2YgYmlnbnVtLWNvcHkuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpZ251bS5oIGIvZ2FzL2JpZ251bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2IyZjE2Li4wMDAwMDAwCi0tLSBhL2dhcy9iaWdudW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGJpZ251bS5oLWFyYml0cmFyeSBwcmVjaXNpb24gaW50ZWdlcnMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCUFyYml0cmFyeS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLgkJCQkqCi0gKglGb3Igc3BlZWQsIHdlIHdvcmsgaW4gZ3JvdXBzIG9mIGJpdHMsIGV2ZW4gdGhvdWdoIHRoaXMJCSoKLSAqCWNvbXBsaWNhdGVzIGFsZ29yaXRobXMuCQkJCQkJKgotICoJRWFjaCBncm91cCBvZiBiaXRzIGlzIGNhbGxlZCBhICdsaXR0bGVudW0nLgkJCSoKLSAqCUEgYnVuY2ggb2YgbGl0dGxlbnVtcyByZXByZXNlbnRpbmcgYSAocG9zc2libHkgbGFyZ2UpCQkqCi0gKglpbnRlZ2VyIGlzIGNhbGxlZCBhICdiaWdudW0nLgkJCQkJKgotICoJQmlnbnVtcyBhcmUgPj0gMC4JCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUJTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCSgxNikKLSNkZWZpbmUJTElUVExFTlVNX1JBRElYCQkJKDEgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotI2RlZmluZQlMSVRUTEVOVU1fTUFTSwkJCSgweEZGRkYpCi0jZGVmaW5lIExJVFRMRU5VTV9TSElGVAkJCSgxKQotI2RlZmluZSBDSEFSU19QRVJfTElUVExFTlVNCQkoMSA8PCBMSVRUTEVOVU1fU0hJRlQpCi0jaWZuZGVmIEJJVFNfUEVSX0NIQVIKLSNkZWZpbmUgQklUU19QRVJfQ0hBUgkJCSg4KQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgTElUVExFTlVNX1RZUEU7Ci0KLS8qIEpGIHRydW5jYXRlZCB0aGlzIHRvIGdldCBhcm91bmQgYSBwcm9ibGVtIHdpdGggR0NDICovCi0jZGVmaW5lCUxPR19UT19CQVNFXzJfT0ZfMTAgKDMuMzIxOTI4MDk0ODg3MzYyMzQ3ODcwMzE5NDI5NDg5MzkwMTc1ODY1MSkKLS8qIFdBUk5JTkc6IEkgaGF2ZW4ndCBjaGVja2VkIHRoYXQgdGhlIHRyYWlsaW5nIGRpZ2l0cyBhcmUgY29ycmVjdCEgKi8KLQotLyogbGVuZ3RocyBhcmUgaW4gc2l6ZW9mKGxpdHRsZW51bSlzICovCi0KLWludCBiaWdudW1fY29weSBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqIGluLCBpbnQgaW5fbGVuZ3RoLAotCQkJIExJVFRMRU5VTV9UWVBFICogb3V0LCBpbnQgb3V0X2xlbmd0aCkpOwotCi0vKiBlbmQgb2YgYmlnbnVtLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9iaXRfZml4LmggYi9nYXMvYml0X2ZpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTcyOWE3Li4wMDAwMDAwCi0tLSBhL2dhcy9iaXRfZml4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiB3cml0ZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgYml0X2ZpeCB3YXMgaW1wbGVtZW50ZWQgdG8gc3VwcG9ydCBtYWNoaW5lcyB0aGF0IG5lZWQgdmFyaWFibGVzCi0gICB0byBiZSBpbnNlcnRlZCBpbiBiaXRmaWVsZHMgb3RoZXIgdGhhbiAxLCAyIGFuZCA0IGJ5dGVzLgotICAgRnVydGhlcm1vcmUgaXQgZ2l2ZXMgdXMgYSBwb3NzaWJpbGxpdHkgdG8gbWFzayBpbiBiaXRzIGluIHRoZSBzeW1ib2wKLSAgIHdoZW4gaXQncyBmaXhlZCBpbiB0aGUgb2JqZWN0Y29kZSBhbmQgY2hlY2sgdGhlIHN5bWJvbHMgbGltaXRzLgotCi0gICBUaGUgb3ItbWFzayBpcyB1c2VkIHRvIHNldCB0aGUgaHVmZm1hbiBiaXRzIGluIGRpc3BsYWNlbWVudHMgZm9yIHRoZQotICAgbnMzMmsgcG9ydC4KLSAgIFRoZSBhY2JpLCBhZGRxaSwgbW92cWksIGNtcHFpIGluc3RydWN0aW9uIHJlcXVpcmVzIGFuIGFzc2VtYmxlciB0aGF0Ci0gICBjYW4gaGFuZGxlIGJpdGZpZWxkcy4gSWUgaGFuZGxlIGFuIGV4cHJlc3Npb24sIGV2YWx1YXRlIGl0IGFuZCBpbnNlcnQKLSAgIHRoZSByZXN1bHQgaW4gYW4gc29tZSBiaXRmaWVsZC4gKCBleDogNSBiaXRzIGluIGEgc2hvcnQgZmllbGQgb2YgYSBvcGNvZGUpCi0gICAqLwotCi0jaWZuZGVmIF9fYml0X2ZpeF9oX18KLSNkZWZpbmUgX19iaXRfZml4X2hfXwotCi1zdHJ1Y3QgYml0X2ZpeAotICB7Ci0gICAgaW50IGZ4X2JpdF9zaXplOwkJLyogTGVuZ3RoIG9mIGJpdGZpZWxkICovCi0gICAgaW50IGZ4X2JpdF9vZmZzZXQ7CQkvKiBCaXQgb2Zmc2V0IHRvIGJpdGZpZWxkICovCi0gICAgbG9uZyBmeF9iaXRfYmFzZTsJCS8qIFdoZXJlIGRvIHdlIGFwcGx5IHRoZSBiaXRmaXguCi0JCQkJICAgICAgSWYgdGhpcyBpcyB6ZXJvLCBkZWZhdWx0IGlzIGFzc3VtZWQuICovCi0gICAgbG9uZyBmeF9iaXRfYmFzZV9hZGo7CS8qIEFkanVzdG1lbnQgb2YgYmFzZSAqLwotICAgIGxvbmcgZnhfYml0X21heDsJCS8qIFNpZ25leHRlbmRlZCBtYXggZm9yIGJpdGZpZWxkICovCi0gICAgbG9uZyBmeF9iaXRfbWluOwkJLyogU2lnbmV4dGVuZGVkIG1pbiBmb3IgYml0ZmllbGQgKi8KLSAgICBsb25nIGZ4X2JpdF9hZGQ7CQkvKiBPciBtYXNrLCB1c2VkIGZvciBodWZmbWFuIHByZWZpeCAqLwotICB9OwotdHlwZWRlZiBzdHJ1Y3QgYml0X2ZpeCBiaXRfZml4UzsKLQotI2VuZGlmIC8qIF9fYml0X2ZpeF9oX18gKi8KLQotLyogZW5kIG9mIGJpdF9maXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NnZW4uYyBiL2dhcy9jZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWUxYjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKiBHQVMgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJjZ2VuLWRlc2MuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIE9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLCBtdXN0IGJlIHNldCBieSBtZF9iZWdpbi4gICovCi0KLUNHRU5fQ1BVX0RFU0MgZ2FzX2NnZW5fY3B1X2Rlc2M7Ci0KLS8qIENhbGxiYWNrIHRvIGluc2VydCBhIHJlZ2lzdGVyIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLSAgIEEgdGFyZ2V0IG1heSBjaG9vc2UgdG8gbGV0IEdBUyBwYXJzZSB0aGUgcmVnaXN0ZXJzLgotICAgPz8/IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXZvaWQKLWNnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAobmFtZSwgbnVtYmVyKQotICAgICBjaGFyICogbmFtZTsKLSAgICAgaW50IG51bWJlcjsKLXsKLSAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaGVyZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCi0gICAgIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChuYW1lLCByZWdfc2VjdGlvbiwKLQkJCQkgICAgICBudW1iZXIsICYgemVyb19hZGRyZXNzX2ZyYWcpKTsKLX0KLQotLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcwotICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCi0gICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuCi0KLSAgIFRoaXMgaXMgdXNlZCBieSBjcHUncyB3aXRoIHNpbXBsZSBvcGVyYW5kcy4gIEl0IGtlZXBzIGtub3dsZWRnZSBvZiB3aGF0Ci0gICBhbiBgZXhwcmVzc2lvblMnIGlzIGFuZCB3aGF0IGEgYGZpeHVwJyBpcyBvdXQgb2YgQ0dFTiB3aGljaCBmb3IgdGhlIHRpbWUKLSAgIGJlaW5nIGlzIHByZWZlcmFibGUuCi0KLSAgIE9QSU5ERVggaXMgdGhlIGluZGV4IGluIHRoZSBvcGVyYW5kIHRhYmxlLgotICAgT1BJTkZPIGlzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGNob29zZXMgdG8gaGVscCBpbiByZWxvYyBkZXRlcm1pbmF0aW9uLiAgKi8KLQotc3RydWN0IGZpeHVwCi17Ci0gIGludCBvcGluZGV4OwotICBpbnQgb3BpbmZvOwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi1zdGF0aWMgc3RydWN0IGZpeHVwIGZpeHVwcyBbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci1zdGF0aWMgaW50IG51bV9maXh1cHM7Ci0KLS8qIFByZXBhcmUgdG8gcGFyc2UgYW4gaW5zdHJ1Y3Rpb24uCi0gICA/Pz8gTWF5IHdpc2ggdG8gbWFrZSB0aGlzIHN0YXRpYyBhbmQgZGVsZXRlIGNhbGxzIGluIG1kX2Fzc2VtYmxlLiAgKi8KLQotdm9pZAotZ2FzX2NnZW5faW5pdF9wYXJzZSAoKQotewotICBudW1fZml4dXBzID0gMDsKLX0KLQotLyogUXVldWUgYSBmaXh1cC4gICovCi0KLXN0YXRpYyB2b2lkCi1xdWV1ZV9maXh1cCAob3BpbmRleCwgb3BpbmZvLCBleHBQKQotICAgICBpbnQgICAgICAgICAgIG9waW5kZXg7Ci0gICAgIGV4cHJlc3Npb25TICogZXhwUDsKLXsKLSAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotICBpZiAobnVtX2ZpeHVwcyA+PSBHQVNfQ0dFTl9NQVhfRklYVVBTKQotICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0gIGZpeHVwc1tudW1fZml4dXBzXS5leHAgICAgID0gKiBleHBQOwotICBmaXh1cHNbbnVtX2ZpeHVwc10ub3BpbmRleCA9IG9waW5kZXg7Ci0gIGZpeHVwc1tudW1fZml4dXBzXS5vcGluZm8gID0gb3BpbmZvOwotICArKyBudW1fZml4dXBzOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhbGxvdyBhIGJhY2t1cCBvZiB0aGUgZml4dXAgY2hhaW4gdG8gYmUgbWFkZSwKLSAgIGFuZCB0byBoYXZlIHRoaXMgYmFja3VwIGJlIHN3YXBwZWQgd2l0aCB0aGUgY3VycmVudCBjaGFpbi4gIFRoaXMgYWxsb3dzCi0gICBjZXJ0YWluIHBvcnRzLCBlZyB0aGUgbTMyciwgdG8gc3dhcCB0d28gaW5zdHJ1Y3Rpb25zIGFuZCBzd2FwIHRoZWlyIGZpeHVwcwotICAgYXQgdGhlIHNhbWUgdGltZS4gICovCi0vKiA/Pz8gSSB0aGluayB3aXRoIGNnZW5fYXNtX2ZpbmlzaF9pbnNuIChvciBzb21ldGhpbmcgZWxzZSkgdGhlcmUgaXMgbm8KLSAgIG1vcmUgbmVlZCBmb3IgdGhpcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZml4dXAgc2F2ZWRfZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKLXN0YXRpYyBpbnQgc2F2ZWRfbnVtX2ZpeHVwczsKLQotdm9pZAotZ2FzX2NnZW5fc2F2ZV9maXh1cHMgKCkKLXsKLSAgc2F2ZWRfbnVtX2ZpeHVwcyA9IG51bV9maXh1cHM7Ci0gIAotICBtZW1jcHkgKHNhdmVkX2ZpeHVwcywgZml4dXBzLCBzaXplb2YgKGZpeHVwc1swXSkgKiBudW1fZml4dXBzKTsKLQotICBudW1fZml4dXBzID0gMDsKLX0KLQotdm9pZAotZ2FzX2NnZW5fcmVzdG9yZV9maXh1cHMgKCkKLXsKLSAgbnVtX2ZpeHVwcyA9IHNhdmVkX251bV9maXh1cHM7Ci0gIAotICBtZW1jcHkgKGZpeHVwcywgc2F2ZWRfZml4dXBzLCBzaXplb2YgKGZpeHVwc1swXSkgKiBudW1fZml4dXBzKTsKLQotICBzYXZlZF9udW1fZml4dXBzID0gMDsKLX0KLQotdm9pZAotZ2FzX2NnZW5fc3dhcF9maXh1cHMgKCkKLXsKLSAgaW50IHRtcDsKLSAgc3RydWN0IGZpeHVwIHRtcF9maXh1cDsKLQotICBpZiAobnVtX2ZpeHVwcyA9PSAwKQotICAgIHsKLSAgICAgIGdhc19jZ2VuX3Jlc3RvcmVfZml4dXBzICgpOwotICAgIH0KLSAgZWxzZSBpZiAoc2F2ZWRfbnVtX2ZpeHVwcyA9PSAwKQotICAgIHsKLSAgICAgIGdhc19jZ2VuX3NhdmVfZml4dXBzICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9IHNhdmVkX251bV9maXh1cHM7Ci0gICAgICBzYXZlZF9udW1fZml4dXBzID0gbnVtX2ZpeHVwczsKLSAgICAgIG51bV9maXh1cHMgPSB0bXA7Ci0gICAgICAKLSAgICAgIGZvciAodG1wID0gR0FTX0NHRU5fTUFYX0ZJWFVQUzsgdG1wLS07KQotCXsKLQkgIHRtcF9maXh1cCAgICAgICAgICA9IHNhdmVkX2ZpeHVwcyBbdG1wXTsKLQkgIHNhdmVkX2ZpeHVwcyBbdG1wXSA9IGZpeHVwcyBbdG1wXTsKLQkgIGZpeHVwcyBbdG1wXSAgICAgICA9IHRtcF9maXh1cDsKLQl9Ci0gICAgfQotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gcmVjb3JkIGEgZml4dXAuCi0gICBUaGlzIGlzIGEgY292ZXIgZnVuY3Rpb24gdG8gZml4X25ldy4KLSAgIEl0IGV4aXN0cyBiZWNhdXNlIHdlIHJlY29yZCBJTlNOIHdpdGggdGhlIGZpeHVwLgotCi0gICBGUkFHIGFuZCBXSEVSRSBhcmUgdGhlaXIgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdG8gZml4X25ld19leHAuCi0gICBMRU5HVEggaXMgaW4gYml0cy4KLSAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KLQotICAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZvcgotICAgb3BlcmFuZHMgcmVzaWRpbmcgaW4gdGhlIGluc24sIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotICAgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkgaGFuZGxlIGZpeHVwcyBmb3IgYW55Ci0gICBvcGVyYW5kIHR5cGUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4gbWRfYXBwbHlfZml4LiAgKi8KLQotZml4UyAqCi1nYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWcsIHdoZXJlLCBpbnNuLCBsZW5ndGgsIG9wZXJhbmQsIG9waW5mbywgc3ltYm9sLCBvZmZzZXQpCi0gICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOwotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKLSAgICAgc3ltYm9sUyAqICAgICAgICAgICAgc3ltYm9sOwotICAgICBvZmZzZXRUICAgICAgICAgICAgICBvZmZzZXQ7Ci17Ci0gIGZpeFMgKiBmaXhQOwotCi0gIC8qIEl0IG1heSBzZWVtIHN0cmFuZ2UgdG8gdXNlIG9wZXJhbmQtPmF0dHJzIGFuZCBub3QgaW5zbi0+YXR0cnMgaGVyZSwKLSAgICAgYnV0IGl0IGlzIHRoZSBvcGVyYW5kIHRoYXQgaGFzIGEgcGMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0KLSAgZml4UCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBsZW5ndGggLyA4LCBzeW1ib2wsIG9mZnNldCwKLQkJICBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAob3BlcmFuZCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLAotCQkgIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpCi0JCSAgICAoKGludCkgQkZEX1JFTE9DX1VOVVNFRAotCQkgICAgICsgKGludCkgb3BlcmFuZC0+dHlwZSkpOwotICBmaXhQLT5meF9jZ2VuLmluc24gPSBpbnNuOwotICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IG9waW5mbzsKLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGdpdmVuIGFuIGV4cHJlc3Npb24uCi0gICBUaGlzIGlzIGEgY292ZXIgZnVuY3Rpb24gdG8gZml4X25ld19leHAuCi0gICBJdCBleGlzdHMgYmVjYXVzZSB3ZSByZWNvcmQgSU5TTiB3aXRoIHRoZSBmaXh1cC4KLQotICAgRlJBRyBhbmQgV0hFUkUgYXJlIHRoZWlyIHJlc3BlY3RpdmUgYXJndW1lbnRzIHRvIGZpeF9uZXdfZXhwLgotICAgTEVOR1RIIGlzIGluIGJpdHMuCi0gICBPUElORk8gaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIgY2hvb3NlcyB0byBoZWxwIGluIHJlbG9jIGRldGVybWluYXRpb24uCi0KLSAgIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmb3IKLSAgIG9wZXJhbmRzIHJlc2lkaW5nIGluIHRoZSBpbnNuLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLSAgIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5IGhhbmRsZSBmaXh1cHMgZm9yIGFueQotICAgb3BlcmFuZCB0eXBlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluIG1kX2FwcGx5X2ZpeC4gICovCi0KLWZpeFMgKgotZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCAoZnJhZywgd2hlcmUsIGluc24sIGxlbmd0aCwgb3BlcmFuZCwgb3BpbmZvLCBleHApCi0gICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOwotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKLSAgICAgZXhwcmVzc2lvblMgKiAgICAgICAgZXhwOwotewotICBmaXhTICogZml4UDsKLQotICAvKiBJdCBtYXkgc2VlbSBzdHJhbmdlIHRvIHVzZSBvcGVyYW5kLT5hdHRycyBhbmQgbm90IGluc24tPmF0dHJzIGhlcmUsCi0gICAgIGJ1dCBpdCBpcyB0aGUgb3BlcmFuZCB0aGF0IGhhcyBhIHBjIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotCi0gIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIGxlbmd0aCAvIDgsIGV4cCwKLQkJICAgICAgQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKG9wZXJhbmQsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwKLQkJICAgICAgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKLQkJICAgICAgICAoKGludCkgQkZEX1JFTE9DX1VOVVNFRAotCQkJICsgKGludCkgb3BlcmFuZC0+dHlwZSkpOwotICBmaXhQLT5meF9jZ2VuLmluc24gPSBpbnNuOwotICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IG9waW5mbzsKLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogVXNlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBuZXh0IHR3byBwcm9jZWR1cmVzLiAgKi8KLXN0YXRpYyBqbXBfYnVmIGV4cHJfam1wX2J1ZjsKLQotLyogQ2FsbGJhY2sgZm9yIGNnZW4gaW50ZXJmYWNlLiAgUGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgKlNUUlAuCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBmb3Igc3VjY2VzcyAoaW4gd2hpY2ggY2FzZQotICAgKlNUUlAgaXMgYWR2YW5jZWQgcGFzdCB0aGUgcGFyc2VkIHRleHQpLgotICAgV0FOVCBpcyBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgdGhlIGNhbGxlciBpcyBsb29raW5nIGZvci4KLSAgIElmIFdBTlQgPT0gQ0dFTl9BU01fUEFSU0VfSU5JVCB0aGUgY2FsbGVyIGlzIGJlZ2lubmluZyB0byB0cnkgdG8gbWF0Y2gKLSAgIGEgdGFibGUgZW50cnkgd2l0aCB0aGUgaW5zbiwgcmVzZXQgdGhlIHF1ZXVlZCBmaXh1cHMgY291bnRlci4KLSAgIEFuIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCBpcyBzdG9yZWQgaW4gUkVTVUxUUC4KLSAgIE9QSU5ERVggaXMgdGhlIG9wZXJhbmQncyB0YWJsZSBlbnRyeSBpbmRleC4KLSAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KLSAgIFRoZSByZXN1bHRpbmcgdmFsdWUgaXMgc3RvcmVkIGluIFZBTFVFUC4gICovCi0KLWNvbnN0IGNoYXIgKgotZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIHdhbnQsIHN0clAsIG9waW5kZXgsIG9waW5mbywgcmVzdWx0UCwgdmFsdWVQKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlIHdhbnQ7Ci0gICAgIGNvbnN0IGNoYXIgKiogc3RyUDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGludCBvcGluZm87Ci0gICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqIHJlc3VsdFA7Ci0gICAgIGJmZF92bWEgKiB2YWx1ZVA7Ci17Ci0jaWZkZWYgX19TVERDX18KLSAgLyogVGhlc2UgYXJlIHZvbGF0aWxlIHRvIHN1cnZpdmUgdGhlIHNldGptcC4gICovCi0gIGNoYXIgKiB2b2xhdGlsZSBob2xkOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiB2b2xhdGlsZSByZXN1bHRQXzE7Ci0jZWxzZQotICBzdGF0aWMgY2hhciAqIGhvbGQ7Ci0gIHN0YXRpYyBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiByZXN1bHRQXzE7Ci0jZW5kaWYKLSAgY29uc3QgY2hhciAqIGVycm1zZyA9IE5VTEw7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBpZiAod2FudCA9PSBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVCkKLSAgICB7Ci0gICAgICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJlc3VsdFBfMSA9IHJlc3VsdFA7Ci0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IChjaGFyICopICogc3RyUDsKLQotICAvKiBXZSByZWx5IG9uIG1kX29wZXJhbmQgdG8gbG9uZ2ptcCBiYWNrIHRvIHVzLgotICAgICBUaGlzIGlzIGRvbmUgdmlhIGdhc19jZ2VuX21kX29wZXJhbmQuICAqLwotICBpZiAoc2V0am1wIChleHByX2ptcF9idWYpICE9IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKGNoYXIgKikgaG9sZDsKLSAgICAgICogcmVzdWx0UF8xID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUjsKLSAgICAgIHJldHVybiAiaWxsZWdhbCBvcGVyYW5kIjsKLSAgICB9Ci0KLSAgZXhwcmVzc2lvbiAoJiBleHApOwotCi0gICogc3RyUCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotICAvKiBGSVhNRTogTmVlZCB0byBjaGVjayBgd2FudCcuICAqLwotCi0gIHN3aXRjaCAoZXhwLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsIDoKLSAgICAgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotICAgICAgKiByZXN1bHRQID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19hYnNlbnQgOgotICAgICAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0gICAgICAqIHJlc3VsdFAgPSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2NvbnN0YW50IDoKLSAgICAgICogdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3JlZ2lzdGVyIDoKLSAgICAgICogdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUkVHSVNURVI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIHF1ZXVlX2ZpeHVwIChvcGluZGV4LCBvcGluZm8sICYgZXhwKTsKLSAgICAgICogdmFsdWVQID0gMDsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUVVFVUVEOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIG1kX29wZXJhbmQgaGFuZGxlciB0byBjYXRjaCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbnMgYW5kIGhhbHQgdGhlCi0gICBwYXJzaW5nIHByb2Nlc3Mgc28gdGhlIG5leHQgZW50cnkgY2FuIGJlIHRyaWVkLgotCi0gICA/Pz8gVGhpcyBjb3VsZCBiZSBkb25lIGRpZmZlcmVudGx5IGJ5IGFkZGluZyBjb2RlIHRvIGBleHByZXNzaW9uJy4gICovCi0KLXZvaWQKLWdhc19jZ2VuX21kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBsb25nam1wIChleHByX2ptcF9idWYsIDEpOwotfQotCi0vKiBGaW5pc2ggYXNzZW1ibGluZyBpbnN0cnVjdGlvbiBJTlNOLgotICAgQlVGIGNvbnRhaW5zIHdoYXQgd2UndmUgYnVpbHQgdXAgc28gZmFyLgotICAgTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0gICBSRUxBWF9QIGlzIG5vbi16ZXJvIGlmIHJlbGF4YWJsZSBpbnNucyBzaG91bGQgYmUgZW1pdHRlZCBhcyBzdWNoLgotICAgT3RoZXJ3aXNlIHRoZXkncmUgZW1pdHRlZCBpbiBub24tcmVsYXhhYmxlIGZvcm1zLgotICAgVGhlICJyZXN1bHQiIGlzIHN0b3JlZCBpbiBSRVNVTFQgaWYgbm9uLU5VTEwuICAqLwotCi12b2lkCi1nYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbiwgYnVmLCBsZW5ndGgsIHJlbGF4X3AsIHJlc3VsdCkKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gICAgIGludCByZWxheF9wOwotICAgICBmaW5pc2hlZF9pbnNuUyAqIHJlc3VsdDsKLXsKLSAgaW50IGk7Ci0gIGludCByZWxheF9vcGVyYW5kOwotICBjaGFyICogZjsKLSAgdW5zaWduZWQgaW50IGJ5dGVfbGVuID0gbGVuZ3RoIC8gODsKLQotICAvKiA/Pz8gVGFyZ2V0IGZvbyBpc3N1ZXMgdmFyaW91cyB3YXJuaW5ncyBoZXJlLCBzbyBvbmUgbWlnaHQgd2FudCB0byBwcm92aWRlCi0gICAgIGEgaG9vayBoZXJlLiAgSG93ZXZlciwgb3VyIGNhbGxlciBpcyBkZWZpbmVkIGluIHRjLWZvby5jIHNvIHRoZXJlCi0gICAgIHNob3VsZG4ndCBiZSBhIG5lZWQgZm9yIGEgaG9vay4gICovCi0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgSXQgaXMgaW1wb3J0YW50IHRvIGZldGNoIGVub3VnaCBzcGFjZSBpbiBvbmUgY2FsbCB0byBgZnJhZ19tb3JlJy4KLSAgICAgV2UgdXNlIChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpIHRvIGNvbXB1dGUgd2hlcmUgd2UgYXJlIGFuZCB3ZQotICAgICBkb24ndCB3YW50IGZyYWdfbm93IHRvIGNoYW5nZSBiZXR3ZWVuIGNhbGxzLgotCi0gICAgIFJlbGF4YWJsZSBpbnN0cnVjdGlvbnM6IFdlIG5lZWQgdG8gZW5zdXJlIHdlIGFsbG9jYXRlIGVub3VnaAotICAgICBzcGFjZSBmb3IgdGhlIGxhcmdlc3QgaW5zbi4gICovCi0KLSAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpKQotICAgIGFib3J0ICgpOyAvKiBUaGVzZSBjdXJyZW50bHkgc2hvdWxkbid0IGdldCBoZXJlLiAgKi8KLQotICAvKiBJcyB0aGVyZSBhIHJlbGF4YWJsZSBpbnNuIHdpdGggdGhlIHJlbGF4YWJsZSBvcGVyYW5kIG5lZWRpbmcgYSBmaXh1cD8gICovCi0KLSAgcmVsYXhfb3BlcmFuZCA9IC0xOwotICBpZiAocmVsYXhfcCAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkpCi0gICAgewotICAgICAgLyogU2NhbiB0aGUgZml4dXBzIGZvciB0aGUgb3BlcmFuZCBhZmZlY3RlZCBieSByZWxheGluZwotCSAoaS5lLiB0aGUgYnJhbmNoIGFkZHJlc3MpLiAgKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9maXh1cHM7ICsrIGkpCi0JewotCSAgaWYgKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGZpeHVwc1tpXS5vcGluZGV4KSwKLQkJCQkgICAgICAgQ0dFTl9PUEVSQU5EX1JFTEFYKSkKLQkgICAgewotCSAgICAgIHJlbGF4X29wZXJhbmQgPSBpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocmVsYXhfb3BlcmFuZCAhPSAtMSkKLSAgICB7Ci0gICAgICBpbnQgbWF4X2xlbjsKLSAgICAgIGZyYWdTICogb2xkX2ZyYWc7Ci0KLSNpZmRlZiBUQ19DR0VOX01BWF9SRUxBWAotICAgICAgbWF4X2xlbiA9IFRDX0NHRU5fTUFYX1JFTEFYIChpbnNuLCBieXRlX2xlbik7Ci0jZWxzZQotICAgICAgbWF4X2xlbiA9IENHRU5fTUFYX0lOU05fU0laRTsKLSNlbmRpZgotICAgICAgLyogRW5zdXJlIHZhcmlhYmxlIHBhcnQgYW5kIGZpeGVkIHBhcnQgYXJlIGluIHNhbWUgZnJhZ21lbnQuICAqLwotICAgICAgLyogRklYTUU6IEhhdmluZyB0byBkbyB0aGlzIHNlZW1zIGxpa2UgYSBoYWNrLiAgKi8KLSAgICAgIGZyYWdfZ3JvdyAobWF4X2xlbik7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZml4ZWQgcGFydC4gICovCi0gICAgICBmID0gZnJhZ19tb3JlIChieXRlX2xlbik7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIHJlbGF4YWJsZSBmcmFnbWVudCBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgICBvbGRfZnJhZyA9IGZyYWdfbm93OwotCi0gICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCW1heF9sZW4gLSBieXRlX2xlbiAvKiBtYXggY2hhcnMgKi8sCi0JCTAgLyogdmFyaWFibGUgcGFydCBhbHJlYWR5IGFsbG9jYXRlZCAqLywKLQkJLyogRklYTUU6IFdoZW4gd2UgbWFjaGluZSBnZW5lcmF0ZSB0aGUgcmVsYXggdGFibGUsCi0JCSAgIG1hY2hpbmUgZ2VuZXJhdGUgYSBtYWNybyB0byBjb21wdXRlIHN1YnR5cGUuICAqLwotCQkxIC8qIHN1YnR5cGUgKi8sCi0JCWZpeHVwc1tyZWxheF9vcGVyYW5kXS5leHAuWF9hZGRfc3ltYm9sLAotCQlmaXh1cHNbcmVsYXhfb3BlcmFuZF0uZXhwLlhfYWRkX251bWJlciwKLQkJZik7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgb3BlcmFuZCBudW1iZXIgd2l0aCB0aGUgZnJhZ21lbnQgc28gbWRfY29udmVydF9mcmFnCi0JIGNhbiB1c2UgZ2FzX2NnZW5fbWRfcmVjb3JkX2ZpeHVwIHRvIHJlY29yZCB0aGUgYXBwcm9wcmlhdGUgcmVsb2MuICAqLwotICAgICAgb2xkX2ZyYWctPmZyX2NnZW4uaW5zbiAgICA9IGluc247Ci0gICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5vcGluZGV4ID0gZml4dXBzW3JlbGF4X29wZXJhbmRdLm9waW5kZXg7Ci0gICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5vcGluZm8gID0gZml4dXBzW3JlbGF4X29wZXJhbmRdLm9waW5mbzsKLSAgICAgIGlmIChyZXN1bHQpCi0JcmVzdWx0LT5mcmFnID0gb2xkX2ZyYWc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZiA9IGZyYWdfbW9yZSAoYnl0ZV9sZW4pOwotICAgICAgaWYgKHJlc3VsdCkKLQlyZXN1bHQtPmZyYWcgPSBmcmFnX25vdzsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKLSAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbm93LiAgKi8KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGYsIGxlbmd0aCwgKmJ1Zik7Ci0jZWxzZQotICBtZW1jcHkgKGYsIGJ1ZiwgYnl0ZV9sZW4pOwotI2VuZGlmCi0KLSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZpeHVwczsgKytpKQotICAgIHsKLSAgICAgIGZpeFMgKmZpeFA7Ci0gICAgICBjb25zdCBDR0VOX09QRVJBTkQgKm9wZXJhbmQgPQotCWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywgZml4dXBzW2ldLm9waW5kZXgpOwotCi0gICAgICAvKiBEb24ndCBjcmVhdGUgZml4dXBzIGZvciB0aGVzZS4gIFRoYXQncyBkb25lIGR1cmluZyByZWxheGF0aW9uLgotCSBXZSBkb24ndCBuZWVkIHRvIHRlc3QgZm9yIENHRU5fSU5TTl9SRUxBWCBhcyB0aGV5IGNhbid0IGdldCBoZXJlCi0JIChzZWUgYWJvdmUpLiAgKi8KLSAgICAgIGlmIChyZWxheF9wCi0JICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkKLQkgICYmIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChvcGVyYW5kLCBDR0VOX09QRVJBTkRfUkVMQVgpKQotCWNvbnRpbnVlOwotCi0jaWZuZGVmIG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotI2RlZmluZSBtZF9jZ2VuX3JlY29yZF9maXh1cF9leHAgZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotI2VuZGlmCi0KLQlmaXhQID0gbWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCQkgaW5zbiwgbGVuZ3RoLCBvcGVyYW5kLAotCQkJCQkgZml4dXBzW2ldLm9waW5mbywKLQkJCQkJICYgZml4dXBzW2ldLmV4cCk7Ci0JaWYgKHJlc3VsdCkKLQkgIHJlc3VsdC0+Zml4dXBzW2ldID0gZml4UDsKLSAgICB9Ci0KLSAgaWYgKHJlc3VsdCkKLSAgICB7Ci0gICAgICByZXN1bHQtPm51bV9maXh1cHMgPSBudW1fZml4dXBzOwotICAgICAgcmVzdWx0LT5hZGRyID0gZjsKLSAgICB9Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBjb2RlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIGZpeHVwcyB3ZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gZml4X25ld19leHAsIGFib3ZlLiAgSW4gdGhlIGNhbGwKLSAgIGFib3ZlIHdlIHVzZWQgYSByZWxvYyBjb2RlIHdoaWNoIHdhcyB0aGUgbGFyZ2VzdCBsZWdhbCByZWxvYyBjb2RlCi0gICBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgSGVyZSB3ZSB1bmRvIHRoYXQgdG8gcmVjb3ZlciB0aGUgb3BlcmFuZAotICAgaW5kZXguICBBdCB0aGlzIHBvaW50IGFsbCBzeW1ib2wgdmFsdWVzIHNob3VsZCBiZSBmdWxseSByZXNvbHZlZCwKLSAgIGFuZCB3ZSBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGUgcmVsb2MuICBJZiB3ZSBjYW4gbm90IGRvCi0gICB0aGF0LCB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVsb2MgY29kZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIGZpeHVwLiAgKi8KLQotLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzb21lIG9mIHRoZSBmaXh1cHMgYW5kIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSAgIGhhbmRsZXMgdGhlIHJlc3QuICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChvciBzb21lIG90aGVyIGJmZCBmdW5jdGlvbikKLSAgIHNob3VsZCBoYW5kbGUgdGhlbSBhbGwuICAqLwotCi1pbnQKLWdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHVlUCwgc2VnKQotICAgICBmaXhTICogICBmaXhQOwotICAgICB2YWx1ZVQgKiB2YWx1ZVA7Ci0gICAgIHNlZ1QgICAgIHNlZzsKLXsKLSAgY2hhciAqIHdoZXJlID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICB2YWx1ZVQgdmFsdWU7Ci0gIC8qIGNhbm9uaWNhbCBuYW1lLCBzaW5jZSB1c2VkIGEgbG90ICovCi0gIENHRU5fQ1BVX0RFU0MgY2QgPSBnYXNfY2dlbl9jcHVfZGVzYzsKLSAgCi0gIC8qIEZJWE1FIEZJWE1FIEZJWE1FOiBUaGUgdmFsdWUgd2UgYXJlIHBhc3NlZCBpbiAqdmFsdWVwIGluY2x1ZGVzCi0gICAgIHRoZSBzeW1ib2wgdmFsdWVzLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEJGRF9BU1NFTUJMRVIsIGlmIHdlIGFyZQotICAgICBkb2luZyB0aGlzIHJlbG9jYXRpb24gdGhlIGNvZGUgaW4gd3JpdGUuYyBpcyBnb2luZyB0byBjYWxsCi0gICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24sIHdoaWNoIGlzIGFsc28gZ29pbmcgdG8gdXNlIHRoZSBzeW1ib2wKLSAgICAgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIHJlbG9jIGlzIGZ1bGx5IHJlc29sdmVkIHdlIHdhbnQgdG8KLSAgICAgdXNlICp2YWx1ZXAgc2luY2UgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBpcyBub3QgYmVpbmcgdXNlZC4KLSAgICAgSG93ZXZlciwgaWYgdGhlIHJlbG9jIGlzIG5vdCBmdWxseSByZXNvbHZlZCB3ZSBkbyBub3Qgd2FudCB0byB1c2UKLSAgICAgKnZhbHVlcCwgYW5kIG11c3QgdXNlIGZ4X29mZnNldCBpbnN0ZWFkLiAgSG93ZXZlciwgaWYgdGhlIHJlbG9jCi0gICAgIGlzIFBDIHJlbGF0aXZlLCB3ZSBkbyB3YW50IHRvIHVzZSAqdmFsdWVwIHNpbmNlIGl0IGluY2x1ZGVzIHRoZQotICAgICByZXN1bHQgb2YgbWRfcGNyZWxfZnJvbS4gIFRoaXMgaXMgY29uZnVzaW5nLiAgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVQOwotICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVQOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4UC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLSAJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICgoaW50KSBmaXhQLT5meF9yX3R5cGUgPj0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpbnQgb3BpbmRleCA9IChpbnQpIGZpeFAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBjb25zdCBDR0VOX09QRVJBTkQgKm9wZXJhbmQgPSBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoY2QsIG9waW5kZXgpOwotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7Ci0gICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzID0gYWxsb2NhIChDR0VOX0NQVV9TSVpFT0ZfRklFTERTIChjZCkpOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gZml4UC0+ZnhfY2dlbi5pbnNuOwotCi0gICAgICAvKiBJZiB0aGUgcmVsb2MgaGFzIGJlZW4gZnVsbHkgcmVzb2x2ZWQgZmluaXNoIHRoZSBvcGVyYW5kIGhlcmUuICAqLwotICAgICAgLyogRklYTUU6IFRoaXMgZHVwbGljYXRlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGNvZGUgaW4gQkZELiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lCi0JICAvKiBGSVhNRTogSWYgcGFydGlhbF9pbnBsYWNlIGlzbid0IHNldCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdvbid0Ci0JICAgICBmaW5pc2ggdGhlIGpvYi4gIFRlc3RpbmcgZm9yIHBjcmVsIGlzIGEgdGVtcG9yYXJ5IGhhY2suICAqLwotCSAgfHwgZml4UC0+ZnhfcGNyZWwpCi0JewotCSAgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFIChjZCkgKGZpZWxkcywgQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pKTsKLQkgIENHRU5fQ1BVX1NFVF9WTUFfT1BFUkFORCAoY2QpIChjZCwgb3BpbmRleCwgZmllbGRzLCAoYmZkX3ZtYSkgdmFsdWUpOwotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0JICB7Ci0JICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZSA9Ci0JICAgICAgY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIHdoZXJlLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbikpOwotCi0JICAgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotCSAgICBlcnJtc2cgPSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORCAoY2QpIChjZCwgb3BpbmRleCwgZmllbGRzLAotCQkJCQkJICAgJmluc25fdmFsdWUsIChiZmRfdm1hKSAwKTsKLQkgICAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIHdoZXJlLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbiksCi0JCQkJIGluc25fdmFsdWUpOwotCSAgfQotI2Vsc2UKLQkgICAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JICAgIGVycm1zZyA9IENHRU5fQ1BVX0lOU0VSVF9PUEVSQU5EIChjZCkgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHdoZXJlLAotCQkJCQkJICAgKGJmZF92bWEpIDApOwotI2VuZGlmCi0JICBpZiAoZXJybXNnKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsICIlcyIsIGVycm1zZyk7Ci0JfQotCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQlyZXR1cm4gMTsKLQotICAgICAgLyogVGhlIG9wZXJhbmQgaXNuJ3QgZnVsbHkgcmVzb2x2ZWQuICBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUKLQkgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24gYW5kIGxlYXZlIGl0IHRvCi0JIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHdvcmsgd2hlbgotCSBwYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UuICAqLwotCi0gICAgICByZWxvY190eXBlID0gbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApOwotICAgICAgaWYgKHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0JewotCSAgZml4UC0+Znhfcl90eXBlID0gcmVsb2NfdHlwZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+ZnhfZG9uZSkKLSAgICB7Ci0gICAgICAvKiBXZSdyZSBmaW5pc2hlZCB3aXRoIHRoaXMgZml4dXAuICBJbnN0YWxsIGl0IGJlY2F1c2UKLQkgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3b24ndCBiZSBjYWxsZWQgdG8gZG8gaXQuICAqLwotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCB2YWx1ZSwgMSk7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIHZhbHVlLCAyKTsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzMyOgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0JLyogRklYTUU6IGxhdGVyIGFkZCBzdXBwb3J0IGZvciA2NCBiaXRzLiAgKi8KLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGluc3RhbGwgZml4IGZvciByZWxvYyB0eXBlICVkIChgJXMnKSIpLAotCQkJZml4UC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBmaW5pc2ggdGhpbmdzIHVwLiAgKi8KLSAgICB9Ci0KLSAgLyogVHVjayBgdmFsdWUnIGF3YXkgZm9yIHVzZSBieSB0Y19nZW5fcmVsb2MuCi0gICAgIFNlZSB0aGUgY29tbWVudCBkZXNjcmliaW5nIGZ4X2FkZG51bWJlciBpbiB3cml0ZS5oLgotICAgICBUaGlzIGZpZWxkIGlzIG1pc25hbWVkIChvciBtaXN1c2VkIDotKS4gICovCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQgZm9ybWF0LgotCi0gICBGSVhNRTogVG8gd2hhdCBleHRlbnQgY2FuIHdlIGdldCBhbGwgcmVsZXZhbnQgdGFyZ2V0cyB0byB1c2UgdGhpcz8gICovCi0KLWFyZWxlbnQgKgotZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIGZpeFMgKiAgICAgZml4UDsKLXsKLSAgYXJlbGVudCAqIHJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiksCi0JCSAgICBmaXhQLT5meF9yX3R5cGUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhQLT5meF9yX3R5cGUpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhc3NlcnQgKCFmaXhQLT5meF9wY3JlbCA9PSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpOwotCi0gIC8qIFVzZSBmeF9vZmZzZXQgZm9yIHRoZXNlIGNhc2VzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCkKLSAgICByZWxvYy0+YWRkZW5kICA9IGZpeFAtPmZ4X29mZnNldDsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJlbG9jLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICByZXR1cm4gcmVsb2M7Ci19CmRpZmYgLS1naXQgYS9nYXMvY2dlbi5oIGIvZ2FzL2NnZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjMTczMi4uMDAwMDAwMAotLS0gYS9nYXMvY2dlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogR0FTIGNnZW4gc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVNfQ0dFTl9ICi0jZGVmaW5lIEdBU19DR0VOX0gKLQotLyogT3Bjb2RlIHRhYmxlIGhhbmRsZS4gICovCi1leHRlcm4gQ0dFTl9DUFVfREVTQyBnYXNfY2dlbl9jcHVfZGVzYzsKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZml4dXBzIGluIGFuIGluc24uCi0gICBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhpcywgYWxsb3cgdGFyZ2V0IHRvIG92ZXJyaWRlIGFuZCBkbyBzbyB0aGVyZS4gICovCi0jZGVmaW5lIEdBU19DR0VOX01BWF9GSVhVUFMgMwotCi0vKiBTdHJ1Y3QgZGVmaW5pbmcgcmVzdWx0IG9mIGdhc19jZ2VuX2ZpbmlzaF9pbnNuLiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogZnJhZyBjb250YWluaW5nIHRoZSBpbnNuICovCi0gIGZyYWdTICogZnJhZzsKLSAgLyogQWRkcmVzcyBvZiBpbnNuIGluIGZyYWcuICAqLwotICBjaGFyICogYWRkcjsKLSAgLyogTnVtYmVyIG9mIGZpeHVwcyB0aGlzIGluc24gaGFzLiAgKi8KLSAgaW50IG51bV9maXh1cHM7Ci0gIC8qIEFycmF5IG9mIGZpeHVwcy4gICovCi0gIGZpeFMgKiBmaXh1cHNbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci19IGZpbmlzaGVkX2luc25TOwotCi0vKiBDYWxsYmFjayBmb3Igb3BlcmFuZCBwYXJzaW5nLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgZm9yIHN1Y2Nlc3MuCi0gICBUaGUgcGFyc2VkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgYmZkX3ZtYSAqLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICogZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlLAotCSAgICAgIGNvbnN0IGNoYXIgKiosIGludCwgaW50LCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwKLQkgICAgICBiZmRfdm1hICopKTsKLQotLyogQ2FsbCB0aGlzIGZyb20gbWRfYXNzZW1ibGUgdG8gaW5pdGlhbGl6ZSB0aGUgYXNzZW1ibGVyIGNhbGxiYWNrLiAgKi8KLWV4dGVybiB2b2lkIGdhc19jZ2VuX2luaXRfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9zYXZlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBnYXNfY2dlbl9yZXN0b3JlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBnYXNfY2dlbl9zd2FwX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci0gICAgIAotLyogQWRkIGEgcmVnaXN0ZXIgdG8gdGhlIGFzc2VtYmxlcidzIGhhc2ggdGFibGUuCi0gICBUaGlzIG1ha2VzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCi0gICA/Pz8gVGhpcyBpc24ndCBjdXJyZW50bHkgdXNlZCwgYnV0IGl0IGNvdWxkIGJlIGluIHRoZSBmdXR1cmUuICAqLwotZXh0ZXJuIHZvaWQgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLS8qIEFmdGVyIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKSBpcyBkb25lLCB0aGlzIGlzIGNhbGxlZCB0bwotICAgb3V0cHV0IHRoZSBpbnNuIGFuZCByZWNvcmQgYW55IGZpeHVwcy4gICovCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9maW5pc2hfaW5zbiBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKiwKLQkJCQkJICBDR0VOX0lOU05fQllURVNfUFRSLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgaW50LCBmaW5pc2hlZF9pbnNuUyAqKSk7Ci0KLS8qIFJlY29yZCBhIGZpeHVwLiAgKi8KLWV4dGVybiBmaXhTICogZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCSAgICAgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkgICAgIHN5bWJvbFMgKiwgb2Zmc2V0VCkpOwotZXh0ZXJuIGZpeFMgKiBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCQkgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkJIGV4cHJlc3Npb25TICopKTsKLQotLyogbWRfYXBwbHlfZml4MyBoYW5kbGVyICovCi1leHRlcm4gaW50IGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgUEFSQU1TICgoZml4UyAqLCB2YWx1ZVQgKiwgc2VnVCkpOwotCi0vKiB0Y19nZW5fcmVsb2MgaGFuZGxlciAqLwotZXh0ZXJuIGFyZWxlbnQgKmdhc19jZ2VuX3RjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLQotLyogVGFyZ2V0IHN1cHBsaWVkIHJvdXRpbmUgdG8gbG9va3VwIGEgcmVsb2MuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IENHRU5fT1BFUkFORCAqLAotCQkJICAgICAgZml4UyAqKSk7Ci0KLS8qIE9wdGlvbmFsIHRhcmdldCBzdXBwbGllZCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgKi8KLWV4dGVybiBmaXhTICoKLW1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGNvbnN0IENHRU5fSU5TTiAqLCBpbnQsCi0JCQkJICBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCSAgZXhwcmVzc2lvblMgKikpOwotCi0jZW5kaWYgLyogR0FTX0NHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmQuYyBiL2dhcy9jb25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGZjNjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKiBjb25kLmMgLSBjb25kaXRpb25hbCBhc3NlbWJseSBwc2V1ZG8tb3BzLCBhbmQgLmluY2x1ZGUKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJtYWNyby5oIgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBUaGlzIGlzIGFsbG9jYXRlZCB0byBncm93IGFuZCBzaHJpbmsgYXMgLmlmZGVmLy5lbmRpZiBwYWlycyBhcmUgc2Nhbm5lZC4gKi8KLXN0cnVjdCBvYnN0YWNrIGNvbmRfb2JzdGFjazsKLQotc3RydWN0IGZpbGVfbGluZQotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLX07Ci0KLS8qIFdlIHB1c2ggb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMgZm9yIGVhY2ggLmlmLCBhbmQgcG9wIGl0IGF0IHRoZQotICAgLmVuZGlmLiAgKi8KLQotc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lCi17Ci0gIC8qIFRoZSBzb3VyY2UgZmlsZSAmIGxpbmUgbnVtYmVyIG9mIHRoZSAiaWYiLiAgKi8KLSAgc3RydWN0IGZpbGVfbGluZSBpZl9maWxlX2xpbmU7Ci0gIC8qIFRoZSBzb3VyY2UgZmlsZSAmIGxpbmUgb2YgdGhlICJlbHNlIi4gICovCi0gIHN0cnVjdCBmaWxlX2xpbmUgZWxzZV9maWxlX2xpbmU7Ci0gIC8qIFRoZSBwcmV2aW91cyBjb25kaXRpb25hbC4gICovCi0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqcHJldmlvdXNfY2ZyYW1lOwotICAvKiBIYXZlIHdlIHNlZW4gYW4gZWxzZSB5ZXQ/ICAqLwotICBpbnQgZWxzZV9zZWVuOwotICAvKiBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgaWdub3JpbmcgaW5wdXQuICAqLwotICBpbnQgaWdub3Jpbmc7Ci0gIC8qIFdoZXRoZXIgYSBjb25kaXRpb25hbCBhdCBhIGhpZ2hlciBsZXZlbCBpcyBpZ25vcmluZyBpbnB1dC4gICovCi0gIGludCBkZWFkX3RyZWU7Ci0gIC8qIE1hY3JvIG5lc3RpbmcgbGV2ZWwgYXQgd2hpY2ggdGhpcyBjb25kaXRpb25hbCB3YXMgY3JlYXRlZC4gICovCi0gIGludCBtYWNyb19uZXN0OwotfTsKLQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9jZnJhbWUgUEFSQU1TICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpjZnJhbWUpKTsKLXN0YXRpYyBjaGFyICpnZXRfbXJpX3N0cmluZyBQQVJBTVMgKChpbnQsIGludCAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmN1cnJlbnRfY2ZyYW1lID0gTlVMTDsKLQotdm9pZCAKLXNfaWZkZWYgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsJCS8qIHBvaW50cyB0byBuYW1lIG9mIHN5bWJvbCAqLwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwkvKiBQb2ludHMgdG8gc3ltYm9sICovCi0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogTGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoIWlzX25hbWVfYmVnaW5uZXIgKCpuYW1lKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgaWRlbnRpZmllciBmb3IgXCIuaWZkZWZcIiIpKTsKLSAgICAgIG9ic3RhY2tfMWdyb3cgKCZjb25kX29ic3RhY2ssIDApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICAgICAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhKChzeW1ib2xQICE9IDApIF4gYXJnKTsKLSAgICAgIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJCW9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwKLQkJCQkgICAgICBzaXplb2YgKGNmcmFtZSkpKTsKLQotICAgICAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0JICAmJiBjZnJhbWUuaWdub3JpbmcKLQkgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgICAgICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLQlsaXN0aW5nX2xpc3QgKDIpOwotCi0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0JCQkJLyogaWYgYSB2YWxpZCBpZGVudGlmeWVyIG5hbWUgKi8KLX0JCQkJLyogc19pZmRlZigpICovCi0KLXZvaWQgCi1zX2lmIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGV4cHJlc3Npb25TIG9wZXJhbmQ7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0gIGludCB0OwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBwYXJ0IG9mIG9wZXJhbmQuICovCi0KLSAgaWYgKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKQotICAgIHsKLSAgICAgIG9wZXJhbmQuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uICgmb3BlcmFuZCk7Ci0gICAgICBpZiAob3BlcmFuZC5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5pZlwiIHN0YXRlbWVudCIpKTsKLSAgICB9Ci0KLSAgc3dpdGNoICgob3BlcmF0b3JUKSBhcmcpCi0gICAgewotICAgIGNhc2UgT19lcTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyID09IDA7IGJyZWFrOwotICAgIGNhc2UgT19uZTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyICE9IDA7IGJyZWFrOwotICAgIGNhc2UgT19sdDogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyIDwgMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2xlOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPD0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2dlOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPj0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2d0OiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPiAwOyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIHRoZSBhYm92ZSBlcnJvciBpcyBzaWduYWxlZCwgdGhpcyB3aWxsIGRpc3BhdGNoCi0gICAgIHVzaW5nIGFuIHVuZGVmaW5lZCByZXN1bHQuICBObyBiaWcgZGVhbC4gICovCi0gIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIHQ7Ci0gIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJICAgIG9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwgc2l6ZW9mIChjZnJhbWUpKSk7Ci0KLSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0gICAgICAmJiBjZnJhbWUuaWdub3JpbmcKLSAgICAgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotICAgIGxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfaWYoKSAqLwotCi0vKiBHZXQgYSBzdHJpbmcgZm9yIHRoZSBNUkkgSUZDIG9yIElGTkMgcHNldWRvLW9wcy4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9tcmlfc3RyaW5nICh0ZXJtaW5hdG9yLCBsZW4pCi0gICAgIGludCB0ZXJtaW5hdG9yOwotICAgICBpbnQgKmxlbjsKLXsKLSAgY2hhciAqcmV0OwotICBjaGFyICpzOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgcyA9IHJldCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLSAgICB7Ci0gICAgICArK3M7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICAqcysrID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgaWYgKHNbLTFdID09ICdcJycpCi0JICAgIHsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnKQotCQlicmVhazsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSB0ZXJtaW5hdG9yCi0JICAgICAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAocyA+IHJldCAmJiAoc1stMV0gPT0gJyAnIHx8IHNbLTFdID09ICdcdCcpKQotCS0tczsKLSAgICB9Ci0KLSAgKmxlbiA9IHMgLSByZXQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBNUkkgSUZDIGFuZCBJRk5DIHBzZXVkby1vcHMuICAqLwotCi12b2lkCi1zX2lmYyAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLSAgY2hhciAqczEsICpzMjsKLSAgaW50IGxlbjEsIGxlbjI7Ci0gIGludCByZXM7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBzMSA9IGdldF9tcmlfc3RyaW5nICgnLCcsICZsZW4xKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYXNfYmFkIChfKCJiYWQgZm9ybWF0IGZvciBpZmMgb3IgaWZuYyIpKTsKLSAgZWxzZQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHMyID0gZ2V0X21yaV9zdHJpbmcgKCc7JywgJmxlbjIpOwotCi0gIHJlcyA9IGxlbjEgPT0gbGVuMiAmJiBzdHJuY21wIChzMSwgczIsIGxlbjEpID09IDA7Ci0KLSAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICBjZnJhbWUuaWdub3JpbmcgPSBjZnJhbWUuZGVhZF90cmVlIHx8ICEgKHJlcyBeIGFyZyk7Ci0gIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJICAgIG9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwgc2l6ZW9mIChjZnJhbWUpKSk7Ci0KLSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0gICAgICAmJiBjZnJhbWUuaWdub3JpbmcKLSAgICAgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotICAgIGxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQgCi1zX2VuZGlmIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqaG9sZDsKLQotICBpZiAoY3VycmVudF9jZnJhbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlwiLmVuZGlmXCIgd2l0aG91dCBcIi5pZlwiIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotCSAgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nCi0JICAmJiAoY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICAgICAgfHwgISBjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCi0JbGlzdGluZ19saXN0ICgxKTsKLQotICAgICAgaG9sZCA9IGN1cnJlbnRfY2ZyYW1lOwotICAgICAgY3VycmVudF9jZnJhbWUgPSBjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lOwotICAgICAgb2JzdGFja19mcmVlICgmY29uZF9vYnN0YWNrLCBob2xkKTsKLSAgICB9CQkJCS8qIGlmIG9uZSBwb3AgdG9vIG1hbnkgKi8KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2VuZGlmKCkgKi8KLQotdm9pZCAKLXNfZWxzZSAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBpZiAoY3VycmVudF9jZnJhbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5lbHNlIHdpdGhvdXQgbWF0Y2hpbmcgLmlmIC0gaWdub3JlZCIpKTsKLQotICAgIH0KLSAgZWxzZSBpZiAoY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiKSk7Ci0gICAgICBhc19iYWRfd2hlcmUgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImVsc2VcIiIpKTsKLSAgICAgIGFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5saW5lLAotCQkgICAgXygiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJpZlwiIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3doZXJlICgmY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmZpbGUsCi0JCSZjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUubGluZSk7Ci0KLSAgICAgIGlmICghY3VycmVudF9jZnJhbWUtPmRlYWRfdHJlZSkKLQl7Ci0JICBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcgPSAhY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nOwotCSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKQotCQlsaXN0aW5nX2xpc3QgKDEpOwotCSAgICAgIGVsc2UKLQkJbGlzdGluZ19saXN0ICgyKTsKLQkgICAgfQotCX0JCQkvKiBpZiBub3QgYSBkZWFkIHRyZWUgKi8KLQotICAgICAgY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbiA9IDE7Ci0gICAgfQkJCQkvKiBpZiBlcnJvciBlbHNlIGRvIGl0ICovCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19lbHNlKCkgKi8KLQotdm9pZCAKLXNfaWZlcXMgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgY2hhciAqczEsICpzMjsKLSAgaW50IGxlbjEsIGxlbjI7Ci0gIGludCByZXM7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgczEgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbjEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLmlmZXFzIHN5bnRheCBlcnJvciIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHMyID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4yKTsKLQotICByZXMgPSBsZW4xID09IGxlbjIgJiYgc3RybmNtcCAoczEsIHMyLCBsZW4xKSA9PSAwOwotCi0gIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIChyZXMgXiBhcmcpOwotICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCi0JCSAgICBvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsIHNpemVvZiAoY2ZyYW1lKSkpOwotCi0gIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotICAgICAgJiYgY2ZyYW1lLmlnbm9yaW5nCi0gICAgICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLSAgICBsaXN0aW5nX2xpc3QgKDIpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfaWZlcXMoKSAqLwotCi1pbnQgCi1pZ25vcmVfaW5wdXQgKCkKLXsKLSAgY2hhciAqczsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTk9fUFNFVURPX0RPVAotICAgICAgfHwgMQotI2VuZGlmCi0gICAgICApCi0gICAgewotICAgICAgaWYgKHNbLTFdICE9ICcuJykKLQktLXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNbLTFdICE9ICcuJykKLQlyZXR1cm4gKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwpICYmIChjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpOwotICAgIH0KLQotICAvKiBXZSBjYW5ub3QgaWdub3JlIGNlcnRhaW4gcHNldWRvIG9wcy4gICovCi0gIGlmICgoKHNbMF0gPT0gJ2knCi0JfHwgc1swXSA9PSAnSScpCi0gICAgICAgJiYgKCFzdHJuY2FzZWNtcCAocywgImlmIiwgMikKLQkgICB8fCAhc3RybmNhc2VjbXAgKHMsICJpZmRlZiIsIDUpCi0JICAgfHwgIXN0cm5jYXNlY21wIChzLCAiaWZuZGVmIiwgNikpKQotICAgICAgfHwgKChzWzBdID09ICdlJwotCSAgIHx8IHNbMF0gPT0gJ0UnKQotCSAgJiYgKCFzdHJuY2FzZWNtcCAocywgImVsc2UiLCA0KQotCSAgICAgIHx8ICFzdHJuY2FzZWNtcCAocywgImVuZGlmIiwgNSkKLQkgICAgICB8fCAhc3RybmNhc2VjbXAgKHMsICJlbmRjIiwgNCkpKSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwpICYmIChjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpOwotfQkJCQkvKiBpZ25vcmVfaW5wdXQoKSAqLwotCi1zdGF0aWMgdm9pZCAKLWluaXRpYWxpemVfY2ZyYW1lIChjZnJhbWUpCi0gICAgIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqY2ZyYW1lOwotewotICBtZW1zZXQgKGNmcmFtZSwgMCwgc2l6ZW9mICgqY2ZyYW1lKSk7Ci0gIGFzX3doZXJlICgmY2ZyYW1lLT5pZl9maWxlX2xpbmUuZmlsZSwKLQkgICAgJmNmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUpOwotICBjZnJhbWUtPnByZXZpb3VzX2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lOwotICBjZnJhbWUtPmRlYWRfdHJlZSA9IGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nOwotICBjZnJhbWUtPm1hY3JvX25lc3QgPSBtYWNyb19uZXN0OwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGlmIGEgY29uZGl0aW9uYWwgaXMgdW50ZXJtaW5hdGVkIGluc2lkZSBhIG1hY3JvIG9yCi0gICB0aGUgYXNzZW1ibHkgYXMgYSB3aG9sZS4gIElmIE5FU1QgaXMgbm9uIG5lZ2F0aXZlLCB3ZSBhcmUgYmVpbmcKLSAgIGNhbGxlZCBiZWNhdXNlIG9mIHRoZSBlbmQgb2YgYSBtYWNybyBleHBhbnNpb24uICBJZiBORVNUIGlzCi0gICBuZWdhdGl2ZSwgd2UgYXJlIGJlaW5nIGNhbGxlZCBhdCB0aGUgb2YgdGhlIGlucHV0IGZpbGVzLiAgKi8KLQotdm9pZAotY29uZF9maW5pc2hfY2hlY2sgKG5lc3QpCi0gICAgIGludCBuZXN0OwotewotICBpZiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+bWFjcm9fbmVzdCA+PSBuZXN0KQotICAgIHsKLSAgICAgIGlmIChuZXN0ID49IDApCi0JYXNfYmFkIChfKCJlbmQgb2YgbWFjcm8gaW5zaWRlIGNvbmRpdGlvbmFsIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiZW5kIG9mIGZpbGUgaW5zaWRlIGNvbmRpdGlvbmFsIikpOwotICAgICAgYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmZpbGUsCi0JCSAgICBjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBzdGFydCBvZiB0aGUgdW50ZXJtaW5hdGVkIGNvbmRpdGlvbmFsIikpOwotICAgICAgaWYgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX3NlZW4pCi0JYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUuZmlsZSwKLQkJICAgICAgY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUsCi0JCSAgICAgIF8oImhlcmUgaXMgdGhlIFwiZWxzZVwiIG9mIHRoZSB1bnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwiKSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIGV4aXQgb3V0IG9mIGEgbWFjcm8uICBXZSBhc3N1bWUKLSAgIHRoYXQgYW55IGNvbmRpdGlvbmFscyB3aGljaCBiZWdhbiB3aXRoaW4gdGhlIG1hY3JvIGFyZSBjb3JyZWN0bHkKLSAgIG5lc3RlZCwgYW5kIGp1c3QgcG9wIHRoZW0gb2ZmIHRoZSBzdGFjay4gICovCi0KLXZvaWQKLWNvbmRfZXhpdF9tYWNybyAobmVzdCkKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIHdoaWxlIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5tYWNyb19uZXN0ID49IG5lc3QpCi0gICAgewotICAgICAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpob2xkOwotCi0gICAgICBob2xkID0gY3VycmVudF9jZnJhbWU7Ci0gICAgICBjdXJyZW50X2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWU7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKCZjb25kX29ic3RhY2ssIGhvbGQpOwotICAgIH0KLX0KLQotLyogZW5kIG9mIGNvbmQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy1nYXMuY29tIGIvZ2FzL2NvbmZpZy1nYXMuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUyNDhhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWctZ2FzLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0kIWNvbmZpZy1nYXMuY29tCi0kISBUaGlzIGZpbGUgc2V0cyB0aGluZ3MgdXAgdG8gYnVpbGQgZ2FzIG9uIGEgVk1TIHN5c3RlbSB0byBnZW5lcmF0ZSBvYmplY3QKLSQhIGZpbGVzIGZvciBhIFZNUyBzeXN0ZW0uICBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZQotJCEgZG8gbm90IGhhdmUgL2Jpbi9zaCB0byBleGVjdXRlIGl0LgotJCEKLSQhCi0kIGdhc19ob3N0PSJ2bXMiCi0kIGFyY2hfaW5keCA9IDEgKyAoKGYkZ2V0c3lpKCJDUFUiKS5nZS4xMjgpLmFuZC4xKQkhIHZheD09MSwgYWxwaGE9PTIKLSQgYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIGlmIGFyY2guZXFzLiJWQVgiCi0kIHRoZW4KLSQgIGNwdV90eXBlPSJ2YXgiCi0kICBvYmpfZm9ybWF0PSJ2bXMiCi0kICBhdG9mPSJ2YXgiCi0kIGVsc2UKLSQgIGNwdV90eXBlPSJhbHBoYSIKLSQgIG9ial9mb3JtYXQ9ImV2YXgiCi0kICBhdG9mPSJpZWVlIgotJCBlbmRpZgotJCBlbXVsYXRpb249ImdlbmVyaWMiCi0kIQotJAlERUxFVEUJPSAiZGVsZXRlL25vQ29uZmlybSIKLSQJRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgotJCEKLSQhIFRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbgotJCBjYWxsIG1ha2UgInRhcmctY3B1LmgiICJbLmNvbmZpZ110Yy0nJ2NwdV90eXBlJy5oIgotJCBjYWxsIG1ha2UgInRhcmctZW52LmgiICJbLmNvbmZpZ110ZS0nJ2VtdWxhdGlvbicuaCIKLSQhCi0kISBDb2RlIHRvIGhhbmRsZSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgotJCBjYWxsIG1ha2UgIm9iai1mb3JtYXQuaCIgIlsuY29uZmlnXW9iai0nJ29ial9mb3JtYXQnLmgiCi0kIQotJCEgKG5vdCBjdXJyZW50bHkgdXNlZCBmb3IgdmF4IG9yIGFscGhhKQotJCBjYWxsIG1ha2UgIml0YmwtY3B1LmgiICJbLmNvbmZpZ11pdGJsLScnY3B1X3R5cGUnLmgiCi0kIQotJCEKLSQhIENyZWF0ZSB0aGUgZmlsZSB2ZXJzaW9uLm9wdCwgd2hpY2ggaGVscHMgaWRlbnRpZnkgdGhlIGV4ZWN1dGFibGUuCi0kIQotJGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kc2VhcmNoIENPTkZJR1VSRS5JTiAiQU1fSU5JVF9BVVRPTUFLRSIvRXhhY3QvT3V0cHV0PWNvbmZpZy1nYXMtdG1wLnRtcAotJG9wZW4gaWZpbGUkIGNvbmZpZy1nYXMtdG1wLnRtcAotJHJlYWQgaWZpbGUkIGxpbmUKLSRjbG9zZSBpZmlsZSQKLSRERUxFVEUgY29uZmlnLWdhcy10bXAudG1wOyoKLSQhIERpc2NhcmQgIkFNX0lOSVRfQVVUT01BS0UoZ2FzLCAiIGFuZCAiKSIgcGFydHMuCi0kaWprPWYkbG9jYXRlKCIsIixsaW5lKSsyCi0kbGluZT1mJGV4dHJhY3QoaWprLGYkbGVuZ3RoKGxpbmUpLWlqayxsaW5lKQotJGlqaz1mJGxvY2F0ZSgiKSIsbGluZSkKLSRsaW5lPWYkZXh0cmFjdCgwLGlqayxsaW5lKQotJCEKLSQgaWYgZiRzZWFyY2goInZlcnNpb24ub3B0IikubmVzLiIiIHRoZW4gREVMRVRFIHZlcnNpb24ub3B0OyoKLSRjb3B5IF9OTDogdmVyc2lvbi5vcHQKLSRvcGVuL0FwcGVuZCBpZmlsZSQgdmVyc2lvbi5vcHQKLSR3cml0ZSBpZmlsZSQgImlkZW50aWZpY2F0aW9uPSIrIiIiIitsaW5lKyIiIiIKLSRjbG9zZSBpZmlsZSQKLSQhCi0kISBOb3cgd3JpdGUgY29uZmlnLmguCi0kIQotJCBpZiBmJHNlYXJjaCgiY29uZmlnLmgiKS5uZXMuIiIgdGhlbiBERUxFVEUgY29uZmlnLmg7KgotJGNvcHkgX05MOiBjb25maWcuaAotJG9wZW4vQXBwZW5kIGlmaWxlJCBjb25maWcuaAotJHdyaXRlIGlmaWxlJCAiLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLWdhcy5jb20uICovCi0kd3JpdGUgaWZpbGUkICIjaWZuZGVmIFZFUlNJT04iCi0kd3JpdGUgaWZpbGUkICIjZGVmaW5lIFZFUlNJT04gICAgICAiIiIsbGluZSwiIiIiCi0kd3JpdGUgaWZpbGUkICIjZW5kaWYiCi0kd3JpdGUgaWZpbGUkICIvKi0tKi8iCi0kaWYgYXJjaCAuZXFzLiAiVkFYIgotJHRoZW4KLSRhcHBlbmQgWy5jb25maWdddm1zLWNvbmYuaCBpZmlsZSQ6Ci0kZWxzZQotJCBhcHBlbmQgWy5jb25maWdddm1zLWEtY29uZi5oIGlmaWxlJDoKLSRlbmRpZgotJGNsb3NlIGlmaWxlJAotJEVDSE8gIkNyZWF0ZWQgY29uZmlnLmguIgotJCEKLSQhIENoZWNrIGZvciwgYW5kIHBvc3NpYmx5IG1ha2UsIGhlYWRlciBmaWxlIDx1bmlzdGQuaD4uCi0kIQotJCBpZiBmJHNlYXJjaCgidG1wLWNoay1oLioiKS5uZXMuIiIgdGhlbiAgREVMRVRFIHRtcC1jaGstaC4qOyoKLSQhY2FuJ3QgdXNlIHNpbXBsZSBgI2luY2x1ZGUgSERSJyB3aXRoIGBnY2MgL0RlZmluZT0iSERSPTxmb28uaD4iJwotJCFiZWNhdXNlIHRoZSAyLjYuWzAtM10gcHJlcHJvY2Vzc29yIGhhbmRsZXMgaXQgd3JvbmcgKFZNUy1zcGVjaWZpYyBnY2MgYnVnKQotJCBjcmVhdGUgdG1wLWNoay1oLmMKLWludCB0bXBfY2hrX2g7CS8qIGd1YXJhbnRlZSBub24tZW1wdHkgb3V0cHV0ICovCi0jaWZkZWYgSEFWRV9TVERJT19ICi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JWElPX0gKLSNpbmNsdWRlIDx1bml4aW8uaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JWExJQl9ICi0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2VuZGlmCi0kIG9uIHdhcm5pbmcgdGhlbiAgY29udGludWUKLSQgQ0hFQ0sgPSAiY2FsbCB0bXBfY2hrX2giCi0kIENIRUNLICJIQVZFX1NURElPX0giCi0kIGlmIC5ub3QuJHN0YXR1cwotJCB0aGVuCXR5cGUgc3lzJGlucHV0OgotCi0/IGNvdWxkIG5vdCBjb21waWxlIDxzdGRpby5oPi4KLQotICBJZiB5b3UncmUgY29tcGlsaW5nIHdpdGggREVDIEMgb3IgVkFYIEMsIGNyZWF0ZSBjb25maWcuc3RhdHVzIGFzIGFuCi0gIGVtcHR5IGZpbGUgYW5kIHN0YXJ0IGdudSBtYWtlIGFnYWluLgotCi0gIElmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBHTlUgQywgdGhlcmUgaXMgc29tZSBzZXR1cCBwcm9ibGVtIGFuZAotICBnYXMgY29uZmlndXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLQotJAlERUxFVEUgdG1wLWNoay1oLmM7KgotJAlleGl0ICV4MDAyQwotJCBlbmRpZgotJCEKLSQgQ0hFQ0sgIkhBVkVfVU5JU1REX0giCi0kIGlmIC5ub3QuJHN0YXR1cwotJCB0aGVuCi0kICBpZiBmJHRybmxubSgiSEZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGhmaWxlJAotJCAgQ0hFQ0sgIkhBVkVfVU5JWElPX0giCi0kICBnb3RfdW5peGlvID0gKCRzdGF0dXMgLmFuZC4gMSkKLSQgIENIRUNLICJIQVZFX1VOSVhMSUJfSCIKLSQgIGdvdF91bml4bGliID0gKCRzdGF0dXMgLmFuZC4gMSkKLSQgIGNyZWF0ZSBbXXVuaXN0ZC5oCSF3aXRoIHJ1ZGltZW50YXJ5IGNvbnRlbnRzCi0vKiA8dW5pc3RkLmg+IHN1YnN0aXR1dGUgZm9yIGJ1aWxkaW5nIGdhcyAqLwotI2lmbmRlZiBVTklTVERfSAotI2RlZmluZSBVTklTVERfSAotCi0kICBvcGVuL0FwcGVuZCBoZmlsZSQgW111bmlzdGQuaAotJCAgaWYgZ290X3VuaXhpbwotJCAgdGhlbiAgd3JpdGUgaGZpbGUkICIjaW5jbHVkZSA8dW5peGlvLmg+IgotJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGlvLmg+ICovCi1leHRlcm4gaW50IGNyZWF0KCksIG9wZW4oKSwgY2xvc2UoKSwgcmVhZCgpLCB3cml0ZSgpOwotZXh0ZXJuIGludCBhY2Nlc3MoKSwgZHVwKCksIGR1cDIoKSwgZnN0YXQoKSwgc3RhdCgpOwotZXh0ZXJuIGxvbmcgbHNlZWsoKTsKLSQgIGVuZGlmCi0kICB3cml0ZSBoZmlsZSQgIiIKLSQgIGlmIGdvdF91bml4bGliCi0kICB0aGVuICB3cml0ZSBoZmlsZSQgIiNpbmNsdWRlIDx1bml4bGliLmg+IgotJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGxpYi5oPiAqLwotZXh0ZXJuIGNoYXIgKnNicmsoKSwgKmdldGN3ZCgpLCAqY3VzZXJpZCgpOwotZXh0ZXJuIGludCBicmsoKSwgY2hkaXIoKSwgY2htb2QoKSwgY2hvd24oKSwgbWtkaXIoKTsKLWV4dGVybiB1bnNpZ25lZCBnZXR1aWQoKSwgdW1hc2soKTsKLSQgIGVuZGlmCi0kICBhcHBlbmQgc3lzJGlucHV0OiBoZmlsZSQ6Ci0KLSNlbmRpZiAvKlVOSVNURF9IKi8KLSQgIGNsb3NlIGhmaWxlJAotJCAgRUNITyAiQ3JlYXRlZCAiIltddW5pc3RkLmgiIi4iCi0kIGVuZGlmICFnY2MgJyNpbmNsdWRlIDx1bmlzdGQuaD4nIGZhaWxlZAotJCBERUxFVEUgdG1wLWNoay1oLmM7KgotJAotJHRtcF9jaGtfaDogc3Vicm91dGluZQotJCAgc2V0IG5vT24KLSQgIGhuYW1lID0gZiRlZGl0KCI8IiArIChwMSAtICJIQVZFXyIgLSAiX0giKSArICIuaD4iLCJMT1dFUkNBU0UiKQotJCAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnaG5hbWUnLiIKLSQgIGlmIGYkc2VhcmNoKCJ0bXAtY2hrLWgub2JqIikubmVzLiIiIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKLSQgIGRlZmluZS9ub0xvZyBzeXMkZXJyb3IgX05MOgkhY2FuJ3QgdXNlIC9Vc2VyX01vZGUgaGVyZSBkdWUgdG8gZ2NjCi0kICBkZWZpbmUvbm9Mb2cgc3lzJG91dHB1dCBfTkw6CSEgZHJpdmVyJ3MgdXNlIG9mIG11bHRpcGxlIGltYWdlIGFjdGl2YXRpb24KLSQgIGdjYyAvSW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pIC9EZWZpbmU9KCInJ3AxJyIpIHRtcC1jaGstaC5jCi0kIWNhbid0IGp1c3QgY2hlY2sgJHN0YXR1czsgZ2NjIDIuNi5bMC0zXSBwcmVwcm9jZXNzb3IgZG9lc24ndCBzZXQgaXQgY29ycmVjdGx5Ci0kICBvayA9ICgoJHN0YXR1cy5hbmQuMSkuYW5kLihmJHNlYXJjaCgidG1wLWNoay1oLm9iaiIpLm5lcy4iIikpIC5vci4gJXgxMDAwMDAwMAotJCAgZGVhc3NpZ24gc3lzJGVycm9yCSFyZXN0b3JlLCBtb3JlIG9yIGxlc3MKLSQgIGRlYXNzaWduIHN5cyRvdXRwdXQKLSQgIGlmIG9rIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKLSQgIGV4aXQgb2sKLSQgZW5kc3Vicm91dGluZSAhdG1wX2Noa19oCi0kCi0kIQotJCEgRG9uZQotJCEKLSQgaWYgZiRzZWFyY2goImNvbmZpZy5zdGF0dXMiKSAubmVzLiAiIiB0aGVuIERFTEVURSBjb25maWcuc3RhdHVzOyoKLSQgb3Blbi93cml0ZSBjZmlsZSBbXWNvbmZpZy5zdGF0dXMKLSQgd3JpdGUgY2ZpbGUgIkxpbmtzIGFyZSBub3cgc2V0IHVwIGZvciB1c2Ugd2l0aCBhICIrYXJjaCsiIHJ1bm5pbmcgVk1TLiIKLSQgY2xvc2UgY2ZpbGUKLSQgdHlwZSBbXWNvbmZpZy5zdGF0dXMKLSRleGl0Ci0kIQotJCEKLSRtYWtlOiBzdWJyb3V0aW5lCi0kICBpZiBmJHNlYXJjaChwMSkubmVzLiIiIHRoZW4gREVMRVRFICdwMSc7KgotJCAgY3JlYXRlICdwMScKLSQgIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kICBvcGVuL0FwcGVuZCBpZmlsZSQgJ3AxJwotJCAgd3JpdGUgaWZpbGUkICIjaW5jbHVkZSAiIicnZiRzdHJpbmcocDIgLSAiWy5jb25maWddIiknIiIiCi0kICBjbG9zZSBpZmlsZSQKLSQgIEVDSE8gIkNyZWF0ZWQgJydwMScgZm9yICcncDInLiIKLSRlbmRzdWJyb3V0aW5lICFtYWtlCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnLmluIGIvZ2FzL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmMmFkYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SRU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiBkZWZhdWx0aW5nIHRvIEVMRiBvbiBTQ08gNS4gKi8KLSN1bmRlZiBTQ09fRUxGCi0KLS8qIFVzZSBFTEYgc3RhYnMgZm9yIE1JUFMsIG5vdCBFQ09GRiBzdGFicyAqLwotI3VuZGVmIE1JUFNfU1RBQlNfRUxGCi0KLS8qIERlZmluZSBpZiBkZWZhdWx0IHRhcmdldCBpcyBQb3dlclBDIFNvbGFyaXMuICovCi0jdW5kZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotCi0vKiBEZWZpbmUgYXMgMSBpZiBiaWcgZW5kaWFuLiAqLwotI3VuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0KLS8qIERlZmF1bHQgYXJjaGl0ZWN0dXJlLiAqLwotI3VuZGVmIERFRkFVTFRfQVJDSAotCi0vKiBVc2luZyBjZ2VuIGNvZGU/ICovCi0jdW5kZWYgVVNJTkdfQ0dFTgotCi0vKiBVc2luZyBpMzg2IENPRkY/ICovCi0jdW5kZWYgSTM4NkNPRkYKLQotLyogVXNpbmcgbTY4ayBDT0ZGPyAqLwotI3VuZGVmIE02OEtDT0ZGCi0KLS8qIFVzaW5nIG04OGsgQ09GRj8gKi8KLSN1bmRlZiBNODhLQ09GRgotCi0vKiBhLm91dCBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9BT1VUCi0KLS8qIGIub3V0IHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0JPVVQKLQotLyogQ09GRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9DT0ZGCi0KLS8qIEVDT0ZGIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0VDT0ZGCi0KLS8qIEVMRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9FTEYKLQotLyogZ2VuZXJpYyBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9HRU5FUklDCi0KLS8qIEhQMzAwIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0hQMzAwCi0KLS8qIElFRUUgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfSUVFRQotCi0vKiBTT00gc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfU09NCi0KLS8qIFZNUyBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9WTVMKLQotLyogVXNlIGVtdWxhdGlvbiBzdXBwb3J0PyAqLwotI3VuZGVmIFVTRV9FTVVMQVRJT05TCi0KLS8qIFN1cHBvcnRlZCBlbXVsYXRpb25zLiAqLwotI3VuZGVmIEVNVUxBVElPTlMKLQotLyogRGVmYXVsdCBlbXVsYXRpb24uICovCi0jdW5kZWYgREVGQVVMVF9FTVVMQVRJT04KLQotLyogb2xkIENPRkYgc3VwcG9ydD8gKi8KLSN1bmRlZiBNQU5ZX1NFR01FTlRTCi0KLS8qIFVzZSBCRkQgaW50ZXJmYWNlPyAqLwotI3VuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogVGFyZ2V0IGFsaWFzLiAqLwotI3VuZGVmIFRBUkdFVF9BTElBUwotCi0vKiBDYW5vbmljYWwgdGFyZ2V0LiAqLwotI3VuZGVmIFRBUkdFVF9DQU5PTklDQUwKLQotLyogVGFyZ2V0IENQVS4gKi8KLSN1bmRlZiBUQVJHRVRfQ1BVCi0KLS8qIFRhcmdldCB2ZW5kb3IuICovCi0jdW5kZWYgVEFSR0VUX1ZFTkRPUgotCi0vKiBUYXJnZXQgT1MuICovCi0jdW5kZWYgVEFSR0VUX09TCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBDb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVyPyAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogYXNzZXJ0IGJyb2tlbj8gKi8KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIG1hbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBEZWZpbmUgaWYgZnJlZSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0KLS8qIERlZmluZSBpZiBlbnZpcm9uIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotCi0vKiBEZWZpbmUgaWYgZXJybm8gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2FvdXRfZ251LmggYi9nYXMvY29uZmlnL2FvdXRfZ251LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGY5Y2IuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hb3V0X2dudS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBhb3V0X2dudS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX19BX09VVF9HTlVfSF9fCi0jZGVmaW5lIF9fQV9PVVRfR05VX0hfXwotCi0vKiBUaGVyZSBhcmUgdHdvIG1haW4gZmxhdm91cnMgb2YgYS5vdXQsIG9uZSB3aGljaCB1c2VzIHRoZSBzdGFuZGFyZAotICAgcmVsb2NhdGlvbnMsIGFuZCBvbmUgd2hpY2ggdXNlcyBleHRlbmRlZCByZWxvY2F0aW9ucy4KLQotICAgVG9kYXksIHRoZSBleHRlbmRlZCByZWxvYyB1c2VzIGFyZQotICAgVENfU1BBUkMsIFRDX0EyOUsKLQotICAgZWFjaCBtdXN0IGRlZmluZSB0aGUgZW51bSByZWxvY190eXBlCi0KLSovCi0KLSNkZWZpbmUgVVNFX0VYVEVOREVEX1JFTE9DIChkZWZpbmVkKFRDX1NQQVJDKSB8fCBkZWZpbmVkKFRDX0EyOUspKQotCi0jaWYgZGVmaW5lZChUQ19TUEFSQykgfHwgZGVmaW5lZChUQ19BMjlLKQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSRUxPQ184LCBSRUxPQ18xNiwgUkVMT0NfMzIsLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gICAgUkVMT0NfRElTUDgsIFJFTE9DX0RJU1AxNiwgUkVMT0NfRElTUDMyLAkvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gICAgUkVMT0NfV0RJU1AzMCwgUkVMT0NfV0RJU1AyMiwKLSAgICBSRUxPQ19ISTIyLCBSRUxPQ18yMiwKLSAgICBSRUxPQ18xMywgUkVMT0NfTE8xMCwKLSAgICBSRUxPQ19TRkFfQkFTRSwgUkVMT0NfU0ZBX09GRjEzLAotICAgIFJFTE9DX0JBU0UxMCwgUkVMT0NfQkFTRTEzLCBSRUxPQ19CQVNFMjIsCS8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgICBSRUxPQ19QQzEwLCBSRUxPQ19QQzIyLAkvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gICAgUkVMT0NfSk1QX1RCTCwJCS8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gICAgUkVMT0NfU0VHT0ZGMTYsCQkvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICAgIFJFTE9DX0dMT0JfREFULCBSRUxPQ19KTVBfU0xPVCwgUkVMT0NfUkVMQVRJVkUsCi0gICAgUkVMT0NfMTAsIFJFTE9DXzExLAotICAgIFJFTE9DX1dESVNQMl8xNCwKLSAgICBSRUxPQ19XRElTUDE5LAotICAgIFJFTE9DX0hISTIyLAotICAgIFJFTE9DX0hMTzEwLAotCi0gICAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgICBSRUxPQ19KVU1QVEFSRywgUkVMT0NfQ09OU1QsIFJFTE9DX0NPTlNUSCwKLQotICAgIFJFTE9DX1dESVNQMTQsIFJFTE9DX1dESVNQMjEsCi0KLSAgICBOT19SRUxPQwotICB9OwotCi0jZW5kaWYgLyogVENfU1BBUkMgb3IgVENfQTI5SyAqLwotCi0KLSNkZWZpbmUgX19HTlVfRVhFQ19NQUNST1NfXwotCi0jaWZuZGVmIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiBhIFVuaXggVjcsIEJlcmtlbGV5LCBTdW5PUywgVmF4IFVsdHJpeAotICAgInN0cnVjdCBleGVjIi4gIERvbid0IGFzc3VtZSB0aGF0IG9uIHRoaXMgbWFjaGluZSwgdGhlICJzdHJ1Y3QgZXhlYyIKLSAgIHdpbGwgbGF5IG91dCB0aGUgc2FtZSBzaXplcyBvciBhbGlnbm1lbnRzLiAgKi8KLQotc3RydWN0IGV4ZWNfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgYV9pbmZvWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV90ZXh0WzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9kYXRhWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9ic3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX3N5bXNbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2VudHJ5WzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV90cnNpemVbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2Ryc2l6ZVs0XTsKLSAgfTsKLQotLyogSG93IGJpZyB0aGUgInN0cnVjdCBleGVjIiBpcyBvbiBkaXNrICovCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoOCAqIDQpCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBpbiBtZW1vcnkgb2YgYSAic3RydWN0IGV4ZWMiIHdoaWxlIHdlIHByb2Nlc3MgaXQuICAqLwotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBsb25nIGFfaW5mbzsJCS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MgKi8KLSAgdW5zaWduZWQgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZW50cnk7CQkvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9kcnNpemU7CQkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotfTsKLQotI2VuZGlmIC8qIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXyAqLwotCi0vKiB0aGVzZSBnbyBpbiB0aGUgTl9NQUNIVFlQRSBmaWVsZCAqLwotLyogVGhlc2Ugc3ltYm9scyBjb3VsZCBiZSBkZWZpbmVkIGJ5IGNvZGUgZnJvbSBTdW5zLi4ucHVudCAnZW0gKi8KLSN1bmRlZiBNX1VOS05PV04KLSN1bmRlZiBNXzY4MDEwCi0jdW5kZWYgTV82ODAyMAotI3VuZGVmIE1fU1BBUkMKLWVudW0gbWFjaGluZV90eXBlCi0gIHsKLSAgICBNX1VOS05PV04gPSAwLAotICAgIE1fNjgwMTAgPSAxLAotICAgIE1fNjgwMjAgPSAyLAotICAgIE1fU1BBUkMgPSAzLAotICAgIC8qIHNraXAgYSBidW5jaCBzbyB3ZSBkb24ndCBydW4gaW50byBhbnkgb2Ygc3VuJ3MgbnVtYmVycyAqLwotICAgIE1fMzg2ID0gMTAwLAotICAgIE1fMjlLID0gMTAxLAotICAgIE1fUlM2MDAwID0gMTAyLAkJLyogSUJNIFJTLzYwMDAgKi8KLSAgICAvKiBIUC9CU0QgZm9ybWF0cyAqLwotICAgIE1fSFAyMDAgPSAyMDAsCQkvKiBocDIwMCAoNjgwMTApIEJTRCBiaW5hcnkgKi8KLSAgICBNX0hQMzAwID0gMzAwLAkJLyogaHAzMDAgKDY4MDIwKzY4ODgxKSBCU0QgYmluYXJ5ICovCi0gICAgTV9IUFVYMjMgPSAweDAyMEMJCS8qIGhwMjAwLzMwMCBIUFVYIGJpbmFyeSAqLwotICB9OwotCi0jZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChlbnVtIG1hY2hpbmVfdHlwZSkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHhmZikpCi0jZGVmaW5lIE5fRkxBR1MoZXhlYykgKCgoZXhlYykuYV9pbmZvID4+IDI0KSAmIDB4ZmYpCi0jZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotICAgICB8ICgoKGludCkodHlwZSkgJiAweGZmKSA8PCAxNikgXAotICAgICB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpIFwKLSAgICAoKGV4ZWMpLmFfaW5mbyA9ICgoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZjAwMDApIHwgKChtYWdpYykgJiAweGZmZmYpKSkKLQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotICAgICgoZXhlYykuYV9pbmZvID0gXAotICAgICAoKGV4ZWMpLmFfaW5mbyYweGZmMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHhmZikgPDwgMTYpKQotCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSBcCi0gICAgICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotCi0vKiBDb2RlIGluZGljYXRpbmcgb2JqZWN0IGZpbGUgb3IgaW1wdXJlIGV4ZWN1dGFibGUuICAqLwotI2lmbmRlZiBPTUFHSUMKLSNkZWZpbmUgT01BR0lDIDA0MDcKLSNlbmRpZgotLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAwNDEwCi0vKiBDb2RlIGluZGljYXRpbmcgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBaTUFHSUMgMDQxMwotCi0vKiBWaXJ0dWFsIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGZyb20gdGhlIGEub3V0IGZpbGUuICBGb3IgT01BR0lDLAotICAgKGFsbW9zdCBhbHdheXMgInVubGlua2VkIC5vJ3MiIHRoZXNlIGRheXMpLCBzaG91bGQgYmUgemVyby4KLSAgIEZvciBsaW5rZWQgZmlsZXMsIHNob3VsZCByZWZsZWN0IHJlYWxpdHkgaWYgd2Uga25vdyBpdC4gICovCi0KLSNpZm5kZWYgTl9UWFRBRERSCi0jZGVmaW5lIE5fVFhUQUREUih4KQkoTl9NQUdJQyh4KT09T01BR0lDPyAwIDogVEVYVF9TVEFSVF9BRERSKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9CQURNQUcKLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSAgICYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0JCQkgICAmJiBOX01BR0lDKHgpICE9IFpNQUdJQykKLSNlbmRpZgotCi0vKiBCeSBkZWZhdWx0LCBzZWdtZW50IHNpemUgaXMgY29uc3RhbnQuICBCdXQgb24gc29tZSBtYWNoaW5lcywgaXQgY2FuCi0gICBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBhLm91dCBoZWFkZXIgKGUuZy4gbWFjaGluZSB0eXBlKS4gICovCi0jaWZuZGVmCU5fU0VHU0laRQotI2RlZmluZQlOX1NFR1NJWkUoeCkJU0VHTUVOVF9TSVpFCi0jZW5kaWYKLQotLyogVGhpcyBjb21wbGV4aXR5IGlzIGZvciBlbmNhcHN1bGF0ZWQgQ09GRiBzdXBwb3J0ICovCi0jaWZuZGVmIF9OX0hEUk9GRgotI2RlZmluZSBfTl9IRFJPRkYoeCkJKE5fU0VHU0laRSh4KSAtIHNpemVvZiAoc3RydWN0IGV4ZWMpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9UWFRPRkYKLSNkZWZpbmUgTl9UWFRPRkYoeCkJKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8JXAotCQkJIF9OX0hEUk9GRigoeCkpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOglcCi0JCQkgc2l6ZW9mIChzdHJ1Y3QgZXhlYykpCi0jZW5kaWYKLQotCi0jaWZuZGVmIE5fREFUT0ZGCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKLSNlbmRpZgotCi0jaWZuZGVmIE5fVFJFTE9GRgotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9EUkVMT0ZGCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NZTU9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NUUk9GRgotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZW5kaWYKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jaWZuZGVmIE5fVFhUQUREUgotI2RlZmluZQlOX1RYVEFERFIoeCkJMAotI2VuZGlmCi0KLSNpZm5kZWYgTl9EQVRBRERSCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0KSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0LTEpICYgfihOX1NFR1NJWkUoeCktMSkpKSkKLSNlbmRpZgotCi0vKiBBZGRyZXNzIG9mIGJzcyBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2RlZmluZSBOX0JTU0FERFIoeCkgKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCi0MCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqbl9uYW1lOwotCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCWxvbmcgbl9zdHJ4OwotICAgICAgfQotICAgIG5fdW47Ci0gICAgdW5zaWduZWQgY2hhciBuX3R5cGU7Ci0gICAgY2hhciBuX290aGVyOwotICAgIHNob3J0IG5fZGVzYzsKLSAgICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci0gIH07Ci0KLSNkZWZpbmUgTl9VTkRGIDAKLSNkZWZpbmUgTl9BQlMgMgotI2RlZmluZSBOX1RFWFQgNAotI2RlZmluZSBOX0RBVEEgNgotI2RlZmluZSBOX0JTUyA4Ci0jZGVmaW5lCU5fQ09NTQkweDEyCQkvKiBjb21tb24gKHZpc2libGUgaW4gc2hhcmVkIGxpYiBjb21tb25zKSAqLwotI2RlZmluZSBOX0ZOIDB4MUYJCS8qIEZpbGUgbmFtZSBvZiBhIC5vIGZpbGUgKi8KLQotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgdXNlZnVsbHkgYmUgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgMQotI2RlZmluZSBOX1RZUEUgMDM2Ci0jZGVmaW5lIE5fU1RBQiAwMzQwCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHlwZSBpbmRpY2F0ZXMgdGhlIGRlZmluaXRpb24gb2YgYSBzeW1ib2wgYXMgYmVpbmcKLSAgIGFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhbm90aGVyIHN5bWJvbC4gIFRoZSBvdGhlciBzeW1ib2wKLSAgIGFwcGVhcnMgYXMgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSwgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgc3ltYm9sLgotCi0gICBJbmRpcmVjdGlvbiBpcyBhc3ltbWV0cmljYWwuICBUaGUgb3RoZXIgc3ltYm9sJ3MgdmFsdWUgd2lsbCBiZSB1c2VkCi0gICB0byBzYXRpc2Z5IHJlcXVlc3RzIGZvciB0aGUgaW5kaXJlY3Qgc3ltYm9sLCBidXQgbm90IHZpY2UgdmVyc2EuCi0gICBJZiB0aGUgb3RoZXIgc3ltYm9sIGRvZXMgbm90IGhhdmUgYSBkZWZpbml0aW9uLCBsaWJyYXJpZXMgd2lsbAotICAgYmUgc2VhcmNoZWQgdG8gZmluZCBhIGRlZmluaXRpb24uICAqLwotCi0jZGVmaW5lIE5fSU5EUiAweGEKLQotLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KLSAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgotICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAotICAgZWxlbWVudCdzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KLSAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCi0KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKLSAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KLSAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCi0gICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLQotLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLwotI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLQotLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCi0jZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KLQotLyogV2FybmluZyBzeW1ib2wuIFRoZSB0ZXh0IGdpdmVzIGEgd2FybmluZyBtZXNzYWdlLCB0aGUgbmV4dCBzeW1ib2wKLSAgIGluIHRoZSB0YWJsZSB3aWxsIGJlIHVuZGVmaW5lZC4gV2hlbiB0aGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQsIHRoZQotICAgbWVzc2FnZSBpcyBwcmludGVkLiAgKi8KLQotI2RlZmluZQlOX1dBUk5JTkcgMHgxZQotCi0vKiBXZWFrIHN5bWJvbHMuICBUaGVzZSBhcmUgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBhLm91dCBmb3JtYXQuICBUaGUKLSAgIHNlbWFudGljcyBhcmUgdGhvc2Ugb2YgRUxGIHdlYWsgc3ltYm9scy4gIFdlYWsgc3ltYm9scyBhcmUgYWx3YXlzCi0gICBleHRlcm5hbGx5IHZpc2libGUuICBUaGUgTl9XRUFLPyB2YWx1ZXMgYXJlIHNxdWVlemVkIGludG8gdGhlCi0gICBhdmFpbGFibGUgc2xvdHMuICBUaGUgdmFsdWUgb2YgYSBOX1dFQUtVIHN5bWJvbCBpcyAwLiAgVGhlIHZhbHVlcwotICAgb2YgdGhlIG90aGVyIHR5cGVzIGFyZSB0aGUgZGVmaW5pdGlvbnMuICAqLwotI2RlZmluZSBOX1dFQUtVCTB4MGQJCS8qIFdlYWsgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0EgMHgwZQkJLyogV2VhayBhYnNvbHV0ZSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtUIDB4MGYJCS8qIFdlYWsgdGV4dCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtEIDB4MTAJCS8qIFdlYWsgZGF0YSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtCIDB4MTEJCS8qIFdlYWsgYnNzIHN5bWJvbC4gICovCi0MCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGVudW0gYW5kIHN0cnVjdCB3ZXJlIGJvcnJvd2VkIGZyb20gU3VuT1MncwotICAgL3Vzci9pbmNsdWRlL3N1bjQvYS5vdXQuaCAgYW5kIGV4dGVuZGVkIHRvIGhhbmRsZQotICAgb3RoZXIgbWFjaGluZXMuICBJdCBpcyBjdXJyZW50bHkgdXNlZCBvbiBTUEFSQyBhbmQgQU1EIDI5MDAwLgotCi0gICByZWxvY19leHRfYnl0ZXMgaXMgaG93IGl0IGxvb2tzIG9uIGRpc2suICByZWxvY19pbmZvX2V4dGVuZGVkIGlzCi0gICBob3cgd2UgbWlnaHQgcHJvY2VzcyBpdCBvbiBhIG5hdGl2ZSBob3N0LiAgKi8KLSNpZiBVU0VfRVhURU5ERURfUkVMT0MKLQotc3RydWN0IHJlbG9jX2V4dF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzNdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzFdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRlbmRbNF07Ci0gIH07Ci0KLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCTB4ODAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcJCTB4MUYKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcJMAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRQkweEY4Ci0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFCTMKLQotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkxMgkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgcmVsb2NfaW5mb19leHRlbmRlZAotewotICB1bnNpZ25lZCBsb25nIHJfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg6MjQ7Ci0jIGRlZmluZQlyX3N5bWJvbG51bSAgcl9pbmRleAotICB1bnNpZ25lZCByX2V4dGVybjoxOwotICB1bnNpZ25lZDoyOwotICAvKiAgUlMvNjAwMCBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGVudW0gYml0ZmllbGQKLQkgICAgZW51bSByZWxvY190eXBlIHJfdHlwZTo1OyAqLwotICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOwotICBsb25nIGludCByX2FkZGVuZDsKLX07Ci0KLSNlbHNlCi0KLS8qIFRoZSBzdGFuZGFyZCwgb2xkLWZhc2hpb25lZCwgQmVya2VsZXkgY29tcGF0aWJsZSByZWxvY2F0aW9uIHN0cnVjdCAqLwotCi0KLQotI2lmZGVmIFRDX0k4NjAKLS8qIE5PVEU6IHRocmVlIGJpdHMgbWF4LCBzZWUgc3RydWN0IHJlbG9jX2luZm9faTg2MC5yX3R5cGUgKi8KLWVudW0gaTg2MF9yZWxvY190eXBlCi0gIHsKLSAgICBOT19SRUxPQyA9IDAsIEJSQUREUiwgTE9XMCwgTE9XMSwgTE9XMiwgTE9XMywgTE9XNCwgU1BMSVQwLCBTUExJVDEsIFNQTElUMiwgUkVMT0NfMzIsCi0gIH07Ci0KLXR5cGVkZWYgZW51bSBpODYwX3JlbG9jX3R5cGUgcmVsb2NfdHlwZTsKLQotLyogTk9URTogdHdvIGJpdHMgbWF4LCBzZWUgcmVsb2NfaW5mb19pODYwLnJfdHlwZSAqLwotZW51bSBoaWdobG93X3R5cGUKLSAgewotICAgIE5PX1NQRUMgPSAwLCBQQUlSLCBISUdILCBISUdIQURKLAotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbmZvX2k4NjAKLXsKLSAgdW5zaWduZWQgbG9uZyByX2FkZHJlc3M7Ci0gIC8qCi0JICogVXNpbmcgYml0IGZpZWxkcyBoZXJlIGlzIGEgYmFkIGlkZWEgYmVjYXVzZSB0aGUgb3JkZXIgaXMgbm90IHBvcnRhYmxlLiA6LSgKLQkgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogY29tYmluaW5nIHRoZSB0d28gZmllbGQgc2ltcGxpZmllcyB0aGUgYXJndW1lbnQgcGFzc2luZyBpbiAibmV3X2ZpeCgpIiAqLwotICAvKiBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBleGlzdGluZyBTcGFyYyAjaWZkZWYncyAqLwotICAvKiByX3R5cGU6ICBoaWdobG93X3R5cGUgLSBiaXRzIDUsNDsgcmVsb2NfdHlwZSAtIGJpdHMgMy0wICovCi0gIHVuc2lnbmVkIGludCByX3R5cGU6NjsKLSAgbG9uZyByX2FkZGVuZDsKLX07Ci0KLSNlbmRpZiAvKiBUQ19JODYwICovCi0KLQotc3RydWN0IHJlbG9jX3N0ZF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzNdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzFdOwotICB9OwotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkweDYwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcJNQkvKiBUbyBzaGlmdCB0byB1bml0cyBwbGFjZSAqLwotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFCTB4MDYKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkweDEwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCTB4MDgKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkweDA0Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRQkweDA0Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCTB4MDIKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCTB4MDIKLQotI2RlZmluZQlSRUxPQ19TVERfU0laRQk4CS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLSNlbmRpZiAvKiBVU0VfRVhURU5ERURfUkVMT0MgKi8KLQotI2lmbmRlZiBDVVNUT01fUkVMT0NfRk9STUFUCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi17Ci0gIC8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLwotICBpbnQgcl9hZGRyZXNzOwotICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0Ci0JICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCi0JICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotCSAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCi0gIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOwotICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgotCSAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCi0JICAgaW4gZmlsZSdzIHRoZSBzeW1ib2wgdGFibGUuCi0JICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLQkgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKLQkgICAodGhlIE5fRVhUIGJpdCBtYXkgYmUgc2V0IGFsc28sIGJ1dCBzaWduaWZpZXMgbm90aGluZykuICAqLwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogVGhlIG5leHQgdGhyZWUgYml0cyBhcmUgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBzZWVtIHRvCi0JICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSNpZmRlZiBUQ19OUzMySwotICB1bnNpZ25lZCBpbnQgcl9ic3I6MTsKLSAgdW5zaWduZWQgaW50IHJfZGlzcDoyOwotI2Vsc2UKLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0jZW5kaWYgLyogVENfTlMzMksgKi8KLSAgLyogdW51c2VkICovCi0gIHVuc2lnbmVkIGludCByX3BhZDoxOwkJLyogUGFkZGluZyAtLSBzZXQgdG8gemVybyAqLwotfTsKLQotI2VuZGlmIC8qIENVU1RPTV9SRUxPQ19GT1JNQVQgKi8KLQotI2VuZGlmIC8qIF9fQV9PVVRfR05VX0hfXyAqLwotCi0vKiBlbmQgb2YgYW91dF9nbnUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYyBiL2dhcy9jb25maWcvYXRvZi1pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjBmZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDcxNSArMCwwIEBACi0vKiBhdG9mX2llZWUuYyAtIHR1cm4gYSBGbG9udW0gaW50byBhbiBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qIEZsb251bXMgcmV0dXJuZWQgaGVyZS4gICovCi1leHRlcm4gRkxPTlVNX1RZUEUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXI7Ci0KLXN0YXRpYyBpbnQgbmV4dF9iaXRzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgdW5nZXRfYml0cyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgUEFSQU1TICgoTElUVExFTlVNX1RZUEUgKikpOwotCi1leHRlcm4gY29uc3QgY2hhciBFWFBfQ0hBUlNbXTsKLS8qIFByZWNpc2lvbiBpbiBMaXR0bGVOdW1zLiAqLwotLyogRG9uJ3QgY291bnQgdGhlIGdhcCBpbiB0aGUgbTY4ayBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LiAgKi8KLSNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoNSkKLSNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCi0jZGVmaW5lIERfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBYX1BSRUNJU0lPTiAoNSkKLSNkZWZpbmUgUF9QUkVDSVNJT04gKDUpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrW10gPQotewotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDAxLAotICAweDAwMDAwMDAzLAotICAweDAwMDAwMDA3LAotICAweDAwMDAwMDBmLAotICAweDAwMDAwMDFmLAotICAweDAwMDAwMDNmLAotICAweDAwMDAwMDdmLAotICAweDAwMDAwMGZmLAotICAweDAwMDAwMWZmLAotICAweDAwMDAwM2ZmLAotICAweDAwMDAwN2ZmLAotICAweDAwMDAwZmZmLAotICAweDAwMDAxZmZmLAotICAweDAwMDAzZmZmLAotICAweDAwMDA3ZmZmLAotICAweDAwMDBmZmZmLAotICAweDAwMDFmZmZmLAotICAweDAwMDNmZmZmLAotICAweDAwMDdmZmZmLAotICAweDAwMGZmZmZmLAotICAweDAwMWZmZmZmLAotICAweDAwM2ZmZmZmLAotICAweDAwN2ZmZmZmLAotICAweDAwZmZmZmZmLAotICAweDAxZmZmZmZmLAotICAweDAzZmZmZmZmLAotICAweDA3ZmZmZmZmLAotICAweDBmZmZmZmZmLAotICAweDFmZmZmZmZmLAotICAweDNmZmZmZmZmLAotICAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmLAotfTsKLQwKLQotc3RhdGljIGludCBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOwotc3RhdGljIGludCBsaXR0bGVudW1zX2xlZnQ7Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotCi1zdGF0aWMgaW50Ci1uZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQotICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Ci17Ci0gIGludCByZXR1cm5fdmFsdWU7Ci0KLSAgaWYgKCFsaXR0bGVudW1zX2xlZnQpCi0gICAgcmV0dXJuICgwKTsKLSAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci0gICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOwotCi0gICAgICBpZiAoLS1saXR0bGVudW1zX2xlZnQpCi0JewotCSAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOwotCSAgLS1saXR0bGVudW1fcG9pbnRlcjsKLQkgIHJldHVybl92YWx1ZSB8PSAoKmxpdHRsZW51bV9wb2ludGVyID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pICYgbWFza1tudW1iZXJfb2ZfYml0c107Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmICgqbGl0dGxlbnVtX3BvaW50ZXIgPj4gYml0c19sZWZ0X2luX2xpdHRsZW51bSk7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLS8qIE51bSBoYWQgYmV0dGVyIGJlIGxlc3MgdGhhbiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgKi8KLXN0YXRpYyB2b2lkCi11bmdldF9iaXRzIChudW0pCi0gICAgIGludCBudW07Ci17Ci0gIGlmICghbGl0dGxlbnVtc19sZWZ0KQotICAgIHsKLSAgICAgICsrbGl0dGxlbnVtX3BvaW50ZXI7Ci0gICAgICArK2xpdHRsZW51bXNfbGVmdDsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBudW07Ci0gICAgfQotICBlbHNlIGlmIChiaXRzX2xlZnRfaW5fbGl0dGxlbnVtICsgbnVtID4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBudW0gLSAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gYml0c19sZWZ0X2luX2xpdHRsZW51bSk7Ci0gICAgICArK2xpdHRsZW51bV9wb2ludGVyOwotICAgICAgKytsaXR0bGVudW1zX2xlZnQ7Ci0gICAgfQotICBlbHNlCi0gICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSArPSBudW07Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3JkcykKLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwotewotICBhc19iYWQgKF8oImNhbm5vdCBjcmVhdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIikpOwotICB3b3Jkc1swXSA9IChMSVRUTEVOVU1fVFlQRSkgKCh1bnNpZ25lZCkgLTEpID4+IDE7IC8qIFplcm8gdGhlIGxlZnRtb3N0IGJpdCAqLwotICB3b3Jkc1sxXSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci0gIHdvcmRzWzJdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLSAgd29yZHNbM10gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotICB3b3Jkc1s0XSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci0gIHdvcmRzWzVdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKglXYXJuaW5nOiB0aGlzIHJldHVybnMgMTYtYml0IExJVFRMRU5VTXMuIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIJKgotICoJdG8gZmlndXJlIG91dCBhbnkgYWxpZ25tZW50IHByb2JsZW1zIGFuZCB0byBjb25zcGlyZSBmb3IgdGhlCSoKLSAqCWJ5dGVzL3dvcmQgdG8gYmUgZW1pdHRlZCBpbiB0aGUgcmlnaHQgb3JkZXIuIEJpZ2VuZGlhbnMgYmV3YXJlIQkqCi0gKgkJCQkJCQkJCSoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE5vdGUgdGhhdCBhdG9mLWllZWUgYWx3YXlzIGhhcyBYIGFuZCBQIHByZWNpc2lvbnMgZW5hYmxlZC4gIGl0IGlzIHVwCi0gICB0byBtZF9hdG9mIHRvIGZpbHRlciB0aGVtIG91dCBpZiB0aGUgdGFyZ2V0IG1hY2hpbmUgZG9lcyBub3Qgc3VwcG9ydAotICAgdGhlbS4gICovCi0KLS8qIFJldHVybnMgcG9pbnRlciBwYXN0IHRleHQgY29uc3VtZWQuICovCi1jaGFyICoKLWF0b2ZfaWVlZSAoc3RyLCB3aGF0X2tpbmQsIHdvcmRzKQotICAgICBjaGFyICpzdHI7CQkJLyogVGV4dCB0byBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KLSAgICAgY2hhciB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gIFRoZSAxc3QgTUFYX1BSRUNJU0lPTiBhcmUKLSAgICAgemVyb2VkLCB0aGUgbGFzdCBjb250YWluIGZsb251bSBiaXRzLiAqLwotICBzdGF0aWMgTElUVExFTlVNX1RZUEUgYml0c1tNQVhfUFJFQ0lTSU9OICsgTUFYX1BSRUNJU0lPTiArIEdVQVJEXTsKLSAgY2hhciAqcmV0dXJuX3ZhbHVlOwotICAvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmb3JtYXQuICovCi0gIGludCBwcmVjaXNpb247Ci0gIGxvbmcgZXhwb25lbnRfYml0czsKLSAgRkxPTlVNX1RZUEUgc2F2ZV9nZW5fZmxvbnVtOwotCi0gIC8qIFdlIGhhdmUgdG8gc2F2ZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgYmVjYXVzZSBpdAotICAgICBjb250YWlucyBzdG9yYWdlIGFsbG9jYXRpb24gYWJvdXQgdGhlIGFycmF5IG9mIExJVFRMRU5VTXMgd2hlcmUKLSAgICAgdGhlIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gIFdlIHdpbGwgYWxsb2NhdGUgb3VyIG93biBhcnJheSBvZgotICAgICBsaXR0bGVudW1zIGJlbG93LCBidXQgaGF2ZSB0byByZXN0b3JlIHRoZSBnbG9iYWwgb25lIG9uIGV4aXQuICAqLwotICBzYXZlX2dlbl9mbG9udW0gPSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyA9IGJpdHMgKyBNQVhfUFJFQ0lTSU9OOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5oaWdoID0gTlVMTDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyID0gTlVMTDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuZXhwb25lbnQgPSAwOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID0gJ1wwJzsKLQotICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgbmVjZXNzYXJ5OiB0aGUgaGlnaGVzdCBmbG9udW0gbWF5Ci0gICAgIGhhdmUgMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0KLSAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gIHN3aXRjaCAod2hhdF9raW5kKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWNpc2lvbiA9IEZfUFJFQ0lTSU9OOwotICAgICAgZXhwb25lbnRfYml0cyA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlY2lzaW9uID0gRF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ2UnOgotICAgIGNhc2UgJ0UnOgotICAgICAgcHJlY2lzaW9uID0gWF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gMTU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotCi0gICAgICBwcmVjaXNpb24gPSBQX1BSRUNJU0lPTjsKLSAgICAgIGV4cG9uZW50X2JpdHMgPSAtMTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgfQotCi0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmhpZ2gKLSAgICA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsIEVYUF9DSEFSUywKLQkJICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICB9Ci0gIGdlbl90b193b3JkcyAod29yZHMsIHByZWNpc2lvbiwgZXhwb25lbnRfYml0cyk7Ci0KLSAgLyogUmVzdG9yZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIncyBzdG9yYWdlIGFsbG9jIChhbmQKLSAgICAgZXZlcnl0aGluZyBlbHNlKS4gICovCi0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gc2F2ZV9nZW5fZmxvbnVtOwotCi0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19Ci0KLS8qIFR1cm4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgaW50byBhIHJlYWwgZmxvYXQvZG91YmxlL2V4dGVuZGVkLiAgKi8KLWludAotZ2VuX3RvX3dvcmRzICh3b3JkcywgcHJlY2lzaW9uLCBleHBvbmVudF9iaXRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci0gICAgIGludCBwcmVjaXNpb247Ci0gICAgIGxvbmcgZXhwb25lbnRfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZSA9IDA7Ci0KLSAgbG9uZyBleHBvbmVudF8xOwotICBsb25nIGV4cG9uZW50XzI7Ci0gIGxvbmcgZXhwb25lbnRfMzsKLSAgbG9uZyBleHBvbmVudF80OwotICBpbnQgZXhwb25lbnRfc2tpcHBhZ2U7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmQxOwotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIExJVFRMRU5VTV9UWVBFICp3b3Jkc19lbmQ7Ci0KLSAgd29yZHNfZW5kID0gd29yZHMgKyBwcmVjaXNpb247Ci0jaWZkZWYgVENfTTY4SwotICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotICAgIC8qIE9uIHRoZSBtNjhrIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0IGhhcyBhIGdhcCBvZiAxNiBiaXRzCi0gICAgICAgYmV0d2VlbiB0aGUgZXhwb25lbnQgYW5kIHRoZSBtYW50aXNzYS4gICovCi0gICAgd29yZHNfZW5kKys7Ci0jZW5kaWYKLQotICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93ID4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyKQotICAgIHsKLSAgICAgIC8qIDAuMGUwIHNlZW4uICovCi0gICAgICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0Jd29yZHNbMF0gPSAweDAwMDA7Ci0gICAgICBlbHNlCi0Jd29yZHNbMF0gPSAweDgwMDA7Ci0gICAgICBtZW1zZXQgKCZ3b3Jkc1sxXSwgJ1wwJywKLQkgICAgICAod29yZHNfZW5kIC0gd29yZHMgLSAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0KLSAgLyogTmFOOiAgRG8gdGhlIHJpZ2h0IHRoaW5nICovCi0gIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09IDApCi0gICAgewotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHhmZmZmOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzNdID0gMHhmZmZmOwotCSAgd29yZHNbNF0gPSAweGZmZmY7Ci0JICB3b3Jkc1s1XSA9IDB4ZmZmZjsKLSNlbHNlIC8qICEgVENfTTY4SyAqLwotI2lmZGVmIFRDX0kzODYKLQkgIHdvcmRzWzBdID0gMHhmZmZmOwotCSAgd29yZHNbMV0gPSAweGMwMDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX0kzODYgKi8KLQkgIGFib3J0ICgpOwotI2VuZGlmIC8qICEgVENfSTM4NiAqLwotI2VuZGlmIC8qICEgVENfTTY4SyAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHhmZmZmOwotCSAgd29yZHNbMl0gPSAweGZmZmY7Ci0JICB3b3Jkc1szXSA9IDB4ZmZmZjsKLQl9Ci0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnUCcpCi0gICAgewotICAgICAgLyogK0lORjogIERvIHRoZSByaWdodCB0aGluZyAqLwotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2Y4MDsKLQkgIHdvcmRzWzFdID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0JewotI2lmZGVmIFRDX002OEsKLQkgIHdvcmRzWzBdID0gMHg3ZmZmOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotCSAgd29yZHNbNV0gPSAwOwotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTM4NgotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDB4ODAwMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQkgIHdvcmRzWzRdID0gMDsKLSNlbHNlIC8qICEgVENfSTM4NiAqLwotCSAgYWJvcnQgKCk7Ci0jZW5kaWYgLyogISBUQ19JMzg2ICovCi0jZW5kaWYgLyogISBUQ19NNjhLICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmRzWzBdID0gMHg3ZmYwOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCX0KLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJ04nKQotICAgIHsKLSAgICAgIC8qIE5lZ2F0aXZlIElORiAqLwotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4ZmY4MDsKLQkgIHdvcmRzWzFdID0gMHgwOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweGZmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0JICB3b3Jkc1s1XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX002OEsgKi8KLSNpZmRlZiBUQ19JMzg2Ci0JICB3b3Jkc1swXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzFdID0gMHg4MDAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotI2Vsc2UgLyogISBUQ19JMzg2ICovCi0JICBhYm9ydCAoKTsKLSNlbmRpZiAvKiAhIFRDX0kzODYgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yZHNbMF0gPSAweGZmZjA7Ci0JICB3b3Jkc1sxXSA9IDB4MDsKLQkgIHdvcmRzWzJdID0gMHgwOwotCSAgd29yZHNbM10gPSAweDA7Ci0JfQotICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotICAgIH0KLSAgLyoKLSAgICogVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgd2Ugc3VwcG9ydCBoYXZlOgotICAgKiBCaXQgMTUgaXMgc2lnbiBiaXQuCi0gICAqIEJpdHMgMTQ6biBhcmUgZXhjZXNzLXdoYXRldmVyIGV4cG9uZW50LgotICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0gICAqIEJpdHMgMTU6MCBvZiB0aGUgbmV4dCB3b3JkKHMpIGFyZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdHMuCi0gICAqCi0gICAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotICAgKiBtYW50aXNzYS4KLSAgICovCi0gIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0gIGxpdHRsZW51bV9wb2ludGVyID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyOwotICBsaXR0bGVudW1zX2xlZnQgPSAoMQotCQkgICAgICsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCi0JCSAgICAgLSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cpOwotICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0gIGZvciAoZXhwb25lbnRfc2tpcHBhZ2UgPSAwOyAhbmV4dF9iaXRzICgxKTsgKytleHBvbmVudF9za2lwcGFnZSk7OwotICBleHBvbmVudF8xID0gKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50Ci0JCSsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCi0JCSsgMQotCQktIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyk7Ci0gIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbgotICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIuICovCi0gIGV4cG9uZW50XzIgPSBleHBvbmVudF8xICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotICAvKiBSYWRpeCAyLiAqLwotICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotICAvKiBGb3JnZXQgbGVhZGluZyB6ZXJvcywgZm9yZ2V0IDFzdCBiaXQuICovCi0gIGV4cG9uZW50XzQgPSBleHBvbmVudF8zICsgKCgxIDw8IChleHBvbmVudF9iaXRzIC0gMSkpIC0gMik7Ci0gIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotICBscCA9IHdvcmRzOwotCi0gIC8qIFdvcmQgMS4gU2lnbiwgZXhwb25lbnQgYW5kIHBlcmhhcHMgaGlnaCBiaXRzLiAqLwotICB3b3JkMSA9ICgoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0JICAgPyAwCi0JICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKLQotICAvKiBBc3N1bWUgMidzIGNvbXBsZW1lbnQgaW50ZWdlcnMuICovCi0gIGlmIChleHBvbmVudF80IDw9IDApCi0gICAgewotICAgICAgaW50IHByZWNfYml0czsKLSAgICAgIGludCBudW1fYml0czsKLQotICAgICAgdW5nZXRfYml0cyAoMSk7Ci0gICAgICBudW1fYml0cyA9IC1leHBvbmVudF80OwotICAgICAgcHJlY19iaXRzID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTICogcHJlY2lzaW9uIC0gKGV4cG9uZW50X2JpdHMgKyAxICsgbnVtX2JpdHMpOwotI2lmZGVmIFRDX0kzODYKLSAgICAgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKLQl7Ci0JICAvKiBPbiB0aGUgaTM4NiBhIGRlbm9ybWFsaXplZCBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQgaXMKLQkgICAgIHNoaWZ0ZWQgZG93biBieSBvbmUsIGVmZmVjdGl2ZWx5IGRlY3JlYXNpbmcgdGhlIGV4cG9uZW50Ci0JICAgICBiaWFzIGJ5IG9uZS4gICovCi0JICBwcmVjX2JpdHMgLT0gMTsKLQkgIG51bV9iaXRzICs9IDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmIChudW1fYml0cyA+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBleHBvbmVudF9iaXRzKQotCXsKLQkgIC8qIEJpZ2dlciB0aGFuIG9uZSBsaXR0bGVudW0gKi8KLQkgIG51bV9iaXRzIC09IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIGV4cG9uZW50X2JpdHM7Ci0JICAqbHArKyA9IHdvcmQxOwotCSAgaWYgKG51bV9iaXRzICsgZXhwb25lbnRfYml0cyArIDEgPiBwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHsKLQkgICAgICAvKiBFeHBvbmVudCBvdmVyZmxvdyAqLwotCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkgICAgICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci0JICAgIH0KLSNpZmRlZiBUQ19NNjhLCi0JICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JICAgICpscCsrID0gMDsKLSNlbmRpZgotCSAgd2hpbGUgKG51bV9iaXRzID49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgewotCSAgICAgIG51bV9iaXRzIC09IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgICAqbHArKyA9IDA7Ci0JICAgIH0KLQkgIGlmIChudW1fYml0cykKLQkgICAgKmxwKysgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIChudW1fYml0cykpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JICAgIHsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotI2lmZGVmIFRDX002OEsKLQkgICAgICAqbHArKyA9IDA7Ci0jZW5kaWYKLQkgICAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtX2JpdHMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3b3JkMSB8PSBuZXh0X2JpdHMgKChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIChleHBvbmVudF9iaXRzICsgbnVtX2JpdHMpKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKGxwIDwgd29yZHNfZW5kKQotCSpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCi0gICAgICAvKiBSb3VuZCB0aGUgbWFudGlzc2EgdXAsIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIG51bWJlciAqLwotICAgICAgaWYgKG5leHRfYml0cyAoMSkpCi0JewotCSAgLS1scDsKLQkgIGlmIChwcmVjX2JpdHMgPj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICB7Ci0JICAgICAgaW50IG4gPSAwOwotCSAgICAgIGludCB0bXBfYml0czsKLQotCSAgICAgIG4gPSAwOwotCSAgICAgIHRtcF9iaXRzID0gcHJlY19iaXRzOwotCSAgICAgIHdoaWxlICh0bXBfYml0cyA+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkJewotCQkgIGlmIChscFtuXSAhPSAoTElUVExFTlVNX1RZUEUpIC0gMSkKLQkJICAgIGJyZWFrOwotCQkgIC0tbjsKLQkJICB0bXBfYml0cyAtPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCX0KLQkgICAgICBpZiAodG1wX2JpdHMgPiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJICB8fCAobHBbbl0gJiBtYXNrW3RtcF9iaXRzXSkgIT0gbWFza1t0bXBfYml0c10KLQkJICB8fCAocHJlY19iaXRzICE9IChwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJCQkgICAgLSBleHBvbmVudF9iaXRzIC0gMSkKLSNpZmRlZiBUQ19JMzg2Ci0JCSAgICAgIC8qIEFuIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdCB3aXRoIG9ubHkgdGhlIGludGVnZXIKLQkJCSBiaXQgc2V0IHdvdWxkIGJlIGludmFsaWQuICBUaGF0IG11c3QgYmUgY29udmVydGVkCi0JCQkgdG8gdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KLQkJICAgICAgJiYgIShwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04KLQkJCSAgICYmIHByZWNfYml0cyA9PSAocHJlY2lzaW9uICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCi0JCQkJCSAgICAtIGV4cG9uZW50X2JpdHMgLSAyKSkKLSNlbmRpZgotCQkgICAgICApKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotCQkgIGZvciAoY2FycnkgPSAxOyBjYXJyeSAmJiAobHAgPj0gd29yZHMpOyBscC0tKQotCQkgICAgewotCQkgICAgICBjYXJyeSA9ICpscCArIGNhcnJ5OwotCQkgICAgICAqbHAgPSBjYXJyeTsKLQkJICAgICAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYW4gb3ZlcmZsb3cgb2YgdGhlIGRlbm9ybWFsIG51bWJlcnMuICBXZQotICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBmb3JnZXQgd2hhdCB3ZSBoYXZlIHByb2R1Y2VkLCBhbmQgaW5zdGVhZAotICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KLQkJICBscCA9IHdvcmRzOwotCQkgIHdvcmQxID0gKChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICcrJykKLQkJCSAgID8gMAotCQkJICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKLQkJICB3b3JkMSB8PSAoMQotCQkJICAgIDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKLQkJCQktIGV4cG9uZW50X2JpdHMpKTsKLQkJICAqbHArKyA9IHdvcmQxOwotI2lmZGVmIFRDX0kzODYKLQkJICAvKiBTZXQgdGhlIGludGVnZXIgYml0IGluIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LgotCQkgICAgIFRoaXMgY2Fubm90IGhhcHBlbiBvbiB0aGUgbTY4ayB3aGVyZSB0aGUgbWFudGlzc2EKLQkJICAgICBqdXN0IG92ZXJmbG93cyBpbnRvIHRoZSBpbnRlZ2VyIGJpdCBhYm92ZS4gICovCi0JCSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQkJICAgICpscCsrID0gMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSk7Ci0jZW5kaWYKLQkJICB3aGlsZSAobHAgPCB3b3Jkc19lbmQpCi0JCSAgICAqbHArKyA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICAqbHAgKz0gMTsKLQl9Ci0KLSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQgbG9uZykgZXhwb25lbnRfNCA+PSBtYXNrW2V4cG9uZW50X2JpdHNdKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBFeHBvbmVudCBvdmVyZmxvdy4gTG9zZSBpbW1lZGlhdGVseS4KLSAgICAgICAqLwotCi0gICAgICAvKgotICAgICAgICogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0gICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotICAgICAgICovCi0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdvcmQxIHw9IChleHBvbmVudF80IDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSBleHBvbmVudF9iaXRzKSkKLQl8IG5leHRfYml0cyAoKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpIC0gZXhwb25lbnRfYml0cyk7Ci0gICAgfQotCi0gICpscCsrID0gd29yZDE7Ci0KLSAgLyogWF9QUkVDSVNJT04gaXMgc3BlY2lhbDogb24gdGhlIDY4aywgaXQgaGFzIDE2IGJpdHMgb2YgemVybyBpbiB0aGUKLSAgICAgbWlkZGxlLiAgRWl0aGVyIHdheSwgaXQgaXMgdGhlbiBmb2xsb3dlZCBieSBhIDEgYml0LiAqLwotICBpZiAoZXhwb25lbnRfYml0cyA9PSAxNSAmJiBwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0gICAgewotI2lmZGVmIFRDX002OEsKLSAgICAgICpscCsrID0gMDsKLSNlbmRpZgotICAgICAgKmxwKysgPSAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKLQkgICAgICAgfCBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKTsKLSAgICB9Ci0KLSAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0gIHdoaWxlIChscCA8IHdvcmRzX2VuZCkKLSAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQotICBpZiAobmV4dF9iaXRzICgxKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotICAgICAgLyoKLSAgICAgICAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLSAgICAgICAqIFRoZSBjdW5uaW5nIGRlc2lnbiBvZiB0aGVzZSBoaWRkZW4tMSBmbG9hdHMgcGVybWl0cwotICAgICAgICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0gICAgICAgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotICAgICAgICogaGlnaGVzdC1vcmRlciBiaXQgb2YgdGhlIGxvd2VzdC1vcmRlciB3b3JkIGZsaXBzLgotICAgICAgICogSXMgdGhhdCBjbGVhcj8KLSAgICAgICAqLwotCi0gICAgICAvKiAjaWYgKHNpemVvZihjYXJyeSkpIDwgKChzaXplb2YoYml0c1swXSkgKiBCSVRTX1BFUl9DSEFSKSArIDIpCi0JIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JIFdlIG5lZWQgdGhhdCBleHRyYSBiaXQgdG8gaG9sZCBhIGNhcnJ5IGR1cmluZyBhIExJVFRMRU5VTSBjYXJyeQotCSBwcm9wYWdhdGlvbi4gQW5vdGhlciBleHRyYSBiaXQgKGtlcHQgMCkgd2lsbCBhc3N1cmUgdXMgdGhhdCB3ZQotCSBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JIHBlcm1pdHMgdXMgdG8gcHJvcGFnYXRlIHRoZSBjYXJyeSB3aXRob3V0IGFueSBtYXNraW5nIG9mIGJpdHMuCi0JICNlbmRpZiAqLwotICAgICAgZm9yIChjYXJyeSA9IDEsIGxwLS07IGNhcnJ5ICYmIChscCA+PSB3b3Jkcyk7IGxwLS0pCi0JewotCSAgY2FycnkgPSAqbHAgKyBjYXJyeTsKLQkgICpscCA9IGNhcnJ5OwotCSAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQl9Ci0gICAgICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JewotCSAgLyogRXh0ZW5kZWQgcHJlY2lzaW9uIG51bWJlcnMgaGF2ZSBhbiBleHBsaWNpdCBpbnRlZ2VyIGJpdAotCSAgICAgdGhhdCB3ZSBtYXkgaGF2ZSB0byByZXN0b3JlLiAgKi8KLQkgIGlmIChscCA9PSB3b3JkcykKLQkgICAgewotI2lmZGVmIFRDX002OEsKLQkgICAgICAvKiBPbiB0aGUgbTY4ayB0aGVyZSBpcyBhIGdhcCBvZiAxNiBiaXRzLiAgV2UgbXVzdAotCQkgZXhwbGljaXRseSBwcm9wYWdhdGUgdGhlIGNhcnJ5IGludG8gdGhlIGV4cG9uZW50LiAqLwotCSAgICAgIHdvcmRzWzBdICs9IHdvcmRzWzFdOwotCSAgICAgIHdvcmRzWzFdID0gMDsKLQkgICAgICBscCsrOwotI2VuZGlmCi0JICAgICAgLyogUHV0IGJhY2sgdGhlIGludGVnZXIgYml0LiAgKi8gCi0JICAgICAgbHBbMV0gfD0gMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSk7Ci0JICAgIH0KLSAJfQotICAgICAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCXsKLQkgIC8qIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkgICAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotCSAgICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLQkgICAqLwotCSAgKndvcmRzICY9IH4oMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpOwotCSAgLyogbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOyAqLwotCSAgLyogcmV0dXJuIHJldHVybl92YWx1ZTsgKi8KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLSNpZiAwIC8qIHVudXNlZCAqLwotLyogVGhpcyByb3V0aW5lIGlzIGEgcmVhbCBrbHVkZ2UuICBTb21lb25lIHJlYWxseSBzaG91bGQgZG8gaXQgYmV0dGVyLAotICAgYnV0IEknbSB0b28gbGF6eSwgYW5kIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIHN0dWZmIGFsbCB0b28gd2VsbAotICAgYW55d2F5LiAoSkYpICAqLwotc3RhdGljIHZvaWQKLWludF90b19nZW4gKHgpCi0gICAgIGxvbmcgeDsKLXsKLSAgY2hhciBidWZbMjBdOwotICBjaGFyICpidWZwOwotCi0gIHNwcmludGYgKGJ1ZiwgIiVsZCIsIHgpOwotICBidWZwID0gJmJ1ZlswXTsKLSAgaWYgKGF0b2ZfZ2VuZXJpYyAoJmJ1ZnAsICIuIiwgRVhQX0NIQVJTLCAmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpKQotICAgIGFzX2JhZCAoXygiRXJyb3IgY29udmVydGluZyBudW1iZXIgdG8gZmxvYXRpbmcgcG9pbnQgKEV4cG9uZW50IG92ZXJmbG93PykiKSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFRFU1QKLWNoYXIgKgotcHJpbnRfZ2VuIChnZW4pCi0gICAgIEZMT05VTV9UWVBFICpnZW47Ci17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGFyclsxMF07Ci0gIGRvdWJsZSBkdjsKLSAgZmxvYXQgZnY7Ci0gIHN0YXRpYyBjaGFyIHNidWZbNDBdOwotCi0gIGlmIChnZW4pCi0gICAgewotICAgICAgZiA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotICAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPSAqZ2VuOwotICAgIH0KLSAgZ2VuX3RvX3dvcmRzICgmYXJyWzBdLCA0LCAxMSk7Ci0gIG1lbWNweSAoJmR2LCAmYXJyWzBdLCBzaXplb2YgKGRvdWJsZSkpOwotICBzcHJpbnRmIChzYnVmLCAiJXggJXggJXggJXggJS4xNEcgICAiLCBhcnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sIGR2KTsKLSAgZ2VuX3RvX3dvcmRzICgmYXJyWzBdLCAyLCA4KTsKLSAgbWVtY3B5ICgmZnYsICZhcnJbMF0sIHNpemVvZiAoZmxvYXQpKTsKLSAgc3ByaW50ZiAoc2J1ZiArIHN0cmxlbiAoc2J1ZiksICIleCAleCAlLjEyZ1xuIiwgYXJyWzBdLCBhcnJbMV0sIGZ2KTsKLQotICBpZiAoZ2VuKQotICAgIHsKLSAgICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gZjsKLSAgICB9Ci0KLSAgcmV0dXJuIChzYnVmKTsKLX0KLQotI2VuZGlmCi0KLS8qIGVuZCBvZiBhdG9mLWllZWUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLXRhaG9lLmMgYi9nYXMvY29uZmlnL2F0b2YtdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwNDg1Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2F0b2YtdGFob2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0KLS8qIGF0b2ZfdGFob2UuYyAtIHR1cm4gYSBzdHJpbmcgaW50byBhIFRhaG9lIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgKi8KLQotLyogVGhpcyBpcyByZWFsbHkgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgYXRvZl92YXguYy4gSSBnbG9tbWVkIGl0IHdob2xlc2FsZQotICAgYW5kIHRoZW4gc2hhdmVkIGl0IGRvd24uIEkgZG9uJ3QgZXZlbiBrbm93IGhvdyBpdCB3b3Jrcy4gKERvbid0IHlvdSBmaW5kCi0gICBteSBob25lc3R5IHJlZnJlc2hpbmc/ICBib3dlbkBjcy5CdWZmYWxvLkVEVSAoRGV2b24gRSBCb3dlbikKLQotICAgSSBkb24ndCBhbGxvdyB1cHBlcmNhc2UgbGV0dGVycyBpbiB0aGUgcHJlY2lzaW9uIGRlc2NycGl0b3JzLiBJZSAnZicgYW5kCi0gICAnZCcgYXJlIGFsbG93ZWQgYnV0ICdGJyBhbmQgJ0QnIGFyZW4ndCAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogUHJlY2lzaW9uIGluIExpdHRsZU51bXMuICovCi0jZGVmaW5lIE1BWF9QUkVDSVNJT04gKDQpCi0jZGVmaW5lIERfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBGX1BSRUNJU0lPTiAoMikKLQotLyogUHJlY2lzaW9uIGluIGNoYXJzLiAqLwotI2RlZmluZSBEX1BSRUNJU0lPTl9DSEFSUyAoOCkKLSNkZWZpbmUgRl9QUkVDSVNJT05fQ0hBUlMgKDQpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1zdGF0aWMgY29uc3QgbG9uZyBpbnQgbWFza1tdID0KLXsKLSAgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwMSwKLSAgMHgwMDAwMDAwMywKLSAgMHgwMDAwMDAwNywKLSAgMHgwMDAwMDAwZiwKLSAgMHgwMDAwMDAxZiwKLSAgMHgwMDAwMDAzZiwKLSAgMHgwMDAwMDA3ZiwKLSAgMHgwMDAwMDBmZiwKLSAgMHgwMDAwMDFmZiwKLSAgMHgwMDAwMDNmZiwKLSAgMHgwMDAwMDdmZiwKLSAgMHgwMDAwMGZmZiwKLSAgMHgwMDAwMWZmZiwKLSAgMHgwMDAwM2ZmZiwKLSAgMHgwMDAwN2ZmZiwKLSAgMHgwMDAwZmZmZiwKLSAgMHgwMDAxZmZmZiwKLSAgMHgwMDAzZmZmZiwKLSAgMHgwMDA3ZmZmZiwKLSAgMHgwMDBmZmZmZiwKLSAgMHgwMDFmZmZmZiwKLSAgMHgwMDNmZmZmZiwKLSAgMHgwMDdmZmZmZiwKLSAgMHgwMGZmZmZmZiwKLSAgMHgwMWZmZmZmZiwKLSAgMHgwM2ZmZmZmZiwKLSAgMHgwN2ZmZmZmZiwKLSAgMHgwZmZmZmZmZiwKLSAgMHgxZmZmZmZmZiwKLSAgMHgzZmZmZmZmZiwKLSAgMHg3ZmZmZmZmZiwKLSAgMHhmZmZmZmZmZgotfTsKLQwKLQotLyogU2hhcmVkIGJldHdlZW4gZmxvbnVtX2dlbjJ0YWhvZSBhbmQgbmV4dF9iaXRzICovCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOwotCi0jaWYgX19TVERDX18gPT0gMQotCi1pbnQgZmxvbnVtX2dlbjJ0YWhvZSAoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwgTElUVExFTlVNX1RZUEUgKiB3b3Jkcyk7Ci0KLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotCi1pbnQgZmxvbnVtX2dlbjJ0YWhvZSAoKTsKLQotI2VuZGlmIC8qIG5vdCBfX1NURENfXyAqLwotCi0KLXN0YXRpYyBpbnQKLW5leHRfYml0cyAobnVtYmVyX29mX2JpdHMpCi0gICAgIGludCBudW1iZXJfb2ZfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsKLQotICBpZiAobGl0dGxlbnVtX3BvaW50ZXIgPCBsaXR0bGVudW1fZW5kKQotICAgIHJldHVybiAwOwotICBpZiAobnVtYmVyX29mX2JpdHMgPj0gYml0c19sZWZ0X2luX2xpdHRsZW51bSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW2JpdHNfbGVmdF9pbl9saXR0bGVudW1dICYgKmxpdHRsZW51bV9wb2ludGVyOwotICAgICAgbnVtYmVyX29mX2JpdHMgLT0gYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLSAgICAgIHJldHVybl92YWx1ZSA8PD0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBsaXR0bGVudW1fcG9pbnRlci0tOwotICAgICAgaWYgKGxpdHRsZW51bV9wb2ludGVyID49IGxpdHRsZW51bV9lbmQpCi0JcmV0dXJuX3ZhbHVlIHw9ICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiAoYml0c19sZWZ0X2luX2xpdHRsZW51bSkpICYKLQkgIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmCi0JKCgqbGl0dGxlbnVtX3BvaW50ZXIpID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsKLXsKLSAgKndvcmRzID0gMHg4MDAwOwkJLyogRmxvYXRpbmcgUmVzZXJ2ZWQgT3BlcmFuZCBDb2RlICovCi19Ci0MCi1zdGF0aWMgaW50CQkJLyogMCBtZWFucyBsZXR0ZXIgaXMgT0suICovCi13aGF0X2tpbmRfb2ZfZmxvYXQgKGxldHRlciwgcHJlY2lzaW9uUCwgZXhwb25lbnRfYml0c1ApCi0gICAgIGNoYXIgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KLSAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCi0gICAgIGxvbmcgaW50ICpleHBvbmVudF9iaXRzUDsJLyogTnVtYmVyIG9mIGV4cG9uZW50IGJpdHMuICovCi17Ci0gIGludCByZXR2YWw7CQkJLyogMDogT0suICovCi0KLSAgcmV0dmFsID0gMDsKLSAgc3dpdGNoIChsZXR0ZXIpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgKnByZWNpc2lvblAgPSBGX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgKnByZWNpc2lvblAgPSBEX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR2YWwgPSA2OTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKgkJCQkJCQkJCSoKLSoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgotKgl3aGF0IHRoZSBWQVggdGhpbmtzIGluLiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZpZ3VyZQkqCi0qCW91dCBhbnkgYWxpZ25tZW50IHByb2JsZW1zIGFuZCB0byBjb25zcGlyZSBmb3IgdGhlIGJ5dGVzL3dvcmQJKgotKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCi0qCQkJCQkJCQkJKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotYXRvZl90YWhvZSAoc3RyLCB3aGF0X2tpbmQsIHdvcmRzKQotICAgICBjaGFyICpzdHI7CQkJLyogVGV4dCB0byBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KLSAgICAgY2hhciB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KLSAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCi0gIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgbG9uZyBpbnQgZXhwb25lbnRfYml0czsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGYubG93ID0gYml0cyArIE1BWF9QUkVDSVNJT047Ci0gIGYuaGlnaCA9IE5VTEw7Ci0gIGYubGVhZGVyID0gTlVMTDsKLSAgZi5leHBvbmVudCA9IE5VTEw7Ci0gIGYuc2lnbiA9ICdcMCc7Ci0KLSAgaWYgKHdoYXRfa2luZF9vZl9mbG9hdCAod2hhdF9raW5kLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cykpCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogV2UgbG9zdC4gKi8KLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICB9Ci0gIGlmIChyZXR1cm5fdmFsdWUpCi0gICAgewotICAgICAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gICAgICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgKi8KLSAgICAgIC8qIG5lY2Vzc2FyeTogdGhlIGhpZ2hlc3QgZmxvbnVtIG1heSBoYXZlICovCi0gICAgICAvKiAxNSBsZWFkaW5nIDAgYml0cywgc28gY291bGQgYmUgdXNlbGVzcy4gKi8KLSAgICAgIGYuaGlnaCA9IGYubG93ICsgcHJlY2lzaW9uIC0gMSArIEdVQVJEOwotCi0gICAgICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsICJlRSIsICZmKSkKLQl7Ci0JICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiB3ZSBsb3N0ICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmbG9udW1fZ2VuMnRhaG9lICh3aGF0X2tpbmQsICZmLCB3b3JkcykpCi0JICAgIHsKLQkgICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotDAotLyoKLSAqIEluOiBhIGZsb251bSwgYSBUYWhvZSBmbG9hdGluZyBwb2ludCBmb3JtYXQuCi0gKiBPdXQ6IGEgVGFob2UgZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCi0gKi8KLQotaW50CQkJCS8qIDA6IE9LLiAqLwotZmxvbnVtX2dlbjJ0YWhvZSAoZm9ybWF0X2xldHRlciwgZiwgd29yZHMpCi0gICAgIGNoYXIgZm9ybWF0X2xldHRlcjsJLyogT25lIG9mICdkJyAnZicuICovCi0gICAgIEZMT05VTV9UWVBFICpmOwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCi17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBpbnQgZXhwb25lbnRfYml0czsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgPT0gT0suICovCi0KLSAgcmV0dXJuX3ZhbHVlID0gd2hhdF9raW5kX29mX2Zsb2F0IChmb3JtYXRfbGV0dGVyLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cyk7Ci0gIGlmIChyZXR1cm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGYtPmxvdyA+IGYtPmxlYWRlcikKLQl7Ci0JICAvKiAwLjBlMCBzZWVuLiAqLwotCSAgbWVtc2V0ICh3b3JkcywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBwcmVjaXNpb24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGludCBleHBvbmVudF8xOwotCSAgbG9uZyBpbnQgZXhwb25lbnRfMjsKLQkgIGxvbmcgaW50IGV4cG9uZW50XzM7Ci0JICBsb25nIGludCBleHBvbmVudF80OwotCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotCSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0KLQkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLwotCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQotCSAgICB7Ci0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBBbGwgdGFob2UgZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyBoYXZlOgotCSAgICogQml0IDE1IGlzIHNpZ24gYml0LgotCSAgICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0JICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0JICAgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotCSAgICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCi0JICAgKgotCSAgICogU28gd2UgbmVlZDogbnVtYmVyIG9mIGJpdHMgb2YgZXhwb25lbnQsIG51bWJlciBvZiBiaXRzIG9mCi0JICAgKiBtYW50aXNzYS4KLQkgICAqLwotCi0JICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgbGl0dGxlbnVtX3BvaW50ZXIgPSBmLT5sZWFkZXI7Ci0JICBsaXR0bGVudW1fZW5kID0gZi0+bG93OwotCSAgLyogU2VlayAoYW5kIGZvcmdldCkgMXN0IHNpZ25pZmljYW50IGJpdCAqLwotCSAgZm9yIChleHBvbmVudF9za2lwcGFnZSA9IDA7Ci0JICAgICAgICFuZXh0X2JpdHMgKDEpOwotCSAgICAgICBleHBvbmVudF9za2lwcGFnZSsrKQotCSAgICB7Ci0JICAgIH0KLQkgIGV4cG9uZW50XzEgPSBmLT5leHBvbmVudCArIGYtPmxlYWRlciArIDEgLSBmLT5sb3c7Ci0JICAvKiBSYWRpeCBMSVRUTEVOVU1fUkFESVgsIHBvaW50IGp1c3QgaGlnaGVyIHRoYW4gZiAtPiBsZWFkZXIuICovCi0JICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIC8qIFJhZGl4IDIuICovCi0JICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKLQkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0JICAgICAgICovCi0KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0KLQkgICAgICAvKgotCSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkgICAgICAgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkgICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCSAgICAgICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBscCA9IHdvcmRzOwotCi0JICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0JICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotCSAgICAgIHdvcmQxID0gKChleHBvbmVudF80ICYgbWFza1tleHBvbmVudF9iaXRzXSkgPDwgKDE1IC0gZXhwb25lbnRfYml0cykpCi0JCXwgKChmLT5zaWduID09ICcrJykgPyAwIDogMHg4MDAwKQotCQl8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCi0JICAgICAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0JICAgICAgZm9yICg7IGxwIDwgd29yZHMgKyBwcmVjaXNpb247IGxwKyspCi0JCXsKLQkJICAqbHAgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0JCX0KLQotCSAgICAgIGlmIChuZXh0X2JpdHMgKDEpKQotCQl7Ci0JCSAgLyoKLQkJICAgKiBTaW5jZSB0aGUgTkVYVCBiaXQgaXMgYSAxLCByb3VuZCBVUCB0aGUgbWFudGlzc2EuCi0JCSAgICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0JCSAgICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0JCSAgICogaXQgJ2RvZXMgdGhlIHJpZ2h0IHRoaW5nJy4gSG93ZXZlciwgd2UgbG9zZSBpZiB0aGUKLQkJICAgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0JCSAgICogSXMgdGhhdCBjbGVhcj8KLQkJICAgKi8KLQotCQkgIHVuc2lnbmVkIGxvbmcgaW50IGNhcnJ5OwotCi0JCSAgLyoKLQkJICAgICNpZiAoc2l6ZW9mKGNhcnJ5KSkgPCAoKHNpemVvZihiaXRzWzBdKSAqIEJJVFNfUEVSX0NIQVIpICsgMikKLQkJICAgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JCSAgICBXZSBuZWVkIHRoYXQgZXh0cmEgYml0IHRvIGhvbGQgYSBjYXJyeSBkdXJpbmcgYSBMSVRUTEVOVU0gY2FycnkKLQkJICAgIHByb3BhZ2F0aW9uLiBBbm90aGVyIGV4dHJhIGJpdCAoa2VwdCAwKSB3aWxsIGFzc3VyZSB1cyB0aGF0IHdlCi0JCSAgICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JCSAgICBwZXJtaXRzIHVzIHRvIHByb3BhZ2F0ZSB0aGUgY2Fycnkgd2l0aG91dCBhbnkgbWFza2luZyBvZiBiaXRzLgotCQkgICAgI2VuZGlmCi0JCSAgICAqLwotCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOwotCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKLQkJICAgICAgIGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCi0JCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCQkgICAgewotCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0JCSAgICAgICAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCSAgICAgICAqLwotCQkgICAgfQotCQl9CQkvKiBpZiAod2UgbmVlZGVkIHRvIHJvdW5kIHVwKSAqLwotCSAgICB9CQkJLyogaWYgKGV4cG9uZW50IG92ZXJmbG93KSAqLwotCX0JCQkvKiBpZiAoMC4wZTApICovCi0gICAgfQkJCQkvKiBpZiAoZmxvYXRfdHlwZSB3YXMgT0spICovCi0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQwKLS8qCi0gKgkJbWRfYXRvZigpCi0gKgotICogSW46CWlucHV0X2xpbmVfcG9pbnRlciAtPiB0aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50Ci0gKgkJbnVtYmVyLgotICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQotICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlciAtPiBvZiBuZXh0IGNoYXIgYWZ0ZXIgZmxvYXRpbmcgbnVtYmVyLgotICoJRXJyb3IgbWVzc2FnZSwgb3IgMC4KLSAqCUZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKglOdW1iZXIgb2YgY2hhcnMgd2UgdXNlZCBmb3IgdGhlIGxpdGVyYWwuCi0gKi8KLQotY2hhciAqCi1tZF9hdG9mICh3aGF0X3N0YXRlbWVudF90eXBlLCBsaXRlcmFsUCwgc2l6ZVApCi0gICAgIGNoYXIgd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgY2hhciAqbGl0ZXJhbFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9QUkVDSVNJT05dOwotICByZWdpc3RlciBjaGFyIGtpbmRfb2ZfZmxvYXQ7Ci0gIHJlZ2lzdGVyIGludCBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLQotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KLSAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfTsKLQotICBpZiAoa2luZF9vZl9mbG9hdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGltaXQ7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGF0b2ZfdGFob2UgKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCQkgICAgICAga2luZF9vZl9mbG9hdCwKLQkJCQkgICAgICAgd29yZHMpOwotICAgICAgLyoKLSAgICAgICAqIFRoZSBhdG9mX3RhaG9lKCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgotICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KLSAgICAgICAqIGEgZGlmZmVyZW50LWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKLSAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCi0gICAgICAgKi8KLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IChraW5kX29mX2Zsb2F0ID09ICdmJyA/IEZfUFJFQ0lTSU9OX0NIQVJTIDoKLQkJCSAoa2luZF9vZl9mbG9hdCA9PSAnZCcgPyBEX1BSRUNJU0lPTl9DSEFSUyA6IDApKTsKLSAgICAgIGtub3cgKG51bWJlcl9vZl9jaGFycyA8PSBNQVhfUFJFQ0lTSU9OICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGltaXQgPSB3b3JkcyArIChudW1iZXJfb2ZfY2hhcnMgLyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBmb3IgKGxpdHRsZW51bV9wb2ludGVyID0gd29yZHM7Ci0JICAgbGl0dGxlbnVtX3BvaW50ZXIgPCBsaW1pdDsKLQkgICBsaXR0bGVudW1fcG9pbnRlcisrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1fcG9pbnRlciwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdGVyYWxQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnVtYmVyX29mX2NoYXJzID0gMDsKLSAgICB9OwotCi0gICpzaXplUCA9IG51bWJlcl9vZl9jaGFyczsKLSAgcmV0dXJuIGtpbmRfb2ZfZmxvYXQgPyAwIDogXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci19Ci0KLS8qIGF0b2ZfdGFob2UuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLXZheC5jIGIvZ2FzL2NvbmZpZy9hdG9mLXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWI5MGE4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvYXRvZi12YXguYworKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vKiBhdG9mX3ZheC5jIC0gdHVybiBhIEZsb251bSBpbnRvIGEgVkFYIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyLCA5MywgOTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi1zdGF0aWMgaW50IGF0b2ZfdmF4X3NpemVvZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgbmV4dF9iaXRzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqKSk7Ci1zdGF0aWMgaW50IHdoYXRfa2luZF9vZl9mbG9hdCBQQVJBTVMgKChpbnQsIGludCAqLCBsb25nICopKTsKLXN0YXRpYyBjaGFyICphdG9mX3ZheCBQQVJBTVMgKChjaGFyICosIGludCwgTElUVExFTlVNX1RZUEUgKikpOwotCi0vKiBQcmVjaXNpb24gaW4gTGl0dGxlTnVtcy4gKi8KLSNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoOCkKLSNkZWZpbmUgSF9QUkVDSVNJT04gKDgpCi0jZGVmaW5lIEdfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1pbnQgZmxvbnVtX2dlbjJ2YXggUEFSQU1TICgoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKLQkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7Ci0KLS8qIE51bWJlciBvZiBjaGFycyBpbiBmbG9udW0gdHlwZSAnbGV0dGVyJy4gKi8KLXN0YXRpYyBpbnQKLWF0b2ZfdmF4X3NpemVvZiAobGV0dGVyKQotICAgICBpbnQgbGV0dGVyOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwotCi0gIC8qCi0gICAqIFBlcm1pdHRpbmcgdXBwZXJjYXNlIGxldHRlcnMgaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4KLSAgICogUGxlYXNlIHVzZSBvbmx5IGxvd2VyLWNhc2VkIGxldHRlcnMgaW4gY2FzZSB0aGUgdXBwZXItY2FzZWQKLSAgICogb25lcyBiZWNvbWUgdW5zdXBwb3J0ZWQhCi0gICAqLwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICByZXR1cm5fdmFsdWUgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdnJzoKLSAgICBjYXNlICdHJzoKLSAgICAgIHJldHVybl92YWx1ZSA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgIGNhc2UgJ0gnOgotICAgICAgcmV0dXJuX3ZhbHVlID0gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm5fdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGF0b2ZfdmF4X3NpemVvZiAqLwotCi1zdGF0aWMgY29uc3QgbG9uZyBtYXNrW10gPQotewotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDAxLAotICAweDAwMDAwMDAzLAotICAweDAwMDAwMDA3LAotICAweDAwMDAwMDBmLAotICAweDAwMDAwMDFmLAotICAweDAwMDAwMDNmLAotICAweDAwMDAwMDdmLAotICAweDAwMDAwMGZmLAotICAweDAwMDAwMWZmLAotICAweDAwMDAwM2ZmLAotICAweDAwMDAwN2ZmLAotICAweDAwMDAwZmZmLAotICAweDAwMDAxZmZmLAotICAweDAwMDAzZmZmLAotICAweDAwMDA3ZmZmLAotICAweDAwMDBmZmZmLAotICAweDAwMDFmZmZmLAotICAweDAwMDNmZmZmLAotICAweDAwMDdmZmZmLAotICAweDAwMGZmZmZmLAotICAweDAwMWZmZmZmLAotICAweDAwM2ZmZmZmLAotICAweDAwN2ZmZmZmLAotICAweDAwZmZmZmZmLAotICAweDAxZmZmZmZmLAotICAweDAzZmZmZmZmLAotICAweDA3ZmZmZmZmLAotICAweDBmZmZmZmZmLAotICAweDFmZmZmZmZmLAotICAweDNmZmZmZmZmLAotICAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmCi19OwotDAotCi0vKiBTaGFyZWQgYmV0d2VlbiBmbG9udW1fZ2VuMnZheCBhbmQgbmV4dF9iaXRzICovCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOwotCi1zdGF0aWMgaW50Ci1uZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQotICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Ci17Ci0gIGludCByZXR1cm5fdmFsdWU7Ci0KLSAgaWYgKGxpdHRsZW51bV9wb2ludGVyIDwgbGl0dGxlbnVtX2VuZCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci0gICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOwotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOwotICAgICAgbGl0dGxlbnVtX3BvaW50ZXItLTsKLSAgICAgIGlmIChsaXR0bGVudW1fcG9pbnRlciA+PSBsaXR0bGVudW1fZW5kKQotCXJldHVybl92YWx1ZSB8PSAoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gKGJpdHNfbGVmdF9pbl9saXR0bGVudW0pKSAmIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci17Ci0gICp3b3JkcyA9IDB4ODAwMDsJCS8qIEZsb2F0aW5nIFJlc2VydmVkIE9wZXJhbmQgQ29kZSAqLwotfQotDAotc3RhdGljIGludAkJCS8qIDAgbWVhbnMgbGV0dGVyIGlzIE9LLiAqLwotd2hhdF9raW5kX29mX2Zsb2F0IChsZXR0ZXIsIHByZWNpc2lvblAsIGV4cG9uZW50X2JpdHNQKQotICAgICBpbnQgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KLSAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCi0gICAgIGxvbmcgKmV4cG9uZW50X2JpdHNQOwkvKiBOdW1iZXIgb2YgZXhwb25lbnQgYml0cy4gKi8KLXsKLSAgaW50IHJldHZhbDsJCQkvKiAwOiBPSy4gKi8KLQotICByZXR2YWwgPSAwOwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEZfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IERfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEdfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgKnByZWNpc2lvblAgPSBIX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDE1OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dmFsID0gNjk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgotICoJd2hhdCB0aGUgVkFYIHRoaW5rcyBpbi4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmaWd1cmUJKgotICoJb3V0IGFueSBhbGlnbm1lbnQgcHJvYmxlbXMgYW5kIHRvIGNvbnNwaXJlIGZvciB0aGUgYnl0ZXMvd29yZAkqCi0gKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotYXRvZl92YXggKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKLSAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCi0gICAgIGludCB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KLSAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCi0gIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgbG9uZyBleHBvbmVudF9iaXRzOwotCi0gIHJldHVybl92YWx1ZSA9IHN0cjsKLSAgZi5sb3cgPSBiaXRzICsgTUFYX1BSRUNJU0lPTjsKLSAgZi5oaWdoID0gTlVMTDsKLSAgZi5sZWFkZXIgPSBOVUxMOwotICBmLmV4cG9uZW50ID0gMDsKLSAgZi5zaWduID0gJ1wwJzsKLQotICBpZiAod2hhdF9raW5kX29mX2Zsb2F0ICh3aGF0X2tpbmQsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiBXZSBsb3N0LiAqLwotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLQotICBpZiAocmV0dXJuX3ZhbHVlKQotICAgIHsKLSAgICAgIG1lbXNldCAoYml0cywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBNQVhfUFJFQ0lTSU9OKTsKLQotICAgICAgLyogVXNlIG1vcmUgTGl0dGxlTnVtcyB0aGFuIHNlZW1zICovCi0gICAgICAvKiBuZWNlc3Nhcnk6IHRoZSBoaWdoZXN0IGZsb251bSBtYXkgaGF2ZSAqLwotICAgICAgLyogMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0gICAgICBmLmhpZ2ggPSBmLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICAgICAgaWYgKGF0b2ZfZ2VuZXJpYyAoJnJldHVybl92YWx1ZSwgIi4iLCAiZUUiLCAmZikpCi0JewotCSAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogd2UgbG9zdCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZmxvbnVtX2dlbjJ2YXggKHdoYXRfa2luZCwgJmYsIHdvcmRzKSkKLQkgICAgewotCSAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGF0b2ZfdmF4KCkgKi8KLQwKLS8qCi0gKiBJbjogYSBmbG9udW0sIGEgdmF4IGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KLSAqIE91dDogYSB2YXggZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCi0gKi8KLQotaW50CQkJCS8qIDA6IE9LLiAqLwotZmxvbnVtX2dlbjJ2YXggKGZvcm1hdF9sZXR0ZXIsIGYsIHdvcmRzKQotICAgICBjaGFyIGZvcm1hdF9sZXR0ZXI7CS8qIE9uZSBvZiAnZCcgJ2YnICdnJyAnaCcuICovCi0gICAgIEZMT05VTV9UWVBFICpmOwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCi17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBleHBvbmVudF9iaXRzOwotICBpbnQgcmV0dXJuX3ZhbHVlOwkJLyogMCA9PSBPSy4gKi8KLQotICByZXR1cm5fdmFsdWUgPSB3aGF0X2tpbmRfb2ZfZmxvYXQgKGZvcm1hdF9sZXR0ZXIsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKTsKLQotICBpZiAocmV0dXJuX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmLT5sb3cgPiBmLT5sZWFkZXIpCi0JewotCSAgLyogMC4wZTAgc2Vlbi4gKi8KLQkgIG1lbXNldCAod29yZHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogcHJlY2lzaW9uKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBleHBvbmVudF8xOwotCSAgbG9uZyBleHBvbmVudF8yOwotCSAgbG9uZyBleHBvbmVudF8zOwotCSAgbG9uZyBleHBvbmVudF80OwotCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotCSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0KLQkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLwotCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQotCSAgICB7Ci0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0JICAgIH0KLQkgIC8qCi0JCQkgKiBBbGwgdmF4ZW4gZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyAoc28gZmFyKSBoYXZlOgotCQkJICogQml0IDE1IGlzIHNpZ24gYml0LgotCQkJICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0JCQkgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0JCQkgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotCQkJICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCi0JCQkgKgotCQkJICogQWxsIHRoaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGEgS0YxMT8/IChXaGljaCBpcyBzdGlsbCBmYXN0ZXIKLQkJCSAqIHRoYW4gbG90cyBvZiB2YXhlbiBJIGNhbiB0aGluayBvZiwgYnV0IGl0IGFsc28gaGFzIGhpZ2hlcgotCQkJICogbWFpbnRlbmFuY2UgY29zdHMgLi4uIHNpZ2gpLgotCQkJICoKLQkJCSAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotCQkJICogbWFudGlzc2EuCi0JCQkgKi8KLQotI2lmZGVmIE5FVkVSCQkJLyoqKioqKiogVGhpcyB6ZXJvaW5nIHNlZW1zIHJlZHVuZGFudCAtIERlYW4gM21heTg2ICoqKioqKioqKiovCi0JICAvKgotCQkJICogTm8gbWF0dGVyIGhvdyBmZXcgYml0cyB3ZSBnb3QgYmFjayBmcm9tIHRoZSBhdG9mKCkKLQkJCSAqIHJvdXRpbmUsIGFkZCBlbm91Z2ggemVybyBsaXR0bGVudW1zIHNvIHRoZSByZXN0IG9mIHRoZQotCQkJICogY29kZSB3b24ndCBydW4gb3V0IG9mICJzaWduaWZpY2FudCIgYml0cyBpbiB0aGUgbWFudGlzc2EuCi0JCQkgKi8KLQkgIHsKLQkgICAgTElUVExFTlVNX1RZUEUgKmx0cDsKLQkgICAgZm9yIChsdHAgPSBmLT5sZWFkZXIgKyAxOwotCQkgbHRwIDw9IGYtPmxvdyArIHByZWNpc2lvbjsKLQkJIGx0cCsrKQotCSAgICAgIHsKLQkJKmx0cCA9IDA7Ci0JICAgICAgfQotCSAgfQotI2VuZGlmCi0KLQkgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICBsaXR0bGVudW1fcG9pbnRlciA9IGYtPmxlYWRlcjsKLQkgIGxpdHRsZW51bV9lbmQgPSBmLT5sb3c7Ci0JICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0JICBmb3IgKGV4cG9uZW50X3NraXBwYWdlID0gMDsKLQkgICAgICAgIW5leHRfYml0cyAoMSk7Ci0JICAgICAgIGV4cG9uZW50X3NraXBwYWdlKyspOzsKLQotCSAgZXhwb25lbnRfMSA9IGYtPmV4cG9uZW50ICsgZi0+bGVhZGVyICsgMSAtIGYtPmxvdzsKLQkgIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbiBmLT5sZWFkZXIuICovCi0JICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIC8qIFJhZGl4IDIuICovCi0JICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKLQkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKLQkgICAgewotCSAgICAgIC8qCi0JCQkJICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0JCQkJICovCi0KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0KLQkgICAgICAvKgotCQkJCSAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJCQkgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCQkJCSAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBscCA9IHdvcmRzOwotCi0JICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0JICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotCSAgICAgIHdvcmQxID0gKCgoZXhwb25lbnRfNCAmIG1hc2tbZXhwb25lbnRfYml0c10pIDw8ICgxNSAtIGV4cG9uZW50X2JpdHMpKQotCQkgICAgICAgfCAoKGYtPnNpZ24gPT0gJysnKSA/IDAgOiAweDgwMDApCi0JCSAgICAgICB8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKSk7Ci0JICAgICAgKmxwKysgPSB3b3JkMTsKLQotCSAgICAgIC8qIFRoZSByZXN0IG9mIHRoZSB3b3JkcyBhcmUganVzdCBtYW50aXNzYSBiaXRzLiAqLwotCSAgICAgIGZvciAoOyBscCA8IHdvcmRzICsgcHJlY2lzaW9uOyBscCsrKQotCQl7Ci0JCSAgKmxwID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCQl9Ci0KLQkgICAgICBpZiAobmV4dF9iaXRzICgxKSkKLQkJewotCQkgIC8qCi0JCQkJCSAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLQkJCQkJICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0JCQkJCSAqIHVzIHRvIGxldCB0aGUgbWFudGlzc2Egb3ZlcmZsb3cgaW50byB0aGUgZXhwb25lbnQsIGFuZAotCQkJCQkgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotCQkJCQkgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0JCQkJCSAqIElzIHRoYXQgY2xlYXI/Ci0JCQkJCSAqLwotCi0JCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotCQkgIC8qCi0JCQkJCSAgI2lmIChzaXplb2YoY2FycnkpKSA8ICgoc2l6ZW9mKGJpdHNbMF0pICogQklUU19QRVJfQ0hBUikgKyAyKQotCQkJCQkgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JCQkJCSAgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5Ci0JCQkJCSAgcHJvcGFnYXRpb24uIEFub3RoZXIgZXh0cmEgYml0IChrZXB0IDApIHdpbGwgYXNzdXJlIHVzIHRoYXQgd2UKLQkJCQkJICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JCQkJCSAgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KLQkJCQkJICAjZW5kaWYKLQkJCQkJICAqLwotCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOwotCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKLQkJICAgICAgIGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCi0JCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCQkgICAgewotCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JCSAgICAgIC8qCi0JCQkJCQkgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0JCQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJCQkJCSAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCQkJCQkgKi8KLQkJICAgIH0KLQkJfQkJLyogaWYgKHdlIG5lZWRlZCB0byByb3VuZCB1cCkgKi8KLQkgICAgfQkJCS8qIGlmIChleHBvbmVudCBvdmVyZmxvdykgKi8KLQl9CQkJLyogaWYgKDAuMGUwKSAqLwotICAgIH0JCQkJLyogaWYgKGZsb2F0X3R5cGUgd2FzIE9LKSAqLwotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGZsb251bV9nZW4ydmF4KCkgKi8KLQotCi0vKiBKRiB0aGlzIHVzZWQgdG8gYmUgaW4gdmF4LmMgYnV0IHRoaXMgbG9va3MgbGlrZSBhIGJldHRlciBwbGFjZSBmb3IgaXQgKi8KLQotLyoKLSAqCQltZF9hdG9mKCkKLSAqCi0gKiBJbjoJaW5wdXRfbGluZV9wb2ludGVyLT50aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50Ci0gKgkJbnVtYmVyLgotICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQotICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+b2YgbmV4dCBjaGFyIGFmdGVyIGZsb2F0aW5nIG51bWJlci4KLSAqCUVycm9yIG1lc3NhZ2UsIG9yIDAuCi0gKglGbG9hdGluZyBwb2ludCBsaXRlcmFsLgotICoJTnVtYmVyIG9mIGNoYXJzIHdlIHVzZWQgZm9yIHRoZSBsaXRlcmFsLgotICovCi0KLSNkZWZpbmUgTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAoOCkJLyogRm9yIC5oZmxvYXRzLiAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHdoYXRfc3RhdGVtZW50X3R5cGUsIGxpdGVyYWxQLCBzaXplUCkKLSAgICAgaW50IHdoYXRfc3RhdGVtZW50X3R5cGU7Ci0gICAgIGNoYXIgKmxpdGVyYWxQOwotICAgICBpbnQgKnNpemVQOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhJTVVNX05VTUJFUl9PRl9MSVRUTEVOVU1TXTsKLSAgcmVnaXN0ZXIgY2hhciBraW5kX29mX2Zsb2F0OwotICByZWdpc3RlciBpbnQgbnVtYmVyX29mX2NoYXJzOwotICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtUDsKLQotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ0YnOgkJCS8qIC5mbG9hdCAqLwotICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAnZic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgkJCS8qIC5kb3VibGUgKi8KLSAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2QnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoJCQkvKiAuZ2Zsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2cnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoJCQkvKiAuaGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2gnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAga2luZF9vZl9mbG9hdCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9OwotCi0gIGlmIChraW5kX29mX2Zsb2F0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaW1pdDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYXRvZl92YXggKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCQkgICAgIGtpbmRfb2ZfZmxvYXQsCi0JCQkJICAgICB3b3Jkcyk7Ci0gICAgICAvKgotICAgICAgICogVGhlIGF0b2ZfdmF4KCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgotICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KLSAgICAgICAqIGEgbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKLSAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCi0gICAgICAgKi8KLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IGF0b2ZfdmF4X3NpemVvZiAoa2luZF9vZl9mbG9hdCk7Ci0gICAgICBrbm93IChudW1iZXJfb2ZfY2hhcnMgPD0gTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpbWl0ID0gd29yZHMgKyAobnVtYmVyX29mX2NoYXJzIC8gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgZm9yIChsaXR0bGVudW1QID0gd29yZHM7IGxpdHRsZW51bVAgPCBsaW1pdDsgbGl0dGxlbnVtUCsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1QLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRlcmFsUCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IDA7Ci0gICAgfTsKLQotICAqc2l6ZVAgPSBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJldHVybiBraW5kX29mX2Zsb2F0ID8gMCA6IF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotfQotCi0vKiBlbmQgb2YgYXRvZi12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMgYi9nYXMvY29uZmlnL2UtaTM4NmNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZDcyOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtaTM4NmNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaTM4NmNvZmZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJaTM4NmNvZmZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmNvZmZfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkiaTM4NmNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgaTM4NmNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMgYi9nYXMvY29uZmlnL2UtaTM4NmVsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTY3MDFlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWkzODZlbGZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJaTM4NmVsZl9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2Zvcm1hdAkmZWxmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJImkzODZlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgaTM4NmVsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLW1pcHNlY29mZi5jIGIvZ2FzL2NvbmZpZy9lLW1pcHNlY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJmNzFiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKm1pcHNlY29mZl9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1pcHNlY29mZl9iZmRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgZW11bF9iZmRfbmFtZQltaXBzZWNvZmZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmVjb2ZmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNiZWNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2JlY29mZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDEKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgIGVtdWxfbmFtZQotI3VuZGVmICBlbXVsX3N0cnVjdF9uYW1lCi0jdW5kZWYgIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNsZWNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2xlY29mZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgZW11bF9uYW1lCi0jdW5kZWYgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNlY29mZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzZWNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAyCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1taXBzZWxmLmMgYi9nYXMvY29uZmlnL2UtbWlwc2VsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWE3MmY1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1taXBzZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICptaXBzZWxmX2JmZF9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbWlwc2VsZl9iZmRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgZW11bF9iZmRfbmFtZQltaXBzZWxmX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfZm9ybWF0CSZlbGZfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2JlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2JlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAxCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmICBlbXVsX25hbWUKLSN1bmRlZiAgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmICBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzbGVsZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzbGVsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgZW11bF9uYW1lCi0jdW5kZWYgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2VsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDIKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9nbzMyLmNmZyBiL2dhcy9jb25maWcvZ28zMi5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTkzOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9nbzMyLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qIGNvbmZpZy5oIGZvciBnbzMyICovDQotDQotI2RlZmluZSBJMzg2Q09GRiAxDQotDQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8NCi0jdW5kZWYgQ19BTExPQ0ENCi0NCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuDQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8NCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQNCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8NCi0jdW5kZWYgSEFWRV9BTExPQ0FfSA0KLQ0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovDQotI3VuZGVmIGlubGluZQ0KLQ0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQ0KLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQ0KLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4NCi0JU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3Nlcw0KLQlTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMNCi0JU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24NCi0gKi8NCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9ODQotDQotLyogU2hvdWxkIGdhcyB1c2UgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlcz8gICovDQotI3VuZGVmIEJGRF9BU1NFTUJMRVINCi0NCi0vKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgY3Jvc3MtYXNzZW1ibGluZywgc29tZSBvcGVyYXRpb25zIGNhbiBiZSBvcHRpbWl6ZWQsDQotICAgc2luY2UgYnl0ZSBvcmRlcnMgYW5kIHZhbHVlIHNpemVzIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLw0KLSN1bmRlZiBDUk9TU19DT01QSUxFDQotDQotLyogU29tZSBnYXMgY29kZSB3YW50cyB0byBrbm93IHRoZXNlIHBhcmFtZXRlcnMuICAqLw0KLSNkZWZpbmUgVEFSR0VUX0FMSUFTCQkiaTM4NiINCi0jZGVmaW5lIFRBUkdFVF9DUFUJCSJpMzg2Ig0KLSNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTAkiaTM4Ni1pMzg2Ig0KLSNkZWZpbmUgVEFSR0VUX09TCQkiZGpncHAiDQotI2RlZmluZSBUQVJHRVRfVkVORE9SCQkiZGpncHAiDQotDQotLyogU29tZSBvcGVyYXRpbmcgc3lzdGVtcywgZm9yIGV4YW1wbGUgRE9TLCByZXF1aXJlIHRoZSB1c2Ugb2YgIndiIiBtb2RlIHdoZW4NCi0gICBvcGVuaW5nIGEgYmluYXJ5IGZpbGUgZm9yIHdyaXRpbmcuICBJZiBvbmx5ICJ3IiBpcyB1c2VkLCB0aGUgZmlsZSB3aWxsIG5vdA0KLSAgIGJlIGNvcnJlY3QuICBIb3dldmVyLCBzb21lIG90aGVyIHN5c3RlbXMgcmVqZWN0IHN1Y2ggYSBtb2RlLiAgVGhpcyBpbmRpY2F0ZXMNCi0gICB3aGljaCAuLi9pbmNsdWRlL2ZvcGVuLSouaCBoZWFkZXIgZmlsZSB3ZSB3YW50IHRvIGluY2x1ZGUsIHNvIHRoYXQgd2UgY2FuDQotICAgZ2V0IG1hY3JvcyB0aGF0J2xsIGRvIHRoZSByaWdodCB0aGluZyBmb3IgdGhpcyBzeXN0ZW0uICAqLw0KLSNkZWZpbmUgV0FOVF9GT1BFTl9CSU4gMQ0KLQ0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIG1hbGxvYyBhbmQgcmVhbGxvYy4gICovDQotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DDQotDQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgZnJlZS4gICovDQotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQ0KLQ0KLS8qIFNvbWV0aW1lcyBlcnJuby5oIGRvZXNuJ3QgZGVjbGFyZSBlcnJubyBpdHNlbGYuICAqLw0KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PDQotDQotI2RlZmluZSBNQU5ZX1NFR01FTlRTIDENCi0NCi0vKiBOZWVkZWQgb25seSBmb3Igc3BhcmMgY29uZmlndXJhdGlvbiAqLw0KLSN1bmRlZiBzcGFyY3Y5DQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLw0KLSNkZWZpbmUgSEFWRV9SRU1PVkUgMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8NCi0jZGVmaW5lIEhBVkVfVU5MSU5LIDENCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovDQotI2RlZmluZSBIQVZFX0VSUk5PX0ggMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovDQotI2RlZmluZSBIQVZFX01FTU9SWV9IIDENCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSNkZWZpbmUgSEFWRV9TVERBUkdfSCAxDQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovDQotI2RlZmluZSBIQVZFX1NUUklOR19IIDENCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gNCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxDQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSA0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvaXRibC1taXBzLmggYi9nYXMvY29uZmlnL2l0YmwtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ4MmJkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvaXRibC1taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0KLS8qIGl0YmwtbWlwcy5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIERlZmluZXMgZm9yIE1pcHMgaXRibCBjb3Agc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLQotLyogVmFsdWVzIGZvciBwcm9jZXNzb3JzIHdpbGwgYmUgZnJvbSAwIHRvIE5VTUJFUl9PRl9QUk9DRVNTT1JTLTEgKi8KLSNkZWZpbmUgTlVNQkVSX09GX1BST0NFU1NPUlMgNAotI2RlZmluZSBNQVhfQklUUE9TIDMxCi0KLS8qIE1pcHMgc3BlY2lmaWNzICovCi0jZGVmaW5lIE1JUFNfT1BDT0RFX0NPUDAgKDB4MjEpCS8qIENPUHorQ08sIGJpdHMgMzEtMjU6IDAxMDB6ejEgKi8KLSNkZWZpbmUgTUlQU19FTkNPREVfQ09QX05VTSh6KSAoKE1JUFNfT1BDT0RFX0NPUDB8ejw8MSk8PDI1KQotI2RlZmluZSBNSVBTX0lTX0NPUF9JTlNOKGluc24pICgoTUlQU19PUENPREVfQ09QMCYoaW5zbj4+MjUpKSBcCi0JPT0gTUlQU19PUENPREVfQ09QMCkKLSNkZWZpbmUgTUlQU19ERUNPREVfQ09QX05VTShpbnNuKSAoKH5NSVBTX09QQ09ERV9DT1AwJihpbnNuPj4yNSkpPj4xKQotI2RlZmluZSBNSVBTX0RFQ09ERV9DT1BfQ09GVU4oaW5zbikgKCh+TUlQU19FTkNPREVfQ09QX05VTSgzKSkmKGluc24pKQotCi0vKiBkZWZpbml0aW9ucyByZXF1aXJlZCBieSBnZW5lcmljIGNvZGUgKi8KLSNkZWZpbmUgSVRCTF9JU19JTlNOKGluc24pIE1JUFNfSVNfQ09QX0lOU04oaW5zbikKLSNkZWZpbmUgSVRCTF9ERUNPREVfUE5VTShpbnNuKSBNSVBTX0RFQ09ERV9DT1BfTlVNKGluc24pCi0jZGVmaW5lIElUQkxfRU5DT0RFX1BOVU0ocG51bSkgTUlQU19FTkNPREVfQ09QX05VTShwbnVtKQotCi0jZGVmaW5lIElUQkxfT1BDT0RFX1NUUlVDVCBtaXBzX29wY29kZQotI2RlZmluZSBJVEJMX09QQ09ERVMgbWlwc19vcGNvZGVzCi0jZGVmaW5lIElUQkxfTlVNX09QQ09ERVMgTlVNT1BDT0RFUwotI2RlZmluZSBJVEJMX05VTV9NQUNST1MgTV9OVU1fTUFDUk9TCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL202OGstcGFyc2UuaCBiL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI1ZjYwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qIG02OGstcGFyc2UuaCAtLSBoZWFkZXIgZmlsZSBmb3IgbTY4ayBhc3NlbWJsZXIKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTTY4S19QQVJTRV9ICi0jZGVmaW5lIE02OEtfUEFSU0VfSAotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhpbmdzIHdoaWNoIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUKLSAgIG9wZXJhbmQgcGFyc2VyIGluIG02OGsueSBhbmQgdGhlIG02OGsgYXNzZW1ibGVyIHByb3BlciBpbgotICAgdGMtbTY4ay5jLiAgKi8KLQotLyogVGhlIHZhcmlvdXMgbTY4ayByZWdpc3RlcnMuICAqLwotCi0vKiBEQVRBIGFuZCBBRERSIGhhdmUgdG8gYmUgY29udGlndW91cywgc28gdGhhdCByZWctREFUQSBnaXZlcwotICAgMC03PT1kYXRhIHJlZywgOC0xNT09YWRkciByZWcgZm9yIG9wZXJhbmRzIHRoYXQgdGFrZSBib3RoIHR5cGVzLgotCi0gICBXZSBkb24ndCB1c2UgZm9ybXMgbGlrZSAiQUREUjAgPSBBRERSIiBoZXJlIGJlY2F1c2UgdGhpcyBmaWxlIGlzCi0gICBsaWtlbHkgdG8gYmUgdXNlZCBvbiBhbiBBcG9sbG8sIGFuZCB0aGUgYnJva2VuIEFwb2xsbyBjb21waWxlcgotICAgZ2l2ZXMgYW4gYHVuZGVmaW5lZCB2YXJpYWJsZScgZXJyb3IgaWYgd2UgZG8gdGhhdCwgYWNjb3JkaW5nIHRvCi0gICB0cm95QGNibWUudW5zdy5lZHUuYXUuICAqLwotCi0jZGVmaW5lIERBVEEgREFUQTAKLSNkZWZpbmUgQUREUiBBRERSMAotI2RlZmluZSBTUCBBRERSNwotI2RlZmluZSBCQUQgQkFEMAotI2RlZmluZSBCQUMgQkFDMAotCi1lbnVtIG02OGtfcmVnaXN0ZXIKLXsKLSAgREFUQTAgPSAxLAkJCS8qICAgMS0gOCA9PSBkYXRhIHJlZ2lzdGVycyAwLTcgKi8KLSAgREFUQTEsCi0gIERBVEEyLAotICBEQVRBMywKLSAgREFUQTQsCi0gIERBVEE1LAotICBEQVRBNiwKLSAgREFUQTcsCi0KLSAgQUREUjAsCi0gIEFERFIxLAotICBBRERSMiwKLSAgQUREUjMsCi0gIEFERFI0LAotICBBRERSNSwKLSAgQUREUjYsCi0gIEFERFI3LAotCi0gIEZQMCwJCQkJLyogRWlnaHQgRlAgcmVnaXN0ZXJzICovCi0gIEZQMSwKLSAgRlAyLAotICBGUDMsCi0gIEZQNCwKLSAgRlA1LAotICBGUDYsCi0gIEZQNywKLQotICBDT1AwLAkJCQkvKiBDby1wcm9jZXNzb3IgIzAtIzcgKi8KLSAgQ09QMSwKLSAgQ09QMiwKLSAgQ09QMywKLSAgQ09QNCwKLSAgQ09QNSwKLSAgQ09QNiwKLSAgQ09QNywKLQotICBQQywJCQkJLyogUHJvZ3JhbSBjb3VudGVyICovCi0gIFpQQywJCQkJLyogSGFjayBmb3IgUHJvZ3JhbSBzcGFjZSwgYnV0IDAgYWRkcmVzc2luZyAqLwotICBTUiwJCQkJLyogU3RhdHVzIFJlZyAqLwotICBDQ1IsCQkJCS8qIENvbmRpdGlvbiBjb2RlIFJlZyAqLwotICBBQ0MsCQkJCS8qIEFjY3VtdWxhdG9yIFJlZyAqLwotICBNQUNTUiwJCQkvKiBNQUMgU3RhdHVzIFJlZyAqLwotICBNQVNLLAkJCQkvKiBNb2R1bHVzIFJlZyAqLwotCi0gIC8qIFRoZXNlIGhhdmUgdG8gYmUgZ3JvdXBlZCB0b2dldGhlciBmb3IgdGhlIG1vdmVjIGluc3RydWN0aW9uIHRvIHdvcmsuICovCi0gIFVTUCwJCQkJLyogIFVzZXIgU3RhY2sgUG9pbnRlciAqLwotICBJU1AsCQkJCS8qICBJbnRlcnJ1cHQgc3RhY2sgcG9pbnRlciAqLwotICBTRkMsCi0gIERGQywKLSAgQ0FDUiwKLSAgVkJSLAotICBDQUFSLAotICBNU1AsCi0gIElUVDAsCi0gIElUVDEsCi0gIERUVDAsCi0gIERUVDEsCi0gIE1NVVNSLAotICBUQywKLSAgU1JQLAotICBVUlAsCi0gIEJVU0NSLAkJCS8qIDY4MDYwIGFkZGVkIHRoZXNlICovCi0gIFBDUiwKLSAgUk9NQkFSLAkJCS8qIG1jZjUyMDAgYWRkZWQgdGhlc2UgKi8KLSAgUkFNQkFSMCwKLSAgUkFNQkFSMSwKLSAgTUJBUiwKLSNkZWZpbmUgbGFzdF9tb3ZlY19yZWcgTUJBUgotICAvKiBlbmQgb2YgbW92ZWMgb3JkZXJpbmcgY29uc3RyYWludHMgKi8KLQotICBGUEksCi0gIEZQUywKLSAgRlBDLAotCi0gIERSUCwJCQkJLyogNjg4NTEgb3IgNjgwMzAgTU1VIHJlZ3MgKi8KLSAgQ1JQLAotICBDQUwsCi0gIFZBTCwKLSAgU0NDLAotICBBQywKLSAgQkFEMCwKLSAgQkFEMSwKLSAgQkFEMiwKLSAgQkFEMywKLSAgQkFENCwKLSAgQkFENSwKLSAgQkFENiwKLSAgQkFENywKLSAgQkFDMCwKLSAgQkFDMSwKLSAgQkFDMiwKLSAgQkFDMywKLSAgQkFDNCwKLSAgQkFDNSwKLSAgQkFDNiwKLSAgQkFDNywKLSAgUFNSLAkJCQkvKiBha2EgTU1VU1Igb24gNjgwMzAgKGJ1dCBub3QgTU1VU1Igb24gNjgwNDApCi0JCQkJICAgYW5kIEFDVVNSIG9uIDY4ZWMwMzAgKi8KLSAgUENTUiwKLQotICBJQywJCQkJLyogaW5zdHJ1Y3Rpb24gY2FjaGUgdG9rZW4gKi8KLSAgREMsCQkJCS8qIGRhdGEgY2FjaGUgdG9rZW4gKi8KLSAgTkMsCQkJCS8qIG5vIGNhY2hlIHRva2VuICovCi0gIEJDLAkJCQkvKiBib3RoIGNhY2hlcyB0b2tlbiAqLwotCi0gIFRUMCwJCQkJLyogNjgwMzAgYWNjZXNzIGNvbnRyb2wgdW5pdCByZWdzICovCi0gIFRUMSwKLQotICBaREFUQTAsCQkJLyogc3VwcHJlc3NlZCBkYXRhIHJlZ2lzdGVycy4gICovCi0gIFpEQVRBMSwKLSAgWkRBVEEyLAotICBaREFUQTMsCi0gIFpEQVRBNCwKLSAgWkRBVEE1LAotICBaREFUQTYsCi0gIFpEQVRBNywKLQotICBaQUREUjAsCQkJLyogc3VwcHJlc3NlZCBhZGRyZXNzIHJlZ2lzdGVycy4gICovCi0gIFpBRERSMSwKLSAgWkFERFIyLAotICBaQUREUjMsCi0gIFpBRERSNCwKLSAgWkFERFI1LAotICBaQUREUjYsCi0gIFpBRERSNywKLQotICAvKiBVcHBlciBhbmQgbG93ZXIgaGFsZiBvZiBkYXRhIGFuZCBhZGRyZXNzIHJlZ2lzdGVycy4gIE9yZGVyICptdXN0KgotICAgICBiZSBEQVRBeEwsIEFERFJ4TCwgREFUQXhVLCBBRERSeFUuICovCi0gIERBVEEwTCwJCQkvKiBsb3dlciBoYWxmIG9mIGRhdGEgcmVnaXN0ZXJzICovCi0gIERBVEExTCwKLSAgREFUQTJMLAotICBEQVRBM0wsCi0gIERBVEE0TCwKLSAgREFUQTVMLAotICBEQVRBNkwsCi0gIERBVEE3TCwKLQotICBBRERSMEwsCQkJLyogbG93ZXIgaGFsZiBvZiBhZGRyZXNzIHJlZ2lzdGVycyAqLwotICBBRERSMUwsCi0gIEFERFIyTCwKLSAgQUREUjNMLAotICBBRERSNEwsCi0gIEFERFI1TCwKLSAgQUREUjZMLAotICBBRERSN0wsCi0KLSAgREFUQTBVLAkJCS8qIHVwcGVyIGhhbGYgb2YgZGF0YSByZWdpc3RlcnMgKi8KLSAgREFUQTFVLAotICBEQVRBMlUsCi0gIERBVEEzVSwKLSAgREFUQTRVLAotICBEQVRBNVUsCi0gIERBVEE2VSwKLSAgREFUQTdVLAotCi0gIEFERFIwVSwJCQkvKiB1cHBlciBoYWxmIG9mIGFkZHJlc3MgcmVnaXN0ZXJzICovCi0gIEFERFIxVSwKLSAgQUREUjJVLAotICBBRERSM1UsCi0gIEFERFI0VSwKLSAgQUREUjVVLAotICBBRERSNlUsCi0gIEFERFI3VSwKLX07Ci0KLS8qIFNpemUgaW5mb3JtYXRpb24uICAqLwotCi1lbnVtIG02OGtfc2l6ZQotewotICAvKiBVbnNwZWNpZmllZC4gICovCi0gIFNJWkVfVU5TUEVDLAotCi0gIC8qIEJ5dGUuICAqLwotICBTSVpFX0JZVEUsCi0KLSAgLyogV29yZCAoMiBieXRlcykuICAqLwotICBTSVpFX1dPUkQsCi0KLSAgLyogTG9uZ3dvcmQgKDQgYnl0ZXMpLiAgKi8KLSAgU0laRV9MT05HCi19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbmRleCByZWdpc3Rlci4gICovCi0KLXN0cnVjdCBtNjhrX2luZGV4cmVnCi17Ci0gIC8qIFRoZSBpbmRleCByZWdpc3RlciBpdHNlbGYuICAqLwotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotCi0gIC8qIFRoZSBzaXplIHRvIHVzZS4gICovCi0gIGVudW0gbTY4a19zaXplIHNpemU7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHNjYWxlIGJ5LiAgKi8KLSAgaW50IHNjYWxlOwotfTsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFRoZSB0eXBlIG9mIGEgUElDIGV4cHJlc3Npb24uICAqLwotCi1lbnVtIHBpY19yZWxvY2F0aW9uCi17Ci0gIHBpY19ub25lLAkJCS8qIG5vdCBwaWMgKi8KLSAgcGljX3BsdF9wY3JlbCwJCS8qIEBQTFRQQyAqLwotICBwaWNfZ290X3BjcmVsLAkJLyogQEdPVFBDICovCi0gIHBpY19wbHRfb2ZmLAkJCS8qIEBQTFQgKi8KLSAgcGljX2dvdF9vZmYJCQkvKiBAR09UICovCi19OwotI2VuZGlmCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGFuIGV4cHJlc3Npb24uICAqLwotCi1zdHJ1Y3QgbTY4a19leHAKLXsKLSAgLyogVGhlIHNpemUgdG8gdXNlLiAgKi8KLSAgZW51bSBtNjhrX3NpemUgc2l6ZTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogVGhlIHR5cGUgb2YgcGljIHJlbG9jYXRpb24gaWYgYW55LiAgKi8KLSAgZW51bSBwaWNfcmVsb2NhdGlvbiBwaWNfcmVsb2M7Ci0jZW5kaWYKLQotICAvKiBUaGUgZXhwcmVzc2lvbiBpdHNlbGYuICAqLwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi0vKiBUaGUgb3BlcmFuZCBtb2Rlcy4gICovCi0KLWVudW0gbTY4a19vcGVyYW5kX3R5cGUKLXsKLSAgSU1NRUQgPSAxLAotICBBQlNMLAotICBEUkVHLAotICBBUkVHLAotICBGUFJFRywKLSAgQ09OVFJPTCwKLSAgQUlORFIsCi0gIEFJTkMsCi0gIEFERUMsCi0gIERJU1AsCi0gIEJBU0UsCi0gIFBPU1QsCi0gIFBSRSwKLSAgUkVHTFNUCi19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIHBhcnNlZCBvcGVyYW5kLiAgKi8KLQotc3RydWN0IG02OGtfb3AKLXsKLSAgLyogVGhlIHR5cGUgb2Ygb3BlcmFuZC4gICovCi0gIGVudW0gbTY4a19vcGVyYW5kX3R5cGUgbW9kZTsKLQotICAvKiBUaGUgbWFpbiByZWdpc3Rlci4gICovCi0gIGVudW0gbTY4a19yZWdpc3RlciByZWc7Ci0KLSAgLyogVGhlIHJlZ2lzdGVyIG1hc2sgZm9yIG1vZGUgUkVHTFNULiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEFuIGVycm9yIG1lc3NhZ2UuICAqLwotICBjb25zdCBjaGFyICplcnJvcjsKLQotICAvKiBUaGUgaW5kZXggcmVnaXN0ZXIuICAqLwotICBzdHJ1Y3QgbTY4a19pbmRleHJlZyBpbmRleDsKLQotICAvKiBUaGUgZGlzcGxhY2VtZW50LiAgKi8KLSAgc3RydWN0IG02OGtfZXhwIGRpc3A7Ci0KLSAgLyogVGhlIG91dGVyIGRpc3BsYWNlbWVudC4gICovCi0gIHN0cnVjdCBtNjhrX2V4cCBvZGlzcDsKLX07Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE02OEtfUEFSU0VfSCkgKi8KLQotLyogVGhlIHBhcnNpbmcgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gaW50IG02OGtfaXBfb3AgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbTY4a19vcCAqKSk7Ci0KLS8qIFdoZXRoZXIgcmVnaXN0ZXIgcHJlZml4ZXMgYXJlIG9wdGlvbmFsLiAgKi8KLWV4dGVybiBpbnQgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9tNjhrLXBhcnNlLnkgYi9nYXMvY29uZmlnL202OGstcGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNGU0Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL202OGstcGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjEgKzAsMCBAQAotLyogbTY4ay55IC0tIGJpc29uIGdyYW1tYXIgZm9yIG02OGsgb3BlcmFuZCBwYXJzaW5nCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiBhbmQgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGEgYmlzb24gZ3JhbW1hciB0byBwYXJzZSBtNjhrIG9wZXJhbmRzLiAgVGhlIG02OGsKLSAgIGhhcyBhIGNvbXBsaWNhdGVkIG9wZXJhbmQgc3ludGF4LCBhbmQgZ2FzIHN1cHBvcnRzIHR3byBtYWluCi0gICB2YXJpYXRpb25zIG9mIGl0LiAgVXNpbmcgYSBncmFtbWFyIGlzIHByb2JhYmx5IG92ZXJraWxsLCBidXQgYXQKLSAgIGxlYXN0IGl0IG1ha2VzIGNsZWFyIGV4YWN0bHkgd2hhdCB3ZSBkbyBzdXBwb3J0LiAgKi8KLQotJXsKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAidGMtbTY4ay5oIgotI2luY2x1ZGUgIm02OGstcGFyc2UuaCIKLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsCi0gICBldGMpLCBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcyBJZiBvdGhlciBwYXJzZXIKLSAgIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQKLSAgIGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlCi0gICBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCi0KLSNkZWZpbmUJeXltYXhkZXB0aCBtNjhrX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJbTY4a19wYXJzZQotI2RlZmluZQl5eWxleAltNjhrX2xleAotI2RlZmluZQl5eWVycm9yCW02OGtfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCW02OGtfbHZhbAotI2RlZmluZQl5eWNoYXIJbTY4a19jaGFyCi0jZGVmaW5lCXl5ZGVidWcJbTY4a19kZWJ1ZwotI2RlZmluZQl5eXBhY3QJbTY4a19wYWN0CQotI2RlZmluZQl5eXIxCW02OGtfcjEJCQkKLSNkZWZpbmUJeXlyMgltNjhrX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCW02OGtfZGVmCQkKLSNkZWZpbmUJeXljaGsJbTY4a19jaGsJCQotI2RlZmluZQl5eXBnbwltNjhrX3BnbwkJCi0jZGVmaW5lCXl5YWN0CW02OGtfYWN0CQkKLSNkZWZpbmUJeXlleGNhCW02OGtfZXhjYQotI2RlZmluZSB5eWVycmZsYWcgbTY4a19lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJbTY4a19uZXJycwotI2RlZmluZQl5eXBzCW02OGtfcHMKLSNkZWZpbmUJeXlwdgltNjhrX3B2Ci0jZGVmaW5lCXl5cwltNjhrX3MKLSNkZWZpbmUJeXlfeXlzCW02OGtfeXlzCi0jZGVmaW5lCXl5c3RhdGUJbTY4a19zdGF0ZQotI2RlZmluZQl5eXRtcAltNjhrX3RtcAotI2RlZmluZQl5eXYJbTY4a192Ci0jZGVmaW5lCXl5X3l5dgltNjhrX3l5dgotI2RlZmluZQl5eXZhbAltNjhrX3ZhbAotI2RlZmluZQl5eWxsb2MJbTY4a19sbG9jCi0jZGVmaW5lIHl5cmVkcwltNjhrX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwltNjhrX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5bGhzCW02OGtfeXlsaHMKLSNkZWZpbmUgeXlsZW4JbTY4a195eWxlbgotI2RlZmluZSB5eWRlZnJlZCBtNjhrX3l5ZGVmcmVkCi0jZGVmaW5lIHl5ZGdvdG8JbTY4a195eWRnb3RvCi0jZGVmaW5lIHl5c2luZGV4IG02OGtfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggbTY4a195eXJpbmRleAotI2RlZmluZSB5eWdpbmRleCBtNjhrX3l5Z2luZGV4Ci0jZGVmaW5lIHl5dGFibGUJIG02OGtfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBtNjhrX3l5Y2hlY2sKLQotI2lmbmRlZiBZWURFQlVHCi0jZGVmaW5lIFlZREVCVUcgMQotI2VuZGlmCi0KLS8qIEludGVybmFsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4a19yZWdfcGFyc2UgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgcGFyc2VyIHNldHMgZmllbGRzIHBvaW50ZWQgdG8gYnkgdGhpcyBnbG9iYWwgdmFyaWFibGUuICAqLwotc3RhdGljIHN0cnVjdCBtNjhrX29wICpvcDsKLQotJX0KLQotJXVuaW9uCi17Ci0gIHN0cnVjdCBtNjhrX2luZGV4cmVnIGluZGV4cmVnOwotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotICBzdHJ1Y3QgbTY4a19leHAgZXhwOwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIGludCBvbmVyZWc7Ci19Ci0KLSV0b2tlbiA8cmVnPiBEUiBBUiBGUFIgRlBDUiBMUEMgWkFSIFpEUiBMWlBDIENSRUcKLSV0b2tlbiA8aW5kZXhyZWc+IElOREVYUkVHCi0ldG9rZW4gPGV4cD4gRVhQUgotCi0ldHlwZSA8aW5kZXhyZWc+IHppcmVnIHpkaXJlZwotJXR5cGUgPHJlZz4gemFkciB6ZHIgYXBjIHphcGMgenBjIG9wdHphcGMgb3B0Y3phcGMKLSV0eXBlIDxleHA+IG9wdGNleHByIG9wdGV4cHJjCi0ldHlwZSA8bWFzaz4gcmVnbGlzdCBpcmVnbGlzdCByZWdsaXN0cGFpcgotJXR5cGUgPG9uZXJlZz4gcmVnbGlzdHJlZwotCi0lJQotCi0vKiBBbiBvcGVyYW5kLiAgKi8KLQotb3BlcmFuZDoKLQkgIGdlbmVyaWNfb3BlcmFuZAotCXwgbW90b3JvbGFfb3BlcmFuZAotCXwgbWl0X29wZXJhbmQKLQk7Ci0KLS8qIEEgZ2VuZXJpYyBvcGVyYW5kLiAgKi8KLQotZ2VuZXJpY19vcGVyYW5kOgotCSAgRFIKLQkJewotCQkgIG9wLT5tb2RlID0gRFJFRzsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IEFSCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFSRUc7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBGUFIKLQkJewotCQkgIG9wLT5tb2RlID0gRlBSRUc7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBGUENSCi0JCXsKLQkJICBvcC0+bW9kZSA9IENPTlRST0w7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBDUkVHCi0JCXsKLQkJICBvcC0+bW9kZSA9IENPTlRST0w7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBFWFBSCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFCU0w7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJfQotCXwgJyMnIEVYUFIKLQkJewotCQkgIG9wLT5tb2RlID0gSU1NRUQ7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJfQotCXwgJyYnIEVYUFIKLQkJewotCQkgIG9wLT5tb2RlID0gSU1NRUQ7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJfQotCXwgcmVnbGlzdAotCQl7Ci0JCSAgb3AtPm1vZGUgPSBSRUdMU1Q7Ci0JCSAgb3AtPm1hc2sgPSAkMTsKLQkJfQotCTsKLQotLyogQW4gb3BlcmFuZCBpbiBNb3Rvcm9sYSBzeW50YXguICBUaGlzIGluY2x1ZGVzIE1SSSBzeW50YXggYXMgd2VsbCwKLSAgIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGRpZmZlcmVudCBpbiB0aGF0IGl0IHBlcm1pdHMgY29tbXV0YXRpdml0eQotICAgb2YgaW5kZXggYW5kIGJhc2UgcmVnaXN0ZXJzLCBhbmQgcGVybWl0cyBhbiBvZmZzZXQgZXhwcmVzc2lvbiB0bwotICAgYXBwZWFyIGluc2lkZSBvciBvdXRzaWRlIG9mIHRoZSBwYXJlbnRoZXNlcy4gICovCi0KLW1vdG9yb2xhX29wZXJhbmQ6Ci0JICAnKCcgQVIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFJTkRSOwotCQkgIG9wLT5yZWcgPSAkMjsKLQkJfQotCXwgJygnIEFSICcpJyAnKycKLQkJewotCQkgIG9wLT5tb2RlID0gQUlOQzsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCX0KLQl8ICctJyAnKCcgQVIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFERUM7Ci0JCSAgb3AtPnJlZyA9ICQzOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemFwYyAnKScKLQkJewotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQkgIGlmICgoJDQgPj0gWkFERFIwICYmICQ0IDw9IFpBRERSNykKLQkJICAgICAgfHwgJDQgPT0gWlBDKQotCQkgICAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIGVsc2UKLQkJICAgIG9wLT5tb2RlID0gRElTUDsKLQkJfQotCXwgJygnIHphcGMgJywnIEVYUFIgJyknCi0JCXsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBpZiAoKCQyID49IFpBRERSMCAmJiAkMiA8PSBaQUREUjcpCi0JCSAgICAgIHx8ICQyID09IFpQQykKLQkJICAgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBlbHNlCi0JCSAgICBvcC0+bW9kZSA9IERJU1A7Ci0JCX0KLQl8IEVYUFIgJygnIHphcGMgJyknCi0JCXsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBpZiAoKCQzID49IFpBRERSMCAmJiAkMyA8PSBaQUREUjcpCi0JCSAgICAgIHx8ICQzID09IFpQQykKLQkJICAgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBlbHNlCi0JCSAgICBvcC0+bW9kZSA9IERJU1A7Ci0JCX0KLQl8ICcoJyBMUEMgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IERJU1A7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQl9Ci0JfCAnKCcgWkFSICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMjsKLQkJfQotCXwgJygnIExaUEMgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemFwYyAnLCcgemlyZWcgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5kaXNwID0gJDI7Ci0JCSAgb3AtPmluZGV4ID0gJDY7Ci0JCX0KLQl8ICcoJyBFWFBSICcsJyB6YXBjICcsJyB6cGMgJyknCi0JCXsKLQkJICBpZiAoJDQgPT0gUEMgfHwgJDQgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDY7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJICBvcC0+aW5kZXgucmVnID0gJDQ7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemRpcmVnIG9wdGN6YXBjICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQkgIG9wLT5pbmRleCA9ICQ0OwotCQl9Ci0JfCAnKCcgemRpcmVnICcsJyBFWFBSICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5kaXNwID0gJDQ7Ci0JCSAgb3AtPmluZGV4ID0gJDI7Ci0JCX0KLQl8IEVYUFIgJygnIHphcGMgJywnIHppcmVnICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+ZGlzcCA9ICQxOwotCQkgIG9wLT5pbmRleCA9ICQ1OwotCQl9Ci0JfCAnKCcgemFwYyAnLCcgemlyZWcgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQkgIG9wLT5pbmRleCA9ICQ0OwotCQl9Ci0JfCBFWFBSICcoJyB6YXBjICcsJyB6cGMgJyknCi0JCXsKLQkJICBpZiAoJDMgPT0gUEMgfHwgJDMgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDU7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBvcC0+aW5kZXgucmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQl9Ci0JfCAnKCcgemFwYyAnLCcgenBjICcpJwotCQl7Ci0JCSAgaWYgKCQyID09IFBDIHx8ICQyID09IFpQQykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5pbmRleC5yZWcgPSAkMjsKLQkJICBvcC0+aW5kZXguc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQkgIG9wLT5pbmRleC5zY2FsZSA9IDE7Ci0JCX0KLQl8IEVYUFIgJygnIHpkaXJlZyBvcHRjemFwYyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDQ7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBvcC0+aW5kZXggPSAkMzsKLQkJfQotCXwgJygnIHpkaXJlZyBvcHRjemFwYyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4ID0gJDI7Ci0JCX0KLQl8ICcoJyAnWycgRVhQUiBvcHRjemFwYyAnXScgJywnIHppcmVnIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5pbmRleCA9ICQ3OwotCQkgIG9wLT5vZGlzcCA9ICQ4OwotCQl9Ci0JfCAnKCcgJ1snIEVYUFIgb3B0Y3phcGMgJ10nIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5vZGlzcCA9ICQ2OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJ10nICcsJyB6aXJlZyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4ID0gJDY7Ci0JCSAgb3AtPm9kaXNwID0gJDc7Ci0JCX0KLQl8ICcoJyAnWycgemFwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBPU1Q7Ci0JCSAgb3AtPnJlZyA9ICQzOwotCQkgIG9wLT5vZGlzcCA9ICQ1OwotCQl9Ci0JfCAnKCcgJ1snIEVYUFIgJywnIHphcGMgJywnIHppcmVnICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5pbmRleCA9ICQ3OwotCQkgIG9wLT5vZGlzcCA9ICQ5OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJywnIHppcmVnICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+aW5kZXggPSAkNTsKLQkJICBvcC0+b2Rpc3AgPSAkNzsKLQkJfQotCXwgJygnICdbJyBFWFBSICcsJyB6YXBjICcsJyB6cGMgJ10nIG9wdGNleHByICcpJwotCQl7Ci0JCSAgaWYgKCQ1ID09IFBDIHx8ICQ1ID09IFpQQykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDc7Ci0JCSAgb3AtPmRpc3AgPSAkMzsKLQkJICBvcC0+aW5kZXgucmVnID0gJDU7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQkgIG9wLT5vZGlzcCA9ICQ5OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJywnIHpwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBpZiAoJDMgPT0gUEMgfHwgJDMgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+aW5kZXgucmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQkgIG9wLT5vZGlzcCA9ICQ3OwotCQl9Ci0JfCAnKCcgJ1snIG9wdGV4cHJjIHpkaXJlZyBvcHRjemFwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDU7Ci0JCSAgb3AtPmRpc3AgPSAkMzsKLQkJICBvcC0+aW5kZXggPSAkNDsKLQkJICBvcC0+b2Rpc3AgPSAkNzsKLQkJfQotCTsKLQotLyogQW4gb3BlcmFuZCBpbiBNSVQgc3ludGF4LiAgKi8KLQotbWl0X29wZXJhbmQ6Ci0JICBvcHR6YXBjICdAJwotCQl7Ci0JCSAgLyogV2UgdXNlIG9wdHphcGMgdG8gYXZvaWQgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3QuICAqLwotCQkgIGlmICgkMSA8IEFERFIwIHx8ICQxID4gQUREUjcpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBBSU5EUjsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IG9wdHphcGMgJ0AnICcrJwotCQl7Ci0JCSAgLyogV2UgdXNlIG9wdHphcGMgdG8gYXZvaWQgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3QuICAqLwotCQkgIGlmICgkMSA8IEFERFIwIHx8ICQxID4gQUREUjcpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBBSU5DOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJfQotCXwgb3B0emFwYyAnQCcgJy0nCi0JCXsKLQkJICAvKiBXZSB1c2Ugb3B0emFwYyB0byBhdm9pZCBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdC4gICovCi0JCSAgaWYgKCQxIDwgQUREUjAgfHwgJDEgPiBBRERSNykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IEFERUM7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgRVhQUiAnKScKLQkJewotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIGlmICgoJDEgPj0gWkFERFIwICYmICQxIDw9IFpBRERSNykKLQkJICAgICAgfHwgJDEgPT0gWlBDKQotCQkgICAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIGVsc2UKLQkJICAgIG9wLT5tb2RlID0gRElTUDsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIG9wdGV4cHJjIHppcmVnICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIG9wLT5pbmRleCA9ICQ1OwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgRVhQUiAnKScgJ0AnICcoJyBvcHRleHByYyB6aXJlZyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+aW5kZXggPSAkOTsKLQkJICBvcC0+b2Rpc3AgPSAkODsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIEVYUFIgJyknICdAJyAnKCcgRVhQUiAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+b2Rpc3AgPSAkODsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIG9wdGV4cHJjIHppcmVnICcpJyAnQCcgJygnIEVYUFIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+aW5kZXggPSAkNTsKLQkJICBvcC0+b2Rpc3AgPSAkOTsKLQkJfQotCTsKLQotLyogQW4gaW5kZXggcmVnaXN0ZXIsIHBvc3NpYmx5IHN1cHByZXNzZWQsIHdoaWNoIG5lZWQgbm90IGhhdmUgYSBzaXplCi0gICBvciBzY2FsZS4gICovCi0KLXppcmVnOgotCSAgSU5ERVhSRUcKLQl8IHphZHIKLQkJewotCQkgICQkLnJlZyA9ICQxOwotCQkgICQkLnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICAkJC5zY2FsZSA9IDE7Ci0JCX0KLQk7Ci0KLS8qIEEgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIGFuIGluZGV4IHJlZ2lzdGVyLCBidXQgd2hpY2ggbWF5IG5vdCBiZSBhbgotICAgYWRkcmVzcyByZWdpc3Rlci4gIFRoaXMgbm9udGVybWluYWwgaXMgdXNlZCB0byBhdm9pZCBhbWJpZ3VpdHkgd2hlbgotICAgdHJ5aW5nIHRvIHBhcnNlIHNvbWV0aGluZyBsaWtlICgwLGQ1LGE2KSBhcyBjb21wYXJlZCB0byAoMCxhNixkNSkuICAqLwotCi16ZGlyZWc6Ci0JICBJTkRFWFJFRwotCXwgemRyCi0JCXsKLQkJICAkJC5yZWcgPSAkMTsKLQkJICAkJC5zaXplID0gU0laRV9VTlNQRUM7Ci0JCSAgJCQuc2NhbGUgPSAxOwotCQl9Ci0JOwotCi0vKiBBbiBhZGRyZXNzIG9yIGRhdGEgcmVnaXN0ZXIsIG9yIGEgc3VwcHJlc3NlZCBhZGRyZXNzIG9yIGRhdGEKLSAgIHJlZ2lzdGVyLiAgKi8KLQotemFkcjoKLQkgIHpkcgotCXwgQVIKLQl8IFpBUgotCTsKLQotLyogQSBkYXRhIHJlZ2lzdGVyIHdoaWNoIG1heSBiZSBzdXBwcmVzc2VkLiAgKi8KLQotemRyOgotCSAgRFIKLQl8IFpEUgotCTsKLQotLyogRWl0aGVyIGFuIGFkZHJlc3MgcmVnaXN0ZXIgb3IgdGhlIFBDLiAgKi8KLQotYXBjOgotCSAgQVIKLQl8IExQQwotCTsKLQotLyogRWl0aGVyIGFuIGFkZHJlc3MgcmVnaXN0ZXIsIG9yIHRoZSBQQywgb3IgYSBzdXBwcmVzc2VkIGFkZHJlc3MKLSAgIHJlZ2lzdGVyLCBvciBhIHN1cHByZXNzZWQgUEMuICAqLwotCi16YXBjOgotCSAgYXBjCi0JfCBMWlBDCi0JfCBaQVIKLQk7Ci0KLS8qIEFuIG9wdGlvbmFsIHphcGMuICAqLwotCi1vcHR6YXBjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gWkFERFIwOwotCQl9Ci0JfCB6YXBjCi0JOwotCi0vKiBUaGUgUEMsIG9wdGlvbmFsbHkgc3VwcHJlc3NlZC4gICovCi0KLXpwYzoKLQkgIExQQwotCXwgTFpQQwotCTsKLQotLyogJywnIHphcGMgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGN6YXBjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gWkFERFIwOwotCQl9Ci0JfCAnLCcgemFwYwotCQl7Ci0JCSAgJCQgPSAkMjsKLQkJfQotCTsKLQotLyogJywnIEVYUFIgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGNleHByOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0JCSAgJCQuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQl9Ci0JfCAnLCcgRVhQUgotCQl7Ci0JCSAgJCQgPSAkMjsKLQkJfQotCTsKLQotLyogRVhQUiAnLCcgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGV4cHJjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0JCSAgJCQuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQl9Ci0JfCBFWFBSICcsJwotCQl7Ci0JCSAgJCQgPSAkMTsKLQkJfQotCTsKLQotLyogQSByZWdpc3RlciBsaXN0IGZvciB0aGUgbW92ZW0gaW5zdHJ1Y3Rpb24uICAqLwotCi1yZWdsaXN0OgotCSAgcmVnbGlzdHBhaXIKLQl8IHJlZ2xpc3RwYWlyICcvJyBpcmVnbGlzdAotCQl7Ci0JCSAgJCQgPSAkMSB8ICQzOwotCQl9Ci0JfCByZWdsaXN0cmVnICcvJyBpcmVnbGlzdAotCQl7Ci0JCSAgJCQgPSAoMSA8PCAkMSkgfCAkMzsKLQkJfQotCTsKLQotLyogV2UgdXNlIGlyZWdsaXN0IHdoZW4gd2Uga25vdyB3ZSBhcmUgbG9va2luZyBhdCBhIHJlZ2xpc3QsIGFuZCB3ZQotICAgY2FuIHNhZmVseSByZWR1Y2UgYSBzaW1wbGUgcmVnaXN0ZXIgdG8gcmVnbGlzdHJlZy4gIElmIHdlIHBlcm1pdHRlZAotICAgcmVnbGlzdCB0byByZWR1Y2UgdG8gcmVnbGlzdHJlZywgaXQgd291bGQgYmUgYW1iaWd1b3VzIHdoZXRoZXIgYQotICAgcGxhaW4gcmVnaXN0ZXIgd2VyZSBhIERSRUcvQVJFRy9GUFJFRyBvciBhIFJFR0xTVC4gICovCi0KLWlyZWdsaXN0OgotCSAgcmVnbGlzdHJlZwotCQl7Ci0JCSAgJCQgPSAxIDw8ICQxOwotCQl9Ci0JfCByZWdsaXN0cGFpcgotCXwgcmVnbGlzdHBhaXIgJy8nIGlyZWdsaXN0Ci0JCXsKLQkJICAkJCA9ICQxIHwgJDM7Ci0JCX0KLQl8IHJlZ2xpc3RyZWcgJy8nIGlyZWdsaXN0Ci0JCXsKLQkJICAkJCA9ICgxIDw8ICQxKSB8ICQzOwotCQl9Ci0JOwotCi1yZWdsaXN0cGFpcjoKLQkgIHJlZ2xpc3RyZWcgJy0nIHJlZ2xpc3RyZWcKLQkJewotCQkgIGlmICgkMSA8PSAkMykKLQkJICAgICQkID0gKDEgPDwgKCQzICsgMSkpIC0gMSAtICgoMSA8PCAkMSkgLSAxKTsKLQkJICBlbHNlCi0JCSAgICAkJCA9ICgxIDw8ICgkMSArIDEpKSAtIDEgLSAoKDEgPDwgJDMpIC0gMSk7Ci0JCX0KLQk7Ci0KLXJlZ2xpc3RyZWc6Ci0JICBEUgotCQl7Ci0JCSAgJCQgPSAkMSAtIERBVEEwOwotCQl9Ci0JfCBBUgotCQl7Ci0JCSAgJCQgPSAkMSAtIEFERFIwICsgODsKLQkJfQotCXwgRlBSCi0JCXsKLQkJICAkJCA9ICQxIC0gRlAwICsgMTY7Ci0JCX0KLQl8IEZQQ1IKLQkJewotCQkgIGlmICgkMSA9PSBGUEkpCi0JCSAgICAkJCA9IDI0OwotCQkgIGVsc2UgaWYgKCQxID09IEZQUykKLQkJICAgICQkID0gMjU7Ci0JCSAgZWxzZQotCQkgICAgJCQgPSAyNjsKLQkJfQotCTsKLQotJSUKLQotLyogVGhlIHN0cmluZyB0byBwYXJzZSBpcyBzdG9yZWQgaGVyZSwgYW5kIG1vZGlmaWVkIGJ5IHl5bGV4LiAgKi8KLQotc3RhdGljIGNoYXIgKnN0cjsKLQotLyogVGhlIG9yaWdpbmFsIHN0cmluZyBwb2ludGVyLiAgKi8KLQotc3RhdGljIGNoYXIgKnN0cm9yaWc7Ci0KLS8qIElmICpDQ1AgY291bGQgYmUgYSByZWdpc3RlciwgcmV0dXJuIHRoZSByZWdpc3RlciBudW1iZXIgYW5kIGFkdmFuY2UKLSAgICpDQ1AuICBPdGhlcndpc2UgZG9uJ3QgY2hhbmdlICpDQ1AsIGFuZCByZXR1cm4gMC4gICovCi0KLXN0YXRpYyBlbnVtIG02OGtfcmVnaXN0ZXIKLW02OGtfcmVnX3BhcnNlIChjY3ApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKipjY3A7Ci17Ci0gIGNoYXIgKnN0YXJ0ID0gKmNjcDsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzeW1ib2xTICpzeW1ib2xwOwotCi0gIGlmIChmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCi0gICAgewotICAgICAgaWYgKCpzdGFydCA9PSBSRUdJU1RFUl9QUkVGSVgpCi0Jc3RhcnQrKzsKLSAgICAgIHAgPSBzdGFydDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKnN0YXJ0ICE9IFJFR0lTVEVSX1BSRUZJWCkKLQlyZXR1cm4gMDsKLSAgICAgIHAgPSBzdGFydCArIDE7Ci0gICAgfQotCi0gIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKCpwKSkKLSAgICByZXR1cm4gMDsKLQotICBwKys7Ci0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCpwKSAmJiAqcCAhPSAnLicgJiYgKnAgIT0gJzonICYmICpwICE9ICcqJykKLSAgICBwKys7Ci0KLSAgYyA9ICpwOwotICAqcCA9IDA7Ci0gIHN5bWJvbHAgPSBzeW1ib2xfZmluZCAoc3RhcnQpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHN5bWJvbHAgIT0gTlVMTCAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xwKSA9PSByZWdfc2VjdGlvbikKLSAgICB7Ci0gICAgICAqY2NwID0gcDsKLSAgICAgIHJldHVybiBTX0dFVF9WQUxVRSAoc3ltYm9scCk7Ci0gICAgfQotCi0gIC8qIEluIE1SSSBtb2RlLCBzb21ldGhpbmcgbGlrZSBmb28uYmFyIGNhbiBiZSBlcXVhdGVkIHRvIGEgcmVnaXN0ZXIKLSAgICAgbmFtZS4gICovCi0gIHdoaWxlIChmbGFnX21yaSAmJiBjID09ICcuJykKLSAgICB7Ci0gICAgICArK3A7Ci0gICAgICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqcCkgJiYgKnAgIT0gJy4nICYmICpwICE9ICc6JyAmJiAqcCAhPSAnKicpCi0JcCsrOwotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgc3ltYm9scCA9IHN5bWJvbF9maW5kIChzdGFydCk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoc3ltYm9scCAhPSBOVUxMICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbHApID09IHJlZ19zZWN0aW9uKQotCXsKLQkgICpjY3AgPSBwOwotCSAgcmV0dXJuIFNfR0VUX1ZBTFVFIChzeW1ib2xwKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgbGV4ZXIuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotICBjaGFyICpzOwotICBpbnQgcGFyZW5zOwotICBpbnQgYyA9IDA7Ci0gIGludCB0YWlsID0gMDsKLSAgY2hhciAqaG9sZDsKLQotICBpZiAoKnN0ciA9PSAnICcpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgPT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLQotICAvKiBWYXJpb3VzIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUganVzdCByZXR1cm5lZCBkaXJlY3RseS4gICovCi0gIHN3aXRjaCAoKnN0cikKLSAgICB7Ci0gICAgY2FzZSAnQCc6Ci0gICAgICAvKiBJbiBNUkkgbW9kZSwgdGhpcyBjYW4gYmUgdGhlIHN0YXJ0IG9mIGFuIG9jdGFsIG51bWJlci4gICovCi0gICAgICBpZiAoZmxhZ19tcmkpCi0JewotCSAgaWYgKGlzZGlnaXQgKHN0clsxXSkKLQkgICAgICB8fCAoKHN0clsxXSA9PSAnKycgfHwgc3RyWzFdID09ICctJykKLQkJICAmJiBpc2RpZ2l0IChzdHJbMl0pKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICcmJzoKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcpJzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICAgIHJldHVybiAqc3RyKys7Ci0gICAgY2FzZSAnKyc6Ci0gICAgICAvKiBJdCBzbyBoYXBwZW5zIHRoYXQgYSAnKycgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQgb2YgYW4KLSAgICAgICAgIG9wZXJhbmQuICBJZiBpdCBhcHBlYXJzIGFueXdoZXJlIGVsc2UsIGl0IG11c3QgYmUgYSB1bmFyeQotICAgICAgICAgcGx1cyBvbiBhbiBleHByZXNzaW9uLiAgKi8KLSAgICAgIGlmIChzdHJbMV0gPT0gJ1wwJykKLQlyZXR1cm4gKnN0cisrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnLSc6Ci0gICAgICAvKiBBICctJyBjYW4gb25seSBhcHBlYXIgaW4gLShhciksIHJuLXJuLCBvciBhckAtLiAgSWYgaXQKLSAgICAgICAgIGFwcGVhcnMgYW55d2hlcmUgZWxzZSwgaXQgbXVzdCBiZSBhIHVuYXJ5IG1pbnVzIG9uIGFuCi0gICAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICAgIGlmIChzdHJbMV0gPT0gJ1wwJykKLQlyZXR1cm4gKnN0cisrOwotICAgICAgcyA9IHN0ciArIDE7Ci0gICAgICBpZiAoKnMgPT0gJygnKQotCSsrczsKLSAgICAgIGlmIChtNjhrX3JlZ19wYXJzZSAoJnMpICE9IDApCi0JcmV0dXJuICpzdHIrKzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJygnOgotICAgICAgLyogQSAnKCcgY2FuIG9ubHkgYXBwZWFyIGluIGAocmVnKScsIGAoZXhwciwuLi4nLCBgKFsnLCBgQCgnLCBvcgotICAgICAgICAgYCkoJy4gIElmIGl0IGFwcGVhcnMgYW55d2hlcmUgZWxzZSwgaXQgbXVzdCBiZSBzdGFydGluZyBhbgotICAgICAgICAgZXhwcmVzc2lvbi4gICovCi0gICAgICBpZiAoc3RyWzFdID09ICdbJwotCSAgfHwgKHN0ciA+IHN0cm9yaWcKLQkgICAgICAmJiAoc3RyWy0xXSA9PSAnQCcKLQkJICB8fCBzdHJbLTFdID09ICcpJykpKQotCXJldHVybiAqc3RyKys7Ci0gICAgICBzID0gc3RyICsgMTsKLSAgICAgIGlmIChtNjhrX3JlZ19wYXJzZSAoJnMpICE9IDApCi0JcmV0dXJuICpzdHIrKzsKLSAgICAgIC8qIENoZWNrIGZvciB0aGUgY2FzZSBvZiAnKGV4cHIsLi4uJyBieSBzY2FubmluZyBhaGVhZC4gIElmIHdlCi0gICAgICAgICBmaW5kIGEgY29tbWEgb3V0c2lkZSBvZiBiYWxhbmNlZCBwYXJlbnRoZXNlcywgd2UgcmV0dXJuICcoJy4KLSAgICAgICAgIElmIHdlIGZpbmQgYW4gdW5iYWxhbmNlZCByaWdodCBwYXJlbnRoZXNpcywgdGhlbiBwcmVzdW1hYmx5Ci0gICAgICAgICB0aGUgJygnIHJlYWxseSBzdGFydHMgYW4gZXhwcmVzc2lvbi4gICovCi0gICAgICBwYXJlbnMgPSAwOwotICAgICAgZm9yIChzID0gc3RyICsgMTsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgqcyA9PSAnKCcpCi0JICAgICsrcGFyZW5zOwotCSAgZWxzZSBpZiAoKnMgPT0gJyknKQotCSAgICB7Ci0JICAgICAgaWYgKHBhcmVucyA9PSAwKQotCQlicmVhazsKLQkgICAgICAtLXBhcmVuczsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnMgPT0gJywnICYmIHBhcmVucyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQSBjb21tYSBjYW4gbm90IG5vcm1hbGx5IGFwcGVhciBpbiBhbiBleHByZXNzaW9uLCBzbwotCQkgdGhpcyBpcyBhIGNhc2Ugb2YgJyhleHByLC4uLicuICAqLwotCSAgICAgIHJldHVybiAqc3RyKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBpdCdzIGEgcmVnaXN0ZXIuICAqLwotCi0gIHJlZyA9IG02OGtfcmVnX3BhcnNlICgmc3RyKTsKLSAgaWYgKHJlZyAhPSAwKQotICAgIHsKLSAgICAgIGludCByZXQ7Ci0KLSAgICAgIHl5bHZhbC5yZWcgPSByZWc7Ci0KLSAgICAgIGlmIChyZWcgPj0gREFUQTAgJiYgcmVnIDw9IERBVEE3KQotCXJldCA9IERSOwotICAgICAgZWxzZSBpZiAocmVnID49IEFERFIwICYmIHJlZyA8PSBBRERSNykKLQlyZXQgPSBBUjsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSBGUDAgJiYgcmVnIDw9IEZQNykKLQlyZXR1cm4gRlBSOwotICAgICAgZWxzZSBpZiAocmVnID09IEZQSQotCSAgICAgICB8fCByZWcgPT0gRlBTCi0JICAgICAgIHx8IHJlZyA9PSBGUEMpCi0JcmV0dXJuIEZQQ1I7Ci0gICAgICBlbHNlIGlmIChyZWcgPT0gUEMpCi0JcmV0dXJuIExQQzsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSBaREFUQTAgJiYgcmVnIDw9IFpEQVRBNykKLQlyZXQgPSBaRFI7Ci0gICAgICBlbHNlIGlmIChyZWcgPj0gWkFERFIwICYmIHJlZyA8PSBaQUREUjcpCi0JcmV0ID0gWkFSOwotICAgICAgZWxzZSBpZiAocmVnID09IFpQQykKLQlyZXR1cm4gTFpQQzsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQ1JFRzsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmUgYSBkYXRhIG9yIGFkZHJlc3MgcmVnaXN0ZXIuICBXZQotCSBtdXN0IGNoZWNrIGZvciBhIHNpemUgb3Igc2NhbGU7IGlmIHdlIGZpbmQgb25lLCB3ZSBtdXN0Ci0JIHJldHVybiBJTkRFWFJFRy4gICovCi0KLSAgICAgIHMgPSBzdHI7Ci0KLSAgICAgIGlmICgqcyAhPSAnLicgJiYgKnMgIT0gJzonICYmICpzICE9ICcqJykKLQlyZXR1cm4gcmV0OwotCi0gICAgICB5eWx2YWwuaW5kZXhyZWcucmVnID0gcmVnOwotCi0gICAgICBpZiAoKnMgIT0gJy4nICYmICpzICE9ICc6JykKLQl5eWx2YWwuaW5kZXhyZWcuc2l6ZSA9IFNJWkVfVU5TUEVDOwotICAgICAgZWxzZQotCXsKLQkgICsrczsKLQkgIHN3aXRjaCAoKnMpCi0JICAgIHsKLQkgICAgY2FzZSAndyc6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIHl5bHZhbC5pbmRleHJlZy5zaXplID0gU0laRV9XT1JEOwotCSAgICAgICsrczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JICAgIGNhc2UgJ0wnOgotCSAgICAgIHl5bHZhbC5pbmRleHJlZy5zaXplID0gU0laRV9MT05HOwotCSAgICAgICsrczsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICB5eWVycm9yIChfKCJpbGxlZ2FsIHNpemUgc3BlY2lmaWNhdGlvbiIpKTsKLQkgICAgICB5eWx2YWwuaW5kZXhyZWcuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICB5eWx2YWwuaW5kZXhyZWcuc2NhbGUgPSAxOwotCi0gICAgICBpZiAoKnMgPT0gJyonIHx8ICpzID09ICc6JykKLQl7Ci0JICBleHByZXNzaW9uUyBzY2FsZTsKLQotCSAgKytzOwotCi0JICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQkgIGV4cHJlc3Npb24gKCZzY2FsZSk7Ci0JICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgaWYgKHNjYWxlLlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgeXllcnJvciAoXygic2NhbGUgc3BlY2lmaWNhdGlvbiBtdXN0IHJlc29sdmUgdG8gYSBudW1iZXIiKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHNjYWxlLlhfYWRkX251bWJlcikKLQkJewotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJY2FzZSA0OgotCQljYXNlIDg6Ci0JCSAgeXlsdmFsLmluZGV4cmVnLnNjYWxlID0gc2NhbGUuWF9hZGRfbnVtYmVyOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIHl5ZXJyb3IgKF8oImludmFsaWQgc2NhbGUgdmFsdWUiKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgc3RyID0gczsKLQotICAgICAgcmV0dXJuIElOREVYUkVHOwotICAgIH0KLQotICAvKiBJdCBtdXN0IGJlIGFuIGV4cHJlc3Npb24uICBCZWZvcmUgd2UgY2FsbCBleHByZXNzaW9uLCB3ZSBuZWVkIHRvCi0gICAgIGxvb2sgYWhlYWQgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc2l6ZSBzcGVjaWZpY2F0aW9uLiAgV2UgbXVzdCBkbwotICAgICB0aGF0IGZpcnN0LCBiZWNhdXNlIG90aGVyd2lzZSBmb28ubCB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlIHN5bWJvbAotICAgICBmb28ubCwgcmF0aGVyIHRoYW4gYXMgdGhlIHN5bWJvbCBmb28gd2l0aCBhIGxvbmcgc2l6ZQotICAgICBzcGVjaWZpY2F0aW9uLiAgVGhlIGdyYW1tYXIgcmVxdWlyZXMgdGhhdCBhbGwgZXhwcmVzc2lvbnMgZW5kIGF0Ci0gICAgIHRoZSBlbmQgb2YgdGhlIG9wZXJhbmQsIG9yIHdpdGggJywnLCAnKCcsICddJywgJyknLiAgKi8KLQotICBwYXJlbnMgPSAwOwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCc7IHMrKykKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJygnKQotCXsKLQkgIGlmIChwYXJlbnMgPT0gMAotCSAgICAgICYmIHMgPiBzdHIKLQkgICAgICAmJiAoc1stMV0gPT0gJyknIHx8IGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzWy0xXSkpKQotCSAgICBicmVhazsKLQkgICsrcGFyZW5zOwotCX0KLSAgICAgIGVsc2UgaWYgKCpzID09ICcpJykKLQl7Ci0JICBpZiAocGFyZW5zID09IDApCi0JICAgIGJyZWFrOwotCSAgLS1wYXJlbnM7Ci0JfQotICAgICAgZWxzZSBpZiAocGFyZW5zID09IDAKLQkgICAgICAgJiYgKCpzID09ICcsJyB8fCAqcyA9PSAnXScpKQotCWJyZWFrOwotICAgIH0KLQotICB5eWx2YWwuZXhwLnNpemUgPSBTSVpFX1VOU1BFQzsKLSAgaWYgKHMgPD0gc3RyICsgMgotICAgICAgfHwgKHNbLTJdICE9ICcuJyAmJiBzWy0yXSAhPSAnOicpKQotICAgIHRhaWwgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzWy0xXSkKLQl7Ci0JY2FzZSAncyc6Ci0JY2FzZSAnUyc6Ci0JY2FzZSAnYic6Ci0JY2FzZSAnQic6Ci0JICB5eWx2YWwuZXhwLnNpemUgPSBTSVpFX0JZVEU7Ci0JICBicmVhazsKLQljYXNlICd3JzoKLQljYXNlICdXJzoKLQkgIHl5bHZhbC5leHAuc2l6ZSA9IFNJWkVfV09SRDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCWNhc2UgJ0wnOgotCSAgeXlsdmFsLmV4cC5zaXplID0gU0laRV9MT05HOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICh5eWx2YWwuZXhwLnNpemUgIT0gU0laRV9VTlNQRUMpCi0JdGFpbCA9IDI7Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VMRgotICB7Ci0gICAgLyogTG9vayBmb3IgQFBMVFBDLCBldGMuICAqLwotICAgIGNoYXIgKmNwOwotCi0gICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfbm9uZTsKLSAgICBjcCA9IHMgLSB0YWlsOwotICAgIGlmIChjcCAtIDYgPiBzdHIgJiYgY3BbLTZdID09ICdAJykKLSAgICAgIHsKLQlpZiAoc3RybmNtcCAoY3AgLSA2LCAiQFBMVFBDIiwgNikgPT0gMCkKLQkgIHsKLQkgICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfcGx0X3BjcmVsOwotCSAgICB0YWlsICs9IDY7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgLSA2LCAiQEdPVFBDIiwgNikgPT0gMCkKLQkgIHsKLQkgICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfZ290X3BjcmVsOwotCSAgICB0YWlsICs9IDY7Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoY3AgLSA0ID4gc3RyICYmIGNwWy00XSA9PSAnQCcpCi0gICAgICB7Ci0JaWYgKHN0cm5jbXAgKGNwIC0gNCwgIkBQTFQiLCA0KSA9PSAwKQotCSAgewotCSAgICB5eWx2YWwuZXhwLnBpY19yZWxvYyA9IHBpY19wbHRfb2ZmOwotCSAgICB0YWlsICs9IDQ7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgLSA0LCAiQEdPVCIsIDQpID09IDApCi0JICB7Ci0JICAgIHl5bHZhbC5leHAucGljX3JlbG9jID0gcGljX2dvdF9vZmY7Ci0JICAgIHRhaWwgKz0gNDsKLQkgIH0KLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgaWYgKHRhaWwgIT0gMCkKLSAgICB7Ci0gICAgICBjID0gc1stdGFpbF07Ci0gICAgICBzWy10YWlsXSA9IDA7Ci0gICAgfQotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgZXhwcmVzc2lvbiAoJnl5bHZhbC5leHAuZXhwKTsKLSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0gIGlmICh0YWlsICE9IDApCi0gICAgewotICAgICAgc1stdGFpbF0gPSBjOwotICAgICAgc3RyID0gczsKLSAgICB9Ci0KLSAgcmV0dXJuIEVYUFI7Ci19Ci0KLS8qIFBhcnNlIGFuIG02OGsgb3BlcmFuZC4gIFRoaXMgaXMgdGhlIG9ubHkgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkCi0gICBmcm9tIG91dHNpZGUgdGhpcyBmaWxlLiAgKi8KLQotaW50Ci1tNjhrX2lwX29wIChzLCBvcGFyZykKLSAgICAgY2hhciAqczsKLSAgICAgc3RydWN0IG02OGtfb3AgKm9wYXJnOwotewotICBtZW1zZXQgKG9wYXJnLCAwLCBzaXplb2YgKm9wYXJnKTsKLSAgb3BhcmctPmVycm9yID0gTlVMTDsKLSAgb3BhcmctPmluZGV4LnJlZyA9IFpEQVRBMDsKLSAgb3BhcmctPmluZGV4LnNjYWxlID0gMTsKLSAgb3BhcmctPmRpc3AuZXhwLlhfb3AgPSBPX2Fic2VudDsKLSAgb3BhcmctPm9kaXNwLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0KLSAgc3RyID0gc3Ryb3JpZyA9IHM7Ci0gIG9wID0gb3Bhcmc7Ci0KLSAgcmV0dXJuIHl5cGFyc2UgKCk7Ci19Ci0KLS8qIFRoZSBlcnJvciBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXl5ZXJyb3IgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIG9wLT5lcnJvciA9IHM7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL204OGstb3Bjb2RlLmggYi9nYXMvY29uZmlnL204OGstb3Bjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDY0YmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qIG04OGstb3Bjb2RlLmggLS0gSW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAotICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5Ci0gICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKgotICBDaGFyYWN0ZXIgY29kZXMgZm9yIG9wX3NwZWMgZmllbGQgYmVsb3cuCi0gIFJlc2VydmVkIGZvciBzZWxmLW1hdGNoaW5nOiBbIF0gLAotCi0gIGQgPSBHUkYgRGVzdGluYXRpb24gcmVnaXN0ZXIgKDIxOjUpCi0gIHggPSBYUkYgcmVnaXN0ZXIgcHJlZml4LiAgTWFrZXMgbmV4dCBkLCAxLCBvciAyLCBtYXRjaCBhbiBleHRlbmRlZCByZWdpc3Rlci4KLSAgMSA9IFNvdXJjZSByZWdpc3RlciAxICgxNjo1KQotICAyID0gU291cmNlIHJlZ2lzdGVyIDIgKDA6NSkKLSAgMyA9IEJvdGggc291cmNlIHJlZ2lzdGVycyAoc2FtZSB2YWx1ZSkgKDA6NSBhbmQgMTY6NSkKLSAgSSA9IElNTTE2ICgwOjE2KQotICBiID0gYml0IGZpZWxkIHNwZWMuICgwOjEwKQotICBwID0gMTYgYml0IHBjIGRpc3BsLiAoMDoxNikKLSAgUCA9IDI2IGJpdCBwYyBkaXNwbC4gKDA6MjYpCi0gIEIgPSBiYjAvYmIxIGNvbmRpdGlvbiAoMjE6NSkKLSAgTSA9IGJjbmQgY29uZGl0aW9uICgyMTo1KQotICBmID0gZmNyICg1OjYpCi0gIGMgPSBjciAoNTo2KQotICBWID0gVkVDOSAoMDo5KQotICBvID0gTzYgZmllbGQgb2YgInByb3QiIGluc24gKDEwOjcpCi0gID8gPSBHaXZlIHdhcm5pbmcgZm9yIHRoaXMgaW5zbi9vcGVyYW5kIGNvbWJpbmF0aW9uCi0gKi8KLQotLyogaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KLQotc3RydWN0IG04OGtfb3Bjb2RlCi17Ci0gIHVuc2lnbmVkIGludCBvcGNvZGU7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKm9wX3NwZWM7Ci19OwotCi0vKiBhbmQgaW50cm9kdWNpbmcuLi4gdGhlIE1vdG9yb2xhIDg4MTAwIGFuZCA4ODExMCBpbnN0cnVjdGlvbiBzZXRzLi4uICovCi0KLS8qIEJ5IGRlZmF1bHQsIGluY2x1ZGUgdGhlIDg4MTEwIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIE1DODgxMTAKLQotI2lmIGRlZmluZWQgKE1DODgxMTApCi0jZGVmaW5lIF9NQzg4MTAwKE9QQ09ERSxNTkVNLE9QX1NQRUMpCi0jZGVmaW5lIF9NQzg4MTEwKE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLSNlbHNlCi0jZGVmaW5lIF9NQzg4MTAwKE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLSNkZWZpbmUgX01DODgxMTAoT1BDT0RFLE1ORU0sT1BfU1BFQykKLSNlbmRpZgotCi0jZGVmaW5lIF9NQzg4eHh4KE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLQotLyogRXF1YWwgbW5lbW9uaWNzIG11c3QgYmUgYWRqYWNlbnQuCi0gICBNb3JlIHNwZWNpZmljIG9wZXJhbmQgc3BlY2lmaWNhdGlvbiBtdXN0IGdvIGJlZm9yZSBtb3JlIGdlbmVyYWwuCi0gICBGb3IgZXhhbXBsZSwgImQsMSwyIiBtdXN0IGdvIGJlZm9yZSAiZCwxLEkiIGFzIGEgcmVnaXN0ZXIgZm9yIHMyCi0gICB3b3VsZCBvdGhlcndpc2UgYmUgY29uc2lkZXJlZCBhIHZhcmlhYmxlIG5hbWUuICAqLwotCi1zdGF0aWMgc3RydWN0IG04OGtfb3Bjb2RlIG04OGtfb3Bjb2Rlc1tdID0KLXsKLSAgLyoJICAgT3Bjb2RlCU1uZW1vbmljCU9wc3BlYyAqLwotCi0gIF9NQzg4eHh4ICgweGY0MDA3MDAwLCAiYWRkIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDcwMDAwMDAwLCAiYWRkIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA3MjAwLCAiYWRkLmNpIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDczMDAsICJhZGQuY2lvIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDcxMDAsICJhZGQuY28iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImFkZHUiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NjAwMDAwMDAsICJhZGR1IiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MjAwLCAiYWRkdS5jaSIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MzAwLCAiYWRkdS5jaW8iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNjEwMCwgImFkZHUuY28iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNDAwMCwgImFuZCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg0MDAwMDAwMCwgImFuZCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNDQwMCwgImFuZC5jIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4NDQwMDAwMDAsICJhbmQudSIsCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGQwMDAwMDAwLCAiYmIwIiwJCSJCLDEscCIpCi0gIF9NQzg4eHh4ICgweGQ0MDAwMDAwLCAiYmIwLm4iLAkiQiwxLHAiKQotICBfTUM4OHh4eCAoMHhkODAwMDAwMCwgImJiMSIsCQkiQiwxLHAiKQotICBfTUM4OHh4eCAoMHhkYzAwMDAwMCwgImJiMS5uIiwJIkIsMSxwIikKLSAgX01DODh4eHggKDB4ZTgwMDAwMDAsICJiY25kIiwJCSJNLDEscCIpCi0gIF9NQzg4eHh4ICgweGVjMDAwMDAwLCAiYmNuZC5uIiwJIk0sMSxwIikKLSAgX01DODh4eHggKDB4YzAwMDAwMDAsICJiciIsCQkiUCIpCi0gIF9NQzg4eHh4ICgweGM0MDAwMDAwLCAiYnIubiIsCQkiUCIpCi0gIF9NQzg4eHh4ICgweGM4MDAwMDAwLCAiYnNyIiwJCSJQIikKLSAgX01DODh4eHggKDB4Y2MwMDAwMDAsICJic3IubiIsCSJQIikKLSAgX01DODh4eHggKDB4ZjQwMDgwMDAsICJjbHIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMDgwMDAsICJjbHIiLAkJImQsMSxiIikKLSAgX01DODh4eHggKDB4ZjQwMDdjMDAsICJjbXAiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4N2MwMDAwMDAsICJjbXAiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc4MDAsICJkaXYiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NzgwMDAwMDAsICJkaXYiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc4MDAsICJkaXZzIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDc4MDAwMDAwLCAiZGl2cyIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmNDAwNjkwMCwgImRpdnUuZCIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2ODAwLCAiZGl2dSIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2ODAwMDAwMCwgImRpdnUiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDkwMDAsICJleHQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMDkwMDAsICJleHQiLAkJImQsMSxiIikKLSAgX01DODh4eHggKDB4ZjQwMDk4MDAsICJleHR1IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDA5ODAwLCAiZXh0dSIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHg4NDAwMjgwMCwgImZhZGQuc3NzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGE4MDAsICJmYWRkLnNzcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyODgwLCAiZmFkZC5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTgyMCwgImZhZGQuc3NkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGE4NDAsICJmYWRkLnNzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyYTAwLCAiZmFkZC5zZHMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTg4MCwgImZhZGQuc2RzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDJhODAsICJmYWRkLnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhOGEwLCAiZmFkZC5zZGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYThjMCwgImZhZGQuc2R4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGE5MDAsICJmYWRkLnN4cyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhOTIwLCAiZmFkZC5zeGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTk0MCwgImZhZGQuc3h4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDI4MjAsICJmYWRkLmRzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYTAwLCAiZmFkZC5kc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMjhhMCwgImZhZGQuZHNkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhMjAsICJmYWRkLmRzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYTQwLCAiZmFkZC5kc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMmEyMCwgImZhZGQuZGRzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhODAsICJmYWRkLmRkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyYWEwLCAiZmFkZC5kZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWFhMCwgImZhZGQuZGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhYzAsICJmYWRkLmRkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYjAwLCAiZmFkZC5keHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWIyMCwgImZhZGQuZHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFiNDAsICJmYWRkLmR4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYzAwLCAiZmFkZC54c3MiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWMyMCwgImZhZGQueHNkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFjNDAsICJmYWRkLnhzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYzgwLCAiZmFkZC54ZHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWNhMCwgImZhZGQueGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFjYzAsICJmYWRkLnhkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhZDAwLCAiZmFkZC54eHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWQyMCwgImZhZGQueHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFkNDAsICJmYWRkLnh4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzYTgwLCAiZmNtcC5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmE4MCwgImZjbXAuc2RkIiwJImQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwM2EwMCwgImZjbXAuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGJhMDAsICJmY21wLnNkcyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGJiMDAsICJmY21wLnNkeCIsCSJkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDM4ODAsICJmY21wLnNzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiODgwLCAiZmNtcC5zc2QiLAkiZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzODAwLCAiZmNtcC5zc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjgwMCwgImZjbXAuc3NzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjkwMCwgImZjbXAuc3N4IiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmM4MCwgImZjbXAuc3hkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmMwMCwgImZjbXAuc3hzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmQwMCwgImZjbXAuc3h4IiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwM2FhMCwgImZjbXB1LnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYWEwLCAiZmNtcHUuc2RkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwM2EyMCwgImZjbXB1LnNkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYTIwLCAiZmNtcHUuc2RzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmIyMCwgImZjbXB1LnNkeCIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDM4YTAsICJmY21wdS5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjhhMCwgImZjbXB1LnNzZCIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDM4MjAsICJmY21wdS5zc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjgyMCwgImZjbXB1LnNzcyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI5MjAsICJmY21wdS5zc3giLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiY2EwLCAiZmNtcHUuc3hkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmMyMCwgImZjbXB1LnN4cyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGJkMjAsICJmY21wdS5zeHgiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDAwODgwLCAiZmN2dC5kcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODg4MCwgImZjdnQuZHMiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODhjMCwgImZjdnQuZHgiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwMDgyMCwgImZjdnQuc2QiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMDg4MjAsICJmY3Z0LnNkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg4NDAsICJmY3Z0LnN4IiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg5MjAsICJmY3Z0LnhkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg5MDAsICJmY3Z0LnhzIiwJInhkLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcwMDAsICJmZGl2LnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMDAwLCAiZmRpdi5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzA4MCwgImZkaXYuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwMjAsICJmZGl2LnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMDQwLCAiZmRpdi5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzIwMCwgImZkaXYuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwODAsICJmZGl2LnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MjgwLCAiZmRpdi5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjBhMCwgImZkaXYuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwYzAsICJmZGl2LnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMTAwLCAiZmRpdi5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjEyMCwgImZkaXYuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYxNDAsICJmZGl2LnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MDIwLCAiZmRpdi5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjIwMCwgImZkaXYuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcwYTAsICJmZGl2LmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMjIwLCAiZmRpdi5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjI0MCwgImZkaXYuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcyMjAsICJmZGl2LmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMjgwLCAiZmRpdi5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzJhMCwgImZkaXYuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYyYTAsICJmZGl2LmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMmMwLCAiZmRpdi5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjMwMCwgImZkaXYuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYzMjAsICJmZGl2LmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMzQwLCAiZmRpdi5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjQwMCwgImZkaXYueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY0MjAsICJmZGl2LnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNDQwLCAiZmRpdi54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjQ4MCwgImZkaXYueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY0YTAsICJmZGl2LnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNGMwLCAiZmRpdi54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjUwMCwgImZkaXYueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY1MjAsICJmZGl2Lnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNTQwLCAiZmRpdi54eHgiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHhmNDAwZWMwMCwgImZmMCIsCQkiZCwyIikKLSAgX01DODh4eHggKDB4ZjQwMGU4MDAsICJmZjEiLAkJImQsMiIpCi0gIF9NQzg4eHh4ICgweDgwMDA0ODAwLCAiZmxkY3IiLAkiZCxmIikKLSAgX01DODh4eHggKDB4ODQwMDIwMjAsICJmbHQuZHMiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMDIyMjAsICJmbHQuZHMiLAkieGQsMiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyMDAwLCAiZmx0LnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDAyMjAwLCAiZmx0LnNzIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwMjI0MCwgImZsdC54cyIsCSJ4ZCwyIikKLSAgX01DODh4eHggKDB4ODQwMDAwMDAsICJmbXVsLnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MDAwLCAiZm11bC5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDA4MCwgImZtdWwuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwMjAsICJmbXVsLnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MDQwLCAiZm11bC5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDIwMCwgImZtdWwuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwODAsICJmbXVsLnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMjgwLCAiZm11bC5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODBhMCwgImZtdWwuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwYzAsICJmbXVsLnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MTAwLCAiZm11bC5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODEyMCwgImZtdWwuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgxNDAsICJmbXVsLnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMDIwLCAiZm11bC5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODIwMCwgImZtdWwuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDAwYTAsICJmbXVsLmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MjIwLCAiZm11bC5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODI0MCwgImZtdWwuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDAyMjAsICJmbXVsLmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MjgwLCAiZm11bC5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDJhMCwgImZtdWwuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgyYTAsICJmbXVsLmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MmMwLCAiZm11bC5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODMwMCwgImZtdWwuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgzMjAsICJmbXVsLmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MzQwLCAiZm11bC5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODQwMCwgImZtdWwueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg0MjAsICJmbXVsLnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NDQwLCAiZm11bC54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODQ4MCwgImZtdWwueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg0YTAsICJmbXVsLnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NGMwLCAiZm11bC54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODUwMCwgImZtdWwueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg1MjAsICJmbXVsLnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NTQwLCAiZm11bC54eHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNzhhMCwgImZzcXJ0LmRkIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmOGEwLCAiZnNxcnQuZGQiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNzg4MCwgImZzcXJ0LmRzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmODgwLCAiZnNxcnQuZHMiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjhjMCwgImZzcXJ0LmR4IiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDc4MjAsICJmc3FydC5zZCIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjgyMCwgImZzcXJ0LnNkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDc4MDAsICJmc3FydC5zcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjgwMCwgImZzcXJ0LnNzIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY4NDAsICJmc3FydC5zeCIsCSJ4ZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmOTIwLCAiZnNxcnQueGQiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjkwMCwgImZzcXJ0LnhzIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY5NDAsICJmc3FydC54eCIsCSJ4ZCx4MiIpCi0gIF9NQzg4eHh4ICgweDgwMDA4ODAwLCAiZnN0Y3IiLAkiMyxmIikKLSAgX01DODh4eHggKDB4ODQwMDMwMDAsICJmc3ViLnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMDAwLCAiZnN1Yi5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzA4MCwgImZzdWIuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwMjAsICJmc3ViLnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMDQwLCAiZnN1Yi5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzIwMCwgImZzdWIuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwODAsICJmc3ViLnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMjgwLCAiZnN1Yi5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjBhMCwgImZzdWIuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwYzAsICJmc3ViLnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMTAwLCAiZnN1Yi5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjEyMCwgImZzdWIuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIxNDAsICJmc3ViLnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMDIwLCAiZnN1Yi5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjIwMCwgImZzdWIuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDMwYTAsICJmc3ViLmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMjIwLCAiZnN1Yi5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjI0MCwgImZzdWIuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDMyMjAsICJmc3ViLmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMjgwLCAiZnN1Yi5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzJhMCwgImZzdWIuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIyYTAsICJmc3ViLmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMmMwLCAiZnN1Yi5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjMwMCwgImZzdWIuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIzMjAsICJmc3ViLmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMzQwLCAiZnN1Yi5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjQwMCwgImZzdWIueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI0MjAsICJmc3ViLnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNDQwLCAiZnN1Yi54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjQ4MCwgImZzdWIueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI0YTAsICJmc3ViLnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNGMwLCAiZnN1Yi54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjUwMCwgImZzdWIueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI1MjAsICJmc3ViLnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNTQwLCAiZnN1Yi54eHgiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4MDAwYzgwMCwgImZ4Y3IiLAkJImQsMyxmIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDEsICJpbGxvcDEiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDIsICJpbGxvcDIiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDMsICJpbGxvcDMiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMDQ4ODAsICJpbnQuc2QiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMGM4ODAsICJpbnQuc2QiLAkiZCx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA0ODAwLCAiaW50LnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBjODAwLCAiaW50LnNzIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzkwMCwgImludC5zeCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ZjQwMGMwMDAsICJqbXAiLAkJIjIiKQotICBfTUM4OHh4eCAoMHhmNDAwYzQwMCwgImptcC5uIiwJIjIiKQotICBfTUM4OHh4eCAoMHhmNDAwYzgwMCwgImpzciIsCQkiMiIpCi0gIF9NQzg4eHh4ICgweGY0MDBjYzAwLCAianNyLm4iLAkiMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxNDAwLCAibGQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDE2MDAsICJsZCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4MTQwMDAwMDAsICJsZCIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmMDAwMTYwMCwgImxkIiwJCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDE0MDAsICJsZCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MDQwMDAwMDAsICJsZCIsCQkieGQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDFlMDAsICJsZC5iIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMWMwMCwgImxkLmIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MWMwMDAwMDAsICJsZC5iIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxZDAwLCAibGQuYi51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMWYwMCwgImxkLmIudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwZTAwLCAibGQuYnUiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDBjMDAsICJsZC5idSIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDBjMDAwMDAwLCAibGQuYnUiLAkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMGQwMCwgImxkLmJ1LnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAwZjAwLCAibGQuYnUudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxMjAwLCAibGQuZCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDEwMDAsICJsZC5kIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDEwMDAwMDAwLCAibGQuZCIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmMDAwMTIwMCwgImxkLmQiLAkJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTAwMCwgImxkLmQiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDAwMDAwMDAwLCAibGQuZCIsCQkieGQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDExMDAsICJsZC5kLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxMzAwLCAibGQuZC51c3IiLAkiZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDExMDAsICJsZC5kLnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMTMwMCwgImxkLmQudXNyIiwJInhkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMWEwMCwgImxkLmgiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxODAwLCAibGQuaCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHgxODAwMDAwMCwgImxkLmgiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDE5MDAsICJsZC5oLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxYjAwLCAibGQuaC51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDBhMDAsICJsZC5odSIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDgwMCwgImxkLmh1IiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4MDgwMDAwMDAsICJsZC5odSIsCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwOTAwLCAibGQuaHUudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDBiMDAsICJsZC5odS51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDE1MDAsICJsZC51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMTcwMCwgImxkLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTUwMCwgImxkLnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMTcwMCwgImxkLnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDFhMDAsICJsZC54IiwJCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDE4MDAsICJsZC54IiwJCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHgzYzAwMDAwMCwgImxkLngiLAkJInhkLDEsSSIpCi0gIF9NQzg4MTEwICgweGYwMDAxOTAwLCAibGQueC51c3IiLAkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjAwMDFiMDAsICJsZC54LnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDM2MDAsICJsZGEiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MDAwLCAibGRhIiwJCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYSIsCQkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuYiIsCSI/ZCwxWzJdIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuYiIsCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYS5iIiwJIj9kLDEsSSIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweGY0MDAzMjAwLCAibGRhLmQiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuZCIsCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYS5kIiwJIj9kLDEsSSIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4MTEwICgweGY0MDAzZTAwLCAibGRhLngiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDNhMDAsICJsZGEuaCIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImxkYS5oIiwJIj9kLDEsMiIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweDYwMDAwMDAwLCAibGRhLmgiLAkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ODAwMDQwMDAsICJsZGNyIiwJCSJkLGMiKQotICBfTUM4OHh4eCAoMHhmNDAwYTAwMCwgIm1hayIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmMDAwYTAwMCwgIm1hayIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHg0ODAwMDAwMCwgIm1hc2siLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4NGMwMDAwMDAsICJtYXNrLnUiLAkiZCwxLEkiKQotICBfTUM4ODExMCAoMHg4NDAwYzAwMCwgIm1vdi5zIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNDIwMCwgIm1vdi5zIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzA4MCwgIm1vdi5kIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNDI4MCwgIm1vdi5kIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzMwMCwgIm1vdiIsCQkieGQseDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNmMwMCwgIm11bCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2YzAwMDAwMCwgIm11bCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNmUwMCwgIm11bHMiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NmMwMDAwMDAsICJtdWxzIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2YzAwLCAibXVsdSIsCQkiZCwxLDIiKQkvKiBzeW5vbnltIGZvciBtdWwgKi8KLSAgX01DODh4eHggKDB4NmMwMDAwMDAsICJtdWx1IiwJCSJkLDEsSSIpCS8qIHN5bm9ueW0gZm9yIG11bCAqLwotICBfTUM4ODExMCAoMHhmNDAwNmQwMCwgIm11bHUuZCIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDg0MDA1MDgwLCAibmludC5zZCIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZDA4MCwgIm5pbnQuc2QiLAkiZCx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA1MDAwLCAibmludC5zcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZDAwMCwgIm5pbnQuc3MiLAkiZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBkMTAwLCAibmludC5zeCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ZjQwMDU4MDAsICJvciIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1ODAwMDAwMCwgIm9yIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1YzAwLCAib3IuYyIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1YzAwMDAwMCwgIm9yLnUiLAkJImQsMSxJIikKLSAgX01DODgxMTAgKDB4ODgwMDIwMjAsICJwYWRkLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjA0MCwgInBhZGQuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMDYwLCAicGFkZCIsCQkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjBhMCwgInBhZGRzLnUuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMGMwLCAicGFkZHMudS5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIwZTAsICJwYWRkcy51IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxMjAsICJwYWRkcy51cy5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxNDAsICJwYWRkcy51cy5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxNjAsICJwYWRkcy51cyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMWEwLCAicGFkZHMucy5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxYzAsICJwYWRkcy5zLmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjFlMCwgInBhZGRzLnMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzg2MCwgInBjbXAiLAkJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDAwMDAsICJwbXVsIiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2NDIwLCAicHBhY2suMzIuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MjQwLCAicHBhY2suMTYuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2NDQwLCAicHBhY2suMzIuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MTYwLCAicHBhY2suOCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MjYwLCAicHBhY2suMTYiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwNjQ2MCwgInBwYWNrLjMyIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDc4MDAsICJwcm90IiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA3MDAwLCAicHJvdCIsCQkiZCwxLG8iKQotICBfTUM4ODExMCAoMHg4ODAwMzAyMCwgInBzdWIuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMDQwLCAicHN1Yi5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMwNjAsICJwc3ViIiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMGEwLCAicHN1YnMudS5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMwYzAsICJwc3Vicy51LmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzBlMCwgInBzdWJzLnUiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzEyMCwgInBzdWJzLnVzLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzE0MCwgInBzdWJzLnVzLmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzE2MCwgInBzdWJzLnVzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMxYTAsICJwc3Vicy5zLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzFjMCwgInBzdWJzLnMuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMWUwLCAicHN1YnMucyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2ODAwLCAicHVucGsubiIsCSJkLDEiKQotICBfTUM4ODExMCAoMHg4ODAwNjgyMCwgInB1bnBrLmIiLAkiZCwxIikKLSAgX01DODgxMTAgKDB4ODgwMDY4NDAsICJwdW5way5oIiwJImQsMSIpCi0gIF9NQzg4eHh4ICgweGY0MDBhODAwLCAicm90IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDBhODAwLCAicm90IiwJCSJkLDEsYiIpCi0gIF9NQzg4eHh4ICgweGY0MDBmYzAwLCAicnRlIiwJCSIiKQotICBfTUM4OHh4eCAoMHhmNDAwODgwMCwgInNldCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmMDAwODgwMCwgInNldCIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHhmNDAwMjYwMCwgInN0IiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjQwMCwgInN0IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDI0MDAwMDAwLCAic3QiLAkJImQsMSxJIikKLSAgX01DODgxMTAgKDB4ZjAwMDI2MDAsICJzdCIsCQkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyNDAwLCAic3QiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDM0MDAwMDAwLCAic3QiLAkJInhkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyZTAwLCAic3QuYiIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDJjMDAsICJzdC5iIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDJjMDAwMDAwLCAic3QuYiIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMmQwMCwgInN0LmIudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDJmMDAsICJzdC5iLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMmQ4MCwgInN0LmIudXNyLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDJmODAsICJzdC5iLnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMmM4MCwgInN0LmIud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMmU4MCwgInN0LmIud3QiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDIyMDAsICJzdC5kIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjAwMCwgInN0LmQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MjAwMDAwMDAsICJzdC5kIiwJCSJkLDEsSSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMjAwLCAic3QuZCIsCQkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMDAwLCAic3QuZCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MzAwMDAwMDAsICJzdC5kIiwJCSJ4ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMjEwMCwgInN0LmQudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDIzMDAsICJzdC5kLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjEwMCwgInN0LmQudXNyIiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyMzAwLCAic3QuZC51c3IiLAkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGY0MDAyMTgwLCAic3QuZC51c3Iud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMjM4MCwgInN0LmQudXNyLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMTgwLCAic3QuZC51c3Iud3QiLAkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjAwMDIzODAsICJzdC5kLnVzci53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDIwODAsICJzdC5kLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDIyODAsICJzdC5kLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMDgwLCAic3QuZC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjI4MCwgInN0LmQud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyYTAwLCAic3QuaCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDI4MDAsICJzdC5oIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDI4MDAwMDAwLCAic3QuaCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMjkwMCwgInN0LmgudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDJiMDAsICJzdC5oLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjk4MCwgInN0LmgudXNyLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDJiODAsICJzdC5oLnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjg4MCwgInN0Lmgud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMmE4MCwgInN0Lmgud3QiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDI1MDAsICJzdC51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMjcwMCwgInN0LnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjUwMCwgInN0LnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjcwMCwgInN0LnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDI1ODAsICJzdC51c3Iud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMjc4MCwgInN0LnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjU4MCwgInN0LnVzci53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjc4MCwgInN0LnVzci53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDI0ODAsICJzdC53dCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweGY0MDAyNjgwLCAic3Qud3QiLAkiZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDI0ODAsICJzdC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjY4MCwgInN0Lnd0IiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMmEwMCwgInN0LngiLAkJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjgwMCwgInN0LngiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDM4MDAwMDAwLCAic3QueCIsCQkieGQsMSxJIikKLSAgX01DODgxMTAgKDB4ZjAwMDI5MDAsICJzdC54LnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMmIwMCwgInN0LngudXNyIiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjk4MCwgInN0LngudXNyLnd0IiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyYjgwLCAic3QueC51c3Iud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyODgwLCAic3QueC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMmE4MCwgInN0Lngud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweDgwMDA4MDAwLCAic3RjciIsCQkiMyxjIikKLSAgX01DODh4eHggKDB4ZjQwMDc0MDAsICJzdWIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NzQwMDAwMDAsICJzdWIiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc2MDAsICJzdWIuY2kiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNzcwMCwgInN1Yi5jaW8iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNzUwMCwgInN1Yi5jbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2NDAwLCAic3VidSIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2NDAwMDAwMCwgInN1YnUiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDY2MDAsICJzdWJ1LmNpIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDY3MDAsICJzdWJ1LmNpbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2NTAwLCAic3VidS5jbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDBkMDAwLCAidGIwIiwJCSJCLDEsViIpCi0gIF9NQzg4eHh4ICgweGYwMDBkODAwLCAidGIxIiwJCSJCLDEsViIpCi0gIF9NQzg4eHh4ICgweGY0MDBmODAwLCAidGJuZCIsCQkiMSwyIikKLSAgX01DODh4eHggKDB4ZjgwMDAwMDAsICJ0Ym5kIiwJCSIxLEkiKQotICBfTUM4OHh4eCAoMHhmMDAwZTgwMCwgInRjbmQiLAkJIk0sMSxWIikKLSAgX01DODh4eHggKDB4ODQwMDU4ODAsICJ0cm5jLnNkIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBkODgwLCAidHJuYy5zZCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDU4MDAsICJ0cm5jLnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBkODAwLCAidHJuYy5zcyIsCSJkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGQ5MDAsICJ0cm5jLnN4IiwJImQseDIiKQotICBfTUM4OHh4eCAoMHg4MDAwYzAwMCwgInhjciIsCQkiZCwzLGMiKQotICBfTUM4OHh4eCAoMHhmNDAwMDYwMCwgInhtZW0iLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNDAwLCAieG1lbSIsCQkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwNDAwMDAwMCwgInhtZW0iLAkJIj9kLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwMjAwLCAieG1lbS5idSIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDAwMCwgInhtZW0uYnUiLAkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwMDAwMDAwMCwgInhtZW0uYnUiLAkiP2QsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDAzMDAsICJ4bWVtLmJ1LnVzciIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDEwMCwgInhtZW0uYnUudXNyIiwJImQsMSwyIikKLSAgX01DODgxMDAgKDB4MDAwMDAxMDAsICJ4bWVtLmJ1LnVzciIsCSI/ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMDcwMCwgInhtZW0udXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNTAwLCAieG1lbS51c3IiLAkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwNDAwMDEwMCwgInhtZW0udXNyIiwJIj9kLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1MDAwLCAieG9yIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDUwMDAwMDAwLCAieG9yIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1NDAwLCAieG9yLmMiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1NDAwMDAwMCwgInhvci51IiwJImQsMSxJIikKLSAgX01DODh4eHggKDB4MDAwMDAwMDAsICIiLAkJMCkKLX07Ci0KLSNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBtODhrX29wY29kZXMpLyhzaXplb2YgbTg4a19vcGNvZGVzWzBdKSkKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWFvdXQuYyBiL2dhcy9jb25maWcvb2JqLWFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZjRkOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1hb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyogYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi1vciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSN1bmRlZiBOT19SRUxPQwotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogaW46IHNlZ1QgICBvdXQ6IE5fVFlQRSBiaXRzICovCi1jb25zdCBzaG9ydCBzZWdfTl9UWVBFW10gPQotewotICBOX0FCUywKLSAgTl9URVhULAotICBOX0RBVEEsCi0gIE5fQlNTLAotICBOX1VOREYsCQkJLyogdW5rbm93biAqLwotICBOX1VOREYsCQkJLyogZXJyb3IgKi8KLSAgTl9VTkRGLAkJCS8qIGV4cHJlc3Npb24gKi8KLSAgTl9VTkRGLAkJCS8qIGRlYnVnICovCi0gIE5fVU5ERiwJCQkvKiBudHYgKi8KLSAgTl9VTkRGLAkJCS8qIHB0diAqLwotICBOX1JFR0lTVEVSLAkJCS8qIHJlZ2lzdGVyICovCi19OwotCi1jb25zdCBzZWdUIE5fVFlQRV9zZWdbTl9UWVBFICsgMl0gPQotewkJCQkvKiBOX1RZUEUgPT0gMHgxRSA9IDMyLTIgKi8KLSAgU0VHX1VOS05PV04sCQkJLyogTl9VTkRGID09IDAgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19BQlNPTFVURSwJCQkvKiBOX0FCUyA9PSAyICovCi0gIFNFR19HT09GLAotICBTRUdfVEVYVCwJCQkvKiBOX1RFWFQgPT0gNCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0RBVEEsCQkJLyogTl9EQVRBID09IDYgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19CU1MsCQkJLyogTl9CU1MgPT0gOCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfUkVHSVNURVIsCQkJLyogZHVtbXkgTl9SRUdJU1RFUiBmb3IgcmVncyA9IDMwICovCi0gIFNFR19HT09GLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBvYmpfYW91dF9saW5lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2FvdXRfd2VhayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9hb3V0X3R5cGUgUEFSQU1TICgoaW50KSk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7ImxpbmUiLCBvYmpfYW91dF9saW5lLCAwfSwJLyogc291cmNlIGNvZGUgbGluZSBudW1iZXIgKi8KLSAgeyJsbiIsIG9ial9hb3V0X2xpbmUsIDB9LAkvKiBjb2ZmIGxpbmUgbnVtYmVyIHRoYXQgd2UgdXNlIGFueXdheSAqLwotCi0gIHsid2VhayIsIG9ial9hb3V0X3dlYWssIDB9LAkvKiBtYXJrIHN5bWJvbCBhcyB3ZWFrLiAgKi8KLQotICB7InR5cGUiLCBvYmpfYW91dF90eXBlLCAwfSwKLQotICAvKiBjb2ZmIGRlYnVnIHBzZXVkb3MgKGlnbm9yZWQpICovCi0gIHsiZGVmIiwgc19pZ25vcmUsIDB9LAotICB7ImRpbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmRlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJpZGVudCIsIHNfaWdub3JlLCAwfSwKLSAgeyJsaW5lIiwgc19pZ25vcmUsIDB9LAotICB7ImxuIiwgc19pZ25vcmUsIDB9LAotICB7InNjbCIsIHNfaWdub3JlLCAwfSwKLSAgeyJzaXplIiwgc19pZ25vcmUsIDB9LAotICB7InRhZyIsIHNfaWdub3JlLCAwfSwKLSAgeyJ2YWwiLCBzX2lnbm9yZSwgMH0sCi0gIHsidmVyc2lvbiIsIHNfaWdub3JlLCAwfSwKLQotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAkvKiBGb3Igc3VuMzg2aSBjYyAoPykgKi8KLQotICAvKiBvdGhlciBzdHVmZiAqLwotICB7IkFCT1JUIiwgc19hYm9ydCwgMH0sCi0KLSAge05VTEx9CQkJLyogZW5kIHNlbnRpbmVsICovCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotb2JqX2FvdXRfZnJvYl9zeW1ib2wgKHN5bSwgcHVudCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBpbnQgKnB1bnQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBhc2VjdGlvbiAqc2VjOwotICBpbnQgZGVzYywgdHlwZSwgb3RoZXI7Ci0KLSAgZmxhZ3MgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3M7Ci0gIGRlc2MgPSBTX0dFVF9ERVNDIChzeW0pOwotICB0eXBlID0gU19HRVRfVFlQRSAoc3ltKTsKLSAgb3RoZXIgPSBTX0dFVF9PVEhFUiAoc3ltKTsKLSAgc2VjID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotICAvKiBPbmx5IGZyb2Igc2ltcGxlIHN5bWJvbHMgdGhpcyB3YXkgcmlnaHQgbm93LiAgKi8KLSAgaWYgKCEgKHR5cGUgJiB+IChOX1RZUEUgfCBOX0VYVCkpKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09IChOX1VOREYgfCBOX0VYVCkKLQkgICYmIHNlYyA9PSAmYmZkX2Fic19zZWN0aW9uKQotCXsKLQkgIHNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW0sIHNlYyk7Ci0JfQotCi0gICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpICE9IE5fSU5EUgotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQQotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUVAotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VURAotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQgotCSAgJiYgdHlwZSAhPSBOX1dBUk5JTkcKLQkgICYmIChzZWMgPT0gJmJmZF9hYnNfc2VjdGlvbgotCSAgICAgIHx8IHNlYyA9PSAmYmZkX3VuZF9zZWN0aW9uKSkKLQlyZXR1cm47Ci0gICAgICBpZiAoZmxhZ3MgJiBCU0ZfRVhQT1JUKQotCXR5cGUgfD0gTl9FWFQ7Ci0KLSAgICAgIHN3aXRjaCAodHlwZSAmIE5fVFlQRSkKLQl7Ci0JY2FzZSBOX1NFVEE6Ci0JY2FzZSBOX1NFVFQ6Ci0JY2FzZSBOX1NFVEQ6Ci0JY2FzZSBOX1NFVEI6Ci0JICAvKiBTZXQgdGhlIGRlYnVnZ2luZyBmbGFnIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzIHNvIHRoYXQKLQkgICAgIEJGRCBsZWF2ZXMgdGhlbSBhbG9uZS4gICovCi0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLQotCSAgLyogWW91IGNhbid0IHB1dCBhIGNvbW1vbiBzeW1ib2wgaW4gYSBzZXQuICBUaGUgd2F5IGEgc2V0Ci0JICAgICBlbGVtZW50IHdvcmtzIGlzIHRoYXQgdGhlIHN5bWJvbCBoYXMgYSBkZWZpbml0aW9uIGFuZCBhCi0JICAgICBuYW1lLCBhbmQgdGhlIGxpbmtlciBhZGRzIHRoZSBkZWZpbml0aW9uIHRvIHRoZSBzZXQgb2YKLQkgICAgIHRoYXQgbmFtZS4gIFRoYXQgZG9lcyBub3Qgd29yayBmb3IgYSBjb21tb24gc3ltYm9sLAotCSAgICAgYmVjYXVzZSB0aGUgbGlua2VyIGNhbid0IHRlbGwgd2hpY2ggY29tbW9uIHN5bWJvbCB0aGUKLQkgICAgIHVzZXIgbWVhbnMuICBGSVhNRTogVXNpbmcgYXNfYmFkIGhlcmUgbWF5IGJlCi0JICAgICBpbmFwcHJvcHJpYXRlLCBzaW5jZSB0aGUgdXNlciBtYXkgd2FudCB0byBmb3JjZSBhCi0JICAgICBwYXJ0aWN1bGFyIHR5cGUgd2l0aG91dCByZWdhcmQgdG8gdGhlIHNlbWFudGljcyBvZiBzZXRzOwotCSAgICAgb24gdGhlIG90aGVyIGhhbmQsIHdlIGNlcnRhaW5seSBkb24ndCB3YW50IGFueWJvZHkgdG8gYmUKLQkgICAgIG1pc2xlYWQgaW50byB0aGlua2luZyB0aGF0IHRoZWlyIGNvZGUgd2lsbCB3b3JrLiAgKi8KLQkgIGlmIChTX0lTX0NPTU1PTiAoc3ltKSkKLQkgICAgYXNfYmFkIChfKCJBdHRlbXB0IHRvIHB1dCBhIGNvbW1vbiBzeW1ib2wgaW50byBzZXQgJXMiKSwKLQkJICAgIFNfR0VUX05BTUUgKHN5bSkpOwotCSAgLyogU2ltaWxhcmx5LCB5b3UgY2FuJ3QgcHV0IGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYSBzZXQuICAqLwotCSAgZWxzZSBpZiAoISBTX0lTX0RFRklORUQgKHN5bSkpCi0JICAgIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBwdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbnRvIHNldCAlcyIpLAotCQkgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0KLQkgIGJyZWFrOwotCWNhc2UgTl9JTkRSOgotCSAgLyogUHV0IGluZGlyZWN0IHN5bWJvbHMgaW4gdGhlIGluZGlyZWN0IHNlY3Rpb24uICAqLwotCSAgU19TRVRfU0VHTUVOVCAoc3ltLCBiZmRfaW5kX3NlY3Rpb25fcHRyKTsKLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfSU5ESVJFQ1Q7Ci0JICBpZiAodHlwZSAmIE5fRVhUKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9FWFBPUlQ7Ci0JICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzICY9fiBCU0ZfTE9DQUw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgTl9XQVJOSU5HOgotCSAgLyogTWFyayB3YXJuaW5nIHN5bWJvbHMuICAqLwotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9XQVJOSU5HOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICAgIH0KLQotICBTX1NFVF9UWVBFIChzeW0sIHR5cGUpOwotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoU19JU19XRUFLIChzeW0pKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0NPTU1PTiAoc3ltKSkKLQlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKLQkJU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgfQotfQotCi12b2lkCi1vYmpfYW91dF9mcm9iX2ZpbGUgKCkKLXsKLSAgLyogUmVsb2NhdGlvbiBwcm9jZXNzaW5nIG1heSByZXF1aXJlIGtub3dpbmcgdGhlIFZNQXMgb2YgdGhlIHNlY3Rpb25zLgotICAgICBTaW5jZSB3cml0aW5nIHRvIGEgc2VjdGlvbiB3aWxsIGNhdXNlIHRoZSBCRkQgYmFjayBlbmQgdG8gY29tcHV0ZSB0aGUKLSAgICAgVk1BcywgZmFrZSBpdCBvdXQgaGVyZS4uLi4gICovCi0gIGJmZF9ieXRlIGIgPSAwOwotICBib29sZWFuIHggPSB0cnVlOwotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24pICE9IDApCi0gICAgewotICAgICAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sICZiLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgIChiZmRfc2l6ZV90eXBlKSAxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uKSAhPSAwKQotICAgIHsKLSAgICAgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uLCAmYiwgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgMSk7Ci0gICAgfQotICBhc3NlcnQgKHggPT0gdHJ1ZSk7Ci19Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBSZWxvY2F0aW9uLiAqLwotCi0vKgotICoJCWVtaXRfcmVsb2NhdGlvbnMoKQotICoKLSAqIENyYXdsIGFsb25nIGEgZml4UyBjaGFpbi4gRW1pdCB0aGUgc2VnbWVudCdzIHJlbG9jYXRpb25zLgotICovCi12b2lkCi1vYmpfZW1pdF9yZWxvY2F0aW9ucyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7CQkvKiBGaXh1cCBjaGFpbiBmb3IgdGhpcyBzZWdtZW50LiAqLwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIGlmIChmaXhQLT5meF9kb25lID09IDApCi0gICAgICB7Ci0Jc3ltYm9sUyAqc3ltOwotCi0Jc3ltID0gZml4UC0+ZnhfYWRkc3k7Ci0Jd2hpbGUgKHN5bS0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCSAgc3ltID0gc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JZml4UC0+ZnhfYWRkc3kgPSBzeW07Ci0KLQlpZiAoISBzeW0tPnN5X3Jlc29sdmVkICYmICEgU19JU19ERUZJTkVEIChzeW0pKQotCSAgewotCSAgICBjaGFyICpmaWxlOwotCSAgICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCSAgICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKHN5bSwgJmZpbGUsICZsaW5lKSkKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oInVucmVzb2x2ZWQgcmVsb2NhdGlvbiIpKTsKLQkgICAgZWxzZQotCSAgICAgIGFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiKSwKLQkJICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0JICB9Ci0KLQl0Y19hb3V0X2ZpeF90b19jaGFycyAoKndoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSk7Ci0JKndoZXJlICs9IG1kX3JlbG9jX3NpemU7Ci0gICAgICB9Ci19Ci0KLSNpZm5kZWYgb2JqX2hlYWRlcl9hcHBlbmQKLS8qIEFvdXQgZmlsZSBnZW5lcmF0aW9uICYgdXRpbGl0aWVzICovCi12b2lkCi1vYmpfaGVhZGVyX2FwcGVuZCAod2hlcmUsIGhlYWRlcnMpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHRjX2hlYWRlcnNfaG9vayAoaGVhZGVycyk7Ci0KLSNpZmRlZiBDUk9TU19DT01QSUxFCi0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9pbmZvLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2luZm8pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfaW5mbyk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV90ZXh0LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3RleHQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9kYXRhLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2RhdGEpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9ic3MsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Jzcyk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9zeW1zLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3N5bXMpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcyk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSk7Ci0KLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmaGVhZGVycy0+aGVhZGVyLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlcikpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotfQotI2VuZGlmIC8qICEgZGVmaW5lZCAob2JqX2hlYWRlcl9hcHBlbmQpICovCi0KLXZvaWQKLW9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihTX0dFVF9PRkZTRVQgKHN5bWJvbFApKSwgU19HRVRfT0ZGU0VUIChzeW1ib2xQKSwgc2l6ZW9mIChTX0dFVF9PRkZTRVQgKHN5bWJvbFApKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihTX0dFVF9ERVNDIChzeW1ib2xQKSksIFNfR0VUX0RFU0MgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX0RFU0MgKHN5bWJvbFApKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihzeW1ib2xQLT5zeV9zeW1ib2wubl92YWx1ZSksIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZW9mIChzeW1ib2xQLT5zeV9zeW1ib2wubl92YWx1ZSkpOwotCi0gIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZzeW1ib2xQLT5zeV9zeW1ib2wsIHNpemVvZiAob2JqX3N5bWJvbF90eXBlKSk7Ci19Ci0KLXZvaWQKLW9ial9lbWl0X3N5bWJvbHMgKHdoZXJlLCBzeW1ib2xfcm9vdFApCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qIEVtaXQgYWxsIHN5bWJvbHMgbGVmdCBpbiB0aGUgc3ltYm9sIGNoYWluLiAgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFVzZWQgdG8gc2F2ZSB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lLiBJdCBpcyB1c2VkIHRvIHBvaW50Ci0JIHRvIHRoZSBzdHJpbmcgaW4gbWVtb3J5IGJ1dCBtdXN0IGJlIGEgZmlsZSBvZmZzZXQuICovCi0gICAgICByZWdpc3RlciBjaGFyICp0ZW1wOwotCi0gICAgICB0ZW1wID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9PRkZTRVQgKHN5bWJvbFAsIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0KTsKLQotICAgICAgLyogQW55IHN5bWJvbCBzdGlsbCB1bmRlZmluZWQgYW5kIGlzIG5vdCBhIGRiZyBzeW1ib2wgaXMgbWFkZSBOX0VYVC4gKi8KLSAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkgJiYgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIHR5cGUgb2YgYSB3ZWFrIHN5bWJvbC4gICovCi0gICAgICBpZiAoU19HRVRfV0VBSyAoc3ltYm9sUCkpCi0JewotCSAgc3dpdGNoIChTX0dFVF9UWVBFIChzeW1ib2xQKSkKLQkgICAgewotCSAgICBjYXNlIE5fVU5ERjogU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLVSk7IGJyZWFrOwotCSAgICBjYXNlIE5fQUJTOgkgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLQSk7IGJyZWFrOwotCSAgICBjYXNlIE5fVEVYVDogU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLVCk7IGJyZWFrOwotCSAgICBjYXNlIE5fREFUQTogU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLRCk7IGJyZWFrOwotCSAgICBjYXNlIE5fQlNTOiAgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLQik7IGJyZWFrOwotCSAgICBkZWZhdWx0OiBhc19iYWQgKF8oIiVzOiBiYWQgdHlwZSBmb3Igd2VhayBzeW1ib2wiKSwgdGVtcCk7IGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBvYmpfc3ltYm9sX3RvX2NoYXJzICh3aGVyZSwgc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9OQU1FIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotc3RhdGljIHZvaWQKLW9ial9hb3V0X2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogQXNzdW1lIGRlbGltaXRlciBpcyBwYXJ0IG9mIGV4cHJlc3Npb24uCi0gICAgIEJTRDQuMiBhcyBmYWlscyB3aXRoIGRlbGlnaHRmdWwgYnVnLCBzbyB3ZQotICAgICBhcmUgbm90IGJlaW5nIGluY29tcGF0aWJsZSBoZXJlLiAqLwotICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCAoaW50KSAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogb2JqX2FvdXRfbGluZSgpICovCi0KLS8qIEhhbmRsZSAud2Vhay4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9hb3V0X3dlYWsgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSAudHlwZS4gIE9uIHtOZXQsT3Blbn1CU0QsIHRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIG5fb3RoZXIgZmllbGQsCi0gICB3aGljaCBpcyB0aGVuIGFwcGFyZW50bHkgdXNlZCB3aGVuIGRvaW5nIGR5bmFtaWMgbGlua2luZy4gIE9sZGVyCi0gICB2ZXJzaW9ucyBvZ2FzIGlnbm9yZWQgdGhlIC50eXBlIHBzZXVkby1vcCwgc28gd2UgYWxzbyBpZ25vcmUgaXQgaWYKLSAgIHdlIGNhbid0IHBhcnNlIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9hb3V0X3R5cGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGlmIChzeW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcpCi0JICAgIHsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAib2JqZWN0IiwgNikgPT0gMCkKLQkJU19TRVRfT1RIRVIgKHN5bSwgMSk7Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZnVuY3Rpb24iLCA4KSA9PSAwKQotCQlTX1NFVF9PVEhFUiAoc3ltLCAyKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWdub3JlIGV2ZXJ5dGhpbmcgZWxzZSBvbiB0aGUgbGluZS4gICovCi0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN5bWJvbFMgKipzeW1ib2xQUDsKLSAgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotCi0gIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycyk7Ci0KLSAgc3ltYm9sUFAgPSAmc3ltYm9sX3Jvb3RQOwkvKi0+bGFzdCBzeW1ib2wgY2hhaW4gbGluay4gKi8KLSAgd2hpbGUgKChzeW1ib2xQID0gKnN5bWJvbFBQKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSkKLQkgICAgYXNfYmFkIChfKCIlczogZ2xvYmFsIHN5bWJvbHMgbm90IHN1cHBvcnRlZCBpbiBjb21tb24gc2VjdGlvbnMiKSwKLQkJICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ICYmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkpCi0JewotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX1RFWFQpOwotCX0JCQkvKiBpZiBwdXNpbmcgZGF0YSBpbnRvIHRleHQgKi8KLQotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgc3ltYm9scy4gICovCi0gICAgICBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpKQotCXsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogT0ssIGhlcmUgaXMgaG93IHdlIGRlY2lkZSB3aGljaCBzeW1ib2xzIGdvIG91dCBpbnRvIHRoZSBicmF2ZQotCSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQotCSAqIHN5bWJvbHMgd2l0aCBubyBuYW1lIChzdGFiZCdzPykKLQkgKiBzeW1ib2xzIHdpdGggZGVidWcgaW5mbyBpbiB0aGVpciBOX1RZUEUKLQotCSBTeW1ib2xzIHRoYXQgZG9uJ3QgYXJlOgotCSAqIHN5bWJvbHMgdGhhdCBhcmUgcmVnaXN0ZXJzCi0JICogc3ltYm9scyB3aXRoIFwxIGFzIHRoZWlyIDNyZCBjaGFyYWN0ZXIgKG51bWVyaWMgbGFiZWxzKQotCSAqICJsb2NhbCBsYWJlbHMiIGFzIGRlZmluZWQgYnkgU19MT0NBTF9OQU1FKG5hbWUpIGlmIHRoZSAtTAotCSBzd2l0Y2ggd2FzIHBhc3NlZCB0byBnYXMuCi0KLQkgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCSBzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gKi8KLQotCi0gICAgICBpZiAoIVNfSVNfUkVHSVNURVIgKHN5bWJvbFApCi0JICAmJiAoIVNfR0VUX05BTUUgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19ERUJVRyAoc3ltYm9sUCkKLQkgICAgICB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKQotCSAgICAgIHx8IFNfSVNfRVhURVJOQUwgKHN5bWJvbFApCi0JICAgICAgfHwgKFNfR0VUX05BTUUgKHN5bWJvbFApWzBdICE9ICdcMDAxJwotCQkgICYmIChmbGFnX2tlZXBfbG9jYWxzIHx8ICFTX0xPQ0FMX05BTUUgKHN5bWJvbFApKSkpKQotCXsKLQkgIHN5bWJvbFAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXIrKzsKLQotCSAgLyogVGhlICsgMSBhZnRlciBzdHJsZW4gYWNjb3VudCBmb3IgdGhlIFwwIGF0IHRoZQotCQkJICAgZW5kIG9mIGVhY2ggc3RyaW5nICovCi0JICBpZiAoIVNfSVNfU1RBQkQgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgLyogT3JkaW5hcnkgY2FzZS4gKi8KLQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKLQkgICAgfQotCSAgZWxzZQkJCS8qIC5TdGFiZCBjYXNlLiAqLwotCSAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7Ci0JICBzeW1ib2xQUCA9ICZzeW1ib2xQLT5zeV9uZXh0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIC8qIFRoaXMgd2FybmluZyBzaG91bGQgbmV2ZXIgZ2V0IHRyaWdnZXJlZCBhbnkgbW9yZS4KLQkgICAgICAgV2VsbCwgbWF5YmUgaWYgeW91J3JlIGRvaW5nIHR3aXN0ZWQgdGhpbmdzIHdpdGgKLQkgICAgICAgcmVnaXN0ZXIgbmFtZXMuLi4gICovCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkLiIpLCBkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAoU19HRVRfTkFNRSAoc3ltYm9sUCkpKTsKLQkgICAgfQkJCS8qIG9vcHMuICovCi0KLQkgIC8qIFVuaG9vayBpdCBmcm9tIHRoZSBjaGFpbiAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGhlYWRlcnMsIHN5bWJvbF9udW1iZXIpOwotfQotCi0vKgotICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KLSAqLwotCi12b2lkCi1vYmpfZW1pdF9zdHJpbmdzICh3aGVyZSkKLSAgICAgY2hhciAqKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIHN0cmluZ19ieXRlX2NvdW50LCBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN0cmluZ19ieXRlX2NvdW50LCAodW5zaWduZWQgbG9uZykgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX05BTUUgKHN5bWJvbFApKQotCWFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkodW5zaWduZWQgbG9uZykgKHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMSkpOwotICAgIH0JCQkJLyogd2FsayBzeW1ib2wgY2hhaW4gKi8KLX0KLQotI2lmbmRlZiBBT1VUX1ZFUlNJT04KLSNkZWZpbmUgQU9VVF9WRVJTSU9OIDAKLSNlbmRpZgotCi12b2lkCi1vYmpfcHJlX3dyaXRlX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBIX1NFVF9EWU5BTUlDIChoZWFkZXJzLCAwKTsKLSAgSF9TRVRfVkVSU0lPTiAoaGVhZGVycywgQU9VVF9WRVJTSU9OKTsKLSAgSF9TRVRfTUFDSFRZUEUgKGhlYWRlcnMsIEFPVVRfTUFDSFRZUEUpOwotICB0Y19hb3V0X3ByZV93cml0ZV9ob29rIChoZWFkZXJzKTsKLX0KLQotdm9pZAotREVGVU5fVk9JRCAoc19zZWN0KQotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZV9lbmQ7Ci0gIGNoYXIgYzsKLQotICB1bnNpZ25lZCBpbnQgbGVuOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBjaGFyICpzYXZlOwotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzZWN0aW9uX25hbWVfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGxlbiA9IHNlY3Rpb25fbmFtZV9lbmQgLSBzZWN0aW9uX25hbWU7Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGMgPT0gJywnKQotICAgIHsKLSAgICAgIGV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICAgICAgZXhwID0gMDsKLSAgICB9Ci0gIGlmIChleHAgPj0gMTAwMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giKSk7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0IChTRUdfVEVYVCwgKHN1YnNlZ1QpIGV4cCk7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0Jc3Vic2VnX3NldCAoU0VHX1RFWFQsIChzdWJzZWdUKSBleHAgKyAxMDAwKTsKLSAgICAgIGVsc2UKLQlzdWJzZWdfc2V0IChTRUdfREFUQSwgKHN1YnNlZ1QpIGV4cCk7Ci0gICAgfQotCi0gICpzZWN0aW9uX25hbWVfZW5kID0gYzsKLX0KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBlbmQgb2Ygb2JqLWFvdXQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYW91dC5oIGIvZ2FzL2NvbmZpZy9vYmotYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2YzM2ZkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWFvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKiBvYmotYW91dC5oLCBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQgZm9yIGdhcywgdGhlIGFzc2VtYmxlci4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKiBUYWcgdG8gdmFsaWRhdGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgT0JKX0FPVVQgMQotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotI2luY2x1ZGUgImJmZC9saWJhb3V0LmgiCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBWTVMKLSNpbmNsdWRlICJhb3V0X2dudS5oIgkJLyogTmVlZGVkIHRvIGRlZmluZSBzdHJ1Y3Qgbmxpc3QuIFNpZ2guICovCi0jZWxzZQotI2luY2x1ZGUgImFfb3V0LmgiCi0jZW5kaWYKLQotI2lmbmRlZiBBT1VUX01BQ0hUWVBFCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMAotI2VuZGlmIC8qIEFPVVRfTUFDSFRZUEUgKi8KLQotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsKLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotI2lmbmRlZiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShPTUFHSUMpCi0jZW5kaWYgLyogREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICovCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogU1lNQk9MIFRBQkxFICovCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgZGF0YSB0eXBlICovCi0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsJLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPm90aGVyID0gKFYpKQotI2RlZmluZSBTX1NFVF9UWVBFKFMsVCkgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPnR5cGUgPSAoVCkpCi0jZGVmaW5lIFNfU0VUX0RFU0MoUyxEKQlcCi0gIChhb3V0X3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+ZGVzYyA9IChEKSkKLSNkZWZpbmUgU19HRVRfT1RIRVIoUykgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPm90aGVyKQotI2RlZmluZSBTX0dFVF9UWVBFKFMpIFwKLSAgKGFvdXRfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT50eXBlKQotI2RlZmluZSBTX0dFVF9ERVNDKFMpIFwKLSAgKGFvdXRfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5kZXNjKQotCi1hc2VjdGlvbiAqdGV4dF9zZWN0aW9uLCAqZGF0YV9zZWN0aW9uLCAqYnNzX3NlY3Rpb247Ci0KLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUFVOVCkJb2JqX2FvdXRfZnJvYl9zeW1ib2wgKFMsICZQVU5UKQotI2RlZmluZSBvYmpfZnJvYl9maWxlKCkJCW9ial9hb3V0X2Zyb2JfZmlsZSAoKQotZXh0ZXJuIHZvaWQgb2JqX2FvdXRfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgb2JqX2FvdXRfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkoMSkKLQotI2Vsc2UKLQotLyogV2UgdXNlIHRoZSBzeV9vYmogZmllbGQgdG8gcmVjb3JkIHdoZXRoZXIgYSBzeW1ib2wgaXMgd2Vhay4gICovCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIGNoYXIKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKLQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgaXMgaW4gTl97VEVYVCxEQVRBLEJTUyxBQlN9IG9yIE5fRVhUICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKSBcCi0gIChTX0dFVF9UWVBFIChzKSAhPSBOX1VOREYgfHwgU19HRVRfREVTQyAocykgIT0gMCkKLQotI2RlZmluZSBTX0lTX0NPTU1PTihzKSBcCi0gIChTX0dFVF9UWVBFIChzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0KLSNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCi0KLS8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLwotI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpIAkJCQkJXAotICAoKFNfR0VUX05BTUUgKHMpIAkJCQkJXAotICAgICYmICFTX0lTX0RFQlVHIChzKSAJCQkJCVwKLSAgICAmJiAoc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMCQlcCi0gICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTAlcCi0gICAgICAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkJXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUJCQlcCi0gICAgICAgJiYgISBTX0lTX0VYVEVSTkFMKHMpCQkJCVwKLSAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChzKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCi0jZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IChjaGFyICopMCkKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fbmFtZSkKLS8qIFRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19HRVRfT0ZGU0VUKHMpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cngpCi0vKiBUaGUgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX1RZUEUocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1RZUEUpCi0vKiBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgc2VnbWVudCAqLwotI2RlZmluZSBTX0dFVF9TRUdNRU5UKHMpCShOX1RZUEVfc2VnW1NfR0VUX1RZUEUocyldKQotLyogVGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9PVEhFUihzKQkJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIpCi0vKiBUaGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfREVTQyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYykKLS8qIFdoZXRoZXIgdGhlIHN5bWJvbCBpcyB3ZWFrLiAgKi8KLSNkZWZpbmUgU19HRVRfV0VBSyhzKQkJKChzKS0+c3lfb2JqKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lID0gKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cnggPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSBmaWVsZCAqLwotI2RlZmluZSBTX1NFVF9UWVBFKHMsdCkJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodCkpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBNYXJrIHRoZSBzeW1ib2wgYXMgd2Vhay4gIFRoaXMgY2F1c2VzIG5fdHlwZSB0byBiZSBhZGp1c3RlZCB3aGVuCi0gICB0aGUgc3ltYm9sIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLSNkZWZpbmUgU19TRVRfV0VBSyhzKQkJKChzKS0+c3lfb2JqID0gMSkKLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0jZGVmaW5lIEhfR0VUX0ZJTEVfU0laRShoKQkoSF9HRVRfSEVBREVSX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX1RFWFRfU0laRShoKSBcCi0JCQkJICsgSF9HRVRfREFUQV9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSBcCi0JCQkJICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9TVFJJTkdfU0laRShoKSkKLQotI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKEVYRUNfQllURVNfU0laRSkKLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCi0jZGVmaW5lIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX3Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfZHJzaXplKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoKGgpLT5oZWFkZXIuYV9zeW1zKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKQkJKChoKS0+aGVhZGVyLmFfZW50cnkpCi0jZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLSNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkJCSgwKQotCi0jZGVmaW5lIEhfR0VUX0RZTkFNSUMoaCkJCSgoaCktPmhlYWRlci5hX2luZm8gPj4gMzEpCi0jZGVmaW5lIEhfR0VUX1ZFUlNJT04oaCkJCSgoKGgpLT5oZWFkZXIuYV9pbmZvID4+IDI0KSAmIDB4N2YpCi0jZGVmaW5lIEhfR0VUX01BQ0hUWVBFKGgpCQkoKChoKS0+aGVhZGVyLmFfaW5mbyA+PiAxNikgJiAweGZmKQotI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkJCSgoaCktPmhlYWRlci5hX2luZm8gJiAweGZmZmYpCi0KLSNkZWZpbmUgSF9TRVRfRFlOQU1JQyhoLHYpCQkoKGgpLT5oZWFkZXIuYV9pbmZvID0gKCgodikgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUdJQ19OVU1CRVIoaCkpKSkKLQotI2RlZmluZSBIX1NFVF9WRVJTSU9OKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoKHYpIDw8IDI0KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BQ0hUWVBFKGgpIDw8IDE2KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BR0lDX05VTUJFUihoKSkpKQotCi0jZGVmaW5lIEhfU0VUX01BQ0hUWVBFKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8ICgodikgPDwgMTYpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFHSUNfTlVNQkVSKGgpKSkpCi0KLSNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAotCQkJCQkJCSAgICAgICB8ICgodikpKSkKLQotI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfdGV4dCA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX1RFWFQsICh2KSkpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9kYXRhID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfREFUQSwgKHYpKSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfQlNTLCAodikpKQotCi0jZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkJKEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKChoKSwodCkpLFwKLQkJCQkJIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKChoKSwoZCkpKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfdHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogMTIpCi0KLSNkZWZpbmUgSF9TRVRfRU5UUllfUE9JTlQoaCx2KQkJKChoKS0+aGVhZGVyLmFfZW50cnkgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikJCSgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCi0gICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgfQotCi1vYmplY3RfaGVhZGVyczsKLQotLyogbGluZSBudW1iZXJpbmcgc3R1ZmYuICovCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLCBiLCBjKQl7O30KLQotc3RydWN0IGZpeDsKLXZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsIHN0cnVjdCBmaXggKmZpeFAsIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzcykpOwotCi0jZW5kaWYKLQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpCXs7fQotCi0jZGVmaW5lIEVNSVRfU0VDVElPTl9TWU1CT0xTCQkwCi0KLSNkZWZpbmUgQU9VVF9TVEFCUwotCi0vKiBlbmQgb2Ygb2JqLWFvdXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYm91dC5jIGIvZ2FzL2NvbmZpZy9vYmotYm91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc5NzE4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWJvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKiBiLm91dCBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotY29uc3Qgc2hvcnQJCQkvKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KLSAgc2VnX05fVFlQRVtdID0KLXsKLSAgTl9BQlMsCi0gIE5fVEVYVCwKLSAgTl9EQVRBLAotICBOX0JTUywKLSAgTl9VTkRGLAkJCS8qIHVua25vd24gKi8KLSAgTl9VTkRGLAkJCS8qIGVycm9yICovCi0gIE5fVU5ERiwJCQkvKiBleHByZXNzaW9uICovCi0gIE5fVU5ERiwJCQkvKiBkZWJ1ZyAqLwotICBOX1VOREYsCQkJLyogbnR2ICovCi0gIE5fVU5ERiwJCQkvKiBwdHYgKi8KLSAgTl9SRUdJU1RFUiwJCQkvKiByZWdpc3RlciAqLwotfTsKLQotY29uc3Qgc2VnVCBOX1RZUEVfc2VnW05fVFlQRSArIDJdID0KLXsJCQkJLyogTl9UWVBFID09IDB4MUUgPSAzMi0yICovCi0gIFNFR19VTktOT1dOLAkJCS8qIE5fVU5ERiA9PSAwICovCi0gIFNFR19HT09GLAotICBTRUdfQUJTT0xVVEUsCQkJLyogTl9BQlMgPT0gMiAqLwotICBTRUdfR09PRiwKLSAgU0VHX1RFWFQsCQkJLyogTl9URVhUID09IDQgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19EQVRBLAkJCS8qIE5fREFUQSA9PSA2ICovCi0gIFNFR19HT09GLAotICBTRUdfQlNTLAkJCS8qIE5fQlNTID09IDggKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX1JFR0lTVEVSLAkJCS8qIGR1bW15IE5fUkVHSVNURVIgZm9yIHJlZ3MgPSAzMCAqLwotICBTRUdfR09PRiwKLX07Ci0KLXN0YXRpYyB2b2lkIG9ial9ib3V0X2xpbmUgUEFSQU1TICgoaW50KSk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7ImxpbmUiLCBvYmpfYm91dF9saW5lLCAwfSwJLyogc291cmNlIGNvZGUgbGluZSBudW1iZXIgKi8KLQotLyogY29mZiBkZWJ1Z2dpbmcgZGlyZWN0aXZlcy4gIEN1cnJlbnRseSBpZ25vcmVkIHNpbGVudGx5ICovCi0gIHsiZGVmIiwgc19pZ25vcmUsIDB9LAotICB7ImRpbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmRlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJsbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJzY2wiLCBzX2lnbm9yZSwgMH0sCi0gIHsic2l6ZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ0YWciLCBzX2lnbm9yZSwgMH0sCi0gIHsidHlwZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ2YWwiLCBzX2lnbm9yZSwgMH0sCi0KLS8qIG90aGVyIHN0dWZmIHdlIGRvbid0IGhhbmRsZSAqLwotICB7IkFCT1JUIiwgc19pZ25vcmUsIDB9LAotICB7ImlkZW50Iiwgc19pZ25vcmUsIDB9LAotCi0gIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLwotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi0vKiBSZWxvY2F0aW9uLiAqLwotCi0vKgotICoJCWVtaXRfcmVsb2NhdGlvbnMoKQotICoKLSAqIENyYXdsIGFsb25nIGEgZml4UyBjaGFpbi4gRW1pdCB0aGUgc2VnbWVudCdzIHJlbG9jYXRpb25zLgotICovCi12b2lkCi1vYmpfZW1pdF9yZWxvY2F0aW9ucyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7CQkvKiBGaXh1cCBjaGFpbiBmb3IgdGhpcyBzZWdtZW50LiAqLwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9kb25lID09IDAKLQkgIHx8IGZpeFAtPmZ4X3JfdHlwZSAhPSBOT19SRUxPQykKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIHN5bSA9IGZpeFAtPmZ4X2FkZHN5OwotCSAgd2hpbGUgKHN5bS0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCQkgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQkgICAgc3ltID0gc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JICBmaXhQLT5meF9hZGRzeSA9IHN5bTsKLQotCSAgdGNfYm91dF9maXhfdG9fY2hhcnMgKCp3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpOwotCSAgKndoZXJlICs9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0JfQkJCS8qIGlmIHRoZXJlJ3MgYSBzeW1ib2wgKi8KLSAgICB9CQkJCS8qIGZvciBlYWNoIGZpeHVwICovCi0KLX0JCQkJLyogZW1pdF9yZWxvY2F0aW9ucygpICovCi0KLS8qIEFvdXQgZmlsZSBnZW5lcmF0aW9uICYgdXRpbGl0aWVzICovCi0KLS8qIENvbnZlcnQgYSBsdmFsdWUgdG8gbWFjaGluZSBkZXBlbmRlbnQgZGF0YSAqLwotdm9pZAotb2JqX2hlYWRlcl9hcHBlbmQgKHdoZXJlLCBoZWFkZXJzKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICAvKiBBbHdheXMgbGVhdmUgaW4gaG9zdCBieXRlIG9yZGVyICovCi0KLSAgaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbU0VHX1RFWFRdOwotCi0gIGlmIChoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24gPCAyKQotICAgIHsKLSAgICAgIGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiA9IDI7Ci0gICAgfQkJCQkvKiBmb3JjZSB0byBhdCBsZWFzdCAyICovCi0KLSAgaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0RBVEFdOwotICBoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFtTRUdfQlNTXTsKLQotICBoZWFkZXJzLT5oZWFkZXIuYV90bG9hZCA9IDA7Ci0gIGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkID0gbWRfc2VjdGlvbl9hbGlnbiAoU0VHX0RBVEEsIEhfR0VUX1RFWFRfU0laRSAoaGVhZGVycykpOwotCi0gIGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSA9IGxpbmtyZWxheDsKLQotI2lmZGVmIENST1NTX0NPTVBJTEUKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RleHQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhdGEsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Jzcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3N5bXMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2JhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYmFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9yZWxheGFibGUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfcmVsYXhhYmxlKTsKLSNlbHNlIC8qICEgQ1JPU1NfQ09NUElMRSAqLwotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmaGVhZGVycy0+aGVhZGVyLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlcikpOwotI2VuZGlmIC8qICEgQ1JPU1NfQ09NUElMRSAqLwotfQkJCQkvKiBhX2hlYWRlcl9hcHBlbmQoKSAqLwotCi12b2lkCi1vYmpfc3ltYm9sX3RvX2NoYXJzICh3aGVyZSwgc3ltYm9sUCkKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICYoU19HRVRfT0ZGU0VUIChzeW1ib2xQKSksIFNfR0VUX09GRlNFVCAoc3ltYm9sUCksIHNpemVvZiAoU19HRVRfT0ZGU0VUIChzeW1ib2xQKSkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICYoU19HRVRfREVTQyAoc3ltYm9sUCkpLCBTX0dFVF9ERVNDIChzeW1ib2xQKSwgc2l6ZW9mIChTX0dFVF9ERVNDIChzeW1ib2xQKSkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICZzeW1ib2xQLT5zeV9zeW1ib2wubl92YWx1ZSwgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplb2YgKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSk7Ci0KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbCwgc2l6ZW9mIChvYmpfc3ltYm9sX3R5cGUpKTsKLX0JCQkJLyogb2JqX3N5bWJvbF90b19jaGFycygpICovCi0KLXZvaWQKLW9ial9lbWl0X3N5bWJvbHMgKHdoZXJlLCBzeW1ib2xfcm9vdFApCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qCi0JICogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uCi0JICovCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBVc2VkIHRvIHNhdmUgdGhlIG9mZnNldCBvZiB0aGUgbmFtZS4gSXQgaXMgdXNlZCB0byBwb2ludAotCQkgICB0byB0aGUgc3RyaW5nIGluIG1lbW9yeSBidXQgbXVzdCBiZSBhIGZpbGUgb2Zmc2V0LiAqLwotICAgICAgY2hhciAqdGVtcDsKLQotICAgICAgdGVtcCA9IFNfR0VUX05BTUUgKHN5bWJvbFApOwotICAgICAgU19TRVRfT0ZGU0VUIChzeW1ib2xQLCBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCk7Ci0KLSAgICAgIC8qIEFueSBzeW1ib2wgc3RpbGwgdW5kZWZpbmVkIGFuZCBpcyBub3QgYSBkYmcgc3ltYm9sIGlzIG1hZGUgTl9FWFQuICovCi0gICAgICBpZiAoIVNfSVNfREVCVUcgKHN5bWJvbFApICYmICFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCVNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQotICAgICAgb2JqX3N5bWJvbF90b19jaGFycyAod2hlcmUsIHN5bWJvbFApOwotICAgICAgU19TRVRfTkFNRSAoc3ltYm9sUCwgdGVtcCk7Ci0gICAgfQotfQkJCQkvKiBlbWl0X3N5bWJvbHMoKSAqLwotCi12b2lkCi1vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX0RFU0MgKHN5bWJvbFAsIDApOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2JvdXRfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBBc3N1bWUgZGVsaW1pdGVyIGlzIHBhcnQgb2YgZXhwcmVzc2lvbi4gKi8KLSAgLyogQlNENC4yIGFzIGZhaWxzIHdpdGggZGVsaWdodGZ1bCBidWcsIHNvIHdlICovCi0gIC8qIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBvYmpfYm91dF9saW5lKCkgKi8KLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotfQotCi12b2lkCi1vYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqKnN5bWJvbFBQOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKTsKLQotICBzeW1ib2xQUCA9ICZzeW1ib2xfcm9vdFA7CS8qLT5sYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLwotICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ICYmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkpCi0JewotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX1RFWFQpOwotCX0JCQkvKiBpZiBwdXNpbmcgZGF0YSBpbnRvIHRleHQgKi8KLQotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgc3ltYm9scy4gICovCi0gICAgICBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpKQotCXsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogT0ssIGhlcmUgaXMgaG93IHdlIGRlY2lkZSB3aGljaCBzeW1ib2xzIGdvIG91dCBpbnRvIHRoZQotCSBicmF2ZSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQkJCi0JICogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQotCSAqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQotCQkKLQkgU3ltYm9scyB0aGF0IGRvbid0IGFyZToKLQkgKiBzeW1ib2xzIHRoYXQgYXJlIHJlZ2lzdGVycwotCSAqIHN5bWJvbHMgd2l0aCBcMSBhcyB0aGVpciAzcmQgY2hhcmFjdGVyIChudW1lcmljIGxhYmVscykKLQkgKiAibG9jYWwgbGFiZWxzIiBhcyBkZWZpbmVkIGJ5IFNfTE9DQUxfTkFNRShuYW1lKQotCSBpZiB0aGUgLUwgc3dpdGNoIHdhcyBwYXNzZWQgdG8gZ2FzLgotCQkKLQkgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCSBzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gKi8KLQotCi0gICAgICBpZiAoMQotCSAgJiYgIVNfSVNfUkVHSVNURVIgKHN5bWJvbFApCi0JICAmJiAoIVNfR0VUX05BTUUgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19ERUJVRyAoc3ltYm9sUCkKLSNpZmRlZiBUQ19JOTYwCi0gICAgICAvKiBGSVhNRS1TT09OIHRoaXMgaWZkZWYgc2VlbXMgaGlnaGx5IGR1YmlvdXMgdG8gbWUuICB4b3hvcmljaC4gKi8KLQkgICAgICB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKQotCSAgICAgIHx8IFNfSVNfRVhURVJOQUwgKHN5bWJvbFApCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCSAgICAgIHx8IChTX0dFVF9OQU1FIChzeW1ib2xQKVswXSAhPSAnXDAwMScgJiYgKGZsYWdfa2VlcF9sb2NhbHMgfHwgIVNfTE9DQUxfTkFNRSAoc3ltYm9sUCkpKSkpCi0JewotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOwotCi0JICAvKiBUaGUgKyAxIGFmdGVyIHN0cmxlbiBhY2NvdW50IGZvciB0aGUgXDAgYXQgdGhlCi0JCQkgICBlbmQgb2YgZWFjaCBzdHJpbmcgKi8KLQkgIGlmICghU19JU19TVEFCRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICAvKiBPcmRpbmFyeSBjYXNlLiAqLwotCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gc3RyaW5nX2J5dGVfY291bnQ7Ci0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgICB9Ci0JICBlbHNlCQkJLyogLlN0YWJkIGNhc2UuICovCi0JICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkgIHN5bWJvbFBQID0gJihzeW1ib2xfbmV4dCAoc3ltYm9sUCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgICAgfQkJCS8qIG9vcHMuICovCi0KLQkgIC8qIFVuaG9vayBpdCBmcm9tIHRoZSBjaGFpbiAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGhlYWRlcnMsIHN5bWJvbF9udW1iZXIpOwotfQotCi0vKgotICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KLSAqLwotCi12b2lkCi1vYmpfZW1pdF9zdHJpbmdzICh3aGVyZSkKLSAgICAgY2hhciAqKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIHN0cmluZ19ieXRlX2NvdW50LCBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN0cmluZ19ieXRlX2NvdW50LCAodW5zaWduZWQgbG9uZykgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX05BTUUgKHN5bWJvbFApKQotCWFwcGVuZCAod2hlcmUsIFNfR0VUX05BTUUgKHN5bWJvbFApLCAodW5zaWduZWQgbG9uZykgKHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMSkpOwotICAgIH0JCQkJLyogd2FsayBzeW1ib2wgY2hhaW4gKi8KLX0KLQotLyogZW5kIG9mIG9iai1ib3V0LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWJvdXQuaCBiL2dhcy9jb25maWcvb2JqLWJvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1MzlhMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ib3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyogYi5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBDYW1icmlkZ2UsIE1BCi0gICAwMjEzOSwgVVNBLiAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAnYS5vdXQuaCcuICBJdCBpcyB0byBiZSB1c2VkIGluIGFsbCBHTlUKLSAqIHRvb2xzIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIGk4MDk2MCBiLm91dCBmb3JtYXQgKG9yIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbgotICogb2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgc3VjaCB0b29scykuCi0gKgotICogQWxsIGk4MDk2MCBkZXZlbG9wbWVudCBpcyBkb25lIGluIGEgQ1JPU1MtREVWRUxPUE1FTlQgZW52aXJvbm1lbnQuICBJLmUuLAotICogb2JqZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIG9uLCBhbmQgZXhlY3V0ZWQgdW5kZXIgdGhlIGRpcmVjdGlvbiBvZiBhIHN5bWJvbGljCi0gKiBkZWJ1Z2dlciBydW5uaW5nIG9uLCBhIGhvc3Qgc3lzdGVtLiAgV2UgZG8gbm90IHdhbnQgdG8gYmUgc3ViamVjdCB0byB0aGUKLSAqIHZhZ2FyaWVzIG9mIHdoaWNoIGhvc3QgaXQgaXMgb3Igd2hldGhlciBpdCBzdXBwb3J0cyBDT0ZGIG9yIGEub3V0IGZvcm1hdCwgb3IKLSAqIGFueXRoaW5nIGVsc2UuICBXZSBETyB3YW50IHRvOgotICoKLSAqCW8gYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIGZvcm1hdCBvYmplY3QgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgaG9zdC4KLSAqCi0gKglvIGhhdmUgYW4gJ2Eub3V0JyBoZWFkZXIgdGhhdCB3ZSBjYW4gbW9kaWZ5IGZvciBvdXIgb3duIHB1cnBvc2VzCi0gKgkgICh0aGUgODA5NjAgaXMgdHlwaWNhbGx5IGFuIGVtYmVkZGVkIHByb2Nlc3NvciBhbmQgbWF5IHJlcXVpcmUKLSAqCSAgZW5oYW5jZWQgbGlua2VyIHN1cHBvcnQgdGhhdCB0aGUgbm9ybWFsIGEub3V0LmggaGVhZGVyIGNhbid0Ci0gKgkgIGFjY29tbW9kYXRlKS4KLSAqCi0gKiBBcyBmb3IgYnl0ZS1vcmRlcmluZywgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKLSAqCi0gKglvIFRleHQgYW5kIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgaXMgYWx3YXlzCi0gKgkgIGluIGk4MDk2MCAobGl0dGxlLWVuZGlhbikgb3JkZXIuCi0gKgotICoJbyBBbGwgb3RoZXIgbnVtYmVycyAoaW4gdGhlIGhlYWRlciwgc3ltYm9scywgcmVsb2NhdGlvbiBkaXJlY3RpdmVzKQotICoJICBhcmUgaW4gaG9zdCBieXRlLW9yZGVyOiAgb2JqZWN0IGZpbGVzIENBTk5PVCBiZSBsaWZ0ZWQgZnJvbSBhCi0gKgkgIGxpdHRsZS1lbmQgaG9zdCBhbmQgdXNlZCBvbiBhIGJpZy1lbmRpYW4gKG9yIHZpY2UgdmVyc2EpIHdpdGhvdXQKLSAqCSAgbW9kaWZpY2F0aW9uLgotICogPT0+IFRISVMgSVMgTk8gTE9OR0VSIFRSVUUgVVNJTkcgQkZELiAgV0UgQ0FOIEdFTkVSQVRFIEFOWSBCWVRFIE9SREVSCi0gKiAgICAgRk9SIFRIRSBIRUFERVIsIEFORCBSRUFEIEFOWSBCWVRFIE9SREVSLiAgUFJFRkVSRU5DRSBXT1VMRCBCRSBUTwotICogICAgIFVTRSBMSVRUTEUtRU5ESUFOIEJZVEUgT1JERVIgVEhST1VHSE9VVCwgUkVHQVJETEVTUyBPRiBIT1NULiAgPD09Ci0gKgotICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgotICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQotICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKLSAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCi0gKi8KLQotCi0jZGVmaW5lIE9CSl9CT1VUIDEKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jZGVmaW5lIE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUUJImIub3V0IgotCi1leHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwotCi0jZGVmaW5lIEJNQUdJQwkwNDE1Ci0vKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KLSAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KLSAqLwotI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KLSNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCi0jZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KLQotI2lmbmRlZiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShCTUFHSUMpCi0jZW5kaWYgLyogREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICovCi0KLS8qIEZJTEUgSEVBREVSCi0gKglBbGwgJ2xlbmd0aHMnIGFyZSBnaXZlbiBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAqCUFsbCAnYWxpZ25tZW50cycgYXJlIGZvciByZWxpbmthYmxlIGZpbGVzIG9ubHk7ICBhbiBhbGlnbm1lbnQgb2YKLSAqCQknbicgaW5kaWNhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgbXVzdCBiZWdpbiBhdCBhbgotICoJCWFkZHJlc3MgdGhhdCBpcyBhIG11bHRpcGxlIG9mICgyKipuKS4KLSAqLwotc3RydWN0IGV4ZWMKLSAgewotICAgIC8qIFN0YW5kYXJkIHN0dWZmICovCi0gICAgdW5zaWduZWQgbG9uZyBhX21hZ2ljOwkvKiBJZGVudGlmaWVzIHRoaXMgYXMgYSBiLm91dCBmaWxlCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CS8qIExlbmd0aCBvZiB0ZXh0CQkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJLyogTGVuZ3RoIG9mIGRhdGEJCQkqLwotICAgIHVuc2lnbmVkIGxvbmcgYV9ic3M7CS8qIExlbmd0aCBvZiBydW50aW1lIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhICovCi0gICAgdW5zaWduZWQgbG9uZyBhX3N5bXM7CS8qIExlbmd0aCBvZiBzeW1ib2wgdGFibGUJCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OwkvKiBSdW50aW1lIHN0YXJ0IGFkZHJlc3MJCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogTGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogTGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvCSovCi0KLSAgICAvKiBBZGRlZCBmb3IgaTk2MCAqLwotICAgIHVuc2lnbmVkIGxvbmcgYV90bG9hZDsJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcwkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZGxvYWQ7CS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MJCSovCi0gICAgdW5zaWduZWQgY2hhciBhX3RhbGlnbjsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudAkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfZGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgZGF0YSBzZWdtZW50CQkqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudAkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfcmVsYXhhYmxlOwkvKiBDb250YWlucyBlbm91Z2ggaW5mbyB0byByZWxheCAgICAgKi8KLSAgfTsKLQotI2RlZmluZSBOX0JBRE1BRyh4KQkoKCh4KS5hX21hZ2ljKSE9Qk1BR0lDKQotI2RlZmluZSBOX1RYVE9GRih4KQkoIHNpemVvZihzdHJ1Y3QgZXhlYykgKQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQotLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQotICovCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqbl9uYW1lOwotCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCWxvbmcgbl9zdHJ4OwkJLyogSW5kZXggaW50byBzdHJpbmcgdGFibGUJKi8KLSAgICAgIH0KLSAgICBuX3VuOwotICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLSAgICBjaGFyIG5fb3RoZXI7CQkvKiBVc2VkIGluIGk4MDk2MCBzdXBwb3J0IC0tIHNlZSBiZWxvdwkqLwotICAgIHNob3J0IG5fZGVzYzsKLSAgICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsKLQotLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZQotICovCi0jZGVmaW5lIE5fVU5ERgkwCQkvKiBVbmRlZmluZWQgc3ltYm9sCSovCi0jZGVmaW5lIE5fQUJTCTIJCS8qIEFic29sdXRlIHN5bWJvbAkqLwotI2RlZmluZSBOX1RFWFQJNAkJLyogVGV4dCBzeW1ib2wJCSovCi0jZGVmaW5lIE5fREFUQQk2CQkvKiBEYXRhIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9CU1MJOAkJLyogQlNTIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9GTgkzMQkJLyogRmlsZW5hbWUgc3ltYm9sCSovCi0KLSNkZWZpbmUgTl9FWFQJMQkJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLwotI2RlZmluZSBOX1RZUEUJMDM2CQkvKiBNYXNrIGZvciBhbGwgdGhlIHR5cGUgYml0cwkJCSovCi0jZGVmaW5lIE5fU1RBQgkwMzQwCQkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotI2lmbmRlZiBDVVNUT01fUkVMT0NfRk9STUFUCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi0gIHsKLSAgICBpbnQgcl9hZGRyZXNzOwkJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCi0gICAgdW5zaWduZWQKLSAgICAgIHJfaW5kZXg6MjQsCQkvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCovCi0gICAgICByX3BjcmVsOjEsCQkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCi0JCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0Ci0JCSAqCWFkZHJlc3MsIGFic29sdXRlIGltcGxpZXMgMzItYml0LgotCQkgKi8KLSAgICAgIHJfbGVuZ3RoOjIsCQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6Ci0JCSAqCTAgPT4gMSBieXRlCi0JCSAqCTEgPT4gMiBieXRlcwotCQkgKgkyID0+IDQgYnl0ZXMgLS0gb25seSB2YWx1ZSB1c2VkIGZvciBpOTYwCi0JCSAqLwotICAgICAgcl9leHRlcm46MSwgcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9kaXNwOjEsCQkJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9jYWxsajoxLAkJLyogMSBpZiByZWxvY2F0aW9uIHRhcmdldCBpcyBhbiBpOTYwICdjYWxsaicgKi8KLSAgICAgIG51dGhpbjoxOwkJCS8qIFVudXNlZAkJCQkqLwotICB9OwotCi0jZW5kaWYgLyogQ1VTVE9NX1JFTE9DX0ZPUk1BVCAqLwotCi0vKgotICogIE1hY3JvcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKiAgVGhpcyBzeW50YXhpYyBpbmRpcmVjdGlvbiBhbGxvd3MgaW5kZXBlbmRlbmNlIHJlZ2FyZGluZyBhLm91dCBvciBjb2ZmLgotICogIFRoZSBhcmd1bWVudCAocykgb2YgYWxsIHRoZXNlIG1hY3JvcyBpcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKi8KLQotLyogUHJlZGljYXRlcyAqLwotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfSVNfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotCi0vKiBUcnVlIGlmIHN5bWJvbCBoYXMgYmVlbiBkZWZpbmVkLCBpZSBpcyBpbiBOX3tURVhULERBVEEsQlNTLEFCU30gb3IgTl9FWFQgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoKFNfR0VUX1RZUEUocykgIT0gTl9VTkRGKSB8fCAoU19HRVRfREVTQyhzKSAhPSAwKSkKLQotI2RlZmluZSBTX0lTX0NPTU1PTihzKSBcCi0gIChTX0dFVF9UWVBFIChzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0KLSNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCi0KLS8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLwotI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpIAkJCQkJXAotICAoKFNfR0VUX05BTUUgKHMpIAkJCQkJXAotICAgICYmICFTX0lTX0RFQlVHIChzKSAJCQkJCVwKLSAgICAmJiAoc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMCQlcCi0gICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTAlcCi0gICAgICAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkJXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUJCQlcCi0gICAgICAgJiYgIVNfSVNfRVhURVJOQUwocykJCQkJXAotICAgICAgICYmIFNfR0VUX1NFR01FTlQocykgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIG9mIGEgLnN0YWJkIGRpcmVjdGl2ZSAqLwotI2RlZmluZSBTX0lTX1NUQUJEKHMpCQkoU19HRVRfTkFNRShzKSA9PSBOVUxMKQotCi0vKiBBY2Nlc3NvcnMgKi8KLS8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lKQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fc3RyeCkKLS8qIFRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fVFlQRSkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKE5fVFlQRV9zZWdbU19HRVRfVFlQRShzKV0pCi0vKiBUaGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX09USEVSKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlcikKLS8qIFRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9ERVNDKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lID0gKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cnggPSAodikpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9UWVBFKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodikpCi0KLS8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KLQotI2RlZmluZSBIX0dFVF9GSUxFX1NJWkUoaCkJKHNpemVvZihzdHJ1Y3QgZXhlYykgKyBcCi0JCQkJIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKLQkJCQkgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkgKyBcCi0JCQkJIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpICsgXAotCQkJCSBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoKSArIFwKLQkJCQkgKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLQotI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKHNpemVvZihzdHJ1Y3QgZXhlYykpCi0jZGVmaW5lIEhfR0VUX1RFWFRfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfdGV4dCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9kYXRhKQotI2RlZmluZSBIX0dFVF9CU1NfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfYnNzKQotI2RlZmluZSBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRShoKQkoKGgpLT5oZWFkZXIuYV90cnNpemUpCi0jZGVmaW5lIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfc3ltcykKLSNkZWZpbmUgSF9HRVRfTUFHSUNfTlVNQkVSKGgpCQkoKGgpLT5oZWFkZXIuYV9pbmZvKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKQkJKChoKS0+aGVhZGVyLmFfZW50cnkpCi0jZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLSNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkJCSgwKQotCi0jaWZkZWYgRVhFQ19NQUNISU5FX1RZUEUKLSNkZWZpbmUgSF9HRVRfTUFDSElORV9UWVBFKGgpCQkoKGgpLT5oZWFkZXIuYV9tYWNodHlwZSkKLSNlbmRpZiAvKiBFWEVDX01BQ0hJTkVfVFlQRSAqLwotI2lmZGVmIEVYRUNfVkVSU0lPTgotI2RlZmluZSBIX0dFVF9WRVJTSU9OKGgpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uKQotI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLwotCi0jZGVmaW5lIEhfU0VUX1RFWFRfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV90ZXh0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfZGF0YSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gKHYpKQotCi0jZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkJKEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKChoKSwodCkpLFwKLQkJCQkJIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKChoKSwoZCkpKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfdHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogXAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBubGlzdCkpCi0KLSNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikJCSgoaCktPmhlYWRlci5hX21hZ2ljID0gKHYpKQotCi0jZGVmaW5lIEhfU0VUX0VOVFJZX1BPSU5UKGgsdikJCSgoaCktPmhlYWRlci5hX2VudHJ5ID0gKHYpKQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKLSNpZmRlZiBFWEVDX01BQ0hJTkVfVFlQRQotI2RlZmluZSBIX1NFVF9NQUNISU5FX1RZUEUoaCx2KQkJKChoKS0+aGVhZGVyLmFfbWFjaHR5cGUgPSAodikpCi0jZW5kaWYgLyogRVhFQ19NQUNISU5FX1RZUEUgKi8KLSNpZmRlZiBFWEVDX1ZFUlNJT04KLSNkZWZpbmUgSF9TRVRfVkVSU0lPTihoLHYpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uID0gKHYpKQotI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCi0gICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgfQotCi1vYmplY3RfaGVhZGVyczsKLQotLyogdW51c2VkIGhvb2tzLiAqLwotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9Ci0jZGVmaW5lIG9ial9wcmVfd3JpdGVfaG9vayhhKQkJezt9Ci0KLSNpZiBfX1NURENfXwotc3RydWN0IGZpeDsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsCi0JCQkJCSAgc3RydWN0IGZpeCAqZml4UCwKLQkJCQkJICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3MpKTsKLWV4dGVybiB2b2lkIHRjX2JvdXRfZml4X3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKndoZXJlLAotCQkJCQkgIHN0cnVjdCBmaXggKmZpeFAsCi0JCQkJCSAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzKSk7Ci0KLSNkZWZpbmUgQU9VVF9TVEFCUwotCi0vKiBlbmQgb2Ygb2JqLWJvdXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5jIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODFkMjNkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ODggKzAsMCBAQAotLyogY29mZiBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfSEVBREVSICJvYmotY29mZi5oIgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0vKiBJIHRoaW5rIHRoaXMgaXMgcHJvYmFibHkgYWx3YXlzIGNvcnJlY3QuICAqLwotI2lmbmRlZiBLRUVQX1JFTE9DX0lORk8KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgb2JqX2NvZmZfYnNzIFBBUkFNUyAoKGludCkpOwotY29uc3QgY2hhciAqc19nZXRfbmFtZSBQQVJBTVMgKChzeW1ib2xTICogcykpOwotc3RhdGljIHN5bWJvbFMgKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3M7Ci0KLQwKLS8qIHN0YWNrIHN0dWZmICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBjaHVua19zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgZWxlbWVudF9zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICBjaGFyICpkYXRhOwotICAgIHVuc2lnbmVkIGxvbmcgcG9pbnRlcjsKLSAgfQotc3RhY2s7Ci0KLXN0YXRpYyBzdGFjayAqCi1zdGFja19pbml0IChjaHVua19zaXplLCBlbGVtZW50X3NpemUpCi0gICAgIHVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbGVtZW50X3NpemU7Ci17Ci0gIHN0YWNrICpzdDsKLQotICBzdCA9IChzdGFjayAqKSBtYWxsb2MgKHNpemVvZiAoc3RhY2spKTsKLSAgaWYgKCFzdCkKLSAgICByZXR1cm4gMDsKLSAgc3QtPmRhdGEgPSBtYWxsb2MgKGNodW5rX3NpemUpOwotICBpZiAoIXN0LT5kYXRhKQotICAgIHsKLSAgICAgIGZyZWUgKHN0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgc3QtPnBvaW50ZXIgPSAwOwotICBzdC0+c2l6ZSA9IGNodW5rX3NpemU7Ci0gIHN0LT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKLSAgc3QtPmVsZW1lbnRfc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIHN0OwotfQotCi0jaWYgMAotLyogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLXN0YXRpYyB2b2lkCi1zdGFja19kZWxldGUgKHN0KQotICAgICBzdGFjayAqc3Q7Ci17Ci0gIGZyZWUgKHN0LT5kYXRhKTsKLSAgZnJlZSAoc3QpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICoKLXN0YWNrX3B1c2ggKHN0LCBlbGVtZW50KQotICAgICBzdGFjayAqc3Q7Ci0gICAgIGNoYXIgKmVsZW1lbnQ7Ci17Ci0gIGlmIChzdC0+cG9pbnRlciArIHN0LT5lbGVtZW50X3NpemUgPj0gc3QtPnNpemUpCi0gICAgewotICAgICAgc3QtPnNpemUgKz0gc3QtPmNodW5rX3NpemU7Ci0gICAgICBpZiAoKHN0LT5kYXRhID0geHJlYWxsb2MgKHN0LT5kYXRhLCBzdC0+c2l6ZSkpID09IChjaGFyICopIDApCi0JcmV0dXJuIChjaGFyICopIDA7Ci0gICAgfQotICBtZW1jcHkgKHN0LT5kYXRhICsgc3QtPnBvaW50ZXIsIGVsZW1lbnQsIHN0LT5lbGVtZW50X3NpemUpOwotICBzdC0+cG9pbnRlciArPSBzdC0+ZWxlbWVudF9zaXplOwotICByZXR1cm4gc3QtPmRhdGEgKyBzdC0+cG9pbnRlcjsKLX0KLQotc3RhdGljIGNoYXIgKgotc3RhY2tfcG9wIChzdCkKLSAgICAgc3RhY2sgKnN0OwotewotICBpZiAoc3QtPnBvaW50ZXIgPCBzdC0+ZWxlbWVudF9zaXplKQotICAgIHsKLSAgICAgIHN0LT5wb2ludGVyID0gMDsKLSAgICAgIHJldHVybiAoY2hhciAqKSAwOwotICAgIH0KLSAgc3QtPnBvaW50ZXIgLT0gc3QtPmVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIHN0LT5kYXRhICsgc3QtPnBvaW50ZXI7Ci19Ci0MCi0vKgotICogTWFpbnRhaW4gYSBsaXN0IG9mIHRoZSB0YWduYW1lcyBvZiB0aGUgc3RydWN0cmVzLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWdfaGFzaDsKLQotc3RhdGljIHZvaWQKLXRhZ19pbml0ICgpCi17Ci0gIHRhZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWdfaW5zZXJ0IChuYW1lLCBzeW1ib2xQKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBjb25zdCBjaGFyICplcnJvcl9zdHJpbmc7Ci0KLSAgaWYgKChlcnJvcl9zdHJpbmcgPSBoYXNoX2phbSAodGFnX2hhc2gsIG5hbWUsIChjaGFyICopIHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cnVjdHVyZSB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCW5hbWUsIGVycm9yX3N0cmluZyk7Ci0gICAgfQotfQotCi1zdGF0aWMgc3ltYm9sUyAqCi10YWdfZmluZCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmICgqbmFtZSA9PSAnXycpCi0gICAgbmFtZSsrOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLSAgcmV0dXJuIChzeW1ib2xTICopIGhhc2hfZmluZCAodGFnX2hhc2gsIG5hbWUpOwotfQotCi1zdGF0aWMgc3ltYm9sUyAqCi10YWdfZmluZF9vcl9tYWtlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGlmICgoc3ltYm9sUCA9IHRhZ19maW5kIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkgICAgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICAgICAgdGFnX2luc2VydCAoU19HRVRfTkFNRSAoc3ltYm9sUCksIHN5bWJvbFApOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotI2VuZGlmCi0gICAgfQkJCQkvKiBub3QgZm91bmQgKi8KLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQotLyogV2UgYWNjZXB0IHRoZSAuYnNzIGRpcmVjdGl2ZSB0byBzZXQgdGhlIHNlY3Rpb24gZm9yIGJhY2t3YXJkCi0gICBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBnYXMuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfYnNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0gICAgc3Vic2VnX25ldyAoIi5ic3MiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIGVsc2UKLSAgICBzX2xjb21tICgwKTsKLX0KLQotLyogSGFuZGxlIC53ZWFrLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAKLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1MRVIKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19OVF9XRUFLKTsKLSNlbHNlCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1dFQUtFWFQpOwotI2VuZGlmCi0KLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotc3RhdGljIHZvaWQgU0FfU0VUX1NZTV9UQUdORFggUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLQotI2RlZmluZSBHRVRfRklMRU5BTUVfU1RSSU5HKFgpIFwKLSgoY2hhciopKCYoKFgpLT5zeV9zeW1ib2wub3N0X2F1eGVudC0+eF9maWxlLnhfbi54X29mZnNldCkpWzFdKQotCi0vKiBAQCBJY2suICAqLwotc3RhdGljIHNlZ1QKLWZldGNoX2NvZmZfZGVidWdfc2VjdGlvbiAoKQotewotICBzdGF0aWMgc2VnVCBkZWJ1Z19zZWN0aW9uOwotICBpZiAoIWRlYnVnX3NlY3Rpb24pCi0gICAgewotICAgICAgQ09OU1QgYXN5bWJvbCAqczsKLSAgICAgIHMgPSBiZmRfbWFrZV9kZWJ1Z19zeW1ib2wgKHN0ZG91dHB1dCwgKGNoYXIgKikgMCwgMCk7Ci0gICAgICBhc3NlcnQgKHMgIT0gMCk7Ci0gICAgICBkZWJ1Z19zZWN0aW9uID0gcy0+c2VjdGlvbjsKLSAgICB9Ci0gIHJldHVybiBkZWJ1Z19zZWN0aW9uOwotfQotCi12b2lkCi1TQV9TRVRfU1lNX0VORE5EWCAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgc3ltYm9sUyAqdmFsOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICplbnRyeSwgKnA7Ci0KLSAgZW50cnkgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbMV07Ci0gIHAgPSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAodmFsKSktPm5hdGl2ZTsKLSAgZW50cnktPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAgPSBwOwotICBlbnRyeS0+Zml4X2VuZCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1TQV9TRVRfU1lNX1RBR05EWCAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgc3ltYm9sUyAqdmFsOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICplbnRyeSwgKnA7Ci0KLSAgZW50cnkgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbMV07Ci0gIHAgPSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAodmFsKSktPm5hdGl2ZTsKLSAgZW50cnktPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgPSBwOwotICBlbnRyeS0+Zml4X3RhZyA9IDE7Ci19Ci0KLXN0YXRpYyBpbnQKLVNfR0VUX0RBVEFfVFlQRSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlOwotfQotCi1pbnQKLVNfU0VUX0RBVEFfVFlQRSAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50IHZhbDsKLXsKLSAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSA9IHZhbDsKLSAgcmV0dXJuIHZhbDsKLX0KLQotaW50Ci1TX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgcmV0dXJuIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzczsKLX0KLQotaW50Ci1TX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIHZhbCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBpbnQgdmFsOwotewotICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSB2YWw7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIE1lcmdlIGEgZGVidWcgc3ltYm9sIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24gaW50byBhIG5vcm1hbCBzeW1ib2wuICovCi0KLXZvaWQKLWNfc3ltYm9sX21lcmdlIChkZWJ1Zywgbm9ybWFsKQotICAgICBzeW1ib2xTICpkZWJ1ZzsKLSAgICAgc3ltYm9sUyAqbm9ybWFsOwotewotICBTX1NFVF9EQVRBX1RZUEUgKG5vcm1hbCwgU19HRVRfREFUQV9UWVBFIChkZWJ1ZykpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChub3JtYWwsIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlYnVnKSk7Ci0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCkpCi0gICAgewotICAgICAgLyogdGFrZSB0aGUgbW9zdCB3ZSBoYXZlICovCi0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwsIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSk7Ci0gICAgfQotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiAwKQotICAgIHsKLSAgICAgIC8qIE1vdmUgYWxsIHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uICAqLwotICAgICAgbWVtY3B5IChTWU1fQVVYSU5GTyAobm9ybWFsKSwgU1lNX0FVWElORk8gKGRlYnVnKSwKLQkgICAgICAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpCi0JICAgICAgICogc2l6ZW9mICgqU1lNX0FVWElORk8gKGRlYnVnKSkpKTsKLSAgICB9Ci0KLSAgLyogTW92ZSB0aGUgZGVidWcgZmxhZ3MuICovCi0gIFNGX1NFVF9ERUJVR19GSUVMRCAobm9ybWFsLCBTRl9HRVRfREVCVUdfRklFTEQgKGRlYnVnKSk7Ci19Ci0KLXZvaWQKLWNfZG90X2ZpbGVfc3ltYm9sIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKGZpbGVuYW1lLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfRklMRSk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlbmFtZSk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wgaXMgZmlyc3Qgb24gdGhlIHN5bWJvbCBjaGFpbiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQICE9IHN5bWJvbFApCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW1ib2xQLCBzeW1ib2xfcm9vdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0JCQkJLyogaWYgbm90IGZpcnN0IG9uIHRoZSBsaXN0ICovCi19Ci0KLS8qIExpbmUgbnVtYmVyIGhhbmRsaW5nICovCi0KLXN0cnVjdCBsaW5lX25vIHsKLSAgc3RydWN0IGxpbmVfbm8gKm5leHQ7Ci0gIGZyYWdTICpmcmFnOwotICBhbGVudCBsOwotfTsKLQotaW50IGNvZmZfbGluZV9iYXNlOwotCi0vKiBTeW1ib2wgb2YgbGFzdCBmdW5jdGlvbiwgd2hpY2ggd2Ugc2hvdWxkIGhhbmcgbGluZSNzIG9mZiBvZi4gICovCi1zdGF0aWMgc3ltYm9sUyAqbGluZV9mc3ltOwotCi0jZGVmaW5lIGluX2Z1bmN0aW9uKCkJCShsaW5lX2ZzeW0gIT0gMCkKLSNkZWZpbmUgY2xlYXJfZnVuY3Rpb24oKQkobGluZV9mc3ltID0gMCkKLSNkZWZpbmUgc2V0X2Z1bmN0aW9uKEYpCQkobGluZV9mc3ltID0gKEYpLCBjb2ZmX2FkZF9saW5lc3ltIChGKSkKLQotDAotdm9pZAotY29mZl9vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBsb25nICAgc3ogPSAoT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgKyAxKSAqIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSk7Ci0gIGNoYXIgKiBzICA9IChjaGFyICopIHhtYWxsb2MgKHN6KTsKLSAgCi0gIG1lbXNldCAocywgMCwgc3opOwotICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCkpLT5uYXRpdmUgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBzOwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoc3ltYm9sUCwgVF9OVUxMKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX1NUUklORyAoc3ltYm9sUCk7Ci0gIAotICBpZiAoU19JU19MT0NBTCAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLX0KLQotDAotLyoKLSAqIEhhbmRsZSAubG4gZGlyZWN0aXZlcy4KLSAqLwotCi1zdGF0aWMgc3ltYm9sUyAqY3VycmVudF9saW5lbm9fc3ltOwotc3RhdGljIHN0cnVjdCBsaW5lX25vICpsaW5lX25vczsKLS8qIEBAIEJsaW5kbHkgYXNzdW1lIGFsbCAubG4gZGlyZWN0aXZlcyB3aWxsIGJlIGluIHRoZSAudGV4dCBzZWN0aW9uLi4uICAqLwotaW50IGNvZmZfbl9saW5lX25vczsKLQotc3RhdGljIHZvaWQKLWFkZF9saW5lbm8gKGZyYWcsIG9mZnNldCwgbnVtKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IG51bTsKLXsKLSAgc3RydWN0IGxpbmVfbm8gKm5ld19saW5lID0KLSAgICAoc3RydWN0IGxpbmVfbm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGluZV9ubykpOwotICBpZiAoIWN1cnJlbnRfbGluZW5vX3N5bSkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5ld19saW5lLT5uZXh0ID0gbGluZV9ub3M7Ci0gIG5ld19saW5lLT5mcmFnID0gZnJhZzsKLSAgbmV3X2xpbmUtPmwubGluZV9udW1iZXIgPSBudW07Ci0gIG5ld19saW5lLT5sLnUub2Zmc2V0ID0gb2Zmc2V0OwotICBsaW5lX25vcyA9IG5ld19saW5lOwotICBjb2ZmX25fbGluZV9ub3MrKzsKLX0KLQotdm9pZAotY29mZl9hZGRfbGluZXN5bSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChsaW5lX25vcykKLSAgICB7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoY3VycmVudF9saW5lbm9fc3ltKSktPmxpbmVubyA9Ci0JKGFsZW50ICopIGxpbmVfbm9zOwotICAgICAgY29mZl9uX2xpbmVfbm9zKys7Ci0gICAgICBsaW5lX25vcyA9IDA7Ci0gICAgfQotICBjdXJyZW50X2xpbmVub19zeW0gPSBzeW07Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9sbiAoYXBwbGluZSkKLSAgICAgaW50IGFwcGxpbmU7Ci17Ci0gIGludCBsOwotCi0gIGlmICghIGFwcGxpbmUgJiYgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sbiBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKCFhcHBsaW5lKQotICAgIHsKLSAgICAgIGFkZF9saW5lbm8gKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIGwpOwotICAgIH0KLQotICBpZiAoYXBwbGluZSkKLSAgICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCBsIC0gMSk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICB7Ci0gICAgZXh0ZXJuIGludCBsaXN0aW5nOwotCi0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JaWYgKCEgYXBwbGluZSkKLQkgIGwgKz0gY29mZl9saW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKGwpOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICoJCQlkZWYoKQotICoKLSAqIEhhbmRsZSAuZGVmIGRpcmVjdGl2ZXMuCi0gKgotICogT25lIG1pZ2h0IGFzayA6IHdoeSBjYW4ndCB3ZSBzeW1ib2xfbmV3IGlmIHRoZSBzeW1ib2wgZG9lcyBub3QKLSAqIGFscmVhZHkgZXhpc3QgYW5kIGZpbGwgaXQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4gIEJlY2F1c2Ugb2YKLSAqIHRoZSBDX0VGQ04gc3BlY2lhbCBzeW1ib2wuIEl0IHdvdWxkIGNsb2JiZXIgdGhlIHZhbHVlIG9mIHRoZQotICogZnVuY3Rpb24gc3ltYm9sIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIG5vdGljZSB0aGF0IGl0IGlzCi0gKiBhIENfRUZDTi4gQW5kIGEgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG1vcmUgY2xlYXIgdGhpcwotICogd2F5LiAoYXQgbGVhc3QgSSB0aGluayBpdCBpcyA6LSkuCi0gKgotICovCi0KLSNkZWZpbmUgU0tJUF9TRU1JX0NPTE9OKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnOycpCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRVMoKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgXAotCQkJCSAgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcdCcpIFwKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RlZiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIGNoYXIgbmFtZV9lbmQ7CQkvKiBDaGFyIGFmdGVyIHRoZSBlbmQgb2YgbmFtZSAqLwotICBjaGFyICpzeW1ib2xfbmFtZTsJCS8qIE5hbWUgb2YgdGhlIGRlYnVnIHN5bWJvbCAqLwotICBjaGFyICpzeW1ib2xfbmFtZV9jb3B5OwkvKiBUZW1wb3JhcnkgY29weSBvZiB0aGUgbmFtZSAqLwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfbGVuZ3RoOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTS0lQX1dISVRFU1BBQ0VTICgpOwotCi0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgaWYgKHN5bWJvbF9uYW1lWzBdID09ICdfJyAmJiBzeW1ib2xfbmFtZVsxXSAhPSAwKQotICAgIHN5bWJvbF9uYW1lKys7Ci0jZW5kaWYgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotCi0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbF9uYW1lX2xlbmd0aCA9IHN0cmxlbiAoc3ltYm9sX25hbWUpOwotICBzeW1ib2xfbmFtZV9jb3B5ID0geG1hbGxvYyAoc3ltYm9sX25hbWVfbGVuZ3RoICsgMSk7Ci0gIHN0cmNweSAoc3ltYm9sX25hbWVfY29weSwgc3ltYm9sX25hbWUpOwotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZV9jb3B5ID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZV9jb3B5KTsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemUgdGhlIG5ldyBzeW1ib2wgKi8KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IHN5bWJvbF9tYWtlIChzeW1ib2xfbmFtZV9jb3B5KTsKLSAgc3ltYm9sX3NldF9mcmFnIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMCk7Ci0KLSAgaWYgKFNfSVNfU1RSSU5HIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICBTRl9TRVRfU1RSSU5HIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdW5zaWduZWQgaW50IGRpbV9pbmRleDsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2VuZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogRElNIEJVRyBGSVggc2FjQGN5Z251cy5jb20gKi8KLSAgZGltX2luZGV4ID0gMDsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBudW1iZXIgYWNjb3JkaW5nIHRvIHN0b3JhZ2UgY2xhc3MuICovCi0gIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIFNGX1NFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRklMRToKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uICgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VGQ046Ci0gICAgICBTRl9TRVRfTE9DQUwgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBEbyBub3QgZW1pdCB0aGlzIHN5bWJvbC4gKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0JMT0NLOgotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBXaWxsIG5lZWQgcHJvY2Vzc2luZyBiZWZvcmUgd3JpdGluZyAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRkNOOgotICAgICAgewotCUNPTlNUIGNoYXIgKm5hbWU7Ci0JU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGV4dF9zZWN0aW9uKTsKLQotCW5hbWUgPSBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQlpZiAobmFtZVsxXSA9PSAnYicgJiYgbmFtZVsyXSA9PSAnZicpCi0JICB7Ci0JICAgIGlmICghIGluX2Z1bmN0aW9uICgpKQotCSAgICAgIGFzX3dhcm4gKF8oImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIiksIG5hbWUpOwotLyoJICAgIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMTIzNDUpOyovCi0JICAgIC8qIFdpbGwgbmVlZCByZWxvY2F0aW5nICovCi0JICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQkgICAgY2xlYXJfZnVuY3Rpb24gKCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIENfQVVUT0FSRwotICAgIGNhc2UgQ19BVVRPQVJHOgotI2VuZGlmIC8qIENfQVVUT0FSRyAqLwotICAgIGNhc2UgQ19BVVRPOgotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX0FSRzoKLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PRToKLSAgICBjYXNlIENfTU9VOgotICAgIGNhc2UgQ19FT1M6Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBURV9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgY2FzZSBDX1NUQVQ6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgLyogVmFsaWQgYnV0IHNldCBzb21ld2hlcmUgZWxzZSAoc19jb21tLCBzX2xjb21tLCBjb2xvbikgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICBjYXNlIENfVVNUQVRJQzoKLSAgICBjYXNlIENfRVhUREVGOgotICAgIGNhc2UgQ19VTEFCRUw6Ci0gICAgICBhc193YXJuIChfKCJ1bmV4cGVjdGVkIHN0b3JhZ2UgY2xhc3MgJWQiKSwKLQkgICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICAgICAgYnJlYWs7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gc3RvcmFnZSBjbGFzcyAqLwotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYnVpbHQgYSBkZWJ1ZyBzeW1ib2wsIHRyeSB0byBmaW5kIGlmIHdlIHNob3VsZAotICAgICBtZXJnZSB3aXRoIGFuIGV4aXN0aW5nIHN5bWJvbCBvciBub3QuICBJZiBhIHN5bWJvbCBpcyBDX0VGQ04gb3IKLSAgICAgU0VHX0FCU09MVVRFIG9yIHVudGFnZ2VkIFNFR19ERUJVRyBpdCBuZXZlciBtZXJnZXMuICovCi0KLSAgLyogVHdvIGNhc2VzIGZvciBmdW5jdGlvbnMuICBFaXRoZXIgZGVidWcgZm9sbG93ZWQgYnkgZGVmaW5pdGlvbiBvcgotICAgICBkZWZpbml0aW9uIGZvbGxvd2VkIGJ5IGRlYnVnLiAgRm9yIGRlZmluaXRpb24gZmlyc3QsIHdlIHdpbGwKLSAgICAgbWVyZ2UgdGhlIGRlYnVnIHN5bWJvbCBpbnRvIHRoZSBkZWZpbml0aW9uLiAgRm9yIGRlYnVnIGZpcnN0LCB0aGUKLSAgICAgbGluZW5vIGVudHJ5IE1VU1QgcG9pbnQgdG8gdGhlIGRlZmluaXRpb24gZnVuY3Rpb24gb3IgZWxzZSBpdAotICAgICB3aWxsIHBvaW50IG9mZiBpbnRvIHNwYWNlIHdoZW4gb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpIG1lcmdlcwotICAgICB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIHJlYWwgc3ltYm9sLiAgVGhlcmVmb3IsIGxldCdzIHByZXN1bWUKLSAgICAgdGhlIGRlYnVnIHN5bWJvbCBpcyBhIHJlYWwgZnVuY3Rpb24gcmVmZXJlbmNlLiAqLwotCi0gIC8qIEZJWE1FLVNPT04gSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBkZWZpbml0aW9uIGxhYmVsL3N5bWJvbCBpcwotICAgICBuZXZlciBzZWVuLCB0aGlzIHdpbGwgcHJvYmFibHkgbGVhdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCBhdCBsaW5rCi0gICAgIHRpbWUuICovCi0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfRUZDTgotICAgICAgfHwgKCFzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCSBTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSksCi0JCSAgICIqREVCVUcqIikKLQkgICYmICFTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IGFic29sdXRlX3NlY3Rpb24KLSAgICAgIHx8IChzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIERPX05PVF9TVFJJUCkpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gc3ltYm9sX2xhc3RQKQotCXN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwKLQkJICAgICAgICZzeW1ib2xfbGFzdFApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCBtZXJnZSB0aGUgbmV3bHkgY3JlYXRlZCBzeW1ib2wKLQkgaW50byB0aGUgb2xkIG9uZS4gIFRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIGxpbmtlciBjYW4KLQkgaGFuZGxlIGR1cGxpY2F0ZSBzeW1ib2xzIGNvcnJlY3RseS4gQnV0IEkgZ3Vlc3MgdGhhdCBpdCBzYXZlCi0JIGEgKmxvdCogb2Ygc3BhY2UgaWYgdGhlIGFzc2VtYmx5IGZpbGUgZGVmaW5lcyBhIGxvdCBvZgotCSBzeW1ib2xzLiBbbG9pY10gKi8KLQotICAgICAgLyogVGhlIGRlYnVnIGVudHJ5IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSBpcyBtZXJnZWQgaW50byB0aGUKLQkgcHJldmlvdXMgZGVmaW5pdGlvbi4gKi8KLQotICAgICAgY19zeW1ib2xfbWVyZ2UgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbFApOwotICAgICAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xQOwotCi0gICAgICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCSAgfHwgU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfU1RBVCkKLQl7Ci0JICAvKiBGb3IgZnVuY3Rpb25zLCBhbmQgdGFncywgYW5kIHN0YXRpYyBzeW1ib2xzLCB0aGUgc3ltYm9sCi0JICAgICAqbXVzdCogYmUgd2hlcmUgdGhlIGRlYnVnIHN5bWJvbCBhcHBlYXJzLiAgTW92ZSB0aGUKLQkgICAgIGV4aXN0aW5nIHN5bWJvbCB0byB0aGUgY3VycmVudCBwbGFjZS4gKi8KLQkgIC8qIElmIGl0IGFscmVhZHkgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QsIGRvIG5vdGhpbmcgKi8KLQkgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IHN5bWJvbF9sYXN0UCkKLQkgICAgewotCSAgICAgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpvbGR0YWc7Ci0KLSAgICAgIG9sZHRhZyA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotCQkJCSBET19OT1RfU1RSSVApOwotICAgICAgaWYgKG9sZHRhZyA9PSBOVUxMIHx8ICEgU0ZfR0VUX1RBRyAob2xkdGFnKSkKLQl0YWdfaW5zZXJ0IChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgIH0KLQotICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBrbm93IChzaXplb2YgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIDw9IHNpemVvZiAobG9uZykpOwotICAgICAgc2V0X2Z1bmN0aW9uIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotICAgICAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGF0IGlzLCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhlCi0JICAgICBmdW5jdGlvbi4uLiAqLwotCSAgc3ltYm9sX3RhYmxlX2luc2VydCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JfSAvKiBkZWZpbml0aW9uIGZvbGxvd3MgZGVidWcgKi8KLSAgICB9IC8qIENyZWF0ZSB0aGUgbGluZSBudW1iZXIgZW50cnkgcG9pbnRpbmcgdG8gdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQgKi8KLQotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gTlVMTDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RpbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgZGltX2luZGV4OwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0KLSAgZm9yIChkaW1faW5kZXggPSAwOyBkaW1faW5kZXggPCBESU1OVU07IGRpbV9pbmRleCsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0gICAgICBTQV9TRVRfU1lNX0RJTUVOIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBkaW1faW5kZXgsCi0JCQlnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX3dhcm4gKF8oImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIikpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQljYXNlICdcbic6Ci0JY2FzZSAnOyc6Ci0JICBkaW1faW5kZXggPSBESU1OVU07Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCB0aGlzX2Jhc2U7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSBzdGFicy1zdHlsZSBsaW5lPyAgKi8KLSAgICAgIG9ial9jb2ZmX2xuICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19iYXNlID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICghc3RyY21wICgiLmJmIiwgU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpKQotICAgIGNvZmZfbGluZV9iYXNlID0gdGhpc19iYXNlOwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGNvZmZfbGluZV9iYXNlKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKHN0cmNtcCAoIi5iZiIsIFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSA9PSAwKQotICAgIHsKLSAgICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLQotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgY29mZl9saW5lX2Jhc2UpOwotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX1NJWkUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnN5bWJvbF9uYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLQotICAvKiBBc3N1bWUgdGhhdCB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IC50YWcgaXMgYWx3YXlzIGRlZmluZWQuCi0gICAgIFRoaXMgd2FzIGEgYmFkIGFzc3VtcHRpb24uICBJJ3ZlIGFkZGVkIGZpbmRfb3JfbWFrZS4geG94b3JpY2guICovCi0gIFNBX1NFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLAotCQkgICAgIHRhZ19maW5kX29yX21ha2UgKHN5bWJvbF9uYW1lKSk7Ci0gIGlmIChTQV9HRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gMEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygidGFnIG5vdCBmb3VuZCBmb3IgLnRhZyAlcyIpLCBzeW1ib2xfbmFtZSk7Ci0gICAgfQkJCQkvKiBub3QgZGVmaW5lZCAqLwotCi0gIFNGX1NFVF9UQUdHRUQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3R5cGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoSVNGQ04gKFNfR0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpICYmCi0gICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBDX1RQREVGKQotICAgIHsKLSAgICAgIFNGX1NFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQkJCQkvKiBpcyBhIGZ1bmN0aW9uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2hhciBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLSAgICAgIGlmICghc3RyY21wIChzeW1ib2xfbmFtZSwgIi4iKSkKLQl7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGZyYWdfbm93KTsKLQkgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgLyogSWYgdGhlIC52YWwgaXMgIT0gZnJvbSB0aGUgLmRlZiAoZS5nLiBzdGF0aWNzKSAqLwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIHN5bWJvbF9uYW1lKSkKLQl7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0JICBleHAuWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpOwotCSAgZXhwLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotCSAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmZXhwKTsKLQotCSAgLyogSWYgdGhlIHNlZ21lbnQgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZvcndhcmQgcmVmZXJlbmNlIGlzCi0JICAgICByZXNvbHZlZCwgdGhlbiBjb3B5IHRoZSBzZWdtZW50IGlkIGZyb20gdGhlIGZvcndhcmQKLQkgICAgIHN5bWJvbC4gICovCi0JICBTRl9TRVRfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCX0KLSAgICAgIC8qIE90aGVyd2lzZSwgaXQgaXMgdGhlIG5hbWUgb2YgYSBub24gZGVidWcgc3ltYm9sIGFuZCBpdHMgdmFsdWUgd2lsbCBiZSBjYWxjdWxhdGVkIGxhdGVyLiAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gICAgfQkJCQkvKiBpZiBzeW1ib2wgYmFzZWQgKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1jb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSAgLyogVGhlc2UgaGFkIGJldHRlciBiZSB0aGUgc2FtZS4gIFVzdWFsbHkgMTggYnl0ZXMuICovCi0jaWZuZGVmIEJGRF9IRUFERVJTCi0gIGtub3cgKHNpemVvZiAoU1lNRU5UKSA9PSBzaXplb2YgKEFVWEVOVCkpOwotICBrbm93IChTWU1FU1ogPT0gQVVYRVNaKTsKLSNlbmRpZgotICB0YWdfaW5pdCAoKTsKLX0KLQotCi1zeW1ib2xTICpjb2ZmX2xhc3RfZnVuY3Rpb247Ci1zdGF0aWMgc3ltYm9sUyAqY29mZl9sYXN0X2JmOwotCi12b2lkCi1jb2ZmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgKnB1bnQ7Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpsYXN0X3RhZ1A7Ci0gIHN0YXRpYyBzdGFjayAqYmxvY2tfc3RhY2s7Ci0gIHN0YXRpYyBzeW1ib2xTICpzZXRfZW5kOwotICBzeW1ib2xTICpuZXh0X3NldF9lbmQgPSBOVUxMOwotCi0gIGlmIChzeW1wID09ICZhYnNfc3ltYm9sKQotICAgIHsKLSAgICAgICpwdW50ID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cnJlbnRfbGluZW5vX3N5bSkKLSAgICBjb2ZmX2FkZF9saW5lc3ltICgoc3ltYm9sUyAqKSAwKTsKLQotICBpZiAoIWJsb2NrX3N0YWNrKQotICAgIGJsb2NrX3N0YWNrID0gc3RhY2tfaW5pdCAoNTEyLCBzaXplb2YgKHN5bWJvbFMqKSk7Ci0KLSAgaWYgKFNfSVNfV0VBSyAoc3ltcCkpCi0gICAgewotI2lmZGVmIFRFX1BFCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX05UX1dFQUspOwotI2Vsc2UKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfV0VBS0VYVCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQgKHN5bXApCi0gICAgICAmJiAhU19JU19XRUFLIChzeW1wKQotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgIT0gQ19TVEFUKQotICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfRVhUKTsKLQotICBpZiAoIVNGX0dFVF9ERUJVRyAoc3ltcCkpCi0gICAgewotICAgICAgc3ltYm9sUyAqcmVhbDsKLSAgICAgIGlmICghU0ZfR0VUX0xPQ0FMIChzeW1wKQotCSAgJiYgIVNGX0dFVF9TVEFUSUNTIChzeW1wKQotCSAgJiYgKHJlYWwgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChzeW1wKSwgRE9fTk9UX1NUUklQKSkKLQkgICYmIHJlYWwgIT0gc3ltcCkKLQl7Ci0JICBjX3N5bWJvbF9tZXJnZSAoc3ltcCwgcmVhbCk7Ci0JICAqcHVudCA9IDE7Ci0JfQotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKHN5bXApICYmICFTRl9HRVRfTE9DQUwgKHN5bXApKQotCXsKLQkgIGFzc2VydCAoU19HRVRfVkFMVUUgKHN5bXApID09IDApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bXApOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltcCkgPT0gdGV4dF9zZWN0aW9uCi0JICAgICAgJiYgc3ltcCAhPSBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+c3ltKQotCSAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0xBQkVMKTsKLQkgIGVsc2UKLQkgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19TVEFUKTsKLQl9Ci0gICAgICBpZiAoU0ZfR0VUX1BST0NFU1MgKHN5bXApKQotCXsKLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0JMT0NLKQotCSAgICB7Ci0JICAgICAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHN5bXApLCAiLmJiIikpCi0JCXN0YWNrX3B1c2ggKGJsb2NrX3N0YWNrLCAoY2hhciAqKSAmc3ltcCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltYm9sUyAqYmVnaW47Ci0JCSAgYmVnaW4gPSAqKHN5bWJvbFMgKiopIHN0YWNrX3BvcCAoYmxvY2tfc3RhY2spOwotCQkgIGlmIChiZWdpbiA9PSAwKQotCQkgICAgYXNfd2FybiAoXygibWlzbWF0Y2hlZCAuZWIiKSk7Ci0JCSAgZWxzZQotCQkgICAgbmV4dF9zZXRfZW5kID0gYmVnaW47Ci0JCX0KLQkgICAgfQotCSAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwICYmIFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCi0JICAgIHsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eHA7Ci0JICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gc3ltcDsKLQkgICAgICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltcCkgPCAxKQotCQlTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1wLCAxKTsKLQkgICAgICBhdXhwID0KLQkJJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPm5hdGl2ZVsxXS51LmF1eGVudDsKLQkgICAgICBtZW1zZXQgKGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4sIDAsCi0JCSAgICAgIHNpemVvZiAoYXV4cC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbikpOwotCSAgICB9Ci0JICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19FRkNOKQotCSAgICB7Ci0JICAgICAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwKQotCQlhc19mYXRhbCAoXygiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiKSk7Ci0JICAgICAgU0FfU0VUX1NZTV9GU0laRSAoY29mZl9sYXN0X2Z1bmN0aW9uLAotCQkJCShsb25nKSAoU19HRVRfVkFMVUUgKHN5bXApCi0JCQkJCS0gU19HRVRfVkFMVUUgKGNvZmZfbGFzdF9mdW5jdGlvbikpKTsKLQkgICAgICBuZXh0X3NldF9lbmQgPSBjb2ZmX2xhc3RfZnVuY3Rpb247Ci0JICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKLQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0VYVCk7Ci0gICAgICBlbHNlIGlmIChTRl9HRVRfTE9DQUwgKHN5bXApKQotCSpwdW50ID0gMTsKLQotICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCi0Jc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLSAgICAgIC8qIG1vcmUgLi4uICovCi0gICAgfQotCi0gIGlmIChTRl9HRVRfVEFHIChzeW1wKSkKLSAgICBsYXN0X3RhZ1AgPSBzeW1wOwotICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0VPUykKLSAgICBuZXh0X3NldF9lbmQgPSBsYXN0X3RhZ1A7Ci0KLSNpZmRlZiBPQkpfWENPRkYKLSAgLyogVGhpcyBpcyBwcmV0dHkgaG9ycmlibGUsIGJ1dCB3ZSBoYXZlIHRvIHNldCAqcHVudCBjb3JyZWN0bHkgaW4KLSAgICAgb3JkZXIgdG8gY2FsbCBTQV9TRVRfU1lNX0VORE5EWCBjb3JyZWN0bHkuICAqLwotICBpZiAoISBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzeW1wKQotICAgICAgJiYgKChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0JICB8fCAoISBTX0lTX0VYVEVSTkFMIChzeW1wKQotCSAgICAgICYmICEgc3ltYm9sX2dldF90YyAoc3ltcCktPm91dHB1dAotCSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApICE9IENfRklMRSkpKQotICAgICpwdW50ID0gMTsKLSNlbmRpZgotCi0gIGlmIChzZXRfZW5kICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICEgKnB1bnQKLSAgICAgICYmICgoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSAhPSAwCi0JICB8fCAoU19JU19ERUZJTkVEIChzeW1wKQotCSAgICAgICYmICEgU19JU19DT01NT04gKHN5bXApCi0JICAgICAgJiYgKCEgU19JU19FWFRFUk5BTCAoc3ltcCkgfHwgU0ZfR0VUX0ZVTkNUSU9OIChzeW1wKSkpKSkKLSAgICB7Ci0gICAgICBTQV9TRVRfU1lNX0VORE5EWCAoc2V0X2VuZCwgc3ltcCk7Ci0gICAgICBzZXRfZW5kID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG5leHRfc2V0X2VuZCAhPSBOVUxMCi0gICAgICAmJiAhICpwdW50KQotICAgIHNldF9lbmQgPSBuZXh0X3NldF9lbmQ7Ci0KLSAgaWYgKCEgKnB1bnQKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfRkNOCi0gICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKHN5bXApLCAiLmJmIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoY29mZl9sYXN0X2JmICE9IE5VTEwpCi0JU0FfU0VUX1NZTV9FTkRORFggKGNvZmZfbGFzdF9iZiwgc3ltcCk7Ci0gICAgICBjb2ZmX2xhc3RfYmYgPSBzeW1wOwotICAgIH0KLQotICBpZiAoY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApKS0+bGluZW5vKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgc3RydWN0IGxpbmVfbm8gKmxwdHI7Ci0gICAgICBhbGVudCAqbDsKLQotICAgICAgbHB0ciA9IChzdHJ1Y3QgbGluZV9ubyAqKSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCkpLT5saW5lbm87Ci0gICAgICBmb3IgKGkgPSAwOyBscHRyOyBscHRyID0gbHB0ci0+bmV4dCkKLQlpKys7Ci0gICAgICBscHRyID0gKHN0cnVjdCBsaW5lX25vICopIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPmxpbmVubzsKLQotICAgICAgLyogV2UgbmVlZCBpIGVudHJpZXMgZm9yIGxpbmUgbnVtYmVycywgcGx1cyAxIGZvciB0aGUgZmlyc3QKLQkgZW50cnkgd2hpY2ggQkZEIHdpbGwgb3ZlcnJpZGUsIHBsdXMgMSBmb3IgdGhlIGxhc3QgemVybwotCSBlbnRyeSAoYSBtYXJrZXIgZm9yIEJGRCkuICAqLwotICAgICAgbCA9IChhbGVudCAqKSB4bWFsbG9jICgoaSArIDIpICogc2l6ZW9mIChhbGVudCkpOwotICAgICAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApKS0+bGluZW5vID0gbDsKLSAgICAgIGxbaSArIDFdLmxpbmVfbnVtYmVyID0gMDsKLSAgICAgIGxbaSArIDFdLnUuc3ltID0gTlVMTDsKLSAgICAgIGZvciAoOyBpID4gMDsgaS0tKQotCXsKLQkgIGlmIChscHRyLT5mcmFnKQotCSAgICBscHRyLT5sLnUub2Zmc2V0ICs9IGxwdHItPmZyYWctPmZyX2FkZHJlc3M7Ci0JICBsW2ldID0gbHB0ci0+bDsKLQkgIGxwdHIgPSBscHRyLT5uZXh0OwotCX0KLSAgICB9Ci19Ci0KLXZvaWQKLWNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyAoYWJmZCwgc2VjLCB4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4OwotewotICBzeW1ib2xTICpzZWNzeW07Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGludCBubG5ubywgbnJlbG9jcyA9IDA7Ci0KLSAgLyogUlMvNjAwMCBnYXMgY3JlYXRlcyBhIC5kZWJ1ZyBzZWN0aW9uIG1hbnVhbGx5IGluIHBwY19mcm9iX2ZpbGUgaW4KLSAgICAgdGMtcHBjLmMuICBEbyBub3QgZ2V0IGNvbmZ1c2VkIGJ5IGl0LiAgKi8KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCFzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikpCi0gICAgbmxubm8gPSBjb2ZmX25fbGluZV9ub3M7Ci0gIGVsc2UKLSAgICBubG5ubyA9IDA7Ci0gIHsKLSAgICAvKiBAQCBIb3BlIHRoYXQgbm9uZSBvZiB0aGUgZml4dXBzIGV4cGFuZCB0byBtb3JlIHRoYW4gb25lIHJlbG9jCi0gICAgICAgZW50cnkuLi4gICovCi0gICAgZml4UyAqZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OwotICAgIHdoaWxlIChmaXhwKQotICAgICAgewotCWlmICghIGZpeHAtPmZ4X2RvbmUpCi0JICBucmVsb2NzKys7Ci0JZml4cCA9IGZpeHAtPmZ4X25leHQ7Ci0gICAgICB9Ci0gIH0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSA9PSAwCi0gICAgICAmJiBucmVsb2NzID09IDAKLSAgICAgICYmIG5sbm5vID09IDAKLSAgICAgICYmIHNlYyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICYmIHNlYyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICYmIHNlYyAhPSBic3Nfc2VjdGlvbikKLSAgICByZXR1cm47Ci0gIHNlY3N5bSA9IHNlY3Rpb25fc3ltYm9sIChzZWMpOwotICBTQV9TRVRfU0NOX05SRUxPQyAoc2Vjc3ltLCBucmVsb2NzKTsKLSAgU0FfU0VUX1NDTl9OTElOTk8gKHNlY3N5bSwgbmxubm8pOwotfQotCi12b2lkCi1jb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLXsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcywgKGNoYXIqKSAwKTsKLX0KLQotLyoKLSAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgotICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQotICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcwotICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbwotICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKLSAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAotICoJCQkJCQkgJ3InIGZvciByZWFkLW9ubHkgZGF0YQotICogQnV0IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLCB0cmVhdCBpdCBhcyBhCi0gKiBzdWJzZWdtZW50IG51bWJlci4KLSAqLwotCi12b2lkCi1vYmpfY29mZl9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCi0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciB0eXBlOwotCi0gICAgICBzX21yaV9zZWN0ICgmdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBleHAgPSAwOwotICBmbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCWNhc2UgJ2InOiBmbGFncyB8PSBTRUNfQUxMT0M7IGZsYWdzICY9fiBTRUNfTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ24nOiBmbGFncyAmPX4gU0VDX0xPQUQ7IGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAndyc6IGZsYWdzIHw9IFNFQ19EQVRBOyBmbGFncyAmPX4gU0VDX1JFQURPTkxZOyBicmVhazsKLQkJY2FzZSAneCc6IGZsYWdzIHw9IFNFQ19DT0RFOyBicmVhazsKLQkJY2FzZSAncic6IGZsYWdzIHw9IFNFQ19SRUFET05MWTsgYnJlYWs7Ci0KLQkJY2FzZSAnaSc6IC8qIFNUWVBfSU5GTyAqLwotCQljYXNlICdsJzogLyogU1RZUF9MSUIgKi8KLQkJY2FzZSAnbyc6IC8qIFNUWVBfT1ZFUiAqLwotCQkgIGFzX3dhcm4gKF8oInVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAgICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfd2FybihfKCJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgfQotCi0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIChzdWJzZWdUKSBleHApOwotCi0gIGlmIChmbGFncyAhPSBTRUNfTk9fRkxBR1MpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb2xkZmxhZ3M7Ci0KLSAgICAgIG9sZGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYyk7Ci0gICAgICBvbGRmbGFncyAmPSBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUzsKLSAgICAgIGZsYWdzIHw9IG9sZGZsYWdzOwotCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncykpCi0JYXNfd2FybiAoXygiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIlc1wiOiAlcyIpLAotCQkgYmZkX3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBzZWMpLAotCQkgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1jb2ZmX2FkanVzdF9zeW10YWIgKCkKLXsKLSAgaWYgKHN5bWJvbF9yb290UCA9PSBOVUxMCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xfcm9vdFApICE9IENfRklMRSkKLSAgICBjX2RvdF9maWxlX3N5bWJvbCAoImZha2UiKTsKLX0KLQotdm9pZAotY29mZl9mcm9iX3NlY3Rpb24gKHNlYykKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIHNlZ1Qgc3Ryc2VjOwotICBjaGFyICpwOwotICBmcmFnUyAqZnJhZ3A7Ci0gIGJmZF92bWEgc2l6ZSwgbl9lbnRyaWVzLCBtYXNrOwotCi0gIC8qIFRoZSBDT0ZGIGJhY2sgZW5kIGluIEJGRCByZXF1aXJlcyB0aGF0IGFsbCBzZWN0aW9uIHNpemVzIGJlCi0gICAgIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlY3Rpb24gYWxpZ25tZW50cy4KLSAgICAgU2VlbXMga2luZGEgc2lsbHkgdG8gbWUsIGJ1dCB0aGF0J3MgdGhlIHdheSBpdCBpcy4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYyk7Ci0gIG1hc2sgPSAoKGJmZF92bWEpIDEgPDwgKGJmZF92bWEpIHNlYy0+YWxpZ25tZW50X3Bvd2VyKSAtIDE7Ci0gIGlmIChzaXplICYgbWFzaykKLSAgICB7Ci0gICAgICBzaXplID0gKHNpemUgKyBtYXNrKSAmIH5tYXNrOwotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjLCBzaXplKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gc2l6ZSBpcyBub24temVybywgdGhlIHNlY3Rpb24gc3ltYm9sIG5lZWRzIGFuIGF1eAotICAgICBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQsIGluZGljYXRpbmcgdGhlIHNpemUuICBXZSBkb24ndCBrbm93Ci0gICAgIGFsbCB0aGUgdmFsdWVzIHlldDsgY29mZl9mcm9iX3N5bWJvbCB3aWxsIGZpbGwgdGhlbSBpbiBsYXRlci4gICovCi0gIGlmIChzaXplICE9IDAKLSAgICAgIHx8IHNlYyA9PSB0ZXh0X3NlY3Rpb24KLSAgICAgIHx8IHNlYyA9PSBkYXRhX3NlY3Rpb24KLSAgICAgIHx8IHNlYyA9PSBic3Nfc2VjdGlvbikKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzZWNzeW0gPSBzZWN0aW9uX3N5bWJvbCAoc2VjKTsKLQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc2Vjc3ltLCBDX1NUQVQpOwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc2Vjc3ltLCAxKTsKLSAgICAgIFNGX1NFVF9TVEFUSUNTIChzZWNzeW0pOwotICAgICAgU0FfU0VUX1NDTl9TQ05MRU4gKHNlY3N5bSwgc2l6ZSk7Ci0gICAgfQotCi0gIC8qIEBAIHRoZXNlIHNob3VsZCBiZSBpbiBhICJzdGFicy5oIiBmaWxlLCBvciBtYXliZSBhcy5oICovCi0jaWZuZGVmIFNUQUJfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIuc3RhYiIKLSNlbmRpZgotI2lmbmRlZiBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FICIuc3RhYnN0ciIKLSNlbmRpZgotICBpZiAoc3RyY21wIChTVEFCX1NUUklOR19TRUNUSU9OX05BTUUsIHNlYy0+bmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnNlYyA9IHNlYzsKLSAgc2VjID0gc3Vic2VnX2dldCAoU1RBQl9TRUNUSU9OX05BTUUsIDApOwotICAvKiBzaXplIGlzIGFscmVhZHkgcm91bmRlZCB1cCwgc2luY2Ugb3RoZXIgc2VjdGlvbiB3aWxsIGJlIGxpc3RlZCBmaXJzdCAqLwotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzdHJzZWMpOwotCi0gIG5fZW50cmllcyA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSAvIDEyIC0gMTsKLQotICAvKiBGaW5kIGZpcnN0IG5vbi1lbXB0eSBmcmFnLiAgSXQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaC4gICovCi0gIGZyYWdwID0gc2VnX2luZm8gKHNlYyktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHdoaWxlIChmcmFncCAmJiBmcmFncC0+ZnJfZml4ID09IDApCi0gICAgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dDsKLSAgYXNzZXJ0IChmcmFncCAhPSAwICYmIGZyYWdwLT5mcl9maXggPj0gMTIpOwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZXMuICAqLwotICBwID0gZnJhZ3AtPmZyX2xpdGVyYWw7Ci0gIGJmZF9oX3B1dF8xNiAoc3Rkb3V0cHV0LCBuX2VudHJpZXMsIChiZmRfYnl0ZSAqKSBwICsgNik7Ci0gIGJmZF9oX3B1dF8zMiAoc3Rkb3V0cHV0LCBzaXplLCAoYmZkX2J5dGUgKikgcCArIDgpOwotfQotCi12b2lkCi1vYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3RhYnN0cl9uYW1lOwotICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoaXMgZmlyc3Qgc3ltYm9sLiAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIC8qIFplcm8gaXQgb3V0LiAqLwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdGFic3RyX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VnLT5uYW1lKSArIDQpOwotICBzdHJjcHkgKHN0YWJzdHJfbmFtZSwgc2VnLT5uYW1lKTsKLSAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKLSAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKLSAga25vdyAoc3Ryb2ZmID09IDEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotLyogZm9yIGRlYnVnZ2luZyAqLwotY29uc3QgY2hhciAqCi1zX2dldF9uYW1lIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gKChzID09IE5VTEwpID8gIihOVUxMKSIgOiBTX0dFVF9OQU1FIChzKSk7Ci19Ci0KLXZvaWQKLXN5bWJvbF9kdW1wICgpCi17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIHByaW50ZihfKCIweCVseDogXCIlc1wiIHR5cGUgPSAlbGQsIGNsYXNzID0gJWQsIHNlZ21lbnQgPSAlZFxuIiksCi0JICAgICAodW5zaWduZWQgbG9uZykgc3ltYm9sUCwKLQkgICAgIFNfR0VUX05BTUUoc3ltYm9sUCksCi0JICAgICAobG9uZykgU19HRVRfREFUQV9UWVBFKHN5bWJvbFApLAotCSAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQKSwKLQkgICAgIChpbnQpIFNfR0VUX1NFR01FTlQoc3ltYm9sUCkpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0KLSNlbHNlIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLSNpbmNsdWRlICJmcmFncy5oIgotLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBpbmNsdWRlIGludGVybmFsIGJmZCB0aGluZ3MuICovCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jaWZkZWYgVEVfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotLyogVGhlIE5PUF9PUENPREUgaXMgZm9yIHRoZSBhbGlnbm1lbnQgZmlsbCB2YWx1ZS4gIEZpbGwgd2l0aCBub3Agc28KLSAgIHRoYXQgd2UgY2FuIHN0aWNrIHNlY3Rpb25zIHRvZ2V0aGVyIHdpdGhvdXQgY2F1c2luZyB0cm91YmxlLiAgKi8KLSNpZm5kZWYgTk9QX09QQ09ERQotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDAKLSNlbmRpZgotCi0vKiBUaGUgemVyb2VzIGlmIHN5bWJvbCBuYW1lIGlzIGxvbmdlciB0aGFuIDggY2hhcnMgKi8KLSNkZWZpbmUgU19TRVRfWkVST0VTKHMsdikJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl96ZXJvZXMgPSAodikpCi0KLSNkZWZpbmUgTUlOKGEsYikgKChhKSA8IChiKT8gKGEpIDogKGIpKQotLyogVGhpcyB2ZWN0b3IgaXMgdXNlZCB0byB0dXJuIGFuIGludGVybmFsIHNlZ21lbnQgaW50byBhIHNlY3Rpb24gIwotICAgc3VpdGFibGUgZm9yIGluc2VydGlvbiBpbnRvIGEgY29mZiBzeW1ib2wgdGFibGUKLSAqLwotCi1jb25zdCBzaG9ydCBzZWdfTl9UWVBFW10gPQotewkJCQkvKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KLSAgQ19BQlNfU0VDVElPTiwKLSAgMSwgICAgMiwgIDMsICAgNCwgICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsCi0gIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLAotICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwKLSAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsCi0gIENfVU5ERUZfU0VDVElPTiwJCS8qIFNFR19VTktOT1dOICovCi0gIENfVU5ERUZfU0VDVElPTiwJCS8qIFNFR19HT09GICovCi0gIENfVU5ERUZfU0VDVElPTiwJCS8qIFNFR19FWFBSICovCi0gIENfREVCVUdfU0VDVElPTiwJCS8qIFNFR19ERUJVRyAqLwotICBDX05UVl9TRUNUSU9OLAkJLyogU0VHX05UViAqLwotICBDX1BUVl9TRUNUSU9OLAkJLyogU0VHX1BUViAqLwotICBDX1JFR0lTVEVSX1NFQ1RJT04sCQkvKiBTRUdfUkVHSVNURVIgKi8KLX07Ci0KLWludCBmdW5jdGlvbl9saW5lb2ZmID0gLTE7CS8qIE9mZnNldCBpbiBsaW5lI3Mgd2hlcmUgdGhlIGxhc3QgZnVuY3Rpb24KLQkJCQkgICBzdGFydGVkICh0aGUgb2RkIGVudHJ5IGZvciBsaW5lICMwKSAqLwotCi0vKiBzdHJ1Y3R1cmUgdXNlZCB0byBrZWVwIHRoZSBmaWxlbmFtZXMgd2hpY2gKLSAgIGFyZSB0b28gbG9uZyBhcm91bmQgc28gdGhhdCB3ZSBjYW4gc3RpY2sgdGhlbQotICAgaW50byB0aGUgc3RyaW5nIHRhYmxlICovCi1zdHJ1Y3QgZmlsZW5hbWVfbGlzdCAKLXsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpuZXh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmaWxlbmFtZV9saXN0X2hlYWQ7Ci1zdGF0aWMgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3RfdGFpbDsKLQotc3RhdGljIHN5bWJvbFMgKmxhc3RfbGluZV9zeW1ib2w7Ci0KLS8qIEFkZCA0IHRvIHRoZSByZWFsIHZhbHVlIHRvIGdldCB0aGUgaW5kZXggYW5kIGNvbXBlbnNhdGUgdGhlCi0gICBuZWdhdGl2ZXMuIFRoaXMgdmVjdG9yIGlzIHVzZWQgYnkgU19HRVRfU0VHTUVOVCB0byB0dXJuIGEgY29mZgotICAgc2VjdGlvbiBudW1iZXIgaW50byBhIHNlZ21lbnQgbnVtYmVyCi0qLwotc3RhdGljIHN5bWJvbFMgKnByZXZpb3VzX2ZpbGVfc3ltYm9sOwotdm9pZCBjX3N5bWJvbF9tZXJnZSAoKTsKLXN0YXRpYyBpbnQgbGluZV9iYXNlOwotCi1zeW1ib2xTICpjX3NlY3Rpb25fc3ltYm9sICgpOwotYmZkICphYmZkOwotCi1zdGF0aWMgdm9pZCBmaXh1cF9zZWdtZW50IFBBUkFNUyAoKHNlZ21lbnRfaW5mb190eXBlICpzZWdQLAotCQkJCSAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGUpKTsKLQotCi1zdGF0aWMgdm9pZCBmaXh1cF9tZGVwcyBQQVJBTVMgKChmcmFnUyAqLAotCQkJCSBvYmplY3RfaGVhZGVycyAqLAotCQkJCSBzZWdUKSk7Ci0KLQotc3RhdGljIHZvaWQgZmlsbF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqIGFiZmQsCi0JCQkJICBvYmplY3RfaGVhZGVycyAqLAotCQkJCSAgdW5zaWduZWQgbG9uZyAqKSk7Ci0KLQotc3RhdGljIGludCBjX2xpbmVfbmV3IFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2wsIGxvbmcgcGFkZHIsCi0JCQkgICAgICAgaW50IGxpbmVfbnVtYmVyLAotCQkJICAgICAgIGZyYWdTICogZnJhZykpOwotCi0KLXN0YXRpYyB2b2lkIHdfc3ltYm9scyBQQVJBTVMgKChiZmQgKiBhYmZkLCBjaGFyICp3aGVyZSwKLQkJCSAgICAgICBzeW1ib2xTICogc3ltYm9sX3Jvb3RQKSk7Ci0KLXN0YXRpYyB2b2lkIGFkanVzdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoYmZkICphYmZkLCBzZWdUIHNlZykpOwotCi1zdGF0aWMgdm9pZCBvYmpfY29mZl9sY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX3RleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9kYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfaWRlbnQgUEFSQU1TICgoaW50KSk7Ci12b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFNlY3Rpb24gc3R1ZmYKLQotICAgV2UgYWxsb3cgbW9yZSB0aGFuIGp1c3QgdGhlIHN0YW5kYXJkIDMgc2VjdGlvbnMsIGluZmFjdCwgd2UgYWxsb3cKLSAgIDQwIHNlY3Rpb25zLCAodGhvdWdoIHRoZSB1c3VhbCB0aHJlZSBoYXZlIHRvIGJlIHRoZXJlKS4KLQotICAgVGhpcyBzdHJ1Y3R1cmUgcGVyZm9ybXMgdGhlIG1hcHBpbmdzIGZvciB1czoKLSovCi0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgc2VnVCBzZWdfdDsKLSAgaW50IGk7Ci19IHNlZ19pbmZvX3R5cGU7Ci0KLXN0YXRpYyBjb25zdCBzZWdfaW5mb190eXBlIHNlZ19pbmZvX29mZl9ieV80W10gPQotewotIHtTRUdfUFRWLCAgfSwKLSB7U0VHX05UViwgIH0sCi0ge1NFR19ERUJVRywgfSwKLSB7U0VHX0FCU09MVVRFLCAgfSwKLSB7U0VHX1VOS05PV04sCSB9LAotIHtTRUdfRTB9LCB7U0VHX0UxfSwge1NFR19FMn0sIHtTRUdfRTN9LCB7U0VHX0U0fSwKLSB7U0VHX0U1fSwge1NFR19FNn0sIHtTRUdfRTd9LCB7U0VHX0U4fSwge1NFR19FOX0sCi0ge1NFR19FMTB9LHtTRUdfRTExfSx7U0VHX0UxMn0se1NFR19FMTN9LHtTRUdfRTE0fSwKLSB7U0VHX0UxNX0se1NFR19FMTZ9LHtTRUdfRTE3fSx7U0VHX0UxOH0se1NFR19FMTl9LAotIHtTRUdfRTIwfSx7U0VHX0UyMX0se1NFR19FMjJ9LHtTRUdfRTIzfSx7U0VHX0UyNH0sCi0ge1NFR19FMjV9LHtTRUdfRTI2fSx7U0VHX0UyN30se1NFR19FMjh9LHtTRUdfRTI5fSwKLSB7U0VHX0UzMH0se1NFR19FMzF9LHtTRUdfRTMyfSx7U0VHX0UzM30se1NFR19FMzR9LAotIHtTRUdfRTM1fSx7U0VHX0UzNn0se1NFR19FMzd9LHtTRUdfRTM4fSx7U0VHX0UzOX0sCi0geyhzZWdUKTQwfSwKLSB7KHNlZ1QpNDF9LAotIHsoc2VnVCk0Mn0sCi0geyhzZWdUKTQzfSwKLSB7KHNlZ1QpNDR9LAotIHsoc2VnVCk0NX0sCi0geyhzZWdUKTB9LAotIHsoc2VnVCkwfSwKLSB7KHNlZ1QpMH0sCi0ge1NFR19SRUdJU1RFUn0KLX07Ci0KLQotCi0jZGVmaW5lIFNFR19JTkZPX0ZST01fU0VDVElPTl9OVU1CRVIoeCkgKHNlZ19pbmZvX29mZl9ieV80Wyh4KSs0XSkKLQotc3RhdGljIHJlbGF4X2FkZHJlc3NUCi1yZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQotICAgICByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwotICAgICBsb25nIGFsaWdubWVudDsKLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19Ci0KLQotc2VnVAotc19nZXRfc2VnbWVudCAoeCkKLSAgICAgc3ltYm9sUyAqIHg7Ci17Ci0gIHJldHVybiBTRUdfSU5GT19GUk9NX1NFQ1RJT05fTlVNQkVSICh4LT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0pLnNlZ190OwotfQotCi0vKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgY2hhaW4gYW5kIGZpbGwgaW4gdGhlIHNlY3Rpb24gaGVhZGVyCi0gICB0byBjb250YWluIGFsbCBvZiBpdCwgYWxzbyBmaWxsIGluIHRoZSBhZGRyIG9mIHRoZSBzZWN0aW9ucyAqLwotc3RhdGljIHVuc2lnbmVkIGludAotc2l6ZV9zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBpZHg7Ci17Ci0KLSAgdW5zaWduZWQgaW50IHNpemUgPSAwOwotICBmcmFnUyAqZnJhZyA9IHNlZ21lbnRfaW5mb1tpZHhdLmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHdoaWxlIChmcmFnKQotICAgIHsKLSAgICAgIHNpemUgPSBmcmFnLT5mcl9hZGRyZXNzOwotICAgICAgaWYgKGZyYWctPmZyX2FkZHJlc3MgIT0gc2l6ZSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIk91dCBvZiBzdGVwXG4iKSk7Ci0JICBzaXplID0gZnJhZy0+ZnJfYWRkcmVzczsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoZnJhZy0+ZnJfdHlwZSkKLQl7Ci0jaWZkZWYgVENfQ09GRl9TSVpFTUFDSERFUAotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBzaXplICs9IFRDX0NPRkZfU0laRU1BQ0hERVAgKGZyYWcpOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQljYXNlIHJzX3NwYWNlOgotCSAgYXNzZXJ0IChmcmFnLT5mcl9zeW1ib2wgPT0gMCk7Ci0JY2FzZSByc19maWxsOgotCWNhc2UgcnNfb3JnOgotCSAgc2l6ZSArPSBmcmFnLT5mcl9maXg7Ci0JICBzaXplICs9IGZyYWctPmZyX29mZnNldCAqIGZyYWctPmZyX3ZhcjsKLQkgIGJyZWFrOwotCWNhc2UgcnNfYWxpZ246Ci0JY2FzZSByc19hbGlnbl9jb2RlOgotCSAgewotCSAgICBhZGRyZXNzVCBvZmY7Ci0KLQkgICAgc2l6ZSArPSBmcmFnLT5mcl9maXg7Ci0JICAgIG9mZiA9IHJlbGF4X2FsaWduIChzaXplLCBmcmFnLT5mcl9vZmZzZXQpOwotCSAgICBpZiAoZnJhZy0+ZnJfc3VidHlwZSAhPSAwICYmIG9mZiA+IGZyYWctPmZyX3N1YnR5cGUpCi0JICAgICAgb2ZmID0gMDsKLQkgICAgc2l6ZSArPSBvZmY7Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKGZyYWctPmZyX3R5cGUpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0gICAgfQotICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19zaXplID0gc2l6ZTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KQotICAgICB1bnNpZ25lZCBpbnQgaWR4OwotewotICB1bnNpZ25lZCBpbnQgbnJlbG9jczsKLSAgZml4UyAqZml4dXBfcHRyOwotCi0gIC8qIENvdW50IHRoZSByZWxvY2F0aW9ucyAqLwotICBmaXh1cF9wdHIgPSBzZWdtZW50X2luZm9baWR4XS5maXhfcm9vdDsKLSAgbnJlbG9jcyA9IDA7Ci0gIHdoaWxlIChmaXh1cF9wdHIgIT0gKGZpeFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZml4dXBfcHRyLT5meF9kb25lID09IDAgJiYgVENfQ09VTlRfUkVMT0MgKGZpeHVwX3B0cikpCi0JewotI2lmZGVmIFRDX0EyOUsKLQkgIGlmIChmaXh1cF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ19DT05TVEgpCi0JICAgIG5yZWxvY3MgKz0gMjsKLQkgIGVsc2UKLQkgICAgbnJlbG9jcysrOwotI2Vsc2UKLQkgIG5yZWxvY3MrKzsKLSNlbmRpZgotCX0KLQotICAgICAgZml4dXBfcHRyID0gZml4dXBfcHRyLT5meF9uZXh0OwotICAgIH0KLSAgcmV0dXJuIG5yZWxvY3M7Ci19Ci0KLSNpZmRlZiBURV9BVVgKLQotc3RhdGljIGludCBjb21wYXJlX2V4dGVybmFsX3JlbG9jcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi0vKiBBVVgncyBsZCBleHBlY3RzIHJlbG9jYXRpb25zIHRvIGJlIHNvcnRlZCAqLwotc3RhdGljIGludAotY29tcGFyZV9leHRlcm5hbF9yZWxvY3MgKHgsIHkpCi0gICAgIGNvbnN0IFBUUiB4OwotICAgICBjb25zdCBQVFIgeTsKLXsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICphID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSB4OwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmIgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHk7Ci0gIGJmZF92bWEgYWFkciA9IGJmZF9nZXRiMzIgKGEtPnJfdmFkZHIpOwotICBiZmRfdm1hIGJhZHIgPSBiZmRfZ2V0YjMyIChiLT5yX3ZhZGRyKTsKLSAgcmV0dXJuIChhYWRyIDwgYmFkciA/IC0xIDogYmFkciA8IGFhZHIgPyAxIDogMCk7Ci19Ci0KLSNlbmRpZgotCi0vKiBvdXRwdXQgYWxsIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uICovCi12b2lkCi1kb19yZWxvY3NfZm9yIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotICAgICB1bnNpZ25lZCBsb25nICpmaWxlX2N1cnNvcjsKLXsKLSAgdW5zaWduZWQgaW50IG5yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIHVuc2lnbmVkIGxvbmcgcmVsb2Nfc3RhcnQgPSAqZmlsZV9jdXJzb3I7Ci0KLSAgZm9yIChpZHggPSBTRUdfRTA7IGlkeCA8IFNFR19MQVNUOyBpZHgrKykKLSAgICB7Ci0gICAgICBpZiAoc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9wdHI7Ci0JICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dGVybmFsX3JlbG9jX3ZlYzsKLQkgIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWxvY19zaXplOwotCSAgdW5zaWduZWQgaW50IGJhc2UgPSBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19wYWRkcjsKLQkgIGZpeFMgKmZpeF9wdHIgPSBzZWdtZW50X2luZm9baWR4XS5maXhfcm9vdDsKLQkgIG5yZWxvY3MgPSBjb3VudF9lbnRyaWVzX2luX2NoYWluIChpZHgpOwotCi0JICBpZiAobnJlbG9jcykKLQkgICAgLyogQnlwYXNzIHRoaXMgc3R1ZmYgaWYgbm8gcmVsb2NzLiAgVGhpcyBhbHNvIGluY2lkZW50YWxseQotCSAgICAgICBhdm9pZHMgYSBTQ08gYnVnLCB3aGVyZSBmcmVlKG1hbGxvYygwKSkgdGVuZHMgdG8gY3Jhc2guICAqLwotCSAgICB7Ci0JICAgICAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IG5yZWxvY3MgKiBSRUxTWjsKLQkgICAgICBleHRlcm5hbF9yZWxvY192ZWMgPQotCQkoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIG1hbGxvYyAoZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0KLQkgICAgICBleHRfcHRyID0gZXh0ZXJuYWxfcmVsb2NfdmVjOwotCi0JICAgICAgLyogRmlsbCBpbiB0aGUgaW50ZXJuYWwgY29mZiBzdHlsZSByZWxvYyBzdHJ1Y3QgZnJvbSB0aGUKLQkJIGludGVybmFsIGZpeCBsaXN0LiAgKi8KLQkgICAgICB3aGlsZSAoZml4X3B0cikKLQkJewotCQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRyOwotCi0JCSAgLyogT25seSBvdXRwdXQgc29tZSBvZiB0aGUgcmVsb2NhdGlvbnMgKi8KLQkJICBpZiAoZml4X3B0ci0+ZnhfZG9uZSA9PSAwICYmIFRDX0NPVU5UX1JFTE9DIChmaXhfcHRyKSkKLQkJICAgIHsKLSNpZmRlZiBUQ19SRUxPQ19NQU5HTEUKLQkJICAgICAgVENfUkVMT0NfTUFOR0xFICgmc2VnbWVudF9pbmZvW2lkeF0sIGZpeF9wdHIsICZpbnRyLAotCQkJCSAgICAgICBiYXNlKTsKLQotI2Vsc2UKLQkJICAgICAgc3ltYm9sUyAqZG90OwotCQkgICAgICBzeW1ib2xTICpzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLQkJICAgICAgaW50ci5yX3R5cGUgPSBUQ19DT0ZGX0ZJWDJSVFlQRSAoZml4X3B0cik7Ci0JCSAgICAgIGludHIucl92YWRkciA9Ci0JCQliYXNlICsgZml4X3B0ci0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeF9wdHItPmZ4X3doZXJlOwotCi0jaWZkZWYgVENfS0VFUF9GWF9PRkZTRVQKLQkJICAgICAgaW50ci5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLSNlbHNlCi0JCSAgICAgIGludHIucl9vZmZzZXQgPSAwOwotI2VuZGlmCi0KLQkJICAgICAgd2hpbGUgKHN5bWJvbF9wdHItPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkJCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xfcHRyKQotCQkJCSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sX3B0cikpKQotCQkJewotCQkJICBzeW1ib2xTICpuOwotCi0JCQkgIC8qIFdlIG11c3QgYXZvaWQgbG9vcGluZywgYXMgdGhhdCBjYW4gb2NjdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGJhZGx5IHdyaXR0ZW4gcHJvZ3JhbS4gICovCi0JCQkgIG4gPSBzeW1ib2xfcHRyLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JCQkgIGlmIChuID09IHN5bWJvbF9wdHIpCi0JCQkgICAgYnJlYWs7Ci0JCQkgIHN5bWJvbF9wdHIgPSBuOwotCQkJfQotCi0JCSAgICAgIC8qIFR1cm4gdGhlIHNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpbnRvIGFuIG9mZnNldC4gICovCi0JCSAgICAgIGlmIChzeW1ib2xfcHRyKQotCQkJewotCQkJICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sX3B0ciwgMSk7Ci0JCQkgIGlmICghIHN5bWJvbF9wdHItPnN5X3Jlc29sdmVkKQotCQkJICAgIHsKLQkJCSAgICAgIGNoYXIgKmZpbGU7Ci0JCQkgICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCQkJICAgICAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChzeW1ib2xfcHRyLCAmZmlsZSwgJmxpbmUpKQotCQkJCWFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJCQkJICAgICAgXygidW5yZXNvbHZlZCByZWxvY2F0aW9uIikpOwotCQkJICAgICAgZWxzZQotCQkJCWFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiKSwKLQkJCQkJU19HRVRfTkFNRSAoc3ltYm9sX3B0cikpOwotCQkJICAgIH0KLQkJCSAgZG90ID0gc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpXS5kb3Q7Ci0JCQkgIGlmIChkb3QpCi0JCQkgICAgewotCQkJICAgICAgaW50ci5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGludHIucl9zeW1uZHggPSBzeW1ib2xfcHRyLT5zeV9udW1iZXI7Ci0JCQkgICAgfQotCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaW50ci5yX3N5bW5keCA9IC0xOwotCQkJfQotI2VuZGlmCi0KLQkJICAgICAgKHZvaWQpIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmaW50ciwgZXh0X3B0cik7Ci0JCSAgICAgIGV4dF9wdHIrKzsKLQotI2lmIGRlZmluZWQoVENfQTI5SykKLQotCQkgICAgICAvKiBUaGUgMjlrIGhhcyBhIHNwZWNpYWwga2x1ZGdlIGZvciB0aGUgaGlnaCAxNiBiaXQKLQkJCSByZWxvYy4gIFR3byByZWxvY2F0aW9ucyBhcmUgZW1pdGVkLCBSX0lISUhBTEYsCi0JCQkgYW5kIFJfSUhDT05TVC4gVGhlIHNlY29uZCBvbmUgZG9lc24ndCBjb250YWluIGEKLQkJCSBzeW1ib2wsIGJ1dCB1c2VzIHRoZSB2YWx1ZSBmb3Igb2Zmc2V0LiAgKi8KLQotCQkgICAgICBpZiAoaW50ci5yX3R5cGUgPT0gUl9JSElIQUxGKQotCQkJewotCQkJICAvKiBub3cgZW1pdCB0aGUgc2Vjb25kIGJpdCAqLwotCQkJICBpbnRyLnJfdHlwZSA9IFJfSUhDT05TVDsKLQkJCSAgaW50ci5yX3N5bW5keCA9IGZpeF9wdHItPmZ4X2FkZG51bWJlcjsKLQkJCSAgKHZvaWQpIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmaW50ciwgZXh0X3B0cik7Ci0JCQkgIGV4dF9wdHIrKzsKLQkJCX0KLSNlbmRpZgotCQkgICAgfQotCi0JCSAgZml4X3B0ciA9IGZpeF9wdHItPmZ4X25leHQ7Ci0JCX0KLQotI2lmZGVmIFRFX0FVWAotCSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jIHRhYmxlICovCi0JICAgICAgcXNvcnQgKChQVFIpIGV4dGVybmFsX3JlbG9jX3ZlYywgbnJlbG9jcywKLQkJICAgICBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9yZWxvYyksIGNvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzKTsKLSNlbmRpZgotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSByZWxvYyB0YWJsZSAqLwotCSAgICAgIGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NfdmVjLCAxLCBleHRlcm5hbF9yZWxvY19zaXplLAotCQkJIGFiZmQpOwotCSAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jX3ZlYyk7Ci0KLQkgICAgICAvKiBGaWxsIGluIHNlY3Rpb24gaGVhZGVyIGluZm8uICAqLwotCSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX3JlbHB0ciA9ICpmaWxlX2N1cnNvcjsKLQkgICAgICAqZmlsZV9jdXJzb3IgKz0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLQkgICAgICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19ucmVsb2MgPSBucmVsb2NzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBObyByZWxvY3MgKi8KLQkgICAgICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19yZWxwdHIgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgLyogU2V0IHJlbG9jYXRpb25fc2l6ZSBmaWVsZCBpbiBmaWxlIGhlYWRlcnMgKi8KLSAgSF9TRVRfUkVMT0NBVElPTl9TSVpFIChoLCAqZmlsZV9jdXJzb3IgLSByZWxvY19zdGFydCwgMCk7Ci19Ci0KLQotLyogcnVuIHRocm91Z2ggYSBmcmFnIGNoYWluIGFuZCB3cml0ZSBvdXQgdGhlIGRhdGEgdG8gZ28gd2l0aCBpdCwgZmlsbAotICAgaW4gdGhlIHNjbmhkcnMgd2l0aCB0aGUgaW5mbyBvbiB0aGUgZmlsZSBwb3N0aW9ucwotKi8KLXN0YXRpYyB2b2lkCi1maWxsX3NlY3Rpb24gKGFiZmQsIGgsIGZpbGVfY3Vyc29yKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqaDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Ci17Ci0KLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBwYWRkciA9IDA7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnMgPSAmKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIpOwotCi0gICAgICBQUk9HUkVTUyAoMSk7Ci0KLSAgICAgIGlmIChzLT5zX25hbWVbMF0pCi0JewotCSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgIGNoYXIgKmJ1ZmZlcjsKLQotCSAgaWYgKHMtPnNfc2l6ZSA9PSAwKQotCSAgICBzLT5zX3NjbnB0ciA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBidWZmZXIgPSB4bWFsbG9jIChzLT5zX3NpemUpOwotCSAgICAgIHMtPnNfc2NucHRyID0gKmZpbGVfY3Vyc29yOwotCSAgICB9Ci0JICBrbm93IChzLT5zX3BhZGRyID09IHBhZGRyKTsKLQotCSAgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLnRleHQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmRhdGEiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmJzcyIpID09IDApCi0JICAgIHsKLQkgICAgICBzLT5zX3NjbnB0ciA9IDA7Ci0JICAgICAgcy0+c19mbGFncyB8PSBTVFlQX0JTUzsKLQotCSAgICAgIC8qIEBAIFNob3VsZCBtYWtlIHRoZSBpMzg2IGFuZCBhMjlrIGNvZmYgdGFyZ2V0cyBkZWZpbmUKLQkJIENPRkZfTk9MT0FEX1BST0JMRU0sIGFuZCBoYXZlIG9ubHkgb25lIHRlc3QgaGVyZS4gICovCi0jaWZuZGVmIFRDX0kzODYKLSNpZm5kZWYgVENfQTI5SwotI2lmbmRlZiBDT0ZGX05PTE9BRF9QUk9CTEVNCi0JICAgICAgLyogQXBwYXJlbnRseSB0aGUgU1ZSMyBsaW5rZXIgKGFuZCBleGVjIHN5c2NhbGwpIGFuZCBVREkKLQkJIG1vbmRmZSBwcm9ncmVtIGFyZSBjb25mdXNlZCBieSBub2xvYWQgc2VjdGlvbnMuICAqLwotCSAgICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmxpdCIpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgPSBTVFlQX0xJVCB8IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmluaXQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmZpbmkiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cm5jbXAgKHMtPnNfbmFtZSwgIi5jb21tZW50IiwgOCkgPT0gMCkKLQkgICAgcy0+c19mbGFncyB8PSBTVFlQX0lORk87Ci0KLQkgIHdoaWxlIChmcmFnKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGZpbGxfc2l6ZTsKLQkgICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JCXsKLQkJY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkJICBpZiAoZnJhZy0+ZnJfZml4KQotCQkgICAgewotCQkgICAgICBtZW1jcHkgKGJ1ZmZlciArIGZyYWctPmZyX2FkZHJlc3MsCi0JCQkgICAgICBmcmFnLT5mcl9saXRlcmFsLAotCQkJICAgICAgKHVuc2lnbmVkIGludCkgZnJhZy0+ZnJfZml4KTsKLQkJICAgICAgb2Zmc2V0ICs9IGZyYWctPmZyX2ZpeDsKLQkJICAgIH0KLQotCQkgIGJyZWFrOwotCQljYXNlIHJzX3NwYWNlOgotCQkgIGFzc2VydCAoZnJhZy0+ZnJfc3ltYm9sID09IDApOwotCQljYXNlIHJzX2ZpbGw6Ci0JCWNhc2UgcnNfYWxpZ246Ci0JCWNhc2UgcnNfYWxpZ25fY29kZToKLQkJY2FzZSByc19vcmc6Ci0JCSAgaWYgKGZyYWctPmZyX2ZpeCkKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzLAotCQkJICAgICAgZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICh1bnNpZ25lZCBpbnQpIGZyYWctPmZyX2ZpeCk7Ci0JCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7Ci0JCSAgICB9Ci0KLQkJICBmaWxsX3NpemUgPSBmcmFnLT5mcl92YXI7Ci0JCSAgaWYgKGZpbGxfc2l6ZSAmJiBmcmFnLT5mcl9vZmZzZXQgPiAwKQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBvZmYgPSBmcmFnLT5mcl9maXg7Ci0JCSAgICAgIGZvciAoY291bnQgPSBmcmFnLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCQkJewotCQkJICBpZiAoZmlsbF9zaXplICsgZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiA8PSBzLT5zX3NpemUpCi0JCQkgICAgewotCQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzICsgb2ZmLAotCQkJCSAgICAgIGZyYWctPmZyX2xpdGVyYWwgKyBmcmFnLT5mcl9maXgsCi0JCQkJICAgICAgZmlsbF9zaXplKTsKLQkJCSAgICAgIG9mZiArPSBmaWxsX3NpemU7Ci0JCQkgICAgICBvZmZzZXQgKz0gZmlsbF9zaXplOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSByc19icm9rZW5fd29yZDoKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotCSAgICB9Ci0KLQkgIGlmIChzLT5zX3NpemUgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzLT5zX3NjbnB0ciAhPSAwKQotCQl7Ci0JCSAgYmZkX3dyaXRlIChidWZmZXIsIHMtPnNfc2l6ZSwgMSwgYWJmZCk7Ci0JCSAgKmZpbGVfY3Vyc29yICs9IHMtPnNfc2l6ZTsKLQkJfQotCSAgICAgIGZyZWUgKGJ1ZmZlcik7Ci0JICAgIH0KLQkgIHBhZGRyICs9IHMtPnNfc2l6ZTsKLQl9Ci0gICAgfQotfQotCi0vKiBDb2ZmIGZpbGUgZ2VuZXJhdGlvbiAmIHV0aWxpdGllcyAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9oZWFkZXJfYXBwZW5kIChhYmZkLCBoKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBjaGFyIGJ1ZmZlclsxMDAwXTsKLSAgY2hhciBidWZmZXJvWzEwMDBdOwotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIHVuc2lnbmVkIGxvbmcgc3RyaW5nX3NpemUgPSA0OwotI2VuZGlmCi0KLSAgYmZkX3NlZWsgKGFiZmQsIDAsIDApOwotCi0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0gIEhfU0VUX01BR0lDX05VTUJFUiAoaCwgQ09GRl9NQUdJQyk7Ci0gIEhfU0VUX1ZFUlNJT05fU1RBTVAgKGgsIDApOwotICBIX1NFVF9FTlRSWV9QT0lOVCAoaCwgMCk7Ci0gIEhfU0VUX1RFWFRfU1RBUlQgKGgsIHNlZ21lbnRfaW5mb1tTRUdfRTBdLmZyY2hhaW5QLT5mcmNoX3Jvb3QtPmZyX2FkZHJlc3MpOwotICBIX1NFVF9EQVRBX1NUQVJUIChoLCBzZWdtZW50X2luZm9bU0VHX0UxXS5mcmNoYWluUC0+ZnJjaF9yb290LT5mcl9hZGRyZXNzKTsKLSAgSF9TRVRfU0laRU9GX09QVElPTkFMX0hFQURFUiAoaCwgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCAmaC0+YW91dGhkciwKLQkJCQkJCQkgICAgIGJ1ZmZlcm8pKTsKLSNlbHNlIC8qIGRlZmluZWQgKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKSAqLwotICBIX1NFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSIChoLCAwKTsKLSNlbmRpZiAvKiBkZWZpbmVkIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUikgKi8KLQotICBpID0gYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgJmgtPmZpbGVoZHIsIGJ1ZmZlcik7Ci0KLSAgYmZkX3dyaXRlIChidWZmZXIsIGksIDEsIGFiZmQpOwotICBiZmRfd3JpdGUgKGJ1ZmZlcm8sIEhfR0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIgKGgpLCAxLCBhYmZkKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0JICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZQotICAgICAgICAgICAgIG11c3QgY29vcmRpbmF0ZSB3aXRoIHRoYXQgaW4gd3JpdGVfb2JqZWN0X2ZpbGUgYW5kCi0gICAgICAgICAgICAgd19zdHJpbmdzLiAgKi8KLQkgIGlmIChzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA+IFNDTk5NTEVOKQotCSAgICB7Ci0JICAgICAgbWVtc2V0IChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSwgMCwgU0NOTk1MRU4pOwotCSAgICAgIHNwcmludGYgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCAiLyVsdSIsIHN0cmluZ19zaXplKTsKLQkgICAgICBzdHJpbmdfc2l6ZSArPSBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSArIDE7Ci0JICAgIH0KLSNlbmRpZgotCi0JICBzaXplID0gYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLAotCQkJCQkgICAmKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIpLAotCQkJCQkgICBidWZmZXIpOwotCSAgaWYgKHNpemUgPT0gMCkKLQkgICAgYXNfYmFkIChfKCJiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgZmFpbGVkIikpOwotCSAgYmZkX3dyaXRlIChidWZmZXIsIHNpemUsIDEsIGFiZmQpOwotCX0KLSAgICB9Ci19Ci0KLQotY2hhciAqCi1zeW1ib2xfdG9fY2hhcnMgKGFiZmQsIHdoZXJlLCBzeW1ib2xQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3ltYm9sUyAqIHN5bWJvbFA7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1hdXggPSBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdmFsdWVUIHZhbDsKLQotICAvKiBUdXJuIGFueSBzeW1ib2xzIHdpdGggcmVnaXN0ZXIgYXR0cmlidXRlcyBpbnRvIGFicyBzeW1ib2xzICovCi0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSByZWdfc2VjdGlvbikKLSAgICB7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICB9Ci0gIC8qIEF0IHRoZSBzYW1lIHRpbWUsIHJlbG9jYXRlIGFsbCBzeW1ib2xzIHRvIHRoZWlyIG91dHB1dCB2YWx1ZSAqLwotCi0jaWZuZGVmIFRFX1BFCi0gIHZhbCA9IChzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sUCldLnNjbmhkci5zX3BhZGRyCi0JICsgU19HRVRfVkFMVUUgKHN5bWJvbFApKTsKLSNlbHNlCi0gIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWwpOwotCi0gIHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl92YWx1ZSA9IHZhbDsKLQotICB3aGVyZSArPSBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5LAotCQkJCSAgd2hlcmUpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1hdXg7IGkrKykKLSAgICB7Ci0gICAgICB3aGVyZSArPSBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKGFiZmQsCi0JCQkJICAgICAgJnN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50W2ldLAotCQkJCSAgICAgIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCksCi0JCQkJICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCksCi0JCQkJICAgICAgaSwgbnVtYXV4LCB3aGVyZSk7Ci0gICAgfQotICByZXR1cm4gd2hlcmU7Ci0KLX0KLQotdm9pZAotY29mZl9vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBjaGFyIHVuZGVyc2NvcmUgPSAwOwkJLyogU3ltYm9sIGhhcyBsZWFkaW5nIF8gKi8KLQotICAvKiBFZmZlY3RpdmUgc3ltYm9sICovCi0gIC8qIFN0b3JlIHRoZSBwb2ludGVyIGluIHRoZSBvZmZzZXQuICovCi0gIFNfU0VUX1pFUk9FUyAoc3ltYm9sUCwgMEwpOwotICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFRfTlVMTCk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIDApOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAwKTsKLSAgLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLwotICBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2ZsYWdzID0gMDsKLSAgLyogQXV4aWxpYXJ5IGVudHJpZXMgKi8KLSAgbWVtc2V0ICgoY2hhciAqKSAmc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0sIDAsIEFVWEVTWik7Ci0KLSAgaWYgKFNfSVNfU1RSSU5HIChzeW1ib2xQKSkKLSAgICBTRl9TRVRfU1RSSU5HIChzeW1ib2xQKTsKLSAgaWYgKCF1bmRlcnNjb3JlICYmIFNfSVNfTE9DQUwgKHN5bWJvbFApKQotICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgLmxuIGRpcmVjdGl2ZXMuCi0gKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xuIChhcHBsaW5lKQotICAgICBpbnQgYXBwbGluZTsKLXsKLSAgaW50IGw7Ci0KLSAgaWYgKCEgYXBwbGluZSAmJiBkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIHdyb25nIGNvbnRleHQgKi8KLQotICBsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGNfbGluZV9uZXcgKDAsIGZyYWdfbm93X2ZpeCAoKSwgbCwgZnJhZ19ub3cpOwotCi0gIGlmIChhcHBsaW5lKQotICAgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIGwgLSAxKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlpZiAoISBhcHBsaW5lKQotCSAgbCArPSBsaW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGwpOwotICAgICAgfQotCi0gIH0KLSNlbmRpZgotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICoJCQlkZWYoKQotICoKLSAqIEhhbmRsZSAuZGVmIGRpcmVjdGl2ZXMuCi0gKgotICogT25lIG1pZ2h0IGFzayA6IHdoeSBjYW4ndCB3ZSBzeW1ib2xfbmV3IGlmIHRoZSBzeW1ib2wgZG9lcyBub3QKLSAqIGFscmVhZHkgZXhpc3QgYW5kIGZpbGwgaXQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4gIEJlY2F1c2Ugb2YKLSAqIHRoZSBDX0VGQ04gc3BlY2lhbCBzeW1ib2wuIEl0IHdvdWxkIGNsb2JiZXIgdGhlIHZhbHVlIG9mIHRoZQotICogZnVuY3Rpb24gc3ltYm9sIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIG5vdGljZSB0aGF0IGl0IGlzCi0gKiBhIENfRUZDTi4gQW5kIGEgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG1vcmUgY2xlYXIgdGhpcwotICogd2F5LiAoYXQgbGVhc3QgSSB0aGluayBpdCBpcyA6LSkuCi0gKgotICovCi0KLSNkZWZpbmUgU0tJUF9TRU1JX0NPTE9OKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnOycpCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRVMoKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgXAotCQkJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RlZiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIGNoYXIgbmFtZV9lbmQ7CQkvKiBDaGFyIGFmdGVyIHRoZSBlbmQgb2YgbmFtZSAqLwotICBjaGFyICpzeW1ib2xfbmFtZTsJCS8qIE5hbWUgb2YgdGhlIGRlYnVnIHN5bWJvbCAqLwotICBjaGFyICpzeW1ib2xfbmFtZV9jb3B5OwkvKiBUZW1wb3JhcnkgY29weSBvZiB0aGUgbmFtZSAqLwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfbGVuZ3RoOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTS0lQX1dISVRFU1BBQ0VTICgpOwotCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSAoc3ltYm9sUyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKLSAgbWVtc2V0IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwLCBzaXplb2YgKCpkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7Ci0KLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbF9uYW1lX2xlbmd0aCA9IHN0cmxlbiAoc3ltYm9sX25hbWUpOwotICBzeW1ib2xfbmFtZV9jb3B5ID0geG1hbGxvYyAoc3ltYm9sX25hbWVfbGVuZ3RoICsgMSk7Ci0gIHN0cmNweSAoc3ltYm9sX25hbWVfY29weSwgc3ltYm9sX25hbWUpOwotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZV9jb3B5ID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZV9jb3B5KTsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemUgdGhlIG5ldyBzeW1ib2wgKi8KLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIFNfU0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICgqc3ltYm9sX25hbWVfY29weSA9PSAnXycKLQkJCQkgICAgICAgPyBzeW1ib2xfbmFtZV9jb3B5ICsgMQotCQkJCSAgICAgICA6IHN5bWJvbF9uYW1lX2NvcHkpKTsKLSNlbHNlIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLSAgU19TRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX25hbWVfY29weSk7Ci0jZW5kaWYgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICAvKiBmcmVlKHN5bWJvbF9uYW1lX2NvcHkpOyAqLwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9uYW1lX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKSB+MDsKLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfbnVtYmVyID0gfjA7Ci0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwKTsKLQotICBpZiAoU19JU19TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIFNGX1NFVF9TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi11bnNpZ25lZCBpbnQgZGltX2luZGV4OwotCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9lbmRlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW1ib2xQID0gMDsKLSAgLyogRElNIEJVRyBGSVggc2FjQGN5Z251cy5jb20gKi8KLSAgZGltX2luZGV4ID0gMDsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBudW1iZXIgYWNjb3JkaW5nIHRvIHN0b3JhZ2UgY2xhc3MuICovCi0gIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIFNGX1NFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRklMRToKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgU0VHX0RFQlVHKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VGQ046Ci0gICAgICBTRl9TRVRfTE9DQUwgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBEbyBub3QgZW1pdCB0aGlzIHN5bWJvbC4gKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0JMT0NLOgotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBXaWxsIG5lZWQgcHJvY2Vzc2luZyBiZWZvcmUgd3JpdGluZyAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRkNOOgotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgU0VHX0UwKTsKLQotICAgICAgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksICIuYmYiKSA9PSAwKQotCXsJCQkvKiAuYmYgKi8KLQkgIGlmIChmdW5jdGlvbl9saW5lb2ZmIDwgMCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiYC5iZicgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iKSk7Ci0JICAgIH0JCQkvKiBtaXNzaW5nIGZ1bmN0aW9uIHN5bWJvbCAqLwotCSAgU0FfR0VUX1NZTV9MTk5PUFRSIChsYXN0X2xpbmVfc3ltYm9sKSA9IGZ1bmN0aW9uX2xpbmVvZmY7Ci0KLQkgIFNGX1NFVF9QUk9DRVNTIChsYXN0X2xpbmVfc3ltYm9sKTsKLQkgIFNGX1NFVF9BREpfTE5OT1BUUiAobGFzdF9saW5lX3N5bWJvbCk7Ci0JICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JICBmdW5jdGlvbl9saW5lb2ZmID0gLTE7Ci0JfQotICAgICAgLyogVmFsdWUgaXMgYWx3YXlzIHNldCB0byAuICovCi0gICAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgQ19BVVRPQVJHCi0gICAgY2FzZSBDX0FVVE9BUkc6Ci0jZW5kaWYgLyogQ19BVVRPQVJHICovCi0gICAgY2FzZSBDX0FVVE86Ci0gICAgY2FzZSBDX1JFRzoKLSAgICBjYXNlIENfTU9TOgotICAgIGNhc2UgQ19NT0U6Ci0gICAgY2FzZSBDX01PVToKLSAgICBjYXNlIENfQVJHOgotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgIGNhc2UgQ19GSUVMRDoKLSAgICBjYXNlIENfRU9TOgotICAgICAgU0ZfU0VUX0RFQlVHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfRVhUOgotICAgIGNhc2UgQ19XRUFLRVhUOgotI2lmZGVmIFRFX1BFCi0gICAgY2FzZSBDX05UX1dFQUs6Ci0jZW5kaWYKLSAgICBjYXNlIENfU1RBVDoKLSAgICBjYXNlIENfTEFCRUw6Ci0gICAgICAvKiBWYWxpZCBidXQgc2V0IHNvbWV3aGVyZSBlbHNlIChzX2NvbW0sIHNfbGNvbW0sIGNvbG9uKSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfVVNUQVRJQzoKLSAgICBjYXNlIENfRVhUREVGOgotICAgIGNhc2UgQ19VTEFCRUw6Ci0gICAgICBhc193YXJuIChfKCJ1bmV4cGVjdGVkIHN0b3JhZ2UgY2xhc3MgJWQiKSwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICAgICAgYnJlYWs7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gc3RvcmFnZSBjbGFzcyAqLwotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYnVpbHQgYSBkZWJ1ZyBzeW1ib2wsIHRyeSB0byBmaW5kIGlmIHdlIHNob3VsZAotICAgICBtZXJnZSB3aXRoIGFuIGV4aXN0aW5nIHN5bWJvbCBvciBub3QuICBJZiBhIHN5bWJvbCBpcyBDX0VGQ04gb3IKLSAgICAgYWJzb2x1dGVfc2VjdGlvbiBvciB1bnRhZ2dlZCBTRUdfREVCVUcgaXQgbmV2ZXIgbWVyZ2VzLiAgV2UgYWxzbwotICAgICBkb24ndCBtZXJnZSBsYWJlbHMsIHdoaWNoIGFyZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UsIG5vcgotICAgICBzeW1ib2xzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuIGRlZmluZWQgc2luY2UgdGhleSBhcmUgdHlwaWNhbGx5Ci0gICAgIHVuaXF1ZSwgbm9yIGRvIHdlIG1lcmdlIHRhZ3Mgd2l0aCBub24tdGFncy4gICovCi0KLSAgLyogVHdvIGNhc2VzIGZvciBmdW5jdGlvbnMuICBFaXRoZXIgZGVidWcgZm9sbG93ZWQgYnkgZGVmaW5pdGlvbiBvcgotICAgICBkZWZpbml0aW9uIGZvbGxvd2VkIGJ5IGRlYnVnLiAgRm9yIGRlZmluaXRpb24gZmlyc3QsIHdlIHdpbGwKLSAgICAgbWVyZ2UgdGhlIGRlYnVnIHN5bWJvbCBpbnRvIHRoZSBkZWZpbml0aW9uLiAgRm9yIGRlYnVnIGZpcnN0LCB0aGUKLSAgICAgbGluZW5vIGVudHJ5IE1VU1QgcG9pbnQgdG8gdGhlIGRlZmluaXRpb24gZnVuY3Rpb24gb3IgZWxzZSBpdAotICAgICB3aWxsIHBvaW50IG9mZiBpbnRvIHNwYWNlIHdoZW4gY3Jhd2xfc3ltYm9scygpIG1lcmdlcyB0aGUgZGVidWcKLSAgICAgc3ltYm9sIGludG8gdGhlIHJlYWwgc3ltYm9sLiAgVGhlcmVmb3IsIGxldCdzIHByZXN1bWUgdGhlIGRlYnVnCi0gICAgIHN5bWJvbCBpcyBhIHJlYWwgZnVuY3Rpb24gcmVmZXJlbmNlLiAqLwotCi0gIC8qIEZJWE1FLVNPT04gSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBkZWZpbml0aW9uIGxhYmVsL3N5bWJvbCBpcwotICAgICBuZXZlciBzZWVuLCB0aGlzIHdpbGwgcHJvYmFibHkgbGVhdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCBhdCBsaW5rCi0gICAgIHRpbWUuICovCi0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfRUZDTgotICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19MQUJFTAotICAgICAgfHwgKFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IFNFR19ERUJVRwotCSAgJiYgIVNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgICAgfHwgU19HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgfHwgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCAoc3ltYm9sUCA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLCBET19OT1RfU1RSSVApKSA9PSBOVUxMCi0gICAgICB8fCAoU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgIT0gU0ZfR0VUX1RBRyAoc3ltYm9sUCkpKQotICAgIHsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwKLQkJICAgICAmc3ltYm9sX2xhc3RQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCBhbHJlYWR5IGV4aXN0cywgbWVyZ2UgdGhlIG5ld2x5IGNyZWF0ZWQgc3ltYm9sCi0JIGludG8gdGhlIG9sZCBvbmUuICBUaGlzIGlzIG5vdCBtYW5kYXRvcnkuIFRoZSBsaW5rZXIgY2FuCi0JIGhhbmRsZSBkdXBsaWNhdGUgc3ltYm9scyBjb3JyZWN0bHkuIEJ1dCBJIGd1ZXNzIHRoYXQgaXQgc2F2ZQotCSBhICpsb3QqIG9mIHNwYWNlIGlmIHRoZSBhc3NlbWJseSBmaWxlIGRlZmluZXMgYSBsb3Qgb2YKLQkgc3ltYm9scy4gW2xvaWNdICovCi0KLSAgICAgIC8qIFRoZSBkZWJ1ZyBlbnRyeSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgaXMgbWVyZ2VkIGludG8gdGhlCi0JIHByZXZpb3VzIGRlZmluaXRpb24uICAqLwotCi0gICAgICBjX3N5bWJvbF9tZXJnZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sUCk7Ci0gICAgICAvKiBGSVhNRS1TT09OIFNob3VsZCAqZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyBiZSBmcmVlJ2Q/IHhveG9yaWNoLiAqLwotICAgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IHN5bWJvbFA7Ci0KLSAgICAgIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCi0JICB8fCBTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19TVEFUKQotCXsKLQkgIC8qIEZvciBmdW5jdGlvbnMsIGFuZCB0YWdzLCBhbmQgc3RhdGljIHN5bWJvbHMsIHRoZSBzeW1ib2wKLQkgICAgICptdXN0KiBiZSB3aGVyZSB0aGUgZGVidWcgc3ltYm9sIGFwcGVhcnMuICBNb3ZlIHRoZQotCSAgICAgZXhpc3Rpbmcgc3ltYm9sIHRvIHRoZSBjdXJyZW50IHBsYWNlLiAqLwotCSAgLyogSWYgaXQgYWxyZWFkeSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgbGlzdCwgZG8gbm90aGluZyAqLwotCSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gc3ltYm9sX2xhc3RQKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwKLQkJCSAgICAgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgc3ltYm9sX2FwcGVuZCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2xhc3RQLAotCQkJICAgICAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgfQkJCS8qIGlmIG5vdCBhbHJlYWR5IGluIHBsYWNlICovCi0JfQkJCS8qIGlmIGZ1bmN0aW9uICovCi0gICAgfQkJCQkvKiBub3JtYWwgb3IgbWVyZ2FibGUgKi8KLQotICBpZiAoU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgICAgc3ltYm9sUyAqb2xkdGFnOwotCi0gICAgICBvbGR0YWcgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJCQkgRE9fTk9UX1NUUklQKTsKLSAgICAgIGlmIChvbGR0YWcgPT0gTlVMTCB8fCAhIFNGX0dFVF9UQUcgKG9sZHRhZykpCi0JdGFnX2luc2VydCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0JCSAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICB9Ci0KLSAgaWYgKFNGX0dFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgICAga25vdyAoc2l6ZW9mIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA8PSBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGZ1bmN0aW9uX2xpbmVvZmYKLQk9IGNfbGluZV9uZXcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDAsIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotICAgICAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGF0IGlzLCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhlCi0JICAgICBmdW5jdGlvbi4uLiAqLwotCSAgc3ltYm9sX3RhYmxlX2luc2VydCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JfQkJCS8qIGRlZmluaXRpb24gZm9sbG93cyBkZWJ1ZyAqLwotICAgIH0JCQkJLyogQ3JlYXRlIHRoZSBsaW5lIG51bWJlciBlbnRyeSBwb2ludGluZyB0byB0aGUgZnVuY3Rpb24gYmVpbmcgZGVmaW5lZCAqLwotCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBOVUxMOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBkaW1faW5kZXg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLQotICBmb3IgKGRpbV9pbmRleCA9IDA7IGRpbV9pbmRleCA8IERJTU5VTTsgZGltX2luZGV4KyspCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFUyAoKTsKLSAgICAgIFNBX1NFVF9TWU1fRElNRU4gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGRpbV9pbmRleCwKLQkJCWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICcsJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfd2FybiAoXygiYmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIGlnbm9yZWQiKSk7Ci0JICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCWNhc2UgJ1xuJzoKLQljYXNlICc7JzoKLQkgIGRpbV9pbmRleCA9IERJTU5VTTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IHRoaXNfYmFzZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9ial9jb2ZmX2xuICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICB0aGlzX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAvKiBPbmx5IC5iZiBzeW1ib2xzIGluZGljYXRlIHRoZSB1c2Ugb2YgYSBuZXcgYmFzZSBsaW5lIG51bWJlcjsgdGhlCi0gICAgIGxpbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggLmVmLCAuYmIsIC5lYiBhcmUgcmVsYXRpdmUgdG8gdGhlCi0gICAgIHN0YXJ0IG9mIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLiAgKi8KLSAgaWYgKCFzdHJjbXAgKCIuYmYiLCBuYW1lKSkKLSAgICB7Ci0jaWYgMCAvKiBYWFggQ2FuIHdlIGV2ZXIgaGF2ZSBsaW5lIG51bWJlcnMgZ29pbmcgYmFja3dhcmRzPyAgKi8KLSAgICAgIGlmICh0aGlzX2Jhc2UgPiBsaW5lX2Jhc2UpCi0jZW5kaWYKLQl7Ci0JICBsaW5lX2Jhc2UgPSB0aGlzX2Jhc2U7Ci0JfQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIHsKLQlleHRlcm4gaW50IGxpc3Rpbmc7Ci0JaWYgKGxpc3RpbmcpCi0JICB7Ci0JICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGxpbmVfYmFzZSk7Ci0JICB9Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGhpc19iYXNlKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX1NJWkUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnN5bWJvbF9uYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWUpOwotI2VuZGlmCi0KLSAgLyogQXNzdW1lIHRoYXQgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSAudGFnIGlzIGFsd2F5cyBkZWZpbmVkLgotICAgICBUaGlzIHdhcyBhIGJhZCBhc3N1bXB0aW9uLiAgSSd2ZSBhZGRlZCBmaW5kX29yX21ha2UuIHhveG9yaWNoLiAqLwotICBTQV9TRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywKLQkJICAgICAobG9uZykgdGFnX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpKTsKLSAgaWYgKFNBX0dFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSAwTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJ0YWcgbm90IGZvdW5kIGZvciAudGFnICVzIiksIHN5bWJvbF9uYW1lKTsKLSAgICB9CQkJCS8qIG5vdCBkZWZpbmVkICovCi0KLSAgU0ZfU0VUX1RBR0dFRCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIGlmIChJU0ZDTiAoU19HRVRfREFUQV9UWVBFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkgJiYKLSAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpICE9IENfVFBERUYpCi0gICAgewotICAgICAgU0ZfU0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICB9CQkJCS8qIGlzIGEgZnVuY3Rpb24gKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdmFsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgY2hhciAqc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjaGFyIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKLSNlbmRpZgotCi0gICAgICBpZiAoIXN0cmNtcCAoc3ltYm9sX25hbWUsICIuIikpCi0JewotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAvKiBJZiB0aGUgLnZhbCBpcyAhPSBmcm9tIHRoZSAuZGVmIChlLmcuIHN0YXRpY3MpICovCi0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgc3ltYm9sX25hbWUpKQotCXsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3AgPSBPX3N5bWJvbDsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCA9Ci0JICAgIHN5bWJvbF9maW5kX29yX21ha2UgKHN5bWJvbF9uYW1lKTsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IDA7Ci0KLQkgIC8qIElmIHRoZSBzZWdtZW50IGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBmb3J3YXJkIHJlZmVyZW5jZSBpcwotCSAgICAgcmVzb2x2ZWQsIHRoZW4gY29weSB0aGUgc2VnbWVudCBpZCBmcm9tIHRoZSBmb3J3YXJkCi0JICAgICBzeW1ib2wuICAqLwotCSAgU0ZfU0VUX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotCSAgLyogRklYTUU6IGdjYyBjYW4gZ2VuZXJhdGUgYWRkcmVzcyBleHByZXNzaW9ucwotCSAgICAgaGVyZSBpbiB1bnVzdWFsIGNhc2VzIChzZWFyY2ggZm9yICJvYnNjdXJlIgotCSAgICAgaW4gc2Rib3V0LmMpLiAgV2UganVzdCBpZ25vcmUgdGhlIG9mZnNldAotCSAgICAgaGVyZSwgdGh1cyBnZW5lcmF0aW5nIGluY29ycmVjdCBkZWJ1Z2dpbmcKLQkgICAgIGluZm9ybWF0aW9uLiAgV2UgaWdub3JlIHRoZSByZXN0IG9mIHRoZQotCSAgICAgbGluZSBqdXN0IGJlbG93LiAgKi8KLQl9Ci0gICAgICAvKiBPdGhlcndpc2UsIGl0IGlzIHRoZSBuYW1lIG9mIGEgbm9uIGRlYnVnIHN5bWJvbCBhbmQKLQkgaXRzIHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBsYXRlci4gKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAgICAgLyogRklYTUU6IHRoaXMgaXMgdG8gYXZvaWQgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUKLQkgRklYTUUgY2FzZSBtZW50aW9uZWQganVzdCBhYm92ZS4gICovCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsCi0JCSAgICh2YWx1ZVQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgICB9CQkJCS8qIGlmIHN5bWJvbCBiYXNlZCAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNpZmRlZiBURV9QRQotCi0vKiBIYW5kbGUgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3AuICBUaGlzIGlzIHBhcnNlZCBieSBzX2xpbmtvbmNlIGluCi0gICByZWFkLmMsIHdoaWNoIHRoZW4gY2FsbHMgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWMgcm91dGluZS4gICovCi0KLXZvaWQKLW9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UgKHR5cGUpCi0gICAgIGVudW0gbGlua29uY2VfdHlwZSB0eXBlOwotewotICBzZWdfaW5mbyAobm93X3NlZyktPnNjbmhkci5zX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOwotCi0gIC8qIFdlIHN0b3JlIHRoZSB0eXBlIGluIHRoZSBzZWdfaW5mbyBzdHJ1Y3R1cmUsIGFuZCB1c2UgaXQgdG8gc2V0IHVwCi0gICAgIHRoZSBhdXhpbGlhcnkgZW50cnkgZm9yIHRoZSBzZWN0aW9uIHN5bWJvbCBpbiBjX3NlY3Rpb25fc3ltYm9sLiAgKi8KLSAgc2VnX2luZm8gKG5vd19zZWcpLT5saW5rb25jZSA9IHR5cGU7Ci19Ci0KLSNlbmRpZiAvKiBURV9QRSAqLwotCi12b2lkCi1jb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSAgLyogVGhlc2UgaGFkIGJldHRlciBiZSB0aGUgc2FtZS4gIFVzdWFsbHkgMTggYnl0ZXMuICovCi0jaWZuZGVmIEJGRF9IRUFERVJTCi0gIGtub3cgKHNpemVvZiAoU1lNRU5UKSA9PSBzaXplb2YgKEFVWEVOVCkpOwotICBrbm93IChTWU1FU1ogPT0gQVVYRVNaKTsKLSNlbmRpZgotICB0YWdfaW5pdCAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhbmQgcHV0cyBhbGwgdGhlCi0gICBleHRlcm5hbHMgb250byBhbm90aGVyIGNoYWluICovCi0KLS8qIFRoZSBjaGFpbiBvZiBnbG9iYWxzLiAgKi8KLXN5bWJvbFMgKnN5bWJvbF9nbG9iYWxQOwotc3ltYm9sUyAqc3ltYm9sX2dsb2JhbF9sYXN0UDsKLQotLyogVGhlIGNoYWluIG9mIGV4dGVybmFscyAqLwotc3ltYm9sUyAqc3ltYm9sX2V4dGVyblA7Ci1zeW1ib2xTICpzeW1ib2xfZXh0ZXJuX2xhc3RQOwotCi1zdGFjayAqYmxvY2tfc3RhY2s7Ci1zeW1ib2xTICpsYXN0X2Z1bmN0aW9uUDsKLXN0YXRpYyBzeW1ib2xTICpsYXN0X2JmUDsKLXN5bWJvbFMgKmxhc3RfdGFnUDsKLQotc3RhdGljIHVuc2lnbmVkIGludAoteWFua19zeW1ib2xzICgpCi17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLSAgdW5zaWduZWQgaW50IGxhc3RfZmlsZV9zeW1ubyA9IDA7Ci0KLSAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3RfaGVhZDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICAgc3ltYm9sUDsKLSAgICAgICBzeW1ib2xQID0gc3ltYm9sUCA/IHN5bWJvbF9uZXh0IChzeW1ib2xQKSA6IHN5bWJvbF9yb290UCkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sUC0+c3lfbXJpX2NvbW1vbikKLQl7Ci0JICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FWFQKLSNpZmRlZiBURV9QRQotCSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19XRUFLRVhUKQotCSAgICBhc19iYWQgKF8oIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIpLAotCQkgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghU0ZfR0VUX0RFQlVHIChzeW1ib2xQKSkKLQl7Ci0JICAvKiBEZWJ1ZyBzeW1ib2xzIGRvIG5vdCBuZWVkIGFsbCB0aGlzIHJ1YmJpc2ggKi8KLQkgIHN5bWJvbFMgKnJlYWxfc3ltYm9sUDsKLQotCSAgLyogTCogYW5kIENfRUZDTiBzeW1ib2xzIG5ldmVyIG1lcmdlLiAqLwotCSAgaWYgKCFTRl9HRVRfTE9DQUwgKHN5bWJvbFApCi0JICAgICAgJiYgIVNGX0dFVF9TVEFUSUNTIChzeW1ib2xQKQotCSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApICE9IENfTEFCRUwKLQkgICAgICAmJiBzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiAocmVhbF9zeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoc3ltYm9sUCksIERPX05PVF9TVFJJUCkpCi0JICAgICAgJiYgcmVhbF9zeW1ib2xQICE9IHN5bWJvbFApCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRS1TT09OOiB3aGVyZSBkbyBkdXBzIGNvbWUgZnJvbT8KLQkJIE1heWJlIHRhZyByZWZlcmVuY2VzIGJlZm9yZSBkZWZpbml0aW9ucz8geG94b3JpY2guICovCi0JICAgICAgLyogTW92ZSB0aGUgZGVidWcgZGF0YSBmcm9tIHRoZSBkZWJ1ZyBzeW1ib2wgdG8gdGhlCi0JCSByZWFsIHN5bWJvbC4gRG8gTk9UIGRvIHRoZSBvcG9zaXRlIChpLmUuIG1vdmUgZnJvbQotCQkgcmVhbCBzeW1ib2wgdG8gZGVidWcgc3ltYm9sIGFuZCByZW1vdmUgcmVhbCBzeW1ib2wgZnJvbSB0aGUKLQkJIGxpc3QuKSBCZWNhdXNlIHNvbWUgcG9pbnRlcnMgcmVmZXIgdG8gdGhlIHJlYWwgc3ltYm9sCi0JCSB3aGVyZWFzIG5vIHBvaW50ZXJzIHJlZmVyIHRvIHRoZSBkZWJ1ZyBzeW1ib2wuICovCi0JICAgICAgY19zeW1ib2xfbWVyZ2UgKHN5bWJvbFAsIHJlYWxfc3ltYm9sUCk7Ci0JICAgICAgLyogUmVwbGFjZSB0aGUgY3VycmVudCBzeW1ib2wgYnkgdGhlIHJlYWwgb25lICovCi0JICAgICAgLyogVGhlIHN5bWJvbHMgd2lsbCBuZXZlciBiZSB0aGUgbGFzdCBvciB0aGUgZmlyc3QKLQkJIGJlY2F1c2UgOiAxc3Qgc3ltYm9sIGlzIC5maWxlIGFuZCAzIGxhc3Qgc3ltYm9scyBhcmUKLQkJIC50ZXh0LCAuZGF0YSwgLmJzcyAqLwotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHJlYWxfc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgc3ltYm9sX2luc2VydCAocmVhbF9zeW1ib2xQLCBzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xQID0gcmVhbF9zeW1ib2xQOwotCSAgICB9CQkJLyogaWYgbm90IGxvY2FsIGJ1dCBkdXAnZCAqLwotCi0JICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgJiYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19FMSkpCi0JICAgIHsKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfRTApOwotCSAgICB9CQkJLyogcHVzaCBkYXRhIGludG8gdGV4dCAqLwotCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX05VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgIVNGX0dFVF9MT0NBTCAoc3ltYm9sUCkpCi0JCXsKLQkJICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfRTApCi0JCXsKLQkJICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0xBQkVMKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBNYWlubHkgdG8gc3BlZWQgdXAgaWYgbm90IC1nICovCi0JICBpZiAoU0ZfR0VUX1BST0NFU1MgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgLyogSGFuZGxlIHRoZSBuZXN0ZWQgYmxvY2tzIGF1eGlsaWFyeSBpbmZvLiAqLwotCSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0JMT0NLKQotCQl7Ci0JCSAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAiLmJiIikpCi0JCSAgICBzdGFja19wdXNoIChibG9ja19zdGFjaywgKGNoYXIgKikgJnN5bWJvbFApOwotCQkgIGVsc2UKLQkJICAgIHsJCS8qIC5lYiAqLwotCQkgICAgICByZWdpc3RlciBzeW1ib2xTICpiZWdpbl9zeW1ib2xQOwotCQkgICAgICBiZWdpbl9zeW1ib2xQID0gKihzeW1ib2xTICoqKSBzdGFja19wb3AgKGJsb2NrX3N0YWNrKTsKLQkJICAgICAgaWYgKGJlZ2luX3N5bWJvbFAgPT0gKHN5bWJvbFMgKikgMCkKLQkJCWFzX3dhcm4gKF8oIm1pc21hdGNoZWQgLmViIikpOwotCQkgICAgICBlbHNlCi0JCQlTQV9TRVRfU1lNX0VORE5EWCAoYmVnaW5fc3ltYm9sUCwgc3ltYm9sX251bWJlciArIDIpOwotCQkgICAgfQotCQl9Ci0JICAgICAgLyogSWYgd2UgYXJlIGFibGUgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBmdW5jdGlvbiwgYW5kIHdlCi0JICAgICAgIGFyZSBvdXQgb2YgYSBmdW5jdGlvbiAobGFzdF9mdW5jdGlvblAgPT0gMCkgdGhlbiwgdGhlCi0JICAgICAgIGZ1bmN0aW9uIHN5bWJvbCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBhdXhpbGlhcnkKLQkgICAgICAgZW50cnkuICovCi0JICAgICAgaWYgKGxhc3RfZnVuY3Rpb25QID09IChzeW1ib2xTICopIDAgJiYKLQkJICBTRl9HRVRfRlVOQ1RJT04gKHN5bWJvbFApKQotCQl7Ci0JCSAgbGFzdF9mdW5jdGlvblAgPSBzeW1ib2xQOwotCi0JCSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApIDwgMSkKLQkJICAgIHsKLQkJICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMSk7Ci0JCSAgICB9CQkvKiBtYWtlIGl0IGF0IGxlYXN0IDEgKi8KLQotCQkgIC8qIENsb2JiZXIgcG9zc2libGUgc3RhbGUgLmRpbSBpbmZvcm1hdGlvbi4gKi8KLSNpZiAwCi0JCSAgLyogSWZmZWQgb3V0IGJ5IHN0ZXZlIC0gdGhpcyBmcmllcyB0aGUgbG5ub3B0ciBpbmZvIHRvbyAqLwotCQkgIGJ6ZXJvIChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXS54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuLAotCQkJIHNpemVvZiAoc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0ueF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbikpOwotI2VuZGlmCi0JCX0KLQkgICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GQ04pCi0JCXsKLQkJICBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChzeW1ib2xQKSwgIi5iZiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChsYXN0X2JmUCAhPSBOVUxMKQotCQkJU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfYmZQLCBzeW1ib2xfbnVtYmVyKTsKLQkJICAgICAgbGFzdF9iZlAgPSBzeW1ib2xQOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FRkNOKQotCQl7Ci0JCSAgLyogSSBkb24ndCBldmVuIGtub3cgaWYgdGhpcyBpcyBuZWVkZWQgZm9yIHNkYi4gQnV0Ci0JCSAgICAgdGhlIHN0YW5kYXJkIGFzc2VtYmxlciBnZW5lcmF0ZXMgaXQsIHNvLi4uICAqLwotCQkgIGlmIChsYXN0X2Z1bmN0aW9uUCA9PSAoc3ltYm9sUyAqKSAwKQotCQkgICAgYXNfZmF0YWwgKF8oIkNfRUZDTiBzeW1ib2wgb3V0IG9mIHNjb3BlIikpOwotCQkgIFNBX1NFVF9TWU1fRlNJWkUgKGxhc3RfZnVuY3Rpb25QLAotCQkJCSAgICAobG9uZykgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAtCi0JCQkJCSAgICBTX0dFVF9WQUxVRSAobGFzdF9mdW5jdGlvblApKSk7Ci0JCSAgU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfZnVuY3Rpb25QLCBzeW1ib2xfbnVtYmVyKTsKLQkJIGxhc3RfZnVuY3Rpb25QID0gKHN5bWJvbFMgKikgMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoU0ZfR0VUX1RBRyAoc3ltYm9sUCkpCi0JewotCSAgLyogRmlyc3QgZGVzY3JpcHRvciBvZiBhIHN0cnVjdHVyZSBtdXN0IHBvaW50IHRvCi0JICAgICAgIHRoZSBmaXJzdCBzbG90IGFmdGVyIHRoZSBzdHJ1Y3R1cmUgZGVzY3JpcHRpb24uICovCi0JICBsYXN0X3RhZ1AgPSBzeW1ib2xQOwotCi0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FT1MpCi0JewotCSAgLyogKzIgdGFrZSBpbiBhY2NvdW50IHRoZSBjdXJyZW50IHN5bWJvbCAqLwotCSAgU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfdGFnUCwgc3ltYm9sX251bWJlciArIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRklMRSkKLQl7Ci0JICAvKiBJZiB0aGUgZmlsZW5hbWUgd2FzIHRvbyBsb25nIHRvIGZpdCBpbiB0aGUKLQkgICAgIGF1eGVudCwgcHV0IGl0IGluIHRoZSBzdHJpbmcgdGFibGUgKi8KLQkgIGlmIChTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyAoc3ltYm9sUCkgPT0gMAotCSAgICAgICYmIFNBX0dFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCkgIT0gMCkKLQkgICAgewotCSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCwgc3RyaW5nX2J5dGVfY291bnQpOwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoZmlsZW5hbWVfbGlzdF9zY2FuLT5maWxlbmFtZSkgKyAxOwotCSAgICAgIGZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3Rfc2Nhbi0+bmV4dDsKLQkgICAgfQotCSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCBsYXN0X2ZpbGVfc3ltbm8pOwotCSAgICAgIGxhc3RfZmlsZV9zeW1ubyA9IHN5bWJvbF9udW1iZXI7Ci0JICAgIH0JCQkvKiBubyBvbmUgcG9pbnRzIGF0IHRoZSBmaXJzdCAuZmlsZSBzeW1ib2wgKi8KLQl9CQkJLyogaWYgZGVidWcgb3IgdGFnIG9yIGVvcyBvciBmaWxlICovCi0KLSNpZmRlZiB0Y19mcm9iX2NvZmZfc3ltYm9sCi0gICAgICB0Y19mcm9iX2NvZmZfc3ltYm9sIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gICAgICAvKiBXZSBtdXN0IHB1dCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhcGFydC4gVGhlIGxvYWRlcgotCSBkb2VzIG5vdCBib21iIGlmIHdlIGRvIG5vdC4gQnV0IHRoZSByZWZlcmVuY2VzIGluCi0JIHRoZSBlbmRuZHggZmllbGQgZm9yIGEgLmJiIHN5bWJvbCBhcmUgbm90IGNvcnJlY3RlZAotCSBpZiBhbiBleHRlcm5hbCBzeW1ib2wgaXMgcmVtb3ZlZCBiZXR3ZWVuIC5iYiBhbmQgLmJlLgotCSBJLmUgaW4gdGhlIGZvbGxvd2luZyBjYXNlIDoKLQkgWzIwXSAuYmIgZW5kbmR4ID0gMjIKLQkgWzIxXSBmb28gZXh0ZXJuYWwKLQkgWzIyXSAuYmUKLQkgbGQgd2lsbCBtb3ZlIHRoZSBzeW1ib2wgMjEgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBidXQKLQkgZW5kbmR4IHdpbGwgc3RpbGwgYmUgMjIgaW5zdGVhZCBvZiAyMS4gKi8KLQotCi0gICAgICBpZiAoU0ZfR0VUX0xPQ0FMIChzeW1ib2xQKSkKLQl7Ci0JICAvKiByZW1vdmUgQ19FRkNOIGFuZCBMT0NBTCAoTC4uLikgc3ltYm9scyAqLwotCSAgLyogbmV4dCBwb2ludGVyIHJlbWFpbnMgdmFsaWQgKi8KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0JfQotICAgICAgZWxzZSBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkpCi0JewotCSAgLyogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byB1bmRlZmluZWQgb3IgY29tbW9uCi0JICAgICBzeW1ib2xzLiAgKi8KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCX0KLSAgICAgIGVsc2UgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApCi0JICAgICAgICYmICFTX0lTX0RFQlVHIChzeW1ib2xQKQotCSAgICAgICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bWJvbFApCi0JICAgICAgICYmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfV0VBS0VYVCkpCi0JewotCSAgLyogaWYgZXh0ZXJuYWwsIFJlbW92ZSBmcm9tIHRoZSBsaXN0ICovCi0JICBzeW1ib2xTICpob2xkID0gc3ltYm9sX3ByZXZpb3VzIChzeW1ib2xQKTsKLQotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyAoc3ltYm9sUCk7Ci0JICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfZXh0ZXJuX2xhc3RQLCAmc3ltYm9sX2V4dGVyblAsICZzeW1ib2xfZXh0ZXJuX2xhc3RQKTsKLQkgIHN5bWJvbFAgPSBob2xkOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgU19JU19ERUJVRyAoc3ltYm9sUCkKLQkgICAgICAgJiYgISBTRl9HRVRfU1RBVElDUyAoc3ltYm9sUCkKLQkgICAgICAgJiYgISBTRl9HRVRfRlVOQ1RJT04gKHN5bWJvbFApCi0JICAgICAgICYmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSykpCi0JewotCSAgc3ltYm9sUyAqaG9sZCA9IHN5bWJvbF9wcmV2aW91cyAoc3ltYm9sUCk7Ci0KLQkgIC8qIFRoZSBPJ1JlaWxseSBDT0ZGIGJvb2sgc2F5cyB0aGF0IGRlZmluZWQgZ2xvYmFsIHN5bWJvbHMKLSAgICAgICAgICAgICBjb21lIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSwganVzdCBiZWZvcmUKLSAgICAgICAgICAgICB1bmRlZmluZWQgZ2xvYmFsIHN5bWJvbHMuICAqLwotCi0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKLQkgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9nbG9iYWxfbGFzdFAsICZzeW1ib2xfZ2xvYmFsUCwKLQkJCSAmc3ltYm9sX2dsb2JhbF9sYXN0UCk7Ci0JICBzeW1ib2xQID0gaG9sZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNGX0dFVF9TVFJJTkcgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSBzdHJpbmdfYnl0ZV9jb3VudDsKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBzdHJsZW4gKFNfR0VUX05BTUUgKHN5bWJvbFApKSArIDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkgICAgfQkJCS8qIGZpeCAibG9uZyIgbmFtZXMgKi8KLQotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLQkgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApOwotCX0JCQkvKiBpZiBsb2NhbCBzeW1ib2wgKi8KLSAgICB9CQkJCS8qIHRyYXZlcnNlIHRoZSBzeW1ib2wgbGlzdCAqLwotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWdsdWVfc3ltYm9scyAoaGVhZCwgdGFpbCkKLSAgICAgc3ltYm9sUyAqKmhlYWQ7Ci0gICAgIHN5bWJvbFMgKip0YWlsOwotewotICB1bnNpZ25lZCBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgd2hpbGUgKCpoZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUyAqdG1wID0gKmhlYWQ7Ci0KLSAgICAgIC8qIGFwcGVuZCAqLwotICAgICAgc3ltYm9sX3JlbW92ZSAodG1wLCBoZWFkLCB0YWlsKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHRtcCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotICAgICAgLyogYW5kIHByb2Nlc3MgKi8KLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HICh0bXApKQotCXsKLQkgIHRtcC0+c3lfbmFtZV9vZmZzZXQgPSBzdHJpbmdfYnl0ZV9jb3VudDsKLQkgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAodG1wKSkgKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0bXAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQl9CQkJLyogZml4ICJsb25nIiBuYW1lcyAqLwotCi0gICAgICB0bXAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXI7Ci0gICAgICBzeW1ib2xfbnVtYmVyICs9IDEgKyBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZICh0bXApOwotICAgIH0JCQkJLyogYXBwZW5kIHRoZSBlbnRpcmUgZXh0ZXJuIGNoYWluICovCi0KLSAgcmV0dXJuIHN5bWJvbF9udW1iZXI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRpZV90YWdzICgpCi17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLQotICAgICAgaWYgKFNGX0dFVF9UQUdHRUQgKHN5bWJvbFApKQotCXsKLQkgIFNBX1NFVF9TWU1fVEFHTkRYCi0JICAgIChzeW1ib2xQLAotCSAgICAgKChzeW1ib2xTICopIFNBX0dFVF9TWU1fVEFHTkRYIChzeW1ib2xQKSktPnN5X251bWJlcik7Ci0JfQotCi0gICAgICBzeW1ib2xfbnVtYmVyICs9IDEgKyBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHN5bWJvbF9udW1iZXI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jcmF3bF9zeW1ib2xzIChoLCBhYmZkKQotICAgICBvYmplY3RfaGVhZGVycyAqaDsKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhY2sgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBtYXRjaGluZyAuYmIgLmJlICovCi0KLSAgYmxvY2tfc3RhY2sgPSBzdGFja19pbml0ICg1MTIsIHNpemVvZiAoc3ltYm9sUyAqKSk7Ci0KLSAgLyogVGhlIHN5bWJvbCBsaXN0IHNob3VsZCBiZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHNlcXVlbmNlCi0gICAqIG9yZGVyIDoKLSAgICogLiAuZmlsZSBzeW1ib2wKLSAgICogLiBkZWJ1ZyBlbnRyaWVzIGZvciBmdW5jdGlvbnMKLSAgICogLiBmYWtlIHN5bWJvbHMgZm9yIHRoZSBzZWN0aW9ucywgaW5jbHVkaW5nIC50ZXh0IC5kYXRhIGFuZCAuYnNzCi0gICAqIC4gZGVmaW5lZCBzeW1ib2xzCi0gICAqIC4gdW5kZWZpbmVkIHN5bWJvbHMKLSAgICogQnV0IHRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIG9ubHkgaW1wb3J0YW50IHBvaW50IGlzIHRvIHB1dCB0aGUKLSAgICogdW5kZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICovCi0KLSAgLyogSXMgdGhlcmUgYSAuZmlsZSBzeW1ib2wgPyBJZiBub3QgaW5zZXJ0IG9uZSBhdCB0aGUgYmVnaW5uaW5nLiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQID09IE5VTEwKLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbF9yb290UCkgIT0gQ19GSUxFKQotICAgIHsKLSAgICAgIGNfZG90X2ZpbGVfc3ltYm9sICgiZmFrZSIpOwotICAgIH0KLQotICAvKgotICAgKiBCdWlsZCB1cCBzdGF0aWMgc3ltYm9scyBmb3IgdGhlIHNlY3Rpb25zLCB0aGV5IGFyZSBmaWxsZWQgaW4gbGF0ZXIKLSAgICovCi0KLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5kb3QgPSBjX3NlY3Rpb25fc3ltYm9sIChzZWdtZW50X2luZm9baV0ubmFtZSwKLQkJCQkJICAgICAgaSAtIFNFR19FMCArIDEpOwotCi0gIC8qIFRha2UgYWxsIHRoZSBleHRlcm5hbHMgb3V0IGFuZCBwdXQgdGhlbSBpbnRvIGFub3RoZXIgY2hhaW4gKi8KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGgsIHlhbmtfc3ltYm9scyAoKSk7Ci0gIC8qIFRha2UgdGhlIGV4dGVybmFscyBhbmQgZ2x1ZSB0aGVtIG9udG8gdGhlIGVuZC4qLwotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwKLQkJCSAgIChIX0dFVF9TWU1CT0xfQ09VTlQgKGgpCi0JCQkgICAgKyBnbHVlX3N5bWJvbHMgKCZzeW1ib2xfZ2xvYmFsUCwKLQkJCQkJICAgICZzeW1ib2xfZ2xvYmFsX2xhc3RQKQotCQkJICAgICsgZ2x1ZV9zeW1ib2xzICgmc3ltYm9sX2V4dGVyblAsCi0JCQkJCSAgICAmc3ltYm9sX2V4dGVybl9sYXN0UCkpKTsKLQotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwgdGllX3RhZ3MgKCkpOwotICBrbm93IChzeW1ib2xfZ2xvYmFsUCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2dsb2JhbF9sYXN0UCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2V4dGVyblAgPT0gTlVMTCk7Ci0gIGtub3cgKHN5bWJvbF9leHRlcm5fbGFzdFAgPT0gTlVMTCk7Ci19Ci0KLS8qCi0gKiBGaW5kIHN0cmluZ3MgYnkgY3Jhd2xpbmcgYWxvbmcgc3ltYm9sIHRhYmxlIGNoYWluLgotICovCi0KLXZvaWQKLXdfc3RyaW5ncyAod2hlcmUpCi0gICAgIGNoYXIgKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9oZWFkOwotCi0gIC8qIEdvdHRhIGRvIG1kXyBieXRlLW9yZGVyaW5nIHN0dWZmIGZvciBzdHJpbmdfYnl0ZV9jb3VudCBmaXJzdCAtIEtXSyAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCAodmFsdWVUKSBzdHJpbmdfYnl0ZV9jb3VudCwgNCk7Ci0gIHdoZXJlICs9IDQ7Ci0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZSBtdXN0Ci0gICAgIGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIGNvZmZfaGVhZGVyX2FwcGVuZCBhbmQgd3JpdGVfb2JqZWN0X2ZpbGUuICAqLwotICB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgICAgewotCWlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXQotCSAgICAmJiBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA+IFNDTk5NTEVOKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCSAgICBzaXplID0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgKyAxOwotCSAgICBtZW1jcHkgKHdoZXJlLCBzZWdtZW50X2luZm9baV0ubmFtZSwgc2l6ZSk7Ci0JICAgIHdoZXJlICs9IHNpemU7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZiAvKiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLSAgICAgICBzeW1ib2xQOwotICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HIChzeW1ib2xQKSkKLQl7Ci0JICBzaXplID0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgbWVtY3B5ICh3aGVyZSwgU19HRVRfTkFNRSAoc3ltYm9sUCksIHNpemUpOwotCSAgd2hlcmUgKz0gc2l6ZTsKLQl9Ci0gICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GSUxFCi0JICAmJiBTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyAoc3ltYm9sUCkgPT0gMAotCSAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQKSAhPSAwKQotCXsKLQkgIHNpemUgPSBzdHJsZW4gKGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUpICsgMTsKLQkgIG1lbWNweSAod2hlcmUsIGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUsIHNpemUpOwotCSAgZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9zY2FuIC0+bmV4dDsKLQkgIHdoZXJlICs9IHNpemU7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2xpbmVub3NfZm9yIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotICAgICB1bnNpZ25lZCBsb25nICpmaWxlX2N1cnNvcjsKLXsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgbG9uZyBzdGFydCA9ICpmaWxlX2N1cnNvcjsKLQotICBmb3IgKGlkeCA9IFNFR19FMDsgaWR4IDwgU0VHX0xBU1Q7IGlkeCsrKQotICAgIHsKLSAgICAgIHNlZ21lbnRfaW5mb190eXBlICpzID0gc2VnbWVudF9pbmZvICsgaWR4OwotCi0KLSAgICAgIGlmIChzLT5zY25oZHIuc19ubG5ubyAhPSAwKQotCXsKLQkgIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZV9wdHI7Ci0KLQkgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmJ1ZmZlciA9Ci0JICAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKSB4bWFsbG9jIChzLT5zY25oZHIuc19ubG5ubyAqIExJTkVTWik7Ci0KLQkgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmRzdCA9IGJ1ZmZlcjsKLQotCSAgLyogUnVuIHRocm91Z2ggdGhlIHRhYmxlIHdlJ3ZlIGJ1aWx0IGFuZCB0dXJuIGl0IGludG8gaXRzIGV4dGVybmFsCi0JIGZvcm0sIHRha2UgdGhpcyBjaGFuY2UgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgKi8KLQotCSAgZm9yIChsaW5lX3B0ciA9IHMtPmxpbmVub19saXN0X2hlYWQ7Ci0JICAgICAgIGxpbmVfcHRyICE9IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTDsKLQkgICAgICAgbGluZV9wdHIgPSBsaW5lX3B0ci0+bmV4dCkKLQkgICAgewotCi0JICAgICAgaWYgKGxpbmVfcHRyLT5saW5lLmxfbG5ubyA9PSAwKQotCQl7Ci0JCSAgLyogVHVybiBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgaW50byB0aGUgc3ltYm9scycgaW5kZXggKi8KLQkJICBsaW5lX3B0ci0+bGluZS5sX2FkZHIubF9zeW1uZHggPQotCQkgICAgKChzeW1ib2xTICopIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3N5bW5keCktPnN5X251bWJlcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3BhZGRyICs9ICgoc3RydWN0IGZyYWcgKikgKGxpbmVfcHRyLT5mcmFnKSktPmZyX2FkZHJlc3M7Ci0JCX0KLQotCi0JICAgICAgKHZvaWQpIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJihsaW5lX3B0ci0+bGluZSksIGRzdCk7Ci0JICAgICAgZHN0Kys7Ci0KLQkgICAgfQotCi0JICBzLT5zY25oZHIuc19sbm5vcHRyID0gKmZpbGVfY3Vyc29yOwotCi0JICBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgcy0+c2NuaGRyLnNfbmxubm8gKiBMSU5FU1osIGFiZmQpOwotCSAgZnJlZSAoYnVmZmVyKTsKLQotCSAgKmZpbGVfY3Vyc29yICs9IHMtPnNjbmhkci5zX25sbm5vICogTElORVNaOwotCX0KLSAgICB9Ci0gIEhfU0VUX0xJTkVOT19TSVpFIChoLCAqZmlsZV9jdXJzb3IgLSBzdGFydCk7Ci19Ci0KLQotLyogTm93IHdlIHJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIGZyYWcgY2hhaW5zIGluIGEgc2VnbWVudCBhbmQKLSAgIG1ha2UgYWxsIHRoZSBzdWJzZWdtZW50IGZyYWdzIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZQotICAgbGlzdCwgYXMgaWYgdGhlIHNlZyAwIHdhcyBleHRyYSBsb25nICovCi0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfc3Vic2VncyAoKQotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGZyY2hhaW5TICpoZWFkID0gc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QOwotICAgICAgZnJhZ1MgZHVtbXk7Ci0gICAgICBmcmFnUyAqcHJldl9mcmFnID0gJmR1bW15OwotCi0gICAgICB3aGlsZSAoaGVhZCAmJiBoZWFkLT5mcmNoX3NlZyA9PSBpKQotCXsKLQkgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IGhlYWQtPmZyY2hfcm9vdDsKLQkgIHByZXZfZnJhZyA9IGhlYWQtPmZyY2hfbGFzdDsKLQkgIGhlYWQgPSBoZWFkLT5mcmNoX25leHQ7Ci0JfQotICAgICAgcHJldl9mcmFnLT5mcl9uZXh0ID0gMDsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLWludCBjb2ZmX2ZsYWdzOwotZXh0ZXJuIHZvaWQKLXdyaXRlX29iamVjdF9maWxlICgpCi17Ci0gIGludCBpOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpbl9wdHI7Ci0KLSAgb2JqZWN0X2hlYWRlcnMgaGVhZGVyczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX2N1cnNvcjsKLSAgYmZkICphYmZkOwotICB1bnNpZ25lZCBpbnQgYWRkcjsKLSAgYWJmZCA9IGJmZF9vcGVudyAob3V0X2ZpbGVfbmFtZSwgVEFSR0VUX0ZPUk1BVCk7Ci0KLQotICBpZiAoYWJmZCA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBCRkRfQVJDSCwgbWFjaGluZSk7Ci0KLSAgc3RyaW5nX2J5dGVfY291bnQgPSA0OwotCi0gIGZvciAoZnJjaGFpbl9wdHIgPSBmcmNoYWluX3Jvb3Q7Ci0gICAgICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7Ci0gICAgICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ViLXNlZ21lbnRzIGFuZCBhbGlnbiB0aGVtIHVwLiAgQWxzbwotCSBjbG9zZSBhbnkgb3BlbiBmcmFncy4gIFdlIHRhY2sgYSAuZmlsbCBvbnRvIHRoZSBlbmQgb2YgdGhlCi0JIGZyYWcgY2hhaW4gc28gdGhhdCBhbnkgLmFsaWduJ3Mgc2l6ZSBjYW4gYmUgd29ya2VkIGJ5IGxvb2tpbmcKLQkgYXQgdGhlIG5leHQgZnJhZy4gICovCi0KLSAgICAgIHN1YnNlZ19zZXQgKGZyY2hhaW5fcHRyLT5mcmNoX3NlZywgZnJjaGFpbl9wdHItPmZyY2hfc3Vic2VnKTsKLQotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDEKLSNlbmRpZgotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgICBtZF9kb19hbGlnbiAoU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLCAoY2hhciAqKSBOVUxMLCAwLCAwLAotCQkgICBhbGlnbm1lbnRfZG9uZSk7Ci0jZW5kaWYKLSAgICAgIGZyYWdfYWxpZ24gKFNVQl9TRUdNRU5UX0FMSUdOIChub3dfc2VnKSwKLQkJICBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSA/IE5PUF9PUENPREUgOiAwLAotCQkgIDApOwotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgYWxpZ25tZW50X2RvbmU6Ci0jZW5kaWYKLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19ub3ctPmZyX2ZpeCA9IDA7Ci0gICAgICBrbm93IChmcmFnX25vdy0+ZnJfbmV4dCA9PSBOVUxMKTsKLSAgICB9Ci0KLQotICByZW1vdmVfc3Vic2VncyAoKTsKLQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgcmVsYXhfc2VnbWVudCAoc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3QsIGkpOwotICAgIH0KLQotICBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzLCAwKTsKLQotICAvKiBGaW5kIG91dCBob3cgYmlnIHRoZSBzZWN0aW9ucyBhcmUsIGFuZCBzZXQgdGhlIGFkZHJlc3Nlcy4gICovCi0gIGFkZHIgPSAwOwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGxvbmcgc2l6ZTsKLQotICAgICAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX3BhZGRyID0gYWRkcjsKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc192YWRkciA9IGFkZHI7Ci0KLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzLAotCQkJCSAgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzKSArIDEpOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQkgIC8qIFN1cHBvcnQgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGZvdW5kIGluIFBFLiAgVGhpcyBjb2RlCi0JICAgICBtdXN0IGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIGNvZmZfaGVhZGVyX2FwcGVuZCBhbmQKLQkgICAgIHdfc3RyaW5ncy4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSk7Ci0JICAgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBsZW4gKyAxOwotCSAgfQotI2VuZGlmIC8qIENPRkZfTE9OR19TRUNUSU9OX05BTUVTICovCi0JfQotCi0gICAgICBzaXplID0gc2l6ZV9zZWN0aW9uIChhYmZkLCAodW5zaWduZWQgaW50KSBpKTsKLSAgICAgIGFkZHIgKz0gc2l6ZTsKLQotICAgICAgLyogSSB0aGluayB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgaXMgb25seSB1c2VkIG9uIHRoZSBpOTYwOyB0aGUKLQkgaTk2MCBuZWVkcyBpdCwgYW5kIGl0IHNob3VsZCBkbyBubyBoYXJtIG9uIG90aGVyIHRhcmdldHMuICAqLwotI2lmZGVmIEFMSUdOTUVOVF9JTl9TX0ZMQUdTCi0gICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfZmxhZ3MgfD0gKHNlY3Rpb25fYWxpZ25tZW50W2ldICYgMHhGKSA8PCA4OwotI2Vsc2UKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19hbGlnbiA9IDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbaV07Ci0jZW5kaWYKLQotICAgICAgaWYgKGkgPT0gU0VHX0UwKQotCUhfU0VUX1RFWFRfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgICAgZWxzZSBpZiAoaSA9PSBTRUdfRTEpCi0JSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgc2l6ZSk7Ci0gICAgICBlbHNlIGlmIChpID09IFNFR19FMikKLQlIX1NFVF9CU1NfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgIH0KLQotICAvKiBUdXJuIHRoZSBnYXMgbmF0aXZlIHN5bWJvbCB0YWJsZSBzaGFwZSBpbnRvIGEgY29mZiBzeW1ib2wgdGFibGUgKi8KLSAgY3Jhd2xfc3ltYm9scyAoJmhlYWRlcnMsIGFiZmQpOwotCi0gIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA9PSA0KQotICAgIHN0cmluZ19ieXRlX2NvdW50ID0gMDsKLQotICBIX1NFVF9TVFJJTkdfU0laRSAoJmhlYWRlcnMsIHN0cmluZ19ieXRlX2NvdW50KTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZQotICB0Y19mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGZpeHVwX21kZXBzIChzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdCwgJmhlYWRlcnMsIGkpOwotICAgICAgZml4dXBfc2VnbWVudCAoJnNlZ21lbnRfaW5mb1tpXSwgaSk7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yICIuc3RhYiIgc2VnbWVudHMgYW5kIGZpbGwgaW4gdGhlaXIgaW5pdGlhbCBzeW1ib2xzCi0gICAgIGNvcnJlY3RseS4gKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBuYW1lID0gc2VnbWVudF9pbmZvW2ldLm5hbWU7Ci0KLSAgICAgIGlmIChuYW1lICE9IE5VTEwKLQkgICYmIHN0cm5jbXAgKCIuc3RhYiIsIG5hbWUsIDUpID09IDAKLQkgICYmIHN0cm5jbXAgKCIuc3RhYnN0ciIsIG5hbWUsIDgpICE9IDApCi0JYWRqdXN0X3N0YWJfc2VjdGlvbiAoYWJmZCwgaSk7Ci0gICAgfQotCi0gIGZpbGVfY3Vyc29yID0gSF9HRVRfVEVYVF9GSUxFX09GRlNFVCAoJmhlYWRlcnMpOwotCi0gIGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGZpbGVfY3Vyc29yLCAwKTsKLQotICAvKiBQbGFudCB0aGUgZGF0YSAqLwotCi0gIGZpbGxfc2VjdGlvbiAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgZG9fcmVsb2NzX2ZvciAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgZG9fbGluZW5vc19mb3IgKGFiZmQsICZoZWFkZXJzLCAmZmlsZV9jdXJzb3IpOwotCi0gIEhfU0VUX0ZJTEVfTUFHSUNfTlVNQkVSICgmaGVhZGVycywgQ09GRl9NQUdJQyk7Ci0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QCi0gIEhfU0VUX1RJTUVfU1RBTVAgKCZoZWFkZXJzLCAobG9uZyl0aW1lKCh0aW1lX3QgKikwKSk7Ci0jZWxzZQotICBIX1NFVF9USU1FX1NUQU1QICgmaGVhZGVycywgMCk7Ci0jZW5kaWYKLSNpZmRlZiBUQ19DT0ZGX1NFVF9NQUNISU5FCi0gIFRDX0NPRkZfU0VUX01BQ0hJTkUgKCZoZWFkZXJzKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfRkxBR1MKLSNkZWZpbmUgQ09GRl9GTEFHUyAwCi0jZW5kaWYKLQotI2lmZGVmIEtFRVBfUkVMT0NfSU5GTwotICBIX1NFVF9GTEFHUyAoJmhlYWRlcnMsICgoSF9HRVRfTElORU5PX1NJWkUoJmhlYWRlcnMpID8gMCA6IEZfTE5OTykgfAotCQkJICBDT0ZGX0ZMQUdTIHwgY29mZl9mbGFncykpOwotI2Vsc2UKLSAgSF9TRVRfRkxBR1MgKCZoZWFkZXJzLCAoKEhfR0VUX0xJTkVOT19TSVpFKCZoZWFkZXJzKSAgICAgPyAwIDogRl9MTk5PKSAgIHwKLQkJCSAgKEhfR0VUX1JFTE9DQVRJT05fU0laRSgmaGVhZGVycykgPyAwIDogRl9SRUxGTEcpIHwKLQkJCSAgQ09GRl9GTEFHUyB8IGNvZmZfZmxhZ3MpKTsKLSNlbmRpZgotCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc3ltdGFibGVfc2l6ZSA9IEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFICgmaGVhZGVycyk7Ci0gICAgY2hhciAqYnVmZmVyMSA9IHhtYWxsb2MgKHN5bXRhYmxlX3NpemUgKyBzdHJpbmdfYnl0ZV9jb3VudCArIDEpOwotCi0gICAgSF9TRVRfU1lNQk9MX1RBQkxFX1BPSU5URVIgKCZoZWFkZXJzLCBiZmRfdGVsbCAoYWJmZCkpOwotICAgIHdfc3ltYm9scyAoYWJmZCwgYnVmZmVyMSwgc3ltYm9sX3Jvb3RQKTsKLSAgICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPiAwKQotICAgICAgd19zdHJpbmdzIChidWZmZXIxICsgc3ltdGFibGVfc2l6ZSk7Ci0gICAgYmZkX3dyaXRlIChidWZmZXIxLCAxLCBzeW10YWJsZV9zaXplICsgc3RyaW5nX2J5dGVfY291bnQsIGFiZmQpOwotICAgIGZyZWUgKGJ1ZmZlcjEpOwotICB9Ci0KLSAgY29mZl9oZWFkZXJfYXBwZW5kIChhYmZkLCAmaGVhZGVycyk7Ci0jaWYgMAotICAvKiBSZWNlbnQgY2hhbmdlcyB0byB3cml0ZSBuZWVkIHRoaXMsIGJ1dCB3aGVyZSBpdCBzaG91bGQKLSAgICAgZ28gaXMgdXAgdG8gS2VuLi4gKi8KLSAgaWYgKGJmZF9jbG9zZV9hbGxfZG9uZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgYXNfZmF0YWwgKF8oIkNhbid0IGNsb3NlICVzOiAlcyIpLCBvdXRfZmlsZV9uYW1lLAotCSAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSNlbHNlCi0gIHsKLSAgICBleHRlcm4gYmZkICpzdGRvdXRwdXQ7Ci0gICAgc3Rkb3V0cHV0ID0gYWJmZDsKLSAgfQotI2VuZGlmCi0KLX0KLQotLyogQWRkIGEgbmV3IHNlZ21lbnQuICBUaGlzIGlzIGNhbGxlZCBmcm9tIHN1YnNlZ19uZXcgdmlhIHRoZQotICAgb2JqX25ld19zZWdtZW50IG1hY3JvLiAgKi8KLQotc2VnVAotb2JqX2NvZmZfYWRkX3NlZ21lbnQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZuZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIGNoYXIgYnVmW1NDTk5NTEVOICsgMV07Ci0KLSAgc3RybmNweSAoYnVmLCBuYW1lLCBTQ05OTUxFTik7Ci0gIGJ1ZltTQ05OTUxFTl0gPSAnXDAnOwotICBuYW1lID0gYnVmOwotI2VuZGlmCi0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1QgJiYgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF07IGkrKykKLSAgICBpZiAoc3RyY21wIChuYW1lLCBzZWdtZW50X2luZm9baV0ubmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiAoc2VnVCkgaTsKLQotICBpZiAoaSA9PSBTRUdfTEFTVCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlRvbyBtYW55IG5ldyBzZWN0aW9uczsgY2FuJ3QgYWRkIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgIHJldHVybiBub3dfc2VnOwotICAgIH0KLQotICAvKiBBZGQgYSBuZXcgc2VjdGlvbi4gICovCi0gIHN0cm5jcHkgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCBuYW1lLAotCSAgIHNpemVvZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWUpKTsKLSAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX2ZsYWdzID0gU1RZUF9SRUc7Ci0gIHNlZ21lbnRfaW5mb1tpXS5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgcmV0dXJuIChzZWdUKSBpOwotfQotCi0vKgotICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6Ci0gKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9Ci0gKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCi0gKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQotICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0Ci0gKgkJCQkJCSAncicgZm9yIHJlYWQtb25seSBkYXRhCi0gKiBCdXQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHF1b3RlZCBzdHJpbmcsIHRyZWF0IGl0IGFzIGEKLSAqIHN1YnNlZ21lbnQgbnVtYmVyLgotICovCi0KLXZvaWQKLW9ial9jb2ZmX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogU3RyaXAgb3V0IHRoZSBzZWN0aW9uIG5hbWUgKi8KLSAgY2hhciAqc2VjdGlvbl9uYW1lLCAqbmFtZTsKLSAgY2hhciBjOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBsb25nIGZsYWdzOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBjaGFyIHR5cGU7Ci0KLSAgICAgIHNfbXJpX3NlY3QgKCZ0eXBlKTsKLSAgICAgIGZsYWdzID0gMDsKLSAgICAgIGlmICh0eXBlID09ICdDJykKLQlmbGFncyA9IFNUWVBfVEVYVDsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gJ0QnKQotCWZsYWdzID0gU1RZUF9EQVRBOwotICAgICAgc2VnbWVudF9pbmZvW25vd19zZWddLnNjbmhkci5zX2ZsYWdzIHw9IGZsYWdzOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGV4cCA9IDA7Ci0gIGZsYWdzID0gMDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCWV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInCi0JCSAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQkJewotCQljYXNlICdiJzogZmxhZ3MgfD0gU1RZUF9CU1M7ICAgIGJyZWFrOwotCQljYXNlICdpJzogZmxhZ3MgfD0gU1RZUF9JTkZPOyAgIGJyZWFrOwotCQljYXNlICdsJzogZmxhZ3MgfD0gU1RZUF9MSUI7ICAgIGJyZWFrOwotCQljYXNlICduJzogZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7IGJyZWFrOwotCQljYXNlICdvJzogZmxhZ3MgfD0gU1RZUF9PVkVSOyAgIGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAndyc6IGZsYWdzIHw9IFNUWVBfREFUQTsgICBicmVhazsKLQkJY2FzZSAneCc6IGZsYWdzIHw9IFNUWVBfVEVYVDsgICBicmVhazsKLQkJY2FzZSAncic6IGZsYWdzIHw9IFNUWVBfTElUOwlicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc193YXJuKF8oInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIpLAotCQkJICAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgc3Vic2VnX25ldyAobmFtZSwgKHN1YnNlZ1QpIGV4cCk7Ci0KLSAgc2VnbWVudF9pbmZvW25vd19zZWddLnNjbmhkci5zX2ZsYWdzIHw9IGZsYWdzOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3RleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3Vic2VnX25ldyAoIi50ZXh0IiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9kYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICBzdWJzZWdfbmV3ICgiLnRleHQiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSArIDEwMDApOwotICBlbHNlCi0gICAgc3Vic2VnX25ldyAoIi5kYXRhIiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfaWRlbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7CQkvKiBzYXZlIGN1cnJlbnQgc2VnCSovCi0gIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBzdWJzZWdfbmV3ICgiLmNvbW1lbnQiLCAwKTsJCS8qIC5jb21tZW50IHNlZwkJKi8KLSAgc3RyaW5nZXIgKDEpOwkJCQkvKiByZWFkIHN0cmluZwkJKi8KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsJLyogcmVzdG9yZSBjdXJyZW50IHNlZwkqLwotfQotCi12b2lkCi1jX3N5bWJvbF9tZXJnZSAoZGVidWcsIG5vcm1hbCkKLSAgICAgc3ltYm9sUyAqZGVidWc7Ci0gICAgIHN5bWJvbFMgKm5vcm1hbDsKLXsKLSAgU19TRVRfREFUQV9UWVBFIChub3JtYWwsIFNfR0VUX0RBVEFfVFlQRSAoZGVidWcpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAobm9ybWFsLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWJ1ZykpOwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwpKQotICAgIHsKLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCwgU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpKTsKLSAgICB9CQkJCS8qIHRha2UgdGhlIG1vc3Qgd2UgaGF2ZSAqLwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiAwKQotICAgIHsKLSAgICAgIG1lbWNweSAoKGNoYXIgKikgJm5vcm1hbC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0sCi0JICAgICAgKGNoYXIgKikgJmRlYnVnLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSwKLQkgICAgICAodW5zaWduZWQgaW50KSAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpICogQVVYRVNaKSk7Ci0gICAgfQkJCQkvKiBNb3ZlIGFsbCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCi0KLSAgLyogTW92ZSB0aGUgZGVidWcgZmxhZ3MuICovCi0gIFNGX1NFVF9ERUJVR19GSUVMRCAobm9ybWFsLCBTRl9HRVRfREVCVUdfRklFTEQgKGRlYnVnKSk7Ci19CQkJCS8qIGNfc3ltYm9sX21lcmdlKCkgKi8KLQotc3RhdGljIGludAotY19saW5lX25ldyAoc3ltYm9sLCBwYWRkciwgbGluZV9udW1iZXIsIGZyYWcpCi0gICAgIHN5bWJvbFMgKiBzeW1ib2w7Ci0gICAgIGxvbmcgcGFkZHI7Ci0gICAgIGludCBsaW5lX251bWJlcjsKLSAgICAgZnJhZ1MgKiBmcmFnOwotewotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKm5ld19saW5lID0KLSAgKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaW5lbm9fbGlzdCkpOwotCi0gIHNlZ21lbnRfaW5mb190eXBlICpzID0gc2VnbWVudF9pbmZvICsgbm93X3NlZzsKLSAgbmV3X2xpbmUtPmxpbmUubF9sbm5vID0gbGluZV9udW1iZXI7Ci0KLSAgaWYgKGxpbmVfbnVtYmVyID09IDApCi0gICAgewotICAgICAgbGFzdF9saW5lX3N5bWJvbCA9IHN5bWJvbDsKLSAgICAgIG5ld19saW5lLT5saW5lLmxfYWRkci5sX3N5bW5keCA9IChsb25nKSBzeW1ib2w7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmV3X2xpbmUtPmxpbmUubF9hZGRyLmxfcGFkZHIgPSBwYWRkcjsKLSAgICB9Ci0KLSAgbmV3X2xpbmUtPmZyYWcgPSAoY2hhciAqKSBmcmFnOwotICBuZXdfbGluZS0+bmV4dCA9IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTDsKLQotCi0gIGlmIChzLT5saW5lbm9fbGlzdF9oZWFkID09IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzLT5saW5lbm9fbGlzdF9oZWFkID0gbmV3X2xpbmU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcy0+bGluZW5vX2xpc3RfdGFpbC0+bmV4dCA9IG5ld19saW5lOwotICAgIH0KLSAgcy0+bGluZW5vX2xpc3RfdGFpbCA9IG5ld19saW5lOwotICByZXR1cm4gTElORVNaICogcy0+c2NuaGRyLnNfbmxubm8rKzsKLX0KLQotdm9pZAotY19kb3RfZmlsZV9zeW1ib2wgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX25ldyAoIi5maWxlIiwKLQkJCVNFR19ERUJVRywKLQkJCTAsCi0JCQkmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfRklMRSk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIGlmIChzdHJsZW4gKGZpbGVuYW1lKSA+IEZJTE5NTEVOKQotICAgIHsKLSAgICAgIC8qIEZpbGVuYW1lIGlzIHRvbyBsb25nIHRvIGZpdCBpbnRvIGFuIGF1eGVudCwKLQkgd2Ugc3RpY2sgaXQgaW50byB0aGUgc3RyaW5nIHRhYmxlIGluc3RlYWQuICBXZSBrZWVwCi0JIGEgbGlua2VkIGxpc3Qgb2YgdGhlIGZpbGVuYW1lcyB3ZSBmaW5kIHNvIHdlIGNhbiBlbWl0Ci0JIHRoZW0gbGF0ZXIuKi8KLSAgICAgIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmID0gKChzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqKQotCQkJCSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbmFtZV9saXN0KSkpOwotCi0gICAgICBmLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgICAgZi0+bmV4dCA9IDA7Ci0KLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX1pFUk9TIChzeW1ib2xQLCAwKTsKLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCwgMSk7Ci0KLSAgICAgIGlmIChmaWxlbmFtZV9saXN0X3RhaWwpIAotCWZpbGVuYW1lX2xpc3RfdGFpbC0+bmV4dCA9IGY7Ci0gICAgICBlbHNlCi0JZmlsZW5hbWVfbGlzdF9oZWFkID0gZjsKLSAgICAgIGZpbGVuYW1lX2xpc3RfdGFpbCA9IGY7ICAgICAgCi0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FIChzeW1ib2xQLCBmaWxlbmFtZSk7Ci0gICAgfQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZW5hbWUpOwotICAgICAgfQotCi0gIH0KLQotI2VuZGlmCi0gIFNGX1NFVF9ERUJVRyAoc3ltYm9sUCk7Ci0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBwcmV2aW91c19maWxlX3N5bWJvbCk7Ci0KLSAgcHJldmlvdXNfZmlsZV9zeW1ib2wgPSBzeW1ib2xQOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wgaXMgZmlyc3Qgb24gdGhlIHN5bWJvbCBjaGFpbiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQICE9IHN5bWJvbFApCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW1ib2xQLCBzeW1ib2xfcm9vdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0KLX0JCQkJLyogY19kb3RfZmlsZV9zeW1ib2woKSAqLwotCi0vKgotICogQnVpbGQgYSAnc2VjdGlvbiBzdGF0aWMnIHN5bWJvbC4KLSAqLwotCi1zeW1ib2xTICoKLWNfc2VjdGlvbl9zeW1ib2wgKG5hbWUsIGlkeCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGlkeDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgRE9fTk9UX1NUUklQKTsKLSAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLSAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgaWR4LCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBlbHNlCi0gICAgewotICAgICAgLyogTW1tbS4gIEkganVzdCBsb3ZlIHZpb2xhdGluZyBpbnRlcmZhY2VzLiAgTWFrZXMgbWUgZmVlbC4uLmRpcnR5LiAgKi8KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGlkeCk7Ci0gICAgICBzeW1ib2xQLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgIH0KLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1NUQVQpOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQotICBTRl9TRVRfU1RBVElDUyAoc3ltYm9sUCk7Ci0KLSNpZmRlZiBURV9ERUxUQQotICAvKiBtYW5mcmVkQHMtZGlyZWt0bmV0LmRlOiBzZWN0aW9uIHN5bWJvbHMgKm11c3QqIGhhdmUgdGhlIExPQ0FMIGJpdCBjbGVhcmVkLAotICAgICB3aGljaCBpcyBzZXQgYnkgdGhlIG5ldyBkZWZpbml0aW9uIG9mIExPQ0FMX0xBQkVMIGluIHRjLW02OGsuaC4gICovCi0gIFNGX0NMRUFSX0xPQ0FMIChzeW1ib2xQKTsKLSNlbmRpZgotI2lmZGVmIFRFX1BFCi0gIC8qIElmIHRoZSAubGlua29uY2UgcHNldWRvLW9wIHdhcyB1c2VkIGZvciB0aGlzIHNlY3Rpb24sIHdlIG11c3QKLSAgICAgc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBhdXhpbGlhcnkgZW50cnkgZm9yIHRoZSBzZWN0aW9uCi0gICAgIHN5bWJvbC4gICovCi0gIGlmIChzZWdtZW50X2luZm9baWR4XS5saW5rb25jZSAhPSBMSU5LT05DRV9VTlNFVCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLQotICAgICAgc3dpdGNoIChzZWdtZW50X2luZm9baWR4XS5saW5rb25jZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgTElOS09OQ0VfRElTQ0FSRDoKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWTsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfT05FX09OTFk6Ci0JICB0eXBlID0gSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVM7Ci0JICBicmVhazsKLQljYXNlIExJTktPTkNFX1NBTUVfU0laRToKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRTsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfU0FNRV9DT05URU5UUzoKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBTWU1fQVVYRU5UIChzeW1ib2xQKS0+eF9zY24ueF9jb21kYXQgPSB0eXBlOwotICAgIH0KLSNlbmRpZiAvKiBURV9QRSAqLwotCi0gIHJldHVybiBzeW1ib2xQOwotfQkJCQkvKiBjX3NlY3Rpb25fc3ltYm9sKCkgKi8KLQotc3RhdGljIHZvaWQKLXdfc3ltYm9scyAoYWJmZCwgd2hlcmUsIHN5bWJvbF9yb290UCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIHN5bWJvbFMgKiBzeW1ib2xfcm9vdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEZpcnN0IGZpbGwgaW4gdGhvc2UgdmFsdWVzIHdlIGhhdmUgb25seSBqdXN0IHdvcmtlZCBvdXQgKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc2VnbWVudF9pbmZvW2ldLmRvdDsKLSAgICAgIGlmIChzeW1ib2xQKQotCXsKLQkgIFNBX1NFVF9TQ05fU0NOTEVOIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfc2l6ZSk7Ci0JICBTQV9TRVRfU0NOX05SRUxPQyAoc3ltYm9sUCwgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25yZWxvYyk7Ci0JICBTQV9TRVRfU0NOX05MSU5OTyAoc3ltYm9sUCwgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25sbm5vKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAgICogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uCi0gICAgICovCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBVc2VkIHRvIHNhdmUgdGhlIG9mZnNldCBvZiB0aGUgbmFtZS4gSXQgaXMgdXNlZCB0byBwb2ludAotCSAgICAgICB0byB0aGUgc3RyaW5nIGluIG1lbW9yeSBidXQgbXVzdCBiZSBhIGZpbGUgb2Zmc2V0LiAqLwotICAgICAgcmVnaXN0ZXIgY2hhciAqdGVtcDsKLQotICAgICAgLyogV2UgY2FuJ3QgZml4IHRoZSBsbm5vcHRyIGZpZWxkIGluIHlhbmtfc3ltYm9scyB3aXRoIHRoZSBvdGhlcgotICAgICAgICAgYWRqdXN0bWVudHMsIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IHVudGlsIHdlIGtub3cgd2hlcmUgdGhleQotICAgICAgICAgZ28gaW4gdGhlIGZpbGUuICAqLwotICAgICAgaWYgKFNGX0dFVF9BREpfTE5OT1BUUiAoc3ltYm9sUCkpCi0JewotCSAgU0FfR0VUX1NZTV9MTk5PUFRSIChzeW1ib2xQKSArPQotCSAgICBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sUCldLnNjbmhkci5zX2xubm9wdHI7Ci0JfQotCi0gICAgICB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHN5bWJvbFApOwotCi0gICAgICB0ZW1wID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gICAgICBpZiAoU0ZfR0VUX1NUUklORyAoc3ltYm9sUCkpCi0JewotCSAgU19TRVRfT0ZGU0VUIChzeW1ib2xQLCBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCk7Ci0JICBTX1NFVF9aRVJPRVMgKHN5bWJvbFAsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1zZXQgKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl9uYW1lLCAwLCBTWU1OTUxFTik7Ci0JICBzdHJuY3B5IChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbmFtZSwgdGVtcCwgU1lNTk1MRU4pOwotCX0KLSAgICAgIHdoZXJlID0gc3ltYm9sX3RvX2NoYXJzIChhYmZkLCB3aGVyZSwgc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9OQU1FIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci0KLX0JCQkJLyogd19zeW1ib2xzKCkgKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xjb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfbGNvbW0oMCk7Ci0gIHJldHVybjsKLSNpZiAwCi0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgaW50IHRlbXA7Ci0gIGNoYXIgKnA7Ci0KLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk1pc3Npbmcgc2l6ZSBleHByZXNzaW9uIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygibGNvbW0gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UobmFtZSk7Ci0KLSAgaWYgKFNfR0VUX1NFR01FTlQoc3ltYm9sUCkgPT0gU0VHX1VOS05PV04gJiYKLSAgICAgIFNfR0VUX1ZBTFVFKHN5bWJvbFApID09IDApCi0gICAgewotICAgICAgaWYgKCEgbmVlZF9wYXNzXzIpCi0JewotCSAgY2hhciAqcDsKLQkgIHNlZ1QgY3VycmVudF9zZWcgPSBub3dfc2VnOyAJLyogc2F2ZSBjdXJyZW50IHNlZyAgICAgKi8KLQkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JICBzdWJzZWdfc2V0IChTRUdfRTIsIDEpOwotCSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgcCA9IGZyYWdfdmFyKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAotCQkgICAgICAgKG9mZnNldFQpIHRlbXAsIChjaGFyICopIDApOwotCSAgKnAgPSAwOwotCSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsgLyogcmVzdG9yZSBjdXJyZW50IHNlZyAqLwotCSAgU19TRVRfU0VHTUVOVChzeW1ib2xQLCBTRUdfRTIpOwotCSAgU19TRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQLCBDX1NUQVQpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQoXygiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZCIpLCBuYW1lKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lKCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLWZpeHVwX21kZXBzIChmcmFncywgaCwgdGhpc19zZWdtZW50KQotICAgICBmcmFnUyAqIGZyYWdzOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50OwotewotICBzdWJzZWdfY2hhbmdlICh0aGlzX3NlZ21lbnQsIDApOwotICB3aGlsZSAoZnJhZ3MpCi0gICAgewotICAgICAgc3dpdGNoIChmcmFncy0+ZnJfdHlwZSkKLQl7Ci0JY2FzZSByc19hbGlnbjoKLQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JY2FzZSByc19vcmc6Ci0jaWZkZWYgSEFORExFX0FMSUdOCi0JICBIQU5ETEVfQUxJR04gKGZyYWdzKTsKLSNlbmRpZgotCSAgZnJhZ3MtPmZyX3R5cGUgPSByc19maWxsOwotCSAgZnJhZ3MtPmZyX29mZnNldCA9Ci0JICAgICgoZnJhZ3MtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFncy0+ZnJfYWRkcmVzcyAtIGZyYWdzLT5mcl9maXgpCi0JICAgICAvIGZyYWdzLT5mcl92YXIpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgIG1kX2NvbnZlcnRfZnJhZyAoaCwgdGhpc19zZWdtZW50LCBmcmFncyk7Ci0JICBmcmFnX3dhbmUgKGZyYWdzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICA7Ci0JfQotICAgICAgZnJhZ3MgPSBmcmFncy0+ZnJfbmV4dDsKLSAgICB9Ci19Ci0KLSNpZiAxCi0KLSNpZm5kZWYgVENfRk9SQ0VfUkVMT0NBVElPTgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgMAotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1maXh1cF9zZWdtZW50IChzZWdQLCB0aGlzX3NlZ21lbnRfdHlwZSkKLSAgICAgc2VnbWVudF9pbmZvX3R5cGUgKiBzZWdQOwotICAgICBzZWdUIHRoaXNfc2VnbWVudF90eXBlOwotewotICByZWdpc3RlciBmaXhTICogZml4UDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqYWRkX3N5bWJvbFA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN1Yl9zeW1ib2xQOwotICBsb25nIGFkZF9udW1iZXI7Ci0gIHJlZ2lzdGVyIGludCBzaXplOwotICByZWdpc3RlciBjaGFyICpwbGFjZTsKLSAgcmVnaXN0ZXIgbG9uZyB3aGVyZTsKLSAgcmVnaXN0ZXIgY2hhciBwY3JlbDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBzZWdUIGFkZF9zeW1ib2xfc2VnbWVudCA9IGFic29sdXRlX3NlY3Rpb247Ci0KLSAgZm9yIChmaXhQID0gc2VnUC0+Zml4X3Jvb3Q7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGZyYWdQID0gZml4UC0+ZnhfZnJhZzsKLSAgICAgIGtub3cgKGZyYWdQKTsKLSAgICAgIHdoZXJlID0gZml4UC0+Znhfd2hlcmU7Ci0gICAgICBwbGFjZSA9IGZyYWdQLT5mcl9saXRlcmFsICsgd2hlcmU7Ci0gICAgICBzaXplID0gZml4UC0+Znhfc2l6ZTsKLSAgICAgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3k7Ci0gICAgICBzdWJfc3ltYm9sUCA9IGZpeFAtPmZ4X3N1YnN5OwotICAgICAgYWRkX251bWJlciA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgIHBjcmVsID0gZml4UC0+ZnhfcGNyZWw7Ci0KLSAgICAgIC8qIFdlIHdhbnQgZnVuY3Rpb24tcmVsYXRpdmUgc3RhYnMgdG8gd29yayBvbiBzeXN0ZW1zIHdoaWNoCi0JIG1heSB1c2UgYSByZWxheGluZyBsaW5rZXI7IHRodXMgd2UgbXVzdCBoYW5kbGUgdGhlIHN5bTEtc3ltMgotCSBmaXh1cHMgZnVuY3Rpb24tcmVsYXRpdmUgc3RhYnMgZ2VuZXJhdGVzLgotCi0JIE9mIGNvdXJzZSwgaWYgeW91IGFjdHVhbGx5IGVuYWJsZSByZWxheGluZyBpbiB0aGUgbGlua2VyLCB0aGUKLQkgbGluZSBhbmQgYmxvY2sgc2NvcGluZyBpbmZvcm1hdGlvbiBpcyBnb2luZyB0byBiZSBpbmNvcnJlY3QKLQkgaW4gc29tZSBjYXNlcy4gIFRoZSBvbmx5IHdheSB0byByZWFsbHkgZml4IHRoaXMgaXMgdG8gc3VwcG9ydAotCSBhIHJlbG9jIGludm9sdmluZyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4gICovCi0gICAgICBpZiAobGlua3JlbGF4Ci0JICAmJiAoIXN1Yl9zeW1ib2xQIHx8IHBjcmVsKSkKLQljb250aW51ZTsKLQotI2lmZGVmIFRDX0k5NjAKLSAgICAgIGlmIChmaXhQLT5meF90Y2JpdCAmJiBTRl9HRVRfQ0FMTE5BTUUgKGFkZF9zeW1ib2xQKSkKLQl7Ci0JICAvKiBSZWxvY2F0aW9uIHNob3VsZCBiZSBkb25lIHZpYSB0aGUgYXNzb2NpYXRlZCAnYmFsJyBlbnRyeQotCSAgICAgcG9pbnQgc3ltYm9sLiAqLwotCi0JICBpZiAoIVNGX0dFVF9CQUxOQU1FICh0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiTm8gJ2JhbCcgZW50cnkgcG9pbnQgZm9yIGxlYWZwcm9jICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoYWRkX3N5bWJvbFApKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApOwotCX0KLSNlbmRpZgotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkOyB0aGlzIG1heSBub3QgaGF2ZQotICAgICAgICAgaGFwcGVuZWQgaWYgdGhlc2UgYXJlIGV4cHJlc3Npb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCAmJiAhIGFkZF9zeW1ib2xQLT5zeV9yZXNvbHZlZCkKLQlyZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbFAsIDEpOwotCi0gICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB0aGlzIGZpeHVwIGlzIGFnYWluc3QgYSBzeW1ib2wgd2hpY2ggaGFzIGJlZW4gZXF1YXRlZAotCSAgICAgdG8gYW5vdGhlciBzeW1ib2wsIGNvbnZlcnQgaXQgdG8gdGhlIG90aGVyIHN5bWJvbC4gICovCi0JICBpZiAoYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAmJiAoISBTX0lTX0RFRklORUQgKGFkZF9zeW1ib2xQKQotCQkgIHx8IFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChhZGRfc3ltYm9sUCkKLQkJCSB8fCBTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKSkKLQkJewotCQkgIHN5bWJvbFMgKm47Ci0KLQkJICAvKiBXZSBtdXN0IGF2b2lkIGxvb3BpbmcsIGFzIHRoYXQgY2FuIG9jY3VyIHdpdGggYQotCQkgICAgIGJhZGx5IHdyaXR0ZW4gcHJvZ3JhbS4gICovCi0JCSAgbiA9IGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JCSAgaWYgKG4gPT0gYWRkX3N5bWJvbFApCi0JCSAgICBicmVhazsKLQkJICBhZGRfbnVtYmVyICs9IGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0JCSAgYWRkX3N5bWJvbFAgPSBuOwotCQl9Ci0JICAgICAgZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUDsKLQkgICAgICBmaXhQLT5meF9vZmZzZXQgPSBhZGRfbnVtYmVyOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc3ViX3N5bWJvbFAgIT0gTlVMTCAmJiAhIHN1Yl9zeW1ib2xQLT5zeV9yZXNvbHZlZCkKLQlyZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ViX3N5bWJvbFAsIDEpOwotCi0gICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTAotCSAgJiYgYWRkX3N5bWJvbFAtPnN5X21yaV9jb21tb24pCi0JewotCSAga25vdyAoYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCSAgZml4UC0+Znhfb2Zmc2V0ID0gYWRkX251bWJlcjsKLQkgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotCX0KLQotICAgICAgaWYgKGFkZF9zeW1ib2xQKQotCXsKLQkgIGFkZF9zeW1ib2xfc2VnbWVudCA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKTsKLQl9CQkJLyogaWYgdGhlcmUgaXMgYW4gYWRkZW5kICovCi0KLSAgICAgIGlmIChzdWJfc3ltYm9sUCkKLQl7Ci0JICBpZiAoYWRkX3N5bWJvbFAgPT0gTlVMTCB8fCBhZGRfc3ltYm9sX3NlZ21lbnQgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMKQotCQl7Ci0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCQkgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIEl0J3MganVzdCAtc3ltLiAgKi8KLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pCi0JCXsKLQkJICBhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSAwOwotCQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0jaWZuZGVmIFRDX002OEsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiTmVnYXRpdmUgb2Ygbm9uLWFic29sdXRlIHN5bWJvbCAlcyIpLAotCQkJCVNfR0VUX05BTUUgKHN1Yl9zeW1ib2xQKSk7Ci0jZW5kaWYKLQkJICBhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JCX0JCS8qIG5vdCBhYnNvbHV0ZSAqLwotCi0JICAgICAgLyogaWYgc3ViX3N5bWJvbCBpcyBpbiB0aGUgc2FtZSBzZWdtZW50IHRoYXQgYWRkX3N5bWJvbAotCQkgYW5kIGFkZF9zeW1ib2wgaXMgZWl0aGVyIGluIERBVEEsIFRFWFQsIEJTUyBvciBBQlNPTFVURSAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWRkX3N5bWJvbF9zZWdtZW50Ci0JCSAgICYmIFNFR19OT1JNQUwgKGFkZF9zeW1ib2xfc2VnbWVudCkpCi0JICAgIHsKLQkgICAgICAvKiBEaWZmZXJlbmNlIG9mIDIgc3ltYm9scyBmcm9tIHNhbWUgc2VnbWVudC4gIENhbid0Ci0JCSBtYWtlIGRpZmZlcmVuY2Ugb2YgMiB1bmRlZmluZWRzOiAndmFsdWUnIG1lYW5zCi0JCSBzb21ldGhpbmcgZGlmZmVyZW50IGZvciBOX1VOREYuICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIE1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBvZiAyIGFyYml0cmFyeSBzeW1ib2xzCi0JICAgICAgICAgYXMgdGhlIHRhcmdldCBvZiBhIGNhbGwgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChmaXhQLT5meF90Y2JpdCkKLQkJewotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIDIgc3ltYm9scyIpKTsKLQkJfQotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCkgLQotCQlTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCSAgICAgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQotCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCXsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotI2lmZGVmIFRDX002OEsgLyogaXMgdGhpcyByaWdodD8gKi8KLQkJICBwY3JlbCA9IDA7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAwOwotI2VuZGlmCi0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW50IHNlZ21lbnRzIGluIHN1YnRyYWN0aW9uLiAqLwotCSAgICAgIGtub3cgKCEoU19JU19FWFRFUk5BTCAoc3ViX3N5bWJvbFApICYmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpKTsKLQotCSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKQotCQl7Ci0JCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCQl9Ci0jaWZkZWYgRElGRl9FWFBSX09LCi0JICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IHRoaXNfc2VnbWVudF90eXBlCi0jaWYgMCAvKiBPa2F5IGZvciA2OGssIGF0IGxlYXN0Li4uICovCi0JCSAgICAgICAmJiAhcGNyZWwKLSNlbmRpZgotCQkgICAgICAgKQotCQl7Ci0JCSAgLyogTWFrZSBpdCBwYy1yZWxhdGl2ZS4gICovCi0JCSAgYWRkX251bWJlciArPSAobWRfcGNyZWxfZnJvbSAoZml4UCkKLQkJCQkgLSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApKTsKLQkJICBwY3JlbCA9IDE7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAxOwotCQkgIHN1Yl9zeW1ib2xQID0gMDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCX0KLSNlbmRpZgotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJDYW4ndCBlbWl0IHJlbG9jIHstICVzLXNlZyBzeW1ib2wgXCIlc1wifSBAIGZpbGUgYWRkcmVzcyAlbGQuIiksCi0JCQkJc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkpLAotCQkJCVNfR0VUX05BTUUgKHN1Yl9zeW1ib2xQKSwKLQkJCQkobG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKLQkJfQkJLyogaWYgYWJzb2x1dGUgKi8KLQkgICAgfQotCX0JCQkvKiBpZiBzdWJfc3ltYm9sUCAqLwotCi0gICAgICBpZiAoYWRkX3N5bWJvbFApCi0JewotCSAgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSB0aGlzX3NlZ21lbnRfdHlwZSAmJiBwY3JlbCkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogVGhpcyBmaXh1cCB3YXMgbWFkZSB3aGVuIHRoZSBzeW1ib2wncyBzZWdtZW50IHdhcwotCSAgICAgICAqIFNFR19VTktOT1dOLCBidXQgaXQgaXMgbm93IGluIHRoZSBsb2NhbCBzZWdtZW50LgotCSAgICAgICAqIFNvIHdlIGtub3cgaG93IHRvIGRvIHRoZSBhZGRyZXNzIHdpdGhvdXQgcmVsb2NhdGlvbi4KLQkgICAgICAgKi8KLSNpZmRlZiBUQ19JOTYwCi0JICAgICAgLyogcmVsb2NfY2FsbGooKSBtYXkgcmVwbGFjZSBhICdjYWxsJyB3aXRoIGEgJ2NhbGxzJyBvciBhICdiYWwnLAotCSAgICAgICAqIGluIHdoaWNoIGNhc2VzIGl0IG1vZGlmaWVzICpmaXhQIGFzIGFwcHJvcHJpYXRlLiAgSW4gdGhlIGNhc2UKLQkgICAgICAgKiBvZiBhICdjYWxscycsIG5vIGZ1cnRoZXIgd29yayBpcyByZXF1aXJlZCwgYW5kICpmaXhQIGhhcyBiZWVuCi0JICAgICAgICogc2V0IHVwIHRvIG1ha2UgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgYmVsb3cgYSBuby1vcC4KLQkgICAgICAgKi8KLQkgICAgICByZWxvY19jYWxsaiAoZml4UCk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0JICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCSAgICAgIGFkZF9udW1iZXIgLT0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0KLQkgICAgICAvKiBXZSB1c2VkIHRvIGRvCi0JCSAgIGFkZF9udW1iZXIgLT0gc2VnUC0+c2NuaGRyLnNfdmFkZHI7Ci0JCSBpZiBkZWZpbmVkIChUQ19JMzg2KSB8fCBkZWZpbmVkIChURV9MWU5YKS4gIEkgbm93Ci0JCSB0aGluayB0aGF0IHdhcyBhbiBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIGNhc2Ugd2hlbgotCQkgd2UgYXJlIGdvaW5nIHRvIGVtaXQgdGhlIHJlbG9jYXRpb24uICBJZiB3ZSBhcmUgbm90Ci0JCSBnb2luZyB0byBlbWl0IHRoZSByZWxvY2F0aW9uLCB0aGVuIHdlIGp1c3Qgd2FudCB0bwotCQkgc2V0IGFkZF9udW1iZXIgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9scy4KLQkJIFRoaXMgaXMgYSBjYXNlIHRoYXQgd291bGQgb25seSBhcmlzZSB3aGVuIHRoZXJlIGlzIGEKLQkJIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSBmcm9tIGEgc2VjdGlvbiBvdGhlciB0aGFuIC50ZXh0Ci0JCSB0byBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBzYW1lIHNlY3Rpb24sIGFuZCB0aGUKLQkJIHJlZmVyZW5jZSBpcyBub3QgcmVsYXhlZC4gIFNpbmNlIGp1bXAgaW5zdHJ1Y3Rpb25zIG9uCi0JCSB0aGUgaTM4NiBhcmUgcmVsYXhlZCwgdGhpcyBjb3VsZCBvbmx5IGFyaXNlIHdpdGggYQotCQkgY2FsbCBpbnN0cnVjdGlvbi4gICovCi0KLQkgICAgICBwY3JlbCA9IDA7CS8qIExpZS4gRG9uJ3Qgd2FudCBmdXJ0aGVyIHBjcmVsIHByb2Nlc3NpbmcuICovCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJewotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9kb25lID0gMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGFkZF9zeW1ib2xfc2VnbWVudCkKLQkJewotCQljYXNlIGFic29sdXRlX3NlY3Rpb246Ci0jaWZkZWYgVENfSTk2MAotCQkgIHJlbG9jX2NhbGxqIChmaXhQKTsJLyogU2VlIGNvbW1lbnQgYWJvdXQgcmVsb2NfY2FsbGooKSBhYm92ZSovCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkJICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0KLQkJICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQkgICAgewotCQkgICAgICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCi0KLSNpZiBkZWZpbmVkKFRDX0EyOUspIHx8IChkZWZpbmVkKFRFX1BFKSAmJiBkZWZpbmVkKFRDX0kzODYpKSB8fCBkZWZpbmVkKFRDX004OEspCi0JCSAgLyogVGhpcyByZWFsbHkgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIGxpbmtlciwgYnV0Ci0JCSAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3JiaWRzLiAgKi8KLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0jZWxzZQotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKSArCi0JCSAgICBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApXS5zY25oZHIuc19wYWRkcjsKLSNlbmRpZgotCQkgIGJyZWFrOwotCi0JCWNhc2UgU0VHX1VOS05PV046Ci0jaWZkZWYgVENfSTk2MAotCQkgIGlmICgoaW50KSBmaXhQLT5meF9iaXRfZml4UCA9PSAxMykKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIENPQlIgaW5zdHJ1Y3Rpb24uICBUaGV5IGhhdmUgb25seSBhCi0JCSAgICAgICAqIDEzLWJpdCBkaXNwbGFjZW1lbnQgYW5kIGFyZSBvbmx5IHRvIGJlIHVzZWQKLQkJICAgICAgICogZm9yIGxvY2FsIGJyYW5jaGVzOiBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZQotCQkgICAgICAgKiByZWxvY2F0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCSAgICBfKCJjYW4ndCB1c2UgQ09CUiBmb3JtYXQgd2l0aCBleHRlcm5hbCBsYWJlbCIpKTsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgICAgICBmaXhQLT5meF9kb25lID0gMTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9CQkvKiBDT0JSICovCi0jZW5kaWYgLyogVENfSTk2MCAqLwotI2lmICgoZGVmaW5lZCAoVENfSTM4NikgfHwgZGVmaW5lZCAoVEVfTFlOWCkgfHwgZGVmaW5lZCAoVEVfQVVYKSkgJiYgIWRlZmluZWQoVEVfUEUpKSB8fCBkZWZpbmVkIChDT0ZGX0NPTU1PTl9BRERFTkQpCi0JCSAgLyogMzg2IENPRkYgdXNlcyBhIHBlY3VsaWFyIGZvcm1hdCBpbiB3aGljaCB0aGUKLQkJICAgICB2YWx1ZSBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgc3RvcmVkIGluIHRoZSAudGV4dAotCQkgICAgIHNlZ21lbnQgKEkndmUgY2hlY2tlZCB0aGlzIG9uIFNWUjMuMiBhbmQgU0NPCi0JCSAgICAgMy4yLjIpIElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gICovCi0JCSAgLyogVGhpcyBpcyBhbHNvIHRydWUgZm9yIDY4ayBDT0ZGIG9uIHN5c3YgbWFjaGluZXMKLQkJICAgICAoQ2hlY2tlZCBvbiBNb3Rvcm9sYSBzeXN2NjggUjNWNiBhbmQgUjNWNy4xLCBhbmQgYWxzbyBvbgotCQkgICAgIFVOSVggU3lzdGVtIFYvTTY4MDAwLCBSZWxlYXNlIDEuMCBmcm9tIEFUVC9CZWxsIExhYnMpCi0JCSAgICAgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4gKi8KLQkJICBpZiAoU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkKLQkJICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLSNlbmRpZgotCQkgIGJyZWFrOwotCi0KLQkJfQkJLyogc3dpdGNoIG9uIHN5bWJvbCBzZWcgKi8KLQkgICAgfQkJCS8qIGlmIG5vdCBpbiBsb2NhbCBzZWcgKi8KLQl9CQkJLyogaWYgdGhlcmUgd2FzIGEgKyBzeW1ib2wgKi8KLQotICAgICAgaWYgKHBjcmVsKQotCXsKLSNpZiAhZGVmaW5lZChUQ19NODhLKSAmJiAhKGRlZmluZWQoVEVfUEUpICYmIGRlZmluZWQoVENfSTM4NikpICYmICFkZWZpbmVkKFRDX0EyOUspCi0JICAvKiBUaGlzIGFkanVzdG1lbnQgaXMgbm90IGNvcnJlY3Qgb24gdGhlIG04OGssIGZvciB3aGljaCB0aGUKLQkgICAgIGxpbmtlciBkb2VzIGFsbCB0aGUgY29tcHV0YXRpb24uICAqLwotCSAgYWRkX251bWJlciAtPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLSNlbmRpZgotCSAgaWYgKGFkZF9zeW1ib2xQID09IDApCi0JICAgIHsKLQkgICAgICBmaXhQLT5meF9hZGRzeSA9ICZhYnNfc3ltYm9sOwotCSAgICB9CQkJLyogaWYgdGhlcmUncyBhbiBhZGRfc3ltYm9sICovCi0jaWYgZGVmaW5lZCAoVENfSTM4NikgfHwgZGVmaW5lZCAoVEVfTFlOWCkgfHwgZGVmaW5lZCAoVENfSTk2MCkgfHwgZGVmaW5lZCAoVENfTTY4SykKLQkgIC8qIE9uIHRoZSAzODYgd2UgbXVzdCBhZGp1c3QgYnkgdGhlIHNlZ21lbnQgdmFkZHIgYXMgd2VsbC4KLQkgICAgIElhbiBUYXlsb3IuCi0KLQkgICAgIEkgY2hhbmdlZCB0aGUgaTk2MCB0byB3b3JrIHRoaXMgd2F5IGFzIHdlbGwuICBUaGlzIGlzCi0JICAgICBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgR05VIGxpbmtlciBiZWhhdmlvdXIuICBJIGRvCi0JICAgICBub3Qga25vdyB3aGF0IG90aGVyIGk5NjAgQ09GRiBhc3NlbWJsZXJzIGRvLiAgVGhpcyBpcyBub3QKLQkgICAgIGEgY29tbW9uIGNhc2U6IG5vcm1hbGx5LCBvbmx5IGFzc2VtYmxlciBjb2RlIHdpbGwgY29udGFpbgotCSAgICAgYSBQQyByZWxhdGl2ZSByZWxvYywgYW5kIG9ubHkgYnJhbmNoZXMgd2hpY2ggZG8gbm90Ci0JICAgICBvcmlnaW5hdGUgaW4gdGhlIC50ZXh0IHNlY3Rpb24gd2lsbCBoYXZlIGEgbm9uLXplcm8KLQkgICAgIGFkZHJlc3MuCi0KLQkgICAgIEkgY2hhbmdlZCB0aGUgbTY4ayB0byB3b3JrIHRoaXMgd2F5IGFzIHdlbGwuICBUaGlzIHdpbGwKLQkgICAgIGJyZWFrIGV4aXN0aW5nIFBDIHJlbGF0aXZlIHJlbG9jcyBmcm9tIHNlY3Rpb25zIHdoaWNoIGRvCi0JICAgICBub3Qgc3RhcnQgYXQgYWRkcmVzcyAwLCBidXQgaXQgd2lsbCBtYWtlIGxkIC1yIHdvcmsuCi0JICAgICBJYW4gVGF5bG9yLCA0IE9jdCA5Ni4gICovCi0KLQkgIGFkZF9udW1iZXIgLT0gc2VnUC0+c2NuaGRyLnNfdmFkZHI7Ci0jZW5kaWYKLQl9CQkJLyogaWYgcGNyZWwgKi8KLQotI2lmZGVmIE1EX0FQUExZX0ZJWDMKLSAgICAgIG1kX2FwcGx5X2ZpeDMgKGZpeFAsICh2YWx1ZVQgKikgJmFkZF9udW1iZXIsIHRoaXNfc2VnbWVudF90eXBlKTsKLSNlbHNlCi0gICAgICBtZF9hcHBseV9maXggKGZpeFAsIGFkZF9udW1iZXIpOwotI2VuZGlmCi0KLSAgICAgIGlmICghZml4UC0+ZnhfYml0X2ZpeFAgJiYgISBmaXhQLT5meF9ub19vdmVyZmxvdykKLQl7Ci0jaWZuZGVmIFRDX004OEsKLQkgIC8qIFRoZSBtODhrIHVzZXMgdGhlIG9mZnNldCBmaWVsZCBvZiB0aGUgcmVsb2MgdG8gZ2V0IGFyb3VuZAotCSAgICAgdGhpcyBwcm9ibGVtLiAgKi8KLQkgIGlmICgoc2l6ZSA9PSAxCi0JICAgICAgICYmICgoYWRkX251bWJlciAmIH4weEZGKQotCQkgICB8fCAoZml4UC0+Znhfc2lnbmVkICYmIChhZGRfbnVtYmVyICYgMHg4MCkpKQotCSAgICAgICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRikgIT0gKC0xICYgfjB4RkYpCi0JCSAgIHx8IChhZGRfbnVtYmVyICYgMHg4MCkgPT0gMCkpCi0JICAgICAgfHwgKHNpemUgPT0gMgotCQkgICYmICgoYWRkX251bWJlciAmIH4weEZGRkYpCi0JCSAgICAgIHx8IChmaXhQLT5meF9zaWduZWQgJiYgKGFkZF9udW1iZXIgJiAweDgwMDApKSkKLQkJICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRkZGKSAhPSAoLTEgJiB+MHhGRkZGKQotCQkgICAgICB8fCAoYWRkX251bWJlciAmIDB4ODAwMCkgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgIF8oIlZhbHVlIG9mICVsZCB0b28gbGFyZ2UgZm9yIGZpZWxkIG9mICVkIGJ5dGVzIGF0IDB4JWx4IiksCi0JCQkgICAgKGxvbmcpIGFkZF9udW1iZXIsIHNpemUsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7Ci0JICAgIH0KLSNlbmRpZgotI2lmZGVmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKLQkgIC8qIFdhcm4gaWYgYSAud29yZCB2YWx1ZSBpcyB0b28gbGFyZ2Ugd2hlbiB0cmVhdGVkIGFzIGEKLQkgICAgIHNpZ25lZCBudW1iZXIuICBXZSBhbHJlYWR5IGtub3cgaXQgaXMgbm90IHRvbyBuZWdhdGl2ZS4KLQkgICAgIFRoaXMgaXMgdG8gY2F0Y2ggb3Zlci1sYXJnZSBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uCi0JICAgICB0aGUgNjhrLiAgKi8KLQkgIGlmICghZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2sKLQkgICAgICAmJiBzaXplID09IDIKLQkgICAgICAmJiBhZGRfbnVtYmVyID4gMHg3ZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIlNpZ25lZCAud29yZCBvdmVyZmxvdzsgc3dpdGNoIG1heSBiZSB0b28gbGFyZ2U7ICVsZCBhdCAweCVseCIpLAotCQkJICAobG9uZykgYWRkX251bWJlciwKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7Ci0jZW5kaWYKLQl9CQkJLyogbm90IGEgYml0IGZpeCAqLwotICAgIH0JCQkJLyogRm9yIGVhY2ggZml4UyBpbiB0aGlzIHNlZ21lbnQuICovCi19CQkJCS8qIGZpeHVwX3NlZ21lbnQoKSAqLwotCi0jZW5kaWYKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWIgc2VjdGlvbiBpcyBzcGVjaWFsLiAgKi8KLQotdm9pZAotb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnN0YWJzdHJfbmFtZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBNYWtlIHNwYWNlIGZvciB0aGlzIGZpcnN0IHN5bWJvbC4gKi8KLSAgcCA9IGZyYWdfbW9yZSAoMTIpOwotICAvKiBaZXJvIGl0IG91dC4gKi8KLSAgbWVtc2V0IChwLCAwLCAxMik7Ci0gIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKLSAgc3RhYnN0cl9uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlZ21lbnRfaW5mb1tzZWddLm5hbWUpICsgNCk7Ci0gIHN0cmNweSAoc3RhYnN0cl9uYW1lLCBzZWdtZW50X2luZm9bc2VnXS5uYW1lKTsKLSAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKLSAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKLSAga25vdyAoc3Ryb2ZmID09IDEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zdGFiX3NlY3Rpb24oYWJmZCwgc2VnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBzZWdUIHN0YWJzdHJzZWcgPSBTRUdfVU5LTk9XTjsKLSAgY29uc3QgY2hhciAqc2VjbmFtZSwgKm5hbWUyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpwID0gTlVMTDsKLSAgaW50IGksIHN0cnN6ID0gMCwgbnN5bXM7Ci0gIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW3NlZ10uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQotICAvKiBMb29rIGZvciB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdGFibGUgc2VjdGlvbi4gKi8KLQotICBzZWNuYW1lID0gc2VnbWVudF9pbmZvW3NlZ10ubmFtZTsKLSAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWNuYW1lKSArIDQpOwotICBzdHJjcHkgKG5hbWUsIHNlY25hbWUpOwotICBzdHJjYXQgKG5hbWUsICJzdHIiKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIG5hbWUyID0gc2VnbWVudF9pbmZvW2ldLm5hbWU7Ci0gICAgICBpZiAobmFtZTIgIT0gTlVMTCAmJiBzdHJuY21wKG5hbWUyLCBuYW1lLCA4KSA9PSAwKQotCXsKLQkgIHN0YWJzdHJzZWcgPSBpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBmb3VuZCB0aGUgc2VjdGlvbiwgZ2V0IGl0cyBzaXplLiAqLwotICBpZiAoc3RhYnN0cnNlZyAhPSBTRUdfVU5LTk9XTikKLSAgICBzdHJzeiA9IHNpemVfc2VjdGlvbiAoYWJmZCwgc3RhYnN0cnNlZyk7Ci0KLSAgbnN5bXMgPSBzaXplX3NlY3Rpb24gKGFiZmQsIHNlZykgLyAxMiAtIDE7Ci0KLSAgLyogTG9vayBmb3IgdGhlIGZpcnN0IGZyYWcgb2Ygc3VmZmljaWVudCBzaXplIGZvciB0aGUgaW5pdGlhbCBzdGFiCi0gICAgIHN5bWJvbCwgYW5kIGNvbGxlY3QgYSBwb2ludGVyIHRvIGl0LiAqLwotICB3aGlsZSAoZnJhZyAmJiBmcmFnLT5mcl9maXggPCAxMikKLSAgICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKLSAgYXNzZXJ0IChmcmFnICE9IDApOwotICBwID0gZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgYXNzZXJ0IChwICE9IDApOwotCi0gIC8qIFdyaXRlIGluIHRoZSBudW1iZXIgb2Ygc3RhYiBzeW1ib2xzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCi0gICAgIHRhYmxlLiAqLwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBuc3ltcywgKGJmZF9ieXRlICopIHAgKyA2KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3Ryc3osIChiZmRfYnl0ZSAqKSBwICsgOCk7Ci19Ci0KLSNlbmRpZiAvKiBub3QgQkZEX0FTU0VNQkxFUiAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkZWYiLCBvYmpfY29mZl9kZWYsIDB9LAotICB7ImRpbSIsIG9ial9jb2ZmX2RpbSwgMH0sCi0gIHsiZW5kZWYiLCBvYmpfY29mZl9lbmRlZiwgMH0sCi0gIHsibGluZSIsIG9ial9jb2ZmX2xpbmUsIDB9LAotICB7ImxuIiwgb2JqX2NvZmZfbG4sIDB9LAotICB7ImFwcGxpbmUiLCBvYmpfY29mZl9sbiwgMX0sCi0gIHsic2NsIiwgb2JqX2NvZmZfc2NsLCAwfSwKLSAgeyJzaXplIiwgb2JqX2NvZmZfc2l6ZSwgMH0sCi0gIHsidGFnIiwgb2JqX2NvZmZfdGFnLCAwfSwKLSAgeyJ0eXBlIiwgb2JqX2NvZmZfdHlwZSwgMH0sCi0gIHsidmFsIiwgb2JqX2NvZmZfdmFsLCAwfSwKLSAgeyJzZWN0aW9uIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICAvKiBGSVhNRTogV2UgaWdub3JlIHRoZSBNUkkgc2hvcnQgYXR0cmlidXRlLiAgKi8KLSAgeyJzZWN0aW9uLnMiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0LnMiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgLyogV2UgYWNjZXB0IHRoZSAuYnNzIGRpcmVjdGl2ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0gICAgIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2FzLiAgKi8KLSAgeyJic3MiLCBvYmpfY29mZl9ic3MsIDB9LAotICB7IndlYWsiLCBvYmpfY29mZl93ZWFrLCAwfSwKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICB7InVzZSIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InRleHQiLCBvYmpfY29mZl90ZXh0LCAwfSwKLSAgeyJkYXRhIiwgb2JqX2NvZmZfZGF0YSwgMH0sCi0gIHsibGNvbW0iLCBvYmpfY29mZl9sY29tbSwgMH0sCi0gIHsiaWRlbnQiLCBvYmpfY29mZl9pZGVudCwgMH0sCi0jZWxzZQotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAkvKiBGb3Igc3VuMzg2aSBjYyAoPykgKi8KLSAgeyJpZGVudCIsIHNfaWdub3JlLCAwfSwJLyogd2UgZG9uJ3QgeWV0IGhhbmRsZSB0aGlzLiAqLwotI2VuZGlmCi0gIHsidmVyc2lvbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJBQk9SVCIsIHNfYWJvcnQsIDB9LAotI2lmZGVmIFRDX004OEsKLSAgLyogVGhlIG04OGsgdXNlcyBzZGVmIGluc3RlYWQgb2YgZGVmLiAgKi8KLSAgeyJzZGVmIiwgb2JqX2NvZmZfZGVmLCAwfSwKLSNlbmRpZgotICB7TlVMTH0JCQkvKiBlbmQgc2VudGluZWwgKi8KLX07CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KLQwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFN1cHBvcnQgZm9yIGEgQ09GRiBlbXVsYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9wb3BfaW5zZXJ0ICgpCi17Ci0gIHBvcF9pbnNlcnQgKG9ial9wc2V1ZG9fdGFibGUpOwotfQotCi1zdGF0aWMgaW50Ci1jb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotbm9fZnVuYyAoKQotewotICBhYm9ydCAoKTsKLX0KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgY29mZl9mb3JtYXRfb3BzID0KLXsKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIDAsCi0gIDEsCi0gIGNvZmZfZnJvYl9zeW1ib2wsCi0gIG5vX2Z1bmMsCi0gIGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcywKLSAgMCwgMCwKLSAgMCwgMCwKLSAgMCwKLSNpZiAwCi0gIG9ial9nZW5lcmF0ZV9hc21fbGluZW5vLAotI2Vsc2UKLSAgbm9fZnVuYywKLSNlbmRpZgotI2lmIDAKLSAgb2JqX3N0YWIsCi0jZWxzZQotICBub19mdW5jLAotI2VuZGlmCi0gIGNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGNvZmZfcG9wX2luc2VydCwKLSNpZiAwCi0gIG9ial9zZXRfZXh0LAotI2Vsc2UKLSAgbm9fZnVuYywKLSNlbmRpZgotICBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2ssCi0gIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vaywKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5oIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODc5OWEzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0NCArMCwwIEBACi0vKiBjb2ZmIG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgT0JKX0ZPUk1BVF9ICi0jZGVmaW5lIE9CSl9GT1JNQVRfSAotCi0jZGVmaW5lIE9CSl9DT0ZGIDEKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotI2RlZmluZSBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0jZGVmaW5lIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZGVmaW5lIEJGRF9IRUFERVJTCi0jZGVmaW5lIEJGRAotCi0jZW5kaWYKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotLyogVGhpcyBpbnRlcm5hbF9saW5lbm8gY3JhcCBpcyB0byBzdG9wIG5hbWVzcGFjZSBwb2xsdXRpb24gZnJvbSB0aGUKLSAgIGJmZCBpbnRlcm5hbCBjb2ZmIGhlYWRlcmZpbGUuICovCi0jZGVmaW5lIGludGVybmFsX2xpbmVubyBiZmRfaW50ZXJuYWxfbGluZW5vCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI3VuZGVmIGludGVybmFsX2xpbmVubwotCi0vKiBDUFUtc3BlY2lmaWMgc2V0dXA6ICAqLwotCi0jaWZkZWYgVENfQVJNCi0jaW5jbHVkZSAiY29mZi9hcm0uaCIKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWFybSIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19QUEMKLSNpZmRlZiBURV9QRQotI2luY2x1ZGUgImNvZmYvcG93ZXJwYy5oIgotI2Vsc2UKLSNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX1NQQVJDCi0jaW5jbHVkZSAiY29mZi9zcGFyYy5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19JMzg2Ci0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0KLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJwZS1pMzg2IgotI2VuZGlmCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWkzODYiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVENfTTY4SwotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTY4ayIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19BMjlLCi0jaW5jbHVkZSAiY29mZi9hMjlrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtYTI5ay1iaWciCi0jZW5kaWYKLQotI2lmZGVmIFRDX0k5NjAKLSNpbmNsdWRlICJjb2ZmL2k5NjAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1JbnRlbC1saXR0bGUiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1o4SwotI2luY2x1ZGUgImNvZmYvejhrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtejhrIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19IODMwMAotI2luY2x1ZGUgImNvZmYvaDgzMDAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1oODMwMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfSDg1MDAKLSNpbmNsdWRlICJjb2ZmL2g4NTAwLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtaDg1MDAiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1NICi0jaW5jbHVkZSAiY29mZi9zaC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkJCQlcCi0gIChzaGwJCQkJCQkJXAotICAgPyAoc2hfc21hbGwgPyAiY29mZi1zaGwtc21hbGwiIDogImNvZmYtc2hsIikJCVwKLSAgIDogKHNoX3NtYWxsID8gImNvZmYtc2gtc21hbGwiIDogImNvZmYtc2giKSkKLSNlbmRpZgotCi0jaWZkZWYgVENfTTg4SwotI2luY2x1ZGUgImNvZmYvbTg4ay5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLW04OGtiY3MiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1c2NQotI2luY2x1ZGUgImNvZmYvdzY1LmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtdzY1IgotI2VuZGlmCi0KLSNpZmRlZiBUQ19USUMzMAotI2luY2x1ZGUgImNvZmYvdGljMzAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi10aWMzMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfVElDODAKLSNpbmNsdWRlICJjb2ZmL3RpYzgwLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtdGljODAiCi0jZGVmaW5lIEFMSUdOTUVOVF9JTl9TX0ZMQUdTIDEKLSNlbmRpZgotCi0jaWZkZWYgVENfTUNPUkUKLSNpbmNsdWRlICJjb2ZmL21jb3JlLmgiCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAicGUtbWNvcmUiCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBUYXJnZXRzIG1heSBhbHNvIHNldCB0aGlzLiAgQWxzbywgaWYgQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLCB0aGlzCi0gICB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGRlZmluZWQuICAqLwotI3VuZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAxCi0KLSNpZm5kZWYgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMKLSNkZWZpbmUgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgMQotI2VuZGlmIC8qIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTICovCi0KLWV4dGVybiB2b2lkIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayBjb2ZmX29ial9zeW1ib2xfbmV3X2hvb2sKLQotZXh0ZXJuIHZvaWQgY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgb2JqX3JlYWRfYmVnaW5faG9vayBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgVGhpcyBmaWxlIHJlYWxseSBjb250YWlucyB0d28gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBDT0ZGIGJhY2sgZW5kLgotICAgVGhleSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWVyZ2VkLCBidXQgdGhpcyBpcyBvbmx5IGEKLSAgIHByZWxpbWluYXJ5LCBtZWNoYW5pY2FsIG1lcmdpbmcuICBNYW55IGRlZmluaXRpb25zIHRoYXQgYXJlCi0gICBpZGVudGljYWwgYmV0d2VlbiB0aGUgdHdvIGFyZSBzdGlsbCBmb3VuZCBpbiBib3RoIHZlcnNpb25zLgotCi0gICBUaGUgZmlyc3QgdmVyc2lvbiwgd2l0aCBCRkRfQVNTRU1CTEVSIGRlZmluZWQsIHVzZXMgaGlnaC1sZXZlbCBCRkQKLSAgIGludGVyZmFjZXMgYW5kIGRhdGEgc3RydWN0dXJlcy4gIFRoZSBzZWNvbmQgdmVyc2lvbiwgd2l0aAotICAgQkZEX0FTU0VNQkxFUiBub3QgZGVmaW5lZCwgYWxzbyB1c2VzIEJGRCwgYnV0IG1vc3RseSBmb3Igc3dhcHBpbmcKLSAgIGRhdGEgc3RydWN0dXJlcyBhbmQgZm9yIGRvaW5nIHRoZSBhY3R1YWwgSS9PLiAgVGhlIGxhdHRlciBkZWZpbmVzCi0gICB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbHMgQkZEIGFuZCBCRkRfSEVBREVSUy4gIFRyeSBub3QgdG8gbGV0IHRoaXMKLSAgIGNvbmZ1c2UgeW91LgotCi0gICBUaGVzZSB0d28gYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1lcmdlZCwgYW5kIGV2ZW50dWFsbHkgdGhlCi0gICBCRkRfQVNTRU1CTEVSIHZlcnNpb24gc2hvdWxkIHRha2Ugb3ZlciBjb21wbGV0ZWx5LiAgUmVsZWFzZSB0aW1pbmcKLSAgIGlzc3VlcyBhbmQgbmFtZXNwYWNlIHByb2JsZW1zIGNvbnZpbmNlZCBtZSB0byBtZXJnZSB0aGUgdHdvCi0gICB0b2dldGhlciBpbiB0aGlzIGZhc2hpb24sIGEgbGl0dGxlIHNvb25lciB0aGFuIEkgd291bGQgaGF2ZSBsaWtlZC4KLSAgIFRoZSByZWFsIG1lcmdlIHNob3VsZCBiZSBtdWNoIGJldHRlciBkb25lIGJ5IHRoZSB0aW1lIHRoZSBuZXh0Ci0gICByZWxlYXNlIGNvbWVzIG91dC4KLQotICAgRm9yIG5vdywgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZpbGUgaXM6Ci0JPGNvbW1vbj4KLQkjaWZkZWYgQkZEX0FTU0VNQkxFUgotCTxvbmUgdmVyc2lvbj4KLQkjZWxzZQotCTxvdGhlciB2ZXJzaW9uPgotCSNlbmRpZgotCTxjb21tb24+Ci0gICBVbmZvcnR1bmF0ZWx5LCB0aGUgY29tbW9uIHBvcnRpb25zIGFyZSB2ZXJ5IHNtYWxsIGF0IHRoZSBtb21lbnQsCi0gICBhbmQgbWFueSBkZWNsYXJhdGlvbnMgb3IgZGVmaW5pdGlvbnMgYXJlIGR1cGxpY2F0ZWQuICBUaGUgc3RydWN0dXJlCi0gICBvZiBvYmotY29mZi5jIGlzIHNpbWlsYXIuCi0KLSAgIFNlZSBkb2MvaW50ZXJuYWxzLnRleGkgZm9yIGEgYnJpZWYgZGlzY3Vzc2lvbiBvZiB0aGUgaGlzdG9yeSwgaWYKLSAgIHlvdSBjYXJlLgotCi0gICBLZW4gUmFlYnVybiwgNSBNYXkgMTk5NAotCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0jaW5jbHVkZSAiYmZkL2xpYmNvZmYuaCIKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0KLS8qIFNZTUJPTCBUQUJMRSAqLwotCi0vKiBBbHRlciB0aGUgZmllbGQgbmFtZXMsIGZvciBub3csIHVudGlsIHdlJ3ZlIGZpeGVkIHVwIHRoZSBvdGhlcgotICAgcmVmZXJlbmNlcyB0byB1c2UgdGhlIG5ldyBuYW1lLiAgKi8KLSNpZmRlZiBUQ19JOTYwCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUJc3ltYm9sUyAqCi0jZGVmaW5lIHN5X3RjCQkJYmFsCi0jZW5kaWYKLQotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRQl1bnNpZ25lZCBsb25nCi0jZGVmaW5lIHN5X29iagkJCXN5X2ZsYWdzCi0KLSNkZWZpbmUgU1lNX0FVWEVOVChTKSBcCi0gICgmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+bmF0aXZlWzFdLnUuYXV4ZW50KQotI2RlZmluZSBTWU1fQVVYSU5GTyhTKSBcCi0gICgmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+bmF0aXZlWzFdKQotCi0jZGVmaW5lIERPX05PVF9TVFJJUAkwCi0KLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFRoZSBudW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSNkZWZpbmUgU19HRVRfTlVNQkVSX0FVWElMSUFSWShzKSBcCi0gIChjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAocykpLT5uYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4KQotLyogVGhlIG51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyAqLwotI2RlZmluZSBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZKHMsdikJKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHMpID0gKHYpKQotCi0vKiBUcnVlIGlmIGEgc3ltYm9sIG5hbWUgaXMgaW4gdGhlIHN0cmluZyB0YWJsZSwgaS5lLiBpdHMgbGVuZ3RoIGlzID4gOC4gKi8KLSNkZWZpbmUgU19JU19TVFJJTkcocykJCShzdHJsZW4oU19HRVRfTkFNRShzKSkgPiA4ID8gMSA6IDApCi0KLWV4dGVybiBpbnQgU19TRVRfREFUQV9UWVBFIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci1leHRlcm4gaW50IFNfU0VUX1NUT1JBR0VfQ0xBU1MgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLWV4dGVybiBpbnQgU19HRVRfU1RPUkFHRV9DTEFTUyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNBX1NFVF9TWU1fRU5ETkRYIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci0KLS8qIEF1eGlsaWFyeSBlbnRyeSBtYWNyb3MuIFNBXyBzdGFuZHMgZm9yIHN5bWJvbCBhdXhpbGlhcnkgKi8KLS8qIE9taXQgdGhlIHR2IHJlbGF0ZWQgZmllbGRzICovCi0vKiBBY2Nlc3NvcnMgKi8KLQotI2RlZmluZSBTQV9HRVRfU1lNX1RBR05EWChzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfdGFnbmR4LmwpCi0jZGVmaW5lIFNBX0dFVF9TWU1fTE5OTyhzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2RlZmluZSBTQV9HRVRfU1lNX1NJWkUocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNkZWZpbmUgU0FfR0VUX1NZTV9GU0laRShzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2ZzaXplKQotI2RlZmluZSBTQV9HRVRfU1lNX0xOTk9QVFIocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRU5ETkRYKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRElNRU4ocyxpKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bKGkpXSkKLSNkZWZpbmUgU0FfR0VUX0ZJTEVfRk5BTUUocykJKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9mbmFtZSkKLSNkZWZpbmUgU0FfR0VUX1NDTl9TQ05MRU4ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgU0FfR0VUX1NDTl9OUkVMT0MocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgU0FfR0VUX1NDTl9OTElOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25saW5ubykKLQotI2RlZmluZSBTQV9TRVRfU1lNX0xOTk8ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9TSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZT0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fRlNJWkUocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2ZzaXplPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PUFRSKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHI9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0RJTUVOKHMsaSx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bKGkpXT0odikpCi0jZGVmaW5lIFNBX1NFVF9GSUxFX0ZOQU1FKHMsdikJc3RybmNweShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUsKHYpLEZJTE5NTEVOKQotI2RlZmluZSBTQV9TRVRfU0NOX1NDTkxFTihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW49KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05SRUxPQyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2M9KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05MSU5OTyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm89KHYpKQotCi0vKgotICogSW50ZXJuYWwgdXNlIG9ubHkgZGVmaW5pdGlvbnMuIFNGXyBzdGFuZHMgZm9yIHN5bWJvbCBmbGFncy4KLSAqCi0gKiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIHRvIHN5X3N5bWJvbC5vc3RfZmxhZ3MgZmllbGQgb2YgYSBzeW1ib2xTLgotICoKLSAqIFlvdSdsbCBicmVhayBpOTYwIGlmIHlvdSBzaGlmdCB0aGUgU1lTUFJPQyBiaXRzIGFueXdoZXJlIGVsc2UuICBmb3IKLSAqIG1vcmUgb24gdGhlIGJhbG5hbWUvY2FsbG5hbWUgaGFjaywgc2VlIHRjLWk5NjAuaC4gIGIub3V0IGlzIGRvbmUKLSAqIGRpZmZlcmVudGx5LgotICovCi0KLSNkZWZpbmUgU0ZfSTk2MF9NQVNLCSgweDAwMDAwMWZmKQkvKiBCaXRzIDAtOCBhcmUgdXNlZCBieSB0aGUgaTk2MCBwb3J0LiAqLwotI2RlZmluZSBTRl9TWVNQUk9DCSgweDAwMDAwMDNmKQkvKiBiaXRzIDAtNSBhcmUgdXNlZCB0byBzdG9yZSB0aGUgc3lzcHJvYyBudW1iZXIgKi8KLSNkZWZpbmUgU0ZfSVNfU1lTUFJPQwkoMHgwMDAwMDA0MCkJLyogYml0IDYgbWFya3Mgc3ltYm9scyB0aGF0IGFyZSBzeXNwcm9jcyAqLwotI2RlZmluZSBTRl9CQUxOQU1FCSgweDAwMDAwMDgwKQkvKiBiaXQgNyBtYXJrcyBCQUxOQU1FIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfQ0FMTE5BTUUJKDB4MDAwMDAxMDApCS8qIGJpdCA4IG1hcmtzIENBTExOQU1FIHN5bWJvbHMgKi8KLQotI2RlZmluZSBTRl9OT1JNQUxfTUFTSwkoMHgwMDAwZmZmZikJLyogYml0cyAxMi0xNSBhcmUgZ2VuZXJhbCBwdXJwb3NlLiAqLwotCi0jZGVmaW5lIFNGX1NUQVRJQ1MJKDB4MDAwMDEwMDApCS8qIE1hcmsgdGhlIC50ZXh0ICYgYWxsIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfREVGSU5FRAkoMHgwMDAwMjAwMCkJLyogU3ltYm9sIGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNGX1NUUklORwkoMHgwMDAwNDAwMCkJLyogU3ltYm9sIG5hbWUgbGVuZ3RoID4gOCAqLwotI2RlZmluZSBTRl9MT0NBTAkoMHgwMDAwODAwMCkJLyogU3ltYm9sIG11c3Qgbm90IGJlIGVtaXR0ZWQgKi8KLQotI2RlZmluZSBTRl9ERUJVR19NQVNLCSgweGZmZmYwMDAwKQkvKiBiaXRzIDE2LTMxIGFyZSBkZWJ1ZyBpbmZvICovCi0KLSNkZWZpbmUgU0ZfRlVOQ1RJT04JKDB4MDAwMTAwMDApCS8qIFRoZSBzeW1ib2wgaXMgYSBmdW5jdGlvbiAqLwotI2RlZmluZSBTRl9QUk9DRVNTCSgweDAwMDIwMDAwKQkvKiBQcm9jZXNzIHN5bWJvbCBiZWZvcmUgd3JpdGUgKi8KLSNkZWZpbmUgU0ZfVEFHR0VECSgweDAwMDQwMDAwKQkvKiBJcyBhc3NvY2lhdGVkIHdpdGggYSB0YWcgKi8KLSNkZWZpbmUgU0ZfVEFHCQkoMHgwMDA4MDAwMCkJLyogSXMgYSB0YWcgKi8KLSNkZWZpbmUgU0ZfREVCVUcJKDB4MDAxMDAwMDApCS8qIElzIGluIGRlYnVnIG9yIGFicyBzZWN0aW9uICovCi0jZGVmaW5lIFNGX0dFVF9TRUdNRU5UCSgweDAwMjAwMDAwKQkvKiBHZXQgdGhlIHNlY3Rpb24gb2YgdGhlIGZvcndhcmQgc3ltYm9sLiAqLwotLyogQWxsIG90aGVyIGJpdHMgYXJlIHVudXNlZC4gKi8KLQotLyogQWNjZXNzb3JzICovCi0jZGVmaW5lIFNGX0dFVChzKQkJKCpzeW1ib2xfZ2V0X29iaiAocykpCi0jZGVmaW5lIFNGX0dFVF9ERUJVRyhzKQkJKHN5bWJvbF9nZXRfYmZkc3ltIChzKS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotI2RlZmluZSBTRl9TRVRfREVCVUcocykJCShzeW1ib2xfZ2V0X2JmZHN5bSAocyktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkcpCi0jZGVmaW5lIFNGX0dFVF9OT1JNQUxfRklFTEQocykJKFNGX0dFVCAocykgJiBTRl9OT1JNQUxfTUFTSykKLSNkZWZpbmUgU0ZfR0VUX0RFQlVHX0ZJRUxEKHMpCShTRl9HRVQgKHMpICYgU0ZfREVCVUdfTUFTSykKLSNkZWZpbmUgU0ZfR0VUX0ZJTEUocykJCShTRl9HRVQgKHMpICYgU0ZfRklMRSkKLSNkZWZpbmUgU0ZfR0VUX1NUQVRJQ1MocykJKFNGX0dFVCAocykgJiBTRl9TVEFUSUNTKQotI2RlZmluZSBTRl9HRVRfREVGSU5FRChzKQkoU0ZfR0VUIChzKSAmIFNGX0RFRklORUQpCi0jZGVmaW5lIFNGX0dFVF9TVFJJTkcocykJKFNGX0dFVCAocykgJiBTRl9TVFJJTkcpCi0jZGVmaW5lIFNGX0dFVF9MT0NBTChzKQkJKFNGX0dFVCAocykgJiBTRl9MT0NBTCkKLSNkZWZpbmUgU0ZfR0VUX0ZVTkNUSU9OKHMpICAgICAgKFNGX0dFVCAocykgJiBTRl9GVU5DVElPTikKLSNkZWZpbmUgU0ZfR0VUX1BST0NFU1MocykJKFNGX0dFVCAocykgJiBTRl9QUk9DRVNTKQotI2RlZmluZSBTRl9HRVRfVEFHR0VEKHMpCShTRl9HRVQgKHMpICYgU0ZfVEFHR0VEKQotI2RlZmluZSBTRl9HRVRfVEFHKHMpCQkoU0ZfR0VUIChzKSAmIFNGX1RBRykKLSNkZWZpbmUgU0ZfR0VUX0dFVF9TRUdNRU5UKHMpCShTRl9HRVQgKHMpICYgU0ZfR0VUX1NFR01FTlQpCi0jZGVmaW5lIFNGX0dFVF9JOTYwKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0k5NjBfTUFTSykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9CQUxOQU1FKHMpCShTRl9HRVQgKHMpICYgU0ZfQkFMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9DQUxMTkFNRShzKQkoU0ZfR0VUIChzKSAmIFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgJiBTRl9JU19TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX1NZU1BST0MocykJKFNGX0dFVCAocykgJiBTRl9TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLQotLyogTW9kaWZpZXJzICovCi0jZGVmaW5lIFNGX1NFVChzLHYpCQkoU0ZfR0VUIChzKSA9ICh2KSkKLSNkZWZpbmUgU0ZfU0VUX05PUk1BTF9GSUVMRChzLHYpKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX05PUk1BTF9NQVNLKSkKLSNkZWZpbmUgU0ZfU0VUX0RFQlVHX0ZJRUxEKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0RFQlVHX01BU0spKQotI2RlZmluZSBTRl9TRVRfRklMRShzKQkJKFNGX0dFVCAocykgfD0gU0ZfRklMRSkKLSNkZWZpbmUgU0ZfU0VUX1NUQVRJQ1MocykJKFNGX0dFVCAocykgfD0gU0ZfU1RBVElDUykKLSNkZWZpbmUgU0ZfU0VUX0RFRklORUQocykJKFNGX0dFVCAocykgfD0gU0ZfREVGSU5FRCkKLSNkZWZpbmUgU0ZfU0VUX1NUUklORyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9TVFJJTkcpCi0jZGVmaW5lIFNGX1NFVF9MT0NBTChzKQkJKFNGX0dFVCAocykgfD0gU0ZfTE9DQUwpCi0jZGVmaW5lIFNGX0NMRUFSX0xPQ0FMKHMpCShTRl9HRVQgKHMpICY9IH5TRl9MT0NBTCkKLSNkZWZpbmUgU0ZfU0VUX0ZVTkNUSU9OKHMpICAgICAgKFNGX0dFVCAocykgfD0gU0ZfRlVOQ1RJT04pCi0jZGVmaW5lIFNGX1NFVF9QUk9DRVNTKHMpCShTRl9HRVQgKHMpIHw9IFNGX1BST0NFU1MpCi0jZGVmaW5lIFNGX1NFVF9UQUdHRUQocykJKFNGX0dFVCAocykgfD0gU0ZfVEFHR0VEKQotI2RlZmluZSBTRl9TRVRfVEFHKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9UQUcpCi0jZGVmaW5lIFNGX1NFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSB8PSBTRl9HRVRfU0VHTUVOVCkKLSNkZWZpbmUgU0ZfU0VUX0k5NjAocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfSTk2MF9NQVNLKSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9CQUxOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0JBTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfQ0FMTE5BTUUocykJKFNGX0dFVCAocykgfD0gU0ZfQ0FMTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfSVNfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9JU19TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX1NZU1BST0Mocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfU1lTUFJPQykpCS8qIHVzZWQgYnkgaTk2MCAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLSAgTGluZSBudW1iZXIgaGFuZGxpbmcgLS0tLS0tLSAqLwotZXh0ZXJuIGludCB0ZXh0X2xpbmVub19udW1iZXI7Ci1leHRlcm4gaW50IGNvZmZfbGluZV9iYXNlOwotZXh0ZXJuIGludCBjb2ZmX25fbGluZV9ub3M7Ci0KLSNkZWZpbmUgb2JqX2VtaXRfbGluZW5vKFdIRVJFLExJTkUsRklMRV9TVEFSVCkJYWJvcnQgKCkKLWV4dGVybiB2b2lkIGNvZmZfYWRkX2xpbmVzeW0gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLQotdm9pZCBjX2RvdF9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotI2RlZmluZSBvYmpfYXBwX2ZpbGUgY19kb3RfZmlsZV9zeW1ib2wKLQotZXh0ZXJuIHZvaWQgY29mZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgY29mZl9mcm9iX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotZXh0ZXJuIHZvaWQgY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChTLFApIAljb2ZmX2Zyb2Jfc3ltYm9sKFMsJlApCi0jaWZuZGVmIG9ial9hZGp1c3Rfc3ltdGFiCi0jZGVmaW5lIG9ial9hZGp1c3Rfc3ltdGFiKCkJY29mZl9hZGp1c3Rfc3ltdGFiKCkKLSNlbmRpZgotI2RlZmluZSBvYmpfZnJvYl9zZWN0aW9uKFMpCWNvZmZfZnJvYl9zZWN0aW9uIChTKQotI2RlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcygpIGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQotCi1leHRlcm4gc3ltYm9sUyAqY29mZl9sYXN0X2Z1bmN0aW9uOwotCi0vKiBGb3J3YXJkIHRoZSBzZWdtZW50IG9mIGEgZm9yd2FyZGVkIHN5bWJvbCwgaGFuZGxlIGFzc2lnbm1lbnRzIHRoYXQKLSAgIGp1c3QgY29weSBzeW1ib2wgdmFsdWVzLCBldGMuICAqLwotI2lmbmRlZiBURV9JMzg2QUlYCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKGRlc3Qsc3JjKSBcCi0gIChTRl9HRVRfR0VUX1NFR01FTlQgKGRlc3QpIFwKLSAgID8gKFNfU0VUX1NFR01FTlQgKGRlc3QsIFNfR0VUX1NFR01FTlQgKHNyYykpLCAwKSBcCi0gICA6IDApCi0jZWxzZQotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkZXN0LHNyYykgXAotICAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSAmJiBTX0dFVF9TRUdNRU5UIChkZXN0KSA9PSBTRUdfVU5LTk9XTiBcCi0gICA/IChTX1NFVF9TRUdNRU5UIChkZXN0LCBTX0dFVF9TRUdNRU5UIChzcmMpKSwgMCkgXAotICAgOiAwKQotI2VuZGlmCi0KLS8qIHNhbml0eSBjaGVjayAqLwotCi0jaWZkZWYgVENfSTk2MAotI2lmbmRlZiBDX0xFQUZTVEFUCi1oZXkgISBXaGVyZSBpcyB0aGUgQ19MRUFGU1RBVCBkZWZpbml0aW9uID8gaTk2MCAtIGNvZmYgc3VwcG9ydCBpcyBkZXBlbmRpbmcgb24gaXQuCi0jZW5kaWYgLyogbm8gQ19MRUFGU1RBVCAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotI2Vsc2UgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIFRDX0EyOUsKLS8qIEFsbG93IHRyYW5zbGF0ZSBmcm9tIGFvdXQgcmVsb2NzIHRvIGNvZmYgcmVsb2NzICovCi0jZGVmaW5lIE5PX1JFTE9DIDIwCi0jZGVmaW5lIFJFTE9DXzMyIDEKLSNkZWZpbmUgUkVMT0NfOCAyCi0jZGVmaW5lIFJFTE9DX0NPTlNUIDMKLSNkZWZpbmUgUkVMT0NfQ09OU1RIIDQKLSNkZWZpbmUgUkVMT0NfSlVNUFRBUkcgNQotI2RlZmluZSBSRUxPQ19CQVNFMjIgNgotI2RlZmluZSBSRUxPQ19ISTIyIDcKLSNkZWZpbmUgUkVMT0NfTE8xMCA4Ci0jZGVmaW5lIFJFTE9DX0JBU0UxMyA5Ci0jZGVmaW5lIFJFTE9DX1dESVNQMjIgMTAKLSNkZWZpbmUgUkVMT0NfV0RJU1AzMCAxMQotI2VuZGlmCi0KLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotLyogTWFnaWMgbnVtYmVyIG9mIHBhZ2VkIGV4ZWN1dGFibGUuICovCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQkweDgzMDAKLQotCi0vKiBTWU1CT0wgVEFCTEUgKi8KLQotLyogU3ltYm9sIHRhYmxlIGVudHJ5IGRhdGEgdHlwZSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBCYXNpYyBzeW1ib2wgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBvc3RfZW50cnk7Ci0gIC8qIEF1eGlsaWFyeSBlbnRyeS4gKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IG9zdF9hdXhlbnRbT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVNdOwotICAvKiBvYmpfY29mZiBpbnRlcm5hbCB1c2Ugb25seSBmbGFncyAqLwotICB1bnNpZ25lZCBpbnQgb3N0X2ZsYWdzOwotfSBvYmpfc3ltYm9sX3R5cGU7Ci0KLSNpZm5kZWYgRE9fTk9UX1NUUklQCi0jZGVmaW5lIERPX05PVF9TVFJJUAkwCi0jZW5kaWYKLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0vKiBQb3NzaWJsZSBhbmQgdXNlZnVsbCBzZWN0aW9uIG51bWJlciBpbiBzeW1ib2wgdGFibGUKLSAqIFRoZSB2YWx1ZXMgb2YgVEVYVCwgREFUQSBhbmQgQlNTIG1heSBub3QgYmUgcG9ydGFibGUuCi0gKi8KLQotI2RlZmluZSBDX0FCU19TRUNUSU9OCQlOX0FCUwotI2RlZmluZSBDX1VOREVGX1NFQ1RJT04JCU5fVU5ERUYKLSNkZWZpbmUgQ19ERUJVR19TRUNUSU9OCQlOX0RFQlVHCi0jZGVmaW5lIENfTlRWX1NFQ1RJT04JCU5fVFYKLSNkZWZpbmUgQ19QVFZfU0VDVElPTgkJUF9UVgotI2RlZmluZSBDX1JFR0lTVEVSX1NFQ1RJT04JNTAKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFByZWRpY2F0ZXMgKi8KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpICAgICAgICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19VTkRFRl9TRUNUSU9OKQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgOgotICAgc2VjdGlvbiA+IDAgKERBVEEsIFRFWFQgb3IgQlNTKQotICAgc2VjdGlvbiA9PSAwIGFuZCB2YWx1ZSA+IDAgKGV4dGVybmFsIGJzcyBzeW1ib2wpICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKSBcCi0gICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA+IENfVU5ERUZfU0VDVElPTiBcCi0gICB8fCAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19VTkRFRl9TRUNUSU9OIFwKLSAgICAgICAmJiBTX0dFVF9WQUxVRSAocykgPiAwKSBcCi0gICB8fCAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19BQlNfU0VDVElPTikpCi0vKiBUcnVlIGlmIGEgZGVidWcgc3BlY2lhbCBzeW1ib2wgZW50cnkgKi8KLSNkZWZpbmUgU19JU19ERUJVRyhzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfREVCVUdfU0VDVElPTikKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbG9jYWwgc3ltYm9sIG5hbWUgKi8KLS8qIEEgc3ltYm9sIG5hbWUgd2hvc2UgbmFtZSBpbmNsdWRlcyBeQSBpcyBhIGdhcyBpbnRlcm5hbCBwc2V1ZG8gc3ltYm9sICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykgXAotICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19SRUdJU1RFUl9TRUNUSU9OIFwKLSAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgISBmbGFnX2tlZXBfbG9jYWxzICYmICEgU19JU19ERUJVRyAocykpIFwKLSAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAxJykgIT0gTlVMTCBcCi0gICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMicpICE9IE5VTEwgXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUgXAotICAgICAgICYmICFTX0lTX0VYVEVSTkFMKHMpIFwKLSAgICAgICAmJiAocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX0FCU19TRUNUSU9OKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gMCBcCi0JCQkJICYmIFNfR0VUX1ZBTFVFIChzKSA9PSAwKQotLyoKLSAqIFRydWUgaWYgYSBzeW1ib2wgY2FuIGJlIG11bHRpcGx5IGRlZmluZWQgKGJzcyBzeW1ib2xzIGhhdmUgdGhpcyBkZWYKLSAqIHRob3VnaCBpdCBpcyBiYWQgcHJhY3RpY2UpCi0gKi8KLSNkZWZpbmUgU19JU19DT01NT04ocykJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSAwIFwKLQkJCQkgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0vKiBUcnVlIGlmIGEgc3ltYm9sIG5hbWUgaXMgaW4gdGhlIHN0cmluZyB0YWJsZSwgaS5lLiBpdHMgbGVuZ3RoIGlzID4gOC4gKi8KLSNkZWZpbmUgU19JU19TVFJJTkcocykJCShzdHJsZW4oU19HRVRfTkFNRShzKSkgPiA4ID8gMSA6IDApCi0KLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCBhcyB3ZWFrLiAgKi8KLSNpZmRlZiBURV9QRQotI2RlZmluZSBTX0lTX1dFQUsocykgXAotICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzID09IENfTlRfV0VBSyBcCi0gICB8fCAocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQotI2Vsc2UKLSNkZWZpbmUgU19JU19XRUFLKHMpIFwKLSAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQpCi0jZW5kaWYKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgoY2hhciopKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0KQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykgICAgICAgICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0KQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKSAgIHNfZ2V0X3NlZ21lbnQocykKLS8qIFRoZSBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgU19HRVRfREFUQV9UWVBFKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl90eXBlKQotLyogVGhlIHN0b3JhZ2UgY2xhc3MgKi8KLSNkZWZpbmUgU19HRVRfU1RPUkFHRV9DTEFTUyhzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzKQotLyogVGhlIG51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyAqLwotI2RlZmluZSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9udW1hdXgpCi0KLS8qIE1vZGlmaWVycyAqLwotLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0ID0gKHYpKQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9IFNFR01FTlRfVE9fU1lNQk9MX1RZUEUodikpCi0vKiBUaGUgZGF0YSB0eXBlICovCi0jZGVmaW5lIFNfU0VUX0RBVEFfVFlQRShzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl90eXBlID0gKHYpKQotLyogVGhlIHN0b3JhZ2UgY2xhc3MgKi8KLSNkZWZpbmUgU19TRVRfU1RPUkFHRV9DTEFTUyhzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPSAodikpCi0vKiBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzICovCi0jZGVmaW5lIFNfU0VUX05VTUJFUl9BVVhJTElBUlkocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4ID0gKHYpKQotCi0vKiBBZGRpdGlvbmFsIG1vZGlmaWVycyAqLwotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAoZG9lcyBub3QgbWVhbiB1bmRlZmluZWQpICovCi0jZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpICAgICAgIHsgU19TRVRfU1RPUkFHRV9DTEFTUyhzLCBDX0VYVCkgOyBTRl9DTEVBUl9MT0NBTChzKTsgfQotCi0vKiBBdXhpbGlhcnkgZW50cnkgbWFjcm9zLiBTQV8gc3RhbmRzIGZvciBzeW1ib2wgYXV4aWxpYXJ5ICovCi0vKiBPbWl0IHRoZSB0diByZWxhdGVkIGZpZWxkcyAqLwotLyogQWNjZXNzb3JzICovCi0jZGVmaW5lIFNZTV9BVVhFTlQoUykJKCYoUyktPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdKQotCi0jZGVmaW5lIFNBX0dFVF9TWU1fVEFHTkRYKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF90YWduZHgubCkKLSNkZWZpbmUgU0FfR0VUX1NZTV9MTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFNBX0dFVF9TWU1fU0laRShzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBTQV9HRVRfU1lNX0ZTSVpFKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfZnNpemUpCi0jZGVmaW5lIFNBX0dFVF9TWU1fTE5OT1BUUihzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgU0FfR0VUX1NZTV9FTkRORFgocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sKQotI2RlZmluZSBTQV9HRVRfU1lNX0RJTUVOKHMsaSkJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV0pCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FKHMpCShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUpCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FX09GRlNFVChzKSAgKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9uLnhfb2Zmc2V0KQotI2RlZmluZSBTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyhzKSAgIChTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfbi54X3plcm9lcykKLSNkZWZpbmUgU0FfR0VUX1NDTl9TQ05MRU4ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgU0FfR0VUX1NDTl9OUkVMT0MocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgU0FfR0VUX1NDTl9OTElOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25saW5ubykKLQotLyogTW9kaWZpZXJzICovCi0jZGVmaW5lIFNBX1NFVF9TWU1fVEFHTkRYKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X3RhZ25keC5sPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubz0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0ZTSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZT0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fTE5OT1BUUihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9FTkRORFgocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0RJTUVOKHMsaSx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bKGkpXT0odikpCi0jZGVmaW5lIFNBX1NFVF9GSUxFX0ZOQU1FKHMsdikJc3RybmNweShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUsKHYpLEZJTE5NTEVOKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRV9PRkZTRVQocyx2KSAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF9vZmZzZXQ9KHYpKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRV9aRVJPUyhzLHYpICAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF96ZXJvZXM9KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX1NDTkxFTihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW49KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05SRUxPQyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2M9KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05MSU5OTyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm89KHYpKQotCi0vKgotICogSW50ZXJuYWwgdXNlIG9ubHkgZGVmaW5pdGlvbnMuIFNGXyBzdGFuZHMgZm9yIHN5bWJvbCBmbGFncy4KLSAqCi0gKiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIHRvIHN5X3N5bWJvbC5vc3RfZmxhZ3MgZmllbGQgb2YgYSBzeW1ib2xTLgotICoKLSAqIFlvdSdsbCBicmVhayBpOTYwIGlmIHlvdSBzaGlmdCB0aGUgU1lTUFJPQyBiaXRzIGFueXdoZXJlIGVsc2UuICBmb3IKLSAqIG1vcmUgb24gdGhlIGJhbG5hbWUvY2FsbG5hbWUgaGFjaywgc2VlIHRjLWk5NjAuaC4gIGIub3V0IGlzIGRvbmUKLSAqIGRpZmZlcmVudGx5LgotICovCi0KLSNkZWZpbmUgU0ZfSTk2MF9NQVNLCSgweDAwMDAwMWZmKQkvKiBCaXRzIDAtOCBhcmUgdXNlZCBieSB0aGUgaTk2MCBwb3J0LiAqLwotI2RlZmluZSBTRl9TWVNQUk9DCSgweDAwMDAwMDNmKQkvKiBiaXRzIDAtNSBhcmUgdXNlZCB0byBzdG9yZSB0aGUgc3lzcHJvYyBudW1iZXIgKi8KLSNkZWZpbmUgU0ZfSVNfU1lTUFJPQwkoMHgwMDAwMDA0MCkJLyogYml0IDYgbWFya3Mgc3ltYm9scyB0aGF0IGFyZSBzeXNwcm9jcyAqLwotI2RlZmluZSBTRl9CQUxOQU1FCSgweDAwMDAwMDgwKQkvKiBiaXQgNyBtYXJrcyBCQUxOQU1FIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfQ0FMTE5BTUUJKDB4MDAwMDAxMDApCS8qIGJpdCA4IG1hcmtzIENBTExOQU1FIHN5bWJvbHMgKi8KLQotI2RlZmluZSBTRl9OT1JNQUxfTUFTSwkoMHgwMDAwZmZmZikJLyogYml0cyAxMi0xNSBhcmUgZ2VuZXJhbCBwdXJwb3NlLiAqLwotCi0jZGVmaW5lIFNGX1NUQVRJQ1MJKDB4MDAwMDEwMDApCS8qIE1hcmsgdGhlIC50ZXh0ICYgYWxsIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfREVGSU5FRAkoMHgwMDAwMjAwMCkJLyogU3ltYm9sIGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNGX1NUUklORwkoMHgwMDAwNDAwMCkJLyogU3ltYm9sIG5hbWUgbGVuZ3RoID4gOCAqLwotI2RlZmluZSBTRl9MT0NBTAkoMHgwMDAwODAwMCkJLyogU3ltYm9sIG11c3Qgbm90IGJlIGVtaXR0ZWQgKi8KLQotI2RlZmluZSBTRl9ERUJVR19NQVNLCSgweGZmZmYwMDAwKQkvKiBiaXRzIDE2LTMxIGFyZSBkZWJ1ZyBpbmZvICovCi0KLSNkZWZpbmUgU0ZfRlVOQ1RJT04JKDB4MDAwMTAwMDApCS8qIFRoZSBzeW1ib2wgaXMgYSBmdW5jdGlvbiAqLwotI2RlZmluZSBTRl9QUk9DRVNTCSgweDAwMDIwMDAwKQkvKiBQcm9jZXNzIHN5bWJvbCBiZWZvcmUgd3JpdGUgKi8KLSNkZWZpbmUgU0ZfVEFHR0VECSgweDAwMDQwMDAwKQkvKiBJcyBhc3NvY2lhdGVkIHdpdGggYSB0YWcgKi8KLSNkZWZpbmUgU0ZfVEFHCQkoMHgwMDA4MDAwMCkJLyogSXMgYSB0YWcgKi8KLSNkZWZpbmUgU0ZfREVCVUcJKDB4MDAxMDAwMDApCS8qIElzIGluIGRlYnVnIG9yIGFicyBzZWN0aW9uICovCi0jZGVmaW5lIFNGX0dFVF9TRUdNRU5UCSgweDAwMjAwMDAwKQkvKiBHZXQgdGhlIHNlY3Rpb24gb2YgdGhlIGZvcndhcmQgc3ltYm9sLiAqLwotI2RlZmluZSBTRl9BREpfTE5OT1BUUgkoMHgwMDQwMDAwMCkJLyogSGFzIGEgbG5ub3B0ciAqLwotLyogQWxsIG90aGVyIGJpdHMgYXJlIHVudXNlZC4gKi8KLQotLyogQWNjZXNzb3JzICovCi0jZGVmaW5lIFNGX0dFVChzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9mbGFncykKLSNkZWZpbmUgU0ZfR0VUX05PUk1BTF9GSUVMRChzKQkoU0ZfR0VUIChzKSAmIFNGX05PUk1BTF9NQVNLKQotI2RlZmluZSBTRl9HRVRfREVCVUdfRklFTEQocykJKFNGX0dFVCAocykgJiBTRl9ERUJVR19NQVNLKQotI2RlZmluZSBTRl9HRVRfRklMRShzKQkJKFNGX0dFVCAocykgJiBTRl9GSUxFKQotI2RlZmluZSBTRl9HRVRfU1RBVElDUyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NUQVRJQ1MpCi0jZGVmaW5lIFNGX0dFVF9ERUZJTkVEKHMpCShTRl9HRVQgKHMpICYgU0ZfREVGSU5FRCkKLSNkZWZpbmUgU0ZfR0VUX1NUUklORyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NUUklORykKLSNkZWZpbmUgU0ZfR0VUX0xPQ0FMKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0xPQ0FMKQotI2RlZmluZSBTRl9HRVRfRlVOQ1RJT04ocykgICAgICAoU0ZfR0VUIChzKSAmIFNGX0ZVTkNUSU9OKQotI2RlZmluZSBTRl9HRVRfUFJPQ0VTUyhzKQkoU0ZfR0VUIChzKSAmIFNGX1BST0NFU1MpCi0jZGVmaW5lIFNGX0dFVF9ERUJVRyhzKQkJKFNGX0dFVCAocykgJiBTRl9ERUJVRykKLSNkZWZpbmUgU0ZfR0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSAmIFNGX1RBR0dFRCkKLSNkZWZpbmUgU0ZfR0VUX1RBRyhzKQkJKFNGX0dFVCAocykgJiBTRl9UQUcpCi0jZGVmaW5lIFNGX0dFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSAmIFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9HRVRfQURKX0xOTk9QVFIocykJKFNGX0dFVCAocykgJiBTRl9BREpfTE5OT1BUUikKLSNkZWZpbmUgU0ZfR0VUX0k5NjAocykJCShTRl9HRVQgKHMpICYgU0ZfSTk2MF9NQVNLKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0JBTE5BTUUocykJKFNGX0dFVCAocykgJiBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpICYgU0ZfQ0FMTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfSVNfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSAmIFNGX0lTX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotCi0vKiBNb2RpZmllcnMgKi8KLSNkZWZpbmUgU0ZfU0VUKHMsdikJCShTRl9HRVQgKHMpID0gKHYpKQotI2RlZmluZSBTRl9TRVRfTk9STUFMX0ZJRUxEKHMsdikoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfTk9STUFMX01BU0spKQotI2RlZmluZSBTRl9TRVRfREVCVUdfRklFTEQocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfREVCVUdfTUFTSykpCi0jZGVmaW5lIFNGX1NFVF9GSUxFKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9GSUxFKQotI2RlZmluZSBTRl9TRVRfU1RBVElDUyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9TVEFUSUNTKQotI2RlZmluZSBTRl9TRVRfREVGSU5FRChzKQkoU0ZfR0VUIChzKSB8PSBTRl9ERUZJTkVEKQotI2RlZmluZSBTRl9TRVRfU1RSSU5HKHMpCShTRl9HRVQgKHMpIHw9IFNGX1NUUklORykKLSNkZWZpbmUgU0ZfU0VUX0xPQ0FMKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9MT0NBTCkKLSNkZWZpbmUgU0ZfQ0xFQVJfTE9DQUwocykJKFNGX0dFVCAocykgJj0gflNGX0xPQ0FMKQotI2RlZmluZSBTRl9TRVRfRlVOQ1RJT04ocykgICAgICAoU0ZfR0VUIChzKSB8PSBTRl9GVU5DVElPTikKLSNkZWZpbmUgU0ZfU0VUX1BST0NFU1MocykJKFNGX0dFVCAocykgfD0gU0ZfUFJPQ0VTUykKLSNkZWZpbmUgU0ZfU0VUX0RFQlVHKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9ERUJVRykKLSNkZWZpbmUgU0ZfU0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSB8PSBTRl9UQUdHRUQpCi0jZGVmaW5lIFNGX1NFVF9UQUcocykJCShTRl9HRVQgKHMpIHw9IFNGX1RBRykKLSNkZWZpbmUgU0ZfU0VUX0dFVF9TRUdNRU5UKHMpCShTRl9HRVQgKHMpIHw9IFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9TRVRfQURKX0xOTk9QVFIocykJKFNGX0dFVCAocykgfD0gU0ZfQURKX0xOTk9QVFIpCi0jZGVmaW5lIFNGX1NFVF9JOTYwKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0k5NjBfTUFTSykpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgfD0gU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9TWVNQUk9DKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX1NZU1BST0MpKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0vKgotICogRmlsZSBwb3NpdGlvbiBjYWxjdWxhdG9ycy4gQmV3YXJlIHRvIHVzZSB0aGVtIHdoZW4gYWxsIHRoZQotICogYXBwcm9wcmlhdGUgZmllbGRzIGFyZSBzZXQgaW4gdGhlIGhlYWRlci4KLSAqLwotCi0jaWZkZWYgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLSNkZWZpbmUgT0JKX0NPRkZfQU9VVEhEUlNaICgwKQotI2Vsc2UKLSNkZWZpbmUgT0JKX0NPRkZfQU9VVEhEUlNaIChBT1VUSERSU1opCi0jZW5kaWYgLyogT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIgKi8KLQotI2RlZmluZSBIX0dFVF9GSUxFX1NJWkUoaCkgXAotICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCi0JICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAotCSAgIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKLQkgICBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkgKyBIX0dFVF9MSU5FTk9fU0laRShoKSArIFwKLQkgICBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSArIFwKLQkgICAoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9URVhUX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWikKLSNkZWZpbmUgSF9HRVRfREFUQV9GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpKQotI2RlZmluZSBIX0dFVF9CU1NfRklMRV9PRkZTRVQoaCkgMAotI2RlZmluZSBIX0dFVF9SRUxPQ0FUSU9OX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkpCi0jZGVmaW5lIEhfR0VUX0xJTkVOT19GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpICsgXAotCSAgIEhfR0VUX1JFTE9DQVRJT05fU0laRShoKSkKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkgKyBcCi0JICAgSF9HRVRfUkVMT0NBVElPTl9TSVpFKGgpICsgSF9HRVRfTElORU5PX1NJWkUoaCkpCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogYW91dGhkciAqLwotI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkgICAgICAgICAgICgoaCktPmFvdXRoZHIubWFnaWMpCi0jZGVmaW5lIEhfR0VUX1ZFUlNJT05fU1RBTVAoaCkJCSgoaCktPmFvdXRoZHIudnN0YW1wKQotI2RlZmluZSBIX0dFVF9URVhUX1NJWkUoaCkgICAgICAgICAgICAgICgoaCktPmFvdXRoZHIudHNpemUpCi0jZGVmaW5lIEhfR0VUX0RBVEFfU0laRShoKSAgICAgICAgICAgICAgKChoKS0+YW91dGhkci5kc2l6ZSkKLSNkZWZpbmUgSF9HRVRfQlNTX1NJWkUoaCkgICAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmJzaXplKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKSAgICAgICAgICAgICgoaCktPmFvdXRoZHIuZW50cnkpCi0jZGVmaW5lIEhfR0VUX1RFWFRfU1RBUlQoaCkJCSgoaCktPmFvdXRoZHIudGV4dF9zdGFydCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TVEFSVChoKQkJKChoKS0+YW91dGhkci5kYXRhX3N0YXJ0KQotLyogZmlsZWhkciAqLwotI2RlZmluZSBIX0dFVF9GSUxFX01BR0lDX05VTUJFUihoKQkoKGgpLT5maWxlaGRyLmZfbWFnaWMpCi0jZGVmaW5lIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKQkoKGgpLT5maWxlaGRyLmZfbnNjbnMpCi0jZGVmaW5lIEhfR0VUX1RJTUVfU1RBTVAoaCkJCSgoaCktPmZpbGVoZHIuZl90aW1kYXQpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9UQUJMRV9QT0lOVEVSKGgpCSgoaCktPmZpbGVoZHIuZl9zeW1wdHIpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9DT1VOVChoKQkJKChoKS0+ZmlsZWhkci5mX25zeW1zKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoSF9HRVRfU1lNQk9MX0NPVU5UKGgpICogU1lNRVNaKQotI2RlZmluZSBIX0dFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSKGgpCSgoaCktPmZpbGVoZHIuZl9vcHRoZHIpCi0jZGVmaW5lIEhfR0VUX0ZMQUdTKGgpCQkJKChoKS0+ZmlsZWhkci5mX2ZsYWdzKQotLyogRXh0cmEgZmllbGRzIHRvIGFjaGlldmUgYnNkIGEub3V0IGNvbXBhdGliaWxpdHkgYW5kIGZvciBjb252ZW5pZW5jZSAqLwotI2RlZmluZSBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkgICAJKChoKS0+cmVsb2NhdGlvbl9zaXplKQotI2RlZmluZSBIX0dFVF9TVFJJTkdfU0laRShoKSAgICAgICAgICAgICgoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9MSU5FTk9fU0laRShoKSAgICAgICAgICAgICgoaCktPmxpbmVub19zaXplKQotCi0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZGVmaW5lIEhfR0VUX0hFQURFUl9TSVpFKGgpCQkoc2l6ZW9mKEZJTEhEUikgXAotCQkJCQkgKyBzaXplb2YoQU9VVEhEUilcCi0JCQkJCSArIChIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1opKQotI2Vsc2UgLyogT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIgKi8KLSNkZWZpbmUgSF9HRVRfSEVBREVSX1NJWkUoaCkJCShzaXplb2YoRklMSERSKSBcCi0JCQkJCSArIChIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1opKQotI2VuZGlmIC8qIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSICovCi0KLSNkZWZpbmUgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkJKHRleHRfc2VjdGlvbl9oZWFkZXIuc19ucmVsb2MgKiBSRUxTWikKLSNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKGRhdGFfc2VjdGlvbl9oZWFkZXIuc19ucmVsb2MgKiBSRUxTWikKLQotLyogTW9kaWZpZXJzICovCi0vKiBhb3V0aGRyICovCi0jZGVmaW5lIEhfU0VUX01BR0lDX05VTUJFUihoLHYpICAgICAgICAgKChoKS0+YW91dGhkci5tYWdpYyA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfVkVSU0lPTl9TVEFNUChoLHYpCSgoaCktPmFvdXRoZHIudnN0YW1wID0gKHYpKQotI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KSAgICAgICAgICAgICgoaCktPmFvdXRoZHIudHNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpICAgICAgICAgICAgKChoKS0+YW91dGhkci5kc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KSAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9FTlRSWV9QT0lOVChoLHYpICAgICAgICAgICgoaCktPmFvdXRoZHIuZW50cnkgPSAodikpCi0jZGVmaW5lIEhfU0VUX1RFWFRfU1RBUlQoaCx2KQkJKChoKS0+YW91dGhkci50ZXh0X3N0YXJ0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NUQVJUKGgsdikJCSgoaCktPmFvdXRoZHIuZGF0YV9zdGFydCA9ICh2KSkKLS8qIGZpbGVoZHIgKi8KLSNkZWZpbmUgSF9TRVRfRklMRV9NQUdJQ19OVU1CRVIoaCx2KQkoKGgpLT5maWxlaGRyLmZfbWFnaWMgPSAodikpCi0jZGVmaW5lIEhfU0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoLHYpCSgoaCktPmZpbGVoZHIuZl9uc2NucyA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfVElNRV9TVEFNUChoLHYpCQkoKGgpLT5maWxlaGRyLmZfdGltZGF0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfUE9JTlRFUihoLHYpCSgoaCktPmZpbGVoZHIuZl9zeW1wdHIgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgsdikgICAgKChoKS0+ZmlsZWhkci5mX25zeW1zID0gKHYpKQotI2RlZmluZSBIX1NFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSKGgsdikgKChoKS0+ZmlsZWhkci5mX29wdGhkciA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfRkxBR1MoaCx2KQkJKChoKS0+ZmlsZWhkci5mX2ZsYWdzID0gKHYpKQotLyogRXh0cmEgZmllbGRzIHRvIGFjaGlldmUgYnNkIGEub3V0IGNvbXBhdGliaWxpdHkgYW5kIGZvciBjb252aW5pZW5jZSAqLwotI2RlZmluZSBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUoaCx0LGQpIAkoKGgpLT5yZWxvY2F0aW9uX3NpemUgPSAodCkrKGQpKQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpICAgICAgICAgICgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9MSU5FTk9fU0laRShoLHYpICAgICAgICAgICgoaCktPmxpbmVub19zaXplID0gKHYpKQotCi0vKiBTZWdtZW50IGZsaXBwaW5nICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGFvdXRoZHI7CS8qIGEub3V0IGhlYWRlciAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBmaWxlaGRyOwkvKiBGaWxlIGhlYWRlciwgbm90IG1hY2hpbmUgZGVwLiAqLwotICBsb25nIHN0cmluZ190YWJsZV9zaXplOwkvKiBuYW1lcyArICdcMCcgKyBzaXplb2YoaW50KSAqLwotICBsb25nIHJlbG9jYXRpb25fc2l6ZTsJLyogQ3VtdWxhdGVkIHNpemUgb2YgcmVsb2NhdGlvbgotCQkJICAgaW5mb3JtYXRpb24gZm9yIGFsbCBzZWN0aW9ucyBpbgotCQkJICAgYnl0ZXMuICovCi0gIGxvbmcgbGluZW5vX3NpemU7CQkvKiBTaXplIG9mIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbgotCQkJCSAgIHRhYmxlIGluIGJ5dGVzICovCi19IG9iamVjdF9oZWFkZXJzOwotCi0KLQotc3RydWN0IGxpbmVub19saXN0Ci17Ci0gIHN0cnVjdCBiZmRfaW50ZXJuYWxfbGluZW5vIGxpbmU7Ci0gIGNoYXIgKmZyYWc7CQkJLyogRnJhZyB0byB3aGljaCB0aGUgbGluZSBudW1iZXIgaXMgcmVsYXRlZCAqLwotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKm5leHQ7CS8qIEZvcndhcmQgY2hhaW4gcG9pbnRlciAqLwotfTsKLQotCi0KLQotI2RlZmluZSBvYmpfc2VnbWVudF9uYW1lKGkpIChzZWdtZW50X2luZm9bKGludCkgKGkpXS5zY25oZHIuc19uYW1lKQotCi0jZGVmaW5lIG9ial9hZGRfc2VnbWVudChzKSBvYmpfY29mZl9hZGRfc2VnbWVudCAocykKLQotZXh0ZXJuIHNlZ1Qgb2JqX2NvZmZfYWRkX3NlZ21lbnQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLWV4dGVybiB2b2lkIGNfZG90X2ZpbGVfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0jZGVmaW5lIG9ial9hcHBfZmlsZSBjX2RvdF9maWxlX3N5bWJvbAotZXh0ZXJuIHZvaWQgb2JqX2V4dHJhX3N0dWZmIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotCi1leHRlcm4gc2VnVCBzX2dldF9zZWdtZW50IFBBUkFNUyAoKHN5bWJvbFMgKnB0cikpOwotCi1leHRlcm4gdm9pZCBjX3NlY3Rpb25faGVhZGVyIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKiBoZWFkZXIsCi0JCQkJICAgICAgY2hhciAqbmFtZSwKLQkJCQkgICAgICBsb25nIGNvcmVfYWRkcmVzcywKLQkJCQkgICAgICBsb25nIHNpemUsCi0JCQkJICAgICAgbG9uZyBkYXRhX3B0ciwKLQkJCQkgICAgICBsb25nIHJlbG9jX3B0ciwKLQkJCQkgICAgICBsb25nIGxpbmVub19wdHIsCi0JCQkJICAgICAgbG9uZyByZWxvY19udW1iZXIsCi0JCQkJICAgICAgbG9uZyBsaW5lbm9fbnVtYmVyLAotCQkJCSAgICAgIGxvbmcgYWxpZ25tZW50KSk7Ci0KLSNpZm5kZWYgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rCi12b2lkIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNlbmRpZgotCi0vKiBzYW5pdHkgY2hlY2sgKi8KLQotI2lmZGVmIFRDX0k5NjAKLSNpZm5kZWYgQ19MRUFGU1RBVAotaGV5ICEgV2hlcmUgaXMgdGhlIENfTEVBRlNUQVQgZGVmaW5pdGlvbiA/IGk5NjAgLSBjb2ZmIHN1cHBvcnQgaXMgZGVwZW5kaW5nIG9uIGl0LgotI2VuZGlmIC8qIG5vIENfTEVBRlNUQVQgKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi1leHRlcm4gc3RydWN0IGludGVybmFsX3NjbmhkciBkYXRhX3NlY3Rpb25faGVhZGVyOwotZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgdGV4dF9zZWN0aW9uX2hlYWRlcjsKLQotLyogRm9yd2FyZCB0aGUgc2VnbWVudCBvZiBhIGZvcndhcmRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkZXN0LHNyYykgXAotICAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSBcCi0gICA/IChTX1NFVF9TRUdNRU5UIChkZXN0LCBTX0dFVF9TRUdNRU5UIChzcmMpKSwgMCkgXAotICAgOiAwKQotCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgb2JqX2hhbmRsZV9saW5rX29uY2UodCkgb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAodCkKLWV4dGVybiB2b2lkIG9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UgKCk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLS8qIEluIENPRkYsIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgdXNpbmcgLmRlZi8udmFsIFNZTS8uZW5kZWYsIGl0J3MgT0sKLSAgIHRvIHJlZGVmaW5lIHRoZSBzeW1ib2wgbGF0ZXIgb24uICBUaGlzIGNhbiBoYXBwZW4gaWYgQyBzeW1ib2xzIHVzZQotICAgYSBwcmVmaXgsIGFuZCBhIHN5bWJvbCBpcyBkZWZpbmVkIGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgcHJlZml4LAotICAgYXMgaW4gc3RhcnQvX3N0YXJ0L19fc3RhcnQgaW4gZ2NjL2xpYmdjYzEtdGVzdC5jLiAgKi8KLSNkZWZpbmUgUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKHN5bSkJCVwKLShTRl9HRVRfR0VUX1NFR01FTlQgKHN5bSkJCQkJXAotID8gKHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93LAkJCQlcCi0gICAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKSwJCQlcCi0gICAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKSwJCQlcCi0gICAgMCkJCQkJCQkJXAotIDogMCkKLQotLyogU3RhYnMgaW4gYSBjb2ZmIGZpbGUgZ28gaW50byB0aGVpciBvd24gc2VjdGlvbi4gICovCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMQotCi0vKiBXZSBuZWVkIDEyIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiB0byBob2xkIHNvbWUgaW5pdGlhbAotICAgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0KLSNlbmRpZiAvKiBPQkpfRk9STUFUX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMgYi9nYXMvY29uZmlnL29iai1lY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg5MjQzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyogRUNPRkYgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSB3YXMgcHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1lY29mZi5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImJmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiYmZkL2xpYmVjb2ZmLmgiCi0KLS8qIEFsbW9zdCBhbGwgb2YgdGhlIEVDT0ZGIHN1cHBvcnQgaXMgYWN0dWFsbHkgaW4gZWNvZmYuYyBpbiB0aGUgbWFpbgotICAgZ2FzIGRpcmVjdG9yeS4gIFRoaXMgZmlsZSBtb3N0bHkganVzdCBhcnJhbmdlcyB0byBjYWxsIHRoYXQgb25lIGF0Ci0gICB0aGUgcmlnaHQgdGltZXMuICAqLwotCi1zdGF0aWMgaW50IGVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIG9ial9lY29mZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9wb3BfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHRoZSBwc2V1ZG8tb3BzIHdlIHN1cHBvcnQgaW4gdGhpcyBmaWxlLiAgT25seSB0aG9zZQotICAgcmVsYXRpbmcgdG8gZGVidWdnaW5nIGluZm9ybWF0aW9uIGFyZSBzdXBwb3J0ZWQgaGVyZS4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vawotICAgc2hvdWxkIGJlIGRlZmluZWQgaGVyZSwgYnV0IGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQ6IC5hZW50LAotICAgLmJnbmIsIC5lbmRiLCAudmVyc3RhbXAsIC52cmVnLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQotICAgTUlQUyBDUFUgc3BlY2lmaWMsIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBieSB0Yy1taXBzLmM6IC5hbGlhcywKLSAgIC5leHRlcm4sIC5nYWxpdmUsIC5namFsZGVmLCAuZ2pybGl2ZSwgLmxpdmVyZWcsIC5ub2FsaWFzLCAub3B0aW9uLAotICAgLnJkYXRhLCAuc2RhdGEsIC5zZXQuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCi0gICBub3QgTUlQUyBDUFUgc3BlY2lmaWMsIGJ1dCBhcmUgYWxzbyBub3QgRUNPRkYgc3BlY2lmaWMuICBJIGhhdmUKLSAgIG9ubHkgbGlzdGVkIHRoZSBvbmVzIHdoaWNoIGFyZSBub3QgYWxyZWFkeSBpbiByZWFkLmMuICBJdCdzIG5vdAotICAgY29tcGxldGVseSBjbGVhciB3aGVyZSB0aGVzZSBzaG91bGQgYmUgZGVmaW5lZCwgYnV0IHRjLW1pcHMuYyBpcwotICAgcHJvYmFibHkgdGhlIG1vc3QgcmVhc29uYWJsZSBwbGFjZTogLmFzY2lpeiwgLmFzbTAsIC5lbmRyLCAuZXJyLAotICAgLmhhbGYsIC5sYWIsIC5yZXBlYXQsIC5zdHJ1Y3QsIC53ZWFrZXh0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIC8qIENPRkYgc3R5bGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAubG4gaXMgbm90IHVzZWQ7IC5sb2MgaXMgdXNlZAotICAgICBpbnN0ZWFkLiAgKi8KLSAgeyAiZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2RlZiwJMCB9LAotICB7ICJkaW0iLAllY29mZl9kaXJlY3RpdmVfZGltLAkwIH0sCi0gIHsgImVuZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2VuZGVmLAkwIH0sCi0gIHsgImZpbGUiLAllY29mZl9kaXJlY3RpdmVfZmlsZSwJMCB9LAotICB7ICJzY2wiLAllY29mZl9kaXJlY3RpdmVfc2NsLAkwIH0sCi0gIHsgInNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAotICB7ICJlc2l6ZSIsCWVjb2ZmX2RpcmVjdGl2ZV9zaXplLAkwIH0sCi0gIHsgInRhZyIsCWVjb2ZmX2RpcmVjdGl2ZV90YWcsCTAgfSwKLSAgeyAidHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCi0gIHsgImV0eXBlIiwJZWNvZmZfZGlyZWN0aXZlX3R5cGUsCTAgfSwKLSAgeyAidmFsIiwJZWNvZmZfZGlyZWN0aXZlX3ZhbCwJMCB9LAotCi0gIC8qIEVDT0ZGIHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHsgImJlZ2luIiwJZWNvZmZfZGlyZWN0aXZlX2JlZ2luLAkwIH0sCi0gIHsgImJlbmQiLAllY29mZl9kaXJlY3RpdmVfYmVuZCwJMCB9LAotICB7ICJlbmQiLAllY29mZl9kaXJlY3RpdmVfZW5kLAkwIH0sCi0gIHsgImVudCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbnQsCTAgfSwKLSAgeyAiZm1hc2siLAllY29mZl9kaXJlY3RpdmVfZm1hc2ssCTAgfSwKLSAgeyAiZnJhbWUiLAllY29mZl9kaXJlY3RpdmVfZnJhbWUsCTAgfSwKLSAgeyAibG9jIiwJZWNvZmZfZGlyZWN0aXZlX2xvYywJMCB9LAotICB7ICJtYXNrIiwJZWNvZmZfZGlyZWN0aXZlX21hc2ssCTAgfSwKLQotICAvKiBPdGhlciBFQ09GRiBkaXJlY3RpdmVzLiAgKi8KLSAgeyAiZXh0ZXJuIiwJZWNvZmZfZGlyZWN0aXZlX2V4dGVybiwJMCB9LAotCi0jaWZuZGVmIFRDX01JUFMKLSAgLyogRm9yIFRDX01JUFMsIHRjLW1pcHMuYyBhZGRzIHRoaXMuICovCi0gIHsgIndlYWtleHQiLAllY29mZl9kaXJlY3RpdmVfd2Vha2V4dCwgMCB9LAotI2VuZGlmCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgb24gSXJpeC4gIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZW0uICAqLwotICB7ICJiZ25iIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImVuZGIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidmVyc3RhbXAiLAlzX2lnbm9yZSwJCTAgfSwKLQotICAvKiBTZW50aW5lbC4gICovCi0gIHsgTlVMTCB9Ci19OwotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9scyBhbmQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBCRkQuICAqLwotCi12b2lkCi1lY29mZl9mcm9iX2ZpbGUgKCkKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoc3Rkb3V0cHV0KS0+ZGVidWdfc3dhcDsKLSAgYmZkX3ZtYSBhZGRyOwotICBhc2VjdGlvbiAqc2VjOwotICBIRFJSICpoZHI7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqc2V0OwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBWTUEgdmFsdWVzLiAgV2UgZm9yY2UgdGhlIC5zZGF0YSBhbmQgLnNic3MKLSAgICAgc2VjdGlvbnMgdG8gdGhlIGVuZCB0byBlbnN1cmUgdGhhdCB0aGVpciBWTUEgYWRkcmVzc2VzIGFyZSBjbG9zZQotICAgICB0b2dldGhlciBzbyB0aGF0IHRoZSBHUCByZWdpc3RlciBjYW4gYWRkcmVzcyBib3RoIG9mIHRoZW0uICBXZQotICAgICBwdXQgdGhlIC5ic3Mgc2VjdGlvbiBhZnRlciB0aGUgLnNic3Mgc2VjdGlvbi4KLQotICAgICBBbHNvLCBmb3IgdGhlIEFscGhhLCB3ZSBtdXN0IHNvcnQgdGhlIHNlY3Rpb25zLCB0byBtYWtlIHN1cmUgdGhleQotICAgICBhcHBlYXIgaW4gdGhlIG91dHB1dCBmaWxlIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgKEFjdHVhbGx5LCBtYXliZQotICAgICB0aGlzIGlzIGEgam9iIGZvciBCRkQuICBCdXQgdGhlIFZNQXMgY29tcHV0ZWQgd291bGQgYmUgb3V0IG9mCi0gICAgIHdoYWNrIGlmIHdlIGNvbXB1dGVkIHRoZW0gZ2l2ZW4gb3VyIGluaXRpYWwsIHJhbmRvbSBvcmRlcmluZy4KLSAgICAgSXQncyBwb3NzaWJsZSB0aGF0IHRoYXQgd291bGRuJ3QgYnJlYWsgdGhpbmdzOyBJIGNvdWxkIGRvIHNvbWUKLSAgICAgZXhwZXJpbWVudGluZyBzb21ldGltZSBhbmQgZmluZCBvdXQuCi0KLSAgICAgVGhpcyBvdXRwdXQgb3JkZXJpbmcgb2Ygc2VjdGlvbnMgaXMgbWFnaWMsIG9uIHRoZSBBbHBoYSwgYXQKLSAgICAgbGVhc3QuICBUaGUgLmxpdGEgc2VjdGlvbiBtdXN0IGNvbWUgYmVmb3JlIC5saXQ4IGFuZCAubGl0NCwKLSAgICAgb3RoZXJ3aXNlIHRoZSBPU0YvMSBsaW5rZXIgbWF5IHNpbGVudGx5IHRyYXNoIHRoZSAubGl0ezQsOH0KLSAgICAgc2VjdGlvbiBjb250ZW50cy4gIEFsc28sIC50ZXh0IG11c3QgcHJlY2VlZCAucmRhdGEuICBUaGVzZSBkaWZmZXIKLSAgICAgZnJvbSB0aGUgb3JkZXIgZGVzY3JpYmVkIGluIHNvbWUgcGFydHMgb2YgdGhlIERFQyBPU0YvMSBBc3NlbWJseQotICAgICBMYW5ndWFnZSBQcm9ncmFtbWVyJ3MgR3VpZGUsIGJ1dCB0aGF0IG9yZGVyIGRvZXNuJ3Qgc2VlbSB0byB3b3JrCi0gICAgIHdpdGggdGhlaXIgbGlua2VyLgotCi0gICAgIEkgZG9uJ3Qga25vdyBpZiBzZWN0aW9uIG9yZGVyaW5nIG9uIHRoZSBNSVBTIGlzIGltcG9ydGFudC4gICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10gPSB7Ci0gICAgLyogdGV4dCBzZWdtZW50ICovCi0gICAgIi50ZXh0IiwgIi5yZGF0YSIsICIuaW5pdCIsICIuZmluaSIsCi0gICAgLyogZGF0YSBzZWdtZW50ICovCi0gICAgIi5kYXRhIiwgIi5saXRhIiwgIi5saXQ4IiwgIi5saXQ0IiwgIi5zZGF0YSIsICIuZ290IiwKLSAgICAvKiBic3Mgc2VnbWVudCAqLwotICAgICIuc2JzcyIsICIuYnNzIiwKLSAgfTsKLSNkZWZpbmUgbl9uYW1lcyAoc2l6ZW9mIChuYW1lcykgLyBzaXplb2YgKG5hbWVzWzBdKSkKLQotICBhZGRyID0gMDsKLSAgewotICAgIC8qIFNlY3Rpb25zIHRoYXQgbWF0Y2ggbmFtZXMsIG9yZGVyIHRvIGJlIHN0cmFpZ2h0ZW5lZCBvdXQgbGF0ZXIuICAqLwotICAgIGFzZWN0aW9uICpzZWNzW25fbmFtZXNdOwotICAgIC8qIExpbmtlZCBsaXN0IG9mIHNlY3Rpb25zIHdpdGggbm9uLW1hdGNoaW5nIG5hbWVzLiAgUmFuZG9tIG9yZGVyaW5nLiAgKi8KLSAgICBhc2VjdGlvbiAqb3RoZXJfc2VjdGlvbnMgPSAwOwotICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBzZWN0aW9uLCBzaW5jZSB3ZSdyZSBkZXN0cm95aW5nIHRoZSBvcmlnaW5hbAotICAgICAgIG9yZGVyaW5nLiAgKi8KLSAgICBhc2VjdGlvbiAqbmV4dDsKLQotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLSAgICAgIHNlY3NbaV0gPSAwOwotICAgIGZvciAoc2VjID0gc3Rkb3V0cHV0LT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBuZXh0KQotICAgICAgewotCW5leHQgPSBzZWMtPm5leHQ7Ci0JZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLQkgIGlmICghc3RyY21wIChzZWMtPm5hbWUsIG5hbWVzW2ldKSkKLQkgICAgewotCSAgICAgIHNlY3NbaV0gPSBzZWM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAoaSA9PSBuX25hbWVzKQotCSAgewotCSAgICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlYywgYWRkcik7Ci0JICAgIGFkZHIgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBzZWMpOwotCSAgICBzZWMtPm5leHQgPSBvdGhlcl9zZWN0aW9uczsKLQkgICAgb3RoZXJfc2VjdGlvbnMgPSBzZWM7Ci0JICB9Ci0gICAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLSAgICAgIGlmIChzZWNzW2ldKQotCXsKLQkgIHNlYyA9IHNlY3NbaV07Ci0JICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlYywgYWRkcik7Ci0JICBhZGRyICs9IGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjKTsKLQl9Ci0gICAgZm9yIChpID0gbl9uYW1lcyAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgaWYgKHNlY3NbaV0pCi0JewotCSAgc2VjID0gc2Vjc1tpXTsKLQkgIHNlYy0+bmV4dCA9IG90aGVyX3NlY3Rpb25zOwotCSAgb3RoZXJfc2VjdGlvbnMgPSBzZWM7Ci0JfQotICAgIHN0ZG91dHB1dC0+c2VjdGlvbnMgPSBvdGhlcl9zZWN0aW9uczsKLSAgfQotCi0gIC8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBhc3NlcnQgKGVjb2ZmX2RhdGEgKHN0ZG91dHB1dCkgIT0gMCk7Ci0gIGhkciA9ICZlY29mZl9kYXRhIChzdGRvdXRwdXQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKLSAgZWNvZmZfYnVpbGRfZGVidWcgKGhkciwgJmJ1ZiwgZGVidWdfc3dhcCk7Ci0KLSAgLyogRmluaXNoIHVwIHRoZSBlY29mZl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotICBzZXQgPSBidWY7Ci0jZGVmaW5lIFNFVChwdHIsIGNvdW50LCB0eXBlLCBzaXplKSBcCi0gIGlmIChoZHItPmNvdW50ID09IDApIFwKLSAgICBlY29mZl9kYXRhIChzdGRvdXRwdXQpLT5kZWJ1Z19pbmZvLnB0ciA9ICh0eXBlKSBOVUxMOyBcCi0gIGVsc2UgXAotICAgIHsgXAotICAgICAgZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KS0+ZGVidWdfaW5mby5wdHIgPSAodHlwZSkgc2V0OyBcCi0gICAgICBzZXQgKz0gaGRyLT5jb3VudCAqIHNpemU7IFwKLSAgICB9Ci0KLSAgU0VUIChsaW5lLCBjYkxpbmUsIHVuc2lnbmVkIGNoYXIgKiwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIFNFVCAoZXh0ZXJuYWxfZG5yLCBpZG5NYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUpOwotICBTRVQgKGV4dGVybmFsX3BkciwgaXBkTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9zeW0sIGlzeW1NYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICBTRVQgKGV4dGVybmFsX29wdCwgaW9wdE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfYXV4LCBpYXV4TWF4LCB1bmlvbiBhdXhfZXh0ICosIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBTRVQgKHNzLCBpc3NNYXgsIGNoYXIgKiwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoc3NleHQsIGlzc0V4dE1heCwgY2hhciAqLCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChleHRlcm5hbF9yZmQsIGNyZmQsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOwotICBTRVQgKGV4dGVybmFsX2ZkciwgaWZkTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9leHQsIGlleHRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgU0VUCi0KLSAgLyogRmlsbCBpbiB0aGUgcmVnaXN0ZXIgbWFza3MuICAqLwotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBncHJtYXNrID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIGZwcm1hc2sgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgKmNwcm1hc2sgPSBOVUxMOwotCi0jaWZkZWYgVENfTUlQUwotICAgIC8qIEZpbGwgaW4gdGhlIE1JUFMgcmVnaXN0ZXIgbWFza3MuICBJdCdzIHByb2JhYmx5IG5vdCB3b3J0aAotICAgICAgIHNldHRpbmcgdXAgYSBnZW5lcmljIGludGVyZmFjZSBmb3IgdGhpcy4gICovCi0gICAgZ3BybWFzayA9IG1pcHNfZ3BybWFzazsKLSAgICBjcHJtYXNrID0gbWlwc19jcHJtYXNrOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19BTFBIQQotICAgIGFscGhhX2Zyb2JfZWNvZmZfZGF0YSAoKTsKLQotICAgIGlmICghIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgKHN0ZG91dHB1dCwgYWxwaGFfZ3BfdmFsdWUpKQotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IHNldCBHUCB2YWx1ZSIpKTsKLQotICAgIGdwcm1hc2sgPSBhbHBoYV9ncHJtYXNrOwotICAgIGZwcm1hc2sgPSBhbHBoYV9mcHJtYXNrOwotI2VuZGlmCi0KLSAgICBpZiAoISBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzIChzdGRvdXRwdXQsIGdwcm1hc2ssIGZwcm1hc2ssIGNwcm1hc2spKQotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IHNldCByZWdpc3RlciBtYXNrcyIpKTsKLSAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgRUNPRkYgY29kZSB0byBzZXQgdGhlIGV4dGVybmFsIGluZm9ybWF0aW9uCi0gICBmb3IgYSBzeW1ib2wuICBXZSBqdXN0IHBhc3MgaXQgb24gdG8gQkZELCB3aGljaCBleHBlY3RzIHRoZSBzd2FwcGVkCi0gICBpbmZvcm1hdGlvbiB0byBiZSBzdG9yZWQgaW4gdGhlIG5hdGl2ZSBmaWVsZCBvZiB0aGUgc3ltYm9sLiAgKi8KLQotdm9pZAotb2JqX2Vjb2ZmX3NldF9leHQgKHN5bSwgZXh0KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIEVYVFIgKmV4dDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoc3Rkb3V0cHV0KS0+ZGVidWdfc3dhcDsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmVzeW07Ci0KLSAga25vdyAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpCi0JPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKTsKLSAgZXN5bSA9IGVjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSk7Ci0gIGVzeW0tPmxvY2FsID0gZmFsc2U7Ci0gIGVzeW0tPm5hdGl2ZSA9IHhtYWxsb2MgKGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9vdXQpIChzdGRvdXRwdXQsIGV4dCwgZXN5bS0+bmF0aXZlKTsKLX0KLQotc3RhdGljIGludAotZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYykKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWNvZmZfZnJvYl9zeW1ib2wgKHN5bSwgcHVudHApCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50ICpwdW50cDsKLXsKLSAgZWNvZmZfZnJvYl9zeW1ib2wgKHN5bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lY29mZl9wb3BfaW5zZXJ0ICgpCi17Ci0gIHBvcF9pbnNlcnQgKG9ial9wc2V1ZG9fdGFibGUpOwotfQotCi1jb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlY29mZl9mb3JtYXRfb3BzID0KLXsKLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICAwLAotICAxLAotICBvYmpfZWNvZmZfZnJvYl9zeW1ib2wsCi0gIGVjb2ZmX2Zyb2JfZmlsZSwKLSAgMCwKLSAgMCwgMCwKLSAgMCwgMCwKLSAgMCwKLSAgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubywKLSAgZWNvZmZfc3RhYiwKLSAgZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGVjb2ZmX3BvcF9pbnNlcnQsCi0gIGVjb2ZmX3NldF9leHQsCi0gIGVjb2ZmX3JlYWRfYmVnaW5faG9vaywKLSAgZWNvZmZfc3ltYm9sX25ld19ob29rLAotfTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmggYi9nYXMvY29uZmlnL29iai1lY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmNhMjU0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiBFQ09GRiBvYmplY3QgZmlsZSBmb3JtYXQgaGVhZGVyIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9FQ09GRiAxCi0KLS8qIFVzZSB0aGUgZ2VuZXJpYyBFQ09GRiBkZWJ1Z2dpbmcgY29kZS4gICovCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAxCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpbmNsdWRlICJlY29mZi5oIgotCi0vKiBGb3IgZWFjaCBnYXMgc3ltYm9sIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggZmlsZSBpdCBjYW1lIGZyb20sIG9mCi0gICB3aGV0aGVyIHdlIGhhdmUgZ2VuZXJhdGVkIGFuIEVDT0ZGIHN5bWJvbCBmb3IgaXQsIGFuZCB3aGV0aGVyIHRoZQotICAgc3ltYm9scyBpcyB1bmRlZmluZWQgKHRoaXMgbGFzdCBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggYSAuZXh0ZXJuCi0gICBzeW1ib2xzIGZyb20gYSAuY29tbSBzeW1ib2wpLiAgKi8KLQotc3RydWN0IGVjb2ZmX3N5X29iagotewotICBzdHJ1Y3QgZWZkciAqZWNvZmZfZmlsZTsKLSAgc3RydWN0IGxvY2Fsc3ltICplY29mZl9zeW1ib2w7Ci0gIHZhbHVlVCBlY29mZl9leHRlcm5fc2l6ZTsKLX07Ci0KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgc3RydWN0IGVjb2ZmX3N5X29iagotCi0vKiBNb2RpZnkgdGhlIEVDT0ZGIHN5bWJvbC4gICovCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzeW1wLCBwdW50KSBlY29mZl9mcm9iX3N5bWJvbCAoc3ltcCkKLQotLyogVGhpcyBpcyB1c2VkIHRvIHdyaXRlIHRoZSBzeW1ib2xpYyBkYXRhIGluIHRoZSBmb3JtYXQgdGhhdCBCRkQKLSAgIGV4cGVjdHMgaXQuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZSgpIGVjb2ZmX2Zyb2JfZmlsZSAoKQotCi0vKiBXZSB1c2UgdGhlIEVDT0ZGIGZ1bmN0aW9ucyBhcyBvdXIgaG9va3MuICAqLwotI2RlZmluZSBvYmpfcmVhZF9iZWdpbl9ob29rIGVjb2ZmX3JlYWRfYmVnaW5faG9vawotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rIGVjb2ZmX3N5bWJvbF9uZXdfaG9vawotCi0vKiBSZWNvcmQgZmlsZSBzd2l0Y2hlcyBpbiB0aGUgRUNPRkYgc3ltYm9sIHRhYmxlLiAgKi8KLSNkZWZpbmUgb2JqX2FwcF9maWxlKG5hbWUpIGVjb2ZmX25ld19maWxlIChuYW1lKQotCi0vKiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHdhbnQgdG8gZG8gYW55IHN0YWJzIHByb2Nlc3NpbmcgaW4gcmVhZC5jLiAgKi8KLSNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQihzZWcsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpIFwKLSAgZWNvZmZfc3RhYiAoKHNlZyksICh3aGF0KSwgKHN0cmluZyksICh0eXBlKSwgKG90aGVyKSwgKGRlc2MpKQotCi0jZGVmaW5lIEVNSVRfU0VDVElPTl9TWU1CT0xTCQkwCi0jZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyhTRUMpCTEKLQotI2RlZmluZSBvYmpfZWNvZmZfc2V0X2V4dCBlY29mZl9zZXRfZXh0Ci1leHRlcm4gdm9pZCBvYmpfZWNvZmZfc2V0X2V4dCBQQVJBTVMgKChzeW1ib2xTICosIEVYVFIgKikpOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWxmLmMgYi9nYXMvY29uZmlnL29iai1lbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViODE2OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NDYgKzAsMCBAQAotLyogRUxGIG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5My05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1lbGYuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpZm5kZWYgRUNPRkZfREVCVUdHSU5HCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAwCi0jZWxzZQotI2RlZmluZSBORUVEX0VDT0ZGX0RFQlVHCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSNpbmNsdWRlICJlY29mZi5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19BTFBIQQotI2luY2x1ZGUgImVsZi9hbHBoYS5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19NSVBTCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNlbmRpZgotCi0jaWZkZWYgVENfUFBDCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotI2VuZGlmCi0KLXN0YXRpYyBiZmRfdm1hIGVsZl9zX2dldF9zaXplIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgZWxmX3Nfc2V0X3NpemUgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBlbGZfc19nZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc19zZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdm9pZCBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotc3RhdGljIGludCBlbGZfc2VjX3N5bV9va19mb3JfcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X3N0YWJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotc3RhdGljIGJvb2xlYW4gZWxmX2dldF9leHRyIFBBUkFNUyAoKGFzeW1ib2wgKiwgRVhUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIG9ial9lbGZfbGluZSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgb2JqX2VsZl92ZXJzaW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9zaXplIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl90eXBlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9pZGVudCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfd2VhayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfbG9jYWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3N5bXZlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfdnRhYmxlX2luaGVyaXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3Z0YWJsZV9lbnRyeSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfc3Vic2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfcG9wc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBlbGZfcHNldWRvX3RhYmxlW10gPQotewotICB7ImNvbW0iLCBvYmpfZWxmX2NvbW1vbiwgMH0sCi0gIHsiY29tbW9uIiwgb2JqX2VsZl9jb21tb24sIDF9LAotICB7ImlkZW50Iiwgb2JqX2VsZl9pZGVudCwgMH0sCi0gIHsibG9jYWwiLCBvYmpfZWxmX2xvY2FsLCAwfSwKLSAgeyJwcmV2aW91cyIsIG9ial9lbGZfcHJldmlvdXMsIDB9LAotICB7InNlY3Rpb24iLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAotICB7InNlY3Rpb24ucyIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdC5zIiwgb2JqX2VsZl9zZWN0aW9uLCAwfSwKLSAgeyJwdXNoc2VjdGlvbiIsIG9ial9lbGZfc2VjdGlvbiwgMX0sCi0gIHsicG9wc2VjdGlvbiIsIG9ial9lbGZfcG9wc2VjdGlvbiwgMH0sCi0gIHsic2l6ZSIsIG9ial9lbGZfc2l6ZSwgMH0sCi0gIHsidHlwZSIsIG9ial9lbGZfdHlwZSwgMH0sCi0gIHsidmVyc2lvbiIsIG9ial9lbGZfdmVyc2lvbiwgMH0sCi0gIHsid2VhayIsIG9ial9lbGZfd2VhaywgMH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgZm9yIHN0YWJzLWluLWVsZiBjb25maWd1cmF0aW9ucy4gICovCi0gIHsibGluZSIsIG9ial9lbGZfbGluZSwgMH0sCi0KLSAgLyogVGhpcyBpcyBhIEdOVSBleHRlbnNpb24gdG8gaGFuZGxlIHN5bWJvbCB2ZXJzaW9ucy4gICovCi0gIHsic3ltdmVyIiwgb2JqX2VsZl9zeW12ZXIsIDB9LAotCi0gIC8qIEEgR05VIGV4dGVuc2lvbiB0byBjaGFuZ2Ugc3Vic2VjdGlvbiBvbmx5LiAgKi8KLSAgeyJzdWJzZWN0aW9uIiwgb2JqX2VsZl9zdWJzZWN0aW9uLCAwfSwKLQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gYWlkIGluIGdhcmJhZ2UgY29sbGVjdGluZyBDKysgdnRhYmxlcy4gICovCi0gIHsidnRhYmxlX2luaGVyaXQiLCBvYmpfZWxmX3Z0YWJsZV9pbmhlcml0LCAwfSwKLSAgeyJ2dGFibGVfZW50cnkiLCBvYmpfZWxmX3Z0YWJsZV9lbnRyeSwgMH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgZm9yIGR3YXJmLiAqLwotICB7IjJieXRlIiwgY29ucywgMn0sCi0gIHsiNGJ5dGUiLCBjb25zLCA0fSwKLSAgeyI4Ynl0ZSIsIGNvbnMsIDh9LAotCi0gIC8qIFdlIG5lZWQgdG8gdHJhcCB0aGUgc2VjdGlvbiBjaGFuZ2luZyBjYWxscyB0byBoYW5kbGUgLnByZXZpb3VzLiAgKi8KLSAgeyJkYXRhIiwgb2JqX2VsZl9kYXRhLCAwfSwKLSAgeyJ0ZXh0Iiwgb2JqX2VsZl90ZXh0LCAwfSwKLQotICAvKiBFbmQgc2VudGluZWwuICAqLwotICB7TlVMTH0sCi19OwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZVtdID0KLXsKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIC8qIENPRkYgc3R5bGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBFQ09GRi4gLmxuIGlzIG5vdCB1c2VkOyAubG9jCi0gICAgIGlzIHVzZWQgaW5zdGVhZC4gICovCi0gIHsgImRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9kZWYsCTAgfSwKLSAgeyAiZGltIiwJZWNvZmZfZGlyZWN0aXZlX2RpbSwJMCB9LAotICB7ICJlbmRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwJMCB9LAotICB7ICJmaWxlIiwJZWNvZmZfZGlyZWN0aXZlX2ZpbGUsCTAgfSwKLSAgeyAic2NsIiwJZWNvZmZfZGlyZWN0aXZlX3NjbCwJMCB9LAotICB7ICJ0YWciLAllY29mZl9kaXJlY3RpdmVfdGFnLAkwIH0sCi0gIHsgInZhbCIsCWVjb2ZmX2RpcmVjdGl2ZV92YWwsCTAgfSwKLQotICAvKiBDT0ZGIGRlYnVnZ2luZyByZXF1aXJlcyBwc2V1ZG8tb3BzIC5zaXplIGFuZCAudHlwZSwgYnV0IEVMRgotICAgICBhbHJlYWR5IGhhcyBtZWFuaW5ncyBmb3IgdGhvc2UuICBXZSB1c2UgLmVzaXplIGFuZCAuZXR5cGUKLSAgICAgaW5zdGVhZC4gIFRoZXNlIGFyZSBvbmx5IGdlbmVyYXRlZCBieSBnY2MgYW55aG93LiAgKi8KLSAgeyAiZXNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAotICB7ICJldHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCi0KLSAgLyogRUNPRkYgc3BlY2lmaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgeyAiYmVnaW4iLAllY29mZl9kaXJlY3RpdmVfYmVnaW4sCTAgfSwKLSAgeyAiYmVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9iZW5kLAkwIH0sCi0gIHsgImVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmQsCTAgfSwKLSAgeyAiZW50IiwJZWNvZmZfZGlyZWN0aXZlX2VudCwJMCB9LAotICB7ICJmbWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9mbWFzaywJMCB9LAotICB7ICJmcmFtZSIsCWVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSwJMCB9LAotICB7ICJsb2MiLAllY29mZl9kaXJlY3RpdmVfbG9jLAkwIH0sCi0gIHsgIm1hc2siLAllY29mZl9kaXJlY3RpdmVfbWFzaywJMCB9LAotCi0gIC8qIE90aGVyIEVDT0ZGIGRpcmVjdGl2ZXMuICAqLwotICB7ICJleHRlcm4iLAllY29mZl9kaXJlY3RpdmVfZXh0ZXJuLAkwIH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgb24gSXJpeC4gIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZW0uICAqLwotICB7ICJhbGlhcyIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJiZ25iIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImVuZGIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAibGFiIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgIm5vYWxpYXMiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidmVyc3RhbXAiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidnJlZyIsCXNfaWdub3JlLAkJMCB9LAotI2VuZGlmCi0KLSAge05VTEx9CQkJLyogZW5kIHNlbnRpbmVsICovCi19OwotCi0jdW5kZWYgTk9fUkVMT0MKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzLiAgKi8KLQotdm9pZAotZWxmX2JlZ2luICgpCi17Ci0gIC8qIEFkZCBzeW1ib2xzIGZvciB0aGUga25vd24gc2VjdGlvbnMgdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LAotCQkJCQkJCQlURVhUX1NFQ1RJT05fTkFNRSkpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCQkJCURBVEFfU0VDVElPTl9OQU1FKSkpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwKLQkJCQkJCQkJQlNTX1NFQ1RJT05fTkFNRSkpKTsKLX0KLQotdm9pZAotZWxmX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAoZWxmX3BzZXVkb190YWJsZSk7Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgcG9wX2luc2VydCAoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZl9zX2dldF9zaXplIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgcmV0dXJuIFNfR0VUX1NJWkUgKHN5bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfc19zZXRfc2l6ZSAoc3ltLCBzeikKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBiZmRfdm1hIHN6OwotewotICBTX1NFVF9TSVpFIChzeW0sIHN6KTsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZl9zX2dldF9hbGlnbiAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBTX0dFVF9BTElHTiAoc3ltKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9zX3NldF9hbGlnbiAoc3ltLCBhbGlnbikKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBiZmRfdm1hIGFsaWduOwotewotICBTX1NFVF9BTElHTiAoc3ltLCBhbGlnbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyAoZGVzdCwgc3JjKQotICAgICBzeW1ib2xTICpkZXN0LCAqc3JjOwotewotICBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyAoZGVzdCwgc3JjKTsKLX0KLQotc3RhdGljIGludAotZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYyk7Ci19Ci0KLXZvaWQKLWVsZl9maWxlX3N5bWJvbCAocykKLSAgICAgY2hhciAqczsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9uZXcgKHMsIGFic29sdXRlX3NlY3Rpb24sICh2YWx1ZVQpIDAsIChzdHJ1Y3QgZnJhZyAqKSAwKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfRklMRTsKLQotICBpZiAoc3ltYm9sX3Jvb3RQICE9IHN5bSkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2luc2VydCAoc3ltLCBzeW1ib2xfcm9vdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotI2lmZGVmIERFQlVHCi0gICAgICB2ZXJpZnlfc3ltYm9sX2NoYWluIChzeW1ib2xfcm9vdFAsIHN5bWJvbF9sYXN0UCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGVjb2ZmX25ld19maWxlIChzKTsKLSNlbmRpZgotfQotCi12b2lkCi1vYmpfZWxmX2NvbW1vbiAoaXNfY29tbW9uKQotICAgICBpbnQgaXNfY29tbW9uOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBzaXplOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgaGF2ZV9hbGlnbjsKLQotICBpZiAoZmxhZ19tcmkgJiYgaXNfY29tbW9uKQotICAgIHsKLSAgICAgIHNfbXJpX2NvbW1vbiAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICBrbm93IChzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBoYXZlX2FsaWduID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGhhdmVfYWxpZ24gPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICBpZiAoISBoYXZlX2FsaWduIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotICAgIHsKLSAgICAgIGlmICghIGhhdmVfYWxpZ24pCi0JdGVtcCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKHRlbXAgPCAwKQotCSAgICB7Ci0JICAgICAgdGVtcCA9IDA7Ci0JICAgICAgYXNfd2FybiAoXygiQ29tbW9uIGFsaWdubWVudCBuZWdhdGl2ZTsgMCBhc3N1bWVkIikpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwpCi0JewotCSAgc2VnVCBvbGRfc2VjOwotCSAgaW50IG9sZF9zdWJzZWM7Ci0JICBjaGFyICpwZnJhZzsKLQkgIGludCBhbGlnbjsKLQotCS8qIGFsbG9jYXRlX2JzczogKi8KLQkgIG9sZF9zZWMgPSBub3dfc2VnOwotCSAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0JICBpZiAodGVtcCkKLQkgICAgewotCSAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLwotCSAgICAgIGZvciAoYWxpZ24gPSAwOyAodGVtcCAmIDEpID09IDA7IHRlbXAgPj49IDEsICsrYWxpZ24pOwotCSAgICAgIGlmICh0ZW1wICE9IDEpCi0JCXsKLQkJICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFsaWduID0gMDsKLQkgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkgICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKLQkgICpwZnJhZyA9IDA7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQlhbGxvY2F0ZV9jb21tb246Ci0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQotCXsKLQkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCSAgICA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfbG9jYWwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwgPSAxOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCA9IDE7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgc2VnVCBwcmV2aW91c19zZWN0aW9uOwotc3RhdGljIGludCBwcmV2aW91c19zdWJzZWN0aW9uOwotCi1zdHJ1Y3Qgc2VjdGlvbl9zdGFjawotewotICBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqbmV4dDsKLSAgc2VnVCBzZWcsIHByZXZfc2VnOwotICBpbnQgc3Vic2VnLCBwcmV2X3N1YnNlZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqc2VjdGlvbl9zdGFjazsKLQotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgY29kZSBzdXBwb3J0cyB0d28gZGlmZmVyZW50Ci0gICBzeW50YXhlcy4KLQotICAgVGhlIGZpcnN0IGlzIGZvdW5kIG9uIFNvbGFyaXMsIGFuZCBsb29rcyBsaWtlCi0gICAgICAgLnNlY3Rpb24gIi5zZWMxIiwjYWxsb2MsI2V4ZWNpbnN0ciwjd3JpdGUKLSAgIEhlcmUgdGhlIG5hbWVzIGFmdGVyICcjJyBhcmUgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZQotICAgc2VjdGlvbi4gIEknbSBub3Qgc3VyZSBob3cgaXQgZGV0ZXJtaW5lcyB0aGUgU0hUXyogdHlwZSAoQkZECi0gICBkb2Vzbid0IHJlYWxseSBnaXZlIHVzIGNvbnRyb2wgb3ZlciB0aGUgdHlwZSwgYW55aG93KS4KLQotICAgVGhlIHNlY29uZCBmb3JtYXQgaXMgZm91bmQgb24gVW5peFdhcmUsIGFuZCBwcm9iYWJseSBtb3N0IFNWUjQKLSAgIG1hY2hpbmVzLCBhbmQgbG9va3MgbGlrZQotICAgICAgIC5zZWN0aW9uIC5zZWMxLCJhIixAcHJvZ2JpdHMKLSAgIFRoZSBxdW90ZWQgc3RyaW5nIG1heSBjb250YWluIGFueSBjb21iaW5hdGlvbiBvZiBhLCB3LCB4LCBhbmQKLSAgIHJlcHJlc2VudHMgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZSBzZWN0aW9uLiAgVGhlIHN0cmluZwotICAgYmVnaW5uaW5nIHdpdGggJ0AnIGNhbiBiZSBwcm9nYml0cyBvciBub2JpdHMuICBUaGVyZSBzaG91bGQgYmUKLSAgIG90aGVyIHBvc3NpYmlsaXRpZXMsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGV5IGFyZS4gIEluIGFueSBjYXNlLAotICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGxldCB1cyBzZXQgdGhlIHNlY3Rpb24gdHlwZS4gICovCi0KLS8qIENlcnRhaW4gbmFtZWQgc2VjdGlvbnMgaGF2ZSBwYXJ0aWN1bGFyIGRlZmluZWQgdHlwZXMsIGxpc3RlZCBvbiBwLgotICAgNC0xOSBvZiB0aGUgQUJJLiAgKi8KLXN0cnVjdCBzcGVjaWFsX3NlY3Rpb24KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHR5cGU7Ci0gIGludCBhdHRyaWJ1dGVzOwotfTsKLQotc3RhdGljIHN0cnVjdCBzcGVjaWFsX3NlY3Rpb24gY29uc3Qgc3BlY2lhbF9zZWN0aW9uc1tdID0KLXsKLSAgeyAiLmJzcyIsCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmNvbW1lbnQiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmRhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmRhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUJCX0sCi0gIHsgIi5kZWJ1ZyIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuZmluaSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIuaW5pdCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIubGluZSIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIubm90ZSIsCVNIVF9OT1RFLAkwCQkJCX0sCi0gIHsgIi5yb2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5yb2RhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MJCQl9LAotICB7ICIudGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotCi0jaWZkZWYgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSAgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSNlbmRpZgotCi0jaWYgMAotICAvKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gbmFtZXMgYXJlIHNwZWNpYWwsIGJ1dCB0aGV5IGNhbiBub3QKLSAgICAgcmVhc29uYWJseSBhcHBlYXIgaW4gYXNzZW1ibGVyIGNvZGUuICBTb21lIG9mIHRoZSBhdHRyaWJ1dGVzIGFyZQotICAgICBwcm9jZXNzb3IgZGVwZW5kZW50LiAgKi8KLSAgeyAiLmR5bmFtaWMiLAlTSFRfRFlOQU1JQywJU0hGX0FMTE9DIC8qICsgU0hGX1dSSVRFICovIAl9LAotICB7ICIuZHluc3RyIiwJU0hUX1NUUlRBQiwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmR5bnN5bSIsCVNIVF9EWU5TWU0sCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5nb3QiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmhhc2giLAlTSFRfSEFTSCwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmludGVycCIsCVNIVF9QUk9HQklUUywJLyogU0hGX0FMTE9DICovCQkJfSwKLSAgeyAiLnBsdCIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuc2hzdHJ0YWIiLFNIVF9TVFJUQUIsCTAJCQkJfSwKLSAgeyAiLnN0cnRhYiIsCVNIVF9TVFJUQUIsCS8qIFNIRl9BTExPQyAqLwkJCX0sCi0gIHsgIi5zeW10YWIiLAlTSFRfU1lNVEFCLAkvKiBTSEZfQUxMT0MgKi8JCQl9LAotI2VuZGlmCi0KLSAgeyBOVUxMLAkwLAkJMAkJCQl9Ci19OwotCi12b2lkCi1vYmpfZWxmX2NoYW5nZV9zZWN0aW9uIChuYW1lLCB0eXBlLCBhdHRyLCBwdXNoKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgdHlwZSwgYXR0ciwgcHVzaDsKLXsKLSAgaW50IG5ld19zZWM7Ci0gIHNlZ1Qgc2VjOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAvKiBTd2l0Y2ggdG8gdGhlIHNlY3Rpb24sIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChwdXNoKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX3N0YWNrICplbHQ7Ci0gICAgICBlbHQgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX3N0YWNrKSk7Ci0gICAgICBlbHQtPm5leHQgPSBzZWN0aW9uX3N0YWNrOwotICAgICAgZWx0LT5zZWcgPSBub3dfc2VnOwotICAgICAgZWx0LT5wcmV2X3NlZyA9IHByZXZpb3VzX3NlY3Rpb247Ci0gICAgICBlbHQtPnN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBlbHQtPnByZXZfc3Vic2VnID0gcHJldmlvdXNfc3Vic2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fc3RhY2sgPSBlbHQ7Ci0gICAgfQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgbmV3X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsIG5hbWUpID09IE5VTEw7Ci0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotCi0gIGlmIChuZXdfc2VjKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgc3ltYm9sUyAqc2Vjc3ltOwotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBzZWN0aW9ucy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotICAgICAgICBpZiAoc3RyY21wIChuYW1lLCBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUpID09IDApCi0gICAgICAgICAgewotCSAgICBpZiAodHlwZSA9PSBTSFRfTlVMTCkKLQkgICAgICB0eXBlID0gc3BlY2lhbF9zZWN0aW9uc1tpXS50eXBlOwotCSAgICBlbHNlIGlmICh0eXBlICE9IHNwZWNpYWxfc2VjdGlvbnNbaV0udHlwZSkKLQkgICAgICBhc193YXJuIChfKCJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIHR5cGUgZm9yICVzIiksIG5hbWUpOwotCi0JICAgIGlmICgoYXR0ciAmfiBzcGVjaWFsX3NlY3Rpb25zW2ldLmF0dHJpYnV0ZXMpICE9IDApCi0JICAgICAgewotCSAgICAgICAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCB3ZSBwZXJtaXQgYSAubm90ZSBzZWN0aW9uIHRvIGJlCi0JCSAgIGFsbG9jYXRhYmxlLiAgSWYgdGhlIGxpbmtlciBzZWVzIGFuIGFsbG9jYXRlYWJsZSAubm90ZQotCQkgICBzZWN0aW9uLCBpdCB3aWxsIGNyZWF0ZSBhIFBUX05PVEUgc2VnbWVudCBpbiB0aGUgb3V0cHV0Ci0JCSAgIGZpbGUuICAqLwotCQlpZiAoc3RyY21wIChuYW1lLCAiLm5vdGUiKSAhPSAwCi0JCSAgICB8fCBhdHRyICE9IFNIRl9BTExPQykKLQkJICBhc193YXJuIChfKCJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIGF0dHJpYnV0ZXMgZm9yICVzIiksCi0JCQkgICBuYW1lKTsKLQkgICAgICB9Ci0JICAgIGF0dHIgfD0gc3BlY2lhbF9zZWN0aW9uc1tpXS5hdHRyaWJ1dGVzOwotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgLyogQ29udmVydCBFTEYgdHlwZSBhbmQgZmxhZ3MgdG8gQkZEIGZsYWdzLiAgKi8KLSAgICAgIGZsYWdzID0gKFNFQ19SRUxPQwotCSAgICAgICB8ICgoYXR0ciAmIFNIRl9XUklURSkgPyAwIDogU0VDX1JFQURPTkxZKQotCSAgICAgICB8ICgoYXR0ciAmIFNIRl9BTExPQykgPyBTRUNfQUxMT0MgOiAwKQotCSAgICAgICB8ICgoKGF0dHIgJiBTSEZfQUxMT0MpICYmIHR5cGUgIT0gU0hUX05PQklUUykgPyBTRUNfTE9BRCA6IDApCi0JICAgICAgIHwgKChhdHRyICYgU0hGX0VYRUNJTlNUUikgPyBTRUNfQ09ERSA6IDApKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9mbGFncwotICAgICAgZmxhZ3MgPSBtZF9lbGZfc2VjdGlvbl9mbGFncyAoZmxhZ3MsIGF0dHIsIHR5cGUpOwotI2VuZGlmCi0KLSAgICAgIC8qIFByZXZlbnQgU0VDX0hBU19DT05URU5UUyBmcm9tIGJlaW5nIGluYWR2ZXJ0ZW50bHkgc2V0LiAgKi8KLSAgICAgIGlmICh0eXBlID09IFNIVF9OT0JJVFMpCi0gICAgICAgIHNlZ19pbmZvIChzZWMpLT5ic3MgPSAxOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0KLSAgICAgIC8qIEFkZCBhIHN5bWJvbCBmb3IgdGhpcyBzZWN0aW9uIHRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgc2Vjc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAgICAgaWYgKHNlY3N5bSAhPSBOVUxMKQotCXN5bWJvbF9zZXRfYmZkc3ltIChzZWNzeW0sIHNlYy0+c3ltYm9sKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKHNlYykpOwotICAgIH0KLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gICAgICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1pbnQKLW9ial9lbGZfcGFyc2Vfc2VjdGlvbl9sZXR0ZXJzIChzdHIsIGxlbikKLSAgICAgY2hhciAqc3RyOwotICAgICBzaXplX3QgbGVuOwotewotICBpbnQgYXR0ciA9IDA7Ci0KLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc3dpdGNoICgqc3RyKQotCXsKLQljYXNlICdhJzoKLQkgIGF0dHIgfD0gU0hGX0FMTE9DOwotCSAgYnJlYWs7Ci0JY2FzZSAndyc6Ci0JICBhdHRyIHw9IFNIRl9XUklURTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgYXR0ciB8PSBTSEZfRVhFQ0lOU1RSOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHsKLQkgICAgY2hhciAqYmFkX21zZyA9IF8oIlVucmVjb2duaXplZCAuc2VjdGlvbiBhdHRyaWJ1dGU6IHdhbnQgYSx3LHgiKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIKLQkgICAgaW50IG1kX2F0dHIgPSBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIgKCpzdHIsICZiYWRfbXNnKTsKLQkgICAgaWYgKG1kX2F0dHIgPj0gMCkKLQkgICAgICBhdHRyIHw9IG1kX2F0dHI7Ci0JICAgIGVsc2UKLSNlbmRpZgotCSAgICAgIHsKLQkJYXNfd2FybiAoYmFkX21zZyk7Ci0JCWF0dHIgPSAtMTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBzdHIrKywgbGVuLS07Ci0gICAgfQotCi0gIHJldHVybiBhdHRyOwotfQotCi1pbnQKLW9ial9lbGZfc2VjdGlvbl93b3JkIChzdHIsIGxlbikKLSAgICAgY2hhciAqc3RyOwotICAgICBzaXplX3QgbGVuOwotewotICBpZiAobGVuID09IDUgJiYgc3RybmNtcCAoc3RyLCAid3JpdGUiLCA1KSA9PSAwKQotICAgIHJldHVybiBTSEZfV1JJVEU7Ci0gIGlmIChsZW4gPT0gNSAmJiBzdHJuY21wIChzdHIsICJhbGxvYyIsIDUpID09IDApCi0gICAgcmV0dXJuIFNIRl9BTExPQzsKLSAgaWYgKGxlbiA9PSA5ICYmIHN0cm5jbXAgKHN0ciwgImV4ZWNpbnN0ciIsIDkpID09IDApCi0gICAgcmV0dXJuIFNIRl9FWEVDSU5TVFI7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl93b3JkCi0gIHsKLSAgICBpbnQgbWRfYXR0ciA9IG1kX2VsZl9zZWN0aW9uX3dvcmQgKHN0ciwgbGVuKTsKLSAgICBpZiAobWRfYXR0ciA+PSAwKQotICAgICAgcmV0dXJuIG1kX2F0dHI7Ci0gIH0KLSNlbmRpZgotCi0gIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBzZWN0aW9uIGF0dHJpYnV0ZSIpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotb2JqX2VsZl9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIGlmIChsZW4gPT0gOCAmJiBzdHJuY21wIChzdHIsICJwcm9nYml0cyIsIDgpID09IDApCi0gICAgcmV0dXJuIFNIVF9QUk9HQklUUzsKLSAgaWYgKGxlbiA9PSA2ICYmIHN0cm5jbXAgKHN0ciwgIm5vYml0cyIsIDYpID09IDApCi0gICAgcmV0dXJuIFNIVF9OT0JJVFM7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl90eXBlCi0gIHsKLSAgICBpbnQgbWRfdHlwZSA9IG1kX2VsZl9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKTsKLSAgICBpZiAobWRfdHlwZSA+PSAwKQotICAgICAgcmV0dXJuIG1kX3R5cGU7Ci0gIH0KLSNlbmRpZgotCi0gIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiKSk7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1vYmpfZWxmX3NlY3Rpb24gKHB1c2gpCi0gICAgIGludCBwdXNoOwotewotICBjaGFyICpuYW1lLCAqYmVnLCAqZW5kOwotICBpbnQgdHlwZSwgYXR0ciwgZHVtbXk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgbXJpX3R5cGU7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gICAgICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgICAgIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotCi0gICAgICBzX21yaV9zZWN0ICgmbXJpX3R5cGUpOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgICAgIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogR2V0IG5hbWUgb2Ygc2VjdGlvbi4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotICAgIHsKLSAgICAgIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmR1bW15KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JewotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKDAgPT0gc3RyY2hyICgiXG5cdCw7ICIsICplbmQpKQotCWVuZCsrOwotICAgICAgaWYgKGVuZCA9PSBpbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCSAgYXNfd2FybiAoXygiTWlzc2luZyBzZWN0aW9uIG5hbWUiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAKLSAgICAgIG5hbWUgPSB4bWFsbG9jIChlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKLSAgICAgIG1lbWNweSAobmFtZSwgaW5wdXRfbGluZV9wb2ludGVyLCBlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgbmFtZVtlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXJdID0gJ1wwJzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGVuZDsKLSAgICB9Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICB0eXBlID0gU0hUX05VTEw7Ci0gIGF0dHIgPSAwOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICAvKiBTa2lwIHRoZSBjb21tYS4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCXsKLQkgIGJlZyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmZHVtbXkpOwotCSAgaWYgKGJlZyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGF0dHIgfD0gb2JqX2VsZl9wYXJzZV9zZWN0aW9uX2xldHRlcnMgKGJlZywgc3RybGVuIChiZWcpKTsKLQotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgY2hhciBjOwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoYyA9PSAnIicpCi0JCXsKLQkJICBiZWcgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmR1bW15KTsKLQkJICBpZiAoYmVnID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICB0eXBlID0gb2JqX2VsZl9zZWN0aW9uX3R5cGUgKGJlZywgc3RybGVuIChiZWcpKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJ0AnIHx8IGMgPT0gJyUnKQotCQl7Ci0JCSAgYmVnID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIHR5cGUgPSBvYmpfZWxmX3NlY3Rpb25fdHlwZSAoYmVnLCBpbnB1dF9saW5lX3BvaW50ZXIgLSBiZWcpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGNoYXIgYzsKLQotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIycpCi0JCXsKLQkJICBhc193YXJuIChfKCJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlIC0gY2hhcmFjdGVyIGZvbGxvd2luZyBuYW1lIGlzIG5vdCAnIyciKSk7Ci0JCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBiZWcgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLQkgICAgICBhdHRyIHw9IG9ial9lbGZfc2VjdGlvbl93b3JkIChiZWcsIGlucHV0X2xpbmVfcG9pbnRlciAtIGJlZyk7Ci0KLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgIH0KLQkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQkgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBvYmpfZWxmX2NoYW5nZV9zZWN0aW9uIChuYW1lLCB0eXBlLCBhdHRyLCBwdXNoKTsKLX0KLQotLyogQ2hhbmdlIHRvIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KLQotdm9pZAotb2JqX2VsZl9kYXRhIChpKQotICAgICBpbnQgaTsKLXsKLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc19kYXRhIChpKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLS8qIENoYW5nZSB0byB0aGUgLnRleHQgc2VjdGlvbi4gICovCi0KLXZvaWQKLW9ial9lbGZfdGV4dCAoaSkKLSAgICAgaW50IGk7Ci17Ci0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0gIHNfdGV4dCAoaSk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9zdWJzZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChub3dfc2VnLCAoc3Vic2VnVCkgdGVtcCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi0vKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgcHJvY2Vzc29yIGJhY2tlbmRzIGlmIHRoZXkgY2hhbmdlCi0gICBzZWN0aW9ucy4gICovCi0KLXZvaWQKLW9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKQotewotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci19Ci0KLXZvaWQKLW9ial9lbGZfcHJldmlvdXMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc2VnVCBuZXdfc2VjdGlvbjsKLSAgaW50IG5ld19zdWJzZWN0aW9uOwotCi0gIGlmIChwcmV2aW91c19zZWN0aW9uID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucHJldmlvdXMgd2l0aG91dCBjb3JyZXNwb25kaW5nIC5zZWN0aW9uOyBpZ25vcmVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgbmV3X3NlY3Rpb24gPSBwcmV2aW91c19zZWN0aW9uOwotICBuZXdfc3Vic2VjdGlvbiA9IHByZXZpb3VzX3N1YnNlY3Rpb247Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc3Vic2VnX3NldCAobmV3X3NlY3Rpb24sIG5ld19zdWJzZWN0aW9uKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3BvcHNlY3Rpb24gKHh4eCkKLSAgICAgaW50IHh4eDsKLXsKLSAgc3RydWN0IHNlY3Rpb25fc3RhY2sgKnRvcCA9IHNlY3Rpb25fc3RhY2s7Ci0KLSAgaWYgKHRvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnBvcHNlY3Rpb24gd2l0aG91dCBjb3JyZXNwb25kaW5nIC5wdXNoc2VjdGlvbjsgaWdub3JlZCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHNlY3Rpb25fc3RhY2sgPSB0b3AtPm5leHQ7Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSB0b3AtPnByZXZfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gdG9wLT5wcmV2X3N1YnNlZzsKLSAgc3Vic2VnX3NldCAodG9wLT5zZWcsIHRvcC0+c3Vic2VnKTsKLSAgZnJlZSAodG9wKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogQXNzdW1lIGRlbGltaXRlciBpcyBwYXJ0IG9mIGV4cHJlc3Npb24uICBCU0Q0LjIgYXMgZmFpbHMgd2l0aAotICAgICBkZWxpZ2h0ZnVsIGJ1Zywgc28gd2UgYXJlIG5vdCBiZWluZyBpbmNvbXBhdGlibGUgaGVyZS4gKi8KLSAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgKGludCkgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnN5bXZlciBwc2V1ZG8tb3AsIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lmeSBhCi0gICBzeW1ib2wgdmVyc2lvbi4gIFRoZSBzeW50YXggaXMgYGAuc3ltdmVyIE5BTUUsU1lNVkVSTkFNRScnLgotICAgU1lNVkVSTkFNRSBtYXkgY29udGFpbiBFTEZfVkVSX0NIUiAoJ0AnKSBjaGFyYWN0ZXJzLiAgVGhpcwotICAgcHNldWRvLW9wIGNhdXNlcyB0aGUgYXNzZW1ibGVyIHRvIGVtaXQgYSBzeW1ib2wgbmFtZWQgU1lNVkVSTkFNRQotICAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgc3ltYm9sIE5BTUUuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9zeW12ZXIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+dmVyc2lvbmVkX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm11bHRpcGxlIC5zeW12ZXIgZGlyZWN0aXZlcyBmb3Igc3ltYm9sIGAlcyciKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChjICE9IEVMRl9WRVJfQ0hSKQotCWJyZWFrOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLSAgICB9Ci0KLSAgc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKHN0cmNociAoc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lLCBFTEZfVkVSX0NIUikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmVyc2lvbiBuYW1lIGluIGAlcycgZm9yIHN5bWJvbCBgJXMnIiksCi0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lLCBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9pbmhlcml0IHBzZXVkby1vcCwgd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZQotICAgdG8gdGhlIGxpbmtlciB0aGUgaGllcmFyY2h5IGluIHdoaWNoIGEgcGFydGljdWxhciB0YWJsZSByZXNpZGVzLiAgVGhlCi0gICBzeW50YXggaXMgIi52dGFibGVfaW5oZXJpdCBDSElMRE5BTUUsIFBBUkVOVE5BTUUiLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdnRhYmxlX2luaGVyaXQgKGlnbm9yZSkKLXsKLSAgY2hhciAqY25hbWUsICpwbmFtZTsKLSAgc3ltYm9sUyAqY3N5bSwgKnBzeW07Ci0gIGNoYXIgYywgYmFkID0gMDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgY25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgY3N5bSA9IHN5bWJvbF9maW5kIChjbmFtZSk7Ci0KLSAgLyogR0NGSVhNRTogc2hvdWxkIGNoZWNrIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0d28gLnZ0YWJsZV9pbmhlcml0cyBmb3IKLSAgICAgdGhlIHNhbWUgY2hpbGQgc3ltYm9sLiAgQWxzbywgd2UgY2FuIGN1cnJlbnRseSBvbmx5IGRvIHRoaXMgaWYgdGhlCi0gICAgIGNoaWxkIHN5bWJvbCBpcyBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcGxhY2VkIGluIGEgZnJhZ21lbnQuICAqLwotCi0gIGlmIChjc3ltID09IE5VTEwgfHwgc3ltYm9sX2dldF9mcmFnIChjc3ltKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGAlcycgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQiLAotCSAgICAgIGNuYW1lKTsKLSAgICAgIGJhZCA9IDE7Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnZ0YWJsZV9pbmhlcml0Iik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotICAgICAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnCi0JICB8fCBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkpCi0gICAgewotICAgICAgcHN5bSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgcHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKHBuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChiYWQpCi0gICAgcmV0dXJuOwotCi0gIGFzc2VydCAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChjc3ltKS0+WF9vcCA9PSBPX2NvbnN0YW50KTsKLSAgZml4X25ldyAoc3ltYm9sX2dldF9mcmFnIChjc3ltKSwKLQkgICBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGNzeW0pLT5YX2FkZF9udW1iZXIsIDAsIHBzeW0sIDAsIDAsCi0JICAgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUKTsKLX0KLSAgCi0vKiBUaGlzIGhhbmRsZXMgdGhlIC52dGFibGVfZW50cnkgcHNldWRvLW9wLCB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlCi0gICB0byB0aGUgbGlua2VyIHRoYXQgYSB2dGFibGUgc2xvdCB3YXMgdXNlZC4gIFRoZSBzeW50YXggaXMKLSAgICIudnRhYmxlX2VudHJ5IHRhYmxlbmFtZSwgb2Zmc2V0Ii4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3Z0YWJsZV9lbnRyeSAoaWdub3JlKQotewotICBjaGFyICpuYW1lOwotICBzeW1ib2xTICpzeW07Ci0gIG9mZnNldFQgb2Zmc2V0OwotICBjaGFyIGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnZ0YWJsZV9lbnRyeSIpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBvZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBmaXhfbmV3IChmcmFnX25vdywgZnJhZ19ub3dfZml4ICgpLCAwLCBzeW0sIG9mZnNldCwgMCwKLQkgICBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX3JlYWRfYmVnaW5faG9vayAoKTsKLSNlbmRpZgotfQotCi12b2lkCi1vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBzdHJ1Y3QgZWxmX29ial9zeSAqc3lfb2JqOwotCi0gIHN5X29iaiA9IHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKTsKLSAgc3lfb2JqLT5zaXplID0gTlVMTDsKLSAgc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSA9IE5VTEw7Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLSNlbmRpZgotfQotCi12b2lkCi1vYmpfZWxmX3ZlcnNpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGNoYXIgY2g7Ci0gIGNoYXIgKnA7Ci0gIGFzZWN0aW9uICpzZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIEVsZl9JbnRlcm5hbF9Ob3RlIGlfbm90ZTsKLSAgRWxmX0V4dGVybmFsX05vdGUgZV9ub3RlOwotICBhc2VjdGlvbiAqbm90ZV9zZWNwID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGludCBpLCBsZW47Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCInKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKiAtPiAxc3QgY2hhciBvZiBzdHJpbmcuICovCi0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLSAgICAgICooaW5wdXRfbGluZV9wb2ludGVyIC0gMSkgPSAnXDAnOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIC8qIGNyZWF0ZSB0aGUgLm5vdGUgc2VjdGlvbiAqLwotCi0gICAgICBub3RlX3NlY3AgPSBzdWJzZWdfbmV3ICgiLm5vdGUiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LAotCQkJICAgICBub3RlX3NlY3AsCi0JCQkgICAgIFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkpOwotCi0gICAgICAvKiBwcm9jZXNzIHRoZSB2ZXJzaW9uIHN0cmluZyAqLwotCi0gICAgICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotCi0gICAgICBpX25vdGUubmFtZXN6ID0gKChsZW4gKyAxKSArIDMpICYgfjM7IC8qIHJvdW5kIHRoaXMgdG8gd29yZCBib3VuZGFyeSAqLwotICAgICAgaV9ub3RlLmRlc2NzeiA9IDA7CS8qIG5vIGRlc2NyaXB0aW9uICovCi0gICAgICBpX25vdGUudHlwZSA9IE5UX1ZFUlNJT047Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS5uYW1lc3opKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLm5hbWVzeiwgNCk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS5kZXNjc3opKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLmRlc2NzeiwgNCk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS50eXBlKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS50eXBlLCA0KTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCXsKLQkgIGNoID0gKihuYW1lICsgaSk7Ci0JICB7Ci0JICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoY2gpOwotCSAgfQotCX0KLSAgICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgY2hhciAqcDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBzeW1ib2xTICpzeW07Ci0KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgYCVzJyBpbiAuc2l6ZSBkaXJlY3RpdmUiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGV4cHJlc3Npb24gaW4gLnNpemUgZGlyZWN0aXZlIikpOwotICAgICAgZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIFNfU0VUX1NJWkUgKHN5bSwgZXhwLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9Ci0JKGV4cHJlc3Npb25TICopIHhtYWxsb2MgKHNpemVvZiAoZXhwcmVzc2lvblMpKTsKLSAgICAgICpzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9IGV4cDsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgRUxGIC50eXBlIHBzZXVkby1vcC4gIFRoaXMgc2V0cyB0aGUgdHlwZSBvZiBhIHN5bWJvbC4KLSAgIFRoZXJlIGFyZSBmb3VyIHN5bnRheGVzOgotICAgCi0gICBUaGUgZmlyc3QgKHVzZWQgb24gU29sYXJpcykgaXMKLSAgICAgICAudHlwZSBTWU0sI2Z1bmN0aW9uCi0gICBUaGUgc2Vjb25kICh1c2VkIG9uIFVuaXhXYXJlKSBpcwotICAgICAgIC50eXBlIFNZTSxAZnVuY3Rpb24KLSAgIFRoZSB0aGlyZCAocmVwb3J0ZWRseSB0byBiZSB1c2VkIG9uIElyaXggNi4wKSBpcwotICAgICAgIC50eXBlIFNZTSBTVFRfRlVOQwotICAgVGhlIGZvdXJ0aCAodXNlZCBvbiBOZXRCU0QvQXJtIGFuZCBMaW51eC9BUk0pIGlzCi0gICAgICAgLnR5cGUgU1lNLCVmdW5jdGlvbgotICAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGludCB0eXBlOwotICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnCi0gICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICdAJwotICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgdHlwZW5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICB0eXBlID0gMDsKLSAgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJmdW5jdGlvbiIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAodHlwZW5hbWUsICJTVFRfRlVOQyIpID09IDApCi0gICAgdHlwZSA9IEJTRl9GVU5DVElPTjsKLSAgZWxzZSBpZiAoc3RyY21wICh0eXBlbmFtZSwgIm9iamVjdCIpID09IDAKLQkgICB8fCBzdHJjbXAgKHR5cGVuYW1lLCAiU1RUX09CSkVDVCIpID09IDApCi0gICAgdHlwZSA9IEJTRl9PQkpFQ1Q7Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oImlnbm9yaW5nIHVucmVjb2duaXplZCBzeW1ib2wgdHlwZSBcIiVzXCIiKSwgdHlwZW5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSB0eXBlOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2lkZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN0YXRpYyBzZWdUIGNvbW1lbnRfc2VjdGlvbjsKLSAgc2VnVCBvbGRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBvbGRfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgaWYgKCFjb21tZW50X3NlY3Rpb24pCi0gICAgewotICAgICAgY2hhciAqcDsKLSAgICAgIGNvbW1lbnRfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuY29tbWVudCIsIDApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGNvbW1lbnRfc2VjdGlvbiwKLQkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX0hBU19DT05URU5UUyk7Ci0gICAgICBwID0gZnJhZ19tb3JlICgxKTsKLSAgICAgICpwID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzdWJzZWdfc2V0IChjb21tZW50X3NlY3Rpb24sIDApOwotICBzdHJpbmdlciAoMSk7Ci0gIHN1YnNlZ19zZXQgKG9sZF9zZWN0aW9uLCBvbGRfc3Vic2VjdGlvbik7Ci19Ci0KLSNpZmRlZiBJTklUX1NUQUJfU0VDVElPTgotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbiBpcyBzcGVjaWFsLiAgKi8KLQotdm9pZAotb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3RhYnN0cl9uYW1lOwotICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotCi0gIC8qIEZvcmNlIHRoZSBzZWN0aW9uIHRvIGFsaWduIHRvIGEgbG9uZ3dvcmQgYm91bmRhcnkuICBXaXRob3V0IHRoaXMsCi0gICAgIFVuaXhXYXJlIGFyIGNyYXNoZXMuICAqLwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgMik7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhpcyBmaXJzdCBzeW1ib2wuICovCi0gIHAgPSBmcmFnX21vcmUgKDEyKTsKLSAgLyogWmVybyBpdCBvdXQuICovCi0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0YWJzdHJfbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWdtZW50X25hbWUgKHNlZykpICsgNCk7Ci0gIHN0cmNweSAoc3RhYnN0cl9uYW1lLCBzZWdtZW50X25hbWUgKHNlZykpOwotICBzdHJjYXQgKHN0YWJzdHJfbmFtZSwgInN0ciIpOwotICBzdHJvZmYgPSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChmaWxlLCBzdGFic3RyX25hbWUpOwotICBrbm93IChzdHJvZmYgPT0gMSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgc3Ryb2ZmLCA0KTsKLSAgc2VnX2luZm8gKHNlZyktPnN0YWJ1LnAgPSBwOwotfQotCi0jZW5kaWYKLQotLyogRmlsbCBpbiB0aGUgY291bnRzIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFicyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zdGFiX3NlY3Rpb25zIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBjaGFyICpuYW1lOwotICBhc2VjdGlvbiAqc3Ryc2VjOwotICBjaGFyICpwOwotICBpbnQgc3Ryc3osIG5zeW1zOwotCi0gIGlmIChzdHJuY21wICgiLnN0YWIiLCBzZWMtPm5hbWUsIDUpKQotICAgIHJldHVybjsKLSAgaWYgKCFzdHJjbXAgKCJzdHIiLCBzZWMtPm5hbWUgKyBzdHJsZW4gKHNlYy0+bmFtZSkgLSAzKSkKLSAgICByZXR1cm47Ci0KLSAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWMtPm5hbWUpICsgNCk7Ci0gIHN0cmNweSAobmFtZSwgc2VjLT5uYW1lKTsKLSAgc3RyY2F0IChuYW1lLCAic3RyIik7Ci0gIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLSAgaWYgKHN0cnNlYykKLSAgICBzdHJzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0cnNlYyk7Ci0gIGVsc2UKLSAgICBzdHJzeiA9IDA7Ci0gIG5zeW1zID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSAvIDEyIC0gMTsKLQotICBwID0gc2VnX2luZm8gKHNlYyktPnN0YWJ1LnA7Ci0gIGFzc2VydCAocCAhPSAwKTsKLQotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBuc3ltcywgKGJmZF9ieXRlICopIHAgKyA2KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3Ryc3osIChiZmRfYnl0ZSAqKSBwICsgOCk7Ci19Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFQ09GRiBjb2RlLiAgSXQgaXMgc3VwcG9zZWQgdG8KLSAgIHJlY29yZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGJhY2tlbmQgY2FuCi0gICB3cml0ZSBpdCBvdXQgY29ycmVjdGx5LiAgVGhlIEVMRiBiYWNrZW5kIGRvZXNuJ3QgYWN0dWFsbHkgaGFuZGxlCi0gICB0aGlzIGF0IHRoZSBtb21lbnQsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4gIFdlIHNhdmUgdGhlIGluZm9ybWF0aW9uCi0gICBpbiB0aGUgc3ltYm9sLiAgKi8KLQotdm9pZAotZWxmX2Vjb2ZmX3NldF9leHQgKHN5bSwgZXh0KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN0cnVjdCBlY29mZl9leHRyICpleHQ7Ci17Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT51ZGF0YS5wID0gKFBUUikgZXh0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaXMKLSAgIHN1cHBvc2VkIHRvICpFWFQgdG8gdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiwgYW5kIHJldHVybgotICAgd2hldGhlciB0aGUgc3ltYm9sIHNob3VsZCBiZSB1c2VkIGF0IGFsbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2V0X2V4dHIgKHN5bSwgZXh0KQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmV4dDsKLXsKLSAgaWYgKHN5bS0+dWRhdGEucCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKmV4dCA9ICooRVhUUiAqKSBzeW0tPnVkYXRhLnA7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaGFzCi0gICBub3RoaW5nIHRvIGRvIGZvciBFTEYuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1lbGZfc2V0X2luZGV4IChzeW0sIGluZHgpCi0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotewotfQotCi0jZW5kaWYgLyogTkVFRF9FQ09GRl9ERUJVRyAqLwotCi12b2lkCi1lbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgKnB1bnRwOwotewotICBzdHJ1Y3QgZWxmX29ial9zeSAqc3lfb2JqOwotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2Zyb2Jfc3ltYm9sIChzeW1wKTsKLSNlbmRpZgotCi0gIHN5X29iaiA9IHN5bWJvbF9nZXRfb2JqIChzeW1wKTsKLQotICBpZiAoc3lfb2JqLT5zaXplICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChzeV9vYmotPnNpemUtPlhfb3ApCi0JewotCWNhc2UgT19zdWJ0cmFjdDoKLQkgIFNfU0VUX1NJWkUgKHN5bXAsCi0JCSAgICAgIChTX0dFVF9WQUxVRSAoc3lfb2JqLT5zaXplLT5YX2FkZF9zeW1ib2wpCi0JCSAgICAgICArIHN5X29iai0+c2l6ZS0+WF9hZGRfbnVtYmVyCi0JCSAgICAgICAtIFNfR0VUX1ZBTFVFIChzeV9vYmotPnNpemUtPlhfb3Bfc3ltYm9sKSkpOwotCSAgYnJlYWs7Ci0JY2FzZSBPX2NvbnN0YW50OgotCSAgU19TRVRfU0laRSAoc3ltcCwKLQkJICAgICAgKFNfR0VUX1ZBTFVFIChzeV9vYmotPnNpemUtPlhfYWRkX3N5bWJvbCkKLQkJICAgICAgICsgc3lfb2JqLT5zaXplLT5YX2FkZF9udW1iZXIpKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19iYWQgKF8oIi5zaXplIGV4cHJlc3Npb24gdG9vIGNvbXBsaWNhdGVkIHRvIGZpeCB1cCIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZyZWUgKHN5X29iai0+c2l6ZSk7Ci0gICAgICBzeV9vYmotPnNpemUgPSBOVUxMOwotICAgIH0KLQotICBpZiAoc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBnaXZlbiBhIG5ldyBuYW1lIHdpdGggdGhlIC5zeW12ZXIgZGlyZWN0aXZlLgotCi0gICAgICAgICBJZiB0aGlzIGlzIGFuIGV4dGVybmFsIHJlZmVyZW5jZSwganVzdCByZW5hbWUgdGhlIHN5bWJvbCB0bwotICAgICAgICAgaW5jbHVkZSB0aGUgdmVyc2lvbiBzdHJpbmcuICBUaGlzIHdpbGwgbWFrZSB0aGUgcmVsb2NzIGJlCi0gICAgICAgICBhZ2FpbnN0IHRoZSBjb3JyZWN0IHZlcnNpb25lZCBzeW1ib2wuCi0KLQkgSWYgdGhpcyBpcyBhIGRlZmluaXRpb24sIGFkZCBhbiBhbGlhcy4gIEZJWE1FOiBVc2luZyBhbiBhbGlhcwotCSB3aWxsIHBlcm1pdCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHJlZmVyIHRvIHRoZSByaWdodAotCSBzeW1ib2wuICBIb3dldmVyLCBpdCdzIG5vdCBjbGVhciB3aGV0aGVyIGl0IGlzIHRoZSBiZXN0Ci0JIGFwcHJvYWNoLiAgKi8KLQotICAgICAgaWYgKCEgU19JU19ERUZJTkVEIChzeW1wKSkKLQl7Ci0JICBjaGFyICpwOwotCi0JICAvKiBWZXJpZnkgdGhhdCB0aGUgbmFtZSBpc24ndCB1c2luZyB0aGUgQEAgc3ludGF4LS10aGlzIGlzCi0gICAgICAgICAgICAgcmVzZXJ2ZWQgZm9yIGRlZmluaXRpb25zIG9mIHRoZSBkZWZhdWx0IHZlcnNpb24gdG8gbGluawotICAgICAgICAgICAgIGFnYWluc3QuICAqLwotCSAgcCA9IHN0cmNociAoc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSwgRUxGX1ZFUl9DSFIpOwotCSAga25vdyAocCAhPSBOVUxMKTsKLQkgIGlmIChwWzFdID09IEVMRl9WRVJfQ0hSKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGF0dGVtcHQgdG8gZGVjbGFyZSBleHRlcm5hbCB2ZXJzaW9uIG5hbWUgYXMgZGVmYXVsdCBpbiBzeW1ib2wgYCVzJyIpLAotCQkgICAgICBzeV9vYmotPnZlcnNpb25lZF9uYW1lKTsKLQkgICAgICAqcHVudHAgPSB0cnVlOwotCSAgICB9Ci0JICBTX1NFVF9OQU1FIChzeW1wLCBzeV9vYmotPnZlcnNpb25lZF9uYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sUyAqc3ltcDI7Ci0KLQkgIC8qIEZJWE1FOiBDcmVhdGluZyBhIG5ldyBzeW1ib2wgaGVyZSBpcyByaXNreS4gIFdlJ3JlIGluIHRoZQotICAgICAgICAgICAgIGZpbmFsIGxvb3Agb3ZlciB0aGUgc3ltYm9sIHRhYmxlLiAgV2UgY2FuIGdldCBhd2F5IHdpdGgKLSAgICAgICAgICAgICBpdCBvbmx5IGJlY2F1c2UgdGhlIHN5bWJvbCBnb2VzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsCi0gICAgICAgICAgICAgd2hlcmUgdGhlIGxvb3Agd2lsbCBzdGlsbCBzZWUgaXQuICBJdCB3b3VsZCBwcm9iYWJseSBiZQotICAgICAgICAgICAgIGJldHRlciB0byBkbyB0aGlzIGluIG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdC4gKi8KLQotCSAgc3ltcDIgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChzeV9vYmotPnZlcnNpb25lZF9uYW1lKTsKLQotCSAgLyogTm93IHdlIGFjdCBhcyB0aG91Z2ggd2Ugc2F3IHN5bXAyID0gc3ltLiAgKi8KLQotCSAgU19TRVRfU0VHTUVOVCAoc3ltcDIsIFNfR0VUX1NFR01FTlQgKHN5bXApKTsKLQotCSAgLyogU3VidHJhY3Rpbmcgb3V0IHRoZSBmcmFnIGFkZHJlc3MgaGVyZSBpcyBhIGhhY2sgYmVjYXVzZQotICAgICAgICAgICAgIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBmaW5hbCBsb29wLiAgKi8KLQkgIFNfU0VUX1ZBTFVFIChzeW1wMiwKLQkJICAgICAgIChTX0dFVF9WQUxVRSAoc3ltcCkKLQkJCS0gc3ltYm9sX2dldF9mcmFnIChzeW1wKS0+ZnJfYWRkcmVzcykpOwotCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bXAyLCBzeW1ib2xfZ2V0X2ZyYWcgKHN5bXApKTsKLQotCSAgLyogVGhpcyB3aWxsIGNvcHkgb3ZlciB0aGUgc2l6ZSBpbmZvcm1hdGlvbi4gICovCi0JICBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChzeW1wMiwgc3ltcCk7Ci0KLQkgIGlmIChTX0lTX1dFQUsgKHN5bXApKQotCSAgICBTX1NFVF9XRUFLIChzeW1wMik7Ci0KLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKLQkgICAgU19TRVRfRVhURVJOQUwgKHN5bXAyKTsKLQl9Ci0gICAgfQotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoU19JU19XRUFLIChzeW1wKSkKLSAgICB7Ci0gICAgICBpZiAoU19JU19DT01NT04gKHN5bXApKQotCWFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAotCQlTX0dFVF9OQU1FIChzeW1wKSk7Ci0gICAgfQotCi0jaWZkZWYgVENfTUlQUwotICAvKiBUaGUgSXJpeCA1IGFuZCA2IGFzc2VtYmxlcnMgc2V0IHRoZSB0eXBlIG9mIGFueSBjb21tb24gc3ltYm9sIGFuZAotICAgICBhbnkgdW5kZWZpbmVkIG5vbi1mdW5jdGlvbiBzeW1ib2wgdG8gU1RUX09CSkVDVC4gIFdlIHRyeSB0byBiZQotICAgICBjb21wYXRpYmxlLCBzaW5jZSBuZXdlciBJcml4IDUgYW5kIDYgbGlua2VycyBjYXJlLiAgSG93ZXZlciwgd2UKLSAgICAgb25seSBzZXQgdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgU1RUX09CSkVDVCBpZiB3ZSBhcmUgb24gSXJpeCwKLSAgICAgYmVjYXVzZSB0aGF0IGlzIHRoZSBvbmx5IHRpbWUgZ2NjIHdpbGwgZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeQotICAgICAuZ2xvYmFsIGRpcmVjdGl2ZXMgdG8gbWFyayBmdW5jdGlvbnMuICAqLwotCi0gIGlmIChTX0lTX0NPTU1PTiAoc3ltcCkpCi0gICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCi0gIGlmIChzdHJzdHIgKFRBUkdFVF9PUywgImlyaXgiKSAhPSBOVUxMCi0gICAgICAmJiAhIFNfSVNfREVGSU5FRCAoc3ltcCkKLSAgICAgICYmIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwKQotICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLSNlbmRpZgotCi0jaWZkZWYgVENfUFBDCi0gIC8qIEZyb2IgdGhlIFBvd2VyUEMsIHNvIHRoYXQgdGhlIHN5bWJvbCBhbHdheXMgaGFzIG9iamVjdCB0eXBlCi0gICAgIGlmIGl0IGlzIG5vdCBzb21lIG90aGVyIHR5cGUuICBWeFdvcmtzIG5lZWRzIHRoaXMuICAqLwotICBpZiAoKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MKLSAgICAgICAmIChCU0ZfRlVOQ1RJT04gfCBCU0ZfRklMRSB8IEJTRl9TRUNUSU9OX1NZTSkpID09IDAKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoc3ltcCkpCi0gICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotI2VuZGlmCi19Ci0KLXZvaWQKLWVsZl9mcm9iX2ZpbGUgKCkKLXsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGFkanVzdF9zdGFiX3NlY3Rpb25zLCAoUFRSKSAwKTsKLQotI2lmZGVmIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nCi0gIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nICgpOwotI2VuZGlmCi19Ci0KLS8qIEl0IGlzIHJlcXVpcmVkIHRoYXQgd2UgbGV0IHdyaXRlX3JlbG9jcyBoYXZlIHRoZSBvcHBvcnR1bml0eSB0bwotICAgb3B0aW1pemUgYXdheSBmaXh1cHMgYmVmb3JlIG91dHB1dCBoYXMgYmVndW4sIHNpbmNlIGl0IGlzIHBvc3NpYmxlCi0gICB0byBlbGltaW5hdGUgYWxsIGZpeHVwcyBmb3IgYSBzZWN0aW9uIGFuZCB0aHVzIHdlIG5ldmVyIHNob3VsZAotICAgaGF2ZSBnZW5lcmF0ZWQgdGhlIHJlbG9jYXRpb24gc2VjdGlvbi4gICovCi0KLXZvaWQKLWVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpCi17Ci0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIC8qIEdlbmVyYXRlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpkZWJ1Z19zd2FwOwotICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gICAgICBjaGFyICpidWY7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBkZWJ1Z19zd2FwCi0JPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoc3Rkb3V0cHV0KS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgICAgIGtub3cgKGRlYnVnX3N3YXAgIT0gKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICopIE5VTEwpOwotICAgICAgZWNvZmZfYnVpbGRfZGVidWcgKCZkZWJ1Zy5zeW1ib2xpY19oZWFkZXIsICZidWYsIGRlYnVnX3N3YXApOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHBvaW50ZXJzIGluIGRlYnVnLiAgKi8KLSNkZWZpbmUgU0VUKHB0ciwgb2Zmc2V0LCB0eXBlKSBcCi0gICAgZGVidWcucHRyID0gKHR5cGUpIChidWYgKyBkZWJ1Zy5zeW1ib2xpY19oZWFkZXIub2Zmc2V0KQotCi0gICAgICBTRVQgKGxpbmUsIGNiTGluZU9mZnNldCwgdW5zaWduZWQgY2hhciAqKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX3N5bSwgY2JTeW1PZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIHVuaW9uIGF1eF9leHQgKik7Ci0gICAgICBTRVQgKHNzLCBjYlNzT2Zmc2V0LCBjaGFyICopOwotICAgICAgU0VUIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX3JmZCwgY2JSZmRPZmZzZXQsIFBUUik7Ci0gICAgICAvKiBzc2V4dCBhbmQgZXh0ZXJuYWxfZXh0IGFyZSBzZXQgdXAganVzdCBiZWxvdy4gICovCi0KLSN1bmRlZiBTRVQKLQotICAgICAgLyogU2V0IHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgICAgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLSAgICAgIGRlYnVnLmV4dGVybmFsX2V4dCA9IGRlYnVnLmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyAoc3Rkb3V0cHV0LCAmZGVidWcsIGRlYnVnX3N3YXAsIHRydWUsCi0JCQkJICAgICAgIGVsZl9nZXRfZXh0ciwgZWxmX3NldF9pbmRleCkpCi0JYXNfZmF0YWwgKF8oIkZhaWxlZCB0byBzZXQgdXAgZGVidWdnaW5nIGluZm9ybWF0aW9uOiAlcyIpLAotCQkgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgIi5tZGVidWciKTsKLSAgICAgIGFzc2VydCAoc2VjICE9IE5VTEwpOwotCi0gICAgICBrbm93IChzdGRvdXRwdXQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpOwotCi0gICAgICAvKiBXZSBzZXQgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24sIGNhbGwgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0JIHRvIGZvcmNlIHRoZSBFTEYgYmFja2VuZCB0byBhbGxvY2F0ZSBhIGZpbGUgcG9zaXRpb24sIGFuZCB0aGVuCi0JIHdyaXRlIG91dCB0aGUgZGF0YS4gIEZJWE1FOiBJcyB0aGlzIHJlYWxseSB0aGUgYmVzdCB3YXkgdG8gZG8KLQkgdGhpcz8gICovCi0gICAgICBzZWMtPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChzdGRvdXRwdXQsICZkZWJ1ZywgZGVidWdfc3dhcCk7Ci0KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsIChQVFIpIE5VTEwsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSkgMCkpCi0JYXNfZmF0YWwgKF8oIkNhbid0IHN0YXJ0IHdyaXRpbmcgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIpLAotCQkgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQotICAgICAga25vdyAoc3Rkb3V0cHV0LT5vdXRwdXRfaGFzX2JlZ3VuID09IHRydWUpOwotICAgICAga25vdyAoc2VjLT5maWxlcG9zICE9IDApOwotCi0gICAgICBpZiAoISBiZmRfZWNvZmZfd3JpdGVfZGVidWcgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwLAotCQkJCSAgIHNlYy0+ZmlsZXBvcykpCi0JYXNfZmF0YWwgKF8oIkNvdWxkIG5vdCB3cml0ZSAubWRlYnVnIHNlY3Rpb246ICVzIiksCi0JCSAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLSNlbmRpZiAvKiBORUVEX0VDT0ZGX0RFQlVHICovCi19Ci0KLSNpZmRlZiBTQ09fRUxGCi0KLS8qIEhlYXZpbHkgcGxhZ2FyaXplZCBmcm9tIG9ial9lbGZfdmVyc2lvbi4gIFRoZSBpZGVhIGlzIHRvIGVtaXQgdGhlCi0gICBTQ08gc3BlY2lmaWMgaWRlbnRpZmllciBpbiB0aGUgLm5vdGVzIHNlY3Rpb24gdG8gc2F0aXNmeSB0aGUgU0NPCi0gICBsaW5rZXIuCi0KLSAgIFRoaXMgbG9va3MgbW9yZSBjb21wbGljYXRlZCB0aGFuIGl0IHJlYWxseSBpcy4gIEFzIG9wcG9zZWQgdG8gdGhlCi0gICAib2J2aW91cyIgc29sdXRpb24sIHRoaXMgc2hvdWxkIGhhbmRsZSB0aGUgY3Jvc3MgZGV2IGNhc2VzCi0gICBjb3JyZWN0bHkuICAoaS5lLCBob3N0aW5nIG9uIGEgNjQgYml0IGJpZyBlbmRpYW4gcHJvY2Vzc29yLCBidXQKLSAgIGdlbmVyYXRpbmcgU0NPIEVsZiBjb2RlKSBFZmZpY2llbmN5IGlzbid0IGEgY29uY2VybiwgYXMgdGhlcmUKLSAgIHNob3VsZCBiZSBleGFjdGx5IG9uZSBvZiB0aGVzZSBzZWN0aW9ucyBwZXIgb2JqZWN0IG1vZHVsZS4KLQotICAgU0NPIE9wZW5TZXJ2ZXIgNSBpZGVudGlmaWVzIGl0J3MgRUxGIG1vZHVsZXMgd2l0aCBhIHN0YW5kYXJkIEVMRgotICAgLm5vdGUgc2VjdGlvbi4KLQotICAgaW50XzMyIG5hbWVzeiAgPSA0IDsgIE5hbWUgc2l6ZSAKLSAgIGludF8zMiBkZXNjc3ogID0gMTIgOyBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiAKLSAgIGludF8zMiB0eXBlICAgID0gMSA7ICAKLSAgIGNoYXIgICBuYW1lWzRdID0gIlNDTyIgOyBPcmlnaW5hdG9yIG5hbWUgQUxXQVlTIFNDTyArIE5VTEwgCi0gICBpbnRfMzIgdmVyc2lvbiA9IChtYWpvciB2ZXIgIyA8PCAxNikgIHwgdmVyc2lvbiBvZiB0b29scyA7Ci0gICBpbnRfMzIgc291cmNlICA9ICh0b29sX2lkIDw8IDE2ICkgfCAxIDsKLSAgIGludF8zMiBpbmZvICAgID0gMCA7ICAgIFRoZXNlIGFyZSBzZXQgYnkgdGhlIFNDTyB0b29scywgYnV0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBrbm93IGVub3VnaCBhYm91dCB0aGUgc291cmNlIAotCQkJICAgZW52aXJvbm1lbnQgdG8gc2V0IHRoZW0uICBTQ08gbGQgY3VycmVudGx5Ci0JCQkgICBpZ25vcmVzIHRoZW0sIGFuZCByZWNvbW1lbmRzIHdlIHNldCB0aGVtCi0JCQkgICB0byB6ZXJvLiAgKi8KLQotI2RlZmluZSBTQ09fTUFKT1JfVkVSU0lPTiAweDEKLSNkZWZpbmUgU0NPX01JTk9SX1ZFUlNJT04gMHgxCi0KLXZvaWQKLXNjb19pZCAoKQotewotCi0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBjOwotICBjaGFyIGNoOwotICBjaGFyICpwOwotICBhc2VjdGlvbiAqc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBzdWJzZWcgPSBub3dfc3Vic2VnOwotICBFbGZfSW50ZXJuYWxfTm90ZSBpX25vdGU7Ci0gIEVsZl9FeHRlcm5hbF9Ob3RlIGVfbm90ZTsKLSAgYXNlY3Rpb24gKm5vdGVfc2VjcCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBpbnQgaSwgbGVuOwotCi0gIC8qIGNyZWF0ZSB0aGUgLm5vdGUgc2VjdGlvbiAqLwotCi0gIG5vdGVfc2VjcCA9IHN1YnNlZ19uZXcgKCIubm90ZSIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCSBub3RlX3NlY3AsCi0JCQkgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSk7Ci0KLSAgLyogcHJvY2VzcyB0aGUgdmVyc2lvbiBzdHJpbmcgKi8KLQotICBpX25vdGUubmFtZXN6ID0gNDsgCi0gIGlfbm90ZS5kZXNjc3ogPSAxMjsJCS8qIDEyIGRlc2NyaXB0aXZlIGJ5dGVzICovCi0gIGlfbm90ZS50eXBlID0gTlRfVkVSU0lPTjsJLyogQ29udGFpbnMgYSB2ZXJzaW9uIHN0cmluZyAqLwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLm5hbWVzeikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS5uYW1lc3osIDQpOwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLmRlc2NzeikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS5kZXNjc3osIDQpOwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLnR5cGUpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUudHlwZSwgNCk7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIHN0cmNweSAocCwgIlNDTyIpOyAKLQotICAvKiBOb3RlOiB0aGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgRUxGIHdlJ3JlIHJlcHJlc2VudGluZyAqLwotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAoU0NPX01BSk9SX1ZFUlNJT04gPDwgMTYpIHwgKFNDT19NSU5PUl9WRVJTSU9OKSwgNCk7Ci0KLSAgLyogSGVyZSwgd2UgcGljayBhIG1hZ2ljIG51bWJlciBmb3Igb3Vyc2VsdmVzICh5ZXMsIEkgInJlZ2lzdGVyZWQiCi0gICAgIGl0IHdpdGggU0NPLiAgVGhlIGJvdHRvbSBiaXQgc2hvd3MgdGhhdCB3ZSBhcmUgY29tcGF0IHdpdGggdGhlCi0gICAgIFNDTyBBQkkuICAqLwotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAweDRjNTIwMDAwIHwgMHgwMDAxLCA0KTsKLQotICAvKiBJZiB3ZSBrbmV3IChvciBjYXJlZCkgd2hhdCB0aGUgc291cmNlIGxhbmd1YWdlIG9wdGlvbnMgd2VyZSwgd2UnZAotICAgICBmaWxsIHRoZW0gaW4gaGVyZS4gIFNDTyBoYXMgZ2l2ZW4gdXMgcGVybWlzc2lvbiB0byBpZ25vcmUgdGhlc2UKLSAgICAgYW5kIGp1c3Qgc2V0IHRoZW0gdG8gemVyby4gICovCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDB4MDAwMCwgNCk7Ci0gCi0gIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gIC8qIFdlIHByb2JhYmx5IGNhbid0IHJlc3RvcmUgdGhlIGN1cnJlbnQgc2VnbWVudCwgZm9yIHRoZXJlIGxpa2VseQotICAgICBpc24ndCBvbmUgeWV0Li4uICAqLwotICBpZiAoc2VnICYmIHN1YnNlZykKLSAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0KLX0KLQotI2VuZGlmIC8qIFNDT19FTEYgKi8KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWxmX2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotICAwLAotICAxLAotICBlbGZfZnJvYl9zeW1ib2wsCi0gIGVsZl9mcm9iX2ZpbGUsCi0gIGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzLAotICBlbGZfc19nZXRfc2l6ZSwgZWxmX3Nfc2V0X3NpemUsCi0gIGVsZl9zX2dldF9hbGlnbiwgZWxmX3Nfc2V0X2FsaWduLAotICBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcywKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8sCi0gIGVjb2ZmX3N0YWIsCi0jZWxzZQotICAwLAotICAwLAkJCQkvKiBwcm9jZXNzX3N0YWIgKi8KLSNlbmRpZgotICBlbGZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGVsZl9wb3BfaW5zZXJ0LAotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgZWxmX2Vjb2ZmX3NldF9leHQsCi0jZWxzZQotICAwLAotI2VuZGlmCi0gIG9ial9yZWFkX2JlZ2luX2hvb2ssCi0gIG9ial9zeW1ib2xfbmV3X2hvb2ssCi19OwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWxmLmggYi9nYXMvY29uZmlnL29iai1lbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5OTk4ZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0jaWZuZGVmIF9PQkpfRUxGX0gKLSNkZWZpbmUgX09CSl9FTEZfSAotCi0jZGVmaW5lIE9CSl9FTEYgMQotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCi0jaW5jbHVkZSA8YmZkLmg+Ci0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0CQkvKiBmb3Igbm93ICovCi0jaW5jbHVkZSAiYmZkL2VsZi1iZmQuaCIKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpZmRlZiBUQ19BTFBIQQotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgYWxwaGFfZmxhZ19tZGVidWcKLWV4dGVybiBpbnQgYWxwaGFfZmxhZ19tZGVidWc7Ci0jZW5kaWYKLQotLyogRm9yIG5vdywgYWx3YXlzIHNldCBFQ09GRl9ERUJVR0dJTkcgZm9yIGEgTUlQUyB0YXJnZXQuICAqLwotI2lmZGVmIFRDX01JUFMKLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMAotI2Vsc2UKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDEKLSNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLwotI2VuZGlmIC8qIFRDX01JUFMgKi8KLQotLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHN5bWJvbC4gICovCi0KLS8qIEZJWE1FOiBGb3Igc29tZSByZWFzb24sIHRoaXMgc3RydWN0dXJlIGlzIG5lZWRlZCBib3RoIGhlcmUgYW5kIGluCi0gICBvYmotbXVsdGkuaC4gICovCi0jaWZuZGVmIE9CSl9TWU1GSUVMRF9UWVBFCi1zdHJ1Y3QgZWxmX29ial9zeQotewotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgaGFzIGJlZW4gbWFya2VkIGFzIGxvY2FsLiAgKi8KLSAgaW50IGxvY2FsOwotCi0gIC8qIFVzZSB0aGlzIHRvIGtlZXAgdHJhY2sgb2YgLnNpemUgZXhwcmVzc2lvbnMgdGhhdCBpbnZvbHZlCi0gICAgIGRpZmZlcmVuY2VzIHRoYXQgd2UgY2FuJ3QgY29tcHV0ZSB5ZXQuICAqLwotICBleHByZXNzaW9uUyAqc2l6ZTsKLQotICAvKiBUaGUgbmFtZSBzcGVjaWZpZWQgYnkgdGhlIC5zeW12ZXIgZGlyZWN0aXZlLiAgKi8KLSAgY2hhciAqdmVyc2lvbmVkX25hbWU7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB3ZSBuZWVkIHNvbWUKLSAgICAgYWRkaXRpb25hbCBmaWVsZHMgZm9yIGVhY2ggc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVmZHIgKmVjb2ZmX2ZpbGU7Ci0gIHN0cnVjdCBsb2NhbHN5bSAqZWNvZmZfc3ltYm9sOwotICB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7Ci0jZW5kaWYKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSBzdHJ1Y3QgZWxmX29ial9zeQotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgVFJVRSAgIUZBTFNFCi0jZW5kaWYKLQotI2RlZmluZSBvYmpfYmVnaW4oKSBlbGZfYmVnaW4gKCkKLWV4dGVybiB2b2lkIGVsZl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBhZGRyZXNzIHNpemUhICovCi0jZGVmaW5lIGVsZl9zeW1ib2woYXN5bWJvbCkgKChlbGZfc3ltYm9sX3R5cGUgKikoJihhc3ltYm9sKS0+dGhlX2JmZCkpCi0KLSNkZWZpbmUgU19HRVRfU0laRShTKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUpCi0jZGVmaW5lIFNfU0VUX1NJWkUoUyxWKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgPSAoVikpCi0KLSNkZWZpbmUgU19HRVRfQUxJR04oUykgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZSkKLSNkZWZpbmUgU19TRVRfQUxJR04oUyxWKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlID0gKFYpKQotCi0jZGVmaW5lIFNfR0VUX09USEVSKFMpIFwKLSAgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIpCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlciA9IChWKSkKLQotZXh0ZXJuIGFzZWN0aW9uICpnZGJfc2VjdGlvbjsKLQotI2RlZmluZSBvYmpfZnJvYl9maWxlICBlbGZfZnJvYl9maWxlCi1leHRlcm4gdm9pZCBlbGZfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAgZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLWV4dGVybiB2b2lkIGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfYXBwX2ZpbGUgZWxmX2ZpbGVfc3ltYm9sCi1leHRlcm4gdm9pZCBlbGZfZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9lbGZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfcHJldmlvdXMgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfZGF0YSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfdGV4dCBQQVJBTVMgKChpbnQpKTsKLQotLyogQkZEIHdhbnRzIHRvIHdyaXRlIHRoZSB1ZGF0YSBmaWVsZCwgd2hpY2ggaXMgYSBuby1ubyBmb3IgdGhlCi0gICBnbG9iYWxseSBkZWZpbmVkIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJKChTRUMpLT5vd25lciAhPSAwKQotCi0vKiBXaGVuIHNldHRpbmcgb25lIHN5bWJvbCBlcXVhbCB0byBhbm90aGVyLCBieSBkZWZhdWx0IHdlIHByb2JhYmx5Ci0gICB3YW50IHRoZW0gdG8gaGF2ZSB0aGUgc2FtZSAic2l6ZSIsIHdoYXRldmVyIGl0IG1lYW5zIGluIHRoZSBjdXJyZW50Ci0gICBjb250ZXh0LiAgKi8KLSNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMoREVTVCxTUkMpCQkJXAotZG8JCQkJCQkJCVwKLSAgewkJCQkJCQkJXAotICAgIHN0cnVjdCBlbGZfb2JqX3N5ICpzcmNlbGYgPSBzeW1ib2xfZ2V0X29iaiAoU1JDKTsJCVwKLSAgICBzdHJ1Y3QgZWxmX29ial9zeSAqZGVzdGVsZiA9IHN5bWJvbF9nZXRfb2JqIChERVNUKTsJCVwKLSAgICBpZiAoc3JjZWxmLT5zaXplKQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCVwKLQlpZiAoZGVzdGVsZi0+c2l6ZSA9PSBOVUxMKQkJCQlcCi0JICBkZXN0ZWxmLT5zaXplID0JCQkJCVwKLQkgICAgKGV4cHJlc3Npb25TICopIHhtYWxsb2MgKHNpemVvZiAoZXhwcmVzc2lvblMpKTsJXAotCSpkZXN0ZWxmLT5zaXplID0gKnNyY2VsZi0+c2l6ZTsJCQkJXAotICAgICAgfQkJCQkJCQkJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgewkJCQkJCQkJXAotCWlmIChkZXN0ZWxmLT5zaXplICE9IE5VTEwpCQkJCVwKLQkgIGZyZWUgKGRlc3RlbGYtPnNpemUpOwkJCQkJXAotCWRlc3RlbGYtPnNpemUgPSBOVUxMOwkJCQkJXAotICAgICAgfQkJCQkJCQkJXAotICAgIFNfU0VUX1NJWkUgKChERVNUKSwgU19HRVRfU0laRSAoU1JDKSk7CQkJXAotICAgIFNfU0VUX09USEVSICgoREVTVCksIFNfR0VUX09USEVSIChTUkMpKTsJCQlcCi0gIH0JCQkJCQkJCVwKLXdoaWxlICgwKQotCi0vKiBTdGFicyBnbyBpbiBhIHNlcGFyYXRlIHNlY3Rpb24uICAqLwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDEKLQotLyogV2UgbmVlZCAxMiBieXRlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gdG8gaG9sZCBzb21lIGluaXRpYWwKLSAgIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiB2b2lkIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLQotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotLyogV2Ugc211Z2dsZSBzdGFicyBpbiBFQ09GRiByYXRoZXIgdGhhbiB1c2luZyBhIHNlcGFyYXRlIHNlY3Rpb24uCi0gICBUaGUgSXJpeCBsaW5rZXIgY2FuIG5vdCBoYW5kbGUgYSBzZXBhcmF0ZSBzdGFicyBzZWN0aW9uLiAgKi8KLQotI3VuZGVmICBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgKCFFQ09GRl9ERUJVR0dJTkcpCi0KLSN1bmRlZiAgSU5JVF9TVEFCX1NFQ1RJT04KLSNkZWZpbmUgSU5JVF9TVEFCX1NFQ1RJT04oc2VnKSBcCi0gICgodm9pZCkoRUNPRkZfREVCVUdHSU5HID8gMCA6IChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpLCAwKSkpCi0KLSNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQihzZWcsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpCQlcCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCQkJCQkJCVwKLSAgICBlY29mZl9zdGFiICgoc2VnKSwgKHdoYXQpLCAoc3RyaW5nKSwgKHR5cGUpLCAob3RoZXIpLCAoZGVzYykpCi0jZW5kaWYgLyogRUNPRkZfREVCVUdHSU5HICovCi0KLWV4dGVybiB2b2lkIGVsZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci0jaWZuZGVmIG9ial9mcm9iX3N5bWJvbAotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woc3ltcCwgcHVudCkgZWxmX2Zyb2Jfc3ltYm9sIChzeW1wLCAmcHVudCkKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBlbGZfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG9ial9wb3BfaW5zZXJ0KCkJZWxmX3BvcF9pbnNlcnQoKQotCi0jaWZuZGVmIE9CSl9NQVlCRV9FTEYKLSNkZWZpbmUgb2JqX2Vjb2ZmX3NldF9leHQgZWxmX2Vjb2ZmX3NldF9leHQKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBlY29mZl9leHRyOwotI2VuZGlmCi1leHRlcm4gdm9pZCBlbGZfZWNvZmZfc2V0X2V4dCBQQVJBTVMgKChzeW1ib2xTICosIHN0cnVjdCBlY29mZl9leHRyICopKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX09CSl9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZXZheC5jIGIvZ2FzL2NvbmZpZy9vYmotZXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE4YzgzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWV2YXguYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIG9iai1ldmF4LmMgLSBFVkFYIChvcGVuVk1TL0FscGhhKSBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpIG9mCi0gICAgIHByb0dJUyBTb2Z0d2FyZSwgQWFjaGVuLCBHZXJtYW55LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWV2YXguaCIKLQotI2luY2x1ZGUgImFzLmgiCi0KLXN0YXRpYyB2b2lkIHNfZXZheF93ZWFrIFBBUkFNUyAoKGludCkpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid2VhayIsIHNfZXZheF93ZWFrLCAwfSwKLSAgezAsIDAsIDB9LAotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi12b2lkIG9ial9yZWFkX2JlZ2luX2hvb2sgKCkge30KLQotLyogSGFuZGxlIHRoZSB3ZWFrIHNwZWNpZmljIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2V2YXhfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIG9iai1ldmF4LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWV2YXguaCBiL2dhcy9jb25maWcvb2JqLWV2YXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5ZGIxOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ldmF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWV2YXguaAotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcHJvZ2lzLmRlKSBvZgotICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0gKi8KLQotLyogZGVmaW5lIGFuIG9iaiBzcGVjaWZpYyBtYWNybyBvZmYgd2hpY2ggdGFyZ2V0IGNwdSBiYWNrIGVuZHMgbWF5IGtleS4gKi8KLSNkZWZpbmUgT0JKX0VWQVggMQotCi0vKiBpbmNsdWRlIHdoYXRldmVyIHRhcmdldCBjcHUgaXMgYXBwcm9wcmlhdGUuICovCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotI2VuZGlmCi0KLS8qCi0gKiBTWU1CT0xTCi0gKi8KLQotLyoKLSAqIElmIHlvdXIgb2JqZWN0IGZvcm1hdCBuZWVkcyB0byByZW9yZGVyIHN5bWJvbHMsIGRlZmluZSB0aGlzLiAgV2hlbgotICogZGVmaW5lZCwgc3ltYm9scyBhcmUga2VwdCBvbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBhbmQgZnVuY3Rpb25zIGFyZQotICogbWFkZSBhdmFpbGFibGUgZm9yIHB1c2gsIGluc2VydCwgYXBwZW5kLCBhbmQgZGVsZXRlLiAgSWYgbm90IGRlZmluZWQsCi0gKiBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgc2luZ2x5IGxpbmtlZCBsaXN0LCBvbmx5IHRoZSBhcHBlbmQgYW5kIGNsZWFyCi0gKiBmYWNpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGFuZCB0aGV5IGFyZSBtYWNyb3MuCi0gKi8KLQotLyogI2RlZmluZSBTWU1CT0xTX05FRURfUEFDS1BPSU5URVJTICovCi0KLS8qICAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHZvaWQgKm5vdGhpbmc7Ci0gIH0KLW9ial9zeW1ib2xfdHlwZTsJCS8qIHNob3VsZCBiZSB0aGUgZm9ybWF0J3Mgc3ltYm9sIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAoMCkJLyogeW91ciBtYWdpYyBudW1iZXIgKi8KLQotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSxiLGMpCS8qIG11c3QgYmUgKnNvbWV0aGluZyouICBUaGlzIG5vLW9wJ3MgaXQgb3V0LiAqLwotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykgICAgICAgIHs7fQotCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikKLSNkZWZpbmUgU19TRVRfVFlQRShTLFQpCi0jZGVmaW5lIFNfU0VUX0RFU0MoUyxEKQotI2RlZmluZSBTX0dFVF9PVEhFUihTKQkwCi0jZGVmaW5lIFNfR0VUX1RZUEUoUykJMAotI2RlZmluZSBTX0dFVF9ERVNDKFMpCTAKLQotI2RlZmluZSBQRFNDX1NfS19LSU5EX0ZQX1NUQUNLIDkKLSNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUiAxMAotI2RlZmluZSBQRFNDX1NfS19LSU5EX05VTEwgOAotCi0jZGVmaW5lIFBEU0NfU19LX01JTl9TVEFDS19TSVpFIDMyCi0jZGVmaW5lIFBEU0NfU19LX01JTl9SRUdJU1RFUl9TSVpFIDI0Ci0jZGVmaW5lIFBEU0NfU19LX05VTExfU0laRSAxNgotCi0jZGVmaW5lIFBEU0NfU19NX0JBU0VfUkVHX0lTX0ZQIDB4ODAJLyogbG93IGJ5dGUgKi8KLSNkZWZpbmUgUERTQ19TX01fTkFUSVZFIDB4MTAJCS8qIGhpZ2ggYnl0ZSAqLwotI2RlZmluZSBQRFNDX1NfTV9OT19KQUNLRVQgMHgyMAkJLyogaGlnaCBieXRlICovCi0KLSNkZWZpbmUgTEtQX1NfS19TSVpFIDE2Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZXZheC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1nZW5lcmljLmMgYi9nYXMvY29uZmlnL29iai1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmMzZDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmMgYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gICBvYmplY3QgZm9ybWF0IHNwZWNpZmljIHNvdXJjZSBmaWxlcy4KLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygb2JqLWdlbmVyaWMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oIGIvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzE4ZTQzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotZ2VuZXJpYy5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqLwotCi0vKiBkZWZpbmUgYW4gb2JqIHNwZWNpZmljIG1hY3JvIG9mZiB3aGljaCB0YXJnZXQgY3B1IGJhY2sgZW5kcyBtYXkga2V5LiAqLwotI2RlZmluZSBPQkpfR0VORVJJQyAxCi0KLS8qIGluY2x1ZGUgd2hhdGV2ZXIgdGFyZ2V0IGNwdSBpcyBhcHByb3ByaWF0ZS4gKi8KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0vKgotICogU1lNQk9MUwotICovCi0KLS8qCi0gKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KLSAqIGRlZmluZWQsIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBkb3VibHkgbGlua2VkIGxpc3QgYW5kIGZ1bmN0aW9ucyBhcmUKLSAqIG1hZGUgYXZhaWxhYmxlIGZvciBwdXNoLCBpbnNlcnQsIGFwcGVuZCwgYW5kIGRlbGV0ZS4gIElmIG5vdCBkZWZpbmVkLAotICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgotICogZmFjaWxpdGllcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhleSBhcmUgbWFjcm9zLgotICovCi0KLS8qICNkZWZpbmUgU1lNQk9MU19ORUVEX1BBQ0tQT0lOVEVSUyAqLwotCi0vKiAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB2b2lkICpub3RoaW5nOwotICB9Ci0KLW9ial9zeW1ib2xfdHlwZTsJCS8qIHNob3VsZCBiZSB0aGUgZm9ybWF0J3Mgc3ltYm9sIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOwotCi0vKiBzeW1ib2xzIGhhdmUgbmFtZXMgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKCJmb28iKQkvKiBnZXQgdGhlIG5hbWUgb2YgYSBzeW1ib2xQICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJOwotLyogc3ltYm9scyBoYXZlIHNlZ21lbnRzICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKFNFR19VTktOT1dOKQotI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsdikJOwotLyogc3ltYm9scyBtYXkgYmUgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoMCkKLSNkZWZpbmUgU19TRVRfRVhURVJOQUwocykJOwotCi0vKiBzeW1ib2xzIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoMCkKLQotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAoMCkJLyogeW91ciBtYWdpYyBudW1iZXIgKi8KLQotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSxiLGMpCS8qIG11c3QgYmUgKnNvbWV0aGluZyouICBUaGlzIG5vLW9wJ3MgaXQgb3V0LiAqLwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygb2JqLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYyBiL2dhcy9jb25maWcvb2JqLWhwMzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOWNjNTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotaHAzMDAuaAotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJjb25maWcvb2JqLWFvdXQuYyIKLQotLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLXZvaWQKLWhwMzAwX2hlYWRlcl9hcHBlbmQgKHdoZXJlLCBoZWFkZXJzKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICB0Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpOwotCi0jZGVmaW5lIERPKEZJRUxEKQlcCi0gIHsgXAotICAgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuRklFTEQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLkZJRUxEKSk7IFwKLSAgICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuRklFTEQpOyBcCi0gIH0KLQotICBETyAoYV9pbmZvKTsKLSAgRE8gKGFfc3BhcmUxKTsKLSAgRE8gKGFfc3BhcmUyKTsKLSAgRE8gKGFfdGV4dCk7ICAgICAgCi0gIERPIChhX2RhdGEpOyAgICAgCi0gIERPIChhX2Jzcyk7ICAgICAKLSAgRE8gKGFfdHJzaXplKTsgCi0gIERPIChhX2Ryc2l6ZSk7Ci0gIERPIChhX3NwYXJlMyk7Ci0gIERPIChhX3NwYXJlNCk7Ci0gIERPIChhX3NwYXJlNSk7Ci0gIERPIChhX2VudHJ5KTsgCi0gIERPIChhX3NwYXJlNik7Ci0gIERPIChhX3NwYXJlNyk7Ci0gIERPIChhX3N5bXMpOyAgCi0gIERPIChhX3NwYXJlOCk7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ocDMwMC5oIGIvZ2FzL2NvbmZpZy9vYmotaHAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0MDA2Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ocDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1ocDMwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KLQotc3RydWN0IGV4ZWNfYnl0ZXMKLXsKLSAgdW5zaWduZWQgY2hhciBhX2luZm9bNF07ICAgLyogYV9tYWNodHlwZS9hX21hZ2ljICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTFbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTJbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYV90ZXh0WzRdOyAgIC8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfZGF0YVs0XTsgICAvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX2Jzc1s0XTsgICAgLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfdHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfZHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmUzWzRdOyAvKiBIUCA9IHBhc2NhbCBpbnRlcmZhY2Ugc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU0WzRdOyAvKiBIUCA9IHN5bWJvbCB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTVbNF07IC8qIEhQID0gZGVidWcgbmFtZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9lbnRyeVs0XTsgIC8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlNls0XTsgLyogSFAgPSBzb3VyY2UgbGluZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTdbNF07IC8qIEhQID0gdmFsdWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3ltc1s0XTsgICAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlOFs0XTsKLX07Ci0KLS8qIEhvdyBiaWcgdGhlICJzdHJ1Y3QgZXhlYyIgaXMgb24gZGlzayAqLwotI2RlZmluZSBFWEVDX0JZVEVTX1NJWkUgKDE2ICogNCkKLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX2luZm87Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTE7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTI7Ci0gIHVuc2lnbmVkIGxvbmcgYV90ZXh0OyAgICAgIAotICB1bnNpZ25lZCBsb25nIGFfZGF0YTsgICAgIAotICB1bnNpZ25lZCBsb25nIGFfYnNzOyAgICAgCi0gIHVuc2lnbmVkIGxvbmcgYV90cnNpemU7IAotICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUzOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU0OwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU1OwotICB1bnNpZ25lZCBsb25nIGFfZW50cnk7IAotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU2OwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU3OwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsgIAotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU4OwotfTsKLQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJKE9NQUdJQykKLSNkZWZpbmUgQU9VVF9WRVJTSU9OCTB4MDIKLSNkZWZpbmUgQU9VVF9NQUNIVFlQRQkweDBjCi0jZGVmaW5lIE9NQUdJQwkJMHgxMDYKLSAgICAKLSNkZWZpbmUgb2JqX2hlYWRlcl9hcHBlbmQJaHAzMDBfaGVhZGVyX2FwcGVuZAotI2luY2x1ZGUgImNvbmZpZy9vYmotYW91dC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaWVlZS5jIGIvZ2FzL2NvbmZpZy9vYmotaWVlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGEwNzk4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWllZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0vKiBvYmotZm9ybWF0IGZvciBpZWVlLTY5NSByZWNvcmRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0KLS8qCi0gIGNyZWF0ZWQgYnkKLQotICBzdGV2ZSBjaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0gICovCi0KLS8qCi0gIHRoaXMgd2lsbCBob3BlZnVsbHkgYmVjb21lIHRoZSBwb3J0IHRocm91Z2ggd2hpY2ggYmZkIGFuZCBnYXMgdGFsaywKLSAgZm9yIHRoZSBtb21lbnQsIG9ubHkgaWVlZSBpcyBrbm93biB0byB3b3JrIHdlbGwuCi0gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgotI2luY2x1ZGUgImZyYWdzLmgiCi0KLWJmZCAqYWJmZDsKLQotLyogSG93IG1hbnkgYWRkcmVzc2VzIGRvZXMgdGhlIC5hbGlnbiB0YWtlPyAqLwotc3RhdGljIHJlbGF4X2FkZHJlc3NUCi1yZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQotICAgICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwkvKiBBZGRyZXNzIG5vdy4gKi8KLSAgICAgcmVnaXN0ZXIgbG9uZyBhbGlnbm1lbnQ7CS8qIEFsaWdubWVudCAoYmluYXJ5KS4gKi8KLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19CQkJCS8qIHJlbGF4X2FsaWduKCkgKi8KLQotLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNoYWluIGFuZCBjcmVhdGUgYSBiZmQgc2VjdGlvbgotICAgdG8gY29udGFpbiBhbGwgb2YgaXQgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoc2l6ZV9zZWN0aW9uLCAoYWJmZCwgaWR4KSwKLSAgICAgICBiZmQgKiBhYmZkIEFORAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHVuc2lnbmVkIGludCBzaXplID0gMDsKLSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baWR4XS5mcmFnX3Jvb3Q7Ci0gIHdoaWxlIChmcmFnKQotICAgIHsKLSAgICAgIGlmIChmcmFnLT5mcl9hZGRyZXNzICE9IHNpemUpCi0JewotCSAgcHJpbnRmIChfKCJPdXQgb2Ygc3RlcFxuIikpOwotCSAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7Ci0JfQotICAgICAgc2l6ZSArPSBmcmFnLT5mcl9maXg7Ci0gICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JewotCWNhc2UgcnNfZmlsbDoKLQljYXNlIHJzX29yZzoKLQkgIHNpemUgKz0gZnJhZy0+ZnJfb2Zmc2V0ICogZnJhZy0+ZnJfdmFyOwotCSAgYnJlYWs7Ci0JY2FzZSByc19hbGlnbjoKLQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JICB7Ci0JICAgIGFkZHJlc3NUIG9mZjsKLQotCSAgICBvZmYgPSByZWxheF9hbGlnbiAoc2l6ZSwgZnJhZy0+ZnJfb2Zmc2V0KTsKLQkgICAgaWYgKGZyYWctPmZyX3N1YnR5cGUgIT0gMCAmJiBvZmYgPiBmcmFnLT5mcl9zdWJ0eXBlKQotCSAgICAgIG9mZiA9IDA7Ci0JICAgIHNpemUgKz0gb2ZmOwotCSAgfQotCX0KLSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotICAgIH0KLSAgaWYgKHNpemUpCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IHNlZ21lbnRfaW5mb1tpZHhdLm5hbWU7Ci0gICAgICBpZiAobmFtZSA9PSAoY2hhciAqKSBOVUxMKQotCXsKLQkgIG5hbWUgPSAiLmRhdGEiOwotCX0KLSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnVzZXJfc3R1ZmYgPSAoY2hhciAqKSAoc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSkpOwotICAgICAgLyogTWFrZSBpdCBvdXRwdXQgdGhyb3VnaCBpdHNlbGYgKi8KLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0gICAgICBzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBzaXplKTsKLSAgICB9Ci19Ci0KLS8qIHJ1biB0aHJvdWdoIGEgZnJhZyBjaGFpbiBhbmQgd3JpdGUgb3V0IHRoZSBkYXRhIHRvIGdvIHdpdGggaXQgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZmlsbF9zZWN0aW9uLCAoYWJmZCwgaWR4KSwKLSAgICAgICBiZmQgKiBhYmZkIEFORAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIGFzZWN0aW9uICpzZWMgPSBzZWdtZW50X2luZm9baWR4XS51c2VyX3N0dWZmOwotICBpZiAoc2VjKQotICAgIHsKLSAgICAgIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2lkeF0uZnJhZ19yb290OwotICAgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0gICAgICB3aGlsZSAoZnJhZykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgZmlsbF9zaXplOwotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgcnNfZmlsbDoKLQkgICAgY2FzZSByc19hbGlnbjoKLQkgICAgY2FzZSByc19vcmc6Ci0JICAgICAgaWYgKGZyYWctPmZyX2ZpeCkKLQkJewotCQkgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCQkJICAgIHNlYywKLQkJCQkJICAgIGZyYWctPmZyX2xpdGVyYWwsCi0JCQkJCSAgICBmcmFnLT5mcl9hZGRyZXNzLAotCQkJCQkgICAgZnJhZy0+ZnJfZml4KTsKLQkJfQotCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7Ci0JICAgICAgZmlsbF9zaXplID0gZnJhZy0+ZnJfdmFyOwotCSAgICAgIGlmIChmaWxsX3NpemUpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgb2ZmID0gZnJhZy0+ZnJfZml4OwotCQkgIGZvciAoY291bnQgPSBmcmFnLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkJCWZyYWctPmZyX2xpdGVyYWwgKwotCQkJCQkJZnJhZy0+ZnJfZml4LAotCQkJCQkJZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiwKLQkJCQkJCWZpbGxfc2l6ZSk7Ci0JCSAgICAgIG9mZiArPSBmaWxsX3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0JfQotICAgIH0KLX0KLQotLyogQ291bnQgdGhlIHJlbG9jYXRpb25zIGluIGEgY2hhaW4gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotREVGVU4gKGNvdW50X2VudHJpZXNfaW5fY2hhaW4sIChpZHgpLAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIHVuc2lnbmVkIGludCBucmVsb2NzOwotICBmaXhTICpmaXh1cF9wdHI7Ci0KLSAgLyogQ291bnQgdGhlIHJlbG9jYXRpb25zICovCi0gIGZpeHVwX3B0ciA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OwotICBucmVsb2NzID0gMDsKLSAgd2hpbGUgKGZpeHVwX3B0ciAhPSAoZml4UyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZpeHVwX3B0ciA9IGZpeHVwX3B0ci0+ZnhfbmV4dDsKLSAgICAgIG5yZWxvY3MrKzsKLSAgICB9Ci0gIHJldHVybiBucmVsb2NzOwotfQotCi0vKiBvdXRwdXQgYWxsIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uICovCi12b2lkCi1ERUZVTiAoZG9fcmVsb2NzX2ZvciwgKGlkeCksCi0gICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgdW5zaWduZWQgaW50IG5yZWxvY3M7Ci0gIGFyZWxlbnQgKipyZWxvY19wdHJfdmVjdG9yOwotICBhcmVsZW50ICpyZWxvY192ZWN0b3I7Ci0gIGFzeW1ib2wgKipwdHJzOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IChhc2VjdGlvbiAqKSAoc2VnbWVudF9pbmZvW2lkeF0udXNlcl9zdHVmZik7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaXhTICpmcm9tOwotICBpZiAoc2VjdGlvbikKLSAgICB7Ci0gICAgICBucmVsb2NzID0gY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KTsKLQotICAgICAgcmVsb2NfcHRyX3ZlY3RvciA9IChhcmVsZW50ICoqKSBtYWxsb2MgKChucmVsb2NzICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICAgICAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKikgbWFsbG9jIChucmVsb2NzICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICBwdHJzID0gKGFzeW1ib2wgKiopIG1hbGxvYyAobnJlbG9jcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBmcm9tID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnJlbG9jczsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnRvID0gcmVsb2NfdmVjdG9yICsgaTsKLQkgIGFzeW1ib2wgKnM7Ci0JICByZWxvY19wdHJfdmVjdG9yW2ldID0gdG87Ci0JICB0by0+aG93dG8gPSAocmVsb2NfaG93dG9fdHlwZSAqKSAoZnJvbS0+Znhfcl90eXBlKTsKLQotI2lmIDAJICAvKiBXZSBjYW4ndCByZXByZXNlbnQgY29tcGxpY2F0ZWQgdGhpbmdzIGluIGEgcmVsb2MgeWV0ICovCi0JICBpZiAoZnJvbS0+ZnhfYWRkc3kgPT0gMCB8fCBmcm9tLT5meF9zdWJzeSAhPSAwKSBhYm9ydCgpOwotI2VuZGlmCi0KLQkgIHMgPSAmKGZyb20tPmZ4X2FkZHN5LT5zeV9zeW1ib2wuc3kpOwotCSAgdG8tPmFkZHJlc3MgPSAoKGNoYXIgKikgKGZyb20tPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKwotCQkJCSAgIGZyb20tPmZ4X3doZXJlKSkKLQkgICAgLSAoKGNoYXIgKikgKCYoZnJvbS0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCkpKTsKLQkgIHRvLT5hZGRlbmQgPSBmcm9tLT5meF9vZmZzZXQ7Ci0JICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgd2hpY2ggd2Ugd2FudCB0byByZWxvY2F0ZSB0bywgdHVybgotCSAgICAgdGhpcyByZWxvYWN0aW9uIGludG8gYSBzZWN0aW9uIHJlbGF0aXZlLgotCi0JICAgICBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcGNyZWxhdGl2ZSwgYW5kIHdlIGtub3cgdGhlCi0JICAgICBkZXN0aW5hdGlvbiwgd2Ugc3RpbGwgd2FudCB0byBrZWVwIHRoZSByZWxvY2F0aW9uIC0gc2luY2UKLQkgICAgIHRoZSBsaW5rZXIgbWlnaHQgcmVsYXggc29tZSBvZiB0aGUgYnl0ZXMsIGJ1dCBpdCBzdG9wcwotCSAgICAgYmVpbmcgcGMgcmVsYXRpdmUgYW5kIHR1cm5zIGludG8gYW4gYWJzb2x1dGUgcmVsb2NhdGlvbi4gKi8KLQkgIGlmIChzKQotCSAgICB7Ci0JICAgICAgaWYgKChzLT5mbGFncyAmIEJTRl9VTkRFRklORUQpID09IDApCi0JCXsKLQkJICB0by0+c2VjdGlvbiA9IHMtPnNlY3Rpb247Ci0KLQkJICAvKiBXZSBjYW4gcmVmZXIgZGlyZWN0bHkgdG8gdGhlIHZhbHVlIGZpZWxkIGhlcmUsCi0JCSAgICAgcmF0aGVyIHRoYW4gdXNpbmcgU19HRVRfVkFMVUUsIGJlY2F1c2UgdGhpcyBpcwotCQkgICAgIG9ubHkgY2FsbGVkIGFmdGVyIGRvX3N5bWJvbHMsIHdoaWNoIHNldHMgdXAgdGhlCi0JCSAgICAgdmFsdWUgZmllbGQuICAqLwotCQkgIHRvLT5hZGRlbmQgKz0gcy0+dmFsdWU7Ci0KLQkJICB0by0+c3ltX3B0cl9wdHIgPSAwOwotCQkgIGlmICh0by0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIHBjcmVsIHJlbG9jYXRpb24sIHRoZSBhZGRlbmQgc2hvdWxkIGJlIGFkanVzdGVkICovCi0JCSAgICAgIHRvLT5hZGRlbmQgLT0gdG8tPmFkZHJlc3MgKyAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdG8tPnNlY3Rpb24gPSAwOwotCQkgICpwdHJzID0gJihmcm9tLT5meF9hZGRzeS0+c3lfc3ltYm9sLnN5KTsKLQkJICB0by0+c3ltX3B0cl9wdHIgPSBwdHJzOwotCi0JCSAgaWYgKHRvLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgcGNyZWwgcmVsb2NhdGlvbiwgdGhlIGFkZGVuZCBzaG91bGQgYmUgYWRqdXN0ZWQgKi8KLQkJICAgICAgdG8tPmFkZGVuZCAtPSB0by0+YWRkcmVzcyAtIDE7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB0by0+c2VjdGlvbiA9IDA7Ci0JICAgIH0KLQotCSAgcHRycysrOwotCSAgZnJvbSA9IGZyb20tPmZ4X25leHQ7Ci0JfQotCi0gICAgICAvKiBhdHRhdGNoIHRvIHRoZSBzZWN0aW9uICovCi0gICAgICBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9IHJlbG9jX3B0cl92ZWN0b3I7Ci0gICAgICBzZWN0aW9uLT5yZWxvY19jb3VudCA9IG5yZWxvY3M7Ci0gICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfTE9BRDsKLSAgICB9Ci19Ci0KLS8qIGRvIHRoZSBzeW1ib2xzLi4gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZG9fc3ltYm9scywgKGFiZmQpLAotICAgICAgIGJmZCAqIGFiZmQpCi17Ci0gIGV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci0gIHN5bWJvbFMgKnB0cjsKLSAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfdmVjOwotICBhc3ltYm9sICpzeW1ib2xfdmVjOwotICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLQotICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsKLSAgICAgICBwdHIgIT0gKHN5bWJvbFMgKikgTlVMTDsKLSAgICAgICBwdHIgPSBwdHItPnN5X25leHQpCi0gICAgewotICAgICAgaWYgKFNFR19OT1JNQUwgKHB0ci0+c3lfc3ltYm9sLnNlZykpCi0JewotCSAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9Ci0JICAgIChhc2VjdGlvbiAqKSAoc2VnbWVudF9pbmZvW3B0ci0+c3lfc3ltYm9sLnNlZ10udXNlcl9zdHVmZik7Ci0JICBTX1NFVF9WQUxVRSAocHRyLCBTX0dFVF9WQUxVRSAocHRyKSArIHB0ci0+c3lfZnJhZy0+ZnJfYWRkcmVzcyk7Ci0JICBpZiAocHRyLT5zeV9zeW1ib2wuc3kuZmxhZ3MgPT0gMCkKLQkgICAgewotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAocHRyLT5zeV9zeW1ib2wuc2VnKQotCSAgICB7Ci0JICAgIGNhc2UgU0VHX0FCU09MVVRFOgotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzIHw9IEJTRl9BQlNPTFVURTsKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5zZWN0aW9uID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTRUdfVU5LTk9XTjoKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5mbGFncyA9IEJTRl9VTkRFRklORUQ7Ci0JICAgICAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBwdHItPnN5X3N5bWJvbC5zeS52YWx1ZSA9IFNfR0VUX1ZBTFVFIChwdHIpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gIHN5bWJvbF9wdHJfdmVjID0gKGFzeW1ib2wgKiopIG1hbGxvYyAoKGNvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIGluZGV4ID0gMDsKLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICAgcHRyICE9IChzeW1ib2xTICopIE5VTEw7Ci0gICAgICAgcHRyID0gcHRyLT5zeV9uZXh0KQotICAgIHsKLSAgICAgIHN5bWJvbF9wdHJfdmVjW2luZGV4XSA9ICYocHRyLT5zeV9zeW1ib2wuc3kpOwotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gIHN5bWJvbF9wdHJfdmVjW2luZGV4XSA9IDA7Ci0gIGFiZmQtPm91dHN5bWJvbHMgPSBzeW1ib2xfcHRyX3ZlYzsKLSAgYWJmZC0+c3ltY291bnQgPSBjb3VudDsKLX0KLQotLyogVGhlIGdlbmVyaWMgYXMtPmJmZCBjb252ZXJ0ZXIuIE90aGVyIGJhY2tlbmRzIG1heSBoYXZlIHNwZWNpYWwgY2FzZQotICAgY29kZSAqLwotCi12b2lkCi1ERUZVTl9WT0lEIChiZmRfYXNfd3JpdGVfaG9vaykKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBzaXplX3NlY3Rpb24gKGFiZmQsIGkpOwotICAgIH0KLQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgZmlsbF9zZWN0aW9uIChhYmZkLCBpKTsKLQotICBkb19zeW1ib2xzIChhYmZkKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIGRvX3JlbG9jc19mb3IgKGkpOwotCi19Ci0KLVNfU0VUX1NFR01FTlQgKHgsIHkpCi0gICAgIHN5bWJvbFMgKng7Ci0gICAgIGludCB5OwotewotICB4LT5zeV9zeW1ib2wuc2VnID0geTsKLX0KLQotU19JU19ERUZJTkVEICh4KQotICAgICBzeW1ib2xTICp4OwotewotICBpZiAoU0VHX05PUk1BTCAoeC0+c3lfc3ltYm9sLnNlZykpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBzd2l0Y2ggKHgtPnN5X3N5bWJvbC5zZWcpCi0gICAgewotICAgIGNhc2UgU0VHX1VOS05PV046Ci0gICAgICByZXR1cm4gMDsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1TX0lTX0VYVEVSTkFMICh4KQotewotICBhYm9ydCAoKTsKLX0KLQotU19HRVRfREVTQyAoeCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLVNfR0VUX1NFR01FTlQgKHgpCi0gICAgIHN5bWJvbFMgKng7Ci17Ci0gIHJldHVybiB4LT5zeV9zeW1ib2wuc2VnOwotfQotCi1TX1NFVF9FWFRFUk5BTCAoeCkKLSAgICAgc3ltYm9sUyAqeDsKLXsKLSAgeC0+c3lfc3ltYm9sLnN5LmZsYWdzIHw9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOwotfQotCi1TX1NFVF9OQU1FICh4LCB5KQotICAgICBzeW1ib2xTICp4OwotICAgICBjaGFyICp5OwotewotICB4LT5zeV9zeW1ib2wuc3kubmFtZSA9IHk7Ci19Ci0KLVNfR0VUX09USEVSICh4KQotewotICBhYm9ydCAoKTsKLX0KLQotU19JU19ERUJVRyAoeCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLSNpZm5kZWYgc2VnbWVudF9uYW1lCi1jaGFyICoKLXNlZ21lbnRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfaWVlZV9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGV4dGVybiBjaGFyIGlzX2VuZF9vZl9saW5lW107Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKnMgPSBwOwotICBpbnQgaTsKLSAgLyogTG9vayB1cCB0aGUgbmFtZSwgaWYgaXQgZG9lc24ndCBleGlzdCwgbWFrZSBpdCAqLwotICB3aGlsZSAoKnAgJiYgKnAgIT0gJyAnICYmICpwICE9ICcsJyAmJiAhaXNfZW5kX29mX2xpbmVbKnBdKQotICAgIHsKLSAgICAgIHArKzsKLSAgICB9Ci0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpXS5oYWRvbmUpCi0JewotCSAgaWYgKHN0cm5jbXAgKHNlZ21lbnRfaW5mb1tpXS5uYW1lLCBzLCBwIC0gcykgPT0gMCkKLQkgICAgewotCSAgICAgIGdvdG8gb2s7Ci0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlicmVhazsKLSAgICB9Ci0gIGlmIChpID09IFNFR19VTktOT1dOKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgc2VjdGlvbnMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlZ21lbnRfaW5mb1tpXS5oYWRvbmUgPSAxOwotICBzZWdtZW50X2luZm9baV0ubmFtZSA9IG1hbGxvYyAocCAtIHMgKyAxKTsKLSAgbWVtY3B5IChzZWdtZW50X2luZm9baV0ubmFtZSwgcywgcCAtIHMpOwotICBzZWdtZW50X2luZm9baV0ubmFtZVtwIC0gc10gPSAwOwotb2s6Ci0gIHN1YnNlZ19zZXQgKGksIDApOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWypwXSkKLSAgICBwKys7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0KLX0KLQotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfaWdub3JlICgpOwotCi0KLXZvaWQgc19nbG9ibCAoKTsKLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7InNlY3Rpb24iLCBvYmpfaWVlZV9zZWN0aW9uLCAwfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJleHBvcnQiLCBzX2dsb2JsLCAwfSwKLSAgeyJvcHRpb24iLCBzX2lnbm9yZSwgMH0sCi0gIHsiZW5kIiwgc19pZ25vcmUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJzZGF0YSIsIHN0cmluZ2VyLCAwfSwKLSAgMCwKLQotfTsKLQotCi0KLXZvaWQKLW9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIHN5bWJvbFAtPnN5X3N5bWJvbC5zeS50aGVfYmZkID0gYWJmZDsKLX0KLQotCi0KLQotCi0jaWYgMQotZXh0ZXJuIHZvaWQKLURFRlVOX1ZPSUQgKHdyaXRlX29iamVjdF9maWxlKQotewotICBpbnQgaTsKLSAgc3RydWN0IGZyY2hhaW4gKmZyY2hhaW5fcHRyOwotICBzdHJ1Y3QgZnJhZyAqZnJhZ19wdHI7Ci0KLSAgYWJmZCA9IGJmZF9vcGVudyAob3V0X2ZpbGVfbmFtZSwgImllZWUiKTsKLQotICBpZiAoYWJmZCA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9oODMwMCwgMCk7Ci0gIHN1YnNlZ19zZXQgKDEsIDApOwotICBzdWJzZWdfc2V0ICgyLCAwKTsKLSAgc3Vic2VnX3NldCAoMywgMCk7Ci0gIGZvciAoZnJjaGFpbl9wdHIgPSBmcmNoYWluX3Jvb3Q7Ci0gICAgICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7Ci0gICAgICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ViLXNlZ21lbnRzIGFuZCBhbGlnbiB0aGVtIHVwLiBBbHNvIGNsb3NlIGFueQotCSBvcGVuIGZyYWdzLiBXZSB0YWNrIGEgLmZpbGwgb250byB0aGUgZW5kIG9mIHRoZSBmcmFnIGNoYWluIHNvCi0JIHRoYXQgYW55IC5hbGlnbidzIHNpemUgY2FuIGJlIHdvcmtlZCBieSBsb29raW5nIGF0IHRoZSBuZXh0Ci0JIGZyYWcuICAqLwotCi0gICAgICBzdWJzZWdfc2V0IChmcmNoYWluX3B0ci0+ZnJjaF9zZWcsIGZyY2hhaW5fcHRyLT5mcmNoX3N1YnNlZyk7Ci0jaWZuZGVmIFNVQl9TRUdNRU5UX0FMSUdOCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotI2VuZGlmCi0gICAgICBmcmFnX2FsaWduIChTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksIDAsIDApOwotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25vdy0+ZnJfZml4ID0gMDsKLSAgICAgIGtub3cgKGZyYWdfbm93LT5mcl9uZXh0ID09IE5VTEwpOwotICAgIH0KLQotICAvKiBOb3cgYnVpbGQgb25lIGJpZyBmcmFnIGNoYWluIGZvciBlYWNoIHNlZ21lbnQsIGxpbmtlZCB0aHJvdWdoCi0JICAgZnJfbmV4dC4gKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0KLSAgICAgIGZyYWdTICoqcHJldl9mcmFnX3B0cl9wdHI7Ci0gICAgICBzdHJ1Y3QgZnJjaGFpbiAqbmV4dF9mcmNoYWluX3B0cjsKLQotICAgICAgLyoJc3RydWN0IGZyYWcgKipoZWFkX3B0ciA9IHNlZ21lbnRfaW5mb1tpXS5mcmFnX3Jvb3Q7Ki8KLQotICAgICAgc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdCA9IHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290OwotI2lmIDAKLSAgICAgIC8qIEltIG5vdCBzdXJlIHdoYXQgdGhpcyBpcyBmb3IgKi8KLSAgICAgIGZvciAoZnJjaGFpbl9wdHIgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgICBmcmNoYWluX3B0ciAhPSAoc3RydWN0IGZyY2hhaW4gKikgTlVMTDsKLQkgICBmcmNoYWluX3B0ciA9IGZyY2hhaW5fcHRyLT5mcmNoX25leHQpCi0JewotCSAgKmhlYWRfcHRyID0gZnJjaGFpbl9wdHI7Ci0JICBoZWFkX3B0ciA9ICZmcmNoYWluX3B0ci0+bmV4dDsKLQl9Ci0KLQotI2VuZGlmCi0gICAgfQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgcmVsYXhfc2VnbWVudCAoc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdCwgaSk7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgYWRkcmVzc2VzIG9mIHRoZSBmcmFncyBhcmUgY29ycmVjdCB3aXRoaW4gdGhlIHNlZ21lbnQgKi8KLQotICBiZmRfYXNfd3JpdGVfaG9vayAoKTsKLSAgYmZkX2Nsb3NlIChhYmZkKTsKLX0KLQotI2VuZGlmCi0KLUhfU0VUX1RFWFRfU0laRSAoYSwgYikKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfR0VUX1RFWFRfU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9TRVRfQlNTX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfU0VUX1NUUklOR19TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfU0VUX01BR0lDX05VTUJFUiAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9HRVRfRklMRV9TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotLyogZW5kIG9mIG9iai1pZWVlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWllZWUuaCBiL2dhcy9jb25maWcvb2JqLWllZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZjEyNi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1pZWVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWllZWUuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJGRCAxCi0KLSNpbmNsdWRlIDxiZmQuaD4KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYXN5bWJvbCBzeTsKLSAgaW50IHNlZzsKLX0KLQotb2JqX3N5bWJvbF90eXBlOwotCi0jZGVmaW5lIFNfR0VUX05BTUUocykgKCgocyktPnN5X3N5bWJvbC5zeS5uYW1lKSkKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGludCB4OwotICB9Ci0KLW9iamVjdF9oZWFkZXJzOwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAxCi0KLQotaW50IGxpbmVub19yb290UDsKLQotCi0jZGVmaW5lIElFRUVfU1RZTEUKLQotLyogZW5kIG9mIG9iai1pZWVlLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLW11bHRpLmMgYi9nYXMvY29uZmlnL29iai1tdWx0aS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTE1MDkzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLW11bHRpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIGZvbyAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuaCBiL2dhcy9jb25maWcvb2JqLW11bHRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NGM2MWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIGhpICovCi0KLSNpbmNsdWRlICJlbXVsLmgiCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SCQkodGhpc19mb3JtYXQtPmZsYXZvcikKLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUCkJKHRoaXNfZm9ybWF0LT5mcm9iX3N5bWJvbCkoUywmKFApKQotI2RlZmluZSBvYmpfZnJvYl9maWxlCQkodGhpc19mb3JtYXQtPmZyb2JfZmlsZSkKLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKHRoaXNfZm9ybWF0LT5mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKQotI2RlZmluZSBvYmpfZWNvZmZfc2V0X2V4dAkodGhpc19mb3JtYXQtPmVjb2ZmX3NldF9leHQpCi0jZGVmaW5lIG9ial9wb3BfaW5zZXJ0CQkodGhpc19mb3JtYXQtPnBvcF9pbnNlcnQpCi0jZGVmaW5lIG9ial9yZWFkX2JlZ2luX2hvb2soKQkodGhpc19mb3JtYXQtPnJlYWRfYmVnaW5faG9vaz90aGlzX2Zvcm1hdC0+cmVhZF9iZWdpbl9ob29rKCk6KHZvaWQpMCkKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vawkodGhpc19mb3JtYXQtPnN5bWJvbF9uZXdfaG9vaykKLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jICh0aGlzX2Zvcm1hdC0+c2VjX3N5bV9va19mb3JfcmVsb2MpCi0jZGVmaW5lIFNfR0VUX1NJWkUJCSh0aGlzX2Zvcm1hdC0+c19nZXRfc2l6ZSkKLSNkZWZpbmUgU19TRVRfU0laRQkJKHRoaXNfZm9ybWF0LT5zX3NldF9zaXplKQotI2RlZmluZSBTX0dFVF9BTElHTgkJKHRoaXNfZm9ybWF0LT5zX2dldF9hbGlnbikKLSNkZWZpbmUgU19TRVRfQUxJR04JCSh0aGlzX2Zvcm1hdC0+c19zZXRfYWxpZ24pCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTICh0aGlzX2Zvcm1hdC0+Y29weV9zeW1ib2xfYXR0cmlidXRlcykKLSNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQgkodGhpc19mb3JtYXQtPnByb2Nlc3Nfc3RhYikKLQotI2lmIGRlZmluZWQgKE9CSl9NQVlCRV9FQ09GRikgfHwgKGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpICYmIGRlZmluZWQgKFRDX01JUFMpKQotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQotI2VuZGlmCi0KLS8qIEZJWE1FOiBXaGF0J3MgdGhlIHN0b3J5IGhlcmU/ICBXaHkgZG8gd2UgaGF2ZSB0byBkZWZpbmUKLSAgIE9CSl9TWU1GSUVMRF9UWVBFIGJvdGggaGVyZSBhbmQgaW4gb2JqLWVsZi5oPyAgKi8KLQotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLXN0cnVjdCBlbGZfb2JqX3N5Ci17Ci0gIGludCBsb2NhbDsKLSAgZXhwcmVzc2lvblMgKnNpemU7Ci0gIGNoYXIgKnZlcnNpb25lZF9uYW1lOwotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHdlIG5lZWQgc29tZQotICAgICBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgZWFjaCBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWZkciAqZWNvZmZfZmlsZTsKLSAgc3RydWN0IGxvY2Fsc3ltICplY29mZl9zeW1ib2w7Ci0gIHZhbHVlVCBlY29mZl9leHRlcm5fc2l6ZTsKLSNlbmRpZgotfTsKLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgc3RydWN0IGVsZl9vYmpfc3kKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotc29tLmMgYi9nYXMvY29uZmlnL29iai1zb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZjE4Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1zb20uYworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKiBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogU09NIGRvZXMgbm90IG5lZWQgYW55IHBzZXVkby1vcHMuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAge05VTEx9Ci19OwotCi1zdGF0aWMgaW50IHZlcnNpb25fc2VlbiA9IDA7Ci1zdGF0aWMgaW50IGNvcHlyaWdodF9zZWVuID0gMDsKLXN0YXRpYyBpbnQgY29tcGlsZXJfc2VlbiA9IDA7Ci0KLS8qIFVudXNlZCBieSBTT00uICAqLwotdm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rICgpIHt9Ci0KLS8qIEhhbmRsZSBhIC5jb21waWxlciBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byBjcmVhdGUgdGhlCi0gICBjb21waWxhdGlvbiB1bml0IGF1eGlsaWFyeSBoZWFkZXIgZm9yIE1QRSBzdWNoIHRoYXQgdGhlIGxpbmtlZGl0b3IKLSAgIGNhbiBoYW5kbGUgU09NIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlcy4gVGhlIGZvcm1hdCBvZiB0aGUgcXVvdGVkCi0gICBzdHJpbmcgaXMgInNvdXJjZWZpbGUgbGFuZ3VhZ2UgdmVyc2lvbiIgYW5kIGlzIGRlbGltaXRlZCBieSBibGFua3MuKi8KLQotdm9pZAotb2JqX3NvbV9jb21waWxlciAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpidWY7Ci0gIGNoYXIgYzsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKmxhbmd1YWdlX25hbWU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnZlcnNpb25faWQ7Ci0KLSAgaWYgKGNvbXBpbGVyX3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkICgiT25seSBvbmUgLmNvbXBpbGVyIHBzZXVkby1vcCBwZXIgZmlsZSEiKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKLSAgICB7Ci0gICAgICBidWYgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlIChpc19hX2NoYXIgKG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMDAwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBQYXJzZSB0aGUgcXVvdGVkIHN0cmluZyBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuICBTa2lwIHRoZQotICAgICBxdW90ZS4gICovCi0gIGZpbGVuYW1lID0gYnVmICsgMTsKLSAgcCA9IGZpbGVuYW1lOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykKLSAgICBwKys7Ci0gIGlmICgqcCA9PSAnXDAwMCcpCi0gICAgewotICAgICAgYXNfYmFkICgiLmNvbXBpbGVyIGRpcmVjdGl2ZSBtaXNzaW5nIGxhbmd1YWdlIGFuZCB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICBsYW5ndWFnZV9uYW1lCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykgcCsrOwotICBpZiAoKnAgPT0gJ1wwMDAnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIi5jb21waWxlciBkaXJlY3RpdmUgbWlzc2luZyB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICB2ZXJzaW9uX2lkCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJ1wwMDAnKSBwKys7Ci0gIC8qIFJlbW92ZSB0aGUgdHJhaWxpbmcgcXVvdGUuICAqLwotICAqKC0tcCkgPSAnXDAwMCc7Ci0KLSAgY29tcGlsZXJfc2VlbiA9IDE7Ci0gIGlmICghIGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXQgKHN0ZG91dHB1dCwgZmlsZW5hbWUsIGxhbmd1YWdlX25hbWUsCi0JCQkJCSAiR05VIFRvb2xzIiwgdmVyc2lvbl9pZCkpCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBhc19mYXRhbCAoIkZBVEFMOiBBdHRhY2hpbmcgY29tcGlsZXIgaGVhZGVyICVzIiwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnZlcnNpb24gZGlyZWN0aXZlLiAgKi8KLQotdm9pZAotb2JqX3NvbV92ZXJzaW9uICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKnZlcnNpb24sIGM7Ci0KLSAgaWYgKHZlcnNpb25fc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgdmVyc2lvbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKGlzX2FfY2hhciAobmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwMDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZlcnNpb25fc2VlbiA9IDE7Ci0gIGlmIChiZmRfc29tX2F0dGFjaF9hdXhfaGRyIChzdGRvdXRwdXQsIFZFUlNJT05fQVVYX0lELCB2ZXJzaW9uKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmNvcHlyaWdodCBkaXJlY3RpdmUuICAgVGhpcyBwcm9iYWJseSBpc24ndCBjb21wbGV0ZSwgYnV0Ci0gICBpdCdzIG9mIGR1YmlvdXMgdmFsdWUgYW55d2F5IGFuZCAoSU1ITykgbm90IHdvcnRoIHRoZSB0aW1lIHRvIGZpbmlzaC4KLSAgIElmIHlvdSBjYXJlIGFib3V0IGNvcHlyaWdodCBzdHJpbmdzIHRoYXQgbXVjaCwgeW91IGZpeCBpdC4gICovCi0KLXZvaWQKLW9ial9zb21fY29weXJpZ2h0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKmNvcHlyaWdodCwgYzsKLQotICBpZiAoY29weXJpZ2h0X3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJPbmx5IG9uZSAuY29weXJpZ2h0IHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgY29weXJpZ2h0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAwMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29weXJpZ2h0X3NlZW4gPSAxOwotICBpZiAoYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoc3Rkb3V0cHV0LCBDT1BZUklHSFRfQVVYX0lELCBjb3B5cmlnaHQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFBlcmZvcm0gYW55IGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeSBmb3Igc3RhYnMgc3VwcG9ydC4KLQotICAgRm9yIFNPTSB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc3BhY2Ugd2hpY2ggd2lsbCBjb250YWluIHRoZQotICAgdHdvIHN0YWJzIHN1YnNwYWNlcy4gIEFkZGl0aW9uYWxseSB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKLSAgIHNwYWNlL3N1YnNwYWNlIHJlbGF0aW9uc2hpcHMgYW5kIHNldCBzcGFjZS9zdWJzcGFjZSBhdHRyaWJ1dGVzCi0gICB3aGljaCBCRkQgZG9lcyBub3QgdW5kZXJzdGFuZC4gICovCi0KLXZvaWQKLW9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgc2VnVCBzcGFjZTsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBjaGFyICpwLCAqZmlsZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBNYWtlIHRoZSBzcGFjZSB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIGRlYnVnIHN1YnNwYWNlcy4gICovCi0gIHNwYWNlID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsICIkR0RCX0RFQlVHJCIpOwotCi0gIC8qIFNldCBTT00gc3BlY2lmaWMgYXR0cmlidXRlcyBmb3IgdGhlIHNwYWNlLiAgSW4gcGFydGljdWxhciB3ZSBzZXQKLSAgICAgdGhlIHNwYWNlICJkZWZpbmVkIiwgInByaXZhdGUiLCAic29ydF9rZXkiLCBhbmQgInNwbnVtIiB2YWx1ZXMuIAotCi0gICAgIER1ZSB0byBhIGJ1ZyBpbiBweGRiIChjYWxsZWQgYnkgaHB1eCBsaW5rZXIpLCB0aGUgc29ydCBrZXlzCi0gICAgIG9mIHRoZSB2YXJpb3VzIHN0YWJzIHNwYWNlcy9zdWJzcGFjZXMgbmVlZCB0byBiZSAic21hbGwiLiAgV2UKLSAgICAgcmVzZXJ2ZSByYW5nZSA3Mi83MyB3aGljaCBhcHBlYXIgdG8gd29yayB3ZWxsLiAgKi8KLSAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNwYWNlLCAxLCAxLCA3MiwgMik7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc3BhY2UsIDIpOwotCi0gIC8qIFNldCB0aGUgY29udGFpbmluZyBzcGFjZSBmb3IgYm90aCBzdGFiIHNlY3Rpb25zIHRvIGJlICRHREJfREVCVUckCi0gICAgIChqdXN0IGNyZWF0ZWQgYWJvdmUpLiAgQWxzbyBzZXQgc29tZSBhdHRyaWJ1dGVzIHdoaWNoIEJGRCBkb2VzCi0gICAgIG5vdCB1bmRlcnN0YW5kLiAgSW4gcGFydGljdWxhciwgYWNjZXNzIGJpdHMsIHNvcnQga2V5cywgYW5kIGxvYWQKLSAgICAgcXVhZHJhbnQuICAqLwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBzcGFjZSwgMHgxZiwgNzMsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgMik7Ci0KLSAgLyogTWFrZSBzb21lIHNwYWNlIGZvciB0aGUgZmlyc3Qgc3BlY2lhbCBzdGFiIGVudHJ5IGFuZCB6ZXJvIHRoZSBtZW1vcnkuCi0gICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsZW5ndGggb2YgdGhpcyBmaWxlJ3MKLSAgICAgc3RhYiBzdHJpbmcgYW5kIHRoZSBsaWtlLiAgVXNpbmcgaXQgYXZvaWRzIHRoZSBuZWVkIHRvIAotICAgICByZWxvY2F0ZSB0aGUgc3RhYiBzdHJpbmdzLgotCi0gICAgIFRoZSAkR0RCX1NUUklOR1MkIHNwYWNlIHdpbGwgYmUgY3JlYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mCi0gICAgIHRoZSBjYWxsIHRvIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuICAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsICIkR0RCX1NUUklOR1MkIik7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUucCA9IHA7Ci0KLSAgLyogU2V0IHRoZSBjb250YWluaW5nIHNwYWNlIGZvciBib3RoIHN0YWIgc2VjdGlvbnMgdG8gYmUgJEdEQl9ERUJVRyQKLSAgICAgKGp1c3QgY3JlYXRlZCBhYm92ZSkuICBBbHNvIHNldCBzb21lIGF0dHJpYnV0ZXMgd2hpY2ggQkZEIGRvZXMKLSAgICAgbm90IHVuZGVyc3RhbmQuICBJbiBwYXJ0aWN1bGFyLCBhY2Nlc3MgYml0cywgc29ydCBrZXlzLCBhbmQgbG9hZAotICAgICBxdWFkcmFudC4gICovCi0gIHNlZyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsICIkR0RCX1NUUklOR1MkIik7Ci0gIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIHNwYWNlLCAweDFmLCA3MiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3RhYl9zZWN0aW9ucyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eDsKLXsKLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgY2hhciAqcDsKLSAgaW50IHN0cnN6LCBuc3ltczsKLQotICBpZiAoc3RyY21wICgiJEdEQl9TWU1CT0xTJCIsIHNlYy0+bmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiJEdEQl9TVFJJTkdTJCIpOwotICBpZiAoc3Ryc2VjKQotICAgIHN0cnN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLSAgZWxzZQotICAgIHN0cnN6ID0gMDsKLSAgbnN5bXMgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpIC8gMTIgLSAxOwotCi0gIHAgPSBzZWdfaW5mbyAoc2VjKS0+c3RhYnUucDsKLSAgYXNzZXJ0IChwICE9IDApOwotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKLX0KLQotLyogQ2FsbGVkIGxhdGUgaW4gdGhlIGFzc3NlbWJseSBwaGFzZSB0byBhZGp1c3QgdGhlIHNwZWNpYWwKLSAgIHN0YWIgZW50cnkgYW5kIHRvIHNldCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3IgZWFjaCBjb2RlIHN1YnNwYWNlLiAgKi8KLQotdm9pZAotc29tX2Zyb2JfZmlsZSAoKQotewotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgYWRqdXN0X3N0YWJfc2VjdGlvbnMsIChQVFIpIDApOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotc29tLmggYi9nYXMvY29uZmlnL29iai1zb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwODdiMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1zb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4KLQotICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gICovCi0KLSNpZm5kZWYgX09CSl9TT01fSAotI2RlZmluZSBfT0JKX1NPTV9ICi0KLSNkZWZpbmUgT0JKX1NPTSAxCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlICJiZmQvc29tLmgiCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgIUZBTFNFCi0jZW5kaWYKLQotLyogc2hvdWxkIGJlIGNvbmRpdGlvbmFsIG9uIGFkZHJlc3Mgc2l6ZSEgICovCi0jZGVmaW5lIHNvbV9zeW1ib2woYXN5bWJvbCkgKChzb21fc3ltYm9sX3R5cGUgKikoJihhc3ltYm9sKS0+dGhlX2JmZCkpCi0KLWV4dGVybiB2b2lkIHNvbV9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIG9ial9zb21fdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotZXh0ZXJuIHZvaWQgb2JqX3NvbV9jb3B5cmlnaHQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfc29tX2NvbXBpbGVyIFBBUkFNUyAoKGludCkpOwotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykgezt9Ci0KLS8qIFNPTSBoYXMgc2V2ZXJhbCBhdHRyaWJ1dGVzIGZvciBzcGFjZXMvc3Vic3BhY2VzIHdoaWNoIGNhbiBub3QKLSAgIGJlIGVhc2lseSBleHByZXNzZWQgaW4gQkZELiAgV2UgdXNlIHRoZXNlIG1hY3JvcyB0byB0cmlnZ2VyIGNhbGxzCi0gICBpbnRvIHRoZSBTT00gQkZEIGJhY2tlbmQgdG8gc2V0IHRoZXNlIGF0dHJpYnV0ZXMuICAqLwotI2RlZmluZSBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAgYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCi0jZGVmaW5lIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcwotCi0vKiBMaWtld2lzZSBmb3Igc3ltYm9sIHR5cGVzLiAgKi8KLSNkZWZpbmUgb2JqX3NldF9zeW1ib2xfdHlwZSBiZmRfc29tX3NldF9zeW1ib2xfdHlwZQotCi0vKiBTdGFicyBnbyBpbiBhIHNlcGFyYXRlIHNlY3Rpb25zLiAgR0RCIGV4cGVjdHMgdG8gZmluZCB0aGVtIGluIHNlY3Rpb25zCi0gICB3aXRoIHRoZSBuYW1lcyAkR0RCX1NZTUJPTFMkIGFuZCAkR0RCX1NUUklOR1MkIHJhdGhlciB0aGFuIC5zdGFiIGFuZAotICAgLnN0YWJzdHIuICAqLwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDEKLSNkZWZpbmUgU1RBQl9TRUNUSU9OX05BTUUgIiRHREJfU1lNQk9MUyQiCi0jZGVmaW5lIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSAiJEdEQl9TVFJJTkdTJCIKLQotLyogV2UgdXNlIElOSVRfU1RBQl9TRUNUSU9OIHRvIHJlY29yZCB0aGUgc3BhY2Uvc3Vic3BhY2UgcmVsYXRpb25zaGlwcwotICAgZm9yIHRoZSB2YXJpb3VzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0jZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgb2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotCi0vKiBXZSdsbCBiZSB1cGRhdGluZyB0aGUgbWFnaWMgMXN0IHN0YWIgZW50cnkgb25jZSB0aGUgZW50aXJlIGFzc2VtYmx5Ci0gICBmYWlsIGhhcyBiZWVuIHByb2Nlc3NlZC4gICovCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGUoKSBzb21fZnJvYl9maWxlKCkKLQotI2VuZGlmIC8qIF9PQkpfU09NX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLXZtcy5jIGIvZ2FzL2NvbmZpZy9vYmotdm1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDhmOGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotdm1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQ5ICswLDAgQEAKLS8qIHZtcy5jIC0tIFdyaXRlIG91dCBhIFZBWC9WTVMgb2JqZWN0IGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDkyLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IERhdmlkIEwuIEthc2h0YW4gKi8KLS8qIE1vZGlmaWVkIGJ5IEVyaWMgWW91bmdkYWxlIHRvIHdyaXRlIFZNUyBkZWJ1ZyByZWNvcmRzIGZvciBwcm9ncmFtCi0gICB2YXJpYWJsZXMgKi8KLQotLyogV2FudCBhbGwgb2Ygb2JqLXZtcy5oIChhcyBvYmotZm9ybWF0LmgsIHZpYSB0YXJnLWVudi5oLCB2aWEgYXMuaCkuICAqLwotI2RlZmluZSBXQU5UX1ZNU19PQkpfREVGUwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBXaGF0IHdlIGRvIGlmIHRoZXJlIGlzIGEgZ29vZi4gKi8KLSNkZWZpbmUgZXJyb3IgYXNfZmF0YWwKLQotI2lmZGVmIFZNUwkJCS8qIFRoZXNlIGFyZSBvZiBubyB1c2UgaWYgd2UgYXJlIGNyb3NzIGFzc2VtYmxpbmcuICovCi0jaW5jbHVkZSA8ZmFiLmg+CQkvKiBEZWZpbmUgRmlsZSBBY2Nlc3MgQmxvY2sJICAqLwotI2luY2x1ZGUgPG5hbS5oPgkJLyogRGVmaW5lIE5BTSBCbG9jawkJICAqLwotI2luY2x1ZGUgPHhhYi5oPgkJLyogRGVmaW5lIFhBQiAtIGFsbCBkaWZmZXJlbnQgdHlwZXMqLwotZXh0ZXJuIGludCBzeXMkb3BlbigpLCBzeXMkY2xvc2UoKSwgc3lzJGFzY3RpbSgpOwotI2VuZGlmCi0KLS8qCi0gKglWZXJzaW9uIHN0cmluZyBvZiB0aGUgY29tcGlsZXIgdGhhdCBwcm9kdWNlZCB0aGUgY29kZSB3ZSBhcmUKLSAqCWFzc2VtYmxpbmcuICAoQW5kIHRoaXMgYXNzZW1ibGVyLCBpZiB3ZSBkbyBub3QgaGF2ZSBjb21waWxlciBpbmZvLikKLSAqLwotY2hhciAqY29tcGlsZXJfdmVyc2lvbl9zdHJpbmc7Ci0KLWV4dGVybiBpbnQgZmxhZ19oYXNoX2xvbmdfbmFtZXM7CS8qIC0rICovCi1leHRlcm4gaW50IGZsYWdfb25lOwkJCS8qIC0xOyBjb21wYXRpYmlsaXR5IHdpdGggZ2NjIDEueCAqLwotZXh0ZXJuIGludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1IICovCi1leHRlcm4gaW50IGZsYWdfbm9faGFzaF9taXhlZF9jYXNlOwkvKiAtaCBOVU0gKi8KLQotLyogRmxhZyB0aGF0IGRldGVybWluZXMgaG93IHdlIG1hcCBuYW1lcy4gIFRoaXMgdGFrZXMgc2V2ZXJhbCB2YWx1ZXMsIGFuZAotICogaXMgc2V0IHdpdGggdGhlIC1oIHN3aXRjaC4gIEEgdmFsdWUgb2YgemVybyBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotICogdXBwZXIgY2FzZSwgYW5kIHRoZSBwcmVzZW5jZSBvZiB0aGUgLWggc3dpdGNoIGluaGliaXRzIHRoZSBjYXNlIGhhY2suCi0gKiBObyAtaCBzd2l0Y2ggYXQgYWxsIHNldHMgdm1zX25hbWVfbWFwcGluZyB0byAwLCBhbmQgYWxsb3dzIGNhc2UgaGFja2luZy4KLSAqIEEgdmFsdWUgb2YgMiAoc2V0IHdpdGggLWgyKSBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotICogYWxsIGxvd2VyIGNhc2UsIHdpdGggbm8gY2FzZSBoYWNrLiAgQSB2YWx1ZSBvZiAzIChzZXQgd2l0aCAtaDMpIGltcGxpZXMKLSAqIHRoYXQgY2FzZSBzaG91bGQgYmUgcHJlc2VydmVkLiAgKi8KLQotLyogSWYgdGhlIC0rIHN3aXRjaCBpcyBnaXZlbiwgdGhlbiB0aGUgaGFzaCBpcyBhcHBlbmRlZCB0byBhbnkgbmFtZSB0aGF0IGlzCi0gKiBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLCByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZSAtaCBzd2l0Y2guCi0gKi8KLQotY2hhciB2bXNfbmFtZV9tYXBwaW5nID0gMDsKLQotc3RhdGljIHN5bWJvbFMgKkVudHJ5X1BvaW50X1N5bWJvbCA9IDA7CS8qIFBvaW50ZXIgdG8gIl9tYWluIiAqLwotCi0vKgotICoJV2UgYXVnbWVudCB0aGUgImdhcyIgc3ltYm9sIHN0cnVjdHVyZSB3aXRoIHRoaXMKLSAqLwotc3RydWN0IFZNU19TeW1ib2wKLXsKLSAgc3RydWN0IFZNU19TeW1ib2wgKk5leHQ7Ci0gIHN5bWJvbFMgKlN5bWJvbDsKLSAgaW50IFNpemU7Ci0gIGludCBQc2VjdF9JbmRleDsKLSAgaW50IFBzZWN0X09mZnNldDsKLX07Ci0KLXN0cnVjdCBWTVNfU3ltYm9sICpWTVNfU3ltYm9scyA9IDA7Ci1zdHJ1Y3QgVk1TX1N5bWJvbCAqQ3RvcnNfU3ltYm9scyA9IDA7Ci1zdHJ1Y3QgVk1TX1N5bWJvbCAqRHRvcnNfU3ltYm9scyA9IDA7Ci0KLS8qIFdlIG5lZWQgdGhpcyB0byBrZWVwIHRyYWNrIG9mIHRoZSB2YXJpb3VzIGlucHV0IGZpbGVzLCBzbyB0aGF0IHdlIGNhbgotICogZ2l2ZSB0aGUgZGVidWdnZXIgdGhlIGNvcnJlY3Qgc291cmNlIGxpbmUuCi0gKi8KLQotc3RydWN0IGlucHV0X2ZpbGUKLXsKLSAgc3RydWN0IGlucHV0X2ZpbGUgKm5leHQ7Ci0gIHN0cnVjdCBpbnB1dF9maWxlICpzYW1lX2ZpbGVfZnBudDsKLSAgaW50IGZpbGVfbnVtYmVyOwotICBpbnQgbWF4X2xpbmU7Ci0gIGludCBtaW5fbGluZTsKLSAgaW50IG9mZnNldDsKLSAgY2hhciBmbGFnOwotICBjaGFyICpuYW1lOwotICBzeW1ib2xTICpzcG50OwotfTsKLQotc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICpmaWxlX3Jvb3QgPSAoc3RydWN0IGlucHV0X2ZpbGUgKikgTlVMTDsKLQotCi0vKgotICogU3R5bGVzIG9mIFBTRUNUUyAocHJvZ3JhbSBzZWN0aW9ucykgdGhhdCB3ZSBnZW5lcmF0ZTsganVzdCBzaG9ydGhhbmQKLSAqIHRvIGF2b2lkIGxpc3RzIG9mIHNlY3Rpb24gYXR0cmlidXRlcy4gIFVzZWQgYnkgVk1TX1BzZWN0X1NwZWMoKS4KLSAqLwotZW51bSBwc190eXBlCi17Ci0gIHBzX1RFWFQsIHBzX0RBVEEsIHBzX0NPTU1PTiwgcHNfQ09OU1QsIHBzX0NUT1JTLCBwc19EVE9SUwotfTsKLQotLyoKLSAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHZhcmlvdXMgdHlwZXMgb2YgdmFyaWFibGVzIHRoYXQKLSAqIG1heSBiZSBwcmVzZW50LgotICovCi0KLWVudW0gYWR2YW5jZWRfdHlwZQotewotICBCQVNJQywgUE9JTlRFUiwgQVJSQVksIEVOVU0sIFNUUlVDVCwgVU5JT04sIEZVTkNUSU9OLCBWT0lELCBBTElBUywgVU5LTk9XTgotfTsKLQotLyoKLSAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFicyBkaXJlY3RpdmVzLCBhbmQgdGhlCi0gKiBpbmZvcm1hdGlvbiBpcyBmaWxsZWQgaW4gYnkgVk1TX3R5cGVkZWZfcGFyc2UuICBFdmVyeXRoaW5nIHRoYXQgaXMgbmVlZGVkCi0gKiB0byBnZW5lcmF0ZSB0aGUgZGVidWdnaW5nIHJlY29yZCBmb3IgYSBnaXZlbiBzeW1ib2wgaXMgcHJlc2VudCBoZXJlLgotICogVGhpcyBjb3VsZCBiZSBkb25lIG1vcmUgZWZmaWNpZW50bHksIHVzaW5nIG5lc3RlZCBzdHJ1Y3QvdW5pb25zLCBidXQgZm9yIG5vdwotICogSSBhbSBoYXBweSB0aGF0IGl0IHdvcmtzLgotICovCi1zdHJ1Y3QgVk1TX0RCR19TeW1ib2wKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpuZXh0OwotICAvKiBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgaXMgKi8KLSAgZW51bSBhZHZhbmNlZF90eXBlIGFkdmFuY2VkOwotICAvKiB0aGlzIHJlY29yZCBpcyBmb3IgdGhpcyB0eXBlICovCi0gIGludCBkYnhfdHlwZTsKLSAgLyogRm9yIGFkdmFuY2VkIHR5cGVzIHRoaXMgaXMgdGhlIHR5cGUgcmVmZXJyZWQgdG8uICBJLmUuLCB0aGUgdHlwZQotICAgICBhIHBvaW50ZXIgcG9pbnRzIHRvLCBvciB0aGUgdHlwZSBvZiBvYmplY3QgdGhhdCBtYWtlcyB1cCBhbgotICAgICBhcnJheS4gICovCi0gIGludCB0eXBlMjsKLSAgLyogVXNlIHRoaXMgdHlwZSB3aGVuIGdlbmVyYXRpbmcgYSB2YXJpYWJsZSBkZWYgKi8KLSAgaW50IFZNU190eXBlOwotICAvKiB1c2VkIGZvciBhcnJheXMgLSB0aGlzIHdpbGwgYmUgcHJlc2VudCBmb3IgYWxsICovCi0gIGludCBpbmRleF9taW47Ci0gIC8qIGVudHJpZXMsIGJ1dCB3aWxsIGJlIG1lYW5pbmdsZXNzIGZvciBub24tYXJyYXlzICovCi0gIGludCBpbmRleF9tYXg7Ci0gIC8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgdHlwZS4gIEZvciBhbiBhcnJheSwgdGhpcyBpcyB0aGUgc2l6ZQotICAgICBvZiBvbmUgZWxlbWVudCBpbiB0aGUgYXJyYXkgKi8KLSAgaW50IGRhdGFfc2l6ZTsKLSAgLyogTnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUvdW5pb24vZW51bSAtIHVzZWQgZm9yIHJlZiAqLwotICBpbnQgc3RydWNfbnVtYjsKLX07Ci0KLSNkZWZpbmUgU1lNVFlQTFNUX1NJWkUgKDE8PDQpCS8qIDE2OyBtdXN0IGJlIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBTWU1UWVBfSEFTSCh4KSAoKHVuc2lnbmVkKSh4KSAmIChTWU1UWVBMU1RfU0laRS0xKSkKLXN0cnVjdCBWTVNfREJHX1N5bWJvbCAqVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQTFNUX1NJWkVdOwotCi0vKgotICogV2UgbmVlZCB0aGlzIHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIGZvcndhcmQgcmVmZXJlbmNlcyB0bwotICogc3RydWN0L3VuaW9uL2VudW0gdGhhdCBoYXZlIG5vdCBiZWVuIGRlZmluZWQgeWV0LiAgV2hlbiB0aGV5IGFyZSB1bHRpbWF0ZWx5Ci0gKiBkZWZpbmVkLCB0aGVuIHdlIGNhbiBnbyBiYWNrIGFuZCBnZW5lcmF0ZSB0aGUgVElSIGNvbW1hbmRzIHRvIG1ha2UgYSBiYWNrCi0gKiByZWZlcmVuY2UuCi0gKi8KLQotc3RydWN0IGZvcndhcmRfcmVmCi17Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqbmV4dDsKLSAgaW50IGRieF90eXBlOwotICBpbnQgc3RydWNfbnVtYjsKLSAgY2hhciByZXNvbHZlZDsKLX07Ci0KLXN0cnVjdCBmb3J3YXJkX3JlZiAqZl9yZWZfcm9vdCA9IChzdHJ1Y3QgZm9yd2FyZF9yZWYgKikgTlVMTDsKLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIG5hbWVzIG9mIGNlcnRhaW4gdHlwZXMgdG8gdmFyaW91cwotICogZml4ZWQgdHlwZXMgdGhhdCBhcmUga25vd24gYnkgdGhlIGRlYnVnZ2VyLgotICovCi0jZGVmaW5lIHR5cGVfY2hlY2soWCkgICFzdHJjbXAgKHN5bWJvbF9uYW1lLCBYKQotCi0vKgotICogVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB3ZSBhcmUKLSAqIHdvcmtpbmcgb24gd2hpbGUgd2UgYXJlIHBhcnNpbmcgdGhlIHN0YWJzIGRpcmVjdGl2ZXMuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLQotLyogV2UgdXNlIHRoaXMgY291bnRlciB0byBhc3NpZ24gbnVtYmVycyB0byBhbGwgb2YgdGhlIHN0cnVjdHVyZXMsIHVuaW9ucwotICogYW5kIGVudW1zIHRoYXQgd2UgZGVmaW5lLiAgV2hlbiB3ZSBhY3R1YWxseSBkZWNsYXJlIGEgdmFyaWFibGUgdG8gdGhlCi0gKiBkZWJ1Z2dlciwgd2UgY2FuIHNpbXBseSBkbyBpdCBieSBudW1iZXIsIHJhdGhlciB0aGFuIGRlc2NyaWJpbmcgdGhlCi0gKiB3aG9sZSB0aGluZyBlYWNoIHRpbWUuCi0gKi8KLQotc3RhdGljIHN0cnVjdHVyZV9jb3VudCA9IDA7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBtYWtpbmcgdGhlIGxhc3QgYXR0ZW1wdCB0bwotICAgcGFyc2UgdGhlIHN0YWJzLCBhbmQgdGhhdCB3ZSBzaG91bGQgZGVmaW5lIGFzIG11Y2ggYXMgd2UgY2FuLCBhbmQgaWdub3JlCi0gICB0aGUgcmVzdCAqLwotCi1zdGF0aWMgaW50IGZpbmFsX3Bhc3M7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0cnVjdHVyZSBudW1iZXIKLSAqIGZvciBhIGdpdmVuIHZhcmlhYmxlLiAgSWYgdGhpcyBpcyA8IDAsIHRoYXQgbWVhbnMgdGhhdCB0aGUgc3RydWN0dXJlCi0gKiBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQgdG8gdGhlIGRlYnVnZ2VyLiAgVGhpcyBpcyBzdGlsbCBjb29sLCBzaW5jZQotICogdGhlIFZNUyBvYmplY3QgbGFuZ3VhZ2UgaGFzIHdheXMgb2YgZml4aW5nIHRoaW5ncyB1cCBhZnRlciB0aGUgZmFjdCwKLSAqIHNvIHdlIGp1c3QgbWFrZSBhIG5vdGUgb2YgdGhpcywgYW5kIGdlbmVyYXRlIGZpeHVwcyBhdCB0aGUgZW5kLgotICovCi1zdGF0aWMgaW50IHN0cnVjdF9udW1iZXI7Ci0KLS8qIFRoaXMgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIERfZmxvYXQgYW5kIEdfZmxvYXQgZm9yIHRlbGxpbmcKLSAgIHRoZSBkZWJ1Z2dlciBhYm91dCBkb3VibGVzLiAgZ2NjIG91dHB1dHMgdGhlIHNhbWUgLnN0YWJzIHJlZ2FyZGxlc3MKLSAgIG9mIHdoZXRoZXIgLW1nIGlzIHVzZWQgdG8gc2VsZWN0IGFsdGVybmF0ZSBkb3VibGVzLiAgKi8KLQotc3RhdGljIGludCB2YXhfZ19kb3VibGVzID0gMDsKLQotLyogTG9jYWwgc3ltYm9sIHJlZmVyZW5jZXMgKHVzZWQgdG8gaGFuZGxlIE5fQUJTIHN5bWJvbHM7IGdjYyBkb2VzIG5vdAotICAgZ2VuZXJhdGUgdGhvc2UsIGJ1dCB0aGV5J3JlIHBvc3NpYmxlIHdpdGggaGFuZC1jb2RlZCBhc3NlbWJsZXIgaW5wdXQpCi0gICBhcmUgYWx3YXlzIG1hZGUgcmVsYXRpdmUgdG8gc29tZSBwYXJ0aWN1bGFyIGVudmlyb25tZW50LiAgSWYgdGhlIGN1cnJlbnQKLSAgIGlucHV0IGhhcyBhbnkgc3VjaCBzeW1ib2xzLCB0aGVuIHdlIGV4cGVjdCB0aGlzIHRvIGdldCBpbmNyZW1lbnRlZAotICAgZXhhY3RseSBvbmNlIGFuZCBlbmQgdXAgaGF2aW5nIGFsbCBvZiB0aGVtIGJlIGluIGVudmlyb25tZW50ICMwLiAgKi8KLQotc3RhdGljIGludCBDdXJyZW50X0Vudmlyb25tZW50ID0gLTE7Ci0KLS8qIEV2ZXJ5IG9iamVjdCBmaWxlIG11c3Qgc3BlY2lmeSBhbiBtb2R1bGUgbmFtZSwgd2hpY2ggaXMgYWxzbyB1c2VkIGJ5Ci0gICB0cmFjZWJhY2sgcmVjb3Jkcy4gIFNldCBpbiBXcml0ZV9WTVNfTUhEX1JlY29yZHMoKS4gICovCi0KLXN0YXRpYyBjaGFyIE1vZHVsZV9OYW1lWzI1NSsxXTsKLQotLyoKLSAqIFZhcmlhYmxlIGRlc2NyaXB0b3JzIGFyZSB1c2VkIHRlbGwgdGhlIGRlYnVnZ2VyIHRoZSBkYXRhIHR5cGVzIG9mIGNlcnRhaW4KLSAqIG1vcmUgY29tcGxpY2F0ZWQgdmFyaWFibGVzIChiYXNpY2FsbHkgYW55dGhpbmcgaW52b2x2aW5nIGEgc3RydWN0dXJlLAotICogdW5pb24sIGVudW0sIGFycmF5IG9yIHBvaW50ZXIpLiAgU29tZSBub24tcG9pbnRlciB2YXJpYWJsZXMgb2YgdGhlCi0gKiBiYXNpYyB0eXBlcyB0aGF0IHRoZSBkZWJ1Z2dlciBrbm93cyBhYm91dCBkbyBub3QgcmVxdWlyZSBhIHZhcmlhYmxlCi0gKiBkZXNjcmlwdG9yLgotICoKLSAqIFNpbmNlIGl0IGlzIGltcG9zc2libGUgdG8gaGF2ZSBhIHZhcmlhYmxlIGRlc2NyaXB0b3IgbG9uZ2VyIHRoYW4gMTI4Ci0gKiBieXRlcyBieSB2aXJ0dWUgb2YgdGhlIHdheSB0aGF0IHRoZSBWTVMgb2JqZWN0IGxhbmd1YWdlIGlzIHNldCB1cCwKLSAqIGl0IG1ha2VzIG5vdCBzZW5zZSB0byBtYWtlIHRoZSBhcnJheXMgYW55IGxvbmdlciB0aGFuIHRoaXMsIG9yIHdvcnJ5aW5nCi0gKiBhYm91dCBkeW5hbWljIHNpemluZyBvZiB0aGUgYXJyYXkuCi0gKgotICogVGhlc2UgYXJlIHRoZSBhcnJheXMgYW5kIGNvdW50ZXJzIHRoYXQgd2UgdXNlIHRvIGJ1aWxkIGEgdmFyaWFibGUKLSAqIGRlc2NyaXB0b3IuCi0gKi8KLQotI2RlZmluZSBNQVhfREVCVUdfUkVDT1JEIDEyOAotc3RhdGljIGNoYXIgTG9jYWxbTUFYX0RFQlVHX1JFQ09SRF07CS8qIGJ1ZmZlciBmb3IgdmFyaWFibGUgZGVzY3JpcHRvciAqLwotc3RhdGljIGNoYXIgQXN1ZmZpeFtNQVhfREVCVUdfUkVDT1JEXTsJLyogYnVmZmVyIGZvciBhcnJheSBkZXNjcmlwdG9yICovCi1zdGF0aWMgaW50IExwbnQ7CQkvKiBpbmRleCBpbnRvIExvY2FsICovCi1zdGF0aWMgaW50IEFwb2ludDsJCS8qIGluZGV4IGludG8gQXN1ZmZpeCAqLwotc3RhdGljIGNoYXIgb3ZlcmZsb3c7CQkvKiBmbGFnIHRvIGluZGljYXRlIHdlIGhhdmUgd3JpdHRlbiB0b28gbXVjaCovCi1zdGF0aWMgaW50IHRvdGFsX2xlbjsJCS8qIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdmFyaWFibGUKLQkJCQlkZXNjcmlwdG9yIHBsdXMgYXJyYXkgZGVzY3JpcHRvciAtIHVzZWQgZm9yIGxlbiBieXRlKi8KLQotLyogRmxhZyBpZiB3ZSBoYXZlIHRvbGQgdXNlciBhYm91dCBmaW5kaW5nIGdsb2JhbCBjb25zdGFudHMgaW4gdGhlIHRleHQKLSAgIHNlY3Rpb24uICovCi1zdGF0aWMgaW50IGdhdmVfY29tcGlsZXJfbWVzc2FnZSA9IDA7Ci0KLQotLyoKLSAqCUdsb2JhbCBkYXRhIChPYmplY3QgcmVjb3JkcyBsaW1pdGVkIHRvIDUxMiBieXRlcyBieSBWQVgtMTEgIkMiIHJ1bnRpbWUpCi0gKi8KLXN0YXRpYyBpbnQgVk1TX09iamVjdF9GaWxlX0ZEOwkvKiBGaWxlIERlc2NyaXB0b3IgZm9yIG9iamVjdCBmaWxlICovCi1zdGF0aWMgY2hhciBPYmplY3RfUmVjb3JkX0J1ZmZlcls1MTJdOwkvKiBCdWZmZXIgZm9yIG9iamVjdCBmaWxlIHJlY29yZHMgICovCi1zdGF0aWMgaW50IE9iamVjdF9SZWNvcmRfT2Zmc2V0Oy8qIE9mZnNldCB0byBlbmQgb2YgZGF0YQkgICAqLwotc3RhdGljIGludCBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZTsJLyogVHlwZSBvZiByZWNvcmQgaW4gYWJvdmUJICAgKi8KLQotLyoKLSAqCU1hY3JvcyBmb3IgbW92aW5nIGRhdGEgYXJvdW5kLiAgTXVzdCB3b3JrIG9uIGJpZy1lbmRpYW4gc3lzdGVtcy4KLSAqLwotI2lmZGVmIFZNUyAgLyogVGhlc2UgYXJlIG1vcmUgZWZmaWNpZW50IGZvciBWTVMtPlZNUyBzeXN0ZW1zICovCi0jZGVmaW5lIENPUFlfTE9ORyhkZXN0LHZhbCkJKCAqKGxvbmcgKikoZGVzdCkgPSAodmFsKSApCi0jZGVmaW5lIENPUFlfU0hPUlQoZGVzdCx2YWwpCSggKihzaG9ydCAqKShkZXN0KSA9ICh2YWwpICkKLSNlbHNlCi0jZGVmaW5lIENPUFlfTE9ORyhkZXN0LHZhbCkJbWRfbnVtYmVyX3RvX2NoYXJzICgoZGVzdCksICh2YWwpLCA0KQotI2RlZmluZSBDT1BZX1NIT1JUKGRlc3QsdmFsKQltZF9udW1iZXJfdG9fY2hhcnMgKChkZXN0KSwgKHZhbCksIDIpCi0jZW5kaWYKLS8qCi0gKglNYWNyb3MgZm9yIHBsYWNpbmcgZGF0YSBpbnRvIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlci4KLSAqLwotI2RlZmluZSBQVVRfTE9ORyh2YWwpIFwKLQkoIENPUFlfTE9ORyAoJk9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0XSwgKHZhbCkpLCBcCi0JICBPYmplY3RfUmVjb3JkX09mZnNldCArPSA0ICkKLQotI2RlZmluZSBQVVRfU0hPUlQodmFsKSBcCi0JKCBDT1BZX1NIT1JUICgmT2JqZWN0X1JlY29yZF9CdWZmZXJbT2JqZWN0X1JlY29yZF9PZmZzZXRdLCAodmFsKSksIFwKLQkgIE9iamVjdF9SZWNvcmRfT2Zmc2V0ICs9IDIgKQotCi0jZGVmaW5lIFBVVF9DSEFSKHZhbCkgKCBPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldCsrXSA9ICh2YWwpICkKLQotI2RlZmluZSBQVVRfQ09VTlRFRF9TVFJJTkcoY3ApIGRvIHsgXAotCQkJcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IChjcCk7IFwKLQkJCVBVVF9DSEFSICgoY2hhcikgc3RybGVuIChwKSk7IFwKLQkJCXdoaWxlICgqcCkgUFVUX0NIQVIgKCpwKyspOyB9IHdoaWxlICgwKQotCi0vKgotICoJTWFjcm8gZm9yIGRldGVybWluaW5nIGlmIGEgTmFtZSBoYXMgcHNlY3QgYXR0cmlidXRlcyBhdHRhY2hlZAotICoJdG8gaXQuCi0gKi8KLSNkZWZpbmUgUFNFQ1RfQVRUUklCVVRFU19TVFJJTkcJCSIkJFBzZWN0QXR0cmlidXRlc18iCi0jZGVmaW5lIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSAkxOAotCi0jZGVmaW5lIEhBU19QU0VDVF9BVFRSSUJVVEVTKE5hbWUpIFwKLQkJKHN0cm5jbXAgKCgqTmFtZSA9PSAnXycgPyBOYW1lICsgMSA6IE5hbWUpLCBcCi0JCQkgIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HLCBcCi0JCQkgIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSCkgPT0gMCkKLQwKLQotIC8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLwotY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdID0KLXsKLSAgTl9BQlMsCi0gIE5fVEVYVCwKLSAgTl9EQVRBLAotICBOX0JTUywKLSAgTl9VTkRGLAkJCS8qIHVua25vd24gKi8KLSAgTl9VTkRGLAkJCS8qIGVycm9yICovCi0gIE5fVU5ERiwJCQkvKiBleHByZXNzaW9uICovCi0gIE5fVU5ERiwJCQkvKiBkZWJ1ZyAqLwotICBOX1VOREYsCQkJLyogbnR2ICovCi0gIE5fVU5ERiwJCQkvKiBwdHYgKi8KLSAgTl9SRUdJU1RFUiwJCQkvKiByZWdpc3RlciAqLwotfTsKLQotY29uc3Qgc2VnVCBOX1RZUEVfc2VnW05fVFlQRSArIDJdID0KLXsJCQkJLyogTl9UWVBFID09IDB4MUUgPSAzMi0yICovCi0gIFNFR19VTktOT1dOLAkJCS8qIE5fVU5ERiA9PSAwICovCi0gIFNFR19HT09GLAotICBTRUdfQUJTT0xVVEUsCQkJLyogTl9BQlMgPT0gMiAqLwotICBTRUdfR09PRiwKLSAgU0VHX1RFWFQsCQkJLyogTl9URVhUID09IDQgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19EQVRBLAkJCS8qIE5fREFUQSA9PSA2ICovCi0gIFNFR19HT09GLAotICBTRUdfQlNTLAkJCS8qIE5fQlNTID09IDggKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX1JFR0lTVEVSLAkJCS8qIGR1bW15IE5fUkVHSVNURVIgZm9yIHJlZ3MgPSAzMCAqLwotICBTRUdfR09PRiwKLX07Ci0MCi0KLS8qIExvY2FsIHN1cHBvcnQgcm91dGluZXMgd2hpY2ggcmV0dXJuIGEgdmFsdWUuICAqLwotCi1zdGF0aWMgc3RydWN0IGlucHV0X2ZpbGUgKmZpbmRfZmlsZSBQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKmZpbmRfc3ltYm9sIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHN5bWJvbFMgKkRlZmluZV9Sb3V0aW5lIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsc3ltYm9sUyAqLGludCkpOwotCi1zdGF0aWMgY2hhciAqY3Z0X2ludGVnZXIgUEFSQU1TICgoY2hhciAqLGludCAqKSk7Ci1zdGF0aWMgY2hhciAqZml4X25hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X3N0cnVjdF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgb2Zmc2V0VCBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIFBBUkFNUyAoKHN5bWJvbFMgKix1bnNpZ25lZCkpOwotCi1zdGF0aWMgaW50IFZNU19UQlRfU291cmNlX0ZpbGUgUEFSQU1TICgoY2hhciAqLGludCkpOwotc3RhdGljIGludCBnZW4xIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIGludCBmb3J3YXJkX3JlZmVyZW5jZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgZmluYWxfZm9yd2FyZF9yZWZlcmVuY2UgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKLXN0YXRpYyBpbnQgVk1TX3R5cGVkZWZfcGFyc2UgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IGhhc2hfc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBWTVNfUHNlY3RfU3BlYyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50LGVudW0gcHNfdHlwZSwKLQkJCQkgICBzdHJ1Y3QgVk1TX1N5bWJvbCAqKSk7Ci0KLS8qIExvY2FsIHN1cHBvcnQgcm91dGluZXMgd2hpY2ggZG9uJ3QgZGlyZWN0bHkgcmV0dXJuIGFueSB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkIHNfY29uc3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBDcmVhdGVfVk1TX09iamVjdF9GaWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIENsb3NlX1ZNU19PYmplY3RfRmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB2bXNfdGlyX3N0YWNrX3BzZWN0IFBBUkFNUyAoKGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TZXRfRGF0YSBQQVJBTVMgKChpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TdG9yZV9TdHJ1Y3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfRGVmX1N0cnVjdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TZXRfU3RydWN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Nb2R1bGVfQmVnaW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Nb2R1bGVfRW5kIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfUm91dGluZV9CZWdpbiBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX1JvdXRpbmVfRW5kIFBBUkFNUyAoKGludCxzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfQmxvY2tfQmVnaW4gUEFSQU1TICgoc3ltYm9sUyAqLGludCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfQmxvY2tfRW5kIFBBUkFNUyAoKHZhbHVlVCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIFBBUkFNUyAoKGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Tb3VyY2VfTGluZXMgUEFSQU1TICgoaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIGZwdXNoIFBBUkFNUyAoKGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIHJwdXNoIFBBUkFNUyAoKGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIGFycmF5X3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikpOwotc3RhdGljIHZvaWQgbmV3X2ZvcndhcmRfcmVmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfc3VmZml4IFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIHZvaWQgYml0ZmllbGRfc3VmZml4IFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIHZvaWQgc2V0dXBfYmFzaWNfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikpOwotc3RhdGljIHZvaWQgVk1TX0RCR19yZWNvcmQgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICosaW50LGludCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19sb2NhbF9zdGFiX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgVk1TX3N0YWJfcGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX0dTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX0xDU1lNX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TVFNZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfUlNZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX0xTWU1fUGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgRGVmaW5lX0xvY2FsX1N5bWJvbHMgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKixzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBXcml0ZV9WTVNfTUhEX1JlY29yZHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgV3JpdGVfVk1TX0VPTV9SZWNvcmQgUEFSQU1TICgoaW50LHZhbHVlVCkpOwotc3RhdGljIHZvaWQgVk1TX0Nhc2VfSGFja19TeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLGNoYXIgKikpOwotc3RhdGljIHZvaWQgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixpbnQgKikpOwotc3RhdGljIHZvaWQgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19FbWl0X0dsb2JhbHZhbHVlcyBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19Qcm9jZWR1cmVfRW50cnlfUHQgUEFSQU1TICgoY2hhciAqLGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU2V0X1BzZWN0IFBBUkFNUyAoKGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfUmVwZWF0ZWRfRGF0YSBQQVJBTVMgKChpbnQsY2hhciAqLGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSBQQVJBTVMgKChzeW1ib2xTICosaW50LAotCQkJCQkJICAgIGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgUEFSQU1TICgoaW50LGludCxmcmFnUyAqLGZyYWdTICopKTsKLQotLyogU3VwcG9ydCBjb2RlIHdoaWNoIHVzZWQgdG8gYmUgaW5saW5lIHdpdGhpbiB2bXNfd3JpdGVfb2JqZWN0X2ZpbGUuICAqLwotc3RhdGljIHZvaWQgdm1zX2ZpeHVwX3RleHRfc2VjdGlvbiBQQVJBTVMgKCh1bnNpZ25lZCxzdHJ1Y3QgZnJhZyAqLHN0cnVjdCBmcmFnICopKTsKLXN0YXRpYyB2b2lkIHN5bnRoZXNpemVfZGF0YV9zZWdtZW50IFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkLHN0cnVjdCBmcmFnICopKTsKLXN0YXRpYyB2b2lkIHZtc19maXh1cF9kYXRhX3NlY3Rpb24gUEFSQU1TICgodW5zaWduZWQsdW5zaWduZWQpKTsKLXN0YXRpYyB2b2lkIGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5IFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCBsb2NhbF9zeW1ib2xzX0RTVCBQQVJBTVMgKChzeW1ib2xTICosc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCB2bXNfYnVpbGRfRFNUIFBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgVk1TX1N5bWJvbCAqLCBpbnQpKTsKLQwKLQotLyogVGhlIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgdGhlIHNwZWNpYWwgdHlwZXMgb2YgcHNldWRvLW9wcyB0aGF0IHdlCi0gICB1c2Ugd2l0aCBWTVMuICAqLwotCi11bnNpZ25lZCBjaGFyIGNvbnN0X2ZsYWcgPSBJTl9ERUZBVUxUX1NFQ1RJT047Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbnN0IChhcmcpCi0gICAgIGludCBhcmc7CS8qIDNyZCBmaWVsZCBmcm9tIG9ial9wc2V1ZG9fdGFibGVbXTsgbm90IG5lZWRlZCBoZXJlICovCi17Ci0gIC8qIFNpbmNlIHdlIGRvbid0IG5lZWQgYGFyZycsIHVzZSBpdCBhcyBvdXIgc2NyYXRjaCB2YXJpYWJsZSBzbyB0aGF0Ci0gICAgIHdlIHdvbid0IGdldCBhbnkgIm5vdCB1c2VkIiB3YXJuaW5ncyBhYm91dCBpdC4gICovCi0gIGFyZyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChTRUdfREFUQSwgKHN1YnNlZ1QpIGFyZyk7Ci0gIGNvbnN0X2ZsYWcgPSAxOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJjb25zdCIsIHNfY29uc3QsIDB9LAotICB7MCwgMCwgMH0sCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0KLQotLyogUm91dGluZSB0byBwZXJmb3JtIFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTigpLiAgKi8KLQotaW50Ci12bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICAvKgotICAgKglJZiB0aGUgbmV3IHN5bWJvbCBpcyAuY29tbSBBTkQgaXQgaGFzIGEgc2l6ZSBvZiB6ZXJvLAotICAgKgl3ZSBpZ25vcmUgaXQgKGkuZS4gdGhlIG9sZCBzeW1ib2wgb3ZlcnJpZGVzIGl0KQotICAgKi8KLSAgaWYgKFNFR01FTlRfVE9fU1lNQk9MX1RZUEUgKChpbnQpIG5vd19zZWcpID09IChOX1VOREYgfCBOX0VYVCkKLSAgICAgICYmIGZyYWdfbm93X2ZpeCAoKSA9PSAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oImNvbXBpbGVyIGVtaXR0ZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwKLQkgICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIC8qCi0gICAqCUlmIHRoZSBvbGQgc3ltYm9sIGlzIC5jb21tIGFuZCBpdCBoYXMgYSBzaXplIG9mIHplcm8sCi0gICAqCXdlIG92ZXJyaWRlIGl0IHdpdGggdGhlIG5ldyBzeW1ib2wgdmFsdWUuCi0gICAqLwotICBpZiAoU19JU19FWFRFUk5BTCAoc3ltKSAmJiBTX0lTX0RFRklORUQgKHN5bSkgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJjb21waWxlciByZWRlZmluZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyIpLAotCSAgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIHN5bS0+c3lfZnJhZyAgPSBmcmFnX25vdzsKLSAgICAgIFNfU0VUX09USEVSIChzeW0sIGNvbnN0X2ZsYWcpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIC8qIEtlZXAgTl9FWFQgYml0LiAgKi8KLSAgICAgIHN5bS0+c3lfc3ltYm9sLm5fdHlwZSB8PSBTRUdNRU5UX1RPX1NZTUJPTF9UWVBFICgoaW50KSBub3dfc2VnKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBgdGNfZnJvYl9sYWJlbCcgaGFuZGxlciBmb3IgY29sb24oc3ltYm9scy5jKSwgdXNlZCB0byBleGFtaW5lIHRoZQotICAgZHVtbXkgbGFiZWwocykgZ2NjIGluc2VydHMgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGZpbGUgaXQgZ2VuZXJhdGVzLgotICAgZ2NjIDEueCBwdXQgImdjY19jb21waWxlZC4iOyBnY2MgMi54IChhcyBvZiAyLjcpIHB1dHMgImdjYzJfY29tcGlsZWQuIgotICAgYW5kICJfX2dudV9sYW5ndWFnZV88bmFtZT4iIGFuZCBwb3NzaWJseSAiX192YXhfPHR5cGU+X2RvdWJsZXMiLiAgKi8KLQotdm9pZAotdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsIChzeW1ib2xQKQotc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgLyogU3BlY2lhbCBsYWJlbHMgb25seSBvY2N1ciBwcmlvciB0byBleHBsaWNpdCBzZWN0aW9uIGRpcmVjdGl2ZXMuICAqLwotICBpZiAoKGNvbnN0X2ZsYWcgJiBJTl9ERUZBVUxUX1NFQ1RJT04pICE9IDApCi0gICAgewotICAgICAgY2hhciAqc3ltX25hbWUgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLQotICAgICAgaWYgKCpzeW1fbmFtZSA9PSAnXycpCi0JKytzeW1fbmFtZTsKLQotICAgICAgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiX192YXhfZ19kb3VibGVzIikpCi0JdmF4X2dfZG91YmxlcyA9IDE7Ci0jaWYgMAkvKiBub3QgbmVjZXNzYXJ5ICovCi0gICAgICBlbHNlIGlmICghc3RyY21wIChzeW1fbmFtZSwgIl9fdmF4X2RfZG91YmxlcyIpKQotCXZheF9nX2RvdWJsZXMgPSAwOwotI2VuZGlmCi0jaWYgMAkvKiB0aGVzZSBhcmUgcG90ZW50aWFsIGFsdGVybmF0aXZlcyB0byB0Yy12YXguYydzIG1kX3BhcnNlX29wdGlvbnMoKSAqLwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJnY2NfY29tcGlsZWQuIikpCi0JZmxhZ19vbmUgPSAxOwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJfX2dudV9sYW5ndWFnZV9jcGx1c3BsdXMiKSkKLQlmbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci0gIHJldHVybjsKLX0KLQotCi12b2lkCi1vYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3ltYm9sUyAqKnN5bWJvbFBQOwotICBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgc3ltYm9sUFAgPSAmc3ltYm9sX3Jvb3RQOwkvKiAtPiBsYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLwotICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCi0gICAgewotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgIC8qIE9LLCBoZXJlIGlzIGhvdyB3ZSBkZWNpZGUgd2hpY2ggc3ltYm9scyBnbyBvdXQgaW50byB0aGUKLQlicmF2ZSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQotCSogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQotCSogc3ltYm9scyB3aXRoIGRlYnVnIGluZm8gaW4gdGhlaXIgTl9UWVBFCi0JKiBzeW1ib2xzIHdpdGggXDEgYXMgdGhlaXIgM3JkIGNoYXJhY3RlciAobnVtZXJpYyBsYWJlbHMpCi0JKiAibG9jYWwgbGFiZWxzIiBuZWVkZWQgZm9yIFBJQyBmaXh1cHMKLQotCVN5bWJvbHMgdGhhdCBkb24ndCBhcmU6Ci0JKiBzeW1ib2xzIHRoYXQgYXJlIHJlZ2lzdGVycwotCi0JQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCXN5bWJvbCB3YXMgbWFya2VkIGV4dGVybmFsLiAgKi8KLQotICAgICAgaWYgKCFTX0lTX1JFR0lTVEVSIChzeW1ib2xQKSkKLQl7Ci0JICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyKys7Ci0JICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7Ci0JICBzeW1ib2xQUCA9ICYoc3ltYm9sX25leHQgKHN5bWJvbFApKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bWJvbFApIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJMb2NhbCBzeW1ib2wgJXMgbmV2ZXIgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICAgIH0JCQkvKiBvb3BzLiAqLwotCi0JICAvKiBVbmhvb2sgaXQgZnJvbSB0aGUgY2hhaW4uICAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotCi0gICAgfQkJCS8qIGZvciBlYWNoIHN5bWJvbCAqLwotCi0gIEhfU0VUX1NUUklOR19TSVpFIChoZWFkZXJzLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0gIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFIChoZWFkZXJzLCBzeW1ib2xfbnVtYmVyKTsKLX0JCQkJLyogb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpICovCi0MCi0KLSAvKioqKioqIFZNUyBPQkpFQ1QgRklMRSBIQUNLSU5HIFJPVVRJTkVTICoqKioqKiovCi0KLQotLyogQ3JlYXRlIHRoZSBWTVMgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSAoKQotewotI2lmCWRlZmluZWQoZXVuaWNlKSB8fCAhZGVmaW5lZChWTVMpCi0gIFZNU19PYmplY3RfRmlsZV9GRCA9IGNyZWF0IChvdXRfZmlsZV9uYW1lLCAwNzc3LCAidmFyIik7Ci0jZWxzZQkvKiBldW5pY2UgKi8KLSAgVk1TX09iamVjdF9GaWxlX0ZEID0gY3JlYXQgKG91dF9maWxlX25hbWUsIDAsICJyZm09dmFyIiwKLQkJCSAgICAgICJjdHg9YmluIiwgIm1iYz0xNiIsICJkZXE9NjQiLCAiZm9wPXRlZiIsCi0JCQkgICAgICAic2hyPW5pbCIpOwotI2VuZGlmCS8qIGV1bmljZSAqLwotICAvKiBEZWFsIHdpdGggZXJyb3JzLiAgKi8KLSAgaWYgKFZNU19PYmplY3RfRmlsZV9GRCA8IDApCi0gICAgYXNfZmF0YWwgKF8oIkNvdWxkbid0IGNyZWF0ZSBWTVMgb2JqZWN0IGZpbGUgXCIlc1wiIiksIG91dF9maWxlX25hbWUpOwotICAvKiBJbml0aWFsaXplIG9iamVjdCBmaWxlIGhhY2tpbmcgdmFyaWFibGVzLiAgKi8KLSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgPSAwOwotICBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZSA9IC0xOwotfQotCi0KLS8qIEZsdXNoIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlciB0byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpCi17Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIHJldHVybjsKLQotI2lmbmRlZiBWTVMJCQkvKiBGb3IgY3Jvc3MtYXNzZW1ibHkgcHVycG9zZXMuICovCi0gIHsKLSAgICBjaGFyIFJlY0xlblsyXTsKLQotICAgIC8qICJWYXJpYWJsZS1sZW5ndGggcmVjb3JkIiBmaWxlcyBoYXZlIGEgdHdvIGJ5dGUgbGVuZ3RoIGZpZWxkCi0gICAgICAgcHJlcGVuZGVkIHRvIGVhY2ggcmVjb3JkLiAgSXQncyBub3JtYWxseSBvdXQtb2YtYmFuZCwgYW5kIG5hdGl2ZQotICAgICAgIFZNUyBvdXRwdXQgd2lsbCBpbnNlcnQgaXQgYXV0b21hdGljYWxseSBmb3IgdGhpcyB0eXBlIG9mIGZpbGUuCi0gICAgICAgV2hlbiBjcm9zcy1hc3NlbWJsaW5nLCB3ZSBtdXN0IHdyaXRlIGl0IGV4cGxpY2l0bHkuICAqLwotICAgIG1kX251bWJlcl90b19jaGFycyAoUmVjTGVuLCBPYmplY3RfUmVjb3JkX09mZnNldCwgMik7Ci0gICAgaWYgKHdyaXRlIChWTVNfT2JqZWN0X0ZpbGVfRkQsIFJlY0xlbiwgMikgIT0gMikKLSAgICAgIGVycm9yIChfKCJJL08gZXJyb3Igd3JpdGluZyBWTVMgb2JqZWN0IGZpbGUgKGxlbmd0aCBwcmVmaXgpIikpOwotICAgIC8qIFdlIGFsc28gbmVlZCB0byBmb3JjZSB0aGUgYWN0dWFsIHJlY29yZCB0byBiZSBhbiBldmVuIG51bWJlciBvZgotICAgICAgIGJ5dGVzLiAgRm9yIG5hdGl2ZSBvdXRwdXQsIHRoYXQncyBhdXRvbWF0aWM7IHdoZW4gY3Jvc3MtYXNzZW1ibGluZywKLSAgICAgICBwYWQgd2l0aCBhIE5VTCBieXRlIGlmIGxlbmd0aCBpcyBvZGQuICBEbyBzbyBfYWZ0ZXJfIHdyaXRpbmcgdGhlCi0gICAgICAgcHJlLXBhZGRlZCBsZW5ndGguICBTaW5jZSBvdXIgYnVmZmVyIGlzIGRlZmluZWQgd2l0aCBldmVuIHNpemUsCi0gICAgICAgYW4gb2RkIG9mZnNldCBpbXBsaWVzIHRoYXQgaXQgaGFzIHNvbWUgcm9vbSBsZWZ0LiAgKi8KLSAgICBpZiAoKE9iamVjdF9SZWNvcmRfT2Zmc2V0ICYgMSkgIT0gMCkKLSAgICAgIE9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0KytdID0gJ1wwJzsKLSAgfQotI2VuZGlmIC8qIG5vdCBWTVMgKi8KLQotICAvKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZS4gICovCi0gIGlmICh3cml0ZSAoVk1TX09iamVjdF9GaWxlX0ZELCBPYmplY3RfUmVjb3JkX0J1ZmZlciwgT2JqZWN0X1JlY29yZF9PZmZzZXQpCi0gICAgICAhPSBPYmplY3RfUmVjb3JkX09mZnNldCkKLSAgICBlcnJvciAoXygiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIikpOwotCi0gIC8qIFRoZSBidWZmZXIgaXMgbm93IGVtcHR5LiAgKi8KLSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgPSAwOwotfQotCi0KLS8qIERlY2xhcmUgYSBwYXJ0aWN1bGFyIHR5cGUgb2Ygb2JqZWN0IGZpbGUgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChUeXBlKQotICAgICBpbnQgVHlwZTsKLXsKLSAgLyogSWYgdGhlIHR5cGUgbWF0Y2hlcywgd2UgYXJlIGRvbmUuICAqLwotICBpZiAoVHlwZSA9PSBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZSkKLSAgICByZXR1cm47Ci0gIC8qIE90aGVyd2lzZTogZmx1c2ggdGhlIGJ1ZmZlci4gICovCi0gIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLSAgLyogUmVtZW1iZXIgdGhlIG5ldyB0eXBlLiAgKi8KLSAgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUgPSBUeXBlOwotfQotCi0KLS8qIENsb3NlIHRoZSBWTVMgT2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotQ2xvc2VfVk1TX09iamVjdF9GaWxlICgpCi17Ci0gIC8qIEZsdXNoIChzaG91bGQgbmV2ZXIgYmUgbmVjZXNzYXJ5KSBhbmQgcmVzZXQgc2F2ZWQgcmVjb3JkLXR5cGUgY29udGV4dC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkICgtMSk7Ci0KLSNpZm5kZWYgVk1TCQkJLyogRm9yIGNyb3NzLWFzc2VtYmx5IHB1cnBvc2VzLiAqLwotICB7Ci0gICAgY2hhciBSZWNMZW5bMl07Ci0gICAgaW50IG1pbnVzX29uZSA9IC0xOwotCi0gICAgLyogV3JpdGUgYSAyIGJ5dGUgcmVjb3JkLWxlbmd0aCBmaWVsZCBvZiAtMSBpbnRvIHRoZSBmaWxlLCB3aGljaAotICAgICAgIG1lYW5zIGVuZC1vZi1ibG9jayB3aGVuIHJlYWQsIGhlbmNlIGVuZC1vZi1maWxlIHdoZW4gb2NjdXJyaW5nCi0gICAgICAgaW4gdGhlIGZpbGUncyBsYXN0IGJsb2NrLiAgSXQgaXMgb25seSBuZWVkZWQgZm9yIHZhcmlhYmxlLWxlbmd0aAotICAgICAgIHJlY29yZCBmaWxlcyB0cmFuc2ZlcnJlZCB0byBWTVMgYXMgZml4ZWQtbGVuZ3RoIHJlY29yZCBmaWxlcwotICAgICAgICh0eXBpY2FsIGZvciBiaW5hcnkgRlRQOyBORlMgc2hvdWxkbid0IG5lZWQgaXQsIGJ1dCBpdCB3b24ndCBodXJ0KS4gICovCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChSZWNMZW4sIG1pbnVzX29uZSwgMik7Ci0gICAgd3JpdGUgKFZNU19PYmplY3RfRmlsZV9GRCwgUmVjTGVuLCAyKTsKLSAgfQotI2Vsc2UKLSAgICAvKiBXaGVuIHdyaXR0ZW4gb24gYSBWTVMgc3lzdGVtLCB0aGUgZmlsZSBoZWFkZXIgKGNmIGlub2RlKSB3aWxsIHJlY29yZAotICAgICAgIHRoZSBhY3R1YWwgZW5kLW9mLWZpbGUgcG9zaXRpb24gYW5kIG5vIGlubGluZSBtYXJrZXIgaXMgbmVlZGVkLiAgKi8KLSNlbmRpZgotCi0gIGNsb3NlIChWTVNfT2JqZWN0X0ZpbGVfRkQpOwotfQotDAotCi0gLyoqKioqKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIHJvdXRpbmVzICoqKioqKi8KLQotCi0vKiBTdGFjayBQc2VjdCBiYXNlIGZvbGxvd2VkIGJ5IHNpZ25lZCwgdmFyeWluZy1zaXplZCBvZmZzZXQuCi0gICBDb21tb24gdG8gc2V2ZXJhbCBvYmplY3QgcmVjb3Jkcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdF9JbmRleCwgT2Zmc2V0LCBGb3JjZSkKLSAgICAgaW50IFBzZWN0X0luZGV4OwotICAgICBpbnQgT2Zmc2V0OwotICAgICBpbnQgRm9yY2U7Ci17Ci0gIGludCBwc2VjdF93aWR0aCwgb2Zmc2V0X3dpZHRoOwotCi0gIHBzZWN0X3dpZHRoID0gKCh1bnNpZ25lZCkgUHNlY3RfSW5kZXggPiAyNTUpID8gMiA6IDE7Ci0gIG9mZnNldF93aWR0aCA9IChGb3JjZSB8fCBPZmZzZXQgPiAzMjc2NyB8fCBPZmZzZXQgPCAtMzI3NjgpID8gNAotCQkgOiAoT2Zmc2V0ID4gMTI3IHx8IE9mZnNldCA8IC0xMjgpID8gMiA6IDE7Ci0jZGVmaW5lIFN0YV9QKHAsbykgKCgobyk8PDEpIHwgKChwKS0xKSkKLSAgLyogYnl0ZSBvciB3b3JkIHBzZWN0OyBieXRlLCB3b3JkLCBvciBsb25nd29yZCBvZmZzZXQgKi8KLSAgc3dpdGNoIChTdGFfUChwc2VjdF93aWR0aCxvZmZzZXRfd2lkdGgpKQotICAgIHsKLSAgICAgIGNhc2UgU3RhX1AoMSwxKToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1BCKTsKLQkJCVBVVF9DSEFSICgoY2hhcikodW5zaWduZWQgY2hhcikgUHNlY3RfSW5kZXgpOwotCQkJUFVUX0NIQVIgKChjaGFyKSBPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIFN0YV9QKDEsMik6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9QVyk7Ci0JCQlQVVRfQ0hBUiAoKGNoYXIpKHVuc2lnbmVkIGNoYXIpIFBzZWN0X0luZGV4KTsKLQkJCVBVVF9TSE9SVCAoT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgxLDQpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfUEwpOwotCQkJUFVUX0NIQVIgKChjaGFyKSh1bnNpZ25lZCBjaGFyKSBQc2VjdF9JbmRleCk7Ci0JCQlQVVRfTE9ORyAoT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgyLDEpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BCKTsKLQkJCVBVVF9TSE9SVCAoUHNlY3RfSW5kZXgpOwotCQkJUFVUX0NIQVIgKChjaGFyKSBPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIFN0YV9QKDIsMik6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9XUFcpOwotCQkJUFVUX1NIT1JUIChQc2VjdF9JbmRleCk7Ci0JCQlQVVRfU0hPUlQgKE9mZnNldCk7Ci0JCQlicmVhazsKLSAgICAgIGNhc2UgU3RhX1AoMiw0KToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1dQTCk7Ci0JCQlQVVRfU0hPUlQgKFBzZWN0X0luZGV4KTsKLQkJCVBVVF9MT05HIChPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgfQotI3VuZGVmIFN0YV9QCi19Ci0KLQotLyogU3RvcmUgaW1tZWRpYXRlIGRhdGEgaW4gY3VycmVudCBQc2VjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKQotICAgICBjb25zdCBjaGFyICpQb2ludGVyOwotICAgICBpbnQgU2l6ZTsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotICByZWdpc3RlciBpbnQgaTsKLQotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKiBXZSBjYW4gb25seSBzdG9yZSBhcyBtb3N0IDEyOCBieXRlcyBhdCBhIHRpbWUgZHVlIHRvIHRoZSB3YXkgdGhhdAotICAgICBUSVIgY29tbWFuZHMgYXJlIGVuY29kZWQuICAqLwotICB3aGlsZSAoU2l6ZSA+IDApCi0gICAgewotICAgICAgaSA9IChTaXplID4gMTI4KSA/IDEyOCA6IFNpemU7Ci0gICAgICBTaXplIC09IGk7Ci0gICAgICAvKiBJZiB3ZSBjYW5ub3QgYWNjb21tb2RhdGUgdGhpcyByZWNvcmQsIGZsdXNoIHRoZSBidWZmZXIuICAqLwotICAgICAgaWYgKChPYmplY3RfUmVjb3JkX09mZnNldCArIGkgKyAxKSA+PSBzaXplb2YgT2JqZWN0X1JlY29yZF9CdWZmZXIpCi0JRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotICAgICAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCByZWNvcmQgdHlwZS4gICovCi0gICAgICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLQlQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAgICAgLyogU3RvcmUgdGhlIGNvdW50LiAgVGhlIFN0b3JlIEltbWVkaWF0ZSBUSVIgY29tbWFuZCBpcyBpbXBsaWVkIGJ5Ci0gICAgICAgICBhIG5lZ2F0aXZlIGNvbW1hbmQgYnl0ZSwgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGltbWVkaWF0ZSBkYXRhCi0gICAgICAgICBpcyBhYnMoY29tbWFuZF9ieXRlKS4gIFNvLCB3ZSB3cml0ZSB0aGUgbmVnYXRlZCBsZW5ndGggdmFsdWUuICAqLwotICAgICAgUFVUX0NIQVIgKChjaGFyKSAoLWkgJiAweGZmKSk7Ci0gICAgICAvKiBOb3cgc3RvcmUgdGhlIGRhdGEuICAqLwotICAgICAgd2hpbGUgKC0taSA+PSAwKQotCVBVVF9DSEFSICgqUG9pbnRlcisrKTsKLSAgICB9Ci0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQotCi0vKiBNYWtlIGEgZGF0YSByZWZlcmVuY2UuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1NldF9EYXRhIChQc2VjdF9JbmRleCwgT2Zmc2V0LCBSZWNvcmRfVHlwZSwgRm9yY2UpCi0gICAgIGludCBQc2VjdF9JbmRleDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotICAgICBpbnQgRm9yY2U7Ci17Ci0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKLSAgLyogU3RhY2sgdGhlIFBzZWN0IGJhc2Ugd2l0aCBpdHMgb2Zmc2V0LiAgKi8KLSAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgRm9yY2UpOwotICAvKiBTZXQgcmVsb2NhdGlvbiBiYXNlLiAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1BJRFIpOwotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLQotLyogTWFrZSBhIGRlYnVnZ2VyIHJlZmVyZW5jZSB0byBhIHN0cnVjdCwgdW5pb24gb3IgZW51bS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfU3RvcmVfU3RydWN0IChTdHJ1Y3RfSW5kZXgpCi0gICAgIGludCBTdHJ1Y3RfSW5kZXg7Ci17Ci0gIC8qIFdlIGFyZSB3cml0aW5nIGEgZGVidWcgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfREJHKTsKLSAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgcmVjb3JkIHR5cGUuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfVVcpOwotICBQVVRfU0hPUlQgKFN0cnVjdF9JbmRleCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TVEtETCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19MKTsKLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi0KLS8qIE1ha2UgYSBkZWJ1Z2dlciByZWZlcmVuY2UgdG8gcGFydGlhbGx5IGRlZmluZSBhIHN0cnVjdCwgdW5pb24gb3IgZW51bS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfRGVmX1N0cnVjdCAoU3RydWN0X0luZGV4KQotICAgICBpbnQgU3RydWN0X0luZGV4OwotewotICAvKiBXZSBhcmUgd3JpdGluZyBhIGRlYnVnIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0RCRyk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKLSAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfREZMT0MpOwotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1WTVNfU2V0X1N0cnVjdCAoU3RydWN0X0luZGV4KQotICAgICBpbnQgU3RydWN0X0luZGV4OwotewkJCQkvKiBzZWUgcHJldmlvdXMgZnVuY3Rpb25zIGZvciBjb21tZW50cyAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19EQkcpOwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfVVcpOwotICBQVVRfU0hPUlQgKFN0cnVjdF9JbmRleCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TVExPQyk7Ci0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLSAvKioqKioqIFRyYWNlYmFjayBJbmZvcm1hdGlvbiByb3V0aW5lcyAqKioqKiovCi0KLQotLyogV3JpdGUgdGhlIFRyYWNlYmFjayBNb2R1bGUgQmVnaW4gcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfTW9kdWxlX0JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwLCAqY3AxOwotICBpbnQgU2l6ZTsKLSAgY2hhciBMb2NhbFsyNTZdOwotCi0gIC8qIEFycmFuZ2UgdG8gc3RvcmUgdGhlIGRhdGEgbG9jYWxseSAobGVhdmUgcm9vbSBmb3Igc2l6ZSBieXRlKS4gICovCi0gIGNwID0gJkxvY2FsWzFdOwotICAvKiBCZWdpbiBtb2R1bGUuICAqLwotICAqY3ArKyA9IERTVF9TX0NfTU9EQkVHOwotICAqY3ArKyA9IDA7CQkvKiBmbGFnczsgbm90IHVzZWQgKi8KLSAgLyoKLSAgICoJTGFuZ3VhZ2UgdHlwZSA9PSAiQyIKLSAgICoKLSAgICogKEZJWE1FOiAgdGhpcyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGlucHV0Li4uKQotICAgKi8KLSAgQ09QWV9MT05HIChjcCwgRFNUX1NfQ19DKTsKLSAgY3AgKz0gNDsKLSAgLyogU3RvcmUgdGhlIG1vZHVsZSBuYW1lLiAgKi8KLSAgKmNwKysgPSAoY2hhcikgc3RybGVuIChNb2R1bGVfTmFtZSk7Ci0gIGNwMSA9IE1vZHVsZV9OYW1lOwotICB3aGlsZSAoKmNwMSkKLSAgICAqY3ArKyA9ICpjcDErKzsKLSAgLyogTm93IHdlIGNhbiBzdG9yZSB0aGUgcmVjb3JkIHNpemUuICAqLwotICBTaXplID0gKGNwIC0gTG9jYWwpOwotICBMb2NhbFswXSA9IFNpemUgLSAxOwotICAvKiBQdXQgaXQgaW50byB0aGUgb2JqZWN0IHJlY29yZC4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSB0aGUgVHJhY2ViYWNrIE1vZHVsZSBFbmQgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfTW9kdWxlX0VuZCAoKQotewotICBjaGFyIExvY2FsWzJdOwotCi0gIC8qIEVuZCBtb2R1bGUuICAqLwotICBMb2NhbFswXSA9IDE7Ci0gIExvY2FsWzFdID0gRFNUX1NfQ19NT0RFTkQ7Ci0gIC8qIFB1dCBpdCBpbnRvIHRoZSBvYmplY3QgcmVjb3JkLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgMiwgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIFJvdXRpbmUgQmVnaW4gcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfUm91dGluZV9CZWdpbiAoc3ltYm9sUCwgUHNlY3QpCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIGludCBQc2VjdDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqY3AsICpjcDE7Ci0gIGNoYXIgKk5hbWU7Ci0gIGludCBPZmZzZXQ7Ci0gIGludCBTaXplOwotICBjaGFyIExvY2FsWzUxMl07Ci0KLSAgLyogU3RyaXAgdGhlIGxlYWRpbmcgIl8iIGZyb20gdGhlIG5hbWUuICAqLwotICBOYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gIGlmICgqTmFtZSA9PSAnXycpCi0gICAgTmFtZSsrOwotICAvKiBHZXQgdGhlIHRleHQgcHNlY3Qgb2Zmc2V0LiAgKi8KLSAgT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotICAvKiBTZXQgdGhlIHJlY29yZCBzaXplLiAgKi8KLSAgU2l6ZSA9IDEgKyAxICsgNCArIDEgKyBzdHJsZW4gKE5hbWUpOwotICBMb2NhbFswXSA9IFNpemU7Ci0gIC8qIERTVCB0eXBlICJyb3V0aW5lIGJlZ2luIi4gICovCi0gIExvY2FsWzFdID0gRFNUX1NfQ19SVE5CRUc7Ci0gIC8qIFVzZXMgQ2FsbFMvQ2FsbEcuICAqLwotICBMb2NhbFsyXSA9IDA7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHNvIGZhci4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfVEJUKTsKLSAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgT0JKX1NfQ19UQlQgcmVjb3JkLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfVEJUKTsKLSAgLyogU3RhY2sgdGhlIGFkZHJlc3MuICAqLwotICB2bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdCwgT2Zmc2V0LCAwKTsKLSAgLyogU3RvcmUgdGhlIGRhdGEgcmVmZXJlbmNlLiAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1BJRFIpOwotICAvKiBTdG9yZSB0aGUgY291bnRlZCBzdHJpbmcgYXMgZGF0YS4gICovCi0gIGNwID0gTG9jYWw7Ci0gIGNwMSA9IE5hbWU7Ci0gIFNpemUgPSBzdHJsZW4gKGNwMSkgKyAxOwotICAqY3ArKyA9IFNpemUgLSAxOwotICB3aGlsZSAoKmNwMSkKLSAgICAqY3ArKyA9ICpjcDErKzsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgU2l6ZSwgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIFJvdXRpbmUgRW5kIHJlY29yZC4KLQotICAgV2UgKm11c3QqIHNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG5leHQgcm91dGluZSwgc2luY2UgdGhlCi0gICBhc3NlbWJlciBoYXMgYSB3YXkgb2YgcmVhc3NlbWJsaW5nIHRoZSBzeW1ib2wgdGFibGUgT1VUIE9GIE9SREVSIFRodXMKLSAgIHRoZSBuZXh0IHJvdXRpbmUgaW4gdGhlIHN5bWJvbCBsaXN0IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgbmV4dCBvbmUgaW4KLSAgIG1lbW9yeS4gIEZvciBkZWJ1Z2dpbmcgdG8gd29yayBjb3JyZWN0bHkgd2UgbXVzdCBrbm93IHRoZSBzaXplIG9mIHRoZQotICAgcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX1JvdXRpbmVfRW5kIChNYXhfU2l6ZSwgc3ApCi0gICAgIGludCBNYXhfU2l6ZTsKLSAgICAgc3ltYm9sUyAqc3A7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBTaXplID0gMHg3ZmZmZmZmZjsKLSAgY2hhciBMb2NhbFsxNl07Ci0gIHZhbHVlVCBzeW1fdmFsdWUsIHNwX3ZhbHVlID0gU19HRVRfVkFMVUUgKHNwKTsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiBTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpCi0JewotCSAgaWYgKCpTX0dFVF9OQU1FIChzeW1ib2xQKSA9PSAnTCcpCi0JICAgIGNvbnRpbnVlOwotCSAgc3ltX3ZhbHVlID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgaWYgKHN5bV92YWx1ZSA+IHNwX3ZhbHVlICYmIHN5bV92YWx1ZSA8IFNpemUpCi0JICAgIFNpemUgPSBzeW1fdmFsdWU7Ci0KLQkgIC8qCi0JICAgKiBEdW1teSBsYWJlbHMgbGlrZSAiZ2NjX2NvbXBpbGVkLiIgc2hvdWxkIG5vIGxvbmdlciByZWFjaCBoZXJlLgotCSAgICovCi0jaWYgMAotCSAgZWxzZQotCSAgLyogY2hlY2sgaWYgZ2NjX2NvbXBpbGVkLiBoYXMgc2l6ZSBvZiB6ZXJvICovCi0JICBpZiAoc3ltX3ZhbHVlID09IHNwX3ZhbHVlICYmCi0JICAgICAgc3AgIT0gc3ltYm9sUCAmJgotCSAgICAgICghc3RyY21wIChTX0dFVF9OQU1FIChzcCksICJnY2NfY29tcGlsZWQuIikgfHwKLQkgICAgICAgIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ApLCAiZ2NjMl9jb21waWxlZC4iKSkpCi0JICAgIFNpemUgPSBzeW1fdmFsdWU7Ci0jZW5kaWYKLQl9Ci0gICAgfQotICBpZiAoU2l6ZSA9PSAweDdmZmZmZmZmKQotICAgIFNpemUgPSBNYXhfU2l6ZTsKLSAgU2l6ZSAtPSBzcF92YWx1ZTsJCS8qIGFuZCBnZXQgdGhlIHNpemUgb2YgdGhlIHJvdXRpbmUgKi8KLSAgLyogUmVjb3JkIFNpemUuICAqLwotICBMb2NhbFswXSA9IDY7Ci0gIC8qIERTVCB0eXBlIGlzICJyb3V0aW5lIGVuZCIuICAqLwotICBMb2NhbFsxXSA9IERTVF9TX0NfUlRORU5EOwotICBMb2NhbFsyXSA9IDA7CQkvKiB1bnVzZWQgKi8KLSAgLyogU2l6ZSBvZiByb3V0aW5lLiAgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbM10sIFNpemUpOwotICAvKiBTdG9yZSB0aGUgcmVjb3JkLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIEJsb2NrIEJlZ2luIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX0Jsb2NrX0JlZ2luIChzeW1ib2xQLCBQc2VjdCwgTmFtZSkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgICAgaW50IFBzZWN0OwotICAgICBjaGFyICpOYW1lOwotewotICByZWdpc3RlciBjaGFyICpjcCwgKmNwMTsKLSAgaW50IE9mZnNldDsKLSAgaW50IFNpemU7Ci0gIGNoYXIgTG9jYWxbNTEyXTsKLQotICAvKiBTZXQgdGhlIHJlY29yZCBzaXplLiAgKi8KLSAgU2l6ZSA9IDEgKyAxICsgNCArIDEgKyBzdHJsZW4gKE5hbWUpOwotICBMb2NhbFswXSA9IFNpemU7Ci0gIC8qIERTVCB0eXBlIGlzICJiZWdpbiBibG9jayI7IHdlIHNpbXVsYXRlIHdpdGggYSBwaG9ueSByb3V0aW5lLiAgKi8KLSAgTG9jYWxbMV0gPSBEU1RfU19DX0JMS0JFRzsKLSAgLyogVXNlcyBDYWxsUy9DYWxsRy4gICovCi0gIExvY2FsWzJdID0gMDsKLSAgLyogU3RvcmUgdGhlIGRhdGEgc28gZmFyLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgMywgT0JKX1NfQ19EQkcpOwotICAvKiBNYWtlIHN1cmUgd2UgYXJlIHN0aWxsIGdlbmVyYXRpbmcgYSBkZWJ1ZyByZWNvcmQuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICAvKiBOb3cgZ2V0IHRoZSBzeW1ib2wgYWRkcmVzcy4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUQV9XUEwpOwotICBQVVRfU0hPUlQgKFBzZWN0KTsKLSAgLyogR2V0IHRoZSB0ZXh0IHBzZWN0IG9mZnNldC4gICovCi0gIE9mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSAgUFVUX0xPTkcgKE9mZnNldCk7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHJlZmVyZW5jZS4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgLyogU3RvcmUgdGhlIGNvdW50ZWQgc3RyaW5nIGFzIGRhdGEuICAqLwotICBjcCA9IExvY2FsOwotICBjcDEgPSBOYW1lOwotICBTaXplID0gc3RybGVuIChjcDEpICsgMTsKLSAgKmNwKysgPSBTaXplIC0gMTsKLSAgd2hpbGUgKCpjcDEpCi0gICAgKmNwKysgPSAqY3AxKys7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfREJHKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBCbG9jayBFbmQgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfQmxvY2tfRW5kIChTaXplKQotICAgICB2YWx1ZVQgU2l6ZTsKLXsKLSAgY2hhciBMb2NhbFsxNl07Ci0KLSAgTG9jYWxbMF0gPSA2OwkJLyogcmVjb3JkIGxlbmd0aCAqLwotICAvKiBEU1QgdHlwZSBpcyAiYmxvY2sgZW5kIjsgc2ltdWxhdGUgd2l0aCBhIHBob255IGVuZCByb3V0aW5lLiAgKi8KLSAgTG9jYWxbMV0gPSBEU1RfU19DX0JMS0VORDsKLSAgTG9jYWxbMl0gPSAwOwkJLyogdW51c2VkLCBtdXN0IGJlIHplcm8gKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbM10sIFNpemUpOwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCA3LCBPQkpfU19DX0RCRyk7Ci19Ci0MCi0KLS8qIFdyaXRlIGEgTGluZSBudW1iZXIgPC0+IFByb2dyYW0gQ291bnRlciBjb3JyZWxhdGlvbiByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChMaW5lX051bWJlciwgT2Zmc2V0LCBQc2VjdCwgRG9fRGVsdGEpCi0gICAgIGludCBMaW5lX051bWJlcjsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IFBzZWN0OwotICAgICBpbnQgRG9fRGVsdGE7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwOwotICBjaGFyIExvY2FsWzY0XTsKLQotICBpZiAoRG9fRGVsdGEgPT0gMCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogIElmIG5vdCBkZWx0YSwgc2V0IG91ciBQQy9MaW5lIG51bWJlciBjb3JyZWxhdGlvbi4KLSAgICAgICAqLwotICAgICAgY3AgPSAmTG9jYWxbMV07CS8qIFB1dCBzaXplIGluIExvY2FsWzBdIGxhdGVyLiAgKi8KLSAgICAgIC8qIERTVCB0eXBlIGlzICJMaW5lIE51bWJlci9QQyBjb3JyZWxhdGlvbiIuICAqLwotICAgICAgKmNwKysgPSBEU1RfU19DX0xJTkVfTlVNOwotICAgICAgLyogU2V0IExpbmUgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChMaW5lX051bWJlciAtIDEgPD0gMjU1KQotCXsKLQkgICpjcCsrID0gRFNUX1NfQ19TRVRfTElOVU1fQjsKLQkgICpjcCsrID0gKGNoYXIpIChMaW5lX051bWJlciAtIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKExpbmVfTnVtYmVyIC0gMSA8PSA2NTUzNSkKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTkVfTlVNOwotCSAgQ09QWV9TSE9SVCAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTlVNX0w7Ci0JICBDT1BZX0xPTkcgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gNDsKLQl9Ci0gICAgICAvKiBTZXQgUEMuICAqLwotICAgICAgKmNwKysgPSBEU1RfU19DX1NFVF9BQlNfUEM7Ci0gICAgICAvKiBTdG9yZSBzaXplIG5vdyB0aGF0IHdlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgICAgIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07Ci0JLyogQWNjb3VudCBmb3IgdGhlIHNwYWNlIHRoYXQgVElSX1NfQ19TVE9fUElEUiB3aWxsIHVzZSBmb3IgdGhlIFBDLiAgKi8KLQlMb2NhbFswXSArPSA0OwkJLyogc2l6ZSBpbmNsdWRlcyBsZW5ndGggb2YgYW5vdGhlciBsb25nd29yZCAqLwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotICAgICAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgT0JKX1NfQ19UQlQgcmVjb3JkLiAgKi8KLSAgICAgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotCVBVVF9DSEFSIChPQkpfU19DX1RCVCk7Ci0gICAgICB2bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdCwgT2Zmc2V0LCAwKTsKLSAgICAgIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgICAgIC8qIERvIGEgUEMgb2Zmc2V0IG9mIDAgdG8gcmVnaXN0ZXIgdGhlIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIExvY2FsWzBdID0gMjsKLSAgICAgIExvY2FsWzFdID0gRFNUX1NfQ19MSU5FX05VTTsKLSAgICAgIExvY2FsWzJdID0gMDsJCS8qIEluY3JlbWVudCBQQyBieSAwIGFuZCByZWdpc3RlciBsaW5lICMgKi8KLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfVEJUKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoRG9fRGVsdGEgPCAwKQotCXsKLQkgIC8qCi0JICAgKiAgV2hlbiBkZWx0YSBpcyBuZWdhdGl2ZSwgdGVybWluYXRlIHRoZSBsaW5lIG51bWJlcnMuCi0JICAgKi8KLQkgIExvY2FsWzBdID0gMSArIDEgKyA0OwotCSAgTG9jYWxbMV0gPSBEU1RfU19DX0xJTkVfTlVNOwotCSAgTG9jYWxbMl0gPSBEU1RfU19DX1RFUk1fTDsKLQkgIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBPZmZzZXQpOwotCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19UQlQpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIC8qCi0gICAgICAgKiAgRG8gYSBQQy9MaW5lIGRlbHRhLgotICAgICAgICovCi0gICAgICBjcCA9ICZMb2NhbFsxXTsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19MSU5FX05VTTsKLSAgICAgIGlmIChMaW5lX051bWJlciA+IDEpCi0JewotCSAgLyogV2UgbmVlZCB0byBpbmNyZW1lbnQgdGhlIGxpbmUgbnVtYmVyLiAgKi8KLQkgIGlmIChMaW5lX051bWJlciAtIDEgPD0gMjU1KQotCSAgICB7Ci0JICAgICAgKmNwKysgPSBEU1RfU19DX0lOQ1JfTElOVU07Ci0JICAgICAgKmNwKysgPSBMaW5lX051bWJlciAtIDE7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKExpbmVfTnVtYmVyIC0gMSA8PSA2NTUzNSkKLQkgICAgewotCSAgICAgICpjcCsrID0gRFNUX1NfQ19JTkNSX0xJTlVNX1c7Ci0JICAgICAgQ09QWV9TSE9SVCAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqY3ArKyA9IERTVF9TX0NfSU5DUl9MSU5VTV9MOwotCSAgICAgIENPUFlfTE9ORyAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSA0OwotCSAgICB9Ci0JfQotICAgICAgLyoKLSAgICAgICAqCUluY3JlbWVudCB0aGUgUEMKLSAgICAgICAqLwotICAgICAgaWYgKE9mZnNldCA8PSAxMjgpCi0JewotCSAgLyogU21hbGwgb2Zmc2V0cyBhcmUgZW5jb2RlZCBhcyBuZWdhdGl2ZSBudW1iZXJzLCByYXRoZXIgdGhhbiB0aGUKLQkgICAgIHVzdWFsIG5vbi1uZWdhdGl2ZSB0eXBlIGNvZGUgZm9sbG93ZWQgYnkgYW5vdGhlciBkYXRhIGZpZWxkLiAgKi8KLQkgICpjcCsrID0gKGNoYXIpIC1PZmZzZXQ7Ci0JfQotICAgICAgZWxzZSBpZiAoT2Zmc2V0IDw9IDY1NTM1KQotCXsKLQkgICpjcCsrID0gRFNUX1NfQ19ERUxUQV9QQ19XOwotCSAgQ09QWV9TSE9SVCAoY3AsIE9mZnNldCksICBjcCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfREVMVEFfUENfTDsKLQkgIENPUFlfTE9ORyAoY3AsIE9mZnNldCksICBjcCArPSA0OwotCX0KLSAgICAgIC8qIFNldCBzaXplIG5vdyB0aGF0IGJlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgICAgIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBjcCAtIExvY2FsLCBPQkpfU19DX1RCVCk7Ci0gICAgfQotfQotDAotCi0vKiBEZXNjcmliZSBhIHNvdXJjZSBmaWxlIHRvIHRoZSBkZWJ1Z2dlci4gICovCi0KLXN0YXRpYyBpbnQKLVZNU19UQlRfU291cmNlX0ZpbGUgKEZpbGVuYW1lLCBJRF9OdW1iZXIpCi0gICAgIGNoYXIgKkZpbGVuYW1lOwotICAgICBpbnQgSURfTnVtYmVyOwotewotICByZWdpc3RlciBjaGFyICpjcDsKLSAgaW50IGxlbiwgcmZvLCBmZmIsIGViazsKLSAgY2hhciBjZHRbOF07Ci0gIGNoYXIgTG9jYWxbNTEyXTsKLSNpZmRlZiBWTVMJCQkvKiBVc2VkIGZvciBuYXRpdmUgYXNzZW1ibHkgKi8KLSAgdW5zaWduZWQgU3RhdHVzOwotICBzdHJ1Y3QgRkFCIGZhYjsJCQkvKiBSTVMgZmlsZSBhY2Nlc3MgYmxvY2sgKi8KLSAgc3RydWN0IE5BTSBuYW07CQkJLyogZmlsZSBuYW1lIGluZm9ybWF0aW9uICovCi0gIHN0cnVjdCBYQUJEQVQgeGFiZGF0OwkJCS8qIGRhdGUrdGltZSBmaWVsZHMgKi8KLSAgc3RydWN0IFhBQkZIQyB4YWJmaGM7CQkJLyogZmlsZSBoZWFkZXIgY2hhcmFjdGVyaXN0aWNzICovCi0gIGNoYXIgcmVzdWx0YW50X3N0cmluZ19idWZmZXJbMjU1ICsgMV07Ci0KLSAgLyoKLSAgICoJU2V0IHVwIFJNUyBzdHJ1Y3R1cmVzOgotICAgKi8KLSAgLyogRkFCIC0tIGZpbGUgYWNjZXNzIGJsb2NrICovCi0gIG1lbXNldCAoKGNoYXIgKikgJmZhYiwgMCwgc2l6ZW9mIGZhYik7Ci0gIGZhYi5mYWIkYl9iaWQgPSBGQUIkQ19CSUQ7Ci0gIGZhYi5mYWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIGZhYjsKLSAgZmFiLmZhYiRsX2ZuYSA9IEZpbGVuYW1lOwotICBmYWIuZmFiJGJfZm5zID0gKHVuc2lnbmVkIGNoYXIpIHN0cmxlbiAoRmlsZW5hbWUpOwotICBmYWIuZmFiJGxfbmFtID0gKGNoYXIgKikgJm5hbTsKLSAgZmFiLmZhYiRsX3hhYiA9IChjaGFyICopICZ4YWJkYXQ7Ci0gIC8qIE5BTSAtLSBmaWxlIG5hbWUgYmxvY2sgKi8KLSAgbWVtc2V0ICgoY2hhciAqKSAmbmFtLCAwLCBzaXplb2YgbmFtKTsKLSAgbmFtLm5hbSRiX2JpZCA9IE5BTSRDX0JJRDsKLSAgbmFtLm5hbSRiX2JsbiA9ICh1bnNpZ25lZCBjaGFyKSBzaXplb2YgbmFtOwotICBuYW0ubmFtJGxfcnNhID0gcmVzdWx0YW50X3N0cmluZ19idWZmZXI7Ci0gIG5hbS5uYW0kYl9yc3MgPSAodW5zaWduZWQgY2hhcikgKHNpemVvZiByZXN1bHRhbnRfc3RyaW5nX2J1ZmZlciAtIDEpOwotICAvKiBYQUJzIC0tIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYmxvY2tzICovCi0gIG1lbXNldCAoKGNoYXIgKikgJnhhYmRhdCwgMCwgc2l6ZW9mIHhhYmRhdCk7Ci0gIHhhYmRhdC54YWIkYl9jb2QgPSBYQUIkQ19EQVQ7Ci0gIHhhYmRhdC54YWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIHhhYmRhdDsKLSAgeGFiZGF0LnhhYiRsX254dCA9IChjaGFyICopICZ4YWJmaGM7Ci0gIG1lbXNldCAoKGNoYXIgKikgJnhhYmZoYywgMCwgc2l6ZW9mIHhhYmZoYyk7Ci0gIHhhYmZoYy54YWIkYl9jb2QgPSBYQUIkQ19GSEM7Ci0gIHhhYmZoYy54YWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIHhhYmZoYzsKLSAgeGFiZmhjLnhhYiRsX254dCA9IDA7Ci0gIC8qCi0gICAqCUdldCB0aGUgZmlsZSBpbmZvcm1hdGlvbgotICAgKi8KLSAgU3RhdHVzID0gc3lzJG9wZW4gKCZmYWIpOwotICBpZiAoIShTdGF0dXMgJiAxKSkKLSAgICB7Ci0gICAgICBhc190c2t0c2sgKF8oIkNvdWxkbid0IGZpbmQgc291cmNlIGZpbGUgXCIlc1wiLCBzdGF0dXM9JSVYJXgiKSwKLQkJIEZpbGVuYW1lLCBTdGF0dXMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBzeXMkY2xvc2UgKCZmYWIpOwotICAvKiBOb3cgZXh0cmFjdCBmaWVsZHMgb2YgaW50ZXJlc3QuICAqLwotICBtZW1jcHkgKGNkdCwgKGNoYXIgKikgJnhhYmRhdC54YWIkcV9jZHQsIDgpOwkvKiBjcmVhdGlvbiBkYXRlICovCi0gIGViayA9IHhhYmZoYy54YWIkbF9lYms7CQkvKiBlbmQtb2YtZmlsZSBibG9jayAqLwotICBmZmIgPSB4YWJmaGMueGFiJHdfZmZiOwkJLyogZmlyc3QgZnJlZSBieXRlIG9mIGxhc3QgYmxvY2sgKi8KLSAgcmZvID0geGFiZmhjLnhhYiRiX3JmbzsJCS8qIHJlY29yZCBmb3JtYXQgKi8KLSAgbGVuID0gbmFtLm5hbSRiX3JzbDsJCQkvKiBsZW5ndGggb2YgRmlsZW5hbWUgKi8KLSAgcmVzdWx0YW50X3N0cmluZ19idWZmZXJbbGVuXSA9ICdcMCc7Ci0gIEZpbGVuYW1lID0gcmVzdWx0YW50X3N0cmluZ19idWZmZXI7CS8qIGZ1bGwgZmlsZW5hbWUgKi8KLSNlbHNlCQkJCS8qIENyb3NzLWFzc2VtYmx5ICovCi0gIC8qIFtQZXJoYXBzIHdlIG91Z2h0IHRvIHVzZSBhY3R1YWwgdmFsdWVzIGRlcml2ZWQgZnJvbSBzdGF0KCkgaGVyZT9dICAqLwotICBtZW1zZXQgKGNkdCwgMCwgOCk7CQkJLyogbnVsbCBWTVMgcXVhZHdvcmQgYmluYXJ5IHRpbWUgKi8KLSAgZWJrID0gZmZiID0gcmZvID0gMDsKLSAgbGVuID0gc3RybGVuIChGaWxlbmFtZSk7Ci0gIGlmIChsZW4gPiAyNTUpCS8qIGEgc2luZ2xlIGJ5dGUgaXMgdXNlZCBhcyBjb3VudCBwcmVmaXggKi8KLSAgICB7Ci0gICAgICBGaWxlbmFtZSArPSAobGVuIC0gMjU1KTsJCS8qIHRhaWwgZW5kIGlzIG1vcmUgc2lnbmlmaWNhbnQgKi8KLSAgICAgIGxlbiA9IDI1NTsKLSAgICB9Ci0jZW5kaWYgLyogVk1TICovCi0KLSAgY3AgPSAmTG9jYWxbMV07CQkJLyogZmlsbCBpbiByZWNvcmQgbGVuZ3RoIGxhdGVyICovCi0gICpjcCsrID0gRFNUX1NfQ19TT1VSQ0U7CQkvKiBEU1QgdHlwZSBpcyAic291cmNlIGZpbGUiICovCi0gICpjcCsrID0gRFNUX1NfQ19TUkNfRk9STUZFRUQ7CQkvKiBmb3JtZmVlZHMgY291bnQgYXMgc291cmNlIHJlY29yZHMgKi8KLSAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUNMRklMRTsJCS8qIGRlY2xhcmUgc291cmNlIGZpbGUgKi8KLSAga25vdyAoY3AgPT0gJkxvY2FsWzRdKTsKLSAgKmNwKysgPSAwOwkJCQkvKiBmaWxsIGluIHRoaXMgbGVuZ3RoIGJlbG93ICovCi0gICpjcCsrID0gMDsJCQkJLyogZmxhZ3M7IG11c3QgYmUgemVybyAqLwotICBDT1BZX1NIT1JUIChjcCwgSURfTnVtYmVyKSwgIGNwICs9IDI7CS8qIGZpbGUgSUQgbnVtYmVyICovCi0gIG1lbWNweSAoY3AsIGNkdCwgOCksICBjcCArPSA4OwkvKiBjcmVhdGlvbiBkYXRlK3RpbWUgKi8KLSAgQ09QWV9MT05HIChjcCwgZWJrKSwgIGNwICs9IDQ7CS8qIGVuZC1vZi1maWxlIGJsb2NrICovCi0gIENPUFlfU0hPUlQgKGNwLCBmZmIpLCAgY3AgKz0gMjsJLyogZmlyc3QgZnJlZSBieXRlIG9mIGxhc3QgYmxvY2sgKi8KLSAgKmNwKysgPSAoY2hhcikgcmZvOwkJCS8qIFJNUyByZWNvcmQgZm9ybWF0ICovCi0gIC8qIEZpbGVuYW1lLiAgKi8KLSAgKmNwKysgPSAoY2hhcikgbGVuOwotICB3aGlsZSAoLS1sZW4gPj0gMCkKLSAgICAqY3ArKyA9ICpGaWxlbmFtZSsrOwotICAvKiBMaWJyYXJ5IG1vZHVsZSBuYW1lIChub25lKS4gICovCi0gICpjcCsrID0gMDsKLSAgLyogTm93IHRoYXQgc2l6ZSBpcyBrbm93biwgZmlsbCBpdCBpbiBhbmQgd3JpdGUgb3V0IHRoZSByZWNvcmQuICAqLwotICBMb2NhbFs0XSA9IGNwIC0gJkxvY2FsWzVdOwkJLyogc291cmNlIGZpbGUgZGVjbGFyYXRpb24gc2l6ZSAqLyAKLSAgTG9jYWxbMF0gPSBjcCAtICZMb2NhbFsxXTsJCS8qIFRCVCByZWNvcmQgc2l6ZSAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBjcCAtIExvY2FsLCBPQkpfU19DX1RCVCk7Ci0gIHJldHVybiAxOwotfQotCi0KLS8qIFRyYWNlYmFjayBpbmZvcm1hdGlvbiBpcyBkZXNjcmliZWQgaW4gdGVybXMgb2YgbGluZXMgZnJvbSBjb21waWxlcgotICAgbGlzdGluZyBmaWxlcywgbm90IGxpbmVzIGZyb20gc291cmNlIGZpbGVzLiAgV2UgbmVlZCB0byBzZXQgdXAgdGhlCi0gICBjb3JyZWxhdGlvbiBiZXR3ZWVuIGxpc3RpbmcgbGluZSBudW1iZXJzIGFuZCBzb3VyY2UgbGluZSBudW1iZXJzLgotICAgU2luY2UgZ2NjJ3MgLnN0YWJuIGRpcmVjdGl2ZXMgcmVmZXIgdG8gdGhlIHNvdXJjZSBsaW5lcywgd2UganVzdAotICAgbmVlZCB0byBkZXNjcmliZSBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9Tb3VyY2VfTGluZXMgKElEX051bWJlciwgU3RhcnRpbmdfTGluZV9OdW1iZXIsIE51bWJlcl9PZl9MaW5lcykKLSAgICAgaW50IElEX051bWJlcjsKLSAgICAgaW50IFN0YXJ0aW5nX0xpbmVfTnVtYmVyOwotICAgICBpbnQgTnVtYmVyX09mX0xpbmVzOwotewotICBjaGFyICpjcDsKLSAgaW50IGNodW5rX2xpbWl0OwotICBjaGFyIExvY2FsWzEyOF07CS8qIHJvb20gZW5vdWdoIHRvIGRlc2NyaWJlIDEzMTA3MDAgbGluZXMuLi4gKi8KLQotICBjcCA9ICZMb2NhbFsxXTsJLyogUHV0IHNpemUgaW4gTG9jYWxbMF0gbGF0ZXIuICAqLwotICAqY3ArKyA9IERTVF9TX0NfU09VUkNFOwkJLyogRFNUIHR5cGUgaXMgInNvdXJjZSBmaWxlIi4gICovCi0gICpjcCsrID0gRFNUX1NfQ19TUkNfU0VURklMRTsJCS8qIFNldCBTb3VyY2UgRmlsZS4gICovCi0gIENPUFlfU0hPUlQgKGNwLCBJRF9OdW1iZXIpLCAgY3AgKz0gMjsJLyogRmlsZSBJRCBOdW1iZXIuICAqLwotICAvKiBTZXQgcmVjb3JkIG51bWJlciBhbmQgZGVmaW5lIGxpbmVzLiAgU2luY2Ugbm8gbG9uZ3dvcmQgZm9ybSBvZgotICAgICBTUkNfREVGTElORVMgaXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY29wZSB3aXRoIGFueSBodWdlCi0gICAgIGZpbGVzIGEgY2h1bmsgYXQgYSB0aW1lLiAgSXQgZG9lc24ndCBtYXR0ZXIgZm9yIHRyYWNlYmFja3MsIHNpbmNlCi0gICAgIHVuc3BlY2lmaWVkIGxpbmVzIGFyZSBtYXBwZWQgb25lLXRvLW9uZSBhbmQgd29yayBvdXQgcmlnaHQsIGJ1dCBpdAotICAgICBkb2VzIG1hdHRlciB3aXRoaW4gdGhlIGRlYnVnZ2VyLiAgV2l0aG91dCB0aGlzIGV4cGxpY2l0IG1hcHBpbmcsCi0gICAgIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgbGluZXMgbm90IGV4aXN0aW5nIGluIHRoZSBtb2R1bGUuICAqLwotICBjaHVua19saW1pdCA9IChzaXplb2YgTG9jYWwgLSA1KSAvIDY7Ci0gIGlmIChOdW1iZXJfT2ZfTGluZXMgPiA2NTUzNSAqIGNodW5rX2xpbWl0KQkvKiBhdm9pZCBidWZmZXIgb3ZlcmZsb3cgKi8KLSAgICBOdW1iZXJfT2ZfTGluZXMgPSA2NTUzNSAqIGNodW5rX2xpbWl0OwotICB3aGlsZSAoTnVtYmVyX09mX0xpbmVzID4gNjU1MzUpCi0gICAgewotICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19TRVRSRUNfTDsKLSAgICAgIENPUFlfTE9ORyAoY3AsIFN0YXJ0aW5nX0xpbmVfTnVtYmVyKSwgIGNwICs9IDQ7Ci0gICAgICAqY3ArKyA9IERTVF9TX0NfU1JDX0RFRkxJTkVTX1c7Ci0gICAgICBDT1BZX1NIT1JUIChjcCwgNjU1MzUpLCAgY3AgKz0gMjsKLSAgICAgIFN0YXJ0aW5nX0xpbmVfTnVtYmVyICs9IDY1NTM1OwotICAgICAgTnVtYmVyX09mX0xpbmVzIC09IDY1NTM1OwotICAgIH0KLSAgLyogU2V0IHJlY29yZCBudW1iZXIgYW5kIGRlZmluZSBsaW5lcywgbm9ybWFsIGNhc2UuICAqLwotICBpZiAoU3RhcnRpbmdfTGluZV9OdW1iZXIgPD0gNjU1MzUpCi0gICAgewotICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19TRVRSRUNfVzsKLSAgICAgIENPUFlfU0hPUlQgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX0w7Ci0gICAgICBDT1BZX0xPTkcgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSA0OwotICAgIH0KLSAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUZMSU5FU19XOwotICBDT1BZX1NIT1JUIChjcCwgTnVtYmVyX09mX0xpbmVzKSwgIGNwICs9IDI7Ci0gIC8qIFNldCBzaXplIG5vdyB0aGF0IGJlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgTG9jYWxbMF0gPSBjcCAtICZMb2NhbFsxXTsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotfQotDAotCi0gLyoqKioqKiBEZWJ1Z2dlciBJbmZvcm1hdGlvbiBzdXBwb3J0IHJvdXRpbmVzICoqKioqKi8KLQotCi0vKiBUaGlzIHJvdXRpbmUgbG9jYXRlcyBhIGZpbGUgaW4gdGhlIGxpc3Qgb2YgZmlsZXMuICBJZiBhbiBlbnRyeSBkb2VzCi0gICBub3QgZXhpc3QsIG9uZSBpcyBjcmVhdGVkLiAgRm9yIGluY2x1ZGUgZmlsZXMsIGEgbmV3IGVudHJ5IGlzIGFsd2F5cwotICAgY3JlYXRlZCBzdWNoIHRoYXQgaW5saW5lIGZ1bmN0aW9ucyBjYW4gYmUgcHJvcGVybHkgZGVidWdnZWQuICAqLwotCi1zdGF0aWMgc3RydWN0IGlucHV0X2ZpbGUgKgotZmluZF9maWxlIChzcCkKLSAgICAgc3ltYm9sUyAqc3A7Ci17Ci0gIHN0cnVjdCBpbnB1dF9maWxlICpzYW1lX2ZpbGUgPSAwOwotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqZnBudCwgKmxhc3QgPSAwOwotICBjaGFyICpzcF9uYW1lOwotCi0gIGZvciAoZnBudCA9IGZpbGVfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGZwbnQtPnNwbnQgPT0gc3ApCi0JcmV0dXJuIGZwbnQ7Ci0gICAgICBsYXN0ID0gZnBudDsKLSAgICB9Ci0gIHNwX25hbWUgPSBTX0dFVF9OQU1FIChzcCk7Ci0gIGZvciAoZnBudCA9IGZpbGVfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoc3BfbmFtZSwgZnBudC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoZnBudC0+ZmxhZyA9PSAxKQotCSAgICByZXR1cm4gZnBudDsKLQkgIHNhbWVfZmlsZSA9IGZwbnQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBmcG50ID0gKHN0cnVjdCBpbnB1dF9maWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGlucHV0X2ZpbGUpKTsKLSAgaWYgKCFmaWxlX3Jvb3QpCi0gICAgZmlsZV9yb290ID0gZnBudDsKLSAgZWxzZQotICAgIGxhc3QtPm5leHQgPSBmcG50OwotICBmcG50LT5uZXh0ID0gMDsKLSAgZnBudC0+bmFtZSA9IHNwX25hbWU7Ci0gIGZwbnQtPm1pbl9saW5lID0gMHg3ZmZmZmZmZjsKLSAgZnBudC0+bWF4X2xpbmUgPSAwOwotICBmcG50LT5vZmZzZXQgPSAwOwotICBmcG50LT5mbGFnID0gMDsKLSAgZnBudC0+ZmlsZV9udW1iZXIgPSAwOwotICBmcG50LT5zcG50ID0gc3A7Ci0gIGZwbnQtPnNhbWVfZmlsZV9mcG50ID0gc2FtZV9maWxlOwotICByZXR1cm4gZnBudDsKLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgY29udmVydHMgYSBudW1iZXIgc3RyaW5nIGludG8gYW4gaW50ZWdlciwgYW5kIHN0b3BzIHdoZW4KLSAgIGl0IHNlZXMgYW4gaW52YWxpZCBjaGFyYWN0ZXIuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgY2hhcmFjdGVyIGp1c3QgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgcmVhZC4gIE5vIGVycm9yIGlzIGdlbmVyYXRlZC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWN2dF9pbnRlZ2VyIChzdHIsIHJ0bikKLSAgICAgY2hhciAqc3RyOwotICAgICBpbnQgKnJ0bjsKLXsKLSAgaW50IGl2YWwgPSAwLCBzZ24gPSAxOwotCi0gIGlmICgqc3RyID09ICctJykKLSAgICBzZ24gPSAtMSwgICsrc3RyOwotICB3aGlsZSAoKnN0ciA+PSAnMCcgJiYgKnN0ciA8PSAnOScpCi0gICAgaXZhbCA9IDEwICogaXZhbCArICpzdHIrKyAtICcwJzsKLSAgKnJ0biA9IHNnbiAqIGl2YWw7Ci0gIHJldHVybiBzdHI7Ci19Ci0MCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgb2JqZWN0Ci0gKiByZWNvcmRzIHRoYXQgd2lsbCBkZXNjcmliZSBwcm9ncmFtIHZhcmlhYmxlcyB0byB0aGUgVk1TIGRlYnVnZ2VyLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBtYW55IG9mIHRoZSByb3V0aW5lcyBuZWVkZWQgdG8gb3V0cHV0IGRlYnVnZ2luZyBpbmZvCi0gKiBpbnRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IHRoZSBWTVMgZGVidWdnZXIgbmVlZHMgdG8gdW5kZXJzdGFuZCBzeW1ib2xzLgotICogVGhlc2Ugcm91dGluZXMgYXJlIGNhbGxlZCB2ZXJ5IGxhdGUgaW4gdGhlIGFzc2VtYmx5IHByb2Nlc3MsIGFuZCB0aHVzCi0gKiB3ZSBjYW4gYmUgZmFpcmx5IGxheCBhYm91dCBjaGFuZ2luZyB0aGluZ3MsIHNpbmNlIHRoZSBHU0QgYW5kIHRoZSBUSVIKLSAqIHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuIG91dHB1dC4KLSAqLwotCi0KLS8qIFRoaXMgcm91dGluZSBmaXhlcyB0aGUgbmFtZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IEMrKywgIi50aGlzIiBpcyBhIGdvb2QKLSAgIGV4YW1wbGUuICBUaGUgcGVyaW9kIGRvZXMgbm90IHdvcmsgZm9yIHRoZSBkZWJ1Z2dlciwgc2luY2UgaXQgbG9va3MgbGlrZQotICAgdGhlIHN5bnRheCBmb3IgYSBzdHJ1Y3R1cmUgZWxlbWVudCwgYW5kIHRodXMgaXQgZ2V0cyBtaWdodGlseSBjb25mdXNlZC4KLQotICAgV2UgYWxzbyB1c2UgdGhpcyB0byBzdHJpcCB0aGUgUHNlY3RBdHRyaWJ1dGUgaGFjayBmcm9tIHRoZSBuYW1lIGJlZm9yZSB3ZQotICAgd3JpdGUgYSBkZWJ1Z2dlciByZWNvcmQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1maXhfbmFtZSAocG50KQotICAgICBjaGFyICpwbnQ7Ci17Ci0gIGNoYXIgKnBudDE7Ci0KLSAgLyogS2lsbCBhbnkgbGVhZGluZyAiXyIuICAqLwotICBpZiAoKnBudCA9PSAnXycpCi0gICAgcG50Kys7Ci0KLSAgLyogSXMgdGhlcmUgYSBQc2VjdCBBdHRyaWJ1dGUgdG8gc2tpcD8/ICAqLwotICBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKHBudCkpCi0gICAgewotICAgICAgLyogWWVzOiBTa2lwIGl0LiAgKi8KLSAgICAgIHBudCArPSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEg7Ci0gICAgICB3aGlsZSAoKnBudCkKLQl7Ci0JICBpZiAoKHBudFswXSA9PSAnJCcpICYmIChwbnRbMV0gPT0gJyQnKSkKLQkgICAgewotCSAgICAgIHBudCArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBwbnQrKzsKLQl9Ci0gICAgfQotCi0gIC8qIEhlcmUgd2UgZml4IHRoZSAudGhpcyAtPiAkdGhpcyBjb252ZXJzaW9uLiAgKi8KLSAgZm9yIChwbnQxID0gcG50OyAqcG50MSAhPSAwOyBwbnQxKyspCi0gICAgaWYgKCpwbnQxID09ICcuJykKLSAgICAgICpwbnQxID0gJyQnOwotCi0gIHJldHVybiBwbnQ7Ci19Ci0KLQotLyogV2hlbiBkZWZpbmluZyBhIHN0cnVjdHVyZSwgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBmaW5kIHRoZSBuYW1lIG9mCi0gICB0aGUgYWN0dWFsIHN0cnVjdHVyZS4gIEl0IGlzIGFzc3VtZWQgdGhhdCBzdHIgcG9pbnRzIHRvIHRoZSBlcXVhbCBzaWduCi0gICBpbiB0aGUgZGVmaW5pdGlvbiwgYW5kIGl0IG1vdmVzIGJhY2t3YXJkIHVudGlsIGl0IGZpbmRzIHRoZSBzdGFydCBvZiB0aGUKLSAgIG5hbWUuICBJZiBpdCBmaW5kcyBhIDAsIHRoZW4gaXQga25vd3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBkZWYgaXMgaW4gdGhlCi0gICBvdXRlcm1vc3QgbGV2ZWwsIGFuZCB0aHVzIHN5bWJvbF9uYW1lIHBvaW50cyB0byB0aGUgc3ltYm9sIG5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1nZXRfc3RydWN0X25hbWUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpwbnQ7Ci0gIHBudCA9IHN0cjsKLSAgd2hpbGUgKCgqcG50ICE9ICc6JykgJiYgKCpwbnQgIT0gJ1wwJykpCi0gICAgcG50LS07Ci0gIGlmICgqcG50ID09ICdcMCcpCi0gICAgcmV0dXJuIChjaGFyICopIHN5bWJvbF9uYW1lOwotICAqcG50LS0gPSAnXDAnOwotICB3aGlsZSAoKCpwbnQgIT0gJzsnKSAmJiAoKnBudCAhPSAnPScpKQotICAgIHBudC0tOwotICBpZiAoKnBudCA9PSAnOycpCi0gICAgcmV0dXJuIHBudCArIDE7Ci0gIHdoaWxlICgoKnBudCA8ICcwJykgfHwgKCpwbnQgPiAnOScpKQotICAgIHBudCsrOwotICB3aGlsZSAoKCpwbnQgPj0gJzAnKSAmJiAoKnBudCA8PSAnOScpKQotICAgIHBudCsrOwotICByZXR1cm4gcG50OwotfQotCi0KLS8qIFNlYXJjaCBzeW1ib2wgbGlzdCBmb3IgdHlwZSBudW1iZXIgZGJ4X3R5cGUuCi0gICBSZXR1cm4gYSBwb2ludGVyIHRvIHN0cnVjdC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKgotZmluZF9zeW1ib2wgKGRieF90eXBlKQotICAgICBpbnQgZGJ4X3R5cGU7Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLQotICBzcG50ID0gVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQX0hBU0ggKGRieF90eXBlKV07Ci0gIHdoaWxlIChzcG50KQotICAgIHsKLSAgICAgIGlmIChzcG50LT5kYnhfdHlwZSA9PSBkYnhfdHlwZSkKLQlicmVhazsKLSAgICAgIHNwbnQgPSBzcG50LT5uZXh0OwotICAgIH0KLSAgaWYgKCFzcG50IHx8IHNwbnQtPmFkdmFuY2VkICE9IEFMSUFTKQotICAgIHJldHVybiBzcG50OwotICByZXR1cm4gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLX0KLQotCi0jaWYgMAkJLyogb2Jzb2xldGUgKi8KLS8qIHRoaXMgcm91dGluZSBwdXRzIGluZm8gaW50byBlaXRoZXIgTG9jYWwgb3IgQXN1ZmZpeCwgZGVwZW5kaW5nIG9uIHRoZSBzaWduCi0gKiBvZiBzaXplLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGl0IGlzIGVhc2llciB0byBidWlsZCB0aGUgdmFyaWFibGUgZGVzY3JpcHRvcgotICogYmFja3dhcmRzLCB3aGlsZSB0aGUgYXJyYXkgZGVzY3JpcHRvciBpcyBiZXN0IGJ1aWx0IGZvcndhcmRzLiAgSW4gdGhlIGVuZAotICogdGhleSBnZXQgcHV0IHRvZ2V0aGVyLCBpZiB0aGVyZSBpcyBub3QgYSBzdHJ1Y3QvdW5pb24vZW51bSBhbG9uZyB0aGUgd2F5Ci0gKi8KLXN0YXRpYyB2b2lkCi1wdXNoICh2YWx1ZSwgc2l6ZTEpCi0gICAgIGludCB2YWx1ZSwgc2l6ZTE7Ci17Ci0gIGlmIChzaXplMSA8IDApCi0gICAgewotICAgICAgc2l6ZTEgPSAtc2l6ZTE7Ci0gICAgICBpZiAoTHBudCA8IHNpemUxKQotCXsKLQkgIG92ZXJmbG93ID0gMTsKLQkgIExwbnQgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIExwbnQgLT0gc2l6ZTE7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZMb2NhbFtMcG50ICsgMV0sIHZhbHVlLCBzaXplMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKEFwb2ludCArIHNpemUxID49IE1BWF9ERUJVR19SRUNPUkQpCi0JewotCSAgb3ZlcmZsb3cgPSAxOwotCSAgQXBvaW50ID0gTUFYX0RFQlVHX1JFQ09SRCAtIDE7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmQXN1ZmZpeFtBcG9pbnRdLCB2YWx1ZSwgc2l6ZTEpOwotICAgICAgQXBvaW50ICs9IHNpemUxOwotICAgIH0KLX0KLSNlbmRpZgotCi0KLXN0YXRpYyB2b2lkCi1mcHVzaCAodmFsdWUsIHNpemUpCi0gICAgIGludCB2YWx1ZSwgc2l6ZTsKLXsKLSAgaWYgKEFwb2ludCArIHNpemUgPj0gTUFYX0RFQlVHX1JFQ09SRCkKLSAgICB7Ci0gICAgICBvdmVyZmxvdyA9IDE7Ci0gICAgICBBcG9pbnQgPSBNQVhfREVCVUdfUkVDT1JEIC0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzaXplID09IDEpCi0gICAgQXN1ZmZpeFtBcG9pbnQrK10gPSAoY2hhcikgdmFsdWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZBc3VmZml4W0Fwb2ludF0sIHZhbHVlLCBzaXplKTsKLSAgICAgIEFwb2ludCArPSBzaXplOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXJwdXNoICh2YWx1ZSwgc2l6ZSkKLSAgICAgaW50IHZhbHVlLCBzaXplOwotewotICBpZiAoTHBudCA8IHNpemUpCi0gICAgewotICAgICAgb3ZlcmZsb3cgPSAxOwotICAgICAgTHBudCA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc2l6ZSA9PSAxKQotICAgICAgTG9jYWxbTHBudC0tXSA9IChjaGFyKSB2YWx1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIExwbnQgLT0gc2l6ZTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoJkxvY2FsW0xwbnQgKyAxXSwgdmFsdWUsIHNpemUpOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIHRoZSBhcnJheSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIGFycmF5LiAgKi8KLQotc3RhdGljIHZvaWQKLWFycmF5X3N1ZmZpeCAoc3BudDIpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDI7Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKLSAgaW50IHJhbms7Ci0gIGludCB0b3RhbF9zaXplOwotCi0gIHJhbmsgPSAwOwotICBzcG50ID0gc3BudDI7Ci0gIHdoaWxlIChzcG50LT5hZHZhbmNlZCAhPSBBUlJBWSkKLSAgICB7Ci0gICAgICBzcG50ID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLSAgICAgIGlmICghc3BudCkKLQlyZXR1cm47Ci0gICAgfQotICBzcG50MSA9IHNwbnQ7Ci0gIHRvdGFsX3NpemUgPSAxOwotICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQotICAgIHsKLSAgICAgIHJhbmsrKzsKLSAgICAgIHRvdGFsX3NpemUgKj0gKHNwbnQxLT5pbmRleF9tYXggLSBzcG50MS0+aW5kZXhfbWluICsgMSk7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotICAgIH0KLSAgdG90YWxfc2l6ZSA9IHRvdGFsX3NpemUgKiBzcG50MS0+ZGF0YV9zaXplOwotICBmcHVzaCAoc3BudDEtPmRhdGFfc2l6ZSwgMik7CS8qIGVsZW1lbnQgc2l6ZSAqLwotICBpZiAoc3BudDEtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKLSAgICBmcHVzaCAoMCwgMSk7Ci0gIGVsc2UKLSAgICBmcHVzaCAoc3BudDEtPlZNU190eXBlLCAxKTsJLyogZWxlbWVudCB0eXBlICovCi0gIGZwdXNoIChEU0NfS19DTEFTU19BLCAxKTsJLyogZGVzY3JpcHRvciBjbGFzcyAqLwotICBmcHVzaCAoMCwgNCk7CQkJLyogYmFzZSBhZGRyZXNzICovCi0gIGZwdXNoICgwLCAxKTsJCQkvKiBzY2FsZSBmYWN0b3IgLS0gbm90IGFwcGxpY2FibGUgKi8KLSAgZnB1c2ggKDAsIDEpOwkJCS8qIGRpZ2l0IGNvdW50IC0tIG5vdCBhcHBsaWNhYmxlICovCi0gIGZwdXNoICgweGMwLCAxKTsJCS8qIGZsYWdzOiBtdWx0aXBsaWVyIGJsb2NrICYgYm91bmRzIHByZXNlbnQgKi8KLSAgZnB1c2ggKHJhbmssIDEpOwkJLyogbnVtYmVyIG9mIGRpbWVuc2lvbnMgKi8KLSAgZnB1c2ggKHRvdGFsX3NpemUsIDQpOwotICBmcHVzaCAoMCwgNCk7CQkJLyogcG9pbnRlciB0byBlbGVtZW50IFswXVswXS4uLlswXSAqLwotICBzcG50MSA9IHNwbnQ7Ci0gIHdoaWxlIChzcG50MS0+YWR2YW5jZWQgPT0gQVJSQVkpCi0gICAgewotICAgICAgZnB1c2ggKHNwbnQxLT5pbmRleF9tYXggLSBzcG50MS0+aW5kZXhfbWluICsgMSwgNCk7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotICAgIH0KLSAgc3BudDEgPSBzcG50OwotICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQotICAgIHsKLSAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWluLCA0KTsKLSAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWF4LCA0KTsKLSAgICAgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQxLT50eXBlMik7Ci0gICAgfQotfQotCi0KLS8qIFRoaXMgcm91dGluZSBnZW5lcmF0ZXMgdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgZGVzY3JpcHRvciBiYXNlZCB1cG9uCi0gICBhIHN0cnVjdC91bmlvbi9lbnVtIHRoYXQgaGFzIHlldCB0byBiZSBkZWZpbmVkLiAgV2UgZGVmaW5lIHRoaXMgc3BvdCBhcwotICAgYSBuZXcgbG9jYXRpb24sIGFuZCBzYXZlIGZvdXIgYnl0ZXMgZm9yIHRoZSBhZGRyZXNzLiAgV2hlbiB0aGUgc3RydWN0IGlzCi0gICBmaW5hbGx5IGRlZmluZWQsIHRoZW4gd2UgY2FuIGdvIGJhY2sgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgYWRkcmVzcy4gICovCi0KLXN0YXRpYyB2b2lkCi1uZXdfZm9yd2FyZF9yZWYgKGRieF90eXBlKQotICAgICBpbnQgZGJ4X3R5cGU7Ci17Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKLSAgZnBudCA9IChzdHJ1Y3QgZm9yd2FyZF9yZWYgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZm9yd2FyZF9yZWYpKTsKLSAgZnBudC0+bmV4dCA9IGZfcmVmX3Jvb3Q7Ci0gIGZfcmVmX3Jvb3QgPSBmcG50OwotICBmcG50LT5kYnhfdHlwZSA9IGRieF90eXBlOwotICBmcG50LT5zdHJ1Y19udW1iID0gKytzdHJ1Y3R1cmVfY291bnQ7Ci0gIGZwbnQtPnJlc29sdmVkID0gJ04nOwotICBycHVzaCAoRFNUX0tfVFNfSU5ELCAxKTsJLyogaW5kaXJlY3QgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0gIHRvdGFsX2xlbiA9IDU7Ci0gIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICBzdHJ1Y3RfbnVtYmVyID0gLWZwbnQtPnN0cnVjX251bWI7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyB0aGUgdmFyaWFibGUgZGVzY3JpcHRvciB1c2VkIHRvIGRlc2NyaWJlIG5vbi1iYXNpYwotICAgdmFyaWFibGVzLiAgSXQgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IHVudGlsIGl0IGdldHMgdG8gdGhlIGJvdHRvbSBvZiBpdAotICAgYWxsLCBhbmQgdGhlbiBidWlsZHMgdGhlIGRlc2NyaXB0b3IgYmFja3dhcmRzLiAgSXQgaXMgZWFzaWVzdCB0byBkbyBpdAotICAgdGhpcyB3YXkgc2luY2Ugd2UgbXVzdCBwZXJpb2RpY2FsbHkgd3JpdGUgbGVuZ3RoIGJ5dGVzLCBhbmQgaXQgaXMgZWFzaWVzdAotICAgaWYgd2Uga25vdyB0aGUgdmFsdWUgd2hlbiBpdCBpcyB0aW1lIHRvIHdyaXRlIGl0LiAgKi8KLQotc3RhdGljIGludAotZ2VuMSAoc3BudCwgYXJyYXlfc3VmZml4X2xlbikKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICAgICBpbnQgYXJyYXlfc3VmZml4X2xlbjsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoIChzcG50LT5hZHZhbmNlZCkKLSAgICB7Ci0gICAgY2FzZSBWT0lEOgotICAgICAgcnB1c2ggKERCR19TX0NfVk9JRCwgMSk7Ci0gICAgICB0b3RhbF9sZW4gKz0gMTsKLSAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCQVNJQzoKLSAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgaWYgKGFycmF5X3N1ZmZpeF9sZW4gPT0gMCkKLQl7Ci0JICBycHVzaCAoc3BudC0+Vk1TX3R5cGUsIDEpOwotCSAgcnB1c2ggKERCR19TX0NfQkFTSUMsIDEpOwotCSAgdG90YWxfbGVuID0gMjsKLQkgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgcnB1c2ggKDAsIDQpOwotICAgICAgcnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwotICAgICAgcnB1c2ggKERTVF9LX1RTX0RTQywgMSk7CS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0gICAgICB0b3RhbF9sZW4gPSAtMjsKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgU1RSVUNUOgotICAgIGNhc2UgVU5JT046Ci0gICAgY2FzZSBFTlVNOgotICAgICAgc3RydWN0X251bWJlciA9IHNwbnQtPnN0cnVjX251bWI7Ci0gICAgICBpZiAoc3RydWN0X251bWJlciA8IDApCi0JewotCSAgbmV3X2ZvcndhcmRfcmVmIChzcG50LT5kYnhfdHlwZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBycHVzaCAoREJHX1NfQ19TVFJVQ1QsIDEpOwotICAgICAgdG90YWxfbGVuID0gNTsKLSAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBQT0lOVEVSOgotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOwotICAgICAgaSA9IDE7Ci0gICAgICBpZiAoIXNwbnQxKQotCW5ld19mb3J3YXJkX3JlZiAoc3BudC0+dHlwZTIpOwotICAgICAgZWxzZQotCWkgPSBnZW4xIChzcG50MSwgMCk7Ci0gICAgICBpZiAoaSkKLQl7CS8qICgqdm9pZCkgaXMgYSBzcGVjaWFsIGNhc2UsIGRvIG5vdCBwdXQgcG9pbnRlciBzdWZmaXggKi8KLQkgIHJwdXNoIChEQkdfU19DX1BPSU5URVIsIDEpOwotCSAgdG90YWxfbGVuICs9IDM7Ci0JICBycHVzaCAodG90YWxfbGVuLCAyKTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEFSUkFZOgotICAgICAgc3BudDEgPSBzcG50OwotICAgICAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKLQl7Ci0JICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotCSAgaWYgKCFzcG50MSkKLQkgICAgewotCSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgZm9yd2FyZCByZWZlcmVuY2UgZXJyb3IsIGRieCB0eXBlICVkIiksCi0JCQkgc3BudC0+dHlwZTIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotLyogSXQgaXMgdG9vIGxhdGUgdG8gZ2VuZXJhdGUgZm9yd2FyZCByZWZlcmVuY2VzLCBzbyB0aGUgdXNlciBnZXRzIGEgbWVzc2FnZS4KLSAqIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uIGEgY29tcGlsZXIgZXJyb3IgKi8KLSAgICAgICh2b2lkKSBnZW4xIChzcG50MSwgMSk7Ci0gICAgICBpID0gQXBvaW50OwotICAgICAgYXJyYXlfc3VmZml4IChzcG50KTsKLSAgICAgIGFycmF5X3N1ZmZpeF9sZW4gPSBBcG9pbnQgLSBpOwotICAgICAgc3dpdGNoIChzcG50MS0+YWR2YW5jZWQpCi0JewotCWNhc2UgQkFTSUM6Ci0JY2FzZSBGVU5DVElPTjoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBycHVzaCAoMCwgMik7Ci0JICB0b3RhbF9sZW4gKz0gMjsKLQkgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotCSAgcnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwotCSAgcnB1c2ggKDEsIDEpOwkJLyogZmxhZ3M6IGVsZW1lbnQgdmFsdWUgc3BlYyBpbmNsdWRlZCAqLwotCSAgcnB1c2ggKDEsIDEpOwkJLyogb25lIGRpbWVuc2lvbiAqLwotCSAgcnB1c2ggKERCR19TX0NfQ09NUExFWF9BUlJBWSwgMSk7Ci0JfQotICAgICAgdG90YWxfbGVuICs9IGFycmF5X3N1ZmZpeF9sZW4gKyA4OwotICAgICAgcnB1c2ggKHRvdGFsX2xlbiwgMik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgkvKiBsaW50IHN1cHByZXNzaW9uICovCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoaXMgZ2VuZXJhdGVzIGEgc3VmZml4IGZvciBhIHZhcmlhYmxlLiAgSWYgaXQgaXMgbm90IGEgZGVmaW5lZCB0eXBlIHlldCwKLSAgIHRoZW4gZGJ4X3R5cGUgY29udGFpbnMgdGhlIHR5cGUgd2UgYXJlIGV4cGVjdGluZyBzbyB3ZSBjYW4gZ2VuZXJhdGUgYQotICAgZm9yd2FyZCByZWZlcmVuY2UuICBUaGlzIGNhbGxzIGdlbjEgdG8gYnVpbGQgbW9zdCBvZiB0aGUgZGVzY3JpcHRvciwgYW5kCi0gICB0aGVuIGl0IHB1dHMgdGhlIGljaW5nIG9uIGF0IHRoZSBlbmQuICBJdCB0aGVuIGR1bXBzIHdoYXRldmVyIGlzIG5lZWRlZAotICAgdG8gZ2V0IGEgY29tcGxldGUgZGVzY3JpcHRvciAoaS5lLiBzdHJ1Y3QgcmVmZXJlbmNlLCBhcnJheSBzdWZmaXgpLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX3N1ZmZpeCAoc3BudCwgZGJ4X3R5cGUpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgICAgaW50IGRieF90eXBlOwotewotICBzdGF0aWMgY29uc3QgY2hhciBwdm9pZFs2XSA9IHsKLQkJNSwJCS8qIHJlY29yZC5sZW5ndGggPT0gNSAqLwotCQlEU1RfS19UWVBTUEVDLAkvKiByZWNvcmQudHlwZSA9PSAxICh0eXBlIHNwZWNpZmljYXRpb24pICovCi0JCTAsCQkvKiBuYW1lLmxlbmd0aCA9PSAwLCBubyBuYW1lIGZvbGxvd3MgKi8KLQkJMSwgMCwJCS8qIHR5cGUubGVuZ3RoID09IDEgezIgYnl0ZXMsIGxpdHRsZSBlbmRpYW59ICovCi0JCURCR19TX0NfVk9JRAkvKiB0eXBlLnR5cGUgPT0gNSAocG9pbnRlciB0byB1bnNwZWNpZmllZCkgKi8KLSAgfTsKLSAgaW50IGk7Ci0KLSAgQXBvaW50ID0gMDsKLSAgTHBudCA9IE1BWF9ERUJVR19SRUNPUkQgLSAxOwotICB0b3RhbF9sZW4gPSAwOwotICBzdHJ1Y3RfbnVtYmVyID0gMDsKLSAgb3ZlcmZsb3cgPSAwOwotICBpZiAoIXNwbnQpCi0gICAgbmV3X2ZvcndhcmRfcmVmIChkYnhfdHlwZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3BudC0+Vk1TX3R5cGUgIT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQotCXJldHVybjsJCS8qIG5vIHN1ZmZpeCBuZWVkZWQgKi8KLSAgICAgIGdlbjEgKHNwbnQsIDApOwotICAgIH0KLSAgcnB1c2ggKDAsIDEpOwkJLyogbm8gbmFtZSAobGVuPT0wKSAqLwotICBycHVzaCAoRFNUX0tfVFlQU1BFQywgMSk7Ci0gIHRvdGFsX2xlbiArPSA0OwotICBycHVzaCAodG90YWxfbGVuLCAxKTsKLSAgLyogSWYgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3Igb3ZlcmZsb3dzIHRoZSByZWNvcmQsIG91dHB1dCBhIGRlc2NyaXB0b3IKLSAgICAgZm9yIGEgcG9pbnRlciB0byB2b2lkLiAgKi8KLSAgaWYgKCh0b3RhbF9sZW4gPj0gTUFYX0RFQlVHX1JFQ09SRCkgfHwgb3ZlcmZsb3cpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiVmFyaWFibGUgZGVzY3JpcHRvciAlZCB0b28gY29tcGxpY2F0ZWQuICBEZWZpbmVkIGFzIGB2b2lkIConLiIpLAotCQlzcG50LT5kYnhfdHlwZSk7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKHB2b2lkLCA2LCBPQkpfU19DX0RCRyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpID0gMDsKLSAgd2hpbGUgKExwbnQgPCBNQVhfREVCVUdfUkVDT1JEIC0gMSkKLSAgICBMb2NhbFtpKytdID0gTG9jYWxbKytMcG50XTsKLSAgTHBudCA9IGk7Ci0gIC8qIHdlIHVzZSB0aGlzIGZvciByZWZlcmVuY2UgdG8gc3RydWN0dXJlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkICovCi0gIGlmIChzdHJ1Y3RfbnVtYmVyID4gMCkKLSAgICB7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICAgIFZNU19TdG9yZV9TdHJ1Y3QgKHN0cnVjdF9udW1iZXIpOwotICAgIH0KLSAgLyogV2UgdXNlIHRoaXMgZm9yIGEgZm9yd2FyZCByZWZlcmVuY2UgdG8gYSBzdHJ1Y3R1cmUgdGhhdCBoYXMgeWV0IHRvCi0gICAgIGJlIGRlZmluZWQuICBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIHplcm8gdG8gbWFrZSByb29tIGZvciB0aGUgYWN0dWFsCi0gICAgIGFkZHJlc3Mgb25jZSBpdCBpcyBrbm93bi4gICovCi0gIGlmIChzdHJ1Y3RfbnVtYmVyIDwgMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3RfbnVtYmVyID0gLXN0cnVjdF9udW1iZXI7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICAgIFZNU19EZWZfU3RydWN0IChzdHJ1Y3RfbnVtYmVyKTsKLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW0xwbnRdLCAwTCk7Ci0gICAgICBMcG50ICs9IDQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICB9Ci0gIGkgPSAwOwotICB3aGlsZSAoaSA8IEFwb2ludCkKLSAgICBMb2NhbFtMcG50KytdID0gQXN1ZmZpeFtpKytdOwotICBpZiAoTHBudCAhPSAwKQotICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIExwbnQsIE9CSl9TX0NfREJHKTsKLSAgTHBudCA9IDA7Ci19Ci0KLQotCS8qICJub3ZlbCBsZW5ndGgiIHR5cGUgZG9lc24ndCB3b3JrIGZvciBzaW1wbGUgYXRvbWljIHR5cGVzICovCi0jZGVmaW5lIFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUih0KSAoKHQpLT5hZHZhbmNlZCA9PSBCQVNJQykKLSN1bmRlZiBTRVRVUF9CQVNJQ19UWVBFUwotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIGEgdHlwZSBkZXNjcmlwdGlvbiBmb3IgYSBiaXRmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1iaXRmaWVsZF9zdWZmaXggKHNwbnQsIHdpZHRoKQotICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gICAgIGludCB3aWR0aDsKLXsKLSAgTG9jYWxbTHBudCsrXSA9IDEzOwkJCS8qIHJlYy5sZW49PTEzICovCi0gIExvY2FsW0xwbnQrK10gPSBEU1RfS19UWVBTUEVDOwkvKiBhIHR5cGUgc3BlY2lmaWNhdGlvbiByZWNvcmQgKi8KLSAgTG9jYWxbTHBudCsrXSA9IDA7CQkJLyogbm90IG5hbWVkICovCi0gIENPUFlfU0hPUlQgKCZMb2NhbFtMcG50XSwgOSk7CQkvKiB0eXAubGVuPT05ICovCi0gIExwbnQgKz0gMjsKLSAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RTX05PVl9MRU5HOwkvKiBUaGlzIHR5cGUgaXMgYSAibm92ZWwgbGVuZ3RoIgotCQkJCQkgICBpbmNhcm5hdGlvbiBvZiBzb21lIG90aGVyIHR5cGUuICAqLwotICBDT1BZX0xPTkcgKCZMb2NhbFtMcG50XSwgd2lkdGgpOwkvKiBzaXplIGluIGJpdHMgPT0gbm92ZWwgbGVuZ3RoICovCi0gIExwbnQgKz0gNDsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICBMcG50ID0gMDsKLSAgLyogYXNzZXJ0KCBzcG50LT5zdHJ1Y19udW1iID4gMCApOyAqLwotICBWTVNfU3RvcmVfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsJLyogb3V0cHV0IDQgbW9yZSBieXRlcyAqLwotfQotCi0KLS8qIEZvcm1hbGx5IGRlZmluZSBhIGJ1aWx0aW4gdHlwZSwgc28gdGhhdCBpdCBjYW4gc2VydmUgYXMgdGhlIHRhcmdldCBvZgotICAgYW4gaW5kaXJlY3QgcmVmZXJlbmNlLiAgSXQgbWFrZXMgYml0ZmllbGRfc3VmZml4KCkgZWFzaWVyIGJ5IGF2b2lkaW5nCi0gICB0aGUgbmVlZCB0byB1c2UgYSBmb3J3YXJkIHJlZmVyZW5jZSBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaAotICAgdHlwZSB1c2VkIGluIGEgYml0ZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0dXBfYmFzaWNfdHlwZSAoc3BudCkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotewotI2lmZGVmIFNFVFVQX0JBU0lDX1RZUEVTCi0gIC8qIFRoaXMgd291bGQgYmUgdmVyeSB1c2VmdWwgaWYgIm5vdmVsIGxlbmd0aCIgZmllbGRzIGFjdHVhbGx5IHdvcmtlZAotICAgICB3aXRoIGJhc2ljIHR5cGVzIGxpa2UgdGhleSBkbyB3aXRoIGVudW1lcmF0ZWQgdHlwZXMuICBIb3dldmVyLAotICAgICB0aGV5IGRvIG5vdCwgc28gdGhpcyBpc24ndCB3b3J0aCBkb2luZyBqdXN0IHNvIHRoYXQgeW91IGNhbiB1c2UKLSAgICAgRVhBTUlORS9UWVBFPShfX2xvbmdfbG9uZ19pbnQpIGluc3RlYWQgb2YgRVhBTUlORS9RVUFELiAgKi8KLSAgY2hhciAqcDsKLSNpZm5kZWYgU0VUVVBfU1lOT05ZTV9UWVBFUwotICAvKiBUaGlzIGRldGVybWluZXMgd2hldGhlciBjb21wYXRpYmxlIHRoaW5ncyBsaWtlIGBpbnQnIGFuZCBgbG9uZyBpbnQnCi0gICAgIG91Z2h0IHRvIGhhdmUgZGlzdGluY3QgdHlwZSByZWNvcmRzIHJhdGhlciB0aGFuIHNoYXJpbmcgb25lLiAgKi8KLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MjsKLQotICAvKiBmaXJzdCBjaGVjayB3aGV0aGVyIHRoaXMgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHNlZW4gYnkgYW5vdGhlciBuYW1lICovCi0gIGZvciAoc3BudDIgPSBWTVNfU3ltYm9sX3R5cGVfbGlzdFtTWU1UWVBfSEFTSCAoc3BudC0+Vk1TX3R5cGUpXTsKLSAgICAgICBzcG50MjsKLSAgICAgICBzcG50MiA9IHNwbnQyLT5uZXh0KQotICAgIGlmIChzcG50MiAhPSBzcG50ICYmIHNwbnQyLT5WTVNfdHlwZSA9PSBzcG50LT5WTVNfdHlwZSkKLSAgICAgIHsKLQlzcG50LT5zdHJ1Y19udW1iID0gc3BudDItPnN0cnVjX251bWI7Ci0JcmV0dXJuOwotICAgICAgfQotI2VuZGlmCi0KLSAgLyogYHN0cnVjdHVyZSBudW1iZXInIGRvZXNuJ3QgcmVhbGx5IG1lYW4gYHN0cnVjdHVyZSc7IGl0IG1lYW5zIGFuIGluZGV4Ci0gICAgIGludG8gYSBsaW5rZXIgbWFpbnRhaW5lZCBzZXQgb2Ygc2F2ZWQgbG9jYXRpb25zIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkCi0gICAgIGFnYWluIGxhdGVyLiAgKi8KLSAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CS8qIHJlbWVtYmVyIHdoZXJlIHRoaXMgdHlwZSBsaXZlcyAqLwotICAvKiBkZWZpbmUgdGhlIHNpbXBsZSBzY2FsYXIgdHlwZSAqLwotICBMb2NhbFtMcG50KytdID0gNiArIHN0cmxlbiAoc3ltYm9sX25hbWUpICsgMjsJLyogcmVjLmxlbiAqLwotICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFlQU1BFQzsJLyogcmVjLnR5cD09dHlwZSBzcGVjaWZpY2F0aW9uICovCi0gIExvY2FsW0xwbnQrK10gPSBzdHJsZW4gKHN5bWJvbF9uYW1lKSArIDI7Ci0gIExvY2FsW0xwbnQrK10gPSAnXyc7CQkJLyogcHJlZml4IG5hbWUgd2l0aCAiX18iICovCi0gIExvY2FsW0xwbnQrK10gPSAnXyc7Ci0gIGZvciAocCA9IHN5bWJvbF9uYW1lOyAqcDsgcCsrKQotICAgIExvY2FsW0xwbnQrK10gPSAqcCA9PSAnICcgPyAnXycgOiAqcDsKLSAgQ09QWV9TSE9SVCAoJkxvY2FsW0xwbnRdLCAyKTsJCS8qIHR5cC5sZW49PTIgKi8KLSAgTHBudCArPSAyOwotICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFNfQVRPTTsJLyogdHlwLmtpbmQgaXMgc2ltcGxlIHR5cGUgKi8KLSAgTG9jYWxbTHBudCsrXSA9IHNwbnQtPlZNU190eXBlOwkvKiB0eXAudHlwZSAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gIExwbnQgPSAwOwotI2VuZGlmCS8qIFNFVFVQX0JBU0lDX1RZUEVTICovCi0gIHJldHVybjsKLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIGEgc3ltYm9sIGRlZmluaXRpb24gZm9yIGEgQyBzeW1ib2wgZm9yIHRoZSBkZWJ1Z2dlci4KLSAgIEl0IHRha2VzIGEgcHNlY3QgYW5kIG9mZnNldCBmb3IgZ2xvYmFsIHN5bWJvbHM7IGlmIHBzZWN0IDwgMCwgdGhlbiB0aGlzIGlzCi0gICBhIGxvY2FsIHZhcmlhYmxlIGFuZCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIEZQLiAgSW4gdGhpcyBjYXNlIGl0IGNhbgotICAgYmUgZWl0aGVyIGEgdmFyaWFibGUgKE9mZnNldCA8IDApIG9yIGEgcGFyYW1ldGVyIChPZmZzZXQgPiAwKS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfREJHX3JlY29yZCAoc3BudCwgUHNlY3QsIE9mZnNldCwgTmFtZSkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICAgICBpbnQgUHNlY3Q7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGNoYXIgKk5hbWU7Ci17Ci0gIGNoYXIgKk5hbWVfcG50OwotICBpbnQgbGVuOwotICBpbnQgaSA9IDA7Ci0KLSAgLyogaWYgdGhlcmUgYXJlIGJhZCBjaGFyYWN0ZXJzIGluIG5hbWUsIGNvbnZlcnQgdGhlbSAqLwotICBOYW1lX3BudCA9IGZpeF9uYW1lIChOYW1lKTsKLQotICBsZW4gPSBzdHJsZW4gKE5hbWVfcG50KTsKLSAgaWYgKFBzZWN0IDwgMCkKLSAgICB7CQkJCS8qIHRoaXMgaXMgYSBsb2NhbCB2YXJpYWJsZSwgcmVmZXJlbmNlZCB0byBTUCAqLwotICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0gICAgICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7Ci0gICAgICBMb2NhbFtpKytdID0gKE9mZnNldCA+IDApID8gREJHX0NfRlVOQ1RJT05fUEFSQU0gOiBEQkdfQ19MT0NBTF9TWU07Ci0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgT2Zmc2V0KTsKLSAgICAgIGkgKz0gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBMb2NhbFtpKytdID0gNyArIGxlbjsKLSAgICAgIExvY2FsW2krK10gPSBzcG50LT5WTVNfdHlwZTsKLSAgICAgIExvY2FsW2krK10gPSBEU1RfS19WQUxLSU5EX0FERFI7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIFZNU19TZXRfRGF0YSAoUHNlY3QsIE9mZnNldCwgT0JKX1NfQ19EQkcsIDApOwotICAgIH0KLSAgTG9jYWxbaSsrXSA9IGxlbjsKLSAgd2hpbGUgKCpOYW1lX3BudCAhPSAnXDAnKQotICAgIExvY2FsW2krK10gPSAqTmFtZV9wbnQrKzsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICBpZiAoc3BudC0+Vk1TX3R5cGUgPT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQotICAgIGdlbmVyYXRlX3N1ZmZpeCAoc3BudCwgMCk7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIHBhcnNlcyB0aGUgc3RhYnMgZW50cmllcyBpbiBvcmRlciB0byBtYWtlIHRoZSBkZWZpbml0aW9uCi0gICBmb3IgdGhlIGRlYnVnZ2VyIG9mIGxvY2FsIHN5bWJvbHMgYW5kIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX2xvY2FsX3N0YWJfUGFyc2UgKHNwKQotICAgICBzeW1ib2xTICpzcDsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNoYXIgKnN0cjsKLSAgaW50IGRieF90eXBlOwotCi0gIGRieF90eXBlID0gMDsKLSAgc3RyID0gU19HRVRfTkFNRSAoc3ApOwotICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciwgJzonKTsKLSAgaWYgKCFwbnQpCi0gICAgcmV0dXJuOwkJCS8qIG5vIGNvbG9uIHByZXNlbnQgKi8KLSAgcG50MSA9IHBudCsrOwkJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIsIGFuZCBza2lwIGNvbG9uICovCi0gIGlmICgqcG50ID09ICdjJykKLSAgICByZXR1cm47CQkJLyogaWdub3JlIHN0YXRpYyBjb25zdGFudHMgKi8KLQotLyogdGhlcmUgaXMgb25lIGxpdHRsZSBjYXRjaCB0aGF0IHdlIG11c3QgYmUgYXdhcmUgb2YuICBTb21ldGltZXMgZnVuY3Rpb24KLSAqIHBhcmFtZXRlcnMgYXJlIG9wdGltaXplZCBpbnRvIHJlZ2lzdGVycywgYW5kIHRoZSBjb21waWxlciwgaW4gaXRzIGluZmlpdGUKLSAqIHdpc2RvbSBvdXRwdXRzIHN0YWJzIHJlY29yZHMgZm9yICpib3RoKi4gIEluIGdlbmVyYWwgd2Ugd2FudCB0byB1c2UgdGhlCi0gKiByZWdpc3RlciBpZiBpdCBpcyBwcmVzZW50LCBzbyB3ZSBtdXN0IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgc3ltYm9scyBmb3IKLSAqIHRoaXMgZnVuY3Rpb24gdG8gc2VlIGlmIHRoaXMgcGFyYW1ldGVyIGlzIGFzc2lnbmVkIHRvIGEgcmVnaXN0ZXIuCi0gKi8KLSAgewotICAgIHN5bWJvbFMgKnNwMTsKLSAgICBjaGFyICpzdHIxOwotICAgIGNoYXIgKnBudDI7Ci0KLSAgICBpZiAoKnBudCA9PSAncCcpCi0gICAgICB7Ci0JZm9yIChzcDEgPSBzeW1ib2xfbmV4dCAoc3ApOyBzcDE7IHNwMSA9IHN5bWJvbF9uZXh0IChzcDEpKQotCSAgewotCSAgICBpZiAoIVNfSVNfREVCVUcgKHNwMSkpCi0JICAgICAgY29udGludWU7Ci0JICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3AxKSA9PSBOX0ZVTikKLQkgICAgICB7Ci0JCXBudDIgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHNwMSksICc6JykgKyAxOwotCQlpZiAoKnBudDIgPT0gJ0YnIHx8ICpwbnQyID09ICdmJykKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3AxKSAhPSBOX1JTWU0pCi0JICAgICAgY29udGludWU7Ci0JICAgIHN0cjEgPSBTX0dFVF9OQU1FIChzcDEpOwkvKiBhbmQgZ2V0IHRoZSBuYW1lICovCi0JICAgIHBudDIgPSBzdHI7Ci0JICAgIHdoaWxlICgqcG50MiAhPSAnOicpCi0JICAgICAgewotCQlpZiAoKnBudDIgIT0gKnN0cjEpCi0JCSAgYnJlYWs7Ci0JCXBudDIrKzsKLQkJc3RyMSsrOwotCSAgICAgIH0KLQkgICAgaWYgKCpzdHIxID09ICc6JyAmJiAqcG50MiA9PSAnOicpCi0JICAgICAgcmV0dXJuOwkvKiB0aGV5IGFyZSB0aGUgc2FtZSEgIGxldHMgc2tpcCB0aGlzIG9uZSAqLwotCSAgfQkJCS8qIGZvciAqLwotCXBudCsrOwkJCS8qIHNraXAgcCBpbiBjYXNlIG5vIHJlZ2lzdGVyICovCi0gICAgICB9CQkJLyogaWYgKi8KLSAgfQkJCQkvKiBwIGJsb2NrICovCi0KLSAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCwgJmRieF90eXBlKTsKLSAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7Ci0gIGlmICghc3BudCkKLSAgICByZXR1cm47CQkJLypEdW5ubyB3aGF0IHRoaXMgaXMqLwotICAqcG50MSA9ICdcMCc7Ci0gIFZNU19EQkdfcmVjb3JkIChzcG50LCAtMSwgU19HRVRfVkFMVUUgKHNwKSwgc3RyKTsKLSAgKnBudDEgPSAnOic7CQkJLyogYW5kIHJlc3RvcmUgdGhlIHN0cmluZyAqLwotICByZXR1cm47Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIHBhcnNlcyBhIHN0YWJzIGVudHJ5IHRvIGZpbmQgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gICB0byBkZWZpbmUgYSB2YXJpYWJsZS4gIEl0IGlzIHVzZWQgZm9yIGdsb2JhbCBhbmQgc3RhdGljIHZhcmlhYmxlcy4KLSAgIEJhc2ljYWxseSB3ZSBuZWVkIHRvIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIFdpdGggb2xkZXIKLSAgIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciwgY29uc3Qgc3ltYm9scyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSwgaW4KLSAgIHRoYXQgaWYgdGhleSBhcmUgZ2xvYmFsIHRoZXkgYXJlIHdyaXR0ZW4gaW50byB0aGUgdGV4dCBwc2VjdC4gIFRoZQotICAgZ2xvYmFsIHN5bWJvbCBlbnRyeSBmb3Igc3VjaCBhIGNvbnN0IGlzIGFjdHVhbGx5IHdyaXR0ZW4gYXMgYSBwcm9ncmFtCi0gICBlbnRyeSBwb2ludCAoWXVrISEpLCBzbyBpZiB3ZSBjYW5ub3QgZmluZCBhIHN5bWJvbCBpbiB0aGUgbGlzdCBvZgotICAgcHNlY3RzLCB3ZSBtdXN0IHNlYXJjaCB0aGUgZW50cnkgcG9pbnRzIGFzIHdlbGwuICBzdGF0aWMgY29uc3RzIGFyZQotICAgZXZlbiBoYXJkZXIsIHNpbmNlIHRoZXkgYXJlIG5ldmVyIGFzc2lnbmVkIGEgbWVtb3J5IGFkZHJlc3MuICBUaGUKLSAgIGNvbXBpbGVyIHBhc3NlcyBhIHN0YWIgdG8gdGVsbCB1cyB0aGUgdmFsdWUsIGJ1dCBJIGFtIG5vdCBzdXJlIHdoYXQKLSAgIHRvIGRvIHdpdGggaXQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX3N0YWJfcGFyc2UgKHNwLCBleHBlY3RlZF90eXBlLCB0eXBlMSwgdHlwZTIsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgZXhwZWN0ZWRfdHlwZTsJLyogY2hhciAqLwotICAgICBpbnQgdHlwZTEsIHR5cGUyLCBUZXh0X1BzZWN0OwotewotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNoYXIgKnN0cjsKLSAgc3ltYm9sUyAqc3AxOwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0gIGludCBkYnhfdHlwZTsKLQotICBkYnhfdHlwZSA9IDA7Ci0gIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKLSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6Jyk7Ci0gIGlmICghcG50KQotICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCi0gIHBudDEgPSBwbnQ7CQkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCi0gIHBudCsrOwotICBpZiAoKnBudCA9PSBleHBlY3RlZF90eXBlKQotICAgIHsKLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmZGJ4X3R5cGUpOwotICAgICAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7Ci0gICAgICBpZiAoIXNwbnQpCi0JcmV0dXJuOwkJLypEdW5ubyB3aGF0IHRoaXMgaXMqLwotICAgICAgLyoKLSAgICAgICAqIE5vdyB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIHBzZWN0IGFuZAotICAgICAgICogb2Zmc2V0IGZvciB0aGlzIHZhcmlhYmxlLgotICAgICAgICovCi0gICAgICAqcG50MSA9ICdcMCc7Ci0gICAgICB2c3AgPSBWTVNfU3ltYm9sczsKLSAgICAgIHdoaWxlICh2c3ApCi0JewotCSAgcG50ID0gU19HRVRfTkFNRSAodnNwLT5TeW1ib2wpOwotCSAgaWYgKHBudCAmJiAqcG50KysgPT0gJ18nCi0JICAgICAgLyogbWFrZSBzdXJlIG5hbWUgaXMgdGhlIHNhbWUgYW5kIHN5bWJvbCB0eXBlIG1hdGNoZXMgKi8KLQkgICAgICAmJiBzdHJjbXAgKHBudCwgc3RyKSA9PSAwCi0JICAgICAgJiYgKFNfR0VUX1JBV19UWVBFICh2c3AtPlN5bWJvbCkgPT0gdHlwZTEKLQkJICB8fCBTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IHR5cGUyKSkKLQkgICAgYnJlYWs7Ci0JICB2c3AgPSB2c3AtPk5leHQ7Ci0JfQotICAgICAgaWYgKHZzcCkKLQl7Ci0JICBWTVNfREJHX3JlY29yZCAoc3BudCwgdnNwLT5Qc2VjdF9JbmRleCwgdnNwLT5Qc2VjdF9PZmZzZXQsIHN0cik7Ci0JICAqcG50MSA9ICc6JzsJCS8qIGFuZCByZXN0b3JlIHRoZSBzdHJpbmcgKi8KLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKiBUaGUgc3ltYm9sIHdhcyBub3QgaW4gdGhlIHN5bWJvbCBsaXN0LCBidXQgaXQgbWF5IGJlIGFuCi0gICAgICAgICAiZW50cnkgcG9pbnQiIGlmIGl0IHdhcyBhIGNvbnN0YW50LiAgKi8KLSAgICAgIGZvciAoc3AxID0gc3ltYm9sX3Jvb3RQOyBzcDE7IHNwMSA9IHN5bWJvbF9uZXh0IChzcDEpKQotCXsKLQkgIC8qCi0JICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKLQkgICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwMSkgfHwgKFNfR0VUX1RZUEUgKHNwMSkgIT0gTl9URVhUKSkKLQkgICAgY29udGludWU7Ci0JICBwbnQgPSBTX0dFVF9OQU1FIChzcDEpOwotCSAgaWYgKCpwbnQgPT0gJ18nKQotCSAgICBwbnQrKzsKLQkgIGlmIChzdHJjbXAgKHBudCwgc3RyKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCFnYXZlX2NvbXBpbGVyX21lc3NhZ2UgJiYgZXhwZWN0ZWRfdHlwZSA9PSAnRycpCi0JCXsKLQkJICBjaGFyICpsb25nX2NvbnN0X21zZyA9IF8oIlwKLSoqKldhcm5pbmcgLSB0aGUgYXNzZW1ibHkgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGhhcyBwbGFjZWQgXG5cCi0gZ2xvYmFsIGNvbnN0YW50KHMpIGluIHRoZSB0ZXh0IHBzZWN0LiAgVGhlc2Ugd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIFxuXAotIG90aGVyIG1vZHVsZXMsIHNpbmNlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0IHdheSB0byBoYW5kbGUgdGhpcy4gWW91IFxuXAotIGhhdmUgdHdvIG9wdGlvbnM6IDEpIGdldCBhIHBhdGNoZWQgY29tcGlsZXIgdGhhdCBkb2VzIG5vdCBwdXQgZ2xvYmFsIFxuXAotIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdCwgb3IgMikgcmVtb3ZlIHRoZSAnY29uc3QnIGtleXdvcmQgZnJvbSBcblwKLSBkZWZpbml0aW9ucyBvZiBnbG9iYWwgdmFyaWFibGVzIGluIHlvdXIgc291cmNlIG1vZHVsZShzKS4gIERvbid0IHNheSBcblwKLSBJIGRpZG4ndCB3YXJuIHlvdSEgXG4iKTsKLQotCQkgIGFzX3Rza3RzayAobG9uZ19jb25zdF9tc2cpOwotCQkgIGdhdmVfY29tcGlsZXJfbWVzc2FnZSA9IDE7Ci0JCX0KLQkgICAgICBWTVNfREJHX3JlY29yZCAoc3BudCwKLQkJCSAgICAgIFRleHRfUHNlY3QsCi0JCQkgICAgICBTX0dFVF9WQUxVRSAoc3AxKSwKLQkJCSAgICAgIHN0cik7Ci0JICAgICAgKnBudDEgPSAnOic7Ci0JICAgICAgLyogZm9vbCBhc3NlbWJsZXIgdG8gbm90IG91dHB1dCB0aGlzIGFzIGEgcm91dGluZSBpbiB0aGUgVEJUICovCi0JICAgICAgcG50MSA9IFNfR0VUX05BTUUgKHNwMSk7Ci0JICAgICAgKnBudDEgPSAnTCc7Ci0JICAgICAgU19TRVRfTkFNRSAoc3AxLCBwbnQxKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotICAqcG50MSA9ICc6JzsJCQkvKiBhbmQgcmVzdG9yZSB0aGUgc3RyaW5nICovCi0gIHJldHVybjsKLX0KLQotCi0vKiBTaW1wbGVyIGludGVyZmFjZXMgaW50byBWTVNfc3RhYl9wYXJzZSgpLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19HU1lNX1BhcnNlIChzcCwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqc3A7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewkJCQkvKiBHbG9iYWwgdmFyaWFibGVzICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ0cnLCAoTl9VTkRGIHwgTl9FWFQpLCAoTl9EQVRBIHwgTl9FWFQpLCBUZXh0X1BzZWN0KTsKLX0KLQotc3RhdGljIHZvaWQKLVZNU19MQ1NZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgVGV4dF9Qc2VjdDsKLXsJCQkJLyogU3RhdGljIHN5bWJvbHMgLSB1bmluaXRpYWxpemVkICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ1MnLCBOX0JTUywgLTEsIFRleHRfUHNlY3QpOwotfQotCi1zdGF0aWMgdm9pZAotVk1TX1NUU1lNX1BhcnNlIChzcCwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqc3A7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewkJCQkvKiBTdGF0aWMgc3ltYm9scyAtIGluaXRpYWxpemVkICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ1MnLCBOX0RBVEEsIC0xLCBUZXh0X1BzZWN0KTsKLX0KLQotCi0vKiBGb3IgcmVnaXN0ZXIgc3ltYm9scywgd2UgbXVzdCBmaWd1cmUgb3V0IHdoYXQgcmFuZ2Ugb2YgYWRkcmVzc2VzCi0gICB3aXRoaW4gdGhlIHBzZWN0IGFyZSB2YWxpZC4gIFdlIHdpbGwgdXNlIHRoZSBicmFja2V0cyBpbiB0aGUgc3RhYgotICAgZGlyZWN0aXZlcyB0byBnaXZlIHVzIGd1aWRhbmNlIGFzIHRvIHRoZSBQQyByYW5nZSB0aGF0IHRoaXMgdmFyaWFibGUKLSAgIGlzIGluIHNjb3BlLiAgSSBhbSBzdGlsbCBub3QgY29tcGxldGVseSBjb21mb3J0YWJsZSB3aXRoIHRoaXMgYnV0Ci0gICBhcyBJIGxlYXJuIG1vcmUsIEkgc2VlbSB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHdoYXQgaXMgZ29pbmcgb24uCi0gICBDYXZlYXQgRW1wdG9yLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19SU1lNX1BhcnNlIChzcCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzcCwgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgY2hhciAqcG50OwotICBjaGFyICpwbnQxOwotICBjaGFyICpzdHI7Ci0gIGludCBkYnhfdHlwZTsKLSAgaW50IGxlbjsKLSAgaW50IGkgPSAwOwotICBpbnQgYmNudCA9IDA7Ci0gIGludCBNaW5fT2Zmc2V0ID0gLTE7CQkvKiBtaW4gUEMgb2YgdmFsaWRpdHkgKi8KLSAgaW50IE1heF9PZmZzZXQgPSAwOwkJLyogbWF4IFBDIG9mIHZhbGlkaXR5ICovCi0KLSAgZm9yIChzeW1ib2xQID0gc3A7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQotICAgICAgICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKLQl7Ci0JY2FzZSBOX0xCUkFDOgotCSAgaWYgKGJjbnQrKyA9PSAwKQotCSAgICBNaW5fT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1JCUkFDOgotCSAgaWYgKC0tYmNudCA9PSAwKQotCSAgICBNYXhfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApIC0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICgoTWluX09mZnNldCAhPSAtMSkgJiYgKGJjbnQgPT0gMCkpCi0JYnJlYWs7Ci0gICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApID09IE5fRlVOKQotCXsKLQkgIHBudCA9IChjaGFyICopIHN0cmNociAoU19HRVRfTkFNRSAoc3ltYm9sUCksICc6JykgKyAxOwotCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBhZGRyZXNzZXMgd2VyZSBkZWZpbmVkLiAgSWYgbm90LCB0aGVuIHRoZXJlCi0gICAgIHdlcmUgbm8gYnJhY2tldHMgaW4gdGhlIGZ1bmN0aW9uLCBhbmQgd2UgbXVzdCB0cnkgdG8gc2VhcmNoIGZvcgotICAgICB0aGUgbmV4dCBmdW5jdGlvbi4gIFNpbmNlIGZ1bmN0aW9ucyBjYW4gYmUgaW4gYW55IG9yZGVyLCB3ZSBzaG91bGQKLSAgICAgc2VhcmNoIGFsbCBvZiB0aGUgc3ltYm9sIGxpc3QgdG8gZmluZCB0aGUgY29ycmVjdCBlbmRpbmcgYWRkcmVzcy4gICovCi0gIGlmIChNaW5fT2Zmc2V0ID09IC0xKQotICAgIHsKLSAgICAgIGludCBNYXhfU291cmNlX09mZnNldDsKLSAgICAgIGludCBUaGlzX09mZnNldDsKLQotICAgICAgTWluX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0gICAgICBNYXhfU291cmNlX09mZnNldCA9IE1pbl9PZmZzZXQ7CS8qIGp1c3QgaW4gY2FzZSBubyBOX1NMSU5FcyBmb3VuZCAqLwotICAgICAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotCXN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQotCSAgewotCSAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQkgICAgVGhpc19PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgIGlmIChUaGlzX09mZnNldCA+IE1pbl9PZmZzZXQgJiYgVGhpc19PZmZzZXQgPCBNYXhfT2Zmc2V0KQotCSAgICAgIE1heF9PZmZzZXQgPSBUaGlzX09mZnNldDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0xJTkU6Ci0JICAgIFRoaXNfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgICBpZiAoVGhpc19PZmZzZXQgPiBNYXhfU291cmNlX09mZnNldCkKLQkgICAgICBNYXhfU291cmNlX09mZnNldCA9IFRoaXNfT2Zmc2V0OwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3Qgcm91dGluZSwgdGhlbiB3ZSB1c2UgdGhlIFBDIG9mIHRoZSBsYXN0IHNvdXJjZQotICAgICAgICAgbGluZSBhcyBhIG1hcmtlciBvZiB0aGUgbWF4IFBDIGZvciB3aGljaCB0aGlzIHJlZyBpcyB2YWxpZC4gICovCi0gICAgICBpZiAoTWF4X09mZnNldCA9PSAweDdmZmZmZmZmKQotCU1heF9PZmZzZXQgPSBNYXhfU291cmNlX09mZnNldDsKLSAgICB9Ci0KLSAgZGJ4X3R5cGUgPSAwOwotICBzdHIgPSBTX0dFVF9OQU1FIChzcCk7Ci0gIGlmICgocG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6JykpID09IDApCi0gICAgcmV0dXJuOwkJCS8qIG5vIGNvbG9uIHByZXNlbnQgKi8KLSAgcG50MSA9IHBudDsJCQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyKi8KLSAgcG50Kys7Ci0gIGlmICgqcG50ICE9ICdyJykKLSAgICByZXR1cm47Ci0gIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmZGJ4X3R5cGUpOwotICBzcG50ID0gZmluZF9zeW1ib2wgKGRieF90eXBlKTsKLSAgaWYgKCFzcG50KQotICAgIHJldHVybjsJCQkvKkR1bm5vIHdoYXQgdGhpcyBpcyB5ZXQqLwotICAqcG50MSA9ICdcMCc7Ci0gIHBudCA9IGZpeF9uYW1lIChTX0dFVF9OQU1FIChzcCkpOwkvKiBpZiB0aGVyZSBhcmUgYmFkIGNoYXJhY3RlcnMgaW4gbmFtZSwgY29udmVydCB0aGVtICovCi0gIGxlbiA9IHN0cmxlbiAocG50KTsKLSAgTG9jYWxbaSsrXSA9IDI1ICsgbGVuOwotICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7Ci0gIExvY2FsW2krK10gPSBEU1RfS19WRkxBR1NfVFZTOwkvKiB0cmFpbGluZyB2YWx1ZSBzcGVjaWZpZWQgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbaV0sIDEgKyBsZW4pOwkvKiByZWxhdGl2ZSBvZmZzZXQsIGJleW9uZCBuYW1lICovCi0gIGkgKz0gNDsKLSAgTG9jYWxbaSsrXSA9IGxlbjsJCQkvKiBuYW1lIGxlbmd0aCAoYXNjaWMgcHJlZml4KSAqLwotICB3aGlsZSAoKnBudCAhPSAnXDAnKQotICAgIExvY2FsW2krK10gPSAqcG50Kys7Ci0gIExvY2FsW2krK10gPSBEU1RfS19WU19GT0xMT1dTOwkvKiB2YWx1ZSBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgKi8KLSAgQ09QWV9TSE9SVCAoJkxvY2FsW2ldLCAxNSk7CQkvKiBsZW5ndGggb2YgcmVzdCBvZiByZWNvcmQgKi8KLSAgaSArPSAyOwotICBMb2NhbFtpKytdID0gRFNUX0tfVlNfQUxMT0NfU1BMSVQ7CS8qIHNwbGl0IGxpZmV0aW1lICovCi0gIExvY2FsW2krK10gPSAxOwkJCS8qIG9uZSBiaW5kaW5nIGZvbGxvd3MgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICBpID0gMDsKLSAgVk1TX1NldF9EYXRhIChUZXh0X1BzZWN0LCBNaW5fT2Zmc2V0LCBPQkpfU19DX0RCRywgMSk7Ci0gIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgTWF4X09mZnNldCwgT0JKX1NfQ19EQkcsIDEpOwotICBMb2NhbFtpKytdID0gRFNUX0tfVkFMS0lORF9SRUc7CQkvKiBuZXN0ZWQgdmFsdWUgc3BlYyAqLwotICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgU19HRVRfVkFMVUUgKHNwKSk7Ci0gIGkgKz0gNDsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAqcG50MSA9ICc6JzsKLSAgaWYgKHNwbnQtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKLSAgICBnZW5lcmF0ZV9zdWZmaXggKHNwbnQsIDApOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gZXhhbWluZXMgYSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiwgY2hlY2tpbmcgYWxsIG9mIHRoZSBlbGVtZW50cwotICAgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZW0gYXJlIGZ1bGx5IGRlZmluZWQuICBUaGUgb25seSB0aGluZyB0aGF0IHdlCi0gICBraWNrIG91dCBhcmUgYXJyYXlzIG9mIHVuZGVmaW5lZCBzdHJ1Y3RzLCBzaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnCi0gICB0aGV5IGFyZS4gIEFsbCBvdGhlcnMgd2UgY2FuIGhhbmRsZSB3aXRoIGEgbm9ybWFsIGZvcndhcmQgcmVmZXJlbmNlLiAgKi8KLQotc3RhdGljIGludAotZm9yd2FyZF9yZWZlcmVuY2UgKHBudCkKLSAgICAgY2hhciAqcG50OwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQsICpzcG50MTsKLSAgaW50IGk7Ci0KLSAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgaWYgKCpwbnQgPT0gJzsnKQotICAgIHJldHVybiAwOwkJCS8qIG5vIGZvcndhcmQgcmVmZXJlbmNlcyAqLwotICBkbwotICAgIHsKLSAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAocG50LCAnOicpOwotICAgICAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgICAgIHNwbnQgPSBmaW5kX3N5bWJvbCAoaSk7Ci0gICAgICB3aGlsZSAoc3BudCAmJiAoc3BudC0+YWR2YW5jZWQgPT0gUE9JTlRFUiB8fCBzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSkpCi0JewotCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOwotCSAgaWYgKHNwbnQtPmFkdmFuY2VkID09IEFSUkFZICYmICFzcG50MSkKLQkgICAgcmV0dXJuIDE7Ci0JICBzcG50ID0gc3BudDE7Ci0JfQotICAgICAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gICAgfSB3aGlsZSAoKisrcG50ICE9ICc7Jyk7Ci0gIHJldHVybiAwOwkJCS8qIG5vIGZvcndhcmQgcmVmZW5jZXMgZm91bmQgKi8KLX0KLQotCi0vKiBVc2VkIHRvIGNoZWNrIGEgc2luZ2xlIGVsZW1lbnQgb2YgYSBzdHJ1Y3R1cmUgb24gdGhlIGZpbmFsIHBhc3MuICAqLwotCi1zdGF0aWMgaW50Ci1maW5hbF9mb3J3YXJkX3JlZmVyZW5jZSAoc3BudCkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQxOwotCi0gIHdoaWxlIChzcG50ICYmIChzcG50LT5hZHZhbmNlZCA9PSBQT0lOVEVSIHx8IHNwbnQtPmFkdmFuY2VkID09IEFSUkFZKSkKLSAgICB7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7Ci0gICAgICBpZiAoc3BudC0+YWR2YW5jZWQgPT0gQVJSQVkgJiYgIXNwbnQxKQotCXJldHVybiAxOwotICAgICAgc3BudCA9IHNwbnQxOwotICAgIH0KLSAgcmV0dXJuIDA7CS8qIG5vIGZvcndhcmQgcmVmZW5jZXMgZm91bmQgKi8KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgcGFyc2VzIHRoZSBzdGFicyBkaXJlY3RpdmVzIHRvIGZpbmQgYW55IGRlZmluaXRpb25zIG9mIGRieAotICAgdHlwZSBudW1iZXJzLiAgSXQgbWFrZXMgYSBub3RlIG9mIGFsbCBvZiB0aGVtLCBjcmVhdGluZyBhIHN0cnVjdHVyZQotICAgZWxlbWVudCBvZiBWTVNfREJHX1N5bWJvbCB0aGF0IGRlc2NyaWJlcyBpdC4gIFRoaXMgYWxzbyBnZW5lcmF0ZXMgdGhlCi0gICBpbmZvIGZvciB0aGUgZGVidWdnZXIgdGhhdCBkZXNjcmliZXMgdGhlIHN0cnVjdC91bmlvbi9lbnVtLCBzbyB0aGF0Ci0gICBmdXJ0aGVyIHJlZmVyZW5jZXMgdG8gdGhlc2UgZGF0YSB0eXBlcyB3aWxsIGJlIGJ5IG51bWJlcgotCi0gICBXZSBoYXZlIHRvIHByb2Nlc3MgcG9pbnRlcnMgcmlnaHQgYXdheSwgc2luY2UgdGhlcmUgY2FuIGJlIHJlZmVyZW5jZXMKLSAgIHRvIHRoZW0gbGF0ZXIgaW4gdGhlIHNhbWUgc3RhYnMgZGlyZWN0aXZlLiAgV2UgY2Fubm90IGhhdmUgZm9yd2FyZAotICAgcmVmZXJlbmNlcyB0byBwb2ludGVycywgKGJ1dCB3ZSBjYW4gaGF2ZSBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIGEKLSAgIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUvZW51bS91bmlvbikgYW5kIHRoaXMgaXMgd2h5IHdlIHByb2Nlc3MgdGhlbQotICAgaW1tZWRpYXRlbHkuICBBZnRlciB3ZSBwcm9jZXNzIHRoZSBwb2ludGVyLCB0aGVuIHdlIHNlYXJjaCBmb3IgZGVmcwotICAgdGhhdCBhcmUgbmVzdGVkIGV2ZW4gZGVlcGVyLgotCi0gICA4LzE1LzkyOiBXZSBoYXZlIHRvIHByb2Nlc3MgYXJyYXlzIHJpZ2h0IGF3YXkgdG9vLCBiZWNhdXNlIHRoZXJlIGNhbgotICAgYmUgbXVsdGlwbGUgcmVmZXJlbmNlcyB0byBpZGVudGljYWwgYXJyYXkgdHlwZXMgaW4gb25lIHN0cnVjdHVyZQotICAgZGVmaW5pdGlvbiwgYW5kIG9ubHkgdGhlIGZpcnN0IG9uZSBoYXMgdGhlIGRlZmluaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1WTVNfdHlwZWRlZl9wYXJzZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnBudDsKLSAgY2hhciAqcG50MTsKLSAgY29uc3QgY2hhciAqcG50MjsKLSAgaW50IGk7Ci0gIGludCBkdHlwZTsKLSAgc3RydWN0IGZvcndhcmRfcmVmICpmcG50OwotICBpbnQgaTEsIGkyLCBpMywgbGVuOwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7Ci0KLSAgLyogY2hlY2sgZm9yIGFueSBuZXN0ZWQgZGVmJ3MgKi8KLSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIgKyAxLCAnPScpOwotICBpZiAocG50ICYmIHN0clsxXSAhPSAnKicgJiYgKHN0clsxXSAhPSAnYScgfHwgc3RyWzJdICE9ICdyJykKLSAgICAgICYmIFZNU190eXBlZGVmX3BhcnNlIChwbnQpID09IDEpCi0gICAgcmV0dXJuIDE7Ci0gIC8qIG5vdyBmaW5kIGRieF90eXBlIG9mIGVudHJ5ICovCi0gIHBudCA9IHN0ciAtIDE7Ci0gIGlmICgqcG50ID09ICdjJykKLSAgICB7CQkJCS8qIGNoZWNrIGZvciBzdGF0aWMgY29uc3RhbnRzICovCi0gICAgICAqc3RyID0gJ1wwJzsJCS8qIGZvciBub3cgd2UgaWdub3JlIHRoZW0gKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgd2hpbGUgKCgqcG50IDw9ICc5JykgJiYgKCpwbnQgPj0gJzAnKSkKLSAgICBwbnQtLTsKLSAgcG50Kys7CQkJLyogYW5kIGdldCBiYWNrIHRvIHRoZSBudW1iZXIgKi8KLSAgY3Z0X2ludGVnZXIgKHBudCwgJmkxKTsKLSAgc3BudCA9IGZpbmRfc3ltYm9sIChpMSk7Ci0gIC8qIGZpcnN0IHNlZSBpZiB0aGlzIGhhcyBiZWVuIGRlZmluZWQgYWxyZWFkeSwgZHVlIHRvIGZvcndhcmQgcmVmZXJlbmNlICovCi0gIGlmICghc3BudCkKLSAgICB7Ci0gICAgICBpMiA9IFNZTVRZUF9IQVNIIChpMSk7Ci0gICAgICBzcG50ID0gKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBWTVNfREJHX1N5bWJvbCkpOwotICAgICAgc3BudC0+bmV4dCA9IFZNU19TeW1ib2xfdHlwZV9saXN0W2kyXTsKLSAgICAgIFZNU19TeW1ib2xfdHlwZV9saXN0W2kyXSA9IHNwbnQ7Ci0gICAgICBzcG50LT5kYnhfdHlwZSA9IGkxOwkvKiBhbmQgc2F2ZSB0aGUgdHlwZSAqLwotICAgICAgc3BudC0+dHlwZTIgPSBzcG50LT5WTVNfdHlwZSA9IHNwbnQtPmRhdGFfc2l6ZSA9IDA7Ci0gICAgICBzcG50LT5pbmRleF9taW4gPSBzcG50LT5pbmRleF9tYXggPSBzcG50LT5zdHJ1Y19udW1iID0gMDsKLSAgICB9Ci0gIC8qCi0gICAqIEZvciBzdHJ1Y3RzIGFuZCB1bmlvbnMsIGRvIGEgcGFydGlhbCBwYXJzZSwgb3RoZXJ3aXNlIHdlIHNvbWV0aW1lcyBnZXQKLSAgICogY2lyY3VsYXIgZGVmaW5pdGlvbnMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZXNvbHZlLiAgV2UgcmVhZCBlbm91Z2gKLSAgICogaW5mbyBzbyB0aGF0IGFueSByZWZlcmVuY2UgdG8gdGhpcyB0eXBlIGhhcyBlbm91Z2ggaW5mbyB0byBiZSByZXNvbHZlZC4KLSAgICovCi0gIHBudCA9IHN0ciArIDE7CQkvKiBwb2ludCB0byBjaGFyYWN0ZXIgcGFzdCBlcXVhbCBzaWduICovCi0gIGlmICgqcG50ID49ICcwJyAmJiAqcG50IDw9ICc5JykKLSAgICB7Ci0gICAgICBpZiAodHlwZV9jaGVjayAoInZvaWQiKSkKLQl7CQkJLyogdGhpcyBpcyB0aGUgdm9pZCBzeW1ib2wgKi8KLQkgICpzdHIgPSAnXDAnOwotCSAgc3BudC0+YWR2YW5jZWQgPSBWT0lEOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKHR5cGVfY2hlY2sgKCJ1bmtub3duIHR5cGUiKSkKLQl7Ci0JICAqc3RyID0gJ1wwJzsKLQkgIHNwbnQtPmFkdmFuY2VkID0gVU5LTk9XTjsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50LCAmaTEpOwotICAgICAgaWYgKGkxICE9IHNwbnQtPmRieF90eXBlKQotCXsKLQkgIHNwbnQtPmFkdmFuY2VkID0gQUxJQVM7Ci0JICBzcG50LT50eXBlMiA9IGkxOwotCSAgc3RyY3B5IChzdHIsIHBudDEpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dpbmVyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB1bnR5cGVkIHZhcmlhYmxlLiIpLAotCQkgc3BudC0+ZGJ4X3R5cGUpOwotICAgICAgcmV0dXJuIDE7CQkJLyogZG8gbm90IGtub3cgd2hhdCB0aGlzIGlzICovCi0gICAgfQotCi0gIHBudCA9IHN0ciArIDE7CQkvKiBwb2ludCB0byBjaGFyYWN0ZXIgcGFzdCBlcXVhbCBzaWduICovCi0gIHN3aXRjaCAoKnBudCkKLSAgICB7Ci0gICAgY2FzZSAncic6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IEJBU0lDOwotICAgICAgaWYgKHR5cGVfY2hlY2sgKCJpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0xJTlQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TTElOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInVuc2lnbmVkIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VTElOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgdW5zaWduZWQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VMSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgic2hvcnQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NTSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgic2hvcnQgdW5zaWduZWQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VTSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY2hhciIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TQ0hBUjsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNpZ25lZCBjaGFyIikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NDSEFSOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgidW5zaWduZWQgY2hhciIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VQ0hBUjsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImZsb2F0IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1JFQUw0OwotCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiZG91YmxlIikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19SRUFMOF9HIDogREJHX1NfQ19SRUFMODsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgZG91YmxlIikpCi0JewotCSAgLyogc2FtZSBhcyBkb3VibGUsIGF0IGxlYXN0IGZvciBub3cgKi8KLQkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfUkVBTDhfRyA6IERCR19TX0NfUkVBTDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGxvbmcgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NRVUFEOwkvKiBzaWduZWQgcXVhZHdvcmQgKi8KLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVVFVQUQ7CS8qIHVuc2lnbmVkIHF1YWR3b3JkICovCi0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJjb21wbGV4IGZsb2F0IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0NPTVBMWDQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAyICogNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBkb3VibGUiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IHZheF9nX2RvdWJsZXMgPyBEQkdfU19DX0NPTVBMWDhfRyA6IERCR19TX0NfQ09NUExYODsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDIgKiA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJjb21wbGV4IGxvbmcgZG91YmxlIikpCi0JewotCSAgLyogc2FtZSBhcyBjb21wbGV4IGRvdWJsZSwgYXQgbGVhc3QgZm9yIG5vdyAqLwotCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19DT01QTFg4X0cgOiBEQkdfU19DX0NPTVBMWDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAyICogODsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoJW3ByXQotCSAgICogU2hvdWxkbid0IGdldCBoZXJlLCBidXQgaWYgd2UgZG8sIHNvbWV0aGluZwotCSAgICogbW9yZSBzdWJzdGFudGlhbCBvdWdodCB0byBiZSBkb25lLi4uCi0JICAgKi8KLQkgIHNwbnQtPlZNU190eXBlID0gMDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDA7Ci0JfQotICAgICAgaWYgKHNwbnQtPlZNU190eXBlICE9IDApCi0Jc2V0dXBfYmFzaWNfdHlwZSAoc3BudCk7Ci0gICAgICBwbnQxID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc7JykgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAndSc6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9ICgqcG50ID09ICdzJykgPyBTVFJVQ1QgOiBVTklPTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+ZGF0YV9zaXplKTsKLSAgICAgIGlmICghZmluYWxfcGFzcyAmJiBmb3J3YXJkX3JlZmVyZW5jZSAocG50KSkKLQl7Ci0JICBzcG50LT5zdHJ1Y19udW1iID0gLTE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBzcG50LT5zdHJ1Y19udW1iID0gKytzdHJ1Y3R1cmVfY291bnQ7Ci0gICAgICBwbnQxLS07Ci0gICAgICBwbnQgPSBnZXRfc3RydWN0X25hbWUgKHN0cik7Ci0gICAgICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIGZvciAoZnBudCA9IGZfcmVmX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotCWlmIChmcG50LT5kYnhfdHlwZSA9PSBzcG50LT5kYnhfdHlwZSkKLQkgIHsKLQkgICAgZnBudC0+cmVzb2x2ZWQgPSAnWSc7Ci0JICAgIFZNU19TZXRfU3RydWN0IChmcG50LT5zdHJ1Y19udW1iKTsKLQkgICAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0JICAgIGkrKzsKLQkgIH0KLSAgICAgIGlmIChpID4gMCkKLQlWTVNfU2V0X1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIExvY2FsW2krK10gPSAxMSArIHN0cmxlbiAocG50KTsKLSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX1NUUlVDVF9TVEFSVDsKLSAgICAgIExvY2FsW2krK10gPSBEU1RfS19WRkxBR1NfTk9WQUw7CS8qIHN0cnVjdHVyZSBkZWZpbml0aW9uIG9ubHkgKi8KLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCAwTCk7CS8qIGhlbmNlIHZhbHVlIGlzIHVudXNlZCAqLwotICAgICAgaSArPSA0OwotICAgICAgTG9jYWxbaSsrXSA9IHN0cmxlbiAocG50KTsKLSAgICAgIHBudDIgPSBwbnQ7Ci0gICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKLQlMb2NhbFtpKytdID0gKnBudDIrKzsKLSAgICAgIGkyID0gc3BudC0+ZGF0YV9zaXplICogODsJLyogbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7Ci0gICAgICBpICs9IDQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIGlmIChwbnQgIT0gc3ltYm9sX25hbWUpCi0JewotCSAgcG50ICs9IHN0cmxlbiAocG50KTsKLQkgICpwbnQgPSAnOic7Ci0JfQkJCS8qIHJlcGxhY2UgY29sb24gZm9yIGxhdGVyICovCi0gICAgICB3aGlsZSAoKisrcG50MSAhPSAnOycpCi0JewotCSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChwbnQxLCAnOicpOwotCSAgKnBudCA9ICdcMCc7Ci0JICBwbnQyID0gcG50MTsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmR0eXBlKTsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZpMik7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmaTMpOwotCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoZHR5cGUpOwotCSAgbGVuID0gc3RybGVuIChwbnQyKTsKLQkgIGlmIChzcG50MSAmJiAoc3BudDEtPmFkdmFuY2VkID09IEJBU0lDIHx8IHNwbnQxLT5hZHZhbmNlZCA9PSBFTlVNKQotCSAgICAgICYmICgoaTMgIT0gc3BudDEtPmRhdGFfc2l6ZSAqIDgpIHx8IChpMiAlIDggIT0gMCkpKQotCSAgICB7CQkJLyogYml0ZmllbGQgKi8KLQkgICAgICBpZiAoVVNFX0JJVFNUUklOR19ERVNDUklQVE9SIChzcG50MSkpCi0JCXsKLQkJICAvKiBUaGlzIHVzZXMgYSB0eXBlIGRlc2NyaXB0b3IsIHdoaWNoIGRvZXNuJ3Qgd29yayBpZgotCQkgICAgIHRoZSBlbmNsb3Npbmcgc3RydWN0dXJlIGhhcyBiZWVuIHBsYWNlZCBpbiBhIHJlZ2lzdGVyLgotCQkgICAgIEFsc28sIGVudW0gYml0ZmllbGRzIGRlZ2VuZXJhdGUgdG8gc2ltcGxlIGludGVnZXJzLiAgKi8KLQkJICBpbnQgdW5zaWduZWRfdHlwZSA9IChzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VTElOVAotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VU0lOVAotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VQ0hBUgotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VUVVBRAotCQkJCSAgICB8fCBzcG50MS0+YWR2YW5jZWQgPT0gRU5VTSk7IC8qIChhcHByb3hpbWF0ZSkgKi8KLQkJICBBcG9pbnQgPSAwOwotCQkgIGZwdXNoICgxOSArIGxlbiwgMSk7Ci0JCSAgZnB1c2ggKHVuc2lnbmVkX3R5cGUgPyBEQkdfU19DX1VCSVRVIDogREJHX1NfQ19TQklUVSwgMSk7Ci0JCSAgZnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwkvKiBzcGVjaWZpZWQgYnkgZGVzY3JpcHRvciAqLwotCQkgIGZwdXNoICgxICsgbGVuLCA0KTsJLyogcmVsYXRpdmUgb2Zmc2V0IHRvIGRlc2NyaXB0b3IgKi8KLQkJICBmcHVzaCAobGVuLCAxKTsJCS8qIGxlbmd0aCBieXRlIChhc2NpYyBwcmVmaXgpICovCi0JCSAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCS8qIG5hbWUgYnl0ZXMgKi8KLQkJICAgIGZwdXNoICgqcG50MisrLCAxKTsKLQkJICBmcHVzaCAoaTMsIDIpOwkvKiBkc2MgbGVuZ3RoID09IHNpemUgb2YgYml0ZmllbGQgKi8KLQkJCQkJLyogZHNjIHR5cGUgPT0gdW4/c2lnbmVkIGJpdGZpZWxkICovCi0JCSAgZnB1c2ggKHVuc2lnbmVkX3R5cGUgPyBEQkdfU19DX1VCSVRVIDogREJHX1NfQ19TQklUVSwgMSk7Ci0JCSAgZnB1c2ggKERTQ19LX0NMQVNTX1VCUywgMSk7CS8qIGRzYyBjbGFzcyA9PSB1bmFsaWduZWQgYml0c3RyaW5nICovCi0JCSAgZnB1c2ggKDB4MDAsIDQpOwkJLyogZHNjIHBvaW50ZXIgPT0gemVyb2VzICovCi0JCSAgZnB1c2ggKGkyLCA0KTsJLyogc3RhcnQgcG9zaXRpb24gKi8KLQkJICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKEFzdWZmaXgsIEFwb2ludCwgT0JKX1NfQ19EQkcpOwotCQkgIEFwb2ludCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBVc2UgYSAibm92ZWwgbGVuZ3RoIiB0eXBlIHNwZWNpZmljYXRpb24sIHdoaWNoIHdvcmtzCi0JCSAgICAgcmlnaHQgZm9yIHJlZ2lzdGVyIHN0cnVjdHVyZXMgYW5kIGZvciBlbnVtIGJpdGZpZWxkcwotCQkgICAgIGJ1dCByZXN1bHRzIGluIGxhcmdlciBvYmplY3QgbW9kdWxlcy4gICovCi0JCSAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0JCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsJLyogdHlwZSBzcGVjIGZvbGxvd3MgKi8KLQkJICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfSVRFTTsJLyogdmFsdWUgaXMgYSBiaXQgb2Zmc2V0ICovCi0JCSAgQ09QWV9MT05HICgmTG9jYWxbaV0sIGkyKTsJCS8qIGJpdCBvZmZzZXQgKi8KLQkJICBpICs9IDQ7Ci0JCSAgTG9jYWxbaSsrXSA9IHN0cmxlbiAocG50Mik7Ci0JCSAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCi0JCSAgICBMb2NhbFtpKytdID0gKnBudDIrKzsKLQkJICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JCSAgaSA9IDA7Ci0JCSAgYml0ZmllbGRfc3VmZml4IChzcG50MSwgaTMpOwotCSAgICAgfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsJCQkvKiBub3QgYSBiaXRmaWVsZCAqLwotCSAgICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSAqLwotCSAgICAgIGlmIChmaW5hbF9wYXNzICYmIGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlIChzcG50MSkpCi0JCXsKLQkJICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogc3RydWN0dXJlIGVsZW1lbnQgYCVzJyBoYXMgdW5kZWZpbmVkIHR5cGUiKSwKLQkJCSAgIHBudDIpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0JICAgICAgTG9jYWxbaSsrXSA9IHNwbnQxID8gc3BudDEtPlZNU190eXBlIDogREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotCSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX1NUUlVDVF9JVEVNOwotCSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7CQkvKiBiaXQgb2Zmc2V0ICovCi0JICAgICAgaSArPSA0OwotCSAgICAgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudDIpOwotCSAgICAgIHdoaWxlICgqcG50MiAhPSAnXDAnKQotCQlMb2NhbFtpKytdID0gKnBudDIrKzsKLQkgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JICAgICAgaSA9IDA7Ci0JICAgICAgaWYgKCFzcG50MSkKLQkJZ2VuZXJhdGVfc3VmZml4IChzcG50MSwgZHR5cGUpOwotCSAgICAgIGVsc2UgaWYgKHNwbnQxLT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCi0JCWdlbmVyYXRlX3N1ZmZpeCAoc3BudDEsIDApOwotCSAgICB9Ci0JfQotICAgICAgcG50MSsrOwotICAgICAgTG9jYWxbaSsrXSA9IDB4MDE7CS8qIGxlbmd0aCBieXRlICovCi0gICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfRU5EOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdlJzoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gRU5VTTsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKLSAgICAgIFZNU19EZWZfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLSAgICAgIGkgPSAwOwotICAgICAgZm9yIChmcG50ID0gZl9yZWZfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0JaWYgKGZwbnQtPmRieF90eXBlID09IHNwbnQtPmRieF90eXBlKQotCSAgewotCSAgICBmcG50LT5yZXNvbHZlZCA9ICdZJzsKLQkgICAgVk1TX1NldF9TdHJ1Y3QgKGZwbnQtPnN0cnVjX251bWIpOwotCSAgICBWTVNfU3RvcmVfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLQkgICAgaSsrOwotCSAgfQotICAgICAgaWYgKGkgPiAwKQotCVZNU19TZXRfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLSAgICAgIGkgPSAwOwotICAgICAgbGVuID0gc3RybGVuIChzeW1ib2xfbmFtZSk7Ci0gICAgICBMb2NhbFtpKytdID0gMyArIGxlbjsKLSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fU1RBUlQ7Ci0gICAgICBMb2NhbFtpKytdID0gNCAqIDg7CQkvKiBlbnVtIHZhbHVlcyBhcmUgMzIgYml0cyAqLwotICAgICAgTG9jYWxbaSsrXSA9IGxlbjsKLSAgICAgIHBudDIgPSBzeW1ib2xfbmFtZTsKLSAgICAgIHdoaWxlICgqcG50MiAhPSAnXDAnKQotCUxvY2FsW2krK10gPSAqcG50MisrOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICB3aGlsZSAoKisrcG50ICE9ICc7JykKLQl7Ci0JICBwbnQxID0gKGNoYXIgKikgc3RyY2hyIChwbnQsICc6Jyk7Ci0JICAqcG50MSsrID0gJ1wwJzsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSwgJmkxKTsKLQkgIGxlbiA9IHN0cmxlbiAocG50KTsKLQkgIExvY2FsW2krK10gPSA3ICsgbGVuOwotCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfRU5VTV9JVEVNOwotCSAgTG9jYWxbaSsrXSA9IERTVF9LX1ZBTEtJTkRfTElURVJBTDsKLQkgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMSk7Ci0JICBpICs9IDQ7Ci0JICBMb2NhbFtpKytdID0gbGVuOwotCSAgcG50MiA9IHBudDsKLQkgIHdoaWxlICgqcG50ICE9ICdcMCcpCi0JICAgIExvY2FsW2krK10gPSAqcG50Kys7Ci0JICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JICBpID0gMDsKLQkgIHBudCA9IHBudDE7CQkvKiBTa2lwIGZpbmFsIHNlbWljb2xvbiAqLwotCX0KLSAgICAgIExvY2FsW2krK10gPSAweDAxOwkvKiBsZW4gYnl0ZSAqLwotICAgICAgTG9jYWxbaSsrXSA9IERCR19TX0NfRU5VTV9FTkQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIHBudDEgPSBwbnQgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYSc6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IEFSUkFZOwotICAgICAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7Ci0gICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHBudCwgJzsnKTsKLSAgICAgIGlmICghcG50KQotCXJldHVybiAxOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+aW5kZXhfbWluKTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZzcG50LT5pbmRleF9tYXgpOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQxICsgMSwgJnNwbnQtPnR5cGUyKTsKLSAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKLSAgICAgIGlmIChwbnQgJiYgVk1TX3R5cGVkZWZfcGFyc2UgKHBudCkgPT0gMSkKLQlyZXR1cm4gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2YnOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBGVU5DVElPTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19GVU5DVElPTl9BRERSOwotICAgICAgLyogdGhpcyBtYXNxdWVyYWRlcyBhcyBhIGJhc2ljIHR5cGUqLwotICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPnR5cGUyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJyonOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBQT0lOVEVSOwotICAgICAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7Ci0gICAgICBzcG50LT5kYXRhX3NpemUgPSA0OwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+dHlwZTIpOwotICAgICAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIgKyAxLCAnPScpOwotICAgICAgaWYgKHBudCAmJiBWTVNfdHlwZWRlZl9wYXJzZSAocG50KSA9PSAxKQotCXJldHVybiAxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gVU5LTk9XTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gMDsKLSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgb3V0cHV0OiAlZCBpcyBhbiB1bmtub3duIHR5cGUgb2YgdmFyaWFibGUuIiksCi0JCSBzcG50LT5kYnhfdHlwZSk7Ci0gICAgICByZXR1cm4gMTsJCQkvKiB1bmFibGUgdG8gZGVjaXBoZXIgKi8KLSAgICB9Ci0gIC8qIFRoaXMgcmVtb3ZlcyB0aGUgZXZpZGVuY2Ugb2YgdGhlIGRlZmluaXRpb24gc28gdGhhdCB0aGUgb3V0ZXIgbGV2ZWxzCi0gICAgIG9mIHBhcnNpbmcgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQuICAqLwotICBwbnQgPSBzdHI7Ci0gIHdoaWxlICgqcG50MSAhPSAnXDAnKQotICAgICpwbnQrKyA9ICpwbnQxKys7Ci0gICpwbnQgPSAnXDAnOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGlzIGlzIHRoZSByb290IHJvdXRpbmUgdGhhdCBwYXJzZXMgdGhlIHN0YWJzIGVudHJpZXMgZm9yIGRlZmluaXRpb25zLgotICAgaXQgY2FsbHMgVk1TX3R5cGVkZWZfcGFyc2UsIHdoaWNoIGNhbiBpbiB0dXJuIGNhbGwgaXRzZWxmLiAgV2UgbmVlZCB0bwotICAgYmUgY2FyZWZ1bCwgc2luY2Ugc29tZXRpbWVzIHRoZXJlIGFyZSBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gb3RoZXIgc3ltYm9sCi0gICB0eXBlcywgYW5kIHRoZXNlIGNhbm5vdCBiZSByZXNvbHZlZCB1bnRpbCB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgcGFyc2UuCi0KLSAgIEFsc28gY2hlY2sgYW5kIHNlZSBpZiB3ZSBhcmUgdXNpbmcgY29udGludWF0aW9uIHN0YWJzLCBpZiB3ZSBhcmUsIHRoZW4KLSAgIHBhc3RlIHRvZ2V0aGVyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHN0YWIgYmVmb3JlIHdlIHBhc3MgaXQgdG8KLSAgIFZNU190eXBlZGVmX3BhcnNlLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19MU1lNX1BhcnNlICgpCi17Ci0gIGNoYXIgKnBudDsKLSAgY2hhciAqcG50MTsKLSAgY2hhciAqcG50MjsKLSAgY2hhciAqc3RyOwotICBjaGFyICpwYXJzZV9idWZmZXIgPSAwOwotICBjaGFyIGZpeGl0WzEwXTsKLSAgaW50IGluY29tcGxldGUsIHBhc3MsIGluY29tMTsKLSAgc3RydWN0IGZvcndhcmRfcmVmICpmcG50OwotICBzeW1ib2xTICpzcDsKLQotICBwYXNzID0gMDsKLSAgZmluYWxfcGFzcyA9IDA7Ci0gIGluY29tcGxldGUgPSAwOwotICBkbwotICAgIHsKLSAgICAgIGluY29tMSA9IGluY29tcGxldGU7Ci0gICAgICBpbmNvbXBsZXRlID0gMDsKLSAgICAgIGZvciAoc3AgPSBzeW1ib2xfcm9vdFA7IHNwOyBzcCA9IHN5bWJvbF9uZXh0IChzcCkpCi0JewotCSAgLyoKLQkgICAqCURlYWwgd2l0aCBTVEFCIHN5bWJvbHMKLQkgICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwKSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0JICAgICAgICovCi0JICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ApKQotCQl7Ci0JCWNhc2UgTl9HU1lNOgotCQljYXNlIE5fTENTWU06Ci0JCWNhc2UgTl9TVFNZTToKLQkJY2FzZSBOX1BTWU06Ci0JCWNhc2UgTl9SU1lNOgotCQljYXNlIE5fTFNZTToKLQkJY2FzZSBOX0ZVTjoJLypzb21ldGltZXMgdGhlc2UgY29udGFpbiB0eXBlZGVmcyovCi0JCSAgc3RyID0gU19HRVRfTkFNRSAoc3ApOwotCQkgIHN5bWJvbF9uYW1lID0gc3RyOwotCQkgIHBudCA9IHN0ciArIHN0cmxlbiAoc3RyKSAtIDE7Ci0JCSAgaWYgKCpwbnQgPT0gJz8nKSAgLyogQ29udGludWF0aW9uIHN0YWIuICAqLwotCQkgICAgewotCQkgICAgICBzeW1ib2xTICpzcG5leHQ7Ci0JCSAgICAgIGludCB0bGVuID0gMDsKLQotCQkgICAgICBzcG5leHQgPSBzcDsKLQkJICAgICAgZG8gewotCQkJdGxlbiArPSBzdHJsZW4gKHN0cikgLSAxOwotCQkJc3BuZXh0ID0gc3ltYm9sX25leHQgKHNwbmV4dCk7Ci0JCQlzdHIgPSBTX0dFVF9OQU1FIChzcG5leHQpOwotCQkJcG50ID0gc3RyICsgc3RybGVuIChzdHIpIC0gMTsKLQkJICAgICAgfSB3aGlsZSAoKnBudCA9PSAnPycpOwotCQkgICAgICB0bGVuICs9IHN0cmxlbiAoc3RyKTsKLQkJICAgICAgcGFyc2VfYnVmZmVyID0gKGNoYXIgKikgeG1hbGxvYyAodGxlbiArIDEpOwotCQkgICAgICBzdHJjcHkgKHBhcnNlX2J1ZmZlciwgU19HRVRfTkFNRSAoc3ApKTsKLQkJICAgICAgcG50MiA9IHBhcnNlX2J1ZmZlciArIHN0cmxlbiAocGFyc2VfYnVmZmVyKSAtIDE7Ci0JCSAgICAgICpwbnQyID0gJ1wwJzsKLQkJICAgICAgc3BuZXh0ID0gc3A7Ci0JCSAgICAgIGRvIHsKLQkJCXNwbmV4dCA9IHN5bWJvbF9uZXh0IChzcG5leHQpOwotCQkJc3RyID0gU19HRVRfTkFNRSAoc3BuZXh0KTsKLQkJCXN0cmNhdCAocG50Miwgc3RyKTsKLQkJCXBudDIgKz0gIHN0cmxlbiAoc3RyKSAtIDE7Ci0JCQkqc3RyID0gJ1wwJzsgIC8qIEVyYXNlIHRoaXMgc3RyaW5nICAqLwotCQkgICAgIC8qIFNfU0VUX05BTUUgKHNwbmV4dCwgc3RyKTsgKi8KLQkJCWlmICgqcG50MiAhPSAnPycpIGJyZWFrOwotCQkJKnBudDIgPSAnXDAnOwotCQkgICAgICB9IHdoaWxlICgxKTsKLQkJICAgICAgc3RyID0gcGFyc2VfYnVmZmVyOwotCQkgICAgICBzeW1ib2xfbmFtZSA9IHN0cjsKLQkJICAgIH0KLQkJICBpZiAoKHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpKSAhPSAwKQotCQkgICAgewotCQkgICAgICAqcG50ID0gJ1wwJzsKLQkJICAgICAgcG50MSA9IHBudCArIDE7Ci0JCSAgICAgIGlmICgocG50MiA9IChjaGFyICopIHN0cmNociAocG50MSwgJz0nKSkgIT0gMCkKLQkJCWluY29tcGxldGUgKz0gVk1TX3R5cGVkZWZfcGFyc2UgKHBudDIpOwotCQkgICAgICBpZiAocGFyc2VfYnVmZmVyKQotCQkJewotCQkJICAvKiAgQXQgdGhpcyBwb2ludCB0aGUgcGFyc2UgYnVmZmVyIHNob3VsZCBqdXN0Ci0JCQkgICAgICBjb250YWluIG5hbWU6bm4uICBJZiBpdCBkb2VzIG5vdCwgdGhlbiB3ZQotCQkJICAgICAgYXJlIGluIHJlYWwgdHJvdWJsZS4gIEFueXdheSwgdGhpcyBpcyBhbHdheXMKLQkJCSAgICAgIHNob3J0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgbGluZS4gICovCi0JCQkgIHBudDIgPSBTX0dFVF9OQU1FIChzcCk7Ci0JCQkgIHN0cmNweSAocG50MiwgcGFyc2VfYnVmZmVyKTsKLQkJICAgICAgIC8qIFNfU0VUX05BTUUgKHNwLCBwbnQyKTsgKi8KLQkJCSAgZnJlZSAocGFyc2VfYnVmZmVyKSwgIHBhcnNlX2J1ZmZlciA9IDA7Ci0JCQl9Ci0JCSAgICAgICpwbnQgPSAnOic7CS8qIHB1dCBiYWNrIGNvbG9uIHRvIHJlc3RvcmUgZGJ4X3R5cGUgKi8KLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQkJLypzd2l0Y2gqLwotCSAgICB9CQkJLyogaWYgKi8KLQl9CQkJLypmb3IqLwotICAgICAgcGFzcysrOwotICAgICAgLyoKLSAgICAgICAqIE1ha2Ugb25lIGxhc3QgcGFzcywgaWYgbmVlZGVkLCBhbmQgZGVmaW5lIHdoYXRldmVyIHdlIGNhbgotICAgICAgICogdGhhdCBpcyBsZWZ0LgotICAgICAgICovCi0gICAgICBpZiAoZmluYWxfcGFzcyA9PSAwICYmIGluY29tcGxldGUgPT0gaW5jb20xKQotCXsKLQkgIGZpbmFsX3Bhc3MgPSAxOwotCSAgaW5jb20xKys7CS8qIEZvcmNlIG9uZSBsYXN0IHBhc3MgdGhyb3VnaCAqLwotCX0KLSAgfSB3aGlsZSAoaW5jb21wbGV0ZSAhPSAwICYmIGluY29tcGxldGUgIT0gaW5jb20xKTsKLSAgLyogcmVwZWF0IHVudGlsIGFsbCByZWZzIHJlc29sdmVkIGlmIHBvc3NpYmxlICovCi0vKglpZiAocGFzcyA+IDEpIHByaW50ZiAoIiBSZXF1aXJlZCAlZCBwYXNzZXNcbiIsIHBhc3MpOyAqLwotICBpZiAoaW5jb21wbGV0ZSAhPSAwKQotICAgIHsKLSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgb3V0cHV0OiBVbmFibGUgdG8gcmVzb2x2ZSAlZCBjaXJjdWxhciByZWZlcmVuY2VzLiIpLAotCQkgaW5jb21wbGV0ZSk7Ci0gICAgfQotICBmcG50ID0gZl9yZWZfcm9vdDsKLSAgc3ltYm9sX25hbWUgPSAiXDAiOwotICB3aGlsZSAoZnBudCkKLSAgICB7Ci0gICAgICBpZiAoZnBudC0+cmVzb2x2ZWQgIT0gJ1knKQotCXsKLQkgIGlmIChmaW5kX3N5bWJvbCAoZnBudC0+ZGJ4X3R5cGUpKQotCSAgICB7Ci0JICAgICAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dlciBmb3J3YXJkIHJlZmVyZW5jZSBlcnJvciwgZGJ4IHR5cGUgJWQiKSwKLQkJCSBmcG50LT5kYnhfdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGZpeGl0WzBdID0gMDsKLQkgIHNwcmludGYgKCZmaXhpdFsxXSwgIiVkPXM0OyIsIGZwbnQtPmRieF90eXBlKTsKLQkgIHBudDIgPSAoY2hhciAqKSBzdHJjaHIgKCZmaXhpdFsxXSwgJz0nKTsKLQkgIFZNU190eXBlZGVmX3BhcnNlIChwbnQyKTsKLQl9Ci0gICAgICBmcG50ID0gZnBudC0+bmV4dDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURlZmluZV9Mb2NhbF9TeW1ib2xzIChzMFAsIHMyUCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzMFAsICpzMlA7Ci0gICAgIHN5bWJvbFMgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnMxUDsJCS8qIGVhY2ggc3ltYm9sIGZyb20gczBQIC4uIHMyUCAoZXhjbHVzaXZlKSAqLwotCi0gIGZvciAoczFQID0gc3ltYm9sX25leHQgKHMwUCk7IHMxUCAhPSBzMlA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIGlmICghczFQKQotCWJyZWFrOwkJLyogYW5kIHJldHVybiAqLwotICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzMVApID09IE5fRlVOKQotCXsKLQkgIGNoYXIgKnBudCA9IChjaGFyICopIHN0cmNociAoU19HRVRfTkFNRSAoczFQKSwgJzonKSArIDE7Ci0JICBpZiAoKnBudCA9PSAnRicgfHwgKnBudCA9PSAnZicpIGJyZWFrOwotCX0KLSAgICAgIGlmICghU19JU19ERUJVRyAoczFQKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKLSAgICAgICAqLwotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoczFQKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGNvbnRpbnVlOwkJLyogbm90IGxlZnQgb3IgcmlnaHQgYnJhY2UgKi8KLQotCWNhc2UgTl9MU1lNOgotCWNhc2UgTl9QU1lNOgotCSAgVk1TX2xvY2FsX3N0YWJfUGFyc2UgKHMxUCk7Ci0JICBicmVhazsKLQotCWNhc2UgTl9SU1lNOgotCSAgVk1TX1JTWU1fUGFyc2UgKHMxUCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLQkgIGJyZWFrOwotCX0JCQkvKnN3aXRjaCovCi0gICAgfQkJCQkvKiBmb3IgKi8KLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNyYXdscyB0aGUgc3ltYm9sIGNoYWluIHNlYXJjaGluZyBmb3IgbG9jYWwgc3ltYm9scyB0aGF0Ci0gICBuZWVkIHRvIGJlIGRlc2NyaWJlZCB0byB0aGUgZGVidWdnZXIuICBXaGVuIHdlIGVudGVyIGEgbmV3IHNjb3BlIHdpdGgKLSAgIGEgInsiLCBpdCBjcmVhdGVzIGEgbmV3ICJibG9jayIsIHdoaWNoIGhlbHBzIHRoZSBkZWJ1Z2dlciBrZWVwIHRyYWNrCi0gICBvZiB3aGljaCBzY29wZSB3ZSBhcmUgY3VycmVudGx5IGluLiAgKi8KLQotc3RhdGljIHN5bWJvbFMgKgotRGVmaW5lX1JvdXRpbmUgKHMwUCwgTGV2ZWwsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqczBQOwotICAgICBpbnQgTGV2ZWw7Ci0gICAgIHN5bWJvbFMgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnMxUDsKLSAgdmFsdWVUIE9mZnNldDsKLSAgaW50IHJjb3VudCA9IDA7Ci0KLSAgZm9yIChzMVAgPSBzeW1ib2xfbmV4dCAoczBQKTsgczFQICE9IDA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoczFQKSA9PSBOX0ZVTikKLQl7Ci0JICBjaGFyICpwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHMxUCksICc6JykgKyAxOwotCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKLQl9Ci0gICAgICBpZiAoIVNfSVNfREVCVUcgKHMxUCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHMxUCkpCi0JewotCWRlZmF1bHQ6Ci0JICBjb250aW51ZTsJCS8qIG5vdCBsZWZ0IG9yIHJpZ2h0IGJyYWNlICovCi0KLQljYXNlIE5fTEJSQUM6Ci0JICBpZiAoTGV2ZWwgIT0gMCkKLQkgICAgewotCSAgICAgIGNoYXIgc3RyWzEwXTsKLQkgICAgICBzcHJpbnRmIChzdHIsICIkJWQiLCByY291bnQrKyk7Ci0JICAgICAgVk1TX1RCVF9CbG9ja19CZWdpbiAoczFQLCBUZXh0X1BzZWN0LCBzdHIpOwotCSAgICB9Ci0JICBPZmZzZXQgPSBTX0dFVF9WQUxVRSAoczFQKTsJLyogc2lkZS1lZmZlY3Q6IGZ1bGx5IHJlc29sdmUgc3ltYm9sICovCi0JICBEZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCBzMVAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICBzMVAgPSBEZWZpbmVfUm91dGluZSAoczFQLCBMZXZlbCArIDEsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICBpZiAoTGV2ZWwgIT0gMCkKLQkgICAgVk1TX1RCVF9CbG9ja19FbmQgKFNfR0VUX1ZBTFVFIChzMVApIC0gT2Zmc2V0KTsKLQkgIHMwUCA9IHMxUDsKLQkgIGJyZWFrOwotCi0JY2FzZSBOX1JCUkFDOgotCSAgcmV0dXJuIHMxUDsKLQl9CQkJLypzd2l0Y2gqLwotICAgIH0JCQkJLyogZm9yICovCi0KLSAgLyogV2UgZW5kIHVwIGhlcmUgaWYgdGhlcmUgd2VyZSBubyBicmFja2V0cyBpbiB0aGlzIGZ1bmN0aW9uLgotICAgICBEZWZpbmUgZXZlcnl0aGluZy4gICovCi0gIERlZmluZV9Mb2NhbF9TeW1ib2xzIChzMFAsIChzeW1ib2xTICopMCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLSAgcmV0dXJuIHMxUDsKLX0KLQwKLQotI2lmbmRlZiBWTVMKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1zdGF0aWMgdm9pZCBnZXRfVk1TX3RpbWVfb25fdW5peCBQQVJBTVMgKChjaGFyICopKTsKLQotLyogTWFudWZhY3R1cmUgYSBWTVMtbGlrZSB0aW1lIHN0cmluZyBvbiBhIFVuaXggYmFzZWQgc3lzdGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1nZXRfVk1TX3RpbWVfb25fdW5peCAoTm93KQotICAgICBjaGFyICpOb3c7Ci17Ci0gIGNoYXIgKnBudDsKLSAgdGltZV90IHRpbWViOwotCi0gIHRpbWUgKCZ0aW1lYik7Ci0gIHBudCA9IGN0aW1lICgmdGltZWIpOwotICBwbnRbM10gPSAwOwotICBwbnRbN10gPSAwOwotICBwbnRbMTBdID0gMDsKLSAgcG50WzE2XSA9IDA7Ci0gIHBudFsyNF0gPSAwOwotICBzcHJpbnRmIChOb3csICIlMnMtJTNzLSVzICVzIiwgcG50ICsgOCwgcG50ICsgNCwgcG50ICsgMjAsIHBudCArIDExKTsKLX0KLSNlbmRpZiAvKiBub3QgVk1TICovCi0KLQotLyogV3JpdGUgdGhlIE1IRCAoTW9kdWxlIEhlYWRlcikgcmVjb3Jkcy4gICovCi0KLXN0YXRpYyB2b2lkCi1Xcml0ZV9WTVNfTUhEX1JlY29yZHMgKCkKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwMTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0jaWZkZWYgVk1TCi0gIHN0cnVjdCB7IHVuc2lnbmVkIHNob3J0IGxlbiwgbWJ6OyBjaGFyICpwdHI7IH0gRGVzY3JpcHRvcjsKLSNlbmRpZgotICBjaGFyIE5vd1sxNysxXTsKLQotICAvKiBXZSBhcmUgd3JpdGluZyBhIG1vZHVsZSBoZWFkZXIgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfSERSKTsKLSAgLyoKLSAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCSpNQUlOIE1PRFVMRSBIRUFERVIgUkVDT1JEKgotICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICovCi0gIC8qIFN0b3JlIHJlY29yZCB0eXBlIGFuZCBoZWFkZXIgdHlwZS4gICovCi0gIFBVVF9DSEFSIChPQkpfU19DX0hEUik7Ci0gIFBVVF9DSEFSIChNSERfU19DX01IRCk7Ci0gIC8qIFN0cnVjdHVyZSBsZXZlbCBpcyAwLiAgKi8KLSAgUFVUX0NIQVIgKE9CSl9TX0NfU1RSTFZMKTsKLSAgLyogTWF4aW11bSByZWNvcmQgc2l6ZSBpcyBzaXplIG9mIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlci4gICovCi0gIFBVVF9TSE9SVCAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikpOwotCi0JLyoKLQkgKglGSVhNRTogIG1vZHVsZSBuYW1lIGFuZCB2ZXJzaW9uIHNob3VsZCBiZSB1c2VyCi0JICoJCXNwZWNpZmlhYmxlIHZpYSBgLmlkZW50JyBhbmQvb3IgYCNwcmFnbWEgaWRlbnQnLgotCSAqLwotCi0gIC8qIEdldCBtb2R1bGUgbmFtZSAodGhlIEZJTEVOQU1FIHBhcnQgb2YgdGhlIG9iamVjdCBmaWxlKS4gICovCi0gIGNwID0gb3V0X2ZpbGVfbmFtZTsKLSAgY3AxID0gTW9kdWxlX05hbWU7Ci0gIHdoaWxlICgqY3ApCi0gICAgewotICAgICAgaWYgKCpjcCA9PSAnXScgfHwgKmNwID09ICc+JyB8fCAqY3AgPT0gJzonIHx8ICpjcCA9PSAnLycpCi0JewotCSAgY3AxID0gTW9kdWxlX05hbWU7Ci0JICBjcCsrOwotCSAgY29udGludWU7Ci0JfQotICAgICAgKmNwMSsrID0gaXNsb3dlciAoKmNwKSA/IHRvdXBwZXIgKCpjcCsrKSA6ICpjcCsrOwotICAgIH0KLSAgKmNwMSA9ICdcMCc7Ci0KLSAgLyogTGltaXQgaXQgdG8gMzEgY2hhcmFjdGVycyBhbmQgc3RvcmUgaW4gdGhlIG9iamVjdCByZWNvcmQuICAqLwotICB3aGlsZSAoLS1jcDEgPj0gTW9kdWxlX05hbWUpCi0gICAgaWYgKCpjcDEgPT0gJy4nKQotICAgICAgKmNwMSA9ICdcMCc7Ci0gIGlmIChzdHJsZW4gKE1vZHVsZV9OYW1lKSA+IDMxKQotICAgIHsKLSAgICAgIGlmIChmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQlhc190c2t0c2sgKF8oIk1vZHVsZSBuYW1lIHRydW5jYXRlZDogJXNcbiIpLCBNb2R1bGVfTmFtZSk7Ci0gICAgICBNb2R1bGVfTmFtZVszMV0gPSAnXDAnOwotICAgIH0KLSAgUFVUX0NPVU5URURfU1RSSU5HIChNb2R1bGVfTmFtZSk7Ci0gIC8qIE1vZHVsZSBWZXJzaW9uIGlzICJWMS4wIi4gICovCi0gIFBVVF9DT1VOVEVEX1NUUklORyAoIlYxLjAiKTsKLSAgLyogQ3JlYXRpb24gdGltZSBpcyAibm93IiAoMTcgY2hhcnMgb2YgdGltZSBzdHJpbmcpOiAiZGQtTU1NLXl5eXkgaGg6bW0iLiAgKi8KLSNpZm5kZWYgVk1TCi0gIGdldF9WTVNfdGltZV9vbl91bml4IChOb3cpOwotI2Vsc2UgLyogVk1TICovCi0gIERlc2NyaXB0b3IubGVuID0gc2l6ZW9mIE5vdyAtIDE7Ci0gIERlc2NyaXB0b3IubWJ6ID0gMDsJCS8qIHR5cGUgJiBjbGFzcyB1bnNwZWNpZmllZCAqLwotICBEZXNjcmlwdG9yLnB0ciA9IE5vdzsKLSAgKHZvaWQpIHN5cyRhc2N0aW0gKCh1bnNpZ25lZCBzaG9ydCAqKTAsICZEZXNjcmlwdG9yLCAobG9uZyAqKTAsIDApOwotI2VuZGlmIC8qIFZNUyAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKLSAgICBQVVRfQ0hBUiAoTm93W2ldKTsKLSAgLyogUGF0Y2ggdGltZSBpcyAibmV2ZXIiICgxNyB6ZXJvcykuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKLSAgICBQVVRfQ0hBUiAoMCk7Ci0gIC8qIEZvcmNlIHRoaXMgdG8gYmUgYSBzZXBhcmF0ZSBvdXRwdXQgcmVjb3JkLiAgKi8KLSAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotCi0gIC8qCi0gICAqCSoqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoJKkxBTkdVQUdFIFBST0NFU1NPUiBOQU1FKgotICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqLwotICAvKiBTdG9yZSByZWNvcmQgdHlwZSBhbmQgaGVhZGVyIHR5cGUuICAqLwotICBQVVRfQ0hBUiAoT0JKX1NfQ19IRFIpOwotICBQVVRfQ0hBUiAoTUhEX1NfQ19MTk0pOwotICAvKgotICAgKiBTdG9yZSBsYW5ndWFnZSBwcm9jZXNzb3IgbmFtZSBhbmQgdmVyc2lvbiAobm90IGEgY291bnRlZCBzdHJpbmchKS4KLSAgICoKLSAgICogVGhpcyBpcyBub3JtYWxseSBzdXBwbGllZCBieSB0aGUgZ2NjIGRyaXZlciBmb3IgdGhlIGNvbW1hbmQgbGluZQotICAgKiB3aGljaCBpbnZva2VzIGdhcy4gIElmIGFic2VudCwgd2UgZmFsbCBiYWNrIHRvIGdhcydzIHZlcnNpb24uCi0gICAqLwotICBjcCA9IGNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nOwotICBpZiAoY3AgPT0gMCkKLSAgICB7Ci0gICAgICBjcCA9ICJHTlUgQVMgIFYiOwotICAgICAgd2hpbGUgKCpjcCkKLQlQVVRfQ0hBUiAoKmNwKyspOwotICAgICAgY3AgPSBWRVJTSU9OOwotICAgIH0KLSAgd2hpbGUgKCpjcCA+PSAnICcpCi0gICAgUFVUX0NIQVIgKCpjcCsrKTsKLSAgLyogRm9yY2UgdGhpcyB0byBiZSBhIHNlcGFyYXRlIG91dHB1dCByZWNvcmQuICAqLwotICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLQotLyogV3JpdGUgdGhlIEVPTSAoRW5kIE9mIE1vZHVsZSkgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVdyaXRlX1ZNU19FT01fUmVjb3JkIChQc2VjdCwgT2Zmc2V0KQotICAgICBpbnQgUHNlY3Q7Ci0gICAgIHZhbHVlVCBPZmZzZXQ7Ci17Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGFuIGVuZC1vZi1tb2R1bGUgcmVjb3JkCi0gICAqCSh0aGlzIGFzc3VtZXMgdGhhdCB0aGUgZW50cnkgcG9pbnQgd2lsbCBhbHdheXMgYmUgaW4gYSBwc2VjdAotICAgKgkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgYnl0ZSwgd2hpY2ggaXMgdGhlIGNhc2UgZm9yIGNvZGUgaW4KLSAgICoJIFRleHRfUHNlY3Q9PTApCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19FT00pOwotICBQVVRfQ0hBUiAoT0JKX1NfQ19FT00pOwkvKiBSZWNvcmQgdHlwZS4gICovCi0gIFBVVF9DSEFSICgwKTsJCQkvKiBFcnJvciBzZXZlcml0eSBsZXZlbCAod2UgaWdub3JlIGl0KS4gKi8KLSAgLyoKLSAgICoJU3RvcmUgdGhlIGVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMKLSAgICovCi0gIGlmIChQc2VjdCA+PSAwKQotICAgIHsKLSAgICAgIFBVVF9DSEFSIChQc2VjdCk7Ci0gICAgICBQVVRfTE9ORyAoT2Zmc2V0KTsKLSAgICB9Ci0gIC8qIEZsdXNoIHRoZSByZWNvcmQ7IHRoaXMgd2lsbCBiZSBvdXIgZmluYWwgb3V0cHV0LiAgKi8KLSAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKiB0aGlzIGhhc2ggcm91dGluZSBib3Jyb3dlZCBmcm9tIEdOVS1FTUFDUywgYW5kIHN0cmVuZ3RoZW5lZCBzbGlnaHRseSAgRVJZKi8KLQotc3RhdGljIGludAotaGFzaF9zdHJpbmcgKHB0cikKLSAgICAgY29uc3QgY2hhciAqcHRyOwotewotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOwotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBwICsgc3RybGVuIChwdHIpOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGludCBoYXNoID0gMDsKLQotICB3aGlsZSAocCAhPSBlbmQpCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBoYXNoID0gKChoYXNoIDw8IDMpICsgKGhhc2ggPDwgMTUpICsgKGhhc2ggPj4gMjgpICsgYyk7Ci0gICAgfQotICByZXR1cm4gaGFzaDsKLX0KLQotLyoKLSAqCUdlbmVyYXRlIGEgQ2FzZS1IYWNrZWQgVk1TIHN5bWJvbCBuYW1lIChsaW1pdGVkIHRvIDMxIGNoYXJzKQotICovCi1zdGF0aWMgdm9pZAotVk1TX0Nhc2VfSGFja19TeW1ib2wgKEluLCBPdXQpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKkluOwotICAgICByZWdpc3RlciBjaGFyICpPdXQ7Ci17Ci0gIGxvbmcgaW50IGluaXQ7Ci0gIGxvbmcgaW50IHJlc3VsdDsKLSAgY2hhciAqcG50ID0gMDsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIGNvbnN0IGNoYXIgKm9sZF9uYW1lOwotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IGRlc3RydWN0b3IgPSAwOwkJLypoYWNrIHRvIGFsbG93IGZvciBjYXNlIHNlbnMgaW4gYSBkZXN0cnVjdG9yKi8KLSAgaW50IHRydW5jYXRlID0gMDsKLSAgaW50IENhc2VfSGFja19CaXRzID0gMDsKLSAgaW50IFNhd19Eb2xsYXIgPSAwOwotICBzdGF0aWMgY2hhciBIZXhfVGFibGVbMTZdID0KLSAgeycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ307Ci0KLSAgLyoKLSAgICoJS2lsbCBhbnkgbGVhZGluZyAiXyIKLSAgICovCi0gIGlmICgoSW5bMF0gPT0gJ18nKSAmJiAoKEluWzFdID4gJzknKSB8fCAoSW5bMV0gPCAnMCcpKSkKLSAgICBJbisrOwotCi0gIG5ld19uYW1lID0gT3V0OwkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCi0KLSNpZiBiYXJmb28JCQkvKiBEZWFkIGNvZGUgKi8KLSAgaWYgKChJblswXSA9PSAnXycpICYmIChJblsxXSA9PSAnJCcpICYmIChJblsyXSA9PSAnXycpKQotICAgIGRlc3RydWN0b3IgPSAxOwotI2VuZGlmCi0KLSAgLyogV2UgbWF5IG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHN5bWJvbCwgc2F2ZSB0aGUgaGFzaCBmb3IgbGF0ZXIqLwotICByZXN1bHQgPSAoc3RybGVuIChJbikgPiAyMykgPyBoYXNoX3N0cmluZyAoSW4pIDogMDsKLSAgLyoKLSAgICoJSXMgdGhlcmUgYSBQc2VjdCBBdHRyaWJ1dGUgdG8gc2tpcD8/Ci0gICAqLwotICBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKEluKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJWWVzOiBTa2lwIGl0Ci0gICAgICAgKi8KLSAgICAgIEluICs9IFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSDsKLSAgICAgIHdoaWxlICgqSW4pCi0JewotCSAgaWYgKChJblswXSA9PSAnJCcpICYmIChJblsxXSA9PSAnJCcpKQotCSAgICB7Ci0JICAgICAgSW4gKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgSW4rKzsKLQl9Ci0gICAgfQotCi0gIG9sZF9uYW1lID0gSW47Ci0vKglpZiAoc3RybGVuIChJbikgPiAzMSAmJiBmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQkgIGFzX3Rza3RzayAoIlN5bWJvbCBuYW1lIHRydW5jYXRlZDogJXNcbiIsIEluKTsgKi8KLSAgLyoKLSAgICoJRG8gdGhlIGNhc2UgY29udmVyc2lvbgotICAgKi8KLSAgaSA9IDIzOwkJCS8qIE1heGltdW0gb2YgMjMgY2hhcnMgKi8KLSAgd2hpbGUgKCpJbiAmJiAoLS1pID49IDApKQotICAgIHsKLSAgICAgIENhc2VfSGFja19CaXRzIDw8PSAxOwotICAgICAgaWYgKCpJbiA9PSAnJCcpCi0JU2F3X0RvbGxhciA9IDE7Ci0gICAgICBpZiAoKGRlc3RydWN0b3IgPT0gMSkgJiYgKGkgPT0gMjEpKQotCVNhd19Eb2xsYXIgPSAwOwotICAgICAgc3dpdGNoICh2bXNfbmFtZV9tYXBwaW5nKQotCXsKLQljYXNlIDA6Ci0JICBpZiAoaXN1cHBlciAoKkluKSkgewotCSAgICAqT3V0KysgPSAqSW4rKzsKLQkgICAgQ2FzZV9IYWNrX0JpdHMgfD0gMTsKLQkgIH0gZWxzZSB7Ci0JICAgICpPdXQrKyA9IGlzbG93ZXIgKCpJbikgPyB0b3VwcGVyICgqSW4rKykgOiAqSW4rKzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMzogKk91dCsrID0gKkluKys7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBpZiAoaXNsb3dlciAoKkluKSkgewotCSAgICAqT3V0KysgPSAqSW4rKzsKLQkgIH0gZWxzZSB7Ci0JICAgICpPdXQrKyA9IGlzdXBwZXIgKCpJbikgPyB0b2xvd2VyICgqSW4rKykgOiAqSW4rKzsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqCUlmIHdlIHNhdyBhIGRvbGxhciBzaWduLCB3ZSBkb24ndCBkbyBjYXNlIGhhY2tpbmcKLSAgICovCi0gIGlmIChmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZSB8fCBTYXdfRG9sbGFyKQotICAgIENhc2VfSGFja19CaXRzID0gMDsKLQotICAvKgotICAgKglJZiB3ZSBoYXZlIG1vcmUgdGhhbiAyMyBjaGFyYWN0ZXJzIGFuZCBldmVyeXRoaW5nIGlzIGxvd2VyY2FzZQotICAgKgl3ZSBjYW4gaW5zZXJ0IHRoZSBmdWxsIDMxIGNoYXJhY3RlcnMKLSAgICovCi0gIGlmICgqSW4pCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVdlICBoYXZlIG1vcmUgdGhhbiAyMyBjaGFyYWN0ZXJzCi0gICAgICAgKiBJZiB3ZSBtdXN0IGFkZCB0aGUgY2FzZSBoYWNrLCB0aGVuIHdlIGhhdmUgdHJ1bmNhdGVkIHRoZSBzdHIKLSAgICAgICAqLwotICAgICAgcG50ID0gT3V0OwotICAgICAgdHJ1bmNhdGUgPSAxOwotICAgICAgaWYgKENhc2VfSGFja19CaXRzID09IDApCi0JewotCSAgLyoKLQkgICAqCUFuZCBzbyBmYXIgdGhleSBhcmUgYWxsIGxvd2VyIGNhc2U6Ci0JICAgKgkJQ2hlY2sgdXAgdG8gOCBtb3JlIGNoYXJhY3RlcnMKLQkgICAqCQlhbmQgZW5zdXJlIHRoYXQgdGhleSBhcmUgbG93ZXJjYXNlCi0JICAgKi8KLQkgIGZvciAoaSA9IDA7IChJbltpXSAhPSAwKSAmJiAoaSA8IDgpOyBpKyspCi0JICAgIGlmIChpc3VwcGVyIChJbltpXSkgJiYgIVNhd19Eb2xsYXIgJiYgIWZsYWdfbm9faGFzaF9taXhlZF9jYXNlKQotCSAgICAgIGJyZWFrOwotCi0JICBpZiAoSW5baV0gPT0gMCkKLQkgICAgdHJ1bmNhdGUgPSAwOwotCi0JICBpZiAoKGkgPT0gOCkgfHwgKEluW2ldID09IDApKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKglUaGV5IGFyZTogIENvcHkgdXAgdG8gMzEgY2hhcmFjdGVycwotCSAgICAgICAqCQkJdG8gdGhlIG91dHB1dCBzdHJpbmcKLQkgICAgICAgKi8KLQkgICAgICBpID0gODsKLQkgICAgICB3aGlsZSAoKC0taSA+PSAwKSAmJiAoKkluKSkKLQkJc3dpdGNoICh2bXNfbmFtZV9tYXBwaW5nKXsKLQkJY2FzZSAwOiAqT3V0KysgPSBpc2xvd2VyICgqSW4pID8gdG91cHBlciAoKkluKyspIDogKkluKys7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMzogKk91dCsrID0gKkluKys7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjogKk91dCsrID0gaXN1cHBlciAoKkluKSA/IHRvbG93ZXIgKCpJbisrKSA6ICpJbisrOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKgotICAgKglJZiB0aGVyZSB3ZXJlIGFueSB1cHBlcmNhc2UgY2hhcmFjdGVycyBpbiB0aGUgbmFtZSB3ZQotICAgKgl0YWtlIG9uIHRoZSBjYXNlIGhhY2tpbmcgc3RyaW5nCi0gICAqLwotCi0gIC8qIE9sZCBiZWhhdmlvciBmb3IgcmVndWxhciBHTlUtQyBjb21waWxlciAqLwotICBpZiAoIWZsYWdfaGFzaF9sb25nX25hbWVzKQotICAgIHRydW5jYXRlID0gMDsKLSAgaWYgKChDYXNlX0hhY2tfQml0cyAhPSAwKSB8fCAodHJ1bmNhdGUgPT0gMSkpCi0gICAgewotICAgICAgaWYgKHRydW5jYXRlID09IDApCi0JewotCSAgKk91dCsrID0gJ18nOwotCSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkgICAgewotCSAgICAgICpPdXQrKyA9IEhleF9UYWJsZVtDYXNlX0hhY2tfQml0cyAmIDB4Zl07Ci0JICAgICAgQ2FzZV9IYWNrX0JpdHMgPj49IDQ7Ci0JICAgIH0KLQkgICpPdXQrKyA9ICdYJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgT3V0ID0gcG50OwkJLypDdXQgYmFjayB0byAyMyBjaGFyYWN0ZXJzIG1heGltdW0gKi8KLQkgICpPdXQrKyA9ICdfJzsKLQkgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0JICAgIHsKLQkgICAgICBpbml0ID0gcmVzdWx0ICYgMHgwMWY7Ci0JICAgICAgKk91dCsrID0gKGluaXQgPCAxMCkgPyAoJzAnICsgaW5pdCkgOiAoJ0EnICsgaW5pdCAtIDEwKTsKLQkgICAgICByZXN1bHQgPSByZXN1bHQgPj4gNTsKLQkgICAgfQotCX0KLSAgICB9CQkJCS8qQ2FzZSBIYWNrICovCi0gIC8qCi0gICAqCURvbmUKLSAgICovCi0gICpPdXQgPSAwOwotICBpZiAodHJ1bmNhdGUgPT0gMSAmJiBmbGFnX2hhc2hfbG9uZ19uYW1lcyAmJiBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpCi0gICAgYXNfdHNrdHNrIChfKCJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIpLCBvbGRfbmFtZSwgbmV3X25hbWUpOwotfQotDAotCi0vKgotICoJU2NhbiBhIHN5bWJvbCBuYW1lIGZvciBhIHBzZWN0IGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9uCi0gKi8KLSNkZWZpbmUgR0xPQkFMU1lNQk9MX0JJVAkweDEwMDAwCi0jZGVmaW5lIEdMT0JBTFZBTFVFX0JJVAkJMHgyMDAwMAotCi0KLXN0YXRpYyB2b2lkCi1WTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKE5hbWUsIEF0dHJpYnV0ZV9Qb2ludGVyKQotICAgICBjb25zdCBjaGFyICpOYW1lOwotICAgICBpbnQgKkF0dHJpYnV0ZV9Qb2ludGVyOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7Ci0gIGludCBOZWdhdGU7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QKLSAgewotICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgaW50IFZhbHVlOwotICB9IEF0dHJpYnV0ZXNbXSA9Ci0gIHsKLSAgICB7IlBJQyIsIEdQU19TX01fUElDfSwKLSAgICB7IkxJQiIsIEdQU19TX01fTElCfSwKLSAgICB7Ik9WUiIsIEdQU19TX01fT1ZSfSwKLSAgICB7IlJFTCIsIEdQU19TX01fUkVMfSwKLSAgICB7IkdCTCIsIEdQU19TX01fR0JMfSwKLSAgICB7IlNIUiIsIEdQU19TX01fU0hSfSwKLSAgICB7IkVYRSIsIEdQU19TX01fRVhFfSwKLSAgICB7IlJEIiwgR1BTX1NfTV9SRH0sCi0gICAgeyJXUlQiLCBHUFNfU19NX1dSVH0sCi0gICAgeyJWRUMiLCBHUFNfU19NX1ZFQ30sCi0gICAgeyJHTE9CQUxTWU1CT0wiLCBHTE9CQUxTWU1CT0xfQklUfSwKLSAgICB7IkdMT0JBTFZBTFVFIiwgR0xPQkFMVkFMVUVfQklUfSwKLSAgICB7MCwgMH0KLSAgfTsKLQotICAvKgotICAgKglLaWxsIGxlYWRpbmcgIl8iCi0gICAqLwotICBpZiAoKk5hbWUgPT0gJ18nKQotICAgIE5hbWUrKzsKLSAgLyoKLSAgICoJQ2hlY2sgZm9yIGEgUFNFQ1QgYXR0cmlidXRlIGxpc3QKLSAgICovCi0gIGlmICghSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotICAgIHJldHVybjsJCQkvKiBJZiBub3QsIHJldHVybiAqLwotICAvKgotICAgKglTa2lwIHRoZSBhdHRyaWJ1dGUgbGlzdCBpbmRpY2F0b3IKLSAgICovCi0gIE5hbWUgKz0gUFNFQ1RfQVRUUklCVVRFU19TVFJJTkdfTEVOR1RIOwotICAvKgotICAgKglQcm9jZXNzIHRoZSBhdHRyaWJ1dGVzICgiXyIgc2VwYXJhdGVkLCAiJCIgdGVybWluYXRlZCkKLSAgICovCi0gIHdoaWxlICgqTmFtZSAhPSAnJCcpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCUFzc3VtZSBub3QgbmVnYXRpbmcKLSAgICAgICAqLwotICAgICAgTmVnYXRlID0gMDsKLSAgICAgIC8qCi0gICAgICAgKglDaGVjayBmb3IgIk5PIgotICAgICAgICovCi0gICAgICBpZiAoKE5hbWVbMF0gPT0gJ04nKSAmJiAoTmFtZVsxXSA9PSAnTycpKQotCXsKLQkgIC8qCi0JICAgKglXZSBhcmUgbmVnYXRpbmcgKGFuZCBza2lwIHRoZSBOTykKLQkgICAqLwotCSAgTmVnYXRlID0gMTsKLQkgIE5hbWUgKz0gMjsKLQl9Ci0gICAgICAvKgotICAgICAgICoJRmluZCB0aGUgdG9rZW4gZGVsaW1pdGVyCi0gICAgICAgKi8KLSAgICAgIGNwID0gTmFtZTsKLSAgICAgIHdoaWxlICgqY3AgJiYgKCpjcCAhPSAnXycpICYmICgqY3AgIT0gJyQnKSkKLQljcCsrOwotICAgICAgLyoKLSAgICAgICAqCUxvb2sgZm9yIHRoZSB0b2tlbiBpbiB0aGUgYXR0cmlidXRlIGxpc3QKLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMDsgQXR0cmlidXRlc1tpXS5OYW1lOyBpKyspCi0JewotCSAgLyoKLQkgICAqCUlmIHRoZSBzdHJpbmdzIG1hdGNoLCBzZXQvY2xlYXIgdGhlIGF0dHIuCi0JICAgKi8KLQkgIGlmIChzdHJuY21wIChOYW1lLCBBdHRyaWJ1dGVzW2ldLk5hbWUsIGNwIC0gTmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJU2V0IG9yIGNsZWFyCi0JICAgICAgICovCi0JICAgICAgaWYgKE5lZ2F0ZSkKLQkJKkF0dHJpYnV0ZV9Qb2ludGVyICY9Ci0JCSAgfkF0dHJpYnV0ZXNbaV0uVmFsdWU7Ci0JICAgICAgZWxzZQotCQkqQXR0cmlidXRlX1BvaW50ZXIgfD0KLQkJICBBdHRyaWJ1dGVzW2ldLlZhbHVlOwotCSAgICAgIC8qCi0JICAgICAgICoJRG9uZQotCSAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgLyoKLSAgICAgICAqCU5vdyBza2lwIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAqLwotICAgICAgTmFtZSA9IGNwOwotICAgICAgaWYgKCpOYW1lID09ICdfJykKLQlOYW1lKys7Ci0gICAgfQotfQotDAotCi0jZGVmaW5lIEdCTFNZTV9SRUYgMAotI2RlZmluZSBHQkxTWU1fREVGIDEKLSNkZWZpbmUgR0JMU1lNX1ZBTCAyCi0jZGVmaW5lIEdCTFNZTV9MQ0wgNAkvKiBub3QgR0JMIGFmdGVyIGFsbC4uLiAqLwotI2RlZmluZSBHQkxTWU1fV0VBSyA4Ci0KLS8qCi0gKglEZWZpbmUgYSBnbG9iYWwgc3ltYm9sIChvciBwb3NzaWJseSBhIGxvY2FsIG9uZSkuCi0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCBQc2VjdF9OdW1iZXIsIFBzZWN0X09mZnNldCwgRmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgIGludCBQc2VjdF9OdW1iZXI7Ci0gICAgIGludCBQc2VjdF9PZmZzZXQ7Ci0gICAgIGludCBGbGFnczsKLXsKLSAgY2hhciBMb2NhbFszMl07Ci0KLSAgLyoKLSAgICoJV2UgYXJlIHdyaXRpbmcgYSBHU0QgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSBHU0QgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX0dTRCk7Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR2xvYmFsIChvciBsb2NhbCkgc3ltYm9sIGRlZmluaXRpb24gc3VicmVjb3JkLgotICAgKi8KLSAgUFVUX0NIQVIgKChGbGFncyAmIEdCTFNZTV9MQ0wpICE9IDAgPyBHU0RfU19DX0xTWSA6Ci0JICAgICgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpID8gR1NEX1NfQ19TWU0gOiBHU0RfU19DX1NZTVcpOwotICAvKgotICAgKglEYXRhIHR5cGUgaXMgdW5kZWZpbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMCk7Ci0gIC8qCi0gICAqCVN3aXRjaCBvbiBEZWZpbml0aW9uL1JlZmVyZW5jZQotICAgKi8KLSAgaWYgKChGbGFncyAmIEdCTFNZTV9ERUYpID09IDApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVJlZmVyZW5jZQotICAgICAgICovCi0gICAgICBQVVRfU0hPUlQgKCgoRmxhZ3MgJiBHQkxTWU1fVkFMKSA9PSAwKSA/IEdTWV9TX01fUkVMIDogMCk7Ci0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgIT0gMCkJLyogbG9jYWwgc3ltYm9scyBoYXZlIGV4dHJhIGZpZWxkICovCi0JUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc3ltX2ZsYWdzOwotCi0gICAgICAvKgotICAgICAgICoJRGVmaW5pdGlvbgotICAgICAgICpbIGFzc2VydCAoTFNZX1NfTV9ERUYgPT0gR1NZX1NfTV9ERUYgJiYgTFNZX1NfTV9SRUwgPT0gR1NZX1NfTV9SRUwpOyBdCi0gICAgICAgKi8KLSAgICAgIHN5bV9mbGFncyA9IEdTWV9TX01fREVGOwotICAgICAgaWYgKEZsYWdzICYgR0JMU1lNX1dFQUspCi0Jc3ltX2ZsYWdzIHw9IEdTWV9TX01fV0VBSzsKLSAgICAgIGlmICgoRmxhZ3MgJiBHQkxTWU1fVkFMKSA9PSAwKQotCXN5bV9mbGFncyB8PSBHU1lfU19NX1JFTDsKLSAgICAgIFBVVF9TSE9SVCAoc3ltX2ZsYWdzKTsKLSAgICAgIGlmICgoRmxhZ3MgJiBHQkxTWU1fTENMKSAhPSAwKQkvKiBsb2NhbCBzeW1ib2xzIGhhdmUgZXh0cmEgZmllbGQgKi8KLQlQVVRfU0hPUlQgKEN1cnJlbnRfRW52aXJvbm1lbnQpOwotICAgICAgLyoKLSAgICAgICAqCVBzZWN0IE51bWJlcgotICAgICAgICovCi0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgPT0gMCAmJiAodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpCi0JUFVUX0NIQVIgKFBzZWN0X051bWJlcik7Ci0gICAgICBlbHNlCi0JUFVUX1NIT1JUIChQc2VjdF9OdW1iZXIpOwotICAgICAgLyoKLSAgICAgICAqCU9mZnNldAotICAgICAgICovCi0gICAgICBQVVRfTE9ORyAoUHNlY3RfT2Zmc2V0KTsKLSAgICB9Ci0gIC8qCi0gICAqCUZpbmFsbHksIHRoZSBnbG9iYWwgc3ltYm9sIG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQotLyoKLSAqCURlZmluZSBhbiBlbnZpcm9ubWVudCB0byBzdXBwb3J0IGxvY2FsIHN5bWJvbCByZWZlcmVuY2VzLgotICoJVGhpcyBpcyBqdXN0IHRvIG1vbGxpZnkgdGhlIGxpbmtlcjsgd2UgZG9uJ3QgYWN0dWFsbHkgZG8KLSAqCWFueXRoaW5nIHVzZWZ1bCB3aXRoIGl0LgotICovCi1zdGF0aWMgdm9pZAotVk1TX0xvY2FsX0Vudmlyb25tZW50X1NldHVwIChFbnZfTmFtZSkKLSAgICBjb25zdCBjaGFyICpFbnZfTmFtZTsKLXsKLSAgLyogV2UgYXJlIHdyaXRpbmcgYSBHU0QgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKLSAgLyogV2UgYXJlIHdyaXRpbmcgYW4gRU5WIHN1YnJlY29yZC4gICovCi0gIFBVVF9DSEFSIChHU0RfU19DX0VOVik7Ci0KLSAgKytDdXJyZW50X0Vudmlyb25tZW50OwkvKiBpbmRleCBvZiBlbnZpcm9ubWVudCBiZWluZyBkZWZpbmVkICovCi0KLSAgLyogRU5WJFdfRkxBR1M6ICB3ZSBhcmUgZGVmaW5pbmcgdGhlIG5leHQgZW52aXJvbm1lbnQuICBJdCdzIG5vdCBuZXN0ZWQuICAqLwotICBQVVRfU0hPUlQgKEVOVl9TX01fREVGKTsKLSAgLyogRU5WJFdfRU5WSU5EWDogIGluZGV4IGlzIGFsd2F5cyAwIGZvciBub24tbmVzdGVkIGRlZmluaXRpb25zLiAgKi8KLSAgUFVUX1NIT1JUICgwKTsKLQotICAvKiBFTlYkQl9OQU1MTkcgKyBFTlYkVF9OQU1FOiAgZW52aXJvbm1lbnQgbmFtZSBpbiBBU0NJQyBmb3JtYXQuICAqLwotICBpZiAoIUVudl9OYW1lKSBFbnZfTmFtZSA9ICIiOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKChjaGFyICopRW52X05hbWUpOwotCi0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCURlZmluZSBhIHBzZWN0Ci0gKi8KLXN0YXRpYyBpbnQKLVZNU19Qc2VjdF9TcGVjIChOYW1lLCBTaXplLCBUeXBlLCB2c3ApCi0gICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgIGludCBTaXplOwotICAgICBlbnVtIHBzX3R5cGUgVHlwZTsKLSAgICAgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLXsKLSAgY2hhciBMb2NhbFszMl07Ci0gIGludCBQc2VjdF9BdHRyaWJ1dGVzOwotCi0gIC8qCi0gICAqCUdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBQU0VDVCBmbGFncyBnaXZlbiB0aGUgUFNFQ1QgdHlwZQotICAgKi8KLSAgc3dpdGNoIChUeXBlKQotICAgIHsKLSAgICBjYXNlIHBzX1RFWFQ6Ci0gICAgICAvKiBUZXh0IHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxub0dCTCxTSFIsRVhFLFJELG5vV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1NIUnxHUFNfU19NX0VYRQotCQkJICB8R1BTX1NfTV9SRCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHBzX0RBVEE6Ci0gICAgICAvKiBEYXRhIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxub0dCTCxub1NIUixub0VYRSxSRCxXUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwc19DT01NT046Ci0gICAgICAvKiBDb21tb24gYmxvY2sgcHNlY3RzIGFyZTogIFBJQyxPVlIsUkVMLEdCTCxub1NIUixub0VYRSxSRCxXUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMCi0JCQkgIHxHUFNfU19NX1JEfEdQU19TX01fV1JUKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfQ09OU1Q6Ci0gICAgICAvKiBDb25zdCBkYXRhIHBzZWN0cyBhcmU6ICBQSUMsT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMCi0JCQkgIHxHUFNfU19NX1JEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfQ1RPUlM6Ci0gICAgICAvKiBDdG9yIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwc19EVE9SUzoKLSAgICAgIC8qIER0b3IgcHNlY3RzIGFyZSBQSUMsbm9PVlIsUkVMLEdCTCxub1NIUixub0VYRSxSRCxub1dSVC4gKi8KLSAgICAgIFBzZWN0X0F0dHJpYnV0ZXMgPSAoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9HQkx8R1BTX1NfTV9SRCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogaW1wb3NzaWJsZSAqLwotICAgICAgZXJyb3IgKF8oIlVua25vd24gVk1TIHBzZWN0IHR5cGUgKCVsZCkiKSwgKGxvbmcpIFR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKgotICAgKglNb2RpZnkgdGhlIHBzZWN0IGF0dHJpYnV0ZXMgYWNjb3JkaW5nIHRvIGFueSBhdHRyaWJ1dGUgc3RyaW5nCi0gICAqLwotICBpZiAodnNwICYmIFNfR0VUX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSBOX0FCUykKLSAgICBQc2VjdF9BdHRyaWJ1dGVzIHw9IEdMT0JBTFZBTFVFX0JJVDsKLSAgZWxzZSBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotICAgIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcyAoTmFtZSwgJlBzZWN0X0F0dHJpYnV0ZXMpOwotICAvKgotICAgKglDaGVjayBmb3IgZ2xvYmFscmVmL2RlZi92YWwuCi0gICAqLwotICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxWQUxVRV9CSVQpICE9IDApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIGdsb2JhbHZhbHVlIHN5bWJvbHMgd2VyZSBnZW5lcmF0ZWQgYmVmb3JlLiBUaGlzIGNvZGUKLSAgICAgICAqIHByZXZlbnRzIHVuc2lnaHRseSBwc2VjdCBidWlsZHVwLCBhbmQgbWFrZXMgc3VyZSB0aGF0Ci0gICAgICAgKiBmaXh1cCByZWZlcmVuY2VzIGFyZSBlbWl0dGVkIGNvcnJlY3RseS4KLSAgICAgICAqLwotICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IC0xOwkvKiB0byBjYXRjaCBlcnJvcnMgKi8KLSAgICAgIFNfU0VUX1RZUEUgKHZzcC0+U3ltYm9sLCBOX1VOREYpOwkJLyogbWFrZSByZWZzIHdvcmsgKi8KLSAgICAgIHJldHVybiAxOwkJCS8qIGRlY3JlbWVudCBwc2VjdCBjb3VudGVyICovCi0gICAgfQotCi0gIGlmICgoUHNlY3RfQXR0cmlidXRlcyAmIEdMT0JBTFNZTUJPTF9CSVQpICE9IDApCi0gICAgewotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpKQotCXsKLQljYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgdnNwLT5Qc2VjdF9JbmRleCwKLQkJCQkgIHZzcC0+UHNlY3RfT2Zmc2V0LCBHQkxTWU1fUkVGKTsKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSAtMTsKLQkgIFNfU0VUX1RZUEUgKHZzcC0+U3ltYm9sLCBOX1VOREYpOwotCSAgcmV0dXJuIDE7CQkvKiByZXR1cm4gYW5kIGluZGljYXRlIG5vIHBzZWN0ICovCi0JY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkJICB2c3AtPlBzZWN0X09mZnNldCwgR0JMU1lNX0RFRik7Ci0JICAvKiBJbiB0aGlzIGNhc2Ugd2Ugc3RpbGwgZ2VuZXJhdGUgdGhlIHBzZWN0ICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oIkdsb2JhbHN5bWJvbCBhdHRyaWJ1dGUgZm9yIHN5bWJvbCAlcyB3YXMgdW5leHBlY3RlZC4iKSwKLQkJICAgIE5hbWUpOwotCSAgYnJlYWs7Ci0JfQkJCS8qIHN3aXRjaCAqLwotICAgIH0KLQotICBQc2VjdF9BdHRyaWJ1dGVzICY9IDB4ZmZmZjsJLyogY2xlYXIgb3V0IHRoZSBnbG9iYWxyZWYvZGVmIHN0dWZmICovCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIFBTRUNUIGRlZmluaXRpb24gc3VicmVjb3JkCi0gICAqLwotICBQVVRfQ0hBUiAoR1NEX1NfQ19QU0MpOwotICAvKgotICAgKglQc2VjdHMgYXJlIGFsd2F5cyBMT05HV09SRCBhbGlnbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMik7Ci0gIC8qCi0gICAqCVNwZWNpZnkgdGhlIHBzZWN0IGF0dHJpYnV0ZXMKLSAgICovCi0gIFBVVF9TSE9SVCAoUHNlY3RfQXR0cmlidXRlcyk7Ci0gIC8qCi0gICAqCVNwZWNpZnkgdGhlIGFsbG9jYXRpb24KLSAgICovCi0gIFBVVF9MT05HIChTaXplKTsKLSAgLyoKLSAgICoJRmluYWxseSwgdGhlIHBzZWN0IG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0KLS8qIEdpdmVuIHRoZSBwb2ludGVyIHRvIGEgc3ltYm9sIHdlIGNhbGN1bGF0ZSBob3cgYmlnIHRoZSBkYXRhIGF0IHRoZQotICAgc3ltYm9sIGlzLiAgV2UgZG8gdGhpcyBieSBsb29raW5nIGZvciB0aGUgbmV4dCBzeW1ib2wgKGxvY2FsIG9yIGdsb2JhbCkKLSAgIHdoaWNoIHdpbGwgaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGFub3RoZXIgZGF0dW0uICAqLwotCi1zdGF0aWMgb2Zmc2V0VAotVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoczBQLCBFbmRfT2ZfRGF0YSkKLSAgICAgcmVnaXN0ZXIgc3ltYm9sUyAqczBQOwotICAgICB1bnNpZ25lZCBFbmRfT2ZfRGF0YTsKLXsKLSAgc3ltYm9sUyAqczFQOwotICB2YWx1ZVQgczBQX3ZhbCA9IFNfR0VUX1ZBTFVFIChzMFApLCBzMVBfdmFsLAotCSBuZWFyZXN0X3ZhbCA9ICh2YWx1ZVQpIEVuZF9PZl9EYXRhOwotCi0gIC8qIEZpbmQgdGhlIG5lYXJlc3Qgc3ltYm9sIHdoYXQgZm9sbG93cyB0aGlzIG9uZS4gICovCi0gIGZvciAoczFQID0gc3ltYm9sX3Jvb3RQOyBzMVA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIC8qIFRoZSBkYXRhIHR5cGUgbXVzdCBtYXRjaC4gICovCi0gICAgICBpZiAoU19HRVRfVFlQRSAoczFQKSAhPSBOX0RBVEEpCi0JY29udGludWU7Ci0gICAgICBzMVBfdmFsID0gU19HRVRfVkFMVUUgKHMxUCk7Ci0gICAgICBpZiAoczFQX3ZhbCA+IHMwUF92YWwgJiYgczFQX3ZhbCA8IG5lYXJlc3RfdmFsKQotCW5lYXJlc3RfdmFsID0gczFQX3ZhbDsKLSAgICB9Ci0gIC8qIENhbGN1bGF0ZSBpdHMgc2l6ZS4gICovCi0gIHJldHVybiAob2Zmc2V0VCkgKG5lYXJlc3RfdmFsIC0gczBQX3ZhbCk7Ci19Ci0KLQotLyogQ2hlY2sgc3ltYm9sIG5hbWVzIGZvciB0aGUgUHNlY3QgaGFjayB3aXRoIGEgZ2xvYmFsdmFsdWUsIGFuZCB0aGVuCi0gICBnZW5lcmF0ZSBnbG9iYWx2YWx1ZXMgZm9yIHRob3NlIHRoYXQgaGF2ZSBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfRW1pdF9HbG9iYWx2YWx1ZXMgKHRleHRfc2l6LCBkYXRhX3NpeiwgRGF0YV9TZWdtZW50KQotICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKLSAgICAgdW5zaWduZWQgZGF0YV9zaXo7Ci0gICAgIGNoYXIgKkRhdGFfU2VnbWVudDsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7Ci0gIGNoYXIgKnN0cmlwcGVkX25hbWUsICpOYW1lOwotICBpbnQgU2l6ZTsKLSAgaW50IFBzZWN0X0F0dHJpYnV0ZXM7Ci0gIGludCBnbG9iYWx2YWx1ZTsKLSAgaW50IHR5cCwgYWJzdHlwOwotCi0gIC8qCi0gICAqIFNjYW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgZ2xvYmFsdmFsdWVzLCBhbmQgZW1pdCBkZWYvcmVmIHdoZW4KLSAgICogcmVxdWlyZWQuICBUaGVzZSB3aWxsIGJlIGNhdWdodCBhZ2FpbiBsYXRlciBhbmQgY29udmVydGVkIHRvCi0gICAqIE5fVU5ERgotICAgKi8KLSAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3AtPnN5X25leHQpCi0gICAgewotICAgICAgdHlwID0gU19HRVRfUkFXX1RZUEUgKHNwKTsKLSAgICAgIGFic3R5cCA9ICgodHlwICYgfk5fRVhUKSA9PSBOX0FCUyk7Ci0gICAgICAvKgotICAgICAgICoJU2VlIGlmIHRoaXMgaXMgc29tZXRoaW5nIHdlIHdhbnQgdG8gbG9vayBhdC4KLSAgICAgICAqLwotICAgICAgaWYgKCFhYnN0eXAgJiYKLQkgIHR5cCAhPSAoTl9EQVRBIHwgTl9FWFQpICYmCi0JICB0eXAgIT0gKE5fVU5ERiB8IE5fRVhUKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglTZWUgaWYgdGhpcyBoYXMgZ2xvYmFsdmFsdWUgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAqLwotICAgICAgTmFtZSA9IFNfR0VUX05BTUUgKHNwKTsKLQotICAgICAgaWYgKGFic3R5cCkKLQl7Ci0JICBzdHJpcHBlZF9uYW1lID0gMDsKLQkgIFBzZWN0X0F0dHJpYnV0ZXMgPSBHTE9CQUxWQUxVRV9CSVQ7Ci0JfQotICAgICAgZWxzZSBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotCXsKLQkgIHN0cmlwcGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKE5hbWUpICsgMSk7Ci0JICBzdHJjcHkgKHN0cmlwcGVkX25hbWUsIE5hbWUpOwotCSAgUHNlY3RfQXR0cmlidXRlcyA9IDA7Ci0JICBWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKHN0cmlwcGVkX25hbWUsICZQc2VjdF9BdHRyaWJ1dGVzKTsKLQl9Ci0gICAgICBlbHNlCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoUHNlY3RfQXR0cmlidXRlcyAmIEdMT0JBTFZBTFVFX0JJVCkgIT0gMCkKLQl7Ci0JICBzd2l0Y2ggKHR5cCkKLQkgICAgewotCSAgICBjYXNlIE5fQUJTOgotCSAgICAgIC8qIExvY2FsIHN5bWJvbCByZWZlcmVuY2VzIHdpbGwgd2FudAotCQkgdG8gaGF2ZSBhbiBlbnZpcm9ubWVudCBkZWZpbmVkLiAgKi8KLQkgICAgICBpZiAoQ3VycmVudF9FbnZpcm9ubWVudCA8IDApCi0JCVZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCAoIi5OX0FCUyIpOwotCSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIDAsCi0JCQkJICAgICAgU19HRVRfVkFMVUUgKHNwKSwKLQkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUx8R0JMU1lNX0xDTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCAwLAotCQkJCSAgICAgIFNfR0VUX1ZBTFVFIChzcCksCi0JCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCAwLCBHQkxTWU1fVkFMKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgICAgICBTaXplID0gVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoc3AsIHRleHRfc2l6ICsgZGF0YV9zaXopOwotCSAgICAgIGlmIChTaXplID4gNCkKLQkJZXJyb3IgKF8oIkludmFsaWQgZGF0YSB0eXBlIGZvciBnbG9iYWx2YWx1ZSIpKTsKLQkgICAgICBnbG9iYWx2YWx1ZSA9IG1kX2NoYXJzX3RvX251bWJlciAoRGF0YV9TZWdtZW50ICsgCi0JCSAgICAgU19HRVRfVkFMVUUgKHNwKSAtIHRleHRfc2l6ICwgU2l6ZSk7Ci0JICAgICAgLyogVGhyZWUgdGltZXMgZm9yIGdvb2QgbHVjay4gIFRoZSBsaW5rZXIgc2VlbXMgdG8gZ2V0IGNvbmZ1c2VkCi0JICAgICAgICAgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gdGhyZWUgKi8KLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCAwLCBHQkxTWU1fVkFMKTsKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCBnbG9iYWx2YWx1ZSwKLQkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUwpOwotCSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHN0cmlwcGVkX25hbWUsIDAsIGdsb2JhbHZhbHVlLAotCQkJCSAgICAgIEdCTFNZTV9ERUZ8R0JMU1lNX1ZBTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBnbG9iYWx2YWx1ZSBvZiAlcyIpLCBzdHJpcHBlZF9uYW1lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIHN3aXRjaCAqLwotCX0JCQkvKiBpZiAqLwotICAgICAgaWYgKHN0cmlwcGVkX25hbWUpIGZyZWUgKHN0cmlwcGVkX25hbWUpOwkvKiBjbGVhbiB1cCAqLwotICAgIH0JCQkJLyogZm9yICovCi0KLX0KLQwKLQotLyoKLSAqCURlZmluZSBhIHByb2NlZHVyZSBlbnRyeSBwdC9tYXNrCi0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfUHJvY2VkdXJlX0VudHJ5X1B0IChOYW1lLCBQc2VjdF9OdW1iZXIsIFBzZWN0X09mZnNldCwgRW50cnlfTWFzaykKLSAgICAgY2hhciAqTmFtZTsKLSAgICAgaW50IFBzZWN0X051bWJlcjsKLSAgICAgaW50IFBzZWN0X09mZnNldDsKLSAgICAgaW50IEVudHJ5X01hc2s7Ci17Ci0gIGNoYXIgTG9jYWxbMzJdOwotCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIFByb2NlZHVyZSBFbnRyeSBQdC9NYXNrIHN1YnJlY29yZAotICAgKi8KLSAgUFVUX0NIQVIgKCgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpID8gR1NEX1NfQ19FUE0gOiBHU0RfU19DX0VQTVcpOwotICAvKgotICAgKglEYXRhIHR5cGUgaXMgdW5kZWZpbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMCk7Ci0gIC8qCi0gICAqCUZsYWdzID0gIlJFTE9DQVRBQkxFIiBhbmQgIkRFRklORUQiCi0gICAqLwotICBQVVRfU0hPUlQgKEdTWV9TX01fREVGIHwgR1NZX1NfTV9SRUwpOwotICAvKgotICAgKglQc2VjdCBOdW1iZXIKLSAgICovCi0gIGlmICgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpCi0gICAgUFVUX0NIQVIgKFBzZWN0X051bWJlcik7Ci0gIGVsc2UKLSAgICBQVVRfU0hPUlQgKFBzZWN0X051bWJlcik7Ci0gIC8qCi0gICAqCU9mZnNldAotICAgKi8KLSAgUFVUX0xPTkcgKFBzZWN0X09mZnNldCk7Ci0gIC8qCi0gICAqCUVudHJ5IG1hc2sKLSAgICovCi0gIFBVVF9TSE9SVCAoRW50cnlfTWFzayk7Ci0gIC8qCi0gICAqCUZpbmFsbHksIHRoZSBnbG9iYWwgc3ltYm9sIG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCVNldCB0aGUgY3VycmVudCBsb2NhdGlvbiBjb3VudGVyIHRvIGEgcGFydGljdWxhciBQc2VjdCBhbmQgT2Zmc2V0Ci0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfU2V0X1BzZWN0IChQc2VjdF9JbmRleCwgT2Zmc2V0LCBSZWNvcmRfVHlwZSkKLSAgICAgaW50IFBzZWN0X0luZGV4OwotICAgICBpbnQgT2Zmc2V0OwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglTdGFjayB0aGUgUHNlY3QgYmFzZSArIE9mZnNldAotICAgKi8KLSAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgMCk7Ci0gIC8qCi0gICAqCVNldCByZWxvY2F0aW9uIGJhc2UKLSAgICovCi0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TRVRSQik7Ci0gIC8qCi0gICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKgotICoJU3RvcmUgcmVwZWF0ZWQgaW1tZWRpYXRlIGRhdGEgaW4gY3VycmVudCBQc2VjdAotICovCi1zdGF0aWMgdm9pZAotVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEgKFJlcGVhdF9Db3VudCwgUG9pbnRlciwgU2l6ZSwgUmVjb3JkX1R5cGUpCi0gICAgIGludCBSZXBlYXRfQ291bnQ7Ci0gICAgIHJlZ2lzdGVyIGNoYXIgKlBvaW50ZXI7Ci0gICAgIGludCBTaXplOwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0KLSAgLyoKLSAgICoJSWdub3JlIHplcm8gYnl0ZXMvd29yZHMvbG9uZ3dvcmRzCi0gICAqLwotICBzd2l0Y2ggKFNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGlmIChQb2ludGVyWzNdICE9IDAgfHwgUG9pbnRlclsyXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIGVsc2UgRkFMTFRIUlUgKi8KLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoUG9pbnRlclsxXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIGVsc2UgRkFMTFRIUlUgKi8KLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoUG9pbnRlclswXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIHplcm8gdmFsdWUgKi8KLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKgotICAgKglJZiB0aGUgZGF0YSBpcyB0b28gYmlnIGZvciBhIFRJUl9TX0NfU1RPX1JJVkIgc3ViLXJlY29yZAotICAgKgl0aGVuIHdlIGRvIGl0IG1hbnVhbGx5Ci0gICAqLwotICBpZiAoU2l6ZSA+IDI1NSkKLSAgICB7Ci0gICAgICB3aGlsZSAoLS1SZXBlYXRfQ291bnQgPj0gMCkKLQlWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCVN0YWNrIHRoZSByZXBlYXQgY291bnQKLSAgICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUQV9MVyk7Ci0gIFBVVF9MT05HIChSZXBlYXRfQ291bnQpOwotICAvKgotICAgKglBbmQgbm93IHRoZSBjb21tYW5kIGFuZCBpdHMgZGF0YQotICAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1JJVkIpOwotICBQVVRfQ0hBUiAoU2l6ZSk7Ci0gIHdoaWxlICgtLVNpemUgPj0gMCkKLSAgICBQVVRfQ0hBUiAoKlBvaW50ZXIrKyk7Ci0gIC8qCi0gICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKgotICoJU3RvcmUgYSBQb3NpdGlvbiBJbmRlcGVuZGVudCBSZWZlcmVuY2UKLSAqLwotc3RhdGljIHZvaWQKLVZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSAoU3ltYm9sLCBPZmZzZXQsIFBDX1JlbGF0aXZlLAotCQkJCVBzZWN0LCBQc2VjdF9PZmZzZXQsIFJlY29yZF9UeXBlKQotICAgICBzeW1ib2xTICpTeW1ib2w7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGludCBQQ19SZWxhdGl2ZTsKLSAgICAgaW50IFBzZWN0OwotICAgICBpbnQgUHNlY3RfT2Zmc2V0OwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3AgPSBTeW1ib2wtPnN5X29iajsKLSAgY2hhciBMb2NhbFszMl07Ci0gIGludCBsb2NhbF9zeW0gPSAwOwotCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCVNldCB0byB0aGUgYXBwcm9wcmlhdGUgb2Zmc2V0IGluIHRoZSBQc2VjdC4KLSAgICoJRm9yIGEgQ29kZSByZWZlcmVuY2Ugd2UgbmVlZCB0byBmaXggdGhlIG9wZXJhbmQKLSAgICoJc3BlY2lmaWVyIGFzIHdlbGwsIHNvIGJhY2sgdXAgMSBieXRlOwotICAgKglmb3IgYSBEYXRhIHJlZmVyZW5jZSB3ZSBqdXN0IHN0b3JlIEhFUkUuCi0gICAqLwotICBWTVNfU2V0X1BzZWN0IChQc2VjdCwKLQkJIFBDX1JlbGF0aXZlID8gUHNlY3RfT2Zmc2V0IC0gMSA6IFBzZWN0X09mZnNldCwKLQkJIFJlY29yZF9UeXBlKTsKLSAgLyoKLSAgICoJTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgIlJlY29yZCBUeXBlIiByZWNvcmQKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCURpc3BhdGNoIG9uIHN5bWJvbCB0eXBlIChzbyB3ZSBjYW4gc3RhY2sgaXRzIHZhbHVlKQotICAgKi8KLSAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoU3ltYm9sKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJR2xvYmFsIHN5bWJvbAotICAgICAgICovCi0gICAgY2FzZSBOX0FCUzoKLSAgICAgIGxvY2FsX3N5bSA9IDE7Ci0gICAgICAvKkZBTExUSFJVKi8KLSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0jaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0jZW5kaWYJLyogTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUgKi8KLSAgICBjYXNlIE5fVU5ERjoKLSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgotICAgICAgLyoKLSAgICAgICAqCUdldCB0aGUgc3ltYm9sIG5hbWUgKGNhc2UgaGFja2VkKQotICAgICAgICovCi0gICAgICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoU19HRVRfTkFNRSAoU3ltYm9sKSwgTG9jYWwpOwotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBnbG9iYWwgc3ltYm9sIHZhbHVlCi0gICAgICAgKi8KLSAgICAgIGlmICghbG9jYWxfc3ltKQotCXsKLQkgIFBVVF9DSEFSIChUSVJfU19DX1NUQV9HQkwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBMb2NhbCBzeW1ib2xzIGhhdmUgYW4gZXh0cmEgZmllbGQuICAqLwotCSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX0xTWSk7Ci0JICBQVVRfU0hPUlQgKEN1cnJlbnRfRW52aXJvbm1lbnQpOwotCX0KLSAgICAgIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAgICAgaWYgKE9mZnNldCkKLQl7Ci0JICAvKgotCSAgICoJU3RhY2sgdGhlIGxvbmd3b3JkIG9mZnNldAotCSAgICovCi0JICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfTFcpOwotCSAgUFVUX0xPTkcgKE9mZnNldCk7Ci0JICAvKgotCSAgICoJQWRkIHRoZSB0d28sIGxlYXZpbmcgdGhlIHJlc3VsdCBvbiB0aGUgc3RhY2sKLQkgICAqLwotCSAgUFVUX0NIQVIgKFRJUl9TX0NfT1BSX0FERCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAvKgotICAgICAgICoJVW5pbml0aWFsaXplZCBsb2NhbCBkYXRhCi0gICAgICAgKi8KLSAgICBjYXNlIE5fQlNTOgotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBQc2VjdCAoK29mZnNldCkKLSAgICAgICAqLwotICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJCSAgIHZzcC0+UHNlY3RfT2Zmc2V0ICsgT2Zmc2V0LAotCQkJICAgMCk7Ci0gICAgICBicmVhazsKLSAgICAgIC8qCi0gICAgICAgKglMb2NhbCB0ZXh0Ci0gICAgICAgKi8KLSAgICBjYXNlIE5fVEVYVDoKLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCi0gICAgICAgKi8KLSAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkgICBTX0dFVF9WQUxVRSAoU3ltYm9sKSArIE9mZnNldCwKLQkJCSAgIDApOwotICAgICAgYnJlYWs7Ci0gICAgICAvKgotICAgICAgICoJSW5pdGlhbGl6ZWQgbG9jYWwgb3IgZ2xvYmFsIGRhdGEKLSAgICAgICAqLwotICAgIGNhc2UgTl9EQVRBOgotI2lmbmRlZglOT1RfVkFYXzExX0NfQ09NUEFUSUJMRQotICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLSNlbmRpZgkvKiBOT1RfVkFYXzExX0NfQ09NUEFUSUJMRSAqLwotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBQc2VjdCAoK29mZnNldCkKLSAgICAgICAqLwotICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJCSAgIHZzcC0+UHNlY3RfT2Zmc2V0ICsgT2Zmc2V0LAotCQkJICAgMCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIC8qCi0gICAqCVN0b3JlIGVpdGhlciBhIGNvZGUgb3IgZGF0YSByZWZlcmVuY2UKLSAgICovCi0gIFBVVF9DSEFSIChQQ19SZWxhdGl2ZSA/IFRJUl9TX0NfU1RPX1BJQ1IgOiBUSVJfU19DX1NUT19QSURSKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLS8qCi0gKglDaGVjayBpbiB0aGUgdGV4dCBhcmVhIGZvciBhbiBpbmRpcmVjdCBwYy1yZWxhdGl2ZSByZWZlcmVuY2UKLSAqCWFuZCBmaXggaXQgdXAgd2l0aCBhZGRyZXNzaW5nIG1vZGUgMHhmZiBbUEMgaW5kaXJlY3RdCi0gKgotICoJVEhJUyBTSE9VTEQgQkUgUkVQTEFDRUQgQlkgVEhFIFVTRSBPRiBUSVJfU19DX1NUT19QSVJSIElOIFRIRQotICoJUElDIENPREUgR0VORVJBVElORyBGSVhVUCBST1VUSU5FLgotICovCi1zdGF0aWMgdm9pZAotVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgKFRleHRfUHNlY3QsIE9mZnNldCwgZnJhZ1AsIHRleHRfZnJhZ19yb290KQotICAgICBpbnQgVGV4dF9Qc2VjdDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBmcmFnUyAqdGV4dF9mcmFnX3Jvb3Q7Ci17Ci0gIC8qCi0gICAqCVRoZSBhZGRyZXNzaW5nIG1vZGUgYnl0ZSBpcyAxIGJ5dGUgYmVmb3JlIHRoZSBhZGRyZXNzCi0gICAqLwotICBPZmZzZXQtLTsKLSAgLyoKLSAgICoJSXMgaXQgaW4gVEhJUyBmcmFnPz8KLSAgICovCi0gIGlmICgoT2Zmc2V0IDwgZnJhZ1AtPmZyX2FkZHJlc3MpIHx8Ci0gICAgICAoT2Zmc2V0ID49IChmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXgpKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJV2UgbmVlZCB0byBzZWFyY2ggZm9yIHRoZSBmcmFnbWVudCBjb250YWluaW5nIHRoaXMKLSAgICAgICAqCU9mZnNldAotICAgICAgICovCi0gICAgICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCXsKLQkgIGlmICgoT2Zmc2V0ID49IGZyYWdQLT5mcl9hZGRyZXNzKSAmJgotCSAgICAgIChPZmZzZXQgPCAoZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4KSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIC8qCi0gICAgICAgKglJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBmcmFnLCB0aGluZ3MgYXJlIEJBRCEhCi0gICAgICAgKi8KLSAgICAgIGlmIChmcmFnUCA9PSAwKQotCWVycm9yIChfKCJDb3VsZG4ndCBmaW5kIGZpeHVwIGZyYWdtZW50IHdoZW4gY2hlY2tpbmcgZm9yIGluZGlyZWN0IHJlZmVyZW5jZSIpKTsKLSAgICB9Ci0gIC8qCi0gICAqCUNoZWNrIGZvciBpbmRpcmVjdCBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUKLSAgICovCi0gIGlmIChmcmFnUC0+ZnJfbGl0ZXJhbFtPZmZzZXQgLSBmcmFnUC0+ZnJfYWRkcmVzc10gPT0gKGNoYXIpIDB4ZmYpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgQWRkcmVzc19Nb2RlID0gKGNoYXIpIDB4ZmY7Ci0KLSAgICAgIC8qCi0gICAgICAgKglZZXM6IFN0b3JlIHRoZSBpbmRpcmVjdCBtb2RlIGJhY2sgaW50byB0aGUgaW1hZ2UKLSAgICAgICAqCSAgICAgdG8gZml4IHVwIHRoZSBkYW1hZ2UgZG9uZSBieSBTVE9fUElDUgotICAgICAgICovCi0gICAgICBWTVNfU2V0X1BzZWN0IChUZXh0X1BzZWN0LCBPZmZzZXQsIE9CSl9TX0NfVElSKTsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoJkFkZHJlc3NfTW9kZSwgMSwgT0JKX1NfQ19USVIpOwotICAgIH0KLX0KLQwKLQotLyoKLSAqCUlmIHRoZSBwcm9jZWR1cmUgIm1haW4oKSIgZXhpc3RzIHdlIGhhdmUgdG8gYWRkIHRoZSBpbnN0cnVjdGlvbgotICoJImpzYiBjJG1haW5fYXJncyIgYXQgdGhlIGJlZ2lubmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggVkFYLTExICJDIi4KLSAqCi0gKglGSVhNRTogIHRoZSBtYWNybyBuYW1lIGBIQUNLX0RFQ19DX1NUQVJUVVAnIHNob3VsZCBiZSByZW5hbWVkCi0gKgkJdG8gYEhBQ0tfVkFYQ1JUTF9TVEFSVFVQJyBiZWNhdXNlIERpZ2l0YWwncyBjb21waWxlcgotICoJCW5hbWVkICJERUMgQyIgdXNlcyBydW4tdGltZSBsaWJyYXJ5ICJERUNDJFNIUiIsIGJ1dCB0aGlzCi0gKgkJc3RhcnR1cCBjb2RlIGlzIGZvciAiVkFYQ1JUTCIsIHRoZSBsaWJyYXJ5IGZvciBEaWdpdGFsJ3MKLSAqCQlvbGRlciAiVkFYIEMiLiAgQWxzbywgdGhpcyBleHRyYSBjb2RlIGlzbid0IG5lZWRlZCBmb3IKLSAqCQlzdXBwb3J0aW5nIGdjYyBiZWNhdXNlIGl0IGFscmVhZHkgZ2VuZXJhdGVzIHRoZSBWQVhDUlRMCi0gKgkJc3RhcnR1cCBjYWxsIHdoZW4gY29tcGlsaW5nIG1haW4oKS4gIFRoZSByZWZlcmVuY2UgdG8KLSAqCQlgZmxhZ19oYXNoX2xvbmdfbmFtZXMnIGxvb2tzIHZlcnkgc3VzcGljaW91cyB0b287Ci0gKgkJcHJvYmFibHkgYW4gb2xkLXN0eWxlIGNvbW1hbmQgbGluZSBvcHRpb24gd2FzIGluYWR2ZXJ0ZW50bHkKLSAqCQlvdmVybG9hZGVkIGhlcmUsIHRoZW4gYmxpbmRseSBjb252ZXJ0ZWQgaW50byB0aGUgbmV3IG9uZS4KLSAqLwotdm9pZAotdm1zX2NoZWNrX2Zvcl9tYWluICgpCi17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0jaWZkZWYJSEFDS19ERUNfQ19TVEFSVFVQCS8qIEpGICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBmcmNoYWluICpmcmNoYWluUDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBmcmFnUyAqKnByZXZfZnJhZ1BQOwotICByZWdpc3RlciBzdHJ1Y3QgZml4ICpmaXhQOwotICByZWdpc3RlciBmcmFnUyAqTmV3X0ZyYWc7Ci0gIGludCBpOwotI2VuZGlmCS8qIEhBQ0tfREVDX0NfU1RBUlRVUCAqLwotCi0gIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBzeW1ib2xfZmluZCAoIl9tYWluIik7Ci0gIGlmIChzeW1ib2xQICYmICFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJgotICAgICAgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgJiYgKFNfR0VUX1RZUEUgKHN5bWJvbFApID09IE5fVEVYVCkpCi0gICAgewotI2lmZGVmCUhBQ0tfREVDX0NfU1RBUlRVUAotICAgICAgaWYgKCFmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQl7Ci0jZW5kaWYKLQkgIC8qCi0JICAgKglSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3ltYm9sCi0JICAgKi8KLQkgIEVudHJ5X1BvaW50X1N5bWJvbCA9IHN5bWJvbFA7Ci0jaWZkZWYgSEFDS19ERUNfQ19TVEFSVFVQCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKglTY2FuIGFsbCB0aGUgZnJhZ21lbnQgY2hhaW5zIGZvciB0aGUgb25lIHdpdGggIl9tYWluIgotCSAgICoJKEFjdHVhbGx5IHdlIGtub3cgdGhlIGZyYWdtZW50IGZyb20gdGhlIHN5bWJvbCwgYnV0IHdlIG5lZWQKLQkgICAqCSB0aGUgcHJldmlvdXMgZnJhZ21lbnQgc28gd2UgY2FuIGNoYW5nZSBpdHMgcG9pbnRlcikKLQkgICAqLwotCSAgZnJjaGFpblAgPSBmcmNoYWluX3Jvb3Q7Ci0JICB3aGlsZSAoZnJjaGFpblApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCVNjYW4gYWxsIHRoZSBmcmFnbWVudHMgaW4gdGhpcyBjaGFpbiwgcmVtZW1iZXJpbmcKLQkgICAgICAgKgl0aGUgInByZXZpb3VzIGZyYWdtZW50IgotCSAgICAgICAqLwotCSAgICAgIHByZXZfZnJhZ1BQID0gJmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0JICAgICAgZnJhZ1AgPSBmcmNoYWluUC0+ZnJjaF9yb290OwotCSAgICAgIHdoaWxlIChmcmFnUCAmJiAoZnJhZ1AgIT0gZnJjaGFpblAtPmZyY2hfbGFzdCkpCi0JCXsKLQkJICAvKgotCQkgICAqCUlzIHRoaXMgdGhlIGZyYWdtZW50PwotCQkgICAqLwotCQkgIGlmIChmcmFnUCA9PSBzeW1ib2xQLT5zeV9mcmFnKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKglZZXM6IE1vZGlmeSB0aGUgZnJhZ21lbnQgYnkgcmVwbGFjaW5nCi0JCSAgICAgICAqCSAgICAgaXQgd2l0aCBhIG5ldyBmcmFnbWVudC4KLQkJICAgICAgICovCi0JCSAgICAgIE5ld19GcmFnID0gKGZyYWdTICopCi0JCQl4bWFsbG9jIChzaXplb2YgKCpOZXdfRnJhZykgKwotCQkJCSBmcmFnUC0+ZnJfZml4ICsKLQkJCQkgZnJhZ1AtPmZyX3ZhciArCi0JCQkJIDUpOwotCQkgICAgICAvKgotCQkgICAgICAgKglUaGUgZnJhZ21lbnRzIGFyZSB0aGUgc2FtZSBleGNlcHQKLQkJICAgICAgICoJdGhhdCB0aGUgImZpeGVkIiBhcmVhIGlzIGxhcmdlcgotCQkgICAgICAgKi8KLQkJICAgICAgKk5ld19GcmFnID0gKmZyYWdQOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfZml4ICs9IDY7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCUNvcHkgdGhlIGxpdGVyYWwgZGF0YSBvcGVuaW5nIGEgaG9sZQotCQkgICAgICAgKgkyIGJ5dGVzIGFmdGVyICJfbWFpbiIgKGkuZS4ganVzdCBhZnRlcgotCQkgICAgICAgKgl0aGUgZW50cnkgbWFzaykuICBJbnRvIHdoaWNoIHdlIHBsYWNlCi0JCSAgICAgICAqCXRoZSBKU0IgaW5zdHJ1Y3Rpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFswXSA9IGZyYWdQLT5mcl9saXRlcmFsWzBdOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFsxXSA9IGZyYWdQLT5mcl9saXRlcmFsWzFdOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFsyXSA9IDB4MTY7CS8qIEpzYiAqLwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFszXSA9IDB4ZWY7Ci0JCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzRdID0gMDsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbNV0gPSAwOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs2XSA9IDA7Ci0JCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzddID0gMDsKLQkJICAgICAgZm9yIChpID0gMjsgaSA8IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfdmFyOyBpKyspCi0JCQlOZXdfRnJhZy0+ZnJfbGl0ZXJhbFtpICsgNl0gPQotCQkJICBmcmFnUC0+ZnJfbGl0ZXJhbFtpXTsKLQkJICAgICAgLyoKLQkJICAgICAgICoJTm93IHJlcGxhY2UgdGhlIG9sZCBmcmFnbWVudCB3aXRoIHRoZQotCQkgICAgICAgKgluZXdseSBnZW5lcmF0ZWQgb25lLgotCQkgICAgICAgKi8KLQkJICAgICAgKnByZXZfZnJhZ1BQID0gTmV3X0ZyYWc7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCVJlbWVtYmVyIHRoZSBlbnRyeSBwb2ludCBzeW1ib2wKLQkJICAgICAgICovCi0JCSAgICAgIEVudHJ5X1BvaW50X1N5bWJvbCA9IHN5bWJvbFA7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCVNjYW4gdGhlIHRleHQgYXJlYSBmaXh1cCBzdHJ1Y3R1cmVzCi0JCSAgICAgICAqCWFzIG9mZnNldHMgaW4gdGhlIGZyYWdtZW50IG1heSBoYXZlCi0JCSAgICAgICAqCWNoYW5nZWQKLQkJICAgICAgICovCi0JCSAgICAgIGZvciAoZml4UCA9IHRleHRfZml4X3Jvb3Q7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotCQkJewotCQkJICAvKgotCQkJICAgKglMb29rIGZvciByZWZlcmVuY2VzIHRvIHRoaXMKLQkJCSAgICoJZnJhZ21lbnQuCi0JCQkgICAqLwotCQkJICBpZiAoZml4UC0+ZnhfZnJhZyA9PSBmcmFnUCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJQ2hhbmdlIHRoZSBmcmFnbWVudAotCQkJICAgICAgICoJcG9pbnRlcgotCQkJICAgICAgICovCi0JCQkgICAgICBmaXhQLT5meF9mcmFnID0gTmV3X0ZyYWc7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJSWYgdGhlIG9mZnNldCBpcyBhZnRlcgotCQkJICAgICAgICoJdGhlIGVudHJ5IG1hc2sgd2UgbmVlZAotCQkJICAgICAgICoJdG8gYWNjb3VudCBmb3IgdGhlIEpTQgotCQkJICAgICAgICoJaW5zdHJ1Y3Rpb24gd2UganVzdAotCQkJICAgICAgICoJaW5zZXJ0ZWQuCi0JCQkgICAgICAgKi8KLQkJCSAgICAgIGlmIChmaXhQLT5meF93aGVyZSA+PSAyKQotCQkJCWZpeFAtPmZ4X3doZXJlICs9IDY7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICAvKgotCQkgICAgICAgKglTY2FuIHRoZSBzeW1ib2xzIGFzIG9mZnNldHMgaW4gdGhlCi0JCSAgICAgICAqCWZyYWdtZW50IG1heSBoYXZlIGNoYW5nZWQKLQkJICAgICAgICovCi0JCSAgICAgIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLQkJCSAgIHN5bWJvbFA7Ci0JCQkgICBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotCQkJewotCQkJICAvKgotCQkJICAgKglMb29rIGZvciByZWZlcmVuY2VzIHRvIHRoaXMKLQkJCSAgICoJZnJhZ21lbnQuCi0JCQkgICAqLwotCQkJICBpZiAoc3ltYm9sUC0+c3lfZnJhZyA9PSBmcmFnUCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJQ2hhbmdlIHRoZSBmcmFnbWVudAotCQkJICAgICAgICoJcG9pbnRlcgotCQkJICAgICAgICovCi0JCQkgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gTmV3X0ZyYWc7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJSWYgdGhlIG9mZnNldCBpcyBhZnRlcgotCQkJICAgICAgICoJdGhlIGVudHJ5IG1hc2sgd2UgbmVlZAotCQkJICAgICAgICoJdG8gYWNjb3VudCBmb3IgdGhlIEpTQgotCQkJICAgICAgICoJaW5zdHJ1Y3Rpb24gd2UganVzdAotCQkJICAgICAgICoJaW5zZXJ0ZWQuCi0JCQkgICAgICAgKi8KLQkJCSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPj0gMikKLQkJCQlTX1NFVF9WQUxVRSAoc3ltYm9sUCwKLQkJCQkJICAgICBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyA2KTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCU1ha2UgYSBzeW1ib2wgcmVmZXJlbmNlIHRvCi0JCSAgICAgICAqCSJfYyRtYWluX2FyZ3MiIHNvIHdlIGNhbiBnZXQKLQkJICAgICAgICoJaXRzIGFkZHJlc3MgaW5zZXJ0ZWQgaW50byB0aGUKLQkJICAgICAgICoJSlNCIGluc3RydWN0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgc3ltYm9sUCA9IChzeW1ib2xTICopIHhtYWxsb2MgKHNpemVvZiAoKnN5bWJvbFApKTsKLQkJICAgICAgU19TRVRfTkFNRSAoc3ltYm9sUCwgIl9DJE1BSU5fQVJHUyIpOwotCQkgICAgICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1VOREYpOwotCQkgICAgICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgMCk7Ci0JCSAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIDApOwotCQkgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgMCk7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfbnVtYmVyID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfb2JqID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IE5ld19GcmFnOwotCQkgICAgICBzeW1ib2xQLT5zeV9yZXNvbHZlZCA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X3Jlc29sdmluZyA9IDA7Ci0JCSAgICAgIC8qIHRoaXMgYWN0dWFsbHkgaW5zZXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ICovCi0JCSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbF9yb290UCwgc3ltYm9sUCwKLQkJCQkgICAgICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0JCSAgICAgIHN5bWJvbF9yb290UCA9IHN5bWJvbFA7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCUdlbmVyYXRlIGEgdGV4dCBmaXh1cCBzdHJ1Y3R1cmUKLQkJICAgICAgICoJdG8gZ2V0ICJfYyRtYWluX2FyZ3MiIHN0b3JlZCBpbnRvIHRoZQotCQkgICAgICAgKglKU0IgaW5zdHJ1Y3Rpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBmaXhQID0gKHN0cnVjdCBmaXggKikgeG1hbGxvYyAoc2l6ZW9mICgqZml4UCkpOwotCQkgICAgICBmaXhQLT5meF9mcmFnID0gTmV3X0ZyYWc7Ci0JCSAgICAgIGZpeFAtPmZ4X3doZXJlID0gNDsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzeW1ib2xQOwotCQkgICAgICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCSAgICAgIGZpeFAtPmZ4X29mZnNldCA9IDA7Ci0JCSAgICAgIGZpeFAtPmZ4X3NpemUgPSA0OwotCQkgICAgICBmaXhQLT5meF9wY3JlbCA9IDE7Ci0JCSAgICAgIGZpeFAtPmZ4X25leHQgPSB0ZXh0X2ZpeF9yb290OwotCQkgICAgICB0ZXh0X2ZpeF9yb290ID0gZml4UDsKLQkJICAgICAgLyoKLQkJICAgICAgICoJTm93IG1ha2Ugc3VyZSB3ZSBleGl0IGZyb20gdGhlIGxvb3AKLQkJICAgICAgICovCi0JCSAgICAgIGZyY2hhaW5QID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyoKLQkJICAgKglUcnkgdGhlIG5leHQgZnJhZ21lbnQKLQkJICAgKi8KLQkJICBwcmV2X2ZyYWdQUCA9ICZmcmFnUC0+ZnJfbmV4dDsKLQkJICBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0OwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKglUcnkgdGhlIG5leHQgZnJhZ21lbnQgY2hhaW4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoZnJjaGFpblApCi0JCWZyY2hhaW5QID0gZnJjaGFpblAtPmZyY2hfbmV4dDsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBIQUNLX0RFQ19DX1NUQVJUVVAgKi8KLSAgICB9Ci19Ci0MCi0KLS8qCi0gKglCZWdpbm5pbmcgb2Ygdm1zX3dyaXRlX29iamVjdF9maWxlKCkuCi0gKi8KLQotc3RhdGljCi1zdHJ1Y3Qgdm1zX29ial9zdGF0ZSB7Ci0KLSAgLyogTmV4dCBwcm9ncmFtIHNlY3Rpb24gaW5kZXggdG8gdXNlLiAgKi8KLSAgaW50CXBzZWN0X251bWJlcjsKLQotICAvKiBQc2VjdCBpbmRleCBmb3IgY29kZS4gIEFsd2F5cyBlbmRzIHVwICMwLiAgKi8KLSAgaW50CXRleHRfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIGluaXRpYWxpemVkIHN0YXRpYyB2YXJpYWJsZXMuICAqLwotICBpbnQJZGF0YV9wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3IgdW5pbml0aWFsaXplZCBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLSAgaW50CWJzc19wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3Igc3RhdGljIGNvbnN0cnVjdG9ycy4gICovCi0gIGludAljdG9yc19wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3Igc3RhdGljIGRlc3RydWN0b3JzLiAgKi8KLSAgaW50CWR0b3JzX3BzZWN0OwotCi0gIC8qIE51bWJlciBvZiBieXRlcyB1c2VkIGZvciBsb2NhbCBzeW1ib2wgZGF0YS4gICovCi0gIGludAlsb2NhbF9pbml0ZF9kYXRhX3NpemU7Ci0KLSAgLyogRHluYW1pYyBidWZmZXIgZm9yIGluaXRpYWxpemVkIGRhdGEuICAqLwotICBjaGFyICpkYXRhX3NlZ21lbnQ7Ci0KLX0gdm1zX29ial9zdGF0ZTsKLQotI2RlZmluZSBQc2VjdF9OdW1iZXIJCXZtc19vYmpfc3RhdGUucHNlY3RfbnVtYmVyCi0jZGVmaW5lIFRleHRfUHNlY3QJCXZtc19vYmpfc3RhdGUudGV4dF9wc2VjdAotI2RlZmluZSBEYXRhX1BzZWN0CQl2bXNfb2JqX3N0YXRlLmRhdGFfcHNlY3QKLSNkZWZpbmUgQnNzX1BzZWN0CQl2bXNfb2JqX3N0YXRlLmJzc19wc2VjdAotI2RlZmluZSBDdG9yc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5jdG9yc19wc2VjdAotI2RlZmluZSBEdG9yc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5kdG9yc19wc2VjdAotI2RlZmluZSBMb2NhbF9Jbml0ZF9EYXRhX1NpemUJdm1zX29ial9zdGF0ZS5sb2NhbF9pbml0ZF9kYXRhX3NpemUKLSNkZWZpbmUgRGF0YV9TZWdtZW50CQl2bXNfb2JqX3N0YXRlLmRhdGFfc2VnbWVudAotCi0KLSNkZWZpbmUgSVNfR1hYX1ZUQUJMRShzeW1QKSAoc3RybmNtcCAoU19HRVRfTkFNRSAoc3ltUCksICJfX3Z0LiIsIDUpID09IDApCi0jZGVmaW5lIElTX0dYWF9YVE9SKHN5bVApIChzdHJuY21wIChTX0dFVF9OQU1FIChzeW1QKSwgIl9fR0xPQkFMXy4iLCAxMCkgPT0gMCkKLSNkZWZpbmUgWFRPUl9TSVpFIDQKLQwKLQotLyogUGVyZm9ybSB0ZXh0IHNlZ21lbnQgZml4dXBzLiAgKi8KLQotc3RhdGljIHZvaWQKLXZtc19maXh1cF90ZXh0X3NlY3Rpb24gKHRleHRfc2l6LCB0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QpCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6OwotICAgICBzdHJ1Y3QgZnJhZyAqdGV4dF9mcmFnX3Jvb3Q7Ci0gICAgIHN0cnVjdCBmcmFnICpkYXRhX2ZyYWdfcm9vdDsKLXsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBzdHJ1Y3QgZml4ICpmaXhQOwotICBvZmZzZXRUIGRpZjsKLQotICAvKiBTY2FuIHRoZSB0ZXh0IGZyYWdtZW50cy4gICovCi0gIGZvciAoZnJhZ1AgPSB0ZXh0X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgLyogU3RvcCBpZiB3ZSBnZXQgdG8gdGhlIGRhdGEgZnJhZ21lbnRzLiAgKi8KLSAgICAgIGlmIChmcmFnUCA9PSBkYXRhX2ZyYWdfcm9vdCkKLQlicmVhazsKLSAgICAgIC8qIElnbm9yZSBmcmFnbWVudHMgd2l0aCBubyBkYXRhLiAgKi8KLSAgICAgIGlmICgoZnJhZ1AtPmZyX2ZpeCA9PSAwKSAmJiAoZnJhZ1AtPmZyX3ZhciA9PSAwKSkKLQljb250aW51ZTsKLSAgICAgIC8qIEdvIHRoZSB0aGUgYXBwcm9wcmlhdGUgb2Zmc2V0IGluIHRoZSBUZXh0IFBzZWN0LiAgKi8KLSAgICAgIFZNU19TZXRfUHNlY3QgKFRleHRfUHNlY3QsIGZyYWdQLT5mcl9hZGRyZXNzLCBPQkpfU19DX1RJUik7Ci0gICAgICAvKiBTdG9yZSB0aGUgImZpeGVkIiBwYXJ0LiAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfZml4KQotCVZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoZnJhZ1AtPmZyX2xpdGVyYWwsCi0JCQkJICBmcmFnUC0+ZnJfZml4LAotCQkJCSAgT0JKX1NfQ19USVIpOwotICAgICAgLyogU3RvcmUgdGhlICJ2YXJpYWJsZSIgcGFydC4gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3ZhciAmJiBmcmFnUC0+ZnJfb2Zmc2V0KQotCVZNU19TdG9yZV9SZXBlYXRlZF9EYXRhIChmcmFnUC0+ZnJfb2Zmc2V0LAotCQkJCSBmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsCi0JCQkJIGZyYWdQLT5mcl92YXIsCi0JCQkJIE9CSl9TX0NfVElSKTsKLSAgICB9CQkJLyogdGV4dCBmcmFnIGxvb3AgKi8KLQotICAvKgotICAgKglOb3cgd2UgZ28gdGhyb3VnaCB0aGUgdGV4dCBzZWdtZW50IGZpeHVwcyBhbmQgZ2VuZXJhdGUKLSAgICoJVElSIHJlY29yZHMgdG8gZml4IHVwIGFkZHJlc3NlcyB3aXRoaW4gdGhlIFRleHQgUHNlY3QuCi0gICAqLwotICBmb3IgKGZpeFAgPSB0ZXh0X2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBXZSBETyBoYW5kbGUgdGhlIGNhc2Ugb2YgIlN5bWJvbCAtIFN5bWJvbCIgYXMKLQkgbG9uZyBhcyBpdCBpcyBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9zdWJzeSAmJiBmaXhQLT5meF9hZGRzeSkKLQl7Ci0JICAvKiBUaGV5IG5lZWQgdG8gYmUgaW4gdGhlIHNhbWUgc2VnbWVudC4gICovCi0JICBpZiAoU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X3N1YnN5KSAhPQotCSAgICAgIFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9hZGRzeSkpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIHRoZSBzYW1lIHR5cGUiKSk7Ci0JICAvKiBBbmQgdGhleSBuZWVkIHRvIGJlIGluIG9uZSB0aGF0IHdlIGNhbiBjaGVjayB0aGUgcHNlY3Qgb24uICAqLwotCSAgaWYgKChTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkgIT0gTl9EQVRBKSAmJgotCQkgICAgKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX1RFWFQpKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIikpOwotCSAgLyogVGhpcyBoYWQgYmV0dGVyIG5vdCBiZSBQQyByZWxhdGl2ZSEgICovCi0JICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXRhIGlzIGVycm9uZW91c2x5IFwicGNyZWxcIiIpKTsKLQkgIC8qIFN1YnRyYWN0IHRoZWlyIHZhbHVlcyB0byBnZXQgdGhlIGRpZmZlcmVuY2UuICAqLwotCSAgZGlmID0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KSAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKExvY2FsLCAodmFsdWVUKWRpZiwgZml4UC0+Znhfc2l6ZSk7Ci0JICAvKiBOb3cgZ2VuZXJhdGUgdGhlIGZpeHVwIG9iamVjdCByZWNvcmRzOwotCSAgICAgc2V0IHRoZSBwc2VjdCBhbmQgc3RvcmUgdGhlIGRhdGEuICAqLwotCSAgVk1TX1NldF9Qc2VjdCAoVGV4dF9Qc2VjdCwKLQkJCSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkgT0JKX1NfQ19USVIpOwotCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwKLQkJCQkgICAgZml4UC0+Znhfc2l6ZSwKLQkJCQkgICAgT0JKX1NfQ19USVIpOwotCSAgY29udGludWU7CS8qIGRvbmUgd2l0aCB0aGlzIGZpeHVwICovCi0JICAgIH0JCS8qIGlmIGZ4X3N1YnN5ICYmIGZ4X2FkZHN5ICovCi0gICAgICAvKiBTaXplIHdpbGwgSEFWRSB0byBiZSAibG9uZyIuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X3NpemUgIT0gNCkKLQllcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiKSk7Ci0gICAgICAvKiBTeW1ib2wgbXVzdCBiZSAiYWRkZWQiIChpZiBpdCBpcyBldmVyCi0JIHN1YnRyYWN0ZWQgd2UgY2FuIGZpeCB0aGlzIGFzc3VtcHRpb24pLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwKQotCWVycm9yIChfKCJGaXh1cCBkYXR1bSBpcyBub3QgXCJmaXhQLT5meF9hZGRzeVwiIikpOwotICAgICAgLyogU3RvcmUgdGhlIHN5bWJvbCB2YWx1ZSBpbiBhIFBJQyBmYXNoaW9uLiAgKi8KLSAgICAgIFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSAoZml4UC0+ZnhfYWRkc3ksCi0JCQkJICAgICAgZml4UC0+Znhfb2Zmc2V0LAotCQkJCSAgICAgIGZpeFAtPmZ4X3BjcmVsLAotCQkJCSAgICAgIFRleHRfUHNlY3QsCi0JCQkJICAgIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgICAgICBPQkpfU19DX1RJUik7Ci0JICAvKgotCSAgICogIENoZWNrIGZvciBpbmRpcmVjdCBhZGRyZXNzIHJlZmVyZW5jZSwgd2hpY2ggaGFzIHRvIGJlIGZpeGVkIHVwCi0JICAgKiAgKGFzIHRoZSBsaW5rZXIgd2lsbCBzY3JldyBpdCB1cCB3aXRoIFRJUl9TX0NfU1RPX1BJQ1IpLi4uCi0JICAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlWTVNfRml4X0luZGlyZWN0X1JlZmVyZW5jZSAoVGV4dF9Qc2VjdCwKLQkJCQkgICAgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJCSAgICBmaXhQLT5meF9mcmFnLAotCQkJCSAgICB0ZXh0X2ZyYWdfcm9vdCk7Ci0gICAgfQkJCS8qIHRleHQgZml4IGxvb3AgKi8KLX0KLQwKLQotLyogQ3JlYXRlIGEgYnVmZmVyIGhvbGRpbmcgdGhlIGRhdGEgc2VnbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zeW50aGVzaXplX2RhdGFfc2VnbWVudCAoZGF0YV9zaXosIHRleHRfc2l6LCBkYXRhX2ZyYWdfcm9vdCkKLSAgICAgdW5zaWduZWQgZGF0YV9zaXosIHRleHRfc2l6OwotICAgICBzdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7Ci17Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgY2hhciAqZmlsbF9saXRlcmFsOwotICBsb25nIGZpbGxfc2l6ZSwgY291bnQsIGk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIGRhdGEgc2VnbWVudC4gICovCi0gIERhdGFfU2VnbWVudCA9IChjaGFyICopIHhtYWxsb2MgKGRhdGFfc2l6KTsKLSAgLyogUnVuIHRocm91Z2ggdGhlIGRhdGEgZnJhZ21lbnRzLCBmaWxsaW5nIGluIHRoZSBzZWdtZW50LiAgKi8KLSAgZm9yIChmcmFnUCA9IGRhdGFfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBpID0gZnJhZ1AtPmZyX2FkZHJlc3MgLSB0ZXh0X3NpejsKLSAgICAgIGlmIChmcmFnUC0+ZnJfZml4KQotCW1lbWNweSAoRGF0YV9TZWdtZW50ICsgaSwgZnJhZ1AtPmZyX2xpdGVyYWwsIGZyYWdQLT5mcl9maXgpOwotICAgICAgaSArPSBmcmFnUC0+ZnJfZml4OwotCi0gICAgICBpZiAoKGZpbGxfc2l6ZSA9IGZyYWdQLT5mcl92YXIpICE9IDApCi0JewotCSAgZmlsbF9saXRlcmFsID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4OwotCSAgZm9yIChjb3VudCA9IGZyYWdQLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChEYXRhX1NlZ21lbnQgKyBpLCBmaWxsX2xpdGVyYWwsIGZpbGxfc2l6ZSk7Ci0JICAgICAgaSArPSBmaWxsX3NpemU7Ci0JICAgIH0KLQl9Ci0gICAgfQkJCS8qIGRhdGEgZnJhZyBsb29wICovCi0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFBlcmZvcm0gZGF0YSBzZWdtZW50IGZpeHVwcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZml4dXBfZGF0YV9zZWN0aW9uIChkYXRhX3NpeiwgdGV4dF9zaXopCi0gICAgIHVuc2lnbmVkIGRhdGFfc2l6LCB0ZXh0X3NpejsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLSAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7Ci0gIGFkZHJlc3NUIGZyX2FkZHJlc3M7Ci0gIG9mZnNldFQgZGlmOwotICB2YWx1ZVQgdmFsOwotCi0gIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgZGF0YSBzeW1ib2xzIGFuZCBzdG9yZSB0aGUgZGF0YS4gICovCi0gIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotICAgIHsKLSAgICAgIC8qIElnbm9yZSBhbnl0aGluZyBvdGhlciB0aGFuIGRhdGEgc3ltYm9scy4gICovCi0gICAgICBpZiAoU19HRVRfVFlQRSAodnNwLT5TeW1ib2wpICE9IE5fREFUQSkKLQljb250aW51ZTsKLSAgICAgIC8qIFNldCB0aGUgUHNlY3QgKyBPZmZzZXQuICAqLwotICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJICAgICAgIHZzcC0+UHNlY3RfT2Zmc2V0LAotCQkgICAgICAgT0JKX1NfQ19USVIpOwotICAgICAgLyogU3RvcmUgdGhlIGRhdGEuICAqLwotICAgICAgdmFsID0gU19HRVRfVkFMVUUgKHZzcC0+U3ltYm9sKTsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoRGF0YV9TZWdtZW50ICsgdmFsIC0gdGV4dF9zaXosCi0JCQkJdnNwLT5TaXplLAotCQkJCU9CSl9TX0NfVElSKTsKLSAgICB9CQkJLyogTl9EQVRBIHN5bWJvbCBsb29wICovCi0KLSAgLyoKLSAgICoJTm93IHdlIGdvIHRocm91Z2ggdGhlIGRhdGEgc2VnbWVudCBmaXh1cHMgYW5kIGdlbmVyYXRlCi0gICAqCVRJUiByZWNvcmRzIHRvIGZpeCB1cCBhZGRyZXNzZXMgd2l0aGluIHRoZSBEYXRhIFBzZWN0cy4KLSAgICovCi0gIGZvciAoZml4UCA9IGRhdGFfZml4X3Jvb3Q7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIC8qIEZpbmQgdGhlIHN5bWJvbCBmb3IgdGhlIGNvbnRhaW5pbmcgZGF0dW0uICAqLwotICAgICAgZm9yICh2c3AgPSBWTVNfU3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0JewotCSAgLyogT25seSBib3RoZXIgd2l0aCBEYXRhIHN5bWJvbHMuICAqLwotCSAgc3AgPSB2c3AtPlN5bWJvbDsKLQkgIGlmIChTX0dFVF9UWVBFIChzcCkgIT0gTl9EQVRBKQotCSAgICBjb250aW51ZTsKLQkgIC8qIElnbm9yZSBzeW1ib2wgaWYgQWZ0ZXIgZml4dXAuICAqLwotCSAgdmFsID0gU19HRVRfVkFMVUUgKHNwKTsKLQkgIGZyX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotCSAgaWYgKHZhbCA+IGZpeFAtPmZ4X3doZXJlICsgZnJfYWRkcmVzcykKLQkgICAgY29udGludWU7Ci0JICAvKiBTZWUgaWYgdGhlIGRhdHVtIGlzIGhlcmUuICAqLwotCSAgaWYgKHZhbCArIHZzcC0+U2l6ZSA8PSBmaXhQLT5meF93aGVyZSArIGZyX2FkZHJlc3MpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogV2UgRE8gaGFuZGxlIHRoZSBjYXNlIG9mICJTeW1ib2wgLSBTeW1ib2wiIGFzCi0JICAgICBsb25nIGFzIGl0IGlzIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgaWYgKGZpeFAtPmZ4X3N1YnN5ICYmIGZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgLyogVGhleSBuZWVkIHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoZml4UC0+Znhfc3Vic3kpICE9Ci0JCSAgU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSkKLQkJZXJyb3IgKF8oIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgdGhlIHNhbWUgdHlwZSIpKTsKLQkgICAgICAvKiBBbmQgdGhleSBuZWVkIHRvIGJlIGluIG9uZSB0aGF0IHdlIGNhbiBjaGVjayB0aGUgcHNlY3Qgb24uICAqLwotCSAgICAgIGlmICgoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fREFUQSkgJiYKLQkJICAoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fVEVYVCkpCi0JCWVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIGFuIGFwcHJvcHJpYXRlIHR5cGUiKSk7Ci0JICAgICAgLyogVGhpcyBoYWQgYmV0dGVyIG5vdCBiZSBQQyByZWxhdGl2ZSEgICovCi0JICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCQllcnJvciAoXygiRml4dXAgZGF0YSBpcyBlcnJvbmVvdXNseSBcInBjcmVsXCIiKSk7Ci0JICAgICAgLyogU3VidHJhY3QgdGhlaXIgdmFsdWVzIHRvIGdldCB0aGUgZGlmZmVyZW5jZS4gICovCi0JICAgICAgZGlmID0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KSAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChMb2NhbCwgKHZhbHVlVClkaWYsIGZpeFAtPmZ4X3NpemUpOwotCSAgICAgIC8qCi0JICAgICAgICogTm93IGdlbmVyYXRlIHRoZSBmaXh1cCBvYmplY3QgcmVjb3JkczsKLQkgICAgICAgKiBzZXQgdGhlIHBzZWN0IGFuZCBzdG9yZSB0aGUgZGF0YS4KLQkgICAgICAgKi8KLQkgICAgICBWTVNfU2V0X1BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LAotCQkJICAgICBmcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUKLQkJCQkgLSB2YWwgKyB2c3AtPlBzZWN0X09mZnNldCwKLQkJCSAgICAgT0JKX1NfQ19USVIpOwotCSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsCi0JCQkJCWZpeFAtPmZ4X3NpemUsCi0JCQkJCU9CSl9TX0NfVElSKTsKLQkJICBicmVhazsJLyogZG9uZSB3aXRoIHRoaXMgZml4dXAgKi8KLQkJfQotCSAgLyogU2l6ZSB3aWxsIEhBVkUgdG8gYmUgImxvbmciLiAgKi8KLQkgIGlmIChmaXhQLT5meF9zaXplICE9IDQpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXR1bSBpcyBub3QgYSBsb25nd29yZCIpKTsKLQkgIC8qIFN5bWJvbCBtdXN0IGJlICJhZGRlZCIgKGlmIGl0IGlzIGV2ZXIKLQkgICAgIHN1YnRyYWN0ZWQgd2UgY2FuIGZpeCB0aGlzIGFzc3VtcHRpb24pLiAgKi8KLQkgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IFwiZml4UC0+ZnhfYWRkc3lcIiIpKTsKLQkgIC8qIFN0b3JlIHRoZSBzeW1ib2wgdmFsdWUgaW4gYSBQSUMgZmFzaGlvbi4gICovCi0JICBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKGZpeFAtPmZ4X2FkZHN5LAotCQkJCQkgIGZpeFAtPmZ4X29mZnNldCwKLQkJCQkJICBmaXhQLT5meF9wY3JlbCwKLQkJCQkJICB2c3AtPlBzZWN0X0luZGV4LAotCQkJCQkgIGZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZQotCQkJCQkgICAgICAtIHZhbCArIHZzcC0+UHNlY3RfT2Zmc2V0LAotCQkJCQkgIE9CSl9TX0NfVElSKTsKLQkgIC8qIERvbmUgd2l0aCB0aGlzIGZpeHVwLiAgKi8KLQkgIGJyZWFrOwotCX0JCS8qIHZtc19zeW1ib2wgbG9vcCAqLwotCi0gICAgfQkJCS8qIGRhdGEgZml4IGxvb3AgKi8KLX0KLQotLyogUGVyZm9ybSBjdG9ycy9kdG9ycyBzZWdtZW50IGZpeHVwcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoc3ltYm9scywgc2VjdF9ubykKLQlzdHJ1Y3QgVk1TX1N5bWJvbCAqc3ltYm9sczsKLQlpbnQgc2VjdF9ubzsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLQotICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMgYW5kIHN0b3JlIHRoZSBkYXRhLiAgKi8KLSAgZm9yICh2c3AgPSBzeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzeW1ib2xTICpzcDsKLQotICAgICAgLyogU2V0IHJlbG9jYXRpb24gYmFzZS4gICovCi0gICAgICBWTVNfU2V0X1BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LCB2c3AtPlBzZWN0X09mZnNldCwgT0JKX1NfQ19USVIpOwotCi0gICAgICBzcCA9IHZzcC0+U3ltYm9sOwotICAgICAgLyogU3RhY2sgdGhlIFBzZWN0IGJhc2Ugd2l0aCBpdHMgb2Zmc2V0LiAgKi8KLSAgICAgIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgU19HRVRfVkFMVUUgKHNwKSwgT0JKX1NfQ19USVIsIDApOwotICAgIH0KLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotCi0gIHJldHVybjsKLX0KLQwKLQotLyogRGVmaW5lIHN5bWJvbHMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkgKHRleHRfc2l6LCBkYXRhX3NpeikKLSAgICAgdW5zaWduZWQgdGV4dF9zaXosIGRhdGFfc2l6OwotewotICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOwotICByZWdpc3RlciBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwOwotICBpbnQgR2xvYmFscmVmLCBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbDsKLQotI2lmIDAKLSAgLyogVGhlIGcrKyBjb21waWxlciBkb2VzIG5vdCB3cml0ZSBvdXQgZXh0ZXJuYWwgcmVmZXJlbmNlcyB0bwotICAgICB2dGFibGVzIGNvcnJlY3RseS4gIENoZWNrIGZvciB0aGlzIGFuZCBob2xsZXIgaWYgd2Ugc2VlIGl0Ci0gICAgIGhhcHBlbmluZy4gIElmIHRoYXQgY29tcGlsZXIgYnVnIGlzIGV2ZXIgZml4ZWQgd2UgY2FuIHJlbW92ZQotICAgICB0aGlzLgotCi0gICAgIChKdW4nOTU6IGdjYyAyLjcuMCdzIGNjMXBsdXMgc3RpbGwgZXhoaWJpdHMgdGhpcyBiZWhhdmlvci4pCi0KLSAgICAgVGhpcyB3YXMgcmVwb3J0ZWRseSBmaXhlZCBhcyBvZiBKdW5lIDIsIDE5OTguICAgKi8KLQotICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQotICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3ApID09IE5fVU5ERiAmJiBJU19HWFhfVlRBQkxFIChzcCkpCi0gICAgICB7Ci0JU19TRVRfVFlQRSAoc3AsIE5fVU5ERiB8IE5fRVhUKTsKLQlTX1NFVF9PVEhFUiAoc3AsIDEpOwotCWFzX3dhcm4gKF8oImcrKyB3cm90ZSBhbiBleHRlcm4gcmVmZXJlbmNlIHRvIGAlcycgYXMgYSByb3V0aW5lLlxuSSB3aWxsIGZpeCBpdCwgYnV0IEkgaG9wZSB0aGF0IGl0IHdhcyBub3RlIHJlYWxseSBhIHJvdXRpbmUuIiksCi0JCSBTX0dFVF9OQU1FIChzcCkpOwotICAgICAgfQotI2VuZGlmCi0KLSAgLyoKLSAgICogTm93IHNjYW4gdGhlIHN5bWJvbHMgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIEdTRCByZWNvcmRzCi0gICAqLwotICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQotICAgIHsKLSAgICAgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMDsKLSAgICAgIHZzcCA9IDA7Ci0gICAgICAvKiBEaXNwYXRjaCBvbiBzeW1ib2wgdHlwZS4gICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzcCkpCi0JewotCi0JLyogR2xvYmFsIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICB2c3AtPlNpemUgPSBTX0dFVF9WQUxVRSAoc3ApOwotCSAgdnNwLT5Qc2VjdF9JbmRleCA9IFBzZWN0X051bWJlcisrOwotCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAwOwotCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgIHNwLT5zeV9vYmogPSB2c3A7Ci0JICAvKiBNYWtlIHRoZSBwc2VjdCBmb3IgdGhpcyBkYXRhLiAgKi8KLQkgIEdsb2JhbHJlZiA9IFZNU19Qc2VjdF9TcGVjIChTX0dFVF9OQU1FIChzcCksCi0JCQkJICAgICAgdnNwLT5TaXplLAotCQkJCSAgICAgIFNfR0VUX09USEVSIChzcCkgPyBwc19DT05TVCA6IHBzX0NPTU1PTiwKLQkJCQkgICAgICB2c3ApOwotCSAgaWYgKEdsb2JhbHJlZikKLQkgICAgUHNlY3RfTnVtYmVyLS07Ci0jaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMTsKLSNlbHNlCi0JICAvKiBTZWUgaWYgdGhpcyBpcyBhbiBleHRlcm5hbCB2dGFibGUuICBXZSB3YW50IHRvIGhlbHAgdGhlCi0JICAgICBsaW5rZXIgZmluZCB0aGVzZSB0aGluZ3MgaW4gbGlicmFyaWVzLCBzbyB3ZSBtYWtlIGEgc3ltYm9sCi0JICAgICByZWZlcmVuY2UuICBUaGlzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggVkFYLUMgdXNhZ2UgZm9yCi0JICAgICB2YXJpYWJsZXMsIGJ1dCBzaW5jZSB2dGFibGVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieQotCSAgICAgZysrLCB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzIGhhY2suICAqLwotCSAgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wgPSBJU19HWFhfVlRBQkxFIChzcCk7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JLyogTG9jYWwgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQljYXNlIE5fQlNTOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgIHZzcC0+U2l6ZSA9IDA7Ci0JICB2c3AtPlBzZWN0X0luZGV4ID0gQnNzX1BzZWN0OwotCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApIC0gYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzOwotCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgIHNwLT5zeV9vYmogPSB2c3A7Ci0JICBicmVhazsKLQotCS8qIEdsb2JhbCBpbml0aWFsaXplZCBkYXRhLiAgKi8KLQljYXNlIE5fREFUQSB8IE5fRVhUOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgIHZzcC0+U2l6ZSA9IFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHNwLCB0ZXh0X3NpeiArIGRhdGFfc2l6KTsKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSBQc2VjdF9OdW1iZXIrKzsKLQkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gMDsKLQkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICBzcC0+c3lfb2JqID0gdnNwOwotCSAgLyogTWFrZSBpdHMgcHNlY3QuICAqLwotCSAgR2xvYmFscmVmID0gVk1TX1BzZWN0X1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKLQkJCQkgICAgICB2c3AtPlNpemUsCi0JCQkJICAgICAgU19HRVRfT1RIRVIgKHNwKSA/IHBzX0NPTlNUIDogcHNfQ09NTU9OLAotCQkJCSAgICAgIHZzcCk7Ci0JICBpZiAoR2xvYmFscmVmKQotCSAgICBQc2VjdF9OdW1iZXItLTsKLSNpZmRlZglOT1RfVkFYXzExX0NfQ09NUEFUSUJMRQotCSAgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wgPSAxOwotI2Vsc2UKLQkgIC8qIFNlZSBOX1VOREZ8Tl9FWFQgYWJvdmUgZm9yIGV4cGxhbmF0aW9uLiAgKi8KLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gSVNfR1hYX1ZUQUJMRSAoc3ApOwotI2VuZGlmCi0JICBicmVhazsKLQotCS8qIExvY2FsIGluaXRpYWxpemVkIGRhdGEuICAqLwotCWNhc2UgTl9EQVRBOgotCSAgewotCSAgICBjaGFyICpzeW1fbmFtZSA9IFNfR0VUX05BTUUgKHNwKTsKLQotCSAgICAvKiBBbHdheXMgc3VwcHJlc3MgbG9jYWwgbnVtZXJpYyBsYWJlbHMuICAqLwotCSAgICBpZiAoc3ltX25hbWUgJiYgc3RyY21wIChzeW1fbmFtZSwgRkFLRV9MQUJFTF9OQU1FKSA9PSAwKQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgICB2c3AtPlN5bWJvbCA9IHNwOwotCSAgICB2c3AtPlNpemUgPSBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIChzcCwgdGV4dF9zaXogKyBkYXRhX3Npeik7Ci0JICAgIHZzcC0+UHNlY3RfSW5kZXggPSBEYXRhX1BzZWN0OwotCSAgICB2c3AtPlBzZWN0X09mZnNldCA9IExvY2FsX0luaXRkX0RhdGFfU2l6ZTsKLQkgICAgTG9jYWxfSW5pdGRfRGF0YV9TaXplICs9IHZzcC0+U2l6ZTsKLQkgICAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICAgIFZNU19TeW1ib2xzID0gdnNwOwotCSAgICBzcC0+c3lfb2JqID0gdnNwOwotCSAgfQotCSAgYnJlYWs7Ci0KLQkvKiBHbG9iYWwgVGV4dCBkZWZpbml0aW9uLiAgKi8KLQljYXNlIE5fVEVYVCB8IE5fRVhUOgotCSAgewotCi0JICAgIGlmIChJU19HWFhfWFRPUiAoc3ApKQotCSAgICAgIHsKLQkJdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkJdnNwLT5TeW1ib2wgPSBzcDsKLQkJdnNwLT5TaXplID0gWFRPUl9TSVpFOwotCQlzcC0+c3lfb2JqID0gdnNwOwotCQlzd2l0Y2ggKChTX0dFVF9OQU1FIChzcCkpWzEwXSkKLQkJICB7Ci0JCSAgICBjYXNlICdJJzoKLQkJICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IEN0b3JzX1BzZWN0OwotCQkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IChDdG9yc19TeW1ib2xzPT0wKT8wOihDdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQrWFRPUl9TSVpFKTsKLQkJICAgICAgdnNwLT5OZXh0ID0gQ3RvcnNfU3ltYm9sczsKLQkJICAgICAgQ3RvcnNfU3ltYm9scyA9IHZzcDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IER0b3JzX1BzZWN0OwotCQkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IChEdG9yc19TeW1ib2xzPT0wKT8wOihEdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQrWFRPUl9TSVpFKTsKLQkJICAgICAgdnNwLT5OZXh0ID0gRHRvcnNfU3ltYm9sczsKLQkJICAgICAgRHRvcnNfU3ltYm9scyA9IHZzcDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdHJzoKLQkJICAgICAgYXNfd2FybiAoXygiQ2FuJ3QgaGFuZGxlIGdsb2JhbCB4dG9ycyBzeW1ib2xzIHlldC4iKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYXNfd2FybiAoXygiVW5rbm93biAlcyIpLCBTX0dFVF9OQU1FIChzcCkpOwotCQkgICAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl1bnNpZ25lZCBzaG9ydCBFbnRyeV9NYXNrOwotCi0JCS8qIEdldCB0aGUgZW50cnkgbWFzay4gICovCi0JCWZyYWdQID0gc3AtPnN5X2ZyYWc7Ci0JCS8qIEZpcnN0IGZyYWcgbWlnaHQgYmUgZW1wdHkgaWYgd2UncmUgZ2VuZXJhdGluZyBsaXN0aW5ncy4KLQkJICAgU28gc2tpcCBlbXB0eSByc19maWxsIGZyYWdzLiAgKi8KLQkJd2hpbGUgKGZyYWdQICYmIGZyYWdQLT5mcl90eXBlID09IHJzX2ZpbGwgJiYgZnJhZ1AtPmZyX2ZpeCA9PSAwKQotCQkgIGZyYWdQID0gZnJhZ1AtPmZyX25leHQ7Ci0KLQkJLyogSWYgZmlyc3QgZnJhZyBkb2Vzbid0IGNvbnRhaW4gdGhlIGRhdGEsIHdoYXQgZG8gd2UgZG8/Ci0JCSAgIElmIGl0J3MgcG9zc2libHkgc21hbGxlciB0aGFuIHR3byBieXRlcywgdGhhdCB3b3VsZAotCQkgICBpbXBseSB0aGF0IHRoZSBlbnRyeSBtYXNrIGlzIG5vdCBzdG9yZWQgd2hlcmUgd2UncmUKLQkJICAgZXhwZWN0aW5nIGl0LgotCi0JCSAgIElmIHlvdSBjYW4gZmluZCBhIHRlc3QgY2FzZSB0aGF0IHRyaWdnZXJzIHRoaXMsIHJlcG9ydAotCQkgICBpdCAoYW5kIHRlbGwgbWUgd2hhdCB0aGUgZW50cnkgbWFzayBmaWVsZCBvdWdodCB0byBiZSksCi0JCSAgIGFuZCBJJ2xsIHRyeSB0byBmaXggaXQuICBLUiAqLwotCQlpZiAoZnJhZ1AtPmZyX2ZpeCA8IDIpCi0JCSAgYWJvcnQgKCk7Ci0KLQkJRW50cnlfTWFzayA9IChmcmFnUC0+ZnJfbGl0ZXJhbFswXSAmIDB4MDBmZikgfAotCQkJICAgICAoKGZyYWdQLT5mcl9saXRlcmFsWzFdICYgMHgwMGZmKSA8PCA4KTsKLQkJLyogRGVmaW5lIHRoZSBwcm9jZWR1cmUgZW50cnkgcG9pbnQuICAqLwotCQlWTVNfUHJvY2VkdXJlX0VudHJ5X1B0IChTX0dFVF9OQU1FIChzcCksCi0JCQkJICAgIFRleHRfUHNlY3QsCi0JCQkJICAgIFNfR0VUX1ZBTFVFIChzcCksCi0JCQkJICAgIEVudHJ5X01hc2spOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBMb2NhbCBUZXh0IGRlZmluaXRpb24uICAqLwotCWNhc2UgTl9URVhUOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICBpZiAoVGV4dF9Qc2VjdCAhPSAtMSkKLQkgICAgewotCSAgICAgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JICAgICAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgICAgICB2c3AtPlNpemUgPSAwOwotCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBUZXh0X1BzZWN0OwotCSAgICAgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHNwKTsKLQkgICAgICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKLQkgICAgICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgICAgICBzcC0+c3lfb2JqID0gdnNwOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIEdsb2JhbCBSZWZlcmVuY2UuICAqLwotCWNhc2UgTl9VTkRGOgotCSAgLyogTWFrZSBhIEdTRCBnbG9iYWwgc3ltYm9sIHJlZmVyZW5jZSByZWNvcmQuICAqLwotCSAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAotCQkJCSAgMCwKLQkJCQkgIDAsCi0JCQkJICBHQkxTWU1fUkVGKTsKLQkgIGJyZWFrOwotCi0JLyogQWJzb2x1dGUgc3ltYm9sLiAgKi8KLQljYXNlIE5fQUJTOgotCWNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgIC8qIGdjYyBkb2Vzbid0IGdlbmVyYXRlIHRoZXNlOwotCSAgICAgVk1TX0VtaXRfR2xvYmFsdmFsdWUgaGFuZGxlcyB0aGVtIHRob3VnaC4JKi8KLQkgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JICB2c3AtPlN5bWJvbCA9IHNwOwotCSAgdnNwLT5TaXplID0gNDsJCS8qIGFsd2F5cyBhc3N1bWUgMzIgYml0cyAqLwotCSAgdnNwLT5Qc2VjdF9JbmRleCA9IDA7Ci0JICB2c3AtPlBzZWN0X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0JICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKLQkgIFZNU19TeW1ib2xzID0gdnNwOwotCSAgc3AtPnN5X29iaiA9IHZzcDsKLQkgIGJyZWFrOwotCi0JLyogQW55dGhpbmcgZWxzZS4gICovCi0JZGVmYXVsdDoKLQkgIC8qIElnbm9yZSBTVEFCIHN5bWJvbHMsIGluY2x1ZGluZyAuc3RhYnMgZW1pdHRlZCBieSBnKysuICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwKSB8fCAoU19HRVRfVFlQRSAoc3ApID09IDIyKSkKLQkgICAgYnJlYWs7Ci0JICAvKgotCSAgICoJRXJyb3Igb3RoZXJ3aXNlLgotCSAgICovCi0JICBhc190c2t0c2sgKF8oInVuaGFuZGxlZCBzdGFiIHR5cGUgJWQiKSwgU19HRVRfVFlQRSAoc3ApKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogR2xvYmFsIHN5bWJvbHMgaGF2ZSBkaWZmZXJlbnQgbGlua2FnZSB0aGFuIGV4dGVybmFsIHZhcmlhYmxlcy4gICovCi0gICAgICBpZiAoZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wpCi0JVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAotCQkJCXZzcC0+UHNlY3RfSW5kZXgsCi0JCQkJMCwKLQkJCQlHQkxTWU1fREVGKTsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotDAotCi0vKiBPdXRwdXQgZGVidWdnZXIgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGZvciBzeW1ib2xzIHdoaWNoCi0gICBhcmUgbG9jYWwgdG8gYSBzcGVjaWZpYyByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWxvY2FsX3N5bWJvbHNfRFNUIChzMFAsIEN1cnJlbnRfUm91dGluZSkKLSAgICAgc3ltYm9sUyAqczBQLCAqQ3VycmVudF9Sb3V0aW5lOwotewotICBzeW1ib2xTICpzMVA7Ci0gIGNoYXIgKnMwUF9uYW1lLCAqcG50MCwgKnBudDE7Ci0KLSAgczBQX25hbWUgPSBTX0dFVF9OQU1FIChzMFApOwotICBpZiAoKnMwUF9uYW1lKysgIT0gJ18nKQotICAgIHJldHVybjsKLQotICBmb3IgKHMxUCA9IEN1cnJlbnRfUm91dGluZTsgczFQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0jaWYgMAkJLyogcmVkdW5kYW50OyBSQVdfVFlQRSAhPSBOX0ZVTiBzdWZmaWNlcyAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzMVApKQotCWNvbnRpbnVlOwotI2VuZGlmCi0gICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHMxUCkgIT0gTl9GVU4pCi0JY29udGludWU7Ci0gICAgICBwbnQwID0gczBQX25hbWU7Ci0gICAgICBwbnQxID0gU19HRVRfTkFNRSAoczFQKTsKLSAgICAgIC8qIFdlIGFzc3VtZSB0aGUgdHdvIHN0cmluZ3MgYXJlIG5ldmVyIGV4YWN0bHkgZXF1YWwuLi4gICovCi0gICAgICB3aGlsZSAoKnBudDArKyA9PSAqcG50MSsrKQotCXsKLQl9Ci0gICAgICAvKiBGb3VuZCBpdCBpZiBzMFAgbmFtZSBpcyBleGhhdXN0ZWQgYW5kIHMxUCBuYW1lIGhhcyAiOkYiIG9yICI6ZiIgbmV4dC4KLQkgTm90ZTogIGJvdGggcG9pbnRlcnMgaGF2ZSBhZHZhbmNlZCBvbmUgcGFzdCB0aGUgbm9uLW1hdGNoaW5nIGNoYXIuICAqLwotICAgICAgaWYgKCgqcG50MSA9PSAnRicgfHwgKnBudDEgPT0gJ2YnKSAmJiAqLS1wbnQxID09ICc6JyAmJiAqLS1wbnQwID09ICdcMCcpCi0JewotCSAgRGVmaW5lX1JvdXRpbmUgKHMxUCwgMCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0KLS8qIENvbnN0cnVjdCBhbmQgb3V0cHV0IHRoZSBkZWJ1ZyBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2J1aWxkX0RTVCAodGV4dF9zaXopCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6OwotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmUgPSAwOwotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqQ3VyX0ZpbGUgPSAwOwotICBvZmZzZXRUIEN1cl9PZmZzZXQgPSAtMTsKLSAgaW50IEN1cl9MaW5lX051bWJlciA9IDA7Ci0gIGludCBGaWxlX051bWJlciA9IDA7Ci0gIGludCBEZWJ1Z2dlcl9PZmZzZXQgPSAwOwotICBpbnQgZmlsZV9hdmFpbGFibGU7Ci0gIGludCBkc2M7Ci0gIG9mZnNldFQgdmFsOwotCi0gIC8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgQmVnaW4gTW9kdWxlIHJlY29yZC4gICovCi0gIFZNU19UQlRfTW9kdWxlX0JlZ2luICgpOwotCi0gIC8qCi0gICAqCU91dHB1dCBkZWJ1Z2dpbmcgaW5mbyBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgc3RhdGljIHZhcmlhYmxlcwotICAgKgl0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gb25lIHJvdXRpbmUuICBXZSBhbHNvIG5lZWQgdG8gZXhhbWluZQotICAgKglhbGwgc3RhYnMgZGlyZWN0aXZlcywgdG8gZmluZCB0aGUgZGVmaW5pdGlvbnMgdG8gYWxsIG9mIHRoZQotICAgKglhZHZhbmNlZCBkYXRhIHR5cGVzLCBhbmQgdGhpcyBpcyBkb25lIGJ5IFZNU19MU1lNX1BhcnNlLiAgVGhpcwotICAgKgluZWVkcyB0byBiZSBkb25lIGJlZm9yZSBhbnkgZGVmaW5pdGlvbnMgYXJlIG91dHB1dCB0byB0aGUgb2JqZWN0Ci0gICAqCWZpbGUsIHNpbmNlIHRoZXJlIGNhbiBiZSBmb3J3YXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN0YWJzCi0gICAqCWRpcmVjdGl2ZXMuICBXaGVuIHRocm91Z2ggd2l0aCBwYXJzaW5nLCB0aGUgdGV4dCBvZiB0aGUgc3RhYnMKLSAgICoJZGlyZWN0aXZlIGlzIGFsdGVyZWQsIHdpdGggdGhlIGRlZmluaXRpb25zIHJlbW92ZWQsIHNvIHRoYXQgbGF0ZXIKLSAgICoJcGFzc2VzIHdpbGwgc2VlIGRpcmVjdGl2ZXMgYXMgdGhleSB3b3VsZCBiZSB3cml0dGVuIGlmIHRoZSB0eXBlCi0gICAqCXdlcmUgYWxyZWFkeSBkZWZpbmVkLgotICAgKgotICAgKglXZSBhbHNvIGxvb2sgZm9yIGZpbGVzIGFuZCBpbmNsdWRlIGZpbGVzLCBhbmQgbWFrZSBhIGxpc3Qgb2YKLSAgICoJdGhlbS4gIFdlIGV4YW1pbmUgdGhlIHNvdXJjZSBmaWxlIG51bWJlcnMgdG8gZXN0YWJsaXNoIHRoZSBhY3R1YWwKLSAgICoJbGluZXMgdGhhdCBjb2RlIHdhcyBnZW5lcmF0ZWQgZnJvbSwgYW5kIHRoZW4gZ2VuZXJhdGUgb2Zmc2V0cy4KLSAgICovCi0gIFZNU19MU1lNX1BhcnNlICgpOwotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogT25seSBkZWFsIHdpdGggU1RBQiBzeW1ib2xzIGhlcmUuICAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQotCXsKLQljYXNlIE5fU0xJTkU6Ci0JICBkc2MgPSBTX0dFVF9ERVNDIChzeW1ib2xQKTsKLQkgIGlmIChkc2MgPiBDdXJfRmlsZS0+bWF4X2xpbmUpCi0JICAgIEN1cl9GaWxlLT5tYXhfbGluZSA9IGRzYzsKLQkgIGlmIChkc2MgPCBDdXJfRmlsZS0+bWluX2xpbmUpCi0JICAgIEN1cl9GaWxlLT5taW5fbGluZSA9IGRzYzsKLQkgIGJyZWFrOwotCWNhc2UgTl9TTzoKLQkgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgIEN1cl9GaWxlLT5mbGFnID0gMTsKLQkgIEN1cl9GaWxlLT5taW5fbGluZSA9IDE7Ci0JICBicmVhazsKLQljYXNlIE5fU09MOgotCSAgQ3VyX0ZpbGUgPSBmaW5kX2ZpbGUgKHN5bWJvbFApOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0dTWU06Ci0JICBWTVNfR1NZTV9QYXJzZSAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBicmVhazsKLQljYXNlIE5fTENTWU06Ci0JICBWTVNfTENTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0ZVTjoJCS8qIEZvciBzdGF0aWMgY29uc3RhbnQgc3ltYm9scyAqLwotCWNhc2UgTl9TVFNZTToKLQkgIFZNU19TVFNZTV9QYXJzZSAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQkJLyogc3dpdGNoICovCi0gICAgfQkJCS8qIGZvciAqLwotCi0gIC8qCi0gICAqCU5vdyB3ZSB0YWtlIGEgcXVpY2sgc3dlZXAgdGhyb3VnaCB0aGUgZmlsZXMgYW5kIGFzc2lnbiBvZmZzZXRzCi0gICAqCXRvIGVhY2ggb25lLiAgVGhpcyB3aWxsIGVzc2VudGlhbGx5IGJlIHRoZSBzdGFydGluZyBsaW5lIG51bWJlciB0bwotICAgKgl0aGUgZGVidWdnZXIgZm9yIGVhY2ggZmlsZS4gIE91dHB1dCB0aGUgaW5mbyBmb3IgdGhlIGRlYnVnZ2VyIHRvCi0gICAqCXNwZWNpZnkgdGhlIGZpbGVzLCBhbmQgdGhlbiB0ZWxsIGl0IGhvdyBtYW55IGxpbmVzIHRvIHVzZS4KLSAgICovCi0gIGZvciAoQ3VyX0ZpbGUgPSBmaWxlX3Jvb3Q7IEN1cl9GaWxlOyBDdXJfRmlsZSA9IEN1cl9GaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChDdXJfRmlsZS0+bWF4X2xpbmUgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIGlmICgoc3RybmNtcCAoQ3VyX0ZpbGUtPm5hbWUsICJHTlVfR1hYX0lOQ0xVREU6IiwgMTYpID09IDApICYmCi0JICAhZmxhZ19kZWJ1ZykKLQljb250aW51ZTsKLSAgICAgIGlmICgoc3RybmNtcCAoQ3VyX0ZpbGUtPm5hbWUsICJHTlVfQ0NfSU5DTFVERToiLCAxNSkgPT0gMCkgJiYKLQkgICFmbGFnX2RlYnVnKQotCWNvbnRpbnVlOwotICAgICAgLyogc2hvdyBhIGZldyBleHRyYSBsaW5lcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiBzZWxlY3RlZCAqLwotICAgICAgaWYgKEN1cl9GaWxlLT5taW5fbGluZSA+IDIpCi0JQ3VyX0ZpbGUtPm1pbl9saW5lIC09IDI7Ci0gICAgICBDdXJfRmlsZS0+b2Zmc2V0ID0gRGVidWdnZXJfT2Zmc2V0IC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMTsKLSAgICAgIERlYnVnZ2VyX09mZnNldCArPSBDdXJfRmlsZS0+bWF4X2xpbmUgLSBDdXJfRmlsZS0+bWluX2xpbmUgKyAxOwotICAgICAgaWYgKEN1cl9GaWxlLT5zYW1lX2ZpbGVfZnBudCkKLQl7Ci0JICBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgPSBDdXJfRmlsZS0+c2FtZV9maWxlX2ZwbnQtPmZpbGVfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgPSArK0ZpbGVfTnVtYmVyOwotCSAgZmlsZV9hdmFpbGFibGUgPSBWTVNfVEJUX1NvdXJjZV9GaWxlIChDdXJfRmlsZS0+bmFtZSwKLQkJCQkJCUN1cl9GaWxlLT5maWxlX251bWJlcik7Ci0JICBpZiAoIWZpbGVfYXZhaWxhYmxlKQotCSAgICB7Ci0JICAgICAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gMDsKLQkgICAgICBGaWxlX051bWJlci0tOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgICAgVk1TX1RCVF9Tb3VyY2VfTGluZXMgKEN1cl9GaWxlLT5maWxlX251bWJlciwKLQkJCSAgICBDdXJfRmlsZS0+bWluX2xpbmUsCi0JCQkgICAgQ3VyX0ZpbGUtPm1heF9saW5lIC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMSk7Ci0gIH0JCQkvKiBmb3IgKi8KLSAgQ3VyX0ZpbGUgPSAoc3RydWN0IGlucHV0X2ZpbGUgKikgTlVMTDsKLQotICAvKgotICAgKglTY2FuIHRoZSBzeW1ib2xzIGFuZCB3cml0ZSBvdXQgdGhlIHJvdXRpbmVzCi0gICAqCSh0aGlzIG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3ltYm9scyBhcmUgaW4KLSAgICoJIG9yZGVyIG9mIGFzY2VuZGluZyB0ZXh0IHNlZ21lbnQgb2Zmc2V0KQotICAgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglEZWFsIHdpdGggdGV4dCBzeW1ib2xzLgotICAgICAgICovCi0gICAgICBpZiAoIVNfSVNfREVCVUcgKHN5bWJvbFApICYmIFNfR0VUX1RZUEUgKHN5bWJvbFApID09IE5fVEVYVCkKLQl7Ci0JICAvKgotCSAgICogSWdub3JlIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCAiTCIsIGFzIHRoZXkgYXJlIGxvY2FsIHN5bWJvbHMuCi0JICAgKi8KLQkgIGlmICgqU19HRVRfTkFNRSAoc3ltYm9sUCkgPT0gJ0wnKQotCSAgICBjb250aW51ZTsKLQkgIC8qCi0JICAgKiBJZiB0aGVyZSBpcyBhIHJvdXRpbmUgc3RhcnQgZGVmaW5lZCwgdGVybWluYXRlIGl0LgotCSAgICovCi0JICBpZiAoQ3VycmVudF9Sb3V0aW5lKQotCSAgICBWTVNfVEJUX1JvdXRpbmVfRW5kICh0ZXh0X3NpeiwgQ3VycmVudF9Sb3V0aW5lKTsKLQotCSAgLyoKLQkgICAqIENoZWNrIGZvciAmIHNraXAgZHVtbXkgbGFiZWxzIGxpa2UgImdjY19jb21waWxlZC4iLgotCSAgICogVGhleSdyZSBpZGVudGlmaWVkIGJ5IHRoZSBJTl9ERUZBVUxUX1NFQ1RJT04gZmxhZy4KLQkgICAqLwotCSAgaWYgKChTX0dFVF9PVEhFUiAoc3ltYm9sUCkgJiBJTl9ERUZBVUxUX1NFQ1RJT04pICE9IDAgJiYKLQkgICAgICBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkKLQkgICAgY29udGludWU7Ci0JICAvKgotCSAgICogU3RvcmUgdGhlIHJvdXRpbmUgYmVnaW4gdHJhY2ViYWNrIGluZm8uCi0JICAgKi8KLQkgIFZNU19UQlRfUm91dGluZV9CZWdpbiAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBDdXJyZW50X1JvdXRpbmUgPSBzeW1ib2xQOwotCSAgLyoKLQkgICAqIERlZmluZSBzeW1ib2xzIGxvY2FsIHRvIHRoaXMgcm91dGluZS4KLQkgICAqLwotCSAgbG9jYWxfc3ltYm9sc19EU1QgKHN5bWJvbFAsIEN1cnJlbnRfUm91dGluZSk7Ci0JICAvKgotCSAgICoJRG9uZQotCSAgICovCi0JICBjb250aW51ZTsKLQotCX0KLSAgICAgIC8qCi0gICAgICAgKglEZWFsIHdpdGggU1RBQiBzeW1ib2xzLgotICAgICAgICovCi0gICAgICBlbHNlIGlmIChTX0lTX0RFQlVHIChzeW1ib2xQKSkKLQl7Ci0JICAvKgotCSAgICogIERpc3BhdGNoIG9uIFNUQUIgdHlwZS4KLQkgICAqLwotCSAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ltYm9sUCkpCi0JICAgIHsKLQkJLyoKLQkJICoJTGluZSBudW1iZXIKLQkJICovCi0JICAgIGNhc2UgTl9TTElORToKLQkgICAgICAvKiBPZmZzZXQgdGhlIGxpbmUgaW50byB0aGUgY29ycmVjdCBwb3J0aW9uIG9mIHRoZSBmaWxlLiAgKi8KLQkgICAgICBpZiAoQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID09IDApCi0JCWJyZWFrOwotCSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgICAvKiBTb21ldGltZXMgdGhlIHNhbWUgb2Zmc2V0IGdldHMgc2V2ZXJhbCBzb3VyY2UgbGluZXMKLQkJIGFzc2lnbmVkIHRvIGl0LiAgV2Ugc2hvdWxkIGJlIHNlbGVjdGl2ZSBhYm91dCB3aGljaAotCQkgbGluZXMgd2UgYWxsb3csIHdlIHNob3VsZCBwcmVmZXIgbGluZXMgdGhhdCBhcmUgaW4KLQkJIHRoZSBtYWluIHNvdXJjZSBmaWxlIHdoZW4gZGVidWdnaW5nIGlubGluZSBmdW5jdGlvbnMuICAqLwotCSAgICAgIGlmICh2YWwgPT0gQ3VyX09mZnNldCAmJiBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgIT0gMSkKLQkJYnJlYWs7Ci0KLQkgICAgICAvKiBjYWxjdWxhdGUgYWN0dWFsIGRlYnVnZ2VyIHNvdXJjZSBsaW5lICovCi0JICAgICAgZHNjID0gU19HRVRfREVTQyAoc3ltYm9sUCkgKyBDdXJfRmlsZS0+b2Zmc2V0OwotCSAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIGRzYyk7Ci0JICAgICAgLyoKLQkgICAgICAgKiBEZWZpbmUgUEMvTGluZSBjb3JyZWxhdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoQ3VyX09mZnNldCA9PSAtMSkKLQkJewotCQkgIC8qCi0JCSAgICogRmlyc3QgTl9TTElORTsgc2V0IHVwIGluaXRpYWwgY29ycmVsYXRpb24uCi0JCSAgICovCi0JCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChkc2MsCi0JCQkJCSAgICAgICB2YWwsCi0JCQkJCSAgICAgICBUZXh0X1BzZWN0LAotCQkJCQkgICAgICAgMCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoZHNjIC0gQ3VyX0xpbmVfTnVtYmVyKSA8PSAwKQotCQl7Ci0JCSAgLyoKLQkJICAgKiBMaW5lIGRlbHRhIGlzIG5vdCArdmUsIHdlIG5lZWQgdG8gY2xvc2UgdGhlIGxpbmUgYW5kCi0JCSAgICogc3RhcnQgYSBuZXcgUEMvTGluZSBjb3JyZWxhdGlvbi4KLQkJICAgKi8KLQkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKDAsCi0JCQkJCSAgICAgICB2YWwgLSBDdXJfT2Zmc2V0LAotCQkJCQkgICAgICAgMCwKLQkJCQkJICAgICAgIC0xKTsKLQkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKGRzYywKLQkJCQkJICAgICAgIHZhbCwKLQkJCQkJICAgICAgIFRleHRfUHNlY3QsCi0JCQkJCSAgICAgICAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qCi0JCSAgICogTGluZSBkZWx0YSBpcyArdmUsIGFsbCBpcyB3ZWxsLgotCQkgICAqLwotCQkgIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoZHNjIC0gQ3VyX0xpbmVfTnVtYmVyLAotCQkJCQkgICAgICAgdmFsIC0gQ3VyX09mZnNldCwKLQkJCQkJICAgICAgIDAsCi0JCQkJCSAgICAgICAxKTsKLQkJfQotCSAgICAgIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBsaW5lL1BDIGluZm8uICAqLwotCSAgICAgIEN1cl9MaW5lX051bWJlciA9IGRzYzsKLQkgICAgICBDdXJfT2Zmc2V0ID0gdmFsOwotCSAgICAgIGJyZWFrOwotCi0JCS8qCi0JCSAqCVNvdXJjZSBmaWxlCi0JCSAqLwotCSAgICBjYXNlIE5fU086Ci0JICAgICAgLyogUmVtZW1iZXIgdGhhdCB3ZSBoYWQgYSBzb3VyY2UgZmlsZSBhbmQgZW1pdAotCQkgdGhlIHNvdXJjZSBmaWxlIGRlYnVnZ2VyIHJlY29yZC4gICovCi0JICAgICAgQ3VyX0ZpbGUgPSBmaW5kX2ZpbGUgKHN5bWJvbFApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TT0w6Ci0JICAgICAgLyogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgcmVhbGx5IGluIHRoZSBhY3R1YWwKLQkJIHNvdXJjZSBmaWxlIHdoZW4gd2UgY29tcHV0ZSB0aGUgbWF4aW11bSBsaW5lIG51bWJlci4KLQkJIE90aGVyd2lzZSB0aGUgZGVidWdnZXIgZ2V0cyByZWFsbHkgY29uZnVzZWQuICAqLwotCSAgICAgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9CQkvKiBzd2l0Y2ggKi8KLQl9CQkvKiBpZiAoSVNfREVCVUcpICovCi0gICAgfQkJCS8qIGZvciAqLwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBpcyBhIHJvdXRpbmUgc3RhcnQgZGVmaW5lZCwgdGVybWluYXRlIGl0Ci0gICAgICogKGFuZCB0aGUgbGluZSBudW1iZXJzKS4KLSAgICAgKi8KLSAgICBpZiAoQ3VycmVudF9Sb3V0aW5lKQotICAgICAgewotCS8qIFRlcm1pbmF0ZSB0aGUgbGluZSBudW1iZXJzLiAgKi8KLQlWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKDAsCi0JCQkJICAgICB0ZXh0X3NpeiAtIFNfR0VUX1ZBTFVFIChDdXJyZW50X1JvdXRpbmUpLAotCQkJCSAgICAgMCwKLQkJCQkgICAgIC0xKTsKLQkvKiBUZXJtaW5hdGUgdGhlIHJvdXRpbmUuICAqLwotCVZNU19UQlRfUm91dGluZV9FbmQgKHRleHRfc2l6LCBDdXJyZW50X1JvdXRpbmUpOwotICAgICAgfQotCi0gIC8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgRW5kIE1vZHVsZSBUQlQgcmVjb3JkLiAgKi8KLSAgVk1TX1RCVF9Nb2R1bGVfRW5kICgpOwotfQotDAotCi0vKiBXcml0ZSBhIFZBWC9WTVMgb2JqZWN0IGZpbGUgKGV2ZXJ5dGhpbmcgZWxzZSBoYXMgYmVlbiBkb25lISkuICAqLwotCi12b2lkCi12bXNfd3JpdGVfb2JqZWN0X2ZpbGUgKHRleHRfc2l6LCBkYXRhX3NpeiwgYnNzX3NpeiwgdGV4dF9mcmFnX3Jvb3QsCi0JCSAgICAgICBkYXRhX2ZyYWdfcm9vdCkKLSAgICAgdW5zaWduZWQgdGV4dF9zaXo7Ci0gICAgIHVuc2lnbmVkIGRhdGFfc2l6OwotICAgICB1bnNpZ25lZCBic3Nfc2l6OwotICAgICBmcmFnUyAqdGV4dF9mcmFnX3Jvb3Q7Ci0gICAgIGZyYWdTICpkYXRhX2ZyYWdfcm9vdDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLQotICAvKgotICAgKiBJbml0aWFsaXplIHByb2dyYW0gc2VjdGlvbiBpbmRpY2VzOyB2YWx1ZXMgZ2V0IHVwZGF0ZWQgbGF0ZXIuCi0gICAqLwotICBQc2VjdF9OdW1iZXIgPSAwOwkJLyogbmV4dCBQc2VjdCBJbmRleCB0byB1c2UgKi8KLSAgVGV4dF9Qc2VjdCA9IC0xOwkJLyogVGV4dCBQc2VjdCBJbmRleCAgICovCi0gIERhdGFfUHNlY3QgPSAtMjsJCS8qIERhdGEgUHNlY3QgSW5kZXggICBKRjogV2FzIC0xICovCi0gIEJzc19Qc2VjdCA9IC0zOwkJLyogQnNzIFBzZWN0IEluZGV4ICAgIEpGOiBXYXMgLTEgKi8KLSAgQ3RvcnNfUHNlY3QgPSAtNDsJCS8qIEN0b3JzIFBzZWN0IEluZGV4ICAqLwotICBEdG9yc19Qc2VjdCA9IC01OwkJLyogRHRvcnMgUHNlY3QgSW5kZXggICovCi0gIC8qIEluaXRpYWxpemUgb3RoZXIgc3RhdGUgdmFyaWFibGVzLiAgKi8KLSAgRGF0YV9TZWdtZW50ID0gMDsKLSAgTG9jYWxfSW5pdGRfRGF0YV9TaXplID0gMDsKLQotICAvKgotICAgKglDcmVhdGUgdGhlIGFjdHVhbCBvdXRwdXQgZmlsZSBhbmQgcG9wdWxhdGUgaXQgd2l0aCByZXF1aXJlZAotICAgKgkibW9kdWxlIGhlYWRlciIgaW5mb3JtYXRpb24uCi0gICAqLwotICBDcmVhdGVfVk1TX09iamVjdF9GaWxlICgpOwotICBXcml0ZV9WTVNfTUhEX1JlY29yZHMgKCk7Ci0KLSAgLyoKLSAgICoJQ3JlYXRlIHRoZSBEYXRhIHNlZ21lbnQ6Ci0gICAqCi0gICAqCVNpbmNlIHRoaXMgaXMgUkVBTExZIGhhcmQgdG8gZG8gYW55IG90aGVyIHdheSwKLSAgICoJd2UgYWN0dWFsbHkgbWFudWZhY3R1cmUgdGhlIGRhdGEgc2VnbWVudCBhbmQKLSAgICoJdGhlbiBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIG91dCBvZiBpdC4KLSAgICoJV2UgbmVlZCB0byBnZW5lcmF0ZSB0aGlzIGVhcmx5LCBzbyB0aGF0IGdsb2JhbHZhbHVlcwotICAgKgljYW4gYmUgcHJvcGVybHkgZW1pdHRlZC4KLSAgICovCi0gIGlmIChkYXRhX3NpeiA+IDApCi0gICAgc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQgKGRhdGFfc2l6LCB0ZXh0X3NpeiwgZGF0YV9mcmFnX3Jvb3QpOwotCi0KLSAgLyoqKioqKiogIEdsb2JhbCBTeW1ib2wgRGlyZWN0b3J5ICAqKioqKioqLwotCi0gIC8qCi0gICAqCUVtaXQgZ2xvYmFsdmFsdWVzIG5vdy4gIFdlIG11c3QgZG8gdGhpcyBiZWZvcmUgdGhlIHRleHQgcHNlY3QgaXMKLSAgICoJZGVmaW5lZCwgb3Igd2Ugd2lsbCBnZXQgbGlua2VyIHdhcm5pbmdzIGFib3V0IG11bHRpcGx5IGRlZmluZWQKLSAgICoJc3ltYm9scy4gIEFsbCBvZiB0aGUgZ2xvYmFsdmFsdWVzICJyZWZlcmVuY2UiIHBzZWN0IDAsIGFsdGhvdWdoCi0gICAqCWl0IHJlYWxseSBkb2VzIG5vdCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggaXQuCi0gICAqLwotICBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMgKHRleHRfc2l6LCBkYXRhX3NpeiwgRGF0YV9TZWdtZW50KTsKLSAgLyoKLSAgICoJRGVmaW5lIHRoZSBUZXh0IFBzZWN0Ci0gICAqLwotICBUZXh0X1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7Ci0gIFZNU19Qc2VjdF9TcGVjICgiJGNvZGUiLCB0ZXh0X3NpeiwgcHNfVEVYVCwgMCk7Ci0gIC8qCi0gICAqCURlZmluZSB0aGUgQlNTIFBzZWN0Ci0gICAqLwotICBpZiAoYnNzX3NpeiA+IDApCi0gICAgewotICAgICAgQnNzX1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7Ci0gICAgICBWTVNfUHNlY3RfU3BlYyAoIiR1bmluaXRpYWxpemVkX2RhdGEiLCBic3Nfc2l6LCBwc19EQVRBLCAwKTsKLSAgICB9Ci0gIC8qCi0gICAqIERlZmluZSBzeW1ib2xzIHRvIHRoZSBsaW5rZXIuCi0gICAqLwotICBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSAodGV4dF9zaXosIGRhdGFfc2l6KTsKLSAgLyoKLSAgICoJRGVmaW5lIHRoZSBEYXRhIFBzZWN0Ci0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwICYmIExvY2FsX0luaXRkX0RhdGFfU2l6ZSA+IDApCi0gICAgewotICAgICAgRGF0YV9Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKCIkZGF0YSIsIExvY2FsX0luaXRkX0RhdGFfU2l6ZSwgcHNfREFUQSwgMCk7Ci0gICAgICAvKgotICAgICAgICogTG9jYWwgaW5pdGlhbGl6ZWQgZGF0YSAoTl9EQVRBKSBzeW1ib2xzIG5lZWQgdG8gYmUgdXBkYXRlZCB0byB0aGUKLSAgICAgICAqIHByb3BlciB2YWx1ZSBvZiBEYXRhX1BzZWN0IG5vdyB0aGF0IGl0J3MgYWN0dWFsbHkgYmVlbiBkZWZpbmVkLgotICAgICAgICogKEEgZHVtbXkgdmFsdWUgd2FzIHVzZWQgaW4gZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkoKSBhYm92ZS4pCi0gICAgICAgKi8KLSAgICAgIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCWlmICh2c3AtPlBzZWN0X0luZGV4IDwgMCAmJiBTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IE5fREFUQSkKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSBEYXRhX1BzZWN0OwotICAgIH0KLQotCi0gIGlmIChDdG9yc19TeW1ib2xzICE9IDApCi0gICAgewotICAgICAgY2hhciAqcHNfbmFtZSA9ICIkY3RvcnMiOwotICAgICAgQ3RvcnNfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKLSAgICAgIFZNU19Qc2VjdF9TcGVjIChwc19uYW1lLCBDdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQgKyBYVE9SX1NJWkUsCi0JCSAgICAgIHBzX0NUT1JTLCAwKTsKLSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHBzX25hbWUsIEN0b3JzX1BzZWN0LAotCQkJCSAgMCwgR0JMU1lNX0RFRnxHQkxTWU1fV0VBSyk7Ci0gICAgICBmb3IgKHZzcCA9IEN0b3JzX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCXZzcC0+UHNlY3RfSW5kZXggPSBDdG9yc19Qc2VjdDsKLSAgICB9Ci0KLSAgaWYgKER0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpwc19uYW1lID0gIiRkdG9ycyI7Ci0gICAgICBEdG9yc19Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKHBzX25hbWUsIER0b3JzX1N5bWJvbHMtPlBzZWN0X09mZnNldCArIFhUT1JfU0laRSwKLQkJICAgICAgcHNfRFRPUlMsIDApOwotICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAocHNfbmFtZSwgRHRvcnNfUHNlY3QsCi0JCQkJICAwLCBHQkxTWU1fREVGfEdCTFNZTV9XRUFLKTsKLSAgICAgIGZvciAodnNwID0gRHRvcnNfU3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0JdnNwLT5Qc2VjdF9JbmRleCA9IER0b3JzX1BzZWN0OwotICAgIH0KLQotICAvKioqKioqKiAgVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiBSZWNvcmRzICAqKioqKioqLwotCi0gIC8qCi0gICAqCVdyaXRlIHRoZSB0ZXh0IHNlZ21lbnQgZGF0YQotICAgKi8KLSAgaWYgKHRleHRfc2l6ID4gMCkKLSAgICB2bXNfZml4dXBfdGV4dF9zZWN0aW9uICh0ZXh0X3NpeiwgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KTsKLSAgLyoKLSAgICoJV3JpdGUgdGhlIGRhdGEgc2VnbWVudCBkYXRhLCB0aGVuIGRpc2NhcmQgaXQuCi0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwKQotICAgIHsKLSAgICAgIHZtc19maXh1cF9kYXRhX3NlY3Rpb24gKGRhdGFfc2l6LCB0ZXh0X3Npeik7Ci0gICAgICBmcmVlIChEYXRhX1NlZ21lbnQpLCAgRGF0YV9TZWdtZW50ID0gMDsKLSAgICB9Ci0KLSAgaWYgKEN0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoQ3RvcnNfU3ltYm9scywgQ3RvcnNfUHNlY3QpOwotICAgIH0KLQotICBpZiAoRHRvcnNfU3ltYm9scyAhPSAwKQotICAgIHsKLSAgICAgIHZtc19maXh1cF94dG9yc19zZWN0aW9uIChEdG9yc19TeW1ib2xzLCBEdG9yc19Qc2VjdCk7Ci0gICAgfQotCi0KLSAgLyoqKioqKiogIERlYnVnZ2VyIFN5bWJvbCBUYWJsZSBSZWNvcmRzICAqKioqKioqLwotCi0gIHZtc19idWlsZF9EU1QgKHRleHRfc2l6KTsKLQotCi0gIC8qKioqKioqICBXcmFwIHRoaW5ncyB1cCAgKioqKioqKi8KLQotICAvKgotICAgKglXcml0ZSB0aGUgRW5kIE9mIE1vZHVsZSByZWNvcmQKLSAgICovCi0gIGlmIChFbnRyeV9Qb2ludF9TeW1ib2wpCi0gICAgV3JpdGVfVk1TX0VPTV9SZWNvcmQgKFRleHRfUHNlY3QsIFNfR0VUX1ZBTFVFIChFbnRyeV9Qb2ludF9TeW1ib2wpKTsKLSAgZWxzZQotICAgIFdyaXRlX1ZNU19FT01fUmVjb3JkICgtMSwgKHZhbHVlVCkgMCk7Ci0KLSAgLyoKLSAgICoJQWxsIGRvbmUsIGNsb3NlIHRoZSBvYmplY3QgZmlsZQotICAgKi8KLSAgQ2xvc2VfVk1TX09iamVjdF9GaWxlICgpOwotfQotCi0vKiBlbmQgb2Ygb2JqLXZtcy5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai12bXMuaCBiL2dhcy9jb25maWcvb2JqLXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhmZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUxICswLDAgQEAKLS8qIFZNUyBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKiBUYWcgdG8gdmFsaWRhdGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgT0JKX1ZNUyAxCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jZGVmaW5lIExPTkdXT1JEX0FMSUdOTUVOVAkyCi0KLS8qIFRoaXMgbWFjcm8gY29udHJvbHMgc3Vic2VjdGlvbiBhbGlnbm1lbnQgd2l0aGluIGEgc2VjdGlvbi4KLSAqCi0gKiBVbmRlciBWQVgvVk1TLCB0aGUgbGlua2VyIChhbmQgUFNFQ1Qgc3BlY2lmaWNhdGlvbnMpCi0gKiB0YWtlIGNhcmUgb2YgY29ycmVjdGx5IGFsaWduaW5nIHRoZSBzZWdtZW50cy4KLSAqIERvaW5nIHRoZSBhbGlnbm1lbnQgaGVyZSAob24gaW5pdGlhbGl6ZWQgZGF0YSkgY2FuCi0gKiBtZXNzIHVwIHRoZSBjYWxjdWxhdGlvbiBvZiBnbG9iYWwgZGF0YSBQU0VDVCBzaXplcy4KLSAqLwotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpCVwKLQkJKCgoU0VHKSA9PSBkYXRhX3NlY3Rpb24pID8gMCA6IExPTkdXT1JEX0FMSUdOTUVOVCkKLQotLyogVGhpcyBmbGFnIGlzIHVzZWQgdG8gcmVtZW1iZXIgd2hldGhlciB3ZSBhcmUgaW4gdGhlIGNvbnN0IG9yIHRoZQotICAgZGF0YSBzZWN0aW9uLiAgQnkgYW5kIGxhcmdlIHRoZXkgYXJlIGlkZW50aWNhbCwgYnV0IHdlIHNldCBhIG5vLXdyaXRlCi0gICBiaXQgZm9yIHBzZWN0cyBpbiB0aGUgY29uc3Qgc2VjdGlvbi4gICovCi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGNvbnN0X2ZsYWc7Ci0KLS8qIFRoaXMgaXMgb3ZlcmxvYWRlZCBvbnRvIGNvbnN0X2ZsYWcsIGZvciBjb252ZW5pZW5jZS4gIEl0J3MgdXNlZCB0byBmbGFnCi0gICBkdW1teSBsYWJlbHMgbGlrZSAiZ2NjMl9jb21waWxlZC4iICB3aGljaCBvY2N1ciBiZWZvcmUgdGhlIGZpcnN0IC50ZXh0Ci0gICBvciAuZGF0YSBzZWN0aW9uIGRpcmVjdGl2ZS4gICovCi0KLSNkZWZpbmUgSU5fREVGQVVMVF9TRUNUSU9OIDB4ODAKLQotLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gb2JqLXZtcy5jLiAqLwotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsKLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotI3VuZGVmIE5PX1JFTE9DCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIE5PX1JFTE9DLCBSRUxPQ18zMgotICB9OwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSgwKQotI2RlZmluZSBOX1RYVE9GRih4KQkoIHNpemVvZihzdHJ1Y3QgZXhlYykgKQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQotLyogV2UgdXNlIHRoaXMgY29weSBvZiB0aGUgZXhlYyBoZWFkZXIgZm9yIFZNUy4gIFdlIGRvIG5vdCBhY3R1YWxseSB1c2UgaXQsIGJ1dAotICAgd2hhdCB3ZSBhY3R1YWxseSBkbyBpcyBsZXQgZ2FzIGZpbGwgaW4gdGhlIHJlbGV2YW50IHNsb3RzLCBhbmQgd2hlbiB3ZSBnZXQKLSAgIGFyb3VuZCB0byB3cml0aW5nIGFuIG9iaiBmaWxlLCB3ZSBqdXN0IHBpY2sgb3V0IHdoYXQgd2UgbmVlZC4gICovCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIGxvbmcgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV90cnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9kcnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9lbnRyeTsJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBleGVjIGhlYWRlcjsJCS8qIGEub3V0IGhlYWRlciAqLwotICAgIGxvbmcgc3RyaW5nX3RhYmxlX3NpemU7CS8qIG5hbWVzICsgJ1wwJyArIHNpemVvZihpbnQpICovCi0gIH0KLW9iamVjdF9oZWFkZXJzOwotCi0vKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gKiAodGhpcyBzdGFydGVkIGFzIGEgY2xvbmUgb2YgYm91dC5oJ3Mgbmxpc3QsIGJ1dCBtdWNoIHdhcyB1bm5lZWRlZCkuCi0gKi8KLXN0cnVjdCBubGlzdAotICB7Ci0gICAgY2hhciAqbl9uYW1lOwotICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIG5fb3RoZXI7CS8qIHVzZWQgZm9yIGNvbnN0X2ZsYWcgYW5kICJkZWZhdWx0IHNlY3Rpb24iICovCi0gICAgdW5zaWduZWQJOiAxNjsJCS8qIHBhZGRpbmcgZm9yIGFsaWdubWVudCAqLwotICAgIGludCBuX2Rlc2M7CQkJLyogc291cmNlIGxpbmUgbnVtYmVyIGZvciBOX1NMSU5FIHN0YWJzICovCi0gIH07Ci0KLS8qIExlZ2FsIHZhbHVlcyBvZiBuX3R5cGUgKHNlZSBhb3V0L3N0YWIuZGVmIGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIGNvZGVzKS4KLSAqLwotI2RlZmluZSBOX1VOREYJMAkJLyogVW5kZWZpbmVkIHN5bWJvbAkqLwotI2RlZmluZSBOX0FCUwkyCQkvKiBBYnNvbHV0ZSBzeW1ib2wJKi8KLSNkZWZpbmUgTl9URVhUCTQJCS8qIFRleHQgc3ltYm9sCQkqLwotI2RlZmluZSBOX0RBVEEJNgkJLyogRGF0YSBzeW1ib2wJCSovCi0jZGVmaW5lIE5fQlNTCTgJCS8qIEJTUyBzeW1ib2wJCSovCi0jZGVmaW5lIE5fRk4JMzEJCS8qIEZpbGVuYW1lIHN5bWJvbAkqLwotCi0jZGVmaW5lIE5fRVhUCTEJCS8qIEV4dGVybmFsIHN5bWJvbCAoT1InZCBpbiB3aXRoIG9uZSBvZiBhYm92ZSkJKi8KLSNkZWZpbmUgTl9UWVBFCTAzNgkJLyogTWFzayBmb3IgYWxsIHRoZSB0eXBlIGJpdHMJCQkqLwotCi0jZGVmaW5lIE5fU1RBQgkwMzQwCQkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotLyogU1lNQk9MIFRBQkxFICovCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgZGF0YSB0eXBlICovCi0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsJLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHN0cnVjdCBWTVNfU3ltYm9sICoKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKLQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgaXMgaW4gTl97VEVYVCxEQVRBLEJTUyxBQlN9IG9yIE5fRVhUICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKQkJKFNfR0VUX1RZUEUocykgIT0gTl9VTkRGKQotCi0jZGVmaW5lIFNfSVNfQ09NTU9OKHMpCShTX0dFVF9UWVBFKHMpID09IE5fVU5ERiAmJiBTX0dFVF9WQUxVRShzKSAhPSAwKQotCi0jZGVmaW5lIFNfSVNfUkVHSVNURVIocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9PSBOX1JFR0lTVEVSKQotCi0vKiBUcnVlIGlmIGEgZGVidWcgc3BlY2lhbCBzeW1ib2wgZW50cnkgKi8KLSNkZWZpbmUgU19JU19ERUJVRyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fU1RBQikKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbG9jYWwgc3ltYm9sIG5hbWUgKi8KLS8qIEEgc3ltYm9sIG5hbWUgd2hvc2UgbmFtZSBiZWdpbiB3aXRoIF5BIGlzIGEgZ2FzIGludGVybmFsIHBzZXVkbyBzeW1ib2wKLSAgIG5hbWVsZXNzIHN5bWJvbHMgY29tZSBmcm9tIC5zdGFiIGRpcmVjdGl2ZXMuICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykJCShTX0dFVF9OQU1FKHMpICYmIFwKLQkJCQkgIVNfSVNfREVCVUcocykgJiYgXAotCQkJCSAoc3RyY2hyKFNfR0VUX05BTUUocyksICdcMDAxJykgIT0gMCB8fCBcCi0JCQkJICBzdHJjaHIoU19HRVRfTkFNRShzKSwgJ1wwMDInKSAhPSAwIHx8IFwKLQkJCQkgIChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCi0jZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IChjaGFyICopMCkKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgocyktPnN5X3N5bWJvbC5uX25hbWUpCi0vKiBUaGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfR0VUX09GRlNFVChzKQkJKChzKS0+c3lfbmFtZV9vZmZzZXQpCi0vKiBUaGUgcmF3IHR5cGUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9SQVdfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSkKLS8qIFRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fVFlQRSkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKE5fVFlQRV9zZWdbU19HRVRfVFlQRShzKV0pCi0vKiBUaGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX09USEVSKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlcikKLS8qIFRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9ERVNDKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fbmFtZSA9ICh2KSkKLS8qIFNldCB0aGUgb2Zmc2V0IGluIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19TRVRfT0ZGU0VUKHMsdikJKChzKS0+c3lfbmFtZV9vZmZzZXQgPSAodikpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX1RZUEUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9ICh2KSkKLQotCi0vKiBGaWxlIGhlYWRlciBtYWNybyBhbmQgdHlwZSBkZWZpbml0aW9uICovCi0KLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX3RleHQgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19URVhULCAodikpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfZGF0YSA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX0RBVEEsICh2KSkpCi0jZGVmaW5lIEhfU0VUX0JTU19TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX2JzcyA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX0JTUywgKHYpKSkKLQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogXAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBubGlzdCkpCi0KLS8qIGxpbmUgbnVtYmVyaW5nIHN0dWZmLiAqLwotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9Ci0KLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayhzKQl7O30KLQotLyogRm9yY2Ugc3RydWN0dXJlIHRhZ3MgaW50byBzY29wZSBzbyB0aGF0IHRoZWlyIHVzZSBpbiBwcm90b3R5cGVzCi0gICB3aWxsIG5ldmVyIGJlIHRoZWlyIGZpcnN0IG9jY3VyYW5jZS4gICovCi1zdHJ1Y3QgZml4Owotc3RydWN0IGZyYWc7Ci0KLS8qIG9iai12bXMgcm91dGluZXMgdmlzaWJsZSB0byB0aGUgcmVzdCBvZiBnYXMuICAqLwotCi1leHRlcm4gdm9pZCB0Y19hb3V0X2ZpeF90b19jaGFycyBQQVJBTVMgKChjaGFyICosc3RydWN0IGZpeCAqLHJlbGF4X2FkZHJlc3NUKSk7Ci0KLWV4dGVybiBpbnQgdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oWCkJdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKFgpCi0KLS8qIENvbXBpbGVyLWdlbmVyYXRlZCBsYWJlbCAiX192YXhfZ19kb3VibGVzIiBpcyB1c2VkIHRvIGF1Z21lbnQgLnN0YWJzLiAqLwotZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSBvYmpfZnJvYl9sYWJlbChYKSB2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwoWCkKLQotZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9tYWluIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgdm1zX3dyaXRlX29iamVjdF9maWxlIFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkLHVuc2lnbmVkLAotCQkJCQkgICBzdHJ1Y3QgZnJhZyAqLHN0cnVjdCBmcmFnICopKTsKLQotLyogVk1TIGV4ZWN1dGFibGVzIGFyZSBub3RoaW5nIGxpa2UgYS5vdXQsIGJ1dCB0aGUgVk1TIHBvcnQgb2YgZ2NjIHVzZXMKLSAgIGEub3V0IGZvcm1hdCBzdGFicyB3aGljaCBvYmotdm1zLmMgdGhlbiB0cmFuc2xhdGVzLiAgKi8KLQotI2RlZmluZSBBT1VUX1NUQUJTCi0KLQwKLSNpZmRlZiBXQU5UX1ZNU19PQkpfREVGUwotCi0vKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIGNvbnN0YW50cyB1c2VkIHdpdGhpbgotICAgdGhlIGFjdHVhbCBWTVMgb2JqZWN0IGZpbGUuICBXZSBkbyBub3QgdXNlIGEgJCBpbiB0aGUgc3ltYm9scyAoYXMgcGVyCi0gICB1c3VhbCBWTVMgY29udmVudGlvbikgc2luY2UgU3lzdGVtIFYgZ2FncyBvbiBpdC4gICovCi0KLSNkZWZpbmUJT0JKX1NfQ19IRFIJMAotI2RlZmluZQlPQkpfU19DX0hEUl9NSEQJMAotI2RlZmluZQlPQkpfU19DX0hEUl9MTk0JMQotI2RlZmluZQlPQkpfU19DX0hEUl9TUkMJMgotI2RlZmluZQlPQkpfU19DX0hEUl9UVEwJMwotI2RlZmluZQlPQkpfU19DX0hEUl9DUFIJNAotI2RlZmluZQlPQkpfU19DX0hEUl9NVEMJNQotI2RlZmluZQlPQkpfU19DX0hEUl9HVFgJNgotI2RlZmluZQlPQkpfU19DX0dTRAkxCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1BTQwkwCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1NZTQkxCi0jZGVmaW5lCU9CSl9TX0NfR1NEX0VQTQkyCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1BSTwkzCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1NZTVcJNAotI2RlZmluZQlPQkpfU19DX0dTRF9FUE1XCTUKLSNkZWZpbmUJT0JKX1NfQ19HU0RfUFJPVwk2Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0lEQwk3Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0VOVgk4Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0xTWQk5Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0xFUE0JMTAKLSNkZWZpbmUJT0JKX1NfQ19HU0RfTFBSTwkxMQotI2RlZmluZQlPQkpfU19DX0dTRF9TUFNDCTEyCi0jZGVmaW5lCU9CSl9TX0NfVElSCTIKLSNkZWZpbmUJT0JKX1NfQ19FT00JMwotI2RlZmluZQlPQkpfU19DX0RCRwk0Ci0jZGVmaW5lCU9CSl9TX0NfVEJUCTUKLSNkZWZpbmUJT0JKX1NfQ19MTksJNgotI2RlZmluZQlPQkpfU19DX0VPTVcJNwotI2RlZmluZQlPQkpfU19DX01BWFJFQ1RZUAk3Ci0jZGVmaW5lCU9CSl9TX0tfU1VCVFlQCTEKLSNkZWZpbmUJT0JKX1NfQ19TVUJUWVAJMQotI2RlZmluZQlPQkpfU19DX01BWFJFQ1NJWgkyMDQ4Ci0jZGVmaW5lCU9CSl9TX0NfU1RSTFZMCTAKLSNkZWZpbmUJT0JKX1NfQ19TWU1TSVoJMzEKLSNkZWZpbmUJT0JKX1NfQ19TVE9SRVBMSU0JLTEKLSNkZWZpbmUJT0JKX1NfQ19QU0NBTElMSU0JOQotDAotI2RlZmluZQlNSERfU19DX01IRAkwCi0jZGVmaW5lCU1IRF9TX0NfTE5NCTEKLSNkZWZpbmUJTUhEX1NfQ19TUkMJMgotI2RlZmluZQlNSERfU19DX1RUTAkzCi0jZGVmaW5lCU1IRF9TX0NfQ1BSCTQKLSNkZWZpbmUJTUhEX1NfQ19NVEMJNQotI2RlZmluZQlNSERfU19DX0dUWAk2Ci0jZGVmaW5lCU1IRF9TX0NfTUFYSERSVFlQCTYKLQwKLSNkZWZpbmUJR1NEX1NfS19FTlRSSUVTCTEKLSNkZWZpbmUJR1NEX1NfQ19FTlRSSUVTCTEKLSNkZWZpbmUJR1NEX1NfQ19QU0MJMAotI2RlZmluZQlHU0RfU19DX1NZTQkxCi0jZGVmaW5lCUdTRF9TX0NfRVBNCTIKLSNkZWZpbmUJR1NEX1NfQ19QUk8JMwotI2RlZmluZQlHU0RfU19DX1NZTVcJNAotI2RlZmluZQlHU0RfU19DX0VQTVcJNQotI2RlZmluZQlHU0RfU19DX1BST1cJNgotI2RlZmluZQlHU0RfU19DX0lEQwk3Ci0jZGVmaW5lCUdTRF9TX0NfRU5WCTgKLSNkZWZpbmUJR1NEX1NfQ19MU1kJOQotI2RlZmluZQlHU0RfU19DX0xFUE0JMTAKLSNkZWZpbmUJR1NEX1NfQ19MUFJPCTExCi0jZGVmaW5lCUdTRF9TX0NfU1BTQwkxMgotI2RlZmluZQlHU0RfU19DX1NZTVYJMTMKLSNkZWZpbmUJR1NEX1NfQ19FUE1WCTE0Ci0jZGVmaW5lCUdTRF9TX0NfUFJPVgkxNQotI2RlZmluZQlHU0RfU19DX01BWFJFQ1RZUAkxNQotDAotI2RlZmluZQlHU1lfU19NX1dFQUsJMQotI2RlZmluZQlHU1lfU19NX0RFRgkyCi0jZGVmaW5lCUdTWV9TX01fVU5JCTQKLSNkZWZpbmUJR1NZX1NfTV9SRUwJOAotCi0jZGVmaW5lCUxTWV9TX01fREVGCTIKLSNkZWZpbmUJTFNZX1NfTV9SRUwJOAotCi0jZGVmaW5lCUVOVl9TX01fREVGCTEKLSNkZWZpbmUJRU5WX1NfTV9ORVNURUQJMgotDAotI2RlZmluZQlHUFNfU19NX1BJQwkxCi0jZGVmaW5lCUdQU19TX01fTElCCTIKLSNkZWZpbmUJR1BTX1NfTV9PVlIJNAotI2RlZmluZQlHUFNfU19NX1JFTAk4Ci0jZGVmaW5lCUdQU19TX01fR0JMCTE2Ci0jZGVmaW5lCUdQU19TX01fU0hSCTMyCi0jZGVmaW5lCUdQU19TX01fRVhFCTY0Ci0jZGVmaW5lCUdQU19TX01fUkQJMTI4Ci0jZGVmaW5lCUdQU19TX01fV1JUCTI1NgotI2RlZmluZQlHUFNfU19NX1ZFQwk1MTIKLSNkZWZpbmUJR1BTX1NfS19OQU1FCTkKLSNkZWZpbmUJR1BTX1NfQ19OQU1FCTkKLQwKLSNkZWZpbmUJVElSX1NfQ19TVEFfR0JMCTAKLSNkZWZpbmUJVElSX1NfQ19TVEFfU0IJMQotI2RlZmluZQlUSVJfU19DX1NUQV9TVwkyCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0xXCTMKLSNkZWZpbmUJVElSX1NfQ19TVEFfUEIJNAotI2RlZmluZQlUSVJfU19DX1NUQV9QVwk1Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1BMCTYKLSNkZWZpbmUJVElSX1NfQ19TVEFfVUIJNwotI2RlZmluZQlUSVJfU19DX1NUQV9VVwk4Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0JGSQk5Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1dGSQkxMAotI2RlZmluZQlUSVJfU19DX1NUQV9MRkkJMTEKLSNkZWZpbmUJVElSX1NfQ19TVEFfRVBNCTEyCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0NLQVJHCTEzCi0jZGVmaW5lCVRJUl9TX0NfU1RBX1dQQgkxNAotI2RlZmluZQlUSVJfU19DX1NUQV9XUFcJMTUKLSNkZWZpbmUJVElSX1NfQ19TVEFfV1BMCTE2Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0xTWQkxNwotI2RlZmluZQlUSVJfU19DX1NUQV9MSVQJMTgKLSNkZWZpbmUJVElSX1NfQ19TVEFfTEVQTQkxOQotI2RlZmluZQlUSVJfU19DX01BWFNUQUNPRAkxOQotI2RlZmluZQlUSVJfU19DX01JTlNUT0NPRAkyMAotI2RlZmluZQlUSVJfU19DX1NUT19TQgkyMAotI2RlZmluZQlUSVJfU19DX1NUT19TVwkyMQotI2RlZmluZQlUSVJfU19DX1NUT19MCTIyCi0jZGVmaW5lCVRJUl9TX0NfU1RPX0JECTIzCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1dECTI0Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0xECTI1Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0xJCTI2Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1BJRFIJMjcKLSNkZWZpbmUJVElSX1NfQ19TVE9fUElDUgkyOAotI2RlZmluZQlUSVJfU19DX1NUT19SU0IJMjkKLSNkZWZpbmUJVElSX1NfQ19TVE9fUlNXCTMwCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1JMCTMxCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1ZQUwkzMgotI2RlZmluZQlUSVJfU19DX1NUT19VU0IJMzMKLSNkZWZpbmUJVElSX1NfQ19TVE9fVVNXCTM0Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JVQgkzNQotI2RlZmluZQlUSVJfU19DX1NUT19SVVcJMzYKLSNkZWZpbmUJVElSX1NfQ19TVE9fQgkzNwotI2RlZmluZQlUSVJfU19DX1NUT19XCTM4Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JCCTM5Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JXCTQwCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1JJVkIJNDEKLSNkZWZpbmUJVElSX1NfQ19TVE9fUElSUgk0MgotI2RlZmluZQlUSVJfU19DX01BWFNUT0NPRAk0MgotI2RlZmluZQlUSVJfU19DX01JTk9QUkNPRAk1MAotI2RlZmluZQlUSVJfU19DX09QUl9OT1AJNTAKLSNkZWZpbmUJVElSX1NfQ19PUFJfQURECTUxCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1NVQgk1MgotI2RlZmluZQlUSVJfU19DX09QUl9NVUwJNTMKLSNkZWZpbmUJVElSX1NfQ19PUFJfRElWCTU0Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0FORAk1NQotI2RlZmluZQlUSVJfU19DX09QUl9JT1IJNTYKLSNkZWZpbmUJVElSX1NfQ19PUFJfRU9SCTU3Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX05FRwk1OAotI2RlZmluZQlUSVJfU19DX09QUl9DT00JNTkKLSNkZWZpbmUJVElSX1NfQ19PUFJfSU5TVgk2MAotI2RlZmluZQlUSVJfU19DX09QUl9BU0gJNjEKLSNkZWZpbmUJVElSX1NfQ19PUFJfVVNICTYyCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1JPVAk2MwotI2RlZmluZQlUSVJfU19DX09QUl9TRUwJNjQKLSNkZWZpbmUJVElSX1NfQ19PUFJfUkVERUYJNjUKLSNkZWZpbmUJVElSX1NfQ19PUFJfREZMSVQJNjYKLSNkZWZpbmUJVElSX1NfQ19NQVhPUFJDT0QJNjYKLSNkZWZpbmUJVElSX1NfQ19NSU5DVExDT0QJODAKLSNkZWZpbmUJVElSX1NfQ19DVExfU0VUUkIJODAKLSNkZWZpbmUJVElSX1NfQ19DVExfQVVHUkIJODEKLSNkZWZpbmUJVElSX1NfQ19DVExfREZMT0MJODIKLSNkZWZpbmUJVElSX1NfQ19DVExfU1RMT0MJODMKLSNkZWZpbmUJVElSX1NfQ19DVExfU1RLREwJODQKLSNkZWZpbmUJVElSX1NfQ19NQVhDVExDT0QJODQKLQwKLS8qCi0gKglEZWJ1Z2dlciBzeW1ib2wgZGVmaW5pdGlvbnM6ICBUaGVzZSBhcmUgZG9uZSBieSBoYW5kLCBhcyBubwotICoJCQkJCW1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBzZWVtcwotICoJCQkJCXRvIGJlIGF2YWlsYWJsZS4KLSAqLwotI2RlZmluZSBEU1RfU19DX0MJICA3CS8qIExhbmd1YWdlID09ICJDIgkqLwotI2RlZmluZSBEU1RfU19DX0NYWAkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCTE1MwotI2RlZmluZQlEU1RfU19DX1NPVVJDRQkxNTUJLyogU291cmNlIGZpbGUJCSovCi0jZGVmaW5lIERTVF9TX0NfUFJPTE9HCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkxNzYJLyogQmVnaW5uaW5nIG9mIGJsb2NrCSovCi0jZGVmaW5lCURTVF9TX0NfQkxLRU5ECTE3NwkvKiBFbmQgb2YgYmxvY2sJKi8KLSNkZWZpbmUgRFNUX1NfQ19FTlRSWQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkxODQKLSNkZWZpbmUJRFNUX1NfQ19MSU5FX05VTQkxODUJLyogTGluZSBOdW1iZXIJCSovCi0jZGVmaW5lIERTVF9TX0NfTEJMT1JMSVQJMTg2Ci0jZGVmaW5lIERTVF9TX0NfTEFCRUwJMTg3Ci0jZGVmaW5lCURTVF9TX0NfTU9EQkVHCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECTE4OQkvKiBFbmQgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfUlROQkVHCTE5MAkvKiBCZWdpbm5pbmcgb2Ygcm91dGluZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkVORAkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cJNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IJNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJCTExCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX0wJCTEyCi0jZGVmaW5lIERTVF9TX0NfU0VUX1NUTVROVU0JMTMKLSNkZWZpbmUgRFNUX1NfQ19URVJNCQkxNAkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUgRFNUX1NfQ19URVJNX1cJCTE1CS8qIEVuZCBvZiBsaW5lcwkqLwotI2RlZmluZQlEU1RfU19DX1NFVF9BQlNfUEMJMTYJLyogU2V0IFBDCSovCi0jZGVmaW5lCURTVF9TX0NfREVMVEFfUENfTAkxNwkvKiBJbmNyIFBDCSovCi0jZGVmaW5lIERTVF9TX0NfSU5DUl9MSU5VTV9MCTE4CS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0IJMTkJLyogU2V0IExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9MCTIwCS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUJRFNUX1NfQ19URVJNX0wJCTIxCS8qIEVuZCBvZiBsaW5lcwkqLwotLyogdGhlc2UgYXJlIHVzZWQgd2l0aCBEU1RfU19DX1NPVVJDRSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUNMRklMRQkgMQkvKiBEZWNsYXJlIHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVEZJTEUJIDIJLyogU2V0IHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19MCSAzCS8qIFNldCByZWNvcmQsIGxvbmd3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19XCSA0CS8qIFNldCByZWNvcmQsIHdvcmQgdmFsdWUgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfVwkxMAkvKiAjIG9mIGxpbmUsIHdvcmQgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUZMSU5FU19CCTExCS8qICMgb2YgbGluZSwgYnl0ZSBjb3VudGVyICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0ZPUk1GRUVECTE2CS8qIF5MIGNvdW50cyBhcyBhIHJlY29yZCAqLwotLyogdGhlIGZvbGxvd2luZyBhcmUgdGhlIGNvZGVzIGZvciB0aGUgdmFyaW91cyBkYXRhIHR5cGVzLiAgQW55dGhpbmcgbm90IG9uCi0gKiB0aGUgbGlzdCBpcyBpbmNsdWRlZCB1bmRlciAnYWR2YW5jZWRfdHlwZScKLSAqLwotI2RlZmluZSBEQkdfU19DX1VDSEFSCQkweDAyCi0jZGVmaW5lIERCR19TX0NfVVNJTlQJCTB4MDMKLSNkZWZpbmUgREJHX1NfQ19VTElOVAkJMHgwNAotI2RlZmluZSBEQkdfU19DX1VRVUFECQkweDA1Ci0jZGVmaW5lIERCR19TX0NfU0NIQVIJCTB4MDYKLSNkZWZpbmUgREJHX1NfQ19TU0lOVAkJMHgwNwotI2RlZmluZSBEQkdfU19DX1NMSU5UCQkweDA4Ci0jZGVmaW5lIERCR19TX0NfU1FVQUQJCTB4MDkKLSNkZWZpbmUgREJHX1NfQ19SRUFMNAkJMHgwYQotI2RlZmluZSBEQkdfU19DX1JFQUw4CQkweDBiCQkvKiBEX2Zsb2F0IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDQJCTB4MGMJCS8qIDJ4Rl9mbG9hdCBjb21wbGV4IGZsb2F0ICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOAkJMHgwZAkJLyogMnhEX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfUkVBTDhfRwkJMHgxYgkJLyogR19mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg4X0cJMHgxZAkJLyogMnhHX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfRlVOQ1RJT05fQUREUgkweDE3Ci0jZGVmaW5lIERCR19TX0NfQURWQU5DRURfVFlQRQkweGEzCi0vKiAgU29tZSBvZiB0aGVzZSBhcmUganVzdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gIFtwcl0KLSAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRBCQkweDAxCS8qIHVuc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRVCQkweDIyCS8qIHVuc2lnbmVkLCB1bmFsaWduZWQgYml0IGZpZWxkICovCi0jZGVmaW5lIERCR19TX0NfU0JJVEEJCTB4MjkJLyogc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRVCQkweDJhCS8qIHNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX0NTVFJJTkcJCTB4MmUJLyogYXNjaXogKCdcMCcgdGVybWluYXRlZCkgc3RyaW5nICovCi0jZGVmaW5lIERCR19TX0NfV0NIQVIJCTB4MzgJLyogd2NoYXJfdCAqLwotLyogIFRoZXNlIGFyZSBkZXNjcmlwdG9yIGNsYXNzIGNvZGVzLgotICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX1MJCTB4MDEJLyogc3RhdGljIChmaXhlZCBsZW5ndGgpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0QJCTB4MDIJLyogZHluYW1pYyBzdHJpbmcgKG5vdCB2aWEgbWFsbG9jISkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfQQkJMHgwNAkvKiBhcnJheSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19VQlMJCTB4MGQJLyogdW5hbGlnbmVkIGJpdCBzdHJpbmcgKi8KLS8qICBUaGVzZSBhcmUgdGhlIGNvZGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRlZmluaXRpb25zIG9mIHN0cnVjdAotICogIHVuaW9uIGFuZCBlbnVtIHJlY29yZHMKLSAqLwotI2RlZmluZSBEQkdfU19DX0VOVU1fSVRFTQkJMHhhNAotI2RlZmluZSBEQkdfU19DX0VOVU1fU1RBUlQJCTB4YTUKLSNkZWZpbmUgREJHX1NfQ19FTlVNX0VORAkJMHhhNgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9JVEVNCQlEU1RfS19WRkxBR1NfQklUT0ZGUwkvKiAweGZmICovCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX1NUQVJUCQkweGFiCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX0VORAkJMHhhYwotI2RlZmluZSBEU1RfS19UWVBTUEVDCQkJMHhhZgkJLyogdHlwZSBzcGVjaWZpY2F0aW9uICovCi0vKiBUaGVzZSBjb2RlcyBhcmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkcwotICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19OT1ZBTAkJMHg4MAkvKiBzdHJ1Y3QgZGVmaW5pdGlvbiBvbmx5ICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19EU0MJCTB4ZmEJLyogZGVzY3JpcHRvciB1c2VkICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19UVlMJCTB4ZmIJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCi0jZGVmaW5lIERTVF9LX1ZTX0ZPTExPV1MJCTB4ZmQJLyogdmFsdWUgc3BlYyBmb2xsb3dzICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19CSVRPRkZTCQkweGZmCS8qIHZhbHVlIGNvbnRhaW5zIGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9MSVRFUkFMCTAKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9BRERSCTEKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9ERVNDCTIKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9SRUcJMwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0FQCTB4MGMJLyogUjEyICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfRlAJMHgwZAkvKiBSMTMgKi8KLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9TUAkweDBlCS8qIFIxNCAqLwotI2RlZmluZSBEU1RfVl9WQUxLSU5ECQkwCS8qIG9mZnNldCBvZiB2YWxraW5kIGZpZWxkICovCi0jZGVmaW5lIERTVF9WX0lORElSRUNUCQkyCS8qIG9mZnNldCB0byBpbmRpcmVjdCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfRElTUAkJMwkvKiBvZmZzZXQgdG8gZGlzcGxhY2VtZW50IGJpdCAqLwotI2RlZmluZSBEU1RfVl9SRUdOVU0JCTQJLyogb2Zmc2V0IHRvIHJlZ2lzdGVyIG51bWJlciAqLwotI2RlZmluZSBEU1RfTV9JTkRJUkVDVAkJKDE8PERTVF9WX0lORElSRUNUKQotI2RlZmluZSBEU1RfTV9ESVNQCQkoMTw8RFNUX1ZfRElTUCkKLSNkZWZpbmUgREJHX0NfRlVOQ1RJT05fUEFSQU0JLyogMHhjOSAqLwlcCi0JKERTVF9LX1ZBTEtJTkRfQUREUnxEU1RfTV9ESVNQfChEU1RfS19SRUdfVkFYX0FQPDxEU1RfVl9SRUdOVU0pKQotI2RlZmluZSBEQkdfQ19MT0NBTF9TWU0JCS8qIDB4ZDkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9GUDw8RFNUX1ZfUkVHTlVNKSkKLS8qIEtpbmRzIG9mIHZhbHVlIHNwZWNpZmljYXRpb25zCi0gKi8KLSNkZWZpbmUgRFNUX0tfVlNfQUxMT0NfU1BMSVQJMwkvKiBzcGxpdCBsaWZldGltZSAqLwotLyogS2luZHMgb2YgdHlwZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1RTX0FUT00JCTB4MDEJLyogYXRvbWljIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19EU0MJCTB4MDIJLyogZGVzY3JpcHRvciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfSU5ECQkweDAzCS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19UUFRSCQkweDA0CS8qIHR5cGVkIHBvaW50ZXIgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX1BUUgkJMHgwNQkvKiBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19BUlJBWQkJMHgwNwkvKiBhcnJheSB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfTk9WX0xFTkcJMHgwZQkvKiBub3ZlbCBsZW5ndGggdHlwZSBzcGVjICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBzdWZmaXggcmVjb3JkcyB0byBkZXRlcm1pbmUgdGhlCi0gKiAgYWN0dWFsIGRhdGEgdHlwZQotICovCi0jZGVmaW5lIERCR19TX0NfQkFTSUMJCQlEU1RfS19UU19BVE9NCi0jZGVmaW5lIERCR19TX0NfQkFTSUNfQVJSQVkJCURTVF9LX1RTX0RTQwotI2RlZmluZSBEQkdfU19DX1NUUlVDVAkJCURTVF9LX1RTX0lORAotI2RlZmluZSBEQkdfU19DX1BPSU5URVIJCQlEU1RfS19UU19UUFRSCi0jZGVmaW5lIERCR19TX0NfVk9JRAkJCURTVF9LX1RTX1BUUgotI2RlZmluZSBEQkdfU19DX0NPTVBMRVhfQVJSQVkJCURTVF9LX1RTX0FSUkFZCi0KLSNlbmRpZgkvKiBXQU5UX1ZNU19PQkpfREVGUyAqLwotCi0vKiBlbmQgb2Ygb2JqLXZtcy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWEyOWsuYyBiL2dhcy9jb25maWcvdGMtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBmZWM1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYTI5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NiArMCwwIEBACi0vKiB0Yy1hMjlrLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBBTUQgMjkwMDAuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBKb2huIEdpbG1vcmUgaGFzIHJlb3JnYW5pemVkIHRoaXMgbW9kdWxlIHNvbWV3aGF0LCB0byBtYWtlIGl0IGVhc2llcgotICAgdG8gY29udmVydCBpdCB0byBuZXcgbWFjaGluZXMnIGFzc2VtYmxlcnMgYXMgZGVzaXJlZC4gIFRoZXJlIHdhcyB0b28KLSAgIG11Y2ggYmxvb2R5IHJld3JpdGluZyByZXF1aXJlZCBiZWZvcmUuICBUaGVyZSBzdGlsbCBwcm9iYWJseSBpcy4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvYTI5ay5oIgotCi0vKiBNYWtlIGl0IGVhc2llciB0byBjbG9uZSB0aGlzIG1hY2hpbmUgZGVzYyBpbnRvIGFub3RoZXIgb25lLiAgKi8KLSNkZWZpbmUJbWFjaGluZV9vcGNvZGUJYTI5a19vcGNvZGUKLSNkZWZpbmUJbWFjaGluZV9vcGNvZGVzCWEyOWtfb3Bjb2RlcwotI2RlZmluZQltYWNoaW5lX2lwCWEyOWtfaXAKLSNkZWZpbmUJbWFjaGluZV9pdAlhMjlrX2l0Ci0KLSNkZWZpbmUJSU1NRURJQVRFX0JJVAkweDAxMDAwMDAwCS8qIFR1cm5zIFJCIGludG8gSW1tZWRpYXRlICovCi0jZGVmaW5lCUFCU09MVVRFX0JJVAkweDAxMDAwMDAwCS8qIFR1cm5zIFBDLXJlbGF0aXZlIHRvIEFic29sdXRlICovCi0jZGVmaW5lCUNFX0JJVAkJMHgwMDgwMDAwMAkvKiBDb3Byb2Nlc3NvciBlbmFibGUgaW4gTE9BRCAqLwotI2RlZmluZQlVSV9CSVQJCTB4MDAwMDAwODAJLyogVW5zaWduZWQgaW50ZWdlciBpbiBDT05WRVJUICovCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotc3RydWN0IG1hY2hpbmVfaXQKLSAgewotICAgIGNoYXIgKmVycm9yOwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBpbnQgcGNyZWw7Ci0gICAgaW50IHJlbG9jX29mZnNldDsJCS8qIE9mZnNldCBvZiByZWxvYyB3aXRoaW4gaW5zbiAqLwotCi0gICAgaW50IHJlbG9jOwotICB9Ci10aGVfaW5zbjsKLQotc3RhdGljIHZvaWQgbWFjaGluZV9pcCBQQVJBTVMgKChjaGFyICpzdHIpKTsKLS8qIHN0YXRpYyB2b2lkIHByaW50X2luc24gUEFSQU1TICgoc3RydWN0IG1hY2hpbmVfaXQgKmluc24pKTsgKi8KLSNpZm5kZWYgT0JKX0NPRkYKLXN0YXRpYyB2b2lkIHNfZGF0YTEgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc191c2UgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotY29uc3QgcHNldWRvX3R5cGVTCi1tZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCA0fSwKLSAgeyJibG9jayIsIHNfc3BhY2UsIDB9LAotICB7ImNwdXR5cGUiLCBzX2lnbm9yZSwgMH0sCS8qIENQVSBhcyAyOTAwMCBvciAyOTA1MCAqLwotICB7InJlZyIsIHNfbHN5bSwgMH0sCQkvKiBSZWdpc3RlciBlcXVhdGUsIHNhbWUgYXMgZXF1ICovCi0gIHsic3BhY2UiLCBzX2lnbm9yZSwgMH0sCS8qIExpc3RpbmcgY29udHJvbCAqLwotICB7InNlY3QiLCBzX2lnbm9yZSwgMH0sCS8qIENyZWF0aW9uIG9mIGNvZmYgc2VjdGlvbnMgKi8KLSNpZm5kZWYgT0JKX0NPRkYKLSAgLyogV2UgY2FuIGRvIHRoaXMgcmlnaHQgd2l0aCBjb2ZmLiAgKi8KLSAgeyJ1c2UiLCBzX3VzZSwgMH0sCi0jZW5kaWYKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLSNpZiBkZWZpbmVkKEJGRF9IRUFERVJTKQotI2lmZGVmIFJFTFNaCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IFJFTFNaOwkvKiBDb2ZmIGhlYWRlcnMgKi8KLSNlbHNlCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDEyOwkJLyogc29tZXRoaW5nIGVsc2UgaGVhZGVycyAqLwotI2VuZGlmCi0jZWxzZQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJCS8qIE5vdCBiZmRpemVkKi8KLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFdlIG5lZWRlZCBhbiB1bnVzZWQgY2hhciBmb3IgbGluZSBzZXBhcmF0aW9uIHRvIHdvcmsgYXJvdW5kIHRoZQotICAgbGFjayBvZiBtYWNyb3MsIHVzaW5nIHNlZCBhbmQgc3VjaC4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiQCI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdAotICAgYWxsLCBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLS8qCi0gKiAgYW51bGwgYml0IC0gY2F1c2VzIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgdG8gbm90IGJlIGV4ZWN1dGVkCi0gKi8KLSNkZWZpbmUgQU5OVUwgICAgICAgKDEgPDwgMjkpCi0KLSNpZm5kZWYgT0JKX0NPRkYKLQotc3RhdGljIHZvaWQKLXNfdXNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIudGV4dCIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBzX3RleHQgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5kYXRhIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmRhdGExIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfZGF0YTEgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBMaXRlcmFscyBjYW4ndCBnbyBpbiB0aGUgdGV4dCBzZWdtZW50IGJlY2F1c2UgeW91IGNhbid0IHJlYWQgZnJvbQotICAgICBpbnN0cnVjdGlvbiBtZW1vcnkgb24gc29tZSAyOWsncy4gIFNvLCBpbnRvIGluaXRpYWxpemVkIGRhdGEuICovCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIubGl0IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAyMDApOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXNfYmFkIChfKCJVbmtub3duIHNlZ21lbnQgdHlwZSIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKCkKLXsKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogSW5zdGFsbCBzeW1ib2wgZGVmaW5pdGlvbiB0aGF0IG1hcHMgUkVHTkFNRSB0byBSRUdOTy4KLSAgIEZJWE1FLVNPT046ICBUaGVzZSBhcmUgbm90IHJlY29nbml6ZWQgaW4gbWl4ZWQgY2FzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfc3JlZyAocmVnbmFtZSwgcmVnbnVtKQotICAgICBjaGFyICpyZWduYW1lOwotICAgICBpbnQgcmVnbnVtOwotewotICAvKiBGSVhNRS1TT09OLCBwdXQgc29tZXRoaW5nIGluIHRoZXNlIHN5bXMgc28gdGhleSB3b24ndCBiZSBvdXRwdXQKLSAgICAgdG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlLiAgKi8KLQotICAvKiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBuYW1lcyBvZiB0aGUgc3BlY2lhbCByZWdpc3RlcnMuICAqLwotICBjaGFyIGJ1Zls4MF07Ci0gIGludCBpOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKHJlZ25hbWUsIFNFR19SRUdJU1RFUiwgKHZhbHVlVCkgcmVnbnVtLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBmb3IgKGkgPSAwOyByZWduYW1lW2ldOyBpKyspCi0gICAgYnVmW2ldID0gaXNsb3dlciAocmVnbmFtZVtpXSkgPyB0b3VwcGVyIChyZWduYW1lW2ldKSA6IHJlZ25hbWVbaV07Ci0gIGJ1ZltpXSA9ICdcMCc7Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLX0KLQotLyogSW5zdGFsbCBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIGFzc29ydGVkIHNwZWNpYWwgcmVnaXN0ZXJzLgotICAgU2VlIEFTTTI5SyBSZWYgcGFnZSAyLTkuICAqLwotCi12b2lkCi1kZWZpbmVfc29tZV9yZWdzICgpCi17Ci0jZGVmaW5lIFNSRUcJMjU2Ci0KLSAgLyogUHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyAqLwotICBpbnNlcnRfc3JlZyAoInZhYiIsIFNSRUcgKyAwKTsKLSAgaW5zZXJ0X3NyZWcgKCJvcHMiLCBTUkVHICsgMSk7Ci0gIGluc2VydF9zcmVnICgiY3BzIiwgU1JFRyArIDIpOwotICBpbnNlcnRfc3JlZyAoImNmZyIsIFNSRUcgKyAzKTsKLSAgaW5zZXJ0X3NyZWcgKCJjaGEiLCBTUkVHICsgNCk7Ci0gIGluc2VydF9zcmVnICgiY2hkIiwgU1JFRyArIDUpOwotICBpbnNlcnRfc3JlZyAoImNoYyIsIFNSRUcgKyA2KTsKLSAgaW5zZXJ0X3NyZWcgKCJyYnAiLCBTUkVHICsgNyk7Ci0gIGluc2VydF9zcmVnICgidG1jIiwgU1JFRyArIDgpOwotICBpbnNlcnRfc3JlZyAoInRtciIsIFNSRUcgKyA5KTsKLSAgaW5zZXJ0X3NyZWcgKCJwYzAiLCBTUkVHICsgMTApOwotICBpbnNlcnRfc3JlZyAoInBjMSIsIFNSRUcgKyAxMSk7Ci0gIGluc2VydF9zcmVnICgicGMyIiwgU1JFRyArIDEyKTsKLSAgaW5zZXJ0X3NyZWcgKCJtbXUiLCBTUkVHICsgMTMpOwotICBpbnNlcnRfc3JlZyAoImxydSIsIFNSRUcgKyAxNCk7Ci0KLSAgLyogQWRkaXRpb25hbCBwcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVycyBmb3IgdGhlIDI5MDUwICovCi0gIGluc2VydF9zcmVnICgicnNuIiwgIFNSRUcgKyAxNSk7Ci0gIGluc2VydF9zcmVnICgicm1hMCIsIFNSRUcgKyAxNik7Ci0gIGluc2VydF9zcmVnICgicm1jMCIsIFNSRUcgKyAxNyk7Ci0gIGluc2VydF9zcmVnICgicm1hMSIsIFNSRUcgKyAxOCk7Ci0gIGluc2VydF9zcmVnICgicm1jMSIsIFNSRUcgKyAxOSk7Ci0gIGluc2VydF9zcmVnICgic3BjMCIsIFNSRUcgKyAyMCk7Ci0gIGluc2VydF9zcmVnICgic3BjMSIsIFNSRUcgKyAyMSk7Ci0gIGluc2VydF9zcmVnICgic3BjMiIsIFNSRUcgKyAyMik7Ci0gIGluc2VydF9zcmVnICgiaWJhMCIsIFNSRUcgKyAyMyk7Ci0gIGluc2VydF9zcmVnICgiaWJjMCIsIFNSRUcgKyAyNCk7Ci0gIGluc2VydF9zcmVnICgiaWJhMSIsIFNSRUcgKyAyNSk7Ci0gIGluc2VydF9zcmVnICgiaWJjMSIsIFNSRUcgKyAyNik7Ci0KLSAgLyogQWRkaXRpb25hbCByZWdpc3RlcnMgZm9yIHRoZSAyOTA0MC4gICovCi0gIGluc2VydF9zcmVnICgiZGJhIiwgU1JFRyArIDI3KTsKLSAgaW5zZXJ0X3NyZWcgKCJkYmMiLCBTUkVHICsgMjgpOwotICBpbnNlcnRfc3JlZyAoImNpciIsIFNSRUcgKyAyOSk7Ci0gIGluc2VydF9zcmVnICgiY2RyIiwgU1JFRyArIDMwKTsKLQotICAvKiBVbnByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgKi8KLSAgaW5zZXJ0X3NyZWcgKCJpcGMiLCBTUkVHICsgMTI4KTsKLSAgaW5zZXJ0X3NyZWcgKCJpcGEiLCBTUkVHICsgMTI5KTsKLSAgaW5zZXJ0X3NyZWcgKCJpcGIiLCBTUkVHICsgMTMwKTsKLSAgaW5zZXJ0X3NyZWcgKCJxIiwgU1JFRyArIDEzMSk7Ci0gIGluc2VydF9zcmVnICgiYWx1IiwgU1JFRyArIDEzMik7Ci0gIGluc2VydF9zcmVnICgiYnAiLCBTUkVHICsgMTMzKTsKLSAgaW5zZXJ0X3NyZWcgKCJmYyIsIFNSRUcgKyAxMzQpOwotICBpbnNlcnRfc3JlZyAoImNyIiwgU1JFRyArIDEzNSk7Ci0gIGluc2VydF9zcmVnICgiZnBlIiwgU1JFRyArIDE2MCk7Ci0gIGluc2VydF9zcmVnICgiaW50ZSIsIFNSRUcgKyAxNjEpOwotICBpbnNlcnRfc3JlZyAoImZwcyIsIFNSRUcgKyAxNjIpOwotICAvKiAgIiIsICAgIFNSRUcrMTYzKTsJICBSZXNlcnZlZCAqLwotICBpbnNlcnRfc3JlZyAoImV4b3AiLCBTUkVHICsgMTY0KTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuLCB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbAotICAgbmVlZC4gICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHJlZ2lzdGVyIGludCBza2lwbmV4dCA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICByZWdpc3RlciBjaGFyICpzdHJlbmQsICpzdHJlbmQyOwotCi0gIC8qIEhhc2ggdXAgYWxsIHRoZSBvcGNvZGVzIGZvciBmYXN0IHVzZSBsYXRlci4gICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fb3Bjb2RlczsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtYWNoaW5lX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgaWYgKHNraXBuZXh0KQotCXsKLQkgIHNraXBuZXh0ID0gMDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSGFjayB0byBhdm9pZCBtdWx0aXBsZSBvcGNvZGUgZW50cmllcy4gIFdlIHByZS1sb2NhdGUgYWxsIHRoZQotCSB2YXJpYXRpb25zIChiL2kgZmllbGQgYW5kIFAvQSBmaWVsZCkgYW5kIGhhbmRsZSB0aGVtLiAqLwotCi0gICAgICBpZiAoIXN0cmNtcCAobmFtZSwgbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5uYW1lKSkKLQl7Ci0JICBpZiAoKG1hY2hpbmVfb3Bjb2Rlc1tpXS5vcGNvZGUgJiAweDAxMDAwMDAwKSAhPSAwCi0JICAgICAgfHwgKG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0ub3Bjb2RlICYgMHgwMTAwMDAwMCkgPT0gMAotCSAgICAgIHx8ICgobWFjaGluZV9vcGNvZGVzW2ldLm9wY29kZSB8IDB4MDEwMDAwMDApCi0JCSAgIT0gbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5vcGNvZGUpKQotCSAgICBnb3RvIGJhZF90YWJsZTsKLQkgIHN0cmVuZCA9IG1hY2hpbmVfb3Bjb2Rlc1tpXS5hcmdzICsgc3RybGVuIChtYWNoaW5lX29wY29kZXNbaV0uYXJncykgLSAxOwotCSAgc3RyZW5kMiA9IG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0uYXJncyArIHN0cmxlbiAobWFjaGluZV9vcGNvZGVzW2kgKyAxXS5hcmdzKSAtIDE7Ci0JICBzd2l0Y2ggKCpzdHJlbmQpCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgaWYgKCpzdHJlbmQyICE9ICdpJykKLQkJZ290byBiYWRfdGFibGU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1AnOgotCSAgICAgIGlmICgqc3RyZW5kMiAhPSAnQScpCi0JCWdvdG8gYmFkX3RhYmxlOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICBiYWRfdGFibGU6Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhbmRsZSBvcGNvZGUgJXNcbiIsCi0JCSAgICAgICBuYW1lKTsKLQkgICAgICBsb3NlID0gMTsKLQkgICAgfQotCi0JICAvKiBPSywgdGhpcyBpcyBhbiBpL2Igb3IgQS9QIHBhaXIuICBXZSBza2lwIHRoZQotCSAgICAgaGlnaGVyLXZhbHVlZCBvbmUsIGFuZCBsZXQgdGhlIGNvZGUgZm9yIG9wZXJhbmQgY2hlY2tpbmcKLQkgICAgIGhhbmRsZSBPUi1pbmcgaW4gdGhlIGJpdC4gICovCi0JICBza2lwbmV4dCA9IDE7Ci0JfQotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKFBUUikgJm1hY2hpbmVfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIsCi0JCSAgIG1hY2hpbmVfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgZGVmaW5lX3NvbWVfcmVncyAoKTsKLX0KLQotLyogQXNzZW1ibGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBJdHMgbGFiZWwgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkCi0gICBieSB0aGUgZ2VuZXJpYyBmcm9udCBlbmQuICBXZSBqdXN0IHBhcnNlIG9wY29kZSBhbmQgb3BlcmFuZHMsIGFuZAotICAgcHJvZHVjZSB0aGUgYnl0ZXMgb2YgZGF0YSBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG9QOwotCi0gIGtub3cgKHN0cik7Ci0gIG1hY2hpbmVfaXAgKHN0cik7Ci0gIHRvUCA9IGZyYWdfbW9yZSAoNCk7Ci0gIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgdGhlX2luc24ub3Bjb2RlLCA0KTsKLQotICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCi0gIGlmICh0aGVfaW5zbi5yZWxvYyAhPSBOT19SRUxPQykKLSAgICB7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIHRoZV9pbnNuLnJlbG9jX29mZnNldCksCi0JCSAgIDQsCQkvKiBzaXplICovCi0JCSAgICZ0aGVfaW5zbi5leHAsCi0JCSAgIHRoZV9pbnNuLnBjcmVsLAotCQkgICB0aGVfaW5zbi5yZWxvYyk7Ci0gICAgfQotfQotCi1jaGFyICoKLXBhcnNlX29wZXJhbmQgKHMsIG9wZXJhbmRwLCBvcHQpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyYW5kcDsKLSAgICAgaW50IG9wdDsKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqbmV3OwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKG9wZXJhbmRwKTsKLSAgaWYgKG9wZXJhbmRwLT5YX29wID09IE9fYWJzZW50ICYmICEgb3B0KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIEluc3RydWN0aW9uIHBhcnNpbmcuICBUYWtlcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBvcGNvZGUuCi0gICBPcGVyYW5kcyBhcmUgYXQgaW5wdXRfbGluZV9wb2ludGVyLiAgT3V0cHV0IGlzIGluIHRoZV9pbnNuLgotICAgV2FybmluZ3Mgb3IgZXJyb3JzIGFyZSBnZW5lcmF0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbWFjaGluZV9pcCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIHN0cnVjdCBtYWNoaW5lX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgZXhwcmVzc2lvblMgdGhlX29wZXJhbmQ7Ci0gIGV4cHJlc3Npb25TICpvcGVyYW5kID0gJnRoZV9vcGVyYW5kOwotICB1bnNpZ25lZCBpbnQgcmVnOwotCi0gIC8qIE11c3QgaGFuZGxlIGBkaXYwJyBvcGNvZGUuICAqLwotICBzID0gc3RyOwotICBpZiAoaXNhbHBoYSAoKnMpKQotICAgIGZvciAoOyBpc2FsbnVtICgqcyk7ICsrcykKLSAgICAgIGlmIChpc3VwcGVyICgqcykpCi0JKnMgPSB0b2xvd2VyICgqcyk7Ci0KLSAgc3dpdGNoICgqcykKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcgJzoJCQkvKiBGSVhNRS1TT01FREFZIG1vcmUgd2hpdGVzcGFjZSAqLwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoKGluc24gPSAoc3RydWN0IG1hY2hpbmVfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlIGAlcycuIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBhcmdzU3RhcnQgPSBzOwotICBvcGNvZGUgPSBpbnNuLT5vcGNvZGU7Ci0gIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0gIHRoZV9pbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0KLSAgLyogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0gICAgIG9wZXJhbmRzIG1hdGNoLgotICAgCi0gICAgIElmIGFuIG9wZXJhbmQgbWF0Y2hlcywgd2UgbW9kaWZ5IHRoZV9pbnNuIG9yIG9wY29kZSBhcHByb3ByaWF0ZWx5LAotICAgICBhbmQgZG8gYSAiY29udGludWUiLiAgSWYgYW4gb3BlcmFuZCBmYWlscyB0byBtYXRjaCwgd2UgImJyZWFrIi4gICovCi0KLSAgaWYgKGluc24tPmFyZ3NbMF0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBQcmltZSB0aGUgcHVtcC4gICovCi0gICAgICBzID0gcGFyc2Vfb3BlcmFuZCAocywgb3BlcmFuZCwgaW5zbi0+YXJnc1swXSA9PSAnSScpOwotICAgIH0KLQotICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmFyZ3MpCi0JewotCi0JY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgIGlmICgqcyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIHRydWx5IGRvbmUuICovCi0JICAgICAgdGhlX2luc24ub3Bjb2RlID0gb3Bjb2RlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYXNfYmFkIChfKCJUb28gbWFueSBvcGVyYW5kczogJXMiKSwgcyk7Ci0JICBicmVhazsKLQotCWNhc2UgJywnOgkJLyogTXVzdCBtYXRjaCBhIGNvbW1hICovCi0JICBpZiAoKnMrKyA9PSAnLCcpCi0JICAgIHsKLQkgICAgICAvKiBQYXJzZSBuZXh0IG9wZXJhbmQuICAqLwotCSAgICAgIHMgPSBwYXJzZV9vcGVyYW5kIChzLCBvcGVyYW5kLCBhcmdzWzFdID09ICdJJyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAndic6CQkvKiBUcmFwIG51bWJlcnMgKGltbWVkaWF0ZSBmaWVsZCkgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgMjU2KQotCQl7Ci0JCSAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTYpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIpLAotCQkJICAobG9uZykgb3BlcmFuZC0+WF9hZGRfbnVtYmVyKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DXzg7Ci0JICB0aGVfaW5zbi5yZWxvY19vZmZzZXQgPSAxOwkvKiBCSUctRU5ESUFOIEJ5dGUgMSBvZiBpbnNuICovCi0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYic6CQkvKiBBIGdlbmVyYWwgcmVnaXN0ZXIgb3IgOC1iaXQgaW1tZWRpYXRlICovCi0JY2FzZSAnaSc6Ci0JICAvKiBXZSB0cmVhdCB0aGUgdHdvIGNhc2VzIGlkZW50aWNhbGx5IHNpbmNlIHdlIG1hc2hlZAotCSAgICAgdGhlbSB0b2dldGhlciBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgIGdvdG8gZ2VuZXJhbF9yZWc7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGUgJ2knIGNhc2UgcmVhbGx5IGV4aXN0cy4gICovCi0JICBpZiAoKGluc24tPm9wY29kZSB8IElNTUVESUFURV9CSVQpICE9IChpbnNuICsgMSktPm9wY29kZSkKLQkgICAgYnJlYWs7Ci0KLQkgIG9wY29kZSB8PSBJTU1FRElBVEVfQklUOwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAyNTYpCi0JCXsKLQkJICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIpLAotCQkJICAobG9uZykgb3BlcmFuZC0+WF9hZGRfbnVtYmVyKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DXzg7Ci0JICB0aGVfaW5zbi5yZWxvY19vZmZzZXQgPSAzOwkvKiBCSUctRU5ESUFOIEJ5dGUgMyBvZiBpbnNuICovCi0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYSc6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZ2lzdGVyICovCi0JY2FzZSAnYyc6Ci0JZ2VuZXJhbF9yZWc6Ci0JICAvKiBsck5OTiBvciBnck5OTiBvciAlJWV4cHIgb3IgYSB1c2VyLWRlZiByZWdpc3RlciBuYW1lICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX3JlZ2lzdGVyKQotCSAgICBicmVhazsJCS8qIE9ubHkgcmVnaXN0ZXJzICovCi0JICBrbm93IChvcGVyYW5kLT5YX2FkZF9zeW1ib2wgPT0gMCk7Ci0JICBrbm93IChvcGVyYW5kLT5YX29wX3N5bWJvbCA9PSAwKTsKLQkgIHJlZyA9IG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLQkgIGlmIChyZWcgPj0gU1JFRykKLQkgICAgYnJlYWs7CQkvKiBObyBzcGVjaWFsIHJlZ2lzdGVycyAqLwotCi0JICAvKiBHb3QgdGhlIHJlZ2lzdGVyLCBub3cgZmlndXJlIG91dCB3aGVyZSBpdCBnb2VzIGluIHRoZQotCSAgICAgb3Bjb2RlLiAgKi8KLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgb3Bjb2RlIHw9IHJlZyA8PCA4OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2InOgotCSAgICBjYXNlICdpJzoKLQkgICAgICBvcGNvZGUgfD0gcmVnOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2MnOgotCSAgICAgIG9wY29kZSB8PSByZWcgPDwgMTY7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6CQkvKiAxNiBiaXQgY29uc3RhbnQsIHplcm8tZXh0ZW5kZWQgKi8KLQljYXNlICdYJzoJCS8qIDE2IGJpdCBjb25zdGFudCwgb25lLWV4dGVuZGVkICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGKSA8PCAwIHwKLQkJKChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGMDApIDw8IDgpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DX0NPTlNUOwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2gnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHgwMEZGMDAwMCkgPj4gMTYgfAotCQkoKCh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5YX2FkZF9udW1iZXIKLQkJICAvKiBhdm9pZCBzaWduIGV4dCAqLyAgJiAweEZGMDAwMDAwKSA+PiA4KTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ19DT05TVEg7Ci0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnUCc6CQkvKiBQQy1yZWxhdGl2ZSBqdW1wIGFkZHJlc3MgKi8KLQljYXNlICdBJzoJCS8qIEFic29sdXRlIGp1bXAgYWRkcmVzcyAqLwotCSAgLyogVGhlc2UgdHdvIGFyZSB0cmVhdGVkIHRvZ2V0aGVyIHNpbmNlIHdlIGZvbGRlZCB0aGUKLQkgICAgIG9wY29kZSB0YWJsZSBlbnRyaWVzIHRvZ2V0aGVyLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICAvKiBNYWtlIHN1cmUgdGhlICdBJyBjYXNlIHJlYWxseSBleGlzdHMuICAqLwotCSAgICAgIGlmICgoaW5zbi0+b3Bjb2RlIHwgQUJTT0xVVEVfQklUKSAhPSAoaW5zbiArIDEpLT5vcGNvZGUpCi0JCWJyZWFrOwotCSAgICAgIHsKLQkJYmZkX3ZtYSB2LCBtYXNrOwotCQltYXNrID0gMHgxZmZmZjsKLQkJdiA9IG9wZXJhbmQtPlhfYWRkX251bWJlciAmIH4gbWFzazsKLQkJaWYgKHYpCi0JCSAgYXNfYmFkICgiY2FsbC9qbXAgdGFyZ2V0IG91dCBvZiByYW5nZSIpOwotCSAgICAgIH0KLQkgICAgICBvcGNvZGUgfD0gQUJTT0xVVEVfQklUIHwKLQkJKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4MDAwM0ZDMDApIDw8IDYgfAotCQkoKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4MDAwMDAzRkMpID4+IDIpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DX0pVTVBUQVJHOwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICB0aGVfaW5zbi5wY3JlbCA9IDE7CS8qIEFzc3VtZSBQQy1yZWxhdGl2ZSBqdW1wICovCi0JICAvKiBGSVhNRS1TT09OLCBEbyB3ZSBmaWd1cmUgb3V0IHdoZXRoZXIgYWJzIGxhdGVyLCBhZnRlcgotICAgICAgICAgICAgIGtub3cgc3ltIHZhbD8gKi8KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnZSc6CQkvKiBDb3Byb2Nlc3NvciBlbmFibGUgYml0IGZvciBMT0FEL1NUT1JFIGluc24gKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMSkKLQkJewotCQkgIG9wY29kZSB8PSBDRV9CSVQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICduJzoJCS8qIENvbnRyb2wgYml0cyBmb3IgTE9BRC9TVE9SRSBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAxMjgpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gKG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxNik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAncyc6CQkvKiBTcGVjaWFsIHJlZ2lzdGVyIG51bWJlciAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgIT0gT19yZWdpc3RlcikKLQkgICAgYnJlYWs7CQkvKiBPbmx5IHJlZ2lzdGVycyAqLwotCSAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA8IFNSRUcpCi0JICAgIGJyZWFrOwkJLyogTm90IGEgc3BlY2lhbCByZWdpc3RlciAqLwotCSAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGKSA8PCA4OwotCSAgY29udGludWU7Ci0KLQljYXNlICd1JzoJCS8qIFVJIGJpdCBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA9PSAwKQotCQljb250aW51ZTsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDEpCi0JCXsKLQkJICBvcGNvZGUgfD0gVUlfQklUOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAncic6CQkvKiBSTkQgYml0cyBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgOCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgNDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoJCS8qIElEIGJpdHMgb2YgSU5WIGFuZCBJUkVUSU5WLiAgKi8KLQkgIC8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbC4gICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgY29udGludWU7Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQKLQkJICAgJiYgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTY7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6CQkvKiBGRCBiaXRzIG9mIENPTlZFUlQgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAyOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCi0JY2FzZSAnZic6CQkvKiBGUyBiaXRzIG9mIENPTlZFUlQgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgotCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDQpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE2OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgotCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDE2KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxODsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKCphcmdzKTsKLQl9Ci0gICAgICAvKiBUeXBlcyBvciB2YWx1ZXMgb2YgYXJncyBkb24ndCBtYXRjaC4gICovCi0gICAgICBhc19iYWQgKCJJbnZhbGlkIG9wZXJhbmRzIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbWRfYXRvZiBpbiBtNjhrLmMuICBJIHRoaW5rIHRoaXMgaXMgcmlnaHQsCi0gICBidXQgSSdtIG5vdCBzdXJlLgotCi0gICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiAiQmFkIGNhbGwgdG8gTURfQVRPRigpIjsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdyaXRlIG91dCBiaWctZW5kaWFuLgotICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KLQotCi0gIGtub3cgKGZpeFAtPmZ4X3NpemUgPT0gNCk7Ci0gIGtub3cgKGZpeFAtPmZ4X3JfdHlwZSA8IE5PX1JFTE9DKTsKLQotICAvKiBUaGlzIGlzIGEgaGFjay4gIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuICAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJFTE9DX1dESVNQMzAgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgewotICAgICAgdmFsICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSAgICB9Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotCi0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DXzg6Ci0gICAgICBidWZbMF0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfV0RJU1AzMDoKLSAgICAgIHZhbCA9ICh2YWwgPj49IDIpICsgMTsKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDI0KSAmIDB4M2Y7Ci0gICAgICBidWZbMV0gPSAodmFsID4+IDE2KTsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0hJMjI6Ci0gICAgICBidWZbMV0gfD0gKHZhbCA+PiAyNikgJiAweDNmOwotICAgICAgYnVmWzJdID0gdmFsID4+IDE4OwotICAgICAgYnVmWzNdID0gdmFsID4+IDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0xPMTA6Ci0gICAgICBidWZbMl0gfD0gKHZhbCA+PiA4KSAmIDB4MDM7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfQkFTRTEzOgotICAgICAgYnVmWzJdIHw9ICh2YWwgPj4gOCkgJiAweDFmOwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1dESVNQMjI6Ci0gICAgICB2YWwgPSAodmFsID4+PSAyKSArIDE7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgUkVMT0NfQkFTRTIyOgotICAgICAgYnVmWzFdIHw9ICh2YWwgPj4gMTYpICYgMHgzZjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0pVTVBUQVJHOgkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgaWYgKCFmaXhQLT5meF9kb25lKQotCXsKLQkgIC8qIFRoZSBsaW5rZXIgdHJpZXMgdG8gc3VwcG9ydCBib3RoIEFNRCBhbmQgb2xkIEdOVSBzdHlsZQotICAgICAgICAgICAgIFJfSVJFTCByZWxvY3MuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIGFkZGVuZCBpcyBleGFjdGx5Ci0gICAgICAgICAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiwgdGhlCi0gICAgICAgICAgICAgbGlua2VyIHdpbGwgbm90IGhhbmRsZSBpdCBjb3JyZWN0bHkuICAqLwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsCi0JICAgICAgJiYgdmFsICE9IDAKLQkgICAgICAmJiB2YWwgPT0gLSAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlKSkKLQkgICAgYXNfYmFkX3doZXJlCi0JICAgICAgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JICAgICAgICJ0aGUgbGlua2VyIHdpbGwgbm90IGhhbmRsZSB0aGlzIHJlbG9jYXRpb24gY29ycmVjdGx5Iik7Ci0JfQotICAgICAgZWxzZSBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JewotCSAgbG9uZyB2ID0gdmFsID4+IDE3OwotCSAgaWYgKHYgIT0gMCAmJiB2ICE9IC0xKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICJjYWxsL2ptcCB0YXJnZXQgb3V0IG9mIHJhbmdlIik7Ci0JfQotICAgICAgZWxzZQotCS8qIHRoaXMgY2FzZSB3YXMgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBpbiBtYWNoaW5lX2lwICovCi0JYWJvcnQgKCk7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTA7CS8qIEhvbGRzIGJpdHMgMDAwM0ZGRkMgb2YgYWRkcmVzcyAqLwotICAgICAgYnVmWzNdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfQ09OU1Q6CQkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgYnVmWzFdID0gdmFsID4+IDg7CS8qIEhvbGRzIGJpdHMgMDAwMFhYWFggKi8KLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19DT05TVEg6CQkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgYnVmWzFdID0gdmFsID4+IDI0OwkvKiBIb2xkcyBiaXRzIFhYWFgwMDAwICovCi0gICAgICBidWZbM10gPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTk9fUkVMT0M6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IiksIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNpZmRlZiBPQkpfQ09GRgotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgcmV0dXJuIChSX1dPUkQpOwotICAgIGNhc2UgUkVMT0NfODoKLSAgICAgIHJldHVybiAoUl9CWVRFKTsKLSAgICBjYXNlIFJFTE9DX0NPTlNUOgotICAgICAgcmV0dXJuIChSX0lMT0hBTEYpOwotICAgIGNhc2UgUkVMT0NfQ09OU1RIOgotICAgICAgcmV0dXJuIChSX0lISUhBTEYpOwotICAgIGNhc2UgUkVMT0NfSlVNUFRBUkc6Ci0gICAgICByZXR1cm4gKFJfSVJFTCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoXygibmVlZCAlbzNcbiIpLCBmaXhQLT5meF9yX3R5cGUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gdHlwZSAqLwotCi0gIHJldHVybiAoMCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciAyOWsgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGFzX2ZhdGFsIChfKCJhMjlrX2NvbnZlcnRfZnJhZ1xuIikpOwotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBhMjlrICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VndHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJhMjlrX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iKSk7Ci0gIHJldHVybiAwOwotfQotCi0jaWYgMAotLyogZm9yIGRlYnVnZ2luZyBvbmx5ICovCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbiAoaW5zbikKLSAgICAgc3RydWN0IG1hY2hpbmVfaXQgKmluc247Ci17Ci0gIGNoYXIgKlJlbG9jW10gPQotICB7Ci0gICAgIlJFTE9DXzgiLAotICAgICJSRUxPQ18xNiIsCi0gICAgIlJFTE9DXzMyIiwKLSAgICAiUkVMT0NfRElTUDgiLAotICAgICJSRUxPQ19ESVNQMTYiLAotICAgICJSRUxPQ19ESVNQMzIiLAotICAgICJSRUxPQ19XRElTUDMwIiwKLSAgICAiUkVMT0NfV0RJU1AyMiIsCi0gICAgIlJFTE9DX0hJMjIiLAotICAgICJSRUxPQ18yMiIsCi0gICAgIlJFTE9DXzEzIiwKLSAgICAiUkVMT0NfTE8xMCIsCi0gICAgIlJFTE9DX1NGQV9CQVNFIiwKLSAgICAiUkVMT0NfU0ZBX09GRjEzIiwKLSAgICAiUkVMT0NfQkFTRTEwIiwKLSAgICAiUkVMT0NfQkFTRTEzIiwKLSAgICAiUkVMT0NfQkFTRTIyIiwKLSAgICAiUkVMT0NfUEMxMCIsCi0gICAgIlJFTE9DX1BDMjIiLAotICAgICJSRUxPQ19KTVBfVEJMIiwKLSAgICAiUkVMT0NfU0VHT0ZGMTYiLAotICAgICJSRUxPQ19HTE9CX0RBVCIsCi0gICAgIlJFTE9DX0pNUF9TTE9UIiwKLSAgICAiUkVMT0NfUkVMQVRJVkUiLAotICAgICJOT19SRUxPQyIKLSAgfTsKLQotICBpZiAoaW5zbi0+ZXJyb3IpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6ICVzXG4iKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIm9wY29kZT0weCUwOHhcbiIsIGluc24tPm9wY29kZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgInJlbG9jID0gJXNcbiIsIFJlbG9jW2luc24tPnJlbG9jXSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4cCA9ICB7XG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9zeW1ib2wgPwotCSAgIChTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX2FkZF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfb3Bfc3ltYm9sID0gJXNcbiIsCi0JICAgaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgOiAiPz8/IikgOiAiMCIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9hZGRfbnVtYmVyID0gJWRcbiIsCi0JICAgaW5zbi0+ZXhwLlhfYWRkX251bWJlcik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIn1cbiIpOwotfQotCi0jZW5kaWYKLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byB0YXJnZXQgZm9ybWF0LgotCi0gICBPbiBzcGFyYy8yOWs6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKLSAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIGV4dGVybmFsLCBiaXRzIDYgJiA1IHVudXNlZCwgYW5kIHRoZSBsb3dlcgotICAgZml2ZSBiaXRzIGFzIHJlbG9jYXRpb24gdHlwZS4gIE5leHQgNCBieXRlcyBhcmUgbG9uZyBhZGRlbmQuICovCi0vKiBUaGFueCBhbmQgYSB0aXAgb2YgdGhlIGhhdCB0byBNaWNoYWVsIEJsb29tLCBtYkB0dGlkY2EudHRpLmNvbSAqLwotCi0jaWZkZWYgT0JKX0FPVVQKLQotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X3JfdHlwZSA8IE5PX1JFTE9DKTsKLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCA3KSAmIDB4ODApIHwgKDAgJiAweDYwKSB8IChmaXhQLT5meF9yX3R5cGUgJiAweDFGKTsKLSAgLyogQWxzbyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAoJndoZXJlWzhdLCBmaXhQLT5meF9hZGRudW1iZXIsIDQpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgbGluZSBpcyB1bnJlY29nbml6ZWQuICBUaGlzIGlzIHVzZWQgdG8gaGFuZGxlCi0gICBkZWZpbml0aW9ucyBvZiBhMjlrIHN0eWxlIGxvY2FsIGxhYmVscy4gICovCi0KLWludAotYTI5a191bnJlY29nbml6ZWRfbGluZSAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGludCBsYWI7Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKGMgIT0gJyQnCi0gICAgICB8fCAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMF0pKQotICAgIHJldHVybiAwOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgbGFiID0gMDsKLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0gICAgewotICAgICAgbGFiID0gbGFiICogMTAgKyAqcyAtICcwJzsKLSAgICAgICsrczsKLSAgICB9Ci0KLSAgaWYgKCpzICE9ICc6JykKLSAgICB7Ci0gICAgICAvKiBOb3QgYSBsYWJlbCBkZWZpbml0aW9uLiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKGxhYikpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJsYWJlbCBcIiQlZFwiIHJlZGVmaW5lZCIpLCBsYWIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGRlZmluZV9kb2xsYXJfbGFiZWwgKGxhYik7Ci0gIGNvbG9uIChkb2xsYXJfbGFiZWxfbmFtZSAobGFiLCAwKSk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAxOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IHRoZSB2YWx1ZXMgb2Ygc3ltYm9scyBrbm93biB0aGF0IHNob3VsZCBiZSAicHJlZGVmaW5lZCIuICBXZQotICAgZG9uJ3QgYm90aGVyIHRvIHByZWRlZmluZSB0aGVtIHVubGVzcyB5b3UgYWN0dWFsbHkgdXNlIG9uZSwgc2luY2UgdGhlcmUKLSAgIGFyZSBhIGxvdCBvZiB0aGVtLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBsb25nIHJlZ251bTsKLSAgY2hhciB0ZXN0YnVmWzUgKyAvKlNMT1AqLyA1XTsKLQotICBpZiAobmFtZVswXSA9PSAnZycgfHwgbmFtZVswXSA9PSAnRycKLSAgICAgIHx8IG5hbWVbMF0gPT0gJ2wnIHx8IG5hbWVbMF0gPT0gJ0wnCi0gICAgICB8fCBuYW1lWzBdID09ICdzJyB8fCBuYW1lWzBdID09ICdTJykKLSAgICB7Ci0gICAgICAvKiBQZXJoYXBzIGEgZ2xvYmFsIG9yIGxvY2FsIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgIGlmIChuYW1lWzFdID09ICdyJyB8fCBuYW1lWzFdID09ICdSJykKLQl7Ci0JICBsb25nIG1heHJlZzsKLQotCSAgLyogUGFyc2UgdGhlIG51bWJlciwgbWFrZSBzdXJlIGl0IGhhcyBubyBleHRyYSB6ZXJvZXMgb3IKLQkgICAgIHRyYWlsaW5nIGNoYXJzLiAqLwotCSAgcmVnbnVtID0gYXRvbCAoJm5hbWVbMl0pOwotCi0JICBpZiAobmFtZVswXSA9PSAncycgfHwgbmFtZVswXSA9PSAnUycpCi0JICAgIG1heHJlZyA9IDI1NTsKLQkgIGVsc2UKLQkgICAgbWF4cmVnID0gMTI3OwotCSAgaWYgKHJlZ251bSA+IG1heHJlZykKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIHNwcmludGYgKHRlc3RidWYsICIlbGQiLCByZWdudW0pOwotCSAgaWYgKHN0cmNtcCAodGVzdGJ1ZiwgJm5hbWVbMl0pICE9IDApCi0JICAgIHJldHVybiBOVUxMOwkvKiBncjAwNyBvciBscjdmb28gb3Igd2hhdGV2ZXIgKi8KLQotCSAgLyogV2UgaGF2ZSBhIHdpZW5lciEgIERlZmluZSBhbmQgcmV0dXJuIGEgbmV3IHN5bWJvbCBmb3IgaXQuICAqLwotCSAgaWYgKG5hbWVbMF0gPT0gJ2wnIHx8IG5hbWVbMF0gPT0gJ0wnKQotCSAgICByZWdudW0gKz0gMTI4OwotCSAgZWxzZSBpZiAobmFtZVswXSA9PSAncycgfHwgbmFtZVswXSA9PSAnUycpCi0JICAgIHJlZ251bSArPSBTUkVHOwotCSAgcmV0dXJuIChzeW1ib2xfbmV3IChuYW1lLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCSAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFBhcnNlIGFuIG9wZXJhbmQgdGhhdCBpcyBtYWNoaW5lLXNwZWNpZmljLiAgKi8KLQotdm9pZAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICclJyAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJyUnKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSBudW1lcmljIHJlZ2lzdGVyIGV4cHJlc3Npb24uICBObyBiaWdneS4gICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsJLyogU2tpcCAlJSAqLwotICAgICAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIGlmIChleHByZXNzaW9uUC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0JICB8fCBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID4gMjU1KQotCWFzX2JhZCAoXygiSW52YWxpZCBleHByZXNzaW9uIGFmdGVyICUlJSVcbiIpKTsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJicpCi0gICAgewotICAgICAgLyogV2UgYXJlIHRha2luZyB0aGUgJ2FkZHJlc3MnIG9mIGEgcmVnaXN0ZXIuLi50aGlzIG9uZSBpcyBub3QKLQkgaW4gdGhlIG1hbnVhbCwgYnV0IGl0ICppcyogaW4gdHJhcHMvZnBzeW1ib2wuaCEgIFdoYXQgdGhleQotCSBzZWVtIHRvIHdhbnQgaXMgdGhlIHJlZ2lzdGVyIG51bWJlciwgYXMgYW4gYWJzb2x1dGUgbnVtYmVyLiAgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkvKiBTa2lwICYgKi8KLSAgICAgICh2b2lkKSBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgIT0gT19yZWdpc3RlcikKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgaW4gJiBleHByZXNzaW9uIikpOwotICAgICAgZWxzZQotCWV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJCcKLQkgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKLSAgICB7Ci0gICAgICBsb25nIGxhYjsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBsb2NhbCBsYWJlbC4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGxhYiA9IChsb25nKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChkb2xsYXJfbGFiZWxfZGVmaW5lZCAobGFiKSkKLQl7Ci0JICBuYW1lID0gZG9sbGFyX2xhYmVsX25hbWUgKGxhYiwgMCk7Ci0JICBzeW0gPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAobGFiLCAxKTsKLQkgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCX0KLQotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW07Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJCcpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgdHlwZTsKLSAgICAgIGludCBmaWVsZG51bSwgZmllbGRsaW1pdDsKLSAgICAgIExJVFRMRU5VTV9UWVBFIGZsb2F0YnVmWzhdOwotCi0gICAgICAvKiAkZmxvYXQoKSwgJGRvdWJsZU4oKSwgb3IgJGV4dGVuZE4oKSBjb252ZXJ0IGZsb2F0aW5nIHZhbHVlcwotCSB0byBpbnRlZ2Vycy4gICovCi0KLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgICsrczsKLQotICAgICAgZmllbGRudW0gPSAwOwotICAgICAgaWYgKHN0cm5jbXAgKHMsICJkb3VibGUiLCBzaXplb2YgImRvdWJsZSIgLSAxKSA9PSAwKQotCXsKLQkgIHMgKz0gc2l6ZW9mICJkb3VibGUiIC0gMTsKLQkgIHR5cGUgPSAnZCc7Ci0JICBmaWVsZGxpbWl0ID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAiZmxvYXQiLCBzaXplb2YgImZsb2F0IiAtIDEpID09IDApCi0JewotCSAgcyArPSBzaXplb2YgImZsb2F0IiAtIDE7Ci0JICB0eXBlID0gJ2YnOwotCSAgZmllbGRsaW1pdCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImV4dGVuZCIsIHNpemVvZiAiZXh0ZW5kIiAtIDEpID09IDApCi0JewotCSAgcyArPSBzaXplb2YgImV4dGVuZCIgLSAxOwotCSAgdHlwZSA9ICd4JzsKLQkgIGZpZWxkbGltaXQgPSA0OwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGlzZGlnaXQgKCpzKSkKLQl7Ci0JICBmaWVsZG51bSA9ICpzIC0gJzAnOwotCSAgKytzOwotCX0KLSAgICAgIGlmIChmaWVsZG51bSA+PSBmaWVsZGxpbWl0KQotCXJldHVybjsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCpzICE9ICcoJykKLQlyZXR1cm47Ci0gICAgICArK3M7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIHMgPSBhdG9mX2llZWUgKHMsIHR5cGUsIGZsb2F0YnVmKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcmV0dXJuOwotICAgICAgcyA9IHM7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqcyAhPSAnKScpCi0JcmV0dXJuOwotICAgICAgKytzOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OyAKLSAgICAgIGV4cHJlc3Npb25QLT5YX3Vuc2lnbmVkID0gMTsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAoKGZsb2F0YnVmW2ZpZWxkbnVtICogMl0KLQkJCQkgICAgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCQkJCSAgICsgZmxvYXRidWZbZmllbGRudW0gKiAyICsgMV0pOwotICAgIH0KLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgMjkwMDAsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uLAotICAgd2hpY2ggd2UgaGF2ZSBzZXQgdXAgYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpeHVwIHRvby4gICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBlbmQgb2YgdGMtYTI5ay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWEyOWsuaCBiL2dhcy9jb25maWcvdGMtYTI5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjBmNjA1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogdGMtYTI5ay5oIC0tIEFzc2VtYmxlIGZvciB0aGUgQU1EIDI5MDAwLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfQTI5SwotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgTEVYX0RPTExBUiAxCi0KLSNkZWZpbmUgdGNfdW5yZWNvZ25pemVkX2xpbmUoYykgYTI5a191bnJlY29nbml6ZWRfbGluZSAoYykKLWV4dGVybiBpbnQgYTI5a191bnJlY29nbml6ZWRfbGluZSBQQVJBTVMgKChpbnQpKTsKLQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCTsJLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQk7CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQk7CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKQk7CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAxMDEKLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4X3B0cikgdGNfY29mZl9maXgycnR5cGUoZml4X3B0cikKLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfYTI5awotI2RlZmluZSBDT0ZGX01BR0lDIFNJUEZCT01BR0lDCi0vKiBTaG91bGQgdGhlIHJlbG9jIGJlIG91dHB1dCA/Ci0Jb24gdGhlIDI5aywgdGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhlcmUgaXMgYSBzeW1ib2wgYXR0YXRjaGVkLgotCW9uIHRoZSBoOCwgdGhpcyBpcyBhbGx3YXlzIHRydWUsIHNpbmNlIG5vIGZpeHVwIGlzIGRvbmUKLSovCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICh4LT5meF9hZGRzeSkKLSNkZWZpbmUgVENfQ09OU19SRUxPQyBSRUxPQ18zMgotCi0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyVwotI2RlZmluZSByZWxvY190eXBlIGludAotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotCi0jZGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMKLQotLyogZW5kIG9mIHRjLWEyOWsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jIGIvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQzMmRjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NzUgKzAsMCBAQAotLyogdGMtYWxwaGEuYyAtIFByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlIGZvciB0aGUgREVDIEFscGhhIEFYUCBDUFUuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHksIDE5OTMuCi0gICBXcml0dGVuIGJ5IEFsZXNzYW5kcm8gRm9yaW4sIGJhc2VkIG9uIGVhcmxpZXIgZ2FzLTEuMzggdGFyZ2V0IENQVSBmaWxlcy4KLSAgIE1vZGlmaWVkIGJ5IEtlbiBSYWVidXJuIGZvciBnYXMtMi54IGFuZCBFQ09GRiBzdXBwb3J0LgotICAgTW9kaWZpZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gZm9yIEVMRiBzdXBwb3J0LgotICAgTW9kaWZpZWQgYnkgS2xhdXMgSyJhbXBmIGZvciBFVkFYIChPcGVuVk1TL0FscGhhKSBzdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogTWFjaCBPcGVyYXRpbmcgU3lzdGVtCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlCi0gKiBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucwotICogdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUwotICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgotICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCi0gKgotICogIFNvZnR3YXJlIERpc3RyaWJ1dGlvbiBDb29yZGluYXRvciAgb3IgIFNvZnR3YXJlLkRpc3RyaWJ1dGlvbkBDUy5DTVUuRURVCi0gKiAgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UKLSAqICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogIFBpdHRzYnVyZ2ggUEEgMTUyMTMtMzg5MAotICoKLSAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgdGhlCi0gKiByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvYWxwaGEuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotDAotLyogTG9jYWwgdHlwZXMgKi8KLQotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgMgotI2RlZmluZSBNQVhfSU5TTl9BUkdTIDUKLQotc3RydWN0IGFscGhhX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotc3RydWN0IGFscGhhX2luc24KLXsKLSAgdW5zaWduZWQgaW5zbjsKLSAgaW50IG5maXh1cHM7Ci0gIHN0cnVjdCBhbHBoYV9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKLX07Ci0KLWVudW0gYWxwaGFfbWFjcm9fYXJnCi17Ci0gIE1BQ1JPX0VPQSA9IDEsIE1BQ1JPX0lSLCBNQUNST19QSVIsIE1BQ1JPX0NQSVIsIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQCi19OwotCi1zdHJ1Y3QgYWxwaGFfbWFjcm8KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdm9pZCAoKmVtaXQpIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci0gIGNvbnN0IFBUUiBhcmc7Ci0gIGVudW0gYWxwaGFfbWFjcm9fYXJnIGFyZ3NldHNbMTZdOwotfTsKLQotLyogVHdvIGV4dHJhIHN5bWJvbHMgd2Ugd2FudCB0byBzZWUgaW4gb3VyIGlucHV0LiAgVGhpcyBpcyBhIGJsYXRlbnQKLSAgIG1pc3VzZSBvZiB0aGUgZXhwcmVzc2lvblMuWF9vcCBmaWVsZC4gICovCi0KLSNkZWZpbmUgT19wcmVnaXN0ZXIgICgob3BlcmF0b3JUKSAoT19tYXgrMSkpIC8qIE9fcmVnaXN0ZXIsIGluIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIE9fY3ByZWdpc3RlciAoKG9wZXJhdG9yVCkgKE9fcHJlZ2lzdGVyKzEpKSAvKiArIGEgbGVhZGluZyBjb21tYSAqLwotI2RlZmluZSBPX2FscGhhX21heCAgKChvcGVyYXRvclQpIChPX2NwcmVnaXN0ZXIrMSkpCi0KLS8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZyB0aGUgdHlwZSBhbmQgbnVtYmVyIG9mIGVuY29kZWQgcmVnaXN0ZXIgdG9rZW5zICovCi0KLSNkZWZpbmUgaXNfaXJfbnVtKHgpCQkoKCh4KSAmIDMyKSA9PSAwKQotI2RlZmluZSBpc19mcHJfbnVtKHgpCQkoKCh4KSAmIDMyKSAhPSAwKQotI2RlZmluZSByZWdubyh4KQkJKCh4KSAmIDMxKQotCi0vKiBTb21ldGhpbmcgb2RkIGluaGVyaXRlZCBmcm9tIHRoZSBvbGQgYXNzZW1ibGVyICovCi0KLSNkZWZpbmUgbm90ZV9ncHJlZyhSKQkJKGFscGhhX2dwcm1hc2sgfD0gKDEgPDwgKFIpKSkKLSNkZWZpbmUgbm90ZV9mcHJlZyhSKQkJKGFscGhhX2Zwcm1hc2sgfD0gKDEgPDwgKFIpKSkKLQotLyogUHJlZGljYXRlcyBmb3IgMTYtIGFuZCAzMi1iaXQgcmFuZ2VzICovCi0vKiBYWFg6IFRoZSBub24tc2hpZnQgdmVyc2lvbiBhcHBlYXJzIHRvIHRyaWdnZXIgYSBjb21waWxlciBidWcgd2hlbgotICAgY3Jvc3MtYXNzZW1ibGluZyBmcm9tIHg4NiB3LyBnY2MgMi43LjIuICAqLwotCi0jaWYgMQotI2RlZmluZSByYW5nZV9zaWduZWRfMTYoeCkgXAotCSgoKG9mZnNldFQpKHgpID4+IDE1KSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMTUpID09IC0xKQotI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkgXAotCSgoKG9mZnNldFQpKHgpID4+IDMxKSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMzEpID09IC0xKQotI2Vsc2UKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzE2KHgpCSgob2Zmc2V0VCkoeCkgPj0gLShvZmZzZXRUKTB4ODAwMCAmJglcCi0JCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGKQotI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkJKChvZmZzZXRUKSh4KSA+PSAtKG9mZnNldFQpMHg4MDAwMDAwMCAmJiBcCi0JCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGRkZGRikKLSNlbmRpZgotCi0vKiBNYWNyb3MgZm9yIHNpZ24gZXh0ZW5kaW5nIGZyb20gMTYtIGFuZCAzMi1iaXRzLiAgKi8KLS8qIFhYWDogVGhlIGNhc3QgbWFjcm9zIHdpbGwgd29yayBvbiBhbGwgdGhlIHN5c3RlbXMgdGhhdCBJIGNhcmUgYWJvdXQsCi0gICBidXQgcmVhbGx5IGEgcHJlZGljYXRlIHNob3VsZCBiZSBmb3VuZCB0byB1c2UgdGhlIG5vbi1jYXN0IGZvcm1zLiAgKi8KLQotI2lmIDEKLSNkZWZpbmUgc2lnbl9leHRlbmRfMTYoeCkJKChzaG9ydCkoeCkpCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzMyKHgpCSgoaW50KSh4KSkKLSNlbHNlCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzE2KHgpCSgob2Zmc2V0VCkoKCh4KSAmIDB4RkZGRikgXiAweDgwMDApIC0gMHg4MDAwKQotI2RlZmluZSBzaWduX2V4dGVuZF8zMih4KQkoKG9mZnNldFQpKCgoeCkgJiAweEZGRkZGRkZGKSBcCi0JCQkJCSAgIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotI2VuZGlmCi0KLS8qIE1hY3JvcyB0byBidWlsZCB0b2tlbnMgKi8KLQotI2RlZmluZSBzZXRfdG9rX3JlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19yZWdpc3RlciwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfcHJlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19wcmVnaXN0ZXIsCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfY3ByZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fY3ByZWdpc3RlciwJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSkKLSNkZWZpbmUgc2V0X3Rva19mcmVnKHQsIHIpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKLQkJCQkgKHQpLlhfb3AgPSBPX3JlZ2lzdGVyLAkJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSszMikKLSNkZWZpbmUgc2V0X3Rva19zeW0odCwgcywgYSkJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fc3ltYm9sLAkJCVwKLQkJCQkgKHQpLlhfYWRkX3N5bWJvbCA9IChzKSwJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChhKSkKLSNkZWZpbmUgc2V0X3Rva19jb25zdCh0LCBuKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19jb25zdGFudCwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAobikpCi0KLQwKLS8qIFByb3RvdHlwZXMgZm9yIGFsbCBsb2NhbCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCB0b2tlbml6ZV9hcmd1bWVudHMgUEFSQU1TICgoY2hhciAqLCBleHByZXNzaW9uUyAqLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpmaW5kX29wY29kZV9tYXRjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqLCBpbnQgKikpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqZmluZF9tYWNyb19tYXRjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKiwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfb3BlcmFuZAotICBQQVJBTVMgKCh1bnNpZ25lZCwgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKiwgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgYXNzZW1ibGVfaW5zbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwKLQkgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2luc24gUEFSQU1TICgoc3RydWN0IGFscGhhX2luc24gKikpOwotc3RhdGljIHZvaWQgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24KLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIHN0cnVjdCBhbHBoYV9pbnNuICopKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX3Rva2VucwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQgbG9hZF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGludCwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICosIGV4cHJlc3Npb25TICopKTsKLQotc3RhdGljIHZvaWQgZW1pdF9sZGdwIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2RpdmlzaW9uIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkYSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZGFoIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2lyX2xvYWQgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbG9hZHN0b3JlIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2pzcmptcCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbGRYdSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF91bGRYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VsZFh1IFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkaWwgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc3RYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VzdFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc2V4dFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfcmV0amNyIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkIHNfYWxwaGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc19hbHBoYV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9yZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHZvaWQgc19hbHBoYV9zZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZW50IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9lbmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX21hc2sgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2ZyYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9sb2d1ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfY29mZl93cmFwcGVyIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgc19hbHBoYV9ncHJlbDMyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2Jhc2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc3BhY2UgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWdUICosIHN5bWJvbFMgKiopKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc2VsZWN0X2dwX3ZhbHVlIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgYWxwaGFfYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIHN5bWJvbFMgKiwgaW50KSk7Ci0KLQwKLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbAotICAgdGFyZ2V0cy4gICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZwotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LAotICAgYXMgaW4gMGQxLjAuICAqLwotI2lmIDAKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotI2Vsc2UKLS8qIFhYWDogRG8gYWxsIG9mIHRoZXNlIHJlYWxseSBnZXQgdXNlZCBvbiB0aGUgYWxwaGE/PyAgKi8KLWNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VWQVgKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJGbTpnKzFoOkhHOiI7Ci0jZWxzZQotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkZtOmdHOiI7Ci0jZW5kaWYKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fMzJBRERSIChPUFRJT05fTURfQkFTRSkKLSAgeyAiMzJhZGRyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl8zMkFERFIgfSwKLSNkZWZpbmUgT1BUSU9OX1JFTEFYIChPUFRJT05fMzJBRERSKzEpCi0gIHsgInJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWCB9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OX01ERUJVRyAoT1BUSU9OX1JFTEFYKzEpCi0jZGVmaW5lIE9QVElPTl9OT19NREVCVUcgKE9QVElPTl9NREVCVUcrMSkKLSAgeyAibWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NREVCVUcgfSwKLSAgeyAibm8tbWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NREVCVUcgfSwKLSNlbmRpZgotICB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwIH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotDAotI2lmZGVmIE9CSl9FVkFYCi0jZGVmaW5lIEFYUF9SRUdfUjAgICAgIDAKLSNkZWZpbmUgQVhQX1JFR19SMTYgICAgMTYKLSNkZWZpbmUgQVhQX1JFR19SMTcgICAgMTcKLSN1bmRlZiBBWFBfUkVHX1Q5Ci0jZGVmaW5lIEFYUF9SRUdfVDkgICAgIDIyCi0jdW5kZWYgQVhQX1JFR19UMTAKLSNkZWZpbmUgQVhQX1JFR19UMTAgICAgMjMKLSN1bmRlZiBBWFBfUkVHX1QxMQotI2RlZmluZSBBWFBfUkVHX1QxMSAgICAyNAotI3VuZGVmIEFYUF9SRUdfVDEyCi0jZGVmaW5lIEFYUF9SRUdfVDEyICAgIDI1Ci0jZGVmaW5lIEFYUF9SRUdfQUkgICAgIDI1Ci0jdW5kZWYgQVhQX1JFR19GUAotI2RlZmluZSBBWFBfUkVHX0ZQICAgICAyOQotCi0jdW5kZWYgQVhQX1JFR19HUAotI2RlZmluZSBBWFBfUkVHX0dQIEFYUF9SRUdfUFYKLSNlbmRpZiAvKiBPQkpfRVZBWCAgKi8KLQotLyogVGhlIGNwdSBmb3Igd2hpY2ggd2UgYXJlIGdlbmVyYXRpbmcgY29kZSAqLwotc3RhdGljIHVuc2lnbmVkIGFscGhhX3RhcmdldCA9IEFYUF9PUENPREVfQkFTRTsKLXN0YXRpYyBjb25zdCBjaGFyICphbHBoYV90YXJnZXRfbmFtZSA9ICI8YWxsPiI7Ci0KLS8qIFRoZSBoYXNoIHRhYmxlIG9mIGluc3RydWN0aW9uIG9wY29kZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphbHBoYV9vcGNvZGVfaGFzaDsKLQotLyogVGhlIGhhc2ggdGFibGUgb2YgbWFjcm8gb3Bjb2RlcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFscGhhX21hY3JvX2hhc2g7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLS8qIFRoZSAkZ3AgcmVsb2NhdGlvbiBzeW1ib2wgKi8KLXN0YXRpYyBzeW1ib2xTICphbHBoYV9ncF9zeW1ib2w7Ci0KLS8qIFhYWDogd2hhdCBpcyB0aGlzLCBhbmQgd2h5IGlzIGl0IGV4cG9ydGVkPyAqLwotdmFsdWVUIGFscGhhX2dwX3ZhbHVlOwotI2VuZGlmCi0KLS8qIFRoZSBjdXJyZW50ICRncCByZWdpc3RlciAqLwotc3RhdGljIGludCBhbHBoYV9ncF9yZWdpc3RlciA9IEFYUF9SRUdfR1A7Ci0KLS8qIEEgdGFibGUgb2YgdGhlIHJlZ2lzdGVyIHN5bWJvbHMgKi8KLXN0YXRpYyBzeW1ib2xTICphbHBoYV9yZWdpc3Rlcl90YWJsZVs2NF07Ci0KLS8qIENvbnN0YW50IHNlY3Rpb25zLCBvciBzZWN0aW9ucyBvZiBjb25zdGFudHMgKi8KLSNpZmRlZiBPQkpfRUNPRkYKLXN0YXRpYyBzZWdUIGFscGhhX2xpdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIGFscGhhX2xpdDRfc2VjdGlvbjsKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi1zdGF0aWMgc2VnVCBhbHBoYV9saW5rX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBhbHBoYV9jdG9yc19zZWN0aW9uOwotc3RhdGljIHNlZ1QgYWxwaGFfZHRvcnNfc2VjdGlvbjsKLSNlbmRpZgotc3RhdGljIHNlZ1QgYWxwaGFfbGl0OF9zZWN0aW9uOwotCi0vKiBTeW1ib2xzIHJlZmVycmluZyB0byBzYWlkIHNlY3Rpb25zLiAqLwotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdGFfc3ltYm9sOwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdDRfc3ltYm9sOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9saW5rX3N5bWJvbDsKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9jdG9yc19zeW1ib2w7Ci1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfZHRvcnNfc3ltYm9sOwotI2VuZGlmCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGl0OF9zeW1ib2w7Ci0KLS8qIExpdGVyYWwgZm9yIC5saXRYKzB4ODAwMCB3aXRoaW4gLmxpdGEgKi8KLSNpZmRlZiBPQkpfRUNPRkYKLXN0YXRpYyBvZmZzZXRUIGFscGhhX2xpdDRfbGl0ZXJhbDsKLXN0YXRpYyBvZmZzZXRUIGFscGhhX2xpdDhfbGl0ZXJhbDsKLSNlbmRpZgotCi0vKiBUaGUgYWN0aXZlIC5lbnQgc3ltYm9sLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfY3VyX2VudF9zeW07Ci0jZW5kaWYKLQotLyogSXMgdGhlIGFzc2VtYmxlciBub3QgYWxsb3dlZCB0byB1c2UgJGF0PyAqLwotc3RhdGljIGludCBhbHBoYV9ub2F0X29uID0gMDsKLQotLyogQXJlIG1hY3JvcyBlbmFibGVkPyAqLwotc3RhdGljIGludCBhbHBoYV9tYWNyb3Nfb24gPSAxOwotCi0vKiBBcmUgZmxvYXRzIGRpc2FibGVkPyAqLwotc3RhdGljIGludCBhbHBoYV9ub2Zsb2F0c19vbiA9IDA7Ci0KLS8qIEFyZSBhZGRyZXNzZXMgMzIgYml0PyAqLwotc3RhdGljIGludCBhbHBoYV9hZGRyMzJfb24gPSAwOwotCi0vKiBTeW1ib2wgbGFiZWxsaW5nIHRoZSBjdXJyZW50IGluc24uICBXaGVuIHRoZSBBbHBoYSBnYXMgc2VlcwotICAgICBmb286Ci0gICAgICAgLnF1YWQgMAotICAgYW5kIHRoZSBzZWN0aW9uIGhhcHBlbnMgdG8gbm90IGJlIG9uIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnksIGl0Ci0gICB3aWxsIGFsaWduIGJvdGggdGhlIHN5bWJvbCBhbmQgdGhlIC5xdWFkIHRvIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnkuICAqLwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2luc25fbGFiZWw7Ci0KLS8qIFdoZXRoZXIgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgYWxpZ24gZGF0YSBnZW5lcmF0aW9uIHBzZXVkby1vcHMuCi0gICAuYWxpZ24gMCB3aWxsIHR1cm4gdGhpcyBvZmYuICAqLwotc3RhdGljIGludCBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLQotLyogVGhlIGtub3duIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotc3RhdGljIGludCBhbHBoYV9jdXJyZW50X2FsaWduOwotCi0vKiBUaGVzZSBhcmUgZXhwb3J0ZWQgdG8gRUNPRkYgY29kZS4gICovCi11bnNpZ25lZCBsb25nIGFscGhhX2dwcm1hc2ssIGFscGhhX2Zwcm1hc2s7Ci0KLS8qIFdoZXRoZXIgdGhlIGRlYnVnZ2luZyBvcHRpb24gd2FzIHNlZW4uICAqLwotc3RhdGljIGludCBhbHBoYV9kZWJ1ZzsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFdoZXRoZXIgd2UgYXJlIGVtaXR0aW5nIGFuIG1kZWJ1ZyBzZWN0aW9uLiAgKi8KLWludCBhbHBoYV9mbGFnX21kZWJ1ZyA9IDE7Ci0jZW5kaWYKLQotLyogRG9uJ3QgZnVsbHkgcmVzb2x2ZSByZWxvY2F0aW9ucywgYWxsb3dpbmcgY29kZSBtb3ZlbWVudCBpbiB0aGUgbGlua2VyLiAgKi8KLXN0YXRpYyBpbnQgYWxwaGFfZmxhZ19yZWxheDsKLQotLyogV2hhdCB2YWx1ZSB0byBnaXZlIHRvIGJmZF9zZXRfZ3Bfc2l6ZS4gICovCi1zdGF0aWMgaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKLQotI2lmZGVmIE9CSl9FVkFYCi0vKiBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgcHJvY2VkdXJlIGhlcmUuICAqLwotc3RhdGljIHN0cnVjdCB7Ci0gIHN5bWJvbFMgKnN5bWJvbDsJLyogcHJvYyBwZGVzYyBzeW1ib2wgKi8KLSAgaW50IHBkc2NraW5kOwotICBpbnQgZnJhbWVyZWc7CQkvKiByZWdpc3RlciBmb3IgZnJhbWUgcG9pbnRlciAqLwotICBpbnQgZnJhbWVzaXplOwkvKiBzaXplIG9mIGZyYW1lICovCi0gIGludCByc2Ffb2Zmc2V0OwotICBpbnQgcmFfc2F2ZTsKLSAgaW50IGZwX3NhdmU7Ci0gIGxvbmcgaW1hc2s7Ci0gIGxvbmcgZm1hc2s7Ci0gIGludCB0eXBlOwotICBpbnQgcHJvbG9ndWU7Ci19IGFscGhhX2V2YXhfcHJvYzsKLQotc3RhdGljIGludCBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDA7CQkvKiAtKyAqLwotc3RhdGljIGludCBhbHBoYV9mbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMgPSAwOwkJLyogLUggKi8KLQotLyogSWYgdGhlIC0rIHN3aXRjaCBpcyBnaXZlbiwgdGhlbiBhIGhhc2ggaXMgYXBwZW5kZWQgdG8gYW55IG5hbWUgdGhhdCBpcwotICogbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVycywgZWxzZSBsb25nZXIgc3ltYm9sIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCi0gKi8KLQotI2VuZGlmCi0MCi0vKiBBIHRhYmxlIG9mIENQVSBuYW1lcyBhbmQgb3Bjb2RlIHNldHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdV90eXBlCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGZsYWdzOwotfSBjcHVfdHlwZXNbXSA9Ci17Ci0gIC8qIEFkIGhvYyBjb252ZW50aW9uOiBjcHUgbnVtYmVyIGdldHMgcGFsY29kZSwgcHJvY2VzcyBjb2RlIGRvZXNuJ3QuCi0gICAgIFRoaXMgc3VwcG9ydHMgdXNhZ2UgdW5kZXIgRFUgNC4wYiB0aGF0IGRvZXMgIi5hcmNoIGV2NCIsIGFuZCAKLSAgICAgdXNhZ2UgaW4gTUlMTyB0aGF0IGRvZXMgLW0yMTA2NC4gIFByb2JhYmx5IHNvbWV0aGluZyBtb3JlCi0gICAgIHNwZWNpZmljIGxpa2UgLW0yMTA2NC1wYWwgc2hvdWxkIGJlIHVzZWQsIGJ1dCBvaCB3ZWxsLiAgKi8KLQotICB7ICIyMTA2NCIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAotICB7ICIyMTA2NGEiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjYiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjgiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjExNjQiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjUgfSwKLSAgeyAiMjExNjRhIiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYIH0sCi0gIHsgIjIxMTY0cGMiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYCi0JCXxBWFBfT1BDT0RFX01BWCkgfSwKLSAgeyAiMjEyNjQiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY2fEFYUF9PUENPREVfQldYCi0JICAgICAgfEFYUF9PUENPREVfTUFYfEFYUF9PUENPREVfQ0lYKSB9LAotCi0gIHsgImV2NCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImxjYTQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImV2NSIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYIH0sCi0gIHsgInBjYTU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYfEFYUF9PUENPREVfTUFYIH0sCi0gIHsgImV2NiIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0JXWHxBWFBfT1BDT0RFX01BWHxBWFBfT1BDT0RFX0NJWCB9LAotCi0gIHsgImFsbCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7IDAgfQotfTsKLQotLyogVGhlIG1hY3JvIHRhYmxlICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gYWxwaGFfbWFjcm9zW10gPSB7Ci0vKiBMb2FkL1N0b3JlIG1hY3JvcyAqLwotICB7ICJsZGEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRhaCIsCWVtaXRfbGRhaCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRsIiwJZW1pdF9pcl9sb2FkLCAibGRsIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRsX2wiLAllbWl0X2lyX2xvYWQsICJsZGxfbCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcSIsCWVtaXRfaXJfbG9hZCwgImxkcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcV9sIiwJZW1pdF9pcl9sb2FkLCAibGRxX2wiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHFfdSIsCWVtaXRfaXJfbG9hZCwgImxkcV91IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRmIiwJZW1pdF9sb2Fkc3RvcmUsICJsZGYiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkZyIsCWVtaXRfbG9hZHN0b3JlLCAibGRnIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHMiLAllbWl0X2xvYWRzdG9yZSwgImxkcyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGR0IiwJZW1pdF9sb2Fkc3RvcmUsICJsZHQiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRiIiwJZW1pdF9sZFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRidSIsCWVtaXRfbGRYdSwgKFBUUikwLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHciLAllbWl0X2xkWCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHd1IiwJZW1pdF9sZFh1LCAoUFRSKTEsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAidWxkdyIsCWVtaXRfdWxkWCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGR3dSIsCWVtaXRfdWxkWHUsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkbCIsCWVtaXRfdWxkWCwgKFBUUikyLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGRsdSIsCWVtaXRfdWxkWHUsIChQVFIpMiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkcSIsCWVtaXRfdWxkWHUsIChQVFIpMywKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLQotICB7ICJsZGdwIiwJZW1pdF9sZGdwLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EgfSB9LAotCi0gIHsgImxkaSIsCWVtaXRfbGRhLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpbCIsCWVtaXRfbGRpbCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaXEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jaWYgMAotICB7ICJsZGlmIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpZCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaWciCWVtaXRfbGRpcSwgTlVMTCwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGlzIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpdCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jZW5kaWYKLQotICB7ICJzdGwiLAllbWl0X2xvYWRzdG9yZSwgInN0bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0bF9jIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGxfYyIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0cSIsCWVtaXRfbG9hZHN0b3JlLCAic3RxIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX2MiLAllbWl0X2xvYWRzdG9yZSwgInN0cV9jIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX3UiLAllbWl0X2xvYWRzdG9yZSwgInN0cV91IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RmIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGYiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0ZyIsCWVtaXRfbG9hZHN0b3JlLCAic3RnIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJzdHMiLAllbWl0X2xvYWRzdG9yZSwgInN0cyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3R0IiwJZW1pdF9sb2Fkc3RvcmUsICJzdHQiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAic3RiIiwJZW1pdF9zdFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3R3IiwJZW1pdF9zdFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidXN0dyIsCWVtaXRfdXN0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1c3RsIiwJZW1pdF91c3RYLCAoUFRSKTIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdHEiLAllbWl0X3VzdFgsIChQVFIpMywKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLQotLyogQXJpdGhtZXRpYyBtYWNyb3MgKi8KLSNpZiAwCi0gIHsgImFic2wiCWVtaXRfYWJzbCwgMSwgeyBJUiB9IH0sCi0gIHsgImFic2wiCWVtaXRfYWJzbCwgMiwgeyBJUiwgSVIgfSB9LAotICB7ICJhYnNsIgllbWl0X2Fic2wsIDIsIHsgRVhQLCBJUiB9IH0sCi0gIHsgImFic3EiCWVtaXRfYWJzcSwgMSwgeyBJUiB9IH0sCi0gIHsgImFic3EiCWVtaXRfYWJzcSwgMiwgeyBJUiwgSVIgfSB9LAotICB7ICJhYnNxIgllbWl0X2Fic3EsIDIsIHsgRVhQLCBJUiB9IH0sCi0jZW5kaWYKLQotICB7ICJzZXh0YiIsCWVtaXRfc2V4dFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgInNleHR3IiwJZW1pdF9zZXh0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BICovIH0gfSwKLQotICB7ICJkaXZsIiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJkaXZsdSIsCWVtaXRfZGl2aXNpb24sICJfX2Rpdmx1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgImRpdnEiLAllbWl0X2RpdmlzaW9uLCAiX19kaXZxIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgImRpdnF1IiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2cXUiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtbCIsCWVtaXRfZGl2aXNpb24sICJfX3JlbWwiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtbHUiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1sdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJyZW1xIiwJZW1pdF9kaXZpc2lvbiwgIl9fcmVtcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJyZW1xdSIsCWVtaXRfZGl2aXNpb24sICJfX3JlbXF1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0KLSAgeyAianNyIiwJZW1pdF9qc3JqbXAsICJqc3IiLAotICAgIHsgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJqbXAiLAllbWl0X2pzcmptcCwgImptcCIsCi0gICAgeyBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInJldCIsCWVtaXRfcmV0amNyLCAicmV0IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImpjciIsCWVtaXRfcmV0amNyLCAiamNyIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImpzcl9jb3JvdXRpbmUiLAllbWl0X3JldGpjciwgImpjciIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FT0EgfSB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBhbHBoYV9udW1fbWFjcm9zCi0gID0gc2l6ZW9mKGFscGhhX21hY3JvcykgLyBzaXplb2YoKmFscGhhX21hY3Jvcyk7Ci0MCi0vKiBQdWJsaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2V0cwotICAgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwKLSAgIG5lZWQsIHRoYXQgY2FuIGJlIGRldGVybWluZWQgYmVmb3JlIGFyZ3VtZW50cyBhcmUgcGFyc2VkLiAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgWF9vcCBmaWVsZCBpcyB3aWRlIGVub3VnaC4gICovCi0gIHsKLSAgICBleHByZXNzaW9uUyBlOwotICAgIGUuWF9vcCA9IE9fYWxwaGFfbWF4OwotICAgIGFzc2VydCAoZS5YX29wID09IE9fYWxwaGFfbWF4KTsKLSAgfQotCi0gIC8qIENyZWF0ZSB0aGUgb3Bjb2RlIGhhc2ggdGFibGUgKi8KLQotICBhbHBoYV9vcGNvZGVfaGFzaCA9IGhhc2hfbmV3ICgpOwotICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFfbnVtX29wY29kZXM7ICkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lLCAqcmV0dmFsLCAqc2xhc2g7Ci0KLSAgICAgIG5hbWUgPSBhbHBoYV9vcGNvZGVzW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG5hbWUsIChQVFIpJmFscGhhX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCkKLQlhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggb3Bjb2RlIGAlcyc6ICVzIiksIG5hbWUsIHJldHZhbCk7Ci0KLSAgICAgIC8qIFNvbWUgb3Bjb2RlcyBpbmNsdWRlIG1vZGlmaWVycyBvZiB2YXJpb3VzIHNvcnRzIHdpdGggYSAiL21vZCIKLQkgc3ludGF4LCBsaWtlIHRoZSBhcmNoaXRlY3R1cmUgbWFudWFsIHN1Z2dlc3RzLiAgSG93ZXZlciwgZm9yCi0JIHVzZSB3aXRoIGdjYyBhdCBsZWFzdCwgd2UgYWxzbyBuZWVkIGFjY2VzcyB0byB0aG9zZSBzYW1lIG9wY29kZXMKLQkgd2l0aG91dCB0aGUgIi8iLiAgKi8KLQotICAgICAgaWYgKChzbGFzaCA9IHN0cmNociAobmFtZSwgJy8nKSkgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpwID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSk7Ci0JICBtZW1jcHkgKHAsIG5hbWUsIHNsYXNoIC0gbmFtZSk7Ci0JICBzdHJjcHkgKHAgKyAoc2xhc2ggLSBuYW1lKSwgc2xhc2ggKyAxKTsKLQotCSAgKHZvaWQpaGFzaF9pbnNlcnQoYWxwaGFfb3Bjb2RlX2hhc2gsIHAsIChQVFIpJmFscGhhX29wY29kZXNbaV0pOwotCSAgLyogSWdub3JlIGZhaWx1cmVzIC0tIHRoZSBvcGNvZGUgdGFibGUgZG9lcyBkdXBsaWNhdGUgc29tZQotCSAgICAgdmFyaWFudHMgaW4gZGlmZmVyZW50IGZvcm1zLCBsaWtlICJod19zdHEiIGFuZCAiaHdfc3QvcSIuICAqLwotCX0KLQotICAgICAgd2hpbGUgKCsraSA8IGFscGhhX251bV9vcGNvZGVzCi0JICAgICAmJiAoYWxwaGFfb3Bjb2Rlc1tpXS5uYW1lID09IG5hbWUKLQkJIHx8ICFzdHJjbXAgKGFscGhhX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpKQotCWNvbnRpbnVlOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIG1hY3JvIGhhc2ggdGFibGUgKi8KLQotICBhbHBoYV9tYWNyb19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhbHBoYV9udW1fbWFjcm9zOyApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSwgKnJldHZhbDsKLQotICAgICAgbmFtZSA9IGFscGhhX21hY3Jvc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKGFscGhhX21hY3JvX2hhc2gsIG5hbWUsIChQVFIpJmFscGhhX21hY3Jvc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsKQotCWFzX2ZhdGFsIChfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBtYWNybyBgJXMnOiAlcyIpLCBuYW1lLCByZXR2YWwpOwotCi0gICAgICB3aGlsZSAoKytpIDwgYWxwaGFfbnVtX21hY3JvcwotCSAgICAgJiYgKGFscGhhX21hY3Jvc1tpXS5uYW1lID09IG5hbWUKLQkJIHx8ICFzdHJjbXAgKGFscGhhX21hY3Jvc1tpXS5uYW1lLCBuYW1lKSkpCi0JY29udGludWU7Ci0gICAgfQotCi0gIC8qIENvbnN0cnVjdCBzeW1ib2xzIGZvciBlYWNoIG9mIHRoZSByZWdpc3RlcnMgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICBjaGFyIG5hbWVbNF07Ci0gICAgICBzcHJpbnRmKG5hbWUsICIkJWQiLCBpKTsKLSAgICAgIGFscGhhX3JlZ2lzdGVyX3RhYmxlW2ldID0gc3ltYm9sX2NyZWF0ZShuYW1lLCByZWdfc2VjdGlvbiwgaSwKLQkJCQkJICAgICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0gIGZvciAoOyBpIDwgNjQ7ICsraSkKLSAgICB7Ci0gICAgICBjaGFyIG5hbWVbNV07Ci0gICAgICBzcHJpbnRmKG5hbWUsICIkZiVkIiwgaS0zMik7Ci0gICAgICBhbHBoYV9yZWdpc3Rlcl90YWJsZVtpXSA9IHN5bWJvbF9jcmVhdGUobmFtZSwgcmVnX3NlY3Rpb24sIGksCi0JCQkJCSAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgc3BlY2lhbCBzeW1ib2xzIGFuZCBzZWN0aW9ucyB3ZSdsbCBiZSB1c2luZyAqLwotCi0gIC8qIFNvIC5zYnNzIHdpbGwgZ2V0IHVzZWQgZm9yIHRpbnkgb2JqZWN0cy4gICovCi0gIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXRhIiwgJmFscGhhX2xpdGFfc2VjdGlvbiwgJmFscGhhX2xpdGFfc3ltYm9sKTsKLQotICAvKiBGb3IgaGFuZGxpbmcgdGhlIEdQLCBjcmVhdGUgYSBzeW1ib2wgdGhhdCB3b24ndCBiZSBvdXRwdXQgaW4gdGhlCi0gICAgIHN5bWJvbCB0YWJsZS4gIFdlJ2xsIGVkaXQgaXQgb3V0IG9mIHJlbG9jcyBsYXRlci4gICovCi0gIGFscGhhX2dwX3N5bWJvbCA9IHN5bWJvbF9jcmVhdGUgKCI8R1AgdmFsdWU+IiwgYWxwaGFfbGl0YV9zZWN0aW9uLCAweDgwMDAsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VWQVgKLSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saW5rIiwgJmFscGhhX2xpbmtfc2VjdGlvbiwgJmFscGhhX2xpbmtfc3ltYm9sKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIHsKLSAgICAgIHNlZ1Qgc2VjID0gc3Vic2VnX25ldygiLm1kZWJ1ZyIsIChzdWJzZWdUKTApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzKHN0ZG91dHB1dCwgc2VjLCBTRUNfSEFTX0NPTlRFTlRTfFNFQ19SRUFET05MWSk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KHN0ZG91dHB1dCwgc2VjLCAzKTsKLSAgICB9Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0gIHN1YnNlZ19zZXQodGV4dF9zZWN0aW9uLCAwKTsKLX0KLQotLyogVGhlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIGluc3RydWN0aW9uIGFzc2VtYmxlci4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciBvcG5hbWVbMzJdOwkJCS8qIGN1cnJlbnQgbWF4aW11bSBpcyAxMyAqLwotICBleHByZXNzaW9uUyB0b2tbTUFYX0lOU05fQVJHU107Ci0gIGludCBudG9rLCBvcG5hbWVsZW4sIHRydW5jbGVuOwotCi0gIC8qIHNwbGl0IG9mZiB0aGUgb3Bjb2RlICovCi0gIG9wbmFtZWxlbiA9IHN0cnNwbiAoc3RyLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfLzQ2OCIpOwotICB0cnVuY2xlbiA9IChvcG5hbWVsZW4gPCBzaXplb2YgKG9wbmFtZSkgLSAxCi0JICAgICAgPyBvcG5hbWVsZW4KLQkgICAgICA6IHNpemVvZiAob3BuYW1lKSAtIDEpOwotICBtZW1jcHkgKG9wbmFtZSwgc3RyLCB0cnVuY2xlbik7Ci0gIG9wbmFtZVt0cnVuY2xlbl0gPSAnXDAnOwotCi0gIC8qIHRva2VuaXplIHRoZSByZXN0IG9mIHRoZSBsaW5lICovCi0gIGlmICgobnRvayA9IHRva2VuaXplX2FyZ3VtZW50cyAoc3RyICsgb3BuYW1lbGVuLCB0b2ssIE1BWF9JTlNOX0FSR1MpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGZpbmlzaCBpdCBvZmYgKi8KLSAgYXNzZW1ibGVfdG9rZW5zIChvcG5hbWUsIHRvaywgbnRvaywgYWxwaGFfbWFjcm9zX29uKTsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uJ3Mgc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgc2l6ZSkKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KHN0ZG91dHB1dCwgc2VnKTsKLSAgdmFsdWVUIG1hc2sgPSAoKHZhbHVlVCkxIDw8IGFsaWduKSAtIDE7Ci0KLSAgcmV0dXJuIChzaXplICsgbWFzaykgJiB+bWFzazsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWV4dGVybiBjaGFyICp2YXhfbWRfYXRvZiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgaW50ICopKTsKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIC8qIFZBWCBmbG9hdHMgKi8KLSAgICBjYXNlICdHJzoKLSAgICAgIC8qIFZBWCBtZF9hdG9mIGRvZXNuJ3QgbGlrZSAiRyIgZm9yIHNvbWUgcmVhc29uLiAgKi8KLSAgICAgIHR5cGUgPSAnZyc7Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICByZXR1cm4gdmF4X21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKTsKLQotICAgICAgLyogSUVFRSBmbG9hdHMgKi8KLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0KLSAgZm9yICh3b3JkUCA9IHdvcmRzICsgcHJlYyAtIDE7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUC0tKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRha2UgY2FyZSBvZiB0aGUgdGFyZ2V0LXNwZWNpZmljIGNvbW1hbmQtbGluZSBvcHRpb25zLiAgKi8KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdGJzoKLSAgICAgIGFscGhhX25vZmxvYXRzX29uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fMzJBRERSOgotICAgICAgYWxwaGFfYWRkcjMyX29uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICBhbHBoYV9kZWJ1ZyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgZ19zd2l0Y2hfdmFsdWUgPSBhdG9pKGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ20nOgotICAgICAgewotCWNvbnN0IHN0cnVjdCBjcHVfdHlwZSAqcDsKLQlmb3IgKHAgPSBjcHVfdHlwZXM7IHAtPm5hbWU7ICsrcCkKLQkgIGlmIChzdHJjbXAoYXJnLCBwLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYWxwaGFfdGFyZ2V0X25hbWUgPSBwLT5uYW1lLCBhbHBoYV90YXJnZXQgPSBwLT5mbGFnczsKLQkgICAgICBnb3RvIGZvdW5kOwotCSAgICB9Ci0JYXNfd2FybihfKCJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciKSwgYXJnKTsKLSAgICAgIGZvdW5kOjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlICcrJzoJCQkvKiBGb3IgZysrLiAgSGFzaCBhbnkgbmFtZSA+IDYzIGNoYXJzIGxvbmcuICovCi0gICAgICBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgkJCS8qIFNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb24gKi8KLSAgICAgIGFscGhhX2ZsYWdfc2hvd19hZnRlcl90cnVuYyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgkJCS8qIGZvciBnbnUtYy92YXggY29tcGF0aWJpbGl0eS4gICovCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICBhbHBoYV9mbGFnX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgT1BUSU9OX01ERUJVRzoKLSAgICAgIGFscGhhX2ZsYWdfbWRlYnVnID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX05PX01ERUJVRzoKLSAgICAgIGFscGhhX2ZsYWdfbWRlYnVnID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0aGF0IHdlIGFjY2VwdC4gICovCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHV0cyhfKCJcCi1BbHBoYSBvcHRpb25zOlxuXAotLTMyYWRkcgkJCXRyZWF0IGFkZHJlc3NlcyBhcyAzMi1iaXQgdmFsdWVzXG5cCi0tRgkJCWxhY2sgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRcblwKLS1tZXY0IHwgLW1ldjQ1IHwgLW1ldjUgfCAtbWV2NTYgfCAtbXBjYTU2IHwgLW1ldjYgfCAtbWFsbFxuXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIEFscGhhIGFyY2hpdGVjdHVyZVxuXAotLW0yMTA2NCB8IC1tMjEwNjYgfCAtbTIxMTY0IHwgLW0yMTE2NGEgfCAtbTIxMTY0cGMgfCAtbTIxMjY0XG5cCi0JCQl0aGVzZSB2YXJpYW50cyBpbmNsdWRlIFBBTGNvZGUgb3Bjb2Rlc1xuIiksCi0Jc3RyZWFtKTsKLSNpZmRlZiBPQkpfRVZBWAotICBmcHV0cyAoXygiXAotVk1TIG9wdGlvbnM6XG5cCi0tKwkJCWhhc2ggZW5jb2RlIChkb24ndCB0cnVuY2F0ZSkgbmFtZXMgbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVyc1xuXAotLUgJCQlzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG4iKSwKLQlzdHJlYW0pOwotI2VuZGlmCi19Ci0KLS8qIERlY2lkZSBmcm9tIHdoYXQgcG9pbnQgYSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvLAotICAgcmVsYXRpdmUgdG8gdGhlIHBjLXJlbGF0aXZlIGZpeHVwLiAgRXIsIHJlbGF0aXZlbHkgc3BlYWtpbmcuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICB2YWx1ZVQgYWRkciA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICAgIHJldHVybiBhZGRyOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGFkZHI7Ci0gICAgfQotfQotCi0vKiBBdHRlbXB0IHRvIHNpbXBsaWZ5IG9yIGV2ZW4gZWxpbWluYXRlIGEgZml4dXAuICBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICBpZ25vcmVkOyBwZXJoYXBzIGl0IHdhcyBvbmNlIG1lYW5pbmdmdWwsIGJ1dCBub3cgaXQgaXMgaGlzdG9yaWNhbC4KLSAgIFRvIGluZGljYXRlIHRoYXQgYSBmaXh1cCBoYXMgYmVlbiBlbGltaW5hdGVkLCBzZXQgZml4UC0+ZnhfZG9uZS4KLQotICAgRm9yIEVMRiwgaGVyZSBpdCBpcyB0aGF0IHdlIHRyYW5zZm9ybSB0aGUgR1BESVNQX0hJMTYgcmVsb2Mgd2UgdXNlZAotICAgaW50ZXJuYWxseSBpbnRvIHRoZSBHUERJU1AgcmVsb2MgdXNlZCBleHRlcm5hbGx5LiAgV2UgaGFkIHRvIGRvCi0gICB0aGlzIHNvIHRoYXQgd2UnZCBoYXZlIHRoZSBHUERJU1BfTE8xNiByZWxvYyBhcyBhIHRhZyB0byBjb21wdXRlCi0gICB0aGUgZGlzdGFuY2UgdG8gdGhlICJsZGEiIGluc3RydWN0aW9uIGZvciBzZXR0aW5nIHRoZSBhZGRlbmQgdG8KLSAgIEdQRElTUC4gICovCi0KLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWx1ZVApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWVQOwotewotICBjaGFyICogY29uc3QgZml4cG9zID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICB2YWx1ZVQgdmFsdWUgPSAqdmFsdWVQOwotICB1bnNpZ25lZCBpbWFnZSwgc2l6ZTsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgICAvKiBUaGUgR1BESVNQIHJlbG9jYXRpb25zIGFyZSBwcm9jZXNzZWQgaW50ZXJuYWxseSB3aXRoIGEgc3ltYm9sCi0JIHJlZmVycmluZyB0byB0aGUgY3VycmVudCBmdW5jdGlvbjsgd2UgbmVlZCB0byBkcm9wIGluIGEgdmFsdWUKLQkgd2hpY2gsIHdoZW4gYWRkZWQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwKLQkgZ2l2ZXMgdGhlIGRlc2lyZWQgR1AuICAqLwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgICAgewotCWZpeFMgKm5leHQgPSBmaXhQLT5meF9uZXh0OwotCWFzc2VydCAobmV4dC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNik7Ci0KLQlmaXhQLT5meF9vZmZzZXQgPSAobmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIG5leHQtPmZ4X3doZXJlCi0JCQkgICAtIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSBmaXhQLT5meF93aGVyZSk7Ci0KLQl2YWx1ZSA9ICh2YWx1ZSAtIHNpZ25fZXh0ZW5kXzE2ICh2YWx1ZSkpID4+IDE2OwotICAgICAgfQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BTFBIQV9HUERJU1A7Ci0jZW5kaWYKLSAgICAgIGdvdG8gZG9fcmVsb2NfZ3A7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICAgIHZhbHVlID0gc2lnbl9leHRlbmRfMTYgKHZhbHVlKTsKLSAgICAgIGZpeFAtPmZ4X29mZnNldCA9IDA7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0jZW5kaWYKLQotICAgIGRvX3JlbG9jX2dwOgotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0gICAgICBzaXplID0gMjsKLSAgICAgIGdvdG8gZG9fcmVsb2NfeHg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotICAgICAgc2l6ZSA9IDQ7Ci0gICAgICBnb3RvIGRvX3JlbG9jX3h4OwotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ182NF9QQ1JFTDsKLSAgICAgIHNpemUgPSA4OwotICAgIGRvX3JlbG9jX3h4OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIHNpemUpOwotCSAgZ290byBkb25lOwotCX0KLSAgICAgIHJldHVybiAxOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIGFzc2VydCAoZml4UC0+Znhfc3Vic3kgPT0gYWxwaGFfZ3Bfc3ltYm9sKTsKLSAgICAgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLSAgICAgIC8qIEZJWE1FOiBpbmhlcml0ZWQgdGhpcyBvYmxpdmlvdXNuZXNzIG9mIGB2YWx1ZScgLS0gd2h5PyAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwb3MsIC1hbHBoYV9ncF92YWx1ZSwgNCk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQkgIGltYWdlID0gKGltYWdlICYgfjB4MUZGRkZGKSB8ICgodmFsdWUgPj4gMikgJiAweDFGRkZGRik7Ci0JICBnb3RvIHdyaXRlX2RvbmU7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQkgIGltYWdlID0gKGltYWdlICYgfjB4M0ZGRikgfCAoKHZhbHVlID4+IDIpICYgMHgzRkZGKTsKLQkgIGdvdG8gd3JpdGVfZG9uZTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIDIpOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgewotCWNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kOwotCi0JaWYgKChpbnQpZml4UC0+Znhfcl90eXBlID49IDApCi0JICBhc19mYXRhbCAoXygidW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeFAtPmZ4X3JfdHlwZSkpOwotCi0JYXNzZXJ0ICgtKGludClmaXhQLT5meF9yX3R5cGUgPCBhbHBoYV9udW1fb3BlcmFuZHMpOwotCW9wZXJhbmQgPSAmYWxwaGFfb3BlcmFuZHNbLShpbnQpZml4UC0+Znhfcl90eXBlXTsKLQotCS8qIFRoZSByZXN0IG9mIHRoZXNlIGZpeHVwcyBvbmx5IGV4aXN0IGludGVybmFsbHkgZHVyaW5nIHN5bWJvbAotCSAgIHJlc29sdXRpb24gYW5kIGhhdmUgbm8gcmVwcmVzZW50YXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLgotCSAgIFRoZXJlZm9yZSB0aGV5IG11c3QgYmUgY29tcGxldGVseSByZXNvbHZlZCBhcyBjb25zdGFudHMuICAqLwotCi0JaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IDAKLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IGFic29sdXRlX3NlY3Rpb24pCi0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJub24tYWJzb2x1dGUgZXhwcmVzc2lvbiBpbiBjb25zdGFudCBmaWVsZCIpKTsKLQotCWltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOwotCWltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIChvZmZzZXRUKXZhbHVlLAotCQkJICAgICAgIGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUpOwotICAgICAgfQotICAgICAgZ290byB3cml0ZV9kb25lOwotICAgIH0KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gMCB8fCBmaXhQLT5meF9wY3JlbCAhPSAwKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgewotICAgICAgYXNfd2Fybl93aGVyZShmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgXygidHlwZSAlZCByZWxvYyBkb25lP1xuIiksIChpbnQpZml4UC0+Znhfcl90eXBlKTsKLSAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLXdyaXRlX2RvbmU6Ci0gIG1kX251bWJlcl90b19jaGFycyhmaXhwb3MsIGltYWdlLCA0KTsKLQotZG9uZToKLSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKgotICogTG9vayBmb3IgYSByZWdpc3RlciBuYW1lIGluIHRoZSBnaXZlbiBzeW1ib2wuCi0gKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmICgqbmFtZSA9PSAnJCcpCi0gICAgewotICAgICAgaW50IGlzX2Zsb2F0ID0gMCwgbnVtOwotCi0gICAgICBzd2l0Y2ggKCorK25hbWUpCi0JewotCWNhc2UgJ2YnOgotCSAgaWYgKG5hbWVbMV0gPT0gJ3AnICYmIG5hbWVbMl0gPT0gJ1wwJykKLQkgICAgcmV0dXJuIGFscGhhX3JlZ2lzdGVyX3RhYmxlW0FYUF9SRUdfRlBdOwotCSAgaXNfZmxvYXQgPSAzMjsKLQkgIC8qIEZBTExUSFJVICovCi0KLQljYXNlICdyJzoKLQkgIGlmICghaXNkaWdpdCgqKytuYW1lKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBGQUxMVEhSVSAqLwotCi0JY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkgIGlmIChuYW1lWzFdID09ICdcMCcpCi0JICAgIG51bSA9IG5hbWVbMF0gLSAnMCc7Ci0JICBlbHNlIGlmIChuYW1lWzBdICE9ICcwJyAmJiBpc2RpZ2l0KG5hbWVbMV0pICYmIG5hbWVbMl0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIG51bSA9IChuYW1lWzBdIC0gJzAnKSAqIDEwICsgbmFtZVsxXSAtICcwJzsKLQkgICAgICBpZiAobnVtID49IDMyKQotCQlicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICBicmVhazsKLQotCSAgaWYgKCFhbHBoYV9ub2F0X29uICYmIG51bSA9PSBBWFBfUkVHX0FUKQotCSAgICBhc193YXJuKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtudW0gKyBpc19mbG9hdF07Ci0KLQljYXNlICdhJzoKLQkgIGlmIChuYW1lWzFdID09ICd0JyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoIWFscGhhX25vYXRfb24pCi0JCWFzX3dhcm4oXygiVXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIikpOwotCSAgICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX0FUXTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdnJzoKLQkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVthbHBoYV9ncF9yZWdpc3Rlcl07Ci0JICBicmVhazsKLQotCWNhc2UgJ3MnOgotCSAgaWYgKG5hbWVbMV0gPT0gJ3AnICYmIG5hbWVbMl0gPT0gJ1wwJykKLQkgICAgcmV0dXJuIGFscGhhX3JlZ2lzdGVyX3RhYmxlW0FYUF9SRUdfU1BdOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLS8qIEBAQCBNYWdpYyBFQ09GRiBiaXRzLiAgKi8KLQotdm9pZAotYWxwaGFfZnJvYl9lY29mZl9kYXRhICgpCi17Ci0gIHNlbGVjdF9ncF92YWx1ZSAoKTsKLSAgLyogJHplcm8gYW5kICRmMzEgYXJlIHJlYWQtb25seSAqLwotICBhbHBoYV9ncHJtYXNrICY9IH4xOwotICBhbHBoYV9mcHJtYXNrICY9IH4xOwotfQotI2VuZGlmCi0KLS8qIEhvb2sgdG8gcmVtZW1iZXIgYSByZWNlbnRseSBkZWZpbmVkIGxhYmVsIHNvIHRoYXQgdGhlIGF1dG8tYWxpZ24KLSAgIGNvZGUgY2FuIGFkanVzdCB0aGUgc3ltYm9sIGFmdGVyIHdlIGtub3cgd2hhdCBhbGlnbm1lbnQgd2lsbCBiZQotICAgcmVxdWlyZWQuICAqLwotCi12b2lkCi1hbHBoYV9kZWZpbmVfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBhbHBoYV9pbnNuX2xhYmVsID0gc3ltOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBtdXN0IGFsd2F5cyBlbWl0IGEgcmVsb2MgZm9yIGEgdHlwZSBhbmQgZmFsc2UgaWYKLSAgIHRoZXJlIGlzIHNvbWUgaG9wZSBvZiByZXNvbHZpbmcgaXQgYSBhc3NlbWJseSB0aW1lLiAgKi8KLQotaW50Ci1hbHBoYV9mb3JjZV9yZWxvY2F0aW9uIChmKQotICAgICBmaXhTICpmOwotewotICBpZiAoYWxwaGFfZmxhZ19yZWxheCkKLSAgICByZXR1cm4gMTsKLQotICBzd2l0Y2ggKGYtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQOgotI2lmZGVmIE9CSl9FQ09GRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw6Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw6Ci0jZW5kaWYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSNpZmRlZiBPQkpfRVZBWAotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0U6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFI6Ci0jZW5kaWYKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoKLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCgoaW50KWYtPmZ4X3JfdHlwZSA8IDAgJiYgLShpbnQpZi0+Znhfcl90eXBlIDwgYWxwaGFfbnVtX29wZXJhbmRzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRydWUgaWYgd2UgY2FuIHBhcnRpYWxseSByZXNvbHZlIGEgcmVsb2NhdGlvbiBub3cuICAqLwotCi1pbnQKLWFscGhhX2ZpeF9hZGp1c3RhYmxlIChmKQotICAgICBmaXhTICpmOwotewotI2lmZGVmIE9CSl9FTEYKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMgKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmLT5meF9hZGRzeSkgfHwgU19JU19XRUFLIChmLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICAvKiBBcmUgdGhlcmUgYW55IHJlbG9jYXRpb24gdHlwZXMgZm9yIHdoaWNoIHdlIG11c3QgZ2VuZXJhdGUgYSByZWxvYwotICAgICBidXQgd2UgY2FuIGFkanVzdCB0aGUgdmFsdWVzIGNvbnRhaW5lZCB3aXRoaW4gaXQ/ICAqLwotICBzd2l0Y2ggKGYtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQOgotICAgICAgcmV0dXJuIDA7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotI2VuZGlmCi0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0ICgoaW50KWYtPmZ4X3JfdHlwZSA8IDAKLQkgICAgICAmJiAtIChpbnQpZi0+Znhfcl90eXBlIDwgYWxwaGFfbnVtX29wZXJhbmRzKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2VuZXJhdGUgdGhlIEJGRCByZWxvYyB0byBiZSBzdHVjayBpbiB0aGUgb2JqZWN0IGZpbGUgZnJvbSB0aGUKLSAgIGZpeHVwIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgYXNzZW1ibGVyLiAgKi8KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlYywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAvKiBNYWtlIHN1cmUgbm9uZSBvZiBvdXIgaW50ZXJuYWwgcmVsb2NhdGlvbnMgbWFrZSBpdCB0aGlzIGZhci4KLSAgICAgVGhleSdkIGJldHRlciBoYXZlIGJlZW4gZnVsbHkgcmVzb2x2ZWQgYnkgdGhpcyBwb2ludC4gICovCi0gIGFzc2VydCAoKGludClmaXhwLT5meF9yX3R5cGUgPiAwKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oImNhbm5vdCByZXByZXNlbnQgYCVzJyByZWxvY2F0aW9uIGluIG9iamVjdCBmaWxlIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCFmaXhwLT5meF9wY3JlbCAhPSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I/IGNhbm5vdCBnZW5lcmF0ZSBgJXMnIHJlbG9jYXRpb24iKSwKLQkJYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotICAgIH0KLSAgYXNzZXJ0ICghZml4cC0+ZnhfcGNyZWwgPT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwpCi0gICAgewotICAgICAgLyogZmFrZSBvdXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gc2lnaCAqLwotICAgICAgcmVsb2MtPmFkZGVuZCA9IC1hbHBoYV9ncF92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyoKLSAgICAgICAqIE9oaGgsIHRoaXMgaXMgdWdseS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgdGhpcyBpcyBhIGxvY2FsIGdsb2JhbAotICAgICAgICogc3ltYm9sLCB0aGUgcmVsb2NhdGlvbiB3aWxsIGVudGlyZWx5IGJlIHBlcmZvcm1lZCBhdCBsaW5rIHRpbWUsIG5vdAotICAgICAgICogYXQgYXNzZW1ibHkgdGltZS4gIGJmZF9wZXJmb3JtX3JlbG9jIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIHNvcnQKLSAgICAgICAqIG9mIHRoaW5nLCBhbmQgYXMgYSByZXN1bHQgd2UgbmVlZCB0byBmYWtlIGl0IG91dCBoZXJlLgotICAgICAgICovCi0gICAgICBpZiAoKFNfSVNfRVhURVJOIChmaXhwLT5meF9hZGRzeSkgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCi0JICAmJiAhU19JU19DT01NT04oZml4cC0+ZnhfYWRkc3kpKQotCXJlbG9jLT5hZGRlbmQgLT0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KS0+dmFsdWU7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBQYXJzZSBhIHJlZ2lzdGVyIG5hbWUgb2ZmIG9mIHRoZSBpbnB1dF9saW5lIGFuZCByZXR1cm4gYSByZWdpc3RlcgotICAgbnVtYmVyLiAgR2V0cyBtZF91bmRlZmluZWRfc3ltYm9sIGFib3ZlIHRvIGRvIHRoZSByZWdpc3RlciBuYW1lCi0gICBtYXRjaGluZyBmb3IgdXMuCi0KLSAgIE9ubHkgY2FsbGVkIGFzIGEgcGFydCBvZiBwcm9jZXNzaW5nIHRoZSBFQ09GRiAuZnJhbWUgZGlyZWN0aXZlLiAgKi8KLQotaW50Ci10Y19nZXRfcmVnaXN0ZXIgKGZyYW1lKQotICAgICBpbnQgZnJhbWU7Ci17Ci0gIGludCBmcmFtZXJlZyA9IEFYUF9SRUdfU1A7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCi0gICAgewotICAgICAgY2hhciAqcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUyAqc3ltID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAocyk7Ci0KLSAgICAgICpzdHJjaHIocywgJ1wwJykgPSBjOwotICAgICAgaWYgKHN5bSAmJiAoZnJhbWVyZWcgPSBTX0dFVF9WQUxVRSAoc3ltKSkgPD0gMzEpCi0JZ290byBmb3VuZDsKLSAgICB9Ci0gIGFzX3dhcm4gKF8oImZyYW1lIHJlZyBleHBlY3RlZCwgdXNpbmcgJCVkLiIpLCBmcmFtZXJlZyk7Ci0KLWZvdW5kOgotICBub3RlX2dwcmVnIChmcmFtZXJlZyk7Ci0gIHJldHVybiBmcmFtZXJlZzsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUgaXMgcHJvY2Vzc2VkLiAgSW4gb3JkZXIgdG8KLSAgIHdvcmsgd2l0aCBnY2Mgd2hlbiB1c2luZyBtaXBzLXRmaWxlLCB3ZSBtdXN0IGtlZXAgYWxsIGxvY2FsIGxhYmVscy4KLSAgIEhvd2V2ZXIsIGluIG90aGVyIGNhc2VzLCB3ZSB3YW50IHRvIGRpc2NhcmQgdGhlbS4gIElmIHdlIHdlcmUKLSAgIGNhbGxlZCB3aXRoIC1nLCBidXQgd2UgZGlkbid0IHNlZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpdCBtYXkKLSAgIG1lYW4gdGhhdCBnY2MgaXMgc211Z2dsaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0aHJvdWdoIHRvCi0gICBtaXBzLXRmaWxlLCBpbiB3aGljaCBjYXNlIHdlIG11c3QgZ2VuZXJhdGUgYWxsIGxvY2FsIGxhYmVscy4gICovCi0KLSNpZmRlZiBPQkpfRUNPRkYKLQotdm9pZAotYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKLXsKLSAgaWYgKGFscGhhX2RlYnVnICE9IDAKLSAgICAgICYmICEgZWNvZmZfZGVidWdnaW5nX3NlZW4pCi0gICAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRUNPRkYgKi8KLQwKLS8qIFBhcnNlIHRoZSBhcmd1bWVudHMgdG8gYW4gb3Bjb2RlLiAgKi8KLQotc3RhdGljIGludAotdG9rZW5pemVfYXJndW1lbnRzIChzdHIsIHRvaywgbnRvaykKLSAgICAgY2hhciAqc3RyOwotICAgICBleHByZXNzaW9uUyB0b2tbXTsKLSAgICAgaW50IG50b2s7Ci17Ci0gIGV4cHJlc3Npb25TICplbmRfdG9rID0gdG9rICsgbnRvazsKLSAgY2hhciAqb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IHNhd19jb21tYSA9IDAsIHNhd19hcmcgPSAwOwotCi0gIG1lbXNldCAodG9rLCAwLCBzaXplb2YgKCp0b2spICogbnRvayk7Ci0KLSAgLyogU2F2ZSBhbmQgcmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgYXJvdW5kIHRoaXMgZnVuY3Rpb24gKi8KLSAgb2xkX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIHdoaWxlICh0b2sgPCBlbmRfdG9rICYmICppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICdcMCc6Ci0JICBnb3RvIGZpbmk7Ci0KLQljYXNlICcsJzoKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgaWYgKHNhd19jb21tYSB8fCAhc2F3X2FyZykKLQkgICAgZ290byBlcnI7Ci0JICBzYXdfY29tbWEgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICcoJzoKLQkgIHsKLQkgICAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0JICAgIC8qIEZpcnN0IHRyeSBmb3IgcGFyZW50aGVzaXplZCByZWdpc3RlciAuLi4gKi8KLQkgICAgZXhwcmVzc2lvbiAodG9rKTsKLQkgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyknICYmIHRvay0+WF9vcCA9PSBPX3JlZ2lzdGVyKQotCSAgICAgIHsKLQkJdG9rLT5YX29wID0gKHNhd19jb21tYSA/IE9fY3ByZWdpc3RlciA6IE9fcHJlZ2lzdGVyKTsKLQkJc2F3X2NvbW1hID0gMDsKLQkJc2F3X2FyZyA9IDE7Ci0JCSsraW5wdXRfbGluZV9wb2ludGVyOwotCQkrK3RvazsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIC8qIC4uLiB0aGVuIGZhbGwgdGhyb3VnaCB0byBwbGFpbiBleHByZXNzaW9uICovCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICB9Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHNhd19hcmcgJiYgIXNhd19jb21tYSkKLQkgICAgZ290byBlcnI7Ci0JICBleHByZXNzaW9uICh0b2spOwotCSAgaWYgKHRvay0+WF9vcCA9PSBPX2lsbGVnYWwgfHwgdG9rLT5YX29wID09IE9fYWJzZW50KQotCSAgICBnb3RvIGVycjsKLQotCSAgc2F3X2NvbW1hID0gMDsKLQkgIHNhd19hcmcgPSAxOwotCSAgKyt0b2s7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi1maW5pOgotICBpZiAoc2F3X2NvbW1hKQotICAgIGdvdG8gZXJyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGRfaW5wdXRfbGluZV9wb2ludGVyOwotICByZXR1cm4gbnRvayAtIChlbmRfdG9rIC0gdG9rKTsKLQotZXJyOgotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGRfaW5wdXRfbGluZV9wb2ludGVyOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIFNlYXJjaCBmb3J3YXJkIHRocm91Z2ggYWxsIHZhcmlhbnRzIG9mIGFuIG9wY29kZSBsb29raW5nIGZvciBhCi0gICBzeW50YXggbWF0Y2guICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqCi1maW5kX29wY29kZV9tYXRjaChmaXJzdF9vcGNvZGUsIHRvaywgcG50b2ssIHBjcHVtYXRjaCkKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqZmlyc3Rfb3Bjb2RlOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgKnBudG9rOwotICAgICBpbnQgKnBjcHVtYXRjaDsKLXsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlID0gZmlyc3Rfb3Bjb2RlOwotICBpbnQgbnRvayA9ICpwbnRvazsKLSAgaW50IGdvdF9jcHVfbWF0Y2ggPSAwOwotCi0gIGRvCi0gICAgewotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpZHg7Ci0gICAgICBpbnQgdG9raWR4ID0gMDsKLQotICAgICAgLyogRG9uJ3QgbWF0Y2ggb3Bjb2RlcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICBpZiAoIShvcGNvZGUtPmZsYWdzICYgYWxwaGFfdGFyZ2V0KSkKLQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQotICAgICAgZ290X2NwdV9tYXRjaCA9IDE7Ci0KLSAgICAgIGZvciAob3BpZHggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpZHg7ICsrb3BpZHgpCi0JewotCSAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSAmYWxwaGFfb3BlcmFuZHNbKm9waWR4XTsKLQotCSAgLyogb25seSB0YWtlIGlucHV0IGZyb20gcmVhbCBvcGVyYW5kcyAqLwotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfRkFLRSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIHdoZW4gd2UgZXhwZWN0IGlucHV0LCBtYWtlIHN1cmUgd2UgaGF2ZSBpdCAqLwotCSAgaWYgKHRva2lkeCA+PSBudG9rKQotCSAgICB7Ci0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX09QVElPTkFMX01BU0spID09IDApCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIG1hdGNoIG9wZXJhbmQgdHlwZSB3aXRoIGV4cHJlc3Npb24gdHlwZSAqLwotCSAgc3dpdGNoIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1RZUEVDSEVDS19NQVNLKQotCSAgICB7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfSVI6Ci0JICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfRlBSOgotCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fcmVnaXN0ZXIKLQkJICB8fCAhaXNfZnByX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9QQVJFTlM6Ci0JICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19wcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOU3xBWFBfT1BFUkFORF9DT01NQToKLQkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX2NwcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQVhQX09QRVJBTkRfUkVMQVRJVkU6Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfU0lHTkVEOgotCSAgICBjYXNlIEFYUF9PUEVSQU5EX1VOU0lHTkVEOgotCSAgICAgIHN3aXRjaCAodG9rW3Rva2lkeF0uWF9vcCkKLQkJewotCQljYXNlIE9faWxsZWdhbDoKLQkJY2FzZSBPX2Fic2VudDoKLQkJY2FzZSBPX3JlZ2lzdGVyOgotCQljYXNlIE9fcHJlZ2lzdGVyOgotCQljYXNlIE9fY3ByZWdpc3RlcjoKLQkJICBnb3RvIG1hdGNoX2ZhaWxlZDsKLQotCQlkZWZhdWx0OgotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIGhhdmUgYmVlbiBmYWtlICovCi0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCSAgKyt0b2tpZHg7Ci0JfQotCi0gICAgICAvKiBwb3NzaWJsZSBtYXRjaCAtLSBkaWQgd2UgdXNlIGFsbCBvZiBvdXIgaW5wdXQ/ICovCi0gICAgICBpZiAodG9raWR4ID09IG50b2spCi0JewotCSAgKnBudG9rID0gbnRvazsKLQkgIHJldHVybiBvcGNvZGU7Ci0JfQotCi0gICAgbWF0Y2hfZmFpbGVkOjsKLSAgICB9Ci0gIHdoaWxlICgrK29wY29kZS1hbHBoYV9vcGNvZGVzIDwgYWxwaGFfbnVtX29wY29kZXMKLQkgJiYgIXN0cmNtcChvcGNvZGUtPm5hbWUsIGZpcnN0X29wY29kZS0+bmFtZSkpOwotCi0gIGlmICgqcGNwdW1hdGNoKQotICAgICAgKnBjcHVtYXRjaCA9IGdvdF9jcHVfbWF0Y2g7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNlYXJjaCBmb3J3YXJkIHRocm91Z2ggYWxsIHZhcmlhbnRzIG9mIGEgbWFjcm8gbG9va2luZyBmb3IgYSBzeW50YXgKLSAgIG1hdGNoLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqCi1maW5kX21hY3JvX21hdGNoKGZpcnN0X21hY3JvLCB0b2ssIHBudG9rKQotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKmZpcnN0X21hY3JvOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgKnBudG9rOwotewotICBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKm1hY3JvID0gZmlyc3RfbWFjcm87Ci0gIGludCBudG9rID0gKnBudG9rOwotCi0gIGRvCi0gICAgewotICAgICAgY29uc3QgZW51bSBhbHBoYV9tYWNyb19hcmcgKmFyZyA9IG1hY3JvLT5hcmdzZXRzOwotICAgICAgaW50IHRva2lkeCA9IDA7Ci0KLSAgICAgIHdoaWxlICgqYXJnKQotCXsKLQkgIHN3aXRjaCAoKmFyZykKLQkgICAgewotCSAgICBjYXNlIE1BQ1JPX0VPQToKLQkgICAgICBpZiAodG9raWR4ID09IG50b2spCi0JCXJldHVybiBtYWNybzsKLQkgICAgICBlbHNlCi0JCXRva2lkeCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBNQUNST19JUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNQUNST19QSVI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19wcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1BQ1JPX0NQSVI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19jcHJlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNQUNST19GUFI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgotCQkgIHx8ICFpc19mcHJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTUFDUk9fRVhQOgotCSAgICAgIGlmICh0b2tpZHggPj0gbnRvaykKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgc3dpdGNoICh0b2tbdG9raWR4XS5YX29wKQotCQl7Ci0JCWNhc2UgT19pbGxlZ2FsOgotCQljYXNlIE9fYWJzZW50OgotCQljYXNlIE9fcmVnaXN0ZXI6Ci0JCWNhc2UgT19wcmVnaXN0ZXI6Ci0JCWNhc2UgT19jcHJlZ2lzdGVyOgotCQkgIGdvdG8gbWF0Y2hfZmFpbGVkOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQotCSAgICBtYXRjaF9mYWlsZWQ6Ci0JICAgICAgd2hpbGUgKCphcmcgIT0gTUFDUk9fRU9BKQotCQkrK2FyZzsKLQkgICAgICB0b2tpZHggPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICArK2FyZzsKLQl9Ci0gICAgfQotICB3aGlsZSAoKyttYWNyby1hbHBoYV9tYWNyb3MgPCBhbHBoYV9udW1fbWFjcm9zCi0JICYmICFzdHJjbXAobWFjcm8tPm5hbWUsIGZpcnN0X21hY3JvLT5uYW1lKSk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9vcGVyYW5kKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMiAmJiAhKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfTk9PVkVSRkxPVykpCi0gICAgewotICAgICAgb2Zmc2V0VCBtaW4sIG1heDsKLQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCXsKLQkgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0oMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgbWluID0gMDsKLQl9Ci0KLSAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQotCXsKLQkgIGNvbnN0IGNoYXIgKmVyciA9Ci0JICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlZCBhbmQgJWQpIik7Ci0JICBjaGFyIGJ1ZltzaXplb2YgKHZhbCkgKiAzICsgMl07Ci0KLQkgIHNwcmludF92YWx1ZShidWYsIHZhbCk7Ci0JICBpZiAoZmlsZSkKLQkgICAgYXNfd2Fybl93aGVyZShmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgZWxzZQotCSAgICBhc193YXJuKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnKQotCWFzX3dhcm4gKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qCi0gKiBUdXJuIGFuIG9wY29kZSBkZXNjcmlwdGlvbiBhbmQgYSBzZXQgb2YgYXJndW1lbnRzIGludG8KLSAqIGFuIGluc3RydWN0aW9uIGFuZCBhIGZpeHVwLgotICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV9pbnNuKG9wY29kZSwgdG9rLCBudG9rLCBpbnNuKQotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYXJnaWR4OwotICB1bnNpZ25lZCBpbWFnZTsKLSAgaW50IHRva2lkeCA9IDA7Ci0KLSAgbWVtc2V0IChpbnNuLCAwLCBzaXplb2YgKCppbnNuKSk7Ci0gIGltYWdlID0gb3Bjb2RlLT5vcGNvZGU7Ci0KLSAgZm9yIChhcmdpZHggPSBvcGNvZGUtPm9wZXJhbmRzOyAqYXJnaWR4OyArK2FyZ2lkeCkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1sqYXJnaWR4XTsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0OwotCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKQotCXsKLQkgIC8qIGZha2Ugb3BlcmFuZHMgdGFrZSBubyB2YWx1ZSBhbmQgZ2VuZXJhdGUgbm8gZml4dXAgKi8KLQkgIGltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIDAsIE5VTEwsIDApOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAodG9raWR4ID49IG50b2spCi0JewotCSAgc3dpdGNoIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX09QVElPTkFMX01BU0spCi0JICAgIHsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNUOgotCSAgICAgIHQgPSAmdG9rWzBdOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0RFRkFVTFRfU0VDT05EOgotCSAgICAgIHQgPSAmdG9rWzFdOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVSTzoKLQkgICAgICB7Ci0JCXN0YXRpYyBjb25zdCBleHByZXNzaW9uUyB6ZXJvX2V4cCA9IHsgMCwgMCwgMCwgT19jb25zdGFudCwgMSB9OwotCQl0ID0gJnplcm9fZXhwOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXQgPSAmdG9rW3Rva2lkeCsrXTsKLQotICAgICAgc3dpdGNoICh0LT5YX29wKQotCXsKLQljYXNlIE9fcmVnaXN0ZXI6Ci0JY2FzZSBPX3ByZWdpc3RlcjoKLQljYXNlIE9fY3ByZWdpc3RlcjoKLQkgIGltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIHJlZ25vKHQtPlhfYWRkX251bWJlciksCi0JCQkJIE5VTEwsIDApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fY29uc3RhbnQ6Ci0JICBpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCB0LT5YX2FkZF9udW1iZXIsIE5VTEwsIDApOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgewotCSAgICBzdHJ1Y3QgYWxwaGFfZml4dXAgKmZpeHVwOwotCi0JICAgIGlmIChpbnNuLT5uZml4dXBzID49IE1BWF9JTlNOX0ZJWFVQUykKLQkgICAgICBhc19mYXRhbChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkgICAgZml4dXAgPSAmaW5zbi0+Zml4dXBzW2luc24tPm5maXh1cHMrK107Ci0KLQkgICAgZml4dXAtPmV4cCA9ICp0OwotCSAgICBmaXh1cC0+cmVsb2MgPSBvcGVyYW5kLT5kZWZhdWx0X3JlbG9jOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpbnNuLT5pbnNuID0gaW1hZ2U7Ci19Ci0KLS8qCi0gKiBBY3R1YWxseSBvdXRwdXQgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBpdHMgZml4dXAuCi0gKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfaW5zbiAoaW5zbikKLSAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY2hhciAqZjsKLSAgaW50IGk7Ci0KLSAgLyogVGFrZSBjYXJlIG9mIGFsaWdubWVudCBkdXRpZXMgKi8KLSAgaWYgKGFscGhhX2F1dG9fYWxpZ25fb24gJiYgYWxwaGFfY3VycmVudF9hbGlnbiA8IDIpCi0gICAgYWxwaGFfYWxpZ24gKDIsIChjaGFyICopIE5VTEwsIGFscGhhX2luc25fbGFiZWwsIDApOwotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+IDIpCi0gICAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDI7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLT5pbnNuLCA0KTsKLQotICAvKiBBcHBseSB0aGUgZml4dXBzIGluIG9yZGVyICovCi0gIGZvciAoaSA9IDA7IGkgPCBpbnNuLT5uZml4dXBzOyArK2kpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZml4dXAgKmZpeHVwID0gJmluc24tPmZpeHVwc1tpXTsKLSAgICAgIGludCBzaXplLCBwY3JlbDsKLSAgICAgIGZpeFMgKmZpeFA7Ci0KLSAgICAgIC8qIFNvbWUgZml4dXBzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBhbmQgc28gaGF2ZSBubyBob3d0byAqLwotICAgICAgaWYgKChpbnQpZml4dXAtPnJlbG9jIDwgMCkKLQl7Ci0JICBvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWy0oaW50KWZpeHVwLT5yZWxvY107Ci0JICBzaXplID0gNDsKLQkgIHBjcmVsID0gKChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1JFTEFUSVZFKSAhPSAwKTsKLQl9Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkuICovCi0gICAgICBlbHNlIGlmIChmaXh1cC0+cmVsb2MgPT0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2Ci0JICAgICAgIHx8IGZpeHVwLT5yZWxvYyA9PSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTYpCi0JewotCSAgc2l6ZSA9IDIsIHBjcmVsID0gMDsKLQl9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0bwotCSAgICA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cC0+cmVsb2MpOwotCSAgYXNzZXJ0IChyZWxvY19ob3d0byk7Ci0KLQkgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQkgIHBjcmVsID0gcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlOwotCX0KLSAgICAgIGFzc2VydCAoc2l6ZSA+PSAxICYmIHNpemUgPD0gNCk7Ci0KLSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJCSAgJmZpeHVwLT5leHAsIHBjcmVsLCBmaXh1cC0+cmVsb2MpOwotCi0gICAgICAvKiBUdXJuIG9mZiBjb21wbGFpbnRzIHRoYXQgdGhlIGFkZGVuZCBpcyB0b28gbGFyZ2UgZm9yIHNvbWUgZml4dXBzICovCi0gICAgICBzd2l0Y2ggKGZpeHVwLT5yZWxvYykKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0jaWZkZWYgT0JKX0VDT0ZGCi0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSNlbmRpZgotCWNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0JICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBpZiAoKGludClmaXh1cC0+cmVsb2MgPCAwKQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfTk9PVkVSRkxPVykKLQkJZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhbiBvcGNvZGUgbmFtZSBhbmQgYSBwcmUtdG9rZW5pemVkIHNldCBvZiBhcmd1bWVudHMsIGFzc2VtYmxlCi0gICB0aGUgaW5zbiwgYnV0IGRvIG5vdCBlbWl0IGl0LgotCi0gICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIG5vIG1hY3JvcyBhbGxvd2VkLCBzaW5jZSB3ZSBjYW4ndCBzdG9yZSBtb3JlCi0gICB0aGFuIG9uZSBpbnNuIGluIGFuIGluc24gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzc2VtYmxlX3Rva2Vuc190b19pbnNuKG9wbmFtZSwgdG9rLCBudG9rLCBpbnNuKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlOwotCi0gIC8qIHNlYXJjaCBvcGNvZGVzICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICopIGhhc2hfZmluZCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG9wbmFtZSk7Ci0gIGlmIChvcGNvZGUpCi0gICAgewotICAgICAgaW50IGNwdW1hdGNoOwotICAgICAgb3Bjb2RlID0gZmluZF9vcGNvZGVfbWF0Y2ggKG9wY29kZSwgdG9rLCAmbnRvaywgJmNwdW1hdGNoKTsKLSAgICAgIGlmIChvcGNvZGUpCi0JewotCSAgYXNzZW1ibGVfaW5zbiAob3Bjb2RlLCB0b2ssIG50b2ssIGluc24pOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGNwdW1hdGNoKQotCWFzX2JhZCAoXygiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiKSwgb3BuYW1lLAotCSAgICAgICAgYWxwaGFfdGFyZ2V0X25hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotfQotCi0vKiBHaXZlbiBhbiBvcGNvZGUgbmFtZSBhbmQgYSBwcmUtdG9rZW5pemVkIHNldCBvZiBhcmd1bWVudHMsIHRha2UgdGhlCi0gICBvcGNvZGUgYWxsIHRoZSB3YXkgdGhyb3VnaCBlbWlzc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgdG9rLCBudG9rLCBsb2NhbF9tYWNyb3Nfb24pCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGludCBsb2NhbF9tYWNyb3Nfb247Ci17Ci0gIGludCBmb3VuZF9zb21ldGhpbmcgPSAwOwotICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqbWFjcm87Ci0gIGludCBjcHVtYXRjaCA9IDE7Ci0KLSAgLyogc2VhcmNoIG1hY3JvcyAqLwotICBpZiAobG9jYWxfbWFjcm9zX29uKQotICAgIHsKLSAgICAgIG1hY3JvID0gKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKikKLQkgICAgICAgaGFzaF9maW5kIChhbHBoYV9tYWNyb19oYXNoLCBvcG5hbWUpKTsKLSAgICAgIGlmIChtYWNybykKLQl7Ci0JICBmb3VuZF9zb21ldGhpbmcgPSAxOwotCSAgbWFjcm8gPSBmaW5kX21hY3JvX21hdGNoIChtYWNybywgdG9rLCAmbnRvayk7Ci0JICBpZiAobWFjcm8pCi0JICAgIHsKLQkgICAgICAoKm1hY3JvLT5lbWl0KSAodG9rLCBudG9rLCBtYWNyby0+YXJnKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIHNlYXJjaCBvcGNvZGVzICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICopIGhhc2hfZmluZCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG9wbmFtZSk7Ci0gIGlmIChvcGNvZGUpCi0gICAgewotICAgICAgZm91bmRfc29tZXRoaW5nID0gMTsKLSAgICAgIG9wY29kZSA9IGZpbmRfb3Bjb2RlX21hdGNoIChvcGNvZGUsIHRvaywgJm50b2ssICZjcHVtYXRjaCk7Ci0gICAgICBpZiAob3Bjb2RlKQotCXsKLQkgIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0JICBhc3NlbWJsZV9pbnNuIChvcGNvZGUsIHRvaywgbnRvaywgJmluc24pOwotCSAgZW1pdF9pbnNuICgmaW5zbik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZm91bmRfc29tZXRoaW5nKQotICAgIGlmIChjcHVtYXRjaCkKLSAgICAgIGFzX2JhZCAoXygiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci0gICAgZWxzZQotICAgICAgYXNfYmFkIChfKCJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiKSwgb3BuYW1lLAotCSAgICAgIGFscGhhX3RhcmdldF9uYW1lKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotfQotCi0MCi0vKiBTb21lIGluc3RydWN0aW9uIHNldHMgaW5kZXhlZCBieSBsZyhzaXplKSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZXh0WF9vcFtdID0geyAic2V4dGIiLCAic2V4dHciLCAic2V4dGwiLCBOVUxMIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluc1hsX29wW10gPSB7ICJpbnNibCIsICJpbnN3bCIsICJpbnNsbCIsICJpbnNxbCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5zWGhfb3BbXSA9IHsgTlVMTCwgICAgImluc3doIiwgImluc2xoIiwgImluc3FoIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRYbF9vcFtdID0geyAiZXh0YmwiLCAiZXh0d2wiLCAiZXh0bGwiLCAiZXh0cWwiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dFhoX29wW10gPSB7IE5VTEwsICAgICJleHR3aCIsICJleHRsaCIsICJleHRxaCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNrWGxfb3BbXSA9IHsgIm1za2JsIiwgIm1za3dsIiwgIm1za2xsIiwgIm1za3FsIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2tYaF9vcFtdID0geyBOVUxMLCAgICAibXNrd2giLCAibXNrbGgiLCAibXNrcWgiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0WF9vcFtdID0geyAic3RiIiwgInN0dyIsICJzdGwiLCAic3RxIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZFhfb3BbXSA9IHsgImxkYiIsICJsZHciLCAibGRsbCIsICJsZHEiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxkWHVfb3BbXSA9IHsgImxkYnUiLCAibGR3dSIsIE5VTEwsIE5VTEwgfTsKLQotLyogSW1wbGVtZW50IHRoZSBsZGdwIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRncCAodG9rLCBudG9rLCB1bnVzZWQpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdW51c2VkOwotewotI2lmZGVmIE9CSl9BT1VUCi1GSVhNRQotI2VuZGlmCi0jaWYgZGVmaW5lZChPQkpfRUNPRkYpIHx8IGRlZmluZWQoT0JKX0VMRikKLSAgLyogZnJvbSAibGRncCByMSxuKHIyKSIsIGdlbmVyYXRlICJsZGFoIHIxLFgoUjIpOyBsZGEgcjEsWShyMSkiCi0gICAgIHdpdGggYXBwcm9wcmlhdGUgY29uc3RhbnRzIGFuZCByZWxvY2F0aW9ucy4gICovCi0gIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLSAgZXhwcmVzc2lvblMgYWRkZW5kOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGlmIChyZWdubyAodG9rWzJdLlhfYWRkX251bWJlcikgPT0gQVhQX1JFR19QVikKLSAgICBlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUgKDApOwotI2VuZGlmCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBuZXd0b2tbMl0gPSB0b2tbMl07Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGFoIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgYWRkZW5kID0gdG9rWzFdOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGlmIChhZGRlbmQuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIGFzX2JhZCAoXygiY2FuIG5vdCByZXNvbHZlIGV4cHJlc3Npb24iKSk7Ci0gIGFkZGVuZC5YX29wID0gT19zeW1ib2w7Ci0gIGFkZGVuZC5YX2FkZF9zeW1ib2wgPSBhbHBoYV9ncF9zeW1ib2w7Ci0jZW5kaWYKLQotICBpbnNuLm5maXh1cHMgPSAxOwotICBpbnNuLmZpeHVwc1swXS5leHAgPSBhZGRlbmQ7Ci0gIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OwotCi0gIGVtaXRfaW5zbiAoJmluc24pOwotCi0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCB0b2tbMF0uWF9hZGRfbnVtYmVyKTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYSIsIG5ld3RvaywgMywgJmluc24pOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGFkZGVuZC5YX2FkZF9udW1iZXIgKz0gNDsKLSNlbmRpZgotCi0gIGluc24ubmZpeHVwcyA9IDE7Ci0gIGluc24uZml4dXBzWzBdLmV4cCA9IGFkZGVuZDsKLSAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY7Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci0jZW5kaWYgLyogT0JKX0VDT0ZGIHx8IE9CSl9FTEYgKi8KLX0KLQotI2lmZGVmIE9CSl9FVkFYCi0KLS8qIEFkZCBzeW1ib2wrYWRkZW5kIHRvIGxpbmsgcG9vbC4KLSAgIFJldHVybiBvZmZzZXQgZnJvbSBiYXNlc3ltIHRvIGVudHJ5IGluIGxpbmsgcG9vbC4KLQotICAgQWRkIG5ldyBmaXh1cCBvbmx5IGlmIG9mZnNldCBpc24ndCAxNmJpdC4gICovCi0KLXZhbHVlVAotYWRkX3RvX2xpbmtfcG9vbCAoYmFzZXN5bSwgc3ltLCBhZGRlbmQpCi0gICAgIHN5bWJvbFMgKmJhc2VzeW07Ci0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgb2Zmc2V0VCBhZGRlbmQ7Ci17Ci0gIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgdmFsdWVUIG9mZnNldDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7Ci0gIGNoYXIgKnA7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKGFscGhhX2xpbmtfc2VjdGlvbik7Ci0gIGZpeFMgKmZpeHA7Ci0KLSAgb2Zmc2V0ID0gLSAqc3ltYm9sX2dldF9vYmogKGJhc2VzeW0pOwotCi0gIC8qIEBAIFRoaXMgYXNzdW1lcyBhbGwgZW50cmllcyBpbiBhIGdpdmVuIHNlY3Rpb24gd2lsbCBiZSBvZiB0aGUgc2FtZQotICAgICBzaXplLi4uICBQcm9iYWJseSBjb3JyZWN0LCBidXQgdW53aXNlIHRvIHJlbHkgb24uICAqLwotICAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHN1YnNlZ21lbnQuICAqLwotCi0gIGlmIChzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5mcmNoYWluUC0+Zml4X3Jvb3Q7Ci0JIGZpeHAgIT0gKGZpeFMgKikgTlVMTDsKLQkgZml4cCA9IGZpeHAtPmZ4X25leHQsIG9mZnNldCArPSA4KQotICAgICAgewotCWlmIChmaXhwLT5meF9hZGRzeSA9PSBzeW0gJiYgZml4cC0+Znhfb2Zmc2V0ID09IGFkZGVuZCkKLQkgIHsKLQkgICAgaWYgKHJhbmdlX3NpZ25lZF8xNiAob2Zmc2V0KSkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gb2Zmc2V0OwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3QgZm91bmQgaW4gMTZiaXQgc2lnbmVkIHJhbmdlLiAgKi8KLQotICBzdWJzZWdfc2V0IChhbHBoYV9saW5rX3NlY3Rpb24sIDApOwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgbWVtc2V0IChwLCAwLCA4KTsKLQotICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCBzeW0sIGFkZGVuZCwgMCwKLQkgICBCRkRfUkVMT0NfNjQpOwotCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VjdGlvbiwgY3VycmVudF9zdWJzZWMpOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotICByZXR1cm4gb2Zmc2V0OwotfQotCi0jZW5kaWYgLyogT0JKX0VWQVggKi8KLQotLyogTG9hZCBhIChwYXJ0aWFsKSBleHByZXNzaW9uIGludG8gYSB0YXJnZXQgcmVnaXN0ZXIuCi0KLSAgIElmIHBvZmZzZXQgaXMgbm90IG51bGwsIGFmdGVyIHRoZSBjYWxsIGl0IHdpbGwgZWl0aGVyIGNvbnRhaW4KLSAgIE9fY29uc3RhbnQgMCwgb3IgYSAxNi1iaXQgb2Zmc2V0IGFwcHJvcHJpYXRlIGZvciBhbnkgTUVNIGZvcm1hdAotICAgaW5zdHJ1Y3Rpb24uICBJbiBhZGRpdGlvbiwgcGJhc2VyZWcgd2lsbCBiZSBtb2RpZmllZCB0byBwb2ludCB0bwotICAgdGhlIGJhc2UgcmVnaXN0ZXIgdG8gdXNlIGluIHRoYXQgTUVNIGZvcm1hdCBpbnN0cnVjdGlvbi4KLQotICAgSW4gYW55IGNhc2UsICpwYmFzZXJlZyBzaG91bGQgY29udGFpbiBhIGJhc2UgcmVnaXN0ZXIgdG8gYWRkIHRvIHRoZQotICAgZXhwcmVzc2lvbi4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBlaXRoZXIgQVhQX1JFR19aRVJPIG9yCi0gICBhbHBoYV9ncF9yZWdpc3Rlci4gIFN5bWJvbCBhZGRyZXNzZXMgd2lsbCBhbHdheXMgYmUgbG9hZGVkIHZpYSAkZ3AsCi0gICBzbyAiZm9vKCQwKSIgaXMgaW50ZXJwcmV0ZWQgYXMgYWRkaW5nIHRoZSBhZGRyZXNzIG9mIGZvbyB0byAkMDsKLSAgIGkuZS4gImxkcSAkdGFyZywgTElUKCRncCk7IGFkZHEgJHRhcmcsICQwLCAkdGFyZyIuICBPZGQsIHBlcmhhcHMsCi0gICBidXQgdGhpcyBpcyB3aGF0IE9TRi8xIGRvZXMuCi0KLSAgIEZpbmFsbHksIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgY2FsbGluZyBtYWNybyBtYXkgZW1pdCBhCi0gICBMSVRVU0UgcmVsb2MgaWYgb3RoZXJ3aXNlIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGludAotbG9hZF9leHByZXNzaW9uICh0YXJncmVnLCBleHAsIHBiYXNlcmVnLCBwb2Zmc2V0KQotICAgICBpbnQgdGFyZ3JlZzsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50ICpwYmFzZXJlZzsKLSAgICAgZXhwcmVzc2lvblMgKnBvZmZzZXQ7Ci17Ci0gIGludCBlbWl0X2xpdHVzZSA9IDA7Ci0gIG9mZnNldFQgYWRkZW5kID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gIGludCBiYXNlcmVnID0gKnBiYXNlcmVnOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICB7Ci0jaWZkZWYgT0JKX0VDT0ZGCi0Jb2Zmc2V0VCBsaXQ7Ci0KLQkvKiBhdHRlbXB0IHRvIHJlZHVjZSAubGl0IGxvYWQgYnkgc3BsaXR0aW5nIHRoZSBvZmZzZXQgZnJvbQotCSAgIGl0cyBzeW1ib2wgd2hlbiBwb3NzaWJsZSwgYnV0IGRvbid0IGNyZWF0ZSBhIHNpdHVhdGlvbiBpbgotCSAgIHdoaWNoIHdlJ2QgZmFpbC4gICovCi0JaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkgJiYKLQkgICAgKGFscGhhX25vYXRfb24gfHwgdGFyZ3JlZyA9PSBBWFBfUkVHX0FUKSkKLQkgIHsKLQkgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCwKLQkJCQkgICAgICAgYWxwaGFfbGl0YV9zZWN0aW9uLCA4KTsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGxpdCA9IGFkZF90b19saXRlcmFsX3Bvb2wgKGV4cC0+WF9hZGRfc3ltYm9sLCAwLAotCQkJCSAgICAgICBhbHBoYV9saXRhX3NlY3Rpb24sIDgpOwotCSAgfQotCi0JaWYgKGxpdCA+PSAweDgwMDApCi0JICBhc19mYXRhbCAoXygib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdGEpIHRhYmxlIikpOwotCi0JLyogZW1pdCAibGRxIHIsIGxpdChncCkiICovCi0KLQlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiB0YXJncmVnID09IGJhc2VyZWcpCi0JICB7Ci0JICAgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCSAgICBpZiAodGFyZ3JlZyA9PSBBWFBfUkVHX0FUKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0JICB9Ci0JZWxzZQotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0Jc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0YV9zeW1ib2wsIGxpdCk7Ci0Jc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLQotCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLQlhc3NlcnQgKGluc24ubmZpeHVwcyA9PSAxKTsKLQlpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOwotI2VuZGlmIC8qIE9CSl9FQ09GRiAqLwotI2lmZGVmIE9CSl9FTEYKLQkvKiBlbWl0ICJsZHEgciwgZ290b2ZmKGdwKSIgKi8KLQotCWlmIChiYXNlcmVnICE9IGFscGhhX2dwX3JlZ2lzdGVyICYmIHRhcmdyZWcgPT0gYmFzZXJlZykKLQkgIHsKLQkgICAgaWYgKGFscGhhX25vYXRfb24pCi0JICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0JICAgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgd2hpbGUgJGF0IGluIHVzZSIpKTsKLQotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLQkgIH0KLQllbHNlCi0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLQotCS8qIFhYWDogRGlzYWJsZSB0aGlzIC5nb3QgbWluaW1pemluZyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBjYW4gZ2V0Ci0JICAgYmV0dGVyIGluc3RydWN0aW9uIG9mZnNldCBrbm93bGVkZ2UgaW4gdGhlIGNvbXBpbGVyLiAgVGhpcyBoYXBwZW5zCi0JICAgdmVyeSBpbmZyZXF1ZW50bHkgYW55d2F5LiAgKi8KLQlpZiAoMSB8fCAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKQotCSAgICAmJiAoYWxwaGFfbm9hdF9vbiB8fCB0YXJncmVnID09IEFYUF9SRUdfQVQpKSkKLQkgIHsKLQkgICAgbmV3dG9rWzFdID0gKmV4cDsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKLQkgIH0KLQotCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0JYXNzZXJ0IChpbnNuLm5maXh1cHMgPT0gMSk7Ci0JaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw7Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotI2lmZGVmIE9CSl9FVkFYCi0Jb2Zmc2V0VCBsaW5rOwotCi0JLyogRmluZCBzeW1ib2wgb3Igc3ltYm9sIHBvaW50ZXIgaW4gbGluayBzZWN0aW9uLiAgKi8KLQotCWlmIChleHAtPlhfYWRkX3N5bWJvbCA9PSBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKQotCSAgewotCSAgICBpZiAocmFuZ2Vfc2lnbmVkXzE2IChhZGRlbmQpKQotCSAgICAgIHsKLQkJc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0JCXNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgYWRkZW5kKTsKLQkJc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYSIsIG5ld3RvaywgMywgJmluc24pOwotCQlhZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0JCXNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0JCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQkJYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKSkKLQkgICAgICB7Ci0JCWxpbmsgPSBhZGRfdG9fbGlua19wb29sIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sLAotCQkJCQkgZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCk7Ci0JCWFkZGVuZCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlsaW5rID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCQkJIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKLQkgICAgICB9Ci0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCSAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGxpbmspOwotCSAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0JICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0JICB9Ci0jZW5kaWYgLyogT0JKX0VWQVggKi8KLQotCWVtaXRfaW5zbigmaW5zbik7Ci0KLSNpZm5kZWYgT0JKX0VWQVgKLQllbWl0X2xpdHVzZSA9IDE7Ci0KLQlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiBiYXNlcmVnICE9IEFYUF9SRUdfWkVSTykKLQkgIHsKLQkgICAgLyogZW1pdCAiYWRkcSByLCBiYXNlLCByIiAqLwotCi0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIGJhc2VyZWcpOwotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCB0YXJncmVnKTsKLQkgICAgYXNzZW1ibGVfdG9rZW5zICgiYWRkcSIsIG5ld3RvaywgMywgMCk7Ci0JICB9Ci0jZW5kaWYKLQotCWJhc2VyZWcgPSB0YXJncmVnOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIC8qIEFzc3VtZSB0aGF0IHRoaXMgZGlmZmVyZW5jZSBleHByZXNzaW9uIHdpbGwgYmUgcmVzb2x2ZWQgdG8gYW4KLQkgYWJzb2x1dGUgdmFsdWUgYW5kIHRoYXQgdGhhdCB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSAgICAgIG5ld3Rva1sxXSA9ICpleHA7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOwotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgMCk7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT19iaWc6Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBhZGRlbmQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJjYW4ndCBoYW5kbGUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkpCi0gICAgewotICAgICAgb2Zmc2V0VCBsaXQ7Ci0KLSAgICAgIC8qIGZvciA2NC1iaXQgYWRkZW5kcywganVzdCBwdXQgaXQgaW4gdGhlIGxpdGVyYWwgcG9vbCAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICAgIC8qIGVtaXQgImxkcSB0YXJncmVnLCBsaXQoYmFzZXJlZykiICAqLwotICAgICAgbGl0ID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCSAgICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKSwgYWRkZW5kKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcSIsIG5ld3RvaywgMywgMCk7Ci0jZWxzZQotCi0gICAgICBpZiAoYWxwaGFfbGl0OF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXQ4IiwKLQkJCQkgICZhbHBoYV9saXQ4X3NlY3Rpb24sCi0JCQkJICAmYWxwaGFfbGl0OF9zeW1ib2wpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0JICBhbHBoYV9saXQ4X2xpdGVyYWwgPSBhZGRfdG9fbGl0ZXJhbF9wb29sIChhbHBoYV9saXQ4X3N5bWJvbCwgMHg4MDAwLAotCQkJCQkJICAgIGFscGhhX2xpdGFfc2VjdGlvbiwgOCk7Ci0JICBpZiAoYWxwaGFfbGl0OF9saXRlcmFsID49IDB4ODAwMCkKLQkgICAgYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIpKTsKLSNlbmRpZgotCX0KLQotICAgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoTlVMTCwgYWRkZW5kLCBhbHBoYV9saXQ4X3NlY3Rpb24sIDgpIC0gMHg4MDAwOwotICAgICAgaWYgKGxpdCA+PSAweDgwMDApCi0JYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIpKTsKLQotICAgICAgLyogZW1pdCAibGRhIGxpdHJlZywgLmxpdDgrMHg4MDAwIiAqLwotCi0gICAgICBpZiAodGFyZ3JlZyA9PSBiYXNlcmVnKQotCXsKLQkgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQkgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotCX0KLSAgICAgIGVsc2UKLQlzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGFscGhhX2xpdGFfc3ltYm9sLCBhbHBoYV9saXQ4X2xpdGVyYWwpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgICAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0OF9zeW1ib2wsIDB4ODAwMCk7Ci0jZW5kaWYKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLSAgICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzID09IDEpOwotI2lmZGVmIE9CSl9FQ09GRgotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOwotI2VuZGlmCi0KLSAgICAgIGVtaXRfaW5zbiAoJmluc24pOwotCi0gICAgICAvKiBlbWl0ICJsZHEgbGl0cmVnLCBsaXQobGl0cmVnKSIgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIG5ld3Rva1swXS5YX2FkZF9udW1iZXIpOwotCi0gICAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gMTsKLSAgICAgIGVtaXRfbGl0dXNlID0gMDsKLQotICAgICAgZW1pdF9pbnNuICgmaW5zbik7Ci0KLSAgICAgIC8qIGVtaXQgImFkZHEgbGl0cmVnLCBiYXNlLCB0YXJnZXQiICovCi0KLSAgICAgIGlmIChiYXNlcmVnICE9IEFYUF9SRUdfWkVSTykKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBiYXNlcmVnKTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIHRhcmdyZWcpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgiYWRkcSIsIG5ld3RvaywgMywgMCk7Ci0JfQotI2VuZGlmIC8qICFPQkpfRVZBWCAqLwotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgMCk7Ci0gICAgICAqcGJhc2VyZWcgPSB0YXJncmVnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9mZnNldFQgbG93LCBoaWdoLCBleHRyYSwgdG1wOwotCi0gICAgICAvKiBmb3IgMzItYml0IG9wZXJhbmRzLCBicmVhayB1cCB0aGUgYWRkZW5kICovCi0KLSAgICAgIGxvdyA9IHNpZ25fZXh0ZW5kXzE2IChhZGRlbmQpOwotICAgICAgdG1wID0gYWRkZW5kIC0gbG93OwotICAgICAgaGlnaCA9IHNpZ25fZXh0ZW5kXzE2ICh0bXAgPj4gMTYpOwotCi0gICAgICBpZiAodG1wIC0gKGhpZ2ggPDwgMTYpKQotCXsKLQkgIGV4dHJhID0gMHg0MDAwOwotCSAgdG1wIC09IDB4NDAwMDAwMDA7Ci0JICBoaWdoID0gc2lnbl9leHRlbmRfMTYgKHRtcCA+PiAxNik7Ci0JfQotICAgICAgZWxzZQotCWV4dHJhID0gMDsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0KLSAgICAgIGlmIChleHRyYSkKLQl7Ci0JICAvKiBlbWl0ICJsZGFoIHIsIGV4dHJhKHIpICovCi0JICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGV4dHJhKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImxkYWgiLCBuZXd0b2ssIDMsIDApOwotCSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcgPSB0YXJncmVnKTsKLQl9Ci0KLSAgICAgIGlmIChoaWdoKQotCXsKLQkgIC8qIGVtaXQgImxkYWggciwgaGlnaChyKSAqLwotCSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBoaWdoKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImxkYWgiLCBuZXd0b2ssIDMsIDApOwotCSAgYmFzZXJlZyA9IHRhcmdyZWc7Ci0JICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0JfQotCi0gICAgICBpZiAoKGxvdyAmJiAhcG9mZnNldCkgfHwgKCFwb2Zmc2V0ICYmIGJhc2VyZWcgIT0gdGFyZ3JlZykpCi0JewotCSAgLyogZW1pdCAibGRhIHIsIGxvdyhiYXNlKSIgKi8KLQkgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgbG93KTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgMywgMCk7Ci0JICBiYXNlcmVnID0gdGFyZ3JlZzsKLQkgIGxvdyA9IDA7Ci0JfQotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgbG93KTsKLSAgICAgICpwYmFzZXJlZyA9IGJhc2VyZWc7Ci0gICAgfQotCi0gIHJldHVybiBlbWl0X2xpdHVzZTsKLX0KLQotLyogVGhlIGxkYSBtYWNybyBkaWZmZXJzIGZyb20gdGhlIGxkYSBpbnN0cnVjdGlvbiBpbiB0aGF0IGl0IGhhbmRsZXMKLSAgIG1vc3Qgc2ltcGxlIGV4cHJlc3Npb25zLCBwYXJ0aWN1YWxybHkgc3ltYm9sIGFkZHJlc3MgbG9hZHMgYW5kCi0gICBsYXJnZSBjb25zdGFudHMuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZGEgKHRvaywgbnRvaywgdW51c2VkKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHVudXNlZDsKLXsKLSAgaW50IGJhc2VyZWc7Ci0KLSAgaWYgKG50b2sgPT0gMikKLSAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIGVsc2UKLSAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKLQotICAodm9pZCkgbG9hZF9leHByZXNzaW9uICh0b2tbMF0uWF9hZGRfbnVtYmVyLCAmdG9rWzFdLCAmYmFzZXJlZywgTlVMTCk7Ci19Ci0KLS8qIFRoZSBsZGFoIG1hY3JvIGRpZmZlcnMgZnJvbSB0aGUgbGRhaCBpbnN0cnVjdGlvbiBpbiB0aGF0IGl0IGhhcyAkMzEKLSAgIGFzIGFuIGltcGxpZWQgYmFzZSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xkYWggKHRvaywgbnRvaywgdW51c2VkKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHVudXNlZDsKLXsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgbmV3dG9rWzFdID0gdG9rWzFdOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19aRVJPKTsKLQotICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLX0KLQotLyogSGFuZGxlIGFsbCAic2ltcGxlIiBpbnRlZ2VyIHJlZ2lzdGVyIGxvYWRzIC0tIGxkcSwgbGRxX2wsIGxkcV91LAotICAgZXRjLiAgVGhleSBkaWZmZXIgZnJvbSB0aGUgcmVhbCBpbnN0cnVjdGlvbnMgaW4gdGhhdCB0aGV5IGRvIHNpbXBsZQotICAgZXhwcmVzc2lvbnMgbGlrZSB0aGUgbGRhIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfaXJfbG9hZCAodG9rLCBudG9rLCBvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgb3BuYW1lOwotewotICBpbnQgYmFzZXJlZywgbGl0dXNlOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0KLSAgaWYgKG50b2sgPT0gMikKLSAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIGVsc2UKLSAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKLQotICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKHRva1swXS5YX2FkZF9udW1iZXIsICZ0b2tbMV0sICZiYXNlcmVnLAotCQkJICAgICZuZXd0b2tbMV0pOwotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgoY29uc3QgY2hhciAqKW9wbmFtZSwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgaWYgKGxpdHVzZSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gMTsKLSAgICB9Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci19Ci0KLS8qIEhhbmRsZSBmcCByZWdpc3RlciBsb2FkcywgYW5kIGJvdGggaW50ZWdlciBhbmQgZnAgcmVnaXN0ZXIgc3RvcmVzLgotICAgQWdhaW4sIHdlIGhhbmRsZSBzaW1wbGUgZXhwcmVzc2lvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sb2Fkc3RvcmUgKHRvaywgbnRvaywgb3BuYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIG9wbmFtZTsKLXsKLSAgaW50IGJhc2VyZWcsIGxpdHVzZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotCi0gIGlmIChudG9rID09IDIpCi0gICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICBlbHNlCi0gICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKHRva1sxXS5YX29wICE9IE9fY29uc3RhbnQgfHwgIXJhbmdlX3NpZ25lZF8xNih0b2tbMV0uWF9hZGRfbnVtYmVyKSkKLSAgICB7Ci0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgbGl0dXNlID0gbG9hZF9leHByZXNzaW9uIChBWFBfUkVHX0FULCAmdG9rWzFdLCAmYmFzZXJlZywgJm5ld3Rva1sxXSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmV3dG9rWzFdID0gdG9rWzFdOwotICAgICAgbGl0dXNlID0gMDsKLSAgICB9Ci0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKChjb25zdCBjaGFyICopb3BuYW1lLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotICBpZiAobGl0dXNlKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzIDwgTUFYX0lOU05fRklYVVBTKTsKLSAgICAgIGlmIChpbnNuLm5maXh1cHMgPiAwKQotCXsKLQkgIG1lbW1vdmUgKCZpbnNuLmZpeHVwc1sxXSwgJmluc24uZml4dXBzWzBdLAotCQkgICBzaXplb2Yoc3RydWN0IGFscGhhX2ZpeHVwKSAqIGluc24ubmZpeHVwcyk7Ci0JfQotICAgICAgaW5zbi5uZml4dXBzKys7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSAxOwotICAgIH0KLQotICBlbWl0X2luc24gKCZpbnNuKTsKLX0KLQotLyogTG9hZCBhIGhhbGYtd29yZCBvciBieXRlIGFzIGFuIHVuc2lnbmVkIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2lyX2xvYWQgKHRvaywgbnRvaywgbGRYdV9vcFsobG9uZyl2bGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICAvKiBlbWl0ICJsZGEgJGF0LCBleHAiICovCi0KLSAgICAgIG1lbWNweSAobmV3dG9rLCB0b2ssIHNpemVvZiAoZXhwcmVzc2lvblMpICogbnRvayk7Ci0gICAgICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkcV91IHRhcmcsIDAoJGF0KSIgKi8KLQotICAgICAgbmV3dG9rWzBdID0gdG9rWzBdOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAiZXh0WGwgdGFyZywgJGF0LCB0YXJnIiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoZXh0WGxfb3BbKGxvbmcpdmxnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0gICAgfQotfQotCi0vKiBMb2FkIGEgaGFsZi13b3JkIG9yIGJ5dGUgYXMgYSBzaWduZWQgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBlbWl0X2xkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoc2V4dFhfb3BbKGxvbmcpdmxnc2l6ZV0sIHRvaywgMSwgMSk7Ci19Ci0KLS8qIExvYWQgYW4gaW50ZWdyYWwgdmFsdWUgZnJvbSBhbiB1bmFsaWduZWQgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZAotICAgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91bGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGxvbmcgbGdzaXplID0gKGxvbmcpdmxnc2l6ZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIGlmIChhbHBoYV9ub2F0X29uKQotICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkdDksIDAoJGF0KSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfQVQpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibGRxX3UgJHQxMCwgc2l6ZS0xKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sICgxPDxsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiZXh0WGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDkpOwotICBhc3NlbWJsZV90b2tlbnMgKGV4dFhsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiZXh0WGggJHQxMCwgJGF0LCAkdDEwIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOwotICBhc3NlbWJsZV90b2tlbnMgKGV4dFhoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCB0YXJnIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7Ci0gIG5ld3Rva1syXSA9IHRva1swXTsKLSAgYXNzZW1ibGVfdG9rZW5zICgib3IiLCBuZXd0b2ssIDMsIDEpOwotfQotCi0vKiBMb2FkIGFuIGludGVncmFsIHZhbHVlIGZyb20gYW4gdW5hbGlnbmVkIGFkZHJlc3MgYXMgYSBzaWduZWQgdmFsdWUuCi0gICBOb3RlIHRoYXQgcXVhZHMgc2hvdWxkIGdldCBmdW5uZWxlZCB0byB0aGUgdW5zaWduZWQgbG9hZCBzaW5jZSB3ZQotICAgZG9uJ3QgaGF2ZSB0byBkbyB0aGUgc2lnbiBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91bGRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgZW1pdF91bGRYdSAodG9rLCBudG9rLCB2bGdzaXplKTsKLSAgYXNzZW1ibGVfdG9rZW5zIChzZXh0WF9vcFsobG9uZyl2bGdzaXplXSwgdG9rLCAxLCAxKTsKLX0KLQotLyogSW1wbGVtZW50IHRoZSBsZGlsIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRpbCAodG9rLCBudG9rLCB1bnVzZWQpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdW51c2VkOwotewotICBleHByZXNzaW9uUyBuZXd0b2tbMl07Ci0KLSAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mKG5ld3RvaykpOwotICBuZXd0b2tbMV0uWF9hZGRfbnVtYmVyID0gc2lnbl9leHRlbmRfMzIgKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci19Ci0KLS8qIFN0b3JlIGEgaGFsZi13b3JkIG9yIGJ5dGUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9zdFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBpbnQgbGdzaXplID0gKGludCkobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCBzdFhfb3BbbGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICAgICAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgICAgIG5ld3Rva1swXS5YX2FkZF9udW1iZXIgPSBBWFBfUkVHX0FUOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAgICAgLyogZW1pdCAibGRxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTAiICovCi0KLSAgICAgIG5ld3Rva1swXSA9IHRva1swXTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOwotICAgICAgYXNzZW1ibGVfdG9rZW5zIChpbnNYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJtc2tYbCAkdDksICRhdCwgJHQ5IiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAobXNrWGxfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCAkdDkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm9yIiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoInN0cV91IiwgbmV3dG9rLCAzLCAxKTsKLSAgICB9Ci19Ci0KLS8qIFN0b3JlIGFuIGludGVnZXIgdG8gYW4gdW5hbGlnbmVkIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91c3RYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgaW50IGxnc2l6ZSA9IChpbnQpKGxvbmcpdmxnc2l6ZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkOSwgMCgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkMTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTEiICovCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTEpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGggc3JjLCAkYXQsICR0MTIiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTIpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGggJHQxMCwgJGF0LCAkdDEwIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQ5LCAkdDExLCAkdDkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDExKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQxMCwgJHQxMiwgJHQxMCIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEyKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgic3RxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgInN0cV91ICR0MTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJzdHFfdSIsIG5ld3RvaywgMywgMSk7Ci19Ci0KLS8qIFNpZ24gZXh0ZW5kIGEgaGFsZi13b3JkIG9yIGJ5dGUuICBUaGUgMzItYml0IHNpZ24gZXh0ZW5kIGlzCi0gICBpbXBsZW1lbnRlZCBhcyAiYWRkbCAkMzEsICRyLCAkdCIgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3NleHRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgbG9uZyBsZ3NpemUgPSAobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wW2xnc2l6ZV0sIHRvaywgbnRvaywgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgYml0c2hpZnQgPSA2NCAtIDggKiAoMSA8PCBsZ3NpemUpOwotICAgICAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gICAgICAvKiBlbWl0ICJzbGwgc3JjLGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gICAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGJpdHNoaWZ0KTsKLSAgICAgIG5ld3Rva1syXSA9IHRva1tudG9rIC0gMV07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzbGwiLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJzcmEgZHN0LGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSBuZXd0b2tbMl07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzcmEiLCBuZXd0b2ssIDMsIDEpOwotICAgIH0KLX0KLQotLyogSW1wbGVtZW50IHRoZSBkaXZpc2lvbiBhbmQgbW9kdWx1cyBtYWNyb3MuICAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogTWFrZSByZWdpc3RlciB1c2FnZSBsaWtlIGluIG5vcm1hbCBwcm9jZWR1cmUgY2FsbC4KLSAgIERvbid0IGNsb2JiZXIgUFYgYW5kIFJBLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfZGl2aXNpb24gKHRvaywgbnRvaywgc3ltbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBzeW1uYW1lOwotewotICAvKiBESVZJU0lPTiBhbmQgTU9EVUxVUy4gWWVjaC4KLSAgICoKLSAgICogQ29udmVydAotICAgKiAgICBPUCB4LHkscmVzdWx0Ci0gICAqIHRvCi0gICAqICAgIG1vdiB4LFIxNgkjIGlmIHggIT0gUjE2Ci0gICAqICAgIG1vdiB5LFIxNwkjIGlmIHkgIT0gUjE3Ci0gICAqICAgIGxkYSBBVCxfX09QCi0gICAqICAgIGpzciBBVCwoQVQpLDAKLSAgICogICAgbW92IFIwLHJlc3VsdAotICAgKgotICAgKiB3aXRoIGFwcHJvcHJpYXRlIG9wdGltaXphdGlvbnMgaWYgUjAsUjE2LFIxNyBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7Ci0gIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGlmIChudG9rIDwgMykKLSAgICByciA9IHhyOwotICBlbHNlCi0gICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7Ci0KLSAgLyogTW92ZSB0aGUgb3BlcmFuZHMgaW50byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKHlyID09IEFYUF9SRUdfUjE2ICYmIHhyID09IEFYUF9SRUdfUjE3KQotICAgIHsKLSAgICAgIC8qIFRoZXkgYXJlIGluIGV4YWN0bHkgdGhlIHdyb25nIG9yZGVyIC0tIHN3YXAgdGhyb3VnaCBBVCAqLwotCi0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMTYpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1IxNyk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHlyID09IEFYUF9SRUdfUjE2KQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjE2KTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotCi0gICAgICBpZiAoeHIgIT0gQVhQX1JFR19SMTYpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeHIpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTYpOwotICAgICAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotCi0gICAgICBpZiAoeXIgIT0gQVhQX1JFR19SMTYgJiYgeXIgIT0gQVhQX1JFR19SMTcpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeXIpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0gICAgfQotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjb25zdCBjaGFyICopc3ltbmFtZSk7Ci0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0gIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIHN5bSwgMCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzJdLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChyciAhPSBBWFBfUkVHX1IwKQotICAgIHsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjApOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgcnIpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci19Ci0KLSNlbHNlIC8qICFPQkpfRVZBWCAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9kaXZpc2lvbiAodG9rLCBudG9rLCBzeW1uYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHN5bW5hbWU7Ci17Ci0gIC8qIERJVklTSU9OIGFuZCBNT0RVTFVTLiBZZWNoLgotICAgKiBDb252ZXJ0Ci0gICAqICAgIE9QIHgseSxyZXN1bHQKLSAgICogdG8KLSAgICogICAgbGRhIHB2LF9fT1AKLSAgICogICAgbW92IHgsdDEwCi0gICAqICAgIG1vdiB5LHQxMQotICAgKiAgICBqc3IgdDksKHB2KSxfX09QCi0gICAqICAgIG1vdiB0MTIscmVzdWx0Ci0gICAqCi0gICAqIHdpdGggYXBwcm9wcmlhdGUgb3B0aW1pemF0aW9ucyBpZiB0MTAsdDExLHQxMiBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7Ci0gIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGlmIChudG9rIDwgMykKLSAgICByciA9IHhyOwotICBlbHNlCi0gICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKLQotICAvKiBNb3ZlIHRoZSBvcGVyYW5kcyBpbnRvIHRoZSByaWdodCBwbGFjZSAqLwotICBpZiAoeXIgPT0gQVhQX1JFR19UMTAgJiYgeHIgPT0gQVhQX1JFR19UMTEpCi0gICAgewotICAgICAgLyogVGhleSBhcmUgaW4gZXhhY3RseSB0aGUgd3Jvbmcgb3JkZXIgLS0gc3dhcCB0aHJvdWdoIEFUICovCi0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDExKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoeXIgPT0gQVhQX1JFR19UMTApCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh4ciAhPSBBWFBfUkVHX1QxMCkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB4cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh5ciAhPSBBWFBfUkVHX1QxMCAmJiB5ciAhPSBBWFBfUkVHX1QxMSkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB5cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLSAgICB9Ci0KLSAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgc3ltLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAyLCAxKTsKLQotICAvKiBSZWxvYWQgdGhlIEdQIHJlZ2lzdGVyICovCi0jaWZkZWYgT0JKX0FPVVQKLUZJWE1FCi0jZW5kaWYKLSNpZiBkZWZpbmVkKE9CSl9FQ09GRikgfHwgZGVmaW5lZChPQkpfRUxGKQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1Q5KTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRncCIsIG5ld3RvaywgMywgMSk7Ci0jZW5kaWYKLQotICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChyciAhPSBBWFBfUkVHX1QxMikKLSAgICB7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMik7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBycik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICFPQkpfRVZBWCAqLwotCi0vKiBUaGUganNyIGFuZCBqbXAgbWFjcm9zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uIGNvdW50ZXJwYXJ0cwotICAgaW4gdGhhdCB0aGV5IGNhbiBsb2FkIHRoZSB0YXJnZXQgYWRkcmVzcyBhbmQgZGVmYXVsdCBtb3N0Ci0gICBldmVyeXRoaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfanNyam1wICh0b2ssIG50b2ssIHZvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdm9wbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqb3BuYW1lID0gKGNvbnN0IGNoYXIgKikgdm9wbmFtZTsKLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBpbnQgciwgdG9raWR4ID0gMCwgbGl0dXNlID0gMDsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fcmVnaXN0ZXIpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICByID0gc3RyY21wIChvcG5hbWUsICJqbXAiKSA9PSAwID8gQVhQX1JFR19aRVJPIDogQVhQX1JFR19SQTsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJgotICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIGtlZXAgcmVnaXN0ZXIgaWYganNyICRuLjxzeW0+ICAqLwotI2Vsc2UKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBiYXNlcmVnID0gYWxwaGFfZ3BfcmVnaXN0ZXI7Ci0gICAgICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKHIgPSBBWFBfUkVHX1BWLCAmdG9rW3Rva2lkeF0sICZiYXNlcmVnLCBOVUxMKTsKLSAgICB9Ci0jZW5kaWYKLQotICBzZXRfdG9rX2NwcmVnIChuZXd0b2tbMV0sIHIpOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgLyogRklYTUU6IEFkZCBoaW50IHJlbG9jcyB0byBCRkQgZm9yIGV2YXguICAqLwotI2Vsc2UKLSAgaWYgKHRva2lkeCA8IG50b2spCi0gICAgbmV3dG9rWzJdID0gdG9rW3Rva2lkeF07Ci0gIGVsc2UKLSNlbmRpZgotICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1syXSwgMCk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKG9wbmFtZSwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgLyogYWRkIHRoZSBMSVRVU0UgZml4dXAgKi8KLSAgaWYgKGxpdHVzZSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gMzsKLSAgICB9Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci19Ci0KLS8qIFRoZSByZXQgYW5kIGpjciBpbnN0cnVjdGlvbnMgZGlmZmVyIGZyb20gdGhlaXIgaW5zdHJ1Y3Rpb24KLSAgIGNvdW50ZXJwYXJ0cyBpbiB0aGF0IGV2ZXJ5dGhpbmcgY2FuIGJlIGRlZmF1bHRlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3JldGpjciAodG9rLCBudG9rLCB2b3BuYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZvcG5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9wbmFtZSA9IChjb25zdCBjaGFyICopdm9wbmFtZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBpbnQgciwgdG9raWR4ID0gMDsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fcmVnaXN0ZXIpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICByID0gQVhQX1JFR19aRVJPOwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHIpOwotCi0gIGlmICh0b2tpZHggPCBudG9rICYmCi0gICAgICAodG9rW3Rva2lkeF0uWF9vcCA9PSBPX3ByZWdpc3RlciB8fCB0b2tbdG9raWR4XS5YX29wID09IE9fY3ByZWdpc3RlcikpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICByID0gQVhQX1JFR19SQTsKLQotICBzZXRfdG9rX2NwcmVnIChuZXd0b2tbMV0sIHIpOwotCi0gIGlmICh0b2tpZHggPCBudG9rKQotICAgIG5ld3Rva1syXSA9IHRva1t0b2tpZHhdOwotICBlbHNlCi0gICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzJdLCBzdHJjbXAob3BuYW1lLCAicmV0IikgPT0gMCk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zIChvcG5hbWUsIG5ld3RvaywgMywgMCk7Ci19Ci0MCi0vKiBBc3NlbWJsZXIgZGlyZWN0aXZlcyAqLwotCi0vKiBIYW5kbGUgdGhlIC50ZXh0IHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3RleHQgKGkpCi0gICAgIGludCBpOwotCi17Ci0gIHNfdGV4dCAoaSk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmRhdGEgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIGFscGhhX2luc25fbGFiZWwgYW5kIHJlc3RvcmVzIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZGF0YSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHNfZGF0YSAoaSk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUNPRkYpIHx8IGRlZmluZWQgKE9CSl9FVkFYKQotCi0vKiBIYW5kbGUgdGhlIE9TRi8xIGFuZCBvcGVuVk1TIC5jb21tIHBzZXVkbyBxdWlya3MuCi0gICBvcGVuVk1TIGNvbnN0cnVjdHMgYSBzZWN0aW9uIGZvciBldmVyeSBjb21tb24gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfY29tbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgdGVtcDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgc2VnVCBuZXdfc2VnOwotI2VuZGlmCi0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIC8qIEFscGhhIE9TRi8xIGNvbXBpbGVyIGRvZXNuJ3QgcHJvdmlkZSB0aGUgY29tbWEsIGdjYyBkb2VzLiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgLyogTWFrZSBhIHNlY3Rpb24gZm9yIHRoZSBjb21tb24gc3ltYm9sLiAgKi8KLSAgbmV3X3NlZyA9IHN1YnNlZ19uZXcgKHhzdHJkdXAgKG5hbWUpLCAwKTsKLSNlbmRpZgotCi0gICpwID0gYzsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIGFsaWdubWVudCBtaWdodCBmb2xsb3cgICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBvZmZzZXRUIGFsaWduOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsgICAgICAKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIG5ld19zZWcsIGFsaWduKTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VWQVgKLSAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgbmV3X3NlZykgPiAwKQotICAgIHsgCi0gICAgICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBuZXdfc2VnKSAhPSB0ZW1wKQotCWFzX2JhZCAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkJKGxvbmcpIGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgbmV3X3NlZyksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0jZWxzZQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZQotICAgIHsKLSNpZmRlZiBPQkpfRVZBWCAKLSAgICAgIHN1YnNlZ19zZXQgKG5ld19zZWcsIDApOwotICAgICAgcCA9IGZyYWdfbW9yZSAodGVtcCk7Ci0gICAgICBuZXdfc2VnLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgaWYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQlTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBuZXdfc2VnKTsKLSNlbHNlCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgdGVtcCk7Ci0jZW5kaWYKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfRVZBWAotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSNlbmRpZgotCi0gIGtub3cgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYgLyogISBPQkpfRUxGICovCi0KLSNpZmRlZiBPQkpfRUNPRkYKLQotLyogSGFuZGxlIHRoZSAucmRhdGEgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIGFscGhhX2luc25fbGFiZWwgYW5kIHJlc3RvcmVzIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfcmRhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfbmV3ICgiLnJkYXRhIiwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VDT0ZGCi0KLS8qIEhhbmRsZSB0aGUgLnNkYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NkYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX25ldyAoIi5zZGF0YSIsIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIEhhbmRsZSB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIGFscGhhX2luc25fbGFiZWwgYW5kIHJlc3RvcmVzIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci0KLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW50IChkdW1teSkKLSAgICAgaW50IGR1bW15OwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbnQgKDApOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbmFtZSwgbmFtZV9lbmQ7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIGlmIChhbHBoYV9jdXJfZW50X3N5bSkKLQkgICAgYXNfd2FybiAoXygibmVzdGVkIC5lbnQgZGlyZWN0aXZlcyIpKTsKLQotCSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgYWxwaGFfY3VyX2VudF9zeW0gPSBzeW07Ci0KLQkgIC8qIFRoZSAuZW50IGRpcmVjdGl2ZSBpcyBzb21ldGltZXMgZm9sbG93ZWQgYnkgYSBudW1iZXIuICBOb3Qgc3VyZQotCSAgICAgd2hhdCBpdCByZWFsbHkgbWVhbnMsIGJ1dCBpZ25vcmUgaXQuICAqLwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICB9Ci0JICBpZiAoaXNkaWdpdCAoKmlucHV0X2xpbmVfcG9pbnRlcikgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0JICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW5kIChkdW1teSkKLSAgICAgaW50IGR1bW15OwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmQgKDApOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbmFtZSwgbmFtZV9lbmQ7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQkgIGlmIChzeW0gIT0gYWxwaGFfY3VyX2VudF9zeW0pCi0JICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIG5hbWVzIGRpZmZlcmVudCBzeW1ib2wgdGhhbiAuZW50IikpOwotCi0JICAvKiBDcmVhdGUgYW4gZXhwcmVzc2lvbiB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgIGlmIChzeW0pCi0JICAgIHsKLQkgICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9Ci0JCShleHByZXNzaW9uUyAqKSB4bWFsbG9jIChzaXplb2YgKGV4cHJlc3Npb25TKSk7Ci0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnNpemUtPlhfb3AgPSBPX3N1YnRyYWN0OwotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplLT5YX2FkZF9zeW1ib2wKLQkgICAgICAgID0gc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsIGZyYWdfbm93X2ZpeCAoKSwgZnJhZ19ub3cpOwotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplLT5YX29wX3N5bWJvbCA9IHN5bTsKLQkgICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZS0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCi0JICBhbHBoYV9jdXJfZW50X3N5bSA9IE5VTEw7Ci0KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbWFzayAoZnApCi0gICAgIGludCBmcDsKLXsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICBpZiAoZnApCi0gICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoMCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9tYXNrICgwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnJhbWUgKGR1bW15KQotICAgICBpbnQgZHVtbXk7Ci17Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfZGlyZWN0aXZlX2ZyYW1lICgwKTsKLSAgZWxzZQotICAgIGRpc2NhcmRfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9wcm9sb2d1ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0gIGludCBhcmc7Ci0KLSAgYXJnID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBzeW0gPSBlY29mZl9nZXRfY3VyX3Byb2Nfc3ltICgpOwotICBlbHNlCi0gICAgc3ltID0gYWxwaGFfY3VyX2VudF9zeW07Ci0gIGtub3cgKHN5bSAhPSBOVUxMKTsKLQotICBzd2l0Y2ggKGFyZykKLSAgICB7Ci0gICAgICBjYXNlIDA6IC8qIE5vIFBWIHJlcXVpcmVkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfTk9QVik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6IC8qIFN0ZCBHUCBsb2FkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6IC8qIE5vbi1zdGQgdXNlIG9mIFBWLiAgKi8KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgJWQgdG8gLnByb2xvZ3VlLiIpLCBhcmcpOwotCWJyZWFrOwotICAgIH0gIAotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9jb2ZmX3dyYXBwZXIgKHdoaWNoKQotICAgICBpbnQgd2hpY2g7Ci17Ci0gIHN0YXRpYyB2b2lkICgqIGNvbnN0IGZuc1tdKSBQQVJBTVMgKChpbnQpKSA9IHsKLSAgICBlY29mZl9kaXJlY3RpdmVfYmVnaW4sCi0gICAgZWNvZmZfZGlyZWN0aXZlX2JlbmQsCi0gICAgZWNvZmZfZGlyZWN0aXZlX2RlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZGltLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZmlsZSwKLSAgICBlY29mZl9kaXJlY3RpdmVfc2NsLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV90YWcsCi0gICAgZWNvZmZfZGlyZWN0aXZlX3ZhbCwKLSAgICBlY29mZl9kaXJlY3RpdmVfbG9jLAotICB9OwotCi0gIGFzc2VydCAod2hpY2ggPj0gMCAmJiB3aGljaCA8IHNpemVvZihmbnMpL3NpemVvZigqZm5zKSk7Ci0KLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICAoKmZuc1t3aGljaF0pKDApOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFQ09GRiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci19Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgCi0vKiBIYW5kbGUgdGhlIHNlY3Rpb24gc3BlY2lmaWMgcHNldWRvLW9wLiAgKi8KLSAgCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zZWN0aW9uIChzZWNpZCkKLSAgICAgaW50IHNlY2lkOwotewotICBpbnQgdGVtcDsKLSNkZWZpbmUgRVZBWF9TRUNUSU9OX0NPVU5UIDUKLSAgc3RhdGljIGNoYXIgKnNlY3Rpb25fbmFtZVtFVkFYX1NFQ1RJT05fQ09VTlQrMV0gPQotICAgIHsgIk5VTEwiLCAiLnJkYXRhIiwgIi5jb21tIiwgIi5saW5rIiwgIi5jdG9ycyIsICIuZHRvcnMiIH07Ci0KLSAgaWYgKChzZWNpZCA8PSAwKSB8fCAoc2VjaWQgPiBFVkFYX1NFQ1RJT05fQ09VTlQpKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIHNlY3Rpb24gZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX25ldyAoc2VjdGlvbl9uYW1lW3NlY2lkXSwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLQotLyogUGFyc2UgLmVudCBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLSAgZXhwcmVzc2lvblMgc3ltZXhwcjsKLQotICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVyZWcgPSAtMTsKLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lc2l6ZSA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy5yc2Ffb2Zmc2V0ID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLnJhX3NhdmUgPSBBWFBfUkVHX1JBOwotICBhbHBoYV9ldmF4X3Byb2MuZnBfc2F2ZSA9IC0xOwotICBhbHBoYV9ldmF4X3Byb2MuaW1hc2sgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MuZm1hc2sgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MucHJvbG9ndWUgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MudHlwZSA9IDA7Ci0KLSAgZXhwcmVzc2lvbiAoJnN5bWV4cHIpOwotCi0gIGlmIChzeW1leHByLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmc3ltZXhwcik7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2wpLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gIGFscGhhX2V2YXhfcHJvYy5zeW1ib2wgPSBzeW1ib2w7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIFBhcnNlIC5mcmFtZSA8ZnJhbXJlZz4sPGZyYW1lc2l6ZT4sUkEsPHJzYV9vZmZzZXQ+IGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mcmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVyZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcKLSAgICAgIHx8IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMS4vMi4gcGFyYW0iKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFscGhhX2V2YXhfcHJvYy5mcmFtZXNpemUgPSB2YWw7Ci0KLSAgKHZvaWQpIHRjX2dldF9yZWdpc3RlciAoMSk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMy4vNC4gcGFyYW0iKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBhbHBoYV9ldmF4X3Byb2MucnNhX29mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfcGRlc2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLSAgbG9uZyB2YWw7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgc3ltYm9sUyAqZW50cnlfc3ltOwotICBmaXhTICpmaXhwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChhbHBoYV9saW5rX3NlY3Rpb24pOwotCi0gIGlmIChub3dfc2VnICE9IGFscGhhX2xpbmtfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5wZGVzYyBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sID09IDApCi0gICAgICB8fCAoIVNfSVNfREVGSU5FRCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCkpKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCIucGRlc2MgaGFzIG5vIG1hdGNoaW5nIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqc3ltYm9sX2dldF9vYmogKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wpID0KLSAgICAodmFsdWVUKSBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZTsKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5wZGVzYyBkaXJlY3RpdmUgaGFzIG5vIGVudHJ5IHN5bWJvbCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVudHJ5X3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZleHApOwotICAvKiBTYXZlIGJmZCBzeW1ib2wgb2YgcHJvYyBkZXNjIGluIGZ1bmN0aW9uIHN5bWJvbC4gICovCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKS0+dWRhdGEucAotICAgID0gc3ltYm9sX2dldF9iZmRzeW0gKGVudHJ5X3N5bSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJObyBjb21tYSBhZnRlciAucGRlc2MgPGVudHJ5bmFtZT4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKHN0cm5jbXAobmFtZSwgInN0YWNrIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSBQRFNDX1NfS19LSU5EX0ZQX1NUQUNLOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcChuYW1lLCAicmVnIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcChuYW1lLCAibnVsbCIsIDQpID09IDApCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID0gUERTQ19TX0tfS0lORF9OVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIHByb2NlZHVyZSBraW5kIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBmcmFnX2FsaWduICgzLCAwLCAwKTsKLSAgcCA9IGZyYWdfbW9yZSAoMTYpOwotICBmaXhwID0gZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgMCwgMCwgMCwgMCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSAxNjsKLQotICAqcCA9IGFscGhhX2V2YXhfcHJvYy5wZHNja2luZAotICAgICAgIHwgKChhbHBoYV9ldmF4X3Byb2MuZnJhbWVyZWcgPT0gMjkpID8gUERTQ19TX01fQkFTRV9SRUdfSVNfRlAgOiAwKTsKLSAgKihwKzEpID0gUERTQ19TX01fTkFUSVZFCi0JICAgfCBQRFNDX1NfTV9OT19KQUNLRVQ7Ci0KLSAgc3dpdGNoIChhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQpCi0gICAgewotICAgICAgY2FzZSBQRFNDX1NfS19LSU5EX05VTEw6Ci0JKihwKzIpID0gMDsKLQkqKHArMykgPSAwOwotCWJyZWFrOwotICAgICAgY2FzZSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSOgotCSoocCsyKSA9IGFscGhhX2V2YXhfcHJvYy5mcF9zYXZlOwotCSoocCszKSA9IGFscGhhX2V2YXhfcHJvYy5yYV9zYXZlOwotCWJyZWFrOwotICAgICAgY2FzZSBQRFNDX1NfS19LSU5EX0ZQX1NUQUNLOgotCW1kX251bWJlcl90b19jaGFycyAocCsyLCAodmFsdWVUKWFscGhhX2V2YXhfcHJvYy5yc2Ffb2Zmc2V0LCAyKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6CQkvKiBpbXBvc3NpYmxlICovCi0JYnJlYWs7Ci0gICAgfQotCi0gICoocCs0KSA9IDA7Ci0gICoocCs1KSA9IGFscGhhX2V2YXhfcHJvYy50eXBlICYgMHgwZjsKLQotICAvKiBTaWduYXR1cmUgb2Zmc2V0LiAgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwKzYsICh2YWx1ZVQpMCwgMik7Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwLWZyYWdfbm93LT5mcl9saXRlcmFsKzgsIDgsICZleHAsIDAsIEJGRF9SRUxPQ182NCk7Ci0KLSAgaWYgKGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9PSBQRFNDX1NfS19LSU5EX05VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIEFkZCBkdW1teSBmaXggdG8gbWFrZSBhZGRfdG9fbGlua19wb29sIHdvcmsuICAqLwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgZml4cCA9IGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsIDAsIDAsIDAsIDApOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gODsKLQotICAvKiBwZGVzYysxNjogU2l6ZS4gICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVClhbHBoYV9ldmF4X3Byb2MuZnJhbWVzaXplLCA0KTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNCwgKHZhbHVlVCkwLCAyKTsKLQotICAvKiBFbnRyeSBsZW5ndGguICAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNiwgYWxwaGFfZXZheF9wcm9jLnByb2xvZ3VlLCAyKTsKLQotICBpZiAoYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID09IFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVIpCi0gICAgcmV0dXJuOwotCi0gIC8qIEFkZCBkdW1teSBmaXggdG8gbWFrZSBhZGRfdG9fbGlua19wb29sIHdvcmsuICAqLwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgZml4cCA9IGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsIDAsIDAsIDAsIDApOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gODsKLQotICAvKiBwZGVzYysyNDogcmVnaXN0ZXIgbWFza3MuICAqLwotCi0gIG1kX251bWJlcl90b19jaGFycyAocCwgYWxwaGFfZXZheF9wcm9jLmltYXNrLCA0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwKzQsIGFscGhhX2V2YXhfcHJvYy5mbWFzaywgNCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFN1cHBvcnQgZm9yIGNyYXNoIGRlYnVnIG9uIHZtcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX25hbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChhbHBoYV9saW5rX3NlY3Rpb24pOwotCi0gIGlmIChub3dfc2VnICE9IGFscGhhX2xpbmtfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5uYW1lIGRpcmVjdGl2ZSBub3QgaW4gbGluayAoLmxpbmspIHNlY3Rpb24iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5uYW1lIGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZnJhZ19hbGlnbiAoMywgMCwgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKDgpOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgJmV4cCwgMCwgQkZEX1JFTE9DXzY0KTsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbGlua2FnZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKnA7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIk5vIHN5bWJvbCBhZnRlciAubGlua2FnZSIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwID0gZnJhZ19tb3JlIChMS1BfU19LX1NJWkUpOwotICAgICAgbWVtc2V0IChwLCAwLCBMS1BfU19LX1NJWkUpOwotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIExLUF9TX0tfU0laRSwgJmV4cCwgMCxcCi0JCSAgIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2NvZGVfYWRkcmVzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKnA7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIk5vIHN5bWJvbCBhZnRlciAuY29kZV9hZGRyZXNzIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHAgPSBmcmFnX21vcmUgKDgpOwotICAgICAgbWVtc2V0IChwLCAwLCA4KTsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAmZXhwLCAwLFwKLQkJICAgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2ZwX3NhdmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLQotICBhbHBoYV9ldmF4X3Byb2MuZnBfc2F2ZSA9IHRjX2dldF9yZWdpc3RlciAoMSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX21hc2sgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5pbWFzayA9IHZhbDsKLSAgICAgICh2b2lkKWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZm1hc2sgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mbWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MuZm1hc2sgPSB2YWw7Ci0gICAgICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgYzsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sID0gMDsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZmlsZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzOwotICBpbnQgbGVuZ3RoOwotICBzdGF0aWMgY2hhciBjYXNlX2hhY2tbMzJdOwotCi0gIGV4dGVybiBjaGFyICpkZW1hbmRfY29weV9zdHJpbmcgUEFSQU1TICgoaW50ICpsZW5QKSk7Ci0KLSAgc3ByaW50ZiAoY2FzZV9oYWNrLCAiPENBU0U6JTAxZCUwMWQ+IiwKLQkgICBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcywgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jKTsKLQotICBzID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoY2FzZV9oYWNrKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHMpLT5mbGFncyB8PSBCU0ZfRklMRTsKLQotICBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgcyA9IHN5bWJvbF9maW5kX29yX21ha2UgKGRlbWFuZF9jb3B5X3N0cmluZyAoJmxlbmd0aCkpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAocyktPmZsYWdzIHw9IEJTRl9GSUxFOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLSNlbmRpZiAvKiBPQkpfRVZBWCAgKi8KLQotLyogSGFuZGxlIHRoZSAuZ3ByZWwzMiBwc2V1ZG8gb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9ncHJlbDMyIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIGNoYXIgKnA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBleHByZXNzaW9uICgmZSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBlLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sKGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgZS5YX29wID0gT19zeW1ib2w7Ci0gICAgICAvKiBGQUxMVEhSVSAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0jZWxzZQotI2lmZGVmIE9CSl9FQ09GRgotICBzd2l0Y2ggKGUuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgZS5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgZS5YX29wID0gT19zdWJ0cmFjdDsKLSAgICAgIGUuWF9vcF9zeW1ib2wgPSBhbHBoYV9ncF9zeW1ib2w7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLSAgICBhbHBoYV9hbGlnbiAoMiwgKGNoYXIgKikgTlVMTCwgYWxwaGFfaW5zbl9sYWJlbCwgMCk7Ci0gIGlmIChhbHBoYV9jdXJyZW50X2FsaWduID4gMikKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gMjsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1lbXNldCAocCwgMCwgNCk7Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkgICAgICAgJmUsIDAsIEJGRF9SRUxPQ19HUFJFTDMyKTsKLX0KLQotLyogSGFuZGxlIGZsb2F0aW5nIHBvaW50IGFsbG9jYXRpb24gcHNldWRvLW9wcy4gIFRoaXMgaXMgbGlrZSB0aGUKLSAgIGdlbmVyaWMgdnJlc2lvbiwgYnV0IGl0IG1ha2VzIHN1cmUgdGhlIGN1cnJlbnQgbGFiZWwsIGlmIGFueSwgaXMKLSAgIGNvcnJlY3RseSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZmxvYXRfY29ucyAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGludCBsb2dfc2l6ZTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICBsb2dfc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ0cnOgotICAgICAgbG9nX3NpemUgPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIGxvZ19zaXplID0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotCi0gIGZsb2F0X2NvbnMgKHR5cGUpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5wcm9jIHBzZXVkbyBvcC4gIFdlIGRvbid0IHJlYWxseSBkbyBtdWNoIHdpdGggaXQgZXhjZXB0Ci0gICBwYXJzZSBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3Byb2MgKGlzX3N0YXRpYykKLSAgICAgaW50IGlzX3N0YXRpYzsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgdGVtcDsKLQotICAvKiBUYWtlcyAiLnByb2MgbmFtZSxuYXJncyIgICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKnAgPSAwOwotICAgICAgYXNfd2FybiAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICB0ZW1wID0gMDsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICAvKiAgKnN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKSA9IChzaWduZWQgY2hhcikgdGVtcDsgKi8KLSAgYXNfd2FybiAoXygidW5oYW5kbGVkOiAucHJvYyAlcywlZCIpLCBuYW1lLCB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuc2V0IHBzZXVkbyBvcC4gIFRoaXMgaXMgdXNlZCB0byB0dXJuIG9uIGFuZCBvZmYgbW9zdCBvZgotICAgdGhlIGFzc2VtYmxlciBmZWF0dXJlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NldCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGNoYXIgKm5hbWUsIGNoLCAqczsKLSAgaW50IHllc25vID0gMTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgcyA9IG5hbWU7Ci0gIGlmIChzWzBdID09ICduJyAmJiBzWzFdID09ICdvJykKLSAgICB7Ci0gICAgICB5ZXNubyA9IDA7Ci0gICAgICBzICs9IDI7Ci0gICAgfQotICBpZiAoIXN0cmNtcCAoInJlb3JkZXIiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlIGlmICghc3RyY21wICgiYXQiLCBzKSkKLSAgICBhbHBoYV9ub2F0X29uID0gIXllc25vOwotICBlbHNlIGlmICghc3RyY21wICgibWFjcm8iLCBzKSkKLSAgICBhbHBoYV9tYWNyb3Nfb24gPSB5ZXNubzsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoIm1vdmUiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlIGlmICghc3RyY21wICgidm9sYXRpbGUiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlCi0gICAgYXNfd2FybiAoXygiVHJpZWQgdG8gLnNldCB1bnJlY29nbml6ZWQgbW9kZSBgJXMnIiksIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYmFzZSBwc2V1ZG8gb3AuICBUaGlzIGNoYW5nZXMgdGhlIGFzc2VtYmxlcidzIG5vdGlvbiBvZgotICAgdGhlICRncCByZWdpc3Rlci4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2Jhc2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSNpZiAwCi0gIGlmIChmaXJzdF8zMmJpdF9xdWFkcmFudCkKLSAgICB7Ci0gICAgICAvKiBub3QgZmF0YWwsIGJ1dCBpdCBtaWdodCBub3Qgd29yayBpbiB0aGUgZW5kICovCi0gICAgICBhc193YXJuIChfKCJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iKSk7Ci0gICAgICBmaXJzdF8zMmJpdF9xdWFkcmFudCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCi0gICAgewkJCQkvKiAkck5OIGZvcm0gKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3InKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBhbHBoYV9ncF9yZWdpc3RlciA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxwaGFfZ3BfcmVnaXN0ZXIgPCAwIHx8IGFscGhhX2dwX3JlZ2lzdGVyID4gMzEpCi0gICAgewotICAgICAgYWxwaGFfZ3BfcmVnaXN0ZXIgPSBBWFBfUkVHX0dQOwotICAgICAgYXNfd2FybiAoXygiQmFkIGJhc2UgcmVnaXN0ZXIsIHVzaW5nICQlZC4iKSwgYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3AuICBUaGlzIGFsaWducyB0byBhIHBvd2VyIG9mIHR3by4gIEl0Ci0gICBhbHNvIGFkanVzdHMgYW55IGN1cnJlbnQgaW5zdHJ1Y3Rpb24gbGFiZWwuICBXZSB0cmVhdCB0aGlzIHRoZSBzYW1lCi0gICB3YXkgdGhlIE1JUFMgcG9ydCBkb2VzOiAuYWxpZ24gMCB0dXJucyBvZmYgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9hbGlnbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgYWxpZ247Ci0gIGNoYXIgZmlsbCwgKnBmaWxsOwotICBsb25nIG1heF9hbGlnbm1lbnQgPSAxNTsKLQotICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotICAgIHsKLSAgICAgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQiKSwgYWxpZ24pOwotICAgIH0KLSAgZWxzZSBpZiAoYWxpZ24gPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkIikpOwotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwZmlsbCA9ICZmaWxsOwotICAgIH0KLSAgZWxzZQotICAgIHBmaWxsID0gTlVMTDsKLQotICBpZiAoYWxpZ24gIT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgICAgIGFscGhhX2FsaWduIChhbGlnbiwgcGZpbGwsIGFscGhhX2luc25fbGFiZWwsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFscGhhX2F1dG9fYWxpZ25fb24gPSAwOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIb29rIHRoZSBub3JtYWwgc3RyaW5nIHByb2Nlc3NvciB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zdHJpbmdlciAodGVybWluYXRlKQotICAgICBpbnQgdGVybWluYXRlOwotewotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIHN0cmluZ2VyICh0ZXJtaW5hdGUpOwotfQotCi0vKiBIb29rIHRoZSBub3JtYWwgc3BhY2UgcHJvY2Vzc2luZyB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zcGFjZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIHNfc3BhY2UgKGlnbm9yZSk7Ci19Ci0KLS8qIEhvb2sgaW50byBjb25zIGZvciBhdXRvLWFsaWdubWVudC4gICovCi0KLXZvaWQKLWFscGhhX2NvbnNfYWxpZ24gKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBpbnQgbG9nX3NpemU7Ci0KLSAgbG9nX3NpemUgPSAwOwotICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCi0gICAgKytsb2dfc2l6ZTsKLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotfQotCi0vKiBIZXJlIGNvbWUgdGhlIC51d29yZCwgLnVsb25nLCBhbmQgLnVxdWFkIGV4cGxpY2l0bHkgdW5hbGlnbmVkCi0gICBwc2V1ZG9zLiAgV2UganVzdCB0dXJuIG9mZiBhdXRvLWFsaWdubWVudCBhbmQgY2FsbCBkb3duIHRvIGNvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV91Y29ucyAoYnl0ZXMpCi0gICAgIGludCBieXRlczsKLXsKLSAgaW50IGhvbGQgPSBhbHBoYV9hdXRvX2FsaWduX29uOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMDsKLSAgY29ucyAoYnl0ZXMpOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gaG9sZDsKLX0KLQotLyogU3dpdGNoIHRoZSB3b3JraW5nIGNwdSB0eXBlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfYXJjaCAoaWdub3JlZCkKLSAgICAgaW50IGlnbm9yZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGNoOwotICBjb25zdCBzdHJ1Y3QgY3B1X3R5cGUgKnA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGZvciAocCA9IGNwdV90eXBlczsgcC0+bmFtZTsgKytwKQotICAgIGlmIChzdHJjbXAobmFtZSwgcC0+bmFtZSkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgYWxwaGFfdGFyZ2V0X25hbWUgPSBwLT5uYW1lLCBhbHBoYV90YXJnZXQgPSBwLT5mbGFnczsKLQlnb3RvIGZvdW5kOwotICAgICAgfQotICBhc193YXJuKCJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciLCBuYW1lKTsKLQotZm91bmQ6Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotDAotCi0jaWZkZWYgREVCVUcxCi0vKiBwcmludCB0b2tlbiBleHByZXNzaW9uIHdpdGggYWxwaGEgc3BlY2lmaWMgZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX3ByaW50X3Rva2VuKGYsIGV4cCkKLSAgICBGSUxFICpmOwotICAgIGNvbnN0IGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICAgIGNhc2UgT19jcHJlZ2lzdGVyOgotCXB1dGMgKCcsJywgZik7Ci0JLyogRkFMTFRIUlUgKi8KLSAgICAgIGNhc2UgT19wcmVnaXN0ZXI6Ci0JcHV0YyAoJygnLCBmKTsKLQl7Ci0JICBleHByZXNzaW9uUyBuZXhwID0gKmV4cDsKLQkgIG5leHAuWF9vcCA9IE9fcmVnaXN0ZXI7Ci0JICBwcmludF9leHByIChmLCAmbmV4cCk7Ci0JfQotCXB1dGMgKCcpJywgZik7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXByaW50X2V4cHIgKGYsIGV4cCk7Ci0JYnJlYWs7Ci0gICAgfQotICByZXR1cm47Ci19Ci0jZW5kaWYKLQwKLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgeyJjb21tIiwgc19hbHBoYV9jb21tLCAwfSwJLyogb3NmMSBjb21waWxlciBkb2VzIHRoaXMgKi8KLSAgeyJyZGF0YSIsIHNfYWxwaGFfcmRhdGEsIDB9LAotI2VuZGlmCi0gIHsidGV4dCIsIHNfYWxwaGFfdGV4dCwgMH0sCi0gIHsiZGF0YSIsIHNfYWxwaGFfZGF0YSwgMH0sCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIHsic2RhdGEiLCBzX2FscGhhX3NkYXRhLCAwfSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgeyJzZWN0aW9uIiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0aW9uLnMiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotICB7InNlY3QucyIsIHNfYWxwaGFfc2VjdGlvbiwgMH0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotICB7ICJwZGVzYyIsIHNfYWxwaGFfcGRlc2MsIDB9LAotICB7ICJuYW1lIiwgc19hbHBoYV9uYW1lLCAwfSwKLSAgeyAibGlua2FnZSIsIHNfYWxwaGFfbGlua2FnZSwgMH0sCi0gIHsgImNvZGVfYWRkcmVzcyIsIHNfYWxwaGFfY29kZV9hZGRyZXNzLCAwfSwKLSAgeyAiZW50Iiwgc19hbHBoYV9lbnQsIDB9LAotICB7ICJmcmFtZSIsIHNfYWxwaGFfZnJhbWUsIDB9LAotICB7ICJmcF9zYXZlIiwgc19hbHBoYV9mcF9zYXZlLCAwfSwKLSAgeyAibWFzayIsIHNfYWxwaGFfbWFzaywgMH0sCi0gIHsgImZtYXNrIiwgc19hbHBoYV9mbWFzaywgMH0sCi0gIHsgImVuZCIsIHNfYWxwaGFfZW5kLCAwfSwKLSAgeyAiZmlsZSIsIHNfYWxwaGFfZmlsZSwgMH0sCi0gIHsgInJkYXRhIiwgc19hbHBoYV9zZWN0aW9uLCAxfSwKLSAgeyAiY29tbSIsIHNfYWxwaGFfY29tbSwgMH0sCi0gIHsgImxpbmsiLCBzX2FscGhhX3NlY3Rpb24sIDN9LAotICB7ICJjdG9ycyIsIHNfYWxwaGFfc2VjdGlvbiwgNH0sCi0gIHsgImR0b3JzIiwgc19hbHBoYV9zZWN0aW9uLCA1fSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgLyogRnJhbWUgcmVsYXRlZCBwc2V1ZG9zLiAgKi8KLSAgeyJlbnQiLCBzX2FscGhhX2VudCwgMH0sCi0gIHsiZW5kIiwgc19hbHBoYV9lbmQsIDB9LAotICB7Im1hc2siLCBzX2FscGhhX21hc2ssIDB9LAotICB7ImZtYXNrIiwgc19hbHBoYV9tYXNrLCAxfSwKLSAgeyJmcmFtZSIsIHNfYWxwaGFfZnJhbWUsIDB9LAotICB7InByb2xvZ3VlIiwgc19hbHBoYV9wcm9sb2d1ZSwgMH0sCi0gIC8qIENPRkYgZGVidWdnaW5nIHJlbGF0ZWQgcHNldWRvcy4gICovCi0gIHsiYmVnaW4iLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMH0sCi0gIHsiYmVuZCIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCAxfSwKLSAgeyJkZWYiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMn0sCi0gIHsiZGltIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDN9LAotICB7ImVuZGVmIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDR9LAotICB7ImZpbGUiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgNX0sCi0gIHsic2NsIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDZ9LAotICB7InRhZyIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA3fSwKLSAgeyJ2YWwiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgOH0sCi0gIHsibG9jIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDl9LAotI2Vsc2UKLSAgeyJwcm9sb2d1ZSIsIHNfaWdub3JlLCAwfSwKLSNlbmRpZgotICB7ImdwcmVsMzIiLCBzX2FscGhhX2dwcmVsMzIsIDB9LAotICB7InRfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsic19mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJmX2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnRid9LAotICB7ImdfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdHJ30sCi0gIHsiZF9mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ0QnfSwKLQotICB7InByb2MiLCBzX2FscGhhX3Byb2MsIDB9LAotICB7ImFwcm9jIiwgc19hbHBoYV9wcm9jLCAxfSwKLSAgeyJzZXQiLCBzX2FscGhhX3NldCwgMH0sCi0gIHsicmVndXNlIiwgc19pZ25vcmUsIDB9LAotICB7ImxpdmVyZWciLCBzX2lnbm9yZSwgMH0sCi0gIHsiYmFzZSIsIHNfYWxwaGFfYmFzZSwgMH0sCQkvKj8/Ki8KLSAgeyJvcHRpb24iLCBzX2lnbm9yZSwgMH0sCi0gIHsiYWVudCIsIHNfaWdub3JlLCAwfSwKLSAgeyJ1Z2VuIiwgc19pZ25vcmUsIDB9LAotICB7ImVmbGFnIiwgc19pZ25vcmUsIDB9LAotCi0gIHsiYWxpZ24iLCBzX2FscGhhX2FsaWduLCAwfSwKLSAgeyJkb3VibGUiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmxvYXQiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsic2luZ2xlIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZid9LAotICB7ImFzY2lpIiwgc19hbHBoYV9zdHJpbmdlciwgMH0sCi0gIHsiYXNjaXoiLCBzX2FscGhhX3N0cmluZ2VyLCAxfSwKLSAgeyJzdHJpbmciLCBzX2FscGhhX3N0cmluZ2VyLCAxfSwKLSAgeyJzcGFjZSIsIHNfYWxwaGFfc3BhY2UsIDB9LAotICB7InNraXAiLCBzX2FscGhhX3NwYWNlLCAwfSwKLSAgeyJ6ZXJvIiwgc19hbHBoYV9zcGFjZSwgMH0sCi0KLS8qIFVuYWxpZ25lZCBkYXRhIHBzZXVkb3MuICAqLwotICB7InV3b3JkIiwgc19hbHBoYV91Y29ucywgMn0sCi0gIHsidWxvbmciLCBzX2FscGhhX3Vjb25zLCA0fSwKLSAgeyJ1cXVhZCIsIHNfYWxwaGFfdWNvbnMsIDh9LAotCi0jaWZkZWYgT0JKX0VMRgotLyogRHdhcmYgd2FudHMgdGhlc2UgdmVyc2lvbnMgb2YgdW5hbGlnbmVkLiAgKi8KLSAgeyIyYnl0ZSIsIHNfYWxwaGFfdWNvbnMsIDJ9LAotICB7IjRieXRlIiwgc19hbHBoYV91Y29ucywgNH0sCi0gIHsiOGJ5dGUiLCBzX2FscGhhX3Vjb25zLCA4fSwKLSNlbmRpZgotCi0vKiBXZSBkb24ndCBkbyBhbnkgb3B0aW1pemluZywgc28gd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlc2UuICAqLwotICB7Im5vYWxpYXMiLCBzX2lnbm9yZSwgMH0sCi0gIHsiYWxpYXMiLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJhcmNoIiwgc19hbHBoYV9hcmNoLCAwfSwKLQotICB7TlVMTCwgMCwgMH0sCi19OwotCi0MCi0vKiBCdWlsZCBhIEJGRCBzZWN0aW9uIHdpdGggaXRzIGZsYWdzIHNldCBhcHByb3ByaWF0ZWx5IGZvciB0aGUgLmxpdGEsCi0gICAubGl0OCwgb3IgLmxpdDQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAobmFtZSwgc2VjcCwgc3ltcCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc2VnVCAqc2VjcDsKLSAgICAgc3ltYm9sUyAqKnN5bXA7Ci17Ci0gIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgc2VnVCBuZXdfc2VjOwotCi0gICpzZWNwID0gbmV3X3NlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBuZXdfc2VjLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5ld19zZWMsCi0JCQkgU0VDX1JFTE9DIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkKLQkJCSB8IFNFQ19EQVRBKTsKLQotICBTX0NMRUFSX0VYVEVSTkFMICgqc3ltcCA9IHNlY3Rpb25fc3ltYm9sIChuZXdfc2VjKSk7Ci19Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLQotLyogQEBAIEdQIHNlbGVjdGlvbiB2b29kb28uICBBbGwgb2YgdGhpcyBzZWVtcyBvdmVybHkgY29tcGxpY2F0ZWQgYW5kCi0gICB1bm5lY2Vzc2FyeTsgd2hpY2ggaXMgdGhlIHByaW1hcnkgcmVhc29uIGl0J3MgZm9yIEVDT0ZGIG9ubHkuICAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1heWJlX3NldF9ncCAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBiZmRfdm1hIHZtYTsKLSAgaWYgKCFzZWMpCi0gICAgcmV0dXJuOwotICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChmb28sIHNlYyk7Ci0gIGlmICh2bWEgJiYgdm1hIDwgYWxwaGFfZ3BfdmFsdWUpCi0gICAgYWxwaGFfZ3BfdmFsdWUgPSB2bWE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZWxlY3RfZ3BfdmFsdWUgKCkKLXsKLSAgYXNzZXJ0IChhbHBoYV9ncF92YWx1ZSA9PSAwKTsKLQotICAvKiBHZXQgbWludXMtb25lIGluIHdoYXRldmVyIHdpZHRoLi4uICAqLwotICBhbHBoYV9ncF92YWx1ZSA9IDA7IGFscGhhX2dwX3ZhbHVlLS07Ci0KLSAgLyogU2VsZWN0IHRoZSBzbWFsbGVzdCBWTUEgb2YgdGhlc2UgZXhpc3Rpbmcgc2VjdGlvbnMuICAqLwotICBtYXliZV9zZXRfZ3AgKGFscGhhX2xpdGFfc2VjdGlvbik7Ci0jaWYgMAotICAvKiBUaGVzZSB3ZXJlIGRpc2FibGVkIGJlZm9yZSAtLSBzaG91bGQgd2UgdXNlIHRoZW0/ICAqLwotICBtYXliZV9zZXRfZ3AgKHNkYXRhKTsKLSAgbWF5YmVfc2V0X2dwIChsaXQ4X3NlYyk7Ci0gIG1heWJlX3NldF9ncCAobGl0NF9zZWMpOwotI2VuZGlmCi0KLS8qIEBAIFdpbGwgYSBzaW1wbGUgMHg4MDAwIHdvcmsgaGVyZT8gIElmIG5vdCwgd2h5IG5vdD8gICovCi0jZGVmaW5lIEdQX0FESlVTVE1FTlQJKDB4ODAwMCAtIDB4MTApCi0KLSAgYWxwaGFfZ3BfdmFsdWUgKz0gR1BfQURKVVNUTUVOVDsKLQotICBTX1NFVF9WQUxVRSAoYWxwaGFfZ3Bfc3ltYm9sLCBhbHBoYV9ncF92YWx1ZSk7Ci0KLSNpZmRlZiBERUJVRzEKLSAgcHJpbnRmIChfKCJDaG9zZSBHUCB2YWx1ZSBvZiAlbHhcbiIpLCBhbHBoYV9ncF92YWx1ZSk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBPQkpfRUNPRkYgKi8KLQotLyogQ2FsbGVkIGludGVybmFsbHkgdG8gaGFuZGxlIGFsbCBhbGlnbm1lbnQgbmVlZHMuICBUaGlzIHRha2VzIGNhcmUKLSAgIG9mIGVsaWRpbmcgY2FsbHMgdG8gZnJhZ19hbGlnbiBpZiduIHRoZSBjYWNoZWQgY3VycmVudCBhbGlnbm1lbnQKLSAgIHNheXMgd2UndmUgYWxyZWFkeSBnb3QgaXQsIGFzIHdlbGwgYXMgdGFraW5nIGNhcmUgb2YgdGhlIGF1dG8tYWxpZ24KLSAgIGZlYXR1cmUgd3J0IGxhYmVscy4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hbGlnbiAobiwgcGZpbGwsIGxhYmVsLCBmb3JjZSkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKnBmaWxsOwotICAgICBzeW1ib2xTICpsYWJlbDsKLSAgICAgaW50IGZvcmNlOwotewotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+PSBuKQotICAgIHJldHVybjsKLQotICBpZiAocGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA+IDIKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLQl7Ci0JICBzdGF0aWMgY2hhciBjb25zdCB1bm9wWzRdID0geyAweDAwLCAweDAwLCAweGUwLCAweDJmIH07Ci0JICBzdGF0aWMgY2hhciBjb25zdCBub3B1bm9wWzhdID0gewotCQkweDFmLCAweDA0LCAweGZmLCAweDQ3LAotCQkweDAwLCAweDAwLCAweGUwLCAweDJmCi0JICB9OwotCi0JICAvKiBGaXJzdCwgbWFrZSBzdXJlIHdlJ3JlIG9uIGEgZm91ci1ieXRlIGJvdW5kYXJ5LCBpbiBjYXNlCi0JICAgICBzb21lb25lIGhhcyBiZWVuIHB1dHRpbmcgLmJ5dGUgdmFsdWVzIGludG8gdGhlIHRleHQKLQkgICAgIHNlY3Rpb24uICBUaGUgREVDIGFzc2VtYmxlciBzaWxlbnRseSBmaWxscyB3aXRoIHVuYWxpZ25lZAotCSAgICAgbm8tb3AgaW5zdHJ1Y3Rpb25zLiAgVGhpcyB3aWxsIHplcm8tZmlsbCwgdGhlbiBub3AtZmlsbAotCSAgICAgd2l0aCBwcm9wZXIgYWxpZ25tZW50LiAgKi8KLQkgIGlmIChhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLQkgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0JICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA8IDMpCi0JICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMywgdW5vcCwgc2l6ZW9mIHVub3AsIDApOwotCSAgaWYgKG4gPiAzKQotCSAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcHVub3AsIHNpemVvZiBub3B1bm9wLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbiAobiwgMCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKLQotICBhbHBoYV9jdXJyZW50X2FsaWduID0gbjsKLQotICBpZiAobGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGFiZWwsIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChsYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICB9Ci0KLSAgcmVjb3JkX2FsaWdubWVudChub3dfc2VnLCBuKTsKLQotICAvKiA/Pz8gaWYgYWxwaGFfZmxhZ19yZWxheCAmJiBmb3JjZSAmJiBlbGYsIHJlY29yZCB0aGUgcmVxdWVzdGVkIGFsaWdubWVudAotICAgICBpbiBhIHJlbG9jIGZvciB0aGUgbGlua2VyIHRvIHNlZS4gICovCi19Ci0KLS8qIFRoZSBBbHBoYSBoYXMgc3VwcG9ydCBmb3Igc29tZSBWQVggZmxvYXRpbmcgcG9pbnQgdHlwZXMsIGFzIHdlbGwgYXMgZm9yCi0gICBJRUVFIGZsb2F0aW5nIHBvaW50LiAgV2UgY29uc2lkZXIgSUVFRSB0byBiZSB0aGUgcHJpbWFyeSBmbG9hdGluZyBwb2ludAotICAgZm9ybWF0LCBhbmQgc25lYWsgaW4gdGhlIFZBWCBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGhlcmUuICAqLwotI2RlZmluZSBtZF9hdG9mIHZheF9tZF9hdG9mCi0jaW5jbHVkZSAiY29uZmlnL2F0b2YtdmF4LmMiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFscGhhLmggYi9nYXMvY29uZmlnL3RjLWFscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTA1MTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1hbHBoYS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiA8cmFlYnVybkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19BTFBIQQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCQliZmRfYXJjaF9hbHBoYQotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCVwKLQkJICAgICAgID8gImVjb2ZmLWxpdHRsZWFscGhhIgkJCQlcCi0JCSAgICAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cglcCi0JCSAgICAgICA/ICJlbGY2NC1hbHBoYSIJCQkJCVwKLQkJICAgICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cglcCi0JCSAgICAgICA/ICJ2bXMtYWxwaGEiCQkJCQlcCi0JCSAgICAgICA6ICJ1bmtub3duLWZvcm1hdCIpCi0KLSNkZWZpbmUgTkVFRF9MSVRFUkFMX1BPT0wKLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0jZGVmaW5lIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0KLWV4dGVybiBpbnQgYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLWV4dGVybiBpbnQgYWxwaGFfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGFscGhhX2dwcm1hc2ssIGFscGhhX2Zwcm1hc2s7Ci1leHRlcm4gdmFsdWVUIGFscGhhX2dwX3ZhbHVlOwotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkJYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiAoRklYUCkKLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYUCkJCWFscGhhX2ZpeF9hZGp1c3RhYmxlIChGSVhQKQotI2RlZmluZSBSRUxPQ19SRVFVSVJFU19TWU1CT0wKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbAotICAgb2JqZWN0IGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuCi0gICBUcnVlIGlmIHdlIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nCi0gICB0aGUgLm8gZmlsZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucy4gICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkJCQkJXAotICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLSAgICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQlhc19mYXRhbCAoImFscGhhIGNvbnZlcnRfZnJhZ1xuIikKLSNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoZixzKSBcCi0JCQkoYXNfZmF0YWwoImVzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGNhbGxlZCIpLDEpCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2lmZGVmIE9CSl9FVkFYCi0KLS8qIFRoaXMgZmllbGQga2VlcHMgdGhlIHN5bWJvbHMgcG9zaXRpb24gaW4gdGhlIGxpbmsgc2VjdGlvbi4gICovCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHZhbHVlVAotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyhGUkFHLE9GRixMRU4sRVhQKSBcCi0gICAgICBmaXhfbmV3X2V4cCAoRlJBRywgT0ZGLCAoaW50KUxFTiwgRVhQLCAwLCBcCi0JTEVOID09IDIgPyBCRkRfUkVMT0NfMTYgXAotCTogTEVOID09IDQgPyBCRkRfUkVMT0NfMzIgXAotCTogTEVOID09IDggPyBCRkRfUkVMT0NfNjQgXAotCTogQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UpOwotI2VuZGlmCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzCQludW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCi0KLWV4dGVybiBpbnQgdGNfZ2V0X3JlZ2lzdGVyIFBBUkFNUyAoKGludCBmcmFtZSkpOwotZXh0ZXJuIHZvaWQgYWxwaGFfZnJvYl9lY29mZl9kYXRhIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgYWxwaGFfZGVmaW5lX2xhYmVsIChzeW0pCi1leHRlcm4gdm9pZCBhbHBoYV9kZWZpbmVfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpIGFscGhhX2NvbnNfYWxpZ24gKG5ieXRlcykKLWV4dGVybiB2b2lkIGFscGhhX2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSNkZWZpbmUgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QoKSBhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotZXh0ZXJuIHZvaWQgYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LICAgLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLCAgIFNIVF9QUk9HQklUUywgICBTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfQUxQSEFfR1BSRUwgIH0sIFwKLSAgeyAiLnNic3MiLCAgICBTSFRfTk9CSVRTLCAgICAgU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX0FMUEhBX0dQUkVMICB9LAotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFyYy5jIGIvZ2FzL2NvbmZpZy90Yy1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhZmVhMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NCArMCwwIEBACi0vKiB0Yy1hcmMuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBBUkMKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0KLWV4dGVybiBpbnQgYXJjX2dldF9tYWNoIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgYXJjX2luc24gYXJjX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKGFyY19pbnNuLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICosIGludCwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqLAotCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGFyY19jb21tb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcmNfY3B1IFBBUkFNUyAoKGludCkpOwotLypzdGF0aWMgdm9pZCBhcmNfcmVuYW1lIFBBUkFNUyAoKGludCkpOyovCi1zdGF0aWMgaW50IGdldF9hcmNfZXhwX3JlbG9jX3R5cGUgUEFSQU1TICgoaW50LCBpbnQsIGV4cHJlc3Npb25TICosCi0JCQkJCSAgIGV4cHJlc3Npb25TICopKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwIH0sCS8qIERlZmF1bHRpbmcgaXMgaW52YWxpZCAoMCkgKi8KLSAgeyAiY29tbW9uIiwgYXJjX2NvbW1vbiwgMCB9LAotLyp7ICJod29yZCIsIGNvbnMsIDIgfSwgLSBhbHJlYWR5IGV4aXN0cyAqLwotICB7ICJ3b3JkIiwgY29ucywgNCB9LAotLyp7ICJ4d29yZCIsIGNvbnMsIDggfSwqLwotICB7ICJjcHUiLCBhcmNfY3B1LCAwIH0sCi0vKnsgInJlbmFtZSIsIGFyY19yZW5hbWUsIDAgfSwqLwotICB7IE5VTEwsIDAsIDAgfSwKLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjOyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMKLSAgIHdvcmsgaWYgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRCI7Ci0KLS8qIEJ5dGUgb3JkZXIuICAqLwotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLWNvbnN0IGNoYXIgKmFyY190YXJnZXRfZm9ybWF0ID0gREVGQVVMVF9UQVJHRVRfRk9STUFUOwotc3RhdGljIGludCBieXRlX29yZGVyID0gREVGQVVMVF9CWVRFX09SREVSOwotCi0vKiBPbmUgb2YgYmZkX21hY2hfYXJjX3h4eC4gICovCi1zdGF0aWMgaW50IGFyY19tYWNoX3R5cGUgPSBiZmRfbWFjaF9hcmNfYmFzZTsKLQotLyogTm9uLXplcm8gaWYgdGhlIGNwdSB0eXBlIGhhcyBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgKi8KLXN0YXRpYyBpbnQgbWFjaF90eXBlX3NwZWNpZmllZF9wID0gMDsKLQotLyogTm9uLXplcm8gaWYgb3Bjb2RlIHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBBIC5jcHUgY29tbWFuZCBtdXN0IGFwcGVhciBiZWZvcmUgYW55IGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgaW50IGNwdV90YWJsZXNfaW5pdF9wID0gMDsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFyY19zdWZmaXhfaGFzaCA9IE5VTEw7Ci0MCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jZGVmaW5lIE9QVElPTl9FQiAoT1BUSU9OX01EX0JBU0UgKyAwKQotICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FQn0sCi0jZGVmaW5lIE9QVElPTl9FTCAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDAgfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqCi0gKiBJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICogU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLgotICovCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fRUI6Ci0gICAgICBieXRlX29yZGVyID0gQklHX0VORElBTjsKLSAgICAgIGFyY190YXJnZXRfZm9ybWF0ID0gImVsZjMyLWJpZ2FyYyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FTDoKLSAgICAgIGJ5dGVfb3JkZXIgPSBMSVRUTEVfRU5ESUFOOwotICAgICAgYXJjX3RhcmdldF9mb3JtYXQgPSAiZWxmMzItbGl0dGxlYXJjIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1BUkMgb3B0aW9uczpcblwKLS1FQgkJCWdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG5cCi0tRUwJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIG91dHB1dFxuIikpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4KLSAgIE9wY29kZSBzZWxlY3Rpb24gaXMgZGVmZXJlZCB1bnRpbCBsYXRlciBiZWNhdXNlIHdlIG1pZ2h0IHNlZSBhIC5jcHUKLSAgIGNvbW1hbmQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICAvKiBUaGUgZW5kaWFubmVzcyBjYW4gYmUgY2hvc2VuICJhdCB0aGUgZmFjdG9yeSIuICAqLwotICB0YXJnZXRfYmlnX2VuZGlhbiA9IGJ5dGVfb3JkZXIgPT0gQklHX0VORElBTjsKLQotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgYXJjX21hY2hfdHlwZSkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogQXNzdW1lIHRoZSBiYXNlIGNwdS4gIFRoaXMgY2FsbCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBuZWVkIHRvCi0gICAgIGluaXRpYWxpemUgYGFyY19vcGVyYW5kX21hcCcgd2hpY2ggbWF5IGJlIG5lZWRlZCBiZWZvcmUgd2Ugc2VlIHRoZQotICAgICBmaXJzdCBpbnNuLiAgKi8KLSAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoYXJjX2dldF9vcGNvZGVfbWFjaCAoYmZkX21hY2hfYXJjX2Jhc2UsCi0JCQkJCSAgICAgICB0YXJnZXRfYmlnX2VuZGlhbikpOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzIG9wY29kZSBhbmQgb3BlcmFuZCB0YWJsZXMuCi0gICBNQUNIIGlzIG9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfb3Bjb2RlX3RhYmxlcyAobWFjaCkKLSAgICAgaW50IG1hY2g7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICBjaGFyICpsYXN0OwotCi0gIGlmICgoYXJjX3N1ZmZpeF9oYXNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpKTsKLQotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgbWFjaCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogVGhpcyBpbml0aWFsaXplcyBhIGZldyB0aGluZ3MgaW4gYXJjLW9wYy5jIHRoYXQgd2UgbmVlZC4KLSAgICAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHZhcmlvdXMgYXJjX3h4eF9zdXBwb3J0ZWQgZm5zLiAgKi8KLSAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoYXJjX2dldF9vcGNvZGVfbWFjaCAobWFjaCwgdGFyZ2V0X2JpZ19lbmRpYW4pKTsKLQotICAvKiBPbmx5IHB1dCB0aGUgZmlyc3QgZW50cnkgb2YgZWFjaCBlcXVpdmFsZW50bHkgbmFtZWQgc3VmZml4IGluIHRoZQotICAgICB0YWJsZS4gICovCi0gIGxhc3QgPSAiIjsKLSAgZm9yIChpID0gMDsgaSA8IGFyY19zdWZmaXhlc19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFyY19vcHZhbF9zdXBwb3J0ZWQgKCZhcmNfc3VmZml4ZXNbaV0pKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN0cmNtcCAoYXJjX3N1ZmZpeGVzW2ldLm5hbWUsIGxhc3QpICE9IDApCi0JaGFzaF9pbnNlcnQgKGFyY19zdWZmaXhfaGFzaCwgYXJjX3N1ZmZpeGVzW2ldLm5hbWUsIChQVFIpIChhcmNfc3VmZml4ZXMgKyBpKSk7Ci0gICAgICBsYXN0ID0gYXJjX3N1ZmZpeGVzW2ldLm5hbWU7Ci0gICAgfQotCi0gIC8qIFNpbmNlIHJlZ2lzdGVycyBkb24ndCBoYXZlIGEgcHJlZml4LCB3ZSBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCi0gICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcwotICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAgVGhlIHJlY29yZGVkIHJlZ2lzdGVyIG51bWJlciBpcwotICAgICB0aGUgaW5kZXggaW4gYGFyY19yZWdfbmFtZXMnLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGFyY19yZWdfbmFtZXNfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBhcmNfb3B2YWxfc3VwcG9ydGVkICgmYXJjX3JlZ19uYW1lc1tpXSkpCi0JY29udGludWU7Ci0gICAgICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBoZXJlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLQkgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChhcmNfcmVnX25hbWVzW2ldLm5hbWUsIHJlZ19zZWN0aW9uLAotCQkJCQkgIGksICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICAgIH0KLQotICAvKiBUZWxsIGBzX2NwdScgaXQncyB0b28gbGF0ZS4gICovCi0gIGNwdV90YWJsZXNfaW5pdF9wID0gMTsKLX0KLQwKLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uCi0gICBJZiBSRUcgaXMgbm9uLU5VTEwsIGl0IGlzIGEgcmVnaXN0ZXIgbnVtYmVyIGFuZCBpZ25vcmUgVkFMLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1hcmNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsLCBmaWxlLCBsaW5lKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMikKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdOT1BUKSAhPSAwKQotCSAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICBlbHNlCi0JICAgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIG1pbiA9IDA7Ci0JfQotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfTkVHQVRJVkUpICE9IDApCi0JdGVzdCA9IC0gdmFsOwotICAgICAgZWxzZQotCXRlc3QgPSB2YWw7Ci0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQl7Ci0JICBjb25zdCBjaGFyICplcnIgPQotCSAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0JICBjaGFyIGJ1ZlsxMDBdOwotCi0JICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0JICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCSAgICBhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgZWxzZQotCSAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0gICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIChsb25nKSB2YWwsICZlcnJtc2cpOwotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWFzX3dhcm4gKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkgICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcwotICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCi0gICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuICAqLwotCi1zdHJ1Y3QgYXJjX2ZpeHVwCi17Ci0gIC8qIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycgKi8KLSAgaW50IG9waW5kZXg7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLX07Ci0KLSNkZWZpbmUgTUFYX0ZJWFVQUyA1Ci0KLSNkZWZpbmUgTUFYX1NVRkZJWEVTIDUKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICpvcGNvZGU7Ci0gIGNoYXIgKnN0YXJ0OwotICBhcmNfaW5zbiBpbnNuOwotICBzdGF0aWMgaW50IGluaXRfdGFibGVzX3AgPSAwOwotCi0gIC8qIE9wY29kZSB0YWJsZSBpbml0aWFsaXphdGlvbiBpcyBkZWZlcnJlZCB1bnRpbCBoZXJlIGJlY2F1c2Ugd2UgaGF2ZSB0bwotICAgICB3YWl0IGZvciBhIHBvc3NpYmxlIC5jcHUgY29tbWFuZC4gICovCi0gIGlmICghaW5pdF90YWJsZXNfcCkKLSAgICB7Ci0gICAgICBpbml0X29wY29kZV90YWJsZXMgKGFyY19tYWNoX3R5cGUpOwotICAgICAgaW5pdF90YWJsZXNfcCA9IDE7Ci0gICAgfQotCi0gIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICBzdHIrKzsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gbGlzdHMgaGFzaGVkIGJ5IHRoZSBmaXJzdCBsZXR0ZXIgKHRob3VnaAotICAgICB3ZSBuZWVkbid0IGNhcmUgaG93IHRoZXkncmUgaGFzaGVkKS4gIEdldCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuICAqLwotCi0gIG9wY29kZSA9IGFyY19vcGNvZGVfbG9va3VwX2FzbSAoc3RyKTsKLQotICAvKiBLZWVwIGxvb2tpbmcgdW50aWwgd2UgZmluZCBhIG1hdGNoLiAgKi8KLQotICBzdGFydCA9IHN0cjsKLSAgZm9yICggOyBvcGNvZGUgIT0gTlVMTDsgb3Bjb2RlID0gQVJDX09QQ09ERV9ORVhUX0FTTSAob3Bjb2RlKSkKLSAgICB7Ci0gICAgICBpbnQgcGFzdF9vcGNvZGVfcCwgZmMsIG51bV9zdWZmaXhlczsKLSAgICAgIGNoYXIgKnN5bjsKLSAgICAgIHN0cnVjdCBhcmNfZml4dXAgZml4dXBzW01BWF9GSVhVUFNdOwotICAgICAgLyogVXNlZCBhcyBhIHNhbml0eSBjaGVjay4gIElmIHdlIG5lZWQgYSBsaW1tIHJlbG9jLCBtYWtlIHN1cmUgd2UgYXNrCi0JIGZvciBhbiBleHRyYSA0IGJ5dGVzIGZyb20gZnJhZ19tb3JlLiAgKi8KLSAgICAgIGludCBsaW1tX3JlbG9jX3A7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmluc25fc3VmZml4ZXNbTUFYX1NVRkZJWEVTXTsKLQotICAgICAgLyogSXMgdGhpcyBvcGNvZGUgc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBjcHU/ICAqLwotICAgICAgaWYgKCEgYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNjYW4gdGhlIHN5bnRheCBzdHJpbmcuICBJZiBpdCBkb2Vzbid0IG1hdGNoLCB0cnkgdGhlIG5leHQgb25lLiAgKi8KLQotICAgICAgYXJjX29wY29kZV9pbml0X2luc2VydCAoKTsKLSAgICAgIGluc24gPSBvcGNvZGUtPnZhbHVlOwotICAgICAgZmMgPSAwOwotICAgICAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0gICAgICBudW1fc3VmZml4ZXMgPSAwOwotICAgICAgbGltbV9yZWxvY19wID0gMDsKLQotICAgICAgLyogV2UgZG9uJ3QgY2hlY2sgZm9yICgqc3RyICE9ICdcMCcpIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHBhcnNlCi0JIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gICAgICBmb3IgKHN0ciA9IHN0YXJ0LCBzeW4gPSBvcGNvZGUtPnN5bnRheDsgKnN5biAhPSAnXDAnOyApCi0JewotCSAgaW50IG1vZHM7Ci0JICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgIC8qIE5vbiBvcGVyYW5kIGNoYXJzIG11c3QgbWF0Y2ggZXhhY3RseS4gICovCi0JICBpZiAoKnN5biAhPSAnJScgfHwgKisrc3luID09ICclJykKLQkgICAgewotCSAgICAgIC8qIEhhbmRsZSAnKycgc3BlY2lhbGx5IGFzIHdlIHdhbnQgdG8gYWxsb3cgImxkIHIwLFtzcC00XSIuICAqLwotCSAgICAgIC8qID8/PyBUaGUgc3ludGF4IGhhcyBjaGFuZ2VkIHRvIFtzcCwtNF0uICAqLwotCSAgICAgIGlmICgwICYmICpzeW4gPT0gJysnICYmICpzdHIgPT0gJy0nKQotCQl7Ci0JCSAgLyogU2tpcCBvdmVyIHN5bidzICssIGJ1dCBsZWF2ZSBzdHIncyAtIGFsb25lLgotCQkgICAgIFRoYXQgbWFrZXMgdGhlIGNhc2UgaWRlbnRpY2FsIHRvICJsZCByMCxbc3ArLTRdIi4gICovCi0JCSAgKytzeW47Ci0JCX0KLQkgICAgICBlbHNlIGlmICgqc3RyID09ICpzeW4pCi0JCXsKLQkJICBpZiAoKnN5biA9PSAnICcpCi0JCSAgICBwYXN0X29wY29kZV9wID0gMTsKLQkJICArK3N5bjsKLQkJICArK3N0cjsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgUGljayBvdXQgYW55IG1vZGlmaWVycy4gICovCi0JICBtb2RzID0gMDsKLQkgIHdoaWxlIChBUkNfTU9EX1AgKGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbKnN5bl1dLmZsYWdzKSkKLQkgICAgewotCSAgICAgIG1vZHMgfD0gYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFsqc3luXV0uZmxhZ3MgJiBBUkNfTU9EX0JJVFM7Ci0JICAgICAgKytzeW47Ci0JICAgIH0KLQkgIG9wZXJhbmQgPSBhcmNfb3BlcmFuZHMgKyBhcmNfb3BlcmFuZF9tYXBbKnN5bl07Ci0JICBpZiAob3BlcmFuZC0+Zm10ID09IDApCi0JICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIHN5bnRheCBmb3JtYXQgY2hhcmFjdGVyIGAlYyciKSwgKnN5bik7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0ZBS0UpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotCSAgICAgIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0JCXsKLQkJICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBOVUxMLCAwLCAmZXJybXNnKTsKLQkJICAvKiBJZiB3ZSBnZXQgYW4gZXJyb3IsIGdvIG9uIHRvIHRyeSB0aGUgbmV4dCBpbnNuLiAgKi8KLQkJICBpZiAoZXJybXNnKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgICArK3N5bjsKLQkgICAgfQotCSAgLyogQXJlIHdlIGZpbmlzaGVkIHdpdGggc3VmZml4ZXM/ICAqLwotCSAgZWxzZSBpZiAoIXBhc3Rfb3Bjb2RlX3ApCi0JICAgIHsKLQkgICAgICBpbnQgZm91bmQ7Ci0JICAgICAgY2hhciBjOwotCSAgICAgIGNoYXIgKnMsKnQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpzdWYsKnN1ZmZpeCwqc3VmZml4X2VuZDsKLQotCSAgICAgIGlmICghKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKSkKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICAvKiBJZiB3ZSdyZSBhdCBhIHNwYWNlIGluIHRoZSBpbnB1dCBzdHJpbmcsIHdlIHdhbnQgdG8gc2tpcCB0aGUKLQkJIHJlbWFpbmluZyBzdWZmaXhlcy4gIFRoZXJlIG1heSBiZSBzb21lIGZha2Ugb25lcyB0aG91Z2gsIHNvCi0JCSBqdXN0IGdvIG9uIHRvIHRyeSB0aGUgbmV4dCBvbmUuICAqLwotCSAgICAgIGlmICgqc3RyID09ICcgJykKLQkJewotCQkgICsrc3luOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBzID0gc3RyOwotCSAgICAgIGlmIChtb2RzICYgQVJDX01PRF9ET1QpCi0JCXsKLQkJICBpZiAoKnMgIT0gJy4nKQotCQkgICAgYnJlYWs7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVGhpcyBjYW4gaGFwcGVuIGluICJiLm5kIGZvbyIgYW5kIHdlJ3JlIGN1cnJlbnRseSBsb29raW5nCi0JCSAgICAgZm9yICIlcSIgKGllOiBhIGNvbmRpdGlvbiBjb2RlIHN1ZmZpeCkuICAqLwotCQkgIGlmICgqcyA9PSAnLicpCi0JCSAgICB7Ci0JCSAgICAgICsrc3luOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogUGljayB0aGUgc3VmZml4IG91dCBhbmQgbG9vayBpdCB1cCB2aWEgdGhlIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGZvciAodCA9IHM7ICp0ICYmIGlzYWxwaGEgKCp0KTsgKyt0KQotCQljb250aW51ZTsKLQkgICAgICBjID0gKnQ7Ci0JICAgICAgKnQgPSAnXDAnOwotCSAgICAgIHN1ZiA9IGhhc2hfZmluZCAoYXJjX3N1ZmZpeF9oYXNoLCBzKTsKLQkgICAgICAqdCA9IGM7Ci0JICAgICAgaWYgKCFzdWYpCi0JCXsKLQkJICAvKiBUaGlzIGNhbiBoYXBwZW4gaW4gImJsbGUgZm9vIiBhbmQgd2UncmUgY3VycmVudGx5IHVzaW5nCi0JCSAgICAgdGhlIHRlbXBsYXRlICJiJXElLm4gJWoiLiAgVGhlICJibCIgaW5zbiBvY2N1cnMgbGF0ZXIgaW4KLQkJICAgICB0aGUgdGFibGUgc28gImxsZSIgaXNuJ3QgYW4gaWxsZWdhbCBzdWZmaXguICAqLwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBJcyBpdCB0aGUgcmlnaHQgdHlwZT8gIE5vdGUgdGhhdCB0aGUgc2FtZSBjaGFyYWN0ZXIgaXMgdXNlZAotCSAgICAgICAgIHNldmVyYWwgdGltZXMsIHNvIHdlIGhhdmUgdG8gZXhhbWluZSBhbGwgb2YgdGhlbS4gIFRoaXMgaXMKLQkJIHJlbGF0aXZlbHkgZWZmaWNpZW50IGFzIGVxdWl2YWxlbnQgZW50cmllcyBhcmUga2VwdAotCQkgdG9nZXRoZXIuICBJZiBpdCdzIG5vdCB0aGUgcmlnaHQgdHlwZSwgZG9uJ3QgaW5jcmVtZW50IGBzdHInCi0JCSBzbyB3ZSB0cnkgdGhlIG5leHQgb25lIGluIHRoZSBzZXJpZXMuICAqLwotCSAgICAgIGZvdW5kID0gMDsKLQkgICAgICBzdWZmaXhfZW5kID0gYXJjX3N1ZmZpeGVzICsgYXJjX3N1ZmZpeGVzX2NvdW50OwotCSAgICAgIGZvciAoc3VmZml4ID0gc3VmOwotCQkgICBzdWZmaXggPCBzdWZmaXhfZW5kICYmIHN0cmNtcCAoc3VmZml4LT5uYW1lLCBzdWYtPm5hbWUpID09IDA7Ci0JCSAgICsrc3VmZml4KQotCQl7Ci0JCSAgaWYgKGFyY19vcGVyYW5kc1tzdWZmaXgtPnR5cGVdLmZtdCA9PSAqc3luKQotCQkgICAgewotCQkgICAgICAvKiBJbnNlcnQgdGhlIHN1ZmZpeCdzIHZhbHVlIGludG8gdGhlIGluc24uICAqLwotCQkgICAgICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotCQkJaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgb3BlcmFuZCwKLQkJCQkJCSAgIG1vZHMsIE5VTEwsIHN1ZmZpeC0+dmFsdWUsCi0JCQkJCQkgICBOVUxMKTsKLQkJICAgICAgZWxzZQotCQkJaW5zbiB8PSBzdWZmaXgtPnZhbHVlIDw8IG9wZXJhbmQtPnNoaWZ0OwotCi0JCSAgICAgIHN0ciA9IHQ7Ci0JCSAgICAgIGZvdW5kID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICArK3N5bjsKLQkgICAgICBpZiAoIWZvdW5kKQotCQk7IC8qIFdyb25nIHR5cGUuICBKdXN0IGdvIG9uIHRvIHRyeSBuZXh0IGluc24gZW50cnkuICAqLwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChudW1fc3VmZml4ZXMgPT0gTUFYX1NVRkZJWEVTKQotCQkgICAgYXNfYmFkIChfKCJ0b28gbWFueSBzdWZmaXhlcyIpKTsKLQkJICBlbHNlCi0JCSAgICBpbnNuX3N1ZmZpeGVzW251bV9zdWZmaXhlcysrXSA9IHN1ZmZpeDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIFRoaXMgaXMgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gZXhwcmVzc2lvbiBvZiBzb21lIGtpbmQuICAqLwotCSAgICB7Ci0JICAgICAgY2hhciBjOwotCSAgICAgIGNoYXIgKmhvbGQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcgPSBOVUxMOwotCSAgICAgIGxvbmcgdmFsdWUgPSAwOwotCSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NVRkZJWCkKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICAvKiBJcyB0aGVyZSBhbnl0aGluZyBsZWZ0IHRvIHBhcnNlPwotCQkgV2UgZG9uJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIHRvcCBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLQkJIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0JICAgICAgaWYgKCpzdHIgPT0gJ1wwJykKLQkJYnJlYWs7Ci0jaWYgMAotCSAgICAgIC8qIElzIHRoaXMgYSBzeW50YXggY2hhcmFjdGVyPyAgRWc6IGlzIHRoZXJlIGEgJ1snIHByZXNlbnQgd2hlbgotCQkgdGhlcmUgc2hvdWxkbid0IGJlPyAgKi8KLQkgICAgICBpZiAoIWlzYWxudW0gKCpzdHIpCi0JCSAgLyogJy4nIGFzIGluICIuTExDMCIgKi8KLQkJICAmJiAqc3RyICE9ICcuJwotCQkgIC8qICdfJyBhcyBpbiAiX3ByaW50IiAqLwotCQkgICYmICpzdHIgIT0gJ18nCi0JCSAgLyogJy0nIGFzIGluICJbZnAsLTRdIiAqLwotCQkgICYmICpzdHIgIT0gJy0nCi0JCSAgLyogJyUnIGFzIGluICIlaWEoX2Z1bmMpIiAqLwotCQkgICYmICpzdHIgIT0gJyUnKQotCQlicmVhazsKLSNlbmRpZgotCi0JICAgICAgLyogUGFyc2UgdGhlIG9wZXJhbmQuICAqLwotCSAgICAgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotCSAgICAgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0JICAgICAgaWYgKGV4cC5YX29wID09IE9faWxsZWdhbCkKLQkJYXNfYmFkIChfKCJpbGxlZ2FsIG9wZXJhbmQiKSk7Ci0JICAgICAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0JCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCSAgICAgIGVsc2UgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX3JlZ2lzdGVyKQotCQl7Ci0JCSAgcmVnID0gYXJjX3JlZ19uYW1lcyArIGV4cC5YX2FkZF9udW1iZXI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JCSAgaWYgKGZjID49IE1BWF9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCQkgIGZpeHVwc1tmY10uZXhwID0gZXhwOwotCi0JCSAgLyogSWYgdGhpcyBpcyBhIHJlZ2lzdGVyIGNvbnN0YW50IChJRTogb25lIHdob3NlCi0JCSAgICAgcmVnaXN0ZXIgdmFsdWUgZ2V0cyBzdG9yZWQgYXMgNjEtNjMpIHRoZW4gdGhpcwotCQkgICAgIG11c3QgYmUgYSBsaW1tLiAgV2UgZG9uJ3Qgc3VwcG9ydCBzaGltbSByZWxvY3MuICAqLwotCQkgIC8qID8/PyBUaGlzIGJpdCBjb3VsZCB1c2Ugc29tZSBjbGVhbmluZyB1cC4KLQkJICAgICBSZWZlcmVuY2luZyB0aGUgZm9ybWF0IGNoYXJzIGxpa2UgdGhpcyBnb2VzCi0JCSAgICAgYWdhaW5zdCBzdHlsZS4gICovCi0jZGVmaW5lIElTX1JFR19PUEVSQU5EKG8pICgobykgPT0gJ2EnIHx8IChvKSA9PSAnYicgfHwgKG8pID09ICdjJykKLQkJICBpZiAoSVNfUkVHX09QRVJBTkQgKCpzeW4pKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpqdW5rOwotCi0JCSAgICAgIGZpeHVwc1tmY10ub3BpbmRleCA9IGFyY19vcGVyYW5kX21hcFsnTCddOwotCQkgICAgICBsaW1tX3JlbG9jX3AgPSAxOwotCQkgICAgICAvKiBUZWxsIGluc2VydF9yZWcgd2UgbmVlZCBhIGxpbW0uICBUaGlzIGlzCi0JCQkgbmVlZGVkIGJlY2F1c2UgdGhlIHZhbHVlIGF0IHRoaXMgcG9pbnQgaXMKLQkJCSB6ZXJvLCBhIHNoaW1tLiAgKi8KLQkJICAgICAgLyogPz8/IFdlIG5lZWQgYSBjbGVhbmVyIGludGVyZmFjZSB0aGFuIHRoaXMuICAqLwotCQkgICAgICAoKmFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbJ1EnXV0uaW5zZXJ0KQotCQkJKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgMEwsICZqdW5rKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBmaXh1cHNbZmNdLm9waW5kZXggPSBhcmNfb3BlcmFuZF9tYXBbKnN5bl07Ci0JCSAgKytmYzsKLQkJICB2YWx1ZSA9IDA7Ci0JCX0KLQotCSAgICAgIC8qIEluc2VydCB0aGUgcmVnaXN0ZXIgb3IgZXhwcmVzc2lvbiBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmluc2VydCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0JCSAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywKLQkJCQkJICAgICByZWcsIChsb25nKSB2YWx1ZSwgJmVycm1zZyk7Ci0jaWYgMAotCQkgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJICAgIGFzX3dhcm4gKGVycm1zZyk7Ci0jZW5kaWYKLQkJICAvKiBGSVhNRTogV2Ugd2FudCB0byB0cnkgc2hpbW0gaW5zbnMgZm9yIGxpbW0gb25lcy4gIEJ1dCBpZgotCQkgICAgIHRoZSBjb25zdGFudCB3b24ndCBmaXQsIHdlIG11c3QgZ28gb24gdG8gdHJ5IHRoZSBuZXh0Ci0JCSAgICAgcG9zc2liaWxpdHkuICBXaGVyZSBkbyB3ZSBpc3N1ZSB3YXJuaW5ncyBmb3IgY29uc3RhbnRzCi0JCSAgICAgdGhhdCBhcmUgdG9vIGJpZyB0aGVuPyAgQXQgcHJlc2VudCwgd2UnbGwgZmxhZyB0aGUgaW5zbgotCQkgICAgIGFzIHVucmVjb2duaXphYmxlISAgTWF5YmUgaGF2ZSB0aGUgImJhZCBpbnN0cnVjdGlvbiIKLQkJICAgICBlcnJvciBtZXNzYWdlIGluY2x1ZGUgb3VyIGBlcnJtc2cnPyAgKi8KLQkJICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJaW5zbiB8PSAodmFsdWUgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0KLQkgICAgICArK3N5bjsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGF4IHN0cmluZywgd2UncmUgZG9uZS4gICovCi0gICAgICAvKiBGSVhNRTogdHJ5IHRvIG1vdmUgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmICgqc3luID09ICdcMCcpCi0JewotCSAgaW50IGk7Ci0JICBjaGFyICpmOwotCSAgbG9uZyBsaW1tLCBsaW1tX3A7Ci0KLQkgIC8qIEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4gYmxhbmtzCi0JICAgICBub3cuICBJRTogV2UgbmVlZG4ndCB0cnkgYWdhaW4gd2l0aCBhIGxvbmdlciB2ZXJzaW9uIG9mIHRoZQotCSAgICAgaW5zbiBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IGxvbmdlciB2ZXJzaW9ucyBvZiBpbnNucyBhcHBlYXIKLQkgICAgIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KLQotCSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotCSAgICArK3N0cjsKLQotCSAgaWYgKCpzdHIgIT0gJ1wwJykKLQkgICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLQkgIC8qIElzIHRoZXJlIGEgbGltbSB2YWx1ZT8gICovCi0JICBsaW1tX3AgPSBhcmNfb3Bjb2RlX2xpbW1fcCAoJmxpbW0pOwotCi0JICAvKiBQZXJmb3JtIHZhcmlvdXMgZXJyb3IgYW5kIHdhcm5pbmcgdGVzdHMuICAqLwotCi0JICB7Ci0JICAgIHN0YXRpYyBpbnQgaW5fZGVsYXlfc2xvdF9wID0gMDsKLQkgICAgc3RhdGljIGludCBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3AgPSAwOwotCSAgICAvKiBkZWxheSBzbG90IHR5cGUgc2VlbiAqLwotCSAgICBpbnQgZGVsYXlfc2xvdF90eXBlID0gQVJDX0RFTEFZX05PTkU7Ci0JICAgIC8qIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBmbGFnIHNlZW4gKi8KLQkgICAgaW50IGNvbmRpdGlvbmFsID0gMDsKLQkgICAgLyogMSBpZiBjb25kaXRpb24gY29kZXMgYXJlIGJlaW5nIHNldCAqLwotCSAgICBpbnQgY2Nfc2V0X3AgPSAwOwotCSAgICAvKiAxIGlmIGNvbmRpdGlvbmFsIGJyYW5jaCwgaW5jbHVkaW5nIGBiJyAiYnJhbmNoIGFsd2F5cyIgKi8KLQkgICAgaW50IGNvbmRfYnJhbmNoX3AgPSBvcGNvZGUtPmZsYWdzICYgQVJDX09QQ09ERV9DT05EX0JSQU5DSDsKLQkgICAgaW50IG5lZWRfY2Nfbm9wX3AgPSAwOwotCi0JICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3VmZml4ZXM7ICsraSkKLQkgICAgICB7Ci0JCXN3aXRjaCAoYXJjX29wZXJhbmRzW2luc25fc3VmZml4ZXNbaV0tPnR5cGVdLmZtdCkKLQkJICB7Ci0JCSAgY2FzZSAnbicgOgotCQkgICAgZGVsYXlfc2xvdF90eXBlID0gaW5zbl9zdWZmaXhlc1tpXS0+dmFsdWU7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdxJyA6Ci0JCSAgICBjb25kaXRpb25hbCA9IGluc25fc3VmZml4ZXNbaV0tPnZhbHVlOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnZicgOgotCQkgICAgY2Nfc2V0X3AgPSAxOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBQdXR0aW5nIGFuIGluc24gd2l0aCBhIGxpbW0gdmFsdWUgaW4gYSBkZWxheSBzbG90IGlzIHN1cHBvc2VkIHRvCi0JICAgICAgIGJlIGxlZ2FsLCBidXQgbGV0J3Mgd2FybiB0aGUgdXNlciBhbnl3YXkuICBEaXR0byBmb3IgOCBieXRlCi0JICAgICAgIGp1bXBzIHdpdGggZGVsYXkgc2xvdHMuICAqLwotCSAgICBpZiAoaW5fZGVsYXlfc2xvdF9wICYmIGxpbW1fcCkKLQkgICAgICBhc193YXJuIChfKCI4IGJ5dGUgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIpKTsKLQkgICAgaWYgKGRlbGF5X3Nsb3RfdHlwZSAhPSBBUkNfREVMQVlfTk9ORSAmJiBsaW1tX3ApCi0JICAgICAgYXNfd2FybiAoXygiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IikpOwotCSAgICBpbl9kZWxheV9zbG90X3AgPSAoZGVsYXlfc2xvdF90eXBlICE9IEFSQ19ERUxBWV9OT05FKSAmJiAhbGltbV9wOwotCi0JICAgIC8qIFdhcm4gd2hlbiBhIGNvbmRpdGlvbmFsIGJyYW5jaCBpbW1lZGlhdGVseSBmb2xsb3dzIGEgc2V0IG9mCi0JICAgICAgIHRoZSBjb25kaXRpb24gY29kZXMuICBOb3RlIHRoYXQgdGhpcyBuZWVkbid0IGJlIGRvbmUgaWYgdGhlCi0JICAgICAgIGluc24gdGhhdCBzZXRzIHRoZSBjb25kaXRpb24gY29kZXMgdXNlcyBhIGxpbW0uICAqLwotCSAgICBpZiAoY29uZF9icmFuY2hfcCAmJiBjb25kaXRpb25hbCAhPSAwIC8qIDAgPSAiYWx3YXlzIiAqLwotCQkmJiBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3ApCi0JICAgICAgYXNfd2FybiAoXygiY29uZGl0aW9uYWwgYnJhbmNoIGZvbGxvd3Mgc2V0IG9mIGZsYWdzIikpOwotCSAgICBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3AgPSBjY19zZXRfcCAmJiAhbGltbV9wOwotCSAgfQotCi0JICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLgotCSAgICAgSXQgaXMgaW1wb3J0YW50IHRvIGZldGNoIGVub3VnaCBzcGFjZSBpbiBvbmUgY2FsbCB0byBgZnJhZ19tb3JlJy4KLQkgICAgIFdlIHVzZSAoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSB0byBjb21wdXRlIHdoZXJlIHdlIGFyZSBhbmQgd2UKLQkgICAgIGRvbid0IHdhbnQgZnJhZ19ub3cgdG8gY2hhbmdlIGJldHdlZW4gY2FsbHMuICAqLwotCSAgaWYgKGxpbW1fcCkKLQkgICAgewotCSAgICAgIGYgPSBmcmFnX21vcmUgKDgpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgNCwgbGltbSwgNCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGxpbW1fcmVsb2NfcCkKLQkgICAgewotCSAgICAgIC8qIFdlIG5lZWQgYSBsaW1tIHJlbG9jLCBidXQgdGhlIHRhYmxlcyB0aGluayB3ZSBkb24ndC4gICovCi0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGYgPSBmcmFnX21vcmUgKDQpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0JICAgIH0KLQotCSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IGZjOyArK2kpCi0JICAgIHsKLQkgICAgICBpbnQgb3BfdHlwZSwgcmVsb2NfdHlwZTsKLQkgICAgICBleHByZXNzaW9uUyBleHB0bXA7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotCi0JICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoaXMgb3BlcmFuZC4KLQkJIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmb3IKLQkJIG9wZXJhbmRzIHJlc2lkaW5nIGluIHRoZSBpbnNuLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLQkJIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5IGhhbmRsZSBmaXh1cHMgZm9yIGFueQotCQkgb3BlcmFuZCB0eXBlLCBhbHRob3VnaCB0aGF0IGlzIGFkbWl0dGVkbHkgbm90IGEgdmVyeSBleGNpdGluZwotCQkgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbiBtZF9hcHBseV9maXguCi0KLQkJIExpbW0gdmFsdWVzICg0IGJ5dGUgaW1tZWRpYXRlICJjb25zdGFudHMiKSBtdXN0IGJlIHRyZWF0ZWQKLQkJIG5vcm1hbGx5IGJlY2F1c2UgdGhleSdyZSBub3QgcGFydCBvZiB0aGUgYWN0dWFsIGluc24gd29yZAotCQkgYW5kIHRodXMgdGhlIGluc2VydGlvbiByb3V0aW5lcyBkb24ndCBoYW5kbGUgdGhlbS4gICovCi0KLQkgICAgICBpZiAoYXJjX29wZXJhbmRzW2ZpeHVwc1tpXS5vcGluZGV4XS5mbGFncyAmIEFSQ19PUEVSQU5EX0xJTU0pCi0JCXsKLQkJICBvcF90eXBlID0gZml4dXBzW2ldLm9waW5kZXg7Ci0JCSAgLyogRklYTUU6IGNhbiB3ZSBhZGQgdGhpcyBkYXRhIHRvIHRoZSBvcGVyYW5kIHRhYmxlPyAgKi8KLQkJICBpZiAob3BfdHlwZSA9PSBhcmNfb3BlcmFuZF9tYXBbJ0wnXSkKLQkJICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzI7Ci0JCSAgZWxzZSBpZiAob3BfdHlwZSA9PSBhcmNfb3BlcmFuZF9tYXBbJ0onXSkKLQkJICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfQVJDX0IyNjsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJICByZWxvY190eXBlID0gZ2V0X2FyY19leHBfcmVsb2NfdHlwZSAoMSwgcmVsb2NfdHlwZSwKLQkJCQkJCSAgICAgICAmZml4dXBzW2ldLmV4cCwKLQkJCQkJCSAgICAgICAmZXhwdG1wKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG9wX3R5cGUgPSBnZXRfYXJjX2V4cF9yZWxvY190eXBlICgwLCBmaXh1cHNbaV0ub3BpbmRleCwKLQkJCQkJCSAgICAmZml4dXBzW2ldLmV4cCwgJmV4cHRtcCk7Ci0JCSAgcmVsb2NfdHlwZSA9IG9wX3R5cGUgKyAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOwotCQl9Ci0JICAgICAgb3BlcmFuZCA9ICZhcmNfb3BlcmFuZHNbb3BfdHlwZV07Ci0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgKChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAgKyAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9MSU1NID8gNCA6IDApKSwgNCwKLQkJCSAgICZleHB0bXAsCi0JCQkgICAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0gpICE9IDAsCi0JCQkgICAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSByZWxvY190eXBlKTsKLQkgICAgfQotCi0JICAvKiBBbGwgZG9uZS4gICovCi0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBUcnkgdGhlIG5leHQgZW50cnkuICAqLwotICAgIH0KLQotICBhc19iYWQgKF8oImJhZCBpbnN0cnVjdGlvbiBgJXMnIiksIHN0YXJ0KTsKLX0KLQwKLS8qID8/PyBUaGlzIHdhcyBjb3BpZWQgZnJvbSB0Yy1zcGFyYy5jLCBJIHRoaW5rLiAgSXMgaXQgbmVjZXNzYXJ5PyAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19jb21tb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBpbnQgdGVtcCwgc2l6ZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHNpemUgPSB0ZW1wOwotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImlnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSBzaXplKQotCXsKLQkgIGFzX3dhcm4gKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIpLAotCQkgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZSk7Ci0JfQotICAgIH0KLSAgYXNzZXJ0IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGNvbW1hIGFmdGVyIGNvbW1vbiBsZW5ndGgiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotICAgIHsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICh0ZW1wIDwgMCkKLQl7Ci0JICB0ZW1wID0gMDsKLQkgIGFzX3dhcm4gKF8oIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIpKTsKLQl9Ci0gICAgICBpZiAoc3ltYm9sUC0+bG9jYWwpCi0JewotCSAgc2VnVCBvbGRfc2VjOwotCSAgaW50IG9sZF9zdWJzZWM7Ci0JICBjaGFyICpwOwotCSAgaW50IGFsaWduOwotCi0JYWxsb2NhdGVfYnNzOgotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQkgIGFsaWduID0gdGVtcDsKLQkgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkgICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCi0JCQkob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7Ci0JICAqcCA9IDA7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JYWxsb2NhdGVfY29tbW9uOgotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotCSAgU19TRVRfQUxJR04gKHN5bWJvbFAsIHRlbXApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogPz8/IFNvbWUgc2F5IGRhdGEsIHNvbWUgc2F5IGJzcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmJzc1wiIiwgNSkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5kYXRhXCIiLCA2KSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotLyogU2VsZWN0IHRoZSBjcHUgd2UncmUgYXNzZW1ibGluZyBmb3IuICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX2NwdSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgbWFjaDsKLSAgY2hhciBjOwotICBjaGFyICpjcHU7Ci0KLSAgLyogSWYgYW4gaW5zdHJ1Y3Rpb24gaGFzIGFscmVhZHkgYmVlbiBzZWVuLCBpdCdzIHRvbyBsYXRlLiAgKi8KLSAgaWYgKGNwdV90YWJsZXNfaW5pdF9wKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLmNwdSBjb21tYW5kIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgaW5zdHJ1Y3Rpb25zIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3B1ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIG1hY2ggPSBhcmNfZ2V0X21hY2ggKGNwdSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBpZiAobWFjaCA9PSAtMSkKLSAgICBnb3RvIGJhZF9jcHU7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICAvKiBUaGUgY3B1IG1heSBoYXZlIGJlZW4gc2VsZWN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgVGhlIGNob2ljZXMgbXVzdCBtYXRjaC4gICovCi0gIC8qID8/PyBUaGlzIHdhcyBhIGNvbW1hbmQgbGluZSBvcHRpb24gZWFybHkgb24uICBJdCdzIGdvbmUgbm93LCBidXQKLSAgICAgbGVhdmUgdGhpcyBpbi4gICovCi0gIGlmIChtYWNoX3R5cGVfc3BlY2lmaWVkX3AgJiYgbWFjaCAhPSBhcmNfbWFjaF90eXBlKQotICAgIGFzX2JhZCAoXygiLmNwdSBjb25mbGljdHMgd2l0aCBwcmV2aW91cyB2YWx1ZSIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFyY19tYWNoX3R5cGUgPSBtYWNoOwotICAgICAgbWFjaF90eXBlX3NwZWNpZmllZF9wID0gMTsKLSAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfYXJjLCBtYWNoKSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIHJldHVybjsKLQotIGJhZF9jcHU6Ci0gIGFzX2JhZCAoXygiYmFkIC5jcHUgb3AiKSk7Ci0gIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNpZiAwCi0vKiBUaGUgLnJlbmFtZSBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgYnkgZ2NjIHRvIGltcGxlbWVudAotICAgLW1tYW5nbGUtY3B1LWxpYmdjYy4gICovCi0KLXN0YXRpYyB2b2lkCi1hcmNfcmVuYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWUsKm5ldzsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0gIGludCBsZW47Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyByZW5hbWUgc3RyaW5nIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBpZiAoKm5hbWUgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBzeW1ib2wgdG8gcmVuYW1lIHRvIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIG5ldyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgc3RyY3B5IChuZXcsIG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lID0gbmV3OwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0jZW5kaWYKLQwKLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAuCi0gICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotCi0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0vKiBXZSBkb24ndCBoYXZlIGFueSBmb3JtIG9mIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLX0KLQotLyogQ29udmVydCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICBXZSBuZXZlciBnZW5lcmF0ZSB0aGVzZS4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQYXJzZSBhbiBvcGVyYW5kIHRoYXQgaXMgbWFjaGluZS1zcGVjaWZpYy4KLQotICAgVGhlIEFSQyBoYXMgYSBzcGVjaWFsICUtb3AgdG8gYWRqdXN0IGFkZHJlc3NlcyBzbyB0aGV5J3JlIHVzYWJsZSBpbgotICAgYnJhbmNoZXMuICBUaGUgInN0IiBpcyBzaG9ydCBmb3IgdGhlIFNUYXR1cyByZWdpc3Rlci4KLSAgID8/PyBMYXRlciBleHBhbmQgdGhpcyB0byB0YWtlIGEgZmxhZ3MgdmFsdWUgdG9vLgotCi0gICA/Pz8gV2UgY2FuJ3QgY3JlYXRlIG5ldyBleHByZXNzaW9uIHR5cGVzIHNvIHdlIG1hcCB0aGUgJS1vcCdzIG9udG8gdGhlCi0gICBleGlzdGluZyBzeW50YXguICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgY291bGQgdXNlIHRoZSBjaG9zZW4gc3ludGF4Ci0gICB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdC4gIFBlcmhhcHMgcHV0IGEgc3BlY2lhbCBjb29raWUgaW4gWF9hZGRfbnVtYmVyCi0gICB0byBtYXJrIHRoZSBleHByZXNzaW9uIGFzIHNwZWNpYWwuICAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoKnAgPT0gJyUnICYmIHN0cm5jbXAgKHAsICIlc3QoIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgJyknIGluICUtb3AiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMAotCSAgLyogSSB0aGluayB0aGlzIHRlc3QgaXMgdW5uZWNlc3NhcnkgYnV0IGp1c3QgYXMgYSBzYW5pdHkgY2hlY2suLi4gKi8KLQkgICYmIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9PSBOVUxMKQotCXsKLQkgIGV4cHJlc3Npb25TIHR3bzsKLQotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgdHdvLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgdHdvLlhfYWRkX3N5bWJvbCA9IHR3by5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICB0d28uWF9hZGRfbnVtYmVyID0gMjsKLQkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZ0d28pOwotCX0KLSAgICAgIC8qIGFsbG93ICVzdChzeW0xLXN5bTIpICovCi0gICAgICBlbHNlIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX3N1YnRyYWN0Ci0JICAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgZXhwcmVzc2lvblMgdHdvOwotCi0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoZXhwcmVzc2lvblApOwotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgdHdvLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgdHdvLlhfYWRkX3N5bWJvbCA9IHR3by5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICB0d28uWF9hZGRfbnVtYmVyID0gMjsKLQkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZ0d28pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXggZm9yICUlc3QiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuCi0gICBXZSBjb3VsZCBjYXRjaCByZWdpc3RlciBuYW1lcyBoZXJlLCBidXQgdGhhdCBpcyBoYW5kbGVkIGJ5IGluc2VydGluZwotICAgdGhlbSBhbGwgaW4gdGhlIHN5bWJvbCB0YWJsZSB0byBiZWdpbiB3aXRoLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIGV4cHJlc3Npb25zLiAgKi8KLQotLyogUGFyc2UgYSAuYnl0ZSwgLndvcmQsIGV0Yy4gZXhwcmVzc2lvbi4KLQotICAgVmFsdWVzIGZvciB0aGUgc3RhdHVzIHJlZ2lzdGVyIGFyZSBzcGVjaWZpZWQgd2l0aCAlc3QobGFiZWwpLgotICAgYGxhYmVsJyB3aWxsIGJlIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0KLXZvaWQKLWFyY19wYXJzZV9jb25zX2V4cHJlc3Npb24gKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgbmJ5dGVzOwotewotICBleHByICgwLCBleHApOwotfQotCi0vKiBSZWNvcmQgYSBmaXh1cCBmb3IgYSBjb25zIGV4cHJlc3Npb24uICAqLwotCi12b2lkCi1hcmNfY29uc19maXhfbmV3IChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBuYnl0ZXM7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGlmIChuYnl0ZXMgPT0gNCkKLSAgICB7Ci0gICAgICBpbnQgcmVsb2NfdHlwZTsKLSAgICAgIGV4cHJlc3Npb25TIGV4cHRtcDsKLQotICAgICAgLyogVGhpcyBtYXkgYmUgYSBzcGVjaWFsIEFSQyByZWxvYyAoZWc6ICVzdCgpKS4gICovCi0gICAgICByZWxvY190eXBlID0gZ2V0X2FyY19leHBfcmVsb2NfdHlwZSAoMSwgQkZEX1JFTE9DXzMyLCBleHAsICZleHB0bXApOwotICAgICAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsICZleHB0bXAsIDAsIHJlbG9jX3R5cGUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHAsIDAsCi0JCSAgIG5ieXRlcyA9PSAyID8gQkZEX1JFTE9DXzE2Ci0JCSAgIDogbmJ5dGVzID09IDggPyBCRkRfUkVMT0NfNjQKLQkJICAgOiBCRkRfUkVMT0NfMzIpOwotICAgIH0KLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlbGF5IHNsb3QuICAqLwotICByZXR1cm4gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+Znhfc2l6ZTsKLX0KLQotLyogQ29tcHV0ZSB0aGUgcmVsb2MgdHlwZSBvZiBhbiBleHByZXNzaW9uLgotICAgVGhlIHBvc3NpYmx5IG1vZGlmaWVkIGV4cHJlc3Npb24gaXMgc3RvcmVkIGluIEVYUE5FVy4KLQotICAgVGhpcyBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4cHJlc3Npb25zIGdlbmVyYXRlZCBieSB0aGUgJS1vcCdzIGludG8KLSAgIHRoZSBhcHByb3ByaWF0ZSBvcGVyYW5kIHR5cGUuICBJdCBpcyBjYWxsZWQgZm9yIGJvdGggZGF0YSBpbiBpbnN0cnVjdGlvbnMKLSAgIChvcGVyYW5kcykgYW5kIGRhdGEgb3V0c2lkZSBpbnN0cnVjdGlvbnMgKHZhcmlhYmxlcywgZGVidWdnaW5nIGluZm8sIGV0Yy4pLgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkICUtb3BzOgotCi0gICAlc3Qoc3ltYm9sKTogcmVwcmVzZW50ZWQgYXMgInN5bWJvbCA+PiAyIgotICAgICAgICAgICAgICAgICJzdCIgaXMgc2hvcnQgZm9yIFNUYXR1cyBhcyBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIChwYykKLQotICAgREVGQVVMVF9UWVBFIGlzIHRoZSB0eXBlIHRvIHVzZSBpZiBubyBzcGVjaWFsIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuCi0KLSAgIERBVEFfUCBpcyBub24temVybyBmb3IgZGF0YSBvciBsaW1tIHZhbHVlcywgemVybyBmb3IgaW5zbiBvcGVyYW5kcy4KLSAgIFJlbWVtYmVyIHRoYXQgdGhlIG9wY29kZSAiaW5zZXJ0aW9uIGZucyIgY2Fubm90IGJlIHVzZWQgb24gZGF0YSwgdGhleSdyZQotICAgb25seSBmb3IgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zbnMuICBUaGV5IGFsc28gY2FuJ3QgYmUgdXNlZCBmb3IgbGltbQotICAgdmFsdWVzIGFzIHRoZSBpbnNlcnRpb24gcm91dGluZXMgZG9uJ3QgaGFuZGxlIGxpbW0gdmFsdWVzLiAgV2hlbiBjYWxsZWQgZm9yCi0gICBpbnNucyB3ZSByZXR1cm4gZnVkZ2VkIHJlbG9jIHR5cGVzIChyZWFsX3ZhbHVlIC0gQkZEX1JFTE9DX1VOVVNFRCkuICBXaGVuCi0gICBjYWxsZWQgZm9yIGRhdGEgb3IgbGltbSB2YWx1ZXMgd2UgdXNlIHJlYWwgcmVsb2MgdHlwZXMuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfYXJjX2V4cF9yZWxvY190eXBlIChkYXRhX3AsIGRlZmF1bHRfdHlwZSwgZXhwLCBleHBuZXcpCi0gICAgIGludCBkYXRhX3A7Ci0gICAgIGludCBkZWZhdWx0X3R5cGU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGV4cHJlc3Npb25TICpleHBuZXc7Ci17Ci0gIC8qIElmIHRoZSBleHByZXNzaW9uIGlzICJzeW1ib2wgPj4gMiIgd2UgbXVzdCBjaGFuZ2UgaXQgdG8ganVzdCAic3ltYm9sIiwKLSAgICAgYXMgZml4X25ld19leHAgY2FuJ3QgaGFuZGxlIGl0LiAgU2ltaWxhcmlseSBmb3IgKHN5bWJvbCAtIHN5bWJvbCkgPj4gMi4KLSAgICAgVGhhdCdzIG9rIHRob3VnaC4gIFdoYXQncyByZWFsbHkgZ29pbmcgb24gaGVyZSBpcyB0aGF0IHdlJ3JlIHVzaW5nCi0gICAgICI+PiAyIiBhcyBhIHNwZWNpYWwgc3ludGF4IGZvciBzcGVjaWZ5aW5nIEJGRF9SRUxPQ19BUkNfQjI2LiAgKi8KLQotICBpZiAoZXhwLT5YX29wID09IE9fcmlnaHRfc2hpZnQKLSAgICAgICYmIGV4cC0+WF9vcF9zeW1ib2wgIT0gTlVMTAotICAgICAgJiYgc3ltYm9sX2NvbnN0YW50X3AgKGV4cC0+WF9vcF9zeW1ib2wpCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoZXhwLT5YX29wX3N5bWJvbCkgPT0gMgotICAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgJiYgKHN5bWJvbF9jb25zdGFudF9wIChleHAtPlhfYWRkX3N5bWJvbCkKLQkgICAgICB8fCBzeW1ib2xfZXF1YXRlZF9wIChleHAtPlhfYWRkX3N5bWJvbCkpKQotCXsKLQkgICpleHBuZXcgPSAqZXhwOwotCSAgZXhwbmV3LT5YX29wID0gT19zeW1ib2w7Ci0JICBleHBuZXctPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIHJldHVybiBkYXRhX3AgPyBCRkRfUkVMT0NfQVJDX0IyNiA6IGFyY19vcGVyYW5kX21hcFsnSiddOwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfc3ltYm9sICE9IE5VTEwKLQkgICAgICAgJiYgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZXhwLT5YX2FkZF9zeW1ib2wpLT5YX29wCi0JCSAgID09IE9fc3VidHJhY3QpKQotCXsKLQkgICpleHBuZXcgPSAqc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCk7Ci0JICByZXR1cm4gZGF0YV9wID8gQkZEX1JFTE9DX0FSQ19CMjYgOiBhcmNfb3BlcmFuZF9tYXBbJ0onXTsKLQl9Ci0gICAgfQotCi0gICpleHBuZXcgPSAqZXhwOwotICByZXR1cm4gZGVmYXVsdF90eXBlOwotfQotCi0vKiBBcHBseSBhIGZpeHVwIHRvIHRoZSBvYmplY3QgY29kZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBhbGwgdGhlCi0gICBmaXh1cHMgd2UgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsIHRvIGZpeF9uZXdfZXhwLCBhYm92ZS4gIEluIHRoZSBjYWxsCi0gICBhYm92ZSB3ZSB1c2VkIGEgcmVsb2MgY29kZSB3aGljaCB3YXMgdGhlIGxhcmdlc3QgbGVnYWwgcmVsb2MgY29kZQotICAgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIEhlcmUgd2UgdW5kbyB0aGF0IHRvIHJlY292ZXIgdGhlIG9wZXJhbmQKLSAgIGluZGV4LiAgQXQgdGhpcyBwb2ludCBhbGwgc3ltYm9sIHZhbHVlcyBzaG91bGQgYmUgZnVsbHkgcmVzb2x2ZWQsCi0gICBhbmQgd2UgYXR0ZW1wdCB0byBjb21wbGV0ZWx5IHJlc29sdmUgdGhlIHJlbG9jLiAgSWYgd2UgY2FuIG5vdCBkbwotICAgdGhhdCwgd2UgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHJlbG9jIGNvZGUgYW5kIHB1dCBpdCBiYWNrIGluIHRoZSBmaXh1cC4gICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsdWVQLCBzZWcpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWVQOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLypjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ki8KLSAgdmFsdWVUIHZhbHVlOwotCi0gIC8qIEZJWE1FIEZJWE1FIEZJWE1FOiBUaGUgdmFsdWUgd2UgYXJlIHBhc3NlZCBpbiAqdmFsdWVQIGluY2x1ZGVzCi0gICAgIHRoZSBzeW1ib2wgdmFsdWVzLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEJGRF9BU1NFTUJMRVIsIGlmIHdlIGFyZQotICAgICBkb2luZyB0aGlzIHJlbG9jYXRpb24gdGhlIGNvZGUgaW4gd3JpdGUuYyBpcyBnb2luZyB0byBjYWxsCi0gICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIHdoaWNoIGlzIGFsc28gZ29pbmcgdG8gdXNlIHRoZSBzeW1ib2wKLSAgICAgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIHJlbG9jIGlzIGZ1bGx5IHJlc29sdmVkIHdlIHdhbnQgdG8KLSAgICAgdXNlICp2YWx1ZVAgc2luY2UgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBub3QgYmVpbmcgdXNlZC4KLSAgICAgSG93ZXZlciwgaWYgdGhlIHJlbG9jIGlzIG5vdCBmdWxseSByZXNvbHZlZCB3ZSBkbyBub3Qgd2FudCB0byB1c2UKLSAgICAgKnZhbHVlUCwgYW5kIG11c3QgdXNlIGZ4X29mZnNldCBpbnN0ZWFkLiAgSG93ZXZlciwgaWYgdGhlIHJlbG9jCi0gICAgIGlzIFBDIHJlbGF0aXZlLCB3ZSBkbyB3YW50IHRvIHVzZSAqdmFsdWVQIHNpbmNlIGl0IGluY2x1ZGVzIHRoZQotICAgICByZXN1bHQgb2YgbWRfcGNyZWxfZnJvbS4gIFRoaXMgaXMgY29uZnVzaW5nLiAgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICp2YWx1ZVA7Ci0gICAgICBmaXhQLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlUDsKLSAgICAgIC8qIEVMRiByZWxvY2F0aW9ucyBhcmUgYWdhaW5zdCBzeW1ib2xzLgotCSBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIHRoZW4gd2UgbmVlZCB0byBsZWF2ZSBpdCBmb3IKLQkgdGhlIGxpbmtlciB0byBkZWFsIHdpdGguICBVbmZvcnR1bmF0ZWx5LCBtZF9wY3JlbF9mcm9tIGNhbid0IHRlbGwsCi0JIHNvIHdlIGhhdmUgdG8gdW5kbyBpdCdzIGVmZmVjdHMgaGVyZS4gICovCi0gICAgICBpZiAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWcpCi0JdmFsdWUgKz0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4UC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKChpbnQpIGZpeFAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgY2hhciAqd2hlcmU7Ci0gICAgICBhcmNfaW5zbiBpbnNuOwotCi0gICAgICBvcGluZGV4ID0gKGludCkgZml4UC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLQotICAgICAgb3BlcmFuZCA9ICZhcmNfb3BlcmFuZHNbb3BpbmRleF07Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0JIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotICAgICAgd2hlcmUgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgaW5zbiA9IGFyY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgLTEsIE5VTEwsIChvZmZzZXRUKSB2YWx1ZSwKLQkJCQkgZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQl7Ci0JICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8gaGVyZS4gICovCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbi4KLQkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50byByZWxvY3MuCi0JICEhISBOb3RlIHRoYXQgd2UgY2FuJ3QgaGFuZGxlIGxpbW0gdmFsdWVzIGhlcmUuICBTaW5jZSB3ZSdyZSB1c2luZwotCSBpbXBsaWNpdCBhZGRlbmRzIHRoZSBhZGRlbmQgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiwKLQkgaG93ZXZlciwgdGhlIG9wY29kZSBpbnNlcnRpb24gcm91dGluZXMgY3VycmVudGx5IGRvIG5vdGhpbmcgd2l0aAotCSBsaW1tIHZhbHVlcy4gICovCi0gICAgICBpZiAob3BlcmFuZC0+Zm10ID09ICdCJykKLQl7Ci0JICBhc3NlcnQgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCkgIT0gMAotCQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjAKLQkJICAmJiBvcGVyYW5kLT5zaGlmdCA9PSA3KTsKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMOwotCX0KLSAgICAgIGVsc2UgaWYgKDAgJiYgb3BlcmFuZC0+Zm10ID09ICdKJykKLQl7Ci0JICBhc3NlcnQgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCkgIT0gMAotCQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjQKLQkJICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAzMik7Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfQVJDX0IyNjsKLQl9Ci0gICAgICBlbHNlIGlmICgwICYmIG9wZXJhbmQtPmZtdCA9PSAnTCcpCi0JewotCSAgYXNzZXJ0ICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9MSU1NKSAhPSAwCi0JCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAzMgotCQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDMyKTsKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ184OgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMSk7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotI2lmIDAKLQljYXNlIEJGRF9SRUxPQ182NDoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDgpOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQljYXNlIEJGRF9SRUxPQ19BUkNfQjI2OgotCSAgLyogSWYgIWZpeFAtPmZ4X2RvbmUgdGhlbiBgdmFsdWUnIGlzIGFuIGltcGxpY2l0IGFkZGVuZC4KLQkgICAgIFdlIG11c3Qgc2hpZnQgaXQgcmlnaHQgYnkgMiBpbiB0aGlzIGNhc2UgYXMgd2VsbCBiZWNhdXNlIHRoZQotCSAgICAgbGlua2VyIHBlcmZvcm1zIHRoZSByZWxvY2F0aW9uIGFuZCB0aGVuIGFkZHMgdGhpcyBpbiAoYXMgb3Bwb3NlZAotCSAgICAgdG8gYWRkaW5nIHRoaXMgaW4gYW5kIHRoZW4gc2hpZnRpbmcgcmlnaHQgYnkgMikuICAqLwotCSAgdmFsdWUgPj49IDI7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4UC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiKSwKLQkJICAgIGZpeFAtPmZ4X3JfdHlwZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeFAtPmZ4X3JfdHlwZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFzc2VydCAoIWZpeFAtPmZ4X3BjcmVsID09ICFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKTsKLQotICByZWxvYy0+YWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KLQwKLS8qIEZyb2JiZXJzLiAgKi8KLQotI2lmIDAKLS8qIFNldCB0aGUgcmVhbCBuYW1lIGlmIHRoZSAucmVuYW1lIHBzZXVkby1vcCB3YXMgdXNlZC4KLSAgIFJldHVybiAxIGlmIHRoZSBzeW1ib2wgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotaW50Ci1hcmNfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgU19TRVRfTkFNRSAoc3ltLCBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUpOwotCi0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFyYy5oIGIvZ2FzL2NvbmZpZy90Yy1hcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NjIwMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogdGMtYXJjLmggLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5lcyBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX0FSQyAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfYXJjCi0KLSNkZWZpbmUgTElUVExFX0VORElBTiAgIDEyMzQKLSNkZWZpbmUgQklHX0VORElBTiAgICAgIDQzMjEKLQotLyogVGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldCBmb3JtYXQgbWF5IGNoYW5nZSBiYXNlZCBvbiBjb21tYW5kCi0gICBsaW5lIGFyZ3VtZW50cy4gICovCi1leHRlcm4gY29uc3QgY2hhciAqYXJjX3RhcmdldF9mb3JtYXQ7Ci0jZGVmaW5lIERFRkFVTFRfVEFSR0VUX0ZPUk1BVCAiZWxmMzItbGl0dGxlYXJjIgotI2RlZmluZSBUQVJHRVRfRk9STUFUIGFyY190YXJnZXRfZm9ybWF0Ci0jZGVmaW5lIERFRkFVTFRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJBUkMgR0FTICIKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIFRoZSBBUkMgbmVlZHMgdG8gcGFyc2UgcmVsb2Mgc3BlY2lmaWVycyBpbiAud29yZC4gICovCi0KLWV4dGVybiB2b2lkIGFyY19wYXJzZV9jb25zX2V4cHJlc3Npb24gKCk7Ci0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgXAotYXJjX3BhcnNlX2NvbnNfZXhwcmVzc2lvbiAoRVhQLCBOQllURVMpCi0KLWV4dGVybiB2b2lkIGFyY19jb25zX2ZpeF9uZXcgKCk7Ci0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyhGUkFHLCBXSEVSRSwgTkJZVEVTLCBFWFApIFwKLWFyY19jb25zX2ZpeF9uZXcgKEZSQUcsIFdIRVJFLCBOQllURVMsIEVYUCkKLQotI2lmIDAKLS8qIEV4dHJhIHN0dWZmIHRoYXQgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGZvciBlYWNoIHN5bWJvbC4gICovCi1zdHJ1Y3QgYXJjX3RjX3N5Ci17Ci0gIC8qIFRoZSByZWFsIG5hbWUsIGlmIHRoZSBzeW1ib2wgd2FzIHJlbmFtZWQuICAqLwotICBjaGFyICpyZWFsX25hbWU7Ci19OwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IGFyY190Y19zeQotCi0vKiBGaW5pc2ggdXAgdGhlIHN5bWJvbC4gICovCi1leHRlcm4gaW50IGFyY19mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLCBwdW50KSBwdW50ID0gYXJjX2Zyb2Jfc3ltYm9sIChzeW0pCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJtLmMgYi9nYXMvY29uZmlnL3RjLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2M2ZDgyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTQyICswLDAgQEAKLS8qIHRjLWFybS5jIC0tIEFzc2VtYmxlIGZvciB0aGUgQVJNCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQlNb2RpZmllZCBieSBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgIE5PX1JFTE9DIDAKLSNpbmNsdWRlICJhcy5oIgotCi0vKiBuZWVkIFRBUkdFVF9DUFUgKi8KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgInN5bWJvbHMuaCIKLSNpbmNsdWRlICJsaXN0aW5nLmgiCi0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2VuZGlmCi0KLS8qIFR5cGVzIG9mIHByb2Nlc3NvciB0byBhc3NlbWJsZSBmb3IuICAqLwotI2RlZmluZSBBUk1fMQkJMHgwMDAwMDAwMQotI2RlZmluZSBBUk1fMgkJMHgwMDAwMDAwMgotI2RlZmluZSBBUk1fMwkJMHgwMDAwMDAwNAotI2RlZmluZSBBUk1fMjUwCQlBUk1fMwotI2RlZmluZSBBUk1fNgkJMHgwMDAwMDAwOAotI2RlZmluZSBBUk1fNwkJQVJNXzYgICAgICAgICAgIC8qIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKi8KLSNkZWZpbmUgQVJNXzgJCUFSTV82ICAgICAgICAgICAvKiBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0ICovCi0jZGVmaW5lIEFSTV85CQlBUk1fNiAgICAgICAgICAgLyogc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCAqLwotI2RlZmluZSBBUk1fQ1BVX01BU0sJMHgwMDAwMDAwZgotCi0vKiBUaGUgZm9sbG93aW5nIGJpdG1hc2tzIGNvbnRyb2wgQ1BVIGV4dGVuc2lvbnMgKEFSTTcgb253YXJkcyk6ICovCi0jZGVmaW5lIEFSTV9MT05HTVVMCTB4MDAwMDAwMTAJLyogYWxsb3cgbG9uZyBtdWx0aXBsaWVzICovCi0jZGVmaW5lIEFSTV9IQUxGV09SRCAgICAweDAwMDAwMDIwCS8qIGFsbG93IGhhbGYgd29yZCBsb2FkcyAqLwotI2RlZmluZSBBUk1fVEhVTUIgICAgICAgMHgwMDAwMDA0MAkvKiBhbGxvdyBCWCBpbnN0cnVjdGlvbiAgKi8KLSNkZWZpbmUgQVJNX0VYVF9WNQkweDAwMDAwMDgwCS8qIGFsbG93IENMWiBldGMJICovCi0KLS8qIEFyY2hpdGVjdHVyZXMgYXJlIHRoZSBzdW0gb2YgdGhlIGJhc2UgYW5kIGV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgQVJNX0FSQ0hfVjQJKEFSTV83IHwgQVJNX0xPTkdNVUwgfCBBUk1fSEFMRldPUkQpCi0jZGVmaW5lIEFSTV9BUkNIX1Y0VAkoQVJNX0FSQ0hfVjQgfCBBUk1fVEhVTUIpCi0jZGVmaW5lIEFSTV9BUkNIX1Y1CShBUk1fQVJDSF9WNCB8IEFSTV9FWFRfVjUpCi0jZGVmaW5lIEFSTV9BUkNIX1Y1VAkoQVJNX0FSQ0hfVjUgfCBBUk1fVEhVTUIpCi0KLS8qIFNvbWUgdXNlZnVsIGNvbWJpbmF0aW9uczogICovCi0jZGVmaW5lIEFSTV9BTlkJCTB4MDBmZmZmZmYKLSNkZWZpbmUgQVJNXzJVUAkJKEFSTV9BTlkgLSBBUk1fMSkKLSNkZWZpbmUgQVJNX0FMTAkJQVJNXzJVUAkJLyogTm90IGFybTEgb25seSAqLwotI2RlZmluZSBBUk1fM1VQCQkweDAwZmZmZmZjCi0jZGVmaW5lIEFSTV82VVAJCTB4MDBmZmZmZjggICAgICAvKiBJbmNsdWRlcyBBUk03ICovCi0KLSNkZWZpbmUgRlBVX0NPUkUJMHg4MDAwMDAwMAotI2RlZmluZSBGUFVfRlBBMTAJMHg0MDAwMDAwMAotI2RlZmluZSBGUFVfRlBBMTEJMHg0MDAwMDAwMAotI2RlZmluZSBGUFVfTk9ORQkwCi0KLS8qIFNvbWUgdXNlZnVsIGNvbWJpbmF0aW9ucyAgKi8KLSNkZWZpbmUgRlBVX0FMTAkJMHhmZjAwMDAwMAkvKiBOb3RlIHRoaXMgaXMgfkFSTV9BTlkgKi8KLSNkZWZpbmUgRlBVX01FTU1VTFRJCTB4N2YwMDAwMDAJLyogTm90IGZwdV9jb3JlICovCi0KLSAgICAgCi0jaWZuZGVmIENQVV9ERUZBVUxUCi0jaWYgZGVmaW5lZCBfX3RodW1iX18KLSNkZWZpbmUgQ1BVX0RFRkFVTFQgKEFSTV9BUkNIX1Y0IHwgQVJNX1RIVU1CKQotI2Vsc2UKLSNkZWZpbmUgQ1BVX0RFRkFVTFQgQVJNX0FMTAotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBGUFVfREVGQVVMVAotI2RlZmluZSBGUFVfREVGQVVMVCBGUFVfQUxMCi0jZW5kaWYKLQotI2RlZmluZSBzdHJlcShhLGIpICAoc3RyY21wIChhLCBiKSA9PSAwKQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwljcHVfdmFyaWFudCA9IENQVV9ERUZBVUxUIHwgRlBVX0RFRkFVTFQ7Ci1zdGF0aWMgaW50IHRhcmdldF9vYWJpID0gMDsKLQotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0vKiBGbGFncyBzdG9yZWQgaW4gcHJpdmF0ZSBhcmVhIG9mIEJGRCBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyBib29sZWFuCQl1c2VzX2FwY3NfMjYgPSBmYWxzZTsKLXN0YXRpYyBib29sZWFuCQlzdXBwb3J0X2ludGVyd29yayA9IGZhbHNlOwotc3RhdGljIGJvb2xlYW4JCXVzZXNfYXBjc19mbG9hdCA9IGZhbHNlOwotc3RhdGljIGJvb2xlYW4JCXBpY19jb2RlID0gZmFsc2U7Ci0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLUNPTlNUIGNoYXIgY29tbWVudF9jaGFyc1tdID0gIkAiOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLwotQ09OU1QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotI2lmZGVmIFRFX0xJTlVYCi1DT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0jZWxzZQotQ09OU1QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0jZW5kaWYKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLUNPTlNUIGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi0KLUNPTlNUIGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WGVFcFAiOwotCi0vKiBQcmVmaXggY2hhcmFjdGVycyB0aGF0IGluZGljYXRlIHRoZSBzdGFydCBvZiBhbiBpbW1lZGlhdGUKLSAgIHZhbHVlLiAgKi8KLSNkZWZpbmUgaXNfaW1tZWRpYXRlX3ByZWZpeChDKSAoKEMpID09ICcjJyB8fCAoQykgPT0gJyQnKQotCi0jaWZkZWYgT0JKX0VMRgotc3ltYm9sUyAqIEdPVF9zeW1ib2w7CQkvKiBQcmUtZGVmaW5lZCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiAqLwotI2VuZGlmCi0KLUNPTlNUIGludCBtZF9yZWxvY19zaXplID0gODsJCS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotc3RhdGljIGludCB0aHVtYl9tb2RlID0gMDsgICAgICAvKiBub24temVybyBpZiBhc3NlbWJsaW5nIHRodW1iIGluc3RydWN0aW9ucyAqLwotCi10eXBlZGVmIHN0cnVjdCBhcm1fZml4Ci17Ci0gIGludCB0aHVtYl9tb2RlOwotfSBhcm1fZml4X2RhdGE7Ci0KLXN0cnVjdCBhcm1faXQKLXsKLSAgQ09OU1QgY2hhciAqICBlcnJvcjsKLSAgdW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbjsKLSAgaW50ICAgICAgICAgICBzdWZmaXg7Ci0gIGludCAgICAgICAgICAgc2l6ZTsKLSAgc3RydWN0Ci0gICAgewotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHR5cGU7Ci0gICAgICBleHByZXNzaW9uUyAgICAgICAgICAgICAgZXhwOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHBjX3JlbDsKLSAgICB9IHJlbG9jOwotfTsKLQotc3RydWN0IGFybV9pdCBpbnN0OwotCi1zdHJ1Y3QgYXNtX3NoaWZ0Ci17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9zaGlmdCBzaGlmdFtdID0KLXsKLSAgeyJhc2wiLCAwfSwKLSAgeyJsc2wiLCAwfSwKLSAgeyJsc3IiLCAweDAwMDAwMDIwfSwKLSAgeyJhc3IiLCAweDAwMDAwMDQwfSwKLSAgeyJyb3IiLCAweDAwMDAwMDYwfSwKLSAgeyJycngiLCAweDAwMDAwMDYwfSwKLSAgeyJBU0wiLCAwfSwKLSAgeyJMU0wiLCAwfSwKLSAgeyJMU1IiLCAweDAwMDAwMDIwfSwKLSAgeyJBU1IiLCAweDAwMDAwMDQwfSwKLSAgeyJST1IiLCAweDAwMDAwMDYwfSwKLSAgeyJSUlgiLCAweDAwMDAwMDYwfQotfTsKLQotI2RlZmluZSBOT19TSElGVF9SRVNUUklDVCAxCi0jZGVmaW5lIFNISUZUX1JFU1RSSUNUCSAgMAotCi0jZGVmaW5lIE5VTV9GTE9BVF9WQUxTIDgKLQotQ09OU1QgY2hhciAqIGZwX2NvbnN0W10gPSAKLXsKLSAgIjAuMCIsICIxLjAiLCAiMi4wIiwgIjMuMCIsICI0LjAiLCAiNS4wIiwgIjAuNSIsICIxMC4wIiwgMAotfTsKLQotLyogTnVtYmVyIG9mIGxpdHRsZW51bXMgcmVxdWlyZWQgdG8gaG9sZCBhbiBleHRlbmRlZCBwcmVjaXNpb24gbnVtYmVyICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotTElUVExFTlVNX1RZUEUgZnBfdmFsdWVzW05VTV9GTE9BVF9WQUxTXVtNQVhfTElUVExFTlVNU107Ci0KLSNkZWZpbmUgRkFJTAkoLTEpCi0jZGVmaW5lIFNVQ0NFU1MgKDApCi0KLSNkZWZpbmUgU1VGRl9TIDEKLSNkZWZpbmUgU1VGRl9EIDIKLSNkZWZpbmUgU1VGRl9FIDMKLSNkZWZpbmUgU1VGRl9QIDQKLQotI2RlZmluZSBDUF9UX1ggICAweDAwMDA4MDAwCi0jZGVmaW5lIENQX1RfWSAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgQ1BfVF9QcmUgMHgwMTAwMDAwMAotI2RlZmluZSBDUF9UX1VEICAweDAwODAwMDAwCi0jZGVmaW5lIENQX1RfV0IgIDB4MDAyMDAwMDAKLQotI2RlZmluZSBDT05EU19CSVQgICAgICAgKDB4MDAxMDAwMDApCi0jZGVmaW5lIExPQURfQklUICAgICAgICAoMHgwMDEwMDAwMCkKLSNkZWZpbmUgVFJBTlNfQklUCSgweDAwMjAwMDAwKQotCi1zdHJ1Y3QgYXNtX2NvbmQKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLX07Ci0KLS8qIFRoaXMgaXMgdG8gc2F2ZSBhIGhhc2ggbG9vay11cCBpbiB0aGUgY29tbW9uIGNhc2UgKi8KLSNkZWZpbmUgQ09ORF9BTFdBWVMgMHhlMDAwMDAwMAotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9jb25kIGNvbmRzW10gPSAKLXsKLSAgeyJlcSIsIDB4MDAwMDAwMDB9LAotICB7Im5lIiwgMHgxMDAwMDAwMH0sCi0gIHsiY3MiLCAweDIwMDAwMDAwfSwgeyJocyIsIDB4MjAwMDAwMDB9LAotICB7ImNjIiwgMHgzMDAwMDAwMH0sIHsidWwiLCAweDMwMDAwMDAwfSwgeyJsbyIsIDB4MzAwMDAwMDB9LAotICB7Im1pIiwgMHg0MDAwMDAwMH0sCi0gIHsicGwiLCAweDUwMDAwMDAwfSwKLSAgeyJ2cyIsIDB4NjAwMDAwMDB9LAotICB7InZjIiwgMHg3MDAwMDAwMH0sCi0gIHsiaGkiLCAweDgwMDAwMDAwfSwKLSAgeyJscyIsIDB4OTAwMDAwMDB9LAotICB7ImdlIiwgMHhhMDAwMDAwMH0sCi0gIHsibHQiLCAweGIwMDAwMDAwfSwKLSAgeyJndCIsIDB4YzAwMDAwMDB9LAotICB7ImxlIiwgMHhkMDAwMDAwMH0sCi0gIHsiYWwiLCAweGUwMDAwMDAwfSwKLSAgeyJudiIsIDB4ZjAwMDAwMDB9Ci19OwotCi0vKiBXYXJuaW5nOiBJZiB0aGUgdG9wIGJpdCBvZiB0aGUgc2V0X2JpdHMgaXMgc2V0LCB0aGVuIHRoZSBzdGFuZGFyZAotICAgaW5zdHJ1Y3Rpb24gYml0bWFzayBpcyBpZ25vcmVkLCBhbmQgdGhlIG5ldyBiaXRtYXNrIGlzIHRha2VuIGZyb20KLSAgIHRoZSBzZXRfYml0czogKi8KLXN0cnVjdCBhc21fZmxnCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7CS8qIEJhc2ljIGZsYWcgc3RyaW5nICovCi0gIHVuc2lnbmVkIGxvbmcgc2V0X2JpdHM7CS8qIEJpdHMgdG8gc2V0ICovCi19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc19mbGFnW10gPQotewotICB7InMiLCBDT05EU19CSVR9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZHJfZmxhZ3NbXSA9Ci17Ci0gIHsiYiIsICAweDAwNDAwMDAwfSwKLSAgeyJ0IiwgIFRSQU5TX0JJVH0sCi0gIHsiYnQiLCAweDAwNDAwMDAwIHwgVFJBTlNfQklUfSwKLSAgeyJoIiwgIDB4ODAxMDAwYjB9LAotICB7InNoIiwgMHg4MDEwMDBmMH0sCi0gIHsic2IiLCAweDgwMTAwMGQwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc3RyX2ZsYWdzW10gPQotewotICB7ImIiLCAgMHgwMDQwMDAwMH0sCi0gIHsidCIsICBUUkFOU19CSVR9LAotICB7ImJ0IiwgMHgwMDQwMDAwMCB8IFRSQU5TX0JJVH0sCi0gIHsiaCIsICAweDgwMDAwMGIwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgYnl0ZV9mbGFnW10gPQotewotICB7ImIiLCAweDAwNDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgY21wX2ZsYWdzW10gPQotewotICB7InMiLCBDT05EU19CSVR9LAotICB7InAiLCAweDAwMTBmMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgbGRtX2ZsYWdzW10gPQotewotICB7ImVkIiwgMHgwMTgwMDAwMH0sCi0gIHsiZmQiLCAweDAwODAwMDAwfSwKLSAgeyJlYSIsIDB4MDEwMDAwMDB9LAotICB7ImZhIiwgMHgwODAwMDAwMH0sCi0gIHsiaWIiLCAweDAxODAwMDAwfSwKLSAgeyJpYSIsIDB4MDA4MDAwMDB9LAotICB7ImRiIiwgMHgwMTAwMDAwMH0sCi0gIHsiZGEiLCAweDA4MDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc3RtX2ZsYWdzW10gPQotewotICB7ImVkIiwgMHgwODAwMDAwMH0sCi0gIHsiZmQiLCAweDAxMDAwMDAwfSwKLSAgeyJlYSIsIDB4MDA4MDAwMDB9LAotICB7ImZhIiwgMHgwMTgwMDAwMH0sCi0gIHsiaWIiLCAweDAxODAwMDAwfSwKLSAgeyJpYSIsIDB4MDA4MDAwMDB9LAotICB7ImRiIiwgMHgwMTAwMDAwMH0sCi0gIHsiZGEiLCAweDA4MDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgbGZtX2ZsYWdzW10gPQotewotICB7ImZkIiwgMHgwMDgwMDAwMH0sCi0gIHsiZWEiLCAweDAxMDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc2ZtX2ZsYWdzW10gPQotewotICB7ImZkIiwgMHgwMTAwMDAwMH0sCi0gIHsiZWEiLCAweDAwODAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgcm91bmRfZmxhZ3NbXSA9Ci17Ci0gIHsicCIsIDB4MDAwMDAwMjB9LAotICB7Im0iLCAweDAwMDAwMDQwfSwKLSAgeyJ6IiwgMHgwMDAwMDA2MH0sCi0gIHtOVUxMLCAwfQotfTsKLQotLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBGSVggaW5zdHJ1Y3Rpb24gaXMgYnJva2VuIG9uIHNvbWUgYXNzZW1ibGVycywKLSAgIGluIHRoYXQgaXQgYWNjZXB0cyBhIHByZWNpc2lvbiBzcGVjaWZpZXIgYXMgd2VsbCBhcyBhIHJvdW5kaW5nIHNwZWNpZmllciwKLSAgIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGlzIGlzIG1lYW5pbmdsZXNzLiAgVG8gYmUgbW9yZSBjb21wYXRpYmxlLCB3ZQotICAgYWNjZXB0IGl0IGFzIHdlbGwsIHRob3VnaCBvZiBjb3Vyc2UgaXQgZG9lcyBub3Qgc2V0IGFueSBiaXRzLiAgKi8KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBmaXhfZmxhZ3NbXSA9Ci17Ci0gIHsicCIsIDB4MDAwMDAwMjB9LAotICB7Im0iLCAweDAwMDAwMDQwfSwKLSAgeyJ6IiwgMHgwMDAwMDA2MH0sCi0gIHsic3AiLCAweDAwMDAwMDIwfSwKLSAgeyJzbSIsIDB4MDAwMDAwNDB9LAotICB7InN6IiwgMHgwMDAwMDA2MH0sCi0gIHsiZHAiLCAweDAwMDAwMDIwfSwKLSAgeyJkbSIsIDB4MDAwMDAwNDB9LAotICB7ImR6IiwgMHgwMDAwMDA2MH0sCi0gIHsiZXAiLCAweDAwMDAwMDIwfSwKLSAgeyJlbSIsIDB4MDAwMDAwNDB9LAotICB7ImV6IiwgMHgwMDAwMDA2MH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGV4Y2VwdF9mbGFnW10gPQotewotICB7ImUiLCAweDAwNDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgY3Bsb25nX2ZsYWdbXSA9Ci17Ci0gIHsibCIsIDB4MDA0MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0cnVjdCBhc21fcHNyCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotfTsKLQotI2RlZmluZSBQU1JfRklFTERfTUFTSyAgMHgwMDBmMDAwMAotCi0jZGVmaW5lIFBTUl9GTEFHUwkweDAwMDgwMDAwCi0jZGVmaW5lIFBTUl9DT05UUk9MCTB4MDAwMTAwMDAgLyogVW5kb2N1bWVudGVkIGluc3RydWN0aW9uLCBpdHMgdXNlIGlzIGRpc2NvdXJhZ2VkIGJ5IEFSTSAqLwotI2RlZmluZSBQU1JfQUxMCQkweDAwMDkwMDAwCi0KLSNkZWZpbmUgQ1BTUl9BTEwJMAotI2RlZmluZSBTUFNSX0FMTAkxCi0jZGVmaW5lIENQU1JfRkxHCTIKLSNkZWZpbmUgU1BTUl9GTEcJMwotI2RlZmluZSBDUFNSX0NUTAk0Ci0jZGVmaW5lIFNQU1JfQ1RMCTUKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fcHNyIHBzcnNbXSA9Ci17Ci0gIC8qIFZhbGlkIDxwc3I+J3MgKi8KLSAgeyJjcHNyIiwJQ1BTUl9BTEx9LAotICB7ImNwc3JfYWxsIiwJQ1BTUl9BTEx9LAotICB7InNwc3IiLAlTUFNSX0FMTH0sCi0gIHsic3Bzcl9hbGwiLAlTUFNSX0FMTH0sCi0KLSAgLyogVmFsaWQgPHBzcmY+J3MgKi8KLSAgeyJjcHNyX2ZsZyIsCUNQU1JfRkxHfSwKLSAgeyJzcHNyX2ZsZyIsCVNQU1JfRkxHfSwKLSAgCi0gIC8qIFZhbGlkIDxwc3JjPidzICovCi0gIHsiY3Bzcl9jIiwJQ1BTUl9DVEx9LAotICB7ImNwc3JfY3RsIiwJQ1BTUl9DVEx9LAotICB7InNwc3JfYyIsCVNQU1JfQ1RMfSwKLSAgeyJzcHNyX2N0bCIsCVNQU1JfQ1RMfQotfTsKLQotLyogRnVuY3Rpb25zIGNhbGxlZCBieSBwYXJzZXIgKi8KLS8qIEFSTSBpbnN0cnVjdGlvbnMgKi8KLXN0YXRpYyB2b2lkIGRvX2FyaXQJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19jbXAJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19tb3YJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19sZHN0CQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fbGRtc3RtCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fYnJhbmNoCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fc3dpCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotLyogUHNldWRvIE9wIGNvZGVzICovCi1zdGF0aWMgdm9pZCBkb19hZHIJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19hZHJsCQlQQVJBTVMgKChjaGFyICogb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX25vcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLS8qIEFSTSAyICovCi1zdGF0aWMgdm9pZCBkb19tdWwJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19tbGEJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBBUk0gMyAqLwotc3RhdGljIHZvaWQgZG9fc3dhcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLS8qIEFSTSA2ICovCi1zdGF0aWMgdm9pZCBkb19tc3IJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19tcnMJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBBUk0gN00gKi8KLXN0YXRpYyB2b2lkIGRvX211bGwJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBBUk0gVEhVTUIgKi8KLXN0YXRpYyB2b2lkIGRvX2J4ICAgICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLQotLyogQ29wcm9jZXNzb3IgSW5zdHJ1Y3Rpb25zICovCi1zdGF0aWMgdm9pZCBkb19jZHAJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19sc3RjCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fY29fcmVnCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfY3RybAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2xkc3QJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9sZG1zdG0JUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2R5YWRpYwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfbW9uYWRpYwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfY21wCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfZnJvbV9yZWcJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX3RvX3JlZwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotCi1zdGF0aWMgdm9pZCBmaXhfbmV3X2FybQkJUEFSQU1TICgoZnJhZ1MgKmZyYWcsIGludCB3aGVyZSwgCi0JCQkJCSBzaG9ydCBpbnQgc2l6ZSwgZXhwcmVzc2lvblMgKmV4cCwKLQkJCQkJIGludCBwY19yZWwsIGludCByZWxvYykpOwotc3RhdGljIGludCBhcm1fcmVnX3BhcnNlCVBBUkFNUyAoKGNoYXIgKipjY3ApKTsKLXN0YXRpYyBpbnQgYXJtX3Bzcl9wYXJzZQlQQVJBTVMgKChjaGFyICoqY2NwKSk7Ci1zdGF0aWMgdm9pZCBzeW1ib2xfbG9jYXRlCVBBUkFNUyAoKHN5bWJvbFMgKiwgQ09OU1QgY2hhciAqLCBzZWdULAotCQkJCQkgdmFsdWVULCBmcmFnUyAqKSk7Ci1zdGF0aWMgaW50IGFkZF90b19saXRfcG9vbAlQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdW5zaWduZWQgdmFsaWRhdGVfaW1tZWRpYXRlCVBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgdW5zaWduZWQgdmFsaWRhdGVfaW1tZWRpYXRlX3R3b3BhcnQJUEFSQU1TICgodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGludCB2YWxpZGF0ZV9vZmZzZXRfaW1tCVBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcGNvZGVfc2VsZWN0CVBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgZW5kX29mX2xpbmUJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCByZWdfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcHNyX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgY29fcHJvY19udW1iZXIJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBjcF9vcGNfZXhwcgkJUEFSQU1TICgoY2hhciAqKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgY3BfcmVnX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGZwX3JlZ19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBjcF9hZGRyZXNzX29mZnNldAlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IG15X2dldF9mbG9hdF9leHByZXNzaW9uCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgc2tpcF9wYXN0X2NvbW1hCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgd2Fsa19ub19iaWdudW1zCVBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIGludCBuZWdhdGVfZGF0YV9vcAlQQVJBTVMgKCh1bnNpZ25lZCBsb25nICosCi0JCQkJCSB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGRhdGFfb3AyCQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGZwX29wMgkJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGxvbmcgcmVnX2xpc3QJCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHRodW1iX2xvYWRfc3RvcmUJUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBkZWNvZGVfc2hpZnQJCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBsZHN0X2V4dGVuZAkJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB0aHVtYl9hZGRfc3ViCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnCQlQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHRodW1iX3NoaWZ0CQlQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgdGh1bWJfbW92X2NvbXBhcmUJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF9jb25zdGFudF9mbG9udW1zCVBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2YWx1ZVQgbWRfY2hhcnNfdG9fbnVtYmVyCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnX2FsaWFzCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfaW5zdAkJUEFSQU1TICgodm9pZCkpOwotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUJYXJtX3BhcnNlX3JlbG9jIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0vKiBBUk0gaW5zdHJ1Y3Rpb25zIHRha2UgNGJ5dGVzIGluIHRoZSBvYmplY3QgZmlsZSwgVGh1bWIgaW5zdHJ1Y3Rpb25zCi0gICB0YWtlIDI6ICovCi0jZGVmaW5lIElOU05fU0laRSAgICAgICA0Ci0KLS8qIExPTkdFU1RfSU5TVCBpcyB0aGUgbG9uZ2VzdCBiYXNpYyBpbnN0cnVjdGlvbiBuYW1lIHdpdGhvdXQgY29uZGl0aW9ucyBvciAKLSAqIGZsYWdzLgotICogQVJNN00gaGFzIDQgb2YgbGVuZ3RoIDUKLSAqLwotCi0jZGVmaW5lIExPTkdFU1RfSU5TVCA1Ci0KLXN0cnVjdCBhc21fb3Bjb2RlIAotewotICBDT05TVCBjaGFyICogICAgICAgICAgIHRlbXBsYXRlOwkvKiBCYXNpYyBzdHJpbmcgdG8gbWF0Y2ggKi8KLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2YWx1ZTsJCS8qIEJhc2ljIGluc3RydWN0aW9uIGNvZGUgKi8KLSAgQ09OU1QgY2hhciAqICAgICAgICAgICBjb21wX3N1ZmZpeDsJLyogQ29tcHVsc29yeSBzdWZmaXggdGhhdCBtdXN0IGZvbGxvdyBjb25kcyAqLwotICBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyAqIGZsYWdzOwkgICAgICAgIC8qIEJpdHMgdG8gdG9nZ2xlIGlmIGZsYWcgJ24nIHNldCAqLwotICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZhcmlhbnRzOwkvKiBXaGljaCBDUFUgdmFyaWFudHMgdGhpcyBleGlzdHMgZm9yICovCi0gIC8qIEZ1bmN0aW9uIHRvIGNhbGwgdG8gcGFyc2UgYXJncyAqLwotICB2b2lkICgqICAgICAgICAgICAgICAgIHBhcm1zKSBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSBpbnNuc1tdID0gCi17Ci0vKiBBUk0gSW5zdHJ1Y3Rpb25zICovCi0gIHsiYW5kIiwgICAweDAwMDAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7ImVvciIsICAgMHgwMDIwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJzdWIiLCAgIDB4MDA0MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsicnNiIiwgICAweDAwNjAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7ImFkZCIsICAgMHgwMDgwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJhZGMiLCAgIDB4MDBhMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsic2JjIiwgICAweDAwYzAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InJzYyIsICAgMHgwMGUwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJvcnIiLCAgIDB4MDE4MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsiYmljIiwgICAweDAxYzAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InRzdCIsICAgMHgwMTAwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAotICB7InRlcSIsICAgMHgwMTIwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAotICB7ImNtcCIsICAgMHgwMTQwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAotICB7ImNtbiIsICAgMHgwMTYwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAotICB7Im1vdiIsICAgMHgwMWEwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19tb3Z9LAotICB7Im12biIsICAgMHgwMWUwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19tb3Z9LAotICB7InN0ciIsICAgMHgwNDAwMDAwMCwgTlVMTCwgICBzdHJfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZHN0fSwKLSAgeyJsZHIiLCAgIDB4MDQxMDAwMDAsIE5VTEwsICAgbGRyX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fbGRzdH0sCi0gIHsic3RtIiwgICAweDA4MDAwMDAwLCBOVUxMLCAgIHN0bV9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkbXN0bX0sCi0gIHsibGRtIiwgICAweDA4MTAwMDAwLCBOVUxMLCAgIGxkbV9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkbXN0bX0sCi0gIHsic3dpIiwgICAweDBmMDAwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX3N3aX0sCi0gIHsiYmwiLCAgICAweDBiZmZmZmZlLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2JyYW5jaH0sCi0gIHsiYiIsICAgICAweDBhZmZmZmZlLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2JyYW5jaH0sCi0KLS8qIFBzZXVkbyBvcHMgKi8KLSAgeyJhZHIiLCAgIDB4MDI4ZjAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fYWRyfSwKLSAgeyJhZHJsIiwgIDB4MDI4ZjAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fYWRybH0sCi0gIHsibm9wIiwgICAweDAxYTAwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX25vcH0sCi0KLS8qIEFSTSAyIG11bHRpcGxpZXMgKi8KLSAgeyJtdWwiLCAgIDB4MDAwMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV8yVVAsICAgICAgZG9fbXVsfSwKLSAgeyJtbGEiLCAgIDB4MDAyMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV8yVVAsICAgICAgZG9fbWxhfSwKLQotLyogQVJNIDMgLSBzd3AgaW5zdHJ1Y3Rpb25zICovCi0gIHsic3dwIiwgICAweDAxMDAwMDkwLCBOVUxMLCAgIGJ5dGVfZmxhZywgICBBUk1fM1VQLCAgICAgIGRvX3N3YXB9LAotCi0vKiBBUk0gNiBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgeyJtcnMiLCAgIDB4MDEwZjAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV82VVAsICAgICAgZG9fbXJzfSwKLSAgeyJtc3IiLCAgIDB4MDEyMGYwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV82VVAsICAgICAgZG9fbXNyfSwKLS8qIFNjb3R0Qjogb3VyIGNvZGUgdXNlcyAweDAxMjhmMDAwIGZvciBtc3IuCi0gICBOaWNrQzogIGJ1dCB0aGlzIGlzIHdyb25nIGJlY2F1c2UgdGhlIGJpdHMgMTYgYW5kIDE5IGFyZSBoYW5kbGVkCi0gICAgICAgICAgIGJ5IHRoZSBQU1JfeHh4IGRlZmluZXMgYWJvdmUuICAqLwotCi0vKiBBUk0gN00gbG9uZyBtdWx0aXBsaWVzIC0gbmVlZCBzaWduZWQvdW5zaWduZWQgZmxhZ3MhICovCi0gIHsic211bGwiLCAweDAwYzAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotICB7InVtdWxsIiwgMHgwMDgwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKLSAgeyJzbWxhbCIsIDB4MDBlMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCi0gIHsidW1sYWwiLCAweDAwYTAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotCi0vKiBBUk0gVEhVTUIgaW50ZXJ3b3JraW5nICovCi0gIHsiYngiLCAgICAweDAxMmZmZjEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fVEhVTUIsICAgIGRvX2J4fSwKLQotLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0gIHsid2ZzIiwgICAweDBlMjAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7InJmcyIsICAgMHgwZTMwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKLSAgeyJ3ZmMiLCAgIDB4MGU0MDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCi0gIHsicmZjIiwgICAweDBlNTAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7ImxkZiIsICAgMHgwYzEwMDEwMCwgInNkZXAiLCBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9sZHN0fSwKLSAgeyJzdGYiLCAgIDB4MGMwMDAxMDAsICJzZGVwIiwgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfbGRzdH0sCi0gIHsibGZtIiwgICAweDBjMTAwMjAwLCBOVUxMLCAgIGxmbV9mbGFncywgICBGUFVfTUVNTVVMVEksIGRvX2ZwX2xkbXN0bX0sCi0gIHsic2ZtIiwgICAweDBjMDAwMjAwLCBOVUxMLCAgIHNmbV9mbGFncywgICBGUFVfTUVNTVVMVEksIGRvX2ZwX2xkbXN0bX0sCi0gIHsibXZmIiwgICAweDBlMDA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7Im1uZiIsICAgMHgwZTEwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhYnMiLCAgIDB4MGUyMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsicm5kIiwgICAweDBlMzA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InNxdCIsICAgMHgwZTQwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJsb2ciLCAgIDB4MGU1MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibGduIiwgICAweDBlNjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImV4cCIsICAgMHgwZTcwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJzaW4iLCAgIDB4MGU4MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiY29zIiwgICAweDBlOTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InRhbiIsICAgMHgwZWEwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhc24iLCAgIDB4MGViMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYWNzIiwgICAweDBlYzA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImF0biIsICAgMHgwZWQwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJ1cmQiLCAgIDB4MGVlMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibnJtIiwgICAweDBlZjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImFkZiIsICAgMHgwZTAwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InN1ZiIsICAgMHgwZTIwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJzZiIsICAgMHgwZTMwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7Im11ZiIsICAgMHgwZTEwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImR2ZiIsICAgMHgwZTQwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJkZiIsICAgMHgwZTUwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InBvdyIsICAgMHgwZTYwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJwdyIsICAgMHgwZTcwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJtZiIsICAgMHgwZTgwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZtbCIsICAgMHgwZTkwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZkdiIsICAgMHgwZWEwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZyZCIsICAgMHgwZWIwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InBvbCIsICAgMHgwZWMwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImNtZiIsICAgMHgwZTkwZjExMCwgTlVMTCwgICBleGNlcHRfZmxhZywgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAotICB7ImNuZiIsICAgMHgwZWIwZjExMCwgTlVMTCwgICBleGNlcHRfZmxhZywgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAotLyogVGhlIEZQQTEwIGRhdGEgc2hlZXQgc3VnZ2VzdHMgdGhhdCB0aGUgJ0UnIG9mIGNtZmUvY25mZSBzaG91bGQgbm90Ci0gICBiZSBhbiBvcHRpb25hbCBzdWZmaXgsIGJ1dCBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbi4gIFRvIGJlIGNvbXBhdGlibGUsCi0gICB3ZSBhY2NlcHQgZWl0aGVyLiAgKi8KLSAgeyJjbWZlIiwgIDB4MGVkMGYxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLSAgeyJjbmZlIiwgIDB4MGVmMGYxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLSAgeyJmbHQiLCAgIDB4MGUwMDAxMTAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZnJvbV9yZWd9LAotICB7ImZpeCIsICAgMHgwZTEwMDExMCwgTlVMTCwgICBmaXhfZmxhZ3MsICAgRlBVX0FMTCwgICAgICBkb19mcF90b19yZWd9LAotCi0vKiBHZW5lcmljIGNvcHJlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgeyJjZHAiLCAgIDB4MGUwMDAwMDAsIE5VTEwsICBOVUxMLCAgICAgICAgIEFSTV8yVVAsICAgICAgZG9fY2RwfSwKLSAgeyJsZGMiLCAgIDB4MGMxMDAwMDAsIE5VTEwsICBjcGxvbmdfZmxhZywgIEFSTV8yVVAsICAgICAgZG9fbHN0Y30sCi0gIHsic3RjIiwgICAweDBjMDAwMDAwLCBOVUxMLCAgY3Bsb25nX2ZsYWcsICBBUk1fMlVQLCAgICAgIGRvX2xzdGN9LAotICB7Im1jciIsICAgMHgwZTAwMDAxMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jb19yZWd9LAotICB7Im1yYyIsICAgMHgwZTEwMDAxMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jb19yZWd9LAotfTsKLQotLyogZGVmaW5lcyBmb3IgdmFyaW91cyBiaXRzIHRoYXQgd2Ugd2lsbCB3YW50IHRvIHRvZ2dsZSAqLwotCi0jZGVmaW5lIElOU1RfSU1NRURJQVRFCTB4MDIwMDAwMDAKLSNkZWZpbmUgT0ZGU0VUX1JFRwkweDAyMDAwMDAwCi0jZGVmaW5lIEhXT0ZGU0VUX0lNTSAgICAweDAwNDAwMDAwCi0jZGVmaW5lIFNISUZUX0JZX1JFRwkweDAwMDAwMDEwCi0jZGVmaW5lIFBSRV9JTkRFWAkweDAxMDAwMDAwCi0jZGVmaW5lIElOREVYX1VQCTB4MDA4MDAwMDAKLSNkZWZpbmUgV1JJVEVfQkFDSwkweDAwMjAwMDAwCi0jZGVmaW5lIE1VTFRJX1NFVF9QU1IJMHgwMDQwMDAwMAotCi0jZGVmaW5lIExJVEVSQUxfTUFTSwkweGYwMDBmMDAwCi0jZGVmaW5lIENPTkRfTUFTSwkweGYwMDAwMDAwCi0jZGVmaW5lIE9QQ09ERV9NQVNLCTB4ZmUxZmZmZmYKLSNkZWZpbmUgREFUQV9PUF9TSElGVAkyMQotCi0vKiBDb2RlcyB0byBkaXN0aW5ndWlzaCB0aGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgKi8KLQotI2RlZmluZSBPUENPREVfQU5ECTAKLSNkZWZpbmUgT1BDT0RFX0VPUgkxCi0jZGVmaW5lIE9QQ09ERV9TVUIJMgotI2RlZmluZSBPUENPREVfUlNCCTMKLSNkZWZpbmUgT1BDT0RFX0FERAk0Ci0jZGVmaW5lIE9QQ09ERV9BREMJNQotI2RlZmluZSBPUENPREVfU0JDCTYKLSNkZWZpbmUgT1BDT0RFX1JTQwk3Ci0jZGVmaW5lIE9QQ09ERV9UU1QJOAotI2RlZmluZSBPUENPREVfVEVRCTkKLSNkZWZpbmUgT1BDT0RFX0NNUAkxMAotI2RlZmluZSBPUENPREVfQ01OCTExCi0jZGVmaW5lIE9QQ09ERV9PUlIJMTIKLSNkZWZpbmUgT1BDT0RFX01PVgkxMwotI2RlZmluZSBPUENPREVfQklDCTE0Ci0jZGVmaW5lIE9QQ09ERV9NVk4JMTUKLQotc3RhdGljIHZvaWQgZG9fdF9ub3AJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FyaXQJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FkZAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfYXNyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9icmFuY2g5CVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDEyCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDIzCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2J4CQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9jb21wYXJlCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xkbXN0bQkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfbGRyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHJiCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHJoCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHMJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xzbAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfbHNyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9tb3YJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X3B1c2hfcG9wCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X3N0cgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyYgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyaAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3ViCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9zd2kJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FkcgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLQotI2RlZmluZSBUX09QQ09ERV9NVUwgMHg0MzQwCi0jZGVmaW5lIFRfT1BDT0RFX1RTVCAweDQyMDAKLSNkZWZpbmUgVF9PUENPREVfQ01OIDB4NDJjMAotI2RlZmluZSBUX09QQ09ERV9ORUcgMHg0MjQwCi0jZGVmaW5lIFRfT1BDT0RFX01WTiAweDQzYzAKLQotI2RlZmluZSBUX09QQ09ERV9BRERfUjMJMHgxODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9SMyAweDFhMDAKLSNkZWZpbmUgVF9PUENPREVfQUREX0hJIDB4NDQwMAotI2RlZmluZSBUX09QQ09ERV9BRERfU1QgMHhiMDAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9TVCAweGIwODAKLSNkZWZpbmUgVF9PUENPREVfQUREX1NQIDB4YTgwMAotI2RlZmluZSBUX09QQ09ERV9BRERfUEMgMHhhMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9JOCAweDMwMDAKLSNkZWZpbmUgVF9PUENPREVfU1VCX0k4IDB4MzgwMAotI2RlZmluZSBUX09QQ09ERV9BRERfSTMgMHgxYzAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9JMyAweDFlMDAKLQotI2RlZmluZSBUX09QQ09ERV9BU1JfUgkweDQxMDAKLSNkZWZpbmUgVF9PUENPREVfTFNMX1IJMHg0MDgwCi0jZGVmaW5lIFRfT1BDT0RFX0xTUl9SICAweDQwYzAKLSNkZWZpbmUgVF9PUENPREVfQVNSX0kJMHgxMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xTTF9JCTB4MDAwMAotI2RlZmluZSBUX09QQ09ERV9MU1JfSQkweDA4MDAKLQotI2RlZmluZSBUX09QQ09ERV9NT1ZfSTgJMHgyMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9JOCAweDI4MDAKLSNkZWZpbmUgVF9PUENPREVfQ01QX0xSIDB4NDI4MAotI2RlZmluZSBUX09QQ09ERV9NT1ZfSFIgMHg0NjAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9IUiAweDQ1MDAKLQotI2RlZmluZSBUX09QQ09ERV9MRFJfUEMgMHg0ODAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9TUCAweDk4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1NQIDB4OTAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfSVcgMHg2ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9JVyAweDYwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX0lIIDB4ODgwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfSUggMHg4MDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9JQiAweDc4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX0lCIDB4NzAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfUlcgMHg1ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9SVyAweDUwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX1JIIDB4NWEwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfUkggMHg1MjAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9SQiAweDVjMDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1JCIDB4NTQwMAotCi0jZGVmaW5lIFRfT1BDT0RFX1BVU0gJMHhiNDAwCi0jZGVmaW5lIFRfT1BDT0RFX1BPUAkweGJjMDAKLQotI2RlZmluZSBUX09QQ09ERV9CUkFOQ0ggMHhlN2ZlCi0KLXN0YXRpYyBpbnQgdGh1bWJfcmVnCQlQQVJBTVMgKChjaGFyICoqIHN0ciwgaW50IGhpX2xvKSk7Ci0KLSNkZWZpbmUgVEhVTUJfU0laRQkyCS8qIFNpemUgb2YgdGh1bWIgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVEhVTUJfUkVHX0xPCTB4MQotI2RlZmluZSBUSFVNQl9SRUdfSEkJMHgyCi0jZGVmaW5lIFRIVU1CX1JFR19BTlkJMHgzCi0KLSNkZWZpbmUgVEhVTUJfSDEJMHgwMDgwCi0jZGVmaW5lIFRIVU1CX0gyCTB4MDA0MAotCi0jZGVmaW5lIFRIVU1CX0FTUiAwCi0jZGVmaW5lIFRIVU1CX0xTTCAxCi0jZGVmaW5lIFRIVU1CX0xTUiAyCi0KLSNkZWZpbmUgVEhVTUJfTU9WRSAwCi0jZGVmaW5lIFRIVU1CX0NPTVBBUkUgMQotCi0jZGVmaW5lIFRIVU1CX0xPQUQgMAotI2RlZmluZSBUSFVNQl9TVE9SRSAxCi0KLSNkZWZpbmUgVEhVTUJfUFBfUENfTFIgMHgwMTAwCi0KLS8qIFRoZXNlIHRocmVlIGFyZSB1c2VkIGZvciBpbW1lZGlhdGUgc2hpZnRzLCBkbyBub3QgYWx0ZXIgKi8KLSNkZWZpbmUgVEhVTUJfV09SRCAyCi0jZGVmaW5lIFRIVU1CX0hBTEZXT1JEIDEKLSNkZWZpbmUgVEhVTUJfQllURSAwCi0KLXN0cnVjdCB0aHVtYl9vcGNvZGUgCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7CS8qIEJhc2ljIHN0cmluZyB0byBtYXRjaCAqLwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwkJLyogQmFzaWMgaW5zdHJ1Y3Rpb24gY29kZSAqLwotICBpbnQgICAgICAgICAgIHNpemU7Ci0gIHZvaWQgKCogICAgICAgcGFybXMpIFBBUkFNUyAoKGNoYXIgKikpOyAgLyogRnVuY3Rpb24gdG8gY2FsbCB0byBwYXJzZSBhcmdzICovCi19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSB0aW5zbnNbXSA9Ci17Ci0gIHsiYWRjIiwJMHg0MTQwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJhZGQiLAkweDAwMDAsCQkyLAlkb190X2FkZH0sCi0gIHsiYW5kIiwJMHg0MDAwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJhc3IiLAkweDAwMDAsCQkyLAlkb190X2Fzcn0sCi0gIHsiYiIsCQlUX09QQ09ERV9CUkFOQ0gsIDIsCWRvX3RfYnJhbmNoMTJ9LAotICB7ImJlcSIsCTB4ZDBmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYm5lIiwJMHhkMWZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiY3MiLAkweGQyZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJocyIsCTB4ZDJmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmNjIiwJMHhkM2ZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJidWwiLAkweGQzZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJsbyIsCTB4ZDNmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYm1pIiwJMHhkNGZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJicGwiLAkweGQ1ZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJ2cyIsCTB4ZDZmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYnZjIiwJMHhkN2ZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiaGkiLAkweGQ4ZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJscyIsCTB4ZDlmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmdlIiwJMHhkYWZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJibHQiLAkweGRiZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJndCIsCTB4ZGNmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmxlIiwJMHhkZGZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiaWMiLAkweDQzODAsCQkyLAlkb190X2FyaXR9LAotICB7ImJsIiwJMHhmN2ZmZmZmZSwJNCwJZG9fdF9icmFuY2gyM30sCi0gIHsiYngiLAkweDQ3MDAsCQkyLAlkb190X2J4fSwKLSAgeyJjbW4iLAlUX09QQ09ERV9DTU4sCTIsCWRvX3RfYXJpdH0sCi0gIHsiY21wIiwJMHgwMDAwLAkJMiwJZG9fdF9jb21wYXJlfSwKLSAgeyJlb3IiLAkweDQwNDAsCQkyLAlkb190X2FyaXR9LAotICB7ImxkbWlhIiwJMHhjODAwLAkJMiwJZG9fdF9sZG1zdG19LAotICB7ImxkciIsCTB4MDAwMCwJCTIsCWRvX3RfbGRyfSwKLSAgeyJsZHJiIiwJMHgwMDAwLAkJMiwJZG9fdF9sZHJifSwKLSAgeyJsZHJoIiwJMHgwMDAwLAkJMiwJZG9fdF9sZHJofSwKLSAgeyJsZHJzYiIsCTB4NTYwMCwJCTIsCWRvX3RfbGRzfSwKLSAgeyJsZHJzaCIsCTB4NWUwMCwJCTIsCWRvX3RfbGRzfSwKLSAgeyJsZHNiIiwJMHg1NjAwLAkJMiwJZG9fdF9sZHN9LAotICB7Imxkc2giLAkweDVlMDAsCQkyLAlkb190X2xkc30sCi0gIHsibHNsIiwJMHgwMDAwLAkJMiwJZG9fdF9sc2x9LAotICB7ImxzciIsCTB4MDAwMCwJCTIsCWRvX3RfbHNyfSwKLSAgeyJtb3YiLAkweDAwMDAsCQkyLAlkb190X21vdn0sCi0gIHsibXVsIiwJVF9PUENPREVfTVVMLAkyLAlkb190X2FyaXR9LAotICB7Im12biIsCVRfT1BDT0RFX01WTiwJMiwJZG9fdF9hcml0fSwKLSAgeyJuZWciLAlUX09QQ09ERV9ORUcsCTIsCWRvX3RfYXJpdH0sCi0gIHsib3JyIiwJMHg0MzAwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJwb3AiLAkweGJjMDAsCQkyLAlkb190X3B1c2hfcG9wfSwKLSAgeyJwdXNoIiwJMHhiNDAwLAkJMiwJZG9fdF9wdXNoX3BvcH0sCi0gIHsicm9yIiwJMHg0MWMwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJzYmMiLAkweDQxODAsCQkyLAlkb190X2FyaXR9LAotICB7InN0bWlhIiwJMHhjMDAwLAkJMiwJZG9fdF9sZG1zdG19LAotICB7InN0ciIsCTB4MDAwMCwJCTIsCWRvX3Rfc3RyfSwKLSAgeyJzdHJiIiwJMHgwMDAwLAkJMiwJZG9fdF9zdHJifSwKLSAgeyJzdHJoIiwJMHgwMDAwLAkJMiwJZG9fdF9zdHJofSwKLSAgeyJzd2kiLAkweGRmMDAsCQkyLAlkb190X3N3aX0sCi0gIHsic3ViIiwJMHgwMDAwLAkJMiwJZG9fdF9zdWJ9LAotICB7InRzdCIsCVRfT1BDT0RFX1RTVCwJMiwJZG9fdF9hcml0fSwKLSAgLyogUHNldWRvIG9wczogKi8KLSAgeyJhZHIiLCAgICAgICAweDAwMDAsICAgICAgICAgMiwgICAgICBkb190X2Fkcn0sCi0gIHsibm9wIiwgICAgICAgMHg0NkMwLCAgICAgICAgIDIsICAgICAgZG9fdF9ub3B9LCAgICAgIC8qIG1vdiByOCxyOCAqLwotfTsKLQotc3RydWN0IHJlZ19lbnRyeQotewotICBDT05TVCBjaGFyICogbmFtZTsKLSAgaW50ICAgICAgICAgIG51bWJlcjsKLX07Ci0KLSNkZWZpbmUgaW50X3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDAgJiYgKHJlZykgPD0gMTUpCi0jZGVmaW5lIGNwX3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDMyICYmIChyZWcpIDw9IDQ3KQotI2RlZmluZSBmcF9yZWdpc3RlcihyZWcpICgocmVnKSA+PSAxNiAmJiAocmVnKSA8PSAyMykKLQotI2RlZmluZSBSRUdfUEMJMTUKLSNkZWZpbmUgUkVHX0xSICAxNAotI2RlZmluZSBSRUdfU1AgIDEzCi0KLS8qIFRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgbmFtZXM7ICBVc2VycyBjYW4gYWRkIGFsaWFzZXMgd2l0aCAucmVxICovCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHJlZ19lbnRyeSByZWdfdGFibGVbXSA9Ci17Ci0gIC8qIFByb2Nlc3NvciBSZWdpc3RlciBOdW1iZXJzICovCi0gIHsicjAiLCAwfSwgICAgeyJyMSIsIDF9LCAgICAgIHsicjIiLCAyfSwgICAgICB7InIzIiwgM30sCi0gIHsicjQiLCA0fSwgICAgeyJyNSIsIDV9LCAgICAgIHsicjYiLCA2fSwgICAgICB7InI3IiwgN30sCi0gIHsicjgiLCA4fSwgICAgeyJyOSIsIDl9LCAgICAgIHsicjEwIiwgMTB9LCAgICB7InIxMSIsIDExfSwKLSAgeyJyMTIiLCAxMn0sICB7InIxMyIsIFJFR19TUH0seyJyMTQiLCBSRUdfTFJ9LHsicjE1IiwgUkVHX1BDfSwKLSAgLyogQVBDUyBjb252ZW50aW9ucyAqLwotICB7ImExIiwgMH0sCXsiYTIiLCAxfSwgICAgeyJhMyIsIDJ9LCAgICAgeyJhNCIsIDN9LAotICB7InYxIiwgNH0sCXsidjIiLCA1fSwgICAgeyJ2MyIsIDZ9LCAgICAgeyJ2NCIsIDd9LCAgICAgeyJ2NSIsIDh9LAotICB7InY2IiwgOX0sCXsic2IiLCA5fSwgICAgeyJ2NyIsIDEwfSwgICAgeyJzbCIsIDEwfSwKLSAgeyJmcCIsIDExfSwJeyJpcCIsIDEyfSwgICB7InNwIiwgUkVHX1NQfSx7ImxyIiwgUkVHX0xSfSx7InBjIiwgUkVHX1BDfSwKLSAgLyogRlAgUmVnaXN0ZXJzICovCi0gIHsiZjAiLCAxNn0sICAgeyJmMSIsIDE3fSwgICB7ImYyIiwgMTh9LCAgIHsiZjMiLCAxOX0sCi0gIHsiZjQiLCAyMH0sICAgeyJmNSIsIDIxfSwgICB7ImY2IiwgMjJ9LCAgIHsiZjciLCAyM30sCi0gIHsiYzAiLCAzMn0sICAgeyJjMSIsIDMzfSwgICB7ImMyIiwgMzR9LCAgIHsiYzMiLCAzNX0sCi0gIHsiYzQiLCAzNn0sICAgeyJjNSIsIDM3fSwgICB7ImM2IiwgMzh9LCAgIHsiYzciLCAzOX0sCi0gIHsiYzgiLCA0MH0sICAgeyJjOSIsIDQxfSwgICB7ImMxMCIsIDQyfSwgIHsiYzExIiwgNDN9LAotICB7ImMxMiIsIDQ0fSwgIHsiYzEzIiwgNDV9LCAgeyJjMTQiLCA0Nn0sICB7ImMxNSIsIDQ3fSwKLSAgeyJjcjAiLCAzMn0sICB7ImNyMSIsIDMzfSwgIHsiY3IyIiwgMzR9LCAgeyJjcjMiLCAzNX0sCi0gIHsiY3I0IiwgMzZ9LCAgeyJjcjUiLCAzN30sICB7ImNyNiIsIDM4fSwgIHsiY3I3IiwgMzl9LAotICB7ImNyOCIsIDQwfSwgIHsiY3I5IiwgNDF9LCAgeyJjcjEwIiwgNDJ9LCB7ImNyMTEiLCA0M30sCi0gIHsiY3IxMiIsIDQ0fSwgeyJjcjEzIiwgNDV9LCB7ImNyMTQiLCA0Nn0sIHsiY3IxNSIsIDQ3fSwKLSAge05VTEwsIDB9Ci19OwotCi0jZGVmaW5lIGJhZF9hcmdzIAlfKCJCYWQgYXJndW1lbnRzIHRvIGluc3RydWN0aW9uIik7Ci0jZGVmaW5lIGJhZF9wYyAJCV8oInIxNSBub3QgYWxsb3dlZCBoZXJlIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX29wc19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fdG9wc19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fY29uZF9oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fc2hpZnRfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3JlZ19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fcHNyX2hzaCA9IE5VTEw7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotc3RhdGljIHZvaWQgc19yZXEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2V2ZW4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2x0b3JnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hcm0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3RodW1iIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb2RlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19mb3JjZV90aHVtYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfdGh1bWJfZnVuYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfdGh1bWJfc2V0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYXJtX3NfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGFybV9zX2RhdGEgUEFSQU1TICgoaW50KSk7Ci0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgYXJtX3Nfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYXJtX2VsZl9jb25zIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbXlfZ2V0X2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgY2hhciAqKikpOwotCi1DT05TVCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJyZXEiLCAgICAgICAgIHNfcmVxLCAgICAgICAgIDAgfSwJLyogTmV2ZXIgY2FsbGVkIGJlY2FzdWUgJy5yZXEnIGRvZXMgbm90IHN0YXJ0IGxpbmUgKi8KLSAgeyAiYnNzIiwgICAgICAgICBzX2JzcywgICAgICAgICAwIH0sCi0gIHsgImFsaWduIiwgICAgICAgc19hbGlnbiwgICAgICAgMCB9LAotICB7ICJhcm0iLCAgICAgICAgIHNfYXJtLCAgICAgICAgIDAgfSwKLSAgeyAidGh1bWIiLCAgICAgICBzX3RodW1iLCAgICAgICAwIH0sCi0gIHsgImNvZGUiLCAgICAgICAgc19jb2RlLCAgICAgICAgMCB9LAotICB7ICJmb3JjZV90aHVtYiIsIHNfZm9yY2VfdGh1bWIsIDAgfSwKLSAgeyAidGh1bWJfZnVuYyIsICBzX3RodW1iX2Z1bmMsICAwIH0sCi0gIHsgInRodW1iX3NldCIsICAgc190aHVtYl9zZXQsICAgMCB9LAotICB7ICJldmVuIiwgICAgICAgIHNfZXZlbiwgICAgICAgIDAgfSwKLSAgeyAibHRvcmciLCAgICAgICBzX2x0b3JnLCAgICAgICAwIH0sCi0gIHsgInBvb2wiLCAgICAgICAgc19sdG9yZywgICAgICAgMCB9LAotICAvKiBBbGxvdyBmb3IgdGhlIGVmZmVjdCBvZiBzZWN0aW9uIGNoYW5nZXMuICAqLwotICB7ICJ0ZXh0IiwgICAgICAgIGFybV9zX3RleHQsICAgIDAgfSwKLSAgeyAiZGF0YSIsICAgICAgICBhcm1fc19kYXRhLCAgICAwIH0sCi0jaWZkZWYgT0JKX0VMRiAgCi0gIHsgInNlY3Rpb24iLCAgICAgYXJtX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0aW9uLnMiLCAgIGFybV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdCIsICAgICAgICBhcm1fc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QucyIsICAgICAgYXJtX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJ3b3JkIiwgICAgICAgIHNfYXJtX2VsZl9jb25zLCA0IH0sCi0gIHsgImxvbmciLCAgICAgICAgc19hcm1fZWxmX2NvbnMsIDQgfSwKLSNlbHNlCi0gIHsgIndvcmQiLCAgICAgICAgY29ucywgNH0sCi0jZW5kaWYKLSAgeyAiZXh0ZW5kIiwgICAgICBmbG9hdF9jb25zLCAneCcgfSwKLSAgeyAibGRvdWJsZSIsICAgICBmbG9hdF9jb25zLCAneCcgfSwKLSAgeyAicGFja2VkIiwgICAgICBmbG9hdF9jb25zLCAncCcgfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLS8qIFN0dWZmIG5lZWRlZCB0byByZXNvbHZlIHRoZSBsYWJlbCBhbWJpZ3VpdHkKLSAgIEFzOgotICAgICAuLi4KLSAgICAgbGFiZWw6ICAgPGluc24+Ci0gICBtYXkgZGlmZmVyIGZyb206Ci0gICAgIC4uLgotICAgICBsYWJlbDoKLSAgICAgICAgICAgICAgPGluc24+Ci0qLwotCi1zeW1ib2xTICogIGxhc3RfbGFiZWxfc2VlbjsKLXN0YXRpYyBpbnQgbGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSA9IGZhbHNlOwotCi0vKiBMaXRlcmFsIHN0dWZmICovCi0KLSNkZWZpbmUgTUFYX0xJVEVSQUxfUE9PTF9TSVpFIDEwMjQKLQotdHlwZWRlZiBzdHJ1Y3QgbGl0ZXJhbFMKLXsKLSAgc3RydWN0IGV4cHJlc3Npb25TICBleHA7Ci0gIHN0cnVjdCBhcm1faXQgKiAgICAgaW5zdDsKLX0gbGl0ZXJhbFQ7Ci0KLWxpdGVyYWxUICBsaXRlcmFsc1tNQVhfTElURVJBTF9QT09MX1NJWkVdOwotaW50ICAgICAgIG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlID0gMDsgLyogTmV4dCBmcmVlIGVudHJ5IGluIHRoZSBwb29sICovCi1pbnQgICAgICAgbGl0X3Bvb2xfbnVtID0gMTsgLyogTmV4dCBsaXRlcmFsIHBvb2wgbnVtYmVyICovCi1zeW1ib2xTICogY3VycmVudF9wb29sUCA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQKLWFkZF90b19saXRfcG9vbCAoKQotewotICBpbnQgbGl0X2NvdW50ID0gMDsKLQotICBpZiAoY3VycmVudF9wb29sUCA9PSBOVUxMKQotICAgIGN1cnJlbnRfcG9vbFAgPSBzeW1ib2xfY3JlYXRlIChGQUtFX0xBQkVMX05BTUUsIHVuZGVmaW5lZF9zZWN0aW9uLAotCQkJCSAgICh2YWx1ZVQpIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgLyogQ2hlY2sgaWYgdGhpcyBsaXRlcmFsIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIHBvb2w6ICovCi0gIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKLSAgICB7Ci0gICAgICBpZiAobGl0ZXJhbHNbbGl0X2NvdW50XS5leHAuWF9vcCA9PSBpbnN0LnJlbG9jLmV4cC5YX29wCi0gICAgICAgICAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0gICAgICAgICAgJiYgbGl0ZXJhbHNbbGl0X2NvdW50XS5leHAuWF9hZGRfbnVtYmVyID09IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcgotICAgICAgICAgICYmIGxpdGVyYWxzW2xpdF9jb3VudF0uZXhwLlhfdW5zaWduZWQgPT0gaW5zdC5yZWxvYy5leHAuWF91bnNpZ25lZCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBsaXRfY291bnQrKzsKLSAgICB9Ci0KLSAgaWYgKGxpdF9jb3VudCA9PSBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkgLyogbmV3IGVudHJ5ICovCi0gICAgewotICAgICAgaWYgKG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlID4gTUFYX0xJVEVSQUxfUE9PTF9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5lcnJvciA9IF8oIkxpdGVyYWwgUG9vbCBPdmVyZmxvdyIpOwotICAgICAgICAgIHJldHVybiBGQUlMOwotICAgICAgICB9Ci0KLSAgICAgIGxpdGVyYWxzW25leHRfbGl0ZXJhbF9wb29sX3BsYWNlXS5leHAgPSBpbnN0LnJlbG9jLmV4cDsKLSAgICAgIGxpdF9jb3VudCA9IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKys7Ci0gICAgfQotCi0gIGluc3QucmVsb2MuZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyID0gKGxpdF9jb3VudCkgKiA0IC0gODsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sID0gY3VycmVudF9wb29sUDsKLQotICByZXR1cm4gU1VDQ0VTUzsKLX0KLSAKLS8qIENhbid0IHVzZSBzeW1ib2xfbmV3IGhlcmUsIHNvIGhhdmUgdG8gY3JlYXRlIGEgc3ltYm9sIGFuZCB0aGVuIGF0Ci0gICBhIGxhdGVyIGRhdGUgYXNzaWduIGl0IGEgdmFsdWUuIFRoYXRzIHdoYXQgdGhlc2UgZnVuY3Rpb25zIGRvLiAgKi8KLXN0YXRpYyB2b2lkCi1zeW1ib2xfbG9jYXRlIChzeW1ib2xQLCBuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKQotICAgICBzeW1ib2xTICogICAgc3ltYm9sUDsgCi0gICAgIENPTlNUIGNoYXIgKiBuYW1lOwkJLyogSXQgaXMgY29waWVkLCB0aGUgY2FsbGVyIGNhbiBtb2RpZnkgKi8KLSAgICAgc2VnVCAgICAgICAgIHNlZ21lbnQ7CS8qIFNlZ21lbnQgaWRlbnRpZmllciAoU0VHXzxzb21ldGhpbmc+KSAqLwotICAgICB2YWx1ZVQgICAgICAgdmFsdTsJCS8qIFN5bWJvbCB2YWx1ZSAqLwotICAgICBmcmFnUyAqICAgICAgZnJhZzsJCS8qIEFzc29jaWF0ZWQgZnJhZ21lbnQgKi8KLXsKLSAgdW5zaWduZWQgaW50IG5hbWVfbGVuZ3RoOwotICBjaGFyICogcHJlc2VydmVkX2NvcHlfb2ZfbmFtZTsKLQotICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSkgKyAxOyAgICAgIC8qICsxIGZvciBcMCAqLwotICBvYnN0YWNrX2dyb3cgKCZub3RlcywgbmFtZSwgbmFtZV9sZW5ndGgpOwotICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0jaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQotICBpZiAocHJlc2VydmVkX2NvcHlfb2ZfbmFtZVswXSA9PSAnXycpCi0gICAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSsrOwotI2VuZGlmCi0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSA9Ci0gICAgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKTsKLSNlbmRpZgotCi0gIFNfU0VUX05BTUUgKHN5bWJvbFAsIHByZXNlcnZlZF9jb3B5X29mX25hbWUpOwotCi0gIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNlZ21lbnQpOwotICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgdmFsdSk7Ci0gIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKHN5bWJvbFApOwotCi0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZyk7Ci0KLSAgLyogTGluayB0byBlbmQgb2Ygc3ltYm9sIGNoYWluLiAgKi8KLSAgewotICAgIGV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLSAgICBpZiAoc3ltYm9sX3RhYmxlX2Zyb3plbikKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2xhc3RQLCAmIHN5bWJvbF9yb290UCwgJiBzeW1ib2xfbGFzdFApOwotCi0gIG9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotCi0jaWZkZWYgdGNfc3ltYm9sX25ld19ob29rCi0gIHRjX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0jZW5kaWYKLSAKLSNpZmRlZiBERUJVR19TWU1TCi0gIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKLSNlbmRpZiAvKiBERUJVR19TWU1TICovCi19Ci0KLS8qIENoZWNrIHRoYXQgYW4gaW1tZWRpYXRlIGlzIHZhbGlkLCBhbmQgaWYgc28sIGNvbnZlcnQgaXQgdG8gdGhlIHJpZ2h0IGZvcm1hdC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsKQotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotewotICB1bnNpZ25lZCBpbnQgYTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotI2RlZmluZSByb3RhdGVfbGVmdCh2LCBuKSAodiA8PCBuIHwgdiA+PiAoMzIgLSBuKSkKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSAyKQotICAgIGlmICgoYSA9IHJvdGF0ZV9sZWZ0ICh2YWwsIGkpKSA8PSAweGZmKQotICAgICAgcmV0dXJuIGEgfCAoaSA8PCA3KTsgLyogMTItYml0IHBhY2s6IFtzaGlmdC1jbnQsY29uc3RdICovCi0gIAotICByZXR1cm4gRkFJTDsKLX0KLQotLyogQ2hlY2sgdG8gc2VlIGlmIGFuIGltbWVkaWF0ZSBjYW4gYmUgY29tcHV0ZWQgYXMgdHdvIHNlcGVyYXRlIGltbWVkaWF0ZQotICAgdmFsdWVzLCBhZGRlZCB0b2dldGhlci4gIFdlIGFscmVhZHkga25vdyB0aGF0IHRoaXMgdmFsdWUgY2Fubm90IGJlCi0gICBjb21wdXRlZCBieSBqdXN0IG9uZSBBUk0gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci12YWxpZGF0ZV9pbW1lZGlhdGVfdHdvcGFydCAodmFsLCBoaWdocGFydCkKLSAgICAgdW5zaWduZWQgaW50IHZhbDsKLSAgICAgdW5zaWduZWQgaW50ICogaGlnaHBhcnQ7Ci17Ci0gIHVuc2lnbmVkIGludCBhOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSAyKQotICAgIGlmICgoKGEgPSByb3RhdGVfbGVmdCAodmFsLCBpKSkgJiAweGZmKSAhPSAwKQotICAgICAgewotCWlmIChhICYgMHhmZjAwKQotCSAgewotCSAgICBpZiAoYSAmIH4gMHhmZmZmKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICAqIGhpZ2hwYXJ0ID0gKGEgID4+IDgpIHwgKChpICsgMjQpIDw8IDcpOwotCSAgfQotCWVsc2UgaWYgKGEgJiAweGZmMDAwMCkKLQkgIHsKLQkgICAgaWYgKGEgJiAweGZmMDAwMDAwKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgICogaGlnaHBhcnQgPSAoYSA+PiAxNikgfCAoKGkgKyAxNikgPDwgNyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBhc3NlcnQgKGEgJiAweGZmMDAwMDAwKTsKLQotCSAgICAqIGhpZ2hwYXJ0ID0gKGEgPj4gMjQpIHwgKChpICsgOCkgPDwgNyk7Ci0JICB9Ci0KLQlyZXR1cm4gKGEgJiAweGZmKSB8IChpIDw8IDcpOwotICAgICAgfQotICAKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX29mZnNldF9pbW0gKHZhbCwgaHdzZSkKLSAgICAgaW50IHZhbDsKLSAgICAgaW50IGh3c2U7Ci17Ci0gIGlmICgoaHdzZSAmJiAodmFsIDwgLTI1NSB8fCB2YWwgPiAyNTUpKQotICAgICAgfHwgKHZhbCA8IC00MDk1IHx8IHZhbCA+IDQwOTUpKQotICAgICByZXR1cm4gRkFJTDsKLSAgcmV0dXJuIHZhbDsKLX0KLQotICAgIAotc3RhdGljIHZvaWQKLXNfcmVxIChhKQotICAgICBpbnQgYTsKLXsKLSAgYXNfYmFkIChfKCJJbnZhbGlkIHN5bnRheCBmb3IgLnJlcSBkaXJlY3RpdmUuIikpOwotfQotCi1zdGF0aWMgdm9pZAotc19ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBwdXR0aW5nIGZyYWdzIGluIHRoZSBCU1Mgc2VnbWVudCwgd2UgZmFrZSBpdCBieQotICAgICBtYXJraW5nIGluX2JzcywgdGhlbiBsb29raW5nIGF0IHNfc2tpcCBmb3IgY2x1ZXM/Li4gKi8KLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19ldmVuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICghbmVlZF9wYXNzXzIpCQkvKiBOZXZlciBtYWtlIGZyYWcgaWYgZXhwZWN0IGV4dHJhIHBhc3MuICovCi0gICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0gIAotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2x0b3JnIChpZ25vcmVkKQotICAgICBpbnQgaWdub3JlZDsKLXsKLSAgaW50IGxpdF9jb3VudCA9IDA7Ci0gIGNoYXIgc3ltX25hbWVbMjBdOwotCi0gIGlmIChjdXJyZW50X3Bvb2xQID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIEFsaWduIHBvb2wgYXMgeW91IGhhdmUgd29yZCBhY2Nlc3NlcyAqLwotICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIGhhdmUgdG8gLi4uICovCi0gIGlmICghbmVlZF9wYXNzXzIpCi0gICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0KLSAgc3ByaW50ZiAoc3ltX25hbWUsICIkJGxpdF9cMDAyJXgiLCBsaXRfcG9vbF9udW0rKyk7Ci0KLSAgc3ltYm9sX2xvY2F0ZSAoY3VycmVudF9wb29sUCwgc3ltX25hbWUsIG5vd19zZWcsCi0JCSAodmFsdWVUKSBmcmFnX25vd19maXggKCksIGZyYWdfbm93KTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoY3VycmVudF9wb29sUCk7Ci0KLSAgQVJNX1NFVF9USFVNQiAoY3VycmVudF9wb29sUCwgdGh1bWJfbW9kZSk7Ci0gIAotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIEFSTV9TRVRfSU5URVJXT1JLIChjdXJyZW50X3Bvb2xQLCBzdXBwb3J0X2ludGVyd29yayk7Ci0jZW5kaWYKLSAgCi0gIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKLSAgICAvKiBGaXJzdCBvdXRwdXQgdGhlIGV4cHJlc3Npb24gaW4gdGhlIGluc3RydWN0aW9uIHRvIHRoZSBwb29sICovCi0gICAgZW1pdF9leHByICgmKGxpdGVyYWxzW2xpdF9jb3VudCsrXS5leHApLCA0KTsgLyogLndvcmQgKi8KLQotICBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA9IDA7Ci0gIGN1cnJlbnRfcG9vbFAgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotc19hbGlnbiAodW51c2VkKQkvKiBTYW1lIGFzIHNfYWxpZ25fcHR3byBidXQgYWxpZ24gMCA9PiBhbGlnbiAyICovCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLSAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAodGVtcCA+IG1heF9hbGlnbm1lbnQpCi0gICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgdGVtcCA9IG1heF9hbGlnbm1lbnQpOwotICBlbHNlIGlmICh0ZW1wIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkFsaWdubWVudCBuZWdhdGl2ZS4gMCBhc3N1bWVkLiIpKTsKLSAgICAgIHRlbXAgPSAwOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZW1wX2ZpbGwgPSAwOwotCi0gIGlmICghdGVtcCkKLSAgICB0ZW1wID0gMjsKLQotICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIEhBVkUgdG8uIC4gLiAqLwotICBpZiAodGVtcCAmJiAhbmVlZF9wYXNzXzIpCi0gICAgZnJhZ19hbGlnbiAodGVtcCwgKGludCkgdGVtcF9maWxsLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCB0ZW1wKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZm9yY2VfdGh1bWIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogSWYgd2UgYXJlIG5vdCBhbHJlYWR5IGluIHRodW1iIG1vZGUgZ28gaW50byBpdCwgRVZFTiBpZgotICAgICB0aGUgdGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRodW1iIGluc3RydWN0aW9ucy4KLSAgICAgVGhpcyBpcyB1c2VkIGJ5IGdjYy9jb25maWcvYXJtL2xpYjFmdW5jcy5hc20gZm9yIGV4YW1wbGUKLSAgICAgdG8gY29tcGlsZSBpbnRlcndvcmtpbmcgc3VwcG9ydCBmdW5jdGlvbnMgZXZlbiBpZiB0aGUKLSAgICAgdGFyZ2V0IHByb2Nlc3NvciBzaG91bGQgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nLiAgKi8KLSAgICAgCi0gIGlmICghIHRodW1iX21vZGUpCi0gICAgewotICAgICAgdGh1bWJfbW9kZSA9IDE7Ci0gICAgICAKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDEpOwotICAgIH0KLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3RodW1iX2Z1bmMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogVGhlIGZvbGxvd2luZyBsYWJlbCBpcyB0aGUgbmFtZS9hZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLgotICAgICBXZSBuZWVkIHRvIGtub3cgdGhpcyBmb3IgdGhlIGludGVyd29ya2luZyBzdXBwb3J0LiAgKi8KLQotICBsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lID0gdHJ1ZTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFBlcmZvcm0gYSAuc2V0IGRpcmVjdGl2ZSwgYnV0IGFsc28gbWFyayB0aGUgYWxpYXMgYXMKLSAgIGJlaW5nIGEgdGh1bWIgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc190aHVtYl9zZXQgKGVxdWl2KQotICAgICBpbnQgZXF1aXY7Ci17Ci0gIC8qIFhYWCB0aGUgZm9sbG93aW5nIGlzIGEgZHVwbGljYXRlIG9mIHRoZSBjb2RlIGZvciBzX3NldCgpIGluIHJlYWQuYwotICAgICBXZSBjYW5ub3QganVzdCBjYWxsIHRoYXQgY29kZSBhcyB3ZSBuZWVkIHRvIGdldCBhdCB0aGUgc3ltYm9sIHRoYXQKLSAgICAgaXMgY3JlYXRlZC4gICovCi0gIHJlZ2lzdGVyIGNoYXIgKiAgICBuYW1lOwotICByZWdpc3RlciBjaGFyICAgICAgZGVsaW07Ci0gIHJlZ2lzdGVyIGNoYXIgKiAgICBlbmRfbmFtZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqIHN5bWJvbFA7Ci0KLSAgLyoKLSAgICogRXNwZWNpYWwgYXBvbG9naWVzIGZvciB0aGUgcmFuZG9tIGxvZ2ljOgotICAgKiB0aGlzIGp1c3QgZ3JldywgYW5kIGNvdWxkIGJlIHBhcnNlZCBtdWNoIG1vcmUgc2ltcGx5IQotICAgKiBEZWFuIGluIGhhc3RlLgotICAgKi8KLSAgbmFtZSAgICAgID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBkZWxpbSAgICAgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZW5kX25hbWUgID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKmVuZF9uYW1lID0gMDsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAqZW5kX25hbWUgPSAwOwotCi0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgLyogWFhYIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbiB0byAudGh1bWJfc2V0ICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKSkgPT0gTlVMTAotICAgICAgJiYgKHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIC8qIFdoZW4gZG9pbmcgc3ltYm9sIGxpc3RpbmdzLCBwbGF5IGdhbWVzIHdpdGggZHVtbXkgZnJhZ21lbnRzIGxpdmluZwotCSBvdXRzaWRlIHRoZSBub3JtYWwgZnJhZ21lbnQgY2hhaW4gdG8gcmVjb3JkIHRoZSBmaWxlIGFuZCBsaW5lIGluZm8KLSAgICAgICAgIGZvciB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAobGlzdGluZyAmIExJU1RJTkdfU1lNQk9MUykKLQl7Ci0JICBleHRlcm4gc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKiBsaXN0aW5nX3RhaWw7Ci0JICBmcmFnUyAqIGR1bW15X2ZyYWcgPSAoZnJhZ1MgKikgeG1hbGxvYyAoc2l6ZW9mKGZyYWdTKSk7Ci0JICBtZW1zZXQgKGR1bW15X2ZyYWcsIDAsIHNpemVvZihmcmFnUykpOwotCSAgZHVtbXlfZnJhZy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBkdW1teV9mcmFnLT5saW5lID0gbGlzdGluZ190YWlsOwotCSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCBkdW1teV9mcmFnKTsKLQkgIGR1bW15X2ZyYWctPmZyX3N5bWJvbCA9IHN5bWJvbFA7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQkJCSAgICAKLSNpZmRlZiBPQkpfQ09GRgotICAgICAgLyogInNldCIgc3ltYm9scyBhcmUgbG9jYWwgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuICovCi0gICAgICBTRl9TRVRfTE9DQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0gICAgfQkJCQkvKiBtYWtlIGEgbmV3IHN5bWJvbCAqLwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotCi0gICogZW5kX25hbWUgPSBkZWxpbTsKLQotICBpZiAoZXF1aXYKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotICAgIGFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotICBwc2V1ZG9fc2V0IChzeW1ib2xQKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgLyogWFhYIG5vdyB3ZSBjb21lIHRvIHRoZSBUaHVtYiBzcGVjaWZpYyBiaXQgb2YgY29kZS4gICovCi0gIAotICBUSFVNQl9TRVRfRlVOQyAoc3ltYm9sUCwgMSk7Ci0gIEFSTV9TRVRfVEhVTUIgKHN5bWJvbFAsIDEpOwotICBBUk1fU0VUX0lOVEVSV09SSyAoc3ltYm9sUCwgc3VwcG9ydF9pbnRlcndvcmspOwotfQotCi0vKiBJZiB3ZSBjaGFuZ2Ugc2VjdGlvbiB3ZSBtdXN0IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBmaXJzdC4gICovCi1zdGF0aWMgdm9pZAotYXJtX3NfdGV4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAobm93X3NlZyAhPSB0ZXh0X3NlY3Rpb24pCi0gICAgc19sdG9yZyAoMCk7Ci0gIAotICBzX3RleHQgKGlnbm9yZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcm1fc19kYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICB7Ci0gICAgICBpZiAobm93X3NlZyAhPSB0ZXh0X3NlY3Rpb24pCi0Jc19sdG9yZyAoMCk7Ci0gICAgfQotICBlbHNlIGlmIChub3dfc2VnICE9IGRhdGFfc2VjdGlvbikKLSAgICBzX2x0b3JnICgwKTsKLSAgCi0gIHNfZGF0YSAoaWdub3JlKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkCi1hcm1fc19zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfbHRvcmcgKDApOwotCi0gIG9ial9lbGZfc2VjdGlvbiAoaWdub3JlKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotb3Bjb2RlX3NlbGVjdCAod2lkdGgpCi0gICAgIGludCB3aWR0aDsKLXsKLSAgc3dpdGNoICh3aWR0aCkKLSAgICB7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmICghIHRodW1iX21vZGUpCi0JewotCSAgaWYgKCEgKGNwdV92YXJpYW50ICYgQVJNX1RIVU1CKSkKLQkgICAgYXNfYmFkIChfKCJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBUSFVNQiBvcGNvZGVzIikpOwotCSAgdGh1bWJfbW9kZSA9IDE7Ci0gICAgICAgICAgLyogTm8gbmVlZCB0byBmb3JjZSB0aGUgYWxpZ25tZW50LCBzaW5jZSB3ZSB3aWxsIGhhdmUgYmVlbgotICAgICAgICAgICAgIGNvbWluZyBmcm9tIEFSTSBtb2RlLCB3aGljaCBpcyB3b3JkLWFsaWduZWQuICovCi0gICAgICAgICAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDMyOgotICAgICAgaWYgKHRodW1iX21vZGUpCi0JewotICAgICAgICAgIGlmICgoY3B1X3ZhcmlhbnQgJiBBUk1fQU5ZKSA9PSBBUk1fVEhVTUIpCi0JICAgIGFzX2JhZCAoXygic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgQVJNIG9wY29kZXMiKSk7Ci0JICB0aHVtYl9tb2RlID0gMDsKLSAgICAgICAgICBpZiAoIW5lZWRfcGFzc18yKQotICAgICAgICAgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0gICAgICAgICAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGluc3RydWN0aW9uIHNpemUgc2VsZWN0ZWQgKCVkKSIpLCB3aWR0aCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc19hcm0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgb3Bjb2RlX3NlbGVjdCAoMzIpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc190aHVtYiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvcGNvZGVfc2VsZWN0ICgxNik7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvZGUgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzd2l0Y2ggKHRlbXApCi0gICAgewotICAgIGNhc2UgMTY6Ci0gICAgY2FzZSAzMjoKLSAgICAgIG9wY29kZV9zZWxlY3QgKHRlbXApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIG9wZXJhbmQgdG8gLmNvZGUgZGlyZWN0aXZlICglZCkgKGV4cGVjdGluZyAxNiBvciAzMikiKSwgdGVtcCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZW5kX29mX2xpbmUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgqc3RyICE9ICdcMCcpCi0gICAgaW5zdC5lcnJvciA9IF8oIkdhcmJhZ2UgZm9sbG93aW5nIGluc3RydWN0aW9uIik7Ci19Ci0KLXN0YXRpYyBpbnQKLXNraXBfcGFzdF9jb21tYSAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqcCA9ICpzdHIsIGM7Ci0gIGludCBjb21tYSA9IDA7Ci0gICAgCi0gIHdoaWxlICgoYyA9ICpwKSA9PSAnICcgfHwgYyA9PSAnLCcpCi0gICAgewotICAgICAgcCsrOwotICAgICAgaWYgKGMgPT0gJywnICYmIGNvbW1hKyspCi0JcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmIChjID09ICdcMCcpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgKnN0ciA9IHA7Ci0gIHJldHVybiBjb21tYSA/IFNVQ0NFU1MgOiBGQUlMOwotfQotCi0vKiBBIHN0YW5kYXJkIHJlZ2lzdGVyIG11c3QgYmUgZ2l2ZW4gYXQgdGhpcyBwb2ludC4gIFNoaWZ0IGlzIHRoZSBwbGFjZSB0bwotICAgcHV0IGl0IGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotc3RhdGljIGludAotcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgc2hpZnQpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHNoaWZ0OwotewotICBzdGF0aWMgY2hhciBidWZmIFsxMjhdOyAvKiBYWFggKi8KLSAgaW50ICAgIHJlZzsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLQotICBpZiAoKHJlZyA9IGFybV9yZWdfcGFyc2UgKHN0cikpICE9IEZBSUwgJiYgaW50X3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIGlmIChzaGlmdCA+PSAwKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHNoaWZ0OwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQsIHdlIG1heSBoYXZlIGdvdCBhIHJlZyBvZiB0aGUgd3JvbmcgY2xhc3MuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIAotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4gKi8KLSAgc3ByaW50ZiAoYnVmZiwgXygiUmVnaXN0ZXIgZXhwZWN0ZWQsIG5vdCAnJS4xMDBzJyIpLCBzdGFydCk7Ci0gIGluc3QuZXJyb3IgPSBidWZmOwotCi0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1wc3JfcmVxdWlyZWRfaGVyZSAoc3RyLCBjcHNyLCBzcHNyKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICBjcHNyOwotICAgICBpbnQgICAgIHNwc3I7Ci17Ci0gIGludCAgICBwc3I7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0gIHBzciA9IGFybV9wc3JfcGFyc2UgKHN0cik7Ci0gIAotICBpZiAgKHBzciA9PSBjcHNyIHx8IHBzciA9PSBzcHNyKQotICAgIHsKLSAgICAgIGlmIChwc3IgPT0gc3BzcikKLQlpbnN0Lmluc3RydWN0aW9uIHw9IDEgPDwgMjI7Ci0gICAgICAKLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLQotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4gKi8KLSAgaW5zdC5lcnJvciA9IF8oIjxwc3IoZik+IGV4cGVjdGVkIik7Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1jb19wcm9jX251bWJlciAoc3RyKQotICAgICBjaGFyICoqc3RyOwotewotICBpbnQgcHJvY2Vzc29yLCBwY2hhcjsKLQotICB3aGlsZSAoKipzdHIgPT0gJyAnKQotICAgICgqc3RyKSsrOwotCi0gIC8qIFRoZSBkYXRhIHNoZWV0IHNlZW1zIHRvIGltcGx5IHRoYXQganVzdCBhIG51bWJlciBvbiBpdHMgb3duIGlzIHZhbGlkCi0gICAgIGhlcmUsIGJ1dCB0aGUgUklTQyBpWCBhc3NlbWJsZXIgc2VlbXMgdG8gYWNjZXB0IGEgcHJlZml4ICdwJy4gIFdlIHdpbGwKLSAgICAgYWNjZXB0IGVpdGhlci4gICovCi0gIGlmICgqKnN0ciA9PSAncCcgfHwgKipzdHIgPT0gJ1AnKQotICAgICgqc3RyKSsrOwotCi0gIHBjaGFyID0gKigqc3RyKSsrOwotICBpZiAocGNoYXIgPj0gJzAnICYmIHBjaGFyIDw9ICc5JykKLSAgICB7Ci0gICAgICBwcm9jZXNzb3IgPSBwY2hhciAtICcwJzsKLSAgICAgIGlmICgqKnN0ciA+PSAnMCcgJiYgKipzdHIgPD0gJzknKQotCXsKLQkgIHByb2Nlc3NvciA9IHByb2Nlc3NvciAqIDEwICsgKigqc3RyKSsrIC0gJzAnOwotCSAgaWYgKHByb2Nlc3NvciA+IDE1KQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIklsbGVnYWwgY28tcHJvY2Vzc29yIG51bWJlciIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJCYWQgb3IgbWlzc2luZyBjby1wcm9jZXNzb3IgbnVtYmVyIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBwcm9jZXNzb3IgPDwgODsKLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX29wY19leHByIChzdHIsIHdoZXJlLCBsZW5ndGgpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cHI7Ci0KLSAgd2hpbGUgKCoqc3RyID09ICcgJykKLSAgICAoKnN0cikrKzsKLQotICBtZW1zZXQgKCZleHByLCAnXDAnLCBzaXplb2YgKGV4cHIpKTsKLQotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZleHByLCBzdHIpKQotICAgIHJldHVybiBGQUlMOwotICBpZiAoZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImJhZCBvciBtaXNzaW5nIGV4cHJlc3Npb24iKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBpZiAoKGV4cHIuWF9hZGRfbnVtYmVyICYgKCgxIDw8IGxlbmd0aCkgLSAxKSkgIT0gZXhwci5YX2FkZF9udW1iZXIpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSBjby1wcm9jZXNzb3IgZXhwcmVzc2lvbiB0b28gbGFyZ2UiKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGV4cHIuWF9hZGRfbnVtYmVyIDw8IHdoZXJlOwotICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotY3BfcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgd2hlcmUpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHdoZXJlOwotewotICBpbnQgICAgcmVnOwotICBjaGFyICogc3RhcnQgPSAqc3RyOwotCi0gIGlmICgocmVnID0gYXJtX3JlZ19wYXJzZSAoc3RyKSkgIT0gRkFJTCAmJiBjcF9yZWdpc3RlciAocmVnKSkKLSAgICB7Ci0gICAgICByZWcgJj0gMTU7Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IHJlZyA8PCB3aGVyZTsKLSAgICAgIHJldHVybiByZWc7Ci0gICAgfQotCi0gIC8qIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSAgICAgdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbiAqLwotICBpbnN0LmVycm9yID0gXygiQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGV4cGVjdGVkIik7Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQgKi8KLSAgKnN0ciA9IHN0YXJ0OwotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotZnBfcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgd2hlcmUpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHdoZXJlOwotewotICBpbnQgcmVnOwotICBjaGFyICogc3RhcnQgPSAqc3RyOwotCi0gIGlmICgocmVnID0gYXJtX3JlZ19wYXJzZSAoc3RyKSkgIT0gRkFJTCAmJiBmcF9yZWdpc3RlciAocmVnKSkKLSAgICB7Ci0gICAgICByZWcgJj0gNzsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHdoZXJlOwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotICAgICB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuICovCi0gIGluc3QuZXJyb3IgPSBfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBleHBlY3RlZCIpOwotCi0gIC8qIFJlc3RvcmUgdGhlIHN0YXJ0IHBvaW50ICovCi0gICpzdHIgPSBzdGFydDsKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX2FkZHJlc3Nfb2Zmc2V0IChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBpbnQgb2Zmc2V0OwotCi0gIHdoaWxlICgqKnN0ciA9PSAnICcpCi0gICAgKCpzdHIpKys7Ci0KLSAgaWYgKCEgaXNfaW1tZWRpYXRlX3ByZWZpeCAoKipzdHIpKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gICgqc3RyKSsrOwotICAKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCBzdHIpKQotICAgIHJldHVybiBGQUlMOwotICAKLSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBvZmZzZXQgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0gICAgICAKLSAgICAgIGlmIChvZmZzZXQgJiAzKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJjby1wcm9jZXNzb3IgYWRkcmVzcyBtdXN0IGJlIHdvcmQgYWxpZ25lZCIpOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotCi0gICAgICBpZiAob2Zmc2V0ID4gMTAyMyB8fCBvZmZzZXQgPCAtMTAyMykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygib2Zmc2V0IHRvbyBsYXJnZSIpOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotCi0gICAgICBpZiAob2Zmc2V0ID49IDApCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSBJTkRFWF9VUDsKLSAgICAgIGVsc2UKLQlvZmZzZXQgPSAtb2Zmc2V0OwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IG9mZnNldCA+PiAyOwotICAgIH0KLSAgZWxzZQotICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTTsKLQotICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBjaGFyICogcCA9ICogc3RyOwotICBpbnQgICAgcHJlX2luYyA9IDA7Ci0gIGludCAgICB3cml0ZV9iYWNrID0gMDsKLQotICBpZiAoKnAgPT0gJ1snKQotICAgIHsKLSAgICAgIGludCByZWc7Ci0KLSAgICAgIHArKzsKLSAgICAgIHdoaWxlICgqcCA9PSAnICcpCi0JcCsrOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHAsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgd2hpbGUgKCpwID09ICcgJykKLQlwKys7Ci0KLSAgICAgIGlmICgqcCA9PSAnXScpCi0JewotCSAgcCsrOwotCSAgCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmIHApID09IFNVQ0NFU1MpCi0JICAgIHsKLQkgICAgICAvKiBbUm5dLCAjZXhwciAqLwotCSAgICAgIHdyaXRlX2JhY2sgPSBXUklURV9CQUNLOwotCSAgICAgIAotCSAgICAgIGlmIChyZWcgPT0gUkVHX1BDKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oInBjIG1heSBub3QgYmUgdXNlZCBpbiBwb3N0LWluY3JlbWVudCIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBpZiAoY3BfYWRkcmVzc19vZmZzZXQgKCYgcCkgPT0gRkFJTCkKLQkJcmV0dXJuIEZBSUw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcHJlX2luYyA9IFBSRV9JTkRFWCB8IElOREVYX1VQOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiAnWydSbiwgI2V4cHInXSdbIV0gKi8KLQotCSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJiBwKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oInByZS1pbmRleGVkIGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkgICAgICByZXR1cm4gRkFJTDsKLQkgICAgfQotCi0JICBwcmVfaW5jID0gUFJFX0lOREVYOwotCSAgCi0JICBpZiAoY3BfYWRkcmVzc19vZmZzZXQgKCYgcCkgPT0gRkFJTCkKLQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkgIHdoaWxlICgqcCA9PSAnICcpCi0JICAgIHArKzsKLQotCSAgaWYgKCpwKysgIT0gJ10nKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIm1pc3NpbmcgXSIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIHdoaWxlICgqcCA9PSAnICcpCi0JICAgIHArKzsKLQotCSAgaWYgKCpwID09ICchJykKLQkgICAgewotCSAgICAgIGlmIChyZWcgPT0gUkVHX1BDKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oInBjIG1heSBub3QgYmUgdXNlZCB3aXRoIHdyaXRlLWJhY2siKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgcCsrOwotCSAgICAgIHdyaXRlX2JhY2sgPSBXUklURV9CQUNLOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmcCkpCi0JcmV0dXJuIEZBSUw7Ci0KLSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTTsKLSAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAgLyogUEMgcmVsIGFkanVzdCAqLwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUkVHX1BDIDw8IDE2KTsKLSAgICAgIHByZV9pbmMgPSBQUkVfSU5ERVg7Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gd3JpdGVfYmFjayB8IHByZV9pbmM7Ci0gICpzdHIgPSBwOwotICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQKLWRvX25vcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogRG8gbm90aGluZyByZWFsbHkgKi8KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsgLyogVGhpcyBpcyBwb2ludGxlc3MgKi8KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX21ycyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBPbmx5IG9uZSBzeW50YXggKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBwc3JfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIENQU1JfQUxMLCBTUFNSX0FMTCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiPHBzcj4gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogVGhyZWUgcG9zc2libGUgZm9ybXM6ICI8cHNyPiwgUm0iLCAiPHBzcmY+LCBSbSIsICI8cHNyZj4sICNleHByZXNzaW9uIiAqLwotc3RhdGljIHZvaWQKLWRvX21zciAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyICsrOwotCi0gIGlmIChwc3JfcmVxdWlyZWRfaGVyZSAoJnN0ciwgQ1BTUl9BTEwsIFNQU1JfQUxMKSA9PSBTVUNDRVNTKQotICAgIHsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUFNSX0FMTDsKLQotICAgICAgLyogU3l0YXggc2hvdWxkIGJlICI8cHNyPiwgUm0iICovCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0JICB8fCAocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotCXsKLQkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBzcl9yZXF1aXJlZF9oZXJlICgmIHN0ciwgQ1BTUl9GTEcsIFNQU1JfRkxHKSA9PSBTVUNDRVNTKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gUFNSX0ZMQUdTOwotICAgICAgZWxzZSBpZiAocHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0NUTCwgU1BTUl9DVEwpID09IFNVQ0NFU1MpCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfQ09OVFJPTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0JICByZXR1cm47Ci0JfQotICAgICAgCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCXsKLQkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAKLSAgICAgIC8qIFN5bnRheCBjb3VsZCBiZSAiPHBzcmY+LCBybSIsICI8cHNyZj4sICNleHByZXNzaW9uIiAqLwotICAgICAgCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgMCkpICE9IEZBSUwpCi0JOwotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24gKi8KLSAgICAgIGVsc2UgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCogc3RyKSkKLQl7Ci0JICBzdHIgKys7Ci0JICBpbnN0LmVycm9yID0gTlVMTDsKLQkgIAotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCAmIHN0cikpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiUmVnaXN0ZXIgb3Igc2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpZiAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQotCSAgICB7Ci0JICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU7Ci0JICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCB2YWx1ZSA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAoaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKTsKLQkgICAgICBpZiAodmFsdWUgPT0gRkFJTCkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IHZhbHVlOwotCSAgICB9Ci0KLQkgIGZsYWdzIHw9IElOU1RfSU1NRURJQVRFOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiRXJyb3I6IHVucmVjb2duaXNlZCBzeW50YXggZm9yIHNlY29uZCBhcmd1bWVudCB0byBtc3IgaW5zdHJ1Y3Rpb24iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGluc3QuZXJyb3IgPSBOVUxMOyAKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogTG9uZyBNdWx0aXBseSBQYXJzZXIKLSAgIFVNVUxMIFJkTG8sIFJkSGksIFJtLCBScwotICAgU01VTEwgUmRMbywgUmRIaSwgUm0sIFJzCi0gICBVTUxBTCBSZExvLCBSZEhpLCBSbSwgUnMKLSAgIFNNTEFMIFJkTG8sIFJkSGksIFJtLCBScwotKi8gICAKLXN0YXRpYyB2b2lkCi1kb19tdWxsIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmRsbywgcmRoaSwgcm0sIHJzOwotCi0gIC8qIG9ubHkgb25lIGZvcm1hdCAicmRsbywgcmRoaSwgcm0sIHJzIiAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZGxvID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyZGhpID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCAqLwotICBpZiAocmRsbyA9PSByZGhpIHx8IHJkbG8gPT0gcm0gfHwgcmRoaSA9PSBybSkKLSAgICBhc190c2t0c2sgKF8oInJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCIpKTsKLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocnMgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgOCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX211bCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZCwgcm07Ci0gIAotICAvKiBvbmx5IG9uZSBmb3JtYXQgInJkLCBybSwgcnMiICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZCA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gcmQpCi0gICAgYXNfdHNrdHNrIChfKCJyZCBhbmQgcm0gc2hvdWxkIGJlIGRpZmZlcmVudCBpbiBtdWwiKSk7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDgpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbWxhIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJkLCBybTsKLQotICAvKiBvbmx5IG9uZSBmb3JtYXQgInJkLCBybSwgcnMsIHJuIiAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZCA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmQgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfcGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChybSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IHJkKQotICAgIGFzX3Rza3RzayAoXygicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbWxhIikpOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyZCA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA4KSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJkID09IFJFR19QQyB8fCBybSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogUmV0dXJucyB0aGUgaW5kZXggaW50byBmcF92YWx1ZXMgb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIG9yIC0xIGlmCi0gICBub3QgaW4gdGhlIHRhYmxlLiAgKi8KLXN0YXRpYyBpbnQKLW15X2dldF9mbG9hdF9leHByZXNzaW9uIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKiAgICAgICAgIHNhdmVfaW47Ci0gIGV4cHJlc3Npb25TICAgIGV4cDsKLSAgaW50ICAgICAgICAgICAgaTsKLSAgaW50ICAgICAgICAgICAgajsKLQotICBtZW1zZXQgKHdvcmRzLCAwLCBNQVhfTElUVExFTlVNUyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgLyogTG9vayBmb3IgYSByYXcgZmxvYXRpbmcgcG9pbnQgbnVtYmVyICovCi0gIGlmICgoc2F2ZV9pbiA9IGF0b2ZfaWVlZSAoKnN0ciwgJ3gnLCB3b3JkcykpICE9IE5VTEwKLSAgICAgICYmIChpc19lbmRfb2ZfbGluZSBbKGludCkoKnNhdmVfaW4pXSB8fCAqc2F2ZV9pbiA9PSAnXDAnKSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKLQl7Ci0JICBmb3IgKGogPSAwOyBqIDwgTUFYX0xJVFRMRU5VTVM7IGorKykKLQkgICAgewotCSAgICAgIGlmICh3b3Jkc1tqXSAhPSBmcF92YWx1ZXNbaV1bal0pCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChqID09IE1BWF9MSVRUTEVOVU1TKQotCSAgICB7Ci0JICAgICAgKnN0ciA9IHNhdmVfaW47Ci0JICAgICAgcmV0dXJuIGk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFRyeSBhbmQgcGFyc2UgYSBtb3JlIGNvbXBsZXggZXhwcmVzc2lvbiwgdGhpcyB3aWxsIHByb2JhYmx5IGZhaWwKLSAgICAgdW5sZXNzIHRoZSBjb2RlIHVzZXMgYSBmbG9hdGluZyBwb2ludCBwcmVmaXggKGVnICIwZiIpICovCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9ICpzdHI7Ci0gIGlmIChleHByZXNzaW9uICgmZXhwKSA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBleHAuWF9vcCA9PSBPX2JpZwotICAgICAgJiYgZXhwLlhfYWRkX251bWJlciA8IDApCi0gICAgewotICAgICAgLyogRklYTUU6IDUgPSBYX1BSRUNJU0lPTiwgc2hvdWxkIGJlICNkZWZpbmUnZCB3aGVyZSB3ZSBjYW4gdXNlIGl0LgotCSBEaXR0byBmb3IgMTUuICAqLwotICAgICAgaWYgKGdlbl90b193b3JkcyAod29yZHMsIDUsIChsb25nKTE1KSA9PSAwKQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkxPQVRfVkFMUzsgaSsrKQotCSAgICB7Ci0JICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9MSVRUTEVOVU1TOyBqKyspCi0JCXsKLQkJICBpZiAod29yZHNbal0gIT0gZnBfdmFsdWVzW2ldW2pdKQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChqID09IE1BWF9MSVRUTEVOVU1TKQotCQl7Ci0JCSAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotCQkgIHJldHVybiBpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICpzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAtMTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgYW55dGhpbmcgaW4gdGhlIGV4cHJlc3Npb24gaXMgYSBiaWdudW0gKi8KLXN0YXRpYyBpbnQKLXdhbGtfbm9fYmlnbnVtcyAoc3ApCi0gICAgIHN5bWJvbFMgKiBzcDsKLXsKLSAgaWYgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX29wID09IE9fYmlnKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHNwKS0+WF9hZGRfc3ltYm9sKQotICAgIHsKLSAgICAgIHJldHVybiAod2Fsa19ub19iaWdudW1zIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHNwKS0+WF9hZGRfc3ltYm9sKQotCSAgICAgIHx8IChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHNwKS0+WF9vcF9zeW1ib2wKLQkJICAmJiB3YWxrX25vX2JpZ251bXMgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX29wX3N5bWJvbCkpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW15X2dldF9leHByZXNzaW9uIChlcCwgc3RyKQotICAgICBleHByZXNzaW9uUyAqIGVwOwotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqIHNhdmVfaW47Ci0gIHNlZ1QgICBzZWc7Ci0gIAotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RyOwotICBzZWcgPSBleHByZXNzaW9uIChlcCk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotICBpZiAoc2VnICE9IGFic29sdXRlX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSBic3Nfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJiYWRfc2VnbWVudCIpOwotICAgICAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBHZXQgcmlkIG9mIGFueSBiaWdudW1zIG5vdywgc28gdGhhdCB3ZSBkb24ndCBnZW5lcmF0ZSBhbiBlcnJvciBmb3Igd2hpY2gKLSAgICAgd2UgY2FuJ3QgZXN0YWJsaXNoIGEgbGluZSBudW1iZXIgbGF0ZXIgb24uICBCaWcgbnVtYmVycyBhcmUgbmV2ZXIgdmFsaWQKLSAgICAgaW4gaW5zdHJ1Y3Rpb25zLCB3aGljaCBpcyB3aGVyZSB0aGlzIHJvdXRpbmUgaXMgYWx3YXlzIGNhbGxlZC4gICovCi0gIGlmIChlcC0+WF9vcCA9PSBPX2JpZwotICAgICAgfHwgKGVwLT5YX2FkZF9zeW1ib2wKLQkgICYmICh3YWxrX25vX2JpZ251bXMgKGVwLT5YX2FkZF9zeW1ib2wpCi0JICAgICAgfHwgKGVwLT5YX29wX3N5bWJvbAotCQkgICYmIHdhbGtfbm9fYmlnbnVtcyAoZXAtPlhfb3Bfc3ltYm9sKSkpKSkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBjb25zdGFudCIpOwotICAgICAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHVucmVzdHJpY3Qgc2hvdWxkIGJlIG9uZSBpZiA8c2hpZnQ+IDxyZWdpc3Rlcj4gaXMgcGVybWl0dGVkIGZvciB0aGlzCi0gICBpbnN0cnVjdGlvbiAqLwotCi1zdGF0aWMgaW50Ci1kZWNvZGVfc2hpZnQgKHN0ciwgdW5yZXN0cmljdCkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgdW5yZXN0cmljdDsKLXsKLSAgc3RydWN0IGFzbV9zaGlmdCAqIHNoZnQ7Ci0gIGNoYXIgKiBwOwotICBjaGFyICAgYzsKLSAgICAKLSAgd2hpbGUgKCoqc3RyID09ICcgJykKLSAgICAoKnN0cikrKzsKLSAgICAKLSAgZm9yIChwID0gKnN0cjsgaXNhbHBoYSAoKnApOyBwKyspCi0gICAgOwotCi0gIGlmIChwID09ICpzdHIpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIlNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBjID0gKnA7Ci0gICpwID0gJ1wwJzsKLSAgc2hmdCA9IChzdHJ1Y3QgYXNtX3NoaWZ0ICopIGhhc2hfZmluZCAoYXJtX3NoaWZ0X2hzaCwgKnN0cik7Ci0gICpwID0gYzsKLSAgaWYgKHNoZnQpCi0gICAgewotICAgICAgaWYgKCFzdHJuY21wICgqc3RyLCAicnJ4IiwgMykKLSAgICAgICAgICB8fCAhc3RybmNtcCAoKnN0ciwgIlJSWCIsIDMpKQotCXsKLQkgICpzdHIgPSBwOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGZ0LT52YWx1ZTsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLQotICAgICAgd2hpbGUgKCpwID09ICcgJykKLQlwKys7Ci0KLSAgICAgIGlmICh1bnJlc3RyaWN0ICYmIHJlZ19yZXF1aXJlZF9oZXJlICgmcCwgOCkgIT0gRkFJTCkKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHNoZnQtPnZhbHVlIHwgU0hJRlRfQllfUkVHOwotCSAgKnN0ciA9IHA7Ci0JICByZXR1cm4gU1VDQ0VTUzsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqIHApKQotCXsKLQkgIGluc3QuZXJyb3IgPSBOVUxMOwotCSAgcCsrOwotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZwKSkKLQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkgIC8qIFZhbGlkYXRlIHNvbWUgc2ltcGxlICNleHByZXNzaW9ucyAqLwotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIG51bSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgICAgIC8qIFJlamVjdCBvcGVyYXRpb25zIGdyZWF0ZXIgdGhhbiAzMiwgb3IgbHNsICMzMiAqLwotCSAgICAgIGlmIChudW0gPiAzMiB8fCAobnVtID09IDMyICYmIHNoZnQtPnZhbHVlID09IDApKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgaW1tZWRpYXRlIHNoaWZ0Iik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIC8qIFNoaWZ0cyBvZiB6ZXJvIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gbHNsICh3aGljaCBpcyB6ZXJvKSovCi0JICAgICAgaWYgKG51bSA9PSAwKQotCQl7Ci0JCSAgKnN0ciA9IHA7Ci0JCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JCX0KLQotCSAgICAgIC8qIFNoaWZ0cyBvZiAzMiBhcmUgZW5jb2RlZCBhcyAwLCBmb3IgdGhvc2Ugc2hpZnRzIHRoYXQKLQkJIHN1cHBvcnQgaXQuICAqLwotCSAgICAgIGlmIChudW0gPT0gMzIpCi0JCW51bSA9IDA7Ci0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChudW0gPDwgNykgfCBzaGZ0LT52YWx1ZTsKLQkgICAgICAqc3RyID0gcDsKLQkgICAgICByZXR1cm4gU1VDQ0VTUzsKLQkgICAgfQotCi0JICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTTsKLQkgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hmdC0+dmFsdWU7Ci0JICAqc3RyID0gcDsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gdW5yZXN0cmljdCA/IF8oInNoaWZ0IHJlcXVpcmVzIHJlZ2lzdGVyIG9yICNleHByZXNzaW9uIikKLQkgICAgOiBfKCJzaGlmdCByZXF1aXJlcyAjZXhwcmVzc2lvbiIpOwotCSAgKnN0ciA9IHA7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0gICAgfQotCi0gIGluc3QuZXJyb3IgPSBfKCJTaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gIHJldHVybiBGQUlMOwotfQotCi0vKiBEbyB0aG9zZSBkYXRhX29wcyB3aGljaCBjYW4gdGFrZSBhIG5lZ2F0aXZlIGltbWVkaWF0ZSBjb25zdGFudCAqLwotLyogYnkgYWx0ZXJpbmcgdGhlIGluc3R1Y3Rpb24uIEEgYml0IG9mIGEgaGFjayByZWFsbHkgKi8KLS8qICAgICAgTU9WIDwtPiBNVk4KLSAgICAgICAgQU5EIDwtPiBCSUMKLSAgICAgICAgQURDIDwtPiBTQkMKLSAgICAgICAgYnkgaW52ZXJ0aW5nIHRoZSBzZWNvbmQgb3BlcmFuZCwgYW5kCi0gICAgICAgIEFERCA8LT4gU1VCCi0gICAgICAgIENNUCA8LT4gQ01OCi0gICAgICAgIGJ5IG5lZ2F0aW5nIHRoZSBzZWNvbmQgb3BlcmFuZC4KLSovCi1zdGF0aWMgaW50Ci1uZWdhdGVfZGF0YV9vcCAoaW5zdHJ1Y3Rpb24sIHZhbHVlKQotICAgICB1bnNpZ25lZCBsb25nICogaW5zdHJ1Y3Rpb247Ci0gICAgIHVuc2lnbmVkIGxvbmcgICB2YWx1ZTsKLXsKLSAgaW50IG9wLCBuZXdfaW5zdDsKLSAgdW5zaWduZWQgbG9uZyBuZWdhdGVkLCBpbnZlcnRlZDsKLQotICBuZWdhdGVkID0gdmFsaWRhdGVfaW1tZWRpYXRlICgtdmFsdWUpOwotICBpbnZlcnRlZCA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAofnZhbHVlKTsKLQotICBvcCA9ICgqaW5zdHJ1Y3Rpb24gPj4gREFUQV9PUF9TSElGVCkgJiAweGY7Ci0gIHN3aXRjaCAob3ApCi0gICAgewotICAgICAgLyogRmlyc3QgbmVnYXRlcyAqLwotICAgIGNhc2UgT1BDT0RFX1NVQjogICAgICAgICAgICAgLyogQUREIDwtPiBTVUIgKi8KLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FERDsKLSAgICAgIHZhbHVlID0gbmVnYXRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQUREOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX1NVQjsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gbmVnYXRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQ01QOiAgICAgICAgICAgICAvKiBDTVAgPC0+IENNTiAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfQ01OOwotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9DTU46IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfQ01QOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE5vdyBJbnZlcnRlZCBvcHMgKi8KLSAgICBjYXNlIE9QQ09ERV9NT1Y6ICAgICAgICAgICAgIC8qIE1PViA8LT4gTVZOICovCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9NVk47ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9NVk46IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfTU9WOwotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQU5EOiAgICAgICAgICAgICAvKiBBTkQgPC0+IEJJQyAqLyAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0JJQzsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0JJQzogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9BTkQ7Ci0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9BREM6ICAgICAgICAgICAgICAvKiBBREMgPC0+IFNCQyAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfU0JDOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfU0JDOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FEQzsKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2UgY2Fubm90IGRvIGFueXRoaW5nICovCi0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmICh2YWx1ZSA9PSBGQUlMKQotICAgIHJldHVybiBGQUlMOwotCi0gICppbnN0cnVjdGlvbiAmPSBPUENPREVfTUFTSzsKLSAgKmluc3RydWN0aW9uIHw9IG5ld19pbnN0IDw8IERBVEFfT1BfU0hJRlQ7Ci0gIHJldHVybiB2YWx1ZTsgCi19Ci0KLXN0YXRpYyBpbnQKLWRhdGFfb3AyIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBpbnQgdmFsdWU7Ci0gIGV4cHJlc3Npb25TIGV4cHI7Ci0KLSAgd2hpbGUgKCoqc3RyID09ICcgJykKLSAgICAoKnN0cikrKzsKLSAgICAKLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApICE9IEZBSUwpCi0gICAgewotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQotCXsKLQkgIC8qIFNoaWZ0IG9wZXJhdGlvbiBvbiByZWdpc3RlciAqLwotCSAgcmV0dXJuIGRlY29kZV9zaGlmdCAoc3RyLCBOT19TSElGVF9SRVNUUklDVCk7Ci0JfQotICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqKnN0cikpCi0JewotCSAgKCpzdHIpKys7Ci0JICBpbnN0LmVycm9yID0gTlVMTDsKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCBzdHIpKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotCSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQotCQl7Ci0JCSAgLyogI3gsIHkgLS0gaWUgZXhwbGljaXQgcm90YXRpb24gYnkgWSAgKi8KLQkJICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZleHByLCBzdHIpKQotCQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkJICBpZiAoZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotIAotCQkgIC8qIFJvdGF0ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiAqLwotCQkgIGlmICgoKHVuc2lnbmVkKSBleHByLlhfYWRkX251bWJlcikgPiAzMAotCQkgICAgICB8fCAoZXhwci5YX2FkZF9udW1iZXIgJiAxKSAhPSAwCi0JCSAgICAgIHx8ICgodW5zaWduZWQpIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikgPiAyNTUpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotCQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEU7Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBleHByLlhfYWRkX251bWJlciA8PCA3OwotCQkgIHJldHVybiBTVUNDRVNTOwotCQl9Ci0KLQkgICAgICAvKiBJbXBsaWNpdCByb3RhdGlvbiwgc2VsZWN0IGEgc3VpdGFibGUgb25lICAqLwotCSAgICAgIHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpOwotCi0JICAgICAgaWYgKHZhbHVlID09IEZBSUwpCi0JCXsKLQkJICAvKiBDYW4ndCBiZSBkb25lLCBwZXJoYXBzIHRoZSBjb2RlIHJlYWRzIHNvbWV0aGluZyBsaWtlCi0JCSAgICAgImFkZCBSZCwgUm4sICMtbiIsIHdoZXJlICJzdWIgUmQsIFJuLCAjbiIgd291bGQgYmUgb2sgKi8KLQkJICBpZiAoKHZhbHVlID0gbmVnYXRlX2RhdGFfb3AgKCZpbnN0Lmluc3RydWN0aW9uLAotCQkJCQkgICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKSkKLQkJICAgICAgPT0gRkFJTCkKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gdmFsdWU7Ci0JICAgIH0KLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBJTlNUX0lNTUVESUFURTsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLQotICAgICAgKCpzdHIpKys7Ci0gICAgICBpbnN0LmVycm9yID0gXygiUmVnaXN0ZXIgb3Igc2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1mcF9vcDIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIHdoaWxlICgqKnN0ciA9PSAnICcpCi0gICAgKCpzdHIpKys7Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApICE9IEZBSUwpCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbiAqLwotICAgICAgaWYgKCooKCpzdHIpKyspID09ICcjJykKLQl7Ci0JICBpbnQgaTsKLQotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0JICB3aGlsZSAoKipzdHIgPT0gJyAnKQotCSAgICAoKnN0cikrKzsKLQotCSAgLyogRmlyc3QgdHJ5IGFuZCBtYXRjaCBleGFjdCBzdHJpbmdzLCB0aGlzIGlzIHRvIGd1YXJhbnRlZSB0aGF0Ci0JICAgICBzb21lIGZvcm1hdHMgd2lsbCB3b3JrIGV2ZW4gZm9yIGNyb3NzIGFzc2VtYmx5ICovCi0KLQkgIGZvciAoaSA9IDA7IGZwX2NvbnN0W2ldOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybmNtcCAoKnN0ciwgZnBfY29uc3RbaV0sIHN0cmxlbiAoZnBfY29uc3RbaV0pKSA9PSAwKQotCQl7Ci0JCSAgY2hhciAqc3RhcnQgPSAqc3RyOwotCi0JCSAgKnN0ciArPSBzdHJsZW4gKGZwX2NvbnN0W2ldKTsKLQkJICBpZiAoaXNfZW5kX29mX2xpbmVbKGludCkqKnN0cl0gfHwgKipzdHIgPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpICsgODsKLQkJICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JCSAgICB9Ci0JCSAgKnN0ciA9IHN0YXJ0OwotCQl9Ci0JICAgIH0KLQotCSAgLyogSnVzdCBiZWNhdXNlIHdlIGRpZG4ndCBnZXQgYSBtYXRjaCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUKLQkgICAgIGNvbnN0YW50IGlzbid0IHZhbGlkLCBqdXN0IHRoYXQgaXQgaXMgaW4gYSBmb3JtYXQgdGhhdCB3ZQotCSAgICAgZG9uJ3QgYXV0b21hdGljYWxseSByZWNvZ25pemUuICBUcnkgcGFyc2luZyBpdCB3aXRoCi0JICAgICB0aGUgc3RhbmRhcmQgZXhwcmVzc2lvbiByb3V0aW5lcy4gICovCi0JICBpZiAoKGkgPSBteV9nZXRfZmxvYXRfZXhwcmVzc2lvbiAoc3RyKSkgPj0gMCkKLQkgICAgewotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaSArIDg7Ci0JICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JICAgIH0KLQotCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGV4cHJlc3Npb24iKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGluc3QuZXJyb3IgPSBfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBvciBpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZG9fYXJpdCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBkYXRhX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYWRyIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogVGhpcyBpcyBhIHBzZXVkby1vcCBvZiB0aGUgZm9ybSAiYWRyIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtICJhZGQgcmQsIHBjLCAjbGFiZWwtLi04IiAqLwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBGcmFnIGhhY2tpbmcgd2lsbCB0dXJuIHRoaXMgaW50byBhIHN1YiBpbnN0cnVjdGlvbiBpZiB0aGUgb2Zmc2V0IHR1cm5zCi0gICAgIG91dCB0byBiZSBuZWdhdGl2ZS4gICovCi0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gODsgLyogUEMgcmVsYXRpdmUgYWRqdXN0ICovCi0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2FkcmwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHJsIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtOgotICAgICAJYWRkIHJkLCBwYywgI2xvdyhsYWJlbC0uLTgpIgotICAgICAJYWRkIHJkLCByZCwgI2hpZ2gobGFiZWwtLi04KSIgICAqLwotCi0gIHdoaWxlICgqIHN0ciA9PSAnICcpCi0gICAgc3RyICsrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCYgc3RyKSA9PSBGQUlMCi0gICAgICB8fCBteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIAotICAvKiBGcmFnIGhhY2tpbmcgd2lsbCB0dXJuIHRoaXMgaW50byBhIHN1YiBpbnN0cnVjdGlvbiBpZiB0aGUgb2Zmc2V0IHR1cm5zCi0gICAgIG91dCB0byBiZSBuZWdhdGl2ZS4gICovCi0gIGluc3QucmVsb2MudHlwZSAgICAgICAgICAgICAgPSBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFOwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gODsgLyogUEMgcmVsYXRpdmUgYWRqdXN0ICovCi0gIGluc3QucmVsb2MucGNfcmVsICAgICAgICAgICAgPSAxOwotICBpbnN0Lmluc3RydWN0aW9uICAgICAgICAgICAgfD0gZmxhZ3M7Ci0gIGluc3Quc2l6ZSAgICAgICAgICAgICAgICAgICAgPSBJTlNOX1NJWkUgKiAyOwotICAKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY21wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZGF0YV9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgaWYgKChmbGFncyAmIDB4MDAwMGYwMDApID09IDApCi0gICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDT05EU19CSVQ7Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX21vdiAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLWxkc3RfZXh0ZW5kIChzdHIsIGh3c2UpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIGh3c2U7Ci17Ci0gIGludCBhZGQgPSBJTkRFWF9VUDsKLQotICBzd2l0Y2ggKCoqc3RyKQotICAgIHsKLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICckJzoKLSAgICAgICgqc3RyKSsrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCBzdHIpKQotCXJldHVybiBGQUlMOwotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIGludCB2YWx1ZSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotICAgICAgICAgIGlmICgoaHdzZSAmJiAodmFsdWUgPCAtMjU1IHx8IHZhbHVlID4gMjU1KSkKLSAgICAgICAgICAgICAgIHx8ICh2YWx1ZSA8IC00MDk1IHx8IHZhbHVlID4gNDA5NSkpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiYWRkcmVzcyBvZmZzZXQgdG9vIGxhcmdlIik7Ci0JICAgICAgcmV0dXJuIEZBSUw7Ci0JICAgIH0KLQotCSAgaWYgKHZhbHVlIDwgMCkKLQkgICAgewotCSAgICAgIHZhbHVlID0gLXZhbHVlOwotCSAgICAgIGFkZCA9IDA7Ci0JICAgIH0KLQotICAgICAgICAgIC8qIEhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uIGluc3RydWN0aW9ucyBoYXZlIHRoZQotICAgICAgICAgICAgIGltbWVkaWF0ZSB2YWx1ZSBzcGxpdCBhY3Jvc3MgYml0cyAxMS4uOCBhbmQgYml0cyAzLi4wICovCi0gICAgICAgICAgaWYgKGh3c2UpCi0gICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZCB8IEhXT0ZGU0VUX0lNTSB8ICgodmFsdWUgPj4gNCkgPDwgOCkgfCAodmFsdWUgJiAweEYpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkIHwgdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLSAgICAgICAgICBpZiAoaHdzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBIV09GRlNFVF9JTU07Ci0gICAgICAgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOwotCSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCX0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgICBhZGQgPSAwOwkvKiBhbmQgZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSAnKyc6Ci0gICAgICAoKnN0cikrKzsJLyogYW5kIGZhbGwgdGhyb3VnaCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgPT0gRkFJTCkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaWYgKGh3c2UpCi0gICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkOwotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQgfCBPRkZTRVRfUkVHOwotICAgICAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKHN0cikgPT0gU1VDQ0VTUykKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfc2hpZnQgKHN0ciwgU0hJRlRfUkVTVFJJQ1QpOwotICAgICAgICB9Ci0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2xkc3QgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgaGFsZndvcmQgPSAwOwotICBpbnQgcHJlX2luYyA9IDA7Ci0gIGludCBjb25mbGljdF9yZWc7Ci0gIGludCB2YWx1ZTsKLQotICAvKiBUaGlzIGlzIG5vdCBpZGVhbCwgYnV0IGl0IGlzIHRoZSBzaW1wbGVzdCB3YXkgb2YgZGVhbGluZyB3aXRoIHRoZQotICAgICBBUk03VCBoYWxmd29yZCBpbnN0cnVjdGlvbnMgKHNpbmNlIHRoZXkgdXNlIGEgZGlmZmVyZW50Ci0gICAgIGVuY29kaW5nLCBidXQgdGhlIHNhbWUgbW5lbW9uaWMpOiAqLwotICBoYWxmd29yZCA9IChmbGFncyAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIGlmIChoYWxmd29yZCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgbG9hZC9zdG9yZSBvZiBhIGhhbGZ3b3JkLCBvciBhCi0gICAgICAgICBzaWduZWQtZXh0ZW5zaW9uIGxvYWQgKi8KLSAgICAgIGlmICgoY3B1X3ZhcmlhbnQgJiBBUk1fSEFMRldPUkQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0LmVycm9yCi0JICAgID0gXygiUHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgaGFsZndvcmRzIG9yIHNpZ25lZCBieXRlcyIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uID0gKGluc3QuaW5zdHJ1Y3Rpb24gJiBDT05EX01BU0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgfCAoZmxhZ3MgJiB+Q09ORF9NQVNLKTsKLQotICAgICAgZmxhZ3MgPSAwOwotICAgIH0KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0gICAgCi0gIGlmICgoY29uZmxpY3RfcmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAxMikpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJiBzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIkFkZHJlc3MgZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzdHIgPT0gJ1snKQotICAgIHsKLSAgICAgIGludCByZWc7Ci0KLSAgICAgIHN0cisrOwotICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCXN0cisrOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICBjb25mbGljdF9yZWcgPSAoKChjb25mbGljdF9yZWcgPT0gcmVnKQotCQkgICAgICAgJiYgKGluc3QuaW5zdHJ1Y3Rpb24gJiBMT0FEX0JJVCkpCi0JCSAgICAgID8gMSA6IDApOwotCi0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmICgqc3RyID09ICddJykKLQl7Ci0JICBzdHIrKzsKLQkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IFNVQ0NFU1MpCi0JICAgIHsKLQkgICAgICAvKiBbUm5dLC4uLiAocG9zdCBpbmMpICovCi0JICAgICAgaWYgKGxkc3RfZXh0ZW5kICgmc3RyLCBoYWxmd29yZCkgPT0gRkFJTCkKLQkJcmV0dXJuOwotCSAgICAgIGlmIChjb25mbGljdF9yZWcpCi0JCWFzX3dhcm4gKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFtSbl0gKi8KLSAgICAgICAgICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOwotCi0gICAgICAgICAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLSAgICAgICAgICAgICAgIHN0cisrOwotCi0gICAgICAgICAgICAgIGlmICgqc3RyID09ICchJykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0X3JlZykKLSAgICAgICAgICAgICAgICAgIGFzX3dhcm4gKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iKSk7Ci0gICAgICAgICAgICAgICAgIHN0cisrOwotICAgICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFdSSVRFX0JBQ0s7Ci0gICAgICAgICAgICAgICB9Ci0KLQkgICAgICBmbGFncyB8PSBJTkRFWF9VUDsKLQkgICAgICBpZiAoISAoZmxhZ3MgJiBUUkFOU19CSVQpKQotCQlwcmVfaW5jID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBbUm4sLi4uXSAqLwotCSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJwcmUtaW5kZXhlZCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHByZV9pbmMgPSAxOwotCSAgaWYgKGxkc3RfZXh0ZW5kICgmc3RyLCBoYWxmd29yZCkgPT0gRkFJTCkKLQkgICAgcmV0dXJuOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcpCi0JICAgIHN0cisrOwotCi0JICBpZiAoKnN0cisrICE9ICddJykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJtaXNzaW5nIF0iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCSAgICBzdHIrKzsKLQotCSAgaWYgKCpzdHIgPT0gJyEnKQotCSAgICB7Ci0JICAgICAgaWYgKGNvbmZsaWN0X3JlZykKLQkJYXNfdHNrdHNrIChfKCJkZXN0aW5hdGlvbiByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZVxuIikpOwotCSAgICAgIHN0cisrOwotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gV1JJVEVfQkFDSzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHIgPT0gJz0nKQotICAgIHsKLSAgICAgIC8qIFBhcnNlIGFuICJsZHIgUmQsID1leHByIiBpbnN0cnVjdGlvbjsgdGhpcyBpcyBhbm90aGVyIHBzZXVkbyBvcCAqLwotICAgICAgc3RyKys7Ci0KLSAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLQlzdHIrKzsKLQotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCSAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX3N5bWJvbCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgKHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikpICE9IEZBSUwpCi0JewotCSAgLyogVGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgbW92IGluc3RydWN0aW9uICovCi0JICBpbnN0Lmluc3RydWN0aW9uICY9IExJVEVSQUxfTUFTSzsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEUgfCAoT1BDT0RFX01PViA8PCBEQVRBX09QX1NISUZUKTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKGZsYWdzICYgQ09ORF9NQVNLKSB8ICh2YWx1ZSAmIDB4ZmZmKTsKLQkgIGVuZF9vZl9saW5lKHN0cik7Ci0JICByZXR1cm47IAotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJbnNlcnQgaW50byBsaXRlcmFsIHBvb2wgKi8gICAgIAotCSAgaWYgKGFkZF90b19saXRfcG9vbCAoKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaWYgKCFpbnN0LmVycm9yKQotCQlpbnN0LmVycm9yID0gXygibGl0ZXJhbCBwb29sIGluc2VydGlvbiBmYWlsZWQiKTsgCi0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIENoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24gZXhwIHRvIHBvaW50IHRvIHRoZSBwb29sICovCi0gICAgICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLSAgICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotCSAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw7Ci0JICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOwotCSAgcHJlX2luYyA9IDE7IAotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoaGFsZndvcmQpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLSAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTsKLSAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAgLyogUEMgcmVsIGFkanVzdCAqLwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUkVHX1BDIDw8IDE2KTsKLSAgICAgIHByZV9pbmMgPSAxOwotICAgIH0KLSAgICAKLSAgaWYgKHByZV9pbmMgJiYgKGZsYWdzICYgVFJBTlNfQklUKSkKLSAgICBpbnN0LmVycm9yID0gXygiUHJlLWluY3JlbWVudCBpbnN0cnVjdGlvbiB3aXRoIHRyYW5zbGF0ZSIpOwotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCAocHJlX2luYyA/IFBSRV9JTkRFWCA6IDApOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZwotcmVnX2xpc3QgKHN0cnApCi0gICAgIGNoYXIgKiogc3RycDsKLXsKLSAgY2hhciAqIHN0ciA9ICpzdHJwOwotICBsb25nICAgcmFuZ2UgPSAwOwotICBpbnQgICAgYW5vdGhlcl9yYW5nZTsKLQotICAvKiBXZSBjb21lIGJhY2sgaGVyZSBpZiB3ZSBnZXQgcmFuZ2VzIGNvbmNhdGVuYXRlZCBieSAnKycgb3IgJ3wnICovCi0gIGRvCi0gICAgewotICAgICAgYW5vdGhlcl9yYW5nZSA9IDA7Ci0KLSAgICAgIGlmICgqc3RyID09ICd7JykKLQl7Ci0JICBpbnQgaW5fcmFuZ2UgPSAwOwotCSAgaW50IGN1cl9yZWcgPSAtMTsKLSAgICAgIAotCSAgc3RyKys7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaW50IHJlZzsKLQkgICAgCi0JICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCQlzdHIrKzsKLQotCSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAtMSkpID09IEZBSUwpCi0JCXJldHVybiBGQUlMOwotCSAgICAgIAotCSAgICAgIGlmIChpbl9yYW5nZSkKLQkJewotCQkgIGludCBpOwotCSAgICAgIAotCQkgIGlmIChyZWcgPD0gY3VyX3JlZykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkJhZCByYW5nZSBpbiByZWdpc3RlciBsaXN0Iik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotCi0JCSAgZm9yIChpID0gY3VyX3JlZyArIDE7IGkgPCByZWc7IGkrKykKLQkJICAgIHsKLQkJICAgICAgaWYgKHJhbmdlICYgKDEgPDwgaSkpCi0JCQlhc190c2t0c2sgCi0JCQkgIChfKCJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiKSwKLQkJCSAgIGkpOwotCQkgICAgICBlbHNlCi0JCQlyYW5nZSB8PSAxIDw8IGk7Ci0JCSAgICB9Ci0JCSAgaW5fcmFuZ2UgPSAwOwotCQl9Ci0KLQkgICAgICBpZiAocmFuZ2UgJiAoMSA8PCByZWcpKQotCQlhc190c2t0c2sgKF8oIldhcm5pbmc6IER1cGxpY2F0ZWQgcmVnaXN0ZXIgKHIlZCkgaW4gcmVnaXN0ZXIgbGlzdCIpLAotCQkJICAgcmVnKTsKLQkgICAgICBlbHNlIGlmIChyZWcgPD0gY3VyX3JlZykKLQkJYXNfdHNrdHNrIChfKCJXYXJuaW5nOiBSZWdpc3RlciByYW5nZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIikpOwotCi0JICAgICAgcmFuZ2UgfD0gMSA8PCByZWc7Ci0JICAgICAgY3VyX3JlZyA9IHJlZzsKLQkgICAgfSB3aGlsZSAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMCi0JCSAgICAgfHwgKGluX3JhbmdlID0gMSwgKnN0cisrID09ICctJykpOwotCSAgc3RyLS07Ci0JICB3aGlsZSAoKnN0ciA9PSAnICcpCi0JICAgIHN0cisrOwotCi0JICBpZiAoKnN0cisrICE9ICd9JykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJNaXNzaW5nIGB9JyIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cHI7Ci0KLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsICZzdHIpKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgaWYgKGV4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKGV4cHIuWF9hZGRfbnVtYmVyIAotCQkgICE9IChleHByLlhfYWRkX251bWJlciAmIDB4MDAwMGZmZmYpKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbWFzayIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBpZiAoKHJhbmdlICYgZXhwci5YX2FkZF9udW1iZXIpICE9IDApCi0JCXsKLQkJICBpbnQgcmVnbm8gPSByYW5nZSAmIGV4cHIuWF9hZGRfbnVtYmVyOwotCi0JCSAgcmVnbm8gJj0gLXJlZ25vOwotCQkgIHJlZ25vID0gKDEgPDwgcmVnbm8pIC0gMTsKLQkJICBhc190c2t0c2sgCi0JCSAgICAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCi0JCSAgICAgcmVnbm8pOwotCQl9Ci0KLQkgICAgICByYW5nZSB8PSBleHByLlhfYWRkX251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGluc3QucmVsb2MudHlwZSAhPSAwKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgbWVtY3B5ICgmaW5zdC5yZWxvYy5leHAsICZleHByLCBzaXplb2YgKGV4cHJlc3Npb25TKSk7Ci0JICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9NVUxUSTsKLQkgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLQlzdHIrKzsKLQotICAgICAgaWYgKCpzdHIgPT0gJ3wnIHx8ICpzdHIgPT0gJysnKQotCXsKLQkgIHN0cisrOwotCSAgYW5vdGhlcl9yYW5nZSA9IDE7Ci0JfQotICAgIH0gd2hpbGUgKGFub3RoZXJfcmFuZ2UpOwotCi0gICpzdHJwID0gc3RyOwotICByZXR1cm4gcmFuZ2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19sZG1zdG0gKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgYmFzZV9yZWc7Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgoYmFzZV9yZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAoYmFzZV9yZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0gIGlmICgqc3RyID09ICchJykKLSAgICB7Ci0gICAgICBmbGFncyB8PSBXUklURV9CQUNLOwotICAgICAgc3RyKys7Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzdHIgPT0gJ14nKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgICAgZmxhZ3MgfD0gTVVMVElfU0VUX1BTUjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFncyB8IHJhbmdlOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fc3dpIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotICAKLSAgLyogQWxsb3cgb3B0aW9uYWwgbGVhZGluZyAnIycuICAqLwotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgc3RyKys7Ci0KLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCAmIHN0cikpCi0gICAgcmV0dXJuOwotCi0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU1dJOwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIAotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3N3YXAgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmVnOwotICAKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8ICpzdHIrKyAhPSAnWycpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAocmVnID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKCpzdHIrKyAhPSAnXScpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm1pc3NpbmcgXSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYnJhbmNoIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgCi0jaWZkZWYgT0JKX0VMRgotICB7Ci0gICAgY2hhciAqIHNhdmVfaW47Ci0gIAotICAgIC8qIFNjb3R0QjogRmVicnVhcnkgNSwgMTk5OCAqLwotICAgIC8qIENoZWNrIHRvIHNlZSBvZiBQTFQzMiByZWxvYyByZXF1aXJlZCBmb3IgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAKLSAgICAvKiBhcm1fcGFyc2VfcmVsb2MoKSB3b3JrcyBvbiBpbnB1dF9saW5lX3BvaW50ZXIuCi0gICAgICAgV2UgYWN0dWFsbHkgd2FudCB0byBwYXJzZSB0aGUgb3BlcmFuZHMgdG8gdGhlIGJyYW5jaCBpbnN0cnVjdGlvbgotICAgICAgIHBhc3NlZCBpbiAnc3RyJy4gIFNhdmUgdGhlIGlucHV0IHBvaW50ZXIgYW5kIHJlc3RvcmUgaXQgbGF0ZXIuICAqLwotICAgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fc3ltYm9sCi0JJiYgKnN0ciA9PSAnKCcKLQkmJiBhcm1fcGFyc2VfcmVsb2MgKCkgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMikKLSAgICAgIHsKLQlpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fUExUMzI7Ci0JaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCS8qIE1vZGlmeSBzdHIgdG8gcG9pbnQgdG8gYWZ0ZXIgcGFyc2VkIG9wZXJhbmRzLCBvdGhlcndpc2UKLQkgICBlbmRfb2ZfbGluZSgpIHdpbGwgY29tcGxhaW4gYWJvdXQgdGhlIChQTFQpIGxlZnQgaW4gc3RyLiAgKi8KLQlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g7Ci0JaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgfQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIH0KLSNlbHNlCi0gIGluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSNlbmRpZiAvKiBPQkpfRUxGICovCi0gIAotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYnggKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmVnOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgYXNfdHNrdHNrIChfKCJVc2Ugb2YgcjE1IGluIGJ4IGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIikpOwotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jZHAgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBDby1wcm9jZXNzb3IgZGF0YSBvcGVyYXRpb24uCi0gICAgIEZvcm1hdDogQ0RQe2NvbmR9IENQIyw8ZXhwcj4sQ1JkLENSbixDUm17LDxleHByPn0gICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoY29fcHJvY19udW1iZXIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3Bfb3BjX2V4cHIgKCZzdHIsIDIwLDQpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQotICAgIHsKLSAgICAgIGlmIChjcF9vcGNfZXhwciAoJnN0ciwgNSwgMykgPT0gRkFJTCkKLQl7Ci0JICBpZiAoIWluc3QuZXJyb3IpCi0JICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19sc3RjIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGxvYWQvc3RvcmUuCi0gICAgIEZvcm1hdDogPExEQ3xTVEN7Y29uZH1bTF0gQ1AjLENSZCw8YWRkcmVzcz4gICovCi0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChjb19wcm9jX251bWJlciAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY29fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIHRyYW5zZmVyLgotICAgICBGb3JtYXQ6IDxNQ1J8TVJDPntjb25kfSBDUCMsPGV4cHIxPixSZCxDUm4sQ1Jteyw8ZXhwcjI+fSAgKi8KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKGNvX3Byb2NfbnVtYmVyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX29wY19leHByICgmc3RyLCAyMSwgMykgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IFNVQ0NFU1MpCi0gICAgewotICAgICAgaWYgKGNwX29wY19leHByICgmc3RyLCA1LCAzKSA9PSBGQUlMKQotCXsKLQkgIGlmICghaW5zdC5lcnJvcikKLQkgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2N0cmwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBGUCBjb250cm9sIHJlZ2lzdGVycy4KLSAgICAgRm9ybWF0OiA8V0ZTfFJGU3xXRkN8UkZDPntjb25kfSBSbiAgKi8KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfbGRzdCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBzd2l0Y2ggKGluc3Quc3VmZml4KQotICAgIHsKLSAgICBjYXNlIFNVRkZfUzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9EOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX1A6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWCB8IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9sZG1zdG0gKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgbnVtX3JlZ3M7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEdldCBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHRyYW5zZmVyICovCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgdmFsdWUgcmVxdWlyZWQgZm9yIG51bWJlciBvZiByZWdpc3RlcnMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbnVtX3JlZ3MgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKG51bV9yZWdzIDwgMSB8fCBudW1fcmVncyA+IDQpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm51bWJlciBvZiByZWdpc3RlcnMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzE6NF0iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW1fcmVncykKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZIHwgQ1BfVF9YOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaW50IHJlZzsKLSAgICAgIGludCB3cml0ZV9iYWNrOwotICAgICAgaW50IG9mZnNldDsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCAiZWEiIG9yICJmZCIsIHNvIHdlIGNhbiBvbmx5IGFjY2VwdAotCSBbUm5deyF9LiAgVGhlIGluc3RydWN0aW9uIGRvZXMgbm90IHJlYWxseSBzdXBwb3J0IHN0YWNraW5nIG9yCi0JIHVuc3RhY2tpbmcsIHNvIHdlIGhhdmUgdG8gZW11bGF0ZSB0aGVzZSBieSBzZXR0aW5nIGFwcHJvcHJpYXRlCi0JIGJpdHMgYW5kIG9mZnNldHMuICAqLwotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotCSAgfHwgKnN0ciAhPSAnWycpCi0JewotCSAgaWYgKCEgaW5zdC5lcnJvcikKLQkgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgc3RyKys7Ci0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLQlzdHIrKzsKLQotICAgICAgaWYgKCpzdHIgIT0gJ10nKQotCXsKLQkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIHN0cisrOwotICAgICAgaWYgKCpzdHIgPT0gJyEnKQotCXsKLQkgIHdyaXRlX2JhY2sgPSAxOwotCSAgc3RyKys7Ci0JICBpZiAocmVnID09IFJFR19QQykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJSMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciB3aXRoIHdyaXRlLWJhY2siKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0Jd3JpdGVfYmFjayA9IDA7Ci0KLSAgICAgIGlmIChmbGFncyAmIENQX1RfUHJlKQotCXsKLQkgIC8qIFByZS1kZWNyZW1lbnQgKi8KLQkgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKLQkgIGlmICh3cml0ZV9iYWNrKQotCSAgICBmbGFncyB8PSBDUF9UX1dCOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQb3N0LWluY3JlbWVudCAqLwotCSAgaWYgKHdyaXRlX2JhY2spCi0JICAgIHsKLQkgICAgICBmbGFncyB8PSBDUF9UX1dCOwotCSAgICAgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm8gd3JpdGUtYmFjaywgc28gY29udmVydCB0aGlzIGludG8gYSBzdGFuZGFyZCBwcmUtaW5jcmVtZW50Ci0JCSBpbnN0cnVjdGlvbiAtLSBhZXN0aGV0aWNhbGx5IG1vcmUgcGxlYXNpbmcuICAqLwotCSAgICAgIGZsYWdzID0gQ1BfVF9QcmUgfCBDUF9UX1VEOwotCSAgICAgIG9mZnNldCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCBvZmZzZXQ7Ci0gICAgfQotICBlbHNlIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLQkgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfZHlhZGljIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBmcF9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9tb25hZGljIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfY21wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2Zyb21fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfdG9fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBUaHVtYiBzcGVjaWZpYyByb3V0aW5lcyAqLwotCi0vKiBQYXJzZSBhbmQgdmFsaWRhdGUgdGhhdCBhIHJlZ2lzdGVyIGlzIG9mIHRoZSByaWdodCBmb3JtLCB0aGlzIHNhdmVzCi0gICByZXBlYXRlZCBjaGVja2luZyBvZiB0aGlzIGluZm9ybWF0aW9uIGluIG1hbnkgc2ltaWxhciBjYXNlcy4gCi0gICBVbmxpa2UgdGhlIDMyLWJpdCBjYXNlIHdlIGRvIG5vdCBpbnNlcnQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIG9wY29kZSAKLSAgIGhlcmUsIHNpbmNlIHRoZSBwb3NpdGlvbiBpcyBvZnRlbiB1bmtub3duIHVudGlsIHRoZSBmdWxsIGluc3RydWN0aW9uIAotICAgaGFzIGJlZW4gcGFyc2VkLiAgKi8KLXN0YXRpYyBpbnQKLXRodW1iX3JlZyAoc3RycCwgaGlfbG8pCi0gICAgIGNoYXIgKiogc3RycDsKLSAgICAgaW50ICAgICBoaV9sbzsKLXsKLSAgaW50IHJlZzsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlIChzdHJwLCAtMSkpID09IEZBSUwpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgc3dpdGNoIChoaV9sbykKLSAgICB7Ci0gICAgY2FzZSBUSFVNQl9SRUdfTE86Ci0gICAgICBpZiAocmVnID4gNykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygibG8gcmVnaXN0ZXIgcmVxdWlyZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUSFVNQl9SRUdfSEk6Ci0gICAgICBpZiAocmVnIDwgOCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiaGkgcmVnaXN0ZXIgcmVxdWlyZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVnOwotfQotCi0vKiBQYXJzZSBhbiBhZGQgb3Igc3VidHJhY3QgaW5zdHJ1Y3Rpb24sIFNVQlRSQUNUIGlzIG5vbi16ZXJvIGlmIHRoZSBvcGNvZGUKLSAgIHdhcyBTVUIuICAqLwotc3RhdGljIHZvaWQKLXRodW1iX2FkZF9zdWIgKHN0ciwgc3VidHJhY3QpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBzdWJ0cmFjdDsKLXsKLSAgaW50IFJkLCBScywgUm4gPSBGQUlMOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgewotICAgICAgUnMgPSBSZDsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgLyogVHdvIG9wZXJhbmQgZm9ybWF0LCBzaHVmZmxlIHRoZSByZWdpc3RlcnMgYW5kIHByZXRlbmQgdGhlcmUgCi0JICAgICBhcmUgMyAqLwotCSAgUm4gPSBSczsKLQkgIFJzID0gUmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JewotCSAgc3RyKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogV2Ugbm93IGhhdmUgUmQgYW5kIFJzIHNldCB0byByZWdpc3RlcnMsIGFuZCBSbiBzZXQgdG8gYSByZWdpc3RlciBvciBGQUlMOwotICAgICBmb3IgdGhlIGxhdHRlciBjYXNlLCBFWFBSIGNvbnRhaW5zIHRoZSBpbW1lZGlhdGUgdGhhdCB3YXMgZm91bmQuICovCi0gIGlmIChSbiAhPSBGQUlMKQotICAgIHsKLSAgICAgIC8qIEFsbCByZWdpc3RlciBmb3JtYXQuICAqLwotICAgICAgaWYgKFJkID4gNyB8fCBScyA+IDcgfHwgUm4gPiA3KQotCXsKLQkgIGlmIChScyAhPSBSZCkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJkZXN0IGFuZCBzb3VyY2UxIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgLyogQ2FuJ3QgZG8gdGhpcyBmb3IgU1VCICovCi0JICBpZiAoc3VidHJhY3QpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygic3VidHJhY3QgdmFsaWQgb25seSBvbiBsbyByZWdzIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSAoVF9PUENPREVfQUREX0hJCi0JCQkgICAgICB8IChSZCA+IDcgPyBUSFVNQl9IMSA6IDApCi0JCQkgICAgICB8IChSbiA+IDcgPyBUSFVNQl9IMiA6IDApKTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJkICYgNykgfCAoKFJuICYgNykgPDwgMyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9SMyA6IFRfT1BDT0RFX0FERF9SMzsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMykgfCAoUm4gPDwgNik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uLCBub3cgdGhpbmdzIHN0YXJ0IHRvIGdldCBuYXN0eS4gICovCi0KLSAgICAgIC8qIEZpcnN0IGRlYWwgd2l0aCBISSByZWdzLCBvbmx5IHZlcnkgcmVzdHJpY3RlZCBjYXNlcyBhbGxvd2VkOgotCSBBZGp1c3RpbmcgU1AsIGFuZCB1c2luZyBQQyBvciBTUCB0byBnZXQgYW4gYWRkcmVzcy4gICovCi0gICAgICBpZiAoKFJkID4gNyAmJiAoUmQgIT0gUkVHX1NQIHx8IFJzICE9IFJFR19TUCkpCi0JICB8fCAoUnMgPiA3ICYmIFJzICE9IFJFR19TUCAmJiBScyAhPSBSRUdfUEMpKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIEhpIHJlZ2lzdGVyIHdpdGggaW1tZWRpYXRlIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgYWxsIHdlIGNhbiBkbyBpcyBzdG9yZSBhbGwgdGhlIGZyYWdtZW50cwotCSAgICAgd2Uga25vdyBhYm91dCBpbiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGxldCB0aGUgcmVsb2MgaGFja2luZyAKLQkgICAgIHdvcmsgaXQgYWxsIG91dC4gICovCi0JICBpbnN0Lmluc3RydWN0aW9uID0gKHN1YnRyYWN0ID8gMHg4MDAwIDogMCkgfCAoUmQgPDwgNCkgfCBSczsKLQkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICBpZiAoc3VidHJhY3QpCi0JICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0KLQkgIGlmIChvZmZzZXQgPCAwKQotCSAgICB7Ci0JICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLQkgICAgICBzdWJ0cmFjdCA9IDE7Ci0KLQkgICAgICAvKiBRdWljayBjaGVjaywgaW4gY2FzZSBvZmZzZXQgaXMgTUlOX0lOVCAqLwotCSAgICAgIGlmIChvZmZzZXQgPCAwKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBzdWJ0cmFjdCA9IDA7Ci0KLQkgIGlmIChSZCA9PSBSRUdfU1ApCi0JICAgIHsKLQkgICAgICBpZiAob2Zmc2V0ICYgfjB4MWZjKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIHZhbHVlIGZvciBzdGFjayBhZGp1c3QiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfU1QgOiBUX09QQ09ERV9BRERfU1Q7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBvZmZzZXQgPj4gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAoUnMgPT0gUkVHX1BDIHx8IFJzID09IFJFR19TUCkKLQkgICAgewotCSAgICAgIGlmIChzdWJ0cmFjdAotCQkgIHx8IChvZmZzZXQgJiB+MHgzZmMpKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IChScyA9PSBSRUdfUEMgPyBUX09QQ09ERV9BRERfUEMKLQkJCQkgIDogVF9PUENPREVfQUREX1NQKTsKLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSZCA8PCA4KSB8IChvZmZzZXQgPj4gMik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKFJzID09IFJkKQotCSAgICB7Ci0JICAgICAgaWYgKG9mZnNldCAmIH4weGZmKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTggOiBUX09QQ09ERV9BRERfSTg7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgPDwgOCkgfCBvZmZzZXQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgJiB+MHg3KQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTMgOiBUX09QQ09ERV9BRERfSTM7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKSB8IChvZmZzZXQgPDwgNik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXRodW1iX3NoaWZ0IChzdHIsIHNoaWZ0KQotICAgICBjaGFyICogc3RyOwotICAgICBpbnQgICAgc2hpZnQ7Ci17Ci0gIGludCBSZCwgUnMsIFJuID0gRkFJTDsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgewotICAgICAgLyogVHdvIG9wZXJhbmQgaW1tZWRpYXRlIGZvcm1hdCwgc2V0IFJzIHRvIFJkLiAgKi8KLSAgICAgIFJzID0gUmQ7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChScyA9ICB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCXsKLQkgIC8qIFR3byBvcGVyYW5kIGZvcm1hdCwgc2h1ZmZsZSB0aGUgcmVnaXN0ZXJzIGFuZCBwcmV0ZW5kIHRoZXJlCi0JICAgICBhcmUgMyAqLwotCSAgUm4gPSBSczsKLQkgIFJzID0gUmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JewotCSAgc3RyKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0JcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBub3cgaGF2ZSBSZCBhbmQgUnMgc2V0IHRvIHJlZ2lzdGVycywgYW5kIFJuIHNldCB0byBhIHJlZ2lzdGVyIG9yIEZBSUw7Ci0gICAgIGZvciB0aGUgbGF0dGVyIGNhc2UsIEVYUFIgY29udGFpbnMgdGhlIGltbWVkaWF0ZSB0aGF0IHdhcyBmb3VuZC4gKi8KLQotICBpZiAoUm4gIT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoUnMgIT0gUmQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oInNvdXJjZTEgYW5kIGRlc3QgbXVzdCBiZSBzYW1lIHJlZ2lzdGVyIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBzd2l0Y2ggKHNoaWZ0KQotCXsKLQljYXNlIFRIVU1CX0FTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0FTUl9SOyBicmVhazsKLQljYXNlIFRIVU1CX0xTTDogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTTF9SOyBicmVhazsKLQljYXNlIFRIVU1CX0xTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTUl9SOyBicmVhazsKLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUm4gPDwgMyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzaGlmdCkKLQl7Ci0JY2FzZSBUSFVNQl9BU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9BU1JfSTsgYnJlYWs7Ci0JY2FzZSBUSFVNQl9MU0w6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfSTsgYnJlYWs7Ci0JY2FzZSBUSFVNQl9MU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU1JfSTsgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgY3JlYXRlIGEgZHVtbXkgcmVsb2MgYW5kIGxldCByZWxvYwotCSAgICAgaGFja2luZyBmaXggaXQgdXAgKi8KLQotCSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgc2hpZnRfdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChzaGlmdF92YWx1ZSA+IDMyIHx8IChzaGlmdF92YWx1ZSA9PSAzMiAmJiBzaGlmdCA9PSBUSFVNQl9MU0wpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgaW1tZWRpYXRlIGZvciBzaGlmdCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICAvKiBTaGlmdHMgb2YgemVybyBhcmUgaGFuZGxlZCBieSBjb252ZXJ0aW5nIHRvIExTTCAqLwotCSAgaWYgKHNoaWZ0X3ZhbHVlID09IDApCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfSTsKLQotCSAgLyogU2hpZnRzIG9mIDMyIGFyZSBlbmNvZGVkIGFzIGEgc2hpZnQgb2YgemVybyAqLwotCSAgaWYgKHNoaWZ0X3ZhbHVlID09IDMyKQotCSAgICBzaGlmdF92YWx1ZSA9IDA7Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hpZnRfdmFsdWUgPDwgNjsKLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7Ci0gICAgfQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXRodW1iX21vdl9jb21wYXJlIChzdHIsIG1vdmUpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBtb3ZlOwotewotICBpbnQgUmQsIFJzID0gRkFJTDsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKChScyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChScyAhPSBGQUlMKQotICAgIHsKLSAgICAgIGlmIChScyA8IDggJiYgUmQgPCA4KQotCXsKLQkgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JICAgIC8qIEEgbW92ZSBvZiB0d28gbG93cmVncyBpcyBlbmNvZGVkIGFzIEFERCBSZCwgUnMsICMwCi0JICAgICAgIHNpbmNlIGEgTU9WIGluc3RydWN0aW9uIHByb2R1Y2VzIHVucHJlZGljdGFibGUgcmVzdWx0cyAqLwotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQUREX0kzOwotCSAgZWxzZQotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0xSOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG1vdmUgPT0gVEhVTUJfTU9WRSkKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9IUjsKLQkgIGVsc2UKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0NNUF9IUjsKLQotCSAgaWYgKFJkID4gNykKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMTsKLQotCSAgaWYgKFJzID4gNykKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMjsKLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgJiA3KSB8ICgoUnMgJiA3KSA8PCAzKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKFJkID4gNykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygib25seSBsbyByZWdzIGFsbG93ZWQgd2l0aCBpbW1lZGlhdGUiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9JODsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0k4OwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9JTU07Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmICh2YWx1ZSA+IDI1NSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIGltbWVkaWF0ZSIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHZhbHVlOwotCX0KLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHVtYl9sb2FkX3N0b3JlIChzdHIsIGxvYWRfc3RvcmUsIHNpemUpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBsb2FkX3N0b3JlOwotICAgICBpbnQgICAgc2l6ZTsKLXsKLSAgaW50IFJkLCBSYiwgUm8gPSBGQUlMOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3RyID09ICdbJykKLSAgICB7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmICgoUmIgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTCkKLQl7Ci0JICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JICAgIHsKLQkgICAgICBzdHIrKzsKLQkgICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JCXJldHVybjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKFJvID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotCSAgICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QucmVsb2MuZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyID0gMDsKLQl9Ci0KLSAgICAgIGlmICgqc3RyICE9ICddJykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiZXhwZWN0ZWQgJ10nIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc3RyKys7Ci0gICAgfQotICBlbHNlIGlmICgqc3RyID09ICc9JykKLSAgICB7Ci0gICAgICAvKiBQYXJzZSBhbiAibGRyIFJkLCA9ZXhwciIgaW5zdHJ1Y3Rpb247IHRoaXMgaXMgYW5vdGhlciBwc2V1ZG8gb3AgKi8KLSAgICAgIHN0cisrOwotCi0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotCXJldHVybjsKLQotICAgICAgZW5kX29mX2xpbmUgKHN0cik7Ci0gICAgICAKLSAgICAgIGlmICggICBpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkgICYmIGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgaW5zdC5lcnJvciA9ICJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIjsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkgICYmICgoaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyICYgfjB4RkYpID09IDApKQotCXsKLQkgIC8qIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIG1vdiBpbnN0cnVjdGlvbiAqLwotCi0JICBpbnN0Lmluc3RydWN0aW9uICA9IFRfT1BDT0RFX01PVl9JOCB8IChSZCA8PCA4KTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCSAgcmV0dXJuOyAKLQl9Ci0KLSAgICAgIC8qIEluc2VydCBpbnRvIGxpdGVyYWwgcG9vbCAqLyAgICAgCi0gICAgICBpZiAoYWRkX3RvX2xpdF9wb29sICgpID09IEZBSUwpCi0JewotCSAgaWYgKCFpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gImxpdGVyYWwgcG9vbCBpbnNlcnRpb24gZmFpbGVkIjsgCi0JICByZXR1cm47Ci0JfQotCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiAgPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgKz0gNDsgLyogQWRqdXN0IEFSTSBwaXBlbGluZSBvZmZzZXQgdG8gVGh1bWIgKi8KLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7Ci0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gNDsgLyogUGlwZWxpbmUgb2Zmc2V0ICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICAgIGVuZF9vZl9saW5lIChzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoUmIgPT0gUkVHX1BDIHx8IFJiID09IFJFR19TUCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZSAhPSBUSFVNQl9XT1JEKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJieXRlIG9yIGhhbGZ3b3JkIG5vdCB2YWxpZCBmb3IgYmFzZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKFJiID09IFJFR19QQyAmJiBsb2FkX3N0b3JlICE9IFRIVU1CX0xPQUQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIlIxNSBiYXNlZCBzdG9yZSBub3QgYWxsb3dlZCIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKFJvICE9IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgYmFzZSByZWdpc3RlciBmb3IgcmVnaXN0ZXIgb2Zmc2V0Iik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoUmIgPT0gUkVHX1BDKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEM7Ci0gICAgICBlbHNlIGlmIChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xEUl9TUDsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfU1RSX1NQOwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7Ci0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHVuc2lnbmVkIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKG9mZnNldCAmIH4weDNmYykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIG9mZnNldCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IG9mZnNldCA+PiAyOwotCX0KLSAgICAgIGVsc2UKLQlpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICB9Ci0gIGVsc2UgaWYgKFJiID4gNykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBiYXNlIHJlZ2lzdGVyIGluIGxvYWQvc3RvcmUiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKFJvID09IEZBSUwpCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIG9mZnNldCAqLwotICAgICAgaWYgKHNpemUgPT0gVEhVTUJfV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX0lXIDogVF9PUENPREVfU1RSX0lXKTsKLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gVEhVTUJfSEFMRldPUkQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JSCA6IFRfT1BDT0RFX1NUUl9JSCk7Ci0gICAgICBlbHNlCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JQiA6IFRfT1BDT0RFX1NUUl9JQik7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMyk7Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgdW5zaWduZWQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCSAgCi0JICBpZiAob2Zmc2V0ICYgfigweDFmIDw8IHNpemUpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgb2Zmc2V0Iik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChvZmZzZXQgPj4gc2l6ZSkgPDwgNjsKLQl9Ci0gICAgICBlbHNlCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0ICovCi0gICAgICBpZiAoc2l6ZSA9PSBUSFVNQl9XT1JEKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfUlcgOiBUX09QQ09ERV9TVFJfUlcpOwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSBUSFVNQl9IQUxGV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JIIDogVF9PUENPREVfU1RSX1JIKTsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JCIDogVF9PUENPREVfU1RSX1JCKTsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChSYiA8PCAzKSB8IChSbyA8PCA2KTsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X25vcCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICAvKiBEbyBub3RoaW5nICovCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIEhhbmRsZSB0aGUgRm9ybWF0IDQgaW5zdHJ1Y3Rpb25zIHRoYXQgZG8gbm90IGhhdmUgZXF1aXZhbGVudHMgaW4gb3RoZXIgCi0gICBmb3JtYXRzLiAgVGhhdCBpcywgQURDLCBBTkQsIEVPUiwgU0JDLCBST1IsIFRTVCwgTkVHLCBDTU4sIE9SUiwgTVVMLAotICAgQklDIGFuZCBNVk4uICAqLwotc3RhdGljIHZvaWQKLWRvX3RfYXJpdCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpbnQgUmQsIFJzLCBSbjsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMKQotICAgIHsKLSAgICAgIC8qIFRocmVlIG9wZXJhbmQgZm9ybWF0IG5vdCBhbGxvd2VkIGZvciBUU1QsIENNTiwgTkVHIGFuZCBNVk4uCi0JIChJdCBpc24ndCBhbGxvd2VkIGZvciBDTVAgZWl0aGVyLCBidXQgdGhhdCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMKLQkgZnVuY3Rpb24uKSAgKi8KLSAgICAgIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX1RTVAotCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9DTU4KLQkgIHx8IGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfTkVHCi0gCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9NVk4pCi0JewotCSAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKChSbiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChScyAhPSBSZCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiZGVzdCBhbmQgc291cmNlMSBvbmUgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIFJzID0gUm47Ci0gICAgfQotCi0gIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX01VTAotICAgICAgJiYgUnMgPT0gUmQpCi0gICAgYXNfdHNrdHNrIChfKCJScyBhbmQgUmQgbXVzdCBiZSBkaWZmZXJlbnQgaW4gTVVMIikpOwotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9hZGQgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfYWRkX3N1YiAoc3RyLCAwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYXNyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0FTUik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDkgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDEyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotLyogRmluZCB0aGUgcmVhbCwgVGh1bWIgZW5jb2RlZCBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIHN5bWJvbFMgKgotZmluZF9yZWFsX3N0YXJ0IChzeW1ib2xQKQotICAgICBzeW1ib2xTICogc3ltYm9sUDsKLXsKLSAgY2hhciAqICAgICAgIHJlYWxfc3RhcnQ7Ci0gIGNvbnN0IGNoYXIgKiBuYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gIHN5bWJvbFMgKiAgICBuZXdfdGFyZ2V0OwotCi0gIC8qIFRoaXMgZGVmaW5pdG9ubXVzdCBhZ3JlZSB3aXRoIHRoZSBvbmUgaW4gZ2NjL2NvbmZpZy9hcm0vdGh1bWIuYyAqLwotI2RlZmluZSBTVFVCX05BTUUgIi5yZWFsX3N0YXJ0X29mIgotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgYWJvcnQoKTsKLQotICAvKiBOYW1lcyB0aGF0IHN0YXJ0IHdpdGggJy4nIGFyZSBsb2NhbCBsYWJlbHMsIG5vdCBmdW5jdGlvbiBlbnRyeSBwb2ludHMuCi0gICAgIFRoZSBjb21waWxlciBtYXkgZ2VuZXJhdGUgQkwgaW5zdHJ1Y3Rpb25zIHRvIHRoZXNlIGxhYmVscyBiZWNhdXNlIGl0Ci0gICAgIG5lZWRzIHRvIHBlcmZvcm0gYSBicmFuY2ggdG8gYSBmYXIgYXdheSBsb2NhdGlvbi4gICovCi0gIGlmIChuYW1lWzBdID09ICcuJykKLSAgICByZXR1cm4gc3ltYm9sUDsKLSAgCi0gIHJlYWxfc3RhcnQgPSBtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFNUVUJfTkFNRSkgKyAxKTsKLSAgc3ByaW50ZiAocmVhbF9zdGFydCwgIiVzJXMiLCBTVFVCX05BTUUsIG5hbWUpOwotCi0gIG5ld190YXJnZXQgPSBzeW1ib2xfZmluZCAocmVhbF9zdGFydCk7Ci0gIAotICBpZiAobmV3X3RhcmdldCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKCJGYWlsZWQgdG8gZmluZCByZWFsIHN0YXJ0IG9mIGZ1bmN0aW9uOiAlc1xuIiwgbmFtZSk7Ci0gICAgICBuZXdfdGFyZ2V0ID0gc3ltYm9sUDsKLSAgICB9Ci0KLSAgZnJlZSAocmVhbF9zdGFydCk7Ci0KLSAgcmV0dXJuIG5ld190YXJnZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRvX3RfYnJhbmNoMjMgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0KLSAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggaXMgYSBkZWZpbmVkIHN5bWJvbCB3aGljaCBkb2VzIG5vdCBoYXZlCi0gICAgIHRoZSBUSFVNQl9GVU5DIGF0dHJpYnV0ZSwgdGhlbiB3ZSBtdXN0IGJlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aGljaCBoYXMKLSAgICAgdGhlIChpbnRlcmZhY2Vhcm0pIGF0dHJpYnV0ZS4gIFdlIGxvb2sgZm9yIHRoZSBUaHVtYiBlbnRyeSBwb2ludCB0byB0aGF0Ci0gICAgIGZ1bmN0aW9uIGFuZCBjaGFuZ2UgdGhlIGJyYW5jaCB0byByZWZlciB0byB0aGF0IGZ1bmN0aW9uIGluc3RlYWQuICAqLwotICBpZiAoICAgaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX3N5bWJvbAotICAgICAgJiYgaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sICE9IE5VTEwKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQotICAgICAgJiYgISBUSFVNQl9JU19GVU5DIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wpKQotICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCA9IGZpbmRfcmVhbF9zdGFydCAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYnggKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaW50IHJlZzsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZWcgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICAvKiBUaGlzIHNldHMgVEhVTUJfSDIgZnJvbSB0aGUgdG9wIGJpdCBvZiByZWcuICAqLwotICBpbnN0Lmluc3RydWN0aW9uIHw9IHJlZyA8PCAzOwotCi0gIC8qID8/PyBGSVhNRTogU2hvdWxkIGFkZCBhIGhhY2t5IHJlbG9jIGhlcmUgaWYgcmVnIGlzIFJFR19QQy4gIFRoZSByZWxvYwotICAgICBzaG91bGQgY2F1c2UgdGhlIGFsaWdubWVudCB0byBiZSBjaGVja2VkIG9uY2UgaXQgaXMga25vd24uICBUaGlzIGlzCi0gICAgIGJlY2F1c2UgQlggUEMgb25seSB3b3JrcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgd29yZCBhbGlnbmVkLiAgKi8KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfY29tcGFyZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBUSFVNQl9DT01QQVJFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRtc3RtIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCBSYjsKLSAgbG9uZyByYW5nZTsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSYiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCpzdHIgIT0gJyEnKQotICAgIGFzX3dhcm4gKF8oIkluc2VydGVkIG1pc3NpbmcgJyEnOiBsb2FkL3N0b3JlIG11bHRpcGxlIGFsd2F5cyB3cml0ZXMgYmFjayBiYXNlIHJlZ2lzdGVyIikpOwotICBlbHNlCi0gICAgc3RyKys7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJhbmdlID0gcmVnX2xpc3QgKCZzdHIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5zdC5yZWxvYy50eXBlICE9IEJGRF9SRUxPQ19OT05FKQotICAgIHsKLSAgICAgIC8qIFRoaXMgcmVhbGx5IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdC4gKi8KLSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgaW5zdC5lcnJvciA9IF8oIkV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJhbmdlICYgfjB4ZmYpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm9ubHkgbG8tcmVncyB2YWxpZCBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJiIDw8IDgpIHwgcmFuZ2U7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9MT0FELCBUSFVNQl9XT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyYiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX0xPQUQsIFRIVU1CX0JZVEUpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHJoIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX2xvYWRfc3RvcmUgKHN0ciwgVEhVTUJfTE9BRCwgVEhVTUJfSEFMRldPUkQpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHMgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaW50IFJkLCBSYiwgUm87Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKnN0cisrICE9ICdbJwotICAgICAgfHwgKFJiID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChSbyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgKnN0cisrICE9ICddJykKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBfKCJTeW50YXg6IGxkcnNbYl0gUmQsIFtSYiwgUm9dIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMykgfCAoUm8gPDwgNik7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sc2wgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfc2hpZnQgKHN0ciwgVEhVTUJfTFNMKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbHNyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0xTUik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X21vdiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBUSFVNQl9NT1ZFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfcHVzaF9wb3AgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgbG9uZyByYW5nZTsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHJlYWxseSBkb2Vzbid0IHNlZW0gd29ydGggaXQuICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJFeHByZXNzaW9uIHRvbyBjb21wbGV4Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyYW5nZSAmIH4weGZmKQotICAgIHsKLSAgICAgIGlmICgoaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9QVVNICi0JICAgJiYgKHJhbmdlICYgfjB4ZmYpID09IDEgPDwgUkVHX0xSKQotCSAgfHwgKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfUE9QCi0JICAgICAgJiYgKHJhbmdlICYgfjB4ZmYpID09IDEgPDwgUkVHX1BDKSkKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IFRIVU1CX1BQX1BDX0xSOwotCSAgcmFuZ2UgJj0gMHhmZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbGlzdCB0byBwdXNoL3BvcCBpbnN0cnVjdGlvbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSByYW5nZTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0ciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9XT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3RyYiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9CWVRFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3RyaCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9IQUxGV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N1YiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9hZGRfc3ViIChzdHIsIDEpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zd2kgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9TV0k7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2FkciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHIgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKLSAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm0gImFkZCByZCwgcGMsICNsYWJlbC0uLTQiICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDQpID09IEZBSUwgIC8qIFN0b3JlIFJkIGluIHRlbXBvcmFyeSBsb2NhdGlvbiBpbnNpZGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDQ7IC8qIFBDIHJlbGF0aXZlIGFkanVzdCAqLwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUkVHX1BDOyAvKiBSZCBpcyBhbHJlYWR5IHBsYWNlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiAqLwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9yZWcgKGVudHJ5KQotICAgICBpbnQgZW50cnk7Ci17Ci0gIGludCAgICBsZW4gPSBzdHJsZW4gKHJlZ190YWJsZVtlbnRyeV0ubmFtZSkgKyAyOwotICBjaGFyICogYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgY2hhciAqIGJ1ZjIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBpbnQgICAgaSA9IDA7Ci0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgYnVmW2krK10gPSBSRUdJU1RFUl9QUkVGSVg7Ci0jZW5kaWYKLQotICBzdHJjcHkgKGJ1ZiArIGksIHJlZ190YWJsZVtlbnRyeV0ubmFtZSk7Ci0KLSAgZm9yIChpID0gMDsgYnVmW2ldOyBpKyspCi0gICAgYnVmMltpXSA9IGlzbG93ZXIgKGJ1ZltpXSkgPyB0b3VwcGVyIChidWZbaV0pIDogYnVmW2ldOwotCi0gIGJ1ZjJbaV0gPSAnXDAnOwotCi0gIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmLCAoUFRSKSAmcmVnX3RhYmxlW2VudHJ5XSk7Ci0gIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmMiwgKFBUUikgJnJlZ190YWJsZVtlbnRyeV0pOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3JlZ19hbGlhcyAoc3RyLCByZWdudW0pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgc3RydWN0IHJlZ19lbnRyeSAqbmV3ID0KLSAgICAoc3RydWN0IHJlZ19lbnRyeSAqKXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlZ19lbnRyeSkpOwotICBjaGFyICpuYW1lID0geG1hbGxvYyAoc3RybGVuIChzdHIpICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc3RyKTsKLQotICBuZXctPm5hbWUgPSBuYW1lOwotICBuZXctPm51bWJlciA9IHJlZ251bTsKLQotICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIG5hbWUsIChQVFIpIG5ldyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfY29uc3RhbnRfZmxvbnVtcyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKLSAgICBpZiAoYXRvZl9pZWVlICgoY2hhciAqKWZwX2NvbnN0W2ldLCAneCcsIGZwX3ZhbHVlc1tpXSkgPT0gTlVMTCkKLSAgICAgIGFib3J0ICgpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBpbnQgaTsKLSAgCi0gIGlmICggICAoYXJtX29wc19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAotICAgICAgfHwgKGFybV90b3BzX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX2NvbmRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fc2hpZnRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fcmVnX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX3Bzcl9oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIikpOwotICAgIAotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChpbnNucykgLyBzaXplb2YgKHN0cnVjdCBhc21fb3Bjb2RlKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fb3BzX2hzaCwgaW5zbnNbaV0udGVtcGxhdGUsIChQVFIpIChpbnNucyArIGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGluc25zKSAvIHNpemVvZiAoc3RydWN0IHRodW1iX29wY29kZSk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3RvcHNfaHNoLCB0aW5zbnNbaV0udGVtcGxhdGUsIChQVFIpICh0aW5zbnMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvbmRzKSAvIHNpemVvZiAoc3RydWN0IGFzbV9jb25kKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fY29uZF9oc2gsIGNvbmRzW2ldLnRlbXBsYXRlLCAoUFRSKSAoY29uZHMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNoaWZ0KSAvIHNpemVvZiAoc3RydWN0IGFzbV9zaGlmdCk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3NoaWZ0X2hzaCwgc2hpZnRbaV0udGVtcGxhdGUsIChQVFIpIChzaGlmdCArIGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHNycykgLyBzaXplb2YgKHN0cnVjdCBhc21fcHNyKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fcHNyX2hzaCwgcHNyc1tpXS50ZW1wbGF0ZSwgKFBUUikgKHBzcnMgKyBpKSk7Ci0KLSAgZm9yIChpID0gMDsgcmVnX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICBpbnNlcnRfcmVnIChpKTsKLQotICBzZXRfY29uc3RhbnRfZmxvbnVtcyAoKTsKLQotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotICAgIAotICAgIC8qIFNldCB0aGUgZmxhZ3MgaW4gdGhlIHByaXZhdGUgc3RydWN0dXJlICovCi0gICAgaWYgKHVzZXNfYXBjc18yNikgICAgICBmbGFncyB8PSBGX0FQQ1MyNjsKLSAgICBpZiAoc3VwcG9ydF9pbnRlcndvcmspIGZsYWdzIHw9IEZfSU5URVJXT1JLOwotICAgIGlmICh1c2VzX2FwY3NfZmxvYXQpICAgZmxhZ3MgfD0gRl9BUENTX0ZMT0FUOwotICAgIGlmIChwaWNfY29kZSkgICAgICAgICAgZmxhZ3MgfD0gRl9QSUM7Ci0KLSAgICBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKHN0ZG91dHB1dCwgZmxhZ3MpOwotICB9Ci0jZW5kaWYKLSAgCi0gIHsKLSAgICB1bnNpZ25lZCBtYWNoOwotICAgIAotICAgIC8qIFJlY29yZCB0aGUgQ1BVIHR5cGUgYXMgd2VsbCAqLwotICAgIHN3aXRjaCAoY3B1X3ZhcmlhbnQgJiBBUk1fQ1BVX01BU0spCi0gICAgICB7Ci0gICAgICBjYXNlIEFSTV8yOgotCW1hY2ggPSBiZmRfbWFjaF9hcm1fMjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgQVJNXzM6IC8qIGFsc28gQVJNXzI1MCAqLwotCW1hY2ggPSBiZmRfbWFjaF9hcm1fMmE7Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICBjYXNlIEFSTV82IHwgQVJNXzMgfCBBUk1fMjoJLyogQWN0dWFsbHkgbm8gQ1BVIHR5cGUgZGVmaW5lZCAqLwotCW1hY2ggPSBiZmRfbWFjaF9hcm1fNDsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgQVJNXzc6IAkJCS8qIGFsc28gQVJNXzYgKi8KLQltYWNoID0gYmZkX21hY2hfYXJtXzM7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAvKiBDYXRjaCBzcGVjaWFsIGNhc2VzICovCi0gICAgaWYgKGNwdV92YXJpYW50ICE9IChGUFVfREVGQVVMVCB8IENQVV9ERUZBVUxUKSkKLSAgICAgIHsKLQlpZiAoY3B1X3ZhcmlhbnQgJiAoQVJNX0VYVF9WNSAmIEFSTV9USFVNQikpCi0JICBtYWNoID0gYmZkX21hY2hfYXJtXzVUOwotCWVsc2UgaWYgKGNwdV92YXJpYW50ICYgQVJNX0VYVF9WNSkKLQkgIG1hY2ggPSBiZmRfbWFjaF9hcm1fNTsKLQllbHNlIGlmIChjcHVfdmFyaWFudCAmIEFSTV9USFVNQikKLQkgIG1hY2ggPSBiZmRfbWFjaF9hcm1fNFQ7Ci0JZWxzZSBpZiAoKGNwdV92YXJpYW50ICYgQVJNX0FSQ0hfVjQpID09IEFSTV9BUkNIX1Y0KQotCSAgbWFjaCA9IGJmZF9tYWNoX2FybV80OwotCWVsc2UgaWYgKGNwdV92YXJpYW50ICYgQVJNX0xPTkdNVUwpCi0JICBtYWNoID0gYmZkX21hY2hfYXJtXzNNOwotICAgICAgfQotCQotICAgIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoKTsKLSAgfQotfQotCi0vKiBUdXJuIGFuIGludGVnZXIgb2YgbiBieXRlcyAoaW4gdmFsKSBpbnRvIGEgc3RyZWFtIG9mIGJ5dGVzIGFwcHJvcHJpYXRlCi0gICBmb3IgdXNlIGluIHRoZSBhLm91dCBmaWxlLCBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIGFycmF5IHBvaW50ZWQgdG8gYnkgYnVmLgotICAgVGhpcyBrbm93cyBhYm91dCB0aGUgZW5kaWFuLW5lc3Mgb2YgdGhlIHRhcmdldCBtYWNoaW5lIGFuZCBkb2VzCi0gICBUSEUgUklHSFQgVEhJTkcsIHdoYXRldmVyIGl0IGlzLiAgUG9zc2libGUgdmFsdWVzIGZvciBuIGFyZSAxIChieXRlKQotICAgMiAoc2hvcnQpIGFuZCA0IChsb25nKSAgRmxvYXRpbmcgbnVtYmVycyBhcmUgcHV0IG91dCBhcyBhIHNlcmllcyBvZgotICAgTElUVExFTlVNUyAoc2hvcnRzLCBoZXJlIGF0IGxlYXN0KQotICAgKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCAgICBuOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi1zdGF0aWMgdmFsdWVUIAotbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIGludCBuOwotewotICB2YWx1ZVQgcmVzdWx0ID0gMDsKLSAgdW5zaWduZWQgY2hhciAqIHdoZXJlID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHJlc3VsdCB8PSAoKndoZXJlKysgJiAyNTUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHJlc3VsdCB8PSAod2hlcmVbbl0gJiAyNTUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIFRZUEUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLQotICAgTm90ZSB0aGF0IGZwIGNvbnN0YW50cyBhcmVuJ3QgcmVwcmVzZW50IGluIHRoZSBub3JtYWwgd2F5IG9uIHRoZSBBUk0uCi0gICBJbiBiaWcgZW5kaWFuIG1vZGUsIHRoaW5ncyBhcmUgYXMgZXhwZWN0ZWQuICBIb3dldmVyLCBpbiBsaXR0bGUgZW5kaWFuCi0gICBtb2RlIGZwIGNvbnN0YW50cyBhcmUgYmlnLWVuZGlhbiB3b3JkLXdpc2UsIGFuZCBsaXR0bGUtZW5kaWFuIGJ5dGUtd2lzZQotICAgd2l0aGluIHRoZSB3b3Jkcy4gIEZvciBleGFtcGxlLCAoZG91YmxlKSAxLjEgaW4gYmlnIGVuZGlhbiBtb2RlIGlzCi0gICB0aGUgYnl0ZSBzZXF1ZW5jZSAzZiBmMSA5OSA5OSA5OSA5OSA5OSA5YSwgYW5kIGluIGxpdHRsZSBlbmRpYW4gbW9kZSBpcwotICAgdGhlIGJ5dGUgc2VxdWVuY2UgOTkgOTkgZjEgM2YgOWEgOTkgOTkgOTkuCi0KLSAgID8/PyBUaGUgZm9ybWF0IG9mIDEyIGJ5dGUgZmxvYXRzIGlzIHVuY2VydGFpbiBhY2NvcmRpbmcgdG8gZ2NjJ3MgYXJtLmguICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyICAgdHlwZTsKLSAgICAgY2hhciAqIGxpdFA7Ci0gICAgIGludCAqICBzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiAyOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3IgYSA0IGJ5dGUgZmxvYXQgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGluIGB3b3JkcycgaXMgMSAwLiAgRm9yIGFuCi0JIDggYnl0ZSBmbG9hdCB0aGUgb3JkZXIgaXMgMSAwIDMgMi4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSArPSAyKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaSArIDFdLCAyKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCArIDIsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gNDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGUga25vd2xlZGdlIG9mIHRoZSBQQydzIHBpcGVsaW5lIG9mZnNldCBpcyBidWlsdCBpbnRvIHRoZSBpbnNucyB0aGVtc2VsdmVzLiAgKi8gCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICogZml4UDsKLXsKLSAgaWYgKCAgIGZpeFAtPmZ4X2FkZHN5Ci0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLSAgICAgICYmIGZpeFAtPmZ4X3N1YnN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoZml4UC0+ZnhfcGNyZWwgJiYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCkpCi0gICAgewotICAgICAgLyogUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBvbiB0aGUgVGh1bWIgaXMgc2xpZ2h0bHkgb2RkCi0JIGFzIHRoZSBib3R0b20gdHdvIGJpdHMgb2YgdGhlIFBDIGFyZSBmb3JjZWQgdG8gemVybwotCSBmb3IgdGhlIGNhbGN1bGF0aW9uICovCi0gICAgICByZXR1cm4gKGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcykgJiB+MzsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUICAgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICAvKiBEb24ndCBhbGlnbiB0aGUgZHdhcmYyIGRlYnVnIHNlY3Rpb25zICovCi0gIGlmICghc3RybmNtcCAoc2VnbWVudC0+bmFtZSwgIi5kZWJ1ZyIsIDUpKQotICAgIHJldHVybiBzaXplOwotI2VuZGlmCi0gIC8qIFJvdW5kIGFsbCBzZWN0cyB0byBtdWx0aXBsZSBvZiA0ICovCi0gIHJldHVybiAoc2l6ZSArIDMpICYgfjM7Ci19Ci0KLS8qIFVuZGVyIEVMRiB3ZSBuZWVkIHRvIGRlZmF1bHQgX0dMT0JBTF9PRkZTRVRfVEFCTEUuICBPdGhlcndpc2UgCi0gICB3ZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKiBuYW1lOwotewotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJ0cnCi0gICAgICAmJiBzdHJlcSAobmFtZSwgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKSkKLSAgICB7Ci0gICAgICBpZiAoIUdPVF9zeW1ib2wpCi0JewotCSAgaWYgKHN5bWJvbF9maW5kIChuYW1lKSkKLQkgICAgYXNfYmFkICgiR09UIGFscmVhZHkgaW4gdGhlIHN5bWJvbCB0YWJsZSIpOwotCSAgCi0JICBHT1Rfc3ltYm9sID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJICAgKHZhbHVlVCkwLCAmIHplcm9fYWRkcmVzc19mcmFnKTsKLQl9Ci0gICAgICAKLSAgICAgIHJldHVybiBHT1Rfc3ltYm9sOwotICAgIH0KLSNlbmRpZgotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIGFybV9yZWdfcGFyc2UgKCkgOj0gaWYgaXQgbG9va3MgbGlrZSBhIHJlZ2lzdGVyLCByZXR1cm4gaXRzIHRva2VuIGFuZCAKLSAgIGFkdmFuY2UgdGhlIHBvaW50ZXIuICovCi0KLXN0YXRpYyBpbnQKLWFybV9yZWdfcGFyc2UgKGNjcCkKLSAgICAgcmVnaXN0ZXIgY2hhciAqKiBjY3A7Ci17Ci0gIGNoYXIgKiBzdGFydCA9ICogY2NwOwotICBjaGFyICAgYzsKLSAgY2hhciAqIHA7Ci0gIHN0cnVjdCByZWdfZW50cnkgKiByZWc7Ci0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgaWYgKCpzdGFydCAhPSBSRUdJU1RFUl9QUkVGSVgpCi0gICAgcmV0dXJuIEZBSUw7Ci0gIHAgPSBzdGFydCArIDE7Ci0jZWxzZQotICBwID0gc3RhcnQ7Ci0jaWZkZWYgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYCi0gIGlmICgqcCA9PSBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgpCi0gICAgcCsrLCBzdGFydCsrOwotI2VuZGlmCi0jZW5kaWYKLSAgaWYgKCFpc2FscGhhICgqcCkgfHwgIWlzX25hbWVfYmVnaW5uZXIgKCpwKSkKLSAgICByZXR1cm4gRkFJTDsKLQotICBjID0gKnArKzsKLSAgd2hpbGUgKGlzYWxwaGEgKGMpIHx8IGlzZGlnaXQgKGMpIHx8IGMgPT0gJ18nKQotICAgIGMgPSAqcCsrOwotCi0gICotLXAgPSAwOwotICByZWcgPSAoc3RydWN0IHJlZ19lbnRyeSAqKSBoYXNoX2ZpbmQgKGFybV9yZWdfaHNoLCBzdGFydCk7Ci0gICpwID0gYzsKLSAgCi0gIGlmIChyZWcpCi0gICAgewotICAgICAgKmNjcCA9IHA7Ci0gICAgICByZXR1cm4gcmVnLT5udW1iZXI7Ci0gICAgfQotCi0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1hcm1fcHNyX3BhcnNlIChjY3ApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKiogY2NwOwotewotICBjaGFyICogc3RhcnQgPSAqIGNjcDsKLSAgY2hhciAgIGM7Ci0gIGNoYXIgKiBwOwotICBDT05TVCBzdHJ1Y3QgYXNtX3BzciAqIHBzcjsKLQotICBwID0gc3RhcnQ7Ci0gIGMgPSAqcCsrOwotICB3aGlsZSAoaXNhbHBoYSAoYykgfHwgYyA9PSAnXycpCi0gICAgYyA9ICpwKys7Ci0KLSAgKi0tcCA9IDA7ICAKLSAgcHNyID0gKENPTlNUIHN0cnVjdCBhc21fcHNyICopIGhhc2hfZmluZCAoYXJtX3Bzcl9oc2gsIHN0YXJ0KTsKLSAgKnAgPSBjOwotCi0gIGlmIChwc3IpCi0gICAgewotICAgICAgKmNjcCA9IHA7Ci0gICAgICByZXR1cm4gcHNyLT5udW1iZXI7Ci0gICAgfQotCi0gIHJldHVybiBGQUlMOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbCwgc2VnKQotICAgICBmaXhTICogICAgICBmaXhQOwotICAgICB2YWx1ZVQgKiAgICB2YWw7Ci0gICAgIHNlZ1QgICAgICAgIHNlZzsKLXsKLSAgb2Zmc2V0VCAgICAgICAgdmFsdWUgPSAqIHZhbDsKLSAgb2Zmc2V0VCAgICAgICAgbmV3dmFsOwotICB1bnNpZ25lZCBpbnQgICBuZXdpbW07Ci0gIHVuc2lnbmVkIGxvbmcgIHRlbXA7Ci0gIGludCAgICAgICAgICAgIHNpZ247Ci0gIGNoYXIgKiAgICAgICAgIGJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgYXJtX2ZpeF9kYXRhICogYXJtX2RhdGEgPSAoYXJtX2ZpeF9kYXRhICopIGZpeFAtPnRjX2ZpeF9kYXRhOwotCi0gIGFzc2VydCAoZml4UC0+Znhfcl90eXBlIDwgQkZEX1JFTE9DX1VOVVNFRCk7Ci0KLSAgLyogTm90ZSB3aGV0aGVyIHRoaXMgd2lsbCBkZWxldGUgdGhlIHJlbG9jYXRpb24uICAqLwotI2lmIDAgLyogcGF0Y2ggZnJvbSBSRWFybnNoYXcgdG8gSkRhdmlzIChkaXNhYmxlZCBmb3IgdGhlIG1vbWVudCwgc2luY2UgaXQgZG9lc24ndCB3b3JrIGZ1bGx5KSAqLwotICBpZiAoKGZpeFAtPmZ4X2FkZHN5ID09IDAgfHwgc3ltYm9sX2NvbnN0YW50X3AgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICAgICYmICFmaXhQLT5meF9wY3JlbCkKLSNlbHNlCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmICFmaXhQLT5meF9wY3JlbCkKLSNlbmRpZgotICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gdGhlbiB3ZSBuZWVkIHRvIGxlYXZlIGl0IGZvcgotICAgICB0aGUgbGlua2VyIHRvIGRlYWwgd2l0aC4gIFVuZm9ydHVuYXRlbHksIG1kX3BjcmVsX2Zyb20gY2FuJ3QgdGVsbCwKLSAgICAgc28gd2UgaGF2ZSB0byB1bmRvIGl0J3MgZWZmZWN0cyBoZXJlLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0JICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZykKLQl7Ci0JICBpZiAodGFyZ2V0X29hYmkKLQkgICAgICAmJiBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gpCi0JICAgIHZhbHVlID0gMDsKLQkgIGVsc2UKLQkgICAgdmFsdWUgKz0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0JfQotICAgIH0KLQotICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURToKLSAgICAgIG5ld2ltbSA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsdWUpOwotICAgICAgdGVtcCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBmYWlsLCBzZWUgaWYgd2UgY2FuIGZpeCB0aGluZ3MgdXAgYnkKLQkgY2hhbmdpbmcgdGhlIG9wY29kZS4gICovCi0gICAgICBpZiAobmV3aW1tID09ICh1bnNpZ25lZCBpbnQpIEZBSUwKLQkgICYmIChuZXdpbW0gPSBuZWdhdGVfZGF0YV9vcCAoJnRlbXAsIHZhbHVlKSkgPT0gKHVuc2lnbmVkIGludCkgRkFJTCkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJpbnZhbGlkIGNvbnN0YW50ICglbHgpIGFmdGVyIGZpeHVwXG4iKSwKLQkJCSh1bnNpZ25lZCBsb25nKSB2YWx1ZSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIG5ld2ltbSB8PSAodGVtcCAmIDB4ZmZmZmYwMDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsICh2YWx1ZVQpIG5ld2ltbSwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFOgotICAgICAgewotCXVuc2lnbmVkIGludCBoaWdocGFydCA9IDA7Ci0JdW5zaWduZWQgaW50IG5ld2luc24gID0gMHhlMWEwMDAwMDsgLyogbm9wICovCi0JbmV3aW1tID0gdmFsaWRhdGVfaW1tZWRpYXRlICh2YWx1ZSk7Ci0JdGVtcCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOwotCi0JLyogSWYgdGhlIGluc3RydWN0aW9uIHdpbGwgZmFpbCwgc2VlIGlmIHdlIGNhbiBmaXggdGhpbmdzIHVwIGJ5Ci0JICAgY2hhbmdpbmcgdGhlIG9wY29kZS4gICovCi0JaWYgKG5ld2ltbSA9PSAodW5zaWduZWQgaW50KSBGQUlMCi0JICAgICYmIChuZXdpbW0gPSBuZWdhdGVfZGF0YV9vcCAoJiB0ZW1wLCB2YWx1ZSkpID09ICh1bnNpZ25lZCBpbnQpIEZBSUwpCi0JICB7Ci0JICAgIC8qIE5vID8gIE9LIC0gdHJ5IHVzaW5nIHR3byBBREQgaW5zdHJ1Y3Rpb25zIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZS4gICovCi0JICAgIG5ld2ltbSA9IHZhbGlkYXRlX2ltbWVkaWF0ZV90d29wYXJ0ICh2YWx1ZSwgJiBoaWdocGFydCk7Ci0KLQkgICAgLyogWWVzIC0gdGhlbiBtYWtlIHN1cmUgdGhhdCB0aGUgc2Vjb25kIGluc3RydWN0aW9uIGlzIGFsc28gYW4gYWRkLiAgKi8KLQkgICAgaWYgKG5ld2ltbSAhPSAodW5zaWduZWQgaW50KSBGQUlMKQotCSAgICAgIG5ld2luc24gPSB0ZW1wOwotCSAgICAvKiBTdGlsbCBObyA/ICBUcnkgdXNpbmcgYSBuZWdhdGVkIHZhbHVlLiAgKi8KLQkgICAgZWxzZSBpZiAodmFsaWRhdGVfaW1tZWRpYXRlX3R3b3BhcnQgKC0gdmFsdWUsICYgaGlnaHBhcnQpICE9ICh1bnNpZ25lZCBpbnQpIEZBSUwpCi0JCXRlbXAgPSBuZXdpbnNuID0gKHRlbXAgJiBPUENPREVfTUFTSykgfCBPUENPREVfU1VCIDw8IERBVEFfT1BfU0hJRlQ7Ci0JICAgIC8qIE90aGVyd2lzZSAtIGdpdmUgdXAuICAqLwotCSAgICBlbHNlCi0JICAgICAgewotCQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgICBfKCJVbmFibGUgdG8gY29tcHV0ZSBBRFJMIGluc3RydWN0aW9ucyBmb3IgUEMgb2Zmc2V0IG9mIDB4JXhcbiIpLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBSZXBsYWNlIHRoZSBmaXJzdCBvcGVyYW5kIGluIHRoZSAybmQgaW5zdHJ1Y3Rpb24gKHdoaWNoIGlzIHRoZSBQQykKLQkgICAgICAgd2l0aCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuICBXZSBoYXZlIGFscmVhZHkgYWRkZWQgaW4gdGhlIFBDIGluIHRoZQotCSAgICAgICBmaXJzdCBpbnN0cnVjdGlvbiBhbmQgd2UgZG8gbm90IHdhbnQgdG8gZG8gaXQgYWdhaW4uICAqLwotCSAgICBuZXdpbnNuICY9IH4gMHhmMDAwMDsKLQkgICAgbmV3aW5zbiB8PSAoKG5ld2luc24gJiAweDBmMDAwKSA8PCA0KTsKLQkgIH0KLQotCW5ld2ltbSB8PSAodGVtcCAmIDB4ZmZmZmYwMDApOwotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCAodmFsdWVUKSBuZXdpbW0sIElOU05fU0laRSk7Ci0KLQloaWdocGFydCB8PSAobmV3aW5zbiAmIDB4ZmZmZmYwMDApOwotCW1kX251bWJlcl90b19jaGFycyAoYnVmICsgSU5TTl9TSVpFLCAodmFsdWVUKSBoaWdocGFydCwgSU5TTl9TSVpFKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU06Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICgodmFsdWUgPSB2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMCkpID09IEZBSUwpCi0gICAgICAgIHsKLSAgICAgICAgICBhc19iYWQgKF8oImJhZCBpbW1lZGlhdGUgdmFsdWUgZm9yIG9mZnNldCAoJWxkKSIpLCAobG9uZykgdmFsdWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLXZhbHVlOwotCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG5ld3ZhbCAmPSAweGZmN2ZmMDAwOwotICAgICAgbmV3dmFsIHw9IHZhbHVlIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NODoKLSAgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0hXTElURVJBTDoKLSAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOwotICAgICAgaWYgKCh2YWx1ZSA9IHZhbGlkYXRlX29mZnNldF9pbW0gKHZhbHVlLCAxKSkgPT0gRkFJTCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQlfKCJpbnZhbGlkIGxpdGVyYWwgY29uc3RhbnQ6IHBvb2wgbmVlZHMgdG8gYmUgY2xvc2VyXG4iKSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfYmFkIChfKCJiYWQgaW1tZWRpYXRlIHZhbHVlIGZvciBvZmZzZXQgKCVsZCkiKSwgKGxvbmcpIHZhbHVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLXZhbHVlOwotCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG5ld3ZhbCAmPSAweGZmN2ZmMGYwOwotICAgICAgbmV3dmFsIHw9ICgodmFsdWUgPj4gNCkgPDwgOCkgfCAodmFsdWUgJiAweGYpIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw6Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICh2YWx1ZSA8IDApCi0JdmFsdWUgPSAtdmFsdWU7Ci0KLSAgICAgIGlmICgodmFsdWUgPSB2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMCkpID09IEZBSUwpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCAKLQkJCV8oImludmFsaWQgbGl0ZXJhbCBjb25zdGFudDogcG9vbCBuZWVkcyB0byBiZSBjbG9zZXJcbiIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjAwMDsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU06Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDMyCi0JICB8fCAodmFsdWUgPT0gMzIgCi0JICAgICAgJiYgKCgobmV3dmFsICYgMHg2MCkgPT0gMCkgfHwgKG5ld3ZhbCAmIDB4NjApID09IDB4NjApKSkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJzaGlmdCBleHByZXNzaW9uIGlzIHRvbyBsYXJnZSIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHZhbHVlID09IDApCi0JbmV3dmFsICY9IH4weDYwOwkvKiBTaGlmdHMgb2YgemVybyBtdXN0IGJlIGRvbmUgYXMgbHNsICovCi0gICAgICBlbHNlIGlmICh2YWx1ZSA9PSAzMikKLQl2YWx1ZSA9IDA7Ci0gICAgICBuZXd2YWwgJj0gMHhmZmZmZjA3ZjsKLSAgICAgIG5ld3ZhbCB8PSAodmFsdWUgJiAweDFmKSA8PCA3OwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TV0k6Ci0gICAgICBpZiAoYXJtX2RhdGEtPnRodW1iX21vZGUpCi0JewotCSAgaWYgKCgodW5zaWduZWQgbG9uZykgdmFsdWUpID4gMHhmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIHN3aSBleHByZXNzaW9uIikpOwotCSAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpICYgMHhmZjAwOwotCSAgbmV3dmFsIHw9IHZhbHVlOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4MDBmZmZmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQkgIF8oIkludmFsaWQgc3dpIGV4cHJlc3Npb24iKSk7Ci0JICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKSAmIDB4ZmYwMDAwMDA7Ci0JICBuZXd2YWwgfD0gdmFsdWU7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9NVUxUSToKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4ZmZmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkludmFsaWQgZXhwcmVzc2lvbiBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIikpOwotICAgICAgbmV3dmFsID0gdmFsdWUgfCBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g6Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGlmICghIHRhcmdldF9vYWJpKQotICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSNlbmRpZgotICAgICAgdmFsdWUgID0gKHZhbHVlID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgICAgIHZhbHVlICA9ICh2YWx1ZSArIChuZXd2YWwgJiAweDAwZmZmZmZmKSkgJiAweDAwZmZmZmZmOwotICAgICAgbmV3dmFsID0gdmFsdWUgfCAobmV3dmFsICYgMHhmZjAwMDAwMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5OiAvKiBjb25kaXRpb25hbCBicmFuY2ggKi8KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIHsKLSAgICAgICAgYWRkcmVzc1QgZGlmZiA9IChuZXd2YWwgJiAweGZmKSA8PCAxOwotICAgICAgICBpZiAoZGlmZiAmIDB4MTAwKQotICAgICAgICAgZGlmZiB8PSB+MHhmZjsKLQotICAgICAgICB2YWx1ZSArPSBkaWZmOwotICAgICAgICBpZiAoKHZhbHVlICYgfjB4ZmYpICYmICgodmFsdWUgJiB+MHhmZikgIT0gfjB4ZmYpKQotICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotICAgICAgICBuZXd2YWwgPSAobmV3dmFsICYgMHhmZjAwKSB8ICgodmFsdWUgJiAweDFmZikgPj4gMSk7Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTI6IC8qIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICB7Ci0gICAgICAgIGFkZHJlc3NUIGRpZmYgPSAobmV3dmFsICYgMHg3ZmYpIDw8IDE7Ci0gICAgICAgIGlmIChkaWZmICYgMHg4MDApCi0gICAgICAgICBkaWZmIHw9IH4weDdmZjsKLQotICAgICAgICB2YWx1ZSArPSBkaWZmOwotICAgICAgICBpZiAoKHZhbHVlICYgfjB4N2ZmKSAmJiAoKHZhbHVlICYgfjB4N2ZmKSAhPSB+MHg3ZmYpKQotICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotICAgICAgICBuZXd2YWwgPSAobmV3dmFsICYgMHhmODAwKSB8ICgodmFsdWUgJiAweGZmZikgPj4gMSk7Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM6Ci0gICAgICB7Ci0gICAgICAgIG9mZnNldFQgbmV3dmFsMjsKLSAgICAgICAgYWRkcmVzc1QgZGlmZjsKLQotCW5ld3ZhbCAgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICAgIG5ld3ZhbDIgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiArIFRIVU1CX1NJWkUsIFRIVU1CX1NJWkUpOwotICAgICAgICBkaWZmID0gKChuZXd2YWwgJiAweDdmZikgPDwgMTIpIHwgKChuZXd2YWwyICYgMHg3ZmYpIDw8IDEpOwotICAgICAgICBpZiAoZGlmZiAmIDB4NDAwMDAwKQotCSAgZGlmZiB8PSB+MHgzZmZmZmY7Ci0gICAgICAgIHZhbHVlICs9IGRpZmY7Ci0gICAgICAgIGlmICgodmFsdWUgJiB+MHgzZmZmZmYpICYmICgodmFsdWUgJiB+MHgzZmZmZmYpICE9IH4weDNmZmZmZikpCi0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJCcmFuY2ggd2l0aCBsaW5rIG91dCBvZiByYW5nZSIpKTsKLQotICAgICAgICBuZXd2YWwgID0gKG5ld3ZhbCAgJiAweGY4MDApIHwgKCh2YWx1ZSAmIDB4N2ZmZmZmKSA+PiAxMik7Ci0gICAgICAgIG5ld3ZhbDIgPSAobmV3dmFsMiAmIDB4ZjgwMCkgfCAoKHZhbHVlICYgMHhmZmYpID4+IDEpOwotICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYgKyBUSFVNQl9TSVpFLCBuZXd2YWwyLCBUSFVNQl9TSVpFKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIGlmIChmaXhQLT5meF9kb25lIHx8IGZpeFAtPmZ4X3BjcmVsKQotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMSk7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZWxzZSBpZiAoIXRhcmdldF9vYWJpKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1QzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UT0ZGOgotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCAwLCA0KTsKLQlicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDQpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QTFQzMjoKLSAgICAgIC8qIEl0IGFwcGVhcnMgdGhlIGluc3RydWN0aW9uIGlzIGZ1bGx5IHByZXBhcmVkIGF0IHRoaXMgcG9pbnQuICovCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVFBDOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU06Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICh2YWx1ZSA8IC0xMDIzIHx8IHZhbHVlID4gMTAyMyB8fCAodmFsdWUgJiAzKSkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIklsbGVnYWwgdmFsdWUgZm9yIGNvLXByb2Nlc3NvciBvZmZzZXQiKSk7Ci0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLXZhbHVlOwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSkgJiAweGZmN2ZmZjAwOwotICAgICAgbmV3dmFsIHw9ICh2YWx1ZSA+PiAyKSB8IChzaWduID8gIElOREVYX1VQIDogMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDoKLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIC8qIEV4YWN0bHkgd2hhdCByYW5nZXMsIGFuZCB3aGVyZSB0aGUgb2Zmc2V0IGlzIGluc2VydGVkIGRlcGVuZHMgb24KLQkgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24sIHdlIGNhbiBlc3RhYmxpc2ggdGhpcyBmcm9tIHRoZSB0b3AgNCBiaXRzICovCi0gICAgICBzd2l0Y2ggKG5ld3ZhbCA+PiAxMikKLQl7Ci0JY2FzZSA0OiAvKiBQQyBsb2FkICovCi0JICAvKiBUaHVtYiBQQyBsb2FkcyBhcmUgc29tZXdoYXQgb2RkLCBiaXQgMSBvZiB0aGUgUEMgaXMKLQkgICAgIGZvcmNlZCB0byB6ZXJvIGZvciB0aGVzZSBsb2Fkcywgc28gd2Ugd2lsbCBuZWVkIHRvIHJvdW5kCi0JICAgICB1cCB0aGUgb2Zmc2V0IGlmIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzIGlzIG5vdCB3b3JkCi0JICAgICBhbGlnbmVkIChzaW5jZSB0aGUgZmluYWwgYWRkcmVzcyBwcm9kdWNlZCBtdXN0IGJlLCBhbmQKLQkgICAgIHdlIGNhbiBvbmx5IGRlc2NyaWJlIHdvcmQtYWxpZ25lZCBpbW1lZGlhdGUgb2Zmc2V0cykuICAqLwotCi0JICBpZiAoKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIHZhbHVlKSAmIDMpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQsIHRhcmdldCBub3Qgd29yZCBhbGlnbmVkICgweCUwOFgpIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIHZhbHVlKSk7Ci0KLQkgIGlmICgodmFsdWUgKyAyKSAmIH4weDNmZSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCIpKTsKLQotICAgICAgICAgIC8qIFJvdW5kIHVwLCBzaW5jZSBwYyB3aWxsIGJlIHJvdW5kZWQgZG93bi4gICovCi0JICBuZXd2YWwgfD0gKHZhbHVlICsgMikgPj4gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA5OiAvKiBTUCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgzZmMpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQiKSk7Ci0JICBuZXd2YWwgfD0gdmFsdWUgPj4gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA2OiAvKiBXb3JkIGxvYWQvc3RvcmUgKi8KLQkgIGlmICh2YWx1ZSAmIH4weDdjKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0IikpOwotCSAgbmV3dmFsIHw9IHZhbHVlIDw8IDQ7IC8qIDYgLSAyICovCi0JICBicmVhazsKLQotCWNhc2UgNzogLyogQnl0ZSBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgxZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCIpKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA2OwotCSAgYnJlYWs7Ci0KLQljYXNlIDg6IC8qIEhhbGZ3b3JkIGxvYWQvc3RvcmUgKi8KLQkgIGlmICh2YWx1ZSAmIH4weDNlKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0IikpOwotCSAgbmV3dmFsIHw9IHZhbHVlIDw8IDU7IC8qIDYgLSAxICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkiVW5hYmxlIHRvIHByb2Nlc3MgcmVsb2NhdGlvbiBmb3IgdGh1bWIgb3Bjb2RlOiAlbHgiLAotCQkJKHVuc2lnbmVkIGxvbmcpIG5ld3ZhbCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDoKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21wbGljYXRlZCByZWxvY2F0aW9uLCBzaW5jZSB3ZSB1c2UgaXQgZm9yIGFsbCBvZgotICAgICAgICAgdGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcmVsb2NhdGlvbnM6Ci0gICAgICAgICAgICAzYml0IEFERC9TVUIKLSAgICAgICAgICAgIDhiaXQgQUREL1NVQgotICAgICAgICAgICAgOWJpdCBBREQvU1VCIFNQIHdvcmQtYWxpZ25lZAotICAgICAgICAgICAxMGJpdCBBREQgUEMvU1Agd29yZC1hbGlnbmVkCi0KLSAgICAgICAgIFRoZSB0eXBlIG9mIGluc3RydWN0aW9uIGJlaW5nIHByb2Nlc3NlZCBpcyBlbmNvZGVkIGluIHRoZQotICAgICAgICAgaW5zdHJ1Y3Rpb24gZmllbGQ6Ci0gICAgICAgICAgIDB4ODAwMCAgU1VCCi0gICAgICAgICAgIDB4MDBGMCAgUmQKLSAgICAgICAgICAgMHgwMDBGICBScwotICAgICAgKi8KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIHsKLSAgICAgICAgaW50IHJkID0gKG5ld3ZhbCA+PiA0KSAmIDB4ZjsKLSAgICAgICAgaW50IHJzID0gbmV3dmFsICYgMHhmOwotICAgICAgICBpbnQgc3VidHJhY3QgPSBuZXd2YWwgJiAweDgwMDA7Ci0KLSAgICAgICAgaWYgKHJkID09IFJFR19TUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgJiB+MHgxZmMpCi0gICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc3RhY2sgYWRkcmVzcyBjYWxjdWxhdGlvbiIpKTsKLSAgICAgICAgICAgIG5ld3ZhbCA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX1NUIDogVF9PUENPREVfQUREX1NUOwotICAgICAgICAgICAgbmV3dmFsIHw9IHZhbHVlID4+IDI7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChycyA9PSBSRUdfUEMgfHwgcnMgPT0gUkVHX1NQKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdWJ0cmFjdCB8fAotICAgICAgICAgICAgICAgIHZhbHVlICYgfjB4M2ZjKQotICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gKHZhbHVlID0gMHglMDhsWCkiKSwKLQkJCSAgICAodW5zaWduZWQgbG9uZykgdmFsdWUpOwotICAgICAgICAgICAgbmV3dmFsID0gKHJzID09IFJFR19QQyA/IFRfT1BDT0RFX0FERF9QQyA6IFRfT1BDT0RFX0FERF9TUCk7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gcmQgPDwgODsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZSA+PiAyOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocnMgPT0gcmQpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4ZmYpCi0gICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIDhiaXQgaW1tZWRpYXRlIikpOwotICAgICAgICAgICAgbmV3dmFsID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTggOiBUX09QQ09ERV9BRERfSTg7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gKHJkIDw8IDgpIHwgdmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4NykKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgM2JpdCBpbW1lZGlhdGUiKSk7Ci0gICAgICAgICAgICBuZXd2YWwgPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9JMyA6IFRfT1BDT0RFX0FERF9JMzsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSByZCB8IChycyA8PCAzKSB8ICh2YWx1ZSA8PCA2KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU06Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICBzd2l0Y2ggKG5ld3ZhbCA+PiAxMSkKLSAgICAgICAgewotICAgICAgICBjYXNlIDB4MDQ6IC8qIDhiaXQgaW1tZWRpYXRlIE1PViAqLwotICAgICAgICBjYXNlIDB4MDU6IC8qIDhiaXQgaW1tZWRpYXRlIENNUCAqLwotICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAyNTUpCi0gICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlOiAlbGQgaXMgdG9vIGxhcmdlIiksCi0JCQkgIChsb25nKSB2YWx1ZSk7Ci0gICAgICAgICAgbmV3dmFsIHw9IHZhbHVlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgIH0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUOgotICAgICAgLyogNWJpdCBzaGlmdCB2YWx1ZSAoMC4uMzEpICovCi0gICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMzEpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJJbGxlZ2FsIFRodW1iIHNoaWZ0IHZhbHVlOiAlbGQiKSwgKGxvbmcpIHZhbHVlKTsKLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKSAmIDB4ZjAzZjsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA2OwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgXygiQmFkIHJlbG9jYXRpb24gZml4dXAgdHlwZSAoJWQpXG4iKSwgZml4UC0+Znhfcl90eXBlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIGZpeFMgKiBmaXhwOwotewotICBhcmVsZW50ICogcmVsb2M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAvKiBAQCBXaHkgZnhfYWRkbnVtYmVyIHNvbWV0aW1lcyBhbmQgZnhfb2Zmc2V0IG90aGVyIHRpbWVzPyAgKi8KLSNpZm5kZWYgT0JKX0VMRgotICBpZiAoZml4cC0+ZnhfcGNyZWwgPT0gMCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldCA9IHJlbG9jLT5hZGRyZXNzOwotI2Vsc2UgIC8qIE9CSl9FTEYgKi8KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSNlbmRpZgotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl7Ci0JICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSDoKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6ICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMzoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMOgotICAgICAgLyogSWYgdGhpcyBpcyBjYWxsZWQgdGhlbiB0aGUgYSBsaXRlcmFsIGhhcyBiZWVuIHJlZmVyZW5jZWQgYWNyb3NzCi0JIGEgc2VjdGlvbiBib3VuZHJ5IC0gcG9zc2libHkgZHVlIHRvIGFuIGltcGxpY2l0IGR1bXAgKi8KLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkxpdGVyYWwgcmVmZXJlbmNlZCBhY3Jvc3Mgc2VjdGlvbiBib3VuZHJ5IChJbXBsaWNpdCBkdW1wPykiKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1RQQzoKLSAgICAgIGFzc2VydCAoZml4cC0+ZnhfcGNyZWwgIT0gMCk7Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1QzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QTFQzMjoKLSAgICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOgotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChJTU1FRElBVEUpIiksCi0JCSAgICBmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEU6Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJBRFJMIHVzZWQgZm9yIGEgc3ltYm9sIG5vdCBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUiKSwKLQkJICAgIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOgotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChPRkZTRVRfSU1NKSIpLAotCQkgICAgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQljaGFyICogdHlwZTsKLQlzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQkgIHsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU6ICAgIHR5cGUgPSAiSU1NRURJQVRFIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTogICB0eXBlID0gIk9GRlNFVF9JTU0iOyAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OiAgdHlwZSA9ICJPRkZTRVRfSU1NOCI7ICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU06ICAgIHR5cGUgPSAiU0hJRlRfSU1NIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fU1dJOiAgICAgICAgICB0eXBlID0gIlNXSSI7ICAgICAgICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX01VTFRJOiAgICAgICAgdHlwZSA9ICJNVUxUSSI7ICAgICAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOiAgIHR5cGUgPSAiQ1BfT0ZGX0lNTSI7ICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOiAgICB0eXBlID0gIlRIVU1CX0FERCI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUOiAgdHlwZSA9ICJUSFVNQl9TSElGVCI7ICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU06ICAgIHR5cGUgPSAiVEhVTUJfSU1NIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOiB0eXBlID0gIlRIVU1CX09GRlNFVCI7IGJyZWFrOwotCSAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICI8dW5rbm93bj4iOyAgICBicmVhazsKLQkgIH0KLQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgKCVkKSIpLAotCQkgICAgICB0eXBlLCBmaXhwLT5meF9wY3JlbCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VMRgotIGlmIChjb2RlID09IEJGRF9SRUxPQ18zMl9QQ1JFTAotICAgICAmJiBHT1Rfc3ltYm9sCi0gICAgICYmIGZpeHAtPmZ4X2FkZHN5ID09IEdPVF9zeW1ib2wpCi0gICB7Ci0gICAgIGNvZGUgPSBCRkRfUkVMT0NfQVJNX0dPVFBDOwotICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0ID0gcmVsb2MtPmFkZHJlc3M7Ci0gICB9Ci0jZW5kaWYKLSAgIAotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0KLSAgaWYgKHJlbG9jLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VndHlwZSkKLSAgICAgZnJhZ1MgKiBmcmFnUDsKLSAgICAgc2VnVCAgICBzZWd0eXBlOwotewotICBhc19mYXRhbCAoXygibWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIpKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vdXRwdXRfaW5zdCBQQVJBTVMgKCh2b2lkKSkKLXsKLSAgY2hhciAqIHRvID0gTlVMTDsKLSAgICAKLSAgaWYgKGluc3QuZXJyb3IpCi0gICAgewotICAgICAgYXNfYmFkIChpbnN0LmVycm9yKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdG8gPSBmcmFnX21vcmUgKGluc3Quc2l6ZSk7Ci0gIGlmICh0aHVtYl9tb2RlICYmIChpbnN0LnNpemUgPiBUSFVNQl9TSVpFKSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc3Quc2l6ZSA9PSAoMiAqIFRIVU1CX1NJWkUpKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG8sIGluc3QuaW5zdHJ1Y3Rpb24gPj4gMTYsIFRIVU1CX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0byArIFRIVU1CX1NJWkUsIGluc3QuaW5zdHJ1Y3Rpb24sIFRIVU1CX1NJWkUpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5zdC5zaXplID4gSU5TTl9TSVpFKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zdC5zaXplID09ICgyICogSU5TTl9TSVpFKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uLCBJTlNOX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0byArIElOU05fU0laRSwgaW5zdC5pbnN0cnVjdGlvbiwgSU5TTl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uLCBpbnN0LnNpemUpOwotCi0gIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgZml4X25ld19hcm0gKGZyYWdfbm93LCB0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgaW5zdC5zaXplLCAmIGluc3QucmVsb2MuZXhwLCBpbnN0LnJlbG9jLnBjX3JlbCwKLQkJIGluc3QucmVsb2MudHlwZSk7Ci0KLSAgcmV0dXJuOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBjaGFyICAgYzsKLSAgY2hhciAqIHA7Ci0gIGNoYXIgKiBxOwotICBjaGFyICogc3RhcnQ7Ci0KLSAgLyogQWxpZ24gdGhlIGluc3RydWN0aW9uLgotICAgICBUaGlzIG1heSBub3QgYmUgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGJ1dCAuLi4gKi8KLSAgLyogYXJtX2FsaWduICgyLCAwKTsgKi8KLSAgbGlzdGluZ19wcmV2X2xpbmUgKCk7IC8qIERlZmluZWQgaW4gbGlzdGluZy5oICovCi0KLSAgLyogQWxpZ24gdGhlIHByZXZpb3VzIGxhYmVsIGlmIG5lZWRlZC4gICovCi0gIGlmIChsYXN0X2xhYmVsX3NlZW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxhc3RfbGFiZWxfc2VlbiwgZnJhZ19ub3cpOwotICAgICAgU19TRVRfVkFMVUUgKGxhc3RfbGFiZWxfc2VlbiwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGxhc3RfbGFiZWxfc2Vlbiwgbm93X3NlZyk7Ci0gICAgfQotCi0gIG1lbXNldCAoJmluc3QsICdcMCcsIHNpemVvZiAoaW5zdCkpOwotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLQotICBpZiAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7CQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCi0gIAotICAvKiBTY2FuIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG9wLWNvZGUsIHdoaWNoIG11c3QgZW5kIGluIHdoaXRlIHNwYWNlIG9yCi0gICAgIGVuZCBvZiBzdHJpbmcuICAqLwotICBmb3IgKHN0YXJ0ID0gcCA9IHN0cjsgKnAgIT0gJ1wwJzsgcCsrKQotICAgIGlmICgqcCA9PSAnICcpCi0gICAgICBicmVhazsKLSAgICAKLSAgaWYgKHAgPT0gc3RyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTm8gb3BlcmF0b3IgLS0gc3RhdGVtZW50IGAlcydcbiIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAodGh1bWJfbW9kZSkKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICogb3Bjb2RlOwotCi0gICAgICBjID0gKnA7Ci0gICAgICAqcCA9ICdcMCc7Ci0gICAgICBvcGNvZGUgPSAoQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFybV90b3BzX2hzaCwgc3RyKTsKLSAgICAgICpwID0gYzsKLSAgICAgIAotICAgICAgaWYgKG9wY29kZSkKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uID0gb3Bjb2RlLT52YWx1ZTsKLQkgIGluc3Quc2l6ZSA9IG9wY29kZS0+c2l6ZTsKLQkgICgqb3Bjb2RlLT5wYXJtcykocCk7Ci0JICBvdXRwdXRfaW5zdCAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IGFzbV9vcGNvZGUgKiBvcGNvZGU7Ci0KLSAgICAgIGluc3Quc2l6ZSA9IElOU05fU0laRTsKLSAgICAgIC8qIHAgbm93IHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBvcGNvZGUsIHByb2JhYmx5IHdoaXRlIHNwYWNlLCBidXQgd2UKLQkgaGF2ZSB0byBicmVhayB0aGUgb3Bjb2RlIHVwIGluIGNhc2UgaXQgY29udGFpbnMgY29uZGlvbmFscyBhbmQgZmxhZ3M7Ci0JIGtlZXAgdHJ5aW5nIHdpdGggcHJvZ3Jlc3NpdmVseSBzbWFsbGVyIGJhc2ljIGluc3RydWN0aW9ucyB1bnRpbCBvbmUKLQkgbWF0Y2hlcywgb3Igd2UgcnVuIG91dCBvZiBvcGNvZGUuICovCi0gICAgICBxID0gKHAgLSBzdHIgPiBMT05HRVNUX0lOU1QpID8gc3RyICsgTE9OR0VTVF9JTlNUIDogcDsKLSAgICAgIGZvciAoOyBxICE9IHN0cjsgcS0tKQotCXsKLQkgIGMgPSAqcTsKLQkgICpxID0gJ1wwJzsKLQkgIG9wY29kZSA9IChDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFybV9vcHNfaHNoLCBzdHIpOwotCSAgKnEgPSBjOwotCSAgCi0JICBpZiAob3Bjb2RlICYmIG9wY29kZS0+dGVtcGxhdGUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdfYml0cyA9IDA7Ci0JICAgICAgY2hhciAqIHI7Ci0KLQkgICAgICAvKiBDaGVjayB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIGZvciB0aGlzIENQVSAqLwotCSAgICAgIGlmICgob3Bjb2RlLT52YXJpYW50cyAmIGNwdV92YXJpYW50KSA9PSAwKQotCQlnb3RvIHRyeV9zaG9ydGVyOwotCi0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IG9wY29kZS0+dmFsdWU7Ci0JICAgICAgaWYgKHEgPT0gcCkJCS8qIEp1c3QgYSBzaW1wbGUgb3Bjb2RlICovCi0JCXsKLQkJICBpZiAob3Bjb2RlLT5jb21wX3N1ZmZpeCAhPSAwKQotCQkgICAgYXNfYmFkIChfKCJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIiksIHN0ciwKLQkJCSAgICBvcGNvZGUtPmNvbXBfc3VmZml4KTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORF9BTFdBWVM7Ci0JCSAgICAgICgqb3Bjb2RlLT5wYXJtcykocSwgMCk7Ci0JCSAgICB9Ci0JCSAgb3V0cHV0X2luc3QgKCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBOb3cgY2hlY2sgZm9yIGEgY29uZGl0aW9uYWwgKi8KLQkgICAgICByID0gcTsKLQkgICAgICBpZiAocCAtIHIgPj0gMikKLQkJewotCQkgIENPTlNUIHN0cnVjdCBhc21fY29uZCAqY29uZDsKLQkJICBjaGFyIGQgPSAqKHIgKyAyKTsKLQotCQkgICoociArIDIpID0gJ1wwJzsKLQkJICBjb25kID0gKENPTlNUIHN0cnVjdCBhc21fY29uZCAqKSBoYXNoX2ZpbmQgKGFybV9jb25kX2hzaCwgcik7Ci0JCSAgKihyICsgMikgPSBkOwotCQkgIGlmIChjb25kKQotCQkgICAgewotCQkgICAgICBpZiAoY29uZC0+dmFsdWUgPT0gMHhmMDAwMDAwMCkKLQkJCWFzX3Rza3RzayAoCi1fKCJXYXJuaW5nOiBVc2Ugb2YgdGhlICdudicgY29uZGl0aW9uYWwgaXMgZGVwcmVjYXRlZFxuIikpOwotCi0JCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gY29uZC0+dmFsdWU7Ci0JCSAgICAgIHIgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENPTkRfQUxXQVlTOwotCQl9Ci0JICAgICAgZWxzZQotCQlpbnN0Lmluc3RydWN0aW9uIHw9IENPTkRfQUxXQVlTOwotCi0JICAgICAgLyogaWYgdGhlcmUgaXMgYSBjb21wdWxzb3J5IHN1ZmZpeCwgaXQgc2hvdWxkIGNvbWUgaGVyZSwgYmVmb3JlCi0JCSBhbnkgb3B0aW9uYWwgZmxhZ3MuICovCi0JICAgICAgaWYgKG9wY29kZS0+Y29tcF9zdWZmaXgpCi0JCXsKLQkJICBDT05TVCBjaGFyICpzID0gb3Bjb2RlLT5jb21wX3N1ZmZpeDsKLQotCQkgIHdoaWxlICgqcykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5zdWZmaXgrKzsKLQkJICAgICAgaWYgKCpyID09ICpzKQotCQkJYnJlYWs7Ci0JCSAgICAgIHMrKzsKLQkJICAgIH0KLQotCQkgIGlmICgqcyA9PSAnXDAnKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIk9wY29kZSBgJXMnIG11c3QgaGF2ZSBzdWZmaXggZnJvbSA8JXM+XG4iKSwgc3RyLAotCQkJICAgICAgb3Bjb2RlLT5jb21wX3N1ZmZpeCk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQotCQkgIHIrKzsKLQkJfQotCi0JICAgICAgLyogVGhlIHJlbWFpbmRlciwgaWYgYW55IHNob3VsZCBub3cgYmUgZmxhZ3MgZm9yIHRoZSBpbnN0cnVjdGlvbjsKLQkJIFNjYW4gdGhlc2UgY2hlY2tpbmcgZWFjaCBvbmUgZm91bmQgd2l0aCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBpZiAociAhPSBwKQotCQl7Ci0JCSAgY2hhciBkOwotCQkgIENPTlNUIHN0cnVjdCBhc21fZmxnICpmbGFnID0gb3Bjb2RlLT5mbGFnczsKLQotCQkgIGlmIChmbGFnKQotCQkgICAgewotCQkgICAgICBpbnQgZmxhZ25vOwotCi0JCSAgICAgIGQgPSAqcDsKLQkJICAgICAgKnAgPSAnXDAnOwotCi0JCSAgICAgIGZvciAoZmxhZ25vID0gMDsgZmxhZ1tmbGFnbm9dLnRlbXBsYXRlOyBmbGFnbm8rKykKLQkJCXsKLQkJCSAgaWYgKHN0cmVxIChyLCBmbGFnW2ZsYWdub10udGVtcGxhdGUpKQotCQkJICAgIHsKLQkJCSAgICAgIGZsYWdfYml0cyB8PSBmbGFnW2ZsYWdub10uc2V0X2JpdHM7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgKnAgPSBkOwotCQkgICAgICBpZiAoISBmbGFnW2ZsYWdub10udGVtcGxhdGUpCi0JCQlnb3RvIHRyeV9zaG9ydGVyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGdvdG8gdHJ5X3Nob3J0ZXI7Ci0JCX0KLQotCSAgICAgICgqb3Bjb2RlLT5wYXJtcykgKHAsIGZsYWdfYml0cyk7Ci0JICAgICAgb3V0cHV0X2luc3QgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQl0cnlfc2hvcnRlcjoKLQkgIDsKLQl9Ci0gICAgfQotCi0gIC8qIEl0IHdhc24ndCBhbiBpbnN0cnVjdGlvbiwgYnV0IGl0IG1pZ2h0IGJlIGEgcmVnaXN0ZXIgYWxpYXMgb2YgdGhlIGZvcm0KLSAgICAgYWxpYXMgLnJlcSByZWcKLSAgICAgKi8KLSAgcSA9IHA7Ci0gIHdoaWxlICgqcSA9PSAnICcpCi0gICAgcSsrOwotCi0gIGMgPSAqcDsKLSAgKnAgPSAnXDAnOwotICAgIAotICBpZiAoKnEgJiYgIXN0cm5jbXAgKHEsICIucmVxICIsIDQpKQotICAgIHsKLSAgICAgIGludCAgICByZWc7Ci0gICAgICBjaGFyICogY29weV9vZl9zdHIgPSBzdHI7Ci0gICAgICBjaGFyICogcjsKLSAgICAgIAotICAgICAgcSArPSA0OwotICAgICAgd2hpbGUgKCpxID09ICcgJykKLQlxKys7Ci0KLSAgICAgIGZvciAociA9IHE7ICpyICE9ICdcMCc7IHIrKykKLQlpZiAoKnIgPT0gJyAnKQotCSAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGlmIChyICE9IHEpCi0JewotCSAgaW50IHJlZ251bTsKLQkgIGNoYXIgZCA9ICpyOwotCi0JICAqciA9ICdcMCc7Ci0JICByZWdudW0gPSBhcm1fcmVnX3BhcnNlICgmIHEpOwotCSAgKnIgPSBkOwotCi0JICByZWcgPSBhcm1fcmVnX3BhcnNlICgmIHN0cik7Ci0JICAKLQkgIGlmIChyZWcgPT0gRkFJTCkKLQkgICAgewotCSAgICAgIGlmIChyZWdudW0gIT0gRkFJTCkKLQkJewotCQkgIGluc2VydF9yZWdfYWxpYXMgKHN0ciwgcmVnbnVtKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX3dhcm4gKF8oInJlZ2lzdGVyICclcycgZG9lcyBub3QgZXhpc3RcbiIpLCBxKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyZWdudW0gIT0gRkFJTCkKLQkgICAgewotCSAgICAgIGlmIChyZWcgIT0gcmVnbnVtKQotCQlhc193YXJuIChfKCJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyIpLCBjb3B5X29mX3N0ciApOwotCSAgICAgIAotCSAgICAgIC8qIERvIG5vdCB3YXJuIGFicG91dCByZWRlZmluaXRpb25zIHRvIHRoZSBzYW1lIGFsaWFzLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICBhc193YXJuIChfKCJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyB0byBub24tZXhpc3RhbnQgcmVnaXN0ZXIgJyVzJyIpLAotCQkgICAgIGNvcHlfb2Zfc3RyLCBxKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygiaWdub3JpbmcgaW5jb21wbGV0ZSAucmVxIHBzZXVzbyBvcCIpKTsKLSAgICAgIAotICAgICAgKnAgPSBjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqcCA9IGM7Ci0gIGFzX2JhZCAoXygiYmFkIGluc3RydWN0aW9uIGAlcyciKSwgc3RhcnQpOwotfQotCi0vKgotICogbWRfcGFyc2Vfb3B0aW9uCi0gKiAgICBJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICogICAgU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgVGhlc2UgYXJlOgotICogICAgQ3B1IHZhcmlhbnRzLCB0aGUgYXJtIHBhcnQgaXMgb3B0aW9uYWw6Ci0gKiAgICAgICAgICAgIC1tW2FybV0xICAgICAgICAgICAgICAgIEN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgotICogICAgICAgICAgICAtbVthcm1dMiwgLW1bYXJtXTI1MCAgICBBcm0gMiBhbmQgQXJtIDI1MCBwcm9jZXNzb3IKLSAqICAgICAgICAgICAgLW1bYXJtXTMgICAgICAgICAgICAgICAgQXJtIDMgcHJvY2Vzc29yCi0gKiAgICAgICAgICAgIC1tW2FybV02W3h4XSwgICAgICAgICAgIEFybSA2IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1bYXJtXTdbeHhdW3RdW1tkXW1dICAgQXJtIDcgcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbVthcm1dOFsxMF0gICAgICAgICAgICBBcm0gOCBwcm9jZXNzb3JzCi0gKiAgICAgICAgICAgIC1tW2FybV05WzIwXVt0ZG1pXSAgICAgIEFybSA5IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1zdHJvbmdhcm1bMTEwWzBdXSAgICAgU3Ryb25nQVJNIHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1bYXJtXXZbMjM0NV0JICAgICAgQXJtIGFyY2hpdGVjdXJlcwotICogICAgICAgICAgICAtbWFsbCAgICAgICAgICAgICAgICAgICBBbGwgKGV4Y2VwdCB0aGUgQVJNMSkKLSAqICAgIEZQIHZhcmlhbnRzOgotICogICAgICAgICAgICAtbWZwYTEwLCAtbWZwYTExICAgICAgICBGUEExMCBhbmQgMTEgY28tcHJvY2Vzc29yIGluc3RydWN0aW9ucwotICogICAgICAgICAgICAtbWZwZS1vbGQgICAgICAgICAgICAgICAoTm8gZmxvYXQgbG9hZC9zdG9yZSBtdWx0aXBsZXMpCi0gKiAgICAgICAgICAgIC1tbm8tZnB1ICAgICAgICAgICAgICAgIERpc2FibGUgYWxsIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucwotICogICAgUnVuLXRpbWUgZW5kaWFuIHNlbGVjdGlvbjoKLSAqICAgICAgICAgICAgLUVCICAgICAgICAgICAgICAgICAgICAgYmlnIGVuZGlhbiBjcHUKLSAqICAgICAgICAgICAgLUVMICAgICAgICAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbiBjcHUKLSAqICAgIEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZDoKLSAqCSAgICAgIC1tYXBjcy0zMgkJICAgICAgMzIgYml0IEFQQ1MKLSAqCSAgICAgIC1tYXBjcy0yNgkJICAgICAgMjYgYml0IEFQQ1MKLSAqCSAgICAgIC1tYXBjcy1mbG9hdAkgICAgICBQYXNzIGZsb2F0cyBpbiBmbG9hdCByZWdzCi0gKgkgICAgICAtbWFwY3MtcmVlbnRyYW50ICAgICAgICBQb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlCi0gKiAgICAgICAgICAgIC1tdGh1bWItaW50ZXJ3b3JrICAgICAgIENvZGUgc3VwcG9ydHMgQXJtL1RodW1iIGludGVyd29ya2luZwotICogICAgICAgICAgICAtbW9hYmkgICAgICAgICAgICAgICAgICBPbGQgRUxGIEFCSQotICovCi0KLUNPTlNUIGNoYXIgKiBtZF9zaG9ydG9wdHMgPSAibTprIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jaWZkZWYgQVJNX0JJX0VORElBTgotI2RlZmluZSBPUFRJT05fRUIgKE9QVElPTl9NRF9CQVNFICsgMCkKLSAgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUJ9LAotI2RlZmluZSBPUFRJT05fRUwgKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUx9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OX09BQkkgKE9QVElPTl9NRF9CQVNFICsyKQotICB7Im9hYmkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09BQkl9LAotI2VuZGlmCi0jZW5kaWYKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCAgICBjOwotICAgICBjaGFyICogYXJnOwotewotICBjaGFyICogc3RyID0gYXJnOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0jaWZkZWYgQVJNX0JJX0VORElBTgotICAgIGNhc2UgT1BUSU9OX0VCOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRUw6Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSAnbSc6Ci0gICAgICBzd2l0Y2ggKCpzdHIpCi0JewotCWNhc2UgJ2YnOgotCSAgaWYgKHN0cmVxIChzdHIsICJmcGExMCIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9GUEExMDsKLQkgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcGExMSIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9GUEExMTsKLQkgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcGUtb2xkIikpCi0JICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkZQVV9BTEwpIHwgRlBVX0NPUkU7Ci0JICBlbHNlCi0JICAgIGdvdG8gYmFkOwotCSAgYnJlYWs7Ci0KLQljYXNlICduJzoKLQkgIGlmIChzdHJlcSAoc3RyLCAibm8tZnB1IikpCi0JICAgIGNwdV92YXJpYW50ICY9IH5GUFVfQUxMOwotCSAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgIGlmIChzdHJlcSAoc3RyLCAib2FiaSIpKQotICAgICAgICAgICAgdGFyZ2V0X29hYmkgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0JICAKLSAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgLyogTGltaXQgYXNzZW1ibGVyIHRvIGdlbmVyYXRpbmcgb25seSBUaHVtYiBpbnN0cnVjdGlvbnM6ICovCi0gICAgICAgICAgaWYgKHN0cmVxIChzdHIsICJ0aHVtYiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9USFVNQjsKLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfTk9ORTsKLSAgICAgICAgICAgICAgdGh1bWJfbW9kZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInRodW1iLWludGVyd29yayIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9USFVNQiB8IEFSTV9BUkNIX1Y0OwotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gICAgICAgICAgICAgIHN1cHBvcnRfaW50ZXJ3b3JrID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLQkgICAgZ290byBiYWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHN0cmVxIChzdHIsICJhbGwiKSkKLQkgICAgewotCSAgICAgIGNwdV92YXJpYW50ID0gQVJNX0FMTCB8IEZQVV9BTEw7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIH0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotCSAgaWYgKCEgc3RybmNtcCAoc3RyLCAiYXBjcy0iLCA1KSkKLQkgICAgewotCSAgICAgIC8qIEdDQyBwYXNzZXMgb24gYWxsIGNvbW1hbmQgbGluZSBvcHRpb25zIHN0YXJ0aW5nICItbWFwY3MtLi4uIgotCQkgdG8gdXMsIHNvIHdlIG11c3QgcGFyc2UgdGhlbSBoZXJlLiAgKi8KLQotCSAgICAgIHN0ciArPSA1OwotCSAgICAgIAotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMzIiKSkKLQkJewotCQkgIHVzZXNfYXBjc18yNiA9IGZhbHNlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjI2IikpCi0JCXsKLQkJICB1c2VzX2FwY3NfMjYgPSB0cnVlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgImZyYW1lIikpCi0JCXsKLQkJICAvKiBTdGFjayBmcmFtZXMgYXJlIGJlaW5nIGdlbmVyYXRlZCAtIGRvZXMgbm90IGFmZmVjdAotCQkgICAgIGxpbmthZ2Ugb2YgY29kZS4gICovCi0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAic3RhY2stY2hlY2siKSkKLQkJewotCQkgIC8qIFN0YWNrIGNoZWNraW5nIGlzIGJlaW5nIHBlcmZvcm1lZCAtIGRvZXMgbm90IGFmZmVjdAotCQkgICAgIGxpbmthZ2UsIGJ1dCBkb2VzIHJlcXVpcmUgdGhhdCB0aGUgZnVuY3Rpb25zCi0JCSAgICAgX19ydF9zdGtvdmZfc3BsaXRfc21hbGwgYW5kIF9fcnRfc3Rrb3ZmX3NwbGl0X2JpZyBiZQotCQkgICAgIHByZXNlbnQgaW4gdGhlIGZpbmFsIGxpbmsuICAqLwotCi0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZmxvYXQiKSkKLQkJewotCQkgIC8qIEZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBhcmUgYmVpbmcgcGFzc2VkIGluIHRoZSBmbG9hdGluZwotCQkgICAgIHBvaW50IHJlZ2lzdGVycy4gIFRoaXMgZG9lcyBhZmZlY3QgbGlua2luZywgc2luY2UgdGhpcwotCQkgICAgIHZlcnNpb24gb2YgdGhlIEFQQ1MgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdAotCQkgICAgIHBhc3NlcyBmbG9hdGluZyBwb2ludHMgaW4gdGhlIGludGVnZXIgcmVnaXN0ZXJzLiAgKi8KLQotCQkgIHVzZXNfYXBjc19mbG9hdCA9IHRydWU7Ci0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAicmVlbnRyYW50IikpCi0JCXsKLQkJICAvKiBSZWVudHJhbnQgY29kZSBoYXMgYmVlbiBnZW5lcmF0ZWQuICBUaGlzIGRvZXMgYWZmZWN0Ci0JCSAgICAgbGlua2luZywgc2luY2UgdGhlcmUgaXMgbm8gcG9pbnQgaW4gbGlua2luZyByZWVudHJhbnQvCi0JCSAgICAgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSB3aXRoIGFic29sdXRlIHBvc2l0aW9uIGNvZGUuICovCi0JCSAgcGljX2NvZGUgPSB0cnVlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgCi0JICAgICAgYXNfYmFkIChfKCJVbnJlY29nbmlzZWQgQVBDUyBzd2l0Y2ggLW0lcyIpLCBhcmcpOwotCSAgICAgIHJldHVybiAwOwotICAJICAgIH0KLSNlbmRpZgotCSAgLyogU3RyaXAgb2ZmIG9wdGlvbmFsICJhcm0iICovCi0JICBpZiAoISBzdHJuY21wIChzdHIsICJhcm0iLCAzKSkKLQkgICAgc3RyICs9IDM7Ci0KLQkgIHN3aXRjaCAoKnN0cikKLQkgICAgewotCSAgICBjYXNlICcxJzoKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjEiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMTsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzInOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMiIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8yOwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICIyNTAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMjUwOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMyc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICIzIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzM7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc2JzoKLQkgICAgICBzd2l0Y2ggKHN0cnRvbCAoc3RyLCBOVUxMLCAxMCkpCi0JCXsKLQkJY2FzZSA2OgotCQljYXNlIDYwOgotCQljYXNlIDYwMDoKLQkJY2FzZSA2MTA6Ci0JCWNhc2UgNjIwOgotCQkgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzY7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZ290byBiYWQ7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc3JzoKLQkgICAgICBzd2l0Y2ggKHN0cnRvbCAoc3RyLCAmIHN0ciwgMTApKQkvKiBFYXQgdGhlIHByb2Nlc3NvciBuYW1lICovCi0JCXsKLQkJY2FzZSA3OgotCQljYXNlIDcwOgotCQljYXNlIDcwMDoKLQkJY2FzZSA3MTA6Ci0JCWNhc2UgNzEwMDoKLQkJY2FzZSA3NTAwOgotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGdvdG8gYmFkOwotCQl9Ci0gICAgICAgICAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzc7Ci0gICAgICAgICAgICAgIGZvciAoOyAqc3RyOyBzdHIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICgqIHN0cikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICBjcHVfdmFyaWFudCB8PSAoQVJNX1RIVU1CIHwgQVJNX0FSQ0hfVjQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgIGNwdV92YXJpYW50IHw9IEFSTV9MT05HTVVMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCQkgIGNhc2UgJ2YnOiAvKiBmZSA9PiBmcCBlbmFibGVkIGNwdS4gICovCi0JCSAgICBpZiAoc3RyWzFdID09ICdlJykKLQkJICAgICAgKysgc3RyOwotCQkgICAgZWxzZQotCQkgICAgICBnb3RvIGJhZDsKLQkJICAgIAotCQkgIGNhc2UgJ2MnOiAvKiBMZWZ0IG92ZXIgZnJvbSA3MTBjIHByb2Nlc3NvciBuYW1lLiAgKi8KLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiAvKiBEZWJ1ZyAqLwotICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6IC8qIEVtYmVkZGVkIElDRSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGluIEFSTSBwcm9jZXNzb3IgbmFtaW5nLiAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZ290byBiYWQ7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzgnOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiOCIpIHx8IHN0cmVxIChzdHIsICI4MTAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOCB8IEFSTV9BUkNIX1Y0IHwgQVJNX0xPTkdNVUw7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSAnOSc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICI5IikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICI5MjAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOSB8IEFSTV9BUkNIX1Y0IHwgQVJNX0xPTkdNVUw7Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjkyMHQiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOSB8IEFSTV9BUkNIX1Y0IHwgQVJNX0xPTkdNVUwgfCBBUk1fVEhVTUI7Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjl0ZG1pIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAic3Ryb25nYXJtIikKLQkJICB8fCBzdHJlcSAoc3RyLCAic3Ryb25nYXJtMTEwIikKLQkJICB8fCBzdHJlcSAoc3RyLCAic3Ryb25nYXJtMTEwMCIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV84IHwgQVJNX0FSQ0hfVjQgfCBBUk1fTE9OR01VTDsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCQkKLQkgICAgY2FzZSAndic6Ci0JICAgICAgLyogU2VsZWN0IHZhcmlhbnQgYmFzZWQgb24gYXJjaGl0ZWN0dXJlIHJhdGhlciB0aGFuIHByb2Nlc3NvciAqLwotCSAgICAgIHN3aXRjaCAoKisrc3RyKQotCQl7Ci0JCWNhc2UgJzInOgotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAnYSc6IGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzM7IGJyZWFrOwotCQkgICAgY2FzZSAwOiAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzI7IGJyZWFrOwotCQkgICAgZGVmYXVsdDogIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7IGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICczJzoKLQkJICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzc7Ci0gICAgICAgICAgICAgICAgICAgIAotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAnbSc6IGNwdV92YXJpYW50IHw9IEFSTV9MT05HTVVMOyBicmVhazsKLQkJICAgIGNhc2UgMDogICBicmVhazsKLQkJICAgIGRlZmF1bHQ6ICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOyBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSAnNCc6Ci0JCSAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fQVJDSF9WNDsKLQkJICAKLQkJICBzd2l0Y2ggKCorK3N0cikKLQkJICAgIHsKLQkJICAgIGNhc2UgJ3QnOiBjcHVfdmFyaWFudCB8PSBBUk1fVEhVTUI7IGJyZWFrOwotCQkgICAgY2FzZSAwOiAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDogIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7IGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICc1JzoKLQkJICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9BUkNIX1Y1OwotCQkgIAotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAndCc6IGNwdV92YXJpYW50IHw9IEFSTV9USFVNQjsgYnJlYWs7Ci0JCSAgICBjYXNlIDA6ICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OiAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICBiYWQ6Ci0JICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIHByb2Nlc3NvciB2YXJpYW50IC1tJXMiKSwgYXJnKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnayc6Ci0gICAgICBwaWNfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChmcCkKLSAgICAgRklMRSAqIGZwOwotewotICBmcHJpbnRmIChmcCwKLV8oIlwKLSBBUk0gU3BlY2lmaWMgQXNzZW1ibGVyIE9wdGlvbnM6XG5cCi0gIC1tW2FybV1bPHByb2Nlc3NvciBuYW1lPl0gc2VsZWN0IHByb2Nlc3NvciB2YXJpYW50XG5cCi0gIC1tW2FybV12WzJ8MmF8M3wzbXw0fDR0fDVdc2VsZWN0IGFyY2hpdGVjdHVyZSB2YXJpYW50XG5cCi0gIC1tdGh1bWIgICAgICAgICAgICAgICAgICAgb25seSBhbGxvdyBUaHVtYiBpbnN0cnVjdGlvbnNcblwKLSAgLW10aHVtYi1pbnRlcndvcmsgICAgICAgICBtYXJrIHRoZSBhc3NlbWJsZWQgY29kZSBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZ1xuXAotICAtbWFsbCAgICAgICAgICAgICAgICAgICAgIGFsbG93IGFueSBpbnN0cnVjdGlvblxuXAotICAtbWZwYTEwLCAtbWZwYTExICAgICAgICAgIHNlbGVjdCBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmVcblwKLSAgLW1mcGUtb2xkICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBmbG9hdGluZy1wb2ludCBtdWx0aXBsZSBpbnN0cnVjdGlvbnNcblwKLSAgLW1uby1mcHUgICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBhbnkgZmxvYXRpbmctcG9pbnQgaW5zdHJ1Y3Rpb25zLlxuIikpOwotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLWsgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBQSUMgY29kZS5cbiIpKTsKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLW1hcGNzLTMyLCAtbWFwY3MtMjYgICAgICBzcGVjaWZ5IHdoaWNoIEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZCB0byB1c2VcbiIpKTsKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1tYXBjcy1mbG9hdCAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgYXJncyBhcmUgcGFzc2VkIGluIEZQIHJlZ3NcbiIpKTsKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1tYXBjcy1yZWVudHJhbnQgICAgICAgICAgdGhlIGNvZGUgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQvcmVlbnRyYW50XG4iKSk7Ci0gICNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1tb2FiaSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgb2xkIEVMRiBBQklcbiIpKTsKLSNlbmRpZgotI2lmZGVmIEFSTV9CSV9FTkRJQU4KLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1FQiAgICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIGNwdVxuXAotICAtRUwgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBjcHVcbiIpKTsKLSNlbmRpZgotfQotCi0vKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZml4IHVwIGFyYml0cmFyeSBleHByZXNzaW9ucyBpbiBzb21lIHN0YXRlbWVudHMuCi0gICBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBzeW1ib2xzIHRoYXQgYXJlIGFuIGFyYml0cmFyeSBkaXN0YW5jZSBmcm9tCi0gICB0aGUgcGMuICBUaGUgbW9zdCBjb21tb24gY2FzZXMgYXJlIG9mIHRoZSBmb3JtICgoKy8tc3ltIC0vKyAuIC0gOCkgJiBtYXNrKSwKLSAgIHdoaWNoIHJldHVybnMgcGFydCBvZiBhbiBhZGRyZXNzIGluIGEgZm9ybSB3aGljaCB3aWxsIGJlIHZhbGlkIGZvcgotICAgYSBkYXRhIGluc3RydWN0aW9uLiAgV2UgZG8gdGhpcyBieSBwdXNoaW5nIHRoZSBleHByZXNzaW9uIGludG8gYSBzeW1ib2wKLSAgIGluIHRoZSBleHByX3NlY3Rpb24sIGFuZCBjcmVhdGluZyBhIGZpeCBmb3IgdGhhdC4gICovCi0KLXN0YXRpYyB2b2lkCi1maXhfbmV3X2FybSAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNfcmVsLCByZWxvYykKLSAgICAgZnJhZ1MgKiAgICAgICBmcmFnOwotICAgICBpbnQgICAgICAgICAgIHdoZXJlOwotICAgICBzaG9ydCBpbnQgICAgIHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICogZXhwOwotICAgICBpbnQgICAgICAgICAgIHBjX3JlbDsKLSAgICAgaW50ICAgICAgICAgICByZWxvYzsKLXsKLSAgZml4UyAqICAgICAgICAgbmV3X2ZpeDsKLSAgYXJtX2ZpeF9kYXRhICogYXJtX2RhdGE7Ci0KLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICBjYXNlIE9fc3ltYm9sOgotICAgIGNhc2UgT19hZGQ6Ci0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgbmV3X2ZpeCA9IGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY19yZWwsIHJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIG5ld19maXggPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgbWFrZV9leHByX3N5bWJvbCAoZXhwKSwgMCwKLQkJCSBwY19yZWwsIHJlbG9jKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBNYXJrIHdoZXRoZXIgdGhlIGZpeCBpcyB0byBhIFRIVU1CIGluc3RydWN0aW9uLCBvciBhbiBBUk0gaW5zdHJ1Y3Rpb24gKi8KLSAgYXJtX2RhdGEgPSAoYXJtX2ZpeF9kYXRhICopIG9ic3RhY2tfYWxsb2MgKCYgbm90ZXMsIHNpemVvZiAoYXJtX2ZpeF9kYXRhKSk7Ci0gIG5ld19maXgtPnRjX2ZpeF9kYXRhID0gKFBUUikgYXJtX2RhdGE7Ci0gIGFybV9kYXRhLT50aHVtYl9tb2RlID0gdGh1bWJfbW9kZTsKLQotICByZXR1cm47Ci19Ci0KLQotLyoKLSAqIFRoaXMgZml4X25ldyBpcyBjYWxsZWQgYnkgY29ucyB2aWEgVENfQ09OU19GSVhfTkVXCi0gKgotICogV2UgY2hlY2sgdGhlIGV4cHJlc3Npb24gdG8gc2VlIGlmIGl0IGlzIG9mIHRoZSBmb3JtCi0gKiAgX19HTE9CQUxfT0ZGU0VUX1RBQkxFICsgPz8/Ci0gKiBJZiBpdCBpcyB0aGVuIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWZlcmVuY2UgdG8gdGhlIEdPVC4KLSAqIGkuZS4KLSAqIAlsZHIJc2wsIEwxCi0gKiAJYWRkCXNsLCBwYywgc2wKLSAqIEwyOgotICogCS4uLgotICogTDE6Ci0gKgkud29yZAlfX0dMT0JBTF9PRkZTRVRfVEFCTEUgKyAoLiAtIChMMiArIDQpKQotICoKLSAqIEluIHRoaXMgY2FzZSB1c2UgYSByZWxvYyB0eXBlIEJGRF9SRUxPQ19BUk1fR09UUEMgaW5zdGVhZCBvZiB0aGUKLSAqIG5vcm1hbCBCRkRfUkVMT0NfezE2LDMyLDY0fQotICovCi0KLXZvaWQKLWNvbnNfZml4X25ld19hcm0gKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICogICAgICAgZnJhZzsKLSAgICAgaW50ICAgICAgICAgICB3aGVyZTsKLSAgICAgaW50ICAgICAgICAgICBzaXplOwotICAgICBleHByZXNzaW9uUyAqIGV4cDsKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHR5cGU7Ci0gIGludCBwY3JlbCA9IDA7Ci0gIAotICAvKiBQaWNrIGEgcmVsb2MgLi4uCi0gICAqCi0gICAqIEBAIFNob3VsZCBsb29rIGF0IENQVSB3b3JkIHNpemUuCi0gICAqLwotICBzd2l0Y2ggKHNpemUpIAotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICB0eXBlID0gQkZEX1JFTE9DXzE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgIGRlZmF1bHQ6Ci0gICAgICB0eXBlID0gQkZEX1JFTE9DXzMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgdHlwZSA9IEJGRF9SRUxPQ182NDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIC8qIExvb2sgZm9yIHBvc3NpYmxlIEdPVFBDIHJlbG9jICovCi0gIAotICAvKgotICAgKiBMb29rIGZvciBwaWMgYXNzZW1ibGVyIGFuZCAndW5kZWYgc3ltYm9sICsgZXhwciBzeW1ib2wnIGV4cHJlc3Npb24KLSAgICogYW5kIGEgMzIgYml0IHNpemUuCi0gICAqLwotICAKLSAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCAoaW50KSBzaXplLCBleHAsIHBjcmVsLCB0eXBlKTsKLX0KLQotLyogQSBnb29kIHBsYWNlIHRvIGRvIHRoaXMsIGFsdGhvdWdoIHRoaXMgd2FzIHByb2JhYmx5IG5vdCBpbnRlbmRlZAotICogZm9yIHRoaXMga2luZCBvZiB1c2UuICBXZSBuZWVkIHRvIGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUKLSAqIHJlZmVyZW5jZXMgYXJlIG1hZGUgdG8gYSBudWxsIHN5bWJvbCBwb2ludGVyLiAgKi8KLXZvaWQKLWFybV9jbGVhbnVwICgpCi17Ci0gIGlmIChjdXJyZW50X3Bvb2xQICE9IE5VTEwpCi0gICAgewotICAgICAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsgLyogUHV0IGl0IGF0IHRoZSBlbmQgb2YgdGV4dCBzZWN0aW9uICovCi0gICAgICBzX2x0b3JnICgwKTsKLSAgICAgIGxpc3RpbmdfcHJldl9saW5lICgpOwotICAgIH0KLX0KLQotdm9pZAotYXJtX3N0YXJ0X2xpbmVfaG9vayAoKQotewotICBsYXN0X2xhYmVsX3NlZW4gPSBOVUxMOwotfQotCi12b2lkCi1hcm1fZnJvYl9sYWJlbCAoc3ltKQotICAgICBzeW1ib2xTICogc3ltOwotewotICBsYXN0X2xhYmVsX3NlZW4gPSBzeW07Ci0gIAotICBBUk1fU0VUX1RIVU1CIChzeW0sIHRodW1iX21vZGUpOwotICAKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICBBUk1fU0VUX0lOVEVSV09SSyAoc3ltLCBzdXBwb3J0X2ludGVyd29yayk7Ci0jZW5kaWYKLSAgCi0gIGlmIChsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lKQotICAgIHsKLSAgICAgIC8qIFdoZW4gdGhlIGFkZHJlc3Mgb2YgYSBUaHVtYiBmdW5jdGlvbiBpcyB0YWtlbiB0aGUgYm90dG9tCi0JIGJpdCBvZiB0aGF0IGFkZHJlc3Mgc2hvdWxkIGJlIHNldC4gIFRoaXMgd2lsbCBhbGxvdwotCSBpbnRlcndvcmtpbmcgYmV0d2VlbiBBcm0gYW5kIFRodW1iIGZ1bmN0aW9ucyB0byB3b3JrCi0JIGNvcnJlY3RseS4gICovCi0KLSAgICAgIFRIVU1CX1NFVF9GVU5DIChzeW0sIDEpOwotICAgICAgCi0gICAgICBsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lID0gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgbWFya3MgVGh1bWIgc3ltYm9scyBhcyBkaXN0aW5jdCBmcm9tCi0gICBBUk0gb25lcy4gICovCi0KLXZvaWQKLWFybV9hZGp1c3Rfc3ltdGFiICgpCi17Ci0jaWZkZWYgT0JKX0NPRkYKLSAgc3ltYm9sUyAqIHN5bTsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChBUk1fSVNfVEhVTUIgKHN5bSkpCi0gICAgICAgIHsKLQkgIGlmIChUSFVNQl9JU19GVU5DIChzeW0pKQotCSAgICB7Ci0JICAgICAgLyogTWFyayB0aGUgc3ltYm9sIGFzIGEgVGh1bWIgZnVuY3Rpb24uICAqLwotCSAgICAgIGlmICggICBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfU1RBVAotCQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19MQUJFTCkgLyogVGhpcyBjYW4gaGFwcGVuISAqLwotCQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJTVEFURlVOQyk7Ci0KLQkgICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUKQotCQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJFWFRGVU5DKTsKLQkgICAgICBlbHNlCi0JCWFzX2JhZCAoXygiJXM6IHVuZXhwZWN0ZWQgZnVuY3Rpb24gdHlwZTogJWQiKSwKLQkJCVNfR0VUX05BTUUgKHN5bSksIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkpOwotCSAgICB9Ci0gICAgICAgICAgZWxzZSBzd2l0Y2ggKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgQ19FWFQ6Ci0gICAgICAgICAgICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CRVhUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBDX1NUQVQ6Ci0gICAgICAgICAgICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CU1RBVCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQ19MQUJFTDoKLSAgICAgICAgICAgICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJMQUJFTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGRvIG5vdGhpbmcgKi8gCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgaWYgKEFSTV9JU19JTlRFUldPUksgKHN5bSkpCi0JY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSAweEZGOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgc3ltYm9sUyAqICAgICAgICAgc3ltOwotICBlbGZfc3ltYm9sX3R5cGUgKiBlbGZfc3ltOwotICBjaGFyICAgICAgICAgICAgICBiaW5kOwotCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKEFSTV9JU19USFVNQiAoc3ltKSkKLSAgICAgICAgewotCSAgaWYgKFRIVU1CX0lTX0ZVTkMgKHN5bSkpCi0JICAgIHsKLQkgICAgICBlbGZfc3ltID0gZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpOwotCSAgICAgIGJpbmQgPSBFTEZfU1RfQklORCAoZWxmX3N5bSk7Ci0JICAgICAgZWxmX3N5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGJpbmQsIFNUVF9BUk1fVEZVTkMpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICB9Ci0jZW5kaWYKLX0KLQotaW50Ci1hcm1fZGF0YV9pbl9jb2RlICgpCi17Ci0gIGlmICh0aHVtYl9tb2RlICYmICEgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyICsgMSwgImRhdGE6IiwgNSkpCi0gICAgewotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICcvJzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1hcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChuYW1lKQotICAgICBjaGFyICogbmFtZTsKLXsKLSAgaW50IGxlbjsKLQotICBpZiAodGh1bWJfbW9kZSAmJiAobGVuID0gc3RybGVuIChuYW1lKSkgPiA1Ci0gICAgICAmJiBzdHJlcSAobmFtZSArIGxlbiAtIDUsICIvZGF0YSIpKQotICAgIHsKLSAgICAgICoobmFtZSArIGxlbiAtIDUpID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLWJvb2xlYW4KLWFybV92YWxpZGF0ZV9maXggKGZpeFApCi0gICAgIGZpeFMgKiBmaXhQOwotewotICAvKiBJZiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGJyYW5jaCBpcyBhIGRlZmluZWQgc3ltYm9sIHdoaWNoIGRvZXMgbm90IGhhdmUKLSAgICAgdGhlIFRIVU1CX0ZVTkMgYXR0cmlidXRlLCB0aGVuIHdlIG11c3QgYmUgY2FsbGluZyBhIGZ1bmN0aW9uIHdoaWNoIGhhcwotICAgICB0aGUgKGludGVyZmFjZWFybSkgYXR0cmlidXRlLiAgV2UgbG9vayBmb3IgdGhlIFRodW1iIGVudHJ5IHBvaW50IHRvIHRoYXQKLSAgICAgZnVuY3Rpb24gYW5kIGNoYW5nZSB0aGUgYnJhbmNoIHRvIHJlZmVyIHRvIHRoYXQgZnVuY3Rpb24gaW5zdGVhZC4gICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgJiYgISBUSFVNQl9JU19GVU5DIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBmaW5kX3JlYWxfc3RhcnQgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBSZWxvY2F0aW9ucyBhZ2FpbnN0IFRodW1iIGZ1bmN0aW9uIG5hbWVzIG11c3QgYmUgbGVmdCB1bmFkanVzdGVkLAotICAgc28gdGhhdCB0aGUgbGlua2VyIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBjb3JyZWN0bHkgc2V0IHRoZQotICAgYm90dG9tIGJpdCBvZiB0aGVpciBhZGRyZXNzZXMuICBUaGUgTUlQUyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24KLSAgIGFsc28gcHJldmVudHMgcmVsb2NhdGlvbnMgdGhhdCBhcmUgbWlwcy0xNiBzcGVjaWZpYywgYnV0IEkgZG8gbm90Ci0gICBrbm93IHdoeSBpdCBkb2VzIHRoaXMuCi0KLSAgIEZJWE1FOgotICAgVGhlcmUgaXMgb25lIG90aGVyIHByb2JsZW0gdGhhdCBvdWdodCB0byBiZSBhZGRyZXNzZWQgaGVyZSwgYnV0Ci0gICB3aGljaCBjdXJyZW50bHkgaXMgbm90OiAgVGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgbGFiZWwgKHJhdGhlcgotICAgdGhhbiBhIGZ1bmN0aW9uKSBhbmQgdGhlbiBsYXRlciBqdW1waW5nIHRvIHRoYXQgYWRkcmVzcy4gIFN1Y2gKLSAgIGFkZHJlc3NlcyBhbHNvIG91Z2h0IHRvIGhhdmUgdGhlaXIgYm90dG9tIGJpdCBzZXQgKGFzc3VtaW5nIHRoYXQKLSAgIHRoZXkgcmVzaWRlIGluIFRodW1iIGNvZGUpLCBidXQgYXQgdGhlIG1vbWVudCB0aGV5IHdpbGwgbm90LiAgKi8KLSAgIAotYm9vbGVhbgotYXJtX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqIGZpeFA7Ci17Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKFRIVU1CX0lTX0ZVTkMgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgJiYgZml4UC0+Znhfc3Vic3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQotCi1jb25zdCBjaGFyICoKLWVsZjMyX2FybV90YXJnZXRfZm9ybWF0ICgpCi17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBpZiAodGFyZ2V0X29hYmkpCi0gICAgICByZXR1cm4gImVsZjMyLWJpZ2FybS1vYWJpIjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gImVsZjMyLWJpZ2FybSI7Ci0gIGVsc2UKLSAgICBpZiAodGFyZ2V0X29hYmkpCi0gICAgICByZXR1cm4gImVsZjMyLWxpdHRsZWFybS1vYWJpIjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gImVsZjMyLWxpdHRsZWFybSI7Ci19Ci0KLXZvaWQKLWFybWVsZl9mcm9iX3N5bWJvbCAoc3ltcCwgcHVudHApCi0gICAgIHN5bWJvbFMgKiBzeW1wOwotICAgICBpbnQgKiBwdW50cDsKLXsKLSAgZWxmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50cCk7Ci19IAotCi1pbnQKLWFybV9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICBzdHJ1Y3QgZml4ICogZml4cDsKLXsKLSAgaWYgKCAgIGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gpICAgIAotICAgIHJldHVybiAxOwotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWFybV9wYXJzZV9yZWxvYyAoKQotewotICBjaGFyICAgaWRbMTZdOwotICBjaGFyICogaXA7Ci0gIGludCAgICBpOwotICBzdGF0aWMgc3RydWN0Ci0gIHsKLSAgICBjaGFyICogc3RyOwotICAgIGludCAgICBsZW47Ci0gICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICB9Ci0gIHJlbG9jX21hcFtdID0KLSAgewotI2RlZmluZSBNQVAoc3RyLHJlbG9jKSB7IHN0ciwgc2l6ZW9mIChzdHIpLTEsIHJlbG9jIH0KLSAgICBNQVAgKCIoZ290KSIsICAgIEJGRF9SRUxPQ19BUk1fR09UMzIpLAotICAgIE1BUCAoIihnb3RvZmYpIiwgQkZEX1JFTE9DX0FSTV9HT1RPRkYpLAotICAgIC8qIFNjb3R0QjogSmFuIDMwLCAxOTk4ICovCi0gICAgLyogQWRkZWQgc3VwcG9ydCBmb3IgcGFyc2luZyAidmFyKFBMVCkiIGJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLSAgICAvKiBnZW5lcmF0ZWQgYnkgR0NDIGZvciBQTFQgcmVsb2NzICovCi0gICAgTUFQICgiKHBsdCkiLCAgICBCRkRfUkVMT0NfQVJNX1BMVDMyKSwKLSAgICBOVUxMLCAwLCAgICAgICAgIEJGRF9SRUxPQ19VTlVTRUQKLSN1bmRlZiBNQVAgICAgCi0gIH07Ci0KLSAgZm9yIChpID0gMCwgaXAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAgaSA8IHNpemVvZiAoaWQpICYmIChpc2FsbnVtICgqaXApIHx8IGlzcHVuY3QgKCppcCkpOwotICAgICAgIGkrKywgaXArKykKLSAgICBpZFtpXSA9IHRvbG93ZXIgKCppcCk7Ci0gIAotICBmb3IgKGkgPSAwOyByZWxvY19tYXBbaV0uc3RyOyBpKyspCi0gICAgaWYgKHN0cm5jbXAgKGlkLCByZWxvY19tYXBbaV0uc3RyLCByZWxvY19tYXBbaV0ubGVuKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIAotICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gcmVsb2NfbWFwW2ldLmxlbjsKLSAgCi0gIHJldHVybiByZWxvY19tYXBbaV0ucmVsb2M7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FybV9lbGZfY29ucyAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgbWRfY29uc19hbGlnbgotICBtZF9jb25zX2FsaWduIChuYnl0ZXMpOwotI2VuZGlmCi0KLSAgZG8KLSAgICB7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgICAKLSAgICAgIGV4cHJlc3Npb24gKCYgZXhwKTsKLQotICAgICAgaWYgKGV4cC5YX29wID09IE9fc3ltYm9sCi0gICAgICAgICAgJiYgKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJygnCi0gICAgICAgICAgJiYgKHJlbG9jID0gYXJtX3BhcnNlX3JlbG9jKCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgICAgIHsKLSAgICAgICAgICByZWxvY19ob3d0b190eXBlICogaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcmVsb2MpOwotICAgICAgICAgIGludCBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0KLSAgICAgICAgICBpZiAoc2l6ZSA+IG5ieXRlcykKLSAgICAgICAgICAgIGFzX2JhZCAoIiVzIHJlbG9jYXRpb25zIGRvIG5vdCBmaXQgaW4gJWQgYnl0ZXMiLCBob3d0by0+bmFtZSwgbmJ5dGVzKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZ2lzdGVyIGNoYXIgKiBwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gbmJ5dGVzIC0gc2l6ZTsKLQotICAgICAgICAgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwgc2l6ZSwKLQkJCSAgICYgZXhwLCAwLCByZWxvYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZW1pdF9leHByICgmIGV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRUxGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFybS5oIGIvZ2FzL2NvbmZpZy90Yy1hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhNTcxMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1hcm0uaAotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0JTW9kaWZpZWQgYnkgRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19BUk0gMQotCi0jaWZuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBDT0ZGX01BR0lDIAlBUk1NQUdJQwotI2RlZmluZSBUQVJHRVRfQVJDSCAJYmZkX2FyY2hfYXJtCi0KLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAJMAotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwotCi0jaWZkZWYgIExJVFRMRV9FTkRJQU4KLSN1bmRlZiAgTElUVExFX0VORElBTgotI2VuZGlmCi0KLSNpZmRlZiAgQklHX0VORElBTgotI3VuZGVmICBCSUdfRU5ESUFOCi0jZW5kaWYKLQotI2RlZmluZSBMSVRUTEVfRU5ESUFOIAkxMjM0Ci0jZGVmaW5lIEJJR19FTkRJQU4gCTQzMjEKLQotI2lmIGRlZmluZWQgT0JKX0FPVVQKLSNpZiBkZWZpbmVkIFRFX1JJU0NJWAotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtcmlzY2l4IgotI2VsaWYgZGVmaW5lZCBURV9MSU5VWAotIyBkZWZpbmUgQVJNX0JJX0VORElBTgotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtYXJtLWxpbnV4IgotI2VsaWYgZGVmaW5lZCBURV9OZXRCU0QKLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LWFybS1uZXRic2QiCi0jZWxzZQotIyBkZWZpbmUgQVJNX0JJX0VORElBTgotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCBcCi0gICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJhLm91dC1hcm0tYmlnIiA6ICJhLm91dC1hcm0tbGl0dGxlIikKLSNlbmRpZgotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0KLSNpZmRlZiBPQkpfQUlGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImFpZiIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSMgZGVmaW5lIEFSTV9CSV9FTkRJQU4KLSAgICAgCi0jIGRlZmluZSBUQ19WQUxJREFURV9GSVgoZml4UCwgc2VnVHlwZSwgTGFiZWwpIFwKLSAgICAgaWYgKGFybV92YWxpZGF0ZV9maXggKGZpeFApKSBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5Ci0gIGV4dGVybiBib29sZWFuIGFybV92YWxpZGF0ZV9maXggUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZW5kaWYKLSAgICAgCi0jaWZkZWYgT0JKX0NPRkYKLSMgaWYgZGVmaW5lZCBURV9QRQotIyAgZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oeCkgKCh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19SVkEpCi0jICAgaWZkZWYgVEVfRVBPQwotIyAgICBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiZXBvYy1wZS1hcm0tYmlnIiA6ICJlcG9jLXBlLWFybS1saXR0bGUiKQotIyAgIGVsc2UKLSMgICAgZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gInBlLWFybS1iaWciIDogInBlLWFybS1saXR0bGUiKQotIyAgIGVuZGlmCi0jIGVsc2UKLSMgIGRlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJjb2ZmLWFybS1iaWciIDogImNvZmYtYXJtLWxpdHRsZSIpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQoKQotICBleHRlcm4gY29uc3QgY2hhciAqIGVsZjMyX2FybV90YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKLSAgCi0jIGRlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIGFybV9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICBleHRlcm4gaW50IGFybV9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIsIHMsIGYpIHthc19mYXRhbCAoXygiYXJtIGNvbnZlcnRfZnJhZ1xuIikpO30KLQotI2RlZmluZSBtZF9jbGVhbnVwKCkgYXJtX2NsZWFudXAgKCkKLSBleHRlcm4gdm9pZCBhcm1fY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgbWRfc3RhcnRfbGluZV9ob29rKCkgYXJtX3N0YXJ0X2xpbmVfaG9vayAoKQotIGV4dGVybiB2b2lkIGFybV9zdGFydF9saW5lX2hvb2sgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoUykgYXJtX2Zyb2JfbGFiZWwgKFMpCi0gZXh0ZXJuIHZvaWQgYXJtX2Zyb2JfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIFdlIGFsc28gbmVlZCB0byBtYXJrIGFzc2VtYmxlciBjcmVhdGVkIHN5bWJvbHM6ICAqLwotI2RlZmluZSB0Y19mcm9iX2Zha2VfbGFiZWwoUykgYXJtX2Zyb2JfbGFiZWwgKFMpCi0KLS8qIE5PVEU6IFRoZSBmYWtlIGxhYmVsIGNyZWF0aW9uIGluIHN0YWJzLmM6c19zdGFiX2dlbmVyaWMoKSBoYXMKLSAgIGRlbGliZXJhdGVseSBub3QgYmVlbiB1cGRhdGVkIHRvIG1hcmsgYXNzZW1ibGVyIGNyZWF0ZWQgc3RhYnMKLSAgIHN5bWJvbHMgYXMgVGh1bWIuICAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgYXJtX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotI2Vsc2UKLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIDAKLSNlbmRpZgotCi0vKiBXZSBuZWVkIHRvIGtlZXAgc29tZSBsb2NhbCBpbmZvcm1hdGlvbiBvbiBzeW1ib2xzLiAgKi8KLQotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHVuc2lnbmVkIGludAotI2RlZmluZSBBUk1fR0VUX0ZMQUcocykgICAJKCpzeW1ib2xfZ2V0X3RjIChzKSkKLSNkZWZpbmUgQVJNX1NFVF9GTEFHKHMsdikgCSgqc3ltYm9sX2dldF90YyAocykgfD0gKHYpKQotI2RlZmluZSBBUk1fUkVTRVRfRkxBRyhzLHYpIAkoKnN5bWJvbF9nZXRfdGMgKHMpICY9IH4odikpCi0KLSNkZWZpbmUgQVJNX0ZMQUdfVEhVTUIgCQkoMSA8PCAwKQkvKiBUaGUgc3ltYm9sIGlzIGEgVGh1bWIgc3ltYm9sIHJhdGhlciB0aGFuIGFuIEFybSBzeW1ib2wuICAqLwotI2RlZmluZSBBUk1fRkxBR19JTlRFUldPUksgCSgxIDw8IDEpCS8qIFRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gY29kZSB0aGF0IHN1cHBwb3J0cyBpbnRlcndvcmtpbmcuICAqLwotI2RlZmluZSBUSFVNQl9GTEFHX0ZVTkMJCSgxIDw8IDIpCS8qIFRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gdGhlIHN0YXJ0IG9mIGEgVGh1bWIgZnVuY3Rpb24uICAqLwotCi0jZGVmaW5lIEFSTV9JU19USFVNQihzKQkJKEFSTV9HRVRfRkxBRyAocykgJiBBUk1fRkxBR19USFVNQikKLSNkZWZpbmUgQVJNX0lTX0lOVEVSV09SSyhzKQkoQVJNX0dFVF9GTEFHIChzKSAmIEFSTV9GTEFHX0lOVEVSV09SSykKLSNkZWZpbmUgVEhVTUJfSVNfRlVOQyhzKQkoQVJNX0dFVF9GTEFHIChzKSAmIFRIVU1CX0ZMQUdfRlVOQykKLQotI2RlZmluZSBBUk1fU0VUX1RIVU1CKHMsdCkgICAgICAoKHQpID8gQVJNX1NFVF9GTEFHIChzLCBBUk1fRkxBR19USFVNQikgICAgIDogQVJNX1JFU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX1RIVU1CKSkKLSNkZWZpbmUgQVJNX1NFVF9JTlRFUldPUksocyx0KSAgKCh0KSA/IEFSTV9TRVRfRkxBRyAocywgQVJNX0ZMQUdfSU5URVJXT1JLKSA6IEFSTV9SRVNFVF9GTEFHIChzLCBBUk1fRkxBR19JTlRFUldPUkspKQotI2RlZmluZSBUSFVNQl9TRVRfRlVOQyhzLHQpICAgICAoKHQpID8gQVJNX1NFVF9GTEFHIChzLCBUSFVNQl9GTEFHX0ZVTkMpICAgIDogQVJNX1JFU0VUX0ZMQUcgKHMsIFRIVU1CX0ZMQUdfRlVOQykpCi0KLQotI2RlZmluZSBUQ19GSVhfVFlQRSBQVFIKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGSVhQKSAoKEZJWFApLT50Y19maXhfZGF0YSA9IE5VTEwpCi0KLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoQyxTVFIpIFwKLSAgKGMgPT0gJzonIHx8IChjID09ICcvJyAmJiBhcm1fZGF0YV9pbl9jb2RlICgpKSkKLWludCBhcm1fZGF0YV9pbl9jb2RlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUoc3RyKSBcCi0gYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3RyKTsKLWNoYXIgKiBhcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi0jZGVmaW5lIG9ial9hZGp1c3Rfc3ltdGFiKCkgYXJtX2FkanVzdF9zeW10YWIgKCkKLSBleHRlcm4gdm9pZCBhcm1fYWRqdXN0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzeW0sIHB1bnQpICBhcm1lbGZfZnJvYl9zeW1ib2wgKHN5bSwgcHVudCkKLSNlbmRpZgotCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkFSTSBHQVMgIgotCi0jZGVmaW5lIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCAnJScKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAnTCcpKQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgICAxCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuCi0gICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcGNyZWwgcmVsb2NhdGlvbnMsIHNvIEdPVE9GRiBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gICBjaGVja2VkIGhlcmUuICBJIGFtIG5vdCBzdXJlIGlmIHNvbWUgb2YgdGhlIG90aGVycyBhcmUgZXZlciB1c2VkIHdpdGgKLSAgIHBjcmVsLCBidXQgaXQgaXMgZWFzaWVyIHRvIGJlIHNhZmUgdGhhbiBzb3JyeS4gICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgICggIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0FSTV9HT1QxMiBcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19BUk1fR09UMzIgXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzIpCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19hcm0KLSBleHRlcm4gdm9pZCBjb25zX2ZpeF9uZXdfYXJtIFBBUkFNUyAoKGZyYWdTICosIGludCwgaW50LCBleHByZXNzaW9uUyAqKSk7Ci0KLS8qIERvbid0IGFsbG93IHN5bWJvbHMgdG8gYmUgZGlzY2FyZGVkIG9uIEdPVCByZWxhdGVkIHJlbG9jcywKLSAgIG5vciBvbiBnbG9iYWxzLiAgKi8gCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKHgpIChcCi0gICAgICgoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BMVDMyIFwKLSAgIHx8ICh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fR09UMzIgXAotICAgfHwgKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9HT1RPRkYgXAotICAgfHwgU19JU19FWFRFUk4gKCh4KS0+ZnhfYWRkc3kpIFwKLSAgIHx8IFNfSVNfV0VBSyAoKHgpLT5meF9hZGRzeSkpID8gMCA6IDEpCi0gICAgIAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZWxzZQotI2RlZmluZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZW5kaWYKLSAgICAgCi0vKiBlbmQgb2YgdGMtYXJtLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZDEwdi5jIGIvZ2FzL2NvbmZpZy90Yy1kMTB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOTI2ZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjU0ICswLDAgQEAKLS8qIHRjLWQxMHYuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1pdHN1YmlzaGkgRDEwVgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJPIjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0KLWludCBPcHRpbWl6aW5nID0gMDsKLQotI2RlZmluZSBBVF9XT1JEX1AoWCkgKChYKS0+WF9vcCA9PSBPX3JpZ2h0X3NoaWZ0IFwKLQkJICAgICAgJiYgKFgpLT5YX29wX3N5bWJvbCAhPSBOVUxMIFwKLQkJICAgICAgJiYgc3ltYm9sX2NvbnN0YW50X3AgKChYKS0+WF9vcF9zeW1ib2wpIFwKLQkJICAgICAgJiYgU19HRVRfVkFMVUUgKChYKS0+WF9vcF9zeW1ib2wpID09IEFUX1dPUkRfUklHSFRfU0hJRlQpCi0jZGVmaW5lIEFUX1dPUkRfUklHSFRfU0hJRlQgMgotCi0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgZDEwdl9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGVyYW5kOwotICBpbnQgcGNyZWw7Ci0gIGludCBzaXplOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfZml4dXBzCi17Ci0gIGludCBmYzsKLSAgc3RydWN0IGQxMHZfZml4dXAgZml4W01BWF9JTlNOX0ZJWFVQU107Ci0gIHN0cnVjdCBfZml4dXBzICpuZXh0OwotfSBGaXh1cHM7Ci0KLXN0YXRpYyBGaXh1cHMgRml4VXBzWzJdOwotc3RhdGljIEZpeHVwcyAqZml4dXBzOwotCi1zdGF0aWMgaW50IGRvX25vdF9pZ25vcmVfaGFzaCA9IDA7Ci0KLS8qIFRydWUgaWYgaW5zdHJ1Y3Rpb24gc3dhcHBpbmcgd2FybmluZ3Mgc2hvdWxkIGJlIGluaGliaXRlZC4gICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwOyAvKiAtLW5vd2FybnN3YXAgKi8KLQotLyogbG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci1zdGF0aWMgaW50IHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgaW50IGNoZWNrX3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7Ci1zdGF0aWMgaW50IHBvc3RmaXggUEFSQU1TICgoY2hhciAqcCkpOwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBnZXRfcmVsb2MgUEFSQU1TICgoc3RydWN0IGQxMHZfb3BlcmFuZCAqb3ApKTsKLXN0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdKSk7Ci1zdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICpmaW5kX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgZXhwcmVzc2lvblMgb3BzW10pKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJ1aWxkX2luc24gUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIGV4cHJlc3Npb25TICpvcGVycywgdW5zaWduZWQgbG9uZyBpbnNuKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9sb25nIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlLCB1bnNpZ25lZCBsb25nIGluc24sIEZpeHVwcyAqZngpKTsKLXN0YXRpYyB2b2lkIHdyaXRlXzFfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIHVuc2lnbmVkIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOwotc3RhdGljIGludCB3cml0ZV8yX3Nob3J0IFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCi0JCQkJICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTIsIHVuc2lnbmVkIGxvbmcgaW5zbjIsIGludCBleGVjX3R5cGUsIEZpeHVwcyAqZngpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IGQxMHZfb3Bjb2RlICoqb3Bjb2RlKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBkMTB2X2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKCB1bnNpZ25lZCBsb25nIGluc24sIGludCBvcF90eXBlLAotCQkJCQkJICAgb2Zmc2V0VCB2YWx1ZSwgaW50IGxlZnQsIGZpeFMgKmZpeCkpOwotc3RhdGljIGludCBwYXJhbGxlbF9vayBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTEsIHVuc2lnbmVkIGxvbmcgaW5zbjEsIAotCQkJCXN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwKLQkJCQlpbnQgZXhlY190eXBlKSk7Ci1zdGF0aWMgc3ltYm9sUyAqIGZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSNkZWZpbmUgT1BUSU9OX05PV0FSTlNXQVAgKE9QVElPTl9NRF9CQVNFKQotICB7Im5vd2FybnN3YXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PV0FSTlNXQVB9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAgICAgICAKLQotc3RhdGljIHZvaWQgZDEwdl9kb3Rfd29yZCBQQVJBTVMgKChpbnQpKTsKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsCWQxMHZfZG90X3dvcmQsCTIgfSwKLSAgeyBOVUxMLCAgICAgICBOVUxMLCAgICAgICAgICAgMCB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqZDEwdl9oYXNoOwotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMKLSAgIGFycmF5IHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSBkMTB2X3JlZ19uYW1lX2NudCgpIC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UgCi0JICByZXR1cm4gZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiByZWdpc3Rlcl9uYW1lKCkgY2hlY2tzIHRoZSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyCi0gICB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lICovCi0KLXN0YXRpYyBpbnQKLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyIGMsICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgd2hpbGUgKCpwICYmICpwIT0nXG4nICYmICpwIT0nXHInICYmICpwICE9JywnICYmICpwIT0nICcgJiYgKnAhPScpJykKLSAgICBwKys7Ci0KLSAgYyA9ICpwOwotICBpZiAoYykKLSAgICAqcCsrID0gMDsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChpbnB1dF9saW5lX3BvaW50ZXIpOwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICAvKiB0ZW1wb3JhcmlseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBoZXJlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSAoc3ltYm9sUyAqKWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGMpCi0gICAgKihwLTEpID0gYzsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotY2hlY2tfcmFuZ2UgKG51bSwgYml0cywgZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtOwotICAgICBpbnQgYml0czsKLSAgICAgaW50IGZsYWdzOwotewotICBsb25nIG1pbiwgbWF4LCBiaXQxOwotICBpbnQgcmV0dmFsPTA7Ci0KLSAgLyogZG9uJ3QgYm90aGVyIGNoZWNraW5nIDE2LWJpdCB2YWx1ZXMgKi8KLSAgaWYgKGJpdHMgPT0gMTYpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKLSAgICB7Ci0gICAgICAvKiBhbGwgc3BlY2lhbCBzaGlmdCBvcGVyYW5kcyBhcmUgdW5zaWduZWQgKi8KLSAgICAgIC8qIGFuZCA8PSAxNi4gIFdlIGFsbG93IDAgZm9yIG5vdy4gKi8KLSAgICAgIGlmIChudW0+MTYpCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotICAgIHsKLSAgICAgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpLTE7IAotICAgICAgbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsgIAotICAgICAgaWYgKCgobG9uZyludW0gPiBtYXgpIHx8ICgobG9uZyludW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgbWluID0gMDsKLSAgICAgIGlmICgobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKSkKLQlyZXR2YWwgPSAxOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIkQxMFYgb3B0aW9uczpcblwKLS1PICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplLiAgV2lsbCBkbyBzb21lIG9wZXJhdGlvbnMgaW4gcGFyYWxsZWwuXG4iKSk7Ci19IAotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ08nOgotICAgICAgLyogT3B0aW1pemUuIFdpbGwgYXR0ZW1wdCB0byBwYXJhbGxlbGl6ZSBvcGVyYXRpb25zICovCi0gICAgICBPcHRpbWl6aW5nID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX05PV0FSTlNXQVA6Ci0gICAgICBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotICAKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gIAotICAqc2l6ZVAgPSBwcmVjICogMjsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGZyYWdTICpmcmFnUDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gIGQxMHZfaGFzaCA9IGhhc2hfbmV3KCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgRDEwdiBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKW9wY29kZS0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChkMTB2X2hhc2gsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQl9Ci0gICAgfQotCi0gIGZpeHVwcyA9ICZGaXhVcHNbMF07Ci0gIEZpeFVwc1swXS5uZXh0ID0gJkZpeFVwc1sxXTsKLSAgRml4VXBzWzFdLm5leHQgPSAmRml4VXBzWzBdOwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgcG9zdGluY3JlbWVudCBvciBwb3N0ZGVjcmVtZW50Ci0gICBvcGVyYXRvciAoICcrJyBvciAnLScgKSBmcm9tIGFuIGV4cHJlc3Npb24gKi8KLQotc3RhdGljIGludCBwb3N0Zml4IChwKSAKLSAgICAgY2hhciAqcDsKLXsKLSAgd2hpbGUgKCpwICE9ICctJyAmJiAqcCAhPSAnKycpIAotICAgIHsKLSAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJykgCi0JYnJlYWs7Ci0gICAgICBwKys7Ci0gICAgfQotCi0gIGlmICgqcCA9PSAnLScpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICBpZiAoKnAgPT0gJysnKSAKLSAgICB7Ci0gICAgICAqcCA9ICcgJzsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotCi0gIHJldHVybiAoMCk7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAKLWdldF9yZWxvYyAob3ApIAotICAgICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcDsKLXsKLSAgaW50IGJpdHMgPSBvcC0+Yml0czsKLQotICBpZiAoYml0cyA8PSA0KSAKLSAgICByZXR1cm4gKDApOwotICAgICAgCi0gIGlmIChvcC0+ZmxhZ3MgJiBPUEVSQU5EX0FERFIpIAotICAgIHsKLSAgICAgIGlmIChiaXRzID09IDgpCi0JcmV0dXJuIChCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gKEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChCRkRfUkVMT0NfMTYpOwotfQotCi0KLS8qIGdldF9vcGVyYW5kcyBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIHJldHVybnMKLSAgIGFuIGFycmF5IG9mIGV4cHJlc3Npb25zICovCi0KLXN0YXRpYyBpbnQKLWdldF9vcGVyYW5kcyAoZXhwKSAKLSAgICAgZXhwcmVzc2lvblMgZXhwW107Ci17Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBudW1vcHMgPSAwOwotICBpbnQgcG9zdCA9IDA7Ci0gIGludCB1c2VzX2F0ID0gMDsKLSAgCi0gIHdoaWxlICgqcCkgIAotICAgIHsKLSAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnLCcpIAotCXArKzsKLSAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJykgCi0JYnJlYWs7Ci0gICAgICAKLSAgICAgIGlmICgqcCA9PSAnQCcpIAotCXsKLQkgIHVzZXNfYXQgPSAxOwotCSAgCi0JICBwKys7Ci0JICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0JICBpZiAoKnAgPT0gJygnKSAKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUUEFSOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcCA9PSAnLScpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRNSU5VUzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVFNJR047Ci0JICAgICAgcG9zdCA9IHBvc3RmaXggKHApOwotCSAgICB9Ci0JICBudW1vcHMrKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCpwID09ICcpJykgCi0JewotCSAgLyoganVzdCBza2lwIHRoZSB0cmFpbGluZyBwYXJlbiAqLwotCSAgcCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotCi0gICAgICAvKiBjaGVjayB0byBzZWUgaWYgaXQgbWlnaHQgYmUgYSByZWdpc3RlciBuYW1lICovCi0gICAgICBpZiAoIXJlZ2lzdGVyX25hbWUgKCZleHBbbnVtb3BzXSkpCi0JewotCSAgLyogcGFyc2UgYXMgYW4gZXhwcmVzc2lvbiAqLwotCSAgaWYgKHVzZXNfYXQpCi0JICAgIHsKLQkgICAgICAvKiBBbnkgZXhwcmVzc2lvbiB0aGF0IGludm9sdmVzIHRoZSBpbmRpcmVjdCBhZGRyZXNzaW5nCi0JCSBjYW5ub3QgYWxzbyBpbnZvbHZlIGltbWVkaWF0ZSBhZGRyZXNzaW5nLiAgVGhlcmVmb3JlCi0JCSB0aGUgdXNlIG9mIHRoZSBoYXNoIGNoYXJhY3RlciBpcyBpbGxlZ2FsLiAgKi8KLQkgICAgICBpbnQgc2F2ZSA9IGRvX25vdF9pZ25vcmVfaGFzaDsKLQkgICAgICBkb19ub3RfaWdub3JlX2hhc2ggPSAxOwotCSAgICAgIAotCSAgICAgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7Ci0JICAgICAgCi0JICAgICAgZG9fbm90X2lnbm9yZV9oYXNoID0gc2F2ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBleHByZXNzaW9uICgmZXhwW251bW9wc10pOwotCX0KLQotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJAd29yZCIsIDUpID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0JICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCSAgICB7Ci0JICAgICAgLyogaWYgaXQgbG9va2VkIGxpa2UgYSByZWdpc3RlciBuYW1lIGJ1dCB3YXMgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgICAgICAgIkB3b3JkIiB0aGVuIGl0IHdhcyByZWFsbHkgYSBzeW1ib2wsIHNvIGNoYW5nZSBpdCB0bwotICAgICAgICAgICAgICAgICBvbmUgKi8KLQkgICAgICBleHBbbnVtb3BzXS5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNoYXIgKilleHBbbnVtb3BzXS5YX29wX3N5bWJvbCk7Ci0JICAgIH0KLQotCSAgLyogY2hlY2sgZm9yIGlkZW50aWZpZXJAd29yZCtjb25zdGFudCAqLwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJysnKQotCSAgewotCSAgICBjaGFyICpvcmlnX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIGV4cHJlc3Npb25TIG5ld19leHA7Ci0JICAgIGV4cHJlc3Npb24gKCZuZXdfZXhwKTsKLQkgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gbmV3X2V4cC5YX2FkZF9udW1iZXI7Ci0JICB9Ci0KLQkgIC8qIGNvbnZlcnQgZXhwciBpbnRvIGEgcmlnaHQgc2hpZnQgYnkgQVRfV09SRF9SSUdIVF9TSElGVCAqLwotCSAgewotCSAgICBleHByZXNzaW9uUyBuZXdfZXhwOwotCSAgICBtZW1zZXQgKCZuZXdfZXhwLCAwLCBzaXplb2YgbmV3X2V4cCk7Ci0JICAgIG5ld19leHAuWF9hZGRfbnVtYmVyID0gQVRfV09SRF9SSUdIVF9TSElGVDsKLQkgICAgbmV3X2V4cC5YX29wID0gT19jb25zdGFudDsKLQkgICAgbmV3X2V4cC5YX3Vuc2lnbmVkID0gMTsKLQkgICAgZXhwW251bW9wc10uWF9vcF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmbmV3X2V4cCk7Ci0JICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgfQotCi0JICBrbm93IChBVF9XT1JEX1AgKCZleHBbbnVtb3BzXSkpOwotCX0KLSAgICAgIAotICAgICAgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19pbGxlZ2FsKSAKLQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19hYnNlbnQpIAotCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCi0gICAgICBudW1vcHMrKzsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIHN3aXRjaCAocG9zdCkgCi0gICAgewotICAgIGNhc2UgLTE6CS8qIHBvc3RkZWNyZW1lbnQgbW9kZSAqLwotICAgICAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotICAgICAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX01JTlVTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgkvKiBwb3N0aW5jcmVtZW50IG1vZGUgKi8KLSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGV4cFtudW1vcHMrK10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9QTFVTOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGV4cFtudW1vcHNdLlhfb3AgPSAwOwotICByZXR1cm4gKG51bW9wcyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1kMTB2X2luc2VydF9vcGVyYW5kIChpbnNuLCBvcF90eXBlLCB2YWx1ZSwgbGVmdCwgZml4KSAKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgb3BfdHlwZTsKLSAgICAgb2Zmc2V0VCB2YWx1ZTsKLSAgICAgaW50IGxlZnQ7Ci0gICAgIGZpeFMgKmZpeDsKLXsKLSAgaW50IHNoaWZ0LCBiaXRzOwotCi0gIHNoaWZ0ID0gZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5zaGlmdDsKLSAgaWYgKGxlZnQpCi0gICAgc2hpZnQgKz0gMTU7Ci0KLSAgYml0cyA9IGQxMHZfb3BlcmFuZHNbb3BfdHlwZV0uYml0czsKLQotICAvKiB0cnVuY2F0ZSB0byB0aGUgcHJvcGVyIG51bWJlciBvZiBiaXRzICovCi0gIGlmIChjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGQxMHZfb3BlcmFuZHNbb3BfdHlwZV0uZmxhZ3MpKQotICAgIGFzX2JhZF93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlOiAlZCIpLCB2YWx1ZSk7Ci0KLSAgdmFsdWUgJj0gMHg3RkZGRkZGRiA+PiAoMzEgLSBiaXRzKTsKLSAgaW5zbiB8PSAodmFsdWUgPDwgc2hpZnQpOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0KLS8qIGJ1aWxkX2luc24gdGFrZXMgYSBwb2ludGVyIHRvIHRoZSBvcGNvZGUgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZQotICAgYW5kIHRoZSBhcnJheSBvZiBvcGVyYW5kIGV4cHJlc3Npb25zIGFuZCByZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotYnVpbGRfaW5zbiAob3Bjb2RlLCBvcGVycywgaW5zbikgCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyAqb3BlcnM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLXsKLSAgaW50IGksIGJpdHMsIHNoaWZ0LCBmbGFncywgZm9ybWF0OwotICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgCi0gIC8qIHRoZSBpbnNuIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCBmb3IgdGhlIERJVlMga2x1ZGdlICovCi0gIGlmIChpbnNuKQotICAgIGZvcm1hdCA9IExPTkdfUjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLSAgICAgIGZvcm1hdCA9IG9wY29kZS0+Zm9ybWF0OwotICAgIH0KLSAgCi0gIGZvciAoaT0wO29wY29kZS0+b3BlcmFuZHNbaV07aSsrKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0gICAgICBiaXRzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5iaXRzOwotICAgICAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLnNoaWZ0OwotICAgICAgbnVtYmVyID0gb3BlcnNbaV0uWF9hZGRfbnVtYmVyOwotCi0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykgCi0JewotCSAgbnVtYmVyICY9IFJFR0lTVEVSX01BU0s7Ci0JICBpZiAoZm9ybWF0ID09IExPTkdfTCkKLQkgICAgc2hpZnQgKz0gMTU7Ci0JfQotCi0gICAgICBpZiAob3BlcnNbaV0uWF9vcCAhPSBPX3JlZ2lzdGVyICYmIG9wZXJzW2ldLlhfb3AgIT0gT19jb25zdGFudCkgCi0JewotCSAgLyogbm93IGNyZWF0ZSBhIGZpeHVwICovCi0KLQkgIGlmIChmaXh1cHMtPmZjID49IE1BWF9JTlNOX0ZJWFVQUykKLQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCSAgaWYgKEFUX1dPUkRfUCAoJm9wZXJzW2ldKSkKLQkgICAgewotCSAgICAgIC8qIFJlY29uaXplIFhYWD4+MStOIGFrYSBYWFhAd29yZCtOIGFzIHNwZWNpYWwgKEFUX1dPUkQpICovCi0JICAgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ucmVsb2MgPSBCRkRfUkVMT0NfRDEwVl8xODsKLQkgICAgICBvcGVyc1tpXS5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgb3BlcnNbaV0uWF9vcF9zeW1ib2wgPSBOVUxMOyAvKiBTaG91bGQgZnJlZSBpdCAqLwotCSAgICAgIC8qIG51bWJlciBpcyBsZWZ0IHNoaWZ0ZWQgYnkgQVRfV09SRF9SSUdIVF9TSElGVCBzbwotICAgICAgICAgICAgICAgICB0aGF0LCBpdCBpcyBhbGlnbmVkIHdpdGggdGhlIHN5bWJvbCdzIHZhbHVlLiAgTGF0ZXIsCi0gICAgICAgICAgICAgICAgIEJGRF9SRUxPQ19EMTBWXzE4IHdpbGwgcmlnaHQgc2hpZnQgKHN5bWJvbF92YWx1ZSArCi0gICAgICAgICAgICAgICAgIFhfYWRkX251bWJlcikuICovCi0JICAgICAgbnVtYmVyIDw8PSBBVF9XT1JEX1JJR0hUX1NISUZUOwotCSAgICAgIG9wZXJzW2ldLlhfYWRkX251bWJlciA9IG51bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9IAotCSAgICAgIGdldF9yZWxvYygoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dKTsKLQotCSAgaWYgKGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID09IEJGRF9SRUxPQ18xNiB8fCAKLQkgICAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDEwVl8xOCkKLQkgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDI7IAkgICAgCi0JICBlbHNlCi0JICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnNpemUgPSA0OwotIAkgICAgCi0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5leHAgPSBvcGVyc1tpXTsKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLm9wZXJhbmQgPSBvcGNvZGUtPm9wZXJhbmRzW2ldOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ucGNyZWwgPSAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpID8gdHJ1ZSA6IGZhbHNlOwotCSAgKGZpeHVwcy0+ZmMpKys7Ci0JfQotCi0gICAgICAvKiB0cnVuY2F0ZSB0byB0aGUgcHJvcGVyIG51bWJlciBvZiBiaXRzICovCi0gICAgICBpZiAoKG9wZXJzW2ldLlhfb3AgPT0gT19jb25zdGFudCkgJiYgY2hlY2tfcmFuZ2UgKG51bWJlciwgYml0cywgZmxhZ3MpKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksbnVtYmVyKTsKLSAgICAgIG51bWJlciAmPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotICAgICAgaW5zbiA9IGluc24gfCAobnVtYmVyIDw8IHNoaWZ0KTsKLSAgICB9Ci0KLSAgLyoga2x1ZGdlOiBmb3IgRElWUywgd2UgbmVlZCB0byBwdXQgdGhlIG9wZXJhbmRzIGluIHR3aWNlICovCi0gIC8qIG9uIHRoZSBzZWNvbmQgcGFzcywgZm9ybWF0IGlzIGNoYW5nZWQgdG8gTE9OR19SIHRvIGZvcmNlICovCi0gIC8qIHRoZSBzZWNvbmQgc2V0IG9mIG9wZXJhbmRzIHRvIG5vdCBiZSBzaGlmdGVkIG92ZXIgMTUgKi8KLSAgaWYgKChvcGNvZGUtPm9wY29kZSA9PSBPUENPREVfRElWUykgJiYgKGZvcm1hdD09TE9OR19MKSkKLSAgICBpbnNuID0gYnVpbGRfaW5zbiAob3Bjb2RlLCBvcGVycywgaW5zbik7Ci0gICAgICAKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIHdyaXRlIG91dCBhIGxvbmcgZm9ybSBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQKLXdyaXRlX2xvbmcgKG9wY29kZSwgaW5zbiwgZngpIAotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotewotICBpbnQgaSwgd2hlcmU7Ci0gIGNoYXIgKmYgPSBmcmFnX21vcmUoNCk7Ci0KLSAgaW5zbiB8PSBGTTExOwotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLQotICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKLSAgICB7Ci0gICAgICBpZiAoZngtPmZpeFtpXS5yZWxvYykKLQl7IAotCSAgd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7IAotCSAgaWYgKGZ4LT5maXhbaV0uc2l6ZSA9PSAyKQotCSAgICB3aGVyZSArPSAyOwotCi0JICBpZiAoZngtPmZpeFtpXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDEwVl8xOCkKLQkgICAgZngtPmZpeFtpXS5vcGVyYW5kIHw9IDQwOTY7CSAgCi0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLAotCQkgICAgICAgZngtPmZpeFtpXS5zaXplLAotCQkgICAgICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCSAgICAgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkgICAgICAgZngtPmZpeFtpXS5vcGVyYW5kfDIwNDgpOwotCX0KLSAgICB9Ci0gIGZ4LT5mYyA9IDA7Ci19Ci0KLQotLyogd3JpdGUgb3V0IGEgc2hvcnQgZm9ybSBpbnN0cnVjdGlvbiBieSBpdHNlbGYgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV8xX3Nob3J0IChvcGNvZGUsIGluc24sIGZ4KSAKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgRml4dXBzICpmeDsKLXsKLSAgY2hhciAqZiA9IGZyYWdfbW9yZSg0KTsKLSAgaW50IGksIHdoZXJlOwotCi0gIGlmIChvcGNvZGUtPmV4ZWNfdHlwZSAmIFBBUk9OTFkpCi0gICAgYXNfZmF0YWwgKF8oIkluc3RydWN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwgd2l0aCBhbm90aGVyIGluc3RydWN0aW9uLiIpKTsKLQotICAvKiB0aGUgb3RoZXIgY29udGFpbmVyIG5lZWRzIHRvIGJlIE5PUCAqLwotICAvKiBhY2NvcmRpbmcgdG8gNC4zLjE6IGZvciBGTT0wMCwgc3ViLWluc3RydWN0aW9ucyBwZXJmb3JtZWQgb25seQotICAgICBieSBJVSBjYW5ub3QgYmUgZW5jb2RlZCBpbiBMLWNvbnRhaW5lci4gKi8KLSAgaWYgKG9wY29kZS0+dW5pdCA9PSBJVSkKLSAgICBpbnNuIHw9IEZNMDAgfCAoTk9QIDw8IDE1KTsJCS8qIHJpZ2h0IGNvbnRhaW5lciAqLwotICBlbHNlCi0gICAgaW5zbiA9IEZNMDAgfCAoaW5zbiA8PCAxNSkgfCBOT1A7CS8qIGxlZnQgY29udGFpbmVyICovCi0KLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgNCk7Ci0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBpZiAoZngtPmZpeFtpXS5zaXplID09IDIpCi0JICAgIHdoZXJlICs9IDI7Ci0KLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCSAgICBmeC0+Zml4W2ldLm9wZXJhbmQgfD0gNDA5NjsJICAKLQotCSAgLyogaWYgaXQncyBhbiBSIHJlbG9jLCB3ZSBtYXkgaGF2ZSB0byBzd2l0Y2ggaXQgdG8gTCAqLwotCSAgaWYgKCAoZngtPmZpeFtpXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SKSAmJiAob3Bjb2RlLT51bml0ICE9IElVKSApCi0JICAgIGZ4LT5maXhbaV0ub3BlcmFuZCB8PSAxMDI0OwotCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICB3aGVyZSwgCi0JCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCi0JCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCSAgICAgICBmeC0+Zml4W2ldLm9wZXJhbmR8MjA0OCk7Ci0JfQotICAgIH0KLSAgZngtPmZjID0gMDsKLX0KLQotLyogd3JpdGUgb3V0IGEgc2hvcnQgZm9ybSBpbnN0cnVjdGlvbiBpZiBwb3NzaWJsZSAqLwotLyogcmV0dXJuIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgbm90IHdyaXR0ZW4gb3V0ICovCi1zdGF0aWMgaW50Ci13cml0ZV8yX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgb3Bjb2RlMiwgaW5zbjIsIGV4ZWNfdHlwZSwgZngpIAotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTEsICpvcGNvZGUyOwotICAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLSAgICAgaW50IGV4ZWNfdHlwZTsKLSAgICAgRml4dXBzICpmeDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjaGFyICpmOwotICBpbnQgaSxqLCB3aGVyZTsKLQotICBpZiAoIChleGVjX3R5cGUgIT0gMSkgJiYgKChvcGNvZGUxLT5leGVjX3R5cGUgJiBQQVJPTkxZKQotCSAgICAgICAgICAgICAgICB8fCAob3Bjb2RlMi0+ZXhlY190eXBlICYgUEFST05MWSkpKQotICAgIGFzX2ZhdGFsIChfKCJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotICAKLSAgaWYgKCAob3Bjb2RlMS0+Zm9ybWF0ICYgTE9OR19PUENPREUpIHx8IChvcGNvZGUyLT5mb3JtYXQgJiBMT05HX09QQ09ERSkpCi0gICAgYXNfZmF0YWwgKF8oIkxvbmcgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgY29tYmluZWQuIikpOwotCi0gIGlmKG9wY29kZTEtPmV4ZWNfdHlwZSAmIEJSQU5DSF9MSU5LICYmIGV4ZWNfdHlwZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEluc3RydWN0aW9ucyBwYWlyZWQgd2l0aCBhIHN1YnJvdXRpbmUgY2FsbCBhcmUgZXhlY3V0ZWQgYmVmb3JlIHRoZQotCSBzdWJyb3V0aW5lLCBzbyBkb24ndCBkbyB0aGVzZSBwYWlyaW5ncyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuICAqLwotICAgICAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0KTsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoZXhlY190eXBlKSAKLSAgICB7Ci0gICAgY2FzZSAwOgkvKiBvcmRlciBub3Qgc3BlY2lmaWVkICovCi0gICAgICBpZiAoIE9wdGltaXppbmcgJiYgcGFyYWxsZWxfb2sgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlKSkKLQl7Ci0JICAvKiBwYXJhbGxlbCAqLwotCSAgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUpCi0JICAgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCSAgZWxzZSBpZiAob3Bjb2RlMi0+dW5pdCA9PSBNVSkKLQkgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsgIAotCSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT51bml0ID09IElVKSAKLQl7Ci0JICAvKiByZXZlcnNlIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTEwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzZXF1ZW50aWFsICovCi0JICBpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsKLQkgIGZ4ID0gZngtPm5leHQ7ICAKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6CS8qIHBhcmFsbGVsICovCi0gICAgICBpZiAob3Bjb2RlMS0+ZXhlY190eXBlICYgU0VRIHx8IG9wY29kZTItPmV4ZWNfdHlwZSAmIFNFUSkKLQlhc19mYXRhbCAoXygiT25lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiIpKTsKLQotICAgICAgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUpCi0JewotCSAgaWYgKG9wY29kZTItPnVuaXQgPT0gSVUpCi0JICAgIGFzX2ZhdGFsIChfKCJUd28gSVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gICAgICAgICAgaWYgKCFmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKQotCSAgICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLSAJICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VKQotCXsKLQkgIGlmIChvcGNvZGUxLT51bml0ID09IE1VKQotCSAgICBhc19mYXRhbCAoXygiVHdvIE1VIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotICAgICAgICAgIGlmICghZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCkKLQkgICAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0JICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjEgPDwgMTUpIHwgaW5zbjI7ICAKLQkgIGZ4ID0gZngtPm5leHQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgkvKiBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMS0+dW5pdCAhPSBJVSkKLQlpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsgIAotICAgICAgZWxzZSBpZiAob3Bjb2RlMi0+dW5pdCA9PSBNVSB8fCBvcGNvZGUyLT51bml0ID09IEVJVEhFUikKLQl7Ci0gICAgICAgICAgaWYgKCFmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKQotCSAgICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLQkgIGluc24gPSBGTTEwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOyAgCi0JfQotICAgICAgZWxzZQotCWFzX2ZhdGFsIChfKCJJVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSBsZWZ0IGNvbnRhaW5lciIpKTsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6CS8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotICAgICAgaWYgKG9wY29kZTItPnVuaXQgIT0gTVUpCi0JaW5zbiA9IEZNMTAgfCAoaW5zbjEgPDwgMTUpIHwgaW5zbjI7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT51bml0ID09IElVIHx8IG9wY29kZTEtPnVuaXQgPT0gRUlUSEVSKQotCXsKLSAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCi0JICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotCSAgaW5zbiA9IEZNMDEgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7ICAKLQl9Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIk1VIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lciIpKTsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oInVua25vd24gZXhlY3V0aW9uIHR5cGUgcGFzc2VkIHRvIHdyaXRlXzJfc2hvcnQoKSIpKTsKLSAgICB9Ci0KLSAgZiA9IGZyYWdfbW9yZSg0KTsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgNCk7Ci0KLSAgZm9yIChqPTA7IGo8MjsgaisrKSAKLSAgICB7Ci0gICAgICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKLQl7Ci0JICBpZiAoZngtPmZpeFtpXS5yZWxvYykKLQkgICAgewotCSAgICAgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgICAgICBpZiAoZngtPmZpeFtpXS5zaXplID09IDIpCi0JCXdoZXJlICs9IDI7Ci0JICAgICAgCi0JICAgICAgaWYgKCAoZngtPmZpeFtpXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SKSAmJiAoaiA9PSAwKSApCi0JCWZ4LT5maXhbaV0ub3BlcmFuZCB8PSAxMDI0OwotCSAgICAgIAotCSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCQlmeC0+Zml4W2ldLm9wZXJhbmQgfD0gNDA5NjsJICAKLQotCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgIHdoZXJlLCAKLQkJCSAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJCSAgICYoZngtPmZpeFtpXS5leHApLAotCQkJICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJCSAgIGZ4LT5maXhbaV0ub3BlcmFuZHwyMDQ4KTsKLQkgICAgfQotCX0KLSAgICAgIGZ4LT5mYyA9IDA7Ci0gICAgICBmeCA9IGZ4LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotCi0vKiBDaGVjayAyIGluc3RydWN0aW9ucyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgY2FuIGJlIHNhZmVseSAqLwotLyogZXhlY3V0ZWQgaW4gcGFyYWxsZWwuICBSZXR1cm5zIDEgaWYgdGhleSBjYW4gYmUuICAgICAgICAgKi8KLXN0YXRpYyBpbnQKLXBhcmFsbGVsX29rIChvcDEsIGluc24xLCBvcDIsIGluc24yLCBleGVjX3R5cGUpCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3AxLCAqb3AyOwotICAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLSAgICAgaW50IGV4ZWNfdHlwZTsKLXsKLSAgaW50IGksIGosIGZsYWdzLCBtYXNrLCBzaGlmdCwgcmVnbm87Ci0gIHVuc2lnbmVkIGxvbmcgaW5zLCBtb2RbMl0sIHVzZWRbMl07Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqb3A7Ci0KLSAgaWYgKChvcDEtPmV4ZWNfdHlwZSAmIFNFUSkgIT0gMCB8fCAob3AyLT5leGVjX3R5cGUgJiBTRVEpICE9IDAKLSAgICAgIHx8IChvcDEtPmV4ZWNfdHlwZSAmIFBBUikgPT0gMCB8fCAob3AyLT5leGVjX3R5cGUgJiBQQVIpID09IDAKLSAgICAgIHx8IChvcDEtPnVuaXQgPT0gQk9USCkgfHwgKG9wMi0+dW5pdCA9PSBCT1RIKQotICAgICAgfHwgKG9wMS0+dW5pdCA9PSBJVSAmJiBvcDItPnVuaXQgPT0gSVUpCi0gICAgICB8fCAob3AxLT51bml0ID09IE1VICYmIG9wMi0+dW5pdCA9PSBNVSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogSWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGEgYnJhbmNoIGFuZCB0aGlzIGlzIGF1dG8gcGFyYWxsYXphdGlvbiwKLSAgICAgZG9uJ3QgY29tYmluZSB3aXRoIGFueSBzZWNvbmQgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoZXhlY190eXBlID09IDAgJiYgKG9wMS0+ZXhlY190eXBlICYgQlJBTkNIKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIC8qIFRoZSBpZGVhIGhlcmUgaXMgdG8gY3JlYXRlIHR3byBzZXRzIG9mIGJpdG1hc2tzIChtb2QgYW5kIHVzZWQpCi0gICAgIHdoaWNoIGluZGljYXRlIHdoaWNoIHJlZ2lzdGVycyBhcmUgbW9kaWZpZWQgb3IgdXNlZCBieSBlYWNoCi0gICAgIGluc3RydWN0aW9uLiAgVGhlIG9wZXJhdGlvbiBjYW4gb25seSBiZSBkb25lIGluIHBhcmFsbGVsIGlmCi0gICAgIGluc3RydWN0aW9uIDEgYW5kIGluc3RydWN0aW9uIDIgbW9kaWZ5IGRpZmZlcmVudCByZWdpc3RlcnMsIGFuZAotICAgICB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbW9kaWZ5IHJlZ2lzdGVycyB0aGF0IHRoZSBzZWNvbmQKLSAgICAgaXMgdXNpbmcgKFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gY2FuIG1vZGlmeSByZWdpc3RlcnMgdGhhdCB0aGUKLSAgICAgZmlyc3QgaXMgdXNpbmcgYXMgdGhleSBhcmUgb25seSB3cml0dGVuIGJhY2sgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgIGluc3RydWN0aW9uIGhhcyBjb21wbGV0ZWQpLiAgQWNjZXNzZXMgdG8gY29udHJvbCByZWdpc3RlcnMsIFBTVywKLSAgICAgYW5kIG1lbW9yeSBhcmUgdHJlYXRlZCBhcyBhY2Nlc3NlcyB0byBhIHNpbmdsZSByZWdpc3Rlci4gIFNvIGlmCi0gICAgIGJvdGggaW5zdHJ1Y3Rpb25zIHdyaXRlIG1lbW9yeSBvciBpZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd3JpdGVzCi0gICAgIG1lbW9yeSBhbmQgdGhlIHNlY29uZCByZWFkcywgdGhlbiB0aGV5IGNhbm5vdCBiZSBkb25lIGluCi0gICAgIHBhcmFsbGVsLiAgTGlrZXdpc2UsIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBtdWNrcyB3aXRoIHRoZSBwc3cKLSAgICAgYW5kIHRoZSBzZWNvbmQgcmVhZHMgdGhlIFBTVyAod2hpY2ggaW5jbHVkZXMgQywgRjAsIGFuZCBGMSksIHRoZW4KLSAgICAgdGhleSBjYW5ub3Qgb3BlcmF0ZSBzYWZlbHkgaW4gcGFyYWxsZWwuICovCi0KLSAgLyogdGhlIGJpdG1hc2tzIChtb2QgYW5kIHVzZWQpIGxvb2sgbGlrZSB0aGlzIChiaXQgMzEgPSBNU0IpICovCi0gIC8qIHIwLXIxNQkgIDAtMTUgICovCi0gIC8qIGEwLWExCSAgMTYtMTcgKi8KLSAgLyogY3IgKG5vdCBwc3cpIDE4ICAgICovCi0gIC8qIHBzdwkgIDE5ICAgICovCi0gIC8qIG1lbQkgIDIwICAgICovCi0KLSAgZm9yIChqPTA7ajwyO2orKykKLSAgICB7Ci0gICAgICBpZiAoaiA9PSAwKQotCXsKLQkgIG9wID0gb3AxOwotCSAgaW5zID0gaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wID0gb3AyOwotCSAgaW5zID0gaW5zbjI7Ci0JfQotICAgICAgbW9kW2pdID0gdXNlZFtqXSA9IDA7Ci0gICAgICBpZiAob3AtPmV4ZWNfdHlwZSAmIEJSQU5DSF9MSU5LKQotCW1vZFtqXSB8PSAxIDw8IDEzOwotCi0gICAgICBmb3IgKGkgPSAwOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQl7Ci0JICBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgIHNoaWZ0ID0gZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dLnNoaWZ0OwotCSAgbWFzayA9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dLmJpdHMpOwotCSAgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JICAgIHsKLQkgICAgICByZWdubyA9IChpbnMgPj4gc2hpZnQpICYgbWFzazsKLQkgICAgICBpZiAoZmxhZ3MgJiAoT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMSkpCi0JCXJlZ25vICs9IDE2OwotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKQkvKiBtdnRjIG9yIG12ZmMgKi8KLQkJeyAKLQkJICBpZiAocmVnbm8gPT0gMCkKLQkJICAgIHJlZ25vID0gMTk7Ci0JCSAgZWxzZQotCQkgICAgcmVnbm8gPSAxODsgCi0JCX0KLQkgICAgICBlbHNlIGlmIChmbGFncyAmIChPUEVSQU5EX0ZGTEFHfE9QRVJBTkRfQ0ZMQUcpKQotCQlyZWdubyA9IDE5OwotCSAgICAgIAotCSAgICAgIGlmICggZmxhZ3MgJiBPUEVSQU5EX0RFU1QgKQotCQl7Ci0JCSAgbW9kW2pdIHw9IDEgPDwgcmVnbm87Ci0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9FVkVOKQotCQkgICAgbW9kW2pdIHw9IDEgPDwgKHJlZ25vICsgMSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB1c2VkW2pdIHw9IDEgPDwgcmVnbm8gOwotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfRVZFTikKLQkJICAgIHVzZWRbal0gfD0gMSA8PCAocmVnbm8gKyAxKTsKLQotCQkgIC8qIEF1dG8gaW5jL2RlYyBhbHNvIG1vZGlmaWVzIHRoZSByZWdpc3Rlci4gICovCi0JCSAgaWYgKG9wLT5vcGVyYW5kc1tpKzFdICE9IDAKLQkJICAgICAgJiYgKGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzCi0JCQkgICYgKE9QRVJBTkRfUExVUyB8IE9QRVJBTkRfTUlOVVMpKSAhPSAwKQotCQkgICAgbW9kW2pdIHw9IDEgPDwgcmVnbm87Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FUTUlOVVMpCi0JICAgIHsKLQkgICAgICAvKiBTUCBpbXBsaWNpdGx5IHVzZWQvbW9kaWZpZWQgKi8KLQkgICAgICBtb2Rbal0gfD0gMSA8PCAxNTsKLQkgICAgICB1c2VkW2pdIHw9IDEgPDwgMTU7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAob3AtPmV4ZWNfdHlwZSAmIFJNRU0pCi0JdXNlZFtqXSB8PSAxIDw8IDIwOwotICAgICAgZWxzZSBpZiAob3AtPmV4ZWNfdHlwZSAmIFdNRU0pCi0JbW9kW2pdIHw9IDEgPDwgMjA7Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhlY190eXBlICYgUkYwKQotCXVzZWRbal0gfD0gMSA8PCAxOTsKLSAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBXRjApCi0JbW9kW2pdIHw9IDEgPDwgMTk7Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhlY190eXBlICYgV0NBUikKLQltb2Rbal0gfD0gMSA8PCAxOTsKLSAgICB9Ci0gIGlmICgobW9kWzBdICYgbW9kWzFdKSA9PSAwICYmIChtb2RbMF0gJiB1c2VkWzFdKSA9PSAwKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgc3RyIHBvaW50cyB0byBhCi0gICBtYWNoaW5lLWRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdCB0aGUgZnJhZ3MvYnl0ZXMgCi0gICBpdCBhc3NlbWJsZXMgdG8uICBGb3IgdGhlIEQxMFYsIGl0IG1vc3RseSBoYW5kbGVzIHRoZSBzcGVjaWFsIFZMSVcgcGFyc2luZyBhbmQgcGFja2luZwotICAgYW5kIGxlYXZlcyB0aGUgZGlmZmljdWx0IHN0dWZmIHRvIGRvX2Fzc2VtYmxlKCkuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9pbnNuOwotc3RhdGljIHN0cnVjdCBkMTB2X29wY29kZSAqcHJldl9vcGNvZGUgPSAwOwotc3RhdGljIHN1YnNlZ1QgcHJldl9zdWJzZWc7Ci1zdGF0aWMgc2VnVCBwcmV2X3NlZyA9IDA7Owotc3RhdGljIGludCBldHlwZSA9IDA7CQkvKiBzYXZlZCBleHR5cGUuICB1c2VkIGZvciBtdWx0aWxpbmUgaW5zdHJ1Y3Rpb25zICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICogb3Bjb2RlOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGludCBleHR5cGUgPSAwOwkJLyogZXhlY3V0aW9uIHR5cGU7IHBhcmFsbGVsLCBldGMgKi8KLSAgY2hhciAqIHN0cjI7Ci0KLSAgaWYgKGV0eXBlID09IDApCi0gICAgewotICAgICAgLyogbG9vayBmb3IgdGhlIHNwZWNpYWwgbXVsdGlwbGUgaW5zdHJ1Y3Rpb24gc2VwYXJhdG9ycyAqLwotICAgICAgc3RyMiA9IHN0cnN0ciAoc3RyLCAifHwiKTsKLSAgICAgIGlmIChzdHIyKSAKLQlleHR5cGUgPSAxOwotICAgICAgZWxzZQotCXsKLQkgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIi0+Iik7Ci0JICBpZiAoc3RyMikgCi0JICAgIGV4dHlwZSA9IDI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICI8LSIpOwotCSAgICAgIGlmIChzdHIyKSAKLQkJZXh0eXBlID0gMzsKLQkgICAgfQotCX0KLSAgICAgIC8qIHN0cjIgcG9pbnRzIHRvIHRoZSBzZXBhcmF0b3IsIGlmIG9uZSAqLwotICAgICAgaWYgKHN0cjIpIAotCXsKLQkgICpzdHIyID0gMDsKLQkgIAotCSAgLyogaWYgdHdvIGluc3RydWN0aW9ucyBhcmUgcHJlc2VudCBhbmQgd2UgYWxyZWFkeSBoYXZlIG9uZSBzYXZlZAotCSAgICAgdGhlbiBmaXJzdCB3cml0ZSBpdCBvdXQgKi8KLQkgIGQxMHZfY2xlYW51cCAoKTsKLQkgIAotCSAgLyogYXNzZW1ibGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYW5kIHNhdmUgaXQgKi8KLQkgIHByZXZfaW5zbiA9IGRvX2Fzc2VtYmxlIChzdHIsICZwcmV2X29wY29kZSk7Ci0JICBpZiAocHJldl9pbnNuID09IC0xKQotCSAgICBhc19mYXRhbCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotCSAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotCSAgc3RyID0gc3RyMiArIDI7Ci0JfQotICAgIH0KLQotICBpbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJm9wY29kZSk7Ci0gIGlmIChpbnNuID09IC0xKQotICAgIHsKLSAgICAgIGlmIChleHR5cGUpCi0JewotCSAgZXR5cGUgPSBleHR5cGU7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYXNfZmF0YWwgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0KLSAgaWYgKGV0eXBlKQotICAgIHsKLSAgICAgIGV4dHlwZSA9IGV0eXBlOwotICAgICAgZXR5cGUgPSAwOwotICAgIH0KLQotICAvKiBpZiB0aGlzIGlzIGEgbG9uZyBpbnN0cnVjdGlvbiwgd3JpdGUgaXQgYW5kIGFueSBwcmV2aW91cyBzaG9ydCBpbnN0cnVjdGlvbiAqLwotICBpZiAob3Bjb2RlLT5mb3JtYXQgJiBMT05HX09QQ09ERSkgCi0gICAgewotICAgICAgaWYgKGV4dHlwZSkgCi0JYXNfZmF0YWwgKF8oIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIGQxMHZfY2xlYW51cCAoKTsKLSAgICAgIHdyaXRlX2xvbmcgKG9wY29kZSwgaW5zbiwgZml4dXBzKTsKLSAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpZiAocHJldl9vcGNvZGUgJiYgcHJldl9zZWcgJiYgKChwcmV2X3NlZyAhPSBub3dfc2VnKSB8fCAocHJldl9zdWJzZWcgIT0gbm93X3N1YnNlZykpKQotICAgIGQxMHZfY2xlYW51cCgpOwotICAKLSAgaWYgKHByZXZfb3Bjb2RlICYmICh3cml0ZV8yX3Nob3J0IChwcmV2X29wY29kZSwgcHJldl9pbnNuLCBvcGNvZGUsIGluc24sIGV4dHlwZSwgZml4dXBzKSA9PSAwKSkgCi0gICAgewotICAgICAgLyogbm8gaW5zdHJ1Y3Rpb25zIHNhdmVkICovCi0gICAgICBwcmV2X29wY29kZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGV4dHlwZSkgCi0JYXNfZmF0YWwgKF8oIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIC8qIHNhdmUgb2ZmIGxhc3QgaW5zdHJ1Y3Rpb24gc28gaXQgbWF5IGJlIHBhY2tlZCBvbiBuZXh0IHBhc3MgKi8KLSAgICAgIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotICAgICAgcHJldl9pbnNuID0gaW5zbjsKLSAgICAgIHByZXZfc2VnID0gbm93X3NlZzsKLSAgICAgIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGZpeHVwcyA9IGZpeHVwcy0+bmV4dDsKLSAgICB9Ci19Ci0KLQotLyogZG9fYXNzZW1ibGUgYXNzZW1ibGVzIGEgc2luZ2xlIGluc3RydWN0aW9uIGFuZCByZXR1cm5zIGFuIG9wY29kZSAqLwotLyogaXQgcmV0dXJucyAtMSAoYW4gaW52YWxpZCBvcGNvZGUpIG9uIGVycm9yICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1kb19hc3NlbWJsZSAoc3RyLCBvcGNvZGUpIAotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqKm9wY29kZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqb3Bfc3RhcnQsICpzYXZlOwotICB1bnNpZ25lZCBjaGFyICpvcF9lbmQ7Ci0gIGNoYXIgbmFtZVsyMF07Ci0gIGludCBubGVuID0gMDsKLSAgZXhwcmVzc2lvblMgbXlvcHNbNl07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBGaW5kIHRoZSBvcGNvZGUgZW5kLiAgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopIChzdHIpOwotICAgICAgICpvcF9lbmQKLSAgICAgICAmJiBubGVuIDwgMjAKLSAgICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgbmFtZVtubGVuXSA9IHRvbG93ZXIgKG9wX3N0YXJ0W25sZW5dKTsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0gIG5hbWVbbmxlbl0gPSAwOwotCi0gIGlmIChubGVuID09IDApCi0gICAgcmV0dXJuIC0xOwotICAKLSAgLyogRmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lLiAgKi8KLSAgKm9wY29kZSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKiloYXNoX2ZpbmQgKGQxMHZfaGFzaCwgbmFtZSk7Ci0gIGlmICgqb3Bjb2RlID09IE5VTEwpCi0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBvcGNvZGU6ICVzIiksbmFtZSk7Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BfZW5kOwotICAqb3Bjb2RlID0gZmluZF9vcGNvZGUgKCpvcGNvZGUsIG15b3BzKTsKLSAgaWYgKCpvcGNvZGUgPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0KLSAgaW5zbiA9IGJ1aWxkX2luc24gKCgqb3Bjb2RlKSwgbXlvcHMsIDApOyAKLSAgcmV0dXJuIChpbnNuKTsKLX0KLQotLyogRmluZCB0aGUgc3ltYm9sIHdoaWNoIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSByZWdpc3RlciBpbiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgc3ltYm9sUyAqCi1maW5kX3N5bWJvbF9tYXRjaGluZ19yZWdpc3RlciAoZXhwKQotICAgICBleHByZXNzaW9uUyAqIGV4cDsKLXsKLSAgaW50IGk7Ci0gIAotICBpZiAoZXhwLT5YX29wICE9IE9fcmVnaXN0ZXIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAvKiBGaW5kIHRoZSBuYW1lIG9mIHRoZSByZWdpc3Rlci4gICovCi0gIGZvciAoaSA9IGQxMHZfcmVnX25hbWVfY250ICgpOyBpLS07KQotICAgIGlmIChkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIFtpXS52YWx1ZSA9PSBleHAtPlhfYWRkX251bWJlcikKLSAgICAgIGJyZWFrOwotCi0gIGlmIChpIDwgMCkKLSAgICBhYm9ydCAoKTsKLQotICAvKiBOb3cgc2VlIGlmIGEgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgcmV0dXJuIHN5bWJvbF9maW5kIChkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIFtpXS5uYW1lKTsKLX0KLQotCi0vKiBmaW5kX29wY29kZSgpIGdldHMgYSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUuICAgICAgICovCi0vKiBJdCBtdXN0IGxvb2sgYXQgYWxsIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCB1c2UgdGhlIG9wZXJhbmRzICovCi0vKiB0byBjaG9vc2UgdGhlIGNvcnJlY3Qgb3Bjb2RlLiAqLwotCi1zdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICoKLWZpbmRfb3Bjb2RlIChvcGNvZGUsIG15b3BzKQotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgZXhwcmVzc2lvblMgbXlvcHNbXTsKLXsKLSAgaW50IGksIG1hdGNoLCBkb25lOwotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm5leHRfb3Bjb2RlOwotCi0gIC8qIGdldCBhbGwgdGhlIG9wZXJhbmRzIGFuZCBzYXZlIHRoZW0gYXMgZXhwcmVzc2lvbnMgKi8KLSAgZ2V0X29wZXJhbmRzIChteW9wcyk7Ci0KLSAgLyogbm93IHNlZSBpZiB0aGUgb3BlcmFuZCBpcyBhIGZha2UuICBJZiBzbywgZmluZCB0aGUgY29ycmVjdCBzaXplICovCi0gIC8qIGluc3RydWN0aW9uLCBpZiBwb3NzaWJsZSAqLwotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gT1BDT0RFX0ZBS0UpCi0gICAgewotICAgICAgaW50IG9wbnVtID0gb3Bjb2RlLT5vcGVyYW5kc1swXTsKLSAgICAgIGludCBmbGFnczsKLQkJCSAKLSAgICAgIGlmIChteW9wc1tvcG51bV0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCXsKLQkgIG15b3BzW29wbnVtXS5YX29wID0gT19zeW1ib2w7Ci0JICBteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNoYXIgKilteW9wc1tvcG51bV0uWF9vcF9zeW1ib2wpOwotCSAgbXlvcHNbb3BudW1dLlhfYWRkX251bWJlciA9IDA7Ci0JICBteW9wc1tvcG51bV0uWF9vcF9zeW1ib2wgPSBOVUxMOwotCX0KLQotICAgICAgbmV4dF9vcGNvZGU9b3Bjb2RlKzE7Ci0KLSAgICAgIC8qIElmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIHN1cHBvc2VkIHRvIGJlIGEgcmVnaXN0ZXIsIG1ha2Ugc3VyZQotCSB3ZSBnb3QgYSB2YWxpZCBvbmUuICAqLwotICAgICAgZmxhZ3MgPSBkMTB2X29wZXJhbmRzW25leHRfb3Bjb2RlLT5vcGVyYW5kc1swXV0uZmxhZ3M7Ci0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQl7Ci0JICBpbnQgWF9vcCA9IG15b3BzWzBdLlhfb3A7Ci0JICBpbnQgbnVtID0gbXlvcHNbMF0uWF9hZGRfbnVtYmVyOwotCi0JICBpZiAoWF9vcCAhPSBPX3JlZ2lzdGVyCi0JICAgICAgfHwgKG51bSAmIH5mbGFncwotCQkgICYgKE9QRVJBTkRfR1BSIHwgT1BFUkFORF9BQ0MwIHwgT1BFUkFORF9BQ0MxCi0JCSAgICAgfCBPUEVSQU5EX0ZGTEFHIHwgT1BFUkFORF9DRkxBRyB8IE9QRVJBTkRfQ09OVFJPTCkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobXlvcHNbb3BudW1dLlhfb3AgPT0gT19jb25zdGFudCB8fCAobXlvcHNbb3BudW1dLlhfb3AgPT0gT19zeW1ib2wgJiYKLQkgIFNfSVNfREVGSU5FRChteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKSAmJgotCSAgKFNfR0VUX1NFR01FTlQobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCkgPT0gbm93X3NlZykpKQotCXsKLQkgIGZvciAoaT0wOyBvcGNvZGUtPm9wZXJhbmRzW2krMV07IGkrKykKLQkgICAgewotCSAgICAgIGludCBiaXRzID0gZDEwdl9vcGVyYW5kc1tuZXh0X29wY29kZS0+b3BlcmFuZHNbb3BudW1dXS5iaXRzOwotCSAgICAgIGludCBmbGFncyA9IGQxMHZfb3BlcmFuZHNbbmV4dF9vcGNvZGUtPm9wZXJhbmRzW29wbnVtXV0uZmxhZ3M7Ci0JICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9BRERSKQotCQliaXRzICs9IDI7Ci0JICAgICAgaWYgKG15b3BzW29wbnVtXS5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBpZiAoIWNoZWNrX3JhbmdlIChteW9wc1tvcG51bV0uWF9hZGRfbnVtYmVyLCBiaXRzLCBmbGFncykpCi0JCSAgICByZXR1cm4gbmV4dF9vcGNvZGU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcmFnUyAqZjsKLQkJICBsb25nIHZhbHVlOwotCQkgIC8qIGNhbGN1bGF0ZSB0aGUgY3VycmVudCBhZGRyZXNzIGJ5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgcHJldmlvdXMgZnJhZ3MgKi8KLQkJICAvKiBhbmQgYWRkaW5nIG91ciBjdXJyZW50IG9mZnNldCAqLwotCQkgIGZvciAodmFsdWUgPSAwLCBmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsgZjsgZiA9IGYtPmZyX25leHQpCi0JCSAgICB2YWx1ZSArPSBmLT5mcl9maXggKyBmLT5mcl9vZmZzZXQ7Ci0KLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JCSAgICB2YWx1ZSA9IFNfR0VUX1ZBTFVFKG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wpIC0gdmFsdWUgLQotCQkgICAgICAob2JzdGFja19uZXh0X2ZyZWUoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpOwotCQkgIGVsc2UKLQkJICAgIHZhbHVlID0gU19HRVRfVkFMVUUobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCk7Ci0KLQkJICBpZiAoQVRfV09SRF9QICgmbXlvcHNbb3BudW1dKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGJpdHMgPiA0KQotCQkJewotCQkJICBiaXRzICs9IDI7Ci0JCQkgIGlmICghY2hlY2tfcmFuZ2UgKHZhbHVlLCBiaXRzLCBmbGFncykpCi0JCQkgICAgcmV0dXJuIG5leHRfb3Bjb2RlOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKCFjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkKLQkJICAgIHJldHVybiBuZXh0X29wY29kZTsKLQkJfQotCSAgICAgIG5leHRfb3Bjb2RlKys7Ci0JICAgIH0KLQkgIGFzX2ZhdGFsIChfKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG5vdCBhIGNvbnN0YW50LCBzbyB1c2UgYSBsb25nIGluc3RydWN0aW9uICovICAgIAotCSAgcmV0dXJuIG9wY29kZSsyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtYXRjaCA9IDA7Ci0gICAgICAvKiBub3cgc2VhcmNoIHRoZSBvcGNvZGUgdGFibGUgdGFibGUgZm9yIG9uZSB3aXRoIG9wZXJhbmRzICovCi0gICAgICAvKiB0aGF0IG1hdGNoZXMgd2hhdCB3ZSd2ZSBnb3QgKi8KLSAgICAgIHdoaWxlICghbWF0Y2gpCi0JewotCSAgbWF0Y2ggPSAxOwotCSAgZm9yIChpID0gMDsgb3Bjb2RlLT5vcGVyYW5kc1tpXTsgaSsrKSAKLQkgICAgewotCSAgICAgIGludCBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0JICAgICAgaW50IFhfb3AgPSBteW9wc1tpXS5YX29wOwotCSAgICAgIGludCBudW0gPSBteW9wc1tpXS5YX2FkZF9udW1iZXI7Ci0KLQkgICAgICBpZiAoWF9vcCA9PSAwKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgCi0JICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JCXsKLQkJICBpZiAoKFhfb3AgIT0gT19yZWdpc3RlcikKLQkJICAgICAgfHwgKG51bSAmIH5mbGFncwotCQkJICAmIChPUEVSQU5EX0dQUiB8IE9QRVJBTkRfQUNDMCB8IE9QRVJBTkRfQUNDMQotCQkJICAgICB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0NGTEFHCi0JCQkgICAgIHwgT1BFUkFORF9DT05UUk9MKSkpCi0JCSAgICB7Ci0JCSAgICAgIG1hdGNoID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAoKChmbGFncyAmIE9QRVJBTkRfTUlOVVMpICAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfTUlOVVMpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9QTFVTKSAgICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9QTFVTKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfQVRNSU5VUykpKSB8fAotCQkgICgoZmxhZ3MgJiBPUEVSQU5EX0FUUEFSKSAgICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBPUEVSQU5EX0FUUEFSKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRTSUdOKSAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfQVRTSUdOKSkpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgCi0JICAgICAgLyogVW5mb3J0dW5hdGx5LCBmb3IgdGhlIGluZGlyZWN0IG9wZXJhbmQgaW4gaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMKLQkJIGBgbGRiIHIxLCBAKGMscjE0KScnIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHBhc3NlZCBYX29wID09IE9fcmVnaXN0ZXIKLQkJIChiZWNhdXNlICdjJyBpcyBhIHZhbGlkIHJlZ2lzdGVyIG5hbWUpLiAgSG93ZXZlciB3ZSBjYW5ub3QganVzdAotCQkgaWdub3JlIHRoZSBjYXNlIHdoZW4gWF9vcCA9PSBPX3JlZ2lzdGVyIGJ1dCBmbGFncyAmIE9QRVJBTkRfUkVHIGlzCi0JCSBudWxsLCBzbyB3ZSBjaGVjayB0byBzZWUgaWYgYSBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVnaXN0ZXIKLQkJIGV4aXN0cy4gIElmIHRoZSBzeW1ib2wgZG9lcyBleGlzdCwgdGhlbiB0aGUgcGFyc2VyIHdhcyB1bmFibGUgdG8KLQkJIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgYW5kIHdlIGZpeCB0aGluZ3MgaGVyZS4gIChSZWY6IFBSMTQ4MjYpICovCi0JICAgICAgCi0JICAgICAgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX1JFRykgJiYgKFhfb3AgPT0gT19yZWdpc3RlcikpCi0JCXsKLQkJICBzeW1ib2xTICogc3ltOwotCQkgIAotCQkgIHN5bSA9IGZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyICgmIG15b3BzW2ldKTsKLQkJICAKLQkJICBpZiAoc3ltICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIG15b3BzIFtpXS5YX29wID09IFhfb3AgPT0gT19zeW1ib2w7Ci0JCSAgICAgIG15b3BzIFtpXS5YX2FkZF9zeW1ib2wgPSBzeW07Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkCi0JCSAgICAgIChfKCJpbGxlZ2FsIG9wZXJhbmQgLSByZWdpc3RlciBuYW1lIGZvdW5kIHdoZXJlIG5vbmUgZXhwZWN0ZWQiKSk7Ci0JCX0KLQkgICAgfQotCSAgCi0JICAvKiBXZSdyZSBvbmx5IGRvbmUgaWYgdGhlIG9wZXJhbmRzIG1hdGNoZWQgc28gZmFyIEFORCB0aGVyZQotCSAgICAgYXJlIG5vIG1vcmUgdG8gY2hlY2suICAqLwotCSAgaWYgKG1hdGNoICYmIG15b3BzW2ldLlhfb3AgPT0gMCkgCi0JICAgIGJyZWFrOwotCSAgZWxzZQotCSAgICBtYXRjaCA9IDA7Ci0KLQkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKLQkgIAotCSAgaWYgKG5leHRfb3Bjb2RlLT5vcGNvZGUgPT0gMCkgCi0JICAgIGJyZWFrOwotCSAgCi0JICBpZiAoc3RyY21wIChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQkgICAgYnJlYWs7Ci0JICAKLQkgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkgIAotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIG9wY29kZSBvciBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoYXQgYWxsIHJlZ2lzdGVycyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSBldmVuIGFyZS4gKi8KLSAgLyogQWxzbywgaWYgYW55IG9wZXJhbmRzIHdlcmUgbWFya2VkIGFzIHJlZ2lzdGVycywgYnV0IHdlcmUgcmVhbGx5IHN5bWJvbHMgKi8KLSAgLyogZml4IHRoYXQgaGVyZS4gKi8KLSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaV07IGkrKykgCi0gICAgewotICAgICAgaWYgKChkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgT1BFUkFORF9FVkVOKSAmJgotCSAgKG15b3BzW2ldLlhfYWRkX251bWJlciAmIDEpKSAKLQlhc19mYXRhbCAoXygiUmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgRVZFTiIpKTsKLSAgICAgIGlmIChteW9wc1tpXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgaWYgKCEoZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIE9QRVJBTkRfUkVHKSkgCi0JICAgIHsKLQkgICAgICBteW9wc1tpXS5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgbXlvcHNbaV0uWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNoYXIgKilteW9wc1tpXS5YX29wX3N5bWJvbCk7Ci0JICAgICAgbXlvcHNbaV0uWF9hZGRfbnVtYmVyID0gMDsKLQkgICAgICBteW9wc1tpXS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gb3Bjb2RlOwotfQotCi0vKiBpZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLCAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+Znhfb2Zmc2V0OwotCi0gIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQotICAgICBmaXhTICpmaXhwOwotICAgICBzZWdUIHNlYzsKLXsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopTlVMTCAmJiAoIVNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpIHx8Ci0gICAgICAoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IHNlYykpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICB2YWx1ZVQgKnZhbHVlcDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGNoYXIgKndoZXJlOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGxvbmcgdmFsdWU7Ci0gIGludCBvcF90eXBlOwotICBpbnQgbGVmdD0wOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgdmFsdWUgPSAqdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLSAJICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIG9wX3R5cGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gIGlmIChvcF90eXBlICYgMjA0OCkKLSAgICB7Ci0gICAgICBvcF90eXBlIC09IDIwNDg7Ci0gICAgICBpZiAob3BfdHlwZSAmIDEwMjQpCi0JewotCSAgb3BfdHlwZSAtPSAxMDI0OwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTDsKLQkgIGxlZnQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wX3R5cGUgJiA0MDk2KQotCXsKLQkgIG9wX3R5cGUgLT0gNDA5NjsKLQkgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMTBWXzE4OwotCX0KLSAgICAgIGVsc2UKLQlmaXhwLT5meF9yX3R5cGUgPSBnZXRfcmVsb2MoKHN0cnVjdCBkMTB2X29wZXJhbmQgKikmZDEwdl9vcGVyYW5kc1tvcF90eXBlXSk7IAotICAgIH0KLQotICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KLSAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gIGluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzE4OgotICAgICAgLyogaW5zdHJ1Y3Rpb24gYWRkcmVzc2VzIGFyZSBhbHdheXMgcmlnaHQtc2hpZnRlZCBieSAyICovCi0gICAgICB2YWx1ZSA+Pj0gQVRfV09SRF9SSUdIVF9TSElGVDsKLSAgICAgIGlmIChmaXhwLT5meF9zaXplID09IDIpCi0JYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGQxMHZfb3Bjb2RlICpyZXAsICpyZXBpOwotCi0JICByZXAgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopIGhhc2hfZmluZCAoZDEwdl9oYXNoLCAicmVwIik7Ci0JICByZXBpID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKSBoYXNoX2ZpbmQgKGQxMHZfaGFzaCwgInJlcGkiKTsKLQkgIGlmICgoaW5zbiAmIEZNMTEpID09IEZNMTEKLQkgICAgICAmJiAocmVwaSAhPSBOVUxMICYmIChpbnNuICYgcmVwaS0+bWFzaykgPT0gcmVwaS0+b3Bjb2RlCi0JCSAgfHwgcmVwICE9IE5VTEwgJiYgKGluc24gJiByZXAtPm1hc2spID09IHJlcC0+b3Bjb2RlKQotCSAgICAgICYmIHZhbHVlIDwgNCkKLQkgICAgYXNfZmF0YWwKLQkgICAgICAoXygibGluZSAlZDogcmVwIG9yIHJlcGkgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IDQgaW5zdHJ1Y3Rpb25zIiksCi0JICAgICAgIGZpeHAtPmZ4X2xpbmUpOwotCSAgaW5zbiA9IGQxMHZfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wX3R5cGUsIChvZmZzZXRUKXZhbHVlLCBsZWZ0LCBmaXhwKTsKLQkgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7ICAKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBiZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4cC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygibGluZSAlZDogdW5rbm93biByZWxvY2F0aW9uIHR5cGU6IDB4JXgiKSxmaXhwLT5meF9saW5lLGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogZDEwdl9jbGVhbnVwKCkgaXMgY2FsbGVkIGFmdGVyIHRoZSBhc3NlbWJsZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcgdGhlIGlucHV0IAotICAgZmlsZSBvciBhZnRlciBhIGxhYmVsIGlzIGRlZmluZWQuICBCZWNhdXNlIHRoZSBEMTBWIGFzc2VtYmxlciBzb21ldGltZXMgc2F2ZXMgc2hvcnQgCi0gICBpbnN0cnVjdGlvbnMgdG8gc2VlIGlmIGl0IGNhbiBwYWNrYWdlIHRoZW0gd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgdGhlcmUgbWF5Ci0gICBiZSBhIHNob3J0IGluc3RydWN0aW9uIHRoYXQgc3RpbGwgbmVlZHMgd3JpdHRlbi4gICovCi1pbnQKLWQxMHZfY2xlYW51cCAoKQotewotICBzZWdUIHNlZzsKLSAgc3Vic2VnVCBzdWJzZWc7Ci0KLSAgaWYgKHByZXZfb3Bjb2RlICYmIGV0eXBlID09IDApCi0gICAgewotICAgICAgc2VnID0gbm93X3NlZzsKLSAgICAgIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBpZiAocHJldl9zZWcpCi0Jc3Vic2VnX3NldCAocHJldl9zZWcsIHByZXZfc3Vic2VnKTsKLSAgICAgIHdyaXRlXzFfc2hvcnQgKHByZXZfb3Bjb2RlLCBwcmV2X2luc24sIGZpeHVwcy0+bmV4dCk7Ci0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgICBwcmV2X29wY29kZSA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotLyogTGlrZSBub3JtYWwgLndvcmQsIGV4Y2VwdCBzdXBwb3J0IEB3b3JkICovCi0vKiBjbG9iYmVycyBpbnB1dF9saW5lX3BvaW50ZXIsIGNoZWNrcyBlbmQtb2YtbGluZS4gKi8KLXN0YXRpYyB2b2lkCi1kMTB2X2RvdF93b3JkIChuYnl0ZXMpCi0gICAgIHJlZ2lzdGVyIGludCBuYnl0ZXM7CS8qIDE9LmJ5dGUsIDI9LndvcmQsIDQ9LmxvbmcgKi8KLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIGNoYXIgKnA7Ci0gIGludCBvZmZzZXQ7Ci0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBleHByZXNzaW9uICgmZXhwKTsKLSAgICAgIGlmICghc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkB3b3JkIiwgNSkpCi0JewotCSAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLQkKLQkgIHAgPSBmcmFnX21vcmUgKDIpOwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsIAotCQkgICAgICAgJmV4cCwgMCwgQkZEX1JFTE9DX0QxMFZfMTgpOwotCX0KLSAgICAgIGVsc2UKLQllbWl0X2V4cHIgKCZleHAsIDIpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotCi0vKiBNaXRzdWJpc2hpIGFza2VkIHRoYXQgd2Ugc3VwcG9ydCBzb21lIG9sZCBzeW50YXggdGhhdCBhcHBhcmVudGx5ICovCi0vKiBoYWQgaW1tZWRpYXRlIG9wZXJhbmRzIHN0YXJ0aW5nIHdpdGggJyMnLiAgVGhpcyBpcyBpbiBzb21lIG9mIHRoZWlyICovCi0vKiBzYW1wbGUgY29kZSBidXQgaXMgbm90IGRvY3VtZW50ZWQgKGFsdGhvdWdoIGl0IGFwcGVhcnMgaW4gc29tZSAgKi8KLS8qIGV4YW1wbGVzIGluIHRoZWlyIGFzc2VtYmxlciBtYW51YWwpLiBGb3Igbm93LCB3ZSdsbCBzb2x2ZSB0aGlzICovCi0vKiBjb21wYXRpYmlsaXR5IHByb2JsZW0gYnkgc2ltcGx5IGlnbm9yaW5nIGFueSAnIycgYXQgdGhlIGJlZ2lubmluZyAqLwotLyogb2YgYW4gb3BlcmFuZC4gKi8KLQotLyogb3BlcmFuZHMgdGhhdCBiZWdpbiB3aXRoICcjJyBzaG91bGQgZmFsbCB0aHJvdWdoIHRvIGhlcmUgKi8KLS8qIGZyb20gZXhwci5jICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycgJiYgISBkb19ub3RfaWdub3JlX2hhc2gpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi1ib29sZWFuCi1kMTB2X2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqZml4UDsKLXsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQotCi1pbnQKLWQxMHZfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZDEwdi5oIGIvZ2FzL2NvbmZpZy90Yy1kMTB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZmZkNWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiB0Yy1kMTB2LmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLWQxMHYuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfRDEwVgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIEQxMFYgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfZDEwdgotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWQxMHYiCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykgICAKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuCi0KLWludCBkMTB2X2NsZWFudXAgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9hZnRlcl9wYXNzX2hvb2soKQkgICAgIGQxMHZfY2xlYW51cCgpCi0jZGVmaW5lIG1kX2NsZWFudXAoKQkJICAgICBkMTB2X2NsZWFudXAoKQotI2RlZmluZSBtZF9kb19hbGlnbihhLGIsYyxkLGUpCSAgICAgZDEwdl9jbGVhbnVwKCkKLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIGRvIHtcCi0gIGQxMHZfY2xlYW51cCgpOyBcCi0gIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIGQxMHZfZml4X2FkanVzdGFibGUoZml4UCkKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSBkMTB2X2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKLWV4dGVybiBpbnQgZDEwdl9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWQzMHYuYyBiL2dhcy9jb25maWcvdGMtZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjgyYTU3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIxOSArMCwwIEBACi0vKiB0Yy1kMzB2LmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNaXRzdWJpc2hpIEQzMFYKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJvcGNvZGUvZDMwdi5oIgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJPbk5jQyI7Ci1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotCi0jZGVmaW5lIE5PUF9NVUxUSVBMWSAxCi0jZGVmaW5lIE5PUF9BTEwgMgotc3RhdGljIGludCB3YXJuX25vcHMgPSAwOwotc3RhdGljIGludCBPcHRpbWl6aW5nID0gMDsKLXN0YXRpYyBpbnQgd2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cyA9IDE7Ci0KLSNkZWZpbmUgRk9SQ0VfU0hPUlQJMQotI2RlZmluZSBGT1JDRV9MT05HCTIKLQotLyogRVhFQyB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gX2V4ZWNfdHlwZQotewotICBFWEVDX1VOS05PV04sCQkJLyogbm8gb3JkZXIgc3BlY2lmaWVkICovCi0gIEVYRUNfUEFSQUxMRUwsCQkvKiBkb25lIGluIHBhcmFsbGVsIChGTT0wMCkgKi8KLSAgRVhFQ19TRVEsCQkJLyogc2VxdWVudGlhbCAoRk09MDEpICovCi0gIEVYRUNfUkVWU0VRCQkJLyogcmV2ZXJzZSBzZXF1ZW50aWFsIChGTT0xMCkgKi8KLX0gZXhlY190eXBlX2VudW07Ci0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgZDMwdl9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGVyYW5kOwotICBpbnQgcGNyZWw7Ci0gIGludCBzaXplOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfZml4dXBzCi17Ci0gIGludCBmYzsKLSAgc3RydWN0IGQzMHZfZml4dXAgZml4W01BWF9JTlNOX0ZJWFVQU107Ci0gIHN0cnVjdCBfZml4dXBzICpuZXh0OwotfSBGaXh1cHM7Ci0KLXN0YXRpYyBGaXh1cHMgRml4VXBzWzJdOwotc3RhdGljIEZpeHVwcyAqZml4dXBzOwotCi0vKiBXaGV0aGVyIGN1cnJlbnQgYW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGFyZSB3b3JkIG11bHRpcGx5IGluc25zLiAgKi8KLXN0YXRpYyBpbnQgY3VyX211bDMyX3AgPSAwOwotc3RhdGljIGludCBwcmV2X211bDMyX3AgPSAwOwotCi0vKiAgVGhlIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCBpcyB0cnVlIGlmZiB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYXNzZW1ibGVkCi0gICAgaGFzIGJlZW4gZXhwbGljaXRseSB3cml0dGVuIGFzIGEgcGFyYWxsZWwgc2hvcnQtaW5zdHJ1Y3Rpb24gcGFpciBieSB0aGUKLSAgICBodW1hbiBwcm9ncmFtbWVyLiAgSXQgaXMgdXNlZCBpbiBwYXJhbGxlbF9vaygpIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgICB0aG9zZSBkYW5nZXJvdXMgcGFyYWxsZWxpemF0aW9ucyBhdHRlbXB0ZWQgYnkgdGhlIGh1bWFuLCB3aGljaCBhcmUgdG8gYmUKLSAgICBhbGxvd2VkLCBhbmQgdGhvc2UgYXR0ZW1wdGVkIGJ5IHRoZSBhc3NlbWJsZXIsIHdoaWNoIGFyZSBub3QuICBJdCBpcyBzZXQKLSAgICBmcm9tIG1kX2Fzc2VtYmxlKCkuICAqLwotc3RhdGljIGludCBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSAwOyAKLXN0YXRpYyBpbnQgZmxhZ194cF9zdGF0ZSA9IDA7Ci0KLS8qIFdoZXRoZXIgY3VycmVudCBhbmQgcHJldmlvdXMgbGVmdCBzdWItaW5zdHJ1Y3Rpb24gZGlzYWJsZXMKLSAgIGV4ZWN1dGlvbiBvZiByaWdodCBzdWItaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIGludCBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMDsKLXN0YXRpYyBpbnQgcHJldl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOwotCi0vKiBUaGUga25vd24gY3VycmVudCBhbGlnbm1lbnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50IGQzMHZfY3VycmVudF9hbGlnbjsKLXN0YXRpYyBzZWdUIGQzMHZfY3VycmVudF9hbGlnbl9zZWc7Ci0KLS8qIFRoZSBsYXN0IHNlZW4gbGFiZWwgaW4gdGhlIGN1cnJlbnQgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBhdXRvLWFsaWduCi0gICBsYWJlbHMgcHJlY2VlZGluZyBpbnN0cnVjdGlvbnMuICAqLwotc3RhdGljIHN5bWJvbFMgKmQzMHZfbGFzdF9sYWJlbDsKLQotLyogVHdvIG5vcHMgKi8KLSNkZWZpbmUgTk9QX0xFRlQgICAoKGxvbmcgbG9uZykgTk9QIDw8IDMyKQotI2RlZmluZSBOT1BfUklHSFQgICgobG9uZyBsb25nKSBOT1ApCi0jZGVmaW5lIE5PUDIgKEZNMDAgfCBOT1BfTEVGVCB8IE5PUF9SSUdIVCkKLQotLyogbG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci1zdGF0aWMgaW50IHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgaW50IGNoZWNrX3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7Ci1zdGF0aWMgaW50IHBvc3RmaXggUEFSQU1TICgoY2hhciAqcCkpOwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBnZXRfcmVsb2MgUEFSQU1TICgoc3RydWN0IGQzMHZfb3BlcmFuZCAqb3AsIGludCByZWxfZmxhZykpOwotc3RhdGljIGludCBnZXRfb3BlcmFuZHMgUEFSQU1TICgoZXhwcmVzc2lvblMgZXhwW10sIGludCBjbXBfaGFjaykpOwotc3RhdGljIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZmluZF9mb3JtYXQgUEFSQU1TICgoc3RydWN0IGQzMHZfb3Bjb2RlICpvcGNvZGUsIAotCQkJZXhwcmVzc2lvblMgb3BzW10saW50IGZzaXplLCBpbnQgY21wX2hhY2spKTsKLXN0YXRpYyBsb25nIGxvbmcgYnVpbGRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUsIGV4cHJlc3Npb25TICpvcGVycykpOwotc3RhdGljIHZvaWQgd3JpdGVfbG9uZyBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUsIGxvbmcgbG9uZyBpbnNuLCBGaXh1cHMgKmZ4KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV8xX3Nob3J0IFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwgbG9uZyBsb25nIGluc24sCi0JCQkJICAgRml4dXBzICpmeCwgaW50IHVzZV9zZXF1ZW50aWFsKSk7Ci1zdGF0aWMgaW50IHdyaXRlXzJfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMSwgbG9uZyBsb25nIGluc24xLCAKLQkJICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMiwgbG9uZyBsb25nIGluc24yLCBleGVjX3R5cGVfZW51bSBleGVjX3R5cGUsIEZpeHVwcyAqZngpKTsKLXN0YXRpYyBsb25nIGxvbmcgZG9fYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUsCi0JCQkJICAgICAgaW50IHNob3J0cCwgaW50IGlzX3BhcmFsbGVsKSk7Ci1zdGF0aWMgaW50IHBhcmFsbGVsX29rIFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTEsIHVuc2lnbmVkIGxvbmcgaW5zbjEsIAotCQkJCXN0cnVjdCBkMzB2X2luc24gKm9wY29kZTIsIHVuc2lnbmVkIGxvbmcgaW5zbjIsCi0JCQkJZXhlY190eXBlX2VudW0gZXhlY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X251bWJlcl90b19jaGFycyBQQVJBTVMgKChjaGFyICpidWYsIGxvbmcgbG9uZyB2YWx1ZSwgaW50IG5ieXRlcykpOwotc3RhdGljIHZvaWQgY2hlY2tfc2l6ZSBQQVJBTVMgKChsb25nIHZhbHVlLCBpbnQgYml0cywgY2hhciAqZmlsZSwgaW50IGxpbmUpKTsKLXN0YXRpYyB2b2lkIGQzMHZfYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgc19kMzB2X2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kMzB2X3RleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2QzMHZfZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZDMwdl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7ICAgICAgIAotCi0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndvcmQiLCBjb25zLCA0IH0sCi0gIHsgImh3b3JkIiwgY29ucywgMiB9LAotICB7ICJhbGlnbiIsIHNfZDMwdl9hbGlnbiwgMCB9LAotICB7ICJ0ZXh0Iiwgc19kMzB2X3RleHQsIDAgfSwKLSAgeyAiZGF0YSIsIHNfZDMwdl9kYXRhLCAwIH0sCi0gIHsgInNlY3Rpb24iLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0aW9uLnMiLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0Iiwgc19kMzB2X3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdC5zIiwgc19kMzB2X3NlY3Rpb24sIDAgfSwKLSAgeyBOVUxMLCBOVUxMLCAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpkMzB2X2hhc2g7Ci0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgcHJlX2RlZmluZWRfcmVnaXN0ZXJzCi0gICBhcnJheSB0byBzZWUgaWYgIm5hbWUiIGlzIGEgdmFsaWQgcmVnaXRlciBuYW1lLiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIKLSAgIG51bWJlciBmcm9tIHRoZSBhcnJheSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLiAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gcmVnX25hbWVfY250ICgpIC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzeW1ib2xfZmluZCAobmFtZSkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICh3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzKQotCQlhc193YXJuIChfKCJSZWdpc3RlciBuYW1lICVzIGNvbmZsaWN0cyB3aXRoIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lIiksCi0JCQkgbmFtZSk7Ci0JICAgIH0KLSAgCi0JICByZXR1cm4gcHJlX2RlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0udmFsdWU7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgCi0gIHJldHVybiAtMTsKLX0KLQotLyogcmVnaXN0ZXJfbmFtZSgpIGNoZWNrcyB0aGUgc3RyaW5nIGF0IGlucHV0X2xpbmVfcG9pbnRlcgotICAgdG8gc2VlIGlmIGl0IGlzIGEgdmFsaWQgcmVnaXN0ZXIgbmFtZS4gICovCi0KLXN0YXRpYyBpbnQKLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyIGMsICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgd2hpbGUgKCpwICYmICpwIT0nXG4nICYmICpwIT0nXHInICYmICpwICE9JywnICYmICpwIT0nICcgJiYgKnAhPScpJykKLSAgICBwKys7Ci0KLSAgYyA9ICpwOwotICBpZiAoYykKLSAgICAqcCsrID0gMDsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChpbnB1dF9saW5lX3BvaW50ZXIpOwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICAvKiB0ZW1wb3JhcmlseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBoZXJlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSAoc3ltYm9sUyAqKWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGMpCi0gICAgKihwLTEpID0gYzsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotY2hlY2tfcmFuZ2UgKG51bSwgYml0cywgZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtOwotICAgICBpbnQgYml0czsKLSAgICAgaW50IGZsYWdzOwotewotICBsb25nIG1pbiwgbWF4OwotICBpbnQgcmV0dmFsPTA7Ci0KLSAgLyogZG9uJ3QgYm90aGVyIGNoZWNraW5nIDMyLWJpdCB2YWx1ZXMgKi8KLSAgaWYgKGJpdHMgPT0gMzIpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKLSAgICB7Ci0gICAgICAvKiBXZSBrbm93IHRoYXQgYWxsIHNoaWZ0cyBhcmUgcmlnaHQgYnkgdGhyZWUgYml0cy4uLi4gKi8KLSAgICAgIAotICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0JbnVtID0gKHVuc2lnbmVkIGxvbmcpICgoKC8qc2lnbmVkKi8gbG9uZykgbnVtKSA+PiAzKTsKLSAgICAgIGVsc2UKLQludW0gPj49IDM7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotICAgIHsKLSAgICAgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpLTE7IAotICAgICAgbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsKLSAgICAgIGlmICgoKGxvbmcpbnVtID4gbWF4KSB8fCAoKGxvbmcpbnVtIDwgbWluKSkKLQlyZXR2YWwgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1heCA9ICgxIDw8IGJpdHMpIC0gMTsKLSAgICAgIG1pbiA9IDA7Ci0gICAgICBpZiAoKG51bSA+IG1heCkgfHwgKG51bSA8IG1pbikpCi0JcmV0dmFsID0gMTsKLSAgICB9Ci0gIAotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuRDMwViBvcHRpb25zOlxuXAotLU8gICAgICAgICAgICAgICAgICAgICAgTWFrZSBhZGphY2VudCBzaG9ydCBpbnN0cnVjdGlvbnMgcGFyYWxsZWwgaWYgcG9zc2libGUuXG5cCi0tbiAgICAgICAgICAgICAgICAgICAgICBXYXJuIGFib3V0IGFsbCBOT1BzIGluc2VydGVkIGJ5IHRoZSBhc3NlbWJsZXIuXG5cCi0tTgkJCVdhcm4gYWJvdXQgTk9QcyBpbnNlcnRlZCBhZnRlciB3b3JkIG11bHRpcGxpZXMuXG5cCi0tYyAgICAgICAgICAgICAgICAgICAgICBXYXJuIGFib3V0IHN5bWJvbHMgd2hvZXMgbmFtZXMgbWF0Y2ggcmVnaXN0ZXIgbmFtZXMuXG5cCi0tQyAgICAgICAgICAgICAgICAgICAgICBPcHBvc2l0ZSBvZiAtQy4gIC1jIGlzIHRoZSBkZWZhdWx0LlxuIikpOwotfQotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgICAgLyogT3B0aW1pemUuIFdpbGwgYXR0ZW1wdCB0byBwYXJhbGxlbGl6ZSBvcGVyYXRpb25zICovCi0gICAgY2FzZSAnTyc6Ci0gICAgICBPcHRpbWl6aW5nID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBXYXJuIGFib3V0IGFsbCBOT1BTIHRoYXQgdGhlIGFzc2VtYmxlciBpbnNlcnRzLiAgKi8KLSAgICBjYXNlICduJzoKLSAgICAgIHdhcm5fbm9wcyA9IE5PUF9BTEw7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2FybiBhYm91dCB0aGUgTk9QUyB0aGF0IHRoZSBhc3NlbWJsZXIgaW5zZXJ0cyBiZWNhdXNlIG9mIHRoZQotCSBtdWx0aXBseSBoYXphcmQuICAqLwotICAgIGNhc2UgJ04nOgotICAgICAgd2Fybl9ub3BzID0gTk9QX01VTFRJUExZOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzoKLSAgICAgIHdhcm5fcmVnaXN0ZXJfbmFtZV9jb25mbGljdHMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgIHdhcm5fcmVnaXN0ZXJfbmFtZV9jb25mbGljdHMgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLSAgCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAKLSAgKnNpemVQID0gcHJlYyAqIDI7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGFib3J0ICgpOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgdmFsdWVUIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICogb3Bjb2RlOwotICBkMzB2X2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAvKiBJbnNlcnQgb3Bjb2RlIG5hbWVzIGludG8gYSBoYXNoIHRhYmxlLiAqLwotICBmb3IgKG9wY29kZSA9IChzdHJ1Y3QgZDMwdl9vcGNvZGUgKilkMzB2X29wY29kZV90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICAgIGhhc2hfaW5zZXJ0IChkMzB2X2hhc2gsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQotICBmaXh1cHMgPSAmRml4VXBzWzBdOwotICBGaXhVcHNbMF0ubmV4dCA9ICZGaXhVcHNbMV07Ci0gIEZpeFVwc1sxXS5uZXh0ID0gJkZpeFVwc1swXTsKLQotICBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnID0gbm93X3NlZzsKLX0KLQotCi0vKiB0aGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHBvc3RpbmNyZW1lbnQgb3IgcG9zdGRlY3JlbWVudAotICAgb3BlcmF0b3IgKCAnKycgb3IgJy0nICkgZnJvbSBhbiBleHByZXNzaW9uICovCi0KLXN0YXRpYyBpbnQgcG9zdGZpeCAocCkgCi0gICAgIGNoYXIgKnA7Ci17Ci0gIHdoaWxlICgqcCAhPSAnLScgJiYgKnAgIT0gJysnKSAKLSAgICB7Ci0gICAgICBpZiAoKnA9PTAgfHwgKnA9PSdcbicgfHwgKnA9PSdccicgfHwgKnA9PScgJyB8fCAqcD09JywnKSAKLQlicmVhazsKLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgaWYgKCpwID09ICctJykgCi0gICAgewotICAgICAgKnAgPSAnICc7Ci0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0gIGlmICgqcCA9PSAnKycpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIAotZ2V0X3JlbG9jIChvcCwgcmVsX2ZsYWcpIAotICAgICBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcDsKLSAgICAgaW50IHJlbF9mbGFnOwotewotICBzd2l0Y2ggKG9wLT5iaXRzKQotICAgIHsKLSAgICBjYXNlIDY6Ci0gICAgICBpZiAob3AtPmZsYWdzICYgT1BFUkFORF9TSElGVCkKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6Ci0gICAgICBpZiAoIShvcC0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKSkKLQlhc193YXJuIChfKCJ1bmV4cGVjdGVkIDEyLWJpdCByZWxvYyB0eXBlIikpOwotICAgICAgaWYgKHJlbF9mbGFnID09IFJFTE9DX1BDUkVMKQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMTU7Ci0gICAgY2FzZSAxODoKLSAgICAgIGlmICghKG9wLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpKQotCWFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgMTgtYml0IHJlbG9jIHR5cGUiKSk7Ci0gICAgICBpZiAocmVsX2ZsYWcgPT0gUkVMT0NfUENSRUwpCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMOwotICAgICAgZWxzZQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8yMTsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKHJlbF9mbGFnID09IFJFTE9DX1BDUkVMKQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMzI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogZ2V0X29wZXJhbmRzIHBhcnNlcyBhIHN0cmluZyBvZiBvcGVyYW5kcyBhbmQgcmV0dXJucwotICAgYW4gYXJyYXkgb2YgZXhwcmVzc2lvbnMgKi8KLQotc3RhdGljIGludAotZ2V0X29wZXJhbmRzIChleHAsIGNtcF9oYWNrKSAKLSAgICAgZXhwcmVzc2lvblMgZXhwW107Ci0gICAgIGludCBjbXBfaGFjazsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IG51bW9wcyA9IDA7Ci0gIGludCBwb3N0ID0gMDsKLQotICBpZiAoY21wX2hhY2spCi0gICAgewotICAgICAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotICAgICAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBjbXBfaGFjayAtIDE7Ci0gICAgfQotCi0gIHdoaWxlICgqcCkgIAotICAgIHsKLSAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnLCcpIAotCXArKzsKLSAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJykgCi0JYnJlYWs7Ci0gICAgICAKLSAgICAgIGlmICgqcCA9PSAnQCcpIAotCXsKLQkgIHArKzsKLQkgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGlmICgqcCA9PSAnKCcpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRQQVI7Ci0JICAgICAgcG9zdCA9IHBvc3RmaXggKHApOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcCA9PSAnLScpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRNSU5VUzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVFNJR047Ci0JICAgICAgcG9zdCA9IHBvc3RmaXggKHApOwotCSAgICB9Ci0JICBudW1vcHMrKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCpwID09ICcpJykgCi0JewotCSAgLyoganVzdCBza2lwIHRoZSB0cmFpbGluZyBwYXJlbiAqLwotCSAgcCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotCi0gICAgICAvKiBjaGVjayB0byBzZWUgaWYgaXQgbWlnaHQgYmUgYSByZWdpc3RlciBuYW1lICovCi0gICAgICBpZiAoIXJlZ2lzdGVyX25hbWUgKCZleHBbbnVtb3BzXSkpCi0JewotCSAgLyogcGFyc2UgYXMgYW4gZXhwcmVzc2lvbiAqLwotCSAgZXhwcmVzc2lvbiAoJmV4cFtudW1vcHNdKTsKLQl9Ci0KLSAgICAgIGlmIChleHBbbnVtb3BzXS5YX29wID09IE9faWxsZWdhbCkgCi0JYXNfYmFkIChfKCJpbGxlZ2FsIG9wZXJhbmQiKSk7Ci0gICAgICBlbHNlIGlmIChleHBbbnVtb3BzXS5YX29wID09IE9fYWJzZW50KSAKLQlhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLQotICAgICAgbnVtb3BzKys7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBzd2l0Y2ggKHBvc3QpIAotCXsKLQljYXNlIC0xOgkvKiBwb3N0ZGVjcmVtZW50IG1vZGUgKi8KLQkgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGV4cFtudW1vcHMrK10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9NSU5VUzsKLQkgIGJyZWFrOwotCWNhc2UgMToJLyogcG9zdGluY3JlbWVudCBtb2RlICovCi0JICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0JICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfUExVUzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHBvc3QgPSAwOwotICAgIH0KLQotICBleHBbbnVtb3BzXS5YX29wID0gMDsKLSAgcmV0dXJuIChudW1vcHMpOwotfQotCi0vKiBidWlsZF9pbnNuIGdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24uICBJdCBkb2VzIGV2ZXJ5dGhpbmcgKi8KLS8qIGJ1dCB3cml0ZSB0aGUgRk0gYml0cy4gKi8KLQotc3RhdGljIGxvbmcgbG9uZwotYnVpbGRfaW5zbiAob3Bjb2RlLCBvcGVycykgCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTsKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJzOwotewotICBpbnQgaSwgbGVuZ3RoLCBiaXRzLCBzaGlmdCwgZmxhZ3M7Ci0gIHVuc2lnbmVkIGludCBudW1iZXIsIGlkPTA7Ci0gIGxvbmcgbG9uZyBpbnNuOwotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wID0gb3Bjb2RlLT5vcDsKLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmb3JtID0gb3Bjb2RlLT5mb3JtOwotCi0gIGluc24gPSBvcGNvZGUtPmVjYyA8PCAyOCB8IG9wLT5vcDEgPDwgMjUgfCBvcC0+b3AyIDw8IDIwIHwgZm9ybS0+bW9kaWZpZXIgPDwgMTg7Ci0KLSAgZm9yIChpPTA7IGZvcm0tPm9wZXJhbmRzW2ldOyBpKyspIAotICAgIHsgCi0gICAgICBmbGFncyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0KLSAgICAgIC8qIG11c3QgYmUgYSByZWdpc3RlciBvciBudW1iZXIgKi8KLSAgICAgIGlmICghKGZsYWdzICYgT1BFUkFORF9SRUcpICYmICEoZmxhZ3MgJiBPUEVSQU5EX05VTSkgJiYgCi0JICAhKGZsYWdzICYgT1BFUkFORF9OQU1FKSAmJiAhKGZsYWdzICYgT1BFUkFORF9TUEVDSUFMKSkKLQljb250aW51ZTsKLQotICAgICAgYml0cyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0uYml0czsKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0JYml0cyArPSAzOwotCi0gICAgICBsZW5ndGggPSBkMzB2X29wZXJhbmRfdGFibGVbZm9ybS0+b3BlcmFuZHNbaV1dLmxlbmd0aDsKLSAgICAgIHNoaWZ0ID0gMTIgLSBkMzB2X29wZXJhbmRfdGFibGVbZm9ybS0+b3BlcmFuZHNbaV1dLnBvc2l0aW9uOwotICAgICAgaWYgKG9wZXJzW2ldLlhfb3AgIT0gT19zeW1ib2wpCi0JbnVtYmVyID0gb3BlcnNbaV0uWF9hZGRfbnVtYmVyOwotICAgICAgZWxzZQotCW51bWJlciA9IDA7Ci0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQl7Ci0JICAvKiBjaGVjayBmb3IgbXZmc3lzIG9yIG12dHN5cyBjb250cm9sIHJlZ2lzdGVycyAqLwotCSAgaWYgKGZsYWdzICYgT1BFUkFORF9DT05UUk9MICYmIChudW1iZXIgJiAweDdmKSA+IE1BWF9DT05UUk9MX1JFRykKLQkgICAgewotCSAgICAgIC8qIFBTV0wgb3IgUFNXSCAqLwotCSAgICAgIGlkID0gKG51bWJlciAmIDB4N2YpIC0gTUFYX0NPTlRST0xfUkVHOwotCSAgICAgIG51bWJlciA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG51bWJlciAmIE9QRVJBTkRfRkxBRykKLQkgICAgewotCSAgICAgIGlkID0gMzsgIC8qIG51bWJlciBpcyBhIGZsYWcgcmVnaXN0ZXIgKi8KLQkgICAgfQotCSAgbnVtYmVyICY9IDB4N0Y7Ci0JfQotICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NQRUNJQUwpCi0JewotCSAgbnVtYmVyID0gaWQ7Ci0JfQotCi0gICAgICBpZiAob3BlcnNbaV0uWF9vcCAhPSBPX3JlZ2lzdGVyICYmIG9wZXJzW2ldLlhfb3AgIT0gT19jb25zdGFudCAmJiAhKGZsYWdzICYgT1BFUkFORF9OQU1FKSkKLQl7Ci0JICAvKiBub3cgY3JlYXRlIGEgZml4dXAgKi8KLQotCSAgaWYgKGZpeHVwcy0+ZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9IAotCSAgICBnZXRfcmVsb2MgKChzdHJ1Y3QgZDMwdl9vcGVyYW5kICopJmQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0sIG9wLT5yZWxvY19mbGFnKTsKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnNpemUgPSA0OwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uZXhwID0gb3BlcnNbaV07Ci0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5vcGVyYW5kID0gZm9ybS0+b3BlcmFuZHNbaV07Ci0JICBpZiAoZml4dXBzLT5maXhbZml4dXBzLT5mY10ucmVsb2MgPT0gQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCkKLQkgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ucGNyZWwgPSBSRUxPQ19QQ1JFTDsKLQkgIGVsc2UKLQkgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ucGNyZWwgPSBvcC0+cmVsb2NfZmxhZzsKLQkgIChmaXh1cHMtPmZjKSsrOwotCX0KLQotICAgICAgLyogdHJ1bmNhdGUgdG8gdGhlIHByb3BlciBudW1iZXIgb2YgYml0cyAqLwotICAgICAgaWYgKChvcGVyc1tpXS5YX29wID09IE9fY29uc3RhbnQpICYmIGNoZWNrX3JhbmdlIChudW1iZXIsIGJpdHMsIGZsYWdzKSkKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlOiAlZCIpLG51bWJlcik7Ci0gICAgICBpZiAoYml0cyA8IDMxKQotCW51bWJlciAmPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKLQludW1iZXIgPj49IDM7Ci0gICAgICBpZiAoYml0cyA9PSAzMikKLQl7Ci0JICAvKiBpdCdzIGEgTE9ORyBpbnN0cnVjdGlvbiAqLwotCSAgaW5zbiB8PSAobnVtYmVyID4+IDI2KTsJLyogdG9wIDYgYml0cyAqLwotCSAgaW5zbiA8PD0gMzI7CQkJLyogc2hpZnQgdGhlIGZpcnN0IHdvcmQgb3ZlciAqLwotCSAgaW5zbiB8PSAoKG51bWJlciAmIDB4MDNGQzAwMDApIDw8IDIpOyAgLyogbmV4dCA4IGJpdHMgKi8gCi0JICBpbnNuIHw9IG51bWJlciAmIDB4MDAwM0ZGRkY7CQkvKiBib3R0b20gMTggYml0cyAqLwotCX0KLSAgICAgIGVsc2UKLQlpbnNuIHw9IG51bWJlciA8PCBzaGlmdDsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0KLS8qIHdyaXRlIG91dCBhIGxvbmcgZm9ybSBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQKLXdyaXRlX2xvbmcgKG9wY29kZSwgaW5zbiwgZngpIAotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7Ci0gICAgIGxvbmcgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotewotICBpbnQgaSwgd2hlcmU7Ci0gIGNoYXIgKmYgPSBmcmFnX21vcmUgKDgpOwotCi0gIGluc24gfD0gRk0xMTsKLSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDgpOwotCi0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICB3aGVyZSwKLQkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAotCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJICAgICAgIGZ4LT5maXhbaV0ucmVsb2MpOwotCX0KLSAgICB9Ci0gIGZ4LT5mYyA9IDA7Ci19Ci0KLQotLyogV3JpdGUgb3V0IGEgc2hvcnQgZm9ybSBpbnN0cnVjdGlvbiBieSBpdHNlbGYuICAqLwotc3RhdGljIHZvaWQKLXdyaXRlXzFfc2hvcnQgKG9wY29kZSwgaW5zbiwgZngsIHVzZV9zZXF1ZW50aWFsKSAKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlOwotICAgICBsb25nIGxvbmcgaW5zbjsKLSAgICAgRml4dXBzICpmeDsKLSAgICAgaW50IHVzZV9zZXF1ZW50aWFsOwotewotICBjaGFyICpmID0gZnJhZ19tb3JlICg4KTsKLSAgaW50IGksIHdoZXJlOwotCi0gIGlmICh3YXJuX25vcHMgPT0gTk9QX0FMTCkKLSAgICBhc193YXJuIChfKCIlcyBOT1AgaW5zZXJ0ZWQiKSwgdXNlX3NlcXVlbnRpYWwgPwotCSAgICAgXygic2VxdWVudGlhbCIpIDogXygicGFyYWxsZWwiKSk7Ci0KLSAgLyogVGhlIG90aGVyIGNvbnRhaW5lciBuZWVkcyB0byBiZSBOT1AuICovCi0gIGlmICh1c2Vfc2VxdWVudGlhbCkKLSAgICB7Ci0gICAgICAvKiBVc2UgYSBzZXF1ZW50aWFsIE5PUCByYXRoZXIgdGhhbiBhIHBhcmFsbGVsIG9uZSwKLQkgYXMgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgYSBGTEFHX01VTDMyIHR5cGUgb25lCi0JIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhIGxvYWQuICAqLwotICAgICAgCi0gICAgICAvKiBBY2NvcmRpbmcgdG8gNC4zLjE6IGZvciBGTT0wMSwgc3ViLWluc3RydWN0aW9ucyBwZXJmb3JtZWQKLQkgb25seSBieSBJVSBjYW5ub3QgYmUgZW5jb2RlZCBpbiBMLWNvbnRhaW5lci4gKi8KLSAgICAgIAotICAgICAgaWYgKG9wY29kZS0+b3AtPnVuaXQgPT0gSVUpCi0JaW5zbiB8PSBGTTEwIHwgTk9QX0xFRlQ7CS8qIHJpZ2h0IHRoZW4gbGVmdCAqLwotICAgICAgZWxzZQotCWluc24gPSBGTTAxIHwgKGluc24gPDwgMzIpIHwgTk9QX1JJR0hUOwkvKiBsZWZ0IHRoZW4gcmlnaHQgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBY2NvcmRpbmcgdG8gNC4zLjE6IGZvciBGTT0wMCwgc3ViLWluc3RydWN0aW9ucyBwZXJmb3JtZWQKLQkgb25seSBieSBJVSBjYW5ub3QgYmUgZW5jb2RlZCBpbiBMLWNvbnRhaW5lci4gKi8KLSAgICAgIAotICAgICAgaWYgKG9wY29kZS0+b3AtPnVuaXQgPT0gSVUpCi0JaW5zbiB8PSBGTTAwIHwgTk9QX0xFRlQ7CQkvKiByaWdodCBjb250YWluZXIgKi8KLSAgICAgIGVsc2UKLQlpbnNuID0gRk0wMCB8IChpbnNuIDw8IDMyKSB8IE5PUF9SSUdIVDsJLyogbGVmdCBjb250YWluZXIgKi8KLSAgICB9Ci0KLSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDgpOwotCi0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICB3aGVyZSwgCi0JCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCi0JCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCSAgICAgICBmeC0+Zml4W2ldLnJlbG9jKTsKLQl9Ci0gICAgfQotICBmeC0+ZmMgPSAwOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGlmIHBvc3NpYmxlLgotICAgUmV0dXJuIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgbm90IHdyaXR0ZW4gb3V0LiAgKi8KLXN0YXRpYyBpbnQKLXdyaXRlXzJfc2hvcnQgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlLCBmeCkgCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTEsICpvcGNvZGUyOwotICAgICBsb25nIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBleGVjX3R5cGVfZW51bSBleGVjX3R5cGU7Ci0gICAgIEZpeHVwcyAqZng7Ci17Ci0gIGxvbmcgbG9uZyBpbnNuID0gTk9QMjsKLSAgY2hhciAqZjsKLSAgaW50IGksaiwgd2hlcmU7Ci0KLSAgaWYgKGV4ZWNfdHlwZSA9PSBFWEVDX1NFUQotICAgICAgJiYgKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgKEZMQUdfSk1QIHwgRkxBR19KU1IpKQotICAgICAgJiYgKChvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfREVMQVkpID09IDApCi0gICAgICAmJiAoKG9wY29kZTEtPmVjYyA9PSBFQ0NfQUwpIHx8ICEgT3B0aW1pemluZykpCi0gICAgewotICAgICAgLyogVW5jb25kaXRpb25hbCwgbm9uLWRlbGF5ZWQgYnJhbmNoZXMga2lsbCBpbnN0cnVjdGlvbnMgaW4KLQkgdGhlIHJpZ2h0IGJpbi4gIENvbmRpdGlvbmFsIGJyYW5jaGVzIGRvbid0IGFsd2F5cyBidXQgaWYKLQkgd2UgYXJlIG5vdCBvcHRpbWl6aW5nLCB0aGVuIHdlIGhhdmUgYmVlbiBhc2tlZCB0byBwcm9kdWNlCi0JIGFuIGVycm9yIGFib3V0IHN1Y2ggY29uc3RydWN0cy4gIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcwotCSB0ZXN0LCBzdWJyb3V0aW5lIGNhbGxzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGJyYW5jaGVzLiAgKi8KLSAgICAgIHdyaXRlXzFfc2hvcnQgKG9wY29kZTEsIGluc24xLCBmeC0+bmV4dCwgZmFsc2UpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAKLSAgLyogTm90ZTogd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc3Vicm91dGluZSBjYWxscyBvY2N1cmluZwotICAgICBpbiB0aGUgcmlnaHQgaGFuZCBjb250YWluZXIuICBUaGUgcmV0dXJuIGFkZHJlc3MgaXMgYWx3YXlzCi0gICAgIGFsaWduZWQgdG8gdGhlIG5leHQgNjQgYml0IGJvdW5kYXJ5LCBiZSB0aGF0IDY0IG9yIDMyIGJpdCBhd2F5LiAgKi8KLSAgCi0gIHN3aXRjaCAoZXhlY190eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBFWEVDX1VOS05PV046CS8qIE9yZGVyIG5vdCBzcGVjaWZpZWQuICovCi0gICAgICBpZiAoT3B0aW1pemluZwotCSAgJiYgcGFyYWxsZWxfb2sgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlKQotCSAgJiYgISAoICAgKG9wY29kZTEtPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VCi0JCSB8fCBvcGNvZGUxLT5vcC0+dW5pdCA9PSBNVSkKLQkJJiYKLQkJKCAgIG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VCi0JCSB8fCBvcGNvZGUyLT5vcC0+dW5pdCA9PSBNVSkpKQotCXsKLQkgIC8qIHBhcmFsbGVsICovCi0JICBleGVjX3R5cGUgPSBFWEVDX1BBUkFMTEVMOwotCSAgCi0JICBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUKLQkgICAgICB8fCBvcGNvZGUyLT5vcC0+dW5pdCA9PSBNVQotCSAgICAgIHx8IG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCSAgICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCi0JICAgICAgZnggPSBmeC0+bmV4dDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgKEZMQUdfSk1QIHwgRkxBR19KU1IpCi0JICAgICAgICYmICgob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiBGTEFHX0RFTEFZKSA9PSAwKQotCSAgICAgICAmJiAoKG9wY29kZTEtPmVjYyA9PSBFQ0NfQUwpIHx8ICEgT3B0aW1pemluZykpCi0JewotCSAgLyogV2UgbXVzdCBlbWl0IChub24tZGVsYXllZCkgYnJhbmNoIHR5cGUgaW5zdHJ1Y3Rpb25zCi0JICAgICBvbiB0aGVpciBvd24gd2l0aCBub3RoaW5nIGluIHRoZSByaWdodCBjb250YWluZXIuICAqLwotCSAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0LCBmYWxzZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCkKLQl7Ci0JICAvKiBUaGUgbGVmdCBpbnN0cnVjdGlvbiBraWxzIHRoZSByaWdodCBzbG90LCBzbyB3ZQotCSAgICAgbXVzdCBsZWF2ZSBpdCBlbXB0eS4gICovCi0JICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQsIGZhbHNlKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IElVCi0JICAgICAgIHx8IChvcGNvZGUxLT5vcC0+dW5pdCA9PSBFSVRIRVIKLQkJICAgJiYgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpKQotCXsKLQkgIC8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7Ci0JICBleGVjX3R5cGUgPSBFWEVDX1JFVlNFUTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogc2VxdWVudGlhbCAqLwotCSAgaW5zbiA9IEZNMDEgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7Ci0JICBmeCA9IGZ4LT5uZXh0OwotCSAgZXhlY190eXBlID0gRVhFQ19TRVE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVYRUNfUEFSQUxMRUw6CS8qIHBhcmFsbGVsICovCi0gICAgICBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSBmbGFnX3hwX3N0YXRlOwotICAgICAgaWYgKCEgcGFyYWxsZWxfb2sgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlKSkKLQlhc19iYWQgKF8oIkluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotICAgICAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUpCi0JewotCSAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IElVKQotCSAgICBhc19iYWQgKF8oIlR3byBJVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLQkgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotIAkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTItPm9wLT51bml0ID09IE1VKQotCXsKLQkgIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBNVSkKLQkgICAgYXNfYmFkIChfKCJUd28gTVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0JICBlbHNlIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQkgICAgYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUxLT5vcC0+bmFtZSk7Ci0JICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLQkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JICAgIGFzX3dhcm4gKF8oIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiKSwgb3Bjb2RlMi0+b3AtPm5hbWUpOwotCSAgCi0JICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAotCSAgZnggPSBmeC0+bmV4dDsKLQl9Ci0gICAgICBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVYRUNfU0VROgkvKiBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUpCi0JYXNfYmFkIChfKCJJVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSBsZWZ0IGNvbnRhaW5lciIpKTsKLSAgICAgIGlmIChwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCkKLQlhc19iYWQgKF8oInNwZWNpYWwgbGVmdCBpbnN0cnVjdGlvbiBgJXMnIGtpbGxzIGluc3RydWN0aW9uICIKLQkJICAgImAlcycgaW4gcmlnaHQgY29udGFpbmVyIiksCi0JCSBvcGNvZGUxLT5vcC0+bmFtZSwgb3Bjb2RlMi0+b3AtPm5hbWUpOwotICAgICAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCWFzX3dhcm4gKF8oIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiKSwgb3Bjb2RlMi0+b3AtPm5hbWUpOwotICAgICAgaW5zbiA9IEZNMDEgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVhFQ19SRVZTRVE6CS8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotICAgICAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IE1VKQotCWFzX2JhZCAoXygiTVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgcmlnaHQgY29udGFpbmVyIikpOwotICAgICAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCWFzX3dhcm4gKF8oIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiKSwgb3Bjb2RlMi0+b3AtPm5hbWUpOwotICAgICAgaW5zbiA9IEZNMTAgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBleGVjdXRpb24gdHlwZSBwYXNzZWQgdG8gd3JpdGVfMl9zaG9ydCgpIikpOwotICAgIH0KLQotICAvKiAgcHJpbnRmICgid3JpdGluZyBvdXQgJWxseFxuIixpbnNuKTsgKi8KLSAgZiA9IGZyYWdfbW9yZSAoOCk7Ci0gIGQzMHZfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA4KTsKLQotICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGEgMzItYml0IG11bHRpcGx5IGJ1dCBpdCBpcyBwdXQgaW50byBhCi0gICAgIHBhcmFsbGVsIGNvbnRhaW5lciwgbWFyayB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBhcyBiZWluZyBhIDMyLWJpdAotICAgICBtdWx0aXBseS4gICovCi0gIGlmIChwcmV2X211bDMyX3AgJiYgZXhlY190eXBlID09IEVYRUNfUEFSQUxMRUwpCi0gICAgY3VyX211bDMyX3AgPSAxOwotCi0gIGZvciAoaj0wOyBqPDI7IGorKykgCi0gICAgewotICAgICAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0JewotCSAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JICAgIHsKLQkgICAgICB3aGVyZSA9IChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpICsgNCpqOwotCi0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgd2hlcmUsIAotCQkJICAgZngtPmZpeFtpXS5zaXplLAotCQkJICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCQkgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkJICAgZngtPmZpeFtpXS5yZWxvYyk7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIGZ4LT5mYyA9IDA7Ci0gICAgICBmeCA9IGZ4LT5uZXh0OwotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi0KLS8qIENoZWNrIDIgaW5zdHJ1Y3Rpb25zIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBjYW4gYmUgc2FmZWx5ICovCi0vKiBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIFJldHVybnMgMSBpZiB0aGV5IGNhbiBiZS4gICAgICAgICAqLwotc3RhdGljIGludAotcGFyYWxsZWxfb2sgKG9wMSwgaW5zbjEsIG9wMiwgaW5zbjIsIGV4ZWNfdHlwZSkKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3AxLCAqb3AyOwotICAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLSAgICAgZXhlY190eXBlX2VudW0gZXhlY190eXBlOwotewotICBpbnQgaSwgaiwgc2hpZnQsIHJlZ25vLCBiaXRzLCBlY2M7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIG1hc2ssIGZsYWdzX3NldDEsIGZsYWdzX3NldDIsIGZsYWdzX3VzZWQxLCBmbGFnc191c2VkMjsKLSAgdW5zaWduZWQgbG9uZyBpbnMsIG1vZF9yZWdbMl1bM10sIHVzZWRfcmVnWzJdWzNdLCBmbGFnX3JlZ1syXTsKLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmOwotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wOwotCi0gIC8qIHNlY3Rpb24gNC4zOiBib3RoIGluc3RydWN0aW9ucyBtdXN0IG5vdCBiZSBJVSBvciBNVSBvbmx5ICovCi0gIGlmICgob3AxLT5vcC0+dW5pdCA9PSBJVSAmJiBvcDItPm9wLT51bml0ID09IElVKQotICAgICAgfHwgKG9wMS0+b3AtPnVuaXQgPT0gTVUgJiYgb3AyLT5vcC0+dW5pdCA9PSBNVSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogZmlyc3QgaW5zdHJ1Y3Rpb24gbXVzdCBub3QgYmUgYSBqdW1wIHRvIHNhZmVseSBvcHRpbWl6ZSwgdW5sZXNzIHRoaXMKLSAgICAgaXMgYW4gZXhwbGljaXQgcGFyYWxsZWwgb3BlcmF0aW9uLiAgKi8KLSAgaWYgKGV4ZWNfdHlwZSAhPSBFWEVDX1BBUkFMTEVMCi0gICAgICAmJiAob3AxLT5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX0pNUCB8IEZMQUdfSlNSKSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogSWYgb25lIGluc3RydWN0aW9uIGlzIC9UWCBvciAvWFQgYW5kIHRoZSBvdGhlciBpcyAvRlggb3IgL1hGIHJlc3BlY3RpdmVseSwKLSAgICAgdGhlbiBpdCBpcyBzYWZlIHRvIGFsbG93IHRoZSB0d28gdG8gYmUgZG9uZSBhcyBwYXJhbGxlbCBvcHMsIHNpbmNlIG9ubHkKLSAgICAgb25lIHdpbGwgZXZlciBiZSBleGVjdXRlZCBhdCBhIHRpbWUuICAqLwotICBpZiAoKG9wMS0+ZWNjID09IEVDQ19UWCAmJiBvcDItPmVjYyA9PSBFQ0NfRlgpCi0gICAgICB8fCAob3AxLT5lY2MgPT0gRUNDX0ZYICYmIG9wMi0+ZWNjID09IEVDQ19UWCkKLSAgICAgIHx8IChvcDEtPmVjYyA9PSBFQ0NfWFQgJiYgb3AyLT5lY2MgPT0gRUNDX1hGKQotICAgICAgfHwgKG9wMS0+ZWNjID09IEVDQ19YRiAmJiBvcDItPmVjYyA9PSBFQ0NfWFQpKQotICAgICByZXR1cm4gMTsKLQotICAvKiBbMF0gcjAtcjMxCi0gICAgIFsxXSByMzItcjYzCi0gICAgIFsyXSBhMCwgYTEsIGZsYWcgcmVnaXN0ZXJzICovCi0KLSAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICB7Ci0gICAgICBpZiAoaiA9PSAwKQotCXsKLQkgIGYgPSBvcDEtPmZvcm07Ci0JICBvcCA9IG9wMS0+b3A7Ci0JICBlY2MgPSBvcDEtPmVjYzsKLQkgIGlucyA9IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmID0gb3AyLT5mb3JtOwotCSAgb3AgPSBvcDItPm9wOwotCSAgZWNjID0gb3AyLT5lY2M7Ci0JICBpbnMgPSBpbnNuMjsKLQl9Ci0gICAgICBmbGFnX3JlZ1tqXSA9IDA7Ci0gICAgICBtb2RfcmVnW2pdWzBdID0gbW9kX3JlZ1tqXVsxXSA9IDA7Ci0gICAgICB1c2VkX3JlZ1tqXVswXSA9IHVzZWRfcmVnW2pdWzFdID0gMDsKLQotICAgICAgaWYgKGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCkKLQl7Ci0JICAvKiBGb3IgaHVtYW4gc3BlY2lmaWVkIHBhcmFsbGVsIGluc3RydWN0aW9ucyB3ZSBoYXZlIGJlZW4gYXNrZWQKLQkgICAgIHRvIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgdGhhdCBib3RoIGluc3RydWN0aW9ucyBjb3VsZCBtb2RpZnkKLQkgICAgIGJpdHMgaW4gdGhlIFBTVywgc28gd2UgaW5pdGlhbGlzZSB0aGUgbW9kICYgdXNlZCBhcnJheXMgdG8gMC4KLQkgICAgIFdlIGhhdmUgYmVlbiBhc2tlZCwgaG93ZXZlciwgdG8gcmVmdXNlIHRvIGFsbG93IHBhcmFsbGVsCi0JICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggZXhwbGljaXRseSBzZXQgdGhlIHNhbWUgZmxhZyByZWdpc3RlciwKLQkgICAgIGVnICJjbXBuZSBmMCxyMSwweDEwIHx8IGNtcGVxIGYwLCByNSwgMHgyIiwgc28gZnVydGhlciBvbiB3ZSB0ZXN0Ci0JICAgICBmb3IgdGhlIHVzZSBvZiBhIGZsYWcgcmVnaXN0ZXIgYW5kIHNldCBhIGJpdCBpbiB0aGUgbW9kIG9yIHVzZWQKLQkgICAgIGFycmF5IGFwcHJvcHJpYXRlbHkuICAqLwotCSAgICAgCi0JICBtb2RfcmVnW2pdWzJdICA9IDA7Ci0JICB1c2VkX3JlZ1tqXVsyXSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1vZF9yZWdbal1bMl0gPSAob3AtPmZsYWdzX3NldCAmIEZMQUdfQUxMKTsKLQkgIHVzZWRfcmVnW2pdWzJdID0gKG9wLT5mbGFnc191c2VkICYgRkxBR19BTEwpOwotCX0KLSAgICAgIAotICAgICAgLyogQlNSL0pTUiBhbHdheXMgc2V0cyBSNjIgKi8KLSAgICAgIGlmIChvcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfSlNSKQotCW1vZF9yZWdbal1bMV0gPSAoMUwgPDwgKDYyLTMyKSk7Ci0KLSAgICAgIC8qIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBhZmZlY3RzIHRoZSBmbGFnc191c2VkICovCi0gICAgICBzd2l0Y2ggKGVjYykKLQl7Ci0JY2FzZSBFQ0NfVFg6Ci0JY2FzZSBFQ0NfRlg6Ci0JICB1c2VkX3JlZ1tqXVsyXSB8PSBmbGFnX3JlZ1tqXSA9IEZMQUdfMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFQ0NfWFQ6Ci0JY2FzZSBFQ0NfWEY6Ci0JICB1c2VkX3JlZ1tqXVsyXSB8PSBmbGFnX3JlZ1tqXSA9IEZMQUdfMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFQ0NfVFQ6Ci0JY2FzZSBFQ0NfVEY6Ci0JICB1c2VkX3JlZ1tqXVsyXSB8PSBmbGFnX3JlZ1tqXSA9IChGTEFHXzAgfCBGTEFHXzEpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmb3IgKGkgPSAwOyBmLT5vcGVyYW5kc1tpXTsgaSsrKQotCXsKLQkgIGZsYWdzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgIHNoaWZ0ID0gMTIgLSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaV1dLnBvc2l0aW9uOwotCSAgYml0cyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpXV0uYml0czsKLQkgIGlmIChiaXRzID09IDMyKQotCSAgICBtYXNrID0gMHhmZmZmZmZmZjsKLQkgIGVsc2UKLQkgICAgbWFzayA9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7Ci0KLQkgIGlmICgoZmxhZ3MgJiBPUEVSQU5EX1BMVVMpIHx8IChmbGFncyAmIE9QRVJBTkRfTUlOVVMpKQotCSAgICB7Ci0JICAgICAgLyogdGhpcyBpcyBhIHBvc3QtaW5jcmVtZW50IG9yIHBvc3QtZGVjcmVtZW50ICovCi0JICAgICAgLyogdGhlIHByZXZpb3VzIHJlZ2lzdGVyIG5lZWRzIHRvIGJlIG1hcmtlZCBhcyBtb2RpZmllZCAqLwotCi0JICAgICAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpLTFdXS5wb3NpdGlvbjsKLQkgICAgICByZWdubyA9IChpbnMgPj4gc2hpZnQpICYgMHgzZjsKLQkgICAgICBpZiAocmVnbm8gPj0gMzIpCi0JCW1vZF9yZWdbal1bMV0gfD0gMUwgPDwgKHJlZ25vIC0gMzIpOwotCSAgICAgIGVsc2UKLQkJbW9kX3JlZ1tqXVswXSB8PSAxTCA8PCByZWdubzsKLQkgICAgfQotCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkgICAgewotCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiBtYXNrOwotCSAgICAgIC8qIHRoZSBtZW1vcnkgd3JpdGUgZnVuY3Rpb25zIGRvbid0IGhhdmUgYSBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCSAgICAgIGlmICgoZmxhZ3MgJiBPUEVSQU5EX0RFU1QpICYmICEob3AtPmZsYWdzX3NldCAmIEZMQUdfTUVNKSkKLQkJewotCQkgIC8qIE1PRElGSUVEIHJlZ2lzdGVycyBhbmQgZmxhZ3MgKi8KLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FDQykKLQkJICAgIHsKLQkJICAgICAgaWYgKHJlZ25vID09IDApCi0JCQltb2RfcmVnW2pdWzJdIHw9IEZMQUdfQTA7Ci0JCSAgICAgIGVsc2UgaWYgKHJlZ25vID09IDEpCi0JCQltb2RfcmVnW2pdWzJdIHw9IEZMQUdfQTE7Ci0JCSAgICAgIGVsc2UKLQkJCWFib3J0ICgpOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9GTEFHKQotCQkgICAgbW9kX3JlZ1tqXVsyXSB8PSAxTCA8PCByZWdubzsKLQkJICBlbHNlIGlmICghKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKSkKLQkJICAgIHsKLQkJICAgICAgaW50IHIsIHo7Ci0KLQkJICAgICAgLyogbmVlZCB0byBjaGVjayBpZiB0aGVyZSBhcmUgdHdvIGRlc3RpbmF0aW9uICovCi0JCSAgICAgIC8qIHJlZ2lzdGVycywgZm9yIGV4YW1wbGUgbGQydyAqLwotCQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EXzJSRUcpCi0JCQl6ID0gMTsKLQkJICAgICAgZWxzZQotCQkJeiA9IDA7Ci0KLQkJICAgICAgZm9yIChyID0gcmVnbm87IHIgPD0gcmVnbm8gKyB6OyByKyspCi0JCQl7IAotCQkJICBpZiAociA+PSAzMikKLQkJCSAgICBtb2RfcmVnW2pdWzFdIHw9IDFMIDw8IChyIC0gMzIpOwotCQkJICBlbHNlCi0JCQkgICAgbW9kX3JlZ1tqXVswXSB8PSAxTCA8PCByOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVVNFRCwgYnV0IG5vdCBtb2RpZmllZCByZWdpc3RlcnMgYW5kIGZsYWdzICovCi0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9BQ0MpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChyZWdubyA9PSAwKQotCQkJdXNlZF9yZWdbal1bMl0gfD0gRkxBR19BMDsKLQkJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gMSkKLQkJCXVzZWRfcmVnW2pdWzJdIHw9IEZMQUdfQTE7Ci0JCSAgICAgIGVsc2UKLQkJCWFib3J0ICgpOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9GTEFHKQotCQkgICAgdXNlZF9yZWdbal1bMl0gfD0gMUwgPDwgcmVnbm87Ci0JCSAgZWxzZSBpZiAoIShmbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkpCi0JCSAgICB7Ci0JCSAgICAgIGludCByLCB6OwotCi0JCSAgICAgIC8qIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHR3byBzb3VyY2UgKi8KLQkJICAgICAgLyogcmVnaXN0ZXJzLCBmb3IgZXhhbXBsZSBzdDJ3ICovCi0JCSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfMlJFRykKLQkJCXogPSAxOwotCQkgICAgICBlbHNlCi0JCQl6ID0gMDsKLQotCQkgICAgICBmb3IgKHIgPSByZWdubzsgciA8PSByZWdubyArIHo7IHIrKykKLQkJCXsgCi0JCQkgIGlmIChyID49IDMyKQotCQkJICAgIHVzZWRfcmVnW2pdWzFdIHw9IDFMIDw8IChyIC0gMzIpOwotCQkJICBlbHNlCi0JCQkgICAgdXNlZF9yZWdbal1bMF0gfD0gMUwgPDwgcjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIGZsYWdzX3NldDEgPSBvcDEtPm9wLT5mbGFnc19zZXQ7Ci0gIGZsYWdzX3NldDIgPSBvcDItPm9wLT5mbGFnc19zZXQ7Ci0gIGZsYWdzX3VzZWQxID0gb3AxLT5vcC0+ZmxhZ3NfdXNlZDsKLSAgZmxhZ3NfdXNlZDIgPSBvcDItPm9wLT5mbGFnc191c2VkOwotCi0gIC8qIFNUMlcvU1Q0SEIgY29tYmluZWQgd2l0aCBBRERwcHAvU1VCcHBwIGlzIGlsbGVnYWwuICAqLwotICBpZiAoKChmbGFnc19zZXQxICYgKEZMQUdfTUVNIHwgRkxBR18yV09SRCkpID09IChGTEFHX01FTSB8IEZMQUdfMldPUkQpCi0gICAgICAgJiYgKGZsYWdzX3VzZWQyICYgRkxBR19BRERTVUJwcHApICE9IDApCi0gICAgICB8fCAoKGZsYWdzX3NldDIgJiAoRkxBR19NRU0gfCBGTEFHXzJXT1JEKSkgPT0gKEZMQUdfTUVNIHwgRkxBR18yV09SRCkKLQkgICYmIChmbGFnc191c2VkMSAmIEZMQUdfQUREU1VCcHBwKSAhPSAwKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBMb2FkIGluc3RydWN0aW9uIGNvbWJpbmVkIHdpdGggaGFsZi13b3JkIG11bHRpcGx5IGlzIGlsbGVnYWwuICAqLwotICBpZiAoKChmbGFnc191c2VkMSAmIEZMQUdfTUVNKSAhPSAwICYmIChmbGFnc191c2VkMiAmIEZMQUdfTVVMMTYpKQotICAgICAgfHwgKChmbGFnc191c2VkMiAmIEZMQUdfTUVNKSAhPSAwICYmIChmbGFnc191c2VkMSAmIEZMQUdfTVVMMTYpKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTcGVjaWZpY2FsbHkgYWxsb3cgYWRkIHx8IGFkZCBieSByZW1vdmluZyBjYXJyeSwgb3ZlcmZsb3cgYml0cyBkZXBlbmRlbmN5LgotICAgICBUaGlzIGlzIHNhZmUsIGV2ZW4gaWYgYW4gYWRkYyBmb2xsb3dzIHNpbmNlIHRoZSBJVSB0YWtlcyB0aGUgYXJndW1lbnQgaW4KLSAgICAgdGhlIHJpZ2h0IGNvbnRhaW5lciwgYW5kIGl0IHdyaXRlcyBpdHMgcmVzdWx0cyBsYXN0LgotICAgICBIb3dldmVyLCBkb24ndCBwYXJhbGVsbGl6ZSBhZGQgZm9sbG93ZWQgYnkgYWRkYyBvciBzdWIgZm9sbG93ZWQgYnkKLSAgICAgc3ViYi4gICovCi0KLSAgaWYgKG1vZF9yZWdbMF1bMl0gPT0gRkxBR19DVlZBICYmIG1vZF9yZWdbMV1bMl0gPT0gRkxBR19DVlZBCi0gICAgICAmJiAodXNlZF9yZWdbMF1bMl0gJiB+ZmxhZ19yZWdbMF0pID09IDAKLSAgICAgICYmICh1c2VkX3JlZ1sxXVsyXSAmIH5mbGFnX3JlZ1sxXSkgPT0gMAotICAgICAgJiYgb3AxLT5vcC0+dW5pdCA9PSBFSVRIRVIgJiYgb3AyLT5vcC0+dW5pdCA9PSBFSVRIRVIpCi0gICAgewotICAgICAgbW9kX3JlZ1swXVsyXSA9IG1vZF9yZWdbMV1bMl0gPSAwOwotICAgIH0KLQotICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gZGVwZW5kcyBvbiB0aGUgZmlyc3QsIHdlIG9idmlvdXNseQotCSBjYW5ub3QgcGFyYWxsZWxpemUuICBOb3RlLCB0aGUgbW9kIGZsYWcgaW1wbGllcyB1c2UsIHNvCi0JIGNoZWNrIHRoYXQgYXMgd2VsbC4gICovCi0gICAgICAvKiBJZiBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgaXMgc2V0LCB0aGVuIHRoZSBjYXNlIG9mIHRoZSAKLQkgc2Vjb25kIGluc3RydWN0aW9uIHVzaW5nIGEgcmVnaXN0ZXIgdGhlIGZpcnN0IGluc3RydWN0aW9uCi0JIG1vZGlmaWVzIGlzIGFzc3VtZWQgdG8gYmUgb2theTsgd2UgdHJ1c3QgdGhlIGh1bWFuLiAgV2UKLQkgZG9uJ3QgdHJ1c3QgdGhlIGh1bWFuIGlmIGJvdGggaW5zdHJ1Y3Rpb25zIG1vZGlmeSB0aGUgc2FtZQotCSByZWdpc3RlciBidXQgd2UgZG8gdHJ1c3QgdGhlIGh1bWFuIGlmIHRoZXkgbW9kaWZ5IHRoZSBzYW1lCi0JIGZsYWdzLiAqLwotICAgICAgLyogV2UgaGF2ZSBub3cgYmVlbiByZXF1ZXN0ZWQgbm90IHRvIHRydXN0IHRoZSBodW1hbiBpZiB0aGUKLQkgaW5zdHJ1Y3Rpb25zIG1vZGlmeSB0aGUgc2FtZSBmbGFnIHJlZ2lzdGVycyBlaXRoZXIuICAqLwotICAgICAgaWYgKGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCkKLQl7Ci0JICBpZiAoKG1vZF9yZWdbMF1bal0gJiBtb2RfcmVnWzFdW2pdKSAhPSAwKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIGlmICgobW9kX3JlZ1swXVtqXSAmIChtb2RfcmVnWzFdW2pdIHwgdXNlZF9yZWdbMV1bal0pKSAhPSAwKQotCSAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLS8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBzdHIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUtZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyAKLSAgIGl0IGFzc2VtYmxlcyB0by4gIEZvciB0aGUgRDMwViwgaXQgbW9zdGx5IGhhbmRsZXMgdGhlIHNwZWNpYWwgVkxJVyBwYXJzaW5nIGFuZCBwYWNraW5nCi0gICBhbmQgbGVhdmVzIHRoZSBkaWZmaWN1bHQgc3R1ZmYgdG8gZG9fYXNzZW1ibGUoKS4gICovCi0KLXN0YXRpYyBsb25nIGxvbmcgcHJldl9pbnNuID0gLTE7Ci1zdGF0aWMgc3RydWN0IGQzMHZfaW5zbiBwcmV2X29wY29kZTsKLXN0YXRpYyBzdWJzZWdUIHByZXZfc3Vic2VnOwotc3RhdGljIHNlZ1QgcHJldl9zZWcgPSAwOwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHN0cnVjdCBkMzB2X2luc24gb3Bjb2RlOwotICBsb25nIGxvbmcgaW5zbjsKLSAgZXhlY190eXBlX2VudW0gZXh0eXBlID0gRVhFQ19VTktOT1dOOwkJLyogZXhlY3V0aW9uIHR5cGU7IHBhcmFsbGVsLCBldGMgKi8KLSAgc3RhdGljIGV4ZWNfdHlwZV9lbnVtIGV0eXBlID0gRVhFQ19VTktOT1dOOwkvKiBzYXZlZCBleHR5cGUuICB1c2VkIGZvciBtdWx0aWxpbmUgaW5zdHJ1Y3Rpb25zICovCi0gIGNoYXIgKnN0cjI7Ci0KLSAgaWYgKChwcmV2X2luc24gIT0gLTEpICYmIHByZXZfc2VnCi0gICAgICAgJiYgKChwcmV2X3NlZyAhPSBub3dfc2VnKSB8fCAocHJldl9zdWJzZWcgIT0gbm93X3N1YnNlZykpKQotICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCi0gIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCAzKQotICAgIGQzMHZfYWxpZ24gKDMsIE5VTEwsIGQzMHZfbGFzdF9sYWJlbCk7Ci0gIGVsc2UgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA+IDMpCi0gICAgZDMwdl9jdXJyZW50X2FsaWduID0gMzsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLQotICBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSAwOwotICBmbGFnX3hwX3N0YXRlID0gMDsKLSAgaWYgKGV0eXBlID09IEVYRUNfVU5LTk9XTikKLSAgICB7Ci0gICAgICAvKiBsb29rIGZvciB0aGUgc3BlY2lhbCBtdWx0aXBsZSBpbnN0cnVjdGlvbiBzZXBhcmF0b3JzICovCi0gICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICJ8fCIpOwotICAgICAgaWYgKHN0cjIpIAotCXsKLQkgIGV4dHlwZSA9IEVYRUNfUEFSQUxMRUw7Ci0JICBmbGFnX3hwX3N0YXRlID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiLT4iKTsKLQkgIGlmIChzdHIyKSAKLQkgICAgZXh0eXBlID0gRVhFQ19TRVE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICI8LSIpOwotCSAgICAgIGlmIChzdHIyKSAKLQkJZXh0eXBlID0gRVhFQ19SRVZTRVE7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBzdHIyIHBvaW50cyB0byB0aGUgc2VwYXJhdG9yLCBpZiBvbmUgKi8KLSAgICAgIGlmIChzdHIyKSAKLQl7Ci0JICAqc3RyMiA9IDA7Ci0JICAKLQkgIC8qIGlmIHR3byBpbnN0cnVjdGlvbnMgYXJlIHByZXNlbnQgYW5kIHdlIGFscmVhZHkgaGF2ZSBvbmUgc2F2ZWQKLQkgICAgIHRoZW4gZmlyc3Qgd3JpdGUgaXQgb3V0ICovCi0JICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQkgIAotCSAgLyogQXNzZW1ibGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYW5kIHNhdmUgaXQuICAqLwotCSAgcHJldl9pbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJnByZXZfb3Bjb2RlLCAxLCAwKTsKLQkgIGlmIChwcmV2X2luc24gPT0gLTEpCi0JICAgIGFzX2JhZCAoXygiQ2Fubm90IGFzc2VtYmxlIGluc3RydWN0aW9uIikpOwotCSAgaWYgKHByZXZfb3Bjb2RlLmZvcm0gIT0gTlVMTCAmJiBwcmV2X29wY29kZS5mb3JtLT5mb3JtID49IExPTkcpCi0JICAgIGFzX2JhZCAoXygiRmlyc3Qgb3Bjb2RlIGlzIGxvbmcuICBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQuIikpOyAKLQkgIGZpeHVwcyA9IGZpeHVwcy0+bmV4dDsKLQkgIHN0ciA9IHN0cjIgKyAyOwotCSAgcHJldl9zZWcgPSBub3dfc2VnOwotCSAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotCX0KLSAgICB9Ci0KLSAgaW5zbiA9IGRvX2Fzc2VtYmxlIChzdHIsICZvcGNvZGUsCi0JCSAgICAgIChleHR5cGUgIT0gRVhFQ19VTktOT1dOIHx8IGV0eXBlICE9IEVYRUNfVU5LTk9XTiksCi0JCSAgICAgIGV4dHlwZSA9PSBFWEVDX1BBUkFMTEVMKTsKLSAgaWYgKGluc24gPT0gLTEpCi0gICAgewotICAgICAgaWYgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04pCi0JZXR5cGUgPSBleHR5cGU7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCBhc3NlbWJsZSBpbnN0cnVjdGlvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV0eXBlICE9IEVYRUNfVU5LTk9XTikKLSAgICB7Ci0gICAgICBleHR5cGUgPSBldHlwZTsKLSAgICAgIGV0eXBlID0gRVhFQ19VTktOT1dOOwotICAgIH0KLQotICAvKiBXb3JkIG11bHRpcGx5IGluc3RydWN0aW9ucyBtdXN0IG5vdCBiZSBmb2xsb3dlZCBieSBlaXRoZXIgYSBsb2FkIG9yIGEKLSAgICAgMTYtYml0IG11bHRpcGx5IGluc3RydWN0aW9uIGluIHRoZSBuZXh0IGN5Y2xlLiAgKi8KLSAgaWYgKCAgIChleHR5cGUgIT0gRVhFQ19SRVZTRVEpCi0gICAgICAmJiBwcmV2X211bDMyX3AKLSAgICAgICYmIChvcGNvZGUub3AtPmZsYWdzX3VzZWQgJiAoRkxBR19NRU0gfCBGTEFHX01VTDE2KSkpCi0gICAgewotICAgICAgLyogSG93ZXZlciwgbG9hZCBhbmQgbXVsdGlwbHkgc2hvdWxkIGFibGUgdG8gYmUgY29tYmluZWQgaW4gYSBwYXJhbGxlbAotCSBvcGVyYXRpb24sIHNvIGNoZWNrIGZvciB0aGF0IGZpcnN0LiAgKi8KLSAgICAgIGlmIChwcmV2X2luc24gIT0gLTEKLQkgICYmIChvcGNvZGUub3AtPmZsYWdzX3VzZWQgJiBGTEFHX01FTSkKLQkgICYmIG9wY29kZS5mb3JtLT5mb3JtIDwgTE9ORwotCSAgJiYgKGV4dHlwZSA9PSBFWEVDX1BBUkFMTEVMIHx8IChPcHRpbWl6aW5nICYmIGV4dHlwZSA9PSBFWEVDX1VOS05PV04pKQotCSAgJiYgcGFyYWxsZWxfb2sgKCZwcmV2X29wY29kZSwgKGxvbmcpcHJldl9pbnNuLAotCQkJICAmb3Bjb2RlLCAobG9uZylpbnNuLCBleHR5cGUpCi0JICAmJiB3cml0ZV8yX3Nob3J0ICgmcHJldl9vcGNvZGUsIChsb25nKXByZXZfaW5zbiwKLQkJCSAgICAmb3Bjb2RlLCAobG9uZylpbnNuLCBleHR5cGUsIGZpeHVwcykgPT0gMCkKLQl7Ci0JICAvKiBubyBpbnN0cnVjdGlvbnMgc2F2ZWQgKi8KLQkgIHByZXZfaW5zbiA9IC0xOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYW4ndCBwYXJhbGxlbGl6ZSwgZmx1c2ggcHJldmlvdXMgaW5zdHJ1Y3Rpb24gYW5kIGVtaXQgYSB3b3JkIG9mIE5PUFMsCi0JICAgICB1bmxlc3MgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgTk9QLCBpbiB3aGljaCBjYXNlIGp1c3QgZmx1c2ggaXQsCi0JICAgICBhcyB0aGlzIHdpbGwgZ2VuZXJhdGUgYSB3b3JkIG9mIE5PUHMgZm9yIHVzLiAgKi8KLQotCSAgaWYgKHByZXZfaW5zbiAhPSAtMSAmJiAoc3RyY21wIChwcmV2X29wY29kZS5vcC0+bmFtZSwgIm5vcCIpID09IDApKQotCSAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKiBmOwotCSAgICAgIAotCSAgICAgIGlmIChwcmV2X2luc24gIT0gLTEpCi0JCWQzMHZfY2xlYW51cCAodHJ1ZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZiA9IGZyYWdfbW9yZSAoOCk7Ci0JCSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIE5PUDIsIDgpOwotCQkgIAotCQkgIGlmICh3YXJuX25vcHMgPT0gTk9QX0FMTCB8fCB3YXJuX25vcHMgPT0gTk9QX01VTFRJUExZKQotCQkgICAgewotCQkgICAgICBpZiAob3Bjb2RlLm9wLT5mbGFnc191c2VkICYgRkxBR19NRU0pCi0JCQlhc193YXJuIChfKCJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCBsb2FkIikpOwotCQkgICAgICBlbHNlCi0JCQlhc193YXJuIChfKCJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCAxNi1iaXQgbXVsdGlwbHkiKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgCi0JICBleHR5cGUgPSBFWEVDX1VOS05PV047Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoICAgKGV4dHlwZSA9PSBFWEVDX1JFVlNFUSkKLQkgICAmJiBjdXJfbXVsMzJfcAotCSAgICYmIChwcmV2X29wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX01FTSB8IEZMQUdfTVVMMTYpKSkKLSAgICB7Ci0gICAgICAvKiBDYW4ndCBwYXJhbGxlbGl6ZSwgZmx1c2ggY3VycmVudCBpbnN0cnVjdGlvbiBhbmQgYWRkIGEgc2VxdWVudGlhbCBOT1AuICovCi0gICAgICB3cml0ZV8xX3Nob3J0ICgmIG9wY29kZSwgKGxvbmcpIGluc24sIGZpeHVwcy0+bmV4dC0+bmV4dCwgdHJ1ZSk7Ci0gICAgICAKLSAgICAgIC8qIE1ha2UgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHRoZSBjdXJyZW50IG9uZS4gICovCi0gICAgICBleHR5cGUgPSBFWEVDX1VOS05PV047Ci0gICAgICBpbnNuID0gcHJldl9pbnNuOwotICAgICAgbm93X3NlZyA9IHByZXZfc2VnOwotICAgICAgbm93X3N1YnNlZyA9IHByZXZfc3Vic2VnOwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgICBjdXJfbXVsMzJfcCA9IHByZXZfbXVsMzJfcDsKLSAgICAgIHByZXZfbXVsMzJfcCA9IDA7Ci0gICAgICBtZW1jcHkgKCZvcGNvZGUsICZwcmV2X29wY29kZSwgc2l6ZW9mIChwcmV2X29wY29kZSkpOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbG9uZyBpbnN0cnVjdGlvbiwgd3JpdGUgaXQgYW5kIGFueSBwcmV2aW91cyBzaG9ydCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChvcGNvZGUuZm9ybS0+Zm9ybSA+PSBMT05HKSAKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTikgCi0JYXNfYmFkIChfKCJJbnN0cnVjdGlvbiB1c2VzIGxvbmcgdmVyc2lvbiwgc28gaXQgY2Fubm90IGJlIG1peGVkIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotICAgICAgd3JpdGVfbG9uZyAoJiBvcGNvZGUsIGluc24sIGZpeHVwcyk7Ci0gICAgICBwcmV2X2luc24gPSAtMTsKLSAgICB9Ci0gIGVsc2UgaWYgKChwcmV2X2luc24gIT0gLTEpCi0JICAgJiYgKHdyaXRlXzJfc2hvcnQKLQkgICAgICAgKCYgcHJldl9vcGNvZGUsIChsb25nKSBwcmV2X2luc24sICYgb3Bjb2RlLAotCQkobG9uZykgaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApKSAKLSAgICB7Ci0gICAgICAvKiBObyBpbnN0cnVjdGlvbnMgc2F2ZWQuICAqLwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04pIAotCWFzX2JhZCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgCi0gICAgICAvKiBTYXZlIG9mZiBsYXN0IGluc3RydWN0aW9uIHNvIGl0IG1heSBiZSBwYWNrZWQgb24gbmV4dCBwYXNzLiAgKi8KLSAgICAgIG1lbWNweSAoJnByZXZfb3Bjb2RlLCAmb3Bjb2RlLCBzaXplb2YgKHByZXZfb3Bjb2RlKSk7Ci0gICAgICBwcmV2X2luc24gPSBpbnNuOwotICAgICAgcHJldl9zZWcgPSBub3dfc2VnOwotICAgICAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotICAgICAgcHJldl9tdWwzMl9wID0gY3VyX211bDMyX3A7Ci0gICAgfQotfQotCi0KLS8qIGRvX2Fzc2VtYmxlIGFzc2VtYmxlcyBhIHNpbmdsZSBpbnN0cnVjdGlvbiBhbmQgcmV0dXJucyBhbiBvcGNvZGUgKi8KLS8qIGl0IHJldHVybnMgLTEgKGFuIGludmFsaWQgb3Bjb2RlKSBvbiBlcnJvciAqLwotCi0jZGVmaW5lIE5BTUVfQlVGX0xFTgkyMAotCi1zdGF0aWMgbG9uZyBsb25nCi1kb19hc3NlbWJsZSAoc3RyLCBvcGNvZGUsIHNob3J0cCwgaXNfcGFyYWxsZWwpIAotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTsKLSAgICAgaW50IHNob3J0cDsKLSAgICAgaW50IGlzX3BhcmFsbGVsOwotewotICB1bnNpZ25lZCBjaGFyICogb3Bfc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKiBzYXZlOwotICB1bnNpZ25lZCBjaGFyICogb3BfZW5kOwotICBjaGFyICAgICAgICAgICAgbmFtZSBbTkFNRV9CVUZfTEVOXTsKLSAgaW50ICAgICAgICAgICAgIGNtcF9oYWNrOwotICBpbnQgICAgICAgICAgICAgbmxlbiA9IDA7Ci0gIGludCAgICAgICAgICAgICBmc2l6ZSA9IChzaG9ydHAgPyBGT1JDRV9TSE9SVCA6IDApOwotICBleHByZXNzaW9uUyAgICAgbXlvcHMgWzZdOwotICBsb25nIGxvbmcgICAgICAgaW5zbjsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKiBzdHIgPT0gJyAnKQotICAgIHN0ciArKzsKLQotICAvKiBmaW5kIHRoZSBvcGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSAodW5zaWduZWQgY2hhciAqKSAoc3RyKTsKLSAgICAgICAqIG9wX2VuZAotICAgICAgICYmIG5sZW4gPCAoTkFNRV9CVUZfTEVOIC0gMSkKLSAgICAgICAmJiAqIG9wX2VuZCAhPSAnLycKLSAgICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgbmFtZVtubGVuXSA9IHRvbG93ZXIgKG9wX3N0YXJ0W25sZW5dKTsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgLyogaWYgdGhlcmUgaXMgYW4gZXhlY3V0aW9uIGNvbmRpdGlvbiBjb2RlLCBoYW5kbGUgaXQgKi8KLSAgaWYgKCpvcF9lbmQgPT0gJy8nKQotICAgIHsKLSAgICAgIGludCBpID0gMDsKLSAgICAgIHdoaWxlICggKGkgPCBFQ0NfTUFYKSAmJiBzdHJuY2FzZWNtcCAoZDMwdl9lY2NfbmFtZXNbaV0sIG9wX2VuZCArIDEsIDIpKQotCWkrKzsKLSAgICAgIAotICAgICAgaWYgKGkgPT0gRUNDX01BWCkKLQl7Ci0JICBjaGFyIHRtcFs0XTsKLQkgIHN0cm5jcHkgKHRtcCwgb3BfZW5kICsgMSwgMik7Ci0JICB0bXBbMl0gPSAwOwotCSAgYXNfYmFkIChfKCJ1bmtub3duIGNvbmRpdGlvbiBjb2RlOiAlcyIpLHRtcCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgLyogICAgICBwcmludGYgKCJjb25kaXRpb24gY29kZT0lZFxuIixpKTsgKi8KLSAgICAgIG9wY29kZS0+ZWNjID0gaTsKLSAgICAgIG9wX2VuZCArPSAzOwotICAgIH0KLSAgZWxzZQotICAgIG9wY29kZS0+ZWNjID0gRUNDX0FMOwotICAKLQotICAvKiBDTVAgYW5kIENNUFUgY2hhbmdlIHRoZWlyIG5hbWUgYmFzZWQgb24gY29uZGl0aW9uIGNvZGVzICovCi0gIGlmICghc3RybmNtcCAobmFtZSwgImNtcCIsIDMpKQotICAgIHsKLSAgICAgIGludCBwLGk7Ci0gICAgICBjaGFyICoqc3RyID0gKGNoYXIgKiopZDMwdl9jY19uYW1lczsKLSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKLQlwID0gNDsKLSAgICAgIGVsc2UKLQlwID0gMzsKLQotICAgICAgZm9yIChpPTE7ICpzdHIgJiYgc3RybmNtcCAoKnN0ciwgJiBuYW1lW3BdLCAyKTsgaSsrLCBzdHIrKykKLQk7Ci0KLSAgICAgIC8qIGNtcHUgb25seSBzdXBwb3J0cyBzb21lIGNvbmRpdGlvbiBjb2RlcyAqLwotICAgICAgaWYgKHAgPT0gNCkKLQl7Ci0JICBpZiAoaSA8IDMgfHwgaSA+IDYpCi0JICAgIHsKLQkgICAgICBuYW1lW3ArMl09MDsKLQkgICAgICBhc19iYWQgKF8oImNtcHUgZG9lc24ndCBzdXBwb3J0IGNvbmRpdGlvbiBjb2RlICVzIiksJm5hbWVbcF0pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISpzdHIpCi0JewotCSAgbmFtZVtwKzJdPTA7Ci0JICBhc19iYWQgKF8oInVua25vd24gY29uZGl0aW9uIGNvZGU6ICVzIiksJm5hbWVbcF0pOyAgICAgIAotCX0KLSAgICAgIAotICAgICAgY21wX2hhY2sgPSBpOwotICAgICAgbmFtZVtwXSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgY21wX2hhY2sgPSAwOwotICAKLSAgLyogIHByaW50ZigiY21wX2hhY2s9JWRcbiIsY21wX2hhY2spOyAqLwotCi0gIC8qIG5lZWQgdG8gbG9vayBmb3IgLnMgb3IgLmwgKi8KLSAgaWYgKG5hbWVbbmxlbi0yXSA9PSAnLicpCi0gICAgewotICAgICAgc3dpdGNoIChuYW1lW25sZW4tMV0pCi0JewotCWNhc2UgJ3MnOgotCSAgZnNpemUgPSBGT1JDRV9TSE9SVDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgZnNpemUgPSBGT1JDRV9MT05HOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbmFtZVtubGVuLTJdID0gMDsKLSAgICB9Ci0KLSAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovICAKLSAgb3Bjb2RlLT5vcCA9IChzdHJ1Y3QgZDMwdl9vcGNvZGUgKiloYXNoX2ZpbmQgKGQzMHZfaGFzaCwgbmFtZSk7Ci0gIGlmIChvcGNvZGUtPm9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZTogJXMiKSxuYW1lKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BfZW5kOwotICB3aGlsZSAoIShvcGNvZGUtPmZvcm0gPSBmaW5kX2Zvcm1hdCAob3Bjb2RlLT5vcCwgbXlvcHMsIGZzaXplLCBjbXBfaGFjaykpKQotICAgIHsKLSAgICAgIG9wY29kZS0+b3ArKzsKLSAgICAgIGlmIChvcGNvZGUtPm9wLT5uYW1lID09IE5VTEwgfHwgc3RyY21wIChvcGNvZGUtPm9wLT5uYW1lLCBuYW1lKSkKLQl7Ci0JICBhc19iYWQgKF8oIm9wZXJhbmRzIGZvciBvcGNvZGUgYCVzJyBkbyBub3QgbWF0Y2ggYW55IHZhbGlkIGZvcm1hdCIpLCBuYW1lKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotCi0gIGluc24gPSBidWlsZF9pbnNuIChvcGNvZGUsIG15b3BzKTsgCi0KLSAgLyogUHJvcGlnYXRlIG11bHRpcGx5IHN0YXR1cyAqLwotICBpZiAoaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoaXNfcGFyYWxsZWwgJiYgcHJldl9tdWwzMl9wKQotCWN1cl9tdWwzMl9wID0gMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmV2X211bDMyX3AgPSBjdXJfbXVsMzJfcDsKLQkgIGN1cl9tdWwzMl9wICA9IChvcGNvZGUtPm9wLT5mbGFnc191c2VkICYgRkxBR19NVUwzMikgIT0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFByb3BhZ2F0ZSBsZWZ0X2tpbGxzX3JpZ2h0IHN0YXR1cyAqLwotICBpZiAoaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCA9IGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3A7Ci0KLSAgICAgIGlmIChvcGNvZGUtPm9wLT5mbGFnc19zZXQgJiBGTEFHX0xLUikKLQl7Ci0JICBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMTsKLQkgIAotCSAgaWYgKHN0cmNtcCAob3Bjb2RlLT5vcC0+bmFtZSwgIm12dHN5cyIpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBMZWZ0IGtpbGxzIHJpZ2h0IGZvciBvbmx5IG12dHN5cyBvbmx5IGZvciBQU1cvUFNXSC9QU1dML2ZsYWdzIHRhcmdldC4gKi8KLQkgICAgICBpZiAoKG15b3BzWzBdLlhfb3AgPT0gT19yZWdpc3RlcikgJiYKLQkJICAoKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0NPTlRST0wpIHx8IC8qIHBzdyAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMikgfHwgLyogcHN3aCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMSkgfHwgLyogcHN3bCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRyswKSB8fCAvKiBmMCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRysxKSB8fCAvKiBmMSAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRysyKSB8fCAvKiBmMiAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRyszKSB8fCAvKiBmMyAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys0KSB8fCAvKiBmNCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys1KSB8fCAvKiBmNSAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys2KSB8fCAvKiBmNiAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys3KSkpIC8qIGY3ICovCi0JCXsKLQkJICBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIE90aGVyIG12dHN5cyB0YXJnZXQgcmVnaXN0ZXJzIGRvbid0IGtpbGwgcmlnaHQgaW5zdHJ1Y3Rpb24uICovCi0JCSAgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci0JCX0KLQkgICAgfSAvKiBtdnRzeXMgKi8KLQl9Ci0gICAgICBlbHNlCi0JY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiBpbnNuOwotfQotCi0KLS8qIGZpbmRfZm9ybWF0KCkgZ2V0cyBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZvcm1hdCB0YWJsZS4KLSAgIEl0IG11c3QgbG9vayBhdCBhbGwgZm9ybWF0cyBmb3IgYW4gb3Bjb2RlIGFuZCB1c2UgdGhlIG9wZXJhbmRzCi0gICB0byBjaG9vc2UgdGhlIGNvcnJlY3Qgb25lLiAgUmV0dXJucyBOVUxMIG9uIGVycm9yLiAqLwotCi1zdGF0aWMgc3RydWN0IGQzMHZfZm9ybWF0ICoKLWZpbmRfZm9ybWF0IChvcGNvZGUsIG15b3BzLCBmc2l6ZSwgY21wX2hhY2spCi0gICAgIHN0cnVjdCBkMzB2X29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotICAgICBpbnQgZnNpemU7Ci0gICAgIGludCBjbXBfaGFjazsKLXsKLSAgaW50IG51bW9wcywgbWF0Y2gsIGluZGV4LCBpPTAsIGosIGs7Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZm07Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgLyogR2V0IGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucy4gICovCi0gIG51bW9wcyA9IGdldF9vcGVyYW5kcyAobXlvcHMsIGNtcF9oYWNrKTsKLQotICB3aGlsZSAoKGluZGV4ID0gb3Bjb2RlLT5mb3JtYXRbaSsrXSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZnNpemUgPT0gRk9SQ0VfU0hPUlQgJiYgaW5kZXggPj0gTE9ORykKLQljb250aW51ZTsKLQotICAgICAgaWYgKGZzaXplID09IEZPUkNFX0xPTkcgJiYgaW5kZXggPCBMT05HKQotCWNvbnRpbnVlOwotCi0gICAgICBmbSA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKikmZDMwdl9mb3JtYXRfdGFibGVbaW5kZXhdOwotICAgICAgayA9IGluZGV4OwotICAgICAgd2hpbGUgKGZtLT5mb3JtID09IGluZGV4KQotCXsKLQkgIG1hdGNoID0gMTsKLQkgIC8qIE5vdyBjaGVjayB0aGUgb3BlcmFuZHMgZm9yIGNvbXBhdGliaWxpdHkuICAqLwotCSAgZm9yIChqID0gMDsgbWF0Y2ggJiYgZm0tPm9wZXJhbmRzW2pdOyBqKyspCi0JICAgIHsKLQkgICAgICBpbnQgZmxhZ3MgPSBkMzB2X29wZXJhbmRfdGFibGVbZm0tPm9wZXJhbmRzW2pdXS5mbGFnczsKLQkgICAgICBpbnQgYml0cyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmbS0+b3BlcmFuZHNbal1dLmJpdHM7Ci0JICAgICAgaW50IFhfb3AgPSBteW9wc1tqXS5YX29wOwotCSAgICAgIGludCBudW0gPSBteW9wc1tqXS5YX2FkZF9udW1iZXI7Ci0JICAgICAgCi0JICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TUEVDSUFMKQotCQlicmVhazsKLQkgICAgICBlbHNlIGlmIChYX29wID09IE9faWxsZWdhbCkKLQkJbWF0Y2ggPSAwOwotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JCXsKLQkJICBpZiAoWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FDQykgJiYgIShudW0gJiBPUEVSQU5EX0FDQykpCi0JCSAgICAgIHx8ICghKGZsYWdzICYgT1BFUkFORF9BQ0MpICYmIChudW0gJiBPUEVSQU5EX0FDQykpCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpICYmICEobnVtICYgT1BFUkFORF9GTEFHKSkKLQkJICAgICAgfHwgKCEoZmxhZ3MgJiAoT1BFUkFORF9GTEFHIHwgT1BFUkFORF9DT05UUk9MKSkgJiYgKG51bSAmIE9QRVJBTkRfRkxBRykpCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCi0JCQkgICYmICEobnVtICYgKE9QRVJBTkRfQ09OVFJPTCB8IE9QRVJBTkRfRkxBRykpKSkKLQkJICAgIHsKLQkJICAgICAgbWF0Y2ggPSAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKChmbGFncyAmIE9QRVJBTkRfTUlOVVMpCi0JCSAgICAgICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfTUlOVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfUExVUykKLQkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX1BMVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykKLQkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX0FUTUlOVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQVRQQVIpCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9BVFBBUikpCi0JCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BVFNJR04pCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9BVFNJR04pKSkKLQkJewotCQkgIG1hdGNoPTA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfTlVNKQotCQl7Ci0JCSAgLyogQSBudW1iZXIgY2FuIGJlIGEgY29uc3RhbnQgb3Igc3ltYm9sIGV4cHJlc3Npb24uICAqLwotCi0JCSAgLyogSWYgd2UgaGF2ZSBmb3VuZCBhIHJlZ2lzdGVyIG5hbWUsIGJ1dCB0aGF0IG5hbWUgYWxzbwotCQkgICAgIG1hdGNoZXMgYSBzeW1ib2wsIHRoZW4gcmUtcGFyc2UgdGhlIG5hbWUgYXMgYW4gZXhwcmVzc2lvbi4gICovCi0JCSAgaWYgKFhfb3AgPT0gT19yZWdpc3RlcgotCQkgICAgICAmJiBzeW1ib2xfZmluZCAoKGNoYXIgKikgbXlvcHNbal0uWF9vcF9zeW1ib2wpKQotCQkgICAgewotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAoY2hhciAqKSBteW9wc1tqXS5YX29wX3N5bWJvbDsKLQkJICAgICAgZXhwcmVzc2lvbiAoJiBteW9wc1tqXSk7Ci0JCSAgICB9Ci0JCSAgICAgIAotCQkgIC8qIFR1cm4gYW4gZXhwcmVzc2lvbiBpbnRvIGEgc3ltYm9sIGZvciBsYXRlciByZXNvbHV0aW9uLiAgKi8KLQkJICBpZiAoWF9vcCAhPSBPX2Fic2VudCAmJiBYX29wICE9IE9fY29uc3RhbnQKLQkJICAgICAgJiYgWF9vcCAhPSBPX3N5bWJvbCAmJiBYX29wICE9IE9fcmVnaXN0ZXIKLQkJICAgICAgJiYgWF9vcCAhPSBPX2JpZykKLQkJICAgIHsKLQkJICAgICAgc3ltYm9sUyAqc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJm15b3BzW2pdKTsKLQkJICAgICAgbXlvcHNbal0uWF9vcCA9IFhfb3AgPSBPX3N5bWJvbDsKLQkJICAgICAgbXlvcHNbal0uWF9hZGRfc3ltYm9sID0gc3ltOwotCQkgICAgICBteW9wc1tqXS5YX2FkZF9udW1iZXIgPSBudW0gPSAwOwotCQkgICAgfQotCi0JCSAgaWYgKGZtLT5mb3JtID49IExPTkcpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHdlJ3JlIHRlc3RpbmcgZm9yIGEgTE9ORyBmb3JtYXQsIGVpdGhlciBmaXRzLiAqLwotCQkgICAgICBpZiAoWF9vcCAhPSBPX2NvbnN0YW50ICYmIFhfb3AgIT0gT19zeW1ib2wpCi0JCQltYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZm0tPmZvcm0gPCBMT05HCi0JCQkgICAmJiAoKGZzaXplID09IEZPUkNFX1NIT1JUICYmIFhfb3AgPT0gT19zeW1ib2wpCi0JCQkgICAgICAgfHwgKGZtLT5mb3JtID09IFNIT1JUX0QyICYmIGogPT0gMCkpKQotCQkgICAgbWF0Y2ggPSAxOwotCQkgIC8qIFRoaXMgaXMgdGhlIHRyaWNreSBwYXJ0LiAgV2lsbCB0aGUgY29uc3RhbnQgb3Igc3ltYm9sCi0JCSAgICAgZml0IGludG8gdGhlIHNwYWNlIGluIHRoZSBjdXJyZW50IGZvcm1hdD8gKi8KLQkJICBlbHNlIGlmIChYX29wID09IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykpCi0JCQltYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoWF9vcCA9PSBPX3N5bWJvbAotCQkJICAgJiYgU19JU19ERUZJTkVEIChteW9wc1tqXS5YX2FkZF9zeW1ib2wpCi0JCQkgICAmJiBTX0dFVF9TRUdNRU5UIChteW9wc1tqXS5YX2FkZF9zeW1ib2wpID09IG5vd19zZWcKLQkJCSAgICYmIG9wY29kZS0+cmVsb2NfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBzZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0Ci0JCQkgaW50byB0aGUgZm9ybSB3ZSdyZSBjb25zaWRlcmluZy4gKi8KLQkJICAgICAgZnJhZ1MgKmY7Ci0JCSAgICAgIGxvbmcgdmFsdWU7Ci0KLQkJICAgICAgLyogQ2FsY3VsYXRlIHRoZSBjdXJyZW50IGFkZHJlc3MgYnkgcnVubmluZyB0aHJvdWdoIHRoZQotCQkJIHByZXZpb3VzIGZyYWdzIGFuZCBhZGRpbmcgb3VyIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgICBmb3IgKGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmOyBmID0gZi0+ZnJfbmV4dCkKLQkJCXZhbHVlICs9IGYtPmZyX2ZpeCArIGYtPmZyX29mZnNldDsKLQkJICAgICAgdmFsdWUgPSAoU19HRVRfVkFMVUUgKG15b3BzW2pdLlhfYWRkX3N5bWJvbCkgLSB2YWx1ZQotCQkJICAgICAgIC0gKG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykKLQkJCQkgIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpKTsKLQkJICAgICAgaWYgKGNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZmxhZ3MpKSAKLQkJCW1hdGNoID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgfQotCSAgLyogcHJpbnRmKCJ0aHJvdWdoIHRoZSBsb29wOiBtYXRjaD0lZFxuIixtYXRjaCk7ICAqLwotCSAgLyogV2UncmUgb25seSBkb25lIGlmIHRoZSBvcGVyYW5kcyBtYXRjaGVkIHNvIGZhciBBTkQgdGhlcmUKLQkgICAgIGFyZSBubyBtb3JlIHRvIGNoZWNrLiAgKi8KLQkgIGlmIChtYXRjaCAmJiBteW9wc1tqXS5YX29wID09IDApCi0JICAgIHsKLQkgICAgICAvKiBGaW5hbCBjaGVjayAtIGlzc3VlIGEgd2FybmluZyBpZiBhbiBvZGQgbnVtYmVyZWQgcmVnaXN0ZXIKLQkJIGlzIHVzZWQgYXMgdGhlIGZpcnN0IHJlZ2lzdGVyIGluIGFuIGluc3RydWN0aW9uIHRoYXQgcmVhZHMKLQkJIG9yIHdyaXRlcyAyIHJlZ2lzdGVycy4gICovCi0KLQkgICAgICBmb3IgKGogPSAwOyBmbS0+b3BlcmFuZHNbal07IGorKykKLQkJaWYgKG15b3BzW2pdLlhfb3AgPT0gT19yZWdpc3RlcgotCQkgICAgJiYgKG15b3BzW2pdLlhfYWRkX251bWJlciAmIDEpCi0JCSAgICAmJiAoZDMwdl9vcGVyYW5kX3RhYmxlW2ZtLT5vcGVyYW5kc1tqXV0uZmxhZ3MgJiBPUEVSQU5EXzJSRUcpKQotCQkgIGFzX3dhcm4gKFwKLV8oIk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbiIpKTsKLQkgICAgICAKLQkgICAgICByZXR1cm4gZm07Ci0JICAgIH0KLQkgIGZtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVsrK2tdOwotCX0KLSAgICAgIC8qIHByaW50ZigidHJ5aW5nIGFub3RoZXIgZm9ybWF0OiBpPSVkXG4iLGkpOyAqLwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQotICAgICBmaXhTICpmaXhwOwotICAgICBzZWdUIHNlYzsKLXsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopTlVMTCAmJiAoIVNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpIHx8Ci0gICAgIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKiBmaXhwOwotICAgICB2YWx1ZVQgKiB2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICogd2hlcmU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbiwgaW5zbjI7Ci0gIGxvbmcgdmFsdWU7Ci0gIAotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVwOwotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICAKLSAgICAgIGlmIChmaXhwLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikgCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KLSAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gIGluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gIAotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODogIC8qIENoZWNrIGZvciBhIGJhZCAuYnl0ZSBkaXJlY3RpdmUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgYnl0ZSIpLAotCQlmaXhwLT5meF9saW5lLCBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotICAgICAgZWxzZSBpZiAoKCh1bnNpZ25lZCl2YWx1ZSkgPiAweGZmKQotCSAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIGJ5dGUiKSwKLQkJICAgIGZpeHAtPmZ4X2xpbmUsIHZhbHVlKTsKLSAgICAgIGVsc2UKLQkqICh1bnNpZ25lZCBjaGFyICopIHdoZXJlID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DXzE2OiAgLyogQ2hlY2sgZm9yIGEgYmFkIC5zaG9ydCBkaXJlY3RpdmUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgc2hvcnQiKSwKLQkJZml4cC0+ZnhfbGluZSwgU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpKTsKLSAgICAgIGVsc2UgaWYgKCgodW5zaWduZWQpdmFsdWUpID4gMHhmZmZmKQotCSAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIHNob3J0IiksCi0JCSAgICBmaXhwLT5meF9saW5lLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DXzY0OiAgLyogQ2hlY2sgZm9yIGEgYmFkIC5xdWFkIGRpcmVjdGl2ZS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQlhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBxdWFkIiksCi0JCWZpeHAtPmZ4X2xpbmUsIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICBiZmRfcHV0YjMyICgwLCAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpICsgNCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzY6Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgNiwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9IHZhbHVlICYgMHgzRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SOwotCX0KLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCA5LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKCh2YWx1ZSA+PiAzKSAmIDB4M0YpIDw8IDEyOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8xNToKLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAxNSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4RkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUjsKLQl9Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMTUsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweEZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMjE6Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMjEsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweDNGRkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUjsKLQl9Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMjEsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweDNGRkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8zMjoKLSAgICAgIGluc24yID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDI2KSAmIDB4M0Y7CQkvKiB0b3AgNiBiaXRzICovCi0gICAgICBpbnNuMiB8PSAoKHZhbHVlICYgMHgwM0ZDMDAwMCkgPDwgMik7CS8qIG5leHQgOCBiaXRzICovIAotICAgICAgaW5zbjIgfD0gdmFsdWUgJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbjIsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUw6Ci0gICAgICBpbnNuMiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAyNikgJiAweDNGOwkJLyogdG9wIDYgYml0cyAqLwotICAgICAgaW5zbjIgfD0gKCh2YWx1ZSAmIDB4MDNGQzAwMDApIDw8IDIpOwkvKiBuZXh0IDggYml0cyAqLyAKLSAgICAgIGluc24yIHw9IHZhbHVlICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24yLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIpLAotCSAgICAgIGZpeHAtPmZ4X2xpbmUsZml4cC0+Znhfcl90eXBlKTsKLSAgICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQotCi0vKiBkMzB2X2NsZWFudXAoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQgcGFyc2luZyB0aGUgaW5wdXQgCi0gICBmaWxlIG9yIGFmdGVyIGEgbGFiZWwgaXMgZGVmaW5lZC4gIEJlY2F1c2UgdGhlIEQzMFYgYXNzZW1ibGVyIHNvbWV0aW1lcyBzYXZlcyBzaG9ydCAKLSAgIGluc3RydWN0aW9ucyB0byBzZWUgaWYgaXQgY2FuIHBhY2thZ2UgdGhlbSB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uLCB0aGVyZSBtYXkKLSAgIGJlIGEgc2hvcnQgaW5zdHJ1Y3Rpb24gdGhhdCBzdGlsbCBuZWVkcyB3cml0dGVuLiAgKi8KLWludAotZDMwdl9jbGVhbnVwICh1c2Vfc2VxdWVudGlhbCkKLSAgICAgaW50IHVzZV9zZXF1ZW50aWFsOwotewotICBzZWdUIHNlZzsKLSAgc3Vic2VnVCBzdWJzZWc7Ci0KLSAgaWYgKHByZXZfaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBzZWcgPSBub3dfc2VnOwotICAgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIHN1YnNlZ19zZXQgKHByZXZfc2VnLCBwcmV2X3N1YnNlZyk7Ci0gICAgICB3cml0ZV8xX3Nob3J0ICgmcHJldl9vcGNvZGUsIChsb25nKXByZXZfaW5zbiwgZml4dXBzLT5uZXh0LCB1c2Vfc2VxdWVudGlhbCk7Ci0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgICBwcmV2X2luc24gPSAtMTsKLSAgICAgIGlmICh1c2Vfc2VxdWVudGlhbCkKLQlwcmV2X211bDMyX3AgPSBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAKLWQzMHZfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBuKQotICAgICBjaGFyICpidWY7CQkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgbG9uZyB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG47CQkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIHdoaWxlIChuLS0pCi0gICAgewotICAgICAgYnVmW25dID0gdmFsdWUgJiAweGZmOwotICAgICAgdmFsdWUgPj49IDg7Ci0gICAgfQotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBldmVyeSBsaW5lLiAqLwotLyogaXQgY2hlY2tzIHRvIHNlZSBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgJy4nICovCi0vKiB3aGljaCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGEgcHNldWRvLW9wLiAgSWYgaXQgaXMsICovCi0vKiB0aGVuIHdyaXRlIG91dCBhbnkgdW53cml0dGVuIGluc3RydWN0aW9ucyAqLwotCi12b2lkIAotZDMwdl9zdGFydF9saW5lICgpCi17Ci0gIGNoYXIgKmMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgd2hpbGUgKGlzc3BhY2UgKCpjKSkKLSAgICBjKys7Ci0KLSAgaWYgKCpjID09ICcuJykKLSAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgCi1jaGVja19zaXplICh2YWx1ZSwgYml0cywgZmlsZSwgbGluZSkKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIGludCBsaW5lOwotewotICBpbnQgdG1wLCBtYXg7Ci0KLSAgaWYgKHZhbHVlIDwgMCkKLSAgICB0bXAgPSB+dmFsdWU7Ci0gIGVsc2UKLSAgICB0bXAgPSB2YWx1ZTsKLSAgICAKLSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOwotCi0gIGlmICh0bXAgPiBtYXgpCi0gICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJ2YWx1ZSB0b28gbGFyZ2UgdG8gZml0IGluICVkIGJpdHMiKSwgYml0cyk7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBkMzB2X2Zyb2JfbGFiZWwoKSBpcyBjYWxsZWQgd2hlbiBhZnRlciBhIGxhYmVsIGlzIHJlY29nbml6ZWQuICAqLwotCi12b2lkCi1kMzB2X2Zyb2JfbGFiZWwgKGxhYikKLSAgICAgc3ltYm9sUyAqbGFiOwotewotICAvKiBFbWl0IGFueSBwZW5kaW5nIGluc3RydWN0aW9ucy4gICovCi0gIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCi0gIC8qIFVwZGF0ZSB0aGUgbGFiZWwncyBhZGRyZXNzIHdpdGggdGhlIGN1cnJlbnQgb3V0cHV0IHBvaW50ZXIuICAqLwotICBzeW1ib2xfc2V0X2ZyYWcgKGxhYiwgZnJhZ19ub3cpOwotICBTX1NFVF9WQUxVRSAobGFiLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCi0gIC8qIFJlY29yZCB0aGlzIGxhYmVsIGZvciBmdXR1cmUgYWRqdXN0bWVudCBhZnRlciB3ZSBmaW5kIG91dCB3aGF0Ci0gICAgIGtpbmQgb2YgZGF0YSBpdCByZWZlcmVuY2VzLCBhbmQgdGhlIHJlcXVpcmVkIGFsaWdubWVudCB0aGVyZXdpdGguICAqLwotICBkMzB2X2xhc3RfbGFiZWwgPSBsYWI7Ci19Ci0KLS8qIEhvb2sgaW50byBjb25zIGZvciBjYXB0dXJpbmcgYWxpZ25tZW50IGNoYW5nZXMuICAqLwotCi12b2lkCi1kMzB2X2NvbnNfYWxpZ24gKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBpbnQgbG9nX3NpemU7Ci0KLSAgbG9nX3NpemUgPSAwOwotICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCi0gICAgKytsb2dfc2l6ZTsKLQotICBpZiAoZDMwdl9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgZDMwdl9hbGlnbiAobG9nX3NpemUsIChjaGFyICopIE5VTEwsIE5VTEwpOwotICBlbHNlIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBkMzB2X2N1cnJlbnRfYWxpZ24gPSBsb2dfc2l6ZTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLX0KLQotLyogQ2FsbGVkIGludGVybmFsbHkgdG8gaGFuZGxlIGFsbCBhbGlnbm1lbnQgbmVlZHMuICBUaGlzIHRha2VzIGNhcmUKLSAgIG9mIGVsaWRpbmcgY2FsbHMgdG8gZnJhZ19hbGlnbiBpZiduIHRoZSBjYWNoZWQgY3VycmVudCBhbGlnbm1lbnQKLSAgIHNheXMgd2UndmUgYWxyZWFkeSBnb3QgaXQsIGFzIHdlbGwgYXMgdGFraW5nIGNhcmUgb2YgdGhlIGF1dG8tYWxpZ25pbmcKLSAgIGxhYmVscyB3cnQgY29kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1kMzB2X2FsaWduIChuLCBwZmlsbCwgbGFiZWwpCi0gICAgIGludCBuOwotICAgICBjaGFyICpwZmlsbDsKLSAgICAgc3ltYm9sUyAqbGFiZWw7Ci17Ci0gIC8qIFRoZSBmcm9udCBlbmQgaXMgcHJvbmUgdG8gY2hhbmdpbmcgc2VnbWVudHMgb3V0IGZyb20gdW5kZXIgdXMKLSAgICAgdGVtcG9yYXJpbHkgd2hlbiAtZyBpcyBpbiBlZmZlY3QuICAqLwotICBpbnQgc3dpdGNoZWRfc2VnX3AgPSAoZDMwdl9jdXJyZW50X2FsaWduX3NlZyAhPSBub3dfc2VnKTsKLQotICAvKiBEbyBub3QgYXNzdW1lIHRoYXQgaWYgJ2QzMHZfY3VycmVudF9hbGlnbiA+PSBuJyBhbmQKLSAgICAgJyEgc3dpdGNoZWRfc2VnX3AnIHRoYXQgaXQgaXMgc2FmZSB0byBhdm9pZCBwZXJmb3JtaW5nCi0gICAgIHRoaXMgYWxpZ25lbWVudCByZXF1ZXN0LiAgVGhlIGFsaWdubWVudCBvZiB0aGUgY3VycmVudCBmcmFnCi0gICAgIGNhbiBiZSBjaGFuZ2VkIHVuZGVyIG91ciBmZWV0LCBmb3IgZXhhbXBsZSBieSBhIC5hc2NpaQotICAgICBkaXJlY3RpdmUgaW4gdGhlIHNvdXJjZSBjb2RlLiAgY2YgdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMgICovCi0gIAotICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQotICBpZiAocGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA+IDIKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLQl7Ci0JICBzdGF0aWMgY2hhciBjb25zdCBub3BbNF0gPSB7IDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAgfTsKLQotCSAgLyogRmlyc3QsIG1ha2Ugc3VyZSB3ZSdyZSBvbiBhIGZvdXItYnl0ZSBib3VuZGFyeSwgaW4gY2FzZQotCSAgICAgc29tZW9uZSBoYXMgYmVlbiBwdXR0aW5nIC5ieXRlIHZhbHVlcyB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCAyIHx8IHN3aXRjaGVkX3NlZ19wKQotCSAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLQkgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbm9wLCBzaXplb2Ygbm9wLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbiAobiwgMCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKLQotICBpZiAoIXN3aXRjaGVkX3NlZ19wKQotICAgIGQzMHZfY3VycmVudF9hbGlnbiA9IG47Ci0KLSAgaWYgKGxhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUyAqICAgICBzeW07Ci0gICAgICBpbnQgICAgICAgICAgIGxhYmVsX3NlZW4gPSBmYWxzZTsKLSAgICAgIHN0cnVjdCBmcmFnICogb2xkX2ZyYWc7Ci0gICAgICB2YWx1ZVQgICAgICAgIG9sZF92YWx1ZTsKLSAgICAgIHZhbHVlVCAgICAgICAgbmV3X3ZhbHVlOwotICAgICAgCi0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLQotICAgICAgb2xkX2ZyYWcgID0gc3ltYm9sX2dldF9mcmFnIChsYWJlbCk7Ci0gICAgICBvbGRfdmFsdWUgPSBTX0dFVF9WQUxVRSAobGFiZWwpOwotICAgICAgbmV3X3ZhbHVlID0gKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpOwotICAgICAgCi0gICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbGFiZWwgYXQgYSBwYXJ0aWN1bGFyCi0JIGFkZHJlc3MsIGVzcGVjaWFsbHkgaWYgZGVidWdnaW5nIGlzIGVuYWJsZWQsIHNvIHdlIG11c3QKLQkgdGFrZSBjYXJlIHRvIGFkanVzdCBhbGwgdGhlIGxhYmVscyBhdCB0aGlzIGFkZHJlc3MgaW4gdGhpcwotCSBmcmFnbWVudC4gIFRvIHNhdmUgdGltZSB3ZSBzZWFyY2ggZnJvbSB0aGUgZW5kIG9mIHRoZSBzeW1ib2wKLQkgbGlzdCwgYmFja3dhcmRzLCBzaW5jZSB0aGUgc3ltYm9scyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBhcmUKLQkgYWxtb3N0IGNlcnRhaW5seSB0aGUgb25lcyB0aGF0IHdlcmUgbW9zdCByZWNlbnRseSBhZGRlZC4KLQkgQWxzbyB0byBzYXZlIHRpbWUgd2Ugc3RvcCBzZWFyY2hpbmcgb25jZSB3ZSBoYXZlIHNlZW4gYXQgbGVhc3QKLQkgb25lIG1hdGNoaW5nIGxhYmVsLCBhbmQgd2UgZW5jb3VudGVyIGEgbGFiZWwgdGhhdCBpcyBubyBsb25nZXIKLQkgaW4gdGhlIHRhcmdldCBmcmFnbWVudC4gIE5vdGUsIHRoaXMgc2VhcmNoIGlzIGd1YXJhbnRlZWQgdG8KLQkgZmluZCBhdCBsZWFzdCBvbmUgbWF0Y2ggd2hlbiBzeW0gPT0gbGFiZWwsIHNvIG5vIHNwZWNpYWwgY2FzZQotCSBjb2RlIGlzIG5lY2Vzc2FyeS4gICovCi0gICAgICBmb3IgKHN5bSA9IHN5bWJvbF9sYXN0UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9wcmV2aW91cyAoc3ltKSkKLQl7Ci0JICBpZiAoc3ltYm9sX2dldF9mcmFnIChzeW0pID09IG9sZF9mcmFnCi0JICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gb2xkX3ZhbHVlKQotCSAgICB7Ci0JICAgICAgbGFiZWxfc2VlbiA9IHRydWU7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLQkgICAgICBTX1NFVF9WQUxVRSAoc3ltLCBuZXdfdmFsdWUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChsYWJlbF9zZWVuICYmIHN5bWJvbF9nZXRfZnJhZyAoc3ltKSAhPSBvbGRfZnJhZykKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgVGhpcyBhbGlnbnMgdG8gYSBwb3dlciBvZiB0d28uICBXZQotICAgaG9vayBoZXJlIHRvIGxhdGNoIHRoZSBjdXJyZW50IGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfYWxpZ24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGFsaWduOwotICBjaGFyIGZpbGwsICpwZmlsbCA9IE5VTEw7Ci0gIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OwotCi0gIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCi0gICAgewotICAgICAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OwotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQgYXNzdW1lZCIpLCBhbGlnbik7Ci0gICAgfQotICBlbHNlIGlmIChhbGlnbiA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiKSk7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHBmaWxsID0gJmZpbGw7Ci0gICAgfQotCi0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfYWxpZ24gKGFsaWduLCBwZmlsbCwgTlVMTCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudGV4dCBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgdGhlIHNhdmVkIGxhc3QgbGFiZWwgYW5kIHJlc2V0cyBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19kMzB2X3RleHQgKGkpCi0gICAgIGludCBpOwotCi17Ci0gIHNfdGV4dCAoaSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQotCi0vKiBIYW5kbGUgdGhlIC5kYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfZGF0YSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHNfZGF0YSAoaSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmggYi9nYXMvY29uZmlnL3RjLWQzMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlYmJiOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIHRjLTMxMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtZDMwdi5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19EMzBWCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBEMzBWIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2QzMHYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItZDMwdiIKLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oRklYUCwgU0VDKSAgIAotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4KLQotaW50IGQzMHZfY2xlYW51cCBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgbWRfYWZ0ZXJfcGFzc19ob29rKCkJICAgICBkMzB2X2NsZWFudXAgKGZhbHNlKQotI2RlZmluZSBtZF9jbGVhbnVwKCkJCSAgICAgZDMwdl9jbGVhbnVwIChmYWxzZSkKLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2gsIHB0cikgICAgICAoY2ggPT0gJzonICYmIGQzMHZfY2xlYW51cCAoZmFsc2UpKQotI2RlZmluZSBtZF9zdGFydF9saW5lX2hvb2soKQkgICAgIGQzMHZfc3RhcnRfbGluZSAoZmFsc2UpCi0KLXZvaWQgZDMwdl9mcm9iX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkJICAgICBkMzB2X2Zyb2JfbGFiZWwoc3ltKQotCi12b2lkIGQzMHZfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpCSAgICAgZDMwdl9jb25zX2FsaWduKG5ieXRlcykKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZnIzMC5jIGIvZ2FzL2NvbmZpZy90Yy1mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTU4ODAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1mcjMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyogdGMtZnIzMC5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIEZ1aml0c3UgRlIzMC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGVzL2ZyMzAtZGVzYy5oIgotI2luY2x1ZGUgIm9wY29kZXMvZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgZGVzY3JpYmluZwotICAgYW4gaW5kaXZpZHVhbCBpbnN0cnVjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBDR0VOX0lOU04gKglpbnNuOwotICBjb25zdCBDR0VOX0lOU04gKglvcmlnX2luc247Ci0gIENHRU5fRklFTERTCQlmaWVsZHM7Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0gIENHRU5fSU5TTl9JTlQgICAgICAgICBidWZmZXIgWzFdOwotI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKCooYnVmKSkKLSNlbHNlCi0gIHVuc2lnbmVkIGNoYXIgICAgICAgICBidWZmZXIgW0NHRU5fTUFYX0lOU05fU0laRV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoYnVmKQotI2VuZGlmCi0gIGNoYXIgKgkJYWRkcjsKLSAgZnJhZ1MgKgkJZnJhZzsKLSAgaW50ICAgICAgICAgICAgICAgICAgIG51bV9maXh1cHM7Ci0gIGZpeFMgKiAgICAgICAgICAgICAgICBmaXh1cHMgW0dBU19DR0VOX01BWF9GSVhVUFNdOwotICBpbnQgICAgICAgICAgICAgICAgICAgaW5kaWNlcyBbTUFYX09QRVJBTkRfSU5TVEFOQ0VTXTsKLX0KLWZyMzBfaW5zbjsKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gICAgICAgID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSAgID0gIiMiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gInwiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSAgICAgICAgICAgID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gICAgICAgICAgICA9ICJkRCI7Ci0MCi0jZGVmaW5lIEZSMzBfU0hPUlRPUFRTICIiCi1jb25zdCBjaGFyICogbWRfc2hvcnRvcHRzID0gRlIzMF9TSE9SVE9QVFM7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgICAgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICogc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBGUjMwIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zOlxuIikpOwotfSAKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsCWNvbnMsCQk0IH0sCi0gIHsgTlVMTCwgCU5VTEwsIAkJMCB9Ci19OwotCi0MCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotICBzZWdUICAgICBzZWc7Ci0gIHN1YnNlZ1QgIHN1YnNlZzsKLQotICAvKiBJbml0aWFsaXplIHRoZSBgY2dlbicgaW50ZXJmYWNlLiAgKi8KLSAgCi0gIC8qIFNldCB0aGUgbWFjaGluZSBudW1iZXIgYW5kIGVuZGlhbi4gICovCi0gIGdhc19jZ2VuX2NwdV9kZXNjID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX01BQ0hTLCAwLAotCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5ESUFOLAotCQkJCQkgIENHRU5fRU5ESUFOX0JJRywKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gIGZyMzBfY2dlbl9pbml0X2FzbSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOwotCi0gIC8qIFRoaXMgaXMgYSBjYWxsYmFjayBmcm9tIGNnZW4gdG8gZ2FzIHRvIHBhcnNlIG9wZXJhbmRzLiAgKi8KLSAgY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGdhc19jZ2VuX3BhcnNlX29wZXJhbmQpOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBzdGF0aWMgaW50IGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdCA9IDA7Ci0gIGZyMzBfaW5zbiBpbnNuOwotICBjaGFyICogICAgZXJybXNnOwotICBjaGFyICogICAgc3RyMiA9IE5VTEw7Ci0KLSAgLyogSW5pdGlhbGl6ZSBHQVMncyBjZ2VuIGludGVyZmFjZSBmb3IgYSBuZXcgaW5zdHJ1Y3Rpb24uICAqLwotICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOwotCi0gIGluc24uaW5zbiA9IGZyMzBfY2dlbl9hc3NlbWJsZV9pbnNuCi0gICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBzdHIsICYgaW5zbi5maWVsZHMsIGluc24uYnVmZmVyLCAmIGVycm1zZyk7Ci0gIAotICBpZiAoIWluc24uaW5zbikKLSAgICB7Ci0gICAgICBhc19iYWQgKGVycm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGF0IHdlIHBhc3MgZm9yIFJFTEFYX1AgaGVyZS4gICovCi0gIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLmluc24sIGluc24uYnVmZmVyLAotCQkJQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBpbnNuLmZpZWxkcyksIDEsIE5VTEwpOwotCi0gIC8qIFdhcm4gYWJvdXQgaW52YWxpZCBpbnNucyBpbiBkZWxheSBzbG90cy4gICovCi0gIGlmIChsYXN0X2luc25faGFkX2RlbGF5X3Nsb3QKLSAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLmluc24sIENHRU5fSU5TTl9OT1RfSU5fREVMQVlfU0xPVCkpCi0gICAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXMgbm90IGFsbG93ZWQgaW4gYSBkZWxheSBzbG90LiIpLAotCSAgICAgQ0dFTl9JTlNOX05BTUUgKGluc24uaW5zbikpOwotCi0gIGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdAotICAgID0gQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24uaW5zbiwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QpOwotfQotCi0vKiBUaGUgc3ludGF4IGluIHRoZSBtYW51YWwgc2F5cyBjb25zdGFudHMgYmVnaW4gd2l0aCAnIycuCi0gICBXZSBqdXN0IGlnbm9yZSBpdC4gICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1QgICBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotDAotLyogSW50ZXJmYWNlIHRvIHJlbGF4X3NlZ21lbnQuICAqLwotCi0vKiBGSVhNRTogQnVpbGQgdGFibGUgYnkgaGFuZCwgZ2V0IGl0IHdvcmtpbmcsIHRoZW4gbWFjaGluZSBnZW5lcmF0ZS4gICovCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotLyogVGhlIGZpZWxkcyBhcmU6Ci0gICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLiAgKi8KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgbXVzdCBiZSB1bnVzZWQgYmVjYXVzZSBhbiBgcmx4X21vcmUnIHZhbHVlIG9mIHplcm8gZW5kcwotICAgICBlYWNoIGxpc3QuICAqLwotICB7MSwgMSwgMCwgMH0sCi0KLSAgLyogVGhlIGRpc3BsYWNlbWVudCB1c2VkIGJ5IEdBUyBpcyBmcm9tIHRoZSBlbmQgb2YgdGhlIDIgYnl0ZSBpbnNuLAotICAgICBzbyB3ZSBzdWJ0cmFjdCAyIGZyb20gdGhlIGZvbGxvd2luZy4gICovCi0gIC8qIDE2IGJpdCBpbnNuLCA4IGJpdCBkaXNwIC0+IDEwIGJpdCByYW5nZS4KLSAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSBhIGJyYW5jaCBpbiB0aGUgcmlnaHQgc2xvdCBhdCB0aGUgYm9yZGVyOgotICAgICB0aGUgIiYgLTQiIGlzbid0IHRha2VuIGludG8gYWNjb3VudC4gIEl0J3Mgbm90IGltcG9ydGFudCBlbm91Z2ggdG8KLSAgICAgY29tcGxpY2F0ZSB0aGluZ3Mgb3ZlciBpdCwgc28gd2Ugc3VidHJhY3QgYW4gZXh0cmEgMiAob3IgKyAyIGluIC12ZQotICAgICBjYXNlKS4gICovCi0gIHs1MTEgLSAyIC0gMiwgLTUxMiAtIDIgKyAyLCAwLCAyIH0sCi0gIC8qIDMyIGJpdCBpbnNuLCAyNCBiaXQgZGlzcCAtPiAyNiBiaXQgcmFuZ2UuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCAyLCAwIH0sCi0gIC8qIFNhbWUgdGhpbmcsIGJ1dCB3aXRoIGxlYWRpbmcgbm9wIGZvciBhbGlnbm1lbnQuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCA0LCAwIH0KLX07Ci0KLWxvbmcKLWZyMzBfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICogZnJhZ1A7Ci0gICAgIGxvbmcgICAgc3RyZXRjaDsKLXsKLSAgLyogQWRkcmVzcyBvZiBicmFuY2ggaW5zbi4gICovCi0gIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0gIGxvbmcgZ3Jvd3RoID0gMDsKLQotICAvKiBLZWVwIDMyIGJpdCBpbnNucyBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgPT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7Ci0JICBncm93dGggPSAtMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZ3Jvd3RoID0gcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotCi0gICAgICAvKiBMb25nIGp1bXAgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5PyAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyICYmIChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggKz0gMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBncm93dGg7Ci19Ci0KLS8qIFJldHVybiBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBsZW5ndGggYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8KLSAgIGhvbGQgYSBicmFuY2ggdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uLgotICAgQWxzbyB1cGRhdGVzIGZyX3R5cGUvZnJfc3VidHlwZSBhcyBuZWNlc3NhcnkuCi0KLSAgIENhbGxlZCBqdXN0IGJlZm9yZSBkb2luZyByZWxheGF0aW9uLgotICAgQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCi0gICBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gICBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICAgQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICAgMCB2YWx1ZS4gICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBzZWdUICAgIHNlZ21lbnQ7Ci17Ci0gIGludCAgICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBUaGUgb25seSB0aGluZyB3ZSBoYXZlIHRvIGhhbmRsZSBoZXJlIGFyZSBzeW1ib2xzIG91dHNpZGUgb2YgdGhlCi0gICAgIGN1cnJlbnQgc2VnbWVudC4gIFRoZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGluCi0gICAgIHdoaWNoIGNhc2UgbGlua2VyIHNjcmlwdHMgbWF5IHBsYWNlIHRoZW0gYW55d2hlcmUuCi0gICAgIEhvd2V2ZXIsIHdlIGNhbid0IGZpbmlzaCB0aGUgZnJhZ21lbnQgaGVyZSBhbmQgZW1pdCB0aGUgcmVsb2MgYXMgaW5zbgotICAgICBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG1heSBtb3ZlIHRoZSBpbnNuIGFib3V0LiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQuCi0JIENoYW5nZSB0aGUgcmVsYXhhdGlvbiBzdWJ0eXBlIHRvIHRoZSBtYXggYWxsb3dhYmxlIGFuZCBsZWF2ZQotCSBhbGwgZnVydGhlciBoYW5kbGluZyB0byBtZF9jb252ZXJ0X2ZyYWcuICAqLwotICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCi0jaWYgMCAvKiBDYW4ndCB1c2UgdGhpcywgYnV0IGxlYXZlIGluIGZvciBpbGx1c3RyYXRpb24uICAqLyAgICAgCi0gICAgICAvKiBDaGFuZ2UgMTYgYml0IGluc24gdG8gMzIgYml0IGluc24uICAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSB8PSAweDgwOwotCi0gICAgICAvKiBJbmNyZWFzZSBrbm93biAoZml4ZWQpIHNpemUgb2YgZnJhZ21lbnQuICAqLwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCi0gICAgICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSAvKiBwY3JlbCAqLywKLQkgICAgICAgLyogRklYTUU6IENhbid0IHVzZSBhIHJlYWwgQkZEIHJlbG9jIGhlcmUuCi0JCSAgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyBjYW4ndCBoYW5kbGUgaXQuICAqLwotCSAgICAgICBCRkRfUkVMT0NfRlIzMF8yNl9QQ1JFTCk7Ci0KLSAgICAgIC8qIE1hcmsgdGhpcyBmcmFnbWVudCBhcyBmaW5pc2hlZC4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLSNlbHNlCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLQlpbnQgICAgICAgICAgICAgICBpOwotCi0JLyogVXBkYXRlIHRoZSByZWNvcmRlZCBpbnNuLgotCSAgIEZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgdG8gbG9vayB2ZXJ5IGZhci4KLQkgICBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gcmVjb3JkIGluIHRoZSBpbnN0cnVjdGlvbiB0aGUgbmV4dCBoaWdoZXIKLQkgICByZWxheGFibGUgaW5zbiB0byB1c2UuICAqLwotCWZvciAoaSA9IDAsIGluc24gPSBmcmFnUC0+ZnJfY2dlbi5pbnNuOyBpIDwgNDsgaSsrLCBpbnNuKyspCi0JICB7Ci0JICAgIGlmICgoc3RyY21wIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pLAotCQkJIENHRU5fSU5TTl9NTkVNT05JQyAoZnJhZ1AtPmZyX2NnZW4uaW5zbikpCi0JCSA9PSAwKQotCQkmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSkKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoaSA9PSA0KQotCSAgYWJvcnQgKCk7Ci0KLQlmcmFnUC0+ZnJfY2dlbi5pbnNuID0gaW5zbjsKLQlyZXR1cm4gMjsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19IAotCi0vKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCi0gICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplLgotCi0gICBDYWxsZWQgYWZ0ZXIgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZC4KLSAgIGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICAgZnJhZ1AtPmZyX3N1YnR5cGUgaXMgdGhlIHN1YnR5cGUgb2Ygd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKiAgIGFiZmQ7Ci0gIHNlZ1QgICAgc2VjOwotICBmcmFnUyAqIGZyYWdQOwotewotI2lmIDAKLSAgY2hhciAqIG9wY29kZTsKLSAgY2hhciAqIGRpc3BsYWNlbWVudDsKLSAgaW50ICAgIHRhcmdldF9hZGRyZXNzOwotICBpbnQgICAgb3Bjb2RlX2FkZHJlc3M7Ci0gIGludCAgICBleHRlbnNpb247Ci0gIGludCAgICBhZGRlbmQ7Ci0KLSAgb3Bjb2RlID0gZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICAqLwotICBvcGNvZGVfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSAxIDoKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMiA6Ci0gICAgICBvcGNvZGVbMF0gfD0gMHg4MDsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMyA6Ci0gICAgICBvcGNvZGVbMl0gPSBvcGNvZGVbMF0gfCAweDgwOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGUsIFBBUl9OT1BfSU5TTiwgMik7Ci0gICAgICBvcGNvZGVfYWRkcmVzcyArPSAyOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzNdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKLSAgICB7Ci0gICAgICAvKiBzeW1ib2wgbXVzdCBiZSByZXNvbHZlZCBieSBsaW5rZXIgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfb2Zmc2V0ICYgMykKLQlhc193YXJuIChfKCJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIikpOwotICAgICAgYWRkZW5kID0gZnJhZ1AtPmZyX29mZnNldCA+PiAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkZHJlc3Mgd2Ugd2FudCB0byByZWFjaCBpbiBmaWxlIHNwYWNlLiAgKi8KLSAgICAgIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgICAgIHRhcmdldF9hZGRyZXNzICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0gICAgICBhZGRlbmQgPSAodGFyZ2V0X2FkZHJlc3MgLSAob3Bjb2RlX2FkZHJlc3MgJiAtNCkpID4+IDI7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIHN5bWJvbHMgdGhhdCBtdXN0IGJlIHJlc29sdmVkIGJ5IHRoZSBsaW5rZXIuCi0gICAgIE90aGVyd2lzZSBvdXRwdXQgdGhlIGNvbXBsZXRlZCBpbnNuLiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQotICAgIHsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMSk7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9jZ2VuLmluc24gIT0gMCk7Ci0gICAgICBnYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWdQLAotCQkJICAgICAvKiBPZmZzZXQgb2YgYnJhbmNoIGluc24gaW4gZnJhZy4gICovCi0JCQkgICAgIGZyYWdQLT5mcl9maXggKyBleHRlbnNpb24gLSA0LAotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5pbnNuLAotCQkJICAgICA0IC8qbGVuZ3RoKi8sCi0JCQkgICAgIC8qIEZJWE1FOiBxdWljayBoYWNrICovCi0jaWYgMAotCQkJICAgICBDR0VOX09QRVJBTkRfRU5UUlkgKGZyYWdQLT5mcl9jZ2VuLm9waW5kZXgpLAotI2Vsc2UKLQkJCSAgICAgQ0dFTl9PUEVSQU5EX0VOVFJZIChGUjMwX09QRVJBTkRfRElTUDI0KSwKLSNlbmRpZgotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5vcGluZm8sCi0JCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgIH0KLQotI2RlZmluZSBTSVpFX0ZST01fUkVMQVhfU1RBVEUobikgKChuKSA9PSAxID8gMSA6IDMpCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChkaXNwbGFjZW1lbnQsICh2YWx1ZVQpIGFkZGVuZCwKLQkJICAgICAgU0laRV9GUk9NX1JFTEFYX1NUQVRFIChmcmFnUC0+ZnJfc3VidHlwZSkpOwotCi0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotI2VuZGlmCi19Ci0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWMpCi0gICAgIGZpeFMgKiBmaXhQOwotICAgICBzZWdUICAgc2VjOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWMpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIChvciBpcyBkZWZpbmVkIGJ1dCBub3QgaW4gdGhpcyBzZWN0aW9uKS4KLQkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUpICYgfjE7Ci19Ci0KLS8qIFJldHVybiB0aGUgYmZkIHJlbG9jIHR5cGUgZm9yIE9QRVJBTkQgb2YgSU5TTiBhdCBmaXh1cCBGSVhQLgotICAgUmV0dXJucyBCRkRfUkVMT0NfTk9ORSBpZiBubyByZWxvYyB0eXBlIGNhbiBiZSBmb3VuZC4KLSAgICpGSVhQIG1heSBiZSBtb2RpZmllZCBpZiBkZXNpcmVkLiAgKi8KLQotYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1tZF9jZ2VuX2xvb2t1cF9yZWxvYyAoaW5zbiwgb3BlcmFuZCwgZml4UCkKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogICAgaW5zbjsKLSAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKLSAgICAgZml4UyAqICAgICAgICAgICAgICAgZml4UDsKLXsKLSAgc3dpdGNoIChvcGVyYW5kLT50eXBlKQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDk6ICBmaXhQLT5meF9wY3JlbCA9IDE7IHJldHVybiBCRkRfUkVMT0NfRlIzMF85X1BDUkVMOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTI6IGZpeFAtPmZ4X3BjcmVsID0gMTsgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMDogIHJldHVybiBCRkRfUkVMT0NfRlIzMF8xMF9JTl84OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5OiAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF85X0lOXzg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDg6ICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzhfSU5fODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDY6ICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfNl9JTl80OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4OiAgICAgIHJldHVybiBCRkRfUkVMT0NfODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzI6ICAgICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfNDg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwOiAgICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzIwOwotICAgIGRlZmF1bHQgOiAvKiBhdm9pZCAtV2FsbCB3YXJuaW5nICovCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotfQotCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi0KLWludAotZnIzMF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKiBmaXg7Ci17Ci0gIGlmICggICBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50ICAgIG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgICB0eXBlOwotICAgICBjaGFyICogbGl0UDsKLSAgICAgaW50ICogIHNpemVQOwotewotICBpbnQgICAgICAgICAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgICB3b3JkcyBbTUFYX0xJVFRMRU5VTVNdOwotICBjaGFyICogICAgICAgICAgIHQ7Ci0gIGNoYXIgKiAgICAgICAgICAgYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAvKiBGSVhNRTogU29tZSB0YXJnZXRzIGFsbG93IG90aGVyIGZvcm1hdCBjaGFycyBmb3IgYmlnZ2VyIHNpemVzIGhlcmUuICAqLwotCi0gICAgZGVmYXVsdDoKLSAgICAgICogc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKiBzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdvcmtlciBmdW5jdGlvbiBmb3IgZnIzMF9pc19jb2xvbl9pbnNuKCkuICAqLwotc3RhdGljIGNoYXIKLXJlc3RvcmVfY29sb24gKGFkdmFuY2VfaV9sX3BfYnkpCi0gICAgIGludCBhZHZhbmNlX2lfbF9wX2J5OwotewotICBjaGFyIGM7Ci0gIAotICAvKiBSZXN0b3JlIHRoZSBjb2xvbiwgYW5kIGFkdmFuY2UgaW5wdXRfbGluZV9wb2ludGVyIHRvCi0gICAgIHRoZSBlbmQgb2YgdGhlIG5ldyBzeW1ib2wuICAqLwotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9ICc6JzsKLSAgaW5wdXRfbGluZV9wb2ludGVyICs9IGFkdmFuY2VfaV9sX3BfYnk7Ci0gIGMgPSAqIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICAKLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIERldGVybWluZXMgaWYgdGhlIHN5bWJvbCBzdGFydGluZyBhdCBTVEFSVCBhbmQgZW5kaW5nIGluCi0gICBhIGNvbG9uIHRoYXQgd2FzIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IElOUFVUX0xJTkVfUE9JTlRFUgotICAgKGJ1dCB3aGljaCBoYXMgbm93IGJlZW4gcmVwbGFjZWQgYnUgYSBOVUwpIGlzIGluIGZhY3QgYW4KLSAgIExESTo4LCBMREk6MjAsIExESTozMiwgQ0FMTDpELiBKTVA6RCwgUkVUOkQgb3IgQmNjOkQgaW5zdHJ1Y3Rpb24uCi0gICBJZiBpdCBpcywgdGhlbiBpdCByZXN0b3JlcyB0aGUgY29sb24sIGFkdmFuY2VzIElOUFVUX0xJTkVfUE9JTlRFUgotICAgdG8gdGhlIHJlYWwgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi9zeW1ib2wsIGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIKLSAgIHRoYXQgcmVhbGx5IHRlcm1pbmF0ZWQgdGhlIHN5bWJvbC4gIE90aGVyd2lzZSBpdCByZXR1cm5zIDAuICAqLwotY2hhcgotZnIzMF9pc19jb2xvbl9pbnNuIChzdGFydCkKLSAgICAgY2hhciAqICBzdGFydDsKLXsKLSAgY2hhciAqIGlfbF9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc3ltYm9sIHBhcnNlZCBzbyBmYXIgaXMgJ2xkaScgICovCi0gIGlmICggICAoc3RhcnRbMF0gIT0gJ2wnICYmIHN0YXJ0WzBdICE9ICdMJykKLSAgICAgIHx8IChzdGFydFsxXSAhPSAnZCcgJiYgc3RhcnRbMV0gIT0gJ0QnKQotICAgICAgfHwgKHN0YXJ0WzJdICE9ICdpJyAmJiBzdGFydFsyXSAhPSAnSScpCi0gICAgICB8fCBzdGFydFszXSAhPSAwKQotICAgIHsKLSAgICAgIC8qIE5vcGUgLSBjaGVjayB0byBzZWUgYSAnZCcgZm9sbG93cyB0aGUgY29sb24uICAqLwotICAgICAgaWYgKCAgIChpX2xfcFsxXSA9PSAnZCcgfHwgaV9sX3BbMV0gPT0gJ0QnKQotCSAgJiYgKGlfbF9wWzJdID09ICcgJyB8fCBpX2xfcFsyXSA9PSAnXHQnIHx8IGlfbF9wWzJdID09ICdcbicpKQotCXsKLQkgIC8qIFl1cCAtIGl0IG1pZ2h0IGJlIGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb24uICAqLwotCSAgaW50ICAgICAgICAgICBpOwotCSAgc3RhdGljIGNoYXIgKiBkZWxheV9pbnNucyBbXSA9Ci0JICB7Ci0JICAgICJjYWxsIiwgImptcCIsICJyZXQiLCAiYnJhIiwgImJubyIsCi0JICAgICJiZXEiLCAgImJuZSIsICJiYyIsICAiYm5jIiwgImJuIiwKLQkgICAgImJwIiwgICAiYnYiLCAgImJudiIsICJibHQiLCAiYmdlIiwKLQkgICAgImJsZSIsICAiYmd0IiwgImJscyIsICJiaGkiCi0JICB9OwotCi0JICBmb3IgKGkgPSBzaXplb2YgKGRlbGF5X2luc25zKSAvIHNpemVvZiAoZGVsYXlfaW5zbnNbMF0pOyBpLS07KQotCSAgICB7Ci0JICAgICAgY2hhciAqIGluc24gPSBkZWxheV9pbnNuc1tpXTsKLQkgICAgICBpbnQgICAgbGVuICA9IHN0cmxlbiAoaW5zbik7Ci0KLQkgICAgICBpZiAoc3RhcnQgW2xlbl0gIT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgCi0JICAgICAgd2hpbGUgKGxlbiAtLSkKLQkJaWYgKHRvbG93ZXIgKHN0YXJ0IFtsZW5dKSAhPSBpbnNuIFtsZW5dKQotCQkgIGJyZWFrOwotCSAgICAgIAotCSAgICAgIGlmIChsZW4gPT0gLTEpCi0JCXJldHVybiByZXN0b3JlX2NvbG9uICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogTm9wZSAtIGl0IGlzIGEgbm9ybWFsIGxhYmVsLiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnOCcgKi8KLSAgaWYgKGlfbF9wWzFdID09ICc4JyAmJiAoaV9sX3BbMl0gPT0gJyAnIHx8IGlfbF9wWzJdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgyKTsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnMjAnICovCi0gIGVsc2UgaWYgKGlfbF9wWzFdID09ICcyJyAmJiBpX2xfcFsyXSA9PScwJyAmJiAoaV9sX3BbM10gPT0gJyAnIHx8IGlfbF9wWzNdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgzKTsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnMzInICovCi0gIGVsc2UgaWYgKGlfbF9wWzFdID09ICczJyAmJiBpX2xfcFsyXSA9PScyJyAmJiAoaV9sX3BbM10gPT0gJyAnIHx8IGlfbF9wWzNdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgzKTsKLQotICByZXR1cm4gMDsKLX0KLQotYm9vbGVhbgotZnIzMF9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKiBmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0jaWYgMCAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWZyMzAuaCBiL2dhcy9jb25maWcvdGMtZnIzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjcyZDhiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZnIzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogdGMtZnIzMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1mcjMwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19GUjMwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogbGVhZGluZyBzcGFjZSBzbyB3aWxsIGNvbXBpbGUgd2l0aCBjYyAqLwotICNlcnJvciBGUjMwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkZSMzAgR0FTICIKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfZnIzMAotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWZyMzAiCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLWxvbmcgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCkpOwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9hcHBseV9maXgzIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgZnIzMF9maXhfYWRqdXN0YWJsZSAoZml4UCkKLWV4dGVybiBib29sZWFuIGZyMzBfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gZW1pdCB2YXJpb3VzIHJlbG9jcyB3ZSBvdGhlcndpc2Ugd291bGRuJ3QuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgZnIzMF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IGZyMzBfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSB0Y19nZW5fcmVsb2MgZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jCi0KLS8qIENhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKCksIG5vdCBtZF9wY3JlbF9mcm9tKCkuICAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLWV4dGVybiBsb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLQotLyogRm9yIDggdnMgMTYgdnMgMzIgYml0IGJyYW5jaCBzZWxlY3Rpb24uICAqLwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLQotLyogV2UgbmVlZCBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgVENfU1RBUlRfTEFCRUwgbWFjcm8gc28gdGhhdCB3ZQotICAgYWxsb3cgdGhlIExESTo4LCBMREk6MjAsIExESTozMiBhbmQgZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgdG8gYmUKLSAgIHBhcnNlZCBhcyBzdWNoLiAgTm90ZSAtIGluIGEgSE9SUklCTEUgSEFDSywgd2UgbWFrZSB1c2Ugb2YgdGhlCi0gICBrbm93bGVkZ2UgdGhhdCB0aGlzIG1hcmNvIGlzIG9ubHkgZXZlciBldmFsdWF0ZWQgaW4gb25lIHBsYWNlCi0gICAocmVhZF9hX3NvdXJjZV9maWxlIGluIHJlYWQuYykgd2hlcmUgd2UgY2FuIGFjY2VzcyB0aGUgbG9jYWwKLSAgIHZhcmlhYmxlICdzJyAtIHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIHRoYXQgd2FzIHRlcm1pbmF0ZWQgYnkKLSAgICdjaGFyYWN0ZXInLiAgQWxzbyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZgotICAgdGhlIGxvY2FsIHZhcmlhYmxlICdjJyB3aGljaCBpcyBwYXNzZWQgdG8gdGhpcyBtYWNybyBhcyAnY2hhcmFjdGVyJy4gICovCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoYXJhY3RlciwgaV9sX3ApCQkJXAotICAoKGNoYXJhY3RlcikgIT0gJzonID8gMCA6IChjaGFyYWN0ZXIgPSBmcjMwX2lzX2NvbG9uX2luc24gKHMpKSA/IDAgOiAoKGNoYXJhY3RlciA9ICc6JyksIDEpKQotZXh0ZXJuIGNoYXIgZnIzMF9pc19jb2xvbl9pbnNuIFBBUkFNUyAoKGNoYXIgKikpOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmMgYi9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuaCBiL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmRmMDIwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWdlbmVyaWMuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyB0Yy1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yIHRhcmdldCBjcHUKLSAqIHNwZWNpZmljIGhlYWRlciBmaWxlcy4gIEl0IGlzIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSBjb21waWxlLiAgSXQgaXMgYWxzbwotICogbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIGdyb3cgaW50byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBib3RoIGEKLSAqIHRlbXBsYXRlIGZvciBwb3J0aW5nLCBhbmQgYSBzdHViIGZvciB0ZXN0aW5nLiAgeG94b3JpY2guCi0gKi8KLQotI2RlZmluZSBUQ19HRU5FUklDIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy1nZW5lcmljLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDgzMDAuYyBiL2dhcy9jb25maWcvdGMtaDgzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1YWRhMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWg4MzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk1ICswLDAgQEAKLS8qIHRjLWg4MzAwLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgSDgvMzAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0gIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgc2FjQGN5Z251cy5jb20KLSAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2RlZmluZSBoOF9vcGNvZGVzIG9wcwotI2luY2x1ZGUgIm9wY29kZS9oODMwMC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0KLXsnOycsIDB9OwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0KLXswfTsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotdm9pZCBjb25zICgpOwotCi1pbnQgSG1vZGU7Ci1pbnQgU21vZGU7Ci0jZGVmaW5lIFBTSVpFIChIbW9kZSA/IExfMzIgOiBMXzE2KQotI2RlZmluZSBETU9ERSAoTF8xNikKLSNkZWZpbmUgRFNZTU1PREUgKEhtb2RlID8gTF8yNCA6IExfMTYpCi1pbnQgYnNpemUgPSBMXzg7CQkvKiBkZWZhdWx0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKi8KLQotCi12b2lkCi1oODMwMGhtb2RlICgpCi17Ci0gIEhtb2RlID0gMTsKLSAgU21vZGUgPSAwOwotfQotCi12b2lkCi1oODMwMHNtb2RlICgpCi17Ci0gIFNtb2RlID0gMTsKLSAgSG1vZGUgPSAxOwotfQotdm9pZAotc2JyYW5jaCAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGJzaXplID0gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgcGludCAoKQotewotICBjb25zIChIbW9kZSA/IDQgOiAyKTsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLQotICB7Img4MzAwaCIsIGg4MzAwaG1vZGUsIDB9LAotICB7Img4MzAwcyIsIGg4MzAwc21vZGUsIDB9LAotICB7InNicmFuY2giLCBzYnJhbmNoLCBMXzh9LAotICB7ImxicmFuY2giLCBzYnJhbmNoLCBMXzE2fSwKLQotICB7ImludCIsIHBpbnQsIDB9LAotICB7ImRhdGEuYiIsIGNvbnMsIDF9LAotICB7ImRhdGEudyIsIGNvbnMsIDJ9LAotICB7ImRhdGEubCIsIGNvbnMsIDR9LAotICB7ImZvcm0iLCBsaXN0aW5nX3BzaXplLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKgotICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQKLSAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gICovCi0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICBjaGFyIHByZXZfYnVmZmVyWzEwMF07Ci0gIGludCBpZHggPSAwOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLSAgcHJldl9idWZmZXJbMF0gPSAwOwotCi0gIGZvciAob3Bjb2RlID0gaDhfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICAvKiBTdHJpcCBvZmYgYW55IC4gcGFydCB3aGVuIGluc2VydGluZyB0aGUgb3Bjb2RlIGFuZCBvbmx5IGVudGVyCi0gICAgICAgICB1bmlxdWUgY29kZXMgaW50byB0aGUgaGFzaCB0YWJsZQotICAgICAgICAgKi8KLSAgICAgIGNoYXIgKnNyYyA9IG9wY29kZS0+bmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4gKHNyYyk7Ci0gICAgICBjaGFyICpkc3QgPSBtYWxsb2MgKGxlbiArIDEpOwotICAgICAgY2hhciAqYnVmZmVyID0gZHN0OwotCi0gICAgICBvcGNvZGUtPnNpemUgPSAwOwotICAgICAgd2hpbGUgKCpzcmMpCi0JewotCSAgaWYgKCpzcmMgPT0gJy4nKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgb3Bjb2RlLT5zaXplID0gKnNyYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKmRzdCsrID0gKnNyYysrOwotCX0KLSAgICAgICpkc3QrKyA9IDA7Ci0gICAgICBpZiAoc3RyY21wIChidWZmZXIsIHByZXZfYnVmZmVyKSkKLQl7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgYnVmZmVyLCAoY2hhciAqKSBvcGNvZGUpOwotCSAgc3RyY3B5IChwcmV2X2J1ZmZlciwgYnVmZmVyKTsKLQkgIGlkeCsrOwotCX0KLSAgICAgIG9wY29kZS0+aWR4ID0gaWR4OwotCi0KLSAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyAqLwotICAgICAgb3Bjb2RlLT5ub3BlcmFuZHMgPSAwOwotICAgICAgd2hpbGUgKG9wY29kZS0+YXJncy5uaWJbb3Bjb2RlLT5ub3BlcmFuZHNdICE9IEUpCi0Jb3Bjb2RlLT5ub3BlcmFuZHMrKzsKLSAgICAgIC8qIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgb3Bjb2RlIGluIGJ5dGVzICovCi0gICAgICBvcGNvZGUtPmxlbmd0aCA9IDA7Ci0gICAgICB3aGlsZSAob3Bjb2RlLT5kYXRhLm5pYltvcGNvZGUtPmxlbmd0aCAqIDJdICE9IEUpCi0Jb3Bjb2RlLT5sZW5ndGgrKzsKLSAgICB9Ci0KLSAgbGlua3JlbGF4ID0gMTsKLX0KLQotCi1zdHJ1Y3QgaDhfZXhwCi17Ci0gIGNoYXIgKmVfYmVnOwotICBjaGFyICplX2VuZDsKLSAgZXhwcmVzc2lvblMgZV9leHA7Ci19OwotaW50IGRpc3ByZWc7Ci1pbnQgb3BzaXplOwkJCS8qIFNldCB3aGVuIGEgcmVnaXN0ZXIgc2l6ZSBpcyBzZWVuICovCi0KLQotc3RydWN0IGg4X29wCi17Ci0gIG9wX3R5cGUgbW9kZTsKLSAgdW5zaWduZWQgcmVnOwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi0vKgotICBwYXJzZSBvcGVyYW5kcwotICBXUkVHIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHI3LGZwLHNwCi0gIHIwbCxyMGgsLi5yN2wscjdoCi0gIEBXUkVHCi0gIEBXUkVHKwotICBALVdSRUcKLSAgI2NvbnN0Ci0gIGNjcgotKi8KLQotLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLwotaW50Ci1wYXJzZV9yZWcgKHNyYywgbW9kZSwgcmVnLCBkaXJlY3Rpb24pCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgb3BfdHlwZSAqbW9kZTsKLSAgICAgdW5zaWduZWQgaW50ICpyZWc7Ci0gICAgIGludCBkaXJlY3Rpb247Ci0KLXsKLSAgY2hhciAqZW5kOwotICBpbnQgbGVuOwotCi0gIC8qIENyaWJiZWQgZnJvbSBnZXRfc3ltYm9sX2VuZCgpLiAgKi8KLSAgaWYgKCFpc19uYW1lX2JlZ2lubmVyICgqc3JjKSB8fCAqc3JjID09ICdcMDAxJykKLSAgICByZXR1cm4gMDsKLSAgZW5kID0gc3JjKzE7Ci0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCplbmQpIHx8ICplbmQgPT0gJ1wwMDEnKQotICAgIGVuZCsrOwotICBsZW4gPSBlbmQgLSBzcmM7Ci0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAncycgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFBTSVpFIHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IDc7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnYycgJiYgc3JjWzFdID09ICdjJyAmJiBzcmNbMl0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gQ0NSOwotICAgICAgKnJlZyA9IDA7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICd4JyAmJiBzcmNbMl0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gRVhSOwotICAgICAgKnJlZyA9IDA7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFBTSVpFIHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IDY7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICdyJwotICAgICAgJiYgc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzcnKQotICAgIHsKLSAgICAgICptb2RlID0gTF8zMiB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSBzcmNbMl0gLSAnMCc7Ci0gICAgICBpZiAoIUhtb2RlKQotCWFzX3dhcm4gKF8oIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIpKTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnNycpCi0gICAgewotICAgICAgKm1vZGUgPSBMXzE2IHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IHNyY1sxXSAtICcwJyArIDg7Ci0gICAgICBpZiAoIUhtb2RlKQotCWFzX3dhcm4gKF8oIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIpKTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnNycpCi0JewotCSAgaWYgKGxlbiA9PSAzICYmIHNyY1syXSA9PSAnbCcpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IExfOCB8IFJFRyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcmVnID0gKHNyY1sxXSAtICcwJykgKyA4OwotCSAgICAgIHJldHVybiBsZW47Ci0JICAgIH0KLQkgIGlmIChsZW4gPT0gMyAmJiBzcmNbMl0gPT0gJ2gnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBMXzggfCBSRUcgfCBkaXJlY3Rpb247Ci0JICAgICAgKnJlZyA9IChzcmNbMV0gLSAnMCcpOwotCSAgICAgIHJldHVybiBsZW47Ci0JICAgIH0KLQkgIGlmIChsZW4gPT0gMikKLQkgICAgewotCSAgICAgICptb2RlID0gTF8xNiB8IFJFRyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcmVnID0gKHNyY1sxXSAtICcwJyk7Ci0JICAgICAgcmV0dXJuIGxlbjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotcGFyc2VfZXhwIChzLCBvcCkKLSAgICAgY2hhciAqczsKLSAgICAgZXhwcmVzc2lvblMgKiBvcDsKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqbmV3OwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKG9wKTsKLSAgaWYgKG9wLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXNraXBfY29sb250aGluZyAocHRyLCBleHAsIG1vZGUpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50ICptb2RlOwotewotICBpZiAoKnB0ciA9PSAnOicpCi0gICAgewotICAgICAgcHRyKys7Ci0gICAgICAqbW9kZSAmPSB+U0laRTsKLSAgICAgIGlmICgqcHRyID09ICc4JykKLQl7Ci0JICBwdHIrKzsKLQkgIC8qIGZmIGZpbGwgYW55IDggYml0IHF1YW50aXR5ICovCi0JIC8qIGV4cC0+WF9hZGRfbnVtYmVyIC09IDB4MTAwOyovCi0JICAqbW9kZSB8PSBMXzg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgqcHRyID09ICcyJykKLQkgICAgewotCSAgICAgICptb2RlIHw9IExfMjQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwdHIgPT0gJzMnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgfD0gTF8zMjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnB0ciA9PSAnMScpCi0JICAgIHsKLQkgICAgICAqbW9kZSB8PSBMXzE2OwotCSAgICB9Ci0JICB3aGlsZSAoaXNkaWdpdCAoKnB0cikpCi0JICAgIHB0cisrOwotCX0KLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6Ci0KLSAgIFJuCQkJUmVnaXN0ZXIgZGlyZWN0Ci0gICBAUm4JCQlSZWdpc3RlciBpbmRpcmVjdAotICAgQChleHBbOjE2XSwgUm4pCVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0gICBAUm4rCi0gICBALVJuCi0gICBAYWE6OAkJCWFic29sdXRlIDggYml0Ci0gICBAYWE6MTYJCQlhYnNvbHV0ZSAxNiBiaXQKLSAgIEBhYQkJCWFic29sdXRlIDE2IGJpdAotCi0gICAjeHhbOnNpemVdCQlpbW1lZGlhdGUgZGF0YQotICAgQChleHA6WzhdLCBwYykJCXBjIHJlbAotICAgQEBhYVs6OF0JCW1lbW9yeSBpbmRpcmVjdAotCi0gICAqLwotCi1jaGFyICoKLWNvbG9ubW9kMjQgKG9wLCBzcmMpCi0gICAgIHN0cnVjdCBoOF9vcCAqb3A7Ci0gICAgIGNoYXIgKnNyYzsKLQotewotICBpbnQgbW9kZSA9IDA7Ci0gIHNyYyA9IHNraXBfY29sb250aGluZyAoc3JjLCAmb3AtPmV4cCwgJm1vZGUpOwotCi0gIGlmICghbW9kZSkKLSAgICB7Ci0gICAgICAvKiBDaG9vc2UgYSBkZWZhdWx0IG1vZGUgKi8KLSAgICAgIGlmIChvcC0+ZXhwLlhfYWRkX251bWJlciA8IC0zMjc2OAotCSAgfHwgb3AtPmV4cC5YX2FkZF9udW1iZXIgPiAzMjc2NykKLQl7Ci0JICBpZiAoSG1vZGUpCi0JICAgIG1vZGUgPSBMXzI0OwotCSAgZWxzZQotCSAgICBtb2RlID0gTF8xNjsKLQl9Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhwLlhfYWRkX3N5bWJvbAotCSAgICAgICB8fCBvcC0+ZXhwLlhfb3Bfc3ltYm9sKQotCW1vZGUgPSBEU1lNTU9ERTsKLSAgICAgIGVsc2UKLQltb2RlID0gRE1PREU7Ci0gICAgfQotICBvcC0+bW9kZSB8PSBtb2RlOwotICByZXR1cm4gc3JjOwotCi19Ci0KLQotc3RhdGljIHZvaWQKLWdldF9vcGVyYW5kIChwdHIsIG9wLCBkc3QsIGRpcmVjdGlvbikKLSAgICAgY2hhciAqKnB0cjsKLSAgICAgc3RydWN0IGg4X29wICpvcDsKLSAgICAgdW5zaWduZWQgaW50IGRzdDsKLSAgICAgaW50IGRpcmVjdGlvbjsKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgb3BfdHlwZSBtb2RlOwotICB1bnNpZ25lZCBpbnQgbnVtOwotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIG9wLT5tb2RlID0gRTsKLQotICAvKiBHcm9zcy4gIEdyb3NzLiAgbGRtIGFuZCBzdG0gaGF2ZSBhIGZvcm1hdCBub3QgZWFzaWx5IGhhbmRsZWQKLSAgICAgYnkgZ2V0X29wZXJhbmQuICBXZSBkZWFsIHdpdGggaXQgZXhwbGljaXRseSBoZXJlLiAgKi8KLSAgaWYgKHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICdyJyAmJiBpc2RpZ2l0KHNyY1syXSkKLSAgICAgICYmIHNyY1szXSA9PSAnLScgJiYgc3JjWzRdID09ICdlJyAmJiBzcmNbNV0gPT0gJ3InICYmIGlzZGlnaXQoc3JjWzZdKSkKLSAgICB7Ci0gICAgICBpbnQgbG93LCBoaWdoOwotCi0gICAgICBsb3cgPSBzcmNbMl0gLSAnMCc7Ci0gICAgICBoaWdoID0gc3JjWzZdIC0gJzAnOwotCi0gICAgICBpZiAoaGlnaCA8IGxvdykKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIikpOwotCi0gICAgICBpZiAobG93ICUgMikKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIikpOwotCi0gICAgICBpZiAoaGlnaCAtIGxvdyA+IDMpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIpKTsKLQotICAgICAgaWYgKGhpZ2ggLSBsb3cgIT0gMQotCSAgJiYgbG93ICUgNCkKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIikpOwotCi0gICAgICAvKiBFdmVuIHNpY2tlci4gIFdlIGVuY29kZSB0d28gcmVnaXN0ZXJzIGludG8gb3AtPnJlZy4gIE9uZQotCSBmb3IgdGhlIGxvdyByZWdpc3RlciB0byBzYXZlLCB0aGUgb3RoZXIgZm9yIHRoZSBoaWdoCi0JIHJlZ2lzdGVyIHRvIHNhdmU7ICB3ZSBhbHNvIHNldCB0aGUgaGlnaCBiaXQgaW4gb3AtPnJlZwotCSBzbyB3ZSBrbm93IHRoaXMgaXMgInZlcnkgc3BlY2lhbCIuICAqLwotICAgICAgb3AtPnJlZyA9IDB4ODAwMDAwMDAgfCAoaGlnaCA8PCA4KSB8IGxvdzsKLSAgICAgIG9wLT5tb2RlID0gUkVHOwotICAgICAgKnB0ciA9IHNyYyArIDc7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmb3AtPm1vZGUsICZvcC0+cmVnLCBkaXJlY3Rpb24pOwotICBpZiAobGVuKQotICAgIHsKLSAgICAgICpwdHIgPSBzcmMgKyBsZW47Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3JjID09ICdAJykKLSAgICB7Ci0gICAgICBzcmMrKzsKLSAgICAgIGlmICgqc3JjID09ICdAJykKLQl7Ci0JICBzcmMrKzsKLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7Ci0KLQkgIHNyYyA9IHNraXBfY29sb250aGluZyAoc3JjLCAmb3AtPmV4cCwgJm9wLT5tb2RlKTsKLQotCSAgKnB0ciA9IHNyYzsKLQotCSAgb3AtPm1vZGUgPSBNRU1JTkQ7Ci0JICByZXR1cm47Ci0KLQl9Ci0KLQotICAgICAgaWYgKCpzcmMgPT0gJy0nKQotCXsKLQkgIHNyYysrOwotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmbnVtLCBkaXJlY3Rpb24pOwotCSAgaWYgKGxlbiA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogT29wcywgbm90IGEgcmVnIGFmdGVyIGFsbCwgbXVzdCBiZSBvcmRpbmFyeSBleHAgKi8KLQkgICAgICBzcmMtLTsKLQkgICAgICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCi0JICAgICAgb3AtPm1vZGUgPSBBQlMgfCBQU0laRSB8IGRpcmVjdGlvbjsKLQkgICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChwYXJzZV9leHAgKHNyYywgJm9wLT5leHApLAotCQkJCSAgICAgICZvcC0+ZXhwLCAmb3AtPm1vZGUpOwotCi0JICAgICAgcmV0dXJuOwotCi0KLQkgICAgfQotCi0KLQkgIGlmICgobW9kZSAmIFNJWkUpICE9IFBTSVpFKQotCSAgICBhc19iYWQgKF8oIldyb25nIHNpemUgcG9pbnRlciByZWdpc3RlciBmb3IgYXJjaGl0ZWN0dXJlLiIpKTsKLQkgIG9wLT5tb2RlID0gUkRERUM7Ci0JICBvcC0+cmVnID0gbnVtOwotCSAgKnB0ciA9IHNyYyArIGxlbjsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoKnNyYyA9PSAnKCcpCi0JewotCSAgLyogRGlzcCAqLwotCSAgc3JjKys7Ci0KLQkgIC8qIFN0YXJ0IG9mZiBhc3N1bWluZyBhIDE2IGJpdCBvZmZzZXQgKi8KLQotCi0JICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotCi0JICBzcmMgPSBjb2xvbm1vZDI0IChvcCwgc3JjKTsKLQotCSAgaWYgKCpzcmMgPT0gJyknKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgb3AtPm1vZGUgfD0gQUJTIHwgZGlyZWN0aW9uOwotCSAgICAgICpwdHIgPSBzcmM7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGlmICgqc3JjICE9ICcsJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIpKTsKLQkgICAgICByZXR1cm47Ci0KLQkgICAgfQotCSAgc3JjKys7Ci0KLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm9wLT5yZWcsIGRpcmVjdGlvbik7Ci0JICBpZiAobGVuID09IDAgfHwgIShtb2RlICYgUkVHKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIG9wLT5tb2RlIHw9IERJU1AgfCBkaXJlY3Rpb247Ci0JICBkaXNwcmVnID0gb3AtPnJlZzsKLQkgIHNyYyArPSBsZW47Ci0JICBzcmMgPSBza2lwX2NvbG9udGhpbmcgKHNyYywgJm9wLT5leHAsICZvcC0+bW9kZSk7Ci0KLQkgIGlmICgqc3JjICE9ICcpJyAmJiAnKCcpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCByZWcxNikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAqcHRyID0gc3JjICsgMTsKLQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm51bSwgZGlyZWN0aW9uKTsKLQotICAgICAgaWYgKGxlbikKLQl7Ci0JICBzcmMgKz0gbGVuOwotCSAgaWYgKCpzcmMgPT0gJysnKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgaWYgKChtb2RlICYgU0laRSkgIT0gUFNJWkUpCi0JCWFzX2JhZCAoXygiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIikpOwotCSAgICAgIG9wLT5tb2RlID0gUlNJTkM7Ci0JICAgICAgb3AtPnJlZyA9IG51bTsKLQkgICAgICAqcHRyID0gc3JjOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgaWYgKChtb2RlICYgU0laRSkgIT0gUFNJWkUpCi0JICAgIGFzX2JhZCAoXygiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIikpOwotCi0JICBvcC0+bW9kZSA9IGRpcmVjdGlvbiB8IElORCB8IFBTSVpFOwotCSAgb3AtPnJlZyA9IG51bTsKLQkgICpwdHIgPSBzcmM7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbXVzdCBiZSBhIHN5bWJvbCAqLwotCi0JICBvcC0+bW9kZSA9IEFCUyB8IGRpcmVjdGlvbjsKLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7Ci0KLQkgICpwdHIgPSBjb2xvbm1vZDI0IChvcCwgc3JjKTsKLQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLQotICBpZiAoKnNyYyA9PSAnIycpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICBvcC0+bW9kZSA9IElNTTsKLSAgICAgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7Ci0gICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmb3AtPm1vZGUpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChzcmMsICJtYWNoIiwgNCkgPT0gMAotCSAgIHx8IHN0cm5jbXAgKHNyYywgIm1hY2wiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIG9wLT5yZWcgPSBzcmNbM10gPT0gJ2wnOwotICAgICAgb3AtPm1vZGUgPSBNQUNSRUc7Ci0gICAgICAqcHRyID0gc3JjICsgNDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotICAgICAgLyogVHJhaWxpbmcgJzonIHNpemUgPyAqLwotICAgICAgaWYgKCpzcmMgPT0gJzonKQotCXsKLQkgIGlmIChzcmNbMV0gPT0gJzEnICYmIHNyY1syXSA9PSAnNicpCi0JICAgIHsKLQkgICAgICBvcC0+bW9kZSA9IFBDUkVMIHwgTF8xNjsKLQkgICAgICBzcmMgKz0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3JjWzFdID09ICc4JykKLQkgICAgewotCSAgICAgIG9wLT5tb2RlID0gUENSRUwgfCBMXzg7Ci0JICAgICAgc3JjICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0IDo4IG9yIDoxNiBoZXJlIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wLT5tb2RlID0gUENSRUwgfCBic2l6ZTsKLQl9Ci0gICAgICAqcHRyID0gc3JjOwotICAgIH0KLX0KLQotCi1zdGF0aWMKLWNoYXIgKgotZ2V0X29wZXJhbmRzIChub3BlcmFuZHMsIG9wX2VuZCwgb3BlcmFuZCkKLSAgICAgdW5zaWduZWQgaW50IG5vcGVyYW5kczsKLSAgICAgY2hhciAqb3BfZW5kOwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci17Ci0gIGNoYXIgKnB0ciA9IG9wX2VuZDsKLQotICBzd2l0Y2ggKG5vcGVyYW5kcykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgb3BlcmFuZFswXS5tb2RlID0gMDsKLSAgICAgIG9wZXJhbmRbMV0ubW9kZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwLCBTUkMpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXsKLQkgIHB0cisrOwotCSAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxLCBEU1QpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcGVyYW5kWzFdLm1vZGUgPSAwOwotCX0KLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDAsIFNSQyk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEsIERTVCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gICAqLwotc3RhdGljCi1zdHJ1Y3QgaDhfb3Bjb2RlICoKLWdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kcywgc2l6ZSkKLSAgICAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmRzOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGg4X29wY29kZSAqdGhpc190cnkgPSBvcGNvZGU7Ci0gIGludCBmb3VuZCA9IDA7Ci0KLSAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSBvcGNvZGUtPmlkeDsKLQotICAvKiBUaGVyZSdzIG9ubHkgb25lIGxkbS9zdG0gYW5kIGl0J3MgZWFzaWVyIHRvIGp1c3QKLSAgICAgZ2V0IG91dCBxdWljayBmb3IgdGhlbS4gICovCi0gIGlmIChzdHJjbXAgKG9wY29kZS0+bmFtZSwgInN0bS5sIikgPT0gMAotICAgICAgfHwgc3RyY21wIChvcGNvZGUtPm5hbWUsICJsZG0ubCIpID09IDApCi0gICAgcmV0dXJuIHRoaXNfdHJ5OwotCi0gIHdoaWxlICh0aGlzX2luZGV4ID09IG9wY29kZS0+aWR4ICYmICFmb3VuZCkKLSAgICB7Ci0gICAgICBmb3VuZCA9IDE7Ci0KLSAgICAgIHRoaXNfdHJ5ID0gb3Bjb2RlKys7Ci0gICAgICBpZiAodGhpc190cnktPm5vcGVyYW5kcyA9PSAwKQotCXsKLQkgIGludCB0aGlzX3NpemU7Ci0KLQkgIHRoaXNfc2l6ZSA9IHRoaXNfdHJ5LT5ob3cgJiBTTjsKLQkgIGlmICh0aGlzX3NpemUgIT0gc2l6ZSAmJiAodGhpc19zaXplICE9IFNCIHx8IHNpemUgIT0gU04pKQotCSAgICBmb3VuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgdGhpc190cnktPm5vcGVyYW5kcyAmJiBmb3VuZDsgaSsrKQotCSAgICB7Ci0JICAgICAgb3BfdHlwZSBvcCA9IHRoaXNfdHJ5LT5hcmdzLm5pYltpXTsKLQkgICAgICBpbnQgeCA9IG9wZXJhbmRzW2ldLm1vZGU7Ci0KLQkgICAgICBpZiAoKG9wICYgKERJU1AgfCBSRUcpKSA9PSAoRElTUCB8IFJFRykKLQkJICAmJiAoKHggJiAoRElTUCB8IFJFRykpID09IChESVNQIHwgUkVHKSkpCi0JCXsKLQkJICBkaXNwcmVnID0gb3BlcmFuZHNbaV0ucmVnOwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3AgJiBSRUcpCi0JCXsKLQkJICBpZiAoISh4ICYgUkVHKSkKLQkJICAgIGZvdW5kID0gMDsKLQotCQkgIGlmICh4ICYgTF9QKQotCQkgICAgeCA9ICh4ICYgfkxfUCkgfCAoSG1vZGUgPyBMXzMyIDogTF8xNik7Ci0JCSAgaWYgKG9wICYgTF9QKQotCQkgICAgb3AgPSAob3AgJiB+TF9QKSB8IChIbW9kZSA/IExfMzIgOiBMXzE2KTsKLQotCQkgIG9wc2l6ZSA9IG9wICYgU0laRTsKLQotCQkgIC8qIFRoZSBzaXplIG9mIHRoZSByZWcgaXMgdiBpbXBvcnRhbnQgKi8KLQkJICBpZiAoKG9wICYgU0laRSkgIT0gKHggJiBTSVpFKSkKLQkJICAgIGZvdW5kID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcCAmIEFCU0pNUCkgJiYgKHggJiBBQlMpKQotCQl7Ci0JCSAgb3BlcmFuZHNbaV0ubW9kZSAmPSB+QUJTOwotCQkgIG9wZXJhbmRzW2ldLm1vZGUgfD0gQUJTSk1QOwotCQkgIC8qIEJ1dCBpdCBtYXkgbm90IGJlIDI0IGJpdHMgbG9uZyAqLwotCQkgIGlmICghSG1vZGUpCi0JCSAgICB7Ci0JCSAgICAgIG9wZXJhbmRzW2ldLm1vZGUgJj0gflNJWkU7Ci0JCSAgICAgIG9wZXJhbmRzW2ldLm1vZGUgfD0gTF8xNjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcCAmIChLQklUIHwgREJJVCkpICYmICh4ICYgSU1NKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgb2sgaWYgdGhlIGltbWVkaWF0ZSB2YWx1ZSBpcyBzZW5zaWJsZSAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3AgJiBQQ1JFTCkKLQkJewotCQkgIC8qIFRoZSBzaXplIG9mIHRoZSBkaXNwbGFjZW1lbnQgaXMgaW1wb3J0YW50ICovCi0JCSAgaWYgKChvcCAmIFNJWkUpICE9ICh4ICYgU0laRSkpCi0JCSAgICBmb3VuZCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiAoRElTUCB8IElNTSB8IEFCUykpCi0JCSAgICAgICAmJiAob3AgJiAoRElTUCB8IElNTSB8IEFCUykpID09ICh4ICYgKERJU1AgfCBJTU0gfCBBQlMpKSkKLQkJewotCQkgIC8qIFByb21vdGUgYSBMXzI0IHRvIExfMzIgaWYgaXQgbWFrZXMgdXMgbWF0Y2guICAqLwotCQkgIGlmICgoeCAmIExfMjQpICYmIChvcCAmIExfMzIpKQotCQkgICAgewotCQkgICAgICB4ICY9IH5MXzI0OwotCQkgICAgICB4IHw9IExfMzI7Ci0JCSAgICB9Ci0JCSAgLyogUHJvbW90ZSBhbiBMOCB0byBMXzE2IGlmIGl0IG1ha2VzIHVzIG1hdGNoLiAgKi8KLQkJICBpZiAob3AgJiBBQlMgJiYgb3AgJiBMXzggJiYgb3AgJiBESVNQKSAKLQkJICAgIHsKLQkJICAgICAgaWYgKHggJiBMXzE2KQotCQkJZm91bmQ9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKHggJiBTSVpFKSAhPSAwCi0JCQkgICAmJiAoKG9wICYgU0laRSkgIT0gKHggJiBTSVpFKSkpCi0JCSAgICBmb3VuZCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiBNQUNSRUcpICE9ICh4ICYgTUFDUkVHKSkKLQkJewotCQkgIGZvdW5kID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcCAmIE1PREUpICE9ICh4ICYgTU9ERSkpCi0JCXsKLQkJICBmb3VuZCA9IDA7Ci0JCX0JCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRoaXNfdHJ5OwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19vcGVyYW5kIChvcGVyYW5kLCB3aWR0aCwgc3RyaW5nKQotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci0gICAgIHVuc2lnbmVkIGludCB3aWR0aDsKLSAgICAgY2hhciAqc3RyaW5nOwotewotICBpZiAob3BlcmFuZC0+ZXhwLlhfYWRkX3N5bWJvbCA9PSAwCi0gICAgICAmJiBvcGVyYW5kLT5leHAuWF9vcF9zeW1ib2wgPT0gMCkKLSAgICB7Ci0KLSAgICAgIC8qIE5vIHN5bWJvbCBpbnZvbHZlZCwgbGV0J3MgbG9vayBhdCBvZmZzZXQsIGl0J3MgZGFuZ2Vyb3VzIGlmIGFueSBvZgotCSB0aGUgaGlnaCBiaXRzIGFyZSBub3QgMCBvciBmZidzLCBmaW5kIG91dCBieSBvcmluZyBvciBhbmRpbmcgd2l0aAotCSB0aGUgd2lkdGggYW5kIHNlZWluZyBpZiB0aGUgYW5zd2VyIGlzIDAgb3IgYWxsIGZzKi8KLSAgICAgIAotICAgICAgaWYgKChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgfndpZHRoKSAhPSAwICYmCi0JICAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciB8IHdpZHRoKSAhPSAofjApKQotCXsKLQkgIGlmICh3aWR0aCA9PSAyNTUgCi0JICAgICAgJiYgKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJiAweGZmMDApID09IDB4ZmYwMCkKLQkgICAgewotCSAgICAgIC8qIEp1c3QgaWdub3JlIHRoaXMgb25lIC0gd2hpY2ggaGFwcGVucyB3aGVuIHRyeWluZyB0bwotCQkgZml0IGEgMTYgYml0IGFkZHJlc3MgdHJ1bmNhdGVkIGludG8gYW4gOCBiaXQgYWRkcmVzcwotCQkgb2Ygc29tZXRoaW5nIGxpa2UgYnNldC4gICovCi0JICAgIH0KLQkgIGVsc2UgCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJvcGVyYW5kICVzMHglbHggb3V0IG9mIHJhbmdlLiIpLCBzdHJpbmcsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi19Ci0KLS8qIFJFTEFYTU9ERSBoYXMgb25lIG9mIDMgdmFsdWVzOgotCi0gICAwIE91dHB1dCBhICJub3JtYWwiIHJlbG9jLCBubyByZWxheGluZyBwb3NzaWJsZSBmb3IgdGhpcyBpbnNuL3JlbG9jCi0KLSAgIDEgT3V0cHV0IGEgcmVsYXhhYmxlIDI0Yml0IGFic29sdXRlIG1vdi53IGFkZHJlc3MgcmVsb2NhdGlvbgotICAgICAobWF5IHJlbGF4IGludG8gYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzKS4KLQotICAgMiBPdXRwdXQgYSByZWxheGFibGUgMTYvMjQgYWJzb2x1dGUgbW92LmIgYWRkcmVzcyByZWxvY2F0aW9uCi0gICAgIChtYXkgcmVsYXggaW50byBhbiA4Yml0IGFic29sdXRlIGFkZHJlc3MpLiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX2FfZml4X2ltbSAob2Zmc2V0LCBvcGVyYW5kLCByZWxheG1vZGUpCi0gICAgIGludCBvZmZzZXQ7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKLSAgICAgaW50IHJlbGF4bW9kZTsKLXsKLSAgaW50IGlkeDsKLSAgaW50IHNpemU7Ci0gIGludCB3aGVyZTsKLQotCi0gIGNoYXIgKnQgPSBvcGVyYW5kLT5tb2RlICYgSU1NID8gIiMiIDogIkAiOwotCi0gIGlmIChvcGVyYW5kLT5leHAuWF9hZGRfc3ltYm9sID09IDApCi0gICAgewotICAgICAgY2hhciAqYnl0ZXMgPSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldDsKLSAgICAgIHN3aXRjaCAob3BlcmFuZC0+bW9kZSAmIFNJWkUpCi0JewotCWNhc2UgTF8yOgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHgzLCB0KTsKLQkgIGJ5dGVzWzBdIHw9IChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKSA8PCA0OwotCSAgYnJlYWs7Ci0JY2FzZSBMXzM6Ci0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweDcsIHQpOwotCSAgYnl0ZXNbMF0gfD0gKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpIDw8IDQ7Ci0JICBicmVhazsKLQljYXNlIExfODoKLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4ZmYsIHQpOwotCSAgYnl0ZXNbMF0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyOwotCSAgYnJlYWs7Ci0JY2FzZSBMXzE2OgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHhmZmZmLCB0KTsKLQkgIGJ5dGVzWzBdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiA4OwotCSAgYnl0ZXNbMV0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDA7Ci0JICBicmVhazsKLQljYXNlIExfMjQ6Ci0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweGZmZmZmZiwgdCk7Ci0JICBieXRlc1swXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMTY7Ci0JICBieXRlc1sxXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gODsKLQkgIGJ5dGVzWzJdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIExfMzI6Ci0JICAvKiBUaGlzIHNob3VsZCBiZSBkb25lIHdpdGggYmZkICovCi0JICBieXRlc1swXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMjQ7Ci0JICBieXRlc1sxXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMTY7Ci0JICBieXRlc1syXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gODsKLQkgIGJ5dGVzWzNdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChvcGVyYW5kLT5tb2RlICYgU0laRSkKLQl7Ci0KLQljYXNlIExfMjQ6Ci0JY2FzZSBMXzMyOgotCSAgc2l6ZSA9IDQ7Ci0JICB3aGVyZSA9IChvcGVyYW5kLT5tb2RlICYgU0laRSkgPT0gTF8yNCA/IC0xIDogMDsKLQkgIGlmIChyZWxheG1vZGUgPT0gMikKLQkgICAgaWR4ID0gUl9NT1YyNEIxOwotCSAgZWxzZSBpZiAocmVsYXhtb2RlID09IDEpCi0JICAgIGlkeCA9IFJfTU9WTDE7Ci0JICBlbHNlCi0JICAgIGlkeCA9IFJfUkVMTE9ORzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19iYWQoXygiQ2FuJ3Qgd29yayBvdXQgc2l6ZSBvZiBvcGVyYW5kLlxuIikpOwotCWNhc2UgTF8xNjoKLQkgIHNpemUgPSAyOwotCSAgd2hlcmUgPSAwOwotCSAgaWYgKHJlbGF4bW9kZSA9PSAyKQotCSAgICBpZHggPSBSX01PVjE2QjE7Ci0JICBlbHNlCi0JICAgIGlkeCA9IFJfUkVMV09SRDsKLQkgIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPSAoc2hvcnQpb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcjsKLQkgIGJyZWFrOwotCWNhc2UgTF84OgotCSAgc2l6ZSA9IDE7Ci0JICB3aGVyZSA9IDA7Ci0JICBpZHggPSBSX1JFTEJZVEU7Ci0JICAvKiBUaGlzIHVzZWQgdG8gdXNlIGEgY2FzdCB0byBjaGFyLCBidXQgdGhhdCBmYWlscyBpZiBjaGFyIGlzIGFuCi0JICAgICB1bnNpZ25lZCB0eXBlLiAgV2UgY2FuJ3QgdXNlIGBzaWduZWQgY2hhcicsIGFzIHRoYXQgaXNuJ3QgdmFsaWQKLQkgICAgIEsmUiBDLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgMHg4MCkKLQkgICAgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciB8PSAoKG9mZnNldFQpIC0xIDw8IDgpOwotCSAgZWxzZQotCSAgICBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICY9IDB4ZmY7Ci0JfQotCi0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIG9mZnNldCArIHdoZXJlLAotCQkgICBzaXplLAotCQkgICAmb3BlcmFuZC0+ZXhwLAotCQkgICAwLAotCQkgICBpZHgpOwotICAgIH0KLQotfQotCi0vKiBOb3cgd2Uga25vdyB3aGF0IHNvcnQgb2Ygb3Bjb2RlcyBpdCBpcywgbGV0cyBidWlsZCB0aGUgYnl0ZXMgLQotICovCi1zdGF0aWMgdm9pZAotYnVpbGRfYnl0ZXMgKHRoaXNfdHJ5LCBvcGVyYW5kKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICp0aGlzX3RyeTsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBjaGFyICpvdXRwdXQgPSBmcmFnX21vcmUgKHRoaXNfdHJ5LT5sZW5ndGgpOwotICBvcF90eXBlICpuaWJibGVfcHRyID0gdGhpc190cnktPmRhdGEubmliOwotICBvcF90eXBlIGM7Ci0gIHVuc2lnbmVkIGludCBuaWJibGVfY291bnQgPSAwOwotICBpbnQgYWJzYXQ7Ci0gIGludCBpbW1hdDsKLSAgaW50IG5pYjsKLSAgaW50IG1vdmIgPSAwOwotICBjaGFyIGFzbmliYmxlc1szMF07Ci0gIGNoYXIgKnAgPSBhc25pYmJsZXM7Ci0KLSAgaWYgKCEodGhpc190cnktPmluYmFzZSB8fCBIbW9kZSkpCi0gICAgYXNfd2FybiAoXygiT3Bjb2RlIGAlcycgd2l0aCB0aGVzZSBvcGVyYW5kIHR5cGVzIG5vdCBhdmFpbGFibGUgaW4gSDgvMzAwIG1vZGUiKSwKLQkgICAgIHRoaXNfdHJ5LT5uYW1lKTsKLQotICB3aGlsZSAoKm5pYmJsZV9wdHIgIT0gRSkKLSAgICB7Ci0gICAgICBpbnQgZDsKLSAgICAgIGMgPSAqbmliYmxlX3B0cisrOwotCi0gICAgICBkID0gKGMgJiAoRFNUIHwgU1JDX0lOX0RTVCkpICE9IDA7Ci0KLSAgICAgIGlmIChjIDwgMTYpCi0JewotCSAgbmliID0gYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCi0JICBpZiAoYyAmIChSRUcgfCBJTkQgfCBJTkMgfCBERUMpKQotCSAgICB7Ci0JICAgICAgbmliID0gb3BlcmFuZFtkXS5yZWc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChjICYgRElTUFJFRykgPT0gKERJU1BSRUcpKQotCSAgICB7Ci0JICAgICAgbmliID0gZGlzcHJlZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyAmICBBQlMgKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZFtkXS5tb2RlID0gYzsKLQkgICAgICBhYnNhdCA9IG5pYmJsZV9jb3VudCAvIDI7Ci0JICAgICAgbmliID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyAmIChJTU0gfCBQQ1JFTCB8IEFCUyB8IEFCU0pNUCB8IERJU1ApKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZFtkXS5tb2RlID0gYzsKLQkgICAgICBpbW1hdCA9IG5pYmJsZV9jb3VudCAvIDI7Ci0JICAgICAgbmliID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyAmIElHTk9SRSkKLQkgICAgewotCSAgICAgIG5pYiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiBEQklUKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChvcGVyYW5kWzBdLmV4cC5YX2FkZF9udW1iZXIpCi0JCXsKLQkJY2FzZSAxOgotCQkgIG5pYiA9IGM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICBuaWIgPSAweDggfCBjOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFzX2JhZCAoXygiTmVlZCAjMSBvciAjMiBoZXJlIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiBLQklUKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChvcGVyYW5kWzBdLmV4cC5YX2FkZF9udW1iZXIpCi0JCXsKLQkJY2FzZSAxOgotCQkgIG5pYiA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICBuaWIgPSA4OwotCQkgIGJyZWFrOwotCQljYXNlIDQ6Ci0JCSAgaWYgKCFIbW9kZSkKLQkJICAgIGFzX3dhcm4gKF8oIiM0IG5vdCB2YWxpZCBvbiBIOC8zMDAuIikpOwotCQkgIG5pYiA9IDk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIk5lZWQgIzEgb3IgIzIgaGVyZSIpKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIHN0b3AgaXQgbWFraW5nIGEgZml4ICovCi0JICAgICAgb3BlcmFuZFswXS5tb2RlID0gMDsKLQkgICAgfQotCi0JICBpZiAoYyAmIE1FTVJFTEFYKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZFtkXS5tb2RlIHw9IE1FTVJFTEFYOwotCSAgICB9Ci0KLQkgIGlmIChjICYgQjMxKQotCSAgICB7Ci0JICAgICAgbmliIHw9IDB4ODsKLQkgICAgfQotCi0JICBpZiAoYyAmIE1BQ1JFRykKLQkgICAgewotCSAgICAgIG5pYiA9IDIgKyBvcGVyYW5kW2RdLnJlZzsKLQkgICAgfQotCX0KLSAgICAgIG5pYmJsZV9jb3VudCsrOwotCi0gICAgICAqcCsrID0gbmliOwotICAgIH0KLQotICAvKiBEaXNndXN0aW5nLiAgV2h5LCBvaCB3aHkgZGlkbid0IHNvbWVvbmUgYXNrIHVzIGZvciBhZHZpY2UKLSAgICAgb24gdGhlIGFzc2VtYmxlciBmb3JtYXQuICAqLwotICBpZiAoc3RyY21wICh0aGlzX3RyeS0+bmFtZSwgInN0bS5sIikgPT0gMAotICAgICAgfHwgc3RyY21wICh0aGlzX3RyeS0+bmFtZSwgImxkbS5sIikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgaGlnaCwgbG93OwotICAgICAgaGlnaCA9IChvcGVyYW5kW3RoaXNfdHJ5LT5uYW1lWzBdID09ICdsJyA/IDEgOiAwXS5yZWcgPj4gOCkgJiAweGY7Ci0gICAgICBsb3cgPSBvcGVyYW5kW3RoaXNfdHJ5LT5uYW1lWzBdID09ICdsJyA/IDEgOiAwXS5yZWcgJiAweGY7Ci0KLSAgICAgIGFzbmliYmxlc1syXSA9IGhpZ2ggLSBsb3c7Ci0gICAgICBhc25pYmJsZXNbN10gPSAodGhpc190cnktPm5hbWVbMF0gPT0gJ2wnKSA/IGhpZ2ggOiBsb3c7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCB0aGlzX3RyeS0+bGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgb3V0cHV0W2ldID0gKGFzbmliYmxlc1tpICogMl0gPDwgNCkgfCBhc25pYmJsZXNbaSAqIDIgKyAxXTsKLSAgICB9Ci0KLSAgLyogTm90ZSBpZiB0aGlzIGlzIGEgbW92YiBpbnN0cnVjdGlvbiAtLSB0aGVyZSdzIGEgc3BlY2lhbCByZWxheGF0aW9uCi0gICAgIHdoaWNoIG9ubHkgYXBwbGllcyB0byB0aGVtLiAgKi8KLSAgaWYgKHN0cmNtcCAodGhpc190cnktPm5hbWUsICJtb3YuYiIpID09IDApCi0gICAgbW92YiA9IDE7Ci0KLSAgLyogb3V0cHV0IGFueSBmaXhlcyAqLwotICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgIHsKLSAgICAgIGludCB4ID0gb3BlcmFuZFtpXS5tb2RlOwotCi0gICAgICBpZiAoeCAmIChJTU0gfCBESVNQKSkKLQl7Ci0JICBkb19hX2ZpeF9pbW0gKG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgaW1tYXQsCi0JCQlvcGVyYW5kICsgaSwgeCAmIE1FTVJFTEFYICE9IDApOwotCX0KLSAgICAgIGVsc2UgaWYgKHggJiBBQlMpCi0JewotCSAgZG9fYV9maXhfaW1tIChvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGFic2F0LAotCQkJb3BlcmFuZCArIGksIHggJiBNRU1SRUxBWCA/IG1vdmIgKyAxIDogMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoeCAmIFBDUkVMKQotCXsKLQkgIGludCBzaXplMTYgPSB4ICYgTF8xNjsKLQkgIGludCB3aGVyZSA9IHNpemUxNiA/IDIgOiAxOwotCSAgaW50IHNpemUgPSBzaXplMTYgPyAyIDogMTsKLQkgIGludCB0eXBlID0gc2l6ZTE2ID8gUl9QQ1JXT1JEIDogUl9QQ1JCWVRFOwotCi0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kICsgaSwgc2l6ZTE2ID8gMHg3ZmZmIDogMHg3ZiwgIkAiKTsKLQotCSAgaWYgKG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAmIDEpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJicmFuY2ggb3BlcmFuZCBoYXMgb2RkIG9mZnNldCAoJWx4KVxuIiksCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcik7Ci0JICAgIH0KLQotCSAgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyIC09IDE7Ci0JICAvKiBUaGlzIHVzZWQgdG8gdXNlIGEgY2FzdCB0byBjaGFyLCBidXQgdGhhdCBmYWlscyBpZiBjaGFyIGlzIGFuCi0JICAgICB1bnNpZ25lZCB0eXBlLiAgV2UgY2FuJ3QgdXNlIGBzaWduZWQgY2hhcicsIGFzIHRoYXQgaXNuJ3QgdmFsaWQKLQkgICAgIEsmUiBDLiAgKi8KLQkgIGlmIChvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgJiAweDgwKQotCSAgICBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgfD0gKChvZmZzZXRUKSAtMSA8PCA4KTsKLQkgIGVsc2UKLQkgICAgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyICY9IDB4ZmY7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgd2hlcmUsCi0JCSAgICAgICBzaXplLAotCQkgICAgICAgJm9wZXJhbmRbaV0uZXhwLAotCQkgICAgICAgMSwKLQkJICAgICAgIHR5cGUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHggJiBNRU1JTkQpCi0JewotCi0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kICsgaSwgMHhmZiwgIkBAIik7Ci0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDEsCi0JCSAgICAgICAxLAotCQkgICAgICAgJm9wZXJhbmRbaV0uZXhwLAotCQkgICAgICAgMCwKLQkJICAgICAgIFJfTUVNX0lORElSRUNUKTsKLQl9Ci0gICAgICBlbHNlIGlmICh4ICYgQUJTSk1QKQotCXsKLQkgIC8qIFRoaXMgam1wIG1heSBiZSBhIGp1bXAgb3IgYSBicmFuY2ggKi8KLQotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCArIGksIEhtb2RlID8gMHhmZmZmZmYgOiAweGZmZmYsICJAIik7Ci0JICBpZiAob3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyICYgMSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImJyYW5jaCBvcGVyYW5kIGhhcyBvZGQgb2Zmc2V0ICglbHgpXG4iKSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKLQkgICAgfQotCSAgaWYgKCFIbW9kZSkKLQkgICAgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyID0gKHNob3J0KSBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXI7Ci0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDQsCi0JCSAgICAgICAmb3BlcmFuZFtpXS5leHAsCi0JCSAgICAgICAwLAotCQkgICAgICAgUl9KTVBMMSk7Ci0JfQotICAgIH0KLQotfQotCi0vKgotICB0cnkgYW5kIGdpdmUgYW4gaW50ZWxsaWdlbnQgZXJyb3IgbWVzc2FnZSBmb3IgY29tbW9uIGFuZCBzaW1wbGUgdG8KLSAgZGV0ZWN0IGVycm9ycwotICAqLwotCi1zdGF0aWMgdm9pZAotY2xldmVyX21lc3NhZ2UgKG9wY29kZSwgb3BlcmFuZCkKLSAgICAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci17Ci0gIC8qIEZpbmQgb3V0IGlmIHRoZXJlIHdhcyBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIG9wY2NvZGUgKi8KLQotICBpZiAoKG9wY29kZSArIDEpLT5pZHggIT0gb3Bjb2RlLT5pZHgpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFyZ247Ci0KLSAgICAgIC8qIE9ubHkgb25lIG9wY29kZSBvZiB0aGlzIGZsYXZvdXIsIHRyeSBhbmQgZ3Vlc3Mgd2hpY2ggb3BlcmFuZAotICAgICAgICAgZGlkbid0IG1hdGNoICovCi0gICAgICBmb3IgKGFyZ24gPSAwOyBhcmduIDwgb3Bjb2RlLT5ub3BlcmFuZHM7IGFyZ24rKykKLQl7Ci0JICBzd2l0Y2ggKG9wY29kZS0+YXJncy5uaWJbYXJnbl0pCi0JICAgIHsKLQkgICAgY2FzZSBSRDE2OgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gUkQxNikKLQkJewotCQkgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2IGJpdCByZWdpc3RlciIpKTsKLQkJICByZXR1cm47Ci0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUlM4OgotCi0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBSUzgpCi0JCXsKLQkJICBhc19iYWQgKF8oInNvdXJjZSBvcGVyYW5kIG11c3QgYmUgOCBiaXQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBQlMxNkRTVDoKLQkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IEFCUzE2RFNUKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRDg6Ci0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBSRDgpCi0JCXsKLQkJICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBicmVhazsKLQotCi0JICAgIGNhc2UgQUJTMTZTUkM6Ci0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBBQlMxNlNSQykKLQkJewotCQkgIGFzX2JhZCAoXygic291cmNlIG9wZXJhbmQgbXVzdCBiZSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIH0KLQl9Ci0gICAgfQotICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMiKSk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmNpdG9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gICAqLwotCi0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpvcF9zdGFydDsKLSAgY2hhciAqb3BfZW5kOwotICBzdHJ1Y3QgaDhfb3Agb3BlcmFuZFsyXTsKLSAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICBzdHJ1Y3QgaDhfb3Bjb2RlICpwcmV2X29wY29kZTsKLQotICBjaGFyICpkb3QgPSAwOwotICBjaGFyIGM7Ci0gIGludCBzaXplOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBmaW5kIHRoZSBvcCBjb2RlIGVuZCAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOwotICAgICAgICpvcF9lbmQgIT0gMCAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBpZiAoKm9wX2VuZCA9PSAnLicpCi0JewotCSAgZG90ID0gb3BfZW5kICsgMTsKLQkgICpvcF9lbmQgPSAwOwotCSAgb3BfZW5kICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIDsKLQotICBpZiAob3BfZW5kID09IG9wX3N0YXJ0KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLSAgYyA9ICpvcF9lbmQ7Ci0KLSAgKm9wX2VuZCA9IDA7Ci0KLSAgb3Bjb2RlID0gKHN0cnVjdCBoOF9vcGNvZGUgKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLAotCQkJCQkgICBvcF9zdGFydCk7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIHVzZSB0byBzZXQgaW5wdXRfbGluZV9wb2ludGVyIHRvIHRoZSByZXN1bHQgb2YgZ2V0X29wZXJhbmRzLAotICAgICBidXQgdGhhdCBpcyB3cm9uZy4gIE91ciBjYWxsZXIgYXNzdW1lcyB3ZSBkb24ndCBjaGFuZ2UgaXQuICAqLwotCi0gICh2b2lkKSBnZXRfb3BlcmFuZHMgKG9wY29kZS0+bm9wZXJhbmRzLCBvcF9lbmQsIG9wZXJhbmQpOwotICAqb3BfZW5kID0gYzsKLSAgcHJldl9vcGNvZGUgPSBvcGNvZGU7Ci0KLSAgc2l6ZSA9IFNOOwotICBpZiAoZG90KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmRvdCkKLQl7Ci0JY2FzZSAnYic6Ci0JICBzaXplID0gU0I7Ci0JICBicmVhazsKLQotCWNhc2UgJ3cnOgotCSAgc2l6ZSA9IFNXOwotCSAgYnJlYWs7Ci0KLQljYXNlICdsJzoKLQkgIHNpemUgPSBTTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIG9wY29kZSA9IGdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kLCBzaXplKTsKLQotICBpZiAob3Bjb2RlID09IDApCi0gICAgewotICAgICAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLSAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotICAgICAgd2hlcmVbMF0gPSAweDA7Ci0gICAgICB3aGVyZVsxXSA9IDB4MDsKLSAgICAgIGNsZXZlcl9tZXNzYWdlIChwcmV2X29wY29kZSwgb3BlcmFuZCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGNvZGUtPnNpemUgJiYgZG90KQotICAgIHsKLSAgICAgIGlmIChvcGNvZGUtPnNpemUgIT0gKmRvdCkKLQl7Ci0JICBhc193YXJuIChfKCJtaXNtYXRjaCBiZXR3ZWVuIG9wY29kZSBzaXplIGFuZCBvcGVyYW5kIHNpemUiKSk7Ci0JfQotICAgIH0KLQotICBidWlsZF9ieXRlcyAob3Bjb2RlLCBvcGVyYW5kKTsKLQotfQotCi12b2lkCi10Y19jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVyczsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotdGNfaGVhZGVyc19ob29rIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnM7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAoKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBwcmludGYgKF8oImNhbGwgdG8gbWRfY29udmVydF9mcmFnIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUIAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBzaXplKQotICAgICBzZWdUIHNlZzsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLQotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3NpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0b21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKLSAgICAgY2hhciAqcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0KLXZvaWQKLXRjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKLSAgICAgZml4UyAqZml4X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOwotICAgICBiZmRfdm1hIGJhc2U7Ci0KLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKLQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBUQ19DT05TX1JFTE9DKQotICAgIHsKLSAgICAgIC8qIGNvbnMgbGlrZXMgdG8gY3JlYXRlIHJlbG9jMzIncyB3aGF0ZXZlciB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MuLgotICAgICAgICovCi0gICAgICBzd2l0Y2ggKGZpeF9wdHItPmZ4X3NpemUpCi0JewotCWNhc2UgNDoKLQkgIGludHItPnJfdHlwZSA9IFJfUkVMTE9ORzsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGludHItPnJfdHlwZSA9IFJfUkVMV09SRDsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIGludHItPnJfdHlwZSA9IFJfUkVMQllURTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludHItPnJfdHlwZSA9IGZpeF9wdHItPmZ4X3JfdHlwZTsKLSAgICB9Ci0KLSAgaW50ci0+cl92YWRkciA9IGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZSArIGJhc2U7Ci0gIGludHItPnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotCi0gIGlmIChzeW1ib2xfcHRyKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xfcHRyLT5zeV9udW1iZXIgIT0gLTEpCi0JaW50ci0+cl9zeW1uZHggPSBzeW1ib2xfcHRyLT5zeV9udW1iZXI7Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sUyAqc2Vnc3ltOwotCi0JICAvKiBUaGlzIGNhc2UgYXJpc2VzIHdoZW4gYSByZWZlcmVuY2UgaXMgbWFkZSB0byBgLicuICAqLwotCSAgc2Vnc3ltID0gc2VnX2luZm8gKFNfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpKS0+ZG90OwotCSAgaWYgKHNlZ3N5bSA9PSBOVUxMKQotCSAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50ci0+cl9zeW1uZHggPSBzZWdzeW0tPnN5X251bWJlcjsKLQkgICAgICBpbnRyLT5yX29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltYm9sX3B0cik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLQotCi19Ci0KLS8qIGVuZCBvZiB0Yy1oODMwMC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4MzAwLmggYi9nYXMvY29uZmlnL3RjLWg4MzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMmE3MDQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1oODMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWg4MzAwLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNkZWZpbmUgVENfSDgzMDAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBpbnRlcm5hbF9yZWxvYzsKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgYWJvcnQoKTsKLQotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9oODMwMAotI2RlZmluZSBDT0ZGX01BR0lDICggU21vZGUgPyAweDgzMDIgOiBIbW9kZSA/IDB4ODMwMSA6IDB4ODMwMCkKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKDEpCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKGEpIDsgLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgVENfQ09OU19SRUxPQyAgICAgICAgICAoSG1vZGUgPyBSX1JFTExPTkc6IFJfUkVMV09SRCkKLQotI2RlZmluZSBET19OT1RfU1RSSVAgMAotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiSGl0YWNoaSBIOC8zMDAgR0FTICIKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotI2RlZmluZSBSRUxPQ18zMiAxMjM0Ci0KLWV4dGVybiBpbnQgSG1vZGU7Ci1leHRlcm4gaW50IFNtb2RlOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogZW5kIG9mIHRjLWg4MzAwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDg1MDAuYyBiL2dhcy9jb25maWcvdGMtaDg1MDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlYzNlMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWg4NTAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMzICswLDAgQEAKLS8qIHRjLWg4NTAwLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgSDgvNTAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgc2FjQGN5Z251cy5jb20KLSAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2RlZmluZSBBU1NFTUJMRVJfVEFCTEUKLSNpbmNsdWRlICJvcGNvZGVzL2g4NTAwLW9wYy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIhIyI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotdm9pZCBjb25zICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDJ9LAotICB7ImRhdGEuYiIsIGNvbnMsIDF9LAotICB7ImRhdGEudyIsIGNvbnMsIDJ9LAotICB7ImRhdGEubCIsIGNvbnMsIDR9LAotICB7ImZvcm0iLCBsaXN0aW5nX3BzaXplLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0KLSNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj4yKSkKLQotI2RlZmluZSBCWVRFX0RJU1AgMQotI2RlZmluZSBXT1JEX0RJU1AgMgotI2RlZmluZSBVTkRFRl9CWVRFX0RJU1AgMAotI2RlZmluZSBVTkRFRl9XT1JEX0RJU1AgMwotCi0jZGVmaW5lIEJSQU5DSCAgMQotI2RlZmluZSBTQ0JfRiAgIDIKLSNkZWZpbmUgU0NCX1RTVCAzCi0jZGVmaW5lIEVORCA0Ci0KLSNkZWZpbmUgQllURV9GIDEyNwotI2RlZmluZSBCWVRFX0IgLTEyNgotI2RlZmluZSBXT1JEX0YgMzI3NjcKLSNkZWZpbmUgV09SRF9CIDMyNzY4Ci0KLXJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKgotICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQKLSAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gIGNoYXIgcHJldl9idWZmZXJbMTAwXTsKLSAgaW50IGlkeCA9IDA7Ci0gIHJlZ2lzdGVyIHJlbGF4X3R5cGVTICp0YWJsZTsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0gIHByZXZfYnVmZmVyWzBdID0gMDsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChpZHggIT0gb3Bjb2RlLT5pZHgpCi0JewotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQkgIGlkeCsrOwotCX0KLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgcmVsYXggdGFibGUuICBXZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSB0byBhdm9pZAotICAgICB3YXJuaW5ncyBhYm91dCBtb2RpZnlpbmcgYSBzdXBwb3NlZGx5IGNvbnN0IGRhdGEgc3RydWN0dXJlLiAgKi8KLSAgdGFibGUgPSAocmVsYXhfdHlwZVMgKikgbWRfcmVsYXhfdGFibGU7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgQllURV9ESVNQKV0ucmx4X2JhY2t3YXJkID0gQllURV9COwotICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9sZW5ndGggPSAyOwotICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoQlJBTkNILCBXT1JEX0RJU1ApOwotCi0gIHRhYmxlW0MgKEJSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2ZvcndhcmQgPSBXT1JEX0Y7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9sZW5ndGggPSAzOwotICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKLQotICB0YWJsZVtDIChTQ0JfRiwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7Ci0gIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKLSAgdGFibGVbQyAoU0NCX0YsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoU0NCX0YsIFdPUkRfRElTUCk7Ci0KLSAgdGFibGVbQyAoU0NCX0YsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDg7Ci0gIHRhYmxlW0MgKFNDQl9GLCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLSAgdGFibGVbQyAoU0NCX1RTVCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoU0NCX1RTVCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDM7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoU0NCX1RTVCwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKLSAgdGFibGVbQyAoU0NCX1RTVCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gMTA7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKLQotfQotCi1zdGF0aWMgaW50IHJuOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJOICovCi1zdGF0aWMgaW50IHJzOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJTICovCi1zdGF0aWMgaW50IHJkOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJEICovCi1zdGF0aWMgaW50IGNyYjsJCQkvKiBieXRlIHNpemUgY3IgKi8KLXN0YXRpYyBpbnQgY3J3OwkJCS8qIHdvcmQgc2l6ZWQgY3IgKi8KLXN0YXRpYyBpbnQgY3I7CQkJLyogdW5rbm93biBzaXplIGNyICovCi0KLXN0YXRpYyBleHByZXNzaW9uUyBkaXNwbGFjZW1lbnQ7LyogZGlzcGxhY2VtZW50IGV4cHJlc3Npb24gKi8KLXN0YXRpYyBpbnQgZGlzcGxhY2VtZW50X3NpemU7CS8qIGFuZCBzaXplIGlmIGdpdmVuICovCi0KLXN0YXRpYyBpbnQgaW1tZWRpYXRlX2lucGFnZTsKLXN0YXRpYyBleHByZXNzaW9uUyBpbW1lZGlhdGU7CS8qIGltbWVkaWF0ZSBleHByZXNzaW9uICovCi1zdGF0aWMgaW50IGltbWVkaWF0ZV9zaXplOwkvKiBhbmQgc2l6ZSBpZiBnaXZlbiAqLwotCi1zdGF0aWMgZXhwcmVzc2lvblMgYWJzb2x1dGU7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KLXN0YXRpYyBpbnQgYWJzb2x1dGVfc2l6ZTsJLyogYW5kIHNpemUgaWYgZ2l2ZW4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IHR5cGU7Ci0gIGludCByZWc7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IHBhZ2U7Ci19Ci0KLWg4NTAwX29wZXJhbmRfaW5mbzsKLQotLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLwotc3RhdGljIGludAotcGFyc2VfcmVnIChzcmMsIG1vZGUsIHJlZykKLSAgICAgY2hhciAqc3JjOwotICAgICBpbnQgKm1vZGU7Ci0gICAgIGludCAqcmVnOwotewotICBjaGFyICplbmQ7Ci0gIGludCBsZW47Ci0KLSAgLyogQ3JpYmJlZCBmcm9tIGdldF9zeW1ib2xfZW5kKCkuICAqLwotICBpZiAoIWlzX25hbWVfYmVnaW5uZXIgKCpzcmMpIHx8ICpzcmMgPT0gJ1wwMDEnKQotICAgIHJldHVybiAwOwotICBlbmQgPSBzcmMrMTsKLSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKmVuZCkgfHwgKmVuZCA9PSAnXDAwMScpCi0gICAgZW5kKys7Ci0gIGxlbiA9IGVuZCAtIHNyYzsKLQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnKQotCXsKLQkgICptb2RlID0gUk47Ci0JICAqcmVnID0gKHNyY1sxXSAtICcwJyk7Ci0JICByZXR1cm4gbGVuOwotCX0KLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBSTjsKLSAgICAgICpyZWcgPSA3OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2MnICYmIHNyY1sxXSA9PSAnYycgJiYgc3JjWzJdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSAxOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncicpCi0gICAgewotICAgICAgKm1vZGUgPSBDUlc7Ci0gICAgICAqcmVnID0gMDsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdiJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JCOwotICAgICAgKnJlZyA9IDM7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSA0OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2QnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBDUkI7Ci0gICAgICAqcmVnID0gNTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICd0JyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JCOwotICAgICAgKnJlZyA9IDc7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFJOOwotICAgICAgKnJlZyA9IDY7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotY2hhciAqCi1wYXJzZV9leHAgKHMsIG9wLCBwYWdlKQotICAgICBjaGFyICpzOwotICAgICBleHByZXNzaW9uUyAqb3A7Ci0gICAgIGludCAqcGFnZTsKLXsKLSAgY2hhciAqc2F2ZTsKLSAgY2hhciAqbmV3OwotCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgKnBhZ2UgPSAwOwotICBpZiAoc1swXSA9PSAnJScpCi0gICAgewotICAgICAgaWYgKHNbMV0gPT0gJ3AnICYmIHNbMl0gPT0gJ2EnICYmIHNbM10gPT0gJ2cnICYmIHNbNF0gPT0gJ2UnKQotCXsKLQkgIHMgKz0gNTsKLQkgICpwYWdlID0gJ3AnOwotCX0KLSAgICAgIGlmIChzWzFdID09ICdoJyAmJiBzWzJdID09ICdpJyAmJiBzWzNdID09ICcxJyAmJiBzWzRdID09ICc2JykKLQl7Ci0JICBzICs9IDU7Ci0JICAqcGFnZSA9ICdoJzsKLQl9Ci0gICAgICBlbHNlIGlmIChzWzFdID09ICdvJyAmJiBzWzJdID09ICdmJyAmJiBzWzNdID09ICdmJykKLQl7Ci0JICBzICs9IDQ7Ci0JICAqcGFnZSA9ICdvJzsKLQl9Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0KLSAgZXhwcmVzc2lvbiAob3ApOwotICBpZiAob3AtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBleHBfc2lnbmVkLCBleHBfdW5zaWduZWQsIGV4cF9zYW5kdQotICB9IHNpZ25fdHlwZTsKLQotCi1zdGF0aWMgY2hhciAqCi1za2lwX2NvbG9udGhpbmcgKHNpZ24sIHB0ciwgZXhwLCBkZWYsIHNpemU4LCBzaXplMTYsIHNpemUyNCkKLSAgICAgc2lnbl90eXBlIHNpZ247Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpleHA7Ci0gICAgIGludCBkZWY7Ci0gICAgIGludCBzaXplODsKLSAgICAgaW50IHNpemUxNjsKLSAgICAgaW50IHNpemUyNDsKLXsKLSAgcHRyID0gcGFyc2VfZXhwIChwdHIsICZleHAtPmV4cCwgJmV4cC0+cGFnZSk7Ci0gIGlmICgqcHRyID09ICc6JykKLSAgICB7Ci0gICAgICBwdHIrKzsKLSAgICAgIGlmICgqcHRyID09ICc4JykKLQl7Ci0JICBwdHIrKzsKLQkgIGV4cC0+dHlwZSA9IHNpemU4OwotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnMScgJiBwdHJbMV0gPT0gJzYnKQotCXsKLQkgIHB0ciArPSAyOwotCSAgZXhwLT50eXBlID0gc2l6ZTE2OwotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnMicgJiBwdHJbMV0gPT0gJzQnKQotCXsKLQkgIGlmICghc2l6ZTI0KQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCI6MjQgbm90IHZhbGlkIGZvciB0aGlzIG9wY29kZSIpKTsKLQkgICAgfQotCSAgcHRyICs9IDI7Ci0JICBleHAtPnR5cGUgPSBzaXplMjQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiZXhwZWN0IDo4LDoxNiBvciA6MjQiKSk7Ci0JICBleHAtPnR5cGUgPSBzaXplMTY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChleHAtPnBhZ2UgPT0gJ3AnKQotCXsKLQkgIGV4cC0+dHlwZSA9IElNTTg7Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5wYWdlID09ICdoJykKLQl7Ci0JICBleHAtPnR5cGUgPSBJTU0xNjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTGV0J3Mgd29yayBvdXQgdGhlIHNpemUgZnJvbSB0aGUgY29udGV4dCAqLwotCSAgaW50IG4gPSBleHAtPmV4cC5YX2FkZF9udW1iZXI7Ci0JICBpZiAoc2l6ZTgKLQkgICAgICAmJiBleHAtPmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiAoKHNpZ24gPT0gZXhwX3NpZ25lZCAmJiAobiA+PSAtMTI4ICYmIG4gPD0gMTI3KSkKLQkJICB8fCAoc2lnbiA9PSBleHBfdW5zaWduZWQgJiYgKG4gPj0gMCAmJiAobiA8PSAyNTUpKSkKLQkJICB8fCAoc2lnbiA9PSBleHBfc2FuZHUgJiYgKG4gPj0gLTEyOCAmJiAobiA8PSAyNTUpKSkpKQotCSAgICB7Ci0JICAgICAgZXhwLT50eXBlID0gc2l6ZTg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cC0+dHlwZSA9IGRlZjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX3JlZ2xpc3QgKHNyYywgb3ApCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcDsKLXsKLSAgaW50IG1vZGU7Ci0gIGludCBybjsKLSAgaW50IG1hc2sgPSAwOwotICBpbnQgcm07Ci0gIGludCBpZHggPSAxOwkJCS8qIHNraXAgKCAqLwotCi0gIHdoaWxlIChzcmNbaWR4XSAmJiBzcmNbaWR4XSAhPSAnKScpCi0gICAgewotICAgICAgaW50IGRvbmUgPSBwYXJzZV9yZWcgKHNyYyArIGlkeCwgJm1vZGUsICZybik7Ci0KLSAgICAgIGlmIChkb25lKQotCXsKLQkgIGlkeCArPSBkb25lOwotCSAgbWFzayB8PSAxIDw8IHJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiByZWcgbGlzdCIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmIChzcmNbaWR4XSA9PSAnLScpCi0JewotCSAgaWR4Kys7Ci0JICBkb25lID0gcGFyc2VfcmVnIChzcmMgKyBpZHgsICZtb2RlLCAmcm0pOwotCSAgaWYgKGRvbmUpCi0JICAgIHsKLQkgICAgICBpZHggKz0gZG9uZTsKLQkgICAgICB3aGlsZSAocm4gPD0gcm0pCi0JCXsKLQkJICBtYXNrIHw9IDEgPDwgcm47Ci0JCSAgcm4rKzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZmluYWwgcmVnaXN0ZXIgaW4gcmFuZ2UiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjW2lkeF0gPT0gJywnKQotCWlkeCsrOwotICAgIH0KLSAgaWR4Kys7Ci0gIG9wLT5leHAuWF9hZGRfc3ltYm9sID0gMDsKLSAgb3AtPmV4cC5YX29wX3N5bWJvbCA9IDA7Ci0gIG9wLT5leHAuWF9hZGRfbnVtYmVyID0gbWFzazsKLSAgb3AtPmV4cC5YX29wID0gT19jb25zdGFudDsKLSAgb3AtPmV4cC5YX3Vuc2lnbmVkID0gMTsKLSAgb3AtPnR5cGUgPSBJTU04OwotICByZXR1cm4gaWR4OwotCi19Ci0KLS8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6Ci0KLSAgIFJuCQkJUmVnaXN0ZXIgZGlyZWN0Ci0gICBAUm4JCQlSZWdpc3RlciBpbmRpcmVjdAotICAgQChkaXNwWzpzaXplXSwgUm4pCVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0gICBAUm4rCi0gICBALVJuCi0gICBAYWFbOnNpemVdCQlhYnNvbHV0ZQotICAgI3h4WzpzaXplXQkJaW1tZWRpYXRlIGRhdGEKLQotICAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9vcGVyYW5kIChwdHIsIG9wLCBpc3BhZ2UpCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3A7Ci0gICAgIGNoYXIgaXNwYWdlOwotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgbW9kZTsKLSAgdW5zaWduZWQgaW50IG51bTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgb3AtPnBhZ2UgPSAwOwotICBpZiAoc3JjWzBdID09ICcoJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSByZWdpc3RlciBsaXN0ICovCi0gICAgICAqcHRyID0gc3JjICsgcGFyc2VfcmVnbGlzdCAoc3JjLCBvcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmb3AtPnR5cGUsICZvcC0+cmVnKTsKLQotICBpZiAobGVuKQotICAgIHsKLSAgICAgICpwdHIgPSBzcmMgKyBsZW47Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3JjID09ICdAJykKLSAgICB7Ci0gICAgICBzcmMrKzsKLSAgICAgIGlmICgqc3JjID09ICctJykKLQl7Ci0JICBzcmMrKzsKLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm51bSk7Ci0JICBpZiAobGVuID09IDApCi0JICAgIHsKLQkgICAgICAvKiBPb3BzLCBub3QgYSByZWcgYWZ0ZXIgYWxsLCBtdXN0IGJlIG9yZGluYXJ5IGV4cCAqLwotCSAgICAgIHNyYy0tOwotCSAgICAgIC8qIG11c3QgYmUgYSBzeW1ib2wgKi8KLQkgICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChleHBfdW5zaWduZWQsIHNyYywKLQkJCQkgICAgICBvcCwgQUJTMTYsIEFCUzgsIEFCUzE2LCBBQlMyNCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIG9wLT50eXBlID0gUk5ERUM7Ci0JICBvcC0+cmVnID0gbnVtOwotCSAgKnB0ciA9IHNyYyArIGxlbjsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoKnNyYyA9PSAnKCcpCi0JewotCSAgLyogRGlzcCAqLwotCSAgc3JjKys7Ci0KLQkgIHNyYyA9IHNraXBfY29sb250aGluZyAoZXhwX3NpZ25lZCwgc3JjLCAKLQkJCQkgb3AsIFJOSU5EX0QxNiwgUk5JTkRfRDgsIFJOSU5EX0QxNiwgMCk7Ci0KLQkgIGlmICgqc3JjICE9ICcsJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIFJuKSIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHNyYysrOwotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmb3AtPnJlZyk7Ci0JICBpZiAobGVuID09IDAgfHwgbW9kZSAhPSBSTikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIFJuKSIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHNyYyArPSBsZW47Ci0JICBpZiAoKnNyYyAhPSAnKScpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCBSbikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAqcHRyID0gc3JjICsgMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0pOwotCi0gICAgICBpZiAobGVuKQotCXsKLQkgIHNyYyArPSBsZW47Ci0JICBpZiAoKnNyYyA9PSAnKycpCi0JICAgIHsKLQkgICAgICBzcmMrKzsKLQkgICAgICBpZiAobW9kZSAhPSBSTikKLQkJewotCQkgIGFzX2JhZCAoXygiQFJuKyBuZWVkcyB3b3JkIHJlZ2lzdGVyIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIG9wLT50eXBlID0gUk5JTkM7Ci0JICAgICAgb3AtPnJlZyA9IG51bTsKLQkgICAgICAqcHRyID0gc3JjOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgaWYgKG1vZGUgIT0gUk4pCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkBSbiBuZWVkcyB3b3JkIHJlZ2lzdGVyIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgb3AtPnR5cGUgPSBSTklORDsKLQkgIG9wLT5yZWcgPSBudW07Ci0JICAqcHRyID0gc3JjOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCi0JICAqcHRyID0KLQkgICAgc2tpcF9jb2xvbnRoaW5nIChleHBfdW5zaWduZWQsIHNyYywgb3AsCi0JCQkgICAgIGlzcGFnZSA/IEFCUzI0IDogQUJTMTYsIEFCUzgsIEFCUzE2LCBBQlMyNCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoKnNyYyA9PSAnIycpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChleHBfc2FuZHUsIHNyYywgb3AsIElNTTE2LCBJTU04LCBJTU0xNiwgQUJTMjQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKGV4cF9zaWduZWQsIHNyYywgb3AsCi0JCQkgICAgICBpc3BhZ2UgPyBBQlMyNCA6IFBDUkVMOCwgUENSRUw4LCBQQ1JFTDE2LCBBQlMyNCk7Ci0gICAgfQotfQotCi1zdGF0aWMKLWNoYXIgKgotZ2V0X29wZXJhbmRzIChpbmZvLCBhcmdzLCBvcGVyYW5kKQotICAgICBoODUwMF9vcGNvZGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYXJnczsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOwotCi17Ci0gIGNoYXIgKnB0ciA9IGFyZ3M7Ci0KLSAgc3dpdGNoIChpbmZvLT5uYXJncykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgb3BlcmFuZFswXS50eXBlID0gMDsKLSAgICAgIG9wZXJhbmRbMV0udHlwZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCBpbmZvLT5uYW1lWzBdID09ICdwJyk7Ci0gICAgICBvcGVyYW5kWzFdLnR5cGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAotICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcwotICAgcHJvdmlkZWQKLSAgICovCi0KLWludCBwY3JlbDg7CQkJLyogU2V0IHdoZW4gd2UndmUgc2VlbiBhIHBjcmVsIG9wZXJhbmQgKi8KLQotc3RhdGljCi1oODUwMF9vcGNvZGVfaW5mbyAqCi1nZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZHMpCi0gICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZHM7Ci17Ci0gIGg4NTAwX29wY29kZV9pbmZvICp0aGlzX3RyeSA9IG9wY29kZTsKLSAgaW50IGZvdW5kID0gMDsKLSAgdW5zaWduZWQgaW50IG5vcGVyYW5kcyA9IG9wY29kZS0+bmFyZ3M7Ci0KLSAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSBvcGNvZGUtPmlkeDsKLQotICB3aGlsZSAodGhpc19pbmRleCA9PSBvcGNvZGUtPmlkeCAmJiAhZm91bmQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIHRoaXNfdHJ5ID0gb3Bjb2RlKys7Ci0KLSAgICAgIC8qIGxvb2sgYXQgYm90aCBvcGVyYW5kcyBuZWVkZWQgYnkgdGhlIG9wY29kZXMgYW5kIHByb3ZpZGVkIGJ5Ci0gICAgICAgdGhlIHVzZXIqLwotICAgICAgZm9yIChpID0gMDsgaSA8IG5vcGVyYW5kczsgaSsrKQotCXsKLQkgIGg4NTAwX29wZXJhbmRfaW5mbyAqdXNlciA9IG9wZXJhbmRzICsgaTsKLQotCSAgc3dpdGNoICh0aGlzX3RyeS0+YXJnX3R5cGVbaV0pCi0JICAgIHsKLQkgICAgY2FzZSBGUElORF9EODoKLQkgICAgICAvKiBPcGNvZGUgbmVlZHMgKGRpc3A6OCxmcCkgKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EOCAmJiB1c2VyLT5yZWcgPT0gNikKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EX0QxNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EMTYpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgcmQgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EOCkKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICByZCA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5EX0QxNjoKLQkgICAgY2FzZSBSTklORF9EODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSB0aGlzX3RyeS0+YXJnX3R5cGVbaV0pCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgcm4gPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNQREVDOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOREVDICYmIHVzZXItPnJlZyA9PSA3KQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUElOQzoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklOQyAmJiB1c2VyLT5yZWcgPT0gNykKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMTY6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTMTYpCi0JCXsKLQkJICBhYnNvbHV0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTOCkKLQkJewotCQkgIGFic29sdXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMjQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTMjQpCi0JCXsKLQkJICBhYnNvbHV0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ1JCOgotCSAgICAgIGlmICgodXNlci0+dHlwZSA9PSBDUkIgfHwgdXNlci0+dHlwZSA9PSBDUikgJiYgdXNlci0+cmVnICE9IDApCi0JCXsKLQkJICBjcmIgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUlc6Ci0JICAgICAgaWYgKCh1c2VyLT50eXBlID09IENSVyB8fCB1c2VyLT50eXBlID09IENSKSAmJiB1c2VyLT5yZWcgPT0gMCkKLQkJewotCQkgIGNydyA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1AxNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBESVNQMTYpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBESVNQOCkKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOICYmIHVzZXItPnJlZyA9PSA2KQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDE2OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFBDUkVMMTYpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUENSRUw4KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIHBjcmVsOCA9IDE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIElNTTE2OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IElNTTE2Ci0JCSAgfHwgdXNlci0+dHlwZSA9PSBJTU04KQotCQl7Ci0JCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7Ci0JCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkxJU1Q6Ci0JICAgIGNhc2UgSU1NODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU04KQotCQl7Ci0JCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7Ci0JCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NNDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU04KQotCQl7Ci0JCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7Ci0JCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUUlNOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IElNTTgKLQkJICAmJiB1c2VyLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgJiYKLQkJICAodXNlci0+ZXhwLlhfYWRkX251bWJlciA9PSAtMgotCQkgICB8fCB1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IC0xCi0JCSAgIHx8IHVzZXItPmV4cC5YX2FkZF9udW1iZXIgPT0gMQotCQkgICB8fCB1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IDIpKQotCQl7Ci0JCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7Ci0JCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk4pCi0JCXsKLQkJICByZCA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJTOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOKQotCQl7Ci0JCSAgcnMgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORCkKLQkJewotCQkgIHJkID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCi0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklOQzoKLQkgICAgY2FzZSBSTklORDoKLQkgICAgY2FzZSBSTkRFQzoKLQkgICAgY2FzZSBSTjoKLQotCSAgICAgIGlmICh1c2VyLT50eXBlID09IHRoaXNfdHJ5LT5hcmdfdHlwZVtpXSkKLQkJewotCQkgIHJuID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1A6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk4gJiYgdXNlci0+cmVnID09IDcpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHByaW50ZiAoXygidW5oYW5kbGVkICVkXG4iKSwgdGhpc190cnktPmFyZ190eXBlW2ldKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBnZXQgaGVyZSB0aGlzIGRpZG4ndCB3b3JrIG91dCAqLwotCSAgZ290byBmYWlsOwotCX0KLSAgICAgIGZvdW5kID0gMTsKLSAgICBmYWlsOjsKLQotICAgIH0KLQotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRoaXNfdHJ5OwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7Ci0gICAgIGludCBsb3c7Ci0gICAgIGludCBoaWdoOwotewotICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiksIGxvdywgaGlnaCk7Ci0gICAgfQotICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotfQotCi1zdGF0aWMKLXZvaWQKLWluc2VydCAob3V0cHV0LCBpbmRleCwgZXhwLCByZWxvYywgcGNyZWwpCi0gICAgIGNoYXIgKm91dHB1dDsKLSAgICAgaW50IGluZGV4OwotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgcmVsb2M7Ci0gICAgIGludCBwY3JlbDsKLXsKLSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGluZGV4LAotCSAgICAgICA0LAkgICAgICAgCS8qIGFsd2F5cyBzYXkgc2l6ZSBpcyA0LCBidXQgd2Uga25vdyBiZXR0ZXIgKi8KLQkgICAgICAgZXhwLAotCSAgICAgICBwY3JlbCwKLQkgICAgICAgcmVsb2MpOwotfQotCi12b2lkCi1idWlsZF9yZWxheGFibGVfaW5zdHJ1Y3Rpb24gKG9wY29kZSwgb3BlcmFuZCkKLSAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOwotewotICAvKiBBbGwgcmVsYXhhYmxlIGluc3RydWN0aW9ucyBzdGFydCBsaWZlIGFzIHR3byBieXRlcyBidXQgY2FuIGJlY29tZQotICAgICB0aHJlZSBieXRlcyBsb25nIGlmIGEgbG9uZWx5IGJyYW5jaCBhbmQgdXAgdG8gOSBieXRlcyBpZiBsb25nIHNjYgotICAgICAqLwotICBjaGFyICpwOwotICBpbnQgbGVuOwotICBpbnQgdHlwZTsKLQotICBpZiAob3Bjb2RlLT5ieXRlc1swXS5jb250ZW50cyA9PSAweDAxKQotICAgIHsKLSAgICAgIHR5cGUgPSBTQ0JfRjsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgPT0gMHgwNgotCSAgIHx8IG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgPT0gMHgwNykKLSAgICB7Ci0gICAgICB0eXBlID0gU0NCX1RTVDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0eXBlID0gQlJBTkNIOwotICAgIH0KLQotICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQltZF9yZWxheF90YWJsZVtDICh0eXBlLCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoLAotCQlsZW4gPSBtZF9yZWxheF90YWJsZVtDICh0eXBlLCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoLAotCQlDICh0eXBlLCBVTkRFRl9CWVRFX0RJU1ApLAotCQlkaXNwbGFjZW1lbnQuWF9hZGRfc3ltYm9sLAotCQlkaXNwbGFjZW1lbnQuWF9hZGRfbnVtYmVyLAotCQkwKTsKLQotICBwWzBdID0gb3Bjb2RlLT5ieXRlc1swXS5jb250ZW50czsKLSAgaWYgKHR5cGUgIT0gQlJBTkNIKQotICAgIHsKLSAgICAgIHBbMV0gPSBvcGNvZGUtPmJ5dGVzWzFdLmNvbnRlbnRzIHwgcnM7Ci0gICAgfQotfQotCi0vKiBOb3cgd2Uga25vdyB3aGF0IHNvcnQgb2Ygb3Bjb2RlcyBpdCBpcywgbGV0cyBidWlsZCB0aGUgYnl0ZXMgLQotICovCi1zdGF0aWMgdm9pZAotYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCkKLSAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOwotCi17Ci0gIGludCBpbmRleDsKLQotICBpZiAocGNyZWw4KQotICAgIHsKLSAgICAgIHBjcmVsOCA9IDA7Ci0gICAgICBidWlsZF9yZWxheGFibGVfaW5zdHJ1Y3Rpb24gKG9wY29kZSwgb3BlcmFuZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqb3V0cHV0ID0gZnJhZ19tb3JlIChvcGNvZGUtPmxlbmd0aCk7Ci0KLSAgICAgIG1lbXNldCAob3V0cHV0LCAwLCBvcGNvZGUtPmxlbmd0aCk7Ci0gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvcGNvZGUtPmxlbmd0aDsgaW5kZXgrKykKLQl7Ci0JICBvdXRwdXRbaW5kZXhdID0gb3Bjb2RlLT5ieXRlc1tpbmRleF0uY29udGVudHM7Ci0KLQkgIHN3aXRjaCAob3Bjb2RlLT5ieXRlc1tpbmRleF0uaW5zZXJ0KQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmIChfKCJmYWlsZWQgZm9yICVkXG4iKSwgb3Bjb2RlLT5ieXRlc1tpbmRleF0uaW5zZXJ0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAwOgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOOgotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gcm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ6Ci0JICAgIGNhc2UgUkRJTkQ6Ci0JICAgICAgCi0JICAgICAgb3V0cHV0W2luZGV4XSB8PSByZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSUzoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IHJzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1AxNjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfSU1NMTYsIDApOwotCSAgICAgIGluZGV4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRElTUDg6Ci0JICAgIGNhc2UgRlBJTkRfRDg6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmZGlzcGxhY2VtZW50LCBSX0g4NTAwX0lNTTgsIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgSU1NMTY6Ci0JICAgICAgewotCQlpbnQgcDsKLQkJc3dpdGNoIChpbW1lZGlhdGVfaW5wYWdlKSB7Ci0JCWNhc2UgJ3AnOgotCQkgIHAgPSBSX0g4NTAwX0hJR0gxNjsKLQkJICBicmVhazsKLQkJY2FzZSAnaCc6CQkKLQkJICBwID0gUl9IODUwMF9ISUdIMTY7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgcCA9IFJfSDg1MDBfSU1NMTY7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkJCi0JCWluc2VydCAob3V0cHV0LCBpbmRleCwgJmltbWVkaWF0ZSxwLCAwKTsKLQkgICAgICB9Ci0JCQotCSAgICAgIGluZGV4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkxJU1Q6Ci0JICAgIGNhc2UgSU1NODoKLQkgICAgICBpZiAoaW1tZWRpYXRlX2lucGFnZSkKLQkJewotCQkgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmltbWVkaWF0ZSwgUl9IODUwMF9ISUdIOCwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZpbW1lZGlhdGUsIFJfSDg1MDBfSU1NOCwgMCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDE2OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmRpc3BsYWNlbWVudCwgUl9IODUwMF9QQ1JFTDE2LCAxKTsKLQkgICAgICBpbmRleCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMODoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfUENSRUw4LCAxKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU00OgotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY2hlY2sgKCZpbW1lZGlhdGUsIDAsIDE1KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUjoKLQotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY3I7Ci0JICAgICAgaWYgKGNyID09IDApCi0JCXsKLQkJICBvdXRwdXRbMF0gfD0gMHg4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb3V0cHV0WzBdICY9IH4weDg7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ1JCOgotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY3JiOwotCSAgICAgIG91dHB1dFswXSAmPSB+MHg4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSVzoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNydzsKLQkgICAgICBvdXRwdXRbMF0gfD0gMHg4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzI0OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmFic29sdXRlLCBSX0g4NTAwX0lNTTI0LCAwKTsKLQkgICAgICBpbmRleCArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzE2OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmFic29sdXRlLCBSX0g4NTAwX0lNTTE2LCAwKTsKLQkgICAgICBpbmRleCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzg6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmYWJzb2x1dGUsIFJfSDg1MDBfSU1NOCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUUlNOgotCSAgICAgIHN3aXRjaCAoaW1tZWRpYXRlLlhfYWRkX251bWJlcikKLQkJewotCQljYXNlIC0yOgotCQkgIG91dHB1dFtpbmRleF0gfD0gMHg1OwotCQkgIGJyZWFrOwotCQljYXNlIC0xOgotCQkgIG91dHB1dFtpbmRleF0gfD0gMHg0OwotCQkgIGJyZWFrOwotCQljYXNlIDE6Ci0JCSAgb3V0cHV0W2luZGV4XSB8PSAwOwotCQkgIGJyZWFrOwotCQljYXNlIDI6Ci0JCSAgb3V0cHV0W2luZGV4XSB8PSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jaXRvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotdm9pZAotREVGVU4gKG1kX2Fzc2VtYmxlLCAoc3RyKSwKLSAgICAgICBjaGFyICpzdHIpCi17Ci0gIGNoYXIgKm9wX3N0YXJ0OwotICBjaGFyICpvcF9lbmQ7Ci0gIGg4NTAwX29wZXJhbmRfaW5mbyBvcGVyYW5kWzJdOwotICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICBoODUwMF9vcGNvZGVfaW5mbyAqcHJldl9vcGNvZGU7Ci0gIGNoYXIgbmFtZVsxMV07Ci0KLSAgaW50IG5sZW4gPSAwOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBmaW5kIHRoZSBvcCBjb2RlIGVuZCAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOwotICAgICAgICpvcF9lbmQgJiYKLSAgICAgICAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgaWYgKAkJCS8qKm9wX2VuZCAhPSAnLicKLQkgICYmICpvcF9lbmQgIT0gJzonCi0JICAgCSAgIAkgICAJICAmJiAqLyBubGVuIDwgMTApCi0JewotCSAgbmFtZVtubGVuKytdID0gKm9wX2VuZDsKLQl9Ci0gICAgfQotICBuYW1lW25sZW5dID0gMDsKLQotICBpZiAob3BfZW5kID09IG9wX3N0YXJ0KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLQotICBvcGNvZGUgPSAoaDg1MDBfb3Bjb2RlX2luZm8gKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBuYW1lKTsKLQotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwgb3BlcmFuZCk7Ci0gIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotCi0gIG9wY29kZSA9IGdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kKTsKLQotICBpZiAob3Bjb2RlID09IDApCi0gICAgewotICAgICAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLSAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotICAgICAgd2hlcmVbMF0gPSAweDA7Ci0gICAgICB3aGVyZVsxXSA9IDB4MDsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWlsZF9ieXRlcyAob3Bjb2RlLCBvcGVyYW5kKTsKLQotfQotCi12b2lkCi1ERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi1zeW1ib2xTICoKLURFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCi0gICAgICAgY2hhciAqbmFtZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLURFRlVOICh0Y19oZWFkZXJzX2hvb2ssIChoZWFkZXJzKSwKLSAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAoKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi1zdGF0aWMKLXZvaWQKLXdvcmRpZnlfc2NiIChidWZmZXIsIGRpc3Bfc2l6ZSwgaW5zdF9zaXplKQotICAgICBjaGFyICpidWZmZXI7Ci0gICAgIGludCAqZGlzcF9zaXplOwotICAgICBpbnQgKmluc3Rfc2l6ZTsKLXsKLSAgaW50IHJuID0gYnVmZmVyWzFdICYgMHg3OwotCi0gIHN3aXRjaCAoYnVmZmVyWzBdKQotICAgIHsKLSAgICBjYXNlIDB4MGU6CQkJLyogQlNSICovCi0gICAgY2FzZSAweDIwOgotICAgIGNhc2UgMHgyMToKLSAgICBjYXNlIDB4MjI6Ci0gICAgY2FzZSAweDIzOgotICAgIGNhc2UgMHgyNDoKLSAgICBjYXNlIDB4MjU6Ci0gICAgY2FzZSAweDI2OgotICAgIGNhc2UgMHgyNzoKLSAgICBjYXNlIDB4Mjg6Ci0gICAgY2FzZSAweDI5OgotICAgIGNhc2UgMHgyYToKLSAgICBjYXNlIDB4MmI6Ci0gICAgY2FzZSAweDJjOgotICAgIGNhc2UgMHgyZDoKLSAgICBjYXNlIDB4MmU6Ci0gICAgY2FzZSAweDJmOgotICAgICAgYnVmZmVyWzBdIHw9IDB4MTA7Ci0gICAgICBidWZmZXJbMV0gPSAwOwotICAgICAgYnVmZmVyWzJdID0gMDsKLSAgICAgICpkaXNwX3NpemUgPSAyOwotICAgICAgKmluc3Rfc2l6ZSA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSAweDAxOgotICAgICAgKmluc3Rfc2l6ZSA9IDY7Ci0gICAgICAqZGlzcF9zaXplID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwNjoKLSAgICAgICppbnN0X3NpemUgPSA4OwotICAgICAgKmRpc3Bfc2l6ZSA9IDI7Ci0KLSAgICAgICpidWZmZXIrKyA9IDB4MjY7CQkvKiBibmUgKyA4ICovCi0gICAgICAqYnVmZmVyKysgPSAweDA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDA3OgotICAgICAgKmluc3Rfc2l6ZSA9IDg7Ci0gICAgICAqZGlzcF9zaXplID0gMjsKLSAgICAgICpidWZmZXIrKyA9IDB4Mjc7CQkvKiBibmUgKyA4ICovCi0gICAgICAqYnVmZmVyKysgPSAweDA4OwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gICpidWZmZXIrKyA9IDB4YTggfCBybjsJLyogYWRkcSAtMSxybiAqLwotICAqYnVmZmVyKysgPSAweDBjOwotICAqYnVmZmVyKysgPSAweDA0OwkJLyogY21wICMweGZmOjgsIHJuICovCi0gICpidWZmZXIrKyA9IDB4ZmY7Ci0gICpidWZmZXIrKyA9IDB4NzAgfCBybjsKLSAgKmJ1ZmZlcisrID0gMHgzNjsJCS8qIGJuZSAuLi4gKi8KLSAgKmJ1ZmZlcisrID0gMDsKLSAgKmJ1ZmZlcisrID0gMDsKLX0KLQotLyoKLWNhbGxlZCBhZnRlciByZWxheGluZywgY2hhbmdlIHRoZSBmcmFncyBzbyB0aGV5IGtub3cgaG93IGJpZyB0aGV5IGFyZQotKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGludCBkaXNwX3NpemUgPSAwOwotICBpbnQgaW5zdF9zaXplID0gMDsKLSAgY2hhciAqYnVmZmVyID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQlJBTkNILCBCWVRFX0RJU1ApOgotICAgICAgZGlzcF9zaXplID0gMTsKLSAgICAgIGluc3Rfc2l6ZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoU0NCX0YsIEJZVEVfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfVFNULCBCWVRFX0RJU1ApOgotICAgICAgZGlzcF9zaXplID0gMTsKLSAgICAgIGluc3Rfc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogQnJhbmNoZXMgdG8gYSBrbm93biAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0KLSAgICAgIC8qIFR1cm4gb24gdGhlIDE2Yml0IGJpdCAqLwotICAgIGNhc2UgQyAoQlJBTkNILCBXT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX0YsIFdPUkRfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfVFNULCBXT1JEX0RJU1ApOgotICAgICAgd29yZGlmeV9zY2IgKGJ1ZmZlciwgJmRpc3Bfc2l6ZSwgJmluc3Rfc2l6ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQlJBTkNILCBVTkRFRl9XT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX0YsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfVFNULCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgLyogVGhpcyB0cmllZCB0byBiZSByZWxheGVkLCBidXQgZGlkbid0IG1hbmFnZSBpdCwgaXQgbm93IG5lZWRzIGEKLQkgZml4ICovCi0gICAgICB3b3JkaWZ5X3NjYiAoYnVmZmVyLCAmZGlzcF9zaXplLCAmaW5zdF9zaXplKTsKLQotICAgICAgLyogTWFrZSBhIHJlbG9jICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwKLQkgICAgICAgZnJhZ1AtPmZyX2ZpeCArIGluc3Rfc2l6ZSwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgUl9IODUwMF9QQ1JFTDE2KTsKLQotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIHJldHVybjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChpbnN0X3NpemUpCi0gICAgewotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uICovCi0gICAgICBpbnQgbmV4dF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzICsgZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgaW50IHRhcmdfYWRkciA9IChTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKwotCQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCk7Ci0gICAgICBpbnQgZGlzcCA9IHRhcmdfYWRkciAtIG5leHRfaW5zdDsKLQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXIgKyBpbnN0X3NpemUsIGRpc3AsIGRpc3Bfc2l6ZSk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgIH0KLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIHNpemUpCi0gICAgIHNlZ1Qgc2VnIDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpIAotCSAgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOwotCi19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9yX3R5cGUgPSBmaXhQLT5meF9zaXplID09IDQgPyBSX0g4NTAwX0lNTTMyIDogUl9IODUwMF9JTU0xNjsKLSAgICB9Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotCi0gICAgY2FzZSBSX0g4NTAwX0lNTTg6Ci0gICAgY2FzZSBSX0g4NTAwX1BDUkVMODoKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgY2FzZSBSX0g4NTAwX1BDUkVMMTY6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0hJR0g4OgotICAgICAgKmJ1ZisrID0gdmFsID4+IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0hJR0gxNjoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAyNDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0zMjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgfQotfQotCi0vKgotY2FsbGVkIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbiwgcmV0dXJuIHRoZSBsZW5ndGgKLWJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvIHJlYWNoIGl0J3MgZGVzdGluYXRpb24KLSovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgQyAoQlJBTkNILCBVTkRFRl9CWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX0YsIFVOREVGX0JZVEVfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfVFNULCBVTkRFRl9CWVRFX0RJU1ApOgotICAgICAgLyogdXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24gKi8KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgLyogR290IGEgc3ltYm9sIGFuZCBpdCdzIGRlZmluZWQgaW4gdGhpcyBzZWdtZW50LCBiZWNvbWUgYnl0ZQotCSBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIEJZVEVfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSXRzIGdvdCBhIHNlZ21lbnQsIGJ1dCBpdHMgbm90IG91cnMsIHNvIGl0IHdpbGwgYWx3YXlzIGJlIGxvbmcgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgVU5ERUZfV09SRF9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIFdPUkRfRElTUCldLnJseF9sZW5ndGg7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGZyYWdQLT5mcl92YXI7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgdmFsdWVUIHVzZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQotICAgICBzeW1ib2xTICppZ25vcmU7Ci17Ci19Ci0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4X3B0cikKLSAgICAgZml4UyAqZml4X3B0cjsKLXsKLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgKi8KLSAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKLQl7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIFJfSDg1MDBfSU1NMTY7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICByZXR1cm4gUl9IODUwMF9JTU04OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHJldHVybiBmaXhfcHRyLT5meF9yX3R5cGU7Ci19Ci0KLXZvaWQKLXRjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKLSAgICAgZml4UyAqZml4X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOwotICAgICBiZmRfdm1hIGJhc2U7Ci0KLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKLQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU04OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLwotICBpZiAoc3ltYm9sX3B0cikKLSAgICB7Ci0gICAgICBzeW1ib2xTICpkb3Q7Ci0KLSAgICAgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OwotICAgICAgaWYgKGRvdCkKLQl7Ci0JICAvKgkgIGludHItPnJfb2Zmc2V0IC09Ci0JICAgIHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UKHN5bWJvbF9wdHIpXS5zY25oZHIuc19wYWRkcjsqLwotCSAgaW50ci0+cl9vZmZzZXQgKz0gU19HRVRfVkFMVUUgKHN5bWJvbF9wdHIpOwotCSAgaW50ci0+cl9zeW1uZHggPSBkb3QtPnN5X251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50ci0+cl9zeW1uZHggPSBzeW1ib2xfcHRyLT5zeV9udW1iZXI7Ci0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLSAgICB9Ci0KLX0KLQotCi0KLWludAotc3RhcnRfbGFiZWwgKHB0cikKLSAgICAgY2hhciAqcHRyOwotewotICAvKiBDaGVjayBmb3IgOnMudyAqLwotICBpZiAoaXNhbHBoYSAocHRyWzFdKSAmJiBwdHJbMl0gPT0gJy4nKQotICAgIHJldHVybiAwOwotICAvKiBDaGVjayBmb3IgOnMgKi8KLSAgaWYgKGlzYWxwaGEgKHB0clsxXSkgJiYgIWlzYWxwaGEgKHB0clsyXSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOwotfQotCi0vKiBlbmQgb2YgdGMtaDg1MDAuYyAqLwotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4NTAwLmggYi9nYXMvY29uZmlnL3RjLWg4NTAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTNlYzMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1oODUwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWg4NTAwLmgKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNkZWZpbmUgVENfSDg1MDAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBpbnRlcm5hbF9yZWxvYzsKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLQotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9oODUwMAotI2RlZmluZSBDT0ZGX01BR0lDIDB4ODUwMAotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKHgpLT5meF9hZGRzeXx8KHgpLT5meF9zdWJzeSkKLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUocyxhLGIsYykgdGNfcmVsb2NfbWFuZ2xlKGEsYixjKQotZXh0ZXJuIHZvaWQgdGNfcmVsb2NfbWFuZ2xlCi0gIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF92bWEpKTsKLQotI2RlZmluZSBET19OT1RfU1RSSVAgMAotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiSGl0YWNoaSBIOC81MDAgR0FTICIKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotI2RlZmluZSBSRUxPQ18zMiAxMjM0Ci0KLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2gsIHB0cikgIChjaCA9PSAnOicgJiYgc3RhcnRfbGFiZWwocHRyKSkKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBlbmQgb2YgdGMtaDg1MDAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmMgYi9nYXMvY29uZmlnL3RjLWhwcGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmMWZhOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWhwcGEuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ODkgKzAsMCBAQAotLyogdGMtaHBwYS5jIC0tIEFzc2VtYmxlIGZvciB0aGUgUEEKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogSFAgUEEtUklTQyBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0gICBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAiYmZkL2xpYmhwcGEuaCIKLSNpbmNsdWRlICJiZmQvbGliYmZkLmgiCi0KLS8qIEJlIGNhcmVmdWwsIHRoaXMgZmlsZSBpbmNsdWRlcyBkYXRhICpkZWNsYXJhdGlvbnMqLiAgKi8KLSNpbmNsdWRlICJvcGNvZGUvaHBwYS5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgJiYgZGVmaW5lZCAoT0JKX1NPTSkKLWVycm9yIG9ubHkgb25lIG9mIE9CSl9FTEYgYW5kIE9CSl9TT00gY2FuIGJlIGRlZmluZWQKLSNlbmRpZgotCi0vKiBBICJjb252aWVudCIgcGxhY2UgdG8gcHV0IG9iamVjdCBmaWxlIGRlcGVuZGVuY2llcyB3aGljaCBkbwotICAgbm90IG5lZWQgdG8gYmUgc2VlbiBvdXRzaWRlIG9mIHRjLWhwcGEuYy4gICovCi0jaWZkZWYgT0JKX0VMRgotLyogT2JqZWN0IGZpbGUgZm9ybWF0cyBzcGVjaWZ5IHJlbG9jYXRpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbGZfaHBwYV9yZWxvY190eXBlIHJlbG9jX3R5cGU7Ci0KLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSBCRkQgc3ltYm9sIHR5cGVzLiAgKi8KLXR5cGVkZWYgZWxmX3N5bWJvbF90eXBlIG9ial9zeW1ib2xfdHlwZTsKLQotI2lmZGVmIEJGRDY0Ci0vKiBIb3cgdG8gZ2VuZXJhdGUgYSByZWxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgaHBwYV9nZW5fcmVsb2NfdHlwZSBfYmZkX2VsZjY0X2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSNlbHNlCi0jZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlCi0jZW5kaWYKLQotLyogRUxGIG9iamVjdHMgY2FuIGhhdmUgdmVyc2lvbnMsIGJ1dCBhcHBhcmVudGx5IGRvIG5vdCBoYXZlIGFueXdoZXJlCi0gICB0byBzdG9yZSBhIGNvcHlyaWdodCBzdHJpbmcuICAqLwotI2RlZmluZSBvYmpfdmVyc2lvbiBvYmpfZWxmX3ZlcnNpb24KLSNkZWZpbmUgb2JqX2NvcHlyaWdodCBvYmpfZWxmX3ZlcnNpb24KLSNlbmRpZgotCi0jaWZkZWYgT0JKX1NPTQotLyogTmFtZXMgb2YgdmFyaW91cyBkZWJ1Z2dpbmcgc3BhY2VzL3N1YnNwYWNlcy4gICovCi0jZGVmaW5lIEdEQl9ERUJVR19TUEFDRV9OQU1FICIkR0RCX0RFQlVHJCIKLSNkZWZpbmUgR0RCX1NUUklOR1NfU1VCU1BBQ0VfTkFNRSAiJEdEQl9TVFJJTkdTJCIKLSNkZWZpbmUgR0RCX1NZTUJPTFNfU1VCU1BBQ0VfTkFNRSAiJEdEQl9TWU1CT0xTJCIKLSNkZWZpbmUgVU5XSU5EX1NFQ1RJT05fTkFNRSAiJFVOV0lORCQiCi0KLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgaW50IHJlbG9jX3R5cGU7Ci0KLS8qIFNPTSBvYmplY3RzIGNhbiBoYXZlIGJvdGggYSB2ZXJzaW9uIHN0cmluZyBhbmQgYSBjb3B5cmlnaHQgc3RyaW5nLiAgKi8KLSNkZWZpbmUgb2JqX3ZlcnNpb24gb2JqX3NvbV92ZXJzaW9uCi0jZGVmaW5lIG9ial9jb3B5cmlnaHQgb2JqX3NvbV9jb3B5cmlnaHQKLQotLyogSG93IHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUKLQotLyogT2JqZWN0IGZpbGUgZm9ybWF0cyBzcGVjaWZ5IEJGRCBzeW1ib2wgdHlwZXMuICAqLwotdHlwZWRlZiBzb21fc3ltYm9sX3R5cGUgb2JqX3N5bWJvbF90eXBlOwotCi0vKiBUaGlzIGFwcGFyZW50bHkgaXNuJ3QgaW4gb2xkZXIgdmVyc2lvbnMgb2YgaHB1eCByZWxvYy5oLiAgKi8KLSNpZm5kZWYgUl9ETFRfUkVMCi0jZGVmaW5lIFJfRExUX1JFTCAweDc4Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjBTRUwKLSNkZWZpbmUgUl9OMFNFTCAweGQ4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX04xU0VMCi0jZGVmaW5lIFJfTjFTRUwgMHhkOQotI2VuZGlmCi0KLS8qIFZhcmlvdXMgc3RydWN0dXJlcyBhbmQgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGluIHRjLWhwcGEuYy4gICovCi0KLS8qIFVud2luZCB0YWJsZSBhbmQgZGVzY3JpcHRvci4gIEZJWE1FOiBTeW5jIHRoaXMgd2l0aCBHREIgdmVyc2lvbi4gICovCi0KLXN0cnVjdCB1bndpbmRfZGVzYwotICB7Ci0gICAgdW5zaWduZWQgaW50IGNhbm5vdF91bndpbmQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgbWlsbGljb2RlOjE7Ci0gICAgdW5zaWduZWQgaW50IG1pbGxpY29kZV9zYXZlX3Jlc3Q6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVnaW9uX2Rlc2M6MjsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9zcjoyOwotICAgIHVuc2lnbmVkIGludCBlbnRyeV9mcjo0OwotICAgIHVuc2lnbmVkIGludCBlbnRyeV9ncjo1OwotICAgIHVuc2lnbmVkIGludCBhcmdzX3N0b3JlZDoxOwotICAgIHVuc2lnbmVkIGludCBjYWxsX2ZyOjU7Ci0gICAgdW5zaWduZWQgaW50IGNhbGxfZ3I6NTsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9zcDoxOwotICAgIHVuc2lnbmVkIGludCBzYXZlX3JwOjE7Ci0gICAgdW5zaWduZWQgaW50IHNhdmVfcnBfaW5fZnJhbWU6MTsKLSAgICB1bnNpZ25lZCBpbnQgZXh0bl9wdHJfZGVmaW5lZDoxOwotICAgIHVuc2lnbmVkIGludCBjbGVhbnVwX2RlZmluZWQ6MTsKLQotICAgIHVuc2lnbmVkIGludCBocGVfaW50ZXJydXB0X21hcmtlcjoxOwotICAgIHVuc2lnbmVkIGludCBocHV4X2ludGVycnVwdF9tYXJrZXI6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MzsKLSAgICB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZToyNzsKLSAgfTsKLQotc3RydWN0IHVud2luZF90YWJsZQotICB7Ci0gICAgLyogU3RhcnRpbmcgYW5kIGVuZGluZyBvZmZzZXRzIG9mIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5Ci0gICAgICAgZGVzY3JpcHRvci4gICovCi0gICAgdW5zaWduZWQgaW50IHN0YXJ0X29mZnNldDsKLSAgICB1bnNpZ25lZCBpbnQgZW5kX29mZnNldDsKLSAgICBzdHJ1Y3QgdW53aW5kX2Rlc2MgZGVzY3JpcHRvcjsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgLmNhbGxpbmZvLCAuZW50ZXIsIC5sZWF2ZSBwc2V1ZG8tb3BzIHRvCi0gICBjb250cm9sIHRoZSBlbnRyeSBhbmQgZXhpdCBjb2RlIHRoZXkgZ2VuZXJhdGUuIEl0IGlzIGFsc28gdXNlZCBpbgotICAgY3JlYXRpb24gb2YgdGhlIGNvcnJlY3Qgc3RhY2sgdW53aW5kIGRlc2NyaXB0b3JzLgotCi0gICBOT1RFOiAgR0FTIGRvZXMgbm90IHN1cHBvcnQgLmVudGVyIGFuZCAubGVhdmUgZm9yIHRoZSBnZW5lcmF0aW9uIG9mCi0gICBwcm9sb2d1ZXMgYW5kIGVwaWxvZ3Vlcy4gIEZJWE1FLgotCi0gICBUaGUgZmllbGRzIGluIHN0cnVjdHVyZSByb3VnaGx5IGNvcnJlc3BvbmQgdG8gdGhlIGFyZ3VtZW50cyBhdmFpbGFibGUgb24gdGhlCi0gICAuY2FsbGluZm8gcHNldWRvLW9wLiAgKi8KLQotc3RydWN0IGNhbGxfaW5mbwotICB7Ci0gICAgLyogVGhlIHVud2luZCBkZXNjcmlwdG9yIGJlaW5nIGJ1aWx0LiAgKi8KLSAgICBzdHJ1Y3QgdW53aW5kX3RhYmxlIGNpX3Vud2luZDsKLQotICAgIC8qIE5hbWUgb2YgdGhpcyBmdW5jdGlvbi4gICovCi0gICAgc3ltYm9sUyAqc3RhcnRfc3ltYm9sOwotCi0gICAgLyogKHRlbXBvcmFyeSkgc3ltYm9sIHVzZWQgdG8gbWFyayB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uICAqLwotICAgIHN5bWJvbFMgKmVuZF9zeW1ib2w7Ci0KLSAgICAvKiBOZXh0IGVudHJ5IGluIHRoZSBjaGFpbi4gICovCi0gICAgc3RydWN0IGNhbGxfaW5mbyAqY2lfbmV4dDsKLSAgfTsKLQotLyogT3BlcmFuZCBmb3JtYXRzIGZvciBGUCBpbnN0cnVjdGlvbnMuICAgTm90ZSBub3QgYWxsIEZQIGluc3RydWN0aW9ucwotICAgYWxsb3cgYWxsIGZvdXIgZm9ybWF0cyB0byBiZSB1c2VkIChmb3IgZXhhbXBsZSBmbXB5c3ViIG9ubHkgYWxsb3dzCi0gICBTR0wgYW5kIERCTCkuICAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBTR0wsIERCTCwgSUxMRUdBTF9GTVQsIFFVQUQsIFcsIFVXLCBEVywgVURXLCBRVywgVVFXCi0gIH0KLWZwX29wZXJhbmRfZm9ybWF0OwotCi0vKiBUaGlzIGZ1bGx5IGRlc2NyaWJlcyB0aGUgc3ltYm9sIHR5cGVzIHdoaWNoIG1heSBiZSBhdHRhY2hlZCB0bwotICAgYW4gRVhQT1JUIG9yIElNUE9SVCBkaXJlY3RpdmUuICBPbmx5IFNPTSB1c2VzIHRoaXMgZm9ybWF0aW9uCi0gICAoRUxGIGhhcyBubyBuZWVkIGZvciBpdCkuICAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBTWU1CT0xfVFlQRV9VTktOT1dOLAotICAgIFNZTUJPTF9UWVBFX0FCU09MVVRFLAotICAgIFNZTUJPTF9UWVBFX0NPREUsCi0gICAgU1lNQk9MX1RZUEVfREFUQSwKLSAgICBTWU1CT0xfVFlQRV9FTlRSWSwKLSAgICBTWU1CT0xfVFlQRV9NSUxMSUNPREUsCi0gICAgU1lNQk9MX1RZUEVfUExBQkVMLAotICAgIFNZTUJPTF9UWVBFX1BSSV9QUk9HLAotICAgIFNZTUJPTF9UWVBFX1NFQ19QUk9HLAotICB9Ci1wYV9zeW1ib2xfdHlwZTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGFzc2VtYmxlCi0gICBpbmRpdmlkdWFsIGluc3RydWN0aW9ucy4gICovCi1zdHJ1Y3QgcGFfaXQKLSAgewotICAgIC8qIEhvbGRzIHRoZSBvcGNvZGUgYWZ0ZXIgcGFyc2luZyBieSBwYV9pcC4gICovCi0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgICAvKiBIb2xkcyBhbiBleHByZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi0gICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgLyogRG9lcyB0aGlzIGluc3RydWN0aW9uIHVzZSBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nLiAgKi8KLSAgICBpbnQgcGNyZWw7Ci0KLSAgICAvKiBGbG9hdGluZyBwb2ludCBmb3JtYXRzIGZvciBvcGVyYW5kMSBhbmQgb3BlcmFuZDIuICAqLwotICAgIGZwX29wZXJhbmRfZm9ybWF0IGZwb2YxOwotICAgIGZwX29wZXJhbmRfZm9ybWF0IGZwb2YyOwotCi0KLSAgICAvKiBIb2xkcyB0aGUgZmllbGQgc2VsZWN0b3IgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24KLSAgICAgICAoZm9yIGV4YW1wbGUgTCUsIExSJSwgZXRjKS4gICovCi0gICAgbG9uZyBmaWVsZF9zZWxlY3RvcjsKLQotICAgIC8qIEhvbGRzIGFueSBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgICBpbnN0cnVjdGlvbi4gIChpbnN0cnVjdGlvbiBzaG91bGQgYmUgc29tZSBzb3J0IG9mIGNhbGwpLiAgKi8KLSAgICBsb25nIGFyZ19yZWxvYzsKLQotICAgIC8qIFRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgaW50IGZvcm1hdDsKLQotICAgIC8qIFRoZSByZWxvY2F0aW9uIChpZiBhbnkpIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICByZWxvY190eXBlIHJlbG9jOwotICB9OwotCi0vKiBQQS04OSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYXJlIGFycmFuZ2VkIGxpa2UgdGhpczoKLQotCi0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAgMCBvciAxNkwgICB8ICAxNiBvciAxNlIgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAgMSBvciAxN0wgICB8ICAxNyBvciAxN1IgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8Ci0KLSAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KLSAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KLSAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KLQotICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotICAgfCAgMTQgb3IgMzBMICAgfCAgMzAgb3IgMzBSICAgfAotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotICAgfCAgMTUgb3IgMzFMICAgfCAgMzEgb3IgMzFSICAgfAotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotCi0KLSAgIFRoZSBmb2xsb3dpbmcgaXMgYSB2ZXJzaW9uIG9mIHBhX3BhcnNlX251bWJlciB0aGF0Ci0gICBoYW5kbGVzIHRoZSBML1Igbm90YXRpb24gYW5kIHJldHVybnMgdGhlIGNvcnJlY3QKLSAgIHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBpbnN0cnVjdGlvbiByZWdpc3RlciBmaWVsZC4KLSAgIFRoZSBjb3JyZWN0IHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBpcwotICAgZW5jb2RlZCBpbiB0aGUgc3RydWN0dXJlICdwYV8xMV9mcF9yZWdfc3RydWN0Jy4gICovCi0KLXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0Ci0gIHsKLSAgICAvKiBUaGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICBjaGFyIG51bWJlcl9wYXJ0OwotCi0gICAgLyogTC9SIHNlbGVjdG9yLiAgKi8KLSAgICBjaGFyIGxfcl9zZWxlY3Q7Ci0gIH07Ci0KLS8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YnMuICAqLwotc3RydWN0IGNhbGxfZGVzYwotICB7Ci0gICAgLyogVGhlIGFyZ3VtZW50IHJlbG9jYXRpb24gc3BlY2lmaWNhdGlvbi4gICovCi0gICAgdW5zaWduZWQgaW50IGFyZ19yZWxvYzsKLQotICAgIC8qIE51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICAgIHVuc2lnbmVkIGludCBhcmdfY291bnQ7Ci0gIH07Ci0KLSNpZmRlZiBPQkpfU09NCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGVudHJ5IGluIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5Ci0gICBjaGFpbi4gICovCi0KLXN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluCi0gIHsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgaGFzIGJlZW4gZGVmaW5lZCBieSB0aGUgdXNlciBjb2RlLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgc3NkX2RlZmluZWQ7Ci0KLSAgICAvKiBOYW1lIG9mIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIGNoYXIgKnNzZF9uYW1lOwotCi0gICAgLyogR0FTIHNlZ21lbnQgYW5kIHN1YnNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIGFzZWN0aW9uICpzc2Rfc2VnOwotICAgIGludCBzc2Rfc3Vic2VnOwotCi0gICAgLyogTmV4dCBzcGFjZSBpbiB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeSBjaGFpbi4gICovCi0gICAgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gKnNzZF9uZXh0OwotICB9OwotCi10eXBlZGVmIHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluIHNzZF9jaGFpbl9zdHJ1Y3Q7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkKLSAgIGNoYWluLiAgKi8KLQotc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4KLSAgewotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyIGNvZGUgb3IKLSAgICAgICBhcyBhIGRlZmF1bHQgc3BhY2UuICAqLwotICAgIHVuc2lnbmVkIGludCBzZF9kZWZpbmVkOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlcyBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyIGNvZGUuICAqLwotICAgIHVuc2lnbmVkIGludCBzZF91c2VyX2RlZmluZWQ7Ci0KLSAgICAvKiBUaGUgc3BhY2UgbnVtYmVyIChvciBpbmRleCkuICAqLwotICAgIHVuc2lnbmVkIGludCBzZF9zcG51bTsKLQotICAgIC8qIFRoZSBuYW1lIG9mIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIGNoYXIgKnNkX25hbWU7Ci0KLSAgICAvKiBHQVMgc2VnbWVudCB0byB3aGljaCB0aGlzIHN1YnNwYWNlIGNvcnJlc3BvbmRzLiAgKi8KLSAgICBhc2VjdGlvbiAqc2Rfc2VnOwotCi0gICAgLyogQ3VycmVudCBzdWJzZWdtZW50IG51bWJlciBiZWluZyB1c2VkLiAgKi8KLSAgICBpbnQgc2RfbGFzdF9zdWJzZWc7Ci0KLSAgICAvKiBUaGUgY2hhaW4gb2Ygc3Vic3BhY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGFjZS4gICovCi0gICAgc3NkX2NoYWluX3N0cnVjdCAqc2Rfc3Vic3BhY2VzOwotCi0gICAgLyogVGhlIG5leHQgZW50cnkgaW4gdGhlIHNwYWNlIGRpY3Rpb25hcnkgY2hhaW4uICAqLwotICAgIHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X2NoYWluICpzZF9uZXh0OwotICB9OwotCi10eXBlZGVmIHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X2NoYWluIHNkX2NoYWluX3N0cnVjdDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhdHRyaWJ1dGVzIG9mIHRoZSBkZWZhdWx0IHN1YnNwYWNlCi0gICBkaWN0aW9uYXJ5IGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgZGVmYXVsdF9zdWJzcGFjZV9kaWN0Ci0gIHsKLSAgICAvKiBOYW1lIG9mIHRoZSBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqbmFtZTsKLQotICAgIC8qIEZJWE1FLiAgSXMgdGhpcyBzdGlsbCBuZWVkZWQ/ICAqLwotICAgIGNoYXIgZGVmaW5lZDsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzdWJzcGFjZSBpcyBsb2FkYWJsZS4gICovCi0gICAgY2hhciBsb2FkYWJsZTsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzdWJzcGFjZSBjb250YWlucyBvbmx5IGNvZGUuICAqLwotICAgIGNoYXIgY29kZV9vbmx5OwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN1YnNwYWNlLiAgKi8KLSAgICBjaGFyIGNvbW1vbjsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGNvbW1vbiBzdWJzcGFjZSB3aGljaCBhbGxvd3Mgc3ltYm9scwotICAgICAgIHRvIGJlIG11bHRpcGx5IGRlZmluZWQuICAqLwotICAgIGNoYXIgZHVwX2NvbW1vbjsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzdWJzcGFjZSBzaG91bGQgYmUgemVybyBmaWxsZWQuICAqLwotICAgIGNoYXIgemVybzsKLQotICAgIC8qIFNvcnQga2V5IGZvciB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHNvcnQ7Ci0KLSAgICAvKiBBY2Nlc3MgY29udHJvbCBiaXRzIGZvciB0aGlzIHN1YnNwYWNlLiAgQ2FuIHJlcHJlc2VudCBSV1ggYWNjZXNzCi0gICAgICAgYXMgd2VsbCBhcyBwcml2aWxlZ2UgbGV2ZWwgY2hhbmdlcyBmb3IgZ2F0ZXdheXMuICAqLwotICAgIGludCBhY2Nlc3M7Ci0KLSAgICAvKiBJbmRleCBvZiBjb250YWluaW5nIHNwYWNlLiAgKi8KLSAgICBpbnQgc3BhY2VfaW5kZXg7Ci0KLSAgICAvKiBBbGlnbm1lbnQgKGluIGJ5dGVzKSBvZiB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICBpbnQgYWxpZ25tZW50OwotCi0gICAgLyogUXVhZHJhbnQgd2l0aGluIHNwYWNlIHdoZXJlIHRoaXMgc3Vic3BhY2Ugc2hvdWxkIGJlIGxvYWRlZC4gICovCi0gICAgaW50IHF1YWRyYW50OwotCi0gICAgLyogQW4gaW5kZXggaW50byB0aGUgZGVmYXVsdCBzcGFjZXMgYXJyYXkuICAqLwotICAgIGludCBkZWZfc3BhY2VfaW5kZXg7Ci0KLSAgICAvKiBTdWJzZWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICBzdWJzZWdUIHN1YnNlZ21lbnQ7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYXR0cmlidXRlcyBvZiB0aGUgZGVmYXVsdCBzcGFjZQotICAgZGljdGlvbmFyeSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGRlZmF1bHRfc3BhY2VfZGljdAotICB7Ci0gICAgLyogTmFtZSBvZiB0aGUgc3BhY2UuICAqLwotICAgIGNoYXIgKm5hbWU7Ci0KLSAgICAvKiBTcGFjZSBudW1iZXIuICBJdCBpcyBwb3NzaWJsZSB0byBpZGVudGlmeSBzcGFjZXMgd2l0aGluCi0gICAgICAgYXNzZW1ibHkgY29kZSBudW1lcmljYWxseSEgICovCi0gICAgaW50IHNwbnVtOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGlzIGxvYWRhYmxlLiAgKi8KLSAgICBjaGFyIGxvYWRhYmxlOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGlzICJkZWZpbmVkIi4gIEZJWE1FIGlzIHN0aWxsIG5lZWRlZCAqLwotICAgIGNoYXIgZGVmaW5lZDsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBjYW4gbm90IGJlIHNoYXJlZC4gICovCi0gICAgY2hhciBwcml2YXRlOwotCi0gICAgLyogU29ydCBrZXkgZm9yIHRoaXMgc3BhY2UuICAqLwotICAgIHVuc2lnbmVkIGNoYXIgc29ydDsKLQotICAgIC8qIFNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3BhY2UuICAqLwotICAgIGFzZWN0aW9uICpzZWdtZW50OwotICB9OwotI2VuZGlmCi0KLS8qIFN0cnVjdHVyZSBmb3IgcHJldmlvdXMgbGFiZWwgdHJhY2tpbmcuICBOZWVkZWQgc28gdGhhdCBhbGlnbm1lbnRzLAotICAgY2FsbGluZm8gZGVjbGFyYXRpb25zLCBldGMgY2FuIGJlIGVhc2lseSBhdHRhY2hlZCB0byBhIHBhcnRpY3VsYXIKLSAgIGxhYmVsLiAgKi8KLXR5cGVkZWYgc3RydWN0IGxhYmVsX3N5bWJvbF9zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBzeW1ib2wgKmxzc19sYWJlbDsKLSNpZmRlZiBPQkpfU09NCi0gICAgc2RfY2hhaW5fc3RydWN0ICpsc3Nfc3BhY2U7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gICAgc2VnVCBsc3Nfc2VnbWVudDsKLSNlbmRpZgotICAgIHN0cnVjdCBsYWJlbF9zeW1ib2xfc3RydWN0ICpsc3NfbmV4dDsKLSAgfQotbGFiZWxfc3ltYm9sX3N0cnVjdDsKLQotLyogRXh0cmEgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHBlcmZvcm0gZml4dXBzIChyZWxvY2F0aW9ucykgb24gdGhlIFBBLiAgKi8KLXN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QKLSAgewotICAgIC8qIFRoZSBmaWVsZCBzZWxlY3Rvci4gICovCi0gICAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0IGZ4X3JfZmllbGQ7Ci0KLSAgICAvKiBUeXBlIG9mIGZpeHVwLiAgKi8KLSAgICBpbnQgZnhfcl90eXBlOwotCi0gICAgLyogRm9ybWF0IG9mIGZpeHVwLiAgKi8KLSAgICBpbnQgZnhfcl9mb3JtYXQ7Ci0KLSAgICAvKiBBcmd1bWVudCByZWxvY2F0aW9uIGJpdHMuICAqLwotICAgIGxvbmcgZnhfYXJnX3JlbG9jOwotCi0gICAgLyogVGhlIHNlZ21lbnQgdGhpcyBmaXh1cCBhcHBlYXJzIGluLiAgKi8KLSAgICBzZWdUIHNlZ21lbnQ7Ci0gIH07Ci0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLQotc3RydWN0IHBkX3JlZwotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgdmFsdWU7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIG1hcHBpbmcgZnJvbSBhIEZQIGNvbmRpdGlvbiBzdHJpbmcKLSAgIHRvIGEgY29uZGl0aW9uIG51bWJlciB3aGljaCBjYW4gYmUgcmVjb3JkZWQgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLwotc3RydWN0IGZwX2NvbmRfbWFwCi0gIHsKLSAgICBjaGFyICpzdHJpbmc7Ci0gICAgaW50IGNvbmQ7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBtYXBwaW5nIGZyb20gYSBmaWVsZCBzZWxlY3RvcgotICAgc3RyaW5nIHRvIGEgZmllbGQgc2VsZWN0b3IgdHlwZS4gICovCi1zdHJ1Y3Qgc2VsZWN0b3JfZW50cnkKLSAgewotICAgIGNoYXIgKnByZWZpeDsKLSAgICBpbnQgZmllbGRfc2VsZWN0b3I7Ci0gIH07Ci0KLS8qIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBsb2NhbCB0byB0Yy1ocHBhLmMuICAqLwotCi0jaWZkZWYgT0JKX1NPTQotc3RhdGljIHZvaWQgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLXN0YXRpYyBmcF9vcGVyYW5kX2Zvcm1hdCBwYV9wYXJzZV9mcF9mb3JtYXQgUEFSQU1TICgoY2hhciAqKnMpKTsKLXN0YXRpYyB2b2lkIHBhX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9kYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZmxvYXRfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2ZpbGwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xzeW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3RleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV92ZXJzaW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9mcF9jbXBfY29uZCBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGdldF9leHByZXNzaW9uIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiBQQVJBTVMgKChzdHJ1Y3QgcGFfaXQgKiwgY2hhciAqKikpOwotc3RhdGljIGludCBldmFsdWF0ZV9hYnNvbHV0ZSBQQVJBTVMgKChzdHJ1Y3QgcGFfaXQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBwYV9idWlsZF9hcmdfcmVsb2MgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBhX2FsaWduX2FyZ19yZWxvYyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9udWxsaWYgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25lZ19hZGRfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0ciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2Jsb2NrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfYnJ0YWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90cnkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jYWxsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY2FsbF9hcmdzIFBBUkFNUyAoKHN0cnVjdCBjYWxsX2Rlc2MgKikpOwotc3RhdGljIHZvaWQgcGFfY2FsbGluZm8gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jb2RlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2NvcHlyaWdodCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VudGVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW50cnkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9lcXUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9leGl0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZXhwb3J0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdHlwZV9hcmdzIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9pbXBvcnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sYWJlbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xlYXZlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbGV2ZWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9vcmlnaW4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfcHJvY2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3BhcmFtIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdW5kZWZpbmVfbGFiZWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBuZWVkX3BhMTFfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqLAotCQkJCSAgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKikpOwotc3RhdGljIGludCBwYV9wYXJzZV9udW1iZXIgUEFSQU1TICgoY2hhciAqKiwgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKikpOwotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKnBhX2dldF9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZkZWYgT0JKX1NPTQotc3RhdGljIHZvaWQgcGFfY29tcGlsZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9hbGlnbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3NwYWNlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfc3BudW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9zdWJzcGFjZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKmNyZWF0ZV9uZXdfc3BhY2UgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgYXNlY3Rpb24gKiwgaW50KSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqY3JlYXRlX25ld19zdWJzcGFjZSBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKiwKLQkJCQkJCSAgICAgIGNoYXIgKiwgaW50LCBpbnQsCi0JCQkJCQkgICAgICBpbnQsIGludCwgaW50LAotCQkJCQkJICAgICAgaW50LCBpbnQsIGludCwgaW50LAotCQkJCQkJICAgICAgaW50LCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqdXBkYXRlX3N1YnNwYWNlIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqLAotCQkJCQkJICBjaGFyICosIGludCwgaW50LCBpbnQsCi0JCQkJCQkgIGludCwgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgYXNlY3Rpb24gKikpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqaXNfZGVmaW5lZF9zcGFjZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICppc19kZWZpbmVkX3N1YnNwYWNlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqcGFfc2VnbWVudF90b19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqLAotCQkJCQkJCSAgICBzdWJzZWdUKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9maW5kX3NwYWNlX2J5X251bWJlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfc3Vic3BhY2Vfc3RhcnQgUEFSQU1TICgoc2RfY2hhaW5fc3RydWN0ICosIGludCkpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqcGFfcGFyc2Vfc3BhY2Vfc3RtdCBQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIGludCBwYV9uZXh0X3N1YnNlZyBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKikpOwotc3RhdGljIHZvaWQgcGFfc3BhY2VzX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgcGFfaXAgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBmaXhfbmV3X2hwcGEgUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBpbnQsIHN5bWJvbFMgKiwKLQkJCQkgIGxvbmcsIGV4cHJlc3Npb25TICosIGludCwKLQkJCQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKLQkJCQkgIGludCwgbG9uZywgaW50ICopKTsKLXN0YXRpYyBpbnQgaXNfZW5kX29mX3N0YXRlbWVudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgaXNfc2FtZV9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGZyYWdTICopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfZXhpdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBhX3N0cmluZ2VyX2F1eCBQQVJBTVMgKChjaGFyICopKTsKLQotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkIGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSBQQVJBTVMgKChzdHJ1Y3QgY2FsbF9pbmZvICopKTsKLSNlbmRpZgotCi0vKiBGaWxlIGFuZCBnbG9hbGx5IHNjb3BlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuICAqLwotCi0jaWZkZWYgT0JKX1NPTQotLyogUm9vdCBhbmQgZmluYWwgZW50cnkgaW4gdGhlIHNwYWNlIGNoYWluLiAgKi8KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2RpY3Rfcm9vdDsKLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2RpY3RfbGFzdDsKLQotLyogVGhlIGN1cnJlbnQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKmN1cnJlbnRfc3BhY2U7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqY3VycmVudF9zdWJzcGFjZTsKLSNlbmRpZgotCi0vKiBSb290IG9mIHRoZSBjYWxsX2luZm8gY2hhaW4uICAqLwotc3RhdGljIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mb19yb290OwotCi0vKiBUaGUgbGFzdCBjYWxsX2luZm8gKGZvciBmdW5jdGlvbnMpIHN0cnVjdHVyZQotICAgc2VlbiBzbyBpdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGZpeHVwcyBhbmQKLSAgIGZ1bmN0aW9uIGxhYmVscy4gICovCi1zdGF0aWMgc3RydWN0IGNhbGxfaW5mbyAqbGFzdF9jYWxsX2luZm87Ci0KLS8qIFRoZSBsYXN0IGNhbGwgZGVzY3JpcHRpb24gKGZvciBhY3R1YWwgY2FsbHMpLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2FsbF9kZXNjIGxhc3RfY2FsbF9kZXNjOwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLiAgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotCi0vKiBUYWJsZSBvZiBwc2V1ZG8gb3BzIGZvciB0aGUgUEEuICBGSVhNRSAtLSBob3cgbWFueSBvZiB0aGVzZQotICAgYXJlIG5vdyByZWR1bmRhbnQgd2l0aCB0aGUgb3ZlcmFsbCBHQVMgYW5kIHRoZSBvYmplY3QgZmlsZQotICAgZGVwZW5kZW50IHRhYmxlcz8gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICAvKiBhbGlnbiBwc2V1ZG8tb3BzIG9uIHRoZSBQQSBzcGVjaWZ5IHRoZSBhY3R1YWwgYWxpZ25tZW50IHJlcXVlc3RlZCwKLSAgICAgbm90IHRoZSBsb2cyIG9mIHRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50LiAgKi8KLSNpZmRlZiBPQkpfU09NCi0gIHsiYWxpZ24iLCBwYV9hbGlnbiwgOH0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCA4fSwKLSNlbmRpZgotICB7ImJlZ2luX2JydGFiIiwgcGFfYnJ0YWIsIDF9LAotICB7ImJlZ2luX3RyeSIsIHBhX3RyeSwgMX0sCi0gIHsiYmxvY2siLCBwYV9ibG9jaywgMX0sCi0gIHsiYmxvY2t6IiwgcGFfYmxvY2ssIDB9LAotICB7ImJ5dGUiLCBwYV9jb25zLCAxfSwKLSAgeyJjYWxsIiwgcGFfY2FsbCwgMH0sCi0gIHsiY2FsbGluZm8iLCBwYV9jYWxsaW5mbywgMH0sCi0gIHsiY29kZSIsIHBhX2NvZGUsIDB9LAotICB7ImNvbW0iLCBwYV9jb21tLCAwfSwKLSNpZmRlZiBPQkpfU09NCi0gIHsiY29tcGlsZXIiLCBwYV9jb21waWxlciwgMH0sCi0jZW5kaWYKLSAgeyJjb3B5cmlnaHQiLCBwYV9jb3B5cmlnaHQsIDB9LAotICB7ImRhdGEiLCBwYV9kYXRhLCAwfSwKLSAgeyJkb3VibGUiLCBwYV9mbG9hdF9jb25zLCAnZCd9LAotICB7ImVuZCIsIHBhX2VuZCwgMH0sCi0gIHsiZW5kX2JydGFiIiwgcGFfYnJ0YWIsIDB9LAotICB7ImVuZF90cnkiLCBwYV90cnksIDB9LAotICB7ImVudGVyIiwgcGFfZW50ZXIsIDB9LAotICB7ImVudHJ5IiwgcGFfZW50cnksIDB9LAotICB7ImVxdSIsIHBhX2VxdSwgMH0sCi0gIHsiZXhpdCIsIHBhX2V4aXQsIDB9LAotICB7ImV4cG9ydCIsIHBhX2V4cG9ydCwgMH0sCi0gIHsiZmlsbCIsIHBhX2ZpbGwsIDB9LAotICB7ImZsb2F0IiwgcGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJoYWxmIiwgcGFfY29ucywgMn0sCi0gIHsiaW1wb3J0IiwgcGFfaW1wb3J0LCAwfSwKLSAgeyJpbnQiLCBwYV9jb25zLCA0fSwKLSAgeyJsYWJlbCIsIHBhX2xhYmVsLCAwfSwKLSAgeyJsY29tbSIsIHBhX2xjb21tLCAwfSwKLSAgeyJsZWF2ZSIsIHBhX2xlYXZlLCAwfSwKLSAgeyJsZXZlbCIsIHBhX2xldmVsLCAwfSwKLSAgeyJsb25nIiwgcGFfY29ucywgNH0sCi0gIHsibHN5bSIsIHBhX2xzeW0sIDB9LAotI2lmZGVmIE9CSl9TT00KLSAgeyJuc3Vic3BhIiwgcGFfc3Vic3BhY2UsIDF9LAotI2VuZGlmCi0gIHsib2N0YSIsIHBhX2NvbnMsIDE2fSwKLSAgeyJvcmciLCBwYV9vcmlnaW4sIDB9LAotICB7Im9yaWdpbiIsIHBhX29yaWdpbiwgMH0sCi0gIHsicGFyYW0iLCBwYV9wYXJhbSwgMH0sCi0gIHsicHJvYyIsIHBhX3Byb2MsIDB9LAotICB7InByb2NlbmQiLCBwYV9wcm9jZW5kLCAwfSwKLSAgeyJxdWFkIiwgcGFfY29ucywgOH0sCi0gIHsicmVnIiwgcGFfZXF1LCAxfSwKLSAgeyJzaG9ydCIsIHBhX2NvbnMsIDJ9LAotICB7InNpbmdsZSIsIHBhX2Zsb2F0X2NvbnMsICdmJ30sCi0jaWZkZWYgT0JKX1NPTQotICB7InNwYWNlIiwgcGFfc3BhY2UsIDB9LAotICB7InNwbnVtIiwgcGFfc3BudW0sIDB9LAotI2VuZGlmCi0gIHsic3RyaW5nIiwgcGFfc3RyaW5nZXIsIDB9LAotICB7InN0cmluZ3oiLCBwYV9zdHJpbmdlciwgMX0sCi0jaWZkZWYgT0JKX1NPTQotICB7InN1YnNwYSIsIHBhX3N1YnNwYWNlLCAwfSwKLSNlbmRpZgotICB7InRleHQiLCBwYV90ZXh0LCAwfSwKLSAgeyJ2ZXJzaW9uIiwgcGFfdmVyc2lvbiwgMH0sCi0gIHsid29yZCIsIHBhX2NvbnMsIDR9LAotICB7TlVMTCwgMCwgMH0KLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQuCi0KLSAgIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuCi0KLSAgIEFsc28gbm90ZSB0aGF0IEMgc3R5bGUgY29tbWVudHMgd2lsbCBhbHdheXMgd29yay4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggYWN0IGFzIGxpbmUgc2VwYXJhdG9ycy4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiISI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4KLSAgIEFzIGluIDBmMTIuNDU2IG9yIDBkMS4yMzQ1ZTEyLgotCi0gICBCZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYWUgdG8ga25vdyBhYm91IGl0IGF0Ci0gICBhbGwsIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotc3RhdGljIHN0cnVjdCBwYV9pdCB0aGVfaW5zbjsKLQotLyogUG9pbnRzIHRvIHRoZSBlbmQgb2YgYW4gZXhwcmVzc2lvbiBqdXN0IHBhcnNlZCBieSBnZXRfZXhwcmVzc29pbgotICAgYW5kIGZyaWVuZHMuICBGSVhNRS4gIFRoaXMgc2hvdWxkbid0IGJlIGhhbmRsZWQgd2l0aCBhIGZpbGUtZ2xvYmFsCi0gICB2YXJpYWJsZS4gICovCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci0KLS8qIE5vbnplcm8gaWYgYSAuY2FsbGluZm8gYXBwZWFyZWQgd2l0aGluIHRoZSBjdXJyZW50IHByb2NlZHVyZS4gICovCi1zdGF0aWMgaW50IGNhbGxpbmZvX2ZvdW5kOwotCi0vKiBOb256ZXJvIGlmIHRoZSBhc3NlbWJsZXIgaXMgY3VycmVudGx5IHdpdGhpbiBhIC5lbnRyeS8uZXhpdCBwYWlyLiAgKi8KLXN0YXRpYyBpbnQgd2l0aGluX2VudHJ5X2V4aXQ7Ci0KLS8qIE5vbnplcm8gaWYgdGhlIGFzc2VtYmxlciBpcyBjdXJyZW50bHkgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uICAqLwotc3RhdGljIGludCB3aXRoaW5fcHJvY2VkdXJlOwotCi0vKiBIYW5kbGUgb24gc3RydWN1dHJlIHdoaWNoIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgc3ltYm9sCi0gICBzZWVuIGluIGVhY2ggc3Vic3BhY2UuICAqLwotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbHNfcm9vdHAgPSBOVUxMOwotCi0vKiBIb2xkcyB0aGUgbGFzdCBmaWVsZCBzZWxlY3Rvci4gICovCi1zdGF0aWMgaW50IGhwcGFfZmllbGRfc2VsZWN0b3I7Ci0KLSNpZmRlZiBPQkpfU09NCi0vKiBBIGR1bW15IGJmZCBzeW1ib2wgc28gdGhhdCBhbGwgcmVsb2NhdGlvbnMgaGF2ZSBzeW1ib2xzIG9mIHNvbWUga2luZC4gICovCi1zdGF0aWMgc3ltYm9sUyAqZHVtbXlfc3ltYm9sOwotI2VuZGlmCi0KLS8qIE5vbnplcm8gaWYgZXJyb3JzIGFyZSB0byBiZSBwcmludGVkLiAgKi8KLXN0YXRpYyBpbnQgcHJpbnRfZXJyb3JzID0gMTsKLQotLyogTGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgcHJlLWRlZmluZWQ6Ci0KLSAgIEVhY2ggZ2VuZXJhbCByZWdpc3RlciBoYXMgb25lIHByZWRlZmluZWQgbmFtZSBvZiB0aGUgZm9ybQotICAgJXI8UkVHTlVNPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxSRUdOVU0+LgotCi0gICBTcGFjZSBhbmQgY29udHJvbCByZWdpc3RlcnMgYXJlIGhhbmRsZWQgaW4gYSBzaW1pbGFyIG1hbm5lciwKLSAgIGJ1dCB1c2UgJXNyPFJFR05VTT4gYW5kICVjcjxSRUdOVU0+IGFzIHRoZWlyIHByZWRlZmluZWQgbmFtZXMuCi0KLSAgIExpa2V3aXNlIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLCBidXQgb2YgdGhlIGZvcm0KLSAgICVmcjxSRUdOVU0+LiAgRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGhhdmUgYWRkaXRpb25hbCBwcmVkZWZpbmVkCi0gICBuYW1lcyB3aXRoICdMJyBhbmQgJ1InIHN1ZmZpeGVzIChlLmcuICVmcjE5TCwgJWZyMTlSKSB3aGljaAotICAgYWdhaW4gaGF2ZSB0aGUgdmFsdWUgPFJFR05VTT4uCi0KLSAgIE1hbnkgcmVnaXN0ZXJzIGFsc28gaGF2ZSBzeW5vbnltczoKLQotICAgJXIyNiAtICVyMjMgaGF2ZSAlYXJnMCAtICVhcmczIGFzIHN5bm9ueW1zCi0gICAlcjI4IC0gJXIyOSBoYXZlICVyZXQwIC0gJXJldDEgYXMgc3lub255bXMKLSAgICVyMzAgaGFzICVzcCBhcyBhIHN5bm9ueW0KLSAgICVyMjcgaGFzICVkcCBhcyBhIHN5bm9ueW0KLSAgICVyMiAgaGFzICVycCBhcyBhIHN5bm9ueW0KLQotICAgQWxtb3N0IGV2ZXJ5IGNvbnRyb2wgcmVnaXN0ZXIgaGFzIGEgc3lub255bTsgdGhleSBhcmUgbm90IGxpc3RlZAotICAgaGVyZSBmb3IgYnJldml0eS4KLQotICAgVGhlIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyIlYXJnMCIsIDI2fSwKLSAgeyIlYXJnMSIsIDI1fSwKLSAgeyIlYXJnMiIsIDI0fSwKLSAgeyIlYXJnMyIsIDIzfSwKLSAgeyIlY3IwIiwgMH0sCi0gIHsiJWNyMTAiLCAxMH0sCi0gIHsiJWNyMTEiLCAxMX0sCi0gIHsiJWNyMTIiLCAxMn0sCi0gIHsiJWNyMTMiLCAxM30sCi0gIHsiJWNyMTQiLCAxNH0sCi0gIHsiJWNyMTUiLCAxNX0sCi0gIHsiJWNyMTYiLCAxNn0sCi0gIHsiJWNyMTciLCAxN30sCi0gIHsiJWNyMTgiLCAxOH0sCi0gIHsiJWNyMTkiLCAxOX0sCi0gIHsiJWNyMjAiLCAyMH0sCi0gIHsiJWNyMjEiLCAyMX0sCi0gIHsiJWNyMjIiLCAyMn0sCi0gIHsiJWNyMjMiLCAyM30sCi0gIHsiJWNyMjQiLCAyNH0sCi0gIHsiJWNyMjUiLCAyNX0sCi0gIHsiJWNyMjYiLCAyNn0sCi0gIHsiJWNyMjciLCAyN30sCi0gIHsiJWNyMjgiLCAyOH0sCi0gIHsiJWNyMjkiLCAyOX0sCi0gIHsiJWNyMzAiLCAzMH0sCi0gIHsiJWNyMzEiLCAzMX0sCi0gIHsiJWNyOCIsIDh9LAotICB7IiVjcjkiLCA5fSwKLSAgeyIlZHAiLCAyN30sCi0gIHsiJWVpZW0iLCAxNX0sCi0gIHsiJWVpcnIiLCAyM30sCi0gIHsiJWZyMCIsIDB9LAotICB7IiVmcjBsIiwgMH0sCi0gIHsiJWZyMHIiLCAwfSwKLSAgeyIlZnIxIiwgMX0sCi0gIHsiJWZyMTAiLCAxMH0sCi0gIHsiJWZyMTBsIiwgMTB9LAotICB7IiVmcjEwciIsIDEwfSwKLSAgeyIlZnIxMSIsIDExfSwKLSAgeyIlZnIxMWwiLCAxMX0sCi0gIHsiJWZyMTFyIiwgMTF9LAotICB7IiVmcjEyIiwgMTJ9LAotICB7IiVmcjEybCIsIDEyfSwKLSAgeyIlZnIxMnIiLCAxMn0sCi0gIHsiJWZyMTMiLCAxM30sCi0gIHsiJWZyMTNsIiwgMTN9LAotICB7IiVmcjEzciIsIDEzfSwKLSAgeyIlZnIxNCIsIDE0fSwKLSAgeyIlZnIxNGwiLCAxNH0sCi0gIHsiJWZyMTRyIiwgMTR9LAotICB7IiVmcjE1IiwgMTV9LAotICB7IiVmcjE1bCIsIDE1fSwKLSAgeyIlZnIxNXIiLCAxNX0sCi0gIHsiJWZyMTYiLCAxNn0sCi0gIHsiJWZyMTZsIiwgMTZ9LAotICB7IiVmcjE2ciIsIDE2fSwKLSAgeyIlZnIxNyIsIDE3fSwKLSAgeyIlZnIxN2wiLCAxN30sCi0gIHsiJWZyMTdyIiwgMTd9LAotICB7IiVmcjE4IiwgMTh9LAotICB7IiVmcjE4bCIsIDE4fSwKLSAgeyIlZnIxOHIiLCAxOH0sCi0gIHsiJWZyMTkiLCAxOX0sCi0gIHsiJWZyMTlsIiwgMTl9LAotICB7IiVmcjE5ciIsIDE5fSwKLSAgeyIlZnIxbCIsIDF9LAotICB7IiVmcjFyIiwgMX0sCi0gIHsiJWZyMiIsIDJ9LAotICB7IiVmcjIwIiwgMjB9LAotICB7IiVmcjIwbCIsIDIwfSwKLSAgeyIlZnIyMHIiLCAyMH0sCi0gIHsiJWZyMjEiLCAyMX0sCi0gIHsiJWZyMjFsIiwgMjF9LAotICB7IiVmcjIxciIsIDIxfSwKLSAgeyIlZnIyMiIsIDIyfSwKLSAgeyIlZnIyMmwiLCAyMn0sCi0gIHsiJWZyMjJyIiwgMjJ9LAotICB7IiVmcjIzIiwgMjN9LAotICB7IiVmcjIzbCIsIDIzfSwKLSAgeyIlZnIyM3IiLCAyM30sCi0gIHsiJWZyMjQiLCAyNH0sCi0gIHsiJWZyMjRsIiwgMjR9LAotICB7IiVmcjI0ciIsIDI0fSwKLSAgeyIlZnIyNSIsIDI1fSwKLSAgeyIlZnIyNWwiLCAyNX0sCi0gIHsiJWZyMjVyIiwgMjV9LAotICB7IiVmcjI2IiwgMjZ9LAotICB7IiVmcjI2bCIsIDI2fSwKLSAgeyIlZnIyNnIiLCAyNn0sCi0gIHsiJWZyMjciLCAyN30sCi0gIHsiJWZyMjdsIiwgMjd9LAotICB7IiVmcjI3ciIsIDI3fSwKLSAgeyIlZnIyOCIsIDI4fSwKLSAgeyIlZnIyOGwiLCAyOH0sCi0gIHsiJWZyMjhyIiwgMjh9LAotICB7IiVmcjI5IiwgMjl9LAotICB7IiVmcjI5bCIsIDI5fSwKLSAgeyIlZnIyOXIiLCAyOX0sCi0gIHsiJWZyMmwiLCAyfSwKLSAgeyIlZnIyciIsIDJ9LAotICB7IiVmcjMiLCAzfSwKLSAgeyIlZnIzMCIsIDMwfSwKLSAgeyIlZnIzMGwiLCAzMH0sCi0gIHsiJWZyMzByIiwgMzB9LAotICB7IiVmcjMxIiwgMzF9LAotICB7IiVmcjMxbCIsIDMxfSwKLSAgeyIlZnIzMXIiLCAzMX0sCi0gIHsiJWZyM2wiLCAzfSwKLSAgeyIlZnIzciIsIDN9LAotICB7IiVmcjQiLCA0fSwKLSAgeyIlZnI0bCIsIDR9LAotICB7IiVmcjRyIiwgNH0sCi0gIHsiJWZyNSIsIDV9LAotICB7IiVmcjVsIiwgNX0sCi0gIHsiJWZyNXIiLCA1fSwKLSAgeyIlZnI2IiwgNn0sCi0gIHsiJWZyNmwiLCA2fSwKLSAgeyIlZnI2ciIsIDZ9LAotICB7IiVmcjciLCA3fSwKLSAgeyIlZnI3bCIsIDd9LAotICB7IiVmcjdyIiwgN30sCi0gIHsiJWZyOCIsIDh9LAotICB7IiVmcjhsIiwgOH0sCi0gIHsiJWZyOHIiLCA4fSwKLSAgeyIlZnI5IiwgOX0sCi0gIHsiJWZyOWwiLCA5fSwKLSAgeyIlZnI5ciIsIDl9LAotICB7IiVodGEiLCAyNX0sCi0gIHsiJWlpciIsIDE5fSwKLSAgeyIlaW9yIiwgMjF9LAotICB7IiVpcHN3IiwgMjJ9LAotICB7IiVpc3IiLCAyMH0sCi0gIHsiJWl0bXIiLCAxNn0sCi0gIHsiJWl2YSIsIDE0fSwKLSAgeyIlcGNvcSIsIDE4fSwKLSAgeyIlcGNzcSIsIDE3fSwKLSAgeyIlcGlkcjEiLCA4fSwKLSAgeyIlcGlkcjIiLCA5fSwKLSAgeyIlcGlkcjMiLCAxMn0sCi0gIHsiJXBpZHI0IiwgMTN9LAotICB7IiVwcGRhIiwgMjR9LAotICB7IiVyMCIsIDB9LAotICB7IiVyMSIsIDF9LAotICB7IiVyMTAiLCAxMH0sCi0gIHsiJXIxMSIsIDExfSwKLSAgeyIlcjEyIiwgMTJ9LAotICB7IiVyMTMiLCAxM30sCi0gIHsiJXIxNCIsIDE0fSwKLSAgeyIlcjE1IiwgMTV9LAotICB7IiVyMTYiLCAxNn0sCi0gIHsiJXIxNyIsIDE3fSwKLSAgeyIlcjE4IiwgMTh9LAotICB7IiVyMTkiLCAxOX0sCi0gIHsiJXIyIiwgMn0sCi0gIHsiJXIyMCIsIDIwfSwKLSAgeyIlcjIxIiwgMjF9LAotICB7IiVyMjIiLCAyMn0sCi0gIHsiJXIyMyIsIDIzfSwKLSAgeyIlcjI0IiwgMjR9LAotICB7IiVyMjUiLCAyNX0sCi0gIHsiJXIyNiIsIDI2fSwKLSAgeyIlcjI3IiwgMjd9LAotICB7IiVyMjgiLCAyOH0sCi0gIHsiJXIyOSIsIDI5fSwKLSAgeyIlcjMiLCAzfSwKLSAgeyIlcjMwIiwgMzB9LAotICB7IiVyMzEiLCAzMX0sCi0gIHsiJXI0IiwgNH0sCi0gIHsiJXI1IiwgNX0sCi0gIHsiJXI2IiwgNn0sCi0gIHsiJXI3IiwgN30sCi0gIHsiJXI4IiwgOH0sCi0gIHsiJXI5IiwgOX0sCi0gIHsiJXJjdHIiLCAwfSwKLSAgeyIlcmV0MCIsIDI4fSwKLSAgeyIlcmV0MSIsIDI5fSwKLSAgeyIlcnAiLCAyfSwKLSAgeyIlc2FyIiwgMTF9LAotICB7IiVzcCIsIDMwfSwKLSAgeyIlc3IwIiwgMH0sCi0gIHsiJXNyMSIsIDF9LAotICB7IiVzcjIiLCAyfSwKLSAgeyIlc3IzIiwgM30sCi0gIHsiJXNyNCIsIDR9LAotICB7IiVzcjUiLCA1fSwKLSAgeyIlc3I2IiwgNn0sCi0gIHsiJXNyNyIsIDd9LAotICB7IiV0cjAiLCAyNH0sCi0gIHsiJXRyMSIsIDI1fSwKLSAgeyIldHIyIiwgMjZ9LAotICB7IiV0cjMiLCAyN30sCi0gIHsiJXRyNCIsIDI4fSwKLSAgeyIldHI1IiwgMjl9LAotICB7IiV0cjYiLCAzMH0sCi0gIHsiJXRyNyIsIDMxfQotfTsKLQotLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQgYnkgb3JkZXIgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiBUaGlzIGlzCi0gICBzbyB3ZSBjaGVjayBmb3IgPD4gYmVmb3JlIHdlIGNoZWNrIGZvciA8LiBJZiB3ZSBoYWQgYSA8PiBhbmQgY2hlY2tlZAotICAgZm9yIDwgZmlyc3QsIHdlIHdvdWxkIGdldCBhIGZhbHNlIG1hdGNoLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnBfY29uZF9tYXAgZnBfY29uZF9tYXBbXSA9Ci17Ci0gIHsiZmFsc2U/IiwgMH0sCi0gIHsiZmFsc2UiLCAxfSwKLSAgeyJ0cnVlPyIsIDMwfSwKLSAgeyJ0cnVlIiwgMzF9LAotICB7IiE8PT4iLCAzfSwKLSAgeyIhPz49IiwgOH0sCi0gIHsiIT88PSIsIDE2fSwKLSAgeyIhPD4iLCA3fSwKLSAgeyIhPj0iLCAxMX0sCi0gIHsiIT8+IiwgMTJ9LAotICB7Ij88PSIsIDE0fSwKLSAgeyIhPD0iLCAxOX0sCi0gIHsiIT88IiwgMjB9LAotICB7Ij8+PSIsIDIyfSwKLSAgeyIhPz0iLCAyNH0sCi0gIHsiIT10IiwgMjd9LAotICB7Ijw9PiIsIDI5fSwKLSAgeyI9dCIsIDV9LAotICB7Ij89IiwgNn0sCi0gIHsiPzwiLCAxMH0sCi0gIHsiPD0iLCAxM30sCi0gIHsiIT4iLCAxNX0sCi0gIHsiPz4iLCAxOH0sCi0gIHsiPj0iLCAyMX0sCi0gIHsiITwiLCAyM30sCi0gIHsiPD4iLCAyNX0sCi0gIHsiIT0iLCAyNn0sCi0gIHsiIT8iLCAyOH0sCi0gIHsiPyIsIDJ9LAotICB7Ij0iLCA0fSwKLSAgeyI8IiwgOX0sCi0gIHsiPiIsIDE3fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZWxlY3Rvcl9lbnRyeSBzZWxlY3Rvcl90YWJsZVtdID0KLXsKLSAgeyJmIiwgZV9mc2VsfSwKLSAgeyJsIiwgZV9sc2VsfSwKLSAgeyJsZCIsIGVfbGRzZWx9LAotICB7ImxwIiwgZV9scHNlbH0sCi0gIHsibHIiLCBlX2xyc2VsfSwKLSAgeyJscyIsIGVfbHNzZWx9LAotICB7Imx0IiwgZV9sdHNlbH0sCi0gIHsibiIsIGVfbnNlbH0sCi0gIHsibmwiLCBlX25sc2VsfSwKLSAgeyJubHIiLCBlX25scnNlbH0sCi0gIHsicCIsIGVfcHNlbH0sCi0gIHsiciIsIGVfcnNlbH0sCi0gIHsicmQiLCBlX3Jkc2VsfSwKLSAgeyJycCIsIGVfcnBzZWx9LAotICB7InJyIiwgZV9ycnNlbH0sCi0gIHsicnMiLCBlX3Jzc2VsfSwKLSAgeyJydCIsIGVfcnRzZWx9LAotICB7InQiLCBlX3RzZWx9LAotfTsKLQotI2lmZGVmIE9CSl9TT00KLS8qIGRlZmF1bHQgc3BhY2UgYW5kIHN1YnNwYWNlIGRpY3Rpb25hcmllcyAqLwotCi0jZGVmaW5lIEdEQl9TWU1CT0xTICAgICAgICAgIEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUKLSNkZWZpbmUgR0RCX1NUUklOR1MgICAgICAgICAgR0RCX1NUUklOR1NfU1VCU1BBQ0VfTkFNRQotCi0vKiBwcmUtZGVmaW5lZCBzdWJzZWdtZW50cyAoc3Vic3BhY2VzKSBmb3IgdGhlIEhQUEEuICAqLwotI2RlZmluZSBTVUJTRUdfQ09ERSAgIDAKLSNkZWZpbmUgU1VCU0VHX0xJVCAgICAxCi0jZGVmaW5lIFNVQlNFR19NSUxMSSAgMgotI2RlZmluZSBTVUJTRUdfREFUQSAgIDAKLSNkZWZpbmUgU1VCU0VHX0JTUyAgICAyCi0jZGVmaW5lIFNVQlNFR19VTldJTkQgMwotI2RlZmluZSBTVUJTRUdfR0RCX1NUUklOR1MgMAotI2RlZmluZSBTVUJTRUdfR0RCX1NZTUJPTFMgMQotCi1zdGF0aWMgc3RydWN0IGRlZmF1bHRfc3Vic3BhY2VfZGljdCBwYV9kZWZfc3Vic3BhY2VzW10gPQotewotICB7IiRDT0RFJCIsIDEsIDEsIDEsIDAsIDAsIDAsIDI0LCAweDJjLCAwLCA4LCAwLCAwLCBTVUJTRUdfQ09ERX0sCi0gIHsiJERBVEEkIiwgMSwgMSwgMCwgMCwgMCwgMCwgMjQsIDB4MWYsIDEsIDgsIDEsIDEsIFNVQlNFR19EQVRBfSwKLSAgeyIkTElUJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDE2LCAweDJjLCAwLCA4LCAwLCAwLCBTVUJTRUdfTElUfSwKLSAgeyIkTUlMTElDT0RFJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDgsIDB4MmMsIDAsIDgsIDAsIDAsIFNVQlNFR19NSUxMSX0sCi0gIHsiJEJTUyQiLCAxLCAxLCAwLCAwLCAwLCAxLCA4MCwgMHgxZiwgMSwgOCwgMSwgMSwgU1VCU0VHX0JTU30sCi0gIHtOVUxMLCAwLCAxLCAwLCAwLCAwLCAwLCAyNTUsIDB4MWYsIDAsIDQsIDAsIDAsIDB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGRlZmF1bHRfc3BhY2VfZGljdCBwYV9kZWZfc3BhY2VzW10gPQotewotICB7IiRURVhUJCIsIDAsIDEsIDEsIDAsIDgsIEFTRUNfTlVMTH0sCi0gIHsiJFBSSVZBVEUkIiwgMSwgMSwgMSwgMSwgMTYsIEFTRUNfTlVMTH0sCi0gIHtOVUxMLCAwLCAwLCAwLCAwLCAwLCBBU0VDX05VTEx9Ci19OwotCi0vKiBNaXNjIGxvY2FsIGRlZmluaXRpb25zIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gICovCi0KLS8qIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBtYWludGFpbiBzcGFjZXMvc3Vic3BhY2VzLiAgKi8KLSNkZWZpbmUgU1BBQ0VfREVGSU5FRChzcGFjZV9jaGFpbikJKHNwYWNlX2NoYWluKS0+c2RfZGVmaW5lZAotI2RlZmluZSBTUEFDRV9VU0VSX0RFRklORUQoc3BhY2VfY2hhaW4pIChzcGFjZV9jaGFpbiktPnNkX3VzZXJfZGVmaW5lZAotI2RlZmluZSBTUEFDRV9TUE5VTShzcGFjZV9jaGFpbikJKHNwYWNlX2NoYWluKS0+c2Rfc3BudW0KLSNkZWZpbmUgU1BBQ0VfTkFNRShzcGFjZV9jaGFpbikJCShzcGFjZV9jaGFpbiktPnNkX25hbWUKLQotI2RlZmluZSBTVUJTUEFDRV9ERUZJTkVEKHNzX2NoYWluKQkoc3NfY2hhaW4pLT5zc2RfZGVmaW5lZAotI2RlZmluZSBTVUJTUEFDRV9OQU1FKHNzX2NoYWluKQkJKHNzX2NoYWluKS0+c3NkX25hbWUKLSNlbmRpZgotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgUyBwb3RlbnRpYWxseSByZXByZXNlbnRzCi0gICBhIHJpZ2h0IG9yIGxlZnQgaGFsZiBvZiBhIEZQIHJlZ2lzdGVyICAqLwotI2RlZmluZSBJU19SX1NFTEVDVChTKSAgICgqKFMpID09ICdSJyB8fCAqKFMpID09ICdyJykKLSNkZWZpbmUgSVNfTF9TRUxFQ1QoUykgICAoKihTKSA9PSAnTCcgfHwgKihTKSA9PSAnbCcpCi0KLS8qIEluc2VydCBGSUVMRCBpbnRvIE9QQ09ERSBzdGFydGluZyBhdCBiaXQgU1RBUlQuICBDb250aW51ZSBwYV9pcAotICAgbWFpbiBsb29wIGFmdGVyIGluc2VydGlvbi4gICovCi0KLSNkZWZpbmUgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRShPUENPREUsIEZJRUxELCBTVEFSVCkgXAotICB7IFwKLSAgICAoKE9QQ09ERSkgfD0gKEZJRUxEKSA8PCAoU1RBUlQpKTsgXAotICAgIGNvbnRpbnVlOyBcCi0gIH0KLQotLyogU2ltcGxlIHJhbmdlIGNoZWNraW5nIGZvciBGSUVMRCBhZ2FpbnQgSElHSCBhbmQgTE9XIGJvdW5kcy4KLSAgIElHTk9SRSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoZSBlcnJvciBtZXNzYWdlLiAgKi8KLQotI2RlZmluZSBDSEVDS19GSUVMRChGSUVMRCwgSElHSCwgTE9XLCBJR05PUkUpIFwKLSAgeyBcCi0gICAgaWYgKChGSUVMRCkgPiAoSElHSCkgfHwgKEZJRUxEKSA8IChMT1cpKSBcCi0gICAgICB7IFwKLQlpZiAoISBJR05PUkUpIFwKLSAgICAgICAgICBhc19iYWQgKF8oIkZpZWxkIG91dCBvZiByYW5nZSBbJWQuLiVkXSAoJWQpLiIpLCAoTE9XKSwgKEhJR0gpLCBcCi0JCSAgKGludCkgKEZJRUxEKSk7XAotICAgICAgICBicmVhazsgXAotICAgICAgfSBcCi0gIH0KLQotI2RlZmluZSBpc19EUF9yZWxhdGl2ZShleHApCQkJXAotICAoKGV4cCkuWF9vcCA9PSBPX3N1YnRyYWN0CQkJXAotICAgJiYgc3RyY21wIChTX0dFVF9OQU1FICgoZXhwKS5YX29wX3N5bWJvbCksICIkZ2xvYmFsJCIpID09IDApCi0KLSNkZWZpbmUgaXNfUENfcmVsYXRpdmUoZXhwKQkJCVwKLSAgKChleHApLlhfb3AgPT0gT19zdWJ0cmFjdAkJCVwKLSAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoKGV4cCkuWF9vcF9zeW1ib2wpLCAiJFBJQ19wY3JlbCQwIikgPT0gMCkKLQotLyogV2UgbmVlZCBzb21lIGNvbXBsZXggaGFuZGxpbmcgZm9yIHN0YWJzIChzeW0xIC0gc3ltMikuICBMdWNraWx5LCB3ZSdsbAotICAgYWx3YXlzIGJlIGFibGUgdG8gcmVkdWNlIHRoZSBleHByZXNzaW9uIHRvIGEgY29uc3RhbnQsIHNvIHdlIGRvbid0Ci0gICBuZWVkIHJlYWwgY29tcGxleCBoYW5kbGluZyB5ZXQuICAqLwotI2RlZmluZSBpc19jb21wbGV4KGV4cCkJCQkJXAotICAoKGV4cCkuWF9vcCAhPSBPX2NvbnN0YW50ICYmIChleHApLlhfb3AgIT0gT19zeW1ib2wpCi0KLS8qIEFjdHVhbCBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IHRoZSBQQSBzcGVjaWZpYyBjb2RlIGZvciB0aGUgYXNzZW1ibGVyLiAgKi8KLQotLyogQ2FsbGVkIGJlZm9yZSB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4gIE1ha2Ugc3VyZSBlbnRyeS9leGl0IGFuZAotICAgcHJvYy9wcm9jZW5kIHBhaXJzIG1hdGNoLiAgKi8KLQotdm9pZAotcGFfY2hlY2tfZW9mICgpCi17Ci0gIGlmICh3aXRoaW5fZW50cnlfZXhpdCkKLSAgICBhc19mYXRhbCAoXygiTWlzc2luZyAuZXhpdFxuIikpOwotCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2ZhdGFsIChfKCJNaXNzaW5nIC5wcm9jZW5kXG4iKSk7Ci19Ci0KLS8qIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYWJlbF9zeW1ib2xfc3RydWN0IGZvciB0aGUgY3VycmVudCBzcGFjZS4KLSAgIG9yIE5VTEwgaWYgbm8gbGFiZWxfc3ltYm9sX3N0cnVjdCBleGlzdHMgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKgotcGFfZ2V0X2xhYmVsICgpCi17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluOwotCi0gIGZvciAobGFiZWxfY2hhaW4gPSBsYWJlbF9zeW1ib2xzX3Jvb3RwOwotICAgICAgIGxhYmVsX2NoYWluOwotICAgICAgIGxhYmVsX2NoYWluID0gbGFiZWxfY2hhaW4tPmxzc19uZXh0KQotICAgIHsKLSNpZmRlZiBPQkpfU09NCi0gICAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gbGFiZWxfY2hhaW4tPmxzc19zcGFjZSAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsKQotICAgICAgcmV0dXJuIGxhYmVsX2NoYWluOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGlmIChub3dfc2VnID09IGxhYmVsX2NoYWluLT5sc3Nfc2VnbWVudCAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsKQotICAgICAgcmV0dXJuIGxhYmVsX2NoYWluOwotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZpbmVzIGEgbGFiZWwgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAgSWYgb25lIGlzIGFscmVhZHkgZGVmaW5lZCwKLSAgIHRoaXMgZnVuY3Rpb24gd2lsbCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyBsYWJlbC4gICovCi0KLXZvaWQKLXBhX2RlZmluZV9sYWJlbCAoc3ltYm9sKQotICAgICBzeW1ib2xTICpzeW1ib2w7Ci17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gIGlmIChsYWJlbF9jaGFpbikKLSAgICBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsID0gc3ltYm9sOwotICBlbHNlCi0gICAgewotICAgICAgLyogQ3JlYXRlIGEgbmV3IGxhYmVsIGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIGhlYWQgb2YgdGhlIGNoYWluLiAgKi8KLSAgICAgIGxhYmVsX2NoYWluCi0JPSAobGFiZWxfc3ltYm9sX3N0cnVjdCAqKSB4bWFsbG9jIChzaXplb2YgKGxhYmVsX3N5bWJvbF9zdHJ1Y3QpKTsKLSAgICAgIGxhYmVsX2NoYWluLT5sc3NfbGFiZWwgPSBzeW1ib2w7Ci0jaWZkZWYgT0JKX1NPTQotICAgICAgbGFiZWxfY2hhaW4tPmxzc19zcGFjZSA9IGN1cnJlbnRfc3BhY2U7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBsYWJlbF9jaGFpbi0+bHNzX3NlZ21lbnQgPSBub3dfc2VnOwotI2VuZGlmCi0gICAgICBsYWJlbF9jaGFpbi0+bHNzX25leHQgPSBOVUxMOwotCi0gICAgICBpZiAobGFiZWxfc3ltYm9sc19yb290cCkKLQlsYWJlbF9jaGFpbi0+bHNzX25leHQgPSBsYWJlbF9zeW1ib2xzX3Jvb3RwOwotCi0gICAgICBsYWJlbF9zeW1ib2xzX3Jvb3RwID0gbGFiZWxfY2hhaW47Ci0gICAgfQotfQotCi0vKiBSZW1vdmVzIGEgbGFiZWwgZGVmaW5pdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3BhY2UuCi0gICBJZiB0aGVyZSBpcyBubyBsYWJlbF9zeW1ib2xfc3RydWN0IGVudHJ5LCB0aGVuIG5vIGFjdGlvbiBpcyB0YWtlbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV91bmRlZmluZV9sYWJlbCAoKQotewotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9jaGFpbjsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqcHJldl9sYWJlbF9jaGFpbiA9IE5VTEw7Ci0KLSAgZm9yIChsYWJlbF9jaGFpbiA9IGxhYmVsX3N5bWJvbHNfcm9vdHA7Ci0gICAgICAgbGFiZWxfY2hhaW47Ci0gICAgICAgbGFiZWxfY2hhaW4gPSBsYWJlbF9jaGFpbi0+bHNzX25leHQpCi0gICAgewotICAgICAgaWYgKDEKLSNpZmRlZiBPQkpfU09NCi0gCSAgJiYgY3VycmVudF9zcGFjZSA9PSBsYWJlbF9jaGFpbi0+bHNzX3NwYWNlICYmIGxhYmVsX2NoYWluLT5sc3NfbGFiZWwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAJICAmJiBub3dfc2VnID09IGxhYmVsX2NoYWluLT5sc3Nfc2VnbWVudCAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsCi0jZW5kaWYKLQkgICkKLQl7Ci0JICAvKiBSZW1vdmUgdGhlIGxhYmVsIGZyb20gdGhlIGNoYWluIGFuZCBmcmVlIGl0cyBtZW1vcnkuICAqLwotCSAgaWYgKHByZXZfbGFiZWxfY2hhaW4pCi0JICAgIHByZXZfbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gbGFiZWxfY2hhaW4tPmxzc19uZXh0OwotCSAgZWxzZQotCSAgICBsYWJlbF9zeW1ib2xzX3Jvb3RwID0gbGFiZWxfY2hhaW4tPmxzc19uZXh0OwotCi0JICBmcmVlIChsYWJlbF9jaGFpbik7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmV2X2xhYmVsX2NoYWluID0gbGFiZWxfY2hhaW47Ci0gICAgfQotfQotCi0KLS8qIEFuIEhQUEEtc3BlY2lmaWMgdmVyc2lvbiBvZiBmaXhfbmV3LiAgVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBIUFBBCi0gICBjb2RlIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2Ygc29tZSBleHRyYSBzdHVmZi4gIEVhY2ggY2FsbCB0byBmaXhfbmV3X2hwcGEKLSAgIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGFuIGluc3RhbmNlIG9mIGFuIGhwcGFfZml4X3N0cnVjdC4gIEFuCi0gICBocHBhX2ZpeF9zdHJ1Y3Qgc3RvcmVzIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBhbG9uZyB3aXRoIGEgcG9pbnRlciB0byB0aGUKLSAgIG9yaWdpbmFsIGZpeFMuICBUaGlzIGlzIGF0dGFjaGVkIHRvIHRoZSBvcmlnaW5hbCBmaXh1cCB2aWEgdGhlCi0gICB0Y19maXhfZGF0YSBmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1maXhfbmV3X2hwcGEgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLCBvZmZzZXQsIGV4cCwgcGNyZWwsCi0JICAgICAgcl90eXBlLCByX2ZpZWxkLCByX2Zvcm1hdCwgYXJnX3JlbG9jLCB1bndpbmRfYml0cykKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IHNpemU7Ci0gICAgIHN5bWJvbFMgKmFkZF9zeW1ib2w7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgcGNyZWw7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7Ci0gICAgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCByX2ZpZWxkOwotICAgICBpbnQgcl9mb3JtYXQ7Ci0gICAgIGxvbmcgYXJnX3JlbG9jOwotICAgICBpbnQqIHVud2luZF9iaXRzOwotewotICBmaXhTICpuZXdfZml4OwotCi0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4ID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikKLSAgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QpKTsKLQotICBpZiAoZXhwICE9IE5VTEwpCi0gICAgbmV3X2ZpeCA9IGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwgcl90eXBlKTsKLSAgZWxzZQotICAgIG5ld19maXggPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwgcl90eXBlKTsKLSAgbmV3X2ZpeC0+dGNfZml4X2RhdGEgPSAodm9pZCAqKSBocHBhX2ZpeDsKLSAgaHBwYV9maXgtPmZ4X3JfdHlwZSA9IHJfdHlwZTsKLSAgaHBwYV9maXgtPmZ4X3JfZmllbGQgPSByX2ZpZWxkOwotICBocHBhX2ZpeC0+Znhfcl9mb3JtYXQgPSByX2Zvcm1hdDsKLSAgaHBwYV9maXgtPmZ4X2FyZ19yZWxvYyA9IGFyZ19yZWxvYzsKLSAgaHBwYV9maXgtPnNlZ21lbnQgPSBub3dfc2VnOwotI2lmZGVmIE9CSl9TT00KLSAgaWYgKHJfdHlwZSA9PSBSX0VOVFJZIHx8IHJfdHlwZSA9PSBSX0VYSVQpCi0gICAgbmV3X2ZpeC0+Znhfb2Zmc2V0ID0gKnVud2luZF9iaXRzOwotI2VuZGlmCi0KLSAgLyogZm9vLSRnbG9iYWwkIGlzIHVzZWQgdG8gYWNjZXNzIG5vbi1hdXRvbWF0aWMgc3RvcmFnZS4gICRnbG9iYWwkCi0gICAgIGlzIHJlYWxseSBqdXN0IGEgbWFya2VyIGFuZCBoYXMgc2VydmVkIGl0cyBwdXJwb3NlLCBzbyBlbGltaW5hdGUKLSAgICAgaXQgbm93IHNvIGFzIG5vdCB0byBjb25mdXNlIHdyaXRlLmMuICAqLwotICBpZiAobmV3X2ZpeC0+Znhfc3Vic3kKLSAgICAgICYmICFzdHJjbXAgKFNfR0VUX05BTUUgKG5ld19maXgtPmZ4X3N1YnN5KSwgIiRnbG9iYWwkIikpCi0gICAgbmV3X2ZpeC0+Znhfc3Vic3kgPSBOVUxMOwotfQotCi0vKiBQYXJzZSBhIC5ieXRlLCAud29yZCwgLmxvbmcgZXhwcmVzc2lvbiBmb3IgdGhlIEhQUEEuICBDYWxsZWQgYnkKLSAgIGNvbnMgdmlhIHRoZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gbWFjcm8uICAqLwotCi12b2lkCi1wYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoZXhwKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBocHBhX2ZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgZXhwcmVzc2lvbiAoZXhwKTsKLX0KLQotLyogVGhpcyBmaXhfbmV3IGlzIGNhbGxlZCBieSBjb25zIHZpYSBUQ19DT05TX0ZJWF9ORVcuCi0gICBocHBhX2ZpZWxkX3NlbGVjdG9yIGlzIHNldCBieSB0aGUgcGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfaHBwYSAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIHVuc2lnbmVkIGludCByZWxfdHlwZTsKLQotICAvKiBHZXQgYSBiYXNlIHJlbG9jYXRpb24gdHlwZS4gICovCi0gIGlmIChpc19EUF9yZWxhdGl2ZSAoKmV4cCkpCi0gICAgcmVsX3R5cGUgPSBSX0hQUEFfR09UT0ZGOwotICBlbHNlIGlmIChpc19jb21wbGV4ICgqZXhwKSkKLSAgICByZWxfdHlwZSA9IFJfSFBQQV9DT01QTEVYOwotICBlbHNlCi0gICAgcmVsX3R5cGUgPSBSX0hQUEE7Ci0KLSAgaWYgKGhwcGFfZmllbGRfc2VsZWN0b3IgIT0gZV9wc2VsICYmIGhwcGFfZmllbGRfc2VsZWN0b3IgIT0gZV9mc2VsKQotICAgIGFzX3dhcm4gKF8oIkludmFsaWQgZmllbGQgc2VsZWN0b3IuICBBc3N1bWluZyBGJSUuIikpOwotCi0gIGZpeF9uZXdfaHBwYSAoZnJhZywgd2hlcmUsIHNpemUsCi0JCShzeW1ib2xTICopIE5VTEwsIChvZmZzZXRUKSAwLCBleHAsIDAsIHJlbF90eXBlLAotCQlocHBhX2ZpZWxkX3NlbGVjdG9yLCAzMiwgMCwgTlVMTCk7Ci0KLSAgLyogUmVzZXQgZmllbGQgc2VsZWN0b3IgdG8gaXRzIGRlZmF1bHQgc3RhdGUuICAqLwotICBocHBhX2ZpZWxkX3NlbGVjdG9yID0gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBpID0gMDsKLQotICBsYXN0X2NhbGxfaW5mbyA9IE5VTEw7Ci0gIGNhbGxfaW5mb19yb290ID0gTlVMTDsKLQotICAvKiBTZXQgdGhlIGRlZmF1bHQgbWFjaGluZSB0eXBlLiAgKi8KLSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAxMCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogRm9sZGluZyBvZiB0ZXh0IGFuZCBkYXRhIHNlZ21lbnRzIGZhaWxzIG1pc2VyYWJseSBvbiB0aGUgUEEuCi0gICAgIFdhcm4gdXNlciBhbmQgZGlzYWJsZSAiLVIiIG9wdGlvbi4gICovCi0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCItUiBvcHRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldC4iKSk7Ci0gICAgICBmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCA9IDA7Ci0gICAgfQotCi0jaWZkZWYgT0JKX1NPTQotICBwYV9zcGFjZXNfYmVnaW4gKCk7Ci0jZW5kaWYKLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgd2hpbGUgKGkgPCBOVU1PUENPREVTKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBwYV9vcGNvZGVzW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKHN0cnVjdCBwYV9vcGNvZGUgKikgJnBhX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMICYmICpyZXR2YWwgIT0gJ1wwJykKLQl7Ci0JICBhc19mYXRhbCAoXygiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLCBuYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgICAgZG8KLQl7Ci0JICBpZiAoKHBhX29wY29kZXNbaV0ubWF0Y2ggJiBwYV9vcGNvZGVzW2ldLm1hc2spCi0JICAgICAgIT0gcGFfb3Bjb2Rlc1tpXS5tYXRjaCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iKSwKLQkJICAgICAgIHBhX29wY29kZXNbaV0ubmFtZSwgcGFfb3Bjb2Rlc1tpXS5hcmdzKTsKLQkgICAgICBsb3NlID0gMTsKLQkgICAgfQotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChpIDwgTlVNT1BDT0RFUyAmJiAhc3RyY21wIChwYV9vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKTsKLSAgICB9Ci0KLSAgaWYgKGxvc2UpCi0gICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBTT00gd2lsbCBjaGFuZ2UgdGV4dF9zZWN0aW9uLiAgVG8gbWFrZSBzdXJlIHdlIG5ldmVyIHB1dAotICAgICBhbnl0aGluZyBpbnRvIHRoZSBvbGQgb25lIHN3aXRjaCB0byB0aGUgbmV3IG9uZSBub3cuICAqLwotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfU09NCi0gIGR1bW15X3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKCJMJGR1bW15Iik7Ci0gIFNfU0VUX1NFR01FTlQgKGR1bW15X3N5bWJvbCwgdGV4dF9zZWN0aW9uKTsKLSAgLyogRm9yY2UgdGhlIHN5bWJvbCB0byBiZSBjb252ZXJ0ZWQgdG8gYSByZWFsIHN5bWJvbC4gKi8KLSAgKHZvaWQpIHN5bWJvbF9nZXRfYmZkc3ltIChkdW1teV9zeW1ib2wpOyAKLSNlbmRpZgotfQotCi0vKiBBc3NlbWJsZSBhIHNpbmdsZSBpbnN0cnVjdGlvbiBzdG9yaW5nIGl0IGludG8gYSBmcmFnLiAgKi8KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG87Ci0KLSAgLyogVGhlIGhhZCBiZXR0ZXIgYmUgc29tZXRoaW5nIHRvIGFzc2VtYmxlLiAgKi8KLSAgYXNzZXJ0IChzdHIpOwotCi0gIC8qIElmIHdlIGFyZSB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbiwgbWFrZSBzdXJlIHdlJ3ZlCi0gICAgIGRlZmluZWQgYSBsYWJlbCBmb3IgdGhlIHByb2NlZHVyZTsgaGFuZGxlIGNhc2Ugd2hlcmUgdGhlCi0gICAgIGxhYmVsIHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAuUFJPQyBkaXJlY3RpdmUuCi0KLSAgICAgTm90ZSB0aGVyZSdzIG5vdCBuZWVkIHRvIGRpZGRsZSB3aXRoIHRoZSBzZWdtZW50IG9yIGZyYWdtZW50Ci0gICAgIGZvciB0aGUgbGFiZWwgc3ltYm9sIGluIHRoaXMgY2FzZS4gIFdlIGhhdmUgYWxyZWFkeSBzd2l0Y2hlZAotICAgICBpbnRvIHRoZSBuZXcgJENPREUkIHN1YnNwYWNlIGF0IHRoaXMgcG9pbnQuICAqLwotICBpZiAod2l0aGluX3Byb2NlZHVyZSAmJiBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID09IE5VTEwpCi0gICAgewotICAgICAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gICAgICBpZiAobGFiZWxfc3ltYm9sKQotCXsKLQkgIGlmIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCkKLQkgICAgewotCSAgICAgIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLQkgICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpLT5mbGFncwotCQl8PSBCU0ZfRlVOQ1RJT047Ci0jaWZkZWYgT0JKX1NPTQotCSAgICAgIC8qIEFsc28gaGFuZGxlIGFsbG9jYXRpb24gb2YgYSBmaXh1cCB0byBob2xkIHRoZSB1bndpbmQKLQkJIGluZm9ybWF0aW9uIHdoZW4gdGhlIGxhYmVsIGFwcGVhcnMgYWZ0ZXIgdGhlIHByb2MvcHJvY2VuZC4gICovCi0JICAgICAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotCQl7Ci0JCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0JCSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJCQkwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKLQkJCQkoaW50ICopJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7Ci0JCX0KLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIikpOwotICAgIH0KLQotICAvKiBBc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24uICBSZXN1bHRzIGFyZSBzYXZlZCBpbnRvICJ0aGVfaW5zbiIuICAqLwotICBwYV9pcCAoc3RyKTsKLQotICAvKiBHZXQgc29tZXdoZXJlIHRvIHB1dCB0aGUgYXNzZW1ibGVkIGluc3RydXRpb24uICAqLwotICB0byA9IGZyYWdfbW9yZSAoNCk7Ci0KLSAgLyogT3V0cHV0IHRoZSBvcGNvZGUuICovCi0gIG1kX251bWJlcl90b19jaGFycyAodG8sIHRoZV9pbnNuLm9wY29kZSwgNCk7Ci0KLSAgLyogSWYgbmVjZXNzYXJ5IG91dHB1dCBtb3JlIHN0dWZmLiAgKi8KLSAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IFJfSFBQQV9OT05FKQotICAgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csICh0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwgNCwgTlVMTCwKLQkJICAob2Zmc2V0VCkgMCwgJnRoZV9pbnNuLmV4cCwgdGhlX2luc24ucGNyZWwsCi0JCSAgdGhlX2luc24ucmVsb2MsIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yLAotCQkgIHRoZV9pbnNuLmZvcm1hdCwgdGhlX2luc24uYXJnX3JlbG9jLCBOVUxMKTsKLX0KLQotLyogRG8gdGhlIHJlYWwgd29yayBmb3IgYXNzZW1ibGluZyBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFN0b3JlIHJlc3VsdHMKLSAgIGludG8gdGhlIGdsb2JhbCAidGhlX2luc24iIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2lwIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICIiOwotICBjaGFyICpzLCBjLCAqYXJnc3RhcnQsICpuYW1lLCAqc2F2ZV9zOwotICBjb25zdCBjaGFyICphcmdzOwotICBpbnQgbWF0Y2ggPSBGQUxTRTsKLSAgaW50IGNvbW1hID0gMDsKLSAgaW50IGNtcGx0ciwgbnVsbGlmLCBmbGFnLCBjb25kLCBudW07Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICBzdHJ1Y3QgcGFfb3Bjb2RlICppbnNuOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIC8qIENvbnZlcnQgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW50byBsb3dlcgotICAgICBjYXNlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAqcyAhPSAnXG4nICYmICpzICE9ICdcMCc7IHMrKykKLSAgICBpZiAoaXN1cHBlciAoKnMpKQotICAgICAgKnMgPSB0b2xvd2VyICgqcyk7Ci0KLSAgLyogU2tpcCB0byBzb21ldGhpbmcgaW50ZXJlc3RpbmcuICAqLwotICBmb3IgKHMgPSBzdHI7IGlzdXBwZXIgKCpzKSB8fCBpc2xvd2VyICgqcykgfHwgKCpzID49ICcwJyAmJiAqcyA8PSAnMycpOyArK3MpCi0gICAgOwotCi0gIHN3aXRjaCAoKnMpCi0gICAgewotCi0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGNvbW1hID0gMTsKLQotICAgICAgLypGQUxMVEhST1VHSCAqLwotCi0gICAgY2FzZSAnICc6Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgIH0KLQotICBzYXZlX3MgPSBzdHI7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3Bjb2RlIGluIHRoZSBoYXMgdGFibGUuICAqLwotICBpZiAoKGluc24gPSAoc3RydWN0IHBhX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkICgiVW5rbm93biBvcGNvZGU6IGAlcyciLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY29tbWEpCi0gICAgewotICAgICAgKi0tcyA9ICcsJzsKLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgbG9jYXRpb24gd2hlcmUgYXJndW1lbnRzIGZvciB0aGUgaW5zdHJ1Y3Rpb24gc3RhcnQsIHRoZW4KLSAgICAgc3RhcnQgcHJvY2Vzc2luZyB0aGVtLiAgKi8KLSAgYXJnc3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8qIERvIHNvbWUgaW5pdGlhbGl6YXRpb24uICAqLwotICAgICAgb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBtZW1zZXQgKCZ0aGVfaW5zbiwgMCwgc2l6ZW9mICh0aGVfaW5zbikpOwotCi0gICAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9OT05FOwotCi0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBhcmNoaXRlY3R1cmUsCi0JIHRoZW4gc2V0IGEgbmV3IGFyY2hpdGVjdHVyZS4gICovCi0gICAgICAvKiBCdXQgZG8gbm90IGF1dG9tYXRpY2FsbHkgcHJvbW90ZSB0byBwYTIuMC4gIFRoZSBhdXRvbWF0aWMgcHJvbW90aW9uCi0JIGNydWQgaXMgZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBIUCdzIG9sZCBhc3NlbWJsZXJzIG9ubHkuICAqLwotICAgICAgaWYgKGluc24tPmFyY2ggPCAyMAotCSAgJiYgYmZkX2dldF9tYWNoIChzdGRvdXRwdXQpIDwgaW5zbi0+YXJjaCkKLQl7Ci0JICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIGluc24tPmFyY2gpKQotCSAgICBhc193YXJuIChfKCJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKHN0ZG91dHB1dCkgPCBpbnNuLT5hcmNoKQotCXsKLQkgIG1hdGNoID0gRkFMU0U7Ci0JICBnb3RvIGZhaWxlZDsKLQl9Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBvcGNvZGUsIGNoZWNraW5nIGFzIHdlIGdvIHRvIG1ha2UKLSAgICAgICAgIHN1cmUgdGhhdCB0aGUgb3BlcmFuZHMgbWF0Y2guICAqLwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLQl7Ci0JICBzd2l0Y2ggKCphcmdzKQotCSAgICB7Ci0KLQkgICAgLyogRW5kIG9mIGFyZ3VtZW50cy4gICovCi0JICAgIGNhc2UgJ1wwJzoKLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJbWF0Y2ggPSBUUlVFOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJysnOgotCSAgICAgIGlmICgqcyA9PSAnKycpCi0JCXsKLQkJICArK3M7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoKnMgPT0gJy0nKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkuICAqLwotCSAgICBjYXNlICcoJzoKLQkgICAgY2FzZSAnKSc6Ci0JICAgIGNhc2UgJywnOgotCSAgICBjYXNlICcgJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgb3IgY29udHJvbCByZWdpc3RlciBmaWVsZCBhdCAxMC4gICovCi0JICAgIGNhc2UgJ2InOgotCSAgICBjYXNlICdeJzoKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAxNS4gICovCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAneSc6Ci0JICAgIGNhc2UgJ3QnOgotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgZmllbGQgbGVuZ3RoIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnVCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMiwgMSwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAzMiAtIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnNSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxNSwgLTE2LCAwKTsKLQkgICAgICBsb3dfc2lnbl91bmV4dCAobnVtLCA1LCAmbnVtKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ1YnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTUsIC0xNiwgMCkKLQkgICAgICBsb3dfc2lnbl91bmV4dCAobnVtLCA1LCAmbnVtKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGFuIHVuc2lnbmVkIDUgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ3InOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYW4gdW5zaWduZWQgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnUic6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYSAyIGJpdCBzcGFjZSBpZGVudGlmaWVyIGF0IDE3LiAgKi8KLQkgICAgY2FzZSAncyc6Ci0JICAgICAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMywgMCwgMSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE0KTsKLQotCSAgICAvKiBIYW5kbGUgYSAzIGJpdCBzcGFjZSBpZGVudGlmaWVyIGF0IDE4LiAgKi8KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgMSk7Ci0JICAgICAgZGlzX2Fzc2VtYmxlXzMgKG51bSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgYSBjb21wbGV0ZXIgZm9yIGFuIGluZGV4aW5nIGxvYWQgb3Igc3RvcmUuICAqLwotCSAgICBjYXNlICdjJzoKLQkgICAgICB7Ci0JCWludCB1dSA9IDA7Ci0JCWludCBtID0gMDsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoKnMgPT0gJywnICYmIGkgPCAyKQotCQkgIHsKLQkJICAgIHMrKzsKLQkJICAgIGlmIChzdHJuY2FzZWNtcCAocywgInNtIiwgMikgPT0gMCkKLQkJICAgICAgewotCQkJdXUgPSAxOwotCQkJbSA9IDE7Ci0JCQlzKys7Ci0JCQlpKys7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibSIsIDEpID09IDApCi0JCSAgICAgIG0gPSAxOwotCQkgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzIiwgMSkgPT0gMCkKLQkJICAgICAgdXUgPSAxOwotCQkgICAgZWxzZQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlci4iKSk7Ci0JCSAgICBzKys7Ci0JCSAgICBpKys7Ci0JCSAgfQotCQlpZiAoaSA+IDIpCi0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIgU3ludGF4LiIpKTsKLQkJb3Bjb2RlIHw9IG0gPDwgNTsKLQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCB1dSwgMTMpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSBzaG9ydCBsb2FkL3N0b3JlIGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ0MnOgotCSAgICAgIHsKLQkJaW50IGEgPSAwOwotCQlpbnQgbSA9IDA7Ci0JCWlmICgqcyA9PSAnLCcpCi0JCSAgewotCQkgICAgcysrOwotCQkgICAgaWYgKHN0cm5jYXNlY21wIChzLCAibWEiLCAyKSA9PSAwKQotCQkgICAgICB7Ci0JCQlhID0gMDsKLQkJCW0gPSAxOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm1iIiwgMikgPT0gMCkKLQkJICAgICAgewotCQkJYSA9IDE7Ci0JCQltID0gMTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgU2hvcnQgTG9hZC9TdG9yZSBDb21wbGV0ZXIuIikpOwotCQkgICAgcyArPSAyOwotCQkgIH0KLQotCQlpZiAoKmFyZ3MgPT0gJ0MnKQotCQkgIHsKLQkJICAgIG9wY29kZSB8PSBtIDw8IDU7Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGEsIDEzKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIHN0YnlzIGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ1knOgotCSAgICAgIHsKLQkJaW50IGEgPSAwOwotCQlpbnQgbSA9IDA7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKCpzID09ICcsJyAmJiBpIDwgMikKLQkJICB7Ci0JCSAgICBzKys7Ci0JCSAgICBpZiAoc3RybmNhc2VjbXAgKHMsICJtIiwgMSkgPT0gMCkKLQkJICAgICAgbSA9IDE7Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgImIiLCAxKSA9PSAwKQotCQkgICAgICBhID0gMDsKLQkJICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAiZSIsIDEpID09IDApCi0JCSAgICAgIGEgPSAxOwotCQkgICAgZWxzZQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIikpOwotCQkgICAgcysrOwotCQkgICAgaSsrOwotCQkgIH0KLQkJaWYgKGkgPiAyKQotCQkgIGFzX2JhZCAoXygiSW52YWxpZCBTdG9yZSBCeXRlcyBTaG9ydCBDb21wbGV0ZXIiKSk7Ci0JCW9wY29kZSB8PSBtIDw8IDU7Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgYSwgMTMpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSBub24tbmVnYXRlZCBjb21wYXJlL3N0dWJ0cmFjdCBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICc8JzoKLQkgICAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciAoJnMsIDEpOwotCSAgICAgIGlmIChjbXBsdHIgPCAwKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uOiAlYyIpLCAqcyk7Ci0JCSAgY21wbHRyID0gMDsKLQkJfQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgbmVnYXRlZCBvciBub24tbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbi4gICovCi0JICAgIGNhc2UgJz8nOgotCSAgICAgIHNhdmVfcyA9IHM7Ci0JICAgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgKCZzLCAxKTsKLQkgICAgICBpZiAoY21wbHRyIDwgMCkKLQkJewotCQkgIHMgPSBzYXZlX3M7Ci0JCSAgY21wbHRyID0gcGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIgKCZzLCAxKTsKLQkJICBpZiAoY21wbHRyIDwgMCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uLiIpKTsKLQkJICAgICAgY21wbHRyID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIE5lZ2F0ZWQgY29uZGl0aW9uIHJlcXVpcmVzIGFuIG9wY29kZSBjaGFuZ2UuICAqLwotCQkgICAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQkJICAgIH0KLQkJfQotCQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIG5vbi1uZWdhdGVkIGFkZCBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICchJzoKLQkgICAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0ciAoJnMsIDEpOwotCSAgICAgIGlmIChjbXBsdHIgPCAwKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uOiAlYyIpLCAqcyk7Ci0JCSAgY21wbHRyID0gMDsKLQkJfQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgbmVnYXRlZCBvciBub24tbmVnYXRlZCBhZGQgY29uZGl0aW9uLiAgKi8KLQkgICAgY2FzZSAnQCc6Ci0JICAgICAgc2F2ZV9zID0gczsKLQkgICAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0ciAoJnMsIDEpOwotCSAgICAgIGlmIChjbXBsdHIgPCAwKQotCQl7Ci0JCSAgcyA9IHNhdmVfczsKLQkJICBjbXBsdHIgPSBwYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciAoJnMsIDEpOwotCQkgIGlmIChjbXBsdHIgPCAwKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgQ29tcGFyZS9TdWJ0cmFjdCBDb25kaXRpb24iKSk7Ci0JCSAgICAgIGNtcGx0ciA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAgKi8KLQkJICAgICAgb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBhIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9uLiAgKi8KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgY21wbHRyID0gMDsKLQkgICAgICBmbGFnID0gMDsKLQkgICAgICBpZiAoKnMgPT0gJywnKQotCQl7Ci0JCSAgcysrOwotCQkgIG5hbWUgPSBzOwotCQkgIHdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JCSAgICBzICs9IDE7Ci0JCSAgYyA9ICpzOwotCQkgICpzID0gMHgwMDsKLQkJICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JCSAgICBjbXBsdHIgPSAxOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkgICAgY21wbHRyID0gMjsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCi0JCSAgICBjbXBsdHIgPSAzOwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI8PCIpID09IDApCi0JCSAgICBjbXBsdHIgPSA0OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI8PD0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gNTsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNjsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNzsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidHIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAwOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDE7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMjsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDM7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI+Pj0iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA0OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPj4iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA1OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNjsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIEFkZCBDb25kaXRpb246ICVzIiksIG5hbWUpOwotCQkgICpzID0gYzsKLQkJfQotCSAgICAgIG9wY29kZSB8PSBjbXBsdHIgPDwgMTM7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkgICAgLyogSGFuZGxlIGEgbm9uLW5lZ2F0ZWQgYWRkIGNvbmRpdGlvbi4gICovCi0JICAgIGNhc2UgJ2QnOgotCSAgICAgIGNtcGx0ciA9IDA7Ci0JICAgICAgZmxhZyA9IDA7Ci0JICAgICAgaWYgKCpzID09ICcsJykKLQkJewotCQkgIHMrKzsKLQkJICBuYW1lID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkgICAgcyArPSAxOwotCQkgIGMgPSAqczsKLQkJICAqcyA9IDB4MDA7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gMTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDI7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gMzsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnV2IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDQ7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInpudiIpID09IDApCi0JCSAgICBjbXBsdHIgPSA1OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JCSAgICBjbXBsdHIgPSA2OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCi0JCSAgICBjbXBsdHIgPSA3OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDA7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMTsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAyOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInV2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInZueiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDU7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuc3YiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA2OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA3OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oIkludmFsaWQgQWRkIENvbmRpdGlvbjogJXMiKSwgbmFtZSk7Ci0JCSAgKnMgPSBjOwotCQl9Ci0JICAgICAgb3Bjb2RlIHw9IGNtcGx0ciA8PCAxMzsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEyKTsKLQotCSAgICAvKiBIQU5ETEUgYSBsb2dpY2FsIGluc3RydWN0aW9uIGNvbmRpdGlvbi4gICovCi0JICAgIGNhc2UgJyYnOgotCSAgICAgIGNtcGx0ciA9IDA7Ci0JICAgICAgZmxhZyA9IDA7Ci0JICAgICAgaWYgKCpzID09ICcsJykKLQkJewotCQkgIHMrKzsKLQkJICBuYW1lID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkgICAgcyArPSAxOwotCQkgIGMgPSAqczsKLQkJICAqcyA9IDB4MDA7Ci0KLQotCQkgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JCSAgICBjbXBsdHIgPSAyOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDM7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDc7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAxOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAzOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA3OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oIkludmFsaWQgTG9naWNhbCBJbnN0cnVjdGlvbiBDb25kaXRpb24uIikpOwotCQkgICpzID0gYzsKLQkJfQotCSAgICAgIG9wY29kZSB8PSBjbXBsdHIgPDwgMTM7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkgICAgLyogSGFuZGxlIGEgdW5pdCBpbnN0cnVjdGlvbiBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICdVJzoKLQkgICAgICBjbXBsdHIgPSAwOwotCSAgICAgIGZsYWcgPSAwOwotCSAgICAgIGlmICgqcyA9PSAnLCcpCi0JCXsKLQkJICBzKys7Ci0KLQotCQkgIGlmIChzdHJuY2FzZWNtcCAocywgInNieiIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNoeiIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDM7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNkYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDQ7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNiYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDY7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNoYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDc7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInRyIiwgMikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5ieiIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuaHoiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAzOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAzOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmRjIiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5iYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDY7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuaGMiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA3OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAzOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBMb2dpY2FsIEluc3RydWN0aW9uIENvbmRpdGlvbi4iKSk7Ci0JCX0KLQkgICAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOwotCi0JICAgIC8qIEhhbmRsZSBhIHNoaWZ0L2V4dHJhY3QvZGVwb3NpdCBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICd8JzoKLQkgICAgY2FzZSAnPic6Ci0JICAgICAgY21wbHRyID0gMDsKLQkgICAgICBpZiAoKnMgPT0gJywnKQotCQl7Ci0JCSAgc2F2ZV9zID0gcysrOwotCi0KLQkJICBuYW1lID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkgICAgcyArPSAxOwotCQkgIGMgPSAqczsKLQkJICAqcyA9IDB4MDA7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gMTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDI7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDM7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCQkgICAgY21wbHRyID0gNTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCSAgICBjbXBsdHIgPSA2OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JCSAgICBjbXBsdHIgPSA3OwotCQkgIC8qIEhhbmRsZSBtb3ZiLG4uICBQdXQgdGhpbmdzIGJhY2sgdGhlIHdheSB0aGV5IHdlcmUuCi0JCSAgICAgVGhpcyBpbmNsdWRlcyBtb3ZpbmcgcyBiYWNrIHRvIHdoZXJlIGl0IHN0YXJ0ZWQuICAqLwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiAqYXJncyA9PSAnfCcpCi0JCSAgICB7Ci0JCSAgICAgICpzID0gYzsKLQkJICAgICAgcyA9IHNhdmVfczsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIFNoaWZ0L0V4dHJhY3QvRGVwb3NpdCBDb25kaXRpb24uIikpOwotCQkgICpzID0gYzsKLQkJfQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGJ2YiBhbmQgYmIgY29uZGl0aW9ucy4gICovCi0JICAgIGNhc2UgJ34nOgotCSAgICAgIGNtcGx0ciA9IDA7Ci0JICAgICAgaWYgKCpzID09ICcsJykKLQkJewotCQkgIHMrKzsKLQkJICBpZiAoc3RybmNtcCAocywgIjwiLCAxKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAwOwotCQkgICAgICBzKys7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNtcCAocywgIj49IiwgMikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMTsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBCaXQgQnJhbmNoIENvbmRpdGlvbjogJWMiKSwgKnMpOwotCQl9Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDE1KTsKLQotCSAgICAvKiBIYW5kbGUgYSBzeXN0ZW0gY29udHJvbCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdaJzoKLQkgICAgICBpZiAoKnMgPT0gJywnICYmICgqKHMgKyAxKSA9PSAnbScgfHwgKihzICsgMSkgPT0gJ00nKSkKLQkJewotCQkgIGZsYWcgPSAxOwotCQkgIHMgKz0gMjsKLQkJfQotCSAgICAgIGVsc2UKLQkJZmxhZyA9IDA7Ci0KLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgY2FzZSAnbic6Ci0JICAgICAgbnVsbGlmID0gcGFfcGFyc2VfbnVsbGlmICgmcyk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudWxsaWYsIDEpOwotCi0JICAgIC8qIEhhbmRsZSBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBjb3ByIGFuZCBzcG9wIGluc25zLiAgKi8KLQkgICAgY2FzZSAnTic6Ci0JICAgICAgbnVsbGlmID0gcGFfcGFyc2VfbnVsbGlmICgmcyk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudWxsaWYsIDUpOwotCi0KLQkgICAgLyogSGFuZGxlIGEgMTEgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ2knOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDEwMjMsIC0xMDI0LCAwKTsKLQkJICBsb3dfc2lnbl91bmV4dCAobnVtLCAxMSwgJm51bSk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxMTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0KLQkgICAgLyogSGFuZGxlIGEgMTQgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ2onOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTEsIC04MTkyLCAwKTsKLQkJICBsb3dfc2lnbl91bmV4dCAobnVtLCAxNCwgJm51bSk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDIxIGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdrJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtID4+IDExLCAxMDQ4NTc1LCAtMTA0ODU3NiwgMCk7Ci0JCSAgZGlzX2Fzc2VtYmxlXzIxIChudW0sICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMjE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAxMiBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudC4gICovCi0JICAgIGNhc2UgJ3cnOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLCAiTCQwXDAwMSIpKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTksIC04MTg0LCAwKTsKLQkJICBzaWduX3VuZXh0ICgobnVtIC0gOCkgPj4gMiwgMTIsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xMiAocmVzdWx0LCAmdzEsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsICgodzEgPDwgMikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDEyOwotCQkgIHRoZV9pbnNuLmFyZ19yZWxvYyA9IGxhc3RfY2FsbF9kZXNjLmFyZ19yZWxvYzsKLQkJICBtZW1zZXQgKCZsYXN0X2NhbGxfZGVzYywgMCwgc2l6ZW9mIChzdHJ1Y3QgY2FsbF9kZXNjKSk7Ci0JCSAgcyA9IGV4cHJfZW5kOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLwotCSAgICBjYXNlICdXJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGlmICghdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbAotCQkgIHx8ICFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLAotCQkJICAgICAgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MiwgdzEsIHcsIHJlc3VsdDsKLQotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJSA0KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkJyYW5jaCB0byB1bmFsaWduZWQgYWRkcmVzcyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgMjYyMTQzLCAtMjYyMTQ0LCAwKTsKLQotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKQotCQkgICAgbnVtIC09IDg7Ci0KLQkJICBzaWduX3VuZXh0IChudW0gPj4gMiwgMTcsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xNyAocmVzdWx0LCAmdzEsICZ3MiwgJncpOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwKLQkJCQkJICAgKCh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDE3OwotCQkgIHRoZV9pbnNuLmFyZ19yZWxvYyA9IGxhc3RfY2FsbF9kZXNjLmFyZ19yZWxvYzsKLQkJICBtZW1zZXQgKCZsYXN0X2NhbGxfZGVzYywgMCwgc2l6ZW9mIChzdHJ1Y3QgY2FsbF9kZXNjKSk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYW4gYWJzb2x1dGUgMTcgYml0IGJyYW5jaCB0YXJnZXQuICAqLwotCSAgICBjYXNlICd6JzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAwOwotCSAgICAgIGlmICghdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbAotCQkgIHx8ICFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLAotCQkJICAgICAgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MiwgdzEsIHcsIHJlc3VsdDsKLQotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJSA0KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkJyYW5jaCB0byB1bmFsaWduZWQgYWRkcmVzcyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgMjYyMTQzLCAtMjYyMTQ0LCAwKTsKLQotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKQotCQkgICAgbnVtIC09IDg7Ci0KLQkJICBzaWduX3VuZXh0IChudW0gPj4gMiwgMTcsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xNyAocmVzdWx0LCAmdzEsICZ3MiwgJncpOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwKLQkJCQkJICAgKCh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9BQlNfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNzsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgc2hpZnQgY291bnQgYXQgMjYuICAqLwotCSAgICBjYXNlICdwJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIDMxIC0gbnVtLCA1KTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCBiaXQgcG9zaXRpb24gYXQgMjYuICAqLwotCSAgICBjYXNlICdQJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDEwLiAgKi8KLQkgICAgY2FzZSAnUSc6Ci0KLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxMyBiaXQgaW1tZWRpYXRlIGF0IDE4LiAgKi8KLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBhIDI2IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdEJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDY3MTEwODg2NCwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDMgYml0IFNGVSBpZGVudGlmaWVyIGF0IDI1LiAgKi8KLQkgICAgY2FzZSAnZic6Ci0JICAgICAgaWYgKCpzKysgIT0gJywnKQotCQlhc19iYWQgKF8oIkludmFsaWQgU0ZVIGlkZW50aWZpZXIiKSk7Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA3LCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgMjAgYml0IFNPUCBmaWVsZCBmb3Igc3BvcDAuICAqLwotCSAgICBjYXNlICdPJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDEwNDg1NzUsIDAsIDApOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDBmZmZlMCkgPDwgNik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDE1Yml0IFNPUCBmaWVsZCBmb3Igc3BvcDEuICAqLwotCSAgICBjYXNlICdvJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMyNzY3LCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTEpOwotCi0JICAgIC8qIEhhbmRsZSBhIDEwYml0IFNPUCBmaWVsZCBmb3Igc3BvcDMuICAqLwotCSAgICBjYXNlICcwJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDEwMjMsIDAsIDApOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDAwMDNlMCkgPDwgNik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDE1IGJpdCBTT1AgZmllbGQgZm9yIHNwb3AyLiAgKi8KLQkgICAgY2FzZSAnMSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMjc2NywgMCwgMCk7Ci0JICAgICAgbnVtID0gKG51bSAmIDB4MWYpIHwgKChudW0gJiAweDAwMDA3ZmUwKSA8PCA2KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMy1iaXQgY28tcHJvY2Vzc29yIElEIGZpZWxkLiAgKi8KLQkgICAgY2FzZSAndSc6Ci0JICAgICAgaWYgKCpzKysgIT0gJywnKQotCQlhc19iYWQgKF8oIkludmFsaWQgQ09QUiBpZGVudGlmaWVyIikpOwotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDIyYml0IFNPUCBmaWVsZCBmb3IgY29wci4gICovCi0JICAgIGNhc2UgJzInOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNDE5NDMwMywgMCwgMCk7Ci0JICAgICAgbnVtID0gKG51bSAmIDB4MWYpIHwgKChudW0gJiAweDAwM2ZmZmUwKSA8PCA0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQotCSAgICAvKiBIYW5kbGUgYSBzb3VyY2UgRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyLiAgKi8KLQkgICAgY2FzZSAnRic6Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOwotCSAgICAgIHRoZV9pbnNuLmZwb2YxID0gZmxhZzsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCSAgICAvKiBIYW5kbGUgYSBkZXN0aW5hdGlvbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdHJzoKLQkgICAgICAvKiBwYV9wYXJzZV9mb3JtYXQgbmVlZHMgdGhlICcsJyBwcmVmaXguICAqLwotCSAgICAgIHMtLTsKLQkgICAgICBmbGFnID0gcGFfcGFyc2VfZnBfZm9ybWF0ICgmcyk7Ci0JICAgICAgdGhlX2luc24uZnBvZjIgPSBmbGFnOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBGUCBjb21wYXJlIGNvbmRpdGlvbnMuICAqLwotCSAgICBjYXNlICdNJzoKLQkgICAgICBjb25kID0gcGFfcGFyc2VfZnBfY21wX2NvbmQgKCZzKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNvbmQsIDApOwotCi0JICAgIC8qIEhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzIGxpa2UgJ3QnLiAgKi8KLQkgICAgY2FzZSAndic6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJb3Bjb2RlIHw9IHJlc3VsdC5udW1iZXJfcGFydDsKLQotCQkvKiAweDMwIG9wY29kZXMgYXJlIEZQIGFyaXRobWV0aWMgb3BlcmF0aW9uIG9wY29kZXMKLQkJICAgYW5kIG5lZWQgdG8gYmUgdHVybmVkIGludG8gMHgzOCBvcGNvZGVzLiAgVGhpcwotCQkgICBpcyBub3QgbmVjZXNzYXJ5IGZvciBsb2Fkcy9zdG9yZXMuICAqLwotCQlpZiAobmVlZF9wYTExX29wY29kZSAoJnRoZV9pbnNuLCAmcmVzdWx0KQotCQkgICAgJiYgKChvcGNvZGUgJiAweGZjMDAwMDAwKSA9PSAweDMwMDAwMDAwKSkKLQkJICBvcGNvZGUgfD0gMSA8PCAyNzsKLQotCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSwgNik7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzIGxpa2UgJ2InLiAgKi8KLQkgICAgY2FzZSAnRSc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJb3Bjb2RlIHw9IHJlc3VsdC5udW1iZXJfcGFydCA8PCAyMTsKLQkJaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgewotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDc7Ci0JCSAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQkJICB9Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICdiJy4gICovCi0JICAgIGNhc2UgJzMnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCQlpbnQgcmVnbnVtOwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCW9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgxYykgPDwgMTE7Ci0JCW9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgzKSA8PCA5OwotCQlvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgODsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzIGxpa2UgJ3gnLiAgKi8KLQkgICAgY2FzZSAnZSc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFmKSA8PCAxNjsKLQkJaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgewotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDE7Ci0JCSAgfQotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMgbGlrZSAneCcuICAqLwotCSAgICBjYXNlICdYJzoKLQkgICAgICB7Ci0JCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQlvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MWYpIDw8IDE2OwotCQlpZiAobmVlZF9wYTExX29wY29kZSAoJnRoZV9pbnNuLCAmcmVzdWx0KSkKLQkJICB7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgMTI7Ci0JCSAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQkJICB9Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAxMC4gICovCi0JICAgIGNhc2UgJzQnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCWlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgewotCQkgICAgaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQotCQkgICAgICB7Ci0JCQlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICB9Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAyMSk7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnNic6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICB7Ci0JCSAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICB9Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAxNik7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICB7Ci0JCSAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICB9Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAwKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMjAuICAqLwotCSAgICBjYXNlICc4JzoKLQkgICAgICB7Ci0JCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQlpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQotCQkgIHsKLQkJICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKLQkJICAgICAgewotCQkJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgIH0KLQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDExKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMjUuICAqLwotCSAgICBjYXNlICc5JzoKLQkgICAgICB7Ci0JCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQlpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQotCQkgIHsKLQkJICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKLQkJICAgICAgewotCQkJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgIH0KLQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDYpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSBmbG9hdGluZyBwb2ludCBvcGVyYW5kIGZvcm1hdCBhdCAyNi4KLQkgICAgICAgT25seSBhbGxvd3Mgc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uLiAgKi8KLQkgICAgY2FzZSAnSCc6Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOwotCSAgICAgIHN3aXRjaCAoZmxhZykKLQkJewotCQljYXNlIFNHTDoKLQkJICBvcGNvZGUgfD0gMHgyMDsKLQkJY2FzZSBEQkw6Ci0JCSAgdGhlX2luc24uZnBvZjEgPSBmbGFnOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgUVVBRDoKLQkJY2FzZSBJTExFR0FMX0ZNVDoKLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIkludmFsaWQgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQuIikpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gZmFpbGVkOgotICAgICAgLyogQ2hlY2sgaWYgdGhlIGFyZ3MgbWF0Y2hlZC4gICovCi0gICAgICBpZiAobWF0Y2ggPT0gRkFMU0UpCi0JewotCSAgaWYgKCZpbnNuWzFdIC0gcGFfb3Bjb2RlcyA8IChpbnQpIE5VTU9QQ09ERVMKLQkgICAgICAmJiAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIHMgPSBhcmdzdGFydDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG9wZXJhbmRzICVzIiksIGVycm9yX21lc3NhZ2UpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogV3JpdGUgb3V0IGJpZy1lbmRpYW4uICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLQotYXJlbGVudCAqKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0gIHN0YXRpYyBhcmVsZW50ICpub19yZWxvY3MgPSBOVUxMOwotICBhcmVsZW50ICoqcmVsb2NzOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgKipjb2RlczsKLSAgaW50IG5fcmVsb2NzOwotICBpbnQgaTsKLQotICBocHBhX2ZpeHAgPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKSBmaXhwLT50Y19maXhfZGF0YTsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IDApCi0gICAgcmV0dXJuICZub19yZWxvY3M7Ci0gIGFzc2VydCAoaHBwYV9maXhwICE9IDApOwotICBhc3NlcnQgKHNlY3Rpb24gIT0gMCk7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIGNvZGVzID0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAqKikgaHBwYV9nZW5fcmVsb2NfdHlwZSAoc3Rkb3V0cHV0LAotCQkJICAgICAgIGZpeHAtPmZ4X3JfdHlwZSwKLQkJCSAgICAgICBocHBhX2ZpeHAtPmZ4X3JfZm9ybWF0LAotCQkJICAgICAgIGhwcGFfZml4cC0+Znhfcl9maWVsZCwKLQkJCSAgICAgICBmaXhwLT5meF9zdWJzeSAhPSBOVUxMLAotCQkJICAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSkpOwotCi0gIGlmIChjb2RlcyA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIGZvciAobl9yZWxvY3MgPSAwOyBjb2Rlc1tuX3JlbG9jc107IG5fcmVsb2NzKyspCi0gICAgOwotCi0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiBuX3JlbG9jcyArIDEpOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkgKiBuX3JlbG9jcyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuX3JlbG9jczsgaSsrKQotICAgIHJlbG9jc1tpXSA9ICZyZWxvY1tpXTsKLQotICByZWxvY3Nbbl9yZWxvY3NdID0gTlVMTDsKLQotI2lmZGVmIE9CSl9FTEYKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQgKG5fcmVsb2NzID09IDEpOwotCi0gICAgICBjb2RlID0gKmNvZGVzWzBdOwotCi0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gMDsJLyogZGVmYXVsdCAqLwotCi0gICAgICBhc3NlcnQgKHJlbG9jLT5ob3d0byAmJiBjb2RlID09IHJlbG9jLT5ob3d0by0+dHlwZSk7Ci0KLSAgICAgIC8qIE5vdywgZG8gYW55IHByb2Nlc3NpbmcgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIHJlbG9jYXRpb24gdHlwZS4gICovCi0gICAgICBzd2l0Y2ggKGNvZGUpCi0JewotCWNhc2UgUl9QQVJJU0NfRExUUkVMMjFMOgotCWNhc2UgUl9QQVJJU0NfRExUUkVMMTRSOgotCWNhc2UgUl9QQVJJU0NfRExUUkVMMTRGOgotCWNhc2UgUl9QQVJJU0NfUExBQkVMMzI6Ci0JY2FzZSBSX1BBUklTQ19QTEFCRUwyMUw6Ci0JY2FzZSBSX1BBUklTQ19QTEFCRUwxNFI6Ci0JICAvKiBGb3IgcGxhYmVsIHJlbG9jYXRpb25zLCB0aGUgYWRkZW5kIG9mIHRoZQotCSAgICAgcmVsb2NhdGlvbiBzaG91bGQgYmUgZWl0aGVyIDAgKG5vIHN0YXRpYyBsaW5rKSBvciAyCi0JICAgICAoc3RhdGljIGxpbmsgcmVxdWlyZWQpLgotCi0JICAgICBGSVhNRTogV2UgYWx3YXlzIGFzc3VtZSBubyBzdGF0aWMgbGluayEKLQotCSAgICAgV2UgYWxzbyBzbGFtIGEgemVybyBhZGRlbmQgaW50byB0aGUgRExUIHJlbGF0aXZlIHJlbG9jczsKLQkgICAgIGl0IGRvZXNuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSB0byB1c2UgYW55IGFkZGVuZCBzaW5jZQotCSAgICAgaXQgZ2V0cyB5b3UgYSBkaWZmZXJlbnQgKGVnIHVua25vd24pIERMVCBlbnRyeS4gICovCi0JICByZWxvYy0+YWRkZW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTdSOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxN0Y6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDE3QzoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0JICAvKiBUaGUgY29uc3RhbnQgaXMgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICByZWxvYy0+YWRkZW5kID0gSFBQQV9SX0FEREVORCAoaHBwYV9maXhwLT5meF9hcmdfcmVsb2MsIDApOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0jZWxzZSAvKiBPQkpfU09NICovCi0KLSAgLyogV2FsayBvdmVyIHJlYWNoIHJlbG9jYXRpb24gcmV0dXJuZWQgYnkgdGhlIEJGRCBiYWNrZW5kLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5fcmVsb2NzOyBpKyspCi0gICAgewotICAgICAgY29kZSA9ICpjb2Rlc1tpXTsKLQotICAgICAgcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2NzW2ldLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgICAgIHJlbG9jc1tpXS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAgICAgc3dpdGNoIChjb2RlKQotCXsKLQljYXNlIFJfQ09NUDI6Ci0JICAvKiBUaGUgb25seSB0aW1lIHdlIGV2ZXIgdXNlIGEgUl9DT01QMiBmaXh1cCBpcyBmb3IgdGhlIGRpZmZlcmVuY2UKLQkgICAgIG9mIHR3byBzeW1ib2xzLiAgV2l0aCB0aGF0IGluIG1pbmQgd2UgZmlsbCBpbiBhbGwgZm91cgotCSAgICAgcmVsb2NzIG5vdyBhbmQgYnJlYWsgb3V0IG9mIHRoZSBsb29wLiAgKi8KLQkgIGFzc2VydCAoaSA9PSAxKTsKLQkgIHJlbG9jc1swXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgJihiZmRfYWJzX3N5bWJvbCk7Ci0JICByZWxvY3NbMF0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1swXSk7Ci0JICByZWxvY3NbMF0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMF0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbMV0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0JICAqcmVsb2NzWzFdLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0JICByZWxvY3NbMV0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1sxXSk7Ci0JICByZWxvY3NbMV0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMV0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbMl0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0JICAqcmVsb2NzWzJdLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9zdWJzeSk7Ci0JICByZWxvY3NbMl0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1syXSk7Ci0JICByZWxvY3NbMl0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMl0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbM10tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopICYoYmZkX2Fic19zeW1ib2wpOwotCSAgcmVsb2NzWzNdLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCAqY29kZXNbM10pOwotCSAgcmVsb2NzWzNdLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCSAgcmVsb2NzWzNdLT5hZGRlbmQgPSAwOwotCSAgcmVsb2NzWzRdLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSAmKGJmZF9hYnNfc3ltYm9sKTsKLQkgIHJlbG9jc1s0XS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgKmNvZGVzWzRdKTsKLQkgIHJlbG9jc1s0XS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQkgIHJlbG9jc1s0XS0+YWRkZW5kID0gMDsKLQkgIGdvdG8gZG9uZTsKLQljYXNlIFJfUENSRUxfQ0FMTDoKLQljYXNlIFJfQUJTX0NBTEw6Ci0JICByZWxvY3NbaV0tPmFkZGVuZCA9IEhQUEFfUl9BRERFTkQgKGhwcGFfZml4cC0+ZnhfYXJnX3JlbG9jLCAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0RMVF9SRUw6Ci0JY2FzZSBSX0RBVEFfUExBQkVMOgotCWNhc2UgUl9DT0RFX1BMQUJFTDoKLQkgIC8qIEZvciBwbGFiZWwgcmVsb2NhdGlvbnMsIHRoZSBhZGRlbmQgb2YgdGhlCi0JICAgICByZWxvY2F0aW9uIHNob3VsZCBiZSBlaXRoZXIgMCAobm8gc3RhdGljIGxpbmspIG9yIDIKLQkgICAgIChzdGF0aWMgbGluayByZXF1aXJlZCkuCi0KLQkgICAgIEZJWE1FOiBXZSBhbHdheXMgYXNzdW1lIG5vIHN0YXRpYyBsaW5rIQotCi0JICAgICBXZSBhbHNvIHNsYW0gYSB6ZXJvIGFkZGVuZCBpbnRvIHRoZSBETFQgcmVsYXRpdmUgcmVsb2NzOwotCSAgICAgaXQgZG9lc24ndCBtYWtlIGEgbG90IG9mIHNlbnNlIHRvIHVzZSBhbnkgYWRkZW5kIHNpbmNlCi0JICAgICBpdCBnZXRzIHlvdSBhIGRpZmZlcmVudCAoZWcgdW5rbm93bikgRExUIGVudHJ5LiAgKi8KLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX05fTU9ERToKLQljYXNlIFJfU19NT0RFOgotCWNhc2UgUl9EX01PREU6Ci0JY2FzZSBSX1JfTU9ERToKLQljYXNlIFJfRlNFTDoKLQljYXNlIFJfTFNFTDoKLQljYXNlIFJfUlNFTDoKLQljYXNlIFJfQkVHSU5fQlJUQUI6Ci0JY2FzZSBSX0VORF9CUlRBQjoKLQljYXNlIFJfQkVHSU5fVFJZOgotCWNhc2UgUl9OMFNFTDoKLQljYXNlIFJfTjFTRUw6Ci0JICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgb3IgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBmaXh1cHMuICAqLwotICAgICAgICAgIHJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICAgICAqcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChkdW1teV9zeW1ib2wpOwotCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfRU5EX1RSWToKLQljYXNlIFJfRU5UUlk6Ci0JY2FzZSBSX0VYSVQ6Ci0JICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGZpeHVwcy4gICovCi0gICAgICAgICAgcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgICAgICpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGR1bW15X3N5bWJvbCk7Ci0JICByZWxvY3NbaV0tPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotCX0KLSAgICB9Ci0KLSBkb25lOgotI2VuZGlmCi0KLSAgcmV0dXJuIHJlbG9jczsKLX0KLQotLyogUHJvY2VzcyBhbnkgbWFjaGluZSBkZXBlbmRlbnQgZnJhZyB0eXBlcy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgcmVnaXN0ZXIgYmZkICphYmZkOwotICAgICByZWdpc3RlciBhc2VjdGlvbiAqc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHVuc2lnbmVkIGludCBhZGRyZXNzOwotCi0gIGlmIChmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKChpbnQpIGZyYWdQLT5mcl9zdWJ0eXBlKQotCXsKLQljYXNlIDA6Ci0JICBmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBrbm93IChmcmFnUC0+ZnJfdmFyID09IDEpOwotCSAga25vdyAoZnJhZ1AtPmZyX25leHQpOwotCSAgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeDsKLQkgIGlmIChhZGRyZXNzICUgZnJhZ1AtPmZyX29mZnNldCkKLQkgICAgewotCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQgPQotCQlmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwotCQktIGZyYWdQLT5mcl9hZGRyZXNzCi0JCS0gZnJhZ1AtPmZyX2ZpeDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBhc2VjdGlvbiAqc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIGludCBhbGlnbjIgPSAoMSA8PCBhbGlnbikgLSAxOwotCi0gIHJldHVybiAoc2l6ZSArIGFsaWduMikgJiB+YWxpZ24yOwotfQotCi0vKiBSZXR1cm4gdGhlIGFwcHJveGltYXRlIHNpemUgb2YgYSBmcmFnIGJlZm9yZSByZWxheGF0aW9uIGhhcyBvY2N1cnJlZC4gICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBhc2VjdGlvbiAqc2VnbWVudDsKLXsKLSAgaW50IHNpemU7Ci0KLSAgc2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKChmcmFnUC0+ZnJfZml4ICsgc2l6ZSkgJSBmcmFnUC0+ZnJfb2Zmc2V0KQotICAgIHNpemUrKzsKLQotICByZXR1cm4gc2l6ZTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4UDsKLSAgbG9uZyBuZXdfdmFsLCByZXN1bHQgPSAwOwotICB1bnNpZ25lZCBpbnQgdzEsIHcyLCB3LCByZXN1bHRpOwotCi0gIGhwcGFfZml4UCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopIGZpeFAtPnRjX2ZpeF9kYXRhOwotICAvKiBTT00gdXNlcyBSX0hQUEFfRU5UUlkgYW5kIFJfSFBQQV9FWElUIHJlbG9jYXRpb25zIHdoaWNoIGNhbgotICAgICBuZXZlciBiZSAiYXBwbGllZCIgKHRoZXkgYXJlIGp1c3QgbWFya2VycykuICBMaWtld2lzZSBmb3IKLSAgICAgUl9IUFBBX0JFR0lOX0JSVEFCIGFuZCBSX0hQUEFfRU5EX0JSVEFCLiAgKi8KLSNpZmRlZiBPQkpfU09NCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VOVFJZCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VYSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fQlJUQUIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX0JSVEFCCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0JFR0lOX1RSWSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBEaXNndXN0aW5nLiAgV2UgbXVzdCBzZXQgZnhfb2Zmc2V0IG91cnNlbHZlcyAtLSBSX0hQUEFfRU5EX1RSWQotICAgICBmaXh1cHMgYXJlIGNvbnNpZGVyZWQgbm90IGFkanVzdGFibGUsIHdoaWNoIGluIHR1cm4gY2F1c2VzCi0gICAgIGFkanVzdF9yZWxvY19zeW1zIHRvIG5vdCBzZXQgZnhfb2Zmc2V0LiAgVWdoLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX1RSWSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9vZmZzZXQgPSAqdmFscDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYW4gSFBQQSBzcGVjaWZpYyBmaXh1cCBhc3NvY2lhdGVkCi0gICAgIHdpdGggdGhlIEdBUyBmaXh1cC4gICovCi0gIGlmIChocHBhX2ZpeFApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBidWZfd2QgPSBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1Zik7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGZtdCA9IGJmZF9ocHBhX2luc24yZm10IChidWZfd2QpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaXh1cCwgdGhlbiBpdCdzIHNvbWV0aGluZwotCSB3aGljaCB3aWxsIG5lZWQgYSBTT00gcmVsb2NhdGlvbiAoZXhjZXB0IGZvciBzb21lIFBDLXJlbGF0aXZlIHJlbG9jcykuCi0JIEluIHN1Y2ggY2FzZXMgd2Ugc2hvdWxkIHRyZWF0IHRoZSAidmFsIiBvciAiYWRkZW5kIiBhcyB6ZXJvIHNpbmNlIGl0Ci0JIHdpbGwgYmUgYWRkZWQgaW4gYXMgbmVlZGVkIGZyb20gZnhfb2Zmc2V0IGluIHRjX2dlbl9yZWxvYy4gICovCi0gICAgICBpZiAoKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX05PTkUpCi0jaWZkZWYgT0JKX1NPTQotCSAgJiYgZm10ICE9IDMyCi0jZW5kaWYKLQkgICkKLQluZXdfdmFsID0gKChmbXQgPT0gMTIgfHwgZm10ID09IDE3IHx8IGZtdCA9PSAyMikgPyA4IDogMCk7Ci0jaWZkZWYgT0JKX1NPTQotICAgICAgLyogVGhlc2UgZmllbGQgc2VsZWN0b3JzIGltcGx5IHRoYXQgd2UgZG8gbm90IHdhbnQgYW4gYWRkZW5kLiAgKi8KLSAgICAgIGVsc2UgaWYgKGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3BzZWwKLQkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfcnBzZWwKLQkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfbHBzZWwKLQkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfdHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9ydHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9sdHNlbCkKLQluZXdfdmFsID0gKChmbXQgPT0gMTIgfHwgZm10ID09IDE3IHx8IGZtdCA9PSAyMikgPyA4IDogMCk7Ci0gICAgICAvKiBUaGlzIGlzIHRydWVseSBkaXNndXN0aW5nLiAgVGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBibGluZGx5Ci0JIGFkZHMgaW4gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYmVpbmcgcmVsb2NhdGVkIGFnYWluc3QuICBEYW1uISAgKi8KLSAgICAgIGVsc2UgaWYgKGZtdCA9PSAzMgotCSAgICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0JICAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBiZmRfY29tX3NlY3Rpb25fcHRyKQotCW5ld192YWwgPSBocHBhX2ZpZWxkX2FkanVzdCAoKnZhbHAgLSBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpLAotCQkJCSAgICAgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKLSNlbmRpZgotICAgICAgZWxzZQotCW5ld192YWwgPSBocHBhX2ZpZWxkX2FkanVzdCAoKnZhbHAsIDAsIGhwcGFfZml4UC0+Znhfcl9maWVsZCk7Ci0KLSAgICAgIC8qIEhhbmRsZSBwYy1yZWxhdGl2ZSBleGNlcHRpb25zIGZyb20gYWJvdmUuICAqLwotI2RlZmluZSBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQoQ0FMTEVSLCBDQUxMRUUpIFwKLSAgKChDQUxMRUUpICYmIChDQUxMRVIpICYmICgoQ0FMTEVFKSAhPSAoQ0FMTEVSKSkpCi0gICAgICBpZiAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcgfHwgZm10ID09IDIyKQotCSAgJiYgZml4UC0+ZnhfYWRkc3kKLQkgICYmIGZpeFAtPmZ4X3BjcmVsCi0jaWZkZWYgT0JKX1NPTQotCSAgJiYgIWFyZ19yZWxvY19zdHViX25lZWRlZCAoKGxvbmcpICgob2JqX3N5bWJvbF90eXBlICopCi0JCXN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSkpLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jLAotCQlocHBhX2ZpeFAtPmZ4X2FyZ19yZWxvYykKLSNlbmRpZgotCSAgJiYgKCgoaW50KSgqdmFscCkgPiAtMjYyMTQ0ICYmIChpbnQpKCp2YWxwKSA8IDI2MjE0MykgJiYgZm10ICE9IDIyKQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpID09IGhwcGFfZml4UC0+c2VnbWVudAotCSAgJiYgIShmaXhQLT5meF9zdWJzeQotCSAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9zdWJzeSkgIT0gaHBwYV9maXhQLT5zZWdtZW50KSkKLQkgICAgICAKLQluZXdfdmFsID0gaHBwYV9maWVsZF9hZGp1c3QgKCp2YWxwLCAwLCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQpOwotI3VuZGVmIGFyZ19yZWxvY19zdHViX25lZWRlZAotCQotICAgICAgc3dpdGNoIChmbXQpCi0JewotCS8qIEhhbmRsZSBhbGwgb3Bjb2RlcyB3aXRoIHRoZSAnaicgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDE0OgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDgxOTEsIC04MTkyLCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTQgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmYzAwMCwKLQkJICAgICAgYnVmKTsKLQkgIGxvd19zaWduX3VuZXh0IChuZXdfdmFsLCAxNCwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCBvcGNvZGVzIHdpdGggdGhlICdrJyBvcGVyYW5kIHR5cGUuICAqLwotCWNhc2UgMjE6Ci0JICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgMjA5NzE1MiwgMCwgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDIxIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZlMDAwMDAsCi0JCSAgICAgIGJ1Zik7Ci0JICBkaXNfYXNzZW1ibGVfMjEgKG5ld192YWwsICZyZXN1bHRpKTsKLQkgIHJlc3VsdCA9IHJlc3VsdGk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ2knIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxMToKLQkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCAxMDIzLCAtMTAyMywgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDExIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZmZjgwMCwKLQkJICAgICAgYnVmKTsKLQkgIGxvd19zaWduX3VuZXh0IChuZXdfdmFsLCAxMSwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSAndycgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDEyOgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDgxOTksIC04MTg0LCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTEgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIHNpZ25fdW5leHQgKChuZXdfdmFsIC0gOCkgPj4gMiwgMTIsICZyZXN1bHRpKTsKLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmZTAwMiwKLQkJICAgICAgYnVmKTsKLQotCSAgZGlzX2Fzc2VtYmxlXzEyIChyZXN1bHRpLCAmdzEsICZ3KTsKLQkgIHJlc3VsdCA9ICgodzEgPDwgMikgfCB3KTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIHNvbWUgb2YgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ1cnIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxNzoKLQkgIHsKLQkgICAgaW50IGRpc3RhbmNlID0gKnZhbHA7Ci0KLQkgICAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkgICAgLyogSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggKGllIG5vIGxpbmspIHdpdGggYW4gb3V0IG9mCi0JICAgICAgIHJhbmdlIHRhcmdldCwgdGhlbiB3ZSB3YW50IHRvIGNvbXBsYWluLiAgKi8KLQkgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfUENSRUxfQ0FMTAotCQkmJiAoZGlzdGFuY2UgPiAyNjIxNDMgfHwgZGlzdGFuY2UgPCAtMjYyMTQ0KQotCQkmJiAoYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwMDAwMCkgPT0gMHhlODAwMDAwMCkKLQkgICAgICBDSEVDS19GSUVMRCAoZGlzdGFuY2UsIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkgICAgLyogTWFzayBvZmYgMTcgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgICAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAotCQkJYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwZTAwMiwKLQkJCWJ1Zik7Ci0JICAgIHNpZ25fdW5leHQgKChuZXdfdmFsIC0gOCkgPj4gMiwgMTcsICZyZXN1bHRpKTsKLQkgICAgZGlzX2Fzc2VtYmxlXzE3IChyZXN1bHRpLCAmdzEsICZ3MiwgJncpOwotCSAgICByZXN1bHQgPSAoKHcyIDw8IDIpIHwgKHcxIDw8IDE2KSB8IHcpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgMzI6Ci0JICByZXN1bHQgPSAwOwotCSAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LCBuZXdfdmFsLCBidWYpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfYmFkIChfKCJVbmtub3duIHJlbG9jYXRpb24gZW5jb3VudGVyZWQgaW4gbWRfYXBwbHlfZml4LiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogSW5zZXJ0IHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpIHwgcmVzdWx0LCBidWYpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmIChfKCJubyBocHBhX2ZpeHVwIGVudHJ5IGZvciB0aGlzIGZpeHVwIChmaXhQID0gMHgleCwgdHlwZSA9IDB4JXgpXG4iKSwKLQkgICAgICAodW5zaWduZWQgaW50KSBmaXhQLCBmaXhQLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgUEEsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldC4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLS8qIFJldHVybiBub256ZXJvIGlmIHRoZSBpbnB1dCBsaW5lIHBvaW50ZXIgaXMgYXQgdGhlIGVuZCBvZgotICAgYSBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgaW50Ci1pc19lbmRfb2Zfc3RhdGVtZW50ICgpCi17Ci0gIHJldHVybiAoKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgIHx8ICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc7JykKLQkgIHx8ICgqaW5wdXRfbGluZV9wb2ludGVyID09ICchJykpOwotfQotCi0vKiBSZWFkIGEgbnVtYmVyIGZyb20gUy4gIFRoZSBudW1iZXIgbWlnaHQgY29tZSBpbiBvbmUgb2YgbWFueSBmb3JtcywKLSAgIHRoZSBtb3N0IGNvbW1vbiB3aWxsIGJlIGEgaGV4IG9yIGRlY2ltYWwgY29uc3RhbnQsIGJ1dCBpdCBjb3VsZCBiZQotICAgYSBwcmUtZGVmaW5lZCByZWdpc3RlciAoWXVrISksIG9yIGFuIGFic29sdXRlIHN5bWJvbC4KLQotICAgUmV0dXJuIGEgbnVtYmVyIG9yIC0xIGZvciBmYWlsdXJlLgotCi0gICBXaGVuIHBhcnNpbmcgUEEtODkgRlAgcmVnaXN0ZXIgbnVtYmVycyBSRVNVTFQgd2lsbCBiZQotICAgdGhlIGFkZHJlc3Mgb2YgYSBzdHJ1Y3R1cmUgdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0Ci0gICBML1IgaGFsZiBvZiBGUCByZWdpc3RlcnMsIHN0b3JlIHJlc3VsdHMgdGhlcmUgYXMgYXBwcm9wcmlhdGUuCi0KLSAgIHBhX3BhcnNlX251bWJlciBjYW4gbm90IGhhbmRsZSBuZWdhdGl2ZSBjb25zdGFudHMgYW5kIHdpbGwgZmFpbAotICAgaG9ycmlibHkgaWYgaXQgaXMgcGFzc2VkIHN1Y2ggYSBjb25zdGFudC4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX251bWJlciAocywgcmVzdWx0KQotICAgICBjaGFyICoqczsKLSAgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKnJlc3VsdDsKLXsKLSAgaW50IG51bTsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0gIGludCBzdGF0dXM7Ci0gIGNoYXIgKnAgPSAqczsKLQotICAvKiBTa2lwIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBudW1iZXIuICAqLwotICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCi0gICAgcCA9IHAgKyAxOwotCi0gIC8qIFN0b3JlIGluZm8gaW4gUkVTVUxUIGlmIHJlcXVlc3RlZCBieSBjYWxsZXIuICAqLwotICBpZiAocmVzdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSAtMTsKLSAgICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IC0xOwotICAgIH0KLSAgbnVtID0gLTE7Ci0KLSAgaWYgKGlzZGlnaXQgKCpwKSkKLSAgICB7Ci0gICAgICAvKiBMb29rcyBsaWtlIGEgbnVtYmVyLiAgKi8KLSAgICAgIG51bSA9IDA7Ci0KLSAgICAgIGlmICgqcCA9PSAnMCcgJiYgKCoocCArIDEpID09ICd4JyB8fCAqKHAgKyAxKSA9PSAnWCcpKQotCXsKLQkgIC8qIFRoZSBudW1iZXIgaXMgc3BlY2lmaWVkIGluIGhleC4gICovCi0JICBwICs9IDI7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKnApIHx8ICgoKnAgPj0gJ2EnKSAmJiAoKnAgPD0gJ2YnKSkKLQkJIHx8ICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaXNkaWdpdCAoKnApKQotCQludW0gPSBudW0gKiAxNiArICpwIC0gJzAnOwotCSAgICAgIGVsc2UgaWYgKCpwID49ICdhJyAmJiAqcCA8PSAnZicpCi0JCW51bSA9IG51bSAqIDE2ICsgKnAgLSAnYScgKyAxMDsKLQkgICAgICBlbHNlCi0JCW51bSA9IG51bSAqIDE2ICsgKnAgLSAnQScgKyAxMDsKLQkgICAgICArK3A7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIG51bWJlciBpcyBzcGVjaWZpZWQgaW4gZGVjaW1hbC4gICovCi0JICB3aGlsZSAoaXNkaWdpdCAoKnApKQotCSAgICB7Ci0JICAgICAgbnVtID0gbnVtICogMTAgKyAqcCAtICcwJzsKLQkgICAgICArK3A7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFN0b3JlIGluZm8gaW4gUkVTVUxUIGlmIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyLiAgKi8KLSAgICAgIGlmIChyZXN1bHQpCi0JewotCSAgcmVzdWx0LT5udW1iZXJfcGFydCA9IG51bTsKLQotCSAgaWYgKElTX1JfU0VMRUNUIChwKSkKLQkgICAgewotCSAgICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDE7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JICBlbHNlIGlmIChJU19MX1NFTEVDVCAocCkpCi0JICAgIHsKLQkgICAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCSAgICAgICsrcDsKLQkgICAgfQotCSAgZWxzZQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCpwID09ICclJykKLSAgICB7Ci0gICAgICAvKiBUaGUgbnVtYmVyIG1pZ2h0IGJlIGEgcHJlZGVmaW5lZCByZWdpc3Rlci4gICovCi0gICAgICBudW0gPSAwOwotICAgICAgbmFtZSA9IHA7Ci0gICAgICBwKys7Ci0gICAgICBjID0gKnA7Ci0gICAgICAvKiBUZWdlIGhhY2s6IFNwZWNpYWwgY2FzZSBmb3IgZ2VuZXJhbCByZWdpc3RlcnMgYXMgdGhlIGdlbmVyYWwKLSAgICAgICAgIGNvZGUgbWFrZXMgYSBiaW5hcnkgc2VhcmNoIHdpdGggY2FzZSB0cmFuc2xhdGlvbiwgYW5kIGlzIFZFUlkKLSAgICAgICAgIHNsb3cuICovCi0gICAgICBpZiAoYyA9PSAncicpCi0JewotCSAgcCsrOwotCSAgaWYgKCpwID09ICdlJyAmJiAqKHAgKyAxKSA9PSAndCcKLQkgICAgICAmJiAoKihwICsgMikgPT0gJzAnIHx8ICoocCArIDIpID09ICcxJykpCi0JICAgIHsKLQkgICAgICBwICs9IDI7Ci0JICAgICAgbnVtID0gKnAgLSAnMCcgKyAyODsKLQkgICAgICBwKys7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICdwJykKLQkgICAgewotCSAgICAgIG51bSA9IDI7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0JICBlbHNlIGlmICghaXNkaWdpdCAoKnApKQotCSAgICB7Ci0JICAgICAgaWYgKHByaW50X2Vycm9ycykKLQkJYXNfYmFkIChfKCJVbmRlZmluZWQgcmVnaXN0ZXI6ICclcycuIiksIG5hbWUpOwotCSAgICAgIG51bSA9IC0xOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBkbwotCQludW0gPSBudW0gKiAxMCArICpwKysgLSAnMCc7Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCpwKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRG8gYSBub3JtYWwgcmVnaXN0ZXIgc2VhcmNoLiAgKi8KLQkgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMpKQotCSAgICB7Ci0JICAgICAgcCA9IHAgKyAxOwotCSAgICAgIGMgPSAqcDsKLQkgICAgfQotCSAgKnAgPSAwOwotCSAgc3RhdHVzID0gcmVnX25hbWVfc2VhcmNoIChuYW1lKTsKLQkgIGlmIChzdGF0dXMgPj0gMCkKLQkgICAgbnVtID0gc3RhdHVzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHByaW50X2Vycm9ycykKLQkJYXNfYmFkIChfKCJVbmRlZmluZWQgcmVnaXN0ZXI6ICclcycuIiksIG5hbWUpOwotCSAgICAgIG51bSA9IC0xOwotCSAgICB9Ci0JICAqcCA9IGM7Ci0JfQotCi0gICAgICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgY2FsbGVyLiAgKi8KLSAgICAgIGlmIChyZXN1bHQpCi0JewotCSAgcmVzdWx0LT5udW1iZXJfcGFydCA9IG51bTsKLQkgIGlmIChJU19SX1NFTEVDVCAocCAtIDEpKQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAxOwotCSAgZWxzZSBpZiAoSVNfTF9TRUxFQ1QgKHAgLSAxKSkKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQkgIGVsc2UKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQW5kIGZpbmFsbHksIGl0IGNvdWxkIGJlIGEgc3ltYm9sIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHdoaWNoCi0gICAgICAgICBpcyBlZmZlY3RpdmVseSBhIGNvbnN0YW50LiAgKi8KLSAgICAgIG51bSA9IDA7Ci0gICAgICBuYW1lID0gcDsKLSAgICAgIGMgPSAqcDsKLSAgICAgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMpKQotCXsKLQkgIHAgPSBwICsgMTsKLQkgIGMgPSAqcDsKLQl9Ci0gICAgICAqcCA9IDA7Ci0gICAgICBpZiAoKHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKSkgIT0gTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX2Fic19zZWN0aW9uKQotCSAgICBudW0gPSBTX0dFVF9WQUxVRSAoc3ltKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwcmludF9lcnJvcnMpCi0JCWFzX2JhZCAoXygiTm9uLWFic29sdXRlIHN5bWJvbDogJyVzJy4iKSwgbmFtZSk7Ci0JICAgICAgbnVtID0gLTE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlcmUgaXMgd2hlcmUgd2UnZCBjb21lIGZvciBhbiB1bmRlZmluZWQgc3ltYm9sCi0JICAgICBvciBmb3IgYW4gZW1wdHkgc3RyaW5nLiAgRm9yIGFuIGVtcHR5IHN0cmluZyB3ZQotCSAgICAgd2lsbCByZXR1cm4gemVyby4gIFRoYXQncyBhIGNvbmNlc3Npb24gbWFkZSBmb3IKLQkgICAgIGNvbXBhdGFiaWxpdHkgd2l0aCB0aGUgYnJhaW5kYW1hZ2VkIEhQIGFzc2VtYmxlcnMuICAqLwotCSAgaWYgKCpuYW1lID09IDApCi0JICAgIG51bSA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHJpbnRfZXJyb3JzKQotCQlhc19iYWQgKF8oIlVuZGVmaW5lZCBhYnNvbHV0ZSBjb25zdGFudDogJyVzJy4iKSwgbmFtZSk7Ci0JICAgICAgbnVtID0gLTE7Ci0JICAgIH0KLQl9Ci0gICAgICAqcCA9IGM7Ci0KLSAgICAgIC8qIFN0b3JlIGluZm8gaW4gUkVTVUxUIGlmIHJlcXVlc3RlZCBieSBjYWxsZXIuICAqLwotICAgICAgaWYgKHJlc3VsdCkKLQl7Ci0JICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gbnVtOwotCSAgaWYgKElTX1JfU0VMRUNUIChwIC0gMSkpCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDE7Ci0JICBlbHNlIGlmIChJU19MX1NFTEVDVCAocCAtIDEpKQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCSAgZWxzZQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCX0KLSAgICB9Ci0KLSAgKnMgPSBwOwotICByZXR1cm4gbnVtOwotfQotCi0jZGVmaW5lIFJFR19OQU1FX0NOVAkoc2l6ZW9mKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpCi0KLS8qIEdpdmVuIE5BTUUsIGZpbmQgdGhlIHJlZ2lzdGVyIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhhdCBuYW1lLCByZXR1cm4KLSAgIHRoZSBpbnRlZ2VyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciAtMSBvbiBmYWlsdXJlLiAgKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IFJFR19OQU1FX0NOVCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcHJlX2RlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotCi0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZ2l2ZW4gSU5TTiBhbmQgTC9SIGluZm9ybWF0aW9uIHdpbGwgcmVxdWlyZQotICAgYSBuZXcgUEEtMS4xIG9wY29kZS4gICovCi0KLXN0YXRpYyBpbnQKLW5lZWRfcGExMV9vcGNvZGUgKGluc24sIHJlc3VsdCkKLSAgICAgc3RydWN0IHBhX2l0ICppbnNuOwotICAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqcmVzdWx0OwotewotICBpZiAocmVzdWx0LT5sX3Jfc2VsZWN0ID09IDEgJiYgIShpbnNuLT5mcG9mMSA9PSBEQkwgJiYgaW5zbi0+ZnBvZjIgPT0gREJMKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBhcmNoaXRlY3R1cmUsCi0JIHRoZW4gc2V0IGEgbmV3IGFyY2hpdGVjdHVyZS4gICovCi0gICAgICBpZiAoYmZkX2dldF9tYWNoIChzdGRvdXRwdXQpIDwgcGExMSkKLQl7Ci0JICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIHBhMTEpKQotCSAgICBhc193YXJuIChfKCJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQl9Ci0gICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8qIFBhcnNlIGEgY29uZGl0aW9uIGZvciBhIGZjbXAgaW5zdHJ1Y3Rpb24uICBSZXR1cm4gdGhlIG51bWVyaWNhbAotICAgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbmRpdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX2ZwX2NtcF9jb25kIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGNvbmQsIGk7Ci0KLSAgY29uZCA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jYXNlY21wICgqcywgZnBfY29uZF9tYXBbaV0uc3RyaW5nLAotCQkgICAgICAgc3RybGVuIChmcF9jb25kX21hcFtpXS5zdHJpbmcpKSA9PSAwKQotCXsKLQkgIGNvbmQgPSBmcF9jb25kX21hcFtpXS5jb25kOwotCSAgKnMgKz0gc3RybGVuIChmcF9jb25kX21hcFtpXS5zdHJpbmcpOwotCSAgLyogSWYgbm90IGEgY29tcGxldGUgbWF0Y2gsIGJhY2sgdXAgdGhlIGlucHV0IHN0cmluZyBhbmQKLQkgICAgIHJlcG9ydCBhbiBlcnJvci4gICovCi0JICBpZiAoKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkgICAgewotCSAgICAgICpzIC09IHN0cmxlbiAoZnBfY29uZF9tYXBbaV0uc3RyaW5nKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgd2hpbGUgKCoqcyA9PSAnICcgfHwgKipzID09ICdcdCcpCi0JICAgICpzID0gKnMgKyAxOwotCSAgcmV0dXJuIGNvbmQ7Ci0JfQotICAgIH0KLQotICBhc19iYWQgKF8oIkludmFsaWQgRlAgQ29tcGFyZSBDb25kaXRpb246ICVzIiksICpzKTsKLQotICAvKiBBZHZhbmNlIG92ZXIgdGhlIGJvZ3VzIGNvbXBsZXRlci4gICovCi0gIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0gICAgKnMgKz0gMTsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBQYXJzZSBhbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZSBjb21wbGV0ZXIKLSAgIHR5cGUuICAqLwotCi1zdGF0aWMgZnBfb3BlcmFuZF9mb3JtYXQKLXBhX3BhcnNlX2ZwX2Zvcm1hdCAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCBmb3JtYXQ7Ci0KLSAgZm9ybWF0ID0gU0dMOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgaWYgKHN0cm5jYXNlY21wICgqcywgInNnbCIsIDMpID09IDApCi0JewotCSAgZm9ybWF0ID0gU0dMOwotCSAgKnMgKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJkYmwiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IERCTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAicXVhZCIsIDQpID09IDApCi0JewotCSAgZm9ybWF0ID0gUVVBRDsKLQkgICpzICs9IDU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvcm1hdCA9IElMTEVHQUxfRk1UOwotCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZQIE9wZXJhbmQgRm9ybWF0OiAlM3MiKSwgKnMpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZvcm1hdDsKLX0KLQotLyogQ29udmVydCBmcm9tIGEgc2VsZWN0b3Igc3RyaW5nIGludG8gYSBzZWxlY3RvciB0eXBlLiAgKi8KLQotc3RhdGljIGludAotcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIChzdHIpCi0gICAgIGNoYXIgKipzdHI7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLSAgY2hhciBuYW1lWzRdOwotCi0gIC8qIFJlYWQgcGFzdCBhbnkgd2hpdGVzcGFjZS4gICovCi0gIC8qIEZJWE1FOiBzaG91bGQgd2UgcmVhZCBwYXN0IG5ld2xpbmVzIGFuZCBmb3JtZmVlZHM/Pz8gKi8KLSAgd2hpbGUgKCoqc3RyID09ICcgJyB8fCAqKnN0ciA9PSAnXHQnIHx8ICoqc3RyID09ICdcbicgfHwgKipzdHIgPT0gJ1xmJykKLSAgICAqc3RyID0gKnN0ciArIDE7Ci0KLSAgaWYgKCgqc3RyKVsxXSA9PSAnXCcnIHx8ICgqc3RyKVsxXSA9PSAnJScpCi0gICAgbmFtZVswXSA9IHRvbG93ZXIgKCgqc3RyKVswXSksCi0gICAgbmFtZVsxXSA9IDA7Ci0gIGVsc2UgaWYgKCgqc3RyKVsyXSA9PSAnXCcnIHx8ICgqc3RyKVsyXSA9PSAnJScpCi0gICAgbmFtZVswXSA9IHRvbG93ZXIgKCgqc3RyKVswXSksCi0gICAgbmFtZVsxXSA9IHRvbG93ZXIgKCgqc3RyKVsxXSksCi0gICAgbmFtZVsyXSA9IDA7Ci0jaWZkZWYgT0JKX1NPTQotICBlbHNlIGlmICgoKnN0cilbM10gPT0gJ1wnJyB8fCAoKnN0cilbM10gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSB0b2xvd2VyICgoKnN0cilbMV0pLAotICAgIG5hbWVbMl0gPSB0b2xvd2VyICgoKnN0cilbMl0pLAotICAgIG5hbWVbM10gPSAwOwotI2VuZGlmCi0gIGVsc2UKLSAgICByZXR1cm4gZV9mc2VsOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSBzaXplb2YgKHNlbGVjdG9yX3RhYmxlKSAvIHNpemVvZiAoc3RydWN0IHNlbGVjdG9yX2VudHJ5KSAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY21wIChuYW1lLCBzZWxlY3Rvcl90YWJsZVttaWRkbGVdLnByZWZpeCk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQl7Ci0JICAqc3RyICs9IHN0cmxlbiAobmFtZSkgKyAxOwotI2lmbmRlZiBPQkpfU09NCi0JICBpZiAoc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5maWVsZF9zZWxlY3RvciA9PSBlX25zZWwpCi0JICAgIHJldHVybiBlX2ZzZWw7Ci0jZW5kaWYKLQkgIHJldHVybiBzZWxlY3Rvcl90YWJsZVttaWRkbGVdLmZpZWxkX3NlbGVjdG9yOwotCX0KLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0KLSAgcmV0dXJuIGVfZnNlbDsKLX0KLQotLyogTWFyayAodmlhIGV4cHJfZW5kKSB0aGUgZW5kIG9mIGFuIGV4cHJlc3Npb24gKEkgdGhpbmspLiAgRklYTUUuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfZXhwcmVzc2lvbiAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0gIGFzZWN0aW9uICpzZWc7Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBzZWcgPSBleHByZXNzaW9uICgmdGhlX2luc24uZXhwKTsKLSAgaWYgKCEoc2VnID09IGFic29sdXRlX3NlY3Rpb24KLQl8fCBzZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQl8fCBTRUdfTk9STUFMIChzZWcpKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgc2VnbWVudCBpbiBleHByZXNzaW9uLiIpKTsKLSAgICAgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAwOwotfQotCi0vKiBNYXJrICh2aWEgZXhwcl9lbmQpIHRoZSBlbmQgb2YgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIEZJWE1FLiAqLwotc3RhdGljIGludAotcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKGluc24sIHN0cnApCi0gICAgIHN0cnVjdCBwYV9pdCAqaW5zbjsKLSAgICAgY2hhciAqKnN0cnA7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0KLSAgaW5zbi0+ZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKHN0cnApOwotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RycDsKLSAgZXhwcmVzc2lvbiAoJmluc24tPmV4cCk7Ci0gIC8qIFRoaXMgaXMgbm90IHBlcmZlY3QsIGJ1dCBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQgb3ZlciBkb2luZyBub3RoaW5nLgotCi0gICAgIFRoZSBQQSBhc3NlbWJseSBzeW50YXggaXMgYW1iaWdpb3VzIGluIGEgdmFyaWV0eSBvZiB3YXlzLiAgQ29uc2lkZXIKLSAgICAgdGhpcyBzdHJpbmcgIjQgJXI1IiAgSXMgdGhhdCB0aGUgbnVtYmVyIDQgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyCi0gICAgIHI1LCBvciBpcyB0aGF0IDQgTU9EIDU/Ci0KLSAgICAgSWYgd2UgZ2V0IGEgbW9kdWxvIGV4cHJlc2lvbiBXaGVuIGxvb2tpbmcgZm9yIGFuIGFic29sdXRlLCB3ZSB0cnkKLSAgICAgYWdhaW4gY3V0dGluZyBvZmYgdGhlIGlucHV0IHN0cmluZyBhdCB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICAqLwotICBpZiAoaW5zbi0+ZXhwLlhfb3AgPT0gT19tb2R1bHVzKQotICAgIHsKLSAgICAgIGNoYXIgKnMsIGM7Ci0gICAgICBpbnQgcmV0dmFsOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RycDsKLSAgICAgIHMgPSAqc3RycDsKLSAgICAgIHdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0gICAgICAgIHMrKzsKLQotICAgICAgYyA9ICpzOwotICAgICAgKnMgPSAwOwotCi0gICAgICByZXR2YWwgPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoaW5zbiwgc3RycCk7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICAqcyA9IGM7Ci0gICAgICByZXR1cm4gZXZhbHVhdGVfYWJzb2x1dGUgKGluc24pOwotICAgIH0KLSAgaWYgKGluc24tPmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJCYWQgc2VnbWVudCAoc2hvdWxkIGJlIGFic29sdXRlKS4iKSk7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gZXZhbHVhdGVfYWJzb2x1dGUgKGluc24pOwotfQotCi0vKiBFdmFsdWF0ZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIEVYUCB3aGljaCBtYXkgYmUgbW9kaWZpZWQgYnkKLSAgIHRoZSBzZWxlY3RvciBGSUVMRF9TRUxFQ1RPUi4gIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICAqLwotc3RhdGljIGludAotZXZhbHVhdGVfYWJzb2x1dGUgKGluc24pCi0gICAgIHN0cnVjdCBwYV9pdCAqaW5zbjsKLXsKLSAgaW50IHZhbHVlOwotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBmaWVsZF9zZWxlY3RvciA9IGluc24tPmZpZWxkX3NlbGVjdG9yOwotCi0gIGV4cCA9IGluc24tPmV4cDsKLSAgdmFsdWUgPSBleHAuWF9hZGRfbnVtYmVyOwotCi0gIHN3aXRjaCAoZmllbGRfc2VsZWN0b3IpCi0gICAgewotICAgIC8qIE5vIGNoYW5nZS4gICovCi0gICAgY2FzZSBlX2ZzZWw6Ci0gICAgICBicmVhazsKLQotICAgIC8qIElmIGJpdCAyMSBpcyBvbiB0aGVuIGFkZCAweDgwMCBhbmQgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzLiAgKi8KLSAgICBjYXNlIGVfbHNzZWw6Ci0gICAgICBpZiAodmFsdWUgJiAweDAwMDAwNDAwKQotCXZhbHVlICs9IDB4ODAwOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2lnbiBleHRlbmQgZnJvbSBiaXQgMjEuICAqLwotICAgIGNhc2UgZV9yc3NlbDoKLSAgICAgIGlmICh2YWx1ZSAmIDB4MDAwMDA0MDApCi0JdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGVsc2UKLQl2YWx1ZSAmPSAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzLiAgKi8KLSAgICBjYXNlIGVfbHNlbDoKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNldCBiaXRzIDAtMjAgdG8gemVyby4gICovCi0gICAgY2FzZSBlX3JzZWw6Ci0gICAgICB2YWx1ZSA9IHZhbHVlICYgMHg3ZmY7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFkZCAweDgwMCBhbmQgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzLiAgKi8KLSAgICBjYXNlIGVfbGRzZWw6Ci0gICAgICB2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNldCBiaXRncyAwLTIxIHRvIG9uZS4gICovCi0gICAgY2FzZSBlX3Jkc2VsOgotICAgICAgdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGJyZWFrOwotCi0jZGVmaW5lIFJTRUxfUk9VTkQoYykgICgoKGMpICsgMHgxMDAwKSAmIH4weDFmZmYpCi0gICAgY2FzZSBlX3Jyc2VsOgotICAgICAgdmFsdWUgPSAoUlNFTF9ST1VORCAodmFsdWUpICYgMHg3ZmYpICsgKHZhbHVlIC0gUlNFTF9ST1VORCAodmFsdWUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xyc2VsOgotICAgICAgdmFsdWUgPSAoUlNFTF9ST1VORCAodmFsdWUpID4+IDExKSAmIDB4MWZmZmZmOwotICAgICAgYnJlYWs7Ci0jdW5kZWYgUlNFTF9ST1VORAotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmaWVsZF9zZWxlY3Rvcik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogR2l2ZW4gYW4gYXJndW1lbnQgbG9jYXRpb24gc3BlY2lmaWNhdGlvbiByZXR1cm4gdGhlIGFzc29jaWF0ZWQKLSAgIGFyZ3VtZW50IGxvY2F0aW9uIG51bWJlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBhX2J1aWxkX2FyZ19yZWxvYyAodHlwZV9uYW1lKQotICAgICBjaGFyICp0eXBlX25hbWU7Ci17Ci0KLSAgaWYgKHN0cm5jYXNlY21wICh0eXBlX25hbWUsICJubyIsIDIpID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAiZ3IiLCAyKSA9PSAwKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAiZnIiLCAyKSA9PSAwKQotICAgIHJldHVybiAyOwotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAiZnUiLCAyKSA9PSAwKQotICAgIHJldHVybiAzOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCJJbnZhbGlkIGFyZ3VtZW50IGxvY2F0aW9uOiAlc1xuIiksIHR5cGVfbmFtZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEVuY29kZSBhbmQgcmV0dXJuIGFuIGFyZ3VtZW50IHJlbG9jYXRpb24gc3BlY2lmaWNhdGlvbiBmb3IKLSAgIHRoZSBnaXZlbiByZWdpc3RlciBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IGFyZ19yZWxvYy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBhX2FsaWduX2FyZ19yZWxvYyAocmVnLCBhcmdfcmVsb2MpCi0gICAgIHVuc2lnbmVkIGludCByZWc7Ci0gICAgIHVuc2lnbmVkIGludCBhcmdfcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCBuZXdfcmVsb2M7Ci0KLSAgbmV3X3JlbG9jID0gYXJnX3JlbG9jOwotICBzd2l0Y2ggKHJlZykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgbmV3X3JlbG9jIDw8PSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgbmV3X3JlbG9jIDw8PSA2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbmV3X3JlbG9jIDw8PSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgbmV3X3JlbG9jIDw8PSAyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBhcmd1bWVudCBkZXNjcmlwdGlvbjogJWQiKSwgcmVnKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5ld19yZWxvYzsKLX0KLQotLyogUGFyc2UgYSBQQSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciAoLG4pLiAgUmV0dXJuIG5vbnplcm8gaWYgdGhlCi0gICBjb21wbGV0ZXIgd2FzIGZvdW5kOyByZXR1cm4gemVybyBpZiBubyBjb21wbGV0ZXIgd2FzIGZvdW5kLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfbnVsbGlmIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IG51bGxpZjsKLQotICBudWxsaWYgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyA9ICpzICsgMTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsICJuIiwgMSkgPT0gMCkKLQludWxsaWYgPSAxOwotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiSW52YWxpZCBOdWxsaWZpY2F0aW9uOiAoJWMpIiksICoqcyk7Ci0JICBudWxsaWYgPSAwOwotCX0KLSAgICAgICpzID0gKnMgKyAxOwotICAgIH0KLQotICByZXR1cm4gbnVsbGlmOwotfQotCi0vKiBQYXJzZSBhIG5vbi1uZWdhdGVkIGNvbXBhcmUvc3VidHJhY3QgY29tcGxldGVyIHJldHVybmluZyB0aGUKLSAgIG51bWJlciAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgKHMsIGlzYnJhbmNoKQotICAgICBjaGFyICoqczsKLSAgICAgaW50IGlzYnJhbmNoOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotICBpbnQgbnVsbGlmeSA9IDA7Ci0KLSAgY21wbHRyID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotCi0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPDwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPDw9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQkgIG51bGxpZnkgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjbXBsdHIgPSAtMTsKLQl9Ci0gICAgICAqKnMgPSBjOwotICAgIH0KLQotICAvKiBSZXNldCBwb2ludGVycyBpZiB0aGlzIHdhcyByZWFsbHkgYSAsbiBmb3IgYSBicmFuY2ggaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAobnVsbGlmeSkKLSAgICAqcyA9IHNhdmVfczsKLQotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLS8qIFBhcnNlIGEgbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbXBsZXRlciByZXR1cm5pbmcgdGhlCi0gICBudW1iZXIgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLSAgaW50IG51bGxpZnkgPSAwOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLQotCi0gICAgICBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuc3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JICBudWxsaWZ5ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG51bGxpZnkpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLQotICByZXR1cm4gY21wbHRyOwotfQotCi0KLS8qIFBhcnNlIGEgbm9uLW5lZ2F0ZWQgYWRkaXRpb24gY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyCi0gICAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgKHMsIGlzYnJhbmNoKQotICAgICBjaGFyICoqczsKLSAgICAgaW50IGlzYnJhbmNoOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiem52IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGNtcGx0ciA9PSAwICYmICpuYW1lID09ICduJyAmJiBpc2JyYW5jaCkKLSAgICAqcyA9IHNhdmVfczsKLQotICByZXR1cm4gY21wbHRyOwotfQotCi0vKiBQYXJzZSBhIG5lZ2F0ZWQgYWRkaXRpb24gY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyCi0gICAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uKS4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25lZ19hZGRfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ2bnoiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGNtcGx0ciA9PSAwICYmICpuYW1lID09ICduJyAmJiBpc2JyYW5jaCkKLSAgICAqcyA9IHNhdmVfczsKLQotICByZXR1cm4gY21wbHRyOwotfQotCi0jaWZkZWYgT0JKX1NPTQotLyogSGFuZGxlIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuICBTcGVjaWFsIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGUKLSAgIGFsaWdubWVudCBvZiB0aGUgc3Vic3BhY2UgaWYgbmVjZXNzYXJ5LiAgKi8KLXN0YXRpYyB2b2lkCi1wYV9hbGlnbiAoYnl0ZXMpCi17Ci0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotCi0gIC8qIExldCB0aGUgZ2VuZXJpYyBnYXMgY29kZSBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgKi8KLSAgc19hbGlnbl9ieXRlcyAoYnl0ZXMpOwotCi0gIC8qIElmIGJ5dGVzIGlzIGEgcG93ZXIgb2YgMiwgdGhlbiB1cGRhdGUgdGhlIGN1cnJlbnQgc3Vic3BhY2UncwotICAgICBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGxvZzIgKGJ5dGVzKSAhPSAtMSkKLSAgICByZWNvcmRfYWxpZ25tZW50IChjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc2VnLCBsb2cyIChieXRlcykpOwotfQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIC5CTE9DSyB0eXBlIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9ibG9jayAoeikKLSAgICAgaW50IHo7Ci17Ci0gIGNoYXIgKnA7Ci0gIGxvbmcgaW50IHRlbXBfZmlsbDsKLSAgdW5zaWduZWQgaW50IHRlbXBfc2l6ZTsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgdGVtcF9zaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgLyogQWx3YXlzIGZpbGwgd2l0aCB6ZXJvcywgdGhhdCdzIHdoYXQgdGhlIEhQIGFzc2VtYmxlciBkb2VzLiAgKi8KLSAgdGVtcF9maWxsID0gMDsKLQotICBwID0gZnJhZ192YXIgKHJzX2ZpbGwsIChpbnQpIHRlbXBfc2l6ZSwgKGludCkgdGVtcF9zaXplLAotCQkocmVsYXhfc3Vic3RhdGVUKSAwLCAoc3ltYm9sUyAqKSAwLCAob2Zmc2V0VCkgMSwgTlVMTCk7Ci0gIG1lbXNldCAocCwgMCwgdGVtcF9zaXplKTsKLQotICAvKiBDb252ZXJ0IDIgYnl0ZXMgYXQgYSB0aW1lLiAgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgdGVtcF9zaXplOyBpICs9IDIpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgaSwKLQkJCSAgKHZhbHVlVCkgdGVtcF9maWxsLAotCQkJICAoaW50KSAoKHRlbXBfc2l6ZSAtIGkpID4gMiA/IDIgOiAodGVtcF9zaXplIC0gaSkpKTsKLSAgICB9Ci0KLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5iZWdpbl9icnRhYiBhbmQgLmVuZF9icnRhYiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfYnJ0YWIgKGJlZ2luKQotICAgICBpbnQgYmVnaW47Ci17Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFRoZSBCUlRBQiByZWxvY2F0aW9ucyBhcmUgb25seSBhdmFpbGJsZSBpbiBTT00gKHRvIGRlbm90ZQotICAgICB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYnJhbmNoIHRhYmxlcykuICAqLwotICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJTlVMTCwgKG9mZnNldFQpIDAsIE5VTEwsCi0JCTAsIGJlZ2luID8gUl9IUFBBX0JFR0lOX0JSVEFCIDogUl9IUFBBX0VORF9CUlRBQiwKLQkJZV9mc2VsLCAwLCAwLCBOVUxMKTsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5iZWdpbl90cnkgYW5kIC5lbmRfdHJ5IHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV90cnkgKGJlZ2luKQotICAgICBpbnQgYmVnaW47Ci17Ci0jaWZkZWYgT0JKX1NPTQotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotICBpZiAoISBiZWdpbikKLSAgICBleHByZXNzaW9uICgmZXhwKTsKLQotICAvKiBUaGUgVFJZIHJlbG9jYXRpb25zIGFyZSBvbmx5IGF2YWlsYmxlIGluIFNPTSAodG8gZGVub3RlCi0gICAgIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9ucykuICAqLwotCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCU5VTEwsIChvZmZzZXRUKSAwLCBiZWdpbiA/IE5VTEwgOiAmZXhwLAotCQkwLCBiZWdpbiA/IFJfSFBQQV9CRUdJTl9UUlkgOiBSX0hQUEFfRU5EX1RSWSwKLQkJZV9mc2VsLCAwLCAwLCBOVUxMKTsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5DQUxMIHBzZXVkby1vcC4gIFRoaXMgaW52b2x2ZXMgc3RvcmluZyBhd2F5IGluZm9ybWF0aW9uCi0gICBhYm91dCB3aGVyZSBhcmd1bWVudHMgYXJlIHRvIGJlIGZvdW5kIHNvIHRoZSBsaW5rZXIgY2FuIGRldGVjdAotICAgKGFuZCBjb3JyZWN0KSBhcmd1bWVudCBsb2NhdGlvbiBtaXNtYXRjaGVzIGJldHdlZW4gY2FsbGVyIGFuZCBjYWxsZWUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2FsbCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBwYV9jYWxsX2FyZ3MgKCZsYXN0X2NhbGxfZGVzYyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIERvIHRoZSBkaXJ0eSB3b3JrIG9mIGJ1aWxkaW5nIGEgY2FsbCBkZXNjcmlwdG9yIHdoaWNoIGRlc2NyaWJlcwotICAgd2hlcmUgdGhlIGNhbGxlciBwbGFjZWQgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24gY2FsbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jYWxsX2FyZ3MgKGNhbGxfZGVzYykKLSAgICAgc3RydWN0IGNhbGxfZGVzYyAqY2FsbF9kZXNjOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgdW5zaWduZWQgaW50IHRlbXAsIGFyZ19yZWxvYzsKLQotICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIC8qIFByb2Nlc3MgYSBzb3VyY2UgYXJndW1lbnQuICAqLwotICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImFyZ3ciLCA0KSA9PSAwKSkKLQl7Ci0JICB0ZW1wID0gYXRvaSAobmFtZSArIDQpOwotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGFyZ19yZWxvYyA9IHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSk7Ci0JICBjYWxsX2Rlc2MtPmFyZ19yZWxvYyB8PSBwYV9hbGlnbl9hcmdfcmVsb2MgKHRlbXAsIGFyZ19yZWxvYyk7Ci0JfQotICAgICAgLyogUHJvY2VzcyBhIHJldHVybiB2YWx1ZS4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJydG52YWwiLCA2KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgYXJnX3JlbG9jID0gcGFfYnVpbGRfYXJnX3JlbG9jIChuYW1lKTsKLQkgIGNhbGxfZGVzYy0+YXJnX3JlbG9jIHw9IChhcmdfcmVsb2MgJiAweDMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIkludmFsaWQgLkNBTEwgYXJndW1lbnQ6ICVzIiksIG5hbWUpOwotCX0KLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gVFJVRSBpZiBGUkFHMSBhbmQgRlJBRzIgYXJlIHRoZSBzYW1lLiAgKi8KLQotc3RhdGljIGludAotaXNfc2FtZV9mcmFnIChmcmFnMSwgZnJhZzIpCi0gICAgIGZyYWdTICpmcmFnMTsKLSAgICAgZnJhZ1MgKmZyYWcyOwotewotCi0gIGlmIChmcmFnMSA9PSBOVUxMKQotICAgIHJldHVybiAoRkFMU0UpOwotICBlbHNlIGlmIChmcmFnMiA9PSBOVUxMKQotICAgIHJldHVybiAoRkFMU0UpOwotICBlbHNlIGlmIChmcmFnMSA9PSBmcmFnMikKLSAgICByZXR1cm4gKFRSVUUpOwotICBlbHNlIGlmIChmcmFnMi0+ZnJfdHlwZSA9PSByc19maWxsICYmIGZyYWcyLT5mcl9maXggPT0gMCkKLSAgICByZXR1cm4gKGlzX3NhbWVfZnJhZyAoZnJhZzEsIGZyYWcyLT5mcl9uZXh0KSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gKEZBTFNFKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLS8qIEJ1aWxkIGFuIGVudHJ5IGluIHRoZSBVTldJTkQgc3Vic3BhY2UgZnJvbSB0aGUgZ2l2ZW4gZnVuY3Rpb24KLSAgIGF0dHJpYnV0ZXMgaW4gQ0FMTF9JTkZPLiAgVGhpcyBpcyBub3QgbmVlZGVkIGZvciBTT00gYXMgdXNpbmcKLSAgIFJfRU5UUlkgYW5kIFJfRVhJVCByZWxvY2F0aW9ucyBhbGxvdyB0aGUgbGlua2VyIHRvIGhhbmRsZSBidWlsZGluZwotICAgb2YgdGhlIHVud2luZCBzcGFjZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlIChjYWxsX2luZm8pCi0gICAgIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mbzsKLXsKLSNpZiAwCi0gIGNoYXIgKnVud2luZDsKLSAgYXNlY3Rpb24gKnNlZywgKnNhdmVfc2VnOwotICBzdWJzZWdUIHN1YnNlZywgc2F2ZV9zdWJzZWc7Ci0gIGludCBpOwotICBjaGFyIGMsICpwOwotCi0gIC8qIEdldCBpbnRvIHRoZSByaWdodCBzZWcvc3Vic2VnLiAgVGhpcyBtYXkgaW52b2x2ZSBjcmVhdGluZwotICAgICB0aGUgc2VnIHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICBNYWtlIHN1cmUgdG8gaGF2ZSB0aGUKLSAgICAgb2xkIHNlZy9zdWJzZWcgc28gdGhhdCB3ZSBjYW4gcmVzZXQgdGhpbmdzIHdoZW4gd2UgYXJlIGRvbmUuICAqLwotICBzdWJzZWcgPSBTVUJTRUdfVU5XSU5EOwotICBzZWcgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LCBVTldJTkRfU0VDVElPTl9OQU1FKTsKLSAgaWYgKHNlZyA9PSBBU0VDX05VTEwpCi0gICAgewotICAgICAgc2VnID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIFVOV0lORF9TRUNUSU9OX05BTUUpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX0hBU19DT05URU5UUwotCQkJICAgICB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKTsKLSAgICB9Ci0KLSAgc2F2ZV9zZWcgPSBub3dfc2VnOwotICBzYXZlX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLQotCi0gIC8qIEdldCBzb21lIHNwYWNlIHRvIGhvbGQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHVud2luZAotICAgICBkZXNjcmlwdG9yLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgMCwgNCk7Ci0KLSAgLyogUmVsb2NhdGlvbiBpbmZvLiBmb3Igc3RhcnQgb2Zmc2V0IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgUl9QQVJJU0NfRElSMzIsIGVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDAsIDQpOwotCi0gIC8qIFJlbG9jYXRpb24gaW5mby4gZm9yIGVuZCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uLgotCi0gICAgIEJlY2F1c2Ugd2UgYWxsb3cgcmVkdWN0aW9ucyBvZiAzMmJpdCByZWxvY2F0aW9ucyBmb3IgRUxGLCB0aGlzIHdpbGwgYmUKLSAgICAgcmVkdWNlZCB0byBzZWN0aW9uX3N5bSArIG9mZnNldCB3aGljaCBhdm9pZHMgcHV0dGluZyB0aGUgdGVtcG9yYXJ5Ci0gICAgIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBJdCAoc2hvdWxkKSBlbmQgdXAgZ2l2aW5nIHRoZSBzYW1lCi0gICAgIHZhbHVlIGFzIGNhbGxfaW5mby0+c3RhcnRfc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBvbmNlIHRoZSBsaW5rZXIgaXMKLSAgICAgZmluaXNoZWQgd2l0aCBpdHMgd29yay4gICovCi0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQljYWxsX2luZm8tPmVuZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgUl9QQVJJU0NfRElSMzIsIGVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIC8qIER1bXAgaXQuICovCi0gIHVud2luZCA9IChjaGFyICopICZjYWxsX2luZm8tPmNpX3Vud2luZDsKLSAgZm9yIChpID0gODsgaSA8IHNpemVvZiAoc3RydWN0IHVud2luZF90YWJsZSk7IGkrKykKLSAgICB7Ci0gICAgICBjID0gKih1bndpbmQgKyBpKTsKLSAgICAgIHsKLQlGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotICAgICAgfQotICAgIH0KLQotICAvKiBSZXR1cm4gYmFjayB0byB0aGUgb3JpZ2luYWwgc2VnbWVudC9zdWJzZWdtZW50LiAgKi8KLSAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLS8qIFByb2Nlc3MgYSAuQ0FMTElORk8gcHNldWRvLW9wLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGxhdGVyCi0gICB0byBidWlsZCB1bndpbmQgZGVzY3JpcHRvcnMgYW5kIG1heWJlIG9uZSBkYXkgdG8gc3VwcG9ydAotICAgLkVOVEVSIGFuZCAuTEVBVkUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2FsbGluZm8gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIGludCB0ZW1wOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIC8qIC5DQUxMSU5GTyBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gICovCi0gIGlmICghd2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19iYWQgKF8oIi5jYWxsaW5mbyBpcyBub3Qgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24iKSk7Ci0KLSAgLyogTWFyayB0aGUgZmFjdCB0aGF0IHdlIGZvdW5kIHRoZSAuQ0FMTElORk8gZm9yIHRoZQotICAgICBjdXJyZW50IHByb2NlZHVyZS4gICovCi0gIGNhbGxpbmZvX2ZvdW5kID0gVFJVRTsKLQotICAvKiBJdGVyYXRlIG92ZXIgdGhlIC5DQUxMSU5GTyBhcmd1bWVudHMuICAqLwotICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIC8qIEZyYW1lIHNpemUgc3BlY2lmaWNhdGlvbi4gICovCi0gICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZnJhbWUiLCA1KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAoKHRlbXAgJiAweDMpICE9IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkZSQU1FIHBhcmFtZXRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgODogJWRcbiIpLCB0ZW1wKTsKLQkgICAgICB0ZW1wID0gMDsKLQkgICAgfQotCi0JICAvKiBjYWxsaW5mbyBpcyBpbiBieXRlcyBhbmQgdW53aW5kX2Rlc2MgaXMgaW4gOCBieXRlIHVuaXRzLiAgKi8KLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5mcmFtZV9zaXplID0gdGVtcCAvIDg7Ci0KLQl9Ci0gICAgICAvKiBFbnRyeSByZWdpc3RlciAoR1IsIEdSIGFuZCBTUikgc3BlY2lmaWNhdGlvbnMuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZW50cnlfZ3IiLCA4KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICAvKiBUaGUgSFAgYXNzZW1ibGVyIGFjY2VwdHMgMTkgYXMgdGhlIGhpZ2ggYm91bmQgZm9yIEVOVFJZX0dSCi0JICAgICBldmVuIHRob3VnaCAlcjE5IGlzIGNhbGxlciBzYXZlZC4gIEkgdGhpbmsgdGhpcyBpcyBhIGJ1ZyBpbgotCSAgICAgdGhlIEhQIGFzc2VtYmxlciwgYW5kIHdlIGFyZSBub3QgZ29pbmcgdG8gZW11bGF0ZSBpdC4gICovCi0JICBpZiAodGVtcCA8IDMgfHwgdGVtcCA+IDE4KQotCSAgICBhc19iYWQgKF8oIlZhbHVlIGZvciBFTlRSWV9HUiBtdXN0IGJlIGluIHRoZSByYW5nZSAzLi4xOFxuIikpOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmVudHJ5X2dyID0gdGVtcCAtIDI7Ci0JfQotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZW50cnlfZnIiLCA4KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICAvKiBTaW1pbGFybHkgdGhlIEhQIGFzc2VtYmxlciB0YWtlcyAzMSBhcyB0aGUgaGlnaCBib3VuZCBldmVuCi0JICAgICB0aG91Z2ggJWZyMjEgaXMgdGhlIGxhc3QgY2FsbGVlIHNhdmVkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KLQkgIGlmICh0ZW1wIDwgMTIgfHwgdGVtcCA+IDIxKQotCSAgICBhc19iYWQgKF8oIlZhbHVlIGZvciBFTlRSWV9GUiBtdXN0IGJlIGluIHRoZSByYW5nZSAxMi4uMjFcbiIpKTsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5lbnRyeV9mciA9IHRlbXAgLSAxMTsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJlbnRyeV9zciIsIDgpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmICh0ZW1wICE9IDMpCi0JICAgIGFzX2JhZCAoXygiVmFsdWUgZm9yIEVOVFJZX1NSIG11c3QgYmUgM1xuIikpOwotCX0KLSAgICAgIC8qIE5vdGUgd2hldGhlciBvciBub3QgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhbnkgY2FsbHMuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiY2FsbHMiLCA1KSA9PSAwKSB8fAotCSAgICAgICAoc3RybmNhc2VjbXAgKG5hbWUsICJjYWxsZXIiLCA2KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCX0KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm5vX2NhbGxzIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQl9Ci0gICAgICAvKiBTaG91bGQgUlAgYmUgc2F2ZWQgaW50byB0aGUgc3RhY2suICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic2F2ZV9ycCIsIDcpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3Iuc2F2ZV9ycCA9IDE7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIFNQLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNhdmVfc3AiLCA3KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLnNhdmVfc3AgPSAxOwotCX0KLSAgICAgIC8qIElzIHRoaXMgYW4gdW53aW5kYWJsZSBwcm9jZWR1cmUuICBJZiBzbyBtYXJrIGl0IHNvCi0gICAgICAgICBpbiB0aGUgdW53aW5kIGRlc2NyaXB0b3IuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAibm9fdW53aW5kIiwgOSkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5jYW5ub3RfdW53aW5kID0gMTsKLQl9Ci0gICAgICAvKiBJcyB0aGlzIGFuIGludGVycnVwdCByb3V0aW5lLiAgSWYgc28gbWFyayBpdCBpbiB0aGUKLSAgICAgICAgIHVud2luZCBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImhwdXhfaW50IiwgNykgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5ocHV4X2ludGVycnVwdF9tYXJrZXIgPSAxOwotCX0KLSAgICAgIC8qIElzIHRoaXMgYSBtaWxsaWNvZGUgcm91dGluZS4gICJtaWxsaWNvZGUiIGlzbid0IGluIG15Ci0JIGFzc2VtYmxlciBtYW51YWwsIGJ1dCBteSBjb3B5IGlzIG9sZC4gIFRoZSBIUCBhc3NlbWJsZXIKLQkgYWNjZXB0cyBpdCwgYW5kIHRoZXJlJ3MgYSBwbGFjZSBpbiB0aGUgdW53aW5kIGRlc2NyaXB0b3IKLQkgdG8gZHJvcCB0aGUgaW5mb3JtYXRpb24sIHNvIHdlJ2xsIGFjY2VwdCBpdCB0b28uICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAibWlsbGljb2RlIiwgOSkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5taWxsaWNvZGUgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIkludmFsaWQgLkNBTExJTkZPIGFyZ3VtZW50OiAlcyIpLCBuYW1lKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogU3dpdGNoIGludG8gdGhlIGNvZGUgc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29kZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgY3VycmVudF9zcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKLSAgY3VycmVudF9zdWJzcGFjZQotICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoY3VycmVudF9zcGFjZS0+c2Rfc2VnLCAwKTsKLSNlbmRpZgotICBzX3RleHQgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgc3RhbmRhcmQgR0FTIHNfY29tbSgpLiBPbiBIUDkwMDAvODAwIG1hY2hpbmVzLAotICAgdGhlIC5jb21tIHBzZXVkby1vcCBoYXMgdGhlIGZvbGxvd2luZyBzeW10YXg6Ci0KLSAgIDxsYWJlbD4gLmNvbW0gPGxlbmd0aD4KLQotICAgd2hlcmUgPGxhYmVsPiBpcyBvcHRpb25hbCBhbmQgaXMgYSBzeW1ib2wgd2hvc2UgYWRkcmVzcyB3aWxsIGJlIHRoZSBzdGFydCBvZgotICAgYSBibG9jayBvZiBtZW1vcnkgPGxlbmd0aD4gYnl0ZXMgbG9uZy4gPGxlbmd0aD4gbXVzdCBiZSBhbiBhYnNvbHV0ZQotICAgZXhwcmVzc2lvbi4gIDxsZW5ndGg+IGJ5dGVzIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZSBjdXJyZW50IHNwYWNlCi0gICBhbmQgc3Vic3BhY2UuCi0KLSAgIEFsc28gbm90ZSB0aGUgbGFiZWwgbWF5IG5vdCBldmVuIGJlIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIC5jb21tLgotCi0gICBUaGlzIGRpZmZlcmVuY2UgaW4gc3ludGF4IG1lYW5zIHRoZSBjb2xvbiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotICAgb24gdGhlIHN5bWJvbCBiZWZvcmUgd2UgYXJyaXZlIGluIHBhX2NvbW0uICBjb2xvbiB3aWxsIHNldCBhIG51bWJlcgotICAgb2YgYXR0cmlidXRlcyBvZiB0aGUgc3ltYm9sIHRoYXQgbmVlZCB0byBiZSBmaXhlZCBoZXJlLiAgSW4gcGFydGljdWxhcgotICAgdGhlIHZhbHVlLCBzZWN0aW9uIHBvaW50ZXIsIGZyYWdtZW50IHBvaW50ZXIsIGZsYWdzLCBldGMuICBXaGF0Ci0gICBhIHBhaW4uCi0KLSAgIFRoaXMgYWxzbyBtYWtlcyBlcnJvciBkZXRlY3Rpb24gYWxsIGJ1dCBpbXBvc3NpYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvbW0gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gIGlmIChsYWJlbF9zeW1ib2wpCi0gICAgc3ltYm9sID0gbGFiZWxfc3ltYm9sLT5sc3NfbGFiZWw7Ci0gIGVsc2UKLSAgICBzeW1ib2wgPSBOVUxMOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGlmIChzeW1ib2wpCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbCwgc2l6ZSk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2wsIGJmZF91bmRfc2VjdGlvbl9wdHIpOwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbCk7Ci0KLSAgICAgIC8qIGNvbG9uKCkgaGFzIGFscmVhZHkgc2V0IHRoZSBmcmFnIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZQotICAgICAgICAgY3VycmVudCBzdWJzcGFjZTsgd2UgbmVlZCB0byByZXNldCB0aGUgZnJhZ21lbnQgdG8gdGhlIHplcm8gYWRkcmVzcwotICAgICAgICAgZnJhZ21lbnQuICBXZSBhbHNvIG5lZWQgdG8gcmVzZXQgdGhlIHNlZ21lbnQgcG9pbnRlci4gICovCi0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgYSAuRU5EIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9lbmQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyBhIC5FTlRFUiBwc2V1ZG8tb3AuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICAqLwotc3RhdGljIHZvaWQKLXBhX2VudGVyICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIGFzX2JhZCAoXygiVGhlIC5FTlRFUiBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyBhIC5FTlRSWSBwc2V1ZG8tb3AuICAuRU5UUlkgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIHByb2Nlc3VyZS4gICovCi1zdGF0aWMgdm9pZAotcGFfZW50cnkgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgaWYgKCF3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2JhZCAoXygiTWlzcGxhY2VkIC5lbnRyeS4gSWdub3JlZC4iKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIWNhbGxpbmZvX2ZvdW5kKQotCWFzX2JhZCAoXygiTWlzc2luZyAuY2FsbGluZm8uIikpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgd2l0aGluX2VudHJ5X2V4aXQgPSBUUlVFOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBTT00gZGVmZXJzIGJ1aWxkaW5nIG9mIHVud2luZCBkZXNjcmlwdG9ycyB1bnRpbCB0aGUgbGluayBwaGFzZS4KLSAgICAgVGhlIGFzc2VtYmxlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYW4gUl9FTlRSWSByZWxvY2F0aW9uCi0gICAgIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHJlZ2lvbiBhbmQgaG9sZCB0aGUgdW53aW5kIGJpdHMsIGFuZAotICAgICBmb3IgY3JlYXRpbmcgYW4gUl9FWElUIHJlbG9jYXRpb24gdG8gbWFyayB0aGUgZW5kIG9mIHRoZSByZWdpb24uCi0KLSAgICAgRklYTUUuICBFTEYgc2hvdWxkIGJlIHVzaW5nIHRoZSBzYW1lIGNvbnZlbnRpb25zISAgVGhlIHByb2JsZW0KLSAgICAgaXMgYW4gdW53aW5kIHJlcXVpcmVzIHRvbyBtdWNoIHJlbG9jYXRpb24gc3BhY2UuICBIbW1tLiAgTWF5YmUKLSAgICAgaWYgd2Ugc3BsaXQgdGhlIHVud2luZCBiaXRzIHVwIGJldHdlZW4gdGhlIHJlbG9jYXRpb25zIHdoaWNoCi0gICAgIGRlbm90ZSB0aGUgZW50cnkgYW5kIGV4aXQgcG9pbnRzLiAgKi8KLSAgaWYgKGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLSAgICAgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCSAgICBOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJICAgIDAsIFJfSFBQQV9FTlRSWSwgZV9mc2VsLCAwLCAwLAotCQkgICAgKGludCAqKSAmbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogSGFuZGxlIGEgLkVRVSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZXF1IChyZWcpCi0gICAgIGludCByZWc7Ci17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIGlmIChsYWJlbF9zeW1ib2wpCi0gICAgewotICAgICAgc3ltYm9sID0gbGFiZWxfc3ltYm9sLT5sc3NfbGFiZWw7Ci0gICAgICBpZiAocmVnKQotCVNfU0VUX1ZBTFVFIChzeW1ib2wsIHBhX3BhcnNlX251bWJlciAoJmlucHV0X2xpbmVfcG9pbnRlciwgMCkpOwotICAgICAgZWxzZQotCVNfU0VUX1ZBTFVFIChzeW1ib2wsICh1bnNpZ25lZCBpbnQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbCwgYmZkX2Fic19zZWN0aW9uX3B0cik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHJlZykKLQlhc19iYWQgKF8oIi5SRUcgbXVzdCB1c2UgYSBsYWJlbCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIi5FUVUgbXVzdCB1c2UgYSBsYWJlbCIpKTsKLSAgICB9Ci0KLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbi4gIERvZXMgcHJvY2Vzc2luZyBmb3IgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLiAgVGhpcwotICAgdXN1YWxseSBpbnZvbHZlcyBjcmVhdGluZyBzb21lIHJlbG9jYXRpb25zIG9yIGJ1aWxkaW5nIHNwZWNpYWwKLSAgIHN5bWJvbHMgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2V4aXQgKCkKLXsKLSAgY2hhciAqd2hlcmU7Ci0KLSAgd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBNYXJrIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBzdHVmZiBhd2F5IHRoZSBsb2NhdGlvbiBvZiB0aGUgZnJhZwotICAgICBmb3IgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIGFuZCBmaW5hbGx5IGNhbGwgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlCi0gICAgIHRvIGFkZCBhbiBlbnRyeSBpbiB0aGUgdW53aW5kIHRhYmxlLiAgKi8KLSAgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gKCk7Ci0gIHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSAobGFzdF9jYWxsX2luZm8pOwotI2Vsc2UKLSAgLyogU09NIGRlZmVycyBidWlsZGluZyBvZiB1bndpbmQgZGVzY3JpcHRvcnMgdW50aWwgdGhlIGxpbmsgcGhhc2UuCi0gICAgIFRoZSBhc3NlbWJsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIFJfRU5UUlkgcmVsb2NhdGlvbgotICAgICB0byBtYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSByZWdpb24gYW5kIGhvbGQgdGhlIHVud2luZCBiaXRzLCBhbmQKLSAgICAgZm9yIGNyZWF0aW5nIGFuIFJfRVhJVCByZWxvY2F0aW9uIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgcmVnaW9uLgotCi0gICAgIEZJWE1FLiAgRUxGIHNob3VsZCBiZSB1c2luZyB0aGUgc2FtZSBjb252ZW50aW9ucyEgIFRoZSBwcm9ibGVtCi0gICAgIGlzIGFuIHVud2luZCByZXF1aXJlcyB0b28gbXVjaCByZWxvY2F0aW9uIHNwYWNlLiAgSG1tbS4gIE1heWJlCi0gICAgIGlmIHdlIHNwbGl0IHRoZSB1bndpbmQgYml0cyB1cCBiZXR3ZWVuIHRoZSByZWxvY2F0aW9ucyB3aGljaAotICAgICBkZW5vdGUgdGhlIGVudHJ5IGFuZCBleGl0IHBvaW50cy4gICovCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCU5VTEwsIChvZmZzZXRUKSAwLAotCQlOVUxMLCAwLCBSX0hQUEFfRVhJVCwgZV9mc2VsLCAwLCAwLAotCQkoaW50ICopICZsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IgKyAxKTsKLSNlbmRpZgotfQotCi0vKiBQcm9jZXNzIGEgLkVYSVQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2V4aXQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgaWYgKCF3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2JhZCAoXygiLkVYSVQgbXVzdCBhcHBlYXIgd2l0aGluIGEgcHJvY2VkdXJlIikpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCFjYWxsaW5mb19mb3VuZCkKLQlhc19iYWQgKF8oIk1pc3NpbmcgLmNhbGxpbmZvIikpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghd2l0aGluX2VudHJ5X2V4aXQpCi0JICAgIGFzX2JhZCAoXygiTm8gLkVOVFJZIGZvciB0aGlzIC5FWElUIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2l0aGluX2VudHJ5X2V4aXQgPSBGQUxTRTsKLQkgICAgICBwcm9jZXNzX2V4aXQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIGEgLkVYUE9SVCBkaXJlY3RpdmUuICBUaGlzIG1ha2VzIGZ1bmN0aW9ucyBleHRlcm5hbAotICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgYXJndW1lbnQgcmVsb2NhdGlvbiBlbnRyaWVzCi0gICB0byBjYWxsZXJzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2V4cG9ydCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyogTWFrZSBzdXJlIHRoZSBnaXZlbiBzeW1ib2wgZXhpc3RzLiAgKi8KLSAgaWYgKChzeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCBkZWZpbmUgZXhwb3J0IHN5bWJvbDogJXNcbiIpLCBuYW1lKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBPSy4gIFNldCB0aGUgZXh0ZXJuYWwgYml0cyBhbmQgcHJvY2VzcyBhcmd1bWVudCByZWxvY2F0aW9ucy4gICovCi0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBwYV90eXBlX2FyZ3MgKHN5bWJvbCwgMSk7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIZWxwZXIgZnVuY3Rpb24gdG8gcHJvY2VzcyBhcmd1bWVudHMgdG8gYSAuRVhQT1JUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV90eXBlX2FyZ3MgKHN5bWJvbFAsIGlzX2V4cG9ydCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgICAgaW50IGlzX2V4cG9ydDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHVuc2lnbmVkIGludCB0ZW1wLCBhcmdfcmVsb2M7Ci0gIHBhX3N5bWJvbF90eXBlIHR5cGUgPSBTWU1CT0xfVFlQRV9VTktOT1dOOwotICBvYmpfc3ltYm9sX3R5cGUgKnN5bWJvbCA9IChvYmpfc3ltYm9sX3R5cGUgKikgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYWJzb2x1dGUiLCA4KSA9PSAwKQotCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDg7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfYWJzX3NlY3Rpb25fcHRyKTsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9BQlNPTFVURTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJjb2RlIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIC8qIElNUE9SVGluZy9FWFBPUlRpbmcgQ09ERSB0eXBlcyBmb3IgZnVuY3Rpb25zIGlzIG1lYW5pbmdsZXNzIGZvciBTT00sCi0gICAgICAgICBpbnN0ZWFkIG9uZSBzaG91bGQgYmUgSU1QT1JUaW5nL0VYUE9SVGluZyBFTlRSWSB0eXBlcy4KLQotICAgICAgICAgQ29tcGxhaW4gaWYgb25lIHRyaWVzIHRvIEVYUE9SVCBhIENPREUgdHlwZSBzaW5jZSB0aGF0J3MgbmV2ZXIKLSAgICAgICAgIGRvbmUuICBCb3RoIEdDQyBhbmQgSFAgQyBzdGlsbCB0cnkgdG8gSU1QT1JUIENPREUgdHlwZXMsIHNvCi0gICAgICAgICBzaWxlbnRseSBmaXggdGhlbSB0byBiZSBFTlRSWSB0eXBlcy4gICovCi0gICAgICBpZiAoU19JU19GVU5DVElPTiAoc3ltYm9sUCkpCi0JewotCSAgaWYgKGlzX2V4cG9ydCkKLQkgICAgYXNfdHNrdHNrIChfKCJVc2luZyBFTlRSWSByYXRoZXIgdGhhbiBDT0RFIGluIGV4cG9ydCBkaXJlY3RpdmUgZm9yICVzIiksCi0JCSAgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0JICB0eXBlID0gU1lNQk9MX1RZUEVfQ09ERTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZGF0YSIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZW50cnkiLCA1KSA9PSAwKSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIm1pbGxpY29kZSIsIDkpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDk7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9NSUxMSUNPREU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAicGxhYmVsIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgJj0gfkJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9QTEFCRUw7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAicHJpX3Byb2ciLCA4KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA4OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfUFJJX1BST0c7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic2VjX3Byb2ciLCA4KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA4OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfU0VDX1BST0c7Ci0gICAgfQotCi0gIC8qIFNPTSByZXF1aXJlcyBtdWNoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc3ltYm9sIHR5cGVzCi0gICAgIHRoYW4gQkZEIHVuZGVyc3RhbmRzLiAgVGhpcyBpcyBob3cgd2UgZ2V0IHRoaXMgaW5mb3JtYXRpb24KLSAgICAgdG8gdGhlIFNPTSBCRkQgYmFja2VuZC4gICovCi0jaWZkZWYgb2JqX3NldF9zeW1ib2xfdHlwZQotICBvYmpfc2V0X3N5bWJvbF90eXBlIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCksIChpbnQpIHR5cGUpOwotI2VuZGlmCi0KLSAgLyogTm93IHRoYXQgdGhlIHR5cGUgb2YgdGhlIGV4cG9ydGVkIHN5bWJvbCBoYXMgYmVlbiBoYW5kbGVkLAotICAgICBoYW5kbGUgYW55IGFyZ3VtZW50IHJlbG9jYXRpb24gaW5mb3JtYXRpb24uICAqLwotICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIC8qIEFyZ3VtZW50IHNvdXJjZXMuICAqLwotICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImFyZ3ciLCA0KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gYXRvaSAobmFtZSArIDQpOwotCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGFyZ19yZWxvYyA9IHBhX2FsaWduX2FyZ19yZWxvYyAodGVtcCwgcGFfYnVpbGRfYXJnX3JlbG9jIChuYW1lKSk7Ci0jaWZkZWYgT0JKX1NPTQotCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jIHw9IGFyZ19yZWxvYzsKLSNlbmRpZgotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgLyogVGhlIHJldHVybiB2YWx1ZS4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJydG52YWwiLCA2KSkgPT0gMCkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgYXJnX3JlbG9jID0gcGFfYnVpbGRfYXJnX3JlbG9jIChuYW1lKTsKLSNpZmRlZiBPQkpfU09NCi0JICBzeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MgfD0gYXJnX3JlbG9jOwotI2VuZGlmCi0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICAvKiBQcml2ZWxlZ2UgbGV2ZWwuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicHJpdl9sZXYiLCA4KSkgPT0gMCkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gYXRvaSAoaW5wdXRfbGluZV9wb2ludGVyKTsKLSNpZmRlZiBPQkpfU09NCi0JICBzeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9wcml2X2xldmVsID0gdGVtcDsKLSNlbmRpZgotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiVW5kZWZpbmVkIC5FWFBPUlQvLklNUE9SVCBhcmd1bWVudCAoaWdub3JlZCk6ICVzIiksIG5hbWUpOwotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQl9Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgYW4gLklNUE9SVCBwc2V1ZG8tb3AuICBBbnkgc3ltYm9sIHJlZmVyZW5jZWQgaW4gYSBnaXZlbgotICAgYXNzZW1ibHkgZmlsZSBtdXN0IGVpdGhlciBiZSBkZWZpbmVkIGluIHRoZSBhc3NlbWJseSBmaWxlLCBvcgotICAgZXhwbGljaXRseSBJTVBPUlRFRCBmcm9tIGFub3RoZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfaW1wb3J0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bWJvbCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgLyogVWdoLiAgV2UgbWlnaHQgYmUgaW1wb3J0aW5nIGEgc3ltYm9sIGRlZmluZWQgZWFybGllciBpbiB0aGUgZmlsZSwKLSAgICAgaW4gd2hpY2ggY2FzZSBhbGwgdGhlIGNvZGUgYmVsb3cgd2lsbCByZWFsbHkgc2NyZXcgdGhpbmdzIHVwCi0gICAgIChzZXQgdGhlIHdyb25nIHNlZ21lbnQsIHN5bWJvbCBmbGFncyAmIHR5cGUsIGV0YykuICAqLwotICBpZiAoc3ltYm9sID09IE5VTEwgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sKSkKLSAgICB7Ci0gICAgICBzeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0KLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHBhX3R5cGVfYXJncyAoc3ltYm9sLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogU2lnaC4gIFRvIGJlIGNvbXBhdGFibGUgd2l0aCB0aGUgSFAgYXNzZW1ibGVyIGFuZCB0byBoZWxwCi0JICAgICBwb29ybHkgd3JpdHRlbiBhc3NlbWJseSBjb2RlLCB3ZSBhc3NpZ24gYSB0eXBlIGJhc2VkIG9uCi0JICAgICB0aGUgdGhlIGN1cnJlbnQgc2VnbWVudC4gIE5vdGUgb25seSBCU0ZfRlVOQ1RJT04gcmVhbGx5Ci0JICAgICBtYXR0ZXJzLCB3ZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZ1bGwgU1lNQk9MX1RZUEVfKiBpbmZvLiAgKi8KLQkgIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLQkgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQotCSAgLyogSWYgdGhlIHNlY3Rpb24gaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkCi0JICAgICBTaW5jZSB0aGlzIGlzIGFuIGltcG9ydCwgbGVhdmUgdGhlIHNlY3Rpb24gdW5kZWZpbmVkLiAgKi8KLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbCwgYmZkX3VuZF9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZC4gIEp1c3QgZWF0IGV2ZXJ5dGhpbmcgdXAgdG8KLQkgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuICAqLwotICAgICAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuTEFCRUwgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xhYmVsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RybGVuIChuYW1lKSA+IDApCi0gICAgewotICAgICAgY29sb24gKG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJNaXNzaW5nIGxhYmVsIG5hbWUgb24gLkxBQkVMIikpOwotICAgIH0KLQotICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiZXh0cmEgLkxBQkVMIGFyZ3VtZW50cyBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuTEVBVkUgcHNldWRvLW9wLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIHlldC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sZWF2ZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBhc19iYWQgKF8oIlRoZSAuTEVBVkUgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5MRVZFTCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbGV2ZWwgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbGV2ZWw7Ci0KLSAgbGV2ZWwgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmIChzdHJuY21wIChsZXZlbCwgIjEuMCIsIDMpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDEwKSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGxldmVsLCAiMS4xIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMTEpKQotCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobGV2ZWwsICIyLjAiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAyMCkpCi0JYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgLkxFVkVMIGFyZ3VtZW50XG4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLk9SSUdJTiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfb3JpZ2luICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHNfb3JnICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5QQVJBTSBwc2V1ZG8tb3AuICBUaGlzIGlzIG11Y2ggbGlrZSBhIC5FWFBPUlQsIGV4Y2VwdCBpdAotICAgaXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBGSVhNRS4gIFNob3VsZCBzaGFyZSBtb3JlIGNvZGUgd2l0aCAuRVhQT1JULiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3BhcmFtICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmICgoc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgZGVmaW5lIHN0YXRpYyBzeW1ib2w6ICVzXG4iKSwgbmFtZSk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBwYV90eXBlX2FyZ3MgKHN5bWJvbCwgMCk7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuUFJPQyBwc2V1ZG8tb3AuICBJdCBpcyB1c2VkIHRvIG1hcmsgdGhlIGJlZ2lubmluZwotICAgb2YgYSBwcm9jZWR1cmUgZnJvbSBhIHN5bnRhdGljYWwgcG9pbnQgb2Ygdmlldy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9wcm9jICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mbzsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19mYXRhbCAoXygiTmVzdGVkIHByb2NlZHVyZXMiKSk7Ci0KLSAgLyogUmVzZXQgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgbmV3IHByb2NlZHVyZS4gICovCi0gIGNhbGxpbmZvX2ZvdW5kID0gRkFMU0U7Ci0gIHdpdGhpbl9wcm9jZWR1cmUgPSBUUlVFOwotCi0gIC8qIENyZWF0ZSBhbm90aGVyIGNhbGxfaW5mbyBzdHJ1Y3R1cmUuICAqLwotICBjYWxsX2luZm8gPSAoc3RydWN0IGNhbGxfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjYWxsX2luZm8pKTsKLQotICBpZiAoIWNhbGxfaW5mbykKLSAgICBhc19mYXRhbCAoXygiQ2Fubm90IGFsbG9jYXRlIHVud2luZCBkZXNjcmlwdG9yXG4iKSk7Ci0KLSAgbWVtc2V0IChjYWxsX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfaW5mbykpOwotCi0gIGNhbGxfaW5mby0+Y2lfbmV4dCA9IE5VTEw7Ci0KLSAgaWYgKGNhbGxfaW5mb19yb290ID09IE5VTEwpCi0gICAgewotICAgICAgY2FsbF9pbmZvX3Jvb3QgPSBjYWxsX2luZm87Ci0gICAgICBsYXN0X2NhbGxfaW5mbyA9IGNhbGxfaW5mbzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0X2NhbGxfaW5mby0+Y2lfbmV4dCA9IGNhbGxfaW5mbzsKLSAgICAgIGxhc3RfY2FsbF9pbmZvID0gY2FsbF9pbmZvOwotICAgIH0KLQotICAvKiBzZXQgdXAgZGVmYXVsdHMgb24gY2FsbF9pbmZvIHN0cnVjdHVyZSAqLwotCi0gIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuY2Fubm90X3Vud2luZCA9IDA7Ci0gIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IucmVnaW9uX2Rlc2MgPSAxOwotICBjYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmhwdXhfaW50ZXJydXB0X21hcmtlciA9IDA7Ci0KLSAgLyogSWYgd2UgZ290IGEgLlBST0MgcHNldWRvLW9wLCB3ZSBrbm93IHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQKLSAgICAgbG9jYWxseS4gIE1ha2Ugc3VyZSBpdCBnZXRzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHsKLSAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICBpZiAobGFiZWxfc3ltYm9sKQotICAgICAgewotCWlmIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCkKLQkgIHsKLQkgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICBzeW1ib2xfZ2V0X2JmZHN5bSAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICB9Ci0JZWxzZQotCSAgYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIikpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPSBOVUxMOwotICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyB0aGUgc3ludGF0aWNhbCBlbmQgb2YgYSBwcm9jZWR1cmUuICBNYWtlIHN1cmUgYWxsIHRoZQotICAgYXBwcm9wcmlhdGUgcHNldWRvLW9wcyB3ZXJlIGZvdW5kIHdpdGhpbiB0aGUgcHJvY2VkdXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3Byb2NlbmQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICAvKiBJZiB3ZSBhcmUgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24sIG1ha2Ugc3VyZSB3ZSd2ZQotICAgICBkZWZpbmVkIGEgbGFiZWwgZm9yIHRoZSBwcm9jZWR1cmU7IGhhbmRsZSBjYXNlIHdoZXJlIHRoZQotICAgICBsYWJlbCB3YXMgZGVmaW5lZCBhZnRlciB0aGUgLlBST0MgZGlyZWN0aXZlLgotCi0gICAgIE5vdGUgdGhlcmUncyBub3QgbmVlZCB0byBkaWRkbGUgd2l0aCB0aGUgc2VnbWVudCBvciBmcmFnbWVudAotICAgICBmb3IgdGhlIGxhYmVsIHN5bWJvbCBpbiB0aGlzIGNhc2UuICBXZSBoYXZlIGFscmVhZHkgc3dpdGNoZWQKLSAgICAgaW50byB0aGUgbmV3ICRDT0RFJCBzdWJzcGFjZSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUgJiYgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKLQotICAgICAgaWYgKGxhYmVsX3N5bWJvbCkKLQl7Ci0JICBpZiAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpCi0JICAgIHsKLQkgICAgICBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID0gbGFiZWxfc3ltYm9sLT5sc3NfbGFiZWw7Ci0JICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKS0+ZmxhZ3MKLQkJfD0gQlNGX0ZVTkNUSU9OOwotI2lmZGVmIE9CSl9TT00KLQkgICAgICAvKiBBbHNvIGhhbmRsZSBhbGxvY2F0aW9uIG9mIGEgZml4dXAgdG8gaG9sZCB0aGUgdW53aW5kCi0JCSBpbmZvcm1hdGlvbiB3aGVuIHRoZSBsYWJlbCBhcHBlYXJzIGFmdGVyIHRoZSBwcm9jL3Byb2NlbmQuICAqLwotCSAgICAgIGlmICh3aXRoaW5fZW50cnlfZXhpdCkKLQkJewotCQkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotCQkgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCQkJTlVMTCwgKG9mZnNldFQpIDAsIE5VTEwsCi0JCQkJMCwgUl9IUFBBX0VOVFJZLCBlX2ZzZWwsIDAsIDAsCi0JCQkJKGludCAqKSAmbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yKTsKLQkJfQotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MiKSk7Ci0gICAgfQotCi0gIGlmICghd2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19iYWQgKF8oIm1pc3BsYWNlZCAucHJvY2VuZCIpKTsKLQotICBpZiAoIWNhbGxpbmZvX2ZvdW5kKQotICAgIGFzX2JhZCAoXygiTWlzc2luZyAuY2FsbGluZm8gZm9yIHRoaXMgcHJvY2VkdXJlIikpOwotCi0gIGlmICh3aXRoaW5fZW50cnlfZXhpdCkKLSAgICBhc19iYWQgKF8oIk1pc3NpbmcgLkVYSVQgZm9yIGEgLkVOVFJZIikpOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBFTEYgbmVlZHMgdG8gbWFyayB0aGUgZW5kIG9mIGVhY2ggZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gY29tcHV0ZQotICAgICB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24gKGFwcGFyZW50bHkgaXRzIG5lZWRlZCBpbiB0aGUgc3ltYm9sIHRhYmxlKS4gICovCi0gIGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uICgpOwotI2VuZGlmCi0KLSAgd2l0aGluX3Byb2NlZHVyZSA9IEZBTFNFOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogSWYgVkFMVUUgaXMgYW4gZXhhY3QgcG93ZXIgb2YgdHdvIGJldHdlZW4gemVybyBhbmQgMl4zMSwgdGhlbgotICAgcmV0dXJuIGxvZzIgKFZBTFVFKS4gIEVsc2UgcmV0dXJuIC0xLiAgKi8KLQotc3RhdGljIGludAotbG9nMiAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgaW50IHNoaWZ0ID0gMDsKLQotICB3aGlsZSAoKDEgPDwgc2hpZnQpICE9IHZhbHVlICYmIHNoaWZ0IDwgMzIpCi0gICAgc2hpZnQrKzsKLQotICBpZiAoc2hpZnQgPj0gMzIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuIHNoaWZ0OwotfQotCi0KLSNpZmRlZiBPQkpfU09NCi0vKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKQotewotICBpZiAoY3VycmVudF9zcGFjZSA9PSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJOb3QgaW4gYSBzcGFjZS5cbiIpKTsKLQotICBpZiAoY3VycmVudF9zdWJzcGFjZSA9PSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJOb3QgaW4gYSBzdWJzcGFjZS5cbiIpKTsKLX0KLQotLyogUGFyc2UgdGhlIHBhcmFtZXRlcnMgdG8gYSAuU1BBQ0UgZGlyZWN0aXZlOyBpZiBDUkVBVEVfRkxBRyBpcyBub256ZXJvLAotICAgdGhlbiBjcmVhdGUgYSBuZXcgc3BhY2UgZW50cnkgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb24gc3BlY2lmaWVkCi0gICBieSB0aGUgcGFyYW1ldGVycyB0byB0aGUgLlNQQUNFIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoc3BhY2VfbmFtZSwgY3JlYXRlX2ZsYWcpCi0gICAgIGNoYXIgKnNwYWNlX25hbWU7Ci0gICAgIGludCBjcmVhdGVfZmxhZzsKLXsKLSAgY2hhciAqbmFtZSwgKnB0ZW1wLCBjOwotICBjaGFyIGxvYWRhYmxlLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0OwotICBpbnQgc3BudW0sIHRlbXA7Ci0gIGFzZWN0aW9uICpzZWcgPSBOVUxMOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotCi0gIC8qIGxvYWQgZGVmYXVsdCB2YWx1ZXMgKi8KLSAgc3BudW0gPSAwOwotICBzb3J0ID0gMDsKLSAgbG9hZGFibGUgPSBUUlVFOwotICBkZWZpbmVkID0gVFJVRTsKLSAgcHJpdmF0ZSA9IEZBTFNFOwotICBpZiAoc3RyY21wIChzcGFjZV9uYW1lLCAiJFRFWFQkIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWcgPSBwYV9kZWZfc3BhY2VzWzBdLnNlZ21lbnQ7Ci0gICAgICBkZWZpbmVkID0gcGFfZGVmX3NwYWNlc1swXS5kZWZpbmVkOwotICAgICAgcHJpdmF0ZSA9IHBhX2RlZl9zcGFjZXNbMF0ucHJpdmF0ZTsKLSAgICAgIHNvcnQgPSBwYV9kZWZfc3BhY2VzWzBdLnNvcnQ7Ci0gICAgICBzcG51bSA9IHBhX2RlZl9zcGFjZXNbMF0uc3BudW07Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKHNwYWNlX25hbWUsICIkUFJJVkFURSQiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlZyA9IHBhX2RlZl9zcGFjZXNbMV0uc2VnbWVudDsKLSAgICAgIGRlZmluZWQgPSBwYV9kZWZfc3BhY2VzWzFdLmRlZmluZWQ7Ci0gICAgICBwcml2YXRlID0gcGFfZGVmX3NwYWNlc1sxXS5wcml2YXRlOwotICAgICAgc29ydCA9IHBhX2RlZl9zcGFjZXNbMV0uc29ydDsKLSAgICAgIHNwbnVtID0gcGFfZGVmX3NwYWNlc1sxXS5zcG51bTsKLSAgICB9Ci0KLSAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIHByaW50X2Vycm9ycyA9IEZBTFNFOwotICAgICAgcHRlbXAgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotICAgICAgLyogRmlyc3Qgc2VlIGlmIHRoZSBzcGFjZSB3YXMgc3BlY2lmaWVkIGFzIGEgbnVtYmVyIHJhdGhlciB0aGFuCi0gICAgICAgICBhcyBhIG5hbWUuICBBY2NvcmRpbmcgdG8gdGhlIFBBIGFzc2VtYmx5IG1hbnVhbCB0aGUgcmVzdCBvZgotICAgICAgICAgdGhlIGxpbmUgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICAgICAgdGVtcCA9IHBhX3BhcnNlX251bWJlciAoJnB0ZW1wLCAwKTsKLSAgICAgIGlmICh0ZW1wID49IDApCi0JewotCSAgc3BudW0gPSB0ZW1wOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gcHRlbXA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzcG51bSIsIDUpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgc3BudW0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNvcnQiLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHNvcnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInVubG9hZGFibGUiLCAxMCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBsb2FkYWJsZSA9IEZBTFNFOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAibm90ZGVmaW5lZCIsIDEwKSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGRlZmluZWQgPSBGQUxTRTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInByaXZhdGUiLCA3KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIHByaXZhdGUgPSBUUlVFOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5TUEFDRSBhcmd1bWVudCIpKTsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JCSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgcHJpbnRfZXJyb3JzID0gVFJVRTsKLSAgICB9Ci0KLSAgaWYgKGNyZWF0ZV9mbGFnICYmIHNlZyA9PSBOVUxMKQotICAgIHNlZyA9IHN1YnNlZ19uZXcgKHNwYWNlX25hbWUsIDApOwotCi0gIC8qIElmIGNyZWF0ZV9mbGFnIGlzIG5vbnplcm8sIHRoZW4gY3JlYXRlIHRoZSBuZXcgc3BhY2Ugd2l0aAotICAgICB0aGUgYXR0cmlidXRlcyBjb21wdXRlZCBhYm92ZS4gIEVsc2Ugc2V0IHRoZSB2YWx1ZXMgaW4KLSAgICAgYW4gYWxyZWFkeSBleGlzdGluZyBzcGFjZSAtLSB0aGlzIGNhbiBvbmx5IGhhcHBlbiBmb3IKLSAgICAgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBhIGJ1aWx0LWluIHNwYWNlLiAgKi8KLSAgaWYgKGNyZWF0ZV9mbGFnKQotICAgIHNwYWNlID0gY3JlYXRlX25ld19zcGFjZSAoc3BhY2VfbmFtZSwgc3BudW0sIGxvYWRhYmxlLCBkZWZpbmVkLAotCQkJICAgICAgcHJpdmF0ZSwgc29ydCwgc2VnLCAxKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAoc3BhY2VfbmFtZSk7Ci0gICAgICBTUEFDRV9TUE5VTSAoc3BhY2UpID0gc3BudW07Ci0gICAgICBTUEFDRV9ERUZJTkVEIChzcGFjZSkgPSBkZWZpbmVkICYgMTsKLSAgICAgIFNQQUNFX1VTRVJfREVGSU5FRCAoc3BhY2UpID0gMTsKLSAgICB9Ci0KLSNpZmRlZiBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcwotICBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0LCBzcG51bSk7Ci0jZW5kaWYKLQotICByZXR1cm4gc3BhY2U7Ci19Ci0KLS8qIEhhbmRsZSBhIC5TUEFDRSBwc2V1ZG8tb3A7IHRoaXMgc3dpdGNoZXMgdGhlIGN1cnJlbnQgc3BhY2UgdG8gdGhlCi0gICBnaXZlbiBzcGFjZSwgY3JlYXRpbmcgdGhlIG5ldyBzcGFjZSBpZiBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfc3BhY2UgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnNwYWNlX25hbWUsICpzYXZlX3M7Ci0gIGludCB0ZW1wOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNkX2NoYWluOwotCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2FuXCd0IGNoYW5nZSBzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoZWNrIGZvciBzb21lIG9mIHRoZSBwcmVkZWZpbmVkIHNwYWNlcy4gICBGSVhNRTogbW9zdCBvZiB0aGUgY29kZQotICAgICAgICAgYmVsb3cgaXMgcmVwZWF0ZWQgc2V2ZXJhbCB0aW1lcywgY2FuIHdlIGV4dHJhY3QgdGhlIGNvbW1vbiBwYXJ0cwotICAgICAgICAgYW5kIHBsYWNlIHRoZW0gaW50byBhIHN1YnJvdXRpbmUgb3Igc29tZXRoaW5nIHNpbWlsYXI/ICAqLwotICAgICAgLyogRklYTUUgSXMgdGhpcyAoYW5kIHRoZSBuZXh0IElGIHN0bXQpIHJlYWxseSByaWdodD8KLQkgV2hhdCBpZiBJTlBVVF9MSU5FX1BPSU5URVIgcG9pbnRzIHRvICIkVEVYVCRGT08iPyAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIkVEVYVCQiLCA2KSA9PSAwKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotCSAgc2RfY2hhaW4gPSBpc19kZWZpbmVkX3NwYWNlICgiJFRFWFQkIik7Ci0JICBpZiAoc2RfY2hhaW4gPT0gTlVMTCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10ICgiJFRFWFQkIiwgMSk7Ci0JICBlbHNlIGlmIChTUEFDRV9VU0VSX0RFRklORUQgKHNkX2NoYWluKSA9PSAwKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkVEVYVCQiLCAwKTsKLQotCSAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgY3VycmVudF9zdWJzcGFjZQotCSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHRleHRfc2VjdGlvbiwKLQkJCQkJIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIkUFJJVkFURSQiLCA5KSA9PSAwKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSA5OwotCSAgc2RfY2hhaW4gPSBpc19kZWZpbmVkX3NwYWNlICgiJFBSSVZBVEUkIik7Ci0JICBpZiAoc2RfY2hhaW4gPT0gTlVMTCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10ICgiJFBSSVZBVEUkIiwgMSk7Ci0JICBlbHNlIGlmIChTUEFDRV9VU0VSX0RFRklORUQgKHNkX2NoYWluKSA9PSAwKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkUFJJVkFURSQiLCAwKTsKLQotCSAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgY3VycmVudF9zdWJzcGFjZQotCSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGRhdGFfc2VjdGlvbiwKLQkJCQkJIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmICghc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCUdEQl9ERUJVR19TUEFDRV9OQU1FLAotCQkJc3RybGVuIChHREJfREVCVUdfU1BBQ0VfTkFNRSkpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSBzdHJsZW4gKEdEQl9ERUJVR19TUEFDRV9OQU1FKTsKLQkgIHNkX2NoYWluID0gaXNfZGVmaW5lZF9zcGFjZSAoR0RCX0RFQlVHX1NQQUNFX05BTUUpOwotCSAgaWYgKHNkX2NoYWluID09IE5VTEwpCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoR0RCX0RFQlVHX1NQQUNFX05BTUUsIDEpOwotCSAgZWxzZSBpZiAoU1BBQ0VfVVNFUl9ERUZJTkVEIChzZF9jaGFpbikgPT0gMCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10IChHREJfREVCVUdfU1BBQ0VfTkFNRSwgMCk7Ci0KLQkgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQotCSAgewotCSAgICBhc2VjdGlvbiAqZ2RiX3NlY3Rpb24KLQkgICAgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN0ZG91dHB1dCwgR0RCX0RFQlVHX1NQQUNFX05BTUUpOwotCi0JICAgIHN1YnNlZ19zZXQgKGdkYl9zZWN0aW9uLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgICBjdXJyZW50X3N1YnNwYWNlCi0JICAgICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChnZGJfc2VjdGlvbiwKLQkJCQkJICAgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIH0KLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBJdCBjb3VsZCBiZSBhIHNwYWNlIHNwZWNpZmllZCBieSBudW1iZXIuICAqLwotICAgICAgcHJpbnRfZXJyb3JzID0gMDsKLSAgICAgIHNhdmVfcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmICgodGVtcCA9IHBhX3BhcnNlX251bWJlciAoJmlucHV0X2xpbmVfcG9pbnRlciwgMCkpID49IDApCi0JewotCSAgaWYgKChzZF9jaGFpbiA9IHBhX2ZpbmRfc3BhY2VfYnlfbnVtYmVyICh0ZW1wKSkpCi0JICAgIHsKLQkgICAgICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0KLQkgICAgICBzdWJzZWdfc2V0IChzZF9jaGFpbi0+c2Rfc2VnLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgICAgIGN1cnJlbnRfc3Vic3BhY2UKLQkJPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChzZF9jaGFpbi0+c2Rfc2VnLAotCQkJCQkgICAgIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE5vdCBhIG51bWJlciwgYXR0ZW1wdCB0byBjcmVhdGUgYSBuZXcgc3BhY2UuICAqLwotICAgICAgcHJpbnRfZXJyb3JzID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfczsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzcGFjZV9uYW1lID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICAgICAgc3RyY3B5IChzcGFjZV9uYW1lLCBuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKHNwYWNlX25hbWUsIDEpOwotICAgICAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCi0gICAgICBzdWJzZWdfc2V0IChzZF9jaGFpbi0+c2Rfc2VnLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotICAgICAgY3VycmVudF9zdWJzcGFjZSA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHNkX2NoYWluLT5zZF9zZWcsCi0JCQkJCQkgIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotLyogU3dpdGNoIHRvIGEgbmV3IHNwYWNlLiAgKEkgdGhpbmspLiAgRklYTUUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfc3BudW0gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlIChuYW1lKTsKLSAgaWYgKHNwYWNlKQotICAgIHsKLSAgICAgIHAgPSBmcmFnX21vcmUgKDQpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBTUEFDRV9TUE5VTSAoc3BhY2UpLCA0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCJVbmRlZmluZWQgc3BhY2U6ICclcycgQXNzdW1pbmcgc3BhY2UgbnVtYmVyID0gMC4iKSwgbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5TVUJTUEFDRSBwc2V1ZG8tb3A7IHRoaXMgc3dpdGNoZXMgdGhlIGN1cnJlbnQgc3Vic3BhY2UgdG8gdGhlCi0gICBnaXZlbiBzdWJzcGFjZSwgY3JlYXRpbmcgdGhlIG5ldyBzdWJzcGFjZSBpZiBuZWNlc3NhcnkuCi0KLSAgIEZJWE1FLiAgU2hvdWxkIG1pcnJvciBwYV9zcGFjZSBtb3JlIGNsb3NlbHksIGluIHBhcnRpY3VsYXIgaG93Ci0gICB0aGV5J3JlIGJyb2tlbiB1cCBpbnRvIHN1YnJvdXRpbmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3N1YnNwYWNlIChjcmVhdGVfbmV3KQotICAgICBpbnQgY3JlYXRlX25ldzsKLXsKLSAgY2hhciAqbmFtZSwgKnNzX25hbWUsIGM7Ci0gIGNoYXIgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLCB6ZXJvLCBzb3J0OwotICBpbnQgaSwgYWNjZXNzLCBzcGFjZV9pbmRleCwgYWxpZ25tZW50LCBxdWFkcmFudCwgYXBwbGljYWJsZSwgZmxhZ3M7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKnNzZDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTXVzdCBiZSBpbiBhIHNwYWNlIGJlZm9yZSBjaGFuZ2luZyBvciBkZWNsYXJpbmcgc3Vic3BhY2VzLlxuIikpOwotCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2FuXCd0IGNoYW5nZSBzdWJzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzc19uYW1lID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICAgICAgc3RyY3B5IChzc19uYW1lLCBuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICAvKiBMb2FkIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIHNvcnQgPSAwOwotICAgICAgYWNjZXNzID0gMHg3ZjsKLSAgICAgIGxvYWRhYmxlID0gMTsKLSAgICAgIGNvbW1vbiA9IDA7Ci0gICAgICBkdXBfY29tbW9uID0gMDsKLSAgICAgIGNvZGVfb25seSA9IDA7Ci0gICAgICB6ZXJvID0gMDsKLSAgICAgIHNwYWNlX2luZGV4ID0gfjA7Ci0gICAgICBhbGlnbm1lbnQgPSAxOwotICAgICAgcXVhZHJhbnQgPSAwOwotCi0gICAgICBzcGFjZSA9IGN1cnJlbnRfc3BhY2U7Ci0gICAgICBpZiAoY3JlYXRlX25ldykKLQlzc2QgPSBOVUxMOwotICAgICAgZWxzZQotCXNzZCA9IGlzX2RlZmluZWRfc3Vic3BhY2UgKHNzX25hbWUpOwotICAgICAgLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSB0aGUgYnVpbHRpbiBhdHRyaWJ1dGVzIG9mIHN1YnNwYWNlcy4gIEJ1dAotICAgICAgICAgb25seSBhbGxvdyB0aGUgYXR0cmlidXRlcyB0byBiZSBjaGFuZ2VkIG9uY2UhICAqLwotICAgICAgaWYgKHNzZCAmJiBTVUJTUEFDRV9ERUZJTkVEIChzc2QpKQotCXsKLQkgIHN1YnNlZ19zZXQgKHNzZC0+c3NkX3NlZywgc3NkLT5zc2Rfc3Vic2VnKTsKLQkgIGN1cnJlbnRfc3Vic3BhY2UgPSBzc2Q7Ci0JICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JICAgIGFzX3dhcm4gKF8oIlBhcmFtZXRlcnMgb2YgYW4gZXhpc3Rpbmcgc3Vic3BhY2UgY2FuXCd0IGJlIG1vZGlmaWVkIikpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBuZXcgc3Vic3BhY2UuICBMb2FkIGRlZmF1bHQgdmFsdWVzIGlmIGl0IG1hdGNoZXMgb25lIG9mCi0JICAgICB0aGUgYnVpbHRpbiBzdWJzcGFjZXMuICAqLwotCSAgaSA9IDA7Ci0JICB3aGlsZSAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgc3NfbmFtZSkgPT0gMCkKLQkJewotCQkgIGxvYWRhYmxlID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5sb2FkYWJsZTsKLQkJICBjb21tb24gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvbW1vbjsKLQkJICBkdXBfY29tbW9uID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5kdXBfY29tbW9uOwotCQkgIGNvZGVfb25seSA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uY29kZV9vbmx5OwotCQkgIHplcm8gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnplcm87Ci0JCSAgc3BhY2VfaW5kZXggPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnNwYWNlX2luZGV4OwotCQkgIGFsaWdubWVudCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uYWxpZ25tZW50OwotCQkgIHF1YWRyYW50ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5xdWFkcmFudDsKLQkJICBhY2Nlc3MgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmFjY2VzczsKLQkJICBzb3J0ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5zb3J0OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaSsrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBzaG91bGQgYmUgd29ya2luZyB3aXRoIGEgbmV3IHN1YnNwYWNlIG5vdy4gIEZpbGwgaW4KLSAgICAgICAgIGFueSBpbmZvcm1hdGlvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICAqLwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInF1YWQiLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHF1YWRyYW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhbGlnbiIsIDUpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgYWxpZ25tZW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCSAgaWYgKGxvZzIgKGFsaWdubWVudCkgPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiAyIikpOwotCQkgICAgICBhbGlnbm1lbnQgPSAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYWNjZXNzIiwgNikgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBhY2Nlc3MgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNvcnQiLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHNvcnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNvZGVfb25seSIsIDkpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgY29kZV9vbmx5ID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInVubG9hZGFibGUiLCAxMCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBsb2FkYWJsZSA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJjb21tb24iLCA2KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGNvbW1vbiA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJkdXBfY29tbSIsIDgpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgZHVwX2NvbW1vbiA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJ6ZXJvIiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICB6ZXJvID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImZpcnN0IiwgNSkgPT0gMCkpCi0JCWFzX2JhZCAoXygiRklSU1Qgbm90IHN1cHBvcnRlZCBhcyBhIC5TVUJTUEFDRSBhcmd1bWVudCIpKTsKLQkgICAgICBlbHNlCi0JCWFzX2JhZCAoXygiSW52YWxpZCAuU1VCU1BBQ0UgYXJndW1lbnQiKSk7Ci0JICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgfQotCX0KLQotICAgICAgLyogQ29tcHV0ZSBhIHJlYXNvbmFibGUgc2V0IG9mIEJGRCBmbGFncyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgIGluIHRoZSAuc3Vic3BhY2UgZGlyZWN0aXZlLiAgKi8KLSAgICAgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKGxvYWRhYmxlKQotCWZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCk7Ci0gICAgICBpZiAoY29kZV9vbmx5KQotCWZsYWdzIHw9IFNFQ19DT0RFOwotICAgICAgaWYgKGNvbW1vbiB8fCBkdXBfY29tbW9uKQotCWZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0KLSAgICAgIGZsYWdzIHw9IFNFQ19SRUxPQyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSB6ZXJvLWZpbGxlZCBzdWJzcGFjZSAoZWcgQlNTKS4gICovCi0gICAgICBpZiAoemVybykKLQlmbGFncyAmPSB+KFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyk7Ci0KLSAgICAgIGFwcGxpY2FibGUgJj0gZmxhZ3M7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gZXhpc3Rpbmcgc3Vic3BhY2UsIHRoZW4gd2Ugd2FudCB0byB1c2UgdGhlCi0gICAgICAgICBzZWdtZW50IGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzcGFjZS4KLQotICAgICAgICAgRklYTUUgTk9XISAgRUxGIEJGRCBkb2Vzbid0IGFwcGVhciB0byBiZSByZWFkeSB0byBkZWFsIHdpdGgKLSAgICAgICAgIGxvdHMgb2Ygc2VjdGlvbnMuICBJdCBtaWdodCBiZSBhIHByb2JsZW0gaW4gdGhlIFBBIEVMRgotICAgICAgICAgY29kZSwgSSBkbyBub3Qga25vdyB5ZXQuICBGb3Igbm93IGF2b2lkIGNyZWF0aW5nIGFueXRoaW5nCi0gICAgICAgICBidXQgdGhlICJzdGFuZGFyZCIgc2VjdGlvbnMgZm9yIEVMRi4gICovCi0gICAgICBpZiAoY3JlYXRlX25ldykKLQlzZWN0aW9uID0gc3Vic2VnX2ZvcmNlX25ldyAoc3NfbmFtZSwgMCk7Ci0gICAgICBlbHNlIGlmIChzc2QpCi0Jc2VjdGlvbiA9IHNzZC0+c3NkX3NlZzsKLSAgICAgIGVsc2UKLQlzZWN0aW9uID0gc3Vic2VnX25ldyAoc3NfbmFtZSwgMCk7Ci0KLSAgICAgIGlmICh6ZXJvKQotCXNlZ19pbmZvIChzZWN0aW9uKS0+YnNzID0gMTsKLQotICAgICAgLyogTm93IHNldCB0aGUgZmxhZ3MuICAqLwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlY3Rpb24sIGFwcGxpY2FibGUpOwotCi0gICAgICAvKiBSZWNvcmQgYW55IGFsaWdubWVudCByZXF1ZXN0IGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2VjdGlvbiwgbG9nMiAoYWxpZ25tZW50KSk7Ci0KLSAgICAgIC8qIFNldCB0aGUgc3RhcnRpbmcgb2Zmc2V0IGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWN0aW9uLAotCQkJICAgcGFfc3Vic3BhY2Vfc3RhcnQgKHNwYWNlLCBxdWFkcmFudCkpOwotCi0gICAgICAvKiBOb3cgdGhhdCBhbGwgdGhlIGZsYWdzIGFyZSBzZXQsIHVwZGF0ZSBhbiBleGlzdGluZyBzdWJzcGFjZSwKLSAgICAgICAgIG9yIGNyZWF0ZSBhIG5ldyBvbmUuICAqLwotICAgICAgaWYgKHNzZCkKLQotCWN1cnJlbnRfc3Vic3BhY2UgPSB1cGRhdGVfc3Vic3BhY2UgKHNwYWNlLCBzc19uYW1lLCBsb2FkYWJsZSwKLQkJCQkJICAgIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLAotCQkJCQkgICAgc29ydCwgemVybywgYWNjZXNzLCBzcGFjZV9pbmRleCwKLQkJCQkJICAgIGFsaWdubWVudCwgcXVhZHJhbnQsCi0JCQkJCSAgICBzZWN0aW9uKTsKLSAgICAgIGVsc2UKLQljdXJyZW50X3N1YnNwYWNlID0gY3JlYXRlX25ld19zdWJzcGFjZSAoc3BhY2UsIHNzX25hbWUsIGxvYWRhYmxlLAotCQkJCQkJY29kZV9vbmx5LCBjb21tb24sCi0JCQkJCQlkdXBfY29tbW9uLCB6ZXJvLCBzb3J0LAotCQkJCQkJYWNjZXNzLCBzcGFjZV9pbmRleCwKLQkJCQkJICAgICAgYWxpZ25tZW50LCBxdWFkcmFudCwgc2VjdGlvbik7Ci0KLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc2VnID0gc2VjdGlvbjsKLSAgICAgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zZWcsIGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zdWJzZWcpOwotICAgIH0KLSAgU1VCU1BBQ0VfREVGSU5FRCAoY3VycmVudF9zdWJzcGFjZSkgPSAxOwotfQotCi0KLS8qIENyZWF0ZSBkZWZhdWx0IHNwYWNlIGFuZCBzdWJzcGFjZSBkaWN0aW9uYXJpZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfc3BhY2VzX2JlZ2luICgpCi17Ci0gIGludCBpOwotCi0gIHNwYWNlX2RpY3Rfcm9vdCA9IE5VTEw7Ci0gIHNwYWNlX2RpY3RfbGFzdCA9IE5VTEw7Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlIChwYV9kZWZfc3BhY2VzW2ldLm5hbWUpCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLQotICAgICAgLyogUGljayB0aGUgcmlnaHQgbmFtZSB0byB1c2UgZm9yIHRoZSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBuYW1lID0gcGFfZGVmX3NwYWNlc1tpXS5uYW1lOwotCi0gICAgICBwYV9kZWZfc3BhY2VzW2ldLnNlZ21lbnQgPSBzdWJzZWdfbmV3IChuYW1lLCAwKTsKLSAgICAgIGNyZWF0ZV9uZXdfc3BhY2UgKHBhX2RlZl9zcGFjZXNbaV0ubmFtZSwgcGFfZGVmX3NwYWNlc1tpXS5zcG51bSwKLQkJCXBhX2RlZl9zcGFjZXNbaV0ubG9hZGFibGUsIHBhX2RlZl9zcGFjZXNbaV0uZGVmaW5lZCwKLQkJCXBhX2RlZl9zcGFjZXNbaV0ucHJpdmF0ZSwgcGFfZGVmX3NwYWNlc1tpXS5zb3J0LAotCQkJcGFfZGVmX3NwYWNlc1tpXS5zZWdtZW50LCAwKTsKLSAgICAgIGkrKzsKLSAgICB9Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUpCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGludCBhcHBsaWNhYmxlLCBzdWJzZWdtZW50OwotICAgICAgYXNlY3Rpb24gKnNlZ21lbnQgPSBOVUxMOwotICAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLQotICAgICAgLyogUGljayB0aGUgcmlnaHQgbmFtZSBmb3IgdGhlIG5ldyBzZWN0aW9uIGFuZCBwaWNrIHRoZSByaWdodAotICAgICAgICAgc3Vic2VnbWVudCBudW1iZXIuICAqLwotICAgICAgbmFtZSA9IHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZTsKLSAgICAgIHN1YnNlZ21lbnQgPSAwOwotCi0gICAgICAvKiBDcmVhdGUgdGhlIG5ldyBzZWN0aW9uLiAgKi8KLSAgICAgIHNlZ21lbnQgPSBzdWJzZWdfbmV3IChuYW1lLCBzdWJzZWdtZW50KTsKLQotCi0gICAgICAvKiBGb3IgU09NIHdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgc3RhbmRhcmQgLnRleHQsIC5kYXRhLCBhbmQgLmJzcwotICAgICAgICAgc2VjdGlvbnMgd2l0aCBvdXIgb3duLiAgIFdlIGFsc28gd2FudCB0byBzZXQgQkZEIGZsYWdzIGZvcgotCSBhbGwgdGhlIGJ1aWx0LWluIHN1YnNwYWNlcy4gICovCi0gICAgICBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJENPREUkIikpCi0JewotCSAgdGV4dF9zZWN0aW9uID0gc2VnbWVudDsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkREFUQSQiKSkKLQl7Ci0JICBkYXRhX3NlY3Rpb24gPSBzZWdtZW50OwotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCi0KLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkQlNTJCIpKQotCXsKLQkgIGJzc19zZWN0aW9uID0gc2VnbWVudDsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiBTRUNfQUxMT0MpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRMSVQkIikpCi0JewotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkTUlMTElDT0RFJCIpKQotCXsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJFVOV0lORCQiKSkKLQl7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQwotCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCX0KLQotICAgICAgLyogRmluZCB0aGUgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic3BhY2UuICAqLwotICAgICAgc3BhY2UgPSBwYV9zZWdtZW50X3RvX3NwYWNlIChwYV9kZWZfc3BhY2VzW3BhX2RlZl9zdWJzcGFjZXNbaV0uCi0JCQkJCQkgZGVmX3NwYWNlX2luZGV4XS5zZWdtZW50KTsKLSAgICAgIGlmIChzcGFjZSA9PSBOVUxMKQotCXsKLQkgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5hYmxlIHRvIGZpbmQgY29udGFpbmluZyBzcGFjZSBmb3IgJXMuIiksCi0JCSAgICBwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUpOwotCX0KLQotICAgICAgY3JlYXRlX25ld19zdWJzcGFjZSAoc3BhY2UsIG5hbWUsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmxvYWRhYmxlLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5jb2RlX29ubHksCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvbW1vbiwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uZHVwX2NvbW1vbiwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uemVybywKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uc29ydCwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uYWNjZXNzLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5zcGFjZV9pbmRleCwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uYWxpZ25tZW50LAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5xdWFkcmFudCwKLQkJCSAgIHNlZ21lbnQpOwotICAgICAgaSsrOwotICAgIH0KLX0KLQotCi0KLS8qIENyZWF0ZSBhIG5ldyBzcGFjZSBOQU1FLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmbGFncyBhcyBkZWZpbmVkCi0gICBieSB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotY3JlYXRlX25ld19zcGFjZSAobmFtZSwgc3BudW0sIGxvYWRhYmxlLCBkZWZpbmVkLCBwcml2YXRlLAotCQkgIHNvcnQsIHNlZywgdXNlcl9kZWZpbmVkKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgc3BudW07Ci0gICAgIGludCBsb2FkYWJsZTsKLSAgICAgaW50IGRlZmluZWQ7Ci0gICAgIGludCBwcml2YXRlOwotICAgICBpbnQgc29ydDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgaW50IHVzZXJfZGVmaW5lZDsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9lbnRyeTsKLQotICBjaGFpbl9lbnRyeSA9IChzZF9jaGFpbl9zdHJ1Y3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzZF9jaGFpbl9zdHJ1Y3QpKTsKLSAgaWYgKCFjaGFpbl9lbnRyeSkKLSAgICBhc19mYXRhbCAoXygiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIpLAotCSAgICAgIG5hbWUpOwotCi0gIFNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgc3RyY3B5IChTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSksIG5hbWUpOwotICBTUEFDRV9ERUZJTkVEIChjaGFpbl9lbnRyeSkgPSBkZWZpbmVkOwotICBTUEFDRV9VU0VSX0RFRklORUQgKGNoYWluX2VudHJ5KSA9IHVzZXJfZGVmaW5lZDsKLSAgU1BBQ0VfU1BOVU0gKGNoYWluX2VudHJ5KSA9IHNwbnVtOwotCi0gIGNoYWluX2VudHJ5LT5zZF9zZWcgPSBzZWc7Ci0gIGNoYWluX2VudHJ5LT5zZF9sYXN0X3N1YnNlZyA9IC0xOwotICBjaGFpbl9lbnRyeS0+c2Rfc3Vic3BhY2VzID0gTlVMTDsKLSAgY2hhaW5fZW50cnktPnNkX25leHQgPSBOVUxMOwotCi0gIC8qIEZpbmQgc3BvdCBmb3IgdGhlIG5ldyBzcGFjZSBiYXNlZCBvbiBpdHMgc29ydCBrZXkuICAqLwotICBpZiAoIXNwYWNlX2RpY3RfbGFzdCkKLSAgICBzcGFjZV9kaWN0X2xhc3QgPSBjaGFpbl9lbnRyeTsKLQotICBpZiAoc3BhY2VfZGljdF9yb290ID09IE5VTEwpCi0gICAgc3BhY2VfZGljdF9yb290ID0gY2hhaW5fZW50cnk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX3BvaW50ZXI7Ci0gICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnByZXZfY2hhaW5fcG9pbnRlcjsKLQotICAgICAgY2hhaW5fcG9pbnRlciA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgIHByZXZfY2hhaW5fcG9pbnRlciA9IE5VTEw7Ci0KLSAgICAgIHdoaWxlIChjaGFpbl9wb2ludGVyKQotCXsKLQkgIHByZXZfY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXI7Ci0JICBjaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlci0+c2RfbmV4dDsKLQl9Ci0KLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgZm91bmQgdGhlIGNvcnJlY3QgcGxhY2UgdG8gYWRkIHRoZSBuZXcKLSAgICAgICAgIGVudHJ5LiAgU28gYWRkIGl0IGFuZCB1cGRhdGUgdGhlIGxpbmtlZCBsaXN0cyBhcyBhcHByb3ByaWF0ZS4gICovCi0gICAgICBpZiAocHJldl9jaGFpbl9wb2ludGVyKQotCXsKLQkgIGNoYWluX2VudHJ5LT5zZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKLQkgIHByZXZfY2hhaW5fcG9pbnRlci0+c2RfbmV4dCA9IGNoYWluX2VudHJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzcGFjZV9kaWN0X3Jvb3QgPSBjaGFpbl9lbnRyeTsKLQkgIGNoYWluX2VudHJ5LT5zZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKLQl9Ci0KLSAgICAgIGlmIChjaGFpbl9lbnRyeS0+c2RfbmV4dCA9PSBOVUxMKQotCXNwYWNlX2RpY3RfbGFzdCA9IGNoYWluX2VudHJ5OwotICAgIH0KLQotICAvKiBUaGlzIGlzIGhlcmUgdG8gY2F0Y2ggcHJlZGVmaW5lZCBzcGFjZXMgd2hpY2ggZG8gbm90IGdldAotICAgICBtb2RpZmllZCBieSB0aGUgdXNlcidzIGlucHV0LiAgQW5vdGhlciBjYWxsIGlzIGZvdW5kIGF0Ci0gICAgIHRoZSBib3R0b20gb2YgcGFfcGFyc2Vfc3BhY2Vfc3RtdCB0byBoYW5kbGUgY2FzZXMgd2hlcmUKLSAgICAgdGhlIHVzZXIgbW9kaWZpZXMgYSBwcmVkZWZpbmVkIHNwYWNlLiAgKi8KLSNpZmRlZiBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcwotICBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0LCBzcG51bSk7Ci0jZW5kaWYKLQotICByZXR1cm4gY2hhaW5fZW50cnk7Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBzdWJzcGFjZSBOQU1FLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmbGFncyBhcyBkZWZpbmVkCi0gICBieSB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLQotICAgQWRkIHRoZSBuZXcgc3Vic3BhY2UgdG8gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkgY2hhaW4gaW4gbnVtZXJpY2FsCi0gICBvcmRlciBhcyBkZWZpbmVkIGJ5IHRoZSBTT1JUIGVudHJpZXMuICAqLwotCi1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCi1jcmVhdGVfbmV3X3N1YnNwYWNlIChzcGFjZSwgbmFtZSwgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLAotCQkgICAgIGR1cF9jb21tb24sIGlzX3plcm8sIHNvcnQsIGFjY2Vzcywgc3BhY2VfaW5kZXgsCi0JCSAgICAgYWxpZ25tZW50LCBxdWFkcmFudCwgc2VnKQotICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLCBpc196ZXJvOwotICAgICBpbnQgc29ydDsKLSAgICAgaW50IGFjY2VzczsKLSAgICAgaW50IHNwYWNlX2luZGV4OwotICAgICBpbnQgYWxpZ25tZW50OwotICAgICBpbnQgcXVhZHJhbnQ7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX2VudHJ5OwotCi0gIGNoYWluX2VudHJ5ID0gKHNzZF9jaGFpbl9zdHJ1Y3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzc2RfY2hhaW5fc3RydWN0KSk7Ci0gIGlmICghY2hhaW5fZW50cnkpCi0gICAgYXNfZmF0YWwgKF8oIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3Vic3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iKSwgbmFtZSk7Ci0KLSAgU1VCU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICBzdHJjcHkgKFNVQlNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSwgbmFtZSk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBzdWJzcGFjZV9kZWZpbmVkLiAgV2hlbiB3ZSBoaXQgYSAuc3Vic3BhY2UgZGlyZWN0aXZlCi0gICAgIHdlJ2xsIHNldCBpdCB0byAxIHdoaWNoICJsb2Nrcy1pbiIgdGhlIHN1YnNwYWNlIGF0dHJpYnV0ZXMuICAqLwotICBTVUJTUEFDRV9ERUZJTkVEIChjaGFpbl9lbnRyeSkgPSAwOwotCi0gIGNoYWluX2VudHJ5LT5zc2Rfc3Vic2VnID0gMDsKLSAgY2hhaW5fZW50cnktPnNzZF9zZWcgPSBzZWc7Ci0gIGNoYWluX2VudHJ5LT5zc2RfbmV4dCA9IE5VTEw7Ci0KLSAgLyogRmluZCBzcG90IGZvciB0aGUgbmV3IHN1YnNwYWNlIGJhc2VkIG9uIGl0cyBzb3J0IGtleS4gICovCi0gIGlmIChzcGFjZS0+c2Rfc3Vic3BhY2VzID09IE5VTEwpCi0gICAgc3BhY2UtPnNkX3N1YnNwYWNlcyA9IGNoYWluX2VudHJ5OwotICBlbHNlCi0gICAgewotICAgICAgc3NkX2NoYWluX3N0cnVjdCAqY2hhaW5fcG9pbnRlcjsKLSAgICAgIHNzZF9jaGFpbl9zdHJ1Y3QgKnByZXZfY2hhaW5fcG9pbnRlcjsKLQotICAgICAgY2hhaW5fcG9pbnRlciA9IHNwYWNlLT5zZF9zdWJzcGFjZXM7Ci0gICAgICBwcmV2X2NoYWluX3BvaW50ZXIgPSBOVUxMOwotCi0gICAgICB3aGlsZSAoY2hhaW5fcG9pbnRlcikKLQl7Ci0JICBwcmV2X2NoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyOwotCSAgY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXItPnNzZF9uZXh0OwotCX0KLQotICAgICAgLyogTm93IHdlIGhhdmUgc29tZXdoZXJlIHRvIHB1dCB0aGUgbmV3IGVudHJ5LiAgSW5zZXJ0IGl0IGFuZCB1cGRhdGUKLSAgICAgICAgIHRoZSBsaW5rcy4gICovCi0gICAgICBpZiAocHJldl9jaGFpbl9wb2ludGVyKQotCXsKLQkgIGNoYWluX2VudHJ5LT5zc2RfbmV4dCA9IGNoYWluX3BvaW50ZXI7Ci0JICBwcmV2X2NoYWluX3BvaW50ZXItPnNzZF9uZXh0ID0gY2hhaW5fZW50cnk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNwYWNlLT5zZF9zdWJzcGFjZXMgPSBjaGFpbl9lbnRyeTsKLQkgIGNoYWluX2VudHJ5LT5zc2RfbmV4dCA9IGNoYWluX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotI2lmZGVmIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzCi0gIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIHNwYWNlLT5zZF9zZWcsIGFjY2VzcywKLQkJCQkgc29ydCwgcXVhZHJhbnQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIGNoYWluX2VudHJ5OwotfQotCi0vKiBVcGRhdGUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gc3Vic3BhY2UgYmFzZWQgdXBvbiB0aGUKLSAgIHZhcmlvdXMgYXJndW1lbnRzLiAgIFJldHVybiB0aGUgbW9kaWZpZWQgc3Vic3BhY2UgY2hhaW4gZW50cnkuICAqLwotCi1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCi11cGRhdGVfc3Vic3BhY2UgKHNwYWNlLCBuYW1lLCBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sIHNvcnQsCi0JCSB6ZXJvLCBhY2Nlc3MsIHNwYWNlX2luZGV4LCBhbGlnbm1lbnQsIHF1YWRyYW50LCBzZWN0aW9uKQotICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgbG9hZGFibGU7Ci0gICAgIGludCBjb2RlX29ubHk7Ci0gICAgIGludCBjb21tb247Ci0gICAgIGludCBkdXBfY29tbW9uOwotICAgICBpbnQgemVybzsKLSAgICAgaW50IHNvcnQ7Ci0gICAgIGludCBhY2Nlc3M7Ci0gICAgIGludCBzcGFjZV9pbmRleDsKLSAgICAgaW50IGFsaWdubWVudDsKLSAgICAgaW50IHF1YWRyYW50OwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgc3NkX2NoYWluX3N0cnVjdCAqY2hhaW5fZW50cnk7Ci0KLSAgY2hhaW5fZW50cnkgPSBpc19kZWZpbmVkX3N1YnNwYWNlIChuYW1lKTsKLQotI2lmZGVmIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzCi0gIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWN0aW9uLCBzcGFjZS0+c2Rfc2VnLCBhY2Nlc3MsCi0JCQkJIHNvcnQsIHF1YWRyYW50KTsKLSNlbmRpZgotCi0gIHJldHVybiBjaGFpbl9lbnRyeTsKLX0KLQotLyogUmV0dXJuIHRoZSBzcGFjZSBjaGFpbiBlbnRyeSBmb3IgdGhlIHNwYWNlIHdpdGggdGhlIG5hbWUgTkFNRSBvcgotICAgTlVMTCBpZiBubyBzdWNoIHNwYWNlIGV4aXN0cy4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotaXNfZGVmaW5lZF9zcGFjZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9wb2ludGVyOwotCi0gIGZvciAoY2hhaW5fcG9pbnRlciA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBjaGFpbl9wb2ludGVyOwotICAgICAgIGNoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKFNQQUNFX05BTUUgKGNoYWluX3BvaW50ZXIpLCBuYW1lKSA9PSAwKQotCXJldHVybiBjaGFpbl9wb2ludGVyOwotICAgIH0KLQotICAvKiBObyBtYXBwaW5nIGZyb20gc2VnbWVudCB0byBzcGFjZSB3YXMgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIGFuZCByZXR1cm4gdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc2VnLiAgSWYgbm8gbWFwcGluZwotICAgZnJvbSB0aGUgZ2l2ZW4gc2VnIHRvIGEgc3BhY2UgaXMgZm91bmQsIHRoZW4gcmV0dXJuIE5VTEwuCi0KLSAgIFVubGlrZSBzdWJzcGFjZXMsIHRoZSBudW1iZXIgb2Ygc3BhY2VzIGlzIG5vdCBleHBlY3RlZCB0byBncm93IG11Y2gsCi0gICBzbyBhIGxpbmVhciBleGhhdXN0aXZlIHNlYXJjaCBpcyBPSyBoZXJlLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1wYV9zZWdtZW50X3RvX3NwYWNlIChzZWcpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47Ci0KLSAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3BhY2UgbG9va2luZyBmb3IgdGhlIGNvcnJlY3QgbWFwcGluZy4gICovCi0gIGZvciAoc3BhY2VfY2hhaW4gPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgc3BhY2VfY2hhaW47Ci0gICAgICAgc3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3BhY2VfY2hhaW4tPnNkX3NlZyA9PSBzZWcpCi0JcmV0dXJuIHNwYWNlX2NoYWluOwotICAgIH0KLQotICAvKiBNYXBwaW5nIHdhcyBub3QgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXR1cm4gdGhlIHNwYWNlIGNoYWluIGVudHJ5IGZvciB0aGUgc3Vic3BhY2Ugd2l0aCB0aGUgbmFtZSBOQU1FIG9yCi0gICBOVUxMIGlmIG5vIHN1Y2ggc3Vic3BhY2UgZXhpc3RzLgotCi0gICBVc2VzIGEgbGluZWFyIHNlYXJjaCB0aHJvdWdoIGFsbCB0aGUgc3BhY2VzIGFuZCBzdWJzcGFjZXMsIHRoaXMgbWF5Ci0gICBub3QgYmUgYXBwcm9wcmlhdGUgaWYgd2UgZXZlciBiZWluZyBwbGFjaW5nIGVhY2ggZnVuY3Rpb24gaW4gaXRzCi0gICBvd24gc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCi1pc19kZWZpbmVkX3N1YnNwYWNlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluOwotICBzc2RfY2hhaW5fc3RydWN0ICpzdWJzcGFjZV9jaGFpbjsKLQotICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzcGFjZS4gICovCi0gIGZvciAoc3BhY2VfY2hhaW4gPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgc3BhY2VfY2hhaW47Ci0gICAgICAgc3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzdWJzcGFjZSBsb29raW5nIGZvciBhIG5hbWUgd2hpY2ggbWF0Y2hlcy4gICovCi0gICAgICBmb3IgKHN1YnNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX3N1YnNwYWNlczsKLQkgICBzdWJzcGFjZV9jaGFpbjsKLQkgICBzdWJzcGFjZV9jaGFpbiA9IHN1YnNwYWNlX2NoYWluLT5zc2RfbmV4dCkKLQlpZiAoc3RyY21wIChTVUJTUEFDRV9OQU1FIChzdWJzcGFjZV9jaGFpbiksIG5hbWUpID09IDApCi0JICByZXR1cm4gc3Vic3BhY2VfY2hhaW47Ci0gICAgfQotCi0gIC8qIFN1YnNwYWNlIHdhc24ndCBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbmQgYW5kIHJldHVybiB0aGUgc3Vic3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzZWcuICBJZiBubwotICAgbWFwcGluZyBmcm9tIHRoZSBnaXZlbiBzZWcgdG8gYSBzdWJzcGFjZSBpcyBmb3VuZCwgdGhlbiByZXR1cm4gTlVMTC4KLQotICAgSWYgd2UgZXZlciBwdXQgZWFjaCBwcm9jZWR1cmUvZnVuY3Rpb24gd2l0aGluIGl0cyBvd24gc3Vic3BhY2UKLSAgICh0byBtYWtlIGxpZmUgZWFzaWVyIG9uIHRoZSBjb21waWxlciBhbmQgbGlua2VyKSwgdGhlbiB0aGlzIHdpbGwgaGF2ZQotICAgdG8gYmVjb21lIG1vcmUgZWZmaWNpZW50LiAgKi8KLQotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKgotcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoc2VnLCBzdWJzZWcpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluOwotICBzc2RfY2hhaW5fc3RydWN0ICpzdWJzcGFjZV9jaGFpbjsKLQotICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzcGFjZS4gICovCi0gIGZvciAoc3BhY2VfY2hhaW4gPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgc3BhY2VfY2hhaW47Ci0gICAgICAgc3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3BhY2VfY2hhaW4tPnNkX3NlZyA9PSBzZWcpCi0JewotCSAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3Vic3BhY2Ugd2l0aGluIGVhY2ggc3BhY2UgbG9va2luZyBmb3IKLQkgICAgIHRoZSBjb3JyZWN0IG1hcHBpbmcuICAqLwotCSAgZm9yIChzdWJzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9zdWJzcGFjZXM7Ci0JICAgICAgIHN1YnNwYWNlX2NoYWluOwotCSAgICAgICBzdWJzcGFjZV9jaGFpbiA9IHN1YnNwYWNlX2NoYWluLT5zc2RfbmV4dCkKLQkgICAgaWYgKHN1YnNwYWNlX2NoYWluLT5zc2Rfc3Vic2VnID09IChpbnQpIHN1YnNlZykKLQkgICAgICByZXR1cm4gc3Vic3BhY2VfY2hhaW47Ci0JfQotICAgIH0KLQotICAvKiBObyBtYXBwaW5nIGZyb20gc3Vic2VnbWVudCB0byBzdWJzcGFjZSBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdpdmVuIGEgbnVtYmVyLCB0cnkgYW5kIGZpbmQgYSBzcGFjZSB3aXRoIHRoZSBuYW1lIG51bWJlci4KLQotICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIHNwYWNlIGRpY3Rpb25hcnkgY2hhaW4gZW50cnkgZm9yIHRoZSBzcGFjZQotICAgdGhhdCB3YXMgZm91bmQgb3IgTlVMTCBvbiBmYWlsdXJlLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1wYV9maW5kX3NwYWNlX2J5X251bWJlciAobnVtYmVyKQotICAgICBpbnQgbnVtYmVyOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluOwotCi0gIGZvciAoc3BhY2VfY2hhaW4gPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgc3BhY2VfY2hhaW47Ci0gICAgICAgc3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoU1BBQ0VfU1BOVU0gKHNwYWNlX2NoYWluKSA9PSAodW5zaWduZWQgaW50KSBudW1iZXIpCi0JcmV0dXJuIHNwYWNlX2NoYWluOwotICAgIH0KLQotICAvKiBObyBhcHByb3ByaWF0ZSBzcGFjZSBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3IgdGhlIGdpdmVuIHN1YnNwYWNlLiAgSWYgdGhlIHN0YXJ0aW5nCi0gICBhZGRyZXNzIGlzIHVua25vd24gdGhlbiByZXR1cm4gemVyby4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBhX3N1YnNwYWNlX3N0YXJ0IChzcGFjZSwgcXVhZHJhbnQpCi0gICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gICAgIGludCBxdWFkcmFudDsKLXsKLSAgLyogRklYTUUuICBBc3N1bWVzIGV2ZXJ5b25lIHB1dHMgcmVhZC93cml0ZSBkYXRhIGF0IDB4NDAwMDAwMCwgdGhpcwotICAgICBpcyBub3QgY29ycmVjdCBmb3IgdGhlIFBBIE9TRjEgcG9ydC4gICovCi0gIGlmICgoc3RyY21wIChTUEFDRV9OQU1FIChzcGFjZSksICIkUFJJVkFURSQiKSA9PSAwKSAmJiBxdWFkcmFudCA9PSAxKQotICAgIHJldHVybiAweDQwMDAwMDAwOwotICBlbHNlIGlmIChzcGFjZS0+c2Rfc2VnID09IGRhdGFfc2VjdGlvbiAmJiBxdWFkcmFudCA9PSAxKQotICAgIHJldHVybiAweDQwMDAwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAwOwotfQotCi0vKiBGSVhNRS4gIE5lZWRzIGRvY3VtZW50YXRpb24uICAqLwotc3RhdGljIGludAotcGFfbmV4dF9zdWJzZWcgKHNwYWNlKQotICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotewotCi0gIHNwYWNlLT5zZF9sYXN0X3N1YnNlZysrOwotICByZXR1cm4gc3BhY2UtPnNkX2xhc3Rfc3Vic2VnOwotfQotI2VuZGlmCi0KLS8qIEhlbHBlciBmdW5jdGlvbiBmb3IgcGFfc3RyaW5nZXIuICBVc2VkIHRvIGZpbmQgdGhlIGVuZCBvZgotICAgYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9zdHJpbmdlcl9hdXggKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBjID0gKnMgJiBDSEFSX01BU0s7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdcIic6Ci0gICAgICBjID0gTk9UX0FfQ0hBUjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBjOwotfQotCi0vKiBIYW5kbGUgYSAuU1RSSU5HIHR5cGUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3N0cmluZ2VyIChhcHBlbmRfemVybykKLSAgICAgaW50IGFwcGVuZF96ZXJvOwotewotICBjaGFyICpzLCBudW1fYnVmWzRdOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgaW50IGk7Ci0KLSAgLyogUHJlcHJvY2VzcyB0aGUgc3RyaW5nIHRvIGhhbmRsZSBQQS1zcGVjaWZpYyBlc2NhcGUgc2VxdWVuY2VzLgotICAgICBGb3IgZXhhbXBsZSwgXHhERCB3aGVyZSBERCBpcyBhIGhleGlkZWNpbWFsIG51bWJlciBzaG91bGQgYmUKLSAgICAgY2hhbmdlZCB0byBcT09PIHdoZXJlIE9PTyBpcyBhbiBvY3RhbCBudW1iZXIuICAqLwotCi0gIC8qIFNraXAgdGhlIG9wZW5pbmcgcXVvdGUuICAqLwotICBzID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQotICB3aGlsZSAoaXNfYV9jaGFyIChjID0gcGFfc3RyaW5nZXJfYXV4IChzKyspKSkKLSAgICB7Ci0gICAgICBpZiAoYyA9PSAnXFwnKQotCXsKLQkgIGMgPSAqczsKLQkgIHN3aXRjaCAoYykKLQkgICAgewotCSAgICAgIC8qIEhhbmRsZSBceDxudW0+LiAgKi8KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgbnVtYmVyOwotCQlpbnQgbnVtX2RpZ2l0OwotCQljaGFyIGRnOwotCQljaGFyICpzX3N0YXJ0ID0gczsKLQotCQkvKiBHZXQgcGFzIHRoZSAneCcuICAqLwotCQlzKys7Ci0JCWZvciAobnVtX2RpZ2l0ID0gMCwgbnVtYmVyID0gMCwgZGcgPSAqczsKLQkJICAgICBudW1fZGlnaXQgPCAyCi0JCSAgICAgJiYgKGlzZGlnaXQgKGRnKSB8fCAoZGcgPj0gJ2EnICYmIGRnIDw9ICdmJykKLQkJCSB8fCAoZGcgPj0gJ0EnICYmIGRnIDw9ICdGJykpOwotCQkgICAgIG51bV9kaWdpdCsrKQotCQkgIHsKLQkJICAgIGlmIChpc2RpZ2l0IChkZykpCi0JCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnMCc7Ci0JCSAgICBlbHNlIGlmIChkZyA+PSAnYScgJiYgZGcgPD0gJ2YnKQotCQkgICAgICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGRnIC0gJ2EnICsgMTA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnQScgKyAxMDsKLQotCQkgICAgcysrOwotCQkgICAgZGcgPSAqczsKLQkJICB9Ci0JCWlmIChudW1fZGlnaXQgPiAwKQotCQkgIHsKLQkJICAgIHN3aXRjaCAobnVtX2RpZ2l0KQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMToKLQkJCXNwcmludGYgKG51bV9idWYsICIlMDJvIiwgbnVtYmVyKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDI6Ci0JCQlzcHJpbnRmIChudW1fYnVmLCAiJTAzbyIsIG51bWJlcik7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgZm9yIChpID0gMDsgaSA8PSBudW1fZGlnaXQ7IGkrKykKLQkJICAgICAgc19zdGFydFtpXSA9IG51bV9idWZbaV07Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIFRoaXMgbWlnaHQgYmUgYSAiXCIiLCBza2lwIG92ZXIgdGhlIGVzY2FwZWQgY2hhci4gICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcysrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgc3RyaW5nZXIgKGFwcGVuZF96ZXJvKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5WRVJTSU9OIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV92ZXJzaW9uICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIG9ial92ZXJzaW9uICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLSNpZmRlZiBPQkpfU09NCi0KLS8qIEhhbmRsZSBhIC5DT01QSUxFUiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29tcGlsZXIgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgb2JqX3NvbV9jb21waWxlciAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0jZW5kaWYKLQotLyogSGFuZGxlIGEgLkNPUFlSSUdIVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29weXJpZ2h0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIG9ial9jb3B5cmlnaHQgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogSnVzdCBsaWtlIGEgbm9ybWFsIGNvbnMsIGJ1dCB3aGVuIGZpbmlzaGVkIHdlIGhhdmUgdG8gdW5kZWZpbmUKLSAgIHRoZSBsYXRlc3Qgc3BhY2UgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29ucyAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBjb25zIChuYnl0ZXMpOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogU3dpdGNoIHRvIHRoZSBkYXRhIHNwYWNlLiAgQXMgdXN1YWwgZGVsZXRlIG91ciBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9kYXRhICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICBjdXJyZW50X3NwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRQUklWQVRFJCIpOwotICBjdXJyZW50X3N1YnNwYWNlCi0gICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChjdXJyZW50X3NwYWNlLT5zZF9zZWcsIDApOwotI2VuZGlmCi0gIHNfZGF0YSAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGZsb2F0X2NvbnMsIGJ1dCB3ZSBuZWVkIHRvIHVuZGVmaW5lIG91ciBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9mbG9hdF9jb25zIChmbG9hdF90eXBlKQotICAgICBpbnQgZmxvYXRfdHlwZTsKLXsKLSAgZmxvYXRfY29ucyAoZmxvYXRfdHlwZSk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIHNfZmlsbCwgYnV0IGRlbGV0ZSBvdXIgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9maWxsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHNfZmlsbCAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGxjb21tLCBidXQgZGVsZXRlIG91ciBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xjb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzX2xjb21tIChuZWVkc19hbGlnbik7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGxzeW0sIGJ1dCBkZWxldGUgb3VyIGxhYmVsIHdoZW4gZmluaXNoZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbHN5bSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzX2xzeW0gKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogU3dpdGNoIHRvIHRoZSB0ZXh0IHNwYWNlLiAgTGlrZSBzX3RleHQsIGJ1dCBkZWxldGUgb3VyCi0gICBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLXN0YXRpYyB2b2lkCi1wYV90ZXh0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICBjdXJyZW50X3NwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRURVhUJCIpOwotICBjdXJyZW50X3N1YnNwYWNlCi0gICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChjdXJyZW50X3NwYWNlLT5zZF9zZWcsIDApOwotI2VuZGlmCi0KLSAgc190ZXh0ICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIE9uIHRoZSBQQSByZWxvY2F0aW9ucyB3aGljaCBpbnZvbHZlIGZ1bmN0aW9uIHN5bWJvbHMgbXVzdCBub3QgYmUKLSAgIGFkanVzdGVkLiAgVGhpcyBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIGtub3cgd2hlbi9ob3cgdG8gY3JlYXRlIGFyZ3VtZW50Ci0gICByZWxvY2F0aW9uIHN0dWJzIGZvciBpbmRpcmVjdCBjYWxscyBhbmQgY2FsbHMgdG8gc3RhdGljIGZ1bmN0aW9ucy4KLQotICAgIlQiIGZpZWxkIHNlbGVjdG9ycyBjcmVhdGUgRExUIHJlbGF0aXZlIGZpeHVwcyBmb3IgYWNjZXNzaW5nCi0gICBnbG9iYWxzIGFuZCBzdGF0aWNzIGluIFBJQyBjb2RlOyBlYWNoIERMVCByZWxhdGl2ZSBmaXh1cCBjcmVhdGVzCi0gICBhbiBlbnRyeSBpbiB0aGUgRExUIHRhYmxlLiAgVGhlIGVudHJpZXMgY29udGFpbiB0aGUgYWRkcmVzcyBvZgotICAgdGhlIGZpbmFsIHRhcmdldCAoZWcgYWNjZXNzaW5nICJmb28iIHdvdWxkIGNyZWF0ZSBhIERMVCBlbnRyeQotICAgd2l0aCB0aGUgYWRkcmVzcyBvZiAiZm9vIikuCi0KLSAgIFVuZm9ydHVuYXRlbHksIHRoZSBIUCBsaW5rZXIgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCBhbnkgYWRkZW5kCi0gICB3aGVuIGdlbmVyYXRpbmcgdGhlIERMVDsgc28gYWNjZXNzaW5nICRMSVQkKzggcHV0cyB0aGUgYWRkcmVzcyBvZgotICAgJExJVCQgaW50byB0aGUgRExUIHJhdGhlciB0aGFuIHRoZSBhZGRyZXNzIG9mICRMSVQkKzguCi0KLSAgIFRoZSBlbmQgcmVzdWx0IGlzIHdlIGNhbid0IHBlcmZvcm0gcmVsb2NhdGlvbiBzeW1ib2wgcmVkdWN0aW9ucyBmb3IKLSAgIGFueSBmaXh1cCB3aGljaCBjcmVhdGVzIGVudHJpZXMgaW4gdGhlIERMVCAoZWcgdGhleSB1c2UgIlQiIGZpZWxkCi0gICBzZWxlY3RvcnMpLgotCi0gICBSZWplY3QgcmVkdWN0aW9ucyBpbnZvbHZpbmcgc3ltYm9scyB3aXRoIGV4dGVybmFsIHNjb3BlOyBzdWNoCi0gICByZWR1Y3Rpb25zIG1ha2UgbGlmZSBhIGxpdmluZyBoZWxsIGZvciBvYmplY3QgZmlsZSBlZGl0b3JzLiAKLQotICAgRklYTUUuICBBbHNvIHJlamVjdCBSX0hQUEEgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIDMyYml0cyB3aWRlIGluCi0gICB0aGUgY29kZSBzcGFjZS4gIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBrbm93IGhvdyB0byBwdWxsIHRoZQotICAgcmlnaHQgYml0cyBvdXQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLWhwcGFfZml4X2FkanVzdGFibGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4OwotCi0gIGhwcGFfZml4ID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gMzJiaXQgcmVsb2NzLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEEgJiYgaHBwYV9maXgtPmZ4X3JfZm9ybWF0ID09IDMyKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gc3ltMS1zeW0yIGV4cHJlc3Npb25zIHdoZW4KLSAgICAgdGhlIGZpeHVwIHdpbGwgb2NjdXIgaW4gYSBDT0RFIHN1YnNwYWNlLiAKLQotICAgICBYWFggRklYTUU6IExvbmcgdGVybSB3ZSBwcm9iYWJseSB3YW50IHRvIHJlamVjdCBhbGwgb2YgdGhlc2U7Ci0gICAgIGZvciBleGFtcGxlIHJlZHVjaW5nIGluIHRoZSBkZWJ1ZyBzZWN0aW9uIHdvdWxkIGxvc2UgaWYgd2UgZXZlcgotICAgICBzdXBwb3J0ZWQgdXNpbmcgdGhlIG9wdGltaXppbmcgaHAgbGlua2VyLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5Ci0gICAgICAmJiBmaXhwLT5meF9zdWJzeQotICAgICAgJiYgKGhwcGFfZml4LT5zZWdtZW50LT5mbGFncyAmIFNFQ19DT0RFKSkKLSAgICB7Ci0gICAgICAvKiBBcHBhcmVudGx5IHN5X3VzZWRfaW5fcmVsb2MgbmV2ZXIgZ2V0cyBzZXQgZm9yIHN1YiBzeW1ib2xzLiAgKi8KLSAgICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X3N1YnN5KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBhZGp1c3QgYW55IHJlbG9jcyB0aGF0IHVzZSBMUiUgYW5kIFJSJSBmaWVsZCBzZWxlY3RvcnMuCi0gICAgIFRoYXQgY29uZnVzZXMgdGhlIEhQIGxpbmtlci4gICovCi0gIGlmIChocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xyc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jyc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX25scnNlbCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gRExUIHJlbGF0aXZlIHJlbG9jcywKLSAgICAgcmVsb2NhdGlvbnMgd2l0aCBwbGFiZWxzLiAgKi8KLSAgaWYgKGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfdHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9sdHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9ydHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9wc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jwc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xwc2VsKQotICAgIHJldHVybiAwOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSAmJiBTX0lTX0VYVEVSTkFMIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogUmVqZWN0IGFic29sdXRlIGNhbGxzIChqdW1wcykuICAqLwotICBpZiAoaHBwYV9maXgtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQUJTX0NBTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogUmVqZWN0IHJlZHVjdGlvbnMgb2YgZnVuY3Rpb24gc3ltYm9scy4gICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAwIHx8ICEgU19JU19GVU5DVElPTiAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZml4dXAgaW4gRklYUCB3aWxsIHJlcXVpcmUgYSByZWxvY2F0aW9uLAotICAgZXZlbiBpdCBpZiBhcHBlYXJzIHRoYXQgdGhlIGZpeHVwIGNvdWxkIGJlIGNvbXBsZXRlbHkgaGFuZGxlZAotICAgd2l0aGluIEdBUy4gICovCi0KLWludAotaHBwYV9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICpocHBhX2ZpeHA7Ci0gIGludCBkaXN0YW5jZTsKLQotICBocHBhX2ZpeHAgPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKSBmaXhwLT50Y19maXhfZGF0YTsKLSNpZmRlZiBPQkpfU09NCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VOVFJZIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRVhJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9CRUdJTl9CUlRBQgotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfQlJUQUIKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fVFJZCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VORF9UUlkKLSAgICAgIHx8IChmaXhwLT5meF9hZGRzeSAhPSBOVUxMICYmIGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwKLQkgICYmIChocHBhX2ZpeHAtPnNlZ21lbnQtPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQotICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNkZWZpbmUgYXJnX3JlbG9jX3N0dWJfbmVlZGVkKENBTExFUiwgQ0FMTEVFKSBcCi0gICgoQ0FMTEVFKSAmJiAoQ0FMTEVSKSAmJiAoKENBTExFRSkgIT0gKENBTExFUikpKQotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBJdCBpcyBuZWNlc3NhcnkgdG8gZm9yY2UgUEMtcmVsYXRpdmUgY2FsbHMvanVtcHMgdG8gaGF2ZSBhIHJlbG9jYXRpb24KLSAgICAgZW50cnkgaWYgdGhleSdyZSBnb2luZyB0byBuZWVkIGVpdGhlciBhIGFyZ3VtZW50IHJlbG9jYXRpb24gb3IgbG9uZwotICAgICBjYWxsIHN0dWIuICBGSVhNRS4gIENhbid0IHdlIG5lZWQgdGhlIHNhbWUgZm9yIGFic29sdXRlIGNhbGxzPyAgKi8KLSAgaWYgKGZpeHAtPmZ4X3BjcmVsICYmIGZpeHAtPmZ4X2FkZHN5Ci0gICAgICAmJiAoYXJnX3JlbG9jX3N0dWJfbmVlZGVkICgobG9uZykgKChvYmpfc3ltYm9sX3R5cGUgKikKLQlzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYywKLQlocHBhX2ZpeHAtPmZ4X2FyZ19yZWxvYykpKQotICAgIHJldHVybiAxOwotI2VuZGlmCi0gIGRpc3RhbmNlID0gKGZpeHAtPmZ4X29mZnNldCArIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICAtIG1kX3BjcmVsX2Zyb20gKGZpeHApKTsKLSAgLyogTm93IGNoZWNrIGFuZCBzZWUgaWYgd2UncmUgZ29pbmcgdG8gbmVlZCBhIGxvbmctYnJhbmNoIHN0dWIuICAqLwotICBpZiAoZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9QQ1JFTF9DQUxMCi0gICAgICAmJiAoZGlzdGFuY2UgPiAyNjIxNDMgfHwgZGlzdGFuY2UgPCAtMjYyMTQ0KSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9BQlNfQ0FMTCkKLSAgICByZXR1cm4gMTsKLSN1bmRlZiBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQKLQotICAvKiBObyBuZWVkICh5ZXQpIHRvIGZvcmNlIGFub3RoZXIgcmVsb2NhdGlvbnMgdG8gYmUgZW1pdHRlZC4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBOb3cgZm9yIHNvbWUgRUxGIHNwZWNpZmljIGNvZGUuICBGSVhNRS4gICovCi0jaWZkZWYgT0JKX0VMRgotLyogTWFyayB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGNvbXB1dGUKLSAgIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbiBpbiBocHBhX2VsZl9maW5hbF9wcm9jZXNzaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uICgpCi17Ci0gIC8qIEVMRiBkb2VzIG5vdCBoYXZlIEVYSVQgcmVsb2NhdGlvbnMuICBBbGwgd2UgZG8gaXMgY3JlYXRlIGEKLSAgICAgdGVtcG9yYXJ5IHN5bWJvbCBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgY2hhciAqbmFtZSA9IChjaGFyICopCi0gICAgeG1hbGxvYyAoc3RybGVuICgiTCRcMDAxZW5kXyIpICsKLQkgICAgIHN0cmxlbiAoU19HRVRfTkFNRSAobGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCkpICsgMSk7Ci0KLSAgaWYgKG5hbWUpCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAgICAgc3RyY3B5IChuYW1lLCAiTCRcMDAxZW5kXyIpOwotICAgICAgc3RyY2F0IChuYW1lLCBTX0dFVF9OQU1FIChsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sKSk7Ci0KLSAgICAgIC8qIElmIHdlIGhhdmUgYSAuZXhpdCBmb2xsb3dlZCBieSBhIC5wcm9jZW5kLCB0aGVuIHRoZQotCSBzeW1ib2wgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBkZWZpbmVkLiAgKi8KLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gICAgICBpZiAoc3ltYm9sUCkKLQl7Ci0JICAvKiBUaGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCEgIFRoaXMgY2FuCi0JICAgICBoYXBwZW4gaWYgd2UgaGF2ZSBhIC5leGl0IGZvbGxvd2VkIGJ5IGEgLnByb2NlbmQuCi0KLQkgICAgIFRoaXMgaXMgKm5vdCogYW4gZXJyb3IuICBBbGwgd2Ugd2FudCB0byBkbyBpcyBmcmVlCi0JICAgICB0aGUgbWVtb3J5IHdlIGp1c3QgYWxsb2NhdGVkIGZvciB0aGUgbmFtZSBhbmQgY29udGludWUuICAqLwotCSAgeGZyZWUgKG5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzeW1ib2wgdmFsdWUgc2hvdWxkIGJlIHRoZSBvZmZzZXQgb2YgdGhlCi0JICAgICBsYXN0IGluc3RydWN0aW9uIG9mIHRoZSBmdW5jdGlvbiAqLwotCSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIG5vd19zZWcsICh2YWx1ZVQpIChmcmFnX25vd19maXggKCkgLSA0KSwKLQkJCQlmcmFnX25vdyk7Ci0KLQkgIGFzc2VydCAoc3ltYm9sUCk7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotCX0KLQotICAgICAgaWYgKHN5bWJvbFApCi0JbGFzdF9jYWxsX2luZm8tPmVuZF9zeW1ib2wgPSBzeW1ib2xQOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiU3ltYm9sICclcycgY291bGQgbm90IGJlIGNyZWF0ZWQuIiksIG5hbWUpOwotCi0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJObyBtZW1vcnkgZm9yIHN5bWJvbCBuYW1lLiIpKTsKLQotfQotCi0vKiBGb3IgRUxGLCB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBvbmUgcHVycG9zZTogIHRvIHNldHVwIHRoZSBzdF9zaXplCi0gICBmaWVsZCBvZiBTVFRfRlVOQyBzeW1ib2xzLiAgVG8gZG8gdGhpcywgd2UgbmVlZCB0byBzY2FuIHRoZQotICAgY2FsbF9pbmZvIHN0cnVjdHVyZSBsaXN0LCBkZXRlcm1pbmluZyBzdF9zaXplIGluIGJ5IHRha2luZyB0aGUKLSAgIGRpZmZlcmVuY2UgaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGJlZ2lubmluZy9lbmQgbWFya2VyIHN5bWJvbHMuICAqLwotCi12b2lkCi1lbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nICgpCi17Ci0gIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mb19wb2ludGVyOwotCi0gIGZvciAoY2FsbF9pbmZvX3BvaW50ZXIgPSBjYWxsX2luZm9fcm9vdDsKLSAgICAgICBjYWxsX2luZm9fcG9pbnRlcjsKLSAgICAgICBjYWxsX2luZm9fcG9pbnRlciA9IGNhbGxfaW5mb19wb2ludGVyLT5jaV9uZXh0KQotICAgIHsKLSAgICAgIGVsZl9zeW1ib2xfdHlwZSAqZXN5bQotCT0gKChlbGZfc3ltYm9sX3R5cGUgKikKLQkgICBzeW1ib2xfZ2V0X2JmZHN5bSAoY2FsbF9pbmZvX3BvaW50ZXItPnN0YXJ0X3N5bWJvbCkpOwotICAgICAgZXN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplID0KLQlTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPmVuZF9zeW1ib2wpCi0JLSBTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPnN0YXJ0X3N5bWJvbCkgKyA0OwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmggYi9nYXMvY29uZmlnL3RjLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlMTBkYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKiB0Yy1ocHBhLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBQQQotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0vKiBQbGVhc2UgcmVmcmFpbiBmcm9tIGV4cG9zaW5nIHRoZSB3b3JsZCB0byB0aGUgaW50ZXJuYWxzIG9mIHRjLWhwcGEuYwotICAgd2hlbiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIG1lYW5zIG9ubHkgZGVjbGFyaW5nIGV4cG9ydGVkIGZ1bmN0aW9ucywKLSAgIChwbGVhc2UgUEFSQU1pemUgdGhlbSEpIG5vdCBleHBvcnRpbmcgc3RydWN0dXJlcyBhbmQgZGF0YSBpdGVtcyB3aGljaAotICAgYXJlIHVzZWQgc29sZWx5IHdpdGhpbiB0Yy1ocHBhLmMsIGV0Yy4KLQotICAgQWxzbyByZWZyYWluIGZyb20gYWRkaW5nIGFueSBtb3JlIG9iamVjdCBmaWxlIGRlcGVuZGVudCBjb2RlLCB0aGVyZSBpcyAKLSAgIGFscmVhZHkgZmFyIHRvbyBtdWNoIG9iamVjdCBmaWxlIGZvcm1hdCBkZXBlbmRlbnQgY29kZSBpbiB0aGlzIGZpbGUuCi0gICBJbiB0aGVvcnkgdGhpcyBmaWxlIHNob3VsZCBjb250YWluIG9ubHkgZXhwb3J0ZWQgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzCi0gICBhbmQgZGF0YSBkZWNsYXJhdGlvbnMgY29tbW9uIHRvIGFsbCBQQSBhc3NlbWJsZXJzLiAgKi8KLQotI2lmbmRlZiBfVENfSFBQQV9ICi0jZGVmaW5lIF9UQ19IUFBBX0gKLQotI2lmbmRlZiBUQ19IUFBBCi0jZGVmaW5lIFRDX0hQUEEJMQotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2hwcGEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIEZJWE1FLiAgVGhlIGxhY2sgb2YgYSBwbGFjZSB0byBwdXQgdGhpbmdzIHdoaWNoIGFyZSBib3RoIHRhcmdldCBjcHUKLSAgIGFuZCB0YXJnZXQgZm9ybWF0IGRlcGVuZGVudCBtYWtlcyBoYWNrcyBsaWtlIHRoaXMgbmVjZXNzYXJ5LiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0jaWZkZWYgQkZENjQKLSNpbmNsdWRlICJiZmQvZWxmNjQtaHBwYS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGY2NC1ocHBhIgotI2Vsc2UKLSNpbmNsdWRlICJiZmQvZWxmMzItaHBwYS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1ocHBhIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLSNpbmNsdWRlICJiZmQvc29tLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInNvbSIKLSNlbmRpZgotCi0vKiBGSVhNRS4gIFdoeSBvaCB3aHkgYXJlbid0IHRoZXNlIGRlZmluZWQgc29tZXdoZXJlIGdsb2JhbGx5PyAgKi8KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAoMCkKLSNkZWZpbmUgVFJVRSAgICAoIUZBTFNFKQotI2VuZGlmCi0KLSNkZWZpbmUgQVNFQ19OVUxMIChhc2VjdGlvbiAqKTAKLQotLyogTGFiZWxzIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbG9uIGZvciBhIHN1ZmZpeC4gICovCi0jZGVmaW5lIExBQkVMU19XSVRIT1VUX0NPTE9OUwotCi0vKiBGSVhNRS4gIFRoaXMgc2hvdWxkIGJlIHN0YXRpYyBhbmQgZGVjbGFyZWQgaW4gdGMtaHBwYS5jLCBidXQgCi0gICBwYV9kZWZpbmVfbGFiZWwgZ2V0cyB1c2VkIG91dHNpZGUgb2YgdGMtaHBwYS5jIHZpYSB0Y19mcm9iX2xhYmVsLgotICAgU2hvdWxkIGFsc28gYmUgUEFSQU1pemVkLCBidXQgc3ltYm9sUyBpc24ndCBhdmFpbGFibGUgaGVyZS4gICovCi1leHRlcm4gdm9pZCBwYV9kZWZpbmVfbGFiZWwgKCk7Ci0KLS8qIEZJWE1FLiAgVHlwZXMgbm90IGF2YWlsYWJsZSBoZXJlLCBzbyB0aGV5IGNhbid0IGJlIFBBUkFNaXplZC4gICovCi1leHRlcm4gdm9pZCBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoKTsKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19ocHBhICgpOwotZXh0ZXJuIGludCBocHBhX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLS8qIFRoaXMgZ2V0cyBjYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlIHRvIG1ha2Ugc3VyZQotICAgdGhpbmdzIGxpa2UgZW50cnkvZXhpdCBhbmQgcHJvYy9wcm9jZW5kIHBhaXJzIG1hdGNoLiAgKi8KLWV4dGVybiB2b2lkIHBhX2NoZWNrX2VvZiBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIHRjX2Zyb2JfZmlsZSBwYV9jaGVja19lb2YKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgcGFfZGVmaW5lX2xhYmVsIChzeW0pCi0KLS8qIFRoZSBQQSBkb2VzIG5vdCBuZWVkIHN1cHBvcnQgZm9yIGVpdGhlciBvZiB0aGVzZS4gICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihoZWFkZXJzKSB7O30KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGhlYWRlcnMpIHs7fQotCi0jZGVmaW5lIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotI2RlZmluZSBNQVhfUkVMT0NfRVhQQU5TSU9OIDYKLQotLyogRklYTUUuICBNb3JlIHRoaW5ncyB3aGljaCBhcmUgYm90aCBIUFBBIGFuZCBFTEYgc3BlY2lmaWMuICBUaGVyZSBpcyAKLSAgIG5vd2hlcmUgdG8gcHV0IHN1Y2ggdGhpbmdzLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nCWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcKLXZvaWQgZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotLyogVGhlIFBBIG5lZWRzIHRvIHBhcnNlIGZpZWxkIHNlbGVjdG9ycyBpbiAuYnl0ZSwgZXRjLiAgKi8KLQotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIFwKLSAgcGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEgKEVYUCkKLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19ocHBhCi0KLS8qIE9uIHRoZSBQQSwgYW4gZXF1YWwgc2lnbiBvZnRlbiBhcHBlYXJzIGFzIGEgY29uZGl0aW9uIG9yIG51bGxpZmljYXRpb24KLSAgIGNvbXBsZXRlciBpbiBhbiBpbnN0cnVjdGlvbi4gIFRoaXMgY2FuIGJlIGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZQotICAgcHJldmlvdXMgY2hhcmFjdGVyLCBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgY29tbWEsIHRoZW4gdGhlIGVxdWFsIGlzCi0gICBiZWluZyB1c2VkIGFzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBUQ19FUVVBTF9JTl9JTlNOKEMsIFBUUikJKChDKSA9PSAnLCcpCi0KLS8qIFNpbWlsYXJseSBmb3IgYW4gZXhjbGFtYXRpb24gcG9pbnQuICBJdCBpcyB1c2VkIGluIEZQIGNvbXBhcmlzb24KLSAgIGluc3RydWN0aW9ucyBhbmQgYXMgYW4gZW5kIG9mIGxpbmUgbWFya2VyLiAgV2hlbiB1c2VkIGluIGFuIGluc3RydWN0aW9uCi0gICBpdCB3aWxsIGFsd2F5cyBmb2xsb3cgYSBjb21tYS4gICovCi0jZGVmaW5lIFRDX0VPTF9JTl9JTlNOKFBUUikJKCooUFRSKSA9PSAnIScgJiYgKFBUUilbLTFdID09ICcsJykKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZSBocHBhX2ZpeF9hZGp1c3RhYmxlCi0KLS8qIEJlY2F1c2Ugb2YgdGhlIHN0cmFuZ2UgUEEgY2FsbGluZyBjb252ZW50aW9ucywgaXQgaXMgc29tZXRpbWVzCi0gICBuZWNlc3NhcnkgdG8gZW1pdCBhIHJlbG9jYXRpb24gZm9yIGEgY2FsbCBldmVuIHRob3VnaCBpdCB3b3VsZAotICAgbm9ybWFsbHkgYXBwZWFyIHNhZmUgdG8gaGFuZGxlIGl0IGNvbXBsZXRlbHkgd2l0aGluIEdBUy4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgaHBwYV9mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotCi0jaWZkZWYgT0JKX1NPTQotLyogSWYgYSBzeW1ib2wgaXMgaW1wb3J0ZWQsIGJ1dCBuZXZlciB1c2VkLCB0aGVuIHRoZSBzeW1ib2wgc2hvdWxkCi0gICAqbm90KiBlbmQgdXAgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIExpa2V3aXNlIGZvciBhYnNvbHV0ZSBzeW1ib2xzCi0gICB3aXRoIGxvY2FsIHNjb3BlLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpIFwKLSAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAhIHN5bWJvbF91c2VkX3AgKHN5bSkpIFwKLQl8fCAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX2Fic19zZWN0aW9uIFwKLQkgICAgJiYgISBTX0lTX0VYVEVSTkFMIChzeW0pKSkgXAotICAgICAgcHVudCA9IDEKLQotLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIG1ha2UgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHRoZSBkaWZmZXJlbmNlIG9mCi0gICB0d28gc3ltYm9scy4gIFRoaXMgaW5jbHVkZXMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgd2hlbgotICAgb25lIG9mIHRoZW0gaXMgdW5kZWZpbmVkICh0aGlzIGNvbWVzIHVwIGluIFBJQyBjb2RlIGdlbmVyYXRpb24pLiAKLQotICAgV2UgZG9uJ3QgZGVmaW5lIERJRkZfRVhQUl9PSyBiZWNhdXNlIGl0IGRvZXMgdGhlIHdyb25nIHRoaW5nIGlmCi0gICB0aGUgYWRkIHN5bWJvbCBpcyB1bmRlZmluZWQgYW5kIHRoZSBzdWIgc3ltYm9sIGlzIGEgc3ltYm9sIGluCi0gICB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSByZWxvY2F0aW9uLiAgV2UgYWxzbyBuZWVkIHNvbWUgd2F5IHRvCi0gICBzcGVjaWFsaXplIHNvbWUgY29kZSBpbiBhZGp1c3RfcmVsb2Nfc3ltcy4gICovCi0jZGVmaW5lIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpIFwKLSAgeyBcCi0gICAgaWYgKChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfdW5kX3NlY3Rpb24gJiYgISBzeW1ib2xfdXNlZF9wIChzeW0pKSBcCi0JfHwgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF9hYnNfc2VjdGlvbiBcCi0JICAgICYmICEgU19JU19FWFRFUk5BTCAoc3ltKSkgXAotCXx8IHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltKSwgIiRnbG9iYWwkIikgPT0gMCkgXAotICAgICAgcHVudCA9IDE7IFwKLSAgfQotI2VuZGlmCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jZGVmaW5lIFRDX0ZJWF9UWVBFIFBUUgotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKEZJWFApICgoRklYUCktPnRjX2ZpeF9kYXRhID0gTlVMTCkKLQotI2VuZGlmIC8qIF9UQ19IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTM4Ni5jIGIvZ2FzL2NvbmZpZy90Yy1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmM1ZmQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkxICswLDAgQEAKLS8qIGkzODYuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgSW50ZWwgODAzODYKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gIEludGVsIDgwMzg2IG1hY2hpbmUgc3BlY2lmaWMgZ2FzLgotICBXcml0dGVuIGJ5IEVsaW90IERyZXNzZWxoYXVzIChlbGlvdEBtZ20ubWl0LmVkdSkuCi0gIEJ1Z3MgJiBzdWdnZXN0aW9ucyBhcmUgY29tcGxldGVseSB3ZWxjb21lLiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLgotICBQbGVhc2UgaGVscCB1cyBtYWtlIGl0IGJldHRlci4KLSAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvcGNvZGUvaTM4Ni5oIgotCi0jaWZuZGVmIFRDX1JFTE9DCi0jZGVmaW5lIFRDX1JFTE9DKFgsWSkgKFkpCi0jZW5kaWYKLQotI2lmbmRlZiBSRUdJU1RFUl9XQVJOSU5HUwotI2RlZmluZSBSRUdJU1RFUl9XQVJOSU5HUyAxCi0jZW5kaWYKLQotI2lmbmRlZiBTQ0FMRTFfV0hFTl9OT19JTkRFWAotLyogU3BlY2lmeWluZyBhIHNjYWxlIGZhY3RvciBiZXNpZGVzIDEgd2hlbiB0aGVyZSBpcyBubyBpbmRleCBpcwotICAgZnV0aWxlLiAgZWcuIGBtb3YgKCVlYngsMiksJWFsJyBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMKLSAgIGBtb3YgKCVlYngpLCVhbCcuICBUbyBzbGF2aXNobHkgZm9sbG93IHdoYXQgdGhlIHByb2dyYW1tZXIKLSAgIHNwZWNpZmllZCwgc2V0IFNDQUxFMV9XSEVOX05PX0lOREVYIHRvIDAuICAqLwotI2RlZmluZSBTQ0FMRTFfV0hFTl9OT19JTkRFWCAxCi0jZW5kaWYKLQotI2RlZmluZSB0cnVlIDEKLSNkZWZpbmUgZmFsc2UgMAotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1vZGVfZnJvbV9kaXNwX3NpemUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IGZpdHNfaW5fc2lnbmVkX2J5dGUgUEFSQU1TICgobG9uZykpOwotc3RhdGljIGludCBmaXRzX2luX3Vuc2lnbmVkX2J5dGUgUEFSQU1TICgobG9uZykpOwotc3RhdGljIGludCBmaXRzX2luX3Vuc2lnbmVkX3dvcmQgUEFSQU1TICgobG9uZykpOwotc3RhdGljIGludCBmaXRzX2luX3NpZ25lZF93b3JkIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgc21hbGxlc3RfaW1tX3R5cGUgUEFSQU1TICgobG9uZykpOwotc3RhdGljIGludCBhZGRfcHJlZml4IFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgc2V0XzE2Yml0X2NvZGVfZmxhZyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF9pbnRlbF9zeW50YXggUEFSQU1TICgoaW50KSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jCi0gIFBBUkFNUyAoKGludCwgaW50LCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLSNlbmRpZgotCi0vKiAnbWRfYXNzZW1ibGUgKCknIGdhdGhlcnMgdG9nZXRoZXIgaW5mb3JtYXRpb24gYW5kIHB1dHMgaXQgaW50byBhCi0gICBpMzg2X2luc24uICovCi0KLXN0cnVjdCBfaTM4Nl9pbnNuCi0gIHsKLSAgICAvKiBUTSBob2xkcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBpbnNuIHdlcmUgY3VycmVudGx5IGFzc2VtYmxpbmcuICovCi0gICAgdGVtcGxhdGUgdG07Ci0KLSAgICAvKiBTVUZGSVggaG9sZHMgdGhlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBpZiBnaXZlbi4KLSAgICAgICAoZS5nLiAnbCcgZm9yICdtb3ZsJykgICovCi0gICAgY2hhciBzdWZmaXg7Ci0KLSAgICAvKiBPcGVyYW5kcyBhcmUgY29kZWQgd2l0aCBPUEVSQU5EUywgVFlQRVMsIERJU1BTLCBJTU1TLCBhbmQgUkVHUy4gKi8KLQotICAgIC8qIE9QRVJBTkRTIGdpdmVzIHRoZSBudW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMuICovCi0gICAgdW5zaWduZWQgaW50IG9wZXJhbmRzOwotCi0gICAgLyogUkVHX09QRVJBTkRTLCBESVNQX09QRVJBTkRTLCBNRU1fT1BFUkFORFMsIElNTV9PUEVSQU5EUyBnaXZlIHRoZSBudW1iZXIKLSAgICAgICBvZiBnaXZlbiByZWdpc3RlciwgZGlzcGxhY2VtZW50LCBtZW1vcnkgb3BlcmFuZHMgYW5kIGltbWVkaWF0ZQotICAgICAgIG9wZXJhbmRzLiAqLwotICAgIHVuc2lnbmVkIGludCByZWdfb3BlcmFuZHMsIGRpc3Bfb3BlcmFuZHMsIG1lbV9vcGVyYW5kcywgaW1tX29wZXJhbmRzOwotCi0gICAgLyogVFlQRVMgW2ldIGlzIHRoZSB0eXBlIChzZWUgYWJvdmUgI2RlZmluZXMpIHdoaWNoIHRlbGxzIHVzIGhvdyB0bwotICAgICAgIHNlYXJjaCB0aHJvdWdoIERJU1BTIFtpXSAmIElNTVMgW2ldICYgUkVHUyBbaV0gZm9yIHRoZSByZXF1aXJlZAotICAgICAgIG9wZXJhbmQuICAqLwotICAgIHVuc2lnbmVkIGludCB0eXBlc1tNQVhfT1BFUkFORFNdOwotCi0gICAgLyogRGlzcGxhY2VtZW50cyAoaWYgZ2l2ZW4pIGZvciBlYWNoIG9wZXJhbmQuICovCi0gICAgZXhwcmVzc2lvblMgKmRpc3BzW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBSZWxvY2F0aW9uIHR5cGUgZm9yIG9wZXJhbmQgKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGRpc3BfcmVsb2NbTUFYX09QRVJBTkRTXTsKLSNlbHNlCi0gICAgaW50IGRpc3BfcmVsb2NbTUFYX09QRVJBTkRTXTsKLSNlbmRpZgotCi0gICAgLyogSW1tZWRpYXRlIG9wZXJhbmRzIChpZiBnaXZlbikgZm9yIGVhY2ggb3BlcmFuZC4gKi8KLSAgICBleHByZXNzaW9uUyAqaW1tc1tNQVhfT1BFUkFORFNdOwotCi0gICAgLyogUmVnaXN0ZXIgb3BlcmFuZHMgKGlmIGdpdmVuKSBmb3IgZWFjaCBvcGVyYW5kLiAqLwotICAgIGNvbnN0IHJlZ19lbnRyeSAqcmVnc1tNQVhfT1BFUkFORFNdOwotCi0gICAgLyogQkFTRV9SRUcsIElOREVYX1JFRywgYW5kIExPRzJfU0NBTEVfRkFDVE9SIGFyZSB1c2VkIHRvIGVuY29kZQotICAgICAgIHRoZSBiYXNlIGluZGV4IGJ5dGUgYmVsb3cuICAqLwotICAgIGNvbnN0IHJlZ19lbnRyeSAqYmFzZV9yZWc7Ci0gICAgY29uc3QgcmVnX2VudHJ5ICppbmRleF9yZWc7Ci0gICAgdW5zaWduZWQgaW50IGxvZzJfc2NhbGVfZmFjdG9yOwotCi0gICAgLyogU0VHIGdpdmVzIHRoZSBzZWdfZW50cmllcyBvZiB0aGlzIGluc24uICBUaGV5IGFyZSB6ZXJvIHVubGVzcwotICAgICAgIGV4cGxpY2l0IHNlZ21lbnQgb3ZlcnJpZGVzIGFyZSBnaXZlbi4gKi8KLSAgICBjb25zdCBzZWdfZW50cnkgKnNlZ1syXTsJLyogc2VnbWVudHMgZm9yIG1lbW9yeSBvcGVyYW5kcyAoaWYgZ2l2ZW4pICovCi0KLSAgICAvKiBQUkVGSVggaG9sZHMgYWxsIHRoZSBnaXZlbiBwcmVmaXggb3Bjb2RlcyAodXN1YWxseSBudWxsKS4KLSAgICAgICBQUkVGSVhFUyBpcyB0aGUgbnVtYmVyIG9mIHByZWZpeCBvcGNvZGVzLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgcHJlZml4ZXM7Ci0gICAgdW5zaWduZWQgY2hhciBwcmVmaXhbTUFYX1BSRUZJWEVTXTsKLQotICAgIC8qIFJNIGFuZCBTSUIgYXJlIHRoZSBtb2RybSBieXRlIGFuZCB0aGUgc2liIGJ5dGUgd2hlcmUgdGhlCi0gICAgICAgYWRkcmVzc2luZyBtb2RlcyBvZiB0aGlzIGluc24gYXJlIGVuY29kZWQuICAqLwotCi0gICAgbW9kcm1fYnl0ZSBybTsKLSAgICBzaWJfYnl0ZSBzaWI7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IF9pMzg2X2luc24gaTM4Nl9pbnNuOwotCi0vKiBMaXN0IG9mIGNoYXJzIGJlc2lkZXMgdGhvc2UgaW4gYXBwLmM6c3ltYm9sX2NoYXJzIHRoYXQgY2FuIHN0YXJ0IGFuCi0gICBvcGVyYW5kLiAgVXNlZCB0byBwcmV2ZW50IHRoZSBzY3J1YmJlciBlYXRpbmcgdml0YWwgd2hpdGUtc3BhY2UuICAqLwotI2lmZGVmIExFWF9BVAotY29uc3QgY2hhciBleHRyYV9zeW1ib2xfY2hhcnNbXSA9ICIqJS0oQCI7Ci0jZWxzZQotY29uc3QgY2hhciBleHRyYV9zeW1ib2xfY2hhcnNbXSA9ICIqJS0oIjsKLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotI2lmIGRlZmluZWQgKFRFX0kzODZBSVgpIHx8ICgoZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikpICYmICEgZGVmaW5lZCAoVEVfTElOVVgpKQotLyogUHV0dGluZyAnLycgaGVyZSBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgZGl2aWRlIG9wZXJhdG9yLgotICAgSG93ZXZlciwgd2UgbmVlZCBpdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNWUjQgc3lzdGVtcy4gICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Ci0jZGVmaW5lIFBSRUZJWF9TRVBBUkFUT1IgJ1xcJwotI2Vsc2UKLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotI2RlZmluZSBQUkVGSVhfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yayBpZgotICAgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAgKi8KLSNpZiBkZWZpbmVkIChURV9JMzg2QUlYKSB8fCAoKGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpKSAmJiAhIGRlZmluZWQgKFRFX0xJTlVYKSkKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIjsKLSNlbHNlCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIi8iOwotI2VuZGlmCi0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkZkRHhYIjsKLQotLyogdGFibGVzIGZvciBsZXhpY2FsIGFuYWx5c2lzICovCi1zdGF0aWMgY2hhciBtbmVtb25pY19jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgcmVnaXN0ZXJfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIG9wZXJhbmRfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIGlkZW50aWZpZXJfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIGRpZ2l0X2NoYXJzWzI1Nl07Ci0KLS8qIGxleGljYWwgbWFjcm9zICovCi0jZGVmaW5lIGlzX21uZW1vbmljX2NoYXIoeCkgKG1uZW1vbmljX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfb3BlcmFuZF9jaGFyKHgpIChvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfcmVnaXN0ZXJfY2hhcih4KSAocmVnaXN0ZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19zcGFjZV9jaGFyKHgpICgoeCkgPT0gJyAnKQotI2RlZmluZSBpc19pZGVudGlmaWVyX2NoYXIoeCkgKGlkZW50aWZpZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19kaWdpdF9jaGFyKHgpIChkaWdpdF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0KLS8qIHB1dCBoZXJlIGFsbCBub24tZGlnaXQgbm9uLWxldHRlciBjaGFyY3RlcnMgdGhhdCBtYXkgb2NjdXIgaW4gYW4gb3BlcmFuZCAqLwotc3RhdGljIGNoYXIgb3BlcmFuZF9zcGVjaWFsX2NoYXJzW10gPSAiJSQtKygsKSouX34vPD58Jl4hOltAXSI7Ci0KLS8qIG1kX2Fzc2VtYmxlKCkgYWx3YXlzIGxlYXZlcyB0aGUgc3RyaW5ncyBpdCdzIHBhc3NlZCB1bmFsdGVyZWQuICBUbwotICAgZWZmZWN0IHRoaXMgd2UgbWFpbnRhaW4gYSBzdGFjayBvZiBzYXZlZCBjaGFyYWN0ZXJzIHRoYXQgd2UndmUgc21hc2hlZAotICAgd2l0aCAnXDAncyAoaW5kaWNhdGluZyBlbmQgb2Ygc3RyaW5ncyBmb3IgdmFyaW91cyBzdWItZmllbGRzIG9mIHRoZQotICAgYXNzZW1ibGVyIGluc3RydWN0aW9uKS4gKi8KLXN0YXRpYyBjaGFyIHNhdmVfc3RhY2tbMzJdOwotc3RhdGljIGNoYXIgKnNhdmVfc3RhY2tfcDsJLyogc3RhY2sgcG9pbnRlciAqLwotI2RlZmluZSBFTkRfU1RSSU5HX0FORF9TQVZFKHMpIFwKLQlkbyB7ICpzYXZlX3N0YWNrX3ArKyA9ICoocyk7ICoocykgPSAnXDAnOyB9IHdoaWxlICgwKQotI2RlZmluZSBSRVNUT1JFX0VORF9TVFJJTkcocykgXAotCWRvIHsgKihzKSA9ICotLXNhdmVfc3RhY2tfcDsgfSB3aGlsZSAoMCkKLQotLyogVGhlIGluc3RydWN0aW9uIHdlJ3JlIGFzc2VtYmxpbmcuICovCi1zdGF0aWMgaTM4Nl9pbnNuIGk7Ci0KLS8qIFBvc3NpYmxlIHRlbXBsYXRlcyBmb3IgY3VycmVudCBpbnNuLiAgKi8KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZXMgKmN1cnJlbnRfdGVtcGxhdGVzOwotCi0vKiBQZXIgaW5zdHJ1Y3Rpb24gZXhwcmVzc2lvblMgYnVmZmVyczogMiBkaXNwbGFjZW1lbnRzICYgMiBpbW1lZGlhdGUgbWF4LiAqLwotc3RhdGljIGV4cHJlc3Npb25TIGRpc3BfZXhwcmVzc2lvbnNbMl0sIGltX2V4cHJlc3Npb25zWzJdOwotCi1zdGF0aWMgaW50IHRoaXNfb3BlcmFuZDsJLyogY3VycmVudCBvcGVyYW5kIHdlIGFyZSB3b3JraW5nIG9uICovCi0KLXN0YXRpYyBpbnQgZmxhZ19kb19sb25nX2p1bXA7CS8qIEZJWE1FIHdoYXQgZG9lcyB0aGlzIGRvPyAqLwotCi1zdGF0aWMgaW50IGZsYWdfMTZiaXRfY29kZTsJLyogMSBpZiB3ZSdyZSB3cml0aW5nIDE2LWJpdCBjb2RlLCAwIGlmIDMyLWJpdCAqLwotCi1zdGF0aWMgaW50IGludGVsX3N5bnRheCA9IDA7CS8qIDEgZm9yIGludGVsIHN5bnRheCwgMCBpZiBhdHQgc3ludGF4ICovCi0KLXN0YXRpYyBpbnQgYWxsb3dfbmFrZWRfcmVnID0gMDsgIC8qIDEgaWYgcmVnaXN0ZXIgcHJlZml4ICUgbm90IHJlcXVpcmVkICovCi0KLS8qIEludGVyZmFjZSB0byByZWxheF9zZWdtZW50LgotICAgVGhlcmUgYXJlIDIgcmVsYXggc3RhdGVzIGZvciAzODYganVtcCBpbnNuczogb25lIGZvciBjb25kaXRpb25hbCAmCi0gICBvbmUgZm9yIHVuY29uZGl0aW9uYWwganVtcHMuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHRoZXNlIHR3byB0eXBlcwotICAgb2YganVtcHMgYWRkIGRpZmZlcmVudCBzaXplcyB0byBmcmFncyB3aGVuIHdlJ3JlIGZpZ3VyaW5nIG91dCB3aGF0Ci0gICBzb3J0IG9mIGp1bXAgdG8gY2hvb3NlIHRvIHJlYWNoIGEgZ2l2ZW4gbGFiZWwuICAqLwotCi0vKiB0eXBlcyAqLwotI2RlZmluZSBDT05EX0pVTVAgMQkJLyogY29uZGl0aW9uYWwganVtcCAqLwotI2RlZmluZSBVTkNPTkRfSlVNUCAyCQkvKiB1bmNvbmRpdGlvbmFsIGp1bXAgKi8KLS8qIHNpemVzICovCi0jZGVmaW5lIENPREUxNgkxCi0jZGVmaW5lIFNNQUxMCTAKLSNkZWZpbmUgU01BTEwxNiAoU01BTEx8Q09ERTE2KQotI2RlZmluZSBCSUcJMgotI2RlZmluZSBCSUcxNgkoQklHfENPREUxNikKLQotI2lmbmRlZiBJTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEVOQ09ERV9SRUxBWF9TVEFURSh0eXBlLHNpemUpIFwKLSAgKChyZWxheF9zdWJzdGF0ZVQpKCh0eXBlPDwyKSB8IChzaXplKSkpCi0jZGVmaW5lIFNJWkVfRlJPTV9SRUxBWF9TVEFURShzKSBcCi0gICAgKCAoKChzKSAmIDB4MykgPT0gQklHID8gNCA6ICgoKHMpICYgMHgzKSA9PSBCSUcxNiA/IDIgOiAxKSkgKQotCi0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgYnkgcmVsYXhfZnJhZyB0byBwcm9tb3RlIHNob3J0IGp1bXBzIHRvIGxvbmcKLSAgIG9uZXMgd2hlcmUgbmVjZXNzYXJ5LiAgU01BTEwgKHNob3J0KSBqdW1wcyBtYXkgYmUgcHJvbW90ZWQgdG8gQklHCi0gICAoMzIgYml0IGxvbmcpIG9uZXMsIGFuZCBTTUFMTDE2IGp1bXBzIHRvIEJJRzE2ICgxNiBiaXQgbG9uZykuICBXZQotICAgZG9uJ3QgYWxsb3cgYSBzaG9ydCBqdW1wIGluIGEgMzIgYml0IGNvZGUgc2VnbWVudCB0byBiZSBwcm9tb3RlZCB0bwotICAgYSAxNiBiaXQgb2Zmc2V0IGp1bXAgYmVjYXVzZSBpdCdzIHNsb3dlciAocmVxdWlyZXMgZGF0YSBzaXplCi0gICBwcmVmaXgpLCBhbmQgZG9lc24ndCB3b3JrLCB1bmxlc3MgdGhlIGRlc3RpbmF0aW9uIGlzIGluIHRoZSBib3R0b20KLSAgIDY0ayBvZiB0aGUgY29kZSBzZWdtZW50IChUaGUgdG9wIDE2IGJpdHMgb2YgZWlwIGFyZSB6ZXJvZWQpLiAgKi8KLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0vKiBUaGUgZmllbGRzIGFyZToKLSAgIDEpIG1vc3QgcG9zaXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgIDIpIG1vc3QgbmVnYXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgIDMpIGhvdyBtYW55IGJ5dGVzIHRoaXMgbW9kZSB3aWxsIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBmcmFnCi0gICA0KSB3aGljaCBpbmRleCBpbnRvIHRoZSB0YWJsZSB0byB0cnkgaWYgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBvbmUuCi0gICAqLwotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHKX0sCi0gIHsxMjcgKyAxLCAtMTI4ICsgMSwgMCwgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIEJJRzE2KX0sCi0gIC8qIGR3b3JkIGNvbmRpdGlvbmFscyBhZGRzIDQgYnl0ZXMgdG8gZnJhZzoKLSAgICAgMSBleHRyYSBvcGNvZGUgYnl0ZSwgMyBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZXMuICAqLwotICB7MCwgMCwgNCwgMH0sCi0gIC8qIHdvcmQgY29uZGl0aW9uYWxzIGFkZCAyIGJ5dGVzIHRvIGZyYWc6Ci0gICAgIDEgZXh0cmEgb3Bjb2RlIGJ5dGUsIDEgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGUuICAqLwotICB7MCwgMCwgMiwgMH0sCi0KLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcpfSwKLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcxNil9LAotICAvKiBkd29yZCBqbXAgYWRkcyAzIGJ5dGVzIHRvIGZyYWc6Ci0gICAgIDAgZXh0cmEgb3Bjb2RlIGJ5dGVzLCAzIGV4dHJhIGRpc3BsYWNlbWVudCBieXRlcy4gICovCi0gIHswLCAwLCAzLCAwfSwKLSAgLyogd29yZCBqbXAgYWRkcyAxIGJ5dGUgdG8gZnJhZzoKLSAgICAgMCBleHRyYSBvcGNvZGUgYnl0ZXMsIDEgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGUuICAqLwotICB7MCwgMCwgMSwgMH0KLQotfTsKLQotCi12b2lkCi1pMzg2X2FsaWduX2NvZGUgKGZyYWdQLCBjb3VudCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIC8qIFZhcmlvdXMgZWZmaWNpZW50IG5vLW9wIHBhdHRlcm5zIGZvciBhbGlnbmluZyBjb2RlIGxhYmVscy4gICovCi0gIC8qIE5vdGU6IERvbid0IHRyeSB0byBhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBjb21tZW50cy4gKi8KLSAgLyogICAgICAgMEwgYW5kIDB3IGFyZSBub3QgbGVnYWwgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzFbXSA9Ci0gICAgezB4OTB9OwkJCQkJLyogbm9wCQkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzJbXSA9Ci0gICAgezB4ODksMHhmNn07CQkJCS8qIG1vdmwgJWVzaSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8zW10gPQotICAgIHsweDhkLDB4NzYsMHgwMH07CQkJCS8qIGxlYWwgMCglZXNpKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl80W10gPQotICAgIHsweDhkLDB4NzQsMHgyNiwweDAwfTsJCQkvKiBsZWFsIDAoJWVzaSwxKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl81W10gPQotICAgIHsweDkwLAkJCQkJLyogbm9wCQkJKi8KLSAgICAgMHg4ZCwweDc0LDB4MjYsMHgwMH07CQkJLyogbGVhbCAwKCVlc2ksMSksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfNltdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkJLyogbGVhbCAwTCglZXNpKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl83W10gPQotICAgIHsweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzhbXSA9Ci0gICAgezB4OTAsCQkJCQkvKiBub3AJCQkqLwotICAgICAweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzlbXSA9Ci0gICAgezB4ODksMHhmNiwJCQkJCS8qIG1vdmwgJWVzaSwlZXNpCSovCi0gICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTBbXSA9Ci0gICAgezB4OGQsMHg3NiwweDAwLAkJCQkvKiBsZWFsIDAoJWVzaSksJWVzaQkqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzExW10gPQotICAgIHsweDhkLDB4NzQsMHgyNiwweDAwLAkJCS8qIGxlYWwgMCglZXNpLDEpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xMltdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJmLDB4MDAsMHgwMCwweDAwLDB4MDB9OwkJLyogbGVhbCAwTCglZWRpKSwlZWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xM1tdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xNFtdID0KLSAgICB7MHg4ZCwweGI0LDB4MjYsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xNVtdID0KLSAgICB7MHhlYiwweDBkLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwJLyogam1wIC4rMTU7IGxvdHNhIG5vcHMJKi8KLSAgICAgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwfTsKLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzRbXSA9Ci0gICAgezB4OGQsMHhiNCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglc2kpLCVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMTZfNVtdID0KLSAgICB7MHg5MCwJCQkJCS8qIG5vcAkJCSovCi0gICAgIDB4OGQsMHhiNCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglc2kpLCVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMTZfNltdID0KLSAgICB7MHg4OSwweGY2LAkJCQkJLyogbW92ICVzaSwlc2kJCSovCi0gICAgIDB4OGQsMHhiZCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglZGkpLCVkaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMTZfN1tdID0KLSAgICB7MHg4ZCwweDc0LDB4MDAsCQkJCS8qIGxlYSAwKCVzaSksJXNpCSovCi0gICAgIDB4OGQsMHhiZCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglZGkpLCVkaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMTZfOFtdID0KLSAgICB7MHg4ZCwweGI0LDB4MDAsMHgwMCwJCQkvKiBsZWEgMHcoJXNpKSwlc2kJKi8KLSAgICAgMHg4ZCwweGJkLDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVkaSksJWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmMzJfcGF0dFtdID0gewotICAgIGYzMl8xLCBmMzJfMiwgZjMyXzMsIGYzMl80LCBmMzJfNSwgZjMyXzYsIGYzMl83LCBmMzJfOCwKLSAgICBmMzJfOSwgZjMyXzEwLCBmMzJfMTEsIGYzMl8xMiwgZjMyXzEzLCBmMzJfMTQsIGYzMl8xNQotICB9OwotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZjE2X3BhdHRbXSA9IHsKLSAgICBmMzJfMSwgZjMyXzIsIGYzMl8zLCBmMTZfNCwgZjE2XzUsIGYxNl82LCBmMTZfNywgZjE2XzgsCi0gICAgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1Ci0gIH07Ci0KLSAgaWYgKGNvdW50ID4gMCAmJiBjb3VudCA8PSAxNSkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ18xNmJpdF9jb2RlKQotCXsKLQkgIG1lbWNweShmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsCi0JCSBmMTZfcGF0dFtjb3VudCAtIDFdLCBjb3VudCk7Ci0JICBpZiAoY291bnQgPiA4KSAvKiBhZGp1c3QganVtcCBvZmZzZXQgKi8KLQkgICAgZnJhZ1AtPmZyX2xpdGVyYWxbZnJhZ1AtPmZyX2ZpeCArIDFdID0gY291bnQgLSAyOwotCX0KLSAgICAgIGVsc2UKLQltZW1jcHkoZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LAotCSAgICAgICBmMzJfcGF0dFtjb3VudCAtIDFdLCBjb3VudCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gY291bnQ7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqb3V0cHV0X2ludmFsaWQgUEFSQU1TICgoaW50IGMpKTsKLXN0YXRpYyBpbnQgaTM4Nl9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKm9wZXJhbmRfc3RyaW5nKSk7Ci1zdGF0aWMgaW50IGkzODZfaW50ZWxfb3BlcmFuZCBQQVJBTVMgKChjaGFyICpvcGVyYW5kX3N0cmluZywgaW50IGdvdF9hX2Zsb2F0KSk7Ci1zdGF0aWMgY29uc3QgcmVnX2VudHJ5ICpwYXJzZV9yZWdpc3RlciBQQVJBTVMgKChjaGFyICpyZWdfc3RyaW5nLAotCQkJCQkJY2hhciAqKmVuZF9vcCkpOwotCi0jaWZuZGVmIEkzODZDT0ZGCi1zdGF0aWMgdm9pZCBzX2JzcyBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi1zeW1ib2xTICpHT1Rfc3ltYm9sOwkJLyogUHJlLWRlZmluZWQgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIgKi8KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLW1vZGVfZnJvbV9kaXNwX3NpemUgKHQpCi0gICAgIHVuc2lnbmVkIGludCB0OwotewotICByZXR1cm4gKHQgJiBEaXNwOCkgPyAxIDogKHQgJiAoRGlzcDE2fERpc3AzMikpID8gMiA6IDA7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgaW50Ci1maXRzX2luX3NpZ25lZF9ieXRlIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotICByZXR1cm4gKG51bSA+PSAtMTI4KSAmJiAobnVtIDw9IDEyNyk7Ci19CQkJCS8qIGZpdHNfaW5fc2lnbmVkX2J5dGUoKSAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl91bnNpZ25lZF9ieXRlIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotICByZXR1cm4gKG51bSAmIDB4ZmYpID09IG51bTsKLX0JCQkJLyogZml0c19pbl91bnNpZ25lZF9ieXRlKCkgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWZpdHNfaW5fdW5zaWduZWRfd29yZCAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSAgcmV0dXJuIChudW0gJiAweGZmZmYpID09IG51bTsKLX0JCQkJLyogZml0c19pbl91bnNpZ25lZF93b3JkKCkgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWZpdHNfaW5fc2lnbmVkX3dvcmQgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAoLTMyNzY4IDw9IG51bSkgJiYgKG51bSA8PSAzMjc2Nyk7Ci19CQkJCS8qIGZpdHNfaW5fc2lnbmVkX3dvcmQoKSAqLwotCi1zdGF0aWMgaW50Ci1zbWFsbGVzdF9pbW1fdHlwZSAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSNpZiAwCi0gIC8qIFRoaXMgY29kZSBpcyBkaXNhYmxlZCBiZWNhdXNlIGFsbCB0aGUgSW1tMSBmb3JtcyBpbiB0aGUgb3Bjb2RlIHRhYmxlCi0gICAgIGFyZSBzbG93ZXIgb24gdGhlIGk0ODYsIGFuZCB0aGV5J3JlIHRoZSB2ZXJzaW9ucyB3aXRoIHRoZSBpbXBsaWNpdGx5Ci0gICAgIHNwZWNpZmllZCBzaW5nbGUtcG9zaXRpb24gZGlzcGxhY2VtZW50LCB3aGljaCBoYXMgYW5vdGhlciBzeW50YXggaWYKLSAgICAgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGF0IGZvcm0uICBJZiB5b3UgcmVhbGx5IHByZWZlciB0byBoYXZlIHRoZQotICAgICBvbmUtYnl0ZS1zaG9ydGVyIEltbTEgZm9ybSBkZXNwaXRlIHRoZXNlIHByb2JsZW1zLCByZS1lbmFibGUgdGhpcwotICAgICBjb2RlLiAgKi8KLSAgaWYgKG51bSA9PSAxKQotICAgIHJldHVybiBJbW0xIHwgSW1tOCB8IEltbThTIHwgSW1tMTYgfCBJbW0zMjsKLSNlbmRpZgotICByZXR1cm4gKGZpdHNfaW5fc2lnbmVkX2J5dGUgKG51bSkKLQkgID8gKEltbThTIHwgSW1tOCB8IEltbTE2IHwgSW1tMzIpCi0JICA6IGZpdHNfaW5fdW5zaWduZWRfYnl0ZSAobnVtKQotCSAgPyAoSW1tOCB8IEltbTE2IHwgSW1tMzIpCi0JICA6IChmaXRzX2luX3NpZ25lZF93b3JkIChudW0pIHx8IGZpdHNfaW5fdW5zaWduZWRfd29yZCAobnVtKSkKLQkgID8gKEltbTE2IHwgSW1tMzIpCi0JICA6IChJbW0zMikpOwotfQkJCQkvKiBzbWFsbGVzdF9pbW1fdHlwZSgpICovCi0KLS8qIFJldHVybnMgMCBpZiBhdHRlbXB0aW5nIHRvIGFkZCBhIHByZWZpeCB3aGVyZSBvbmUgZnJvbSB0aGUgc2FtZQotICAgY2xhc3MgYWxyZWFkeSBleGlzdHMsIDEgaWYgbm9uIHJlcC9yZXBuZSBhZGRlZCwgMiBpZiByZXAvcmVwbmUKLSAgIGFkZGVkLiAgKi8KLXN0YXRpYyBpbnQKLWFkZF9wcmVmaXggKHByZWZpeCkKLSAgICAgdW5zaWduZWQgaW50IHByZWZpeDsKLXsKLSAgaW50IHJldCA9IDE7Ci0gIGludCBxOwotCi0gIHN3aXRjaCAocHJlZml4KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIENTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBEU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgRVNfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIEZTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBHU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgU1NfUFJFRklYX09QQ09ERToKLSAgICAgIHEgPSBTRUdfUFJFRklYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFUE5FX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBSRVBFX1BSRUZJWF9PUENPREU6Ci0gICAgICByZXQgPSAyOwotICAgICAgLyogZmFsbCB0aHJ1ICovCi0gICAgY2FzZSBMT0NLX1BSRUZJWF9PUENPREU6Ci0gICAgICBxID0gTE9DS1JFUF9QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRldBSVRfT1BDT0RFOgotICAgICAgcSA9IFdBSVRfUFJFRklYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFERFJfUFJFRklYX09QQ09ERToKLSAgICAgIHEgPSBBRERSX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEQVRBX1BSRUZJWF9PUENPREU6Ci0gICAgICBxID0gREFUQV9QUkVGSVg7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGkucHJlZml4W3FdKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic2FtZSB0eXBlIG9mIHByZWZpeCB1c2VkIHR3aWNlIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGkucHJlZml4ZXMgKz0gMTsKLSAgaS5wcmVmaXhbcV0gPSBwcmVmaXg7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfMTZiaXRfY29kZV9mbGFnIChuZXdfMTZiaXRfY29kZV9mbGFnKQotCWludCBuZXdfMTZiaXRfY29kZV9mbGFnOwotewotICBmbGFnXzE2Yml0X2NvZGUgPSBuZXdfMTZiaXRfY29kZV9mbGFnOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2ludGVsX3N5bnRheCAoc3ludGF4X2ZsYWcpCi0JaW50IHN5bnRheF9mbGFnOwotewotICAvKiBGaW5kIG91dCBpZiByZWdpc3RlciBwcmVmaXhpbmcgaXMgc3BlY2lmaWVkLiAgKi8KLSAgaW50IGFza19uYWtlZF9yZWcgPSAwOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGNoYXIgKnN0cmluZyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGludCBlID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgICAgIGlmIChzdHJjbXAoc3RyaW5nLCAicHJlZml4IikgPT0gMCkKLQlhc2tfbmFrZWRfcmVnID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChzdHJpbmcsICJub3ByZWZpeCIpID09IDApCi0JYXNrX25ha2VkX3JlZyA9IC0xOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiQmFkIGFyZ3VtZW50IHRvIHN5bnRheCBkaXJlY3RpdmUuIikpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGU7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAKLSAgaW50ZWxfc3ludGF4ID0gc3ludGF4X2ZsYWc7Ci0KLSAgaWYgKGFza19uYWtlZF9yZWcgPT0gMCkKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYWxsb3dfbmFrZWRfcmVnID0gKGludGVsX3N5bnRheAotICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKHN0ZG91dHB1dCkgIT0gJ1wwJykpOyAKLSNlbHNlCi0gICAgICBhbGxvd19uYWtlZF9yZWcgPSAwOyAvKiBjb25zZXJ2YXRpdmUgZGVmYXVsdCAqLwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgYWxsb3dfbmFrZWRfcmVnID0gKGFza19uYWtlZF9yZWcgPCAwKTsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSNpZm5kZWYgSTM4NkNPRkYKLSAgeyJic3MiLCBzX2JzcywgMH0sCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChPQkpfQU9VVCkgJiYgIWRlZmluZWQoVVNFX0FMSUdOX1BUV08pCi0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwfSwKLSNlbHNlCi0gIHsiYWxpZ24iLCBzX2FsaWduX3B0d28sIDB9LAotI2VuZGlmCi0gIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7InRmbG9hdCIsIGZsb2F0X2NvbnMsICd4J30sCi0gIHsidmFsdWUiLCBjb25zLCAyfSwKLSAgeyJub29wdCIsIHNfaWdub3JlLCAwfSwKLSAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJjb2RlMTYiLCBzZXRfMTZiaXRfY29kZV9mbGFnLCAxfSwKLSAgeyJjb2RlMzIiLCBzZXRfMTZiaXRfY29kZV9mbGFnLCAwfSwKLSAgeyJpbnRlbF9zeW50YXgiLCBzZXRfaW50ZWxfc3ludGF4LCAxfSwKLSAgeyJhdHRfc3ludGF4Iiwgc2V0X2ludGVsX3N5bnRheCwgMH0sCi0gIHswLCAwLCAwfQotfTsKLQotLyogZm9yIGludGVyZmFjZSB3aXRoIGV4cHJlc3Npb24gKCkgKi8KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLS8qIGhhc2ggdGFibGUgZm9yIGluc3RydWN0aW9uIG1uZW1vbmljIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciByZWdpc3RlciBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsKLQwKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqaGFzaF9lcnI7Ci0KLSAgLyogaW5pdGlhbGl6ZSBvcF9oYXNoIGhhc2ggdGFibGUgKi8KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHsKLSAgICByZWdpc3RlciBjb25zdCB0ZW1wbGF0ZSAqb3B0YWI7Ci0gICAgcmVnaXN0ZXIgdGVtcGxhdGVzICpjb3JlX29wdGFiOwotCi0gICAgb3B0YWIgPSBpMzg2X29wdGFiOwkJLyogc2V0dXAgZm9yIGxvb3AgKi8KLSAgICBjb3JlX29wdGFiID0gKHRlbXBsYXRlcyAqKSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlcykpOwotICAgIGNvcmVfb3B0YWItPnN0YXJ0ID0gb3B0YWI7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICAgIHsKLQkrK29wdGFiOwotCWlmIChvcHRhYi0+bmFtZSA9PSBOVUxMCi0JICAgIHx8IHN0cmNtcCAob3B0YWItPm5hbWUsIChvcHRhYiAtIDEpLT5uYW1lKSAhPSAwKQotCSAgewotCSAgICAvKiBkaWZmZXJlbnQgbmFtZSAtLT4gc2hpcCBvdXQgY3VycmVudCB0ZW1wbGF0ZSBsaXN0OwotCSAgICAgICBhZGQgdG8gaGFzaCB0YWJsZTsgJiBiZWdpbiBhbmV3ICovCi0JICAgIGNvcmVfb3B0YWItPmVuZCA9IG9wdGFiOwotCSAgICBoYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLAotCQkJCSAgICAob3B0YWIgLSAxKS0+bmFtZSwKLQkJCQkgICAgKFBUUikgY29yZV9vcHRhYik7Ci0JICAgIGlmIChoYXNoX2VycikKLQkgICAgICB7Ci0JICAgICAgaGFzaF9lcnJvcjoKLQkJYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiAgQ2FuJ3QgaGFzaCAlczogJXMiKSwKLQkJCSAgKG9wdGFiIC0gMSktPm5hbWUsCi0JCQkgIGhhc2hfZXJyKTsKLQkgICAgICB9Ci0JICAgIGlmIChvcHRhYi0+bmFtZSA9PSBOVUxMKQotCSAgICAgIGJyZWFrOwotCSAgICBjb3JlX29wdGFiID0gKHRlbXBsYXRlcyAqKSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlcykpOwotCSAgICBjb3JlX29wdGFiLT5zdGFydCA9IG9wdGFiOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogaW5pdGlhbGl6ZSByZWdfaGFzaCBoYXNoIHRhYmxlICovCi0gIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICByZWdpc3RlciBjb25zdCByZWdfZW50cnkgKnJlZ3RhYjsKLQotICAgIGZvciAocmVndGFiID0gaTM4Nl9yZWd0YWI7Ci0JIHJlZ3RhYiA8IGkzODZfcmVndGFiICsgc2l6ZW9mIChpMzg2X3JlZ3RhYikgLyBzaXplb2YgKGkzODZfcmVndGFiWzBdKTsKLQkgcmVndGFiKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIHJlZ3RhYi0+cmVnX25hbWUsIChQVFIpIHJlZ3RhYik7Ci0JaWYgKGhhc2hfZXJyKQotCSAgZ290byBoYXNoX2Vycm9yOwotICAgICAgfQotICB9Ci0KLSAgLyogZmlsbCBpbiBsZXhpY2FsIHRhYmxlczogIG1uZW1vbmljX2NoYXJzLCBvcGVyYW5kX2NoYXJzLiAgKi8KLSAgewotICAgIHJlZ2lzdGVyIGludCBjOwotICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0KLSAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCi0gICAgICB7Ci0JaWYgKGlzZGlnaXQgKGMpKQotCSAgewotCSAgICBkaWdpdF9jaGFyc1tjXSA9IGM7Ci0JICAgIG1uZW1vbmljX2NoYXJzW2NdID0gYzsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLQllbHNlIGlmIChpc2xvd2VyIChjKSkKLQkgIHsKLQkgICAgbW5lbW9uaWNfY2hhcnNbY10gPSBjOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCSAgfQotCWVsc2UgaWYgKGlzdXBwZXIgKGMpKQotCSAgewotCSAgICBtbmVtb25pY19jaGFyc1tjXSA9IHRvbG93ZXIgKGMpOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IG1uZW1vbmljX2NoYXJzW2NdOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLQotCWlmIChpc2FscGhhIChjKSB8fCBpc2RpZ2l0IChjKSkKLQkgIGlkZW50aWZpZXJfY2hhcnNbY10gPSBjOwotCWVsc2UgaWYgKGMgPj0gMTI4KQotCSAgewotCSAgICBpZGVudGlmaWVyX2NoYXJzW2NdID0gYzsKLQkgICAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0gICAgICB9Ci0KLSNpZmRlZiBMRVhfQVQKLSAgICBpZGVudGlmaWVyX2NoYXJzWydAJ10gPSAnQCc7Ci0jZW5kaWYKLSAgICByZWdpc3Rlcl9jaGFyc1snKSddID0gJyknOwotICAgIHJlZ2lzdGVyX2NoYXJzWycoJ10gPSAnKCc7Ci0gICAgZGlnaXRfY2hhcnNbJy0nXSA9ICctJzsKLSAgICBpZGVudGlmaWVyX2NoYXJzWydfJ10gPSAnXyc7Ci0gICAgaWRlbnRpZmllcl9jaGFyc1snLiddID0gJy4nOwotCi0gICAgZm9yIChwID0gb3BlcmFuZF9zcGVjaWFsX2NoYXJzOyAqcCAhPSAnXDAnOyBwKyspCi0gICAgICBvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqcF0gPSAqcDsKLSAgfQotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICByZWNvcmRfYWxpZ25tZW50ICh0ZXh0X3NlY3Rpb24sIDIpOwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoZGF0YV9zZWN0aW9uLCAyKTsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCAyKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotdm9pZAotaTM4Nl9wcmludF9zdGF0aXN0aWNzIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJpMzg2IG9wY29kZSIsIG9wX2hhc2gpOwotICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJpMzg2IHJlZ2lzdGVyIiwgcmVnX2hhc2gpOwotfQotDAotCi0jaWZkZWYgREVCVUczODYKLQotLyogZGVidWdnaW5nIHJvdXRpbmVzIGZvciBtZF9hc3NlbWJsZSAqLwotc3RhdGljIHZvaWQgcGkgUEFSQU1TICgoY2hhciAqLCBpMzg2X2luc24gKikpOwotc3RhdGljIHZvaWQgcHRlIFBBUkFNUyAoKHRlbXBsYXRlICopKTsKLXN0YXRpYyB2b2lkIHB0IFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgcGUgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgcHMgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1waSAobGluZSwgeCkKLSAgICAgY2hhciAqbGluZTsKLSAgICAgaTM4Nl9pbnNuICp4OwotewotICByZWdpc3RlciB0ZW1wbGF0ZSAqcDsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZiAoc3Rkb3V0LCAiJXM6IHRlbXBsYXRlICIsIGxpbmUpOwotICBwdGUgKCZ4LT50bSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIiAgbW9kcm06ICBtb2RlICV4ICByZWcgJXggIHJlZy9tZW0gJXgiLAotCSAgIHgtPnJtLm1vZGUsIHgtPnJtLnJlZywgeC0+cm0ucmVnbWVtKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiIGJhc2UgJXggIGluZGV4ICV4ICBzY2FsZSAleFxuIiwKLQkgICB4LT5iaS5iYXNlLCB4LT5iaS5pbmRleCwgeC0+Ymkuc2NhbGUpOwotICBmb3IgKGkgPSAwOyBpIDwgeC0+b3BlcmFuZHM7IGkrKykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgIyVkOiAgIiwgaSArIDEpOwotICAgICAgcHQgKHgtPnR5cGVzW2ldKTsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gICAgICBpZiAoeC0+dHlwZXNbaV0KLQkgICYgKFJlZyB8IFNSZWcyIHwgU1JlZzMgfCBDb250cm9sIHwgRGVidWcgfCBUZXN0IHwgUmVnTU1YIHwgUmVnWE1NKSkKLQlmcHJpbnRmIChzdGRvdXQsICIlc1xuIiwgeC0+cmVnc1tpXS0+cmVnX25hbWUpOwotICAgICAgaWYgKHgtPnR5cGVzW2ldICYgSW1tKQotCXBlICh4LT5pbW1zW2ldKTsKLSAgICAgIGlmICh4LT50eXBlc1tpXSAmIERpc3ApCi0JcGUgKHgtPmRpc3BzW2ldKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdGUgKHQpCi0gICAgIHRlbXBsYXRlICp0OwotewotICBpbnQgaTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiICVkIG9wZXJhbmRzICIsIHQtPm9wZXJhbmRzKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAib3Bjb2RlICV4ICIsCi0JICAgdC0+YmFzZV9vcGNvZGUpOwotICBpZiAodC0+ZXh0ZW5zaW9uX29wY29kZSAhPSBOb25lKQotICAgIGZwcmludGYgKHN0ZG91dCwgImV4dCAleCAiLCB0LT5leHRlbnNpb25fb3Bjb2RlKTsKLSAgaWYgKHQtPm9wY29kZV9tb2RpZmllciAmIEQpCi0gICAgZnByaW50ZiAoc3Rkb3V0LCAiRCIpOwotICBpZiAodC0+b3Bjb2RlX21vZGlmaWVyICYgVykKLSAgICBmcHJpbnRmIChzdGRvdXQsICJXIik7Ci0gIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gIGZvciAoaSA9IDA7IGkgPCB0LT5vcGVyYW5kczsgaSsrKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICAjJWQgdHlwZSAiLCBpICsgMSk7Ci0gICAgICBwdCAodC0+b3BlcmFuZF90eXBlc1tpXSk7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXBlIChlKQotICAgICBleHByZXNzaW9uUyAqZTsKLXsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiICAgIG9wZXJhdGlvbiAgICAgICAlZFxuIiwgZS0+WF9vcCk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIiAgICBhZGRfbnVtYmVyICAgICVkICgleClcbiIsCi0JICAgZS0+WF9hZGRfbnVtYmVyLCBlLT5YX2FkZF9udW1iZXIpOwotICBpZiAoZS0+WF9hZGRfc3ltYm9sKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICBhZGRfc3ltYm9sICAgICIpOwotICAgICAgcHMgKGUtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotICAgIH0KLSAgaWYgKGUtPlhfb3Bfc3ltYm9sKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICBvcF9zeW1ib2wgICAgIik7Ci0gICAgICBwcyAoZS0+WF9vcF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiJXMgdHlwZSAlcyVzIiwKLQkgICBTX0dFVF9OQU1FIChzKSwKLQkgICBTX0lTX0VYVEVSTkFMIChzKSA/ICJFWFRFUk5BTCAiIDogIiIsCi0JICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzKSkpOwotfQotCi1zdHJ1Y3QgdHlwZV9uYW1lCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbWFzazsKLSAgICBjaGFyICp0bmFtZTsKLSAgfQotCi10eXBlX25hbWVzW10gPQotewotICB7IFJlZzgsICJyOCIgfSwKLSAgeyBSZWcxNiwgInIxNiIgfSwKLSAgeyBSZWczMiwgInIzMiIgfSwKLSAgeyBJbW04LCAiaTgiIH0sCi0gIHsgSW1tOFMsICJpOHMiIH0sCi0gIHsgSW1tMTYsICJpMTYiIH0sCi0gIHsgSW1tMzIsICJpMzIiIH0sCi0gIHsgSW1tMSwgImkxIiB9LAotICB7IEJhc2VJbmRleCwgIkJhc2VJbmRleCIgfSwKLSAgeyBEaXNwOCwgImQ4IiB9LAotICB7IERpc3AxNiwgImQxNiIgfSwKLSAgeyBEaXNwMzIsICJkMzIiIH0sCi0gIHsgSW5PdXRQb3J0UmVnLCAiSW5PdXRQb3J0UmVnIiB9LAotICB7IFNoaWZ0Q291bnQsICJTaGlmdENvdW50IiB9LAotICB7IENvbnRyb2wsICJjb250cm9sIHJlZyIgfSwKLSAgeyBUZXN0LCAidGVzdCByZWciIH0sCi0gIHsgRGVidWcsICJkZWJ1ZyByZWciIH0sCi0gIHsgRmxvYXRSZWcsICJGUmVnIiB9LAotICB7IEZsb2F0QWNjLCAiRkFjYyIgfSwKLSAgeyBTUmVnMiwgIlNSZWcyIiB9LAotICB7IFNSZWczLCAiU1JlZzMiIH0sCi0gIHsgQWNjLCAiQWNjIiB9LAotICB7IEp1bXBBYnNvbHV0ZSwgIkp1bXAgQWJzb2x1dGUiIH0sCi0gIHsgUmVnTU1YLCAick1NWCIgfSwKLSAgeyBSZWdYTU0sICJyWE1NIiB9LAotICB7IEVzU2VnLCAiZXMiIH0sCi0gIHsgMCwgIiIgfQotfTsKLQotc3RhdGljIHZvaWQKLXB0ICh0KQotICAgICB1bnNpZ25lZCBpbnQgdDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHR5cGVfbmFtZSAqdHk7Ci0KLSAgaWYgKHQgPT0gVW5rbm93bikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsIF8oIlVua25vd24iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yICh0eSA9IHR5cGVfbmFtZXM7IHR5LT5tYXNrOyB0eSsrKQotCWlmICh0ICYgdHktPm1hc2spCi0JICBmcHJpbnRmIChzdGRvdXQsICIlcywgIiwgdHktPnRuYW1lKTsKLSAgICB9Ci0gIGZmbHVzaCAoc3Rkb3V0KTsKLX0KLQotI2VuZGlmIC8qIERFQlVHMzg2ICovCi0MCi1pbnQKLXRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgc3RydWN0IGZpeCAqZml4cDsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci0jZWxzZQotICAvKiBGb3IgQ09GRiAqLwotICByZXR1cm4gZml4cC0+Znhfcl90eXBlPT03OwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jCi0gIFBBUkFNUyAoKGludCwgaW50LCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotcmVsb2MgKHNpemUsIHBjcmVsLCBvdGhlcikKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBwY3JlbDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIG90aGVyOwotewotICBpZiAob3RoZXIgIT0gTk9fUkVMT0MpIHJldHVybiBvdGhlcjsKLQotICBpZiAocGNyZWwpCi0gICAgewotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6IHJldHVybiBCRkRfUkVMT0NfOF9QQ1JFTDsKLQljYXNlIDI6IHJldHVybiBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JY2FzZSA0OiByZXR1cm4gQkZEX1JFTE9DXzMyX1BDUkVMOwotCX0KLSAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6IHJldHVybiBCRkRfUkVMT0NfODsKLQljYXNlIDI6IHJldHVybiBCRkRfUkVMT0NfMTY7Ci0JY2FzZSA0OiByZXR1cm4gQkZEX1JFTE9DXzMyOwotCX0KLSAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyoKLSAqIEhlcmUgd2UgZGVjaWRlIHdoaWNoIGZpeHVwcyBjYW4gYmUgYWRqdXN0ZWQgdG8gbWFrZSB0aGVtIHJlbGF0aXZlIHRvCi0gKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIGluc3RlYWQgb2YgdGhlIHN5bWJvbC4gIEJhc2ljYWxseSB3ZSBuZWVkCi0gKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgZG9uZSBjb3JyZWN0bHksIHNvIGluCi0gKiBzb21lIGNhc2VzIHdlIGZvcmNlIHRoZSBvcmlnaW5hbCBzeW1ib2wgdG8gYmUgdXNlZC4KLSAqLwotaW50Ci10Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKGZpeFApCi0gICAgIGZpeFMgKiBmaXhQOwotewotI2lmZGVmIE9CSl9FTEYKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgLyogYWRqdXN0X3JlbG9jX3N5bXMgZG9lc24ndCBrbm93IGFib3V0IHRoZSBHT1QgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzg2X0dPVE9GRgotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zODZfUExUMzIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzg2X0dPVDMyCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0jZWxzZQotI2RlZmluZSByZWxvYyhTSVpFLFBDUkVMLE9USEVSKQkwCi0jZGVmaW5lIEJGRF9SRUxPQ18xNgkJMAotI2RlZmluZSBCRkRfUkVMT0NfMzIJCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzE2X1BDUkVMCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzMyX1BDUkVMCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzM4Nl9QTFQzMgkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zODZfR09UMzIJMAotI2RlZmluZSBCRkRfUkVMT0NfMzg2X0dPVE9GRgkwCi0jZW5kaWYKLQotaW50Ci1pbnRlbF9mbG9hdF9vcGVyYW5kIChtbmVtb25pYykKLSAgICAgY2hhciAqbW5lbW9uaWM7Ci17Ci0gIGlmIChtbmVtb25pY1swXSA9PSAnZicgJiYgbW5lbW9uaWNbMV0gPT0naScpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG1uZW1vbmljWzBdID09ICdmJykKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgTElORSBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAobGluZSkKLSAgICAgY2hhciAqbGluZTsKLXsKLSAgLyogUG9pbnRzIHRvIHRlbXBsYXRlIG9uY2Ugd2UndmUgZm91bmQgaXQuICovCi0gIGNvbnN0IHRlbXBsYXRlICp0OwotCi0gIC8qIENvdW50IHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQuICAqLwotICBpbnQgaW5zbl9zaXplID0gMDsKLQotICBpbnQgajsKLQotICBjaGFyIG1uZW1vbmljW01BWF9NTkVNX1NJWkVdOwotCi0gIC8qIEluaXRpYWxpemUgZ2xvYmFscy4gKi8KLSAgbWVtc2V0ICgmaSwgJ1wwJywgc2l6ZW9mIChpKSk7Ci0gIGZvciAoaiA9IDA7IGogPCBNQVhfT1BFUkFORFM7IGorKykKLSAgICBpLmRpc3BfcmVsb2Nbal0gPSBOT19SRUxPQzsKLSAgbWVtc2V0IChkaXNwX2V4cHJlc3Npb25zLCAnXDAnLCBzaXplb2YgKGRpc3BfZXhwcmVzc2lvbnMpKTsKLSAgbWVtc2V0IChpbV9leHByZXNzaW9ucywgJ1wwJywgc2l6ZW9mIChpbV9leHByZXNzaW9ucykpOwotICBzYXZlX3N0YWNrX3AgPSBzYXZlX3N0YWNrOwkvKiByZXNldCBzdGFjayBwb2ludGVyICovCi0KLSAgLyogRmlyc3QgcGFyc2UgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgJiBjYWxsIGkzODZfb3BlcmFuZCBmb3IgdGhlIG9wZXJhbmRzLgotICAgICBXZSBhc3N1bWUgdGhhdCB0aGUgc2NydWJiZXIgaGFzIGFycmFuZ2VkIGl0IHNvIHRoYXQgbGluZVswXSBpcyB0aGUgdmFsaWQKLSAgICAgc3RhcnQgb2YgYSAocG9zc2libHkgcHJlZml4ZWQpIG1uZW1vbmljLiAqLwotICB7Ci0gICAgY2hhciAqbCA9IGxpbmU7Ci0gICAgY2hhciAqdG9rZW5fc3RhcnQgPSBsOwotICAgIGNoYXIgKm1uZW1fcDsKLQotICAgIC8qIE5vbi16ZXJvIGlmIHdlIGZvdW5kIGEgcHJlZml4IG9ubHkgYWNjZXB0YWJsZSB3aXRoIHN0cmluZyBpbnNucy4gKi8KLSAgICBjb25zdCBjaGFyICpleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uID0gTlVMTDsKLQotICAgIHdoaWxlICgxKQotICAgICAgewotCW1uZW1fcCA9IG1uZW1vbmljOwotCXdoaWxlICgoKm1uZW1fcCA9IG1uZW1vbmljX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqbF0pICE9IDApCi0JICB7Ci0JICAgIG1uZW1fcCsrOwotCSAgICBpZiAobW5lbV9wID49IG1uZW1vbmljICsgc2l6ZW9mIChtbmVtb25pYykpCi0JICAgICAgewotCQlhc19iYWQgKF8oIm5vIHN1Y2ggMzg2IGluc3RydWN0aW9uOiBgJXMnIiksIHRva2VuX3N0YXJ0KTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgbCsrOwotCSAgfQotCWlmICghaXNfc3BhY2VfY2hhciAoKmwpCi0JICAgICYmICpsICE9IEVORF9PRl9JTlNOCi0JICAgICYmICpsICE9IFBSRUZJWF9TRVBBUkFUT1IpCi0JICB7Ci0JICAgIGFzX2JhZCAoXygiaW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gbW5lbW9uaWMiKSwKLQkJICAgIG91dHB1dF9pbnZhbGlkICgqbCkpOwotCSAgICByZXR1cm47Ci0JICB9Ci0JaWYgKHRva2VuX3N0YXJ0ID09IGwpCi0JICB7Ci0JICAgIGlmICgqbCA9PSBQUkVGSVhfU0VQQVJBVE9SKQotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIHByZWZpeDsgZ290IG5vdGhpbmciKSk7Ci0JICAgIGVsc2UKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBtbmVtb25pYzsgZ290IG5vdGhpbmciKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLQotCS8qIExvb2sgdXAgaW5zdHJ1Y3Rpb24gKG9yIHByZWZpeCkgdmlhIGhhc2ggdGFibGUuICAqLwotCWN1cnJlbnRfdGVtcGxhdGVzID0gaGFzaF9maW5kIChvcF9oYXNoLCBtbmVtb25pYyk7Ci0KLQlpZiAoKmwgIT0gRU5EX09GX0lOU04KLQkgICAgJiYgKCEgaXNfc3BhY2VfY2hhciAoKmwpIHx8IGxbMV0gIT0gRU5EX09GX0lOU04pCi0JICAgICYmIGN1cnJlbnRfdGVtcGxhdGVzCi0JICAgICYmIChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzUHJlZml4KSkKLQkgIHsKLQkgICAgLyogSWYgd2UgYXJlIGluIDE2LWJpdCBtb2RlLCBkbyBub3QgYWxsb3cgYWRkcjE2IG9yIGRhdGExNi4KLQkgICAgICAgU2ltaWxhcmx5LCBpbiAzMi1iaXQgbW9kZSwgZG8gbm90IGFsbG93IGFkZHIzMiBvciBkYXRhMzIuICAqLwotCSAgICBpZiAoKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgKFNpemUxNiB8IFNpemUzMikpCi0JCSYmICgoKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgU2l6ZTMyKSAhPSAwKQotCQkgICAgXiBmbGFnXzE2Yml0X2NvZGUpKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJyZWR1bmRhbnQgJXMgcHJlZml4IiksCi0JCQljdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWUpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICAvKiBBZGQgcHJlZml4LCBjaGVja2luZyBmb3IgcmVwZWF0ZWQgcHJlZml4ZXMuICAqLwotCSAgICBzd2l0Y2ggKGFkZF9wcmVmaXggKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+YmFzZV9vcGNvZGUpKQotCSAgICAgIHsKLQkgICAgICBjYXNlIDA6Ci0JCXJldHVybjsKLQkgICAgICBjYXNlIDI6Ci0JCWV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24gPQotCQkgIGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAvKiBTa2lwIHBhc3QgUFJFRklYX1NFUEFSQVRPUiBhbmQgcmVzZXQgdG9rZW5fc3RhcnQuICAqLwotCSAgICB0b2tlbl9zdGFydCA9ICsrbDsKLQkgIH0KLQllbHNlCi0JICBicmVhazsKLSAgICAgIH0KLQotICAgIGlmICghY3VycmVudF90ZW1wbGF0ZXMpCi0gICAgICB7Ci0JLyogU2VlIGlmIHdlIGNhbiBnZXQgYSBtYXRjaCBieSB0cmltbWluZyBvZmYgYSBzdWZmaXguCSovCi0Jc3dpdGNoIChtbmVtX3BbLTFdKQotCSAgewotCSAgY2FzZSBEV09SRF9NTkVNX1NVRkZJWDoKLQkgIGNhc2UgV09SRF9NTkVNX1NVRkZJWDoKLQkgIGNhc2UgQllURV9NTkVNX1NVRkZJWDoKLQkgIGNhc2UgU0hPUlRfTU5FTV9TVUZGSVg6Ci0jaWYgTE9OR19NTkVNX1NVRkZJWCAhPSBEV09SRF9NTkVNX1NVRkZJWAotCSAgY2FzZSBMT05HX01ORU1fU1VGRklYOgotI2VuZGlmCi0JICAgIGkuc3VmZml4ID0gbW5lbV9wWy0xXTsKLQkgICAgbW5lbV9wWy0xXSA9ICdcMCc7Ci0JICAgIGN1cnJlbnRfdGVtcGxhdGVzID0gaGFzaF9maW5kIChvcF9oYXNoLCBtbmVtb25pYyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIC8qIEludGVsIFN5bnRheCAqLwotICAgICAgICAgIGNhc2UgSU5URUxfRFdPUkRfTU5FTV9TVUZGSVg6Ci0gICAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaS5zdWZmaXggPSBtbmVtX3BbLTFdOwotICAgICAgICAgICAgICAgIG1uZW1fcFstMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcGxhdGVzID0gaGFzaF9maW5kIChvcF9oYXNoLCBtbmVtb25pYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLQkgIH0KLQlpZiAoIWN1cnJlbnRfdGVtcGxhdGVzKQotCSAgewotCSAgICBhc19iYWQgKF8oIm5vIHN1Y2ggMzg2IGluc3RydWN0aW9uOiBgJXMnIiksIHRva2VuX3N0YXJ0KTsKLQkgICAgcmV0dXJuOwotCSAgfQotICAgICAgfQotCi0gICAgLyogY2hlY2sgZm9yIHJlcC9yZXBuZSB3aXRob3V0IGEgc3RyaW5nIGluc3RydWN0aW9uICovCi0gICAgaWYgKGV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24KLQkmJiAhKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpKQotICAgICAgewotCWFzX2JhZCAoXygiZXhwZWN0aW5nIHN0cmluZyBpbnN0cnVjdGlvbiBhZnRlciBgJXMnIiksCi0JCWV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24pOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIC8qIFRoZXJlIG1heSBiZSBvcGVyYW5kcyB0byBwYXJzZS4gKi8KLSAgICBpZiAoKmwgIT0gRU5EX09GX0lOU04pCi0gICAgICB7Ci0JLyogcGFyc2Ugb3BlcmFuZHMgKi8KLQotCS8qIDEgaWYgb3BlcmFuZCBpcyBwZW5kaW5nIGFmdGVyICcsJy4gKi8KLQl1bnNpZ25lZCBpbnQgZXhwZWN0aW5nX29wZXJhbmQgPSAwOwotCi0JLyogTm9uLXplcm8gaWYgb3BlcmFuZCBwYXJlbnMgbm90IGJhbGFuY2VkLiAqLwotCXVuc2lnbmVkIGludCBwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0KLQlkbwotCSAgewotCSAgICAvKiBza2lwIG9wdGlvbmFsIHdoaXRlIHNwYWNlIGJlZm9yZSBvcGVyYW5kICovCi0JICAgIGlmIChpc19zcGFjZV9jaGFyICgqbCkpCi0JICAgICAgKytsOwotCSAgICBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmwpICYmICpsICE9IEVORF9PRl9JTlNOKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJpbnZhbGlkIGNoYXJhY3RlciAlcyBiZWZvcmUgb3BlcmFuZCAlZCIpLAotCQkJb3V0cHV0X2ludmFsaWQgKCpsKSwKLQkJCWkub3BlcmFuZHMgKyAxKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgdG9rZW5fc3RhcnQgPSBsOwkvKiBhZnRlciB3aGl0ZSBzcGFjZSAqLwotCSAgICBwYXJlbl9ub3RfYmFsYW5jZWQgPSAwOwotCSAgICB3aGlsZSAocGFyZW5fbm90X2JhbGFuY2VkIHx8ICpsICE9ICcsJykKLQkgICAgICB7Ci0JCWlmICgqbCA9PSBFTkRfT0ZfSU5TTikKLQkJICB7Ci0JCSAgICBpZiAocGFyZW5fbm90X2JhbGFuY2VkKQotCQkgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWludGVsX3N5bnRheCkKLQkJCSAgYXNfYmFkIChfKCJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIGluIG9wZXJhbmQgJWQuIiksCi0JCQkJICBpLm9wZXJhbmRzICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0JCQkgIGFzX2JhZCAoXygidW5iYWxhbmNlZCBicmFja2V0cyBpbiBvcGVyYW5kICVkLiIpLAotCQkJCSAgaS5vcGVyYW5kcyArIDEpOwotCQkJcmV0dXJuOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIGJyZWFrOwkvKiB3ZSBhcmUgZG9uZSAqLwotCQkgIH0KLQkJZWxzZSBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmwpICYmICFpc19zcGFjZV9jaGFyICgqbCkpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGVyYW5kICVkIiksCi0JCQkgICAgb3V0cHV0X2ludmFsaWQgKCpsKSwKLQkJCSAgICBpLm9wZXJhbmRzICsgMSk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotICAgICAgICAgICAgICAgIGlmICghaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgICAgICAgewotCQkgICAgaWYgKCpsID09ICcoJykKLQkJICAgICAgKytwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JCSAgICBpZiAoKmwgPT0gJyknKQotCQkgICAgICAtLXBhcmVuX25vdF9iYWxhbmNlZDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7Ci0JCSAgICBpZiAoKmwgPT0gJ1snKQotCQkgICAgICArK3BhcmVuX25vdF9iYWxhbmNlZDsKLQkJICAgIGlmICgqbCA9PSAnXScpCi0JCSAgICAgIC0tcGFyZW5fbm90X2JhbGFuY2VkOwotICAgICAgICAgICAgICAgICAgfQotCQlsKys7Ci0JICAgICAgfQotCSAgICBpZiAobCAhPSB0b2tlbl9zdGFydCkKLQkgICAgICB7CQkJLyogeWVzLCB3ZSd2ZSByZWFkIGluIGFub3RoZXIgb3BlcmFuZCAqLwotCQl1bnNpZ25lZCBpbnQgb3BlcmFuZF9vazsKLQkJdGhpc19vcGVyYW5kID0gaS5vcGVyYW5kcysrOwotCQlpZiAoaS5vcGVyYW5kcyA+IE1BWF9PUEVSQU5EUykKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oInNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIpLAotCQkJICAgIE1BWF9PUEVSQU5EUyk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCQkvKiBub3cgcGFyc2Ugb3BlcmFuZCBhZGRpbmcgaW5mbyB0byAnaScgYXMgd2UgZ28gYWxvbmcgKi8KLQkJRU5EX1NUUklOR19BTkRfU0FWRSAobCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgICAgICAgb3BlcmFuZF9vayA9IGkzODZfaW50ZWxfb3BlcmFuZCAodG9rZW5fc3RhcnQsIGludGVsX2Zsb2F0X29wZXJhbmQgKG1uZW1vbmljKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgb3BlcmFuZF9vayA9IGkzODZfb3BlcmFuZCAodG9rZW5fc3RhcnQpOwotCi0JCVJFU1RPUkVfRU5EX1NUUklORyAobCk7CS8qIHJlc3RvcmUgb2xkIGNvbnRlbnRzICovCi0JCWlmICghb3BlcmFuZF9vaykKLQkJICByZXR1cm47Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoZXhwZWN0aW5nX29wZXJhbmQpCi0JCSAgewotCQkgIGV4cGVjdGluZ19vcGVyYW5kX2FmdGVyX2NvbW1hOgotCQkgICAgYXNfYmFkIChfKCJleHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIikpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkJaWYgKCpsID09ICcsJykKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oImV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIikpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogbm93ICpsIG11c3QgYmUgZWl0aGVyICcsJyBvciBFTkRfT0ZfSU5TTiAqLwotCSAgICBpZiAoKmwgPT0gJywnKQotCSAgICAgIHsKLQkJaWYgKCorK2wgPT0gRU5EX09GX0lOU04pCi0JCSAgewkJLyoganVzdCBza2lwIGl0LCBpZiBpdCdzIFxuIGNvbXBsYWluICovCi0JCSAgICBnb3RvIGV4cGVjdGluZ19vcGVyYW5kX2FmdGVyX2NvbW1hOwotCQkgIH0KLQkJZXhwZWN0aW5nX29wZXJhbmQgPSAxOwotCSAgICAgIH0KLQkgIH0KLQl3aGlsZSAoKmwgIT0gRU5EX09GX0lOU04pOwkvKiB1bnRpbCB3ZSBnZXQgZW5kIG9mIGluc24gKi8KLSAgICAgIH0KLSAgfQotCi0gIC8qIE5vdyB3ZSd2ZSBwYXJzZWQgdGhlIG1uZW1vbmljIGludG8gYSBzZXQgb2YgdGVtcGxhdGVzLCBhbmQgaGF2ZSB0aGUKLSAgICAgb3BlcmFuZHMgYXQgaGFuZC4KLQotICAgICBOZXh0LCB3ZSBmaW5kIGEgdGVtcGxhdGUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBpbnNuLAotICAgICBtYWtpbmcgc3VyZSB0aGUgb3ZlcmxhcCBvZiB0aGUgZ2l2ZW4gb3BlcmFuZHMgdHlwZXMgaXMgY29uc2lzdGVudAotICAgICB3aXRoIHRoZSB0ZW1wbGF0ZSBvcGVyYW5kIHR5cGVzLiAqLwotCi0jZGVmaW5lIE1BVENIKG92ZXJsYXAsIGdpdmVuLCB0ZW1wbGF0ZSkgXAotICAoKG92ZXJsYXApIFwKLSAgICYmICgoZ2l2ZW4pICYgQmFzZUluZGV4KSA9PSAoKG92ZXJsYXApICYgQmFzZUluZGV4KSBcCi0gICAmJiAoKGdpdmVuKSAmIEp1bXBBYnNvbHV0ZSkgPT0gKCh0ZW1wbGF0ZSkgJiBKdW1wQWJzb2x1dGUpKQotCi0gIC8qIElmIGdpdmVuIHR5cGVzIHIwIGFuZCByMSBhcmUgcmVnaXN0ZXJzIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlCi0gICAgIHVubGVzcyB0aGUgZXhwZWN0ZWQgb3BlcmFuZCB0eXBlIHJlZ2lzdGVyIG92ZXJsYXAgaXMgbnVsbC4KLSAgICAgTm90ZSB0aGF0IEFjYyBpbiBhIHRlbXBsYXRlIG1hdGNoZXMgZXZlcnkgc2l6ZSBvZiByZWcuICAqLwotI2RlZmluZSBDT05TSVNURU5UX1JFR0lTVEVSX01BVENIKG0wLCBnMCwgdDAsIG0xLCBnMSwgdDEpIFwKLSAgKCAoKGcwKSAmIFJlZykgPT0gMCB8fCAoKGcxKSAmIFJlZykgPT0gMCB8fCBcCi0gICAgKChnMCkgJiBSZWcpID09ICgoZzEpICYgUmVnKSB8fCBcCi0gICAgKCgoKG0wKSAmIEFjYykgPyBSZWcgOiAodDApKSAmICgoKG0xKSAmIEFjYykgPyBSZWcgOiAodDEpKSAmIFJlZykgPT0gMCApCi0KLSAgewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBvdmVybGFwMCwgb3ZlcmxhcDE7Ci0gICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICB1bnNpZ25lZCBpbnQgb3ZlcmxhcDI7Ci0gICAgdW5zaWduZWQgaW50IGZvdW5kX3JldmVyc2VfbWF0Y2g7Ci0gICAgaW50IHN1ZmZpeF9jaGVjazsKLQotICAgIC8qIEFsbCBpbnRlbCBvcGNvZGVzIGhhdmUgcmV2ZXJzZWQgb3BlcmFuZHMgZXhjZXB0IGZvciBCT1VORCBhbmQgRU5URVIgKi8KLSAgICBpZiAoaW50ZWxfc3ludGF4Ci0gICAgICAgICYmIChzdHJjbXAgKG1uZW1vbmljLCAiZW50ZXIiKSAhPSAwKQotICAgICAgICAmJiAoc3RyY21wIChtbmVtb25pYywgImJvdW5kIikgIT0gMCkKLSAgICAgICAgJiYgKHN0cm5jbXAgKG1uZW1vbmljLCAiZnN1YiIsIDQpICE9MCkKLSAgICAgICAgJiYgKHN0cm5jbXAgKG1uZW1vbmljLCAiZmRpdiIsIDQpICE9MCkpCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IHJlZ19lbnRyeSAqdGVtcF9yZWc7Ci0gICAgICAgIGV4cHJlc3Npb25TICp0ZW1wX2Rpc3A7Ci0gICAgICAgIGV4cHJlc3Npb25TICp0ZW1wX2ltbTsKLSAgICAgICAgdW5zaWduZWQgaW50IHRlbXBfdHlwZTsKLSAgICAgICAgaW50IHhjaGcxLCB4Y2hnMjsKLQotICAgICAgICBpZiAoaS5vcGVyYW5kcyA9PSAyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhjaGcxID0gMDsKLSAgICAgICAgICAgIHhjaGcyID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGkub3BlcmFuZHMgPT0gMykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4Y2hnMSA9IDA7Ci0gICAgICAgICAgICB4Y2hnMiA9IDI7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGlmIChpLm9wZXJhbmRzID4gMSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wX3R5cGUgPSBpLnR5cGVzW3hjaGcyXTsKLSAgICAgICAgICAgIGlmICh0ZW1wX3R5cGUgJiAoUmVnIHwgRmxvYXRSZWcpKQotICAgICAgICAgICAgICB0ZW1wX3JlZyA9IGkucmVnc1t4Y2hnMl07Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZW1wX3R5cGUgJiBJbW0pCi0gICAgICAgICAgICAgIHRlbXBfaW1tID0gaS5pbW1zW3hjaGcyXTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIERpc3ApCi0gICAgICAgICAgICAgIHRlbXBfZGlzcCA9IGkuZGlzcHNbeGNoZzJdOwotICAgICAgICAgICAKLSAgICAgICAgICAgIGkudHlwZXNbeGNoZzJdID0gaS50eXBlc1t4Y2hnMV07Ci0KLSAgICAgICAgICAgIGlmIChpLnR5cGVzW3hjaGcxXSAmIChSZWcgfCBGbG9hdFJlZykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpLnJlZ3NbeGNoZzJdID0gaS5yZWdzW3hjaGcxXTsKLSAgICAgICAgICAgICAgICBpLnJlZ3NbeGNoZzFdID0gTlVMTDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaS50eXBlc1t4Y2hnMl0gJiBJbW0pCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpLmltbXNbeGNoZzJdID0gaS5pbW1zW3hjaGcxXTsKLSAgICAgICAgICAgICAgICBpLmltbXNbeGNoZzFdID0gTlVMTDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaS50eXBlc1t4Y2hnMl0gJiBEaXNwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaS5kaXNwc1t4Y2hnMl0gPSBpLmRpc3BzW3hjaGcxXTsKLSAgICAgICAgICAgICAgICBpLmRpc3BzW3hjaGcxXSA9IE5VTEw7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRlbXBfdHlwZSAmIChSZWcgfCBGbG9hdFJlZykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpLnJlZ3NbeGNoZzFdID0gdGVtcF9yZWc7Ci0gICAgICAgICAgICAgICAgaWYgKCEgKGkudHlwZXNbeGNoZzFdICYgKFJlZyB8IEZsb2F0UmVnKSkpCi0gICAgICAgICAgICAgICAgICBpLnJlZ3NbeGNoZzJdID0gTlVMTDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodGVtcF90eXBlICYgSW1tKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaS5pbW1zW3hjaGcxXSA9IHRlbXBfaW1tOwotICAgICAgICAgICAgICAgIGlmICghIChpLnR5cGVzW3hjaGcxXSAmIEltbSkpCi0gICAgICAgICAgICAgICAgICBpLmltbXNbeGNoZzJdID0gTlVMTDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodGVtcF90eXBlICYgRGlzcCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkuZGlzcHNbeGNoZzFdID0gdGVtcF9kaXNwOwotICAgICAgICAgICAgICAgIGlmICghIChpLnR5cGVzW3hjaGcxXSAmIERpc3ApKQotICAgICAgICAgICAgICAgICAgaS5kaXNwc1t4Y2hnMl0gPSBOVUxMOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgaS50eXBlc1t4Y2hnMV0gPSB0ZW1wX3R5cGU7Ci0gICAgICAgICAgIH0KLSAgICAgICBpZiAoIXN0cmNtcChtbmVtb25pYywiam1wIikKLSAgICAgICAgICAgfHwgIXN0cmNtcCAobW5lbW9uaWMsICJjYWxsIikpCi0gICAgICAgICBpZiAoKGkudHlwZXNbMF0gJiBSZWcpIHx8IGkudHlwZXNbMF0gJiBCYXNlSW5kZXgpCi0gICAgICAgICAgIGkudHlwZXNbMF0gfD0gSnVtcEFic29sdXRlOwotICAgICAgICAgCi0gICAgICAgfQotICAgIG92ZXJsYXAwID0gMDsKLSAgICBvdmVybGFwMSA9IDA7Ci0gICAgb3ZlcmxhcDIgPSAwOwotICAgIGZvdW5kX3JldmVyc2VfbWF0Y2ggPSAwOwotICAgIHN1ZmZpeF9jaGVjayA9IChpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYCi0JCSAgICA/IE5vX2JTdWYKLQkJICAgIDogKGkuc3VmZml4ID09IFdPUkRfTU5FTV9TVUZGSVgKLQkJICAgICAgID8gTm9fd1N1ZgotCQkgICAgICAgOiAoaS5zdWZmaXggPT0gU0hPUlRfTU5FTV9TVUZGSVgKLQkJCSAgPyBOb19zU3VmCi0JCQkgIDogKGkuc3VmZml4ID09IExPTkdfTU5FTV9TVUZGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOb19sU3VmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpLnN1ZmZpeCA9PSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOb19kU3VmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpLnN1ZmZpeCA9PSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCA/IE5vX3hTdWYgOiAwKSkpKSkpOwotCi0gICAgZm9yICh0ID0gY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0OwotCSB0IDwgY3VycmVudF90ZW1wbGF0ZXMtPmVuZDsKLQkgdCsrKQotICAgICAgewotCS8qIE11c3QgaGF2ZSByaWdodCBudW1iZXIgb2Ygb3BlcmFuZHMuICovCi0JaWYgKGkub3BlcmFuZHMgIT0gdC0+b3BlcmFuZHMpCi0JICBjb250aW51ZTsKLQotICAgICAgICAvKiBGb3Igc29tZSBvcGNvZGVzLCBkb24ndCBjaGVjayB0aGUgc3VmZml4ICovCi0gICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmNtcCAodC0+bmFtZSwgImZuc3RjdyIpCi0gICAgICAgICAgICAgICAgJiYgc3RyY21wICh0LT5uYW1lLCAiZmxkY3ciKQotICAgICAgICAgICAgICAgICYmICh0LT5vcGNvZGVfbW9kaWZpZXIgJiBzdWZmaXhfY2hlY2spKQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIC8qIE11c3Qgbm90IGhhdmUgZGlzYWxsb3dlZCBzdWZmaXguICovIAotICAgICAgICBlbHNlIGlmICgodC0+b3Bjb2RlX21vZGlmaWVyICYgc3VmZml4X2NoZWNrKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JZWxzZSBpZiAoIXQtPm9wZXJhbmRzKQotCSAgYnJlYWs7CQkvKiAwIG9wZXJhbmRzIGFsd2F5cyBtYXRjaGVzICovCi0KLQlvdmVybGFwMCA9IGkudHlwZXNbMF0gJiB0LT5vcGVyYW5kX3R5cGVzWzBdOwotCXN3aXRjaCAodC0+b3BlcmFuZHMpCi0JICB7Ci0JICBjYXNlIDE6Ci0JICAgIGlmICghTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLCB0LT5vcGVyYW5kX3R5cGVzWzBdKSkKLQkgICAgICBjb250aW51ZTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICBjYXNlIDM6Ci0JICAgIG92ZXJsYXAxID0gaS50eXBlc1sxXSAmIHQtPm9wZXJhbmRfdHlwZXNbMV07Ci0JICAgIGlmICghTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLCB0LT5vcGVyYW5kX3R5cGVzWzBdKQotCQl8fCAhTUFUQ0ggKG92ZXJsYXAxLCBpLnR5cGVzWzFdLCB0LT5vcGVyYW5kX3R5cGVzWzFdKQotCQl8fCAhQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sCi0JCQkJCSAgICAgICB0LT5vcGVyYW5kX3R5cGVzWzBdLAotCQkJCQkgICAgICAgb3ZlcmxhcDEsIGkudHlwZXNbMV0sCi0JCQkJCSAgICAgICB0LT5vcGVyYW5kX3R5cGVzWzFdKSkKLQkgICAgICB7Ci0KLQkJLyogY2hlY2sgaWYgb3RoZXIgZGlyZWN0aW9uIGlzIHZhbGlkIC4uLiAqLwotCQlpZiAoKHQtPm9wY29kZV9tb2RpZmllciAmIChEfEZsb2F0RCkpID09IDApCi0JCSAgY29udGludWU7Ci0KLQkJLyogdHJ5IHJldmVyc2luZyBkaXJlY3Rpb24gb2Ygb3BlcmFuZHMgKi8KLQkJb3ZlcmxhcDAgPSBpLnR5cGVzWzBdICYgdC0+b3BlcmFuZF90eXBlc1sxXTsKLQkJb3ZlcmxhcDEgPSBpLnR5cGVzWzFdICYgdC0+b3BlcmFuZF90eXBlc1swXTsKLQkJaWYgKCFNQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sIHQtPm9wZXJhbmRfdHlwZXNbMV0pCi0JCSAgICB8fCAhTUFUQ0ggKG92ZXJsYXAxLCBpLnR5cGVzWzFdLCB0LT5vcGVyYW5kX3R5cGVzWzBdKQotCQkgICAgfHwgIUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLAotCQkJCQkJICAgdC0+b3BlcmFuZF90eXBlc1sxXSwKLQkJCQkJCSAgIG92ZXJsYXAxLCBpLnR5cGVzWzFdLAotCQkJCQkJICAgdC0+b3BlcmFuZF90eXBlc1swXSkpCi0JCSAgewotCQkgICAgLyogZG9lcyBub3QgbWF0Y2ggZWl0aGVyIGRpcmVjdGlvbiAqLwotCQkgICAgY29udGludWU7Ci0JCSAgfQotCQkvKiBmb3VuZF9yZXZlcnNlX21hdGNoIGhvbGRzIHdoaWNoIG9mIEQgb3IgRmxvYXREUgotCQkgICB3ZSd2ZSBmb3VuZC4gICovCi0JCWZvdW5kX3JldmVyc2VfbWF0Y2ggPSB0LT5vcGNvZGVfbW9kaWZpZXIgJiAoRHxGbG9hdERSKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAvKiBmb3VuZCBhIGZvcndhcmQgMiBvcGVyYW5kIG1hdGNoIGhlcmUgKi8KLQkgICAgaWYgKHQtPm9wZXJhbmRzID09IDMpCi0JICAgICAgewotCQkvKiBIZXJlIHdlIG1ha2UgdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIG5vCi0JCSAgIHJldmVyc2UgbWF0Y2ggMyBvcGVyYW5kIGluc3RydWN0aW9ucywgYW5kIGFsbCAzCi0JCSAgIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zIG9ubHkgbmVlZCB0byBiZSBjaGVja2VkIGZvcgotCQkgICByZWdpc3RlciBjb25zaXN0ZW5jeSBiZXR3ZWVuIG9wZXJhbmRzIDIgYW5kIDMuICAqLwotCQlvdmVybGFwMiA9IGkudHlwZXNbMl0gJiB0LT5vcGVyYW5kX3R5cGVzWzJdOwotCQlpZiAoIU1BVENIIChvdmVybGFwMiwgaS50eXBlc1syXSwgdC0+b3BlcmFuZF90eXBlc1syXSkKLQkJICAgIHx8ICFDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIChvdmVybGFwMSwgaS50eXBlc1sxXSwKLQkJCQkJCSAgIHQtPm9wZXJhbmRfdHlwZXNbMV0sCi0JCQkJCQkgICBvdmVybGFwMiwgaS50eXBlc1syXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+b3BlcmFuZF90eXBlc1syXSkpCi0KLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgLyogZm91bmQgZWl0aGVyIGZvcndhcmQvcmV2ZXJzZSAyIG9yIDMgb3BlcmFuZCBtYXRjaCBoZXJlOgotCSAgICAgICBzbGlwIHRocm91Z2ggdG8gYnJlYWsgKi8KLQkgIH0KLQlicmVhazsJCQkvKiB3ZSd2ZSBmb3VuZCBhIG1hdGNoOyBicmVhayBvdXQgb2YgbG9vcCAqLwotICAgICAgfQkJCQkvKiBmb3IgKHQgPSAuLi4gKi8KLSAgICBpZiAodCA9PSBjdXJyZW50X3RlbXBsYXRlcy0+ZW5kKQotICAgICAgewkJCQkvKiB3ZSBmb3VuZCBubyBtYXRjaCAqLwotCWFzX2JhZCAoXygic3VmZml4IG9yIG9wZXJhbmRzIGludmFsaWQgZm9yIGAlcyciKSwKLQkJY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBpZiAoKHQtPm9wY29kZV9tb2RpZmllciAmIChJc1ByZWZpeHxJZ25vcmVTaXplKSkgPT0gKElzUHJlZml4fElnbm9yZVNpemUpKQotICAgICAgewotCS8qIFdhcm4gdGhlbSB0aGF0IGEgZGF0YSBvciBhZGRyZXNzIHNpemUgcHJlZml4IGRvZXNuJ3QgYWZmZWN0Ci0JICAgYXNzZW1ibHkgb2YgdGhlIG5leHQgbGluZSBvZiBjb2RlLiAgKi8KLQlhc193YXJuIChfKCJzdGFuZC1hbG9uZSBgJXMnIHByZWZpeCIpLCB0LT5uYW1lKTsKLSAgICAgIH0KLQotICAgIC8qIENvcHkgdGhlIHRlbXBsYXRlIHdlIGZvdW5kLiAgKi8KLSAgICBpLnRtID0gKnQ7Ci0gICAgaWYgKGZvdW5kX3JldmVyc2VfbWF0Y2gpCi0gICAgICB7Ci0JaS50bS5vcGVyYW5kX3R5cGVzWzBdID0gdC0+b3BlcmFuZF90eXBlc1sxXTsKLQlpLnRtLm9wZXJhbmRfdHlwZXNbMV0gPSB0LT5vcGVyYW5kX3R5cGVzWzBdOwotICAgICAgfQotCi0KLSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBGV2FpdCkKLSAgICAgIGlmICghIGFkZF9wcmVmaXggKEZXQUlUX09QQ09ERSkpCi0JcmV0dXJuOwotCi0gICAgLyogQ2hlY2sgc3RyaW5nIGluc3RydWN0aW9uIHNlZ21lbnQgb3ZlcnJpZGVzICovCi0gICAgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSAhPSAwICYmIGkubWVtX29wZXJhbmRzICE9IDApCi0gICAgICB7Ci0JaW50IG1lbV9vcCA9IChpLnR5cGVzWzBdICYgQW55TWVtKSA/IDAgOiAxOwotCWlmICgoaS50bS5vcGVyYW5kX3R5cGVzW21lbV9vcF0gJiBFc1NlZykgIT0gMCkKLQkgIHsKLQkgICAgaWYgKGkuc2VnWzBdICE9IE5VTEwgJiYgaS5zZWdbMF0gIT0gJmVzKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJgJXMnIG9wZXJhbmQgJWQgbXVzdCB1c2UgYCUlZXMnIHNlZ21lbnQiKSwKLQkJCWkudG0ubmFtZSwKLQkJCW1lbV9vcCArIDEpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICAvKiBUaGVyZSdzIG9ubHkgZXZlciBvbmUgc2VnbWVudCBvdmVycmlkZSBhbGxvd2VkIHBlciBpbnN0cnVjdGlvbi4KLQkgICAgICAgVGhpcyBpbnN0cnVjdGlvbiBwb3NzaWJseSBoYXMgYSBsZWdhbCBzZWdtZW50IG92ZXJyaWRlIG9uIHRoZQotCSAgICAgICBzZWNvbmQgb3BlcmFuZCwgc28gY29weSB0aGUgc2VnbWVudCB0byB3aGVyZSBub24tc3RyaW5nCi0JICAgICAgIGluc3RydWN0aW9ucyBzdG9yZSBpdCwgYWxsb3dpbmcgY29tbW9uIGNvZGUuICAqLwotCSAgICBpLnNlZ1swXSA9IGkuc2VnWzFdOwotCSAgfQotCWVsc2UgaWYgKChpLnRtLm9wZXJhbmRfdHlwZXNbbWVtX29wICsgMV0gJiBFc1NlZykgIT0gMCkKLQkgIHsKLQkgICAgaWYgKGkuc2VnWzFdICE9IE5VTEwgJiYgaS5zZWdbMV0gIT0gJmVzKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJgJXMnIG9wZXJhbmQgJWQgbXVzdCB1c2UgYCUlZXMnIHNlZ21lbnQiKSwKLQkJCWkudG0ubmFtZSwKLQkJCW1lbV9vcCArIDIpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gICAgLyogSWYgbWF0Y2hlZCBpbnN0cnVjdGlvbiBzcGVjaWZpZXMgYW4gZXhwbGljaXQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMKLSAgICAgICBzdWZmaXgsIHVzZSBpdC4gICovCi0gICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgKFNpemUxNiB8IFNpemUzMikpCi0gICAgICB7Ci0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgU2l6ZTE2KQotCSAgaS5zdWZmaXggPSBXT1JEX01ORU1fU1VGRklYOwotCWVsc2UKLQkgIGkuc3VmZml4ID0gRFdPUkRfTU5FTV9TVUZGSVg7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoaS5yZWdfb3BlcmFuZHMpCi0gICAgICB7Ci0JLyogSWYgdGhlcmUncyBubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggd2UgdHJ5IHRvIGludmVudCBvbmUKLQkgICBiYXNlZCBvbiByZWdpc3RlciBvcGVyYW5kcy4gKi8KLQlpZiAoIWkuc3VmZml4KQotCSAgewotCSAgICAvKiBXZSB0YWtlIGkuc3VmZml4IGZyb20gdGhlIGxhc3QgcmVnaXN0ZXIgb3BlcmFuZCBzcGVjaWZpZWQsCi0JICAgICAgIERlc3RpbmF0aW9uIHJlZ2lzdGVyIHR5cGUgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHNvdXJjZQotCSAgICAgICByZWdpc3RlciB0eXBlLiAgKi8KLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgaWYgKGkudHlwZXNbb3BdICYgUmVnKQotCQl7Ci0JCSAgaS5zdWZmaXggPSAoKGkudHlwZXNbb3BdICYgUmVnOCkgPyBCWVRFX01ORU1fU1VGRklYIDoKLQkJCSAgICAgIChpLnR5cGVzW29wXSAmIFJlZzE2KSA/IFdPUkRfTU5FTV9TVUZGSVggOgotCQkJICAgICAgRFdPUkRfTU5FTV9TVUZGSVgpOwotCQkgIGJyZWFrOwotCQl9Ci0JICB9Ci0JZWxzZSBpZiAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCkKLQkgIHsKLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgewotCQkvKiBJZiB0aGlzIGlzIGFuIGVpZ2h0IGJpdCByZWdpc3RlciwgaXQncyBPSy4gIElmIGl0J3MKLQkJICAgdGhlIDE2IG9yIDMyIGJpdCB2ZXJzaW9uIG9mIGFuIGVpZ2h0IGJpdCByZWdpc3RlciwKLQkJICAgd2Ugd2lsbCBqdXN0IHVzZSB0aGUgbG93IHBvcnRpb24sIGFuZCB0aGF0J3MgT0sgdG9vLiAqLwotCQlpZiAoaS50eXBlc1tvcF0gJiBSZWc4KQotCQkgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgLyogbW92enggYW5kIG1vdnN4IHNob3VsZCBub3QgZ2VuZXJhdGUgdGhpcyB3YXJuaW5nLiAqLwotICAgICAgICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgICAgJiYgKGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjcKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjYKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYmYpKQotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLQkJaWYgKChpLnR5cGVzW29wXSAmIFdvcmRSZWcpICYmIGkucmVnc1tvcF0tPnJlZ19udW0gPCA0Ci0jaWYgMAotCQkgICAgLyogQ2hlY2sgdGhhdCB0aGUgdGVtcGxhdGUgYWxsb3dzIGVpZ2h0IGJpdCByZWdzCi0JCSAgICAgICBUaGlzIGtpbGxzIGluc25zIHN1Y2ggYXMgYG9yYiAkMSwlZWR4Jywgd2hpY2gKLQkJICAgICAgIG1heWJlIHNob3VsZCBiZSBhbGxvd2VkLiAgKi8KLQkJICAgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzh8SW5PdXRQb3J0UmVnKSkKLSNlbmRpZgotCQkgICAgKQotCQkgIHsKLSNpZiBSRUdJU1RFUl9XQVJOSU5HUwotCQkgICAgaWYgKChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgSW5PdXRQb3J0UmVnKSA9PSAwKQotCQkgICAgICBhc193YXJuIChfKCJ1c2luZyBgJSUlcycgaW5zdGVhZCBvZiBgJSUlcycgZHVlIHRvIGAlYycgc3VmZml4IiksCi0JCQkgICAgICAgKGkucmVnc1tvcF0gLSAoaS50eXBlc1tvcF0gJiBSZWcxNiA/IDggOiAxNikpLT5yZWdfbmFtZSwKLQkJCSAgICAgICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgICAgICBpLnN1ZmZpeCk7Ci0jZW5kaWYKLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQkJLyogQW55IG90aGVyIHJlZ2lzdGVyIGlzIGJhZCAqLwotCQlpZiAoaS50eXBlc1tvcF0gJiAoUmVnIHwgUmVnTU1YIHwgUmVnWE1NCi0JCQkJICAgfCBTUmVnMiB8IFNSZWczCi0JCQkJICAgfCBDb250cm9sIHwgRGVidWcgfCBUZXN0Ci0JCQkJICAgfCBGbG9hdFJlZyB8IEZsb2F0QWNjKSkKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oImAlJSVzJyBub3QgYWxsb3dlZCB3aXRoIGAlcyVjJyIpLAotCQkJICAgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICAgIGkudG0ubmFtZSwKLQkJCSAgICBpLnN1ZmZpeCk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmIChpLnN1ZmZpeCA9PSBEV09SRF9NTkVNX1NVRkZJWCkKLQkgIHsKLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgLyogUmVqZWN0IGVpZ2h0IGJpdCByZWdpc3RlcnMsIGV4Y2VwdCB3aGVyZSB0aGUgdGVtcGxhdGUKLQkJIHJlcXVpcmVzIHRoZW0uIChlZy4gbW92emIpICAqLwotCSAgICAgIGlmICgoaS50eXBlc1tvcF0gJiBSZWc4KSAhPSAwCi0JCSAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMTZ8UmVnMzJ8QWNjKSkgIT0gMCkKLQkJewotCQkgIGFzX2JhZCAoXygiYCUlJXMnIG5vdCBhbGxvd2VkIHdpdGggYCVzJWMnIiksCi0JCQkgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICBpLnRtLm5hbWUsCi0JCQkgIGkuc3VmZml4KTsKLQkJICByZXR1cm47Ci0JCX0KLSNpZiBSRUdJU1RFUl9XQVJOSU5HUwotCSAgICAgIC8qIFdhcm4gaWYgdGhlIGUgcHJlZml4IG9uIGEgZ2VuZXJhbCByZWcgaXMgbWlzc2luZy4gICovCi0JICAgICAgZWxzZSBpZiAoKGkudHlwZXNbb3BdICYgUmVnMTYpICE9IDAKLQkJICAgICAgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzMyfEFjYykpICE9IDApCi0JCXsKLQkJICBhc193YXJuIChfKCJ1c2luZyBgJSUlcycgaW5zdGVhZCBvZiBgJSUlcycgZHVlIHRvIGAlYycgc3VmZml4IiksCi0JCQkgICAoaS5yZWdzW29wXSArIDgpLT5yZWdfbmFtZSwKLQkJCSAgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICAgaS5zdWZmaXgpOwotCQl9Ci0jZW5kaWYKLQkgIH0KLQllbHNlIGlmIChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYKQotCSAgewotCSAgICBpbnQgb3A7Ci0JICAgIGZvciAob3AgPSBpLm9wZXJhbmRzOyAtLW9wID49IDA7ICkKLQkgICAgICAvKiBSZWplY3QgZWlnaHQgYml0IHJlZ2lzdGVycywgZXhjZXB0IHdoZXJlIHRoZSB0ZW1wbGF0ZQotCQkgcmVxdWlyZXMgdGhlbS4gKGVnLiBtb3Z6YikgICovCi0JICAgICAgaWYgKChpLnR5cGVzW29wXSAmIFJlZzgpICE9IDAKLQkJICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWcxNnxSZWczMnxBY2MpKSAhPSAwKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciKSwKLQkJCSAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgIGkudG0ubmFtZSwKLQkJCSAgaS5zdWZmaXgpOwotCQkgIHJldHVybjsKLQkJfQotI2lmIFJFR0lTVEVSX1dBUk5JTkdTCi0JICAgICAgLyogV2FybiBpZiB0aGUgZSBwcmVmaXggb24gYSBnZW5lcmFsIHJlZyBpcyBwcmVzZW50LiAgKi8KLQkgICAgICBlbHNlIGlmICgoaS50eXBlc1tvcF0gJiBSZWczMikgIT0gMAotCQkgICAgICAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMTZ8QWNjKSkgIT0gMCkKLQkJewotCQkgIGFzX3dhcm4gKF8oInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiKSwKLQkJCSAgIChpLnJlZ3Nbb3BdIC0gOCktPnJlZ19uYW1lLAotCQkJICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgICBpLnN1ZmZpeCk7Ci0JCX0KLSNlbmRpZgotCSAgfQotCWVsc2UKLQkgIGFib3J0KCk7Ci0gICAgICB9Ci0KLSAgICAvKiBNYWtlIHN0aWxsIHVucmVzb2x2ZWQgaW1tZWRpYXRlIG1hdGNoZXMgY29uZm9ybSB0byBzaXplIG9mIGltbWVkaWF0ZQotICAgICAgIGdpdmVuIGluIGkuc3VmZml4LiAgTm90ZTogb3ZlcmxhcDIgY2Fubm90IGJlIGFuIGltbWVkaWF0ZSEgICovCi0gICAgaWYgKChvdmVybGFwMCAmIChJbW04IHwgSW1tOFMgfCBJbW0xNiB8IEltbTMyKSkKLQkmJiBvdmVybGFwMCAhPSBJbW04ICYmIG92ZXJsYXAwICE9IEltbThTCi0JJiYgb3ZlcmxhcDAgIT0gSW1tMTYgJiYgb3ZlcmxhcDAgIT0gSW1tMzIpCi0gICAgICB7Ci0JaWYgKGkuc3VmZml4KQotCSAgewotCSAgIG92ZXJsYXAwICY9IChpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYID8gKEltbTggfCBJbW04UykgOgotCQkJKGkuc3VmZml4ID09IFdPUkRfTU5FTV9TVUZGSVggPyBJbW0xNiA6IEltbTMyKSk7Ci0JICB9Ci0JZWxzZSBpZiAob3ZlcmxhcDAgPT0gKEltbTE2IHwgSW1tMzIpKQotCSAgewotCSAgIG92ZXJsYXAwID0KLQkgICAgICAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwKSkgPyBJbW0xNiA6IEltbTMyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW47IGNhbid0IGRldGVybWluZSBpbW1lZGlhdGUgc2l6ZSIpKTsKLQkgICAgcmV0dXJuOwotCSAgfQotICAgICAgfQotICAgIGlmICgob3ZlcmxhcDEgJiAoSW1tOCB8IEltbThTIHwgSW1tMTYgfCBJbW0zMikpCi0JJiYgb3ZlcmxhcDEgIT0gSW1tOCAmJiBvdmVybGFwMSAhPSBJbW04UwotCSYmIG92ZXJsYXAxICE9IEltbTE2ICYmIG92ZXJsYXAxICE9IEltbTMyKQotICAgICAgewotCWlmIChpLnN1ZmZpeCkKLQkgIHsKLQkgICBvdmVybGFwMSAmPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCA/IChJbW04IHwgSW1tOFMpIDoKLQkJCShpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYID8gSW1tMTYgOiBJbW0zMikpOwotCSAgfQotCWVsc2UgaWYgKG92ZXJsYXAxID09IChJbW0xNiB8IEltbTMyKSkKLQkgIHsKLQkgICBvdmVybGFwMSA9Ci0JICAgICAgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMCkpID8gSW1tMTYgOiBJbW0zMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGFzX2JhZCAoXygibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuOyBjYW4ndCBkZXRlcm1pbmUgaW1tZWRpYXRlIHNpemUiKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLSAgICBhc3NlcnQgKChvdmVybGFwMiAmIEltbSkgPT0gMCk7Ci0KLSAgICBpLnR5cGVzWzBdID0gb3ZlcmxhcDA7Ci0gICAgaWYgKG92ZXJsYXAwICYgSW1wbGljaXRSZWdpc3RlcikKLSAgICAgIGkucmVnX29wZXJhbmRzLS07Ci0gICAgaWYgKG92ZXJsYXAwICYgSW1tMSkKLSAgICAgIGkuaW1tX29wZXJhbmRzID0gMDsJLyoga2x1ZGdlIGZvciBzaGlmdCBpbnNucyAqLwotCi0gICAgaS50eXBlc1sxXSA9IG92ZXJsYXAxOwotICAgIGlmIChvdmVybGFwMSAmIEltcGxpY2l0UmVnaXN0ZXIpCi0gICAgICBpLnJlZ19vcGVyYW5kcy0tOwotCi0gICAgaS50eXBlc1syXSA9IG92ZXJsYXAyOwotICAgIGlmIChvdmVybGFwMiAmIEltcGxpY2l0UmVnaXN0ZXIpCi0gICAgICBpLnJlZ19vcGVyYW5kcy0tOwotCi0gICAgLyogRmluYWxpemUgb3Bjb2RlLiAgRmlyc3QsIHdlIGNoYW5nZSB0aGUgb3Bjb2RlIGJhc2VkIG9uIHRoZSBvcGVyYW5kCi0gICAgICAgc2l6ZSBnaXZlbiBieSBpLnN1ZmZpeDogIFdlIG5lZWQgbm90IGNoYW5nZSB0aGluZ3MgZm9yIGJ5dGUgaW5zbnMuICAqLwotCi0gICAgaWYgKCFpLnN1ZmZpeCAmJiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBXKSkKLSAgICAgIHsKLQlhc19iYWQgKF8oIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbiBhbmQgbm8gcmVnaXN0ZXIgb3BlcmFuZHM7IGNhbid0IHNpemUgaW5zdHJ1Y3Rpb24iKSk7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gICAgLyogRm9yIG1vdnp4IGFuZCBtb3ZzeCwgbmVlZCB0byBjaGVjayB0aGUgcmVnaXN0ZXIgdHlwZSAqLwotICAgIGlmIChpbnRlbF9zeW50YXgKLSAgICAgICAgJiYgKGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjYgfHwgaS50bS5iYXNlX29wY29kZSA9PSAweGZiZSkpCi0gICAgICBpZiAoaS5zdWZmaXggJiYgaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCkKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCBwcmVmaXggPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0KLSAgICAgICAgICBpZiAoKGkucmVnc1sxXS0+cmVnX3R5cGUgJiBSZWcxNikgIT0gMCkKLSAgICAgICAgICAgIGlmICghYWRkX3ByZWZpeCAocHJlZml4KSkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICBpZiAoaS5zdWZmaXggJiYgaS5zdWZmaXggIT0gQllURV9NTkVNX1NVRkZJWCkKLSAgICAgIHsKLQkvKiBJdCdzIG5vdCBhIGJ5dGUsIHNlbGVjdCB3b3JkL2R3b3JkIG9wZXJhdGlvbi4gICovCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVykKLQkgIHsKLQkgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgU2hvcnRGb3JtKQotCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gODsKLQkgICAgZWxzZQotCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gMTsKLQkgIH0KLQkvKiBOb3cgc2VsZWN0IGJldHdlZW4gd29yZCAmIGR3b3JkIG9wZXJhdGlvbnMgdmlhIHRoZSBvcGVyYW5kCi0JICAgc2l6ZSBwcmVmaXgsIGV4Y2VwdCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBpZ25vcmUgdGhpcwotCSAgIHByZWZpeCBhbnl3YXkuICAqLwotCWlmICgoKGludGVsX3N5bnRheCAmJiAoaS5zdWZmaXggPT0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpKQotICAgICAgICAgICAgIHx8IGkuc3VmZml4ID09IERXT1JEX01ORU1fU1VGRklYCi0JICAgICB8fCBpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYKSA9PSBmbGFnXzE2Yml0X2NvZGUKLQkgICAgJiYgIShpLnRtLm9wY29kZV9tb2RpZmllciAmIElnbm9yZVNpemUpKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgcHJlZml4ID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wQnl0ZSkgLyogamN4eiwgbG9vcCAqLwotCSAgICAgIHByZWZpeCA9IEFERFJfUFJFRklYX09QQ09ERTsKLQotCSAgICBpZiAoISBhZGRfcHJlZml4IChwcmVmaXgpKQotCSAgICAgIHJldHVybjsKLQkgIH0KLQkvKiBTaXplIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uLiAgKi8KLQlpZiAoaS5zdWZmaXggPT0gTE9OR19NTkVNX1NVRkZJWAotICAgICAgICAgICAgfHwgKGludGVsX3N5bnRheCAmJiBpLnN1ZmZpeCA9PSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCkpCi0JICB7Ci0JICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEZsb2F0TUYpCi0JICAgICAgaS50bS5iYXNlX29wY29kZSBePSA0OwotCSAgfQotCi0gICAgICAgIGlmIChpbnRlbF9zeW50YXggJiYgaS5zdWZmaXggPT0gTE9OR19ET1VCTEVfTU5FTV9TVUZGSVgpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgRmxvYXRNRikKLSAgICAgICAgICAgICAgaS50bS5iYXNlX29wY29kZSBePSAyOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEltbUV4dCkKLSAgICAgIHsKLQkvKiBUaGVzZSBBTUQgM0ROb3chIGFuZCBJbnRlbCBLYXRtYWkgTmV3IEluc3RydWN0aW9ucyBoYXZlIGFuCi0JICAgb3Bjb2RlIHN1ZmZpeCB3aGljaCBpcyBjb2RlZCBpbiB0aGUgc2FtZSBwbGFjZSBhcyBhbiA4LWJpdAotCSAgIGltbWVkaWF0ZSBmaWVsZCB3b3VsZCBiZS4gIEhlcmUgd2UgZmFrZSBhbiA4LWJpdCBpbW1lZGlhdGUKLQkgICBvcGVyYW5kIGZyb20gdGhlIG9wY29kZSBzdWZmaXggc3RvcmVkIGluIHRtLmV4dGVuc2lvbl9vcGNvZGUuICAqLwotCi0JZXhwcmVzc2lvblMgKmV4cDsKLQotCWFzc2VydChpLmltbV9vcGVyYW5kcyA9PSAwICYmIGkub3BlcmFuZHMgPD0gMik7Ci0KLQlleHAgPSAmaW1fZXhwcmVzc2lvbnNbaS5pbW1fb3BlcmFuZHMrK107Ci0JaS5pbW1zW2kub3BlcmFuZHNdID0gZXhwOwotCWkudHlwZXNbaS5vcGVyYW5kcysrXSA9IEltbTg7Ci0JZXhwLT5YX29wID0gT19jb25zdGFudDsKLQlleHAtPlhfYWRkX251bWJlciA9IGkudG0uZXh0ZW5zaW9uX29wY29kZTsKLQlpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPSBOb25lOwotICAgICAgfQotCi0gICAgLyogRm9yIGluc25zIHdpdGggb3BlcmFuZHMgdGhlcmUgYXJlIG1vcmUgZGlkZGxlcyB0byBkbyB0byB0aGUgb3Bjb2RlLiAqLwotICAgIGlmIChpLm9wZXJhbmRzKQotICAgICAgewotICAgICAgICAvKiBEZWZhdWx0IHNlZ21lbnQgcmVnaXN0ZXIgdGhpcyBpbnN0cnVjdGlvbiB3aWxsIHVzZQotCSAgIGZvciBtZW1vcnkgYWNjZXNzZXMuICAwIG1lYW5zIHVua25vd24uCi0JICAgVGhpcyBpcyBvbmx5IGZvciBvcHRpbWl6aW5nIG91dCB1bm5lY2Vzc2FyeSBzZWdtZW50IG92ZXJyaWRlcy4gICovCi0JY29uc3Qgc2VnX2VudHJ5ICpkZWZhdWx0X3NlZyA9IDA7Ci0KLQkvKiBJZiB3ZSBmb3VuZCBhIHJldmVyc2UgbWF0Y2ggd2UgbXVzdCBhbHRlciB0aGUgb3Bjb2RlCi0JICAgZGlyZWN0aW9uIGJpdC4gIGZvdW5kX3JldmVyc2VfbWF0Y2ggaG9sZHMgYml0cyB0byBjaGFuZ2UKLQkgICAoZGlmZmVyZW50IGZvciBpbnQgJiBmbG9hdCBpbnNucykuICAqLwotCi0JaS50bS5iYXNlX29wY29kZSBePSBmb3VuZF9yZXZlcnNlX21hdGNoOwotCi0JLyogVGhlIGltdWwgJGltbSwgJXJlZyBpbnN0cnVjdGlvbiBpcyBjb252ZXJ0ZWQgaW50bwotCSAgIGltdWwgJGltbSwgJXJlZywgJXJlZywgYW5kIHRoZSBjbHIgJXJlZyBpbnN0cnVjdGlvbgotCSAgIGlzIGNvbnZlcnRlZCBpbnRvIHhvciAlcmVnLCAlcmVnLiAgKi8KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiByZWdLbHVkZ2UpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBmaXJzdF9yZWdfb3AgPSAoaS50eXBlc1swXSAmIFJlZykgPyAwIDogMTsKLQkgICAgLyogUHJldGVuZCB3ZSBzYXcgdGhlIGV4dHJhIHJlZ2lzdGVyIG9wZXJhbmQuICovCi0JICAgIGkucmVnc1tmaXJzdF9yZWdfb3ArMV0gPSBpLnJlZ3NbZmlyc3RfcmVnX29wXTsKLQkgICAgaS5yZWdfb3BlcmFuZHMgPSAyOwotCSAgfQotCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgU2hvcnRGb3JtKQotCSAgewotCSAgICAvKiBUaGUgcmVnaXN0ZXIgb3IgZmxvYXQgcmVnaXN0ZXIgb3BlcmFuZCBpcyBpbiBvcGVyYW5kIDAgb3IgMS4gKi8KLQkgICAgdW5zaWduZWQgaW50IG9wID0gKGkudHlwZXNbMF0gJiAoUmVnIHwgRmxvYXRSZWcpKSA/IDAgOiAxOwotCSAgICAvKiBSZWdpc3RlciBnb2VzIGluIGxvdyAzIGJpdHMgb2Ygb3Bjb2RlLiAqLwotCSAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IGkucmVnc1tvcF0tPnJlZ19udW07Ci0JICAgIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBVZ2gpICE9IDApCi0JICAgICAgewotCQkvKiBXYXJuIGFib3V0IHNvbWUgY29tbW9uIGVycm9ycywgYnV0IHByZXNzIG9uIHJlZ2FyZGxlc3MuCi0JCSAgIFRoZSBmaXJzdCBjYXNlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgZ2NjICg8PSAyLjguMSkuICAqLwotCQlpZiAoaS5vcGVyYW5kcyA9PSAyKQotCQkgIHsKLQkJICAgIC8qIHJldmVyc2VkIGFyZ3VtZW50cyBvbiBmYWRkcCwgZnN1YnAsIGV0Yy4gKi8KLQkJICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIHRvIGAlcyAlJSVzLCUlJXMnIiksIGkudG0ubmFtZSwKLQkJCSAgICAgaS5yZWdzWzFdLT5yZWdfbmFtZSwKLQkJCSAgICAgaS5yZWdzWzBdLT5yZWdfbmFtZSk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogZXh0cmFuZW91cyBgbCcgc3VmZml4IG9uIGZwIGluc24gKi8KLQkJICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIHRvIGAlcyAlJSVzJyIpLCBpLnRtLm5hbWUsCi0JCQkgICAgIGkucmVnc1swXS0+cmVnX25hbWUpOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBNb2RybSkKLQkgIHsKLQkgICAgLyogVGhlIG9wY29kZSBpcyBjb21wbGV0ZWQgKG1vZHVsbyBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgd2hpY2gKLQkgICAgICAgbXVzdCBiZSBwdXQgaW50byB0aGUgbW9kcm0gYnl0ZSkuCi0JICAgICAgIE5vdywgd2UgbWFrZSB0aGUgbW9kcm0gJiBpbmRleCBiYXNlIGJ5dGVzIGJhc2VkIG9uIGFsbCB0aGUKLQkgICAgICAgaW5mbyB3ZSd2ZSBjb2xsZWN0ZWQuICovCi0KLQkgICAgLyogaS5yZWdfb3BlcmFuZHMgTVVTVCBiZSB0aGUgbnVtYmVyIG9mIHJlYWwgcmVnaXN0ZXIgb3BlcmFuZHM7Ci0JICAgICAgIGltcGxpY2l0IHJlZ2lzdGVycyBkbyBub3QgY291bnQuICovCi0JICAgIGlmIChpLnJlZ19vcGVyYW5kcyA9PSAyKQotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IHNvdXJjZSwgZGVzdDsKLQkJc291cmNlID0gKChpLnR5cGVzWzBdCi0JCQkgICAmIChSZWcgfCBSZWdNTVggfCBSZWdYTU0KLQkJCSAgICAgIHwgU1JlZzIgfCBTUmVnMwotCQkJICAgICAgfCBDb250cm9sIHwgRGVidWcgfCBUZXN0KSkKLQkJCSAgPyAwIDogMSk7Ci0JCWRlc3QgPSBzb3VyY2UgKyAxOwotCi0JCWkucm0ubW9kZSA9IDM7Ci0JCS8qIE9uZSBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMgd2lsbCBiZSBlbmNvZGVkIGluIHRoZQotCQkgICBpLnRtLnJlZyBmaWVsZCwgdGhlIG90aGVyIGluIHRoZSBjb21iaW5lZCBpLnRtLm1vZGUKLQkJICAgYW5kIGkudG0ucmVnbWVtIGZpZWxkcy4gIElmIG5vIGZvcm0gb2YgdGhpcwotCQkgICBpbnN0cnVjdGlvbiBzdXBwb3J0cyBhIG1lbW9yeSBkZXN0aW5hdGlvbiBvcGVyYW5kLAotCQkgICB0aGVuIHdlIGFzc3VtZSB0aGUgc291cmNlIG9wZXJhbmQgbWF5IHNvbWV0aW1lcyBiZQotCQkgICBhIG1lbW9yeSBvcGVyYW5kIGFuZCBzbyB3ZSBuZWVkIHRvIHN0b3JlIHRoZQotCQkgICBkZXN0aW5hdGlvbiBpbiB0aGUgaS5ybS5yZWcgZmllbGQuICAqLwotCQlpZiAoKGkudG0ub3BlcmFuZF90eXBlc1tkZXN0XSAmIEFueU1lbSkgPT0gMCkKLQkJICB7Ci0JCSAgICBpLnJtLnJlZyA9IGkucmVnc1tkZXN0XS0+cmVnX251bTsKLQkJICAgIGkucm0ucmVnbWVtID0gaS5yZWdzW3NvdXJjZV0tPnJlZ19udW07Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaS5ybS5yZWcgPSBpLnJlZ3Nbc291cmNlXS0+cmVnX251bTsKLQkJICAgIGkucm0ucmVnbWVtID0gaS5yZWdzW2Rlc3RdLT5yZWdfbnVtOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7CQkJLyogaWYgaXQncyBub3QgMiByZWcgb3BlcmFuZHMuLi4gKi8KLQkJaWYgKGkubWVtX29wZXJhbmRzKQotCQkgIHsKLQkJICAgIHVuc2lnbmVkIGludCBmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMDsKLQkJICAgIHVuc2lnbmVkIGludCBvcCA9ICgoaS50eXBlc1swXSAmIEFueU1lbSkKLQkJCQkgICAgICAgPyAwCi0JCQkJICAgICAgIDogKGkudHlwZXNbMV0gJiBBbnlNZW0pID8gMSA6IDIpOwotCi0JCSAgICBkZWZhdWx0X3NlZyA9ICZkczsKLQotCQkgICAgaWYgKCEgaS5iYXNlX3JlZykKLQkJICAgICAgewotCQkJaS5ybS5tb2RlID0gMDsKLQkJCWlmICghIGkuZGlzcF9vcGVyYW5kcykKLQkJCSAgZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDE7Ci0JCQlpZiAoISBpLmluZGV4X3JlZykKLQkJCSAgewotCQkJICAgIC8qIE9wZXJhbmQgaXMganVzdCA8ZGlzcD4gKi8KLQkJCSAgICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSkKLQkJCSAgICAgIHsKLQkJCQlpLnJtLnJlZ21lbSA9IE5PX0JBU0VfUkVHSVNURVJfMTY7Ci0JCQkJaS50eXBlc1tvcF0gJj0gfkRpc3A7Ci0JCQkJaS50eXBlc1tvcF0gfD0gRGlzcDE2OwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlpLnJtLnJlZ21lbSA9IE5PX0JBU0VfUkVHSVNURVI7Ci0JCQkJaS50eXBlc1tvcF0gJj0gfkRpc3A7Ci0JCQkJaS50eXBlc1tvcF0gfD0gRGlzcDMyOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQllbHNlIC8qICEgaS5iYXNlX3JlZyAmJiBpLmluZGV4X3JlZyAqLwotCQkJICB7Ci0JCQkgICAgaS5zaWIuaW5kZXggPSBpLmluZGV4X3JlZy0+cmVnX251bTsKLQkJCSAgICBpLnNpYi5iYXNlID0gTk9fQkFTRV9SRUdJU1RFUjsKLQkJCSAgICBpLnNpYi5zY2FsZSA9IGkubG9nMl9zY2FsZV9mYWN0b3I7Ci0JCQkgICAgaS5ybS5yZWdtZW0gPSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORzsKLQkJCSAgICBpLnR5cGVzW29wXSAmPSB+RGlzcDsKLQkJCSAgICBpLnR5cGVzW29wXSB8PSBEaXNwMzI7CS8qIE11c3QgYmUgMzIgYml0ICovCi0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWcxNikKLQkJICAgICAgewotCQkJc3dpdGNoIChpLmJhc2VfcmVnLT5yZWdfbnVtKQotCQkJICB7Ci0JCQkgIGNhc2UgMzogLyogKCVieCkgKi8KLQkJCSAgICBpZiAoISBpLmluZGV4X3JlZykKLQkJCSAgICAgIGkucm0ucmVnbWVtID0gNzsKLQkJCSAgICBlbHNlIC8qICglYngsJXNpKSAtPiAwLCBvciAoJWJ4LCVkaSkgLT4gMSAqLwotCQkJICAgICAgaS5ybS5yZWdtZW0gPSBpLmluZGV4X3JlZy0+cmVnX251bSAtIDY7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgNTogLyogKCVicCkgKi8KLQkJCSAgICBkZWZhdWx0X3NlZyA9ICZzczsKLQkJCSAgICBpZiAoISBpLmluZGV4X3JlZykKLQkJCSAgICAgIHsKLQkJCQlpLnJtLnJlZ21lbSA9IDY7Ci0JCQkJaWYgKChpLnR5cGVzW29wXSAmIERpc3ApID09IDApCi0JCQkJICB7Ci0JCQkJICAgIC8qIGZha2UgKCVicCkgaW50byAwKCVicCkgKi8KLQkJCQkgICAgaS50eXBlc1tvcF0gfD0gRGlzcDg7Ci0JCQkJICAgIGZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAxOwotCQkJCSAgfQotCQkJICAgICAgfQotCQkJICAgIGVsc2UgLyogKCVicCwlc2kpIC0+IDIsIG9yICglYnAsJWRpKSAtPiAzICovCi0JCQkgICAgICBpLnJtLnJlZ21lbSA9IGkuaW5kZXhfcmVnLT5yZWdfbnVtIC0gNiArIDI7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGRlZmF1bHQ6IC8qICglc2kpIC0+IDQgb3IgKCVkaSkgLT4gNSAqLwotCQkJICAgIGkucm0ucmVnbWVtID0gaS5iYXNlX3JlZy0+cmVnX251bSAtIDYgKyA0OwotCQkJICB9Ci0JCQlpLnJtLm1vZGUgPSBtb2RlX2Zyb21fZGlzcF9zaXplIChpLnR5cGVzW29wXSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgLyogaS5iYXNlX3JlZyBhbmQgMzIgYml0IG1vZGUgKi8KLQkJICAgICAgewotCQkJaS5ybS5yZWdtZW0gPSBpLmJhc2VfcmVnLT5yZWdfbnVtOwotCQkJaS5zaWIuYmFzZSA9IGkuYmFzZV9yZWctPnJlZ19udW07Ci0JCQlpZiAoaS5iYXNlX3JlZy0+cmVnX251bSA9PSBFQlBfUkVHX05VTSkKLQkJCSAgewotCQkJICAgIGRlZmF1bHRfc2VnID0gJnNzOwotCQkJICAgIGlmIChpLmRpc3Bfb3BlcmFuZHMgPT0gMCkKLQkJCSAgICAgIHsKLQkJCQlmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMTsKLQkJCQlpLnR5cGVzW29wXSB8PSBEaXNwODsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJZWxzZSBpZiAoaS5iYXNlX3JlZy0+cmVnX251bSA9PSBFU1BfUkVHX05VTSkKLQkJCSAgewotCQkJICAgIGRlZmF1bHRfc2VnID0gJnNzOwotCQkJICB9Ci0JCQlpLnNpYi5zY2FsZSA9IGkubG9nMl9zY2FsZV9mYWN0b3I7Ci0JCQlpZiAoISBpLmluZGV4X3JlZykKLQkJCSAgewotCQkJICAgIC8qIDxkaXNwPiglZXNwKSBiZWNvbWVzIHR3byBieXRlIG1vZHJtCi0JCQkgICAgICAgd2l0aCBubyBpbmRleCByZWdpc3Rlci4gIFdlJ3ZlIGFscmVhZHkKLQkJCSAgICAgICBzdG9yZWQgdGhlIGNvZGUgZm9yIGVzcCBpbiBpLnJtLnJlZ21lbQotCQkJICAgICAgIGllLiBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORy4gIEFueQotCQkJICAgICAgIGJhc2UgcmVnaXN0ZXIgYmVzaWRlcyAlZXNwIHdpbGwgbm90IHVzZQotCQkJICAgICAgIHRoZSBleHRyYSBtb2RybSBieXRlLiAgKi8KLQkJCSAgICBpLnNpYi5pbmRleCA9IE5PX0lOREVYX1JFR0lTVEVSOwotI2lmICEgU0NBTEUxX1dIRU5fTk9fSU5ERVgKLQkJCSAgICAvKiBBbm90aGVyIGNhc2Ugd2hlcmUgd2UgZm9yY2UgdGhlIHNlY29uZAotCQkJICAgICAgIG1vZHJtIGJ5dGUuICAqLwotCQkJICAgIGlmIChpLmxvZzJfc2NhbGVfZmFjdG9yKQotCQkJICAgICAgaS5ybS5yZWdtZW0gPSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORzsKLSNlbmRpZgotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpLnNpYi5pbmRleCA9IGkuaW5kZXhfcmVnLT5yZWdfbnVtOwotCQkJICAgIGkucm0ucmVnbWVtID0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkc7Ci0JCQkgIH0KLQkJCWkucm0ubW9kZSA9IG1vZGVfZnJvbV9kaXNwX3NpemUgKGkudHlwZXNbb3BdKTsKLQkJICAgICAgfQotCi0JCSAgICBpZiAoZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCkKLQkJICAgICAgewotCQkJLyogRmFrZXMgYSB6ZXJvIGRpc3BsYWNlbWVudCBhc3N1bWluZyB0aGF0IGkudHlwZXNbb3BdCi0JCQkgICBob2xkcyB0aGUgY29ycmVjdCBkaXNwbGFjZW1lbnQgc2l6ZS4gKi8KLQkJCWV4cCA9ICZkaXNwX2V4cHJlc3Npb25zW2kuZGlzcF9vcGVyYW5kcysrXTsKLQkJCWkuZGlzcHNbb3BdID0gZXhwOwotCQkJZXhwLT5YX29wID0gT19jb25zdGFudDsKLQkJCWV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLQkJCWV4cC0+WF9hZGRfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLQkJCWV4cC0+WF9vcF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCS8qIEZpbGwgaW4gaS5ybS5yZWcgb3IgaS5ybS5yZWdtZW0gZmllbGQgd2l0aCByZWdpc3RlcgotCQkgICBvcGVyYW5kIChpZiBhbnkpIGJhc2VkIG9uIGkudG0uZXh0ZW5zaW9uX29wY29kZS4KLQkJICAgQWdhaW4sIHdlIG11c3QgYmUgY2FyZWZ1bCB0byBtYWtlIHN1cmUgdGhhdAotCQkgICBzZWdtZW50L2NvbnRyb2wvZGVidWcvdGVzdC9NTVggcmVnaXN0ZXJzIGFyZSBjb2RlZAotCQkgICBpbnRvIHRoZSBpLnJtLnJlZyBmaWVsZC4gKi8KLQkJaWYgKGkucmVnX29wZXJhbmRzKQotCQkgIHsKLQkJICAgIHVuc2lnbmVkIGludCBvcCA9Ci0JCSAgICAgICgoaS50eXBlc1swXQotCQkJJiAoUmVnIHwgUmVnTU1YIHwgUmVnWE1NCi0JCQkgICB8IFNSZWcyIHwgU1JlZzMKLQkJCSAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCkpCi0JCSAgICAgICA/IDAKLQkJICAgICAgIDogKChpLnR5cGVzWzFdCi0JCQkgICAmIChSZWcgfCBSZWdNTVggfCBSZWdYTU0KLQkJCSAgICAgIHwgU1JlZzIgfCBTUmVnMwotCQkJICAgICAgfCBDb250cm9sIHwgRGVidWcgfCBUZXN0KSkKLQkJCSAgPyAxCi0JCQkgIDogMikpOwotCQkgICAgLyogSWYgdGhlcmUgaXMgYW4gZXh0ZW5zaW9uIG9wY29kZSB0byBwdXQgaGVyZSwgdGhlCi0JCSAgICAgICByZWdpc3RlciBudW1iZXIgbXVzdCBiZSBwdXQgaW50byB0aGUgcmVnbWVtIGZpZWxkLiAqLwotCQkgICAgaWYgKGkudG0uZXh0ZW5zaW9uX29wY29kZSAhPSBOb25lKQotCQkgICAgICBpLnJtLnJlZ21lbSA9IGkucmVnc1tvcF0tPnJlZ19udW07Ci0JCSAgICBlbHNlCi0JCSAgICAgIGkucm0ucmVnID0gaS5yZWdzW29wXS0+cmVnX251bTsKLQotCQkgICAgLyogTm93LCBpZiBubyBtZW1vcnkgb3BlcmFuZCBoYXMgc2V0IGkucm0ubW9kZSA9IDAsIDEsIDIKLQkJICAgICAgIHdlIG11c3Qgc2V0IGl0IHRvIDMgdG8gaW5kaWNhdGUgdGhpcyBpcyBhIHJlZ2lzdGVyCi0JCSAgICAgICBvcGVyYW5kIGluIHRoZSByZWdtZW0gZmllbGQuICAqLwotCQkgICAgaWYgKCFpLm1lbV9vcGVyYW5kcykKLQkJICAgICAgaS5ybS5tb2RlID0gMzsKLQkJICB9Ci0KLQkJLyogRmlsbCBpbiBpLnJtLnJlZyBmaWVsZCB3aXRoIGV4dGVuc2lvbiBvcGNvZGUgKGlmIGFueSkuICovCi0JCWlmIChpLnRtLmV4dGVuc2lvbl9vcGNvZGUgIT0gTm9uZSkKLQkJICBpLnJtLnJlZyA9IGkudG0uZXh0ZW5zaW9uX29wY29kZTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiAoU2VnMlNob3J0Rm9ybSB8IFNlZzNTaG9ydEZvcm0pKQotCSAgewotCSAgICBpZiAoaS50bS5iYXNlX29wY29kZSA9PSBQT1BfU0VHX1NIT1JUICYmIGkucmVnc1swXS0+cmVnX251bSA9PSAxKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJ5b3UgY2FuJ3QgYHBvcCAlJWNzJyIpKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgaS50bS5iYXNlX29wY29kZSB8PSAoaS5yZWdzWzBdLT5yZWdfbnVtIDw8IDMpOwotCSAgfQotCWVsc2UgaWYgKChpLnRtLmJhc2Vfb3Bjb2RlICYgfihEfFcpKSA9PSBNT1ZfQVhfRElTUDMyKQotCSAgewotCSAgICBkZWZhdWx0X3NlZyA9ICZkczsKLQkgIH0KLQllbHNlIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykgIT0gMCkKLQkgIHsKLQkgICAgLyogRm9yIHRoZSBzdHJpbmcgaW5zdHJ1Y3Rpb25zIHRoYXQgYWxsb3cgYSBzZWdtZW50IG92ZXJyaWRlCi0JICAgICAgIG9uIG9uZSBvZiB0aGVpciBvcGVyYW5kcywgdGhlIGRlZmF1bHQgc2VnbWVudCBpcyBkcy4gICovCi0JICAgIGRlZmF1bHRfc2VnID0gJmRzOwotCSAgfQotCi0JLyogSWYgYSBzZWdtZW50IHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCwKLQkgICBhbmQgdGhlIHNwZWNpZmllZCBzZWdtZW50IGlzIG5vdCB0aGUgZGVmYXVsdCwKLQkgICB1c2UgYW4gb3Bjb2RlIHByZWZpeCB0byBzZWxlY3QgaXQuCi0JICAgSWYgd2UgbmV2ZXIgZmlndXJlZCBvdXQgd2hhdCB0aGUgZGVmYXVsdCBzZWdtZW50IGlzLAotCSAgIHRoZW4gZGVmYXVsdF9zZWcgd2lsbCBiZSB6ZXJvIGF0IHRoaXMgcG9pbnQsCi0JICAgYW5kIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBwcmVmaXggd2lsbCBhbHdheXMgYmUgdXNlZC4gICovCi0JaWYgKChpLnNlZ1swXSkgJiYgKGkuc2VnWzBdICE9IGRlZmF1bHRfc2VnKSkKLQkgIHsKLQkgICAgaWYgKCEgYWRkX3ByZWZpeCAoaS5zZWdbMF0tPnNlZ19wcmVmaXgpKQotCSAgICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLSAgICBlbHNlIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBVZ2gpICE9IDApCi0gICAgICB7Ci0gICAgICAgLyogVW5peFdhcmUgZnN1YiBubyBhcmdzIGlzIGFsaWFzIGZvciBmc3VicCwgZmFkZCAtPiBmYWRkcCwgZXRjICovCi0gICAgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgdG8gYCVzcCciKSwgaS50bS5uYW1lKTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIEhhbmRsZSBjb252ZXJzaW9uIG9mICdpbnQgJDMnIC0tPiBzcGVjaWFsIGludDMgaW5zbi4gKi8KLSAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gSU5UX09QQ09ERSAmJiBpLmltbXNbMF0tPlhfYWRkX251bWJlciA9PSAzKQotICAgIHsKLSAgICAgIGkudG0uYmFzZV9vcGNvZGUgPSBJTlQzX09QQ09ERTsKLSAgICAgIGkuaW1tX29wZXJhbmRzID0gMDsKLSAgICB9Ci0KLSAgLyogV2UgYXJlIHJlYWR5IHRvIG91dHB1dCB0aGUgaW5zbi4gKi8KLSAgewotICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0KLSAgICAvKiBPdXRwdXQganVtcHMuICovCi0gICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSnVtcCkKLSAgICAgIHsKLQlsb25nIG4gPSAobG9uZykgaS5kaXNwc1swXS0+WF9hZGRfbnVtYmVyOwotCWludCBwcmVmaXggPSAoaS5wcmVmaXhbREFUQV9QUkVGSVhdICE9IDApOwotCWludCBjb2RlMTYgPSAwOwotCi0JaWYgKHByZWZpeCkKLQkgIHsKLQkgICAgaS5wcmVmaXhlcyAtPSAxOwotCSAgICBjb2RlMTYgPSBDT0RFMTY7Ci0JICB9Ci0JaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgIGNvZGUxNiBePSBDT0RFMTY7Ci0KLQlpZiAoIWludGVsX3N5bnRheCAmJiAoaS5wcmVmaXhlcyAhPSAwKSkKLQkgIGFzX3dhcm4gKF8oInNraXBwaW5nIHByZWZpeGVzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24iKSk7Ci0KLQlpZiAoaS5kaXNwc1swXS0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgewotCSAgICBpZiAoZml0c19pbl9zaWduZWRfYnl0ZSAobikpCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMjsKLQkJcCA9IGZyYWdfbW9yZSAoMik7Ci0JCXBbMF0gPSBpLnRtLmJhc2Vfb3Bjb2RlOwotCQlwWzFdID0gbjsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JICAgICAgICAvKiBVc2UgMTYtYml0IGp1bXBzIG9ubHkgZm9yIDE2LWJpdCBjb2RlLAotCQkgICBiZWNhdXNlIHRleHQgc2VnbWVudHMgYXJlIGxpbWl0ZWQgdG8gNjRLIGFueXdheTsKLQkgICAgICAgICAgIFVzZSAzMi1iaXQganVtcHMgZm9yIDMyLWJpdCBjb2RlLCBiZWNhdXNlIHRoZXkncmUgZmFzdGVyLAotCQkgICBhbmQgYSAxNi1iaXQganVtcCB3aWxsIGNsZWFyIHRoZSB0b3AgMTYgYml0cyBvZiAlZWlwLiAgKi8KLQkJaW50IGptcF9zaXplID0gY29kZTE2ID8gMiA6IDQ7Ci0JICAgICAgCWlmIChjb2RlMTYgJiYgIWZpdHNfaW5fc2lnbmVkX3dvcmQgKG4pKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiMTYtYml0IGp1bXAgb3V0IG9mIHJhbmdlIikpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQotCQlpZiAoaS50bS5iYXNlX29wY29kZSA9PSBKVU1QX1BDX1JFTEFUSVZFKQotCQkgIHsJCS8qIHBhY2UgKi8KLQkJICAgIC8qIHVuY29uZGl0aW9uYWwganVtcCAqLwotCQkgICAgaW5zbl9zaXplICs9IHByZWZpeCArIDEgKyBqbXBfc2l6ZTsKLQkJICAgIHAgPSBmcmFnX21vcmUgKHByZWZpeCArIDEgKyBqbXBfc2l6ZSk7Ci0JCSAgICBpZiAocHJlZml4KQotCQkgICAgICAqcCsrID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCQkgICAgKnArKyA9IChjaGFyKSAweGU5OwotCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBuLCBqbXBfc2l6ZSk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogY29uZGl0aW9uYWwganVtcCAqLwotCQkgICAgaW5zbl9zaXplICs9IHByZWZpeCArIDIgKyBqbXBfc2l6ZTsKLQkJICAgIHAgPSBmcmFnX21vcmUgKHByZWZpeCArIDIgKyBqbXBfc2l6ZSk7Ci0JCSAgICBpZiAocHJlZml4KQotCQkgICAgICAqcCsrID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCQkgICAgKnArKyA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7Ci0JCSAgICAqcCsrID0gaS50bS5iYXNlX29wY29kZSArIDB4MTA7Ci0JCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIG4sIGptcF9zaXplKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaW50IHNpemUgPSBjb2RlMTYgPyAyIDogNDsKLQotCSAgICAvKiBJdCdzIGEgc3ltYm9sOyBlbmQgZnJhZyAmIHNldHVwIGZvciByZWxheC4KLQkgICAgICAgTWFrZSBzdXJlIHRoZXJlIGFyZSBtb3JlIHRoYW4gNiBjaGFycyBsZWZ0IGluIHRoZSBjdXJyZW50IGZyYWc7Ci0JICAgICAgIGlmIG5vdCB3ZSdsbCBoYXZlIHRvIHN0YXJ0IGEgbmV3IG9uZS4gKi8KLQkgICAgZnJhZ19ncm93IChwcmVmaXggKyAxICsgMiArIHNpemUpOwotCSAgICBpbnNuX3NpemUgKz0gMSArIHByZWZpeDsKLQkgICAgcCA9IGZyYWdfbW9yZSAoMSArIHByZWZpeCk7Ci0JICAgIGlmIChwcmVmaXgpCi0JICAgICAgKnArKyA9IERBVEFfUFJFRklYX09QQ09ERTsKLQkgICAgKnAgPSBpLnRtLmJhc2Vfb3Bjb2RlOwotCSAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCSAgICAgIHByZWZpeCArIDIgKyBzaXplLCAvKiAyIG9wY29kZS9wcmVmaXggKyBkaXNwbGFjZW1lbnQgKi8KLQkJICAgICAgMSwKLQkJICAgICAgKCh1bnNpZ25lZCBjaGFyKSAqcCA9PSBKVU1QX1BDX1JFTEFUSVZFCi0JCSAgICAgICA/IEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIFNNQUxMKSB8IGNvZGUxNgotCQkgICAgICAgOiBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgU01BTEwpIHwgY29kZTE2KSwKLQkJICAgICAgaS5kaXNwc1swXS0+WF9hZGRfc3ltYm9sLAotCQkgICAgICAob2Zmc2V0VCkgbiwgcCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiAoSnVtcEJ5dGUgfCBKdW1wRHdvcmQpKQotICAgICAgewotCWludCBzaXplID0gKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSnVtcEJ5dGUpID8gMSA6IDQ7Ci0JbG9uZyBuID0gKGxvbmcpIGkuZGlzcHNbMF0tPlhfYWRkX251bWJlcjsKLQotCWlmIChzaXplID09IDEpIC8qIHRoZW4gdGhpcyBpcyBhIGxvb3Agb3IgamVjeHogdHlwZSBpbnN0cnVjdGlvbiAqLwotCSAgewotCSAgICBpZiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDE7Ci0JCUZSQUdfQVBQRU5EXzFfQ0hBUiAoQUREUl9QUkVGSVhfT1BDT0RFKTsKLQkJaS5wcmVmaXhlcyAtPSAxOwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGludCBjb2RlMTYgPSAwOwotCi0JICAgIGlmIChpLnByZWZpeFtEQVRBX1BSRUZJWF0pCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJRlJBR19BUFBFTkRfMV9DSEFSIChEQVRBX1BSRUZJWF9PUENPREUpOwotCQlpLnByZWZpeGVzIC09IDE7Ci0JCWNvZGUxNiA9IENPREUxNjsKLQkgICAgICB9Ci0JICAgIGlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICAgICAgY29kZTE2IF49IENPREUxNjsKLQotCSAgICBpZiAoY29kZTE2KQotCSAgICAgIHNpemUgPSAyOwotCSAgfQotCi0JaWYgKCFpbnRlbF9zeW50YXggJiYgKGkucHJlZml4ZXMgIT0gMCkpCi0JICBhc193YXJuIChfKCJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIikpOwotCi0JaWYgKGZpdHNfaW5fdW5zaWduZWRfYnl0ZSAoaS50bS5iYXNlX29wY29kZSkpCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAxICsgc2l6ZTsKLQkgICAgcCA9IGZyYWdfbW9yZSAoMSArIHNpemUpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDIgKyBzaXplOwkvKiBvcGNvZGUgY2FuIGJlIGF0IG1vc3QgdHdvIGJ5dGVzICovCi0JICAgIHAgPSBmcmFnX21vcmUgKDIgKyBzaXplKTsKLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDgpICYgMHhmZjsKLQkgIH0KLQkqcCsrID0gaS50bS5iYXNlX29wY29kZSAmIDB4ZmY7Ci0KLQlpZiAoaS5kaXNwc1swXS0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgewotCSAgICBpZiAoc2l6ZSA9PSAxICYmICFmaXRzX2luX3NpZ25lZF9ieXRlIChuKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiYCVzJyBvbmx5IHRha2VzIGJ5dGUgZGlzcGxhY2VtZW50OyAlbGQgc2hvcnRlbmVkIHRvICVkIiksCi0JCQlpLnRtLm5hbWUsIG4sICpwKTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHNpemUgPT0gMiAmJiAhZml0c19pbl9zaWduZWRfd29yZCAobikpCi0JICAgICAgewotCQlhc19iYWQgKF8oIjE2LWJpdCBqdW1wIG91dCBvZiByYW5nZSIpKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBuLCBzaXplKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLAotCQkJIGkuZGlzcHNbMF0sIDEsIHJlbG9jIChzaXplLCAxLCBpLmRpc3BfcmVsb2NbMF0pKTsKLQotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSnVtcEludGVyU2VnbWVudCkKLSAgICAgIHsKLQlpbnQgc2l6ZTsKLQlpbnQgcmVsb2NfdHlwZTsKLQlpbnQgcHJlZml4ID0gaS5wcmVmaXhbREFUQV9QUkVGSVhdICE9IDA7Ci0JaW50IGNvZGUxNiA9IDA7Ci0KLQlpZiAocHJlZml4KQotCSAgewotCSAgICBjb2RlMTYgPSBDT0RFMTY7Ci0JICAgIGkucHJlZml4ZXMgLT0gMTsKLQkgIH0KLQlpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgY29kZTE2IF49IENPREUxNjsKLQotCXNpemUgPSA0OwotCXJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzI7Ci0JaWYgKGNvZGUxNikKLQkgIHsKLQkgICAgc2l6ZSA9IDI7Ci0JICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMTY7Ci0JICB9Ci0KLQlpZiAoIWludGVsX3N5bnRheCAmJiAoaS5wcmVmaXhlcyAhPSAwKSkKLQkgIGFzX3dhcm4gKF8oInNraXBwaW5nIHByZWZpeGVzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24iKSk7Ci0KLQlpbnNuX3NpemUgKz0gcHJlZml4ICsgMSArIDIgKyBzaXplOyAgLyogMSBvcGNvZGU7IDIgc2VnbWVudDsgb2Zmc2V0ICovCi0JcCA9IGZyYWdfbW9yZSAocHJlZml4ICsgMSArIDIgKyBzaXplKTsKLQlpZiAocHJlZml4KQotCSAgKnArKyA9IERBVEFfUFJFRklYX09QQ09ERTsKLQkqcCsrID0gaS50bS5iYXNlX29wY29kZTsKLQlpZiAoaS5pbW1zWzFdLT5YX29wID09IE9fY29uc3RhbnQpCi0JICB7Ci0JICAgIGxvbmcgbiA9IChsb25nKSBpLmltbXNbMV0tPlhfYWRkX251bWJlcjsKLQotCSAgICBpZiAoc2l6ZSA9PSAyICYmICFmaXRzX2luX3Vuc2lnbmVkX3dvcmQgKG4pKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCIxNi1iaXQganVtcCBvdXQgb2YgcmFuZ2UiKSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgbiwgc2l6ZSk7Ci0JICB9Ci0JZWxzZQotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCSAgICAgICBpLmltbXNbMV0sIDAsIHJlbG9jX3R5cGUpOwotCWlmIChpLmltbXNbMF0tPlhfb3AgIT0gT19jb25zdGFudCkKLQkgIGFzX2JhZCAoXygiY2FuJ3QgaGFuZGxlIG5vbiBhYnNvbHV0ZSBzZWdtZW50IGluIGAlcyciKSwKLQkJICBpLnRtLm5hbWUpOwotCW1kX251bWJlcl90b19jaGFycyAocCArIHNpemUsICh2YWx1ZVQpIGkuaW1tc1swXS0+WF9hZGRfbnVtYmVyLCAyKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JLyogT3V0cHV0IG5vcm1hbCBpbnN0cnVjdGlvbnMgaGVyZS4gKi8KLQl1bnNpZ25lZCBjaGFyICpxOwotCi0JLyogVGhlIHByZWZpeCBieXRlcy4gKi8KLQlmb3IgKHEgPSBpLnByZWZpeDsKLQkgICAgIHEgPCBpLnByZWZpeCArIHNpemVvZiAoaS5wcmVmaXgpIC8gc2l6ZW9mIChpLnByZWZpeFswXSk7Ci0JICAgICBxKyspCi0JICB7Ci0JICAgIGlmICgqcSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlwID0gZnJhZ19tb3JlICgxKTsKLQkJbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAqcSwgMSk7Ci0JICAgICAgfQotCSAgfQotCi0JLyogTm93IHRoZSBvcGNvZGU7IGJlIGNhcmVmdWwgYWJvdXQgd29yZCBvcmRlciBoZXJlISAqLwotCWlmIChmaXRzX2luX3Vuc2lnbmVkX2J5dGUgKGkudG0uYmFzZV9vcGNvZGUpKQotCSAgewotCSAgICBpbnNuX3NpemUgKz0gMTsKLQkgICAgRlJBR19BUFBFTkRfMV9DSEFSIChpLnRtLmJhc2Vfb3Bjb2RlKTsKLQkgIH0KLQllbHNlIGlmIChmaXRzX2luX3Vuc2lnbmVkX3dvcmQgKGkudG0uYmFzZV9vcGNvZGUpKQotCSAgewotCSAgICBpbnNuX3NpemUgKz0gMjsKLQkgICAgcCA9IGZyYWdfbW9yZSAoMik7Ci0JICAgIC8qIHB1dCBvdXQgaGlnaCBieXRlIGZpcnN0OiBjYW4ndCB1c2UgbWRfbnVtYmVyX3RvX2NoYXJzISAqLwotCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gOCkgJiAweGZmOwotCSAgICAqcCA9IGkudG0uYmFzZV9vcGNvZGUgJiAweGZmOwotCSAgfQotCWVsc2UKLQkgIHsJCQkvKiBvcGNvZGUgaXMgZWl0aGVyIDMgb3IgNCBieXRlcyAqLwotCSAgICBpZiAoaS50bS5iYXNlX29wY29kZSAmIDB4ZmYwMDAwMDApCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gNDsKLQkJcCA9IGZyYWdfbW9yZSAoNCk7Ci0JCSpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiAyNCkgJiAweGZmOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDM7Ci0JCXAgPSBmcmFnX21vcmUgKDMpOwotCSAgICAgIH0KLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDE2KSAmIDB4ZmY7Ci0JICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiA4KSAmIDB4ZmY7Ci0JICAgICpwID0gKGkudG0uYmFzZV9vcGNvZGUpICYgMHhmZjsKLQkgIH0KLQotCS8qIE5vdyB0aGUgbW9kcm0gYnl0ZSBhbmQgc2liIGJ5dGUgKGlmIHByZXNlbnQpLiAgKi8KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBNb2RybSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDE7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDEpOwotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJKHZhbHVlVCkgKGkucm0ucmVnbWVtIDw8IDAKLQkJCQkJICB8IGkucm0ucmVnIDw8IDMKLQkJCQkJICB8IGkucm0ubW9kZSA8PCA2KSwKLQkJCQkxKTsKLQkgICAgLyogSWYgaS5ybS5yZWdtZW0gPT0gRVNQICg0KQotCSAgICAgICAmJiBpLnJtLm1vZGUgIT0gKFJlZ2lzdGVyIG1vZGUpCi0JICAgICAgICYmIG5vdCAxNiBiaXQKLQkgICAgICAgPT0+IG5lZWQgc2Vjb25kIG1vZHJtIGJ5dGUuICAqLwotCSAgICBpZiAoaS5ybS5yZWdtZW0gPT0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkcKLQkJJiYgaS5ybS5tb2RlICE9IDMKLQkJJiYgIShpLmJhc2VfcmVnICYmIChpLmJhc2VfcmVnLT5yZWdfdHlwZSAmIFJlZzE2KSAhPSAwKSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlwID0gZnJhZ19tb3JlICgxKTsKLQkJbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCSAgICAodmFsdWVUKSAoaS5zaWIuYmFzZSA8PCAwCi0JCQkJCSAgICAgIHwgaS5zaWIuaW5kZXggPDwgMwotCQkJCQkgICAgICB8IGkuc2liLnNjYWxlIDw8IDYpLAotCQkJCSAgICAxKTsKLQkgICAgICB9Ci0JICB9Ci0KLQlpZiAoaS5kaXNwX29wZXJhbmRzKQotCSAgewotCSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbjsKLQotCSAgICBmb3IgKG4gPSAwOyBuIDwgaS5vcGVyYW5kczsgbisrKQotCSAgICAgIHsKLQkJaWYgKGkuZGlzcHNbbl0pCi0JCSAgewotCQkgICAgaWYgKGkuZGlzcHNbbl0tPlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJaWYgKGkudHlwZXNbbl0gJiBEaXNwOCkKLQkJCSAgewotCQkJICAgIGluc25fc2l6ZSArPSAxOwotCQkJICAgIHAgPSBmcmFnX21vcmUgKDEpOwotCQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkJCSh2YWx1ZVQpIGkuZGlzcHNbbl0tPlhfYWRkX251bWJlciwKLQkJCQkJCTEpOwotCQkJICB9Ci0JCQllbHNlIGlmIChpLnR5cGVzW25dICYgRGlzcDE2KQotCQkJICB7Ci0JCQkgICAgaW5zbl9zaXplICs9IDI7Ci0JCQkgICAgcCA9IGZyYWdfbW9yZSAoMik7Ci0JCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCQkJKHZhbHVlVCkgaS5kaXNwc1tuXS0+WF9hZGRfbnVtYmVyLAotCQkJCQkJMik7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewkvKiBEaXNwMzIgKi8KLQkJCSAgICBpbnNuX3NpemUgKz0gNDsKLQkJCSAgICBwID0gZnJhZ19tb3JlICg0KTsKLQkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJCQkodmFsdWVUKSBpLmRpc3BzW25dLT5YX2FkZF9udW1iZXIsCi0JCQkJCQk0KTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChpLnR5cGVzW25dICYgRGlzcDMyKQotCQkgICAgICB7Ci0JCQlpbnNuX3NpemUgKz0gNDsKLQkJCXAgPSBmcmFnX21vcmUgKDQpOwotCQkJZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCQkJICAgICBpLmRpc3BzW25dLCAwLAotCQkJCSAgICAgVENfUkVMT0MgKGkuZGlzcF9yZWxvY1tuXSwgQkZEX1JFTE9DXzMyKSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgeyAvKiBtdXN0IGJlIERpc3AxNiAqLwotCQkJaW5zbl9zaXplICs9IDI7Ci0JCQlwID0gZnJhZ19tb3JlICgyKTsKLQkJCWZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAyLAotCQkJCSAgICAgaS5kaXNwc1tuXSwgMCwKLQkJCQkgICAgIFRDX1JFTE9DIChpLmRpc3BfcmVsb2Nbbl0sIEJGRF9SRUxPQ18xNikpOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0JCQkvKiBlbmQgZGlzcGxhY2VtZW50IG91dHB1dCAqLwotCi0JLyogb3V0cHV0IGltbWVkaWF0ZSAqLwotCWlmIChpLmltbV9vcGVyYW5kcykKLQkgIHsKLQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IG47Ci0KLQkgICAgZm9yIChuID0gMDsgbiA8IGkub3BlcmFuZHM7IG4rKykKLQkgICAgICB7Ci0JCWlmIChpLmltbXNbbl0pCi0JCSAgewotCQkgICAgaWYgKGkuaW1tc1tuXS0+WF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgICB7Ci0JCQlpZiAoaS50eXBlc1tuXSAmIChJbW04IHwgSW1tOFMpKQotCQkJICB7Ci0JCQkgICAgaW5zbl9zaXplICs9IDE7Ci0JCQkgICAgcCA9IGZyYWdfbW9yZSAoMSk7Ci0JCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCQkJKHZhbHVlVCkgaS5pbW1zW25dLT5YX2FkZF9udW1iZXIsCi0JCQkJCQkxKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoaS50eXBlc1tuXSAmIEltbTE2KQotCQkJICB7Ci0JCQkgICAgaW5zbl9zaXplICs9IDI7Ci0JCQkgICAgcCA9IGZyYWdfbW9yZSAoMik7Ci0JCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCQkJKHZhbHVlVCkgaS5pbW1zW25dLT5YX2FkZF9udW1iZXIsCi0JCQkJCQkyKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaW5zbl9zaXplICs9IDQ7Ci0JCQkgICAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0JCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCQkJKHZhbHVlVCkgaS5pbW1zW25dLT5YX2FkZF9udW1iZXIsCi0JCQkJCQk0KTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsJCS8qIG5vdCBhYnNvbHV0ZV9zZWN0aW9uICovCi0JCQkvKiBOZWVkIGEgMzItYml0IGZpeHVwIChkb24ndCBzdXBwb3J0IDhiaXQKLQkJCSAgIG5vbi1hYnNvbHV0ZSBpbXMpLiAgVHJ5IHRvIHN1cHBvcnQgb3RoZXIKLQkJCSAgIHNpemVzIC4uLiAqLwotCQkJaW50IHJfdHlwZTsKLQkJCWludCBzaXplOwotCQkJaW50IHBjcmVsID0gMDsKLQotCQkJaWYgKGkudHlwZXNbbl0gJiAoSW1tOCB8IEltbThTKSkKLQkJCSAgc2l6ZSA9IDE7Ci0JCQllbHNlIGlmIChpLnR5cGVzW25dICYgSW1tMTYpCi0JCQkgIHNpemUgPSAyOwotCQkJZWxzZQotCQkJICBzaXplID0gNDsKLQkJCWluc25fc2l6ZSArPSBzaXplOwotCQkJcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0JCQlyX3R5cGUgPSByZWxvYyAoc2l6ZSwgMCwgaS5kaXNwX3JlbG9jWzBdKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JCQlpZiAocl90eXBlID09IEJGRF9SRUxPQ18zMgotCQkJICAgICYmIEdPVF9zeW1ib2wKLQkJCSAgICAmJiBHT1Rfc3ltYm9sID09IGkuaW1tc1tuXS0+WF9hZGRfc3ltYm9sCi0JCQkgICAgJiYgKGkuaW1tc1tuXS0+WF9vcCA9PSBPX3N5bWJvbAotCQkJCXx8IChpLmltbXNbbl0tPlhfb3AgPT0gT19hZGQKLQkJCQkgICAgJiYgKChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24KLQkJCQkJIChpLmltbXNbbl0tPlhfb3Bfc3ltYm9sKS0+WF9vcCkKLQkJCQkJPT0gT19zdWJ0cmFjdCkpKSkKLQkJCSAgewotCQkJICAgIHJfdHlwZSA9IEJGRF9SRUxPQ18zODZfR09UUEM7Ci0JCQkgICAgaS5pbW1zW25dLT5YX2FkZF9udW1iZXIgKz0gMzsKLQkJCSAgfQotI2VuZGlmCi0JCQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJCQkgICAgIGkuaW1tc1tuXSwgcGNyZWwsIHJfdHlwZSk7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQkJCS8qIGVuZCBpbW1lZGlhdGUgb3V0cHV0ICovCi0gICAgICB9Ci0KLSNpZmRlZiBERUJVRzM4NgotICAgIGlmIChmbGFnX2RlYnVnKQotICAgICAgewotCXBpIChsaW5lLCAmaSk7Ci0gICAgICB9Ci0jZW5kaWYgLyogREVCVUczODYgKi8KLSAgfQotfQotDAotc3RhdGljIGludCBpMzg2X2lzX3JlZyBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9pc19yZWcgKHJlZ19zdHJpbmcpCi0gICAgIGNoYXIgKnJlZ19zdHJpbmc7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnMgPSByZWdfc3RyaW5nOwotICByZWdpc3RlciBjaGFyICpwOwotICBjaGFyIHJlZ19uYW1lX2dpdmVuW01BWF9SRUdfTkFNRV9TSVpFICsgMV07Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpzKSkKLSAgICArK3M7Ci0KLSAgcCA9IHJlZ19uYW1lX2dpdmVuOwotICB3aGlsZSAoKCpwKysgPSByZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgKnMrK10pICE9ICdcMCcpCi0gICAgaWYgKHAgPj0gcmVnX25hbWVfZ2l2ZW4gKyBNQVhfUkVHX05BTUVfU0laRSkKLSAgICAgIHJldHVybiAwOwotCi0gIGlmICghaGFzaF9maW5kIChyZWdfaGFzaCwgcmVnX25hbWVfZ2l2ZW4pKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIDE7Ci19Ci0gCi1zdGF0aWMgaW50IGkzODZfaW1tZWRpYXRlIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X2ltbWVkaWF0ZSAoaW1tX3N0YXJ0KQotICAgICBjaGFyICppbW1fc3RhcnQ7Ci17Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotICBzZWdUIGV4cF9zZWcgPSAwOwotICBleHByZXNzaW9uUyAqIGV4cDsKLQotICBpZiAoaS5pbW1fb3BlcmFuZHMgPT0gTUFYX0lNTUVESUFURV9PUEVSQU5EUykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk9ubHkgMSBvciAyIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgYWxsb3dlZCIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBleHAgPSAmaW1fZXhwcmVzc2lvbnNbaS5pbW1fb3BlcmFuZHMrK107Ci0gIGkuaW1tc1t0aGlzX29wZXJhbmRdID0gZXhwOwotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqaW1tX3N0YXJ0KSkKLSAgICArK2ltbV9zdGFydDsKLQotICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaW1tX3N0YXJ0OwotCi0jaWZuZGVmIExFWF9BVAotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBXZSBjYW4gaGF2ZSBvcGVyYW5kcyBvZiB0aGUgZm9ybQotICAgICAgICogICA8c3ltYm9sPkBHT1RPRkYrPG5ubj4KLSAgICAgICAqIFRha2UgdGhlIGVhc3kgd2F5IG91dCBoZXJlIGFuZCBjb3B5IGV2ZXJ5dGhpbmcKLSAgICAgICAqIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLi4uCi0gICAgICAgKi8KLSAgICAgIHJlZ2lzdGVyIGNoYXIgKmNwOwotCi0gICAgICBjcCA9IHN0cmNociAoaW5wdXRfbGluZV9wb2ludGVyLCAnQCcpOwotICAgICAgaWYgKGNwICE9IE5VTEwpCi0gICAgICAgIHsKLQkgIGNoYXIgKnRtcGJ1ZjsKLQkgIGludCBsZW4sIGZpcnN0OwotCi0JICAvKiBHT1QgcmVsb2NhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUgKi8KLQkgIGlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICAgIGFzX2JhZCAoXygiR09UIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUiKSk7Ci0KLQkgIGlmIChHT1Rfc3ltYm9sID09IE5VTEwpCi0JICAgIEdPVF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOwotCi0JICBpZiAoc3RybmNtcCAoY3AgKyAxLCAiUExUIiwgMykgPT0gMCkKLQkgICAgewotCSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9QTFQzMjsKLQkgICAgICBsZW4gPSAzOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1RPRkYiLCA2KSA9PSAwKQotCSAgICB7Ci0JICAgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X0dPVE9GRjsKLQkgICAgICBsZW4gPSA2OwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1QiLCAzKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X0dPVDMyOwotCSAgICAgIGxlbiA9IDM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJCYWQgcmVsb2Mgc3BlY2lmaWVyIGluIGV4cHJlc3Npb24iKSk7Ci0KLQkgIC8qIFJlcGxhY2UgdGhlIHJlbG9jYXRpb24gdG9rZW4gd2l0aCAnICcsIHNvIHRoYXQgZXJyb3JzIGxpa2UKLQkgICAgIGZvb0BHT1RPRkYxIHdpbGwgYmUgZGV0ZWN0ZWQuICAqLwotCSAgZmlyc3QgPSBjcCAtIGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHRtcGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuKGlucHV0X2xpbmVfcG9pbnRlcikpOwotCSAgbWVtY3B5ICh0bXBidWYsIGlucHV0X2xpbmVfcG9pbnRlciwgZmlyc3QpOwotCSAgdG1wYnVmW2ZpcnN0XSA9ICcgJzsKLQkgIHN0cmNweSAodG1wYnVmICsgZmlyc3QgKyAxLCBjcCArIDEgKyBsZW4pOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gdG1wYnVmOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICBleHBfc2VnID0gZXhwcmVzc2lvbiAoZXhwKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKQotICAgIGFzX2JhZCAoXygiSWdub3JpbmcganVuayBgJXMnIGFmdGVyIGV4cHJlc3Npb24iKSwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoZXhwLT5YX29wID09IE9fYWJzZW50KQotICAgIHsKLSAgICAgIC8qIG1pc3Npbmcgb3IgYmFkIGV4cHIgYmVjb21lcyBhYnNvbHV0ZSAwICovCi0gICAgICBhc19iYWQgKF8oIk1pc3Npbmcgb3IgaW52YWxpZCBpbW1lZGlhdGUgZXhwcmVzc2lvbiBgJXMnIHRha2VuIGFzIDAiKSwKLSAgICAgICAgICAgICAgaW1tX3N0YXJ0KTsKLSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBleHAtPlhfYWRkX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0gICAgICBleHAtPlhfb3Bfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBJbW07Ci0gICAgfQotICBlbHNlIGlmIChleHAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0KLQlzbWFsbGVzdF9pbW1fdHlwZSAoKGxvbmcpIGV4cC0+WF9hZGRfbnVtYmVyKTsKLSAgCi0gICAgICAvKiBJZiBhIHN1ZmZpeCBpcyBnaXZlbiwgdGhpcyBvcGVyYW5kIG1heSBiZSBzaG9ydGVuZGVkLiAqLwotICAgICAgc3dpdGNoIChpLnN1ZmZpeCkKLSAgICAgICAgewotICAgICAgICBjYXNlIFdPUkRfTU5FTV9TVUZGSVg6Ci0gICAgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEltbTE2OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJZVEVfTU5FTV9TVUZGSVg6Ci0gICAgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEltbTE2IHwgSW1tOCB8IEltbThTOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotI2lmZGVmIE9CSl9BT1VUCi0gIGVsc2UgaWYgKGV4cF9zZWcgIT0gdGV4dF9zZWN0aW9uCi0gICAgICAgICAgICYmIGV4cF9zZWcgIT0gZGF0YV9zZWN0aW9uCi0gICAgICAgICAgICYmIGV4cF9zZWcgIT0gYnNzX3NlY3Rpb24KLSAgICAgICAgICAgJiYgZXhwX3NlZyAhPSB1bmRlZmluZWRfc2VjdGlvbgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgICAgICAgJiYgIWJmZF9pc19jb21fc2VjdGlvbiAoZXhwX3NlZykKLSNlbmRpZgotICAgICAgICAgICkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVuaW1wbGVtZW50ZWQgc2VnbWVudCB0eXBlICVkIGluIG9wZXJhbmQiKSwgZXhwX3NlZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gYWRkcmVzcy4gIFRoZSBzaXplIG9mIHRoZSBhZGRyZXNzIHdpbGwgYmUKLSAgICAgICAgIGRldGVybWluZWQgbGF0ZXIsIGRlcGVuZGluZyBvbiBkZXN0aW5hdGlvbiByZWdpc3RlciwKLSAgICAgICAgIHN1ZmZpeCwgb3IgdGhlIGRlZmF1bHQgZm9yIHRoZSBzZWN0aW9uLiAgV2UgZXhjbHVkZQotICAgICAgICAgSW1tOFMgaGVyZSBzbyB0aGF0IGBwdXNoICRmb28nIGFuZCBvdGhlciBpbnN0cnVjdGlvbnMKLSAgICAgICAgIHdpdGggYW4gSW1tOFMgZm9ybSB3aWxsIHVzZSBJbW0xNiBvciBJbW0zMi4gICovCi0gICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gKEltbTggfCBJbW0xNiB8IEltbTMyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9zY2FsZSBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9zY2FsZSAoc2NhbGUpCi0gICAgIGNoYXIgKnNjYWxlOwotewotICBpZiAoIWlzZGlnaXQgKCpzY2FsZSkpCi0gICAgZ290byBiYWRfc2NhbGU7Ci0KLSAgc3dpdGNoICgqc2NhbGUpCi0gICAgewotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcyJzoKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNCc6Ci0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzgnOgotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDM7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGJhZF9zY2FsZToKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIHNjYWxlIGZhY3RvciBvZiAxLCAyLCA0LCBvciA4OiBnb3QgYCVzJyIpLAotICAgICAgICAgICAgICBzY2FsZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChpLmxvZzJfc2NhbGVfZmFjdG9yICE9IDAgJiYgISBpLmluZGV4X3JlZykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJzY2FsZSBmYWN0b3Igb2YgJWQgd2l0aG91dCBhbiBpbmRleCByZWdpc3RlciIpLAotICAgICAgICAgICAgICAgMSA8PCBpLmxvZzJfc2NhbGVfZmFjdG9yKTsKLSNpZiBTQ0FMRTFfV0hFTl9OT19JTkRFWAotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDA7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGkzODZfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfZGlzcGxhY2VtZW50IChkaXNwX3N0YXJ0LCBkaXNwX2VuZCkKLSAgICAgY2hhciAqZGlzcF9zdGFydDsKLSAgICAgY2hhciAqZGlzcF9lbmQ7Ci17Ci0gIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHA7Ci0gIHNlZ1QgZXhwX3NlZyA9IDA7Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnQgYmlnZGlzcCA9IERpc3AzMjsKLQotICAvKiAgQWxsIG9mIHRoZSBwaWVjZXMgb2YgdGhlIGRpc3BsYWNlbWVudCBleHByZXNzaW9uIGFyZSBoYW5kbGVkIHRvZ2V0aGVyLiAqLwotICBpZiAoaW50ZWxfc3ludGF4ICYmIGkuZGlzcF9vcGVyYW5kcyAhPSAwKQotICAgIHJldHVybiAxOwotCi0gIGlmIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApKQotICAgIGJpZ2Rpc3AgPSBEaXNwMTY7Ci0gIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBiaWdkaXNwOwotCi0gIGV4cCA9ICZkaXNwX2V4cHJlc3Npb25zW2kuZGlzcF9vcGVyYW5kc107Ci0gIGkuZGlzcHNbdGhpc19vcGVyYW5kXSA9IGV4cDsKLSAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBOT19SRUxPQzsKLSAgaS5kaXNwX29wZXJhbmRzKys7Ci0gIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBkaXNwX3N0YXJ0OwotICBFTkRfU1RSSU5HX0FORF9TQVZFIChkaXNwX2VuZCk7Ci0KLSNpZm5kZWYgR0NDX0FTTV9PX0hBQ0sKLSNkZWZpbmUgR0NDX0FTTV9PX0hBQ0sgMAotI2VuZGlmCi0jaWYgR0NDX0FTTV9PX0hBQ0sKLSAgRU5EX1NUUklOR19BTkRfU0FWRSAoZGlzcF9lbmQgKyAxKTsKLSAgaWYgKChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiBCYXNlSW5kZXgpICE9IDAKLSAgICAgICAmJiBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZFstMV0gPT0gJysnKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaGFjayBpcyB0byBhdm9pZCBhIHdhcm5pbmcgd2hlbiB1c2luZyB0aGUgIm8iCi0gICAgICAgICBjb25zdHJhaW50IHdpdGhpbiBnY2MgYXNtIHN0YXRlbWVudHMuCi0gICAgICAgICBGb3IgaW5zdGFuY2U6Ci0KLSAgICAgICAgI2RlZmluZSBfc2V0X3Rzc2xkdF9kZXNjKG4sYWRkcixsaW1pdCx0eXBlKSBcCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICggXAotICAgICAgICAibW92dyAldzIsJTBcblx0IiBcCi0gICAgICAgICJtb3Z3ICV3MSwyKyUwXG5cdCIgXAotICAgICAgICAicm9ybCAkMTYsJTFcblx0IiBcCi0gICAgICAgICJtb3ZiICViMSw0KyUwXG5cdCIgXAotICAgICAgICAibW92YiAlNCw1KyUwXG5cdCIgXAotICAgICAgICAibW92YiAkMCw2KyUwXG5cdCIgXAotICAgICAgICAibW92YiAlaDEsNyslMFxuXHQiIFwKLSAgICAgICAgInJvcmwgJDE2LCUxIiBcCi0gICAgICAgIDogIj1vIigqKG4pKSA6ICJxIiAoYWRkciksICJyaSIobGltaXQpLCAiaSIodHlwZSkpCi0KLSAgICAgICAgVGhpcyB3b3JrcyBncmVhdCBleGNlcHQgdGhhdCB0aGUgb3V0cHV0IGFzc2VtYmxlciBlbmRzCi0gICAgICAgIHVwIGxvb2tpbmcgYSBiaXQgd2VpcmQgaWYgaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMKLSAgICAgICAgbm8gb2Zmc2V0LiAgWW91IGVuZCB1cCBwcm9kdWNpbmcgY29kZSB0aGF0IGxvb2tzIGxpa2U6Ci0KLSAgICAgICAgI0FQUAotICAgICAgICAgICAgICAgbW92dyAkMjM1LCglZWF4KQotICAgICAgICAgICAgICAgbW92dyAlZHgsMisoJWVheCkKLSAgICAgICAgICAgICAgIHJvcmwgJDE2LCVlZHgKLSAgICAgICAgICAgICAgIG1vdmIgJWRsLDQrKCVlYXgpCi0gICAgICAgICAgICAgICBtb3ZiICQxMzcsNSsoJWVheCkKLSAgICAgICAgICAgICAgIG1vdmIgJDAsNisoJWVheCkKLSAgICAgICAgICAgICAgIG1vdmIgJWRoLDcrKCVlYXgpCi0gICAgICAgICAgICAgICByb3JsICQxNiwlZWR4Ci0gICAgICAgICNOT19BUFAKLQotICAgICAgICBTbyBoZXJlIHdlIHByb3ZpZGUgdGhlIG1pc3NpbmcgemVyby4KLSAgICAqLwotCi0gICAgKmRpc3BsYWNlbWVudF9zdHJpbmdfZW5kID0gJzAnOwotICAgIH0KLSNlbmRpZgotI2lmbmRlZiBMRVhfQVQKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogV2UgY2FuIGhhdmUgb3BlcmFuZHMgb2YgdGhlIGZvcm0KLSAgICAgICAqICAgPHN5bWJvbD5AR09UT0ZGKzxubm4+Ci0gICAgICAgKiBUYWtlIHRoZSBlYXN5IHdheSBvdXQgaGVyZSBhbmQgY29weSBldmVyeXRoaW5nCi0gICAgICAgKiBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4uLgotICAgICAgICovCi0gICAgICByZWdpc3RlciBjaGFyICpjcDsKLQotICAgICAgY3AgPSBzdHJjaHIgKGlucHV0X2xpbmVfcG9pbnRlciwgJ0AnKTsKLSAgICAgIGlmIChjcCAhPSBOVUxMKQotICAgICAgICB7Ci0JICBjaGFyICp0bXBidWY7Ci0JICBpbnQgbGVuLCBmaXJzdDsKLQotCSAvKiBHT1QgcmVsb2NhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUgKi8KLQkgaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgICBhc19iYWQgKF8oIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIikpOwotCi0JICBpZiAoR09UX3N5bWJvbCA9PSBOVUxMKQotCSAgICBHT1Rfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTsKLQotCSAgaWYgKHN0cm5jbXAgKGNwICsgMSwgIlBMVCIsIDMpID09IDApCi0JICAgIHsKLQkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfUExUMzI7Ci0JICAgICAgbGVuID0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UT0ZGIiwgNikgPT0gMCkKLQkgICAgewotCSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1RPRkY7Ci0JICAgICAgbGVuID0gNjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UIiwgMykgPT0gMCkKLQkgICAgewotCSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1QzMjsKLQkgICAgICBsZW4gPSAzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiQmFkIHJlbG9jIHNwZWNpZmllciBpbiBleHByZXNzaW9uIikpOwotCi0JICAvKiBSZXBsYWNlIHRoZSByZWxvY2F0aW9uIHRva2VuIHdpdGggJyAnLCBzbyB0aGF0IGVycm9ycyBsaWtlCi0JICAgICBmb29AR09UT0ZGMSB3aWxsIGJlIGRldGVjdGVkLiAgKi8KLQkgIGZpcnN0ID0gY3AgLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB0bXBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbihpbnB1dF9saW5lX3BvaW50ZXIpKTsKLQkgIG1lbWNweSAodG1wYnVmLCBpbnB1dF9saW5lX3BvaW50ZXIsIGZpcnN0KTsKLQkgIHRtcGJ1ZltmaXJzdF0gPSAnICc7Ci0JICBzdHJjcHkgKHRtcGJ1ZiArIGZpcnN0ICsgMSwgY3AgKyAxICsgbGVuKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRtcGJ1ZjsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBleHBfc2VnID0gZXhwcmVzc2lvbiAoZXhwKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAvKiBXZSBkbyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIHN5bWJvbCBpcyBpbgotICAgICAgIHRoZSBzeW1ib2wgdGFibGUuICBXZSB3aWxsIHVsdGltYXRlbHkgY2hhbmdlIHRoZSByZWxvY2F0aW9uCi0gICAgICAgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiAqLwotICAgIGlmIChpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9PSBCRkRfUkVMT0NfMzg2X0dPVE9GRikKLSAgICAgIHsKLSAgICAgICAgaWYgKFNfSVNfTE9DQUwoZXhwLT5YX2FkZF9zeW1ib2wpCi0gICAgICAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChleHAtPlhfYWRkX3N5bWJvbCkgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0gICAgICAgICAgc2VjdGlvbl9zeW1ib2wgKFNfR0VUX1NFR01FTlQgKGV4cC0+WF9hZGRfc3ltYm9sKSk7Ci0gICAgICAgIGFzc2VydCAoZXhwLT5YX29wID09IE9fc3ltYm9sKTsKLSAgICAgICAgZXhwLT5YX29wID0gT19zdWJ0cmFjdDsKLSAgICAgICAgZXhwLT5YX29wX3N5bWJvbCA9IEdPVF9zeW1ib2w7Ci0gICAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzMyOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGp1bmsgYCVzJyBhZnRlciBleHByZXNzaW9uIiksCi0gICAgICAgICAgICAgICBpbnB1dF9saW5lX3BvaW50ZXIpOwotI2lmIEdDQ19BU01fT19IQUNLCi0gICAgIFJFU1RPUkVfRU5EX1NUUklORyAoZGlzcF9lbmQgKyAxKTsKLSNlbmRpZgotICAgICBSRVNUT1JFX0VORF9TVFJJTkcgKGRpc3BfZW5kKTsKLSAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgaWYgKGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgICAgIHsKLSAgICAgICAgIGlmIChmaXRzX2luX3NpZ25lZF9ieXRlIChleHAtPlhfYWRkX251bWJlcikpCi0gICAgICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBEaXNwODsKLSAgICAgICB9Ci0jaWZkZWYgT0JKX0FPVVQKLSAgICAgZWxzZSBpZiAoZXhwX3NlZyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICAgICAgICAgJiYgZXhwX3NlZyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICAgICAgICAgJiYgZXhwX3NlZyAhPSBic3Nfc2VjdGlvbgotICAgICAgICAgICAgICAmJiBleHBfc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhc19iYWQgKF8gKCJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIiksIGV4cF9zZWcpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBpMzg2X29wZXJhbmRfbW9kaWZpZXIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfb3BlcmFuZF9tb2RpZmllciAob3Bfc3RyaW5nLCBnb3RfYV9mbG9hdCkKLSAgICAgY2hhciAqKm9wX3N0cmluZzsKLSAgICAgaW50IGdvdF9hX2Zsb2F0OwotewotICAgIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJCWVRFIFBUUiIsIDgpKQotICAgICAgewotICAgICAgICBpLnN1ZmZpeCA9IEJZVEVfTU5FTV9TVUZGSVg7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gODsKLSAgICAgICAgcmV0dXJuIEJZVEVfUFRSOwotCi0gICAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiV09SRCBQVFIiLCA4KSkKLSAgICAgIHsKLSAgICAgICAgaS5zdWZmaXggPSBXT1JEX01ORU1fU1VGRklYOwotICAgICAgICAqb3Bfc3RyaW5nICs9IDg7Ci0gICAgICAgIHJldHVybiBXT1JEX1BUUjsKLSAgICAgIH0KLQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIkRXT1JEIFBUUiIsIDkpKQotICAgICAgewotICAgICAgICBpZiAoZ290X2FfZmxvYXQpCi0gICAgICAgICAgaS5zdWZmaXggPSBTSE9SVF9NTkVNX1NVRkZJWDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGkuc3VmZml4ID0gRFdPUkRfTU5FTV9TVUZGSVg7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gOTsKLSAgICAgICAgcmV0dXJuIERXT1JEX1BUUjsKLSAgICAgIH0KLQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIlFXT1JEIFBUUiIsIDkpKQotICAgICAgewotICAgICAgICBpLnN1ZmZpeCA9IElOVEVMX0RXT1JEX01ORU1fU1VGRklYOwotICAgICAgICAqb3Bfc3RyaW5nICs9IDk7Ci0gICAgICAgIHJldHVybiBRV09SRF9QVFI7Ci0gICAgICB9Ci0KLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJYV09SRCBQVFIiLCA5KSkKLSAgICAgIHsKLSAgICAgICAgaS5zdWZmaXggPSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWDsKLSAgICAgICAgKm9wX3N0cmluZyArPSA5OwotICAgICAgICByZXR1cm4gWFdPUkRfUFRSOwotICAgICAgfQotCi0gICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiU0hPUlQiLCA1KSkKLSAgICAgIHsKLSAgICAgICAgKm9wX3N0cmluZyArPSA1OwotICAgICAgICByZXR1cm4gU0hPUlQ7Ci0gICAgICB9Ci0KLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJPRkZTRVQgRkxBVDoiLCAxMikpCi0gICAgICB7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gMTI7Ci0gICAgICAgIHJldHVybiBPRkZTRVRfRkxBVDsKLSAgICAgIH0KLQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIkZMQVQiLCA0KSkKLSAgICAgIHsKLSAgICAgICAgKm9wX3N0cmluZyArPSA0OwotICAgICAgICByZXR1cm4gRkxBVDsKLSAgICAgIH0KLQotICAgIGVsc2UgcmV0dXJuIE5PTkVfRk9VTkQ7Ci19IAotCi1zdGF0aWMgY2hhciAqIGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLQotc3RhdGljIGNoYXIgKgotYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAoaW5pdGlhbF9kaXNwLCBvcF9zdHJpbmcpCi0gICAgIGludCBpbml0aWFsX2Rpc3A7Ci0gICAgIGNoYXIgKm9wX3N0cmluZzsKLXsKLSAgY2hhciAqdGVtcF9zdHJpbmcgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAob3Bfc3RyaW5nKSArIDEpOwotICBjaGFyICplbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gIGNoYXIgKnRjOwotICBjaGFyICp0ZW1wX2Rpc3A7Ci0KLSAgdGVtcF9zdHJpbmdbMF0gPSAnXDAnOwotICB0YyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnWycpOwotICBpZiAoIGluaXRpYWxfZGlzcCAmJiAhZW5kX29mX29wZXJhbmRfc3RyaW5nKQotICAgIHsKLSAgICAgIHN0cmNweSAodGVtcF9zdHJpbmcsIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gKHRlbXBfc3RyaW5nKTsKLSAgICB9Ci0KLSAgLyogQnVpbGQgdGhlIHdob2xlIGRpc3BsYWNlbWVudCBzdHJpbmcgKi8KLSAgaWYgKGluaXRpYWxfZGlzcCkKLSAgICB7Ci0gICAgICBzdHJuY3B5ICh0ZW1wX3N0cmluZywgb3Bfc3RyaW5nLCBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgLSBvcF9zdHJpbmcpOwotICAgICAgdGVtcF9zdHJpbmdbZW5kX29mX29wZXJhbmRfc3RyaW5nIC0gb3Bfc3RyaW5nXSA9ICdcMCc7Ci0gICAgICB0ZW1wX2Rpc3AgPSB0YzsKLSAgICB9Ci0gIGVsc2UgCi0gICAgdGVtcF9kaXNwID0gb3Bfc3RyaW5nOwotCi0gIHdoaWxlICgqdGVtcF9kaXNwICE9ICdcMCcpCi0gICAgewotICAgICAgaW50IGFkZF9taW51cyA9ICgqdGVtcF9kaXNwID09ICctJyk7Ci0KLSAgICAgIGlmICgqdGVtcF9kaXNwID09ICcrJyB8fCAqdGVtcF9kaXNwID09ICctJyB8fCAqdGVtcF9kaXNwID09ICdbJykKLSAgICAgICAgdGVtcF9kaXNwKys7Ci0KLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqdGVtcF9kaXNwKSkKLSAgICAgICAgdGVtcF9kaXNwKys7Ci0KLSAgICAgIC8qIERvbid0IGNvbnNpZGVyIHJlZ2lzdGVycyAqLwotICAgICAgaWYgKCp0ZW1wX2Rpc3AgIT0gUkVHSVNURVJfUFJFRklYCi0gICAgICAgICAgJiYgIShhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKHRlbXBfZGlzcCkpKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqc3RyaW5nX3N0YXJ0ID0gdGVtcF9kaXNwOwotCi0gICAgICAgICAgd2hpbGUgKCp0ZW1wX2Rpc3AgIT0gJ10nCi0gICAgICAgICAgICAgICAgICYmICp0ZW1wX2Rpc3AgIT0gJysnCi0gICAgICAgICAgICAgICAgICYmICp0ZW1wX2Rpc3AgIT0gJy0nCi0gICAgICAgICAgICAgICAgICYmICp0ZW1wX2Rpc3AgIT0gJyonKQotICAgICAgICAgICAgKyt0ZW1wX2Rpc3A7Ci0KLSAgICAgICAgICBpZiAoYWRkX21pbnVzKQotICAgICAgICAgICAgc3RyY2F0ICh0ZW1wX3N0cmluZywgIi0iKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJjYXQgKHRlbXBfc3RyaW5nLCAiKyIpOwotCi0gICAgICAgICAgc3RybmNhdCAodGVtcF9zdHJpbmcsIHN0cmluZ19zdGFydCwgdGVtcF9kaXNwIC0gc3RyaW5nX3N0YXJ0KTsKLSAgICAgICAgICBpZiAoKnRlbXBfZGlzcCA9PSAnKycgfHwgKnRlbXBfZGlzcCA9PSAnLScpCi0gICAgICAgICAgICAtLXRlbXBfZGlzcDsKLSAgICAgICAgfQotCi0gICAgICB3aGlsZSAoKnRlbXBfZGlzcCAhPSAnXDAnCi0gICAgICAgICAgICAgJiYgKnRlbXBfZGlzcCAhPSAnKycKLSAgICAgICAgICAgICAmJiAqdGVtcF9kaXNwICE9ICctJykKLSAgICAgICAgKyt0ZW1wX2Rpc3A7Ci0gICAgfQotCi0gIHJldHVybiB0ZW1wX3N0cmluZzsKLX0KLQotc3RhdGljIGludCBpMzg2X3BhcnNlX3NlZyBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9wYXJzZV9zZWcgKG9wX3N0cmluZykKLSAgICAgY2hhciAqb3Bfc3RyaW5nOwotewotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgLyogU2hvdWxkIGJlIG9uZSBvZiBlcywgY3MsIHNzLCBkcyBmcyBvciBncyAqLwotICBzd2l0Y2ggKCpvcF9zdHJpbmcrKykKLSAgICB7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZjczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZmczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCpvcF9zdHJpbmcrKyAhPSAncycpCi0gICAgewotICAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICArK29wX3N0cmluZzsKLQotICBpZiAoKm9wX3N0cmluZyAhPSAnOicpCi0gICAgewotICAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOyAKLSAgCi19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCAob3Bfc3RyaW5nKQotICAgICBjaGFyICpvcF9zdHJpbmc7Ci17Ci0KLSAgY2hhciAqZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCi0gIGlmIChpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKQotICAgICAgJiYgc3RyY2hyIChvcF9zdHJpbmcsICdbJykgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGRpc3BsYWNlbWVudCBwcmVjZWRpbmcgb3BlbiBicmFja2V0ICovCi0gIGlmICgqb3Bfc3RyaW5nICE9ICdbJykKLSAgICB7Ci0gICAgICBjaGFyICplbmRfc2VnOwotICAgICAgY2hhciAqdGVtcF9zdHJpbmc7Ci0KLSAgICAgIGVuZF9zZWcgPSBzdHJjaHIgKG9wX3N0cmluZywgJzonKTsKLSAgICAgIGlmIChlbmRfc2VnKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmICghaTM4Nl9wYXJzZV9zZWcgKG9wX3N0cmluZykpCi0gICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgIG9wX3N0cmluZyA9IGVuZF9zZWcgKyAxOwotICAgICAgICB9Ci0KLSAgICAgIHRlbXBfc3RyaW5nID0gYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAodHJ1ZSwgb3Bfc3RyaW5nKTsKLSAgICAgIGlmICghaTM4Nl9kaXNwbGFjZW1lbnQgKHRlbXBfc3RyaW5nLCB0ZW1wX3N0cmluZyArIHN0cmxlbiAodGVtcF9zdHJpbmcpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnWycpOwotICAgICAgaWYgKCFlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpCi0gICAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZyArIHN0cmxlbiAob3Bfc3RyaW5nKTsKLQotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcpKQotICAgICAgICAtLWVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQotICAgICAgb3Bfc3RyaW5nID0gZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgICB9Ci0KLSAgaWYgKCpvcF9zdHJpbmcgPT0gJ1snKQotICAgIHsKLSAgICAgICsrb3Bfc3RyaW5nOwotCi0gICAgICAvKiBQaWNrIG9mZiBlYWNoIGNvbXBvbmVudCBhbmQgZmlndXJlIG91dCB3aGVyZSBpdCBiZWxvbmdzICovCi0KLSAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZzsKLQotICAgICAgd2hpbGUgKCpvcF9zdHJpbmcgIT0gJ10nKQotICAgICAgICB7Ci0KLSAgICAgICAgICB3aGlsZSAoKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKycKLSAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnLScKLSAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKicKLSAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnXScpCi0gICAgICAgICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcrKzsKLQotICAgICAgICAgIGlmICgqb3Bfc3RyaW5nID09ICcrJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2hhciAqdGVtcF9zdHJpbmcgPSBvcF9zdHJpbmcgKyAxOwotICAgICAgICAgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKnRlbXBfc3RyaW5nKSkKLSAgICAgICAgICAgICAgICArK3RlbXBfc3RyaW5nOwotICAgICAgICAgICAgICBpZiAoKnRlbXBfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAotICAgICAgICAgICAgICAgICAgfHwgKGFsbG93X25ha2VkX3JlZyAmJiBpMzg2X2lzX3JlZyAodGVtcF9zdHJpbmcpKSkKLSAgICAgICAgICAgICAgICArK29wX3N0cmluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICgqb3Bfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAotICAgICAgICAgICAgICB8fCAoYWxsb3dfbmFrZWRfcmVnICYmIGkzODZfaXNfcmVnIChvcF9zdHJpbmcpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29uc3QgcmVnX2VudHJ5ICp0ZW1wX3JlZzsKLSAgICAgICAgICAgICAgY2hhciAqZW5kX29wOwotCi0gICAgICAgICAgICAgIEVORF9TVFJJTkdfQU5EX1NBVkUgKGVuZF9vZl9vcGVyYW5kX3N0cmluZyk7Ci0gICAgICAgICAgICAgIHRlbXBfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKG9wX3N0cmluZywgJmVuZF9vcCk7Ci0gICAgICAgICAgICAgIFJFU1RPUkVfRU5EX1NUUklORyAoZW5kX29mX29wZXJhbmRfc3RyaW5nKTsKLQotICAgICAgICAgICAgICBpZiAodGVtcF9yZWcgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgICBpZiAoaS5iYXNlX3JlZyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGkuYmFzZV9yZWcgPSB0ZW1wX3JlZzsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGkuaW5kZXhfcmVnID0gdGVtcF9yZWc7Ci0KLSAgICAgICAgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEJhc2VJbmRleDsKLQotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpIHx8ICpvcF9zdHJpbmcgPT0gJysnIHx8ICpvcF9zdHJpbmcgPT0gJy0nKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgIGNoYXIgKnRlbXBfc3RyaW5nID0gYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAoZmFsc2UsIG9wX3N0cmluZyk7Ci0KLSAgICAgICAgICAgICAgaWYgKCp0ZW1wX3N0cmluZyA9PSAnKycpCi0gICAgICAgICAgICAgICAgKyt0ZW1wX3N0cmluZzsKLQotICAgICAgICAgICAgICBpZiAoIWkzODZfZGlzcGxhY2VtZW50ICh0ZW1wX3N0cmluZywgdGVtcF9zdHJpbmcgKyBzdHJsZW4gKHRlbXBfc3RyaW5nKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgICAgICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmc7Ci0gICAgICAgICAgICAgIHdoaWxlICgqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICddJwotICAgICAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKycKLSAgICAgICAgICAgICAgICAgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJy0nCi0gICAgICAgICAgICAgICAgICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcqJykKLSAgICAgICAgICAgICAgICsrZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gJyonKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICArK29wX3N0cmluZzsKLQotICAgICAgICAgICAgICBpZiAoaS5iYXNlX3JlZyAmJiAhaS5pbmRleF9yZWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaS5pbmRleF9yZWcgPSBpLmJhc2VfcmVnOwotICAgICAgICAgICAgICAgICAgaS5iYXNlX3JlZyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlmICghaTM4Nl9zY2FsZSAob3Bfc3RyaW5nKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBvcF9zdHJpbmcgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gICAgICAgICAgKytlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9pbnRlbF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfaW50ZWxfb3BlcmFuZCAob3BlcmFuZF9zdHJpbmcsIGdvdF9hX2Zsb2F0KQotICAgICBjaGFyICpvcGVyYW5kX3N0cmluZzsKLSAgICAgaW50IGdvdF9hX2Zsb2F0OwotewotICBjaGFyICpvcF9zdHJpbmcgPSBvcGVyYW5kX3N0cmluZzsKLQotICBpbnQgb3BlcmFuZF9tb2RpZmllciA9IGkzODZfb3BlcmFuZF9tb2RpZmllciAoJm9wX3N0cmluZywgZ290X2FfZmxvYXQpOwotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgc3dpdGNoIChvcGVyYW5kX21vZGlmaWVyKQotICAgIHsKLSAgICBjYXNlIEJZVEVfUFRSOgotICAgIGNhc2UgV09SRF9QVFI6Ci0gICAgY2FzZSBEV09SRF9QVFI6Ci0gICAgY2FzZSBRV09SRF9QVFI6Ci0gICAgY2FzZSBYV09SRF9QVFI6Ci0gICAgICBpZiAoKGkubWVtX29wZXJhbmRzID09IDEKLSAgICAgICAgICAgJiYgKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpID09IDApCi0gICAgICAgICAgfHwgaS5tZW1fb3BlcmFuZHMgPT0gMikKLSAgICAgICAgewotICAgICAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgbWVtb3J5IHJlZmVyZW5jZXMgZm9yIGAlcyciKSwKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKCFpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIChvcF9zdHJpbmcpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgICAgaS5tZW1fb3BlcmFuZHMrKzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGTEFUOgotCi0gICAgY2FzZSBPRkZTRVRfRkxBVDoKLSAgICAgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIT1JUOgotCi0gICAgY2FzZSBOT05FX0ZPVU5EOgotICAgIC8qIFNob3VsZCBiZSByZWdpc3RlciBvciBpbW1lZGlhdGUgKi8KLSAgICBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLSAgICAgICAgJiYgc3RyY2hyIChvcF9zdHJpbmcsICdbJykgPT0gMCkKLSAgICAgIHsKLSAgICAgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYCi0gICAgICAgICAgICAgfHwgKGFsbG93X25ha2VkX3JlZwotCSAgICAgICAgICYmIGkzODZfaXNfcmVnIChvcF9zdHJpbmcpKSkKLSAgICAgIHsKLQotICAgICAgICByZWdpc3RlciBjb25zdCByZWdfZW50cnkgKiByOwotICAgICAgICBjaGFyICplbmRfb3A7Ci0KLSAgICAgICAgciA9IHBhcnNlX3JlZ2lzdGVyIChvcF9zdHJpbmcsICZlbmRfb3ApOwotICAgICAgICBpZiAociA9PSBOVUxMKQotICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8qIENoZWNrIGZvciBhIHNlZ21lbnQgb3ZlcnJpZGUgYnkgc2VhcmNoaW5nIGZvciAnOicgYWZ0ZXIgYQotICAgICAgICAgICBzZWdtZW50IHJlZ2lzdGVyLiAgKi8KLSAgICAgICAgb3Bfc3RyaW5nID0gZW5kX29wOwotICAgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICAgIGlmICgqb3Bfc3RyaW5nID09ICc6JyAmJiAoci0+cmVnX3R5cGUgJiAoU1JlZzIgfCBTUmVnMykpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoci0+cmVnX251bSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmNzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmRzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmZzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSByLT5yZWdfdHlwZSAmIH5CYXNlSW5kZXg7Ci0gICAgICAgIGkucmVnc1t0aGlzX29wZXJhbmRdID0gcjsKLSAgICAgICAgaS5yZWdfb3BlcmFuZHMrKzsKLSAgICAgIH0KLQotICAgIGVsc2UgCi0gICAgICB7Ci0KLSAgICAgICAgaWYgKCFpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIChvcF9zdHJpbmcpKQotICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGkubWVtX29wZXJhbmRzKys7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgfSAgLyogZW5kIHN3aXRjaCAqLwotICAvKiBTcGVjaWFsIGNhc2UgZm9yICglZHgpIHdoaWxlIGRvaW5nIGlucHV0L291dHB1dCBvcC4gICovCi0gIGlmIChpLmJhc2VfcmVnCi0gICAgICAmJiBpLmJhc2VfcmVnLT5yZWdfdHlwZSA9PSAoUmVnMTYgfCBJbk91dFBvcnRSZWcpCi0gICAgICAmJiBpLmluZGV4X3JlZyA9PSAwCi0gICAgICAmJiBpLmxvZzJfc2NhbGVfZmFjdG9yID09IDAKLSAgICAgICYmIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9PSAwCi0gICAgICAmJiAoaS50eXBlc1t0aGlzX29wZXJhbmRdICYgRGlzcCkgPT0gMCkKLSAgICAgewotICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSA9IEluT3V0UG9ydFJlZzsKLSAgICAgICByZXR1cm4gMTsKLSAgICAgfQotICAvKiBNYWtlIHN1cmUgdGhlIG1lbW9yeSBvcGVyYW5kIHdlJ3ZlIGJlZW4gZGVhbHQgaXMgdmFsaWQuICAqLwotICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoKGkuYmFzZV9yZWcKLQkgICAmJiAoKGkuYmFzZV9yZWctPnJlZ190eXBlICYgKFJlZzE2fEJhc2VJbmRleCkpCi0JCSE9IChSZWcxNnxCYXNlSW5kZXgpKSkKLQkgICAgICB8fCAoaS5pbmRleF9yZWcKLQkJICAmJiAoKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKLQkJICAgICAgICE9IChSZWcxNnxCYXNlSW5kZXgpKQotCQkgICAgICB8fCAhIChpLmJhc2VfcmVnCi0JCQkgICAgJiYgaS5iYXNlX3JlZy0+cmVnX251bSA8IDYKLQkJCSAgICAmJiBpLmluZGV4X3JlZy0+cmVnX251bSA+PSA2Ci0JCQkgICAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwKSkpKQotCSB7Ci0JICAgYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLSAgICAgICAgICAgICAgICAgICBvcGVyYW5kX3N0cmluZywgIjE2Iik7Ci0gICAgICAgICAgIHJldHVybiAwOwotCSB9Ci0gICAgfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoaS5iYXNlX3JlZwotCSAgICAgICAmJiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWczMikgPT0gMCkKLQkgICAgICB8fCAoaS5pbmRleF9yZWcKLQkJICAmJiAoKGkuaW5kZXhfcmVnLT5yZWdfdHlwZSAmIChSZWczMnxCYXNlSW5kZXgpKQotCQkgICAgICAhPSAoUmVnMzJ8QmFzZUluZGV4KSkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLQkJICAgICAgb3BlcmFuZF9zdHJpbmcsICIzMiIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICByZXR1cm4gMTsKLX0KLQotLyogUGFyc2UgT1BFUkFORF9TVFJJTkcgaW50byB0aGUgaTM4Nl9pbnNuIHN0cnVjdHVyZSBJLiAgUmV0dXJucyBub24temVybwotICAgb24gZXJyb3IuICovCi0KLXN0YXRpYyBpbnQgaTM4Nl9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X29wZXJhbmQgKG9wZXJhbmRfc3RyaW5nKQotICAgICBjaGFyICpvcGVyYW5kX3N0cmluZzsKLXsKLSAgY2hhciAqb3Bfc3RyaW5nID0gb3BlcmFuZF9zdHJpbmc7Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotICAgICsrb3Bfc3RyaW5nOwotCi0gIC8qIFdlIGNoZWNrIGZvciBhbiBhYnNvbHV0ZSBwcmVmaXggKGRpZmZlcmVudGlhdGluZywKLSAgICAgZm9yIGV4YW1wbGUsICdqbXAgcGNfcmVsYXRpdmVfbGFiZWwnIGZyb20gJ2ptcCAqYWJzb2x1dGVfbGFiZWwnLiAqLwotICBpZiAoKm9wX3N0cmluZyA9PSBBQlNPTFVURV9QUkVGSVgpCi0gICAgewotICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEp1bXBBYnNvbHV0ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgaWYgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyLiAqLwotICBpZiAoKm9wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgKLSAgICAgIHx8IChhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKG9wX3N0cmluZykpKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNvbnN0IHJlZ19lbnRyeSAqcjsKLSAgICAgIGNoYXIgKmVuZF9vcDsKLQotICAgICAgciA9IHBhcnNlX3JlZ2lzdGVyIChvcF9zdHJpbmcsICZlbmRfb3ApOwotICAgICAgaWYgKHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBhIHNlZ21lbnQgb3ZlcnJpZGUgYnkgc2VhcmNoaW5nIGZvciAnOicgYWZ0ZXIgYQotCSBzZWdtZW50IHJlZ2lzdGVyLiAgKi8KLSAgICAgIG9wX3N0cmluZyA9IGVuZF9vcDsKLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoKm9wX3N0cmluZyA9PSAnOicgJiYgKHItPnJlZ190eXBlICYgKFNSZWcyIHwgU1JlZzMpKSkKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCAoci0+cmVnX251bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmY3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmc3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNDoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZnM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZ3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU2tpcCB0aGUgJzonIGFuZCB3aGl0ZXNwYWNlLiAgKi8KLQkgICsrb3Bfc3RyaW5nOwotCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCSAgICArK29wX3N0cmluZzsKLQotCSAgLyogUHJldGVuZCBnaXZlbiBzdHJpbmcgc3RhcnRzIGhlcmUuICovCi0JICBvcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZzsKLQkgIGlmICghaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLQkgICAgICAmJiAhaXNfaWRlbnRpZmllcl9jaGFyICgqb3Bfc3RyaW5nKQotCSAgICAgICYmICpvcF9zdHJpbmcgIT0gJygnCi0JICAgICAgJiYgKm9wX3N0cmluZyAhPSBBQlNPTFVURV9QUkVGSVgpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCBtZW1vcnkgb3BlcmFuZCBgJXMnIiksIG9wX3N0cmluZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIC8qIEhhbmRsZSBjYXNlIG9mICVlczoqZm9vLiAqLwotCSAgaWYgKCpvcF9zdHJpbmcgPT0gQUJTT0xVVEVfUFJFRklYKQotCSAgICB7Ci0JICAgICAgKytvcF9zdHJpbmc7Ci0JICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCQkrK29wX3N0cmluZzsKLQkgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSnVtcEFic29sdXRlOwotCSAgICB9Ci0JICBnb3RvIGRvX21lbW9yeV9yZWZlcmVuY2U7Ci0JfQotICAgICAgaWYgKCpvcF9zdHJpbmcpCi0JewotCSAgYXNfYmFkIChfKCJKdW5rIGAlcycgYWZ0ZXIgcmVnaXN0ZXIiKSwgb3Bfc3RyaW5nKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSByLT5yZWdfdHlwZSAmIH5CYXNlSW5kZXg7Ci0gICAgICBpLnJlZ3NbdGhpc19vcGVyYW5kXSA9IHI7Ci0gICAgICBpLnJlZ19vcGVyYW5kcysrOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wX3N0cmluZyA9PSBJTU1FRElBVEVfUFJFRklYKQotICAgIHsJCQkJLyogLi4uIG9yIGFuIGltbWVkaWF0ZSAqLwotICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpIAotICAgICAgICAgICB8fCBpc19pZGVudGlmaWVyX2NoYXIgKCpvcF9zdHJpbmcpCi0JICAgfHwgKm9wX3N0cmluZyA9PSAnKCcgKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBtZW1vcnkgcmVmZXJlbmNlIG9mIHNvbWUgc29ydC4gKi8KLSAgICAgIGNoYXIgKmVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLSAgICAgIHJlZ2lzdGVyIGNoYXIgKmJhc2Vfc3RyaW5nOwotICAgICAgaW50IGZvdW5kX2Jhc2VfaW5kZXhfZm9ybTsKLQotICAgICAgLyogU3RhcnQgYW5kIGVuZCBvZiBkaXNwbGFjZW1lbnQgc3RyaW5nIGV4cHJlc3Npb24gKGlmIGZvdW5kKS4gKi8KLSAgICAgIGNoYXIgKmRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQ7Ci0gICAgICBjaGFyICpkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZDsKLQotICAgIGRvX21lbW9yeV9yZWZlcmVuY2U6Ci0KLSAgICAgIGlmICgoaS5tZW1fb3BlcmFuZHMgPT0gMQotCSAgICYmIChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSA9PSAwKQotCSAgfHwgaS5tZW1fb3BlcmFuZHMgPT0gMikKLQl7Ci0JICBhc19iYWQgKF8oInRvbyBtYW55IG1lbW9yeSByZWZlcmVuY2VzIGZvciBgJXMnIiksCi0JCSAgY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIGJhc2UgaW5kZXggZm9ybS4gIFdlIGRldGVjdCB0aGUgYmFzZSBpbmRleCBmb3JtIGJ5Ci0JIGxvb2tpbmcgZm9yIGFuICcpJyBhdCB0aGUgZW5kIG9mIHRoZSBvcGVyYW5kLCBzZWFyY2hpbmcKLQkgZm9yIHRoZSAnKCcgbWF0Y2hpbmcgaXQsIGFuZCBmaW5kaW5nIGEgUkVHSVNURVJfUFJFRklYIG9yICcsJwotCSBhZnRlciB0aGUgJygnLiAgKi8KLSAgICAgIGZvdW5kX2Jhc2VfaW5kZXhfZm9ybSA9IDA7Ci0gICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmcgKyBzdHJsZW4gKG9wX3N0cmluZyk7Ci0KLSAgICAgIC0tZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcpKQotCS0tZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCi0gICAgICBiYXNlX3N0cmluZyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQotICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnKScpCi0JewotCSAgdW5zaWduZWQgaW50IHBhcmVuc19iYWxhbmNlZCA9IDE7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgbnVtYmVyIG9mIGxlZnQgJiByaWdodCAoKSdzIGFyZQotCSAgICAgZXF1YWwsIHNvIHRoaXMgbG9vcCB3aWxsIG5vdCBiZSBpbmZpbml0ZS4gKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBiYXNlX3N0cmluZy0tOwotCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJyknKQotCQlwYXJlbnNfYmFsYW5jZWQrKzsKLQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcoJykKLQkJcGFyZW5zX2JhbGFuY2VkLS07Ci0JICAgIH0KLQkgIHdoaWxlIChwYXJlbnNfYmFsYW5jZWQpOwotCi0JICAvKiBJZiB0aGVyZSBpcyBhIGRpc3BsYWNlbWVudCBzZXQtdXAgZm9yIGl0IHRvIGJlIHBhcnNlZCBsYXRlci4gKi8KLQkgIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgPSBvcF9zdHJpbmc7Ci0JICBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCA9IGJhc2Vfc3RyaW5nOwotCi0JICAvKiBTa2lwIHBhc3QgJygnIGFuZCB3aGl0ZXNwYWNlLiAgKi8KLQkgICsrYmFzZV9zdHJpbmc7Ci0JICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkgICAgKytiYXNlX3N0cmluZzsKLQotCSAgaWYgKCpiYXNlX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgKLQkgICAgICB8fCAoYWxsb3dfbmFrZWRfcmVnICYmIGkzODZfaXNfcmVnIChiYXNlX3N0cmluZykpCi0JICAgICAgfHwgKmJhc2Vfc3RyaW5nID09ICcsJykKLQkgICAgZm91bmRfYmFzZV9pbmRleF9mb3JtID0gMTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGNhbid0IHBhcnNlIGEgYmFzZSBpbmRleCByZWdpc3RlciBleHByZXNzaW9uLCB3ZSd2ZSBmb3VuZAotCSBhIHB1cmUgZGlzcGxhY2VtZW50IGV4cHJlc3Npb24uICBXZSBzZXQgdXAgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydAotCSBhbmQgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgZm9yIHRoZSBjb2RlIGJlbG93LiAqLwotICAgICAgaWYgKCFmb3VuZF9iYXNlX2luZGV4X2Zvcm0pCi0JewotCSAgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCA9IG9wX3N0cmluZzsKLQkgIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kID0gZW5kX29mX29wZXJhbmRfc3RyaW5nICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEJhc2VJbmRleDsKLQotCSAgLyogRmluZCBiYXNlIHJlZ2lzdGVyIChpZiBhbnkpLiAqLwotCSAgaWYgKCpiYXNlX3N0cmluZyAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBjaGFyICplbmRfb3A7Ci0KLQkgICAgICAvKiBUcmltIG9mZiB0aGUgY2xvc2luZyAnKScgc28gdGhhdCBwYXJzZV9yZWdpc3RlciB3b24ndAotCQkgc2VlIGl0LiAgKi8KLQkgICAgICBFTkRfU1RSSU5HX0FORF9TQVZFIChlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpOwotCSAgICAgIGkuYmFzZV9yZWcgPSBwYXJzZV9yZWdpc3RlciAoYmFzZV9zdHJpbmcsICZlbmRfb3ApOwotCSAgICAgIFJFU1RPUkVfRU5EX1NUUklORyAoZW5kX29mX29wZXJhbmRfc3RyaW5nKTsKLQotCSAgICAgIGlmIChpLmJhc2VfcmVnID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JICAgICAgYmFzZV9zdHJpbmcgPSBlbmRfb3A7Ci0JICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSsrYmFzZV9zdHJpbmc7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgbWF5IGJlIGFuIGluZGV4IHJlZyBvciBzY2FsZSBmYWN0b3IgaGVyZS4gICovCi0JICBpZiAoKmJhc2Vfc3RyaW5nID09ICcsJykKLQkgICAgewotCSAgICAgICsrYmFzZV9zdHJpbmc7Ci0JICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSsrYmFzZV9zdHJpbmc7Ci0KLQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAotCQkgIHx8IChhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKGJhc2Vfc3RyaW5nKSkpCi0JCXsKLQkJICBjaGFyICplbmRfb3A7Ci0KLQkJICBFTkRfU1RSSU5HX0FORF9TQVZFIChlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpOwotCQkgIGkuaW5kZXhfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKGJhc2Vfc3RyaW5nLCAmZW5kX29wKTsKLQkJICBSRVNUT1JFX0VORF9TVFJJTkcgKGVuZF9vZl9vcGVyYW5kX3N0cmluZyk7Ci0KLQkJICBpZiAoaS5pbmRleF9yZWcgPT0gTlVMTCkKLQkJICAgIHJldHVybiAwOwotCi0JCSAgYmFzZV9zdHJpbmcgPSBlbmRfb3A7Ci0JCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSAgICArK2Jhc2Vfc3RyaW5nOwotCQkgIGlmICgqYmFzZV9zdHJpbmcgPT0gJywnKQotCQkgICAgewotCQkgICAgICArK2Jhc2Vfc3RyaW5nOwotCQkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkJCSsrYmFzZV9zdHJpbmc7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmJhc2Vfc3RyaW5nICE9ICcpJyApCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgaW5kZXggcmVnaXN0ZXIgaW4gYCVzJyIpLAotCQkJICAgICAgb3BlcmFuZF9zdHJpbmcpOwotCQkgICAgICByZXR1cm4gMDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ2hlY2sgZm9yIHNjYWxlIGZhY3Rvci4gKi8KLQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpiYXNlX3N0cmluZykpCi0JCXsKLSAgICAgICAgICAgICAgICAgIGlmICghaTM4Nl9zY2FsZSAoYmFzZV9zdHJpbmcpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotCQkgICsrYmFzZV9zdHJpbmc7Ci0JCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSAgICArK2Jhc2Vfc3RyaW5nOwotCQkgIGlmICgqYmFzZV9zdHJpbmcgIT0gJyknKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBgKScgYWZ0ZXIgc2NhbGUgZmFjdG9yIGluIGAlcyciKSwKLQkJCSAgICAgIG9wZXJhbmRfc3RyaW5nKTsKLQkJICAgICAgcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICghaS5pbmRleF9yZWcpCi0JCXsKLQkJICBhc19iYWQgKF8oImV4cGVjdGluZyBpbmRleCByZWdpc3RlciBvciBzY2FsZSBmYWN0b3IgYWZ0ZXIgYCwnOyBnb3QgJyVjJyIpLAotCQkJICAqYmFzZV9zdHJpbmcpOwotCQkgIHJldHVybiAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpiYXNlX3N0cmluZyAhPSAnKScpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBgLCcgb3IgYCknIGFmdGVyIGJhc2UgcmVnaXN0ZXIgaW4gYCVzJyIpLAotCQkgICAgICBvcGVyYW5kX3N0cmluZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHRoZXJlJ3MgYW4gZXhwcmVzc2lvbiBiZWdpbm5pbmcgdGhlIG9wZXJhbmQsIHBhcnNlIGl0LAotCSBhc3N1bWluZyBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0IGFuZAotCSBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCBhcmUgbWVhbmluZ2Z1bC4gICovCi0gICAgICBpZiAoZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCAhPSBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCkKLQl7Ci0gICAgICAgICAgaWYgKCFpMzg2X2Rpc3BsYWNlbWVudCAoZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yICglZHgpIHdoaWxlIGRvaW5nIGlucHV0L291dHB1dCBvcC4gICovCi0gICAgICBpZiAoaS5iYXNlX3JlZwotCSAgJiYgaS5iYXNlX3JlZy0+cmVnX3R5cGUgPT0gKFJlZzE2IHwgSW5PdXRQb3J0UmVnKQotCSAgJiYgaS5pbmRleF9yZWcgPT0gMAotCSAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwCi0JICAmJiBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPT0gMAotCSAgJiYgKGkudHlwZXNbdGhpc19vcGVyYW5kXSAmIERpc3ApID09IDApCi0JewotCSAgaS50eXBlc1t0aGlzX29wZXJhbmRdID0gSW5PdXRQb3J0UmVnOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBtZW1vcnkgb3BlcmFuZCB3ZSd2ZSBiZWVuIGRlYWx0IGlzIHZhbGlkLiAgKi8KLSAgICAgIGlmIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApKQotCXsKLQkgIGlmICgoaS5iYXNlX3JlZwotCSAgICAgICAmJiAoKGkuYmFzZV9yZWctPnJlZ190eXBlICYgKFJlZzE2fEJhc2VJbmRleCkpCi0JCSAgICE9IChSZWcxNnxCYXNlSW5kZXgpKSkKLQkgICAgICB8fCAoaS5pbmRleF9yZWcKLQkJICAmJiAoKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKLQkJICAgICAgICE9IChSZWcxNnxCYXNlSW5kZXgpKQotCQkgICAgICB8fCAhIChpLmJhc2VfcmVnCi0JCQkgICAgJiYgaS5iYXNlX3JlZy0+cmVnX251bSA8IDYKLQkJCSAgICAmJiBpLmluZGV4X3JlZy0+cmVnX251bSA+PSA2Ci0JCQkgICAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwKSkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLQkJICAgICAgb3BlcmFuZF9zdHJpbmcsICIxNiIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoaS5iYXNlX3JlZwotCSAgICAgICAmJiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWczMikgPT0gMCkKLQkgICAgICB8fCAoaS5pbmRleF9yZWcKLQkJICAmJiAoKGkuaW5kZXhfcmVnLT5yZWdfdHlwZSAmIChSZWczMnxCYXNlSW5kZXgpKQotCQkgICAgICAhPSAoUmVnMzJ8QmFzZUluZGV4KSkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLQkJICAgICAgb3BlcmFuZF9zdHJpbmcsICIzMiIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgaS5tZW1fb3BlcmFuZHMrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIGl0J3Mgbm90IGEgbWVtb3J5IG9wZXJhbmQ7IGFyZ2ghICovCi0gICAgICBhc19iYWQgKF8oImludmFsaWQgY2hhciAlcyBiZWdpbm5pbmcgb3BlcmFuZCAlZCBgJXMnIiksCi0JICAgICAgb3V0cHV0X2ludmFsaWQgKCpvcF9zdHJpbmcpLAotCSAgICAgIHRoaXNfb3BlcmFuZCArIDEsCi0JICAgICAgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7CQkJLyogbm9ybWFsIHJldHVybiAqLwotfQotDAotLyoKLSAqCQkJbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKQotICoKLSAqIENhbGxlZCBqdXN0IGJlZm9yZSByZWxheCgpLgotICogQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCi0gKiBSZXR1cm4gdGhlIGNvcnJlY3QgZnJfc3VidHlwZSBpbiB0aGUgZnJhZy4KLSAqIFJldHVybiB0aGUgaW5pdGlhbCAiZ3Vlc3MgZm9yIGZyX3ZhciIgdG8gY2FsbGVyLgotICogVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICogV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAqIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAqIDAgdmFsdWUuCi0gKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3Bjb2RlOwotICByZWdpc3RlciBpbnQgb2xkX2ZyX2ZpeDsKLQotICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgb3Bjb2RlID0gKHVuc2lnbmVkIGNoYXIgKikgZnJhZ1AtPmZyX29wY29kZTsKLSAgLyogV2UndmUgYWxyZWFkeSBnb3QgZnJhZ1AtPmZyX3N1YnR5cGUgcmlnaHQ7ICBhbGwgd2UgaGF2ZSB0byBkbyBpcwotICAgICBjaGVjayBmb3IgdW4tcmVsYXhhYmxlIHN5bWJvbHMuICAqLwotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKLSAgICB7Ci0gICAgICAvKiBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgc2VnbWVudCAqLwotICAgICAgaW50IGNvZGUxNiA9IGZyYWdQLT5mcl9zdWJ0eXBlICYgQ09ERTE2OwotICAgICAgaW50IHNpemUgPSBjb2RlMTYgPyAyIDogNDsKLSAgICAgIGludCBwY3JlbF9yZWxvYyA9IGNvZGUxNiA/IEJGRF9SRUxPQ18xNl9QQ1JFTCA6IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQotICAgICAgc3dpdGNoIChvcGNvZGVbMF0pCi0JewotCWNhc2UgSlVNUF9QQ19SRUxBVElWRToJLyogbWFrZSBqbXAgKDB4ZWIpIGEgZHdvcmQgZGlzcGxhY2VtZW50IGp1bXAgKi8KLQkgIG9wY29kZVswXSA9IDB4ZTk7CS8qIGR3b3JkIGRpc3Agam1wICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IHNpemU7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgc2l6ZSwKLQkJICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwKLQkJICAgKEdPVF9zeW1ib2wgJiYgLyogTm90IHF1aXRlIHJpZ2h0IC0gd2Ugc2hvdWxkIHN3aXRjaCBvbgotCQkJCSAgICAgcHJlc2VuY2Ugb2YgQFBMVCwgYnV0IEkgY2Fubm90IHNlZSBob3cKLQkJCQkgICAgIHRvIGdldCB0byB0aGF0IGZyb20gaGVyZS4gIFdlIHNob3VsZCBoYXZlCi0JCQkJICAgICBkb25lIHRoaXMgaW4gbWRfYXNzZW1ibGUgdG8gcmVhbGx5Ci0JCQkJICAgICBnZXQgaXQgcmlnaHQgYWxsIG9mIHRoZSB0aW1lLCBidXQgSQotCQkJCSAgICAgdGhpbmsgaXQgZG9lcyBub3QgbWF0dGVyIHRoYXQgbXVjaCwgYXMKLQkJCQkgICAgIHRoaXMgd2lsbCBiZSByaWdodCBtb3N0IG9mIHRoZSB0aW1lLiBFUlkqLwotCQkgICAgU19HRVRfU0VHTUVOVChmcmFnUC0+ZnJfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgPyBCRkRfUkVMT0NfMzg2X1BMVDMyIDogcGNyZWxfcmVsb2MpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgLyogVGhpcyBjaGFuZ2VzIHRoZSBieXRlLWRpc3BsYWNlbWVudCBqdW1wIDB4N04gLS0+Ci0JCQkgICB0aGUgZHdvcmQtZGlzcGxhY2VtZW50IGp1bXAgMHgwZjhOICovCi0JICBvcGNvZGVbMV0gPSBvcGNvZGVbMF0gKyAweDEwOwotCSAgb3Bjb2RlWzBdID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsJLyogdHdvLWJ5dGUgZXNjYXBlICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyBzaXplOwkvKiB3ZSd2ZSBhZGRlZCBhbiBvcGNvZGUgYnl0ZSAqLwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBzaXplLAotCQkgICBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLAotCQkgICAoR09UX3N5bWJvbCAmJiAgLyogTm90IHF1aXRlIHJpZ2h0IC0gd2Ugc2hvdWxkIHN3aXRjaCBvbgotCQkJCSAgICAgcHJlc2VuY2Ugb2YgQFBMVCwgYnV0IEkgY2Fubm90IHNlZSBob3cKLQkJCQkgICAgIHRvIGdldCB0byB0aGF0IGZyb20gaGVyZS4gIEVSWSAqLwotCQkgICAgU19HRVRfU0VHTUVOVChmcmFnUC0+ZnJfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgPyBCRkRfUkVMT0NfMzg2X1BMVDMyIDogcGNyZWxfcmVsb2MpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0gICAgfQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19CQkJCS8qIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgKi8KLQwKLS8qCi0gKgkJCW1kX2NvbnZlcnRfZnJhZygpOwotICoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWMsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbHNlCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvcGNvZGU7Ci0gIHVuc2lnbmVkIGNoYXIgKndoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBvcGNvZGVfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbiA9IDA7Ci0gIGludCBkaXNwbGFjZW1lbnRfZnJvbV9vcGNvZGVfc3RhcnQ7Ci0KLSAgb3Bjb2RlID0gKHVuc2lnbmVkIGNoYXIgKikgZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIHdlIHdhbnQgdG8gcmVhY2ggaW4gZmlsZSBzcGFjZS4gKi8KLSAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotI2lmZGVmIEJGRF9BU1NFTUJMRVIgLyogbm90IG5lZWRlZCBvdGhlcndpc2U/ICovCi0gIHRhcmdldF9hZGRyZXNzICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICovCi0gIG9wY29kZV9hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4OwotCi0gIC8qIERpc3BsYWNlbWVudCBmcm9tIG9wY29kZSBzdGFydCB0byBmaWxsIGludG8gaW5zdHJ1Y3Rpb24uICovCi0gIGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydCA9IHRhcmdldF9hZGRyZXNzIC0gb3Bjb2RlX2FkZHJlc3M7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgU01BTEwpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMMTYpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwxNik6Ci0gICAgICAvKiBkb24ndCBoYXZlIHRvIGNoYW5nZSBvcGNvZGUgKi8KLSAgICAgIGV4dGVuc2lvbiA9IDE7CQkvKiAxIG9wY29kZSArIDEgZGlzcGxhY2VtZW50ICovCi0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHKToKLSAgICAgIGV4dGVuc2lvbiA9IDU7CQkvKiAyIG9wY29kZSArIDQgZGlzcGxhY2VtZW50ICovCi0gICAgICBvcGNvZGVbMV0gPSBvcGNvZGVbMF0gKyAweDEwOwotICAgICAgb3Bjb2RlWzBdID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzJdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRyk6Ci0gICAgICBleHRlbnNpb24gPSA0OwkJLyogMSBvcGNvZGUgKyA0IGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzBdID0gMHhlOTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBCSUcxNik6Ci0gICAgICBleHRlbnNpb24gPSAzOwkJLyogMiBvcGNvZGUgKyAyIGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzFdID0gb3Bjb2RlWzBdICsgMHgxMDsKLSAgICAgIG9wY29kZVswXSA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsyXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcxNik6Ci0gICAgICBleHRlbnNpb24gPSAyOwkJLyogMSBvcGNvZGUgKyAyIGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzBdID0gMHhlOTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyogbm93IHB1dCBkaXNwbGFjZW1lbnQgYWZ0ZXIgb3Bjb2RlICovCi0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCwKLQkJICAgICAgKHZhbHVlVCkgKGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydCAtIGV4dGVuc2lvbiksCi0JCSAgICAgIFNJWkVfRlJPTV9SRUxBWF9TVEFURSAoZnJhZ1AtPmZyX3N1YnR5cGUpKTsKLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19Ci0MCi0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAyOwkvKiBzaXplIG9mIGJ5dGUgZGlzcGxhY2VtZW50IGptcCAqLwotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNTsJLyogc2l6ZSBvZiBkd29yZCBkaXNwbGFjZW1lbnQgam1wICovCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICBsb25nIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDIpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhlYiwgMSk7CS8qIG9wY29kZSBmb3IgYnl0ZS1kaXNwIGp1bXAgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDEpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgbG9uZyBvZmZzZXQ7Ci0KLSAgaWYgKGZsYWdfZG9fbG9uZ19qdW1wKQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweGU5LCAxKTsvKiBvcGNvZGUgZm9yIGxvbmcgam1wICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgNCk7Ci0gICAgICBmaXhfbmV3IChmcmFnLCAocHRyICsgMSkgLSBmcmFnLT5mcl9saXRlcmFsLCA0LAotCSAgICAgICB0b19zeW1ib2wsIChvZmZzZXRUKSAwLCAwLCBCRkRfUkVMT0NfMzIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgNSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhlOSwgMSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgNCk7Ci0gICAgfQotfQotDAotLyogQXBwbHkgYSBmaXh1cCAoZml4UykgdG8gc2VnbWVudCBkYXRhLCBvbmNlIGl0IGhhcyBiZWVuIGRldGVybWluZWQKLSAgIGJ5IG91ciBjYWxsZXIgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgaW5mbyB3ZSBuZWVkIHRvIGZpeCBpdCB1cC4KLQotICAgT24gdGhlIDM4NiwgaW1tZWRpYXRlcywgZGlzcGxhY2VtZW50cywgYW5kIGRhdGEgcG9pbnRlcnMgYXJlIGFsbCBpbgotICAgdGhlIHNhbWUgKGxpdHRsZS1lbmRpYW4pIGZvcm1hdCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHdoaWNoCi0gICB3ZSBhcmUgaGFuZGxpbmcuICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHAsIHNlZykKLSAgICAgZml4UyAqZml4UDsJCS8qIFRoZSBmaXggd2UncmUgdG8gcHV0IGluLiAgKi8KLSAgICAgdmFsdWVUICp2YWxwOwkJLyogUG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGJpdHMuICAqLwotICAgICBzZWdUIHNlZzsJCQkvKiBTZWdtZW50IGZpeCBpcyBmcm9tLiAgKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcCA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgdmFsdWVUIHZhbHVlID0gKnZhbHA7Ci0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoVEVfTWFjaCkKLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ18zMjoKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzE2OgotCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfODoKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBUaGlzIGlzIGEgaGFjay4gIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8KLSAgICogaGFuZGxlIHRoaXMuCi0gICAqLwotICBpZiAoKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMCi0gICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184X1BDUkVMKQotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgewotI2lmbmRlZiBPQkpfQU9VVAotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotI2lmZGVmIFRFX1BFCi0JICB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0jZW5kaWYKLQkgICkKLQl2YWx1ZSArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSA9PSBzZWcKLQkgICAgICB8fCBzeW1ib2xfc2VjdGlvbl9wIChmaXhQLT5meF9hZGRzeSkpCi0JICAmJiAhIFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgISBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgICYmICEgU19JU19DT01NT04gKGZpeFAtPmZ4X2FkZHN5KSkKLQl7Ci0JICAvKiBZZXMsIHdlIGFkZCB0aGUgdmFsdWVzIGluIHR3aWNlLiAgVGhpcyBpcyBiZWNhdXNlCi0JICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHN1YnRyYWN0cyB0aGVtIG91dCBhZ2Fpbi4gIEkgdGhpbmsKLQkgICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgYnJva2VuLCBidXQgSSBkb24ndCBkYXJlIGNoYW5nZQotCSAgICAgaXQuICBGSVhNRS4gICovCi0JICB2YWx1ZSArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0JfQotI2VuZGlmCi0jaWYgZGVmaW5lZCAoT0JKX0NPRkYpICYmIGRlZmluZWQgKFRFX1BFKQotICAgICAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgUEUgZm9ybWF0IGRvZXMgbm90IHN0b3JlIGEgc2VjdGlvbgotICAgICAgICAgYWRkcmVzcyBvZmZzZXQgZm9yIGEgUEMgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnKQotCXZhbHVlICs9IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotI2VuZGlmCi0gICAgfQotCi0gIC8qIEZpeCBhIGZldyB0aGluZ3MgLSB0aGUgZHluYW1pYyBsaW5rZXIgZXhwZWN0cyBjZXJ0YWluIHZhbHVlcyBoZXJlLAotICAgICBhbmQgd2UgbXVzdCBub3QgZGlzc2FwcG9pbnQgaXQuICovCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfUExUMzI6Ci0gICAgICAvKiBNYWtlIHRoZSBqdW1wIGluc3RydWN0aW9uIHBvaW50IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvcGVyYW5kLiAgQXQKLQkgcnVudGltZSB3ZSBtZXJlbHkgYWRkIHRoZSBvZmZzZXQgdG8gdGhlIGFjdHVhbCBQTFQgZW50cnkuICovCi0gICAgICB2YWx1ZSA9IDB4ZmZmZmZmZmM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6Ci0vKgotICogIFRoaXMgaXMgdG91Z2ggdG8gZXhwbGFpbi4gIFdlIGVuZCB1cCB3aXRoIHRoaXMgb25lIGlmIHdlIGhhdmUKLSAqIG9wZXJhbmRzIHRoYXQgbG9vayBsaWtlICJfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkwyODRdIi4gIFRoZSBnb2FsCi0gKiBoZXJlIGlzIHRvIG9idGFpbiB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiB0aGUgR09ULCBhbmQgaXQgaXMgc3Ryb25nbHkKLSAqIHByZWZlcmFibGUgZnJvbSBhIHBlcmZvcm1hbmNlIHBvaW50IG9mIHZpZXcgdG8gYXZvaWQgdXNpbmcgYSBydW50aW1lCi0gKiByZWxvY2F0aW9uIGZvciB0aGlzLiAgVGhlIGFjdHVhbCBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgb2Z0ZW4gbG9vayAKLSAqIHNvbWV0aGluZyBsaWtlOgotICogCi0gKiAJY2FsbAkuTDY2Ci0gKiAuTDY2OgotICogCXBvcGwJJWVieAotICogCWFkZGwJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDY2XSwlZWJ4Ci0gKiAKLSAqIAlUaGUgY2FsbCBhbmQgcG9wIGVzc2VudGlhbGx5IHJldHVybiB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZgotICogdGhlIGxhYmVsIC5MNjYgYW5kIHN0b3JlIGl0IGluICVlYnguICBUaGUgbGlua2VyIGl0c2VsZiB3aWxsCi0gKiB1bHRpbWF0ZWx5IGNoYW5nZSB0aGUgZmlyc3Qgb3BlcmFuZCBvZiB0aGUgYWRkbCBzbyB0aGF0ICVlYnggcG9pbnRzIHRvCi0gKiB0aGUgR09ULCBidXQgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCB0aGUgLm8gZmlsZSBtdXN0IGhhdmUgdGhpcyBvcGVyYW5kCi0gKiBzZXQgc28gdGhhdCBpdCBnZW5lcmF0ZXMgbm90IHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIC5MNjYsIGJ1dCB0aGUKLSAqIGFic29sdXRlIGFkZHJlc3Mgb2YgaXRzZWxmLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciBpdHNlbGYgc2ltcGx5Ci0gKiB0cmVhdCBhIEdPVFBDIHJlbG9jYXRpb24gYXMgYXNraW5nIGZvciBhIHBjcmVsIG9mZnNldCB0byB0aGUgR09UIHRvIGJlCi0gKiBhZGRlZCBpbiwgYW5kIHRoZSBhZGRlbmQgb2YgdGhlIHJlbG9jYXRpb24gaXMgc3RvcmVkIGluIHRoZSBvcGVyYW5kCi0gKiBmaWVsZCBmb3IgdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KLSAqIAotICogCU91ciBqb2IgaGVyZSBpcyB0byBmaXggdGhlIG9wZXJhbmQgc28gdGhhdCBpdCB3b3VsZCBhZGQgdGhlIGNvcnJlY3QKLSAqIG9mZnNldCBzbyB0aGF0ICVlYnggd291bGQgcG9pbnQgdG8gaXRzZWxmLiAgVGhlIHRoaW5nIHRoYXQgaXMgdHJpY2t5IGlzCi0gKiB0aGF0IC4tLkw2NiB3aWxsIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB3ZSBuZWVkCi0gKiB0byBmdXJ0aGVyIG1vZGlmeSB0aGUgb3BlcmFuZCBzbyB0aGF0IGl0IHdpbGwgcG9pbnQgdG8gaXRzZWxmLgotICogVGhlcmUgYXJlIG90aGVyIGNhc2VzIHdoZXJlIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgotICogCi0gKiAJLmxvbmcJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDY2XQotICogCi0gKiBhbmQgaGVyZSBubyBjb3JyZWN0aW9uIHdvdWxkIGJlIHJlcXVpcmVkLiAgSW50ZXJuYWxseSBpbiB0aGUgYXNzZW1ibGVyCi0gKiB3ZSB0cmVhdCBvcGVyYW5kcyBvZiB0aGlzIGZvcm0gYXMgbm90IGJlaW5nIHBjcmVsIHNpbmNlIHRoZSAnLicgaXMgCi0gKiBleHBsaWNpdGx5IG1lbnRpb25lZCwgYW5kIEkgd29uZGVyIHdoZXRoZXIgaXQgd291bGQgc2ltcGxpZnkgbWF0dGVycwotICogdG8gZG8gaXQgdGhpcyB3YXkuICBXaG8ga25vd3MuICBJbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBQSUMgcGF0Y2hlcywKLSAqIHRoZSBwY3JlbF9hZGp1c3QgZmllbGQgd2FzIHVzZWQgdG8gc3RvcmUgdGhlIGNvcnJlY3Rpb24sIGJ1dCBzaW5jZSB0aGUKLSAqIGV4cHJlc3Npb24gaXMgbm90IHBjcmVsLCBJIGZlbHQgaXQgd291bGQgYmUgY29uZnVzaW5nIHRvIGRvIGl0IHRoaXMgd2F5LgotICovCi0gICAgICB2YWx1ZSAtPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVDMyOgotICAgICAgdmFsdWUgPSAwOyAvKiBGdWxseSByZXNvbHZlZCBhdCBydW50aW1lLiAgTm8gYWRkZW5kLiAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikgKi8KLSAgKnZhbHAgPSB2YWx1ZTsKLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoVEVfTWFjaCkgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB2YWx1ZSwgZml4UC0+Znhfc2l6ZSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiAwCi0vKiBUaGlzIGlzIG5ldmVyIHVzZWQuICAqLwotbG9uZwkJCQkvKiBLbm93cyBhYm91dCB0aGUgYnl0ZSBvcmRlciBpbiBhIHdvcmQuICovCi1tZF9jaGFyc190b19udW1iZXIgKGNvbiwgbmJ5dGVzKQotICAgICB1bnNpZ25lZCBjaGFyIGNvbltdOwkvKiBMb3cgb3JkZXIgYnl0ZSAxc3QuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGlucHV0LiAqLwotewotICBsb25nIHJldHZhbDsKLSAgZm9yIChyZXR2YWwgPSAwLCBjb24gKz0gbmJ5dGVzIC0gMTsgbmJ5dGVzLS07IGNvbi0tKQotICAgIHsKLSAgICAgIHJldHZhbCA8PD0gQklUU19QRVJfQ0hBUjsKLSAgICAgIHJldHZhbCB8PSAqY29uOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZiAvKiAwICovCi0MCi0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBsaXRQIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgZW1pdCB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMgZW1pdHRlZAotICAgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gbWRfYXRvZiAoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAvKiBUaGlzIGxvb3BzIG91dHB1dHMgdGhlIExJVFRMRU5VTXMgaW4gUkVWRVJTRSBvcmRlcjsgaW4gYWNjb3JkIHdpdGgKLSAgICAgdGhlIGJpZ2VuZGlhbiAzODYuICAqLwotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFAtLSksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLWNoYXIgb3V0cHV0X2ludmFsaWRfYnVmWzhdOwotCi1zdGF0aWMgY2hhciAqIG91dHB1dF9pbnZhbGlkIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY2hhciAqCi1vdXRwdXRfaW52YWxpZCAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChpc3ByaW50IChjKSkKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICInJWMnIiwgYyk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICIoMHgleCkiLCAodW5zaWduZWQpIGMpOwotICByZXR1cm4gb3V0cHV0X2ludmFsaWRfYnVmOwotfQotCi0vKiBSRUdfU1RSSU5HIHN0YXJ0cyAqYmVmb3JlKiBSRUdJU1RFUl9QUkVGSVguICAqLwotCi1zdGF0aWMgY29uc3QgcmVnX2VudHJ5ICogcGFyc2VfcmVnaXN0ZXIgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBjb25zdCByZWdfZW50cnkgKgotcGFyc2VfcmVnaXN0ZXIgKHJlZ19zdHJpbmcsIGVuZF9vcCkKLSAgICAgY2hhciAqcmVnX3N0cmluZzsKLSAgICAgY2hhciAqKmVuZF9vcDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcyA9IHJlZ19zdHJpbmc7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGNoYXIgcmVnX25hbWVfZ2l2ZW5bTUFYX1JFR19OQU1FX1NJWkUgKyAxXTsKLSAgY29uc3QgcmVnX2VudHJ5ICpyOwotCi0gIC8qIFNraXAgcG9zc2libGUgUkVHSVNURVJfUFJFRklYIGFuZCBwb3NzaWJsZSB3aGl0ZXNwYWNlLiAgKi8KLSAgaWYgKCpzID09IFJFR0lTVEVSX1BSRUZJWCkKLSAgICArK3M7Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpzKSkKLSAgICArK3M7Ci0KLSAgcCA9IHJlZ19uYW1lX2dpdmVuOwotICB3aGlsZSAoKCpwKysgPSByZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgKnMrK10pICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKHAgPj0gcmVnX25hbWVfZ2l2ZW4gKyBNQVhfUkVHX05BTUVfU0laRSkKLQl7Ci0gICAgICAgICAgaWYgKCFhbGxvd19uYWtlZF9yZWcpCi0gICAgICAgICAgICB7Ci0JICAgICAgKnAgPSAnXDAnOwotCSAgICAgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIpLCByZWdfbmFtZV9naXZlbik7Ci0gICAgICAgICAgICB9Ci0JICByZXR1cm4gKGNvbnN0IHJlZ19lbnRyeSAqKSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgKmVuZF9vcCA9IHMgLSAxOwotCi0gIHIgPSAoY29uc3QgcmVnX2VudHJ5ICopIGhhc2hfZmluZCAocmVnX2hhc2gsIHJlZ19uYW1lX2dpdmVuKTsKLQotICBpZiAociA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghYWxsb3dfbmFrZWRfcmVnKQotICAgICAgICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBuYW1lIGAlcyciKSwgcmVnX25hbWVfZ2l2ZW4pOwotICAgICAgcmV0dXJuIChjb25zdCByZWdfZW50cnkgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHI7Ci19Ci0MCi0jaWZkZWYgT0JKX0VMRgotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImttVlE6IjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibSI7Ci0jZW5kaWYKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICBmbGFnX2RvX2xvbmdfanVtcCA9IDE7Ci0gICAgICBicmVhazsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gICAgICAvKiAtazogSWdub3JlIGZvciBGcmVlQlNEIGNvbXBhdGliaWxpdHkuICAqLwotICAgIGNhc2UgJ2snOgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1tCQkJZG8gbG9uZyBqdW1wXG4iKSk7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgT0JKX01BWUJFX0VMRgotI2lmZGVmIE9CSl9NQVlCRV9DT0ZGCi0KLS8qIFBpY2sgdGhlIHRhcmdldCBmb3JtYXQgdG8gdXNlLiAgKi8KLQotY29uc3QgY2hhciAgKgotaTM4Nl90YXJnZXRfZm9ybWF0ICgpCi17Ci0gIHN3aXRjaCAoT1VUUFVUX0ZMQVZPUikKLSAgICB7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cjoKLSAgICAgIHJldHVybiAiY29mZi1pMzg2IjsKLSAgICBjYXNlIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gImVsZjMyLWkzODYiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIE9CSl9NQVlCRV9DT0ZGICovCi0jZW5kaWYgLyogT0JKX01BWUJFX0VMRiAqLwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQwKLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0JaWYgKCpuYW1lID09ICdfJyAmJiAqKG5hbWUrMSkgPT0gJ0cnCi0JICAgICYmIHN0cmNtcChuYW1lLCBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpID09IDApCi0JICB7Ci0JICAgIGlmICghR09UX3N5bWJvbCkKLQkgICAgICB7Ci0JCWlmIChzeW1ib2xfZmluZCAobmFtZSkpCi0JCSAgYXNfYmFkIChfKCJHT1QgYWxyZWFkeSBpbiBzeW1ib2wgdGFibGUiKSk7Ci0JCUdPVF9zeW1ib2wgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwKLQkJCQkJICh2YWx1ZVQpIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JICAgICAgfTsKLQkgICAgcmV0dXJuIEdPVF9zeW1ib2w7Ci0JICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBGb3IgYS5vdXQsIGZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4gIElmIHdlIGRvbid0IGRvCi0gICAgIHRoaXMsIEJGRCB3aWxsIGFsaWduIGl0IGZvciB1cywgYnV0IGl0IHdpbGwgbm90IHdyaXRlIG91dCB0aGUKLSAgICAgZmluYWwgYnl0ZXMgb2YgdGhlIHNlY3Rpb24uICBUaGlzIG1heSBiZSBhIGJ1ZyBpbiBCRkQsIGJ1dCBpdCBpcwotICAgICBlYXNpZXIgdG8gZml4IGl0IGhlcmUgc2luY2UgdGhhdCBpcyBob3cgdGhlIG90aGVyIGEub3V0IHRhcmdldHMKLSAgICAgd29yay4gICovCi0gIGludCBhbGlnbjsKLQotICBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIHNpemUgPSAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgodmFsdWVUKSAtMSA8PCBhbGlnbikpOwotI2VuZGlmCi0jZW5kaWYKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogT24gdGhlIGkzODYsIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgIG5leHQgaW5zdHJ1Y3Rpb24uICBUaGF0IGlzLCB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzIGl0cwotICAgc2l6ZSwgc2luY2UgdGhlIG9mZnNldCBpcyBhbHdheXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0jaWZuZGVmIEkzODZDT0ZGCi0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNlbmRpZgotCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXZvaWQKLWkzODZfdmFsaWRhdGVfZml4IChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBpZiAoZml4cC0+Znhfc3Vic3kgJiYgZml4cC0+Znhfc3Vic3kgPT0gR09UX3N5bWJvbCkKLSAgICB7Ci0gICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzg2X0dPVE9GRjsKLSAgICAgIGZpeHAtPmZ4X3N1YnN5ID0gMDsKLSAgICB9Ci19Ci0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1BMVDMyOgotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1QzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RQQzoKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JewotCSAgc3dpdGNoIChmaXhwLT5meF9zaXplKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiIpLAotCQkgICAgICBmaXhwLT5meF9zaXplKTsKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6IGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsgIGJyZWFrOwotCSAgICBjYXNlIDI6IGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7IGJyZWFrOwotCSAgICBjYXNlIDQ6IGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7IGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfc2l6ZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24iKSwgZml4cC0+Znhfc2l6ZSk7Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOiBjb2RlID0gQkZEX1JFTE9DXzg7ICBicmVhazsKLQkgICAgY2FzZSAyOiBjb2RlID0gQkZEX1JFTE9DXzE2OyBicmVhazsKLQkgICAgY2FzZSA0OiBjb2RlID0gQkZEX1JFTE9DXzMyOyBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfMzIKLSAgICAgICYmIEdPVF9zeW1ib2wKLSAgICAgICYmIGZpeHAtPmZ4X2FkZHN5ID09IEdPVF9zeW1ib2wpCi0gICAgY29kZSA9IEJGRF9SRUxPQ18zODZfR09UUEM7Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotCi0gIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgLyogSEFDSzogU2luY2UgaTM4NiBFTEYgdXNlcyBSZWwgaW5zdGVhZCBvZiBSZWxhLCBlbmNvZGUgdGhlCi0gICAgIHZ0YWJsZSBlbnRyeSB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uJ3Mgc2VjdGlvbiBvZmZzZXQuICAqLwotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmVsLT5hZGRyZXNzID0gZml4cC0+Znhfb2Zmc2V0OwotCi0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbC0+YWRkZW5kID0gMDsKLQotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAocmVsLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgLyogU2V0IGhvd3RvIHRvIGEgZ2FyYmFnZSB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGFzc2VydCAocmVsLT5ob3d0byAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbDsKLX0KLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNpZiAoZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKSkKLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgLyoKLSAgICogSW46IGxlbmd0aCBvZiByZWxvY2F0aW9uIChvciBvZiBhZGRyZXNzKSBpbiBjaGFyczogMSwgMiBvciA0LgotICAgKiBPdXQ6IEdOVSBMRCByZWxvY2F0aW9uIGxlbmd0aCBjb2RlOiAwLCAxLCBvciAyLgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0JCSAgICAgICh2YWx1ZVQpIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JCQkJKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzZdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs0XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgMykgJiAweDA4KQotCSAgICAgIHwgKChuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV0gPDwgMSkgJiAweDA2KQotCSAgICAgIHwgKCgoZml4UC0+ZnhfcGNyZWwgPDwgMCkgJiAweDAxKSAmIDB4MGYpKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSNpZiBkZWZpbmVkIChJMzg2Q09GRikKLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJfSU1BR0VCQVNFKQotICAgIHJldHVybiBSX0lNQUdFQkFTRTsKLQotICByZXR1cm4gKGZpeFAtPmZ4X3BjcmVsID8KLQkgIChmaXhQLT5meF9zaXplID09IDEgPyBSX1BDUkJZVEUgOgotCSAgIGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfUENSV09SRCA6Ci0JICAgUl9QQ1JMT05HKSA6Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9SRUxCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1JFTFdPUkQgOgotCSAgIFJfRElSMzIpKTsKLX0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaWYgKGZyYWctPmZyX25leHQpCi0gICAgcmV0dXJuIChmcmFnLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfYWRkcmVzcyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIEkzODZDT0ZGICovCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQwKLS8qIGVuZCBvZiB0Yy1pMzg2LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTM4Ni5oIGIvZ2FzL2NvbmZpZy90Yy1pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzc4YzEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyogdGMtaTM4Ni5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1pMzg2LmMKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBUQ19JMzg2Ci0jZGVmaW5lIFRDX0kzODYgMQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgZml4OwotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JMAotCi0jaWZkZWYgVEVfTFlOWAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiY29mZi1pMzg2LWx5bngiCi0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgcmVsb2NhdGlvbiB0eXBlcyBpbiB0Yy1pMzg2LmMuICBUaGUgZmlyc3QKLSAgIHBhcmFtZXRlciBpcyB0aGUgY3VycmVudCByZWxvY2F0aW9uIHR5cGUsIHRoZSBzZWNvbmQgb25lIGlzIHRoZSBkZXNpcmVkCi0gICB0eXBlLiAgVGhlIGlkZWEgaXMgdGhhdCBpZiB0aGUgb3JpZ2luYWwgdHlwZSBpcyBhbHJlYWR5IHNvbWUga2luZCBvZiBQSUMKLSAgIHJlbG9jYXRpb24sIHdlIGxlYXZlIGl0IGFsb25lLCBvdGhlcndpc2Ugd2UgZ2l2ZSBpdCB0aGUgZGVzaXJlZCB0eXBlICovCi0KLSNkZWZpbmUgVENfUkVMT0MoWCxZKSAoKChYKSAhPSBCRkRfUkVMT0NfMzg2X1BMVDMyICYmIFwKLQkgICAoWCkgIT0gQkZEX1JFTE9DXzM4Nl9HT1RPRkYgJiYgXAotCSAgIChYKSAhPSBCRkRfUkVMT0NfMzg2X0dPVDMyICYmIFwKLQkgICAoWCkgIT0gQkZEX1JFTE9DXzM4Nl9HT1RQQykgPyBZIDogWCkKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShYKSAgdGNfaTM4Nl9maXhfYWRqdXN0YWJsZShYKQotZXh0ZXJuIGludCB0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBUaGlzIGlzIHRoZSByZWxvY2F0aW9uIHR5cGUgZm9yIGRpcmVjdCByZWZlcmVuY2VzIHRvIEdMT0JBTF9PRkZTRVRfVEFCTEUuCi0gKiBJdCBjb21lcyB1cCBpbiBjb21wbGljYXRlZCBleHByZXNzaW9ucyBzdWNoIGFzIAotICogX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLS5MMjg0XSwgd2hpY2ggY2Fubm90IGJlIGV4cHJlc3NlZCBub3JtYWxseSB3aXRoCi0gKiB0aGUgcmVndWxhciBleHByZXNzaW9ucy4gIFRoZSBmaXh1cCBzcGVjaWZpZWQgaGVyZSB3aGVuIHVzZWQgYXQgcnVudGltZSAKLSAqIGltcGxpZXMgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBhZGRyZXNzIG9mIHRoZSBHT1QgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiwKLSAqIGFuZCBhcyBhIHJlc3VsdCB3ZSBoYXZlIHNpbXBsaWZpZWQgdGhlIGV4cHJlc3Npb24gaW50byBzb21ldGhpbmcgd2UgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBUQ19SRUxPQ19HTE9CQUxfT0ZGU0VUX1RBQkxFIEJGRF9SRUxPQ18zODZfR09UUEMKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbCBvYmplY3QKLSAgIGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICBUcnVlIGlmIHdlCi0gICBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZyB0aGUgLm8gZmlsZS4KLSAgIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucywgc28gR09UT0ZGIGRvZXMgbm90IG5lZWQgdG8gYmUKLSAgIGNoZWNrZWQgaGVyZS4gIEkgYW0gbm90IHN1cmUgaWYgc29tZSBvZiB0aGUgb3RoZXJzIGFyZSBldmVyIHVzZWQgd2l0aAotICAgcGNyZWwsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gYmUgc2FmZSB0aGFuIHNvcnJ5LiAqLwotCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpCQkJCVwKLSAgKChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9QTFQzMgkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9HT1QzMgkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9HT1RQQwkJCVwKLSAgICYmICgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTAkJCQkJXAotICAgICAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKSkKLQotI2RlZmluZSBUQVJHRVRfQVJDSAkJYmZkX2FyY2hfaTM4NgotCi0jaWZkZWYgT0JKX0FPVVQKLSNpZmRlZiBURV9OZXRCU0QKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LWkzODYtbmV0YnNkIgotI2VuZGlmCi0jaWZkZWYgVEVfMzg2QlNECi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2LWJzZCIKLSNlbmRpZgotI2lmZGVmIFRFX0xJTlVYCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2LWxpbnV4IgotI2VuZGlmCi0jaWZkZWYgVEVfTWFjaAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtbWFjaDMiCi0jZW5kaWYKLSNpZmRlZiBURV9EWU5JWAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1keW5peCIKLSNlbmRpZgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2IgotI2VuZGlmCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImVsZjMyLWkzODYiCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLSNpZmRlZiBPQkpfTUFZQkVfQ09GRgotZXh0ZXJuIGNvbnN0IGNoYXIgKmkzODZfdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgaTM4Nl90YXJnZXRfZm9ybWF0ICgpCi0jZW5kaWYKLSNlbmRpZgotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogQ09GRiBTVFVGRiAqLwotCi0jZGVmaW5lIENPRkZfTUFHSUMgSTM4Nk1BR0lDCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2kzODYKLSNkZWZpbmUgQ09GRl9GTEFHUyBGX0FSMzJXUgotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKHgpLT5meF9hZGRzeSB8fCAoeCktPmZ4X3JfdHlwZT09NykKLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLWV4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoZnJhZ1MgKmZyYWcpKTsKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAyCi0jZGVmaW5lIFRDX1JWQV9SRUxPQyA3Ci0vKiBOZWVkIHRoaXMgZm9yIFBJQyByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotCi0KLSNpZmRlZiBURV8zODZCU0QKLS8qIFRoZSBCU0RJIGxpbmtlciBhcHBhcmVudGx5IHJlamVjdHMgb2JqZWN0cyB3aXRoIGEgbWFjaGluZSB0eXBlIG9mCi0gICBNXzM4NiAoMTAwKS4gICovCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMAotI2Vsc2UKLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAxMDAKLSNlbmRpZgotCi0jdW5kZWYgUkVWRVJTRV9TT1JUX1JFTE9DUwotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSB0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKLWV4dGVybiBpbnQgdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBOT19SRUxPQyBCRkRfUkVMT0NfTk9ORQotI2Vsc2UKLSNkZWZpbmUgTk9fUkVMT0MgMAotI2VuZGlmCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKQk7CS8qIG5vdCB1c2VkICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2lmbmRlZiBPQkpfQU9VVAotI2lmbmRlZiBURV9QRQotI2lmbmRlZiBURV9HTzMyCi0vKiBMb2NhbCBsYWJlbHMgc3RhcnRzIHdpdGggLkwgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKG5hbWVbMF0gPT0gJy4nIFwKLQkJICYmIChuYW1lWzFdID09ICdMJyB8fCBuYW1lWzFdID09ICdYJyB8fCBuYW1lWzFdID09ICcuJykpCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgZXh0cmFfc3ltYm9sX2NoYXJzW107Ci0jZGVmaW5lIHRjX3N5bWJvbF9jaGFycyBleHRyYV9zeW1ib2xfY2hhcnMKLQotI2RlZmluZSBNQVhfT1BFUkFORFMgMwkJLyogbWF4IG9wZXJhbmRzIHBlciBpbnNuICovCi0jZGVmaW5lIE1BWF9JTU1FRElBVEVfT1BFUkFORFMgMi8qIG1heCBpbW1lZGlhdGVzIHBlciBpbnNuIChsY2FsbCwgbGptcCkgKi8KLSNkZWZpbmUgTUFYX01FTU9SWV9PUEVSQU5EUyAyCS8qIG1heCBtZW1vcnkgcmVmcyBwZXIgaW5zbiAoc3RyaW5nIG9wcykgKi8KLQotLyogUHJlZml4ZXMgd2lsbCBiZSBlbWl0dGVkIGluIHRoZSBvcmRlciBkZWZpbmVkIGJlbG93LgotICAgV0FJVF9QUkVGSVggbXVzdCBiZSB0aGUgZmlyc3QgcHJlZml4IHNpbmNlIEZXQUlUIGlzIHJlYWxseSBpcyBhbgotICAgaW5zdHJ1Y3Rpb24sIGFuZCBzbyBtdXN0IGNvbWUgYmVmb3JlIGFueSBwcmVmaXhlcy4gKi8KLSNkZWZpbmUgV0FJVF9QUkVGSVgJMAotI2RlZmluZSBMT0NLUkVQX1BSRUZJWAkxCi0jZGVmaW5lIEFERFJfUFJFRklYCTIKLSNkZWZpbmUgREFUQV9QUkVGSVgJMwotI2RlZmluZSBTRUdfUFJFRklYCTQKLSNkZWZpbmUgTUFYX1BSRUZJWEVTCTUJLyogbWF4IHByZWZpeGVzIHBlciBvcGNvZGUgKi8KLQotLyogd2UgZGVmaW5lIHRoZSBzeW50YXggaGVyZSAobW9kdWxvIGJhc2UsaW5kZXgsc2NhbGUgc3ludGF4KSAqLwotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVggJyUnCi0jZGVmaW5lIElNTUVESUFURV9QUkVGSVggJyQnCi0jZGVmaW5lIEFCU09MVVRFX1BSRUZJWCAnKicKLQotI2RlZmluZSBUV09fQllURV9PUENPREVfRVNDQVBFIDB4MGYKLSNkZWZpbmUgTk9QX09QQ09ERSAoY2hhcikgMHg5MAotCi0vKiByZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lIEVCUF9SRUdfTlVNIDUKLSNkZWZpbmUgRVNQX1JFR19OVU0gNAotCi0vKiBtb2RybV9ieXRlLnJlZ21lbSBmb3IgdHdvYnl0ZSBlc2NhcGUgKi8KLSNkZWZpbmUgRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkcgRVNQX1JFR19OVU0KLS8qIGluZGV4X2Jhc2VfYnl0ZS5pbmRleCBmb3Igbm8gaW5kZXggcmVnaXN0ZXIgYWRkcmVzc2luZyAqLwotI2RlZmluZSBOT19JTkRFWF9SRUdJU1RFUiBFU1BfUkVHX05VTQotLyogaW5kZXhfYmFzZV9ieXRlLmJhc2UgZm9yIG5vIGJhc2UgcmVnaXN0ZXIgYWRkcmVzc2luZyAqLwotI2RlZmluZSBOT19CQVNFX1JFR0lTVEVSIEVCUF9SRUdfTlVNCi0jZGVmaW5lIE5PX0JBU0VfUkVHSVNURVJfMTYgNgotCi0vKiB0aGVzZSBhcmUgdGhlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzLiAgKi8KLSNkZWZpbmUgRFdPUkRfTU5FTV9TVUZGSVggJ2wnCi0jZGVmaW5lIFdPUkRfTU5FTV9TVUZGSVggICd3JwotI2RlZmluZSBCWVRFX01ORU1fU1VGRklYICAnYicKLSNkZWZpbmUgU0hPUlRfTU5FTV9TVUZGSVggJ3MnCi0jZGVmaW5lIExPTkdfTU5FTV9TVUZGSVggICdsJwotLyogSW50ZWwgU3ludGF4ICovCi0jZGVmaW5lIExPTkdfRE9VQkxFX01ORU1fU1VGRklYICd4JwotLyogSW50ZWwgU3ludGF4ICovCi0jZGVmaW5lIElOVEVMX0RXT1JEX01ORU1fU1VGRklYICdkJwotCi0vKiBtb2RybS5tb2RlID0gUkVHTUVNX0ZJRUxEX0hBU19SRUcgd2hlbiBhIHJlZ2lzdGVyIGlzIGluIHRoZXJlICovCi0jZGVmaW5lIFJFR01FTV9GSUVMRF9IQVNfUkVHIDB4My8qIGFsd2F5cyA9IDB4MyAqLwotI2RlZmluZSBSRUdNRU1fRklFTERfSEFTX01FTSAoflJFR01FTV9GSUVMRF9IQVNfUkVHKQotCi0jZGVmaW5lIEVORF9PRl9JTlNOICdcMCcKLQotLyogSW50ZWwgU3ludGF4ICovCi0vKiBWYWx1ZXMgMC00IG1hcCBvbnRvIHNjYWxlIGZhY3RvciAqLwotI2RlZmluZSBCWVRFX1BUUiAgICAgMAotI2RlZmluZSBXT1JEX1BUUiAgICAgMQotI2RlZmluZSBEV09SRF9QVFIgICAgMgotI2RlZmluZSBRV09SRF9QVFIgICAgMwotI2RlZmluZSBYV09SRF9QVFIgICAgNAotI2RlZmluZSBTSE9SVCAgICAgICAgNQotI2RlZmluZSBPRkZTRVRfRkxBVCAgNgotI2RlZmluZSBGTEFUICAgICAgICAgNwotI2RlZmluZSBOT05FX0ZPVU5EICAgOAotLyoKLSAgV2hlbiBhbiBvcGVyYW5kIGlzIHJlYWQgaW4gaXQgaXMgY2xhc3NpZmllZCBieSBpdHMgdHlwZS4gIFRoaXMgdHlwZSBpbmNsdWRlcwotICBhbGwgdGhlIHBvc3NpYmxlIHdheXMgYW4gb3BlcmFuZCBjYW4gYmUgdXNlZC4gIFRodXMsICclZWF4JyBpcyBib3RoICdyZWdpc3RlcgotICAjIDAnIGFuZCAnVGhlIEFjY3VtdWxhdG9yJy4gIEluIG91ciBsYW5ndWFnZSB0aGlzIGlzIGV4cHJlc3NlZCBieSBPUidpbmcKLSAgJ1JlZzMyJyAoYW55IDMyIGJpdCByZWdpc3RlcikgYW5kICdBY2MnICh0aGUgYWNjdW11bGF0b3IpLgotICBPcGVyYW5kcyBhcmUgY2xhc3NpZmllZCBzbyB0aGF0IHdlIGNhbiBtYXRjaCBnaXZlbiBvcGVyYW5kIHR5cGVzIHdpdGgKLSAgdGhlIG9wY29kZSB0YWJsZSBpbiBvcGNvZGUvaTM4Ni5oLgotICAqLwotLyogcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUmVnOAkJICAgMHgxCS8qIDggYml0IHJlZyAqLwotI2RlZmluZSBSZWcxNgkJICAgMHgyCS8qIDE2IGJpdCByZWcgKi8KLSNkZWZpbmUgUmVnMzIJCSAgIDB4NAkvKiAzMiBiaXQgcmVnICovCi0vKiBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tOAkJICAgMHg4CS8qIDggYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBJbW04UwkJICAweDEwCS8qIDggYml0IGltbWVkaWF0ZSBzaWduIGV4dGVuZGVkICovCi0jZGVmaW5lIEltbTE2CQkgIDB4MjAJLyogMTYgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBJbW0zMgkJICAweDQwCS8qIDMyIGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tMQkJICAweDgwCS8qIDEgYml0IGltbWVkaWF0ZSAqLwotLyogbWVtb3J5ICovCi0jZGVmaW5lIEJhc2VJbmRleAkgMHgxMDAKLS8qIERpc3A4LDE2LDMyIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24gdGhlCi0gICBpbnN0cnVjdGlvbi4gIEZvciBqdW1wcywgdGhleSBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBQQyByZWxhdGl2ZQotICAgZGlzcGxhY2VtZW50LCBmb3IgYmFzZWluZGV4IHR5cGUgaW5zdHJ1Y3Rpb25zLCB0aGV5IHNwZWNpZnkgdGhlCi0gICBzaXplIG9mIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGJhc2UgcmVnaXN0ZXIsIGFuZCBmb3IgbWVtb3J5Ci0gICBvZmZzZXQgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgYG1vdiAxMjM0LCVhbCcgdGhleSBzcGVjaWZ5IHRoZSBzaXplIG9mCi0gICB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzZWdtZW50IGJhc2UuICAqLwotI2RlZmluZSBEaXNwOAkJIDB4MjAwCS8qIDggYml0IGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBEaXNwMTYJCSAweDQwMAkvKiAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIERpc3AzMgkJIDB4ODAwCS8qIDMyIGJpdCBkaXNwbGFjZW1lbnQgKi8KLS8qIHNwZWNpYWxzICovCi0jZGVmaW5lIEluT3V0UG9ydFJlZwkweDEwMDAJLyogcmVnaXN0ZXIgdG8gaG9sZCBpbi9vdXQgcG9ydCBhZGRyID0gZHggKi8KLSNkZWZpbmUgU2hpZnRDb3VudAkweDIwMDAJLyogcmVnaXN0ZXIgdG8gaG9sZCBzaGlmdCBjb3VuZCA9IGNsICovCi0jZGVmaW5lIENvbnRyb2wJICAgICAgICAweDQwMDAJLyogQ29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBEZWJ1ZwkgICAgICAgIDB4ODAwMAkvKiBEZWJ1ZyByZWdpc3RlciAqLwotI2RlZmluZSBUZXN0CSAgICAgICAweDEwMDAwCS8qIFRlc3QgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRmxvYXRSZWcgICAgICAgMHgyMDAwMAkvKiBGbG9hdCByZWdpc3RlciAqLwotI2RlZmluZSBGbG9hdEFjYyAgICAgICAweDQwMDAwCS8qIEZsb2F0IHN0YWNrIHRvcCAlc3QoMCkgKi8KLSNkZWZpbmUgU1JlZzIJICAgICAgIDB4ODAwMDAJLyogMiBiaXQgc2VnbWVudCByZWdpc3RlciAqLwotI2RlZmluZSBTUmVnMwkgICAgICAweDEwMDAwMAkvKiAzIGJpdCBzZWdtZW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIEFjYwkgICAgICAweDIwMDAwMAkvKiBBY2N1bXVsYXRvciAlYWwgb3IgJWF4IG9yICVlYXggKi8KLSNkZWZpbmUgSnVtcEFic29sdXRlICAweDQwMDAwMAotI2RlZmluZSBSZWdNTVgJICAgICAgMHg4MDAwMDAJLyogTU1YIHJlZ2lzdGVyICovCi0jZGVmaW5lIFJlZ1hNTQkgICAgIDB4MTAwMDAwMAkvKiBYTU0gcmVnaXN0ZXJzIGluIFBJSUkgKi8KLSNkZWZpbmUgRXNTZWcJICAgICAweDIwMDAwMDAJLyogU3RyaW5nIGluc24gb3BlcmFuZCB3aXRoIGZpeGVkIGVzIHNlZ21lbnQgKi8KLS8qIEludk1lbSBpcyBmb3IgaW5zdHJ1Y3Rpb25zIHdpdGggYSBtb2RybSBieXRlIHRoYXQgb25seSBhbGxvdyBhCi0gICBnZW5lcmFsIHJlZ2lzdGVyIGVuY29kaW5nIGluIHRoZSBpLnRtLm1vZGUgYW5kIGkudG0ucmVnbWVtIGZpZWxkcywKLSAgIGVnLiBjb250cm9sIHJlZyBtb3Zlcy4gIFRoZXkgcmVhbGx5IG91Z2h0IHRvIHN1cHBvcnQgYSBtZW1vcnkgZm9ybSwKLSAgIGJ1dCBkb24ndCwgc28gd2UgYWRkIGFuIEludk1lbSBmbGFnIHRvIHRoZSByZWdpc3RlciBvcGVyYW5kIHRvCi0gICBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBiZSBlbmNvZGVkIGluIHRoZSBpLnRtLnJlZ21lbSBmaWVsZC4gICovCi0jZGVmaW5lIEludk1lbQkgICAgIDB4NDAwMDAwMAotCi0jZGVmaW5lIFJlZwkoUmVnOHxSZWcxNnxSZWczMikJLyogZ2VuJ2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgV29yZFJlZyAoUmVnMTZ8UmVnMzIpCi0jZGVmaW5lIEltcGxpY2l0UmVnaXN0ZXIgKEluT3V0UG9ydFJlZ3xTaGlmdENvdW50fEFjY3xGbG9hdEFjYykKLSNkZWZpbmUgSW1tCShJbW04fEltbThTfEltbTE2fEltbTMyKSAvKiBnZW4nbCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgRGlzcAkoRGlzcDh8RGlzcDE2fERpc3AzMikJLyogR2VuZXJhbCBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgQW55TWVtCShEaXNwfEJhc2VJbmRleHxJbnZNZW0pCS8qIEdlbmVyYWwgbWVtb3J5ICovCi0vKiBUaGUgZm9sbG93aW5nIGFsaWFzZXMgYXJlIGRlZmluZWQgYmVjYXVzZSB0aGUgb3Bjb2RlIHRhYmxlCi0gICBjYXJlZnVsbHkgc3BlY2lmaWVzIHRoZSBhbGxvd2VkIG1lbW9yeSB0eXBlcyBmb3IgZWFjaCBpbnN0cnVjdGlvbi4KLSAgIEF0IHRoZSBtb21lbnQgd2UgY2FuIG9ubHkgdGVsbCBhIG1lbW9yeSByZWZlcmVuY2Ugc2l6ZSBieSB0aGUKLSAgIGluc3RydWN0aW9uIHN1ZmZpeCwgc28gdGhlcmUncyBub3QgbXVjaCBwb2ludCBpbiBkZWZpbmluZyBNZW04LAotICAgTWVtMTYsIE1lbTMyIGFuZCBNZW02NCBvcGNvZGUgbW9kaWZpZXJzIC0gV2UgbWlnaHQgYXMgd2VsbCBqdXN0IHVzZQotICAgdGhlIHN1ZmZpeCBkaXJlY3RseSB0byBjaGVjayBtZW1vcnkgb3BlcmFuZHMuICAqLwotI2RlZmluZSBMTG9uZ01lbSBBbnlNZW0JCS8qIDY0IGJpdHMgKG9yIG1vcmUpICovCi0jZGVmaW5lIExvbmdNZW0gQW55TWVtCQkvKiAzMiBiaXQgbWVtb3J5IHJlZiAqLwotI2RlZmluZSBTaG9ydE1lbSBBbnlNZW0JCS8qIDE2IGJpdCBtZW1vcnkgcmVmICovCi0jZGVmaW5lIFdvcmRNZW0gQW55TWVtCQkvKiAxNiBvciAzMiBiaXQgbWVtb3J5IHJlZiAqLwotI2RlZmluZSBCeXRlTWVtIEFueU1lbQkJLyogOCBiaXQgbWVtb3J5IHJlZiAqLwotCi0jZGVmaW5lIFNNQUxMRVNUX0RJU1BfVFlQRShudW0pIFwKLSAgICAoZml0c19pbl9zaWduZWRfYnl0ZShudW0pID8gKERpc3A4fERpc3AzMikgOiBEaXNwMzIpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIGluc3RydWN0aW9uIG5hbWUgc2FucyB3aWR0aCBzdWZmaXggKCJtb3YiIGZvciBtb3ZsIGluc25zKSAqLwotICBjaGFyICpuYW1lOwotCi0gIC8qIGhvdyBtYW55IG9wZXJhbmRzICovCi0gIHVuc2lnbmVkIGludCBvcGVyYW5kczsKLQotICAvKiBiYXNlX29wY29kZSBpcyB0aGUgZnVuZGFtZW50YWwgb3Bjb2RlIGJ5dGUgd2l0aG91dCBvcHRpb25hbAotICAgICBwcmVmaXgoZXMpLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2Vfb3Bjb2RlOwotCi0gIC8qIGV4dGVuc2lvbl9vcGNvZGUgaXMgdGhlIDMgYml0IGV4dGVuc2lvbiBmb3IgZ3JvdXAgPG4+IGluc25zLgotICAgICBUaGlzIGZpZWxkIGlzIGFsc28gdXNlZCB0byBzdG9yZSB0aGUgOC1iaXQgb3Bjb2RlIHN1ZmZpeCBmb3IgdGhlCi0gICAgIEFNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zLgotICAgICBJZiB0aGlzIHRlbXBsYXRlIGhhcyBubyBleHRlbnNpb24gb3Bjb2RlICh0aGUgdXN1YWwgY2FzZSkgdXNlIE5vbmUgKi8KLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbl9vcGNvZGU7Ci0jZGVmaW5lIE5vbmUgMHhmZmZmCQkvKiBJZiBubyBleHRlbnNpb25fb3Bjb2RlIGlzIHBvc3NpYmxlLiAqLwotCi0gIC8qIHRoZSBiaXRzIGluIG9wY29kZV9tb2RpZmllciBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgb3Bjb2RlIGZyb20KLSAgICAgdGhlIGJhc2Vfb3Bjb2RlLiAgVGhlc2UgYml0cyBhbHNvIGFyZSB1c2VkIHRvIGRldGVjdCBhbHRlcm5hdGUgZm9ybXMgb2YKLSAgICAgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKi8KLSAgdW5zaWduZWQgaW50IG9wY29kZV9tb2RpZmllcjsKLQotICAvKiBvcGNvZGVfbW9kaWZpZXIgYml0czogKi8KLSNkZWZpbmUgVwkJICAgMHgxCS8qIHNldCBpZiBvcGVyYW5kcyBjYW4gYmUgd29yZHMgb3IgZHdvcmRzCi0JCQkJICAgZW5jb2RlZCB0aGUgY2Fub25pY2FsIHdheSAqLwotI2RlZmluZSBECQkgICAweDIJLyogRCA9IDAgaWYgUmVnIC0tPiBSZWdtZW07Ci0JCQkJICAgRCA9IDEgaWYgUmVnbWVtIC0tPiBSZWc6ICAgIE1VU1QgQkUgMHgyICovCi0jZGVmaW5lIE1vZHJtCQkgICAweDQKLSNkZWZpbmUgRmxvYXRSCQkgICAweDgJLyogc3JjL2Rlc3Qgc3dhcCBmb3IgZmxvYXRzOiAgIE1VU1QgQkUgMHg4ICovCi0jZGVmaW5lIFNob3J0Rm9ybQkgIDB4MTAJLyogcmVnaXN0ZXIgaXMgaW4gbG93IDMgYml0cyBvZiBvcGNvZGUgKi8KLSNkZWZpbmUgRmxvYXRNRgkJICAweDIwCS8qIEZQIGluc24gbWVtb3J5IGZvcm1hdCBiaXQsIHNpemVkIGJ5IDB4NCAqLwotI2RlZmluZSBKdW1wCQkgIDB4NDAJLyogc3BlY2lhbCBjYXNlIGZvciBqdW1wIGluc25zLiAqLwotI2RlZmluZSBKdW1wRHdvcmQJICAweDgwICAvKiBjYWxsIGFuZCBqdW1wICovCi0jZGVmaW5lIEp1bXBCeXRlCSAweDEwMCAgLyogbG9vcCBhbmQgamVjeHogKi8KLSNkZWZpbmUgSnVtcEludGVyU2VnbWVudCAweDIwMAkvKiBzcGVjaWFsIGNhc2UgZm9yIGludGVyc2VnbWVudCBsZWFwcy9jYWxscyAqLwotI2RlZmluZSBGbG9hdEQJCSAweDQwMAkvKiBkaXJlY3Rpb24gZm9yIGZsb2F0IGluc25zOiAgTVVTVCBCRSAweDQwMCAqLwotI2RlZmluZSBTZWcyU2hvcnRGb3JtCSAweDgwMAkvKiBlbmNvZGluZyBvZiBsb2FkIHNlZ21lbnQgcmVnIGluc25zICovCi0jZGVmaW5lIFNlZzNTaG9ydEZvcm0JMHgxMDAwCS8qIGZzL2dzIHNlZ21lbnQgcmVnaXN0ZXIgaW5zbnMuICovCi0jZGVmaW5lIFNpemUxNgkJMHgyMDAwCS8qIG5lZWRzIHNpemUgcHJlZml4IGlmIGluIDMyLWJpdCBtb2RlICovCi0jZGVmaW5lIFNpemUzMgkJMHg0MDAwCS8qIG5lZWRzIHNpemUgcHJlZml4IGlmIGluIDE2LWJpdCBtb2RlICovCi0jZGVmaW5lIElnbm9yZVNpemUJMHg4MDAwICAvKiBpbnN0cnVjdGlvbiBpZ25vcmVzIG9wZXJhbmQgc2l6ZSBwcmVmaXggKi8KLSNkZWZpbmUgTm9fYlN1ZgkgICAgICAgMHgxMDAwMAkvKiBiIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX3dTdWYJICAgICAgIDB4MjAwMDAJLyogdyBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb19sU3VmCSAgICAgICAweDQwMDAwCS8qIGwgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9fc1N1ZgkgICAgICAgMHg4MDAwMAkvKiBzIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX2RTdWYgICAgICAgMHgxMDAwMDAgIC8qIGQgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9feFN1ZiAgICAgICAweDIwMDAwMCAgLyogeCBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBGV2FpdAkgICAgICAweDQwMDAwMAkvKiBpbnN0cnVjdGlvbiBuZWVkcyBGV0FJVCAqLwotI2RlZmluZSBJc1N0cmluZyAgICAgIDB4ODAwMDAwCS8qIHF1aWNrIHRlc3QgZm9yIHN0cmluZyBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgcmVnS2x1ZGdlICAgIDB4MTAwMDAwMAkvKiBmYWtlIGFuIGV4dHJhIHJlZyBvcGVyYW5kIGZvciBjbHIsIGltdWwgKi8KLSNkZWZpbmUgSXNQcmVmaXggICAgIDB4MjAwMDAwMAkvKiBvcGNvZGUgaXMgYSBwcmVmaXggKi8KLSNkZWZpbmUgSW1tRXh0CSAgICAgMHg0MDAwMDAwCS8qIGluc3RydWN0aW9uIGhhcyBleHRlbnNpb24gaW4gOCBiaXQgaW1tICovCi0jZGVmaW5lIFVnaAkgICAgMHg4MDAwMDAwMAkvKiBkZXByZWNhdGVkIGZwIGluc24sIGdldHMgYSB3YXJuaW5nICovCi0KLSAgLyogb3BlcmFuZF90eXBlc1tpXSBkZXNjcmliZXMgdGhlIHR5cGUgb2Ygb3BlcmFuZCBpLiAgVGhpcyBpcyBtYWRlCi0gICAgIGJ5IE9SJ2luZyB0b2dldGhlciBhbGwgb2YgdGhlIHBvc3NpYmxlIHR5cGUgbWFza3MuICAoZS5nLgotICAgICAnb3BlcmFuZF90eXBlc1tpXSA9IFJlZ3xJbW0nIHNwZWNpZmllcyB0aGF0IG9wZXJhbmQgaSBjYW4gYmUKLSAgICAgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gaW1tZWRpYXRlIG9wZXJhbmQgKi8KLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbM107Ci19Ci10ZW1wbGF0ZTsKLQotLyoKLSAgJ3RlbXBsYXRlcycgaXMgZm9yIGdyb3VwaW5nIHRvZ2V0aGVyICd0ZW1wbGF0ZScgc3RydWN0dXJlcyBmb3Igb3Bjb2RlcwotICBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHN0b3JpbmcgdGhlIGluc25zIGluIHRoZSBncmFuZAotICBvbGUgaGFzaCB0YWJsZSBvZiBpbnNucy4KLSAgVGhlIHRlbXBsYXRlcyB0aGVtc2VsdmVzIHN0YXJ0IGF0IFNUQVJUIGFuZCByYW5nZSB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpCi0gIEVORC4KLSAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBjb25zdCB0ZW1wbGF0ZSAqc3RhcnQ7Ci0gICAgY29uc3QgdGVtcGxhdGUgKmVuZDsKLSAgfSB0ZW1wbGF0ZXM7Ci0KLS8qIHRoZXNlIGFyZSBmb3IgcmVnaXN0ZXIgbmFtZSAtLT4gbnVtYmVyICYgdHlwZSBoYXNoIGxvb2t1cCAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKnJlZ19uYW1lOwotICAgIHVuc2lnbmVkIGludCByZWdfdHlwZTsKLSAgICB1bnNpZ25lZCBpbnQgcmVnX251bTsKLSAgfQotcmVnX2VudHJ5OwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY2hhciAqc2VnX25hbWU7Ci0gICAgdW5zaWduZWQgaW50IHNlZ19wcmVmaXg7Ci0gIH0KLXNlZ19lbnRyeTsKLQotLyogMzg2IG9wZXJhbmQgZW5jb2RpbmcgYnl0ZXM6ICBzZWUgMzg2IGJvb2sgZm9yIGRldGFpbHMgb2YgdGhpcy4gKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBpbnQgcmVnbWVtOwkvKiBjb2RlcyByZWdpc3RlciBvciBtZW1vcnkgb3BlcmFuZCAqLwotICAgIHVuc2lnbmVkIGludCByZWc7CQkvKiBjb2RlcyByZWdpc3RlciBvcGVyYW5kIChvciBleHRlbmRlZCBvcGNvZGUpICovCi0gICAgdW5zaWduZWQgaW50IG1vZGU7CQkvKiBob3cgdG8gaW50ZXJwcmV0IHJlZ21lbSAmIHJlZyAqLwotICB9Ci1tb2RybV9ieXRlOwotCi0vKiAzODYgb3Bjb2RlIGJ5dGUgdG8gY29kZSBpbmRpcmVjdCBhZGRyZXNzaW5nLiAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGJhc2U7Ci0gICAgdW5zaWduZWQgaW5kZXg7Ci0gICAgdW5zaWduZWQgc2NhbGU7Ci0gIH0KLXNpYl9ieXRlOwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLiBBbGxvdwotICAgdGhpcyB0byBiZSBvdmVycmlkZGVuIGlmIG5lZWQgYmUuICovCi0jaWZuZGVmIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRQotI2RlZmluZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotdm9pZCBpMzg2X3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNkZWZpbmUgVENfVkFMSURBVEVfRklYKEZJWFAsU0VHVFlQRSxTS0lQKSBpMzg2X3ZhbGlkYXRlX2ZpeChGSVhQKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBUQ19JMzg2ICovCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0KLWV4dGVybiBpbnQgZmxhZ18xNmJpdF9jb2RlOwotCi0jZGVmaW5lIG1kX2RvX2FsaWduKG4sIGZpbGwsIGxlbiwgbWF4LCBhcm91bmQpCQkJCVwKLWlmICgobikgJiYgIW5lZWRfcGFzc18yCQkJCQkJCVwKLSAgICAmJiAoIShmaWxsKSB8fCAoKGNoYXIpKihmaWxsKSA9PSAoY2hhcikweDkwICYmIChsZW4pID09IDEpKQkJXAotICAgICYmIHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpKQkJCQkJCVwKLSAgewkJCQkJCQkJCVwKLSAgICBjaGFyICpwOwkJCQkJCQkJXAotICAgIHAgPSBmcmFnX3ZhciAocnNfYWxpZ25fY29kZSwgMTUsIDEsIChyZWxheF9zdWJzdGF0ZVQpIG1heCwJCVwKLQkJICAoc3ltYm9sUyAqKSAwLCAob2Zmc2V0VCkgKG4pLCAoY2hhciAqKSAwKTsJCVwKLSAgICAqcCA9IDB4OTA7CQkJCQkJCQlcCi0gICAgZ290byBhcm91bmQ7CQkJCQkJCVwKLSAgfQotCi1leHRlcm4gdm9pZCBpMzg2X2FsaWduX2NvZGUgUEFSQU1TICgoZnJhZ1MgKiwgaW50KSk7Ci0KLSNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWdQKQkJCQkJCVwKLWlmIChmcmFnUC0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlKSAJCQkJCVwKLSAgaTM4Nl9hbGlnbl9jb2RlIChmcmFnUCwgKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzCQkJXAotCQkJICAgLSBmcmFnUC0+ZnJfYWRkcmVzcwkJCQlcCi0JCQkgICAtIGZyYWdQLT5mcl9maXgpKTsKLQotLyogY2FsbCBtZF9hcHBseV9maXgzIHdpdGggc2VnbWVudCBpbnN0ZWFkIG9mIG1kX2FwcGx5X2ZpeCAqLwotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLXZvaWQgaTM4Nl9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOwotI2RlZmluZSB0Y19wcmludF9zdGF0aXN0aWNzIGkzODZfcHJpbnRfc3RhdGlzdGljcwotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycyBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCi0KLSNpZmRlZiBTQ09fRUxGCi0jZGVmaW5lIHRjX2luaXRfYWZ0ZXJfYXJncygpIHNjb19pZCAoKQotZXh0ZXJuIHZvaWQgc2NvX2lkIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZGVmaW5lIERJRkZfRVhQUl9PSyAgICAvKiBmb28tLiBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBlbmQgb2YgdGMtaTM4Ni5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWk4NjAuYyBiL2dhcy9jb25maWcvdGMtaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE3MjgyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTg2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2MyArMCwwIEBACi0vKiB0Yy1pODYwLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBJODYwCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkyLCA5MywgOTQsIDk1LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9pODYwLmgiCi0KLXZvaWQgbWRfYmVnaW4gKCk7Ci12b2lkIG1kX251bWJlcl90b19jaGFycyAoKTsKLXZvaWQgbWRfYXNzZW1ibGUgKCk7Ci1jaGFyICptZF9hdG9mICgpOwotdm9pZCBtZF9jb252ZXJ0X2ZyYWcgKCk7Ci1pbnQgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKCk7Ci12b2lkIG1kX251bWJlcl90b19pbW0gKCk7Ci12b2lkIG1kX251bWJlcl90b19kaXNwICgpOwotdm9pZCBtZF9udW1iZXJfdG9fZmllbGQgKCk7Ci12b2lkIG1kX3JpX3RvX2NoYXJzICgpOwotc3RhdGljIHZvaWQgaTg2MF9pcCAoKTsKLS8qIHZvaWQgZW1pdF9tYWNoaW5lX3JlbG9jKCk7ICovCi0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLQotLyogdm9pZCAoKm1kX2VtaXRfcmVsb2NhdGlvbnMpKCkgPSBlbWl0X21hY2hpbmVfcmVsb2M7ICovCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotc3RhdGljIHZvaWQgc19kdWFsICgpLCBzX2VuZGR1YWwgKCk7Ci1zdGF0aWMgdm9pZCBzX2F0bXAgKCk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUwotICBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiZHVhbCIsIHNfZHVhbCwgNH0sCi0gIHsiZW5kZHVhbCIsIHNfZW5kZHVhbCwgNH0sCi0gIHsiYXRtcCIsIHNfYXRtcCwgNH0sCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhLyI7CS8qIEpGIHJlbW92ZWQgJ3wnIGZyb20gY29tbWVudF9jaGFycyAqLwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLgotICAgKi8KLWludCBzaXplX3JlbG9jX2luZm8gPSBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBvY3RhbFsyNTZdOwotI2RlZmluZSBpc29jdGFsKGMpICBvY3RhbFtjXQotc3RhdGljIHVuc2lnbmVkIGNoYXIgdG9IZXhbMjU2XTsKLQotc3RydWN0IGk4NjBfaXQKLSAgewotICAgIGNoYXIgKmVycm9yOwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBpbnQgcGNyZWw7Ci0gICAgZW51bSBleHBhbmRfdHlwZSBleHBhbmQ7Ci0gICAgZW51bSBoaWdobG93X3R5cGUgaGlnaGxvdzsKLSAgICBlbnVtIHJlbG9jX3R5cGUgcmVsb2M7Ci0gIH0gdGhlX2luc247Ci0KLSNpZiBfX1NURENfXyA9PSAxCi0KLXN0YXRpYyB2b2lkIHByaW50X2luc24gKHN0cnVjdCBpODYwX2l0ICppbnNuKTsKLXN0YXRpYyBpbnQgZ2V0RXhwcmVzc2lvbiAoY2hhciAqc3RyKTsKLQotI2Vsc2UgLyogbm90IF9fU1REQ19fICovCi0KLXN0YXRpYyB2b2lkIHByaW50X2luc24gKCk7Ci1zdGF0aWMgaW50IGdldEV4cHJlc3Npb24gKCk7Ci0KLSNlbmRpZiAvKiBub3QgX19TVERDX18gKi8KLQotc3RhdGljIGNoYXIgKmV4cHJfZW5kOwotc3RhdGljIGNoYXIgbGFzdF9leHBhbmQ7CS8qIGVycm9yIGlmIGV4cGFuc2lvbiBhZnRlciBicmFuY2ggKi8KLQotZW51bSBkdWFsCi17Ci0gIERVQUxfT0ZGID0gMCwgRFVBTF9PTiwgRFVBTF9ERE9ULCBEVUFMX09ORERPVCwKLX07Ci1zdGF0aWMgZW51bSBkdWFsIGR1YWxfbW9kZSA9IERVQUxfT0ZGOwkvKiBkdWFsLWluc3RydWN0aW9uIG1vZGUgKi8KLQotc3RhdGljIHZvaWQKLXNfZHVhbCAoKQkJCS8qIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBoYXZlIGR1YWwgc2V0ICovCi17Ci0gIGR1YWxfbW9kZSA9IERVQUxfT047Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2VuZGR1YWwgKCkJCQkvKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgaGF2ZSBkdWFsIHNldCAqLwotewotICBkdWFsX21vZGUgPSBEVUFMX09GRjsKLX0KLQotc3RhdGljIGludCBhdG1wID0gMzE7CQkvKiB0ZW1wb3JhcnkgcmVnaXN0ZXIgZm9yIHBzZXVkbydzICovCi0KLXN0YXRpYyB2b2lkCi1zX2F0bXAgKCkKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzcCIsIDIpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICBhdG1wID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImZwIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICAgIGF0bXAgPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiciIsIDEpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDE7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAodGVtcCA+PSAwICYmIHRlbXAgPD0gMzEpCi0JYXRtcCA9IHRlbXA7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJVbmtub3duIHRlbXBvcmFyeSBwc2V1ZG8gcmVnaXN0ZXIiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbmtub3duIHRlbXBvcmFyeSBwc2V1ZG8gcmVnaXN0ZXIiKSk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpID0gMDsKLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgd2hpbGUgKGkgPCBOVU1PUENPREVTKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBpODYwX29wY29kZXNbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAmaTg2MF9vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKLQkJICAgaTg2MF9vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICBsb3NlID0gMTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmIChpODYwX29wY29kZXNbaV0ubWF0Y2ggJiBpODYwX29wY29kZXNbaV0ubG9zZSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iKSwKLQkJICAgICAgIGk4NjBfb3Bjb2Rlc1tpXS5uYW1lLCBpODYwX29wY29kZXNbaV0uYXJncyk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMKLQkgICAgICYmICFzdHJjbXAgKGk4NjBfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIGlmIChsb3NlKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotICBmb3IgKGkgPSAnMCc7IGkgPCAnOCc7ICsraSkKLSAgICBvY3RhbFtpXSA9IDE7Ci0gIGZvciAoaSA9ICcwJzsgaSA8PSAnOSc7ICsraSkKLSAgICB0b0hleFtpXSA9IGkgLSAnMCc7Ci0gIGZvciAoaSA9ICdhJzsgaSA8PSAnZic7ICsraSkKLSAgICB0b0hleFtpXSA9IGkgKyAxMCAtICdhJzsKLSAgZm9yIChpID0gJ0EnOyBpIDw9ICdGJzsgKytpKQotICAgIHRvSGV4W2ldID0gaSArIDEwIC0gJ0EnOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnRvUDsKLSAgaW50IHJzZDsKLSAgaW50IG5vX29wY29kZXMgPSAxOwotICBpbnQgaTsKLSAgc3RydWN0IGk4NjBfaXQgcHNldWRvWzNdOwotCi0gIGFzc2VydCAoc3RyKTsKLSAgaTg2MF9pcCAoc3RyKTsKLQotICAvKiBjaGVjayBmb3IgZXhwYW5kYWJsZSBmbGFnIHRvIHByb2R1Y2UgcHNldWRvLWluc3RydWN0aW9ucyAqLwotICBpZiAodGhlX2luc24uZXhwYW5kICE9IDAgJiYgdGhlX2luc24uaGlnaGxvdyA9PSBOT19TUEVDKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JcHNldWRvW2ldID0gdGhlX2luc247Ci0KLSAgICAgIHN3aXRjaCAodGhlX2luc24uZXhwYW5kKQotCXsKLQotCWNhc2UgRV9ERUxBWToKLQkgIG5vX29wY29kZXMgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTU9WOgotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNSkgJiYKLQkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAtKDEgPDwgMTUpKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBvciBsJWNvbnN0LHIwLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSB8IDB4ZTQwMDAwMDA7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IFBBSVI7Ci0JICAvKiBvcmggaCVjb25zdCxpcmVnX2Rlc3QsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDNmZmZmZmYpIHwgMHhlYzAwMDAwMCB8Ci0JICAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IEhJR0g7Ci0JICBub19vcGNvZGVzID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX0FERFI6Ci0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogb3JoIGhhJWFkZHJfZXhwcixyMCxyMzEgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAweGVjMDAwMDAwIHwgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIQURKOwotCSAgcHNldWRvWzBdLnJlbG9jID0gTE9XMDsJLyogbXVzdCBvdmVyd3JpdGUgKi8KLQkgIC8qIGwlYWRkcl9leHByKHIzMSksaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIH4weDAwM2UwMDAwKSB8IChhdG1wIDw8IDIxKTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKLQkgIG5vX29wY29kZXMgPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfVTMyOgkJLyogMm5kIHZlcnNpb24gZW11bGF0ZXMgSW50ZWwgYXMsIG5vdCBkb2MuICovCi0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE2KSAmJgotCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IDApKQotCSAgICBicmVhazsKLQkgIC8qICQob3Bjb2RlKWggaCVjb25zdCxpcmVnX3NyYzIsaXJlZ19kZXN0Ci0JCQkgICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjNmZmZmZmYpIHwgMHgwYzAwMDAwMDsgKi8KLQkgIC8qICQob3Bjb2RlKWggaCVjb25zdCxpcmVnX3NyYzIscjMxICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjNlMGZmZmYpIHwgMHgwYzAwMDAwMCB8Ci0JICAgIChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSDsKLQkgIC8qICQob3Bjb2RlKSBsJWNvbnN0LGlyZWdfZGVzdCxpcmVnX2Rlc3QKLQkJCSAgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmMDFmMDAwMCkgfCAweDA0MDAwMDAwIHwKLQkJCSAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7ICovCi0JICAvKiAkKG9wY29kZSkgbCVjb25zdCxyMzEsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjAxZjAwMDApIHwgMHgwNDAwMDAwMCB8Ci0JICAgIChhdG1wIDw8IDIxKTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKLQkgIG5vX29wY29kZXMgPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfQU5EOgkJLyogMm5kIHZlcnNpb24gZW11bGF0ZXMgSW50ZWwgYXMsIG5vdCBkb2MuICovCi0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE2KSAmJgotCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IDApKQotCSAgICBicmVhazsKLQkgIC8qIGFuZG5vdCBoJWNvbnN0LGlyZWdfc3JjMixpcmVnX2Rlc3QKLQkJCSAgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwM2ZmZmZmZikgfCAweGQ0MDAwMDAwOyAqLwotCSAgLyogYW5kbm90IGglY29uc3QsaXJlZ19zcmMyLHIzMSAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAzZTBmZmZmKSB8IDB4ZDQwMDAwMDAgfAotCSAgICAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0g7Ci0JICBwc2V1ZG9bMF0uZXhwLlhfYWRkX251bWJlciA9IC0xIC0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKLQkgIC8qIGFuZG5vdCBsJWNvbnN0LGlyZWdfZGVzdCxpcmVnX2Rlc3QKLQkJCSAgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgfCAweGQ0MDAwMDAwIHwKLQkJCSAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7ICovCi0JICAvKiBhbmRub3QgbCVjb25zdCxyMzEsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIHwgMHhkNDAwMDAwMCB8Ci0JICAgIChhdG1wIDw8IDIxKTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKLQkgIHBzZXVkb1sxXS5leHAuWF9hZGRfbnVtYmVyID0gLTEgLSB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyOwotCSAgbm9fb3Bjb2RlcyA9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9TMzI6Ci0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE1KSAmJgotCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IC0oMSA8PCAxNSkpKQotCSAgICBicmVhazsKLQkgIC8qIG9yaCBoJWNvbnN0LHIwLHIzMSAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9IDB4ZWMwMDAwMDAgfCAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0g7Ci0JICAvKiBvciBsJWNvbnN0LHIzMSxyMzEgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAweGU0MDAwMDAwIHwgKGF0bXAgPDwgMjEpIHwgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOwotCSAgLyogcjMxLGlyZWdfc3JjMixpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1syXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgfjB4MDQwMGZmZmYpIHwgKGF0bXAgPDwgMTEpOwotCSAgcHNldWRvWzJdLnJlbG9jID0gTk9fUkVMT0M7Ci0JICBub19vcGNvZGVzID0gMzsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQl9Ci0KLSAgICAgIHRoZV9pbnNuID0gcHNldWRvWzBdOwotICAgICAgLyogY2hlY2sgZm9yIGV4cGFuZGVkIG9wY29kZSBhZnRlciBicmFuY2ggb3IgaW4gZHVhbCAqLwotICAgICAgaWYgKG5vX29wY29kZXMgPiAxICYmIGxhc3RfZXhwYW5kID09IDEpCi0JYXNfd2FybiAoXygiRXhwYW5kZWQgb3Bjb2RlIGFmdGVyIGRlbGF5ZWQgYnJhbmNoOiBgJXMnIiksIHN0cik7Ci0gICAgICBpZiAobm9fb3Bjb2RlcyA+IDEgJiYgZHVhbF9tb2RlICE9IERVQUxfT0ZGKQotCWFzX3dhcm4gKF8oIkV4cGFuZGVkIG9wY29kZSBpbiBkdWFsIG1vZGU6IGAlcyciKSwgc3RyKTsKLSAgICB9Ci0KLSAgaSA9IDA7Ci0gIGRvCi0gICAgewkJCQkvKiBhbHdheXMgcHJvZHVjZSBhdCBsZWFzdCBvbmUgb3Bjb2RlICovCi0gICAgICB0b1AgPSBmcmFnX21vcmUgKDQpOwotICAgICAgLyogcHV0IG91dCB0aGUgb3Bjb2RlICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgdGhlX2luc24ub3Bjb2RlLCA0KTsKLQotICAgICAgLyogY2hlY2sgZm9yIGV4cGFuZGVkIG9wY29kZSBhZnRlciBicmFuY2ggb3IgaW4gZHVhbCAqLwotICAgICAgbGFzdF9leHBhbmQgPSB0aGVfaW5zbi5wY3JlbDsKLQotICAgICAgLyogcHV0IG91dCB0aGUgc3ltYm9sLWRlcGVuZGVudCBzdHVmZiAqLwotICAgICAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IE5PX1JFTE9DKQotCXsKLQkgIGZpeF9uZXcgKGZyYWdfbm93LAkvKiB3aGljaCBmcmFnICovCi0JCSAgICh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCS8qIHdoZXJlICovCi0JCSAgIDQsCQkvKiBzaXplICovCi0JCSAgICZ0aGVfaW5zbi5leHAsCi0JCSAgIHRoZV9pbnNuLnBjcmVsLAotCSAgLyogbWVyZ2UgYml0IGZpZWxkcyBpbnRvIG9uZSBhcmd1bWVudCAqLwotCSAgKGludCkgKCgodGhlX2luc24uaGlnaGxvdyAmIDB4MykgPDwgNCkgfCAodGhlX2luc24ucmVsb2MgJiAweGYpKSk7Ci0JfQotICAgICAgdGhlX2luc24gPSBwc2V1ZG9bKytpXTsKLSAgICB9Ci0gIHdoaWxlICgtLW5vX29wY29kZXMgPiAwKTsKLQotfQotCi1zdGF0aWMgdm9pZAotaTg2MF9pcCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGNoYXIgYzsKLSAgdW5zaWduZWQgbG9uZyBpOwotICBzdHJ1Y3QgaTg2MF9vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NTdGFydDsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGludCBtYXNrOwotICBpbnQgbWF0Y2ggPSAwOwotICBpbnQgY29tbWEgPSAwOwotCi0KLSAgZm9yIChzID0gc3RyOyBpc2xvd2VyICgqcykgfHwgKnMgPT0gJy4nIHx8ICpzID09ICczJzsgKytzKQotICAgIDsKLSAgc3dpdGNoICgqcykKLSAgICB7Ci0KLSAgICBjYXNlICdcMCc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJywnOgotICAgICAgY29tbWEgPSAxOwotCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLQotICAgIGNhc2UgJyAnOgotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jbXAgKHN0ciwgImQuIiwgMikgPT0gMCkKLSAgICB7CQkJCS8qIGNoZWNrIGZvciBkLiBvcGNvZGUgcHJlZml4ICovCi0gICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfT04pCi0JZHVhbF9tb2RlID0gRFVBTF9PTkRET1Q7Ci0gICAgICBlbHNlCi0JZHVhbF9tb2RlID0gRFVBTF9ERE9UOwotICAgICAgc3RyICs9IDI7Ci0gICAgfQotCi0gIGlmICgoaW5zbiA9IChzdHJ1Y3QgaTg2MF9vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9ERE9UIHx8IGR1YWxfbW9kZSA9PSBEVUFMX09ORERPVCkKLQlzdHIgLT0gMjsKLSAgICAgIGFzX2JhZCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChjb21tYSkKLSAgICB7Ci0gICAgICAqLS1zID0gJywnOwotICAgIH0KLSAgYXJnc1N0YXJ0ID0gczsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBvcGNvZGUgPSBpbnNuLT5tYXRjaDsKLSAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9IE5PX1JFTE9DOwotCi0gICAgICAvKgotCQkgKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlCi0JCSAqIHN1cmUgdGhhdCB0aGUgb3BlcmFuZHMgbWF0Y2gKLQkJICovCi0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQotCSAgICBjYXNlICdcMCc6CQkvKiBlbmQgb2YgYXJncyAqLwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQl7Ci0JCSAgbWF0Y2ggPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKyc6Ci0JICAgIGNhc2UgJygnOgkJLyogdGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5ICovCi0JICAgIGNhc2UgJyknOgotCSAgICBjYXNlICcsJzoKLQkgICAgY2FzZSAnICc6Ci0JICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJyMnOgkJLyogbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgKi8KLQkgICAgICBpZiAoaXNkaWdpdCAoKnMrKykpCi0JCXsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKnMpKQotCQkgICAgewotCQkgICAgICArK3M7Ci0JCSAgICB9Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcxJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIHN3aXRjaCAoKnMpCi0JCXsKLQotCQljYXNlICdmJzoJLyogZnJhbWUgcG9pbnRlciAqLwotCQkgIHMrKzsKLQkJICBpZiAoKnMrKyA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgPSAweDM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGdvdG8gZXJyb3I7Ci0KLQkJY2FzZSAncyc6CS8qIHN0YWNrIHBvaW50ZXIgKi8KLQkJICBzKys7Ci0JCSAgaWYgKCpzKysgPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMHgyOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBnb3RvIGVycm9yOwotCi0JCWNhc2UgJ3InOgkvKiBhbnkgcmVnaXN0ZXIgKi8KLQkJICBzKys7Ci0JCSAgaWYgKCFpc2RpZ2l0IChjID0gKnMrKykpCi0JCSAgICB7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaWYgKGlzZGlnaXQgKCpzKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKChjID0gMTAgKiAoYyAtICcwJykgKyAoKnMrKyAtICcwJykpID49IDMyKQotCQkJewotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYyAtPSAnMCc7Ci0JCSAgICB9Ci0JCSAgbWFzayA9IGM7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoJLyogbm90IHRoaXMgb3Bjb2RlICovCi0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgIC8qCi0JCQkJICogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUKLQkJCQkgKiBpdCBnb2VzIGluIHRoZSBvcGNvZGUuCi0JCQkJICovCi0JICAgICAgc3dpdGNoICgqYXJncykKLQkJewotCi0JCWNhc2UgJzEnOgotCQkgIG9wY29kZSB8PSBtYXNrIDw8IDExOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJzInOgotCQkgIG9wY29kZSB8PSBtYXNrIDw8IDIxOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2QnOgotCQkgIG9wY29kZSB8PSBtYXNrIDw8IDE2OwotCQkgIGNvbnRpbnVlOwotCi0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdlJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICdnJzoKLQkgICAgICBpZiAoKnMrKyA9PSAnZicgJiYgaXNkaWdpdCAoKnMpKQotCQl7Ci0JCSAgbWFzayA9ICpzKys7Ci0JCSAgaWYgKGlzZGlnaXQgKCpzKSkKLQkJICAgIHsKLQkJICAgICAgbWFzayA9IDEwICogKG1hc2sgLSAnMCcpICsgKCpzKysgLSAnMCcpOwotCQkgICAgICBpZiAobWFzayA+PSAzMikKLQkJCXsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBtYXNrIC09ICcwJzsKLQkJICAgIH0KLQkJICBzd2l0Y2ggKCphcmdzKQotCQkgICAgewotCi0JCSAgICBjYXNlICdlJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdmJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdnJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTY7Ci0JCSAgICAgIGlmIChkdWFsX21vZGUgIT0gRFVBTF9PRkYpCi0JCQlvcGNvZGUgfD0gKDEgPDwgOSk7CS8qIGR1YWwgbW9kZSBpbnN0cnVjdGlvbiAqLwotCQkgICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfRERPVCkKLQkJCWR1YWxfbW9kZSA9IERVQUxfT0ZGOwotCQkgICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfT05ERE9UKQotCQkJZHVhbF9tb2RlID0gRFVBTF9PTjsKLQkJICAgICAgaWYgKChvcGNvZGUgJiAoMSA8PCAxMCkpICYmIChtYXNrID09ICgob3Bjb2RlID4+IDExKSAmIDB4MWYpKSkKLQkJCWFzX3dhcm4gKF8oIkZzcjEgZXF1YWxzIGZkZXN0IHdpdGggUGlwZWxpbmluZyIpKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdjJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgY29udHJvbCByZWdpc3RlciAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZmlyIiwgMykgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDAgPDwgMjE7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJwc3IiLCAzKSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4MSA8PCAyMTsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgImRpcmJhc2UiLCA3KSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4MiA8PCAyMTsKLQkJICBzICs9IDc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgImRiIiwgMikgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDMgPDwgMjE7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJmc3IiLCAzKSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4NCA8PCAyMTsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgImVwc3IiLCA0KSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4NSA8PCAyMTsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc1JzoJCS8qIDUgYml0IGltbWVkaWF0ZSBpbiBzcmMxICovCi0JICAgICAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLQkgICAgICBpZiAoIWdldEV4cHJlc3Npb24gKHMpKQotCQl7Ci0JCSAgcyA9IGV4cHJfZW5kOwotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgfjB4MWYpCi0JCSAgICBhc19iYWQgKF8oIjUtYml0IGltbWVkaWF0ZSB0b28gbGFyZ2UiKSk7Ci0JCSAgb3Bjb2RlIHw9ICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgMHgxZikgPDwgMTE7Ci0JCSAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IE5PX1JFTE9DOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbCc6CQkvKiAyNiBiaXQgaW1tZWRpYXRlLCByZWxhdGl2ZSBicmFuY2ggKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJSQUREUjsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAncyc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBzcGxpdCByZWxhdGl2ZSBicmFuY2ggKi8KLQkgICAgICAvKiB1cHBlciA1IGJpdHMgb2Ygb2Zmc2V0IGluIGRlc3QgZmllbGQgKi8KLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgdGhlX2luc24ucmVsb2MgPSBTUExJVDA7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnUyc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBzcGxpdCAoc3QpLCBhbGlnbmVkICovCi0JICAgICAgaWYgKG9wY29kZSAmICgxIDw8IDI4KSkKLQkJaWYgKG9wY29kZSAmIDB4MSkKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFNQTElUMjsKLQkJZWxzZQotCQkgIHRoZV9pbnNuLnJlbG9jID0gU1BMSVQxOwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBTUExJVDA7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnSSc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBhbGlnbmVkICovCi0JICAgICAgaWYgKG9wY29kZSAmICgxIDw8IDI4KSkKLQkJaWYgKG9wY29kZSAmIDB4MSkKLQkJICB0aGVfaW5zbi5yZWxvYyA9IExPVzI7Ci0JCWVsc2UKLQkJICB0aGVfaW5zbi5yZWxvYyA9IExPVzE7Ci0JICAgICAgZWxzZQotCQl0aGVfaW5zbi5yZWxvYyA9IExPVzA7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnaSc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBMT1cwOwotCi0JICAgICAgLypGQUxMVEhST1VHSCovCi0KLQkgICAgaW1tZWRpYXRlOgotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCXMrKzsKLQkgICAgICBpZiAoc3RybmNtcCAocywgImhhJSIsIDMpID09IDApCi0JCXsKLQkJICB0aGVfaW5zbi5oaWdobG93ID0gSElHSEFESjsKLQkJICBzICs9IDM7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAiaCUiLCAyKSA9PSAwKQotCQl7Ci0JCSAgdGhlX2luc24uaGlnaGxvdyA9IEhJR0g7Ci0JCSAgcyArPSAyOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImwlIiwgMikgPT0gMCkKLQkJewotCQkgIHRoZV9pbnNuLmhpZ2hsb3cgPSBQQUlSOwotCQkgIHMgKz0gMjsKLQkJfQotCSAgICAgIHRoZV9pbnNuLmV4cGFuZCA9IGluc24tPmV4cGFuZDsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZ2V0RXhwcmVzc2lvbigpIGZhaWxzLCB3ZSB3aWxsIHN0aWxsIGhhdmUKLQkJCQkgICBjcmVhdGVkIFUgZW50cmllcyBpbiB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUgJ3N5bWJvbHMnCi0JCQkJICAgaW4gdGhlIGlucHV0IHN0cmluZy4gIFRyeSBub3QgdG8gY3JlYXRlIFUgc3ltYm9scyBmb3IKLQkJCQkgICByZWdpc3RlcnMsIGV0Yy4gKi8KLQotCSAgICAgIGlmICghZ2V0RXhwcmVzc2lvbiAocykpCi0JCXsKLQkJICBzID0gZXhwcl9lbmQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0JewotCSAgLyogQXJncyBkb24ndCBtYXRjaC4gICovCi0JICBpZiAoJmluc25bMV0gLSBpODYwX29wY29kZXMgPCBOVU1PUENPREVTCi0JICAgICAgJiYgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKLQkgICAgewotCSAgICAgICsraW5zbjsKLQkgICAgICBzID0gYXJnc1N0YXJ0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHMiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKLX0KLQotc3RhdGljIGludAotZ2V0RXhwcmVzc2lvbiAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0gIHNlZ1Qgc2VnOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7Ci0gIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAmJiAhIFNFR19OT1JNQUwgKHNlZykpCi0gICAgewotICAgICAgdGhlX2luc24uZXJyb3IgPSBfKCJiYWQgc2VnbWVudCIpOwotICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG1kX2F0b2YgaW4gbTY4ay5jLiAgSSB0aGluayB0aGlzIGlzIHJpZ2h0LAotICBidXQgSSdtIG5vdCBzdXJlLgotCi0gIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gICovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBvdXQgYmlnLWVuZGlhbi4KLSAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbiwgZml4UCkKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgaW50IG47Ci0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGVudW0gcmVsb2NfdHlwZSByZWxvYyA9IGZpeFAtPmZ4X3JfdHlwZSAmIDB4ZjsKLSAgZW51bSBoaWdobG93X3R5cGUgaGlnaGxvdyA9IChmaXhQLT5meF9yX3R5cGUgPj4gNCkgJiAweDM7Ci0KLSAgYXNzZXJ0IChidWYpOwotICBhc3NlcnQgKG4gPT0gNCk7CQkvKiBhbHdheXMgb24gaTg2MCAqLwotCi0gIHN3aXRjaCAoaGlnaGxvdykKLSAgICB7Ci0KLSAgICBjYXNlIEhJR0hBREo6CQkvKiBhZGp1c3RzIHRoZSBoaWdoLW9yZGVyIDE2LWJpdHMgKi8KLSAgICAgIGlmICh2YWwgJiAoMSA8PCAxNSkpCi0JdmFsICs9ICgxIDw8IDE2KTsKLQotICAgICAgLypGQUxMVEhST1VHSCovCi0KLSAgICBjYXNlIEhJR0g6CQkJLyogc2VsZWN0cyB0aGUgaGlnaC1vcmRlciAxNi1iaXRzICovCi0gICAgICB2YWwgPj49IDE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBBSVI6CQkJLyogc2VsZWN0cyB0aGUgbG93LW9yZGVyIDE2LWJpdHMgKi8KLSAgICAgIHZhbCA9IHZhbCAmIDB4ZmZmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBzd2l0Y2ggKHJlbG9jKQotICAgIHsKLQotICAgIGNhc2UgQlJBRERSOgkJLyogYnIsY2FsbCxiYyxiYy50LGJuYyxibmMudCB3LzI2LWJpdCBpbW1lZGlhdGUgKi8KLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCAhPSAxKQotCWFzX2JhZCAoXygiMjYtYml0IGJyYW5jaCB3L28gcGMgcmVsYXRpdmUgc2V0OiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCA+Pj0gMjsJCS8qIGFsaWduIHBjcmVsIG9mZnNldCwgc2VlIG1hbnVhbCAqLwotCi0gICAgICBpZiAodmFsID49ICgxIDw8IDI1KSB8fCB2YWwgPCAtKDEgPDwgMjUpKQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQlhc19iYWQgKF8oIjI2LWJpdCBicmFuY2ggb2Zmc2V0IG92ZXJmbG93OiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIGJ1ZlswXSA9IChidWZbMF0gJiAweGZjKSB8ICgodmFsID4+IDI0KSAmIDB4Myk7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTUExJVDI6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCA0LWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4MykKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgNC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4MzsJCS8qIDQtYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBTUExJVDE6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCAyLWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4MSkKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgMi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4MTsJCS8qIDItYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBTUExJVDA6CQkvKiBzdCxibGEsYnRlLGJ0bmUgdy8xNi1iaXQgaW1tZWRpYXRlICovCi0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMSkKLQl2YWwgPj49IDI7CQkvKiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwgKi8KLSAgICAgIC8qIGNoZWNrIGZvciBib3VuZHMgKi8KLSAgICAgIGlmIChoaWdobG93ICE9IFBBSVIgJiYgKHZhbCA+PSAoMSA8PCAxNikgfHwgdmFsIDwgLSgxIDw8IDE1KSkpCi0JYXNfYmFkIChfKCIxNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IiksIHZhbCk7Ci0gICAgICBidWZbMV0gPSAoYnVmWzFdICYgfjB4MWYpIHwgKCh2YWwgPj4gMTEpICYgMHgxZik7Ci0gICAgICBidWZbMl0gPSAoYnVmWzJdICYgfjB4NykgfCAoKHZhbCA+PiA4KSAmIDB4Nyk7Ci0gICAgICBidWZbM10gfD0gdmFsOwkJLyogcGVyc2VydmUgYm90dG9tIG9wY29kZSBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTE9XNDoJCQkvKiBmbGQscGZsZCxwc3QsZmx1c2ggMTYtYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHhmKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSAxNi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4ZjsJCS8qIDE2LWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgTE9XMzoJCQkvKiBmbGQscGZsZCxwc3QsZmx1c2ggOC1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDcpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDgtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDc7CQkvKiA4LWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgTE9XMjoJCQkvKiAxNiBiaXQgaW1tZWRpYXRlLCA0LWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4MykKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgNC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4MzsJCS8qIDQtYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBMT1cxOgkJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDItYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHgxKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSAyLWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHgxOwkJLyogMi1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIExPVzA6CQkJLyogMTYgYml0IGltbWVkaWF0ZSwgYnl0ZSBhbGlnbmVkICovCi0gICAgICAvKiBjaGVjayBmb3IgYm91bmRzICovCi0gICAgICBpZiAoaGlnaGxvdyAhPSBQQUlSICYmICh2YWwgPj0gKDEgPDwgMTYpIHx8IHZhbCA8IC0oMSA8PCAxNSkpKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSBvdmVyZmxvdzogMHglMDh4IiksIHZhbCk7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSB8PSB2YWw7CQkvKiBwZXJzZXJ2ZSBib3R0b20gb3Bjb2RlIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOT19SRUxPQzoKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiKSwgcmVsb2MpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCi12b2lkCi1tZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9udW1iZXJfdG9fZGlzcFxuIikpOwotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCi12b2lkCi1tZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBmaXgpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIHZvaWQgKmZpeDsKLXsKLSAgYXNfZmF0YWwgKF8oImk4NjBfbnVtYmVyX3RvX2ZpZWxkXG4iKSk7Ci19Ci0KLS8qIHRoZSBiaXQtZmllbGQgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbl9pbmZvIHN0cnVjdCBwbGF5cyBoZWxsCi0gICB3aXRoIHRoZSBieXRlLW9yZGVyIHByb2JsZW1zIG9mIGNyb3NzLWFzc2VtYmx5LiAgU28gYXMgYSBoYWNrLAotICAgSSBhZGRlZCB0aGlzIG1hY2guIGRlcGVuZGVudCByaSB0d2lkZGxlci4gIFVnbHksIGJ1dCBpdCBnZXRzCi0gICB5b3UgdGhlcmUuIC1LV0sgKi8KLS8qIG9uIGk4NjA6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKLSAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIHBjcmVsLCBiaXQgNiBhcyBleHRlcm4sIGFuZCB0aGUgbG93ZXIgc2l4IGJpdHMgYXMKLSAgIHJlbG9jYXRpb24gdHlwZSAoaGlnaGxvdyA1LTQpLiAgTmV4dCA0IGJ5dGVzIGFyZSBsb25nIGFkZGVuZC4gKi8KLS8qIFRoYW54IGFuZCBhIHRpcCBvZiB0aGUgaGF0IHRvIE1pY2hhZWwgQmxvb20sIG1iQHR0aWRjYS50dGkuY29tICovCi12b2lkCi1tZF9yaV90b19jaGFycyAocmlfcCwgcmkpCi0gICAgIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJpX3AsIHJpOwotewotI2lmIDAKLSAgdW5zaWduZWQgY2hhciB0aGVfYnl0ZXNbc2l6ZW9mICgqcmlfcCldOwotCi0gIC8qIHRoaXMgaXMgZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkucl9hZGRyZXNzLCBzaXplb2YgKHJpLnJfYWRkcmVzcykpOwotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNF0gPSAocmkucl9pbmRleCA+PiAxNikgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzVdID0gKHJpLnJfaW5kZXggPj4gOCkgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzZdID0gcmkucl9pbmRleCAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKHJpLnJfZXh0ZXJuIDw8IDcpICYgMHg4MCkgfCAoMCAmIDB4NjApIHwgKHJpLnJfdHlwZSAmIDB4MUYpOwotICAvKiBBbHNvIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgmdGhlX2J5dGVzWzhdLCByaS5yX2FkZGVuZCwgc2l6ZW9mIChyaS5yX2FkZGVuZCkpOwotICAvKiBub3cgcHV0IGl0IGJhY2sgd2hlcmUgeW91IGZvdW5kIGl0LCBKdW5pb3IuLi4gKi8KLSAgbWVtY3B5ICgoY2hhciAqKSByaV9wLCB0aGVfYnl0ZXMsIHNpemVvZiAoKnJpX3ApKTsKLSNlbmRpZgotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBhc19mYXRhbCAoXygiaTg2MF9jb252ZXJ0X2ZyYWdcbiIpKTsKLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWd0eXBlOwotewotICBhc19mYXRhbCAoXygiaTg2MF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIikpOwotfQotCi0vKiBmb3IgZGVidWdnaW5nIG9ubHksIG11c3QgbWF0Y2ggZW51bSByZWxvY190eXBlICovCi1zdGF0aWMgY2hhciAqUmVsb2NbXSA9Ci17Ci0gICJOT19SRUxPQyIsCi0gICJCUkFERFIiLAotICAiTE9XMCIsCi0gICJMT1cxIiwKLSAgIkxPVzIiLAotICAiTE9XMyIsCi0gICJMT1c0IiwKLSAgIlNQTElUMCIsCi0gICJTUExJVDEiLAotICAiU1BMSVQyIiwKLSAgIlJFTE9DXzMyIiwKLX07Ci1zdGF0aWMgY2hhciAqSGlnaGxvd1tdID0KLXsKLSAgIk5PX1NQRUMiLAotICAiUEFJUiIsCi0gICJISUdIIiwKLSAgIkhJR0hBREoiLAotfTsKLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuIChpbnNuKQotICAgICBzdHJ1Y3QgaTg2MF9pdCAqaW5zbjsKLXsKLSAgaWYgKGluc24tPmVycm9yKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiAlc1xuIik7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJvcGNvZGU9MHglMDh4XHQiLCBpbnNuLT5vcGNvZGUpOwotICBmcHJpbnRmIChzdGRlcnIsICJleHBhbmQ9MHglMDh4XHQiLCBpbnNuLT5leHBhbmQpOwotICBmcHJpbnRmIChzdGRlcnIsICJyZWxvYyA9ICVzXHQiLCBSZWxvY1tpbnNuLT5yZWxvY10pOwotICBmcHJpbnRmIChzdGRlcnIsICJoaWdobG93ID0gJXNcbiIsIEhpZ2hsb3dbaW5zbi0+aGlnaGxvd10pOwotICBmcHJpbnRmIChzdGRlcnIsICJleHAgPSAge1xuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX2FkZF9zeW1ib2wgPSAlc1xuIiwKLQkgICBpbnNuLT5leHAuWF9hZGRfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCkgPwotCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA6ICI/Pz8iKSA6ICIwIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX29wX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX29wX3N5bWJvbCA/Ci0JICAgKFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgPwotCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9vcF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX251bWJlciA9ICVkXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9udW1iZXIpOwotICBmcHJpbnRmIChzdGRlcnIsICJ9XG4iKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0jaWZkZWYgY29tbWVudAotLyoKLSAqIEk4NjAgcmVsb2NhdGlvbnMgYXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50LCBzbyBpdCBuZWVkcwotICogdGhpcyBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lIHRvIGVtaXQgdGhlbS4KLSAqLwotdm9pZAotZW1pdF9tYWNoaW5lX3JlbG9jIChmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgcmVnaXN0ZXIgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIHN0cnVjdCByZWxvY19pbmZvX2k4NjAgcmk7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGV4dGVybiBjaGFyICpuZXh0X29iamVjdF9maWxlX2NoYXJQOwotICBsb25nIGFkZF9udW1iZXI7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAmcmksICdcMCcsIHNpemVvZiAocmkpKTsKLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLQotICAgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSAmIH4weDNmKQotCXsKLQkgIGFzX2ZhdGFsICgiZml4UC0+Znhfcl90eXBlID0gJWRcbiIsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0JfQotICAgICAgcmkucl9wY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotICAgICAgcmkucl90eXBlID0gZml4UC0+Znhfcl90eXBlOwotCi0gICAgICBpZiAoKHN5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSkgIT0gTlVMTCkKLQl7Ci0JICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsKLQkgICAgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLQkgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIHJpLnJfZXh0ZXJuID0gMTsKLQkgICAgICByaS5yX3N5bWJvbG51bSA9IHN5bWJvbFAtPnN5X251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmkucl9leHRlcm4gPSAwOwotCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gU19HRVRfVFlQRSAoc3ltYm9sUCk7Ci0JICAgIH0KLQkgIGlmIChzeW1ib2xQICYmIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCA9IHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX2FkZHJlc3M7Ci0JICAgIH0KLQkgIHJpLnJfdHlwZSA9IGZpeFAtPmZ4X3JfdHlwZTsKLQkgIGlmIChmaXhQLT5meF9wY3JlbCkKLQkgICAgewotCSAgICAgIC8qIHByZXNlcnZlIGFjdHVhbCBvZmZzZXQgdnMuIHBjICsgNCAqLwotCSAgICAgIHJpLnJfYWRkZW5kIC09IChyaS5yX2FkZHJlc3MgKyA0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0JICAgIH0KLQotCSAgbWRfcmlfdG9fY2hhcnMgKChjaGFyICopICZyaSwgcmkpOwotCSAgYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgKGNoYXIgKikgJnJpLCBzaXplb2YgKHJpKSk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotI2lmZGVmIE9CSl9BT1VUCi0KLS8qIG9uIGk4NjA6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKLSAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIHBjcmVsLCBiaXQgNiBhcyBleHRlcm4sIGFuZCB0aGUgbG93ZXIgc2l4IGJpdHMgYXMKLSAgIHJlbG9jYXRpb24gdHlwZSAoaGlnaGxvdyA1LTQpLiAgTmV4dCA0IGJ5dGVzIGFyZSBsb25nIGFkZGVuZC4gKi8KLQotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBsb25nIHJfaW5kZXg7Ci0gIGxvbmcgcl9leHRlcm47Ci0gIGxvbmcgcl9hZGRlbmQgPSAwOwotICBsb25nIHJfYWRkcmVzczsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSk7Ci0gIGtub3cgKCEoZml4UC0+Znhfcl90eXBlICYgfjB4M2YpKTsKLQotICBpZiAoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIHJfaW5kZXggPSBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgfQotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0JCSAgICAgIHJfYWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAotCQkgICAgICA0KTsKLQotICB3aGVyZVs0XSA9IChyX2luZGV4ID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX2luZGV4ID4+IDgpICYgMHgwZmY7Ci0gIHdoZXJlWzZdID0gcl9pbmRleCAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDcpICYgMHg4MCkKLQkgICAgICB8ICgocl9leHRlcm4gPDwgNikgJiAweDQwKQotCSAgICAgIHwgKGZpeFAtPmZ4X3JfdHlwZSAmIDB4M0YpKTsKLQotICBpZiAoc3ltYm9sX2dldF9mcmFnIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgcl9hZGRlbmQgPSBzeW1ib2xfZ2V0X2ZyYWcgKGZpeFAtPmZ4X2FkZHN5KS0+ZnJfYWRkcmVzczsKLSAgICB9Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIC8qIHByZXNlcnZlIGFjdHVhbCBvZmZzZXQgdnMuIHBjICsgNCAqLwotICAgICAgcl9hZGRlbmQgLT0gKHJfYWRkcmVzcyArIDQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotICAgIH0KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKCZ3aGVyZVs4XSwgcl9hZGRlbmQsIDQpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgaTg2MCwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCi0gICBpdHMgc2l6ZS4gKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTiEpICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpwbGFjZSA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICAvKiBsb29rcyB0byBtZSBsaWtlIGk4NjAgbmV2ZXIgaGFzIGJpdCBmaXhlcy4gTGV0J3Mgc2VlLiB4b3hvcmljaC4gKi8KLSAga25vdyAoZml4UC0+ZnhfYml0X2ZpeFAgPT0gTlVMTCk7Ci0gIGlmICghZml4UC0+ZnhfYml0X2ZpeFApCi0gICAgewotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwotICAgICAgbWRfbnVtYmVyX3RvX2ltbSAocGxhY2UsIHZhbCwgZml4UC0+Znhfc2l6ZSwgZml4UCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChwbGFjZSwgdmFsLCBmaXhQLT5meF9iaXRfZml4UCk7Ci0gICAgfQotfQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogZmlsbC1jb2x1bW46IDEzMQotICogY29tbWVudC1jb2x1bW46IDAKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGMtaTg2MC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWk4NjAuaCBiL2dhcy9jb25maWcvdGMtaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmIyMWMxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTg2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogdGMtaTg2MC5oIC0tIEhlYWRlciBmaWxlIGZvciB0aGUgSTg2MAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19JODYwIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy1pODYwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTk2MC5jIGIvZ2FzL2NvbmZpZy90Yy1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzE1YzAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQ5ICswLDAgQEAKLS8qIHRjLWk5NjAuYyAtIEFsbCB0aGUgaTgwOTYwLXNwZWNpZmljIHN0dWZmCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFNlZSBjb21tZW50IG9uIG1kX3BhcnNlX29wdGlvbiBmb3IgODA5NjAtc3BlY2lmaWMgaW52b2NhdGlvbiBvcHRpb25zLiAqLwotCi0vKiBUaGVyZSBhcmUgNCBkaWZmZXJlbnQgbGVuZ3RocyBvZiAocG90ZW50aWFsbHkpIHN5bWJvbC1iYXNlZCBkaXNwbGFjZW1lbnRzCi0gICBpbiB0aGUgODA5NjAgaW5zdHJ1Y3Rpb24gc2V0LCBlYWNoIG9mIHdoaWNoIGNvdWxkIHJlcXVpcmUgYWRkcmVzcyBmaXgtdXBzCi0gICBhbmQgKGluIHRoZSBjYXNlIG9mIGV4dGVybmFsIHN5bWJvbHMpIGVtaXNzaW9uIG9mIHJlbG9jYXRpb24gZGlyZWN0aXZlczoKLQotICAgMzItYml0IChNRU1CKQotICAgICAgICBUaGlzIGlzIGEgc3RhbmRhcmQgbGVuZ3RoIGZvciB0aGUgYmFzZSBhc3NlbWJsZXIgYW5kIHJlcXVpcmVzIG5vCi0gICAgICAgIHNwZWNpYWwgYWN0aW9uLgotCi0gICAxMy1iaXQgKENPQlIpCi0gICAgICAgIFRoaXMgaXMgYSBub24tc3RhbmRhcmQgbGVuZ3RoLCBidXQgdGhlIGJhc2UgYXNzZW1ibGVyIGhhcyBhCi0gICAgICAgIGhvb2sgZm9yIGJpdCBmaWVsZCBhZGRyZXNzIGZpeHVwczogdGhlIGZpeFMgc3RydWN0dXJlIGNhbgotICAgICAgICBwb2ludCB0byBhIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkLCBpbiB3aGljaCBjYXNlIG91cgotICAgICAgICBtZF9udW1iZXJfdG9fZmllbGQoKSByb3V0aW5lIGdldHMgY2FsbGVkIHRvIHByb2Nlc3MgaXQuCi0KLSAgICAgICAgSSBtYWRlIHRoZSBob29rIGEgbGl0dGxlIGNsZWFuZXIgYnkgaGF2aW5nIGZpeF9uZXcoKSAoaW4gdGhlIGJhc2UKLSAgICAgICAgYXNzZW1ibGVyKSByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXhTIGluIHF1ZXN0aW9uLiAgQW5kIEkgbWFkZSBpdCBhCi0gICAgICAgIGxpdHRsZSBzaW1wbGVyIGJ5IHN0b3JpbmcgdGhlIGZpZWxkIHNpemUgKGluIHRoaXMgY2FzZSAxMykgaW5zdGVhZCBvZgotICAgICAgICBvZiBhIHBvaW50ZXIgdG8gYW5vdGhlciBzdHJ1Y3R1cmU6ICA4MDk2MCBkaXNwbGFjZW1lbnRzIGFyZSBBTFdBWVMKLSAgICAgICAgc3RvcmVkIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBhIDQtYnl0ZSB3b3JkLgotCi0gICAgICAgIFNpbmNlIHRoZSB0YXJnZXQgb2YgYSBDT0JSIGNhbm5vdCBiZSBleHRlcm5hbCwgbm8gcmVsb2NhdGlvbgotICAgICAgICBkaXJlY3RpdmVzIGZvciB0aGlzIHNpemUgZGlzcGxhY2VtZW50IGhhdmUgdG8gYmUgZ2VuZXJhdGVkLgotICAgICAgICBCdXQgdGhlIGJhc2UgYXNzZW1ibGVyIGhhZCB0byBiZSBtb2RpZmllZCB0byBpc3N1ZSBlcnJvcgotICAgICAgICBtZXNzYWdlcyBpZiB0aGUgc3ltYm9sIGRpZCB0dXJuIG91dCB0byBiZSBleHRlcm5hbC4KLQotICAgMjQtYml0IChDVFJMKQotICAgICAgICBGaXh1cHMgYXJlIGhhbmRsZWQgYXMgZm9yIHRoZSAxMy1iaXQgY2FzZSAoZXhjZXB0IHRoYXQgMjQgaXMgc3RvcmVkCi0gICAgICAgIGluIHRoZSBmaXhTKS4KLQotICAgICAgICBUaGUgcmVsb2NhdGlvbiBkaXJlY3RpdmUgZ2VuZXJhdGVkIGlzIHRoZSBzYW1lIGFzIHRoYXQgZm9yIHRoZSAzMi1iaXQKLSAgICAgICAgZGlzcGxhY2VtZW50LCBleGNlcHQgdGhhdCBpdCdzIFBDLXJlbGF0aXZlICh0aGUgMzItYml0IGRpc3BsYWNlbWVudAotICAgICAgICBuZXZlciBpcykuICAgVGhlIGk4MDk2MCB2ZXJzaW9uIG9mIHRoZSBsaW5rZXIgbmVlZHMgYSBtb2QgdG8KLSAgICAgICAgZGlzdGluZ3Vpc2ggYW5kIGhhbmRsZSB0aGUgMjQtYml0IGNhc2UuCi0KLSAgIDEyLWJpdCAoTUVNQSkKLSAgICAgICAgTUVNQSBmb3JtYXRzIGFyZSBhbHdheXMgcHJvbW90ZWQgdG8gTUVNQiAoMzItYml0KSBpZiB0aGUgZGlzcGxhY2VtZW50Ci0gICAgICAgIGlzIGJhc2VkIG9uIGEgc3ltYm9sLCBiZWNhdXNlIGl0IGNvdWxkIGJlIHJlbG9jYXRlZCBhdCBsaW5rIHRpbWUuCi0gICAgICAgIFRoZSBvbmx5IHRpbWUgd2UgdXNlIHRoZSAxMi1iaXQgZm9ybWF0IGlzIGlmIGFuIGFic29sdXRlIHZhbHVlIG9mCi0gICAgICAgIGxlc3MgdGhhbiA0MDk2IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIG5laXRoZXIgYSBmaXh1cCBub3IKLSAgICAgICAgYSByZWxvY2F0aW9uIGRpcmVjdGl2ZS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL2k5NjAuaCIKLQotI2lmIGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkKLQotI2RlZmluZSBUQ19TX0lTX1NZU1BST0MocykJKCgxPD1TX0dFVF9PVEhFUihzKSkgJiYgKFNfR0VUX09USEVSKHMpPD0zMikpCi0jZGVmaW5lIFRDX1NfSVNfQkFMTkFNRShzKQkoU19HRVRfT1RIRVIocykgPT0gTl9CQUxOQU1FKQotI2RlZmluZSBUQ19TX0lTX0NBTExOQU1FKHMpCShTX0dFVF9PVEhFUihzKSA9PSBOX0NBTExOQU1FKQotI2RlZmluZSBUQ19TX0lTX0JBRFBST0MocykJKChTX0dFVF9PVEhFUihzKSAhPSAwKSAmJiAhVENfU19JU19DQUxMTkFNRShzKSAmJiAhVENfU19JU19CQUxOQU1FKHMpICYmICFUQ19TX0lTX1NZU1BST0MocykpCi0KLSNkZWZpbmUgVENfU19TRVRfU1lTUFJPQyhzLCBwKQkoU19TRVRfT1RIRVIoKHMpLCAocCkrMSkpCi0jZGVmaW5lIFRDX1NfR0VUX1NZU1BST0MocykJKFNfR0VUX09USEVSKHMpLTEpCi0KLSNkZWZpbmUgVENfU19GT1JDRV9UT19CQUxOQU1FKHMpCShTX1NFVF9PVEhFUigocyksIE5fQkFMTkFNRSkpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUocykJKFNfU0VUX09USEVSKChzKSwgTl9DQUxMTkFNRSkpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyhzKQl7O30KLQotI2Vsc2UgLyogISBPQkpfQS9CT1VUICovCi0jaWZkZWYgT0JKX0NPRkYKLQotI2RlZmluZSBUQ19TX0lTX1NZU1BST0MocykJKFNfR0VUX1NUT1JBR0VfQ0xBU1MocykgPT0gQ19TQ0FMTCkKLSNkZWZpbmUgVENfU19JU19CQUxOQU1FKHMpCShTRl9HRVRfQkFMTkFNRShzKSkKLSNkZWZpbmUgVENfU19JU19DQUxMTkFNRShzKQkoU0ZfR0VUX0NBTExOQU1FKHMpKQotI2RlZmluZSBUQ19TX0lTX0JBRFBST0MocykJKFRDX1NfSVNfU1lTUFJPQyhzKSAmJiBUQ19TX0dFVF9TWVNQUk9DKHMpIDwgMCAmJiAzMSA8IFRDX1NfR0VUX1NZU1BST0MocykpCi0KLSNkZWZpbmUgVENfU19TRVRfU1lTUFJPQyhzLCBwKQkoKHMpLT5zeV9zeW1ib2wub3N0X2F1eGVudFsxXS54X3NjLnhfc3RpbmR4ID0gKHApKQotI2RlZmluZSBUQ19TX0dFVF9TWVNQUk9DKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzFdLnhfc2MueF9zdGluZHgpCi0KLSNkZWZpbmUgVENfU19GT1JDRV9UT19CQUxOQU1FKHMpCShTRl9TRVRfQkFMTkFNRShzKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19DQUxMTkFNRShzKQkoU0ZfU0VUX0NBTExOQU1FKHMpKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX1NZU1BST0MocykJKFNfU0VUX1NUT1JBR0VfQ0xBU1MoKHMpLCBDX1NDQUxMKSkKLQotI2Vsc2UgLyogISBPQkpfQ09GRiAqLwotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVENfU19JU19TWVNQUk9DKHMpCTAKLQotI2RlZmluZSBUQ19TX0lTX0JBTE5BTUUocykJMAotI2RlZmluZSBUQ19TX0lTX0NBTExOQU1FKHMpCTAKLSNkZWZpbmUgVENfU19JU19CQURQUk9DKHMpCTAKLQotI2RlZmluZSBUQ19TX1NFVF9TWVNQUk9DKHMsIHApCi0jZGVmaW5lIFRDX1NfR0VUX1NZU1BST0MocykgMAotCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRShzKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FKHMpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyhzKQotI2Vsc2UKLSAjZXJyb3IgQ09GRiwgYS5vdXQsIGIub3V0LCBhbmQgRUxGIGFyZSB0aGUgb25seSBzdXBwb3J0ZWQgZm9ybWF0cy4KLSNlbmRpZiAvKiAhIE9CSl9FTEYgKi8KLSNlbmRpZiAvKiAhIE9CSl9DT0ZGICovCi0jZW5kaWYgLyogISBPQkpfQS9CT1VUICovCi0KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSNpZiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKEJGRCkKLSNpZmRlZiBPQkpfQ09GRgotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSBzaXplb2YgKHN0cnVjdCByZWxvYyk7Ci0jZWxzZSAvKiBPQkpfQ09GRiAqLwotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0jZW5kaWYKLQotLyogTG9jYWwgaTgwOTYwIHJvdXRpbmVzLiAgKi8KLQotc3RhdGljIHZvaWQgYnJjbnRfZW1pdCAoKTsJLyogRW1pdCBicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24gY29kZSAqLwotc3RhdGljIGNoYXIgKmJybGFiX25leHQgKCk7CS8qIFJldHVybiBuZXh0IGJyYW5jaCBsb2NhbCBsYWJlbCAqLwotdm9pZCBicnRhYl9lbWl0ICgpOwkJLyogRW1pdCBici1wcmVkaWN0IGluc3RydW1lbnRhdGlvbiB0YWJsZSAqLwotc3RhdGljIHZvaWQgY29icl9mbXQgKCk7CS8qIEdlbmVyYXRlIENPQlIgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB2b2lkIGN0cmxfZm10ICgpOwkvKiBHZW5lcmF0ZSBDVFJMIGluc3RydWN0aW9uICovCi1zdGF0aWMgY2hhciAqZW1pdCAoKTsJCS8qIEVtaXQgKGludGVybmFsbHkpIGJpbmFyeSAqLwotc3RhdGljIGludCBnZXRfYXJncyAoKTsJCS8qIEJyZWFrIGFyZ3VtZW50cyBvdXQgb2YgY29tbWEtc2VwYXJhdGVkIGxpc3QgKi8KLXN0YXRpYyB2b2lkIGdldF9jZGlzcCAoKTsJLyogSGFuZGxlIENPQlIgb3IgQ1RSTCBkaXNwbGFjZW1lbnQgKi8KLXN0YXRpYyBjaGFyICpnZXRfaXNwZWMgKCk7CS8qIEZpbmQgaW5kZXggc3BlY2lmaWNhdGlvbiBzdHJpbmcgKi8KLXN0YXRpYyBpbnQgZ2V0X3JlZ251bSAoKTsJLyogVHJhbnNsYXRlIHRleHQgdG8gcmVnaXN0ZXIgbnVtYmVyICovCi1zdGF0aWMgaW50IGlfc2NhbiAoKTsJCS8qIExleGljYWwgc2NhbiBvZiBpbnN0cnVjdGlvbiBzb3VyY2UgKi8KLXN0YXRpYyB2b2lkIG1lbV9mbXQgKCk7CQkvKiBHZW5lcmF0ZSBNRU1BIG9yIE1FTUIgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB2b2lkIG1lbWFfdG9fbWVtYiAoKTsJLyogQ29udmVydCBNRU1BIGluc3RydWN0aW9uIHRvIE1FTUIgZm9ybWF0ICovCi1zdGF0aWMgdm9pZCBwYXJzZV9leHByICgpOwkvKiBQYXJzZSBhbiBleHByZXNzaW9uICovCi1zdGF0aWMgaW50IHBhcnNlX2xkY29uc3QgKCk7CS8qIFBhcnNlIGFuZCByZXBsYWNlIGEgJ2xkY29uc3QnIHBzZXVkby1vcCAqLwotc3RhdGljIHZvaWQgcGFyc2VfbWVtb3AgKCk7CS8qIFBhcnNlIGEgbWVtb3J5IG9wZXJhbmQgKi8KLXN0YXRpYyB2b2lkIHBhcnNlX3BvICgpOwkvKiBQYXJzZSBtYWNoaW5lLWRlcGVuZGVudCBwc2V1ZG8tb3AgKi8KLXN0YXRpYyB2b2lkIHBhcnNlX3JlZ29wICgpOwkvKiBQYXJzZSBhIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLXN0YXRpYyB2b2lkIHJlZ19mbXQgKCk7CQkvKiBHZW5lcmF0ZSBhIFJFRyBmb3JtYXQgaW5zdHJ1Y3Rpb24gKi8KLXZvaWQgcmVsb2NfY2FsbGogKCk7CQkvKiBSZWxvY2F0ZSBhICdjYWxsaicgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB2b2lkIHJlbGF4X2NvYnIgKCk7CS8qICJEZS1vcHRpbWl6ZSIgY29iciBpbnRvIGNvbXBhcmUvYnJhbmNoICovCi1zdGF0aWMgdm9pZCBzX2xlYWZwcm9jICgpOwkvKiBQcm9jZXNzICcubGVhZnByb2MnIHBzZXVkby1vcCAqLwotc3RhdGljIHZvaWQgc19zeXNwcm9jICgpOwkvKiBQcm9jZXNzICcuc3lzcHJvYycgcHNldWRvLW9wICovCi1zdGF0aWMgaW50IHNoaWZ0X29rICgpOwkJLyogV2lsbCBhICdzaGxvJyBzdWJzdGl0dXJlIGZvciBhICdsZGNvbnN0Jz8gKi8KLXN0YXRpYyB2b2lkIHN5bnRheCAoKTsJCS8qIEdpdmUgc3ludGF4IGVycm9yICovCi1zdGF0aWMgaW50IHRhcmdfaGFzX3NmciAoKTsJLyogVGFyZ2V0IGNoaXAgc3VwcG9ydHMgc3BlYy1mdW5jIHJlZ2lzdGVyPyAqLwotc3RhdGljIGludCB0YXJnX2hhc19pY2xhc3MgKCk7CS8qIFRhcmdldCBjaGlwIHN1cHBvcnRzIGluc3RydWN0aW9uIHNldD8gKi8KLQotLyogU2VlIG1kX3BhcnNlX29wdGlvbigpIGZvciBtZWFuaW5ncyBvZiB0aGVzZSBvcHRpb25zICovCi1zdGF0aWMgY2hhciBub3JlbGF4OwkJLyogVHJ1ZSBpZiAtbm9yZWxheCBzd2l0Y2ggc2VlbiAqLwotc3RhdGljIGNoYXIgaW5zdHJ1bWVudF9icmFuY2hlczsJLyogVHJ1ZSBpZiAtYiBzd2l0Y2ggc2VlbiAqLwotCi0vKiBDaGFyYWN0ZXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4KLSAgIElmIHRoZSBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwuCi0gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQuCi0KLSAgIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuCi0gKi8KLQotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgc3RhcnRlZCBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCi0KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzWzFdOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzWzFdOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LAotICAgYXMgaW4gMGYxMi40NTYgb3IgMGQxLjIzNDVlMTIKLSAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRmREdFQiOwotCi0KLS8qIFRhYmxlIHVzZWQgYnkgYmFzZSBhc3NlbWJsZXIgdG8gcmVsYXggYWRkcmVzc2VzIGJhc2VkIG9uIHZhcnlpbmcgbGVuZ3RoCi0gICBpbnN0cnVjdGlvbnMuICBUaGUgZmllbGRzIGFyZToKLSAgICAgMSkgbW9zdCBwb3NpdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAgIDMpIGhvdyBtYW55IGJ5dGVzIHRoaXMgbW9kZSB3aWxsIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBmcmFnCi0gICAgIDQpIHdoaWNoIGluZGV4IGludG8gdGhlIHRhYmxlIHRvIHRyeSBpZiB3ZSBjYW4ndCBmaXQgaW50byB0aGlzIG9uZS4KLQotICAgRm9yIGk4MDk2MCwgdGhlIG9ubHkgYXBwbGljYXRpb24gaXMgdGhlIChkZS0pb3B0aW1pemF0aW9uIG9mIGNvYnIKLSAgIGluc3RydWN0aW9ucyBpbnRvIHNlcGFyYXRlIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMgd2hlbiBhIDEzLWJpdAotICAgZGlzcGxhY2VtZW50IHdvbid0IGhhY2sgaXQuCi0gKi8KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7MCwgMCwgMCwgMH0sCQkJLyogU3RhdGUgMCA9PiBubyBtb3JlIHJlbGF4YXRpb24gcG9zc2libGUgKi8KLSAgezQwODgsIC00MDk2LCAwLCAyfSwJCS8qIFN0YXRlIDE6IGNvbmRpdGlvbmFsIGJyYW5jaCAoY29icikgKi8KLSAgezB4ODAwMDAwIC0gOCwgLTB4ODAwMDAwLCA0LCAwfSwJLyogU3RhdGUgMjogY29tcGFyZSAocmVnKSAmIGJyYW5jaCAoY3RybCkgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIHNfZW5kaWFuIFBBUkFNUyAoKGludCkpOwotCi0vKiBUaGVzZSBhcmUgdGhlIG1hY2hpbmUgZGVwZW5kZW50IHBzZXVkby1vcHMuCi0KLSAgIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICAgICAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICAgICAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgICAgICBpbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICovCi0jZGVmaW5lIFNfTEVBRlBST0MJMQotI2RlZmluZSBTX1NZU1BST0MJMgotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImJzcyIsIHNfbGNvbW0sIDF9LAotICB7ImVuZGlhbiIsIHNfZW5kaWFuLCAwfSwKLSAgeyJleHRlbmRlZCIsIGZsb2F0X2NvbnMsICd0J30sCi0gIHsibGVhZnByb2MiLCBwYXJzZV9wbywgU19MRUFGUFJPQ30sCi0gIHsic3lzcHJvYyIsIHBhcnNlX3BvLCBTX1NZU1BST0N9LAotCi0gIHsid29yZCIsIGNvbnMsIDR9LAotICB7InF1YWQiLCBjb25zLCAxNn0sCi0KLSAgezAsIDAsIDB9Ci19OwotDAotLyogTWFjcm9zIHRvIGV4dHJhY3QgaW5mbyBmcm9tIGFuICdleHByZXNzaW9uUycgc3RydWN0dXJlICdlJyAqLwotI2RlZmluZSBhZGRzKGUpCWUuWF9hZGRfc3ltYm9sCi0jZGVmaW5lIG9mZnMoZSkJZS5YX2FkZF9udW1iZXIKLQotCi0vKiBCcmFuY2gtcHJlZGljdGlvbiBiaXRzIGZvciBDVFJML0NPQlIgZm9ybWF0IG9wY29kZXMgKi8KLSNkZWZpbmUgQlBfTUFTSwkJMHgwMDAwMDAwMgkvKiBNYXNrIGZvciBicmFuY2gtcHJlZGljdGlvbiBiaXQgKi8KLSNkZWZpbmUgQlBfVEFLRU4JMHgwMDAwMDAwMAkvKiBWYWx1ZSB0byBPUiBpbiB0byBwcmVkaWN0IGJyYW5jaCAqLwotI2RlZmluZSBCUF9OT1RfVEFLRU4JMHgwMDAwMDAwMgkvKiBWYWx1ZSB0byBPUiBpbiB0byBwcmVkaWN0IG5vIGJyYW5jaCAqLwotCi0KLS8qIFNvbWUgaW5zdHJ1Y3Rpb24gb3Bjb2RlcyB0aGF0IHdlIG5lZWQgZXhwbGljaXRseSAqLwotI2RlZmluZSBCRQkweDEyMDAwMDAwCi0jZGVmaW5lIEJHCTB4MTEwMDAwMDAKLSNkZWZpbmUgQkdFCTB4MTMwMDAwMDAKLSNkZWZpbmUgQkwJMHgxNDAwMDAwMAotI2RlZmluZSBCTEUJMHgxNjAwMDAwMAotI2RlZmluZSBCTkUJMHgxNTAwMDAwMAotI2RlZmluZSBCTk8JMHgxMDAwMDAwMAotI2RlZmluZSBCTwkweDE3MDAwMDAwCi0jZGVmaW5lIENIS0JJVAkweDVhMDAyNzAwCi0jZGVmaW5lIENNUEkJMHg1YTAwMjA4MAotI2RlZmluZSBDTVBPCTB4NWEwMDIwMDAKLQotI2RlZmluZSBCCTB4MDgwMDAwMDAKLSNkZWZpbmUgQkFMCTB4MGIwMDAwMDAKLSNkZWZpbmUgQ0FMTAkweDA5MDAwMDAwCi0jZGVmaW5lIENBTExTCTB4NjYwMDM4MDAKLSNkZWZpbmUgUkVUCTB4MGEwMDAwMDAKLQotCi0vKiBUaGVzZSBtYXNrcyBhcmUgdXNlZCB0byBidWlsZCB1cCBhIHNldCBvZiBNRU1CIG1vZGUgYml0cy4gKi8KLSNkZWZpbmUJQV9CSVQJCTB4MDQwMAotI2RlZmluZQlJX0JJVAkJMHgwODAwCi0jZGVmaW5lIE1FTUJfQklUCTB4MTAwMAotI2RlZmluZQlEX0JJVAkJMHgyMDAwCi0KLQotLyogTWFzayBmb3IgdGhlIG9ubHkgbW9kZSBiaXQgaW4gYSBNRU1BIGluc3RydWN0aW9uIChpZiBzZXQsIGFiYXNlIHJlZyBpcwotICAgdXNlZCkuICAqLwotI2RlZmluZSBNRU1BX0FCQVNFCTB4MjAwMAotCi0vKiBJbmZvIGZyb20gd2hpY2ggYSBNRU1BIG9yIE1FTUIgZm9ybWF0IGluc3RydWN0aW9uIGNhbiBiZSBnZW5lcmF0ZWQgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICAvKiAoRmlyc3QpIDMyIGJpdHMgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgICBsb25nIG9wY29kZTsKLSAgICAvKiAwLShub25lKSwgMTItIG9yLCAzMi1iaXQgZGlzcGxhY2VtZW50IG5lZWRlZCAqLwotICAgIGludCBkaXNwOwotICAgIC8qIFRoZSBleHByZXNzaW9uIGluIHRoZSBzb3VyY2UgaW5zdHJ1Y3Rpb24gZnJvbSB3aGljaCB0aGUKLSAgICAgICBkaXNwbGFjZW1lbnQgc2hvdWxkIGJlIGRldGVybWluZWQuICAqLwotICAgIGNoYXIgKmU7Ci0gIH0KLQotbWVtUzsKLQotCi0vKiBUaGUgdHdvIHBpZWNlcyBvZiBpbmZvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSByZWdpc3RlciBvcGVyYW5kICovCi1zdHJ1Y3QgcmVnb3AKLSAgewotICAgIGludCBtb2RlOwkJCS8qIDAgPT5sb2NhbC9nbG9iYWwvc3BlYyByZWc7IDE9PiBsaXRlcmFsIG9yIGZwIHJlZyAqLwotICAgIGludCBzcGVjaWFsOwkJLyogMCA9Pm5vdCBhIHNmcjsgIDE9PiBpcyBhIHNmciAobm90IHZhbGlkIHcvbW9kZT0wKSAqLwotICAgIGludCBuOwkJCS8qIFJlZ2lzdGVyIG51bWJlciBvciBsaXRlcmFsIHZhbHVlICovCi0gIH07Ci0KLQotLyogTnVtYmVyIGFuZCBhc3NlbWJsZXIgbW5lbW9uaWMgZm9yIGFsbCByZWdpc3RlcnMgdGhhdCBjYW4gYXBwZWFyIGluCi0gICBvcGVyYW5kcy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjaGFyICpyZWdfbmFtZTsKLSAgICBpbnQgcmVnX251bTsKLSAgfQotcmVnbmFtZXNbXSA9Ci17Ci0gIHsgInBmcCIsIDAgfSwKLSAgeyAic3AiLCAxIH0sCi0gIHsgInJpcCIsIDIgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0gIHsgInIxMCIsIDEwIH0sCi0gIHsgInIxMSIsIDExIH0sCi0gIHsgInIxMiIsIDEyIH0sCi0gIHsgInIxMyIsIDEzIH0sCi0gIHsgInIxNCIsIDE0IH0sCi0gIHsgInIxNSIsIDE1IH0sCi0gIHsgImcwIiwgMTYgfSwKLSAgeyAiZzEiLCAxNyB9LAotICB7ICJnMiIsIDE4IH0sCi0gIHsgImczIiwgMTkgfSwKLSAgeyAiZzQiLCAyMCB9LAotICB7ICJnNSIsIDIxIH0sCi0gIHsgImc2IiwgMjIgfSwKLSAgeyAiZzciLCAyMyB9LAotICB7ICJnOCIsIDI0IH0sCi0gIHsgImc5IiwgMjUgfSwKLSAgeyAiZzEwIiwgMjYgfSwKLSAgeyAiZzExIiwgMjcgfSwKLSAgeyAiZzEyIiwgMjggfSwKLSAgeyAiZzEzIiwgMjkgfSwKLSAgeyAiZzE0IiwgMzAgfSwKLSAgeyAiZnAiLCAzMSB9LAotCi0gIC8qIE51bWJlcnMgZm9yIHNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXJzIGFyZSBmb3IgYXNzZW1ibGVyIGludGVybmFsCi0gICAgIHVzZSBvbmx5OiB0aGV5IGFyZSBzY2FsZWQgYmFjayB0byByYW5nZSBbMC0zMV0gZm9yIGJpbmFyeSBvdXRwdXQuICAqLwotI2RlZmluZSBTRjAJMzIKLQotICB7ICJzZjAiLCAzMiB9LAotICB7ICJzZjEiLCAzMyB9LAotICB7ICJzZjIiLCAzNCB9LAotICB7ICJzZjMiLCAzNSB9LAotICB7ICJzZjQiLCAzNiB9LAotICB7ICJzZjUiLCAzNyB9LAotICB7ICJzZjYiLCAzOCB9LAotICB7ICJzZjciLCAzOSB9LAotICB7ICJzZjgiLCA0MCB9LAotICB7ICJzZjkiLCA0MSB9LAotICB7ICJzZjEwIiwgNDIgfSwKLSAgeyAic2YxMSIsIDQzIH0sCi0gIHsgInNmMTIiLCA0NCB9LAotICB7ICJzZjEzIiwgNDUgfSwKLSAgeyAic2YxNCIsIDQ2IH0sCi0gIHsgInNmMTUiLCA0NyB9LAotICB7ICJzZjE2IiwgNDggfSwKLSAgeyAic2YxNyIsIDQ5IH0sCi0gIHsgInNmMTgiLCA1MCB9LAotICB7ICJzZjE5IiwgNTEgfSwKLSAgeyAic2YyMCIsIDUyIH0sCi0gIHsgInNmMjEiLCA1MyB9LAotICB7ICJzZjIyIiwgNTQgfSwKLSAgeyAic2YyMyIsIDU1IH0sCi0gIHsgInNmMjQiLCA1NiB9LAotICB7ICJzZjI1IiwgNTcgfSwKLSAgeyAic2YyNiIsIDU4IH0sCi0gIHsgInNmMjciLCA1OSB9LAotICB7ICJzZjI4IiwgNjAgfSwKLSAgeyAic2YyOSIsIDYxIH0sCi0gIHsgInNmMzAiLCA2MiB9LAotICB7ICJzZjMxIiwgNjMgfSwKLQotICAvKiBOdW1iZXJzIGZvciBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYXJlIGZvciBhc3NlbWJsZXIgaW50ZXJuYWwKLSAgICAgdXNlIG9ubHk6IHRoZXkgYXJlIHNjYWxlZCBiYWNrIHRvIFswLTNdIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KLSNkZWZpbmUgRlAwCTY0Ci0KLSAgeyAiZnAwIiwgNjQgfSwKLSAgeyAiZnAxIiwgNjUgfSwKLSAgeyAiZnAyIiwgNjYgfSwKLSAgeyAiZnAzIiwgNjcgfSwKLQotICB7IE5VTEwsIDAgfSwJCQkJLyogRU5EIE9GIExJU1QgKi8KLX07Ci0KLSNkZWZpbmUJSVNfUkdfUkVHKG4pCSgoMCA8PSAobikpICYmICgobikgPCBTRjApKQotI2RlZmluZQlJU19TRl9SRUcobikJKChTRjAgPD0gKG4pKSAmJiAoKG4pIDwgRlAwKSkKLSNkZWZpbmUJSVNfRlBfUkVHKG4pCSgobikgPj0gRlAwKQotCi0vKiBOdW1iZXIgYW5kIGFzc2VtYmxlciBtbmVtb25pYyBmb3IgYWxsIHJlZ2lzdGVycyB0aGF0IGNhbiBhcHBlYXIgYXMKLSAgICdhYmFzZScgKGluZGlyZWN0IGFkZHJlc3NpbmcpIHJlZ2lzdGVycy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjaGFyICphcmVnX25hbWU7Ci0gICAgaW50IGFyZWdfbnVtOwotICB9Ci1hcmVnc1tdID0KLXsKLSAgeyAiKHBmcCkiLCAwIH0sCi0gIHsgIihzcCkiLCAxIH0sCi0gIHsgIihyaXApIiwgMiB9LAotICB7ICIocjMpIiwgMyB9LAotICB7ICIocjQpIiwgNCB9LAotICB7ICIocjUpIiwgNSB9LAotICB7ICIocjYpIiwgNiB9LAotICB7ICIocjcpIiwgNyB9LAotICB7ICIocjgpIiwgOCB9LAotICB7ICIocjkpIiwgOSB9LAotICB7ICIocjEwKSIsIDEwIH0sCi0gIHsgIihyMTEpIiwgMTEgfSwKLSAgeyAiKHIxMikiLCAxMiB9LAotICB7ICIocjEzKSIsIDEzIH0sCi0gIHsgIihyMTQpIiwgMTQgfSwKLSAgeyAiKHIxNSkiLCAxNSB9LAotICB7ICIoZzApIiwgMTYgfSwKLSAgeyAiKGcxKSIsIDE3IH0sCi0gIHsgIihnMikiLCAxOCB9LAotICB7ICIoZzMpIiwgMTkgfSwKLSAgeyAiKGc0KSIsIDIwIH0sCi0gIHsgIihnNSkiLCAyMSB9LAotICB7ICIoZzYpIiwgMjIgfSwKLSAgeyAiKGc3KSIsIDIzIH0sCi0gIHsgIihnOCkiLCAyNCB9LAotICB7ICIoZzkpIiwgMjUgfSwKLSAgeyAiKGcxMCkiLCAyNiB9LAotICB7ICIoZzExKSIsIDI3IH0sCi0gIHsgIihnMTIpIiwgMjggfSwKLSAgeyAiKGcxMykiLCAyOSB9LAotICB7ICIoZzE0KSIsIDMwIH0sCi0gIHsgIihmcCkiLCAzMSB9LAotCi0jZGVmaW5lIElQUkVMCTMyCi0gIC8qIEZvciBhc3NlbWJsZXIgaW50ZXJuYWwgdXNlIG9ubHk6IHRoaXMgbnVtYmVyIG5ldmVyIGFwcGVhcnMgaW4gYmluYXJ5Ci0gICAgIG91dHB1dC4gICovCi0gIHsgIihpcCkiLCBJUFJFTCB9LAotCi0gIHsgTlVMTCwgMCB9LAkJCQkvKiBFTkQgT0YgTElTVCAqLwotfTsKLQotCi0vKiBIYXNoIHRhYmxlcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsJLyogUmVnaXN0ZXIgbmFtZSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYXJlZ19oYXNoOwkvKiBBYmFzZSByZWdpc3RlciBoYXNoIHRhYmxlICovCi0KLQotLyogQXJjaGl0ZWN0dXJlIGZvciB3aGljaCB3ZSBhcmUgYXNzZW1ibGluZyAqLwotI2RlZmluZSBBUkNIX0FOWQkwCS8qIERlZmF1bHQ6IG5vIGFyY2hpdGVjdHVyZSBjaGVja2luZyBkb25lICovCi0jZGVmaW5lIEFSQ0hfS0EJCTEKLSNkZWZpbmUgQVJDSF9LQgkJMgotI2RlZmluZSBBUkNIX01DCQkzCi0jZGVmaW5lIEFSQ0hfQ0EJCTQKLSNkZWZpbmUgQVJDSF9KWAkJNQotI2RlZmluZSBBUkNIX0hYCQk2Ci1pbnQgYXJjaGl0ZWN0dXJlID0gQVJDSF9BTlk7CS8qIEFyY2hpdGVjdHVyZSByZXF1ZXN0ZWQgb24gaW52b2NhdGlvbiBsaW5lICovCi1pbnQgaWNsYXNzZXNfc2VlbjsJCS8qIE9SIG9mIGluc3RydWN0aW9uIGNsYXNzZXMgKElfKiBjb25zdGFudHMpCi0JCQkJICogICAgZm9yIHdoaWNoIHdlJ3ZlIGFjdHVhbGx5IGFzc2VtYmxlZAotCQkJCSAqICAgICAgaW5zdHJ1Y3Rpb25zLgotCQkJCSAqLwotCi0KLS8qIEJSQU5DSC1QUkVESUNUSU9OIElOU1RSVU1FTlRBVElPTgotCi0gICAgICAgIFRoZSBmb2xsb3dpbmcgc3VwcG9ydHMgZ2VuZXJhdGlvbiBvZiBicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24KLSAgICAgICAgKHR1cm5lZCBvbiBieSAtYiBzd2l0Y2gpLiAgVGhlIGluc3RydW1lbnRhdGlvbiBjb2xsZWN0cyBjb3VudHMKLSAgICAgICAgb2YgYnJhbmNoZXMgdGFrZW4vbm90LXRha2VuIGZvciBsYXRlciBpbnB1dCB0byBhIHV0aWxpdHkgdGhhdCB3aWxsCi0gICAgICAgIHNldCB0aGUgYnJhbmNoIHByZWRpY3Rpb24gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIGFjY29yZGFuY2Ugd2l0aAotICAgICAgICB0aGUgYmVoYXZpb3Igb2JzZXJ2ZWQuICAoTm90ZSB0aGF0IHRoZSBLWCBzZXJpZXMgZG9lcyBub3QgaGF2ZQotICAgICAgICBicmFjaC1wcmVkaWN0aW9uLikKLQotICAgICAgICBUaGUgaW5zdHJ1bWVudGF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgICAgICgxKSBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggY29uZGl0aW9uYWwgYnJhbmNoLCBhIGNhbGwgdG8gYW4gZXh0ZXJuYWwKLSAgICAgICAgICAgIHJvdXRpbmUgdGhhdCBpbmNyZW1lbnRzIGFuZCBzdGVwcyBvdmVyIGFuIGlubGluZSBjb3VudGVyLiAgVGhlCi0gICAgICAgICAgICBjb3VudGVyIGl0c2VsZiwgaW5pdGlhbGl6ZWQgdG8gMCwgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgY2FsbAotICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uICBGb3IgZWFjaCBicmFuY2gsIHRoZSBjb3VudGVyIGZvbGxvd2luZyB0aGUgYnJhbmNoCi0gICAgICAgICAgICBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBicmFuY2ggd2FzIG5vdCB0YWtlbiwgYW5kIHRoZSBkaWZmZXJlbmNlCi0gICAgICAgICAgICBiZXR3ZWVuIHRoZSBjb3VudGVycyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyB0YWtlbi4gIEFuCi0gICAgICAgICAgICBleGFtcGxlIG9mIGFuIGluc3RydW1lbnRlZCBjb25kaXRpb25hbCBicmFuY2g6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCAgICBCUl9DTlRfRlVOQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud29yZCAgIDAKLSAgICAgICAgICAgICAgICBMQlJBTkNIMjM6ICAgICAgYmUgICAgICBsYWJlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsICAgIEJSX0NOVF9GVU5DCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53b3JkICAgMAotCi0gICAgICAgICgyKSBhIHRhYmxlIG9mIHBvaW50ZXJzIHRvIHRoZSBpbnN0cnVtZW50ZWQgYnJhbmNoZXMsIHNvIHRoYXQgYW4KLSAgICAgICAgICAgIGV4dGVybmFsIHBvc3Rwcm9jZXNzaW5nIHJvdXRpbmUgY2FuIGxvY2F0ZSBhbGwgb2YgdGhlIGNvdW50ZXJzLgotICAgICAgICAgICAgdGhlIHRhYmxlIGJlZ2lucyB3aXRoIGEgMi13b3JkIGhlYWRlcjogYSBwb2ludGVyIHRvIHRoZSBuZXh0IGluCi0gICAgICAgICAgICBhIGxpbmtlZCBsaXN0IG9mIHN1Y2ggdGFibGVzIChpbml0aWFsaXplZCB0byAwKTsgIGFuZCBhIGNvdW50Ci0gICAgICAgICAgICBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlIChleGNsdXNpdmUgb2YgdGhlIGhlYWRlci4KLQotICAgICAgICAgICAgTm90ZSB0aGF0IGlucHV0IHNvdXJjZSBjb2RlIGlzIGV4cGVjdGVkIHRvIGFscmVhZHkgY29udGFpbiBjYWxscwotICAgICAgICAgICAgYW4gZXh0ZXJuYWwgcm91dGluZSB0aGF0IHdpbGwgbGluayB0aGUgYnJhbmNoIGxvY2FsIHRhYmxlIGludG8gYQotICAgICAgICAgICAgbGlzdCBvZiBzdWNoIHRhYmxlcy4KLSAqLwotCi0vKiBOdW1iZXIgb2YgYnJhbmNoZXMgaW5zdHJ1bWVudGVkIHNvIGZhci4gIEFsc28gdXNlZCB0byBnZW5lcmF0ZQotICAgdW5pcXVlIGxvY2FsIGxhYmVscyBmb3IgZWFjaCBpbnN0cnVtZW50ZWQgYnJhbmNoLiAgKi8KLXN0YXRpYyBpbnQgYnJfY250OwotCi0jZGVmaW5lIEJSX0xBQkVMX0JBU0UJIkxCUkFOQ0giCi0vKiBCYXNlbmFtZSBvZiBsb2NhbCBsYWJlbHMgb24gaW5zdHJ1bWVudGVkIGJyYW5jaGVzLCB0byBhdm9pZAotICAgY29uZmxpY3Qgd2l0aCBjb21waWxlci0gZ2VuZXJhdGVkIGxvY2FsIGxhYmVscy4gICovCi0KLSNkZWZpbmUgQlJfQ05UX0ZVTkMJIl9faW5jX2JyYW5jaCIKLS8qIE5hbWUgb2YgdGhlIGV4dGVybmFsIHJvdXRpbmUgdGhhdCB3aWxsIGluY3JlbWVudCAoYW5kIHN0ZXAgb3ZlcikgYW4KLSAgIGlubGluZSBjb3VudGVyLiAgKi8KLQotI2RlZmluZSBCUl9UQUJfTkFNRQkiX19CUkFOQ0hfVEFCTEVfXyIKLS8qIE5hbWUgb2YgdGhlIHRhYmxlIG9mIHBvaW50ZXJzIHRvIGJyYW5jaGVzLiAgQSBsb2NhbCAoaS5lLiwKLSAgIG5vbi1leHRlcm5hbCkgc3ltYm9sLiAgKi8KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfYmVnaW46ICBPbmUtdGltZSBpbml0aWFsaXphdGlvbi4KLQotICAJU2V0IHVwIGhhc2ggdGFibGVzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgaW50IGk7CQkJLyogTG9vcCBjb3VudGVyICovCi0gIGNvbnN0IHN0cnVjdCBpOTYwX29wY29kZSAqb1A7CS8qIFBvaW50ZXIgaW50byBvcGNvZGUgdGFibGUgKi8KLSAgY29uc3QgY2hhciAqcmV0dmFsOwkJLyogVmFsdWUgcmV0dXJuZWQgYnkgaGFzaCBmdW5jdGlvbnMgKi8KLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIGFyZWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIGJhc2UgYXNzZW1ibGVyIHVzZXMgYW4gZW1wdHkgc3RyaW5nIGZvciAibm8KLSAgICAgZXJyb3IgbWVzc2FnZSIsIGluc3RlYWQgb2YgYSBOVUxMIHBvaW50ZXIuICAqLwotICByZXR2YWwgPSAwOwotCi0gIGZvciAob1AgPSBpOTYwX29wY29kZXM7IG9QLT5uYW1lICYmICFyZXR2YWw7IG9QKyspCi0gICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG9QLT5uYW1lLCAoUFRSKSBvUCk7Ci0KLSAgZm9yIChpID0gMDsgcmVnbmFtZXNbaV0ucmVnX25hbWUgJiYgIXJldHZhbDsgaSsrKQotICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChyZWdfaGFzaCwgcmVnbmFtZXNbaV0ucmVnX25hbWUsCi0JCQkgIChjaGFyICopICZyZWduYW1lc1tpXS5yZWdfbnVtKTsKLQotICBmb3IgKGkgPSAwOyBhcmVnc1tpXS5hcmVnX25hbWUgJiYgIXJldHZhbDsgaSsrKQotICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChhcmVnX2hhc2gsIGFyZWdzW2ldLmFyZWdfbmFtZSwKLQkJCSAgKGNoYXIgKikgJmFyZWdzW2ldLmFyZWdfbnVtKTsKLQotICBpZiAocmV0dmFsKQotICAgIGFzX2ZhdGFsIChfKCJIYXNoaW5nIHJldHVybmVkIFwiJXNcIi4iKSwgcmV0dmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9hc3NlbWJsZTogIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uCi0KLSAgIEFzc3VtcHRpb25zIGFib3V0IHRoZSBwYXNzZWQtaW4gdGV4dDoKLSAgCS0gYWxsIGNvbW1lbnRzLCBsYWJlbHMgcmVtb3ZlZAotICAJLSB0ZXh0IGlzIGFuIGluc3RydWN0aW9uCi0gIAktIGFsbCB3aGl0ZSBzcGFjZSBjb21wcmVzc2VkIHRvIHNpbmdsZSBibGFua3MKLSAgCS0gYWxsIGNoYXJhY3RlciBjb25zdGFudHMgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZGVjaW1hbAotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfYXNzZW1ibGUgKHRleHRQKQotICAgICBjaGFyICp0ZXh0UDsJCS8qIFNvdXJjZSB0ZXh0IG9mIGluc3RydWN0aW9uICovCi17Ci0gIC8qIFBhcnNlZCBpbnN0cnVjdGlvbiB0ZXh0LCBjb250YWluaW5nIE5PIHdoaXRlc3BhY2U6IGFyZ1swXS0+b3Bjb2RlCi0gICAgIG1uZW1vbmljIGFyZ1sxLTNdLT5vcGVyYW5kcywgd2l0aCBjaGFyIGNvbnN0YW50cyByZXBsYWNlZCBieQotICAgICBkZWNpbWFsIG51bWJlcnMuICAqLwotICBjaGFyICphcmdzWzRdOwotCi0gIGludCBuX29wczsJCQkvKiBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMgKi8KLSAgLyogUG9pbnRlciB0byBpbnN0cnVjdGlvbiBkZXNjcmlwdGlvbiAqLwotICBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwotICAvKiBUUlVFIGlmZiBvcGNvZGUgbW5lbW9uaWMgaW5jbHVkZWQgYnJhbmNoLXByZWRpY3Rpb24gc3VmZml4ICgiLmYiCi0gICAgIG9yICIudCIpLiAgKi8KLSAgaW50IGJyYW5jaF9wcmVkaWN0OwotICAvKiBTZXR0aW5nIG9mIGJyYW5jaC1wcmVkaWN0aW9uIGJpdChzKSB0byBiZSBPUidkIGludG8gaW5zdHJ1Y3Rpb24KLSAgICAgb3Bjb2RlIG9mIENUUkwvQ09CUiBmb3JtYXQgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgbG9uZyBicF9iaXRzOwotCi0gIGludCBuOwkJCS8qIE9mZnNldCBvZiBsYXN0IGNoYXJhY3RlciBpbiBvcGNvZGUgbW5lbW9uaWMgKi8KLQotICBjb25zdCBjaGFyICpicF9lcnJvcl9tc2cgPSBfKCJicmFuY2ggcHJlZGljdGlvbiBpbnZhbGlkIG9uIHRoaXMgb3Bjb2RlIik7Ci0KLQotICAvKiBQYXJzZSBpbnN0cnVjdGlvbiBpbnRvIG9wY29kZSBhbmQgb3BlcmFuZHMgKi8KLSAgbWVtc2V0IChhcmdzLCAnXDAnLCBzaXplb2YgKGFyZ3MpKTsKLSAgbl9vcHMgPSBpX3NjYW4gKHRleHRQLCBhcmdzKTsKLSAgaWYgKG5fb3BzID09IC0xKQotICAgIHsKLSAgICAgIHJldHVybjsJCQkvKiBFcnJvciBtZXNzYWdlIGFscmVhZHkgaXNzdWVkICovCi0gICAgfQotCi0gIC8qIERvICJtYWNybyBzdWJzdGl0dXRpb24iIChzb3J0IG9mKSBvbiAnbGRjb25zdCcgcHNldWRvLWluc3RydWN0aW9uICovCi0gIGlmICghc3RyY21wIChhcmdzWzBdLCAibGRjb25zdCIpKQotICAgIHsKLSAgICAgIG5fb3BzID0gcGFyc2VfbGRjb25zdCAoYXJncyk7Ci0gICAgICBpZiAobl9vcHMgPT0gLTEpCi0JewotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLQotCi0gIC8qIENoZWNrIGZvciBicmFuY2gtcHJlZGljdGlvbiBzdWZmaXggb24gb3Bjb2RlIG1uZW1vbmljLCBzdHJpcCBpdCBvZmYgKi8KLSAgbiA9IHN0cmxlbiAoYXJnc1swXSkgLSAxOwotICBicmFuY2hfcHJlZGljdCA9IDA7Ci0gIGJwX2JpdHMgPSAwOwotICBpZiAoYXJnc1swXVtuIC0gMV0gPT0gJy4nICYmIChhcmdzWzBdW25dID09ICd0JyB8fCBhcmdzWzBdW25dID09ICdmJykpCi0gICAgewotICAgICAgLyogV2UgY291bGQgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKLQkgc3VwcG9ydHMgYnJhbmNoIHByZWRpY3Rpb24sIGJ1dCB3aHkgYm90aGVyPyAgVGhlIGJpdCB3aWxsCi0JIGp1c3QgYmUgaWdub3JlZCBieSBwcm9jZXNzb3JzIHRoYXQgZG9uJ3QgdXNlIGl0LiAgKi8KLSAgICAgIGJyYW5jaF9wcmVkaWN0ID0gMTsKLSAgICAgIGJwX2JpdHMgPSAoYXJnc1swXVtuXSA9PSAndCcpID8gQlBfVEFLRU4gOiBCUF9OT1RfVEFLRU47Ci0gICAgICBhcmdzWzBdW24gLSAxXSA9ICdcMCc7CS8qIFN0cmlwIHN1ZmZpeCBmcm9tIG9wY29kZSBtbmVtb25pYyAqLwotICAgIH0KLQotICAvKiBMb29rIHVwIG9wY29kZSBtbmVtb25pYyBpbiB0YWJsZSBhbmQgY2hlY2sgbnVtYmVyIG9mIG9wZXJhbmRzLgotICAgICBDaGVjayB0aGF0IG9wY29kZSBpcyBsZWdhbCBmb3IgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuICBJZiBhbGwKLSAgICAgbG9va3MgZ29vZCwgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24uICAqLwotICBvUCA9IChzdHJ1Y3QgaTk2MF9vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBhcmdzWzBdKTsKLSAgaWYgKCFvUCB8fCAhdGFyZ19oYXNfaWNsYXNzIChvUC0+aWNsYXNzKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3Bjb2RlLCBcIiVzXCIuIiksIGFyZ3NbMF0pOwotCi0gICAgfQotICBlbHNlIGlmIChuX29wcyAhPSBvUC0+bnVtX29wcykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImltcHJvcGVyIG51bWJlciBvZiBvcGVyYW5kcy4gIGV4cGVjdGluZyAlZCwgZ290ICVkIiksCi0JICAgICAgb1AtPm51bV9vcHMsIG5fb3BzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9QLT5mb3JtYXQpCi0JewotCWNhc2UgRkJSQToKLQljYXNlIENUUkw6Ci0JICBjdHJsX2ZtdCAoYXJnc1sxXSwgb1AtPm9wY29kZSB8IGJwX2JpdHMsIG9QLT5udW1fb3BzKTsKLQkgIGlmIChvUC0+Zm9ybWF0ID09IEZCUkEpCi0JICAgIHsKLQkgICAgICAvKiBOb3cgZ2VuZXJhdGUgYSAnYm5vJyB0byBzYW1lIGFyZyAqLwotCSAgICAgIGN0cmxfZm10IChhcmdzWzFdLCBCTk8gfCBicF9iaXRzLCAxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDT0JSOgotCWNhc2UgQ09KOgotCSAgY29icl9mbXQgKGFyZ3MsIG9QLT5vcGNvZGUgfCBicF9iaXRzLCBvUCk7Ci0JICBicmVhazsKLQljYXNlIFJFRzoKLQkgIGlmIChicmFuY2hfcHJlZGljdCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7Ci0JICAgIH0KLQkgIHJlZ19mbXQgKGFyZ3MsIG9QKTsKLQkgIGJyZWFrOwotCWNhc2UgTUVNMToKLQkgIGlmIChhcmdzWzBdWzBdID09ICdjJyAmJiBhcmdzWzBdWzFdID09ICdhJykKLQkgICAgewotCSAgICAgIGlmIChicmFuY2hfcHJlZGljdCkKLQkJewotCQkgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7Ci0JCX0KLQkgICAgICBtZW1fZm10IChhcmdzLCBvUCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQljYXNlIE1FTTI6Ci0JY2FzZSBNRU00OgotCWNhc2UgTUVNODoKLQljYXNlIE1FTTEyOgotCWNhc2UgTUVNMTY6Ci0JICBpZiAoYnJhbmNoX3ByZWRpY3QpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChicF9lcnJvcl9tc2cpOwotCSAgICB9Ci0JICBtZW1fZm10IChhcmdzLCBvUCwgMCk7Ci0JICBicmVhazsKLQljYXNlIENBTExKOgotCSAgaWYgKGJyYW5jaF9wcmVkaWN0KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKLQkgICAgfQotCSAgLyogT3V0cHV0IG9wY29kZSAmIHNldCB1cCAiZml4dXAiIChyZWxvY2F0aW9uKTsgZmxhZwotCSAgICAgcmVsb2NhdGlvbiBhcyAnY2FsbGonIHR5cGUuICAqLwotCSAga25vdyAob1AtPm51bV9vcHMgPT0gMSk7Ci0JICBnZXRfY2Rpc3AgKGFyZ3NbMV0sICJDVFJMIiwgb1AtPm9wY29kZSwgMjQsIDAsIDEpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIEJBRF9DQVNFIChvUC0+Zm9ybWF0KTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19CQkJCS8qIG1kX2Fzc2VtYmxlKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9udW1iZXJfdG9fY2hhcnM6ICBjb252ZXJ0IGEgbnVtYmVyIHRvIHRhcmdldCBieXRlIG9yZGVyCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbHVlOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWx1ZSwgbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfY2hhcnNfdG9fbnVtYmVyOiAgY29udmVydCBmcm9tIHRhcmdldCBieXRlIG9yZGVyIHRvIGhvc3QgYnl0ZSBvcmRlci4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLWludAotbWRfY2hhcnNfdG9fbnVtYmVyICh2YWwsIG4pCi0gICAgIHVuc2lnbmVkIGNoYXIgKnZhbDsJLyogVmFsdWUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICAgaW50IG47CQkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dCAqLwotewotICBpbnQgcmV0dmFsOwotCi0gIGZvciAocmV0dmFsID0gMDsgbi0tOykKLSAgICB7Ci0gICAgICByZXR2YWwgPDw9IDg7Ci0gICAgICByZXR2YWwgfD0gdmFsW25dOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TCTYKLSNkZWZpbmUgTE5VTV9TSVpFCXNpemVvZihMSVRUTEVOVU1fVFlQRSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9hdG9mOgljb252ZXJ0IGFzY2lpIHRvIGZsb2F0aW5nIHBvaW50Ci0KLSAgIFR1cm4gYSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICAndHlwZScsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgYXQgKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgcmV0dXJuZWQgYXQgJ3NpemVQJy4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIGEgcG9pbnRlcgotICAgdG8gYW4gZW1wdHkgbWVzc2FnZSBpZiBPSy4KLQotICAgTm90ZSB3ZSBjYWxsIHRoZSBpMzg2IGZsb2F0aW5nIHBvaW50IHJvdXRpbmUsIHJhdGhlciB0aGFuIGNvbXBsaWNhdGluZwotICAgdGhpbmdzIHdpdGggbW9yZSBmaWxlcyBvciBzeW1ib2xpYyBsaW5rcy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgaW50IHByZWM7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgIGNhc2UgJ1QnOgotICAgICAgcHJlYyA9IDU7Ci0gICAgICB0eXBlID0gJ3gnOwkJLyogVGhhdCdzIHdoYXQgYXRvZl9pZWVlKCkgdW5kZXJzdGFuZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAgIH0KLQotICAqc2l6ZVAgPSBwcmVjICogTE5VTV9TSVpFOwotCi0gIC8qIE91dHB1dCB0aGUgTElUVExFTlVNcyBpbiBSRVZFUlNFIG9yZGVyIGluIGFjY29yZCB3aXRoIGk4MDk2MAotICAgICB3b3JkLW9yZGVyLiAgKER1bm5vIHdoeSBhdG9mX2llZWUgZG9lc24ndCBkbyBpdCBpbiB0aGUgcmlnaHQKLSAgICAgb3JkZXIgaW4gdGhlIGZpcnN0IHBsYWNlIC0tIHByb2JhYmx5IGJlY2F1c2UgaXQncyBhIGhhY2sgb2YKLSAgICAgYXRvZl9tNjhrLikgICovCi0KLSAgZm9yICh3b3JkUCA9IHdvcmRzICsgcHJlYyAtIDE7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUC0tKSwgTE5VTV9TSVpFKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfbnVtYmVyX3RvX2ltbQotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGludCBuOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX251bWJlcl90b19kaXNwCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGludCBuOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9udW1iZXJfdG9fZmllbGQ6Ci0KLSAgCVN0aWNrIGEgdmFsdWUgKGFuIGFkZHJlc3MgZml4dXApIGludG8gYSBiaXQgZmllbGQgb2YKLSAgCXByZXZpb3VzbHktZ2VuZXJhdGVkIGluc3RydWN0aW9uLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2ZpZWxkIChpbnN0clAsIHZhbCwgYmZpeFApCi0gICAgIGNoYXIgKmluc3RyUDsJCS8qIFBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24gdG8gYmUgZml4ZWQgKi8KLSAgICAgbG9uZyB2YWw7CQkJLyogQWRkcmVzcyBmaXh1cCB2YWx1ZSAqLwotICAgICBiaXRfZml4UyAqYmZpeFA7CQkvKiBEZXNjcmlwdGlvbiBvZiBiaXQgZmllbGQgdG8gYmUgZml4ZWQgdXAgKi8KLXsKLSAgaW50IG51bWJpdHM7CQkJLyogTGVuZ3RoIG9mIGJpdCBmaWVsZCB0byBiZSBmaXhlZCAqLwotICBsb25nIGluc3RyOwkJCS8qIDMyLWJpdCBpbnN0cnVjdGlvbiB0byBiZSBmaXhlZC11cCAqLwotICBsb25nIHNpZ247CQkJLyogMCBvciAtMSwgYWNjb3JkaW5nIHRvIHNpZ24gYml0IG9mICd2YWwnICovCi0KLSAgLyogQ29udmVydCBpbnN0cnVjdGlvbiBiYWNrIHRvIGhvc3QgYnl0ZSBvcmRlci4gICovCi0gIGluc3RyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChpbnN0clAsIDQpOwotCi0gIC8qIFN1cnByaXNlISAtLSB3ZSBzdG9yZWQgdGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIG1vZGlmaWVkIHJhdGhlcgotICAgICB0aGFuIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZS4gICovCi0gIG51bWJpdHMgPSAoaW50KSBiZml4UDsKLSAgaWYgKG51bWJpdHMgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgbm8tb3AsIHN0dWNrIGhlcmUgYnkgcmVsb2NfY2FsbGooKSAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBrbm93ICgobnVtYml0cyA9PSAxMykgfHwgKG51bWJpdHMgPT0gMjQpKTsKLQotICAvKiBQcm9wYWdhdGUgc2lnbiBiaXQgb2YgJ3ZhbCcgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgYml0cy4gIFJlc3VsdAotICAgICBzaG91bGQgYmUgYWxsIDAgb3IgYWxsIDEuICAqLwotICBzaWduID0gdmFsID4+ICgoaW50KSBudW1iaXRzIC0gMSk7Ci0gIGlmICgoKHZhbCA8IDApICYmIChzaWduICE9IC0xKSkKLSAgICAgIHx8ICgodmFsID4gMCkgJiYgKHNpZ24gIT0gMCkpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRml4dXAgb2YgJWxkIHRvbyBsYXJnZSBmb3IgZmllbGQgd2lkdGggb2YgJWQiKSwKLQkgICAgICB2YWwsIG51bWJpdHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFB1dCBiaXQgZmllbGQgaW50byBpbnN0cnVjdGlvbiBhbmQgd3JpdGUgYmFjayBpbiB0YXJnZXQKLSAgICAgICAgICogYnl0ZSBvcmRlci4KLSAgICAgICAqLwotICAgICAgdmFsICY9IH4oLTEgPDwgKGludCkgbnVtYml0cyk7CS8qIENsZWFyIHVudXNlZCBzaWduIGJpdHMgKi8KLSAgICAgIGluc3RyIHw9IHZhbDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoaW5zdHJQLCBpbnN0ciwgNCk7Ci0gICAgfQotfQkJCQkvKiBtZF9udW1iZXJfdG9fZmllbGQoKSAqLwotDAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX3BhcnNlX29wdGlvbgotICAJSW52b2NhdGlvbiBsaW5lIGluY2x1ZGVzIGEgc3dpdGNoIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBiYXNlIGFzc2VtYmxlci4KLSAgCVNlZSBpZiBpdCdzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGlvbi4gIEZvciB0aGUgOTYwLCB0aGVzZSBhcmU6Ci0KLSAgCS1ub3JlbGF4OgotICAJCUNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbnMgdGhhdCByZXF1aXJlIGRpc3BsYWNlbWVudHMKLSAgCQlncmVhdGVyIHRoYW4gMTMgYml0cyAob3IgdGhhdCBoYXZlIGV4dGVybmFsIHRhcmdldHMpIHNob3VsZAotICAJCWdlbmVyYXRlIGVycm9ycy4gIFRoZSBkZWZhdWx0IGlzIHRvIHJlcGxhY2UgZWFjaCBzdWNoCi0gIAkJaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJlIChvciBjaGtiaXQpIGFuZAotICAJCWJyYW5jaCBpbnN0cnVjdGlvbnMuICBOb3RlIHRoYXQgdGhlIEludGVsICJqIiBjb2JyIGRpcmVjdGl2ZXMKLSAgCQlhcmUgQUxXQVlTICJkZS1vcHRpbWl6ZWQiIGluIHRoaXMgd2F5IHdoZW4gbmVjZXNzYXJ5LAotICAJCXJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhpcyBvcHRpb24uCi0KLSAgCS1iOgotICAJCUFkZCBjb2RlIHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgYnJhbmNoZXMgdGFrZW4sIGZvcgotICAJCWxhdGVyIG9wdGltaXphdGlvbiBvZiBicmFuY2ggcHJlZGljdGlvbiBiaXRzIGJ5IGEgc2VwYXJhdGUKLSAgCQl0b29sLiAgQ09CUiBhbmQgQ05UTCBmb3JtYXQgaW5zdHJ1Y3Rpb25zIGhhdmUgYnJhbmNoCi0gIAkJcHJlZGljdGlvbiBiaXRzIChpbiB0aGUgQ1ggYXJjaGl0ZWN0dXJlKTsgIGlmICJCUiIgcmVwcmVzZW50cwotICAJCWFuIGluc3RydWN0aW9uIGluIG9uZSBvZiB0aGVzZSBjbGFzc2VzLCB0aGUgZm9sbG93aW5nIHJlcC0KLSAgCQlyZXNlbnRzIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyOgotCi0gIAkJCWNhbGwJPGluY3JlbWVudCByb3V0aW5lPgotICAJCQkud29yZAkwCSMgcHJlLWNvdW50ZXIKLSAgCQlMYWJlbDogIEJSCi0gIAkJCWNhbGwJPGluY3JlbWVudCByb3V0aW5lPgotICAJCQkud29yZAkwCSMgcG9zdC1jb3VudGVyCi0KLSAgCQlBIHRhYmxlIG9mIGFsbCBzdWNoICJMYWJlbHMiIGlzIGFsc28gZ2VuZXJhdGVkLgotCi0KLSAgCS1BS0EsIC1BS0IsIC1BS0MsIC1BU0EsIC1BU0IsIC1BTUMsIC1BQ0E6Ci0gIAkJU2VsZWN0IHRoZSA4MDk2MCBhcmNoaXRlY3R1cmUuICBJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90Ci0gIAkJc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBhcmNoaXRlY3R1cmUgY2F1c2UgZmF0YWwgZXJyb3JzLgotICAJCVRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGFueSBpbnN0cnVjdGlvbiBvciBmZWF0dXJlCi0gIAkJdGhhdCBpcyBzdXBwb3J0ZWQgYnkgU09NRSB2ZXJzaW9uIG9mIHRoZSA5NjAgKGV2ZW4gaWYgdGhpcwotICAJCW1lYW5zIG1peGluZyBhcmNoaXRlY3R1cmVzISkuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkE6YiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotI2RlZmluZSBPUFRJT05fTElOS1JFTEFYIChPUFRJT05fTURfQkFTRSkKLSAgeyJsaW5rcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJTktSRUxBWH0sCi0gIHsibGluay1yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElOS1JFTEFYfSwKLSNkZWZpbmUgT1BUSU9OX05PUkVMQVggKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJub3JlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT1JFTEFYfSwKLSAgeyJuby1yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9SRUxBWH0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1zdHJ1Y3QgdGFiZW50cnkKLSAgewotICAgIGNoYXIgKmZsYWc7Ci0gICAgaW50IGFyY2g7Ci0gIH07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudHJ5IGFyY2hfdGFiW10gPQotewotICB7IktBIiwgQVJDSF9LQX0sCi0gIHsiS0IiLCBBUkNIX0tCfSwKLSAgeyJTQSIsIEFSQ0hfS0F9LAkJLyogU3lub255bSBmb3IgS0EgKi8KLSAgeyJTQiIsIEFSQ0hfS0J9LAkJLyogU3lub255bSBmb3IgS0IgKi8KLSAgeyJLQyIsIEFSQ0hfTUN9LAkJLyogU3lub255bSBmb3IgTUMgKi8KLSAgeyJNQyIsIEFSQ0hfTUN9LAotICB7IkNBIiwgQVJDSF9DQX0sCi0gIHsiSlgiLCBBUkNIX0pYfSwKLSAgeyJIWCIsIEFSQ0hfSFh9LAotICB7TlVMTCwgMH0KLX07Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fTElOS1JFTEFYOgotICAgICAgbGlua3JlbGF4ID0gMTsKLSAgICAgIGZsYWdfa2VlcF9sb2NhbHMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT1JFTEFYOgotICAgICAgbm9yZWxheCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2InOgotICAgICAgaW5zdHJ1bWVudF9icmFuY2hlcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgewotCWNvbnN0IHN0cnVjdCB0YWJlbnRyeSAqdHA7Ci0JY2hhciAqcCA9IGFyZzsKLQotCWZvciAodHAgPSBhcmNoX3RhYjsgdHAtPmZsYWcgIT0gTlVMTDsgdHArKykKLQkgIGlmICghc3RyY21wIChwLCB0cC0+ZmxhZykpCi0JICAgIGJyZWFrOwotCi0JaWYgKHRwLT5mbGFnID09IE5VTEwpCi0JICB7Ci0JICAgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgJXMiKSwgcCk7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCWVsc2UKLQkgIGFyY2hpdGVjdHVyZSA9IHRwLT5hcmNoOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgaW50IGk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiSTk2MCBvcHRpb25zOlxuIikpOwotICBmb3IgKGkgPSAwOyBhcmNoX3RhYltpXS5mbGFnOyBpKyspCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiJXMtQSVzIiwgaSA/ICIgfCAiIDogIiIsIGFyY2hfdGFiW2ldLmZsYWcpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIDk2MCBhcmNoaXRlY3R1cmVcblwKLS1iCQkJYWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuXG5cCi0tbGluay1yZWxheAkJcHJlc2VydmUgaW5kaXZpZHVhbCBhbGlnbm1lbnQgZGlyZWN0aXZlcyBzbyBsaW5rZXJcblwKLQkJCWNhbiBkbyByZWxheGluZyAoYi5vdXQgZm9ybWF0IG9ubHkpXG5cCi0tbm8tcmVsYXgJCWRvbid0IGFsdGVyIGNvbXBhcmUtYW5kLWJyYW5jaCBpbnN0cnVjdGlvbnMgZm9yXG5cCi0JCQlsb25nIGRpc3BsYWNlbWVudHNcbiIpKTsKLX0KLQwKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9jb252ZXJ0X2ZyYWc6Ci0gIAlDYWxsZWQgYnkgYmFzZSBhc3NlbWJsZXIgYWZ0ZXIgYWRkcmVzcyByZWxheGF0aW9uIGlzIGZpbmlzaGVkOiAgbW9kaWZ5Ci0gIAl2YXJpYWJsZSBmcmFnbWVudHMgYWNjb3JkaW5nIHRvIGhvdyBtdWNoIHJlbGF4YXRpb24gd2FzIGRvbmUuCi0KLSAgCUlmIHRoZSBmcmFnbWVudCBzdWJzdGF0ZSBpcyBzdGlsbCAxLCBhIDEzLWJpdCBkaXNwbGFjZW1lbnQgd2FzIGVub3VnaAotICAJdG8gcmVhY2ggdGhlIHN5bWJvbCBpbiBxdWVzdGlvbi4gIFNldCB1cCBhbiBhZGRyZXNzIGZpeHVwLCBidXQgb3RoZXJ3aXNlCi0gIAlsZWF2ZSB0aGUgY29iciBpbnN0cnVjdGlvbiBhbG9uZS4KLQotICAJSWYgdGhlIGZyYWdtZW50IHN1YnN0YXRlIGlzIDIsIGEgMTMtYml0IGRpc3BsYWNlbWVudCB3YXMgbm90IGVub3VnaC4KLSAgCVJlcGxhY2UgdGhlIGNvYnIgd2l0aCBhIHR3byBpbnN0cnVjdGlvbnMgKGEgY29tcGFyZSBhbmQgYSBicmFuY2gpLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotI2Vsc2UKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWdUIHNlYzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotI2VuZGlmCi17Ci0gIGZpeFMgKmZpeFA7CQkJLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgbmVlZGVkIGFkZHJlc3MgZml4ICovCi0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgLyogTEVBVkUgU0lOR0xFIENPQlIgSU5TVFJVQ1RJT04gKi8KLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwKLQkJICAgICAgZnJhZ1AtPmZyX29wY29kZSAtIGZyYWdQLT5mcl9saXRlcmFsLAotCQkgICAgICA0LAotCQkgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCQkgICAgICAxLAotCQkgICAgICBOT19SRUxPQyk7Ci0KLSAgICAgIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIDEzOwkvKiBzaXplIG9mIGJpdCBmaWVsZCAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgLyogUkVQTEFDRSBDT0JSIFdJVEggQ09NUEFSRS9CUkFOQ0ggSU5TVFJVQ1RJT05TICovCi0gICAgICByZWxheF9jb2JyIChmcmFnUCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheDogIEhvdyBtdWNoIGRvZXMgaXQgbG9vayBsaWtlICpmcmFnUCB3aWxsIGdyb3c/Ci0KLSAgCUNhbGxlZCBieSBiYXNlIGFzc2VtYmxlciBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24uCi0gIAlSZXR1cm4gdGhlIGFtb3VudCBieSB3aGljaCB0aGUgZnJhZ21lbnQgd2lsbCBncm93LgotCi0gIAlBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZDsgY29icidzCi0gIAliYXNlZCBvbiB1bmRlZmluZWQgc3ltYm9scyB3aWxsIGhhdmUgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIGNvbXBhcmUKLSAgCWluc3RydWN0aW9uIGFuZCBhIGJyYW5jaCBpbnN0cnVjdGlvbiwgYW5kIHRoZSBjb2RlIGZyYWdtZW50IHdpbGwgZ3JvdwotICAJYnkgNCBieXRlcy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIC8qIElmIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBzZWdtZW50LCBnbyB0byAicmVsYXhlZCIgc3RhdGUKLSAgICAgKGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZiBjb2JyKSByaWdodCBub3cuICAqLwotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudF90eXBlKQotICAgIHsKLSAgICAgIHJlbGF4X2NvYnIgKGZyYWdQKTsKLSAgICAgIHJldHVybiA0OwotICAgIH0KLSAgcmV0dXJuIDA7Ci19CQkJCS8qIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgKi8KLQotI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9yaV90b19jaGFyczoKLSAgCVRoaXMgcm91dGluZSBleGlzdHMgaW4gb3JkZXIgdG8gb3ZlcmNvbWUgbWFjaGluZSBieXRlLW9yZGVyIHByb2JsZW1zCi0gIAl3aGVuIGRlYWxpbmcgd2l0aCBiaXQtZmllbGQgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbl9pbmZvIHN0cnVjdC4KLQotICAJQnV0IHJlbG9jYXRpb24gaW5mbyB3aWxsIGJlIHVzZWQgb24gdGhlIGhvc3QgbWFjaGluZSBvbmx5IChvbmx5Ci0gIAlleGVjdXRhYmxlIGNvZGUgaXMgYWN0dWFsbHkgZG93bmxvYWRlZCB0byB0aGUgaTgwOTYwKS4gIFRoZXJlZm9yZSwKLSAgCXdlIGxlYXZlIGl0IGluIGhvc3QgYnl0ZSBvcmRlci4KLQotICAJVGhlIGFib3ZlIGNvbW1lbnQgaXMgbm8gbG9uZ2VyIHRydWUuICBUaGlzIHJvdXRpbmUgbm93IHJlYWxseQotICAJZG9lcyBkbyB0aGUgcmVvcmRlcmluZyAoSWFuIFRheWxvciAyOCBBdWcgOTIpLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1zdGF0aWMgdm9pZAotbWRfcmlfdG9fY2hhcnMgKHdoZXJlLCByaSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJpOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCByaS0+cl9hZGRyZXNzLAotCQkgICAgICBzaXplb2YgKHJpLT5yX2FkZHJlc3MpKTsKLSAgd2hlcmVbNF0gPSByaS0+cl9pbmRleCAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyaS0+cl9pbmRleCA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IChyaS0+cl9pbmRleCA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbN10gPSAoKHJpLT5yX3BjcmVsIDw8IDApCi0JICAgICAgfCAocmktPnJfbGVuZ3RoIDw8IDEpCi0JICAgICAgfCAocmktPnJfZXh0ZXJuIDw8IDMpCi0JICAgICAgfCAocmktPnJfYnNyIDw8IDQpCi0JICAgICAgfCAocmktPnJfZGlzcCA8PCA1KQotCSAgICAgIHwgKHJpLT5yX2NhbGxqIDw8IDYpKTsKLX0KLQotI2VuZGlmIC8qIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkgKi8KLQotDAotLyogRk9MTE9XSU5HIEFSRSBUSEUgTE9DQUwgUk9VVElORVMsIElOIEFMUEhBQkVUSUNBTCBPUkRFUiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBicmNudF9lbWl0OglFbWl0IGNvZGUgdG8gaW5jcmVtZW50IGlubGluZSBicmFuY2ggY291bnRlci4KLQotICAJU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgZGVjbGFyYXRpb24gb2YgJ2JyX2NudCcgZm9yIGRldGFpbHMgb24KLSAgCWJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbi4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZAotYnJjbnRfZW1pdCAoKQotewotICBjdHJsX2ZtdCAoQlJfQ05UX0ZVTkMsIENBTEwsIDEpOwkvKiBFbWl0IGNhbGwgdG8gImluY3JlbWVudCIgcm91dGluZSAqLwotICBlbWl0ICgwKTsJCQkvKiBFbWl0IGlubGluZSBjb3VudGVyIHRvIGJlIGluY3JlbWVudGVkICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgYnJsYWJfbmV4dDoJZ2VuZXJhdGUgdGhlIG5leHQgYnJhbmNoIGxvY2FsIGxhYmVsCi0KLSAgCVNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIGRlY2xhcmF0aW9uIG9mICdicl9jbnQnIGZvciBkZXRhaWxzIG9uCi0gIAlicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24uCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGNoYXIgKgotYnJsYWJfbmV4dCAoKQotewotICBzdGF0aWMgY2hhciBidWZbMjBdOwotCi0gIHNwcmludGYgKGJ1ZiwgIiVzJWQiLCBCUl9MQUJFTF9CQVNFLCBicl9jbnQrKyk7Ci0gIHJldHVybiBidWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgYnJ0YWJfZW1pdDoJZ2VuZXJhdGUgdGhlIGZldGNoLXByZWRpY3Rpb24gYnJhbmNoIHRhYmxlLgotCi0gIAlTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBkZWNsYXJhdGlvbiBvZiAnYnJfY250JyBmb3IgZGV0YWlscyBvbgotICAJYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uLgotCi0gIAlUaGUgY29kZSBlbWl0dGVkIGhlcmUgd291bGQgYmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZwotICAJZXhhbXBsZSBhc3NlbWJsZXIgc291cmNlLgotCi0gIAkJCS5kYXRhCi0gIAkJCS5hbGlnbgkyCi0gIAkgICBCUl9UQUJfTkFNRToKLSAgCQkJLndvcmQJMAkJIyBsaW5rIHRvIG5leHQgdGFibGUKLSAgCQkJLndvcmQJMwkJIyBsZW5ndGggb2YgdGFibGUKLSAgCQkJLndvcmQJTEJSQU5DSDAJIyAxc3QgZW50cnkgaW4gdGFibGUgcHJvcGVyCi0gIAkJCS53b3JkCUxCUkFOQ0gxCi0gIAkJCS53b3JkCUxCUkFOQ0gyCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLWJydGFiX2VtaXQgKCkKLXsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmWzIwXTsKLSAgY2hhciAqcDsJCQkvKiBXaGVyZSB0aGUgYmluYXJ5IHdhcyBvdXRwdXQgdG8gKi8KLSAgLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBkZWZlcnJlZCBhZGRyZXNzIGZpeHVwLiAgKi8KLSAgZml4UyAqZml4UDsKLQotICBpZiAoIWluc3RydW1lbnRfYnJhbmNoZXMpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDApOwkvKiAgICAgIC5kYXRhICovCi0gIGZyYWdfYWxpZ24gKDIsIDAsIDApOwkJLyogICAgICAuYWxpZ24gMiAqLwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAyKTsKLSAgY29sb24gKEJSX1RBQl9OQU1FKTsJCS8qIEJSX1RBQl9OQU1FOiAqLwotICBlbWl0ICgwKTsJCQkvKiAgICAgIC53b3JkIDAgI2xpbmsgdG8gbmV4dCB0YWJsZSAqLwotICBlbWl0IChicl9jbnQpOwkJLyogICAgICAud29yZCBuICNsZW5ndGggb2YgdGFibGUgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgYnJfY250OyBpKyspCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmLCAiJXMlZCIsIEJSX0xBQkVMX0JBU0UsIGkpOwotICAgICAgcCA9IGVtaXQgKDApOwotICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdfbm93LAotCQkgICAgICBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSAgICAgIDQsCi0JCSAgICAgIHN5bWJvbF9maW5kIChidWYpLAotCQkgICAgICAwLAotCQkgICAgICAwLAotCQkgICAgICBOT19SRUxPQyk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGNvYnJfZm10OglnZW5lcmF0ZSBhIENPQlItZm9ybWF0IGluc3RydWN0aW9uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLXZvaWQKLWNvYnJfZm10IChhcmcsIG9wY29kZSwgb1ApCi0gICAgIC8qIGFyZ1swXS0+b3Bjb2RlIG1uZW1vbmljLCBhcmdbMS0zXS0+b3BlcmFuZHMgKGFzY2lpKSAqLwotICAgICBjaGFyICphcmdbXTsKLSAgICAgLyogT3Bjb2RlLCB3aXRoIGJyYW5jaC1wcmVkaWN0aW9uIGJpdHMgYWxyZWFkeSBzZXQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgICAgbG9uZyBvcGNvZGU7Ci0gICAgIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24uICAqLwotICAgICBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwotewotICBsb25nIGluc3RyOwkJCS8qIDMyLWJpdCBpbnN0cnVjdGlvbiAqLwotICBzdHJ1Y3QgcmVnb3AgcmVnb3A7CQkvKiBEZXNjcmlwdGlvbiBvZiByZWdpc3RlciBvcGVyYW5kICovCi0gIGludCBuOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotICBpbnQgdmFyX2ZyYWc7CQkJLyogMSBpZiB2YXJ5aW5nIGxlbmd0aCBjb2RlIGZyYWdtZW50IHNob3VsZAotCQkJCSAqICAgIGJlIGVtaXR0ZWQ7ICAwIGlmIGFuIGFkZHJlc3MgZml4Ci0JCQkJICogICAgICBzaG91bGQgYmUgZW1pdHRlZC4KLQkJCQkgKi8KLQotICBpbnN0ciA9IG9wY29kZTsKLSAgbiA9IG9QLT5udW1fb3BzOwotCi0gIGlmIChuID49IDEpCi0gICAgewotICAgICAgLyogRmlyc3Qgb3BlcmFuZCAoaWYgYW55KSBvZiBhIENPQlIgaXMgYWx3YXlzIGEgcmVnaXN0ZXIKLQkgb3BlcmFuZC4gIFBhcnNlIGl0LiAgKi8KLSAgICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ1sxXSwgb1AtPm9wZXJhbmRbMF0pOwotICAgICAgaW5zdHIgfD0gKHJlZ29wLm4gPDwgMTkpIHwgKHJlZ29wLm1vZGUgPDwgMTMpOwotICAgIH0KLSAgaWYgKG4gPj0gMikKLSAgICB7Ci0gICAgICAvKiBTZWNvbmQgb3BlcmFuZCAoaWYgYW55KSBvZiBhIENPQlIgaXMgYWx3YXlzIGEgcmVnaXN0ZXIKLQkgb3BlcmFuZC4gIFBhcnNlIGl0LiAgKi8KLSAgICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdbMl0sIG9QLT5vcGVyYW5kWzFdKTsKLSAgICAgIGluc3RyIHw9IChyZWdvcC5uIDw8IDE0KSB8IHJlZ29wLnNwZWNpYWw7Ci0gICAgfQotCi0KLSAgaWYgKG4gPCAzKQotICAgIHsKLSAgICAgIGVtaXQgKGluc3RyKTsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbnN0cnVtZW50X2JyYW5jaGVzKQotCXsKLQkgIGJyY250X2VtaXQgKCk7Ci0JICBjb2xvbiAoYnJsYWJfbmV4dCAoKSk7Ci0JfQotCi0gICAgICAvKiBBIHRoaXJkIG9wZXJhbmQgdG8gYSBDT0JSIGlzIGFsd2F5cyBhIGRpc3BsYWNlbWVudC4gIFBhcnNlCi0gICAgICAgICBpdDsgaWYgaXQncyByZWxheGFibGUgKGEgY29iciAiaiIgZGlyZWN0aXZlLCBvciBhbnkgY29icgotICAgICAgICAgb3RoZXIgdGhhbiBiYnMvYmJjIHdoZW4gdGhlICItbm9yZWxheCIgb3B0aW9uIGlzIG5vdCBpbiB1c2UpCi0gICAgICAgICBzZXQgdXAgYSB2YXJpYWJsZSBjb2RlIGZyYWdtZW50OyBvdGhlcndpc2Ugc2V0IHVwIGFuIGFkZHJlc3MKLSAgICAgICAgIGZpeC4gICovCi0gICAgICB2YXJfZnJhZyA9ICFub3JlbGF4IHx8IChvUC0+Zm9ybWF0ID09IENPSik7CS8qIFRSVUUgb3IgRkFMU0UgKi8KLSAgICAgIGdldF9jZGlzcCAoYXJnWzNdLCAiQ09CUiIsIGluc3RyLCAxMywgdmFyX2ZyYWcsIDApOwotCi0gICAgICBpZiAoaW5zdHJ1bWVudF9icmFuY2hlcykKLQl7Ci0JICBicmNudF9lbWl0ICgpOwotCX0KLSAgICB9Ci19CQkJCS8qIGNvYnJfZm10KCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGN0cmxfZm10OglnZW5lcmF0ZSBhIENUUkwtZm9ybWF0IGluc3RydWN0aW9uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLXZvaWQKLWN0cmxfZm10ICh0YXJnUCwgb3Bjb2RlLCBudW1fb3BzKQotICAgICBjaGFyICp0YXJnUDsJCS8qIFBvaW50ZXIgdG8gdGV4dCBvZiBsb25lIG9wZXJhbmQgKGlmIGFueSkgKi8KLSAgICAgbG9uZyBvcGNvZGU7CQkvKiBUZW1wbGF0ZSBvZiBpbnN0cnVjdGlvbiAqLwotICAgICBpbnQgbnVtX29wczsJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotewotICBpbnQgaW5zdHJ1bWVudDsJCS8qIFRSVUUgaWZmIHdlIHNob3VsZCBhZGQgaW5zdHJ1bWVudGF0aW9uIHRvIHRyYWNrCi0JCQkJICAgKiBob3cgb2Z0ZW4gdGhlIGJyYW5jaCBpcyB0YWtlbgotCQkJCSAqLwotCi0KLSAgaWYgKG51bV9vcHMgPT0gMCkKLSAgICB7Ci0gICAgICBlbWl0IChvcGNvZGUpOwkJLyogT3V0cHV0IG9wY29kZSAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLQotICAgICAgaW5zdHJ1bWVudCA9IGluc3RydW1lbnRfYnJhbmNoZXMgJiYgKG9wY29kZSAhPSBDQUxMKQotCSYmIChvcGNvZGUgIT0gQikgJiYgKG9wY29kZSAhPSBSRVQpICYmIChvcGNvZGUgIT0gQkFMKTsKLQotICAgICAgaWYgKGluc3RydW1lbnQpCi0JewotCSAgYnJjbnRfZW1pdCAoKTsKLQkgIGNvbG9uIChicmxhYl9uZXh0ICgpKTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBvcGVyYW5kIE1VU1QgYmUgYW4gaXAtcmVsYXRpdmUgZGlzcGxhY21lbnQuIFBhcnNlIGl0Ci0gICAgICAgICAqIGFuZCBzZXQgdXAgYWRkcmVzcyBmaXggZm9yIHRoZSBpbnN0cnVjdGlvbiB3ZSBqdXN0IG91dHB1dC4KLSAgICAgICAqLwotICAgICAgZ2V0X2NkaXNwICh0YXJnUCwgIkNUUkwiLCBvcGNvZGUsIDI0LCAwLCAwKTsKLQotICAgICAgaWYgKGluc3RydW1lbnQpCi0JewotCSAgYnJjbnRfZW1pdCAoKTsKLQl9Ci0gICAgfQotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBlbWl0OglvdXRwdXQgaW5zdHJ1Y3Rpb24gYmluYXJ5Ci0KLSAgCU91dHB1dCBpbnN0cnVjdGlvbiBiaW5hcnksIGluIHRhcmdldCBieXRlIG9yZGVyLCA0IGJ5dGVzIGF0IGEgdGltZS4KLSAgCVJldHVybiBwb2ludGVyIHRvIHdoZXJlIGl0IHdhcyBwbGFjZWQuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWNoYXIgKgotZW1pdCAoaW5zdHIpCi0gICAgIGxvbmcgaW5zdHI7CQkvKiBXb3JkIHRvIGJlIG91dHB1dCwgaG9zdCBieXRlIG9yZGVyICovCi17Ci0gIGNoYXIgKnRvUDsJCQkvKiBXaGVyZSB0byBvdXRwdXQgaXQgKi8KLQotICB0b1AgPSBmcmFnX21vcmUgKDQpOwkJLyogQWxsb2NhdGUgc3RvcmFnZSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgaW5zdHIsIDQpOwkvKiBDb252ZXJ0IHRvIHRhcmdldCBieXRlIG9yZGVyICovCi0gIHJldHVybiB0b1A7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBnZXRfYXJnczoJYnJlYWsgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3V0IG9mIGNvbW1hLXNlcGFyYXRlZCBsaXN0Ci0KLSAgIElucHV0IGFzc3VtcHRpb25zOgotICAJLSBhbGwgY29tbWVudHMgYW5kIGxhYmVscyBoYXZlIGJlZW4gcmVtb3ZlZAotICAJLSBhbGwgc3RyaW5ncyBvZiB3aGl0ZXNwYWNlIGhhdmUgYmVlbiBjb2xsYXBzZWQgdG8gYSBzaW5nbGUgYmxhbmsuCi0gIAktIGFsbCBjaGFyYWN0ZXIgY29uc3RhbnRzICgneCcpIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGRlY2ltYWwKLQotICAgT3V0cHV0OgotICAJYXJnc1swXSBpcyB1bnRvdWNoZWQuIGFyZ3NbMV0gcG9pbnRzIHRvIGZpcnN0IG9wZXJhbmQsIGV0Yy4gQWxsIGFyZ3M6Ci0gIAktIGFyZSBOVUxMLXRlcm1pbmF0ZWQKLSAgCS0gY29udGFpbiBubyB3aGl0ZXNwYWNlCi0KLSAgIFJldHVybiB2YWx1ZToKLSAgCU51bWJlciBvZiBvcGVyYW5kcyAoMCwxLDIsIG9yIDMpIG9yIC0xIG9uIGVycm9yLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGludAotZ2V0X2FyZ3MgKHAsIGFyZ3MpCi0gICAgIC8qIFBvaW50ZXIgdG8gY29tbWEtc2VwYXJhdGVkIG9wZXJhbmRzOyBNVUNLRUQgQlkgVVMgKi8KLSAgICAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgICAgLyogT3V0cHV0IGFyZzogcG9pbnRlcnMgdG8gb3BlcmFuZHMgcGxhY2VkIGluIGFyZ3NbMS0zXS4gIE1VU1QKLSAgICAgICAgQUNDT01NT0RBVEUgNCBFTlRSSUVTIChhcmdzWzAtM10pLiAgKi8KLSAgICAgY2hhciAqYXJnc1tdOwotewotICByZWdpc3RlciBpbnQgbjsJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotICByZWdpc3RlciBjaGFyICp0bzsKLQotICAvKiBTa2lwIGxlYWQgd2hpdGUgc3BhY2UgKi8KLSAgd2hpbGUgKCpwID09ICcgJykKLSAgICB7Ci0gICAgICBwKys7Ci0gICAgfQotCi0gIGlmICgqcCA9PSAnXDAnKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBuID0gMTsKLSAgYXJnc1sxXSA9IHA7Ci0KLSAgLyogU3F1ZXplIGJsYW5rcyBvdXQgYnkgbW92aW5nIG5vbi1ibGFua3MgdG93YXJkIHN0YXJ0IG9mIHN0cmluZy4KLSAgICAgKiBJc29sYXRlIG9wZXJhbmRzLCB3aGVuZXZlciBjb21tYSBpcyBmb3VuZC4KLSAgICovCi0gIHRvID0gcDsKLSAgd2hpbGUgKCpwICE9ICdcMCcpCi0gICAgewotCi0gICAgICBpZiAoKnAgPT0gJyAnCi0JICAmJiAoISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgcFsxXSkKLQkgICAgICB8fCAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBwWy0xXSkpKQotCXsKLQkgIHArKzsKLQotCX0KLSAgICAgIGVsc2UgaWYgKCpwID09ICcsJykKLQl7Ci0KLQkgIC8qIFN0YXJ0IG9mIG9wZXJhbmQgKi8KLQkgIGlmIChuID09IDMpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInRvbyBtYW55IG9wZXJhbmRzIikpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgKnRvKysgPSAnXDAnOwkJLyogVGVybWluYXRlIGFyZ3VtZW50ICovCi0JICBhcmdzWysrbl0gPSB0bzsJLyogU3RhcnQgbmV4dCBhcmd1bWVudCAqLwotCSAgcCsrOwotCi0JfQotICAgICAgZWxzZQotCXsKLQkgICp0bysrID0gKnArKzsKLQl9Ci0gICAgfQotICAqdG8gPSAnXDAnOwotICByZXR1cm4gbjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGdldF9jZGlzcDoJaGFuZGxlIGRpc3BsYWNlbWVudCBmb3IgYSBDT0JSIG9yIENUUkwgaW5zdHJ1Y3Rpb24uCi0KLSAgCVBhcnNlIGRpc3BsYWNlbWVudCBmb3IgYSBDT0JSIG9yIENUUkwgaW5zdHJ1Y3Rpb24uCi0KLSAgCUlmIHN1Y2Nlc3NmdWwsIG91dHB1dCB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlIGFuZCBzZXQgdXAgZm9yIGl0LAotICAJZGVwZW5kaW5nIG9uIHRoZSBhcmcgJ3Zhcl9mcmFnJywgZWl0aGVyOgotICAJICAgIG8gYW4gYWRkcmVzcyBmaXh1cCB0byBiZSBkb25lIHdoZW4gYWxsIHN5bWJvbCB2YWx1ZXMgYXJlIGtub3duLCBvcgotICAJICAgIG8gYSB2YXJ5aW5nIGxlbmd0aCBjb2RlIGZyYWdtZW50LCB3aXRoIGFkZHJlc3MgZml4dXAgaW5mby4gIFRoaXMKLSAgCQl3aWxsIGJlIGRvbmUgZm9yIGNvYnIgaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5IGhhdmUgdG8gYmUgcmVsYXhlZAotICAJCWluIHRvIGNvbXBhcmUvYnJhbmNoIGluc3RydWN0aW9ucyAoOCBieXRlcykgaWYgdGhlIGZpbmFsCi0gIAkJYWRkcmVzcyBkaXNwbGFjZW1lbnQgaXMgZ3JlYXRlciB0aGFuIDEzIGJpdHMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYwotdm9pZAotZ2V0X2NkaXNwIChkaXNwUCwgaWZtdFAsIGluc3RyLCBudW1iaXRzLCB2YXJfZnJhZywgY2FsbGopCi0gICAgIC8qIGRpc3BsYWNlbWVudCBhcyBzcGVjaWZpZWQgaW4gc291cmNlIGluc3RydWN0aW9uICovCi0gICAgIGNoYXIgKmRpc3BQOwotICAgICAvKiAiQ09CUiIgb3IgIkNUUkwiIChmb3IgdXNlIGluIGVycm9yIG1lc3NhZ2UpICovCi0gICAgIGNoYXIgKmlmbXRQOwotICAgICAvKiBJbnN0cnVjdGlvbiBuZWVkaW5nIHRoZSBkaXNwbGFjZW1lbnQgKi8KLSAgICAgbG9uZyBpbnN0cjsKLSAgICAgLyogIyBiaXRzIG9mIGRpc3BsYWNlbWVudCAoMTMgZm9yIENPQlIsIDI0IGZvciBDVFJMKSAqLwotICAgICBpbnQgbnVtYml0czsKLSAgICAgLyogMSBpZiB2YXJ5aW5nIGxlbmd0aCBjb2RlIGZyYWdtZW50IHNob3VsZCBiZSBlbWl0dGVkOwotICAgICAgKiAgICAgICAwIGlmIGFuIGFkZHJlc3MgZml4IHNob3VsZCBiZSBlbWl0dGVkLgotICAgICAgKi8KLSAgICAgaW50IHZhcl9mcmFnOwotICAgICAvKiAxIGlmIGNhbGxqIHJlbG9jYXRpb24gc2hvdWxkIGJlIGRvbmU7IGVsc2UgMCAqLwotICAgICBpbnQgY2FsbGo7Ci17Ci0gIGV4cHJlc3Npb25TIGU7CQkvKiBQYXJzZWQgZXhwcmVzc2lvbiAqLwotICBmaXhTICpmaXhQOwkJCS8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIG5lZWRlZCBhZGRyZXNzIGZpeCAqLwotICBjaGFyICpvdXRQOwkJCS8qIFdoZXJlIGluc3RydWN0aW9uIGJpbmFyeSBpcyBvdXRwdXQgdG8gKi8KLQotICBmaXhQID0gTlVMTDsKLQotICBwYXJzZV9leHByIChkaXNwUCwgJmUpOwotICBzd2l0Y2ggKGUuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgICBhc19iYWQgKF8oImV4cHJlc3Npb24gc3ludGF4IGVycm9yIikpOwotCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChlLlhfYWRkX3N5bWJvbCkgPT0gbm93X3NlZwotCSAgfHwgU19HRVRfU0VHTUVOVCAoZS5YX2FkZF9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCXsKLQkgIGlmICh2YXJfZnJhZykKLQkgICAgewotCSAgICAgIG91dFAgPSBmcmFnX21vcmUgKDgpOwkvKiBBbGxvY2F0ZSB3b3JzdC1jYXNlIHN0b3JhZ2UgKi8KLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKG91dFAsIGluc3RyLCA0KTsKLQkgICAgICBmcmFnX3ZhcmlhbnQgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCA0LCAxLAotCQkJICAgIGFkZHMgKGUpLCBvZmZzIChlKSwgb3V0UCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNldCB1cCBhIG5ldyBmaXggc3RydWN0dXJlLCBzbyBhZGRyZXNzIGNhbiBiZSB1cGRhdGVkCi0JICAgICAgICogd2hlbiBhbGwgc3ltYm9sIHZhbHVlcyBhcmUga25vd24uCi0JICAgICAgICovCi0JICAgICAgb3V0UCA9IGVtaXQgKGluc3RyKTsKLQkgICAgICBmaXhQID0gZml4X25ldyAoZnJhZ19ub3csCi0JCQkgICAgICBvdXRQIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICA0LAotCQkJICAgICAgYWRkcyAoZSksCi0JCQkgICAgICBvZmZzIChlKSwKLQkJCSAgICAgIDEsCi0JCQkgICAgICBOT19SRUxPQyk7Ci0KLQkgICAgICBmaXhQLT5meF90Y2JpdCA9IGNhbGxqOwotCi0JICAgICAgLyogV2Ugd2FudCB0byBtb2RpZnkgYSBiaXQgZmllbGQgd2hlbiB0aGUgYWRkcmVzcyBpcwotCSAgICAgICAqIGtub3duLiAgQnV0IHdlIGRvbid0IG5lZWQgYWxsIHRoZSBnYXJiYWdlIGluIHRoZQotCSAgICAgICAqIGJpdF9maXggc3RydWN0dXJlLiAgU28gd2UncmUgZ29pbmcgdG8gbGllIGFuZCBzdG9yZQotCSAgICAgICAqIHRoZSBudW1iZXIgb2YgYml0cyBhZmZlY3RlZCBpbnN0ZWFkIG9mIGEgcG9pbnRlci4KLQkgICAgICAgKi8KLQkgICAgICBmaXhQLT5meF9iaXRfZml4UCA9IChiaXRfZml4UyAqKSBudW1iaXRzOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygiYXR0ZW1wdCB0byBicmFuY2ggaW50byBkaWZmZXJlbnQgc2VnbWVudCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygidGFyZ2V0IG9mICVzIGluc3RydWN0aW9uIG11c3QgYmUgYSBsYWJlbCIpLCBpZm10UCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBnZXRfaXNwZWM6CXBhcnNlIGEgbWVtb3J5IG9wZXJhbmQgZm9yIGFuIGluZGV4IHNwZWNpZmljYXRpb24KLQotICAJSGVyZSwgYW4gImluZGV4IHNwZWNpZmljYXRpb24iIGlzIHRha2VuIHRvIGJlIGFueXRoaW5nIHN1cnJvdW5kZWQKLSAgCWJ5IHNxdWFyZSBicmFja2V0cyBhbmQgTk9UIGZvbGxvd2VkIGJ5IGFueXRoaW5nIGVsc2UuCi0KLSAgCUlmIGl0J3MgZm91bmQsIGRldGFjaCBpdCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIHJlbW92ZSB0aGUgc3Vycm91bmRpbmcKLSAgCXNxdWFyZSBicmFja2V0cywgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuICBPdGhlcndpc2UsIHJldHVybiBOVUxMLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi1jaGFyICoKLWdldF9pc3BlYyAodGV4dFApCi0gICAgIC8qIFBvaW50ZXIgdG8gbWVtb3J5IG9wZXJhbmQgZnJvbSBzb3VyY2UgaW5zdHJ1Y3Rpb24sIG5vIHdoaXRlIHNwYWNlLiAgKi8KLSAgICAgY2hhciAqdGV4dFA7Ci17Ci0gIC8qIFBvaW50cyB0byBzdGFydCBvZiBpbmRleCBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgY2hhciAqc3RhcnQ7Ci0gIC8qIFBvaW50cyB0byBlbmQgb2YgaW5kZXggc3BlY2lmaWNhdGlvbi4gICovCi0gIGNoYXIgKmVuZDsKLQotICAvKiBGaW5kIG9wZW5pbmcgc3F1YXJlIGJyYWNrZXQsIGlmIGFueS4gICovCi0gIHN0YXJ0ID0gc3RyY2hyICh0ZXh0UCwgJ1snKTsKLQotICBpZiAoc3RhcnQgIT0gTlVMTCkKLSAgICB7Ci0KLSAgICAgIC8qIEVsaW1pbmF0ZSAnWycsIGRldGFjaCBmcm9tIHJlc3Qgb2Ygb3BlcmFuZCAqLwotICAgICAgKnN0YXJ0KysgPSAnXDAnOwotCi0gICAgICBlbmQgPSBzdHJjaHIgKHN0YXJ0LCAnXScpOwotCi0gICAgICBpZiAoZW5kID09IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCJ1bm1hdGNoZWQgJ1snIikpOwotCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEVsaW1pbmF0ZSAnXScgYW5kIG1ha2Ugc3VyZSBpdCB3YXMgdGhlIGxhc3QgdGhpbmcKLQkgICAgICogaW4gdGhlIHN0cmluZy4KLQkgICAqLwotCSAgKmVuZCA9ICdcMCc7Ci0JICBpZiAoKihlbmQgKyAxKSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJnYXJiYWdlIGFmdGVyIGluZGV4IHNwZWMgaWdub3JlZCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBzdGFydDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBnZXRfcmVnbnVtOgotCi0gIAlMb29rIHVwIGEgKHN1c3BlY3RlZCkgcmVnaXN0ZXIgbmFtZSBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgYW5kIHJldHVybiB0aGUKLSAgCWFzc29jaWF0ZWQgcmVnaXN0ZXIgbnVtYmVyIChvciAtMSBpZiBub3QgZm91bmQpLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi1pbnQKLWdldF9yZWdudW0gKHJlZ25hbWUpCi0gICAgIGNoYXIgKnJlZ25hbWU7CQkvKiBTdXNwZWN0ZWQgcmVnaXN0ZXIgbmFtZSAqLwotewotICBpbnQgKnJQOwotCi0gIHJQID0gKGludCAqKSBoYXNoX2ZpbmQgKHJlZ19oYXNoLCByZWduYW1lKTsKLSAgcmV0dXJuIChyUCA9PSBOVUxMKSA/IC0xIDogKnJQOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgaV9zY2FuOglwZXJmb3JtIGxleGljYWwgc2NhbiBvZiBhc2NpaSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24uCi0KLSAgIElucHV0IGFzc3VtcHRpb25zOgotICAJLSBpbnB1dCBzdHJpbmcgaXMgYW4gaTgwOTYwIGluc3RydWN0aW9uIChub3QgYSBwc2V1ZG8tb3ApCi0gIAktIGFsbCBjb21tZW50cyBhbmQgbGFiZWxzIGhhdmUgYmVlbiByZW1vdmVkCi0gIAktIGFsbCBzdHJpbmdzIG9mIHdoaXRlc3BhY2UgaGF2ZSBiZWVuIGNvbGxhcHNlZCB0byBhIHNpbmdsZSBibGFuay4KLQotICAgT3V0cHV0OgotICAJYXJnc1swXSBwb2ludHMgdG8gb3Bjb2RlLCBvdGhlciBlbnRyaWVzIHBvaW50IHRvIG9wZXJhbmRzLiBBbGwgc3RyaW5nczoKLSAgCS0gYXJlIE5VTEwtdGVybWluYXRlZAotICAJLSBjb250YWluIG5vIHdoaXRlc3BhY2UKLSAgCS0gaGF2ZSBjaGFyYWN0ZXIgY29uc3RhbnRzICgneCcpIHJlcGxhY2VkIHdpdGggYSBkZWNpbWFsIG51bWJlcgotCi0gICBSZXR1cm4gdmFsdWU6Ci0gIAlOdW1iZXIgb2Ygb3BlcmFuZHMgKDAsMSwyLCBvciAzKSBvciAtMSBvbiBlcnJvci4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBpbnQKLWlfc2NhbiAoaVAsIGFyZ3MpCi0gICAgIC8qIFBvaW50ZXIgdG8gYXNjaWkgaW5zdHJ1Y3Rpb247ICBNVUNLRUQgQlkgVVMuICovCi0gICAgIHJlZ2lzdGVyIGNoYXIgKmlQOwotICAgICAvKiBPdXRwdXQgYXJnOiBwb2ludGVycyB0byBvcGNvZGUgYW5kIG9wZXJhbmRzIHBsYWNlZCBoZXJlLiAgTVVTVAotCUFDQ09NTU9EQVRFIDQgRU5UUklFUy4gICovCi0gICAgIGNoYXIgKmFyZ3NbXTsKLXsKLQotICAvKiBJc29sYXRlIG9wY29kZSAqLwotICBpZiAoKihpUCkgPT0gJyAnKQotICAgIHsKLSAgICAgIGlQKys7Ci0gICAgfQkJCQkvKiBTa2lwIGxlYWQgc3BhY2UsIGlmIGFueSAqLwotICBhcmdzWzBdID0gaVA7Ci0gIGZvciAoOyAqaVAgIT0gJyAnOyBpUCsrKQotICAgIHsKLSAgICAgIGlmICgqaVAgPT0gJ1wwJykKLQl7Ci0JICAvKiBUaGVyZSBhcmUgbm8gb3BlcmFuZHMgKi8KLQkgIGlmIChhcmdzWzBdID09IGlQKQotCSAgICB7Ci0JICAgICAgLyogV2UgbmV2ZXIgbW92ZWQ6IHRoZXJlIHdhcyBubyBvcGNvZGUgZWl0aGVyISAqLwotCSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGNvZGUiKSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAqaVArKyA9ICdcMCc7CQkJLyogVGVybWluYXRlIG9wY29kZSAqLwotICByZXR1cm4gKGdldF9hcmdzIChpUCwgYXJncykpOwotfQkJCQkvKiBpX3NjYW4oKSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWVtX2ZtdDoJZ2VuZXJhdGUgYSBNRU1BLSBvciBNRU1CLWZvcm1hdCBpbnN0cnVjdGlvbgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLW1lbV9mbXQgKGFyZ3MsIG9QLCBjYWxseCkKLSAgICAgY2hhciAqYXJnc1tdOwkJLyogYXJnc1swXS0+b3Bjb2RlIG1uZW1vbmljLCBhcmdzWzEtM10tPm9wZXJhbmRzICovCi0gICAgIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7CS8qIFBvaW50ZXIgdG8gZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgaW50IGNhbGx4OwkJCS8qIElzIHRoaXMgYSBjYWxseCBvcGNvZGUgKi8KLXsKLSAgaW50IGk7CQkJLyogTG9vcCBjb3VudGVyICovCi0gIHN0cnVjdCByZWdvcCByZWdvcDsJCS8qIERlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLSAgY2hhciBvcGRlc2M7CQkJLyogT3BlcmFuZCBkZXNjcmlwdG9yIGJ5dGUgKi8KLSAgbWVtUyBpbnN0cjsJCQkvKiBEZXNjcmlwdGlvbiBvZiBiaW5hcnkgdG8gYmUgb3V0cHV0ICovCi0gIGNoYXIgKm91dFA7CQkJLyogV2hlcmUgdGhlIGJpbmFyeSB3YXMgb3V0cHV0IHRvICovCi0gIGV4cHJlc3Npb25TIGV4cHI7CQkvKiBQYXJzZWQgZXhwcmVzc2lvbiAqLwotICAvKiAtPmRlc2NyaXB0aW9uIG9mIGRlZmVycmVkIGFkZHJlc3MgZml4dXAgKi8KLSAgZml4UyAqZml4UDsKLQotI2lmZGVmIE9CSl9DT0ZGCi0gIC8qIENPRkYgc3VwcG9ydCBpc24ndCBpbiBwbGFjZSB5ZXQgZm9yIGNhbGx4IHJlbGF4aW5nLiAgKi8KLSAgY2FsbHggPSAwOwotI2VuZGlmCi0KLSAgbWVtc2V0ICgmaW5zdHIsICdcMCcsIHNpemVvZiAobWVtUykpOwotICBpbnN0ci5vcGNvZGUgPSBvUC0+b3Bjb2RlOwotCi0gIC8qIFByb2Nlc3Mgb3BlcmFuZHMuICovCi0gIGZvciAoaSA9IDE7IGkgPD0gb1AtPm51bV9vcHM7IGkrKykKLSAgICB7Ci0gICAgICBvcGRlc2MgPSBvUC0+b3BlcmFuZFtpIC0gMV07Ci0KLSAgICAgIGlmIChNRU1PUCAob3BkZXNjKSkKLQl7Ci0JICBwYXJzZV9tZW1vcCAoJmluc3RyLCBhcmdzW2ldLCBvUC0+Zm9ybWF0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnc1tpXSwgb3BkZXNjKTsKLQkgIGluc3RyLm9wY29kZSB8PSByZWdvcC5uIDw8IDE5OwotCX0KLSAgICB9Ci0KLSAgLyogUGFyc2UgdGhlIGRpc3BsYWNlbWVudDsgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGVtaXR0aW5nIHRoZQotICAgICBvcGNvZGUsIGluIGNhc2UgaXQgaXMgYW4gZXhwcmVzc2lvbiB1c2luZyBgLicuICAqLwotICBwYXJzZV9leHByIChpbnN0ci5lLCAmZXhwcik7Ci0KLSAgLyogT3V0cHV0IG9wY29kZSAqLwotICBvdXRQID0gZW1pdCAoaW5zdHIub3Bjb2RlKTsKLQotICBpZiAoaW5zdHIuZGlzcCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogUHJvY2VzcyB0aGUgZGlzcGxhY2VtZW50ICovCi0gIHN3aXRjaCAoZXhwci5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICAgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiBzeW50YXggZXJyb3IiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIGlmIChpbnN0ci5kaXNwID09IDMyKQotCXsKLQkgICh2b2lkKSBlbWl0IChvZmZzIChleHByKSk7CS8qIE91dHB1dCBkaXNwbGFjZW1lbnQgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogMTItYml0IGRpc3BsYWNlbWVudCAqLwotCSAgaWYgKG9mZnMgKGV4cHIpICYgfjB4ZmZmKQotCSAgICB7Ci0JICAgICAgLyogV29uJ3QgZml0IGluIDEyIGJpdHM6IGNvbnZlcnQgYWxyZWFkeS1vdXRwdXQKLQkgICAgICAgKiBpbnN0cnVjdGlvbiB0byBNRU1CIGZvcm1hdCwgb3V0cHV0Ci0JICAgICAgICogZGlzcGxhY2VtZW50LgotCSAgICAgICAqLwotCSAgICAgIG1lbWFfdG9fbWVtYiAob3V0UCk7Ci0JICAgICAgKHZvaWQpIGVtaXQgKG9mZnMgKGV4cHIpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV0lMTCBmaXQgaW4gMTIgYml0czogIE9SIGludG8gb3Bjb2RlIGFuZAotCSAgICAgICAqIG92ZXJ3cml0ZSB0aGUgYmluYXJ5IHdlIGFscmVhZHkgcHV0IG91dAotCSAgICAgICAqLwotCSAgICAgIGluc3RyLm9wY29kZSB8PSBvZmZzIChleHByKTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKG91dFAsIGluc3RyLm9wY29kZSwgNCk7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoaW5zdHIuZGlzcCA9PSAxMikKLQl7Ci0JICAvKiBEaXNwbGFjZW1lbnQgaXMgZGVwZW5kZW50IG9uIGEgc3ltYm9sLCB3aG9zZSB2YWx1ZQotCSAgICogbWF5IGNoYW5nZSBhdCBsaW5rIHRpbWUuICBXZSBIQVZFIHRvIHJlc2VydmUgMzIgYml0cy4KLQkgICAqIENvbnZlcnQgYWxyZWFkeS1vdXRwdXQgb3Bjb2RlIHRvIE1FTUIgZm9ybWF0LgotCSAgICovCi0JICBtZW1hX3RvX21lbWIgKG91dFApOwotCX0KLQotICAgICAgLyogT3V0cHV0IDAgZGlzcGxhY2VtZW50IGFuZCBzZXQgdXAgYWRkcmVzcyBmaXh1cCBmb3Igd2hlbgotICAgICAgICogdGhpcyBzeW1ib2wncyB2YWx1ZSBiZWNvbWVzIGtub3duLgotICAgICAgICovCi0gICAgICBvdXRQID0gZW1pdCAoKGxvbmcpIDApOwotICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgb3V0UCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICA0LAotCQkJICAmZXhwciwKLQkJCSAgMCwKLQkJCSAgTk9fUkVMT0MpOwotICAgICAgLyogU3RldmUncyBsaW5rZXIgcmVsYXhpbmcgaGFjay4gIE1hcmsgdGhpcyAzMi1iaXQgcmVsb2NhdGlvbiBhcwotICAgICAgICAgYmVpbmcgaW4gdGhlIGluc3RydWN0aW9uIHN0cmVhbSwgc3BlY2lmaWNhbGx5IGFzIHBhcnQgb2YgYSBjYWxseAotICAgICAgICAgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZml4UC0+ZnhfYnNyID0gY2FsbHg7Ci0gICAgICBicmVhazsKLSAgICB9Ci19CQkJCS8qIG1lbWZtdCgpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZW1hX3RvX21lbWI6CWNvbnZlcnQgYSBNRU1BLWZvcm1hdCBvcGNvZGUgdG8gYSBNRU1CLWZvcm1hdCBvcGNvZGUuCi0KLSAgIFRoZXJlIGFyZSAyIHBvc3NpYmxlIE1FTUEgZm9ybWF0czoKLSAgCS0gZGlzcGxhY2VtZW50IG9ubHkKLSAgCS0gZGlzcGxhY2VtZW50ICsgYWJhc2UKLQotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgc2V0dGluZyBvZiB0aGUgTUVNQV9BQkFTRSBiaXQuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZAotbWVtYV90b19tZW1iIChvcGNvZGVQKQotICAgICBjaGFyICpvcGNvZGVQOwkJLyogV2hlcmUgdG8gZmluZCB0aGUgb3Bjb2RlLCBpbiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotewotICBsb25nIG9wY29kZTsJCQkvKiBPcGNvZGUgaW4gaG9zdCBieXRlIG9yZGVyICovCi0gIGxvbmcgbW9kZTsJCQkvKiBNb2RlIGJpdHMgZm9yIE1FTUIgaW5zdHJ1Y3Rpb24gKi8KLQotICBvcGNvZGUgPSBtZF9jaGFyc190b19udW1iZXIgKG9wY29kZVAsIDQpOwotICBrbm93ICghKG9wY29kZSAmIE1FTUJfQklUKSk7Ci0KLSAgbW9kZSA9IE1FTUJfQklUIHwgRF9CSVQ7Ci0gIGlmIChvcGNvZGUgJiBNRU1BX0FCQVNFKQotICAgIHsKLSAgICAgIG1vZGUgfD0gQV9CSVQ7Ci0gICAgfQotCi0gIG9wY29kZSAmPSAweGZmZmZjMDAwOwkJLyogQ2xlYXIgTUVNQSBvZmZzZXQgYW5kIG1vZGUgYml0cyAqLwotICBvcGNvZGUgfD0gbW9kZTsJCS8qIFNldCBNRU1CIG1vZGUgYml0cyAqLwotCi0gIG1kX251bWJlcl90b19jaGFycyAob3Bjb2RlUCwgb3Bjb2RlLCA0KTsKLX0JCQkJLyogbWVtYV90b19tZW1iKCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHBhcnNlX2V4cHI6CQlwYXJzZSBhbiBleHByZXNzaW9uCi0KLSAgCVVzZSBiYXNlIGFzc2VtYmxlcidzIGV4cHJlc3Npb24gcGFyc2VyIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24uCi0gIAlJdCwgdW5mb3J0dW5hdGVseSwgcnVucyBvZmYgYSBnbG9iYWwgd2hpY2ggd2UgaGF2ZSB0byBzYXZlL3Jlc3RvcmUKLSAgCWluIG9yZGVyIHRvIG1ha2UgaXQgd29yayBmb3IgdXMuCi0KLSAgCUFuIGVtcHR5IGV4cHJlc3Npb24gc3RyaW5nIGlzIHRyZWF0ZWQgYXMgYW4gYWJzb2x1dGUgMC4KLQotICAJU2V0cyBPX2lsbGVnYWwgcmVnYXJkbGVzcyBvZiBleHByZXNzaW9uIGV2YWx1YXRpb24gaWYgZW50aXJlIGlucHV0Ci0gIAlzdHJpbmcgaXMgbm90IGNvbnN1bWVkIGluIHRoZSBldmFsdWF0aW9uIC0tIHRvbGVyYXRlIG5vIGRhbmdsaW5nIGp1bmshCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZAotcGFyc2VfZXhwciAodGV4dFAsIGV4cFApCi0gICAgIGNoYXIgKnRleHRQOwkJLyogVGV4dCBvZiBleHByZXNzaW9uIHRvIGJlIHBhcnNlZCAqLwotICAgICBleHByZXNzaW9uUyAqZXhwUDsJCS8qIFdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nICovCi17Ci0gIGNoYXIgKnNhdmVfaW47CQkvKiBTYXZlIGdsb2JhbCBoZXJlICovCi0gIHN5bWJvbFMgKnN5bVA7Ci0KLSAga25vdyAodGV4dFApOwotCi0gIGlmICgqdGV4dFAgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBUcmVhdCBlbXB0eSBzdHJpbmcgYXMgYWJzb2x1dGUgMCAqLwotICAgICAgZXhwUC0+WF9hZGRfc3ltYm9sID0gZXhwUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CS8qIFNhdmUgZ2xvYmFsICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0ZXh0UDsJLyogTWFrZSBwYXJzZXIgd29yayBmb3IgdXMgKi8KLQotICAgICAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cFApOwotICAgICAgaWYgKChzaXplX3QpIChpbnB1dF9saW5lX3BvaW50ZXIgLSB0ZXh0UCkgIT0gc3RybGVuICh0ZXh0UCkpCi0JewotCSAgLyogRGlkIG5vdCBjb25zdW1lIGFsbCBvZiB0aGUgaW5wdXQgKi8KLQkgIGV4cFAtPlhfb3AgPSBPX2lsbGVnYWw7Ci0JfQotICAgICAgc3ltUCA9IGV4cFAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIGlmIChzeW1QICYmIChoYXNoX2ZpbmQgKHJlZ19oYXNoLCBTX0dFVF9OQU1FIChzeW1QKSkpKQotCXsKLQkgIC8qIFJlZ2lzdGVyIG5hbWUgaW4gYW4gZXhwcmVzc2lvbiAqLwotCSAgLyogRklYTUU6IHRoaXMgaXNuJ3QgbXVjaCBvZiBhIGNoZWNrIGFueSBtb3JlLiAgKi8KLQkgIGV4cFAtPlhfb3AgPSBPX2lsbGVnYWw7Ci0JfQotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwkvKiBSZXN0b3JlIGdsb2JhbCAqLwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHBhcnNlX2xkY29udDoKLSAgCVBhcnNlIGFuZCByZXBsYWNlIGEgJ2xkY29uc3QnIHBzZXVkby1pbnN0cnVjdGlvbiB3aXRoIGFuIGFwcHJvcHJpYXRlCi0gIAlpODA5NjAgaW5zdHJ1Y3Rpb24uCi0KLSAgCUFzc3VtZXMgdGhlIGlucHV0IGNvbnNpc3RzIG9mOgotICAJCWFyZ1swXQlvcGNvZGUgbW5lbW9uaWMgKCdsZGNvbnN0JykKLSAgCQlhcmdbMV0gIGZpcnN0IG9wZXJhbmQgKGNvbnN0YW50KQotICAJCWFyZ1syXQluYW1lIG9mIHJlZ2lzdGVyIHRvIGJlIGxvYWRlZAotCi0gIAlSZXBsYWNlcyBvcGNvZGUgYW5kL29yIG9wZXJhbmRzIGFzIGFwcHJvcHJpYXRlLgotCi0gIAlSZXR1cm5zIHRoZSBuZXcgbnVtYmVyIG9mIGFyZ3VtZW50cywgb3IgLTEgb24gZmFpbHVyZS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotaW50Ci1wYXJzZV9sZGNvbnN0IChhcmcpCi0gICAgIGNoYXIgKmFyZ1tdOwkJLyogU2VlIGFib3ZlICovCi17Ci0gIGludCBuOwkJCS8qIENvbnN0YW50IHRvIGJlIGxvYWRlZCAqLwotICBpbnQgc2hpZnQ7CQkJLyogU2hpZnQgY291bnQgZm9yICJzaGxvIiBpbnN0cnVjdGlvbiAqLwotICBzdGF0aWMgY2hhciBidWZbNV07CQkvKiBMaXRlcmFsIGZvciBmaXJzdCBvcGVyYW5kICovCi0gIHN0YXRpYyBjaGFyIGJ1ZjJbNV07CQkvKiBMaXRlcmFsIGZvciBzZWNvbmQgb3BlcmFuZCAqLwotICBleHByZXNzaW9uUyBlOwkJLyogUGFyc2VkIGV4cHJlc3Npb24gKi8KLQotCi0gIGFyZ1szXSA9IE5VTEw7CQkvKiBTbyB3ZSBjYW4gdGVsbCBhdCB0aGUgZW5kIGlmIGl0IGdvdCB1c2VkIG9yIG5vdCAqLwotCi0gIHBhcnNlX2V4cHIgKGFyZ1sxXSwgJmUpOwotICBzd2l0Y2ggKGUuWF9vcCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFdlJ3JlIGRlcGVuZGVudCBvbiBvbmUgb3IgbW9yZSBzeW1ib2xzIC0tIHVzZSAibGRhIiAqLwotICAgICAgYXJnWzBdID0gImxkYSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIC8qIFRyeSB0aGUgZm9sbG93aW5nIG1hcHBpbmdzOgotICAgICAgICogICAgICBsZGNvbnN0IDAsPHJlZz4gIC0+bW92ICAwLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCAzMSw8cmVnPiAtPm1vdiAgMzEsPHJlZz4KLSAgICAgICAqICAgICAgICBsZGNvbnN0IDMyLDxyZWc+IC0+YWRkbyAxLDMxLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCA2Miw8cmVnPiAtPmFkZG8gMzEsMzEsPHJlZz4KLSAgICAgICAqICAgICAgICBsZGNvbnN0IDY0LDxyZWc+IC0+c2hsbyA4LDMsPHJlZz4KLSAgICAgICAqICAgICAgICBsZGNvbnN0IC0xLDxyZWc+IC0+c3VibyAxLDAsPHJlZz4KLSAgICAgICAqICAgICAgICBsZGNvbnN0IC0zMSw8cmVnPi0+c3VibyAzMSwwLDxyZWc+Ci0gICAgICAgKgotICAgICAgICogYW50aGluZyBlbHNlIGJlY29tZXM6Ci0gICAgICAgKiAgICAgICAgbGRhIHh4eCw8cmVnPgotICAgICAgICovCi0gICAgICBuID0gb2ZmcyAoZSk7Ci0gICAgICBpZiAoKDAgPD0gbikgJiYgKG4gPD0gMzEpKQotCXsKLQkgIGFyZ1swXSA9ICJtb3YiOwotCi0JfQotICAgICAgZWxzZSBpZiAoKC0zMSA8PSBuKSAmJiAobiA8PSAtMSkpCi0JewotCSAgYXJnWzBdID0gInN1Ym8iOwotCSAgYXJnWzNdID0gYXJnWzJdOwotCSAgc3ByaW50ZiAoYnVmLCAiJWQiLCAtbik7Ci0JICBhcmdbMV0gPSBidWY7Ci0JICBhcmdbMl0gPSAiMCI7Ci0KLQl9Ci0gICAgICBlbHNlIGlmICgoMzIgPD0gbikgJiYgKG4gPD0gNjIpKQotCXsKLQkgIGFyZ1swXSA9ICJhZGRvIjsKLQkgIGFyZ1szXSA9IGFyZ1syXTsKLQkgIGFyZ1sxXSA9ICIzMSI7Ci0JICBzcHJpbnRmIChidWYsICIlZCIsIG4gLSAzMSk7Ci0JICBhcmdbMl0gPSBidWY7Ci0KLQl9Ci0gICAgICBlbHNlIGlmICgoc2hpZnQgPSBzaGlmdF9vayAobikpICE9IDApCi0JewotCSAgYXJnWzBdID0gInNobG8iOwotCSAgYXJnWzNdID0gYXJnWzJdOwotCSAgc3ByaW50ZiAoYnVmLCAiJWQiLCBzaGlmdCk7Ci0JICBhcmdbMV0gPSBidWY7Ci0JICBzcHJpbnRmIChidWYyLCAiJWQiLCBuID4+IHNoaWZ0KTsKLQkgIGFyZ1syXSA9IGJ1ZjI7Ci0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXJnWzBdID0gImxkYSI7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBjb25zdGFudCIpKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChhcmdbM10gPT0gMCkgPyAyIDogMzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBwYXJzZV9tZW1vcDoJcGFyc2UgYSBtZW1vcnkgb3BlcmFuZAotCi0gIAlUaGlzIHJvdXRpbmUgaXMgYmFzZWQgb24gdGhlIG9ic2VydmF0aW9uIHRoYXQgdGhlIDQgbW9kZSBiaXRzIG9mIHRoZQotICAJTUVNQiBmb3JtYXQsIHRha2VuIGluZGl2aWR1YWxseSwgaGF2ZSBmYWlybHkgY29uc2lzdGVudCBtZWFuaW5nOgotCi0gIAkJIE0zIChiaXQgMTMpOiAxIGlmIGRpc3BsYWNlbWVudCBpcyBwcmVzZW50IChEX0JJVCkKLSAgCQkgTTIgKGJpdCAxMik6IDEgZm9yIE1FTUIgaW5zdHJ1Y3Rpb25zIChNRU1CX0JJVCkKLSAgCQkgTTEgKGJpdCAxMSk6IDEgaWYgaW5kZXggaXMgcHJlc2VudCAoSV9CSVQpCi0gIAkJIE0wIChiaXQgMTApOiAxIGlmIGFiYXNlIGlzIHByZXNlbnQgKEFfQklUKQotCi0gIAlTbyB3ZSBwYXJzZSB0aGUgbWVtb3J5IG9wZXJhbmQgYW5kIHNldCBiaXRzIGluIHRoZSBtb2RlIGFzIHdlIGZpbmQKLSAgCXRoaW5ncy4gIFRoZW4gYXQgdGhlIGVuZCwgaWYgd2UgZ28gdG8gTUVNQiBmb3JtYXQsIHdlIG5lZWQgb25seSBzZXQKLSAgCXRoZSBNRU1CIGJpdCAoTTIpIGFuZCBvdXIgbW9kZSBpcyBidWlsdCBmb3IgdXMuCi0KLSAgCVVuZm9ydHVuYXRlbHksIEkgc2FpZCAiZmFpcmx5IGNvbnNpc3RlbnQiLiAgVGhlIGV4Y2VwdGlvbnM6Ci0KLSAgCQkgREJJQQotICAJCSAwMTAwCVdvdWxkIHNlZW0gaWxsZWdhbCwgYnV0IG1lYW5zICJhYmFzZS1vbmx5Ii4KLQotICAJCSAwMTAxCVdvdWxkIHNlZW0gdG8gbWVhbiAiYWJhc2Utb25seSIgLS0gaXQgbWVhbnMgSVAtcmVsYXRpdmUuCi0gIAkJCU11c3QgYmUgY29udmVydGVkIHRvIDAxMDAuCi0KLSAgCQkgMDExMAlXb3VsZCBzZWVtIHRvIG1lYW4gImluZGV4LW9ubHkiLCBidXQgaXMgcmVzZXJ2ZWQuCi0gIAkJCVdlIHR1cm4gb24gdGhlIEQgYml0IGFuZCBwcm92aWRlIGEgMCBkaXNwbGFjZW1lbnQuCi0KLSAgCVRoZSBvdGhlciB0aGluZyB0byBvYnNlcnZlIGlzIHRoYXQgd2UgcGFyc2UgZnJvbSB0aGUgcmlnaHQsIHBlZWxpbmcKLSAgCXRoaW5ncyAqIG9mZiBhcyB3ZSBnbzogIGZpcnN0IGFueSBpbmRleCBzcGVjLCB0aGVuIGFueSBhYmFzZSwgdGhlbgotICAJdGhlIGRpc3BsYWNlbWVudC4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotdm9pZAotcGFyc2VfbWVtb3AgKG1lbVAsIGFyZ1AsIG9wdHlwZSkKLSAgICAgbWVtUyAqbWVtUDsJCS8qIFdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0cyAqLwotICAgICBjaGFyICphcmdQOwkJLyogVGV4dCBvZiB0aGUgb3BlcmFuZCB0byBiZSBwYXJzZWQgKi8KLSAgICAgaW50IG9wdHlwZTsJCS8qIE1FTTEsIE1FTTIsIE1FTTQsIE1FTTgsIE1FTTEyLCBvciBNRU0xNiAqLwotewotICBjaGFyICppbmRleFA7CQkJLyogUG9pbnRlciB0byBpbmRleCBzcGVjaWZpY2F0aW9uIHdpdGggIltdIiByZW1vdmVkICovCi0gIGNoYXIgKnA7CQkJLyogVGVtcCBjaGFyIHBvaW50ZXIgKi8KLSAgY2hhciBpcHJlbF9mbGFnOwkJLyogVHJ1ZSBpZiB0aGlzIGlzIGFuIElQLXJlbGF0aXZlIG9wZXJhbmQgKi8KLSAgaW50IHJlZ251bTsJCQkvKiBSZWdpc3RlciBudW1iZXIgKi8KLSAgLyogU2NhbGUgZmFjdG9yOiAxLDIsNCw4LCBvciAxNi4gIExhdGVyIGNvbnZlcnRlZCB0byBpbnRlcm5hbCBmb3JtYXQKLSAgICAgKDAsMSwyLDMsNCByZXNwZWN0aXZlbHkpLiAgKi8KLSAgaW50IHNjYWxlOwotICBpbnQgbW9kZTsJCQkvKiBNRU1CIG1vZGUgYml0cyAqLwotICBpbnQgKmludFA7CQkJLyogUG9pbnRlciB0byByZWdpc3RlciBudW1iZXIgKi8KLQotICAvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IHNjYWxlIGZhY3RvcnMgZm9yIGVhY2gKLSAgICAgdHlwZSBvZiBtZW1vcnkgaW5zdHJ1Y3Rpb24uICBJdCBpcyBhY2Nlc3NlZCB1c2luZyAob3B0eXBlLU1FTTEpCi0gICAgIGFzIGFuIGluZGV4IC0tIHRodXMgaXQgYXNzdW1lcyB0aGUgJ29wdHlwZScgY29uc3RhbnRzIGFyZQotICAgICBhc3NpZ25lZCBjb25zZWN1dGl2ZSB2YWx1ZXMsIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGlzCi0gICAgIHRhYmxlLiAgKi8KLSAgc3RhdGljIGNvbnN0IGludCBkZWZfc2NhbGVbXSA9Ci0gIHsKLSAgICAxLAkJCQkvKiBNRU0xICovCi0gICAgMiwJCQkJLyogTUVNMiAqLwotICAgIDQsCQkJCS8qIE1FTTQgKi8KLSAgICA4LAkJCQkvKiBNRU04ICovCi0gICAgLTEsCQkJCS8qIE1FTTEyIC0tIG5vIHZhbGlkIGRlZmF1bHQgKi8KLSAgICAxNgkJCQkvKiBNRU0xNiAqLwotICB9OwotCi0KLSAgaXByZWxfZmxhZyA9IG1vZGUgPSAwOwotCi0gIC8qIEFueSBpbmRleCBwcmVzZW50PyAqLwotICBpbmRleFAgPSBnZXRfaXNwZWMgKGFyZ1ApOwotICBpZiAoaW5kZXhQKQotICAgIHsKLSAgICAgIHAgPSBzdHJjaHIgKGluZGV4UCwgJyonKTsKLSAgICAgIGlmIChwID09IE5VTEwpCi0JewotCSAgLyogTm8gZXhwbGljaXQgc2NhbGUgLS0gdXNlIGRlZmF1bHQgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24KLQkgICAgIHR5cGUgYW5kIGFzc2VtYmxlciBtb2RlLiAgKi8KLQkgIGlmIChmbGFnX21yaSkKLQkgICAgc2NhbGUgPSAxOwotCSAgZWxzZQotCSAgICAvKiBHTlU5NjAgY29tcGF0aWJpbGl0eSAqLwotCSAgICBzY2FsZSA9IGRlZl9zY2FsZVtvcHR5cGUgLSBNRU0xXTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKnArKyA9ICdcMCc7CQkvKiBFbGltaW5hdGUgJyonICovCi0KLQkgIC8qIE5vdyBpbmRleFAtPmEgJ1wwJy10ZXJtaW5hdGVkIHJlZ2lzdGVyIG5hbWUsCi0JICAgICAqIGFuZCBwLT5hIHNjYWxlIGZhY3Rvci4KLQkgICAqLwotCi0JICBpZiAoIXN0cmNtcCAocCwgIjE2IikpCi0JICAgIHsKLQkgICAgICBzY2FsZSA9IDE2OwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjaHIgKCIxMjQ4IiwgKnApICYmIChwWzFdID09ICdcMCcpKQotCSAgICB7Ci0JICAgICAgc2NhbGUgPSAqcCAtICcwJzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2NhbGUgPSAtMTsKLQkgICAgfQotCX0KLQotICAgICAgcmVnbnVtID0gZ2V0X3JlZ251bSAoaW5kZXhQKTsJLyogR2V0IGluZGV4IHJlZy4gIyAqLwotICAgICAgaWYgKCFJU19SR19SRUcgKHJlZ251bSkpCi0JewotCSAgYXNfYmFkIChfKCJpbnZhbGlkIGluZGV4IHJlZ2lzdGVyIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogQ29udmVydCBzY2FsZSB0byBpdHMgYmluYXJ5IGVuY29kaW5nICovCi0gICAgICBzd2l0Y2ggKHNjYWxlKQotCXsKLQljYXNlIDE6Ci0JICBzY2FsZSA9IDAgPDwgNzsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIHNjYWxlID0gMSA8PCA3OwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgc2NhbGUgPSAyIDw8IDc7Ci0JICBicmVhazsKLQljYXNlIDg6Ci0JICBzY2FsZSA9IDMgPDwgNzsKLQkgIGJyZWFrOwotCWNhc2UgMTY6Ci0JICBzY2FsZSA9IDQgPDwgNzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19iYWQgKF8oImludmFsaWQgc2NhbGUgZmFjdG9yIikpOwotCSAgcmV0dXJuOwotCX07Ci0KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBzY2FsZSB8IHJlZ251bTsJLyogU2V0IGluZGV4IGJpdHMgaW4gb3Bjb2RlICovCi0gICAgICBtb2RlIHw9IElfQklUOwkJLyogRm91bmQgYSB2YWxpZCBpbmRleCBzcGVjICovCi0gICAgfQotCi0gIC8qIEFueSBhYmFzZSAoUmVnaXN0ZXIgSW5kaXJlY3QpIHNwZWNpZmljYXRpb24gcHJlc2VudD8gKi8KLSAgaWYgKChwID0gc3RycmNociAoYXJnUCwgJygnKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiAiKCIgaXMgdGhlcmUgLS0gZG9lcyBpdCBzdGFydCBhIGxlZ2FsIGFiYXNlIHNwZWM/ICBJZiBub3QsIGl0Ci0gICAgICAgICBjb3VsZCBiZSBwYXJ0IG9mIGEgZGlzcGxhY2VtZW50IGV4cHJlc3Npb24uICAqLwotICAgICAgaW50UCA9IChpbnQgKikgaGFzaF9maW5kIChhcmVnX2hhc2gsIHApOwotICAgICAgaWYgKGludFAgIT0gTlVMTCkKLQl7Ci0JICAvKiBHb3QgYW4gYWJhc2UgaGVyZSAqLwotCSAgcmVnbnVtID0gKmludFA7Ci0JICAqcCA9ICdcMCc7CQkvKiBkaXNjYXJkIHJlZ2lzdGVyIHNwZWMgKi8KLQkgIGlmIChyZWdudW0gPT0gSVBSRUwpCi0JICAgIHsKLQkgICAgICAvKiBXZSBoYXZlIHRvIHNwZWNpYWxjYXNlIGlwLXJlbCBtb2RlICovCi0JICAgICAgaXByZWxfZmxhZyA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1lbVAtPm9wY29kZSB8PSByZWdudW0gPDwgMTQ7Ci0JICAgICAgbW9kZSB8PSBBX0JJVDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQW55IGV4cHJlc3Npb24gcHJlc2VudD8gKi8KLSAgbWVtUC0+ZSA9IGFyZ1A7Ci0gIGlmICgqYXJnUCAhPSAnXDAnKQotICAgIHsKLSAgICAgIG1vZGUgfD0gRF9CSVQ7Ci0gICAgfQotCi0gIC8qIFNwZWNpYWwtY2FzZSBpcC1yZWxhdGl2ZSBhZGRyZXNzaW5nICovCi0gIGlmIChpcHJlbF9mbGFnKQotICAgIHsKLSAgICAgIGlmIChtb2RlICYgSV9CSVQpCi0JewotCSAgc3ludGF4ICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1QLT5vcGNvZGUgfD0gNSA8PCAxMDsJLyogSVAtcmVsYXRpdmUgbW9kZSAqLwotCSAgbWVtUC0+ZGlzcCA9IDMyOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIGFsbCBvdGhlciBtb2RlcyAqLwotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgRF9CSVQgfCBBX0JJVDoKLSAgICAgIC8qIEdvIHdpdGggTUVNQSBpbnN0cnVjdGlvbiBmb3JtYXQgZm9yIG5vdyAoZ3JvdyB0byBNRU1CIGxhdGVyCi0gICAgICAgICBpZiAxMiBiaXRzIGlzIG5vdCBlbm91Z2ggZm9yIHRoZSBkaXNwbGFjZW1lbnQpLiAgTUVNQSBmb3JtYXQKLSAgICAgICAgIGhhcyBhIHNpbmdsZSBtb2RlIGJpdDogc2V0IGl0IHRvIGluZGljYXRlIHRoYXQgYWJhc2UgaXMKLSAgICAgICAgIHByZXNlbnQuICAqLwotICAgICAgbWVtUC0+b3Bjb2RlIHw9IE1FTUFfQUJBU0U7Ci0gICAgICBtZW1QLT5kaXNwID0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRF9CSVQ6Ci0gICAgICAvKiBHbyB3aXRoIE1FTUEgaW5zdHJ1Y3Rpb24gZm9ybWF0IGZvciBub3cgKGdyb3cgdG8gTUVNQiBsYXRlcgotICAgICAgICAgaWYgMTIgYml0cyBpcyBub3QgZW5vdWdoIGZvciB0aGUgZGlzcGxhY2VtZW50KS4gICovCi0gICAgICBtZW1QLT5kaXNwID0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQV9CSVQ6Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBiaXQgc3RyaW5nIGZvciB0aGlzIG1vZGUgaXMgbm90Ci0gICAgICAgICBjb25zaXN0ZW50OiBpdCBzaG91bGQgYmUgMCAoZXhjbHVzaXZlIG9mIHRoZSBNRU1CIGJpdCksIHNvIHdlCi0gICAgICAgICBzZXQgaXQgImJ5IGhhbmQiIGhlcmUuICAqLwotICAgICAgbWVtUC0+b3Bjb2RlIHw9IE1FTUJfQklUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFfQklUIHwgSV9CSVQ6Ci0gICAgICAvKiBzZXQgTUVNQiBiaXQgaW4gbW9kZSwgYW5kIE9SIGluIG1vZGUgYml0cyAqLwotICAgICAgbWVtUC0+b3Bjb2RlIHw9IG1vZGUgfCBNRU1CX0JJVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJX0JJVDoKLSAgICAgIC8qIFRyZWF0IG1pc3NpbmcgZGlzcGxhY2VtZW50IGFzIGRpc3BsYWNlbWVudCBvZiAwLiAgKi8KLSAgICAgIG1vZGUgfD0gRF9CSVQ7Ci0gICAgICAvKiBGYWxsIGludG8gbmV4dCBjYXNlLiAgKi8KLSAgICBjYXNlIERfQklUIHwgQV9CSVQgfCBJX0JJVDoKLSAgICBjYXNlIERfQklUIHwgSV9CSVQ6Ci0gICAgICAvKiBzZXQgTUVNQiBiaXQgaW4gbW9kZSwgYW5kIE9SIGluIG1vZGUgYml0cyAqLwotICAgICAgbWVtUC0+b3Bjb2RlIHw9IG1vZGUgfCBNRU1CX0JJVDsKLSAgICAgIG1lbVAtPmRpc3AgPSAzMjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN5bnRheCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBwYXJzZV9wbzoJcGFyc2UgbWFjaGluZS1kZXBlbmRlbnQgcHNldWRvLW9wCi0KLSAgCVRoaXMgaXMgYSB0b3AtbGV2ZWwgcm91dGluZSBmb3IgbWFjaGluZS1kZXBlbmRlbnQgcHNldWRvLW9wcy4gIEl0IHNsdXJwcwotICAJdXAgdGhlIHJlc3Qgb2YgdGhlIGlucHV0IGxpbmUsIGJyZWFrcyBvdXQgdGhlIGluZGl2aWR1YWwgYXJndW1lbnRzLAotICAJYW5kIGRpc3BhdGNoZXMgdGhlbSB0byB0aGUgY29ycmVjdCBoYW5kbGVyLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotdm9pZAotcGFyc2VfcG8gKHBvX251bSkKLSAgICAgaW50IHBvX251bTsJCS8qIFBzZXVkby1vcCBudW1iZXI6ICBjdXJyZW50bHkgU19MRUFGUFJPQyBvciBTX1NZU1BST0MgKi8KLXsKLSAgLyogUG9pbnRlcnMgb3BlcmFuZHMsIHdpdGggbm8gZW1iZWRkZWQgd2hpdGVzcGFjZS4KLSAgICAgYXJnWzBdIHVudXNlZCwgYXJnWzEtM10tPm9wZXJhbmRzICovCi0gIGNoYXIgKmFyZ3NbNF07Ci0gIGludCBuX29wczsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgY2hhciAqcDsJCQkvKiBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB1bnBhcnNlZCBhcmd1bWVudCBzdHJpbmcgKi8KLSAgY2hhciBlb2w7CQkJLyogQ2hhcmFjdGVyIHRoYXQgaW5kaWNhdGVkIGVuZCBvZiBsaW5lICovCi0KLSAgZXh0ZXJuIGNoYXIgaXNfZW5kX29mX2xpbmVbXTsKLQotICAvKiBBZHZhbmNlIGlucHV0IHBvaW50ZXIgdG8gZW5kIG9mIGxpbmUuICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgZW9sID0gKmlucHV0X2xpbmVfcG9pbnRlcjsJLyogU2F2ZSBlbmQtb2YtbGluZSBjaGFyICovCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwkvKiBUZXJtaW5hdGUgYXJndW1lbnQgbGlzdCAqLwotCi0gIC8qIFBhcnNlIG91dCBvcGVyYW5kcyAqLwotICBuX29wcyA9IGdldF9hcmdzIChwLCBhcmdzKTsKLSAgaWYgKG5fb3BzID09IC0xKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRGlzcGF0Y2ggdG8gY29ycmVjdCBoYW5kbGVyICovCi0gIHN3aXRjaCAocG9fbnVtKQotICAgIHsKLSAgICBjYXNlIFNfU1lTUFJPQzoKLSAgICAgIHNfc3lzcHJvYyAobl9vcHMsIGFyZ3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTX0xFQUZQUk9DOgotICAgICAgc19sZWFmcHJvYyAobl9vcHMsIGFyZ3MpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChwb19udW0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlc3RvcmUgZW9sLCBzbyBsaW5lIG51bWJlcnMgZ2V0IHVwZGF0ZWQgY29ycmVjdGx5LiAgQmFzZQotICAgICBhc3NlbWJsZXIgYXNzdW1lcyB3ZSBsZWF2ZSBpbnB1dCBwb2ludGVyIHBvaW50aW5nIGF0IGNoYXIKLSAgICAgZm9sbG93aW5nIHRoZSBlb2wuICAqLwotICAqaW5wdXRfbGluZV9wb2ludGVyKysgPSBlb2w7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfcmVnb3A6IHBhcnNlIGEgcmVnaXN0ZXIgb3BlcmFuZC4KLQotICAJSW4gY2FzZSBvZiBpbGxlZ2FsIG9wZXJhbmQsIGlzc3VlIGEgbWVzc2FnZSBhbmQgcmV0dXJuIHNvbWUgdmFsaWQKLSAgCWluZm9ybWF0aW9uIHNvIGluc3RydWN0aW9uIHByb2Nlc3NpbmcgY2FuIGNvbnRpbnVlLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotdm9pZAotcGFyc2VfcmVnb3AgKHJlZ29wUCwgb3B0ZXh0LCBvcGRlc2MpCi0gICAgIHN0cnVjdCByZWdvcCAqcmVnb3BQOwkvKiBXaGVyZSB0byBwdXQgZGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLwotICAgICBjaGFyICpvcHRleHQ7CQkvKiBUZXh0IG9mIG9wZXJhbmQgKi8KLSAgICAgY2hhciBvcGRlc2M7CQkvKiBEZXNjcmlwdG9yIGJ5dGU6ICB3aGF0J3MgbGVnYWwgZm9yIHRoaXMgb3BlcmFuZCAqLwotewotICBpbnQgbjsJCQkvKiBSZWdpc3RlciBudW1iZXIgKi8KLSAgZXhwcmVzc2lvblMgZTsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCi0KLSAgLyogU2VlIGlmIG9wZXJhbmQgaXMgYSByZWdpc3RlciAqLwotICBuID0gZ2V0X3JlZ251bSAob3B0ZXh0KTsKLSAgaWYgKG4gPj0gMCkKLSAgICB7Ci0gICAgICBpZiAoSVNfUkdfUkVHIChuKSkKLQl7Ci0JICAvKiBnbG9iYWwgb3IgbG9jYWwgcmVnaXN0ZXIgKi8KLQkgIGlmICghUkVHX0FMSUdOIChvcGRlc2MsIG4pKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJ1bmFsaWduZWQgcmVnaXN0ZXIiKSk7Ci0JICAgIH0KLQkgIHJlZ29wUC0+biA9IG47Ci0JICByZWdvcFAtPm1vZGUgPSAwOwotCSAgcmVnb3BQLT5zcGVjaWFsID0gMDsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChJU19GUF9SRUcgKG4pICYmIEZQX09LIChvcGRlc2MpKQotCXsKLQkgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLCBhbmQgaXQncyBhbGxvd2VkICovCi0JICByZWdvcFAtPm4gPSBuIC0gRlAwOwotCSAgcmVnb3BQLT5tb2RlID0gMTsKLQkgIHJlZ29wUC0+c3BlY2lhbCA9IDA7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoSVNfU0ZfUkVHIChuKSAmJiBTRlJfT0sgKG9wZGVzYykpCi0JewotCSAgLyogU3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlciwgYW5kIGl0J3MgYWxsb3dlZCAqLwotCSAgcmVnb3BQLT5uID0gbiAtIFNGMDsKLQkgIHJlZ29wUC0+bW9kZSA9IDA7Ci0JICByZWdvcFAtPnNwZWNpYWwgPSAxOwotCSAgaWYgKCF0YXJnX2hhc19zZnIgKHJlZ29wUC0+bikpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIm5vIHN1Y2ggc2ZyIGluIHRoaXMgYXJjaGl0ZWN0dXJlIikpOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoTElUX09LIChvcGRlc2MpKQotICAgIHsKLSAgICAgIC8qIEhvdyBhYm91dCBhIGxpdGVyYWw/ICAqLwotICAgICAgcmVnb3BQLT5tb2RlID0gMTsKLSAgICAgIHJlZ29wUC0+c3BlY2lhbCA9IDA7Ci0gICAgICBpZiAoRlBfT0sgKG9wZGVzYykpCi0JewkJCS8qIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwgYWNjZXB0YWJsZSAqLwotCSAgLyogU2tpcCBvdmVyIDBmLCAwZCwgb3IgMGUgcHJlZml4ICovCi0JICBpZiAoKG9wdGV4dFswXSA9PSAnMCcpCi0JICAgICAgJiYgKG9wdGV4dFsxXSA+PSAnZCcpCi0JICAgICAgJiYgKG9wdGV4dFsxXSA8PSAnZicpKQotCSAgICB7Ci0JICAgICAgb3B0ZXh0ICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKCFzdHJjbXAgKG9wdGV4dCwgIjAuMCIpIHx8ICFzdHJjbXAgKG9wdGV4dCwgIjAiKSkKLQkgICAgewotCSAgICAgIHJlZ29wUC0+biA9IDB4MTA7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBpZiAoIXN0cmNtcCAob3B0ZXh0LCAiMS4wIikgfHwgIXN0cmNtcCAob3B0ZXh0LCAiMSIpKQotCSAgICB7Ci0JICAgICAgcmVnb3BQLT5uID0gMHgxNjsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCX0KLSAgICAgIGVsc2UKLQl7CQkJLyogZml4ZWQgcG9pbnQgbGl0ZXJhbCBhY2NlcHRhYmxlICovCi0JICBwYXJzZV9leHByIChvcHRleHQsICZlKTsKLQkgIGlmIChlLlhfb3AgIT0gT19jb25zdGFudAotCSAgICAgIHx8IChvZmZzIChlKSA8IDApIHx8IChvZmZzIChlKSA+IDMxKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiaWxsZWdhbCBsaXRlcmFsIikpOwotCSAgICAgIG9mZnMgKGUpID0gMDsKLQkgICAgfQotCSAgcmVnb3BQLT5uID0gb2ZmcyAoZSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBOb3RoaW5nIHdvcmtlZCAqLwotICBzeW50YXggKCk7Ci0gIHJlZ29wUC0+bW9kZSA9IDA7CQkvKiBSZWdpc3RlciByMCBpcyBhbHdheXMgYSBnb29kIG9uZSAqLwotICByZWdvcFAtPm4gPSAwOwotICByZWdvcFAtPnNwZWNpYWwgPSAwOwotfQkJCQkvKiBwYXJzZV9yZWdvcCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcmVnX2ZtdDoJZ2VuZXJhdGUgYSBSRUctZm9ybWF0IGluc3RydWN0aW9uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZAotcmVnX2ZtdCAoYXJncywgb1ApCi0gICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMF0tPm9wY29kZSBtbmVtb25pYywgYXJnc1sxLTNdLT5vcGVyYW5kcyAqLwotICAgICBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwkvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGluc3RydWN0aW9uICovCi17Ci0gIGxvbmcgaW5zdHI7CQkJLyogQmluYXJ5IHRvIGJlIG91dHB1dCAqLwotICBzdHJ1Y3QgcmVnb3AgcmVnb3A7CQkvKiBEZXNjcmlwdGlvbiBvZiByZWdpc3RlciBvcGVyYW5kICovCi0gIGludCBuX29wczsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLQotCi0gIGluc3RyID0gb1AtPm9wY29kZTsKLSAgbl9vcHMgPSBvUC0+bnVtX29wczsKLQotICBpZiAobl9vcHMgPj0gMSkKLSAgICB7Ci0gICAgICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdzWzFdLCBvUC0+b3BlcmFuZFswXSk7Ci0KLSAgICAgIGlmICgobl9vcHMgPT0gMSkgJiYgIShpbnN0ciAmIE0zKSkKLQl7Ci0JICAvKiAxLW9wZXJhbmQgaW5zdHJ1Y3Rpb24gaW4gd2hpY2ggdGhlIGRzdCBmaWVsZCBzaG91bGQKLQkgICAgICogYmUgdXNlZCAoaW5zdGVhZCBvZiBzcmMxKS4KLQkgICAqLwotCSAgcmVnb3AubiA8PD0gMTk7Ci0JICBpZiAocmVnb3Auc3BlY2lhbCkKLQkgICAgewotCSAgICAgIHJlZ29wLm1vZGUgPSByZWdvcC5zcGVjaWFsOwotCSAgICB9Ci0JICByZWdvcC5tb2RlIDw8PSAxMzsKLQkgIHJlZ29wLnNwZWNpYWwgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiByZWdvcC5uIGdvZXMgaW4gYml0IDAsIG5lZWRzIG5vIHNoaWZ0aW5nICovCi0JICByZWdvcC5tb2RlIDw8PSAxMTsKLQkgIHJlZ29wLnNwZWNpYWwgPDw9IDU7Ci0JfQotICAgICAgaW5zdHIgfD0gcmVnb3AubiB8IHJlZ29wLm1vZGUgfCByZWdvcC5zcGVjaWFsOwotICAgIH0KLQotICBpZiAobl9vcHMgPj0gMikKLSAgICB7Ci0gICAgICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdzWzJdLCBvUC0+b3BlcmFuZFsxXSk7Ci0KLSAgICAgIGlmICgobl9vcHMgPT0gMikgJiYgIShpbnN0ciAmIE0zKSkKLQl7Ci0JICAvKiAyLW9wZXJhbmQgaW5zdHJ1Y3Rpb24gaW4gd2hpY2ggdGhlIGRzdCBmaWVsZCBzaG91bGQKLQkgICAgICogYmUgdXNlZCBpbnN0ZWFkIG9mIHNyYzIpLgotCSAgICovCi0JICByZWdvcC5uIDw8PSAxOTsKLQkgIGlmIChyZWdvcC5zcGVjaWFsKQotCSAgICB7Ci0JICAgICAgcmVnb3AubW9kZSA9IHJlZ29wLnNwZWNpYWw7Ci0JICAgIH0KLQkgIHJlZ29wLm1vZGUgPDw9IDEzOwotCSAgcmVnb3Auc3BlY2lhbCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlZ29wLm4gPDw9IDE0OwotCSAgcmVnb3AubW9kZSA8PD0gMTI7Ci0JICByZWdvcC5zcGVjaWFsIDw8PSA2OwotCX0KLSAgICAgIGluc3RyIHw9IHJlZ29wLm4gfCByZWdvcC5tb2RlIHwgcmVnb3Auc3BlY2lhbDsKLSAgICB9Ci0gIGlmIChuX29wcyA9PSAzKQotICAgIHsKLSAgICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbM10sIG9QLT5vcGVyYW5kWzJdKTsKLSAgICAgIGlmIChyZWdvcC5zcGVjaWFsKQotCXsKLQkgIHJlZ29wLm1vZGUgPSByZWdvcC5zcGVjaWFsOwotCX0KLSAgICAgIGluc3RyIHw9IChyZWdvcC5uIDw8PSAxOSkgfCAocmVnb3AubW9kZSA8PD0gMTMpOwotICAgIH0KLSAgZW1pdCAoaW5zdHIpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcmVsYXhfY29icjoKLSAgCVJlcGxhY2UgY29iciBpbnN0cnVjdGlvbiBpbiBhIGNvZGUgZnJhZ21lbnQgd2l0aCBlcXVpdmFsZW50IGJyYW5jaCBhbmQKLSAgCWNvbXBhcmUgaW5zdHJ1Y3Rpb25zLCBzbyBpdCBjYW4gcmVhY2ggYmV5b25kIGEgMTMtYml0IGRpc3BsYWNlbWVudC4KLSAgCVNldCB1cCBhbiBhZGRyZXNzIGZpeC9yZWxvY2F0aW9uIGZvciB0aGUgbmV3IGJyYW5jaCBpbnN0cnVjdGlvbi4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogVGhpcyAiY29uZGl0aW9uYWwganVtcCIgdGFibGUgbWFwcyBjb2JyIGluc3RydWN0aW9ucyBpbnRvCi0gICBlcXVpdmFsZW50IGNvbXBhcmUgYW5kIGJyYW5jaCBvcGNvZGVzLiAgKi8KLXN0YXRpYyBjb25zdAotc3RydWN0Ci17Ci0gIGxvbmcgY29tcGFyZTsKLSAgbG9uZyBicmFuY2g7Ci19Ci0KLWNvaltdID0KLXsJCQkJLyogQ09CUiBPUENPREU6ICovCi0gIHsgQ0hLQklULCBCTk8gfSwJCS8qICAgICAgMHgzMCAtIGJiYyAqLwotICB7IENNUE8sIEJHIH0sCQkJLyogICAgICAweDMxIC0gY21wb2JnICovCi0gIHsgQ01QTywgQkUgfSwJCQkvKiAgICAgIDB4MzIgLSBjbXBvYmUgKi8KLSAgeyBDTVBPLCBCR0UgfSwJCS8qICAgICAgMHgzMyAtIGNtcG9iZ2UgKi8KLSAgeyBDTVBPLCBCTCB9LAkJCS8qICAgICAgMHgzNCAtIGNtcG9ibCAqLwotICB7IENNUE8sIEJORSB9LAkJLyogICAgICAweDM1IC0gY21wb2JuZSAqLwotICB7IENNUE8sIEJMRSB9LAkJLyogICAgICAweDM2IC0gY21wb2JsZSAqLwotICB7IENIS0JJVCwgQk8gfSwJCS8qICAgICAgMHgzNyAtIGJicyAqLwotICB7IENNUEksIEJOTyB9LAkJLyogICAgICAweDM4IC0gY21waWJubyAqLwotICB7IENNUEksIEJHIH0sCQkJLyogICAgICAweDM5IC0gY21waWJnICovCi0gIHsgQ01QSSwgQkUgfSwJCQkvKiAgICAgIDB4M2EgLSBjbXBpYmUgKi8KLSAgeyBDTVBJLCBCR0UgfSwJCS8qICAgICAgMHgzYiAtIGNtcGliZ2UgKi8KLSAgeyBDTVBJLCBCTCB9LAkJCS8qICAgICAgMHgzYyAtIGNtcGlibCAqLwotICB7IENNUEksIEJORSB9LAkJLyogICAgICAweDNkIC0gY21waWJuZSAqLwotICB7IENNUEksIEJMRSB9LAkJLyogICAgICAweDNlIC0gY21waWJsZSAqLwotICB7IENNUEksIEJPIH0sCQkJLyogICAgICAweDNmIC0gY21waWJvICovCi19OwotCi1zdGF0aWMKLXZvaWQKLXJlbGF4X2NvYnIgKGZyYWdQKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7CS8qIGZyYWdQLT5mcl9vcGNvZGUgaXMgYXNzdW1lZCB0byBwb2ludCB0bwotCQkJCSAqIHRoZSBjb2JyIGluc3RydWN0aW9uLCB3aGljaCBjb21lcyBhdCB0aGUKLQkJCQkgKiBlbmQgb2YgdGhlIGNvZGUgZnJhZ21lbnQuCi0JCQkJICovCi17Ci0gIGludCBvcGNvZGUsIHNyYzEsIHNyYzIsIG0xLCBzMjsKLSAgLyogQml0IGZpZWxkcyBmcm9tIGNvYnIgaW5zdHJ1Y3Rpb24gKi8KLSAgbG9uZyBicF9iaXRzOwkJCS8qIEJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgZnJvbSBjb2JyIGluc3RydWN0aW9uICovCi0gIGxvbmcgaW5zdHI7CQkJLyogQSBzaW5nbGUgaTk2MCBpbnN0cnVjdGlvbiAqLwotICAvKiAtPmluc3RydWN0aW9uIHRvIGJlIHJlcGxhY2VkICovCi0gIGNoYXIgKmlQOwotICBmaXhTICpmaXhQOwkJCS8qIFJlbG9jYXRpb24gdGhhdCBjYW4gYmUgZG9uZSBhdCBhc3NlbWJseSB0aW1lICovCi0KLSAgLyogUElDSyBVUCAmIFBBUlNFIENPQlIgSU5TVFJVQ1RJT04gKi8KLSAgaVAgPSBmcmFnUC0+ZnJfb3Bjb2RlOwotICBpbnN0ciA9IG1kX2NoYXJzX3RvX251bWJlciAoaVAsIDQpOwotICBvcGNvZGUgPSAoKGluc3RyID4+IDI0KSAmIDB4ZmYpIC0gMHgzMDsJLyogIi0weDMwIiBmb3IgdGFibGUgaW5kZXggKi8KLSAgc3JjMSA9IChpbnN0ciA+PiAxOSkgJiAweDFmOwotICBtMSA9IChpbnN0ciA+PiAxMykgJiAxOwotICBzMiA9IGluc3RyICYgMTsKLSAgc3JjMiA9IChpbnN0ciA+PiAxNCkgJiAweDFmOwotICBicF9iaXRzID0gaW5zdHIgJiBCUF9NQVNLOwotCi0gIC8qIEdFTkVSQVRFIEFORCBPVVRQVVQgQ09NUEFSRSBJTlNUUlVDVElPTiAqLwotICBpbnN0ciA9IGNvaltvcGNvZGVdLmNvbXBhcmUKLSAgICB8IHNyYzEgfCAobTEgPDwgMTEpIHwgKHMyIDw8IDYpIHwgKHNyYzIgPDwgMTQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKGlQLCBpbnN0ciwgNCk7Ci0KLSAgLyogT1VUUFVUIEJSQU5DSCBJTlNUUlVDVElPTiAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKGlQICsgNCwgY29qW29wY29kZV0uYnJhbmNoIHwgYnBfYml0cywgNCk7Ci0KLSAgLyogU0VUIFVQIEFERFJFU1MgRklYVVAvUkVMT0NBVElPTiAqLwotICBmaXhQID0gZml4X25ldyAoZnJhZ1AsCi0JCSAgaVAgKyA0IC0gZnJhZ1AtPmZyX2xpdGVyYWwsCi0JCSAgNCwKLQkJICBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgIGZyYWdQLT5mcl9vZmZzZXQsCi0JCSAgMSwKLQkJICBOT19SRUxPQyk7Ci0KLSAgZml4UC0+ZnhfYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgMjQ7CS8qIFN0b3JlIHNpemUgb2YgYml0IGZpZWxkICovCi0KLSAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICBmcmFnX3dhbmUgKGZyYWdQKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHJlbG9jX2NhbGxqOglSZWxvY2F0ZSBhICdjYWxsaicgaW5zdHJ1Y3Rpb24KLQotICAJVGhpcyBpcyBhICJub24tKEdOVSktc3RhbmRhcmQiIG1hY2hpbmUtZGVwZW5kZW50IGhvb2suICBUaGUgYmFzZQotICAJYXNzZW1ibGVyIGNhbGxzIGl0IHdoZW4gaXQgZGVjaWRlcyBpdCBjYW4gcmVsb2NhdGUgYW4gYWRkcmVzcyBhdAotICAJYXNzZW1ibHkgdGltZSBpbnN0ZWFkIG9mIGVtaXR0aW5nIGEgcmVsb2NhdGlvbiBkaXJlY3RpdmUuCi0KLSAgCUNoZWNrIHRvIHNlZSBpZiB0aGUgcmVsb2NhdGlvbiBpbnZvbHZlcyBhICdjYWxsaicgaW5zdHJ1Y3Rpb24gdG8gYToKLSAgCSAgICBzeXNwcm9jOglSZXBsYWNlIHRoZSBkZWZhdWx0ICdjYWxsJyBpbnN0cnVjdGlvbiB3aXRoIGEgJ2NhbGxzJwotICAJICAgIGxlYWZwcm9jOglSZXBsYWNlIHRoZSBkZWZhdWx0ICdjYWxsJyBpbnN0cnVjdGlvbiB3aXRoIGEgJ2JhbCcuCi0gIAkgICAgb3RoZXIgcHJvYzoJRG8gbm90aGluZy4KLQotICAJU2VlIGIub3V0LmggZm9yIGRldGFpbHMgb24gdGhlICduX290aGVyJyBmaWVsZCBpbiBhIHN5bWJvbCBzdHJ1Y3R1cmUuCi0KLSAgIElNUE9SVEFOVCE6Ci0gIAlBc3N1bWVzIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgZmlndXJlZCBvdXQsIGluIHRoZSBjYXNlIG9mIGEgbGVhZnByb2MsCi0gIAl0byB1c2UgdGhlICdiYWwnIGVudHJ5IHBvaW50LCBhbmQgaGFzIHN1YnN0aXR1dGVkIHRoYXQgc3ltYm9sIGludG8gdGhlCi0gIAlwYXNzZWQgZml4dXAgc3RydWN0dXJlLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotcmVsb2NfY2FsbGogKGZpeFApCi0gICAgIC8qIFJlbG9jYXRpb24gdGhhdCBjYW4gYmUgZG9uZSBhdCBhc3NlbWJseSB0aW1lICovCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIC8qIFBvaW50cyB0byB0aGUgYmluYXJ5IGZvciB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgcmVsb2NhdGVkLiAgKi8KLSAgY2hhciAqd2hlcmU7Ci0KLSAgaWYgKCFmaXhQLT5meF90Y2JpdCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHdhc24ndCBhIGNhbGxqIGluc3RydWN0aW9uIGluIHRoZSBmaXJzdCBwbGFjZSAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB3aGVyZSA9IGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKLQotICBpZiAoVENfU19JU19TWVNQUk9DIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogU3ltYm9sIGlzIGEgLnN5c3Byb2M6IHJlcGxhY2UgJ2NhbGwnIHdpdGggJ2NhbGxzJy4gIFN5c3RlbQotICAgICAgICAgcHJvY2VkdXJlIG51bWJlciBpcyAob3RoZXItMSkuICAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgQ0FMTFMgfCBUQ19TX0dFVF9TWVNQUk9DIChmaXhQLT5meF9hZGRzeSksIDQpOwotCi0gICAgICAvKiBOb3RoaW5nIGVsc2UgbmVlZHMgdG8gYmUgZG9uZSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gIE1ha2UKLSAgICAgICAgIHN1cmUgJ21kX251bWJlcl90b19maWVsZCgpJyB3aWxsIHBlcmZvcm0gYSBuby1vcC4gICovCi0gICAgICBmaXhQLT5meF9iaXRfZml4UCA9IChiaXRfZml4UyAqKSAxOwotCi0gICAgfQotICBlbHNlIGlmIChUQ19TX0lTX0NBTExOQU1FIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogU2hvdWxkIG5vdCBoYXBwZW46IHNlZSBibG9jayBjb21tZW50IGFib3ZlICovCi0gICAgICBhc19mYXRhbCAoXygiVHJ5aW5nIHRvICdiYWwnIHRvICVzIiksIFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KSk7Ci0gICAgfQotICBlbHNlIGlmIChUQ19TX0lTX0JBTE5BTUUgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBSZXBsYWNlICdjYWxsJyB3aXRoICdiYWwnOyBib3RoIGluc3RydWN0aW9ucyBoYXZlIHRoZSBzYW1lCi0gICAgICAgICBmb3JtYXQsIHNvIGNhbGxpbmcgY29kZSBzaG91bGQgY29tcGxldGUgcmVsb2NhdGlvbiBhcyBpZgotICAgICAgICAgbm90aGluZyBoYXBwZW5lZCBoZXJlLiAgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIEJBTCwgNCk7Ci0gICAgfQotICBlbHNlIGlmIChUQ19TX0lTX0JBRFBST0MgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkxvb2tzIGxpa2UgYSBwcm9jLCBidXQgY2FuJ3QgdGVsbCB3aGF0IGtpbmQuXG4iKSk7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gcHJvYyB0eXBlICovCi0KLSAgLyogZWxzZSBTeW1ib2wgaXMgbmVpdGhlciBhIHN5c3Byb2Mgbm9yIGEgbGVhZnByb2MgKi8KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHNfbGVhZnByb2M6CXByb2Nlc3MgLmxlYWZwcm9jIHBzZXVkby1vcAotCi0gIAkubGVhZnByb2MgdGFrZXMgdHdvIGFyZ3VtZW50cywgdGhlIHNlY29uZCBvbmUgaXMgb3B0aW9uYWw6Ci0gIAkJYXJnWzFdOiBuYW1lIG9mICdjYWxsJyBlbnRyeSBwb2ludCB0byBsZWFmIHByb2NlZHVyZQotICAJCWFyZ1syXTogbmFtZSBvZiAnYmFsJyBlbnRyeSBwb2ludCB0byBsZWFmIHByb2NlZHVyZQotCi0gIAlJZiB0aGUgdHdvIGFyZ3VtZW50cyBhcmUgaWRlbnRpY2FsLCBvciBpZiB0aGUgc2Vjb25kIG9uZSBpcyBtaXNzaW5nLAotICAJdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRha2VuIHRvIGJlIHRoZSAnYmFsJyBlbnRyeSBwb2ludC4KLQotICAJSWYgdGhlcmUgYXJlIDIgZGlzdGluY3QgYXJndW1lbnRzLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSAnYmFsJwotICAJZW50cnkgcG9pbnQgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgJ2NhbGwnIGVudHJ5IHBvaW50IGluIHRoZSBsaW5rZWQKLSAgCWxpc3Qgb2Ygc3ltYm9scy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1zX2xlYWZwcm9jIChuX29wcywgYXJncykKLSAgICAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotICAgICBjaGFyICphcmdzW107CQkvKiBhcmdzWzFdLT4xc3Qgb3BlcmFuZCwgYXJnc1syXS0+Mm5kIG9wZXJhbmQgKi8KLXsKLSAgc3ltYm9sUyAqY2FsbFA7CQkvKiBQb2ludGVyIHRvIGxlYWZwcm9jICdjYWxsJyBlbnRyeSBwb2ludCBzeW1ib2wgKi8KLSAgc3ltYm9sUyAqYmFsUDsJCS8qIFBvaW50ZXIgdG8gbGVhZnByb2MgJ2JhbCcgZW50cnkgcG9pbnQgc3ltYm9sICovCi0KLSAgaWYgKChuX29wcyAhPSAxKSAmJiAobl9vcHMgIT0gMikpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzaG91bGQgaGF2ZSAxIG9yIDIgb3BlcmFuZHMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBDaGVjayBudW1iZXIgb2YgYXJndW1lbnRzICovCi0KLSAgLyogRmluZCBvciBjcmVhdGUgc3ltYm9sIGZvciAnY2FsbCcgZW50cnkgcG9pbnQuICovCi0gIGNhbGxQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoYXJnc1sxXSk7Ci0KLSAgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKGNhbGxQKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJSZWRlZmluaW5nIGxlYWZwcm9jICVzIiksIFNfR0VUX05BTUUgKGNhbGxQKSk7Ci0gICAgfQkJCQkvKiBpcyBsZWFmcHJvYyAqLwotCi0gIC8qIElmIHRoYXQgd2FzIHRoZSBvbmx5IGFyZ3VtZW50LCB1c2UgaXQgYXMgdGhlICdiYWwnIGVudHJ5IHBvaW50LgotICAgICAqIE90aGVyd2lzZSwgbWFyayBpdCBhcyB0aGUgJ2NhbGwnIGVudHJ5IHBvaW50IGFuZCBmaW5kIG9yIGNyZWF0ZQotICAgICAqIGFub3RoZXIgc3ltYm9sIGZvciB0aGUgJ2JhbCcgZW50cnkgcG9pbnQuCi0gICAqLwotICBpZiAoKG5fb3BzID09IDEpIHx8ICFzdHJjbXAgKGFyZ3NbMV0sIGFyZ3NbMl0pKQotICAgIHsKLSAgICAgIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRSAoY2FsbFApOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgVENfU19GT1JDRV9UT19DQUxMTkFNRSAoY2FsbFApOwotCi0gICAgICBiYWxQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoYXJnc1syXSk7Ci0gICAgICBpZiAoVENfU19JU19DQUxMTkFNRSAoYmFsUCkpCi0JewotCSAgYXNfd2FybiAoXygiUmVkZWZpbmluZyBsZWFmcHJvYyAlcyIpLCBTX0dFVF9OQU1FIChiYWxQKSk7Ci0JfQotICAgICAgVENfU19GT1JDRV9UT19CQUxOQU1FIChiYWxQKTsKLQotI2lmbmRlZiBPQkpfRUxGCi0gICAgICB0Y19zZXRfYmFsX29mX2NhbGwgKGNhbGxQLCBiYWxQKTsKLSNlbmRpZgotICAgIH0JCQkJLyogaWYgb25seSBvbmUgYXJnLCBvciB0aGUgYXJncyBhcmUgdGhlIHNhbWUgKi8KLX0KLQotCi0vKgotICAgc19zeXNwcm9jOiBwcm9jZXNzIC5zeXNwcm9jIHBzZXVkby1vcAotCi0gICAgICAgIC5zeXNwcm9jIHRha2VzIHR3byBhcmd1bWVudHM6Ci0gICAgICAgICAgICAgICAgYXJnWzFdOiBuYW1lIG9mIGVudHJ5IHBvaW50IHRvIHN5c3RlbSBwcm9jZWR1cmUKLSAgICAgICAgICAgICAgICBhcmdbMl06ICdlbnRyeV9udW0nIChpbmRleCkgb2Ygc3lzdGVtIHByb2NlZHVyZSBpbiB0aGUgcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIFswLDMxXSBpbmNsdXNpdmUuCi0KLSAgICAgICAgRm9yIFthYl0ub3V0LCB3ZSBzdG9yZSB0aGUgJ2VudHJ5bnVtJyBpbiB0aGUgJ25fb3RoZXInIGZpZWxkIG9mCi0gICAgICAgIHRoZSBzeW1ib2wuICBTaW5jZSB0aGF0IGVudHJ5IGlzIG5vcm1hbGx5IDAsIHdlIGJpYXMgJ2VudHJ5bnVtJwotICAgICAgICBieSBhZGRpbmcgMSB0byBpdC4gIEl0IG11c3QgYmUgdW5iaWFzZWQgYmVmb3JlIGl0IGlzIHVzZWQuICAqLwotc3RhdGljIHZvaWQKLXNfc3lzcHJvYyAobl9vcHMsIGFyZ3MpCi0gICAgIGludCBuX29wczsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgICAgY2hhciAqYXJnc1tdOwkJLyogYXJnc1sxXS0+MXN0IG9wZXJhbmQsIGFyZ3NbMl0tPjJuZCBvcGVyYW5kICovCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgc3ltYm9sUyAqc3ltUDsKLQotICBpZiAobl9vcHMgIT0gMikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInNob3VsZCBoYXZlIHR3byBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGJhZCBhcmcgY291bnQgKi8KLQotICAvKiBQYXJzZSAiZW50cnlfbnVtIiBhcmd1bWVudCBhbmQgY2hlY2sgaXQgZm9yIHZhbGlkaXR5LiAqLwotICBwYXJzZV9leHByIChhcmdzWzJdLCAmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IChvZmZzIChleHApIDwgMCkKLSAgICAgIHx8IChvZmZzIChleHApID4gMzEpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiJ2VudHJ5X251bScgbXVzdCBiZSBhYnNvbHV0ZSBudW1iZXIgaW4gWzAsMzFdIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBGaW5kL21ha2Ugc3ltYm9sIGFuZCBzdGljayBlbnRyeSBudW1iZXIgKGJpYXNlZCBieSArMSkgaW50byBpdCAqLwotICBzeW1QID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoYXJnc1sxXSk7Ci0KLSAgaWYgKFRDX1NfSVNfU1lTUFJPQyAoc3ltUCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiUmVkZWZpbmluZyBlbnRyeW51bSBmb3Igc3lzcHJvYyAlcyIpLCBTX0dFVF9OQU1FIChzeW1QKSk7Ci0gICAgfQkJCQkvKiByZWRlZmluaW5nICovCi0KLSAgVENfU19TRVRfU1lTUFJPQyAoc3ltUCwgb2ZmcyAoZXhwKSk7CS8qIGVuY29kZSBlbnRyeSBudW1iZXIgKi8KLSAgVENfU19GT1JDRV9UT19TWVNQUk9DIChzeW1QKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHNoaWZ0X29rOgotICAJRGV0ZXJtaW5lIGlmIGEgInNobG8iIGluc3RydWN0aW9uIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhICJsZGNvbnN0Ii4KLSAgCVRoaXMgbWVhbnMgdGhhdCBzb21lIG51bWJlciBYIDwgMzIgY2FuIGJlIHNoaWZ0ZWQgbGVmdCB0byBwcm9kdWNlIHRoZQotICAJY29uc3RhbnQgb2YgaW50ZXJlc3QuCi0KLSAgCVJldHVybiB0aGUgc2hpZnQgY291bnQsIG9yIDAgaWYgd2UgY2FuJ3QgZG8gaXQuCi0gIAlDYWxsZXIgY2FsY3VsYXRlcyBYIGJ5IHNoaWZ0aW5nIG9yaWdpbmFsIGNvbnN0YW50IHJpZ2h0ICdzaGlmdCcgcGxhY2VzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi1pbnQKLXNoaWZ0X29rIChuKQotICAgICBpbnQgbjsJCQkvKiBUaGUgY29uc3RhbnQgb2YgaW50ZXJlc3QgKi8KLXsKLSAgaW50IHNoaWZ0OwkJCS8qIFRoZSBzaGlmdCBjb3VudCAqLwotCi0gIGlmIChuIDw9IDApCi0gICAgewotICAgICAgLyogQ2FuJ3QgZG8gaXQgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBTaGlmdCAnbicgcmlnaHQgdW50aWwgYSAxIGlzIGFib3V0IHRvIGJlIGxvc3QgKi8KLSAgZm9yIChzaGlmdCA9IDA7IChuICYgMSkgPT0gMDsgc2hpZnQrKykKLSAgICB7Ci0gICAgICBuID4+PSAxOwotICAgIH0KLQotICBpZiAobiA+PSAzMikKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBzaGlmdDsKLX0KLQotCi0vKiBzeW50YXg6IGlzc3VlIHN5bnRheCBlcnJvciAqLwotCi1zdGF0aWMgdm9pZAotc3ludGF4ICgpCi17Ci0gIGFzX2JhZCAoXygic3ludGF4IGVycm9yIikpOwotfQkJCQkvKiBzeW50YXgoKSAqLwotCi0KLS8qIHRhcmdfaGFzX3NmcjoKLQotICAgUmV0dXJuIFRSVUUgaWZmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgIHNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXIgKHNmcikuICAqLwotCi1zdGF0aWMKLWludAotdGFyZ19oYXNfc2ZyIChuKQotICAgICBpbnQgbjsJCQkvKiBOdW1iZXIgKDAtMzEpIG9mIHNmciAqLwotewotICBzd2l0Y2ggKGFyY2hpdGVjdHVyZSkKLSAgICB7Ci0gICAgY2FzZSBBUkNIX0tBOgotICAgIGNhc2UgQVJDSF9LQjoKLSAgICBjYXNlIEFSQ0hfTUM6Ci0gICAgY2FzZSBBUkNIX0pYOgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBBUkNIX0hYOgotICAgICAgcmV0dXJuICgoMCA8PSBuKSAmJiAobiA8PSA0KSk7Ci0gICAgY2FzZSBBUkNIX0NBOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKCgwIDw9IG4pICYmIChuIDw9IDIpKTsKLSAgICB9Ci19Ci0KLQotLyogdGFyZ19oYXNfaWNsYXNzOgotCi0gICBSZXR1cm4gVFJVRSBpZmYgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgdGhlIGluZGljYXRlZAotICAgY2xhc3Mgb2YgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0YXRpYwotaW50Ci10YXJnX2hhc19pY2xhc3MgKGljKQotICAgICAvKiBJbnN0cnVjdGlvbiBjbGFzczsgIG9uZSBvZjoKLSAgICAgICAgSV9CQVNFLCBJX0NYLCBJX0RFQywgSV9LWCwgSV9GUCwgSV9NSUwsIElfQ0FTSU0sIElfQ1gyLCBJX0hYLCBJX0hYMgotICAgICAgKi8KLSAgICAgaW50IGljOwotewotICBpY2xhc3Nlc19zZWVuIHw9IGljOwotICBzd2l0Y2ggKGFyY2hpdGVjdHVyZSkKLSAgICB7Ci0gICAgY2FzZSBBUkNIX0tBOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfS1gpOwotICAgIGNhc2UgQVJDSF9LQjoKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0tYIHwgSV9GUCB8IElfREVDKTsKLSAgICBjYXNlIEFSQ0hfTUM6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9LWCB8IElfRlAgfCBJX0RFQyB8IElfTUlMKTsKLSAgICBjYXNlIEFSQ0hfQ0E6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9DWCB8IElfQ1gyIHwgSV9DQVNJTSk7Ci0gICAgY2FzZSBBUkNIX0pYOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfQ1gyIHwgSV9KWCk7Ci0gICAgY2FzZSBBUkNIX0hYOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfQ1gyIHwgSV9KWCB8IElfSFgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoKGljbGFzc2VzX3NlZW4gJiAoSV9LWCB8IElfRlAgfCBJX0RFQyB8IElfTUlMKSkKLQkgICYmIChpY2xhc3Nlc19zZWVuICYgKElfQ1ggfCBJX0NYMikpKQotCXsKLQkgIGFzX3dhcm4gKF8oImFyY2hpdGVjdHVyZSBvZiBvcGNvZGUgY29uZmxpY3RzIHdpdGggdGhhdCBvZiBlYXJsaWVyIGluc3RydWN0aW9uKHMpIikpOwotCSAgaWNsYXNzZXNfc2VlbiAmPSB+aWM7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSAuZW5kaWFuIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2VuZGlhbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImxpdHRsZSIpID09IDApCi0gICAgOwotICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiYmlnIikgPT0gMCkKLSAgICBhc19iYWQgKF8oImJpZyBlbmRpYW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIikpOwotICBlbHNlCi0gICAgYXNfd2FybiAoXygiaWdub3JpbmcgdW5yZWNvZ25pemVkIC5lbmRpYW4gdHlwZSBgJXMnIiksIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIGk5NjAsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uLAotICAgd2hpY2ggd2UgaGF2ZSBzZXQgdXAgYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpeHVwIHRvby4gKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotI2Vsc2UKLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLSNlbmRpZgotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgbG9uZyB2YWwgPSAqdmFscDsKLSNlbmRpZgotICBjaGFyICpwbGFjZSA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBpZiAoIWZpeFAtPmZ4X2JpdF9maXhQKQotICAgIHsKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICAgICAgLyogRm9yIGNhbGx4LCB3ZSBhbHdheXMgd2FudCB0byB3cml0ZSBvdXQgemVybywgYW5kIGVtaXQgYQotCSBzeW1ib2xpYyByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9ic3IpCi0JdmFsID0gMDsKLQotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwotI2VuZGlmCi0KLSAgICAgIG1kX251bWJlcl90b19pbW0gKHBsYWNlLCB2YWwsIGZpeFAtPmZ4X3NpemUsIGZpeFApOwotICAgIH0KLSAgZWxzZQotICAgIG1kX251bWJlcl90b19maWVsZCAocGxhY2UsIHZhbCwgZml4UC0+ZnhfYml0X2ZpeFApOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKQotdm9pZAotdGNfYm91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvIHJpOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG1lbXNldCAoKGNoYXIgKikgJnJpLCAnXDAnLCBzaXplb2YgKHJpKSk7Ci0gIHN5bWJvbFAgPSBmaXhQLT5meF9hZGRzeTsKLSAga25vdyAoc3ltYm9sUCAhPSAwIHx8IGZpeFAtPmZ4X3JfdHlwZSAhPSBOT19SRUxPQyk7Ci0gIHJpLnJfYnNyID0gZml4UC0+ZnhfYnNyOwkvKlNBQyBMRCBSRUxBWCBIQUNLICovCi0gIC8qIFRoZXNlIHR3byAnY3V6IG9mIE5TMzJLICovCi0gIHJpLnJfY2FsbGogPSBmaXhQLT5meF90Y2JpdDsKLSAgaWYgKGZpeFAtPmZ4X2JpdF9maXhQKQotICAgIHJpLnJfbGVuZ3RoID0gMjsKLSAgZWxzZQotICAgIHJpLnJfbGVuZ3RoID0gbmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdOwotICByaS5yX3BjcmVsID0gZml4UC0+ZnhfcGNyZWw7Ci0gIHJpLnJfYWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgIT0gTk9fUkVMT0MpCi0gICAgewotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWNhc2UgcnNfYWxpZ246Ci0JICByaS5yX2luZGV4ID0gLTI7Ci0JICByaS5yX3BjcmVsID0gMTsKLQkgIHJpLnJfbGVuZ3RoID0gZml4UC0+Znhfc2l6ZSAtIDE7Ci0JICBicmVhazsKLQljYXNlIHJzX29yZzoKLQkgIHJpLnJfaW5kZXggPSAtMjsKLQkgIHJpLnJfcGNyZWwgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSByc19maWxsOgotCSAgcmkucl9pbmRleCA9IC0xOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIHJpLnJfZXh0ZXJuID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGxpbmtyZWxheCB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBmaXhQLT5meF9ic3IpCi0gICAgewotICAgICAgcmkucl9leHRlcm4gPSAxOwotICAgICAgcmkucl9pbmRleCA9IHN5bWJvbFAtPnN5X251bWJlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByaS5yX2V4dGVybiA9IDA7Ci0gICAgICByaS5yX2luZGV4ID0gU19HRVRfVFlQRSAoc3ltYm9sUCk7Ci0gICAgfQotCi0gIC8qIE91dHB1dCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiBtYWNoaW5lLWRlcGVuZGVudCBmb3JtLiAqLwotICBtZF9yaV90b19jaGFycyAod2hlcmUsICZyaSk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0jaWYgZGVmaW5lZCAoT0JKX0NPRkYpICYmIGRlZmluZWQgKEJGRCkKLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2JzcikKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9zaXplID09IDQpCi0gICAgcmV0dXJuIFJfUkVMTE9ORzsKLQotICBpZiAoZml4UC0+ZnhfcGNyZWwgIT0gMCAmJiBmaXhQLT5meF9zaXplID09IDQpCi0gICAgcmV0dXJuIFJfSVBSTUVEOwotCi0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaWYgKGZyYWctPmZyX25leHQpCi0gICAgcmV0dXJuIGZyYWctPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnLT5mcl9hZGRyZXNzOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogQWxpZ24gYW4gYWRkcmVzcyBieSByb3VuZGluZyBpdCB1cCB0byB0aGUgc3BlY2lmaWVkIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBzZWdUIHNlZzsKLSAgICAgdmFsdWVUIGFkZHI7CQkvKiBBZGRyZXNzIHRvIGJlIHJvdW5kZWQgdXAgKi8KLXsKLSAgaW50IGFsaWduOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0jZWxzZQotICBhbGlnbiA9IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ107Ci0jZW5kaWYKLSAgcmV0dXJuIChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pOwotfQotCi1leHRlcm4gaW50IGNvZmZfZmxhZ3M7Ci0KLSNpZmRlZiBPQkpfQ09GRgotdm9pZAotdGNfaGVhZGVyc19ob29rIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3dpdGNoIChhcmNoaXRlY3R1cmUpCi0gICAgewotICAgIGNhc2UgQVJDSF9LQToKLSAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwS0E7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVJDSF9LQjoKLSAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwS0I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVJDSF9NQzoKLSAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwTUM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVJDSF9DQToKLSAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwQ0E7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVJDSF9KWDoKLSAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwSlg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVJDSF9IWDoKLSAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwSFg7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoaWNsYXNzZXNfc2VlbiA9PSBJX0JBU0UpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBDT1JFOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfQ1gpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBDQTsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0hYKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwSFg7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9KWCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MEpYOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfQ1gyKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwQ0E7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9NSUwpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBNQzsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiAoSV9ERUMgfCBJX0ZQKSkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MEtCOwotICAgICAgZWxzZQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwS0E7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGhlYWRlcnMtPmZpbGVoZHIuZl9tYWdpYyA9IEk5NjBSV01BR0lDOwotICAgICAgaGVhZGVycy0+YW91dGhkci5tYWdpYyA9IE9NQUdJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZWFkZXJzLT5maWxlaGRyLmZfbWFnaWMgPSBJOTYwUk9NQUdJQzsKLSAgICAgIGhlYWRlcnMtPmFvdXRoZHIubWFnaWMgPSBOTUFHSUM7Ci0gICAgfQkJCQkvKiBzZXQgbWFnaWMgbnVtYmVycyAqLwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFRoaW5ncyBnb2luZyBvbiBoZXJlOgotCi0gICBGb3IgYm91dCwgV2UgbmVlZCB0byBhc3N1cmUgYSBjb3VwbGUgb2Ygc2ltcGxpZnlpbmcKLSAgIGFzc3VtcHRpb25zIGFib3V0IGxlYWZwcm9jcyBmb3IgdGhlIGxpbmtlcjogdGhlIGxlYWZwcm9jCi0gICBlbnRyeSBzeW1ib2xzIHdpbGwgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBhc3NlbWJseSBpbgotICAgd2hpY2ggdGhleSdyZSBkZWNsYXJlZCB3aXRoIHRoZSAnLmxlYWZwcm9jJyBkaXJlY3RpdmU7Ci0gICBhbmQgaWYgYSBsZWFmcHJvYyBoYXMgYm90aCAnY2FsbCcgYW5kICdiYWwnIGVudHJ5IHBvaW50cwotICAgdGhleSBhcmUgYm90aCBnbG9iYWwgb3IgYm90aCBsb2NhbC4KLQotICAgRm9yIGNvZmYsIHRoZSBjYWxsIHN5bWJvbCBoYXMgYSBzZWNvbmQgYXV4IGVudHJ5IHRoYXQKLSAgIGNvbnRhaW5zIHRoZSBiYWwgZW50cnkgcG9pbnQuICBUaGUgYmFsIHN5bWJvbCBiZWNvbWVzIGEKLSAgIGxhYmVsLgotCi0gICBGb3IgY29mZiByZXByZXNlbnRhdGlvbiwgdGhlIGNhbGwgc3ltYm9sIGhhcyBhIHNlY29uZCBhdXggZW50cnkgdGhhdAotICAgY29udGFpbnMgdGhlIGJhbCBlbnRyeSBwb2ludC4gIFRoZSBiYWwgc3ltYm9sIGJlY29tZXMgYSBsYWJlbC4gICovCi0KLXZvaWQKLXRjX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSNpZmRlZiBPQkpfQ09GRgotICAgICAgaWYgKFRDX1NfSVNfU1lTUFJPQyAoc3ltYm9sUCkpCi0JewotCSAgLyogc2Vjb25kIGF1eCBlbnRyeSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBzeXNwcm9jIG51bWJlciAqLwotCSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMik7Ci0JICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1NDQUxMKTsKLQkgIFNfU0VUX0RBVEFfVFlQRSAoc3ltYm9sUCwgU19HRVRfREFUQV9UWVBFIChzeW1ib2xQKSB8IChEVF9GQ04gPDwgTl9CVFNIRlQpKTsKLQkgIGNvbnRpbnVlOwotCX0JCQkvKiByZXdyaXRlIHN5c3Byb2MgKi8KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0gICAgICBpZiAoIVRDX1NfSVNfQkFMTkFNRSAoc3ltYm9sUCkgJiYgIVRDX1NfSVNfQ0FMTE5BTUUgKHN5bWJvbFApKQotCXsKLQkgIGNvbnRpbnVlOwotCX0JCQkvKiBOb3QgYSBsZWFmcHJvYyBzeW1ib2wgKi8KLQotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCXsKLQkgIGFzX2JhZCAoXygibGVhZnByb2Mgc3ltYm9sICclcycgdW5kZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQl9CQkJLyogdW5kZWZpbmVkIGxlYWYgKi8KLQotICAgICAgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKHN5bWJvbFApKQotCXsKLQkgIHN5bWJvbFMgKmJhbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKHN5bWJvbFApOwotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bWJvbFApICE9IFNfSVNfRVhURVJOQUwgKGJhbFApKQotCSAgICB7Ci0JICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgICAgIFNfU0VUX0VYVEVSTkFMIChiYWxQKTsKLQkgICAgICBhc193YXJuIChfKCJXYXJuaW5nOiBtYWtpbmcgbGVhZnByb2MgZW50cmllcyAlcyBhbmQgJXMgYm90aCBnbG9iYWxcbiIpLAotCQkgICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIFNfR0VUX05BTUUgKGJhbFApKTsKLQkgICAgfQkJCS8qIGV4dGVybmFsaXR5IG1pc21hdGNoICovCi0JfQkJCS8qIGlmIGNhbGxuYW1lICovCi0gICAgfQkJCQkvKiB3YWxrIHRoZSBzeW1ib2wgY2hhaW4gKi8KLX0KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBGb3IgYW91dCBvciBib3V0LCB0aGUgYmFsIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGNhbGwuCi0KLSAgIEZvciBjb2ZmLCB3ZSBjaGVhdCBhbmQgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBiYWwgc3ltYm9sIGluIHRoZQotICAgc2Vjb25kIGF1eCBlbnRyeSBvZiB0aGUgY2FsbC4gICovCi0KLSN1bmRlZiBPQkpfQUJPVVQKLSNpZmRlZiBPQkpfQU9VVAotI2RlZmluZSBPQkpfQUJPVVQKLSNlbmRpZgotI2lmZGVmIE9CSl9CT1VUCi0jZGVmaW5lIE9CSl9BQk9VVAotI2VuZGlmCi0KLXZvaWQKLXRjX3NldF9iYWxfb2ZfY2FsbCAoY2FsbFAsIGJhbFApCi0gICAgIHN5bWJvbFMgKmNhbGxQOwotICAgICBzeW1ib2xTICpiYWxQOwotewotICBrbm93IChUQ19TX0lTX0NBTExOQU1FIChjYWxsUCkpOwotICBrbm93IChUQ19TX0lTX0JBTE5BTUUgKGJhbFApKTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0KLSAgY2FsbFAtPnN5X3RjID0gYmFsUDsKLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoY2FsbFAsIDIpOwotCi0jZWxzZSAvKiAhIE9CSl9DT0ZGICovCi0jaWZkZWYgT0JKX0FCT1VUCi0KLSAgLyogSWYgdGhlICdiYWwnIGVudHJ5IGRvZXNuJ3QgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSAnY2FsbCcKLSAgICAgKiBzeW1ib2wsIHVubGluayBpdCBmcm9tIHRoZSBzeW1ib2wgbGlzdCBhbmQgcmUtaW5zZXJ0IGl0LgotICAgKi8KLSAgaWYgKHN5bWJvbF9uZXh0IChjYWxsUCkgIT0gYmFsUCkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChiYWxQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKGJhbFAsIGNhbGxQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbiBvcmRlciAqLwotCi0jZWxzZSAvKiAhIE9CSl9BQk9VVCAqLwotICBhc19mYXRhbCAoIk9ubHkgc3VwcG9ydGVkIGZvciBhLm91dCwgYi5vdXQsIG9yIENPRkYiKTsKLSNlbmRpZiAvKiAhIE9CSl9BQk9VVCAqLwotI2VuZGlmIC8qICEgT0JKX0NPRkYgKi8KLX0KLQotc3ltYm9sUyAqCi10Y19nZXRfYmFsX29mX2NhbGwgKGNhbGxQKQotICAgICBzeW1ib2xTICpjYWxsUDsKLXsKLSAgc3ltYm9sUyAqcmV0dmFsOwotCi0gIGtub3cgKFRDX1NfSVNfQ0FMTE5BTUUgKGNhbGxQKSk7Ci0KLSNpZmRlZiBPQkpfQ09GRgotICByZXR2YWwgPSBjYWxsUC0+c3lfdGM7Ci0jZWxzZQotI2lmZGVmIE9CSl9BQk9VVAotICByZXR2YWwgPSBzeW1ib2xfbmV4dCAoY2FsbFApOwotI2Vsc2UKLSAgYXNfZmF0YWwgKCJPbmx5IHN1cHBvcnRlZCBmb3IgYS5vdXQsIGIub3V0LCBvciBDT0ZGIik7Ci0jZW5kaWYgLyogISBPQkpfQUJPVVQgKi8KLSNlbmRpZiAvKiAhIE9CSl9DT0ZGICovCi0KLSAga25vdyAoVENfU19JU19CQUxOQU1FIChyZXR2YWwpKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0JCQkJLyogX3RjX2dldF9iYWxfb2ZfY2FsbCgpICovCi0KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKHN5bWJvbFApKQotICAgIHsKLSNpZmRlZiBPQkpfQ09GRgotICAgICAgc3ltYm9sUyAqYmFsUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoc3ltYm9sUCk7Ci0KLSNpZiAwCi0gICAgICAvKiBzZWNvbmQgYXV4IGVudHJ5IGNvbnRhaW5zIHRoZSBiYWwgZW50cnkgcG9pbnQgKi8KLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDIpOwotI2VuZGlmCi0gICAgICBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFsxXS54X2JhbC54X2JhbG50cnkgPSBTX0dFVF9WQUxVRSAoYmFsUCk7Ci0gICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FWFQpCi0JU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19MRUFGRVhUKTsKLSAgICAgIGVsc2UKLQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0xFQUZTVEFUKTsKLSAgICAgIFNfU0VUX0RBVEFfVFlQRSAoc3ltYm9sUCwgU19HRVRfREFUQV9UWVBFIChzeW1ib2xQKSB8IChEVF9GQ04gPDwgTl9CVFNIRlQpKTsKLSAgICAgIC8qIGZpeCB1cCB0aGUgYmFsIHN5bWJvbCAqLwotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoYmFsUCwgQ19MQUJFTCk7Ci0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLSAgICB9CQkJCS8qIG9ubHkgb24gY2FsbHMgKi8KLX0KLQotdm9pZAotaTk2MF9oYW5kbGVfYWxpZ24gKGZyYWdwKQotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGlmICghbGlua3JlbGF4KQotICAgIHJldHVybjsKLQotI2lmbmRlZiBPQkpfQk9VVAotCi0gIGFzX2JhZCAoXygib3B0aW9uIC0tbGluay1yZWxheCBpcyBvbmx5IHN1cHBvcnRlZCBpbiBiLm91dCBmb3JtYXQiKSk7Ci0gIGxpbmtyZWxheCA9IDA7Ci0gIHJldHVybjsKLQotI2Vsc2UKLQotICAvKiBUaGUgdGV4dCBzZWN0aW9uICJlbmRzIiB3aXRoIGFub3RoZXIgYWxpZ25tZW50IHJlbG9jLCB0byB3aGljaCB3ZQotICAgICBhcmVuJ3QgYWRkaW5nIHBhZGRpbmcuICAqLwotICBpZiAoZnJhZ3AtPmZyX25leHQgPT0gdGV4dF9sYXN0X2ZyYWcKLSAgICAgIHx8IGZyYWdwLT5mcl9uZXh0ID09IGRhdGFfbGFzdF9mcmFnKQotICAgIHJldHVybjsKLQotICAvKiBhbGlnbm1lbnQgZGlyZWN0aXZlICovCi0gIGZpeF9uZXcgKGZyYWdwLCBmcmFncC0+ZnJfZml4LCBmcmFncC0+ZnJfb2Zmc2V0LCAwLCAwLCAwLAotCSAgIChpbnQpIGZyYWdwLT5mcl90eXBlKTsKLSNlbmRpZiAvKiBPQkpfQk9VVCAqLwotfQotCi1pbnQKLWk5NjBfdmFsaWRhdGVfZml4IChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSwgYWRkX3N5bWJvbFBQKQotICAgICBmaXhTICpmaXhQOwotICAgICBzZWdUIHRoaXNfc2VnbWVudF90eXBlOwotICAgICBzeW1ib2xTICoqYWRkX3N5bWJvbFBQOwotewotI2RlZmluZSBhZGRfc3ltYm9sUCAoKmFkZF9zeW1ib2xQUCkKLSAgaWYgKGZpeFAtPmZ4X3RjYml0ICYmIFRDX1NfSVNfQ0FMTE5BTUUgKGFkZF9zeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBSZWxvY2F0aW9uIHNob3VsZCBiZSBkb25lIHZpYSB0aGUgYXNzb2NpYXRlZCAnYmFsJwotICAgICAgICAgZW50cnkgcG9pbnQgc3ltYm9sLiAqLwotCi0gICAgICBpZiAoIVRDX1NfSVNfQkFMTkFNRSAodGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCkpKQotCXsKLQkgIGFzX2JhZCAoXygiTm8gJ2JhbCcgZW50cnkgcG9pbnQgZm9yIGxlYWZwcm9jICVzIiksCi0JCSAgU19HRVRfTkFNRSAoYWRkX3N5bWJvbFApKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKTsKLSAgICB9Ci0jaWYgMAotICAvKiBTdGlsbCBoYXZlIHRvIHdvcmsgb3V0IG90aGVyIGNvbmRpdGlvbnMgZm9yIHRoZXNlIHRlc3RzLiAgKi8KLSAgewotICAgIGlmIChmaXhQLT5meF90Y2JpdCkKLSAgICAgIHsKLQlhc19iYWQgKF8oImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMiKSk7Ci0JcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgcmVsb2NfY2FsbGogKGZpeFApOwotICAgIGlmICgoaW50KSBmaXhQLT5meF9iaXRfZml4UCA9PSAxMykKLSAgICAgIHsKLQkvKiBUaGlzIGlzIGEgQ09CUiBpbnN0cnVjdGlvbi4gIFRoZXkgaGF2ZSBvbmx5IGEgMTMtYml0Ci0JICAgZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkIGZvciBsb2NhbCBicmFuY2hlczoKLQkgICBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZSByZWxvY2F0aW9uLiAgKi8KLQlhc19iYWQgKF8oImNhbid0IHVzZSBDT0JSIGZvcm1hdCB3aXRoIGV4dGVybmFsIGxhYmVsIikpOwotCWZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsJLyogTm8gcmVsb2NhdGlvbnMgcGxlYXNlLiAqLwotCXJldHVybiAxOwotICAgICAgfQotICB9Ci0jZW5kaWYKLSN1bmRlZiBhZGRfc3ltYm9sUAotICByZXR1cm4gMDsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogRnJvbSBjZ2VuLmM6ICAqLwotCi1zdGF0aWMgc2hvcnQKLXRjX2JmZF9maXgycnR5cGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0jaWYgMAotICBpZiAoZml4UC0+ZnhfYnNyKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBCRkRfUkVMT0NfMzI7Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsICE9IDAgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBCRkRfUkVMT0NfMjRfUENSRUw7Ci0KLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4KLQotICAgRklYTUU6IFRvIHdoYXQgZXh0ZW50IGNhbiB3ZSBnZXQgYWxsIHJlbGV2YW50IHRhcmdldHMgdG8gdXNlIHRoaXM/ICAqLwotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4UCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGFyZWxlbnQgKiByZWxvYzsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIC8qIEhBQ0s6IElzIHRoaXMgcmlnaHQ/ICovCi0gIGZpeFAtPmZ4X3JfdHlwZSA9IHRjX2JmZF9maXgycnR5cGUgKGZpeFApOwotCi0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhQLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiLAotCQkgICAgZml4UC0+Znhfcl90eXBlLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeFAtPmZ4X3JfdHlwZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFzc2VydCAoIWZpeFAtPmZ4X3BjcmVsID09ICFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICByZWxvYy0+YWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KLQotLyogZW5kIGZyb20gY2dlbi5jICovCi0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIGVuZCBvZiB0Yy1pOTYwLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTk2MC5oIGIvZ2FzL2NvbmZpZy90Yy1pOTYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDZlZGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyogdGMtaTk2MC5oIC0gQmFzaWMgODA5NjAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmbmRlZiBUQ19JOTYwCi0jZGVmaW5lIFRDX0k5NjAgMQotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1pOTYwIgotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9pOTYwCi0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKgotICogVGhlICdDT0onIGluc3RydWN0aW9ucyBhcmUgYWN0dWFsbHkgQ09CUiBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgJ2InIGluCi0gKiB0aGUgbW5lbW9uaWMgcmVwbGFjZWQgYnkgYSAnaic7ICB0aGV5IGFyZSBBTFdBWVMgImRlLW9wdGltaXplZCIgaWYgbmVjZXNzYXJ5OgotICogaWYgdGhlIGRpc3BsYWNlbWVudCB3aWxsIG5vdCBmaXQgaW4gMTMgYml0cywgdGhlIGFzc2VtYmxlciB3aWxsIHJlcGxhY2UgdGhlbQotICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLgotICoKLSAqIEFsbCBvZiB0aGUgJ01FTW4nIGluc3RydWN0aW9ucyBhcmUgdGhlIHNhbWUgZm9ybWF0OyB0aGUgJ24nIGluIHRoZSBuYW1lCi0gKiBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgaW5kZXggc2NhbGUgZmFjdG9yICh0aGUgc2l6ZSBvZiB0aGUgZGF0dW0gb3BlcmF0ZWQgb24pLgotICoKLSAqIFRoZSBGQlJBIGZvcm1hdHMgYXJlIG5vdCBhY3R1YWxseSBhbiBpbnN0cnVjdGlvbiBmb3JtYXQuICBUaGV5IGFyZSB0aGUKLSAqICJjb252ZW5pZW5jZSBkaXJlY3RpdmVzIiBmb3IgYnJhbmNoaW5nIG9uIGZsb2F0aW5nLXBvaW50IGNvbXBhcmlzb25zLAotICogZWFjaCBvZiB3aGljaCBnZW5lcmF0ZXMgMiBpbnN0cnVjdGlvbnMgKGEgJ2JubycgYW5kIG9uZSBvdGhlciBicmFuY2gpLgotICoKLSAqIFRoZSBDQUxMSiBmb3JtYXQgaXMgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIEl0IGluZGljYXRlcyB0aGF0Ci0gKiB0aGUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkIChhIENUUkwtZm9ybWF0ICdjYWxsJykgc2hvdWxkIGhhdmUgaXRzIHJlbG9jYXRpb24KLSAqIHNwZWNpYWxseSBmbGFnZ2VkIGZvciBsaW5rLXRpbWUgcmVwbGFjZW1lbnQgd2l0aCBhICdiYWwnIG9yICdjYWxscycgaWYKLSAqIGFwcHJvcHJpYXRlLgotICovCi0KLS8qIHRhaWxvciBnYXMgKi8KLSNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2RlZmluZSBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TCi0KLS8qIHRhaWxvciB0aGUgY29mZiBmb3JtYXQgKi8KLSNkZWZpbmUgQkZEX0FSQ0gJCQkJYmZkX2FyY2hfaTk2MAotI2RlZmluZSBDT0ZGX0ZMQUdTCQkJCUZfQVIzMldSCi0jZGVmaW5lIENPRkZfTUFHSUMJCQkJSTk2MFJPTUFHSUMKLSNkZWZpbmUgT0JKX0NPRkZfU0VDVElPTl9IRUFERVJfSEFTX0FMSUdOTUVOVAotI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUwkJCSgyKQotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhGSVhQKQkJCSghKEZJWFApLT5meF9kb25lKQotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShGSVhQKQkJCXRjX2NvZmZfZml4MnJ0eXBlKEZJWFApCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoRlJBR1ApCQl0Y19jb2ZmX3NpemVtYWNoZGVwKEZSQUdQKQotI2RlZmluZSBUQ19DT0ZGX1NFVF9NQUNISU5FKEhEUlMpCQl0Y19oZWFkZXJzX2hvb2sgKEhEUlMpCi1leHRlcm4gdm9pZCB0Y19oZWFkZXJzX2hvb2sgKCk7Ci1leHRlcm4gc2hvcnQgdGNfY29mZl9maXgycnR5cGUgKCk7Ci1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgKCk7Ci0KLS8qIE1FQU5JTkcgT0YgJ25fb3RoZXInIGluIHRoZSBzeW1ib2wgcmVjb3JkLgotICoKLSAqIElmIG5vbi16ZXJvLCB0aGUgJ25fb3RoZXInIGZpZWxkcyBpbmRpY2F0ZXMgZWl0aGVyIGEgbGVhZiBwcm9jZWR1cmUgb3IKLSAqIGEgc3lzdGVtIHByb2NlZHVyZSwgYXMgZm9sbG93czoKLSAqCi0gKgkxIDw9IG5fb3RoZXIgPD0gMzIgOgotICoJCVRoZSBzeW1ib2wgaXMgdGhlIGVudHJ5IHBvaW50IHRvIGEgc3lzdGVtIHByb2NlZHVyZS4KLSAqCQknbl92YWx1ZScgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5LCBhcyBmb3IgYW55IG90aGVyCi0gKgkJcHJvY2VkdXJlLiAgVGhlIHN5c3RlbSBwcm9jZWR1cmUgbnVtYmVyICh3aGljaCBjYW4gYmUgdXNlZCBpbgotICoJCWEgJ2NhbGxzJyBpbnN0cnVjdGlvbikgaXMgKG5fb3RoZXItMSkuICBUaGVzZSBlbnRyaWVzIGNvbWUgZnJvbQotICoJCScuc3lzcHJvYycgZGlyZWN0aXZlcy4KLSAqCi0gKgluX290aGVyID09IE5fQ0FMTE5BTUUKLSAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KLSAqCQlUaGUgKm5leHQqIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlIG11c3QgYmUgdGhlIGNvcnJlc3BvbmRpbmcKLSAqCQknYmFsJyBlbnRyeSBwb2ludCB0byB0aGUgcHJvY2VkdXJlIChzZWUgZm9sbG93aW5nKS4gIFRoZXNlCi0gKgkJZW50cmllcyBjb21lIGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCB0d28gZGlmZmVyZW50Ci0gKgkJc3ltYm9scyBhcmUgc3BlY2lmaWVkICh0aGUgZmlyc3Qgb25lIGlzIHJlcHJlc2VudGVkIGhlcmUpLgotICoKLSAqCi0gKgluX290aGVyID09IE5fQkFMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdiYWwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlc2UgZW50cmllcyByZXN1bHQgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIG9ubHkKLSAqCQlvbmUgc3ltYm9sIGlzIHNwZWNpZmllZCwgb3IgaW4gd2hpY2ggdGhlIHNhbWUgc3ltYm9sIGlzCi0gKgkJc3BlY2lmaWVkIHR3aWNlLgotICoKLSAqIE5vdGUgdGhhdCBhbiBOX0NBTExOQU1FIGVudHJ5ICptdXN0KiBoYXZlIGEgY29ycmVzcG9uZGluZyBOX0JBTE5BTUUgZW50cnksCi0gKiBidXQgbm90IGV2ZXJ5IE5fQkFMTkFNRSBlbnRyeSBtdXN0IGhhdmUgYW4gTl9DQUxMTkFNRSBlbnRyeS4KLSAqLwotI2RlZmluZQlOX0NBTExOQU1FCSgoY2hhciktMSkKLSNkZWZpbmUJTl9CQUxOQU1FCSgoY2hhciktMikKLQotLyogaTk2MCB1c2VzIGEgY3VzdG9tIHJlbG9jYXRpb24gcmVjb3JkLiAqLwotCi0vKiBsZXQgb2JqLWFvdXQuaCBrbm93ICovCi0jZGVmaW5lIENVU1RPTV9SRUxPQ19GT1JNQVQgMQotLyogbGV0IGFvdXRfZ251Lmgga25vdyAqLwotI2RlZmluZSBOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRCAxCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi0gIHsKLSAgICBpbnQgcl9hZGRyZXNzOwkJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCi0gICAgdW5zaWduZWQKLSAgICAgIHJfaW5kZXg6MjQsCQkvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCovCi0gICAgICByX3BjcmVsOjEsCQkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCi0JCQkJICoJT24gaTk2MCwgcGMtcmVsYXRpdmUgaW1wbGllcyAyNC1iaXQKLQkJCQkgKglhZGRyZXNzLCBhYnNvbHV0ZSBpbXBsaWVzIDMyLWJpdC4KLQkJCQkgKi8KLSAgICAgIHJfbGVuZ3RoOjIsCQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6Ci0JCQkJICoJMCA9PiAxIGJ5dGUKLQkJCQkgKgkxID0+IDIgYnl0ZXMKLQkJCQkgKgkyID0+IDQgYnl0ZXMgLS0gb25seSB2YWx1ZSB1c2VkIGZvciBpOTYwCi0JCQkJICovCi0gICAgICByX2V4dGVybjoxLCByX2JzcjoxLAkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0gICAgICByX2Rpc3A6MSwJCQkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0gICAgICByX2NhbGxqOjEsCQkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLwotICAgICAgbnV0aGluOjE7CQkJLyogVW51c2VkCQkJCSovCi0gIH07Ci0KLSNpZmRlZiBPQkpfQ09GRgotCi0vKiBXZSBzdG9yZSB0aGUgYmFsIGluZm9ybWF0aW9uIGluIHRoZSBzeV90YyBmaWVsZC4gICovCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3ltYm9sUyAqCi0KLSNkZWZpbmUgVENfQURKVVNUX1JFTE9DX0NPVU5UKEZJWFAsQ09VTlQpIFwKLSAgeyBmaXhTICp0Y2ZpeHAgPSAoRklYUCk7IFwKLSAgICBmb3IgKDt0Y2ZpeHA7dGNmaXhwPXRjZml4cC0+ZnhfbmV4dCkgXAotICAgICAgaWYgKHRjZml4cC0+ZnhfdGNiaXQgJiYgdGNmaXhwLT5meF9hZGRzeSAhPSAwKSBcCi0gICAgICAgICsrKENPVU5UKTsgXAotICB9Ci0jZW5kaWYKLQotZXh0ZXJuIGludCBpOTYwX3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QsIHN5bWJvbFMgKiopKTsKLSNkZWZpbmUgVENfVkFMSURBVEVfRklYKEZJWFAsU0VHVFlQRSxMQUJFTCkgXAotCWlmIChpOTYwX3ZhbGlkYXRlX2ZpeCAoRklYUCwgU0VHVFlQRSwgJmFkZF9zeW1ib2xQKSAhPSAwKSBnb3RvIExBQkVMCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpICBcCi0gICgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTCBcCi0gICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKLSNlbmRpZgotCi0jaWZuZGVmIE9CSl9FTEYKLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYUCkJCSgoRklYUCktPmZ4X2JzciA9PSAwKQotI2Vsc2UKLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYUCkJCQkJCQlcCi0gICgoRklYUCktPmZ4X2JzciA9PSAwCQkJCQkJCVwKLSAgICYmICEgU19JU19FWFRFUk5BTCAoKEZJWFApLT5meF9hZGRzeSkJCQkJXAotICAgJiYgISBTX0lTX1dFQUsgKChGSVhQKS0+ZnhfYWRkc3kpKQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGJydGFiX2VtaXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9lbmQoKQlicnRhYl9lbWl0ICgpCi0KLWV4dGVybiB2b2lkIHJlbG9jX2NhbGxqICgpOwotCi1leHRlcm4gdm9pZCB0Y19zZXRfYmFsX29mX2NhbGwgUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLQotZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKnRjX2dldF9iYWxfb2ZfY2FsbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotZXh0ZXJuIHZvaWQgaTk2MF9oYW5kbGVfYWxpZ24gKCk7Ci0jZGVmaW5lIEhBTkRMRV9BTElHTihGUkFHKQlpOTYwX2hhbmRsZV9hbGlnbiAoRlJBRykKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLSNkZWZpbmUgTk9fUkVMT0MgLTEKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLSNkZWZpbmUgTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWQotCi0jZGVmaW5lIFRDX0ZJWF9UWVBFIHN0cnVjdCB7IHVuc2lnbmVkIGJzciA6IDE7IH0KLSNkZWZpbmUgZnhfYnNyIHRjX2ZpeF9kYXRhLmJzcgotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKEYpCSgoRiktPnRjX2ZpeF9kYXRhLmJzciA9IDApCi0KLSNlbmRpZgotCi0vKiBlbmQgb2YgdGMtaTk2MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW0zMnIuYyBiL2dhcy9jb25maWcvdGMtbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDBmOTk3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTMyci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNCArMCwwIEBACi0vKiB0Yy1tMzJyLmMgLS0gQXNzZW1ibGVyIGZvciB0aGUgTWl0c3ViaXNoaSBNMzJSLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZXMvbTMyci1kZXNjLmgiCi0jaW5jbHVkZSAib3Bjb2Rlcy9tMzJyLW9wYy5oIgotI2luY2x1ZGUgImNnZW4uaCIKLQotLyogTGlua2VkIGxpc3Qgb2Ygc3ltYm9scyB0aGF0IGFyZSBkZWJ1Z2dpbmcgc3ltYm9scyB0byBiZSBkZWZpbmVkIGFzIHRoZQotICAgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0IHN5bV9saW5rCi17Ci0gIHN0cnVjdCBzeW1fbGluayAqbmV4dDsKLSAgc3ltYm9sUwkgICpzeW1ib2w7Ci19IHN5bV9saW5rUzsKLQotc3RhdGljIHN5bV9saW5rUyAqZGVidWdfc3ltX2xpbmsgPSAoc3ltX2xpbmtTICopMDsKLSAgCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2YgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIGRlc2NyaWJpbmcKLSAgIGFuIGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgQ0dFTl9JTlNOICoJaW5zbjsKLSAgY29uc3QgQ0dFTl9JTlNOICoJb3JpZ19pbnNuOwotICBDR0VOX0ZJRUxEUwkJZmllbGRzOwotI2lmIENHRU5fSU5UX0lOU05fUAotICBDR0VOX0lOU05fSU5UICAgICAgICAgYnVmZmVyIFsxXTsKLSNkZWZpbmUgSU5TTl9WQUxVRShidWYpICgqKGJ1ZikpCi0jZWxzZQotICB1bnNpZ25lZCBjaGFyICAgICAgICAgYnVmZmVyIFtDR0VOX01BWF9JTlNOX1NJWkVdOwotI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKGJ1ZikKLSNlbmRpZgotICBjaGFyICoJCWFkZHI7Ci0gIGZyYWdTICoJCWZyYWc7Ci0gIGludCAgICAgICAgICAgICAgICAgICBudW1fZml4dXBzOwotICBmaXhTICogICAgICAgICAgICAgICAgZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKLSAgaW50ICAgICAgICAgICAgICAgICAgIGluZGljZXMgW01BWF9PUEVSQU5EX0lOU1RBTkNFU107Ci0gIHN5bV9saW5rUwkJKmRlYnVnX3N5bV9saW5rOwotfQotbTMycl9pbnNuOwotCi0vKiBwcmV2X2luc24uaW5zbiBpcyBub24tbnVsbCBpZiBsYXN0IGluc24gd2FzIGEgMTYgYml0IGluc24gb24gYSAzMiBiaXQKLSAgIGJvdW5kYXJ5IChpLmUuIHdhcyB0aGUgZmlyc3Qgb2YgdHdvIDE2IGJpdCBpbnNucykuICAqLwotc3RhdGljIG0zMnJfaW5zbglwcmV2X2luc247Ci0KLS8qIE5vbi16ZXJvIGlmIHdlJ3ZlIHNlZW4gYSByZWxheGFibGUgaW5zbiBzaW5jZSB0aGUgbGFzdCAzMiBiaXQKLSAgIGFsaWdubWVudCByZXF1ZXN0LiAgKi8KLXN0YXRpYyBpbnQgc2Vlbl9yZWxheGFibGVfcCA9IDA7Ci0KLS8qIE5vbi16ZXJvIGlmIC1yZWxheCBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugc3VmZmljaWVudCByZWxvY3MgYXJlIG91dHB1dAotICAgZm9yIHRoZSBsaW5rZXIgdG8gZG8gcmVsYXhpbmcuCi0gICBXZSBkbyBzaW1wbGUgZm9ybXMgb2YgcmVsYXhpbmcgaW50ZXJuYWxseSwgYnV0IHRoZXkgYXJlIGFsd2F5cyBkb25lLgotICAgVGhpcyBmbGFnIGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uICAqLwotc3RhdGljIGludCBtMzJyX3JlbGF4OwotCi0jaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLwotLyogSWYgbm9uLU5VTEwsIHBvaW50ZXIgdG8gY3B1IGRlc2NyaXB0aW9uIGZpbGUgdG8gcmVhZC4KLSAgIFRoaXMgYWxsb3dzIHJ1bnRpbWUgYWRkaXRpb25zIHRvIHRoZSBhc3NlbWJsZXIuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBtMzJyX2NwdV9kZXNjOwotI2VuZGlmCi0KLS8qIE5vbi16ZXJvIGlmIHdhcm4gd2hlbiBhIGhpZ2gvc2hpZ2ggcmVsb2MgaGFzIG5vIG1hdGNoaW5nIGxvdyByZWxvYy4KLSAgIEVhY2ggaGlnaC9zaGlnaCByZWxvYyBtdXN0IGJlIHBhaXJlZCB3aXRoIGl0J3MgbG93IGNvdXNpbiBpbiBvcmRlciB0bwotICAgcHJvcGVybHkgY2FsY3VsYXRlIHRoZSBhZGRlbmQgaW4gYSByZWxvY2F0YWJsZSBsaW5rIChzaW5jZSB0aGVyZSBpcyBhCi0gICBwb3RlbnRpYWwgY2FycnkgZnJvbSB0aGUgbG93IHRvIHRoZSBoaWdoL3NoaWdoKS4KLSAgIFRoaXMgb3B0aW9uIGlzIG9mZiBieSBkZWZhdWx0IHRob3VnaCBmb3IgdXNlci13cml0dGVuIGFzc2VtYmxlciBjb2RlIGl0Ci0gICBtaWdodCBtYWtlIHNlbnNlIHRvIG1ha2UgdGhlIGRlZmF1bHQgYmUgb24gKGkuZS4gaGF2ZSBnY2MgcGFzcyBhIGZsYWcKLSAgIHRvIHR1cm4gaXQgb2ZmKS4gIFRoaXMgd2FybmluZyBtdXN0IG5vdCBiZSBvbiBmb3IgR0NDIGNyZWF0ZWQgY29kZSBhcwotICAgb3B0aW1pemF0aW9uIG1heSBkZWxldGUgdGhlIGxvdyBidXQgbm90IHRoZSBoaWdoL3NoaWdoIChhdCBsZWFzdCB3ZQotICAgc2hvdWxkbid0IGFzc3VtZSBvciByZXF1aXJlIGl0IHRvKS4gICovCi1zdGF0aWMgaW50IHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAwOwotCi0KLS8qIHN0dWZmIGZvciAuc2NvbW0gc3ltYm9scy4gICovCi1zdGF0aWMgc2VnVCAgICAgc2Jzc19zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uIHNjb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sICBzY29tX3N5bWJvbDsKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gICAgICAgID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSAgID0gIiMiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci1jb25zdCBjaGFyIEVYUF9DSEFSU1tdICAgICAgICAgICAgPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSAgICAgICAgICAgID0gImREIjsKLQotLyogUmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBkb25lIGluIHR3bwotICAgcGFydHMsIHdpdGggYSBISSByZWxvY2F0aW9uIGFuZCBhIExPIHJlbG9jYXRpb24uICBFYWNoIHJlbG9jYXRpb24KLSAgIGhhcyBvbmx5IDE2IGJpdHMgb2Ygc3BhY2UgdG8gc3RvcmUgYW4gYWRkZW5kLiAgVGhpcyBtZWFucyB0aGF0IGluCi0gICBvcmRlciBmb3IgdGhlIGxpbmtlciB0byBoYW5kbGUgY2FycmllcyBjb3JyZWN0bHksIGl0IG11c3QgYmUgYWJsZQotICAgdG8gbG9jYXRlIGJvdGggdGhlIEhJIGFuZCB0aGUgTE8gcmVsb2NhdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgIHJlbG9jYXRpb25zIG11c3QgYXBwZWFyIGluIG9yZGVyIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLgotCi0gICBJbiBvcmRlciB0byBpbXBsZW1lbnQgdGhpcywgd2Uga2VlcCB0cmFjayBvZiBlYWNoIHVubWF0Y2hlZCBISQotICAgcmVsb2NhdGlvbi4gIFdlIHRoZW4gc29ydCB0aGVtIHNvIHRoYXQgdGhleSBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZQotICAgY29ycmVzcG9uZGluZyBMTyByZWxvY2F0aW9uLiAqLwotCi1zdHJ1Y3QgbTMycl9oaV9maXh1cAotewotICBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIG5leHQ7ICAvKiBOZXh0IEhJIGZpeHVwLiAgKi8KLSAgZml4UyAqICAgICAgICAgICAgICAgICBmaXhwOyAgLyogVGhpcyBmaXh1cC4gICovCi0gIHNlZ1QgICAgICAgICAgICAgICAgICAgc2VnOyAgIC8qIFRoZSBzZWN0aW9uIHRoaXMgZml4dXAgaXMgaW4uICAqLwotCi19OwotCi0vKiBUaGUgbGlzdCBvZiB1bm1hdGNoZWQgSEkgcmVsb2NzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtMzJyX2hpX2ZpeHVwICogbTMycl9oaV9maXh1cF9saXN0OwotCi0MCi0MCi0jZGVmaW5lIE0zMlJfU0hPUlRPUFRTICIiCi1jb25zdCBjaGFyICogbWRfc2hvcnRvcHRzID0gTTMyUl9TSE9SVE9QVFM7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0KLSAgLyogU2lnaC4gIEkgZ3Vlc3MgYWxsIHdhcm5pbmdzIG11c3Qgbm93IGhhdmUgYm90aCB2YXJpYW50cy4gICovCi0jZGVmaW5lIE9QVElPTl9XQVJOX1VOTUFUQ0hFRCAoT1BUSU9OX01EX0JBU0UgKyA0KQotICB7Indhcm4tdW5tYXRjaGVkLWhpZ2giLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSAgeyJXdWgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSNkZWZpbmUgT1BUSU9OX05PX1dBUk5fVU5NQVRDSEVEIChPUFRJT05fTURfQkFTRSArIDUpCi0gIHsibm8td2Fybi11bm1hdGNoZWQtaGlnaCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9VTk1BVENIRUR9LAotICB7IldudWgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLQotI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLSNkZWZpbmUgT1BUSU9OX1JFTEFYICAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0jZGVmaW5lIE9QVElPTl9DUFVfREVTQyAoT1BUSU9OX01EX0JBU0UgKyA3KQotICB7ImNwdS1kZXNjIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DUFVfREVTQ30sCi0jZW5kaWYKLQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50ICAgIGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0KLSAgICBjYXNlIE9QVElPTl9XQVJOX1VOTUFUQ0hFRDoKLSAgICAgIHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRDoKLSAgICAgIHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICBtMzJyX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0NQVV9ERVNDOgotICAgICAgbTMycl9jcHVfZGVzYyA9IGFyZzsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGFyZykKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbmlzZWQgY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjXG4iKSwgbXluYW1lLCBjKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbmlzZWQgY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjJXNcbiIpLCBteW5hbWUsIGMsIGFyZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKiBzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIE0zMlIgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnM6XG4iKSk7Ci0KLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLXdhcm4tdW5tYXRjaGVkLWhpZ2ggICAgd2FybiB3aGVuIGFuIChzKWhpZ2ggcmVsb2MgaGFzIG5vIG1hdGNoaW5nIGxvdyByZWxvY1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2ggZG8gbm90IHdhcm4gYWJvdXQgbWlzc2luZyBsb3cgcmVsb2NzXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtV3VoICAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtd2Fybi11bm1hdGNoZWQtaGlnaFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVdudWggICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIpKTsKLQotI2lmIDAKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1yZWxheCAgICAgICAgICAgICAgICAgY3JlYXRlIGxpbmtlciByZWxheGFibGUgY29kZVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLWNwdS1kZXNjICAgICAgICAgICAgICBwcm92aWRlIHJ1bnRpbWUgY3B1IGRlc2NyaXB0aW9uIGZpbGVcbiIpKTsKLSNlbmRpZgotfSAKLQotc3RhdGljIHZvaWQgZmlsbF9pbnNuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbTMycl9zY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGRlYnVnX3N5bSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGV4cGFuZF9kZWJ1Z19zeW1zIFBBUkFNUyAoKHN5bV9saW5rUyAqLCBpbnQpKTsKLQotLyogU2V0IGJ5IG1kX2Fzc2VtYmxlIGZvciB1c2UgYnkgbTMycl9maWxsX2luc24uICAqLwotc3RhdGljIHN1YnNlZ1QgcHJldl9zdWJzZWc7Ci1zdGF0aWMgc2VnVCBwcmV2X3NlZzsKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsCWNvbnMsCQk0IH0sCi0gIHsgImZpbGxpbnNuIiwgZmlsbF9pbnNuLAkwIH0sCi0gIHsgInNjb21tIiwJbTMycl9zY29tbSwJMCB9LAotICB7ICJkZWJ1Z3N5bSIsCWRlYnVnX3N5bSwJMCB9LAotICB7IE5VTEwsIE5VTEwsIDAgfQotfTsKLQotLyogRklYTUU6IFNob3VsZCBiZSBtYWNoaW5lIGdlbmVyYXRlZC4gICovCi0jZGVmaW5lIE5PUF9JTlNOIDB4NzAwMAotI2RlZmluZSBQQVJfTk9QX0lOU04gMHhmMDAwIC8qIGNhbiBvbmx5IGJlIHVzZWQgaW4gMm5kIHNsb3QgKi8KLQotLyogV2hlbiB3ZSBhbGlnbiB0aGUgLnRleHQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLgotICAgTiBpcyB0aGUgcG93ZXIgb2YgMiBhbGlnbm1lbnQuICBMRU4gaXMgdGhlIGxlbmd0aCBvZiBwYXR0ZXJuIEZJTEwuCi0gICBNQVggaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuIGRvaW5nIHRoZSBhbGlnbm1lbnQsCi0gICBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotCi1pbnQKLW0zMnJfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4KQotICAgICBpbnQgICAgICAgICAgbjsKLSAgICAgY29uc3QgY2hhciAqIGZpbGw7Ci0gICAgIGludCAgICAgICAgICBsZW47Ci0gICAgIGludCAgICAgICAgICBtYXg7Ci17Ci0gIC8qIE9ubHkgZG8gdGhpcyBpZiB0aGUgZmlsbCBwYXR0ZXJuIHdhc24ndCBzcGVjaWZpZWQuICAqLwotICBpZiAoZmlsbCA9PSBOVUxMCi0gICAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKQotICAgICAgLyogT25seSBkbyB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgaWYgYWxpZ25pbmcgdG8gYXQgbGVhc3QgYQotCSA0IGJ5dGUgYm91bmRhcnkuICAqLwotICAgICAgJiYgbiA+IDEKLSAgICAgLyogT25seSBkbyB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgaWYgd2UncmUgYWxsb3dlZCB0byBlbWl0IGF0Ci0JIGxlYXN0IHR3byBieXRlcy4gICovCi0gICAgICAmJiAobWF4ID09IDAgfHwgbWF4ID4gMSkpCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9wX3BhdHRlcm5bXSA9IHsgMHhmMCwgMHgwMCB9OwotCi0jaWYgMAotICAgICAgLyogRmlyc3QgYWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnksIGluIGNhc2UgdGhlcmUgaXMgYW4gb2RkIC5ieXRlLiAgKi8KLSAgICAgIC8qIEZJWE1FOiBIb3cgbXVjaCBtZW1vcnkgd2lsbCBjYXVzZSBnYXMgdG8gdXNlIHdoZW4gYXNzZW1ibGluZyBhIGJpZwotCSBwcm9ncmFtPyAgUGVyaGFwcyB3ZSBjYW4gYXZvaWQgdGhlIGZyYWdfYWxpZ24gY2FsbD8gICovCi0gICAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSNlbmRpZgotICAgICAgLyogTmV4dCBhbGlnbiB0byBhIDQgYnl0ZSBib3VuZGFyeSAod2Uga25vdyBuID49IDIpIHVzaW5nIGEgcGFyYWxsZWwKLQkgbm9wLiAgKi8KLSAgICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMiwgbm9wX3BhdHRlcm4sIHNpemVvZiBub3BfcGF0dGVybiwgMCk7Ci0gICAgICAvKiBJZiBkb2luZyBsYXJnZXIgYWxpZ25tZW50cyB1c2UgYSByZXBlYXRpbmcgc2VxdWVuY2Ugb2YgYXBwcm9wcmlhdGUKLQkgbm9wcy4gICovCi0gICAgICBpZiAobiA+IDIpCi0JewotCSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbXVsdGlfbm9wX3BhdHRlcm5bXSA9Ci0JICB7IDB4NzAsIDB4MDAsIDB4ZjAsIDB4MDAgfTsKLQkgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbXVsdGlfbm9wX3BhdHRlcm4sIHNpemVvZiBtdWx0aV9ub3BfcGF0dGVybiwKLQkJCSAgICAgIG1heCA/IG1heCAtIDIgOiAwKTsKLQl9Ci0gICAgICAKLSAgICAgIHByZXZfaW5zbi5pbnNuID0gTlVMTDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gd2FzIHRoZSBmaXJzdCBvZiAyIDE2IGJpdCBpbnNucywKLSAgIG91dHB1dCBhIG5vcCB0byBtb3ZlIHRoZSBQQyB0byBhIDMyIGJpdCBib3VuZGFyeS4KLQotICAgVGhpcyBpcyBkb25lIHZpYSBhbiBhbGlnbm1lbnQgc3BlY2lmaWNhdGlvbiBzaW5jZSBicmFuY2ggcmVsYXhpbmcKLSAgIG1heSBtYWtlIGl0IHVubmVjZXNzYXJ5LgotCi0gICBJbnRlcm5hbGx5LCB3ZSBuZWVkIHRvIG91dHB1dCBvbmUgb2YgdGhlc2UgZWFjaCB0aW1lIGEgMzIgYml0IGluc24gaXMKLSAgIHNlZW4gYWZ0ZXIgYW4gaW5zbiB0aGF0IGlzIHJlbGF4YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1maWxsX2luc24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgKHZvaWQpIG0zMnJfZG9fYWxpZ24gKDIsIE5VTEwsIDAsIDApOwotICBwcmV2X2luc24uaW5zbiA9IE5VTEw7Ci0gIHNlZW5fcmVsYXhhYmxlX3AgPSAwOwotfQotCi0vKiBSZWNvcmQgdGhlIHN5bWJvbCBzbyB0aGF0IHdoZW4gd2Ugb3V0cHV0IHRoZSBpbnNuLCB3ZSBjYW4gY3JlYXRlCi0gICBhIHN5bWJvbCB0aGF0IGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQKLSAgIHRvIGVtaXQgdGhlIGxhYmVsIGZvciB0aGUgc3RhcnQgb2YgYSBicmVha3BvaW50IHdpdGhvdXQgY2F1c2luZwotICAgdGhlIGFzc2VtYmxlciB0byBlbWl0IGEgTk9QIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYQotICAgMTYgYml0IGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWRlYnVnX3N5bSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGRlbGltOwotICByZWdpc3RlciBjaGFyICplbmRfbmFtZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgcmVnaXN0ZXIgc3ltX2xpbmtTICpsaW5rOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbGltID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVuZF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotIAotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpID09IE5VTEwKLSAgICAgICYmIChzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkpID09IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgIT0gcmVnX3NlY3Rpb24pCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxpbmsgPSAoc3ltX2xpbmtTICopIHhtYWxsb2MgKHNpemVvZiAoc3ltX2xpbmtTKSk7Ci0gICAgICBsaW5rLT5zeW1ib2wgPSBzeW1ib2xQOwotICAgICAgbGluay0+bmV4dCA9IGRlYnVnX3N5bV9saW5rOwotICAgICAgZGVidWdfc3ltX2xpbmsgPSBsaW5rOwotICAgICAgc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCA9IDE7Ci0gICAgfQotCi0gICplbmRfbmFtZSA9IGRlbGltOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBTZWNvbmQgcGFzcyB0byBleHBhbmRpbmcgdGhlIGRlYnVnIHN5bWJvbHMsIGdvIHRocm91Z2ggbGlua2VkCi0gICBsaXN0IG9mIHN5bWJvbHMgYW5kIHJlYXNzaWduIHRoZSBhZGRyZXNzLiAgKi8KLQotc3RhdGljIHZvaWQKLWV4cGFuZF9kZWJ1Z19zeW1zIChzeW1zLCBhbGlnbikKLSAgICAgc3ltX2xpbmtTICpzeW1zOwotICAgICBpbnQgYWxpZ247Ci17Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgc3ltX2xpbmtTICpuZXh0X3N5bXM7Ci0KLSAgaWYgKCFzeW1zKQotICAgIHJldHVybjsKLQotICAodm9pZCkgbTMycl9kb19hbGlnbiAoYWxpZ24sIE5VTEwsIDAsIDApOwotICBmb3IgKDsgc3ltcyAhPSAoc3ltX2xpbmtTICopMDsgc3ltcyA9IG5leHRfc3ltcykKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1ib2xQID0gc3ltcy0+c3ltYm9sOwotICAgICAgbmV4dF9zeW1zID0gc3ltcy0+bmV4dDsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9ICIuXG4iOwotICAgICAgcHNldWRvX3NldCAoc3ltYm9sUCk7Ci0gICAgICBmcmVlICgoY2hhciAqKXN5bXMpOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmU7Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIGZpbGxfaW5zbiBjYWxsZWQgYWZ0ZXIgYSBsYWJlbCBhbmQgYXQgZW5kIG9mIGFzc2VtYmx5LgotICAgVGhlIHJlc3VsdCBpcyBhbHdheXMgMTogd2UncmUgY2FsbGVkIGluIGEgY29uZGl0aW9uYWwgdG8gc2VlIGlmIHRoZQotICAgY3VycmVudCBsaW5lIGlzIGEgbGFiZWwuICAqLwotCi1pbnQKLW0zMnJfZmlsbF9pbnNuIChkb25lKQotICAgICBpbnQgZG9uZTsKLXsKLSAgaWYgKHByZXZfc2VnICE9IE5VTEwpCi0gICAgewotICAgICAgc2VnVCAgICBzZWcgICAgPSBub3dfc2VnOwotICAgICAgc3Vic2VnVCBzdWJzZWcgPSBub3dfc3Vic2VnOwotCi0gICAgICBzdWJzZWdfc2V0IChwcmV2X3NlZywgcHJldl9zdWJzZWcpOwotICAgICAgCi0gICAgICBmaWxsX2luc24gKDApOwotCi0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotCi0gIGlmIChkb25lICYmIGRlYnVnX3N5bV9saW5rKQotICAgIHsKLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChkZWJ1Z19zeW1fbGluaywgMSk7Ci0gICAgICBkZWJ1Z19zeW1fbGluayA9IChzeW1fbGlua1MgKikwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQwKLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGZsYWd3b3JkIGFwcGxpY2FibGU7Ci0gIHNlZ1QgICAgIHNlZzsKLSAgc3Vic2VnVCAgc3Vic2VnOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGBjZ2VuJyBpbnRlcmZhY2UuICAqLwotICAKLSAgLyogU2V0IHRoZSBtYWNoaW5lIG51bWJlciBhbmQgZW5kaWFuLiAgKi8KLSAgZ2FzX2NnZW5fY3B1X2Rlc2MgPSBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fTUFDSFMsIDAsCi0JCQkJCSAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sCi0JCQkJCSAgQ0dFTl9FTkRJQU5fQklHLAotCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgbTMycl9jZ2VuX2luaXRfYXNtIChnYXNfY2dlbl9jcHVfZGVzYyk7Ci0KLSAgLyogVGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgaXMgdXNlZCBkdXJpbmcgb3B0aW1pemF0aW9uIHRvIGRldGVybWluZQotICAgICB3aGljaCBpbnNucyBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuICBJdCBpcyBhbHNvIHVzZWQgdG8gZ2l2ZQotICAgICB3YXJuaW5ncyByZWdhcmRpbmcgb3BlcmFuZCBpbnRlcmZlcmVuY2UgaW4gcGFyYWxsZWwgaW5zbnMuICAqLwotICBtMzJyX2NnZW5faW5pdF9vcGluc3RfdGFibGUgKGdhc19jZ2VuX2NwdV9kZXNjKTsKLQotICAvKiBUaGlzIGlzIGEgY2FsbGJhY2sgZnJvbSBjZ2VuIHRvIGdhcyB0byBwYXJzZSBvcGVyYW5kcy4gICovCi0gIGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4gKGdhc19jZ2VuX2NwdV9kZXNjLCBnYXNfY2dlbl9wYXJzZV9vcGVyYW5kKTsKLQotI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLSAgLyogSWYgYSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlIHdhcyBwcm92aWRlZCwgcGFyc2UgaXQuICAqLwotICBpZiAobTMycl9jcHVfZGVzYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBlcnJtc2c7Ci0KLSAgICAgIGVycm1zZyA9IGNnZW5fcmVhZF9jcHVfZmlsZSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIG0zMnJfY3B1X2Rlc2MpOwotICAgICAgaWYgKGVycm1zZyAhPSBOVUxMKQotCWFzX2JhZCAoIiVzOiAlcyIsIG0zMnJfY3B1X2Rlc2MsIGVycm1zZyk7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogU2F2ZSB0aGUgY3VycmVudCBzdWJzZWcgc28gd2UgY2FuIHJlc3RvcmUgaXQgW2l0J3MgdGhlIGRlZmF1bHQgb25lIGFuZAotICAgICB3ZSBkb24ndCB3YW50IHRoZSBpbml0aWFsIHNlY3Rpb24gdG8gYmUgLnNic3NdLiAgKi8KLSAgc2VnICAgID0gbm93X3NlZzsKLSAgc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICAvKiBUaGUgc2JzcyBzZWN0aW9uIGlzIGZvciBsb2NhbCAuc2NvbW0gc3ltYm9scy4gICovCi0gIHNic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDApOwotICAKLSAgLyogVGhpcyBpcyBjb3BpZWQgZnJvbSBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MuICAqLwotICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSAmIFNFQ19BTExPQyk7Ci0gIAotI2lmIDAgLyogV2hhdCBkb2VzIHRoaXMgZG8/IFtzZWUgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzXSAgKi8KLSAgc2VnX2luZm8gKGJzc19zZWN0aW9uKS0+YnNzID0gMTsKLSNlbmRpZgotCi0gIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLQotICAvKiBXZSBtdXN0IGNvbnN0cnVjdCBhIGZha2Ugc2VjdGlvbiBzaW1pbGFyIHRvIGJmZF9jb21fc2VjdGlvbgotICAgICBidXQgd2l0aCB0aGUgbmFtZSAuc2NvbW1vbi4gICovCi0gIHNjb21fc2VjdGlvbiAgICAgICAgICAgICAgICA9IGJmZF9jb21fc2VjdGlvbjsKLSAgc2NvbV9zZWN0aW9uLm5hbWUgICAgICAgICAgID0gIi5zY29tbW9uIjsKLSAgc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiBzY29tX3NlY3Rpb247Ci0gIHNjb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgc2NvbV9zeW1ib2w7Ci0gIHNjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgc2NvbV9zZWN0aW9uLnN5bWJvbDsKLSAgc2NvbV9zeW1ib2wgICAgICAgICAgICAgICAgID0gKiBiZmRfY29tX3NlY3Rpb24uc3ltYm9sOwotICBzY29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnNjb21tb24iOwotICBzY29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHNjb21fc2VjdGlvbjsKLQotfQotCi0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgbTMycl9pbnNuIGluc247Ci0gIGNoYXIgKiAgICBlcnJtc2c7Ci0gIGNoYXIgKiAgICBzdHIyID0gTlVMTDsKLQotICAvKiBJbml0aWFsaXplIEdBUydzIGNnZW4gaW50ZXJmYWNlIGZvciBhIG5ldyBpbnN0cnVjdGlvbi4gICovCi0gIGdhc19jZ2VuX2luaXRfcGFyc2UgKCk7Ci0KLSAgCi0gIGluc24uZGVidWdfc3ltX2xpbmsgPSBkZWJ1Z19zeW1fbGluazsKLSAgZGVidWdfc3ltX2xpbmsgPSAoc3ltX2xpbmtTICopMDsKLQotICBpbnNuLmluc24gPSBtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbgotICAgIChnYXNfY2dlbl9jcHVfZGVzYywgc3RyLCAmIGluc24uZmllbGRzLCBpbnNuLmJ1ZmZlciwgJiBlcnJtc2cpOwotICAKLSAgaWYgKCFpbnNuLmluc24pCi0gICAgewotICAgICAgYXNfYmFkIChlcnJtc2cpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAKLSAgaWYgKENHRU5fSU5TTl9CSVRTSVpFIChpbnNuLmluc24pID09IDMyKQotICAgIHsKLSAgICAgIC8qIDMyIGJpdCBpbnNucyBtdXN0IGxpdmUgb24gMzIgYml0IGJvdW5kYXJpZXMuICAqLwotICAgICAgaWYgKHByZXZfaW5zbi5pbnNuIHx8IHNlZW5fcmVsYXhhYmxlX3ApCi0JewotCSAgLyogPz8/IElmIGNhbGxpbmcgZmlsbF9pbnNuIHRvbyBtYW55IHRpbWVzIHR1cm5zIHVzIGludG8gYSBtZW1vcnkKLQkgICAgIHBpZywgY2FuIHdlIGNhbGwgYSBmbiB0byBhc3NlbWJsZSBhIG5vcCBpbnN0ZWFkIG9mCi0JICAgICAhc2Vlbl9yZWxheGFibGVfcD8gICovCi0JICBmaWxsX2luc24gKDApOwotCX0KLQotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGluc24uZGVidWdfc3ltX2xpbmssIDIpOwotCi0gICAgICAvKiBEb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hhdCB3ZSBwYXNzIGZvciBSRUxBWF9QIGhlcmUuICAqLwotICAgICAgZ2FzX2NnZW5fZmluaXNoX2luc24gKGluc24uaW5zbiwgaW5zbi5idWZmZXIsCi0JCQkgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBpbnNuLmZpZWxkcyksIDEsIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBvbl8zMmJpdF9ib3VuZGFyeV9wOwotCi0gICAgICBpZiAoQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24uaW5zbikgIT0gMTYpCi0JYWJvcnQoKTsKLQotICAgICAgaW5zbi5vcmlnX2luc24gPSBpbnNuLmluc247Ci0KLSAgICAgIC8qIENvbXB1dGUgd2hldGhlciB3ZSdyZSBvbiBhIDMyIGJpdCBib3VuZGFyeSBvciBub3QuCi0JIHByZXZfaW5zbi5pbnNuIGlzIE5VTEwgd2hlbiB3ZSdyZSBvbiBhIDMyIGJpdCBib3VuZGFyeS4gICovCi0gICAgICBvbl8zMmJpdF9ib3VuZGFyeV9wID0gcHJldl9pbnNuLmluc24gPT0gTlVMTDsKLQotCi0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoaW5zbi5kZWJ1Z19zeW1fbGluaywgMSk7Ci0KLSAgICAgIHsKLQlpbnQgaTsKLQlmaW5pc2hlZF9pbnNuUyBmaTsKLQotCS8qIEVuc3VyZSBlYWNoIHBhaXIgb2YgMTYgYml0IGluc25zIGlzIGluIHRoZSBzYW1lIGZyYWcuICAqLwotCWZyYWdfZ3JvdyAoNCk7Ci0KLQlnYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbi5vcmlnX2luc24sIGluc24uYnVmZmVyLAotCQkJICAgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBpbnNuLmZpZWxkcyksCi0JCQkgICAgICAxIC8qcmVsYXhfcCovLCAmZmkpOwotCWluc24uYWRkciA9IGZpLmFkZHI7Ci0JaW5zbi5mcmFnID0gZmkuZnJhZzsKLQlpbnNuLm51bV9maXh1cHMgPSBmaS5udW1fZml4dXBzOwotCWZvciAoaSA9IDA7IGkgPCBmaS5udW1fZml4dXBzOyArK2kpCi0JICBpbnNuLmZpeHVwc1tpXSA9IGZpLmZpeHVwc1tpXTsKLSAgICAgIH0KLQotCi0gICAgICAvKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UndmUgc2VlbiBhIHBhaXIgb2YgMTYgYml0IGluc25zLgotCSBwcmV2X2luc24uaW5zbiBpcyBOVUxMIHdoZW4gd2UncmUgb24gYSAzMiBiaXQgYm91bmRhcnkuICAqLwotICAgICAgaWYgKG9uXzMyYml0X2JvdW5kYXJ5X3ApCi0JcHJldl9pbnNuID0gaW5zbjsKLSAgICAgIGVsc2UKLQlwcmV2X2luc24uaW5zbiA9IE5VTEw7Ci0gICAgICAKLSAgICAgIC8qIElmIHRoZSBpbnNuIG5lZWRzIHRoZSBmb2xsb3dpbmcgb25lIHRvIGJlIG9uIGEgMzIgYml0IGJvdW5kYXJ5Ci0JIChlLmcuIHN1YnJvdXRpbmUgY2FsbHMpLCBmaWxsIHRoaXMgaW5zbidzIHNsb3QuICAqLwotICAgICAgaWYgKG9uXzMyYml0X2JvdW5kYXJ5X3AKLQkgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLm9yaWdfaW5zbiwgQ0dFTl9JTlNOX0ZJTExfU0xPVCkgIT0gMCkKLQlmaWxsX2luc24gKDApOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsYXhhYmxlIGluc24gKGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgbGFyZ2VyIHZlcnNpb24pCi0JIG1hcmsgdGhlIGZhY3Qgc28gdGhhdCB3ZSBjYW4gZW1pdCBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlIGZvciBhCi0JIGZvbGxvd2luZyAzMiBiaXQgaW5zbiBpZiB3ZSBzZWUgb25lLiAgICovCi0gICAgICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24ub3JpZ19pbnNuLCBDR0VOX0lOU05fUkVMQVhBQkxFKSAhPSAwKQotCXNlZW5fcmVsYXhhYmxlX3AgPSAxOwotICAgIH0KLQotICAvKiBTZXQgdGhlc2Ugc28gbTMycl9maWxsX2luc24gY2FuIHVzZSB0aGVtLiAgKi8KLSAgcHJldl9zZWcgICAgPSBub3dfc2VnOwotICBwcmV2X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci19Ci0KLS8qIFRoZSBzeW50YXggaW4gdGhlIG1hbnVhbCBzYXlzIGNvbnN0YW50cyBiZWdpbiB3aXRoICcjJy4KLSAgIFdlIGp1c3QgaWdub3JlIGl0LiAgKi8KLQotdm9pZCAKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICB9Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCAgIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICByZXR1cm4gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICogbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiAuc2NvbW0gcHNldWRvLW9wIGhhbmRsZXIuCi0KLSAgIFRoaXMgaXMgYSBuZXcgcHNldWRvLW9wIHRvIGhhbmRsZSBwdXR0aW5nIG9iamVjdHMgaW4gLnNjb21tb24uCi0gICBCeSBkb2luZyB0aGlzIHRoZSBsaW5rZXIgd29uJ3QgbmVlZCB0byBkbyBhbnkgd29yayBhbmQgbW9yZSBpbXBvcnRhbnRseQotICAgaXQgcmVtb3ZlcyB0aGUgaW1wbGljaXQgLUcgYXJnIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkgbGluayB0aGUgb2JqZWN0IGZpbGUuCi0qLwotCi1zdGF0aWMgdm9pZAotbTMycl9zY29tbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICogICAgbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciAgICAgIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKiAgICBwOwotICBvZmZzZXRUICAgICAgICAgICAgc2l6ZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqIHN5bWJvbFA7Ci0gIG9mZnNldFQgICAgICAgICAgICBhbGlnbjsKLSAgaW50ICAgICAgICAgICAgICAgIGFsaWduMjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICogcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc193YXJuIChfKCIuU0NPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgc2l6ZSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLnNjb21tIGlzIHRoZSBhbGlnbm1lbnQuICAqLwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGFsaWduID0gODsKLSAgZWxzZQotICAgIHsKLSAgICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoYWxpZ24gPD0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgYWxpZ24gPSA4OwotCX0KLSAgICB9Ci0gIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudC4gICovCi0gIGlmIChhbGlnbikKLSAgICB7Ci0gICAgICBmb3IgKGFsaWduMiA9IDA7IChhbGlnbiAmIDEpID09IDA7IGFsaWduID4+PSAxLCArKyBhbGlnbjIpCi0JY29udGludWU7Ci0gICAgICBpZiAoYWxpZ24gIT0gMSkKLQl7Ci0JICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFsaWduMiA9IDA7Ci0KLSAgKiBwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqIHAgPSBjOwotCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiTGVuZ3RoIG9mIC5zY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkgICAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBzaXplKTsKLQotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwpCi0gICAgewotICAgICAgc2VnVCAgIG9sZF9zZWMgICAgPSBub3dfc2VnOwotICAgICAgaW50ICAgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICAgICAgY2hhciAqIHBmcmFnOwotCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChzYnNzX3NlY3Rpb24sIGFsaWduMik7Ci0gICAgICBzdWJzZWdfc2V0IChzYnNzX3NlY3Rpb24sIDApOwotICAgICAgCi0gICAgICBpZiAoYWxpZ24yKQotCWZyYWdfYWxpZ24gKGFsaWduMiwgMCwgMCk7Ci0gICAgICAKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBzYnNzX3NlY3Rpb24pCi0Jc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLSAgICAgIAotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0gICAgICAKLSAgICAgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwgc2l6ZSwKLQkJCShjaGFyICopIDApOwotICAgICAgKiBwZnJhZyA9IDA7Ci0gICAgICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNic3Nfc2VjdGlvbik7Ci0gICAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLSAgICAgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCBhbGlnbjIpOwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgJiBzY29tX3NlY3Rpb24pOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogSW50ZXJmYWNlIHRvIHJlbGF4X3NlZ21lbnQuICAqLwotCi0vKiBGSVhNRTogQnVpbGQgdGFibGUgYnkgaGFuZCwgZ2V0IGl0IHdvcmtpbmcsIHRoZW4gbWFjaGluZSBnZW5lcmF0ZS4gICovCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotLyogVGhlIGZpZWxkcyBhcmU6Ci0gICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLiAgKi8KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgbXVzdCBiZSB1bnVzZWQgYmVjYXVzZSBhbiBgcmx4X21vcmUnIHZhbHVlIG9mIHplcm8gZW5kcwotICAgICBlYWNoIGxpc3QuICAqLwotICB7MSwgMSwgMCwgMH0sCi0KLSAgLyogVGhlIGRpc3BsYWNlbWVudCB1c2VkIGJ5IEdBUyBpcyBmcm9tIHRoZSBlbmQgb2YgdGhlIDIgYnl0ZSBpbnNuLAotICAgICBzbyB3ZSBzdWJ0cmFjdCAyIGZyb20gdGhlIGZvbGxvd2luZy4gICovCi0gIC8qIDE2IGJpdCBpbnNuLCA4IGJpdCBkaXNwIC0+IDEwIGJpdCByYW5nZS4KLSAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSBhIGJyYW5jaCBpbiB0aGUgcmlnaHQgc2xvdCBhdCB0aGUgYm9yZGVyOgotICAgICB0aGUgIiYgLTQiIGlzbid0IHRha2VuIGludG8gYWNjb3VudC4gIEl0J3Mgbm90IGltcG9ydGFudCBlbm91Z2ggdG8KLSAgICAgY29tcGxpY2F0ZSB0aGluZ3Mgb3ZlciBpdCwgc28gd2Ugc3VidHJhY3QgYW4gZXh0cmEgMiAob3IgKyAyIGluIC12ZQotICAgICBjYXNlKS4gICovCi0gIHs1MTEgLSAyIC0gMiwgLTUxMiAtIDIgKyAyLCAwLCAyIH0sCi0gIC8qIDMyIGJpdCBpbnNuLCAyNCBiaXQgZGlzcCAtPiAyNiBiaXQgcmFuZ2UuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCAyLCAwIH0sCi0gIC8qIFNhbWUgdGhpbmcsIGJ1dCB3aXRoIGxlYWRpbmcgbm9wIGZvciBhbGlnbm1lbnQuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCA0LCAwIH0KLX07Ci0KLWxvbmcKLW0zMnJfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICogZnJhZ1A7Ci0gICAgIGxvbmcgICAgc3RyZXRjaDsKLXsKLSAgLyogQWRkcmVzcyBvZiBicmFuY2ggaW5zbi4gICovCi0gIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0gIGxvbmcgZ3Jvd3RoID0gMDsKLQotICAvKiBLZWVwIDMyIGJpdCBpbnNucyBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgPT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7Ci0JICBncm93dGggPSAtMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZ3Jvd3RoID0gcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotCi0gICAgICAvKiBMb25nIGp1bXAgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5PyAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyICYmIChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggKz0gMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBncm93dGg7Ci19Ci0KLS8qIFJldHVybiBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBsZW5ndGggYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8KLSAgIGhvbGQgYSBicmFuY2ggdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uLgotICAgQWxzbyB1cGRhdGVzIGZyX3R5cGUvZnJfc3VidHlwZSBhcyBuZWNlc3NhcnkuCi0KLSAgIENhbGxlZCBqdXN0IGJlZm9yZSBkb2luZyByZWxheGF0aW9uLgotICAgQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCi0gICBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gICBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICAgQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICAgMCB2YWx1ZS4gICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBzZWdUICAgIHNlZ21lbnQ7Ci17Ci0gIGludCAgICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBUaGUgb25seSB0aGluZyB3ZSBoYXZlIHRvIGhhbmRsZSBoZXJlIGFyZSBzeW1ib2xzIG91dHNpZGUgb2YgdGhlCi0gICAgIGN1cnJlbnQgc2VnbWVudC4gIFRoZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGluCi0gICAgIHdoaWNoIGNhc2UgbGlua2VyIHNjcmlwdHMgbWF5IHBsYWNlIHRoZW0gYW55d2hlcmUuCi0gICAgIEhvd2V2ZXIsIHdlIGNhbid0IGZpbmlzaCB0aGUgZnJhZ21lbnQgaGVyZSBhbmQgZW1pdCB0aGUgcmVsb2MgYXMgaW5zbgotICAgICBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG1heSBtb3ZlIHRoZSBpbnNuIGFib3V0LiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQuCi0JIENoYW5nZSB0aGUgcmVsYXhhdGlvbiBzdWJ0eXBlIHRvIHRoZSBtYXggYWxsb3dhYmxlIGFuZCBsZWF2ZQotCSBhbGwgZnVydGhlciBoYW5kbGluZyB0byBtZF9jb252ZXJ0X2ZyYWcuICAqLwotICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCi0jaWYgMCAvKiBDYW4ndCB1c2UgdGhpcywgYnV0IGxlYXZlIGluIGZvciBpbGx1c3RyYXRpb24uICAqLyAgICAgCi0gICAgICAvKiBDaGFuZ2UgMTYgYml0IGluc24gdG8gMzIgYml0IGluc24uICAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSB8PSAweDgwOwotCi0gICAgICAvKiBJbmNyZWFzZSBrbm93biAoZml4ZWQpIHNpemUgb2YgZnJhZ21lbnQuICAqLwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCi0gICAgICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSAvKiBwY3JlbCAqLywKLQkgICAgICAgLyogRklYTUU6IENhbid0IHVzZSBhIHJlYWwgQkZEIHJlbG9jIGhlcmUuCi0JCSAgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyBjYW4ndCBoYW5kbGUgaXQuICAqLwotCSAgICAgICBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTCk7Ci0KLSAgICAgIC8qIE1hcmsgdGhpcyBmcmFnbWVudCBhcyBmaW5pc2hlZC4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLSNlbHNlCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLQlpbnQgICAgICAgICAgICAgICBpOwotCi0JLyogVXBkYXRlIHRoZSByZWNvcmRlZCBpbnNuLgotCSAgIEZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgdG8gbG9vayB2ZXJ5IGZhci4KLQkgICBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gcmVjb3JkIGluIHRoZSBpbnN0cnVjdGlvbiB0aGUgbmV4dCBoaWdoZXIKLQkgICByZWxheGFibGUgaW5zbiB0byB1c2UuICAqLwotCWZvciAoaSA9IDAsIGluc24gPSBmcmFnUC0+ZnJfY2dlbi5pbnNuOyBpIDwgNDsgaSsrLCBpbnNuKyspCi0JICB7Ci0JICAgIGlmICgoc3RyY21wIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pLAotCQkJIENHRU5fSU5TTl9NTkVNT05JQyAoZnJhZ1AtPmZyX2NnZW4uaW5zbikpCi0JCSA9PSAwKQotCQkmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSkKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoaSA9PSA0KQotCSAgYWJvcnQgKCk7Ci0KLQlmcmFnUC0+ZnJfY2dlbi5pbnNuID0gaW5zbjsKLQlyZXR1cm4gMjsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19IAotCi0vKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCi0gICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplLgotCi0gICBDYWxsZWQgYWZ0ZXIgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZC4KLSAgIGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICAgZnJhZ1AtPmZyX3N1YnR5cGUgaXMgdGhlIHN1YnR5cGUgb2Ygd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKiAgIGFiZmQ7Ci0gIHNlZ1QgICAgc2VjOwotICBmcmFnUyAqIGZyYWdQOwotewotICBjaGFyICogb3Bjb2RlOwotICBjaGFyICogZGlzcGxhY2VtZW50OwotICBpbnQgICAgdGFyZ2V0X2FkZHJlc3M7Ci0gIGludCAgICBvcGNvZGVfYWRkcmVzczsKLSAgaW50ICAgIGV4dGVuc2lvbjsKLSAgaW50ICAgIGFkZGVuZDsKLQotICBvcGNvZGUgPSBmcmFnUC0+ZnJfb3Bjb2RlOwotCi0gIC8qIEFkZHJlc3Mgb3Bjb2RlIHJlc2lkZXMgYXQgaW4gZmlsZSBzcGFjZS4gICovCi0gIG9wY29kZV9hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4IC0gMjsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIDEgOgotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyIDoKLSAgICAgIG9wY29kZVswXSB8PSAweDgwOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzIDoKLSAgICAgIG9wY29kZVsyXSA9IG9wY29kZVswXSB8IDB4ODA7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKG9wY29kZSwgUEFSX05PUF9JTlNOLCAyKTsKLSAgICAgIG9wY29kZV9hZGRyZXNzICs9IDI7Ci0gICAgICBleHRlbnNpb24gPSA0OwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbM107Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQotICAgIHsKLSAgICAgIC8qIHN5bWJvbCBtdXN0IGJlIHJlc29sdmVkIGJ5IGxpbmtlciAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9vZmZzZXQgJiAzKQotCWFzX3dhcm4gKF8oIkFkZGVuZCB0byB1bnJlc29sdmVkIHN5bWJvbCBub3Qgb24gd29yZCBib3VuZGFyeS4iKSk7Ci0gICAgICBhZGRlbmQgPSBmcmFnUC0+ZnJfb2Zmc2V0ID4+IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQWRkcmVzcyB3ZSB3YW50IHRvIHJlYWNoIGluIGZpbGUgc3BhY2UuICAqLwotICAgICAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICAgICAgdGFyZ2V0X2FkZHJlc3MgKz0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzczsKLSAgICAgIGFkZGVuZCA9ICh0YXJnZXRfYWRkcmVzcyAtIChvcGNvZGVfYWRkcmVzcyAmIC00KSkgPj4gMjsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGEgcmVsb2NhdGlvbiBmb3Igc3ltYm9scyB0aGF0IG11c3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGxpbmtlci4KLSAgICAgT3RoZXJ3aXNlIG91dHB1dCB0aGUgY29tcGxldGVkIGluc24uICAqLwotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWMpCi0gICAgewotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfc3VidHlwZSAhPSAxKTsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2NnZW4uaW5zbiAhPSAwKTsKLSAgICAgIGdhc19jZ2VuX3JlY29yZF9maXh1cCAoZnJhZ1AsCi0JCQkgICAgIC8qIE9mZnNldCBvZiBicmFuY2ggaW5zbiBpbiBmcmFnLiAgKi8KLQkJCSAgICAgZnJhZ1AtPmZyX2ZpeCArIGV4dGVuc2lvbiAtIDQsCi0JCQkgICAgIGZyYWdQLT5mcl9jZ2VuLmluc24sCi0JCQkgICAgIDQgLypsZW5ndGgqLywKLQkJCSAgICAgLyogRklYTUU6IHF1aWNrIGhhY2sgKi8KLSNpZiAwCi0JCQkgICAgIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywKLQkJCQkJCQkgZnJhZ1AtPmZyX2NnZW4ub3BpbmRleCksCi0jZWxzZQotCQkJICAgICBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsCi0JCQkJCQkJIE0zMlJfT1BFUkFORF9ESVNQMjQpLAotI2VuZGlmCi0JCQkgICAgIGZyYWdQLT5mcl9jZ2VuLm9waW5mbywKLQkJCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCk7Ci0gICAgfQotCi0jZGVmaW5lIFNJWkVfRlJPTV9SRUxBWF9TVEFURShuKSAoKG4pID09IDEgPyAxIDogMykKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKGRpc3BsYWNlbWVudCwgKHZhbHVlVCkgYWRkZW5kLAotCQkgICAgICBTSVpFX0ZST01fUkVMQVhfU1RBVEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSk7Ci0KLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19Ci0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWMpCi0gICAgIGZpeFMgKiBmaXhQOwotICAgICBzZWdUICAgc2VjOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWMpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIChvciBpcyBkZWZpbmVkIGJ1dCBub3QgaW4gdGhpcyBzZWN0aW9uKS4KLQkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUpICYgLTRMOwotfQotCi0vKiBSZXR1cm4gdGhlIGJmZCByZWxvYyB0eXBlIGZvciBPUEVSQU5EIG9mIElOU04gYXQgZml4dXAgRklYUC4KLSAgIFJldHVybnMgQkZEX1JFTE9DX05PTkUgaWYgbm8gcmVsb2MgdHlwZSBjYW4gYmUgZm91bmQuCi0gICAqRklYUCBtYXkgYmUgbW9kaWZpZWQgaWYgZGVzaXJlZC4gICovCi0KLWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGZpeFMgKiAgICAgICAgICAgICAgIGZpeFA7Ci17Ci0gIHN3aXRjaCAob3BlcmFuZC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOiByZXR1cm4gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6IHJldHVybiBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTDsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOiByZXR1cm4gQkZEX1JFTE9DX00zMlJfMjZfUENSRUw7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDogcmV0dXJuIEJGRF9SRUxPQ19NMzJSXzI0OwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICAvKiBJZiBsb3cvaGlnaC9zaGlnaC9zZGEgd2FzIHVzZWQsIGl0IGlzIHJlY29yZGVkIGluIGBvcGluZm8nLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9jZ2VuLm9waW5mbyAhPSAwKQotCXJldHVybiBmaXhQLT5meF9jZ2VuLm9waW5mbzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOiAvKiBhdm9pZCAtV2FsbCB3YXJuaW5nICovCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyogUmVjb3JkIGEgSEkxNiByZWxvYyBmb3IgbGF0ZXIgbWF0Y2hpbmcgd2l0aCBpdHMgTE8xNiBjb3VzaW4uICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9yZWNvcmRfaGkxNiAocmVsb2NfdHlwZSwgZml4UCwgc2VnKQotICAgICBpbnQgICAgcmVsb2NfdHlwZTsKLSAgICAgZml4UyAqIGZpeFA7Ci0gICAgIHNlZ1QgICBzZWc7Ci17Ci0gIHN0cnVjdCBtMzJyX2hpX2ZpeHVwICogaGlfZml4dXA7Ci0KLSAgYXNzZXJ0IChyZWxvY190eXBlID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi0JICB8fCByZWxvY190eXBlID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKTsKLQotICBoaV9maXh1cCA9ICgoc3RydWN0IG0zMnJfaGlfZml4dXAgKikKLQkgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtMzJyX2hpX2ZpeHVwKSkpOwotICBoaV9maXh1cC0+Zml4cCA9IGZpeFA7Ci0gIGhpX2ZpeHVwLT5zZWcgID0gbm93X3NlZzsKLSAgaGlfZml4dXAtPm5leHQgPSBtMzJyX2hpX2ZpeHVwX2xpc3Q7Ci0gIAotICBtMzJyX2hpX2ZpeHVwX2xpc3QgPSBoaV9maXh1cDsKLX0KLQotLyogQ2FsbGVkIHdoaWxlIHBhcnNpbmcgYW4gaW5zdHJ1Y3Rpb24gdG8gY3JlYXRlIGEgZml4dXAuCi0gICBXZSBuZWVkIHRvIGNoZWNrIGZvciBISTE2IHJlbG9jcyBhbmQgcXVldWUgdGhlbSB1cCBmb3IgbGF0ZXIgc29ydGluZy4gICovCi0KLWZpeFMgKgotbTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHAgKGZyYWcsIHdoZXJlLCBpbnNuLCBsZW5ndGgsIG9wZXJhbmQsIG9waW5mbywgZXhwKQotICAgICBmcmFnUyAqICAgICAgICAgICAgICBmcmFnOwotICAgICBpbnQgICAgICAgICAgICAgICAgICB3aGVyZTsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogICAgaW5zbjsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICBjb25zdCBDR0VOX09QRVJBTkQgKiBvcGVyYW5kOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBvcGluZm87Ci0gICAgIGV4cHJlc3Npb25TICogICAgICAgIGV4cDsKLXsKLSAgZml4UyAqIGZpeFAgPSBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnLCB3aGVyZSwgaW5zbiwgbGVuZ3RoLAotCQkJCQkgICBvcGVyYW5kLCBvcGluZm8sIGV4cCk7Ci0KLSAgc3dpdGNoIChvcGVyYW5kLT50eXBlKQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIC8qIElmIGxvdy9oaWdoL3NoaWdoL3NkYSB3YXMgdXNlZCwgaXQgaXMgcmVjb3JkZWQgaW4gYG9waW5mbycuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2NnZW4ub3BpbmZvID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi0JICB8fCBmaXhQLT5meF9jZ2VuLm9waW5mbyA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTykKLQltMzJyX3JlY29yZF9oaTE2IChmaXhQLT5meF9jZ2VuLm9waW5mbywgZml4UCwgbm93X3NlZyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDogLyogYXZvaWQgLVdhbGwgd2FybmluZyAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmaXhQOwotfQotCi0vKiBSZXR1cm4gQkZEIHJlbG9jIHR5cGUgZnJvbSBvcGluZm8gZmllbGQgaW4gYSBmaXhTLgotICAgSXQncyB0cmlja3kgdXNpbmcgZnhfcl90eXBlIGluIG0zMnJfZnJvYl9maWxlIGJlY2F1c2UgdGhlIHZhbHVlcwotICAgYXJlIEJGRF9SRUxPQ19VTlVTRUQgKyBvcGVyYW5kIG51bWJlci4gICovCi0jZGVmaW5lIEZYX09QSU5GT19SX1RZUEUoZikgKChmKS0+ZnhfY2dlbi5vcGluZm8pCi0KLS8qIFNvcnQgYW55IHVubWF0Y2hlZCBISTE2IHJlbG9jcyBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZQotICAgdGhlIGNvcnJlc3BvbmRpbmcgTE8xNiByZWxvYy4gIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBtZF9hcHBseV9maXggYW5kCi0gICB0Y19nZW5fcmVsb2MuICAqLwotCi12b2lkCi1tMzJyX2Zyb2JfZmlsZSAoKQotewotICBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIGw7Ci0KLSAgZm9yIChsID0gbTMycl9oaV9maXh1cF9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHNlZ21lbnRfaW5mb190eXBlICogc2VnaW5mbzsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgcGFzczsKLQotICAgICAgYXNzZXJ0IChGWF9PUElORk9fUl9UWVBFIChsLT5maXhwKSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotCSAgICAgIHx8IEZYX09QSU5GT19SX1RZUEUgKGwtPmZpeHApID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKTsKLQotICAgICAgLyogQ2hlY2sgcXVpY2tseSB3aGV0aGVyIHRoZSBuZXh0IGZpeHVwIGhhcHBlbnMgdG8gYmUgYSBtYXRjaGluZyBsb3cuICAqLwotICAgICAgaWYgKGwtPmZpeHAtPmZ4X25leHQgIT0gTlVMTAotCSAgJiYgRlhfT1BJTkZPX1JfVFlQRSAobC0+Zml4cC0+ZnhfbmV4dCkgPT0gQkZEX1JFTE9DX00zMlJfTE8xNgotCSAgJiYgbC0+Zml4cC0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+ZnhfYWRkc3kKLQkgICYmIGwtPmZpeHAtPmZ4X29mZnNldCA9PSBsLT5maXhwLT5meF9uZXh0LT5meF9vZmZzZXQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgZml4dXBzIGZvciB0aGlzIHNlZ21lbnQgZm9yIGEgbWF0Y2hpbmcgYGxvdycuCi0gICAgICAgICBXaGVuIHdlIGZpbmQgb25lLCBtb3ZlIHRoZSBoaWdoL3NoaWdoIGp1c3QgaW4gZnJvbnQgb2YgaXQuICBXZSBkbwotICAgICAgICAgdGhpcyBpbiB0d28gcGFzc2VzLiAgSW4gdGhlIGZpcnN0IHBhc3MsIHdlIHRyeSB0byBmaW5kIGEKLSAgICAgICAgIHVuaXF1ZSBgbG93Jy4gIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgcGVybWl0IG11bHRpcGxlIGhpZ2gncwotICAgICAgICAgcmVsb2NzIGZvciBhIHNpbmdsZSBgbG93Jy4gICovCi0gICAgICBzZWdpbmZvID0gc2VnX2luZm8gKGwtPnNlZyk7Ci0gICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKQotCXsKLQkgIGZpeFMgKiBmOwotCSAgZml4UyAqIHByZXY7Ci0KLQkgIHByZXYgPSBOVUxMOwotCSAgZm9yIChmID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGYgIT0gTlVMTDsgZiA9IGYtPmZ4X25leHQpCi0JICAgIHsKLQkgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBgbG93JyBmaXh1cCB3aGljaCBtYXRjaGVzIGwtPmZpeHAuICAqLwotCSAgICAgIGlmIChGWF9PUElORk9fUl9UWVBFIChmKSA9PSBCRkRfUkVMT0NfTTMyUl9MTzE2Ci0JCSAgJiYgZi0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfYWRkc3kKLQkJICAmJiBmLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+Znhfb2Zmc2V0Ci0JCSAgJiYgKHBhc3MgPT0gMQotCQkgICAgICB8fCBwcmV2ID09IE5VTEwKLQkJICAgICAgfHwgKEZYX09QSU5GT19SX1RZUEUgKHByZXYpICE9IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi0JCQkgICYmIEZYX09QSU5GT19SX1RZUEUgKHByZXYpICE9IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKQotCQkgICAgICB8fCBwcmV2LT5meF9hZGRzeSAhPSBmLT5meF9hZGRzeQotCQkgICAgICB8fCBwcmV2LT5meF9vZmZzZXQgIT0gIGYtPmZ4X29mZnNldCkpCi0JCXsKLQkJICBmaXhTICoqIHBmOwotCi0JCSAgLyogTW92ZSBsLT5maXhwIGJlZm9yZSBmLiAgKi8KLQkJICBmb3IgKHBmID0gJnNlZ2luZm8tPmZpeF9yb290OwotCQkgICAgICAgKiBwZiAhPSBsLT5maXhwOwotCQkgICAgICAgcGYgPSAmICgqIHBmKS0+ZnhfbmV4dCkKLQkJICAgIGFzc2VydCAoKiBwZiAhPSBOVUxMKTsKLQotCQkgICogcGYgPSBsLT5maXhwLT5meF9uZXh0OwotCi0JCSAgbC0+Zml4cC0+ZnhfbmV4dCA9IGY7Ci0JCSAgaWYgKHByZXYgPT0gTlVMTCkKLQkJICAgIHNlZ2luZm8tPmZpeF9yb290ID0gbC0+Zml4cDsKLQkJICBlbHNlCi0JCSAgICBwcmV2LT5meF9uZXh0ID0gbC0+Zml4cDsKLQotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBwcmV2ID0gZjsKLQkgICAgfQotCi0JICBpZiAoZiAhPSBOVUxMKQotCSAgICBicmVhazsKLQotCSAgaWYgKHBhc3MgPT0gMQotCSAgICAgICYmIHdhcm5fdW5tYXRjaGVkX2hpZ2gpCi0JICAgIGFzX3dhcm5fd2hlcmUgKGwtPmZpeHAtPmZ4X2ZpbGUsIGwtPmZpeHAtPmZ4X2xpbmUsCi0JCQkgICBfKCJVbm1hdGNoZWQgaGlnaC9zaGlnaCByZWxvYyIpKTsKLQl9Ci0gICAgfQotfQotCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi0KLWludAotbTMycl9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKiBmaXg7Ci17Ci0gIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKCEgbTMycl9yZWxheCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGZpeC0+ZnhfcGNyZWwKLQkgIHx8IDAgLyogPz8/ICovKTsKLX0KLQwKLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGVuZGlhbm5lc3MuICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICogYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgICAgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50ICAgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICAgIHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFICAgd29yZHMgW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqICAgICAgICAgICB0OwotICBjaGFyICogICAgICAgICAgIGF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgLyogRklYTUU6IFNvbWUgdGFyZ2V0cyBhbGxvdyBvdGhlciBmb3JtYXQgY2hhcnMgZm9yIGJpZ2dlciBzaXplcyBoZXJlLiAgKi8KLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqIHNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICogc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0KLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLAotCQkJICAgICAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCSAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCkKLXsKLSAgLyogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgYSBzZWN0aW9uIGFuZCB3ZSBoYXZlIGp1c3QgZW1pdHRlZCBhCi0gICAgIDE2IGJpdCBpbnNuLCB0aGVuIGVtaXQgYSBub3AgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlY3Rpb24gZW5kcyBvbgotICAgICBhIDMyIGJpdCBib3VuZGFyeS4gICovCi0gIAotICBpZiAocHJldl9pbnNuLmluc24gfHwgc2Vlbl9yZWxheGFibGVfcCkKLSAgICAodm9pZCkgbTMycl9maWxsX2luc24gKDApOwotfQotCi1ib29sZWFuCi1tMzJyX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqZml4UDsKLXsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW0zMnIuaCBiL2dhcy9jb25maWcvdGMtbTMyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNmY2ExLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTMyci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qIHRjLW0zMnIuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtbTMyci5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfTTMyUgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGxlYWRpbmcgc3BhY2Ugc28gd2lsbCBjb21waWxlIHdpdGggY2MgKi8KLSAjZXJyb3IgTTMyUiBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJNMzJSIEdBUyAiCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX20zMnIKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tMzJyIgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi1sb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykgICAKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIEZvciA4IHZzIDE2IHZzIDMyIGJpdCBicmFuY2ggc2VsZWN0aW9uLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0jaWYgMAotZXh0ZXJuIHZvaWQgbTMycl9wcmVwYXJlX3JlbGF4X3NjYW4gKCk7Ci0jZGVmaW5lIG1kX3ByZXBhcmVfcmVsYXhfc2NhbihmcmFnUCwgYWRkcmVzcywgYWltLCB0aGlzX3N0YXRlLCB0aGlzX3R5cGUpIFwKLW0zMnJfcHJlcGFyZV9yZWxheF9zY2FuIChmcmFnUCwgYWRkcmVzcywgYWltLCB0aGlzX3N0YXRlLCB0aGlzX3R5cGUpCi0jZWxzZQotZXh0ZXJuIGxvbmcgbTMycl9yZWxheF9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGxvbmcpKTsKLSNkZWZpbmUgbWRfcmVsYXhfZnJhZyhmcmFnUCwgc3RyZXRjaCkgXAotbTMycl9yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCkKLSNlbmRpZgotLyogQWNjb3VudCBmb3Igbm9wIGlmIDMyIGJpdCBpbnNuIGZhbGxzIG9uIG9kZCBoYWxmd29yZCBib3VuZGFyeS4gICovCi0jZGVmaW5lIFRDX0NHRU5fTUFYX1JFTEFYKGluc24sIGxlbikgKDYpCi0KLS8qIEFsaWdubWVudHMgYXJlIHVzZWQgdG8gZW5zdXJlIDMyIGJpdCBpbnNucyBsaXZlIG9uIDMyIGJpdCBib3VuZGFyaWVzLCBzbwotICAgd2UgdXNlIGEgc3BlY2lhbCBhbGlnbm1lbnQgZnVuY3Rpb24gdG8gaW5zZXJ0IHRoZSBjb3JyZWN0IG5vcCBwYXR0ZXJuLiAgKi8KLWV4dGVybiBpbnQgbTMycl9kb19hbGlnbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLSNkZWZpbmUgbWRfZG9fYWxpZ24obiwgZmlsbCwgbGVuLCBtYXgsIGwpIFwKLWlmIChtMzJyX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkpIGdvdG8gbAotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgbWRfYXBwbHlfZml4MyBnYXNfY2dlbl9tZF9hcHBseV9maXgzCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIG0zMnJfZml4X2FkanVzdGFibGUoZml4UCkKLQotLyogQWZ0ZXIgY3JlYXRpbmcgYSBmaXh1cCBmb3IgYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCwgd2UgbmVlZCB0byBjaGVjayBmb3IKLSAgIEhJMTYgcmVsb2NzIGFuZCBxdWV1ZSB0aGVtIHVwIGZvciBsYXRlciBzb3J0aW5nLiAgKi8KLSNkZWZpbmUgbWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwIG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwCi0KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNkZWZpbmUgdGNfZ2VuX3JlbG9jIGdhc19jZ2VuX3RjX2dlbl9yZWxvYwotCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZSgpIG0zMnJfZnJvYl9maWxlICgpCi1leHRlcm4gdm9pZCBtMzJyX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gZW1pdCB2YXJpb3VzIHJlbG9jcyB3ZSBvdGhlcndpc2Ugd291bGRuJ3QuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgbTMycl9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IG0zMnJfZm9yY2VfcmVsb2NhdGlvbiAoKTsKLQotLyogRW5zdXJlIGluc25zIGF0IGxhYmVscyBhcmUgYWxpZ25lZCB0byAzMiBiaXQgYm91bmRhcmllcy4gICovCi1pbnQgbTMycl9maWxsX2luc24gUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIG1kX2FmdGVyX3Bhc3NfaG9vaygpCW0zMnJfZmlsbF9pbnNuICgxKQotI2RlZmluZSBUQ19TVEFSVF9MQUJFTChjaCwgcHRyKQkoY2ggPT0gJzonICYmIG0zMnJfZmlsbF9pbnNuICgwKSkKLQotLyogQWRkIGV4dHJhIE0zMlIgc2VjdGlvbnMuICAqLwotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5zZGF0YSIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5zYnNzIiwJCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LAotCi0jZGVmaW5lIG1kX2NsZWFudXAgICAgICAgICAgICAgICAgIG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotZXh0ZXJuIHZvaWQgbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsgICAgCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW02ODg1MS5oIGIvZ2FzL2NvbmZpZy90Yy1tNjg4NTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZDc0MS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW02ODg1MS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1tNjg4NTEuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogcG1tdS5oCi0gKi8KLQotLyogSSBzdXBwb3NlIHdlIGhhdmUgdG8gY29weXJpZ2h0IHRoaXMgZmlsZS4gIFNvbWVvbmUgb24gdGhlIG5ldCBzZW50IGl0Ci0gICB0byB1cyBhcyBwYXJ0IG9mIHRoZSBjaGFuZ2VzIGZvciB0aGUgbTY4ODUxIE1lbW9yeSBNYW5hZ2VtZW50IFVuaXQgKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHYXMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBUaGUgR05VIGFzc2VtYmxlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLiAgTm8gYXV0aG9yIG9yIGRpc3RyaWJ1dG9yCi0gICBhY2NlcHRzIHJlc3BvbnNpYmlsaXR5IHRvIGFueW9uZSBmb3IgdGhlIGNvbnNlcXVlbmNlcyBvZiB1c2luZyBpdAotICAgb3IgZm9yIHdoZXRoZXIgaXQgc2VydmVzIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igd29ya3MgYXQgYWxsLAotICAgdW5sZXNzIGhlIHNheXMgc28gaW4gd3JpdGluZy4gIFJlZmVyIHRvIHRoZSBHTlUgQXNzZW1ibGVyIEdlbmVyYWwKLSAgIFB1YmxpYyBMaWNlbnNlIGZvciBmdWxsIGRldGFpbHMuCi0gICAKLSAgIEV2ZXJ5b25lIGlzIGdyYW50ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZQotICAgdGhlIEdOVSBBc3NlbWJsZXIsIGJ1dCBvbmx5IHVuZGVyIHRoZSBjb25kaXRpb25zIGRlc2NyaWJlZCBpbiB0aGUKLSAgIEdOVSBBc3NlbWJsZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UgaXMKLSAgIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCB0aGUgR05VIEFzc2VtYmxlcgotICAgc28geW91IGNhbiBrbm93IHlvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlCi0gICBpbiBhIGZpbGUgbmFtZWQgQ09QWUlORy4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodAotICAgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLiAgKi8KLQotI2lmZGVmIG02ODg1MQotCi0vKgotICBJIGRpZG4ndCB1c2UgbXVjaCBpbWFnaW5hdGlvbiBpbiBjaG9vc2luZyB0aGUgCi0gIGZvbGxvd2luZyBjb2Rlcywgc28gbWFueSBvZiB0aGVtIGFyZW4ndCB2ZXJ5Ci0gIG1uZW1vbmljLiAtcmFiCi0gIAotICBQICBwbW11IHJlZ2lzdGVyCi0gIFBvc3NpYmxlIHZhbHVlczoKLSAgMDAwCVRDCVRyYW5zbGF0aW9uIENvbnRyb2wgcmVnCi0gIDEwMAlDQUwJQ3VycmVudCBBY2Nlc3MgTGV2ZWwKLSAgMTAxCVZBTAlWYWxpZGF0ZSBBY2Nlc3MgTGV2ZWwKLSAgMTEwCVNDQwlTdGFjayBDaGFuZ2UgQ29udHJvbAotICAxMTEJQUMJQWNjZXNzIENvbnRyb2wKLSAgCi0gIFcgIHdpZGUgcG1tdSByZWdpc3RlcnMKLSAgUG9zc2libGUgdmFsdWVzOgotICAwMDEJRFJQCURtYSBSb290IFBvaW50ZXIKLSAgMDEwCVNSUAlTdXBlcnZpc29yIFJvb3QgUG9pbnRlcgotICAwMTEJQ1JQCUNwdSBSb290IFBvaW50ZXIKLSAgCi0gIGYJZnVuY3Rpb24gY29kZSByZWdpc3RlcgotICAwCVNGQwotICAxCURGQwotICAKLSAgVglWQUwgcmVnaXN0ZXIgb25seQotICAKLSAgWAlCQUR4LCBCQUN4Ci0gIDEwMAlCQUQJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBEYXRhCi0gIDEwMQlCQUMJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBDb250cm9sCi0gIAotICBZCVBTUgotICBaCVBDU1IKLSAgCi0gIHwJbWVtb3J5IAkJKG1vZGVzIDItNiwgNy4qKQotICAKLSAgKi8KLQotLyoKLSAqIHRoZXNlIGRlZmluZXMgc2hvdWxkIGJlIGluIG02OGsuYyBidXQKLSAqIGkgcHV0IHRoZW0gaGVyZSB0byBrZWVwIGFsbCB0aGUgbTY4ODUxIHN0dWZmCi0gKiB0b2dldGhlciAtcmFiCi0gKiBKRi0tTWFrZSBzdXJlIHRoZXNlICNzIGRvbid0IGNsYXNoIHdpdGggdGhlIG9uZXMgaW4gbTY4ay5jCi0gKiBUaGF0IHdvdWxkIGJlIEJBRC4KLSAqLwotI2RlZmluZSBUQwkoRlBTKzEpCQkvKiA0OCAqLwotI2RlZmluZSBEUlAJKFRDKzEpCQkvKiA0OSAqLwotI2RlZmluZSBTUlAJKERSUCsxKQkJLyogNTAgKi8KLSNkZWZpbmUgQ1JQCShTUlArMSkJCS8qIDUxICovCi0jZGVmaW5lIENBTAkoQ1JQKzEpCQkvKiA1MiAqLwotI2RlZmluZSBWQUwJKENBTCsxKQkJLyogNTMgKi8KLSNkZWZpbmUgU0NDCShWQUwrMSkJCS8qIDU0ICovCi0jZGVmaW5lIEFDCShTQ0MrMSkJCS8qIDU1ICovCi0jZGVmaW5lIEJBRAkoQUMrMSkJCS8qIDU2LDU3LDU4LDU5LCA2MCw2MSw2Miw2MyAqLwotI2RlZmluZSBCQUMJKEJBRCs4KQkJLyogNjQsNjUsNjYsNjcsIDY4LDY5LDcwLDcxICovCi0jZGVmaW5lIFBTUgkoQkFDKzgpCQkvKiA3MiAqLwotI2RlZmluZSBQQ1NSCShQU1IrMSkJCS8qIDczICovCi0KLS8qIG5hbWUgKi8JLyogb3Bjb2RlICovCQkvKiBtYXRjaCAqLwkJLyogYXJncyAqLwotCi17InBiYWMiLAlvbmUoMHhmMGM3KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYWN3IiwJb25lKDB4ZjA4NyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmFzIiwJb25lKDB4ZjBjNiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmFzdyIsCW9uZSgweGYwODYpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJiYyIsCW9uZSgweGYwYzEpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJiY3ciLAlvbmUoMHhmMDgxKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYnMiLAlvbmUoMHhmMGMwKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYnN3IiwJb25lKDB4ZjA4MCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmNjIiwJb25lKDB4ZjBjZiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmNjdyIsCW9uZSgweGYwOGYpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjcyIsCW9uZSgweGYwY2UpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjc3ciLAlvbmUoMHhmMDhlKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiZ2MiLAlvbmUoMHhmMGNkKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiZ2N3IiwJb25lKDB4ZjA4ZCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdzIiwJb25lKDB4ZjBjYyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdzdyIsCW9uZSgweGYwOGMpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJpYyIsCW9uZSgweGYwY2IpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJpY3ciLAlvbmUoMHhmMDhiKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaXMiLAlvbmUoMHhmMGNhKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaXN3IiwJb25lKDB4ZjA4YSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmxjIiwJb25lKDB4ZjBjMyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmxjdyIsCW9uZSgweGYwODMpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJscyIsCW9uZSgweGYwYzIpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJsc3ciLAlvbmUoMHhmMDgyKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBic2MiLAlvbmUoMHhmMGM1KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBic2N3IiwJb25lKDB4ZjA4NSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNzIiwJb25lKDB4ZjBjNCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNzdyIsCW9uZSgweGYwODQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJ3YyIsCW9uZSgweGYwYzkpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJ3Y3ciLAlvbmUoMHhmMDg5KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid3MiLAlvbmUoMHhmMGM4KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid3N3IiwJb25lKDB4ZjA4OCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAotICAgIAotICAgIAoteyJwZGJhYyIsCXR3bygweGYwNDgsIDB4MDAwNyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmFzIiwJdHdvKDB4ZjA0OCwgMHgwMDA2KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiYmMiLAl0d28oMHhmMDQ4LCAweDAwMDEpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJicyIsCXR3bygweGYwNDgsIDB4MDAwMCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmNjIiwJdHdvKDB4ZjA0OCwgMHgwMDBmKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiY3MiLAl0d28oMHhmMDQ4LCAweDAwMGUpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJnYyIsCXR3bygweGYwNDgsIDB4MDAwZCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmdzIiwJdHdvKDB4ZjA0OCwgMHgwMDBjKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiaWMiLAl0d28oMHhmMDQ4LCAweDAwMGIpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJpcyIsCXR3bygweGYwNDgsIDB4MDAwYSksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmxjIiwJdHdvKDB4ZjA0OCwgMHgwMDAzKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRibHMiLAl0d28oMHhmMDQ4LCAweDAwMDIpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJzYyIsCXR3bygweGYwNDgsIDB4MDAwNSksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYnNzIiwJdHdvKDB4ZjA0OCwgMHgwMDA0KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRid2MiLAl0d28oMHhmMDQ4LCAweDAwMDkpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJ3cyIsCXR3bygweGYwNDgsIDB4MDAwOCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi0gICAgCi17InBmbHVzaGEiLAl0d28oMHhmMDAwLCAweDI0MDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIiB9LAotICAgIAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDMwMTApLAl0d28oMHhmZmMwLCAweGZlMTApLAkiVDNUOSIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzODEwKSwJdHdvKDB4ZmZjMCwgMHhmZTEwKSwJIlQzVDkmcyIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZTE4KSwJIkQzVDkiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzgwOCksCXR3bygweGZmYzAsIDB4ZmUxOCksCSJEM1Q5JnMiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzAwMCksCXR3bygweGZmYzAsIDB4ZmUxZSksCSJmM1Q5IiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDM4MDApLAl0d28oMHhmZmMwLCAweGZlMWUpLAkiZjNUOSZzIiB9LAotICAgIAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDEwKSwJdHdvKDB4ZmZmOCwgMHhmZTEwKSwJIlQzVDkiIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDApLAl0d28oMHhmZmY4LCAweGZlMDApLAkiVDNUOSZzIiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDA4KSwJdHdvKDB4ZmZmOCwgMHhmZTE4KSwJIkQzVDkiIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDgpLAl0d28oMHhmZmY4LCAweGZlMTgpLAkiRDNUOSZzIiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDAwKSwJdHdvKDB4ZmZmOCwgMHhmZTFlKSwJImYzVDkiIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDApLAl0d28oMHhmZmY4LCAweGZlMWUpLAkiZjNUOSZzIn0sCi0gICAgCi17InBmbHVzaHIiLAl0d28oMHhmMDAwLCAweGEwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkifHMiIH0sCi0gICAgCi17InBsb2FkciIsCXR3bygweGYwMDAsIDB4MjIxMCksCXR3bygweGZmYzAsIDB4ZmZmMCksCSJUMyZzIiB9LAoteyJwbG9hZHIiLAl0d28oMHhmMDAwLCAweDIyMDgpLAl0d28oMHhmZmMwLCAweGZmZjgpLAkiRDMmcyIgfSwKLXsicGxvYWRyIiwJdHdvKDB4ZjAwMCwgMHgyMjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZlKSwJImYzJnMiIH0sCi17InBsb2FkdyIsCXR3bygweGYwMDAsIDB4MjAxMCksCXR3bygweGZmYzAsIDB4ZmZmMCksCSJUMyZzIiB9LAoteyJwbG9hZHciLAl0d28oMHhmMDAwLCAweDIwMDgpLAl0d28oMHhmZmMwLCAweGZmZjgpLAkiRDMmcyIgfSwKLXsicGxvYWR3IiwJdHdvKDB4ZjAwMCwgMHgyMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZlKSwJImYzJnMiIH0sCi0gICAgCi0gICAgLyogVEMsIENSUCwgRFJQLCBTUlAsIENBTCwgVkFMLCBTQ0MsIEFDICovCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg0MDAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwJIipzUDgiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg0MjAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwJIlA4JXMiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg0MDAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwJInxzVzgiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg0MjAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwJIlc4fnMiIH0sCi0gICAgCi0gICAgLyogQkFEeCwgQkFDeCAqLwoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NjIwMCksCXR3bygweGZmYzAsIDB4ZTNlMyksCSIqc1gzIiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NjAwMCksCXR3bygweGZmYzAsIDB4ZTNlMyksCSJYMyVzIiB9LAotICAgIAotICAgIC8qIFBTUiwgUENTUiAqLwotICAgIC8qIHsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYxMDApLAl0d28ob3hmZmMwLCBveGZmZmYpLAkiKnNaOCIgfSwgKi8KLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiKnNZOCIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYyMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiWTglcyIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDY2MDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiWjglcyIgfSwKLSAgICAKLXsicHJlc3RvcmUiLAlvbmUoMHhmMTQwKSwJCW9uZSgweGZmYzApLAkJIiZzIn0sCi17InByZXN0b3JlIiwJb25lKDB4ZjE1OCksCQlvbmUoMHhmZmY4KSwJCSIrcyJ9LAoteyJwc2F2ZSIsCW9uZSgweGYxMDApLAkJb25lKDB4ZmZjMCksCQkiJnMifSwKLXsicHNhdmUiLAlvbmUoMHhmMTAwKSwJCW9uZSgweGZmYzApLAkJIitzIn0sCi0gICAgCi17InBzYWMiLAl0d28oMHhmMDQwLCAweDAwMDcpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNhcyIsCXR3bygweGYwNDAsIDB4MDAwNiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2JjIiwJdHdvKDB4ZjA0MCwgMHgwMDAxKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzYnMiLAl0d28oMHhmMDQwLCAweDAwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNjYyIsCXR3bygweGYwNDAsIDB4MDAwZiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2NzIiwJdHdvKDB4ZjA0MCwgMHgwMDBlKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzZ2MiLAl0d28oMHhmMDQwLCAweDAwMGQpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNncyIsCXR3bygweGYwNDAsIDB4MDAwYyksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2ljIiwJdHdvKDB4ZjA0MCwgMHgwMDBiKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzaXMiLAl0d28oMHhmMDQwLCAweDAwMGEpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNsYyIsCXR3bygweGYwNDAsIDB4MDAwMyksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2xzIiwJdHdvKDB4ZjA0MCwgMHgwMDAyKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzc2MiLAl0d28oMHhmMDQwLCAweDAwMDUpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNzcyIsCXR3bygweGYwNDAsIDB4MDAwNCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3djIiwJdHdvKDB4ZjA0MCwgMHgwMDA5KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzd3MiLAl0d28oMHhmMDQwLCAweDAwMDgpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLSAgICAKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MjEwKSwJdHdvKDB4ZmZjMCwgMHhlM2YwKSwJIlQzJnNROCIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MzEwKSwJdHdvKDB4ZmZjMCwgMHhlMzEwKSwJIlQzJnNROEE5IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgyMDgpLAl0d28oMHhmZmMwLCAweGUzZjgpLAkiRDMmc1E4IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgzMDgpLAl0d28oMHhmZmMwLCAweGUzMTgpLAkiRDMmc1E4QTkiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODIwMCksCXR3bygweGZmYzAsIDB4ZTNmZSksCSJmMyZzUTgiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODMwMCksCXR3bygweGZmYzAsIDB4ZTMxZSksCSJmMyZzUThBOSIgfSwKLSAgICAKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MDEwKSwJdHdvKDB4ZmZjMCwgMHhlM2YwKSwJIlQzJnNROCIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MTEwKSwJdHdvKDB4ZmZjMCwgMHhlMzEwKSwJIlQzJnNROEE5IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgwMDgpLAl0d28oMHhmZmMwLCAweGUzZjgpLAkiRDMmc1E4IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgxMDgpLAl0d28oMHhmZmMwLCAweGUzMTgpLAkiRDMmc1E4QTkiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODAwMCksCXR3bygweGZmYzAsIDB4ZTNmZSksCSJmMyZzUTgiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODEwMCksCXR3bygweGZmYzAsIDB4ZTMxZSksCSJmMyZzUThBOSIgfSwKLSAgICAKLXsicHRyYXBhY3ciLAl0d28oMHhmMDdhLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBhY2wiLAl0d28oMHhmMDdiLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBhYyIsCXR3bygweGYwN2MsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBhc3ciLAl0d28oMHhmMDdhLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBhc2wiLAl0d28oMHhmMDdiLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBhcyIsCXR3bygweGYwN2MsIDB4MDAwNiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBiY3ciLAl0d28oMHhmMDdhLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBiY2wiLAl0d28oMHhmMDdiLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBiYyIsCXR3bygweGYwN2MsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBic3ciLAl0d28oMHhmMDdhLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBic2wiLAl0d28oMHhmMDdiLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBicyIsCXR3bygweGYwN2MsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBjY3ciLAl0d28oMHhmMDdhLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBjY2wiLAl0d28oMHhmMDdiLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBjYyIsCXR3bygweGYwN2MsIDB4MDAwZiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBjc3ciLAl0d28oMHhmMDdhLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBjc2wiLAl0d28oMHhmMDdiLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBjcyIsCXR3bygweGYwN2MsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBnY3ciLAl0d28oMHhmMDdhLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBnY2wiLAl0d28oMHhmMDdiLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBnYyIsCXR3bygweGYwN2MsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBnc3ciLAl0d28oMHhmMDdhLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBnc2wiLAl0d28oMHhmMDdiLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBncyIsCXR3bygweGYwN2MsIDB4MDAwYyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBpY3ciLAl0d28oMHhmMDdhLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBpY2wiLAl0d28oMHhmMDdiLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBpYyIsCXR3bygweGYwN2MsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBpc3ciLAl0d28oMHhmMDdhLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBpc2wiLAl0d28oMHhmMDdiLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBpcyIsCXR3bygweGYwN2MsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBsY3ciLAl0d28oMHhmMDdhLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBsY2wiLAl0d28oMHhmMDdiLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBsYyIsCXR3bygweGYwN2MsIDB4MDAwMyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBsc3ciLAl0d28oMHhmMDdhLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBsc2wiLAl0d28oMHhmMDdiLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBscyIsCXR3bygweGYwN2MsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBzY3ciLAl0d28oMHhmMDdhLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBzY2wiLAl0d28oMHhmMDdiLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBzYyIsCXR3bygweGYwN2MsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXBzc3ciLAl0d28oMHhmMDdhLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXBzc2wiLAl0d28oMHhmMDdiLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXBzcyIsCXR3bygweGYwN2MsIDB4MDAwNCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXB3Y3ciLAl0d28oMHhmMDdhLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXB3Y2wiLAl0d28oMHhmMDdiLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXB3YyIsCXR3bygweGYwN2MsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHRyYXB3c3ciLAl0d28oMHhmMDdhLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI3cifSwKLXsicHRyYXB3c2wiLAl0d28oMHhmMDdiLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiI2wifSwKLXsicHRyYXB3cyIsCXR3bygweGYwN2MsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIifSwKLSAgICAKLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyODAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlZzJnMifSwKLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyYzAwKSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkEzJnMiIH0sCi0gICAgCi0jZW5kaWYgLyogbTY4ODUxICovCi0KLS8qIGVuZCBvZiB0Yy1tNjg4NTEuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmMgYi9nYXMvY29uZmlnL3RjLW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmZjNkYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDcxMzggKzAsMCBAQAotLyogdGMtbTY4ay5jIC0tIEFzc2VtYmxlIGZvciB0aGUgbTY4ayBmYW1pbHkKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL202OGsuaCIKLSNpbmNsdWRlICJtNjhrLXBhcnNlLmgiCi0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKQotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0jZW5kaWYKLQotLyogVGhpcyBzdHJpbmcgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLiAgVGhlIG1hY3JvCi0gICB0Y19jb21tZW50X2NoYXJzIHBvaW50cyB0byB0aGlzLiAgV2UgdXNlIHRoaXMsIHJhdGhlciB0aGFuIHRoZQotICAgdXN1YWwgY29tbWVudF9jaGFycywgc28gdGhhdCB0aGUgLS1iaXR3aXNlLW9yIG9wdGlvbiB3aWxsIHdvcmsuICAqLwotI2lmIGRlZmluZWQgKFRFX1NWUjQpIHx8IGRlZmluZWQgKFRFX0RFTFRBKQotY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzID0gInwjIjsKLSNlbHNlCi1jb25zdCBjaGFyICptNjhrX2NvbW1lbnRfY2hhcnMgPSAifCI7Ci0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyoiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLUNPTlNUIGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgYXMKLSAgIGluICIwZjEyLjQ1NiIgb3IgIjBkMS4yMzQ1ZTEyIi4gICovCi0KLUNPTlNUIGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WGVFcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotLyogQXJlIHdlIHRyeWluZyB0byBnZW5lcmF0ZSBQSUMgY29kZT8gIElmIHNvLCBhYnNvbHV0ZSByZWZlcmVuY2VzCi0gICBvdWdodCB0byBiZSBtYWRlIGludG8gbGlua2FnZSB0YWJsZSByZWZlcmVuY2VzIG9yIHBjLXJlbGF0aXZlCi0gICByZWZlcmVuY2VzLiAgTm90IGltcGxlbWVudGVkLiAgRm9yIEVMRiB0aGVyZSBhcmUgb3RoZXIgbWVhbnMgCi0gICB0byBkZW5vdGUgcGljIHJlbG9jYXRpb25zLiAgKi8KLWludCBmbGFnX3dhbnRfcGljOwotCi1zdGF0aWMgaW50IGZsYWdfc2hvcnRfcmVmczsJLyogLWwgb3B0aW9uICovCi1zdGF0aWMgaW50IGZsYWdfbG9uZ19qdW1wczsJLyogLVMgb3B0aW9uICovCi0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwKLWludCBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUw7Ci0jZWxzZQotaW50IGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbDsKLSNlbmRpZgotCi0vKiBXaGV0aGVyIC0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIHdhcyB1c2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotc3RhdGljIGludCByZWdfcHJlZml4X29wdGlvbmFsX3NlZW47Ci0KLS8qIFRoZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciB0byB1c2UgYnkgZGVmYXVsdC4gICovCi1zdGF0aWMgZW51bSBtNjhrX3JlZ2lzdGVyIG02OGtfZmxvYXRfY29wbnVtID0gQ09QMTsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiByZWZlcmVuY2VzIHRvIG51bWJlciglcGMpIHdpbGwgYmUgdGFrZW4KLSAgIHRvIHJlZmVyIHRvIG51bWJlciwgcmF0aGVyIHRoYW4gdG8gJXBjICsgbnVtYmVyLiAgKi8KLXN0YXRpYyBpbnQgbTY4a19hYnNwY2FkZDsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiB0aGUgcXVpY2sgZm9ybXMgb2YgdGhlIG1vdmUsIGFkZCwgYW5kIHN1YgotICAgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIHdoZW4gcG9zc2libGUuICAqLwotc3RhdGljIGludCBtNjhrX3F1aWNrID0gMTsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiBpZiB0aGUgc2l6ZSBpcyBub3Qgc3BlY2lmaWVkIGZvciBhIGJhc2UKLSAgIG9yIG91dGVyIGRpc3BsYWNlbWVudCwgdGhlIGFzc2VtYmxlciBhc3N1bWVzIHRoYXQgdGhlIHNpemUgc2hvdWxkCi0gICBiZSAzMiBiaXRzLiAgKi8KLXN0YXRpYyBpbnQgbTY4a19yZWwzMiA9IDE7Ci0KLS8qIFRoaXMgaXMgbm9uLXplcm8gaWYgbTY4a19yZWwzMiB3YXMgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi1zdGF0aWMgaW50IG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lOwotCi0vKiBUaGUgZGVmYXVsdCB3aWR0aCB0byB1c2UgZm9yIGFuIGluZGV4IHJlZ2lzdGVyIHdoZW4gdXNpbmcgYSBiYXNlCi0gICBkaXNwbGFjZW1lbnQuICAqLwotc3RhdGljIGVudW0gbTY4a19zaXplIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCA9IFNJWkVfTE9ORzsKLQotLyogV2Ugd2FudCB0byB3YXJuIGlmIGFueSB0ZXh0IGxhYmVscyBhcmUgbWlzYWxpZ25lZC4gIEluIG9yZGVyIHRvIGdldAotICAgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyLCB3ZSBuZWVkIHRvIHJlY29yZCB0aGUgbGluZSBudW1iZXIgZm9yIGVhY2gKLSAgIGxhYmVsLiAgKi8KLQotc3RydWN0IGxhYmVsX2xpbmUKLXsKLSAgc3RydWN0IGxhYmVsX2xpbmUgKm5leHQ7Ci0gIHN5bWJvbFMgKmxhYmVsOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgaW50IHRleHQ7Ci19OwotCi0vKiBUaGUgbGlzdCBvZiBsYWJlbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGxhYmVsX2xpbmUgKmxhYmVsczsKLQotLyogVGhlIGN1cnJlbnQgbGFiZWwuICAqLwotCi1zdGF0aWMgc3RydWN0IGxhYmVsX2xpbmUgKmN1cnJlbnRfbGFiZWw7Ci0KLS8qIEl0cyBhbiBhcmJpdHJhcnkgbmFtZTogIFRoaXMgbWVhbnMgSSBkb24ndCBhcHByb3ZlIG9mIGl0ICovCi0vKiBTZWUgZmxhbWVzIGJlbG93ICovCi1zdGF0aWMgc3RydWN0IG9ic3RhY2sgcm9ieW47Ci0KLSNkZWZpbmUgVEFCKHgseSkJKCgoeCk8PDIpKyh5KSkKLSNkZWZpbmUgVEFCVFlQRSh4eSkgICAgICgoeHkpID4+IDIpCi0jZGVmaW5lIEJZVEUJCTAKLSNkZWZpbmUgU0hPUlQJCTEKLSNkZWZpbmUgTE9ORwkJMgotI2RlZmluZSBTWl9VTkRFRgkzCi0jdW5kZWYgQlJBTkNICi0vKiBDYXNlIGBnJyBleGNlcHQgd2hlbiBCQ0M2ODAwMCBpcyBhcHBsaWNhYmxlLiAgKi8KLSNkZWZpbmUgQUJSQU5DSAkJMQotLyogQ29wcm9jZXNzb3IgYnJhbmNoZXMuICAqLwotI2RlZmluZSBGQlJBTkNICQkyCi0vKiBNb2RlIDcuMiAtLSBwcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCAoMTYtYml0KSBkaXNwbGFjZW1lbnQsCi0gICBzdXBwb3J0ZWQgb24gYWxsIGNwdXMuICBXaWRlbnMgdG8gMzItYml0IGFic29sdXRlLiAgKi8KLSNkZWZpbmUgUENSRUwJCTMKLS8qIEZvciBpbnNlcnRpbmcgYW4gZXh0cmEgam1wIGluc3RydWN0aW9uIHdpdGggbG9uZyBvZmZzZXQgb24gNjgwMDAsCi0gICBmb3IgZXhwYW5kaW5nIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKE5vdCBic3Igb3IgYnJhLikgIFNpbmNlIHRoZQotICAgNjgwMDAgZG9lc24ndCBzdXBwb3J0IDMyLWJpdCBkaXNwbGFjZW1lbnRzIGZvciBjb25kaXRpb25hbAotICAgYnJhbmNoZXMsIHdlIGZha2UgaXQgYnkgcmV2ZXJzaW5nIHRoZSBjb25kaXRpb24gYW5kIGJyYW5jaGluZwotICAgYXJvdW5kIGEgam1wIHdpdGggYW4gYWJzb2x1dGUgbG9uZyBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgQkNDNjgwMDAgICAgICAgIDQKLS8qIEZvciB0aGUgREJjYyAiaW5zdHJ1Y3Rpb25zIi4gIElmIHRoZSBkaXNwbGFjZW1lbnQgcmVxdWlyZXMgMzIgYml0cywKLSAgIHRoZSBicmFuY2gtYXJvdW5kLWEtanVtcCBnYW1lIGlzIHBsYXllZCBoZXJlIHRvby4gICovCi0jZGVmaW5lIERCQ0MgICAgICAgICAgICA1Ci0vKiBOb3QgY3VycmVudGx5IHVzZWQ/ICAqLwotI2RlZmluZSBQQ0xFQQkJNgotLyogTW9kZSBBSU5EWCAoYXBjLXJlbGF0aXZlKSB1c2luZyBQQywgd2l0aCB2YXJpYWJsZSB0YXJnZXQsIG1pZ2h0IGZpdAotICAgaW4gMTYgb3IgOCBiaXRzLiAgKi8KLSNkZWZpbmUgUENJTkRFWAkJNwotCi1zdHJ1Y3QgbTY4a19pbmNhbnQKLSAgewotICAgIGNvbnN0IGNoYXIgKm1fb3BlcmFuZHM7Ci0gICAgdW5zaWduZWQgbG9uZyBtX29wY29kZTsKLSAgICBzaG9ydCBtX29wbnVtOwotICAgIHNob3J0IG1fY29kZW51bTsKLSAgICBpbnQgbV9hcmNoOwotICAgIHN0cnVjdCBtNjhrX2luY2FudCAqbV9uZXh0OwotICB9OwotCi0jZGVmaW5lIGdldG9uZSh4KQkoKCgoeCktPm1fb3Bjb2RlKT4+MTYpJjB4ZmZmZikKLSNkZWZpbmUgZ2V0dHdvKHgpCSgoKHgpLT5tX29wY29kZSkmMHhmZmZmKQotCi1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODAwMF9jb250cm9sX3JlZ3NbXSA9IHsgMCB9Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwMTBfY29udHJvbF9yZWdzW10gPSB7Ci0gIFNGQywgREZDLCBVU1AsIFZCUiwKLSAgMAotfTsKLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4MDIwX2NvbnRyb2xfcmVnc1tdID0gewotICBTRkMsIERGQywgVVNQLCBWQlIsIENBQ1IsIENBQVIsIE1TUCwgSVNQLAotICAwCi19Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwNDBfY29udHJvbF9yZWdzW10gPSB7Ci0gIFNGQywgREZDLCBDQUNSLCBUQywgSVRUMCwgSVRUMSwgRFRUMCwgRFRUMSwKLSAgVVNQLCBWQlIsIE1TUCwgSVNQLCBNTVVTUiwgVVJQLCBTUlAsCi0gIDAKLX07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODA2MF9jb250cm9sX3JlZ3NbXSA9IHsKLSAgU0ZDLCBERkMsIENBQ1IsIFRDLCBJVFQwLCBJVFQxLCBEVFQwLCBEVFQxLCBCVVNDUiwKLSAgVVNQLCBWQlIsIFVSUCwgU1JQLCBQQ1IsCi0gIDAKLX07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG1jZl9jb250cm9sX3JlZ3NbXSA9IHsKLSAgQ0FDUiwgVEMsIElUVDAsIElUVDEsIERUVDAsIERUVDEsIFZCUiwgUk9NQkFSLCAKLSAgUkFNQkFSMCwgUkFNQkFSMSwgTUJBUiwKLSAgMAotfTsKLSNkZWZpbmUgY3B1MzJfY29udHJvbF9yZWdzIG02ODAxMF9jb250cm9sX3JlZ3MKLQotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciAqY29udHJvbF9yZWdzOwotCi0vKiBpbnRlcm5hbCBmb3JtIG9mIGEgNjgwMjAgaW5zdHJ1Y3Rpb24gKi8KLXN0cnVjdCBtNjhrX2l0Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm9yOwotICBjb25zdCBjaGFyICphcmdzOwkJLyogbGlzdCBvZiBvcGNvZGUgaW5mbyAqLwotICBpbnQgbnVtYXJnczsKLQotICBpbnQgbnVtbzsJCQkvKiBOdW1iZXIgb2Ygc2hvcnRzIGluIG9wY29kZSAqLwotICBzaG9ydCBvcGNvZGVbMTFdOwotCi0gIHN0cnVjdCBtNjhrX29wIG9wZXJhbmRzWzZdOwotCi0gIGludCBuZXhwOwkJCS8qIG51bWJlciBvZiBleHBycyBpbiB1c2UgKi8KLSAgc3RydWN0IG02OGtfZXhwIGV4cHJzWzRdOwotCi0gIGludCBuZnJhZzsJCQkvKiBOdW1iZXIgb2YgZnJhZ3Mgd2UgaGF2ZSB0byBwcm9kdWNlICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCBmcmFnb2ZmOwkJLyogV2hlcmUgaW4gdGhlIGN1cnJlbnQgb3Bjb2RlIHRoZSBmcmFnIGVuZHMgKi8KLSAgICAgIHN5bWJvbFMgKmZhZGQ7Ci0gICAgICBvZmZzZXRUIGZvZmY7Ci0gICAgICBpbnQgZnJhZ3R5OwotICAgIH0KLSAgZnJhZ2JbNF07Ci0KLSAgaW50IG5yZWw7CQkJLyogTnVtIG9mIHJlbG9jIHN0cnVjcyBpbiB1c2UgKi8KLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IG47Ci0gICAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgICBjaGFyIHdpZDsKLSAgICAgIGNoYXIgcGNyZWw7Ci0gICAgICAvKiBJbiBhIHBjIHJlbGF0aXZlIGFkZHJlc3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcwotCSBvZiB0aGUgb2Zmc2V0IGFuZCB0aGUgYWRkcmVzcyB0aGF0IHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUKLQkgdG8uICBUaGlzIGRlcGVuZHMgb24gdGhlIGFkZHJlc3NpbmcgbW9kZS4gIEJhc2ljYWxseSB0aGlzCi0JIGlzIHRoZSB2YWx1ZSB0byBwdXQgaW4gdGhlIG9mZnNldCBmaWVsZCB0byBhZGRyZXNzIHRoZQotCSBmaXJzdCBieXRlIG9mIHRoZSBvZmZzZXQsIHdpdGhvdXQgcmVnYXJkaW5nIHRoZSBzcGVjaWFsCi0JIHNpZ25pZmljYW5jZSBvZiBzb21lIHZhbHVlcyAoaW4gdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiwgZm9yCi0JIGV4YW1wbGUpLiAgKi8KLSAgICAgIGludCBwY3JlbF9maXg7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogV2hldGhlciB0aGlzIGV4cHJlc3Npb24gbmVlZHMgc3BlY2lhbCBwaWMgcmVsb2NhdGlvbiwgYW5kIGlmCi0JIHNvLCB3aGljaC4gICovCi0gICAgICBlbnVtIHBpY19yZWxvY2F0aW9uIHBpY19yZWxvYzsKLSNlbmRpZgotICAgIH0KLSAgcmVsb2NbNV07CQkJLyogRml2ZSBpcyBlbm91Z2g/Pz8gKi8KLX07Ci0KLSNkZWZpbmUgY3B1X29mX2FyY2goeCkJCSgoeCkgJiAobTY4MDAwdXB8bWNmKSkKLSNkZWZpbmUgZmxvYXRfb2ZfYXJjaCh4KQkoKHgpICYgbWZsb2F0KQotI2RlZmluZSBtbXVfb2ZfYXJjaCh4KQkJKCh4KSAmIG1tbXUpCi0jZGVmaW5lIGFyY2hfY29sZGZpcmVfcCh4KQkoKCh4KSAmIG1jZikgIT0gMCkKLQotLyogTWFjcm9zIGZvciBkZXRlcm1pbmluZyBpZiBjcHUgc3VwcG9ydHMgYSBzcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGUgKi8KLSNkZWZpbmUgSEFWRV9MT05HX0JSQU5DSCh4KQkoKHgpICYgKG02ODAyMHxtNjgwMzB8bTY4MDQwfG02ODA2MHxjcHUzMikpCi0KLXN0YXRpYyBzdHJ1Y3QgbTY4a19pdCB0aGVfaW5zOwkvKiB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYXNzZW1ibGVkICovCi0KLSNkZWZpbmUgb3AoZXgpCQkoKGV4KS0+ZXhwLlhfb3ApCi0jZGVmaW5lIGFkZHMoZXgpCSgoZXgpLT5leHAuWF9hZGRfc3ltYm9sKQotI2RlZmluZSBzdWJzKGV4KQkoKGV4KS0+ZXhwLlhfb3Bfc3ltYm9sKQotI2RlZmluZSBvZmZzKGV4KQkoKGV4KS0+ZXhwLlhfYWRkX251bWJlcikKLQotLyogTWFjcm9zIGZvciBhZGRpbmcgdGhpbmdzIHRvIHRoZSBtNjhrX2l0IHN0cnVjdCAqLwotCi0jZGVmaW5lIGFkZHdvcmQodykJdGhlX2lucy5vcGNvZGVbdGhlX2lucy5udW1vKytdPSh3KQotCi0vKiBTdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgaW5zb3AgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKikpOwotc3RhdGljIHZvaWQgYWRkX2ZpeCBQQVJBTVMgKChpbnQsIHN0cnVjdCBtNjhrX2V4cCAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgYWRkX2ZyYWcgUEFSQU1TICgoc3ltYm9sUyAqLCBvZmZzZXRULCBpbnQpKTsKLQotLyogTGlrZSBhZGR3b3JkLCBidXQgZ29lcyBCRUZPUkUgZ2VuZXJhbCBvcGVyYW5kcyAqLwotc3RhdGljIHZvaWQKLWluc29wICh3LCBvcGNvZGUpCi0gICAgIGludCB3OwotICAgICBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKm9wY29kZTsKLXsKLSAgaW50IHo7Ci0gIGZvcih6PXRoZV9pbnMubnVtbzt6Pm9wY29kZS0+bV9jb2RlbnVtOy0teikKLSAgICB0aGVfaW5zLm9wY29kZVt6XT10aGVfaW5zLm9wY29kZVt6LTFdOwotICBmb3Ioej0wO3o8dGhlX2lucy5ucmVsO3orKykKLSAgICB0aGVfaW5zLnJlbG9jW3pdLm4rPTI7Ci0gIGZvciAoeiA9IDA7IHogPCB0aGVfaW5zLm5mcmFnOyB6KyspCi0gICAgdGhlX2lucy5mcmFnYlt6XS5mcmFnb2ZmKys7Ci0gIHRoZV9pbnMub3Bjb2RlW29wY29kZS0+bV9jb2RlbnVtXT13OwotICB0aGVfaW5zLm51bW8rKzsKLX0KLQotLyogVGhlIG51bW8rMSBrbHVkZ2UgaXMgc28gd2UgY2FuIGhpdCB0aGUgbG93IG9yZGVyIGJ5dGUgb2YgdGhlIHByZXYgd29yZC4KLSAgIEJsZWNjaC4gICovCi1zdGF0aWMgdm9pZAotYWRkX2ZpeCAod2lkdGgsIGV4cCwgcGNfcmVsLCBwY19maXgpCi0gICAgIGludCB3aWR0aDsKLSAgICAgc3RydWN0IG02OGtfZXhwICpleHA7Ci0gICAgIGludCBwY19yZWw7Ci0gICAgIGludCBwY19maXg7Ci17Ci0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5uID0gKCh3aWR0aCA9PSAnQicgfHwgd2lkdGggPT0gJzMnKQotCQkJCSAgID8gKHRoZV9pbnMubnVtbyoyLTEpCi0JCQkJICAgOiAoKCh3aWR0aCk9PSdiJykKLQkJCQkgICAgICA/ICh0aGVfaW5zLm51bW8qMisxKQotCQkJCSAgICAgIDogKHRoZV9pbnMubnVtbyoyKSkpOwotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbF0uZXhwID0gZXhwLT5leHA7Ci0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS53aWQgPSB3aWR0aDsKLSAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWxdLnBjcmVsX2ZpeCA9IHBjX2ZpeDsKLSNpZmRlZiBPQkpfRUxGCi0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5waWNfcmVsb2MgPSBleHAtPnBpY19yZWxvYzsKLSNlbmRpZgotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCsrXS5wY3JlbCA9IHBjX3JlbDsKLX0KLQotLyogQ2F1c2UgYW4gZXh0cmEgZnJhZyB0byBiZSBnZW5lcmF0ZWQgaGVyZSwgaW5zZXJ0aW5nIHVwIHRvIDEwIGJ5dGVzCi0gICAodGhhdCB2YWx1ZSBpcyBjaG9zZW4gaW4gdGhlIGZyYWdfdmFyIGNhbGwgaW4gbWRfYXNzZW1ibGUpLiAgVFlQRQotICAgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIGZyYWcgdG8gYmUgZ2VuZXJhdGVkOyBpdHMgcHJpbWFyeSB0eXBlIGlzCi0gICByc19tYWNoaW5lX2RlcGVuZGVudC4KLQotICAgVGhlIFRZUEUgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMSBhbmQKLSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LiAgVGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZml4dXAgd2lsbAotICAgYmUgZW1pdHRlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMS4KLQotICAgQUREIGJlY29tZXMgdGhlIEZSX1NZTUJPTCBmaWVsZCBvZiB0aGUgZnJhZywgYW5kIE9GRiB0aGUgRlJfT0ZGU0VULiAgKi8KLXN0YXRpYyB2b2lkCi1hZGRfZnJhZyAoYWRkLCBvZmYsIHR5cGUpCi0gICAgIHN5bWJvbFMgKmFkZDsKLSAgICAgb2Zmc2V0VCBvZmY7Ci0gICAgIGludCB0eXBlOwotewotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZyYWdvZmY9dGhlX2lucy5udW1vOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZhZGQ9YWRkOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZvZmY9b2ZmOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWcrK10uZnJhZ3R5PXR5cGU7Ci19Ci0KLSNkZWZpbmUgaXN2YXIoZXgpIFwKLSAgKG9wIChleCkgIT0gT19jb25zdGFudCAmJiBvcCAoZXgpICE9IE9fYmlnKQotCi1zdGF0aWMgY2hhciAqY3JhY2tfb3BlcmFuZCBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBtNjhrX29wICpvcFApKTsKLXN0YXRpYyBpbnQgZ2V0X251bSBQQVJBTVMgKChzdHJ1Y3QgbTY4a19leHAgKmV4cCwgaW50IG9rKSk7Ci1zdGF0aWMgdm9pZCBtNjhrX2lwIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgaW5zZXJ0X3JlZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgc2VsZWN0X2NvbnRyb2xfcmVncyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBpbml0X3JlZ3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcmV2ZXJzZV8xNl9iaXRzIFBBUkFNUyAoKGludCBpbikpOwotc3RhdGljIGludCByZXZlcnNlXzhfYml0cyBQQVJBTVMgKChpbnQgaW4pKTsKLXN0YXRpYyB2b2lkIGluc3RhbGxfZ2VuX29wZXJhbmQgUEFSQU1TICgoaW50IG1vZGUsIGludCB2YWwpKTsKLXN0YXRpYyB2b2lkIGluc3RhbGxfb3BlcmFuZCBQQVJBTVMgKChpbnQgbW9kZSwgaW50IHZhbCkpOwotc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kYXRhMiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZXZlbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfcHJvYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1yaV9jaGlwIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfY2hpcCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZm9wdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfb3B0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3Jlc3RvcmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3NhdmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9pZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2Vsc2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9lbmRpIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfYnJlYWsgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9uZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZm9yIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZW5kZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX3JlcGVhdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX3VudGlsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfd2hpbGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9lbmR3IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWRfYXBwbHlfZml4XzIgUEFSQU1TICgoZml4UyAqLCBvZmZzZXRUKSk7Ci1zdGF0aWMgdm9pZCBtZF9jb252ZXJ0X2ZyYWdfMSBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLXN0YXRpYyBpbnQgY3VycmVudF9hcmNoaXRlY3R1cmU7Ci0KLXN0cnVjdCBtNjhrX2NwdSB7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IGFsaWFzOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtNjhrX2NwdSBhcmNoc1tdID0gewotICB7IG02ODAwMCwgIjY4MDAwIiwgMCB9LAotICB7IG02ODAxMCwgIjY4MDEwIiwgMCB9LAotICB7IG02ODAyMCwgIjY4MDIwIiwgMCB9LAotICB7IG02ODAzMCwgIjY4MDMwIiwgMCB9LAotICB7IG02ODA0MCwgIjY4MDQwIiwgMCB9LAotICB7IG02ODA2MCwgIjY4MDYwIiwgMCB9LAotICB7IGNwdTMyLCAgImNwdTMyIiwgMCB9LAotICB7IG02ODg4MSwgIjY4ODgxIiwgMCB9LAotICB7IG02ODg1MSwgIjY4ODUxIiwgMCB9LAotICB7IG1jZjUyMDAsICI1MjAwIiwgMCB9LAotICB7IG1jZjUyMDZlLCAiNTIwNmUiLCAwIH0sCi0gIHsgbWNmNTMwNywgIjUzMDciLCAwfSwKLSAgLyogQWxpYXNlcyAoZWZmZWN0aXZlbHksIHNvIGZhciBhcyBnYXMgaXMgY29uY2VybmVkKSBmb3IgdGhlIGFib3ZlCi0gICAgIGNwdXMuICAqLwotICB7IG02ODAyMCwgIjY4ayIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODAwOCIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODMwMiIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODMwNiIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODMwNyIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODMyMiIsIDEgfSwKLSAgeyBtNjgwMDAsICI2ODM1NiIsIDEgfSwKLSAgeyBtNjgwMDAsICI2OGVjMDAwIiwgMSB9LAotICB7IG02ODAwMCwgIjY4aGMwMDAiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjhoYzAwMSIsIDEgfSwKLSAgeyBtNjgwMjAsICI2OGVjMDIwIiwgMSB9LAotICB7IG02ODAzMCwgIjY4ZWMwMzAiLCAxIH0sCi0gIHsgbTY4MDQwLCAiNjhlYzA0MCIsIDEgfSwKLSAgeyBtNjgwNjAsICI2OGVjMDYwIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzMwIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzMxIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzMyIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzMzIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzM0IiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzM2IiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzQwIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzQxIiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzQ5IiwgMSB9LAotICB7IGNwdTMyLCAgIjY4MzYwIiwgMSB9LAotICB7IG02ODg4MSwgIjY4ODgyIiwgMSB9LAotICB7IG1jZjUyMDAsICI1MjAyIiwgMSB9LAotICB7IG1jZjUyMDAsICI1MjA0IiwgMSB9LAotICB7IG1jZjUyMDAsICI1MjA2IiwgMSB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBuX2FyY2hzID0gc2l6ZW9mIChhcmNocykgLyBzaXplb2YgKGFyY2hzWzBdKTsKLQotLyogQkNDNjgwMDAgaXMgZm9yIHBhdGNoaW5nIGluIGFuIGV4dHJhIGptcCBpbnN0cnVjdGlvbiBmb3IgbG9uZyBvZmZzZXRzCi0gICBvbiB0aGUgNjgwMDAuICBUaGUgNjgwMDAgZG9lc24ndCBzdXBwb3J0IGxvbmcgYnJhbmNoZXMgd2l0aCBicmFuY2hzICovCi0KLS8qIFRoaXMgdGFibGUgZGVzcmliZXMgaG93IHlvdSBjaGFuZ2Ugc2l6ZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHZhcmlhYmxlCi0gICBzaXplIGV4cHJlc3Npb25zLiAgVGhpcyB2ZXJzaW9uIG9ubHkgc3VwcG9ydHMgdHdvIGtpbmRzLiAqLwotCi0vKiBOb3RlIHRoYXQgY2FsbHMgdG8gZnJhZ192YXIgbmVlZCB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIGV4cGFuc2lvbgotICAgbmVlZGVkOyB0aGlzIGlzIGN1cnJlbnRseSAxMCBieXRlcyBmb3IgREJDQy4gICovCi0KLS8qIFRoZSBmaWVsZHMgYXJlOgotICAgSG93IGZhciBGb3J3YXJkIHRoaXMgbW9kZSB3aWxsIHJlYWNoOgotICAgSG93IGZhciBCYWNrd2FyZCB0aGlzIG1vZGUgd2lsbCByZWFjaDoKLSAgIEhvdyBtYW55IGJ5dGVzIHRoaXMgbW9kZSB3aWxsIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgZnJhZwotICAgV2hpY2ggbW9kZSB0byBnbyB0byBpZiB0aGUgb2Zmc2V0IHdvbid0IGZpdCBpbiB0aGlzIG9uZQotICAgKi8KLXJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7MSwgMSwgMCwgMH0sCQkJLyogRmlyc3QgZW50cmllcyBhcmVuJ3QgdXNlZCAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogRm9yIG5vIGdvb2QgcmVhc29uIGV4Y2VwdCAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdGhhdCB0aGUgVkFYIGRvZXNuJ3QgZWl0aGVyICovCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7KDEyNyksICgtMTI4KSwgMCwgVEFCIChBQlJBTkNILCBTSE9SVCl9LAotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoQUJSQU5DSCwgTE9ORyl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MSwgMSwgMCwgMH0sCQkJLyogRkJSQU5DSCBkb2Vzbid0IGNvbWUgQllURSAqLwotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoRkJSQU5DSCwgTE9ORyl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MSwgMSwgMCwgMH0sCQkJLyogUENSRUwgZG9lc24ndCBjb21lIEJZVEUgKi8KLSAgeygzMjc2NyksICgtMzI3NjgpLCAyLCBUQUIgKFBDUkVMLCBMT05HKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsoMTI3KSwgKC0xMjgpLCAwLCBUQUIgKEJDQzY4MDAwLCBTSE9SVCl9LAotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoQkNDNjgwMDAsIExPTkcpfSwKLSAgezAsIDAsIDYsIDB9LAkJCS8qIGptcCBsb25nIHNwYWNlICovCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MSwgMSwgMCwgMH0sCQkJLyogREJDQyBkb2Vzbid0IGNvbWUgQllURSAqLwotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoREJDQywgTE9ORyl9LAotICB7MCwgMCwgMTAsIDB9LAkJLyogYnJhL2ptcCBsb25nIHNwYWNlICovCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MSwgMSwgMCwgMH0sCQkJLyogUENMRUEgZG9lc24ndCBjb21lIEJZVEUgKi8KLSAgezMyNzY3LCAtMzI3NjgsIDIsIFRBQiAoUENMRUEsIExPTkcpfSwKLSAgezAsIDAsIDYsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgLyogRm9yLCBlLmcuLCBqbXAgcGNyZWwgaW5kZXhlZC4gICovCi0gIHsxMjUsIC0xMzAsIDAsIFRBQiAoUENJTkRFWCwgU0hPUlQpfSwKLSAgezMyNzY1LCAtMzI3NzAsIDIsIFRBQiAoUENJTkRFWCwgTE9ORyl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLX07Ci0KLS8qIFRoZXNlIGFyZSB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcHNldWRvLW9wcy4gIFRoZXNlIGFyZSBpbmNsdWRlZCBzbwotICAgdGhlIGFzc2VtYmxlciBjYW4gd29yayBvbiB0aGUgb3V0cHV0IGZyb20gdGhlIFNVTiBDIGNvbXBpbGVyLCB3aGljaAotICAgZ2VuZXJhdGVzIHRoZXNlLgotICAgKi8KLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkYXRhMSIsIHNfZGF0YTEsIDB9LAotICB7ImRhdGEyIiwgc19kYXRhMiwgMH0sCi0gIHsiYnNzIiwgc19ic3MsIDB9LAotICB7ImV2ZW4iLCBzX2V2ZW4sIDB9LAotICB7InNraXAiLCBzX3NwYWNlLCAwfSwKLSAgeyJwcm9jIiwgc19wcm9jLCAwfSwKLSNpZiBkZWZpbmVkIChURV9TVU4zKSB8fCBkZWZpbmVkIChPQkpfRUxGKQotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIHsic3diZWciLCBzX2lnbm9yZSwgMH0sCi0jZW5kaWYKLSAgeyJleHRlbmQiLCBmbG9hdF9jb25zLCAneCd9LAotICB7Imxkb3VibGUiLCBmbG9hdF9jb25zLCAneCd9LAotCi0gIC8qIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBhcmUgc3VwcG9ydGVkIGZvciBNUkkgY29tcGF0aWJpbGl0eS4gICovCi0gIHsiY2hpcCIsIHNfY2hpcCwgMH0sCi0gIHsiY29tbGluZSIsIHNfc3BhY2UsIDF9LAotICB7ImZvcHQiLCBzX2ZvcHQsIDB9LAotICB7Im1hc2syIiwgc19pZ25vcmUsIDB9LAotICB7Im9wdCIsIHNfb3B0LCAwfSwKLSAgeyJyZWciLCBzX3JlZywgMH0sCi0gIHsicmVzdG9yZSIsIHNfcmVzdG9yZSwgMH0sCi0gIHsic2F2ZSIsIHNfc2F2ZSwgMH0sCi0KLSAgeyJpZiIsIHNfbXJpX2lmLCAwfSwKLSAgeyJpZi5iIiwgc19tcmlfaWYsICdiJ30sCi0gIHsiaWYudyIsIHNfbXJpX2lmLCAndyd9LAotICB7ImlmLmwiLCBzX21yaV9pZiwgJ2wnfSwKLSAgeyJlbHNlIiwgc19tcmlfZWxzZSwgMH0sCi0gIHsiZWxzZS5zIiwgc19tcmlfZWxzZSwgJ3MnfSwKLSAgeyJlbHNlLmwiLCBzX21yaV9lbHNlLCAnbCd9LAotICB7ImVuZGkiLCBzX21yaV9lbmRpLCAwfSwKLSAgeyJicmVhayIsIHNfbXJpX2JyZWFrLCAwfSwKLSAgeyJicmVhay5zIiwgc19tcmlfYnJlYWssICdzJ30sCi0gIHsiYnJlYWsubCIsIHNfbXJpX2JyZWFrLCAnbCd9LAotICB7Im5leHQiLCBzX21yaV9uZXh0LCAwfSwKLSAgeyJuZXh0LnMiLCBzX21yaV9uZXh0LCAncyd9LAotICB7Im5leHQubCIsIHNfbXJpX25leHQsICdsJ30sCi0gIHsiZm9yIiwgc19tcmlfZm9yLCAwfSwKLSAgeyJmb3IuYiIsIHNfbXJpX2ZvciwgJ2InfSwKLSAgeyJmb3IudyIsIHNfbXJpX2ZvciwgJ3cnfSwKLSAgeyJmb3IubCIsIHNfbXJpX2ZvciwgJ2wnfSwKLSAgeyJlbmRmIiwgc19tcmlfZW5kZiwgMH0sCi0gIHsicmVwZWF0Iiwgc19tcmlfcmVwZWF0LCAwfSwKLSAgeyJ1bnRpbCIsIHNfbXJpX3VudGlsLCAwfSwKLSAgeyJ1bnRpbC5iIiwgc19tcmlfdW50aWwsICdiJ30sCi0gIHsidW50aWwudyIsIHNfbXJpX3VudGlsLCAndyd9LAotICB7InVudGlsLmwiLCBzX21yaV91bnRpbCwgJ2wnfSwKLSAgeyJ3aGlsZSIsIHNfbXJpX3doaWxlLCAwfSwKLSAgeyJ3aGlsZS5iIiwgc19tcmlfd2hpbGUsICdiJ30sCi0gIHsid2hpbGUudyIsIHNfbXJpX3doaWxlLCAndyd9LAotICB7IndoaWxlLmwiLCBzX21yaV93aGlsZSwgJ2wnfSwKLSAgeyJlbmR3Iiwgc19tcmlfZW5kdywgMH0sCi0KLSAgezAsIDAsIDB9Ci19OwotCi0KLS8qIFRoZSBtb3RlIHBzZXVkbyBvcHMgYXJlIHB1dCBpbnRvIHRoZSBvcGNvZGUgdGFibGUsIHNpbmNlIHRoZXkKLSAgIGRvbid0IHN0YXJ0IHdpdGggYSAuIHRoZXkgbG9vayBsaWtlIG9wY29kZXMgdG8gZ2FzLgotICAgKi8KLQotI2lmZGVmIE02OEtDT0ZGCi1leHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLUNPTlNUIHBzZXVkb190eXBlUyBtb3RlX3BzZXVkb190YWJsZVtdID0KLXsKLQotICB7ImRjbCIsIGNvbnMsIDR9LAotICB7ImRjIiwgY29ucywgMn0sCi0gIHsiZGN3IiwgY29ucywgMn0sCi0gIHsiZGNiIiwgY29ucywgMX0sCi0KLSAgeyJkc2wiLCBzX3NwYWNlLCA0fSwKLSAgeyJkcyIsIHNfc3BhY2UsIDJ9LAotICB7ImRzdyIsIHNfc3BhY2UsIDJ9LAotICB7ImRzYiIsIHNfc3BhY2UsIDF9LAotCi0gIHsieGRlZiIsIHNfZ2xvYmwsIDB9LAotI2lmZGVmIE9CSl9FTEYKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAotI2Vsc2UKLSAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0jZW5kaWYKLSNpZmRlZiBNNjhLQ09GRgotICB7InNlY3QiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0aW9uIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0jZW5kaWYKLSAgezAsIDAsIDB9Ci19OwotCi0jZGVmaW5lIGlzc2J5dGUoeCkJKCh4KT49LTEyOCAmJiAoeCk8PTEyNykKLSNkZWZpbmUgaXN1Ynl0ZSh4KQkoKHgpPj0wICYmICh4KTw9MjU1KQotI2RlZmluZSBpc3N3b3JkKHgpCSgoeCk+PS0zMjc2OCAmJiAoeCk8PTMyNzY3KQotI2RlZmluZSBpc3V3b3JkKHgpCSgoeCk+PTAgJiYgKHgpPD02NTUzNSkKLQotI2RlZmluZSBpc2J5dGUoeCkJKCh4KT49IC0yNTUgJiYgKHgpPD0yNTUpCi0jZGVmaW5lIGlzd29yZCh4KQkoKHgpPj0tNjU1MzYgJiYgKHgpPD02NTUzNSkKLSNkZWZpbmUgaXNsb25nKHgpCSgxKQotCi1leHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotCi1zdGF0aWMgY2hhciBta2xvd2VyX3RhYmxlWzI1Nl07Ci0jZGVmaW5lIG1rbG93ZXIoYykgKG1rbG93ZXJfdGFibGVbKHVuc2lnbmVkIGNoYXIpKGMpXSkKLXN0YXRpYyBjaGFyIG5vdGVuZF90YWJsZVsyNTZdOwotc3RhdGljIGNoYXIgYWx0X25vdGVuZF90YWJsZVsyNTZdOwotI2RlZmluZSBub3RlbmQocykJCQkJCQlcCi0gICghIChub3RlbmRfdGFibGVbKHVuc2lnbmVkIGNoYXIpICpzXQkJCQlcCi0gICAgICB8fCAoKnMgPT0gJzonCQkJCQkJXAotCSAgJiYgYWx0X25vdGVuZF90YWJsZVsodW5zaWduZWQgY2hhcikgc1sxXV0pKSkKLQotI2lmIGRlZmluZWQgKE02OEtDT0ZGKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLQotI2lmZGVmIE5PX1BDUkVMX1JFTE9DUwotCi1pbnQKLW1ha2VfcGNyZWxfYWJzb2x1dGUoZml4UCwgYWRkX251bWJlcikKLSAgICBmaXhTICpmaXhQOwotICAgIGxvbmcgKmFkZF9udW1iZXI7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm9wY29kZSA9IGZpeFAtPmZ4X2ZyYWctPmZyX29wY29kZTsKLQotICAvKiByZXdyaXRlIHRoZSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgdG8gYWJzb2x1dGUgYWRkcmVzcyBvbmVzLgotICAgKiB0aGVzZSBhcmUgcnVtb3VyZWQgdG8gYmUgZmFzdGVyLCBhbmQgdGhlIGFwb2xsbyBsaW5rZXIgcmVmdXNlcwotICAgKiB0byBkZWFsIHdpdGggdGhlIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotICAgKi8KLSAgaWYgKG9wY29kZVswXSA9PSAweDYwICYmIG9wY29kZVsxXSA9PSAweGZmKSAvKiBCUkEgLT4gSk1QICovCi0gICAgewotICAgICAgb3Bjb2RlWzBdID0gMHg0ZTsKLSAgICAgIG9wY29kZVsxXSA9IDB4Zjk7Ci0gICAgfQotICBlbHNlIGlmIChvcGNvZGVbMF0gPT0gMHg2MSAmJiBvcGNvZGVbMV0gPT0gMHhmZikgLyogQlNSIC0+IEpTUiAqLwotICAgIHsKLSAgICAgIG9wY29kZVswXSA9IDB4NGU7Ci0gICAgICBvcGNvZGVbMV0gPSAweGI5OwotICAgIH0KLSAgZWxzZQotICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIikpOwotICAqYWRkX251bWJlciAtPSA0OwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIE5PX1BDUkVMX1JFTE9DUyAqLwotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF90Y2JpdCAmJiBmaXhQLT5meF9zaXplID09IDQpCi0gICAgcmV0dXJuIFJfUkVMTE9OR19ORUc7Ci0jaWZkZWYgTk9fUENSRUxfUkVMT0NTCi0gIGtub3cgKGZpeFAtPmZ4X3BjcmVsID09IDApOwotICByZXR1cm4gKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUkVMQllURQotCSAgOiBmaXhQLT5meF9zaXplID09IDIgPyBSX0RJUjE2Ci0JICA6IFJfRElSMzIpOwotI2Vsc2UKLSAgcmV0dXJuIChmaXhQLT5meF9wY3JlbCA/Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9QQ1JCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1BDUldPUkQgOgotCSAgIFJfUENSTE9ORykgOgotCSAgKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUkVMQllURSA6Ci0JICAgZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9SRUxXT1JEIDoKLQkgICBSX1JFTExPTkcpKTsKLSNlbmRpZgotfQotCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLQotLyogQ29tcHV0ZSB0aGUgcmVsb2NhdGlvbiBjb2RlIGZvciBhIGZpeHVwIG9mIFNJWkUgYnl0ZXMsIHVzaW5nIHBjCi0gICByZWxhdGl2ZSByZWxvY2F0aW9uIGlmIFBDUkVMIGlzIG5vbi16ZXJvLiAgUElDIHNheXMgd2hldGhlciBhIHNwZWNpYWwKLSAgIHBpYyByZWxvY2F0aW9uIHdhcyByZXF1ZXN0ZWQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGdldF9yZWxvY19jb2RlCi0gIFBBUkFNUyAoKGludCwgaW50LCBlbnVtIHBpY19yZWxvY2F0aW9uKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWdldF9yZWxvY19jb2RlIChzaXplLCBwY3JlbCwgcGljKQotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IHBjcmVsOwotICAgICBlbnVtIHBpY19yZWxvY2F0aW9uIHBpYzsKLXsKLSAgc3dpdGNoIChwaWMpCi0gICAgewotICAgIGNhc2UgcGljX2dvdF9wY3JlbDoKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIEJGRF9SRUxPQ184X0dPVF9QQ1JFTDsKLQljYXNlIDI6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDsKLQljYXNlIDQ6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcGljX2dvdF9vZmY6Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMToKLQkgIHJldHVybiBCRkRfUkVMT0NfOF9HT1RPRkY7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIEJGRF9SRUxPQ18xNl9HT1RPRkY7Ci0JY2FzZSA0OgotCSAgcmV0dXJuIEJGRF9SRUxPQ18zMl9HT1RPRkY7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHBpY19wbHRfcGNyZWw6Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMToKLQkgIHJldHVybiBCRkRfUkVMT0NfOF9QTFRfUENSRUw7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIEJGRF9SRUxPQ18xNl9QTFRfUENSRUw7Ci0JY2FzZSA0OgotCSAgcmV0dXJuIEJGRF9SRUxPQ18zMl9QTFRfUENSRUw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHBpY19wbHRfb2ZmOgotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzhfUExUT0ZGOwotCWNhc2UgMjoKLQkgIHJldHVybiBCRkRfUkVMT0NfMTZfUExUT0ZGOwotCWNhc2UgNDoKLQkgIHJldHVybiBCRkRfUkVMT0NfMzJfUExUT0ZGOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBwaWNfbm9uZToKLSAgICAgIGlmIChwY3JlbCkKLQl7Ci0JICBzd2l0Y2ggKHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSAxOgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgICAgY2FzZSAyOgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICAgIGNhc2UgNDoKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoc2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDE6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ184OwotCSAgICBjYXNlIDI6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ18xNjsKLQkgICAgY2FzZSA0OgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfMzI7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChwY3JlbCkKLSAgICB7Ci0gICAgICBpZiAocGljID09IHBpY19ub25lKQotCWFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcGljIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBpYyA9PSBwaWNfbm9uZSkKLQlhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIHNpemUpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBpYyByZWxvY2F0aW9uIiksIHNpemUpOwotICAgIH0KLQotICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Ci19Ci0KLS8qIEhlcmUgd2UgZGVjaWRlIHdoaWNoIGZpeHVwcyBjYW4gYmUgYWRqdXN0ZWQgdG8gbWFrZSB0aGVtIHJlbGF0aXZlCi0gICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIGluc3RlYWQgb2YgdGhlIHN5bWJvbC4gIEJhc2ljYWxseQotICAgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgZG9uZQotICAgY29ycmVjdGx5LCBzbyBpbiBzb21lIGNhc2VzIHdlIGZvcmNlIHRoZSBvcmlnaW5hbCBzeW1ib2wgdG8gYmUKLSAgIHVzZWQuICAqLwotaW50Ci10Y19tNjhrX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgfHwgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogYWRqdXN0X3JlbG9jX3N5bXMgZG9lc24ndCBrbm93IGFib3V0IHRoZSBHT1QgKi8KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzhfR09UX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9HT1RfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyX0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ184X1BMVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QTFRfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRPRkY6Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLQotI2Vsc2UgLyogIU9CSl9FTEYgKi8KLQotI2RlZmluZSBnZXRfcmVsb2NfY29kZShTSVpFLFBDUkVMLE9USEVSKSBOT19SRUxPQwotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLQotICBpZiAoZml4cC0+ZnhfdGNiaXQpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotCi0gICAgICAvKiBTaW5jZSBESUZGX0VYUFJfT0sgaXMgZGVmaW5lZCBpbiB0Yy1tNjhrLmgsIGl0IGlzIHBvc3NpYmxlCi0gICAgICAgICB0aGF0IGZpeHVwX3NlZ21lbnQgY29udmVydGVkIGEgbm9uLVBDIHJlbGF0aXZlIHJlbG9jIGludG8gYQotICAgICAgICAgUEMgcmVsYXRpdmUgcmVsb2MuICBJbiBzdWNoIGEgY2FzZSwgd2UgbmVlZCB0byBjb252ZXJ0IHRoZQotICAgICAgICAgcmVsb2MgY29kZS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JewotCSAgc3dpdGNoIChjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfR09UX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ184X1BMVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfUExUX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QTFRPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiQ2Fubm90IG1ha2UgJXMgcmVsb2NhdGlvbiBQQyByZWxhdGl2ZSIpLAotCQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotI2RlZmluZSBGKFNaLFBDUkVMKQkJKCgoU1opIDw8IDEpICsgKFBDUkVMKSkKLSAgICAgIHN3aXRjaCAoRiAoZml4cC0+Znhfc2l6ZSwgZml4cC0+ZnhfcGNyZWwpKQotCXsKLSNkZWZpbmUgTUFQKFNaLFBDUkVMLFRZUEUpCWNhc2UgRihTWixQQ1JFTCk6IGNvZGUgPSAoVFlQRSk7IGJyZWFrCi0JICBNQVAgKDEsIDAsIEJGRF9SRUxPQ184KTsKLQkgIE1BUCAoMiwgMCwgQkZEX1JFTE9DXzE2KTsKLQkgIE1BUCAoNCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgIE1BUCAoMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCSAgTUFQICgyLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotCSAgTUFQICg0LCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotI3VuZGVmIEYKLSN1bmRlZiBNQVAKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotI2lmbmRlZiBPQkpfRUxGCi0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IDA7Ci0jZWxzZQotICBpZiAoIWZpeHAtPmZ4X3BjcmVsKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gKHNlY3Rpb24tPnZtYQotCQkgICAgICsgKGZpeHAtPmZ4X3BjcmVsX2FkanVzdCA9PSA2NAotCQkJPyAtMSA6IGZpeHAtPmZ4X3BjcmVsX2FkanVzdCkKLQkJICAgICArIGZpeHAtPmZ4X2FkZG51bWJlcgotCQkgICAgICsgbWRfcGNyZWxfZnJvbSAoZml4cCkpOwotI2VuZGlmCi0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBhc3NlcnQgKHJlbG9jLT5ob3d0byAhPSAwKTsKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFJldHVybiB6ZXJvIGlmIHRoZSByZWZlcmVuY2UgdG8gU1lNQk9MIGZyb20gd2l0aGluIHRoZSBzYW1lIHNlZ21lbnQgbWF5Ci0gICBiZSByZWxheGVkLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIE9uIGFuIEVMRiBzeXN0ZW0sIHdlIGNhbid0IHJlbGF4IGFuIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2wsCi0gICBiZWNhdXNlIGl0IG1heSBiZSBvdmVycmlkZGVuIGJ5IGEgc2hhcmVkIGxpYnJhcnkuICBIb3dldmVyLCBpZgotICAgVEFSR0VUX09TIGlzICJlbGYiLCB0aGVuIHdlIHByZXN1bWUgdGhhdCB3ZSBhcmUgYXNzZW1ibGluZyBmb3IgYW4KLSAgIGVtYmVkZGVkIHN5c3RlbSwgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNoYXJlZAotICAgbGlicmFyaWVzLCBhbmQgd2UgY2FuIHJlbGF4IGFueXRoaW5nLiAgKi8KLQotI2RlZmluZSByZWxheGFibGVfc3ltYm9sKHN5bWJvbCkJCVwKLSAgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgPT0gMAkJXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoc3ltYm9sKQkJCVwKLSAgICAgICAmJiAhIFNfSVNfV0VBSyAoc3ltYm9sKSkpCi0KLSNlbHNlCi0KLSNkZWZpbmUgcmVsYXhhYmxlX3N5bWJvbChzeW1ib2wpIDEKLQotI2VuZGlmCi0gCi0vKiBIYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlLiAgTlVMTCBtZWFucyBhbnkgdXNlIGJlZm9yZQotICAgbTY4a19pcF9iZWdpbigpIHdpbGwgY3Jhc2guICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0MCi0vKiBBc3NlbWJsZSBhbiBtNjhrIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW02OGtfaXAgKGluc3RyaW5nKQotICAgICBjaGFyICppbnN0cmluZzsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgc3RydWN0IG02OGtfb3AgKm9wUDsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG02OGtfaW5jYW50ICpvcGNvZGU7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0gIHJlZ2lzdGVyIGludCB0bXByZWcgPSAwLCBiYXNlbyA9IDAsIG91dHJvID0gMCwgbmV4dHdvcmQ7Ci0gIGNoYXIgKnBkb3QsICpwZG90bW92ZTsKLSAgZW51bSBtNjhrX3NpemUgc2l6MSwgc2l6MjsKLSAgY2hhciBjOwotICBpbnQgbG9zaW5nOwotICBpbnQgb3BzZm91bmQ7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzZdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZHA7Ci0gIHVuc2lnbmVkIGxvbmcgb2tfYXJjaCA9IDA7Ci0KLSAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0gICAgaW5zdHJpbmcrKzsJCQkvKiBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCi0gIC8qIFNjYW4gdXAgdG8gZW5kIG9mIG9wZXJhdGlvbi1jb2RlLCB3aGljaCBNVVNUIGVuZCBpbiBlbmQtb2Ytc3RyaW5nCi0gICAgIG9yIGV4YWN0bHkgMSBzcGFjZS4gKi8KLSAgcGRvdCA9IDA7Ci0gIGZvciAocCA9IGluc3RyaW5nOyAqcCAhPSAnXDAnOyBwKyspCi0gICAgewotICAgICAgaWYgKCpwID09ICcgJykKLQlicmVhazsKLSAgICAgIGlmICgqcCA9PSAnLicpCi0JcGRvdCA9IHA7Ci0gICAgfQotCi0gIGlmIChwID09IGluc3RyaW5nKQotICAgIHsKLSAgICAgIHRoZV9pbnMuZXJyb3IgPSBfKCJObyBvcGVyYXRvciIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBwIG5vdyBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgb3Bjb2RlIG5hbWUsIHByb2JhYmx5IHdoaXRlc3BhY2UuCi0gICAgIE1ha2Ugc3VyZSB0aGUgbmFtZSBpcyBudWxsIHRlcm1pbmF0ZWQgYnkgY2xvYmJlcmluZyB0aGUKLSAgICAgd2hpdGVzcGFjZSwgbG9vayBpdCB1cCBpbiB0aGUgaGFzaCB0YWJsZSwgdGhlbiBmaXggaXQgYmFjay4KLSAgICAgUmVtb3ZlIGEgZG90LCBmaXJzdCwgc2luY2UgdGhlIG9wY29kZSB0YWJsZXMgaGF2ZSBub25lLiAgKi8KLSAgaWYgKHBkb3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKHBkb3Rtb3ZlID0gcGRvdDsgcGRvdG1vdmUgPCBwOyBwZG90bW92ZSsrKQotCSpwZG90bW92ZSA9IHBkb3Rtb3ZlWzFdOwotICAgICAgcC0tOwotICAgIH0KLQotICBjID0gKnA7Ci0gICpwID0gJ1wwJzsKLSAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBtNjhrX2luY2FudCAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIGluc3RyaW5nKTsKLSAgKnAgPSBjOwotCi0gIGlmIChwZG90ICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwZG90bW92ZSA9IHA7IHBkb3Rtb3ZlID4gcGRvdDsgcGRvdG1vdmUtLSkKLQkqcGRvdG1vdmUgPSBwZG90bW92ZVstMV07Ci0gICAgICAqcGRvdCA9ICcuJzsKLSAgICAgICsrcDsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHRoZV9pbnMuZXJyb3IgPSBfKCJVbmtub3duIG9wZXJhdG9yIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGZvdW5kIGEgbGVnaXRpbWF0ZSBvcGNvZGUsIHN0YXJ0IG1hdGNoaW5nIG9wZXJhbmRzICovCi0gIHdoaWxlICgqcCA9PSAnICcpCi0gICAgKytwOwotCi0gIGlmIChvcGNvZGUtPm1fb3BlcmFuZHMgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqb2xkID0gJ1xuJzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgICAvKiBBaGggLSBpdCdzIGEgbW90b3JvbGEgc3R5bGUgcHN1ZWRvIG9wICovCi0gICAgICBtb3RlX3BzZXVkb190YWJsZVtvcGNvZGUtPm1fb3BudW1dLnBvY19oYW5kbGVyCi0JKG1vdGVfcHNldWRvX3RhYmxlW29wY29kZS0+bV9vcG51bV0ucG9jX3ZhbCk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGQ7Ci0gICAgICAqb2xkID0gMDsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmxhZ19tcmkgJiYgb3Bjb2RlLT5tX29wbnVtID09IDApCi0gICAgewotICAgICAgLyogSW4gTVJJIG1vZGUsIHJhbmRvbSBnYXJiYWdlIGlzIGFsbG93ZWQgYWZ0ZXIgYW4gaW5zdHJ1Y3Rpb24KLSAgICAgICAgIHdoaWNoIGFjY2VwdHMgbm8gb3BlcmFuZHMuICAqLwotICAgICAgdGhlX2lucy5hcmdzID0gb3Bjb2RlLT5tX29wZXJhbmRzOwotICAgICAgdGhlX2lucy5udW1hcmdzID0gb3Bjb2RlLT5tX29wbnVtOwotICAgICAgdGhlX2lucy5udW1vID0gb3Bjb2RlLT5tX2NvZGVudW07Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSA9IGdldG9uZSAob3Bjb2RlKTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdID0gZ2V0dHdvIChvcGNvZGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmb3IgKG9wUCA9ICZ0aGVfaW5zLm9wZXJhbmRzWzBdOyAqcDsgb3BQKyspCi0gICAgewotICAgICAgcCA9IGNyYWNrX29wZXJhbmQgKHAsIG9wUCk7Ci0KLSAgICAgIGlmIChvcFAtPmVycm9yKQotCXsKLQkgIHRoZV9pbnMuZXJyb3IgPSBvcFAtPmVycm9yOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgb3BzZm91bmQgPSBvcFAgLSAmdGhlX2lucy5vcGVyYW5kc1swXTsKLQotICAvKiBUaGlzIHVnbHkgaGFjayBpcyB0byBzdXBwb3J0IHRoZSBmbG9hdGluZyBwdCBvcGNvZGVzIGluIHRoZWlyCi0gICAgIHN0YW5kYXJkIGZvcm0uICBFc3NlbnRpYWxseSwgd2UgZmFrZSBhIGZpcnN0IGVudHkgb2YgdHlwZSBDT1AjMSAqLwotICBpZiAob3Bjb2RlLT5tX29wZXJhbmRzWzBdID09ICdJJykKLSAgICB7Ci0gICAgICBpbnQgbjsKLQotICAgICAgZm9yIChuID0gb3BzZm91bmQ7IG4gPiAwOyAtLW4pCi0JdGhlX2lucy5vcGVyYW5kc1tuXSA9IHRoZV9pbnMub3BlcmFuZHNbbiAtIDFdOwotCi0gICAgICBtZW1zZXQgKChjaGFyICopICgmdGhlX2lucy5vcGVyYW5kc1swXSksICdcMCcsCi0JICAgICAgc2l6ZW9mICh0aGVfaW5zLm9wZXJhbmRzWzBdKSk7Ci0gICAgICB0aGVfaW5zLm9wZXJhbmRzWzBdLm1vZGUgPSBDT05UUk9MOwotICAgICAgdGhlX2lucy5vcGVyYW5kc1swXS5yZWcgPSBtNjhrX2Zsb2F0X2NvcG51bTsKLSAgICAgIG9wc2ZvdW5kKys7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGdvdCB0aGUgb3BlcmFuZHMuICBGaW5kIGFuIG9wY29kZSB0aGF0J2xsIGFjY2VwdCB0aGVtICovCi0gIGZvciAobG9zaW5nID0gMDs7KQotICAgIHsKLSAgICAgIC8qIElmIHdlIGRpZG4ndCBnZXQgdGhlIHJpZ2h0IG51bWJlciBvZiBvcHMsIG9yIHdlIGhhdmUgbm8KLQkgY29tbW9uIG1vZGVsIHdpdGggdGhpcyBwYXR0ZXJuIHRoZW4gcmVqZWN0IHRoaXMgcGF0dGVybi4gKi8KLQotICAgICAgb2tfYXJjaCB8PSBvcGNvZGUtPm1fYXJjaDsKLSAgICAgIGlmIChvcHNmb3VuZCAhPSBvcGNvZGUtPm1fb3BudW0KLQkgIHx8ICgob3Bjb2RlLT5tX2FyY2ggJiBjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gMCkpCi0JKytsb3Npbmc7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChzID0gb3Bjb2RlLT5tX29wZXJhbmRzLCBvcFAgPSAmdGhlX2lucy5vcGVyYW5kc1swXTsKLQkgICAgICAgKnMgJiYgIWxvc2luZzsKLQkgICAgICAgcyArPSAyLCBvcFArKykKLQkgICAgewotCSAgICAgIC8qIFdhcm5pbmc6IHRoaXMgc3dpdGNoIGlzIGh1Z2UhICovCi0JICAgICAgLyogSSd2ZSB0cmllZCB0byBvcmdhbml6ZSB0aGUgY2FzZXMgaW50byB0aGlzIG9yZGVyOgotCQkgbm9uLWFscGhhIGZpcnN0LCB0aGVuIGFscGhhIGJ5IGxldHRlci4gIExvd2VyLWNhc2UKLQkJIGdvZXMgZGlyZWN0bHkgYmVmb3JlIHVwcGVyY2FzZSBjb3VudGVycGFydC4gICovCi0JICAgICAgLyogQ29kZSB3aXRoIG11bHRpcGxlIGNhc2UgLi4uOiBnZXRzIHNvcnRlZCBieSB0aGUgbG93ZXN0Ci0JCSBjYXNlIC4uLiBpdCBiZWxvbmdzIHRvLiAgSSBob3BlIHRoaXMgbWFrZXMgc2Vuc2UuICAqLwotCSAgICAgIHN3aXRjaCAoKnMpCi0JCXsKLQkJY2FzZSAnISc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICc8JzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJz4nOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQwotCQkJICB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbSc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIEFJTkRSOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAnbic6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERJU1A6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICdvJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgQkFTRToKLQkJICAgIGNhc2UgQUJTTDoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICdwJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQUlORFI6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBESVNQOgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICdxJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQUlORFI6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBESVNQOgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAndic6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFJTkRSOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgRElTUDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICcjJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IElNTUVEKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnYicKLQkJCSAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAmJiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgICAgICB8fCAhIGlzYnl0ZSAob3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ0InCi0JCQkgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgJiYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICAgICAgfHwgISBpc3NieXRlIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAndycKLQkJCSAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAmJiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgICAgICB8fCAhIGlzd29yZCAob3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ1cnCi0JCQkgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgJiYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICAgICAgfHwgISBpc3N3b3JkIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnXic6Ci0JCWNhc2UgJ1QnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICckJzoKLQkJICBpZiAob3BQLT5tb2RlID09IEFSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBJTU1FRAotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gUkVHTFNUCi0JCSAgICAgIHx8IChvcFAtPm1vZGUgIT0gQUJTTAotCQkJICAmJiAob3BQLT5yZWcgPT0gUEMKLQkJCSAgICAgIHx8IG9wUC0+cmVnID09IFpQQykpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnJSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBGUFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gUkVHTFNUCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBJTU1FRAotCQkgICAgICB8fCAob3BQLT5tb2RlICE9IEFCU0wKLQkJCSAgJiYgKG9wUC0+cmVnID09IFBDCi0JCQkgICAgICB8fCBvcFAtPnJlZyA9PSBaUEMpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJyYnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQwotCQkJICB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnKic6Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBGUFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gUkVHTFNUKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnKyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBSU5DKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBREVDKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLyc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICc7JzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnPyc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEFCU0w6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLQkJCWxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICdAJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ34nOgkvKiBGb3Igbm93ISAoSkYgRk9PIGlzIHRoaXMgcmlnaHQ/KSAqLwotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQwotCQkJICB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnMyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IChvcFAtPnJlZyAhPSBUVDAgJiYgb3BQLT5yZWcgIT0gVFQxKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0EnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQVJFRykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2EnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQUlORFIpCi0JCSAgICArK2xvc2luZzsKLQkJICBicmVhazsKLQotCQljYXNlICdCJzoJLyogRk9PICovCi0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBQlNMCi0JCSAgICAgIHx8IChmbGFnX2xvbmdfanVtcHMKLQkJCSAgJiYgc3RybmNtcCAoaW5zdHJpbmcsICJqYnNyIiwgNCkgPT0gMCkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdDJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gQ0NSKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBESVNQCi0JCSAgICAgIHx8IG9wUC0+cmVnIDwgQUREUjAKLQkJICAgICAgfHwgb3BQLT5yZWcgPiBBRERSNykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0QnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gRFJFRykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0UnOgotCQkgIGlmIChvcFAtPnJlZyAhPSBBQ0MpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdGJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEZQUkVHKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRyc6Ci0JCSAgaWYgKG9wUC0+cmVnICE9IE1BQ1NSKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnSCc6Ci0JCSAgaWYgKG9wUC0+cmVnICE9IE1BU0spCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdJJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5yZWcgPCBDT1AwCi0JCSAgICAgIHx8IG9wUC0+cmVnID4gQ09QNykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0onOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPnJlZyA8IFVTUAotCQkgICAgICB8fCBvcFAtPnJlZyA+IGxhc3RfbW92ZWNfcmVnKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgKnJwOwotCQkgICAgICBmb3IgKHJwID0gY29udHJvbF9yZWdzOyAqcnA7IHJwKyspCi0JCQlpZiAoKnJwID09IG9wUC0+cmVnKQotCQkJICBicmVhazsKLQkJICAgICAgaWYgKCpycCA9PSAwKQotCQkJbG9zaW5nKys7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnayc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2wnOgotCQljYXNlICdMJzoKLQkJICBpZiAob3BQLT5tb2RlID09IERSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEFSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHKQotCQkgICAgewotCQkgICAgICBpZiAoc1sxXSA9PSAnOCcpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSBEUkVHOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAob3BQLT5yZWcgLSBEQVRBMCk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIEFSRUc6Ci0JCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IChvcFAtPnJlZyAtIEFERFIwICsgOCk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIEZQUkVHOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAob3BQLT5yZWcgLSBGUDAgKyAxNik7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBkZWZhdWx0OgotCQkJICAgICAgYWJvcnQgKCk7Ci0JCQkgICAgfQotCQkJICBvcFAtPm1vZGUgPSBSRUdMU1Q7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAob3BQLT5tb2RlID09IENPTlRST0wpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzWzFdICE9ICc4JykKLQkJCWxvc2luZysrOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JCQkgICAgewotCQkJICAgIGNhc2UgRlBJOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAyNDsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgRlBTOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAyNTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgRlBDOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAyNjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkgICAgICBsb3NpbmcrKzsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgb3BQLT5tb2RlID0gUkVHTFNUOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKG9wUC0+bW9kZSAhPSBSRUdMU1QpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChzWzFdID09ICc4JyAmJiAob3BQLT5tYXNrICYgMHgwZmZmZmZmKSAhPSAwKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnMycgJiYgKG9wUC0+bWFzayAmIDB4NzAwMDAwMCkgIT0gMCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ00nOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgfHwgISBpc3NieXRlIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmICghIG02OGtfcXVpY2sKLQkJCSAgICYmIGluc3RyaW5nWzNdICE9ICdxJwotCQkJICAgJiYgaW5zdHJpbmdbNF0gIT0gJ3EnKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnTyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBEUkVHCi0JCSAgICAgICYmIG9wUC0+bW9kZSAhPSBJTU1FRAotCQkgICAgICAmJiBvcFAtPm1vZGUgIT0gQUJTTCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1EnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgfHwgb3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIgPCAxCi0JCQkgICB8fCBvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlciA+IDgpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmICghIG02OGtfcXVpY2sKLQkJCSAgICYmIChzdHJuY21wIChpbnN0cmluZywgImFkZCIsIDMpID09IDAKLQkJCSAgICAgICB8fCBzdHJuY21wIChpbnN0cmluZywgInN1YiIsIDMpID09IDApCi0JCQkgICAmJiBpbnN0cmluZ1szXSAhPSAncScpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdSJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IERSRUcgJiYgb3BQLT5tb2RlICE9IEFSRUcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdyJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEFJTkRSCi0JCSAgICAgICYmIChvcFAtPm1vZGUgIT0gQkFTRQotCQkJICB8fCAob3BQLT5yZWcgIT0gMAotCQkJICAgICAgJiYgb3BQLT5yZWcgIT0gWkFERFIwKQotCQkJICB8fCBvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19hYnNlbnQKLQkJCSAgfHwgKChvcFAtPmluZGV4LnJlZyA8IERBVEEwCi0JCQkgICAgICAgfHwgb3BQLT5pbmRleC5yZWcgPiBEQVRBNykKLQkJCSAgICAgICYmIChvcFAtPmluZGV4LnJlZyA8IEFERFIwCi0JCQkJICB8fCBvcFAtPmluZGV4LnJlZyA+IEFERFI3KSkKLQkJCSAgfHwgb3BQLT5pbmRleC5zaXplICE9IFNJWkVfVU5TUEVDCi0JCQkgIHx8IG9wUC0+aW5kZXguc2NhbGUgIT0gMSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdzJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgISAob3BQLT5yZWcgPT0gRlBJCi0JCQkgICAgfHwgb3BQLT5yZWcgPT0gRlBTCi0JCQkgICAgfHwgb3BQLT5yZWcgPT0gRlBDKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1MnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBTUikKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3QnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgfHwgb3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIgPCAwCi0JCQkgICB8fCBvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlciA+IDcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdVJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gVVNQKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBKRiB0aGVzZSBhcmUgb3V0IG9mIG9yZGVyLiAgV2UgY291bGQgcHV0IHRoZW0KLQkJICAgICBpbiBvcmRlciBpZiB3ZSB3ZXJlIHdpbGxpbmcgdG8gcHV0IHVwIHdpdGgKLQkJICAgICBidW5jaGVzIG9mICNpZmRlZiBtNjg4NTFzIGluIHRoZSBjb2RlLgotCi0JCSAgICAgRG9uJ3QgZm9yZ2V0IHRoYXQgeW91IG5lZWQgdGhlc2Ugb3BlcmFuZHMKLQkJICAgICB0byB1c2UgNjgwMzAgTU1VIGluc3RydWN0aW9ucy4gICovCi0jaWZuZGVmIE5PXzY4ODUxCi0JCSAgLyogTWVtb3J5IGFkZHJlc3NpbmcgbW9kZSB1c2VkIGJ5IHBmbHVzaHIgKi8KLQkJY2FzZSAnfCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBGUFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gQVJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gUkVHTFNUKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgLyogV2Ugc2hvdWxkIGFjY2VwdCBpbW1lZGlhdGUgb3BlcmFuZHMsIGJ1dCB0aGV5Ci0gICAgICAgICAgICAgICAgICAgICBzdXBwb3NlZGx5IGhhdmUgdG8gYmUgcXVhZCB3b3JkLCBhbmQgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSB0aGF0LiAgSSB3b3VsZCBsaWtlIHRvIHNlZSB3aGF0IGEgTW90b3JvbGEKLSAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlciBkb2VzIGJlZm9yZSBkb2luZyBzb21ldGhpbmcgaGVyZS4gICovCi0JCSAgaWYgKG9wUC0+bW9kZSA9PSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2YnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAob3BQLT5yZWcgIT0gU0ZDICYmIG9wUC0+cmVnICE9IERGQykpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcwJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gVEMpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcxJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gQUMpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcyJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgKG9wUC0+cmVnICE9IENBTAotCQkJICAmJiBvcFAtPnJlZyAhPSBWQUwKLQkJCSAgJiYgb3BQLT5yZWcgIT0gU0NDKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1YnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPnJlZyAhPSBWQUwpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdXJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgKG9wUC0+cmVnICE9IERSUAotCQkJICAmJiBvcFAtPnJlZyAhPSBTUlAKLQkJCSAgJiYgb3BQLT5yZWcgIT0gQ1JQKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1gnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAoIShvcFAtPnJlZyA+PSBCQUQgJiYgb3BQLT5yZWcgPD0gQkFEICsgNykKLQkJCSAgJiYgIShvcFAtPnJlZyA+PSBCQUMgJiYgb3BQLT5yZWcgPD0gQkFDICsgNykpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IFBTUikKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1onOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBQQ1NSKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0jZW5kaWYKLQkJY2FzZSAnYyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IChvcFAtPnJlZyAhPSBOQwotCQkJICAmJiBvcFAtPnJlZyAhPSBJQwotCQkJICAmJiBvcFAtPnJlZyAhPSBEQwotCQkJICAmJiBvcFAtPnJlZyAhPSBCQykpCi0JCSAgICB7Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgfQkJLyogbm90IGEgY2FjaGUgc3BlY2lmaWVyLiAqLwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ18nOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQUJTTCkKLQkJICAgICsrbG9zaW5nOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3UnOgotCQkgIGlmIChvcFAtPnJlZyA8IERBVEEwTCB8fCBvcFAtPnJlZyA+IEFERFI3VSkKLQkJICAgIGxvc2luZysrOwotCQkgIC8qIEZJWE1FOiBrbHVkZ2UgaW5zdGVhZCBvZiBmaXhpbmcgcGFyc2VyOgotICAgICAgICAgICAgICAgICAgICAgdXBwZXIvbG93ZXIgcmVnaXN0ZXJzIGFyZSAqbm90KiBDT05UUk9MCi0gICAgICAgICAgICAgICAgICAgICByZWdpc3RlcnMsIGJ1dCBvcmRpbmFyeSBvbmVzLiAqLwotCQkgIGlmICgob3BQLT5yZWcgPj0gREFUQTBMICYmIG9wUC0+cmVnIDw9IERBVEE3TCkKLQkJICAgICAgfHwgKG9wUC0+cmVnID49IERBVEEwVSAmJiBvcFAtPnJlZyA8PSBEQVRBN1UpKQotCQkgICAgb3BQLT5tb2RlID0gRFJFRzsKLQkJICBlbHNlCi0JCSAgICBvcFAtPm1vZGUgPSBBUkVHOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCX0JCS8qIHN3aXRjaCBvbiB0eXBlIG9mIG9wZXJhbmQgKi8KLQotCSAgICAgIGlmIChsb3NpbmcpCi0JCWJyZWFrOwotCSAgICB9CQkJLyogZm9yIGVhY2ggb3BlcmFuZCAqLwotCX0JCQkvKiBpZiBpbW1lZGlhdGVseSB3cm9uZyAqLwotCi0gICAgICBpZiAoIWxvc2luZykKLQl7Ci0JICBicmVhazsKLQl9CQkJLyogZ290IGl0LiAqLwotCi0gICAgICBvcGNvZGUgPSBvcGNvZGUtPm1fbmV4dDsKLQotICAgICAgaWYgKCFvcGNvZGUpCi0JewotCSAgaWYgKG9rX2FyY2gKLQkgICAgICAmJiAhKG9rX2FyY2ggJiBjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JICAgIHsKLQkgICAgICBjaGFyIGJ1ZlsyMDBdLCAqY3A7Ci0KLQkgICAgICBzdHJjcHkgKGJ1ZiwKLQkJICAgICAgXygiaW52YWxpZCBpbnN0cnVjdGlvbiBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzICIpKTsKLQkgICAgICBjcCA9IGJ1ZiArIHN0cmxlbiAoYnVmKTsKLQkgICAgICBzd2l0Y2ggKG9rX2FyY2gpCi0JCXsKLQkJY2FzZSBtZmxvYXQ6Ci0JCSAgc3RyY3B5IChjcCwgXygiZnB1ICg2ODA0MCwgNjgwNjAgb3IgNjg4ODEvNjg4ODIpIikpOwotCQkgIGJyZWFrOwotCQljYXNlIG1tbXU6Ci0JCSAgc3RyY3B5IChjcCwgXygibW11ICg2ODAzMCBvciA2ODg1MSkiKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgbTY4MDIwdXA6Ci0JCSAgc3RyY3B5IChjcCwgXygiNjgwMjAgb3IgaGlnaGVyIikpOwotCQkgIGJyZWFrOwotCQljYXNlIG02ODAwMHVwOgotCQkgIHN0cmNweSAoY3AsIF8oIjY4MDAwIG9yIGhpZ2hlciIpKTsKLQkJICBicmVhazsKLQkJY2FzZSBtNjgwMTB1cDoKLQkJICBzdHJjcHkgKGNwLCBfKCI2ODAxMCBvciBoaWdoZXIiKSk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgewotCQkgICAgaW50IGdvdF9vbmUgPSAwLCBpZHg7Ci0JCSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNpemVvZiAoYXJjaHMpIC8gc2l6ZW9mIChhcmNoc1swXSk7Ci0JCQkgaWR4KyspCi0JCSAgICAgIHsKLQkJCWlmICgoYXJjaHNbaWR4XS5hcmNoICYgb2tfYXJjaCkKLQkJCSAgICAmJiAhIGFyY2hzW2lkeF0uYWxpYXMpCi0JCQkgIHsKLQkJCSAgICBpZiAoZ290X29uZSkKLQkJCSAgICAgIHsKLQkJCQlzdHJjcHkgKGNwLCAiIG9yICIpOwotCQkJCWNwICs9IHN0cmxlbiAoY3ApOwotCQkJICAgICAgfQotCQkJICAgIGdvdF9vbmUgPSAxOwotCQkJICAgIHN0cmNweSAoY3AsIGFyY2hzW2lkeF0ubmFtZSk7Ci0JCQkgICAgY3AgKz0gc3RybGVuIChjcCk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLQkJfQotCSAgICAgIGNwID0geG1hbGxvYyAoc3RybGVuIChidWYpICsgMSk7Ci0JICAgICAgc3RyY3B5IChjcCwgYnVmKTsKLQkgICAgICB0aGVfaW5zLmVycm9yID0gY3A7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgdGhlX2lucy5lcnJvciA9IF8oIm9wZXJhbmRzIG1pc21hdGNoIik7Ci0JICByZXR1cm47Ci0JfQkJCS8qIEZlbGwgb2ZmIHRoZSBlbmQgKi8KLQotICAgICAgbG9zaW5nID0gMDsKLSAgICB9Ci0KLSAgLyogbm93IGFzc2VtYmxlIGl0ICovCi0KLSAgdGhlX2lucy5hcmdzID0gb3Bjb2RlLT5tX29wZXJhbmRzOwotICB0aGVfaW5zLm51bWFyZ3MgPSBvcGNvZGUtPm1fb3BudW07Ci0gIHRoZV9pbnMubnVtbyA9IG9wY29kZS0+bV9jb2RlbnVtOwotICB0aGVfaW5zLm9wY29kZVswXSA9IGdldG9uZSAob3Bjb2RlKTsKLSAgdGhlX2lucy5vcGNvZGVbMV0gPSBnZXR0d28gKG9wY29kZSk7Ci0KLSAgZm9yIChzID0gdGhlX2lucy5hcmdzLCBvcFAgPSAmdGhlX2lucy5vcGVyYW5kc1swXTsgKnM7IHMgKz0gMiwgb3BQKyspCi0gICAgewotICAgICAgLyogVGhpcyBzd2l0Y2ggaXMgYSBkb296eS4KLSAgICAgICBXYXRjaCB0aGUgZmlyc3Qgc3RlcDsgaXRzIGEgYmlnIG9uZSEgKi8KLSAgICAgIHN3aXRjaCAoc1swXSkKLQl7Ci0KLQljYXNlICcqJzoKLQljYXNlICd+JzoKLQljYXNlICclJzoKLQljYXNlICc7JzoKLQljYXNlICdAJzoKLQljYXNlICchJzoKLQljYXNlICcmJzoKLQljYXNlICckJzoKLQljYXNlICc/JzoKLQljYXNlICcvJzoKLQljYXNlICc8JzoKLQljYXNlICc+JzoKLQljYXNlICdtJzoKLQljYXNlICduJzoKLQljYXNlICdvJzoKLQljYXNlICdwJzoKLQljYXNlICdxJzoKLQljYXNlICd2JzoKLSNpZm5kZWYgTk9fNjg4NTEKLQljYXNlICd8JzoKLSNlbmRpZgotCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBJTU1FRDoKLQkgICAgICB0bXByZWcgPSAweDNjOwkvKiA3LjQgKi8KLQkgICAgICBpZiAoc3RyY2hyICgiYndsIiwgc1sxXSkpCi0JCW5leHR3b3JkID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgICAgIGVsc2UKLQkJbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCAwKTsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQlhZGRfZml4IChzWzFdLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkgICAgICBzd2l0Y2ggKHNbMV0pCi0JCXsKLQkJY2FzZSAnYic6Ci0JCSAgaWYgKCFpc2J5dGUgKG5leHR3b3JkKSkKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSIpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBiYXNlbyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3cnOgotCQkgIGlmICghaXN3b3JkIChuZXh0d29yZCkpCi0JCSAgICBvcFAtPmVycm9yID0gXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UiKTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgYmFzZW8gPSAwOwotCQkgIGJyZWFrOwotCQljYXNlICdXJzoKLQkJICBpZiAoIWlzc3dvcmQgKG5leHR3b3JkKSkKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSIpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBiYXNlbyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkgIGFkZHdvcmQgKG5leHR3b3JkID4+IDE2KTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgYmFzZW8gPSAwOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2YnOgotCQkgIGJhc2VvID0gMjsKLQkJICBvdXRybyA9IDg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0YnOgotCQkgIGJhc2VvID0gNDsKLQkJICBvdXRybyA9IDExOwotCQkgIGJyZWFrOwotCQljYXNlICd4JzoKLQkJICBiYXNlbyA9IDY7Ci0JCSAgb3V0cm8gPSAxNTsKLQkJICBicmVhazsKLQkJY2FzZSAncCc6Ci0JCSAgYmFzZW8gPSA2OwotCQkgIG91dHJvID0gLTE7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBpZiAoIWJhc2VvKQotCQlicmVhazsKLQotCSAgICAgIC8qIFdlIGdvdHRhIHB1dCBvdXQgc29tZSBmbG9hdCAqLwotCSAgICAgIGlmIChvcCAoJm9wUC0+ZGlzcCkgIT0gT19iaWcpCi0JCXsKLQkJICB2YWx1ZVQgdmFsOwotCQkgIGludCBnZW5jbnQ7Ci0KLQkJICAvKiBDYW4gb3RoZXIgY2FzZXMgaGFwcGVuIGhlcmU/ICAqLwotCQkgIGlmIChvcCAoJm9wUC0+ZGlzcCkgIT0gT19jb25zdGFudCkKLQkJICAgIGFib3J0ICgpOwotCi0JCSAgdmFsID0gKHZhbHVlVCkgb2ZmcyAoJm9wUC0+ZGlzcCk7Ci0JCSAgZ2VuY250ID0gMDsKLQkJICBkbwotCQkgICAgewotCQkgICAgICBnZW5lcmljX2JpZ251bVtnZW5jbnRdID0gKExJVFRMRU5VTV9UWVBFKSB2YWw7Ci0JCSAgICAgIHZhbCA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgICArK2dlbmNudDsKLQkJICAgIH0KLQkJICB3aGlsZSAodmFsICE9IDApOwotCQkgIG9mZnMgKCZvcFAtPmRpc3ApID0gZ2VuY250OwotCQl9Ci0JICAgICAgaWYgKG9mZnMgKCZvcFAtPmRpc3ApID4gMCkKLQkJewotCQkgIGlmIChvZmZzICgmb3BQLT5kaXNwKSA+IGJhc2VvKQotCQkgICAgewotCQkgICAgICBhc193YXJuIChfKCJCaWdudW0gdG9vIGJpZyBmb3IgJWMgZm9ybWF0OyB0cnVuY2F0ZWQiKSwKLQkJCSAgICAgICBzWzFdKTsKLQkJICAgICAgb2ZmcyAoJm9wUC0+ZGlzcCkgPSBiYXNlbzsKLQkJICAgIH0KLQkJICBiYXNlbyAtPSBvZmZzICgmb3BQLT5kaXNwKTsKLQkJICB3aGlsZSAoYmFzZW8tLSkKLQkJICAgIGFkZHdvcmQgKDApOwotCQkgIGZvciAod29yZHAgPSBnZW5lcmljX2JpZ251bSArIG9mZnMgKCZvcFAtPmRpc3ApIC0gMTsKLQkJICAgICAgIG9mZnMgKCZvcFAtPmRpc3ApLS07Ci0JCSAgICAgICAtLXdvcmRwKQotCQkgICAgYWRkd29yZCAoKndvcmRwKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGdlbl90b193b3JkcyAod29yZHMsIGJhc2VvLCAobG9uZykgb3V0cm8pOwotCSAgICAgIGZvciAod29yZHAgPSB3b3JkczsgYmFzZW8tLTsgd29yZHArKykKLQkJYWRkd29yZCAoKndvcmRwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEUkVHOgotCSAgICAgIHRtcHJlZyA9IG9wUC0+cmVnIC0gREFUQTsJLyogMC5kcmVnICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJFRzoKLQkgICAgICB0bXByZWcgPSAweDA4ICsgb3BQLT5yZWcgLSBBRERSOwkvKiAxLmFyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBSU5EUjoKLQkgICAgICB0bXByZWcgPSAweDEwICsgb3BQLT5yZWcgLSBBRERSOwkvKiAyLmFyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBREVDOgotCSAgICAgIHRtcHJlZyA9IDB4MjAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDQuYXJlZyAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFJTkM6Ci0JICAgICAgdG1wcmVnID0gMHgxOCArIG9wUC0+cmVnIC0gQUREUjsJLyogMy5hcmVnICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRElTUDoKLQotCSAgICAgIG5leHR3b3JkID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCi0JICAgICAgaWYgKG9wUC0+cmVnID09IFBDCi0JCSAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJICAmJiBtNjhrX2Fic3BjYWRkKQotCQl7Ci0JCSAgb3BQLT5kaXNwLmV4cC5YX29wID0gT19zeW1ib2w7Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQkJICBvcFAtPmRpc3AuZXhwLlhfYWRkX3N5bWJvbCA9ICZhYnNfc3ltYm9sOwotI2Vsc2UKLQkJICBvcFAtPmRpc3AuZXhwLlhfYWRkX3N5bWJvbCA9Ci0JCSAgICBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0jZW5kaWYKLQkJfQotCi0JICAgICAgLyogRm9yY2UgaW50byBpbmRleCBtb2RlLiAgSG9wZSB0aGlzIHdvcmtzICovCi0KLQkgICAgICAvKiBXZSBkbyB0aGUgZmlyc3QgYml0IGZvciAzMi1iaXQgZGlzcGxhY2VtZW50cywgYW5kIHRoZQotCQkgc2Vjb25kIGJpdCBmb3IgMTYgYml0IG9uZXMuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlCi0JCSBzaG91bGQgbWFrZSB0aGUgZGVmYXVsdCBiZSBXT1JEIGluc3RlYWQgb2YgTE9ORywgYnV0Ci0JCSBJIHRoaW5rIHRoYXQnZCBicmVhayBHQ0MsIHNvIHdlIHB1dCB1cCB3aXRoIGEgbGl0dGxlCi0JCSBpbmVmZmljaWVuY3kgZm9yIHRoZSBzYWtlIG9mIHdvcmtpbmcgb3V0cHV0LiAgKi8KLQotCSAgICAgIGlmICghaXNzd29yZCAobmV4dHdvcmQpCi0JCSAgfHwgKGlzdmFyICgmb3BQLT5kaXNwKQotCQkgICAgICAmJiAoKG9wUC0+ZGlzcC5zaXplID09IFNJWkVfVU5TUEVDCi0JCQkgICAmJiBmbGFnX3Nob3J0X3JlZnMgPT0gMAotCQkJICAgJiYgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA+PSBtNjgwMjAKLQkJCSAgICYmICEgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JCQkgIHx8IG9wUC0+ZGlzcC5zaXplID09IFNJWkVfTE9ORykpKQotCQl7Ci0JCSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkJICAgICAgfHwgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JCSAgICBvcFAtPmVycm9yID0KLQkJICAgICAgXygiZGlzcGxhY2VtZW50IHRvbyBsYXJnZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIpOwotCQkgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJICAgIHRtcHJlZyA9IDB4M0I7CS8qIDcuMyAqLwotCQkgIGVsc2UKLQkJICAgIHRtcHJlZyA9IDB4MzAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDYuYXJlZyAqLwotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJCXsKLQkJCSAgaWYgKG9wUC0+ZGlzcC5zaXplID09IFNJWkVfTE9ORwotI2lmZGVmIE9CSl9FTEYKLQkJCSAgICAgIC8qIElmIHRoZSBkaXNwbGFjZW1lbnQgbmVlZHMgcGljCi0JCQkJIHJlbG9jYXRpb24gaXQgY2Fubm90IGJlIHJlbGF4ZWQuICAqLwotCQkJICAgICAgfHwgb3BQLT5kaXNwLnBpY19yZWxvYyAhPSBwaWNfbm9uZQotI2VuZGlmCi0JCQkgICAgICApCi0JCQkgICAgewotCQkJICAgICAgYWRkd29yZCAoMHgwMTcwKTsKLQkJCSAgICAgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLAotCQkJCQlvZmZzICgmb3BQLT5kaXNwKSwKLQkJCQkJVEFCIChQQ0xFQSwgU1pfVU5ERUYpKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhZGR3b3JkICgweDAxNzApOwotCQkJICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDAsIDApOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFkZHdvcmQgKDB4MDE3MCk7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQgPj4gMTYpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkgICAgdG1wcmVnID0gMHgzQTsJLyogNy4yICovCi0JCSAgZWxzZQotCQkgICAgdG1wcmVnID0gMHgyOCArIG9wUC0+cmVnIC0gQUREUjsJLyogNS5hcmVnICovCi0KLQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQkgICAgewotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMpCi0JCQl7Ci0JCQkgIGFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBQT1NUOgotCSAgICBjYXNlIFBSRToKLQkgICAgY2FzZSBCQVNFOgotCSAgICAgIG5leHR3b3JkID0gMDsKLQkgICAgICBiYXNlbyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgICAgICBpZiAob3BQLT5tb2RlID09IFBPU1QgfHwgb3BQLT5tb2RlID09IFBSRSkKLQkJb3V0cm8gPSBnZXRfbnVtICgmb3BQLT5vZGlzcCwgODApOwotCSAgICAgIC8qIEZpZ3VyZSBvdXQgdGhlIGBhZGRyZXNzaW5nIG1vZGUnLgotCQkgQWxzbyB0dXJuIG9uIHRoZSBCQVNFX0RJU0FCTEUgYml0LCBpZiBuZWVkZWQuICAqLwotCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCXsKLQkJICB0bXByZWcgPSAweDNiOwkvKiA3LjMgKi8KLQkJICBpZiAob3BQLT5yZWcgPT0gWlBDKQotCQkgICAgbmV4dHdvcmQgfD0gMHg4MDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wUC0+cmVnID09IDApCi0JCXsKLQkJICBuZXh0d29yZCB8PSAweDgwOwotCQkgIHRtcHJlZyA9IDB4MzA7CS8qIDYuZ2FyYmFnZSAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BQLT5yZWcgPj0gWkFERFIwICYmIG9wUC0+cmVnIDw9IFpBRERSNykKLQkJewotCQkgIG5leHR3b3JkIHw9IDB4ODA7Ci0JCSAgdG1wcmVnID0gMHgzMCArIG9wUC0+cmVnIC0gWkFERFIwOwotCQl9Ci0JICAgICAgZWxzZQotCQl0bXByZWcgPSAweDMwICsgb3BQLT5yZWcgLSBBRERSOwkvKiA2LmFyZWcgKi8KLQotCSAgICAgIHNpejEgPSBvcFAtPmRpc3Auc2l6ZTsKLQkgICAgICBpZiAob3BQLT5tb2RlID09IFBPU1QgfHwgb3BQLT5tb2RlID09IFBSRSkKLQkJc2l6MiA9IG9wUC0+b2Rpc3Auc2l6ZTsKLQkgICAgICBlbHNlCi0JCXNpejIgPSBTSVpFX1VOU1BFQzsKLQotCSAgICAgIC8qIEluZGV4IHJlZ2lzdGVyIHN0dWZmICovCi0JICAgICAgaWYgKG9wUC0+aW5kZXgucmVnICE9IDAKLQkJICAmJiBvcFAtPmluZGV4LnJlZyA+PSBEQVRBCi0JCSAgJiYgb3BQLT5pbmRleC5yZWcgPD0gQUREUjcpCi0JCXsKLQkJICBuZXh0d29yZCB8PSAob3BQLT5pbmRleC5yZWcgLSBEQVRBKSA8PCAxMjsKLQotCQkgIGlmIChvcFAtPmluZGV4LnNpemUgPT0gU0laRV9MT05HCi0JCSAgICAgIHx8IChvcFAtPmluZGV4LnNpemUgPT0gU0laRV9VTlNQRUMKLQkJCSAgJiYgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0ID09IFNJWkVfTE9ORykpCi0JCSAgICBuZXh0d29yZCB8PSAweDgwMDsKLQotCQkgIGlmICgob3BQLT5pbmRleC5zY2FsZSAhPSAxIAotCQkgICAgICAgJiYgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMCkKLQkJICAgICAgfHwgKG9wUC0+aW5kZXguc2NhbGUgPT0gOCAKLQkJCSAgJiYgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpKQotCQkgICAgewotCQkgICAgICBvcFAtPmVycm9yID0KLQkJCV8oInNjYWxlIGZhY3RvciBpbnZhbGlkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyBjcHUzMiBvciA2ODAyMCBvciBoaWdoZXIiKTsKLQkJICAgIH0KLQotCQkgIGlmIChhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCQkgICAgICAmJiBvcFAtPmluZGV4LnNpemUgPT0gU0laRV9XT1JEKQotCQkgICAgb3BQLT5lcnJvciA9IF8oImludmFsaWQgaW5kZXggc2l6ZSBmb3IgY29sZGZpcmUiKTsKLQotCQkgIHN3aXRjaCAob3BQLT5pbmRleC5zY2FsZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDI6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MjAwOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgNDoKLQkJICAgICAgbmV4dHdvcmQgfD0gMHg0MDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA4OgotCQkgICAgICBuZXh0d29yZCB8PSAweDYwMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIH0KLQkJICAvKiBJRiBpdHMgc2ltcGxlLAotCQkgICAgIEdFVCBVUyBPVVQgT0YgSEVSRSEgKi8KLQotCQkgIC8qIE11c3QgYmUgSU5ERVgsIHdpdGggYW4gaW5kZXggcmVnaXN0ZXIuICBBZGRyZXNzCi0JCSAgICAgcmVnaXN0ZXIgY2Fubm90IGJlIFpFUk8tUEMsIGFuZCBlaXRoZXIgOmIgd2FzCi0JCSAgICAgZm9yY2VkLCBvciB3ZSBrbm93IGl0IHdpbGwgZml0LiAgRm9yIGEgNjgwMDAgb3IKLQkJICAgICA2ODAxMCwgZm9yY2UgdGhpcyBtb2RlIGFueXdheXMsIGJlY2F1c2UgdGhlCi0JCSAgICAgbGFyZ2VyIG1vZGVzIGFyZW4ndCBzdXBwb3J0ZWQuICAqLwotCQkgIGlmIChvcFAtPm1vZGUgPT0gQkFTRQotCQkgICAgICAmJiAoKG9wUC0+cmVnID49IEFERFIwCi0JCQkgICAmJiBvcFAtPnJlZyA8PSBBRERSNykKLQkJCSAgfHwgb3BQLT5yZWcgPT0gUEMpKQotCQkgICAgewotCQkgICAgICBpZiAoc2l6MSA9PSBTSVpFX0JZVEUKLQkJCSAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCQkJICB8fCBhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCQkJICB8fCAoc2l6MSA9PSBTSVpFX1VOU1BFQwotCQkJICAgICAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJCSAgICAgICYmIGlzc2J5dGUgKGJhc2VvKSkpCi0JCQl7Ci0gCQkJICBuZXh0d29yZCArPSBiYXNlbyAmIDB4ZmY7Ci0gCQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0gCQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIERvIGEgYnl0ZSByZWxvY2F0aW9uLiAgSWYgaXQgZG9lc24ndAotCQkJCSBmaXQgKHBvc3NpYmxlIG9uIG02ODAwMCkgbGV0IHRoZQotCQkJCSBmaXh1cCBwcm9jZXNzaW5nIGNvbXBsYWluIGxhdGVyLiAgKi8KLQkJCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJCQlhZGRfZml4ICgnQicsICZvcFAtPmRpc3AsIDEsIDEpOwotCQkJICAgICAgZWxzZQotCQkJCWFkZF9maXggKCdCJywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JCQkgICAgfQotCQkJICBlbHNlIGlmIChzaXoxICE9IFNJWkVfQllURSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc2l6MSAhPSBTSVpFX1VOU1BFQykKLQkJCQlhc193YXJuIChfKCJGb3JjaW5nIGJ5dGUgZGlzcGxhY2VtZW50IikpOwotCQkJICAgICAgaWYgKCEgaXNzYnl0ZSAoYmFzZW8pKQotCQkJCW9wUC0+ZXJyb3IgPSBfKCJieXRlIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UiKTsKLQkJCSAgICB9Ci0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNpejEgPT0gU0laRV9VTlNQRUMKLQkJCSAgICAgICAmJiBvcFAtPnJlZyA9PSBQQwotCQkJICAgICAgICYmIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgICAgICYmIHN1YnMgKCZvcFAtPmRpc3ApID09IE5VTEwKLSNpZmRlZiBPQkpfRUxGCi0JCQkgICAgICAgLyogSWYgdGhlIGRpc3BsYWNlbWVudCBuZWVkcyBwaWMKLQkJCQkgIHJlbG9jYXRpb24gaXQgY2Fubm90IGJlIHJlbGF4ZWQuICAqLwotCQkJICAgICAgICYmIG9wUC0+ZGlzcC5waWNfcmVsb2MgPT0gcGljX25vbmUKLSNlbmRpZgotCQkJICAgICAgICkKLQkJCXsKLQkJCSAgLyogVGhlIGNvZGUgaW4gbWRfY29udmVydF9mcmFnXzEgbmVlZHMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJsZSB0byBhZGp1c3QgbmV4dHdvcmQuICBDYWxsIGZyYWdfZ3JvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBzcGFjZSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhZyBvYnN0YWNrIHRvIG1ha2UgYWxsIHRoZSBieXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aWd1b3VzLiAgKi8KLQkJCSAgZnJhZ19ncm93ICgxNCk7Ci0gCQkJICBuZXh0d29yZCArPSBiYXNlbyAmIDB4ZmY7Ci0gCQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0gCQkJICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksIG9mZnMgKCZvcFAtPmRpc3ApLAotIAkJCQkgICAgVEFCIChQQ0lOREVYLCBTWl9VTkRFRikpOwotCi0JCQkgIGJyZWFrOwotIAkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG5leHR3b3JkIHw9IDB4NDA7CS8qIE5vIGluZGV4IHJlZyAqLwotCQkgIGlmIChvcFAtPmluZGV4LnJlZyA+PSBaREFUQTAKLQkJICAgICAgJiYgb3BQLT5pbmRleC5yZWcgPD0gWkRBVEE3KQotCQkgICAgbmV4dHdvcmQgfD0gKG9wUC0+aW5kZXgucmVnIC0gWkRBVEEwKSA8PCAxMjsKLQkJICBlbHNlIGlmIChvcFAtPmluZGV4LnJlZyA+PSBaQUREUjAKLQkJCSAgIHx8IG9wUC0+aW5kZXgucmVnIDw9IFpBRERSNykKLQkJICAgIG5leHR3b3JkIHw9IChvcFAtPmluZGV4LnJlZyAtIFpBRERSMCArIDgpIDw8IDEyOwotCQl9Ci0KLQkgICAgICAvKiBJdCBpc24ndCBzaW1wbGUuICAqLwotCi0JICAgICAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkJICB8fCBhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkJb3BQLT5lcnJvciA9Ci0JCSAgXygiaW52YWxpZCBvcGVyYW5kIG1vZGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiKTsKLQotCSAgICAgIG5leHR3b3JkIHw9IDB4MTAwOwotCSAgICAgIC8qIElmIHRoZSBndXkgc3BlY2lmaWVkIGEgd2lkdGgsIHdlIGFzc3VtZSB0aGF0IGl0IGlzCi0JCSB3aWRlIGVub3VnaC4gIE1heWJlIGl0IGlzbid0LiAgSWYgc28sIHdlIGxvc2UuICAqLwotCSAgICAgIHN3aXRjaCAoc2l6MSkKLQkJewotCQljYXNlIFNJWkVfVU5TUEVDOgotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJICAgICAgPyBtNjhrX3JlbDMyCi0JCSAgICAgIDogISBpc3N3b3JkIChiYXNlbykpCi0JCSAgICB7Ci0JCSAgICAgIHNpejEgPSBTSVpFX0xPTkc7Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MzA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoISBpc3ZhciAoJm9wUC0+ZGlzcCkgJiYgYmFzZW8gPT0gMCkKLQkJICAgIG5leHR3b3JkIHw9IDB4MTA7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBuZXh0d29yZCB8PSAweDIwOwotCQkgICAgICBzaXoxID0gU0laRV9XT1JEOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQljYXNlIFNJWkVfQllURToKLQkJICBhc193YXJuIChfKCI6YiBub3QgcGVybWl0dGVkOyBkZWZhdWx0aW5nIHRvIDp3IikpOwotCQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCWNhc2UgU0laRV9XT1JEOgotCQkgIG5leHR3b3JkIHw9IDB4MjA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgU0laRV9MT05HOgotCQkgIG5leHR3b3JkIHw9IDB4MzA7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIEZpZ3VyZSBvdXQgaW5ubmVyIGRpc3BsYWNlbWVudCBzdHVmZiAqLwotCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQotCQl7Ci0JCSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgJiBjcHUzMikKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJpbnZhbGlkIG9wZXJhbmQgbW9kZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIpOwotCQkgIHN3aXRjaCAoc2l6MikKLQkJICAgIHsKLQkJICAgIGNhc2UgU0laRV9VTlNQRUM6Ci0JCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+b2Rpc3ApCi0JCQkgID8gbTY4a19yZWwzMgotCQkJICA6ICEgaXNzd29yZCAob3V0cm8pKQotCQkJewotCQkJICBzaXoyID0gU0laRV9MT05HOwotCQkJICBuZXh0d29yZCB8PSAweDM7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKCEgaXN2YXIgKCZvcFAtPm9kaXNwKSAmJiBvdXRybyA9PSAwKQotCQkJbmV4dHdvcmQgfD0gMHgxOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIG5leHR3b3JkIHw9IDB4MjsKLQkJCSAgc2l6MiA9IFNJWkVfV09SRDsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIGFzX3dhcm4gKF8oIjpiIG5vdCBwZXJtaXR0ZWQ7IGRlZmF1bHRpbmcgdG8gOnciKSk7Ci0JCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCSAgICBjYXNlIDI6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDM6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBQT1NUCi0JCSAgICAgICYmIChuZXh0d29yZCAmIDB4NDApID09IDApCi0JCSAgICBuZXh0d29yZCB8PSAweDA0OwotCQl9Ci0JICAgICAgYWRkd29yZCAobmV4dHdvcmQpOwotCi0JICAgICAgaWYgKHNpejEgIT0gU0laRV9VTlNQRUMgJiYgaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl7Ci0JCSAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLQkJICAgIGFkZF9maXggKHNpejEgPT0gU0laRV9MT05HID8gJ2wnIDogJ3cnLCAmb3BQLT5kaXNwLCAxLCAyKTsKLQkJICBlbHNlCi0JCSAgICBhZGRfZml4IChzaXoxID09IFNJWkVfTE9ORyA/ICdsJyA6ICd3JywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JCX0KLQkgICAgICBpZiAoc2l6MSA9PSBTSVpFX0xPTkcpCi0JCWFkZHdvcmQgKGJhc2VvID4+IDE2KTsKLQkgICAgICBpZiAoc2l6MSAhPSBTSVpFX1VOU1BFQykKLQkJYWRkd29yZCAoYmFzZW8pOwotCi0JICAgICAgaWYgKHNpejIgIT0gU0laRV9VTlNQRUMgJiYgaXN2YXIgKCZvcFAtPm9kaXNwKSkKLQkJYWRkX2ZpeCAoc2l6MiA9PSBTSVpFX0xPTkcgPyAnbCcgOiAndycsICZvcFAtPm9kaXNwLCAwLCAwKTsKLQkgICAgICBpZiAoc2l6MiA9PSBTSVpFX0xPTkcpCi0JCWFkZHdvcmQgKG91dHJvID4+IDE2KTsKLQkgICAgICBpZiAoc2l6MiAhPSBTSVpFX1VOU1BFQykKLQkJYWRkd29yZCAob3V0cm8pOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBQlNMOgotCSAgICAgIG5leHR3b3JkID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgICAgIHN3aXRjaCAob3BQLT5kaXNwLnNpemUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJY2FzZSBTSVpFX1VOU1BFQzoKLQkJICBpZiAoIWlzdmFyICgmb3BQLT5kaXNwKSAmJiBpc3N3b3JkIChvZmZzICgmb3BQLT5kaXNwKSkpCi0JCSAgICB7Ci0JCSAgICAgIHRtcHJlZyA9IDB4Mzg7CS8qIDcuMCAqLwotCQkgICAgICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qIERvbid0IGdlbmVyYXRlIHBjIHJlbGF0aXZlIGNvZGUgb24gNjgwMTAgYW5kCi0JCSAgICAgNjgwMDAuICAqLwotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJICAgICAgJiYgIXN1YnMgKCZvcFAtPmRpc3ApCi0JCSAgICAgICYmIGFkZHMgKCZvcFAtPmRpc3ApCi0jaWZkZWYgT0JKX0VMRgotCQkgICAgICAvKiBJZiB0aGUgZGlzcGxhY2VtZW50IG5lZWRzIHBpYyByZWxvY2F0aW9uIGl0Ci0JCQkgY2Fubm90IGJlIHJlbGF4ZWQuICAqLwotCQkgICAgICAmJiBvcFAtPmRpc3AucGljX3JlbG9jID09IHBpY19ub25lCi0jZW5kaWYKLQkJICAgICAgJiYgU19HRVRfU0VHTUVOVCAoYWRkcyAoJm9wUC0+ZGlzcCkpID09IG5vd19zZWcKLQkJICAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoYWRkcyAoJm9wUC0+ZGlzcCkpCi0JCSAgICAgICYmIEhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpCi0JCSAgICAgICYmICFmbGFnX2xvbmdfanVtcHMKLQkJICAgICAgJiYgIXN0cmNociAoIn4lJiQ/Iiwgc1swXSkpCi0JCSAgICB7Ci0JCSAgICAgIHRtcHJlZyA9IDB4M0E7CS8qIDcuMiAqLwotCQkgICAgICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksCi0JCQkJb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCQkJVEFCIChQQ1JFTCwgU1pfVU5ERUYpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyogRmFsbCB0aHJvdWdoIGludG8gbG9uZyAqLwotCQljYXNlIFNJWkVfTE9ORzoKLQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQkgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQotCQkgIHRtcHJlZyA9IDB4Mzk7LyogNy4xIG1vZGUgKi8KLQkJICBhZGR3b3JkIChuZXh0d29yZCA+PiAxNik7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgU0laRV9CWVRFOgotCQkgIGFzX2JhZCAoXygidW5zdXBwb3J0ZWQgYnl0ZSB2YWx1ZTsgdXNlIGEgZGlmZmVyZW50IHN1ZmZpeCIpKTsKLQkJICAvKiBGYWxsIHRocm91Z2guICAqLwotCQljYXNlIFNJWkVfV09SRDoJLyogV29yZCAqLwotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCSAgICBhZGRfZml4ICgndycsICZvcFAtPmRpc3AsIDAsIDApOwotCi0JCSAgdG1wcmVnID0gMHgzODsvKiA3LjAgbW9kZSAqLwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENPTlRST0w6Ci0JICAgIGNhc2UgRlBSRUc6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfYmFkIChfKCJ1bmtub3duL2luY29ycmVjdCBvcGVyYW5kIikpOwotCSAgICAgIC8qIGFib3J0KCk7ICovCi0JICAgIH0KLQkgIGluc3RhbGxfZ2VuX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJyMnOgotCWNhc2UgJ14nOgotCSAgc3dpdGNoIChzWzFdKQotCSAgICB7CQkJLyogSkY6IEkgaGF0ZSBmbG9hdGluZyBwb2ludCEgKi8KLQkgICAgY2FzZSAnaic6Ci0JICAgICAgdG1wcmVnID0gNzA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzgnOgotCSAgICAgIHRtcHJlZyA9IDIwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdDJzoKLQkgICAgICB0bXByZWcgPSA1MDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMyc6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgdG1wcmVnID0gODA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIHRtcHJlZyk7Ci0JICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCSAgICBhZGRfZml4IChzWzFdLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkgIHN3aXRjaCAoc1sxXSkKLQkgICAgewotCSAgICBjYXNlICdiJzoJCS8qIERhbmdlcjogIFRoZXNlIGRvIG5vIGNoZWNrIGZvcgotCQkJCSAgIGNlcnRhaW4gdHlwZXMgb2Ygb3ZlcmZsb3cuCi0JCQkJICAgdXNlciBiZXdhcmUhICovCi0JICAgICAgaWYgKCFpc2J5dGUgKHRtcHJlZykpCi0JCW9wUC0+ZXJyb3IgPSBfKCJvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9Ci0JCSAgKG9wY29kZS0+bV9jb2RlbnVtKSAqIDIgKyAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdCJzoKLQkgICAgICBpZiAoIWlzc2J5dGUgKHRtcHJlZykpCi0JCW9wUC0+ZXJyb3IgPSBfKCJvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICB0aGVfaW5zLm9wY29kZVt0aGVfaW5zLm51bW8gLSAxXSB8PSB0bXByZWcgJiAweGZmOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9IG9wY29kZS0+bV9jb2RlbnVtICogMiAtIDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3cnOgotCSAgICAgIGlmICghaXN3b3JkICh0bXByZWcpKQotCQlvcFAtPmVycm9yID0gXygib3V0IG9mIHJhbmdlIik7Ci0JICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPSAob3Bjb2RlLT5tX2NvZGVudW0pICogMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgaWYgKCFpc3N3b3JkICh0bXByZWcpKQotCQlvcFAtPmVycm9yID0gXygib3V0IG9mIHJhbmdlIik7Ci0JICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPSAob3Bjb2RlLT5tX2NvZGVudW0pICogMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JICAgICAgLyogQmVjYXVzZSBvZiB0aGUgd2F5IGluc29wIHdvcmtzLCB3ZSBwdXQgdGhlc2UgdHdvIG91dAotCQkgYmFja3dhcmRzLiAgKi8KLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICAgIGluc29wICh0bXByZWcgPj4gMTYsIG9wY29kZSk7Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWwgLSAxXS5uID0gKG9wY29kZS0+bV9jb2RlbnVtKSAqIDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzMnOgotCSAgICAgIHRtcHJlZyAmPSAweEZGOwotCSAgICBjYXNlICc4JzoKLQkgICAgY2FzZSAnQyc6Ci0JICAgIGNhc2UgJ2onOgotCSAgICAgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICcrJzoKLQljYXNlICctJzoKLQljYXNlICdBJzoKLQljYXNlICdhJzoKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5yZWcgLSBBRERSKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQic6Ci0JICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0JICBzd2l0Y2ggKHNbMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgLyogVGhlIHBjX2ZpeCBhcmd1bWVudCB3aW5kcyB1cCBpbiBmeF9wY3JlbF9hZGp1c3QsCi0gICAgICAgICAgICAgICAgIHdoaWNoIGlzIGEgY2hhciwgYW5kIG1heSB0aGVyZWZvcmUgYmUgdW5zaWduZWQuICBXZQotICAgICAgICAgICAgICAgICB3YW50IHRvIHBhc3MgLTEsIGJ1dCB3ZSBwYXNzIDY0IGluc3RlYWQsIGFuZCBjb252ZXJ0Ci0gICAgICAgICAgICAgICAgIGJhY2sgaW4gbWRfcGNyZWxfZnJvbS4gICovCi0JICAgICAgYWRkX2ZpeCAoJ0InLCAmb3BQLT5kaXNwLCAxLCA2NCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIGFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JICAgICAgYWRkd29yZCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0wnOgotCSAgICBsb25nX2JyYW5jaDoKLQkgICAgICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCQlhc193YXJuIChfKCJDYW4ndCB1c2UgbG9uZyBicmFuY2hlcyBvbiA2ODAwMC82ODAxMC81MjAwIikpOwotCSAgICAgIHRoZV9pbnMub3Bjb2RlW3RoZV9pbnMubnVtbyAtIDFdIHw9IDB4ZmY7Ci0JICAgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkgICAgICBhZGR3b3JkICgwKTsKLQkgICAgICBhZGR3b3JkICgwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZyc6Ci0JICAgICAgaWYgKHN1YnMgKCZvcFAtPmRpc3ApKQkvKiBXZSBjYW4ndCByZWxheCBpdCAqLwotCQlnb3RvIGxvbmdfYnJhbmNoOwotCi0jaWZkZWYgT0JKX0VMRgotCSAgICAgIC8qIElmIHRoZSBkaXNwbGFjZW1lbnQgbmVlZHMgcGljIHJlbG9jYXRpb24gaXQgY2Fubm90IGJlCi0JCSByZWxheGVkLiAgKi8KLQkgICAgICBpZiAob3BQLT5kaXNwLnBpY19yZWxvYyAhPSBwaWNfbm9uZSkKLQkJZ290byBsb25nX2JyYW5jaDsKLSNlbmRpZgotCi0JICAgICAgLyogVGhpcyBjb3VsZCBlaXRoZXIgYmUgYSBzeW1ib2wsIG9yIGFuIGFic29sdXRlCi0JCSBhZGRyZXNzLiAgTm8gbWF0dGVyLCB0aGUgZnJhZyBoYWNraW5nIHdpbGwgZmluZ2VyIGl0Ci0JCSBvdXQuICBOb3QgcXVpdGU6IGl0IGNhbid0IHN3aXRjaCBmcm9tIEJSQU5DSCB0bwotCQkgQkNDNjgwMDAgZm9yIHRoZSBjYXNlIHdoZXJlIG9wbmQgaXMgYWJzb2x1dGUgKGl0Ci0JCSBuZWVkcyB0byB1c2UgdGhlIDY4MDAwIGhhY2sgc2luY2Ugbm8gY29uZGl0aW9uYWwgYWJzCi0JCSBqdW1wcykuICAqLwotCSAgICAgIGlmICgoICFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCQkgICB8fCAoMCA9PSBhZGRzICgmb3BQLT5kaXNwKSkpCi0JCSAgJiYgKHRoZV9pbnMub3Bjb2RlWzBdID49IDB4NjIwMCkKLQkJICAmJiAodGhlX2lucy5vcGNvZGVbMF0gPD0gMHg2ZjAwKSkKLQkJYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKLQkJCSAgVEFCIChCQ0M2ODAwMCwgU1pfVU5ERUYpKTsKLQkgICAgICBlbHNlCi0JCWFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCQkgIFRBQiAoQUJSQU5DSCwgU1pfVU5ERUYpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndyc6Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJewotI2lmIDEKLQkJICAvKiBjaGVjayBmb3IgREJjYyBpbnN0cnVjdGlvbiAqLwotCQkgIGlmICgodGhlX2lucy5vcGNvZGVbMF0gJiAweGYwZjgpID09IDB4NTBjOCkKLQkJICAgIHsKLQkJICAgICAgLyogc2l6ZSB2YXJpZXMgaWYgcGF0Y2ggKi8KLQkJICAgICAgLyogbmVlZGVkIGZvciBsb25nIGZvcm0gKi8KLQkJICAgICAgYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKLQkJCQlUQUIgKERCQ0MsIFNaX1VOREVGKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotI2VuZGlmCi0JCSAgYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkJfQotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdDJzoJCS8qIEZpeGVkIHNpemUgTE9ORyBjb3Byb2MgYnJhbmNoZXMgKi8KLQkgICAgICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDEsIDApOwotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdjJzoJCS8qIFZhciBzaXplIENvcHJvY2Vzc3NvciBicmFuY2hlcyAqLwotCSAgICAgIGlmIChzdWJzICgmb3BQLT5kaXNwKSkKLQkJewotCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JCSAgYWRkX2ZyYWcgKChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAwLCBUQUIgKEZCUkFOQ0gsIExPTkcpKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGFkZHMgKCZvcFAtPmRpc3ApKQotCQlhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksIG9mZnMgKCZvcFAtPmRpc3ApLAotCQkJICBUQUIgKEZCUkFOQ0gsIFNaX1VOREVGKSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogYWRkX2ZyYWcgKChzeW1ib2xTICopIDAsIG9mZnMgKCZvcFAtPmRpc3ApLAotCQkgICAgIAkgICAgICAgVEFCKEZCUkFOQ0gsU0hPUlQpKTsgKi8KLQkJICB0aGVfaW5zLm9wY29kZVt0aGVfaW5zLm51bW8gLSAxXSB8PSAweDQwOwotCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JCSAgYWRkd29yZCAoMCk7Ci0JCSAgYWRkd29yZCAoMCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoJCS8qIElnbm9yZSBpdCAqLwotCSAgYnJlYWs7Ci0KLQljYXNlICdkJzoJCS8qIEpGIHRoaXMgaXMgYSBrbHVkZ2UgKi8KLQkgIGluc3RhbGxfb3BlcmFuZCAoJ3MnLCBvcFAtPnJlZyAtIEFERFIpOwotCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgaWYgKCFpc3N3b3JkICh0bXByZWcpKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2UsIHVzaW5nIDAiKSk7Ci0JICAgICAgdG1wcmVnID0gMDsKLQkgICAgfQotCSAgYWRkd29yZCAodG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRCc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0UnOgkJLyogSWdub3JlIGl0ICovCi0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIEZQMCk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0cnOgkJLyogSWdub3JlIGl0ICovCi0JY2FzZSAnSCc6Ci0JICBicmVhazsKLQotCWNhc2UgJ0knOgotCSAgdG1wcmVnID0gb3BQLT5yZWcgLSBDT1AwOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdKJzoJCS8qIEpGIGZvbyAqLwotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIFNGQzoKLQkgICAgICB0bXByZWcgPSAweDAwMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBERkM6Ci0JICAgICAgdG1wcmVnID0gMHgwMDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0FDUjoKLQkgICAgICB0bXByZWcgPSAweDAwMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBUQzoKLQkgICAgICB0bXByZWcgPSAweDAwMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJVFQwOgotCSAgICAgIHRtcHJlZyA9IDB4MDA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElUVDE6Ci0JICAgICAgdG1wcmVnID0gMHgwMDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRUMDoKLQkgICAgICB0bXByZWcgPSAweDAwNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEVFQxOgotCSAgICAgIHRtcHJlZyA9IDB4MDA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJVU0NSOgotCSAgICAgIHRtcHJlZyA9IDB4MDA4OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgVVNQOgotCSAgICAgIHRtcHJlZyA9IDB4ODAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZCUjoKLQkgICAgICB0bXByZWcgPSAweDgwMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDQUFSOgotCSAgICAgIHRtcHJlZyA9IDB4ODAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1TUDoKLQkgICAgICB0bXByZWcgPSAweDgwMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJU1A6Ci0JICAgICAgdG1wcmVnID0gMHg4MDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTU1VU1I6Ci0JICAgICAgdG1wcmVnID0gMHg4MDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVVJQOgotCSAgICAgIHRtcHJlZyA9IDB4ODA2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNSUDoKLQkgICAgICB0bXByZWcgPSAweDgwNzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1I6Ci0JICAgICAgdG1wcmVnID0gMHg4MDg7Ci0JICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJPTUJBUjoKLQkgICAgICB0bXByZWcgPSAweEMwMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSQU1CQVIwOgotCSAgICAgIHRtcHJlZyA9IDB4QzA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJBTUJBUjE6Ci0JICAgICAgdG1wcmVnID0gMHhDMDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTUJBUjoKLQkgICAgICB0bXByZWcgPSAweEMwRjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdrJzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDU1KTsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnICYgMHg3Zik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2wnOgotCSAgdG1wcmVnID0gb3BQLT5tYXNrOwotCSAgaWYgKHNbMV0gPT0gJ3cnKQotCSAgICB7Ci0JICAgICAgaWYgKHRtcHJlZyAmIDB4N0ZGMDAwMCkKLQkJYXNfYmFkIChfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiByZWdpc3RlciBsaXN0IikpOwotCSAgICAgIGluc29wIChyZXZlcnNlXzE2X2JpdHMgKHRtcHJlZyksIG9wY29kZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDcwMEZGRkYpCi0JCWFzX2JhZCAoXygiV3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIpKTsKLQkgICAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHJldmVyc2VfOF9iaXRzICh0bXByZWcgPj4gMTYpKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdMJzoKLQkgIHRtcHJlZyA9IG9wUC0+bWFzazsKLQkgIGlmIChzWzFdID09ICd3JykKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDdGRjAwMDApCi0JCWFzX2JhZCAoXygiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gcmVnaXN0ZXIgbGlzdCIpKTsKLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzWzFdID09ICc4JykKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDBGRkZGRkYpCi0JCWFzX2JhZCAoXygiaW5jb3JyZWN0IHJlZ2lzdGVyIGluIHJlZ2xpc3QiKSk7Ci0JICAgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcgPj4gMjQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAodG1wcmVnICYgMHg3MDBGRkZGKQotCQlhc19iYWQgKF8oIndyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiKSk7Ci0JICAgICAgZWxzZQotCQlpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyA+PiAxNik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnTSc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIGdldF9udW0gKCZvcFAtPmRpc3AsIDYwKSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ08nOgotCSAgdG1wcmVnID0gKChvcFAtPm1vZGUgPT0gRFJFRykKLQkJICAgID8gMHgyMCArIG9wUC0+cmVnIC0gREFUQQotCQkgICAgOiAoZ2V0X251bSAoJm9wUC0+ZGlzcCwgNDApICYgMHgxRikpOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdRJzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDEwKTsKLQkgIGlmICh0bXByZWcgPT0gOCkKLQkgICAgdG1wcmVnID0gMDsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUic6Ci0JICAvKiBUaGlzIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBBRERSIHJlZ2lzdGVycyBhcmUgZWlnaHQKLQkgICAgIG1vcmUgdGhhbiB0aGVpciBjb3JyZXNwb25kaW5nIERBVEEgcmVncywgc28gdGhlIHJlc3VsdAotCSAgICAgd2lsbCBoYXZlIHRoZSBBRERSX1JFRyBiaXQgc2V0ICovCi0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3InOgotCSAgaWYgKG9wUC0+bW9kZSA9PSBBSU5EUikKLQkgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIERBVEEpOwotCSAgZWxzZQotCSAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+aW5kZXgucmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3MnOgotCSAgaWYgKG9wUC0+cmVnID09IEZQSSkKLQkgICAgdG1wcmVnID0gMHgxOwotCSAgZWxzZSBpZiAob3BQLT5yZWcgPT0gRlBTKQotCSAgICB0bXByZWcgPSAweDI7Ci0JICBlbHNlIGlmIChvcFAtPnJlZyA9PSBGUEMpCi0JICAgIHRtcHJlZyA9IDB4NDsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgkJLyogSWdub3JlIGl0ICovCi0JICBicmVhazsKLQotCWNhc2UgJ1QnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBnZXRfbnVtICgmb3BQLT5kaXNwLCAzMCkpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdVJzoJCS8qIElnbm9yZSBpdCAqLwotCSAgYnJlYWs7Ci0KLQljYXNlICdjJzoKLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBOQzoKLQkgICAgICB0bXByZWcgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERDOgotCSAgICAgIHRtcHJlZyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSUM6Ci0JICAgICAgdG1wcmVnID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCQzoKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrIikpOwotCSAgICB9CQkJLyogc3dpdGNoIG9uIGNhY2hlIHRva2VuICovCi0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLSNpZm5kZWYgTk9fNjg4NTEKLQkgIC8qIEpGOiBUaGVzZSBhcmUgb3V0IG9mIG9yZGVyLCBJIGZlYXIuICovCi0JY2FzZSAnZic6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgU0ZDOgotCSAgICAgIHRtcHJlZyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgREZDOgotCSAgICAgIHRtcHJlZyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgVEM6Ci0JICAgICAgdG1wcmVnID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDQUw6Ci0JICAgICAgdG1wcmVnID0gNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBWQUw6Ci0JICAgICAgdG1wcmVnID0gNTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTQ0M6Ci0JICAgICAgdG1wcmVnID0gNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQzoKLQkgICAgICB0bXByZWcgPSA3OwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1YnOgotCSAgaWYgKG9wUC0+cmVnID09IFZBTCkKLQkgICAgYnJlYWs7Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgJ1cnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIERSUDoKLQkgICAgICB0bXByZWcgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNSUDoKLQkgICAgICB0bXByZWcgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSUDoKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1gnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIEJBRDoKLQkgICAgY2FzZSBCQUQgKyAxOgotCSAgICBjYXNlIEJBRCArIDI6Ci0JICAgIGNhc2UgQkFEICsgMzoKLQkgICAgY2FzZSBCQUQgKyA0OgotCSAgICBjYXNlIEJBRCArIDU6Ci0JICAgIGNhc2UgQkFEICsgNjoKLQkgICAgY2FzZSBCQUQgKyA3OgotCSAgICAgIHRtcHJlZyA9ICg0IDw8IDEwKSB8ICgob3BQLT5yZWcgLSBCQUQpIDw8IDIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkFDOgotCSAgICBjYXNlIEJBQyArIDE6Ci0JICAgIGNhc2UgQkFDICsgMjoKLQkgICAgY2FzZSBCQUMgKyAzOgotCSAgICBjYXNlIEJBQyArIDQ6Ci0JICAgIGNhc2UgQkFDICsgNToKLQkgICAgY2FzZSBCQUMgKyA2OgotCSAgICBjYXNlIEJBQyArIDc6Ci0JICAgICAgdG1wcmVnID0gKDUgPDwgMTApIHwgKChvcFAtPnJlZyAtIEJBQykgPDwgMik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWSc6Ci0JICBrbm93IChvcFAtPnJlZyA9PSBQU1IpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWic6Ci0JICBrbm93IChvcFAtPnJlZyA9PSBQQ1NSKTsKLQkgIGJyZWFrOwotI2VuZGlmIC8qIG02ODg1MSAqLwotCWNhc2UgJzMnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIFRUMDoKLQkgICAgICB0bXByZWcgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFRUMToKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDIwKTsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ18nOgkvKiB1c2VkIG9ubHkgZm9yIG1vdmUxNiBhYnNvbHV0ZSAzMi1iaXQgYWRkcmVzcyAqLwotCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgIGFkZHdvcmQgKHRtcHJlZyA+PiAxNik7Ci0JICBhZGR3b3JkICh0bXByZWcgJiAweEZGRkYpOwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQTBMKTsKLQkgIG9wUC0+cmVnIC09IChEQVRBMEwpOwotCSAgb3BQLT5yZWcgJj0gMHgwRjsJLyogcmVtb3ZlIHVwcGVyL2xvd2VyIGJpdCAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogQnkgdGhlIHRpbWUgd2hlIGdldCBoZXJlIChGSU5BTExZKSB0aGVfaW5zIGNvbnRhaW5zIHRoZSBjb21wbGV0ZQotICAgICBpbnN0cnVjdGlvbiwgcmVhZHkgdG8gYmUgZW1pdHRlZC4gLiAuICovCi19Ci0KLXN0YXRpYyBpbnQKLXJldmVyc2VfMTZfYml0cyAoaW4pCi0gICAgIGludCBpbjsKLXsKLSAgaW50IG91dCA9IDA7Ci0gIGludCBuOwotCi0gIHN0YXRpYyBpbnQgbWFza1sxNl0gPQotICB7Ci0gICAgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAKLSAgfTsKLSAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspCi0gICAgewotICAgICAgaWYgKGluICYgbWFza1tuXSkKLQlvdXQgfD0gbWFza1sxNSAtIG5dOwotICAgIH0KLSAgcmV0dXJuIG91dDsKLX0JCQkJLyogcmV2ZXJzZV8xNl9iaXRzKCkgKi8KLQotc3RhdGljIGludAotcmV2ZXJzZV84X2JpdHMgKGluKQotICAgICBpbnQgaW47Ci17Ci0gIGludCBvdXQgPSAwOwotICBpbnQgbjsKLQotICBzdGF0aWMgaW50IG1hc2tbOF0gPQotICB7Ci0gICAgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gIH07Ci0KLSAgZm9yIChuID0gMDsgbiA8IDg7IG4rKykKLSAgICB7Ci0gICAgICBpZiAoaW4gJiBtYXNrW25dKQotCW91dCB8PSBtYXNrWzcgLSBuXTsKLSAgICB9Ci0gIHJldHVybiBvdXQ7Ci19CQkJCS8qIHJldmVyc2VfOF9iaXRzKCkgKi8KLQotLyogQ2F1c2UgYW4gZXh0cmEgZnJhZyB0byBiZSBnZW5lcmF0ZWQgaGVyZSwgaW5zZXJ0aW5nIHVwIHRvIDEwIGJ5dGVzCi0gICAodGhhdCB2YWx1ZSBpcyBjaG9zZW4gaW4gdGhlIGZyYWdfdmFyIGNhbGwgaW4gbWRfYXNzZW1ibGUpLiAgVFlQRQotICAgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIGZyYWcgdG8gYmUgZ2VuZXJhdGVkOyBpdHMgcHJpbWFyeSB0eXBlIGlzCi0gICByc19tYWNoaW5lX2RlcGVuZGVudC4KLQotICAgVGhlIFRZUEUgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMSBhbmQKLSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LiAgVGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZml4dXAgd2lsbAotICAgYmUgZW1pdHRlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMS4KLQotICAgQUREIGJlY29tZXMgdGhlIEZSX1NZTUJPTCBmaWVsZCBvZiB0aGUgZnJhZywgYW5kIE9GRiB0aGUgRlJfT0ZGU0VULiAgKi8KLXN0YXRpYyB2b2lkCi1pbnN0YWxsX29wZXJhbmQgKG1vZGUsIHZhbCkKLSAgICAgaW50IG1vZGU7Ci0gICAgIGludCB2YWw7Ci17Ci0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWwgJiAweEZGOwkvKiBKRiBGRiBpcyBmb3IgTSBrbHVkZ2UgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsIDw8IDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcxJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzInOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICczJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzQnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsIDw8IDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsyXSB8PSB2YWwgPDwgNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzYnOgotICAgICAgLyogREFOR0VSISAgVGhpcyBpcyBhIGhhY2sgdG8gZm9yY2UgY2FzMmwgYW5kIGNhczJ3IGNtZHMgdG8gYmUKLQkgdGhyZWUgd29yZHMgbG9uZyEgKi8KLSAgICAgIHRoZV9pbnMubnVtbysrOwotICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzgnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDEwOwotICAgICAgYnJlYWs7Ci0jaWZuZGVmIE5PXzY4ODUxCi0gICAgY2FzZSAnOSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlICd0JzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICh2YWwgPDwgMTApIHwgKHZhbCA8PCA3KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0QnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKHZhbCA8PCAxMikgfCB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdnJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA9IDB4ZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA8PCA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdqJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKLSAgICAgIHRoZV9pbnMubnVtbysrOwkJLyogV2hhdCBhIGhhY2sgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2snOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICd3JzoKLSAgICBjYXNlICdXJzoKLSAgICBjYXNlICdsJzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2UnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKHZhbCA8PCA2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0wnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gPSAodmFsID4+IDE2KTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzJdID0gdmFsICYgMHhmZmZmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAoKHZhbCAmIDB4OCkgPDwgKDYgLSAzKSk7Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAoKHZhbCAmIDB4NykgPDwgOSk7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAoKHZhbCAmIDB4MTApIDw8ICg3IC0gNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbic6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAoKHZhbCAmIDB4OCkgPDwgKDYgLSAzKSk7Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAoKHZhbCAmIDB4NykgPDwgOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdvJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCAxMjsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICgodmFsICYgMHgxMCkgPDwgKDcgLSA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdNJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICh2YWwgJiAweEYpOwotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKCh2YWwgJiAweDEwKSA8PCAoNiAtIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ04nOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKHZhbCAmIDB4Rik7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAoKHZhbCAmIDB4MTApIDw8ICg2IC0gNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAoKHZhbCAhPSAxKSA8PCAxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotICAgIH0KLX0JCQkJLyogaW5zdGFsbF9vcGVyYW5kKCkgKi8KLQotc3RhdGljIHZvaWQKLWluc3RhbGxfZ2VuX29wZXJhbmQgKG1vZGUsIHZhbCkKLSAgICAgaW50IG1vZGU7Ci0gICAgIGludCB2YWw7Ci17Ci0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIC8qIFRoaXMgaXMgYSBrbHVkZ2UhISEgKi8KLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICh2YWwgJiAweDA3KSA8PCA5IHwgKHZhbCAmIDB4MzgpIDw8IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICd3JzoKLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdwJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgICAgLyogbW9yZSBzdHVmZiBnb2VzIGhlcmUgKi8KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotICAgIH0KLX0JCQkJLyogaW5zdGFsbF9nZW5fb3BlcmFuZCgpICovCi0KLS8qCi0gKiB2ZXJpZnkgdGhhdCB3ZSBoYXZlIHNvbWUgbnVtYmVyIG9mIHBhcmVuIHBhaXJzLCBkbyBtNjhrX2lwX29wKCksIGFuZAotICogdGhlbiBkZWFsIHdpdGggdGhlIGJpdGZpZWxkIGhhY2suCi0gKi8KLQotc3RhdGljIGNoYXIgKgotY3JhY2tfb3BlcmFuZCAoc3RyLCBvcFApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnN0cjsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IG02OGtfb3AgKm9wUDsKLXsKLSAgcmVnaXN0ZXIgaW50IHBhcmVuczsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKmJlZ19zdHI7Ci0gIGludCBpbnF1b3RlID0gMDsKLQotICBpZiAoIXN0cikKLSAgICB7Ci0gICAgICByZXR1cm4gc3RyOwotICAgIH0KLSAgYmVnX3N0ciA9IHN0cjsKLSAgZm9yIChwYXJlbnMgPSAwOyAqc3RyICYmIChwYXJlbnMgPiAwIHx8IGlucXVvdGUgfHwgbm90ZW5kIChzdHIpKTsgc3RyKyspCi0gICAgewotICAgICAgaWYgKCEgaW5xdW90ZSkKLQl7Ci0JICBpZiAoKnN0ciA9PSAnKCcpCi0JICAgIHBhcmVucysrOwotCSAgZWxzZSBpZiAoKnN0ciA9PSAnKScpCi0JICAgIHsKLQkgICAgICBpZiAoIXBhcmVucykKLQkJewkJCS8qIEVSUk9SICovCi0JCSAgb3BQLT5lcnJvciA9IF8oIkV4dHJhICkiKTsKLQkJICByZXR1cm4gc3RyOwotCQl9Ci0JICAgICAgLS1wYXJlbnM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZmxhZ19tcmkgJiYgKnN0ciA9PSAnXCcnKQotCWlucXVvdGUgPSAhIGlucXVvdGU7Ci0gICAgfQotICBpZiAoISpzdHIgJiYgcGFyZW5zKQotICAgIHsJCQkJLyogRVJST1IgKi8KLSAgICAgIG9wUC0+ZXJyb3IgPSBfKCJNaXNzaW5nICkiKTsKLSAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotICBjID0gKnN0cjsKLSAgKnN0ciA9ICdcMCc7Ci0gIGlmIChtNjhrX2lwX29wIChiZWdfc3RyLCBvcFApICE9IDApCi0gICAgewotICAgICAgKnN0ciA9IGM7Ci0gICAgICByZXR1cm4gc3RyOwotICAgIH0KLSAgKnN0ciA9IGM7Ci0gIGlmIChjID09ICd9JykKLSAgICBjID0gKisrc3RyOwkJCS8qIEpGIGJpdGZpZWxkIGhhY2sgKi8KLSAgaWYgKGMpCi0gICAgewotICAgICAgYyA9ICorK3N0cjsKLSAgICAgIGlmICghYykKLQlhc19iYWQgKF8oIk1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgICB9Ci0KLSAgLyogRGV0ZWN0IE1SSSBSRUcgc3ltYm9scyBhbmQgY29udmVydCB0aGVtIHRvIFJFR0xTVHMuICAqLwotICBpZiAob3BQLT5tb2RlID09IENPTlRST0wgJiYgKGludClvcFAtPnJlZyA8IDApCi0gICAgewotICAgICAgb3BQLT5tb2RlID0gUkVHTFNUOwotICAgICAgb3BQLT5tYXNrID0gfihpbnQpb3BQLT5yZWc7Ci0gICAgICBvcFAtPnJlZyA9IDA7Ci0gICAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gICAqLwotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3JlZyAocmVnbmFtZSwgcmVnbnVtKQotICAgICBjb25zdCBjaGFyICpyZWduYW1lOwotICAgICBpbnQgcmVnbnVtOwotewotICBjaGFyIGJ1ZlsxMDBdOwotICBpbnQgaTsKLQotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotICBpZiAoIWZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCkKLSAgICB7Ci0gICAgICBidWZbMF0gPSBSRUdJU1RFUl9QUkVGSVg7Ci0gICAgICBzdHJjcHkgKGJ1ZiArIDEsIHJlZ25hbWUpOwotICAgICAgcmVnbmFtZSA9IGJ1ZjsKLSAgICB9Ci0jZW5kaWYKLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChyZWduYW1lLCByZWdfc2VjdGlvbiwgcmVnbnVtLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCi0gIGZvciAoaSA9IDA7IHJlZ25hbWVbaV07IGkrKykKLSAgICBidWZbaV0gPSBpc2xvd2VyIChyZWduYW1lW2ldKSA/IHRvdXBwZXIgKHJlZ25hbWVbaV0pIDogcmVnbmFtZVtpXTsKLSAgYnVmW2ldID0gJ1wwJzsKLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChidWYsIHJlZ19zZWN0aW9uLCByZWdudW0sCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci19Ci0KLXN0cnVjdCBpbml0X2VudHJ5Ci0gIHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGludCBudW1iZXI7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5pdF9lbnRyeSBpbml0X3RhYmxlW10gPQotewotICB7ICJkMCIsIERBVEEwIH0sCi0gIHsgImQxIiwgREFUQTEgfSwKLSAgeyAiZDIiLCBEQVRBMiB9LAotICB7ICJkMyIsIERBVEEzIH0sCi0gIHsgImQ0IiwgREFUQTQgfSwKLSAgeyAiZDUiLCBEQVRBNSB9LAotICB7ICJkNiIsIERBVEE2IH0sCi0gIHsgImQ3IiwgREFUQTcgfSwKLSAgeyAiYTAiLCBBRERSMCB9LAotICB7ICJhMSIsIEFERFIxIH0sCi0gIHsgImEyIiwgQUREUjIgfSwKLSAgeyAiYTMiLCBBRERSMyB9LAotICB7ICJhNCIsIEFERFI0IH0sCi0gIHsgImE1IiwgQUREUjUgfSwKLSAgeyAiYTYiLCBBRERSNiB9LAotICB7ICJmcCIsIEFERFI2IH0sCi0gIHsgImE3IiwgQUREUjcgfSwKLSAgeyAic3AiLCBBRERSNyB9LAotICB7ICJzc3AiLCBBRERSNyB9LAotICB7ICJmcDAiLCBGUDAgfSwKLSAgeyAiZnAxIiwgRlAxIH0sCi0gIHsgImZwMiIsIEZQMiB9LAotICB7ICJmcDMiLCBGUDMgfSwKLSAgeyAiZnA0IiwgRlA0IH0sCi0gIHsgImZwNSIsIEZQNSB9LAotICB7ICJmcDYiLCBGUDYgfSwKLSAgeyAiZnA3IiwgRlA3IH0sCi0gIHsgImZwaSIsIEZQSSB9LAotICB7ICJmcGlhciIsIEZQSSB9LAotICB7ICJmcGMiLCBGUEkgfSwKLSAgeyAiZnBzIiwgRlBTIH0sCi0gIHsgImZwc3IiLCBGUFMgfSwKLSAgeyAiZnBjIiwgRlBDIH0sCi0gIHsgImZwY3IiLCBGUEMgfSwKLSAgeyAiY29udHJvbCIsIEZQQyB9LAotICB7ICJzdGF0dXMiLCBGUFMgfSwKLSAgeyAiaWFkZHIiLCBGUEkgfSwKLQotICB7ICJjb3AwIiwgQ09QMCB9LAotICB7ICJjb3AxIiwgQ09QMSB9LAotICB7ICJjb3AyIiwgQ09QMiB9LAotICB7ICJjb3AzIiwgQ09QMyB9LAotICB7ICJjb3A0IiwgQ09QNCB9LAotICB7ICJjb3A1IiwgQ09QNSB9LAotICB7ICJjb3A2IiwgQ09QNiB9LAotICB7ICJjb3A3IiwgQ09QNyB9LAotICB7ICJwYyIsIFBDIH0sCi0gIHsgInpwYyIsIFpQQyB9LAotICB7ICJzciIsIFNSIH0sCi0KLSAgeyAiY2NyIiwgQ0NSIH0sCi0gIHsgImNjIiwgQ0NSIH0sCi0KLSAgeyAiYWNjIiwgQUNDIH0sCi0gIHsgIm1hY3NyIiwgTUFDU1IgfSwKLSAgeyAibWFzayIsIE1BU0sgfSwKLQotICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICB7ICJzZmMiLCBTRkMgfSwJCS8qIFNvdXJjZSBGdW5jdGlvbiBDb2RlICovCi0gIHsgInNmY3IiLCBTRkMgfSwKLSAgeyAiZGZjIiwgREZDIH0sCQkvKiBEZXN0aW5hdGlvbiBGdW5jdGlvbiBDb2RlICovCi0gIHsgImRmY3IiLCBERkMgfSwKLSAgeyAiY2FjciIsIENBQ1IgfSwJCS8qIENhY2hlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSAgeyAiY2FhciIsIENBQVIgfSwJCS8qIENhY2hlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQotICB7ICJ1c3AiLCBVU1AgfSwJCS8qIFVzZXIgU3RhY2sgUG9pbnRlciAqLwotICB7ICJ2YnIiLCBWQlIgfSwJCS8qIFZlY3RvciBCYXNlIFJlZ2lzdGVyICovCi0gIHsgIm1zcCIsIE1TUCB9LAkJLyogTWFzdGVyIFN0YWNrIFBvaW50ZXIgKi8KLSAgeyAiaXNwIiwgSVNQIH0sCQkvKiBJbnRlcnJ1cHQgU3RhY2sgUG9pbnRlciAqLwotCi0gIHsgIml0dDAiLCBJVFQwIH0sCQkvKiBJbnN0cnVjdGlvbiBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWcgMCAqLwotICB7ICJpdHQxIiwgSVRUMSB9LAkJLyogSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gUmVnIDEgKi8KLSAgeyAiZHR0MCIsIERUVDAgfSwJCS8qIERhdGEgVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gUmVnaXN0ZXIgMCAqLwotICB7ICJkdHQxIiwgRFRUMSB9LAkJLyogRGF0YSBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWdpc3RlciAxICovCi0KLSAgLyogNjhlYzA0MCB2ZXJzaW9ucyBvZiBzYW1lICovCi0gIHsgImlhY3IwIiwgSVRUMCB9LAkJLyogSW5zdHJ1Y3Rpb24gQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwotICB7ICJpYWNyMSIsIElUVDEgfSwJCS8qIEluc3RydWN0aW9uIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIDAgKi8KLSAgeyAiZGFjcjAiLCBEVFQwIH0sCQkvKiBEYXRhIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIDAgKi8KLSAgeyAiZGFjcjEiLCBEVFQxIH0sCQkvKiBEYXRhIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIDAgKi8KLQotICAvKiBtY2Y1MjAwIHZlcnNpb25zIG9mIHNhbWUuICBUaGUgQ29sZEZpcmUgcHJvZ3JhbW1lcidzIHJlZmVyZW5jZQotICAgICBtYW51YWwgaW5kaWNhdGVkIHRoYXQgdGhlIG9yZGVyIGlzIDIsMywwLDEsIGJ1dCBLZW4gUm9zZQotICAgICA8cm9zZUBuZXRjb20uY29tPiBzYXlzIHRoYXQgMCwxLDIsMyBpcyB0aGUgY29ycmVjdCBvcmRlci4gICovCi0gIHsgImFjcjAiLCBJVFQwIH0sCQkvKiBBY2Nlc3MgQ29udHJvbCBVbml0IDAgKi8KLSAgeyAiYWNyMSIsIElUVDEgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMSAqLwotICB7ICJhY3IyIiwgRFRUMCB9LAkJLyogQWNjZXNzIENvbnRyb2wgVW5pdCAyICovCi0gIHsgImFjcjMiLCBEVFQxIH0sCQkvKiBBY2Nlc3MgQ29udHJvbCBVbml0IDMgKi8KLQotICB7ICJ0YyIsIFRDIH0sCQkJLyogTU1VIFRyYW5zbGF0aW9uIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSAgeyAidGNyIiwgVEMgfSwKLQotICB7ICJtbXVzciIsIE1NVVNSIH0sCQkvKiBNTVUgU3RhdHVzIFJlZ2lzdGVyICovCi0gIHsgInNycCIsIFNSUCB9LAkJLyogVXNlciBSb290IFBvaW50ZXIgKi8KLSAgeyAidXJwIiwgVVJQIH0sCQkvKiBTdXBlcnZpc29yIFJvb3QgUG9pbnRlciAqLwotCi0gIHsgImJ1c2NyIiwgQlVTQ1IgfSwKLSAgeyAicGNyIiwgUENSIH0sCi0KLSAgeyAicm9tYmFyIiwgUk9NQkFSIH0sCQkvKiBST00gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0gIHsgInJhbWJhcjAiLCBSQU1CQVIwIH0sCS8qIFJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSAgeyAicmFtYmFyMSIsIFJBTUJBUjEgfSwJLyogUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLwotICB7ICJtYmFyIiwgTUJBUiB9LAkJLyogTW9kdWxlIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLwotICAvKiBlbmQgb2YgY29udHJvbCByZWdpc3RlcnMgKi8KLQotICB7ICJhYyIsIEFDIH0sCi0gIHsgImJjIiwgQkMgfSwKLSAgeyAiY2FsIiwgQ0FMIH0sCi0gIHsgImNycCIsIENSUCB9LAotICB7ICJkcnAiLCBEUlAgfSwKLSAgeyAicGNzciIsIFBDU1IgfSwKLSAgeyAicHNyIiwgUFNSIH0sCi0gIHsgInNjYyIsIFNDQyB9LAotICB7ICJ2YWwiLCBWQUwgfSwKLSAgeyAiYmFkMCIsIEJBRDAgfSwKLSAgeyAiYmFkMSIsIEJBRDEgfSwKLSAgeyAiYmFkMiIsIEJBRDIgfSwKLSAgeyAiYmFkMyIsIEJBRDMgfSwKLSAgeyAiYmFkNCIsIEJBRDQgfSwKLSAgeyAiYmFkNSIsIEJBRDUgfSwKLSAgeyAiYmFkNiIsIEJBRDYgfSwKLSAgeyAiYmFkNyIsIEJBRDcgfSwKLSAgeyAiYmFjMCIsIEJBQzAgfSwKLSAgeyAiYmFjMSIsIEJBQzEgfSwKLSAgeyAiYmFjMiIsIEJBQzIgfSwKLSAgeyAiYmFjMyIsIEJBQzMgfSwKLSAgeyAiYmFjNCIsIEJBQzQgfSwKLSAgeyAiYmFjNSIsIEJBQzUgfSwKLSAgeyAiYmFjNiIsIEJBQzYgfSwKLSAgeyAiYmFjNyIsIEJBQzcgfSwKLQotICB7ICJpYyIsIElDIH0sCi0gIHsgImRjIiwgREMgfSwKLSAgeyAibmMiLCBOQyB9LAotCi0gIHsgInR0MCIsIFRUMCB9LAotICB7ICJ0dDEiLCBUVDEgfSwKLSAgLyogNjhlYzAzMCB2ZXJzaW9ucyBvZiBzYW1lICovCi0gIHsgImFjMCIsIFRUMCB9LAotICB7ICJhYzEiLCBUVDEgfSwKLSAgLyogNjhlYzAzMCBhY2Nlc3MgY29udHJvbCB1bml0LCBpZGVudGljYWwgdG8gMDMwIE1NVSBzdGF0dXMgcmVnICovCi0gIHsgImFjdXNyIiwgUFNSIH0sCi0KLSAgLyogU3VwcHJlc3NlZCBkYXRhIGFuZCBhZGRyZXNzIHJlZ2lzdGVycy4gICovCi0gIHsgInpkMCIsIFpEQVRBMCB9LAotICB7ICJ6ZDEiLCBaREFUQTEgfSwKLSAgeyAiemQyIiwgWkRBVEEyIH0sCi0gIHsgInpkMyIsIFpEQVRBMyB9LAotICB7ICJ6ZDQiLCBaREFUQTQgfSwKLSAgeyAiemQ1IiwgWkRBVEE1IH0sCi0gIHsgInpkNiIsIFpEQVRBNiB9LAotICB7ICJ6ZDciLCBaREFUQTcgfSwKLSAgeyAiemEwIiwgWkFERFIwIH0sCi0gIHsgInphMSIsIFpBRERSMSB9LAotICB7ICJ6YTIiLCBaQUREUjIgfSwKLSAgeyAiemEzIiwgWkFERFIzIH0sCi0gIHsgInphNCIsIFpBRERSNCB9LAotICB7ICJ6YTUiLCBaQUREUjUgfSwKLSAgeyAiemE2IiwgWkFERFI2IH0sCi0gIHsgInphNyIsIFpBRERSNyB9LAotCi0gIC8qIFVwcGVyIGFuZCBsb3dlciBkYXRhIGFuZCBhZGRyZXNzIHJlZ2lzdGVycywgdXNlZCBieSBtYWN3IGFuZCBtc2Fjdy4gKi8KLSAgeyAiZDBsIiwgREFUQTBMIH0sCi0gIHsgImQxbCIsIERBVEExTCB9LAotICB7ICJkMmwiLCBEQVRBMkwgfSwKLSAgeyAiZDNsIiwgREFUQTNMIH0sCi0gIHsgImQ0bCIsIERBVEE0TCB9LAotICB7ICJkNWwiLCBEQVRBNUwgfSwKLSAgeyAiZDZsIiwgREFUQTZMIH0sCi0gIHsgImQ3bCIsIERBVEE3TCB9LAotCi0gIHsgImEwbCIsIEFERFIwTCB9LAotICB7ICJhMWwiLCBBRERSMUwgfSwKLSAgeyAiYTJsIiwgQUREUjJMIH0sCi0gIHsgImEzbCIsIEFERFIzTCB9LAotICB7ICJhNGwiLCBBRERSNEwgfSwKLSAgeyAiYTVsIiwgQUREUjVMIH0sCi0gIHsgImE2bCIsIEFERFI2TCB9LAotICB7ICJhN2wiLCBBRERSN0wgfSwKLQotICB7ICJkMHUiLCBEQVRBMFUgfSwKLSAgeyAiZDF1IiwgREFUQTFVIH0sCi0gIHsgImQydSIsIERBVEEyVSB9LAotICB7ICJkM3UiLCBEQVRBM1UgfSwKLSAgeyAiZDR1IiwgREFUQTRVIH0sCi0gIHsgImQ1dSIsIERBVEE1VSB9LAotICB7ICJkNnUiLCBEQVRBNlUgfSwKLSAgeyAiZDd1IiwgREFUQTdVIH0sCi0KLSAgeyAiYTB1IiwgQUREUjBVIH0sCi0gIHsgImExdSIsIEFERFIxVSB9LAotICB7ICJhMnUiLCBBRERSMlUgfSwKLSAgeyAiYTN1IiwgQUREUjNVIH0sCi0gIHsgImE0dSIsIEFERFI0VSB9LAotICB7ICJhNXUiLCBBRERSNVUgfSwKLSAgeyAiYTZ1IiwgQUREUjZVIH0sCi0gIHsgImE3dSIsIEFERFI3VSB9LAotCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgdm9pZAotaW5pdF9yZWd0YWJsZSAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaW5pdF90YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgaW5zZXJ0X3JlZyAoaW5pdF90YWJsZVtpXS5uYW1lLCBpbml0X3RhYmxlW2ldLm51bWJlcik7Ci19Ci0KLXN0YXRpYyBpbnQgbm9fNjg4NTEsIG5vXzY4ODgxOwotCi0jaWZkZWYgT0JKX0FPVVQKLS8qIGEub3V0IG1hY2hpbmUgdHlwZS4gIERlZmF1bHQgdG8gNjgwMjAuICAqLwotaW50IG02OGtfYW91dF9tYWNodHlwZSA9IDI7Ci0jZW5kaWYKLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjb25zdCBjaGFyICplcjsKLSAgc2hvcnQgKmZyb21QOwotICBjaGFyICp0b1AgPSBOVUxMOwotICBpbnQgbSwgbiA9IDA7Ci0gIGNoYXIgKnRvX2JlZ19QOwotICBpbnQgc2hvcnRzX3RoaXNfZnJhZzsKLSAgZml4UyAqZml4UDsKLQotICAvKiBJbiBNUkkgbW9kZSwgdGhlIGluc3RydWN0aW9uIGFuZCBvcGVyYW5kcyBhcmUgc2VwYXJhdGVkIGJ5IGEKLSAgICAgc3BhY2UuICBBbnl0aGluZyBmb2xsb3dpbmcgdGhlIG9wZXJhbmRzIGlzIGEgY29tbWVudC4gIFRoZSBsYWJlbAotICAgICBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQuICAqLwotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGludCBmaWVsZHMgPSAwOwotICAgICAgaW50IGluZmllbGQgPSAwOwotICAgICAgaW50IGlucXVvdGUgPSAwOwotCi0gICAgICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCc7IHMrKykKLQl7Ci0JICBpZiAoKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSAmJiAhIGlucXVvdGUpCi0JICAgIHsKLQkgICAgICBpZiAoaW5maWVsZCkKLQkJewotCQkgICsrZmllbGRzOwotCQkgIGlmIChmaWVsZHMgPj0gMikKLQkJICAgIHsKLQkJICAgICAgKnMgPSAnXDAnOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpbmZpZWxkID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBpbmZpZWxkKQotCQlpbmZpZWxkID0gMTsKLQkgICAgICBpZiAoKnMgPT0gJ1wnJykKLQkJaW5xdW90ZSA9ICEgaW5xdW90ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJnRoZV9pbnMpLCAnXDAnLCBzaXplb2YgKHRoZV9pbnMpKTsKLSAgbTY4a19pcCAoc3RyKTsKLSAgZXIgPSB0aGVfaW5zLmVycm9yOwotICBpZiAoIWVyKQotICAgIHsKLSAgICAgIGZvciAobiA9IDA7IG4gPCB0aGVfaW5zLm51bWFyZ3M7IG4rKykKLQlpZiAodGhlX2lucy5vcGVyYW5kc1tuXS5lcnJvcikKLQkgIHsKLQkgICAgZXIgPSB0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yOwotCSAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0gIGlmIChlcikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIiVzIC0tIHN0YXRlbWVudCBgJXMnIGlnbm9yZWQiKSwgZXIsIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgY3VycmVudCBsYWJlbCwgcmVjb3JkIHRoYXQgaXQgbWFya3MgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoY3VycmVudF9sYWJlbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGN1cnJlbnRfbGFiZWwtPnRleHQgPSAxOwotICAgICAgY3VycmVudF9sYWJlbCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmICh0aGVfaW5zLm5mcmFnID09IDApCi0gICAgewotICAgICAgLyogTm8gZnJhZyBoYWNraW5nIGludm9sdmVkOyBqdXN0IHB1dCBpdCBvdXQgKi8KLSAgICAgIHRvUCA9IGZyYWdfbW9yZSAoMiAqIHRoZV9pbnMubnVtbyk7Ci0gICAgICBmcm9tUCA9ICZ0aGVfaW5zLm9wY29kZVswXTsKLSAgICAgIGZvciAobSA9IHRoZV9pbnMubnVtbzsgbTsgLS1tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAodG9QLCAobG9uZykgKCpmcm9tUCksIDIpOwotCSAgdG9QICs9IDI7Ci0JICBmcm9tUCsrOwotCX0KLSAgICAgIC8qIHB1dCBvdXQgc3ltYm9sLWRlcGVuZGVudCBpbmZvICovCi0gICAgICBmb3IgKG0gPSAwOyBtIDwgdGhlX2lucy5ucmVsOyBtKyspCi0JewotCSAgc3dpdGNoICh0aGVfaW5zLnJlbG9jW21dLndpZCkKLQkgICAgewotCSAgICBjYXNlICdCJzoKLQkgICAgICBuID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgbiA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzMnOgotCSAgICAgIG4gPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgbiA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2wnOgotCSAgICAgIG4gPSA0OwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJEb24ndCBrbm93IGhvdyB0byBmaWd1cmUgd2lkdGggb2YgJWMgaW4gbWRfYXNzZW1ibGUoKSIpLAotCQkJdGhlX2lucy5yZWxvY1ttXS53aWQpOwotCSAgICB9Ci0KLQkgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICAgICAoKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKQotCQkJICAgICAgIC0gdGhlX2lucy5udW1vICogMiArIHRoZV9pbnMucmVsb2NbbV0ubiksCi0JCQkgICAgICBuLAotCQkJICAgICAgJnRoZV9pbnMucmVsb2NbbV0uZXhwLAotCQkJICAgICAgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCSAgICAgIGdldF9yZWxvY19jb2RlIChuLCB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJCQkgICAgICB0aGVfaW5zLnJlbG9jW21dLnBpY19yZWxvYykpOwotCSAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gdGhlX2lucy5yZWxvY1ttXS5wY3JlbF9maXg7Ci0JICBpZiAodGhlX2lucy5yZWxvY1ttXS53aWQgPT0gJ0InKQotCSAgICBmaXhQLT5meF9zaWduZWQgPSAxOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlcmUncyBzb21lIGZyYWcgaGFja2luZyAqLwotICBmb3IgKG4gPSAwLCBmcm9tUCA9ICZ0aGVfaW5zLm9wY29kZVswXTsgbiA8IHRoZV9pbnMubmZyYWc7IG4rKykKLSAgICB7Ci0gICAgICBpbnQgd2lkOwotCi0gICAgICBpZiAobiA9PSAwKQotCXdpZCA9IDIgKiB0aGVfaW5zLmZyYWdiW25dLmZyYWdvZmY7Ci0gICAgICBlbHNlCi0Jd2lkID0gMiAqICh0aGVfaW5zLm51bW8gLSB0aGVfaW5zLmZyYWdiW24gLSAxXS5mcmFnb2ZmKTsKLSAgICAgIHRvUCA9IGZyYWdfbW9yZSAod2lkKTsKLSAgICAgIHRvX2JlZ19QID0gdG9QOwotICAgICAgc2hvcnRzX3RoaXNfZnJhZyA9IDA7Ci0gICAgICBmb3IgKG0gPSB3aWQgLyAyOyBtOyAtLW0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIChsb25nKSAoKmZyb21QKSwgMik7Ci0JICB0b1AgKz0gMjsKLQkgIGZyb21QKys7Ci0JICBzaG9ydHNfdGhpc19mcmFnKys7Ci0JfQotICAgICAgZm9yIChtID0gMDsgbSA8IHRoZV9pbnMubnJlbDsgbSsrKQotCXsKLQkgIGlmICgodGhlX2lucy5yZWxvY1ttXS5uKSA+PSAyICogc2hvcnRzX3RoaXNfZnJhZykKLQkgICAgewotCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ubiAtPSAyICogc2hvcnRzX3RoaXNfZnJhZzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgd2lkID0gdGhlX2lucy5yZWxvY1ttXS53aWQ7Ci0JICBpZiAod2lkID09IDApCi0JICAgIGNvbnRpbnVlOwotCSAgdGhlX2lucy5yZWxvY1ttXS53aWQgPSAwOwotCSAgd2lkID0gKHdpZCA9PSAnYicpID8gMSA6ICh3aWQgPT0gJ3cnKSA/IDIgOiAod2lkID09ICdsJykgPyA0IDogNDAwMDsKLQotCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgICAgICgodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAgICAgLSB0aGVfaW5zLm51bW8gKiAyICsgdGhlX2lucy5yZWxvY1ttXS5uKSwKLQkJCSAgICAgIHdpZCwKLQkJCSAgICAgICZ0aGVfaW5zLnJlbG9jW21dLmV4cCwKLQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkgICAgICBnZXRfcmVsb2NfY29kZSAod2lkLCB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJCQkgICAgICB0aGVfaW5zLnJlbG9jW21dLnBpY19yZWxvYykpOwotCSAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gdGhlX2lucy5yZWxvY1ttXS5wY3JlbF9maXg7Ci0JfQotICAgICAgKHZvaWQpIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDAsCi0JCSAgICAgICAocmVsYXhfc3Vic3RhdGVUKSAodGhlX2lucy5mcmFnYltuXS5mcmFndHkpLAotCQkgICAgICAgdGhlX2lucy5mcmFnYltuXS5mYWRkLCB0aGVfaW5zLmZyYWdiW25dLmZvZmYsIHRvX2JlZ19QKTsKLSAgICB9Ci0gIG4gPSAodGhlX2lucy5udW1vIC0gdGhlX2lucy5mcmFnYltuIC0gMV0uZnJhZ29mZik7Ci0gIHNob3J0c190aGlzX2ZyYWcgPSAwOwotICBpZiAobikKLSAgICB7Ci0gICAgICB0b1AgPSBmcmFnX21vcmUgKG4gKiBzaXplb2YgKHNob3J0KSk7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAodG9QLCAobG9uZykgKCpmcm9tUCksIDIpOwotCSAgdG9QICs9IDI7Ci0JICBmcm9tUCsrOwotCSAgc2hvcnRzX3RoaXNfZnJhZysrOwotCX0KLSAgICB9Ci0gIGZvciAobSA9IDA7IG0gPCB0aGVfaW5zLm5yZWw7IG0rKykKLSAgICB7Ci0gICAgICBpbnQgd2lkOwotCi0gICAgICB3aWQgPSB0aGVfaW5zLnJlbG9jW21dLndpZDsKLSAgICAgIGlmICh3aWQgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIHRoZV9pbnMucmVsb2NbbV0ud2lkID0gMDsKLSAgICAgIHdpZCA9ICh3aWQgPT0gJ2InKSA/IDEgOiAod2lkID09ICd3JykgPyAyIDogKHdpZCA9PSAnbCcpID8gNCA6IDQwMDA7Ci0KLSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICgodGhlX2lucy5yZWxvY1ttXS5uICsgdG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAtIHNob3J0c190aGlzX2ZyYWcgKiAyKSwKLQkJCSAgd2lkLAotCQkJICAmdGhlX2lucy5yZWxvY1ttXS5leHAsCi0JCQkgIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkgIGdldF9yZWxvY19jb2RlICh3aWQsIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkJCSAgdGhlX2lucy5yZWxvY1ttXS5waWNfcmVsb2MpKTsKLSAgICAgIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IHRoZV9pbnMucmVsb2NbbV0ucGNyZWxfZml4OwotICAgIH0KLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgLyoKLSAgICogbWRfYmVnaW4gLS0gc2V0IHVwIGhhc2ggdGFibGVzIHdpdGggNjgwMDAgaW5zdHJ1Y3Rpb25zLgotICAgKiBzaW1pbGFyIHRvIHdoYXQgdGhlIHZheCBhc3NlbWJsZXIgZG9lcy4gIC0tLXBocgotICAgKi8KLSAgLyogUk1TIGNsYWltcyB0aGUgdGhpbmcgdG8gZG8gaXMgdGFrZSB0aGUgbTY4ay1vcGNvZGUuaCB0YWJsZSwgYW5kIG1ha2UKLSAgICAgYSBjb3B5IG9mIGl0IGF0IHJ1bnRpbWUsIGFkZGluZyBpbiB0aGUgaW5mb3JtYXRpb24gd2Ugd2FudCBidXQgaXNuJ3QKLSAgICAgdGhlcmUuICBJIHRoaW5rIGl0J2QgYmUgYmV0dGVyIHRvIGhhdmUgYW4gYXdrIHNjcmlwdCBoYWNrIHRoZSB0YWJsZQotICAgICBhdCBjb21waWxlIHRpbWUuICBPciBldmVuIGp1c3QgeHN0ciB0aGUgdGFibGUgYW5kIHVzZSBpdCBhcy1pcy4gIEJ1dAotICAgICBteSBsb3JkIGdob2QgaGF0aCBzcG9rZW4sIHNvIHdlIGRvIGl0IHRoaXMgd2F5LiAgRXhjdXNlIHRoZSB1Z2x5IHZhcgotICAgICBuYW1lcy4gICovCi0KLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICppbnM7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBtNjhrX2luY2FudCAqaGFjaywgKnNsYWs7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnJldHZhbCA9IDA7CS8qIGVtcHR5IHN0cmluZywgb3IgZXJyb3IgbXNnIHRleHQgKi8KLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMTsKLSAgICAgIG02OGtfYWJzcGNhZGQgPSAxOwotICAgICAgaWYgKCEgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpCi0JbTY4a19yZWwzMiA9IDA7Ci0gICAgfQotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBvYnN0YWNrX2JlZ2luICgmcm9ieW4sIDQwMDApOwotICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1vcGNvZGVzOyBpKyspCi0gICAgewotICAgICAgaGFjayA9IHNsYWsgPSAoc3RydWN0IG02OGtfaW5jYW50ICopIG9ic3RhY2tfYWxsb2MgKCZyb2J5biwgc2l6ZW9mIChzdHJ1Y3QgbTY4a19pbmNhbnQpKTsKLSAgICAgIGRvCi0JewotCSAgaW5zID0gJm02OGtfb3Bjb2Rlc1tpXTsKLQkgIC8qIFdlICpjb3VsZCogaWdub3JlIGluc25zIHRoYXQgZG9uJ3QgbWF0Y2ggb3VyIGFyY2ggaGVyZQotCSAgICAgYnV0IGp1c3QgbGVhdmluZyB0aGVtIG91dCBvZiB0aGUgaGFzaC4gKi8KLQkgIHNsYWstPm1fb3BlcmFuZHMgPSBpbnMtPmFyZ3M7Ci0JICBzbGFrLT5tX29wbnVtID0gc3RybGVuIChzbGFrLT5tX29wZXJhbmRzKSAvIDI7Ci0JICBzbGFrLT5tX2FyY2ggPSBpbnMtPmFyY2g7Ci0JICBzbGFrLT5tX29wY29kZSA9IGlucy0+b3Bjb2RlOwotCSAgLyogVGhpcyBpcyBrbHVkZ2V5ICovCi0JICBzbGFrLT5tX2NvZGVudW0gPSAoKGlucy0+bWF0Y2gpICYgMHhmZmZmTCkgPyAyIDogMTsKLQkgIGlmIChpICsgMSAhPSBtNjhrX251bW9wY29kZXMKLQkgICAgICAmJiAhc3RyY21wIChpbnMtPm5hbWUsIG02OGtfb3Bjb2Rlc1tpICsgMV0ubmFtZSkpCi0JICAgIHsKLQkgICAgICBzbGFrLT5tX25leHQgPSAoc3RydWN0IG02OGtfaW5jYW50ICopIG9ic3RhY2tfYWxsb2MgKCZyb2J5biwgc2l6ZW9mIChzdHJ1Y3QgbTY4a19pbmNhbnQpKTsKLQkgICAgICBpKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc2xhay0+bV9uZXh0ID0gMDsKLQkgIHNsYWsgPSBzbGFrLT5tX25leHQ7Ci0JfQotICAgICAgd2hpbGUgKHNsYWspOwotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgaW5zLT5uYW1lLCAoY2hhciAqKSBoYWNrKTsKLSAgICAgIGlmIChyZXR2YWwpCi0JYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiAgQ2FuJ3QgaGFzaCAlczogJXMiKSwgaW5zLT5uYW1lLCByZXR2YWwpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1hbGlhc2VzOyBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG02OGtfb3Bjb2RlX2FsaWFzZXNbaV0ucHJpbWFyeTsKLSAgICAgIGNvbnN0IGNoYXIgKmFsaWFzID0gbTY4a19vcGNvZGVfYWxpYXNlc1tpXS5hbGlhczsKLSAgICAgIFBUUiB2YWwgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG5hbWUpOwotICAgICAgaWYgKCF2YWwpCi0JYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiBDYW4ndCBmaW5kICVzIGluIGhhc2ggdGFibGUiKSwgbmFtZSk7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgYWxpYXMsIHZhbCk7Ci0gICAgICBpZiAocmV0dmFsKQotCWFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgaGFzaCAlczogJXMiKSwgYWxpYXMsIHJldHZhbCk7Ci0gICAgfQotCi0gIC8qIEluIE1SSSBtb2RlLCBhbGwgdW5zaXplZCBicmFuY2hlcyBhcmUgdmFyaWFibGUgc2l6ZWQuICBOb3JtYWxseSwKLSAgICAgdGhleSBhcmUgd29yZCBzaXplZC4gICovCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBzdGF0aWMgc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzIG1yaV9hbGlhc2VzW10gPQotCXsKLQkgIHsgImJoaSIsCSJqaGkiLCB9LAotCSAgeyAiYmxzIiwJImpscyIsIH0sCi0JICB7ICJiY2MiLAkiamNjIiwgfSwKLQkgIHsgImJjcyIsCSJqY3MiLCB9LAotCSAgeyAiYm5lIiwJImpuZSIsIH0sCi0JICB7ICJiZXEiLAkiamVxIiwgfSwKLQkgIHsgImJ2YyIsCSJqdmMiLCB9LAotCSAgeyAiYnZzIiwJImp2cyIsIH0sCi0JICB7ICJicGwiLAkianBsIiwgfSwKLQkgIHsgImJtaSIsCSJqbWkiLCB9LAotCSAgeyAiYmdlIiwJImpnZSIsIH0sCi0JICB7ICJibHQiLAkiamx0IiwgfSwKLQkgIHsgImJndCIsCSJqZ3QiLCB9LAotCSAgeyAiYmxlIiwJImpsZSIsIH0sCi0JICB7ICJicmEiLAkianJhIiwgfSwKLQkgIHsgImJzciIsCSJqYnNyIiwgfSwKLQl9OwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIG1yaV9hbGlhc2VzIC8gc2l6ZW9mIG1yaV9hbGlhc2VzWzBdOyBpKyspCi0JewotCSAgY29uc3QgY2hhciAqbmFtZSA9IG1yaV9hbGlhc2VzW2ldLnByaW1hcnk7Ci0JICBjb25zdCBjaGFyICphbGlhcyA9IG1yaV9hbGlhc2VzW2ldLmFsaWFzOwotCSAgUFRSIHZhbCA9IGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7Ci0JICBpZiAoIXZhbCkKLQkgICAgYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiBDYW4ndCBmaW5kICVzIGluIGhhc2ggdGFibGUiKSwgbmFtZSk7Ci0JICByZXR2YWwgPSBoYXNoX2phbSAob3BfaGFzaCwgYWxpYXMsIHZhbCk7Ci0JICBpZiAocmV0dmFsKQotCSAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGhhc2ggJXM6ICVzIiksIGFsaWFzLCByZXR2YWwpOwotCX0KLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAobWtsb3dlcl90YWJsZSk7IGkrKykKLSAgICBta2xvd2VyX3RhYmxlW2ldID0gKGlzdXBwZXIgKGMgPSAoY2hhcikgaSkpID8gdG9sb3dlciAoYykgOiBjOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG5vdGVuZF90YWJsZSk7IGkrKykKLSAgICB7Ci0gICAgICBub3RlbmRfdGFibGVbaV0gPSAwOwotICAgICAgYWx0X25vdGVuZF90YWJsZVtpXSA9IDA7Ci0gICAgfQotICBub3RlbmRfdGFibGVbJywnXSA9IDE7Ci0gIG5vdGVuZF90YWJsZVsneyddID0gMTsKLSAgbm90ZW5kX3RhYmxlWyd9J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydhJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydBJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydkJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydEJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWycjJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWycmJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydmJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWydGJ10gPSAxOwotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotICBhbHRfbm90ZW5kX3RhYmxlW1JFR0lTVEVSX1BSRUZJWF0gPSAxOwotI2VuZGlmCi0KLSAgLyogV2UgbmVlZCB0byBwdXQgJygnIGluIGFsdF9ub3RlbmRfdGFibGUgdG8gaGFuZGxlCi0gICAgICAgY2FzMiAlZDA6JWQyLCVkMzolZDQsKCVhMCk6KCVhMSkKLSAgICAgKi8KLSAgYWx0X25vdGVuZF90YWJsZVsnKCddID0gMTsKLQotICAvKiBXZSBuZWVkIHRvIHB1dCAnQCcgaW4gYWx0X25vdGVuZF90YWJsZSB0byBoYW5kbGUKLSAgICAgICBjYXMyICVkMDolZDIsJWQzOiVkNCxAKCVkMCk6QCglZDEpCi0gICAgICovCi0gIGFsdF9ub3RlbmRfdGFibGVbJ0AnXSA9IDE7Ci0KLSAgLyogV2UgbmVlZCB0byBwdXQgZGlnaXRzIGluIGFsdF9ub3RlbmRfdGFibGUgdG8gaGFuZGxlCi0gICAgICAgYmZleHR1ICVkMHsyNDoxfSwlZDAKLSAgICAgKi8KLSAgYWx0X25vdGVuZF90YWJsZVsnMCddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnMSddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnMiddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnMyddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnNCddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnNSddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnNiddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnNyddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnOCddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnOSddID0gMTsKLQotI2lmbmRlZiBNSVRfU1lOVEFYX09OTFkKLSAgLyogSW5zZXJ0IHBzZXVkbyBvcHMsIHRoZXNlIGhhdmUgdG8gZ28gaW50byB0aGUgb3Bjb2RlIHRhYmxlIHNpbmNlCi0gICAgIGdhcyBleHBlY3RzIHBzZXVkbyBvcHMgdG8gc3RhcnQgd2l0aCBhIGRvdCAqLwotICB7Ci0gICAgaW50IG4gPSAwOwotICAgIHdoaWxlIChtb3RlX3BzZXVkb190YWJsZVtuXS5wb2NfbmFtZSkKLSAgICAgIHsKLQloYWNrID0gKHN0cnVjdCBtNjhrX2luY2FudCAqKQotCSAgb2JzdGFja19hbGxvYyAoJnJvYnluLCBzaXplb2YgKHN0cnVjdCBtNjhrX2luY2FudCkpOwotCWhhc2hfaW5zZXJ0IChvcF9oYXNoLAotCQkgICAgIG1vdGVfcHNldWRvX3RhYmxlW25dLnBvY19uYW1lLCAoY2hhciAqKSBoYWNrKTsKLQloYWNrLT5tX29wZXJhbmRzID0gMDsKLQloYWNrLT5tX29wbnVtID0gbjsKLQluKys7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGluaXRfcmVndGFibGUgKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIHJlY29yZF9hbGlnbm1lbnQgKHRleHRfc2VjdGlvbiwgMik7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKGRhdGFfc2VjdGlvbiwgMik7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCAyKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotc2VsZWN0X2NvbnRyb2xfcmVncyAoKQotewotICAvKiBOb3RlIHdoaWNoIHNldCBvZiAibW92ZWMiIGNvbnRyb2wgcmVnaXN0ZXJzIGlzIGF2YWlsYWJsZS4gICovCi0gIHN3aXRjaCAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLSAgICB7Ci0gICAgY2FzZSBtNjgwMDA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwMDBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtNjgwMTA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwMTBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtNjgwMjA6Ci0gICAgY2FzZSBtNjgwMzA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwMjBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtNjgwNDA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwNDBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtNjgwNjA6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtNjgwNjBfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjcHUzMjoKLSAgICAgIGNvbnRyb2xfcmVncyA9IGNwdTMyX2NvbnRyb2xfcmVnczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbWNmNTIwMDoKLSAgICBjYXNlIG1jZjUyMDZlOgotICAgIGNhc2UgbWNmNTMwNzoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG1jZl9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi12b2lkCi1tNjhrX2luaXRfYWZ0ZXJfYXJncyAoKQotewotICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSAwKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotCi0gICAgICBpZiAoKmRlZmF1bHRfY3B1ID09ICdtJykKLQlkZWZhdWx0X2NwdSsrOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKLQlpZiAoc3RyY2FzZWNtcCAoZGVmYXVsdF9jcHUsIGFyY2hzW2ldLm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChpID09IG5fYXJjaHMpCi0JewotCSAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgZGVmYXVsdCBjcHUgYCVzJyA/Pz8iKSwgVEFSR0VUX0NQVSk7Ci0JICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjgwMjA7Ci0JfQotICAgICAgZWxzZQotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2hzW2ldLmFyY2g7Ci0gICAgfQotICAvKiBQZXJtaXQgbTY4ODgxIHNwZWNpZmljYXRpb24gd2l0aCBhbGwgY3B1czsgdGhvc2UgdGhhdCBjYW4ndCB3b3JrCi0gICAgIHdpdGggYSBjb3Byb2Nlc3NvciBjb3VsZCBiZSBkb2luZyBlbXVsYXRpb24uICAqLwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4NTEpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4MDQwKQotCXsKLQkgIGFzX3dhcm4gKF8oIjY4MDQwIGFuZCA2ODg1MSBzcGVjaWZpZWQ7IG1tdSBpbnN0cnVjdGlvbnMgbWF5IGFzc2VtYmxlIGluY29ycmVjdGx5IikpOwotCX0KLSAgICB9Ci0gIC8qIFdoYXQgb3RoZXIgaW5jb21wYXRpYmlsaXRpZXMgY291bGQgd2UgY2hlY2sgZm9yPyAgKi8KLQotICAvKiBUb3NzIGluIHNvbWUgZGVmYXVsdCBhc3N1bXB0aW9ucyBhYm91dCBjb3Byb2Nlc3NvcnMuICAqLwotICBpZiAoIW5vXzY4ODgxCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCSAgLyogQ2FuIENQVTMyIGhhdmUgYSA2ODg4MSBjb3Byb2Nlc3Nvcj8/ICAqLwotCSAgJiAobTY4MDIwIHwgbTY4MDMwIHwgY3B1MzIpKSkKLSAgICB7Ci0gICAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4ODE7Ci0gICAgfQotICBpZiAoIW5vXzY4ODUxCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIG02ODAyMHVwKSAhPSAwCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIG02ODA0MHVwKSA9PSAwKQotICAgIHsKLSAgICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKLSAgICB9Ci0gIGlmIChub182ODg4MSAmJiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4ODEpKQotICAgIGFzX2JhZCAoXygib3B0aW9ucyBmb3IgNjg4ODEgYW5kIG5vLTY4ODgxIGJvdGggZ2l2ZW4iKSk7Ci0gIGlmIChub182ODg1MSAmJiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4NTEpKQotICAgIGFzX2JhZCAoXygib3B0aW9ucyBmb3IgNjg4NTEgYW5kIG5vLTY4ODUxIGJvdGggZ2l2ZW4iKSk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotICAvKiBXb3JrIG91dCB0aGUgbWFnaWMgbnVtYmVyLiAgVGhpcyBpc24ndCB2ZXJ5IGdlbmVyYWwuICAqLwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMDApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMDsKLSAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMTApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMTsKLSAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMjApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMjsKLSAgZWxzZQotICAgIG02OGtfYW91dF9tYWNodHlwZSA9IDI7Ci0jZW5kaWYKLQotICAvKiBOb3RlIHdoaWNoIHNldCBvZiAibW92ZWMiIGNvbnRyb2wgcmVnaXN0ZXJzIGlzIGF2YWlsYWJsZS4gICovCi0gIHNlbGVjdF9jb250cm9sX3JlZ3MgKCk7Ci0KLSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLSAgICAgIHx8IGFyY2hfY29sZGZpcmVfcCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQotICAgIG1kX3JlbGF4X3RhYmxlW1RBQiAoUENJTkRFWCwgQllURSldLnJseF9tb3JlID0gMDsKLX0KLQwKLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBsYWJlbCBpcyBkZWZpbmVkLiAgKi8KLQotdm9pZAotbTY4a19mcm9iX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3RydWN0IGxhYmVsX2xpbmUgKm47Ci0KLSAgbiA9IChzdHJ1Y3QgbGFiZWxfbGluZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5uZXh0ID0gbGFiZWxzOwotICBuLT5sYWJlbCA9IHN5bTsKLSAgYXNfd2hlcmUgKCZuLT5maWxlLCAmbi0+bGluZSk7Ci0gIG4tPnRleHQgPSAwOwotICBsYWJlbHMgPSBuOwotICBjdXJyZW50X2xhYmVsID0gbjsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIGluc3RydWN0aW9uIGlzIGVtaXR0ZWQuICAqLwotCi12b2lkCi1tNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi17Ci0gIGN1cnJlbnRfbGFiZWwgPSBOVUxMOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSwgd2hlbiB0aGUgZmluYWwgdmFsdWUgb2YKLSAgIHRoZSBsYWJlbCBpcyBrbm93bi4gIFdlIHdhcm4gaWYgdGhpcyBpcyBhIHRleHQgc3ltYm9sIGFsaWduZWQgYXQgYW4KLSAgIG9kZCBsb2NhdGlvbi4gICovCi0KLXZvaWQKLW02OGtfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSByZWdfc2VjdGlvbgotICAgICAgJiYgKGludCkgU19HRVRfVkFMVUUgKHN5bSkgPCAwKQotICAgIHsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCB+KGludClTX0dFVF9WQUxVRSAoc3ltKSk7Ci0gICAgfQotICBlbHNlIGlmICgoU19HRVRfVkFMVUUgKHN5bSkgJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBsYWJlbF9saW5lICpsOwotCi0gICAgICBmb3IgKGwgPSBsYWJlbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JewotCSAgaWYgKGwtPmxhYmVsID09IHN5bSkKLQkgICAgewotCSAgICAgIGlmIChsLT50ZXh0KQotCQlhc193YXJuX3doZXJlIChsLT5maWxlLCBsLT5saW5lLAotCQkJICAgICAgIF8oInRleHQgbGFiZWwgYCVzJyBhbGlnbmVkIHRvIG9kZCBib3VuZGFyeSIpLAotCQkJICAgICAgIFNfR0VUX05BTUUgKHN5bSkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQwKLS8qIFRoaXMgaXMgY2FsbGVkIGlmIHdlIGdvIGluIG9yIG91dCBvZiBNUkkgbW9kZSBiZWNhdXNlIG9mIHRoZSAubXJpCi0gICBwc2V1ZG8tb3AuICAqLwotCi12b2lkCi1tNjhrX21yaV9tb2RlX2NoYW5nZSAob24pCi0gICAgIGludCBvbjsKLXsKLSAgaWYgKG9uKQotICAgIHsKLSAgICAgIGlmICghIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCkKLQl7Ci0JICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSAxOwotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotCSAgaW5pdF9yZWd0YWJsZSAoKTsKLSNlbmRpZgotCX0KLSAgICAgIG02OGtfYWJzcGNhZGQgPSAxOwotICAgICAgaWYgKCEgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpCi0JbTY4a19yZWwzMiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgcmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuKQotCXsKLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwKLQkgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTDsKLSNlbHNlCi0JICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSAwOwotI2VuZGlmCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0JICBpbml0X3JlZ3RhYmxlICgpOwotI2VuZGlmCi0JfQotICAgICAgbTY4a19hYnNwY2FkZCA9IDA7Ci0gICAgICBpZiAoISBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSkKLQltNjhrX3JlbDMyID0gMTsKLSAgICB9Ci19Ci0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi1zdGF0aWMgdm9pZAotbWRfYXBwbHlfZml4XzIgKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci17Ci0gIGFkZHJlc3NUIHVwcGVyX2xpbWl0OwotICBvZmZzZXRUIGxvd2VyX2xpbWl0OwotCi0gIC8qIFRoaXMgaXMgdW5uZWNlc3NhcnkgYnV0IGl0IGNvbnZpbmNlcyB0aGUgbmF0aXZlIHJzNjAwMCBjb21waWxlcgotICAgICB0byBnZW5lcmF0ZSB0aGUgY29kZSB3ZSB3YW50LiAgKi8KLSAgY2hhciAqYnVmID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgYnVmICs9IGZpeFAtPmZ4X3doZXJlOwotICAvKiBlbmQgaWJtIGNvbXBpbGVyIHdvcmthcm91bmQgKi8KLQotICBpZiAodmFsICYgMHg4MDAwMDAwMCkKLSAgICB2YWwgfD0gfihhZGRyZXNzVCkweDdmZmZmZmZmOwotICBlbHNlCi0gICAgdmFsICY9IDB4N2ZmZmZmZmY7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChmaXhQLT5meF9hZGRzeSkKLSAgICB7Ci0gICAgICBtZW1zZXQgKGJ1ZiwgMCwgZml4UC0+Znhfc2l6ZSk7Ci0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciBlbWl0X3JlbG9jICovCi0KLSAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0JICAmJiAhU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgICYmICFTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLQlTX1NFVF9XRUFLIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm47Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3NpemUpCi0gICAgewotICAgICAgLyogVGhlIGNhc3QgdG8gb2Zmc2V0VCBiZWxvdyBhcmUgbmVjZXNzYXJ5IHRvIG1ha2UgY29kZSBjb3JyZWN0IGZvcgotCSBtYWNoaW5lcyB3aGVyZSBpbnRzIGFyZSBzbWFsbGVyIHRoYW4gb2Zmc2V0VCAqLwotICAgIGNhc2UgMToKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIHVwcGVyX2xpbWl0ID0gMHg3ZjsKLSAgICAgIGxvd2VyX2xpbWl0ID0gLSAob2Zmc2V0VCkgMHg4MDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICB1cHBlcl9saW1pdCA9IDB4N2ZmZjsKLSAgICAgIGxvd2VyX2xpbWl0ID0gLSAob2Zmc2V0VCkgMHg4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICB1cHBlcl9saW1pdCA9IDB4N2ZmZmZmZmY7Ci0gICAgICBsb3dlcl9saW1pdCA9IC0gKG9mZnNldFQpIDB4N2ZmZmZmZmYgLSAxOwkvKiBhdm9pZCBjb25zdGFudCBvdmVyZmxvdyAqLwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmaXhQLT5meF9zaXplKTsKLSAgICB9Ci0KLSAgLyogRml4IHVwIGEgbmVnYXRpdmUgcmVsb2MuICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCAmJiBmaXhQLT5meF9zdWJzeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gZml4UC0+Znhfc3Vic3k7Ci0gICAgICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0gICAgICBmaXhQLT5meF90Y2JpdCA9IDE7Ci0gICAgfQotCi0gIC8qIEZvciBub24tcGMtcmVsYXRpdmUgdmFsdWVzLCBpdCdzIGNvbmNlaXZhYmxlIHdlIG1pZ2h0IGdldCBzb21ldGhpbmcKLSAgICAgbGlrZSAiMHhmZiIgZm9yIGEgYnl0ZSBmaWVsZC4gIFNvIGV4dGVuZCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcmFuZ2UKLSAgICAgdG8gYWNjZXB0IHN1Y2ggbnVtYmVycy4gIFdlIGFyYml0cmFyaWx5IGRpc2FsbG93ICItMHhmZiIgb3IgIjB4ZmYrMHhmZiIsCi0gICAgIHNvIHRoYXQgd2UgY2FuIGRvIGFueSByYW5nZSBjaGVja2luZyBhdCBhbGwuICAqLwotICBpZiAoISBmaXhQLT5meF9wY3JlbCAmJiAhIGZpeFAtPmZ4X3NpZ25lZCkKLSAgICB1cHBlcl9saW1pdCA9IHVwcGVyX2xpbWl0ICogMiArIDE7Ci0KLSAgaWYgKChhZGRyZXNzVCkgdmFsID4gdXBwZXJfbGltaXQKLSAgICAgICYmICh2YWwgPiAwIHx8IHZhbCA8IGxvd2VyX2xpbWl0KSkKLSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInZhbHVlIG91dCBvZiByYW5nZSIpKTsKLQotICAvKiBBIG9uZSBieXRlIFBDLXJlbGF0aXZlIHJlbG9jIG1lYW5zIGEgc2hvcnQgYnJhbmNoLiAgV2UgY2FuJ3QgdXNlCi0gICAgIGEgc2hvcnQgYnJhbmNoIHdpdGggYSB2YWx1ZSBvZiAwIG9yIC0xLCBiZWNhdXNlIHRob3NlIGluZGljYXRlCi0gICAgIGRpZmZlcmVudCBvcGNvZGVzIChicmFuY2hlcyB3aXRoIGxvbmdlciBvZmZzZXRzKS4gIGZpeHVwX3NlZ21lbnQKLSAgICAgaW4gd3JpdGUuYyBtYXkgaGF2ZSBjbG9iYmVyZWQgZnhfcGNyZWwsIHNvIHdlIG5lZWQgdG8gZXhhbWluZSB0aGUKLSAgICAgcmVsb2MgdHlwZS4gICovCi0gIGlmICgoZml4UC0+ZnhfcGNyZWwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184X1BDUkVMCi0jZW5kaWYKLSAgICAgICApCi0gICAgICAmJiBmaXhQLT5meF9zaXplID09IDEKLSAgICAgICYmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMCi0JICB8fCBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICAgICYmICh2YWwgPT0gMCB8fCB2YWwgPT0gLTEpKQotICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygiaW52YWxpZCBieXRlIGJyYW5jaCBvZmZzZXQiKSk7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotewotICBtZF9hcHBseV9maXhfMiAoZml4UCwgKGFkZHJlc3NUKSAqdmFscCk7Ci0gIHJldHVybiAxOwotfQotI2Vsc2UKLXZvaWQgbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBtZF9hcHBseV9maXhfMiAoZml4UCwgKGFkZHJlc3NUKSB2YWwpOwotfQotI2VuZGlmCi0KLS8qICpmcmFnUCBoYXMgYmVlbiByZWxheGVkIHRvIGl0cyBmaW5hbCBzaXplLCBhbmQgbm93IG5lZWRzIHRvIGhhdmUKLSAgIHRoZSBieXRlcyBpbnNpZGUgaXQgbW9kaWZpZWQgdG8gY29uZm9ybSB0byB0aGUgbmV3IHNpemUgIFRoZXJlIGlzIFVHTFkKLSAgIE1BR0lDIGhlcmUuIC4uCi0gICAqLwotc3RhdGljIHZvaWQKLW1kX2NvbnZlcnRfZnJhZ18xIChmcmFnUCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBsb25nIGRpc3A7Ci0gIGxvbmcgZXh0ID0gMDsKLSAgZml4UyAqZml4UDsKLQotICAvKiBBZGRyZXNzIGluIG9iamVjdCBjb2RlIG9mIHRoZSBkaXNwbGFjZW1lbnQuICAqLwotICByZWdpc3RlciBpbnQgb2JqZWN0X2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7Ci0KLSAgLyogQWRkcmVzcyBpbiBnYXMgY29yZSBvZiB0aGUgcGxhY2UgdG8gc3RvcmUgdGhlIGRpc3BsYWNlbWVudC4gICovCi0gIC8qIFRoaXMgY29udmluY2VzIHRoZSBuYXRpdmUgcnM2MDAwIGNvbXBpbGVyIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHdlCi0gICAgIHdhbnQuICovCi0gIHJlZ2lzdGVyIGNoYXIgKmJ1ZmZlcl9hZGRyZXNzID0gZnJhZ1AtPmZyX2xpdGVyYWw7Ci0gIGJ1ZmZlcl9hZGRyZXNzICs9IGZyYWdQLT5mcl9maXg7Ci0gIC8qIGVuZCBpYm0gY29tcGlsZXIgd29ya2Fyb3VuZCAqLwotCi0gIC8qIFRoZSBkaXNwbGFjZW1lbnQgb2YgdGhlIGFkZHJlc3MsIGZyb20gY3VycmVudCBsb2NhdGlvbi4gICovCi0gIGRpc3AgPSBmcmFnUC0+ZnJfc3ltYm9sID8gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpIDogMDsKLSAgZGlzcCA9IChkaXNwICsgZnJhZ1AtPmZyX29mZnNldCkgLSBvYmplY3RfYWRkcmVzczsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZGlzcCArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBCWVRFKToKLSAgICBjYXNlIFRBQiAoQUJSQU5DSCwgQllURSk6Ci0gICAgICBrbm93IChpc3NieXRlIChkaXNwKSk7Ci0gICAgICBpZiAoZGlzcCA9PSAwKQotCWFzX2JhZCAoXygic2hvcnQgYnJhbmNoIHdpdGggemVybyBvZmZzZXQ6IHVzZSA6dyIpKTsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSBkaXNwOwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChEQkNDLCBTSE9SVCk6Ci0gICAgICBrbm93IChpc3N3b3JkIChkaXNwKSk7Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBTSE9SVCk6Ci0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIFNIT1JUKToKLSAgICAgIGtub3cgKGlzc3dvcmQgKGRpc3ApKTsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDAwOwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChBQlJBTkNILCBMT05HKToKLSAgICAgIGlmICghSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JewotCSAgaWYgKGZyYWdQLT5mcl9vcGNvZGVbMF0gPT0gMHg2MSkKLQkgICAgLyogQlNSICovCi0JICAgIHsKLQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzBdID0gMHg0RTsKLQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4Qjk7IC8qIEpCU1Igd2l0aCBBQlNMIExPTkcgb2Zmc2V0ICovCi0KLQkgICAgICBmaXhfbmV3IChmcmFnUCwKLQkJICAgICAgIGZyYWdQLT5mcl9maXgsCi0JCSAgICAgICA0LAotCQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JCSAgICAgICAwLAotCQkgICAgICAgTk9fUkVMT0MpOwotCi0JICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgICAgIGV4dCA9IDA7Ci0JICAgIH0KLQkgIC8qIEJSQSAqLwotCSAgZWxzZSBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYwKQotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEY5OyAvKiBKTVAgIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLwotCSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgICBleHQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvbmcgYnJhbmNoIG9mZnNldCBub3Qgc3VwcG9ydGVkLiIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4ZmY7Ci0JICBleHQgPSA0OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgTE9ORyk6Ci0gICAgICAvKiBvbmx5IEJjYyA2ODAwMCBpbnN0cnVjdGlvbnMgY2FuIGNvbWUgaGVyZSAqLwotICAgICAgLyogY2hhbmdlIGJjYyBpbnRvIGIhY2Mvam1wIGFic2wgbG9uZyAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSBePSAweDAxOwkvKiBpbnZlcnQgYmNjICovCi0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gMHg2Oy8qIGJyYW5jaCBvZmZzZXQgPSA2ICovCi0KLSAgICAgIC8qIEpGOiB0aGVzZSB1c2VkIHRvIGJlIGZyX29wY29kZVsyLDNdLCBidXQgdGhleSBtYXkgYmUgaW4gYQotCSAgIGRpZmZlcmVudCBmcmFnLCBpbiB3aGljaCBjYXNlIHJlZmVyaW5nIHRvIHRoZW0gaXMgYSBuby1uby4KLQkgICBPbmx5IGZyX29wY29kZVswLDFdIGFyZSBndWFyYW50ZWVkIHRvIHdvcmsuICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAoY2hhcikgMHhmOTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsJLyogYWNjb3VudCBmb3Igam1wIGluc3RydWN0aW9uICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChEQkNDLCBMT05HKToKLSAgICAgIC8qIG9ubHkgREJjYyA2ODAwMCBpbnN0cnVjdGlvbnMgY2FuIGNvbWUgaGVyZSAqLwotICAgICAgLyogY2hhbmdlIGRiY2MgaW50byBkYmNjL2ptcCBhYnNsIGxvbmcgKi8KLSAgICAgIC8qIEpGOiB0aGVzZSB1c2VkIHRvIGJlIGZyX29wY29kZVsyLTddLCBidXQgdGhhdCdzIHdyb25nICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4MDA7CS8qIGJyYW5jaCBvZmZzZXQgPSA0ICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4MDQ7Ci0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4NjA7CS8qIHB1dCBpbiBicmEgcGMrNiAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDA2OwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gKGNoYXIpIDB4Zjk7Ci0KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbnMgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gICAgICBleHQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKEZCUkFOQ0gsIFNIT1JUKToKLSAgICAgIGtub3cgKChmcmFnUC0+ZnJfb3Bjb2RlWzFdICYgMHg0MCkgPT0gMCk7Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKEZCUkFOQ0gsIExPTkcpOgotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDQwOwkvKiBUdXJuIG9uIExPTkcgYml0ICovCi0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDUkVMLCBTSE9SVCk6Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDUkVMLCBMT05HKToKLSAgICAgIC8qIFRoZSB0aGluZyB0byBkbyBoZXJlIGlzIGZvcmNlIGl0IHRvIEFCU09MVVRFIExPTkcsIHNpbmNlCi0JUENSRUwgaXMgcmVhbGx5IHRyeWluZyB0byBzaG9ydGVuIGFuIEFCU09MVVRFIGFkZHJlc3MgYW55d2F5ICovCi0gICAgICAvKiBKRiBGT08gVGhpcyBjb2RlIGhhcyBub3QgYmVlbiB0ZXN0ZWQgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLCBOT19SRUxPQyk7Ci0gICAgICBpZiAoKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAweDNGKSAhPSAweDNBKQotCWFzX2JhZCAoXygiSW50ZXJuYWwgZXJyb3IgKGxvbmcgUEMtcmVsYXRpdmUgb3BlcmFuZCkgZm9yIGluc24gMHglMDR4IGF0IDB4JWx4IiksCi0JCSh1bnNpZ25lZCkgZnJhZ1AtPmZyX29wY29kZVswXSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzKTsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gJj0gfjB4M0Y7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdIHw9IDB4Mzk7CS8qIE1vZGUgNy4xICovCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gICAgICBleHQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDTEVBLCBTSE9SVCk6Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdICY9IH4weDNGOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDNBOyAvKiAwNzIgLSBtb2RlIDcuMiAqLwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ0xFQSwgTE9ORyk6Ci0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLSAgICAgIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IDI7Ci0gICAgICAvKiBBbHJlYWR5IHNldCB0byBtb2RlIDcuMzsgdGhpcyBpbmRpY2F0ZXM6IFBDIGluZGlyZWN0IHdpdGgKLQkgc3VwcHJlc3NlZCBpbmRleCwgMzItYml0IGRpc3BsYWNlbWVudC4gICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4MDE7Ci0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4NzA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRBQiAoUENJTkRFWCwgQllURSk6Ci0gICAgICBkaXNwICs9IDI7Ci0gICAgICBpZiAoIWlzc2J5dGUgKGRpc3ApKQotCXsKLQkgIGFzX2JhZCAoXygiZGlzcGxhY2VtZW50IGRvZXNuJ3QgZml0IGluIG9uZSBieXRlIikpOwotCSAgZGlzcCA9IDA7Ci0JfQotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfZml4ID49IDIpOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTJdICY9IH4xOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTFdID0gZGlzcDsKLSAgICAgIGV4dCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENJTkRFWCwgU0hPUlQpOgotICAgICAgZGlzcCArPSAyOwotICAgICAgYXNzZXJ0IChpc3N3b3JkIChkaXNwKSk7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9maXggPj0gMik7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMl0gfD0gMHgxOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTFdID0gMHgyMDsKLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAoZnJhZ1AtPmZyX29wY29kZVsxXSAmIDA3NykgPT0gMDczLAotCQkgICAgICBOT19SRUxPQyk7Ci0gICAgICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAyOwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ0lOREVYLCBMT05HKToKLSAgICAgIGRpc3AgKz0gMjsKLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAoZnJhZ1AtPmZyX29wY29kZVsxXSAmIDA3NykgPT0gMDczLAotCQkgICAgICBOT19SRUxPQyk7Ci0gICAgICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAyOwotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfZml4ID49IDIpOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTJdIHw9IDB4MTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0xXSA9IDB4MzA7Ci0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChleHQpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXJfYWRkcmVzcywgKGxvbmcpIGRpc3AsIChpbnQpIGV4dCk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IGV4dDsKLSAgICB9Ci19Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlYywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlYzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBtZF9jb252ZXJ0X2ZyYWdfMSAoZnJhZ1ApOwotfQotCi0jZWxzZQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgbWRfY29udmVydF9mcmFnXzEgKGZyYWdQKTsKLX0KLSNlbmRpZgotCi0vKiBGb3JjZSB0cnVseSB1bmRlZmluZWQgc3ltYm9scyB0byB0aGVpciBtYXhpbXVtIHNpemUsIGFuZCBnZW5lcmFsbHkgc2V0IHVwCi0gICB0aGUgZnJhZyBsaXN0IHRvIGJlIHJlbGF4ZWQKLSAgICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIGludCBvbGRfZml4OwotICByZWdpc3RlciBjaGFyICpidWZmZXJfYWRkcmVzcyA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbDsKLQotICBvbGRfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBoYW5kbGUgU1pfVU5ERUYgZmlyc3QsIGl0IGNhbiBiZSBjaGFuZ2VkIHRvIEJZVEUgb3IgU0hPUlQgKi8KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIFRBQiAoQUJSQU5DSCwgU1pfVU5ERUYpOgotICAgICAgewotCWlmICgoZnJhZ1AtPmZyX3N5bWJvbCAhPSBOVUxMKQkvKiBOb3QgYWJzb2x1dGUgKi8KLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFRBQlRZUEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSwgQllURSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWVsc2UgaWYgKChmcmFnUC0+ZnJfc3ltYm9sID09IDApIHx8ICFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkgIHsKLQkgICAgLyogT24gNjgwMDAsIG9yIGZvciBhYnNvbHV0ZSB2YWx1ZSwgc3dpdGNoIHRvIGFicyBsb25nICovCi0JICAgIC8qIEZJWE1FLCB3ZSBzaG91bGQgY2hlY2sgYWJzIHZhbCwgcGljayBzaG9ydCBvciBsb25nICovCi0JICAgIGlmIChmcmFnUC0+ZnJfb3Bjb2RlWzBdID09IDB4NjEpCi0JICAgICAgewotCQlmcmFnUC0+ZnJfb3Bjb2RlWzBdID0gMHg0RTsKLQkJZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEI5OyAvKiBKQlNSIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLwotCQlmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwKLQkJCSBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JCWZyYWdQLT5mcl9maXggKz0gNDsKLQkJZnJhZ193YW5lIChmcmFnUCk7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChmcmFnUC0+ZnJfb3Bjb2RlWzBdID09IDB4NjApCi0JICAgICAgewotCQlmcmFnUC0+ZnJfb3Bjb2RlWzBdID0gMHg0RTsKLQkJZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEY5OyAvKiBKTVAgIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLwotCQlmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwKLQkJCSBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JCWZyYWdQLT5mcl9maXggKz0gNDsKLQkJZnJhZ193YW5lIChmcmFnUCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlhc193YXJuIChfKCJMb25nIGJyYW5jaCBvZmZzZXQgdG8gZXh0ZXJuIHN5bWJvbCBub3Qgc3VwcG9ydGVkLiIpKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewkJCS8qIFN5bWJvbCBpcyBzdGlsbCB1bmRlZmluZWQuICBNYWtlIGl0IHNpbXBsZSAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4ZmY7Ci0JICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgICBicmVhazsKLQkgIH0KLQotCWJyZWFrOwotICAgICAgfQkJCQkvKiBjYXNlIFRBQihBQlJBTkNILFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKEZCUkFOQ0gsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgICB8fCBmbGFnX3Nob3J0X3JlZnMpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChGQlJBTkNILCBTSE9SVCk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZpeF9uZXcgKGZyYWdQLCAoaW50KSBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdIHw9IDB4NDA7IC8qIFR1cm4gb24gTE9ORyBiaXQgKi8KLQkgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIFRBQihGQlJBTkNILFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKFBDUkVMLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgICAgfHwgZmxhZ19zaG9ydF9yZWZzCi0JICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkgICAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSBtY2Y1MjAwKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENSRUwsIFNIT1JUKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSAyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDUkVMLCBMT05HKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSA0OwotCSAgfQotCWJyZWFrOwotICAgICAgfQkJCQkvKiBUQUIoUENSRUwsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKGZyYWdQLT5mcl9zeW1ib2wgIT0gTlVMTCkKLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKEJDQzY4MDAwLCBCWVRFKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JLyogb25seSBCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLQkvKiBjaGFuZ2UgYmNjIGludG8gYiFjYy9qbXAgYWJzbCBsb25nICovCi0JZnJhZ1AtPmZyX29wY29kZVswXSBePSAweDAxOwkvKiBpbnZlcnQgYmNjICovCi0JaWYgKGZsYWdfc2hvcnRfcmVmcykKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IDB4MDQ7CS8qIGJyYW5jaCBvZmZzZXQgPSA2ICovCi0JICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVsyLDNdICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzBdID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzFdID0gKGNoYXIpIDB4Zjg7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsJLyogYWNjb3VudCBmb3Igam1wIGluc3RydWN0aW9uICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IDB4MDY7CS8qIGJyYW5jaCBvZmZzZXQgPSA2ICovCi0JICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVsyLDNdICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzBdID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzFdID0gKGNoYXIpIDB4Zjk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsJLyogYWNjb3VudCBmb3Igam1wIGluc3RydWN0aW9uICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgfQotCWZyYWdfd2FuZSAoZnJhZ1ApOwotCWJyZWFrOwotICAgICAgfQkJCQkvKiBjYXNlIFRBQihCQ0M2ODAwMCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChEQkNDLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKGZyYWdQLT5mcl9zeW1ib2wgIT0gTlVMTAotCSAgICAmJiBTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoREJDQywgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICAgIGJyZWFrOwotCSAgfQotCS8qIG9ubHkgREJjYyA2ODAwMCBpbnN0cnVjdGlvbnMgY2FuIGNvbWUgaGVyZSAqLwotCS8qIGNoYW5nZSBkYmNjIGludG8gZGJjYy9qbXAgYWJzbCBsb25nICovCi0JLyogSkY6IHRoZXNlIHVzZWQgdG8gYmUgZnJfb3Bjb2RlWzItNF0sIHdoaWNoIGlzIHdyb25nLiAqLwotCWJ1ZmZlcl9hZGRyZXNzWzBdID0gMHgwMDsJLyogYnJhbmNoIG9mZnNldCA9IDQgKi8KLQlidWZmZXJfYWRkcmVzc1sxXSA9IDB4MDQ7Ci0JYnVmZmVyX2FkZHJlc3NbMl0gPSAweDYwOwkvKiBwdXQgaW4gYnJhIHBjICsgLi4uICovCi0KLQlpZiAoZmxhZ19zaG9ydF9yZWZzKQotCSAgewotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbNS03XSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1szXSA9IDB4MDQ7CS8qIHBsdXMgNCAqLwotCSAgICBidWZmZXJfYWRkcmVzc1s0XSA9IDB4NGU7CS8qIFB1dCBpbiBKdW1wIFdvcmQgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNV0gPSAoY2hhcikgMHhmODsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwkvKiBhY2NvdW50IGZvciBicmEvam1wIGluc3RydWN0aW9uICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogSkY6IHRoZXNlIHdlcmUgZnJfb3Bjb2RlWzUtN10gKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbM10gPSAweDA2OwkvKiBQbHVzIDYgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNF0gPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNV0gPSAoY2hhcikgMHhmOTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwkvKiBhY2NvdW50IGZvciBicmEvam1wIGluc3RydWN0aW9uICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgfQotCi0JZnJhZ193YW5lIChmcmFnUCk7Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIGNhc2UgVEFCKERCQ0MsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoUENMRUEsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSkgPT0gc2VnbWVudAotCSAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICAgIHx8IGZsYWdfc2hvcnRfcmVmcwotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDTEVBLCBTSE9SVCk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0xFQSwgTE9ORyk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gNjsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogVEFCKFBDTEVBLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKFBDSU5ERVgsIFNaX1VOREVGKToKLSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCSAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSBtY2Y1MjAwKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0lOREVYLCBCWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDSU5ERVgsIExPTkcpOwotCSAgZnJhZ1AtPmZyX3ZhciArPSA0OwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBub3cgdGhhdCBTWl9VTkRFRiBhcmUgdGFrZW4gY2FyZSBvZiwgY2hlY2sgb3RoZXJzICovCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgQllURSk6Ci0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIEJZVEUpOgotICAgICAgLyogV2UgY2FuJ3QgZG8gYSBzaG9ydCBqdW1wIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBzbyBpbiB0aGF0Ci0JIGNhc2Ugd2UgZm9yY2Ugd29yZCBtb2RlLiAgQXQgdGhpcyBwb2ludCBTX0dFVF9WQUxVRSBzaG91bGQKLQkgcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIHN5bWJvbCB3aXRoaW4gaXRzIGZyYWcuICBJZiB0aGUKLQkgc3ltYm9sIGlzIGF0IHRoZSBzdGFydCBvZiBhIGZyYWcsIGFuZCBpdCBpcyB0aGUgbmV4dCBmcmFnCi0JIHdpdGggYW55IGRhdGEgaW4gaXQgKHVzdWFsbHkgdGhpcyBpcyBqdXN0IHRoZSBuZXh0IGZyYWcsIGJ1dAotCSBhc3NlbWJsZXIgbGlzdGluZ3MgbWF5IGludHJvZHVjZSBlbXB0eSBmcmFncyksIHdlIG11c3QgdXNlCi0JIHdvcmQgbW9kZS4gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbCAmJiBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gMCkKLQl7Ci0JICBmcmFnUyAqc3RvcDsKLQkgIGZyYWdTICpsOwotCi0JICBzdG9wID0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKTsKLQkgIGZvciAobCA9IGZyYWdQLT5mcl9uZXh0OyBsICE9IHN0b3A7IGwgPSBsLT5mcl9uZXh0KQotCSAgICBpZiAobC0+ZnJfZml4ICsgbC0+ZnJfdmFyICE9IDApCi0JICAgICAgYnJlYWs7Ci0JICBpZiAobCA9PSBzdG9wKQotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFRBQlRZUEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSwgU0hPUlQpOwotCSAgICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9maXg7Ci19Ci0KLSNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCi0vKiB0aGUgYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QgcGxheXMgaGVsbAotICAgd2l0aCB0aGUgYnl0ZS1vcmRlciBwcm9ibGVtcyBvZiBjcm9zcy1hc3NlbWJseS4gIFNvIGFzIGEgaGFjaywKLSAgIEkgYWRkZWQgdGhpcyBtYWNoLiBkZXBlbmRlbnQgcmkgdHdpZGRsZXIuICBVZ2x5LCBidXQgaXQgZ2V0cwotICAgeW91IHRoZXJlLiAtS1dLICovCi0vKiBvbiBtNjhrOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZywgbmV4dCB0aHJlZSBieXRlcwotICAgYXJlIHN5bWJvbG51bSwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBMYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIHBjcmVsLCBiaXRzIDYgJiA1IGFzIGxlbmd0aCwgYml0IDQgYXMgcGNyZWwsIGFuZCB0aGUgbG93ZXIKLSAgIG5pYmJsZSBhcyBudXRoaW4uIChvbiBTdW4gMyBhdCBsZWFzdCkgKi8KLS8qIFRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbnRvIHRhcmdldC1zcGVjaWZpYwotICAgZm9ybWF0LiAqLwotI2lmZGVmIGNvbW1lbnQKLXZvaWQKLW1kX3JpX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpKQotICAgICBjaGFyICp0aGVfYnl0ZXM7Ci0gICAgIHN0cnVjdCByZWxvY19pbmZvX2dlbmVyaWMgKnJpOwotewotICAvKiB0aGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLT5yX2FkZHJlc3MsIDQpOwotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNF0gPSAocmktPnJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmktPnJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s2XSA9IHJpLT5yX3N5bWJvbG51bSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKChyaS0+cl9wY3JlbCA8PCA3KSAmIDB4ODApIHwgKChyaS0+cl9sZW5ndGggPDwgNSkgJiAweDYwKSB8Ci0JCSAgKChyaS0+cl9leHRlcm4gPDwgNCkgJiAweDEwKSk7Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICAvKgotICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCi0gICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCi0gICAqLwotCi0gIHN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoZml4UC0+ZnhfcGNyZWwgPDwgNykgJiAweDgwKSB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDUpICYgMHg2MCkgfAotCSAgICAgICgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgNCkgJiAweDEwKSk7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotQ09OU1QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDQ7Ci1DT05TVCBpbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA2OwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAyKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg2MDAwLCAyKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDIpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweDRFRjksIDIpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgICAgZml4X25ldyAoZnJhZywgKHB0ciArIDIpIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwgdG9fc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkgICAgICAgMCwgTk9fUkVMT0MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMik7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg2MGZmLCAyKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMiwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBEaWZmZXJlbnQgdmFsdWVzIG9mIE9LIHRlbGwgd2hhdCBpdHMgT0sgdG8gcmV0dXJuLiAgVGhpbmdzIHRoYXQKLSAgIGFyZW4ndCBPSyBhcmUgYW4gZXJyb3IgKHdoYXQgYSBzaG9jaywgbm8/KQotCi0gICAwOiAgRXZlcnl0aGluZyBpcyBPSwotICAgMTA6ICBBYnNvbHV0ZSAxOjgJb25seQotICAgMjA6ICBBYnNvbHV0ZSAwOjcJb25seQotICAgMzA6ICBhYnNvbHV0ZSAwOjE1CW9ubHkKLSAgIDQwOiAgQWJzb2x1dGUgMDozMQlvbmx5Ci0gICA1MDogIGFic29sdXRlIDA6MTI3CW9ubHkKLSAgIDU1OiAgYWJzb2x1dGUgLTY0OjYzICAgIG9ubHkKLSAgIDYwOiAgYWJzb2x1dGUgLTEyODoxMjcJb25seQotICAgNzA6ICBhYnNvbHV0ZSAwOjQwOTUJb25seQotICAgODA6ICBObyBiaWdudW1zCi0KLSAgICovCi0KLXN0YXRpYyBpbnQKLWdldF9udW0gKGV4cCwgb2spCi0gICAgIHN0cnVjdCBtNjhrX2V4cCAqZXhwOwotICAgICBpbnQgb2s7Ci17Ci0gIGlmIChleHAtPmV4cC5YX29wID09IE9fYWJzZW50KQotICAgIHsKLSAgICAgIC8qIERvIHRoZSBzYW1lIHRoaW5nIHRoZSBWQVggYXNtIGRvZXMgKi8KLSAgICAgIG9wIChleHApID0gT19jb25zdGFudDsKLSAgICAgIGFkZHMgKGV4cCkgPSAwOwotICAgICAgc3VicyAoZXhwKSA9IDA7Ci0gICAgICBvZmZzIChleHApID0gMDsKLSAgICAgIGlmIChvayA9PSAxMCkKLQl7Ci0JICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIikpOwotCSAgb2ZmcyAoZXhwKSA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZXhwLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHN3aXRjaCAob2spCi0JewotCWNhc2UgMTA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDEgfHwgb2ZmcyAoZXhwKSA+IDgpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIikpOwotCSAgICAgIG9mZnMgKGV4cCkgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDIwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiA3KQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSAzMDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gMTUpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDQwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiAzMikKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNTA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDEyNykKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNTU6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IC02NCB8fCBvZmZzIChleHApID4gNjMpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDYwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAtMTI4IHx8IG9mZnMgKGV4cCkgPiAxMjcpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDcwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiA0MDk1KQotCSAgICB7Ci0JICAgIG91dHJhbmdlOgotCSAgICAgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDAiKSk7Ci0JICAgICAgb2ZmcyAoZXhwKSA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChleHAtPmV4cC5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIGlmIChvZmZzIChleHApIDw9IDAJLyogZmxvbnVtICovCi0JICAmJiAob2sgPT0gODAJCS8qIG5vIGJpZ251bXMgKi8KLQkgICAgICB8fCAob2sgPiAxMAkvKiBzbWFsbC1pbnQgcmFuZ2VzIGluY2x1ZGluZyAwIG9rICovCi0JCSAgLyogSWYgd2UgaGF2ZSBhIGZsb251bSB6ZXJvLCBhIHplcm8gaW50ZWdlciBzaG91bGQKLQkJICAgICBkbyBhcyB3ZWxsIChlLmcuLCBpbiBtb3ZlcSkuICAqLwotCQkgICYmIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50ID09IDAKLQkJICAmJiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3dbMF0gPT0gMCkpKQotCXsKLQkgIC8qIEhBQ0shIFR1cm4gaXQgaW50byBhIGxvbmcgKi8KLQkgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzZdOwotCi0JICBnZW5fdG9fd29yZHMgKHdvcmRzLCAyLCA4TCk7CS8qIFRoZXNlIG51bWJlcnMgYXJlIG1hZ2ljISAqLwotCSAgb3AgKGV4cCkgPSBPX2NvbnN0YW50OwotCSAgYWRkcyAoZXhwKSA9IDA7Ci0JICBzdWJzIChleHApID0gMDsKLQkgIG9mZnMgKGV4cCkgPSB3b3Jkc1sxXSB8ICh3b3Jkc1swXSA8PCAxNik7Ci0JfQotICAgICAgZWxzZSBpZiAob2sgIT0gMCkKLQl7Ci0JICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7Ci0JICBhZGRzIChleHApID0gMDsKLQkgIHN1YnMgKGV4cCkgPSAwOwotCSAgb2ZmcyAoZXhwKSA9IChvayA9PSAxMCkgPyAxIDogMDsKLQkgIGFzX3dhcm4gKF8oIkNhbid0IGRlYWwgd2l0aCBleHByZXNzaW9uOyBkZWZhdWx0aW5nIHRvICVsZCIpLAotCQkgICBvZmZzIChleHApKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9rID49IDEwICYmIG9rIDw9IDcwKQotCXsKLQkgIG9wIChleHApID0gT19jb25zdGFudDsKLQkgIGFkZHMgKGV4cCkgPSAwOwotCSAgc3VicyAoZXhwKSA9IDA7Ci0JICBvZmZzIChleHApID0gKG9rID09IDEwKSA/IDEgOiAwOwotCSAgYXNfd2FybiAoXygiQ2FuJ3QgZGVhbCB3aXRoIGV4cHJlc3Npb247IGRlZmF1bHRpbmcgdG8gJWxkIiksCi0JCSAgIG9mZnMgKGV4cCkpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGV4cC0+c2l6ZSAhPSBTSVpFX1VOU1BFQykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGV4cC0+c2l6ZSkKLQl7Ci0JY2FzZSBTSVpFX1VOU1BFQzoKLQljYXNlIFNJWkVfTE9ORzoKLQkgIGJyZWFrOwotCWNhc2UgU0laRV9CWVRFOgotCSAgaWYgKCFpc2J5dGUgKG9mZnMgKGV4cCkpKQotCSAgICBhc193YXJuIChfKCJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIEJZVEUiKSk7Ci0JICBicmVhazsKLQljYXNlIFNJWkVfV09SRDoKLQkgIGlmICghaXN3b3JkIChvZmZzIChleHApKSkKLQkgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBXT1JEIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2ZmcyAoZXhwKTsKLX0KLQotLyogVGhlc2UgYXJlIHRoZSBiYWNrLWVuZHMgZm9yIHRoZSB2YXJpb3VzIG1hY2hpbmUgZGVwZW5kZW50IHBzZXVkby1vcHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19kYXRhMSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19kYXRhMiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDIpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBwdXR0aW5nIGZyYWdzIGluIHRoZSBCU1Mgc2VnbWVudCwgd2UgZmFrZSBpdAotICAgICBieSBtYXJraW5nIGluX2JzcywgdGhlbiBsb29raW5nIGF0IHNfc2tpcCBmb3IgY2x1ZXMuICAqLwotCi0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZXZlbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7Ci0KLSAgdGVtcCA9IDE7CQkJLyogSkYgc2hvdWxkIGJlIDI/ICovCi0gIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoIW5lZWRfcGFzc18yKQkJLyogTmV2ZXIgbWFrZSBmcmFnIGlmIGV4cGVjdCBleHRyYSBwYXNzLiAqLwotICAgIGZyYWdfYWxpZ24gKHRlbXAsIChpbnQpIHRlbXBfZmlsbCwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIHRlbXApOwotfQotCi1zdGF0aWMgdm9pZAotc19wcm9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQc2V1ZG8tb3BzIGhhbmRsZWQgZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBhcmd1bWVudCBpcyBhIGNvbmRpdGlvbmFsCi0gICBwc2V1ZG8tb3AuICBUaGlzIGlzIGNhbGxlZCB3aGVuIGNoZWNraW5nIHdoZXRoZXIgYSBwZW5kaW5nCi0gICBhbGlnbm1lbnQgaXMgbmVlZGVkLiAgKi8KLQotaW50Ci1tNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCi0gICAgIHBzZXVkb190eXBlUyAqcG9wOwotewotICByZXR1cm4gKHBvcC0+cG9jX2hhbmRsZXIgPT0gc19tcmlfaWYKLQkgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19tcmlfZWxzZSk7Ci19Ci0KLS8qIEhhbmRsZSBhbiBNUkkgc3R5bGUgY2hpcCBzcGVjaWZpY2F0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW1yaV9jaGlwICgpCi17Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgYzsKLSAgaW50IGk7Ci0KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgLyogV2UgY2FuJ3QgdXNlIGdldF9zeW1ib2xfZW5kIHNpbmNlIHRoZSBwcm9jZXNzb3IgbmFtZXMgYXJlIG5vdCBwcm9wZXIKLSAgICAgc3ltYm9scy4gICovCi0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspKQotICAgIDsKLSAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKLSAgICBpZiAoc3RyY2FzZWNtcCAocywgYXJjaHNbaV0ubmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotICBpZiAoaSA+PSBuX2FyY2hzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiJXM6IHVucmVjb2duaXplZCBwcm9jZXNzb3IgbmFtZSIpLCBzKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcvJykKLSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IDA7Ci0gIGVsc2UKLSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSAmPSBtNjg4ODEgfCBtNjg4NTE7Ci0gIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2hzW2ldLmFyY2g7Ci0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy8nKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIC8qIFdlIGNhbid0IHVzZSBnZXRfc3ltYm9sX2VuZCBzaW5jZSB0aGUgcHJvY2Vzc29yIG5hbWVzIGFyZSBub3QKLQkgcHJvcGVyIHN5bWJvbHMuICAqLwotICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykpCi0JOwotICAgICAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgICAgIGlmIChzdHJjbXAgKHMsICI2ODg4MSIpID09IDApCi0JY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiNjg4NTEiKSA9PSAwKQotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotICAvKiBVcGRhdGUgaW5mbyBhYm91dCBhdmFpbGFibGUgY29udHJvbCByZWdpc3RlcnMuICAqLwotICBzZWxlY3RfY29udHJvbF9yZWdzICgpOwotfQotCi0vKiBUaGUgTVJJIENISVAgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfY2hpcCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotICBtcmlfY2hpcCAoKTsKLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgTVJJIEZPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZm9wdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJJRD0iLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGludCB0ZW1wOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICh0ZW1wIDwgMCB8fCB0ZW1wID4gNykKLQlhc19iYWQgKF8oImJhZCBjb3Byb2Nlc3NvciBpZCIpKTsKLSAgICAgIGVsc2UKLQltNjhrX2Zsb2F0X2NvcG51bSA9IENPUDAgKyB0ZW1wOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5yZWNvZ25pemVkIGZvcHQgb3B0aW9uIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhhbmRsZSB0aGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdHJ1Y3Qgb3B0X2FjdGlvbgotewotICAvKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBOVUxMLCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbi4gIFRoZSBmaXJzdCBhcmd1bWVudAotICAgICBpcyB0aGUgQVJHIGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlLCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzCi0gICAgIHdoZXRoZXIgdGhlIG9wdGlvbiB3YXMgbmVnYXRlZC4gICovCi0gIHZvaWQgKCpwZm4pIFBBUkFNUyAoKGludCBhcmcsIGludCBvbikpOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IE5VTEwsIGFuZCB0aGUgUEZOIGZpZWxkIGlzIE5VTEwsIHNldCB0aGUgdmFyaWFibGUKLSAgICAgdGhpcyBwb2ludHMgdG8uICBTZXQgaXQgdG8gdGhlIEFSRyBmaWVsZCBpZiB0aGUgb3B0aW9uIHdhcyBub3QKLSAgICAgbmVnYXRlZCwgYW5kIHRoZSBOT1RBUkcgZmllbGQgb3RoZXJ3aXNlLiAgKi8KLSAgaW50ICpwdmFyOwotCi0gIC8qIFRoZSB2YWx1ZSB0byBwYXNzIHRvIFBGTiBvciB0byBhc3NpZ24gdG8gKlBWQVIuICAqLwotICBpbnQgYXJnOwotCi0gIC8qIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gKlBWQVIgaWYgdGhlIG9wdGlvbiBpcyBuZWdhdGVkLiAgSWYgUEZOIGlzCi0gICAgIE5VTEwsIGFuZCBQVkFSIGlzIG5vdCBOVUxMLCBhbmQgQVJHIGFuZCBOT1RBUkcgYXJlIHRoZSBzYW1lLCB0aGVuCi0gICAgIHRoZSBvcHRpb24gbWF5IG5vdCBiZSBuZWdhdGVkLiAgKi8KLSAgaW50IG5vdGFyZzsKLX07Ci0KLS8qIFRoZSB0YWJsZSB1c2VkIHRvIGhhbmRsZSB0aGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZCBza2lwX3RvX2NvbW1hIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfbmVzdCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3B0X2NoaXAgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9wdF9saXN0IFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfbGlzdF9zeW1ib2xzIFBBUkFNUyAoKGludCwgaW50KSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0X2FjdGlvbiBvcHRfdGFibGVbXSA9Ci17Ci0gIHsgImFic3BjYWRkIiwgMCwgJm02OGtfYWJzcGNhZGQsIDEsIDAgfSwKLQotICAvKiBXZSBkbyByZWxheGluZywgc28gdGhlcmUgaXMgbGl0dGxlIHVzZSBmb3IgdGhlc2Ugb3B0aW9ucy4gICovCi0gIHsgImIiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJycyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiYnJiIiwgMCwgMCwgMCwgMCB9LAotICB7ICJicmwiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJydyIsIDAsIDAsIDAsIDAgfSwKLQotICB7ICJjIiwgMCwgMCwgMCwgMCB9LAotICB7ICJjZXgiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImNhc2UiLCAwLCAmc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSwgMSwgMCB9LAotICB7ICJjbCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiY3JlIiwgMCwgMCwgMCwgMCB9LAotICB7ICJkIiwgMCwgJmZsYWdfa2VlcF9sb2NhbHMsIDEsIDAgfSwKLSAgeyAiZSIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiZiIsIDAsICZmbGFnX3Nob3J0X3JlZnMsIDEsIDAgfSwKLSAgeyAiZnJzIiwgMCwgJmZsYWdfc2hvcnRfcmVmcywgMSwgMCB9LAotICB7ICJmcmwiLCAwLCAmZmxhZ19zaG9ydF9yZWZzLCAwLCAxIH0sCi0gIHsgImciLCAwLCAwLCAwLCAwIH0sCi0gIHsgImkiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm0iLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm1leCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAibWMiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm1kIiwgMCwgMCwgMCwgMCB9LAotICB7ICJuZXN0Iiwgb3B0X25lc3QsIDAsIDAsIDAgfSwKLSAgeyAibmV4dCIsIHNraXBfdG9fY29tbWEsIDAsIDAsIDAgfSwKLSAgeyAibyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAib2xkIiwgMCwgMCwgMCwgMCB9LAotICB7ICJvcCIsIHNraXBfdG9fY29tbWEsIDAsIDAsIDAgfSwKLSAgeyAicGNvIiwgMCwgMCwgMCwgMCB9LAotICB7ICJwIiwgb3B0X2NoaXAsIDAsIDAsIDAgfSwKLSAgeyAicGNyIiwgMCwgMCwgMCwgMCB9LAotICB7ICJwY3MiLCAwLCAwLCAwLCAwIH0sCi0gIHsgInIiLCAwLCAwLCAwLCAwIH0sCi0gIHsgInF1aWNrIiwgMCwgJm02OGtfcXVpY2ssIDEsIDAgfSwKLSAgeyAicmVsMzIiLCAwLCAmbTY4a19yZWwzMiwgMSwgMCB9LAotICB7ICJzIiwgb3B0X2xpc3QsIDAsIDAsIDAgfSwKLSAgeyAidCIsIG9wdF9saXN0X3N5bWJvbHMsIDAsIDAsIDAgfSwKLSAgeyAidyIsIDAsICZmbGFnX25vX3dhcm5pbmdzLCAwLCAxIH0sCi0gIHsgIngiLCAwLCAwLCAwLCAwIH0KLX07Ci0KLSNkZWZpbmUgT1BUQ09VTlQgKHNpemVvZiBvcHRfdGFibGUgLyBzaXplb2Ygb3B0X3RhYmxlWzBdKQotCi0vKiBUaGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19vcHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZG8KLSAgICB7Ci0gICAgICBpbnQgdDsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyIGM7Ci0gICAgICBpbnQgaTsKLSAgICAgIGNvbnN0IHN0cnVjdCBvcHRfYWN0aW9uICpvOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIHQgPSAxOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgdCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIk5PIiwgMikgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIHQgPSAwOwotCX0KLQotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgZm9yIChpID0gMCwgbyA9IG9wdF90YWJsZTsgaSA8IE9QVENPVU5UOyBpKyssIG8rKykKLQl7Ci0JICBpZiAoc3RyY2FzZWNtcCAocywgby0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChvLT5wZm4pCi0JCXsKLQkJICAvKiBSZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlciBub3cgaW4gY2FzZSB0aGUgb3B0aW9uCi0JCSAgICAgdGFrZXMgYXJndW1lbnRzLiAgKi8KLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAoKm8tPnBmbikgKG8tPmFyZywgdCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvLT5wdmFyICE9IE5VTEwpCi0JCXsKLQkJICBpZiAoISB0ICYmIG8tPmFyZyA9PSBvLT5ub3RhcmcpCi0JCSAgICBhc19iYWQgKF8oIm9wdGlvbiBgJXMnIG1heSBub3QgYmUgbmVnYXRlZCIpLCBzKTsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAqby0+cHZhciA9IHQgPyBvLT5hcmcgOiBvLT5ub3Rhcmc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCSppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGkgPj0gT1BUQ09VTlQpCi0JewotCSAgYXNfYmFkIChfKCJvcHRpb24gYCVzJyBub3QgcmVjb2duaXplZCIpLCBzKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAvKiBNb3ZlIGJhY2sgdG8gdGVybWluYXRpbmcgY2hhcmFjdGVyLiAgKi8KLSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFNraXAgYWhlYWQgdG8gYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgT1BUIG9wdGlvbnMgd2hpY2ggd2UgZG8KLSAgIG5vdCBzdXBwb3IgdGFuZCB3aGljaCB0YWtlIGFyZ3VtZW50cy4gICovCi0KLXN0YXRpYyB2b2lkCi1za2lwX3RvX2NvbW1hIChhcmcsIG9uKQotICAgICBpbnQgYXJnOwotICAgICBpbnQgb247Ci17Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJwotCSAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotLyogSGFuZGxlIHRoZSBPUFQgTkVTVD1kZXB0aCBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X25lc3QgKGFyZywgb24pCi0gICAgIGludCBhcmc7Ci0gICAgIGludCBvbjsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIGZvcm1hdCBvZiBPUFQgTkVTVD1kZXB0aCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG1heF9tYWNyb19uZXN0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIFA9Y2hpcCBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X2NoaXAgKGFyZywgb24pCi0gICAgIGludCBhcmc7Ci0gICAgIGludCBvbjsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMganVzdCBPUFQgUCwgd2hpY2ggd2UgZG8gbm90IHN1cHBvcnQuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgbXJpX2NoaXAgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIFMgb3B0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wdF9saXN0IChhcmcsIG9uKQotICAgICBpbnQgYXJnOwotICAgICBpbnQgb247Ci17Ci0gIGxpc3RpbmdfbGlzdCAob24pOwotfQotCi0vKiBIYW5kbGUgdGhlIE9QVCBUIG9wdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vcHRfbGlzdF9zeW1ib2xzIChhcmcsIG9uKQotICAgICBpbnQgYXJnOwotICAgICBpbnQgb247Ci17Ci0gIGlmIChvbikKLSAgICBsaXN0aW5nIHw9IExJU1RJTkdfU1lNQk9MUzsKLSAgZWxzZQotICAgIGxpc3RpbmcgJj1+IExJU1RJTkdfU1lNQk9MUzsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgUkVHIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3JlZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpzOwotICBpbnQgYzsKLSAgc3RydWN0IG02OGtfb3Agcm9wOwotICBpbnQgbWFzazsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGxpbmVfbGFiZWwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgbGFiZWwiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gUkVHSVNURVJfUFJFRklYCi0jZW5kaWYKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLycKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotICBpZiAobTY4a19pcF9vcCAocywgJnJvcCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAocm9wLmVycm9yID09IE5VTEwpCi0JYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImJhZCByZWdpc3RlciBsaXN0OiAlcyIpLCByb3AuZXJyb3IpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAocm9wLm1vZGUgPT0gUkVHTFNUKQotICAgIG1hc2sgPSByb3AubWFzazsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gRFJFRykKLSAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIERBVEEwKTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQVJFRykKLSAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIEFERFIwICsgOCk7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IEZQUkVHKQotICAgIG1hc2sgPSAxIDw8IChyb3AucmVnIC0gRlAwICsgMTYpOwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBDT05UUk9MCi0JICAgJiYgcm9wLnJlZyA9PSBGUEkpCi0gICAgbWFzayA9IDEgPDwgMjQ7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IENPTlRST0wKLQkgICAmJiByb3AucmVnID09IEZQUykKLSAgICBtYXNrID0gMSA8PCAyNTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQ09OVFJPTAotCSAgICYmIHJvcC5yZWcgPT0gRlBDKQotICAgIG1hc2sgPSAxIDw8IDI2OwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHJlZ19zZWN0aW9uKTsKLSAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIH5tYXNrKTsKLSAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgTVJJIFNBVkUgYW5kIFJFU1RPUkUgcHNldWRvLW9wcy4gICovCi0KLXN0cnVjdCBzYXZlX29wdHMKLXsKLSAgc3RydWN0IHNhdmVfb3B0cyAqbmV4dDsKLSAgaW50IGFic3BjYWRkOwotICBpbnQgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLSAgaW50IGtlZXBfbG9jYWxzOwotICBpbnQgc2hvcnRfcmVmczsKLSAgaW50IGFyY2hpdGVjdHVyZTsKLSAgaW50IHF1aWNrOwotICBpbnQgcmVsMzI7Ci0gIGludCBsaXN0aW5nOwotICBpbnQgbm9fd2FybmluZ3M7Ci0gIC8qIEZJWE1FOiBXZSBkb24ndCBzYXZlIE9QVCBTLiAgKi8KLX07Ci0KLS8qIFRoaXMgdmFyaWFibGUgaG9sZHMgdGhlIHN0YWNrIG9mIHNhdmVkIG9wdGlvbnMuICAqLwotCi1zdGF0aWMgc3RydWN0IHNhdmVfb3B0cyAqc2F2ZV9zdGFjazsKLQotLyogVGhlIE1SSSBTQVZFIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3NhdmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3RydWN0IHNhdmVfb3B0cyAqczsKLQotICBzID0gKHN0cnVjdCBzYXZlX29wdHMgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2F2ZV9vcHRzKSk7Ci0gIHMtPmFic3BjYWRkID0gbTY4a19hYnNwY2FkZDsKLSAgcy0+c3ltYm9sc19jYXNlX3NlbnNpdGl2ZSA9IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7Ci0gIHMtPmtlZXBfbG9jYWxzID0gZmxhZ19rZWVwX2xvY2FsczsKLSAgcy0+c2hvcnRfcmVmcyA9IGZsYWdfc2hvcnRfcmVmczsKLSAgcy0+YXJjaGl0ZWN0dXJlID0gY3VycmVudF9hcmNoaXRlY3R1cmU7Ci0gIHMtPnF1aWNrID0gbTY4a19xdWljazsKLSAgcy0+cmVsMzIgPSBtNjhrX3JlbDMyOwotICBzLT5saXN0aW5nID0gbGlzdGluZzsKLSAgcy0+bm9fd2FybmluZ3MgPSBmbGFnX25vX3dhcm5pbmdzOwotCi0gIHMtPm5leHQgPSBzYXZlX3N0YWNrOwotICBzYXZlX3N0YWNrID0gczsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgTVJJIFJFU1RPUkUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfcmVzdG9yZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzdHJ1Y3Qgc2F2ZV9vcHRzICpzOwotCi0gIGlmIChzYXZlX3N0YWNrID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJyZXN0b3JlIHdpdGhvdXQgc2F2ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHMgPSBzYXZlX3N0YWNrOwotICBzYXZlX3N0YWNrID0gcy0+bmV4dDsKLQotICBtNjhrX2Fic3BjYWRkID0gcy0+YWJzcGNhZGQ7Ci0gIHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUgPSBzLT5zeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOwotICBmbGFnX2tlZXBfbG9jYWxzID0gcy0+a2VlcF9sb2NhbHM7Ci0gIGZsYWdfc2hvcnRfcmVmcyA9IHMtPnNob3J0X3JlZnM7Ci0gIGN1cnJlbnRfYXJjaGl0ZWN0dXJlID0gcy0+YXJjaGl0ZWN0dXJlOwotICBtNjhrX3F1aWNrID0gcy0+cXVpY2s7Ci0gIG02OGtfcmVsMzIgPSBzLT5yZWwzMjsKLSAgbGlzdGluZyA9IHMtPmxpc3Rpbmc7Ci0gIGZsYWdfbm9fd2FybmluZ3MgPSBzLT5ub193YXJuaW5nczsKLQotICBmcmVlIChzKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUeXBlcyBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLwotCi1lbnVtIG1yaV9jb250cm9sX3R5cGUKLXsKLSAgbXJpX2ZvciwKLSAgbXJpX2lmLAotICBtcmlfcmVwZWF0LAotICBtcmlfd2hpbGUKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RhY2sgdGhlIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wKLSAgIGRpcmVjdGl2ZXMuICAqLwotCi1zdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbwotewotICAvKiBUaGUgZGlyZWN0aXZlIHdpdGhpbiB3aGljaCB0aGlzIG9uZSBpcyBlbmNsb3NlZC4gICovCi0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpvdXRlcjsKLQotICAvKiBUaGUgdHlwZSBvZiBkaXJlY3RpdmUuICAqLwotICBlbnVtIG1yaV9jb250cm9sX3R5cGUgdHlwZTsKLQotICAvKiBXaGV0aGVyIGFuIEVMU0UgaGFzIGJlZW4gaW4gYW4gSUYuICAqLwotICBpbnQgZWxzZV9zZWVuOwotCi0gIC8qIFRoZSBhZGQgb3Igc3ViIHN0YXRlbWVudCBhdCB0aGUgZW5kIG9mIGEgRk9SLiAgKi8KLSAgY2hhciAqaW5jcjsKLQotICAvKiBUaGUgbGFiZWwgb2YgdGhlIHRvcCBvZiBhIEZPUiBvciBSRVBFQVQgbG9vcC4gICovCi0gIGNoYXIgKnRvcDsKLQotICAvKiBUaGUgbGFiZWwgdG8ganVtcCB0byBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLCBvciB0aGUgZWxzZQotICAgICBleHByZXNzaW9uIG9mIGEgY29uZGl0aW9uYWwuICAqLwotICBjaGFyICpuZXh0OwotCi0gIC8qIFRoZSBsYWJlbCB0byBqdW1wIHRvIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgb3IgdGhlIGxhYmVsIHBhc3QKLSAgICAgdGhlIGVuZCBvZiBhIGNvbmRpdGlvbmFsLiAgKi8KLSAgY2hhciAqYm90dG9tOwotfTsKLQotLyogVGhlIHN0YWNrIG9mIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbXJpX2NvbnRyb2xfc3RhY2s7Ci0KLS8qIFRoZSBjdXJyZW50IE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIGluZGV4IG51bWJlciwgdXNlZCB0bwotICAgZ2VuZXJhdGUgbGFiZWwgbmFtZXMuICAqLwotCi1zdGF0aWMgaW50IG1yaV9jb250cm9sX2luZGV4OwotCi0vKiBTb21lIGZ1bmN0aW9uIHByb3RvdHlwZXMuICAqLwotCi1zdGF0aWMgdm9pZCBtcmlfYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgY2hhciAqbXJpX2NvbnRyb2xfbGFiZWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpwdXNoX21yaV9jb250cm9sCi0gIFBBUkFNUyAoKGVudW0gbXJpX2NvbnRyb2xfdHlwZSkpOwotc3RhdGljIHZvaWQgcG9wX21yaV9jb250cm9sIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcGFyc2VfbXJpX2NvbmRpdGlvbiBQQVJBTVMgKChpbnQgKikpOwotc3RhdGljIGludCBwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kCi0gIFBBUkFNUyAoKGludCAqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHN3YXBfbXJpX2NvbmRpdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgcmV2ZXJzZV9tcmlfY29uZGl0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZAotICBQQVJBTVMgKChpbnQsIGludCwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24KLSAgUEFSQU1TICgoY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotLyogQXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gZm9yIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1yaV9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgLyogbWRfYXNzZW1ibGUgZXhwZWN0cyB0aGUgb3Bjb2RlIHRvIGJlIGluIGxvd2VyIGNhc2UuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICcgJyAmJiAqcyAhPSAnXDAnOyBzKyspCi0gICAgewotICAgICAgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JKnMgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMpOwotICAgIH0KLQotICBtZF9hc3NlbWJsZSAoc3RyKTsKLX0KLQotLyogR2VuZXJhdGUgYSBuZXcgTVJJIGxhYmVsIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUgbGFiZWwgbmFtZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLW1yaV9jb250cm9sX2xhYmVsICgpCi17Ci0gIGNoYXIgKm47Ci0KLSAgbiA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgc3ByaW50ZiAobiwgIiVzbWMlZCIsIEZBS0VfTEFCRUxfTkFNRSwgbXJpX2NvbnRyb2xfaW5kZXgpOwotICArK21yaV9jb250cm9sX2luZGV4OwotICByZXR1cm4gbjsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICoKLXB1c2hfbXJpX2NvbnRyb2wgKHR5cGUpCi0gICAgIGVudW0gbXJpX2NvbnRyb2xfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICBuID0gKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG1yaV9jb250cm9sX2luZm8pKTsKLQotICBuLT50eXBlID0gdHlwZTsKLSAgbi0+ZWxzZV9zZWVuID0gMDsKLSAgaWYgKHR5cGUgPT0gbXJpX2lmIHx8IHR5cGUgPT0gbXJpX3doaWxlKQotICAgIG4tPnRvcCA9IE5VTEw7Ci0gIGVsc2UKLSAgICBuLT50b3AgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLSAgbi0+bmV4dCA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotICBuLT5ib3R0b20gPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLQotICBuLT5vdXRlciA9IG1yaV9jb250cm9sX3N0YWNrOwotICBtcmlfY29udHJvbF9zdGFjayA9IG47Ci0KLSAgcmV0dXJuIG47Ci19Ci0KLS8qIFBvcCBvZmYgdGhlIHN0YWNrIG9mIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wb3BfbXJpX2NvbnRyb2wgKCkKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgbiA9IG1yaV9jb250cm9sX3N0YWNrOwotICBtcmlfY29udHJvbF9zdGFjayA9IG4tPm91dGVyOwotICBpZiAobi0+dG9wICE9IE5VTEwpCi0gICAgZnJlZSAobi0+dG9wKTsKLSAgZnJlZSAobi0+bmV4dCk7Ci0gIGZyZWUgKG4tPmJvdHRvbSk7Ci0gIGZyZWUgKG4pOwotfQotCi0vKiBSZWNvZ25pemUgYSBjb25kaXRpb24gY29kZSBpbiBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9tcmlfY29uZGl0aW9uIChwY2MpCi0gICAgIGludCAqcGNjOwotewotICBjaGFyIGMxLCBjMjsKLQotICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc8Jyk7Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMxID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICBjMiA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmIChpc3VwcGVyIChjMSkpCi0gICAgYzEgPSB0b2xvd2VyIChjMSk7Ci0gIGlmIChpc3VwcGVyIChjMikpCi0gICAgYzIgPSB0b2xvd2VyIChjMik7Ci0KLSAgKnBjYyA9IChjMSA8PCA4KSB8IGMyOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBhIHNpbmdsZSBvcGVyYW5kIGluIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKHBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwgcmlnaHRzdG9wKQotICAgICBpbnQgKnBjYzsKLSAgICAgY2hhciAqKmxlZnRzdGFydDsKLSAgICAgY2hhciAqKmxlZnRzdG9wOwotICAgICBjaGFyICoqcmlnaHRzdGFydDsKLSAgICAgY2hhciAqKnJpZ2h0c3RvcDsKLXsKLSAgY2hhciAqczsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgKnBjYyA9IC0xOwotICAqbGVmdHN0YXJ0ID0gTlVMTDsKLSAgKmxlZnRzdG9wID0gTlVMTDsKLSAgKnJpZ2h0c3RhcnQgPSBOVUxMOwotICAqcmlnaHRzdG9wID0gTlVMTDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPCcpCi0gICAgewotICAgICAgLyogSXQncyBqdXN0IGEgY29uZGl0aW9uIGNvZGUuICAqLwotICAgICAgcmV0dXJuIHBhcnNlX21yaV9jb25kaXRpb24gKHBjYyk7Ci0gICAgfQotCi0gIC8qIExvb2sgYWhlYWQgZm9yIHRoZSBjb25kaXRpb24gY29kZS4gICovCi0gIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgKnMgIT0gJ1wwJzsgKytzKQotICAgIHsKLSAgICAgIGlmICgqcyA9PSAnPCcgJiYgc1sxXSAhPSAnXDAnICYmIHNbMl0gIT0gJ1wwJyAmJiBzWzNdID09ICc+JykKLQlicmVhazsKLSAgICB9Ci0gIGlmICgqcyA9PSAnXDAnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBjb25kaXRpb24gY29kZSBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICpsZWZ0c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpsZWZ0c3RvcCA9IHM7Ci0gIGlmICgqbGVmdHN0b3AgPiAqbGVmdHN0YXJ0Ci0gICAgICAmJiAoKCpsZWZ0c3RvcClbLTFdID09ICcgJyB8fCAoKmxlZnRzdG9wKVstMV0gPT0gJ1x0JykpCi0gICAgLS0qbGVmdHN0b3A7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgaWYgKCEgcGFyc2VfbXJpX2NvbmRpdGlvbiAocGNjKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBMb29rIGFoZWFkIGZvciBBTkQgb3IgT1Igb3IgZW5kIG9mIGxpbmUuICAqLwotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICpzICE9ICdcMCc7ICsrcykKLSAgICB7Ci0gICAgICBpZiAoKHN0cm5jYXNlY21wIChzLCAiQU5EIiwgMykgPT0gMAotCSAgICYmIChzWzNdID09ICcuJyB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoc1szXSkpKQotCSAgfHwgKHN0cm5jYXNlY21wIChzLCAiT1IiLCAyKSA9PSAwCi0JICAgICAgJiYgKHNbMl0gPT0gJy4nIHx8ICEgaXNfcGFydF9vZl9uYW1lIChzWzJdKSkpKQotCWJyZWFrOwotICAgIH0KLQotICAqcmlnaHRzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnJpZ2h0c3RvcCA9IHM7Ci0gIGlmICgqcmlnaHRzdG9wID4gKnJpZ2h0c3RhcnQKLSAgICAgICYmICgoKnJpZ2h0c3RvcClbLTFdID09ICcgJyB8fCAoKnJpZ2h0c3RvcClbLTFdID09ICdcdCcpKQotICAgIC0tKnJpZ2h0c3RvcDsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCi0gIHJldHVybiAxOwotfQotCi0jZGVmaW5lIE1DQyhiMSwgYjIpICgoKGIxKSA8PCA4KSB8IChiMikpCi0KLS8qIFN3YXAgdGhlIHNlbnNlIG9mIGEgY29uZGl0aW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBjb25kaXRpb24gc28gdGhhdAotICAgaXQgZ2VuZXJhdGVzIHRoZSBzYW1lIHJlc3VsdCB3aGVuIHRoZSBvcGVyYW5kcyBhcmUgc3dhcHBlZC4gICovCi0KLXN0YXRpYyBpbnQKLXN3YXBfbXJpX2NvbmRpdGlvbiAoY2MpCi0gICAgIGludCBjYzsKLXsKLSAgc3dpdGNoIChjYykKLSAgICB7Ci0gICAgY2FzZSBNQ0MgKCdoJywgJ2knKTogcmV0dXJuIE1DQyAoJ2MnLCAncycpOwotICAgIGNhc2UgTUNDICgnbCcsICdzJyk6IHJldHVybiBNQ0MgKCdjJywgJ2MnKTsKLSAgICBjYXNlIE1DQyAoJ2MnLCAnYycpOiByZXR1cm4gTUNDICgnbCcsICdzJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ3MnKTogcmV0dXJuIE1DQyAoJ2gnLCAnaScpOwotICAgIGNhc2UgTUNDICgncCcsICdsJyk6IHJldHVybiBNQ0MgKCdtJywgJ2knKTsKLSAgICBjYXNlIE1DQyAoJ20nLCAnaScpOiByZXR1cm4gTUNDICgncCcsICdsJyk7Ci0gICAgY2FzZSBNQ0MgKCdnJywgJ2UnKTogcmV0dXJuIE1DQyAoJ2wnLCAnZScpOwotICAgIGNhc2UgTUNDICgnbCcsICd0Jyk6IHJldHVybiBNQ0MgKCdnJywgJ3QnKTsKLSAgICBjYXNlIE1DQyAoJ2cnLCAndCcpOiByZXR1cm4gTUNDICgnbCcsICd0Jyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ2UnKTogcmV0dXJuIE1DQyAoJ2cnLCAnZScpOwotICAgIH0KLSAgcmV0dXJuIGNjOwotfQotCi0vKiBSZXZlcnNlIHRoZSBzZW5zZSBvZiBhIGNvbmRpdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXJldmVyc2VfbXJpX2NvbmRpdGlvbiAoY2MpCi0gICAgIGludCBjYzsKLXsKLSAgc3dpdGNoIChjYykKLSAgICB7Ci0gICAgY2FzZSBNQ0MgKCdoJywgJ2knKTogcmV0dXJuIE1DQyAoJ2wnLCAncycpOwotICAgIGNhc2UgTUNDICgnbCcsICdzJyk6IHJldHVybiBNQ0MgKCdoJywgJ2knKTsKLSAgICBjYXNlIE1DQyAoJ2MnLCAnYycpOiByZXR1cm4gTUNDICgnYycsICdzJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ3MnKTogcmV0dXJuIE1DQyAoJ2MnLCAnYycpOwotICAgIGNhc2UgTUNDICgnbicsICdlJyk6IHJldHVybiBNQ0MgKCdlJywgJ3EnKTsKLSAgICBjYXNlIE1DQyAoJ2UnLCAncScpOiByZXR1cm4gTUNDICgnbicsICdlJyk7Ci0gICAgY2FzZSBNQ0MgKCd2JywgJ2MnKTogcmV0dXJuIE1DQyAoJ3YnLCAncycpOwotICAgIGNhc2UgTUNDICgndicsICdzJyk6IHJldHVybiBNQ0MgKCd2JywgJ2MnKTsKLSAgICBjYXNlIE1DQyAoJ3AnLCAnbCcpOiByZXR1cm4gTUNDICgnbScsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdtJywgJ2knKTogcmV0dXJuIE1DQyAoJ3AnLCAnbCcpOwotICAgIGNhc2UgTUNDICgnZycsICdlJyk6IHJldHVybiBNQ0MgKCdsJywgJ3QnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAndCcpOiByZXR1cm4gTUNDICgnZycsICdlJyk7Ci0gICAgY2FzZSBNQ0MgKCdnJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2wnLCAnZScpOwotICAgIGNhc2UgTUNDICgnbCcsICdlJyk6IHJldHVybiBNQ0MgKCdnJywgJ3QnKTsKLSAgICB9Ci0gIHJldHVybiBjYzsKLX0KLQotLyogQnVpbGQgYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBleHByZXNzaW9uLiAgVGhpcyBnZW5lcmF0ZXMgdGVzdAotICAgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuICBJdCBnb2VzIHRvIFRSVUVMQUIgaWYgdGhlIGNvbmRpdGlvbiBpcwotICAgdHJ1ZSwgYW5kIHRvIEZBTFNFTEFCIGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuICBFeGFjdGx5IG9uZSBvZgotICAgVFJVRUxBQiBhbmQgRkFMU0VMQUIgd2lsbCBiZSBOVUxMLCBtZWFuaW5nIHRvIGZhbGwgdGhyb3VnaC4gIFFVQUwKLSAgIGlzIHRoZSBzaXplIHF1YWxpZmllciBmb3IgdGhlIGV4cHJlc3Npb24uICBFWFRFTlQgaXMgdGhlIHNpemUgdG8KLSAgIHVzZSBmb3IgdGhlIGJyYW5jaC4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCSAgIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCkKLSAgICAgaW50IHF1YWw7Ci0gICAgIGludCBjYzsKLSAgICAgY2hhciAqbGVmdHN0YXJ0OwotICAgICBjaGFyICpsZWZ0c3RvcDsKLSAgICAgY2hhciAqcmlnaHRzdGFydDsKLSAgICAgY2hhciAqcmlnaHRzdG9wOwotICAgICBjb25zdCBjaGFyICp0cnVlbGFiOwotICAgICBjb25zdCBjaGFyICpmYWxzZWxhYjsKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgY2hhciAqYnVmOwotICBjaGFyICpzOwotCi0gIGlmIChsZWZ0c3RhcnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbTY4a19vcCBsZWZ0b3AsIHJpZ2h0b3A7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIC8qIFN3YXAgdGhlIGNvbXBhcmUgb3BlcmFuZHMsIGlmIG5lY2Vzc2FyeSwgdG8gcHJvZHVjZSBhIGxlZ2FsCi0JIG02OGsgY29tcGFyZSBpbnN0cnVjdGlvbi4gIENvbXBhcmluZyBhIHJlZ2lzdGVyIG9wZXJhbmQgd2l0aAotCSBhIG5vbi1yZWdpc3RlciBvcGVyYW5kIHJlcXVpcmVzIHRoZSByZWdpc3RlciB0byBiZSBvbiB0aGUKLQkgcmlnaHQgKGNtcCwgY21wYSkuICBDb21wYXJpbmcgYW4gaW1tZWRpYXRlIHZhbHVlIHdpdGgKLQkgYW55dGhpbmcgcmVxdWlyZXMgdGhlIGltbWVkaWF0ZSB2YWx1ZSB0byBiZSBvbiB0aGUgbGVmdAotCSAoY21waSkuICAqLwotCi0gICAgICBjID0gKmxlZnRzdG9wOwotICAgICAgKmxlZnRzdG9wID0gJ1wwJzsKLSAgICAgICh2b2lkKSBtNjhrX2lwX29wIChsZWZ0c3RhcnQsICZsZWZ0b3ApOwotICAgICAgKmxlZnRzdG9wID0gYzsKLQotICAgICAgYyA9ICpyaWdodHN0b3A7Ci0gICAgICAqcmlnaHRzdG9wID0gJ1wwJzsKLSAgICAgICh2b2lkKSBtNjhrX2lwX29wIChyaWdodHN0YXJ0LCAmcmlnaHRvcCk7Ci0gICAgICAqcmlnaHRzdG9wID0gYzsKLQotICAgICAgaWYgKHJpZ2h0b3AubW9kZSA9PSBJTU1FRAotCSAgfHwgKChsZWZ0b3AubW9kZSA9PSBEUkVHIHx8IGxlZnRvcC5tb2RlID09IEFSRUcpCi0JICAgICAgJiYgKHJpZ2h0b3AubW9kZSAhPSBEUkVHICYmIHJpZ2h0b3AubW9kZSAhPSBBUkVHKSkpCi0JewotCSAgY2hhciAqdGVtcDsKLQotCSAgY2MgPSBzd2FwX21yaV9jb25kaXRpb24gKGNjKTsKLQkgIHRlbXAgPSBsZWZ0c3RhcnQ7Ci0JICBsZWZ0c3RhcnQgPSByaWdodHN0YXJ0OwotCSAgcmlnaHRzdGFydCA9IHRlbXA7Ci0JICB0ZW1wID0gbGVmdHN0b3A7Ci0JICBsZWZ0c3RvcCA9IHJpZ2h0c3RvcDsKLQkgIHJpZ2h0c3RvcCA9IHRlbXA7Ci0JfQotICAgIH0KLQotICBpZiAodHJ1ZWxhYiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNjID0gcmV2ZXJzZV9tcmlfY29uZGl0aW9uIChjYyk7Ci0gICAgICB0cnVlbGFiID0gZmFsc2VsYWI7Ci0gICAgfQotICAgICAgCi0gIGlmIChsZWZ0c3RhcnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMAotCQkJICAgICAgKyAobGVmdHN0b3AgLSBsZWZ0c3RhcnQpCi0JCQkgICAgICArIChyaWdodHN0b3AgLSByaWdodHN0YXJ0KSk7Ci0gICAgICBzID0gYnVmOwotICAgICAgKnMrKyA9ICdjJzsKLSAgICAgICpzKysgPSAnbSc7Ci0gICAgICAqcysrID0gJ3AnOwotICAgICAgaWYgKHF1YWwgIT0gJ1wwJykKLQkqcysrID0gcXVhbDsKLSAgICAgICpzKysgPSAnICc7Ci0gICAgICBtZW1jcHkgKHMsIGxlZnRzdGFydCwgbGVmdHN0b3AgLSBsZWZ0c3RhcnQpOwotICAgICAgcyArPSBsZWZ0c3RvcCAtIGxlZnRzdGFydDsKLSAgICAgICpzKysgPSAnLCc7Ci0gICAgICBtZW1jcHkgKHMsIHJpZ2h0c3RhcnQsIHJpZ2h0c3RvcCAtIHJpZ2h0c3RhcnQpOwotICAgICAgcyArPSByaWdodHN0b3AgLSByaWdodHN0YXJ0OwotICAgICAgKnMgPSAnXDAnOwotICAgICAgbXJpX2Fzc2VtYmxlIChidWYpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICB9Ci0gICAgICAKLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKHRydWVsYWIpKTsKLSAgcyA9IGJ1ZjsKLSAgKnMrKyA9ICdiJzsKLSAgKnMrKyA9IGNjID4+IDg7Ci0gICpzKysgPSBjYyAmIDB4ZmY7Ci0gIGlmIChleHRlbnQgIT0gJ1wwJykKLSAgICAqcysrID0gZXh0ZW50OwotICAqcysrID0gJyAnOwotICBzdHJjcHkgKHMsIHRydWVsYWIpOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci19Ci0KLS8qIFBhcnNlIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gIFRoaXMgZ2VuZXJhdGVzIHRlc3QKLSAgIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgU1RPUCBpcyB3aGVyZSB0aGUgZXhwcmVzc2lvbiBlbmRzLiAgSXQKLSAgIGdvZXMgdG8gVFJVRUxBQiBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIGFuZCB0byBGQUxTRUxBQiBpZiB0aGUKLSAgIGNvbmRpdGlvbiBpcyBmYWxzZS4gIEV4YWN0bHkgb25lIG9mIFRSVUVMQUIgYW5kIEZBTFNFTEFCIHdpbGwgYmUKLSAgIE5VTEwsIG1lYW5pbmcgdG8gZmFsbCB0aHJvdWdoLiAgUVVBTCBpcyB0aGUgc2l6ZSBxdWFsaWZpZXIgZm9yIHRoZQotICAgZXhwcmVzc2lvbi4gIEVYVEVOVCBpcyB0aGUgc2l6ZSB0byB1c2UgZm9yIHRoZSBicmFuY2guICAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAoc3RvcCwgcXVhbCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCkKLSAgICAgY2hhciAqc3RvcDsKLSAgICAgaW50IHF1YWw7Ci0gICAgIGNvbnN0IGNoYXIgKnRydWVsYWI7Ci0gICAgIGNvbnN0IGNoYXIgKmZhbHNlbGFiOwotICAgICBpbnQgZXh0ZW50OwotewotICBpbnQgYzsKLSAgaW50IGNjOwotICBjaGFyICpsZWZ0c3RhcnQ7Ci0gIGNoYXIgKmxlZnRzdG9wOwotICBjaGFyICpyaWdodHN0YXJ0OwotICBjaGFyICpyaWdodHN0b3A7Ci0KLSAgYyA9ICpzdG9wOwotICAqc3RvcCA9ICdcMCc7Ci0KLSAgaWYgKCEgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAoJmNjLCAmbGVmdHN0YXJ0LCAmbGVmdHN0b3AsCi0JCQkJICAgJnJpZ2h0c3RhcnQsICZyaWdodHN0b3ApKQotICAgIHsKLSAgICAgICpzdG9wID0gYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJBTkQiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZsYWI7Ci0KLSAgICAgIGlmIChmYWxzZWxhYiAhPSBOVUxMKQotCWZsYWIgPSBmYWxzZWxhYjsKLSAgICAgIGVsc2UKLQlmbGFiID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0KLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIChjb25zdCBjaGFyICopIE5VTEwsIGZsYWIsIGV4dGVudCk7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJy4nCi0JICB8fCBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wwJykKLQlxdWFsID0gJ1wwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICBxdWFsID0gaW5wdXRfbGluZV9wb2ludGVyWzFdOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JfQotCi0gICAgICBpZiAoISBwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kICgmY2MsICZsZWZ0c3RhcnQsICZsZWZ0c3RvcCwKLQkJCQkgICAgICAgJnJpZ2h0c3RhcnQsICZyaWdodHN0b3ApKQotCXsKLQkgICpzdG9wID0gYzsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpOwotCi0gICAgICBpZiAoZmFsc2VsYWIgPT0gTlVMTCkKLQljb2xvbiAoZmxhYik7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiT1IiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnRsYWI7Ci0KLSAgICAgIGlmICh0cnVlbGFiICE9IE5VTEwpCi0JdGxhYiA9IHRydWVsYWI7Ci0gICAgICBlbHNlCi0JdGxhYiA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCB0bGFiLCAoY29uc3QgY2hhciAqKSBOVUxMLCBleHRlbnQpOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcuJwotCSAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcMCcpCi0JcXVhbCA9ICdcMCc7Ci0gICAgICBlbHNlCi0JewotCSAgcXVhbCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCX0KLQotICAgICAgaWYgKCEgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAoJmNjLCAmbGVmdHN0YXJ0LCAmbGVmdHN0b3AsCi0JCQkJICAgICAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKLQl7Ci0JICAqc3RvcCA9IGM7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KTsKLQotICAgICAgaWYgKHRydWVsYWIgPT0gTlVMTCkKLQljb2xvbiAodGxhYik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCk7Ci0gICAgfQotCi0gICpzdG9wID0gYzsKLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlciAhPSBzdG9wKQotICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiKSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIElGIHBzZXVkby1vcC4gIFRoaXMgbWF5IGJlIGEgc3RydWN0dXJlZCBjb250cm9sCi0gICBkaXJlY3RpdmUsIG9yIGl0IG1heSBiZSBhIHJlZ3VsYXIgYXNzZW1ibGVyIGNvbmRpdGlvbmFsLCBkZXBlbmRpbmcKLSAgIG9uIGl0cyBvcGVyYW5kcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9pZiAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBjOwotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICAvKiBBIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUgbXVzdCBlbmQgd2l0aCBUSEVOIHdpdGggYW4KLSAgICAgb3B0aW9uYWwgcXVhbGlmaWVyLiAgKi8KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXQotCSAmJiAoISBmbGFnX21yaSB8fCAqcyAhPSAnKicpKQotICAgICsrczsKLSAgLS1zOwotICB3aGlsZSAocyA+IGlucHV0X2xpbmVfcG9pbnRlciAmJiAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpKQotICAgIC0tczsKLQotICBpZiAocyAtIGlucHV0X2xpbmVfcG9pbnRlciA+IDEKLSAgICAgICYmIHNbLTFdID09ICcuJykKLSAgICBzIC09IDI7Ci0KLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPCAzCi0gICAgICB8fCBzdHJuY2FzZWNtcCAocyAtIDMsICJUSEVOIiwgNCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAocXVhbCAhPSAnXDAnKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyB0aGVuIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIEl0J3MgYSBjb25kaXRpb25hbC4gICovCi0gICAgICBzX2lmIChPX25lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogU2luY2UgdGhpcyBtaWdodCBiZSBhIGNvbmRpdGlvbmFsIGlmLCB0aGlzIHBzZXVkby1vcCB3aWxsIGJlCi0gICAgIGNhbGxlZCBldmVuIGlmIHdlIGFyZSBzdXBwb3J0ZWQgdG8gYmUgaWdub3JpbmcgaW5wdXQuICBEb3VibGUKLSAgICAgY2hlY2sgbm93LiAgQ2xvYmJlciAqaW5wdXRfbGluZV9wb2ludGVyIHNvIHRoYXQgaWdub3JlX2lucHV0Ci0gICAgIHRoaW5rcyB0aGF0IHRoaXMgaXMgbm90IGEgc3BlY2lhbCBwc2V1ZG8tb3AuICAqLwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIGlmIChpZ25vcmVfaW5wdXQgKCkpCi0gICAgewotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV9pZik7Ci0KLSAgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAocyAtIDMsIHF1YWwsIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJbi0+bmV4dCwgc1sxXSA9PSAnLicgPyBzWzJdIDogJ1wwJyk7Ci0KLSAgaWYgKHNbMV0gPT0gJy4nKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAzOwotICBlbHNlCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gcyArIDE7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgZWxzZSBwc2V1ZG8tb3AuICBJZiB3ZSBhcmUgY3VycmVudGx5IGRvaW5nIGFuIE1SSQotICAgc3RydWN0dXJlZCBJRiwgYXNzb2NpYXRlIHRoZSBFTFNFIHdpdGggdGhlIElGLiAgT3RoZXJ3aXNlLCBhc3N1bWUKLSAgIGl0IGlzIGEgY29uZGl0aW9uYWwgZWxzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbHNlIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBxWzJdOwotCi0gIGlmIChxdWFsID09ICdcMCcKLSAgICAgICYmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0JICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfaWYKLQkgIHx8IG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4pKQotICAgIHsKLSAgICAgIHNfZWxzZSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgaWYgKGlnbm9yZV9pbnB1dCAoKSkKLSAgICB7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+ZWxzZV9zZWVuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZWxzZSB3aXRob3V0IG1hdGNoaW5nIGlmIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbiA9IDE7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pKTsKLSAgcVswXSA9IHF1YWw7Ci0gIHFbMV0gPSAnXDAnOwotICBzcHJpbnRmIChidWYsICJicmElcyAlcyIsIHEsIG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBFTkRJIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbmRpIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfaWYpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJlbmRpIHdpdGhvdXQgbWF0Y2hpbmcgaWYiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBpZ25vcmVfaW5wdXQgd2lsbCBub3QgcmV0dXJuIHRydWUgZm9yIEVOREksIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAgICAgd29ycnkgYWJvdXQgY2hlY2tpbmcgaXQgYWdhaW4gaGVyZS4gICovCi0KLSAgaWYgKCEgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbikKLSAgICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPm5leHQpOwotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7Ci0KLSAgcG9wX21yaV9jb250cm9sICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEJSRUFLIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9icmVhayAoZXh0ZW50KQotICAgICBpbnQgZXh0ZW50OwotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLSAgY2hhciAqYnVmOwotICBjaGFyIGV4WzJdOwotCi0gIG4gPSBtcmlfY29udHJvbF9zdGFjazsKLSAgd2hpbGUgKG4gIT0gTlVMTAotCSAmJiBuLT50eXBlICE9IG1yaV9mb3IKLQkgJiYgbi0+dHlwZSAhPSBtcmlfcmVwZWF0Ci0JICYmIG4tPnR5cGUgIT0gbXJpX3doaWxlKQotICAgIG4gPSBuLT5vdXRlcjsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJyZWFrIG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG4tPmJvdHRvbSkpOwotICBleFswXSA9IGV4dGVudDsKLSAgZXhbMV0gPSAnXDAnOwotICBzcHJpbnRmIChidWYsICJicmElcyAlcyIsIGV4LCBuLT5ib3R0b20pOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgTkVYVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfbmV4dCAoZXh0ZW50KQotICAgICBpbnQgZXh0ZW50OwotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLSAgY2hhciAqYnVmOwotICBjaGFyIGV4WzJdOwotCi0gIG4gPSBtcmlfY29udHJvbF9zdGFjazsKLSAgd2hpbGUgKG4gIT0gTlVMTAotCSAmJiBuLT50eXBlICE9IG1yaV9mb3IKLQkgJiYgbi0+dHlwZSAhPSBtcmlfcmVwZWF0Ci0JICYmIG4tPnR5cGUgIT0gbXJpX3doaWxlKQotICAgIG4gPSBuLT5vdXRlcjsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm5leHQgb3V0c2lkZSBvZiBzdHJ1Y3R1cmVkIGxvb3AiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMCArIHN0cmxlbiAobi0+bmV4dCkpOwotICBleFswXSA9IGV4dGVudDsKLSAgZXhbMV0gPSAnXDAnOwotICBzcHJpbnRmIChidWYsICJicmElcyAlcyIsIGV4LCBuLT5uZXh0KTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEZPUiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZm9yIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgY29uc3QgY2hhciAqdmFyc3RhcnQsICp2YXJzdG9wOwotICBjb25zdCBjaGFyICppbml0c3RhcnQsICppbml0c3RvcDsKLSAgY29uc3QgY2hhciAqZW5kc3RhcnQsICplbmRzdG9wOwotICBjb25zdCBjaGFyICpieXN0YXJ0LCAqYnlzdG9wOwotICBpbnQgdXA7Ci0gIGludCBieTsKLSAgaW50IGV4dGVudDsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqczsKLSAgY2hhciBleFsyXTsKLQotICAvKiBUaGUgc3ludGF4IGlzCi0gICAgICAgRk9SLnEgdmFyID0gaW5pdCB7IFRPIHwgRE9XTlRPIH0gZW5kIFsgQlkgYnkgXSBETy5lCi0gICAgICovCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICB2YXJzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBMb29rIGZvciB0aGUgJz0nLiAgKi8KLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPScpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nID0iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2YXJzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAodmFyc3RvcCA+IHZhcnN0YXJ0Ci0gICAgICAmJiAodmFyc3RvcFstMV0gPT0gJyAnIHx8IHZhcnN0b3BbLTFdID09ICdcdCcpKQotICAgIC0tdmFyc3RvcDsKLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpbml0c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogTG9vayBmb3IgVE8gb3IgRE9XTlRPLiAgKi8KLSAgdXAgPSAxOwotICBpbml0c3RvcCA9IE5VTEw7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlRPIiwgMikgPT0gMAotCSAgJiYgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlclsyXSkpCi0JewotCSAgaW5pdHN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiRE9XTlRPIiwgNikgPT0gMAotCSAgJiYgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlcls2XSkpCi0JewotCSAgaW5pdHN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB1cCA9IDA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgaWYgKGluaXRzdG9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHRvIG9yIGRvd250byIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoaW5pdHN0b3AgPiBpbml0c3RhcnQKLSAgICAgICYmIChpbml0c3RvcFstMV0gPT0gJyAnIHx8IGluaXRzdG9wWy0xXSA9PSAnXHQnKSkKLSAgICAtLWluaXRzdG9wOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgZW5kc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogTG9vayBmb3IgQlkgb3IgRE8uICAqLwotICBieSA9IDA7Ci0gIGVuZHN0b3AgPSBOVUxMOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJCWSIsIDIpID09IDAKLQkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKQotCXsKLQkgIGVuZHN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBieSA9IDE7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiRE8iLCAyKSA9PSAwCi0JICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJwotCSAgICAgIHx8ICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKSkKLQl7Ci0JICBlbmRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGlmIChlbmRzdG9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGRvIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChlbmRzdG9wID4gZW5kc3RhcnQKLSAgICAgICYmIChlbmRzdG9wWy0xXSA9PSAnICcgfHwgZW5kc3RvcFstMV0gPT0gJ1x0JykpCi0gICAgLS1lbmRzdG9wOwotCi0gIGlmICghIGJ5KQotICAgIHsKLSAgICAgIGJ5c3RhcnQgPSAiIzEiOwotICAgICAgYnlzdG9wID0gYnlzdGFydCArIDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgYnlzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgLyogTG9vayBmb3IgRE8uICAqLwotICAgICAgYnlzdG9wID0gTlVMTDsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPIiwgMikgPT0gMAotCSAgICAgICYmIChpbnB1dF9saW5lX3BvaW50ZXJbMl0gPT0gJy4nCi0JCSAgfHwgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlclsyXSkpKQotCSAgICB7Ci0JICAgICAgYnlzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgICBpZiAoYnlzdG9wID09IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIGRvIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoYnlzdG9wID4gYnlzdGFydAotCSAgJiYgKGJ5c3RvcFstMV0gPT0gJyAnIHx8IGJ5c3RvcFstMV0gPT0gJ1x0JykpCi0JLS1ieXN0b3A7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcuJykKLSAgICBleHRlbnQgPSAnXDAnOwotICBlbHNlCi0gICAgewotICAgICAgZXh0ZW50ID0gaW5wdXRfbGluZV9wb2ludGVyWzFdOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgZnVsbHkgcGFyc2VkIHRoZSBGT1Igb3BlcmFuZHMuICBOb3cgYnVpbGQgdGhlIGxvb3AuICAqLwotCi0gIG4gPSBwdXNoX21yaV9jb250cm9sIChtcmlfZm9yKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICg1MCArIChpbnB1dF9saW5lX3BvaW50ZXIgLSB2YXJzdGFydCkpOwotCi0gIC8qIG1vdmUgaW5pdCx2YXIgKi8KLSAgcyA9IGJ1ZjsKLSAgKnMrKyA9ICdtJzsKLSAgKnMrKyA9ICdvJzsKLSAgKnMrKyA9ICd2JzsKLSAgKnMrKyA9ICdlJzsKLSAgaWYgKHF1YWwgIT0gJ1wwJykKLSAgICAqcysrID0gcXVhbDsKLSAgKnMrKyA9ICcgJzsKLSAgbWVtY3B5IChzLCBpbml0c3RhcnQsIGluaXRzdG9wIC0gaW5pdHN0YXJ0KTsKLSAgcyArPSBpbml0c3RvcCAtIGluaXRzdGFydDsKLSAgKnMrKyA9ICcsJzsKLSAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKLSAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7Ci0gICpzID0gJ1wwJzsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotCi0gIGNvbG9uIChuLT50b3ApOwotCi0gIC8qIGNtcCBlbmQsdmFyICovCi0gIHMgPSBidWY7Ci0gICpzKysgPSAnYyc7Ci0gICpzKysgPSAnbSc7Ci0gICpzKysgPSAncCc7Ci0gIGlmIChxdWFsICE9ICdcMCcpCi0gICAgKnMrKyA9IHF1YWw7Ci0gICpzKysgPSAnICc7Ci0gIG1lbWNweSAocywgZW5kc3RhcnQsIGVuZHN0b3AgLSBlbmRzdGFydCk7Ci0gIHMgKz0gZW5kc3RvcCAtIGVuZHN0YXJ0OwotICAqcysrID0gJywnOwotICBtZW1jcHkgKHMsIHZhcnN0YXJ0LCB2YXJzdG9wIC0gdmFyc3RhcnQpOwotICBzICs9IHZhcnN0b3AgLSB2YXJzdGFydDsKLSAgKnMgPSAnXDAnOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0KLSAgLyogYmNjIGJvdHRvbSAqLwotICBleFswXSA9IGV4dGVudDsKLSAgZXhbMV0gPSAnXDAnOwotICBpZiAodXApCi0gICAgc3ByaW50ZiAoYnVmLCAiYmx0JXMgJXMiLCBleCwgbi0+Ym90dG9tKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGJ1ZiwgImJndCVzICVzIiwgZXgsIG4tPmJvdHRvbSk7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLQotICAvKiBQdXQgdG9nZXRoZXIgdGhlIGFkZCBvciBzdWIgaW5zdHJ1Y3Rpb24gdXNlZCBieSBFTkRGLiAgKi8KLSAgcyA9IGJ1ZjsKLSAgaWYgKHVwKQotICAgIHN0cmNweSAocywgImFkZCIpOwotICBlbHNlCi0gICAgc3RyY3B5IChzLCAic3ViIik7Ci0gIHMgKz0gMzsKLSAgaWYgKHF1YWwgIT0gJ1wwJykKLSAgICAqcysrID0gcXVhbDsKLSAgKnMrKyA9ICcgJzsKLSAgbWVtY3B5IChzLCBieXN0YXJ0LCBieXN0b3AgLSBieXN0YXJ0KTsKLSAgcyArPSBieXN0b3AgLSBieXN0YXJ0OwotICAqcysrID0gJywnOwotICBtZW1jcHkgKHMsIHZhcnN0YXJ0LCB2YXJzdG9wIC0gdmFyc3RhcnQpOwotICBzICs9IHZhcnN0b3AgLSB2YXJzdGFydDsKLSAgKnMgPSAnXDAnOwotICBuLT5pbmNyID0gYnVmOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEVOREYgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2VuZGYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9mb3IpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJlbmRmIHdpdGhvdXQgZm9yIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLQotICBtcmlfYXNzZW1ibGUgKG1yaV9jb250cm9sX3N0YWNrLT5pbmNyKTsKLQotICBzcHJpbnRmIChtcmlfY29udHJvbF9zdGFjay0+aW5jciwgImJyYSAlcyIsIG1yaV9jb250cm9sX3N0YWNrLT50b3ApOwotICBtcmlfYXNzZW1ibGUgKG1yaV9jb250cm9sX3N0YWNrLT5pbmNyKTsKLQotICBmcmVlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBSRVBFQVQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX3JlcGVhdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX3JlcGVhdCk7Ci0gIGNvbG9uIChuLT50b3ApOwotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgVU5USUwgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX3VudGlsIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgY2hhciAqczsKLQotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX3JlcGVhdCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVudGlsIHdpdGhvdXQgcmVwZWF0IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLQotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXTsgcysrKQotICAgIDsKLQotICBwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uIChzLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCW1yaV9jb250cm9sX3N0YWNrLT50b3AsICdcMCcpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBXSElMRSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfd2hpbGUgKHF1YWwpCi0gICAgIGludCBxdWFsOwotewotICBjaGFyICpzOwotCi0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10KLQkgJiYgKCEgZmxhZ19tcmkgfHwgKnMgIT0gJyonKSkKLSAgICBzKys7Ci0gIC0tczsKLSAgd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKQotICAgIC0tczsKLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPiAxCi0gICAgICAmJiBzWy0xXSA9PSAnLicpCi0gICAgcyAtPSAyOwotICBpZiAocyAtIGlucHV0X2xpbmVfcG9pbnRlciA8IDIKLSAgICAgIHx8IHN0cm5jYXNlY21wIChzIC0gMSwgIkRPIiwgMikgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZG8iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX3doaWxlKTsKLQotICBjb2xvbiAobi0+bmV4dCk7Ci0KLSAgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAocyAtIDEsIHF1YWwsIChjb25zdCBjaGFyICopIE5VTEwsIG4tPmJvdHRvbSwKLQkJCQlzWzFdID09ICcuJyA/IHNbMl0gOiAnXDAnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEVORFcgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2VuZHcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqYnVmOwotCi0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfd2hpbGUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJlbmR3IHdpdGhvdXQgd2hpbGUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMCArIHN0cmxlbiAobXJpX2NvbnRyb2xfc3RhY2stPm5leHQpKTsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhICVzIiwgbXJpX2NvbnRyb2xfc3RhY2stPm5leHQpOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyoKLSAqIG1kX3BhcnNlX29wdGlvbgotICoJSW52b2NhdGlvbiBsaW5lIGluY2x1ZGVzIGEgc3dpdGNoIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBiYXNlIGFzc2VtYmxlci4KLSAqCVNlZSBpZiBpdCdzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGlvbi4gIFRoZXNlIGFyZToKLSAqCi0gKgktW0FdbVtjXTY4MDAwLCAtW0FdbVtjXTY4MDA4LCAtW0FdbVtjXTY4MDEwLCAtW0FdbVtjXTY4MDIwLCAtW0FdbVtjXTY4MDMwLCAtW0FdbVtjXTY4MDQwCi0gKgktW0FdbVtjXTY4ODgxLCAtW0FdbVtjXTY4ODgyLCAtW0FdbVtjXTY4ODUxCi0gKgkJU2VsZWN0IHRoZSBhcmNoaXRlY3R1cmUuICBJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90Ci0gKgkJc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBhcmNoaXRlY3R1cmUgY2F1c2UgZmF0YWwKLSAqCQllcnJvcnMuICBNb3JlIHRoYW4gb25lIG1heSBiZSBzcGVjaWZpZWQuICBUaGUgZGVmYXVsdCBpcwotICoJCS1tNjgwMjAgLW02ODg1MSAtbTY4ODgxLiAgTm90ZSB0aGF0IC1tNjgwMDggaXMgYSBzeW5vbnltCi0gKgkJZm9yIC1tNjgwMDAsIGFuZCAtbTY4ODgyIGlzIGEgc3lub255bSBmb3IgLW02ODg4MS4KLSAqCS1bQV1tW2Ndbm8tNjg4NTEsIC1bQV1tW2Ndbm8tNjg4ODEKLSAqCQlEb24ndCBhY2NlcHQgNjg4PzEgaW5zdHJ1Y3Rpb25zLiAgKFRoZSAiYyIgaXMga2luZCBvZiBzaWxseSwKLSAqCQlzbyBkb24ndCB1c2Ugb3IgZG9jdW1lbnQgaXQsIGJ1dCB0aGF0J3MgdGhlIHdheSB0aGUgcGFyc2luZwotICoJCXdvcmtzKS4KLSAqCi0gKgktcGljCUluZGljYXRlcyBQSUMuCi0gKgktawlJbmRpY2F0ZXMgUElDLiAgKFN1biAzIG9ubHkuKQotICoKLSAqCS0tYml0d2lzZS1vcgotICoJCVBlcm1pdCBgfCcgdG8gYmUgdXNlZCBpbiBleHByZXNzaW9ucy4KLSAqCi0gKi8KLQotI2lmZGVmIE9CSl9FTEYKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJsU0E6bTprUTpWIjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibFNBOm06ayI7Ci0jZW5kaWYKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fUElDIChPUFRJT05fTURfQkFTRSkKLSAgeyJwaWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BJQ30sCi0jZGVmaW5lIE9QVElPTl9SRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJyZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWwiLCBub19hcmd1bWVudCwgTlVMTCwKLSAgICAgT1BUSU9OX1JFR0lTVEVSX1BSRUZJWF9PUFRJT05BTH0sCi0jZGVmaW5lIE9QVElPTl9CSVRXSVNFX09SIChPUFRJT05fTURfQkFTRSArIDIpCi0gIHsiYml0d2lzZS1vciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQklUV0lTRV9PUn0sCi0jZGVmaW5lIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8xNiAoT1BUSU9OX01EX0JBU0UgKyAzKQotICB7ImJhc2Utc2l6ZS1kZWZhdWx0LTE2Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8xNn0sCi0jZGVmaW5lIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8zMiAoT1BUSU9OX01EX0JBU0UgKyA0KQotICB7ImJhc2Utc2l6ZS1kZWZhdWx0LTMyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8zMn0sCi0jZGVmaW5lIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8xNiAoT1BUSU9OX01EX0JBU0UgKyA1KQotICB7ImRpc3Atc2l6ZS1kZWZhdWx0LTE2Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8xNn0sCi0jZGVmaW5lIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8zMiAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7ImRpc3Atc2l6ZS1kZWZhdWx0LTMyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8zMn0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbCc6CQkJLyogLWwgbWVhbnMga2VlcCBleHRlcm5hbCB0byAyIGJpdCBvZmZzZXQKLQkJCQkgICByYXRoZXIgdGhhbiAxNiBiaXQgb25lICovCi0gICAgICBmbGFnX3Nob3J0X3JlZnMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoJCQkvKiAtUyBtZWFucyB0aGF0IGpic3IncyBhbHdheXMgdHVybiBpbnRvCi0JCQkJICAganNyJ3MuICAqLwotICAgICAgZmxhZ19sb25nX2p1bXBzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICBpZiAoKmFyZyA9PSAnbScpCi0gCWFyZysrOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbC10aHJvdWdoICovCi0gICAgY2FzZSAnbSc6Ci0KLSAgICAgIGlmIChhcmdbMF0gPT0gJ24nICYmIGFyZ1sxXSA9PSAnbycgJiYgYXJnWzJdID09ICctJykKLQl7Ci0JICBpbnQgaTsKLQkgIHVuc2lnbmVkIGxvbmcgYXJjaDsKLQkgIGNvbnN0IGNoYXIgKm9hcmcgPSBhcmc7Ci0KLQkgIGFyZyArPSAzOwotCSAgaWYgKCphcmcgPT0gJ20nKQotCSAgICB7Ci0JICAgICAgYXJnKys7Ci0JICAgICAgaWYgKGFyZ1swXSA9PSAnYycgJiYgYXJnWzFdID09ICc2JykKLQkJYXJnKys7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBuX2FyY2hzOyBpKyspCi0JICAgIGlmICghc3RyY21wIChhcmcsIGFyY2hzW2ldLm5hbWUpKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGkgPT0gbl9hcmNocykKLQkgICAgewotCSAgICB1bmtub3duOgotCSAgICAgIGFzX2JhZCAoXygidW5yZWNvZ25pemVkIG9wdGlvbiBgJXMnIiksIG9hcmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICBhcmNoID0gYXJjaHNbaV0uYXJjaDsKLQkgIGlmIChhcmNoID09IG02ODg4MSkKLQkgICAgbm9fNjg4ODEgPSAxOwotCSAgZWxzZSBpZiAoYXJjaCA9PSBtNjg4NTEpCi0JICAgIG5vXzY4ODUxID0gMTsKLQkgIGVsc2UKLQkgICAgZ290byB1bmtub3duOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgaTsKLQotCSAgaWYgKGFyZ1swXSA9PSAnYycgJiYgYXJnWzFdID09ICc2JykKLQkgICAgYXJnKys7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBuX2FyY2hzOyBpKyspCi0JICAgIGlmICghc3RyY21wIChhcmcsIGFyY2hzW2ldLm5hbWUpKQotCSAgICAgIHsKLQkJdW5zaWduZWQgbG9uZyBhcmNoID0gYXJjaHNbaV0uYXJjaDsKLQkJaWYgKGNwdV9vZl9hcmNoIChhcmNoKSkKLQkJICAvKiBJdCdzIGEgY3B1IHNwZWMuICAqLwotCQkgIHsKLQkJICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlICY9IH5tNjgwMDB1cDsKLQkJICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2g7Ci0JCSAgfQotCQllbHNlIGlmIChhcmNoID09IG02ODg4MSkKLQkJICB7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4ODE7Ci0JCSAgICBub182ODg4MSA9IDA7Ci0JCSAgfQotCQllbHNlIGlmIChhcmNoID09IG02ODg1MSkKLQkJICB7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4NTE7Ci0JCSAgICBub182ODg1MSA9IDA7Ci0JCSAgfQotCQllbHNlCi0JCSAgLyogPz8/ICovCi0JCSAgYWJvcnQgKCk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIGlmIChpID09IG5fYXJjaHMpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInVucmVjb2duaXplZCBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBgJXMnIiksIGFyZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BJQzoKLSAgICBjYXNlICdrJzoKLSAgICAgIGZsYWdfd2FudF9waWMgPSAxOwotICAgICAgYnJlYWs7CQkJLyogLXBpYywgUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAqLwotCi0gICAgY2FzZSBPUFRJT05fUkVHSVNURVJfUFJFRklYX09QVElPTkFMOgotICAgICAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMTsKLSAgICAgIHJlZ19wcmVmaXhfb3B0aW9uYWxfc2VlbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogLVY6IFNWUjQgYXJndW1lbnQgdG8gcHJpbnQgdmVyc2lvbiBJRC4gICovCi0gICAgY2FzZSAnVic6Ci0gICAgICBwcmludF92ZXJzaW9uX2lkICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1ReSwgLVFuOiBTVlI0IGFyZ3VtZW50cyBjb250cm9sbGluZyB3aGV0aGVyIGEgLmNvbW1lbnQgc2VjdGlvbgotCSBzaG91bGQgYmUgZW1pdHRlZCBvciBub3QuICBGSVhNRTogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgICBjYXNlICdRJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQklUV0lTRV9PUjoKLSAgICAgIHsKLQljaGFyICpuLCAqdDsKLQljb25zdCBjaGFyICpzOwotCi0JbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobTY4a19jb21tZW50X2NoYXJzKSArIDEpOwotCXQgPSBuOwotCWZvciAocyA9IG02OGtfY29tbWVudF9jaGFyczsgKnMgIT0gJ1wwJzsgcysrKQotCSAgaWYgKCpzICE9ICd8JykKLQkgICAgKnQrKyA9ICpzOwotCSp0ID0gJ1wwJzsKLQltNjhrX2NvbW1lbnRfY2hhcnMgPSBuOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8xNjoKLSAgICAgIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCA9IFNJWkVfV09SRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzI6Ci0gICAgICBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPSBTSVpFX0xPTkc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0RJU1BfU0laRV9ERUZBVUxUXzE2OgotICAgICAgbTY4a19yZWwzMiA9IDA7Ci0gICAgICBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0RJU1BfU0laRV9ERUZBVUxUXzMyOgotICAgICAgbTY4a19yZWwzMiA9IDE7Ci0gICAgICBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotNjgwWDAgb3B0aW9uczpcblwKLS1sCQkJdXNlIDEgd29yZCBmb3IgcmVmcyB0byB1bmRlZmluZWQgc3ltYm9scyBbZGVmYXVsdCAyXVxuXAotLW02ODAwMCB8IC1tNjgwMDggfCAtbTY4MDEwIHwgLW02ODAyMCB8IC1tNjgwMzAgfCAtbTY4MDQwIHwgLW02ODA2MFxuXAotIHwgLW02ODMwMiB8IC1tNjgzMzEgfCAtbTY4MzMyIHwgLW02ODMzMyB8IC1tNjgzNDAgfCAtbTY4MzYwXG5cCi0gfCAtbWNwdTMyIHwgLW01MjAwXG5cCi0JCQlzcGVjaWZ5IHZhcmlhbnQgb2YgNjgwWDAgYXJjaGl0ZWN0dXJlIFtkZWZhdWx0IDY4MDIwXVxuXAotLW02ODg4MSB8IC1tNjg4ODIgfCAtbW5vLTY4ODgxIHwgLW1uby02ODg4MlxuXAotCQkJdGFyZ2V0IGhhcy9sYWNrcyBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3NvclxuXAotCQkJW2RlZmF1bHQgeWVzIGZvciA2ODAyMCwgNjgwMzAsIGFuZCBjcHUzMl1cbiIpKTsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1tNjg4NTEgfCAtbW5vLTY4ODUxXG5cCi0JCQl0YXJnZXQgaGFzL2xhY2tzIG1lbW9yeS1tYW5hZ2VtZW50IHVuaXQgY29wcm9jZXNzb3JcblwKLQkJCVtkZWZhdWx0IHllcyBmb3IgNjgwMjAgYW5kIHVwXVxuXAotLXBpYywgLWsJCWdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcblwKLS1TCQkJdHVybiBqYnNyIGludG8ganNyXG5cCi0tLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbFxuXAotCQkJcmVjb2duaXplIHJlZ2lzdGVyIG5hbWVzIHdpdGhvdXQgcHJlZml4IGNoYXJhY3RlclxuXAotLS1iaXR3aXNlLW9yCQlkbyBub3QgdHJlYXQgYHwnIGFzIGEgY29tbWVudCBjaGFyYWN0ZXJcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tLWJhc2Utc2l6ZS1kZWZhdWx0LTE2CWJhc2UgcmVnIHdpdGhvdXQgc2l6ZSBpcyAxNiBiaXRzXG5cCi0tLWJhc2Utc2l6ZS1kZWZhdWx0LTMyCWJhc2UgcmVnIHdpdGhvdXQgc2l6ZSBpcyAzMiBiaXRzIChkZWZhdWx0KVxuXAotLS1kaXNwLXNpemUtZGVmYXVsdC0xNglkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMTYgYml0c1xuXAotLS1kaXNwLXNpemUtZGVmYXVsdC0zMglkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcbiIpKTsKLX0KLQwKLSNpZmRlZiBURVNUMgotCi0vKiBURVNUMjogIFRlc3QgbWRfYXNzZW1ibGUoKSAqLwotLyogV2FybmluZywgdGhpcyByb3V0aW5lIHByb2JhYmx5IGRvZXNuJ3Qgd29yayBhbnltb3JlICovCi0KLW1haW4gKCkKLXsKLSAgc3RydWN0IG02OGtfaXQgdGhlX2luczsKLSAgY2hhciBidWZbMTIwXTsKLSAgY2hhciAqY3A7Ci0gIGludCBuOwotCi0gIG02OGtfaXBfYmVnaW4gKCk7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKCFnZXRzIChidWYpIHx8ICEqYnVmKQotCWJyZWFrOwotICAgICAgaWYgKGJ1ZlswXSA9PSAnfCcgfHwgYnVmWzFdID09ICcuJykKLQljb250aW51ZTsKLSAgICAgIGZvciAoY3AgPSBidWY7ICpjcDsgY3ArKykKLQlpZiAoKmNwID09ICdcdCcpCi0JICAqY3AgPSAnICc7Ci0gICAgICBpZiAoaXNfbGFiZWwgKGJ1ZikpCi0JY29udGludWU7Ci0gICAgICBtZW1zZXQgKCZ0aGVfaW5zLCAnXDAnLCBzaXplb2YgKHRoZV9pbnMpKTsKLSAgICAgIG02OGtfaXAgKCZ0aGVfaW5zLCBidWYpOwotICAgICAgaWYgKHRoZV9pbnMuZXJyb3IpCi0JewotCSAgcHJpbnRmIChfKCJFcnJvciAlcyBpbiAlc1xuIiksIHRoZV9pbnMuZXJyb3IsIGJ1Zik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiT3Bjb2RlKCVkLiVzKTogIiksIHRoZV9pbnMubnVtbywgdGhlX2lucy5hcmdzKTsKLQkgIGZvciAobiA9IDA7IG4gPCB0aGVfaW5zLm51bW87IG4rKykKLQkgICAgcHJpbnRmICgiIDB4JXgiLCB0aGVfaW5zLm9wY29kZVtuXSAmIDB4ZmZmZik7Ci0JICBwcmludGYgKCIgICAgIik7Ci0JICBwcmludF90aGVfaW5zbiAoJnRoZV9pbnMub3Bjb2RlWzBdLCBzdGRvdXQpOwotCSAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotCX0KLSAgICAgIGZvciAobiA9IDA7IG4gPCBzdHJsZW4gKHRoZV9pbnMuYXJncykgLyAyOyBuKyspCi0JewotCSAgaWYgKHRoZV9pbnMub3BlcmFuZHNbbl0uZXJyb3IpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJvcCVkIEVycm9yICVzIGluICVzXG4iLCBuLCB0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yLCBidWYpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBwcmludGYgKCJtb2RlICVkLCByZWcgJWQsICIsIHRoZV9pbnMub3BlcmFuZHNbbl0ubW9kZSwgdGhlX2lucy5vcGVyYW5kc1tuXS5yZWcpOwotCSAgaWYgKHRoZV9pbnMub3BlcmFuZHNbbl0uYl9jb25zdCkKLQkgICAgcHJpbnRmICgiQ29uc3RhbnQ6ICclLipzJywgIiwgMSArIHRoZV9pbnMub3BlcmFuZHNbbl0uZV9jb25zdCAtIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9jb25zdCwgdGhlX2lucy5vcGVyYW5kc1tuXS5iX2NvbnN0KTsKLQkgIHByaW50ZiAoImlyZWcgJWQsIGlzaXogJWQsIGltdWwgJWQsICIsIHRoZV9pbnMub3BlcmFuZHNbbl0uaXJlZywgdGhlX2lucy5vcGVyYW5kc1tuXS5pc2l6LCB0aGVfaW5zLm9wZXJhbmRzW25dLmltdWwpOwotCSAgaWYgKHRoZV9pbnMub3BlcmFuZHNbbl0uYl9pYWRkKQotCSAgICBwcmludGYgKCJJYWRkOiAnJS4qcycsIiwgMSArIHRoZV9pbnMub3BlcmFuZHNbbl0uZV9pYWRkIC0gdGhlX2lucy5vcGVyYW5kc1tuXS5iX2lhZGQsIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9pYWRkKTsKLQkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLQl9Ci0gICAgfQotICBtNjhrX2lwX2VuZCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWlzX2xhYmVsIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotICB3aGlsZSAoKnN0ciAmJiAqc3RyICE9ICcgJykKLSAgICBzdHIrKzsKLSAgaWYgKHN0clstMV0gPT0gJzonIHx8IHN0clsxXSA9PSAnPScpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotLyogUG9zc2libGUgc3RhdGVzIGZvciByZWxheGF0aW9uOgotCi0gICAwIDAJYnJhbmNoIG9mZnNldAlieXRlCShicmEsIGV0YykKLSAgIDAgMQkJCXdvcmQKLSAgIDAgMgkJCWxvbmcKLQotICAgMSAwCWluZGV4ZWQgb2Zmc2V0cwlieXRlCWEwQCgzMixkNDp3OjEpIGV0YwotICAgMSAxCQkJd29yZAotICAgMSAyCQkJbG9uZwotCi0gICAyIDAJdHdvLW9mZnNldCBpbmRleCB3b3JkLXdvcmQgYTBAKDMyLGQ0KUAoNDUpIGV0YwotICAgMiAxCQkJd29yZC1sb25nCi0gICAyIDIJCQlsb25nLXdvcmQKLSAgIDIgMwkJCWxvbmctbG9uZwotCi0gICAqLwotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBGb3IgYS5vdXQsIGZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4gIElmIHdlIGRvbid0IGRvCi0gICAgIHRoaXMsIEJGRCB3aWxsIGFsaWduIGl0IGZvciB1cywgYnV0IGl0IHdpbGwgbm90IHdyaXRlIG91dCB0aGUKLSAgICAgZmluYWwgYnl0ZXMgb2YgdGhlIHNlY3Rpb24uICBUaGlzIG1heSBiZSBhIGJ1ZyBpbiBCRkQsIGJ1dCBpdCBpcwotICAgICBlYXNpZXIgdG8gZml4IGl0IGhlcmUgc2luY2UgdGhhdCBpcyBob3cgdGhlIG90aGVyIGEub3V0IHRhcmdldHMKLSAgICAgd29yay4gICovCi0gIGludCBhbGlnbjsKLQotICBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIHNpemUgPSAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgodmFsdWVUKSAtMSA8PCBhbGlnbikpOwotI2VuZGlmCi0jZW5kaWYKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIDY4aywgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGV4dGVuc2lvbgotICAgd29yZC4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3NlcyBvZiB0aGUgb2Zmc2V0IGFuZCB0aGUKLSAgIGZpcnN0IGV4dGVuc2lvbiB3b3JkIGlzIHN0b3JlZCBpbiBmeF9wY3JlbF9hZGp1c3QuICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpbnQgYWRqdXN0OwotCi0gIC8qIEJlY2F1c2UgZnhfcGNyZWxfYWRqdXN0IGlzIGEgY2hhciwgYW5kIG1heSBiZSB1bnNpZ25lZCwgd2Ugc3RvcmUKLSAgICAgLTEgYXMgNjQuICAqLwotICBhZGp1c3QgPSBmaXhQLT5meF9wY3JlbF9hZGp1c3Q7Ci0gIGlmIChhZGp1c3QgPT0gNjQpCi0gICAgYWRqdXN0ID0gLTE7Ci0gIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSBhZGp1c3Q7Ci19Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE9CSl9DT0ZGCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChpZ25vcmUpCi0gICAgIHN5bWJvbFMgKmlnbm9yZTsKLXsKLX0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgc3dpdGNoIChmcmFnLT5mcl9zdWJ0eXBlICYgMHgzKQotICAgIHsKLSAgICBjYXNlIEJZVEU6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIFNIT1JUOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBMT05HOgotICAgICAgcmV0dXJuIDQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLXZvaWQgbTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZygpCi17Ci0gICAvKiBTZXQgZmlsZS1zcGVjaWZpYyBmbGFncyBpZiB0aGlzIGlzIGEgY3B1MzIgcHJvY2Vzc29yICovCi0gICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIGNwdTMyKQotICAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX0NQVTMyOwotfQotI2VuZGlmCi0vKiBlbmQgb2YgdGMtbTY4ay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW02OGsuaCBiL2dhcy9jb25maWcvdGMtbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQ5MmI5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1tNjhrLmgKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX002OEsgMQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgZml4OwotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWZkZWYgT0JKX0FPVVQKLSNpZmRlZiBURV9TVU4zCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LXN1bm9zLWJpZyIKLSNlbmRpZgotI2lmZGVmIFRFX05ldEJTRAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1tNjhrLW5ldGJzZCIKLSNlbmRpZgotI2lmZGVmIFRFX0xJTlVYCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LW02OGstbGludXgiCi0jZW5kaWYKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC16ZXJvLWJpZyIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW02OGsiCi0jZW5kaWYKLQotI2lmZGVmIFRFX0FQT0xMTwotI2RlZmluZSBDT0ZGX01BR0lDCQlBUE9MTE9NNjhLTUFHSUMKLSNkZWZpbmUgQ09GRl9BT1VUSERSX01BR0lDCUFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSCi0jdW5kZWYgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLSNlbmRpZgotCi0jaWZkZWYgVEVfTFlOWAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiY29mZi1tNjhrLWx5bngiCi0jZW5kaWYKLSNpZmRlZiBURV9BVVgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1hdXgiCi0jZW5kaWYKLSNpZmRlZiBURV9ERUxUQQotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiY29mZi1tNjhrLXN5c3YiCi0jZW5kaWYKLQotI2lmbmRlZiBDT0ZGX01BR0lDCi0jZGVmaW5lIENPRkZfTUFHSUMgTUM2OE1BR0lDCi0jZW5kaWYKLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfbTY4ayAvKiBmb3Igbm9uLUJGRF9BU1NFTUJMRVIgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbTY4ayAvKiBCRkRfQVNTRU1CTEVSICovCi0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyVwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKHgpLT5meF9hZGRzeXx8KHgpLT5meF9zdWJzeSkKLQotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKLWV4dGVybiBpbnQgdGNfY29mZl9zaXplbWFjaGRlcCBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqKSk7Ci0jaWZkZWYgVEVfU1VOMwotLyogVGhpcyB2YXJpYWJsZSBjb250YWlucyB0aGUgdmFsdWUgdG8gd3JpdGUgb3V0IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIHRoZSBhLm91dCBmaWxlLiAgVGhlIDI8PDE2IG1lYW5zIHRoYXQgdGhpcyBpcyBhIDY4MDIwIGZpbGUgaW5zdGVhZAotICAgb2YgYW4gb2xkLXN0eWxlIDY4MDAwIGZpbGUgKi8KLQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKDI8PDE2fE9NQUdJQyk7CS8qIE1hZ2ljIGJ5dGUgZm9yIGZpbGUgaGVhZGVyICovCi0jZW5kaWYgLyogVEVfU1VOMyAqLwotCi0jaWZuZGVmIEFPVVRfTUFDSFRZUEUKLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSBtNjhrX2FvdXRfbWFjaHR5cGUKLWV4dGVybiBpbnQgbTY4a19hb3V0X21hY2h0eXBlOwotI2VuZGlmCi0KLSNkZWZpbmUgdGNfY29tbWVudF9jaGFycyBtNjhrX2NvbW1lbnRfY2hhcnMKLWV4dGVybiBjb25zdCBjaGFyICptNjhrX2NvbW1lbnRfY2hhcnM7Ci0KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotCi0jZGVmaW5lIExJU1RJTkdfV09SRF9TSVpFIDIJLyogQSB3b3JkIGlzIDIgYnl0ZXMgKi8KLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEggMgkvKiBPbmUgd29yZCBvbiB0aGUgZmlyc3QgbGluZSAqLwotI2RlZmluZSBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQgMgkvKiBPbmUgd29yZCBvbiB0aGUgc2Vjb25kIGxpbmUgKi8KLSNkZWZpbmUgTElTVElOR19MSFNfQ09OVF9MSU5FUyA0LyogQW5kIDQgbGluZXMgbWF4ICovCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICI2OEsgR0FTICIKLQotI2lmbmRlZiBSRUdJU1RFUl9QUkVGSVgKLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYICclJwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoUkVHSVNURVJfUFJFRklYX09QVElPTkFMKQotI2lmIGRlZmluZWQgKE02OEtDT0ZGKSB8fCBkZWZpbmVkIChPQkpfRUxGKQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lWzBdID09ICcuJyBcCi0JCQkgICAmJiAobmFtZVsxXSA9PSAnTCcgfHwgbmFtZVsxXSA9PSAnLicpKQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMAotI2Vsc2UgLyogISAoQ09GRiB8fCBFTEYpICovCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCAxCi0jZW5kaWYgLyogISAoQ09GRiB8fCBFTEYpICovCi0jZW5kaWYgLyogbm90IGRlZiBSRUdJU1RFUl9QUkVGSVggYW5kIG5vdCBkZWYgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYICovCi0KLSNpZmRlZiBURV9ERUxUQQotLyogT24gdGhlIERlbHRhLCBgJScgY2FuIG9jY3VyIHdpdGhpbiBhIGxhYmVsIG5hbWUsIGJ1dCBub3QgYXMgdGhlCi0gICBpbml0aWFsIGNoYXJhY3Rlci4gICovCi0jZGVmaW5lIExFWF9QQ1QgTEVYX05BTUUKLS8qIE9uIHRoZSBEZWx0YSwgYH4nIGNhbiBzdGFydCBhIGxhYmVsIG5hbWUsIGJ1dCBpcyBjb252ZXJ0ZWQgdG8gJy4nLiAqLwotI2RlZmluZSBMRVhfVElMREUgTEVYX0JFR0lOX05BTUUKLSNkZWZpbmUgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKHMpICgoKihzKSA9PSAnficgPyAqKHMpID0gJy4nIDogJy4nKSwgcykKLS8qIE9uIHRoZSBEZWx0YSwgZG90cyBhcmUgbm90IHJlcXVpcmVkIGJlZm9yZSBwc2V1ZG8tb3BzLiAgKi8KLSNkZWZpbmUgTk9fUFNFVURPX0RPVAotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jdW5kZWYgTE9DQUxfTEFCRUwKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgXAotICAobmFtZVswXSA9PSAnLicgfHwgKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyUnKSkKLSNlbmRpZgotI2VuZGlmCi0KLWV4dGVybiB2b2lkIG02OGtfbXJpX21vZGVfY2hhbmdlIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBNUklfTU9ERV9DSEFOR0UoaSkgbTY4a19tcmlfbW9kZV9jaGFuZ2UgKGkpCi0KLWV4dGVybiBpbnQgbTY4a19jb25kaXRpb25hbF9wc2V1ZG9vcCBQQVJBTVMgKChwc2V1ZG9fdHlwZVMgKikpOwotI2RlZmluZSB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcChwb3ApIG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3AgKHBvcCkKLQotZXh0ZXJuIHZvaWQgbTY4a19mcm9iX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgbTY4a19mcm9iX2xhYmVsIChzeW0pCi0KLWV4dGVybiB2b2lkIG02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCgpIG02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCkKLQotZXh0ZXJuIHZvaWQgbTY4a19mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkJCQkJXAotZG8JCQkJCQkJCVwKLSAgewkJCQkJCQkJXAotICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IHJlZ19zZWN0aW9uKQkJCVwKLSAgICAgIHB1bnQgPSAxOwkJCQkJCQlcCi0gICAgbTY4a19mcm9iX3N5bWJvbCAoc3ltKTsJCQkJCVwKLSAgfQkJCQkJCQkJXAotd2hpbGUgKDApCi0KLSNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKLQotI2lmZGVmIE9CSl9FTEYKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbCBvYmplY3QKLSAgIGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICBUcnVlIGlmIHdlCi0gICBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZyB0aGUgLm8gZmlsZS4gIElmCi0gICB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLCB0aGVuIHRoZSBhc3NlbWJsZXIKLSAgIHNob3VsZCBuZXZlciBkbyB0aGUgcmVsb2NhdGlvbi4gICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkJCQlcCi0JKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMCQkJXAotCSB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQlcCi0JICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KQkJXAotCSAgICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQlcCi0JICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShYKSB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKFgpCi1leHRlcm4gaW50IHRjX202OGtfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcKLWV4dGVybiB2b2lkIG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVgpCQkJXAotCSgoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAlcCi0JIHx8IChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNkZWZpbmUgdGNfZnJvYl9jb2ZmX3N5bWJvbChzeW0pIG02OGtfZnJvYl9zeW1ib2wgKHN5bSkKLQotI2RlZmluZSBOT19SRUxPQyAwCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2RlZmluZSBESUZGX0VYUFJfT0sKLQotZXh0ZXJuIHZvaWQgbTY4a19pbml0X2FmdGVyX2FyZ3MgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MgbTY4a19pbml0X2FmdGVyX2FyZ3MKLQotZXh0ZXJuIGludCBtNjhrX3BhcnNlX2xvbmdfb3B0aW9uIFBBUkFNUyAoKGNoYXIgKikpOwotI2RlZmluZSBtZF9wYXJzZV9sb25nX29wdGlvbiBtNjhrX3BhcnNlX2xvbmdfb3B0aW9uCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jZGVmaW5lIFRBUkdFVF9XT1JEX1NJWkUgMzIKLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi1leHRlcm4gc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBDb3BpZWQgZnJvbSB3cml0ZS5jICovCi0vKiBUaGlzIHdhcyBmb3JtZXJseSBjYWxsZWQgTTY4S19BSU1fS0xVREdFLiAgKi8KLSNkZWZpbmUgbWRfcHJlcGFyZV9yZWxheF9zY2FuKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSkgXAotICBpZiAoYWltPT0wICYmIHRoaXNfc3RhdGU9PSA0KSB7IC8qIGhhcmQgZW5jb2RlZCBmcm9tIHRjLW02OGsuYyAqLyBcCi0gICAgYWltPXRoaXNfdHlwZS0+cmx4X2ZvcndhcmQrMTsgLyogRm9yY2UgcmVsYXhhdGlvbiBpbnRvIHdvcmQgbW9kZSAqLyBcCi0gIH0KLQotLyogZW5kIG9mIHRjLW02OGsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tODhrLmMgYi9nYXMvY29uZmlnL3RjLW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3NDYwYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NTIgKzAsMCBAQAotLyogbTg4ay5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIE1vdG9yb2xhIDg4MDAwCi0gICBDb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZiBCdWZmYWxvIFVuaXZlcnNpdHkKLSAgIGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm04OGstb3Bjb2RlLmgiCi0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgdmFsOwotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjcl9yZWdzW10gPQotewotICB7IlBJRCIsIDB9LAotICB7IlBTUiIsIDF9LAotICB7IkVQU1IiLCAyfSwKLSAgeyJTU0JSIiwgM30sCi0gIHsiU1hJUCIsIDR9LAotICB7IlNOSVAiLCA1fSwKLSAgeyJTRklQIiwgNn0sCi0gIHsiVkJSIiwgN30sCi0gIHsiRE1UMCIsIDh9LAotICB7IkRNRDAiLCA5fSwKLSAgeyJETUEwIiwgMTB9LAotICB7IkRNVDEiLCAxMX0sCi0gIHsiRE1EMSIsIDEyfSwKLSAgeyJETUExIiwgMTN9LAotICB7IkRNVDIiLCAxNH0sCi0gIHsiRE1EMiIsIDE1fSwKLSAgeyJETUEyIiwgMTZ9LAotICB7IlNSMCIsIDE3fSwKLSAgeyJTUjEiLCAxOH0sCi0gIHsiU1IyIiwgMTl9LAotICB7IlNSMyIsIDIwfSwKLQotICB7TlVMTCwgMH0sCi19OwotCi1zdHJ1Y3QgZmllbGRfdmFsX2Fzc29jIGZjcl9yZWdzW10gPQotewotICB7IkZQRUNSIiwgMH0sCi0gIHsiRlBIUzEiLCAxfSwKLSAgeyJGUExTMSIsIDJ9LAotICB7IkZQSFMyIiwgM30sCi0gIHsiRlBMUzIiLCA0fSwKLSAgeyJGUFBUIiwgNX0sCi0gIHsiRlBSSCIsIDZ9LAotICB7IkZQUkwiLCA3fSwKLSAgeyJGUElUIiwgOH0sCi0KLSAgeyJGUFNSIiwgNjJ9LAotICB7IkZQQ1IiLCA2M30sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjbXBzbG90W10gPQotewotLyogSW50ZWdlcglGbG9hdGluZyBwb2ludCAqLwotICB7Im5jIiwgMH0sCi0gIHsiY3AiLCAxfSwKLSAgeyJlcSIsIDJ9LAotICB7Im5lIiwgM30sCi0gIHsiZ3QiLCA0fSwKLSAgeyJsZSIsIDV9LAotICB7Imx0IiwgNn0sCi0gIHsiZ2UiLCA3fSwKLSAgeyJoaSIsIDh9LAl7Im91IiwgOH0sCi0gIHsibHMiLCA5fSwJeyJpYiIsIDl9LAotICB7ImxvIiwgMTB9LAl7ImluIiwgMTB9LAotICB7ImhzIiwgMTF9LAl7Im9iIiwgMTF9LAotICB7ImJlIiwgMTJ9LAl7InVlIiwgMTJ9LAotICB7Im5iIiwgMTN9LAl7ImxnIiwgMTN9LAotICB7ImhlIiwgMTR9LAl7InVnIiwgMTR9LAotICB7Im5oIiwgMTV9LAl7InVsZSIsIDE1fSwKLQkJeyJ1bCIsIDE2fSwKLQkJeyJ1Z2UiLCAxN30sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjbmRtc2tbXSA9Ci17Ci0gIHsiZ3QwIiwgMX0sCi0gIHsiZXEwIiwgMn0sCi0gIHsiZ2UwIiwgM30sCi0gIHsibHQwIiwgMTJ9LAotICB7Im5lMCIsIDEzfSwKLSAgeyJsZTAiLCAxNH0sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IG04OGtfaW5zbgotewotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBlbnVtIHJlbG9jX3R5cGUgcmVsb2M7Ci19OwotCi1zdGF0aWMgY2hhciAqZ2V0X2JmIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9jbXAgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2NuZCBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXRfY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3ApKTsKLXN0YXRpYyBjaGFyICpnZXRfZmNyIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqcmVnbm9wKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2ltbTE2IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X282IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9yZWcgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3AsIGludCByZWdfcHJlZml4KSk7Ci1zdGF0aWMgY2hhciAqZ2V0X3ZlYzkgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0dmFsIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCBpbnQgKnZhbHApKTsKLQotc3RhdGljIGNoYXIgKmdldF9wY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHN0cnVjdCBtODhrX2luc24gKmluc24sCi0JCSAgICAgIGVudW0gcmVsb2NfdHlwZSByZWxvYykpOwotCi1zdGF0aWMgaW50IGNhbGNvcCBQQVJBTVMgKChzdHJ1Y3QgbTg4a19vcGNvZGUgKmZvcm1hdCwKLQkJCSAgIGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuKSk7Ci0KLQotZXh0ZXJuIGNoYXIgKm15bmFtZTsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotLyogVGhlc2UgYml0cyBzaG91bGQgYmUgdHVybmVkIG9mZiBpbiB0aGUgZmlyc3QgYWRkcmVzcyBvZiBldmVyeSBzZWdtZW50ICovCi1pbnQgbWRfc2VnX2FsaWduID0gNzsKLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIGFzIGluIDBmMTIzLjQ1NiAqLwotLyogb3IgICAgMEgxLjIzNEUtMTIgKHNlZSBleHAgY2hhcnMgYWJvdmUpICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREZkYiOwotCi1leHRlcm4gdm9pZCBmbG9hdF9jb25zICgpLCBjb25zICgpLCBzX2dsb2JsICgpLCBzX3NwYWNlICgpLAotICBzX3NldCAoKSwgc19sY29tbSAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDR9LAotICB7ImRlZiIsIHNfc2V0LCAwfSwKLSAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiaGFsZiIsIGNvbnMsIDJ9LAotICB7ImJzcyIsIHNfbGNvbW0sIDF9LAotICB7InN0cmluZyIsIHN0cmluZ2VyLCAwfSwKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIC8qIEZvcmNlIHNldCB0byBiZSB0cmVhdGVkIGFzIGFuIGluc3RydWN0aW9uLiAgKi8KLSAgeyJzZXQiLCBOVUxMLCAwfSwKLSAgeyIuc2V0Iiwgc19zZXQsIDB9LAotICB7MH0KLX07Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBpID0gMDsKLQotICAvKiBpbml0aWFsaXplIGhhc2ggdGFibGUgKi8KLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogbG9vcCB1bnRpbCB5b3Ugc2VlIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KLQotICB3aGlsZSAoKm04OGtfb3Bjb2Rlc1tpXS5uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUgPSBtODhrX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgLyogaGFzaCBlYWNoIG1uZW1vbmljIGFuZCByZWNvcmQgaXRzIHBvc2l0aW9uICovCi0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAmbTg4a19vcGNvZGVzW2ldKTsKLQotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCWFzX2ZhdGFsIChfKCJDYW4ndCBoYXNoIGluc3RydWN0aW9uICclcyc6JXMiKSwKLQkJICBtODhrX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQotICAgICAgLyogc2tpcCB0byBuZXh0IHVuaXF1ZSBtbmVtb25pYyBvciBlbmQgb2YgbGlzdCAqLwotCi0gICAgICBmb3IgKGkrKzsgIXN0cmNtcCAobTg4a19vcGNvZGVzW2ldLm5hbWUsIG5hbWUpOyBpKyspCi0JOwotICAgIH0KLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi12b2lkCi1tZF9hc3NlbWJsZSAob3ApCi0gICAgIGNoYXIgKm9wOwotewotICBjaGFyICpwYXJhbSwgKnRoaXNmcmFnOwotICBjaGFyIGM7Ci0gIHN0cnVjdCBtODhrX29wY29kZSAqZm9ybWF0OwotICBzdHJ1Y3QgbTg4a19pbnNuIGluc247Ci0KLSAgYXNzZXJ0IChvcCk7Ci0KLSAgLyogc2tpcCBvdmVyIGluc3RydWN0aW9uIHRvIGZpbmQgcGFyYW1ldGVycyAqLwotCi0gIGZvciAocGFyYW0gPSBvcDsgKnBhcmFtICE9IDAgJiYgIWlzc3BhY2UgKCpwYXJhbSk7IHBhcmFtKyspCi0gICAgOwotICBjID0gKnBhcmFtOwotICAqcGFyYW0rKyA9ICdcMCc7Ci0KLSAgLyogdHJ5IHRvIGZpbmQgdGhlIGluc3RydWN0aW9uIGluIHRoZSBoYXNoIHRhYmxlICovCi0KLSAgaWYgKChmb3JtYXQgPSAoc3RydWN0IG04OGtfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgb3ApKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBtbmVtb25pYyAnJXMnIiksIG9wKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogdHJ5IHBhcnNpbmcgdGhpcyBpbnN0cnVjdGlvbiBpbnRvIGluc24gKi8KLQotICBpbnNuLmV4cC5YX2FkZF9zeW1ib2wgPSAwOwotICBpbnNuLmV4cC5YX29wX3N5bWJvbCA9IDA7Ci0gIGluc24uZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gIGluc24uZXhwLlhfb3AgPSBPX2lsbGVnYWw7Ci0gIGluc24ucmVsb2MgPSBOT19SRUxPQzsKLQotICB3aGlsZSAoIWNhbGNvcCAoZm9ybWF0LCBwYXJhbSwgJmluc24pKQotICAgIHsKLSAgICAgIC8qIGlmIGl0IGRvZXNuJ3QgcGFyc2UgdHJ5IHRoZSBuZXh0IGluc3RydWN0aW9uICovCi0KLSAgICAgIGlmICghc3RyY21wIChmb3JtYXRbMF0ubmFtZSwgZm9ybWF0WzFdLm5hbWUpKQotCWZvcm1hdCsrOwotICAgICAgZWxzZQotCXsKLQkgIGFzX2ZhdGFsIChfKCJQYXJhbWV0ZXIgc3ludGF4IGVycm9yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogZ3JvdyB0aGUgY3VycmVudCBmcmFnIGFuZCBwbG9wIGluIHRoZSBvcGNvZGUgKi8KLQotICB0aGlzZnJhZyA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAodGhpc2ZyYWcsIGluc24ub3Bjb2RlLCA0KTsKLQotICAvKiBpZiB0aGlzIGluc3RydWN0aW9uIHJlcXVpcmVzIGxhYmVscyBtYXJrIGl0IGZvciBsYXRlciAqLwotCi0gIHN3aXRjaCAoaW5zbi5yZWxvYykKLSAgICB7Ci0gICAgY2FzZSBOT19SRUxPQzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19MTzE2OgotICAgIGNhc2UgUkVMT0NfSEkxNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDIsCi0JCSAgIDIsCi0JCSAgICZpbnNuLmV4cCwKLQkJICAgMCwKLQkJICAgaW5zbi5yZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfSVcxNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgNCwKLQkJICAgJmluc24uZXhwLAotCQkgICAwLAotCQkgICBpbnNuLnJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICB0aGlzZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgMiwKLQkJICAgMiwKLQkJICAgJmluc24uZXhwLAotCQkgICAxLAotCQkgICBpbnNuLnJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICB0aGlzZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICA0LAotCQkgICAmaW5zbi5leHAsCi0JCSAgIDEsCi0JCSAgIGluc24ucmVsb2MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gcmVsb2NhdGlvbiB0eXBlIikpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1jYWxjb3AgKGZvcm1hdCwgcGFyYW0sIGluc24pCi0gICAgIHN0cnVjdCBtODhrX29wY29kZSAqZm9ybWF0OwotICAgICBjaGFyICpwYXJhbTsKLSAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKLXsKLSAgY2hhciAqZm10ID0gZm9ybWF0LT5vcF9zcGVjOwotICBpbnQgZjsKLSAgdW5zaWduZWQgdmFsOwotICB1bnNpZ25lZCBvcGNvZGU7Ci0gIGludCByZWdfcHJlZml4ID0gJ3InOwotCi0gIGluc24tPm9wY29kZSA9IGZvcm1hdC0+b3Bjb2RlOwotICBvcGNvZGUgPSAwOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKHBhcmFtID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBmID0gKmZtdCsrOwotICAgICAgc3dpdGNoIChmKQotCXsKLQljYXNlIDA6Ci0JICBpbnNuLT5vcGNvZGUgfD0gb3Bjb2RlOwotCSAgcmV0dXJuICgqcGFyYW0gPT0gMCB8fCAqcGFyYW0gPT0gJ1xuJyk7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKGYgIT0gKnBhcmFtKyspCi0JICAgIHJldHVybiAwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdkJzoKLQkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsIHJlZ19wcmVmaXgpOwotCSAgcmVnX3ByZWZpeCA9ICdyJzsKLQkgIG9wY29kZSB8PSB2YWwgPDwgMjE7Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgcGFyYW0gPSBnZXRfbzYgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSAoKHZhbCA+PiAyKSA8PCA3KTsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6Ci0JICByZWdfcHJlZml4ID0gJ3gnOwotCSAgYnJlYWs7Ci0KLQljYXNlICcxJzoKLQkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsIHJlZ19wcmVmaXgpOwotCSAgcmVnX3ByZWZpeCA9ICdyJzsKLQkgIG9wY29kZSB8PSB2YWwgPDwgMTY7Ci0JICBicmVhazsKLQotCWNhc2UgJzInOgotCSAgcGFyYW0gPSBnZXRfcmVnIChwYXJhbSwgJnZhbCwgcmVnX3ByZWZpeCk7Ci0JICByZWdfcHJlZml4ID0gJ3InOwotCSAgb3Bjb2RlIHw9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMyc6Ci0JICBwYXJhbSA9IGdldF9yZWcgKHBhcmFtLCAmdmFsLCAncicpOwotCSAgb3Bjb2RlIHw9ICh2YWwgPDwgMTYpIHwgdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoKLQkgIHBhcmFtID0gZ2V0X2ltbTE2IChwYXJhbSwgaW5zbik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2InOgotCSAgcGFyYW0gPSBnZXRfYmYgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJ3AnOgotCSAgcGFyYW0gPSBnZXRfcGNyIChwYXJhbSwgaW5zbiwgUkVMT0NfUEMxNik7Ci0JICBicmVhazsKLQotCWNhc2UgJ1AnOgotCSAgcGFyYW0gPSBnZXRfcGNyIChwYXJhbSwgaW5zbiwgUkVMT0NfUEMyNik7Ci0JICBicmVhazsKLQotCWNhc2UgJ0InOgotCSAgcGFyYW0gPSBnZXRfY21wIChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICdNJzoKLQkgIHBhcmFtID0gZ2V0X2NuZCAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYyc6Ci0JICBwYXJhbSA9IGdldF9jciAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbCA8PCA1OwotCSAgYnJlYWs7Ci0KLQljYXNlICdmJzoKLQkgIHBhcmFtID0gZ2V0X2ZjciAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbCA8PCA1OwotCSAgYnJlYWs7Ci0KLQljYXNlICdWJzoKLQkgIHBhcmFtID0gZ2V0X3ZlYzkgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJz8nOgotCSAgLyogSGF2aW5nIHRoaXMgaGVyZSByZXBlYXRzIHRoZSB3YXJuaW5nIHNvbXRpbWVzLgotCSAgIEJ1dCBjYW4ndCB3ZSBzdGFuZCB0aGF0PyAgKi8KLQkgIGFzX3dhcm4gKF8oIlVzZSBvZiBvYnNvbGV0ZSBpbnN0cnVjdGlvbiIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW1hdGNoX25hbWUgKHBhcmFtLCBhc3NvY190YWIsIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICBzdHJ1Y3QgZmllbGRfdmFsX2Fzc29jICphc3NvY190YWI7Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICBpbnQgaTsKLSAgY2hhciAqbmFtZTsKLSAgaW50IG5hbWVfbGVuOwotCi0gIGZvciAoaSA9IDA7OyBpKyspCi0gICAgewotICAgICAgbmFtZSA9IGFzc29jX3RhYltpXS5uYW1lOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIG5hbWVfbGVuID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmICghc3RybmNtcCAocGFyYW0sIG5hbWUsIG5hbWVfbGVuKSkKLQl7Ci0JICAqdmFscCA9IGFzc29jX3RhYltpXS52YWw7Ci0JICByZXR1cm4gcGFyYW0gKyBuYW1lX2xlbjsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfcmVnIChwYXJhbSwgcmVnbm9wLCByZWdfcHJlZml4KQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnJlZ25vcDsKLSAgICAgaW50IHJlZ19wcmVmaXg7Ci17Ci0gIHVuc2lnbmVkIGM7Ci0gIHVuc2lnbmVkIHJlZ25vOwotCi0gIGMgPSAqcGFyYW0rKzsKLSAgaWYgKGMgPT0gcmVnX3ByZWZpeCkKLSAgICB7Ci0gICAgICByZWdubyA9ICpwYXJhbSsrIC0gJzAnOwotICAgICAgaWYgKHJlZ25vIDwgMTApCi0JewotCSAgaWYgKHJlZ25vID09IDApCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gMDsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQkgIGMgPSAqcGFyYW0gLSAnMCc7Ci0JICBpZiAoYyA8IDEwKQotCSAgICB7Ci0JICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgYzsKLQkgICAgICBpZiAoYyA8IDMyKQotCQl7Ci0JCSAgKnJlZ25vcCA9IHJlZ25vOwotCQkgIHJldHVybiBwYXJhbSArIDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IHJlZ25vOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoYyA9PSAncycgJiYgcGFyYW1bMF0gPT0gJ3AnKQotICAgIHsKLSAgICAgICpyZWdub3AgPSAzMTsKLSAgICAgIHJldHVybiBwYXJhbSArIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfaW1tMTYgKHBhcmFtLCBpbnNuKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKLXsKLSAgZW51bSByZWxvY190eXBlIHJlbG9jID0gTk9fUkVMT0M7Ci0gIHVuc2lnbmVkIGludCB2YWw7Ci0gIGNoYXIgKnNhdmVfcHRyOwotCi0gIGlmICghc3RybmNtcCAocGFyYW0sICJoaTE2IiwgNCkgJiYgIWlzYWxudW0gKHBhcmFtWzRdKSkKLSAgICB7Ci0gICAgICByZWxvYyA9IFJFTE9DX0hJMTY7Ci0gICAgICBwYXJhbSArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cm5jbXAgKHBhcmFtLCAibG8xNiIsIDQpICYmICFpc2FsbnVtIChwYXJhbVs0XSkpCi0gICAgewotICAgICAgcmVsb2MgPSBSRUxPQ19MTzE2OwotICAgICAgcGFyYW0gKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChwYXJhbSwgIml3MTYiLCA0KSAmJiAhaXNhbG51bSAocGFyYW1bNF0pKQotICAgIHsKLSAgICAgIHJlbG9jID0gUkVMT0NfSVcxNjsKLSAgICAgIHBhcmFtICs9IDQ7Ci0gICAgfQotCi0gIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgZXhwcmVzc2lvbiAoJmluc24tPmV4cCk7Ci0gIHBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICB2YWwgPSBpbnNuLT5leHAuWF9hZGRfbnVtYmVyOwotCi0gIGlmIChpbnNuLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIC8qIEluc2VydCB0aGUgdmFsdWUgbm93LCBhbmQgcmVzZXQgcmVsb2MgdG8gTk9fUkVMT0MuICAqLwotICAgICAgaWYgKHJlbG9jID09IE5PX1JFTE9DKQotCXsKLQkgIC8qIFdhcm4gYWJvdXQgdG9vIGJpZyBleHByZXNzaW9ucyBpZiBub3Qgc3Vycm91bmRlZCBieSB4eDE2LiAgKi8KLQkgIGlmICh2YWwgPiAweGZmZmYpCi0JICAgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDE2IGJpdHMiKSk7Ci0JfQotCi0gICAgICBpZiAocmVsb2MgPT0gUkVMT0NfSEkxNikKLQl2YWwgPj49IDE2OwotCi0gICAgICBpbnNuLT5vcGNvZGUgfD0gdmFsICYgMHhmZmZmOwotICAgICAgcmVsb2MgPSBOT19SRUxPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jID09IE5PX1JFTE9DKQotICAgIC8qIFdlIGFjY2VwdCBhIHN5bWJvbCBldmVuIHdpdGhvdXQgbG8xNiwgaGkxNiwgZXRjLCBhbmQgYXNzdW1lCi0gICAgICAgbG8xNiB3YXMgaW50ZW5kZWQuICAqLwotICAgIHJlbG9jID0gUkVMT0NfTE8xNjsKLQotICBpbnNuLT5yZWxvYyA9IHJlbG9jOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3BjciAocGFyYW0sIGluc24sIHJlbG9jKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKLSAgICAgZW51bSByZWxvY190eXBlIHJlbG9jOwotewotICBjaGFyICpzYXZlcHRyLCAqc2F2ZXBhcmFtOwotCi0gIHNhdmVwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotCi0gIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOwotCi0gIHNhdmVwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZXB0cjsKLQotICAvKiBCb3RjaDogV2Ugc2hvdWxkIHJlbG9jYXRlIG5vdyBpZiBPX2NvbnN0YW50LiAgKi8KLSAgaW5zbi0+cmVsb2MgPSByZWxvYzsKLQotICByZXR1cm4gc2F2ZXBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfY21wIChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCBpbnQgdmFsOwotICBjaGFyICpzYXZlX3B0cjsKLQotICBzYXZlX3B0ciA9IHBhcmFtOwotCi0gIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNtcHNsb3QsIHZhbHApOwotICB2YWwgPSAqdmFscDsKLQotICBpZiAocGFyYW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwYXJhbSA9IHNhdmVfcHRyOwotCi0gICAgICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICAgICAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gICAgICBpZiAodmFsID49IDMyKQotCXsKLQkgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDUgYml0cyIpKTsKLQkgIHZhbCAlPSAzMjsKLQl9Ci0gICAgfQotCi0gICp2YWxwID0gdmFsIDw8IDIxOwotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9jbmQgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIGludCB2YWw7Ci0KLSAgaWYgKGlzZGlnaXQgKCpwYXJhbSkpCi0gICAgewotICAgICAgcGFyYW0gPSBnZXR2YWwgKHBhcmFtLCAmdmFsKTsKLQotICAgICAgaWYgKHZhbCA+PSAzMikKLQl7Ci0JICBhc193YXJuIChfKCJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA1IGJpdHMiKSk7Ci0JICB2YWwgJT0gMzI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyICgqcGFyYW0pKQotCSpwYXJhbSA9IHRvbG93ZXIgKCpwYXJhbSk7Ci0KLSAgICAgIGlmIChpc3VwcGVyIChwYXJhbVsxXSkpCi0JcGFyYW1bMV0gPSB0b2xvd2VyIChwYXJhbVsxXSk7Ci0KLSAgICAgIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNuZG1zaywgdmFscCk7Ci0KLSAgICAgIGlmIChwYXJhbSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICB2YWwgPSAqdmFscDsKLSAgICB9Ci0KLSAgKnZhbHAgPSB2YWwgPDwgMjE7Ci0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2JmMiAocGFyYW0sIGJjKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgaW50IGJjOwotewotICBpbnQgZGVwdGggPSAwOwotICBpbnQgYzsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGMgPSAqcGFyYW07Ci0gICAgICBpZiAoYyA9PSAwKQotCXJldHVybiBwYXJhbTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJygnKQotCWRlcHRoKys7Ci0gICAgICBlbHNlIGlmIChjID09ICcpJykKLQlkZXB0aC0tOwotICAgICAgZWxzZSBpZiAoYyA9PSBiYyAmJiBkZXB0aCA8PSAwKQotCXJldHVybiBwYXJhbTsKLSAgICAgIHBhcmFtKys7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHBhcmFtLCBvZmZzZXRwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKm9mZnNldHA7Ci17Ci0gIHVuc2lnbmVkIG9mZnNldDsKLQotICBpZiAoaXNhbHBoYSAocGFyYW1bMF0pKQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyIChwYXJhbVswXSkpCi0JcGFyYW1bMF0gPSB0b2xvd2VyIChwYXJhbVswXSk7Ci0gICAgICBpZiAoaXN1cHBlciAocGFyYW1bMV0pKQotCXBhcmFtWzFdID0gdG9sb3dlciAocGFyYW1bMV0pOwotCi0gICAgICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBjbXBzbG90LCBvZmZzZXRwKTsKLQotICAgICAgcmV0dXJuIHBhcmFtOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICAgICAgb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgKm9mZnNldHAgPSBvZmZzZXQ7Ci0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2JmIChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCBvZmZzZXQgPSAwOwotICB1bnNpZ25lZCB3aWR0aCA9IDA7Ci0gIGNoYXIgKnhwOwotICBjaGFyICpzYXZlX3B0cjsKLQotICB4cCA9IGdldF9iZjIgKHBhcmFtLCAnPCcpOwotCi0gIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgaWYgKCp4cCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIGRpZCBub3QgZmluZCAnPCcuICBXZSBoYXZlIGFuIG9mZnNldCAod2lkdGggaW1wbGljaXRseSAzMikuICAqLwotICAgICAgcGFyYW0gPSBnZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHBhcmFtLCAmb2Zmc2V0KTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotICAgICAgaWYgKHBhcmFtID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnhwKysgPSAwOwkJLyogT3ZlcndyaXRlIHRoZSAnPCcgKi8KLSAgICAgIHBhcmFtID0gZ2V0X2JmMiAoeHAsICc+Jyk7Ci0gICAgICBpZiAoKnBhcmFtID09IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgICAqcGFyYW0rKyA9IDA7CQkvKiBPdmVyd3JpdGUgdGhlICc+JyAqLwotCi0gICAgICB3aWR0aCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgeHAgPSBnZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHhwLCAmb2Zmc2V0KTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gICAgICBpZiAoeHAgKyAxICE9IHBhcmFtKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAqdmFscCA9ICgod2lkdGggJSAzMikgPDwgNSkgfCAob2Zmc2V0ICUgMzIpOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2NyIChwYXJhbSwgcmVnbm9wKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnJlZ25vcDsKLXsKLSAgdW5zaWduZWQgcmVnbm87Ci0gIHVuc2lnbmVkIGM7Ci0KLSAgaWYgKCFzdHJuY21wIChwYXJhbSwgImNyIiwgMikpCi0gICAgewotICAgICAgcGFyYW0gKz0gMjsKLQotICAgICAgcmVnbm8gPSAqcGFyYW0rKyAtICcwJzsKLSAgICAgIGlmIChyZWdubyA8IDEwKQotCXsKLQkgIGlmIChyZWdubyA9PSAwKQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IDA7Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JICBjID0gKnBhcmFtIC0gJzAnOwotCSAgaWYgKGMgPCAxMCkKLQkgICAgewotCSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArIGM7Ci0JICAgICAgaWYgKGMgPCA2NCkKLQkJewotCQkgICpyZWdub3AgPSByZWdubzsKLQkJICByZXR1cm4gcGFyYW0gKyAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpyZWdub3AgPSByZWdubzsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgY3JfcmVncywgcmVnbm9wKTsKLQotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9mY3IgKHBhcmFtLCByZWdub3ApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqcmVnbm9wOwotewotICB1bnNpZ25lZCByZWdubzsKLSAgdW5zaWduZWQgYzsKLQotICBpZiAoIXN0cm5jbXAgKHBhcmFtLCAiZmNyIiwgMykpCi0gICAgewotICAgICAgcGFyYW0gKz0gMzsKLQotICAgICAgcmVnbm8gPSAqcGFyYW0rKyAtICcwJzsKLSAgICAgIGlmIChyZWdubyA8IDEwKQotCXsKLQkgIGlmIChyZWdubyA9PSAwKQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IDA7Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JICBjID0gKnBhcmFtIC0gJzAnOwotCSAgaWYgKGMgPCAxMCkKLQkgICAgewotCSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArIGM7Ci0JICAgICAgaWYgKGMgPCA2NCkKLQkJewotCQkgICpyZWdub3AgPSByZWdubzsKLQkJICByZXR1cm4gcGFyYW0gKyAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpyZWdub3AgPSByZWdubzsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgZmNyX3JlZ3MsIHJlZ25vcCk7Ci0KLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfdmVjOSAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgdW5zaWduZWQgdmFsOwotICBjaGFyICpzYXZlX3B0cjsKLQotICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7Ci0KLSAgaWYgKHZhbCA+PSAxIDw8IDkpCi0gICAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gOSBiaXRzIikpOwotCi0gICp2YWxwID0gdmFsICUgKDEgPDwgOSk7Ci0KLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfbzYgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIHZhbDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gIGlmICh2YWwgJiAweDMpCi0gICAgYXNfd2FybiAoXygiUmVtb3ZlZCBsb3dlciAyIGJpdHMgb2YgZXhwcmVzc2lvbiIpKTsKLQotICAqdmFscCA9IHZhbDsKLQotICByZXR1cm4ocGFyYW0pOwotfQotCi0jZGVmaW5lIGhleHZhbCh6KSBcCi0gIChpc2RpZ2l0ICh6KSA/ICh6KSAtICcwJyA6CQkJCQkJXAotICAgaXNsb3dlciAoeikgPyAoeikgLSAnYScgKyAxMCA6IAkJCQkJXAotICAgaXN1cHBlciAoeikgPyAoeikgLSAnQScgKyAxMCA6IC0xKQotCi1zdGF0aWMgY2hhciAqCi1nZXR2YWwgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgaW50ICp2YWxwOwotewotICB1bnNpZ25lZCBpbnQgdmFsID0gMDsKLSAgdW5zaWduZWQgaW50IGM7Ci0KLSAgYyA9ICpwYXJhbSsrOwotICBpZiAoYyA9PSAnMCcpCi0gICAgewotICAgICAgYyA9ICpwYXJhbSsrOwotICAgICAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKQotCXsKLQkgIGMgPSAqcGFyYW0rKzsKLQkgIGMgPSBoZXh2YWwgKGMpOwotCSAgd2hpbGUgKGMgPCAxNikKLQkgICAgewotCSAgICAgIHZhbCA9IHZhbCAqIDE2ICsgYzsKLQkgICAgICBjID0gKnBhcmFtKys7Ci0JICAgICAgYyA9IGhleHZhbCAoYyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYyAtPSAnMCc7Ci0JICB3aGlsZSAoYyA8IDgpCi0JICAgIHsKLQkgICAgICB2YWwgPSB2YWwgKiA4ICsgYzsKLQkgICAgICBjID0gKnBhcmFtKysgLSAnMCc7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyAtPSAnMCc7Ci0gICAgICB3aGlsZSAoYyA8IDEwKQotCXsKLQkgIHZhbCA9IHZhbCAqIDEwICsgYzsKLQkgIGMgPSAqcGFyYW0rKyAtICcwJzsKLQl9Ci0gICAgfQotCi0gICp2YWxwID0gdmFsOwotICByZXR1cm4gcGFyYW0gLSAxOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuYnl0ZXMpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG5ieXRlcyk7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgcm91dGluZSBpcyBuZXZlciBjYWxsZWQuICBXaGF0IGlzIGl0IGZvcj8KLSAgIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0IDEzIEp1bCAxOTkzICovCi0KLXZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuYnl0ZXMsIGZpeFAsIHNlZ190eXBlKQotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci0gICAgIGludCBuYnl0ZXM7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGludCBzZWdfdHlwZTsKLXsKLSAgaWYgKHNlZ190eXBlICE9IE5fVEVYVCB8fCBmaXhQLT5meF9yX3R5cGUgPT0gTk9fUkVMT0MpCi0gICAgewotICAgICAgc3dpdGNoIChuYnl0ZXMpCi0JewotCWNhc2UgNDoKLQkgICpidWYrKyA9IHZhbCA+PiAyNDsKLQkgICpidWYrKyA9IHZhbCA+PiAxNjsKLQljYXNlIDI6Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQljYXNlIDE6Ci0JICAqYnVmID0gdmFsOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19JVzE2OgotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfTE8xNjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzFdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0hJMTY6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIHZhbCArPSA0OwotICAgICAgYnVmWzBdID0gdmFsID4+IDEwOwotICAgICAgYnVmWzFdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIHZhbCArPSA0OwotICAgICAgYnVmWzBdIHw9ICh2YWwgPj4gMjYpICYgMHgwMzsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxODsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJ1ZlszXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgYnVmWzBdID0gdmFsID4+IDI0OwotICAgICAgYnVmWzFdID0gdmFsID4+IDE2OwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiQmFkIHJlbG9jYXRpb24gdHlwZSIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuYnl0ZXMpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IHZhbDsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgYXNfZmF0YWwgKF8oIm1kX251bWJlcl90b19kaXNwIG5vdCBkZWZpbmVkIikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuYnl0ZXMpOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBuYnl0ZXMpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IHZhbDsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgYXNfZmF0YWwgKF8oIm1kX251bWJlcl90b19maWVsZCBub3QgZGVmaW5lZCIpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbmJ5dGVzKTsKLX0KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDQ7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgcHRyWzBdID0gKGNoYXIpIDB4YzA7Ci0gIHB0clsxXSA9IDB4MDA7Ci0gIHB0clsyXSA9IDB4MDA7Ci0gIHB0clszXSA9IDB4MDA7Ci0gIGZpeF9uZXcgKGZyYWcsCi0JICAgcHRyIC0gZnJhZy0+ZnJfbGl0ZXJhbCwKLQkgICA0LAotCSAgIHRvX3N5bWJvbCwKLQkgICAob2Zmc2V0VCkgMCwKLQkgICAwLAotCSAgIFJFTE9DX1BDMjYpOwkJLyogQm90Y2g6IFNob3VsZG4ndCB0aGlzIGJlIFJFTE9DX1BDMTY/ICovCi19Ci0KLWludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDQ7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICBwdHJbMF0gPSAoY2hhcikgMHhjMDsKLSAgcHRyWzFdID0gMHgwMDsKLSAgcHRyWzJdID0gMHgwMDsKLSAgcHRyWzNdID0gMHgwMDsKLSAgZml4X25ldyAoZnJhZywKLQkgICBwdHIgLSBmcmFnLT5mcl9saXRlcmFsLAotCSAgIDQsCi0JICAgdG9fc3ltYm9sLAotCSAgIChvZmZzZXRUKSAwLAotCSAgIDAsCi0JICAgUkVMT0NfUEMyNik7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJSZWxheGF0aW9uIHNob3VsZCBuZXZlciBvY2N1ciIpKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLSNpZiAwCi0KLS8qIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0aGlzIHJvdXRpbmUgaXMgbmV2ZXIgY2FsbGVkLiAgV2hhdCBpcyBpdAotICAgZG9pbmcgaGVyZT8KLSAgIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0IDEzIEp1bCAxOTkzICovCi0KLQotLyoKLSAqIFJpc2MgcmVsb2NhdGlvbnMgYXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50LCBzbyBpdCBuZWVkcwotICogdGhpcyBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lIHRvIGVtaXQgdGhlbS4KLSAqLwotdm9pZAotZW1pdF9yZWxvY2F0aW9ucyAoZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBzdHJ1Y3QgcmVsb2NfaW5mb19tODhrIHJpOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBleHRlcm4gY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsKLQotICBiemVybyAoKGNoYXIgKikgJnJpLCBzaXplb2YgKHJpKSk7Ci0gIGZvciAoOyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZml4UC0+Znhfcl90eXBlID49IE5PX1JFTE9DKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgImZpeFAtPmZ4X3JfdHlwZSA9ICVkXG4iLCBmaXhQLT5meF9yX3R5cGUpOwotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBpZiAoKHN5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSkgIT0gTlVMTCkKLQl7Ci0JICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsKLQkgICAgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLQkgIGlmICgoc3ltYm9sUC0+c3lfdHlwZSAmIE5fVFlQRSkgPT0gTl9VTkRGKQotCSAgICB7Ci0JICAgICAgcmkucl9leHRlcm4gPSAxOwotCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gc3ltYm9sUC0+c3lfbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2V4dGVybiA9IDA7Ci0JICAgICAgcmkucl9zeW1ib2xudW0gPSBzeW1ib2xQLT5zeV90eXBlICYgTl9UWVBFOwotCSAgICB9Ci0JICBpZiAoc3ltYm9sUCAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgPSBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzOwotCSAgICB9Ci0JICByaS5yX3R5cGUgPSBmaXhQLT5meF9yX3R5cGU7Ci0JICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCAtPSByaS5yX2FkZHJlc3M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCSAgICB9Ci0KLQkgIGFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIChjaGFyICopICZyaSwgc2l6ZW9mIChyaSkpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLSNpZiAwCi0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgc3Vic3VtZWQgYnkgc19sY29tbSBpbiByZWFkLmMuCi0gICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCAxMyBKdWwgMTk5MyAqLwotCi0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoKQotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBic3NfYWxpZ247Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgYnNzX2FsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgYnNzX2FsaWduID0gMDsKLQotICBpZiAoIVNfSVNfREVGSU5FRChzeW1ib2xQKQotICAgICAgfHwgU19HRVRfU0VHTUVOVChzeW1ib2xQKSA9PSBTRUdfQlNTKQotICAgIHsKLSAgICAgIGlmICghIG5lZWRfcGFzc18yKQotCXsKLQkgIGNoYXIgKnA7Ci0JICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLQkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JICBzdWJzZWdfc2V0IChTRUdfQlNTLCAxKTsgLyogc3dpdGNoIHRvIGJzcwkqLwotCi0JICBpZiAoYnNzX2FsaWduKQotCSAgICBmcmFnX2FsaWduIChic3NfYWxpZ24sIDAsIDApOwotCi0JICAvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZyAqLwotCSAgaWYgKHN5bWJvbFAtPnN5X3R5cGUgPT0gTl9CU1MgJiYgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSAhPSBOVUxMKQotCSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSBOVUxMOwotCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCQkob2Zmc2V0VCkgdGVtcCwgKGNoYXIgKikwKTsKLQkgICpwID0gMDsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIFNFR19CU1MpOwotCi0JICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgJXMuIiksIG5hbWUpOwotICAgIH0KLQotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotI2lmZGVmIE04OEtDT0ZGCi0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIGlmIHdlIGFyZSBsaW5raW5nIHdpdGggb2JqLWNvZmZiZmQuYy4KLSAgIFRoYXQgZmlsZSBtYXkgYmUgcmVwbGFjZWQgYnkgYSBtb3JlIEJGRCBvcmllbnRlZCB2ZXJzaW9uIGF0IHNvbWUKLSAgIHBvaW50LiAgSWYgdGhhdCBoYXBwZW5zLCB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHJleGFtaW5lZC4KLQotICAgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDEzIEp1bHkgMTk5My4gICovCi0KLS8qIEdpdmVuIGEgZml4UyBzdHJ1Y3R1cmUgKGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGZpeF9uZXcsIGFib3ZlKSwKLSAgIHJldHVybiB0aGUgQkZEIHJlbG9jYXRpb24gdHlwZSB0byB1c2UgZm9yIGl0LiAgKi8KLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19MTzE2OgotICAgICAgcmV0dXJuIFJfTFZSVDE2OwotICAgIGNhc2UgUkVMT0NfSEkxNjoKLSAgICAgIHJldHVybiBSX0hWUlQxNjsKLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICByZXR1cm4gUl9QQ1IxNkw7Ci0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgcmV0dXJuIFJfUENSMjZMOwotICAgIGNhc2UgUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gUl9WUlQzMjsKLSAgICBjYXNlIFJFTE9DX0lXMTY6Ci0gICAgICByZXR1cm4gUl9WUlQxNjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBBcHBseSBhIGZpeFMgdG8gdGhlIG9iamVjdCBmaWxlLiAgU2luY2UgQ09GRiBkb2VzIG5vdCB1c2UgYWRkZW5kcwotICAgaW4gcmVsb2NzLCB0aGUgYWRkZW5kIGlzIGFjdHVhbGx5IHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgb2JqZWN0Ci0gICBmaWxlIGl0c2VsZi4gICovCi0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4cCwgdmFsKQotICAgICBmaXhTICpmaXhwOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmOwotCi0gIGJ1ZiA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgZml4cC0+Znhfb2Zmc2V0ID0gMDsKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19JVzE2OgotICAgICAgZml4cC0+Znhfb2Zmc2V0ID0gdmFsID4+IDE2OwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfTE8xNjoKLSAgICAgIGZpeHAtPmZ4X29mZnNldCA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzFdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0hJMTY6Ci0gICAgICBmaXhwLT5meF9vZmZzZXQgPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlsxXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgYnVmWzBdID0gdmFsID4+IDEwOwotICAgICAgYnVmWzFdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDI2KSAmIDB4MDM7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTg7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gMTA7Ci0gICAgICBidWZbM10gPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBXaGVyZSBhIFBDIHJlbGF0aXZlIG9mZnNldCBpcyBjYWxjdWxhdGVkIGZyb20uICBPbiB0aGUgbTg4ayB0aGV5Ci0gICBhcmUgY2FsY3VsYXRlZCBmcm9tIGp1c3QgYWZ0ZXIgdGhlIGluc3RydWN0aW9uLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmUgLSAyOwotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogV2hlbiB3ZSBhbGlnbiB0aGUgLmluaXQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLiAgKi8KLQotaW50Ci1tODhrX2RvX2FsaWduIChuLCBmaWxsLCBtYXgsIGxlbikKLSAgICAgaW50IG47Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGw7Ci0gICAgIGludCBsZW47Ci0gICAgIGludCBtYXg7Ci17Ci0gIGlmIChmaWxsID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAob2JqX3NlZ21lbnRfbmFtZSAobm93X3NlZyksICIuaW5pdCIpID09IDApCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9wX3BhdHRlcm5bXSA9IHsgMHhmNCwgMHgwMCwgMHg1OCwgMHgwMCB9OwotICAgICAgZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBub3BfcGF0dGVybiwgc2l6ZW9mIChub3BfcGF0dGVybiksIG1heCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogTTg4S0NPRkYgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTg4ay5oIGIvZ2FzL2NvbmZpZy90Yy1tODhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNmI2OTcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tODhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogbTg4ay5oIC0tIEFzc2VtYmxlciBmb3IgdGhlIE1vdG9yb2xhIDg4MDAwCi0gICBDb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZiBCdWZmYWxvIFVuaXZlcnNpdHkKLSAgIGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX004OEsKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNpZmRlZiBNODhLQ09GRgotI2RlZmluZSBDT0ZGX01BR0lDIE1DODhPTUFHSUMKLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfbTg4awotI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMlcKLSNlbmRpZgotCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFCi0jZGVmaW5lIFRDX0tFRVBfRlhfT0ZGU0VUCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgUkVMT0NfMzIKLQotLyogZGlmZmVyZW50IHR5cGUgb2YgcmVsb2NhdGlvbiBhdmFpbGFibGUgaW4gdGhlIG04OGsgKi8KLQotZW51bSByZWxvY190eXBlCi17Ci0gIFJFTE9DX0xPMTYsCQkJLyogbG8xNihzeW0pICovCi0gIFJFTE9DX0hJMTYsCQkJLyogaGkxNihzeW0pICovCi0gIFJFTE9DX1BDMTYsCQkJLyogYmIwLCBiYjEsIGJjbmQgKi8KLSAgUkVMT0NfUEMyNiwJCQkvKiBiciwgYnNyICovCi0gIFJFTE9DXzMyLAkJCS8qIGp1bXAgdGFibGVzLCBldGMgKi8KLSAgUkVMT0NfSVcxNiwJCQkvKiBnbG9iYWwgYWNjZXNzIHRocm91Z2ggbGlua2VyIHJlZ3MgMjggKi8KLSAgTk9fUkVMT0MKLX07Ci0KLXN0cnVjdCByZWxvY19pbmZvX204OGsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnQgcl9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7Ci0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICB1bnNpZ25lZCBpbnQgcl9wYWQ6MzsKLSAgZW51bSByZWxvY190eXBlIHJfdHlwZTo0OwotICBsb25nIGludCByX2FkZGVuZDsKLX07Ci0KLSNkZWZpbmUgcmVsb2NhdGlvbl9pbmZvIHJlbG9jX2luZm9fbTg4awotCi0vKiBUaGUgbTg4ayB1c2VzICdAJyB0byBzdGFydCBsb2NhbCBsYWJlbHMuICAqLwotI2RlZmluZSBMRVhfQVQgKExFWF9CRUdJTl9OQU1FIHwgTEVYX05BTUUpCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSBcCi0gICgobmFtZVswXSA9PSdAJyAmJiAobmFtZSBbMV0gPT0gJ0wnIHx8IG5hbWUgWzFdID09ICcuJykpIFwKLSAgIHx8IChuYW1lWzBdID09ICdMJyAmJiBuYW1lWzFdID09ICcwJyAmJiBuYW1lWzJdID09ICdcMDAxJykpCi0jZW5kaWYKLQotLyogVGhlIG04OGsgdXNlcyBwc2V1ZG8tb3BzIHdpdGggbm8gbGVhZGluZyBwZXJpb2QuICAqLwotI2RlZmluZSBOT19QU0VVRE9fRE9UCi0KLS8qIERvbid0IHdhcm4gb24gd29yZCBvdmVyZmxvdzsgaXQgaGFwcGVucyBvbiAlaGkgcmVsb2NzLiAgKi8KLSN1bmRlZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIscyxmKQkJe2FzX2ZhdGFsIChfKCJtODhrIGNvbnZlcnRfZnJhZ1xuIikpO30KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB1bmRlZmluZWQgc3ltYm9scy4gICovCi0jZGVmaW5lIG1kX3VuZGVmaW5lZF9zeW1ib2wocykgMAotCi0vKiBXZSBoYXZlIG5vIHNwZWNpYWwgb3BlcmFuZCBoYW5kbGluZy4gICovCi0jZGVmaW5lIG1kX29wZXJhbmQoZSkKLQotI2lmZGVmIE04OEtDT0ZGCi0KLS8qIFdoZXRoZXIgYSByZWxvYyBzaG91bGQgYmUgb3V0cHV0LiAgKi8KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoZml4cCkgKChmaXhwKS0+ZnhfYWRkc3kgIT0gTlVMTCkKLQotLyogR2V0IHRoZSBCRkQgcmVsb2MgdHlwZSB0byB1c2UgZm9yIGEgZ2FzIGZpeFMgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4cCkgdGNfY29mZl9maXgycnR5cGUgKGZpeHApCi0KLS8qIE5vIHNwZWNpYWwgaG9vayBuZWVkZWQgZm9yIHN5bWJvbHMuICAqLwotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2socykKLQotLyogQWxpZ24gc2VjdGlvbnMgdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotI2lmbmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikJKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQotI2VuZGlmCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykJbWF4IChzZWN0aW9uX2FsaWdubWVudFsoaW50KSAoU0VHKV0sIDQpCi0KLS8qIFdlIHVzZSBhIHNwZWNpYWwgYWxpZ25tZW50IGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgY29ycmVjdCBub3AKLSAgIHBhdHRlcm4gaW4gLmluaXQuICAqLwotZXh0ZXJuIGludCBtODhrX2RvX2FsaWduIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotI2RlZmluZSBtZF9kb19hbGlnbihuLGZpbGwsbGVuLG1heCxsKSBpZiAobTg4a19kb19hbGlnbihuLGZpbGwsbWF4LGxlbikpIGdvdG8gbAotCi0jZW5kaWYgLyogTTg4S0NPRkYgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbWNvcmUuYyBiL2dhcy9jb25maWcvdGMtbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzZmM5Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIxICswLDAgQEAKLS8qIHRjLW1jb3JlLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgTSpDb3JlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImVsZi9tY29yZS5oIgotI2VuZGlmCi0KLSNpZm5kZWYgc3RyZXEKLSNkZWZpbmUgc3RyZXEoYSxiKSAoc3RyY21wIChhLCBiKSA9PSAwKQotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBkdW1iIGNvbXBpbGVycy4gICovCi1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfbGl0ZXJhbHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3N0cmluZ2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCAgICBsb2cyIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9yZWcgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX2NyZWcgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX2V4cCBQQVJBTVMgKChjaGFyICosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkICAgbWFrZV9uYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgICAgZW50ZXJfbGl0ZXJhbCBQQVJBTVMgKChleHByZXNzaW9uUyAqLCBpbnQpKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfcnQgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqLCBpbnQsIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfaW1tIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX21lbSBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkICosIHVuc2lnbmVkICosIHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCAgIGR1bXBfbGl0ZXJhbHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIGNoZWNrX2xpdGVyYWxzIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfdGV4dCAgICBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfc19kYXRhICAgIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfYnNzICAgICBQQVJBTVMgKChpbnQpKTsKLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfY29tbSAgICBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi0KLS8qIFNldmVyYWwgcGxhY2VzIGluIHRoaXMgZmlsZSBpbnNlcnQgcmF3IGluc3RydWN0aW9ucyBpbnRvIHRoZQotICAgb2JqZWN0LiBUaGV5IHNob3VsZCB1c2UgTUNPUkVfSU5TVF9YWFggbWFjcm9zIHRvIGdldCB0aGUgb3Bjb2RlcwotICAgYW5kIHRoZW4gdXNlIHRoZXNlIHR3byBtYWNyb3MgdG8gY3JhY2sgdGhlIE1DT1JFX0lOU1QgdmFsdWUgaW50bwotICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGUgdmFsdWVzLiAgKi8KLSNkZWZpbmUJSU5TVF9CWVRFMCh4KSAgKCgoeCkgPj4gOCkgJiAweEZGKQotI2RlZmluZQlJTlNUX0JZVEUxKHgpICAoKHgpICYgMHhGRikKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIy8iOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsKLQotc3RhdGljIGludCBkb19qc3JpMmJzciA9IDA7CS8qIGNoYW5nZSBoZXJlIGZyb20gMSBieSBDcnVlc3MgMTkgQXVndXN0IDk3ICovCi1zdGF0aWMgaW50IHNpZmlsdGVyX21vZGUgPSAwOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0jZGVmaW5lIEMod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0jZGVmaW5lIEdFVF9XSEFUKHgpICAgICgoeCA+PiAyKSkKLQotLyogVGhlc2UgYXJlIHRoZSB0d28gdHlwZXMgb2YgcmVsYXhhYmxlIGluc3RydWN0aW9uICovCi0jZGVmaW5lIENPTkRfSlVNUCAgMQotI2RlZmluZSBVTkNEX0pVTVAgIDIKLQotI2RlZmluZSBVTkRFRl9ESVNQICAgICAgMAotI2RlZmluZSBDT05EMTIgICAgICAgICAgMQotI2RlZmluZSBDT05EMzIgICAgICAgICAgMgotI2RlZmluZSBVTkNEMTIgICAgICAgICAgMQotI2RlZmluZSBVTkNEMzIgICAgICAgICAgMgotI2RlZmluZSBVTkRFRl9XT1JEX0RJU1AgNAotI2RlZmluZSBFTkQgICAgICAgICAgICAgNQotCi0jZGVmaW5lIEMxMl9MRU4JICAgICAgICAyCi0jZGVmaW5lIEMzMl9MRU4JICAgICAgIDEwCS8qIGFsbG93IGZvciBhbGlnbiAqLwotI2RlZmluZSBVMTJfTEVOCSAgICAgICAgMgotI2RlZmluZSBVMzJfTEVOCSAgICAgICAgOAkvKiBhbGxvdyBmb3IgYWxpZ24gKi8KLQotCi0vKiBJbml0aWFsaXplIHRoZSByZWxheCB0YWJsZSAqLwotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAwOiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMTogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDI6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAzOiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogNDogdW51c2VkICovICAKLXsgMjA0OCwgLTIwNDYsIEMxMl9MRU4sIEMoQ09ORF9KVU1QLCBDT05EMzIpIH0sCS8qIDU6IEMoQ09ORF9KVU1QLCBDT05EMTIpICovCi17ICAgIDAsICAgICAwLCBDMzJfTEVOLCAwIH0sCQkJLyogNjogQyhDT05EX0pVTVAsIENPTkQzMikgKi8KLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDc6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiA4OiB1bnVzZWQgKi8gIAoteyAyMDQ4LCAtMjA0NiwgVTEyX0xFTiwgQyhVTkNEX0pVTVAsIFVOQ0QzMikgfSwJLyogOTogQyhVTkNEX0pVTVAsIFVOQ0QxMikgKi8KLXsgICAgMCwgICAgIDAsIFUzMl9MRU4sIDAgfSwJCQkvKjEwOiBDKFVOQ0RfSlVNUCwgVU5DRDMyKSAqLwoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyoxMTogdW51c2VkICovICAKLXsgICAgMCwgICAgIDAsCSAgICAgMCwgMCB9CQkJLyoxMjogdW51c2VkICovICAKLX07Ci0KLS8qIExJVEVSQUwgUE9PTCBEQVRBIFNUUlVDVFVSRVMgKi8KLXN0cnVjdCBsaXRlcmFsCi17Ci0gIHVuc2lnbmVkIHNob3J0ICByZWZjbnQ7Ci0gIHVuc2lnbmVkIGNoYXIJICBpc3BjcmVsOwotICB1bnNpZ25lZCBjaGFyCSAgdW51c2VkOwotICBleHByZXNzaW9uUwkgIGU7Ci19OwotCi0jZGVmaW5lIE1BWF9QT09MX1NJWkUJKDEwMjQvNCkKLXN0YXRpYyBzdHJ1Y3QgbGl0ZXJhbCBsaXRwb29sIFtNQVhfUE9PTF9TSVpFXTsKLXN0YXRpYyB1bnNpZ25lZCBwb29sc2l6ZTsKLXN0YXRpYyB1bnNpZ25lZCBwb29sbnVtYmVyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9vbHNwYW47Ci0KLS8qIFNQQU5QQU5JQzogdGhlIHBvaW50IGF0IHdoaWNoIHdlIGdldCB0b28gc2NhcmVkIGFuZCBmb3JjZSBhIGR1bXAKLSAgIG9mIHRoZSBsaXRlcmFsIHBvb2wsIGFuZCBwZXJoYXBzIHB1dCBhIGJyYW5jaCBpbiBwbGFjZS4KLSAgIENhbGN1bGF0ZWQgYXM6Ci0gIAkJIDEwMjQJc3BhbiBvZiBscncvam1waS9qc3JpIGluc24gKGFjdHVhbGx5IHNwYW4rMSkKLSAgCQktMglwb3NzaWJsZSBhbGlnbm1lbnQgYXQgdGhlIGluc24uCi0gIAkJLTIJcG9zc2libGUgYWxpZ25tZW50IHRvIGdldCB0aGUgdGFibGUgYWxpZ25lZC4KLSAgCQktMglhbiBpbnNlcnRlZCBicmFuY2ggYXJvdW5kIHRoZSB0YWJsZS4KLSAgCSAgICAgPT0gMTAxOAotICAgYXQgMTAxOCwgd2UgbWlnaHQgYmUgaW4gdHJvdWJsZS4KLSAgIC0tIHNvIHdlIGhhdmUgdG8gYmUgc21hbGxlciB0aGFuIDEwMTggYW5kIHNpbmNlIHdlIGRlYWwgd2l0aCAyLWJ5dGUKLSAgIGluc3RydWN0aW9ucywgdGhlIG5leHQgZ29vZCBjaG9pY2UgaXMgMTAxNi4KLSAgIC0tIE5vdGUgd2UgaGF2ZSBhIHRlc3QgY2FzZSB0aGF0IGZhaWxzIHdoZW4gd2UndmUgZ290IDEwMTggaGVyZS4gICovCi0jZGVmaW5lIFNQQU5QQU5JQwkoMTAxNikJCS8qIDEwMjQgLSAxIGVudHJ5IC0gMiBieXRlIHJvdW5kaW5nICovCi0jZGVmaW5lIFNQQU5DTE9TRQkoOTAwKQotI2RlZmluZSBTUEFORVhJVAkoNjAwKQotc3RhdGljIHN5bWJvbFMgKiBwb29sc3ltOwkJLyogbGFiZWwgZm9yIGN1cnJlbnQgcG9vbCAqLwotc3RhdGljIGNoYXIgcG9vbG5hbWVbOF07Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIG9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgICAgUHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgICAgRnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uICAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgImV4cG9ydCIsICAgc19nbG9ibCwgICAgICAgICAgMCB9LAotICB7ICJpbXBvcnQiLCAgIHNfaWdub3JlLCAgICAgICAgIDAgfSwKLSAgeyAibGl0ZXJhbHMiLCBtY29yZV9zX2xpdGVyYWxzLCAwIH0sCi0gIHsgInBhZ2UiLCAgICAgbGlzdGluZ19lamVjdCwgICAgMCB9LAotCi0gIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHRvIGludGVyY2VwdCB0aGUgcGxhY2VtZW50IG9mIGRhdGEgaW50byB0aGUgdGV4dAotICAgICBzZWN0aW9uIChlZyBhZGRyZXNzZXMgZm9yIGEgc3dpdGNoIHRhYmxlKSwgc28gdGhhdCB0aGUgc3BhY2UgdGhleQotICAgICBvY2N1cHkgY2FuIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgb3Igbm90IHRvCi0gICAgIGR1bXAgdGhlIGN1cnJlbnQgbGl0ZXJhbCBwb29sLgotICAgICBYWFggLSBjdXJyZW50bHkgd2UgZG8gbm90IGNvcGUgd2l0aCB0aGUgLnNwYWNlIGFuZCAuZGNiLmQgZGlyZWN0aXZlcy4gICovCi0gIHsgImFzY2lpIiwgICAgbWNvcmVfc3RyaW5nZXIsICAgICAgIDAgfSwKLSAgeyAiYXNjaXoiLCAgICBtY29yZV9zdHJpbmdlciwgICAgICAgMSB9LAotICB7ICJieXRlIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAxIH0sCi0gIHsgImRjIiwgICAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAiZGMuYiIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMSB9LAotICB7ICJkYy5kIiwgICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdkJyB9LAotICB7ICJkYy5sIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA0IH0sCi0gIHsgImRjLnMiLCAgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2YnIH0sCi0gIHsgImRjLnciLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAiZGMueCIsICAgICBtY29yZV9mbG9hdF9jb25zLCAgICAneCcgfSwKLSAgeyAiZG91YmxlIiwgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZCd9LAotICB7ICJmbG9hdCIsICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJ30sCi0gIHsgImh3b3JkIiwgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAiaW50IiwgICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAotICB7ICJsb25nIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA0IH0sCi0gIHsgIm9jdGEiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgMTYgfSwKLSAgeyAicXVhZCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgOCB9LAotICB7ICJzaG9ydCIsICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgInNpbmdsZSIsICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2YnfSwKLSAgeyAic3RyaW5nIiwgICBtY29yZV9zdHJpbmdlciwgICAgICAgMSB9LAotICB7ICJ3b3JkIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0KLSAgLyogQWxsb3cgZm9yIHRoZSBlZmZlY3Qgb2Ygc2VjdGlvbiBjaGFuZ2VzLiAgKi8KLSAgeyAidGV4dCIsICAgICAgbWNvcmVfc190ZXh0LCAgICAwIH0sCi0gIHsgImRhdGEiLCAgICAgIG1jb3JlX3NfZGF0YSwgICAgMCB9LAotICB7ICJic3MiLCAgICAgICBtY29yZV9zX2JzcywgICAgIDEgfSwKLSNpZmRlZiBPQkpfRUYKLSAgeyAiY29tbSIsICAgICAgbWNvcmVfc19jb21tLCAgICAwIH0sCi0jZW5kaWYKLSAgeyAic2VjdGlvbiIsICAgbWNvcmVfc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3Rpb24ucyIsIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0IiwgICAgICBtY29yZV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdC5zIiwgICAgbWNvcmVfc19zZWN0aW9uLCAwIH0sCi0gIAotICB7IDAsICAgICAgICAgIDAsICAgICAgICAgICAgICAgIDAgfQotfTsKLQotc3RhdGljIHZvaWQKLW1jb3JlX3NfbGl0ZXJhbHMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW1jb3JlX2NvbnMgKG5ieXRlcykKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKiBwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnQgICAgY29tbWFzID0gMTsKLSAgICAgIAotICAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBjb21tYXMgb24gdGhlIGxpbmUuICAqLwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmUgWyogcHRyXSkKLQljb21tYXMgKz0gKiBwdHIgKysgPT0gJywnOwotICAgICAgCi0gICAgICBwb29sc3BhbiArPSBuYnl0ZXMgKiBjb21tYXM7Ci0gICAgfQotICAKLSAgY29ucyAobmJ5dGVzKTsKLQotICAvKiBJbiB0aGVvcnkgd2Ugb3VnaHQgdG8gY2FsbCBjaGVja19saXRlcmFscyAoMiwwKSBoZXJlIGluIGNhc2UKLSAgICAgd2UgbmVlZCB0byBkdW1wIHRoZSBsaXRlcmFsIHRhYmxlLiAgV2UgY2Fubm90IGRvIHRoaXMgaG93ZXZlciwKLSAgICAgYXMgdGhlIGRpcmVjdGl2ZXMgdGhhdCB3ZSBhcmUgaW50ZXJjZXB0aW5nIG1heSBiZSBiZWluZyB1c2VkCi0gICAgIHRvIGJ1aWxkIGEgc3dpdGNoIHRhYmxlLCBhbmQgd2UgbXVzdCBub3QgaW50ZXJmZXJlIHdpdGggaXRzCi0gICAgIGNvbnRlbnRzLiAgSW5zdGVhZCB3ZSBjcm9zcyBvdXIgZmluZ2VycyBhbmQgcHJheS4uLiAqLwotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfZmxvYXRfY29ucyAoZmxvYXRfdHlwZSkKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci17Ci0gIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICogcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ICAgIGNvbW1hcyA9IDE7Ci0KLSNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotI2Vycm9yIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TIG5vdCBoYW5kbGVkCi0jZW5kaWYKLSAgICAgIAotICAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBjb21tYXMgb24gdGhlIGxpbmUuICAqLwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmUgWyogcHRyXSkKLQljb21tYXMgKz0gKiBwdHIgKysgPT0gJywnOwotCi0gICAgICAvKiBXZSB3b3VsZCBsaWtlIHRvIGNvbXB1dGUgImhleF9mbG9hdCAoZmxvYXRfdHlwZSkgKiBjb21tYXMiCi0JIGJ1dCBoZXhfZmxvYXQgaXMgbm90IGV4cG9ydGVkIGZyb20gcmVhZC5jICAqLwotICAgICAgZmxvYXRfdHlwZSA9PSAnZicgPyA0IDogKGZsb2F0X3R5cGUgPT0gJ2QnID8gOCA6IDEyKTsKLSAgICAgIHBvb2xzcGFuICs9IGZsb2F0X3R5cGUgKiBjb21tYXM7Ci0gICAgfQotCi0gIGZsb2F0X2NvbnMgKGZsb2F0X3R5cGUpOwotICAKLSAgLyogU2VlIHRoZSBjb21tZW50IGluIG1jb3JlX2NvbnMgKCkgYWJvdXQgY2FsbGluZyBjaGVja19saXRlcmFscy4KLSAgICAgSXQgaXMgdW5saWtlbHkgdGhhdCBhIHN3aXRjaCB0YWJsZSB3aWxsIGJlIGNvbnN0cnVjdGVkIHVzaW5nCi0gICAgIGZsb2F0aW5nIHBvaW50IHZhbHVlcywgYnV0IGl0IGlzIHN0aWxsIGxpa2VseSB0aGF0IGFuIGluZGV4ZWQKLSAgICAgdGFibGUgb2YgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIGlzIGJlaW5nIGNyZWF0ZWQgYnkgdGhlc2UKLSAgICAgZGlyZWN0aXZlcywgc28gYWdhaW4gd2UgbXVzdCBub3QgaW50ZXJmZXJlIHdpdGggdGhlaXIgcGxhY2VtZW50LiAgKi8KLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX3N0cmluZ2VyIChhcHBlbmRfemVybykKLSAgICAgaW50IGFwcGVuZF96ZXJvOwotewotICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCi0gICAgewotICAgICAgY2hhciAqIHB0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIAotICAgICAgLyogSW4gdGhlb3J5IHdlIHNob3VsZCBjb21wdXRlIGhvdyBtYW55IGJ5dGVzIGFyZSBnb2luZyB0bwotCSBiZSBvY2N1cGllZCBieSB0aGUgc3RyaW5nKHMpIGFuZCBhZGQgdGhpcyB0byB0aGUgcG9vbHNwYW4uCi0JIFRvIGtlZXAgdGhpbmdzIHNpbXBsZSBob3dldmVyLCB3ZSBqdXN0IGFkZCB0aGUgbnVtYmVyIG9mCi0JIGJ5dGVzIGxlZnQgb24gdGhlIGN1cnJlbnQgbGluZS4gIFRoaXMgd2lsbCBiZSBhbiBvdmVyLQotCSBlc3RpbWF0ZSwgd2hpY2ggaXMgT0ssIGFuZCBhdXRvbWF0aWNhbGx5IGFsbG93cyBmb3IgdGhlCi0JIGFwcGVuZGluZyBhIHplcm8gYnl0ZSwgc2luY2UgdGhlIHJlYWwgc3RyaW5nKHMpIGlzL2FyZQotCSByZXF1aXJlZCB0byBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCi0JcHRyICsrOwotCi0gICAgICBwb29sc3BhbiArPSBwdHIgLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICAKLSAgc3RyaW5nZXIgKGFwcGVuZF96ZXJvKTsKLQotICAvKiBXZSBjYWxsIGNoZWNrX2xpdGVyYWxzIGhlcmUgaW4gY2FzZSBhIGxhcmdlIG51bWJlciBvZiBzdHJpbmdzIGFyZQotICAgICBiZWluZyBwbGFjZWQgaW50byB0aGUgdGV4dCBzZWN0aW9uIHdpdGggYSBzZXF1ZW5jZSBvZiBzdHJpbmdlcgotICAgICBkaXJlY3RpdmVzLiAgSW4gdGhlb3J5IHdlIGNvdWxkIGJlIHVwc2V0dGluZyBzb21ldGhpbmcgaWYgdGhlc2UKLSAgICAgc3RyaW5ncyBhcmUgYWN0dWFsbHkgaW4gYW4gaW5kZXhlZCB0YWJsZSBpbnN0ZWFkIG9mIHJlZmVyZW5jZWQgYnkKLSAgICAgaW5kaXZpZHVhbCBsYWJlbHMuICBMZXQgdXMgaG9wZSB0aGF0IHRoYXQgbmV2ZXIgaGFwcGVucy4gICovCi0gIGNoZWNrX2xpdGVyYWxzICgyLCAwKTsKLX0KLQotLyogSGFuZGxlIHRoZSBzZWN0aW9uIGNoYW5naW5nIHBzZXVkby1vcHMuICBUaGVzZSBjYWxsIHRocm91Z2ggdG8gdGhlCi0gICBub3JtYWwgaW1wbGVtZW50YXRpb25zLCBidXQgdGhleSBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgZmlyc3QuICAqLwotCi1zdGF0aWMgdm9pZAotbWNvcmVfc190ZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSNpZmRlZiBPQkpfRUxGCi0gIG9ial9lbGZfdGV4dCAoaWdub3JlKTsKLSNlbHNlCi0gIHNfdGV4dCAoaWdub3JlKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19kYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSNpZmRlZiBPQkpfRUxGCi0gIG9ial9lbGZfZGF0YSAoaWdub3JlKTsKLSNlbHNlCi0gIHNfZGF0YSAoaWdub3JlKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotCi0jaWZkZWYgT0JKX0VMRgotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfQ09GRgotICBvYmpfY29mZl9zZWN0aW9uIChpZ25vcmUpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zX2JzcyAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIAotICBzX2xjb21tX2J5dGVzIChuZWVkc19hbGlnbik7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZAotbWNvcmVfc19jb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgCi0gIG9ial9lbGZfY29tbW9uIChuZWVkc19hbGlnbik7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciBuZWVkcy4gICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBtY29yZV9vcGNvZGVfaW5mbyAqIG9wY29kZTsKLSAgY2hhciAqIHByZXZfbmFtZSA9ICIiOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IG1jb3JlX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSArKykKLSAgICB7Ci0gICAgICBpZiAoc3RyZXEgKHByZXZfbmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQl7Ci0JICAvKiBNYWtlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHN0cmluZy4gICovCi0JICBvcGNvZGUtPm5hbWUgPSBwcmV2X25hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByZXZfbmFtZSA9IG9wY29kZS0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGludCByZWdfbTsKLXN0YXRpYyBpbnQgcmVnX247Ci1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlOwkvKiBhYnNvbHV0ZSBleHByZXNzaW9uICovCi0KLS8qIEdldCBhIGxvZzIodmFsKS4gICovCi1zdGF0aWMgaW50Ci1sb2cyICh2YWwpCi0gICAgdW5zaWduZWQgaW50IHZhbDsKLXsKLSAgICBpbnQgbG9nID0gLTE7Ci0gICAgd2hpbGUgKHZhbCAhPSAwKQotICAgICAgewotICAgICAgICBsb2cgKys7Ci0gICAgICAgIHZhbCA+Pj0gMTsKLSAgICAgIH0KLSAgICAKLSAgICByZXR1cm4gbG9nOwotfQotCi0vKiBUcnkgdG8gcGFyc2UgYSByZWcgbmFtZS4gICovCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9yZWcgKHMsIHJlZykKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogcmVnOwotewotICAvKiBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArKyBzOwotICAKLSAgaWYgKHRvbG93ZXIgKHNbMF0pID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc1sxXSA9PSAnMScgJiYgc1syXSA+PSAnMCcgJiYgc1syXSA8PSAnNScpCi0JewotCSAgKnJlZyA9IDEwICsgc1syXSAtICcwJzsKLQkgIHJldHVybiBzICsgMzsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChzWzFdID49ICcwJyAmJiBzWzFdIDw9ICc5JykKLQl7Ci0JICAqcmVnID0gc1sxXSAtICcwJzsKLQkgIHJldHVybiBzICsgMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmICggICB0b2xvd2VyIChzWzBdKSA9PSAncycKLQkgICAmJiB0b2xvd2VyIChzWzFdKSA9PSAncCcKLQkgICAmJiAhIGlzYWxudW0gKHNbMl0pKQotICAgIHsKLSAgICAgICogcmVnID0gMDsKLSAgICAgIHJldHVybiBzICsgMjsKLSAgICB9Ci0gIAotICBhc19iYWQgKF8oInJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIpLCBzKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgQ3JlZ3MKLXsKLSAgY2hhciAqIG5hbWU7Ci0gIHVuc2lnbmVkIGludCBjcm51bTsKLX0KLWNyZWdzW10gPQotewotICB7ICJwc3IiLAkgMH0sCi0gIHsgInZiciIsCSAxfSwKLSAgeyAiZXBzciIsCSAyfSwKLSAgeyAiZnBzciIsCSAzfSwKLSAgeyAiZXBjIiwJIDR9LAotICB7ICJmcGMiLAkgNX0sCi0gIHsgInNzMCIsCSA2fSwKLSAgeyAic3MxIiwJIDd9LAotICB7ICJzczIiLAkgOH0sCi0gIHsgInNzMyIsCSA5fSwKLSAgeyAic3M0IiwJMTB9LAotICB7ICJnY3IiLAkxMX0sCi0gIHsgImdzciIsCTEyfSwKLSAgeyAiIiwJCSAwfQotfTsKLQotc3RhdGljIGNoYXIgKgotcGFyc2VfY3JlZyAocywgcmVnKQotICAgICBjaGFyICogczsKLSAgICAgdW5zaWduZWQgKiByZWc7Ci17Ci0gIGludCBpOwotCi0gIC8qIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHMpKQotICAgICsrczsKLSAgCi0gIGlmICgodG9sb3dlciAoc1swXSkgPT0gJ2MnICYmIHRvbG93ZXIgKHNbMV0pID09ICdyJykpCi0gICAgewotICAgICAgaWYgKHNbMl0gPT0gJzMnICYmIHNbM10gPj0gJzAnICYmIHNbM10gPD0gJzEnKQotCXsKLQkgICpyZWcgPSAzMCArIHNbM10gLSAnMCc7Ci0JICByZXR1cm4gcyArIDQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1syXSA9PSAnMicgJiYgc1szXSA+PSAnMCcgJiYgc1szXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IDIwICsgc1szXSAtICcwJzsKLQkgIHJldHVybiBzICsgNDsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChzWzJdID09ICcxJyAmJiBzWzNdID49ICcwJyAmJiBzWzNdIDw9ICc5JykKLQl7Ci0JICAqcmVnID0gMTAgKyBzWzNdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyA0OwotCX0KLSAgICAgIAotICAgICAgaWYgKHNbMl0gPj0gJzAnICYmIHNbMl0gPD0gJzknKQotCXsKLQkgICpyZWcgPSBzWzJdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyAzOwotCX0KLSAgICB9Ci0gIAotICAvKiBMb29rIGF0IGFsdGVybmF0ZSBjcmVnIG5hbWVzIGJlZm9yZSBnaXZpbmcgZXJyb3IuICAqLwotICBmb3IgKGkgPSAwOyBjcmVnc1tpXS5uYW1lWzBdICE9ICdcMCc7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZiBbMTBdOwotICAgICAgaW50ICBsZW5ndGg7Ci0gICAgICBpbnQgIGo7Ci0gICAgICAKLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoY3JlZ3NbaV0ubmFtZSk7Ci0gICAgICAKLSAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKLQlidWZbal0gPSB0b2xvd2VyIChzW2pdKTsKLSAgICAgIAotICAgICAgaWYgKHN0cm5jbXAgKGNyZWdzW2ldLm5hbWUsIGJ1ZiwgbGVuZ3RoKSA9PSAwKQotCXsKLQkgICpyZWcgPSBjcmVnc1tpXS5jcm51bTsKLQkgIHJldHVybiBzICsgbGVuZ3RoOwotCX0KLSAgICB9Ci0gIAotICBhc19iYWQgKF8oImNvbnRyb2wgcmVnaXN0ZXIgZXhwZWN0ZWQsIGJ1dCBzYXcgJyUuNnMnIiksIHMpOwotICAKLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2V4cCAocywgZSkKLSAgICAgY2hhciAqIHM7Ci0gICAgIGV4cHJlc3Npb25TICogZTsKLXsKLSAgY2hhciAqIHNhdmU7Ci0gIGNoYXIgKiBuZXc7Ci0KLSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0gICAgKysgczsKLSAgCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0KLSAgZXhwcmVzc2lvbiAoZSk7Ci0gIAotICBpZiAoZS0+WF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgCi0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgCi0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWtlX25hbWUgKHMsIHAsIG4pCi0gICAgIGNoYXIgKiBzOwotICAgICBjaGFyICogcDsKLSAgICAgaW50IG47Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotCi0gIHNbMF0gPSBwWzBdOwotICBzWzFdID0gcFsxXTsKLSAgc1syXSA9IHBbMl07Ci0gIHNbM10gPSBoZXhbKG4gPj4gMTIpICYgMHhGXTsKLSAgc1s0XSA9IGhleFsobiA+PiAgOCkgJiAweEZdOwotICBzWzVdID0gaGV4WyhuID4+ICA0KSAmIDB4Rl07Ci0gIHNbNl0gPSBoZXhbKG4pICAgICAgICYgMHhGXTsKLSAgc1s3XSA9IDA7Ci19Ci0KLSNkZWZpbmUgUE9PTF9FTkRfTEFCRUwgICAiLkxFIgotI2RlZmluZSBQT09MX1NUQVJUX0xBQkVMICIuTFMiCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2xpdGVyYWxzIChpc2ZvcmNlKQotICAgICBpbnQgaXNmb3JjZTsKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBsaXRlcmFsICogcDsKLSAgc3ltYm9sUyAqIGJyYXJzeW07Ci0gIAotICBpZiAocG9vbHNpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogTXVzdCB3ZSBicmFuY2ggYXJvdW5kIHRoZSBsaXRlcmFsIHRhYmxlPyAqLwotICBpZiAoaXNmb3JjZSkKLSAgICB7Ci0gICAgICBjaGFyICogb3V0cHV0OwotICAgICAgY2hhciBicmFybmFtZVs4XTsKLSAgICAgIAotICAgICAgbWFrZV9uYW1lIChicmFybmFtZSwgUE9PTF9FTkRfTEFCRUwsIHBvb2xudW1iZXIpOwotICAgICAgCi0gICAgICBicmFyc3ltID0gc3ltYm9sX21ha2UgKGJyYXJuYW1lKTsKLSAgICAgIAotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoYnJhcnN5bSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoLAotCQkJIEMgKFVOQ0RfSlVNUCwgMCksIGJyYXJzeW0sIDAsIDApOwotICAgICAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoTUNPUkVfSU5TVF9CUik7CS8qIGJyIC4reHh4ICovCi0gICAgICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChNQ09SRV9JTlNUX0JSKTsKLSAgICB9Ci0gICAgICAKLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHNlY3Rpb24gaXMgc3VmZmljaWVudGx5IGFsaWduZWQgYW5kIHRoYXQKLSAgICAgdGhlIGxpdGVyYWwgdGFibGUgaXMgYWxpZ25lZCB3aXRoaW4gaXQuICAqLwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAyKTsKLSAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0gIAotICBjb2xvbiAoU19HRVRfTkFNRSAocG9vbHN5bSkpOwotICAKLSAgZm9yIChpID0gMCwgcCA9IGxpdHBvb2w7IGkgPCBwb29sc2l6ZTsgaSsrLCBwKyspCi0gICAgZW1pdF9leHByICgmIHAtPmUsIDQpOwotICAKLSAgaWYgKGlzZm9yY2UpCi0gICAgY29sb24gKFNfR0VUX05BTUUgKGJyYXJzeW0pKTsKLSAgCi0gICBwb29sc2l6ZSA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19saXRlcmFscyAoa2luZCwgb2Zmc2V0KQotICAgICBpbnQga2luZDsKLSAgICAgaW50IG9mZnNldDsKLXsKLSAgcG9vbHNwYW4gKz0gb2Zmc2V0OwotICAgIAotICAvKiBTUEFOQ0xPU0UgYW5kIFNQQU5FWElUIGFyZSBzbWFsbGVyIG51bWJlcnMgdGhhbiBTUEFOUEFOSUMuCi0gICAgIFNQQU5QQU5JQyBtZWFucyB0aGF0IHdlIG11c3QgZHVtcCBub3cuCi0gICAgIGtpbmQgPT0gMCBpcyBhbnkgb2xkIGluc3RydWN0aW9uLgotICAgICBraW5kICA+IDAgbWVhbnMgd2UganVzdCBoYWQgYSBjb250cm9sIHRyYW5zZmVyIGluc3RydWN0aW9uLgotICAgICBraW5kID09IDEgbWVhbnMgd2l0aGluIGEgZnVuY3Rpb24KLSAgICAga2luZCA9PSAyIG1lYW5zIHdlIGp1c3QgbGVmdCBhIGZ1bmN0aW9uCi0gICAgCi0gICAgIFRoZSBkdW1wX2xpdGVyYWxzICgxKSBjYWxsIGluc2VydHMgYSBicmFuY2ggYXJvdW5kIHRoZSB0YWJsZSwgc28KLSAgICAgd2UgZmlyc3QgbG9vayB0byBzZWUgaWYgaXRzIGEgc2l0dWF0aW9uIHdoZXJlIHdlIHdvbid0IGhhdmUgdG8KLSAgICAgaW5zZXJ0IGEgYnJhbmNoIChlLmcuLCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGFuIHVuY29uZGl0aW9uYWwKLSAgICAgYnJhbmNoKS4KLSAgICAKLSAgICAgU1BBTlBBTklDIGlzIHRoZSBwb2ludCB3aGVyZSB3ZSBtdXN0IGR1bXAgYSBzaW5nbGUtZW50cnkgcG9vbC4KLSAgICAgaXQgYWNjb3VudHMgZm9yIGFsaWdubWVudHMgYW5kIGFuIGluc2VydGVkIGJyYW5jaC4KLSAgICAgdGhlICdwb29sc2l6ZSoyJyBhY2NvdW50cyBmb3IgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGRvOgotICAgICAgIGxydyByMSxsaXQxOyBscncgcjIsbGl0MjsgbHJ3IHIzLGxpdDMKLSAgICAgTm90ZSB0aGF0IHRoZSAnbGl0MicgcmVmZXJlbmNlIGlzIDIgYnl0ZXMgZnVydGhlciBhbG9uZwotICAgICBidXQgdGhlIGxpdGVyYWwgaXQgcmVmZXJlbmNlcyB3aWxsIGJlIDQgYnl0ZXMgZnVydGhlciBhbG9uZywKLSAgICAgc28gd2UgbXVzdCBjb25zaWRlciB0aGUgcG9vbHNpemUgaW50byB0aGlzIGVxdWF0aW9uLgotICAgICBUaGlzIGlzIHNsaWdodGx5IG92ZXItY2F1dGlvdXMsIGJ1dCBndWFyYW50ZWVzIHRoYXQgd2Ugd29uJ3QKLSAgICAgcGFuaWMgYmVjYXVzZSBhIHJlbG9jYXRpb24gaXMgdG9vIGRpc3RhbnQuICAqLwotICAKLSAgaWYgKHBvb2xzcGFuID4gU1BBTkNMT1NFICYmIGtpbmQgPiAwKQotICAgIGR1bXBfbGl0ZXJhbHMgKDApOwotICBlbHNlIGlmIChwb29sc3BhbiA+IFNQQU5FWElUICYmIGtpbmQgPiAxKQotICAgIGR1bXBfbGl0ZXJhbHMgKDApOwotICBlbHNlIGlmIChwb29sc3BhbiA+PSAoU1BBTlBBTklDIC0gcG9vbHNpemUgKiAyKSkKLSAgICBkdW1wX2xpdGVyYWxzICgxKTsKLX0KLQotc3RhdGljIGludAotZW50ZXJfbGl0ZXJhbCAoZSwgaXNwY3JlbCkKLSAgICAgZXhwcmVzc2lvblMgKiBlOwotICAgICBpbnQgaXNwY3JlbDsKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBsaXRlcmFsICogcDsKLQotICBpZiAocG9vbHNpemUgPj0gTUFYX1BPT0xfU0laRSAtIDIpCi0gICAgewotICAgICAgLyogVGhlIGxpdGVyYWwgcG9vbCBpcyBhcyBmdWxsIGFzIHdlIGNhbiBoYW5kbGUuIFdlIGhhdmUKLSAgICAgICAgIHRvIGJlIDIgZW50cmllcyBzaHkgb2YgdGhlIDEwMjQvND0yNTYgZW50cmllcyBiZWNhdXNlIHdlCi0gICAgICAgICBoYXZlIHRvIGFsbG93IGZvciB0aGUgYnJhbmNoICgyIGJ5dGVzKSBhbmQgdGhlIGFsaWdubWVudAotICAgICAgICAgKDIgYnl0ZXMgYmVmb3JlIHRoZSBmaXJzdCBpbnNuIHJlZmVyZW5jaW5nIHRoZSBwb29sIGFuZAotICAgICAgICAgMiBieXRlcyBiZWZvcmUgdGhlIHBvb2wgaXRzZWxmKSA9PSA2IGJ5dGVzLCByb3VuZHMgdXAKLSAgICAgICAgIHRvIDIgZW50cmllcy4gICovIAotICAgICAgZHVtcF9saXRlcmFscyAoMSk7Ci0gICAgfQotCi0gIGlmIChwb29sc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBuZXcgbGl0ZXJhbCBwb29sLiAgKi8KLSAgICAgIGlmICgrKyBwb29sbnVtYmVyID4gMHhGRkZGKQotCWFzX2ZhdGFsIChfKCJtb3JlIHRoYW4gNjVLIGxpdGVyYWwgcG9vbHMiKSk7Ci0gICAgICAKLSAgICAgIG1ha2VfbmFtZSAocG9vbG5hbWUsIFBPT0xfU1RBUlRfTEFCRUwsIHBvb2xudW1iZXIpOwotICAgICAgcG9vbHN5bSA9IHN5bWJvbF9tYWtlIChwb29sbmFtZSk7Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChwb29sc3ltKTsKLSAgICAgIHBvb2xzcGFuID0gMDsKLSAgICB9Ci0gIAotICAvKiBTZWFyY2ggcG9vbCBmb3IgdmFsdWUgc28gd2UgZG9uJ3QgaGF2ZSBkdXBsaWNhdGVzLiAgKi8KLSAgZm9yIChwID0gbGl0cG9vbCwgaSA9IDA7IGkgPCBwb29sc2l6ZTsgaSsrLCBwKyspCi0gICAgewotICAgICAgaWYgKGUtPlhfb3AgPT0gcC0+ZS5YX29wCi0JICAmJiBlLT5YX2FkZF9zeW1ib2wgPT0gcC0+ZS5YX2FkZF9zeW1ib2wKLQkgICYmIGUtPlhfYWRkX251bWJlciA9PSBwLT5lLlhfYWRkX251bWJlcgotCSAgJiYgaXNwY3JlbCA9PSBwLT5pc3BjcmVsKQotCXsKLQkgIHAtPnJlZmNudCArKzsKLQkgIHJldHVybiBpOwotCX0KLSAgICB9Ci0KLSAgcC0+cmVmY250ICA9IDE7Ci0gIHAtPmlzcGNyZWwgPSBpc3BjcmVsOwotICBwLT5lICAgICAgID0gKiBlOwotICAKLSAgcG9vbHNpemUgKys7Ci0KLSAgcmV0dXJuIGk7ICAgCi19Ci0KLS8qIFBhcnNlIGEgbGl0ZXJhbCBzcGVjaWZpY2F0aW9uLiAtLSBlaXRoZXIgbmV3IG9yIG9sZCBzeW50YXguCi0gICBvbGQgc3ludGF4OiB0aGUgdXNlciBzdXBwbGllcyB0aGUgbGFiZWwgYW5kIHBsYWNlcyB0aGUgbGl0ZXJhbC4KLSAgIG5ldyBzeW50YXg6IHdlIHB1dCBpdCBpbnRvIHRoZSBsaXRlcmFsIHBvb2wuICAqLwotc3RhdGljIGNoYXIgKgotcGFyc2VfcnQgKHMsIG91dHB1dHAsIGlzcGNyZWwsIGVwKQotICAgICBjaGFyICogczsKLSAgICAgY2hhciAqKiBvdXRwdXRwOwotICAgICBpbnQgaXNwY3JlbDsKLSAgICAgZXhwcmVzc2lvblMgKiBlcDsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLSAgaW50IG47Ci0gIAotICBpZiAoZXApCi0gICAgLyogSW5kaWNhdGUgbm90aGluZyB0aGVyZS4gICovCi0gICAgZXAtPlhfb3AgPSBPX2Fic2VudDsKLSAgCi0gIGlmICgqcyA9PSAnWycpCi0gICAgewotICAgICAgcyA9IHBhcnNlX2V4cCAocyArIDEsICYgZSk7Ci0gICAgICAKLSAgICAgIGlmICgqcyA9PSAnXScpCi0JcysrOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygibWlzc2luZyAnXSciKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcyA9IHBhcnNlX2V4cCAocywgJiBlKTsKLSAgICAgIAotICAgICAgbiA9IGVudGVyX2xpdGVyYWwgKCYgZSwgaXNwY3JlbCk7Ci0gICAgICAKLSAgICAgIGlmIChlcCkKLQkqZXAgPSBlOwotCi0gICAgICAvKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gcG9vbCBlbnRyeS4gICovCi0gICAgICBlLlhfb3AgICAgICAgICA9IE9fc3ltYm9sOwotICAgICAgZS5YX2FkZF9zeW1ib2wgPSBwb29sc3ltOwotICAgICAgZS5YX2FkZF9udW1iZXIgPSBuIDw8IDI7Ci0gICAgfQotICAKLSAgKiBvdXRwdXRwID0gZnJhZ19tb3JlICgyKTsKLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csICgqb3V0cHV0cCkgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwgJiBlLCAxLAotCSAgICAgICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCk7Ci0KLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2ltbSAocywgdmFsLCBtaW4sIG1heCkKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogdmFsOwotICAgICB1bnNpZ25lZCBtaW47Ci0gICAgIHVuc2lnbmVkIG1heDsKLXsKLSAgY2hhciAqIG5ldzsKLSAgZXhwcmVzc2lvblMgZTsKLSAgCi0gIG5ldyA9IHBhcnNlX2V4cCAocywgJiBlKTsKLSAgCi0gIGlmIChlLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgOyAvKiBBbiBlcnJvciBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gZW1pdHRlZC4gICovCi0gIGVsc2UgaWYgKGUuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGEgY29uc3RhbnQiKSk7Ci0gIGVsc2UgaWYgKGUuWF9hZGRfbnVtYmVyIDwgbWluIHx8IGUuWF9hZGRfbnVtYmVyID4gbWF4KQotICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCwgbm90ICVkIiksCi0JICAgIG1pbiwgbWF4LCBlLlhfYWRkX251bWJlcik7Ci0KLSAgKiB2YWwgPSBlLlhfYWRkX251bWJlcjsKLSAgCi0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX21lbSAocywgcmVnLCBvZmYsIHNpeikKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogcmVnOwotICAgICB1bnNpZ25lZCAqIG9mZjsKLSAgICAgdW5zaWduZWQgc2l6OwotewotICBjaGFyICogbmV3OwotCi0gICogb2ZmID0gMDsKLSAgCi0gIHdoaWxlIChpc3NwYWNlICgqIHMpKQotICAgICsrIHM7Ci0gICAgICAKLSAgaWYgKCogcyA9PSAnKCcpCi0gICAgewotICAgICAgcyA9IHBhcnNlX3JlZyAocyArIDEsIHJlZyk7Ci0KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHMpKQotCSsrIHM7Ci0gICAgICAKLSAgICAgIGlmICgqIHMgPT0gJywnKQotCXsKLQkgIHMgPSBwYXJzZV9pbW0gKHMgKyAxLCBvZmYsIDAsIDYzKTsKLQkgIAotCSAgaWYgKHNpeiA+IDEpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ID4gMikKLQkJewotCQkgIGlmICgqIG9mZiAmIDB4MykKLQkJICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpKTsKLQkJICAKLQkJICAqIG9mZiA+Pj0gMjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgqIG9mZiAmIDB4MSkKLQkJICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiIpKTsKLQkJICAKLQkJICAqIG9mZiA+Pj0gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLQkrKyBzOwotICAgICAgCi0gICAgICBpZiAoKiBzID09ICcpJykKLQlzICsrOwotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygiYmFzZSByZWdpc3RlciBleHBlY3RlZCIpKTsKLSAgCi0gIHJldHVybiBzOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgY2hhciAqIG9wX3N0YXJ0OwotICBjaGFyICogb3BfZW5kOwotICBtY29yZV9vcGNvZGVfaW5mbyAqIG9wY29kZTsKLSAgY2hhciAqIG91dHB1dDsKLSAgaW50IG5sZW4gPSAwOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0OwotICB1bnNpZ25lZCByZWc7Ci0gIHVuc2lnbmVkIG9mZjsKLSAgdW5zaWduZWQgaXNpemU7Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIGNoYXIgbmFtZVsyMF07Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotICAgIHN0ciArKzsKLQotICAvKiBGaW5kIHRoZSBvcCBjb2RlIGVuZC4gICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSBzdHI7Ci0gICAgICAgKiBvcF9lbmQgJiYgbmxlbiA8IDIwICYmICFpc19lbmRfb2ZfbGluZSBbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgbmFtZVtubGVuXSA9IG9wX3N0YXJ0W25sZW5dOwotICAgICAgbmxlbisrOwotICAgIH0KLSAgCi0gIG5hbWUgW25sZW5dID0gMDsKLSAgCi0gIGlmIChubGVuID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG9wY29kZSA9IChtY29yZV9vcGNvZGVfaW5mbyAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG5hbWUpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaW5zdCA9IG9wY29kZS0+aW5zdDsKLSAgaXNpemUgPSAyOwotICAKLSAgc3dpdGNoIChvcGNvZGUtPm9wY2xhc3MpCi0gICAgewotICAgIGNhc2UgTzA6Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9UOgotICAgICAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTzE6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBKTVA6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIC8qIEluIGEgc2lmaWx0ZXIgbW9kZSwgd2UgZW1pdCB0aGlzIGluc24gMiB0aW1lcywKLSAgICAgICAgIGZpeGVzIHByb2JsZW0gb2YgYW4gaW50ZXJydXB0IGR1cmluZyBhIGptcC4uICovCi0gICAgICBpZiAoc2lmaWx0ZXJfbW9kZSkKLQl7Ci0JICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLQkgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSlNSOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgPT0gMTUpCi0JYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyOiByMTUgaWxsZWdhbCIpKTsKLSAgICAgIAotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgCi0gICAgICBpZiAoc2lmaWx0ZXJfbW9kZSkKLQl7Ci0JICAvKiBSZXBsYWNlIHdpdGg6ICBic3IgLisyIDsgYWRkaSByMTUsNjsgam1wIHJ4IDsgam1wIHJ4ICovCi0JICBpbnN0ID0gTUNPUkVfSU5TVF9CU1I7CS8qIHdpdGggMCBkaXNwbGFjZW1lbnQgKi8KLQkgIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotCSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0KLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JICBpbnN0ID0gTUNPUkVfSU5TVF9BRERJOwotCSAgaW5zdCB8PSAxNTsJCQkvKiBhZGRpIHIxNSw2ICovCi0JICBpbnN0IHw9ICg2IC0gMSkgPDwgNDsJCS8qIG92ZXIgdGhlIGptcCdzICovCi0JICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLQkgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotCi0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCSAgaW5zdCA9IE1DT1JFX0lOU1RfSk1QIHwgcmVnOwotCSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0JICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLQotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsJCS8qIDJuZCBlbWl0dGVkIGluIGZhbGx0aHJ1ICovCi0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9DOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9jcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPMjoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFgxOgkvKiBIYW5kbGUgYm90aCBzeW50YXgtPiB4dHJiLSByMSxyeCBPUiB4dHJiLSByeCAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQkvKiB4dHJiLSByMSxyeCAqLwotCXsKLQkgIGlmIChyZWcgIT0gMSkKLQkgICAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiByZWdpc3RlciBtdXN0IGJlIHIxIikpOwotCSAgCi0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQl9Ci0gICAgICAKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPMVIxOiAgLyogZGl2LSByeCxyMSAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICBpZiAocmVnICE9IDEpCi0JICAgIGFzX2JhZCAoXygic291cmNlIHJlZ2lzdGVyIG11c3QgYmUgcjEiKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPSToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMyKTsKLQkgIGluc3QgfD0gKHJlZyAtIDEpIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQjoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDMxKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQjI6CQkvKiBsaWtlIE9CLCBidXQgYXJnIGlzIDJebiBpbnN0ZWFkIG9mIG4gKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDEgPDwgMzEpOwotCSAgLyogRnVydGhlciByZXN0cmljdCB0aGUgaW1tZWRpYXRlIHRvIGEgcG93ZXIgb2YgdHdvLiAqLwotCSAgaWYgKChyZWcgJiAocmVnIC0gMSkpID09IDApCi0JICAgIHJlZyA9IGxvZzIgKHJlZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWcgPSAwOwotCSAgICAgIGFzX2JhZCAoXygiaW1tZWRpYXRlIGlzIG5vdCBhIHBvd2VyIG9mIHR3byIpKTsKLQkgICAgfQotCSAgaW5zdCB8PSAocmVnKSA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0JSYToJLyogU3BlY2lmaWMgZm9yIGJnZW5pOiBpbW0gb2YgMC0+NiB0cmFuc2xhdGUgdG8gbW92aS4gKi8KLSAgICBjYXNlIE9CUmI6Ci0gICAgY2FzZSBPQlJjOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMzEpOwotCSAgLyogaW1tZWRpYXRlIHZhbHVlcyBvZiAwIC0+IDYgdHJhbnNsYXRlIHRvIG1vdmkgKi8KLQkgIGlmIChyZWcgPD0gNikKLQkgICAgewotCSAgICAgIGluc3QgPSAoaW5zdCAmIDB4RikgfCBNQ09SRV9JTlNUX0JHRU5JX0FMVDsKLQkgICAgICByZWcgPSAweDEgPDwgcmVnOwotCSAgICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIGJnZW5pIHRvIG1vdmkiKSk7Ci0JICAgIH0KLQkgIGluc3QgJj0gfiAweDAxZjA7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0JSMjoJLyogbGlrZSBPQlIsIGJ1dCBhcmcgaXMgMl5uIGluc3RlYWQgb2YgbiAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMSA8PCAzMSk7Ci0JICAKLQkgIC8qIEZ1cnRoZXIgcmVzdHJpY3QgdGhlIGltbWVkaWF0ZSB0byBhIHBvd2VyIG9mIHR3by4gICovCi0JICBpZiAoKHJlZyAmIChyZWcgLSAxKSkgPT0gMCkKLQkgICAgcmVnID0gbG9nMiAocmVnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlZyA9IDA7Ci0JICAgICAgYXNfYmFkIChfKCJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIikpOwotCSAgICB9Ci0JICAKLQkgIC8qIEltbWVkaWF0ZSB2YWx1ZXMgb2YgMCAtPiA2IHRyYW5zbGF0ZSB0byBtb3ZpLiAqLwotCSAgaWYgKHJlZyA8PSA2KQotCSAgICB7Ci0JICAgICAgaW5zdCA9IChpbnN0ICYgMHhGKSB8IE1DT1JFX0lOU1RfQkdFTklfQUxUOwotCSAgICAgIHJlZyA9IDB4MSA8PCByZWc7Ci0JICAgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgbWdlbmkgdG8gbW92aSIpKTsKLQkgICAgfQotCSAgCi0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT01hOgkvKiBTcGVjaWZpYyBmb3IgYm1hc2tpOiBpbW0gMS0+NyB0cmFuc2xhdGUgdG8gbW92aS4gICovCi0gICAgY2FzZSBPTWI6Ci0gICAgY2FzZSBPTWM6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMik7Ci0JICAKLQkgIC8qIEltbWVkaWF0ZSB2YWx1ZXMgb2YgMSAtPiA3IHRyYW5zbGF0ZSB0byBtb3ZpLiAqLwotCSAgaWYgKHJlZyA8PSA3KQotCSAgICB7Ci0JICAgICAgaW5zdCA9IChpbnN0ICYgMHhGKSB8IE1DT1JFX0lOU1RfQk1BU0tJX0FMVDsKLQkgICAgICByZWcgPSAoMHgxIDw8IHJlZykgLSAxOwotCSAgICAgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JICAgICAgCi0JICAgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgYm1hc2tpIHRvIG1vdmkiKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc3QgJj0gfiAweDAxRjA7Ci0JICAgICAgaW5zdCB8PSAocmVnICYgMHgxRikgPDwgNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0k6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSTc6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAweDdGKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBMUzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWcgPDwgODsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgaW50IHNpemU7Ci0JICAKLQkgIGlmICgoaW5zdCAmIDB4NjAwMCkgPT0gMCkKLQkgICAgc2l6ZSA9IDQ7Ci0JICBlbHNlIGlmICgoaW5zdCAmIDB4NjAwMCkgPT0gMHg0MDAwKQotCSAgICBzaXplID0gMjsKLQkgIGVsc2UgaWYgKChpbnN0ICYgMHg2MDAwKSA9PSAweDIwMDApCi0JICAgIHNpemUgPSAxOwotCSAgCi0JICBvcF9lbmQgPSBwYXJzZV9tZW0gKG9wX2VuZCArIDEsICYgcmVnLCAmIG9mZiwgc2l6ZSk7Ci0JICAKLQkgIGlmIChvZmYgPiAxNikKLQkgICAgYXNfYmFkIChfKCJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlICglZCkiKSwgb2ZmKTsKLQkgIGVsc2UKLQkgICAgaW5zdCB8PSAocmVnKSB8IChvZmYgPDwgNCk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBMUjoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICBpZiAocmVnID09IDAgfHwgcmVnID09IDE1KQotCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlcjogcjAgYW5kIHIxNSBpbGxlZ2FsIikpOwotICAgICAgCi0gICAgICBpbnN0IHw9IChyZWcgPDwgOCk7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCS8qIHBhcnNlX3J0IGNhbGxzIGZyYWdfbW9yZSgpIGZvciB1cy4gICovCi0JaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfcnQgKG9wX2VuZCArIDEsICYgb3V0cHV0LCAwLCAwKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwkJLyogc2F2ZSBpdHMgc3BhY2UgKi8KLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTEo6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9ydCAob3BfZW5kICsgMSwgJiBvdXRwdXQsIDEsIDApOwotICAgICAgLyogcGFyc2VfcnQoKSBjYWxscyBmcmFnX21vcmUoKSBmb3IgdXMuICAqLwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJNOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgPT0gMCB8fCByZWcgPT0gMTUpCi0JYXNfYmFkIChfKCJiYWQgc3RhcnRpbmcgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaW52YWxpZCIpKTsKLSAgICAgIAotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJy0nKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgCi0JICBpZiAocmVnICE9IDE1KQotCSAgICBhc19iYWQgKF8oImVuZGluZyByZWdpc3RlciBtdXN0IGJlIHIxNSIpKTsKLQkgIAotCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JICAgICsrIG9wX2VuZDsKLQl9Ci0gICAgICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kICsrOwotCSAgCi0JICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkgICAgKysgb3BfZW5kOwotICAKLQkgIGlmICgqIG9wX2VuZCA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgICAgICAKLQkgICAgICBpZiAocmVnICE9IDApCi0JCWFzX2JhZCAoXygiYmFkIGJhc2UgcmVnaXN0ZXI6IG11c3QgYmUgcjAiKSk7Ci0JICAgICAgCi0JICAgICAgaWYgKCogb3BfZW5kID09ICcpJykKLQkJb3BfZW5kICsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiYmFzZSByZWdpc3RlciBleHBlY3RlZCIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJROgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgIT0gNCkKLQlhc19mYXRhbCAoXygiZmlyc3QgcmVnaXN0ZXIgbXVzdCBiZSByNCIpKTsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLScpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICAKLQkgIGlmIChyZWcgIT0gNykKLQkgICAgYXNfZmF0YWwgKF8oImxhc3QgcmVnaXN0ZXIgbXVzdCBiZSByNyIpKTsKLQkgIAotCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JICAgICsrIG9wX2VuZDsKLSAgCi0JICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCSAgICB7Ci0JICAgICAgb3BfZW5kICsrOwotCSAgICAgIAotCSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkJKysgb3BfZW5kOwotICAKLQkgICAgICBpZiAoKiBvcF9lbmQgPT0gJygnKQotCQl7Ci0JCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JCSAgCi0JCSAgaWYgKHJlZyA+PSA0ICYmIHJlZyA8PSA3KQotCQkgICAgYXNfZmF0YWwgKCJiYXNlIHJlZ2lzdGVyIGNhbm5vdCBiZSByNCwgcjUsIHI2LCBvciByNyIpOwotCQkgIAotCQkgIGluc3QgfD0gcmVnOwotCQkgIAotCQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkJICAgICsrIG9wX2VuZDsKLQkJICAKLQkJICBpZiAoKiBvcF9lbmQgPT0gJyknKQotCQkgICAgb3BfZW5kICsrOwotCQl9Ci0JICAgICAgZWxzZQotCQlhc19iYWQgKF8oImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInJlZy1yZWcgZXhwZWN0ZWQiKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQlI6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICAKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgb3V0cHV0LWZyYWdfbm93LT5mcl9saXRlcmFsLCAKLQkJICAgMiwgJiBlLCAxLCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJMOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZyA8PCA0OwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCSAgCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIG91dHB1dC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgCi0JCSAgICAgICAyLCAmIGUsIDEsIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSkM6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQzMildLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMTIpXS5ybHhfbGVuZ3RoLAotCQkJIEMgKENPTkRfSlVNUCwgMCksIGUuWF9hZGRfc3ltYm9sLCBlLlhfYWRkX251bWJlciwgMCk7Ci0gICAgICBpc2l6ZSA9IEMzMl9MRU47Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSlU6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICBvdXRwdXQgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoLAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aCwKLQkJCSBDIChVTkNEX0pVTVAsIDApLCBlLlhfYWRkX3N5bWJvbCwgZS5YX2FkZF9udW1iZXIsIDApOwotICAgICAgaXNpemUgPSBVMzJfTEVOOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpMOgotICAgICAgaW5zdCA9IE1DT1JFX0lOU1RfSlNSSTsJCS8qIGpzcmkgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX3J0IChvcF9lbmQgKyAxLCAmIG91dHB1dCwgMSwgJiBlKTsKLSAgICAgIC8qIHBhcnNlX3J0KCkgY2FsbHMgZnJhZ19tb3JlIGZvciB1cyAqLwotICAgICAgCi0gICAgICAvKiBPbmx5IGRvIHRoaXMgaWYgd2Uga25vdyBob3cgdG8gZG8gaXQgLi4uICovCi0gICAgICBpZiAoZS5YX29wICE9IE9fYWJzZW50ICYmIGRvX2pzcmkyYnNyKQotCXsKLQkgIC8qIExvb2sgYXQgYWRkaW5nIHRoZSBSX1BDUkVMX0pTUklNTTExQlkyLiAgKi8KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgb3V0cHV0LWZyYWdfbm93LT5mcl9saXRlcmFsLCAKLQkJICAgICAgIDIsICYgZSwgMSwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJTSToJCQkJLyogU0ksIGJ1dCBpbW0gYmVjb21lcyAzMi1pbW0gKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKLQkgIAotCSAgcmVnID0gMzIgLSByZWc7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgRE8yMToJCQkvKiBPMiwgZHVwIHJkLCBsaXQgbXVzdCBiZSAxICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgaW5zdCB8PSByZWcgPDwgNDsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOwotCSAgCi0JICBpZiAocmVnICE9IDEpCi0JICAgIGFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbXVzdCBiZSAxIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0lhOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOwotCi0JICBpZiAocmVnID09IDApCi0JICAgIGFzX2JhZCAoXygiemVybyB1c2VkIGFzIGltbWVkaWF0ZSB2YWx1ZSIpKTsKLQkgIAotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJ1bmltcGxlbWVudGVkIG9wY29kZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgfQotICAKLSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0gIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotICAKLSAgY2hlY2tfbGl0ZXJhbHMgKG9wY29kZS0+dHJhbnNmZXIsIGlzaXplKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICAgIGNoYXIgKiBuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfbWNvcmVfZW5kICgpCi17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheS4gICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICogbGl0UDsKLSAgICAgaW50ICogc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGludCAgICBpOwotICBjaGFyICogdDsKLSAgY2hhciAqIGF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIpOwotICAgIH0KLSAgCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICAKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIAotICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgICB7Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKLQkJCSAgICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotDAotQ09OU1QgY2hhciAqIG1kX3Nob3J0b3B0cyA9ICIiOwotCi0jZGVmaW5lIE9QVElPTl9KU1JJMkJTUl9PTgkoT1BUSU9OX01EX0JBU0UgKyAwKQotI2RlZmluZSBPUFRJT05fSlNSSTJCU1JfT0ZGCShPUFRJT05fTURfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TSUZJTFRFUl9PTgkoT1BUSU9OX01EX0JBU0UgKyAyKQotI2RlZmluZSBPUFRJT05fU0lGSUxURVJfT0ZGCShPUFRJT05fTURfQkFTRSArIDMpCi0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHsgIm5vLWpzcmkyYnNyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9KU1JJMkJTUl9PRkZ9LAotICB7ICJqc3JpMmJzciIsICAgIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSlNSSTJCU1JfT059LAotICB7ICJzaWZpbHRlciIsICAgIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0lGSUxURVJfT059LAotICB7ICJuby1zaWZpbHRlciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0lGSUxURVJfT0ZGfSwKLSAgeyBOVUxMLCAgICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICogYXJnOwotewotICBpbnQgaTsKLSAgY2hhciAqIHA7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICAgIAotICAgIGNhc2UgT1BUSU9OX0pTUkkyQlNSX09OOiAgZG9fanNyaTJic3IgPSAxOyAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0pTUkkyQlNSX09GRjogZG9fanNyaTJic3IgPSAwOyAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NJRklMVEVSX09OOiAgc2lmaWx0ZXJfbW9kZSA9IDE7IGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NJRklMVEVSX09GRjogc2lmaWx0ZXJfbW9kZSA9IDA7IGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKiBzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcblwKLSAgLXtuby19anNyaTJic3IJICB7ZGlzfWFibGUganNyaSB0byBic3IgdHJhbnNmb3JtYXRpb24gKGRlZjogZGlzKVxuXAotICAte25vLX1zaWZpbHRlcgkgIHtkaXN9YWJsZSBzaWxpY29uIGZpbHRlciBiZWhhdmlvciAoZGVmOiBkaXMpIikpOwotfQotDAotaW50IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9OZGRyLCB0b19OZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKiBwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fTmRkcjsKLSAgICAgYWRkcmVzc1QgdG9fTmRkcjsKLSAgICAgZnJhZ1MgKiBmcmFnOwotICAgICBzeW1ib2xTICogdG9fc3ltYm9sOwotewotICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjazogc2hvcnRfanVtcCIpKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX05kZHIsIHRvX05kZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqIHB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9OZGRyOwotICAgICBhZGRyZXNzVCB0b19OZGRyOwotICAgICBmcmFnUyAqIGZyYWc7Ci0gICAgIHN5bWJvbFMgKiB0b19zeW1ib2w7Ci17Ci0gIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrOiBsb25nX2p1bXAiKSk7Ci19Ci0KLS8qIENhbGxlZCBhZnRlciByZWxheGluZywgY2hhbmdlIHRoZSBmcmFncyBzbyB0aGV5IGtub3cgaG93IGJpZyB0aGV5IGFyZS4gICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqIGZyYWdQOwotewotICB1bnNpZ25lZCBjaGFyICogYnVmZmVyOwotICBpbnQgdGFyZ19hZGRyID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgCi0gIGJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotICB0YXJnX2FkZHIgKz0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzczsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDEyKToKLSAgICBjYXNlIEMgKFVOQ0RfSlVNUCwgVU5DRDEyKToKLSAgICAgIHsKLQkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLQlpbnQgbmV4dF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzICsgMjsKLQl1bnNpZ25lZCBjaGFyIHQwOwotCWludCBkaXNwID0gdGFyZ19hZGRyIC0gbmV4dF9pbnN0OwotCQotCWlmIChkaXNwICYgMSkKLQkgIGFzX2JhZCAoXygib2RkIGRpc3BsYWNlbWVudCBhdCAleCIpLCBuZXh0X2luc3QgLSAyKTsKLQkKLQlkaXNwID4+PSAxOwotCSAgewotCSAgICB0MCA9IGJ1ZmZlclswXSAmIDB4Rjg7Ci0JCi0JICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyLCBkaXNwLCAyKTsKLQkKLQkgICAgYnVmZmVyWzBdID0gKGJ1ZmZlclswXSAmIDB4MDcpIHwgdDA7Ci0JICB9Ci0JCi0JZnJhZ1AtPmZyX2ZpeCArPSAyOwotCWZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDMyKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIHsKLQkvKiBBIGNvbmRpdGlvbmFsIGJyYW5jaCB3b250IGZpdCBpbnRvIDEyIGJpdHMgc286Ci0JICoJYiFjb25kCTFmCi0JICoJam1waQkwZgotCSAqCS5hbGlnbiAyCi0JICogMDoJLmxvbmcgZGlzcAotCSAqIDE6Ci0JICoKLQkgKiBpZiB0aGUgYiFjb25kIGlzIDQgYnl0ZSBhbGlnbmVkLCB0aGUgbGl0ZXJhbCB3aGljaCB3b3VsZAotCSAqIGdvIGF0IHgrNCB3aWxsIGFsc28gYmUgYWxpZ25lZC4KLQkgKi8KLQlpbnQgZmlyc3RfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzczsKLQlpbnQgbmVlZHBhZCA9IChmaXJzdF9pbnN0ICYgMyk7Ci0KLQkgIGJ1ZmZlclswXSBePSAweDA4OwkvKiBUb2dnbGUgVC9GIGJpdCAqLwotCi0JYnVmZmVyWzJdID0gSU5TVF9CWVRFMCAoTUNPUkVfSU5TVF9KTVBJKTsJLyogQnVpbGQgam1waSAqLwotCWJ1ZmZlclszXSA9IElOU1RfQllURTEgKE1DT1JFX0lOU1RfSk1QSSk7Ci0gCi0JaWYgKG5lZWRwYWQpCi0JICB7Ci0JICAgICAgewotCQlidWZmZXJbMV0gPSA0OwkvKiBicmFuY2ggb3ZlciBqbXBpLCBwYWQsIGFuZCBwdHIgKi8KLQkJYnVmZmVyWzNdID0gMTsJLyogam1waSBvZmZzZXQgb2YgMSBnZXRzIHRoZSBwb2ludGVyICovCi0JICAgICAgfQotCSAgICAKLQkgICAgYnVmZmVyWzRdID0gMDsJLyogYWxpZ25tZW50L3BhZCAqLwotCSAgICBidWZmZXJbNV0gPSAwOwotCSAgICBidWZmZXJbNl0gPSAwOwkvKiBzcGFjZSBmb3IgMzIgYml0IGFkZHJlc3MgKi8KLQkgICAgYnVmZmVyWzddID0gMDsKLQkgICAgYnVmZmVyWzhdID0gMDsKLQkgICAgYnVmZmVyWzldID0gMDsKLQkgICAgCi0JICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA2LCA0LAotCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIEJGRF9SRUxPQ18zMik7Ci0JICAgIAotCSAgICBmcmFnUC0+ZnJfZml4ICs9IEMzMl9MRU47Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBTZWUgY29tbWVudCBiZWxvdyBhYm91dCB0aGlzIGdpdmVuIGdhcycgbGltaXRhdGlvbnMgZm9yCi0JICAgICAgIHNocmlua2luZyB0aGUgZnJhZ21lbnQuICczJyBpcyB0aGUgYW1vdW50IG9mIGNvZGUgdGhhdAotCSAgICAgICB3ZSBpbnNlcnRlZCBoZXJlLCBidXQgJzQnIGlzIHJpZ2h0IGZvciB0aGUgc3BhY2Ugd2UgcmVzZXJ2ZWQKLQkgICAgICAgZm9yIHRoaXMgZnJhZ21lbnQuICovCi0JICAgICAgewotCQlidWZmZXJbMV0gPSAzOwkvKiBicmFuY2ggb3ZlciBqbXBpLCBhbmQgcHRyICovCi0JCWJ1ZmZlclszXSA9IDA7CS8qIGptcGkgb2Zmc2V0IG9mIDAgZ2V0cyB0aGUgcG9pbnRlciAqLwotCSAgICAgIH0KLQkgICAgCi0JICAgIGJ1ZmZlcls0XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbNV0gPSAwOwotCSAgICBidWZmZXJbNl0gPSAwOwotCSAgICBidWZmZXJbN10gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcC4gICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IEMzMl9MRU47Ci0KLQkgICAgLyogRnJhZyBpcyBhY3R1YWxseSBzaG9ydGVyIChzZWUgdGhlIG90aGVyIHNpZGUgb2YgdGhpcyBpZmRlZikKLQkgICAgICAgYnV0IGdhcyBpc24ndCBwcmVwYXJlZCBmb3IgdGhhdC4gIFdlIGhhdmUgdG8gcmUtYWRqdXN0Ci0JICAgICAgIHRoZSBicmFuY2ggZGlzcGxhY2VtZW50IHNvIHRoYXQgaXQgZ29lcyBiZXlvbmQgdGhlIAotCSAgICAgICBmdWxsIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnQsIG5vdCBqdXN0IHdoYXQgd2UgYWN0dWFsbHkKLQkgICAgICAgZmlsbGVkIGluLiAgKi8KLQkgICAgICBidWZmZXJbMV0gPSA0OwkvKiBqbXBpLCBwdHIsIGFuZCB0aGUgJ3RhaWwgcGFkJyAqLwotCSAgfQotCQotCWZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKFVOQ0RfSlVNUCwgVU5DRDMyKToKLSAgICBjYXNlIEMgKFVOQ0RfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIHsKLQkvKiBBbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB3aWxsIG5vdCBmaXQgaW4gMTIgYml0cywgbWFrZSBjb2RlIHdoaWNoCi0JICAgbG9va3MgbGlrZToKLQkgIAlqbXBpCTBmCi0JICAJLmFsaWduIDIKLQkgICAgIDA6CS5sb25nIGRpc3AKLQkgICB3ZSBuZWVkIGEgcGFkIGlmICJmaXJzdF9pbnN0IiBpcyA0IGJ5dGUgYWxpZ25lZC4KLQkgICBbYmVjYXVzZSB0aGUgbmF0dXJhbCBsaXRlcmFsIHBsYWNlIGlzIHggKyAyXSAgKi8KLQlpbnQgZmlyc3RfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzczsKLQlpbnQgbmVlZHBhZCA9ICEoZmlyc3RfaW5zdCAmIDMpOwotCi0JYnVmZmVyWzBdID0gSU5TVF9CWVRFMCAoTUNPUkVfSU5TVF9KTVBJKTsJLyogQnVpbGQgam1waSAqLwotCWJ1ZmZlclsxXSA9IElOU1RfQllURTEgKE1DT1JFX0lOU1RfSk1QSSk7Ci0KLQlpZiAobmVlZHBhZCkKLQkgIHsKLQkgICAgICBidWZmZXJbMV0gPSAxOwkvKiBqbXBpIG9mZnNldCBvZiAxIHNpbmNlIHBhZGRlZCAqLwotCSAgICBidWZmZXJbMl0gPSAwOwkvKiBhbGlnbm1lbnQgKi8KLQkgICAgYnVmZmVyWzNdID0gMDsKLQkgICAgYnVmZmVyWzRdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCi0JICAgIGJ1ZmZlcls1XSA9IDA7Ci0JICAgIGJ1ZmZlcls2XSA9IDA7Ci0JICAgIGJ1ZmZlcls3XSA9IDA7Ci0JICAgIAotCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICAKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBVMzJfTEVOOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgICBidWZmZXJbMV0gPSAwOwkvKiBqbXBpIG9mZnNldCBvZiAwIGlmIG5vIHBhZCAqLwotCSAgICBidWZmZXJbMl0gPSAwOwkvKiBzcGFjZSBmb3IgMzIgYml0IGFkZHJlc3MgKi8KLQkgICAgYnVmZmVyWzNdID0gMDsKLQkgICAgYnVmZmVyWzRdID0gMDsKLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgCi0JICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LAotCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIEJGRF9SRUxPQ18zMik7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gVTMyX0xFTjsKLQkgIH0KLQotCWZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBBcHBsaWVzIHRoZSBkZXNpcmVkIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCi0gICBBbHNvIHNldHMgdXAgYWRkZW5kcyBmb3IgJ3JlbGEnIHR5cGUgcmVsb2NhdGlvbnMuICAqLwotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWxwLCBzZWdtZW50KQotICAgICBmaXhTICogICBmaXhQOwotICAgICB2YWx1ZVQgKiB2YWxwOwotICAgICBzZWdUICAgICBzZWdtZW50OwotewotICBjaGFyICogICAgICAgYnVmICA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgY2hhciAqICAgICAgIGZpbGUgPSBmaXhQLT5meF9maWxlID8gZml4UC0+ZnhfZmlsZSA6IF8oInVua25vd24iKTsKLSAgY29uc3QgY2hhciAqIHN5bW5hbWU7Ci0gIC8qIE5vdGU6IHVzZSBvZmZzZXRUIGJlY2F1c2UgaXQgaXMgc2lnbmVkLCB2YWx1ZVQgaXMgdW5zaWduZWQuICAqLwotICBvZmZzZXRUICAgICAgdmFsICA9IChvZmZzZXRUKSAqIHZhbHA7IAotICAKLSAgc3ltbmFtZSA9IGZpeFAtPmZ4X2FkZHN5ID8gU19HRVRfTkFNRSAoZml4UC0+ZnhfYWRkc3kpIDogXygiPHVua25vd24+Iik7Ci0gIC8qIFNhdmUgdGhpcyBmb3IgdGhlIGFkZGVuZCBpbiB0aGUgcmVsb2NhdGlvbiByZWNvcmQuICAqLwotICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7Ci0KLSAgLyogSWYgdGhlIGZpeCBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCwgb3Igbm90Ci0gICAgIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlIGZpeCwgd2UgY2Fubm90IHJlc29sdmUgaXQgaGVyZS4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiAoICAgISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWdtZW50KSkpCi0gICAgewotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogRm9yIEVMRiB3ZSBjYW4ganVzdCByZXR1cm4gYW5kIGxldCB0aGUgcmVsb2MgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZAotCSB0YWtlIGNhcmUgb2YgZXZlcnl0aGluZy4gIEZvciBDT0ZGIHdlIHN0aWxsIGhhdmUgdG8gaW5zZXJ0ICd2YWwnCi0JIGludG8gdGhlIGluc24gc2luY2UgdGhlIGFkZGVuZCBmaWVsZCB3aWxsIGJlIGlnbm9yZWQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBmaXhQLT5meF9kb25lID0gMTsKLSAgCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMjogICAgIC8qIHNlY29uZCBieXRlIG9mIDIgYnl0ZSBvcGNvZGUgKi8KLSAgICAgIGlmICgodmFsICYgMSkgIT0gMCkKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIm9kZCBkaXN0YW5jZSBicmFuY2ggKDB4JXggYnl0ZXMpIiksIHZhbCk7Ci0gICAgICB2YWwgLz0gMjsKLSAgICAgIGlmICgoKHZhbCAmIH4weDNmZikgIT0gMCkgJiYgKCh2YWwgfCAweDNmZikgIT0gLTEpKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygicGNyZWwgZm9yIGJyYW5jaCB0byAlcyB0b28gZmFyICgweCV4KSIpLAotCQkgICAgICBzeW1uYW1lLCB2YWwpOwotICAgICAgICBidWZbMF0gfD0gKCh2YWwgPj4gOCkgJiAweDcpOwotICAgICAgICBidWZbMV0gfD0gKHZhbCAmIDB4ZmYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgkvKiBsb3dlciA4IGJpdHMgb2YgMiBieXRlIG9wY29kZSAqLwotICAgICAgdmFsICs9IDM7Ci0gICAgICB2YWwgLz0gNDsKLSAgICAgIGlmICh2YWwgJiB+MHhmZikKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oInBjcmVsIGZvciBscncvam1waS9qc3JpIHRvICVzIHRvbyBmYXIgKDB4JXgpIiksCi0JCSAgICAgIHN5bW5hbWUsIHZhbCk7Ci0gICAgICBlbHNlCi0JYnVmWzFdIHw9ICh2YWwgJiAweGZmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMjoJLyogbG9vcHQgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlmICgodmFsIDwgLTMyKSB8fCAodmFsID4gLTIpKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygicGNyZWwgZm9yIGxvb3B0IHRvbyBmYXIgKDB4JXgpIiksIHZhbCk7Ci0gICAgICB2YWwgLz0gMjsKLSAgICAgICAgYnVmWzFdIHw9ICh2YWwgJiAweGYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0gICAgICAvKiBDb25kaXRpb25hbCBsaW5rZXIgbWFwIGpzcmkgdG8gYnNyLiAgKi8KLSAgICAgIC8qIElmIGl0cyBhIGxvY2FsIHRhcmdldCBhbmQgY2xvc2UgZW5vdWdoLCBmaXggaXQuIAotICAgICAgICAgTkI6ID49IC0yayBmb3IgYmFja3dhcmRzIGJzcjsgPCAyayBmb3IgZm9yd2FyZHMuLi4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiB2YWwgPj0gLTIwNDggICYmIHZhbCA8IDIwNDgpCi0JewotCSAgbG9uZyBudmFsID0gKHZhbCAvIDIpICYgMHg3ZmY7Ci0JICBudmFsIHw9IE1DT1JFX0lOU1RfQlNSOwotCSAgCi0JICAvKiBSRVBMQUNFIHRoZSBpbnN0cnVjdGlvbiwgZG9uJ3QganVzdCBtb2RpZnkgaXQuICAqLwotCSAgYnVmWzBdID0gSU5TVF9CWVRFMCAobnZhbCk7Ci0JICBidWZbMV0gPSBJTlNUX0JZVEUxIChudmFsKTsKLQl9Ci0gICAgICBlbHNlCi0JZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JewotCSAgLyogSWYgdGhlIGZpeCBpcyBhbiBhYnNvbHV0ZSByZWxvYyBiYXNlZCBvbiBhIHN5bWJvbCdzCi0JICAgICBhZGRyZXNzLCB0aGVuIGl0IGNhbm5vdCBiZSByZXNvbHZlZCB1bnRpbCB0aGUgZmluYWwgbGluay4gICovCi0JICBmaXhQLT5meF9kb25lID0gMDsKLQl9Ci0jaWZkZWYgT0JKX0VMRiAgICAgIAotICAgICAgZWxzZQotI2VuZGlmCi0JewotCSAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gNCkKLQkgICAgOwotCSAgZWxzZSBpZiAoZml4UC0+Znhfc2l6ZSA9PSAyICYmIHZhbCA+PSAtMzI3NjggJiYgdmFsIDw9IDMyNzY3KQotCSAgICA7Ci0JICBlbHNlIGlmIChmaXhQLT5meF9zaXplID09IDEgJiYgdmFsID49IC0yNTYgJiYgdmFsIDw9IDI1NSkKLQkgICAgOwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIGZpeFAtPmZ4X3NpemUpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gMDsgLyogUmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuICAqLwotfQotCi12b2lkCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgLyogSWdub3JlIGxlYWRpbmcgaGFzaCBzeW1ib2wsIGlmIHBvcmVzZW50LiAgKi8KLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi1pbnQgbWRfbG9uZ19qdW1wX3NpemU7Ci0KLS8qIENhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24sIHJldHVybiB0aGUgbGVuZ3RoCi0gICBieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uLiAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICogZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKFVOQ0RfSlVNUCwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiBVc2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93bi4gICovCi0gICAgICBpZiAoIWZyYWdQLT5mcl9zeW1ib2wpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNEX0pVTVAsIFVOQ0QxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ0RfSlVNUCwgVU5DRDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DRF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICAKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiBVc2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93bi4gKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgLyogR290IGEgc3ltYm9sIGFuZCBpdCdzIGRlZmluZWQgaW4gdGhpcyBzZWdtZW50LCBiZWNvbWUgYnl0ZQotCSAgICAgc2l6ZWQgLSBtYXliZSBpdCB3aWxsIGZpeCB1cCAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChDT05EX0pVTVAsIENPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMTIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UgaWYgKGZyYWdQLT5mcl9zeW1ib2wpCi0JewotCSAgLyogSXRzIGdvdCBhIHNlZ21lbnQsIGJ1dCBpdHMgbm90IG91cnMsIHNvIGl0IHdpbGwgYWx3YXlzIGJlIGxvbmcuICAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChDT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMzIpXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2Uga25vdyB0aGUgYWJzIHZhbHVlLiAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoQ09ORF9KVU1QLCBDT05EMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKLSAgICAgY2hhciAqIHB0cjsKLSAgICAgdmFsdWVUIHVzZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgICBzd2l0Y2ggKG5ieXRlcykKLSAgICAgIHsKLSAgICAgIGNhc2UgNDogKnB0cisrID0gKHVzZSA+PiAyNCkgJiAweGZmOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMzogKnB0cisrID0gKHVzZSA+PiAxNikgJiAweGZmOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjogKnB0cisrID0gKHVzZSA+PiAgOCkgJiAweGZmOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTogKnB0cisrID0gKHVzZSA+PiAgMCkgJiAweGZmOyAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgICAgfQotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gc2l6ZTsJCQkvKiBCeXRlIGFsaWdubWVudCBpcyBmaW5lICovCi19Ci0KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqIGZpeHA7Ci0gICAgIHNlZ1Qgc2VjOwotewotI2lmZGVmIE9CSl9FTEYKLSAgLyogSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgb3IgZGVmaW5lZCBpbiBhbm90aGVyIHNlY3Rpb24KLSAgICAgd2UgbGVhdmUgdGhlIGFkZCBudW1iZXIgYWxvbmUgZm9yIHRoZSBsaW5rZXIgdG8gZml4IGl0IGxhdGVyLgotICAgICBPbmx5IGFjY291bnQgZm9yIHRoZSBQQyBwcmUtYnVtcCAod2hpY2ggaXMgMiBieXRlcyBvbiB0aGUgTUNvcmUpLiAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKLQkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCi0gICAgICAKLSAgewotICAgIGFzc2VydCAoZml4cC0+Znhfc2l6ZSA9PSAyKTsJLyogbXVzdCBiZSBhbiBpbnNuICovCi0gICAgcmV0dXJuIGZpeHAtPmZ4X3NpemU7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIFRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnb2luZyB0byByZXNvbHZlIHRoaW5ncy4uLiAqLwotICByZXR1cm4gIGZpeHAtPmZ4X3NpemUgKyBmaXhwLT5meF93aGVyZSArIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLSNkZWZpbmUgRihTWixQQ1JFTCkJCSgoKFNaKSA8PCAxKSArIChQQ1JFTCkpCi0jZGVmaW5lIE1BUChTWixQQ1JFTCxUWVBFKQljYXNlIEYgKFNaLCBQQ1JFTCk6IGNvZGUgPSAoVFlQRSk7IGJyZWFrCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIGZpeFMgKiBmaXhwOwotewotICBhcmVsZW50ICogcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLSAgaW50IGhhbmRsZWQgPSAwOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICAgIC8qIFRoZXNlIGNvbmZ1c2UgdGhlIHNpemUvcGNyZWwgbWFjcm8gYXBwcm9hY2guICovCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNDoKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHN3aXRjaCAoRiAoZml4cC0+Znhfc2l6ZSwgZml4cC0+ZnhfcGNyZWwpKQotICAgICAgICB7Ci0gICAgICAgICAgTUFQICgxLCAwLCBCRkRfUkVMT0NfOCk7Ci0gICAgICAgICAgTUFQICgyLCAwLCBCRkRfUkVMT0NfMTYpOwotICAgICAgICAgIE1BUCAoNCwgMCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgICAgICBNQVAgKDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgICAgICBNQVAgKDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICAgICAgTUFQICg0LCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgICBkZWZhdWx0OgotCSAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICAgICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSAlc3JlbG9jYXRpb24iKSwKLQkJICBmaXhwLT5meF9zaXplLAotCSAgICAgICAgICBmaXhwLT5meF9wY3JlbCA/IF8oInBjLXJlbGF0aXZlIikgOiAiIik7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIC8qIEFsd2F5cyBwYXNzIHRoZSBhZGRlbmQgYWxvbmchICAqLwotICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLQotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICAKLSAgaWYgKHJlbC0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0gICAgICAgICAgICAgICAgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgICAKLSAgICAgIC8qIFNldCBob3d0byB0byBhIGdhcmJhZ2UgdmFsdWUgc28gdGhhdCB3ZSBjYW4ga2VlcCBnb2luZy4gICovCi0gICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ18zMik7Ci0gICAgICBhc3NlcnQgKHJlbC0+aG93dG8gIT0gTlVMTCk7Ci0gICAgfQotCi0gIHJldHVybiByZWw7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi1pbnQKLW1jb3JlX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLSAgICAgZml4UyAqIGZpeDsKLXsKLSAgaWYgKCAgIGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGZpeCBjYW4gYmUgaGFuZGxlZCBieSBHQVMsIGZhbHNlIGlmIGl0IG11c3QKLSAgIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBsaW5rZXIuICAqLwotYm9vbGVhbgotbWNvcmVfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICogZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzLiAgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbWNvcmUuaCBiL2dhcy9jb25maWcvdGMtbWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxM2MyNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLW1jb3JlLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0jaWZuZGVmCVRDX01DT1JFCi0jZGVmaW5lIFRDX01DT1JFIDEKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIE1DT1JFIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJYmZkX2FyY2hfbWNvcmUKLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0vKiBEb24ndCB3cml0ZSBvdXQgcmVsb2NzIGZvciBwY3JlbCBzdHVmZi4gICovCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgoKHgpLT5meF9hZGRzeSB8fCAoeCktPmZ4X3N1YnN5KSAmJiBcCi0JCQkgICAoeCktPmZ4X3JfdHlwZSA8IEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0KQotCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKGEsYixjKSB0Y19yZWxvY19tYW5nbGUgKGEsIGIsIGMpCi0KLS8qIFNvbWUgcHNldWRvLW9wIHNlbWFudGljIGV4dGVuc2lvbnMuICAqLwotI2RlZmluZQlQU0VVRE9fTENPTU1fT1BUSU9OQUxfQUxJR04KLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAgICAgICAgCSJNLkNPUkUgR0FTIFZlcnNpb24gMi45LjQiCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMJNAotCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFCTEKLSNkZWZpbmUgQ09GRl9GTEFHUyAJMQotCi0vKiBXZSB3YW50IGxvY2FsIGxhYmVsIHN1cHBvcnQuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotICAgICAKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0jZGVmaW5lIG1kX2VuZAltZF9tY29yZV9lbmQKLQotLyogV2FudCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbiB0b28uLi4gKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChGSVhQLCBTRUMpCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMyAgLyogV2Ugd2FudCB0aGUgc2VnbWVudCBhcyB3ZWxsLiAgKi8KLQotCi0KLSNpZmRlZiAgT0JKX0NPRkYKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUCSh0YXJnZXRfYmlnX2VuZGlhbiA/ICJwZS1tY29yZS1iaWciIDogInBlLW1jb3JlLWxpdHRsZSIpCi0KLXN0cnVjdCBtY29yZV90Y19zeQotewotICBpbnQgc3lfZmxhZ3M7Ci19OwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IG1jb3JlX3RjX3N5Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0KLSNpZmRlZiBPQkpfRUxGCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiZWxmMzItbWNvcmUtYmlnIiA6ICJlbGYzMi1tY29yZS1saXR0bGUiKQotCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLmN0b3JzIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAotICB7ICIuZHRvcnMiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0vKiBPdGhlciBzcGVjaWFsIHNlY3Rpb25zIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlcjogLnJlZ2luZm8sCi0gICAubGlibGlzdCwgLmNvbmZsaWN0LCAuZ3B0YWIsIC5nb3QsIC5keW5hbWljLCAucmVsLmR5bi4gICovCi0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gZW1pdCB2YXJpb3VzIHJlbG9jcyB3ZSBvdGhlcndpc2Ugd291bGRuJ3QuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgbWNvcmVfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotZXh0ZXJuIGludCBtY29yZV9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBtY29yZV9maXhfYWRqdXN0YWJsZSAoZml4UCkKLWV4dGVybiBib29sZWFuIG1jb3JlX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSMgZXJyb3IgTm8gdGFyZ2V0IGZvcm1hdCBzcGVjaWZpZWQuCi0jZW5kaWYKLQotI2luY2x1ZGUgIndyaXRlLmgiICAgICAgICAvKiBGb3IgZGVmaW5pdGlvbiBvZiBmaXhTICovCi0gIAotZXh0ZXJuIHZvaWQgICAgICBtZF9iZWdpbiAgICAgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkICAgICAgbWRfYXNzZW1ibGUgICAgICAgICBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiBzeW1ib2xTICogbWRfdW5kZWZpbmVkX3N5bWJvbCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkICAgICAgbWRfbWNvcmVfZW5kICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gY2hhciAqICAgIG1kX2F0b2YgICAgICAgICAgICAgUEFSQU1TICgoaW50LCBjaGFyICosIGludCAqKSk7Ci1leHRlcm4gaW50ICAgICAgIG1kX3BhcnNlX29wdGlvbiAgICAgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLWV4dGVybiB2b2lkICAgICAgbWRfc2hvd191c2FnZSAgICAgICBQQVJBTVMgKChGSUxFICopKTsKLWV4dGVybiB2b2lkICAgICAgbWRfY3JlYXRlX3Nob3J0X2p1bXAgCi0gIFBBUkFNUyAoKGNoYXIgKiwgYWRkcmVzc1QsIGFkZHJlc3NULCBmcmFnUyAqLCBzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkICAgICAgbWRfY3JlYXRlX2xvbmdfanVtcAotICBQQVJBTVMgKChjaGFyICosIGFkZHJlc3NULCBhZGRyZXNzVCwgZnJhZ1MgKiwgc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2NvbnZlcnRfZnJhZyAgICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBmcmFnUyAqKSk7Ci1leHRlcm4gaW50ICAgICAgIG1kX2FwcGx5X2ZpeDMgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGZpeFMgKiwgdmFsdWVUICosIHNlZ1QpKTsKLWV4dGVybiB2b2lkICAgICAgbWRfb3BlcmFuZCAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotZXh0ZXJuIGludCAgICAgICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBQQVJBTVMgKChmcmFnUyAqLCBzZWdUKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX251bWJlcl90b19jaGFycyAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQpKTsKLWV4dGVybiB2YWx1ZVQgICAgbWRfc2VjdGlvbl9hbGlnbiAgICAgICAgICAgICAgUEFSQU1TICgoc2VnVCwgdmFsdWVUKSk7Ci1leHRlcm4gbG9uZyAgICAgIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAgICAgICAgIFBBUkFNUyAoKGZpeFMgKiwgc2VnVCkpOwotZXh0ZXJuIGFyZWxlbnQgKiB0Y19nZW5fcmVsb2MgICAgICAgICAgICAgICAgICBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLQotI2VuZGlmIC8qIFRDX01DT1JFICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1pcHMuYyBiL2dhcy9jb25maWcvdGMtbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIwNjMyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3OTIgKzAsMCBAQAotLyogdGMtbWlwcy5jIC0tIGFzc2VtYmxlIGNvZGUgZm9yIGEgTUlQUyBjaGlwLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSB0aGUgT1NGIGFuZCBSYWxwaCBDYW1wYmVsbC4KLSAgIFdyaXR0ZW4gYnkgS2VpdGggS25vd2xlcyBhbmQgUmFscGggQ2FtcGJlbGwsIHdvcmtpbmcgaW5kZXBlbmRlbnRseS4KLSAgIE1vZGlmaWVkIGZvciBFQ09GRiBhbmQgUjQwMDAgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cwotICAgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2VuZGlmCi0jaWZkZWYgVVNFX1ZBUkFSR1MKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCi0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLS8qIENsZWFuIHVwIG5hbWVzcGFjZSBzbyB3ZSBjYW4gaW5jbHVkZSBvYmotZWxmLmggdG9vLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19vdXRwdXRfZmxhdm9yIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgbWlwc19vdXRwdXRfZmxhdm9yICgpIHsgcmV0dXJuIE9VVFBVVF9GTEFWT1I7IH0KLSN1bmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0jdW5kZWYgT1VUUFVUX0ZMQVZPUgotI3VuZGVmIFNfR0VUX0FMSUdOCi0jdW5kZWYgU19HRVRfU0laRQotI3VuZGVmIFNfU0VUX0FMSUdOCi0jdW5kZWYgU19TRVRfU0laRQotI3VuZGVmIG9ial9mcm9iX2ZpbGUKLSN1bmRlZiBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotI3VuZGVmIG9ial9mcm9iX3N5bWJvbAotI3VuZGVmIG9ial9wb3BfaW5zZXJ0Ci0jdW5kZWYgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCi0jdW5kZWYgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKLQotI2luY2x1ZGUgIm9iai1lbGYuaCIKLS8qIEZpeCBhbnkgb2YgdGhlbSB0aGF0IHdlIGFjdHVhbGx5IGNhcmUgYWJvdXQuICAqLwotI3VuZGVmIE9VVFBVVF9GTEFWT1IKLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBtaXBzX291dHB1dF9mbGF2b3IoKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKQotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBFQ09GRl9ERUJVR0dJTkcKLSNkZWZpbmUgTk9fRUNPRkZfREVCVUdHSU5HCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotc3RhdGljIGNoYXIgKm1pcHNfcmVnbWFza19mcmFnOwotI2VuZGlmCi0KLSNkZWZpbmUgQVQgIDEKLSNkZWZpbmUgVFJFRyAyNAotI2RlZmluZSBQSUNfQ0FMTF9SRUcgMjUKLSNkZWZpbmUgS1QwIDI2Ci0jZGVmaW5lIEtUMSAyNwotI2RlZmluZSBHUCAgMjgKLSNkZWZpbmUgU1AgIDI5Ci0jZGVmaW5lIEZQICAzMAotI2RlZmluZSBSQSAgMzEKLQotI2RlZmluZSBJTExFR0FMX1JFRyAoMzIpCi0KLS8qIEFsbG93IG92ZXJyaWRlIG9mIHN0YW5kYXJkIGxpdHRsZS1lbmRpYW4gRUNPRkYgZm9ybWF0LiAgKi8KLQotI2lmbmRlZiBFQ09GRl9MSVRUTEVfRk9STUFUCi0jZGVmaW5lIEVDT0ZGX0xJVFRMRV9GT1JNQVQgImVjb2ZmLWxpdHRsZW1pcHMiCi0jZW5kaWYKLQotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotLyogMSBpcyB3ZSBzaG91bGQgdXNlIHRoZSA2NCBiaXQgTUlQUyBFTEYgQUJJLCAwIGlmIHdlIHNob3VsZCB1c2UgdGhlCi0gICAzMiBiaXQgQUJJLiAgVGhpcyBoYXMgbm8gbWVhbmluZyBmb3IgRUNPRkYuCi0gICBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaXMgYWx3YXlzIDMyIGJpdCwgZXZlbiBpZiAiY29uZmlndXJlZCIgZm9yCi0gICA2NCBiaXQgW2UuZy4gLS10YXJnZXQ9bWlwczY0LWVsZl0uICAqLwotc3RhdGljIGludCBtaXBzXzY0OwotCi0vKiBUaGUgZGVmYXVsdCB0YXJnZXQgZm9ybWF0IHRvIHVzZS4gICovCi1jb25zdCBjaGFyICoKLW1pcHNfdGFyZ2V0X2Zvcm1hdCAoKQotewotICBzd2l0Y2ggKE9VVFBVVF9GTEFWT1IpCi0gICAgewotICAgIGNhc2UgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gdGFyZ2V0X2JpZ19lbmRpYW4gPyAiYS5vdXQtbWlwcy1iaWciIDogImEub3V0LW1pcHMtbGl0dGxlIjsKLSAgICBjYXNlIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cjoKLSAgICAgIHJldHVybiB0YXJnZXRfYmlnX2VuZGlhbiA/ICJlY29mZi1iaWdtaXBzIiA6IEVDT0ZGX0xJVFRMRV9GT1JNQVQ7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyOgotICAgICAgcmV0dXJuICh0YXJnZXRfYmlnX2VuZGlhbgotCSAgICAgID8gKG1pcHNfNjQgPyAiZWxmNjQtYmlnbWlwcyIgOiAiZWxmMzItYmlnbWlwcyIpCi0JICAgICAgOiAobWlwc182NCA/ICJlbGY2NC1saXR0bGVtaXBzIiA6ICJlbGYzMi1saXR0bGVtaXBzIikpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLyogVGhlIG5hbWUgb2YgdGhlIHJlYWRvbmx5IGRhdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIFJEQVRBX1NFQ1RJT05fTkFNRSAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciBcCi0JCQkgICAgPyAiLmRhdGEiIFwKLQkJCSAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyIFwKLQkJCSAgICA/ICIucmRhdGEiIFwKLQkJCSAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91ciBcCi0JCQkgICAgPyAiLnJvZGF0YSIgXAotCQkJICAgIDogKGFib3J0ICgpLCAiIikpCi0KLS8qIFRoaXMgaXMgdGhlIHNldCBvZiBvcHRpb25zIHdoaWNoIG1heSBiZSBtb2RpZmllZCBieSB0aGUgLnNldAotICAgcHNldWRvLW9wLiAgV2UgdXNlIGEgc3RydWN0IHNvIHRoYXQgLnNldCBwdXNoIGFuZCAuc2V0IHBvcCBhcmUgbW9yZQotICAgcmVsaWFibGUuICAqLwotCi1zdHJ1Y3QgbWlwc19zZXRfb3B0aW9ucwotewotICAvKiBNSVBTIElTQSAoSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSkgbGV2ZWwuICBUaGlzIGlzIHNldCB0byAtMQotICAgICBpZiBpdCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuICBDaGFuZ2VkIGJ5IGAuc2V0IG1pcHNOJywgYW5kIHRoZQotICAgICAtbWlwc04gY29tbWFuZCBsaW5lIG9wdGlvbiwgYW5kIHRoZSBkZWZhdWx0IENQVS4gICovCi0gIGludCBpc2E7Ci0gIC8qIFdoZXRoZXIgd2UgYXJlIGFzc2VtYmxpbmcgZm9yIHRoZSBtaXBzMTYgcHJvY2Vzc29yLiAgMCBpZiB3ZSBhcmUKLSAgICAgbm90LCAxIGlmIHdlIGFyZSwgYW5kIC0xIGlmIHRoZSB2YWx1ZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgIENoYW5nZWQgYnkgYC5zZXQgbWlwczE2JyBhbmQgYC5zZXQgbm9taXBzMTYnLCBhbmQgdGhlIC1taXBzMTYgYW5kCi0gICAgIC1ub21pcHMxNiBjb21tYW5kIGxpbmUgb3B0aW9ucywgYW5kIHRoZSBkZWZhdWx0IENQVS4gICovCi0gIGludCBtaXBzMTY7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgcmVvcmRlciBpbnN0cnVjdGlvbnMuICBDaGFuZ2VkIGJ5IGAuc2V0Ci0gICAgIHJlb3JkZXInIGFuZCBgLnNldCBub3Jlb3JkZXInLiAgKi8KLSAgaW50IG5vcmVvcmRlcjsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBwZXJtaXQgdGhlICRhdCAoJDEpIHJlZ2lzdGVyIHRvIGJlIHVzZWQKLSAgICAgaW4gaW5zdHJ1Y3Rpb25zLiAgQ2hhbmdlZCBieSBgLnNldCBhdCcgYW5kIGAuc2V0IG5vYXQnLiAgKi8KLSAgaW50IG5vYXQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCB3YXJuIHdoZW4gYSBtYWNybyBpbnN0cnVjdGlvbiBleHBhbmRzIGludG8KLSAgICAgbW9yZSB0aGFuIG9uZSBtYWNoaW5lIGluc3RydWN0aW9uLiAgQ2hhbmdlZCBieSBgLnNldCBub21hY3JvJyBhbmQKLSAgICAgYC5zZXQgbWFjcm8nLiAgKi8KLSAgaW50IHdhcm5fYWJvdXRfbWFjcm9zOwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IG1vdmUgaW5zdHJ1Y3Rpb25zLiAgQ2hhbmdlZCBieSBgLnNldAotICAgICBtb3ZlJywgYC5zZXQgdm9sYXRpbGUnLCBgLnNldCBub21vdmUnLCBhbmQgYC5zZXQgbm92b2xhdGlsZScuICAqLwotICBpbnQgbm9tb3ZlOwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IG9wdGltaXplIGJyYW5jaGVzIGJ5IG1vdmluZyB0aGUgdGFyZ2V0Ci0gICAgIG9mIHRoZSBicmFuY2ggaW50byB0aGUgZGVsYXkgc2xvdC4gIEFjdHVhbGx5LCB3ZSBkb24ndCBwZXJmb3JtCi0gICAgIHRoaXMgb3B0aW1pemF0aW9uIGFueWhvdy4gIENoYW5nZWQgYnkgYC5zZXQgYm9wdCcgYW5kIGAuc2V0Ci0gICAgIG5vYm9wdCcuICAqLwotICBpbnQgbm9ib3B0OwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IGF1dG9leHRlbmQgbWlwczE2IGluc3RydWN0aW9ucy4KLSAgICAgQ2hhbmdlZCBieSBgLnNldCBhdXRvZXh0ZW5kJyBhbmQgYC5zZXQgbm9hdXRvZXh0ZW5kJy4gICovCi0gIGludCBub2F1dG9leHRlbmQ7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSBzdHJ1Y3Qgd2UgdXNlIHRvIGhvbGQgdGhlIGN1cnJlbnQgc2V0IG9mIG9wdGlvbnMuICBOb3RlCi0gICB0aGF0IHdlIG11c3Qgc2V0IHRoZSBpc2EgYW5kIG1pcHMxNiBmaWVsZHMgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdAotICAgdGhleSBoYXZlIG5vdCBiZWVuIGluaXRpYWxpemVkLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX3NldF9vcHRpb25zIG1pcHNfb3B0cyA9IHsgLTEsIC0xIH07Ci0KLS8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgZmlsbGVkIGluIHdpdGggdGhlIG1hc2tzIG9mIHJlZ2lzdGVycyB1c2VkLgotICAgVGhlIG9iamVjdCBmb3JtYXQgY29kZSByZWFkcyB0aGVtIGFuZCBwdXRzIHRoZW0gaW4gdGhlIGFwcHJvcHJpYXRlCi0gICBwbGFjZS4gICovCi11bnNpZ25lZCBsb25nIG1pcHNfZ3BybWFzazsKLXVuc2lnbmVkIGxvbmcgbWlwc19jcHJtYXNrWzRdOwotCi0vKiBNSVBTIElTQSB3ZSBhcmUgdXNpbmcgZm9yIHRoaXMgb3V0cHV0IGZpbGUuICAqLwotc3RhdGljIGludCBmaWxlX21pcHNfaXNhOwotCi0vKiBUaGUgQ1BVIHR5cGUgYXMgYSBudW1iZXI6IDIwMDAsIDMwMDAsIDQwMDAsIDQ0MDAsIGV0Yy4gICovCi1zdGF0aWMgaW50IG1pcHNfY3B1ID0gLTE7Ci0KLS8qIFRoZSBhcmd1bWVudCBvZiB0aGUgLW1hYmk9IGZsYWcuICovCi1zdGF0aWMgY2hhciogbWlwc19hYmlfc3RyaW5nID0gMDsKLQotLyogV2V0aGVyIHdlIHNob3VsZCBtYXJrIHRoZSBmaWxlIEVBQkk2NCBvciBFQUJJMzIuICovCi1zdGF0aWMgaW50IG1pcHNfZWFiaTY0ID0gMDsKLQotLyogSWYgdGhleSBhc2tlZCBmb3IgbWlwczEgb3IgbWlwczIgYW5kIGEgY3B1IHRoYXQgaXMKLSAgIG1pcHMzIG9yIGdyZWF0ZXIsIHRoZW4gbWFyayB0aGUgb2JqZWN0IGZpbGUgMzJCSVRNT0RFLiAqLwotc3RhdGljIGludCBtaXBzXzMyYml0bW9kZSA9IDA7Ci0KLS8qIFdoZXRoZXIgdGhlIHByb2Nlc3NvciB1c2VzIGhhcmR3YXJlIGludGVybG9ja3MgdG8gcHJvdGVjdCAKLSAgIHJlYWRzIGZyb20gdGhlIEhJIGFuZCBMTyByZWdpc3RlcnMsIGFuZCB0aHVzIGRvZXMgbm90Ci0gICByZXF1aXJlIG5vcHMgdG8gYmUgaW5zZXJ0ZWQuCi0KLSAgIEZJWE1FOiBHQ0MgbWFrZXMgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIC1tY3B1PUZPTyBhbmQgLW1GT086Ci0gICAtbWNwdT1GT08gc2NoZWR1bGVzIGZvciBGT08sIGJ1dCBzdGlsbCBwcm9kdWNlcyBjb2RlIHRoYXQgbWVldHMgdGhlCi0gICByZXF1aXJlbWVudHMgb2YgTUlQUyBJU0EgSS4gIEZvciBleGFtcGxlLCBpdCB3b24ndCBnZW5lcmF0ZSBhbnkKLSAgIEZPTy1zcGVjaWZpYyBpbnN0cnVjdGlvbnMsIGFuZCBpdCB3aWxsIHN0aWxsIGFzc3VtZSB0aGF0IGFueQotICAgc2NoZWR1bGluZyBoYXphcmRzIGRlc2NyaWJlZCBpbiBNSVBTIElTQSBJIGFyZSB0aGVyZSwgZXZlbiBpZiBGT08KLSAgIGhhcyBpbnRlcmxvY2tzLiAgLW1GT08gZ2l2ZXMgR0NDIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgY29kZSB0aGF0Ci0gICB3aWxsIG9ubHkgcnVuIG9uIGEgRk9POyBpdCB3aWxsIGdlbmVyYXRlIEZPTy1zcGVjaWZpYyBpbnN0cnVjdGlvbnMsCi0gICBhbmQgYXNzdW1lIGludGVybG9ja3MgcHJvdmlkZWQgYnkgYSBGT08uCi0KLSAgIEhvd2V2ZXIsIEdBUyBjdXJyZW50bHkgZG9lc24ndCBtYWtlIHRoaXMgZGlzdGluY3Rpb247IGJlZm9yZSBKYW4gMjgKLSAgIDE5OTksIEdBUydzIC1tY3B1PUZPTyBpbXBsaWVkIC1tRk9PLCB3aGljaCB2aW9sYXRlcyBHQ0MncwotICAgYXNzdW1wdGlvbnMuICBUaGUgR0NDIGRyaXZlciBwYXNzZXMgdGhlc2UgZmxhZ3MgdGhyb3VnaCB0byBHQVMsIHNvCi0gICBpZiBHQVMgYWN0dWFsbHkgZG9lcyBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgbWVldCBNSVBTIElTQSBJIHdpdGgKLSAgIC1tRk9PLCB0aGVuIEdDQydzIC1tY3B1PUZPTyBmbGFnIGlzbid0IGdvaW5nIHRvIHdvcmsuCi0KLSAgIEFuZCBmdXJ0aGVybW9yZSwgaXQgZGlkIG5vdCBhc3N1bWUgdGhhdCAtbUZPTyBpbXBsaWVkIC1tY3B1PUZPTywKLSAgIHdoaWNoIHNlZW1zIHNlbnNlbGVzcyAtLS0gd2h5IGdlbmVyYXRlIGNvZGUgd2hpY2ggd2lsbCBvbmx5IHJ1biBvbgotICAgYSBGT08sIGJ1dCBzY2hlZHVsZSBmb3Igc29tZXRoaW5nIGVsc2U/Ci0KLSAgIFNvIG5vdywgYXQgbGVhc3QsIC1tY3B1PUZPTyBhbmQgLW1GT08gYXJlIGV4YWN0bHkgZXF1aXZhbGVudC4KLQotICAgLS0gSmltIEJsYW5keSA8amltYkBjeWdudXMuY29tPiAqLwotCi0jZGVmaW5lIGhpbG9faW50ZXJsb2NrcyAobWlwc19jcHUgPT0gNDAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICApCi0KLS8qIFdoZXRoZXIgdGhlIHByb2Nlc3NvciB1c2VzIGhhcmR3YXJlIGludGVybG9ja3MgdG8gcHJvdGVjdCByZWFkcwotICAgZnJvbSB0aGUgR1BScywgYW5kIHRodXMgZG9lcyBub3QgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkLiAgKi8KLSNkZWZpbmUgZ3ByX2ludGVybG9ja3MgXAotICAobWlwc19vcHRzLmlzYSA+PSAyICBcCi0gICB8fCBtaXBzX2NwdSA9PSAzOTAwKQotCi0vKiBBcyB3aXRoIG90aGVyICJpbnRlcmxvY2tzIiB0aGlzIGlzIHVzZWQgYnkgaGFyZHdhcmUgdGhhdCBoYXMgRlAKLSAgIChjby1wcm9jZXNzb3IpIGludGVybG9ja3MuICAqLwotLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotI2RlZmluZSBjb3BfaW50ZXJsb2NrcyAobWlwc19jcHUgPT0gNDMwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkpCi0KLS8qIE1JUFMgUElDIGxldmVsLiAgKi8KLQotZW51bSBtaXBzX3BpY19sZXZlbAotewotICAvKiBEbyBub3QgZ2VuZXJhdGUgUElDIGNvZGUuICAqLwotICBOT19QSUMsCi0KLSAgLyogR2VuZXJhdGUgUElDIGNvZGUgYXMgaW4gSXJpeCA0LiAgVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQsIGFuZCBJJ20KLSAgICAgbm90IHN1cmUgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gICovCi0gIElSSVg0X1BJQywKLQotICAvKiBHZW5lcmF0ZSBQSUMgY29kZSBhcyBpbiB0aGUgU1ZSNCBNSVBTIEFCSS4gICovCi0gIFNWUjRfUElDLAotCi0gIC8qIEdlbmVyYXRlIFBJQyBjb2RlIHdpdGhvdXQgdXNpbmcgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlOiB0aGUgZGF0YQotICAgICBzZWdtZW50IGhhcyBhIG1heGltdW0gc2l6ZSBvZiA2NEssIGFsbCBkYXRhIHJlZmVyZW5jZXMgYXJlIG9mZgotICAgICB0aGUgJGdwIHJlZ2lzdGVyLCBhbmQgYWxsIHRleHQgcmVmZXJlbmNlcyBhcmUgUEMgcmVsYXRpdmUuICBUaGlzCi0gICAgIGlzIHVzZWQgb24gc29tZSBlbWJlZGRlZCBzeXN0ZW1zLiAgKi8KLSAgRU1CRURERURfUElDCi19OwotCi1zdGF0aWMgZW51bSBtaXBzX3BpY19sZXZlbCBtaXBzX3BpYzsKLQotLyogMSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgMzIgYml0IG9mZnNldHMgZnJvbSB0aGUgR1AgcmVnaXN0ZXIgaW4KLSAgIFNWUjRfUElDIG1vZGUuICBDdXJyZW50bHkgaGFzIG5vIG1lYW5pbmcgaW4gb3RoZXIgbW9kZXMuICAqLwotc3RhdGljIGludCBtaXBzX2JpZ19nb3Q7Ci0KLS8qIDEgaWYgdHJhcCBpbnN0cnVjdGlvbnMgc2hvdWxkIHVzZWQgZm9yIG92ZXJmbG93IHJhdGhlciB0aGFuIGJyZWFrCi0gICBpbnN0cnVjdGlvbnMuICAqLwotc3RhdGljIGludCBtaXBzX3RyYXA7Ci0KLS8qIE5vbi16ZXJvIGlmIGFueSAuc2V0IG5vcmVvcmRlciBkaXJlY3RpdmVzIHdlcmUgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQgbWlwc19hbnlfbm9yZW9yZGVyOwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc21hbGwgZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgZ19zd2l0Y2hfdmFsdWUgPSA4OwotLyogV2hldGhlciB0aGUgLUcgb3B0aW9uIHdhcyB1c2VkLiAgKi8KLXN0YXRpYyBpbnQgZ19zd2l0Y2hfc2VlbiA9IDA7Ci0KLSNkZWZpbmUgTl9STUFTSyAweGM0Ci0jZGVmaW5lIE5fVkZQICAgMHhkNAotCi0vKiBJZiB3ZSBjYW4gZGV0ZXJtaW5lIGluIGFkdmFuY2UgdGhhdCBHUCBvcHRpbWl6YXRpb24gd29uJ3QgYmUKLSAgIHBvc3NpYmxlLCB3ZSBjYW4gc2tpcCB0aGUgcmVsYXhhdGlvbiBzdHVmZiB0aGF0IHRyaWVzIHRvIHByb2R1Y2UKLSAgIEdQLXJlbGF0aXZlIHJlZmVyZW5jZXMuICBUaGlzIG1ha2VzIGRlbGF5IHNsb3Qgb3B0aW1pemF0aW9uIHdvcmsKLSAgIGJldHRlci4KLQotICAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBwcm92aWRlIGEgZ3Vlc3MsIGJ1dCBpdCBzZWVtcyB0byB3b3JrIGZvcgotICAgZ2NjIG91dHB1dC4gIElmIGl0IGd1ZXNzZXMgd3JvbmcsIHRoZSBvbmx5IGxvc3Mgc2hvdWxkIGJlIGluCi0gICBlZmZpY2llbmN5OyBpdCBzaG91bGRuJ3QgaW50cm9kdWNlIGFueSBidWdzLgotCi0gICBJIGRvbid0IGtub3cgaWYgYSBmaXggaXMgbmVlZGVkIGZvciB0aGUgU1ZSNF9QSUMgbW9kZS4gIEkndmUgb25seQotICAgZml4ZWQgaXQgZm9yIHRoZSBub24tUElDIG1vZGUuICBLUiA5NS8wNC8wNyAgKi8KLXN0YXRpYyBpbnQgbm9waWNfbmVlZF9yZWxheCBQQVJBTVMgKChzeW1ib2xTICosIGludCkpOwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLS8qIFRoZSBvcGNvZGUgaGFzaCB0YWJsZSB3ZSB1c2UgZm9yIHRoZSBtaXBzMTYuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1pcHMxNl9vcF9oYXNoID0gTlVMTDsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IEMgc3R5bGUgY29tbWVudHMgYXJlIGFsd2F5cyBzdXBwb3J0ZWQuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyBtYWNoaW5lIHNwZWNpZmljIGxpbmUgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4KLSAqLwotCi1zdGF0aWMgY2hhciAqaW5zbl9lcnJvcjsKLQotc3RhdGljIGludCBhdXRvX2FsaWduID0gMTsKLQotLyogV2hlbiBvdXRwdXR0aW5nIFNWUjQgUElDIGNvZGUsIHRoZSBhc3NlbWJsZXIgbmVlZHMgdG8ga25vdyB0aGUKLSAgIG9mZnNldCBpbiB0aGUgc3RhY2sgZnJhbWUgZnJvbSB3aGljaCB0byByZXN0b3JlIHRoZSAkZ3AgcmVnaXN0ZXIuCi0gICBUaGlzIGlzIHNldCBieSB0aGUgLmNwcmVzdG9yZSBwc2V1ZG8tb3AsIGFuZCBzYXZlZCBpbiB0aGlzCi0gICB2YXJpYWJsZS4gICovCi1zdGF0aWMgb2Zmc2V0VCBtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPSAtMTsKLQotLyogVGhpcyBpcyB0aGUgcmVnaXN0ZXIgd2hpY2ggaG9sZHMgdGhlIHN0YWNrIGZyYW1lLCBhcyBzZXQgYnkgdGhlCi0gICAuZnJhbWUgcHNldWRvLW9wLiAgVGhpcyBpcyBuZWVkZWQgdG8gaW1wbGVtZW50IC5jcHJlc3RvcmUuICAqLwotc3RhdGljIGludCBtaXBzX2ZyYW1lX3JlZyA9IFNQOwotCi0vKiBUbyBvdXRwdXQgTk9QIGluc3RydWN0aW9ucyBjb3JyZWN0bHksIHdlIG5lZWQgdG8ga2VlcCBpbmZvcm1hdGlvbgotICAgYWJvdXQgdGhlIHByZXZpb3VzIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCi0vKiBXaGV0aGVyIHdlIGFyZSBvcHRpbWl6aW5nLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgMiBtZWFucyB0byByZW1vdmUKLSAgIHVubmVlZGVkIE5PUHMgYW5kIHN3YXAgYnJhbmNoIGluc3RydWN0aW9ucyB3aGVuIHBvc3NpYmxlLiAgQSB2YWx1ZQotICAgb2YgMSBtZWFucyB0byBub3Qgc3dhcCBicmFuY2hlcy4gIEEgdmFsdWUgb2YgMCBtZWFucyB0byBhbHdheXMKLSAgIGluc2VydCBOT1BzLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19vcHRpbWl6ZSA9IDI7Ci0KLS8qIERlYnVnZ2luZyBsZXZlbC4gIC1nIHNldHMgdGhpcyB0byAyLiAgLWdOIHNldHMgdGhpcyB0byBOLiAgLWcwIGlzCi0gICBlcXVpdmFsZW50IHRvIHNlZWluZyBubyAtZyBvcHRpb24gYXQgYWxsLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19kZWJ1ZyA9IDA7Ci0KLS8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgc3RydWN0IG1pcHNfY2xfaW5zbiBwcmV2X2luc247Ci0KLS8qIFRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgcHJldl9pbnNuLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWlwc19jbF9pbnNuIHByZXZfcHJldl9pbnNuOwotCi0vKiBJZiB3ZSBkb24ndCB3YW50IGluZm9ybWF0aW9uIGZvciBwcmV2X2luc24gb3IgcHJldl9wcmV2X2luc24sIHdlCi0gICBwb2ludCB0aGUgaW5zbl9tbyBmaWVsZCBhdCB0aGlzIGR1bW15IGludGVnZXIuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBkdW1teV9vcGNvZGUgPSB7IDAgfTsKLQotLyogTm9uLXplcm8gaWYgcHJldl9pbnNuIGlzIHZhbGlkLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9pbnNuX3ZhbGlkOwotCi0vKiBUaGUgZnJhZyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZnJhZyAqcHJldl9pbnNuX2ZyYWc7Ci0KLS8qIFRoZSBvZmZzZXQgaW50byBwcmV2X2luc25fZnJhZyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBsb25nIHByZXZfaW5zbl93aGVyZTsKLQotLyogVGhlIHJlbG9jIHR5cGUgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgaWYgYW55LiAgKi8KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcHJldl9pbnNuX3JlbG9jX3R5cGU7Ci0KLS8qIFRoZSByZWxvYyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCBpZiBhbnkuICAqLwotc3RhdGljIGZpeFMgKnByZXZfaW5zbl9maXhwOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgZGVsYXkgc2xvdC4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl9pc19kZWxheV9zbG90OwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgLnNldCBub3Jlb3JkZXIuICAqLwotc3RhdGljIGludCBwcmV2X2luc25fdW5yZW9yZGVyZWQ7Ci0KLS8qIE5vbi16ZXJvIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB1c2VzIGFuIGV4dGVuZCBvcGNvZGUgKGlmCi0gICBtaXBzMTYpLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9pbnNuX2V4dGVuZGVkOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgLnNldAotICAgbm9yZW9yZGVyLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQ7Ci0KLS8qIElmIHRoaXMgaXMgc2V0LCBpdCBwb2ludHMgdG8gYSBmcmFnIGhvbGRpbmcgbm9wIGluc3RydWN0aW9ucyB3aGljaAotICAgd2VyZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHN0YXJ0IG9mIGEgbm9yZW9yZGVyIHNlY3Rpb24uICBJZiB0aG9zZQotICAgbm9wcyB0dXJuIG91dCB0byBiZSB1bm5lY2Vzc2FyeSwgdGhlIHNpemUgb2YgdGhlIGZyYWcgY2FuIGJlCi0gICBkZWNyZWFzZWQuICAqLwotc3RhdGljIGZyYWdTICpwcmV2X25vcF9mcmFnOwotCi0vKiBUaGUgbnVtYmVyIG9mIG5vcCBpbnN0cnVjdGlvbnMgd2UgY3JlYXRlZCBpbiBwcmV2X25vcF9mcmFnLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19ob2xkczsKLQotLyogVGhlIG51bWJlciBvZiBub3AgaW5zdHJ1Y3Rpb25zIHRoYXQgd2Uga25vdyB3ZSBuZWVkIGluCi0gICBwcmV2X25vcF9mcmFnLiAqLwotc3RhdGljIGludCBwcmV2X25vcF9mcmFnX3JlcXVpcmVkOwotCi0vKiBUaGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB3ZSd2ZSBzZWVuIHNpbmNlIHByZXZfbm9wX2ZyYWcuICAqLwotc3RhdGljIGludCBwcmV2X25vcF9mcmFnX3NpbmNlOwotCi0vKiBGb3IgRUNPRkYgYW5kIEVMRiwgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBkb25lIGluIHR3bwotICAgcGFydHMsIHdpdGggYSBISSByZWxvY2F0aW9uIGFuZCBhIExPIHJlbG9jYXRpb24uICBFYWNoIHJlbG9jYXRpb24KLSAgIGhhcyBvbmx5IDE2IGJpdHMgb2Ygc3BhY2UgdG8gc3RvcmUgYW4gYWRkZW5kLiAgVGhpcyBtZWFucyB0aGF0IGluCi0gICBvcmRlciBmb3IgdGhlIGxpbmtlciB0byBoYW5kbGUgY2FycmllcyBjb3JyZWN0bHksIGl0IG11c3QgYmUgYWJsZQotICAgdG8gbG9jYXRlIGJvdGggdGhlIEhJIGFuZCB0aGUgTE8gcmVsb2NhdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgIHJlbG9jYXRpb25zIG11c3QgYXBwZWFyIGluIG9yZGVyIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLgotCi0gICBJbiBvcmRlciB0byBpbXBsZW1lbnQgdGhpcywgd2Uga2VlcCB0cmFjayBvZiBlYWNoIHVubWF0Y2hlZCBISQotICAgcmVsb2NhdGlvbi4gIFdlIHRoZW4gc29ydCB0aGVtIHNvIHRoYXQgdGhleSBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZQotICAgY29ycmVzcG9uZGluZyBMTyByZWxvY2F0aW9uLiAqLwotCi1zdHJ1Y3QgbWlwc19oaV9maXh1cAotewotICAvKiBOZXh0IEhJIGZpeHVwLiAgKi8KLSAgc3RydWN0IG1pcHNfaGlfZml4dXAgKm5leHQ7Ci0gIC8qIFRoaXMgZml4dXAuICAqLwotICBmaXhTICpmaXhwOwotICAvKiBUaGUgc2VjdGlvbiB0aGlzIGZpeHVwIGlzIGluLiAgKi8KLSAgc2VnVCBzZWc7Ci19OwotCi0vKiBUaGUgbGlzdCBvZiB1bm1hdGNoZWQgSEkgcmVsb2NzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICptaXBzX2hpX2ZpeHVwX2xpc3Q7Ci0KLS8qIE1hcCBub3JtYWwgTUlQUyByZWdpc3RlciBudW1iZXJzIHRvIG1pcHMxNiByZWdpc3RlciBudW1iZXJzLiAgKi8KLQotI2RlZmluZSBYIElMTEVHQUxfUkVHCi1zdGF0aWMgY29uc3QgaW50IG1pcHMzMl90b18xNl9yZWdfbWFwW10gPQotewotICBYLCBYLCAyLCAzLCA0LCA1LCA2LCA3LAotICBYLCBYLCBYLCBYLCBYLCBYLCBYLCBYLAotICAwLCAxLCBYLCBYLCBYLCBYLCBYLCBYLAotICBYLCBYLCBYLCBYLCBYLCBYLCBYLCBYCi19OwotI3VuZGVmIFgKLQotLyogTWFwIG1pcHMxNiByZWdpc3RlciBudW1iZXJzIHRvIG5vcm1hbCBNSVBTIHJlZ2lzdGVyIG51bWJlcnMuICAqLwotCi1zdGF0aWMgY29uc3QgaW50IG1pcHMxNl90b18zMl9yZWdfbWFwW10gPQotewotICAxNiwgMTcsIDIsIDMsIDQsIDUsIDYsIDcKLX07Ci0MCi0vKiBTaW5jZSB0aGUgTUlQUyBkb2VzIG5vdCBoYXZlIG11bHRpcGxlIGZvcm1zIG9mIFBDIHJlbGF0aXZlCi0gICBpbnN0cnVjdGlvbnMsIHdlIGRvIG5vdCBoYXZlIHRvIGRvIHJlbGF4aW5nIGFzIGlzIGRvbmUgb24gb3RoZXIKLSAgIHBsYXRmb3Jtcy4gIEhvd2V2ZXIsIHdlIGRvIGhhdmUgdG8gaGFuZGxlIEdQIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgIGNvcnJlY3RseSwgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGEgc2ltaWxhciBwcm9ibGVtLgotCi0gICBFdmVyeSBtYWNybyB0aGF0IHJlZmVycyB0byBhIHN5bWJvbCBjYW4gb2NjdXIgaW4gKGF0IGxlYXN0KSB0d28KLSAgIGZvcm1zLCBvbmUgd2l0aCBHUCByZWxhdGl2ZSBhZGRyZXNzaW5nIGFuZCBvbmUgd2l0aG91dC4gIEZvcgotICAgZXhhbXBsZSwgbG9hZGluZyBhIGdsb2JhbCB2YXJpYWJsZSBpbnRvIGEgcmVnaXN0ZXIgZ2VuZXJhbGx5IHVzZXMKLSAgIGEgbWFjcm8gaW5zdHJ1Y3Rpb24gbGlrZSB0aGlzOgotICAgICBsdyAkNCxpCi0gICBJZiBpIGNhbiBiZSBhZGRyZXNzZWQgb2ZmIHRoZSBHUCByZWdpc3RlciAodGhpcyBpcyB0cnVlIGlmIGl0IGlzIGluCi0gICB0aGUgLnNic3Mgb3IgLnNkYXRhIHNlY3Rpb24sIG9yIGlmIGl0IGlzIGtub3duIHRvIGJlIHNtYWxsZXIgdGhhbgotICAgdGhlIC1HIGFyZ3VtZW50KSB0aGlzIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbjoKLSAgICAgbHcgJDQsaSgkZ3ApCi0gICBUaGlzIGluc3RydWN0aW9uIHdpbGwgdXNlIGEgR1BSRUwgcmVsb2MuICBJZiBpIGNhbiBub3QgYmUgYWRkcmVzc2VkCi0gICBvZmYgdGhlIEdQIHJlZ2lzdGVyLCB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uIHNlcXVlbmNlIHdpbGwgYmUgdXNlZDoKLSAgICAgbHVpICRhdCxpCi0gICAgIGx3ICQ0LGkoJGF0KQotICAgSW4gdGhpcyBjYXNlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3aWxsIGhhdmUgYSBISTE2IHJlbG9jLCBhbmQgdGhlCi0gICBzZWNvbmQgcmVsb2Mgd2lsbCBoYXZlIGEgTE8xNiByZWxvYy4gIEJvdGggcmVsb2NzIHdpbGwgYmUgYWdhaW5zdAotICAgdGhlIHN5bWJvbCBpLgotCi0gICBUaGUgaXNzdWUgaGVyZSBpcyB0aGF0IHdlIG1heSBub3Qga25vdyB3aGV0aGVyIGkgaXMgR1AgYWRkcmVzc2FibGUKLSAgIHVudGlsIGFmdGVyIHdlIHNlZSB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzIGl0LiAgVGhlcmVmb3JlLCB3ZQotICAgd2FudCB0byBiZSBhYmxlIHRvIGNob29zZSB0aGUgZmluYWwgaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugb25seSBhdAotICAgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHdheSBvdGhlcgotICAgcGxhdGZvcm1zIGNob29zZSB0aGUgc2l6ZSBvZiBhIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIG9ubHkgYXQgdGhlCi0gICBlbmQgb2YgYXNzZW1ibHkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHdlIGRvIG5vdCB1c2UgR1AKLSAgIGFkZHJlc3NpbmcgaW4gcXVpdGUgdGhlIHNhbWUgd2F5LCBidXQgdGhlIGlzc3VlIHN0aWxsIGFyaXNlcyBhcwotICAgZXh0ZXJuYWwgc3ltYm9scyBhbmQgbG9jYWwgc3ltYm9scyBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCi0KLSAgIFdlIGhhbmRsZSB0aGVzZSBpc3N1ZXMgYnkgYWN0dWFsbHkgZ2VuZXJhdGluZyBib3RoIHBvc3NpYmxlCi0gICBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMuICBUaGUgbG9uZ2VyIG9uZSBpcyBwdXQgaW4gYSBmcmFnX3ZhciB3aXRoCi0gICB0eXBlIHJzX21hY2hpbmVfZGVwZW5kZW50LiAgV2UgZW5jb2RlIHdoYXQgdG8gZG8gd2l0aCB0aGUgZnJhZyBpbgotICAgdGhlIHN1YnR5cGUgZmllbGQuICBXZSBlbmNvZGUgKDEpIHRoZSBudW1iZXIgb2YgZXhpc3RpbmcgYnl0ZXMgdG8KLSAgIHJlcGxhY2UsICgyKSB0aGUgbnVtYmVyIG9mIG5ldyBieXRlcyB0byB1c2UsICgzKSB0aGUgb2Zmc2V0IGZyb20KLSAgIHRoZSBzdGFydCBvZiB0aGUgZXhpc3RpbmcgYnl0ZXMgdG8gdGhlIGZpcnN0IHJlbG9jIHdlIG11c3QgZ2VuZXJhdGUKLSAgICh0aGF0IGlzLCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nCi0gICBieXRlcyBhZnRlciB0aGV5IGFyZSByZXBsYWNlZCBieSB0aGUgbmV3IGJ5dGVzLCBpZiBhbnkpLCAoNCkgdGhlCi0gICBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nIGJ5dGVzIHRvIHRoZSBzZWNvbmQgcmVsb2MsCi0gICAoNSkgd2hldGhlciBhIHRoaXJkIHJlbG9jIGlzIG5lZWRlZCAodGhlIHRoaXJkIHJlbG9jIGlzIGFsd2F5cyBmb3VyCi0gICBieXRlcyBhZnRlciB0aGUgc2Vjb25kIHJlbG9jKSwgYW5kICg2KSB3aGV0aGVyIHRvIHdhcm4gaWYgdGhpcwotICAgdmFyaWFudCBpcyB1c2VkICh0aGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgaWYgLnNldCBub21hY3JvIG9yIC5zZXQKLSAgIG5vYXQgaXMgaW4gZWZmZWN0KS4gIEFsbCB0aGVzZSBudW1iZXJzIGFyZSByZWFzb25hYmx5IHNtYWxsLgotCi0gICBHZW5lcmF0aW5nIHR3byBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMgbXVzdCBiZSBoYW5kbGVkIGNhcmVmdWxseSB0bwotICAgZW5zdXJlIHRoYXQgZGVsYXkgc2xvdHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiAgRm9ydHVuYXRlbHksIHRoZXJlCi0gICBhcmUgYSBsaW1pdGVkIG51bWJlciBvZiBjYXNlcy4gIFdoZW4gdGhlIHNlY29uZCBpbnN0cnVjdGlvbgotICAgc2VxdWVuY2UgaXMgZ2VuZXJhdGVkLCBhcHBlbmRfaW5zbiBpcyBkaXJlY3RlZCB0byBtYWludGFpbiB0aGUKLSAgIGV4aXN0aW5nIGRlbGF5IHNsb3QgaW5mb3JtYXRpb24sIHNvIGl0IGNvbnRpbnVlcyB0byBhcHBseSB0byBhbnkKLSAgIGNvZGUgYWZ0ZXIgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgIHNlY29uZCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBtdXN0IG5vdCBpbXBvc2UgYW55IHJlcXVpcmVtZW50cyBub3QKLSAgIHJlcXVpcmVkIGJ5IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4KLQotICAgVGhlc2UgdmFyaWFudCBmcmFncyBhcmUgdGhlbiBoYW5kbGVkIGluIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlCi0gICBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUuICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCByZXR1cm5zCi0gICB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgZnJhZy4gIG1kX2NvbnZlcnRfZnJhZyBzZXRzIHVwIHRoZSBmaW5hbCBmb3JtCi0gICBvZiB0aGUgZnJhZy4gIHRjX2dlbl9yZWxvYyBhZGp1c3QgdGhlIGZpcnN0IHJlbG9jIGFuZCBhZGRzIGEgc2Vjb25kCi0gICBvbmUgaWYgbmVlZGVkLiAgKi8KLSNkZWZpbmUgUkVMQVhfRU5DT0RFKG9sZCwgbmV3LCByZWxvYzEsIHJlbG9jMiwgcmVsb2MzLCB3YXJuKSBcCi0gICgocmVsYXhfc3Vic3RhdGVUKSBcCi0gICAoKChvbGQpIDw8IDIzKSBcCi0gICAgfCAoKG5ldykgPDwgMTYpIFwKLSAgICB8ICgoKHJlbG9jMSkgKyA2NCkgPDwgOSkgXAotICAgIHwgKCgocmVsb2MyKSArIDY0KSA8PCAyKSBcCi0gICAgfCAoKHJlbG9jMykgPyAoMSA8PCAxKSA6IDApIFwKLSAgICB8ICgod2FybikgPyAxIDogMCkpKQotI2RlZmluZSBSRUxBWF9PTEQoaSkgKCgoaSkgPj4gMjMpICYgMHg3ZikKLSNkZWZpbmUgUkVMQVhfTkVXKGkpICgoKGkpID4+IDE2KSAmIDB4N2YpCi0jZGVmaW5lIFJFTEFYX1JFTE9DMShpKSAoKGJmZF92bWEpKCgoaSkgPj4gOSkgJiAweDdmKSAtIDY0KQotI2RlZmluZSBSRUxBWF9SRUxPQzIoaSkgKChiZmRfdm1hKSgoKGkpID4+IDIpICYgMHg3ZikgLSA2NCkKLSNkZWZpbmUgUkVMQVhfUkVMT0MzKGkpICgoKGkpID4+IDEpICYgMSkKLSNkZWZpbmUgUkVMQVhfV0FSTihpKSAoKGkpICYgMSkKLQotLyogRm9yIG1pcHMxNiBjb2RlLCB3ZSB1c2UgYW4gZW50aXJlbHkgZGlmZmVyZW50IGZvcm0gb2YgcmVsYXhhdGlvbi4KLSAgIG1pcHMxNiBzdXBwb3J0cyB0d28gdmVyc2lvbnMgb2YgbW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggdGFrZQotICAgaW1tZWRpYXRlIHZhbHVlczogYSBzbWFsbCBvbmUgd2hpY2ggdGFrZXMgc29tZSBzbWFsbCB2YWx1ZSwgYW5kIGEKLSAgIGxhcmdlciBvbmUgd2hpY2ggdGFrZXMgYSAxNiBiaXQgdmFsdWUuICBTaW5jZSBicmFuY2hlcyBhbHNvIGZvbGxvdwotICAgdGhpcyBwYXR0ZXJuLCByZWxheGluZyB0aGVzZSB2YWx1ZXMgaXMgcmVxdWlyZWQuCi0KLSAgIFdlIGNhbiBhc3NlbWJsZSBib3RoIG1pcHMxNiBhbmQgbm9ybWFsIE1JUFMgY29kZSBpbiBhIHNpbmdsZQotICAgb2JqZWN0LiAgVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhpcyB0eXBlIG9mIHJlbGF4YXRpb24gYXQKLSAgIHRoZSBzYW1lIHRpbWUgdGhhdCB3ZSBzdXBwb3J0IHRoZSByZWxheGF0aW9uIGRlc2NyaWJlZCBhYm92ZS4gIFdlCi0gICB1c2UgdGhlIGhpZ2ggYml0IG9mIHRoZSBzdWJ0eXBlIGZpZWxkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzLgotCi0gICBUaGUgaW5mb3JtYXRpb24gd2Ugc3RvcmUgZm9yIHRoaXMgdHlwZSBvZiByZWxheGF0aW9uIGlzIHRoZQotICAgYXJndW1lbnQgY29kZSBmb3VuZCBpbiB0aGUgb3Bjb2RlIGZpbGUgZm9yIHRoaXMgcmVsb2NhdGlvbiwgd2hldGhlcgotICAgdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgYSBzbWFsbCBvciBleHRlbmRlZCBmb3JtLCBhbmQgd2hldGhlcgotICAgdGhlIHJlbG9jYXRpb24gaXMgaW4gYSBqdW1wIG9yIGphbCBkZWxheSBzbG90LiAgVGhhdCB0ZWxscyB1cyB0aGUKLSAgIHNpemUgb2YgdGhlIHZhbHVlLCBhbmQgaG93IGl0IHNob3VsZCBiZSBzdG9yZWQuICBXZSBhbHNvIHN0b3JlCi0gICB3aGV0aGVyIHRoZSBmcmFnbWVudCBpcyBjb25zaWRlcmVkIHRvIGJlIGV4dGVuZGVkIG9yIG5vdC4gIFdlIGFsc28KLSAgIHN0b3JlIHdoZXRoZXIgdGhpcyBpcyBrbm93biB0byBiZSBhIGJyYW5jaCB0byBhIGRpZmZlcmVudCBzZWN0aW9uLAotICAgd2hldGhlciB3ZSBoYXZlIHRyaWVkIHRvIHJlbGF4IHRoaXMgZnJhZyB5ZXQsIGFuZCB3aGV0aGVyIHdlIGhhdmUKLSAgIGV2ZXIgZXh0ZW5kZWQgYSBQQyByZWxhdGl2ZSBmcmFnbWVudCBiZWNhdXNlIG9mIGEgc2hpZnQgY291bnQuICAqLwotI2RlZmluZSBSRUxBWF9NSVBTMTZfRU5DT0RFKHR5cGUsIHNtYWxsLCBleHQsIGRzbG90LCBqYWxfZHNsb3QpCVwKLSAgKDB4ODAwMDAwMDAJCQkJCQkJXAotICAgfCAoKHR5cGUpICYgMHhmZikJCQkJCQlcCi0gICB8ICgoc21hbGwpID8gMHgxMDAgOiAwKQkJCQkJXAotICAgfCAoKGV4dCkgPyAweDIwMCA6IDApCQkJCQlcCi0gICB8ICgoZHNsb3QpID8gMHg0MDAgOiAwKQkJCQkJXAotICAgfCAoKGphbF9kc2xvdCkgPyAweDgwMCA6IDApKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfUChpKSAoKChpKSAmIDB4ODAwMDAwMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9UWVBFKGkpICgoaSkgJiAweGZmKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfVVNFUl9TTUFMTChpKSAoKChpKSAmIDB4MTAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfVVNFUl9FWFQoaSkgKCgoaSkgJiAweDIwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0RTTE9UKGkpICgoKGkpICYgMHg0MDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9KQUxfRFNMT1QoaSkgKCgoaSkgJiAweDgwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0VYVEVOREVEKGkpICgoKGkpICYgMHgxMDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfTUFSS19FWFRFTkRFRChpKSAoKGkpIHwgMHgxMDAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfQ0xFQVJfRVhURU5ERUQoaSkgKChpKSAmfiAweDEwMDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9MT05HX0JSQU5DSChpKSAoKChpKSAmIDB4MjAwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0goaSkgKChpKSB8IDB4MjAwMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0NMRUFSX0xPTkdfQlJBTkNIKGkpICgoaSkgJn4gMHgyMDAwKQotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBpbnRlcm5hbEVycm9yKCkgXAotICAgIGFzX2ZhdGFsIChfKCJpbnRlcm5hbCBFcnJvciwgbGluZSAlZCwgJXMiKSwgX19MSU5FX18sIF9fRklMRV9fKQotI2Vsc2UKLSNkZWZpbmUgaW50ZXJuYWxFcnJvcigpIGFzX2ZhdGFsIChfKCJNSVBTIGludGVybmFsIEVycm9yIikpOwotI2VuZGlmCi0KLWVudW0gbWlwc19yZWdjbGFzcyB7IE1JUFNfR1JfUkVHLCBNSVBTX0ZQX1JFRywgTUlQUzE2X1JFRyB9OwotCi1zdGF0aWMgaW50IGluc25fdXNlc19yZWcgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqaXAsCi0JCQkJICB1bnNpZ25lZCBpbnQgcmVnLCBlbnVtIG1pcHNfcmVnY2xhc3MgY2xhc3MpKTsKLXN0YXRpYyBpbnQgcmVnX25lZWRzX2RlbGF5IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWlwczE2X21hcmtfbGFiZWxzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGFwcGVuZF9pbnNuIFBBUkFNUyAoKGNoYXIgKnBsYWNlLAotCQkJCSBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXAsCi0JCQkJIGV4cHJlc3Npb25TICogcCwKLQkJCQkgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHIsCi0JCQkJIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIG1pcHNfbm9fcHJldl9pbnNuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWlwc19lbWl0X2RlbGF5cyBQQVJBTVMgKChib29sZWFuKSk7Ci0jaWZkZWYgVVNFX1NUREFSRwotc3RhdGljIHZvaWQgbWFjcm9fYnVpbGQgUEFSQU1TICgoY2hhciAqcGxhY2UsIGludCAqY291bnRlciwgZXhwcmVzc2lvblMgKiBlcCwKLQkJCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZm10LAotCQkJCSAuLi4pKTsKLSNlbHNlCi1zdGF0aWMgdm9pZCBtYWNyb19idWlsZCAoKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgbWlwczE2X21hY3JvX2J1aWxkIFBBUkFNUyAoKGNoYXIgKiwgaW50ICosIGV4cHJlc3Npb25TICosCi0JCQkJCWNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCQl2YV9saXN0KSk7Ci1zdGF0aWMgdm9pZCBtYWNyb19idWlsZF9sdWkgUEFSQU1TICgoY2hhciAqcGxhY2UsIGludCAqY291bnRlciwKLQkJCQkgICAgIGV4cHJlc3Npb25TICogZXAsIGludCByZWdudW0pKTsKLXN0YXRpYyB2b2lkIHNldF9hdCBQQVJBTVMgKChpbnQgKmNvdW50ZXIsIGludCByZWcsIGludCB1bnNpZ25lZHApKTsKLXN0YXRpYyB2b2lkIGNoZWNrX2Fic29sdXRlX2V4cHIgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwLAotCQkJCQkgZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgbG9hZF9yZWdpc3RlciBQQVJBTVMgKChpbnQgKiwgaW50LCBleHByZXNzaW9uUyAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGxvYWRfYWRkcmVzcyBQQVJBTVMgKChpbnQgKmNvdW50ZXIsIGludCByZWcsIGV4cHJlc3Npb25TICplcCkpOwotc3RhdGljIHZvaWQgbWFjcm8gUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci1zdGF0aWMgdm9pZCBtaXBzMTZfbWFjcm8gUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci0jaWZkZWYgTE9TSU5HX0NPTVBJTEVSCi1zdGF0aWMgdm9pZCBtYWNybzIgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIG1pcHNfaXAgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9pcCBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotc3RhdGljIHZvaWQgbWlwczE2X2ltbWVkIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQsIG9mZnNldFQsIGJvb2xlYW4sCi0JCQkJICBib29sZWFuLCBib29sZWFuLCB1bnNpZ25lZCBsb25nICosCi0JCQkJICBib29sZWFuICosIHVuc2lnbmVkIHNob3J0ICopKTsKLXN0YXRpYyBpbnQgbXlfZ2V0U21hbGxFeHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXAsIGNoYXIgKnN0cikpOwotc3RhdGljIHZvaWQgbXlfZ2V0RXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGVwLCBjaGFyICpzdHIpKTsKLXN0YXRpYyBzeW1ib2xTICpnZXRfc3ltYm9sIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG1pcHNfYWxpZ24gUEFSQU1TICgoaW50IHRvLCBpbnQgZmlsbCwgc3ltYm9sUyAqbGFiZWwpKTsKLXN0YXRpYyB2b2lkIHNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NoYW5nZV9zZWMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfZ2xvYmwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX29wdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc3NldCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWJpY2FsbHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NwbG9hZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfY3ByZXN0b3JlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19ncHdvcmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NwYWRkIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19pbnNuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWRfb2JqX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG1kX29ial9lbmQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGxvbmcgZ2V0X251bWJlciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfZW50IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19mcmFtZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19tYXNrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX3N0YWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfd2Vha2V4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZmlsZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgbWlwczE2X2V4dGVuZGVkX2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgYXNlY3Rpb24gKiwgbG9uZykpOwotCi0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfbWlwc19pbnNuIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqKSk7Ci0MCi0vKiBQc2V1ZG8tb3AgdGFibGUuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sKLSAgIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUsIGJ1dCBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkOiAuYWxpYXMsCi0gICAuZ2FsaXZlLCAuZ2phbGRlZiwgLmdqcmxpdmUsIC5saXZlcmVnLCAubm9hbGlhcy4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKLSAgIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBiZWluZyBnZW5lcmF0ZWQsIGFuZAotICAgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGhlIG9iamVjdCBmb3JtYXQ6IC5hZW50LCAuYmVnaW4sIC5iZW5kLAotICAgLmJnbmIsIC5lbmQsIC5lbmRiLCAuZW50LCAuZm1hc2ssIC5mcmFtZSwgLmxvYywgLm1hc2ssIC52ZXJzdGFtcCwKLSAgIC52cmVnLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQotICAgbm90IE1JUFMgQ1BVIHNwZWNpZmljLCBidXQgYXJlIGFsc28gbm90IHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZQotICAgZm9ybWF0LiAgVGhpcyBmaWxlIGlzIHByb2JhYmx5IHRoZSBiZXN0IHBsYWNlIHRvIGRlZmluZSB0aGVtLCBidXQKLSAgIHRoZXkgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkOiAuYXNtMCwgLmVuZHIsIC5sYWIsIC5yZXBlYXQsCi0gICAuc3RydWN0LiAgKi8KLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBtaXBzX3BzZXVkb190YWJsZVtdID0KLXsKLSAvKiBNSVBTIHNwZWNpZmljIHBzZXVkby1vcHMuICAqLwotICB7Im9wdGlvbiIsIHNfb3B0aW9uLCAwfSwKLSAgeyJzZXQiLCBzX21pcHNzZXQsIDB9LAotICB7InJkYXRhIiwgc19jaGFuZ2Vfc2VjLCAncid9LAotICB7InNkYXRhIiwgc19jaGFuZ2Vfc2VjLCAncyd9LAotICB7ImxpdmVyZWciLCBzX2lnbm9yZSwgMH0sCi0gIHsiYWJpY2FsbHMiLCBzX2FiaWNhbGxzLCAwfSwKLSAgeyJjcGxvYWQiLCBzX2NwbG9hZCwgMH0sCi0gIHsiY3ByZXN0b3JlIiwgc19jcHJlc3RvcmUsIDB9LAotICB7Imdwd29yZCIsIHNfZ3B3b3JkLCAwfSwKLSAgeyJjcGFkZCIsIHNfY3BhZGQsIDB9LAotICB7Imluc24iLCBzX2luc24sIDB9LAotCi0gLyogUmVsYXRpdmVseSBnZW5lcmljIHBzZXVkby1vcHMgdGhhdCBoYXBwZW4gdG8gYmUgdXNlZCBvbiBNSVBTCi0gICAgIGNoaXBzLiAgKi8KLSAgeyJhc2NpaXoiLCBzdHJpbmdlciwgMX0sCi0gIHsiYnNzIiwgc19jaGFuZ2Vfc2VjLCAnYid9LAotICB7ImVyciIsIHNfZXJyLCAwfSwKLSAgeyJoYWxmIiwgc19jb25zLCAxfSwKLSAgeyJkd29yZCIsIHNfY29ucywgM30sCi0gIHsid2Vha2V4dCIsIHNfbWlwc193ZWFrZXh0LCAwfSwKLQotIC8qIFRoZXNlIHBzZXVkby1vcHMgYXJlIGRlZmluZWQgaW4gcmVhZC5jLCBidXQgbXVzdCBiZSBvdmVycmlkZGVuCi0gICAgIGhlcmUgZm9yIG9uZSByZWFzb24gb3IgYW5vdGhlci4gICovCi0gIHsiYWxpZ24iLCBzX2FsaWduLCAwfSwKLSAgeyJieXRlIiwgc19jb25zLCAwfSwKLSAgeyJkYXRhIiwgc19jaGFuZ2Vfc2VjLCAnZCd9LAotICB7ImRvdWJsZSIsIHNfZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJmbG9hdCIsIHNfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJnbG9ibCIsIHNfbWlwc19nbG9ibCwgMH0sCi0gIHsiZ2xvYmFsIiwgc19taXBzX2dsb2JsLCAwfSwKLSAgeyJod29yZCIsIHNfY29ucywgMX0sCi0gIHsiaW50Iiwgc19jb25zLCAyfSwKLSAgeyJsb25nIiwgc19jb25zLCAyfSwKLSAgeyJvY3RhIiwgc19jb25zLCA0fSwKLSAgeyJxdWFkIiwgc19jb25zLCAzfSwKLSAgeyJzaG9ydCIsIHNfY29ucywgMX0sCi0gIHsic2luZ2xlIiwgc19mbG9hdF9jb25zLCAnZid9LAotICB7InN0YWJuIiwgc19taXBzX3N0YWIsICduJ30sCi0gIHsidGV4dCIsIHNfY2hhbmdlX3NlYywgJ3QnfSwKLSAgeyJ3b3JkIiwgc19jb25zLCAyfSwKLSAgeyAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIG1pcHNfbm9uZWNvZmZfcHNldWRvX3RhYmxlW10gPSB7Ci0gLyogVGhlc2UgcHNldWRvLW9wcyBzaG91bGQgYmUgZGVmaW5lZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgIEhvd2V2ZXIsIGEub3V0IGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLCBzbyB3ZSBoYXZlIHZlcnNpb25zIGhlcmUuICAqLwotICB7ImFlbnQiLCBzX21pcHNfZW50LCAxfSwKLSAgeyJiZ25iIiwgc19pZ25vcmUsIDB9LAotICB7ImVuZCIsIHNfbWlwc19lbmQsIDB9LAotICB7ImVuZGIiLCBzX2lnbm9yZSwgMH0sCi0gIHsiZW50Iiwgc19taXBzX2VudCwgMH0sCi0gIHsiZmlsZSIsIHNfZmlsZSwgMH0sCi0gIHsiZm1hc2siLCBzX21pcHNfbWFzaywgJ0YnfSwKLSAgeyJmcmFtZSIsIHNfbWlwc19mcmFtZSwgMH0sCi0gIHsibG9jIiwgc19pZ25vcmUsIDB9LAotICB7Im1hc2siLCBzX21pcHNfbWFzaywgJ1InfSwKLSAgeyJ2ZXJzdGFtcCIsIHNfaWdub3JlLCAwfSwKLSAgeyAwIH0sCi19OwotCi1leHRlcm4gdm9pZCBwb3BfaW5zZXJ0IFBBUkFNUyAoKGNvbnN0IHBzZXVkb190eXBlUyAqKSk7Ci0KLXZvaWQKLW1pcHNfcG9wX2luc2VydCAoKQotewotICBwb3BfaW5zZXJ0IChtaXBzX3BzZXVkb190YWJsZSk7Ci0gIGlmICghIEVDT0ZGX0RFQlVHR0lORykKLSAgICBwb3BfaW5zZXJ0IChtaXBzX25vbmVjb2ZmX3BzZXVkb190YWJsZSk7Ci19Ci0MCi0vKiBTeW1ib2xzIGxhYmVsbGluZyB0aGUgY3VycmVudCBpbnNuLiAgKi8KLQotc3RydWN0IGluc25fbGFiZWxfbGlzdAotewotICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpuZXh0OwotICBzeW1ib2xTICpsYWJlbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICppbnNuX2xhYmVsczsKLXN0YXRpYyBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpmcmVlX2luc25fbGFiZWxzOwotCi1zdGF0aWMgdm9pZCBtaXBzX2NsZWFyX2luc25fbGFiZWxzIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGlubGluZSB2b2lkCi1taXBzX2NsZWFyX2luc25fbGFiZWxzICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKipwbDsKLQotICBmb3IgKHBsID0gJmZyZWVfaW5zbl9sYWJlbHM7ICpwbCAhPSBOVUxMOyBwbCA9ICYoKnBsKS0+bmV4dCkKLSAgICA7Ci0gICpwbCA9IGluc25fbGFiZWxzOwotICBpbnNuX2xhYmVscyA9IE5VTEw7Ci19Ci0MCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci0KLS8qIEV4cHJlc3Npb25zIHdoaWNoIGFwcGVhciBpbiBpbnN0cnVjdGlvbnMuICBUaGVzZSBhcmUgc2V0IGJ5Ci0gICBtaXBzX2lwLiAgKi8KLQotc3RhdGljIGV4cHJlc3Npb25TIGltbV9leHByOwotc3RhdGljIGV4cHJlc3Npb25TIG9mZnNldF9leHByOwotCi0vKiBSZWxvY3MgYXNzb2NpYXRlZCB3aXRoIGltbV9leHByIGFuZCBvZmZzZXRfZXhwci4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgaW1tX3JlbG9jOwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBvZmZzZXRfcmVsb2M7Ci0KLS8qIFRoaXMgaXMgc2V0IGJ5IG1pcHNfaXAgaWYgaW1tX3JlbG9jIGlzIGFuIHVubWF0Y2hlZCBISTE2X1MgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBpbW1fdW5tYXRjaGVkX2hpOwotCi0vKiBUaGVzZSBhcmUgc2V0IGJ5IG1pcHMxNl9pcCBpZiBhbiBleHBsaWNpdCBleHRlbnNpb24gaXMgdXNlZC4gICovCi0KLXN0YXRpYyBib29sZWFuIG1pcHMxNl9zbWFsbCwgbWlwczE2X2V4dDsKLQotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0vKiBUaGUgcGRyIHNlZ21lbnQgZm9yIHBlciBwcm9jZWR1cmUgZnJhbWUvcmVnbWFzayBpbmZvICovCi0KLXN0YXRpYyBzZWdUIHBkcl9zZWc7Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAqIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLgotICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBib29sZWFuIG9rID0gZmFsc2U7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpID0gMDsKLSAgY29uc3QgY2hhciAqY3B1OwotICBjaGFyICphID0gTlVMTDsKLSAgaW50IGJyb2tlbiA9IDA7Ci0gIGludCBtaXBzX2lzYV9mcm9tX2NwdTsKLQotICBjcHUgPSBUQVJHRVRfQ1BVOwotICBpZiAoc3RyY21wIChjcHUgKyAoc2l6ZW9mIFRBUkdFVF9DUFUpIC0gMywgImVsIikgPT0gMCkKLSAgICB7Ci0gICAgICBhID0geG1hbGxvYyAoc2l6ZW9mIFRBUkdFVF9DUFUpOwotICAgICAgc3RyY3B5IChhLCBUQVJHRVRfQ1BVKTsKLSAgICAgIGFbKHNpemVvZiBUQVJHRVRfQ1BVKSAtIDNdID0gJ1wwJzsKLSAgICAgIGNwdSA9IGE7Ci0gICAgfQotCi0gIGlmIChtaXBzX2NwdSA8IDApCi0gICAgewotICAgICAgLyogU2V0IG1pcHNfY3B1IGJhc2VkIG9uIFRBUkdFVF9DUFUsIHVubGVzcyBUQVJHRVRfQ1BVIGlzCi0gICAgICAgICBqdXN0IHRoZSBnZW5lcmljICdtaXBzJywgaW4gd2hpY2ggY2FzZSBzZXQgbWlwc19jcHUgYmFzZWQKLSAgICAgICAgIG9uIHRoZSBnaXZlbiBJU0EsIGlmIGFueS4gKi8KLQotICAgICAgaWYgKHN0cmNtcCAoY3B1LCAibWlwcyIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWlwc19vcHRzLmlzYSA8IDApCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDMwMDA7ICAgCi0KLSAgICAgICAgICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDIpCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDYwMDA7Ci0KLSAgICAgICAgICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDMpCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDQwMDA7Ci0KLSAgICAgICAgICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDQpCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDgwMDA7Ci0KLSAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgbWlwc19jcHUgPSAzMDAwOwotICAgICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjM5MDAiKSA9PSAwCi0gICAgICAgICAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHN0eDM5IikgPT0gMAotICAgICAgICAgICAgICAgKQotICAgICAgICBtaXBzX2NwdSA9IDM5MDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjYwMDAiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczIiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDYwMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0IikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgInI0MDAwIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHMzIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MDAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0NDAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0NDAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NG9yaW9uIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgInI0NjAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0NjAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0NjUwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0NjUwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNDMwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDMwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjR2cjQxMTEiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQxMTE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0dnI0MTAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MTAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0MDEwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MDEwOwotCi0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjUwMDAiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczY0dnI1MDAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA1MDAwOwotCi0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyODAwMCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzNCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gODAwMDsKLSAgICAgIAotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyMTAwMDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDEwMDAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHMxNiIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gMDsgLyogRklYTUUgKi8KLQotICAgICAgZWxzZQotICAgICAgICBtaXBzX2NwdSA9IDMwMDA7Ci0gICAgfQotCi0gIGlmIChtaXBzX2NwdSA9PSAzMDAwCi0gICAgICB8fCBtaXBzX2NwdSA9PSAzOTAwKQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gMTsKLQotICBlbHNlIGlmIChtaXBzX2NwdSA9PSA2MDAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDAxMCkKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDI7Ci0KLSAgZWxzZSBpZiAobWlwc19jcHUgPT0gNDAwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQxMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0MTExCi0JICAgfHwgbWlwc19jcHUgPT0gNDQwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQzMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0NjAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDY1MCkKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDM7Ci0KLSAgZWxzZSBpZiAobWlwc19jcHUgPT0gNTAwMAotCSAgIHx8IG1pcHNfY3B1ID09IDgwMDAKLSAgICAgICAgICAgICAgIHx8IG1pcHNfY3B1ID09IDEwMDAwKQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gNDsKLQotICBlbHNlCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSAtMTsKLQotICBpZiAobWlwc19vcHRzLmlzYSA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAobWlwc19pc2FfZnJvbV9jcHUgIT0gLTEpCi0JbWlwc19vcHRzLmlzYSA9IG1pcHNfaXNhX2Zyb21fY3B1OwotICAgICAgZWxzZQotCW1pcHNfb3B0cy5pc2EgPSAxOwotICAgIH0KLQotICBpZiAobWlwc19vcHRzLm1pcHMxNiA8IDApCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJtaXBzMTYiLCBzaXplb2YgIm1pcHMxNiIgLSAxKSA9PSAwKQotCW1pcHNfb3B0cy5taXBzMTYgPSAxOwotICAgICAgZWxzZQotCW1pcHNfb3B0cy5taXBzMTYgPSAwOwotICAgIH0KLQotICAvKiBFbmQgb2YgVEFSR0VUX0NQVSBwcm9jZXNzaW5nLCBnZXQgcmlkIG9mIG1hbGxvY2VkIG1lbW9yeQotICAgICBpZiBuZWNlc3NhcnkuICovCi0gIGNwdSA9IE5VTEw7Ci0gIGlmIChhICE9IE5VTEwpCi0gICAgewotICAgIGZyZWUgKGEpOwotICAgIGEgPSBOVUxMOwotICAgIH0KLQotICBpZiAobWlwc19vcHRzLmlzYSA8IDIgJiYgbWlwc190cmFwKQotICAgIGFzX2JhZCAoXygidHJhcCBleGNlcHRpb24gbm90IHN1cHBvcnRlZCBhdCBJU0EgMSIpKTsKLQotICAvKiBTZXQgdGhlIEVBQkkga2luZCBiYXNlZCBvbiB0aGUgSVNBIGJlZm9yZSB0aGUgdXNlciBnZXRzCi0gICAgIHRvIGNoYW5nZSB0aGUgSVNBIHdpdGggZGlyZWN0aXZlcy4gIFRoaXMgaXNuJ3QgcmVhbGx5Ci0gICAgIHRoZSBiZXN0LCBidXQgdGhlbiBuZWl0aGVyIGlzIGJhc2luZyB0aGUgYWJpIG9uIHRoZSBpc2EuICovICAgICAKLSAgaWYgKG1pcHNfb3B0cy5pc2EgPiAyIAotICAgICAgJiYgbWlwc19hYmlfc3RyaW5nCi0gICAgICAmJiAwID09IHN0cmNtcCAobWlwc19hYmlfc3RyaW5nLCJlYWJpIikpCi0gICAgbWlwc19lYWJpNjQgPSAxOwotCi0gIGlmIChtaXBzX2NwdSAhPSAwICYmIG1pcHNfY3B1ICE9IC0xKQotICAgIHsKLSAgICAgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgbWlwc19jcHUpOwotCi0gICAgICAvKiBJZiB0aGV5IGFza2VkIGZvciBtaXBzMSBvciBtaXBzMiBhbmQgYSBjcHUgdGhhdCBpcwotCSBtaXBzMyBvciBncmVhdGVyLCB0aGVuIG1hcmsgdGhlIG9iamVjdCBmaWxlIDMyQklUTU9ERS4gKi8KLSAgICAgIGlmIChtaXBzX2lzYV9mcm9tX2NwdSAhPSAtMQotCSAgJiYgbWlwc19vcHRzLmlzYSA8PSAyICYmIG1pcHNfaXNhX2Zyb21fY3B1ID4gMikKLQltaXBzXzMyYml0bW9kZSA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChtaXBzX29wdHMuaXNhKQotCXsKLQljYXNlIDE6Ci0JICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDMwMDApOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCA2MDAwKTsKLQkgIGJyZWFrOwotCWNhc2UgMzoKLQkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgNDAwMCk7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDgwMDApOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoISBvaykKLSAgICBhc193YXJuIChfKCJDb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICBmaWxlX21pcHNfaXNhID0gbWlwc19vcHRzLmlzYTsKLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTU9QQ09ERVM7KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtaXBzX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChQVFIpICZtaXBzX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLAotCQkgICBtaXBzX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQkgIC8qIFByb2JhYmx5IGEgbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbT8gIEdpdmUgdXAgbm93LiAgKi8KLQkgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmIChtaXBzX29wY29kZXNbaV0ucGluZm8gIT0gSU5TTl9NQUNSTykKLQkgICAgewotCSAgICAgIGlmICghdmFsaWRhdGVfbWlwc19pbnNuICgmbWlwc19vcGNvZGVzW2ldKSkKLQkJYnJva2VuID0gMTsKLQkgICAgfQotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlICgoaSA8IE5VTU9QQ09ERVMpICYmICFzdHJjbXAgKG1pcHNfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIG1pcHMxNl9vcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlIChpIDwgYmZkX21pcHMxNl9udW1fb3Bjb2RlcykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbWlwczE2X29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG1pcHMxNl9vcF9oYXNoLCBuYW1lLCAoUFRSKSAmbWlwczE2X29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCWFzX2ZhdGFsIChfKCJpbnRlcm5hbDogY2FuJ3QgaGFzaCBgJXMnOiAlcyIpLAotCQkgIG1pcHMxNl9vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0gICAgICBkbwotCXsKLQkgIGlmIChtaXBzMTZfb3Bjb2Rlc1tpXS5waW5mbyAhPSBJTlNOX01BQ1JPCi0JICAgICAgJiYgKChtaXBzMTZfb3Bjb2Rlc1tpXS5tYXRjaCAmIG1pcHMxNl9vcGNvZGVzW2ldLm1hc2spCi0JCSAgIT0gbWlwczE2X29wY29kZXNbaV0ubWF0Y2gpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogYmFkIG1pcHMxNiBvcGNvZGU6ICVzICVzXG4iKSwKLQkJICAgICAgIG1pcHMxNl9vcGNvZGVzW2ldLm5hbWUsIG1pcHMxNl9vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGJyb2tlbiA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoaSA8IGJmZF9taXBzMTZfbnVtX29wY29kZXMKLQkgICAgICYmIHN0cmNtcCAobWlwczE2X29wY29kZXNbaV0ubmFtZSwgbmFtZSkgPT0gMCk7Ci0gICAgfQotCi0gIGlmIChicm9rZW4pCi0gICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCi0gIC8qIFdlIGFkZCBhbGwgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgbmFtZXMgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMKLSAgICAgaGVscHMgdXMgZGV0ZWN0IGludmFsaWQgdXNlcyBvZiB0aGVtLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0gICAgewotICAgICAgY2hhciBidWZbNV07Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiQlZCIsIGkpOwotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCByZWdfc2VjdGlvbiwgaSwKLQkJCQkgICAgICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gICAgfQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGZwIiwgcmVnX3NlY3Rpb24sIEZQLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJHNwIiwgcmVnX3NlY3Rpb24sIFNQLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGdwIiwgcmVnX3NlY3Rpb24sIEdQLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGF0IiwgcmVnX3NlY3Rpb24sIEFULAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGt0MCIsIHJlZ19zZWN0aW9uLCBLVDAsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIka3QxIiwgcmVnX3NlY3Rpb24sIEtUMSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRwYyIsIHJlZ19zZWN0aW9uLCAtMSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLQotICBtaXBzX25vX3ByZXZfaW5zbiAoZmFsc2UpOwotCi0gIG1pcHNfZ3BybWFzayA9IDA7Ci0gIG1pcHNfY3BybWFza1swXSA9IDA7Ci0gIG1pcHNfY3BybWFza1sxXSA9IDA7Ci0gIG1pcHNfY3BybWFza1syXSA9IDA7Ci0gIG1pcHNfY3BybWFza1szXSA9IDA7Ci0KLSAgLyogc2V0IHRoZSBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGhlIHRleHQgc2VjdGlvbiAoMioqMikgKi8KLSAgcmVjb3JkX2FsaWdubWVudCAodGV4dF9zZWN0aW9uLCAyKTsKLQotICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLSAgICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgZ19zd2l0Y2hfdmFsdWUpOwotCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgLyogT24gYSBuYXRpdmUgc3lzdGVtLCBzZWN0aW9ucyBtdXN0IGJlIGFsaWduZWQgdG8gMTYgYnl0ZQotCSBib3VuZGFyaWVzLiAgV2hlbiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYgdGFyZ2V0LCB3ZQotCSBkb24ndCBib3RoZXIuICAqLwotICAgICAgaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKLQl7Ci0JICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sIDQpOwotCSAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uLCA0KTsKLQkgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIGJzc19zZWN0aW9uLCA0KTsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhIC5yZWdpbmZvIHNlY3Rpb24gZm9yIHJlZ2lzdGVyIG1hc2tzIGFuZCBhIC5tZGVidWcKLQkgc2VjdGlvbiBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHsKLQlzZWdUIHNlZzsKLQlzdWJzZWdUIHN1YnNlZzsKLQlmbGFnd29yZCBmbGFnczsKLQlzZWdUIHNlYzsKLQotCXNlZyA9IG5vd19zZWc7Ci0Jc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCS8qIFRoZSBBQkkgc2F5cyB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlIGxvYWRlZCBzbyB0aGF0IHRoZQotCSAgIHJ1bm5pbmcgcHJvZ3JhbSBjYW4gYWNjZXNzIGl0LiAgSG93ZXZlciwgd2UgZG9uJ3QgbG9hZCBpdAotCSAgIGlmIHdlIGFyZSBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCB0YXJnZXQgKi8KLQlmbGFncyA9IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBOwotCWlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JICBmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQotCWlmICghIG1pcHNfNjQpCi0JICB7Ci0JICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIucmVnaW5mbyIsIChzdWJzZWdUKSAwKTsKLQotCi0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlYywgMik7Ci0JCi0jaWZkZWYgT0JKX0VMRgotCSAgICBtaXBzX3JlZ21hc2tfZnJhZyA9IGZyYWdfbW9yZSAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0jZW5kaWYKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIFRoZSA2NC1iaXQgQUJJIHVzZXMgYSAuTUlQUy5vcHRpb25zIHNlY3Rpb24gcmF0aGVyIHRoYW4KLSAgICAgICAgICAgICAgIC5yZWdpbmZvIHNlY3Rpb24uICAqLwotCSAgICBzZWMgPSBzdWJzZWdfbmV3ICgiLk1JUFMub3B0aW9ucyIsIChzdWJzZWdUKSAwKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VjLCAzKTsKLQotI2lmZGVmIE9CSl9FTEYKLQkgICAgLyogU2V0IHVwIHRoZSBvcHRpb24gaGVhZGVyLiAgKi8KLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zIG9wdGhkcjsKLQkgICAgICBjaGFyICpmOwotCi0JICAgICAgb3B0aGRyLmtpbmQgPSBPREtfUkVHSU5GTzsKLQkgICAgICBvcHRoZHIuc2l6ZSA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKQotCQkJICAgICArIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykpOwotCSAgICAgIG9wdGhkci5zZWN0aW9uID0gMDsKLQkgICAgICBvcHRoZHIuaW5mbyA9IDA7Ci0JICAgICAgZiA9IGZyYWdfbW9yZSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpOwotCSAgICAgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0IChzdGRvdXRwdXQsICZvcHRoZHIsCi0JCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGYpOwotCi0JICAgICAgbWlwc19yZWdtYXNrX2ZyYWcgPSBmcmFnX21vcmUgKHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykpOwotCSAgICB9Ci0jZW5kaWYKLQkgIH0KLQotCWlmIChFQ09GRl9ERUJVR0dJTkcpCi0JICB7Ci0JICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIubWRlYnVnIiwgKHN1YnNlZ1QpIDApOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VjLCAyKTsKLQkgIH0KLQotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0JcGRyX3NlZyA9IHN1YnNlZ19uZXcgKCIucGRyIiwgKHN1YnNlZ1QpIDApOwotCSh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcGRyX3NlZywKLQkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX1JFTE9DIHwgU0VDX0RFQlVHR0lORyk7Ci0JKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgcGRyX3NlZywgMik7Ci0jZW5kaWYKLQotCXN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKCEgRUNPRkZfREVCVUdHSU5HKQotICAgIG1kX29ial9iZWdpbiAoKTsKLX0KLQotdm9pZAotbWRfbWlwc19lbmQgKCkKLXsKLSAgaWYgKCEgRUNPRkZfREVCVUdHSU5HKQotICAgIG1kX29ial9lbmQgKCk7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RydWN0IG1pcHNfY2xfaW5zbiBpbnNuOwotCi0gIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgaW1tX3VubWF0Y2hlZF9oaSA9IGZhbHNlOwotICBvZmZzZXRfZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X2lwIChzdHIsICZpbnNuKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG1pcHNfaXAgKHN0ciwgJmluc24pOwotICAgICAgREJHKChfKCJyZXR1cm5lZCBmcm9tIG1pcHNfaXAoJXMpIGluc25fb3Bjb2RlID0gMHgleFxuIiksIAotCQlzdHIsIGluc24uaW5zbl9vcGNvZGUpKTsKLSAgICB9Ci0KLSAgaWYgKGluc25fZXJyb3IpCi0gICAgewotICAgICAgYXNfYmFkICgiJXMgYCVzJyIsIGluc25fZXJyb3IsIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnNuLmluc25fbW8tPnBpbmZvID09IElOU05fTUFDUk8pCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0JbWlwczE2X21hY3JvICgmaW5zbik7Ci0gICAgICBlbHNlCi0JbWFjcm8gKCZpbnNuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2Fic2VudCkKLQlhcHBlbmRfaW5zbiAoKGNoYXIgKikgTlVMTCwgJmluc24sICZpbW1fZXhwciwgaW1tX3JlbG9jLAotCQkgICAgIGltbV91bm1hdGNoZWRfaGkpOwotICAgICAgZWxzZSBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2Fic2VudCkKLQlhcHBlbmRfaW5zbiAoKGNoYXIgKikgTlVMTCwgJmluc24sICZvZmZzZXRfZXhwciwgb2Zmc2V0X3JlbG9jLCBmYWxzZSk7Ci0gICAgICBlbHNlCi0JYXBwZW5kX2luc24gKChjaGFyICopIE5VTEwsICZpbnNuLCBOVUxMLCBCRkRfUkVMT0NfVU5VU0VELCBmYWxzZSk7Ci0gICAgfQotfQotCi0vKiBTZWUgd2hldGhlciBpbnN0cnVjdGlvbiBJUCByZWFkcyByZWdpc3RlciBSRUcuICBDTEFTUyBpcyB0aGUgdHlwZQotICAgb2YgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgaW50Ci1pbnNuX3VzZXNfcmVnIChpcCwgcmVnLCBjbGFzcykKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci0gICAgIHVuc2lnbmVkIGludCByZWc7Ci0gICAgIGVudW0gbWlwc19yZWdjbGFzcyBjbGFzczsKLXsKLSAgaWYgKGNsYXNzID09IE1JUFMxNl9SRUcpCi0gICAgewotICAgICAgYXNzZXJ0IChtaXBzX29wdHMubWlwczE2KTsKLSAgICAgIHJlZyA9IG1pcHMxNl90b18zMl9yZWdfbWFwW3JlZ107Ci0gICAgICBjbGFzcyA9IE1JUFNfR1JfUkVHOwotICAgIH0KLQotICAvKiBEb24ndCByZXBvcnQgb24gZ2VuZXJhbCByZWdpc3RlciAwLCBzaW5jZSBpdCBuZXZlciBjaGFuZ2VzLiAgKi8KLSAgaWYgKGNsYXNzID09IE1JUFNfR1JfUkVHICYmIHJlZyA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmIChjbGFzcyA9PSBNSVBTX0ZQX1JFRykKLSAgICB7Ci0gICAgICBhc3NlcnQgKCEgbWlwc19vcHRzLm1pcHMxNik7Ci0gICAgICAvKiBJZiB3ZSBhcmUgY2FsbGVkIHdpdGggZWl0aGVyICRmMCBvciAkZjEsIHdlIG11c3QgY2hlY2sgJGYwLgotCSBUaGlzIGlzIG5vdCBvcHRpbWFsLCBiZWNhdXNlIGl0IHdpbGwgaW50cm9kdWNlIGFuIHVubmVjZXNzYXJ5Ci0JIE5PUCBiZXR3ZWVuICJsd2MxICRmMCIgYW5kICJzd2MxICRmMSIuICBUbyBmaXggdGhpcyB3ZSB3b3VsZAotCSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHJlYWRpbmcgYm90aCAkZjAgYW5kICRmMSBvciBqdXN0IG9uZSBvZgotCSB0aGVtLiAgTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlIG90aGVyIHdheSwKLQkgYmVjYXVzZSB0aGVyZSBpcyBubyBpbnN0cnVjdGlvbiB0aGF0IHNldHMgYm90aCAkZjAgYW5kICRmMQotCSBhbmQgcmVxdWlyZXMgYSBkZWxheS4gICovCi0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9GUFJfUykKLQkgICYmICgoKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlMpICYgT1BfTUFTS19GUykgJn4odW5zaWduZWQpMSkKLQkgICAgICA9PSAocmVnICZ+ICh1bnNpZ25lZCkgMSkpKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfRlBSX1QpCi0JICAmJiAoKCgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlQpICZ+KHVuc2lnbmVkKTEpCi0JICAgICAgPT0gKHJlZyAmfiAodW5zaWduZWQpIDEpKSkKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgbWlwc19vcHRzLm1pcHMxNikKLSAgICB7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9HUFJfUykKLQkgICYmICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlMpID09IHJlZykKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0dQUl9UKQotCSAgJiYgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCkgPT0gcmVnKQotCXJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9YKQotCSAgJiYgKG1pcHMxNl90b18zMl9yZWdfbWFwWygoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKQotCQkJCSAgICAmIE1JUFMxNk9QX01BU0tfUlgpXQotCSAgICAgID09IHJlZykpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWSkKLQkgICYmIChtaXBzMTZfdG9fMzJfcmVnX21hcFsoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWSkKLQkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX1JZKV0KLQkgICAgICA9PSByZWcpKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1opCi0JICAmJiAobWlwczE2X3RvXzMyX3JlZ19tYXBbKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfTU9WRTMyWikKLQkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopXQotCSAgICAgID09IHJlZykpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfVCkgJiYgcmVnID09IFRSRUcpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfU1ApICYmIHJlZyA9PSBTUCkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF8zMSkgJiYgcmVnID09IFJBKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YKQotCSAgJiYgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUkVHUjMyKQotCSAgICAgICYgTUlQUzE2T1BfTUFTS19SRUdSMzIpID09IHJlZykKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIG1vZGlmeWluZyBhIHJlZ2lzdGVyIHJlcXVpcmVzIGEKLSAgIGRlbGF5LiAgKi8KLQotc3RhdGljIGludAotcmVnX25lZWRzX2RlbGF5IChyZWcpCi0gICAgIGludCByZWc7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcHJldl9waW5mbzsKLQotICBwcmV2X3BpbmZvID0gcHJldl9pbnNuLmluc25fbW8tPnBpbmZvOwotICBpZiAoISBtaXBzX29wdHMubm9yZW9yZGVyCi0gICAgICAmJiBtaXBzX29wdHMuaXNhIDwgNAotICAgICAgJiYgKChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSkKLQkgIHx8ICghIGdwcl9pbnRlcmxvY2tzCi0JICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkpKQotICAgIHsKLSAgICAgIC8qIEEgbG9hZCBmcm9tIGEgY29wcm9jZXNzb3Igb3IgZnJvbSBtZW1vcnkuICBBbGwgbG9hZAotCSBkZWxheXMgZGVsYXkgdGhlIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIHJ0IGZvciBvbmUKLQkgaW5zdHJ1Y3Rpb24gb24gdGhlIHIzMDAwLiAgVGhlIHI2MDAwIGFuZCByNDAwMCB1c2UKLQkgaW50ZXJsb2Nrcy4gICovCi0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBrbm93IChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCk7Ci0gICAgICBpZiAocmVnID09ICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpKQotCXJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0bwotICAgaGFuZGxlIHRoZW0gc3BlY2lhbGx5LCBzdWNoIGFzIGdlbmVyYXRpbmcgamFseCBpbnN0cnVjdGlvbnMgd2hlbgotICAgbmVlZGVkLiAgV2UgYWxzbyBtYWtlIHRoZW0gb2RkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFzc2VtYmx5LCBpbgotICAgb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHJpZ2h0IHNvcnQgb2YgY29kZS4gIFdlIHdpbGwgbWFrZSB0aGVtIGV2ZW4KLSAgIGluIHRoZSBhZGp1c3Rfc3ltdGFiIHJvdXRpbmUsIHdoaWxlIGxlYXZpbmcgdGhlbSBtYXJrZWQuICBUaGlzIGlzCi0gICBjb252ZW5pZW50IGZvciB0aGUgZGVidWdnZXIgYW5kIHRoZSBkaXNhc3NlbWJsZXIuICBUaGUgbGlua2VyIGtub3dzCi0gICB0byBtYWtlIHRoZW0gb2RkIGFnYWluLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9tYXJrX2xhYmVscyAoKQotewotICBpZiAobWlwc19vcHRzLm1pcHMxNikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0gICAgICBmb3IgKGwgPSBpbnNuX2xhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQl7Ci0jaWZkZWYgT0JKX0VMRgotCSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgU19TRVRfT1RIRVIgKGwtPmxhYmVsLCBTVE9fTUlQUzE2KTsKLSNlbmRpZgotCSAgaWYgKChTX0dFVF9WQUxVRSAobC0+bGFiZWwpICYgMSkgPT0gMCkKLQkgICAgU19TRVRfVkFMVUUgKGwtPmxhYmVsLCBTX0dFVF9WQUxVRSAobC0+bGFiZWwpICsgMSk7Ci0JfQotICAgIH0KLX0KLQotLyogT3V0cHV0IGFuIGluc3RydWN0aW9uLiAgUExBQ0UgaXMgd2hlcmUgdG8gcHV0IHRoZSBpbnN0cnVjdGlvbjsgaWYKLSAgIGl0IGlzIE5VTEwsIHRoaXMgdXNlcyBmcmFnX21vcmUgdG8gZ2V0IHJvb20uICBJUCBpcyB0aGUgaW5zdHJ1Y3Rpb24KLSAgIGluZm9ybWF0aW9uLiAgQUREUkVTU19FWFBSIGlzIGFuIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlCi0gICB1c2VkIHdpdGggUkVMT0NfVFlQRS4gICovCi0KLXN0YXRpYyB2b2lkCi1hcHBlbmRfaW5zbiAocGxhY2UsIGlwLCBhZGRyZXNzX2V4cHIsIHJlbG9jX3R5cGUsIHVubWF0Y2hlZF9oaSkKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotICAgICBleHByZXNzaW9uUyAqYWRkcmVzc19leHByOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKLSAgICAgYm9vbGVhbiB1bm1hdGNoZWRfaGk7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcHJldl9waW5mbywgcGluZm87Ci0gIGNoYXIgKmY7Ci0gIGZpeFMgKmZpeHA7Ci0gIGludCBub3BzID0gMDsKLQotICAvKiBNYXJrIGluc3RydWN0aW9uIGxhYmVscyBpbiBtaXBzMTYgbW9kZS4gICovCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKLQotICBwcmV2X3BpbmZvID0gcHJldl9pbnNuLmluc25fbW8tPnBpbmZvOwotICBwaW5mbyA9IGlwLT5pbnNuX21vLT5waW5mbzsKLQotICBpZiAocGxhY2UgPT0gTlVMTCAmJiAoISBtaXBzX29wdHMubm9yZW9yZGVyIHx8IHByZXZfbm9wX2ZyYWcgIT0gTlVMTCkpCi0gICAgewotICAgICAgaW50IHByZXZfcHJldl9ub3A7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnNuIHJlcXVpcmVkIGFueSBkZWxheSBzbG90cywgc2VlIGlmIHdlIG5lZWQKLQkgdG8gaW5zZXJ0IGEgTk9QIG9yIHR3by4gIFRoZXJlIGFyZSBlaWdodCBraW5kcyBvZiBwb3NzaWJsZQotCSBoYXphcmRzLCBvZiB3aGljaCBhbiBpbnN0cnVjdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB0eXBlLgotCSAoMSkgYSBsb2FkIGZyb20gbWVtb3J5IGRlbGF5Ci0JICgyKSBhIGxvYWQgZnJvbSBhIGNvcHJvY2Vzc29yIGRlbGF5Ci0JICgzKSBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheQotCSAoNCkgYSBjb25kaXRpb25hbCBicmFuY2ggZGVsYXkKLQkgKDUpIGEgbW92ZSB0byBjb3Byb2Nlc3NvciByZWdpc3RlciBkZWxheQotCSAoNikgYSBsb2FkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGZyb20gbWVtb3J5IGRlbGF5Ci0JICg3KSBhIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlIGRlbGF5Ci0JICg4KSBhIEhJL0xPIHNwZWNpYWwgcmVnaXN0ZXIgZGVsYXkKLQotCSBUaGVyZSBhcmUgYSBsb3Qgb2Ygb3B0aW1pemF0aW9ucyB3ZSBjb3VsZCBkbyB0aGF0IHdlIGRvbid0LgotCSBJbiBwYXJ0aWN1bGFyLCB3ZSBkbyBub3QsIGluIGdlbmVyYWwsIHJlb3JkZXIgaW5zdHJ1Y3Rpb25zLgotCSBJZiB5b3UgdXNlIGdjYyB3aXRoIG9wdGltaXphdGlvbiwgaXQgd2lsbCByZW9yZGVyCi0JIGluc3RydWN0aW9ucyBhbmQgZ2VuZXJhbGx5IGRvIG11Y2ggbW9yZSBvcHRpbWl6YXRpb24gdGhlbiB3ZQotCSBkbyBoZXJlOyByZXBlYXRpbmcgYWxsIHRoYXQgd29yayBpbiB0aGUgYXNzZW1ibGVyIHdvdWxkIG9ubHkKLQkgYmVuZWZpdCBoYW5kIHdyaXR0ZW4gYXNzZW1ibHkgY29kZSwgYW5kIGRvZXMgbm90IHNlZW0gd29ydGgKLQkgaXQuICAqLwotCi0gICAgICAvKiBUaGlzIGlzIGhvdyBhIE5PUCBpcyBlbWl0dGVkLiAgKi8KLSNkZWZpbmUgZW1pdF9ub3AoKQkJCQkJXAotICAobWlwc19vcHRzLm1pcHMxNgkJCQkJXAotICAgPyBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdfbW9yZSAoMiksIDB4NjUwMCwgMikJXAotICAgOiBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdfbW9yZSAoNCksIDAsIDQpKQotCi0gICAgICAvKiBUaGUgcHJldmlvdXMgaW5zbiBtaWdodCByZXF1aXJlIGEgZGVsYXkgc2xvdCwgZGVwZW5kaW5nIHVwb24KLQkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGluc24uICAqLwotICAgICAgaWYgKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkgICYmICgoKHByZXZfcGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQotICAgICAgICAgICAgICAgJiYgISBjb3BfaW50ZXJsb2NrcykKLQkgICAgICB8fCAoISBncHJfaW50ZXJsb2NrcwotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKSkKLQl7Ci0JICAvKiBBIGxvYWQgZnJvbSBhIGNvcHJvY2Vzc29yIG9yIGZyb20gbWVtb3J5LiAgQWxsIGxvYWQKLQkgICAgIGRlbGF5cyBkZWxheSB0aGUgdXNlIG9mIGdlbmVyYWwgcmVnaXN0ZXIgcnQgZm9yIG9uZQotCSAgICAgaW5zdHJ1Y3Rpb24gb24gdGhlIHIzMDAwLiAgVGhlIHI2MDAwIGFuZCByNDAwMCB1c2UKLQkgICAgIGludGVybG9ja3MuICAqLwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIGtub3cgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKTsKLQkgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkgICAgICB8fCBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCQkgJiBPUF9NQVNLX1JUKSwKLQkJCQlNSVBTX0dSX1JFRykpCi0JICAgICsrbm9wczsKLQl9Ci0gICAgICBlbHNlIGlmICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkgICAgICAgJiYgKCgocHJldl9waW5mbyAmIElOU05fQ09QUk9DX01PVkVfREVMQVkpCi0gICAgICAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCi0JCSAgIHx8IChtaXBzX29wdHMuaXNhIDwgMgotCQkgICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkpKSkpCi0JewotCSAgLyogQSBnZW5lcmljIGNvcHJvY2Vzc29yIGRlbGF5LiAgVGhlIHByZXZpb3VzIGluc3RydWN0aW9uCi0JICAgICBtb2RpZmllZCBhIGNvcHJvY2Vzc29yIGdlbmVyYWwgb3IgY29udHJvbCByZWdpc3Rlci4gIElmCi0JICAgICBpdCBtb2RpZmllZCBhIGNvbnRyb2wgcmVnaXN0ZXIsIHdlIG5lZWQgdG8gYXZvaWQgYW55Ci0JICAgICBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiAodGhpcyBpcyBwcm9iYWJseSBub3QgYWx3YXlzCi0JICAgICByZXF1aXJlZCwgYnV0IGl0IHNvbWV0aW1lcyBpcykuICBJZiBpdCBtb2RpZmllZCBhIGdlbmVyYWwKLQkgICAgIHJlZ2lzdGVyLCB3ZSBhdm9pZCB1c2luZyB0aGF0IHJlZ2lzdGVyLgotCi0JICAgICBPbiB0aGUgcjYwMDAgYW5kIHI0MDAwIGxvYWRpbmcgYSBjb3Byb2Nlc3NvciByZWdpc3RlcgotCSAgICAgZnJvbSBtZW1vcnkgaXMgaW50ZXJsb2NrZWQsIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgZGVsYXkuCi0KLQkgICAgIFRoaXMgY2FzZSBpcyBub3QgaGFuZGxlZCB2ZXJ5IHdlbGwuICBUaGVyZSBpcyBubyBzcGVjaWFsCi0JICAgICBrbm93bGVkZ2Ugb2YgQ1AwIGhhbmRsaW5nLCBhbmQgdGhlIGNvcHJvY2Vzc29ycyBvdGhlcgotCSAgICAgdGhhbiB0aGUgZmxvYXRpbmcgcG9pbnQgdW5pdCBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgYXQKLQkgICAgIGFsbC4gICovCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiBGSVhNRSEKLSAgICAgICAgICAgICBOZWVkIHRvIG1vZGlmeSB0aGlzIHRvIGluY2x1ZGUga25vd2xlZGdlIGFib3V0IAotICAgICAgICAgICAgIHVzZXIgc3BlY2lmaWVkIGRlbGF5cyEgICovCi0JICBpZiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfRlBSX1QpCi0JICAgIHsKLQkgICAgICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgfHwgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX0ZUKQotCQkJCSAgICAgJiBPUF9NQVNLX0ZUKSwKLQkJCQkgICAgTUlQU19GUF9SRUcpKQotCQkrK25vcHM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9TKQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9GUykKLQkJCQkgICAgICYgT1BfTUFTS19GUyksCi0JCQkJICAgIE1JUFNfRlBfUkVHKSkKLQkJKytub3BzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KLQkJIGRvZXMuICBJZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB1c2VzIGEgY29wcm9jZXNzb3IKLQkJIHJlZ2lzdGVyLCB3ZSBtdXN0IGluc2VydCBhIE5PUC4gIElmIHByZXZpb3VzCi0JCSBpbnN0cnVjdGlvbiBtYXkgc2V0IHRoZSBjb25kaXRpb24gY29kZXMsIGFuZCB0aGUKLQkJIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gdXNlcyB0aGVtLCB3ZSBtdXN0IGluc2VydCB0d28KLQkJIE5PUFMuICAqLwotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8ICgocHJldl9waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKQotCQkgICAgICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkpCi0JCW5vcHMgKz0gMjsKLQkgICAgICBlbHNlIGlmIChwaW5mbyAmIElOU05fQ09QKQotCQkrK25vcHM7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkgICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLSAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHNldHMgdGhlIGNvcHJvY2Vzc29yIGNvbmRpdGlvbgotCSAgICAgY29kZXMsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGEgZ2VuZXJhbCBjb3Byb2Nlc3NvciBkZWxheQotCSAgICAgKHRoaXMgbWVhbnMgaXQgaXMgYSBmbG9hdGluZyBwb2ludCBjb21wYXJpc29uCi0JICAgICBpbnN0cnVjdGlvbikuICBJZiB0aGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGNvbmRpdGlvbgotCSAgICAgY29kZXMsIHdlIG5lZWQgdG8gaW5zZXJ0IGEgc2luZ2xlIE5PUC4gICovCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCSAgICAgIHx8IChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQotCSAgICArK25vcHM7Ci0JfQotICAgICAgZWxzZSBpZiAocHJldl9waW5mbyAmIElOU05fUkVBRF9MTykKLQl7Ci0JICAvKiBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gcmVhZHMgdGhlIExPIHJlZ2lzdGVyOyBpZiB0aGUKLQkgICAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd3JpdGVzIHRvIHRoZSBMTyByZWdpc3Rlciwgd2UgbXVzdAotCSAgICAgaW5zZXJ0IHR3byBOT1BTLiAgU29tZSBuZXdlciBwcm9jZXNzb3JzIGhhdmUgaW50ZXJsb2Nrcy4gCi0JICAgICBBbHNvIHRoZSB0eDM5J3MgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBleGVjdHV0ZWQgCi0gICAgICAgICAgICAgaW1tZWRpYXRseSBhZnRlciBhIHJlYWQgZnJvbSBISS9MTyAod2l0aG91dCB0aGUgZGVsYXkpLAotICAgICAgICAgICAgIHRob3VnaCB0aGUgdHgzOSdzIGRpdmlkZSBpbnNucyBzdGlsbCBkbyByZXF1aXJlIHRoZSAKLQkgICAgIGRlbGF5LiAqLwotCSAgaWYgKCEgKGhpbG9faW50ZXJsb2NrcwotCQkgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpCi0JICAgICAgJiYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IChwaW5mbyAmIElOU05fV1JJVEVfTE8pKSkKLQkgICAgbm9wcyArPSAyOwotCSAgLyogTW9zdCBtaXBzMTYgYnJhbmNoIGluc25zIGRvbid0IGhhdmUgYSBkZWxheSBzbG90LgotCSAgICAgSWYgYSByZWFkIGZyb20gTE8gaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBicmFuY2gKLQkgICAgIHRvIGEgd3JpdGUgdG8gTE8gd2UgaGF2ZSBhIHJlYWQgZm9sbG93ZWQgYnkgYSB3cml0ZQotCSAgICAgbGVzcyB0aGFuIDIgaW5zbnMgYXdheS4gIFdlIGFzc3VtZSB0aGUgdGFyZ2V0IG9mCi0JICAgICBhIGJyYW5jaCBtaWdodCBiZSBhIHdyaXRlIHRvIExPLCBhbmQgaW5zZXJ0IGEgbm9wCi0JICAgICBiZXR3ZWVuIGEgcmVhZCBhbmQgYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGJyYW5jaC4gKi8KLQkgIGVsc2UgaWYgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAgJiYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgICAgICAgfHwgKHBpbmZvICYgTUlQUzE2X0lOU05fQlJBTkNIKSkpCi0JICAgIG5vcHMgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHJlYWRzIHRoZSBISSByZWdpc3RlcjsgaWYgdGhlCi0JICAgICBjdXJyZW50IGluc3RydWN0aW9uIHdyaXRlcyB0byB0aGUgSEkgcmVnaXN0ZXIsIHdlIG11c3QKLQkgICAgIGluc2VydCBhIE5PUC4gIFNvbWUgbmV3ZXIgcHJvY2Vzc29ycyBoYXZlIGludGVybG9ja3MuCi0JICAgICBBbHNvIHRoZSBub3RlIHR4MzkncyBtdWx0aXBseSBhYm92ZS4gKi8KLQkgIGlmICghIChoaWxvX2ludGVybG9ja3MKLQkJIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKQotCSAgICAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCAocGluZm8gJiBJTlNOX1dSSVRFX0hJKSkpCi0JICAgIG5vcHMgKz0gMjsKLQkgIC8qIE1vc3QgbWlwczE2IGJyYW5jaCBpbnNucyBkb24ndCBoYXZlIGEgZGVsYXkgc2xvdC4KLQkgICAgIElmIGEgcmVhZCBmcm9tIEhJIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgYnJhbmNoCi0JICAgICB0byBhIHdyaXRlIHRvIEhJIHdlIGhhdmUgYSByZWFkIGZvbGxvd2VkIGJ5IGEgd3JpdGUKLQkgICAgIGxlc3MgdGhhbiAyIGluc25zIGF3YXkuICBXZSBhc3N1bWUgdGhlIHRhcmdldCBvZgotCSAgICAgYSBicmFuY2ggbWlnaHQgYmUgYSB3cml0ZSB0byBISSwgYW5kIGluc2VydCBhIG5vcAotCSAgICAgYmV0d2VlbiBhIHJlYWQgYW5kIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBicmFuY2guICovCi0JICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2Ci0JCSAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICAgICAgIHx8IChwaW5mbyAmIE1JUFMxNl9JTlNOX0JSQU5DSCkpKQotCSAgICBub3BzICs9IDE7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgbm9yZW9yZGVyIHNlY3Rpb24sIHRoZW4KLSAgICAgICAgIHdlIGRvbid0IHdhbnQgdG8gaW5zZXJ0IHRoZSBub3AgYWZ0ZXIgYWxsLiAgKi8KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGlmIChwcmV2X2luc25fdW5yZW9yZGVyZWQpCi0Jbm9wcyA9IDA7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSB0d28gY2FzZXMgd2hpY2ggcmVxdWlyZSB0d28gaW50ZXJ2ZW5pbmcKLQkgaW5zdHJ1Y3Rpb25zOiAxKSBzZXR0aW5nIHRoZSBjb25kaXRpb24gY29kZXMgdXNpbmcgYSBtb3ZlIHRvCi0JIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgZ2VuZXJhbCBjb3Byb2Nlc3NvcgotCSBkZWxheSBhbmQgdGhlbiByZWFkaW5nIHRoZSBjb25kaXRpb24gY29kZXMgMikgcmVhZGluZyB0aGUgSEkKLQkgb3IgTE8gcmVnaXN0ZXIgYW5kIHRoZW4gd3JpdGluZyB0byBpdCAoZXhjZXB0IG9uIHByb2Nlc3NvcnMKLQkgd2hpY2ggaGF2ZSBpbnRlcmxvY2tzKS4gIElmIHdlIGFyZSBub3QgYWxyZWFkeSBlbWl0dGluZyBhIE5PUAotCSBpbnN0cnVjdGlvbiwgd2UgbXVzdCBjaGVjayBmb3IgdGhlc2UgY2FzZXMgY29tcGFyZWQgdG8gdGhlCi0JIGluc3RydWN0aW9uIHByZXZpb3VzIHRvIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JICAgJiYgKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSkKLQkgICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLQkgICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKQotCSAgICYmICEgY29wX2ludGVybG9ja3MpCi0JICB8fCAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0xPKQotCSAgICAgICYmIChwaW5mbyAmIElOU05fV1JJVEVfTE8pCi0JICAgICAgJiYgISAoaGlsb19pbnRlcmxvY2tzCi0JCSAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkpCi0JICB8fCAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQotCSAgICAgICYmIChwaW5mbyAmIElOU05fV1JJVEVfSEkpCi0JICAgICAgJiYgISAoaGlsb19pbnRlcmxvY2tzCi0JCSAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkpKQotCXByZXZfcHJldl9ub3AgPSAxOwotICAgICAgZWxzZQotCXByZXZfcHJldl9ub3AgPSAwOwotCi0gICAgICBpZiAocHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpCi0JcHJldl9wcmV2X25vcCA9IDA7Ci0KLSAgICAgIGlmIChwcmV2X3ByZXZfbm9wICYmIG5vcHMgPT0gMCkKLQkrK25vcHM7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBiZWluZyBnaXZlbiBhIG5vcCBpbnN0cnVjdGlvbiwgZG9uJ3QgYm90aGVyIHdpdGgKLQkgb25lIG9mIHRoZSBub3BzIHdlIHdvdWxkIG90aGVyd2lzZSBvdXRwdXQuICBUaGlzIHdpbGwgb25seQotCSBoYXBwZW4gd2hlbiBhIG5vcCBpbnN0cnVjdGlvbiBpcyB1c2VkIHdpdGggbWlwc19vcHRpbWl6ZSBzZXQKLQkgdG8gMC4gICovCi0gICAgICBpZiAobm9wcyA+IDAKLQkgICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcgotCSAgJiYgaXAtPmluc25fb3Bjb2RlID09IChtaXBzX29wdHMubWlwczE2ID8gMHg2NTAwIDogMCkpCi0JLS1ub3BzOwotCi0gICAgICAvKiBOb3cgZW1pdCB0aGUgcmlnaHQgbnVtYmVyIG9mIE5PUCBpbnN0cnVjdGlvbnMuICAqLwotICAgICAgaWYgKG5vcHMgPiAwICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcikKLQl7Ci0JICBmcmFnUyAqb2xkX2ZyYWc7Ci0JICB1bnNpZ25lZCBsb25nIG9sZF9mcmFnX29mZnNldDsKLQkgIGludCBpOwotCSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotCSAgb2xkX2ZyYWcgPSBmcmFnX25vdzsKLQkgIG9sZF9mcmFnX29mZnNldCA9IGZyYWdfbm93X2ZpeCAoKTsKLQotCSAgZm9yIChpID0gMDsgaSA8IG5vcHM7IGkrKykKLQkgICAgZW1pdF9ub3AgKCk7Ci0KLQkgIGlmIChsaXN0aW5nKQotCSAgICB7Ci0JICAgICAgbGlzdGluZ19wcmV2X2xpbmUgKCk7Ci0JICAgICAgLyogV2UgbWF5IGJlIGF0IHRoZSBzdGFydCBvZiBhIHZhcmlhbnQgZnJhZy4gIEluIGNhc2Ugd2UKLSAgICAgICAgICAgICAgICAgYXJlLCBtYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgZnJhZwotICAgICAgICAgICAgICAgICBhZnRlciB0aGUgZnJhZ3MgY3JlYXRlZCBieSBsaXN0aW5nX3ByZXZfbGluZS4gIFRoZQotICAgICAgICAgICAgICAgICBhcmd1bWVudCB0byBmcmFnX2dyb3cgaGVyZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlCi0gICAgICAgICAgICAgICAgIGFzIHRoZSBhcmd1bWVudCB0byBhbGwgb3RoZXIgY2FsbHMgdG8gZnJhZ19ncm93IGluCi0gICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4gIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYmVpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgIG1pZGRsZSBvZiBhIHZhcmlhbnQgZnJhZywgYmVjYXVzZSB0aGUgdmFyaWFudHMgaW5zZXJ0Ci0gICAgICAgICAgICAgICAgIGFsbCBuZWVkZWQgbm9wIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgKi8KLQkgICAgICBmcmFnX2dyb3cgKDQwKTsKLQkgICAgfQotCi0JICBmb3IgKGwgPSBpbnNuX2xhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzc2VydCAoU19HRVRfU0VHTUVOVCAobC0+bGFiZWwpID09IG5vd19zZWcpOwotCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobC0+bGFiZWwsIGZyYWdfbm93KTsKLQkgICAgICBTX1NFVF9WQUxVRSAobC0+bGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgICAgLyogbWlwczE2IHRleHQgbGFiZWxzIGFyZSBzdG9yZWQgYXMgb2RkLiAgKi8KLQkgICAgICBpZiAobWlwc19vcHRzLm1pcHMxNikKLQkJU19TRVRfVkFMVUUgKGwtPmxhYmVsLCBTX0dFVF9WQUxVRSAobC0+bGFiZWwpICsgMSk7Ci0JICAgIH0KLQotI2lmbmRlZiBOT19FQ09GRl9ERUJVR0dJTkcKLQkgIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0JICAgIGVjb2ZmX2ZpeF9sb2MgKG9sZF9mcmFnLCBvbGRfZnJhZ19vZmZzZXQpOwotI2VuZGlmCi0JfQotICAgICAgZWxzZSBpZiAocHJldl9ub3BfZnJhZyAhPSBOVUxMKQotCXsKLQkgIC8qIFdlIGhhdmUgYSBmcmFnIGhvbGRpbmcgbm9wcyB3ZSBtYXkgYmUgYWJsZSB0byByZW1vdmUuICBJZgotICAgICAgICAgICAgIHdlIGRvbid0IG5lZWQgYW55IG5vcHMsIHdlIGNhbiBkZWNyZWFzZSB0aGUgc2l6ZSBvZgotICAgICAgICAgICAgIHByZXZfbm9wX2ZyYWcgYnkgdGhlIHNpemUgb2Ygb25lIGluc3RydWN0aW9uLiAgSWYgd2UgZG8KLSAgICAgICAgICAgICBuZWVkIHNvbWUgbm9wcywgd2UgY291bnQgdGhlbSBpbiBwcmV2X25vcHNfcmVxdWlyZWQuICovCi0JICBpZiAocHJldl9ub3BfZnJhZ19zaW5jZSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKG5vcHMgPT0gMCkKLQkJewotCQkgIHByZXZfbm9wX2ZyYWctPmZyX2ZpeCAtPSBtaXBzX29wdHMubWlwczE2ID8gMiA6IDQ7Ci0JCSAgLS1wcmV2X25vcF9mcmFnX2hvbGRzOwotCQl9Ci0JICAgICAgZWxzZQotCQlwcmV2X25vcF9mcmFnX3JlcXVpcmVkICs9IG5vcHM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwcmV2X3ByZXZfbm9wID09IDApCi0JCXsKLQkJICBwcmV2X25vcF9mcmFnLT5mcl9maXggLT0gbWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0OwotCQkgIC0tcHJldl9ub3BfZnJhZ19ob2xkczsKLQkJfQotCSAgICAgIGVsc2UKLQkJKytwcmV2X25vcF9mcmFnX3JlcXVpcmVkOwotCSAgICB9Ci0KLQkgIGlmIChwcmV2X25vcF9mcmFnX2hvbGRzIDw9IHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQpCi0JICAgIHByZXZfbm9wX2ZyYWcgPSBOVUxMOwotCi0JICArK3ByZXZfbm9wX2ZyYWdfc2luY2U7Ci0KLQkgIC8qIFNhbml0eSBjaGVjazogYnkgdGhlIHRpbWUgd2UgcmVhY2ggdGhlIHNlY29uZCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgIGFmdGVyIHByZXZfbm9wX2ZyYWcsIHdlIHNob3VsZCBoYXZlIHVzZWQgdXAgYWxsIHRoZSBub3BzCi0gICAgICAgICAgICAgb25lIHdheSBvciBhbm90aGVyLiAgKi8KLQkgIGFzc2VydCAocHJldl9ub3BfZnJhZ19zaW5jZSA8PSAxIHx8IHByZXZfbm9wX2ZyYWcgPT0gTlVMTCk7Ci0JfQotICAgIH0KLQotICBpZiAocmVsb2NfdHlwZSA+IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBzZXQgdXAgYSB2YXJpYW50IGZyYWcuICAqLwotICAgICAgYXNzZXJ0IChtaXBzX29wdHMubWlwczE2ICYmIGFkZHJlc3NfZXhwciAhPSBOVUxMKTsKLSAgICAgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsCi0JCSAgICBSRUxBWF9NSVBTMTZfRU5DT0RFIChyZWxvY190eXBlIC0gQkZEX1JFTE9DX1VOVVNFRCwKLQkJCQkJIG1pcHMxNl9zbWFsbCwgbWlwczE2X2V4dCwKLQkJCQkJIChwcmV2X3BpbmZvCi0JCQkJCSAgJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpLAotCQkJCQkgKHByZXZfaW5zbl9yZWxvY190eXBlCi0JCQkJCSAgPT0gQkZEX1JFTE9DX01JUFMxNl9KTVApKSwKLQkJICAgIG1ha2VfZXhwcl9zeW1ib2wgKGFkZHJlc3NfZXhwciksIChvZmZzZXRUKSAwLAotCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0gICAgfQotICBlbHNlIGlmIChwbGFjZSAhPSBOVUxMKQotICAgIGYgPSBwbGFjZTsKLSAgZWxzZSBpZiAobWlwc19vcHRzLm1pcHMxNgotCSAgICYmICEgaXAtPnVzZV9leHRlbmQKLQkgICAmJiByZWxvY190eXBlICE9IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byBzd2FwIHRoaXMgaW5zdHJ1Y3Rpb24gd2l0aAotICAgICAgICAgYSBmb2xsb3dpbmcganVtcCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBmcmFnX2dyb3cgKDYpOwotICAgICAgZiA9IGZyYWdfbW9yZSAoMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5taXBzMTYKLQkgICYmIG1pcHNfb3B0cy5ub3Jlb3JkZXIKLQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKSAhPSAwKQotCWFzX3dhcm4gKF8oImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiKSk7Ci0KLSAgICAgIGYgPSBmcmFnX21vcmUgKDQpOwotICAgIH0KLQotICBmaXhwID0gTlVMTDsKLSAgaWYgKGFkZHJlc3NfZXhwciAhPSBOVUxMICYmIHJlbG9jX3R5cGUgPCBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGlmIChhZGRyZXNzX2V4cHItPlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBzd2l0Y2ggKHJlbG9jX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMHhmZmZmOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfSk1QOgotCSAgICAgIGlmICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAzKSAhPSAwKQotCQlhc19iYWQgKF8oImp1bXAgdG8gbWlzYWxpZ25lZCBhZGRyZXNzICgweCVseCkiKSwKLQkJCSh1bnNpZ25lZCBsb25nKSBhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlcik7Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciA+PiAyKSAmIDB4M2ZmZmZmZjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfSk1QOgotCSAgICAgIGlmICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAzKSAhPSAwKQotCQlhc19iYWQgKF8oImp1bXAgdG8gbWlzYWxpZ25lZCBhZGRyZXNzICgweCVseCkiKSwKLQkJCSh1bnNpZ25lZCBsb25nKSBhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlcik7Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9Ci0JCSgoKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMHg3YzAwMDApIDw8IDMpCi0JCSB8ICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweGY4MDAwMDApID4+IDcpCi0JCSB8ICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweDNmZmZjKSA+PiAyKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKLQkgICAgICBnb3RvIG5lZWRfcmVsb2M7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBpbnRlcm5hbEVycm9yICgpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQluZWVkX3JlbG9jOgotCSAgLyogRG9uJ3QgZ2VuZXJhdGUgYSByZWxvYyBpZiB3ZSBhcmUgd3JpdGluZyBpbnRvIGEgdmFyaWFudAotCSAgICAgZnJhZy4gICovCi0JICBpZiAocGxhY2UgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZpeHAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJCQkgIGFkZHJlc3NfZXhwciwKLQkJCQkgIHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyLAotCQkJCSAgcmVsb2NfdHlwZSk7Ci0JICAgICAgaWYgKHVubWF0Y2hlZF9oaSkKLQkJewotCQkgIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICpoaV9maXh1cDsKLQotCQkgIGFzc2VydCAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfSEkxNl9TKTsKLQkJICBoaV9maXh1cCA9ICgoc3RydWN0IG1pcHNfaGlfZml4dXAgKikKLQkJCSAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG1pcHNfaGlfZml4dXApKSk7Ci0JCSAgaGlfZml4dXAtPmZpeHAgPSBmaXhwOwotCQkgIGhpX2ZpeHVwLT5zZWcgPSBub3dfc2VnOwotCQkgIGhpX2ZpeHVwLT5uZXh0ID0gbWlwc19oaV9maXh1cF9saXN0OwotCQkgIG1pcHNfaGlfZml4dXBfbGlzdCA9IGhpX2ZpeHVwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpcC0+aW5zbl9vcGNvZGUsIDQpOwotICBlbHNlIGlmIChyZWxvY190eXBlID09IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaXAtPmluc25fb3Bjb2RlID4+IDE2LCAyKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiArIDIsIGlwLT5pbnNuX29wY29kZSAmIDB4ZmZmZiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGlwLT51c2VfZXh0ZW5kKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiwgMHhmMDAwIHwgaXAtPmV4dGVuZCwgMik7Ci0JICBmICs9IDI7Ci0JfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpcC0+aW5zbl9vcGNvZGUsIDIpOwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIHJlZ2lzdGVyIG1hc2sgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIGlmIChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCk7Ci0gICAgICBpZiAoKHBpbmZvICYgKElOU05fV1JJVEVfR1BSX1QgfCBJTlNOX1JFQURfR1BSX1QpKSAhPSAwKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpOwotICAgICAgaWYgKHBpbmZvICYgSU5TTl9SRUFEX0dQUl9TKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlMpOwotICAgICAgaWYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgMzE7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9EKQotCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZEKSAmIE9QX01BU0tfRkQpOwotICAgICAgaWYgKChwaW5mbyAmIChJTlNOX1dSSVRFX0ZQUl9TIHwgSU5TTl9SRUFEX0ZQUl9TKSkgIT0gMCkKLQltaXBzX2Nwcm1hc2tbMV0gfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GUykgJiBPUF9NQVNLX0ZTKTsKLSAgICAgIGlmICgocGluZm8gJiAoSU5TTl9XUklURV9GUFJfVCB8IElOU05fUkVBRF9GUFJfVCkpICE9IDApCi0JbWlwc19jcHJtYXNrWzFdIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCk7Ci0gICAgICBpZiAoKHBpbmZvICYgSU5TTl9SRUFEX0ZQUl9SKSAhPSAwKQotCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZSKSAmIE9QX01BU0tfRlIpOwotICAgICAgaWYgKHBpbmZvICYgSU5TTl9DT1ApCi0JewotCSAgLyogV2UgZG9uJ3Qga2VlcCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gc29ydCB0aGVzZSBjYXNlcyBvdXQuIAotCSAgICAgVGhlIGl0Ymwgc3VwcG9ydCBkb2VzIGtlZXAgdGhpcyBpbmZvcm1hdGlvbiBob3dldmVyLCBhbHRob3VnaCAKLQkgICAgIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGl0YmwgZnBybWF0cyBhcyBwYXJ0IG9mIHRoZSBjb3AgCi0JICAgICBpbnN0cnVjdGlvbi4gIE1heSB3YW50IHRvIGFkZCB0aGlzIHN1cHBvcnQgaW4gdGhlIGZ1dHVyZS4gKi8KLQl9Ci0gICAgICAvKiBOZXZlciBzZXQgdGhlIGJpdCBmb3IgJDAsIHdoaWNoIGlzIGFsd2F5cyB6ZXJvLiAgKi8KLSAgICAgIG1pcHNfZ3BybWFzayAmPX4gMSA8PCAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9YIHwgTUlQUzE2X0lOU05fUkVBRF9YKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SWCk7Ci0gICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfWSB8IE1JUFMxNl9JTlNOX1JFQURfWSkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkgICAgICAmIE1JUFMxNk9QX01BU0tfUlkpOwotICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWikKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWikKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SWik7Ci0gICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfVCB8IE1JUFMxNl9JTlNOX1JFQURfVCkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgVFJFRzsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9TUCB8IE1JUFMxNl9JTlNOX1JFQURfU1ApKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8IFNQOwotICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFXzMxIHwgTUlQUzE2X0lOU05fUkVBRF8zMSkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgUkE7Ci0gICAgICBpZiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9HUFJfWSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCBNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAoaXAtPmluc25fb3Bjb2RlKTsKLSAgICAgIGlmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWikKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9NT1ZFMzJaKQotCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopOwotICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9HUFJfWCkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SRUdSMzIpCi0JCQkgICAgICAmIE1JUFMxNk9QX01BU0tfUkVHUjMyKTsKLSAgICB9Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwgJiYgISBtaXBzX29wdHMubm9yZW9yZGVyKQotICAgIHsKLSAgICAgIC8qIEZpbGxpbmcgdGhlIGJyYW5jaCBkZWxheSBzbG90IGlzIG1vcmUgY29tcGxleC4gIFdlIHRyeSB0bwotCSBzd2l0Y2ggdGhlIGJyYW5jaCB3aXRoIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgd2hpY2ggd2UgY2FuCi0JIGRvIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBkb2VzIG5vdCBzZXQgdXAgYSBjb25kaXRpb24KLQkgdGhhdCB0aGUgYnJhbmNoIHRlc3RzIGFuZCBpZiB0aGUgYnJhbmNoIGlzIG5vdCBpdHNlbGYgdGhlCi0JIHRhcmdldCBvZiBhbnkgYnJhbmNoLiAgKi8KLSAgICAgIGlmICgocGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpCi0JICB8fCAocGluZm8gJiBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZKSkKLQl7Ci0JICBpZiAobWlwc19vcHRpbWl6ZSA8IDIKLQkgICAgICAvKiBJZiB3ZSBoYXZlIHNlZW4gLnNldCB2b2xhdGlsZSBvciAuc2V0IG5vbW92ZSwgZG9uJ3QKLQkJIG9wdGltaXplLiAgKi8KLQkgICAgICB8fCBtaXBzX29wdHMubm9tb3ZlICE9IDAKLQkgICAgICAvKiBJZiB3ZSBoYWQgdG8gZW1pdCBhbnkgTk9QIGluc3RydWN0aW9ucywgdGhlbiB3ZQotCQkgYWxyZWFkeSBrbm93IHdlIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgbm9wcyAhPSAwCi0JICAgICAgLyogSWYgd2UgZG9uJ3QgZXZlbiBrbm93IHRoZSBwcmV2aW91cyBpbnNuLCB3ZSBjYW4gbm90Ci0JCSBzd2FwLiAqLwotCSAgICAgIHx8ICEgcHJldl9pbnNuX3ZhbGlkCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc24gaXMgYWxyZWFkeSBpbiBhIGJyYW5jaCBkZWxheQotCQkgc2xvdCwgdGhlbiB3ZSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8IHByZXZfaW5zbl9pc19kZWxheV9zbG90Ci0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc24gd2FzIGluIGEgLnNldAotCQkgbm9yZW9yZGVyLCB3ZSBjYW4ndCBzd2FwLiAgQWN0dWFsbHksIHRoZSBNSVBTCi0JCSBhc3NlbWJsZXIgd2lsbCBzd2FwIGluIHRoaXMgc2l0dWF0aW9uLiAgSG93ZXZlciwgZ2NjCi0JCSBjb25maWd1cmVkIC13aXRoLWdudS1hcyB3aWxsIGdlbmVyYXRlIGNvZGUgbGlrZQotCQkgICAuc2V0IG5vcmVvcmRlcgotCQkgICBsdwkkNCxYWFgKLQkJICAgLnNldAlyZW9yZGVyCi0JCSAgIElOU04KLQkJICAgYm5lCSQ0LCQwLGZvbwotCQkgaW4gd2hpY2ggd2UgY2FuIG5vdCBzd2FwIHRoZSBibmUgYW5kIElOU04uICBJZiBnY2MgaXMKLQkJIG5vdCBjb25maWd1cmVkIC13aXRoLWdudS1hcywgaXQgZG9lcyBub3Qgb3V0cHV0IHRoZQotCQkgLnNldCBwc2V1ZG8tb3BzLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGVjawotCQkgcHJldl9pbnNuX3VucmVvcmRlcmVkLCBiZWNhdXNlIHByZXZfaW5zbl92YWxpZCB3aWxsCi0JCSBiZSAwIGluIHRoYXQgY2FzZS4gIFdlIGRvbid0IHdhbnQgdG8gdXNlCi0JCSBwcmV2X3ByZXZfaW5zbl92YWxpZCwgYmVjYXVzZSB3ZSBkbyB3YW50IHRvIGJlIGFibGUKLQkJIHRvIHN3YXAgYXQgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uICAqLwotCSAgICAgIHx8IHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkCi0JICAgICAgLyogSWYgdGhlIGJyYW5jaCBpcyBpdHNlbGYgdGhlIHRhcmdldCBvZiBhIGJyYW5jaCwgd2UKLQkJIGNhbiBub3Qgc3dhcC4gIFdlIGNoZWF0IG9uIHRoaXM7IGFsbCB3ZSBjaGVjayBmb3IgaXMKLQkJIHdoZXRoZXIgdGhlcmUgaXMgYSBsYWJlbCBvbiB0aGlzIGluc3RydWN0aW9uLiAgSWYKLQkJIHRoZXJlIGFyZSBhbnkgYnJhbmNoZXMgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBhCi0JCSBsYWJlbCwgdXNlcnMgbXVzdCB1c2UgLnNldCBub3Jlb3JkZXIuICAqLwotCSAgICAgIHx8IGluc25fbGFiZWxzICE9IE5VTEwKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgaW4gYSB2YXJpYW50IGZyYWcsIHdlCi0JCSBjYW4gbm90IGRvIHRoZSBzd2FwLiAgVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUKLQkJIG1pcHMxNiwgd2hpY2ggdXNlcyB2YXJpYW50IGZyYWdzIGZvciBkaWZmZXJlbnQKLQkJIHB1cnBvc2VzLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgcHJldl9pbnNuX2ZyYWctPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQpCi0JICAgICAgLyogSWYgdGhlIGJyYW5jaCByZWFkcyB0aGUgY29uZGl0aW9uIGNvZGVzLCB3ZSBkb24ndAotCQkgZXZlbiB0cnkgdG8gc3dhcCwgYmVjYXVzZSBpbiB0aGUgc2VxdWVuY2UKLQkJICAgY3RjMSAkWCwkMzEKLQkJICAgSU5TTgotCQkgICBJTlNOCi0JCSAgIGJjMXQgTEFCRUwKLQkJIHdlIGNhbiBub3Qgc3dhcCwgYW5kIEkgZG9uJ3QgZmVlbCBsaWtlIGhhbmRsaW5nIHRoYXQKLQkJIGNhc2UuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBtaXBzX29wdHMuaXNhIDwgNAotCQkgICYmIChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQotCSAgICAgIC8qIFdlIGNhbiBub3Qgc3dhcCB3aXRoIGFuIGluc3RydWN0aW9uIHRoYXQgcmVxdWlyZXMgYQotCQkgZGVsYXkgc2xvdCwgYmVjYXNlIHRoZSB0YXJnZXQgb2YgdGhlIGJyYW5jaCBtaWdodAotCQkgaW50ZXJmZXJlIHdpdGggdGhhdCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JCSAgJiYgKHByZXZfcGluZm8KLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCQkgICAgICAmIChJTlNOX0xPQURfQ09QUk9DX0RFTEFZCi0JCQkgfCBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZCi0JCQkgfCBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpKQotCSAgICAgIHx8ICghIChoaWxvX2ludGVybG9ja3MKLQkJICAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkKLQkJICAmJiAocHJldl9waW5mbwotCQkgICAgICAmIChJTlNOX1JFQURfTE8KLQkJCSB8IElOU05fUkVBRF9ISSkpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAhIGdwcl9pbnRlcmxvY2tzCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgbWlwc19vcHRzLmlzYSA8IDIKLSAgICAgICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWSkpCi0JICAgICAgLyogV2UgY2FuIG5vdCBzd2FwIHdpdGggYSBicmFuY2ggaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIHx8IChwcmV2X3BpbmZvCi0JCSAgJiAoSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCi0JCSAgICAgfCBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZCi0JCSAgICAgfCBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSkpCi0JICAgICAgLyogV2UgZG8gbm90IHN3YXAgd2l0aCBhIHRyYXAgaW5zdHJ1Y3Rpb24sIHNpbmNlIGl0Ci0JCSBjb21wbGljYXRlcyB0cmFwIGhhbmRsZXJzIHRvIGhhdmUgdGhlIHRyYXAKLQkJIGluc3RydWN0aW9uIGJlIGluIGEgZGVsYXkgc2xvdC4gICovCi0JICAgICAgfHwgKHByZXZfcGluZm8gJiBJTlNOX1RSQVApCi0JICAgICAgLyogSWYgdGhlIGJyYW5jaCByZWFkcyBhIHJlZ2lzdGVyIHRoYXQgdGhlIHByZXZpb3VzCi0JCSBpbnN0cnVjdGlvbiBzZXRzLCB3ZSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX1QpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQotCQkJCSAgICAgJiBPUF9NQVNLX1JUKSwKLQkJCQkgICAgTUlQU19HUl9SRUcpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKQotCQkJCSAgICAgJiBPUF9NQVNLX1JEKSwKLQkJCQkgICAgTUlQU19HUl9SRUcpKQotCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKCgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1gpCi0JCSAgICAgICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkJICgocHJldl9pbnNuLmluc25fb3Bjb2RlCi0JCQkJCSAgID4+IE1JUFMxNk9QX1NIX1JYKQotCQkJCQkgICYgTUlQUzE2T1BfTUFTS19SWCksCi0JCQkJCSBNSVBTMTZfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWSkKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZQotCQkJCQkgICAgICA+PiBNSVBTMTZPUF9TSF9SWSkKLQkJCQkJICAgICAmIE1JUFMxNk9QX01BU0tfUlkpLAotCQkJCQkgICAgTUlQUzE2X1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1opCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUKLQkJCQkJICAgICAgPj4gTUlQUzE2T1BfU0hfUlopCi0JCQkJCSAgICAgJiBNSVBTMTZPUF9NQVNLX1JaKSwKLQkJCQkJICAgIE1JUFMxNl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9UKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwgVFJFRywgTUlQU19HUl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV8zMSkKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsIFJBLCBNSVBTX0dSX1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkJICAgIE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSIChwcmV2X2luc24uCi0JCQkJCQkJCSAgICAgaW5zbl9vcGNvZGUpLAotCQkJCQkgICAgTUlQU19HUl9SRUcpKSkpCi0JICAgICAgLyogSWYgdGhlIGJyYW5jaCB3cml0ZXMgYSByZWdpc3RlciB0aGF0IHRoZSBwcmV2aW91cwotCQkgaW5zdHJ1Y3Rpb24gc2V0cywgd2UgY2FuIG5vdCBzd2FwICh3ZSBrbm93IHRoYXQKLQkJIGJyYW5jaGVzIHdyaXRlIG9ubHkgdG8gUkQgb3IgdG8gJDMxKS4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCkKLQkJICAmJiAoKChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JCSAgICAgICAmJiAoKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCkKLQkJCSAgID09ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpKSkKLQkJICAgICAgfHwgKChwaW5mbyAmIElOU05fV1JJVEVfR1BSXzMxKQotCQkJICAmJiAoKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpCi0JCQkgICAgICAgJiBPUF9NQVNLX1JUKQotCQkJICAgICAgPT0gMzEpKSkpCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAmJiAoKChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JCSAgICAgICAmJiAoKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCkKLQkJCSAgID09ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpKSkKLQkJICAgICAgfHwgKChwaW5mbyAmIElOU05fV1JJVEVfR1BSXzMxKQotCQkJICAmJiAoKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpCi0JCQkgICAgICAgJiBPUF9NQVNLX1JEKQotCQkJICAgICAgPT0gMzEpKSkpCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV8zMSkKLQkJICAmJiAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV8zMSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kpCi0JCQkgICYmIChNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAocHJldl9pbnNuLmluc25fb3Bjb2RlKQotCQkJICAgICAgPT0gUkEpKSkpCi0JICAgICAgLyogSWYgdGhlIGJyYW5jaCB3cml0ZXMgYSByZWdpc3RlciB0aGF0IHRoZSBwcmV2aW91cwotCQkgaW5zdHJ1Y3Rpb24gcmVhZHMsIHdlIGNhbiBub3Qgc3dhcCAod2Uga25vdyB0aGF0Ci0JCSBicmFuY2hlcyBvbmx5IHdyaXRlIHRvIFJEIG9yIHRvICQzMSkuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sCi0JCQkJICAgICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKQotCQkJCSAgICAgJiBPUF9NQVNLX1JEKSwKLQkJCQkgICAgTUlQU19HUl9SRUcpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLCAzMSwgTUlQU19HUl9SRUcpKQotCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwgUkEsIE1JUFNfR1JfUkVHKSkKLQkgICAgICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSwgdGhlIGJyYW5jaAotCQkgbWlnaHQgYmUgZXhwYW5kZWQgaW50byBhIHNlcXVlbmNlIHdoaWNoIHVzZXMgJGF0LCBzbwotCQkgd2UgY2FuJ3Qgc3dhcCB3aXRoIGFuIGluc3RydWN0aW9uIHdoaWNoIHJlYWRzIGl0LiAgKi8KLQkgICAgICB8fCAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwgQVQsIE1JUFNfR1JfUkVHKSkKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaGFzIGEgbG9hZAotCQkgZGVsYXksIGFuZCBzZXRzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgYnJhbmNoIHJlYWRzLCB3ZQotCQkgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCQkgICYmICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQotCQkgICAgICB8fCAoISBncHJfaW50ZXJsb2NrcwotCQkJICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8KLQkJCSAgICAgICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfcHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQotCQkJCSAgICAgJiBPUF9NQVNLX1JUKSwKLQkJCQkgICAgTUlQU19HUl9SRUcpKQotCSAgICAgIC8qIElmIG9uZSBpbnN0cnVjdGlvbiBzZXRzIGEgY29uZGl0aW9uIGNvZGUgYW5kIHRoZQotICAgICAgICAgICAgICAgICBvdGhlciBvbmUgdXNlcyBhIGNvbmRpdGlvbiBjb2RlLCB3ZSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKQotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQotCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBQQywgd2UgY2FuIG5vdAotICAgICAgICAgICAgICAgICBzd2FwLiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9QQykpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBleHRlbmRlZCwgd2UgY2FuIG5vdAotICAgICAgICAgICAgICAgICBzd2FwLiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNiAmJiBwcmV2X2luc25fZXh0ZW5kZWQpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGhhZCBhIGZpeHVwIGluIG1pcHMxNgotICAgICAgICAgICAgICAgICBtb2RlLCB3ZSBjYW4gbm90IHN3YXAuICBUaGlzIG5vcm1hbGx5IG1lYW5zIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhIDQgYnl0ZSBicmFuY2ggYW55aG93LiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNiAmJiBwcmV2X2luc25fZml4cCkKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBzeW5jLCBzeW5jLmwsIG9yIAotCQkgc3luYy5wLCB3ZSBjYW4gbm90IHN3YXAuICovCi0JICAgICAgfHwgKHByZXZfcGluZm8gJiYgSU5TTl9TWU5DKSkKLQkgICAgewotCSAgICAgIC8qIFdlIGNvdWxkIGRvIGV2ZW4gYmV0dGVyIGZvciB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvCi0JCSBwb3J0aW9ucyBvZiB0aGlzIG9iamVjdCBmaWxlOyB3ZSBjb3VsZCBwaWNrIHVwIHRoZQotCQkgaW5zdHJ1Y3Rpb24gYXQgdGhlIGRlc3RpbmF0aW9uLCBwdXQgaXQgaW4gdGhlIGRlbGF5Ci0JCSBzbG90LCBhbmQgYnVtcCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcy4gICovCi0JICAgICAgZW1pdF9ub3AgKCk7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgICAgICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKLQkgICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEl0IGxvb2tzIGxpa2Ugd2UgY2FuIGFjdHVhbGx5IGRvIHRoZSBzd2FwLiAgKi8KLQkgICAgICBpZiAoISBtaXBzX29wdHMubWlwczE2KQotCQl7Ci0JCSAgY2hhciAqcHJldl9mOwotCQkgIGNoYXIgdGVtcFs0XTsKLQotCQkgIHByZXZfZiA9IHByZXZfaW5zbl9mcmFnLT5mcl9saXRlcmFsICsgcHJldl9pbnNuX3doZXJlOwotCQkgIG1lbWNweSAodGVtcCwgcHJldl9mLCA0KTsKLQkJICBtZW1jcHkgKHByZXZfZiwgZiwgNCk7Ci0JCSAgbWVtY3B5IChmLCB0ZW1wLCA0KTsKLQkJICBpZiAocHJldl9pbnNuX2ZpeHApCi0JCSAgICB7Ci0JCSAgICAgIHByZXZfaW5zbl9maXhwLT5meF9mcmFnID0gZnJhZ19ub3c7Ci0JCSAgICAgIHByZXZfaW5zbl9maXhwLT5meF93aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsKLQkJICAgIH0KLQkJICBpZiAoZml4cCkKLQkJICAgIHsKLQkJICAgICAgZml4cC0+ZnhfZnJhZyA9IHByZXZfaW5zbl9mcmFnOwotCQkgICAgICBmaXhwLT5meF93aGVyZSA9IHByZXZfaW5zbl93aGVyZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKnByZXZfZjsKLQkJICBjaGFyIHRlbXBbMl07Ci0KLQkJICBhc3NlcnQgKHByZXZfaW5zbl9maXhwID09IE5VTEwpOwotCQkgIHByZXZfZiA9IHByZXZfaW5zbl9mcmFnLT5mcl9saXRlcmFsICsgcHJldl9pbnNuX3doZXJlOwotCQkgIG1lbWNweSAodGVtcCwgcHJldl9mLCAyKTsKLQkJICBtZW1jcHkgKHByZXZfZiwgZiwgMik7Ci0JCSAgaWYgKHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCi0JCSAgICB7Ci0JCSAgICAgIGFzc2VydCAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfVU5VU0VEKTsKLQkJICAgICAgbWVtY3B5IChmLCB0ZW1wLCAyKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1lbWNweSAoZiwgZiArIDIsIDIpOwotCQkgICAgICBtZW1jcHkgKGYgKyAyLCB0ZW1wLCAyKTsKLQkJICAgIH0KLQkJICBpZiAoZml4cCkKLQkJICAgIHsKLQkJICAgICAgZml4cC0+ZnhfZnJhZyA9IHByZXZfaW5zbl9mcmFnOwotCQkgICAgICBmaXhwLT5meF93aGVyZSA9IHByZXZfaW5zbl93aGVyZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uOyBsZWF2ZSBwcmV2X2luc24KLQkJIHVuY2hhbmdlZC4gICovCi0JICAgICAgcHJldl9wcmV2X2luc24gPSAqaXA7Ci0JICAgIH0KLQkgIHByZXZfaW5zbl9pc19kZWxheV9zbG90ID0gMTsKLQotCSAgLyogSWYgdGhhdCB3YXMgYW4gdW5jb25kaXRpb25hbCBicmFuY2gsIGZvcmdldCB0aGUgcHJldmlvdXMKLQkgICAgIGluc24gaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKHBpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKQotCSAgICB7Ci0JICAgICAgcHJldl9wcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICAgICAgcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgICB9Ci0KLQkgIHByZXZfaW5zbl9maXhwID0gTlVMTDsKLQkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAocGluZm8gJiBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSkKLQl7Ci0JICAvKiBXZSBkb24ndCB5ZXQgb3B0aW1pemUgYSBicmFuY2ggbGlrZWx5LiAgV2hhdCB3ZSBzaG91bGQgZG8KLQkgICAgIGlzIGxvb2sgYXQgdGhlIHRhcmdldCwgY29weSB0aGUgaW5zdHJ1Y3Rpb24gZm91bmQgdGhlcmUKLQkgICAgIGludG8gdGhlIGRlbGF5IHNsb3QsIGFuZCBpbmNyZW1lbnQgdGhlIGJyYW5jaCB0byBqdW1wIHRvCi0JICAgICB0aGUgbmV4dCBpbnN0cnVjdGlvbi4gICovCi0JICBlbWl0X25vcCAoKTsKLQkgIC8qIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW5zbiBpbmZvcm1hdGlvbi4gICovCi0JICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKLQkgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgIHByZXZfaW5zbl9maXhwID0gTlVMTDsKLQkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW5zbiBpbmZvcm1hdGlvbi4gICovCi0JICBpZiAobm9wcyA+IDApCi0JICAgIHByZXZfcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgZWxzZQotCSAgICBwcmV2X3ByZXZfaW5zbiA9IHByZXZfaW5zbjsKLQkgIHByZXZfaW5zbiA9ICppcDsKLQotCSAgLyogQW55IHRpbWUgd2Ugc2VlIGEgYnJhbmNoLCB3ZSBhbHdheXMgZmlsbCB0aGUgZGVsYXkgc2xvdAotCSAgICAgaW1tZWRpYXRlbHk7IHNpbmNlIHRoaXMgaW5zbiBpcyBub3QgYSBicmFuY2gsIHdlIGtub3cgaXQKLQkgICAgIGlzIG5vdCBpbiBhIGRlbGF5IHNsb3QuICAqLwotCSAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAwOwotCi0JICBwcmV2X2luc25fZml4cCA9IGZpeHA7Ci0JICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IHJlbG9jX3R5cGU7Ci0JICBpZiAobWlwc19vcHRzLm1pcHMxNikKLQkgICAgcHJldl9pbnNuX2V4dGVuZGVkID0gKGlwLT51c2VfZXh0ZW5kCi0JCQkJICB8fCByZWxvY190eXBlID4gQkZEX1JFTE9DX1VOVVNFRCk7Ci0JfQotCi0gICAgICBwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCA9IHByZXZfaW5zbl91bnJlb3JkZXJlZDsKLSAgICAgIHByZXZfaW5zbl91bnJlb3JkZXJlZCA9IDA7Ci0gICAgICBwcmV2X2luc25fZnJhZyA9IGZyYWdfbm93OwotICAgICAgcHJldl9pbnNuX3doZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOwotICAgICAgcHJldl9pbnNuX3ZhbGlkID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byByZWNvcmQgYSBiaXQgb2YgaW5mb3JtYXRpb24gZXZlbiB3aGVuIHdlIGFyZSBub3QKLSAgICAgICAgIHJlb3JkZXJpbmcsIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgYmFzZSBhZGRyZXNzIGZvciBtaXBzMTYKLSAgICAgICAgIFBDIHJlbGF0aXZlIHJlbG9jcy4gICovCi0gICAgICBwcmV2X3ByZXZfaW5zbiA9IHByZXZfaW5zbjsKLSAgICAgIHByZXZfaW5zbiA9ICppcDsKLSAgICAgIHByZXZfaW5zbl9yZWxvY190eXBlID0gcmVsb2NfdHlwZTsKLSAgICAgIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gcHJldl9pbnNuX3VucmVvcmRlcmVkOwotICAgICAgcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMTsKLSAgICB9Ci0KLSAgLyogV2UganVzdCBvdXRwdXQgYW4gaW5zbiwgc28gdGhlIG5leHQgb25lIGRvZXNuJ3QgaGF2ZSBhIGxhYmVsLiAgKi8KLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLQotICAvKiBXZSBtdXN0IGVuc3VyZSB0aGF0IGEgZml4dXAgYXNzb2NpYXRlZCB3aXRoIGFuIHVubWF0Y2hlZCAlaGkKLSAgICAgcmVsb2MgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgT3RoZXJ3aXNlLCB0aGUKLSAgICAgcmVhcnJhbmdlbWVudCBvZiAlaGkgcmVsb2NzIGluIGZyb2JfZmlsZSBtYXkgY29uZnVzZQotICAgICB0Y19nZW5fcmVsb2MuICAqLwotICBpZiAodW5tYXRjaGVkX2hpKQotICAgIHsKLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotICAgIH0KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBmb3JnZXRzIHRoYXQgdGhlcmUgd2FzIGFueSBwcmV2aW91cyBpbnN0cnVjdGlvbiBvcgotICAgbGFiZWwuICBJZiBQUkVTRVJWRSBpcyBub24temVybywgaXQgcmVtZW1iZXJzIGVub3VnaCBpbmZvcm1hdGlvbiB0bwotICAga25vdyB3aGV0aGVyIG5vcHMgYXJlIG5lZWRlZCBiZWZvcmUgYSBub3Jlb3JkZXIgc2VjdGlvbi4gKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfbm9fcHJldl9pbnNuIChwcmVzZXJ2ZSkKLSAgICAgaW50IHByZXNlcnZlOwotewotICBpZiAoISBwcmVzZXJ2ZSkKLSAgICB7Ci0gICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0gICAgICBwcmV2X3ByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLSAgICAgIHByZXZfbm9wX2ZyYWcgPSBOVUxMOwotICAgICAgcHJldl9ub3BfZnJhZ19ob2xkcyA9IDA7Ci0gICAgICBwcmV2X25vcF9mcmFnX3JlcXVpcmVkID0gMDsKLSAgICAgIHByZXZfbm9wX2ZyYWdfc2luY2UgPSAwOwotICAgIH0KLSAgcHJldl9pbnNuX3ZhbGlkID0gMDsKLSAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAwOwotICBwcmV2X2luc25fdW5yZW9yZGVyZWQgPSAwOwotICBwcmV2X2luc25fZXh0ZW5kZWQgPSAwOwotICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMDsKLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuZXZlciB3ZSB0dXJuIG9uIG5vcmVvcmRlciBvciBlbWl0Ci0gICBzb21ldGhpbmcgb3RoZXIgdGhhbiBpbnN0cnVjdGlvbnMuICBJdCBpbnNlcnRzIGFueSBOT1BTIHdoaWNoIG1pZ2h0Ci0gICBiZSBuZWVkZWQgYnkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCBhbmQgY2xlYXJzIHRoZSBpbmZvcm1hdGlvbgotICAga2VwdCBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9ucy4gIFRoZSBJTlNOUyBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZgotICAgaW5zdHJ1Y3Rpb25zIGFyZSB0byBmb2xsb3cuICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VtaXRfZGVsYXlzIChpbnNucykKLSAgICAgYm9vbGVhbiBpbnNuczsKLXsKLSAgaWYgKCEgbWlwc19vcHRzLm5vcmVvcmRlcikKLSAgICB7Ci0gICAgICBpbnQgbm9wczsKLQotICAgICAgbm9wcyA9IDA7Ci0gICAgICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JICAgJiYgKCEgY29wX2ludGVybG9ja3MKLSAgICAgICAgICAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8KLSAgICAgICAgICAgICAgICAgICAmIChJTlNOX0xPQURfQ09QUk9DX0RFTEFZCi0gICAgICAgICAgICAgICAgICAgICAgfCBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZCi0gICAgICAgICAgICAgICAgICAgICAgfCBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpKSkKLQkgIHx8ICghIGhpbG9faW50ZXJsb2NrcwotCSAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8KLQkJICAmIChJTlNOX1JFQURfTE8KLQkJICAgICB8IElOU05fUkVBRF9ISSkpKQotCSAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICAgICYmICEgZ3ByX2ludGVybG9ja3MKLQkgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvIAotICAgICAgICAgICAgICAgICAgJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkKLQkgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAmJiBtaXBzX29wdHMuaXNhIDwgMgotCSAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8KLQkJICAmIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWSkpKQotCXsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICArK25vcHM7Ci0JICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICAgICAmJiBtaXBzX29wdHMuaXNhIDwgNAotCSAgICAgICAmJiAoISBjb3BfaW50ZXJsb2NrcwotICAgICAgICAgICAgICAgICAgICYmIHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKSkKLQkgICAgICB8fCAoISBoaWxvX2ludGVybG9ja3MKLQkJICAmJiAoKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9ISSkKLQkJICAgICAgfHwgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9MTykpKSkKLQkgICAgKytub3BzOwotCi0JICBpZiAocHJldl9pbnNuX3VucmVvcmRlcmVkKQotCSAgICBub3BzID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmICgoISBtaXBzX29wdHMubWlwczE2Ci0JCSYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JCSYmICghIGNvcF9pbnRlcmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICYmIHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQotCSAgICAgICB8fCAoISBoaWxvX2ludGVybG9ja3MKLQkJICAgJiYgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9ISSkKLQkJICAgICAgIHx8IChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9MTykpKSkKLQl7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgaWYgKCEgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpCi0JICAgICsrbm9wczsKLQl9Ci0KLSAgICAgIGlmIChub3BzID4gMCkKLQl7Ci0JICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0JICBpZiAoaW5zbnMpCi0JICAgIHsKLQkgICAgICAvKiBSZWNvcmQgdGhlIGZyYWcgd2hpY2ggaG9sZHMgdGhlIG5vcCBpbnN0cnVjdGlvbnMsIHNvCi0gICAgICAgICAgICAgICAgIHRoYXQgd2UgY2FuIHJlbW92ZSB0aGVtIGlmIHdlIGRvbid0IG5lZWQgdGhlbS4gICovCi0JICAgICAgZnJhZ19ncm93IChtaXBzX29wdHMubWlwczE2ID8gbm9wcyAqIDIgOiBub3BzICogNCk7Ci0JICAgICAgcHJldl9ub3BfZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIHByZXZfbm9wX2ZyYWdfaG9sZHMgPSBub3BzOwotCSAgICAgIHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgPSAwOwotCSAgICAgIHByZXZfbm9wX2ZyYWdfc2luY2UgPSAwOwotCSAgICB9Ci0KLQkgIGZvciAoOyBub3BzID4gMDsgLS1ub3BzKQotCSAgICBlbWl0X25vcCAoKTsKLQotCSAgaWYgKGluc25zKQotCSAgICB7Ci0JICAgICAgLyogTW92ZSBvbiB0byBhIG5ldyBmcmFnLCBzbyB0aGF0IGl0IGlzIHNhZmUgdG8gc2ltcGx5Ci0gICAgICAgICAgICAgICAgIGRlY3JlYXNlIHRoZSBzaXplIG9mIHByZXZfbm9wX2ZyYWcuICovCi0JICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0JICAgICAgZnJhZ19uZXcgKDApOwotCSAgICB9Ci0KLQkgIGZvciAobCA9IGluc25fbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsLT5sYWJlbCkgPT0gbm93X3NlZyk7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChsLT5sYWJlbCwgZnJhZ19ub3cpOwotCSAgICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgICAgICAvKiBtaXBzMTYgdGV4dCBsYWJlbHMgYXJlIHN0b3JlZCBhcyBvZGQuICAqLwotCSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQotCQlTX1NFVF9WQUxVRSAobC0+bGFiZWwsIFNfR0VUX1ZBTFVFIChsLT5sYWJlbCkgKyAxKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICAqLwotICBpZiAobWlwc19vcHRzLm1pcHMxNiAmJiBpbnNucykKLSAgICBtaXBzMTZfbWFya19sYWJlbHMgKCk7Ci0KLSAgbWlwc19ub19wcmV2X2luc24gKGluc25zKTsKLX0KLQotLyogQnVpbGQgYW4gaW5zdHJ1Y3Rpb24gY3JlYXRlZCBieSBhIG1hY3JvIGV4cGFuc2lvbi4gIFRoaXMgaXMgcGFzc2VkCi0gICBhIHBvaW50ZXIgdG8gdGhlIGNvdW50IG9mIGluc3RydWN0aW9ucyBjcmVhdGVkIHNvIGZhciwgYW4KLSAgIGV4cHJlc3Npb24sIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBidWlsZCwgYW4gb3BlcmFuZCBmb3JtYXQKLSAgIHN0cmluZywgYW5kIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzLiAgKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXN0YXRpYyB2b2lkCi1tYWNyb19idWlsZCAoY2hhciAqcGxhY2UsCi0JICAgICBpbnQgKmNvdW50ZXIsCi0JICAgICBleHByZXNzaW9uUyAqIGVwLAotCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkgICAgIGNvbnN0IGNoYXIgKmZtdCwKLQkgICAgIC4uLikKLSNlbHNlCi1zdGF0aWMgdm9pZAotbWFjcm9fYnVpbGQgKHBsYWNlLCBjb3VudGVyLCBlcCwgbmFtZSwgZm10LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIGludCAqY291bnRlcjsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IGluc25faXNhOwotCi0jaWZkZWYgVVNFX1NUREFSRwotICB2YV9zdGFydCAoYXJncywgZm10KTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSNlbmRpZgotCi0gIC8qCi0gICAqIElmIHRoZSBtYWNybyBpcyBhYm91dCB0byBleHBhbmQgaW50byBhIHNlY29uZCBpbnN0cnVjdGlvbiwKLSAgICogcHJpbnQgYSB3YXJuaW5nIGlmIG5lZWRlZC4gV2UgbmVlZCB0byBwYXNzIGlwIGFzIGEgcGFyYW1ldGVyCi0gICAqIHRvIGdlbmVyYXRlIGEgYmV0dGVyIHdhcm5pbmcgbWVzc2FnZSBoZXJlLi4uCi0gICAqLwotICBpZiAobWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zICYmIHBsYWNlID09IE5VTEwgJiYgKmNvdW50ZXIgPT0gMSkKLSAgICBhc193YXJuIChfKCJNYWNybyBpbnN0cnVjdGlvbiBleHBhbmRlZCBpbnRvIG11bHRpcGxlIGluc3RydWN0aW9ucyIpKTsKLQotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICAqY291bnRlciArPSAxOwkJLyogYnVtcCBpbnN0cnVjdGlvbiBjb3VudGVyICovCi0KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgewotICAgICAgbWlwczE2X21hY3JvX2J1aWxkIChwbGFjZSwgY291bnRlciwgZXAsIG5hbWUsIGZtdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICByID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgaW5zbi5pbnNuX21vID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG5hbWUpOwotICBhc3NlcnQgKGluc24uaW5zbl9tbyk7Ci0gIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotCi0gIC8qIFNlYXJjaCB1bnRpbCB3ZSBnZXQgYSBtYXRjaCBmb3IgTkFNRS4gICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmICgoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMSkKLQlpbnNuX2lzYSA9IDE7Ci0gICAgICBlbHNlIGlmICgoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMikKLQlpbnNuX2lzYSA9IDI7Ci0gICAgICBlbHNlIGlmICgoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMykKLQlpbnNuX2lzYSA9IDM7Ci0gICAgICBlbHNlIGlmICgoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBNCkKLQlpbnNuX2lzYSA9IDQ7Ci0gICAgICBlbHNlCi0JaW5zbl9pc2EgPSAxNTsKLQotICAgICAgaWYgKHN0cmNtcCAoZm10LCBpbnNuLmluc25fbW8tPmFyZ3MpID09IDAKLQkgICYmIGluc24uaW5zbl9tby0+cGluZm8gIT0gSU5TTl9NQUNSTwotCSAgJiYgKGluc25faXNhIDw9IG1pcHNfb3B0cy5pc2EKLQkgICAgICB8fCAobWlwc19jcHUgPT0gNDY1MAotCQkgICYmIChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOXzQ2NTApICE9IDApCi0JICAgICAgfHwgKG1pcHNfY3B1ID09IDQwMTAKLQkJICAmJiAoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl80MDEwKSAhPSAwKQotCSAgICAgIHx8ICgobWlwc19jcHUgPT0gNDEwMAotCQkgICB8fCBtaXBzX2NwdSA9PSA0MTExCi0JCSAgICkKLQkJICAmJiAoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl80MTAwKSAhPSAwKQotCSAgICAgIHx8IChtaXBzX2NwdSA9PSAzOTAwCi0JCSAgJiYgKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fMzkwMCkgIT0gMCkpCi0JICAmJiAobWlwc19jcHUgIT0gNDY1MCB8fCAoaW5zbi5pbnNuX21vLT5waW5mbyAmIEZQX0QpID09IDApKQotCWJyZWFrOwotCi0gICAgICArK2luc24uaW5zbl9tbzsKLSAgICAgIGFzc2VydCAoaW5zbi5pbnNuX21vLT5uYW1lKTsKLSAgICAgIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotICAgIH0KLQotICBpbnNuLmluc25fb3Bjb2RlID0gaW5zbi5pbnNuX21vLT5tYXRjaDsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpmbXQrKykKLQl7Ci0JY2FzZSAnXDAnOgotCSAgYnJlYWs7Ci0KLQljYXNlICcsJzoKLQljYXNlICcoJzoKLQljYXNlICcpJzoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAndCc6Ci0JY2FzZSAndyc6Ci0JY2FzZSAnRSc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAxNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYyc6Ci0JY2FzZSAnVCc6Ci0JY2FzZSAnVyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAxNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnZCc6Ci0JY2FzZSAnRyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAxMTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnVic6Ci0JY2FzZSAnUyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAxMTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAneic6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJzwnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnRCc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCA2OwotCSAgY29udGludWU7Ci0KLQljYXNlICdCJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3EnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYic6Ci0JY2FzZSAncyc6Ci0JY2FzZSAncic6Ci0JY2FzZSAndic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAyMTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnaSc6Ci0JY2FzZSAnaic6Ci0JY2FzZSAnbyc6Ci0JICByID0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgdmFfYXJnIChhcmdzLCBpbnQpOwotCSAgYXNzZXJ0IChyID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMCi0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMCi0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTE8xNgotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfR09UMTYKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0NBTEwxNgotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfR09UX0xPMTYKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNgotCQkgIHx8IChlcC0+WF9vcCA9PSBPX3N1YnRyYWN0Ci0JCSAgICAgICYmIG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uCi0JCSAgICAgICYmIHIgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAndSc6Ci0JICByID0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgdmFfYXJnIChhcmdzLCBpbnQpOwotCSAgYXNzZXJ0IChlcCAhPSBOVUxMCi0JCSAgJiYgKGVwLT5YX29wID09IE9fY29uc3RhbnQKLQkJICAgICAgfHwgKGVwLT5YX29wID09IE9fc3ltYm9sCi0JCQkgICYmIChyID09IEJGRF9SRUxPQ19ISTE2X1MKLQkJCSAgICAgIHx8IHIgPT0gQkZEX1JFTE9DX0hJMTYKLQkJCSAgICAgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLQkJCSAgICAgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2KSkKLQkJICAgICAgfHwgKGVwLT5YX29wID09IE9fc3VidHJhY3QKLQkJCSAgJiYgbm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24KLQkJCSAgJiYgciA9PSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TKSkpOwotCSAgaWYgKGVwLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpbnNuLmluc25fb3Bjb2RlIHw9IChlcC0+WF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQkgICAgICBlcCA9IE5VTEw7Ci0JICAgICAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAncCc6Ci0JICBhc3NlcnQgKGVwICE9IE5VTEwpOwotCSAgLyoKLQkgICAqIFRoaXMgYWxsb3dzIG1hY3JvKCkgdG8gcGFzcyBhbiBpbW1lZGlhdGUgZXhwcmVzc2lvbiBmb3IKLQkgICAqIGNyZWF0aW5nIHNob3J0IGJyYW5jaGVzIHdpdGhvdXQgY3JlYXRpbmcgYSBzeW1ib2wuCi0JICAgKiBOb3RlIHRoYXQgdGhlIGV4cHJlc3Npb24gc3RpbGwgbWlnaHQgY29tZSBmcm9tIHRoZSBhc3NlbWJseQotCSAgICogaW5wdXQsIGluIHdoaWNoIGNhc2UgdGhlIHZhbHVlIGlzIG5vdCBjaGVja2VkIGZvciByYW5nZSBub3IKLQkgICAqIGlzIGEgcmVsb2NhdGlvbiBlbnRyeSBnZW5lcmF0ZWQgKHl1Y2spLgotCSAgICovCi0JICBpZiAoZXAtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGluc24uaW5zbl9vcGNvZGUgfD0gKGVwLT5YX2FkZF9udW1iZXIgPj4gMikgJiAweGZmZmY7Ci0JICAgICAgZXAgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHIgPSBCRkRfUkVMT0NfMTZfUENSRUxfUzI7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2EnOgotCSAgYXNzZXJ0IChlcCAhPSBOVUxMKTsKLQkgIHIgPSBCRkRfUkVMT0NfTUlQU19KTVA7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ0MnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOwotCSAgY29udGludWU7Ci0KLQlkZWZhdWx0OgotCSAgaW50ZXJuYWxFcnJvciAoKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIGFzc2VydCAociA9PSBCRkRfUkVMT0NfVU5VU0VEID8gZXAgPT0gTlVMTCA6IGVwICE9IE5VTEwpOwotCi0gIGFwcGVuZF9pbnNuIChwbGFjZSwgJmluc24sIGVwLCByLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1taXBzMTZfbWFjcm9fYnVpbGQgKHBsYWNlLCBjb3VudGVyLCBlcCwgbmFtZSwgZm10LCBhcmdzKQotICAgICBjaGFyICpwbGFjZTsKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBleHByZXNzaW9uUyAqZXA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmZtdDsKLSAgICAgdmFfbGlzdCBhcmdzOwotewotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotCi0gIHIgPSBCRkRfUkVMT0NfVU5VU0VEOwotICBpbnNuLmluc25fbW8gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAobWlwczE2X29wX2hhc2gsIG5hbWUpOwotICBhc3NlcnQgKGluc24uaW5zbl9tbyk7Ci0gIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotCi0gIHdoaWxlIChzdHJjbXAgKGZtdCwgaW5zbi5pbnNuX21vLT5hcmdzKSAhPSAwCi0JIHx8IGluc24uaW5zbl9tby0+cGluZm8gPT0gSU5TTl9NQUNSTykKLSAgICB7Ci0gICAgICArK2luc24uaW5zbl9tbzsKLSAgICAgIGFzc2VydCAoaW5zbi5pbnNuX21vLT5uYW1lKTsKLSAgICAgIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotICAgIH0KLQotICBpbnNuLmluc25fb3Bjb2RlID0gaW5zbi5pbnNuX21vLT5tYXRjaDsKLSAgaW5zbi51c2VfZXh0ZW5kID0gZmFsc2U7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpbnQgYzsKLQotICAgICAgYyA9ICpmbXQrKzsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnXDAnOgotCSAgYnJlYWs7Ci0KLQljYXNlICcsJzoKLQljYXNlICcoJzoKLQljYXNlICcpJzoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAneSc6Ci0JY2FzZSAndyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9SWTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAneCc6Ci0JY2FzZSAndic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9SWDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAneic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9SWjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnWic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9NT1ZFMzJaOwotCSAgY29udGludWU7Ci0KLQljYXNlICcwJzoKLQljYXNlICdTJzoKLQljYXNlICdQJzoKLQljYXNlICdSJzoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnWCc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9SRUdSMzI7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1knOgotCSAgewotCSAgICBpbnQgcmVnbm87Ci0KLQkgICAgcmVnbm8gPSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0JICAgIHJlZ25vID0gKChyZWdubyAmIDcpIDw8IDIpIHwgKChyZWdubyAmIDB4MTgpID4+IDMpOwotCSAgICBpbnNuLmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JFRzMyUjsKLQkgIH0KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnPCc6Ci0JY2FzZSAnPic6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnSCc6Ci0JY2FzZSAnVyc6Ci0JY2FzZSAnRCc6Ci0JY2FzZSAnaic6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAnQyc6Ci0JY2FzZSAnVSc6Ci0JY2FzZSAnayc6Ci0JY2FzZSAnSyc6Ci0JY2FzZSAncCc6Ci0JY2FzZSAncSc6Ci0JICB7Ci0JICAgIGFzc2VydCAoZXAgIT0gTlVMTCk7Ci0KLQkgICAgaWYgKGVwLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICAgICAgciA9IEJGRF9SRUxPQ19VTlVTRUQgKyBjOwotCSAgICBlbHNlCi0JICAgICAgewotCQltaXBzMTZfaW1tZWQgKChjaGFyICopIE5VTEwsIDAsIGMsIGVwLT5YX2FkZF9udW1iZXIsIGZhbHNlLAotCQkJICAgICAgZmFsc2UsIGZhbHNlLCAmaW5zbi5pbnNuX29wY29kZSwKLQkJCSAgICAgICZpbnNuLnVzZV9leHRlbmQsICZpbnNuLmV4dGVuZCk7Ci0JCWVwID0gTlVMTDsKLQkJciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgICAgfQotCSAgfQotCSAgY29udGludWU7Ci0KLQljYXNlICc2JzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX0lNTTY7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhc3NlcnQgKHIgPT0gQkZEX1JFTE9DX1VOVVNFRCA/IGVwID09IE5VTEwgOiBlcCAhPSBOVUxMKTsKLQotICBhcHBlbmRfaW5zbiAocGxhY2UsICZpbnNuLCBlcCwgciwgZmFsc2UpOwotfQotCi0vKgotICogR2VuZXJhdGUgYSAibHVpIiBpbnN0cnVjdGlvbi4KLSAqLwotc3RhdGljIHZvaWQKLW1hY3JvX2J1aWxkX2x1aSAocGxhY2UsIGNvdW50ZXIsIGVwLCByZWdudW0pCi0gICAgIGNoYXIgKnBsYWNlOwotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgZXhwcmVzc2lvblMgaGlnaF9leHByOwotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBDT05TVCBjaGFyICpuYW1lID0gImx1aSI7Ci0gIENPTlNUIGNoYXIgKmZtdCA9ICJ0LHUiOwotCi0gIGFzc2VydCAoISBtaXBzX29wdHMubWlwczE2KTsKLQotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICBoaWdoX2V4cHIgPSAqZXA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoaWdoX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBoaWdoX2V4cHIuWF9hZGRfbnVtYmVyID0gZXAtPlhfYWRkX251bWJlcjsKLSAgICB9Ci0KLSAgaWYgKGhpZ2hfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgLyogd2UgY2FuIGNvbXB1dGUgdGhlIGluc3RydWN0aW9uIG5vdyB3aXRob3V0IGEgcmVsb2NhdGlvbiBlbnRyeSAqLwotICAgICAgaWYgKGhpZ2hfZXhwci5YX2FkZF9udW1iZXIgJiAweDgwMDApCi0JaGlnaF9leHByLlhfYWRkX251bWJlciArPSAweDEwMDAwOwotICAgICAgaGlnaF9leHByLlhfYWRkX251bWJlciA9Ci0JKCh1bnNpZ25lZCBsb25nKSBoaWdoX2V4cHIuWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLSAgICAgIHIgPSBCRkRfUkVMT0NfVU5VU0VEOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoZXAtPlhfb3AgPT0gT19zeW1ib2wpOwotICAgICAgLyogX2dwX2Rpc3AgaXMgYSBzcGVjaWFsIGNhc2UsIHVzZWQgZnJvbSBzX2NwbG9hZC4gICovCi0gICAgICBhc3NlcnQgKG1pcHNfcGljID09IE5PX1BJQwotCSAgICAgIHx8IHN0cmNtcCAoU19HRVRfTkFNRSAoZXAtPlhfYWRkX3N5bWJvbCksICJfZ3BfZGlzcCIpID09IDApOwotICAgICAgciA9IEJGRF9SRUxPQ19ISTE2X1M7Ci0gICAgfQotCi0gIC8qCi0gICAqIElmIHRoZSBtYWNybyBpcyBhYm91dCB0byBleHBhbmQgaW50byBhIHNlY29uZCBpbnN0cnVjdGlvbiwKLSAgICogcHJpbnQgYSB3YXJuaW5nIGlmIG5lZWRlZC4gV2UgbmVlZCB0byBwYXNzIGlwIGFzIGEgcGFyYW1ldGVyCi0gICAqIHRvIGdlbmVyYXRlIGEgYmV0dGVyIHdhcm5pbmcgbWVzc2FnZSBoZXJlLi4uCi0gICAqLwotICBpZiAobWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zICYmIHBsYWNlID09IE5VTEwgJiYgKmNvdW50ZXIgPT0gMSkKLSAgICBhc193YXJuIChfKCJNYWNybyBpbnN0cnVjdGlvbiBleHBhbmRlZCBpbnRvIG11bHRpcGxlIGluc3RydWN0aW9ucyIpKTsKLQotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICAqY291bnRlciArPSAxOwkJLyogYnVtcCBpbnN0cnVjdGlvbiBjb3VudGVyICovCi0KLSAgaW5zbi5pbnNuX21vID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG5hbWUpOwotICBhc3NlcnQgKGluc24uaW5zbl9tbyk7Ci0gIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotICBhc3NlcnQgKHN0cmNtcCAoZm10LCBpbnNuLmluc25fbW8tPmFyZ3MpID09IDApOwotCi0gIGluc24uaW5zbl9vcGNvZGUgPSBpbnNuLmluc25fbW8tPm1hdGNoIHwgKHJlZ251bSA8PCBPUF9TSF9SVCk7Ci0gIGlmIChyID09IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaW5zbi5pbnNuX29wY29kZSB8PSBoaWdoX2V4cHIuWF9hZGRfbnVtYmVyOwotICAgICAgYXBwZW5kX2luc24gKHBsYWNlLCAmaW5zbiwgTlVMTCwgciwgZmFsc2UpOwotICAgIH0KLSAgZWxzZQotICAgIGFwcGVuZF9pbnNuIChwbGFjZSwgJmluc24sICZoaWdoX2V4cHIsIHIsIGZhbHNlKTsKLX0KLQotLyoJCQlzZXRfYXQoKQotICogR2VuZXJhdGVzIGNvZGUgdG8gc2V0IHRoZSAkYXQgcmVnaXN0ZXIgdG8gdHJ1ZSAob25lKQotICogaWYgcmVnIGlzIGxlc3MgdGhhbiB0aGUgaW1tZWRpYXRlIGV4cHJlc3Npb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1zZXRfYXQgKGNvdW50ZXIsIHJlZywgdW5zaWduZWRwKQotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGludCByZWc7Ci0gICAgIGludCB1bnNpZ25lZHA7Ci17Ci0gIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLSAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0gICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0gICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZpbW1fZXhwciwKLQkJIHVuc2lnbmVkcCA/ICJzbHRpdSIgOiAic2x0aSIsCi0JCSAidCxyLGoiLCBBVCwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb2FkX3JlZ2lzdGVyIChjb3VudGVyLCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAotCQkgICB1bnNpZ25lZHAgPyAic2x0dSIgOiAic2x0IiwKLQkJICAgImQsdix0IiwgQVQsIHJlZywgQVQpOwotICAgIH0KLX0KLQotLyogV2FybiBpZiBhbiBleHByZXNzaW9uIGlzIG5vdCBhIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCBleCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci0gICAgIGV4cHJlc3Npb25TICpleDsKLXsKLSAgaWYgKGV4LT5YX29wID09IE9fYmlnKQotICAgIGFzX2JhZCAoXygidW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gIGVsc2UgaWYgKGV4LT5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgYXNfYmFkIChfKCJJbnN0cnVjdGlvbiAlcyByZXF1aXJlcyBhYnNvbHV0ZSBleHByZXNzaW9uIiksIGlwLT5pbnNuX21vLT5uYW1lKTsKLX0KLQotLyogQ291bnQgdGhlIGxlYWRpbmcgemVyb2VzIGJ5IHBlcmZvcm1pbmcgYSBiaW5hcnkgY2hvcC4gVGhpcyBpcyBhCi0gICBidWxreSBiaXQgb2Ygc291cmNlLCBidXQgcGVyZm9ybWFuY2UgaXMgYSBMT1QgYmV0dGVyIGZvciB0aGUKLSAgIG1ham9yaXR5IG9mIHZhbHVlcyB0aGFuIGEgc2ltcGxlIGxvb3AgdG8gY291bnQgdGhlIGJpdHM6Ci0gICAgICAgZm9yIChsY250ID0gMDsgKGxjbnQgPCAzMik7IGxjbnQrKykKLSAgICAgICAgIGlmICgodikgJiAoMSA8PCAoMzEgLSBsY250KSkpCi0gICAgICAgICAgIGJyZWFrOwotICBIb3dldmVyIGl0IGlzIG5vdCBjb2RlIHNpemUgZnJpZW5kbHksIGFuZCB0aGUgZ2FpbiB3aWxsIGRyb3AgYSBiaXQKLSAgb24gY2VydGFpbiBjYWNoZWQgc3lzdGVtcy4KLSovCi0jZGVmaW5lIENPVU5UX1RPUF9aRVJPRVModikgICAgICAgICAgICAgXAotICAoKCh2KSAmIH4weGZmZmYpID09IDAgICAgICAgICAgICAgICAgIFwKLSAgID8gKCh2KSAmIH4weGZmKSA9PSAwICAgICAgICAgICAgICAgICBcCi0gICAgID8gKCh2KSAmIH4weGYpID09IDAgICAgICAgICAgICAgICAgXAotICAgICAgID8gKCh2KSAmIH4weDMpID09IDAgICAgICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDEpID09IDAgICAgICAgICAgICBcCi0gICAgICAgICAgID8gISh2KSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgID8gMzIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICA6IDMxICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMzAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4NykgPT0gMCAgICAgICAgICAgIFwKLSAgICAgICAgICAgPyAyOSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMjggICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIDogKCh2KSAmIH4weDNmKSA9PSAwICAgICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmKSA9PSAwICAgICAgICAgICBcCi0gICAgICAgICAgID8gMjcgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDI2ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmKSA9PSAwICAgICAgICAgICBcCi0gICAgICAgICAgID8gMjUgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDI0ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgOiAoKHYpICYgfjB4ZmZmKSA9PSAwICAgICAgICAgICAgICBcCi0gICAgICAgPyAoKHYpICYgfjB4M2ZmKSA9PSAwICAgICAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmKSA9PSAwICAgICAgICAgIFwKLSAgICAgICAgICAgPyAyMyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMjIgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmKSA9PSAwICAgICAgICAgIFwKLSAgICAgICAgICAgPyAyMSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMjAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIDogKCh2KSAmIH4weDNmZmYpID09IDAgICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZmYpID09IDAgICAgICAgICBcCi0gICAgICAgICAgID8gMTkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDE4ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZmYpID09IDAgICAgICAgICBcCi0gICAgICAgICAgID8gMTcgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDE2ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIDogKCh2KSAmIH4weGZmZmZmZikgPT0gMCAgICAgICAgICAgICBcCi0gICAgID8gKCh2KSAmIH4weGZmZmZmKSA9PSAwICAgICAgICAgICAgXAotICAgICAgID8gKCh2KSAmIH4weDNmZmZmKSA9PSAwICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZmZmKSA9PSAwICAgICAgICBcCi0gICAgICAgICAgID8gMTUgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDE0ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZmZmKSA9PSAwICAgICAgICBcCi0gICAgICAgICAgID8gMTMgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDEyICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6ICgodikgJiB+MHgzZmZmZmYpID09IDAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmZmYpID09IDAgICAgICAgXAotICAgICAgICAgICA/IDExICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxMCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmZmYpID09IDAgICAgICAgXAotICAgICAgICAgICA/IDkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiA4ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIDogKCh2KSAmIH4weGZmZmZmZmYpID09IDAgICAgICAgICAgXAotICAgICAgID8gKCh2KSAmIH4weDNmZmZmZmYpID09IDAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZmZmZmYpID09IDAgICAgICBcCi0gICAgICAgICAgID8gNyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZmZmZmYpID09IDAgICAgICBcCi0gICAgICAgICAgID8gNSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDQgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6ICgodikgJiB+MHgzZmZmZmZmZikgPT0gMCAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmZmZmZikgPT0gMCAgICAgXAotICAgICAgICAgICA/IDMgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmZmZmZikgPT0gMCAgICAgXAotICAgICAgICAgICA/IDEgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAwKQotCi0vKgkJCWxvYWRfcmVnaXN0ZXIoKQotICogIFRoaXMgcm91dGluZSBnZW5lcmF0ZXMgdGhlIGxlYXN0IG51bWJlciBvZiBpbnN0cnVjdGlvbnMgbmVjY2Vzc2FyeSB0byBsb2FkCi0gKiAgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1sb2FkX3JlZ2lzdGVyIChjb3VudGVyLCByZWcsIGVwLCBkYmwpCi0gICAgIGludCAqY291bnRlcjsKLSAgICAgaW50IHJlZzsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBpbnQgZGJsOwotewotICBpbnQgZnJlZzsKLSAgZXhwcmVzc2lvblMgaGkzMiwgbG8zMjsKLQotICBpZiAoZXAtPlhfb3AgIT0gT19iaWcpCi0gICAgewotICAgICAgYXNzZXJ0IChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KTsKLSAgICAgIGlmIChlcC0+WF9hZGRfbnVtYmVyIDwgMHg4MDAwCi0JICAmJiAoZXAtPlhfYWRkX251bWJlciA+PSAwCi0JICAgICAgfHwgKGVwLT5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCQkgICYmICghIGRibAotCQkgICAgICB8fCAhIGVwLT5YX3Vuc2lnbmVkCi0JCSAgICAgIHx8IHNpemVvZiAoZXAtPlhfYWRkX251bWJlcikgPiA0KSkpKQotCXsKLQkgIC8qIFdlIGNhbiBoYW5kbGUgMTYgYml0IHNpZ25lZCB2YWx1ZXMgd2l0aCBhbiBhZGRpdSB0bwotCSAgICAgJHplcm8uICBObyBuZWVkIHRvIGV2ZXIgdXNlIGRhZGRpdSBoZXJlLCBzaW5jZSAkemVybyBhbmQKLQkgICAgIHRoZSByZXN1bHQgYXJlIGFsd2F5cyBjb3JyZWN0IGluIDMyIGJpdCBtb2RlLiAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgImFkZGl1IiwgInQscixqIiwgcmVnLCAwLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGVwLT5YX2FkZF9udW1iZXIgPj0gMCAmJiBlcC0+WF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICAvKiBXZSBjYW4gaGFuZGxlIDE2IGJpdCB1bnNpZ25lZCB2YWx1ZXMgd2l0aCBhbiBvcmkgdG8KLSAgICAgICAgICAgICAkemVyby4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJvcmkiLCAidCxyLGkiLCByZWcsIDAsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoKCgoZXAtPlhfYWRkX251bWJlciAmfiAob2Zmc2V0VCkgMHg3ZmZmZmZmZikgPT0gMAotCQkgfHwgKChlcC0+WF9hZGRfbnVtYmVyICZ+IChvZmZzZXRUKSAweDdmZmZmZmZmKQotCQkgICAgID09IH4gKG9mZnNldFQpIDB4N2ZmZmZmZmYpKQotCQkmJiAoISBkYmwKLQkJICAgIHx8ICEgZXAtPlhfdW5zaWduZWQKLQkJICAgIHx8IHNpemVvZiAoZXAtPlhfYWRkX251bWJlcikgPiA0Ci0JCSAgICB8fCAoZXAtPlhfYWRkX251bWJlciAmIDB4ODAwMDAwMDApID09IDApKQotCSAgICAgICB8fCAoKG1pcHNfb3B0cy5pc2EgPCAzIHx8ICEgZGJsKQotCQkgICAmJiAoZXAtPlhfYWRkX251bWJlciAmfiAob2Zmc2V0VCkgMHhmZmZmZmZmZikgPT0gMCkKLQkgICAgICAgfHwgKG1pcHNfb3B0cy5pc2EgPCAzCi0JCSAgICYmICEgZGJsCi0JCSAgICYmICgoZXAtPlhfYWRkX251bWJlciAmfiAob2Zmc2V0VCkgMHhmZmZmZmZmZikKLQkJICAgICAgID09IH4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpKSkKLQl7Ci0JICAvKiAzMiBiaXQgdmFsdWVzIHJlcXVpcmUgYW4gbHVpLiAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgImx1aSIsICJ0LHUiLCByZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7Ci0JICBpZiAoKGVwLT5YX2FkZF9udW1iZXIgJiAweGZmZmYpICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgIm9yaSIsICJ0LHIsaSIsIHJlZywgcmVnLAotCQkJIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiAzMiBiaXRzLiAgKi8KLQotICBpZiAobWlwc19vcHRzLmlzYSA8IDMpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJOdW1iZXIgbGFyZ2VyIHRoYW4gMzIgYml0cyIpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgImFkZGl1IiwgInQscixqIiwgcmVnLCAwLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChlcC0+WF9vcCAhPSBPX2JpZykKLSAgICB7Ci0gICAgICBoaTMyID0gKmVwOwotICAgICAgaGkzMi5YX2FkZF9udW1iZXIgPSAodmFsdWVUKSBoaTMyLlhfYWRkX251bWJlciA+PiAxNjsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyID0gKHZhbHVlVCkgaGkzMi5YX2FkZF9udW1iZXIgPj4gMTY7Ci0gICAgICBoaTMyLlhfYWRkX251bWJlciAmPSAweGZmZmZmZmZmOwotICAgICAgbG8zMiA9ICplcDsKLSAgICAgIGxvMzIuWF9hZGRfbnVtYmVyICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNzZXJ0IChlcC0+WF9hZGRfbnVtYmVyID4gMik7Ci0gICAgICBpZiAoZXAtPlhfYWRkX251bWJlciA9PSAzKQotCWdlbmVyaWNfYmlnbnVtWzNdID0gMDsKLSAgICAgIGVsc2UgaWYgKGVwLT5YX2FkZF9udW1iZXIgPiA0KQotCWFzX2JhZCAoXygiTnVtYmVyIGxhcmdlciB0aGFuIDY0IGJpdHMiKSk7Ci0gICAgICBsbzMyLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgbG8zMi5YX2FkZF9udW1iZXIgPSBnZW5lcmljX2JpZ251bVswXSArIChnZW5lcmljX2JpZ251bVsxXSA8PCAxNik7Ci0gICAgICBoaTMyLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgaGkzMi5YX2FkZF9udW1iZXIgPSBnZW5lcmljX2JpZ251bVsyXSArIChnZW5lcmljX2JpZ251bVszXSA8PCAxNik7Ci0gICAgfQotCi0gIGlmIChoaTMyLlhfYWRkX251bWJlciA9PSAwKQotICAgIGZyZWcgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgaW50IHNoaWZ0LCBiaXQ7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhpLCBsbzsKLQotICAgICAgaWYgKGhpMzIuWF9hZGRfbnVtYmVyID09IDB4ZmZmZmZmZmYpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmODAwMCkgPT0gMHhmZmZmODAwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAiYWRkaXUiLCAidCxyLGoiLAotCQkJICAgcmVnLCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobG8zMi5YX2FkZF9udW1iZXIgJiAweDgwMDAwMDAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJsdWkiLCAidCx1IiwgcmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotCSAgICAgIGlmIChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZikKLQkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAib3JpIiwgInQscixpIiwKLQkJCSAgICAgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qIENoZWNrIGZvciAxNmJpdCBzaGlmdGVkIGNvbnN0YW50LiAgV2Uga25vdyB0aGF0IGhpMzIgaXMKLSAgICAgICAgIG5vbi16ZXJvLCBzbyBzdGFydCB0aGUgbWFzayBvbiB0aGUgZmlyc3QgYml0IG9mIHRoZSBoaTMyCi0gICAgICAgICB2YWx1ZS4gICovCi0gICAgICBzaGlmdCA9IDE3OwotICAgICAgZG8KLSAgICAgICB7Ci0JIHVuc2lnbmVkIGxvbmcgaGltYXNrLCBsb21hc2s7Ci0KLQkgaWYgKHNoaWZ0IDwgMzIpCi0JICAgewotCSAgICAgaGltYXNrID0gMHhmZmZmID4+ICgzMiAtIHNoaWZ0KTsKLQkgICAgIGxvbWFzayA9ICgweGZmZmYgPDwgc2hpZnQpICYgMHhmZmZmZmZmZjsKLQkgICB9Ci0JIGVsc2UKLQkgICB7Ci0JICAgICBoaW1hc2sgPSAweGZmZmYgPDwgKHNoaWZ0IC0gMzIpOwotCSAgICAgbG9tYXNrID0gMDsKLQkgICB9Ci0JIGlmICgoaGkzMi5YX2FkZF9udW1iZXIgJiB+IChvZmZzZXRUKSBoaW1hc2spID09IDAKLQkgICAgICYmIChsbzMyLlhfYWRkX251bWJlciAmIH4gKG9mZnNldFQpIGxvbWFzaykgPT0gMCkKLQkgICB7Ci0JICAgICBleHByZXNzaW9uUyB0bXA7Ci0KLQkgICAgIHRtcC5YX29wID0gT19jb25zdGFudDsKLQkgICAgIGlmIChzaGlmdCA8IDMyKQotCSAgICAgICB0bXAuWF9hZGRfbnVtYmVyID0gKChoaTMyLlhfYWRkX251bWJlciA8PCAoMzIgLSBzaGlmdCkpCi0JCQkJICAgfCAobG8zMi5YX2FkZF9udW1iZXIgPj4gc2hpZnQpKTsKLQkgICAgIGVsc2UKLQkgICAgICAgdG1wLlhfYWRkX251bWJlciA9IGhpMzIuWF9hZGRfbnVtYmVyID4+IChzaGlmdCAtIDMyKTsKLQkgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmdG1wLCAib3JpIiwgInQscixpIiwgcmVnLCAwLAotCQkJICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwKLQkJCSAgKHNoaWZ0ID49IDMyKSA/ICJkc2xsMzIiIDogImRzbGwiLAotCQkJICAiZCx3LDwiLCByZWcsIHJlZywKLQkJCSAgKHNoaWZ0ID49IDMyKSA/IHNoaWZ0IC0gMzIgOiBzaGlmdCk7Ci0JICAgICByZXR1cm47Ci0JICAgfQotICAgICAgICAgc2hpZnQrKzsKLSAgICAgICB9IHdoaWxlIChzaGlmdCA8PSAoNjQgLSAxNikpOwotCi0gICAgICAvKiBGaW5kIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBsb3dlc3Qgb25lIGJpdCwgYW5kIHN0b3JlIHRoZQotICAgICAgICAgc2hpZnRlZCB2YWx1ZSBpbiBoaS9sby4gICovCi0gICAgICBoaSA9ICh1bnNpZ25lZCBsb25nKSAoaGkzMi5YX2FkZF9udW1iZXIgJiAweGZmZmZmZmZmKTsKLSAgICAgIGxvID0gKHVuc2lnbmVkIGxvbmcpIChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZmZmZmYpOwotICAgICAgaWYgKGxvICE9IDApCi0JewotCSAgYml0ID0gMDsKLQkgIHdoaWxlICgobG8gJiAxKSA9PSAwKQotCSAgICB7Ci0JICAgICAgbG8gPj49IDE7Ci0JICAgICAgKytiaXQ7Ci0JICAgIH0KLQkgIGxvIHw9IChoaSAmICgoKHVuc2lnbmVkIGxvbmcpIDEgPDwgYml0KSAtIDEpKSA8PCAoMzIgLSBiaXQpOwotCSAgaGkgPj49IGJpdDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYml0ID0gMzI7Ci0JICB3aGlsZSAoKGhpICYgMSkgPT0gMCkKLQkgICAgewotCSAgICAgIGhpID4+PSAxOwotCSAgICAgICsrYml0OwotCSAgICB9Ci0JICBsbyA9IGhpOwotCSAgaGkgPSAwOwotCX0KLQotICAgICAgLyogT3B0aW1pemUgaWYgdGhlIHNoaWZ0ZWQgdmFsdWUgaXMgYSAocG93ZXIgb2YgMikgLSAxLiAgKi8KLSAgICAgIGlmICgoaGkgPT0gMCAmJiAoKGxvICsgMSkgJiBsbykgPT0gMCkKLQkgIHx8IChsbyA9PSAweGZmZmZmZmZmICYmICgoaGkgKyAxKSAmIGhpKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgIHNoaWZ0ID0gQ09VTlRfVE9QX1pFUk9FUyAoKHVuc2lnbmVkIGludCkgaGkzMi5YX2FkZF9udW1iZXIpOwotCSAgaWYgKHNoaWZ0ICE9IDApCi0gICAgICAgICAgICB7Ci0JICAgICAgZXhwcmVzc2lvblMgdG1wOwotCi0JICAgICAgLyogVGhpcyBpbnN0cnVjdGlvbiB3aWxsIHNldCB0aGUgcmVnaXN0ZXIgdG8gYmUgYWxsCi0gICAgICAgICAgICAgICAgIG9uZXMuICAqLwotICAgICAgICAgICAgICB0bXAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICAgICAgICAgIHRtcC5YX2FkZF9udW1iZXIgPSAob2Zmc2V0VCkgLTE7Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmdG1wLCAiYWRkaXUiLCAidCxyLGoiLAotCQkJICAgcmVnLCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICAgICAgICAgIGlmIChiaXQgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBiaXQgKz0gc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0ID49IDMyKSA/ICJkc2xsMzIiIDogImRzbGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkLHcsPCIsIHJlZywgcmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgPj0gMzIpID8gYml0IC0gMzIgOiBiaXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0JCQkgICAoc2hpZnQgPj0gMzIpID8gImRzcmwzMiIgOiAiZHNybCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZCx3LDwiLCByZWcsIHJlZywKLQkJCSAgIChzaGlmdCA+PSAzMikgPyBzaGlmdCAtIDMyIDogc2hpZnQpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgLyogU2lnbiBleHRlbmQgaGkzMiBiZWZvcmUgY2FsbGluZyBsb2FkX3JlZ2lzdGVyLCBiZWNhdXNlIHdlIGNhbgotICAgICAgICAgZ2VuZXJhbGx5IGdldCBiZXR0ZXIgY29kZSB3aGVuIHdlIGxvYWQgYSBzaWduIGV4dGVuZGVkIHZhbHVlLiAgKi8KLSAgICAgIGlmICgoaGkzMi5YX2FkZF9udW1iZXIgJiAweDgwMDAwMDAwKSAhPSAwKQotCWhpMzIuWF9hZGRfbnVtYmVyIHw9IH4gKG9mZnNldFQpIDB4ZmZmZmZmZmY7Ci0gICAgICBsb2FkX3JlZ2lzdGVyIChjb3VudGVyLCByZWcsICZoaTMyLCAwKTsKLSAgICAgIGZyZWcgPSByZWc7Ci0gICAgfQotICBpZiAoKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmMDAwMCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZnJlZyAhPSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLCAiZHNsbDMyIiwgImQsdyw8IiwgcmVnLAotCQkgICAgICAgZnJlZywgMCk7Ci0JICBmcmVnID0gcmVnOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBtaWQxNjsKLQotICAgICAgaWYgKChmcmVnID09IDApICYmIChsbzMyLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKSkKLSAgICAgICAgewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAibHVpIiwgInQsdSIsIHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKLSAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzcmwzMiIsICJkLHcsPCIsIHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgcmVnLCAwKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGZyZWcgIT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzbGwiLCAiZCx3LDwiLCByZWcsCi0JCSAgICAgICBmcmVnLCAxNik7Ci0JICBmcmVnID0gcmVnOwotCX0KLSAgICAgIG1pZDE2ID0gbG8zMjsKLSAgICAgIG1pZDE2LlhfYWRkX251bWJlciA+Pj0gMTY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJm1pZDE2LCAib3JpIiwgInQscixpIiwgcmVnLAotCQkgICBmcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzbGwiLCAiZCx3LDwiLCByZWcsCi0JCSAgIHJlZywgMTYpOwotICAgICAgZnJlZyA9IHJlZzsKLSAgICB9Ci0gIGlmICgobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmYpICE9IDApCi0gICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAib3JpIiwgInQscixpIiwgcmVnLCBmcmVnLAotCQkgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotfQotCi0vKiBMb2FkIGFuIGFkZHJlc3MgaW50byBhIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWxvYWRfYWRkcmVzcyAoY291bnRlciwgcmVnLCBlcCkKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBpbnQgcmVnOwotICAgICBleHByZXNzaW9uUyAqZXA7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKGVwLT5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgICYmIGVwLT5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLSAgICAgIGVwLT5YX29wID0gT19jb25zdGFudDsKLSAgICB9Ci0KLSAgaWYgKGVwLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgbG9hZF9yZWdpc3RlciAoY291bnRlciwgcmVnLCBlcCwgMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgIGFkZGl1CSRyZWcsJGdwLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgbHVpCQkkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKLQkgICBhZGRpdQkkcmVnLCRyZWcsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgSWYgd2UgaGF2ZSBhbiBhZGRlbmQsIHdlIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBmb3JtLiAgKi8KLSAgICAgIGlmICgodmFsdWVUKSBlcC0+WF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLSAgICAgICAgICB8fCBub3BpY19uZWVkX3JlbGF4IChlcC0+WF9hZGRfc3ltYm9sLCAxKSkKLQlwID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBmcmFnX2dyb3cgKDIwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDAsCi0JCQlSRUxBWF9FTkNPREUgKDQsIDgsIDAsIDQsIDAsCi0JCQkJICAgICAgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zKSwKLQkJCWVwLT5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLCAoY2hhciAqKSBOVUxMKTsKLQl9Ci0gICAgICBtYWNyb19idWlsZF9sdWkgKHAsIGNvdW50ZXIsIGVwLCByZWcpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQlwICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgIH0KLSAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgZXg7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgbHcJCSRyZWcsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSBPdGhlcndpc2Ugd2Ugd2FudAotCSAgIGx3CQkkcmVnLDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICBub3AKLQkgICBhZGRpdQkkcmVnLCRyZWcsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgaXQgbXVzdCBiZSBhZGRlZCBpbiBhZnRlci4gICovCi0gICAgICBleC5YX2FkZF9udW1iZXIgPSBlcC0+WF9hZGRfbnVtYmVyOwotICAgICAgZXAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBmcmFnX2dyb3cgKDIwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkgICAgPyAibHciIDogImxkIiksCi0JCSAgICJ0LG8oYikiLCByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAwLAotCQkgICAgUkVMQVhfRU5DT0RFICgwLCA0LCAtOCwgMCwgMCwgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zKSwKLQkJICAgIGVwLT5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgaWYgKGV4LlhfYWRkX251bWJlciAhPSAwKQotCXsKLQkgIGlmIChleC5YX2FkZF9udW1iZXIgPCAtMHg4MDAwIHx8IGV4LlhfYWRkX251bWJlciA+PSAweDgwMDApCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmV4LAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBleDsKLSAgICAgIGludCBvZmY7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGxhcmdlIEdPVCBjYXNlLiAgSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbgotCSBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICBsdWkJCSRyZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICBhZGR1CQkkcmVnLCRyZWcsJGdwCi0JICAgbHcJCSRyZWcsPHN5bT4oJHJlZykJKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSBPdGhlcndpc2UsIGZvciBhIHJlZmVyZW5jZSB0byBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgIGx3CQkkcmVnLDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICBub3AKLQkgICBhZGRpdQkkcmVnLCRyZWcsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgaXQgbXVzdCBiZSBhZGRlZCBpbiBhZnRlci4gICovCi0gICAgICBleC5YX2FkZF9udW1iZXIgPSBlcC0+WF9hZGRfbnVtYmVyOwotICAgICAgZXAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0Jb2ZmID0gNDsKLSAgICAgIGVsc2UKLQlvZmYgPSAwOwotICAgICAgZnJhZ19ncm93ICgzMik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJsdWkiLCAidCx1IiwgcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICJkLHYsdCIsIHJlZywgcmVnLCBHUCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAidCxvKGIpIiwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgcmVnKTsKLSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgb2ZmLCAwLAotCQkgICAgUkVMQVhfRU5DT0RFICgxMiwgMTIgKyBvZmYsIG9mZiwgOCArIG9mZiwgMCwKLQkJCQkgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCSAgICBlcC0+WF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBpZiAob2ZmID4gMCkKLQl7Ci0JICAvKiBXZSBuZWVkIGEgbm9wIGJlZm9yZSBsb2FkaW5nIGZyb20gJGdwLiAgVGhpcyBzcGVjaWFsCi0gICAgICAgICAgICAgY2hlY2sgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgbHVpIHdoaWNoIHN0YXJ0cyB0aGUgbWFpbgotICAgICAgICAgICAgIGluc3RydWN0aW9uIHN0cmVhbSBkb2VzIG5vdCByZWZlciB0byAkZ3AsIGFuZCBzbyB3aWxsIG5vdAotICAgICAgICAgICAgIGluc2VydCB0aGUgbm9wIHdoaWNoIG1heSBiZSByZXF1aXJlZC4gICovCi0JICBtYWNyb19idWlsZCAocCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBwICs9IDQ7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgInQsbyhiKSIsIHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgaWYgKGV4LlhfYWRkX251bWJlciAhPSAwKQotCXsKLQkgIGlmIChleC5YX2FkZF9udW1iZXIgPCAtMHg4MDAwIHx8IGV4LlhfYWRkX251bWJlciA+PSAweDgwMDApCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmV4LAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotICAgIHsKLSAgICAgIC8qIFdlIGFsd2F5cyBkbwotCSAgIGFkZGl1CSRyZWcsJGdwLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICovCi0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotfQotCi0vKgotICoJCQlCdWlsZCBtYWNyb3MKLSAqICAgVGhpcyByb3V0aW5lIGltcGxlbWVudHMgdGhlIHNlZW1pbmdseSBlbmRsZXNzIG1hY3JvIG9yIHN5bnRoZXNpemVkCi0gKiBpbnN0cnVjdGlvbnMgYW5kIGFkZHJlc3NpbmcgbW9kZXMgaW4gdGhlIG1pcHMgYXNzZW1ibHkgbGFuZ3VhZ2UuIE1hbnkKLSAqIG9mIHRoZXNlIG1hY3JvcyBhcmUgc2ltcGxlIGFuZCBhcmUgc2ltaWxhciB0byBlYWNoIG90aGVyLiBUaGVzZSBjb3VsZAotICogcHJvYmFibHkgYmUgaGFuZGxlZCBieSBzb21lIGtpbmQgb2YgdGFibGUgb3IgZ3JhbW1lciBhcHJvYWNoIGluc3RlYWQgb2YKLSAqIHRoaXMgdmVyYm9zZSBtZXRob2QuIE90aGVycyBhcmUgbm90IHNpbXBsZSBtYWNyb3MgYnV0IGFyZSBtb3JlIGxpa2UKLSAqIG9wdGltaXppbmcgY29kZSBnZW5lcmF0aW9uLgotICogICBPbmUgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9uIGlzIHdoZW4gc2V2ZXJhbCBzdG9yZSBtYWNyb3MgYXBwZWFyCi0gKiBjb25zZWN1dGl2bHkgdGhhdCB3b3VsZCBsb2FkIEFUIHdpdGggdGhlIHVwcGVyIGhhbGYgb2YgdGhlIHNhbWUgYWRkcmVzcy4KLSAqIFRoZSBlbnN1aW5nIGxvYWQgdXBwZXIgaW5zdHJ1Y3Rpb25zIGFyZSBvbW1pdGVkLiBUaGlzIGltcGxpZXMgc29tZSBraW5kCi0gKiBvZiBnbG9iYWwgb3B0aW1pemF0aW9uLiBXZSBjdXJyZW50bHkgb25seSBvcHRpbWl6ZSB3aXRoaW4gYSBzaW5nbGUgbWFjcm8uCi0gKiAgIEZvciBtYW55IG9mIHRoZSBsb2FkIGFuZCBzdG9yZSBtYWNyb3MgaWYgdGhlIGFkZHJlc3MgaXMgc3BlY2lmaWVkIGFzIGEKLSAqIGNvbnN0YW50IGV4cHJlc3Npb24gaW4gdGhlIGZpcnN0IDY0ayBvZiBtZW1vcnkgKGllIGxkICQyLDB4NDAwMGMpIHdlCi0gKiBmaXJzdCBsb2FkIHJlZ2lzdGVyICdhdCcgd2l0aCB6ZXJvIGFuZCB1c2UgaXQgYXMgdGhlIGJhc2UgcmVnaXN0ZXIuIFRoZQotICogbWlwcyBhc3NlbWJsZXIgc2ltcGx5IHVzZXMgcmVnaXN0ZXIgJHplcm8uIEp1c3Qgb25lIHRpbnkgb3B0aW1pemF0aW9uCi0gKiB3ZSdyZSBtaXNzaW5nLgotICovCi1zdGF0aWMgdm9pZAotbWFjcm8gKGlwKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRyZWcsIHNyZWcsIGRyZWcsIGJyZWc7Ci0gIGludCB0ZW1wcmVnOwotICBpbnQgbWFzazsKLSAgaW50IGljbnQgPSAwOwotICBpbnQgdXNlZF9hdDsKLSAgZXhwcmVzc2lvblMgZXhwcjE7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKnMyOwotICBjb25zdCBjaGFyICpmbXQ7Ci0gIGludCBsaWtlbHkgPSAwOwotICBpbnQgZGJsID0gMDsKLSAgaW50IGNvcHJvYyA9IDA7Ci0gIGludCBsciA9IDA7Ci0gIGludCBpbW0gPSAwOwotICBvZmZzZXRUIG1heG51bTsKLSAgaW50IG9mZjsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0gIGNoYXIgKnA7Ci0gIGludCBob2xkX21pcHNfb3B0aW1pemU7Ci0KLSAgYXNzZXJ0ICghIG1pcHNfb3B0cy5taXBzMTYpOwotCi0gIHRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDE2KSAmIDB4MWY7Ci0gIGRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDExKSAmIDB4MWY7Ci0gIHNyZWcgPSBicmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAyMSkgJiAweDFmOwotICBtYXNrID0gaXAtPmluc25fbW8tPm1hc2s7Ci0KLSAgZXhwcjEuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHIxLlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLQotICBzd2l0Y2ggKG1hc2spCi0gICAgewotICAgIGNhc2UgTV9EQUJTOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fQUJTOgotICAgICAgLyogYmdleiAkYTAsLisxMgotCSBtb3ZlIHYwLCRhMAotCSBzdWIgdjAsJHplcm8sJGEwCi0JICovCi0KLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLQotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYmdleiIsICJzLHAiLCBzcmVnKTsKLSAgICAgIGlmIChkcmVnID09IHNyZWcpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotICAgICAgZWxzZQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgc3JlZywgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkc3ViIiA6ICJzdWIiLAotCQkgICAiZCx2LHQiLCBkcmVnLCAwLCBzcmVnKTsKLQotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX0FERF9JOgotICAgICAgcyA9ICJhZGRpIjsKLSAgICAgIHMyID0gImFkZCI7Ci0gICAgICBnb3RvIGRvX2FkZGk7Ci0gICAgY2FzZSBNX0FERFVfSToKLSAgICAgIHMgPSAiYWRkaXUiOwotICAgICAgczIgPSAiYWRkdSI7Ci0gICAgICBnb3RvIGRvX2FkZGk7Ci0gICAgY2FzZSBNX0RBRERfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRhZGRpIjsKLSAgICAgIHMyID0gImRhZGQiOwotICAgICAgZ290byBkb19hZGRpOwotICAgIGNhc2UgTV9EQUREVV9JOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGFkZGl1IjsKLSAgICAgIHMyID0gImRhZGR1IjsKLSAgICBkb19hZGRpOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgcywgInQscixqIiwgdHJlZywgc3JlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkLHYsdCIsIHRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0FORF9JOgotICAgICAgcyA9ICJhbmRpIjsKLSAgICAgIHMyID0gImFuZCI7Ci0gICAgICBnb3RvIGRvX2JpdDsKLSAgICBjYXNlIE1fT1JfSToKLSAgICAgIHMgPSAib3JpIjsKLSAgICAgIHMyID0gIm9yIjsKLSAgICAgIGdvdG8gZG9fYml0OwotICAgIGNhc2UgTV9OT1JfSToKLSAgICAgIHMgPSAiIjsKLSAgICAgIHMyID0gIm5vciI7Ci0gICAgICBnb3RvIGRvX2JpdDsKLSAgICBjYXNlIE1fWE9SX0k6Ci0gICAgICBzID0gInhvcmkiOwotICAgICAgczIgPSAieG9yIjsKLSAgICBkb19iaXQ6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBpZiAobWFzayAhPSBNX05PUl9JKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgcywgInQscixpIiwgdHJlZywKLQkJCSBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgIm9yaSIsICJ0LHIsaSIsCi0JCQkgICB0cmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9yIiwgImQsdix0IiwKLQkJCSAgIHRyZWcsIHRyZWcsIDApOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCx2LHQiLCB0cmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CRVFfSToKLSAgICAgIHMgPSAiYmVxIjsKLSAgICAgIGdvdG8gYmVxX2k7Ci0gICAgY2FzZSBNX0JFUUxfSToKLSAgICAgIHMgPSAiYmVxbCI7Ci0gICAgICBsaWtlbHkgPSAxOwotICAgICAgZ290byBiZXFfaTsKLSAgICBjYXNlIE1fQk5FX0k6Ci0gICAgICBzID0gImJuZSI7Ci0gICAgICBnb3RvIGJlcV9pOwotICAgIGNhc2UgTV9CTkVMX0k6Ci0gICAgICBzID0gImJuZWwiOwotICAgICAgbGlrZWx5ID0gMTsKLSAgICBiZXFfaToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJzLHQscCIsIHNyZWcsCi0JCSAgICAgICAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInMsdCxwIiwgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdFTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHRToKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmdlemwiIDogImJnZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmxlemwiIDogImJsZXoiLAotCQkgICAgICAgInMscCIsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIEFULCBzcmVnLCB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdUTF9JOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdUX0k6Ci0gICAgICAvKiBjaGVjayBmb3IgPiBtYXggaW50ZWdlciAqLwotICAgICAgbWF4bnVtID0gMHg3ZmZmZmZmZjsKLSAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDMgJiYgc2l6ZW9mIChtYXhudW0pID4gNCkKLQl7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSBtYXhudW0KLQkgICYmIChtaXBzX29wdHMuaXNhIDwgMyB8fCBzaXplb2YgKG1heG51bSkgPiA0KSkKLQl7Ci0JZG9fZmFsc2U6Ci0JICAvKiByZXN1bHQgaXMgYWx3YXlzIGZhbHNlICovCi0JICBpZiAoISBsaWtlbHkpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJCcmFuY2ggJXMgaXMgYWx3YXlzIGZhbHNlIChub3ApIiksIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIkJyYW5jaCBsaWtlbHkgJXMgaXMgYWx3YXlzIGZhbHNlIiksIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImJuZWwiLAotCQkJICAgInMsdCxwIiwgMCwgMCk7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIrKzsKLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBNX0JHRV9JOgotICAgIGNhc2UgTV9CR0VMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JHRUxfSSkKLQlsaWtlbHkgPSAxOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ2V6bCIgOiAiYmdleiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ3R6bCIgOiAiYmd0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWF4bnVtID0gMHg3ZmZmZmZmZjsKLSAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDMgJiYgc2l6ZW9mIChtYXhudW0pID4gNCkKLQl7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCX0KLSAgICAgIG1heG51bSA9IC0gbWF4bnVtIC0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8PSBtYXhudW0KLQkgICYmIChtaXBzX29wdHMuaXNhIDwgMyB8fCBzaXplb2YgKG1heG51bSkgPiA0KSkKLQl7Ci0JZG9fdHJ1ZToKLQkgIC8qIHJlc3VsdCBpcyBhbHdheXMgdHJ1ZSAqLwotCSAgYXNfd2FybiAoXygiQnJhbmNoICVzIGlzIGFsd2F5cyB0cnVlIiksIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiYiIsICJwIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc2V0X2F0ICgmaWNudCwgc3JlZywgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHRVVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdFVToKLSAgICAgIGlmICh0cmVnID09IDApCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAgICAgInMsdCxwIiwgMCwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIEFULCBzcmVnLAotCQkgICB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdUVUxfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVFVfSToKLSAgICAgIGlmIChzcmVnID09IDAKLQkgIHx8IChtaXBzX29wdHMuaXNhIDwgMwotCSAgICAgICYmIGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKSkKLQlnb3RvIGRvX2ZhbHNlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CR0VVX0k6Ci0gICAgY2FzZSBNX0JHRVVMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JHRVVMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAgICAgInMsdCxwIiwgc3JlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc2V0X2F0ICgmaWNudCwgc3JlZywgMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVEw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR1Q6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJndHpsIiA6ICJiZ3R6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsdHpsIiA6ICJibHR6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgdHJlZywgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVFVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdUVToKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JZ290byBkb19mYWxzZTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgdHJlZywKLQkJICAgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsZXpsIiA6ICJibGV6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJnZXpsIiA6ICJiZ2V6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgdHJlZywgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRUxfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMRV9JOgotICAgICAgbWF4bnVtID0gMHg3ZmZmZmZmZjsKLSAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDMgJiYgc2l6ZW9mIChtYXhudW0pID4gNCkKLQl7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSBtYXhudW0KLQkgICYmIChtaXBzX29wdHMuaXNhIDwgMyB8fCBzaXplb2YgKG1heG51bSkgPiA0KSkKLQlnb3RvIGRvX3RydWU7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIrKzsKLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBNX0JMVF9JOgotICAgIGNhc2UgTV9CTFRMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JMVExfSSkKLQlsaWtlbHkgPSAxOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibHR6bCIgOiAiYmx0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibGV6bCIgOiAiYmxleiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc2V0X2F0ICgmaWNudCwgc3JlZywgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRVVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxFVToKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JZ290byBkb190cnVlOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIEFULCB0cmVnLAotCQkgICBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkxFVUxfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMRVVfSToKLSAgICAgIGlmIChzcmVnID09IDAKLQkgIHx8IChtaXBzX29wdHMuaXNhIDwgMwotCSAgICAgICYmIGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKSkKLQlnb3RvIGRvX3RydWU7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIrKzsKLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBNX0JMVFVfSToKLSAgICBjYXNlIE1fQkxUVUxfSToKLSAgICAgIGlmIChtYXNrID09IE1fQkxUVUxfSSkKLQlsaWtlbHkgPSAxOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQlnb3RvIGRvX2ZhbHNlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAgICAgInMsdCxwIiwgc3JlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc2V0X2F0ICgmaWNudCwgc3JlZywgMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMVEw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTFQ6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsdHpsIiA6ICJibHR6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJndHpsIiA6ICJiZ3R6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMVFVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxUVToKLSAgICAgIGlmICh0cmVnID09IDApCi0JZ290byBkb19mYWxzZTsKLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgICAgICJzLHQscCIsIDAsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RESVZfMzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX0RJVl8zOgotICAgICAgcyA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2MzsKLSAgICBjYXNlIE1fRFJFTV8zOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fUkVNXzM6Ci0gICAgICBzID0gIm1maGkiOwotICAgIGRvX2RpdjM6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkRpdmlkZSBieSB6ZXJvLiIpKTsKLQkgIGlmIChtaXBzX3RyYXApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCAwLCAwKTsKLQkgIGVsc2UKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNyk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAobWlwc190cmFwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgICAgIGRibCA/ICJkZGl2IiA6ICJkaXYiLAotCQkgICAgICAgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZSIsICJzLHQscCIsIHRyZWcsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICAgICAgZGJsID8gImRkaXYiIDogImRpdiIsCi0JCSAgICAgICAieixzLHQiLCBzcmVnLCB0cmVnKTsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCX0KLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IC0xOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCSAgIGRibCA/ICJkYWRkaXUiIDogImFkZGl1IiwKLQkJICAgInQscixqIiwgQVQsIDAsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IG1pcHNfdHJhcCA/IChkYmwgPyAxMiA6IDgpIDogKGRibCA/IDIwIDogMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCB0cmVnLCBBVCk7Ci0gICAgICBpZiAoZGJsKQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImRhZGRpdSIsICJ0LHIsaiIsIEFULCAwLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiZHNsbDMyIiwgImQsdyw8IiwgQVQsIEFULAotCQkgICAgICAgMzEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSAweDgwMDAwMDAwOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsdWkiLCAidCx1IiwgQVQsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7Ci0JfQotICAgICAgaWYgKG1pcHNfdHJhcCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0Iiwgc3JlZywgQVQpOwotCSAgLyogV2Ugd2FudCB0byBjbG9zZSB0aGUgbm9yZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUsIHNvCi0JICAgICB0aGF0IGxhdGVyIGluc25zIGFyZSBhdmFpbGFibGUgZm9yIGRlbGF5IHNsb3QgZmlsbGluZy4gICovCi0JICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZSIsICJzLHQscCIsIHNyZWcsIEFUKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLQotCSAgLyogV2Ugd2FudCB0byBjbG9zZSB0aGUgbm9yZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUsIHNvCi0JICAgICB0aGF0IGxhdGVyIGluc25zIGFyZSBhdmFpbGFibGUgZm9yIGRlbGF5IHNsb3QgZmlsbGluZy4gICovCi0JICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0KLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDYpOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RJVl8zSToKLSAgICAgIHMgPSAiZGl2IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9ESVZVXzNJOgotICAgICAgcyA9ICJkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9SRU1fM0k6Ci0gICAgICBzID0gImRpdiI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fUkVNVV8zSToKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRERJVl8zSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRkaXYiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RESVZVXzNJOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RSRU1fM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9EUkVNVV8zSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgIGRvX2Rpdmk6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkRpdmlkZSBieSB6ZXJvLiIpKTsKLQkgIGlmIChtaXBzX3RyYXApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCAwLCAwKTsKLQkgIGVsc2UKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBpZiAoc3RyY21wIChzMiwgIm1mbG8iKSA9PSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsCi0JCQkgc3JlZyk7Ci0JICBlbHNlCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IC0xCi0JICAmJiBzW3N0cmxlbiAocykgLSAxXSAhPSAndScpCi0JewotCSAgaWYgKHN0cmNtcCAoczIsICJtZmxvIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChkYmwpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImRuZWciLCAiZCx3IiwgZHJlZywKLQkJCSAgICAgc3JlZyk7Ci0JICAgICAgZWxzZQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJuZWciLCAiZCx3IiwgZHJlZywKLQkJCSAgICAgc3JlZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAieixzLHQiLCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRElWVV8zOgotICAgICAgcyA9ICJkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fUkVNVV8zOgotICAgICAgcyA9ICJkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fRERJVlVfMzoKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9EUkVNVV8zOgotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICBkb19kaXZ1MzoKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIGlmIChtaXBzX3RyYXApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIHRyZWcsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAieixzLHQiLCBzcmVnLCB0cmVnKTsKLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0KLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNyk7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQiLCBkcmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9ETEFfQUI6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9MQV9BQjoKLSAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wgaW50byBhIHJlZ2lzdGVyLiAgSWYgYnJlZyBpcyBub3QKLQkgemVybywgd2UgdGhlbiBhZGQgYSBiYXNlIHJlZ2lzdGVyIHRvIGl0LiAgKi8KLQotICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSBwZXJtaXQgZXhwcmVzc2lvbnMgb2YKLQkgdGhlIGZvcm0KLQkgICBsYQkkNCxmb28tYmFyCi0JIHdoZXJlIGJhciBpcyBhbiBhZGRyZXNzIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhlc2UgYXJlIHVzZWQKLQkgd2hlbiBnZXR0aW5nIHRoZSBhZGRyZXNzZXMgb2YgZnVuY3Rpb25zLiAgV2UgZG9uJ3QgcGVybWl0Ci0JIFhfYWRkX251bWJlciB0byBiZSBub24temVybywgYmVjYXVzZSBpZiB0aGUgc3ltYm9sIGlzCi0JIGV4dGVybmFsIHRoZSByZWxheGluZyBjb2RlIG5lZWRzIHRvIGtub3cgdGhhdCBhbnkgYWRkZW5kIGlzCi0JIHB1cmVseSB0aGUgb2Zmc2V0IHRvIFhfb3Bfc3ltYm9sLiAgKi8KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLQkgICYmIG9mZnNldF9leHByLlhfb3AgPT0gT19zdWJ0cmFjdAotCSAgJiYgbm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24KLQkgICYmIChzeW1ib2xfY29uc3RhbnRfcCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JICAgICAgPyBTX0dFVF9TRUdNRU5UIChvZmZzZXRfZXhwci5YX29wX3N5bWJvbCkgPT0gdGV4dF9zZWN0aW9uCi0JICAgICAgOiAoc3ltYm9sX2VxdWF0ZWRfcCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JCSAmJiAoU19HRVRfU0VHTUVOVAotCQkgICAgIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKQotCQkgICAgICAtPlhfYWRkX3N5bWJvbCkKLQkJICAgICA9PSB0ZXh0X3NlY3Rpb24pKSkKLQkgICYmIGJyZWcgPT0gMAotCSAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdHJlZywgdHJlZywgKGludCkgQkZEX1JFTE9DX1BDUkVMX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgIT0gT19zeW1ib2wKLQkgICYmIG9mZnNldF9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQl7Ci0JICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQl9Ci0KLSAgICAgIGlmICh0cmVnID09IGJyZWcpCi0JewotCSAgdGVtcHJlZyA9IEFUOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRlbXByZWcgPSB0cmVnOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotCi0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCB0ZW1wcmVnLCAmb2Zmc2V0X2V4cHIsIGRibCk7Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJGdwLDxzeW0+CShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHdlIGhhdmUgYSBjb25zdGFudCwgd2UgbmVlZCB0d28gaW5zdHJ1Y3Rpb25zIGFueWhvdywKLQkgICAgIHNvIHdlIG1heSBhcyB3ZWxsIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBmb3JtLiAgKi8KLQkgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCSAgICAgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JICAgIHAgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnJhZ19ncm93ICgyMCk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoNCwgOCwgMCwgNCwgMCwKLQkJCQkJICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgdGVtcHJlZyk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyAmJiAhIG1pcHNfYmlnX2dvdCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIHRoZXJlCi0JICAgICBpcyBubyBjb25zdGFudCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQotCSAgICAgSWYgd2UgaGF2ZSBhIHNtYWxsIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PgotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50IHRoZSBzYW1lIGluc3RydWN0aW9uCi0JICAgICBzZXF1ZW5jZSwgYnV0IHdlIG91dHB1dCBhIEJGRF9SRUxPQ19MTzE2IHJlbG9jIG9uIHRoZQotCSAgICAgYWRkaXUgaW5zdHJ1Y3Rpb24uCi0KLQkgICAgIElmIHdlIGhhdmUgYSBsYXJnZSBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4KLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudCB0aGUgc2FtZSBpbnN0cnVjdGlvbgotCSAgICAgc2VxdWVuY2UsIGJ1dCB3ZSBvdXRwdXQgYSBCRkRfUkVMT0NfTE8xNiByZWxvYyBvbiB0aGUKLQkgICAgIGFkZGl1IGluc3RydWN0aW9uLiAgKi8KLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBmcmFnX2dyb3cgKDMyKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgZGJsID8gImxkIiA6ICJsdyIsCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGludCBvZmY7Ci0KLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQlvZmYgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlJ3JlIGdvaW5nIHRvIHB1dCBpbiBhbiBhZGR1IGluc3RydWN0aW9uIHVzaW5nCi0JCSAgICAgdGVtcHJlZywgc28gd2UgbWF5IGFzIHdlbGwgaW5zZXJ0IHRoZSBub3AgcmlnaHQKLQkJICAgICBub3cuICAqLwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBvZmYgPSA0OwotCQl9Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCAtIG9mZiwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDAsIDggLSBvZmYsIC00IC0gb2ZmLCA0IC0gb2ZmLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQl7Ci0JCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkJICBwICs9IDQ7Ci0JCX0KLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgLyogRklYTUU6IElmIGJyZWcgPT0gMCwgYW5kIHRoZSBuZXh0IGluc3RydWN0aW9uIHVzZXMKLQkJICR0ZW1wcmVnLCB0aGVuIGlmIHRoaXMgdmFyaWFudCBjYXNlIGlzIHVzZWQgYW4gZXh0cmEKLQkJIG5vcCB3aWxsIGJlIGdlbmVyYXRlZC4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cHIxLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JCSAgICYmIGV4cHIxLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgICAgICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAwLCAwLAotCQkJICAgICAgIFJFTEFYX0VOQ09ERSAoMCwgMCwgLTEyLCAtNCwgMCwgMCksCi0JCQkgICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IG9mZjE7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gYWRkIGluIGEgYmFzZSByZWdpc3RlciwgYW5kIHRoZQotCQkgdGFyZ2V0IHJlZ2lzdGVyIGFuZCB0aGUgYmFzZSByZWdpc3RlciBhcmUgdGhlIHNhbWUsCi0JCSB0aGVuIHdlIGFyZSB1c2luZyBBVCBhcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gIFNpbmNlCi0JCSB3ZSB3YW50IHRvIGxvYWQgdGhlIGNvbnN0YW50IGludG8gQVQsIHdlIGFkZCBvdXIKLQkJIGN1cnJlbnQgQVQgKGZyb20gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUpIGFuZCB0aGUKLQkJIHJlZ2lzdGVyIGludG8gdGhlIHJlZ2lzdGVyIG5vdywgYW5kIHByZXRlbmQgd2Ugd2VyZQotCQkgbm90IHVzaW5nIGEgYmFzZSByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKGJyZWcgIT0gdHJlZykKLQkJb2ZmMSA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibm9wIiwgIiIpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgdHJlZywgQVQsIGJyZWcpOwotCQkgIGJyZWcgPSAwOwotCQkgIHRlbXByZWcgPSB0cmVnOwotCQkgIG9mZjEgPSAtODsKLQkJfQotCi0JICAgICAgLyogU2V0IG1pcHNfb3B0aW1pemUgYXJvdW5kIHRoZSBsdWkgaW5zdHJ1Y3Rpb24gdG8gYXZvaWQKLQkJIGluc2VydGluZyBhbiB1bm5lY2Vzc2FyeSBub3AgYWZ0ZXIgdGhlIGx3LiAgKi8KLQkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOwotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgQVQpOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0KLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCBBVCwgQVQsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBBVCk7Ci0JICAgICAgKHZvaWQpIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMCwgMCwKLQkJCSAgICAgICBSRUxBWF9FTkNPREUgKDAsIDAsIC0xNiArIG9mZjEsIC04LCAwLCAwKSwKLQkJCSAgICAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaW50IGdwZGVsOwotCi0JICAvKiBUaGlzIGlzIHRoZSBsYXJnZSBHT1QgY2FzZS4gIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbCwgYW5kIHRoZXJlIGlzIG5vIGNvbnN0YW50LCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRncAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkdGVtcHJlZykgKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPHN5bT4JKEJGRF9SRUxPQ19MTzE2KQotCi0JICAgICBJZiB3ZSBoYXZlIGEgc21hbGwgY29uc3RhbnQsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0JICAgICBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGdwCi0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCR0ZW1wcmVnKSAoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8Y29uc3RhbnQ+Ci0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8Y29uc3RhbnQ+IChCRkRfUkVMT0NfTE8xNikKLQotCSAgICAgSWYgd2UgaGF2ZSBhIGxhcmdlIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRncAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkdGVtcHJlZykgKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgICBsdWkJJGF0LDxoaWNvbnN0YW50PgotCSAgICAgICBhZGRpdQkkYXQsJGF0LDxsb2NvbnN0YW50PgotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRhdAotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBsdWkJJGF0LDxoaWNvbnN0YW50PgotCSAgICAgICBhZGRpdQkkYXQsJGF0LDxsb2NvbnN0YW50PgkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGF0Ci0JICAgICAqLwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGZyYWdfZ3JvdyAoNTIpOwotCSAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCSAgICBncGRlbCA9IDQ7Ci0JICBlbHNlCi0JICAgIGdwZGVsID0gMDsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCSAgICAgICB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwKLQkJICAgICAgIHRlbXByZWcpOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgaW50IG9mZjsKLQotCSAgICAgIGlmIChicmVnID09IDApCi0JCW9mZiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UncmUgZ29pbmcgdG8gcHV0IGluIGFuIGFkZHUgaW5zdHJ1Y3Rpb24gdXNpbmcKLQkJICAgICB0ZW1wcmVnLCBzbyB3ZSBtYXkgYXMgd2VsbCBpbnNlcnQgdGhlIG5vcCByaWdodAotCQkgICAgIG5vdy4gICovCi0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibm9wIiwgIiIpOwotCQkgIG9mZiA9IDQ7Ci0JCX0KLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgxMiArIG9mZiwgMTIgKyBncGRlbCwgZ3BkZWwsCi0JCQkJCSAgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkJICAgJiYgZXhwcjEuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJub3AiLCAiIik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCi0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDIwLCAxMiArIGdwZGVsLCBncGRlbCwgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGFkaiwgZHJlZzsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBnb2luZyB0byBhZGQgaW4gYSBiYXNlIHJlZ2lzdGVyLCBhbmQgdGhlCi0JCSB0YXJnZXQgcmVnaXN0ZXIgYW5kIHRoZSBiYXNlIHJlZ2lzdGVyIGFyZSB0aGUgc2FtZSwKLQkJIHRoZW4gd2UgYXJlIHVzaW5nIEFUIGFzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiAgU2luY2UKLQkJIHdlIHdhbnQgdG8gbG9hZCB0aGUgY29uc3RhbnQgaW50byBBVCwgd2UgYWRkIG91cgotCQkgY3VycmVudCBBVCAoZnJvbSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSkgYW5kIHRoZQotCQkgcmVnaXN0ZXIgaW50byB0aGUgcmVnaXN0ZXIgbm93LCBhbmQgcHJldGVuZCB3ZSB3ZXJlCi0JCSBub3QgdXNpbmcgYSBiYXNlIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoYnJlZyAhPSB0cmVnKQotCQl7Ci0JCSAgYWRqID0gMDsKLQkJICBkcmVnID0gdGVtcHJlZzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzc2VydCAodGVtcHJlZyA9PSBBVCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibm9wIiwgIiIpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgdHJlZywgQVQsIGJyZWcpOwotCQkgIGRyZWcgPSB0cmVnOwotCQkgIGFkaiA9IDg7Ci0JCX0KLQotCSAgICAgIC8qIFNldCBtaXBzX29wdGltaXplIGFyb3VuZCB0aGUgbHVpIGluc3RydWN0aW9uIHRvIGF2b2lkCi0JCSBpbnNlcnRpbmcgYW4gdW5uZWNlc3Nhcnkgbm9wIGFmdGVyIHRoZSBsdy4gICovCi0JICAgICAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgICAgICBtaXBzX29wdGltaXplID0gMjsKLQkgICAgICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIEFUKTsKLQkgICAgICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgZHJlZywgZHJlZywgQVQpOwotCi0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTYgKyBncGRlbCArIGFkaiwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDI0ICsgYWRqLCAxNiArIGdwZGVsICsgYWRqLCBncGRlbCwKLQkJCQkJICA4ICsgZ3BkZWwsIDAsCi0JCQkJCSAgKGJyZWcgPT0gMAotCQkJCQkgICA/IG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcwotCQkJCQkgICA6IDApKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCi0JICAgICAgdXNlZF9hdCA9IDE7Ci0JICAgIH0KLQotCSAgaWYgKGdwZGVsID4gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhpcyBpbnN0cnVjdGlvbiB1c2VzICRncCwgYnV0Ci0gICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvbiB0aGUgbWFpbiBzdHJlYW0gZG9lcyBub3QuICAqLwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGRibCA/ICJsZCIgOiAibHciLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBwICs9IDQ7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICAgICAmJiBleHByMS5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgLyogRklYTUU6IElmIGFkZF9udW1iZXIgaXMgMCwgYW5kIHRoZXJlIHdhcyBubyBiYXNlCi0gICAgICAgICAgICAgICAgIHJlZ2lzdGVyLCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGNhc2UgZW5kZWQgd2l0aCBhIGxvYWQsCi0gICAgICAgICAgICAgICAgIHNvIGlmIHRoZSBzeW1ib2wgdHVybnMgb3V0IHRvIG5vdCBiZSBleHRlcm5hbCwgYW5kCi0gICAgICAgICAgICAgICAgIHRoZSBuZXh0IGluc3RydWN0aW9uIHVzZXMgdGVtcHJlZywgYW4gdW5uZWNlc3Nhcnkgbm9wCi0gICAgICAgICAgICAgICAgIHdpbGwgYmUgaW5zZXJ0ZWQuICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYnJlZyA9PSB0cmVnKQotCQl7Ci0JCSAgLyogV2UgbXVzdCBhZGQgaW4gdGhlIGJhc2UgcmVnaXN0ZXIgbm93LCBhcyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHN5bWJvbCBjYXNlLiAgKi8KLQkJICBhc3NlcnQgKHRlbXByZWcgPT0gQVQpOwotCQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JCSAgcCArPSA0OwotCQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgdHJlZywgQVQsIGJyZWcpOwotCQkgIHAgKz0gNDsKLQkJICB0ZW1wcmVnID0gdHJlZzsKLQkJICAvKiBXZSBzZXQgYnJlZyB0byAwIGJlY2F1c2Ugd2UgaGF2ZSBhcnJhbmdlZCB0byBhZGQKLSAgICAgICAgICAgICAgICAgICAgIGl0IGluIGluIGJvdGggY2FzZXMuICAqLwotCQkgIGJyZWcgPSAwOwotCQl9Ci0KLQkgICAgICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmZXhwcjEsIEFUKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIEFUKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgLyogV2UgdXNlCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCRncCw8c3ltPgkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCB0cmVnLCB0ZW1wcmVnLCBicmVnKTsKLQotICAgICAgaWYgKCEgdXNlZF9hdCkKLQlyZXR1cm47Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0pfQToKLSAgICAgIC8qIFRoZSBqIGluc3RydWN0aW9uIG1heSBub3QgYmUgdXNlZCBpbiBQSUMgY29kZSwgc2luY2UgaXQKLQkgcmVxdWlyZXMgYW4gYWJzb2x1dGUgYWRkcmVzcy4gIFdlIGNvbnZlcnQgaXQgdG8gYSBiCi0JIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJqIiwgImEiKTsKLSAgICAgIGVsc2UKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImIiLCAicCIpOwotICAgICAgcmV0dXJuOwotCi0gICAgICAvKiBUaGUgamFsIGluc3RydWN0aW9ucyBtdXN0IGJlIGhhbmRsZWQgYXMgbWFjcm9zIGJlY2F1c2Ugd2hlbgotCSBnZW5lcmF0aW5nIFBJQyBjb2RlIHRoZXkgZXhwYW5kIHRvIG11bHRpLWluc3RydWN0aW9uCi0JIHNlcXVlbmNlcy4gIE5vcm1hbGx5IHRoZXkgYXJlIHNpbXBsZSBpbnN0cnVjdGlvbnMuICAqLwotICAgIGNhc2UgTV9KQUxfMToKLSAgICAgIGRyZWcgPSBSQTsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBNX0pBTF8yOgotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgfHwgbWlwc19waWMgPT0gRU1CRURERURfUElDKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJqYWxyIiwKLQkJICAgICAiZCxzIiwgZHJlZywgc3JlZyk7Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpZiAoc3JlZyAhPSBQSUNfQ0FMTF9SRUcpCi0JICAgIGFzX3dhcm4gKF8oIk1JUFMgUElDIGNhbGwgdG8gcmVnaXN0ZXIgb3RoZXIgdGhhbiAkMjUiKSk7Ci0gICAgICAKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJqYWxyIiwKLQkJICAgICAgICJkLHMiLCBkcmVnLCBzcmVnKTsKLQkgIGlmIChtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPCAwKQotCSAgICBhc193YXJuIChfKCJObyAuY3ByZXN0b3JlIHBzZXVkby1vcCB1c2VkIGluIFBJQyBjb2RlIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIEdQLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgbWlwc19mcmFtZV9yZWcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fSkFMX0E6Ci0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiamFsIiwgImEiKTsKLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCBhbmQgd2UgYXJlCi0JICAgICB1c2luZyBhIHNtYWxsIEdPVCwgd2Ugd2FudAotCSAgICAgICBsdwkkMjUsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0NBTEwxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGphbHIJJDI1Ci0JICAgICAgIG5vcAotCSAgICAgICBsdwkkZ3AsY3ByZXN0b3JlKCRzcCkKLQkgICAgIFRoZSBjcHJlc3RvcmUgdmFsdWUgaXMgc2V0IHVzaW5nIHRoZSAuY3ByZXN0b3JlCi0JICAgICBwc2V1ZG8tb3AuICBJZiB3ZSBhcmUgdXNpbmcgYSBiaWcgR09ULCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkMjUsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYpCi0JICAgICAgIGFkZHUJJDI1LCQyNSwkZ3AKLQkgICAgICAgbHcJJDI1LDxzeW0+KCQyNSkJCShCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBqYWxyCSQyNQotCSAgICAgICBub3AKLQkgICAgICAgbHcJJGdwLGNwcmVzdG9yZSgkc3ApCi0JICAgICBJZiB0aGUgc3ltYm9sIGlzIG5vdCBleHRlcm5hbCwgd2Ugd2FudAotCSAgICAgICBsdwkkMjUsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJDI1LCQyNSw8c3ltPgkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICBqYWxyCSQyNQotCSAgICAgICBub3AKLQkgICAgICAgbHcgJGdwLGNwcmVzdG9yZSgkc3ApICovCi0JICBmcmFnX2dyb3cgKDQwKTsKLQkgIGlmICghIG1pcHNfYmlnX2dvdCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIFBJQ19DQUxMX1JFRywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0NBTEwxNiwgR1ApOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgwLCA0LCAtOCwgMCwgMCwgMCksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGdwZGVsOwotCi0JICAgICAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCQlncGRlbCA9IDQ7Ci0JICAgICAgZWxzZQotCQlncGRlbCA9IDA7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJCSAgIFBJQ19DQUxMX1JFRywgKGludCkgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2KTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCBQSUNfQ0FMTF9SRUcsIFBJQ19DQUxMX1JFRywgR1ApOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIFBJQ19DQUxMX1JFRywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwgUElDX0NBTExfUkVHKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgIm5vcCIsICIiKTsKLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIGdwZGVsLCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoMTYsIDEyICsgZ3BkZWwsIGdwZGVsLCA4ICsgZ3BkZWwsCi0JCQkJCSAgMCwgMCksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICBpZiAoZ3BkZWwgPiAwKQotCQl7Ci0JCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkJICBwICs9IDQ7Ci0JCX0KLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBQSUNfQ0FMTF9SRUcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQkJCSAgIAotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIFBJQ19DQUxMX1JFRywgUElDX0NBTExfUkVHLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICJqYWxyIiwgInMiLCBQSUNfQ0FMTF9SRUcpOwotCSAgaWYgKG1pcHNfY3ByZXN0b3JlX29mZnNldCA8IDApCi0JICAgIGFzX3dhcm4gKF8oIk5vIC5jcHJlc3RvcmUgcHNldWRvLW9wIHVzZWQgaW4gUElDIGNvZGUiKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobWlwc19vcHRzLm5vcmVvcmRlcikKLQkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgIm5vcCIsICIiKTsKLQkgICAgICBleHByMS5YX2FkZF9udW1iZXIgPSBtaXBzX2NwcmVzdG9yZV9vZmZzZXQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAibHciIDogImxkIiksCi0JCQkgICAidCxvKGIpIiwgR1AsIChpbnQpIEJGRF9SRUxPQ19MTzE2LAotCQkJICAgbWlwc19mcmFtZV9yZWcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiYmFsIiwgInAiKTsKLQkgIC8qIFRoZSBsaW5rZXIgbWF5IGV4cGFuZCB0aGUgY2FsbCB0byBhIGxvbmdlciBzZXF1ZW5jZSB3aGljaAotCSAgICAgdXNlcyAkYXQsIHNvIHdlIG11c3QgYnJlYWsgcmF0aGVyIHRoYW4gcmV0dXJuLiAgKi8KLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX0xCX0FCOgotICAgICAgcyA9ICJsYiI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MQlVfQUI6Ci0gICAgICBzID0gImxidSI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MSF9BQjoKLSAgICAgIHMgPSAibGgiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTEhVX0FCOgotICAgICAgcyA9ICJsaHUiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdfQUI6Ci0gICAgICBzID0gImx3IjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXQzBfQUI6Ci0gICAgICBzID0gImx3YzAiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXQzFfQUI6Ci0gICAgICBzID0gImx3YzEiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXQzJfQUI6Ci0gICAgICBzID0gImx3YzIiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXQzNfQUI6Ci0gICAgICBzID0gImx3YzMiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXTF9BQjoKLSAgICAgIHMgPSAibHdsIjsKLSAgICAgIGxyID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXUl9BQjoKLSAgICAgIHMgPSAibHdyIjsKLSAgICAgIGxyID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEQzFfQUI6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHMgPSAibGRjMSI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTERDMl9BQjoKLSAgICAgIHMgPSAibGRjMiI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTERDM19BQjoKLSAgICAgIHMgPSAibGRjMyI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTERMX0FCOgotICAgICAgcyA9ICJsZGwiOwotICAgICAgbHIgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTERSX0FCOgotICAgICAgcyA9ICJsZHIiOwotICAgICAgbHIgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTExfQUI6Ci0gICAgICBzID0gImxsIjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xMRF9BQjoKLSAgICAgIHMgPSAibGxkIjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXVV9BQjoKLSAgICAgIHMgPSAibHd1IjsKLSAgICBsZDoKLSAgICAgIGlmIChicmVnID09IHRyZWcgfHwgY29wcm9jIHx8IGxyKQotCXsKLQkgIHRlbXByZWcgPSBBVDsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0ZW1wcmVnID0gdHJlZzsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGdvdG8gbGRfc3Q7Ci0gICAgY2FzZSBNX1NCX0FCOgotICAgICAgcyA9ICJzYiI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TSF9BQjoKLSAgICAgIHMgPSAic2giOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dfQUI6Ci0gICAgICBzID0gInN3IjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXQzBfQUI6Ci0gICAgICBzID0gInN3YzAiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXQzFfQUI6Ci0gICAgICBzID0gInN3YzEiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXQzJfQUI6Ci0gICAgICBzID0gInN3YzIiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXQzNfQUI6Ci0gICAgICBzID0gInN3YzMiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXTF9BQjoKLSAgICAgIHMgPSAic3dsIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXUl9BQjoKLSAgICAgIHMgPSAic3dyIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NDX0FCOgotICAgICAgcyA9ICJzYyI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TQ0RfQUI6Ci0gICAgICBzID0gInNjZCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TREMxX0FCOgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzID0gInNkYzEiOwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NEQzJfQUI6Ci0gICAgICBzID0gInNkYzIiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NEQzNfQUI6Ci0gICAgICBzID0gInNkYzMiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NETF9BQjoKLSAgICAgIHMgPSAic2RsIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NEUl9BQjoKLSAgICAgIHMgPSAic2RyIjsKLSAgICBzdDoKLSAgICAgIHRlbXByZWcgPSBBVDsKLSAgICAgIHVzZWRfYXQgPSAxOwotICAgIGxkX3N0OgotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgaWYgKG1hc2sgPT0gTV9MV0MxX0FCCi0JICB8fCBtYXNrID09IE1fU1dDMV9BQgotCSAgfHwgbWFzayA9PSBNX0xEQzFfQUIKLQkgIHx8IG1hc2sgPT0gTV9TREMxX0FCCi0JICB8fCBtYXNrID09IE1fTF9EQUIKLQkgIHx8IG1hc2sgPT0gTV9TX0RBQikKLQlmbXQgPSAiVCxvKGIpIjsKLSAgICAgIGVsc2UgaWYgKGNvcHJvYykKLQlmbXQgPSAiRSxvKGIpIjsKLSAgICAgIGVsc2UKLQlmbXQgPSAidCxvKGIpIjsKLQotICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgIT0gT19jb25zdGFudAotCSAgJiYgb2Zmc2V0X2V4cHIuWF9vcCAhPSBPX3N5bWJvbCkKLQl7Ci0JICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQl9Ci0KLSAgICAgIC8qIEEgY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBQSUMgY29kZSBjYW4gYmUgaGFuZGxlZCBqdXN0IGFzIGl0Ci0JIGlzIGluIG5vbiBQSUMgY29kZS4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDCi0JICB8fCBvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgYW5kIHRoZXJlCi0JICAgICBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIG5vIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKLQkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkdGVtcHJlZykJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgSWYgd2UgaGF2ZSBhIGNvbnN0YW50LCB3ZSBuZWVkIHR3byBpbnN0cnVjdGlvbnMgYW55aG93LAotCSAgICAgc28gd2UgYWx3YXlzIHVzZSB0aGUgbGF0dGVyIGZvcm0uCi0KLQkgICAgIElmIHdlIGhhdmUgYSBiYXNlIHJlZ2lzdGVyLCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhCi0JICAgICBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkdGVtcHJlZykJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYnJlZwotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBXaXRoIGEgY29uc3RhbnQgd2UgYWx3YXlzIHVzZSB0aGUgbGF0dGVyIGNhc2UuICAqLwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCQkgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JCXAgPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdfZ3JvdyAoMjApOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIEdQKTsKLQkJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAwLAotCQkJCVJFTEFYX0VOQ09ERSAoNCwgOCwgMCwgNCwgMCwKLQkJCQkJICAgICAgKG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcwotCQkJCQkgICAgICAgfHwgKHVzZWRfYXQKLQkJCQkJCSAgICYmIG1pcHNfb3B0cy5ub2F0KSkpLAotCQkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkJKGNoYXIgKikgTlVMTCk7Ci0JCSAgdXNlZF9hdCA9IDA7Ci0JCX0KLQkgICAgICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHRlbXByZWcpOwotCSAgICAgIGlmIChwICE9IE5VTEwpCi0JCXAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LCB0cmVnLAotCQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLQkJICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQotCQlwID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcmFnX2dyb3cgKDI4KTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRlbXByZWcsIGJyZWcsIEdQKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiwgMCwKLQkJCQlSRUxBWF9FTkNPREUgKDgsIDEyLCAwLCA4LCAwLCAwKSwKLQkJCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJCShjaGFyICopIE5VTEwpOwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCB0ZW1wcmVnKTsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQlwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgYnJlZyk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsIHRyZWcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyAmJiAhIG1pcHNfYmlnX2dvdCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkdGVtcHJlZykKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPHN5bT4JKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIGFkZCBpdCB0byAkdGVtcHJlZyBiZWZvcmUKLQkgICAgIHRoZSA8b3A+LiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgd2Ugc3RpY2sgaXQgaW4gdGhlCi0JICAgICA8b3A+IGluc3RydWN0aW9uLiAgV2UgZG9uJ3QgaGFuZGxlIGNvbnN0YW50cyBsYXJnZXIgdGhhbgotCSAgICAgMTYgYml0cywgYmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB0byBsb2FkIHRoZSB1cHBlciAxNiBiaXRzCi0JICAgICAoYWN0dWFsbHksIHdlIGNvdWxkIGhhbmRsZSB0aGVtIGZvciB0aGUgc3Vic2V0IG9mIGNhc2VzCi0JICAgICBpbiB3aGljaCB3ZSBhcmUgbm90IHVzaW5nICRhdCkuICAqLwotCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sKTsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAotCSAgICAgIHx8IGV4cHIxLlhfYWRkX251bWJlciA+PSAweDgwMDApCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgZnJhZ19ncm93ICgyMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMCwgCi0JCQlSRUxBWF9FTkNPREUgKDAsIDQsIC04LCAwLCAwLCAwKSwKLQkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkoY2hhciAqKSBOVUxMKTsKLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIGJyZWcpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwgdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCB0ZW1wcmVnKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpbnQgZ3BkZWw7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRncAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkdGVtcHJlZykgKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJHRlbXByZWcgYmVmb3JlCi0JICAgICB0aGUgPG9wPi4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIHdlIHN0aWNrIGl0IGluIHRoZQotCSAgICAgPG9wPiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhbmRsZSBjb25zdGFudHMgbGFyZ2VyIHRoYW4KLQkgICAgIDE2IGJpdHMsIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8gbG9hZCB0aGUgdXBwZXIgMTYgYml0cwotCSAgICAgKGFjdHVhbGx5LCB3ZSBjb3VsZCBoYW5kbGUgdGhlbSBmb3IgdGhlIHN1YnNldCBvZiBjYXNlcwotCSAgICAgaW4gd2hpY2ggd2UgYXJlIG5vdCB1c2luZyAkYXQpLiAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkgICAgZ3BkZWwgPSA0OwotCSAgZWxzZQotCSAgICBncGRlbCA9IDA7Ci0JICBmcmFnX2dyb3cgKDM2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCSAgICAgICB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsCi0JCSAgICAgICB0ZW1wcmVnKTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQlSRUxBWF9FTkNPREUgKDEyLCAxMiArIGdwZGVsLCBncGRlbCwgOCArIGdwZGVsLCAwLCAwKSwKLQkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOwotCSAgaWYgKGdwZGVsID4gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBwICs9IDQ7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgYnJlZyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LCB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBJZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkdGVtcHJlZykJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBpZiAoYnJlZyA9PSAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBHUCk7Ci0JICAgICAgdXNlZF9hdCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIGJyZWcsIEdQKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoISB1c2VkX2F0KQotCXJldHVybjsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fTEk6Ci0gICAgY2FzZSBNX0xJX1M6Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgdHJlZywgJmltbV9leHByLCAwKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9ETEk6Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgdHJlZywgJmltbV9leHByLCAxKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9MSV9TUzoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICJtdGMxIiwgInQsRyIsIEFULCB0cmVnKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wKLQkJICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVAotCQkJCQkgICAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sKSksCi0JCQkgICAgICIubGl0NCIpID09IDAKLQkJICAmJiBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3YzEiLCAiVCxvKGIpIiwKLQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEdQKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICBjYXNlIE1fTElfRDoKLSAgICAgIC8qIElmIHdlIGhhdmUgYSBjb25zdGFudCBpbiBJTU1fRVhQUiwgdGhlbiBpbiBtaXBzMyBtb2RlIGl0IGlzCi0gICAgICAgICB0aGUgZW50aXJlIHZhbHVlLCBhbmQgaW4gbWlwczEgbW9kZSBpdCBpcyB0aGUgaGlnaCBvcmRlciAzMgotICAgICAgICAgYml0cyBvZiB0aGUgdmFsdWUgYW5kIHRoZSBsb3cgb3JkZXIgMzIgYml0cyBhcmUgZWl0aGVyIHplcm8KLSAgICAgICAgIG9yIGluIG9mZnNldF9leHByLiAgKi8KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgfHwgaW1tX2V4cHIuWF9vcCA9PSBPX2JpZykKLQl7Ci0JICBpZiAobWlwc19vcHRzLmlzYSA+PSAzKQotCSAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgdHJlZywgJmltbV9leHByLCAxKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBocmVnLCBscmVnOwotCi0JICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCQl7Ci0JCSAgaHJlZyA9IHRyZWc7Ci0JCSAgbHJlZyA9IHRyZWcgKyAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaHJlZyA9IHRyZWcgKyAxOwotCQkgIGxyZWcgPSB0cmVnOwotCQl9Ci0KLQkgICAgICBpZiAoaHJlZyA8PSAzMSkKLQkJbG9hZF9yZWdpc3RlciAoJmljbnQsIGhyZWcsICZpbW1fZXhwciwgMCk7Ci0JICAgICAgaWYgKGxyZWcgPD0gMzEpCi0JCXsKLQkJICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2Fic2VudCkKLQkJICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwKLQkJCQkgbHJlZywgMCk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCk7Ci0JCSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBscmVnLCAmb2Zmc2V0X2V4cHIsIDApOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIFdlIGtub3cgdGhhdCBzeW0gaXMgaW4gdGhlIC5yZGF0YSBzZWN0aW9uLiAgRmlyc3Qgd2UgZ2V0IHRoZQotCSB1cHBlciAxNiBiaXRzIG9mIHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JewotCSAgLyogRklYTUU6IFRoaXMgd29uJ3Qgd29yayBmb3IgYSA2NCBiaXQgYWRkcmVzcy4gICovCi0JICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIEFUKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBGb3IgZW1iZWRkZWQgUElDIHdlIHBpY2sgdXAgdGhlIGVudGlyZSBhZGRyZXNzIG9mZiAkZ3AgaW4KLQkgICAgIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgQVQsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCQotICAgICAgLyogTm93IHdlIGxvYWQgdGhlIHJlZ2lzdGVyKHMpLiAgKi8KLSAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDMpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsZCIsICJ0LG8oYikiLAotCQkgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBlbHNlCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdyIsICJ0LG8oYikiLAotCQkgICAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIGlmICh0cmVnICE9IDMxKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IEhvdyBpbiB0aGUgd29ybGQgZG8gd2UgZGVhbCB3aXRoIHRoZSBwb3NzaWJsZQotCQkgb3ZlcmZsb3cgaGVyZT8gICovCi0JICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdyIsICJ0LG8oYikiLAotCQkJICAgdHJlZyArIDEsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRvIGF2b2lkIGNvbmZ1c2lvbiBpbiB0Y19nZW5fcmVsb2MsIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhpcwotCSBkb2VzIG5vdCBiZWNvbWUgYSB2YXJpYW50IGZyYWcuICAqLwotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0xJX0REOgotICAgICAgLyogSWYgd2UgaGF2ZSBhIGNvbnN0YW50IGluIElNTV9FWFBSLCB0aGVuIGluIG1pcHMzIG1vZGUgaXQgaXMKLSAgICAgICAgIHRoZSBlbnRpcmUgdmFsdWUsIGFuZCBpbiBtaXBzMSBtb2RlIGl0IGlzIHRoZSBoaWdoIG9yZGVyIDMyCi0gICAgICAgICBiaXRzIG9mIHRoZSB2YWx1ZSBhbmQgdGhlIGxvdyBvcmRlciAzMiBiaXRzIGFyZSBlaXRoZXIgemVybwotICAgICAgICAgb3IgaW4gb2Zmc2V0X2V4cHIuICAqLwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCB8fCBpbW1fZXhwci5YX29wID09IE9fYmlnKQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBtaXBzX29wdHMuaXNhID49IDMpOwotCSAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMykKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAiZG10YzEiLCAidCxTIiwgQVQsIHRyZWcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJtdGMxIiwgInQsRyIsIEFULCB0cmVnICsgMSk7Ci0JICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19hYnNlbnQpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICJtdGMxIiwgInQsRyIsIDAsIHRyZWcpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KTsKLQkJICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZvZmZzZXRfZXhwciwgMCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyk7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAmJiBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCk7Ci0gICAgICBzID0gc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wpKTsKLSAgICAgIGlmIChzdHJjbXAgKHMsICIubGl0OCIpID09IDApCi0JewotCSAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMikKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGRjMSIsCi0JCQkgICAiVCxvKGIpIiwgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfTElURVJBTCwgR1ApOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYnJlZyA9IEdQOwotCSAgciA9IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw7Ci0JICBnb3RvIGRvYjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNzZXJ0IChzdHJjbXAgKHMsIFJEQVRBX1NFQ1RJT05fTkFNRSkgPT0gMCk7Ci0JICBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgID8gImx3IiA6ICJsZCIpLAotCQkJICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsgZm9yIGEgNjQgYml0IGFkZHJlc3MuICAqLwotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgQVQpOwotCSAgICB9Ci0JICAgICAgCi0JICBpZiAobWlwc19vcHRzLmlzYSA+PSAyKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsZGMxIiwKLQkJCSAgICJULG8oYikiLCB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCi0JICAgICAgLyogVG8gYXZvaWQgY29uZnVzaW9uIGluIHRjX2dlbl9yZWxvYywgd2UgbXVzdCBlbnN1cmUKLQkJIHRoYXQgdGhpcyBkb2VzIG5vdCBiZWNvbWUgYSB2YXJpYW50IGZyYWcuICAqLwotCSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotCSAgICAgIGZyYWdfbmV3ICgwKTsKLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVnID0gQVQ7Ci0JICByID0gQkZEX1JFTE9DX0xPMTY7Ci0JICBnb3RvIGRvYjsKLQl9Ci0KLSAgICBjYXNlIE1fTF9ET0I6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIC8qIEV2ZW4gb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgJGZuIGNvbWVzIGJlZm9yZSAkZm4rMS4gIFdlIGhhdmUKLQkgdG8gYWRqdXN0IHdoZW4gbG9hZGluZyBmcm9tIG1lbW9yeS4gICovCi0gICAgICByID0gQkZEX1JFTE9DX0xPMTY7Ci0gICAgZG9iOgotICAgICAgYXNzZXJ0IChtaXBzX29wdHMuaXNhIDwgMik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgIChpbnQpIHIsIGJyZWcpOwotICAgICAgLyogRklYTUU6IEEgcG9zc2libGUgb3ZlcmZsb3cgd2hpY2ggSSBkb24ndCBrbm93IGhvdyB0byBkZWFsCi0JIHdpdGguICAqLwotICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgIChpbnQpIHIsIGJyZWcpOwotCi0gICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoaXMKLQkgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotCi0gICAgICBpZiAoYnJlZyAhPSBBVCkKLQlyZXR1cm47Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MX0RBQjoKLSAgICAgIC8qCi0gICAgICAgKiBUaGUgTUlQUyBhc3NlbWJsZXIgc2VlbXMgdG8gY2hlY2sgZm9yIFhfYWRkX251bWJlciBub3QKLSAgICAgICAqIGJlaW5nIGRvdWJsZSBhbGlnbmVkIGFuZCBnZW5lcmF0aW5nOgotICAgICAgICoJbHVpCWF0LCVoaShmb28rMSkKLSAgICAgICAqCWFkZHUJYXQsYXQsdjEKLSAgICAgICAqCWFkZGl1CWF0LGF0LCVsbyhmb28rMSkKLSAgICAgICAqCWx3YzEJZjIsMChhdCkKLSAgICAgICAqCWx3YzEJZjMsNChhdCkKLSAgICAgICAqIEJ1dCwgdGhlIHJlc3VsdGluZyBhZGRyZXNzIGlzIHRoZSBzYW1lIGFmdGVyIHJlbG9jYXRpb24gc28gd2h5Ci0gICAgICAgKiBnZW5lcmF0ZSB0aGUgZXh0cmEgaW5zdHJ1Y3Rpb24/Ci0gICAgICAgKi8KLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDIpCi0JewotCSAgcyA9ICJsZGMxIjsKLQkgIGdvdG8gbGQ7Ci0JfQotCi0gICAgICBzID0gImx3YzEiOwotICAgICAgZm10ID0gIlQsbyhiKSI7Ci0gICAgICBnb3RvIGxkZF9zdGQ7Ci0KLSAgICBjYXNlIE1fU19EQUI6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMikKLQl7Ci0JICBzID0gInNkYzEiOwotCSAgZ290byBzdDsKLQl9Ci0KLSAgICAgIHMgPSAic3djMSI7Ci0gICAgICBmbXQgPSAiVCxvKGIpIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkZF9zdGQ7Ci0KLSAgICBjYXNlIE1fTERfQUI6Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzKQotCXsKLQkgIHMgPSAibGQiOwotCSAgZ290byBsZDsKLQl9Ci0KLSAgICAgIHMgPSAibHciOwotICAgICAgZm10ID0gInQsbyhiKSI7Ci0gICAgICBnb3RvIGxkZF9zdGQ7Ci0KLSAgICBjYXNlIE1fU0RfQUI6Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzKQotCXsKLQkgIHMgPSAic2QiOwotCSAgZ290byBzdDsKLQl9Ci0KLSAgICAgIHMgPSAic3ciOwotICAgICAgZm10ID0gInQsbyhiKSI7Ci0KLSAgICBsZGRfc3RkOgotICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgIT0gT19zeW1ib2wKLQkgICYmIG9mZnNldF9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQl7Ci0JICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQl9Ci0KLSAgICAgIC8qIEV2ZW4gb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgJGZuIGNvbWVzIGJlZm9yZSAkZm4rMS4gIFdlIGhhdmUKLQkgdG8gYWRqdXN0IHdoZW4gbG9hZGluZyBmcm9tIG1lbW9yeS4gIFdlIHNldCBjb3Byb2MgaWYgd2UgbXVzdAotCSBsb2FkICRmbisxIGZpcnN0LiAgKi8KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWNvcHJvYyA9IDA7Ci0KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgIHx8IG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgSWYgd2UgaGF2ZSBhIGJhc2UgcmVnaXN0ZXIsIHdlIHVzZSB0aGlzCi0JICAgICAgIGFkZHUJJGF0LCRicmVnLCRncAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIElmIHRoaXMgaXMgbm90IGEgR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkYXQsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3Rlciwgd2UgYWRkIGl0IHRvICRhdCBhZnRlciB0aGUKLQkgICAgIGx1aSBpbnN0cnVjdGlvbi4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIHdlIGFsd2F5cyB1c2UKLQkgICAgIHRoZSBsYXN0IGNhc2UuICAqLwotCSAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0JICAgICAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKLQkgICAgewotCSAgICAgIHAgPSBOVUxMOwotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgb2ZmOwotCi0JICAgICAgaWYgKGJyZWcgPT0gMCkKLQkJewotCQkgIGZyYWdfZ3JvdyAoMjgpOwotCQkgIHRlbXByZWcgPSBHUDsKLQkJICBvZmYgPSAwOwotCQkgIHVzZWRfYXQgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnJhZ19ncm93ICgzNik7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCBBVCwgYnJlZywgR1ApOwotCQkgIHRlbXByZWcgPSBBVDsKLQkJICBvZmYgPSA0OwotCQkgIHVzZWRfYXQgPSAxOwotCQl9Ci0KLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgICAgICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbgotICAgICAgICAgICAgICAgICB1bmRlc2lyZWQgbm9wLiAgKi8KLQkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgICAgICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBvZmYsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICg4ICsgb2ZmLCAxMiArIG9mZiwgMCwgNCArIG9mZiwgMSwKLQkJCQkJICB1c2VkX2F0ICYmIG1pcHNfb3B0cy5ub2F0KSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCi0JICAgICAgLyogV2UganVzdCBnZW5lcmF0ZWQgdHdvIHJlbG9jcy4gIFdoZW4gdGNfZ2VuX3JlbG9jCi0JCSBoYW5kbGVzIHRoaXMgY2FzZSwgaXQgd2lsbCBza2lwIHRoZSBmaXJzdCByZWxvYyBhbmQKLQkJIGhhbmRsZSB0aGUgc2Vjb25kLiAgVGhlIHNlY29uZCByZWxvYyBhbHJlYWR5IGhhcyBhbgotCQkgZXh0cmEgYWRkZW5kIG9mIDQsIHdoaWNoIHdlIGFkZGVkIGFib3ZlLiAgV2UgbXVzdAotCQkgc3VidHJhY3QgaXQgb3V0LCBhbmQgdGhlbiBzdWJ0cmFjdCBhbm90aGVyIDQgdG8gbWFrZQotCQkgdGhlIGZpcnN0IHJlbG9jIGNvbWUgb3V0IHJpZ2h0LiAgVGhlIHNlY29uZCByZWxvYwotCQkgd2lsbCBjb21lIG91dCByaWdodCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBhZGQgNCB0bwotCQkgb2Zmc2V0X2V4cHIgd2hlbiB3ZSBidWlsZCBpdHMgaW5zdHJ1Y3Rpb24gYmVsb3cuCi0KLQkJIElmIHdlIGhhdmUgYSBzeW1ib2wsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlCi0JCSB0aGUgb2Zmc2V0LCBiZWNhdXNlIGl0IHdpbGwgd2luZCB1cCBiZWluZyBpbmNsdWRlZAotCQkgd2hlbiB3ZSBnZW5lcmF0ZSB0aGUgcmVsb2MuICAqLwotCi0JICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDg7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gLTQ7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCX0KLQkgICAgfQotCSAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQlwICs9IDQ7Ci0JICAgIH0KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIGlmIChwICE9IE5VTEwpCi0JICAgIHAgKz0gNDsKLQkgIC8qIEZJWE1FOiBIb3cgZG8gd2UgaGFuZGxlIG92ZXJmbG93IGhlcmU/ICAqLwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JfQkgIAotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0JewotCSAgaW50IG9mZjsKLQotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJGF0LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkYXQpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw0KCRhdCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx3CSRhdCw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3RlciB3ZSBhZGQgaXQgdG8gJGF0IGJlZm9yZSB0aGUKLQkgICAgIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCB3ZSBpbmNsdWRlIGl0Ci0JICAgICBpbiB0aGUgbHdjMSBpbnN0cnVjdGlvbnMuICAqLwotCSAgdXNlZF9hdCA9IDE7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gNCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBpZiAoYnJlZyA9PSAwKQotCSAgICBvZmYgPSAwOwotCSAgZWxzZQotCSAgICBvZmYgPSA0OwotCSAgZnJhZ19ncm93ICgyNCArIG9mZik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZGVzaXJlZAotICAgICAgICAgICAgIG5vcC4gICovCi0JICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAwLCAwLAotCQkJICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTYgLSBvZmYsIC04LCAxLCAwKSwKLQkJCSAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAoY2hhciAqKSBOVUxMKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpbnQgZ3BkZWwsIG9mZjsKLQotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHVpCSRhdCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSRhdCwkYXQsJGdwCi0JICAgICAgIGx3CSRhdCw8c3ltPigkYXQpCQkoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJGF0KQotCSAgICAgICA8b3A+CSR0cmVnKzEsNCgkYXQpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIgd2UgYWRkIGl0IHRvICRhdCBiZWZvcmUgdGhlCi0JICAgICBsd2MxIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQgd2UgaW5jbHVkZSBpdAotCSAgICAgaW4gdGhlIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIHVzZWRfYXQgPSAxOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIDQpCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCSAgICBncGRlbCA9IDQ7Ci0JICBlbHNlCi0JICAgIGdwZGVsID0gMDsKLQkgIGlmIChicmVnID09IDApCi0JICAgIG9mZiA9IDA7Ci0JICBlbHNlCi0JICAgIG9mZiA9IDQ7Ci0JICBmcmFnX2dyb3cgKDU2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCSAgICAgICBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgICAiZCx2LHQiLCBBVCwgQVQsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LCBBVCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgKz0gNDsKLQotCSAgLyogU2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0byBhdm9pZCBpbnNlcnRpbmcgYW4gdW5kZXNpcmVkCi0gICAgICAgICAgICAgbm9wLiAgKi8KLQkgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICBtaXBzX29wdGltaXplID0gMjsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgLT0gNDsKLQotCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTYgKyBncGRlbCArIG9mZiwgMCwKLQkJCVJFTEFYX0VOQ09ERSAoMjQgKyBvZmYsIDE2ICsgZ3BkZWwgKyBvZmYsIGdwZGVsLAotCQkJCSAgICAgIDggKyBncGRlbCArIG9mZiwgMSwgMCksCi0JCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJKGNoYXIgKikgTlVMTCk7Ci0JICBpZiAoZ3BkZWwgPiAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBwICs9IDQ7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgcCArPSA0OwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBwICs9IDQ7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgKz0gNDsKLQotCSAgLyogU2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0byBhdm9pZCBpbnNlcnRpbmcgYW4gdW5kZXNpcmVkCi0gICAgICAgICAgICAgbm9wLiAgKi8KLQkgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICBtaXBzX29wdGltaXplID0gMjsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIC8qIElmIHRoZXJlIGlzIG5vIGJhc2UgcmVnaXN0ZXIsIHdlIHVzZQotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIElmIHdlIGhhdmUgYSBiYXNlIHJlZ2lzdGVyLCB3ZSB1c2UKLQkgICAgICAgYWRkdQkkYXQsJGJyZWcsJGdwCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgKi8KLQkgIGlmIChicmVnID09IDApCi0JICAgIHsKLQkgICAgICB0ZW1wcmVnID0gR1A7Ci0JICAgICAgdXNlZF9hdCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIEFULCBicmVnLCBHUCk7Ci0JICAgICAgdGVtcHJlZyA9IEFUOwotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmICghIHVzZWRfYXQpCi0JcmV0dXJuOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MRF9PQjoKLSAgICAgIHMgPSAibHciOwotICAgICAgZ290byBzZF9vYjsKLSAgICBjYXNlIE1fU0RfT0I6Ci0gICAgICBzID0gInN3IjsKLSAgICBzZF9vYjoKLSAgICAgIGFzc2VydCAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMiB8fCBtaXBzX29wdHMuaXNhIDwgMyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnICsgMSwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAvKiBOZXcgY29kZSBhZGRlZCB0byBzdXBwb3J0IENPUFogaW5zdHJ1Y3Rpb25zLgotICAgICAgVGhpcyBjb2RlIGJ1aWxkcyB0YWJsZSBlbnRyaWVzIG91dCBvZiB0aGUgbWFjcm9zIGluIG1pcF9vcGNvZGVzLgotICAgICAgUjQwMDAgdXNlcyBpbnRlcmxvY2tzIHRvIGhhbmRsZSBjb3Byb2MgZGVsYXlzLgotICAgICAgT3RoZXIgY2hpcHMgKGxpa2UgdGhlIFIzMDAwKSByZXF1aXJlIG5vcHMgdG8gYmUgaW5zZXJ0ZWQgZm9yIGRlbGF5cy4KLQotICAgICAgRklYTUU6IEN1cnJlbnRseSwgd2UgcmVxdWlyZSB0aGF0IHRoZSB1c2VyIGhhbmRsZSBkZWxheXMuCi0gICAgICBJbiBvcmRlciB0byBmaWxsIGRlbGF5IHNsb3RzIGZvciBub24taW50ZXJsb2NrZWQgY2hpcHMsCi0gICAgICB3ZSBtdXN0IGhhdmUgYSB3YXkgdG8gc3BlY2lmeSBkZWxheXMgYmFzZWQgb24gdGhlIGNvcHJvY2Vzc29yLgotICAgICAgRWcuIDQgY3ljbGVzIGlmIGxvYWQgY29wcm9jIHJlZyBmcm9tIG1lbW9yeSwgMSBpZiBpbiBjYWNoZSwgZXRjLgotICAgICAgV2hhdCBhcmUgdGhlIHNpZGUtZWZmZWN0cyBvZiB0aGUgY29wIGluc3RydWN0aW9uPwotICAgICAgV2hhdCBjYWNoZSBzdXBwb3J0IG1pZ2h0IHdlIGhhdmUgYW5kIHdoYXQgYXJlIGl0cyBlZmZlY3RzPwotICAgICAgQm90aCBjb3Byb2Nlc3NvciAmIG1lbW9yeSByZXF1aXJlIGRlbGF5cy4gaG93IGxvbmc/Pz8KLSAgICAgIFdoYXQgcmVnaXN0ZXJzIGFyZSByZWFkL3NldC9tb2RpZmllZD8gCi0KLSAgICAgIElmIGFuIGl0YmwgaXMgcHJvdmlkZWQgdG8gaW50ZXJwcmV0IGNvcCBpbnN0cnVjdGlvbnMsCi0gICAgICB0aGlzIGtub3dsZWRnZSBjYW4gYmUgZW5jb2RlZCBpbiB0aGUgaXRibCBzcGVjLiAqLwotCi0gICAgY2FzZSBNX0NPUDA6Ci0gICAgICBzID0gImMwIjsKLSAgICAgIGdvdG8gY29wejsKLSAgICBjYXNlIE1fQ09QMToKLSAgICAgIHMgPSAiYzEiOwotICAgICAgZ290byBjb3B6OwotICAgIGNhc2UgTV9DT1AyOgotICAgICAgcyA9ICJjMiI7Ci0gICAgICBnb3RvIGNvcHo7Ci0gICAgY2FzZSBNX0NPUDM6Ci0gICAgICBzID0gImMzIjsKLSAgICBjb3B6OgotICAgICAgLyogRm9yIG5vdyB3ZSBqdXN0IGRvIEMgKHNhbWUgYXMgQ3opLiAgVGhlIHBhcmFtZXRlciB3aWxsIGJlCi0gICAgICAgICBzdG9yZWQgaW4gaW5zbl9vcGNvZGUgYnkgbWlwc19pcC4gICovCi0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCBzLCAiQyIsCi0JCSAgIGlwLT5pbnNuX29wY29kZSk7Ci0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBMT1NJTkdfQ09NUElMRVIKLSAgICBkZWZhdWx0OgotICAgICAgLyogVHJ5IGFuZCBzZWUgaWYgdGhpcyBpcyBhIG5ldyBpdGJsIGluc3RydWN0aW9uLgotICAgICAgICAgVGhpcyBjb2RlIGJ1aWxkcyB0YWJsZSBlbnRyaWVzIG91dCBvZiB0aGUgbWFjcm9zIGluIG1pcF9vcGNvZGVzLgotICAgICAgICAgRklYTUU6IEZvciBub3cgd2UganVzdCBhc3NlbWJsZSB0aGUgZXhwcmVzc2lvbiBhbmQgcGFzcyBpdCdzCi0gICAgICAgICB2YWx1ZSBhbG9uZyBhcyBhIDMyLWJpdCBpbW1lZGlhdGUuCi0gICAgICAgICBXZSBtYXkgd2FudCB0byBoYXZlIHRoZSBhc3NlbWJsZXIgYXNzZW1ibGUgdGhpcyB2YWx1ZSwgCi0gICAgICAgICBzbyB0aGF0IHdlIGdhaW4gdGhlIGFzc2VtYmxlcidzIGtub3dsZWRnZSBvZiBkZWxheSBzbG90cywKLSAgICAgICAgIHN5bWJvbHMsIGV0Yy4KLSAgICAgICAgIFdvdWxkIGl0IGJlIG1vcmUgZWZmaWNpZW50IHRvIHVzZSBtYXNrIChpZCkgaGVyZT8gKi8KLSAgICAgIGlmIChpdGJsX2hhdmVfZW50cmllcyAKLQkgICYmIChpbW1lZF9leHByID0gaXRibF9hc3NlbWJsZSAoaXAtPmluc25fbW8tPm5hbWUsICIiKSkpCi0gICAgICAgIHsKLQkgIHMgPSBpcC0+aW5zbl9tby0+bmFtZTsKLQkgIHMyID0gImNvcDMiOwotCSAgY29wcm9jID0gSVRCTF9ERUNPREVfUE5VTSAoaW1tZWRfZXhwcik7OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tZWRfZXhwciwgcywgIkMiKTsKLQkgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgbWFjcm8yIChpcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAobWlwc19vcHRzLm5vYXQpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gdXNlZCAkYXQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiIpKTsKLX0KLSAgICAgICAgICAKLXN0YXRpYyB2b2lkCi1tYWNybzIgKGlwKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRyZWcsIHNyZWcsIGRyZWcsIGJyZWc7Ci0gIGludCB0ZW1wcmVnOwotICBpbnQgbWFzazsKLSAgaW50IGljbnQgPSAwOwotICBpbnQgdXNlZF9hdDsKLSAgZXhwcmVzc2lvblMgZXhwcjE7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKnMyOwotICBjb25zdCBjaGFyICpmbXQ7Ci0gIGludCBsaWtlbHkgPSAwOwotICBpbnQgZGJsID0gMDsKLSAgaW50IGNvcHJvYyA9IDA7Ci0gIGludCBsciA9IDA7Ci0gIGludCBpbW0gPSAwOwotICBpbnQgb2ZmOwotICBvZmZzZXRUIG1heG51bTsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0gIGNoYXIgKnA7Ci0gICAgICAgICAgCi0gIHRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDE2KSAmIDB4MWY7Ci0gIGRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDExKSAmIDB4MWY7Ci0gIHNyZWcgPSBicmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAyMSkgJiAweDFmOwotICBtYXNrID0gaXAtPmluc25fbW8tPm1hc2s7Ci0gICAgICAgICAgCi0gIGV4cHIxLlhfb3AgPSBPX2NvbnN0YW50OwotICBleHByMS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0gICAgICAgICAgCi0gIHN3aXRjaCAobWFzaykKLSAgICB7Ci0jZW5kaWYgLyogTE9TSU5HX0NPTVBJTEVSICovCi0KLSAgICBjYXNlIE1fRE1VTDoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX01VTDoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0dSIgOiAibXVsdHUiLAotCQkgICAicyx0Iiwgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9ETVVMX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxfSToKLSAgICAgIC8qIFRoZSBNSVBTIGFzc2VtYmxlciBzb21lIHRpbWVzIGdlbmVyYXRlcyBzaGlmdHMgYW5kIGFkZHMuICBJJ20KLQkgbm90IHRyeWluZyB0byBiZSB0aGF0IGZhbmN5LiBHQ0Mgc2hvdWxkIGRvIHRoaXMgZm9yIHVzCi0JIGFueXdheS4gICovCi0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0IiA6ICJtdWx0IiwKLQkJICAgInMsdCIsIHNyZWcsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE1VTE9fSToKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX01VTE9fSToKLSAgICAgIGltbSA9IDE7Ci0gICAgICBnb3RvIGRvX211bG87Ci0KLSAgICBjYXNlIE1fRE1VTE86Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPOgotICAgIGRvX211bG86Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAoaW1tKQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZG11bHQiIDogIm11bHQiLAotCQkgICAicyx0Iiwgc3JlZywgaW1tID8gQVQgOiB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZHNyYTMyIiA6ICJzcmEiLAotCQkgICAiZCx3LDwiLCBkcmVnLCBkcmVnLCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmhpIiwgImQiLCBBVCk7Ci0gICAgICBpZiAobWlwc190cmFwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRuZSIsICJzLHQiLCBkcmVnLCBBVCk7Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYmVxIiwgInMsdCxwIiwgZHJlZywgQVQpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNik7Ci0JfQotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ETVVMT1VfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX01VTE9VX0k6Ci0gICAgICBpbW0gPSAxOwotICAgICAgZ290byBkb19tdWxvdTsKLQotICAgIGNhc2UgTV9ETVVMT1U6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPVToKLSAgICBkb19tdWxvdToKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIGlmIChpbW0pCi0JbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgInMsdCIsIHNyZWcsIGltbSA/IEFUIDogdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmhpIiwgImQiLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIGlmIChtaXBzX3RyYXApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidG5lIiwgInMsdCIsIEFULCAwKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJiZXEiLCAicyx0LHAiLCBBVCwgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7Ci0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA2KTsKLQl9Ci0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST0w6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzdWJ1IiwgImQsdix0IiwgQVQsIDAsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3JsdiIsICJkLHQscyIsIEFULCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGx2IiwgImQsdCxzIiwgZHJlZywgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JPTF9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oInJvdGF0ZSBjb3VudCB0b28gbGFyZ2UiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCBBVCwgc3JlZywKLQkJICAgKGludCkgKGltbV9leHByLlhfYWRkX251bWJlciAmIDB4MWYpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIGRyZWcsIHNyZWcsCi0JCSAgIChpbnQpICgoMCAtIGltbV9leHByLlhfYWRkX251bWJlcikgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JPUjoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInN1YnUiLCAiZCx2LHQiLCBBVCwgMCwgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGx2IiwgImQsdCxzIiwgQVQsIHNyZWcsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybHYiLCAiZCx0LHMiLCBkcmVnLCBzcmVnLAotCQkgICB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgZHJlZywgZHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fUk9SX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygicm90YXRlIGNvdW50IHRvbyBsYXJnZSIpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIEFULCBzcmVnLAotCQkgICAoaW50KSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyICYgMHgxZikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgZHJlZywgc3JlZywKLQkJICAgKGludCkgKCgwIC0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyKSAmIDB4MWYpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgZHJlZywgZHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU19ET0I6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGFzc2VydCAobWlwc19vcHRzLmlzYSA8IDIpOwotICAgICAgLyogRXZlbiBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSAkZm4gY29tZXMgYmVmb3JlICRmbisxLiAgV2UgaGF2ZQotCSB0byBhZGp1c3Qgd2hlbiBzdG9yaW5nIHRvIG1lbW9yeS4gICovCi0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInN3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJzd2MxIiwgIlQsbyhiKSIsCi0JCSAgIHRhcmdldF9iaWdfZW5kaWFuID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0VROgotICAgICAgaWYgKHNyZWcgPT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKLQkJICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBlbHNlIGlmICh0cmVnID09IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsCi0JCSAgICAgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgZWxzZQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCB0cmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgICAgZHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCX0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TRVFfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJJbnN0cnVjdGlvbiAlczogcmVzdWx0IGlzIGFsd2F5cyBmYWxzZSIpLAotCQkgICBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDEwMDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gLTB4ODAwMAotCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwKQotCXsKLQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKLQkJICAgICAgIHNyZWcsIEFUKTsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBpZiAodXNlZF9hdCkKLQlicmVhazsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TR0U6CQkvKiBzcmVnID49IHRyZWcgPD09PiBub3QgKHNyZWcgPCB0cmVnKSAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzZ2U7Ci0gICAgY2FzZSBNX1NHRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNnZToKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dFX0k6CQkvKiBzcmVnID49IEkgPD09PiBub3QgKHNyZWcgPCBJKSAqLwotICAgIGNhc2UgTV9TR0VVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgbWFzayA9PSBNX1NHRV9JID8gInNsdGkiIDogInNsdGl1IiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgICAgICBtYXNrID09IE1fU0dFX0kgPyAic2x0IiA6ICJzbHR1IiwKLQkJICAgICAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmICh1c2VkX2F0KQotCWJyZWFrOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NHVDoJCS8qIHNyZWcgPiB0cmVnICA8PT0+ICB0cmVnIDwgc3JlZyAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzZ3Q7Ci0gICAgY2FzZSBNX1NHVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNndDoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgdHJlZywgc3JlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dUX0k6CQkvKiBzcmVnID4gSSAgPD09PiAgSSA8IHNyZWcgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2d0aTsKLSAgICBjYXNlIE1fU0dUVV9JOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzZ3RpOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCBBVCwgc3JlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTEU6CQkvKiBzcmVnIDw9IHRyZWcgIDw9PT4gIHRyZWcgPj0gc3JlZyAgPD09PiAgbm90ICh0cmVnIDwgc3JlZykgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2xlOwotICAgIGNhc2UgTV9TTEVVOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzbGU6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NMRV9JOgkJLyogc3JlZyA8PSBJIDw9PT4gSSA+PSBzcmVnIDw9PT4gbm90IChJIDwgc3JlZykgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2xlaTsKLSAgICBjYXNlIE1fU0xFVV9JOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzbGVpOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCBBVCwgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTFRfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJzbHRpIiwgInQscixqIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTFRVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAic2x0aXUiLCAidCxyLGoiLAotCQkgICAgICAgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCBzcmVnLAotCQkgICBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTkU6Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgIHRyZWcpOwotICAgICAgZWxzZSBpZiAodHJlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgIHNyZWcpOwotICAgICAgZWxzZQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCB0cmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgICAgZHJlZyk7Ci0JfQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NORV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICAgIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgdHJ1ZSIpLAotCQkgICBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIDAsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInhvcmkiLCAidCxyLGkiLAotCQkgICAgICAgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMCkKLQl7Ci0JICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKLQkJICAgICAgIHNyZWcsIEFUKTsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLCBkcmVnKTsKLSAgICAgIGlmICh1c2VkX2F0KQotCWJyZWFrOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX0RTVUJfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX1NVQl9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw9IDB4ODAwMCkKLQl7Ci0JICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICBkYmwgPyAiZGFkZGkiIDogImFkZGkiLAotCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZHN1YiIgOiAic3ViIiwKLQkJICAgImQsdix0IiwgZHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRFNVQlVfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX1NVQlVfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8PSAweDgwMDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgZGJsID8gImRhZGRpdSIgOiAiYWRkaXUiLAotCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZHN1YnUiIDogInN1YnUiLAotCQkgICAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9URVFfSToKLSAgICAgIHMgPSAidGVxIjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVEdFX0k6Ci0gICAgICBzID0gInRnZSI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RHRVVfSToKLSAgICAgIHMgPSAidGdldSI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RMVF9JOgotICAgICAgcyA9ICJ0bHQiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UTFRVX0k6Ci0gICAgICBzID0gInRsdHUiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UTkVfSToKLSAgICAgIHMgPSAidG5lIjsKLSAgICB0cmFwOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAicyx0Iiwgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVFJVTkNXRDoKLSAgICBjYXNlIE1fVFJVTkNXUzoKLSAgICAgIGFzc2VydCAobWlwc19vcHRzLmlzYSA8IDIpOwotICAgICAgc3JlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTEpICYgMHgxZjsJLyogZmxvYXRpbmcgcmVnICovCi0gICAgICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAwNikgJiAweDFmOwkvKiBmbG9hdGluZyByZWcgKi8KLQotICAgICAgLyoKLSAgICAgICAqIElzIHRoZSBkb3VibGUgY2ZjMSBpbnN0cnVjdGlvbiBhIGJ1ZyBpbiB0aGUgbWlwcyBhc3NlbWJsZXI7Ci0gICAgICAgKiBvciBpcyB0aGVyZSBhIHJlYXNvbiBmb3IgaXQ/Ci0gICAgICAgKi8KLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImNmYzEiLCAidCxHIiwgdHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY2ZjMSIsICJ0LEciLCB0cmVnLCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAzOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJvcmkiLCAidCxyLGkiLCBBVCwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIEFULCBBVCwKLQkJICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjdGMxIiwgInQsRyIsIEFULCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JICAgICAgbWFzayA9PSBNX1RSVU5DV0QgPyAiY3Z0LncuZCIgOiAiY3Z0LncucyIsICJELFMiLCBkcmVnLCBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImN0YzEiLCAidCxHIiwgdHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVUxIOgotICAgICAgcyA9ICJsYiI7Ci0gICAgICBnb3RvIHVsaDsKLSAgICBjYXNlIE1fVUxIVToKLSAgICAgIHMgPSAibGJ1IjsKLSAgICB1bGg6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4N2ZmZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICAvKiBhdm9pZCBsb2FkIGRlbGF5ICovCi0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDE7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxidSIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgdHJlZywgdHJlZywgOCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIHRyZWcsIHRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VMRDoKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIHMyID0gImxkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1bHc7Ci0gICAgY2FzZSBNX1VMVzoKLSAgICAgIHMgPSAibHdsIjsKLSAgICAgIHMyID0gImx3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVsdzoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gb2ZmKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSBvZmY7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9VTERfQToKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIHMyID0gImxkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1bHdhOwotICAgIGNhc2UgTV9VTFdfQToKLSAgICAgIHMgPSAibHdsIjsKLSAgICAgIHMyID0gImx3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVsd2E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICJkLHYsdCIsIEFULCBBVCwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSBvZmY7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMyLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VMSF9BOgotICAgIGNhc2UgTV9VTEhVX0E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICJkLHYsdCIsIEFULCBBVCwgYnJlZyk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkgICBtYXNrID09IE1fVUxIX0EgPyAibGIiIDogImxidSIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAibGJ1IiwgInQsbyhiKSIsIEFULAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgdHJlZywKLQkJICAgdHJlZywgOCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIHRyZWcsCi0JCSAgIHRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VTSDoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg3ZmZmKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic2IiLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3JsIiwgImQsdyw8IiwgQVQsIHRyZWcsIDgpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSAxOwotICAgICAgZWxzZQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJzYiIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVVNEOgotICAgICAgcyA9ICJzZGwiOwotICAgICAgczIgPSAic2RyIjsKLSAgICAgIG9mZiA9IDc7Ci0gICAgICBnb3RvIHVzdzsKLSAgICBjYXNlIE1fVVNXOgotICAgICAgcyA9ICJzd2wiOwotICAgICAgczIgPSAic3dyIjsKLSAgICAgIG9mZiA9IDM7Ci0gICAgdXN3OgotICAgICAgaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDgwMDAgLSBvZmYpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG92ZXJmbG93IikpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IG9mZjsKLSAgICAgIGVsc2UKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMyLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1VTRF9BOgotICAgICAgcyA9ICJzZGwiOwotICAgICAgczIgPSAic2RyIjsKLSAgICAgIG9mZiA9IDc7Ci0gICAgICBnb3RvIHVzd2E7Ci0gICAgY2FzZSBNX1VTV19BOgotICAgICAgcyA9ICJzd2wiOwotICAgICAgczIgPSAic3dyIjsKLSAgICAgIG9mZiA9IDM7Ci0gICAgdXN3YToKLSAgICAgIGxvYWRfYWRkcmVzcyAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIpOwotICAgICAgaWYgKGJyZWcgIT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgQVQsIEFULCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgczIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVVNIX0E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICJkLHYsdCIsIEFULCBBVCwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzYiIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3JsIiwgImQsdyw8IiwgdHJlZywKLQkJICAgdHJlZywgOCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNiIiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImxidSIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCB0cmVnLAotCQkgICB0cmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBGSVhNRTogQ2hlY2sgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIGl0YmwgbWFjcm9zLCBzaW5jZSB0aGV5Ci0JIGFyZSBhZGRlZCBkeW5hbWljYWxseS4gKi8KLSAgICAgIGFzX2JhZCAoXygiTWFjcm8gJXMgbm90IGltcGxlbWVudGVkIHlldCIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGlmIChtaXBzX29wdHMubm9hdCkKLSAgICBhc193YXJuIChfKCJNYWNybyB1c2VkICRhdCBhZnRlciBcIi5zZXQgbm9hdFwiIikpOwotfQotCi0vKiBJbXBsZW1lbnQgbWFjcm9zIGluIG1pcHMxNiBtb2RlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9tYWNybyAoaXApCi0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotewotICBpbnQgbWFzazsKLSAgaW50IHhyZWcsIHlyZWcsIHpyZWcsIHRtcDsKLSAgaW50IGljbnQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBpbnQgZGJsOwotICBjb25zdCBjaGFyICpzLCAqczIsICpzMzsKLQotICBtYXNrID0gaXAtPmluc25fbW8tPm1hc2s7Ci0KLSAgeHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKLSAgeXJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlkpICYgTUlQUzE2T1BfTUFTS19SWTsKLSAgenJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKLQotICBpY250ID0gMDsKLQotICBleHByMS5YX29wID0gT19jb25zdGFudDsKLSAgZXhwcjEuWF9vcF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotCi0gIGRibCA9IDA7Ci0KLSAgc3dpdGNoIChtYXNrKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLQotICAgIGNhc2UgTV9ERElWXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9ESVZfMzoKLSAgICAgIHMgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdjM7Ci0gICAgY2FzZSBNX0RSRU1fMzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX1JFTV8zOgotICAgICAgcyA9ICJtZmhpIjsKLSAgICBkb19kaXYzOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZGRpdiIgOiAiZGl2IiwKLQkJICAgIjAseCx5IiwgeHJlZywgeXJlZyk7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmV6IiwgIngscCIsIHlyZWcpOwotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgIjYiLCA3KTsKLSAgICAgIAotICAgICAgLyogRklYTUU6IFRoZSBub3JtYWwgY29kZSBjaGVja3MgZm9yIG9mIC0xIC8gLTB4ODAwMDAwMDAgaGVyZSwKLSAgICAgICAgIHNpbmNlIHRoYXQgY2F1c2VzIGFuIG92ZXJmbG93LiAgV2Ugc2hvdWxkIGRvIHRoYXQgYXMgd2VsbCwKLSAgICAgICAgIGJ1dCBJIGRvbid0IHNlZSBob3cgdG8gZG8gdGhlIGNvbXBhcmlzb25zIHdpdGhvdXQgYSB0ZW1wb3JhcnkKLSAgICAgICAgIHJlZ2lzdGVyLiAgKi8KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgIngiLCB6cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RJVlVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX1JFTVVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RESVZVXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fRFJFTVVfMzoKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgZG9fZGl2dTM6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICIwLHgseSIsIHhyZWcsIHlyZWcpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5leiIsICJ4LHAiLCB5cmVnKTsKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICI2IiwgNyk7Ci0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAieCIsIHpyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE1VTDoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX01VTDoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0dSIgOiAibXVsdHUiLAotCQkgICAieCx5IiwgeHJlZywgeXJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgIngiLCB6cmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9EU1VCVV9JOgotICAgICAgZGJsID0gMTsKLSAgICAgIGdvdG8gZG9fc3VidTsKLSAgICBjYXNlIE1fU1VCVV9JOgotICAgIGRvX3N1YnU6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgIGRibCA/ICJkYWRkaXUiIDogImFkZGl1IiwKLQkJICAgInkseCw0IiwgeXJlZywgeHJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TVUJVX0lfMjoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgImFkZGl1IiwKLQkJICAgIngsayIsIHhyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRFNVQlVfSV8yOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAiZGFkZGl1IiwKLQkJICAgInksaiIsIHlyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVROgotICAgICAgcyA9ICJjbXAiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JORToKLSAgICAgIHMgPSAiY21wIjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoOwotICAgIGNhc2UgTV9CTFQ6Ci0gICAgICBzID0gInNsdCI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxUVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxFOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19yZXZlcnNlX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxFVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBnb3RvIGRvX3JldmVyc2VfYnJhbmNoOwotICAgIGNhc2UgTV9CR0U6Ci0gICAgICBzID0gInNsdCI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdFVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdUOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19yZXZlcnNlX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdUVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0KLSAgICBkb19yZXZlcnNlX2JyYW5jaDoKLSAgICAgIHRtcCA9IHhyZWc7Ci0gICAgICB4cmVnID0geXJlZzsKLSAgICAgIHlyZWcgPSB0bXA7Ci0KLSAgICBkb19icmFuY2g6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCBzLCAieCx5IiwKLQkJICAgeHJlZywgeXJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJwIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CRVFfSToKLSAgICAgIHMgPSAiY21waSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LFUiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQk5FX0k6Ci0gICAgICBzID0gImNtcGkiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgczMgPSAieCxVIjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JMVF9JOgotICAgICAgcyA9ICJzbHRpIjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTFRVX0k6Ci0gICAgICBzID0gInNsdGl1IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTEVfSToKLSAgICAgIHMgPSAic2x0aSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19hZGRvbmVfYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JMRVVfSToKLSAgICAgIHMgPSAic2x0aXUiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYWRkb25lX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CR0VfSToKLSAgICAgIHMgPSAic2x0aSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdFVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdUX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYWRkb25lX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CR1RVX0k6Ci0gICAgICBzID0gInNsdGl1IjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0KLSAgICBkb19hZGRvbmVfYnJhbmNoX2k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICArK2ltbV9leHByLlhfYWRkX251bWJlcjsKLQotICAgIGRvX2JyYW5jaF9pOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsIHMsIHMzLCB4cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInAiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0FCUzoKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGkiLCAieCw4IiwgIHlyZWcpOwotICAgICAgaWYgKHhyZWcgIT0geXJlZykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICJtb3ZlIiwgInksWCIsIHhyZWcsIHlyZWcpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYnRlcXoiLCAicCIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgIm5lZyIsICJ4LHciLCB4cmVnLCB4cmVnKTsKLSAgICB9Ci19Ci0KLS8qIEZvciBjb25zaXN0ZW5jeSBjaGVja2luZywgdmVyaWZ5IHRoYXQgYWxsIGJpdHMgYXJlIHNwZWNpZmllZCBlaXRoZXIKLSAgIGJ5IHRoZSBtYXRjaC9tYXNrIHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGRlZmluaXRpb24sIG9yIGJ5IHRoZQotICAgb3BlcmFuZCBsaXN0LiAgKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX21pcHNfaW5zbiAob3BjKQotICAgICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wYzsKLXsKLSAgY29uc3QgY2hhciAqcCA9IG9wYy0+YXJnczsKLSAgY2hhciBjOwotICB1bnNpZ25lZCBsb25nIHVzZWRfYml0cyA9IG9wYy0+bWFzazsKLQotICBpZiAoKHVzZWRfYml0cyAmIG9wYy0+bWF0Y2gpICE9IG9wYy0+bWF0Y2gpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlIChtYXNrIGVycm9yKTogJXMgJXMiKSwKLQkgICAgICBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0jZGVmaW5lIFVTRV9CSVRTKG1hc2ssc2hpZnQpCSh1c2VkX2JpdHMgfD0gKChtYXNrKSA8PCAoc2hpZnQpKSkKLSAgd2hpbGUgKCpwKQotICAgIHN3aXRjaCAoYyA9ICpwKyspCi0gICAgICB7Ci0gICAgICBjYXNlICcsJzogYnJlYWs7Ci0gICAgICBjYXNlICcoJzogYnJlYWs7Ci0gICAgICBjYXNlICcpJzogYnJlYWs7Ci0gICAgICBjYXNlICc8JzogVVNFX0JJVFMgKE9QX01BU0tfU0hBTVQsCU9QX1NIX1NIQU1UKTsJYnJlYWs7Ci0gICAgICBjYXNlICc+JzoJVVNFX0JJVFMgKE9QX01BU0tfU0hBTVQsCU9QX1NIX1NIQU1UKTsJYnJlYWs7Ci0gICAgICBjYXNlICdBJzogYnJlYWs7Ci0gICAgICBjYXNlICdCJzoJVVNFX0JJVFMgKE9QX01BU0tfU1lTQ0FMTCwJT1BfU0hfU1lTQ0FMTCk7CWJyZWFrOwotICAgICAgY2FzZSAnQyc6CVVTRV9CSVRTIChPUF9NQVNLX0NPUFosCQlPUF9TSF9DT1BaKTsJYnJlYWs7Ci0gICAgICBjYXNlICdEJzoJVVNFX0JJVFMgKE9QX01BU0tfRkQsCQlPUF9TSF9GRCk7CWJyZWFrOwotICAgICAgY2FzZSAnRSc6CVVTRV9CSVRTIChPUF9NQVNLX1JULAkJT1BfU0hfUlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ0YnOiBicmVhazsKLSAgICAgIGNhc2UgJ0cnOglVU0VfQklUUyAoT1BfTUFTS19SRCwJCU9QX1NIX1JEKTsJYnJlYWs7Ci0gICAgICBjYXNlICdJJzogYnJlYWs7Ci0gICAgICBjYXNlICdMJzogYnJlYWs7Ci0gICAgICBjYXNlICdNJzoJVVNFX0JJVFMgKE9QX01BU0tfQ0NDLAkJT1BfU0hfQ0NDKTsJYnJlYWs7Ci0gICAgICBjYXNlICdOJzoJVVNFX0JJVFMgKE9QX01BU0tfQkNDLAkJT1BfU0hfQkNDKTsJYnJlYWs7Ci0gICAgICBjYXNlICdSJzoJVVNFX0JJVFMgKE9QX01BU0tfRlIsCQlPUF9TSF9GUik7CWJyZWFrOwotICAgICAgY2FzZSAnUyc6CVVTRV9CSVRTIChPUF9NQVNLX0ZTLAkJT1BfU0hfRlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ1QnOglVU0VfQklUUyAoT1BfTUFTS19GVCwJCU9QX1NIX0ZUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdWJzoJVVNFX0JJVFMgKE9QX01BU0tfRlMsCQlPUF9TSF9GUyk7CWJyZWFrOwotICAgICAgY2FzZSAnVyc6CVVTRV9CSVRTIChPUF9NQVNLX0ZULAkJT1BfU0hfRlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ2EnOglVU0VfQklUUyAoT1BfTUFTS19UQVJHRVQsCU9QX1NIX1RBUkdFVCk7CWJyZWFrOwotICAgICAgY2FzZSAnYic6CVVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ2MnOglVU0VfQklUUyAoT1BfTUFTS19DT0RFLAkJT1BfU0hfQ09ERSk7CWJyZWFrOwotICAgICAgY2FzZSAnZCc6CVVTRV9CSVRTIChPUF9NQVNLX1JELAkJT1BfU0hfUkQpOwlicmVhazsKLSAgICAgIGNhc2UgJ2YnOiBicmVhazsKLSAgICAgIGNhc2UgJ2gnOglVU0VfQklUUyAoT1BfTUFTS19QUkVGWCwJT1BfU0hfUFJFRlgpOwlicmVhazsKLSAgICAgIGNhc2UgJ2knOglVU0VfQklUUyAoT1BfTUFTS19JTU1FRElBVEUsCU9QX1NIX0lNTUVESUFURSk7IGJyZWFrOwotICAgICAgY2FzZSAnaic6CVVTRV9CSVRTIChPUF9NQVNLX0RFTFRBLAlPUF9TSF9ERUxUQSk7CWJyZWFrOwotICAgICAgY2FzZSAnayc6CVVTRV9CSVRTIChPUF9NQVNLX0NBQ0hFLAlPUF9TSF9DQUNIRSk7CWJyZWFrOwotICAgICAgY2FzZSAnbCc6IGJyZWFrOwotICAgICAgY2FzZSAnbyc6IFVTRV9CSVRTIChPUF9NQVNLX0RFTFRBLAlPUF9TSF9ERUxUQSk7CWJyZWFrOwotICAgICAgY2FzZSAncCc6CVVTRV9CSVRTIChPUF9NQVNLX0RFTFRBLAlPUF9TSF9ERUxUQSk7CWJyZWFrOwotICAgICAgY2FzZSAncSc6CVVTRV9CSVRTIChPUF9NQVNLX0NPREUyLAlPUF9TSF9DT0RFMik7CWJyZWFrOwotICAgICAgY2FzZSAncic6IFVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ3MnOglVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICd0JzoJVVNFX0JJVFMgKE9QX01BU0tfUlQsCQlPUF9TSF9SVCk7CWJyZWFrOwotICAgICAgY2FzZSAndSc6CVVTRV9CSVRTIChPUF9NQVNLX0lNTUVESUFURSwJT1BfU0hfSU1NRURJQVRFKTsgYnJlYWs7Ci0gICAgICBjYXNlICd2JzoJVVNFX0JJVFMgKE9QX01BU0tfUlMsCQlPUF9TSF9SUyk7CWJyZWFrOwotICAgICAgY2FzZSAndyc6CVVTRV9CSVRTIChPUF9NQVNLX1JULAkJT1BfU0hfUlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ3gnOiBicmVhazsKLSAgICAgIGNhc2UgJ3onOiBicmVhazsKLSAgICAgIGNhc2UgJ1AnOiBVU0VfQklUUyAoT1BfTUFTS19QRVJGUkVHLAlPUF9TSF9QRVJGUkVHKTsJYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAodW5rbm93biBvcGVyYW5kIHR5cGUgYCVjJyk6ICVzICVzIiksCi0JCWMsIG9wYy0+bmFtZSwgb3BjLT5hcmdzKTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSN1bmRlZiBVU0VfQklUUwotICBpZiAodXNlZF9iaXRzICE9IDB4ZmZmZmZmZmYpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlIChiaXRzIDB4JWx4IHVuZGVmaW5lZCk6ICVzICVzIiksCi0JICAgICAgfnVzZWRfYml0cyAmIDB4ZmZmZmZmZmYsIG9wYy0+bmFtZSwgb3BjLT5hcmdzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBhc3NlbWJsZXMgYW4gaW5zdHJ1Y3Rpb24gaW50byBpdHMgYmluYXJ5IGZvcm1hdC4gIEFzIGEKLSAgIHNpZGUgZWZmZWN0LCBpdCBzZXRzIG9uZSBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBpbW1fcmVsb2Mgb3IKLSAgIG9mZnNldF9yZWxvYyB0byB0aGUgdHlwZSBvZiByZWxvY2F0aW9uIHRvIGRvIGlmIG9uZSBvZiB0aGUgb3BlcmFuZHMKLSAgIGlzIGFuIGFkZHJlc3MgZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2lwIChzdHIsIGlwKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotewotICBjaGFyICpzOwotICBjb25zdCBjaGFyICphcmdzOwotICBjaGFyIGM7Ci0gIHN0cnVjdCBtaXBzX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBpbnQgcmVnbm87Ci0gIHVuc2lnbmVkIGludCBsYXN0cmVnbm8gPSAwOwotICBjaGFyICpzX3Jlc2V0OwotICBjaGFyIHNhdmVfYyA9IDA7Ci0gIGludCBmdWxsX29wY29kZV9tYXRjaCA9IDE7Ci0KLSAgaW5zbl9lcnJvciA9IE5VTEw7Ci0KLSAgLyogSWYgdGhlIGluc3RydWN0aW9uIGNvbnRhaW5zIGEgJy4nLCB3ZSBmaXJzdCB0cnkgdG8gbWF0Y2ggYW4gaW5zdHJ1Y3Rpb24KLSAgICAgaW5jbHVkaW5nIHRoZSAnLicuICBUaGVuIHdlIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSAnLicuICAqLwotICBpbnNuID0gTlVMTDsKLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpOyArK3MpCi0gICAgY29udGludWU7Ci0KLSAgLyogSWYgd2Ugc3RvcHBlZCBvbiB3aGl0ZXNwYWNlLCB0aGVuIHJlcGxhY2UgdGhlIHdoaXRlc3BhY2Ugd2l0aCBudWxsIGZvcgotICAgICB0aGUgY2FsbCB0byBoYXNoX2ZpbmQuICBTYXZlIHRoZSBjaGFyYWN0ZXIgd2UgcmVwbGFjZWQganVzdCBpbiBjYXNlIHdlCi0gICAgIGhhdmUgdG8gcmUtcGFyc2UgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0gICAgewotICAgICAgc2F2ZV9jID0gKnM7Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICB9Ci0JCi0gIGluc24gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKTsKLQotICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIG9wY29kZSB0YWJsZSwgdHJ5IGFnYWluLCBidXQKLSAgICAgdGhpcyB0aW1lIHdpdGgganVzdCB0aGUgaW5zdHJ1Y3Rpb24gdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nIHRoZQotICAgICBmaXJzdCAnLicuICAqLwotICBpZiAoaW5zbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFJlc3RvcmUgdGhlIGNoYXJhY3RlciB3ZSBvdmVyd3JpdGUgYWJvdmUgKGlmIGFueSkuICAqLyAKLSAgICAgIGlmIChzYXZlX2MpCi0JKigtLXMpID0gc2F2ZV9jOwotCi0gICAgICAvKiBTY2FuIHVwIHRvIHRoZSBmaXJzdCAnLicgb3Igd2hpdGVzcGFjZS4gICovCi0gICAgICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgKnMgIT0gJy4nICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpOyArK3MpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGRpZCBub3QgZmluZCBhICcuJywgdGhlbiB3ZSBjYW4gcXVpdCBub3cuICAqLwotICAgICAgaWYgKCpzICE9ICcuJykKLQl7Ci0JICBpbnNuX2Vycm9yID0gInVucmVjb2duaXplZCBvcGNvZGUiOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogTG9va3VwIHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGlmICgoaW5zbiA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotCXsKLQkgIGluc25fZXJyb3IgPSAidW5yZWNvZ25pemVkIG9wY29kZSI7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBmdWxsX29wY29kZV9tYXRjaCA9IDA7Ci0gICAgfQotCi0gIGFyZ3NTdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgaW50IGluc25faXNhOwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgYXNzZXJ0IChzdHJjbXAgKGluc24tPm5hbWUsIHN0cikgPT0gMCk7Ci0KLSAgICAgIGlmICgoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTEpCi0JaW5zbl9pc2EgPSAxOwotICAgICAgZWxzZSBpZiAoKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0EyKQotCWluc25faXNhID0gMjsKLSAgICAgIGVsc2UgaWYgKChpbnNuLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMykKLQlpbnNuX2lzYSA9IDM7Ci0gICAgICBlbHNlIGlmICgoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTQpCi0JaW5zbl9pc2EgPSA0OwotICAgICAgZWxzZQotCWluc25faXNhID0gMTU7Ci0KLSAgICAgIGlmIChpbnNuX2lzYSA8PSBtaXBzX29wdHMuaXNhKQotCW9rID0gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKGluc24tPnBpbmZvID09IElOU05fTUFDUk8pCi0Jb2sgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKChtaXBzX2NwdSA9PSA0NjUwICYmIChpbnNuLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSAhPSAwKQotCSAgICAgICB8fCAobWlwc19jcHUgPT0gNDAxMCAmJiAoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fNDAxMCkgIT0gMCkKLQkgICAgICAgfHwgKChtaXBzX2NwdSA9PSA0MTAwCi0JCSAgICB8fCBtaXBzX2NwdSA9PSA0MTExCi0JCSAgICApCi0JCSAgICYmIChpbnNuLT5tZW1iZXJzaGlwICYgSU5TTl80MTAwKSAhPSAwKQotCSAgICAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fMzkwMCkgIT0gMCkpCi0Jb2sgPSB0cnVlOwotICAgICAgZWxzZQotCW9rID0gZmFsc2U7Ci0KLSAgICAgIGlmIChpbnNuLT5waW5mbyAhPSBJTlNOX01BQ1JPKQotCXsKLQkgIGlmIChtaXBzX2NwdSA9PSA0NjUwICYmIChpbnNuLT5waW5mbyAmIEZQX0QpICE9IDApCi0JICAgIG9rID0gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBvaykKLQl7Ci0JICBpZiAoaW5zbiArIDEgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdCi0JICAgICAgJiYgc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICArK2luc247Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGlmIChpbnNuX2lzYSA9PSAxNSAKLSAgICAgICAgICAgICAgfHwgaW5zbl9pc2EgPD0gbWlwc19vcHRzLmlzYSkKLQkgICAgaW5zbl9lcnJvciA9IF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotCSAgICAgIHNwcmludGYgKGJ1ZiwgXygib3Bjb2RlIHJlcXVpcmVzIC1taXBzJWQgb3IgZ3JlYXRlciIpLCBpbnNuX2lzYSk7Ci0JICAgICAgaW5zbl9lcnJvciA9IGJ1ZjsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaXAtPmluc25fbW8gPSBpbnNuOwotICAgICAgaXAtPmluc25fb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIGlmICgqcyA9PSAnICcpCi0JICAgICsrczsKLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJywnOgotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBzLS07Ci0JICAgICAgc3dpdGNoICgqKythcmdzKQotCQl7Ci0JCWNhc2UgJ3InOgotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDIxOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ3cnOgotCQljYXNlICdXJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDE2OwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ1YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcoJzoKLQkgICAgICAvKiBIYW5kbGUgb3B0aW9uYWwgYmFzZSByZWdpc3Rlci4KLQkJIEVpdGhlciB0aGUgYmFzZSByZWdpc3RlciBpcyBvbWl0dGVkIG9yCi0JCSB3ZSBtdXN0IGhhdmUgYSBsZWZ0IHBhcmVuLiAqLwotCSAgICAgIC8qIFRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBuZXh0IG9wZXJhbmQgc3BlY2lmaWVyCi0JCSBpcyBhIGJhc2UgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4gICovCi0JICAgICAgYXNzZXJ0IChhcmdzWzFdID09ICdiJyB8fCBhcmdzWzFdID09ICc1JwotCQkgICAgICB8fCBhcmdzWzFdID09ICctJyB8fCBhcmdzWzFdID09ICc0Jyk7Ci0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXJldHVybjsKLQotCSAgICBjYXNlICcpJzoJCS8qIHRoZXNlIG11c3QgbWF0Y2ggZXhhY3RseSAqLwotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc8JzoJCS8qIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0ICovCi0JICAgICAgLyoKLQkgICAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCwgaWYgdGhlIHNoaWZ0IGFtb3VudCBpcyBncmVhdGVyCi0JICAgICAgICogdGhhbiAzMSBvciBsZXNzIHRoYW4gMCB0aGUgdGhlIHNoaWZ0IGFtb3VudCBzaG91bGQgYmUKLQkgICAgICAgKiBtb2QgMzIuIEluIHJlYWxpdHkgdGhlIG1pcHMgYXNzZW1ibGVyIGlzc3VlcyBhbiBlcnJvci4KLQkgICAgICAgKiBXZSBpc3N1ZSBhIHdhcm5pbmcgYW5kIG1hc2sgb3V0IGFsbCBidXQgdGhlIGxvdyA1IGJpdHMuCi0JICAgICAgICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDMxKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW1wcm9wZXIgc2hpZnQgYW1vdW50ICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCA2OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnPic6CQkvKiBzaGlmdCBhbW91bnQgbWludXMgMzIgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMzIKLQkJICB8fCAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gNjMpCi0JCWJyZWFrOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIC0gMzIpIDw8IDY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCi0JICAgIGNhc2UgJ2snOgkJLyogY2FjaGUgY29kZSAqLwotCSAgICBjYXNlICdoJzoJCS8qIHByZWZ4IGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gMzEpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIiksCi0JCQkgICBpcC0+aW5zbl9tby0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDFmOwotCQl9Ci0JICAgICAgaWYgKCphcmdzID09ICdrJykKLQkJaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCBPUF9TSF9DQUNIRTsKLQkgICAgICBlbHNlCi0JCWlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgT1BfU0hfUFJFRlg7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdjJzoJCS8qIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQpIGltbV9leHByLlhfYWRkX251bWJlciA+IDEwMjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbGxlZ2FsIGJyZWFrIGNvZGUgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgMTY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdxJzoJCS8qIGxvd2VyIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQpIGltbV9leHByLlhfYWRkX251bWJlciA+IDEwMjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbGxlZ2FsIGxvd2VyIGJyZWFrIGNvZGUgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0InOgkJLyogc3lzY2FsbCBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAweGZmZmZmKQotCQlhc193YXJuIChfKCJJbGxlZ2FsIHN5c2NhbGwgY29kZSAoJWxkKSIpLAotCQkJIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBjYXNlICdDJzogICAgICAgICAgIC8qIENvcHJvY2Vzc29yIGNvZGUgKi8KLSAgICAgICAgICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLSAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gKDE8PDI1KSkKLQkJewotICAgICAgICAgICAgICAgICAgYXNfd2FybiAoXygiQ29wcm9jY2Vzb3IgY29kZSA+IDI1IGJpdHMgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotICAgICAgICAgICAgICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9ICgoMTw8MjUpIC0gMSk7Ci0JCX0KLSAgICAgICAgICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgICAgICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICAgICAgICAgICAgICBzID0gZXhwcl9lbmQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ1AnOgkJLyogUGVyZm9ybWFuY2UgcmVnaXN0ZXIgKi8KLSAgICAgICAgICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLSAgICAgICAgICAgICAgaWYgKGltbV9leHByLlhfYWRkX251bWJlciAhPSAwICYmIGltbV9leHByLlhfYWRkX251bWJlciAhPSAxKQotCQl7Ci0gICAgICAgICAgICAgICAgICBhc193YXJuIChfKCJJbnZhbGlkYXRlIHBlcmZvcm1hbmNlIHJlZ3N0ZXIgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotICAgICAgICAgICAgICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDE7Ci0JCX0KLSAgICAgICAgICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IChpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgMSk7Ci0gICAgICAgICAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgICAgICAgICAgcyA9IGV4cHJfZW5kOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdiJzoJCS8qIGJhc2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnZCc6CQkvKiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCSAgICBjYXNlICdzJzoJCS8qIHNvdXJjZSByZWdpc3RlciAqLwotCSAgICBjYXNlICd0JzoJCS8qIHRhcmdldCByZWdpc3RlciAqLwotCSAgICBjYXNlICdyJzoJCS8qIGJvdGggdGFyZ2V0IGFuZCBzb3VyY2UgKi8KLQkgICAgY2FzZSAndic6CQkvKiBib3RoIGRlc3QgYW5kIHNvdXJjZSAqLwotCSAgICBjYXNlICd3JzoJCS8qIGJvdGggZGVzdCBhbmQgdGFyZ2V0ICovCi0JICAgIGNhc2UgJ0UnOgkJLyogY29wcm9jZXNzb3IgdGFyZ2V0IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ0cnOgkJLyogY29wcm9jZXNzb3IgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAneCc6CQkvKiBpZ25vcmUgcmVnaXN0ZXIgbmFtZSAqLwotCSAgICBjYXNlICd6JzoJCS8qIG11c3QgYmUgemVybyByZWdpc3RlciAqLwotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChzWzBdID09ICckJykKLQkJewotCi0JCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzWzFdKSkKLQkJICAgIHsKLQkJICAgICAgKytzOwotCQkgICAgICByZWdubyA9IDA7Ci0JCSAgICAgIGRvCi0JCQl7Ci0JCQkgIHJlZ25vICo9IDEwOwotCQkJICByZWdubyArPSAqcyAtICcwJzsKLQkJCSAgKytzOwotCQkJfQotCQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0JCSAgICAgIGlmIChyZWdubyA+IDMxKQotCQkJYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqYXJncyA9PSAnRScgfHwgKmFyZ3MgPT0gJ0cnKQotCQkgICAgZ290byBub3RyZWc7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoc1sxXSA9PSAnZicgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBGUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAncycgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBTUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnZycgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBHUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnYScgJiYgc1syXSA9PSAndCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBBVDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnaycgJiYgc1syXSA9PSAndCcgJiYgc1szXSA9PSAnMCcpCi0JCQl7Ci0JCQkgIHMgKz0gNDsKLQkJCSAgcmVnbm8gPSBLVDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzEnKQotCQkJewotCQkJICBzICs9IDQ7Ci0JCQkgIHJlZ25vID0gS1QxOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChpdGJsX2hhdmVfZW50cmllcykKLQkJCXsKLQkJCSAgY2hhciAqcCwgKm47Ci0JCQkgIHVuc2lnbmVkIGxvbmcgcjsKLQotCQkJICBwID0gcyArIDE7IAkvKiBhZHZhbmNlIHBhc3QgJyQnICovCi0JCQkgIG4gPSBpdGJsX2dldF9maWVsZCAoJnApOyAgLyogbiBpcyBuYW1lICovCi0KLQkJCSAgLyogU2VlIGlmIHRoaXMgaXMgYSByZWdpc3RlciBkZWZpbmVkIGluIGFuCi0JCQkgICAgIGl0YmwgZW50cnkuICAqLwotCQkJICBpZiAoaXRibF9nZXRfcmVnX3ZhbCAobiwgJnIpKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIEdldF9maWVsZCBhZHZhbmNlcyB0byB0aGUgc3RhcnQgb2YKLQkJCQkgdGhlIG5leHQgZmllbGQsIHNvIHdlIG5lZWQgdG8gYmFjawotCQkJCSByYWNrIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZmllbGQuICAqLwotCQkJICAgICAgaWYgKHApIAotCQkJCXMgPSBwIC0gMTsKLQkJCSAgICAgIGVsc2UgCi0JCQkJcyA9IHN0cmNociAocywgJ1wwJyk7Ci0JCQkgICAgICByZWdubyA9IHI7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgZ290byBub3RyZWc7Ci0JCQkgIH0KLQkJICAgICAgZWxzZQotCQkJZ290byBub3RyZWc7Ci0JCSAgICB9Ci0JCSAgaWYgKHJlZ25vID09IEFUCi0JCSAgICAgICYmICEgbWlwc19vcHRzLm5vYXQKLQkJICAgICAgJiYgKmFyZ3MgIT0gJ0UnCi0JCSAgICAgICYmICphcmdzICE9ICdHJykKLQkJICAgIGFzX3dhcm4gKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkJICBjID0gKmFyZ3M7Ci0JCSAgaWYgKCpzID09ICcgJykKLQkJICAgIHMrKzsKLQkJICBpZiAoYXJnc1sxXSAhPSAqcykKLQkJICAgIHsKLQkJICAgICAgaWYgKGMgPT0gJ3InIHx8IGMgPT0gJ3YnIHx8IGMgPT0gJ3cnKQotCQkJewotCQkJICByZWdubyA9IGxhc3RyZWdubzsKLQkJCSAgcyA9IHNfcmVzZXQ7Ci0JCQkgIGFyZ3MrKzsKLQkJCX0KLQkJICAgIH0KLQkJICAvKiAneicgb25seSBtYXRjaGVzICQwLiAgKi8KLQkJICBpZiAoYyA9PSAneicgJiYgcmVnbm8gIT0gMCkKLQkJICAgIGJyZWFrOwotCi0JLyogTm93IHRoYXQgd2UgaGF2ZSBhc3NlbWJsZWQgb25lIG9wZXJhbmQsIHdlIHVzZSB0aGUgYXJncyBzdHJpbmcgCi0JICogdG8gZmlndXJlIG91dCB3aGVyZSBpdCBnb2VzIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQkJICBzd2l0Y2ggKGMpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdyJzoKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgY2FzZSAndic6Ci0JCSAgICBjYXNlICdiJzoKLQkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDIxOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgY2FzZSAnRyc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd3JzoKLQkJICAgIGNhc2UgJ3QnOgotCQkgICAgY2FzZSAnRSc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxNjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd4JzoKLQkJICAgICAgLyogVGhpcyBjYXNlIGV4aXN0cyBiZWNhdXNlIG9uIHRoZSByMzAwMCB0cnVuYwotCQkJIGV4cGFuZHMgaW50byBhIG1hY3JvIHdoaWNoIHJlcXVpcmVzIGEgZ3AKLQkJCSByZWdpc3Rlci4gIE9uIHRoZSByNjAwMCBvciByNDAwMCBpdCBpcwotCQkJIGFzc2VtYmxlZCBpbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uIHdoaWNoCi0JCQkgaWdub3JlcyB0aGUgcmVnaXN0ZXIuICBUaHVzIHRoZSBpbnNuIHZlcnNpb24KLQkJCSBpcyBNSVBTX0lTQTIgYW5kIHVzZXMgJ3gnLCBhbmQgdGhlIG1hY3JvCi0JCQkgdmVyc2lvbiBpcyBNSVBTX0lTQTEgYW5kIHVzZXMgJ3QnLiAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd6JzoKLQkJICAgICAgLyogVGhpcyBjYXNlIGlzIGZvciB0aGUgZGl2IGluc3RydWN0aW9uLCB3aGljaAotCQkJIGFjdHMgZGlmZmVyZW50bHkgaWYgdGhlIGRlc3RpbmF0aW9uIGFyZ3VtZW50Ci0JCQkgaXMgJDAuICBUaGlzIG9ubHkgbWF0Y2hlcyAkMCwgYW5kIGlzIGNoZWNrZWQKLQkJCSBvdXRzaWRlIHRoZSBzd2l0Y2guICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ0QnOgotCQkgICAgICAvKiBJdGJsIG9wZXJhbmQ7IG5vdCB5ZXQgaW1wbGVtZW50ZWQuIEZJWE1FID8/ICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgICAvKiBXaGF0IGFib3V0IGFsbCBvdGhlciBvcGVyYW5kcyBsaWtlICdpJywgd2hpY2gKLQkJCSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBvcGNvZGUgdGFibGU/ICovCi0JCSAgICB9Ci0JCSAgbGFzdHJlZ25vID0gcmVnbm87Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgbm90cmVnOgotCSAgICAgIHN3aXRjaCAoKmFyZ3MrKykKLQkJewotCQljYXNlICdyJzoKLQkJY2FzZSAndic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAyMTsKLQkJICBjb250aW51ZTsKLQkJY2FzZSAndyc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxNjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0QnOgkJLyogZmxvYXRpbmcgcG9pbnQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnUyc6CQkvKiBmbG9hdGluZyBwb2ludCBzb3VyY2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnVCc6CQkvKiBmbG9hdGluZyBwb2ludCB0YXJnZXQgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnUic6CQkvKiBmbG9hdGluZyBwb2ludCBzb3VyY2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnVic6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChzWzBdID09ICckJyAmJiBzWzFdID09ICdmJyAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc1syXSkpCi0JCXsKLQkJICBzICs9IDI7Ci0JCSAgcmVnbm8gPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vICo9IDEwOwotCQkgICAgICByZWdubyArPSAqcyAtICcwJzsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKTsKLQotCQkgIGlmIChyZWdubyA+IDMxKQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIGZsb2F0IHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKLQotCQkgIGlmICgocmVnbm8gJiAxKSAhPSAwCi0JCSAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCAzCi0JCSAgICAgICYmICEgKHN0cmNtcCAoc3RyLCAibXRjMSIpID09IDAKLQkJCSAgICB8fCBzdHJjbXAgKHN0ciwgIm1mYzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJsd2MxIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAic3djMSIpID09IDAKLQkJCSAgICB8fCBzdHJjbXAgKHN0ciwgImwucyIpID09IDAKLQkJCSAgICB8fCBzdHJjbXAgKHN0ciwgInMucyIpID09IDApKQotCQkgICAgYXNfd2FybiAoXygiRmxvYXQgcmVnaXN0ZXIgc2hvdWxkIGJlIGV2ZW4sIHdhcyAlZCIpLAotCQkJICAgICByZWdubyk7Ci0KLQkJICBjID0gKmFyZ3M7Ci0JCSAgaWYgKCpzID09ICcgJykKLQkJICAgIHMrKzsKLQkJICBpZiAoYXJnc1sxXSAhPSAqcykKLQkJICAgIHsKLQkJICAgICAgaWYgKGMgPT0gJ1YnIHx8IGMgPT0gJ1cnKQotCQkJewotCQkJICByZWdubyA9IGxhc3RyZWdubzsKLQkJCSAgcyA9IHNfcmVzZXQ7Ci0JCQkgIGFyZ3MrKzsKLQkJCX0KLQkJICAgIH0KLQkJICBzd2l0Y2ggKGMpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDY7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnVic6Ci0JCSAgICBjYXNlICdTJzoKLQkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDExOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1cnOgotCQkgICAgY2FzZSAnVCc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxNjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdSJzoKLQkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDIxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBsYXN0cmVnbm8gPSByZWdubzsKLQkJICBjb250aW51ZTsKLQkJfQotCi0KLQkgICAgICBzd2l0Y2ggKCphcmdzKyspCi0JCXsKLQkJY2FzZSAnVic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxMTsKLQkJICBjb250aW51ZTsKLQkJY2FzZSAnVyc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxNjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19iaWcKLQkJICAmJiBpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0EnOgotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DXzMyOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdGJzoKLQkgICAgY2FzZSAnTCc6Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICdsJzoKLQkgICAgICB7Ci0JCWludCBmNjQ7Ci0JCWNoYXIgKnNhdmVfaW47Ci0JCWNoYXIgKmVycjsKLQkJdW5zaWduZWQgY2hhciB0ZW1wWzhdOwotCQlpbnQgbGVuOwotCQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCQlzZWdUIHNlZzsKLQkJc3Vic2VnVCBzdWJzZWc7Ci0JCWNoYXIgKnA7Ci0KLQkJLyogVGhlc2Ugb25seSBhcHBlYXIgYXMgdGhlIGxhc3Qgb3BlcmFuZCBpbiBhbgotCQkgICBpbnN0cnVjdGlvbiwgYW5kIGV2ZXJ5IGluc3RydWN0aW9uIHRoYXQgYWNjZXB0cwotCQkgICB0aGVtIGluIGFueSB2YXJpYW50IGFjY2VwdHMgdGhlbSBpbiBhbGwgdmFyaWFudHMuCi0JCSAgIFRoaXMgbWVhbnMgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBiYWNraW5nIG91dAotCQkgICBhbnkgY2hhbmdlcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2guCi0KLQkJICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIGlzIHRoZSBzaXplIG9mIHRoZQotCQkgICBmbG9hdGluZyBwb2ludCBjb25zdGFudCBhbmQgd2hlcmUgaXQgZ29lcy4gIEZvciAnRicKLQkJICAgYW5kICdMJyB0aGUgY29uc3RhbnQgaXMgNjQgYml0czsgZm9yICdmJyBhbmQgJ2wnIGl0Ci0JCSAgIGlzIDMyIGJpdHMuICBXaGVyZSB0aGUgY29uc3RhbnQgaXMgcGxhY2VkIGlzIGJhc2VkCi0JCSAgIG9uIGhvdyB0aGUgTUlQUyBhc3NlbWJsZXIgZG9lcyB0aGluZ3M6Ci0JCSAgICBGIC0tIC5yZGF0YQotCQkgICAgTCAtLSAubGl0OAotCQkgICAgZiAtLSBpbW1lZGlhdGUgdmFsdWUKLQkJICAgIGwgLS0gLmxpdDQKLQotCQkgICAgVGhlIC5saXQ0IGFuZCAubGl0OCBzZWN0aW9ucyBhcmUgb25seSB1c2VkIGlmCi0JCSAgICBwZXJtaXR0ZWQgYnkgdGhlIC1HIGFyZ3VtZW50LgotCi0JCSAgICBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHdlIHVzZSB0aGUKLQkJICAgIC5saXQ4IHNlY3Rpb24gYnV0IG5vdCB0aGUgLmxpdDQgc2VjdGlvbiAod2UgY2FuIGRvCi0JCSAgICAubGl0NCBpbmxpbmUgZWFzaWx5OyB3ZSBuZWVkIHRvIHB1dCAubGl0OAotCQkgICAgc29tZXdoZXJlIGluIHRoZSBkYXRhIHNlZ21lbnQsIGFuZCB1c2luZyAubGl0OAotCQkgICAgcGVybWl0cyB0aGUgbGlua2VyIHRvIGV2ZW50dWFsbHkgY29tYmluZSBpZGVudGljYWwKLQkJICAgIC5saXQ4IGVudHJpZXMpLiAgKi8KLQotCQlmNjQgPSAqYXJncyA9PSAnRicgfHwgKmFyZ3MgPT0gJ0wnOwotCi0JCXNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCWlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0JCWVyciA9IG1kX2F0b2YgKGY2NCA/ICdkJyA6ICdmJywgKGNoYXIgKikgdGVtcCwgJmxlbik7Ci0JCWxlbmd0aCA9IGxlbjsKLQkJcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLQkJaWYgKGVyciAhPSBOVUxMICYmICplcnIgIT0gJ1wwJykKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oIkJhZCBmbG9hdGluZyBwb2ludCBjb25zdGFudDogJXMiKSwgZXJyKTsKLQkJICAgIG1lbXNldCAodGVtcCwgJ1wwJywgc2l6ZW9mIHRlbXApOwotCQkgICAgbGVuZ3RoID0gZjY0ID8gOCA6IDQ7Ci0JCSAgfQotCi0JCWFzc2VydCAobGVuZ3RoID09IChmNjQgPyA4IDogNCkpOwotCi0JCWlmICgqYXJncyA9PSAnZicKLQkJICAgIHx8ICgqYXJncyA9PSAnbCcKLQkJCSYmICghIFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQKLQkJCSAgICB8fCBtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLQkJCSAgICB8fCBnX3N3aXRjaF92YWx1ZSA8IDQKLQkJCSAgICB8fCAodGVtcFswXSA9PSAwICYmIHRlbXBbMV0gPT0gMCkKLQkJCSAgICB8fCAodGVtcFsyXSA9PSAwICYmIHRlbXBbM10gPT0gMCkpKSkKLQkJICB7Ci0JCSAgICBpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkgICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDMyICh0ZW1wKTsKLQkJICAgIGVsc2UKLQkJICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGIzMiAodGVtcCk7Ci0JCSAgfQotCQllbHNlIGlmIChsZW5ndGggPiA0Ci0JCQkgJiYgKCh0ZW1wWzBdID09IDAgJiYgdGVtcFsxXSA9PSAwKQotCQkJICAgICB8fCAodGVtcFsyXSA9PSAwICYmIHRlbXBbM10gPT0gMCkpCi0JCQkgJiYgKCh0ZW1wWzRdID09IDAgJiYgdGVtcFs1XSA9PSAwKQotCQkJICAgICB8fCAodGVtcFs2XSA9PSAwICYmIHRlbXBbN10gPT0gMCkpKQotCQkgIHsKLQkJICAgIC8qIFRoZSB2YWx1ZSBpcyBzaW1wbGUgZW5vdWdoIHRvIGxvYWQgd2l0aCBhCi0gICAgICAgICAgICAgICAgICAgICAgIGNvdXBsZSBvZiBpbnN0cnVjdGlvbnMuICBJbiBtaXBzMSBtb2RlLCBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgaW1tX2V4cHIgdG8gdGhlIGhpZ2ggb3JkZXIgMzIgYml0cyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2V4cHIgdG8gdGhlIGxvdyBvcmRlciAzMiBiaXRzLgotICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHNldCBpbW1fZXhwciB0byB0aGUgZW50aXJlIDY0IGJpdAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudC4gICovCi0JCSAgICBpZiAobWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgIHsKLQkJCWltbV9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQkJb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJCSAgewotCQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsMzIgKHRlbXAgKyA0KTsKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDMyICh0ZW1wKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGIzMiAodGVtcCk7Ci0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGIzMiAodGVtcCArIDQpOwotCQkJICB9Ci0JCQlpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JCQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoc2l6ZW9mIChpbW1fZXhwci5YX2FkZF9udW1iZXIpID4gNCkKLQkJICAgICAgewotCQkJaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGw2NCAodGVtcCk7Ci0JCQllbHNlCi0JCQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRiNjQgKHRlbXApOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWltbV9leHByLlhfb3AgPSBPX2JpZzsKLQkJCWltbV9leHByLlhfYWRkX251bWJlciA9IDQ7Ci0JCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJCSAgewotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzBdID0gYmZkX2dldGwxNiAodGVtcCk7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMV0gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgMik7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMl0gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgNCk7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bM10gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgNik7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzBdID0gYmZkX2dldGIxNiAodGVtcCArIDYpOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzFdID0gYmZkX2dldGIxNiAodGVtcCArIDQpOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzJdID0gYmZkX2dldGIxNiAodGVtcCArIDIpOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzNdID0gYmZkX2dldGIxNiAodGVtcCk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKm5ld25hbWU7Ci0JCSAgICBzZWdUIG5ld19zZWc7Ci0KLQkJICAgIC8qIFN3aXRjaCB0byB0aGUgcmlnaHQgc2VjdGlvbi4gICovCi0JCSAgICBzZWcgPSBub3dfc2VnOwotCQkgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKLQkJICAgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICAgIHsKLQkJICAgICAgZGVmYXVsdDogLyogdW51c2VkIGRlZmF1bHQgY2FzZSBhdm9pZHMgd2FybmluZ3MuICAqLwotCQkgICAgICBjYXNlICdMJzoKLQkJCW5ld25hbWUgPSBSREFUQV9TRUNUSU9OX05BTUU7Ci0JCQlpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBnX3N3aXRjaF92YWx1ZSA+PSA4KQotCQkJICBuZXduYW1lID0gIi5saXQ4IjsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdGJzoKLQkJCW5ld25hbWUgPSBSREFUQV9TRUNUSU9OX05BTUU7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnbCc6Ci0JCQlhc3NlcnQgKCFVU0VfR0xPQkFMX1BPSU5URVJfT1BUCi0JCQkJfHwgZ19zd2l0Y2hfdmFsdWUgPj0gNCk7Ci0JCQluZXduYW1lID0gIi5saXQ0IjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBuZXdfc2VnID0gc3Vic2VnX25ldyAobmV3bmFtZSwgKHN1YnNlZ1QpIDApOwotCQkgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkJICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5ld19zZWcsCi0JCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCQkgICAgICB8IFNFQ19MT0FECi0JCQkJCSAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgIHwgU0VDX0RBVEEpKTsKLQkJICAgIGZyYWdfYWxpZ24gKCphcmdzID09ICdsJyA/IDIgOiAzLCAwLCAwKTsKLQkJICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJCSYmIHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKLQkJICAgICAgcmVjb3JkX2FsaWdubWVudCAobmV3X3NlZywgNCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5ld19zZWcsICphcmdzID09ICdsJyA/IDIgOiAzKTsKLQkJICAgIGlmIChzZWcgPT0gbm93X3NlZykKLQkJICAgICAgYXNfYmFkIChfKCJDYW4ndCB1c2UgZmxvYXRpbmcgcG9pbnQgaW5zbiBpbiB0aGlzIHNlY3Rpb24iKSk7Ci0KLQkJICAgIC8qIFNldCB0aGUgYXJndW1lbnQgdG8gdGhlIGN1cnJlbnQgYWRkcmVzcyBpbiB0aGUKLQkJICAgICAgIHNlY3Rpb24uICAqLwotCQkgICAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fc3ltYm9sOwotCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sID0KLQkJICAgICAgc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsCi0JCQkJICAodmFsdWVUKSBmcmFnX25vd19maXggKCksIGZyYWdfbm93KTsKLQkJICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0KLQkJICAgIC8qIFB1dCB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludG8gdGhlIHNlY3Rpb24uICAqLwotCQkgICAgcCA9IGZyYWdfbW9yZSAoKGludCkgbGVuZ3RoKTsKLQkJICAgIG1lbWNweSAocCwgdGVtcCwgbGVuZ3RoKTsKLQotCQkgICAgLyogU3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNlY3Rpb24uICAqLwotCQkgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnaSc6CQkvKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0JICAgIGNhc2UgJ2onOgkJLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KLQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKLQkgICAgICBjID0gbXlfZ2V0U21hbGxFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGlmIChjICE9ICdcMCcpCi0JCXsKLQkJICBpZiAoYyAhPSAnbCcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCQlpbW1fZXhwci5YX2FkZF9udW1iZXIgPQotCQkJICAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQkJICAgICAgZWxzZSBpZiAoYyA9PSAnaCcpCi0JCQl7Ci0JCQkgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2X1M7Ci0JCQkgIGltbV91bm1hdGNoZWRfaGkgPSB0cnVlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlpbW1fcmVsb2MgPSBCRkRfUkVMT0NfSEkxNjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOwotCQl9Ci0JICAgICAgaWYgKCphcmdzID09ICdpJykKLQkJewotCQkgIGlmICgoYyA9PSAnXDAnICYmIGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgICAgfHwgKChpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgotCQkJICAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCQkJYnJlYWs7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2JpZykKLQkJCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7Ci0JCSAgICAgIGVsc2UKLQkJCWFzX2JhZCAoXygiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIDAuLjY1NTM1IikpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW50IG1vcmU7Ci0JCSAgb2Zmc2V0VCBtYXg7Ci0KLQkJICAvKiBUaGUgdXBwZXIgYm91bmQgc2hvdWxkIGJlIDB4ODAwMCwgYnV0Ci0JCSAgICAgdW5mb3J0dW5hdGVseSB0aGUgTUlQUyBhc3NlbWJsZXIgYWNjZXB0cyBudW1iZXJzCi0JCSAgICAgZnJvbSAweDgwMDAgdG8gMHhmZmZmIGFuZCBzaWduIGV4dGVuZHMgdGhlbSwgYW5kCi0JCSAgICAgd2Ugd2FudCB0byBiZSBjb21wYXRpYmxlLiAgV2Ugb25seSBwZXJtaXQgdGhpcwotCQkgICAgIGV4dGVuZGVkIHJhbmdlIGZvciBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdAotCQkgICAgIHByb3ZpZGUgYW55IGZ1cnRoZXIgYWx0ZXJuYXRlcywgc2luY2UgdGhvc2UKLQkJICAgICBhbHRlcm5hdGVzIG1heSBoYW5kbGUgb3RoZXIgY2FzZXMuICBQZW9wbGUgc2hvdWxkCi0JCSAgICAgdXNlIHRoZSBudW1iZXJzIHRoZXkgbWVhbiwgcmF0aGVyIHRoYW4gcmVseWluZyBvbgotCQkgICAgIGEgbXlzdGVyaW91cyBzaWduIGV4dGVuc2lvbi4gICovCi0JCSAgbW9yZSA9IChpbnNuICsgMSA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU10gJiYKLQkJCSAgc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpID09IDApOwotCQkgIGlmIChtb3JlKQotCQkgICAgbWF4ID0gMHg4MDAwOwotCQkgIGVsc2UKLQkJICAgIG1heCA9IDB4MTAwMDA7Ci0JCSAgaWYgKChjID09ICdcMCcgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgICB8fCAoKGltbV9leHByLlhfYWRkX251bWJlciA8IC0weDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltbV9leHByLlhfYWRkX251bWJlciA+PSBtYXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgfHwgKG1vcmUKLQkJCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMAotCQkJICAmJiBtaXBzX29wdHMuaXNhID49IDMKLQkJCSAgJiYgaW1tX2V4cHIuWF91bnNpZ25lZAotCQkJICAmJiBzaXplb2YgKGltbV9leHByLlhfYWRkX251bWJlcikgPD0gNCkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChtb3JlKQotCQkJYnJlYWs7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2JpZykKLQkJCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7Ci0JCSAgICAgIGVsc2UKLQkJCWFzX2JhZCAoXygiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIC0zMjc2OC4uMzI3NjciKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnbyc6CQkvKiAxNiBiaXQgb2Zmc2V0ICovCi0JICAgICAgYyA9IG15X2dldFNtYWxsRXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQotCSAgICAgIC8qIElmIHRoaXMgdmFsdWUgd29uJ3QgZml0IGludG8gYSAxNiBiaXQgb2Zmc2V0LCB0aGVuIGdvCi0JCSBmaW5kIGEgbWFjcm8gdGhhdCB3aWxsIGdlbmVyYXRlIHRoZSAzMiBiaXQgb2Zmc2V0Ci0JCSBjb2RlIHBhdHRlcm4uICBBcyBhIHNwZWNpYWwgaGFjaywgd2UgYWNjZXB0IHRoZQotCQkgZGlmZmVyZW5jZSBvZiB0d28gbG9jYWwgc3ltYm9scyBhcyBhIGNvbnN0YW50LiAgVGhpcwotCQkgaXMgcmVxdWlyZWQgdG8gc3VwcG9zZSBlbWJlZGRlZCBQSUMgc3dpdGNoZXMsIHdoaWNoCi0JCSB1c2UgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggbG9va3MgbGlrZQotCQkgICAgIGx3ICQ0LCRMMTItJExTMTIoJDQpCi0JCSBUaGUgcHJvYmxlbSB3aXRoIGhhbmRsaW5nIHRoaXMgaW4gYSBtb3JlIGdlbmVyYWwKLQkJIGZhc2hpb24gaXMgdGhhdCB0aGUgbWFjcm8gZnVuY3Rpb24gZG9lc24ndCBleHBlY3QgdG8KLQkJIHNlZSBhbnl0aGluZyB3aGljaCBjYW4gYmUgaGFuZGxlZCBpbiBhIHNpbmdsZQotCQkgY29uc3RhbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChjID09IDAKLQkJICAmJiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCSAgICAgIHx8IG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDgwMDAKLQkJICAgICAgfHwgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCkKLQkJICAmJiAobWlwc19waWMgIT0gRU1CRURERURfUElDCi0JCSAgICAgIHx8IG9mZnNldF9leHByLlhfb3AgIT0gT19zdWJ0cmFjdAotCQkgICAgICB8fCBub3dfc2VnICE9IHRleHRfc2VjdGlvbgotCQkgICAgICB8fCAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JCQkgICE9IHRleHRfc2VjdGlvbikpKQotCQlicmVhazsKLQotCSAgICAgIGlmIChjID09ICdoJyB8fCBjID09ICdIJykKLQkJewotCQkgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICBicmVhazsKLQkJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPQotCQkgICAgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0JCX0KLQkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAncCc6CQkvKiBwYyByZWxhdGl2ZSBvZmZzZXQgKi8KLQkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfMTZfUENSRUxfUzI7Ci0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAndSc6CQkvKiB1cHBlciAxNiBiaXRzICovCi0JICAgICAgYyA9IG15X2dldFNtYWxsRXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKLQkgICAgICBpZiAoYykKLQkJewotCQkgIGlmIChjICE9ICdsJykKLQkJICAgIHsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJCWltbV9leHByLlhfYWRkX251bWJlciA9Ci0JCQkgIChpbW1fZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQkgICAgICBlbHNlIGlmIChjID09ICdoJykKLQkJCXsKLQkJCSAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0hJMTZfUzsKLQkJCSAgaW1tX3VubWF0Y2hlZF9oaSA9IHRydWU7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweGZmZmY7Ci0JCX0KLQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgJiYgKGltbV9leHByLlhfYWRkX251bWJlciA8IDAKLQkJICAgICAgfHwgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDB4MTAwMDApKQotCQlhc19iYWQgKF8oImx1aSBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAwLi42NTUzNSIpKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYSc6CQkvKiAyNiBiaXQgYWRkcmVzcyAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTX0pNUDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdOJzoJCS8qIDMgYml0IGJyYW5jaCBjb25kaXRpb24gY29kZSAqLwotCSAgICBjYXNlICdNJzoJCS8qIDMgYml0IGNvbXBhcmUgY29uZGl0aW9uIGNvZGUgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiRmY2MiLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgcmVnbm8gPSAwOwotCSAgICAgIGRvCi0JCXsKLQkJICByZWdubyAqPSAxMDsKLQkJICByZWdubyArPSAqcyAtICcwJzsKLQkJICArK3M7Ci0JCX0KLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0JICAgICAgaWYgKHJlZ25vID4gNykKLQkJYXNfYmFkIChfKCJpbnZhbGlkIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyICRmY2MlZCIpLCByZWdubyk7Ci0JICAgICAgaWYgKCphcmdzID09ICdOJykKLQkJaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE9QX1NIX0JDQzsKLQkgICAgICBlbHNlCi0JCWlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBPUF9TSF9DQ0M7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgY2hhciA9ICclYydcbiIpLCAqYXJncyk7Ci0JICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogQXJncyBkb24ndCBtYXRjaC4gICovCi0gICAgICBpZiAoaW5zbiArIDEgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdICYmCi0JICAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCXsKLQkgICsraW5zbjsKLQkgIHMgPSBhcmdzU3RhcnQ7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpbnNuX2Vycm9yID0gXygiaWxsZWdhbCBvcGVyYW5kcyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIGFzc2VtYmxlcyBhbiBpbnN0cnVjdGlvbiBpbnRvIGl0cyBiaW5hcnkgZm9ybWF0IHdoZW4KLSAgIGFzc2VtYmxpbmcgZm9yIHRoZSBtaXBzMTYuICBBcyBhIHNpZGUgZWZmZWN0LCBpdCBzZXRzIG9uZSBvZiB0aGUKLSAgIGdsb2JhbCB2YXJpYWJsZXMgaW1tX3JlbG9jIG9yIG9mZnNldF9yZWxvYyB0byB0aGUgdHlwZSBvZgotICAgcmVsb2NhdGlvbiB0byBkbyBpZiBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIGFuIGFkZHJlc3MgZXhwcmVzc2lvbi4KLSAgIEl0IGFsc28gc2V0cyBtaXBzMTZfc21hbGwgYW5kIG1pcHMxNl9leHQgaWYgdGhlIHVzZXIgZXhwbGljaXRseQotICAgcmVxdWVzdGVkIGEgc21hbGwgb3IgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwczE2X2lwIChzdHIsIGlwKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotewotICBjaGFyICpzOwotICBjb25zdCBjaGFyICphcmdzOwotICBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NzdGFydDsKLSAgdW5zaWduZWQgaW50IHJlZ25vOwotICB1bnNpZ25lZCBpbnQgbGFzdHJlZ25vID0gMDsKLSAgY2hhciAqc19yZXNldDsKLQotICBpbnNuX2Vycm9yID0gTlVMTDsKLQotICBtaXBzMTZfc21hbGwgPSBmYWxzZTsKLSAgbWlwczE2X2V4dCA9IGZhbHNlOwotCi0gIGZvciAocyA9IHN0cjsgaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotICAgIDsKLSAgc3dpdGNoICgqcykKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIGlmIChzWzFdID09ICd0JyAmJiBzWzJdID09ICcgJykKLQl7Ci0JICAqcyA9ICdcMCc7Ci0JICBtaXBzMTZfc21hbGwgPSB0cnVlOwotCSAgcyArPSAzOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnZScgJiYgc1syXSA9PSAnICcpCi0JewotCSAgKnMgPSAnXDAnOwotCSAgbWlwczE2X2V4dCA9IHRydWU7Ci0JICBzICs9IDM7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnNuX2Vycm9yID0gXygidW5rbm93biBvcGNvZGUiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfb3B0cy5ub2F1dG9leHRlbmQgJiYgISBtaXBzMTZfZXh0KQotICAgIG1pcHMxNl9zbWFsbCA9IHRydWU7Ci0KLSAgaWYgKChpbnNuID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG1pcHMxNl9vcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluc25fZXJyb3IgPSBfKCJ1bnJlY29nbml6ZWQgb3Bjb2RlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFyZ3NzdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgYXNzZXJ0IChzdHJjbXAgKGluc24tPm5hbWUsIHN0cikgPT0gMCk7Ci0KLSAgICAgIGlwLT5pbnNuX21vID0gaW5zbjsKLSAgICAgIGlwLT5pbnNuX29wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgaXAtPnVzZV9leHRlbmQgPSBmYWxzZTsKLSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBvZmZzZXRfZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczsgMTsgKythcmdzKQotCXsKLQkgIGludCBjOwotCi0JICBpZiAoKnMgPT0gJyAnKQotCSAgICArK3M7Ci0KLQkgIC8qIEluIHRoaXMgc3dpdGNoIHN0YXRlbWVudCB3ZSBjYWxsIGJyZWFrIGlmIHdlIGRpZCBub3QgZmluZAotICAgICAgICAgICAgIGEgbWF0Y2gsIGNvbnRpbnVlIGlmIHdlIGRpZCBmaW5kIGEgbWF0Y2gsIG9yIHJldHVybiBpZiB3ZQotICAgICAgICAgICAgIGFyZSBkb25lLiAgKi8KLQotCSAgYyA9ICphcmdzOwotCSAgc3dpdGNoIChjKQotCSAgICB7Ci0JICAgIGNhc2UgJ1wwJzoKLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJewotCQkgIC8qIFN0dWZmIHRoZSBpbW1lZGlhdGUgdmFsdWUgaW4gbm93LCBpZiB3ZSBjYW4uICAqLwotCQkgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkJICAgICAgJiYgaW1tX3JlbG9jID4gQkZEX1JFTE9DX1VOVVNFRAotCQkgICAgICAmJiBpbnNuLT5waW5mbyAhPSBJTlNOX01BQ1JPKQotCQkgICAgewotCQkgICAgICBtaXBzMTZfaW1tZWQgKChjaGFyICopIE5VTEwsIDAsCi0JCQkJICAgIGltbV9yZWxvYyAtIEJGRF9SRUxPQ19VTlVTRUQsCi0JCQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciwgdHJ1ZSwgbWlwczE2X3NtYWxsLAotCQkJCSAgICBtaXBzMTZfZXh0LCAmaXAtPmluc25fb3Bjb2RlLAotCQkJCSAgICAmaXAtPnVzZV9leHRlbmQsICZpcC0+ZXh0ZW5kKTsKLQkJICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCQkgICAgfQotCi0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnLCc6Ci0JICAgICAgaWYgKCpzKysgPT0gYykKLQkJY29udGludWU7Ci0JICAgICAgcy0tOwotCSAgICAgIHN3aXRjaCAoKisrYXJncykKLQkJewotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JYOwotCQkgIGNvbnRpbnVlOwotCQljYXNlICd3JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JZOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKCc6Ci0JICAgIGNhc2UgJyknOgotCSAgICAgIGlmICgqcysrID09IGMpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3YnOgotCSAgICBjYXNlICd3JzoKLQkgICAgICBpZiAoc1swXSAhPSAnJCcpCi0JCXsKLQkJICBpZiAoYyA9PSAndicpCi0JCSAgICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JYOwotCQkgIGVsc2UKLQkJICAgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgTUlQUzE2T1BfU0hfUlk7Ci0JCSAgKythcmdzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ3knOgotCSAgICBjYXNlICd6JzoKLQkgICAgY2FzZSAnWic6Ci0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICdTJzoKLQkgICAgY2FzZSAnUic6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICdZJzoKLQkgICAgICBpZiAoc1swXSAhPSAnJCcpCi0JCWJyZWFrOwotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc1sxXSkpCi0JCXsKLQkJICArK3M7Ci0JCSAgcmVnbm8gPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vICo9IDEwOwotCQkgICAgICByZWdubyArPSAqcyAtICcwJzsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKTsKLQkJICBpZiAocmVnbm8gPiAzMSkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKLQkJICAgICAgcmVnbm8gPSAyOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHNbMV0gPT0gJ2YnICYmIHNbMl0gPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIHJlZ25vID0gRlA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAncycgJiYgc1syXSA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgcmVnbm8gPSBTUDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzWzFdID09ICdnJyAmJiBzWzJdID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICByZWdubyA9IEdQOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2EnICYmIHNbMl0gPT0gJ3QnKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIHJlZ25vID0gQVQ7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnaycgJiYgc1syXSA9PSAndCcgJiYgc1szXSA9PSAnMCcpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gNDsKLQkJICAgICAgcmVnbm8gPSBLVDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnaycgJiYgc1syXSA9PSAndCcgJiYgc1szXSA9PSAnMScpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gNDsKLQkJICAgICAgcmVnbm8gPSBLVDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCSsrczsKLQkgICAgICBpZiAoYXJnc1sxXSAhPSAqcykKLQkJewotCQkgIGlmIChjID09ICd2JyB8fCBjID09ICd3JykKLQkJICAgIHsKLQkJICAgICAgcmVnbm8gPSBtaXBzMTZfdG9fMzJfcmVnX21hcFtsYXN0cmVnbm9dOwotCQkgICAgICBzID0gc19yZXNldDsKLQkJICAgICAgYXJncysrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzd2l0Y2ggKGMpCi0JCXsKLQkJY2FzZSAneCc6Ci0JCWNhc2UgJ3knOgotCQljYXNlICd6JzoKLQkJY2FzZSAndic6Ci0JCWNhc2UgJ3cnOgotCQljYXNlICdaJzoKLQkJICByZWdubyA9IG1pcHMzMl90b18xNl9yZWdfbWFwW3JlZ25vXTsKLQkJICBicmVhazsKLQotCQljYXNlICcwJzoKLQkJICBpZiAocmVnbm8gIT0gMCkKLQkJICAgIHJlZ25vID0gSUxMRUdBTF9SRUc7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUyc6Ci0JCSAgaWYgKHJlZ25vICE9IFNQKQotCQkgICAgcmVnbm8gPSBJTExFR0FMX1JFRzsKLQkJICBicmVhazsKLQotCQljYXNlICdSJzoKLQkJICBpZiAocmVnbm8gIT0gUkEpCi0JCSAgICByZWdubyA9IElMTEVHQUxfUkVHOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1gnOgotCQljYXNlICdZJzoKLQkJICBpZiAocmVnbm8gPT0gQVQgJiYgISBtaXBzX29wdHMubm9hdCkKLQkJICAgIGFzX3dhcm4gKF8oInVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGludGVybmFsRXJyb3IgKCk7Ci0JCX0KLQotCSAgICAgIGlmIChyZWdubyA9PSBJTExFR0FMX1JFRykKLQkJYnJlYWs7Ci0KLQkgICAgICBzd2l0Y2ggKGMpCi0JCXsKLQkJY2FzZSAneCc6Ci0JCWNhc2UgJ3YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SWDsKLQkJICBicmVhazsKLQkJY2FzZSAneSc6Ci0JCWNhc2UgJ3cnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SWTsKLQkJICBicmVhazsKLQkJY2FzZSAneic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JaOwotCQkgIGJyZWFrOwotCQljYXNlICdaJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfTU9WRTMyWjsKLQkJY2FzZSAnMCc6Ci0JCWNhc2UgJ1MnOgotCQljYXNlICdSJzoKLQkJICBicmVhazsKLQkJY2FzZSAnWCc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JFR1IzMjsKLQkJICBicmVhazsKLQkJY2FzZSAnWSc6Ci0JCSAgcmVnbm8gPSAoKHJlZ25vICYgNykgPDwgMikgfCAoKHJlZ25vICYgMHgxOCkgPj4gMyk7Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JFRzMyUjsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBpbnRlcm5hbEVycm9yICgpOwotCQl9Ci0KLQkgICAgICBsYXN0cmVnbm8gPSByZWdubzsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdQJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiRwYyIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc8JzoKLQkgICAgY2FzZSAnPic6Ci0JICAgIGNhc2UgJ1snOgotCSAgICBjYXNlICddJzoKLQkgICAgY2FzZSAnNCc6Ci0JICAgIGNhc2UgJzUnOgotCSAgICBjYXNlICdIJzoKLQkgICAgY2FzZSAnVyc6Ci0JICAgIGNhc2UgJ0QnOgotCSAgICBjYXNlICdqJzoKLQkgICAgY2FzZSAnOCc6Ci0JICAgIGNhc2UgJ1YnOgotCSAgICBjYXNlICdDJzoKLQkgICAgY2FzZSAnVSc6Ci0JICAgIGNhc2UgJ2snOgotCSAgICBjYXNlICdLJzoKLQkgICAgICBpZiAoc1swXSA9PSAnJScKLQkJICAmJiBzdHJuY21wIChzICsgMSwgImdwcmVsKCIsIHNpemVvZiAiZ3ByZWwoIiAtIDEpID09IDApCi0JCXsKLQkJICAvKiBUaGlzIGlzICVncHJlbChTWU1CT0wpLiAgV2UgbmVlZCB0byByZWFkIFNZTUJPTCwKLSAgICAgICAgICAgICAgICAgICAgIGFuZCBnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgcmVsb2MuICBJZiB0aGUgdGV4dAotICAgICAgICAgICAgICAgICAgICAgaW5zaWRlICVncHJlbCBpcyBub3QgYSBzeW1ib2wgbmFtZSB3aXRoIGFuCi0gICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBvZmZzZXQsIHRoZW4gd2UgZ2VuZXJhdGUgYSBub3JtYWwgcmVsb2MKLSAgICAgICAgICAgICAgICAgICAgIGFuZCB3aWxsIHByb2JhYmx5IGZhaWwgbGF0ZXIuICAqLwotCQkgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyArIHNpemVvZiAiJWdwcmVsIiAtIDEpOwotCQkgIGlmIChpbW1fZXhwci5YX29wID09IE9fc3ltYm9sKQotCQkgICAgewotCQkgICAgICBtaXBzMTZfZXh0ID0gdHJ1ZTsKLQkJICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX01JUFMxNl9HUFJFTDsKLQkJICAgICAgcyA9IGV4cHJfZW5kOwotCQkgICAgICBpcC0+dXNlX2V4dGVuZCA9IHRydWU7Ci0JCSAgICAgIGlwLT5leHRlbmQgPSAwOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEp1c3QgcGljayB1cCBhIG5vcm1hbCBleHByZXNzaW9uLiAgKi8KLQkJICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCQl9Ci0KLQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX3JlZ2lzdGVyKQotCQl7Ci0JCSAgLyogV2hhdCB3ZSB0aG91Z2h0IHdhcyBhbiBleHByZXNzaW9uIHR1cm5lZCBvdXQgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlIGEgcmVnaXN0ZXIuICAqLwotCi0JCSAgaWYgKHNbMF0gPT0gJygnICYmIGFyZ3NbMV0gPT0gJygnKQotCQkgICAgewotCQkgICAgICAvKiBJdCBsb29rcyBsaWtlIHRoZSBleHByZXNzaW9uIHdhcyBvbWl0dGVkCi0JCQkgYmVmb3JlIGEgcmVnaXN0ZXIgaW5kaXJlY3Rpb24sIHdoaWNoIG1lYW5zCi0JCQkgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcyBpbXBsaWNpdGx5IHplcm8uICBXZQotCQkJIHN0aWxsIHNldCB1cCBpbW1fZXhwciwgc28gdGhhdCB3ZSBoYW5kbGUKLQkJCSBleHBsaWNpdCBleHRlbnNpb25zIGNvcnJlY3RseS4gICovCi0JCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQkgICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCQkgICAgICBpbW1fcmVsb2MgPSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEICsgYzsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgLyogV2UgbmVlZCB0byByZWxheCB0aGlzIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpbW1fcmVsb2MgPSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEICsgYzsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAncCc6Ci0JICAgIGNhc2UgJ3EnOgotCSAgICBjYXNlICdBJzoKLQkgICAgY2FzZSAnQic6Ci0JICAgIGNhc2UgJ0UnOgotCSAgICAgIC8qIFdlIHVzZSBvZmZzZXRfcmVsb2MgcmF0aGVyIHRoYW4gaW1tX3JlbG9jIGZvciB0aGUgUEMKLSAgICAgICAgICAgICAgICAgcmVsYXRpdmUgb3BlcmFuZHMuICBUaGlzIGxldHMgbWFjcm9zIHdpdGggYm90aAotICAgICAgICAgICAgICAgICBpbW1lZGlhdGUgYW5kIGFkZHJlc3Mgb3BlcmFuZHMgd29yayBjb3JyZWN0bHkuICAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0KLQkgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3JlZ2lzdGVyKQotCQlicmVhazsKLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gcmVsYXggdGhpcyBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgb2Zmc2V0X3JlbG9jID0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJzYnOgkJLyogYnJlYWsgY29kZSAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiA2MykKLQkJewotCQkgIGFzX3dhcm4gKF8oIkludmFsaWQgdmFsdWUgZm9yIGAlcycgKCVsdSkiKSwKLQkJCSAgIGlwLT5pbnNuX21vLT5uYW1lLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlcik7Ci0JCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDB4M2Y7Ci0JCX0KLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IE1JUFMxNk9QX1NIX0lNTTY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdhJzoJCS8qIDI2IGJpdCBhZGRyZXNzICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX01JUFMxNl9KTVA7Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIDw8PSAxNjsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdsJzoJCS8qIHJlZ2lzdGVyIGxpc3QgZm9yIGVudHJ5IG1hY3JvICovCi0JICAgIGNhc2UgJ0wnOgkJLyogcmVnaXN0ZXIgbGlzdCBmb3IgZXhpdCBtYWNybyAqLwotCSAgICAgIHsKLQkJaW50IG1hc2s7Ci0KLQkJaWYgKGMgPT0gJ2wnKQotCQkgIG1hc2sgPSAwOwotCQllbHNlCi0JCSAgbWFzayA9IDcgPDwgMzsKLQkJd2hpbGUgKCpzICE9ICdcMCcpCi0JCSAgewotCQkgICAgaW50IGZyZWcsIHJlZzEsIHJlZzI7Ci0KLQkJICAgIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJywnKQotCQkgICAgICArK3M7Ci0JCSAgICBpZiAoKnMgIT0gJyQnKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oImNhbid0IHBhcnNlIHJlZ2lzdGVyIGxpc3QiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgKytzOwotCQkgICAgaWYgKCpzICE9ICdmJykKLQkJICAgICAgZnJlZyA9IDA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWZyZWcgPSAxOwotCQkJKytzOwotCQkgICAgICB9Ci0JCSAgICByZWcxID0gMDsKLQkJICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkgICAgICB7Ci0JCQlyZWcxICo9IDEwOwotCQkJcmVnMSArPSAqcyAtICcwJzsKLQkJCSsrczsKLQkJICAgICAgfQotCQkgICAgaWYgKCpzID09ICcgJykKLQkJICAgICAgKytzOwotCQkgICAgaWYgKCpzICE9ICctJykKLQkJICAgICAgcmVnMiA9IHJlZzE7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCSsrczsKLQkJCWlmICgqcyAhPSAnJCcpCi0JCQkgIGJyZWFrOwotCQkJKytzOwotCQkJaWYgKGZyZWcpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJ2YnKQotCQkJICAgICAgKytzOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlhc19iYWQgKF8oImludmFsaWQgcmVnaXN0ZXIgbGlzdCIpKTsKLQkJCQlicmVhazsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJcmVnMiA9IDA7Ci0JCQl3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJCSAgewotCQkJICAgIHJlZzIgKj0gMTA7Ci0JCQkgICAgcmVnMiArPSAqcyAtICcwJzsKLQkJCSAgICArK3M7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgaWYgKGZyZWcgJiYgcmVnMSA9PSAwICYmIHJlZzIgPT0gMCAmJiBjID09ICdMJykKLQkJICAgICAgewotCQkJbWFzayAmPSB+ICg3IDw8IDMpOwotCQkJbWFzayB8PSA1IDw8IDM7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGZyZWcgJiYgcmVnMSA9PSAwICYmIHJlZzIgPT0gMSAmJiBjID09ICdMJykKLQkJICAgICAgewotCQkJbWFzayAmPSB+ICg3IDw8IDMpOwotCQkJbWFzayB8PSA2IDw8IDM7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHJlZzEgPT0gNCAmJiByZWcyID49IDQgJiYgcmVnMiA8PSA3ICYmIGMgIT0gJ0wnKQotCQkgICAgICBtYXNrIHw9IChyZWcyIC0gMykgPDwgMzsKLQkJICAgIGVsc2UgaWYgKHJlZzEgPT0gMTYgJiYgcmVnMiA+PSAxNiAmJiByZWcyIDw9IDE3KQotCQkgICAgICBtYXNrIHw9IChyZWcyIC0gMTUpIDw8IDE7Ci0JCSAgICBlbHNlIGlmIChyZWcxID09IDMxICYmIHJlZzIgPT0gMzEpCi0JCSAgICAgIG1hc2sgfD0gMTsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkJLyogVGhlIG1hc2sgaXMgZmlsbGVkIGluIGluIHRoZSBvcGNvZGUgdGFibGUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgIGJlbmVmaXQgb2YgdGhlIGRpc2Fzc2VtYmxlci4gIFdlIHJlbW92ZSBpdCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICBhcHBseWluZyB0aGUgYWN0dWFsIG1hc2suICAqLwotCQlpcC0+aW5zbl9vcGNvZGUgJj0gfiAoKDcgPDwgMykgPDwgTUlQUzE2T1BfU0hfSU1NNik7Ci0JCWlwLT5pbnNuX29wY29kZSB8PSBtYXNrIDw8IE1JUFMxNk9QX1NIX0lNTTY7Ci0JICAgICAgfQotCSAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdlJzoJCS8qIGV4dGVuZCBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDB4N2ZmKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIpLAotCQkJICAgaXAtPmluc25fbW8tPm5hbWUsCi0JCQkgICAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHg3ZmY7Ci0JCX0KLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBpbnRlcm5hbEVycm9yICgpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHMxNl9vcGNvZGVzW2JmZF9taXBzMTZfbnVtX29wY29kZXNdICYmCi0JICBzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkgPT0gMCkKLQl7Ci0JICArK2luc247Ci0JICBzID0gYXJnc3N0YXJ0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpbnNuX2Vycm9yID0gXygiaWxsZWdhbCBvcGVyYW5kcyIpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiB3ZSBrbm93IGFib3V0IGEgbWlwczE2IGltbWVkaWF0ZQotICAgYXJndW1lbnQgdHlwZS4gICovCi0KLXN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZAotewotICAvKiBUaGUgdHlwZSBjb2RlIHVzZWQgaW4gdGhlIGFyZ3VtZW50IHN0cmluZyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaW50IHR5cGU7Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgc2hvcnQgZm9ybSBvZiB0aGUgb3Bjb2RlLiAgKi8KLSAgaW50IG5iaXRzOwotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGV4dGVuZGVkIGZvcm0gb2YgdGhlIG9wY29kZS4gICovCi0gIGludCBleHRiaXRzOwotICAvKiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzaG9ydCBmb3JtIGlzIHNoaWZ0ZWQgd2hlbiBpdCBpcyB1c2VkOwotICAgICBmb3IgZXhhbXBsZSwgdGhlIHN3IGluc3RydWN0aW9uIGhhcyBhIHNoaWZ0IGNvdW50IG9mIDIuICAqLwotICBpbnQgc2hpZnQ7Ci0gIC8qIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHNob3J0IGZvcm0gaXMgc2hpZnRlZCB3aGVuIGl0IGlzIHN0b3JlZAotICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbiBjb2RlLiAgKi8KLSAgaW50IG9wX3NoaWZ0OwotICAvKiBOb24temVybyBpZiB0aGUgc2hvcnQgZm9ybSBpcyB1bnNpZ25lZC4gICovCi0gIGludCB1bnNwOwotICAvKiBOb24temVybyBpZiB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1bnNpZ25lZC4gICovCi0gIGludCBleHR1OwotICAvKiBOb24temVybyBpZiB0aGUgdmFsdWUgaXMgUEMgcmVsYXRpdmUuICAqLwotICBpbnQgcGNyZWw7Ci19OwotCi0vKiBUaGUgbWlwczE2IGltbWVkaWF0ZSBvcGVyYW5kIHR5cGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCBtaXBzMTZfaW1tZWRfb3BlcmFuZHNbXSA9Ci17Ci0gIHsgJzwnLCAgMywgIDUsIDAsIE1JUFMxNk9QX1NIX1JaLCAgIDEsIDEsIDAgfSwKLSAgeyAnPicsICAzLCAgNSwgMCwgTUlQUzE2T1BfU0hfUlgsICAgMSwgMSwgMCB9LAotICB7ICdbJywgIDMsICA2LCAwLCBNSVBTMTZPUF9TSF9SWiwgICAxLCAxLCAwIH0sCi0gIHsgJ10nLCAgMywgIDYsIDAsIE1JUFMxNk9QX1NIX1JYLCAgIDEsIDEsIDAgfSwKLSAgeyAnNCcsICA0LCAxNSwgMCwgTUlQUzE2T1BfU0hfSU1NNCwgMCwgMCwgMCB9LAotICB7ICc1JywgIDUsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCi0gIHsgJ0gnLCAgNSwgMTYsIDEsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDAgfSwKLSAgeyAnVycsICA1LCAxNiwgMiwgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMCB9LAotICB7ICdEJywgIDUsIDE2LCAzLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCi0gIHsgJ2onLCAgNSwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTUsIDAsIDAsIDAgfSwKLSAgeyAnOCcsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMCwgMCB9LAotICB7ICdWJywgIDgsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAwLCAwIH0sCi0gIHsgJ0MnLCAgOCwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDAgfSwKLSAgeyAnVScsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMSwgMCB9LAotICB7ICdrJywgIDgsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAwIH0sCi0gIHsgJ0snLCAgOCwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTgsIDAsIDAsIDAgfSwKLSAgeyAncCcsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMCwgMCwgMSB9LAotICB7ICdxJywgMTEsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAxIH0sCi0gIHsgJ0EnLCAgOCwgMTYsIDIsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDEgfSwKLSAgeyAnQicsICA1LCAxNiwgMywgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMSB9LAotICB7ICdFJywgIDUsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAxIH0KLX07Ci0KLSNkZWZpbmUgTUlQUzE2X05VTV9JTU1FRCBcCi0gIChzaXplb2YgbWlwczE2X2ltbWVkX29wZXJhbmRzIC8gc2l6ZW9mIG1pcHMxNl9pbW1lZF9vcGVyYW5kc1swXSkKLQotLyogSGFuZGxlIGEgbWlwczE2IGluc3RydWN0aW9uIHdpdGggYW4gaW1tZWRpYXRlIHZhbHVlLiAgVGhpcyBvcidzIHRoZQotICAgc21hbGwgaW1tZWRpYXRlIHZhbHVlIGludG8gKklOU04uICBJdCBzZXRzICpVU0VfRVhURU5EIHRvIGluZGljYXRlCi0gICB3aGV0aGVyIGFuIGV4dGVuZGVkIHZhbHVlIGlzIG5lZWRlZDsgaWYgb25lIGlzIG5lZWRlZCwgaXQgc2V0cwotICAgKkVYVEVORCB0byB0aGUgdmFsdWUuICBUaGUgYXJndW1lbnQgdHlwZSBpcyBUWVBFLiAgVGhlIHZhbHVlIGlzIFZBTC4KLSAgIElmIFNNQUxMIGlzIHRydWUsIGFuIHVuZXh0ZW5kZWQgb3Bjb2RlIHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4KLSAgIElmIEVYVCBpcyB0cnVlLCBhbiBleHRlbmRlZCBvcGNvZGUgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgSWYKLSAgIFdBUk4gaXMgdHJ1ZSwgd2FybiBpZiBFWFQgZG9lcyBub3QgbWF0Y2ggcmVhbGl0eS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzMTZfaW1tZWQgKGZpbGUsIGxpbmUsIHR5cGUsIHZhbCwgd2Fybiwgc21hbGwsIGV4dCwgaW5zbiwgdXNlX2V4dGVuZCwKLQkgICAgICBleHRlbmQpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBpbnQgdHlwZTsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGJvb2xlYW4gd2FybjsKLSAgICAgYm9vbGVhbiBzbWFsbDsKLSAgICAgYm9vbGVhbiBleHQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmluc247Ci0gICAgIGJvb2xlYW4gKnVzZV9leHRlbmQ7Ci0gICAgIHVuc2lnbmVkIHNob3J0ICpleHRlbmQ7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCAqb3A7Ci0gIGludCBtaW50aW55LCBtYXh0aW55OwotICBib29sZWFuIG5lZWRleHQ7Ci0KLSAgb3AgPSBtaXBzMTZfaW1tZWRfb3BlcmFuZHM7Ci0gIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQotICAgIHsKLSAgICAgICsrb3A7Ci0gICAgICBhc3NlcnQgKG9wIDwgbWlwczE2X2ltbWVkX29wZXJhbmRzICsgTUlQUzE2X05VTV9JTU1FRCk7Ci0gICAgfQotCi0gIGlmIChvcC0+dW5zcCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCi0JewotCSAgbWludGlueSA9IDE7Ci0JICBtYXh0aW55ID0gMSA8PCBvcC0+bmJpdHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1pbnRpbnkgPSAwOwotCSAgbWF4dGlueSA9ICgxIDw8IG9wLT5uYml0cykgLSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtaW50aW55ID0gLSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpOwotICAgICAgbWF4dGlueSA9ICgxIDw8IChvcC0+bmJpdHMgLSAxKSkgLSAxOwotICAgIH0KLQotICAvKiBCcmFuY2ggb2Zmc2V0cyBoYXZlIGFuIGltcGxpY2l0IDAgaW4gdGhlIGxvd2VzdCBiaXQuICAqLwotICBpZiAodHlwZSA9PSAncCcgfHwgdHlwZSA9PSAncScpCi0gICAgdmFsIC89IDI7Ci0KLSAgaWYgKCh2YWwgJiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpKSAhPSAwCi0gICAgICB8fCB2YWwgPCAobWludGlueSA8PCBvcC0+c2hpZnQpCi0gICAgICB8fCB2YWwgPiAobWF4dGlueSA8PCBvcC0+c2hpZnQpKQotICAgIG5lZWRleHQgPSB0cnVlOwotICBlbHNlCi0gICAgbmVlZGV4dCA9IGZhbHNlOwotCi0gIGlmICh3YXJuICYmIGV4dCAmJiAhIG5lZWRleHQpCi0gICAgYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgXygiZXh0ZW5kZWQgb3BlcmFuZCByZXF1ZXN0ZWQgYnV0IG5vdCByZXF1aXJlZCIpKTsKLSAgaWYgKHNtYWxsICYmIG5lZWRleHQpCi0gICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJpbnZhbGlkIHVuZXh0ZW5kZWQgb3BlcmFuZCB2YWx1ZSIpKTsKLQotICBpZiAoc21hbGwgfHwgKCEgZXh0ICYmICEgbmVlZGV4dCkpCi0gICAgewotICAgICAgaW50IGluc252YWw7Ci0KLSAgICAgICp1c2VfZXh0ZW5kID0gZmFsc2U7Ci0gICAgICBpbnNudmFsID0gKCh2YWwgPj4gb3AtPnNoaWZ0KSAmICgoMSA8PCBvcC0+bmJpdHMpIC0gMSkpOwotICAgICAgaW5zbnZhbCA8PD0gb3AtPm9wX3NoaWZ0OwotICAgICAgKmluc24gfD0gaW5zbnZhbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIG1pbmV4dCwgbWF4ZXh0OwotICAgICAgaW50IGV4dHZhbDsKLQotICAgICAgaWYgKG9wLT5leHR1KQotCXsKLQkgIG1pbmV4dCA9IDA7Ci0JICBtYXhleHQgPSAoMSA8PCBvcC0+ZXh0Yml0cykgLSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW5leHQgPSAtICgxIDw8IChvcC0+ZXh0Yml0cyAtIDEpKTsKLQkgIG1heGV4dCA9ICgxIDw8IChvcC0+ZXh0Yml0cyAtIDEpKSAtIDE7Ci0JfQotICAgICAgaWYgKHZhbCA8IG1pbmV4dCB8fCB2YWwgPiBtYXhleHQpCi0JYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAotCQkgICAgICBfKCJvcGVyYW5kIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW5zdHJ1Y3Rpb24iKSk7Ci0KLSAgICAgICp1c2VfZXh0ZW5kID0gdHJ1ZTsKLSAgICAgIGlmIChvcC0+ZXh0Yml0cyA9PSAxNikKLQl7Ci0JICBleHR2YWwgPSAoKHZhbCA+PiAxMSkgJiAweDFmKSB8ICh2YWwgJiAweDdlMCk7Ci0JICB2YWwgJj0gMHgxZjsKLQl9Ci0gICAgICBlbHNlIGlmIChvcC0+ZXh0Yml0cyA9PSAxNSkKLQl7Ci0JICBleHR2YWwgPSAoKHZhbCA+PiAxMSkgJiAweGYpIHwgKHZhbCAmIDB4N2YwKTsKLQkgIHZhbCAmPSAweGY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4dHZhbCA9ICgodmFsICYgMHgxZikgPDwgNikgfCAodmFsICYgMHgyMCk7Ci0JICB2YWwgPSAwOwotCX0KLQotICAgICAgKmV4dGVuZCA9ICh1bnNpZ25lZCBzaG9ydCkgZXh0dmFsOwotICAgICAgKmluc24gfD0gdmFsOwotICAgIH0KLX0KLQwKLSNkZWZpbmUgTFAgJygnCi0jZGVmaW5lIFJQICcpJwotCi1zdGF0aWMgaW50Ci1teV9nZXRTbWFsbEV4cHJlc3Npb24gKGVwLCBzdHIpCi0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzcDsKLSAgaW50IGMgPSAwOwotCi0gIGlmICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLSAgaWYgKCpzdHIgPT0gTFAKLSAgICAgIHx8ICgqc3RyID09ICclJyAmJgotCSAgKChzdHJbMV0gPT0gJ2gnICYmIHN0clsyXSA9PSAnaScpCi0JICAgfHwgKHN0clsxXSA9PSAnSCcgJiYgc3RyWzJdID09ICdJJykKLQkgICB8fCAoc3RyWzFdID09ICdsJyAmJiBzdHJbMl0gPT0gJ28nKSkKLQkgICYmIHN0clszXSA9PSBMUCkpCi0gICAgewotICAgICAgaWYgKCpzdHIgPT0gTFApCi0JYyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgYyA9IHN0clsxXTsKLQkgIHN0ciArPSAzOwotCX0KLQotICAgICAgLyoKLSAgICAgICAqIEEgc21hbGwgZXhwcmVzc2lvbiBtYXkgYmUgZm9sbG93ZWQgYnkgYSBiYXNlIHJlZ2lzdGVyLgotICAgICAgICogU2NhbiB0byB0aGUgZW5kIG9mIHRoaXMgb3BlcmFuZCwgYW5kIHRoZW4gYmFjayBvdmVyIGEgcG9zc2libGUKLSAgICAgICAqIGJhc2UgcmVnaXN0ZXIuICBUaGVuIHNjYW4gdGhlIHNtYWxsIGV4cHJlc3Npb24gdXAgdG8gdGhhdAotICAgICAgICogcG9pbnQuICAoQmFzZWQgb24gY29kZSBpbiBzcGFyYy5jLi4uKQotICAgICAgICovCi0gICAgICBmb3IgKHNwID0gc3RyOyAqc3AgJiYgKnNwICE9ICcsJzsgc3ArKykKLQk7Ci0gICAgICBpZiAoc3AgLSA0ID49IHN0ciAmJiBzcFstMV0gPT0gUlApCi0JewotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzcFstMl0pKQotCSAgICB7Ci0JICAgICAgZm9yIChzcCAtPSAzOyBzcCA+PSBzdHIgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzcCk7IHNwLS0pCi0JCTsKLQkgICAgICBpZiAoKnNwID09ICckJyAmJiBzcCA+IHN0ciAmJiBzcFstMV0gPT0gTFApCi0JCXsKLQkJICBzcC0tOwotCQkgIGdvdG8gZG9faXQ7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3AgLSA1ID49IHN0cgotCQkgICAmJiBzcFstNV0gPT0gTFAKLQkJICAgJiYgc3BbLTRdID09ICckJwotCQkgICAmJiAoKHNwWy0zXSA9PSAnZicgJiYgc3BbLTJdID09ICdwJykKLQkJICAgICAgIHx8IChzcFstM10gPT0gJ3MnICYmIHNwWy0yXSA9PSAncCcpCi0JCSAgICAgICB8fCAoc3BbLTNdID09ICdnJyAmJiBzcFstMl0gPT0gJ3AnKQotCQkgICAgICAgfHwgKHNwWy0zXSA9PSAnYScgJiYgc3BbLTJdID09ICd0JykpKQotCSAgICB7Ci0JICAgICAgc3AgLT0gNTsKLQkgICAgZG9faXQ6Ci0JICAgICAgaWYgKHNwID09IHN0cikKLQkJewotCQkgIC8qIG5vIGV4cHJlc3Npb24gbWVhbnMgemVybyBvZmZzZXQgKi8KLQkJICBpZiAoYykKLQkJICAgIHsKLQkJICAgICAgLyogJXh4KHJlZykgaXMgYW4gZXJyb3IgKi8KLQkJICAgICAgZXAtPlhfb3AgPSBPX2Fic2VudDsKLQkJICAgICAgZXhwcl9lbmQgPSBzdHIgLSAzOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZXAtPlhfb3AgPSBPX2NvbnN0YW50OwotCQkgICAgICBleHByX2VuZCA9IHNwOwotCQkgICAgfQotCQkgIGVwLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCQkgIGVwLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JCSAgZXAtPlhfYWRkX251bWJlciA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAqc3AgPSAnXDAnOwotCQkgIG15X2dldEV4cHJlc3Npb24gKGVwLCBzdHIpOwotCQkgICpzcCA9IExQOwotCQl9Ci0JICAgICAgcmV0dXJuIGM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBteV9nZXRFeHByZXNzaW9uIChlcCwgc3RyKTsKLSAgcmV0dXJuIGM7CQkJLyogPT4gJWhpIG9yICVsbyBlbmNvdW50ZXJlZCAqLwotfQotCi1zdGF0aWMgdm9pZAotbXlfZ2V0RXhwcmVzc2lvbiAoZXAsIHN0cikKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBleHByZXNzaW9uIChlcCk7Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotCi0gIC8qIElmIHdlIGFyZSBpbiBtaXBzMTYgbW9kZSwgYW5kIHRoaXMgaXMgYW4gZXhwcmVzc2lvbiBiYXNlZCBvbiBgLicsCi0gICAgIHRoZW4gd2UgYnVtcCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBieSAxIHNpbmNlIHRoYXQgaXMgaG93IG90aGVyCi0gICAgIHRleHQgc3ltYm9scyBhcmUgaGFuZGxlZC4gIFdlIGRvbid0IGJvdGhlciB0byBoYW5kbGUgY29tcGxleAotICAgICBleHByZXNzaW9ucywganVzdCBgLicgcGx1cyBvciBtaW51cyBhIGNvbnN0YW50LiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYKLSAgICAgICYmIGVwLT5YX29wID09IE9fc3ltYm9sCi0gICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGVwLT5YX2FkZF9zeW1ib2wpLCBGQUtFX0xBQkVMX05BTUUpID09IDAKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGVwLT5YX2FkZF9zeW1ib2wpID09IG5vd19zZWcKLSAgICAgICYmIHN5bWJvbF9nZXRfZnJhZyAoZXAtPlhfYWRkX3N5bWJvbCkgPT0gZnJhZ19ub3cKLSAgICAgICYmIHN5bWJvbF9jb25zdGFudF9wIChlcC0+WF9hZGRfc3ltYm9sKQotICAgICAgJiYgU19HRVRfVkFMVUUgKGVwLT5YX2FkZF9zeW1ib2wpID09IGZyYWdfbm93X2ZpeCAoKSkKLSAgICBTX1NFVF9WQUxVRSAoZXAtPlhfYWRkX3N5bWJvbCwgU19HRVRfVkFMVUUgKGVwLT5YX2FkZF9zeW1ib2wpICsgMSk7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlcgotICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIDI7Ci0KLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gICAgIAotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJPOjpnOjpHOiI7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSNkZWZpbmUgT1BUSU9OX01JUFMxIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsibWlwczAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMxfSwKLSAgeyJtaXBzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzF9LAotI2RlZmluZSBPUFRJT05fTUlQUzIgKE9QVElPTl9NRF9CQVNFICsgMikKLSAgeyJtaXBzMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzJ9LAotI2RlZmluZSBPUFRJT05fTUlQUzMgKE9QVElPTl9NRF9CQVNFICsgMykKLSAgeyJtaXBzMyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzN9LAotI2RlZmluZSBPUFRJT05fTUlQUzQgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyJtaXBzNCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzR9LAotI2RlZmluZSBPUFRJT05fTUNQVSAoT1BUSU9OX01EX0JBU0UgKyA1KQotICB7Im1jcHUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01DUFV9LAotI2RlZmluZSBPUFRJT05fTUVNQkVEREVEX1BJQyAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7Im1lbWJlZGRlZC1waWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTUJFRERFRF9QSUN9LAotI2RlZmluZSBPUFRJT05fVFJBUCAoT1BUSU9OX01EX0JBU0UgKyA5KQotICB7InRyYXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQVB9LAotICB7Im5vLWJyZWFrIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFQfSwKLSNkZWZpbmUgT1BUSU9OX0JSRUFLIChPUFRJT05fTURfQkFTRSArIDEwKQotICB7ImJyZWFrIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CUkVBS30sCi0gIHsibm8tdHJhcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQlJFQUt9LAotI2RlZmluZSBPUFRJT05fRUIgKE9QVElPTl9NRF9CQVNFICsgMTEpCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSNkZWZpbmUgT1BUSU9OX0VMIChPUFRJT05fTURfQkFTRSArIDEyKQotICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCi0jZGVmaW5lIE9QVElPTl9NNDY1MCAoT1BUSU9OX01EX0JBU0UgKyAxMykKLSAgeyJtNDY1MCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTQ2NTB9LAotI2RlZmluZSBPUFRJT05fTk9fTTQ2NTAgKE9QVElPTl9NRF9CQVNFICsgMTQpCi0gIHsibm8tbTQ2NTAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX000NjUwfSwKLSNkZWZpbmUgT1BUSU9OX000MDEwIChPUFRJT05fTURfQkFTRSArIDE1KQotICB7Im00MDEwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NNDAxMH0sCi0jZGVmaW5lIE9QVElPTl9OT19NNDAxMCAoT1BUSU9OX01EX0JBU0UgKyAxNikKLSAgeyJuby1tNDAxMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTQwMTB9LAotI2RlZmluZSBPUFRJT05fTTQxMDAgKE9QVElPTl9NRF9CQVNFICsgMTcpCi0gIHsibTQxMDAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX000MTAwfSwKLSNkZWZpbmUgT1BUSU9OX05PX000MTAwIChPUFRJT05fTURfQkFTRSArIDE4KQotICB7Im5vLW00MTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NNDEwMH0sCi0jZGVmaW5lIE9QVElPTl9NSVBTMTYgKE9QVElPTl9NRF9CQVNFICsgMjIpCi0gIHsibWlwczE2Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTMTZ9LAotI2RlZmluZSBPUFRJT05fTk9fTUlQUzE2IChPUFRJT05fTURfQkFTRSArIDIzKQotICB7Im5vLW1pcHMxNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTUlQUzE2fSwKLSNkZWZpbmUgT1BUSU9OX00zOTAwIChPUFRJT05fTURfQkFTRSArIDI2KQotICB7Im0zOTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NMzkwMH0sCi0jZGVmaW5lIE9QVElPTl9OT19NMzkwMCAoT1BUSU9OX01EX0JBU0UgKyAyNykKLSAgeyJuby1tMzkwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTM5MDB9LAotCi0KLSNkZWZpbmUgT1BUSU9OX01BQkkgKE9QVElPTl9NRF9CQVNFICsgMzgpCi0gIHsibWFiaSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFCSX0sCi0KLSNkZWZpbmUgT1BUSU9OX0NBTExfU0hBUkVEIChPUFRJT05fTURfQkFTRSArIDcpCi0jZGVmaW5lIE9QVElPTl9OT05fU0hBUkVEIChPUFRJT05fTURfQkFTRSArIDgpCi0jZGVmaW5lIE9QVElPTl9YR09UIChPUFRJT05fTURfQkFTRSArIDE5KQotI2RlZmluZSBPUFRJT05fMzIgKE9QVElPTl9NRF9CQVNFICsgMjApCi0jZGVmaW5lIE9QVElPTl82NCAoT1BUSU9OX01EX0JBU0UgKyAyMSkKLSNpZmRlZiBPQkpfRUxGCi0gIHsiS1BJQyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0FMTF9TSEFSRUR9LAotICB7Inhnb3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1hHT1R9LAotICB7ImNhbGxfc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gIHsibm9uX3NoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9OX1NIQVJFRH0sCi0gIHsiMzIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzMyfSwKLSAgeyI2NCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fNjR9LAotI2VuZGlmCi0KLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9UUkFQOgotICAgICAgbWlwc190cmFwID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQlJFQUs6Ci0gICAgICBtaXBzX3RyYXAgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FQjoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRUw6Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ08nOgotICAgICAgaWYgKGFyZyAmJiBhcmdbMV0gPT0gJzAnKQotCW1pcHNfb3B0aW1pemUgPSAxOwotICAgICAgZWxzZQotCW1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgIGlmIChhcmcgPT0gTlVMTCkKLQltaXBzX2RlYnVnID0gMjsKLSAgICAgIGVsc2UKLQltaXBzX2RlYnVnID0gYXRvaSAoYXJnKTsKLSAgICAgIC8qIFdoZW4gdGhlIE1JUFMgYXNzZW1ibGVyIHNlZXMgLWcgb3IgLWcyLCBpdCBkb2VzIG5vdCBkbwotICAgICAgICAgb3B0aW1pemF0aW9ucyB3aGljaCBsaW1pdCBmdWxsIHN5bWJvbGljIGRlYnVnZ2luZy4gIFdlIHRha2UKLSAgICAgICAgIHRoYXQgdG8gYmUgZXF1aXZhbGVudCB0byAtTzAuICAqLwotICAgICAgaWYgKG1pcHNfZGVidWcgPT0gMikKLQltaXBzX29wdGltaXplID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzE6Ci0gICAgICBtaXBzX29wdHMuaXNhID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzI6Ci0gICAgICBtaXBzX29wdHMuaXNhID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzM6Ci0gICAgICBtaXBzX29wdHMuaXNhID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzQ6Ci0gICAgICBtaXBzX29wdHMuaXNhID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUNQVToKLSAgICAgIHsKLQljaGFyICpwOwotCi0JLyogSWRlbnRpZnkgdGhlIHByb2Nlc3NvciB0eXBlICovCi0JcCA9IGFyZzsKLQlpZiAoc3RyY21wIChwLCAiZGVmYXVsdCIpID09IDAKLQkgICAgfHwgc3RyY21wIChwLCAiREVGQVVMVCIpID09IDApCi0JICBtaXBzX2NwdSA9IC0xOwotCWVsc2UKLQkgIHsKLQkgICAgaW50IHN2ID0gMDsKLQotCSAgICAvKiBXZSBuZWVkIHRvIGNvcGUgd2l0aCB0aGUgdmFyaW91cyAidnIiIHByZWZpeGVzIGZvciB0aGUgNDMwMAotCSAgICAgICBwcm9jZXNzb3IuICAqLwotCSAgICBpZiAoKnAgPT0gJ3YnIHx8ICpwID09ICdWJykKLQkgICAgICB7Ci0JCXN2ID0gMTsKLQkJcCsrOwotCSAgICAgIH0KLQotCSAgICBpZiAoKnAgPT0gJ3InIHx8ICpwID09ICdSJykKLQkgICAgICBwKys7Ci0KLQkgICAgbWlwc19jcHUgPSAtMTsKLQkgICAgc3dpdGNoICgqcCkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnMSc6Ci0JCWlmIChzdHJjbXAgKHAsICIxMDAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjEwayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjEwSyIpID09IDApCi0JCSAgbWlwc19jcHUgPSAxMDAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICcyJzoKLQkJaWYgKHN0cmNtcCAocCwgIjIwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIyayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjJLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDIwMDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnMyc6Ci0JCWlmIChzdHJjbXAgKHAsICIzMDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiM2siKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIzSyIpID09IDApCi0JCSAgbWlwc19jcHUgPSAzMDAwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAocCwgIjM5MDAiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSAzOTAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzQnOgotCQlpZiAoc3RyY21wIChwLCAiNDAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjRrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNEsiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDAwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDEwMCIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIG1pcHNfY3B1ID0gNDEwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDExMSIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIG1pcHNfY3B1ID0gNDExMTsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDMwMCIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0MzAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0NDAwIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDQ0MDA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQ2MDAiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDYwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDY1MCIpID09IDApCi0JCSAgICBtaXBzX2NwdSA9IDQ2NTA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQwMTAiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSA0MDEwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzUnOgotCQlpZiAoc3RyY21wIChwLCAiNTAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjVrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNUsiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNTAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICc2JzoKLQkJaWYgKHN0cmNtcCAocCwgIjYwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI2ayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjZLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDYwMDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnOCc6Ci0JCWlmIChzdHJjbXAgKHAsICI4MDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiOGsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI4SyIpID09IDApCi0JCSAgbWlwc19jcHUgPSA4MDAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJ28nOgotCQlpZiAoc3RyY21wIChwLCAib3Jpb24iKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDYwMDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmIChzdgotCQkmJiAobWlwc19jcHUgIT0gNDMwMAotCQkgICAgJiYgbWlwc19jcHUgIT0gNDEwMAotCQkgICAgJiYgbWlwc19jcHUgIT0gNDExMQotCQkgICAgJiYgbWlwc19jcHUgIT0gNTAwMCkpCi0JICAgICAgewotCQlhc19iYWQgKF8oImlnbm9yaW5nIGludmFsaWQgbGVhZGluZyAndicgaW4gLW1jcHU9JXMgc3dpdGNoIiksIGFyZyk7Ci0JCXJldHVybiAwOwotCSAgICAgIH0KLQotCSAgICBpZiAobWlwc19jcHUgPT0gLTEpCi0JICAgICAgewotCQlhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC1tY3B1PSVzIiksIGFyZyk7Ci0JCXJldHVybiAwOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTTQ2NTA6Ci0gICAgICBtaXBzX2NwdSA9IDQ2NTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PX000NjUwOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NNDAxMDoKLSAgICAgIG1pcHNfY3B1ID0gNDAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fTTQwMTA6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX000MTAwOgotICAgICAgbWlwc19jcHUgPSA0MTAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19NNDEwMDoKLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIE9QVElPTl9NMzkwMDoKLSAgICAgIG1pcHNfY3B1ID0gMzkwMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUFRJT05fTk9fTTM5MDA6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01JUFMxNjoKLSAgICAgIG1pcHNfb3B0cy5taXBzMTYgPSAxOwotICAgICAgbWlwc19ub19wcmV2X2luc24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fTUlQUzE2OgotICAgICAgbWlwc19vcHRzLm1pcHMxNiA9IDA7Ci0gICAgICBtaXBzX25vX3ByZXZfaW5zbiAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NRU1CRURERURfUElDOgotICAgICAgbWlwc19waWMgPSBFTUJFRERFRF9QSUM7Ci0gICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBnX3N3aXRjaF9zZWVuKQotCXsKLQkgIGFzX2JhZCAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggZW1iZWRkZWQgUElDIGNvZGUiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIEVMRiBjb2RlLCB3ZSBwZXJtaXQgLUtQSUMgYW5kIC1jYWxsX3NoYXJlZCB0bwotCSBzZWxlY3QgU1ZSNF9QSUMsIGFuZCAtbm9uX3NoYXJlZCB0byBzZWxlY3Qgbm8gUElDLiAgVGhpcyBpcwotCSBpbnRlbmRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggSXJpeCA1LiAgKi8KLSAgICBjYXNlIE9QVElPTl9DQUxMX1NIQVJFRDoKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgYXNfYmFkIChfKCItY2FsbF9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBtaXBzX3BpYyA9IFNWUjRfUElDOwotICAgICAgaWYgKGdfc3dpdGNoX3NlZW4gJiYgZ19zd2l0Y2hfdmFsdWUgIT0gMCkKLQl7Ci0JICBhc19iYWQgKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PTl9TSEFSRUQ6Ci0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGFzX2JhZCAoXygiLW5vbl9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBtaXBzX3BpYyA9IE5PX1BJQzsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGUgLXhnb3Qgb3B0aW9uIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gdXNlIDMyIG9mZnNldHMgd2hlbgotICAgICAgICAgYWNjZXNzaW5nIHRoZSBnb3QgaW4gU1ZSNF9QSUMgbW9kZS4gIEl0IGlzIGZvciBJcml4Ci0gICAgICAgICBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICBjYXNlIE9QVElPTl9YR09UOgotICAgICAgbWlwc19iaWdfZ290ID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICBpZiAoISBVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotCXsKLQkgIGFzX2JhZCAoXygiLUcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb25maWd1cmF0aW9uIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgfHwgbWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIGFzX2JhZCAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBvciBlbWJlZGRlZCBQSUMgY29kZSIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UKLQlnX3N3aXRjaF92YWx1ZSA9IGF0b2kgKGFyZyk7Ci0gICAgICBnX3N3aXRjaF9zZWVuID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGUgLTMyIGFuZCAtNjQgb3B0aW9ucyB0ZWxsIHRoZSBhc3NlbWJsZXIgdG8gb3V0cHV0IHRoZSAzMgotICAgICAgICAgYml0IG9yIHRoZSA2NCBiaXQgTUlQUyBFTEYgZm9ybWF0LiAgKi8KLSAgICBjYXNlIE9QVElPTl8zMjoKLSAgICAgIG1pcHNfNjQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl82NDoKLSAgICAgIHsKLQljb25zdCBjaGFyICoqbGlzdCwgKipsOwotCi0JbGlzdCA9IGJmZF90YXJnZXRfbGlzdCAoKTsKLQlmb3IgKGwgPSBsaXN0OyAqbCAhPSBOVUxMOyBsKyspCi0JICBpZiAoc3RyY21wICgqbCwgImVsZjY0LWJpZ21pcHMiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wICgqbCwgImVsZjY0LWxpdHRsZW1pcHMiKSA9PSAwKQotCSAgICBicmVhazsKLQlpZiAoKmwgPT0gTlVMTCkKLQkgIGFzX2ZhdGFsIChfKCJObyBjb21waWxlZCBpbiBzdXBwb3J0IGZvciA2NCBiaXQgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotCWZyZWUgKGxpc3QpOwotCW1pcHNfNjQgPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgT1BUSU9OX01BQkk6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsIjMyIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmcsIm4zMiIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCI2NCIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCJvNjQiKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZywiZWFiaSIpID09IDApCi0JbWlwc19hYmlfc3RyaW5nID0gYXJnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zaG93IChzdHJlYW0sIHN0cmluZywgY29sX3AsIGZpcnN0X3ApCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgKmNvbF9wOwotICAgICBpbnQgKmZpcnN0X3A7Ci17Ci0gIGlmICgqZmlyc3RfcCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdHJlYW0sICIlMjRzIiwgIiIpOwotICAgICAgKmNvbF9wID0gMjQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICpjb2xfcCArPSAyOwotICAgIH0KLQotICBpZiAoKmNvbF9wICsgc3RybGVuIChzdHJpbmcpID4gNzIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiXG4lMjRzIiwgIiIpOwotICAgICAgKmNvbF9wID0gMjQ7Ci0gICAgfQotCi0gIGZwcmludGYgKHN0cmVhbSwgIiVzIiwgc3RyaW5nKTsKLSAgKmNvbF9wICs9IHN0cmxlbiAoc3RyaW5nKTsKLQotICAqZmlyc3RfcCA9IDA7Ci19Ci0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGludCBjb2x1bW4sIGZpcnN0OwotCi0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1NSVBTIG9wdGlvbnM6XG5cCi0tbWVtYmVkZGVkLXBpYwkJZ2VuZXJhdGUgZW1iZWRkZWQgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuXAotLUVCCQkJZ2VuZXJhdGUgYmlnIGVuZGlhbiBvdXRwdXRcblwKLS1FTAkJCWdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG5cCi0tZywgLWcyCQkJZG8gbm90IHJlbW92ZSB1bmVlZGVkIE5PUHMgb3Igc3dhcCBicmFuY2hlc1xuXAotLUcgTlVNCQkJYWxsb3cgcmVmZXJlbmNpbmcgb2JqZWN0cyB1cCB0byBOVU0gYnl0ZXNcblwKLQkJCWltcGxpY2l0bHkgd2l0aCB0aGUgZ3AgcmVnaXN0ZXIgW2RlZmF1bHQgOF1cbiIpKTsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1taXBzMQkJCWdlbmVyYXRlIE1JUFMgSVNBIEkgaW5zdHJ1Y3Rpb25zXG5cCi0tbWlwczIJCQlnZW5lcmF0ZSBNSVBTIElTQSBJSSBpbnN0cnVjdGlvbnNcblwKLS1taXBzMwkJCWdlbmVyYXRlIE1JUFMgSVNBIElJSSBpbnN0cnVjdGlvbnNcblwKLS1taXBzNAkJCWdlbmVyYXRlIE1JUFMgSVNBIElWIGluc3RydWN0aW9uc1xuXAotLW1jcHU9Q1BVCQlnZW5lcmF0ZSBjb2RlIGZvciBDUFUsIHdoZXJlIENQVSBpcyBvbmUgb2Y6XG4iKSk7Ci0KLSAgZmlyc3QgPSAxOwotCi0gIHNob3cgKHN0cmVhbSwgIjIwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICIzMDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiMzkwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MDEwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDEwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQxMTEiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MzAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDQwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQ2MDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0NjUwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNTAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjYwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI4MDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiMTAwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBmcHV0YyAoJ1xuJywgc3RyZWFtKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1tQ1BVCQkJZXF1aXZhbGVudCB0byAtbWNwdT1DUFUuXG5cCi0tbm8tbUNQVQkJZG9uJ3QgZ2VuZXJhdGUgY29kZSBzcGVjaWZpYyB0byBDUFUuXG5cCi0JCQlGb3IgLW1DUFUgYW5kIC1uby1tQ1BVLCBDUFUgbXVzdCBiZSBvbmUgb2Y6XG4iKSk7Ci0KLSAgZmlyc3QgPSAxOwotCi0gIHNob3cgKHN0cmVhbSwgIjM5MDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MDEwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDEwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQ2NTAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBmcHV0YyAoJ1xuJywgc3RyZWFtKTsKLQotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLW1pcHMxNgkJCWdlbmVyYXRlIG1pcHMxNiBpbnN0cnVjdGlvbnNcblwKLS1uby1taXBzMTYJCWRvIG5vdCBnZW5lcmF0ZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zXG4iKSk7Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tTzAJCQlyZW1vdmUgdW5uZWVkZWQgTk9QcywgZG8gbm90IHN3YXAgYnJhbmNoZXNcblwKLS1PCQkJcmVtb3ZlIHVubmVlZGVkIE5PUHMgYW5kIHN3YXAgYnJhbmNoZXNcblwKLS0tdHJhcCwgLS1uby1icmVhawl0cmFwIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuXAotLS1icmVhaywgLS1uby10cmFwCWJyZWFrIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuIikpOwotI2lmZGVmIE9CSl9FTEYKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1LUElDLCAtY2FsbF9zaGFyZWQJZ2VuZXJhdGUgU1ZSNCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCi0tbm9uX3NoYXJlZAkJZG8gbm90IGdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcblwKLS14Z290CQkJYXNzdW1lIGEgMzIgYml0IEdPVFxuXAotLTMyCQkJY3JlYXRlIDMyIGJpdCBvYmplY3QgZmlsZSAoZGVmYXVsdClcblwKLS02NAkJCWNyZWF0ZSA2NCBiaXQgb2JqZWN0IGZpbGVcbiIpKTsKLSNlbmRpZgotfQotDAotdm9pZAotbWlwc19pbml0X2FmdGVyX2FyZ3MgKCkKLXsKLSAgLyogaW5pdGlhbGl6ZSBvcGNvZGVzICovCi0gIGJmZF9taXBzX251bV9vcGNvZGVzID0gYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2RlczsKLSAgbWlwc19vcGNvZGVzID0gKHN0cnVjdCBtaXBzX29wY29kZSopIG1pcHNfYnVpbHRpbl9vcGNvZGVzOwotfQotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG1ha2VzIGEgYnJhbmNoIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wgYmUgYSBicmFuY2ggdG8gdGhlCi0JIGN1cnJlbnQgbG9jYXRpb24uICAqLwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gIC8qIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZGVsYXkgc2xvdCAqLwotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgZW1pdF9leHByIHZpYSBUQ19DT05TX0ZJWF9ORVcgd2hlbiBjcmVhdGluZyBhCi0gICByZWxvYyBmb3IgYSBjb25zLiAgV2UgY291bGQgdXNlIHRoZSBkZWZpbml0aW9uIHRoZXJlLCBleGNlcHQgdGhhdAotICAgd2Ugd2FudCB0byBoYW5kbGUgNjQgYml0IHJlbG9jcyBzcGVjaWFsbHkuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfbWlwcyAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotI2lmbmRlZiBPQkpfRUxGCi0gIC8qIElmIHdlIGFyZSBhc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLCB0dXJuIGFuIDggYnl0ZSByZWxvYyBpbnRvIGEKLSAgICAgNCBieXRlIHJlbG9jLiAgKi8KLSAgaWYgKG5ieXRlcyA9PSA4ICYmICEgbWlwc182NCkKLSAgICB7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0Jd2hlcmUgKz0gNDsKLSAgICAgIG5ieXRlcyA9IDQ7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKG5ieXRlcyAhPSAyICYmIG5ieXRlcyAhPSA0ICYmIG5ieXRlcyAhPSA4KQotICAgIGFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgcmVsb2Mgc2l6ZSAlZCIpLCBuYnl0ZXMpOwotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgd2hlcmUsIChpbnQpIG5ieXRlcywgZXhwLCAwLAotCSAgICAgICAobmJ5dGVzID09IDIKLQkJPyBCRkRfUkVMT0NfMTYKLQkJOiAobmJ5dGVzID09IDQgPyBCRkRfUkVMT0NfMzIgOiBCRkRfUkVMT0NfNjQpKSk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgc3ltYm9sIHRhYmxlIGlzIHByb2Nlc3NlZC4gIEluIG9yZGVyIHRvCi0gICB3b3JrIHdpdGggZ2NjIHdoZW4gdXNpbmcgbWlwcy10ZmlsZSwgd2UgbXVzdCBrZWVwIGFsbCBsb2NhbCBsYWJlbHMuCi0gICBIb3dldmVyLCBpbiBvdGhlciBjYXNlcywgd2Ugd2FudCB0byBkaXNjYXJkIHRoZW0uICBJZiB3ZSB3ZXJlCi0gICBjYWxsZWQgd2l0aCAtZywgYnV0IHdlIGRpZG4ndCBzZWUgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaXQgbWF5Ci0gICBtZWFuIHRoYXQgZ2NjIGlzIHNtdWdnbGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdGhyb3VnaCB0bwotICAgbWlwcy10ZmlsZSwgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IGdlbmVyYXRlIGFsbCBsb2NhbCBsYWJlbHMuICAqLwotCi12b2lkCi1taXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpCi17Ci0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotICBpZiAoRUNPRkZfREVCVUdHSU5HCi0gICAgICAmJiBtaXBzX2RlYnVnICE9IDAKLSAgICAgICYmICEgZWNvZmZfZGVidWdnaW5nX3NlZW4pCi0gICAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci0jZW5kaWYKLX0KLQotLyogU29ydCBhbnkgdW5tYXRjaGVkIEhJMTZfUyByZWxvY3Mgc28gdGhhdCB0aGV5IGltbWVkaWF0ZWx5IHByZWNlZGUKLSAgIHRoZSBjb3JyZXNwb25kaW5nIExPIHJlbG9jLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIG1kX2FwcGx5X2ZpeCBhbmQKLSAgIHRjX2dlbl9yZWxvYy4gIFVubWF0Y2hlZCBISTE2X1MgcmVsb2NzIGNhbiBvbmx5IGJlIGdlbmVyYXRlZCBieQotICAgZXhwbGljaXQgdXNlIG9mIHRoZSAlaGkgbW9kaWZpZXIuICAqLwotCi12b2lkCi1taXBzX2Zyb2JfZmlsZSAoKQotewotICBzdHJ1Y3QgbWlwc19oaV9maXh1cCAqbDsKLQotICBmb3IgKGwgPSBtaXBzX2hpX2ZpeHVwX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gICAgICBpbnQgcGFzczsKLQotICAgICAgYXNzZXJ0IChsLT5maXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0hJMTZfUyk7Ci0KLSAgICAgIC8qIENoZWNrIHF1aWNrbHkgd2hldGhlciB0aGUgbmV4dCBmaXh1cCBoYXBwZW5zIHRvIGJlIGEgbWF0Y2hpbmcKLSAgICAgICAgICVsby4gICovCi0gICAgICBpZiAobC0+Zml4cC0+ZnhfbmV4dCAhPSBOVUxMCi0JICAmJiBsLT5maXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0xPMTYKLQkgICYmIGwtPmZpeHAtPmZ4X2FkZHN5ID09IGwtPmZpeHAtPmZ4X25leHQtPmZ4X2FkZHN5Ci0JICAmJiBsLT5maXhwLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+Znhfb2Zmc2V0KQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIGZpeHVwcyBmb3IgdGhpcyBzZWdtZW50IGZvciBhIG1hdGNoaW5nICVsby4KLSAgICAgICAgIFdoZW4gd2UgZmluZCBvbmUsIG1vdmUgdGhlICVoaSBqdXN0IGluIGZyb250IG9mIGl0LiAgV2UgZG8KLSAgICAgICAgIHRoaXMgaW4gdHdvIHBhc3Nlcy4gIEluIHRoZSBmaXJzdCBwYXNzLCB3ZSB0cnkgdG8gZmluZCBhCi0gICAgICAgICB1bmlxdWUgJWxvLiAgSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBwZXJtaXQgbXVsdGlwbGUgJWhpCi0gICAgICAgICByZWxvY3MgZm9yIGEgc2luZ2xlICVsbyAodGhpcyBpcyBhIEdOVSBleHRlbnNpb24pLiAgKi8KLSAgICAgIHNlZ2luZm8gPSBzZWdfaW5mbyAobC0+c2VnKTsKLSAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspCi0JewotCSAgZml4UyAqZiwgKnByZXY7Ci0KLQkgIHByZXYgPSBOVUxMOwotCSAgZm9yIChmID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGYgIT0gTlVMTDsgZiA9IGYtPmZ4X25leHQpCi0JICAgIHsKLQkgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSAlbG8gZml4dXAgd2hpY2ggbWF0Y2hlcyBsLT5maXhwLiAgKi8KLQkgICAgICBpZiAoZi0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19MTzE2Ci0JCSAgJiYgZi0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfYWRkc3kKLQkJICAmJiBmLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+Znhfb2Zmc2V0Ci0JCSAgJiYgKHBhc3MgPT0gMQotCQkgICAgICB8fCBwcmV2ID09IE5VTEwKLQkJICAgICAgfHwgcHJldi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1MKLQkJICAgICAgfHwgcHJldi0+ZnhfYWRkc3kgIT0gZi0+ZnhfYWRkc3kKLQkJICAgICAgfHwgcHJldi0+Znhfb2Zmc2V0ICE9ICBmLT5meF9vZmZzZXQpKQotCQl7Ci0JCSAgZml4UyAqKnBmOwotCi0JCSAgLyogTW92ZSBsLT5maXhwIGJlZm9yZSBmLiAgKi8KLQkJICBmb3IgKHBmID0gJnNlZ2luZm8tPmZpeF9yb290OwotCQkgICAgICAgKnBmICE9IGwtPmZpeHA7Ci0JCSAgICAgICBwZiA9ICYoKnBmKS0+ZnhfbmV4dCkKLQkJICAgIGFzc2VydCAoKnBmICE9IE5VTEwpOwotCi0JCSAgKnBmID0gbC0+Zml4cC0+ZnhfbmV4dDsKLQotCQkgIGwtPmZpeHAtPmZ4X25leHQgPSBmOwotCQkgIGlmIChwcmV2ID09IE5VTEwpCi0JCSAgICBzZWdpbmZvLT5maXhfcm9vdCA9IGwtPmZpeHA7Ci0JCSAgZWxzZQotCQkgICAgcHJldi0+ZnhfbmV4dCA9IGwtPmZpeHA7Ci0KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgcHJldiA9IGY7Ci0JICAgIH0KLQotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLSNpZiAwIC8qIEdDQyBjb2RlIG1vdGlvbiBwbHVzIGluY29tcGxldGUgZGVhZCBjb2RlIGVsaW1pbmF0aW9uCi0JIGNhbiBsZWF2ZSBhICVoaSB3aXRob3V0IGEgJWxvLiAgKi8KLQkgIGlmIChwYXNzID09IDEpCi0JICAgIGFzX3dhcm5fd2hlcmUgKGwtPmZpeHAtPmZ4X2ZpbGUsIGwtPmZpeHAtPmZ4X2xpbmUsCi0JCQkgICBfKCJVbm1hdGNoZWQgJSVoaSByZWxvYyIpKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLS8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBuZWVkIHRvIHVzZSBhIHNwZWNpYWwKLSAgIHJlbG9jYXRpb24gdG8gcmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiAoc3dpdGNoIHRhYmxlcyB1c2UgYSBkaWZmZXJlbmNlIG9mIHRoaXMgc29ydCkuICBTZWUKLSAgIGluY2x1ZGUvY29mZi9taXBzLmggZm9yIGRldGFpbHMuICBUaGlzIG1hY3JvIGNoZWNrcyB3aGV0aGVyIHRoaXMKLSAgIGZpeHVwIHJlcXVpcmVzIHRoZSBzcGVjaWFsIHJlbG9jLiAgKi8KLSNkZWZpbmUgU1dJVENIX1RBQkxFKGZpeHApIFwKLSAgKChmaXhwKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMiBcCi0gICAmJiAoZml4cCktPmZ4X2FkZHN5ICE9IE5VTEwgXAotICAgJiYgKGZpeHApLT5meF9zdWJzeSAhPSBOVUxMIFwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXhwKS0+ZnhfYWRkc3kpID09IHRleHRfc2VjdGlvbiBcCi0gICAmJiBTX0dFVF9TRUdNRU5UICgoZml4cCktPmZ4X3N1YnN5KSA9PSB0ZXh0X3NlY3Rpb24pCi0KLS8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBtdXN0IGtlZXAgYWxsIFBDIHJlbGF0aXZlCi0gICByZWxvY2F0aW9ucywgaW4gY2FzZSB0aGUgbGlua2VyIGhhcyB0byByZWxheCBhIGNhbGwuICBXZSBhbHNvIG5lZWQKLSAgIHRvIGtlZXAgcmVsb2NhdGlvbnMgZm9yIHN3aXRjaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotLypBUkdTVVNFRCovCi1pbnQKLW1pcHNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0JICAmJiAoZml4cC0+ZnhfcGNyZWwKLQkgICAgICB8fCBTV0lUQ0hfVEFCTEUgKGZpeHApCi0JICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MKLQkgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpKTsKLX0KLQotLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsdWVQKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHVlUDsKLXsKLSAgdW5zaWduZWQgY2hhciAqYnVmOwotICBsb25nIGluc24sIHZhbHVlOwotCi0gIGFzc2VydCAoZml4UC0+Znhfc2l6ZSA9PSA0Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzY0Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSk7Ci0KLSAgdmFsdWUgPSAqdmFsdWVQOwotCi0gIC8qIElmIHdlIGFyZW4ndCBhZGp1c3RpbmcgdGhpcyBmaXh1cCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uCi0gICAgIHN5bWJvbCwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMICYmIE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICBpZiAoU19HRVRfT1RIRVIgKGZpeFAtPmZ4X2FkZHN5KSA9PSBTVE9fTUlQUzE2IAotICAgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgICB8fCAoc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAgICAgICAmJiAoKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCQkJIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkKLQkJICAmIFNFQ19MSU5LX09OQ0UpICE9IDApCi0JCXx8ICFzdHJuY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSksCi0JCQkgICAgICIuZ251LmxpbmtvbmNlIiwKLQkJCSAgICAgc2l6ZW9mICgiLmdudS5saW5rb25jZSIpIC0gMSkpKSkKLQotICAgICAgewotICAgICAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpOwotICAgICAgICBpZiAodmFsdWUgIT0gMCAmJiAhIGZpeFAtPmZ4X3BjcmVsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluIHRoaXMgY2FzZSwgdGhlIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gcm91dGluZSB3aWxsCi0gICAgICAgICAgICAgICBpbmNvcnJlY3RseSBhZGQgdGhlIHN5bWJvbCB2YWx1ZSBiYWNrIGluLiAgV2UganVzdCB3YW50Ci0gICAgICAgICAgICAgICB0aGUgYWRkZW5kIHRvIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgICAgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYKLQotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgdGNfZ2VuX3JlbG9jICovCi0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwgJiYgISBmaXhQLT5meF9wY3JlbCkKLSAgICBmaXhQLT5meF9kb25lID0gMTsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HUFJFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1QxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9HUFJFTDoKLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkludmFsaWQgUEMgcmVsYXRpdmUgcmVsb2MiKSk7Ci0gICAgICAvKiBOb3RoaW5nIG5lZWRlZCB0byBkby4gVGhlIHZhbHVlIGNvbWVzIGZyb20gdGhlIHJlbG9jIGVudHJ5ICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6Ci0gICAgICAvKiBXZSBjdXJyZW50bHkgYWx3YXlzIGdlbmVyYXRlIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCwgd2hpY2gKLSAgICAgICAgIG1lYW5zIHRoYXQgd2UgZG9uJ3Qgd2FudCBhbiBhZGRlbmQgZXZlbiBpZiB0aGUgc3ltYm9sIGlzCi0gICAgICAgICBkZWZpbmVkLiAgKi8KLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKLSAgICAgIC8qIFRoZSBhZGRlbmQgZm9yIHRoaXMgaXMgdHJpY2t5IGlmIGl0IGlzIGludGVybmFsLCBzbyB3ZSBqdXN0Ci0JIGRvIGV2ZXJ5dGhpbmcgaGVyZSByYXRoZXIgdGhhbiBpbiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmICgoc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JewotCSAgLyogRm9yIGFuIGV4dGVybmFsIHN5bWJvbCBhZGp1c3QgYnkgdGhlIGFkZHJlc3MgdG8gbWFrZSBpdAotCSAgICAgcGNyZWxfb2Zmc2V0LiAgV2UgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBSRUxMTyByZWxvYwotCSAgICAgd2hpY2ggZm9sbG93cyB0aGlzIG9uZS4gICovCi0JICB2YWx1ZSArPSAoZml4UC0+ZnhfbmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkgICAgKyBmaXhQLT5meF9uZXh0LT5meF93aGVyZSk7Ci0JfQotICAgICAgaWYgKHZhbHVlICYgMHg4MDAwKQotCXZhbHVlICs9IDB4MTAwMDA7Ci0gICAgICB2YWx1ZSA+Pj0gMTY7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYnVmICs9IDI7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgLyogVGhlIGFkZGVuZCBmb3IgdGhpcyBpcyB0cmlja3kgaWYgaXQgaXMgaW50ZXJuYWwsIHNvIHdlIGp1c3QKLQkgZG8gZXZlcnl0aGluZyBoZXJlIHJhdGhlciB0aGFuIGluIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotICAgICAgaWYgKChzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQl2YWx1ZSArPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYnVmICs9IDI7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICAgIC8qIFRoaXMgaXMgaGFuZGxlZCBsaWtlIEJGRF9SRUxPQ18zMiwgYnV0IHdlIG91dHB1dCBhIHNpZ24KLSAgICAgICAgIGV4dGVuZGVkIHZhbHVlIGlmIHdlIGFyZSBvbmx5IDMyIGJpdHMuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUKLQkgIHx8IChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMgJiYgU1dJVENIX1RBQkxFIChmaXhQKSkpCi0JewotCSAgaWYgKDggPD0gc2l6ZW9mICh2YWx1ZVQpKQotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCQl2YWx1ZSwgOCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsb25nIHcxLCB3MjsKLQkgICAgICBsb25nIGhpdjsKLQotCSAgICAgIHcxID0gdzIgPSBmaXhQLT5meF93aGVyZTsKLQkgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JCXcxICs9IDQ7Ci0JICAgICAgZWxzZQotCQl3MiArPSA0OwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIHcxLCB2YWx1ZSwgNCk7Ci0JICAgICAgaWYgKCh2YWx1ZSAmIDB4ODAwMDAwMDApICE9IDApCi0JCWhpdiA9IDB4ZmZmZmZmZmY7Ci0JICAgICAgZWxzZQotCQloaXYgPSAwOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIHcyLCBoaXYsIDQpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIC8qIElmIHdlIGFyZSBkZWxldGluZyB0aGlzIHJlbG9jIGVudHJ5LCB3ZSBtdXN0IGZpbGwgaW4gdGhlCi0JIHZhbHVlIG5vdy4gIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBoYXZlIGEgLndvcmQgd2hpY2ggaXMgbm90Ci0JIHJlc29sdmVkIHdoZW4gaXQgYXBwZWFycyBidXQgaXMgbGF0ZXIgZGVmaW5lZC4gIFdlIGFsc28gbmVlZAotCSB0byBmaWxsIGluIHRoZSB2YWx1ZSBpZiB0aGlzIGlzIGFuIGVtYmVkZGVkIFBJQyBzd2l0Y2ggdGFibGUKLQkgZW50cnkuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUKLQkgIHx8IChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMgJiYgU1dJVENIX1RBQkxFIChmaXhQKSkpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgdmFsdWUsIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIC8qIElmIHdlIGFyZSBkZWxldGluZyB0aGlzIHJlbG9jIGVudHJ5LCB3ZSBtdXN0IGZpbGwgaW4gdGhlCi0gICAgICAgICB2YWx1ZSBub3cuICAqLwotICAgICAgYXNzZXJ0IChmaXhQLT5meF9zaXplID09IDIpOwotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotICAgICAgLyogV2hlbiBoYW5kbGluZyBhbiBlbWJlZGRlZCBQSUMgc3dpdGNoIHN0YXRlbWVudCwgd2UgY2FuIHdpbmQKLQkgdXAgZGVsZXRpbmcgYSBMTzE2IHJlbG9jLiAgU2VlIHRoZSAnbycgY2FzZSBpbiBtaXBzX2lwLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lKQotCXsKLQkgIGlmICh2YWx1ZSA8IC0weDgwMDAgfHwgdmFsdWUgPiAweDdmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKLQkgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQkgICAgYnVmICs9IDI7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0gICAgICAvKgotICAgICAgICogV2UgbmVlZCB0byBzYXZlIHRoZSBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbiBzaW5jZSBmaXh1cF9zZWdtZW50KCkKLSAgICAgICAqIG1pZ2h0IGJlIGRlbGV0aW5nIHRoZSByZWxvY2F0aW9uIGVudHJ5IChpLmUuLCBhIGJyYW5jaCB3aXRoaW4KLSAgICAgICAqIHRoZSBjdXJyZW50IHNlZ21lbnQpLgotICAgICAgICovCi0gICAgICBpZiAoKHZhbHVlICYgMHgzKSAhPSAwKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygiQnJhbmNoIHRvIG9kZCBhZGRyZXNzICglbHgpIiksIHZhbHVlKTsKLSAgICAgIHZhbHVlID4+PSAyOwotCi0gICAgICAvKiB1cGRhdGUgb2xkIGluc3RydWN0aW9uIGRhdGEgKi8KLSAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIChmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWluc24gPSAoYnVmWzBdIDw8IDI0KSB8IChidWZbMV0gPDwgMTYpIHwgKGJ1ZlsyXSA8PCA4KSB8IGJ1ZlszXTsKLSAgICAgIGVsc2UKLQlpbnNuID0gKGJ1ZlszXSA8PCAyNCkgfCAoYnVmWzJdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMF07Ci0KLSAgICAgIGlmICh2YWx1ZSA+PSAtMHg4MDAwICYmIHZhbHVlIDwgMHg4MDAwKQotCWluc24gfD0gdmFsdWUgJiAweGZmZmY7Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIGJyYW5jaCBvZmZzZXQgaXMgdG9vIGxhcmdlLiAgSWYgdGhpcyBpcyBhbgotICAgICAgICAgICAgIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBhbmQgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIFBJQyBjb2RlLAotICAgICAgICAgICAgIHdlIGNhbiBjb252ZXJ0IGl0IHRvIGFuIGFic29sdXRlIGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotCSAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgICAgICYmIGZpeFAtPmZ4X2RvbmUKLQkgICAgICAmJiBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzID49IHRleHRfc2VjdGlvbi0+dm1hCi0JICAgICAgJiYgKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJICA8IHRleHRfc2VjdGlvbi0+dm1hICsgdGV4dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgICAgJiYgKChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgxMDAwMDAwMAkgLyogYmVxICQwLCQwICovCi0JCSAgfHwgKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MDEwMDAwCSAvKiBiZ2V6ICQwICovCi0JCSAgfHwgKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MTEwMDAwKSkgLyogYmdlemFsICQwICovCi0JICAgIHsKLQkgICAgICBpZiAoKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MTEwMDAwKQkgLyogYmdlemFsICQwICovCi0JCWluc24gPSAweDBjMDAwMDAwOwkvKiBqYWwgKi8KLQkgICAgICBlbHNlCi0JCWluc24gPSAweDA4MDAwMDAwOwkvKiBqICovCi0JICAgICAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX01JUFNfSk1QOwotCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKHRleHRfc2VjdGlvbik7Ci0JICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gKHZhbHVlIDw8IDIpICsgbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FLiAgSXQgd291bGQgYmUgcG9zc2libGUgaW4gcHJpbmNpcGxlIHRvIGhhbmRsZQotICAgICAgICAgICAgICAgICBjb25kaXRpb25hbCBicmFuY2hlcyB3aGljaCBvdmVyZmxvdy4gIFRoZXkgY291bGQgYmUKLSAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgaW50byBhIGJyYW5jaCBhcm91bmQgYSBqdW1wLiAgVGhpcyB3b3VsZAotICAgICAgICAgICAgICAgICByZXF1aXJlIHNldHRpbmcgdXAgdmFyaWFudCBmcmFncyBmb3IgZWFjaCBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgYnJhbmNoIHR5cGUuICBUaGUgbmF0aXZlIE1JUFMgYXNzZW1ibGVyIGF0dGVtcHRzIHRvCi0gICAgICAgICAgICAgICAgIGhhbmRsZSB0aGVzZSBjYXNlcywgYnV0IGl0IGFwcGVhcnMgdG8gZG8gaXQKLSAgICAgICAgICAgICAgICAgaW5jb3JyZWN0bHkuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotCSAgICB9Ci0JfQotCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopIGJ1ZiwgKHZhbHVlVCkgaW5zbiwgNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kKLSAgICAgICAgICAmJiAhU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICAgICAmJiAhU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgICAgIFNfU0VUX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnRlcm5hbEVycm9yICgpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotI2lmIDAKLXZvaWQKLXByaW50SW5zbiAob2MpCi0gICAgIHVuc2lnbmVkIGxvbmcgb2M7Ci17Ci0gIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqcDsKLSAgaW50IHRyZWcsIHNyZWcsIGRyZWcsIHNoYW10OwotICBzaG9ydCBpbW07Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1PUENPREVTOyArK2kpCi0gICAgewotICAgICAgcCA9ICZtaXBzX29wY29kZXNbaV07Ci0gICAgICBpZiAoKChvYyAmIHAtPm1hc2spID09IHAtPm1hdGNoKSAmJiAocC0+cGluZm8gIT0gSU5TTl9NQUNSTykpCi0JewotCSAgcHJpbnRmICgiJTA4bHggJXNcdCIsIG9jLCBwLT5uYW1lKTsKLQkgIHRyZWcgPSAob2MgPj4gMTYpICYgMHgxZjsKLQkgIHNyZWcgPSAob2MgPj4gMjEpICYgMHgxZjsKLQkgIGRyZWcgPSAob2MgPj4gMTEpICYgMHgxZjsKLQkgIHNoYW10ID0gKG9jID4+IDYpICYgMHgxZjsKLQkgIGltbSA9IG9jOwotCSAgZm9yIChhcmdzID0gcC0+YXJnczs7ICsrYXJncykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKmFyZ3MpCi0JCXsKLQkJY2FzZSAnXDAnOgotCQkgIHByaW50ZiAoIlxuIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLCc6Ci0JCWNhc2UgJygnOgotCQljYXNlICcpJzoKLQkJICBwcmludGYgKCIlYyIsICphcmdzKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdyJzoKLQkJICBhc3NlcnQgKHRyZWcgPT0gc3JlZyk7Ci0JCSAgcHJpbnRmICgiJCVkLCQlZCIsIHRyZWcsIHNyZWcpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2QnOgotCQljYXNlICdHJzoKLQkJICBwcmludGYgKCIkJWQiLCBkcmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICd0JzoKLQkJY2FzZSAnRSc6Ci0JCSAgcHJpbnRmICgiJCVkIiwgdHJlZyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnayc6Ci0JCSAgcHJpbnRmICgiMHgleCIsIHRyZWcpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2InOgotCQljYXNlICdzJzoKLQkJICBwcmludGYgKCIkJWQiLCBzcmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdhJzoKLQkJICBwcmludGYgKCIweCUwOGx4Iiwgb2MgJiAweDFmZmZmZmYpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2knOgotCQljYXNlICdqJzoKLQkJY2FzZSAnbyc6Ci0JCWNhc2UgJ3UnOgotCQkgIHByaW50ZiAoIiVkIiwgaW1tKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICc8JzoKLQkJY2FzZSAnPic6Ci0JCSAgcHJpbnRmICgiJCVkIiwgc2hhbXQpOwotCQkgIGNvbnRpbnVlOwotCi0JCWRlZmF1bHQ6Ci0JCSAgaW50ZXJuYWxFcnJvciAoKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgcHJpbnRmIChfKCIlMDhseCAgVU5ERUZJTkVEXG4iKSwgb2MpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzeW1ib2xTICoKLWdldF9zeW1ib2wgKCkKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN5bWJvbFMgKnA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gKHN5bWJvbFMgKikgc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICByZXR1cm4gcDsKLX0KLQotLyogQWxpZ24gdGhlIGN1cnJlbnQgZnJhZyB0byBhIGdpdmVuIHBvd2VyIG9mIHR3by4gIFRoZSBNSVBTIGFzc2VtYmxlcgotICAgYWxzbyBhdXRvbWF0aWNhbGx5IGFkanVzdHMgYW55IHByZWNlZGluZyBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2FsaWduICh0bywgZmlsbCwgbGFiZWwpCi0gICAgIGludCB0bzsKLSAgICAgaW50IGZpbGw7Ci0gICAgIHN5bWJvbFMgKmxhYmVsOwotewotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0gIGZyYWdfYWxpZ24gKHRvLCBmaWxsLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgdG8pOwotICBpZiAobGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGFiZWwsIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChsYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICB9Ci19Ci0KLS8qIEFsaWduIHRvIGEgZ2l2ZW4gcG93ZXIgb2YgdHdvLiAgLmFsaWduIDAgdHVybnMgb2ZmIHRoZSBhdXRvbWF0aWMKLSAgIGFsaWdubWVudCB1c2VkIGJ5IHRoZSBkYXRhIGNyZWF0aW5nIHBzZXVkby1vcHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbGlnbiAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLSAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7Ci0KLSAgLyoKLQotICAgIG8gIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIHB1bGxzIGRvd24gYW55IGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgbGFiZWwKLSAgICAgICB0byB0aGUgYWxpZ25lZCBhZGRyZXNzLgotICAgIG8gIEl0J3Mgbm90IGRvY3VtZW50ZWQgYnV0IGF1dG8gYWxpZ25tZW50IGlzIHJlaW5zdGF0ZWQgYnkKLSAgICAgICBhIC5hbGlnbiBwc2V1ZG8gaW5zdHJ1Y3Rpb24uCi0gICAgbyAgTm90ZSBhbHNvIHRoYXQgYWZ0ZXIgYXV0byBhbGlnbm1lbnQgaXMgdHVybmVkIG9mZiB0aGUgbWlwcyBhc3NlbWJsZXIKLSAgICAgICBpc3N1ZXMgYW4gZXJyb3Igb24gYXR0ZW1wdCB0byBhc3NlbWJsZSBhbiBpbXByb3Blcmx5IGFsaWduZWQgZGF0YSBpdGVtLgotICAgICAgIFdlIGRvbid0LgotCi0gICAgKi8KLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKLSAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIpLCB0ZW1wID0gbWF4X2FsaWdubWVudCk7Ci0gIGVsc2UgaWYgKHRlbXAgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkLiIpKTsKLSAgICAgIHRlbXAgPSAwOwotICAgIH0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgdGVtcF9maWxsID0gMDsKLSAgaWYgKHRlbXApCi0gICAgewotICAgICAgYXV0b19hbGlnbiA9IDE7Ci0gICAgICBtaXBzX2FsaWduICh0ZW1wLCAoaW50KSB0ZW1wX2ZpbGwsCi0JCSAgaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGF1dG9fYWxpZ24gPSAwOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1taXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi17Ci0gIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY2hhbmdlX3NlYyAoc2VjKQotICAgICBpbnQgc2VjOwotewotICBzZWdUIHNlZzsKLQotICAvKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHdlIG9ubHkgdXNlIHRoZSAudGV4dCwgLmxpdDgsCi0gICAgIC5zZGF0YSBhbmQgLnNic3Mgc2VjdGlvbnMuICBXZSBjaGFuZ2UgdGhlIC5kYXRhIGFuZCAucmRhdGEKLSAgICAgcHNldWRvLW9wcyB0byB1c2UgLnNkYXRhLiAgKi8KLSAgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotICAgICAgJiYgKHNlYyA9PSAnZCcgfHwgc2VjID09ICdyJykpCi0gICAgc2VjID0gJ3MnOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBUaGUgRUxGIGJhY2tlbmQgbmVlZHMgdG8ga25vdyB0aGF0IHdlIGFyZSBjaGFuZ2luZyBzZWN0aW9ucywgc28KLSAgICAgdGhhdCAucHJldmlvdXMgd29ya3MgY29ycmVjdGx5LiAgV2UgY291bGQgZG8gc29tZXRoaW5nIGxpa2UgY2hlY2sKLSAgICAgZm9yIGEgb2JqX3NlY3Rpb25fY2hhbmdlX2hvb2sgbWFjcm8sIGJ1dCB0aGF0IG1pZ2h0IGJlIGNvbmZ1c2luZwotICAgICBhcyBpdCB3b3VsZCBub3QgYmUgYXBwcm9wcmlhdGUgdG8gdXNlIGl0IGluIHRoZSBzZWN0aW9uIGNoYW5naW5nCi0gICAgIGZ1bmN0aW9ucyBpbiByZWFkLmMsIHNpbmNlIG9iai1lbGYuYyBpbnRlcmNlcHRzIHRob3NlLiAgRklYTUU6Ci0gICAgIFRoaXMgc2hvdWxkIGJlIGNsZWFuZXIsIHNvbWVob3cuICAqLwotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLQotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0gIHN3aXRjaCAoc2VjKQotICAgIHsKLSAgICBjYXNlICd0JzoKLSAgICAgIHNfdGV4dCAoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLQl7Ci0JICBzZWcgPSBzdWJzZWdfbmV3IChSREFUQV9TRUNUSU9OX05BTUUsCi0JCQkgICAgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQkgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLAotCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgfCBTRUNfREFUQSkpOwotCSAgICAgIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCA0KTsKLQkgICAgfQotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJObyByZWFkIG9ubHkgZGF0YSBzZWN0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0JewotCSAgc2VnID0gc3Vic2VnX25ldyAoIi5zZGF0YSIsIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0JICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCQkgICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkJICAgICB8IFNFQ19EQVRBKTsKLQkgICAgICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgNCk7Ci0JICAgIH0KLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJHbG9iYWwgcG9pbnRlcnMgbm90IHN1cHBvcnRlZDsgcmVjb21waWxlIC1HIDAiKSk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgYXV0b19hbGlnbiA9IDE7Ci19Ci0KLXZvaWQKLW1pcHNfZW5hYmxlX2F1dG9fYWxpZ24gKCkKLXsKLSAgYXV0b19hbGlnbiA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbnMgKGxvZ19zaXplKQotICAgICBpbnQgbG9nX3NpemU7Ci17Ci0gIHN5bWJvbFMgKmxhYmVsOwotCi0gIGxhYmVsID0gaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEw7Ci0gIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKLSAgaWYgKGxvZ19zaXplID4gMCAmJiBhdXRvX2FsaWduKQotICAgIG1pcHNfYWxpZ24gKGxvZ19zaXplLCAwLCBsYWJlbCk7Ci0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0gIGNvbnMgKDEgPDwgbG9nX3NpemUpOwotfQotCi1zdGF0aWMgdm9pZAotc19mbG9hdF9jb25zICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgc3ltYm9sUyAqbGFiZWw7Ci0KLSAgbGFiZWwgPSBpbnNuX2xhYmVscyAhPSBOVUxMID8gaW5zbl9sYWJlbHMtPmxhYmVsIDogTlVMTDsKLQotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0KLSAgaWYgKGF1dG9fYWxpZ24pCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gJ2QnKQotCW1pcHNfYWxpZ24gKDMsIDAsIGxhYmVsKTsKLSAgICAgIGVsc2UKLQltaXBzX2FsaWduICgyLCAwLCBsYWJlbCk7Ci0gICAgfQotCi0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0KLSAgZmxvYXRfY29ucyAodHlwZSk7Ci19Ci0KLS8qIEhhbmRsZSAuZ2xvYmwuICBXZSBuZWVkIHRvIG92ZXJyaWRlIGl0IGJlY2F1c2Ugb24gSXJpeCA1IHlvdSBhcmUKLSAgIHBlcm1pdHRlZCB0byBzYXkKLSAgICAgICAuZ2xvYmwgZm9vIC50ZXh0Ci0gICB3aGVyZSBmb28gaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgdG8gbWVhbiB0aGF0IGZvbyBzaG91bGQgYmUKLSAgIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZ2xvYmwgKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZmxhZ3dvcmQgZmxhZzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBPbiBJcml4IDUsIGV2ZXJ5IGdsb2JhbCBzeW1ib2wgdGhhdCBpcyBub3QgZXhwbGljaXRseSBsYWJlbGxlZCBhcwotICAgICBiZWluZyBhIGZ1bmN0aW9uIGlzIGFwcGFyZW50bHkgbGFiZWxsZWQgYXMgYmVpbmcgYW4gb2JqZWN0LiAgKi8KLSAgZmxhZyA9IEJTRl9PQkpFQ1Q7Ci0KLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGNoYXIgKnNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBzZWNuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgc2VjbmFtZSk7Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JYXNfYmFkIChfKCIlczogbm8gc3VjaCBzZWN0aW9uIiksIHNlY25hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCWZsYWcgPSBCU0ZfRlVOQ1RJT047Ci0gICAgfQotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gZmxhZzsKLQotICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX29wdGlvbiAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGNoYXIgKm9wdDsKLSAgY2hhciBjOwotCi0gIG9wdCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmICgqb3B0ID09ICdPJykKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogV2hhdCBkb2VzIHRoaXMgbWVhbj8gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChvcHQsICJwaWMiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBpID0gYXRvaSAob3B0ICsgMyk7Ci0gICAgICBpZiAoaSA9PSAwKQotCW1pcHNfcGljID0gTk9fUElDOwotICAgICAgZWxzZSBpZiAoaSA9PSAyKQotCW1pcHNfcGljID0gU1ZSNF9QSUM7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCIub3B0aW9uIHBpYyVkIG5vdCBzdXBwb3J0ZWQiKSwgaSk7Ci0KLSAgICAgIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUICYmIG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIGlmIChnX3N3aXRjaF9zZWVuICYmIGdfc3dpdGNoX3ZhbHVlICE9IDApCi0JICAgIGFzX3dhcm4gKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7Ci0JICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0JICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgMCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBvcHRpb24gXCIlc1wiIiksIG9wdCk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIHN0YWNrIG9mIC5zZXQgdmFsdWVzLiAgKi8KLQotc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrCi17Ci0gIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqbmV4dDsKLSAgc3RydWN0IG1pcHNfc2V0X29wdGlvbnMgb3B0aW9uczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKm1pcHNfb3B0c19zdGFjazsKLQotLyogSGFuZGxlIHRoZSAuc2V0IHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNzZXQgKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyLCBjaDsKLQotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgY2ggPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotICBpZiAoc3RyY21wIChuYW1lLCAicmVvcmRlciIpID09IDApCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIgJiYgcHJldl9ub3BfZnJhZyAhPSBOVUxMKQotCXsKLQkgIC8qIElmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBub3BzLCB3ZSBjYW4gZGlzY2FyZCB0aGVtLiAgVGhlCi0JICAgICB1c3VhbCBub3AgaGFuZGxpbmcgd2lsbCBpbnNlcnQgYW55IHRoYXQgYXJlIHN0aWxsCi0JICAgICBuZWVkZWQuICovCi0JICBwcmV2X25vcF9mcmFnLT5mcl9maXggLT0gKHByZXZfbm9wX2ZyYWdfaG9sZHMKLQkJCQkgICAgKiAobWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0KSk7Ci0JICBwcmV2X25vcF9mcmFnID0gTlVMTDsKLQl9Ci0gICAgICBtaXBzX29wdHMubm9yZW9yZGVyID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vcmVvcmRlciIpID09IDApCi0gICAgewotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICBtaXBzX29wdHMubm9yZW9yZGVyID0gMTsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYXQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9hdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYXQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWFjcm8iKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub21hY3JvIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWlwc19vcHRzLm5vcmVvcmRlciA9PSAwKQotCWFzX2JhZCAoXygiYG5vcmVvcmRlcicgbXVzdCBiZSBzZXQgYmVmb3JlIGBub21hY3JvJyIpKTsKLSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb3ZlIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICJub3ZvbGF0aWxlIikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMubm9tb3ZlID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vbW92ZSIpID09IDAgfHwgc3RyY21wIChuYW1lLCAidm9sYXRpbGUiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub21vdmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYm9wdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYm9wdCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub2JvcHQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2JvcHQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWlwczE2IikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIk1JUFMtMTYiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5taXBzMTYgPSAxOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub21pcHMxNiIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICJub01JUFMtMTYiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5taXBzMTYgPSAwOwotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAibWlwcyIsIDQpID09IDApCi0gICAgewotICAgICAgaW50IGlzYTsKLQotICAgICAgLyogUGVybWl0IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgSVNBIG9uIHRoZSBmbHkuICBOZWVkbGVzcyB0bwotCSBzYXksIG1pc3VzZSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcy4gICovCi0gICAgICBpc2EgPSBhdG9pIChuYW1lICsgNCk7Ci0gICAgICBpZiAoaXNhID09IDApCi0JbWlwc19vcHRzLmlzYSA9IGZpbGVfbWlwc19pc2E7Ci0gICAgICBlbHNlIGlmIChpc2EgPCAxIHx8IGlzYSA+IDQpCi0JYXNfYmFkIChfKCJ1bmtub3duIElTQSBsZXZlbCIpKTsKLSAgICAgIGVsc2UKLQltaXBzX29wdHMuaXNhID0gaXNhOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0b2V4dGVuZCIpID09IDApCi0gICAgbWlwc19vcHRzLm5vYXV0b2V4dGVuZCA9IDA7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vYXV0b2V4dGVuZCIpID09IDApCi0gICAgbWlwc19vcHRzLm5vYXV0b2V4dGVuZCA9IDE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInB1c2giKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqczsKLQotICAgICAgcyA9IChzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpzKTsKLSAgICAgIHMtPm5leHQgPSBtaXBzX29wdHNfc3RhY2s7Ci0gICAgICBzLT5vcHRpb25zID0gbWlwc19vcHRzOwotICAgICAgbWlwc19vcHRzX3N0YWNrID0gczsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInBvcCIpID09IDApCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICpzOwotCi0gICAgICBzID0gbWlwc19vcHRzX3N0YWNrOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlhc19iYWQgKF8oIi5zZXQgcG9wIHdpdGggbm8gLnNldCBwdXNoIikpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHdlJ3JlIGNoYW5naW5nIHRoZSByZW9yZGVyIG1vZGUgd2UgbmVlZCB0byBoYW5kbGUKLSAgICAgICAgICAgICBkZWxheSBzbG90cyBjb3JyZWN0bHkuICAqLwotCSAgaWYgKHMtPm9wdGlvbnMubm9yZW9yZGVyICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcikKLQkgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0JICBlbHNlIGlmICghIHMtPm9wdGlvbnMubm9yZW9yZGVyICYmIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAocHJldl9ub3BfZnJhZyAhPSBOVUxMKQotCQl7Ci0JCSAgcHJldl9ub3BfZnJhZy0+ZnJfZml4IC09IChwcmV2X25vcF9mcmFnX2hvbGRzCi0JCQkJCSAgICAqIChtaXBzX29wdHMubWlwczE2ID8gMiA6IDQpKTsKLQkJICBwcmV2X25vcF9mcmFnID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIG1pcHNfb3B0cyA9IHMtPm9wdGlvbnM7Ci0JICBtaXBzX29wdHNfc3RhY2sgPSBzLT5uZXh0OwotCSAgZnJlZSAocyk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlRyaWVkIHRvIHNldCB1bnJlY29nbml6ZWQgc3ltYm9sOiAlc1xuIiksIG5hbWUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGNoOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hYmljYWxscyBwc2V1ZG8tb3AuICBJIGJlbGlldmUgdGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gICAub3B0aW9uIHBpYzIuICBJdCBtZWFucyB0byBnZW5lcmF0ZSBTVlI0IFBJQyBjYWxscy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FiaWNhbGxzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG1pcHNfcGljID0gU1ZSNF9QSUM7Ci0gIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotICAgIHsKLSAgICAgIGlmIChnX3N3aXRjaF9zZWVuICYmIGdfc3dpdGNoX3ZhbHVlICE9IDApCi0JYXNfd2FybiAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBQSUMgY29kZSIpKTsKLSAgICAgIGdfc3dpdGNoX3ZhbHVlID0gMDsKLSAgICB9Ci0gIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuY3Bsb2FkIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgU1ZSNAotICAgUElDIGNvZGUuICBJdCBzZXRzIHRoZSAkZ3AgcmVnaXN0ZXIgZm9yIHRoZSBmdW5jdGlvbiBiYXNlZCBvbiB0aGUKLSAgIGZ1bmN0aW9uIGFkZHJlc3MsIHdoaWNoIGlzIGluIHRoZSByZWdpc3RlciBuYW1lZCBpbiB0aGUgYXJndW1lbnQuCi0gICBUaGlzIHVzZXMgYSByZWxvY2F0aW9uIGFnYWluc3QgX2dwX2Rpc3AsIHdoaWNoIGlzIGhhbmRsZWQgc3BlY2lhbGx5Ci0gICBieSB0aGUgbGlua2VyLiAgVGhlIHJlc3VsdCBpczoKLQlsdWkJJGdwLCVoaShfZ3BfZGlzcCkKLQlhZGRpdQkkZ3AsJGdwLCVsbyhfZ3BfZGlzcCkKLQlhZGR1CSRncCwkZ3AsLmNwbG9hZCBhcmd1bWVudAotICAgVGhlIC5jcGxvYWQgYXJndW1lbnQgaXMgbm9ybWFsbHkgJDI1ID09ICR0OS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NwbG9hZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleDsKLSAgaW50IGljbnQgPSAwOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBTVlI0IFBJQyBjb2RlLCAuY3Bsb2FkIGlzIGlnbm9yZWQuICAqLwotICBpZiAobWlwc19waWMgIT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgc19pZ25vcmUgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiAuY3Bsb2FkIHNob3VsZCBiZSBhIGluIC5zZXQgbm9yZW9yZGVyIHNlY3Rpb24uICAqLwotICBpZiAobWlwc19vcHRzLm5vcmVvcmRlciA9PSAwKQotICAgIGFzX3dhcm4gKF8oIi5jcGxvYWQgbm90IGluIG5vcmVvcmRlciBzZWN0aW9uIikpOwotCi0gIGV4Llhfb3AgPSBPX3N5bWJvbDsKLSAgZXguWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoIl9ncF9kaXNwIik7Ci0gIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQotICAvKiBJbiBFTEYsIHRoaXMgc3ltYm9sIGlzIGltcGxpY2l0bHkgYW4gU1RUX09CSkVDVCBzeW1ib2wuICAqLwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoZXguWF9hZGRfc3ltYm9sKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQotICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsIEdQKTsKLSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsICJhZGRpdSIsICJ0LHIsaiIsIEdQLCBHUCwKLQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCi0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJhZGR1IiwgImQsdix0IiwKLQkgICAgICAgR1AsIEdQLCB0Y19nZXRfcmVnaXN0ZXIgKDApKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5jcHJlc3RvcmUgcHNldWRvLW9wLiAgVGhpcyBzdG9yZXMgJGdwIGludG8gYSBnaXZlbgotICAgb2Zmc2V0IGZyb20gJHNwLiAgVGhlIG9mZnNldCBpcyByZW1lbWJlcmVkLCBhbmQgYWZ0ZXIgbWFraW5nIGEgUElDCi0gICBjYWxsICRncCBpcyByZXN0b3JlZCBmcm9tIHRoYXQgbG9jYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc19jcHJlc3RvcmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGludCBpY250ID0gMDsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZSwgLmNwcmVzdG9yZSBpcyBpZ25vcmVkLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbWlwc19jcHJlc3RvcmVfb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXguWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCi0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4LAotCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQk/ICJzdyIgOiAic2QiKSwKLQkgICAgICAgInQsbyhiKSIsIEdQLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgU1ApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmdwd29yZCBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFBJQwotICAgY29kZS4gIEl0IGdlbmVyYXRlcyBhIDMyIGJpdCBHUCByZWxhdGl2ZSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2dwd29yZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpsYWJlbDsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGNoYXIgKnA7Ci0KLSAgLyogV2hlbiBub3QgZ2VuZXJhdGluZyBQSUMgY29kZSwgdGhpcyBpcyB0cmVhdGVkIGFzIC53b3JkLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfY29ucyAoMik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxhYmVsID0gaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEw7Ci0gIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICBpZiAoYXV0b19hbGlnbikKLSAgICBtaXBzX2FsaWduICgyLCAwLCBsYWJlbCk7Ci0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4KTsKLQotICBpZiAoZXguWF9vcCAhPSBPX3N5bWJvbCB8fCBleC5YX2FkZF9udW1iZXIgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVuc3VwcG9ydGVkIHVzZSBvZiAuZ3B3b3JkIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgMCwgNCk7Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LCAmZXgsIDAsCi0JICAgICAgIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmNwYWRkIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCBzd2l0Y2gKLSAgIHRhYmxlcyBpbiBTVlI0IFBJQyBjb2RlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfY3BhZGQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGljbnQgPSAwOwotICBpbnQgcmVnOwotCi0gIC8qIFRoaXMgaXMgaWdub3JlZCB3aGVuIG5vdCBnZW5lcmF0aW5nIFNWUjQgUElDIGNvZGUuICAqLwotICBpZiAobWlwc19waWMgIT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgc19pZ25vcmUgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBBZGQgJGdwIHRvIHRoZSByZWdpc3RlciBuYW1lZCBhcyBhbiBhcmd1bWVudC4gICovCi0gIHJlZyA9IHRjX2dldF9yZWdpc3RlciAoMCk7Ci0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCT8gImFkZHUiIDogImRhZGR1IiksCi0JICAgICAgICJkLHYsdCIsIHJlZywgcmVnLCBHUCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsgIAotfQotCi0vKiBIYW5kbGUgdGhlIC5pbnNuIHBzZXVkby1vcC4gIFRoaXMgbWFya3MgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluCi0gICBtaXBzMTYgbW9kZS4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvIGhhbmRsZSB0aGVtIHNwZWNpYWxseSwKLSAgIHN1Y2ggYXMgZ2VuZXJhdGluZyBqYWx4IGluc3RydWN0aW9ucyB3aGVuIG5lZWRlZC4gIFdlIGFsc28gbWFrZQotICAgdGhlbSBvZGQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXNzZW1ibHksIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZQotICAgcmlnaHQgc29ydCBvZiBjb2RlLiAgV2Ugd2lsbCBtYWtlIHRoZW0gZXZlbiBpbiB0aGUgYWRqdXN0X3N5bXRhYgotICAgcm91dGluZSwgd2hpbGUgbGVhdmluZyB0aGVtIG1hcmtlZC4gIFRoaXMgaXMgY29udmVuaWVudCBmb3IgdGhlCi0gICBkZWJ1Z2dlciBhbmQgdGhlIGRpc2Fzc2VtYmxlci4gIFRoZSBsaW5rZXIga25vd3MgdG8gbWFrZSB0aGVtIG9kZAotICAgYWdhaW4uICAqLwotCi1zdGF0aWMgdm9pZAotc19pbnNuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuc3RhYm4gZGlyZWN0aXZlLiAgV2UgbmVlZCB0aGVzZSBpbiBvcmRlciB0byBtYXJrIGEgbGFiZWwKLSAgIGFzIGJlaW5nIGEgbWlwczE2IHRleHQgbGFiZWwgY29ycmVjdGx5LiAgU29tZXRpbWVzIHRoZSBjb21waWxlcgotICAgd2lsbCBlbWl0IGEgbGFiZWwsIGZvbGxvd2VkIGJ5IGEgLnN0YWJuLCBhbmQgdGhlbiBzd2l0Y2ggc2VjdGlvbnMuCi0gICBJZiB0aGUgbGFiZWwgYW5kIC5zdGFibiBhcmUgaW4gbWlwczE2IG1vZGUsIHRoZW4gdGhlIGxhYmVsIGlzCi0gICByZWFsbHkgYSBtaXBzMTYgdGV4dCBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfc3RhYiAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGlmICh0eXBlID09ICduJyAmJiBtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKLQotICBzX3N0YWIgKHR5cGUpOwotfQotCi0vKiBIYW5kbGUgdGhlIC53ZWFrZXh0IHBzZXVkby1vcCBhcyBkZWZpbmVkIGluIEthbmUgYW5kIEhlaW5yaWNoLgotICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfd2Vha2V4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQl7Ci0JICBhc19iYWQgKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIsCi0JCSAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQl9Ci0gICAgICAKLSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgICAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotCXsKLQkgIGFzX2JhZCAoImJhZCAud2Vha2V4dCBkaXJlY3RpdmUiKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsICZleHApOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQYXJzZSBhIHJlZ2lzdGVyIHN0cmluZyBpbnRvIGEgbnVtYmVyLiAgQ2FsbGVkIGZyb20gdGhlIEVDT0ZGIGNvZGUKLSAgIHRvIHBhcnNlIC5mcmFtZS4gIFRoZSBhcmd1bWVudCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBmcmFtZQotICAgcmVnaXN0ZXIsIHNvIHRoYXQgd2UgY2FuIHJlY29yZCBpdCBpbiBtaXBzX2ZyYW1lX3JlZy4gICovCi0KLWludAotdGNfZ2V0X3JlZ2lzdGVyIChmcmFtZSkKLSAgICAgaW50IGZyYW1lOwotewotICBpbnQgcmVnOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnJCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiZXhwZWN0ZWQgYCQnIikpOwotICAgICAgcmVnID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICByZWcgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChyZWcgPCAwIHx8IHJlZyA+PSAzMikKLQl7Ci0JICBhc193YXJuIChfKCJCYWQgcmVnaXN0ZXIgbnVtYmVyIikpOwotCSAgcmVnID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImZwIiwgMikgPT0gMCkKLQlyZWcgPSBGUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNwIiwgMikgPT0gMCkKLQlyZWcgPSBTUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImdwIiwgMikgPT0gMCkKLQlyZWcgPSBHUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImF0IiwgMikgPT0gMCkKLQlyZWcgPSBBVDsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc193YXJuIChfKCJVbnJlY29nbml6ZWQgcmVnaXN0ZXIgbmFtZSIpKTsKLQkgIHJlZyA9IDA7Ci0JfQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgfQotICBpZiAoZnJhbWUpCi0gICAgbWlwc19mcmFtZV9yZWcgPSByZWcgIT0gMCA/IHJlZyA6IFNQOwotICByZXR1cm4gcmVnOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgdmFsdWVUIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBhbGlnbiBFTEYgc2VjdGlvbnMgdG8gdGhlIGZ1bGwgYWxpZ25tZW50LgotICAgICBIb3dldmVyLCBJcml4IDUgbWF5IHByZWZlciB0aGF0IHdlIGFsaWduIHRoZW0gYXQgbGVhc3QgdG8gYSAxNgotICAgICBieXRlIGJvdW5kYXJ5LiAgV2UgZG9uJ3QgYm90aGVyIHRvIGFsaWduIHRoZSBzZWN0aW9ucyBpZiB3ZSBhcmUKLSAgICAgdGFyZ2V0ZWQgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gICovCi0gIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpID09IDApCi0gICAgcmV0dXJuIGFkZHI7Ci0gIGlmIChhbGlnbiA+IDQpCi0gICAgYWxpZ24gPSA0OwotI2VuZGlmCi0KLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLS8qIFV0aWxpdHkgcm91dGluZSwgY2FsbGVkIGZyb20gYWJvdmUgYXMgd2VsbC4gIElmIGNhbGxlZCB3aGlsZSB0aGUKLSAgIGlucHV0IGZpbGUgaXMgc3RpbGwgYmVpbmcgcmVhZCwgaXQncyBvbmx5IGFuIGFwcHJveGltYXRpb24uICAoRm9yCi0gICBleGFtcGxlLCBhIHN5bWJvbCBtYXkgbGF0ZXIgYmVjb21lIGRlZmluZWQgd2hpY2ggYXBwZWFyZWQgdG8gYmUKLSAgIHVuZGVmaW5lZCBlYXJsaWVyLikgICovCi0KLXN0YXRpYyBpbnQKLW5vcGljX25lZWRfcmVsYXggKHN5bSwgYmVmb3JlX3JlbGF4aW5nKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCBiZWZvcmVfcmVsYXhpbmc7Ci17Ci0gIGlmIChzeW0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzeW1uYW1lOwotICAgICAgaW50IGNoYW5nZTsKLQotICAgICAgLyogRmluZCBvdXQgd2hldGhlciB0aGlzIHN5bWJvbCBjYW4gYmUgcmVmZXJlbmNlZCBvZmYgdGhlIEdQCi0JIHJlZ2lzdGVyLiAgSXQgY2FuIGJlIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgLUcgc2l6ZSBvciBpZgotCSBpdCBpcyBpbiB0aGUgLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24uICBDZXJ0YWluIHN5bWJvbHMgY2FuCi0JIG5vdCBiZSByZWZlcmVuY2VkIG9mZiB0aGUgR1AsIGFsdGhvdWdoIGl0IGFwcGVhcnMgYXMgdGhvdWdoCi0JIHRoZXkgY2FuLiAgKi8KLSAgICAgIHN5bW5hbWUgPSBTX0dFVF9OQU1FIChzeW0pOwotICAgICAgaWYgKHN5bW5hbWUgIT0gKGNvbnN0IGNoYXIgKikgTlVMTAotCSAgJiYgKHN0cmNtcCAoc3ltbmFtZSwgImVwcm9sIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgImV0ZXh0IikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9ncCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJlZGF0YSIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZmJzcyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZmRhdGEiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2Z0ZXh0IikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgImVuZCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZ3BfZGlzcCIpID09IDApKQotCWNoYW5nZSA9IDE7Ci0gICAgICBlbHNlIGlmICgoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpCi0JICAgICAgICYmICgwCi0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotCQkgICB8fCAoc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2V4dGVybl9zaXplICE9IDAKLQkJICAgICAgICYmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZXh0ZXJuX3NpemUKLQkJCSAgIDw9IGdfc3dpdGNoX3ZhbHVlKSkKLSNlbmRpZgotCQkgICAvKiBXZSBtdXN0IGRlZmVyIHRoaXMgZGVjaXNpb24gdW50aWwgYWZ0ZXIgdGhlIHdob2xlCi0JCSAgICAgIGZpbGUgaGFzIGJlZW4gcmVhZCwgc2luY2UgdGhlcmUgbWlnaHQgYmUgYSAuZXh0ZXJuCi0JCSAgICAgIGFmdGVyIHRoZSBmaXJzdCB1c2Ugb2YgdGhpcyBzeW1ib2wuICAqLwotCQkgICB8fCAoYmVmb3JlX3JlbGF4aW5nCi0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotCQkgICAgICAgJiYgc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2V4dGVybl9zaXplID09IDAKLSNlbmRpZgotCQkgICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gMCkKLQkJICAgfHwgKFNfR0VUX1ZBTFVFIChzeW0pICE9IDAKLQkJICAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pIDw9IGdfc3dpdGNoX3ZhbHVlKSkpCi0JY2hhbmdlID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpzZWduYW1lOwotCi0JICBzZWduYW1lID0gc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKTsKLQkgIGFzc2VydCAoc3RyY21wIChzZWduYW1lLCAiLmxpdDgiKSAhPSAwCi0JCSAgJiYgc3RyY21wIChzZWduYW1lLCAiLmxpdDQiKSAhPSAwKTsKLQkgIGNoYW5nZSA9IChzdHJjbXAgKHNlZ25hbWUsICIuc2RhdGEiKSAhPSAwCi0JCSAgICAmJiBzdHJjbXAgKHNlZ25hbWUsICIuc2JzcyIpICE9IDApOwotCX0KLSAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgfQotICBlbHNlCi0gICAgLyogV2UgYXJlIG5vdCBvcHRpbWl6aW5nIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICAgIHJldHVybiAxOwotfQotCi0vKiBHaXZlbiBhIG1pcHMxNiB2YXJpYW50IGZyYWcgRlJBR1AsIHJldHVybiBub24temVybyBpZiBpdCBuZWVkcyBhbgotICAgZXh0ZW5kZWQgb3Bjb2RlLiAgU0VDIGlzIHRoZSBzZWN0aW9uIHRoZSBmcmFnIGlzIGluLiAgKi8KLQotc3RhdGljIGludAotbWlwczE2X2V4dGVuZGVkX2ZyYWcgKGZyYWdwLCBzZWMsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgbG9uZyBzdHJldGNoOwotewotICBpbnQgdHlwZTsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kICpvcDsKLSAgb2Zmc2V0VCB2YWw7Ci0gIGludCBtaW50aW55LCBtYXh0aW55OwotICBzZWdUIHN5bXNlYzsKLQotICBpZiAoUkVMQVhfTUlQUzE2X1VTRVJfU01BTEwgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFJFTEFYX01JUFMxNl9VU0VSX0VYVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHJldHVybiAxOwotCi0gIHR5cGUgPSBSRUxBWF9NSVBTMTZfVFlQRSAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICBvcCA9IG1pcHMxNl9pbW1lZF9vcGVyYW5kczsKLSAgd2hpbGUgKG9wLT50eXBlICE9IHR5cGUpCi0gICAgewotICAgICAgKytvcDsKLSAgICAgIGFzc2VydCAob3AgPCBtaXBzMTZfaW1tZWRfb3BlcmFuZHMgKyBNSVBTMTZfTlVNX0lNTUVEKTsKLSAgICB9Ci0KLSAgaWYgKG9wLT51bnNwKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09ICc8JyB8fCB0eXBlID09ICc+JyB8fCB0eXBlID09ICdbJyB8fCB0eXBlID09ICddJykKLQl7Ci0JICBtaW50aW55ID0gMTsKLQkgIG1heHRpbnkgPSAxIDw8IG9wLT5uYml0czsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWludGlueSA9IDA7Ci0JICBtYXh0aW55ID0gKDEgPDwgb3AtPm5iaXRzKSAtIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1pbnRpbnkgPSAtICgxIDw8IChvcC0+bmJpdHMgLSAxKSk7Ci0gICAgICBtYXh0aW55ID0gKDEgPDwgKG9wLT5uYml0cyAtIDEpKSAtIDE7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IGFsd2F5cyBjYWxsIFNfR0VUX1ZBTFVFIGhlcmUsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0bwotICAgICBsb2NrIGluIGEgcGFydGljdWxhciBmcmFnIGFkZHJlc3MuICAqLwotICBpZiAoc3ltYm9sX2NvbnN0YW50X3AgKGZyYWdwLT5mcl9zeW1ib2wpKQotICAgIHsKLSAgICAgIHZhbCA9IChTX0dFVF9WQUxVRSAoZnJhZ3AtPmZyX3N5bWJvbCkKLQkgICAgICsgc3ltYm9sX2dldF9mcmFnIChmcmFncC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzcyk7Ci0gICAgICBzeW1zZWMgPSBTX0dFVF9TRUdNRU5UIChmcmFncC0+ZnJfc3ltYm9sKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN5bWJvbF9lcXVhdGVkX3AgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICAgJiYgKHN5bWJvbF9jb25zdGFudF9wCi0JICAgICAgIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGZyYWdwLT5mcl9zeW1ib2wpLT5YX2FkZF9zeW1ib2wpKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICplcXN5bTsKLQotICAgICAgZXFzeW0gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGZyYWdwLT5mcl9zeW1ib2wpLT5YX2FkZF9zeW1ib2w7Ci0gICAgICB2YWwgPSAoU19HRVRfVkFMVUUgKGVxc3ltKQotCSAgICAgKyBzeW1ib2xfZ2V0X2ZyYWcgKGVxc3ltKS0+ZnJfYWRkcmVzcwotCSAgICAgKyBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGZyYWdwLT5mcl9zeW1ib2wpLT5YX2FkZF9udW1iZXIKLQkgICAgICsgc3ltYm9sX2dldF9mcmFnIChmcmFncC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzcyk7Ci0gICAgICBzeW1zZWMgPSBTX0dFVF9TRUdNRU5UIChlcXN5bSk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKG9wLT5wY3JlbCkKLSAgICB7Ci0gICAgICBhZGRyZXNzVCBhZGRyOwotCi0gICAgICAvKiBXZSB3b24ndCBoYXZlIHRoZSBzZWN0aW9uIHdoZW4gd2UgYXJlIGNhbGxlZCBmcm9tCi0gICAgICAgICBtaXBzX3JlbGF4X2ZyYWcuICBIb3dldmVyLCB3ZSB3aWxsIGFsd2F5cyBoYXZlIGJlZW4gY2FsbGVkCi0gICAgICAgICBmcm9tIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGZpcnN0LiAgSWYgdGhpcyBpcyBhCi0gICAgICAgICBicmFuY2ggdG8gYSBkaWZmZXJlbnQgc2VjdGlvbiwgd2UgbWFyayBpdCBhcyBzdWNoLiAgSWYgU0VDIGlzCi0gICAgICAgICBOVUxMLCBhbmQgdGhlIGZyYWcgaXMgbm90IG1hcmtlZCwgdGhlbiBpdCBtdXN0IGJlIGEgYnJhbmNoIHRvCi0gICAgICAgICB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoUkVMQVhfTUlQUzE2X0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JICAgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc3ltc2VjICE9IHNlYykKLQkgICAgewotCSAgICAgIGZyYWdwLT5mcl9zdWJ0eXBlID0KLQkJUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgc3VwcG9ydCB0aGlzLCBhbmQgbGV0IHRoZSBsaW5rZXIKLSAgICAgICAgICAgICAgICAgY2F0Y2ggYnJhbmNoZXMgYW5kIGxvYWRzIHRoYXQgYXJlIG91dCBvZiByYW5nZS4gICovCi0JICAgICAgYXNfYmFkX3doZXJlIChmcmFncC0+ZnJfZmlsZSwgZnJhZ3AtPmZyX2xpbmUsCi0JCQkgICAgXygidW5zdXBwb3J0ZWQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlIHRvIGRpZmZlcmVudCBzZWN0aW9uIikpOwotCi0JICAgICAgcmV0dXJuIDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEluIHRoaXMgY2FzZSwgd2Uga25vdyBmb3Igc3VyZSB0aGF0IHRoZSBzeW1ib2wgZnJhZ21lbnQgaXMgaW4KLQkgdGhlIHNhbWUgc2VjdGlvbi4gIElmIHRoZSBmcl9hZGRyZXNzIG9mIHRoZSBzeW1ib2wgZnJhZ21lbnQKLQkgaXMgZ3JlYXRlciB0aGVuIHRoZSBhZGRyZXNzIG9mIHRoaXMgZnJhZ21lbnQgd2Ugd2FudCB0byBhZGQKLQkgaW4gU1RSRVRDSCBpbiBvcmRlciB0byBnZXQgYSBiZXR0ZXIgZXN0aW1hdGUgb2YgdGhlIGFkZHJlc3MuCi0JIFRoaXMgcGFydGljdWxhcmx5IG1hdHRlcnMgYmVjYXVzZSBvZiB0aGUgc2hpZnQgYml0cy4gICovCi0gICAgICBpZiAoc3RyZXRjaCAhPSAwCi0JICAmJiAoc3ltYm9sX2dldF9mcmFnIChmcmFncC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzcwotCSAgICAgID49IGZyYWdwLT5mcl9hZGRyZXNzKSkKLQl7Ci0JICBmcmFnUyAqZjsKLQotCSAgLyogQWRqdXN0IHN0cmV0Y2ggZm9yIGFueSBhbGlnbm1lbnQgZnJhZy4gIE5vdGUgdGhhdCBpZiBoYXZlCi0gICAgICAgICAgICAgYmVlbiBleHBhbmRpbmcgdGhlIGVhcmxpZXIgY29kZSwgdGhlIHN5bWJvbCBtYXkgYmUKLSAgICAgICAgICAgICBkZWZpbmVkIGluIHdoYXQgYXBwZWFycyB0byBiZSBhbiBlYXJsaWVyIGZyYWcuICBGSVhNRToKLSAgICAgICAgICAgICBUaGlzIGRvZXNuJ3QgaGFuZGxlIHRoZSBmcl9zdWJ0eXBlIGZpZWxkLCB3aGljaCBzcGVjaWZpZXMKLSAgICAgICAgICAgICBhIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgd2hlbiBkb2luZyBhbgotICAgICAgICAgICAgIGFsaWdubWVudC4gICovCi0JICBmb3IgKGYgPSBmcmFncDsKLQkgICAgICAgZiAhPSBOVUxMICYmIGYgIT0gc3ltYm9sX2dldF9mcmFnIChmcmFncC0+ZnJfc3ltYm9sKTsKLQkgICAgICAgZiA9IGYtPmZyX25leHQpCi0JICAgIHsKLQkgICAgICBpZiAoZi0+ZnJfdHlwZSA9PSByc19hbGlnbiB8fCBmLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUpCi0JCXsKLQkJICBpZiAoc3RyZXRjaCA8IDApCi0JCSAgICBzdHJldGNoID0gLSAoKC0gc3RyZXRjaCkKLQkJCQkgJiB+ICgoMSA8PCAoaW50KSBmLT5mcl9vZmZzZXQpIC0gMSkpOwotCQkgIGVsc2UKLQkJICAgIHN0cmV0Y2ggJj0gfiAoKDEgPDwgKGludCkgZi0+ZnJfb2Zmc2V0KSAtIDEpOwotCQkgIGlmIChzdHJldGNoID09IDApCi0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBpZiAoZiAhPSBOVUxMKQotCSAgICB2YWwgKz0gc3RyZXRjaDsKLQl9Ci0KLSAgICAgIGFkZHIgPSBmcmFncC0+ZnJfYWRkcmVzcyArIGZyYWdwLT5mcl9maXg7Ci0KLSAgICAgIC8qIFRoZSBiYXNlIGFkZHJlc3MgcnVsZXMgYXJlIGNvbXBsaWNhdGVkLiAgVGhlIGJhc2UgYWRkcmVzcyBvZgotICAgICAgICAgYSBicmFuY2ggaXMgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4gIFRoZSBiYXNlIGFkZHJlc3Mgb2YgYQotICAgICAgICAgUEMgcmVsYXRpdmUgbG9hZCBvciBhZGQgaXMgdGhlIGluc3RydWN0aW9uIGl0c2VsZiwgYnV0IGlmIGl0Ci0gICAgICAgICBpcyBpbiBhIGRlbGF5IHNsb3QgKGluIHdoaWNoIGNhc2UgaXQgY2FuIG5vdCBiZSBleHRlbmRlZCkgdXNlCi0gICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hvc2UgZGVsYXkgc2xvdCBpdCBpcyBpbi4gICovCi0gICAgICBpZiAodHlwZSA9PSAncCcgfHwgdHlwZSA9PSAncScpCi0JewotCSAgYWRkciArPSAyOwotCi0JICAvKiBJZiB3ZSBhcmUgY3VycmVudGx5IGFzc3VtaW5nIHRoYXQgdGhpcyBmcmFnIHNob3VsZCBiZQotCSAgICAgZXh0ZW5kZWQsIHRoZW4sIHRoZSBjdXJyZW50IGFkZHJlc3MgaXMgdHdvIGJ5dGVzCi0JICAgICBoaWdoZXIuICovCi0JICBpZiAoUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JICAgIGFkZHIgKz0gMjsKLQotCSAgLyogSWdub3JlIHRoZSBsb3cgYml0IGluIHRoZSB0YXJnZXQsIHNpbmNlIGl0IHdpbGwgYmUgc2V0Ci0gICAgICAgICAgICAgZm9yIGEgdGV4dCBsYWJlbC4gICovCi0JICBpZiAoKHZhbCAmIDEpICE9IDApCi0JICAgIC0tdmFsOwotCX0KLSAgICAgIGVsc2UgaWYgKFJFTEFYX01JUFMxNl9KQUxfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlhZGRyIC09IDQ7Ci0gICAgICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlhZGRyIC09IDI7Ci0KLSAgICAgIHZhbCAtPSBhZGRyICYgfiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpOwotCi0gICAgICAvKiBCcmFuY2ggb2Zmc2V0cyBoYXZlIGFuIGltcGxpY2l0IDAgaW4gdGhlIGxvd2VzdCBiaXQuICAqLwotICAgICAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotCXZhbCAvPSAyOwotCi0gICAgICAvKiBJZiBhbnkgb2YgdGhlIHNoaWZ0ZWQgYml0cyBhcmUgc2V0LCB3ZSBtdXN0IHVzZSBhbiBleHRlbmRlZAotICAgICAgICAgb3Bjb2RlLiAgSWYgdGhlIGFkZHJlc3MgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGlzCi0gICAgICAgICBpbnN0cnVjdGlvbiwgdGhpcyBjYW4gbGVhZCB0byBhIGxvb3AsIHNvIHdlIGFycmFuZ2UgdG8gYWx3YXlzCi0gICAgICAgICB1c2UgYW4gZXh0ZW5kZWQgb3Bjb2RlLiAgV2Ugb25seSBjaGVjayB0aGlzIHdoZW4gd2UgYXJlIGluCi0gICAgICAgICB0aGUgbWFpbiByZWxheGF0aW9uIGxvb3AsIHdoZW4gU0VDIGlzIE5VTEwuICAqLwotICAgICAgaWYgKCh2YWwgJiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpKSAhPSAwICYmIHNlYyA9PSBOVUxMKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0KLQkgICAgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIGFib3V0IHRvIG1hcmsgYSBmcmFnIGFzIGV4dGVuZGVkIGJlY2F1c2UgdGhlIHZhbHVlCi0gICAgICAgICBpcyBwcmVjaXNlbHkgbWF4dGlueSArIDEsIHRoZW4gdGhlcmUgaXMgYSBjaGFuY2Ugb2YgYW4KLSAgICAgICAgIGluZmluaXRlIGxvb3AgYXMgaW4gdGhlIGZvbGxvd2luZyBjb2RlOgotCSAgICAgbGEJJDQsZm9vCi0JICAgICAuc2tpcAkxMDIwCi0JICAgICAuYWxpZ24JMgotCSAgIGZvbzoKLQkgSW4gdGhpcyBjYXNlIHdoZW4gdGhlIGxhIGlzIGV4dGVuZGVkLCBmb28gaXMgMHgzZmMgYnl0ZXMKLQkgYXdheSwgc28gdGhlIGxhIGNhbiBiZSBzaHJ1bmssIGJ1dCB0aGVuIGZvbyBpcyAweDQwMCBhd2F5LCBzbwotCSB0aGUgbGEgbXVzdCBiZSBleHRlbmRlZC4gIFRvIGF2b2lkIHRoaXMgbG9vcCwgd2UgbWFyayB0aGUKLQkgZnJhZyBhcyBleHRlbmRlZCBpZiBpdCB3YXMgc21hbGwsIGFuZCBpcyBhYm91dCB0byBiZWNvbWUKLQkgZXh0ZW5kZWQgd2l0aCBhIHZhbHVlIG9mIG1heHRpbnkgKyAxLiAgKi8KLSAgICAgIGlmICh2YWwgPT0gKChtYXh0aW55ICsgMSkgPDwgb3AtPnNoaWZ0KQotCSAgJiYgISBSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKQotCSAgJiYgc2VjID09IE5VTEwpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPQotCSAgICBSRUxBWF9NSVBTMTZfTUFSS19MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3ltc2VjICE9IGFic29sdXRlX3NlY3Rpb24gJiYgc2VjICE9IE5VTEwpCi0gICAgYXNfYmFkX3doZXJlIChmcmFncC0+ZnJfZmlsZSwgZnJhZ3AtPmZyX2xpbmUsIF8oInVuc3VwcG9ydGVkIHJlbG9jYXRpb24iKSk7Ci0KLSAgaWYgKCh2YWwgJiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpKSAhPSAwCi0gICAgICB8fCB2YWwgPCAobWludGlueSA8PCBvcC0+c2hpZnQpCi0gICAgICB8fCB2YWwgPiAobWF4dGlueSA8PCBvcC0+c2hpZnQpKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEVzdGltYXRlIHRoZSBzaXplIG9mIGEgZnJhZyBiZWZvcmUgcmVsYXhpbmcuICBVbmxlc3MgdGhpcyBpcyB0aGUKLSAgIG1pcHMxNiwgd2UgYXJlIG5vdCByZWFsbHkgcmVsYXhpbmcgaGVyZSwgYW5kIHRoZSBmaW5hbCBzaXplIGlzCi0gICBlbmNvZGVkIGluIHRoZSBzdWJ0eXBlIGluZm9ybWF0aW9uLiAgRm9yIHRoZSBtaXBzMTYsIHdlIGhhdmUgdG8KLSAgIGRlY2lkZSB3aGV0aGVyIHdlIGFyZSB1c2luZyBhbiBleHRlbmRlZCBvcGNvZGUgb3Igbm90LiAgKi8KLQotLypBUkdTVVNFRCovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VndHlwZSkKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VndHlwZTsKLXsKLSAgaW50IGNoYW5nZTsKLQotICBpZiAoUkVMQVhfTUlQUzE2X1AgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICB7Ci0gICAgICBpZiAobWlwczE2X2V4dGVuZGVkX2ZyYWcgKGZyYWdwLCBzZWd0eXBlLCAwKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IFJFTEFYX01JUFMxNl9NQVJLX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfQ0xFQVJfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICB9Ci0KLSAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLSAgICB7Ci0gICAgICBjaGFuZ2UgPSBub3BpY19uZWVkX3JlbGF4IChmcmFncC0+ZnJfc3ltYm9sLCAwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzeW1zZWM7Ci0KLSAgICAgIHN5bSA9IGZyYWdwLT5mcl9zeW1ib2w7Ci0KLSAgICAgIC8qIEhhbmRsZSB0aGUgY2FzZSBvZiBhIHN5bWJvbCBlcXVhdGVkIHRvIGFub3RoZXIgc3ltYm9sLiAgKi8KLSAgICAgIHdoaWxlIChzeW1ib2xfZXF1YXRlZF9wIChzeW0pCi0JICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCXsKLQkgIHN5bWJvbFMgKm47Ci0KLQkgIC8qIEl0J3MgcG9zc2libGUgdG8gZ2V0IGEgbG9vcCBoZXJlIGluIGEgYmFkbHkgd3JpdHRlbgotICAgICAgICAgICAgIHByb2dyYW0uICAqLwotCSAgbiA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfc3ltYm9sOwotCSAgaWYgKG4gPT0gc3ltKQotCSAgICBicmVhazsKLQkgIHN5bSA9IG47Ci0JfQotCi0gICAgICBzeW1zZWMgPSBTX0dFVF9TRUdNRU5UIChzeW0pOwotCi0gICAgICAvKiBUaGlzIG11c3QgZHVwbGljYXRlIHRoZSB0ZXN0IGluIGFkanVzdF9yZWxvY19zeW1zLiAgKi8KLSAgICAgIGNoYW5nZSA9IChzeW1zZWMgIT0gJmJmZF91bmRfc2VjdGlvbgotCQkmJiBzeW1zZWMgIT0gJmJmZF9hYnNfc2VjdGlvbgotCQkmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc2VjKSk7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGNoYW5nZSkKLSAgICB7Ci0gICAgICAvKiBSZWNvcmQgdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgcmVsb2MgaW4gdGhlIGZyX29wY29kZSBmaWVsZC4KLQkgVGhpcyBsZXRzIG1kX2NvbnZlcnRfZnJhZyBhbmQgdGNfZ2VuX3JlbG9jIGtub3cgdGhhdCB0aGUgY29kZQotCSBtdXN0IGJlIGV4cGFuZGVkLiAgKi8KLSAgICAgIGZyYWdwLT5mcl9vcGNvZGUgPSAoZnJhZ3AtPmZyX2xpdGVyYWwKLQkJCSAgKyBmcmFncC0+ZnJfZml4Ci0JCQkgIC0gUkVMQVhfT0xEIChmcmFncC0+ZnJfc3VidHlwZSkKLQkJCSAgKyBSRUxBWF9SRUxPQzEgKGZyYWdwLT5mcl9zdWJ0eXBlKSk7Ci0gICAgICAvKiBGSVhNRTogVGhpcyByZWFsbHkgbmVlZHMgYXNfd2Fybl93aGVyZS4gICovCi0gICAgICBpZiAoUkVMQVhfV0FSTiAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCWFzX3dhcm4gKF8oIkFUIHVzZWQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiBvciBtYWNybyB1c2VkIGFmdGVyIFwiLnNldCBub21hY3JvXCIiKSk7Ci0gICAgfQotCi0gIGlmICghIGNoYW5nZSkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHJldHVybiBSRUxBWF9ORVcgKGZyYWdwLT5mcl9zdWJ0eXBlKSAtIFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB0byBzZWUgd2hldGhlciBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbAotICAgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uICBEb24ndCBhZGp1c3QKLSAgIE1JUFMxNiBqdW1wIHJlbG9jYXRpb25zLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBmb3JtYXQKLSAgIG9mIHRoZSBvZmZzZXQgaW4gdGhlIC5vIGZpbGUuICBEb24ndCBhZGp1c3QgcmVsb2NhdGlvbnMgYWdhaW5zdAotICAgbWlwczE2IHN5bWJvbHMsIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4gZmluZCB0aGVtIGlmIGl0IG5lZWRzIHRvIHNldAotICAgdXAgYSBzdHViLiAgKi8KLQotaW50Ci1taXBzX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQotICAgIHJldHVybiAwOwotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgJiYgU19HRVRfT1RIRVIgKGZpeHAtPmZ4X2FkZHN5KSA9PSBTVE9fTUlQUzE2Ci0gICAgICAmJiBmaXhwLT5meF9zdWJzeSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4gICovCi0KLWFyZWxlbnQgKioKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0YXRpYyBhcmVsZW50ICpyZXR2YWxbNF07Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLQotICByZWxvYyA9IHJldHZhbFswXSA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZXR2YWxbMV0gPSBOVUxMOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotICAgICAgJiYgU1dJVENIX1RBQkxFIChmaXhwKSkKLSAgICB7Ci0gICAgICAvKiBGb3IgYSBzd2l0Y2ggdGFibGUgZW50cnkgd2UgdXNlIGEgc3BlY2lhbCByZWxvYy4gIFRoZSBhZGRlbmQKLQkgaXMgYWN0dWFsbHkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgdGhlCi0JIHN1YnRyYWhlbmQuICAqLwotICAgICAgcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRyZXNzIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLQlhc19mYXRhbCAoXygiRG91YmxlIGNoZWNrIGZ4X3JfdHlwZSBpbiB0Yy1taXBzLmM6dGNfZ2VuX3JlbG9jIikpOwotICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0dQUkVMMzI7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpCi0gICAgewotICAgICAgLyogV2UgdXNlIGEgc3BlY2lhbCBhZGRlbmQgZm9yIGFuIGludGVybmFsIFJFTExPIHJlbG9jLiAgKi8KLSAgICAgIGlmIChzeW1ib2xfc2VjdGlvbl9wIChmaXhwLT5meF9hZGRzeSkpCi0JcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRyZXNzIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLSAgICAgIGVsc2UKLQlyZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyICsgcmVsb2MtPmFkZHJlc3M7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0hJMTZfUykKLSAgICB7Ci0gICAgICBhc3NlcnQgKGZpeHAtPmZ4X25leHQgIT0gTlVMTAotCSAgICAgICYmIGZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUENSRUxfTE8xNik7Ci0gICAgICAvKiBXZSB1c2UgYSBzcGVjaWFsIGFkZGVuZCBmb3IgYW4gaW50ZXJuYWwgUkVMSEkgcmVsb2MuICBUaGUKLQkgcmVsb2MgaXMgcmVsYXRpdmUgdG8gdGhlIFJFTExPOyBhZGp1c3QgdGhlIGFkZGVuZAotCSBhY2NvcmRpbmdseS4gICovCi0gICAgICBpZiAoc3ltYm9sX3NlY3Rpb25fcCAoZml4cC0+ZnhfYWRkc3kpKQotCXJlbG9jLT5hZGRlbmQgPSAoZml4cC0+ZnhfbmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkJICsgZml4cC0+ZnhfbmV4dC0+Znhfd2hlcmUKLQkJCSAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSkpOwotICAgICAgZWxzZQotCXJlbG9jLT5hZGRlbmQgPSAoZml4cC0+ZnhfYWRkbnVtYmVyCi0JCQkgKyBmaXhwLT5meF9uZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JCQkgKyBmaXhwLT5meF9uZXh0LT5meF93aGVyZSk7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCA9PSAwKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLQkvKiBBIGdydWVzb21lIGhhY2sgd2hpY2ggaXMgYSByZXN1bHQgb2YgdGhlIGdydWVzb21lIGdhcyByZWxvYwotCSAgIGhhbmRsaW5nLiAgKi8KLQlyZWxvYy0+YWRkZW5kID0gcmVsb2MtPmFkZHJlc3M7Ci0gICAgICBlbHNlCi0JcmVsb2MtPmFkZGVuZCA9IC1yZWxvYy0+YWRkcmVzczsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHZhcmlhbnQgZnJhZywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBleGlzdGluZwotICAgICByZWxvYyBhbmQgZ2VuZXJhdGUgYSBuZXcgb25lLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2ZyYWctPmZyX29wY29kZSAhPSBOVUxMCi0gICAgICAmJiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMCi0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KSkKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWxvYzI7Ci0KLSAgICAgIGFzc2VydCAoISBSRUxBWF9NSVBTMTZfUCAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCByZWxvYyBpbiB0aGlzIGZyYWcsIHRoZW4gd2UgaGF2ZSB0d28KLQkgR1BSRUwgcmVsb2NzLCBvciBhIEdPVF9ISTE2L0dPVF9MTzE2IHBhaXIsIG9yIGEKLQkgQ0FMTF9ISTE2L0NBTExfTE8xNiwgYm90aCBvZiB3aGljaCBhcmUgYmVpbmcgcmVwbGFjZWQuICBMZXQKLQkgdGhlIHNlY29uZCBvbmUgaGFuZGxlIGFsbCBvZiB0aGVtLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9uZXh0ICE9IE5VTEwKLQkgICYmIGZpeHAtPmZ4X2ZyYWcgPT0gZml4cC0+ZnhfbmV4dC0+ZnhfZnJhZykKLQl7Ci0JICBhc3NlcnQgKChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwKLQkJICAgJiYgZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCQkgIHx8IChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLQkJICAgICAgJiYgKGZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZQotCQkJICA9PSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikpCi0JCSAgfHwgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLQkJICAgICAgJiYgKGZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZQotCQkJICA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYpKSk7Ci0JICByZXR2YWxbMF0gPSBOVUxMOwotCSAgcmV0dXJuIHJldHZhbDsKLQl9Ci0KLSAgICAgIGZpeHAtPmZ4X3doZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfb3Bjb2RlIC0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgICAgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICAgICAgcmVsb2MyID0gcmV0dmFsWzFdID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICByZXR2YWxbMl0gPSBOVUxMOwotICAgICAgcmVsb2MyLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jMi0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2MyLT5hZGRyZXNzID0gKHJlbG9jLT5hZGRyZXNzCi0JCQkgKyAoUkVMQVhfUkVMT0MyIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKQotCQkJICAgIC0gUkVMQVhfUkVMT0MxIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKSkpOwotICAgICAgcmVsb2MyLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gICAgICByZWxvYzItPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGFzc2VydCAocmVsb2MyLT5ob3d0byAhPSBOVUxMKTsKLQotICAgICAgaWYgKFJFTEFYX1JFTE9DMyAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkpCi0JewotCSAgYXJlbGVudCAqcmVsb2MzOwotCi0JICByZWxvYzMgPSByZXR2YWxbMl0gPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkgIHJldHZhbFszXSA9IE5VTEw7Ci0JICAqcmVsb2MzID0gKnJlbG9jMjsKLQkgIHJlbG9jMy0+YWRkcmVzcyArPSA0OwotCX0KLQotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLQl7Ci0JICBhc3NlcnQgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfSEkxNl9TOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UMTY6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTDE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNjoKLQkgICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfTUlQU19HT1QxNjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogU2luY2UgTUlQUyBFTEYgdXNlcyBSZWwgaW5zdGVhZCBvZiBSZWxhLCBlbmNvZGUgdGhlIHZ0YWJsZSBlbnRyeQotICAgICB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uJ3Mgc2VjdGlvbiBvZmZzZXQuICAqLwotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgewotICAgICAgcmVsb2MtPmFkZHJlc3MgPSByZWxvYy0+YWRkZW5kOwotICAgICAgcmVsb2MtPmFkZGVuZCA9IDA7Ci0gICAgfQotCi0gIC8qIFNpbmNlIERJRkZfRVhQUl9PSyBpcyBkZWZpbmVkIGluIHRjLW1pcHMuaCwgaXQgaXMgcG9zc2libGUgdGhhdAotICAgICBmaXh1cF9zZWdtZW50IGNvbnZlcnRlZCBhIG5vbi1QQyByZWxhdGl2ZSByZWxvYyBpbnRvIGEgUEMKLSAgICAgcmVsYXRpdmUgcmVsb2MuICBJbiBzdWNoIGEgY2FzZSwgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSByZWxvYwotICAgICBjb2RlLiAgKi8KLSAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY29kZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfODoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzE2OgotCSAgY29kZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzMyOgotCSAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzY0OgotCSAgY29kZSA9IEJGRF9SRUxPQ182NF9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfNjRfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0JY2FzZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TOgotCWNhc2UgQkZEX1JFTE9DX1BDUkVMX0xPMTY6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJXygiQ2Fubm90IG1ha2UgJXMgcmVsb2NhdGlvbiBQQyByZWxhdGl2ZSIpLAotCQkJYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRvIHN1cHBvcnQgYSBQQyByZWxhdGl2ZSByZWxvYyB3aGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUKLSAgICAgZm9yIEVDT0ZGLCB3ZSB1c2UgYSBDeWdudXMgZXh0ZW5zaW9uLiAgV2UgY2hlY2sgZm9yIHRoYXQgaGVyZSB0bwotICAgICBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBsZXQgc3VjaCBhIHJlbG9jIGVzY2FwZSBub3JtYWxseS4gICovCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgJiYgY29kZSA9PSBCRkRfUkVMT0NfMTZfUENSRUxfUzIKLSAgICAgICYmIG1pcHNfcGljICE9IEVNQkVEREVEX1BJQykKLSAgICByZWxvYy0+aG93dG8gPSBOVUxMOwotICBlbHNlCi0gICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotCi0gIGlmIChyZWxvYy0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgcmV0dmFsWzBdID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogUmVsYXggYSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnLiAgVGhpcyByZXR1cm5zIHRoZSBhbW91bnQgYnkgd2hpY2gKLSAgIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGZyYWcgc2hvdWxkIGNoYW5nZS4gICovCi0KLWludAotbWlwc19yZWxheF9mcmFnIChmcmFncCwgc3RyZXRjaCkKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBsb25nIHN0cmV0Y2g7Ci17Ci0gIGlmICghIFJFTEFYX01JUFMxNl9QIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgKGFzZWN0aW9uICopIE5VTEwsIHN0cmV0Y2gpKQotICAgIHsKLSAgICAgIGlmIChSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlyZXR1cm4gMDsKLSAgICAgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X01BUktfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCXJldHVybiAwOwotICAgICAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfQ0xFQVJfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnQgYSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBhc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWdUIGFzZWM7Ci0gICAgIGZyYWdTICpmcmFncDsKLXsKLSAgaW50IG9sZCwgbmV3OwotICBjaGFyICpmaXhwdHI7Ci0KLSAgaWYgKFJFTEFYX01JUFMxNl9QIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0gICAgICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQgKm9wOwotICAgICAgYm9vbGVhbiBzbWFsbCwgZXh0OwotICAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICAgICAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kOwotCi0gICAgICB0eXBlID0gUkVMQVhfTUlQUzE2X1RZUEUgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIG9wID0gbWlwczE2X2ltbWVkX29wZXJhbmRzOwotICAgICAgd2hpbGUgKG9wLT50eXBlICE9IHR5cGUpCi0JKytvcDsKLQotICAgICAgaWYgKFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCXsKLQkgIHNtYWxsID0gZmFsc2U7Ci0JICBleHQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzbWFsbCA9IHRydWU7Ci0JICBleHQgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmcmFncC0+ZnJfc3ltYm9sLCAxKTsKLSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFIChmcmFncC0+ZnJfc3ltYm9sKTsKLSAgICAgIGlmIChvcC0+cGNyZWwpCi0JewotCSAgYWRkcmVzc1QgYWRkcjsKLQotCSAgYWRkciA9IGZyYWdwLT5mcl9hZGRyZXNzICsgZnJhZ3AtPmZyX2ZpeDsKLQotCSAgLyogVGhlIHJ1bGVzIGZvciB0aGUgYmFzZSBhZGRyZXNzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MgYXJlCi0gICAgICAgICAgICAgY29tcGxpY2F0ZWQ7IHNlZSBtaXBzMTZfZXh0ZW5kZWRfZnJhZy4gICovCi0JICBpZiAodHlwZSA9PSAncCcgfHwgdHlwZSA9PSAncScpCi0JICAgIHsKLQkgICAgICBhZGRyICs9IDI7Ci0JICAgICAgaWYgKGV4dCkKLQkJYWRkciArPSAyOwotCSAgICAgIC8qIElnbm9yZSB0aGUgbG93IGJpdCBpbiB0aGUgdGFyZ2V0LCBzaW5jZSBpdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgIHNldCBmb3IgYSB0ZXh0IGxhYmVsLiAgKi8KLQkgICAgICBpZiAoKHZhbCAmIDEpICE9IDApCi0JCS0tdmFsOwotCSAgICB9Ci0JICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfSkFMX0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JICAgIGFkZHIgLT0gNDsKLQkgIGVsc2UgaWYgKFJFTEFYX01JUFMxNl9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICBhZGRyIC09IDI7Ci0KLQkgIGFkZHIgJj0gfiAoYWRkcmVzc1QpICgoMSA8PCBvcC0+c2hpZnQpIC0gMSk7Ci0JICB2YWwgLT0gYWRkcjsKLQotCSAgLyogTWFrZSBzdXJlIHRoZSBzZWN0aW9uIHdpbmRzIHVwIHdpdGggdGhlIGFsaWdubWVudCB3ZSBoYXZlCi0gICAgICAgICAgICAgYXNzdW1lZC4gICovCi0JICBpZiAob3AtPnNoaWZ0ID4gMCkKLQkgICAgcmVjb3JkX2FsaWdubWVudCAoYXNlYywgb3AtPnNoaWZ0KTsKLQl9Ci0KLSAgICAgIGlmIChleHQKLQkgICYmIChSRUxBWF9NSVBTMTZfSkFMX0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkKLQkgICAgICB8fCBSRUxBWF9NSVBTMTZfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkpCi0JYXNfd2Fybl93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLAotCQkgICAgICAgXygiZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIpKTsKLQotICAgICAgYnVmID0gKGJmZF9ieXRlICopIChmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXgpOwotCi0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JaW5zbiA9IGJmZF9nZXRiMTYgKGJ1Zik7Ci0gICAgICBlbHNlCi0JaW5zbiA9IGJmZF9nZXRsMTYgKGJ1Zik7Ci0KLSAgICAgIG1pcHMxNl9pbW1lZCAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLCB0eXBlLCB2YWwsCi0JCSAgICBSRUxBWF9NSVBTMTZfVVNFUl9FWFQgKGZyYWdwLT5mcl9zdWJ0eXBlKSwKLQkJICAgIHNtYWxsLCBleHQsICZpbnNuLCAmdXNlX2V4dGVuZCwgJmV4dGVuZCk7Ci0KLSAgICAgIGlmICh1c2VfZXh0ZW5kKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCAweGYwMDAgfCBleHRlbmQsIDIpOwotCSAgZnJhZ3AtPmZyX2ZpeCArPSAyOwotCSAgYnVmICs9IDI7Ci0JfQotCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgaW5zbiwgMik7Ci0gICAgICBmcmFncC0+ZnJfZml4ICs9IDI7Ci0gICAgICBidWYgKz0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZnJhZ3AtPmZyX29wY29kZSA9PSBOVUxMKQotCXJldHVybjsKLQotICAgICAgb2xkID0gUkVMQVhfT0xEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICBuZXcgPSBSRUxBWF9ORVcgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGZpeHB0ciA9IGZyYWdwLT5mcl9saXRlcmFsICsgZnJhZ3AtPmZyX2ZpeDsKLQotICAgICAgaWYgKG5ldyA+IDApCi0JbWVtY3B5IChmaXhwdHIgLSBvbGQsIGZpeHB0ciwgbmV3KTsKLQotICAgICAgZnJhZ3AtPmZyX2ZpeCArPSBuZXcgLSBvbGQ7Ci0gICAgfQotfQotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgcmVsb2NzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCi0gICBXZSd2ZSBiZWVuIHN0b3JpbmcgbWlwczE2IHRleHQgbGFiZWxzIGFzIG9kZC4gIEhlcmUgd2UgY29udmVydCB0aGVtCi0gICBiYWNrIHRvIGV2ZW4gZm9yIHRoZSBjb252ZW5pZW5jZSBvZiB0aGUgZGVidWdnZXIuICAqLwotCi12b2lkCi1taXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLXsKLSAgYXN5bWJvbCAqKnN5bXM7Ci0gIHVuc2lnbmVkIGludCBjb3VudCwgaTsKLQotICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybjsKLQotICBzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChzdGRvdXRwdXQpOwotICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKHN0ZG91dHB1dCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzeW1zKyspCi0gICAgewotICAgICAgaWYgKGVsZl9zeW1ib2wgKCpzeW1zKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlciA9PSBTVE9fTUlQUzE2Ci0JICAmJiAoKCpzeW1zKS0+dmFsdWUgJiAxKSAhPSAwKQotCXsKLQkgICgqc3ltcyktPnZhbHVlICY9IH4xOwotCSAgLyogSWYgdGhlIHN5bWJvbCBoYXMgYW4gb2RkIHNpemUsIGl0IHdhcyBwcm9iYWJseSBjb21wdXRlZAotCSAgICAgaW5jb3JyZWN0bHksIHNvIGFkanVzdCB0aGF0IGFzIHdlbGwuICAqLwotCSAgaWYgKChlbGZfc3ltYm9sICgqc3ltcyktPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZSAmIDEpICE9IDApCi0JICAgICsrZWxmX3N5bWJvbCAoKnN5bXMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgbGFiZWwgaXMgZGVmaW5lZC4gIEl0IGlzIHVzZWQKLSAgIHdoZW4gaGFuZGxpbmcgYnJhbmNoIGRlbGF5czsgaWYgYSBicmFuY2ggaGFzIGEgbGFiZWwsIHdlIGFzc3VtZSB3ZQotICAgY2FuIG5vdCBtb3ZlIGl0LiAgKi8KLQotdm9pZAotbWlwc19kZWZpbmVfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0gIGlmIChmcmVlX2luc25fbGFiZWxzID09IE5VTEwpCi0gICAgbCA9IChzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsID0gZnJlZV9pbnNuX2xhYmVsczsKLSAgICAgIGZyZWVfaW5zbl9sYWJlbHMgPSBsLT5uZXh0OwotICAgIH0KLQotICBsLT5sYWJlbCA9IHN5bTsKLSAgbC0+bmV4dCA9IGluc25fbGFiZWxzOwotICBpbnNuX2xhYmVscyA9IGw7Ci19Ci0MCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLQotLyogU29tZSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGEgTUlQUyBFTEYgZmlsZS4gICovCi0KLXZvaWQKLW1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgKCkKLXsKLSAgLyogV3JpdGUgb3V0IHRoZSByZWdpc3RlciBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIG1pcHNfNjQpCi0gICAgewotICAgICAgRWxmMzJfUmVnSW5mbyBzOwotCi0gICAgICBzLnJpX2dwcm1hc2sgPSBtaXBzX2dwcm1hc2s7Ci0gICAgICBzLnJpX2Nwcm1hc2tbMF0gPSBtaXBzX2Nwcm1hc2tbMF07Ci0gICAgICBzLnJpX2Nwcm1hc2tbMV0gPSBtaXBzX2Nwcm1hc2tbMV07Ci0gICAgICBzLnJpX2Nwcm1hc2tbMl0gPSBtaXBzX2Nwcm1hc2tbMl07Ci0gICAgICBzLnJpX2Nwcm1hc2tbM10gPSBtaXBzX2Nwcm1hc2tbM107Ci0gICAgICAvKiBUaGUgZ3BfdmFsdWUgZmllbGQgaXMgc2V0IGJ5IHRoZSBNSVBTIEVMRiBiYWNrZW5kLiAgKi8KLQotICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX291dCAoc3Rkb3V0cHV0LCAmcywKLQkJCQkgICAgICAgKChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopCi0JCQkJCW1pcHNfcmVnbWFza19mcmFnKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyBzOwotCi0gICAgICBzLnJpX2dwcm1hc2sgPSBtaXBzX2dwcm1hc2s7Ci0gICAgICBzLnJpX3BhZCA9IDA7Ci0gICAgICBzLnJpX2Nwcm1hc2tbMF0gPSBtaXBzX2Nwcm1hc2tbMF07Ci0gICAgICBzLnJpX2Nwcm1hc2tbMV0gPSBtaXBzX2Nwcm1hc2tbMV07Ci0gICAgICBzLnJpX2Nwcm1hc2tbMl0gPSBtaXBzX2Nwcm1hc2tbMl07Ci0gICAgICBzLnJpX2Nwcm1hc2tbM10gPSBtaXBzX2Nwcm1hc2tbM107Ci0gICAgICAvKiBUaGUgZ3BfdmFsdWUgZmllbGQgaXMgc2V0IGJ5IHRoZSBNSVBTIEVMRiBiYWNrZW5kLiAgKi8KLQotICAgICAgYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoc3Rkb3V0cHV0LCAmcywKLQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICopCi0JCQkJCW1pcHNfcmVnbWFza19mcmFnKSk7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgTUlQUyBFTEYgZmxhZyBiaXRzLiAgRklYTUU6IFRoZXJlIHNob3VsZCBwcm9iYWJseSBiZSBzb21lCi0gICAgIHNvcnQgb2YgQkZEIGludGVyZmFjZSBmb3IgdGhpcy4gICovCi0gIGlmIChtaXBzX2FueV9ub3Jlb3JkZXIpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9NSVBTX05PUkVPUkRFUjsKLSAgaWYgKG1pcHNfcGljICE9IE5PX1BJQykKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX01JUFNfUElDOwotCi0gIC8qIFNldCB0aGUgTUlQUyBFTEYgQUJJIGZsYWdzLiAqLwotICBpZiAobWlwc19hYmlfc3RyaW5nID09IDApCi0gICAgOwotICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywiMzIiKSA9PSAwKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9PMzI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobWlwc19hYmlfc3RyaW5nLCJvNjQiKSA9PSAwKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9PNjQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobWlwc19hYmlfc3RyaW5nLCJlYWJpIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWlwc19lYWJpNjQpCi0JZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFX01JUFNfQUJJX0VBQkk2NDsKLSAgICAgIGVsc2UKLQllbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfRUFCSTMyOwotICAgIH0KLQotICBpZiAobWlwc18zMmJpdG1vZGUpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9NSVBTXzMyQklUTU9ERTsKLX0KLQotI2VuZGlmIC8qIE9CSl9FTEYgfHwgT0JKX01BWUJFX0VMRiAqLwotDAotdHlwZWRlZiBzdHJ1Y3QgcHJvYwotICB7Ci0gICAgc3ltYm9sUyAqaXN5bTsKLSAgICB1bnNpZ25lZCBsb25nIHJlZ19tYXNrOwotICAgIHVuc2lnbmVkIGxvbmcgcmVnX29mZnNldDsKLSAgICB1bnNpZ25lZCBsb25nIGZwcmVnX21hc2s7Ci0gICAgdW5zaWduZWQgbG9uZyBmcHJlZ19vZmZzZXQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmcmFtZV9vZmZzZXQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmcmFtZV9yZWc7Ci0gICAgdW5zaWduZWQgbG9uZyBwY19yZWc7Ci0gIH0KLXByb2NTOwotCi1zdGF0aWMgcHJvY1MgY3VyX3Byb2M7Ci1zdGF0aWMgcHJvY1MgKmN1cl9wcm9jX3B0cjsKLXN0YXRpYyBpbnQgbnVtcHJvY3M7Ci0KLXN0YXRpYyB2b2lkCi1tZF9vYmpfYmVnaW4gKCkKLXsKLX0KLQotc3RhdGljIHZvaWQKLW1kX29ial9lbmQgKCkKLXsKLSAgLyogY2hlY2sgZm9yIHByZW1hdHVyZSBlbmQsIG5lc3RpbmcgZXJyb3JzLCBldGMgKi8KLSAgaWYgKGN1cl9wcm9jX3B0cikKLSAgICBhc193YXJuIChfKCJtaXNzaW5nIGAuZW5kJyBhdCBlbmQgb2YgYXNzZW1ibHkiKSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1nZXRfbnVtYmVyICgpCi17Ci0gIGludCBuZWdhdGl2ZSA9IDA7Ci0gIGxvbmcgdmFsID0gMDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBuZWdhdGl2ZSA9IDE7Ci0gICAgfQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICBhc19iYWQgKF8oIkV4cGVjdGVkIHNpbXBsZSBudW1iZXIuIikpOwotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJykKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICd4JykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIHdoaWxlIChpc3hkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCSAgICB7Ci0JICAgICAgdmFsIDw8PSA0OwotCSAgICAgIHZhbCB8PSBoZXhfdmFsdWUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci0JICAgIH0KLQkgIHJldHVybiBuZWdhdGl2ZSA/IC12YWwgOiB2YWw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkgICAgewotCSAgICAgIHZhbCA8PD0gMzsKLQkgICAgICB2YWwgfD0gKmlucHV0X2xpbmVfcG9pbnRlcisrIC0gJzAnOwotCSAgICB9Ci0JICByZXR1cm4gbmVnYXRpdmUgPyAtdmFsIDogdmFsOwotCX0KLSAgICB9Ci0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyVjJyAweCUwMnhcbiIpLAotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIsICppbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBudW1iZXIiKSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIHZhbCAqPSAxMDsKLSAgICAgIHZhbCArPSAqaW5wdXRfbGluZV9wb2ludGVyKysgLSAnMCc7Ci0gICAgfQotICByZXR1cm4gbmVnYXRpdmUgPyAtdmFsIDogdmFsOwotfQotCi0vKiBUaGUgLmZpbGUgZGlyZWN0aXZlOyBqdXN0IGxpa2UgdGhlIHVzdWFsIC5maWxlIGRpcmVjdGl2ZSwgYnV0IHRoZXJlCi0gICBpcyBhbiBpbml0aWFsIG51bWJlciB3aGljaCBpcyB0aGUgRUNPRkYgZmlsZSBpbmRleC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2ZpbGUgKHgpCi0gICAgIGludCB4OwotewotICBpbnQgbGluZTsKLQotICBsaW5lID0gZ2V0X251bWJlciAoKTsKLSAgc19hcHBfZmlsZSAoMCk7Ci19Ci0KLQotLyogVGhlIC5lbmQgZGlyZWN0aXZlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19lbmQgKHgpCi0gICAgIGludCB4OwotewotICBzeW1ib2xTICpwOwotICBpbnQgbWF5YmVfdGV4dDsKLQotICBpZiAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBwID0gZ2V0X3N5bWJvbCAoKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcCA9IE5VTEw7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCi0gICAgbWF5YmVfdGV4dCA9IDE7Ci0gIGVsc2UKLSAgICBtYXliZV90ZXh0ID0gMDsKLSNlbHNlCi0gIGlmIChub3dfc2VnICE9IGRhdGFfc2VjdGlvbiAmJiBub3dfc2VnICE9IGJzc19zZWN0aW9uKQotICAgIG1heWJlX3RleHQgPSAxOwotICBlbHNlCi0gICAgbWF5YmVfdGV4dCA9IDA7Ci0jZW5kaWYKLQotICBpZiAoIW1heWJlX3RleHQpCi0gICAgYXNfd2FybiAoXygiLmVuZCBub3QgaW4gdGV4dCBzZWN0aW9uIikpOwotCi0gIGlmICghY3VyX3Byb2NfcHRyKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKFNfR0VUX05BTUUgKHApKTsKLSAgICAgIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKHApLCBTX0dFVF9OQU1FIChjdXJfcHJvY19wdHItPmlzeW0pKSkKLQlhc193YXJuIChfKCIuZW5kIHN5bWJvbCBkb2VzIG5vdCBtYXRjaCAuZW50IHN5bWJvbC4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgbWlzc2luZyBvciB1bmtub3duIHN5bWJvbCIpKTsKLQotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0gIHsKLSAgICBzZWdUIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gICAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgIGZyYWdTICpzYXZlZF9mcmFnID0gZnJhZ19ub3c7Ci0gICAgdmFsdWVUIGRvdDsKLSAgICBzZWdUIHNlZzsKLSAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgY2hhciAqZnJhZ3A7Ci0KLSAgICBkb3QgPSBmcmFnX25vd19maXggKCk7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICAgIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgICBhc3NlcnQgKHBkcl9zZWcpOwotICAgIHN1YnNlZ19zZXQgKHBkcl9zZWcsIDApOwotCi0gICAgLyogV3JpdGUgdGhlIHN5bWJvbCAqLwotICAgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgZXhwLlhfYWRkX3N5bWJvbCA9IHA7Ci0gICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgZW1pdF9leHByICgmZXhwLCA0KTsKLQotICAgIGZyYWdwID0gZnJhZ19tb3JlICg3KjQpOwotCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCwgICAgICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+cmVnX21hc2ssIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKyA0LCAodmFsdWVUKSBjdXJfcHJvY19wdHItPnJlZ19vZmZzZXQsIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKyA4LCAodmFsdWVUKSBjdXJfcHJvY19wdHItPmZwcmVnX21hc2ssIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKzEyLCAodmFsdWVUKSBjdXJfcHJvY19wdHItPmZwcmVnX29mZnNldCwgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMTYsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnJhbWVfb2Zmc2V0LCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsyMCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcmFtZV9yZWcsIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKzI0LCAodmFsdWVUKSBjdXJfcHJvY19wdHItPnBjX3JlZywgNCk7Ci0KLSAgICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci0gIH0KLSNlbmRpZgotCi0gIGN1cl9wcm9jX3B0ciA9IE5VTEw7Ci19Ci0KLS8qIFRoZSAuYWVudCBhbmQgLmVudCBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19lbnQgKGFlbnQpCi0gICAgIGludCBhZW50OwotewotICBpbnQgbnVtYmVyID0gMDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgaW50IG1heWJlX3RleHQ7Ci0KLSAgc3ltYm9sUCA9IGdldF9zeW1ib2wgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLSAgICBudW1iZXIgPSBnZXRfbnVtYmVyICgpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKSAmIFNFQ19DT0RFKSAhPSAwKQotICAgIG1heWJlX3RleHQgPSAxOwotICBlbHNlCi0gICAgbWF5YmVfdGV4dCA9IDA7Ci0jZWxzZQotICBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24gJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKLSAgICBtYXliZV90ZXh0ID0gMTsKLSAgZWxzZQotICAgIG1heWJlX3RleHQgPSAwOwotI2VuZGlmCi0KLSAgaWYgKCFtYXliZV90ZXh0KQotICAgIGFzX3dhcm4gKF8oIi5lbnQgb3IgLmFlbnQgbm90IGluIHRleHQgc2VjdGlvbi4iKSk7Ci0KLSAgaWYgKCFhZW50ICYmIGN1cl9wcm9jX3B0cikKLSAgICBhc193YXJuIChfKCJtaXNzaW5nIGAuZW5kJyIpKTsKLQotICBpZiAoIWFlbnQpCi0gICAgewotICAgICAgY3VyX3Byb2NfcHRyID0gJmN1cl9wcm9jOwotICAgICAgbWVtc2V0IChjdXJfcHJvY19wdHIsICdcMCcsIHNpemVvZiAocHJvY1MpKTsKLQotICAgICAgY3VyX3Byb2NfcHRyLT5pc3ltID0gc3ltYm9sUDsKLQotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLSAgICAgIG51bXByb2NzKys7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZnJhbWUgZGlyZWN0aXZlLiBJZiB0aGUgbWRlYnVnIHNlY3Rpb24gaXMgcHJlc2VudCAoSVJJWCA1IG5hdGl2ZSkKLSAgIHRoZW4gZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2ZyYW1lKSBpcyB1c2VkLiBGb3IgZW1iZWRkZWQgdGFyZ2V0cywgCi0gICBzX21pcHNfZnJhbWUgaXMgdXNlZCBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIFBEUiBpbmZvcm1hdGlvbiBjb3JyZWN0bHkuCi0gICBXZSBjYW4ndCB1c2UgdGhlIGVjb2ZmIHJvdXRpbmVzIGJlY2F1c2UgdGhleSBtYWtlIHJlZmVyZW5jZSB0byB0aGUgZWNvZmYgCi0gICBzeW1ib2wgdGFibGUgKGluIHRoZSBtZGVidWcgc2VjdGlvbikuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX2ZyYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0jaWZkZWYgTUlQU19TVEFCU19FTEYKLQotICBsb25nIHZhbDsKLQotICBpZiAoY3VyX3Byb2NfcHRyID09ICAocHJvY1MgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZnJhbWUgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5mcmFtZV9yZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcKLSAgICAgIHx8IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mcmFtZSBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+ZnJhbWVfb2Zmc2V0ID0gdmFsOwotICBjdXJfcHJvY19wdHItPnBjX3JlZyA9IHRjX2dldF9yZWdpc3RlciAoMCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbHNlCi0gIHNfaWdub3JlIChpZ25vcmUpOwotI2VuZGlmIC8qIE1JUFNfU1RBQlNfRUxGICovCi19Ci0KLS8qIFRoZSAuZm1hc2sgYW5kIC5tYXNrIGRpcmVjdGl2ZXMuIElmIHRoZSBtZGVidWcgc2VjdGlvbiBpcyBwcmVzZW50IAotICAgKElSSVggNSBuYXRpdmUpIHRoZW4gZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX21hc2spIGlzIHVzZWQuIEZvciAKLSAgIGVtYmVkZGVkIHRhcmdldHMsIHNfbWlwc19tYXNrIGlzIHVzZWQgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBQRFIKLSAgIGluZm9ybWF0aW9uIGNvcnJlY3RseS4gV2UgY2FuJ3QgdXNlIHRoZSBlY29mZiByb3V0aW5lcyBiZWNhdXNlIHRoZXkgCi0gICBtYWtlIHJlZmVyZW5jZSB0byB0aGUgZWNvZmYgc3ltYm9sIHRhYmxlIChpbiB0aGUgbWRlYnVnIHNlY3Rpb24pLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19tYXNrIChyZWdfdHlwZSkKLSAgICAgY2hhciByZWdfdHlwZTsKLXsKLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotICBsb25nIG1hc2ssIG9mZjsKLSAgCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NTICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLm1hc2svLmZtYXNrIG91dHNpZGUgb2YgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJm1hc2spICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLm1hc2svLmZtYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgb2ZmID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgaWYgKHJlZ190eXBlID09ICdGJykKLSAgICB7Ci0gICAgICBjdXJfcHJvY19wdHItPmZwcmVnX21hc2sgPSBtYXNrOwotICAgICAgY3VyX3Byb2NfcHRyLT5mcHJlZ19vZmZzZXQgPSBvZmY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY3VyX3Byb2NfcHRyLT5yZWdfbWFzayA9IG1hc2s7Ci0gICAgICBjdXJfcHJvY19wdHItPnJlZ19vZmZzZXQgPSBvZmY7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0jZWxzZQotICBzX2lnbm9yZSAocmVnX3R5cGUpOwotI2VuZGlmIC8qIE1JUFNfU1RBQlNfRUxGICovCi19Ci0KLS8qIFRoZSAubG9jIGRpcmVjdGl2ZS4gICovCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotc19sb2MgKHgpCi0gICAgIGludCB4OwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgbGluZW5vOwotICBpbnQgYWRkcm9mZjsKLQotICBhc3NlcnQgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKTsKLQotICBsaW5lbm8gPSBnZXRfbnVtYmVyICgpOwotICBhZGRyb2ZmID0gZnJhZ19ub3dfZml4ICgpOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfbmV3ICgiIiwgTl9TTElORSwgYWRkcm9mZiwgZnJhZ19ub3cpOwotICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1NMSU5FKTsKLSAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIDApOwotICBTX1NFVF9ERVNDIChzeW1ib2xQLCBsaW5lbm8pOwotICBzeW1ib2xQLT5zeV9zZWdtZW50ID0gbm93X3NlZzsKLX0KLSNlbmRpZgotCi0KLSAgCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1pcHMuaCBiL2dhcy9jb25maWcvdGMtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2ZkOTk4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qIHRjLW1pcHMuaCAtLSBoZWFkZXIgZmlsZSBmb3IgdGMtbWlwcy5jLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBPU0YgYW5kIFJhbHBoIENhbXBiZWxsLgotICAgV3JpdHRlbiBieSBLZWl0aCBLbm93bGVzIGFuZCBSYWxwaCBDYW1wYmVsbCwgd29ya2luZyBpbmRlcGVuZGVudGx5LgotICAgTW9kaWZpZWQgZm9yIEVDT0ZGIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRDX01JUFMKLQotI2RlZmluZSBUQ19NSVBTCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmcmFnOwotc3RydWN0IGV4cHJlc3Npb25TOwotI2VuZGlmCi0KLS8qIERlZmF1bHQgdG8gYmlnIGVuZGlhbi4gICovCi0jaWZuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCQkxCi0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9taXBzCi0KLSNkZWZpbmUgT05MWV9TVEFOREFSRF9FU0NBUEVTCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQJMQotI2RlZmluZSBPTERfRkxPQVRfUkVBRFMKLSNkZWZpbmUgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLSNkZWZpbmUgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi0jZGVmaW5lIE1BWF9SRUxPQ19FWFBBTlNJT04gMwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBNYXhpbXVtIHN5bWJvbCBvZmZzZXQgdGhhdCBjYW4gYmUgZW5jb2RlZCBpbiBhIEJGRF9SRUxPQ19NSVBTX0dQUkVMCi0gICByZWxvY2F0aW9uOiAqLwotI2RlZmluZSBNQVhfR1BSRUxfT0ZGU0VUICgweDdGRjQpCi0KLSNkZWZpbmUgbWRfcmVsYXhfZnJhZyhmcmFncCwgc3RyZXRjaCkgbWlwc19yZWxheF9mcmFnKGZyYWdwLCBzdHJldGNoKQotZXh0ZXJuIGludCBtaXBzX3JlbGF4X2ZyYWcgUEFSQU1TICgoc3RydWN0IGZyYWcgKiwgbG9uZykpOwotCi0jZGVmaW5lIG1kX3VuZGVmaW5lZF9zeW1ib2wobmFtZSkJKDApCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogV2UgcGVybWl0IFBDIHJlbGF0aXZlIGRpZmZlcmVuY2UgZXhwcmVzc2lvbnMgd2hlbiBnZW5lcmF0aW5nCi0gICBlbWJlZGRlZCBQSUMgY29kZS4gICovCi0jZGVmaW5lIERJRkZfRVhQUl9PSwotCi0vKiBUZWxsIGFzc2VtYmxlciB0aGF0IHdlIGhhdmUgYW4gaXRibF9taXBzLmggaGVhZGVyIGZpbGUgdG8gaW5jbHVkZS4gKi8KLSNkZWZpbmUgSEFWRV9JVEJMX0NQVQotCi0vKiBUaGUgZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IGZvcm1hdCBtYXkgY2hhbmdlIGJhc2VkIG9uIGNvbW1hbmQKLSAgIGxpbmUgYXJndW1lbnRzLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCBtaXBzX3RhcmdldF9mb3JtYXQoKQotZXh0ZXJuIGNvbnN0IGNoYXIgKm1pcHNfdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0cnVjdCBtaXBzX2NsX2luc24KLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuX29wY29kZTsKLSAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICppbnNuX21vOwotICAvKiBUaGUgbmV4dCB0d28gZmllbGRzIGFyZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBtaXBzMTYgY29kZS4gICovCi0gIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kOwotfTsKLQotZXh0ZXJuIGludCB0Y19nZXRfcmVnaXN0ZXIgUEFSQU1TICgoaW50IGZyYW1lKSk7Ci0KLSNkZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzKCkgbWlwc19pbml0X2FmdGVyX2FyZ3MoKQotZXh0ZXJuIHZvaWQgbWlwc19pbml0X2FmdGVyX2FyZ3MgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIG1kX3BhcnNlX2xvbmdfb3B0aW9uKGFyZykgbWlwc19wYXJzZV9sb25nX29wdGlvbiAoYXJnKQotZXh0ZXJuIGludCBtaXBzX3BhcnNlX2xvbmdfb3B0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBtaXBzX2RlZmluZV9sYWJlbCAoc3ltKQotZXh0ZXJuIHZvaWQgbWlwc19kZWZpbmVfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QoKSBtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpCi1leHRlcm4gdm9pZCBtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19mcm9iX2ZpbGUoKSBtaXBzX2Zyb2JfZmlsZSAoKQotZXh0ZXJuIHZvaWQgbWlwc19mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLSNkZWZpbmUgdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBtaXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLWV4dGVybiB2b2lkIG1pcHNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X21pcHMKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19taXBzCi0gIFBBUkFNUyAoKHN0cnVjdCBmcmFnICosIGludCwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOwotCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKGZpeHApIG1pcHNfZml4X2FkanVzdGFibGUgKGZpeHApCi1leHRlcm4gaW50IG1pcHNfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBtdXN0IGtlZXAgUEMgcmVsYXRpdmUKLSAgIHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSBtaXBzX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi1leHRlcm4gaW50IG1pcHNfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogbWRfYXBwbHlfZml4IHNldHMgZnhfZG9uZSBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBUQ19IQU5ETEVfRlhfRE9ORSAxCi0KLS8qIFJlZ2lzdGVyIG1hc2sgdmFyaWFibGVzLiAgVGhlc2UgYXJlIHNldCBieSB0aGUgTUlQUyBhc3NlbWJseSBjb2RlCi0gICBhbmQgdXNlZCBieSBFQ09GRiBhbmQgcG9zc2libHkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4gICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBtaXBzX2dwcm1hc2s7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBtaXBzX2Nwcm1hc2tbNF07Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcKLWV4dGVybiB2b2lkIG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnNkYXRhIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCi0gIHsgIi5zYnNzIiwJU0hUX05PQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX01JUFNfR1BSRUwJfSwgXAotICB7ICIubGl0NCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX01JUFNfR1BSRUwJfSwgXAotICB7ICIubGl0OCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX01JUFNfR1BSRUwJfSwgXAotICB7ICIudWNvZGUiLAlTSFRfTUlQU19VQ09ERSwJMAkJCQkJfSwgXAotICB7ICIubWRlYnVnIiwJU0hUX01JUFNfREVCVUcsCTAJCQkJCX0sCi0vKiBPdGhlciBzcGVjaWFsIHNlY3Rpb25zIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlcjogLnJlZ2luZm8sCi0gICAubGlibGlzdCwgLmNvbmZsaWN0LCAuZ3B0YWIsIC5nb3QsIC5keW5hbWljLCAucmVsLmR5bi4gICovCi0KLSNlbmRpZgotCi1leHRlcm4gdm9pZCBtZF9taXBzX2VuZCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2VuZCgpCW1kX21pcHNfZW5kKCkKLQotI2RlZmluZSBVU0VfR0xPQkFMX1BPSU5URVJfT1BUCShPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciBcCi0JCQkJIHx8IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQotZXh0ZXJuIHZvaWQgbWlwc19wb3BfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfcG9wX2luc2VydCgpCQltaXBzX3BvcF9pbnNlcnQoKQotCi1leHRlcm4gdm9pZCBtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgbWlwc19mbHVzaF9wZW5kaW5nX291dHB1dAotCi1leHRlcm4gdm9pZCBtaXBzX2VuYWJsZV9hdXRvX2FsaWduIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKQltaXBzX2VuYWJsZV9hdXRvX2FsaWduKCkKLQotI2VuZGlmIC8qIFRDX01JUFMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbW4xMDIwMC5jIGIvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NGY3YmYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDE0ICswLDAgQEAKLS8qIHRjLW1uMTAyMDAuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1hdHN1c2hpdGEgMTAyMDAKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIgotDAotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHJlZ19uYW1lCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGludCB2YWx1ZTsKLX07Ci0KLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbCB0YXJnZXRzLiAqLwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICI7IyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSAKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nIAotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCAKLSAgIGFzIGluIDBkMS4wLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotDAotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0gewotICAvKiBiQ0MgcmVsYXhpbmcgKi8KLSAgezB4ODEsIC0weDdlLCAyLCAxfSwKLSAgezB4ODAwNCwgLTB4N2ZmYiwgNSwgMn0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA3LCAwfSwKLSAgLyogYkNDeCByZWxheGluZyAqLwotICB7MHg4MSwgLTB4N2UsIDMsIDR9LAotICB7MHg4MDA0LCAtMHg3ZmZiLCA2LCA1fSwKLSAgezB4ODAwMDA2LCAtMHg3ZmZmZjksIDgsIDB9LAotICAvKiBqc3IgcmVsYXhpbmcgKi8KLSAgezB4ODAwNCwgLTB4N2ZmYiwgMywgN30sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA1LCAwfSwKLSAgLyogam1wIHJlbGF4aW5nICovCi0gIHsweDgxLCAtMHg3ZSwgMiwgOX0sCi0gIHsweDgwMDQsIC0weDdmZmIsIDMsIDEwfSwKLSAgezB4ODAwMDA2LCAtMHg3ZmZmZjksIDUsIDB9LAotCi19OwotLyogbG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBtbjEwMjAwX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqLAotCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCwKLQkJCQkJICAgIHVuc2lnbmVkKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjaGVja19vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICosCi0JCQkJCSAgICBvZmZzZXRUKSk7Ci1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGRhdGFfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBib29sZWFuIGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBib29sZWFuIG90aGVyX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci0KLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBtbjEwMjAwX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9waW5kZXg7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci1zdHJ1Y3QgbW4xMDIwMF9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKLXN0YXRpYyBpbnQgZmM7Ci0MCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsgCi0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgTlVMTCwgICAgICAgTlVMTCwgICAgICAgICAgIDAgfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1uMTAyMDBfaGFzaDsKLQotLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBkYXRhX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiZDAiLCAwIH0sCi0gIHsgImQxIiwgMSB9LAotICB7ICJkMiIsIDIgfSwKLSAgeyAiZDMiLCAzIH0sCi19OwotI2RlZmluZSBEQVRBX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGRhdGFfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGFkZHJlc3NfcmVnaXN0ZXJzW10gPQotewotICB7ICJhMCIsIDAgfSwKLSAgeyAiYTEiLCAxIH0sCi0gIHsgImEyIiwgMiB9LAotICB7ICJhMyIsIDMgfSwKLX07Ci0jZGVmaW5lIEFERFJFU1NfUkVHX05BTUVfQ05UCShzaXplb2YoYWRkcmVzc19yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgb3RoZXJfcmVnaXN0ZXJzW10gPQotewotICB7ICJtZHIiLCAwIH0sCi0gIHsgInBzdyIsIDAgfSwKLX07Ci0jZGVmaW5lIE9USEVSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKG90aGVyX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBnaXZlbiByZWdpc3RlciB0YWJsZQotICAgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSkKLSAgICAgY29uc3Qgc3RydWN0IHJlZ19uYW1lICpyZWdzOwotICAgICBpbnQgcmVnY291bnQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gcmVnY291bnQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZSAKLQkgIHJldHVybiByZWdzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotZGF0YV9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChkYXRhX3JlZ2lzdGVycywgREFUQV9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoYWRkcmVzc19yZWdpc3RlcnMsIEFERFJFU1NfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1vdGhlcl9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChvdGhlcl9yZWdpc3RlcnMsIE9USEVSX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJNTjEwMjAwIG9wdGlvbnM6XG5cCi1ub25lIHlldFxuIikpOwotfSAKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0cCwgc2l6ZXApCi0gIGludCB0eXBlOwotICBjaGFyICpsaXRwOwotICBpbnQgKnNpemVwOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplcCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLSAgCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplcCA9IHByZWMgKiAyOwotCi0gIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLSAgICAgIGxpdHAgKz0gMjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGZyYWdTICpmcmFnUDsKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFiZWxfY291bnQgPSAwOwotICBjaGFyIGJ1Zls0MF07Ci0KLSAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDApCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMDoKLQkgIG9wY29kZSA9IDB4ZTI7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBvcGNvZGUgPSAweGUwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUzOgotCSAgb3Bjb2RlID0gMHhlMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMToKLQkgIG9wY29kZSA9IDB4ZTM7Ci0JICBicmVhazsKLQljYXNlIDB4ZTQ6Ci0JICBvcGNvZGUgPSAweGU2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU2OgotCSAgb3Bjb2RlID0gMHhlNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNzoKLQkgIG9wY29kZSA9IDB4ZTU7Ci0JICBicmVhazsKLQljYXNlIDB4ZTU6Ci0JICBvcGNvZGUgPSAweGU3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhmYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMywgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMikKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhlODoKLQkgIG9wY29kZSA9IDB4ZTk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTk6Ci0JICBvcGNvZGUgPSAweGU4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGUwOgotCSAgb3Bjb2RlID0gMHhlMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMjoKLQkgIG9wY29kZSA9IDB4ZTA7Ci0JICBicmVhazsKLQljYXNlIDB4ZTM6Ci0JICBvcGNvZGUgPSAweGUxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUxOgotCSAgb3Bjb2RlID0gMHhlMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNDoKLQkgIG9wY29kZSA9IDB4ZTY7Ci0JICBicmVhazsKLQljYXNlIDB4ZTY6Ci0JICBvcGNvZGUgPSAweGU0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU3OgotCSAgb3Bjb2RlID0gMHhlNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNToKLQkgIG9wY29kZSA9IDB4ZTc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGUwOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMjRfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDc7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA0KQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhmYzoKLQkgIG9wY29kZSA9IDB4ZmQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZmQ6Ci0JICBvcGNvZGUgPSAweGZjOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZlOgotCSAgb3Bjb2RlID0gMHhmZjsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZjoKLQkgIG9wY29kZSA9IDB4ZmU7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlOToKLQkgIG9wY29kZSA9IDB4ZTg7Ci0JICBicmVhazsKLQljYXNlIDB4ZTA6Ci0JICBvcGNvZGUgPSAweGUyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgb3Bjb2RlID0gMHhlMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMzoKLQkgIG9wY29kZSA9IDB4ZTE7Ci0JICBicmVhazsKLQljYXNlIDB4ZTE6Ci0JICBvcGNvZGUgPSAweGUzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGU0OgotCSAgb3Bjb2RlID0gMHhlNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNjoKLQkgIG9wY29kZSA9IDB4ZTQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZTc6Ci0JICBvcGNvZGUgPSAweGU1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU1OgotCSAgb3Bjb2RlID0gMHhlNzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYzoKLQkgIG9wY29kZSA9IDB4ZWQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZWQ6Ci0JICBvcGNvZGUgPSAweGVjOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVlOgotCSAgb3Bjb2RlID0gMHhlZjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZjoKLQkgIG9wY29kZSA9IDB4ZWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhmYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNSkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZmM6Ci0JICBvcGNvZGUgPSAweGZkOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZkOgotCSAgb3Bjb2RlID0gMHhmYzsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZToKLQkgIG9wY29kZSA9IDB4ZmY7Ci0JICBicmVhazsKLQljYXNlIDB4ZmY6Ci0JICBvcGNvZGUgPSAweGZlOwotCWNhc2UgMHhlODoKLQkgIG9wY29kZSA9IDB4ZTk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTk6Ci0JICBvcGNvZGUgPSAweGU4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGUwOgotCSAgb3Bjb2RlID0gMHhlMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMjoKLQkgIG9wY29kZSA9IDB4ZTA7Ci0JICBicmVhazsKLQljYXNlIDB4ZTM6Ci0JICBvcGNvZGUgPSAweGUxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUxOgotCSAgb3Bjb2RlID0gMHhlMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNDoKLQkgIG9wY29kZSA9IDB4ZTY7Ci0JICBicmVhazsKLQljYXNlIDB4ZTY6Ci0JICBvcGNvZGUgPSAweGU0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU3OgotCSAgb3Bjb2RlID0gMHhlNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNToKLQkgIG9wY29kZSA9IDB4ZTc7Ci0JICBicmVhazsKLQljYXNlIDB4ZWM6Ci0JICBvcGNvZGUgPSAweGVkOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVkOgotCSAgb3Bjb2RlID0gMHhlYzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZToKLQkgIG9wY29kZSA9IDB4ZWY7Ci0JICBicmVhazsKLQljYXNlIDB4ZWY6Ci0JICBvcGNvZGUgPSAweGVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZjQ7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA0XSA9IDB4ZTA7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDUsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gODsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA3KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZjQ7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IDB4ZTE7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzI0X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOCkKLSAgICB7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtmcmFnUC0+ZnJfZml4XSA9IDB4ZWE7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOSkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGZjOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEwKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZjQ7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IDB4ZTA7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzI0X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgdmFsdWVUIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm9wOwotCi0gIG1uMTAyMDBfaGFzaCA9IGhhc2hfbmV3KCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgTU4xMDIwMCBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgb3AgPSBtbjEwMjAwX29wY29kZXM7Ci0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wLT5uYW1lKSkgCi0JewotCSAgcHJldl9uYW1lID0gKGNoYXIgKikgb3AtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAobW4xMDIwMF9oYXNoLCBvcC0+bmFtZSwgKGNoYXIgKikgb3ApOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYm90aCBhIHNpbXBsaWZpY2F0aW9uICh3ZSBkb24ndCBoYXZlIHRvIHdyaXRlIG1kX2FwcGx5X2ZpeCkKLSAgICAgYW5kIHN1cHBvcnQgZm9yIGZ1dHVyZSBvcHRpbWl6YXRpb25zIChicmFuY2ggc2hvcnRlbmluZyBhbmQgc2ltaWxhcgotICAgICBzdHVmZiBpbiB0aGUgbGlua2VyLiAgKi8KLSAgbGlua3JlbGF4ID0gMTsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikgCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqczsKLSAgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcGNvZGU7Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqbmV4dF9vcGNvZGU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotICBpbnQgbmV4dF9vcGluZGV4LCByZWxheGFibGU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uLCBzaXplID0gMDsKLSAgY2hhciAqZjsKLSAgaW50IGk7Ci0gIGludCBtYXRjaDsKLQotICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQotICAgIDsKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgKnMrKyA9ICdcMCc7Ci0KLSAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovCi0gIG9wY29kZSA9IChzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKiloYXNoX2ZpbmQgKG1uMTAyMDBfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIGZvcig7OykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotICAgICAgaW50IG9wX2lkeDsKLSAgICAgIGNoYXIgKmhvbGQ7Ci0gICAgICBpbnQgZXh0cmFfc2hpZnQgPSAwOwotCi0gICAgICByZWxheGFibGUgPSAwOwotICAgICAgZmMgPSAwOwotICAgICAgbWF0Y2ggPSAwOwotICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLSAgICAgIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBmb3IgKG9wX2lkeCA9IDEsIG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsKLQkgICAqb3BpbmRleF9wdHIgIT0gMDsKLQkgICBvcGluZGV4X3B0cisrLCBvcF9pZHgrKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotCSAgZXhwcmVzc2lvblMgZXg7Ci0KLQkgIGlmIChuZXh0X29waW5kZXggPT0gMCkKLQkgICAgewotCSAgICAgIG9wZXJhbmQgPSAmbW4xMDIwMF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbbmV4dF9vcGluZGV4XTsKLQkgICAgICBuZXh0X29waW5kZXggPSAwOwotCSAgICB9Ci0KLQkgIGVycm1zZyA9IE5VTEw7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJykKLQkgICAgKytzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9SRUxBWCkKLQkgICAgcmVsYXhhYmxlID0gMTsKLQotCSAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAqLwotCSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BBUkVOKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyknICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJygnKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIC8qIFNlZSBpZiB3ZSBjYW4gbWF0Y2ggdGhlIG9wZXJhbmRzLiAgKi8KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0RSRUcpCi0JICAgIHsKLQkgICAgICBpZiAoIWRhdGFfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0FSRUcpCi0JICAgIHsKLQkgICAgICBpZiAoIWFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BTVykKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNtcCAoc3RhcnQsICJwc3ciKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX01EUikKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNtcCAoc3RhcnQsICJtZHIiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGRhdGFfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAob3RoZXJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmICgqc3RyID09ICcpJyB8fCAqc3RyID09ICcoJykKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uICgmZXgpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoZXguWF9vcCkgCi0JICAgIHsKLQkgICAgY2FzZSBPX2lsbGVnYWw6Ci0JICAgICAgZXJybXNnID0gXygiaWxsZWdhbCBvcGVyYW5kIik7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgY2FzZSBPX2Fic2VudDoKLQkgICAgICBlcnJtc2cgPSBfKCJtaXNzaW5nIG9wZXJhbmQiKTsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncwotICAgICAgICAgICAgICAgICAgICYgKE1OMTAyMDBfT1BFUkFORF9EUkVHIHwgTU4xMDIwMF9PUEVSQU5EX0FSRUcpKSA9PSAwKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkJCi0JICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8yIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF81KQotCQlleHRyYV9zaGlmdCA9IDg7Ci0JICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzMgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzYKLQkJICAgICAgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF83KQotCQlleHRyYV9zaGlmdCA9IDE2OwotCSAgICAgIGVsc2UKLQkJZXh0cmFfc2hpZnQgPSAwOwotCSAgICAgIAotCSAgICAgIG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCSAgICAgIGV4LlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCwKLQkJCQkgICAgICAwLCBleHRyYV9zaGlmdCk7Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgYW5kIGl0IGRvZXNuJ3QKLQkJIGZpdCBpbnRvIHRoZSBhbGxvY2F0ZWQgYml0ZmllbGQgZm9yIHRoaXMgaW5zbiwKLQkJIHRoZW4gcHJvbW90ZSBpdCAoaWUgdGhpcyBvcGNvZGUgZG9lcyBub3QgbWF0Y2gpLiAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MKLQkJICAmIChNTjEwMjAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAyMDBfT1BFUkFORF9SRUxBWCkKLQkJICAmJiAhIGNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlcikpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0JCQkJICAgICAgZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAotCQkJCSAgICAgIDAsIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgdGhlbiB0aGlzIG9wY29kZSBkaWRuJ3QKLQkJIG1hdGNoIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgaXQgbmVlZGVkIHByb21vdGlvbiEgICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BST01PVEUpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotCSAgICAgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICAgICAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgICAgICBmaXh1cHNbZmNdLm9waW5kZXggPSAqb3BpbmRleF9wdHI7Ci0JICAgICAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgICAgKytmYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi1rZWVwX2dvaW5nOgotCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQotCSAgICArK3N0cjsKLQotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHdlIHVzZWQgYWxsIHRoZSBvcGVyYW5kcyEgICovCi0gICAgICBpZiAoKnN0ciAhPSAnLCcpCi0JbWF0Y2ggPSAxOwotCi0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLSAgICAgICAgewotCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOwotCSAgaWYgKCFzdHJjbXAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgCi0JICBhc19iYWQgKCIlcyIsIGVycm1zZyk7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAgIAotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8xKQotICAgIHNpemUgPSAxOwotICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNCkKLSAgICBzaXplID0gMjsKLSAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzMgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzUpCi0gICAgc2l6ZSA9IDM7Ci0gIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF82KQotICAgIHNpemUgPSA0OwotICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNykKLSAgICBzaXplID0gNTsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotICAgICAgICAgCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi0gIGlmIChyZWxheGFibGUgJiYgZmMgPiAwKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICAvKiBiQ0MgKi8KLSAgICAgIGlmIChzaXplID09IDIgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYzAwMDApCi0JewotCSAgLyogSGFuZGxlIGJyYSBzcGVjaWFsbHkuICBCYXNpY2FsbHkgdHJlYXQgaXQgbGlrZSBqbXAgc28KLQkgICAgIHRoYXQgd2UgYXV0b21hdGljYWxseSBoYW5kbGUgOCwgMTYgYW5kIDMyIGJpdCBvZmZzZXRzCi0JICAgICBjb3JyZWN0bHkgYXMgd2VsbCBhcyBqdW1wcyB0byBhbiB1bmRlZmluZWQgYWRkcmVzcy4KLQotCSAgICAgSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90IHRyZWF0IGl0IGxpa2Ugb3RoZXIgYkNDCi0JICAgICBpbnN0cnVjdGlvbnMgc2luY2UgdGhlIGxvbmcgZm9ybXMgb2YgYnJhIGlzIGRpZmZlcmVudAotCSAgICAgZnJvbSBvdGhlciBiQ0MgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICAgICAgICBpZiAob3Bjb2RlLT5vcGNvZGUgPT0gMHhlYTAwKQotICAgICAgICAgICAgdHlwZSA9IDg7Ci0JICBlbHNlCi0JICAgIHR5cGUgPSAwOwotCX0KLSAgICAgIC8qIGpzciAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAzICYmIG9wY29kZS0+b3Bjb2RlID09IDB4ZmQwMDAwKQotCXR5cGUgPSA2OwotICAgICAgLyogam1wICovCi0gICAgICBlbHNlIGlmIChzaXplID09IDMgJiYgb3Bjb2RlLT5vcGNvZGUgPT0gMHhmYzAwMDApCi0JdHlwZSA9IDg7Ci0gICAgICAvKiBiQ0N4ICovCi0gICAgICBlbHNlCi0JdHlwZSA9IDM7Ci0KLSAgICAgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDggLSBzaXplLCB0eXBlLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCSAgICBmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKLQkJICAgIChjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOwotICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSk7Ci0gICAgICBpZiAoOCAtIHNpemUgPiA0KQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyBzaXplLCAwLCA0KTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyBzaXplICsgNCwgMCwgOCAtIHNpemUgLSA0KTsKLQl9Ci0gICAgICBlbHNlCi0JbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIHNpemUsIDAsIDggLSBzaXplKTsKLSAgICB9Ci0KLSAgZWxzZQotICAgIHsKLSAgICAgIGYgPSBmcmFnX21vcmUgKHNpemUpOwotCi0gICAgICAvKiBPaCwgd2hhdCBhIG1lc3MuICBUaGUgaW5zdHJ1Y3Rpb24gaXMgaW4gYmlnIGVuZGlhbiBmb3JtYXQsIGJ1dAotCSAxNiBhbmQgMjRiaXQgaW1tZWRpYXRlcyBhcmUgbGl0dGxlIGVuZGlhbiEgICovCi0gICAgICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzMpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgaW5zbiAmIDB4ZmZmZiwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzYpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNykKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIGluc24gJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplID4gNCA/IDQgOiBzaXplKTsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgIG9wZXJhbmQgPSAmbW4xMDIwMF9vcGVyYW5kc1tmaXh1cHNbaV0ub3BpbmRleF07Ci0JICBpZiAoZml4dXBzW2ldLnJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JICAgIHsKLQkgICAgICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0bzsKLQkgICAgICBpbnQgc2l6ZTsKLQkgICAgICBpbnQgb2Zmc2V0OwotCSAgICAgIGZpeFMgKmZpeFA7Ci0KLQkgICAgICByZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cHNbaV0ucmVsb2MpOwotCi0JICAgICAgaWYgKCFyZWxvY19ob3d0bykKLQkJYWJvcnQoKTsKLQkgIAotCSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgICAgIGlmIChzaXplIDwgMSB8fCBzaXplID4gNCkKLQkJYWJvcnQoKTsKLQotCSAgICAgIG9mZnNldCA9IDQgLSBzaXplOwotCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKLQkJCQkgIHNpemUsCi0JCQkJICAmZml4dXBzW2ldLmV4cCwgCi0JCQkJICByZWxvY19ob3d0by0+cGNfcmVsYXRpdmUsCi0JCQkJICBmaXh1cHNbaV0ucmVsb2MpOwotCi0JICAgICAgLyogUEMtcmVsYXRpdmUgb2Zmc2V0cyBhcmUgZnJvbSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dAotCQkgaW5zdHJ1Y3Rpb24sIG5vdCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSkKLQkJZml4UC0+Znhfb2Zmc2V0ICs9IHNpemU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCByZWxvYywgcGNyZWwsIHJlbG9jX3NpemUsIG9mZnNldDsKLQkgICAgICBmaXhTICpmaXhQOwotCi0JICAgICAgcmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLQkgICAgICAvKiBIb3cgYmlnIGlzIHRoZSByZWxvYz8gIFJlbWVtYmVyIFNQTElUIHJlbG9jcyBhcmUKLQkJIGltcGxpY2l0bHkgMzJiaXRzLiAgKi8KLQkgICAgICByZWxvY19zaXplID0gb3BlcmFuZC0+Yml0czsKLQotCSAgICAgIG9mZnNldCA9IHNpemUgLSByZWxvY19zaXplIC8gODsKLQotCSAgICAgIC8qIElzIHRoZSByZWxvYyBwYy1yZWxhdGl2ZT8gICovCi0JICAgICAgcGNyZWwgPSAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUENSRUwpICE9IDA7Ci0KLQotCSAgICAgIC8qIENob29zZSBhIHByb3BlciBCRkQgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQkgICAgICBpZiAocGNyZWwpCi0JCXsKLQkJICBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDI0KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMjRfUENSRUw7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzMyOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18xNjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDgpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ184OwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMjQpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18yNDsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgLyogQ29udmVydCB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MgaW50byB3aGF0IGZpeF9uZXdfZXhwIHdhbnRzLiAgKi8KLQkgICAgICByZWxvY19zaXplID0gcmVsb2Nfc2l6ZSAvIDg7Ci0JICAgICAgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJcmVsb2Nfc2l6ZSA9IDA7Ci0JICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKLQkJcmVsb2Nfc2l6ZSA9IDE7Ci0JICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAzMiB8fCByZWxvY19zaXplID09IDI0KQotCQlyZWxvY19zaXplID0gMjsKLQotCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKLQkJCQkgIHJlbG9jX3NpemUsICZmaXh1cHNbaV0uZXhwLCBwY3JlbCwKLQkJCQkgICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSByZWxvYykpOwotCi0JICAgICAgLyogUEMtcmVsYXRpdmUgb2Zmc2V0cyBhcmUgZnJvbSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dAotCQkgaW5zdHJ1Y3Rpb24sIG5vdCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKHBjcmVsKQotCQlmaXhQLT5meF9vZmZzZXQgKz0gc2l6ZTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCi0vKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLwotICAgICAgICAgICAgICAgICAKLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICBpZiAoZml4cC0+ZnhfYWRkc3kgJiYgZml4cC0+Znhfc3Vic3kpCi0gICAgewotICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpKQotCSAgfHwgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCXsKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSJEaWZmZXJlbmNlIG9mIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZiZmRfYWJzX3N5bWJvbDsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSAoU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KQotCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpICsgZml4cC0+Znhfb2Zmc2V0KTsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgfQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDApCi0gICAgcmV0dXJuIDI7Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHJldHVybiAzOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gNikKLSAgICB7Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoZnJhZ3AtPmZyX3N5bWJvbCkKLQkgIHx8IHNlZyAhPSBTX0dFVF9TRUdNRU5UIChmcmFncC0+ZnJfc3ltYm9sKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IDc7Ci0JICByZXR1cm4gNTsKLQl9Ci0gICAgICByZXR1cm4gMzsKLSAgICB9Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSA4KQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IDEwOwotCSAgcmV0dXJuIDU7Ci0JfQotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jaWYgMAotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTCAmJiAhIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0jZW5kaWYKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBXZSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZSBiZWNhdXNlIGxpbmtyZWxheCBpcyBub256ZXJvLiAgKi8KLSAgYWJvcnQgKCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMjAwX2luc2VydF9vcGVyYW5kIChpbnNucCwgZXh0ZW5zaW9ucCwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzaGlmdCkKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmV4dGVuc2lvbnA7Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNoaWZ0OwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDI0IG9yIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzIDwgMjQKLSAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLKSA9PSAwKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyICplcnIgPQotICAgICAgICAgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpOwotICAgICAgICAgIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgICAgICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0gICAgICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICAgICAgICAgIGFzX3dhcm4gKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLSAgICAgICAgfQotICAgIH0KLQotICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEKSA9PSAwKQotICAgIHsKLSAgICAgICppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0KSk7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUkVQRUFURUQpICE9IDApCi0JKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCArIDIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqZXh0ZW5zaW9ucCB8PSAodmFsID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAqaW5zbnAgfD0gdmFsICYgMHhmZmZmOwotICAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAyNGJpdCBvciAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA8IDI0Ci0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSykgPT0gMCkKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLSAgICAgICAgICBtaW4gPSAwOwotICAgICAgICB9Ci0KLSAgICAgIHRlc3QgPSB2YWw7Ci0KLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotCXJldHVybiAwOwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuaCBiL2dhcy9jb25maWcvdGMtbW4xMDIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTNlNTY5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDIwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogdGMtbW4xMDIwMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1tbjEwMjAwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19NTjEwMjAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgTU4xMDIwMCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tbjEwMjAwCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbW4xMDIwMCIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0vKiBEb24ndCBib3RoZXIgdG8gYWRqdXN0IHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgMAotCi0vKiBXZSBkbyByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlci4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYyBiL2dhcy9jb25maWcvdGMtbW4xMDMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE0NmQxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0OSArMCwwIEBACi0vKiB0Yy1tbjEwMzAwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMzAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAzMDAuaCIKLQwKLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCByZWdfbmFtZQotewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgdmFsdWU7Ci19OwotCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9IHsKLSAgLyogYkNDIHJlbGF4aW5nICovCi0gIHsweDdmLCAtMHg4MCwgMiwgMX0sCi0gIHsweDdmZmYsIC0weDgwMDAsIDUsIDJ9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDcsIDB9LAotCi0gIC8qIGJDQyByZWxheGluZyAodW5jb21tb24gY2FzZXMpICovCi0gIHsweDdmLCAtMHg4MCwgMywgNH0sCi0gIHsweDdmZmYsIC0weDgwMDAsIDYsIDV9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDgsIDB9LAotCi0gIC8qIGNhbGwgcmVsYXhpbmcgKi8KLSAgezB4N2ZmZiwgLTB4ODAwMCwgNSwgN30sCi0gIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgNywgMH0sCi0KLSAgLyogY2FsbHMgcmVsYXhpbmcgKi8KLSAgezB4N2ZmZiwgLTB4ODAwMCwgNCwgOX0sCi0gIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgNiwgMH0sCi0KLSAgLyogam1wIHJlbGF4aW5nICovCi0gIHsweDdmLCAtMHg4MCwgMiwgMTF9LAotICB7MHg3ZmZmLCAtMHg4MDAwLCAzLCAxMn0sCi0gIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgNSwgMH0sCi0KLX07Ci0KLS8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQsIGNoYXIgKiwgdW5zaWduZWQsCi0JCQkJCSAgICB1bnNpZ25lZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hlY2tfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqLAotCQkJCQkgICAgb2Zmc2V0VCkpOwotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2ggUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlZ19uYW1lICosIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkYXRhX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBhZGRyZXNzX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBvdGhlcl9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIHZvaWQgc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGludCBjdXJyZW50X21hY2hpbmU7Ci0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgbW4xMDMwMF9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19Owotc3RydWN0IG1uMTAzMDBfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci1zdGF0aWMgaW50IGZjOwotCi0vKiBXZSBtdXN0IHN0b3JlIHRoZSB2YWx1ZSBvZiBlYWNoIHJlZ2lzdGVyIG9wZXJhbmQgc28gdGhhdCB3ZSBjYW4KLSAgIHZlcmlmeSB0aGF0IGNlcnRhaW4gcmVnaXN0ZXJzIGRvIG5vdCBtYXRjaC4gICovCi1pbnQgbW4xMDMwMF9yZWdfb3BlcmFuZHNbTU4xMDMwMF9NQVhfT1BFUkFORFNdOwotDAotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7IAotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJhbTMwIiwJc2V0X2FyY2hfbWFjaCwJCTMwMCB9LAotICB7ICJtbjEwMzAwIiwJc2V0X2FyY2hfbWFjaCwJCTMwMCB9LAotICB7TlVMTCwgMCwgMH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptbjEwMzAwX2hhc2g7Ci0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgZGF0YV9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImQwIiwgMCB9LAotICB7ICJkMSIsIDEgfSwKLSAgeyAiZDIiLCAyIH0sCi0gIHsgImQzIiwgMyB9LAotfTsKLSNkZWZpbmUgREFUQV9SRUdfTkFNRV9DTlQJKHNpemVvZihkYXRhX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBhZGRyZXNzX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCAwIH0sCi0gIHsgImExIiwgMSB9LAotICB7ICJhMiIsIDIgfSwKLSAgeyAiYTMiLCAzIH0sCi19OwotI2RlZmluZSBBRERSRVNTX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGFkZHJlc3NfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgb3RoZXJfcmVnaXN0ZXJzW10gPQotewotICB7ICJtZHIiLCAwIH0sCi0gIHsgInBzdyIsIDAgfSwKLSAgeyAic3AiLCAwIH0sCi19OwotI2RlZmluZSBPVEhFUl9SRUdfTkFNRV9DTlQJKHNpemVvZihvdGhlcl9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUKLSAgIHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUpCi0gICAgIGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqcmVnczsKLSAgICAgaW50IHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UgCi0JICByZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotZGF0YV9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChkYXRhX3JlZ2lzdGVycywgREFUQV9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoYWRkcmVzc19yZWdpc3RlcnMsIEFERFJFU1NfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1vdGhlcl9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChvdGhlcl9yZWdpc3RlcnMsIE9USEVSX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJNTjEwMzAwIG9wdGlvbnM6XG5cCi1ub25lIHlldFxuIikpOwotfSAKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0cCwgc2l6ZXApCi0gIGludCB0eXBlOwotICBjaGFyICpsaXRwOwotICBpbnQgKnNpemVwOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplcCA9IDA7Ci0gICAgICByZXR1cm4gImJhZCBjYWxsIHRvIG1kX2F0b2YiOwotICAgIH0KLSAgCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplcCA9IHByZWMgKiAyOwotCi0gIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLSAgICAgIGxpdHAgKz0gMjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGZyYWdTICpmcmFnUDsKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFiZWxfY291bnQgPSAwOwotICBjaGFyIGJ1Zls0MF07Ci0KLSAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDApCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxKQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGM4OgotCSAgb3Bjb2RlID0gMHhjOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjOToKLQkgIG9wY29kZSA9IDB4Yzg7Ci0JICBicmVhazsKLQljYXNlIDB4YzA6Ci0JICBvcGNvZGUgPSAweGMyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMyOgotCSAgb3Bjb2RlID0gMHhjMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMzoKLQkgIG9wY29kZSA9IDB4YzE7Ci0JICBicmVhazsKLQljYXNlIDB4YzE6Ci0JICBvcGNvZGUgPSAweGMzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGM0OgotCSAgb3Bjb2RlID0gMHhjNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNjoKLQkgIG9wY29kZSA9IDB4YzQ7Ci0JICBicmVhazsKLQljYXNlIDB4Yzc6Ci0JICBvcGNvZGUgPSAweGM1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM1OgotCSAgb3Bjb2RlID0gMHhjNzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gPSAweGNjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAzLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMikKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhjODoKLQkgIG9wY29kZSA9IDB4Yzk7Ci0JICBicmVhazsKLQljYXNlIDB4Yzk6Ci0JICBvcGNvZGUgPSAweGM4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGMwOgotCSAgb3Bjb2RlID0gMHhjMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMjoKLQkgIG9wY29kZSA9IDB4YzA7Ci0JICBicmVhazsKLQljYXNlIDB4YzM6Ci0JICBvcGNvZGUgPSAweGMxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMxOgotCSAgb3Bjb2RlID0gMHhjMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNDoKLQkgIG9wY29kZSA9IDB4YzY7Ci0JICBicmVhazsKLQljYXNlIDB4YzY6Ci0JICBvcGNvZGUgPSAweGM0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM3OgotCSAgb3Bjb2RlID0gMHhjNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNToKLQkgIG9wY29kZSA9IDB4Yzc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhkYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMywgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA0KQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhlODoKLQkgIG9wY29kZSA9IDB4ZTk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTk6Ci0JICBvcGNvZGUgPSAweGU4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGVhOgotCSAgb3Bjb2RlID0gMHhlYjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYjoKLQkgIG9wY29kZSA9IDB4ZWE7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4Y2M7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA1KQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhlODoKLQkgIG9wY29kZSA9IDB4ZTk7Ci0JICBicmVhazsKLQljYXNlIDB4ZWE6Ci0JICBvcGNvZGUgPSAweGViOwotCSAgYnJlYWs7Ci0JY2FzZSAweGViOgotCSAgb3Bjb2RlID0gMHhlYTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhkYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gODsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhjZDsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDcpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhkZDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDVdID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM107Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA2XSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDRdOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDc7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA4KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZmE7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IDB4ZmY7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA5KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZmM7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IDB4ZmY7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEwKQotICAgIHsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW2ZyYWdQLT5mcl9maXhdID0gMHhjYTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMTEpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhjYzsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMTIpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhkYzsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgdmFsdWVUIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKm9wOwotCi0gIG1uMTAzMDBfaGFzaCA9IGhhc2hfbmV3KCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgTU4xMDMwMCBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgb3AgPSBtbjEwMzAwX29wY29kZXM7Ci0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wLT5uYW1lKSkgCi0JewotCSAgcHJldl9uYW1lID0gKGNoYXIgKikgb3AtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAobW4xMDMwMF9oYXNoLCBvcC0+bmFtZSwgKGNoYXIgKikgb3ApOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYm90aCBhIHNpbXBsaWZpY2F0aW9uICh3ZSBkb24ndCBoYXZlIHRvIHdyaXRlIG1kX2FwcGx5X2ZpeCkKLSAgICAgYW5kIHN1cHBvcnQgZm9yIGZ1dHVyZSBvcHRpbWl6YXRpb25zIChicmFuY2ggc2hvcnRlbmluZyBhbmQgc2ltaWxhcgotICAgICBzdHVmZiBpbiB0aGUgbGlua2VyKS4gICovCi0gIGxpbmtyZWxheCA9IDE7Ci0KLSAgLyogU2V0IHRoZSBkZWZhdWx0IG1hY2hpbmUgdHlwZS4gICovCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbW4xMDMwMCwgMzAwKSkKLSAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICBjdXJyZW50X21hY2hpbmUgPSAzMDA7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpIAotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIHN0cnVjdCBtbjEwMzAwX29wY29kZSAqb3Bjb2RlOwotICBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKm5leHRfb3Bjb2RlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLSAgaW50IG5leHRfb3BpbmRleCwgcmVsYXhhYmxlOwotICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbiwgc2l6ZSA9IDA7Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotICBpbnQgbWF0Y2g7Ci0KLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIGZpbmQgdGhlIGZpcnN0IG9wY29kZSB3aXRoIHRoZSBwcm9wZXIgbmFtZSAqLwotICBvcGNvZGUgPSAoc3RydWN0IG1uMTAzMDBfb3Bjb2RlICopaGFzaF9maW5kIChtbjEwMzAwX2hhc2gsIHN0cik7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RyID0gczsKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICBmb3IoOzspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICAgaW50IG9wX2lkeDsKLSAgICAgIGNoYXIgKmhvbGQ7Ci0gICAgICBpbnQgZXh0cmFfc2hpZnQgPSAwOwotCi0KLSAgICAgIGVycm1zZyA9IF8oIkludmFsaWQgb3Bjb2RlL29wZXJhbmRzIik7Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSBhcnJheSBvZiByZWdpc3RlciBvcGVyYW5kcy4gICovCi0gICAgICBtZW1zZXQgKG1uMTAzMDBfcmVnX29wZXJhbmRzLCAtMSwgc2l6ZW9mIChtbjEwMzAwX3JlZ19vcGVyYW5kcykpOwotCi0gICAgICByZWxheGFibGUgPSAwOwotICAgICAgZmMgPSAwOwotICAgICAgbWF0Y2ggPSAwOwotICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLSAgICAgIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IG1hY2hpbmUKLQkgdGhlbiBpdCBjYW4gbm90IHBvc3NpYmx5IG1hdGNoLiAgKi8KLSAgICAgIGlmIChvcGNvZGUtPm1hY2hpbmUKLQkgICYmIChvcGNvZGUtPm1hY2hpbmUgIT0gY3VycmVudF9tYWNoaW5lKSkKLQlnb3RvIGVycm9yOwotCi0gICAgICBmb3IgKG9wX2lkeCA9IDEsIG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsKLQkgICAqb3BpbmRleF9wdHIgIT0gMDsKLQkgICBvcGluZGV4X3B0cisrLCBvcF9pZHgrKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotCSAgZXhwcmVzc2lvblMgZXg7Ci0KLQkgIGlmIChuZXh0X29waW5kZXggPT0gMCkKLQkgICAgewotCSAgICAgIG9wZXJhbmQgPSAmbW4xMDMwMF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbbmV4dF9vcGluZGV4XTsKLQkgICAgICBuZXh0X29waW5kZXggPSAwOwotCSAgICB9Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJykKLQkgICAgKytzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRUxBWCkKLQkgICAgcmVsYXhhYmxlID0gMTsKLQotCSAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAqLwotCSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BBUkVOKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyknICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJygnKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIC8qIFNlZSBpZiB3ZSBjYW4gbWF0Y2ggdGhlIG9wZXJhbmRzLiAgKi8KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0RSRUcpCi0JICAgIHsKLQkgICAgICBpZiAoIWRhdGFfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0FSRUcpCi0JICAgIHsKLQkgICAgICBpZiAoIWFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJzcCIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUFNXKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJwc3ciKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX01EUikKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAibWRyIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IDA7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1snKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIC8qIEVhdCB0aGUgJ1snLiAgKi8KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgIAotCSAgICAgIC8qIFdlIHVzZWQgdG8gcmVqZWN0IGEgbnVsbCByZWdpc3RlciBsaXN0IGhlcmU7IGhvd2V2ZXIsCi0JCSB3ZSBhY2NlcHQgaXQgbm93IHNvIHRoZSBjb21waWxlciBjYW4gZW1pdCAiY2FsbCIgaW5zdHJ1Y3Rpb25zCi0JCSBmb3IgYWxsIGNhbGxzIHRvIG5hbWVkIGZ1bmN0aW9ucy4KLQotCQkgVGhlIGxpbmtlciBjYW4gdGhlbiBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGZvciB0aGUKLQkJIHJlZ2lzdGVyIGxpc3QgYW5kIHN0YWNrIHNpemUgb3IgY2hhbmdlIHRoZSBpbnN0cnVjdGlvbgotCQkgaW50byBhICJjYWxscyIgaWYgdXNpbmcgImNhbGwiIGlzIG5vdCBwcm9maXRhYmxlLiAgKi8KLQkgICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXScpCi0JCXsKLQkJICBjaGFyICpzdGFydDsKLQkJICBjaGFyIGM7Ci0KLQkJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JCSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotCQkgIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCQkgIGlmIChzdHJjYXNlY21wIChzdGFydCwgImQyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHg4MDsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJkMyIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4NDA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiYTIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDIwOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgImEzIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgxMDsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJvdGhlciIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MDg7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICAgICAgc3RyID0gaG9sZDsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgICAgICAgICBtbjEwMzAwX2luc2VydF9vcGVyYW5kICgmaW5zbiwgJmV4dGVuc2lvbiwgb3BlcmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIChjaGFyICopIE5VTEwsIDAsIDApOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQotCSAgICB9Ci0JICBlbHNlIGlmIChkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWRkcmVzc19yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG90aGVyX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnN0ciA9PSAnKScgfHwgKnN0ciA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4KTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKGV4Llhfb3ApIAotCSAgICB7Ci0JICAgIGNhc2UgT19pbGxlZ2FsOgotCSAgICAgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgY2FzZSBPX3JlZ2lzdGVyOgotCSAgICAgIHsKLQkJaW50IG1hc2s7Ci0KLQkJbWFzayA9IE1OMTAzMDBfT1BFUkFORF9EUkVHIHwgTU4xMDMwMF9PUEVSQU5EX0FSRUc7Ci0JCWlmICgob3BlcmFuZC0+ZmxhZ3MgJiBtYXNrKSA9PSAwKQotCQkgIHsKLQkJICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgICBzdHIgPSBob2xkOwotCQkgICAgZ290byBlcnJvcjsKLQkJICB9Ci0JCQotCQlpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QxIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMSkKLQkJICBleHRyYV9zaGlmdCA9IDg7Ci0JCWVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMgotCQkJIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENAotCQkJIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMgotCQkJIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNAotCQkJIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNgotCQkJIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENSkKLQkJICBleHRyYV9zaGlmdCA9IDE2OwotCQllbHNlCi0JCSAgZXh0cmFfc2hpZnQgPSAwOwotCSAgICAgIAotCQltbjEwMzAwX2luc2VydF9vcGVyYW5kICgmaW5zbiwgJmV4dGVuc2lvbiwgb3BlcmFuZCwKLQkJCQkJZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAotCQkJCQkwLCBleHRyYV9zaGlmdCk7Ci0KLQotCQkvKiBBbmQgbm90ZSB0aGUgcmVnaXN0ZXIgbnVtYmVyIGluIHRoZSByZWdpc3RlciBhcnJheS4gICovCi0JCW1uMTAzMDBfcmVnX29wZXJhbmRzW29wX2lkeCAtIDFdID0gZXguWF9hZGRfbnVtYmVyOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgY2FzZSBPX2NvbnN0YW50OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIGFuZCBpdCBkb2Vzbid0Ci0JCSBmaXQgaW50byB0aGUgYWxsb2NhdGVkIGJpdGZpZWxkIGZvciB0aGlzIGluc24sCi0JCSB0aGVuIHByb21vdGUgaXQgKGllIHRoaXMgb3Bjb2RlIGRvZXMgbm90IG1hdGNoKS4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzCi0JCSAgJiAoTU4xMDMwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMzAwX09QRVJBTkRfUkVMQVgpCi0JCSAgJiYgISBjaGVja19vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCSAgICAgIGV4LlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCwKLQkJCQkgICAgICAwLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIHRoZW4gdGhpcyBvcGNvZGUgZGlkbid0Ci0JCSBtYXRjaCBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIGl0IG5lZWRlZCBwcm9tb3Rpb24hICAqLwotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgICAgICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCQlhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgICAgIGZpeHVwc1tmY10uZXhwID0gZXg7Ci0JICAgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgICAgIGZpeHVwc1tmY10ucmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgICsrZmM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQota2VlcF9nb2luZzoKLQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJykKLQkgICAgKytzdHI7Ci0KLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB1c2VkIGFsbCB0aGUgb3BlcmFuZHMhICAqLwotICAgICAgaWYgKCpzdHIgIT0gJywnKQotCW1hdGNoID0gMTsKLQotICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgcmVnaXN0ZXJzIHRoYXQgbXVzdCBub3QgbWF0Y2gsIHZlcmlmeQotCSB0aGF0IHRoZXkgZG8gaW5kZWVkIG5vdCBtYXRjaC4gICovCi0gICAgICBpZiAob3Bjb2RlLT5ub19tYXRjaF9vcGVyYW5kcykKLQl7Ci0JICBpbnQgaTsKLQotCSAgLyogTG9vayBhdCBlYWNoIG9wZXJhbmQgdG8gc2VlIGlmIGl0J3MgbWFya2VkLiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBNTjEwMzAwX01BWF9PUEVSQU5EUzsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCgxIDw8IGkpICYgb3Bjb2RlLT5ub19tYXRjaF9vcGVyYW5kcykKLQkJewotCQkgIGludCBqOwotCi0JCSAgLyogb3BlcmFuZCBJIGlzIG1hcmtlZC4gIENoZWNrIHRoYXQgaXQgZG9lcyBub3QgbWF0Y2ggYW55Ci0JCSAgICAgb3BlcmFuZHMgPiBJIHdoaWNoIGFyZSBtYXJrZWQuICAqLwotCQkgIGZvciAoaiA9IGkgKyAxOyBqIDwgTU4xMDMwMF9NQVhfT1BFUkFORFM7IGorKykKLQkJICAgIHsKLQkJICAgICAgaWYgKCgoMSA8PCBqKSAmIG9wY29kZS0+bm9fbWF0Y2hfb3BlcmFuZHMpCi0JCQkgICYmIG1uMTAzMDBfcmVnX29wZXJhbmRzW2ldID09IG1uMTAzMDBfcmVnX29wZXJhbmRzW2pdKQotCQkJewotCQkJICBlcnJtc2cgPSBfKCJJbnZhbGlkIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24uIik7Ci0JCQkgIG1hdGNoID0gMDsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLSAgICAgICAgewotCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOwotCSAgaWYgKCFzdHJjbXAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgCi0JICBhc19iYWQgKCIlcyIsIGVycm1zZyk7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAgIAotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzApCi0gICAgc2l6ZSA9IDE7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDApCi0gICAgc2l6ZSA9IDI7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEpCi0gICAgc2l6ZSA9IDM7Ci0KLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0KQotICAgIHNpemUgPSA1OwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzYgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q1KQotICAgIHNpemUgPSA3OwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIpCi0gICAgc2l6ZSA9IDQ7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENCkKLSAgICBzaXplID0gNjsKLQotICBpZiAocmVsYXhhYmxlICYmIGZjID4gMCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLQotICAgICAgLyogYkNDICovCi0gICAgICBpZiAoc2l6ZSA9PSAyKQotCXsKLQkgIC8qIEhhbmRsZSBicmEgc3BlY2lhbGx5LiAgQmFzaWNhbGx5IHRyZWF0IGl0IGxpa2Ugam1wIHNvCi0JICAgICB0aGF0IHdlIGF1dG9tYXRpY2FsbHkgaGFuZGxlIDgsIDE2IGFuZCAzMiBiaXQgb2Zmc2V0cwotCSAgICAgY29ycmVjdGx5IGFzIHdlbGwgYXMganVtcHMgdG8gYW4gdW5kZWZpbmVkIGFkZHJlc3MuCi0KLQkgICAgIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdCB0cmVhdCBpdCBsaWtlIG90aGVyIGJDQwotCSAgICAgaW5zdHJ1Y3Rpb25zIHNpbmNlIHRoZSBsb25nIGZvcm1zIG9mIGJyYSBpcyBkaWZmZXJlbnQKLQkgICAgIGZyb20gb3RoZXIgYkNDIGluc3RydWN0aW9ucy4gICovCi0JICBpZiAob3Bjb2RlLT5vcGNvZGUgPT0gMHhjYTAwKQotCSAgICB0eXBlID0gMTA7Ci0JICBlbHNlCi0JICAgIHR5cGUgPSAwOwotCX0KLSAgICAgIC8qIGNhbGwgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gNSkKLSAgICAgICAgdHlwZSA9IDY7Ci0gICAgICAvKiBjYWxscyAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KQotCXR5cGUgPSA4OwotICAgICAgLyogam1wICovCi0gICAgICBlbHNlIGlmIChzaXplID09IDMgJiYgb3Bjb2RlLT5vcGNvZGUgPT0gMHhjYzAwMDApCi0JdHlwZSA9IDEwOwotICAgICAgLyogYkNDICh1bmNvbW1vbiBjYXNlcykgKi8KLSAgICAgIGVsc2UKLQl0eXBlID0gMzsKLQotICAgICAgZiA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgOCAtIHNpemUsIHR5cGUsCi0JCSAgICBmaXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCwKLQkJICAgIGZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyLAotCQkgICAgKGNoYXIgKilmaXh1cHNbMF0ub3BpbmRleCk7Ci0gICAgICAKLSAgICAgIC8qIFRoaXMgaXMgcHJldHR5IGhva2V5LiAgV2UgYmFzaWNhbGx5IGp1c3QgY2FyZSBhYm91dCB0aGUKLQkgb3Bjb2RlLCBzbyB3ZSBoYXZlIHRvIHdyaXRlIG91dCB0aGUgZmlyc3Qgd29yZCBiaWcgZW5kaWFuLgotCi0JIFRoZSBleGNlcHRpb24gaXMgImNhbGwiLCB3aGljaCBoYXMgdHdvIG9wZXJhbmRzIHRoYXQgd2UKLQkgY2FyZSBhYm91dC4KLQotCSBUaGUgZmlyc3Qgb3BlcmFuZCAodGhlIHJlZ2lzdGVyIGxpc3QpIGhhcHBlbnMgdG8gYmUgaW4gdGhlCi0JIGZpcnN0IGluc3RydWN0aW9uIHdvcmQsIGFuZCB3aWxsIGJlIGluIHRoZSByaWdodCBwbGFjZSBpZgotCSB3ZSBvdXRwdXQgdGhlIGZpcnN0IHdvcmQgaW4gYmlnIGVuZGlhbiBtb2RlLgotCi0JIFRoZSBzZWNvbmQgb3BlcmFuZCAoc3RhY2sgc2l6ZSkgaXMgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLAotCSBhbmQgd2Ugd2FudCBpdCB0byBhcHBlYXIgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgZXh0ZW5zaW9uCi0JIHdvcmQgKGFzIGl0IGFwcGVhcnMgaW4gbWVtb3J5KS4gIEx1Y2tpbHksIHdyaXRpbmcgdGhlIGV4dGVuc2lvbgotCSB3b3JkIGluIGJpZyBlbmRpYW4gZm9ybWF0IHdpbGwgZG8gd2hhdCB3ZSB3YW50LiAgKi8KLSAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIHNpemUgPiA0ID8gNCA6IHNpemUpOwotICAgICAgaWYgKHNpemUgPiA4KQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24sIDQpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDgsIDAsIHNpemUgLSA4KTsKLQl9Ci0gICAgICBlbHNlIGlmIChzaXplID4gNCkKLQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNCwgZXh0ZW5zaW9uLCBzaXplIC0gNCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBmID0gZnJhZ19tb3JlIChzaXplKTsKLQotICAgICAgLyogRmlsbCBpbiBieXRlcyBmb3IgdGhlIGluc3RydWN0aW9uLiAgTm90ZSB0aGF0IG9wY29kZSBmaWVsZHMKLQkgYXJlIHdyaXR0ZW4gYmlnLWVuZGlhbiwgMTYgJiAzMmJpdCBpbW1lZGlhdGVzIGFyZSB3cml0dGVuCi0JIGxpdHRsZSBlbmRpYW4uICBFZ2FkLiAgKi8KLSAgICAgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzAKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMQotCSAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QwCi0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZGYwMDAwCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZGUwMDAwKQotCXsKLQkgIC8qIEEgZm9ybWF0IFMyIGluc3RydWN0aW9uIHRoYXQgaXMgX25vdF8gInJldCIgYW5kICJyZXRmIi4gICovCi0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAxLCBpbnNuICYgMHhmZmZmLCAyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIpCi0JewotCSAgLyogVGhpcyBtdXN0IGJlIGEgcmV0IG9yIHJldGYsIHdoaWNoIGlzIHdyaXR0ZW4gZW50aXJlbHkgaW4KLQkgICAgIGJpZy1lbmRpYW4gZm9ybWF0LiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIDMpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNAotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGRjMDAwMDAwKQotCXsKLQkgIC8qIFRoaXMgbXVzdCBiZSBhIGZvcm1hdCBTNCAiY2FsbCIgaW5zdHJ1Y3Rpb24uICBXaGF0IGEgcGFpbi4gICovCi0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoaW5zbiA+PiA4KSAmIDB4ZmZmZjsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDI0KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIHRlbXAsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDMsIGluc24gJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24gJiAweGZmLCAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQpCi0JewotCSAgLyogVGhpcyBtdXN0IGJlIGEgZm9ybWF0IFM0ICJqbXAiIGluc3RydWN0aW9uLiAgKi8KLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZmZmKSA8PCA4KSB8IChleHRlbnNpb24gJiAweGZmKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDI0KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIHRlbXAsIDQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNikKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmZmZikgPDwgOCkKLQkgICAgfCAoKGV4dGVuc2lvbiA+PiAxNikgJiAweGZmKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDI0KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIHRlbXAsIDQpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDUsIChleHRlbnNpb24gPj4gOCkgJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA2LCBleHRlbnNpb24gJiAweGZmLCAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYWY4MDAwMAotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGZhZjAwMDAwCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmFmNDAwMDApCi0JewotCSAgLyogQSBmb3JtYXQgRDIgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIDE2Yml0IGltbWVkaWF0ZSBpcwotCSAgICAgcmVhbGx5IGEgc2luZ2xlIDE2Yml0IHZhbHVlLCBub3QgdHdvIDhiaXQgdmFsdWVzLiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgaW5zbiAmIDB4ZmZmZiwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyKQotCXsKLQkgIC8qIEEgZm9ybWF0IEQyIGluc3RydWN0aW9uIHdoZXJlIHRoZSAxNmJpdCBpbW1lZGlhdGUKLQkgICAgIGlzIHJlYWxseSB0d28gOGJpdCBpbW1lZGlhdGVzLiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIDQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSB8IChleHRlbnNpb24gJiAweGZmZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCB0ZW1wLCA0KTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDUpCi0JewotCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikKLQkgICAgCQkJfCAoKGV4dGVuc2lvbiA+PiA4KSAmIDB4ZmZmZik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIHRlbXAsIDQpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDYsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLQotICAgICAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGZjOyBpKyspCi0JewotCSAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqb3BlcmFuZDsKLQotCSAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzW2ZpeHVwc1tpXS5vcGluZGV4XTsKLQkgIGlmIChmaXh1cHNbaV0ucmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQkgICAgewotCSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvOwotCSAgICAgIGludCBzaXplOwotCSAgICAgIGludCBvZmZzZXQ7Ci0JICAgICAgZml4UyAqZml4UDsKLQotCSAgICAgIHJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwc1tpXS5yZWxvYyk7Ci0KLQkgICAgICBpZiAoIXJlbG9jX2hvd3RvKQotCQlhYm9ydCgpOwotCSAgCi0JICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCi0JICAgICAgaWYgKHNpemUgPCAxIHx8IHNpemUgPiA0KQotCQlhYm9ydCgpOwotCi0JICAgICAgb2Zmc2V0ID0gNCAtIHNpemU7Ci0JICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LAotCQkJCSAgc2l6ZSwgJmZpeHVwc1tpXS5leHAsCi0JCQkJICByZWxvY19ob3d0by0+cGNfcmVsYXRpdmUsCi0JCQkJICBmaXh1cHNbaV0ucmVsb2MpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgcmVsb2MsIHBjcmVsLCByZWxvY19zaXplLCBvZmZzZXQ7Ci0JICAgICAgZml4UyAqZml4UDsKLQotCSAgICAgIHJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0JICAgICAgLyogSG93IGJpZyBpcyB0aGUgcmVsb2M/ICBSZW1lbWJlciBTUExJVCByZWxvY3MgYXJlCi0JCSBpbXBsaWNpdGx5IDMyYml0cy4gICovCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUExJVCkgIT0gMCkKLQkJcmVsb2Nfc2l6ZSA9IDMyOwotCSAgICAgIGVsc2UKLQkJcmVsb2Nfc2l6ZSA9IG9wZXJhbmQtPmJpdHM7Ci0KLQkgICAgICAvKiBJcyB0aGUgcmVsb2MgcGMtcmVsYXRpdmU/ICAqLwotCSAgICAgIHBjcmVsID0gKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BDUkVMKSAhPSAwOwotCi0JICAgICAgLyogR3Jvc3MuICBUaGlzIGRpc2d1c3RpbmcgaGFjayBpcyB0byBtYWtlIHN1cmUgd2UKLQkJIGdldCB0aGUgcmlnaHQgb2Zmc2V0IGZvciB0aGUgMTYvMzIgYml0IHJlbG9jIGluIAotCQkgImNhbGwiIGluc3RydWN0aW9ucy4gIEJhc2ljYWxseSB0aGV5J3JlIGEgcGFpbgotCQkgYmVjYXVzZSB0aGUgcmVsb2MgaXNuJ3QgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmICgoc2l6ZSA9PSA1IHx8IHNpemUgPT0gNykKLQkJICAmJiAoKChpbnNuID4+IDI0KSAmIDB4ZmYpID09IDB4Y2QKLQkJICAgICAgfHwgKChpbnNuID4+IDI0KSAmIDB4ZmYpID09IDB4ZGQpKQotCQlzaXplIC09IDI7Ci0KLQkgICAgICAvKiBTaW1pbGFybHkgZm9yIGNlcnRhaW4gYml0IGluc3RydWN0aW9ucyB3aGljaCBkb24ndAotCQkgaGF2IHRoZWlyIDMyYml0IHJlbG9jIGF0IHRoZSB0YWlsIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKHNpemUgPT0gNwotCQkgICYmICgoKGluc24gPj4gMTYpICYgMHhmZmZmKSA9PSAweGZlMDAKLQkJICAgICAgfHwgKChpbnNuID4+IDE2KSAmIDB4ZmZmZikgPT0gMHhmZTAxCi0JCSAgICAgIHx8ICgoaW5zbiA+PiAxNikgJiAweGZmZmYpID09IDB4ZmUwMikpCi0JCXNpemUgLT0gMTsKLQkKLQkgICAgICBvZmZzZXQgPSBzaXplIC0gcmVsb2Nfc2l6ZSAvIDg7Ci0KLQkgICAgICAvKiBDaG9vc2UgYSBwcm9wZXIgQkZEIHJlbG9jYXRpb24gdHlwZS4gICovCi0JICAgICAgaWYgKHBjcmVsKQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gMzIpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChyZWxvY19zaXplID09IDMyKQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMzI7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzE2OwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzg7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIC8qIENvbnZlcnQgdGhlIHNpemUgb2YgdGhlIHJlbG9jIGludG8gd2hhdCBmaXhfbmV3X2V4cCB3YW50cy4gICovCi0JICAgICAgcmVsb2Nfc2l6ZSA9IHJlbG9jX3NpemUgLyA4OwotCSAgICAgIGlmIChyZWxvY19zaXplID09IDgpCi0JCXJlbG9jX3NpemUgPSAwOwotCSAgICAgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCXJlbG9jX3NpemUgPSAxOwotCSAgICAgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMzIpCi0JCXJlbG9jX3NpemUgPSAyOwotCi0JICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LAotCQkJCSAgcmVsb2Nfc2l6ZSwgJmZpeHVwc1tpXS5leHAsIHBjcmVsLAotCQkJCSAgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIHJlbG9jKSk7Ci0KLQkgICAgICBpZiAocGNyZWwpCi0JCWZpeFAtPmZ4X29mZnNldCArPSBvZmZzZXQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICYmIGZpeHAtPmZ4X3N1YnN5KQotICAgIHsKLSAgICAKLSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkiRGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZiZmRfYWJzX3N5bWJvbDsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSAoU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KQotCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpICsgZml4cC0+Znhfb2Zmc2V0KTsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiggYXN5bWJvbCAqKSk7Ci0gICAgICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgfQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDApCi0gICAgcmV0dXJuIDI7Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHJldHVybiAzOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gNikKLSAgICB7Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoZnJhZ3AtPmZyX3N5bWJvbCkKLQkgIHx8IHNlZyAhPSBTX0dFVF9TRUdNRU5UIChmcmFncC0+ZnJfc3ltYm9sKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IDc7Ci0JICByZXR1cm4gNzsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDU7Ci0gICAgfQotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gOCkKLSAgICB7Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoZnJhZ3AtPmZyX3N5bWJvbCkKLQkgIHx8IHNlZyAhPSBTX0dFVF9TRUdNRU5UIChmcmFncC0+ZnJfc3ltYm9sKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IDk7Ci0JICByZXR1cm4gNjsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDQ7Ci0gICAgfQotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMTApCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSAxMjsKLQkgIHJldHVybiA1OwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gMjsKLSAgICB9Ci19IAotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSNpZiAwCi0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMICYmICEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSNlbmRpZgotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICB2YWx1ZVQgKnZhbHVlcDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIC8qIFdlIHNob3VsZG4ndCBldmVyIGdldCBoZXJlIGJlY2F1c2UgbGlua3JlbGF4IGlzIG5vbnplcm8uICAqLwotICBhYm9ydCAoKTsKLSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKGluc25wLCBleHRlbnNpb25wLCBvcGVyYW5kLCB2YWwsIGZpbGUsIGxpbmUsIHNoaWZ0KQotICAgICB1bnNpZ25lZCBsb25nICppbnNucDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZXh0ZW5zaW9ucDsKLSAgICAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICB1bnNpZ25lZCBpbnQgc2hpZnQ7Ci17Ci0gIC8qIE5vIG5lZWQgdG8gY2hlY2sgMzJiaXQgb3BlcmFuZHMgZm9yIGEgYml0LiAgTm90ZSB0aGF0Ci0gICAgIE1OMTAzMDBfT1BFUkFORF9TUExJVCBpcyBhbiBpbXBsaWNpdCAzMmJpdCBvcGVyYW5kLiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIKLSAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUExJVCkgPT0gMCkKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotICAgICAgaW50IGJpdHM7Ci0KLSAgICAgIGJpdHMgPSBvcGVyYW5kLT5iaXRzOwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBtYXggPSAoMSA8PCAoYml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heCA9ICgxIDw8IGJpdHMpIC0gMTsKLSAgICAgICAgICBtaW4gPSAwOwotICAgICAgICB9Ci0KLSAgICAgIHRlc3QgPSB2YWw7Ci0KLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgY29uc3QgY2hhciAqZXJyID0KLSAgICAgICAgICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLSAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAgICAgc3ByaW50X3ZhbHVlIChidWYsIHRlc3QpOwotICAgICAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0gICAgICAgICAgICBhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUExJVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqaW5zbnAgfD0gKHZhbCA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLSAgICAgICpleHRlbnNpb25wIHw9ICgodmFsICYgKCgxIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKSAtIDEpKQotCQkgICAgICA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpID09IDApCi0gICAgewotICAgICAgKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKLQkqaW5zbnAgfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JCSAgIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgb3BlcmFuZC0+Yml0cykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpleHRlbnNpb25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgICAgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCkpOwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEKSAhPSAwKQotCSpleHRlbnNpb25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkJPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQgKyBvcGVyYW5kLT5iaXRzKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotY2hlY2tfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gIE5vdGUgdGhhdAotICAgICBNTjEwMzAwX09QRVJBTkRfU1BMSVQgaXMgYW4gaW1wbGljaXQgMzJiaXQgb3BlcmFuZC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyCi0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLSAgICAgIGludCBiaXRzOwotCi0gICAgICBiaXRzID0gb3BlcmFuZC0+Yml0czsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgfQotCi0gICAgICB0ZXN0ID0gdmFsOwotCi0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQlyZXR1cm4gMDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2FyY2hfbWFjaCAobWFjaCkKLSAgICAgaW50IG1hY2g7Ci17Ci0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbW4xMDMwMCwgbWFjaCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgY3VycmVudF9tYWNoaW5lID0gbWFjaDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oIGIvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmY2IyMjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiB0Yy1tbjEwMzAwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLW1uMTAzMDAuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX01OMTAzMDAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBNTjEwMzAwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX21uMTAzMDAKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tbjEwMzAwIgotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycyBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCi0KLS8qIERvbid0IGJvdGhlciB0byBhZGp1c3QgcmVsb2NzLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKSAwCi0KLS8qIFdlIGRvIHJlbGF4aW5nIGluIHRoZSBhc3NlbWJsZXIgYXMgd2VsbCBhcyB0aGUgbGlua2VyLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW5zMzJrLmMgYi9nYXMvY29uZmlnL3RjLW5zMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjE0NjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1uczMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMzMCArMCwwIEBACi0vKiBuczMyay5jICAtLSBBc3NlbWJsZSBvbiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAzMmsgc2VyaWVzCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyojZGVmaW5lIFNIT1dfTlVNIDEqLy8qIHVuY29tbWVudCBmb3IgZGVidWdnaW5nICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9wY29kZS9uczMyay5oIgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBNYWNyb3MgKi8KLSNkZWZpbmUgSUlGX0VOVFJJRVMgMTMJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIGlpZiAqLwotI2RlZmluZSBQUklWQVRFX1NJWkUgMjU2CS8qIHNpemUgb2YgbXkgZ2FyYmFnZSBtZW1vcnkgKi8KLSNkZWZpbmUgTUFYX0FSR1MgNAotI2RlZmluZSBERUZBVUxUCS0xCQkvKiBhZGRyX21vZGUgcmV0dXJucyB0aGlzIHZhbHVlIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW4gY29uc3RhbnQgb3IgbGFiZWwgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb3VudGVyZWQgKi8KLQotI2RlZmluZSBJSUYocHRyLGExLGMxLGUxLGcxLGkxLGsxLG0xLG8xLHExLHMxLHUxKQlcCi0gICAgaWlmLmlpZlBbcHRyXS50eXBlPSBhMTsJCQkJXAotICAgIGlpZi5paWZQW3B0cl0uc2l6ZT0gYzE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLm9iamVjdD0gZTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLm9iamVjdF9hZGp1c3Q9IGcxOwkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnBjcmVsPSBpMTsJCQkJXAotICAgIGlpZi5paWZQW3B0cl0ucGNyZWxfYWRqdXN0PSBrMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5pbV9kaXNwPSBtMTsJCQkJXAotICAgIGlpZi5paWZQW3B0cl0ucmVsYXhfc3Vic3RhdGU9IG8xOwkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLmJpdF9maXhQPSBxMTsJCQkJXAotICAgIGlpZi5paWZQW3B0cl0uYWRkcl9tb2RlPSBzMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5ic3I9IHUxOwotCi0jaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCi0jZGVmaW5lIExJTkVfQ09NTUVOVF9DSEFSUyAifCIKLSNkZWZpbmUgQUJTT0xVVEVfUFJFRklYICdAJwotI2RlZmluZSBJTU1FRElBVEVfUFJFRklYICcjJwotI2VuZGlmCi0KLSNpZm5kZWYgTElORV9DT01NRU5UX0NIQVJTCi0jZGVmaW5lIExJTkVfQ09NTUVOVF9DSEFSUyAiIyIKLSNlbmRpZgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSBMSU5FX0NPTU1FTlRfQ0hBUlM7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLSNpZiAhZGVmaW5lZChBQlNPTFVURV9QUkVGSVgpICYmICFkZWZpbmVkKElNTUVESUFURV9QUkVGSVgpCi0jZGVmaW5lIEFCU09MVVRFX1BSRUZJWCAnQCcJLyogT25lIG9yIHRoZSBvdGhlciBNVVNUIGJlIGRlZmluZWQgKi8KLSNlbmRpZgotCi1zdHJ1Y3QgYWRkcl9tb2RlCi0gIHsKLSAgICBjaGFyIG1vZGU7CQkJLyogYWRkcmVzc2luZyBtb2RlIG9mIG9wZXJhbmQgKDAtMzEpICovCi0gICAgY2hhciBzY2FsZWRfbW9kZTsJCS8qIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQgbW9kZSAqLwotICAgIGNoYXIgc2NhbGVkX3JlZzsJCS8qIHJlZ2lzdGVyIHVzZWQgaW4gc2NhbGVkKzEgKDEtOCkgKi8KLSAgICBjaGFyIGZsb2F0X2ZsYWc7CQkvKiBzZXQgaWYgUjAuLlI3IHdhcyBGMC4uRjcgaWUgYQotCQkJCSAgIGZsb2F0aW5nLXBvaW50LXJlZ2lzdGVyICovCi0gICAgY2hhciBhbV9zaXplOwkJLyogZXN0aW1hdGVkIG1heCBzaXplIG9mIGdlbmVyYWwgYWRkci1tb2RlCi0JCQkJICAgcGFydHMgKi8KLSAgICBjaGFyIGltX2Rpc3A7CQkvKiBpZiBpbV9kaXNwPT0xIHdlIGhhdmUgYSBkaXNwbGFjZW1lbnQgKi8KLSAgICBjaGFyIHBjcmVsOwkJCS8qIDEgaWYgcGNyZWwsIHRoaXMgaXMgcmVhbGx5IHJlZHVuZGFudCBpbmZvICovCi0gICAgY2hhciBkaXNwX3N1ZmZpeFsyXTsJLyogbGVuZ3RoIG9mIGRpc3BsYWNlbWVudChzKSwgMD11bmRlZmluZWQgKi8KLSAgICBjaGFyICpkaXNwWzJdOwkJLyogcG9pbnRlcihzKSBhdCBkaXNwbGFjZW1lbnQocykKLQkJCQkgICBvciBpbW1lZGlhdGVzKHMpICAgICAoYXNjaWkpICovCi0gICAgY2hhciBpbmRleF9ieXRlOwkJLyogaW5kZXggYnl0ZSAqLwotICB9OwotdHlwZWRlZiBzdHJ1Y3QgYWRkcl9tb2RlIGFkZHJfbW9kZVM7Ci0KLQotY2hhciAqZnJlZXB0ciwgKmZyZWVwdHJfc3RhdGljOwkvKiBwb2ludHMgYXQgc29tZSBudW1iZXIgb2YgZnJlZSBieXRlcyAqLwotc3RydWN0IGhhc2hfY29udHJvbCAqaW5zdF9oYXNoX2hhbmRsZTsKLQotc3RydWN0IG5zMzJrX29wY29kZSAqZGVzYzsJLyogcG9pbnRlciBhdCBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbiAqLwotYWRkcl9tb2RlUyBhZGRyX21vZGVQOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZkIjsJLyogd2UgZG9uJ3Qgd2FudCB0byBzdXBwb3J0IGxvd2VyY2FzZSwgZG8gd2UgKi8KLQotLyogVVBQRVJDQVNFIGRlbm90ZXMgbGl2ZSBuYW1lcyB3aGVuIGFuIGluc3RydWN0aW9uIGlzIGJ1aWx0LCBJSUYgaXMKLSAqIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXRlIGZvcm0gdG8gc3RvcmUgdGhlIGFjdHVhbCBwYXJ0cyBvZiB0aGUKLSAqIGluc3RydWN0aW9uLiBBIG5zMzJrIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gY2FuIGJlIGRpdmlkZWQgaW50byBhCi0gKiBjb3VwbGUgb2Ygc3ViIFBBUlRzLiBXaGVuIGFuIGluc3RydWN0aW9uIGlzIGFzc2VtYmxlZCB0aGUKLSAqIGFwcHJvcHJpYXRlIFBBUlQgZ2V0IGFuIGFzc2lnbm1lbnQuIFdoZW4gYW4gSUlGIGhhcyBiZWVuIGNvbXBsZXRlZAotICogaXQgaXMgY29udmVydGVkIHRvIGEgRlJBR21lbnQgYXMgc3BlY2lmaWVkIGluIEFTLkggKi8KLQotLyogaW50ZXJuYWwgc3RydWN0cyAqLwotc3RydWN0IG5zMzJrX29wdGlvbgotICB7Ci0gICAgY2hhciAqcGF0dGVybjsKLSAgICB1bnNpZ25lZCBsb25nIG9yOwotICAgIHVuc2lnbmVkIGxvbmcgYW5kOwotICB9OwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgaW50IHR5cGU7CQkJLyogaG93IHRvIGludGVycHJldCBvYmplY3QgKi8KLSAgICBpbnQgc2l6ZTsJCQkvKiBFc3RpbWF0ZWQgbWF4IHNpemUgb2Ygb2JqZWN0ICovCi0gICAgdW5zaWduZWQgbG9uZyBvYmplY3Q7CS8qIGJpbmFyeSBkYXRhICovCi0gICAgaW50IG9iamVjdF9hZGp1c3Q7CQkvKiBudW1iZXIgYWRkZWQgdG8gb2JqZWN0ICovCi0gICAgaW50IHBjcmVsOwkJCS8qIFRydWUgaWYgb2JqZWN0IGlzIHBjcmVsICovCi0gICAgaW50IHBjcmVsX2FkanVzdDsJCS8qIGxlbmd0aCBpbiBieXRlcyBmcm9tIHRoZQotCQkJCQkgICBpbnN0cnVjdGlvbiBzdGFydCB0byB0aGUKLQkJCQkJICAgZGlzcGxhY2VtZW50ICovCi0gICAgaW50IGltX2Rpc3A7CQkvKiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYSBkaXNwbGFjZW1lbnQgKi8KLSAgICByZWxheF9zdWJzdGF0ZVQgcmVsYXhfc3Vic3RhdGU7CS8qIEluaXRpYWwgcmVsYXhzdWJzdGF0ZSAqLwotICAgIGJpdF9maXhTICpiaXRfZml4UDsJCS8qIFBvaW50ZXIgYXQgYml0X2ZpeCBzdHJ1Y3QgKi8KLSAgICBpbnQgYWRkcl9tb2RlOwkJLyogV2hhdCBhZGRybW9kZSBkbyB3ZSBhc3NvY2lhdGUgd2l0aCB0aGlzCi0JCQkJICAgaWlmLWVudHJ5ICovCi0gICAgY2hhciBic3I7CQkJLyogU2VxdWVudCBoYWNrICovCi0gIH0gaWlmX2VudHJ5VDsJCQkvKiBJbnRlcm5hbCBJbnN0cnVjdGlvbiBGb3JtYXQgKi8KLQotc3RydWN0IGludF9pbnNfZm9ybQotICB7Ci0gICAgaW50IGluc3RyX3NpemU7CQkvKiBNYXggc2l6ZSBvZiBpbnN0cnVjdGlvbiBpbiBieXRlcy4gKi8KLSAgICBpaWZfZW50cnlUIGlpZlBbSUlGX0VOVFJJRVMgKyAxXTsKLSAgfTsKLXN0cnVjdCBpbnRfaW5zX2Zvcm0gaWlmOwotZXhwcmVzc2lvblMgZXhwclA7Ci1jaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0vKiBkZXNjcmlwdGlvbiBvZiB0aGUgUEFSVHMgaW4gSUlGCi0gKm9iamVjdFtuXToKLSAqIDAJdG90YWwgbGVuZ3RoIGluIGJ5dGVzIG9mIGVudHJpZXMgaW4gaWlmCi0gKiAxCW9wY29kZQotICogMglpbmRleF9ieXRlX2EKLSAqIDMJaW5kZXhfYnl0ZV9iCi0gKiA0CWRpc3BfYV8xCi0gKiA1CWRpc3BfYV8yCi0gKiA2CWRpc3BfYl8xCi0gKiA3CWRpc3BfYl8yCi0gKiA4CWltbV9hCi0gKiA5CWltbV9iCi0gKiAxMAlpbXBsaWVkMQotICogMTEJaW1wbGllZDIKLSAqCi0gKiBGb3IgZXZlcnkgZW50cnkgdGhlcmUgaXMgYSBkYXRhbGVuZ3RoIGluIGJ5dGVzLiBUaGlzIGlzIHN0b3JlZCBpbiBzaXplW25dLgotICoJIDAsCXRoZSBvYmplY3RsZW5ndGggaXMgbm90IGV4cGxpY2l0bHkgZ2l2ZW4gYnkgdGhlIGluc3RydWN0aW9uCi0gKgkJYW5kIHRoZSBvcGVyYW5kIGlzIHVuZGVmaW5lZC4gVGhpcyBpcyBhIGNhc2UgZm9yIHJlbGF4YXRpb24uCi0gKgkJUmVzZXJ2ZSA0IGJ5dGVzIGZvciB0aGUgZmluYWwgb2JqZWN0LgotICoKLSAqCSAxLAl0aGUgZW50cnkgY29udGFpbnMgb25lIGJ5dGUKLSAqCSAyLAl0aGUgZW50cnkgY29udGFpbnMgdHdvIGJ5dGVzCi0gKgkgMywJdGhlIGVudHJ5IGNvbnRhaW5zIHRocmVlIGJ5dGVzCi0gKgkgNCwJdGhlIGVudHJ5IGNvbnRhaW5zIGZvdXIgYnl0ZXMKLSAqCWV0YwotICoKLSAqIEZ1cnRoZXJtb3JlLCBldmVyeSBlbnRyeSBoYXMgYSBkYXRhIHR5cGUgaWRlbnRpZmllciBpbiB0eXBlW25dLgotICoKLSAqIAkgMCwJdGhlIGVudHJ5IGlzIHZvaWQsIGlnbm9yZSBpdC4KLSAqIAkgMSwJdGhlIGVudHJ5IGlzIGEgYmluYXJ5IG51bWJlci4KLSAqCSAyLAl0aGUgZW50cnkgaXMgYSBwb2ludGVyIGF0IGFuIGV4cHJlc3Npb24uCi0gKgkJV2hlcmUgZXhwcmVzc2lvbiBtYXkgYmUgYXMgc2ltcGxlIGFzIGEgc2luZ2xlICcxJywKLSAqCQlhbmQgYXMgY29tcGxpY2F0ZWQgYXMgIGZvby1iYXIrMTIsCi0gKiAJCWZvbyBhbmQgYmFyIG1heSBiZSB1bmRlZmluZWQgYnV0IHN1ZmZpeGVkIGJ5IDp7Ynx3fGR9IHRvCi0gKgkJY29udHJvbCB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QuCi0gKgotICoJIDMsCXRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgYXQgYSBiaWdudW0gc3RydWN0Ci0gKgotICoKLSAqIFRoZSBsb3ctb3JkZXItYnl0ZSBjb3Jlc3BvbmRzIHRvIGxvdyBwaHlzaWNhbCBtZW1vcnkuCi0gKiBPYnZpb3VzbHkgYSBGUkFHbWVudCBtdXN0IGJlIGNyZWF0ZWQgZm9yIGVhY2ggdmFsaWQgZGlzcCBpbiBQQVJUIHdob3NlCi0gKiBkYXRhbGVuZ3RoIGlzIHVuZGVmaW5lZCAodG8gYmFkKSAuCi0gKiBUaGUgY2FzZSB3aGVyZSBqdXN0IHRoZSBleHByZXNzaW9uIGlzIHVuZGVmaW5lZCBpcyBsZXNzIHNldmVyZSBhbmQgaXMKLSAqIGhhbmRsZWQgYnkgZml4LiBIZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG9iamVjdGZpbGUgaXMga25vd24uCi0gKiBXaXRoIHRoaXMgcmVwcmVzZW50YXRpb24gd2Ugc2ltcGxpZnkgdGhlIGFzc2VtYmx5IGFuZCBzZXBhcmF0ZXMgdGhlCi0gKiBtYWNoaW5lIGRlcGVuZGVudC9pbmRlcGVuZGVudCBwYXJ0cyBpbiBhIG1vcmUgY2xlYW4gd2F5IChzYWlkIE9FKQotICovCi0MCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDFbXSA9CQkvKiByZXN0b3JlLCBleGl0ICovCi17Ci0gIHsicjAiLCAweDgwLCAweGZmfSwKLSAgeyJyMSIsIDB4NDAsIDB4ZmZ9LAotICB7InIyIiwgMHgyMCwgMHhmZn0sCi0gIHsicjMiLCAweDEwLCAweGZmfSwKLSAgeyJyNCIsIDB4MDgsIDB4ZmZ9LAotICB7InI1IiwgMHgwNCwgMHhmZn0sCi0gIHsicjYiLCAweDAyLCAweGZmfSwKLSAgeyJyNyIsIDB4MDEsIDB4ZmZ9LAotICB7MCwgMHgwMCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDJbXSA9CQkvKiBzYXZlLCBlbnRlciAqLwotewotICB7InIwIiwgMHgwMSwgMHhmZn0sCi0gIHsicjEiLCAweDAyLCAweGZmfSwKLSAgeyJyMiIsIDB4MDQsIDB4ZmZ9LAotICB7InIzIiwgMHgwOCwgMHhmZn0sCi0gIHsicjQiLCAweDEwLCAweGZmfSwKLSAgeyJyNSIsIDB4MjAsIDB4ZmZ9LAotICB7InI2IiwgMHg0MCwgMHhmZn0sCi0gIHsicjciLCAweDgwLCAweGZmfSwKLSAgezAsIDB4MDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQzW10gPQkJLyogc2V0Y2ZnICovCi17Ci0gIHsiYyIsIDB4OCwgMHhmZn0sCi0gIHsibSIsIDB4NCwgMHhmZn0sCi0gIHsiZiIsIDB4MiwgMHhmZn0sCi0gIHsiaSIsIDB4MSwgMHhmZn0sCi0gIHswLCAweDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQ0W10gPQkJLyogY2ludiAqLwotewotICB7ImEiLCAweDQsIDB4ZmZ9LAotICB7ImkiLCAweDIsIDB4ZmZ9LAotICB7ImQiLCAweDEsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NVtdID0JCS8qIHN0cmluZyBpbnN0ICovCi17Ci0gIHsiYiIsIDB4MiwgMHhmZn0sCi0gIHsidSIsIDB4YywgMHhmZn0sCi0gIHsidyIsIDB4NCwgMHhmZn0sCi0gIHswLCAweDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQ2W10gPQkJLyogcGxhaW4gcmVnIGV4dCxjdnRwIGV0YyAqLwotewotICB7InIwIiwgMHgwMCwgMHhmZn0sCi0gIHsicjEiLCAweDAxLCAweGZmfSwKLSAgeyJyMiIsIDB4MDIsIDB4ZmZ9LAotICB7InIzIiwgMHgwMywgMHhmZn0sCi0gIHsicjQiLCAweDA0LCAweGZmfSwKLSAgeyJyNSIsIDB4MDUsIDB4ZmZ9LAotICB7InI2IiwgMHgwNiwgMHhmZn0sCi0gIHsicjciLCAweDA3LCAweGZmfSwKLSAgezAsIDB4MDAsIDB4ZmZ9Ci19OwotCi0jaWYgIWRlZmluZWQoTlMzMjAzMikgJiYgIWRlZmluZWQoTlMzMjUzMikKLSNkZWZpbmUgTlMzMjUzMgotI2VuZGlmCi0KLXN0cnVjdCBuczMya19vcHRpb24gY3B1cmVnXzUzMltdID0JLyogbHByIHNwciAqLwotewotICB7InVzIiwgMHgwLCAweGZmfSwKLSAgeyJkY3IiLCAweDEsIDB4ZmZ9LAotICB7ImJwYyIsIDB4MiwgMHhmZn0sCi0gIHsiZHNyIiwgMHgzLCAweGZmfSwKLSAgeyJjYXIiLCAweDQsIDB4ZmZ9LAotICB7ImZwIiwgMHg4LCAweGZmfSwKLSAgeyJzcCIsIDB4OSwgMHhmZn0sCi0gIHsic2IiLCAweGEsIDB4ZmZ9LAotICB7InVzcCIsIDB4YiwgMHhmZn0sCi0gIHsiY2ZnIiwgMHhjLCAweGZmfSwKLSAgeyJwc3IiLCAweGQsIDB4ZmZ9LAotICB7ImludGJhc2UiLCAweGUsIDB4ZmZ9LAotICB7Im1vZCIsIDB4ZiwgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gbW11cmVnXzUzMltdID0JLyogbG1yIHNtciAqLwotewotICB7Im1jciIsIDB4OSwgMHhmZn0sCi0gIHsibXNyIiwgMHhhLCAweGZmfSwKLSAgeyJ0ZWFyIiwgMHhiLCAweGZmfSwKLSAgeyJwdGIwIiwgMHhjLCAweGZmfSwKLSAgeyJwdGIxIiwgMHhkLCAweGZmfSwKLSAgeyJpdmFyMCIsIDB4ZSwgMHhmZn0sCi0gIHsiaXZhcjEiLCAweGYsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLQotc3RydWN0IG5zMzJrX29wdGlvbiBjcHVyZWdfMDMyW10gPQkvKiBscHIgc3ByICovCi17Ci0gIHsidXBzciIsIDB4MCwgMHhmZn0sCi0gIHsiZnAiLCAweDgsIDB4ZmZ9LAotICB7InNwIiwgMHg5LCAweGZmfSwKLSAgeyJzYiIsIDB4YSwgMHhmZn0sCi0gIHsicHNyIiwgMHhkLCAweGZmfSwKLSAgeyJpbnRiYXNlIiwgMHhlLCAweGZmfSwKLSAgeyJtb2QiLCAweGYsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gbW11cmVnXzAzMltdID0JLyogbG1yIHNtciAqLwotewotICB7ImJwcjAiLCAweDAsIDB4ZmZ9LAotICB7ImJwcjEiLCAweDEsIDB4ZmZ9LAotICB7InBmMCIsIDB4NCwgMHhmZn0sCi0gIHsicGYxIiwgMHg1LCAweGZmfSwKLSAgeyJzYyIsIDB4OCwgMHhmZn0sCi0gIHsibXNyIiwgMHhhLCAweGZmfSwKLSAgeyJiY250IiwgMHhiLCAweGZmfSwKLSAgeyJwdGIwIiwgMHhjLCAweGZmfSwKLSAgeyJwdGIxIiwgMHhkLCAweGZmfSwKLSAgeyJlaWEiLCAweGYsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLQotI2lmIGRlZmluZWQoTlMzMjUzMikKLXN0cnVjdCBuczMya19vcHRpb24gKmNwdXJlZyA9IGNwdXJlZ181MzI7Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uICptbXVyZWcgPSBtbXVyZWdfNTMyOwotI2Vsc2UKLXN0cnVjdCBuczMya19vcHRpb24gKmNwdXJlZyA9IGNwdXJlZ18wMzI7Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uICptbXVyZWcgPSBtbXVyZWdfMDMyOwotI2VuZGlmCi0MCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17CQkJCQkvKiBzbyBmYXIgZW1wdHkgKi8KLSAgezAsIDAsIDB9Ci19OwotCi0jZGVmaW5lIElORCh4LHkpCSgoKHgpPDwyKSsoeSkpCi0KLS8qIHRob3NlIGFyZSBpbmRleCdzIHRvIHJlbGF4IGdyb3VwcyBpbiBtZF9yZWxheF90YWJsZSBpZSBpdCBtdXN0IGJlCi0gICBtdWx0aXBsaWVkIGJ5IDQgdG8gcG9pbnQgYXQgYSBncm91cCBzdGFydC4gVml6IElORCh4LHkpIFNlIGZ1bmN0aW9uCi0gICByZWxheF9zZWdtZW50IGluIHdyaXRlLmMgZm9yIG1vcmUgaW5mbyAqLwotCi0jZGVmaW5lIEJSQU5DSAkJMQotI2RlZmluZSBQQ1JFTAkJMgotCi0vKiB0aG9zZSBhcmUgaW5kZXgncyB0byBlbnRyaWVzIGluIGEgcmVsYXggZ3JvdXAgKi8KLQotI2RlZmluZSBCWVRFCQkwCi0jZGVmaW5lIFdPUkQJCTEKLSNkZWZpbmUgRE9VQkxFCQkyCi0jZGVmaW5lIFVOREVGICAgICAgICAgICAzCi0vKiBUaG9zZSBsaW1pdHMgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZGlzcGxhY2VtZW50IHN0YXJ0IGluIG1lbW9yeS4KLSAgIFRoZSBuczMyayB1c2VzIHRoZSBiZWdpbmluZyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXMgZGlzcGxhY2VtZW50Ci0gICBiYXNlLiAgVGhpcyB0eXBlIG9mIGRpc3BsYWNlbWVudHMgY291bGQgYmUgaGFuZGxlZCBoZXJlIGJ5IG1vdmluZwotICAgdGhlIGxpbWl0IHdpbmRvdyB1cCBvciBkb3duLiBJIGNob29zZSB0byB1c2UgYW4gaW50ZXJuYWwKLSAgIGRpc3BsYWNlbWVudCBiYXNlLWFkanVzdCBhcyB0aGVyZSBhcmUgb3RoZXIgcm91dGluZXMgdGhhdCBtdXN0Ci0gICBjb25zaWRlciB0aGlzLiBBbHNvLCBhcyB3ZSBoYXZlIHR3byB2YXJpb3VzIG9mZnNldC1hZGp1c3RzIGluIHRoZQotICAgbnMzMmsgKGFjYiB2ZXJzdXMgYnIvYnJzL2pzci9iY29uZCksIHR3byBzZXQgb2YgbGltaXRzIHdvdWxkIGhhdmUKLSAgIGhhZCB0byBiZSB1c2VkLiAgTm93IHdlIGRvbnQgaGF2ZSB0byB0aGluayBhYm91dCB0aGF0LiAqLwotCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgeyg2MyksICgtNjQpLCAxLCBJTkQgKEJSQU5DSCwgV09SRCl9LAotICB7KDgxOTIpLCAoLTgxOTIpLCAyLCBJTkQgKEJSQU5DSCwgRE9VQkxFKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9Ci19OwotCi0vKiBBcnJheSB1c2VkIHRvIHRlc3QgaWYgbW9kZSBjb250YWlucyBkaXNwbGFjZW1lbnRzLgotICAgVmFsdWUgaXMgdHJ1ZSBpZiBtb2RlIGNvbnRhaW5zIGRpc3BsYWNlbWVudC4gKi8KLQotY2hhciBkaXNwX3Rlc3RbXSA9Ci17MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDAsCi0gMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07Ci0KLS8qIEFycmF5IHVzZWQgdG8gY2FsY3VsYXRlIG1heCBzaXplIG9mIGRpc3BsYWNlbWVudHMgKi8KLQotY2hhciBkaXNwX3NpemVbXSA9Ci17NCwgMSwgMiwgMCwgNH07Ci0MCi1zdGF0aWMgdm9pZCBldmFsdWF0ZV9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICogcmVzdWx0UCwgY2hhciAqcHRyKSk7Ci1zdGF0aWMgdm9pZCBtZF9udW1iZXJfdG9fZGlzcCBQQVJBTVMgKChjaGFyICpidWYsIGxvbmcgdmFsLCBpbnQgbikpOwotc3RhdGljIHZvaWQgbWRfbnVtYmVyX3RvX2ltbSBQQVJBTVMgKChjaGFyICpidWYsIGxvbmcgdmFsLCBpbnQgbikpOwotCi0vKiBQYXJzZXMgYSBnZW5lcmFsIG9wZXJhbmQgaW50byBhbiBhZGRyZXNzaW5nbW9kZSBzdHJ1Y3QKLQotICAgaW46ICBwb2ludGVyIGF0IG9wZXJhbmQgaW4gYXNjaWkgZm9ybQotICAgcG9pbnRlciBhdCBhZGRyX21vZGUgc3RydWN0IGZvciByZXN1bHQKLSAgIHRoZSBsZXZlbCBvZiByZWN1cnNpb24uIChhbHdheXMgMCBvciAxKQotCi0gICBvdXQ6IGRhdGEgaW4gYWRkcl9tb2RlIHN0cnVjdAotICAgKi8KLWludAotYWRkcl9tb2RlIChvcGVyYW5kLCBhZGRyX21vZGVQLCByZWN1cnNpdmVfbGV2ZWwpCi0gICAgIGNoYXIgKm9wZXJhbmQ7Ci0gICAgIHJlZ2lzdGVyIGFkZHJfbW9kZVMgKmFkZHJfbW9kZVA7Ci0gICAgIGludCByZWN1cnNpdmVfbGV2ZWw7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnN0cjsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIHJlZ2lzdGVyIGludCBzdHJsOwotICByZWdpc3RlciBpbnQgbW9kZTsKLSAgaW50IGo7Ci0gIG1vZGUgPSBERUZBVUxUOwkJLyogZGVmYXVsdCAqLwotICBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9IDA7CS8qIHdoeSBub3QgKi8KLSAgYWRkcl9tb2RlUC0+c2NhbGVkX3JlZyA9IDA7CS8qIGlmIDAsIG5vdCBzY2FsZWQgaW5kZXggKi8KLSAgYWRkcl9tb2RlUC0+ZmxvYXRfZmxhZyA9IDA7Ci0gIGFkZHJfbW9kZVAtPmFtX3NpemUgPSAwOwotICBhZGRyX21vZGVQLT5pbV9kaXNwID0gMDsKLSAgYWRkcl9tb2RlUC0+cGNyZWwgPSAwOwkvKiBub3Qgc2V0IGluIHRoaXMgZnVuY3Rpb24gKi8KLSAgYWRkcl9tb2RlUC0+ZGlzcF9zdWZmaXhbMF0gPSAwOwotICBhZGRyX21vZGVQLT5kaXNwX3N1ZmZpeFsxXSA9IDA7Ci0gIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBOVUxMOwotICBhZGRyX21vZGVQLT5kaXNwWzFdID0gTlVMTDsKLSAgc3RyID0gb3BlcmFuZDsKLSAgaWYgKHN0clswXSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQkJCQkvKiB3ZSBkb24ndCB3YW50IHRoaXMgKi8KLSAgc3RybCA9IHN0cmxlbiAoc3RyKTsKLSAgc3dpdGNoIChzdHJbMF0pCi0gICAgewotICAgICAgLyogdGhlIGZvbGxvd2luZyB0aHJlZSBjYXNlIHN0YXRlbWVudHMgY29udHJvbHMgdGhlIG1vZGUtY2hhcnMKLQkgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZWQgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZW0gKi8KLSNpZmRlZiBBQlNPTFVURV9QUkVGSVgKLSAgICBjYXNlIEFCU09MVVRFX1BSRUZJWDoKLSAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICddJykKLQlicmVhazsKLSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSAyMTsJLyogYWJzb2x1dGUgKi8KLSAgICAgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHIgKyAxOwotICAgICAgcmV0dXJuICgtMSk7Ci0jZW5kaWYKLSNpZmRlZiBJTU1FRElBVEVfUFJFRklYCi0gICAgY2FzZSBJTU1FRElBVEVfUFJFRklYOgotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gPT0gJ10nKQotCWJyZWFrOwotICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IDIwOwkvKiBpbW1lZGlhdGUgKi8KLSAgICAgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHIgKyAxOwotICAgICAgcmV0dXJuICgtMSk7Ci0jZW5kaWYKLSAgICBjYXNlICcuJzoKLSAgICAgIGlmIChzdHJbc3RybCAtIDFdICE9ICddJykKLQl7Ci0JICBzd2l0Y2ggKHN0clsxXSkKLQkgICAgewotCSAgICBjYXNlICctJzoKLQkgICAgY2FzZSAnKyc6Ci0JICAgICAgaWYgKHN0clsyXSAhPSAnXDAwMCcpCi0JCXsKLQkJICBhZGRyX21vZGVQLT5tb2RlID0gMjc7CS8qIHBjLXJlbGF0aXYgKi8KLQkJICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgMjsKLQkJICByZXR1cm4gKC0xKTsKLQkJfQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgc3ludGF4IGluIFBDLXJlbGF0aXZlIGFkZHJlc3NpbmcgbW9kZSIpKTsKLQkgICAgICByZXR1cm4gKDApOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSAhPSAnXScpCi0JewotCSAgaWYgKCghc3RybmNtcCAoc3RyLCAiZXh0KCIsIDQpKSAmJiBzdHJsID4gNykKLQkgICAgewkJCQkvKiBleHRlcm5hbCAqLwotCSAgICAgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHIgKyA0OwotCSAgICAgIGkgPSAwOwotCSAgICAgIGogPSAyOwotCSAgICAgIGRvCi0JCXsJCQkvKiBkaXNwWzBdJ3MgdGVybWluYXRpb24gcG9pbnQgKi8KLQkJICBqICs9IDE7Ci0JCSAgaWYgKHN0cltqXSA9PSAnKCcpCi0JCSAgICBpKys7Ci0JCSAgaWYgKHN0cltqXSA9PSAnKScpCi0JCSAgICBpLS07Ci0JCX0KLQkgICAgICB3aGlsZSAoaiA8IHN0cmwgJiYgaSAhPSAwKTsKLQkgICAgICBpZiAoaSAhPSAwIHx8ICEoc3RyW2ogKyAxXSA9PSAnLScgfHwgc3RyW2ogKyAxXSA9PSAnKycpKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW52YWxpZCBzeW50YXggaW4gRXh0ZXJuYWwgYWRkcmVzc2luZyBtb2RlIikpOwotCQkgIHJldHVybiAoMCk7Ci0JCX0KLQkgICAgICBzdHJbal0gPSAnXDAwMCc7CQkvKiBudWxsIHRlcm1pbmF0ZSBkaXNwWzBdICovCi0JICAgICAgYWRkcl9tb2RlUC0+ZGlzcFsxXSA9IHN0ciArIGogKyAyOwotCSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSAyMjsKLQkgICAgICByZXR1cm4gKC0xKTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6OwotICAgIH0KLSAgc3RybCA9IHN0cmxlbiAoc3RyKTsKLSAgc3dpdGNoIChzdHJsKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICBzd2l0Y2ggKHN0clswXSkKLQl7Ci0JY2FzZSAnZic6Ci0JICBhZGRyX21vZGVQLT5mbG9hdF9mbGFnID0gMTsKLQljYXNlICdyJzoKLQkgIGlmIChzdHJbMV0gPj0gJzAnICYmIHN0clsxXSA8ICc4JykKLQkgICAgewotCSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSBzdHJbMV0gLSAnMCc7Ci0JICAgICAgcmV0dXJuICgtMSk7Ci0JICAgIH0KLQl9Ci0gICAgY2FzZSAzOgotICAgICAgaWYgKCFzdHJuY21wIChzdHIsICJ0b3MiLCAzKSkKLQl7Ci0JICBhZGRyX21vZGVQLT5tb2RlID0gMjM7CS8qIFRvcE9mU3RhY2sgKi8KLQkgIHJldHVybiAoLTEpOwotCX0KLSAgICBkZWZhdWx0OjsKLSAgICB9Ci0gIGlmIChzdHJsID4gNCkKLSAgICB7Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSA9PSAnKScpCi0JewotCSAgaWYgKHN0cltzdHJsIC0gMl0gPT0gJyknKQotCSAgICB7Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA1XSwgIihmcCIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDE2OwkJLyogTWVtb3J5IFJlbGF0aXZlICovCi0JCX0KLQkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDVdLCAiKHNwIiwgMykpCi0JCXsKLQkJICBtb2RlID0gMTc7Ci0JCX0KLQkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDVdLCAiKHNiIiwgMykpCi0JCXsKLQkJICBtb2RlID0gMTg7Ci0JCX0KLQkgICAgICBpZiAobW9kZSAhPSBERUZBVUxUKQotCQl7CQkJLyogbWVtb3J5IHJlbGF0aXZlICovCi0JCSAgYWRkcl9tb2RlUC0+bW9kZSA9IG1vZGU7Ci0JCSAgaiA9IHN0cmwgLSA1OwkJLyogdGVtcCBmb3IgZW5kIG9mIGRpc3BbMF0gKi8KLQkJICBpID0gMDsKLQkJICBkbwotCQkgICAgewotCQkgICAgICBzdHJsIC09IDE7Ci0JCSAgICAgIGlmIChzdHJbc3RybF0gPT0gJyknKQotCQkJaSsrOwotCQkgICAgICBpZiAoc3RyW3N0cmxdID09ICcoJykKLQkJCWktLTsKLQkJICAgIH0KLQkJICB3aGlsZSAoc3RybCA+IC0xICYmIGkgIT0gMCk7Ci0JCSAgaWYgKGkgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBzeW50YXggaW4gTWVtb3J5IFJlbGF0aXZlIGFkZHJlc3NpbmcgbW9kZSIpKTsKLQkJICAgICAgcmV0dXJuICgwKTsKLQkJICAgIH0KLQkJICBhZGRyX21vZGVQLT5kaXNwWzFdID0gc3RyOwotCQkgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHIgKyBzdHJsICsgMTsKLQkJICBzdHJbal0gPSAnXDAwMCc7CS8qIG51bGwgdGVybWluYXRlIGRpc3BbMF0gKi8KLQkJICBzdHJbc3RybF0gPSAnXDAwMCc7CS8qIG51bGwgdGVybWluYXRlIGRpc3BbMV0gKi8KLQkJICByZXR1cm4gKC0xKTsKLQkJfQotCSAgICB9Ci0JICBzd2l0Y2ggKHN0cltzdHJsIC0gM10pCi0JICAgIHsKLQkgICAgY2FzZSAncic6Ci0JICAgIGNhc2UgJ1InOgotCSAgICAgIGlmIChzdHJbc3RybCAtIDJdID49ICcwJwotCQkgICYmIHN0cltzdHJsIC0gMl0gPCAnOCcKLQkJICAmJiBzdHJbc3RybCAtIDRdID09ICcoJykKLQkJewotCQkgIGFkZHJfbW9kZVAtPm1vZGUgPSBzdHJbc3RybCAtIDJdIC0gJzAnICsgODsKLQkJICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyOwotCQkgIHN0cltzdHJsIC0gNF0gPSAwOwotCQkgIHJldHVybiAoLTEpOwkJLyogcmVnIHJlbCAqLwotCQl9Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA0XSwgIihmcCIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDI0OwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA0XSwgIihzcCIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDI1OwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA0XSwgIihzYiIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDI2OwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA0XSwgIihwYyIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDI3OwotCQl9Ci0JICAgICAgaWYgKG1vZGUgIT0gREVGQVVMVCkKLQkJewotCQkgIGFkZHJfbW9kZVAtPm1vZGUgPSBtb2RlOwotCQkgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHI7Ci0JCSAgc3RyW3N0cmwgLSA0XSA9ICdcMCc7Ci0JCSAgcmV0dXJuICgtMSk7CQkvKiBtZW1vcnkgc3BhY2UgKi8KLQkJfQotCSAgICB9Ci0JfQotICAgICAgLyogbm8gdHJhaWxpbmcgJyknIGRvIHdlIGhhdmUgYSAnXScgPyAqLwotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gPT0gJ10nKQotCXsKLQkgIHN3aXRjaCAoc3RyW3N0cmwgLSAyXSkKLQkgICAgewotCSAgICBjYXNlICdiJzoKLQkgICAgICBtb2RlID0gMjg7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3cnOgotCSAgICAgIG1vZGUgPSAyOTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgbW9kZSA9IDMwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdxJzoKLQkgICAgICBtb2RlID0gMzE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6OwotCSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIChiLHcsZCxxKSIpKTsKLQkgICAgICBpZiAoc3RyW3N0cmwgLSAzXSAhPSAnOicgfHwgc3RyW3N0cmwgLSA2XSAhPSAnWycKLQkJICB8fCBzdHJbc3RybCAtIDVdID09ICdyJyB8fCBzdHJbc3RybCAtIDRdIDwgJzAnCi0JCSAgfHwgc3RyW3N0cmwgLSA0XSA+ICc3JykKLQkJewotCQkgIGFzX3dhcm4gKF8oIlN5bnRheCBpbiBzY2FsZWQtaW5kZXhlZCBtb2RlLCB1c2UgW1JuOm1dIHdoZXJlIG49WzAuLjddIG09e2IsdyxkLHF9IikpOwotCQl9Ci0JICAgIH0gLyogc2NhbGVkIGluZGV4ICovCi0JICB7Ci0JICAgIGlmIChyZWN1cnNpdmVfbGV2ZWwgPiAwKQotCSAgICAgIHsKLQkJYXNfd2FybiAoXygiU2NhbGVkLWluZGV4ZWQgYWRkcmVzc2luZyBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkLWluZGV4IikpOwotCQlyZXR1cm4gKDApOwotCSAgICAgIH0KLQkgICAgYWRkcl9tb2RlUC0+YW1fc2l6ZSArPSAxOwkvKiBzY2FsZWQgaW5kZXggYnl0ZSAqLwotCSAgICBqID0gc3RyW3N0cmwgLSA0XSAtICcwJzsJLyogc3RvcmUgdGVtcG9yYXJ5ICovCi0JICAgIHN0cltzdHJsIC0gNl0gPSAnXDAwMCc7CS8qIG51bGx0ZXJtaW5hdGUgZm9yIHJlY3Vyc2l2ZSBjYWxsICovCi0JICAgIGkgPSBhZGRyX21vZGUgKHN0ciwgYWRkcl9tb2RlUCwgMSk7Ci0JICAgIGlmICghaSB8fCBhZGRyX21vZGVQLT5tb2RlID09IDIwKQotCSAgICAgIHsKLQkJYXNfd2FybiAoXygiSW52YWxpZCBvciBpbGxlZ2FsIGFkZHJlc3NpbmcgbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZC1pbmRleCIpKTsKLQkJcmV0dXJuICgwKTsKLQkgICAgICB9Ci0JICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID0gYWRkcl9tb2RlUC0+bW9kZTsJLyogc3RvcmUgdGhlIGluZmVyaW9yCi0JCQkJCQkJICAgbW9kZSAqLwotCSAgICBhZGRyX21vZGVQLT5tb2RlID0gbW9kZTsKLQkgICAgYWRkcl9tb2RlUC0+c2NhbGVkX3JlZyA9IGogKyAxOwotCSAgICByZXR1cm4gKC0xKTsKLQkgIH0KLQl9Ci0gICAgfQotICBhZGRyX21vZGVQLT5tb2RlID0gREVGQVVMVDsJLyogZGVmYXVsdCB0byB3aGF0ZXZlciAqLwotICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyOwotICByZXR1cm4gKC0xKTsKLX0KLQwKLS8qIHB0ciBwb2ludHMgYXQgc3RyaW5nIGFkZHJfbW9kZVAgcG9pbnRzIGF0IHN0cnVjdCB3aXRoIHJlc3VsdCBUaGlzCi0gICByb3V0aW5lIGNhbGxzIGFkZHJfbW9kZSB0byBkZXRlcm1pbmUgdGhlIGdlbmVyYWwgYWRkci5tb2RlIG9mIHRoZQotICAgb3BlcmFuZC4gV2hlbiB0aGlzIGlzIHJlYWR5IGl0IHBhcnNlcyB0aGUgZGlzcGxhY2VtZW50cyBmb3Igc2l6ZQotICAgc3BlY2lmeWluZyBzdWZmaXhlcyBhbmQgZGV0ZXJtaW5lcyBzaXplIG9mIGltbWVkaWF0ZSBtb2RlIHZpYQotICAgbnMzMmstb3Bjb2RlLiAgQWxzbyBidWlsZHMgaW5kZXggYnl0ZXMgaWYgbmVlZGVkLiAgKi8KLWludAotZ2V0X2FkZHJfbW9kZSAocHRyLCBhZGRyX21vZGVQKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJfbW9kZVMgKmFkZHJfbW9kZVA7Ci17Ci0gIGludCB0bXA7Ci0gIGFkZHJfbW9kZSAocHRyLCBhZGRyX21vZGVQLCAwKTsKLSAgaWYgKGFkZHJfbW9kZVAtPm1vZGUgPT0gREVGQVVMVCB8fCBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9PSAtMSkKLSAgICB7Ci0gICAgICAvKiByZXNvbHZlIGFtYmlnaW91cyBvcGVyYW5kcywgdGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGlmCi0JIG9uZSB1c2VzIHN0YW5kYXJkIE5TQyBvcGVyYW5kIHN5bnRheC4gQnV0IHRoZSBzZXF1ZW50Ci0JIGNvbXBpbGVyIGRvZXNuJ3QhISEgIFRoaXMgZmluZHMgYSBwcm9wZXIgYWRkcmVzc2luZ2luZyBtb2RlCi0JIGlmIGl0IGlzIGltcGxpY2l0bHkgc3RhdGVkLiBTZWUgbnMzMmstb3Bjb2RlLmggKi8KLSAgICAgICh2b2lkKSBldmFsdWF0ZV9leHByICgmZXhwclAsIHB0cik7IC8qIHRoaXMgY2FsbCB0YWtlcyB0aW1lIFNpZ2ghICovCi0gICAgICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSBERUZBVUxUKQotCXsKLQkgIGlmIChleHByUC5YX2FkZF9zeW1ib2wgfHwgZXhwclAuWF9vcF9zeW1ib2wpCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlbDsgLyogd2UgaGF2ZSBhIGxhYmVsICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSBkZXNjLT5kZWZhdWx0X21vZGVjOyAvKiB3ZSBoYXZlIGEgY29uc3RhbnQgKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSBkZXNjLT5kZWZhdWx0X21vZGVsOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9IGRlc2MtPmRlZmF1bHRfbW9kZWM7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBtdXN0IHB1dCB0aGlzIG1lc3MgZG93biBpbiBhZGRyX21vZGUgdG8gaGFuZGxlIHRoZSBzY2FsZWQKLSAgICAgICAgIGNhc2UgYmV0dGVyICovCi0gICAgfQotICAvKiBJdCBhcHBlYXJzIGFzIHRoZSBzZXF1ZW50IGNvbXBpbGVyIHdhbnRzIGFuIGFic29sdXRlIHdoZW4gd2UgaGF2ZQotICAgICBhIGxhYmVsIHdpdGhvdXQgQC4gQ29uc3RhbnRzIGJlY29tZXMgaW1tZWRpYXRlcyBiZXNpZGVzIHRoZSBhZGRyCi0gICAgIGNhc2UuICBUaGluayBpdCBkb2VzIHNvIHdpdGggbG9jYWwgbGFiZWxzIHRvbywgbm90IG9wdGltdW0sIHBjcmVsCi0gICAgIGlzIGJldHRlci4gIFdoZW4gSSBoYXZlIHRpbWUgSSB3aWxsIG1ha2UgZ2FzIGNoZWNrIHRoaXMgYW5kCi0gICAgIHNlbGVjdCBwY3JlbCB3aGVuIHBvc3NpYmxlIEFjdHVhbGx5IHRoYXQgaXMgdHJpdmlhbC4gICovCi0gIGlmICh0bXAgPSBhZGRyX21vZGVQLT5zY2FsZWRfcmVnKQotICAgIHsJCQkJLyogYnVpbGQgaW5kZXhieXRlICovCi0gICAgICB0bXAtLTsJCQkvKiByZW1lbWJlciByZWdudW1iZXIgY29tZXMgaW5jcmVtZW50ZWQgZm9yCi0JCQkJICAgZmxhZ3B1cnBvc2UgKi8KLSAgICAgIHRtcCB8PSBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA8PCAzOwotICAgICAgYWRkcl9tb2RlUC0+aW5kZXhfYnl0ZSA9IChjaGFyKSB0bXA7Ci0gICAgICBhZGRyX21vZGVQLT5hbV9zaXplICs9IDE7Ci0gICAgfQotICBpZiAoZGlzcF90ZXN0W2FkZHJfbW9kZVAtPm1vZGVdKQotICAgIHsJCQkJLyogdGhlcmUgd2FzIGEgZGlzcGxhY2VtZW50LCBwcm9iZSBmb3IgbGVuZ3RoCi0JCQkJICAgc3BlY2lmeWluZyBzdWZmaXggKi8KLSAgICAgIHsKLQlyZWdpc3RlciBjaGFyIGM7Ci0JcmVnaXN0ZXIgY2hhciBzdWZmaXg7Ci0JcmVnaXN0ZXIgY2hhciBzdWZmaXhfc3ViOwotCXJlZ2lzdGVyIGludCBpOwotCXJlZ2lzdGVyIGNoYXIgKnRvUDsKLQlyZWdpc3RlciBjaGFyICpmcm9tUDsKLQotCWFkZHJfbW9kZVAtPnBjcmVsID0gMDsKLQlpZiAoZGlzcF90ZXN0W2FkZHJfbW9kZVAtPm1vZGVdKQotCSAgewkJCS8qIHRoZXJlIGlzIGEgZGlzcGxhY2VtZW50ICovCi0JICAgIGlmIChhZGRyX21vZGVQLT5tb2RlID09IDI3IHx8IGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID09IDI3KQotCSAgICAgIHsJCQkvKiBkbyB3ZSBoYXZlIHBjcmVsLiBtb2RlICovCi0JCWFkZHJfbW9kZVAtPnBjcmVsID0gMTsKLQkgICAgICB9Ci0JICAgIGFkZHJfbW9kZVAtPmltX2Rpc3AgPSAxOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCSAgICAgIHsKLQkJc3VmZml4X3N1YiA9IHN1ZmZpeCA9IDA7Ci0JCWlmICh0b1AgPSBhZGRyX21vZGVQLT5kaXNwW2ldKQotCQkgIHsJCS8qIHN1ZmZpeCBvZiBleHByZXNzaW9uLCB0aGUgbGFyZ2VzdCBzaXplCi0JCQkJICAgcnVsZXMgKi8KLQkJICAgIGZyb21QID0gdG9QOwotCQkgICAgd2hpbGUgKGMgPSAqZnJvbVArKykKLQkJICAgICAgewotCQkJKnRvUCsrID0gYzsKLQkJCWlmIChjID09ICc6JykKLQkJCSAgewotCQkJICAgIHN3aXRjaCAoKmZyb21QKQotCQkJICAgICAgewotCQkJICAgICAgY2FzZSAnXDAnOgotCQkJCWFzX3dhcm4gKF8oIlByZW1hdHVyZSBlbmQgb2Ygc3VmZml4IC0tIERlZmF1bHRpbmcgdG8gZCIpKTsKLQkJCQlzdWZmaXggPSA0OwotCQkJCWNvbnRpbnVlOwotCQkJICAgICAgY2FzZSAnYic6Ci0JCQkJc3VmZml4X3N1YiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICd3JzoKLQkJCQlzdWZmaXhfc3ViID0gMjsKLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ2QnOgotCQkJCXN1ZmZpeF9zdWIgPSA0OwotCQkJCWJyZWFrOwotCQkJICAgICAgZGVmYXVsdDoKLQkJCQlhc193YXJuIChfKCJCYWQgc3VmZml4IGFmdGVyICc6JyB1c2Uge2J8d3xkfSBEZWZhdWx0aW5nIHRvIGQiKSk7Ci0JCQkJc3VmZml4ID0gNDsKLQkJCSAgICAgIH0KLQkJCSAgICBmcm9tUCsrOwotCQkJICAgIHRvUC0tOwkvKiBTbyB3ZSB3cml0ZSBvdmVyIHRoZSAnOicgKi8KLQkJCSAgICBpZiAoc3VmZml4IDwgc3VmZml4X3N1YikKLQkJCSAgICAgIHN1ZmZpeCA9IHN1ZmZpeF9zdWI7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgKnRvUCA9ICdcMCc7LyogdGVybWluYXRlIHByb3Blcmx5ICovCi0JCSAgICBhZGRyX21vZGVQLT5kaXNwX3N1ZmZpeFtpXSA9IHN1ZmZpeDsKLQkJICAgIGFkZHJfbW9kZVAtPmFtX3NpemUgKz0gc3VmZml4ID8gc3VmZml4IDogNDsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChhZGRyX21vZGVQLT5tb2RlID09IDIwKQotCXsJCQkvKiBsb29rIGluIG5zMzJrX29wY29kZSBmb3Igc2l6ZSAqLwotCSAgYWRkcl9tb2RlUC0+ZGlzcF9zdWZmaXhbMF0gPSBhZGRyX21vZGVQLT5hbV9zaXplID0gZGVzYy0+aW1fc2l6ZTsKLQkgIGFkZHJfbW9kZVAtPmltX2Rpc3AgPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiBhZGRyX21vZGVQLT5tb2RlOwotfQotCi0KLS8qIHJlYWQgYW4gb3B0aW9ubGlzdCAqLwotdm9pZAotb3B0bGlzdCAoc3RyLCBvcHRpb25QLCBkZWZhdWx0X21hcCkKLSAgICAgY2hhciAqc3RyOwkJCS8qIHRoZSBzdHJpbmcgdG8gZXh0cmFjdCBvcHRpb25zIGZyb20gKi8KLSAgICAgc3RydWN0IG5zMzJrX29wdGlvbiAqb3B0aW9uUDsJLyogaG93IHRvIHNlYXJjaCB0aGUgc3RyaW5nICovCi0gICAgIHVuc2lnbmVkIGxvbmcgKmRlZmF1bHRfbWFwOwkvKiBkZWZhdWx0IHBhdHRlcm4gYW5kIG91dHB1dCAqLwotewotICByZWdpc3RlciBpbnQgaSwgaiwgaywgc3RybGVuMSwgc3RybGVuMjsKLSAgcmVnaXN0ZXIgY2hhciAqcGF0dGVyblAsICpzdHJQOwotICBzdHJsZW4xID0gc3RybGVuIChzdHIpOwotICBpZiAoc3RybGVuMSA8IDEpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIlZlcnkgc2hvcnQgaW5zdHIgdG8gb3B0aW9uLCBpZSB5b3UgY2FuJ3QgZG8gaXQgb24gYSBOVUxMc3RyIikpOwotICAgIH0KLSAgZm9yIChpID0gMDsgb3B0aW9uUFtpXS5wYXR0ZXJuICE9IDA7IGkrKykKLSAgICB7Ci0gICAgICBzdHJsZW4yID0gc3RybGVuIChvcHRpb25QW2ldLnBhdHRlcm4pOwotICAgICAgZm9yIChqID0gMDsgaiA8IHN0cmxlbjE7IGorKykKLQl7Ci0JICBwYXR0ZXJuUCA9IG9wdGlvblBbaV0ucGF0dGVybjsKLQkgIHN0clAgPSAmc3RyW2pdOwotCSAgZm9yIChrID0gMDsgayA8IHN0cmxlbjI7IGsrKykKLQkgICAgewotCSAgICAgIGlmICgqKHN0clArKykgIT0gKihwYXR0ZXJuUCsrKSkKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChrID09IHN0cmxlbjIpCi0JICAgIHsJCQkvKiBtYXRjaCAqLwotCSAgICAgICpkZWZhdWx0X21hcCB8PSBvcHRpb25QW2ldLm9yOwotCSAgICAgICpkZWZhdWx0X21hcCAmPSBvcHRpb25QW2ldLmFuZDsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIHNlYXJjaCBzdHJ1Y3QgZm9yIHN5bWJvbHMKLSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgdGhlIHNob3J0IGludGVnZXIgZm9ybSBvZiByZWcgbmFtZXMgaW4KLSAgIHRoZSBpbnN0cnVjdGlvbnMgbG1yLCBzbXIsIGxwciwgc3ByIHJldHVybiB0cnVlIGlmIHN0ciBpcyBmb3VuZCBpbgotICAgbGlzdCAqLwotCi1pbnQKLWxpc3Rfc2VhcmNoIChzdHIsIG9wdGlvblAsIGRlZmF1bHRfbWFwKQotICAgICBjaGFyICpzdHI7CQkJCS8qIHRoZSBzdHJpbmcgdG8gbWF0Y2ggKi8KLSAgICAgc3RydWN0IG5zMzJrX29wdGlvbiAqb3B0aW9uUDsJLyogbGlzdCB0byBzZWFyY2ggKi8KLSAgICAgdW5zaWduZWQgbG9uZyAqZGVmYXVsdF9tYXA7CS8qIGRlZmF1bHQgcGF0dGVybiBhbmQgb3V0cHV0ICovCi17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBmb3IgKGkgPSAwOyBvcHRpb25QW2ldLnBhdHRlcm4gIT0gMDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghc3RybmNtcCAob3B0aW9uUFtpXS5wYXR0ZXJuLCBzdHIsIDIwKSkKLQl7CQkJCS8qIHVzZSBzdHJuY21wIHRvIGJlIHNhZmUgKi8KLQkgICpkZWZhdWx0X21hcCB8PSBvcHRpb25QW2ldLm9yOwotCSAgKmRlZmF1bHRfbWFwICY9IG9wdGlvblBbaV0uYW5kOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gIGFzX3dhcm4gKF8oIk5vIHN1Y2ggZW50cnkgaW4gbGlzdC4gKGNwdS9tbXUgcmVnaXN0ZXIpIikpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWV2YWx1YXRlX2V4cHIgKHJlc3VsdFAsIHB0cikKLSAgICAgZXhwcmVzc2lvblMgKnJlc3VsdFA7Ci0gICAgIGNoYXIgKnB0cjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqdG1wX2xpbmU7Ci0KLSAgdG1wX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHB0cjsKLSAgZXhwcmVzc2lvbiAoJmV4cHJQKTsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gdG1wX2xpbmU7Ci19Ci0MCi0vKiBDb252ZXJ0IG9wZXJhbmRzIHRvIGlpZi1mb3JtYXQgYW5kIGFkZHMgYml0ZmllbGRzIHRvIHRoZSBvcGNvZGUuCi0gICBPcGVyYW5kcyBhcmUgcGFyc2VkIGluIHN1Y2ggYW4gb3JkZXIgdGhhdCB0aGUgb3Bjb2RlIGlzIHVwZGF0ZWQgZnJvbQotICAgaXRzIG1vc3Qgc2lnbmlmaWNhbnQgYml0LCB0aGF0IGlzIHdoZW4gdGhlIG9wZXJhbmQgbmVlZCB0byBhbHRlciB0aGUKLSAgIG9wY29kZS4KLSAgIEJlIGNhcmVmdWxsIG5vdCB0byBwdXQgdG8gb2JqZWN0cyBpbiB0aGUgc2FtZSBpaWYtc2xvdC4KLSAgICovCi0KLXZvaWQKLWVuY29kZV9vcGVyYW5kIChhcmdjLCBhcmd2LCBvcGVyYW5kc1AsIHN1ZmZpeFAsIGltX3NpemUsIG9wY29kZV9iaXRfcHRyKQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci0gICAgIGNoYXIgKm9wZXJhbmRzUDsKLSAgICAgY2hhciAqc3VmZml4UDsKLSAgICAgY2hhciBpbV9zaXplOwotICAgICBjaGFyIG9wY29kZV9iaXRfcHRyOwotewotICByZWdpc3RlciBpbnQgaSwgajsKLSAgY2hhciBkOwotICBpbnQgcGNyZWwsIHRtcCwgYiwgbG9vcCwgcGNyZWxfYWRqdXN0OwotICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgYXJnYzsgbG9vcCsrKQotICAgIHsKLSAgICAgIGkgPSBvcGVyYW5kc1BbbG9vcCA8PCAxXSAtICcxJzsJLyogd2hhdCBvcGVyYW5kIGFyZSB3ZSBzdXBwb3NlZAotCQkJCQkgICB0byB3b3JrIG9uICovCi0gICAgICBpZiAoaSA+IDMpCi0JYXNfZmF0YWwgKF8oIkludGVybmFsIGNvbnNpc3RlbmN5IGVycm9yLiAgY2hlY2sgbnMzMmstb3Bjb2RlLmgiKSk7Ci0gICAgICBwY3JlbCA9IDA7Ci0gICAgICBwY3JlbF9hZGp1c3QgPSAwOwotICAgICAgdG1wID0gMDsKLSAgICAgIHN3aXRjaCAoKGQgPSBvcGVyYW5kc1BbKGxvb3AgPDwgMSkgKyAxXSkpCi0JewotCWNhc2UgJ2YnOgkJLyogb3BlcmFuZCBvZiBzZnNyIHR1cm5zIG91dCB0byBiZSBhIG5hc3R5Ci0JCQkJICAgc3BlY2lhbGNhc2UgKi8KLQkgIG9wY29kZV9iaXRfcHRyIC09IDU7Ci0JY2FzZSAnWic6CQkvKiBmbG9hdCBub3QgaW1tZWRpYXRlICovCi0JY2FzZSAnRic6CQkvKiAzMiBiaXQgZmxvYXQJZ2VuZXJhbCBmb3JtICovCi0JY2FzZSAnTCc6CQkvKiA2NCBiaXQgZmxvYXQJKi8KLQljYXNlICdJJzoJCS8qIGludGVnZXIgbm90IGltbWVkaWF0ZSAqLwotCWNhc2UgJ0InOgkJLyogYnl0ZQkgKi8KLQljYXNlICdXJzoJCS8qIHdvcmQJICovCi0JY2FzZSAnRCc6CQkvKiBkb3VibGUtd29yZAkqLwotCWNhc2UgJ0EnOgkJLyogZG91YmxlLXdvcmQJZ2VuLWFkZHJlc3MtZm9ybSBpZSBubyByZWdzCi0JCQkJICAgYWxsb3dlZCAqLwotCSAgZ2V0X2FkZHJfbW9kZSAoYXJndltpXSwgJmFkZHJfbW9kZVApOwotCSAgaWYoKGFkZHJfbW9kZVAubW9kZSA9PSAyMCkgJiYKLQkgICAgIChkID09ICdJJyB8fCBkID09ICdaJyB8fCBkID09ICdBJykpIHsKLQkgICAgYXNfZmF0YWwoZCA9PSAnQSc/IF8oIkFkZHJlc3Mgb2YgaW1tZWRpYXRlIG9wZXJhbmQiKToKLQkJICAgICBfKCJJbnZhbGlkIGltbWVkaWF0ZSB3cml0ZSBvcGVyYW5kLiIpKTsKLQkgIH0KLQotCSAgaWYgKG9wY29kZV9iaXRfcHRyID09IGRlc2MtPm9wY29kZV9zaXplKQotCSAgICBiID0gNDsKLQkgIGVsc2UKLQkgICAgYiA9IDY7Ci0JICBmb3IgKGogPSBiOyBqIDwgKGIgKyAyKTsgaisrKQotCSAgICB7Ci0JICAgICAgaWYgKGFkZHJfbW9kZVAuZGlzcFtqIC0gYl0pCi0JCXsKLQkJICBJSUYgKGosCi0JCSAgICAgICAyLAotCQkgICAgICAgYWRkcl9tb2RlUC5kaXNwX3N1ZmZpeFtqIC0gYl0sCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgYWRkcl9tb2RlUC5kaXNwW2ogLSBiXSwKLQkJICAgICAgIDAsCi0JCSAgICAgICBhZGRyX21vZGVQLnBjcmVsLAotCQkgICAgICAgaWlmLmluc3RyX3NpemUsCi0JCSAgICAgICBhZGRyX21vZGVQLmltX2Rpc3AsCi0JCSAgICAgICBJTkQgKEJSQU5DSCwgQllURSksCi0JCSAgICAgICBOVUxMLAotCQkgICAgICAgKGFkZHJfbW9kZVAuc2NhbGVkX3JlZyA/IGFkZHJfbW9kZVAuc2NhbGVkX21vZGUKLQkJCTogYWRkcl9tb2RlUC5tb2RlKSwKLQkJICAgICAgIDApOwotCQl9Ci0JICAgIH0KLQkgIG9wY29kZV9iaXRfcHRyIC09IDU7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gKChsb25nKSBhZGRyX21vZGVQLm1vZGUpIDw8IG9wY29kZV9iaXRfcHRyOwotCSAgaWYgKGFkZHJfbW9kZVAuc2NhbGVkX3JlZykKLQkgICAgewotCSAgICAgIGogPSBiIC8gMjsKLQkgICAgICBJSUYgKGosIDEsIDEsICh1bnNpZ25lZCBsb25nKSBhZGRyX21vZGVQLmluZGV4X2J5dGUsCi0JCSAgIDAsIDAsIDAsIDAsIDAsIE5VTEwsIC0xLCAwKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnYic6CQkvKiBtdWx0aXBsZSBpbnN0cnVjdGlvbiBkaXNwICovCi0JICBmcmVlcHRyKys7CQkvKiBPVkU6dGhpcyBpcyBhbiB1c2VmdWwgaGFjayAqLwotCSAgc3ByaW50ZiAoZnJlZXB0ciwgIigoJXMtMSkqJWQpXDAwMCIsIGFyZ3ZbaV0sIGRlc2MtPmltX3NpemUpOwotCSAgYXJndltpXSA9IGZyZWVwdHI7Ci0JICBwY3JlbCAtPSAxOwkJLyogbWFrZSBwY3JlbCAwIGluc3BpdGUgb2Ygd2hhdCBjYXNlICdwJzoKLQkJCQkgICB3YW50cyAqLwotCSAgLyogZmFsbCB0aHJ1ICovCi0JY2FzZSAncCc6CQkvKiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nICovCi0JICBwY3JlbCArPSAxOwotCSAgLyogZmFsbCB0aHJ1ICovCi0JY2FzZSAnZCc6CQkvKiBkaXNwbGFjZW1lbnQgKi8KLQkgIGlpZi5pbnN0cl9zaXplICs9IHN1ZmZpeFBbaV0gPyBzdWZmaXhQW2ldIDogNDsKLQkgIElJRiAoMTIsIDIsIHN1ZmZpeFBbaV0sICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLCAwLAotCSAgICAgICBwY3JlbCwgcGNyZWxfYWRqdXN0LCAxLCBJTkQgKEJSQU5DSCwgQllURSksIE5VTEwsIC0xLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0gnOgkJLyogc2VxdWVudC1oYWNrOiB0aGUgbGlua2VyIHdhbnRzIGEgYml0IHNldAotCQkJCSAgIHdoZW4gYnNyICovCi0JICBwY3JlbCA9IDE7Ci0JICBpaWYuaW5zdHJfc2l6ZSArPSBzdWZmaXhQW2ldID8gc3VmZml4UFtpXSA6IDQ7Ci0JICBJSUYgKDEyLCAyLCBzdWZmaXhQW2ldLCAodW5zaWduZWQgbG9uZykgYXJndltpXSwgMCwKLQkgICAgICAgcGNyZWwsIHBjcmVsX2FkanVzdCwgMSwgSU5EIChCUkFOQ0gsIEJZVEUpLCBOVUxMLCAtMSwgMSk7Ci0JICBicmVhazsKLQljYXNlICdxJzoJCS8qIHF1aWNrICovCi0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgSUlGICgxMSwgMiwgNDIsICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLCAwLCAwLCAwLCAwLCAwLAotCSAgICAgICBiaXRfZml4X25ldyAoNCwgb3Bjb2RlX2JpdF9wdHIsIC04LCA3LCAwLCAxLCAwKSwgLTEsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6CQkvKiByZWdpc3RlciBudW1iZXIgKDMgYml0cykgKi8KLQkgIGxpc3Rfc2VhcmNoIChhcmd2W2ldLCBvcHQ2LCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDM7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IG9wY29kZV9iaXRfcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSAnTyc6CQkvKiBzZXRjZmcgaW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QgKi8KLQkgIG9wdGxpc3QgKGFyZ3ZbaV0sIG9wdDMsICZ0bXApOwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKLQkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgMTU7Ci0JICBicmVhazsKLQljYXNlICdDJzoJCS8qIGNpbnYgaW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QgKi8KLQkgIG9wdGxpc3QgKGFyZ3ZbaV0sIG9wdDQsICZ0bXApOwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKLQkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgMTU7IC8qIGluc2VydCB0aGUgcmVndHlwZSBpbiBvcGNvZGUgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgkJLyogc3RyaW5naW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QgKi8KLQkgIG9wdGxpc3QgKGFyZ3ZbaV0sIG9wdDUsICZ0bXApOwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKLQkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgMTU7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQljYXNlICdVJzoJCS8qIHJlZ2lzdGVybGlzdCAqLwotCSAgSUlGICgxMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgTlVMTCwgLTEsIDApOwotCSAgc3dpdGNoIChvcGVyYW5kc1BbKGkgPDwgMSkgKyAxXSkKLQkgICAgewotCSAgICBjYXNlICd1JzoJCS8qIHJlc3RvcmUsIGV4aXQgKi8KLQkgICAgICBvcHRsaXN0IChhcmd2W2ldLCBvcHQxLCAmaWlmLmlpZlBbMTBdLm9iamVjdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1UnOgkJLyogc2F2ZSxlbnRlciAqLwotCSAgICAgIG9wdGxpc3QgKGFyZ3ZbaV0sIG9wdDIsICZpaWYuaWlmUFsxMF0ub2JqZWN0KTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWlmLmluc3RyX3NpemUgKz0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgkJLyogbW11IHJlZ2lzdGVyICovCi0JICBsaXN0X3NlYXJjaCAoYXJndltpXSwgbW11cmVnLCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IG9wY29kZV9iaXRfcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSAnUCc6CQkvKiBjcHUgcmVnaXN0ZXIgICovCi0JICBsaXN0X3NlYXJjaCAoYXJndltpXSwgY3B1cmVnLCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IG9wY29kZV9iaXRfcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6CQkvKiBpbnNzIGV4dHMgKi8KLQkgIGlpZi5pbnN0cl9zaXplICs9IDE7CS8qIDEgYnl0ZSBpcyBhbGxvY2F0ZWQgYWZ0ZXIgdGhlIG9wY29kZSAqLwotCSAgSUlGICgxMCwgMiwgMSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sCS8qIGkgYWx3YXlzIDIgaGVyZSAqLwotCSAgICAgICAwLCAwLCAwLCAwLCAwLAotCSAgICAgICBiaXRfZml4X25ldyAoMywgNSwgMCwgNywgMCwgMCwgMCksIC8qIGEgYml0X2ZpeCBpcyB0YXJnZXRlZCB0bwotCQkJCQkJICAgICB0aGUgYnl0ZSAqLwotCSAgICAgICAtMSwgMCk7Ci0JICBicmVhazsKLQljYXNlICdHJzoKLQkgIElJRiAoMTEsIDIsIDQyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgYXJndltpXSwJLyogaSBhbHdheXMgMyBoZXJlICovCi0JICAgICAgIDAsIDAsIDAsIDAsIDAsCi0JICAgICAgIGJpdF9maXhfbmV3ICg1LCAwLCAxLCAzMiwgLTEsIDAsIC0xKSwgLTEsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBpaWYuaW5zdHJfc2l6ZSArPSAxOwotCSAgYiA9IDIgKyBpOwkJLyogcHV0IHRoZSBleHRlbnNpb24gYnl0ZSBhZnRlciBvcGNvZGUgKi8KLQkgIElJRiAoYiwgMiwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDApOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2ZhdGFsIChfKCJCYWQgb3Bjb2RlLXRhYmxlLW9wdGlvbiwgY2hlY2sgaW4gZmlsZSBuczMyay1vcGNvZGUuaCIpKTsKLQl9Ci0gICAgfQotfQotDAotLyogaW46ICBpbnN0cnVjdGlvbiBsaW5lCi0gICBvdXQ6IGludGVybmFsIHN0cnVjdHVyZSBvZiBpbnN0cnVjdGlvbgotICAgdGhhdCBoYXMgYmVlbiBwcmVwYXJlZCBmb3IgZGlyZWN0IGNvbnZlcnNpb24gdG8gZnJhZ21lbnQocykgYW5kCi0gICBmaXhlcyBpbiBhIHN5c3RlbWF0aWNhbCBmYXNoaW9uCi0gICBSZXR1cm4tdmFsdWUgPSByZWN1cnNpdmVfbGV2ZWwKLSAgICovCi0vKiBidWlsZCBpaWYgb2Ygb25lIGFzc2VtYmx5IHRleHQgbGluZSAqLwotaW50Ci1wYXJzZSAobGluZSwgcmVjdXJzaXZlX2xldmVsKQotICAgICBjaGFyICpsaW5lOwotICAgICBpbnQgcmVjdXJzaXZlX2xldmVsOwotewotICByZWdpc3RlciBjaGFyICpsaW5lcHRyLCBjLCBzdWZmaXhfc2VwYXJhdG9yOwotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IGFyZ2MsIGFyZ190eXBlOwotICBjaGFyIHNxciwgc2VwOwotICBjaGFyIHN1ZmZpeFtNQVhfQVJHU10sICphcmd2W01BWF9BUkdTXTsJLyogbm8gbW9yZSB0aGFuIDQgb3BlcmFuZHMgKi8KLSAgaWYgKHJlY3Vyc2l2ZV9sZXZlbCA8PSAwKQotICAgIHsJCQkJLyogY2FsbGVkIGZyb20gbWRfYXNzZW1ibGUgKi8KLSAgICAgIGZvciAobGluZXB0ciA9IGxpbmU7ICgqbGluZXB0cikgIT0gJ1wwJyAmJiAoKmxpbmVwdHIpICE9ICcgJzsgbGluZXB0cisrKTsKLSAgICAgIGMgPSAqbGluZXB0cjsKLSAgICAgICpsaW5lcHRyID0gJ1wwJzsKLSAgICAgIGlmICghKGRlc2MgPSAoc3RydWN0IG5zMzJrX29wY29kZSAqKSBoYXNoX2ZpbmQgKGluc3RfaGFzaF9oYW5kbGUsIGxpbmUpKSkKLQl7Ci0JICBhc19mYXRhbCAoXygiTm8gc3VjaCBvcGNvZGUiKSk7Ci0JfQotICAgICAgKmxpbmVwdHIgPSBjOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxpbmVwdHIgPSBsaW5lOwotICAgIH0KLSAgYXJnYyA9IDA7Ci0gIGlmICgqZGVzYy0+b3BlcmFuZHMpCi0gICAgewotICAgICAgaWYgKCpsaW5lcHRyKysgIT0gJ1wwJykKLQl7Ci0JICBzcXIgPSAnWyc7Ci0JICBzZXAgPSAnLCc7Ci0JICB3aGlsZSAoKmxpbmVwdHIgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmIChkZXNjLT5vcGVyYW5kc1thcmdjIDw8IDFdKQotCQl7Ci0JCSAgc3VmZml4W2FyZ2NdID0gMDsKLQkJICBhcmdfdHlwZSA9IGRlc2MtPm9wZXJhbmRzWyhhcmdjIDw8IDEpICsgMV07Ci0JCSAgc3dpdGNoIChhcmdfdHlwZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgY2FzZSAnYic6Ci0JCSAgICBjYXNlICdwJzoKLQkJICAgIGNhc2UgJ0gnOgkvKiB0aGUgb3BlcmFuZCBpcyBzdXBwb3NlZCB0byBiZSBhCi0JCQkJICAgZGlzcGxhY2VtZW50ICovCi0JCSAgICAgIC8qIEhhY2t3YXJuaW5nOiBkbyBub3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgNAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VzIGFib3ZlIHdoZW4gZWRpdGluZyBuczMyay1vcGNvZGUuaCAqLwotCQkgICAgICBzdWZmaXhfc2VwYXJhdG9yID0gJzonOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIHN1ZmZpeF9zZXBhcmF0b3IgPSAnXDI1NSc7IC8qIGlmIHRoaXMgY2hhciBvY2N1cnMgd2UKLQkJCQkJCSAgICBsb29zZSAqLwotCQkgICAgfQotCQkgIHN1ZmZpeFthcmdjXSA9IDA7IC8qIDAgd2hlbiBubyAnOicgaXMgZW5jb3VudGVyZWQgKi8KLQkJICBhcmd2W2FyZ2NdID0gZnJlZXB0cjsKLQkJICAqZnJlZXB0ciA9ICdcMCc7Ci0JCSAgd2hpbGUgKChjID0gKmxpbmVwdHIpICE9ICdcMCcgJiYgYyAhPSBzZXApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjID09IHNxcikKLQkJCXsKLQkJCSAgaWYgKHNxciA9PSAnWycpCi0JCQkgICAgewotCQkJICAgICAgc3FyID0gJ10nOwotCQkJICAgICAgc2VwID0gJ1wwJzsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBzcXIgPSAnWyc7Ci0JCQkgICAgICBzZXAgPSAnLCc7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBpZiAoYyA9PSBzdWZmaXhfc2VwYXJhdG9yKQotCQkJewkvKiAnOicgLSBsYWJlbC9zdWZmaXggc2VwYXJhdG9yICovCi0JCQkgIHN3aXRjaCAobGluZXB0clsxXSkKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSAnYic6Ci0JCQkgICAgICBzdWZmaXhbYXJnY10gPSAxOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSAndyc6Ci0JCQkgICAgICBzdWZmaXhbYXJnY10gPSAyOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSAnZCc6Ci0JCQkgICAgICBzdWZmaXhbYXJnY10gPSA0OwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCSAgICAgIGFzX3dhcm4gKF8oIkJhZCBzdWZmaXgsIGRlZmF1bHRpbmcgdG8gZCIpKTsKLQkJCSAgICAgIHN1ZmZpeFthcmdjXSA9IDQ7Ci0JCQkgICAgICBpZiAobGluZXB0clsxXSA9PSAnXDAnIHx8IGxpbmVwdHJbMV0gPT0gc2VwKQotCQkJCXsKLQkJCQkgIGxpbmVwdHIgKz0gMTsKLQkJCQkgIGNvbnRpbnVlOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgIGxpbmVwdHIgKz0gMjsKLQkJCSAgY29udGludWU7Ci0JCQl9Ci0JCSAgICAgICpmcmVlcHRyKysgPSBjOwotCQkgICAgICBsaW5lcHRyKys7Ci0JCSAgICB9Ci0JCSAgKmZyZWVwdHIrKyA9ICdcMCc7Ci0JCSAgYXJnYyArPSAxOwotCQkgIGlmICgqbGluZXB0ciA9PSAnXDAnKQotCQkgICAgY29udGludWU7Ci0JCSAgbGluZXB0ciArPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfZmF0YWwgKF8oIlRvbyBtYW55IG9wZXJhbmRzIHBhc3NlZCB0byBpbnN0cnVjdGlvbiIpKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKGFyZ2MgIT0gc3RybGVuIChkZXNjLT5vcGVyYW5kcykgLyAyKQotICAgIHsKLSAgICAgIGlmIChzdHJsZW4gKGRlc2MtPmRlZmF1bHRfYXJncykpCi0JewkJCS8qIHdlIGNhbiBhcHBseSBkZWZhdWx0LCBkb250IGdvb2YgKi8KLQkgIGlmIChwYXJzZSAoZGVzYy0+ZGVmYXVsdF9hcmdzLCAxKSAhPSAxKQotCSAgICB7CQkJLyogY2hlY2sgZXJyb3IgaW4gZGVmYXVsdCAqLwotCSAgICAgIGFzX2ZhdGFsIChfKCJXcm9uZyBudW1iZXJzIG9mIG9wZXJhbmRzIGluIGRlZmF1bHQsIGNoZWNrIG5zMzJrLW9wY29kZXMuaCIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19mYXRhbCAoXygiV3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIikpOwotCX0KLQotICAgIH0KLSAgZm9yIChpID0gMDsgaSA8IElJRl9FTlRSSUVTOyBpKyspCi0gICAgewotICAgICAgaWlmLmlpZlBbaV0udHlwZSA9IDA7CS8qIG1hcmsgYWxsIGVudHJpZXMgYXMgdm9pZCovCi0gICAgfQotCi0gIC8qIGJ1aWxkIG9wY29kZSBpaWYtZW50cnkgKi8KLSAgaWlmLmluc3RyX3NpemUgPSBkZXNjLT5vcGNvZGVfc2l6ZSAvIDg7Ci0gIElJRiAoMSwgMSwgaWlmLmluc3RyX3NpemUsIGRlc2MtPm9wY29kZV9zZWVkLCAwLCAwLCAwLCAwLCAwLCAwLCAtMSwgMCk7Ci0KLSAgLyogdGhpcyBjYWxsIGVuY29kZXMgb3BlcmFuZHMgdG8gaWlmIGZvcm1hdCAqLwotICBpZiAoYXJnYykKLSAgICB7Ci0gICAgICBlbmNvZGVfb3BlcmFuZCAoYXJnYywKLQkJICAgICAgYXJndiwKLQkJICAgICAgJmRlc2MtPm9wZXJhbmRzWzBdLAotCQkgICAgICAmc3VmZml4WzBdLAotCQkgICAgICBkZXNjLT5pbV9zaXplLAotCQkgICAgICBkZXNjLT5vcGNvZGVfc2l6ZSk7Ci0gICAgfQotICByZXR1cm4gcmVjdXJzaXZlX2xldmVsOwotfQotDAotCi0vKiBDb252ZXJ0IGlpZiB0byBmcmFnbWVudHMuICBGcm9tIHRoaXMgcG9pbnQgd2Ugc3RhcnQgdG8gZHJpYmJsZSB3aXRoCi0gKiBmdW5jdGlvbnMgaW4gb3RoZXIgZmlsZXMgdGhhbiB0aGlzIG9uZS4oRXhjZXB0IGhhc2guYykgU28sIGlmIGl0J3MKLSAqIHBvc3NpYmxlIHRvIG1ha2UgYW4gaWlmIGZvciBhbiBvdGhlciBDUFUsIHlvdSBkb24ndCBuZWVkIHRvIGtub3cKLSAqIHdoYXQgZnJhZ3MsIHJlbGF4LCBvYnN0YWNrcywgZXRjIGlzIGluIG9yZGVyIHRvIHBvcnQgdGhpcwotICogYXNzZW1ibGVyLiBZb3Ugb25seSBuZWVkIHRvIGtub3cgaWYgaXQncyBwb3NzaWJsZSB0byByZWR1Y2UgeW91cgotICogY3B1LWluc3RydWN0aW9uIHRvIGlpZi1mb3JtYXQgKHRha2VzIHNvbWUgd29yaykgYW5kIGFkb3B0IHRoZSBvdGhlcgotICogbWRfPyBwYXJ0cyBhY2NvcmRpbmcgdG8gZ2l2ZW4gaW5zdHJ1Y3Rpb25zIE5vdGUgdGhhdCBpaWYgd2FzCi0gKiBpbnZlbnRlZCBmb3IgdGhlIGNsZWFuIG5zMzJrYHMgYXJjaGl0ZWN1cmUuCi0gKi8KLQotLyogR0FTIGZvciB0aGUgbnMzMmsgaGFzIGEgcHJvYmxlbS4gUEMgcmVsYXRpdmUgZGlzcGxhY2VtZW50cyBhcmUKLSAqIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvcGNvZGUsIG5vdCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAqIG9wZXJhbmQuIFdlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIG9wZXJhbmQKLSAqIGFuZCB0aGUgb3Bjb2RlIGluIHBjcmVsX2FkanVzdCBmb3IgZWFjaCBmcmFnIGFuZCBlYWNoIGZpeC4gSG93ZXZlciwKLSAqIHdlIGdldCBpbnRvIHRyb3VibGUgd2hlcmUgdGhlcmUgYXJlIHR3byBvciBtb3JlIHBjLXJlbGF0aXZlCi0gKiBvcGVyYW5kcyBhbmQgdGhlIHNpemUgb2YgdGhlIGZpcnN0IG9uZSBjYW4ndCBiZSBkZXRlcm1pbmVkLiBUaGVuIGluCi0gKiB0aGUgcmVsYXggcGhhc2UsIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBvcGVyYW5kIHdpbGwgY2hhbmdlIGFuZAotICogcGNyZWxfYWRqdXN0IHdpbGwgbm8gbG9uZ2VyIGJlIGNvcnJlY3QuICBUaGUgY3VycmVudCBzb2x1dGlvbiBpcwotICoga2VlcCBhIHBvaW50ZXIgdG8gdGhlIGZyYWcgd2l0aCB0aGUgb3Bjb2RlIGluIGl0IGFuZCB0aGUgb2Zmc2V0IGluCi0gKiB0aGF0IGZyYWcgZm9yIGVhY2ggZnJhZyBhbmQgZWFjaCBmaXguIFRoZW4sIHdoZW4gbmVlZGVkLCB3ZSBjYW4KLSAqIGFsd2F5cyBmaWd1cmUgb3V0IGhvdyBmYXIgaXQgaXMgYmV0d2VlbiB0aGUgb3Bjb2RlIGFuZCB0aGUgcGNyZWwKLSAqIG9iamVjdC4gIFNlZSBhbHNvIG1kX3BjcmVsX2FkanVzdCBhbmQgbWRfZml4X3BjcmVsX2FkanVzdC4gIEZvcgotICogb2JqZWN0cyBub3QgcGFydCBvZiBhbiBpbnN0cnVjdGlvbiwgdGhlIHBvaW50ZXIgdG8gdGhlIG9wY29kZSBmcmFnCi0gKiBpcyBhbHdheXMgemVyby4gICovCi0KLXZvaWQKLWNvbnZlcnRfaWlmICgpCi17Ci0gIGludCBpOwotICBiaXRfZml4UyAqajsKLSAgZnJhZ1MgKmluc3RfZnJhZzsKLSAgdW5zaWduZWQgaW50IGluc3Rfb2Zmc2V0OwotICBjaGFyICppbnN0X29wY29kZTsKLSAgY2hhciAqbWVtUDsKLSAgaW50IGw7Ci0gIGludCBrOwotICBjaGFyIHR5cGU7Ci0gIGNoYXIgc2l6ZSA9IDA7Ci0gIGludCBzaXplX3NvX2ZhcjsKLQotICBtZW1QID0gZnJhZ19tb3JlICgwKTsKLSAgaW5zdF9vcGNvZGUgPSBtZW1QOwotICBpbnN0X29mZnNldCA9IChtZW1QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpOwotICBpbnN0X2ZyYWcgPSBmcmFnX25vdzsKLQotICBmb3IgKGkgPSAwOyBpIDwgSUlGX0VOVFJJRVM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9IGlpZi5paWZQW2ldLnR5cGUpCi0JewkJCS8qIHRoZSBvYmplY3QgZXhpc3QsIHNvIGhhbmRsZSBpdCAqLwotCSAgc3dpdGNoIChzaXplID0gaWlmLmlpZlBbaV0uc2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDQyOgotCSAgICAgIHNpemUgPSAwOwkJLyogaXQncyBhIGJpdGZpeCB0aGF0IG9wZXJhdGVzIG9uIGFuIGV4aXN0aW5nCi0JCQkJICAgb2JqZWN0Ki8KLQkgICAgICBpZiAoaWlmLmlpZlBbaV0uYml0X2ZpeFAtPmZ4X2JpdF9iYXNlKQotCQl7CQkvKiBleHBhbmQgZnhfYml0X2Jhc2UgdG8gcG9pbnQgYXQgb3Bjb2RlICovCi0JCSAgaWlmLmlpZlBbaV0uYml0X2ZpeFAtPmZ4X2JpdF9iYXNlID0gKGxvbmcpIGluc3Rfb3Bjb2RlOwotCQl9Ci0JICAgIGNhc2UgODoJCS8qIGJpZ251bSBvciBkb3VibGVmbG9hdCAqLwotCSAgICBjYXNlIDE6Ci0JICAgIGNhc2UgMjoKLQkgICAgY2FzZSAzOgotCSAgICBjYXNlIDQ6CQkvKiB0aGUgZmluYWwgc2l6ZSBpbiBvYmplY3RtZW1vcnkgaXMga25vd24gKi8KLQkgICAgICBtZW1QID0gZnJhZ19tb3JlKHNpemUpOwotCSAgICAgIGogPSBpaWYuaWlmUFtpXS5iaXRfZml4UDsKLQkgICAgICBzd2l0Y2ggKHR5cGUpCi0JCXsKLQkJY2FzZSAxOgkvKiB0aGUgb2JqZWN0IGlzIHB1cmUgYmluYXJ5ICovCi0JCSAgaWYgKGogfHwgaWlmLmlpZlBbaV0ucGNyZWwpCi0JCSAgICB7Ci0JCSAgICAgIGZpeF9uZXdfbnMzMmsgKGZyYWdfbm93LAotCQkJCSAgICAgKGxvbmcpIChtZW1QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLAotCQkJCSAgICAgc2l6ZSwKLQkJCQkgICAgIDAsCi0JCQkJICAgICBpaWYuaWlmUFtpXS5vYmplY3QsCi0JCQkJICAgICBpaWYuaWlmUFtpXS5wY3JlbCwKLQkJCQkgICAgIGlpZi5paWZQW2ldLmltX2Rpc3AsCi0JCQkJICAgICBqLAotCQkJCSAgICAgaWlmLmlpZlBbaV0uYnNyLAkvKiBzZXF1ZW50IGhhY2sgKi8KLQkJCQkgICAgIGluc3RfZnJhZywgaW5zdF9vZmZzZXQpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsJCS8qIGdvb2QsIGp1c3QgcHV0IHRoZW0gYnl0ZXMgb3V0ICovCi0JCSAgICAgIHN3aXRjaCAoaWlmLmlpZlBbaV0uaW1fZGlzcCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChtZW1QLCBpaWYuaWlmUFtpXS5vYmplY3QsIHNpemUpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMToKLQkJCSAgbWRfbnVtYmVyX3RvX2Rpc3AgKG1lbVAsIGlpZi5paWZQW2ldLm9iamVjdCwgc2l6ZSk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgYXNfZmF0YWwgKF8oImlpZiBjb252ZXJ0IGludGVybmFsIHBjcmVsL2JpbmFyeSIpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSAyOgotCQkgIC8qIHRoZSBvYmplY3QgaXMgYSBwb2ludGVyIGF0IGFuIGV4cHJlc3Npb24sIHNvCi0gICAgICAgICAgICAgICAgICAgICB1bnBhY2sgaXQsIG5vdGUgdGhhdCBiaWdudW1zIG1heSByZXN1bHQgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gKi8KLQkJICBldmFsdWF0ZV9leHByICgmZXhwclAsIChjaGFyICopIGlpZi5paWZQW2ldLm9iamVjdCk7Ci0JCSAgaWYgKGV4cHJQLlhfb3AgPT0gT19iaWcgfHwgc2l6ZSA9PSA4KQotCQkgICAgewotCQkgICAgICBpZiAoKGsgPSBleHByUC5YX2FkZF9udW1iZXIpID4gMCkKLQkJCXsKLQkJCSAgLyogd2UgaGF2ZSBhIGJpZ251bSBpZSBhIHF1YWQuIFRoaXMgY2FuIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFwcGVucyBpbiBhIGxvbmcgc3VmZml4ZWQgaW5zdHJ1Y3Rpb24gKi8KLQkJCSAgaWYgKGsgKiAyID4gc2l6ZSkKLQkJCSAgICBhc193YXJuIChfKCJCaWdudW0gdG9vIGJpZyBmb3IgbG9uZyIpKTsKLQkJCSAgaWYgKGsgPT0gMykKLQkJCSAgICBtZW1QICs9IDI7Ci0JCQkgIGZvciAobCA9IDA7IGsgPiAwOyBrLS0sIGwgKz0gMikKLQkJCSAgICB7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKG1lbVAgKyBsLAotCQkJCQkJICBnZW5lcmljX2JpZ251bVtsID4+IDFdLAotCQkJCQkJICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7CS8qIGZsb251bSAqLwotCQkJICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLQotCQkJICBzd2l0Y2ggKHNpemUpCi0JCQkgICAgewotCQkJICAgIGNhc2UgNDoKLQkJCSAgICAgIGdlbl90b193b3JkcyAod29yZHMsIDIsIDgpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2ltbSAobWVtUCwgKGxvbmcpIHdvcmRzWzBdLAotCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2ltbSAobWVtUCArIHNpemVvZiAoTElUVExFTlVNX1RZUEUpLAotCQkJCQkJKGxvbmcpIHdvcmRzWzFdLAotCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSA4OgotCQkJICAgICAgZ2VuX3RvX3dvcmRzICh3b3JkcywgNCwgMTEpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2ltbSAobWVtUCwgKGxvbmcpIHdvcmRzWzBdLAotCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2ltbSAobWVtUCArIHNpemVvZiAoTElUVExFTlVNX1RZUEUpLAotCQkJCQkJKGxvbmcpIHdvcmRzWzFdLAotCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2ltbSAoKG1lbVAgKyAyCi0JCQkJCQkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSksCi0JCQkJCQkobG9uZykgd29yZHNbMl0sCi0JCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9faW1tICgobWVtUCArIDMKLQkJCQkJCSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSwKLQkJCQkJCShsb25nKSB3b3Jkc1szXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgaWYgKGogfHwKLQkJICAgICAgZXhwclAuWF9hZGRfc3ltYm9sIHx8Ci0JCSAgICAgIGV4cHJQLlhfb3Bfc3ltYm9sIHx8Ci0JCSAgICAgIGlpZi5paWZQW2ldLnBjcmVsKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgZXhwcmVzc2lvbiB3YXMgdW5kZWZpbmVkIGR1ZSB0byBhbgotICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCBsYWJlbC4gQ3JlYXRlIGEgZml4IHNvIHdlIGNhbiBmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb2JqZWN0IGxhdGVyLiAqLwotCQkgICAgICBleHByUC5YX2FkZF9udW1iZXIgKz0gaWlmLmlpZlBbaV0ub2JqZWN0X2FkanVzdDsKLQkJICAgICAgZml4X25ld19uczMya19leHAgKGZyYWdfbm93LAotCQkJCQkgKGxvbmcpIChtZW1QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLAotCQkJCQkgc2l6ZSwKLQkJCQkJICZleHByUCwKLQkJCQkJIGlpZi5paWZQW2ldLnBjcmVsLAotCQkJCQkgaWlmLmlpZlBbaV0uaW1fZGlzcCwKLQkJCQkJIGosCi0JCQkJCSBpaWYuaWlmUFtpXS5ic3IsCi0JCQkJCSBpbnN0X2ZyYWcsIGluc3Rfb2Zmc2V0KTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIGdvb2QsIGp1c3QgcHV0IHRoZW0gYnl0ZXMgb3V0ICovCi0JCSAgICAgIHN3aXRjaCAoaWlmLmlpZlBbaV0uaW1fZGlzcCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgbWRfbnVtYmVyX3RvX2ltbSAobWVtUCwgZXhwclAuWF9hZGRfbnVtYmVyLCBzaXplKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkgIG1kX251bWJlcl90b19kaXNwIChtZW1QLCBleHByUC5YX2FkZF9udW1iZXIsIHNpemUpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGFzX2ZhdGFsIChfKCJpaWYgY29udmVydCBpbnRlcm5hbCBwY3JlbC9wb2ludGVyIikpOwotCQkJfQotCQkgICAgfQotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBsb2dpYyBlcnJvciBpbiBpaWYuaWlmUFtuXS50eXBlIikpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMDoKLQkgICAgICAvKiBUbyBiYWQsIHRoZSBvYmplY3QgbWF5IGJlIHVuZGVmaW5lZCBhcyBmYXIgYXMgaXRzCi0JCSBmaW5hbCBuc2l6ZSBpbiBvYmplY3QgbWVtb3J5IGlzIGNvbmNlcm5lZC4gIFRoZSBzaXplCi0JCSBvZiB0aGUgb2JqZWN0IGluIG9iamVjdG1lbW9yeSBpcyBub3QgZXhwbGljaXRseQotCQkgZ2l2ZW4uICBJZiB0aGUgb2JqZWN0IGlzIGRlZmluZWQgaXRzIGxlbmd0aCBjYW4gYmUKLQkJIGRldGVybWluZWQgYW5kIGEgZml4IGNhbiByZXBsYWNlIHRoZSBmcmFnLiAqLwotCSAgICAgIHsKLQkJZXZhbHVhdGVfZXhwciAoJmV4cHJQLCAoY2hhciAqKSBpaWYuaWlmUFtpXS5vYmplY3QpOwotCQlpZiAoKGV4cHJQLlhfYWRkX3N5bWJvbCB8fCBleHByUC5YX29wX3N5bWJvbCkgJiYKLQkJICAgICFpaWYuaWlmUFtpXS5wY3JlbCkKLQkJICB7Ci0JCSAgICAvKiBTaXplIGlzIHVua25vd24gdW50aWwgbGluayB0aW1lIHNvIGhhdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgNCBieXRlcy4gKi8KLQkJICAgIHNpemUgPSA0OwotCQkgICAgbWVtUCA9IGZyYWdfbW9yZShzaXplKTsKLQkJICAgIGZpeF9uZXdfbnMzMmtfZXhwIChmcmFnX25vdywKLQkJCQkgICAgICAgKGxvbmcpIChtZW1QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLAotCQkJCSAgICAgICBzaXplLAotCQkJCSAgICAgICAmZXhwclAsCi0JCQkJICAgICAgIDAsIC8qIG5ldmVyIGlpZi5paWZQW2ldLnBjcmVsLCAqLwotCQkJCSAgICAgICAxLCAvKiBhbHdheXMgaWlmLmlpZlBbaV0uaW1fZGlzcCAqLwotCQkJCSAgICAgICAoYml0X2ZpeFMgKikgMCwgMCwKLQkJCQkgICAgICAgaW5zdF9mcmFnLAotCQkJCSAgICAgICBpbnN0X29mZnNldCk7Ci0JCSAgICBicmVhazsJCS8qIGV4aXQgdGhpcyBhYnNvbHV0ZSBoYWNrICovCi0JCSAgfQotCi0JCWlmIChleHByUC5YX2FkZF9zeW1ib2wgfHwgZXhwclAuWF9vcF9zeW1ib2wpCi0JCSAgewkJCS8qIGZyYWcgaXQgKi8KLQkJICAgIGlmIChleHByUC5YX29wX3N5bWJvbCkKLQkJICAgICAgewkJCS8qIFdlIGNhbnQgcmVsYXggdGhpcyBjYXNlICovCi0JCQlhc19mYXRhbCAoXygiQ2FuJ3QgcmVsYXggZGlmZmVyZW5jZSIpKTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0KLQkJCS8qIFNpemUgaXMgbm90IGltcG9ydGFudC4gVGhpcyBnZXRzIGZpeGVkIGJ5IHJlbGF4LAotCQkJICogYnV0IHdlIGFzc3VtZSAwIGluIHdoYXQgZm9sbG93cwotCQkJICovCi0JCQltZW1QID0gZnJhZ19tb3JlKDQpOyAvKiBNYXggc2l6ZSAqLwotCQkJc2l6ZSA9IDA7Ci0KLQkJCXsKLQkJCSAgZnJhZ1MgKm9sZF9mcmFnID0gZnJhZ19ub3c7Ci0JCQkgIGZyYWdfdmFyaWFudCAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCQkJCTQsIC8qIE1heCBzaXplICovCi0JCQkJCTAsIC8qIHNpemUgKi8KLQkJCQkJSU5EIChCUkFOQ0gsIFVOREVGKSwgLyogZXhwZWN0aW5nIHRoZSB3b3JzdCAqLwotCQkJCQlleHByUC5YX2FkZF9zeW1ib2wsCi0JCQkJCWV4cHJQLlhfYWRkX251bWJlciwKLQkJCQkJaW5zdF9vcGNvZGUpOwotCQkJICBmcmFnX29wY29kZV9mcmFnKG9sZF9mcmFnKSA9IGluc3RfZnJhZzsKLQkJCSAgZnJhZ19vcGNvZGVfb2Zmc2V0KG9sZF9mcmFnKSA9IGluc3Rfb2Zmc2V0OwotCQkJICBmcmFnX2JzcihvbGRfZnJhZykgPSBpaWYuaWlmUFtpXS5ic3I7Ci0JCQl9Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiBUaGlzIGR1cGxpY2F0ZXMgY29kZSBpbiBtZF9udW1iZXJfdG9fZGlzcCAqLwotCQkgICAgaWYgKC02NCA8PSBleHByUC5YX2FkZF9udW1iZXIgJiYgZXhwclAuWF9hZGRfbnVtYmVyIDw9IDYzKQotCQkgICAgICB7Ci0JCQlzaXplID0gMTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlpZiAoLTgxOTIgPD0gZXhwclAuWF9hZGRfbnVtYmVyCi0JCQkgICAgJiYgZXhwclAuWF9hZGRfbnVtYmVyIDw9IDgxOTEpCi0JCQkgIHsKLQkJCSAgICBzaXplID0gMjsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaWYgKC0weDIwMDAwMDAwPD1leHByUC5YX2FkZF9udW1iZXIgJiYKLQkJCQlleHByUC5YX2FkZF9udW1iZXI8PTB4MWZmZmZmZmYpCi0JCQkgICAgICB7Ci0JCQkJc2l6ZSA9IDQ7Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZQotCQkJICAgICAgewotCQkJCWFzX3dhcm4gKF8oIkRpc3BsYWNlbWVudCB0byBsYXJnZSBmb3IgOmQiKSk7Ci0JCQkJc2l6ZSA9IDQ7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgbWVtUCA9IGZyYWdfbW9yZShzaXplKTsKLQkJICAgIG1kX251bWJlcl90b19kaXNwIChtZW1QLCBleHByUC5YX2FkZF9udW1iZXIsIHNpemUpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oIkludGVybmFsIGxvZ2ljIGVycm9yIGluIGlpZi5paWZQW10udHlwZSIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0MCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotLyogVGhpcyBmdW5jdGlvbmFsaXR5IHNob3VsZCByZWFsbHkgYmUgaW4gdGhlIGJmZCBsaWJyYXJ5ICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1yZWxvYyAoaW50IHNpemUsIGludCBwY3JlbCwgaW50IHR5cGUpCi17Ci0gIGludCBsZW5ndGgsIGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NzW10gPSB7Ci0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV84LAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMiwKLSAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwKLSAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMLAotCi0gICAgLyogbnMzMmsgZGlzcGxhY2VtZW50cyAqLwotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzIsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwKLSAgICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwKLSAgICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwKLQotICAgIC8qIE5vcm1hbCAyJ3MgY29tcGxlbWVudCAqLwotICAgIEJGRF9SRUxPQ184LAotICAgIEJGRF9SRUxPQ18xNiwKLSAgICBCRkRfUkVMT0NfMzIsCi0gICAgQkZEX1JFTE9DXzhfUENSRUwsCi0gICAgQkZEX1JFTE9DXzE2X1BDUkVMLAotICAgIEJGRF9SRUxPQ18zMl9QQ1JFTAotICAgIH07Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgbGVuZ3RoID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGxlbmd0aCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBsZW5ndGggPSAyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGxlbmd0aCA9IC0xOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpbmRleCA9IGxlbmd0aCArIDMgKiBwY3JlbCArIDYgKiB0eXBlOwotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemVvZihyZWxvY3MpL3NpemVvZihyZWxvY3NbMF0pKQotICAgIHJldHVybiByZWxvY3NbaW5kZXhdOwotICBpZiAocGNyZWwpCi0gICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3Igc3RvcmFnZSB0eXBlICVkIiksCi0JICAgIHNpemUsIHR5cGUpOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiBmb3Igc3RvcmFnZSB0eXBlICVkIiksCi0JICAgIHNpemUsIHR5cGUpOwotICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Ci0KLX0KLQotI2VuZGlmCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChsaW5lKQotICAgICBjaGFyICpsaW5lOwotewotICBmcmVlcHRyID0gZnJlZXB0cl9zdGF0aWM7Ci0gIHBhcnNlIChsaW5lLCAwKTsJCS8qIGV4cGxvZGUgbGluZSB0byBtb3JlIGZpeCBmb3JtIGluIGlpZiAqLwotICBjb252ZXJ0X2lpZiAoKTsJCS8qIGNvbnZlcnQgaWlmIHRvIGZyYWdzLCBmaXgncyBldGMgKi8KLSNpZmRlZiBTSE9XX05VTQotICBwcmludGYgKCIgXHRcdFx0JXNcbiIsIGxpbmUpOwotI2VuZGlmCi19Ci0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgLyogYnVpbGQgYSBoYXNodGFibGUgb2YgdGhlIGluc3RydWN0aW9ucyAqLwotICBjb25zdCBzdHJ1Y3QgbnMzMmtfb3Bjb2RlICpwdHI7Ci0gIGNvbnN0IGNoYXIgKnN0YXQ7Ci0gIGluc3RfaGFzaF9oYW5kbGUgPSBoYXNoX25ldyAoKTsKLSAgZm9yIChwdHIgPSBuczMya19vcGNvZGVzOyBwdHIgPCBlbmRvcDsgcHRyKyspCi0gICAgewotICAgICAgaWYgKChzdGF0ID0gaGFzaF9pbnNlcnQgKGluc3RfaGFzaF9oYW5kbGUsIHB0ci0+bmFtZSwgKGNoYXIgKikgcHRyKSkpCi0JewotCSAgYXNfZmF0YWwgKF8oIkNhbid0IGhhc2ggJXM6ICVzIiksIHB0ci0+bmFtZSwgc3RhdCk7CS8qZmF0YWwqLwotCX0KLSAgICB9Ci0gIGZyZWVwdHJfc3RhdGljID0gKGNoYXIgKikgbWFsbG9jIChQUklWQVRFX1NJWkUpOyAvKiBzb21lIHByaXZhdGUgc3BhY2UKLQkJCQkJCSAgICAgIHBsZWFzZSEgKi8KLX0KLQotLyogTXVzdCBiZSBlcXVhbCB0byBNQVhfUFJFQ0lTT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBsaXRQIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSB0eXBlLCBhbmQgZW1pdCB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMuICBUaGUgbnVtYmVyIG9mCi0gICBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzICsgcHJlYzsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKi0td29yZFApLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBDb252ZXJ0IG51bWJlciB0byBjaGFycyBpbiBjb3JyZWN0IG9yZGVyICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotCi0vKiBUaGlzIGlzIGEgdmFyaWFudCBvZiBtZF9udW1iZXJzX3RvX2NoYXJzLiBUaGUgcmVhc29uIGZvciBpdHMnCi0gICBleGlzdGVuY2UgaXMgdGhlIGZhY3QgdGhhdCBuczMyayB1c2VzIEh1ZmZtYW4gY29kZWQKLSAgIGRpc3BsYWNlbWVudHMuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBiaXQgb3JkZXIgaXMgcmV2ZXJzZWQgaW4KLSAgIGRpc3BsYWNlbWVudHMgYW5kIHRoYXQgdGhleSBhcmUgcHJlZml4ZWQgd2l0aCBhIHNpemUtdGFnLgotCi0gICBiaW5hcnk6IG1zYiAtPiBsc2IKLSAgIDB4eHh4eHh4CQkJCWJ5dGUKLSAgIDEweHh4eHh4IHh4eHh4eHh4CQkJd29yZAotICAgMTF4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHgJZG91YmxlIHdvcmQKLQotICAgVGhpcyBtdXN0IGJlIHRha2VuIGNhcmUgb2YgYW5kIHdlIGRvIGl0IGhlcmUhICAqLwotc3RhdGljIHZvaWQKLW1kX251bWJlcl90b19kaXNwIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgY2hhciBuOwotewotICBzd2l0Y2ggKG4pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGlmICh2YWwgPCAtNjQgfHwgdmFsID4gNjMpCi0JYXNfd2FybiAoXygiQnl0ZSBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlLiAgbGluZSBudW1iZXIgbm90IHZhbGlkIikpOwotICAgICAgdmFsICY9IDB4N2Y7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAodmFsIDwgLTgxOTIgfHwgdmFsID4gODE5MSkKLQlhc193YXJuIChfKCJXb3JkIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UuICBsaW5lIG51bWJlciBub3QgdmFsaWQiKSk7Ci0gICAgICB2YWwgJj0gMHgzZmZmOwotICAgICAgdmFsIHw9IDB4ODAwMDsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGlmICh2YWwgPCAtMHgyMDAwMDAwMCB8fCB2YWwgPj0gMHgyMDAwMDAwMCkKLQlhc193YXJuIChfKCJEb3VibGUgd29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlIikpOwotICAgICAgdmFsIHw9IDB4YzAwMDAwMDA7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiAyNCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDE2ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gOCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBsb2dpYyBlcnJvci4gIGxpbmUgJXMsIGZpbGUgXCIlc1wiIiksCi0JCV9fTElORV9fLCBfX0ZJTEVfXyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGNoYXIgbjsKLXsKLSAgc3dpdGNoIChuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiA4ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiAyNCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDE2ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gOCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBsb2dpYyBlcnJvci4gbGluZSAlcywgZmlsZSBcIiVzXCIiKSwKLQkJX19MSU5FX18sIF9fRklMRV9fKTsKLSAgICB9Ci19Ci0KLQotLyogZmFzdCBiaXRmaWRkbGluZyBzdXBwb3J0ICovCi0vKiBtYXNrIHVzZWQgdG8gemVybyBiaXRmaWVsZCBiZWZvcmUgb3JpbmcgaW4gdGhlIHRydWUgZmllbGQgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbF9tYXNrW10gPQotewotICAweGZmZmZmZmZmLCAweGZmZmZmZmZlLCAweGZmZmZmZmZjLCAweGZmZmZmZmY4LAotICAweGZmZmZmZmYwLCAweGZmZmZmZmUwLCAweGZmZmZmZmMwLCAweGZmZmZmZjgwLAotICAweGZmZmZmZjAwLCAweGZmZmZmZTAwLCAweGZmZmZmYzAwLCAweGZmZmZmODAwLAotICAweGZmZmZmMDAwLCAweGZmZmZlMDAwLCAweGZmZmZjMDAwLCAweGZmZmY4MDAwLAotICAweGZmZmYwMDAwLCAweGZmZmUwMDAwLCAweGZmZmMwMDAwLCAweGZmZjgwMDAwLAotICAweGZmZjAwMDAwLCAweGZmZTAwMDAwLCAweGZmYzAwMDAwLCAweGZmODAwMDAwLAotICAweGZmMDAwMDAwLCAweGZlMDAwMDAwLCAweGZjMDAwMDAwLCAweGY4MDAwMDAwLAotICAweGYwMDAwMDAwLCAweGUwMDAwMDAwLCAweGMwMDAwMDAwLCAweDgwMDAwMDAwLAotfTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJfbWFza1tdID0KLXsKLSAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMywgMHgwMDAwMDAwNywKLSAgMHgwMDAwMDAwZiwgMHgwMDAwMDAxZiwgMHgwMDAwMDAzZiwgMHgwMDAwMDA3ZiwKLSAgMHgwMDAwMDBmZiwgMHgwMDAwMDFmZiwgMHgwMDAwMDNmZiwgMHgwMDAwMDdmZiwKLSAgMHgwMDAwMGZmZiwgMHgwMDAwMWZmZiwgMHgwMDAwM2ZmZiwgMHgwMDAwN2ZmZiwKLSAgMHgwMDAwZmZmZiwgMHgwMDAxZmZmZiwgMHgwMDAzZmZmZiwgMHgwMDA3ZmZmZiwKLSAgMHgwMDBmZmZmZiwgMHgwMDFmZmZmZiwgMHgwMDNmZmZmZiwgMHgwMDdmZmZmZiwKLSAgMHgwMGZmZmZmZiwgMHgwMWZmZmZmZiwgMHgwM2ZmZmZmZiwgMHgwN2ZmZmZmZiwKLSAgMHgwZmZmZmZmZiwgMHgxZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHg3ZmZmZmZmZiwKLX07Ci0jZGVmaW5lIE1BU0tfQklUUyAzMQotLyogSW5zZXJ0IGJpdGZpZWxkIGRlc2NyaWJlZCBieSBmaWVsZF9wdHIgYW5kIHZhbCBhdCBidWYKLSAgIFRoaXMgcm91dGluZSBpcyB3cml0dGVuIGZvciBtb2RpZmljYXRpb24gb2YgdGhlIGZpcnN0IDQgYnl0ZXMgcG9pbnRlZAotICAgdG8gYnkgYnVmLCB0byB5aWVsZCBzcGVlZC4KLSAgIFRoZSBpZmRlZiBzdHVmZiBpcyBmb3Igc2VsZWN0aW9uIGJldHdlZW4gYSBuczMyay1kZXBlbmRlbnQgcm91dGluZQotICAgYW5kIGEgZ2VuZXJhbCB2ZXJzaW9uLiAoTXkgYWR2aWNlOiB1c2UgdGhlIGdlbmVyYWwgdmVyc2lvbiEpCi0gICAqLwotCi1zdGF0aWMgdm9pZAotbWRfbnVtYmVyX3RvX2ZpZWxkIChidWYsIHZhbCwgZmllbGRfcHRyKQotICAgICByZWdpc3RlciBjaGFyICpidWY7Ci0gICAgIHJlZ2lzdGVyIGxvbmcgdmFsOwotICAgICByZWdpc3RlciBiaXRfZml4UyAqZmllbGRfcHRyOwotewotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG9iamVjdDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtYXNrOwotICAvKiBkZWZpbmUgRU5ESUFOIG9uIGEgbnMzMmsgbWFjaGluZSAqLwotI2lmZGVmIEVORElBTgotICByZWdpc3RlciB1bnNpZ25lZCBsb25nICptZW1fcHRyOwotI2Vsc2UKLSAgcmVnaXN0ZXIgY2hhciAqbWVtX3B0cjsKLSNlbmRpZgotICBpZiAoZmllbGRfcHRyLT5meF9iaXRfbWluIDw9IHZhbCAmJiB2YWwgPD0gZmllbGRfcHRyLT5meF9iaXRfbWF4KQotICAgIHsKLSNpZmRlZiBFTkRJQU4KLSAgICAgIGlmIChmaWVsZF9wdHItPmZ4X2JpdF9iYXNlKQotCXsJCQkvKiBvdmVycmlkZSBidWYgKi8KLQkgIG1lbV9wdHIgPSAodW5zaWduZWQgbG9uZyAqKSBmaWVsZF9wdHItPmZ4X2JpdF9iYXNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1fcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgYnVmOwotCX0KLSAgICAgIG1lbV9wdHIgPSAoKHVuc2lnbmVkIGxvbmcgKikKLQkJICgoY2hhciAqKSBtZW1fcHRyICsgZmllbGRfcHRyLT5meF9iaXRfYmFzZV9hZGopKTsKLSNlbHNlCi0gICAgICBpZiAoZmllbGRfcHRyLT5meF9iaXRfYmFzZSkKLQl7CQkJLyogb3ZlcnJpZGUgYnVmICovCi0JICBtZW1fcHRyID0gKGNoYXIgKikgZmllbGRfcHRyLT5meF9iaXRfYmFzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtX3B0ciA9IGJ1ZjsKLQl9Ci0gICAgICBtZW1fcHRyICs9IGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2VfYWRqOwotI2VuZGlmCi0jaWZkZWYgRU5ESUFOCQkJLyogd2UgaGF2ZSBhIG5pY2UgbnMzMmsgbWFjaGluZSB3aXRoIGxvd2J5dGUKLQkJCQkgICBhdCBsb3ctcGh5c2ljYWwgbWVtICovCi0gICAgICBvYmplY3QgPSAqbWVtX3B0cjsJLyogZ2V0IHNvbWUgYnl0ZXMgKi8KLSNlbHNlIC8qIE9WRSBHb29mISB0aGUgbWFjaGluZSBpcyBhIG02OGsgb3IgZGl0byAqLwotICAgICAgLyogVGhhdCB0YWtlcyBtb3JlIGJ5dGUgZmlkZGxpbmcgKi8KLSAgICAgIG9iamVjdCA9IDA7Ci0gICAgICBvYmplY3QgfD0gbWVtX3B0clszXSAmIDB4ZmY7Ci0gICAgICBvYmplY3QgPDw9IDg7Ci0gICAgICBvYmplY3QgfD0gbWVtX3B0clsyXSAmIDB4ZmY7Ci0gICAgICBvYmplY3QgPDw9IDg7Ci0gICAgICBvYmplY3QgfD0gbWVtX3B0clsxXSAmIDB4ZmY7Ci0gICAgICBvYmplY3QgPDw9IDg7Ci0gICAgICBvYmplY3QgfD0gbWVtX3B0clswXSAmIDB4ZmY7Ci0jZW5kaWYKLSAgICAgIG1hc2sgPSAwOwotICAgICAgbWFzayB8PSAocl9tYXNrW2ZpZWxkX3B0ci0+ZnhfYml0X29mZnNldF0pOwotICAgICAgbWFzayB8PSAobF9tYXNrW2ZpZWxkX3B0ci0+ZnhfYml0X29mZnNldCArIGZpZWxkX3B0ci0+ZnhfYml0X3NpemVdKTsKLSAgICAgIG9iamVjdCAmPSBtYXNrOwotICAgICAgdmFsICs9IGZpZWxkX3B0ci0+ZnhfYml0X2FkZDsKLSAgICAgIG9iamVjdCB8PSAoKHZhbCA8PCBmaWVsZF9wdHItPmZ4X2JpdF9vZmZzZXQpICYgKG1hc2sgXiAweGZmZmZmZmZmKSk7Ci0jaWZkZWYgRU5ESUFOCi0gICAgICAqbWVtX3B0ciA9IG9iamVjdDsKLSNlbHNlCi0gICAgICBtZW1fcHRyWzBdID0gKGNoYXIpIG9iamVjdDsKLSAgICAgIG9iamVjdCA+Pj0gODsKLSAgICAgIG1lbV9wdHJbMV0gPSAoY2hhcikgb2JqZWN0OwotICAgICAgb2JqZWN0ID4+PSA4OwotICAgICAgbWVtX3B0clsyXSA9IChjaGFyKSBvYmplY3Q7Ci0gICAgICBvYmplY3QgPj49IDg7Ci0gICAgICBtZW1fcHRyWzNdID0gKGNoYXIpIG9iamVjdDsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJpdCBmaWVsZCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgfQotfQotCi1pbnQgbWRfcGNyZWxfYWRqdXN0IChmcmFnUyAqZnJhZ1ApCi17Ci0gIGZyYWdTICpvcGNvZGVfZnJhZzsKLSAgYWRkcmVzc1Qgb3Bjb2RlX2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gIG9wY29kZV9mcmFnID0gZnJhZ19vcGNvZGVfZnJhZyhmcmFnUCk7Ci0gIGlmIChvcGNvZGVfZnJhZyA9PSAwKQotICAgIHJldHVybiAwOwotICBvZmZzZXQgPSBmcmFnX29wY29kZV9vZmZzZXQoZnJhZ1ApOwotICBvcGNvZGVfYWRkcmVzcyA9IG9mZnNldCArIG9wY29kZV9mcmFnLT5mcl9hZGRyZXNzOwotICByZXR1cm4gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4IC0gb3Bjb2RlX2FkZHJlc3M7Ci19Ci0KLWludCBtZF9maXhfcGNyZWxfYWRqdXN0IChmaXhTICpmaXhQKQotewotICBmcmFnUyAqZnJhZ1AgPSBmaXhQLT5meF9mcmFnOwotICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gIGFkZHJlc3NUIG9wY29kZV9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICBvcGNvZGVfZnJhZyA9IGZpeF9vcGNvZGVfZnJhZyhmaXhQKTsKLSAgaWYgKG9wY29kZV9mcmFnID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIG9mZnNldCA9IGZpeF9vcGNvZGVfb2Zmc2V0KGZpeFApOwotICBvcGNvZGVfYWRkcmVzcyA9IG9mZnNldCArIG9wY29kZV9mcmFnLT5mcl9hZGRyZXNzOwotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzIC0gb3Bjb2RlX2FkZHJlc3M7Ci19Ci0KLS8qIEFwcGx5IGEgZml4UyAoZml4dXAgb2YgYW4gaW5zdHJ1Y3Rpb24gb3IgZGF0YSB0aGF0IHdlIGRpZG4ndCBoYXZlCi0gICBlbm91Z2ggaW5mbyB0byBjb21wbGV0ZSBpbW1lZGlhdGVseSkgdG8gdGhlIGRhdGEgaW4gYSBmcmFnLgotCi0gICBPbiB0aGUgbnMzMmssIGV2ZXJ5dGhpbmcgaXMgaW4gYSBkaWZmZXJlbnQgZm9ybWF0LCBzbyB3ZSBoYXZlIGJyb2tlbgotICAgb3V0IHNlcGFyYXRlIGZ1bmN0aW9ucyBmb3IgZWFjaCBraW5kIG9mIHRoaW5nIHdlIGNvdWxkIGJlIGZpeGluZy4KLSAgIFRoZXkgYWxsIGdldCBjYWxsZWQgZnJvbSBoZXJlLiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci0jZWxzZQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotI2VuZGlmCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBsb25nIHZhbCA9ICp2YWxwOwotI2VuZGlmCi0gIGZyYWdTICpmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7Ci0KLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIGlmIChmaXhfYml0X2ZpeFAoZml4UCkpCi0gICAgewkJCQkvKiBCaXRmaWVsZHMgdG8gZml4LCBzaWdoICovCi0gICAgICBtZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBmaXhfYml0X2ZpeFAoZml4UCkpOwotICAgIH0KLSAgZWxzZQotICAgIHN3aXRjaCAoZml4X2ltX2Rpc3AoZml4UCkpCi0gICAgICB7Ci0KLSAgICAgIGNhc2UgMDoJCQkvKiBJbW1lZGlhdGUgZmllbGQgKi8KLQltZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgMToJCQkvKiBEaXNwbGFjZW1lbnQgZmllbGQgKi8KLQkvKiBDYWxjdWxhdGUgb2Zmc2V0ICovCi0JewotCW1kX251bWJlcl90b19kaXNwIChidWYsCi0JCQkgICAoZml4UC0+ZnhfcGNyZWwgPyB2YWwgKyBtZF9maXhfcGNyZWxfYWRqdXN0KGZpeFApCi0JCQkgICAgOiB2YWwpLCBmaXhQLT5meF9zaXplKTsKLQl9Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoJCQkvKiBQb2ludGVyIGluIGEgZGF0YSBvYmplY3QgKi8KLQltZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBmaXhQLT5meF9zaXplKTsKLQlicmVhazsKLSAgICAgIH0KLSNpZmRlZiBCU0RfQVNTRU1CTEVSCi0gIHJldHVybiAxOwotI2VuZGlmCi19Ci0MCi0vKiBDb252ZXJ0IGEgcmVsYXhlZCBkaXNwbGFjZW1lbnQgdG8gZGl0dG8gaW4gZmluYWwgb3V0cHV0ICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWMsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbHNlCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICBsb25nIGRpc3A7Ci0gIGxvbmcgZXh0ID0gMDsKLQotICAvKiBBZGRyZXNzIGluIGdhcyBjb3JlIG9mIHRoZSBwbGFjZSB0byBzdG9yZSB0aGUgZGlzcGxhY2VtZW50LiAgKi8KLSAgcmVnaXN0ZXIgY2hhciAqYnVmZmVyX2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWw7Ci0gIC8qIEFkZHJlc3MgaW4gb2JqZWN0IGNvZGUgb2YgdGhlIGRpc3BsYWNlbWVudC4gICovCi0gIGludCBvYmplY3RfYWRkcmVzczsKLQotICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBJTkQgKEJSQU5DSCwgQllURSk6Ci0gICAgICBleHQgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTkQgKEJSQU5DSCwgV09SRCk6Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTkQgKEJSQU5DSCwgRE9VQkxFKToKLSAgICAgIGV4dCA9IDQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYoZXh0ID09IDApCi0gICAgcmV0dXJuOwotCi0gIGtub3cgKGZyYWdQLT5mcl9zeW1ib2wpOwotCi0gIG9iamVjdF9hZGRyZXNzID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOwotICAvKiBUaGUgZGlzcGxhY2VtZW50IG9mIHRoZSBhZGRyZXNzLCBmcm9tIGN1cnJlbnQgbG9jYXRpb24uICAqLwotICBkaXNwID0gKFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArIGZyYWdQLT5mcl9vZmZzZXQpIC0gb2JqZWN0X2FkZHJlc3M7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBkaXNwICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLSAgZGlzcCArPSBtZF9wY3JlbF9hZGp1c3QoZnJhZ1ApOwotCi0gIG1kX251bWJlcl90b19kaXNwIChidWZmZXJfYWRkcmVzcywgKGxvbmcpIGRpc3AsIChpbnQpIGV4dCk7Ci0gIGZyYWdQLT5mcl9maXggKz0gZXh0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVzdGltYXRlZCBzaXplIGEgdmFyaWFibGUgb2JqZWN0IHdpbGwgb2NjdXB5LAotICAgb25lIGNhbiBzYXkgdGhhdCB3ZSB0cmllcyB0byBndWVzcyB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBiZWZvcmUgd2UKLSAgIGFjdHVhbGx5IGtub3cgaXQgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBpbnQgb2xkX2ZpeDsKLSAgb2xkX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgSU5EIChCUkFOQ0gsIFVOREVGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsKLQkgIC8qIHRoZSBzeW1ib2wgaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBJTkQgKEJSQU5DSCwgQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHdlIGRvbid0IHJlbGF4IHN5bWJvbHMgZGVmaW5lZCBpbiBhbiBvdGhlciBzZWdtZW50IHRoZQotCSAgICAgdGhpbmcgdG8gZG8gaXMgdG8gYXNzdW1lIHRoZSBvYmplY3Qgd2lsbCBvY2N1cHkgNCBieXRlcyAqLwotCSAgZml4X25ld19uczMyayAoZnJhZ1AsCi0JCQkgKGludCkgKGZyYWdQLT5mcl9maXgpLAotCQkJIDQsCi0JCQkgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJCSBmcmFnUC0+ZnJfb2Zmc2V0LAotCQkJIDEsCi0JCQkgMSwKLQkJCSAwLAotCQkJIGZyYWdfYnNyKGZyYWdQKSwgLypzZXF1ZW50IGhhY2sgKi8KLQkJCSBmcmFnX29wY29kZV9mcmFnKGZyYWdQKSwKLQkJCSBmcmFnX29wY29kZV9vZmZzZXQoZnJhZ1ApKTsKLQkgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgIC8qIGZyYWdQLT5mcl9vcGNvZGVbMV09MHhmZjsgKi8KLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgYnJlYWs7Ci0JfQotICAgIGNhc2UgSU5EIChCUkFOQ0gsIEJZVEUpOgotICAgICAgZnJhZ1AtPmZyX3ZhciArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZpeDsKLX0KLQotaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDM7Ci1pbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA1OwotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gZnJvbV9hZGRyOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhFQSwgMSk7Ci0gIG1kX251bWJlcl90b19kaXNwIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDIpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gZnJvbV9hZGRyOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhFQSwgMSk7Ci0gIG1kX251bWJlcl90b19kaXNwIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIm06IjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdtJzoKLSAgICAgIGlmICghc3RyY21wIChhcmcsICIzMjAzMiIpKQotCXsKLQkgIGNwdXJlZyA9IGNwdXJlZ18wMzI7Ci0JICBtbXVyZWcgPSBtbXVyZWdfMDMyOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIjMyNTMyIikpCi0JewotCSAgY3B1cmVnID0gY3B1cmVnXzUzMjsKLQkgIG1tdXJlZyA9IG1tdXJlZ181MzI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgb3B0aW9uIC1tJXMiKSwgYXJnKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1OUzMySyBvcHRpb25zOlxuXAotLW0zMjAzMiB8IC1tMzI1MzIJc2VsZWN0IHZhcmlhbnQgb2YgTlMzMksgYXJjaGl0ZWN0dXJlXG4iKSk7Ci19Ci0KLQwKLS8qCi0gKgkJCWJpdF9maXhfbmV3KCkKLSAqCi0gKiBDcmVhdGUgYSBiaXRfZml4UyBpbiBvYnN0YWNrICdub3RlcycuCi0gKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIHByb2ZpbGUgdGhlIG5vcm1hbCBmaXguIElmIHRoZSBiaXRfZml4UCBpcyBhCi0gKiB2YWxpZCBwb2ludGVyIChub3QgTlVMTCkgdGhlIGJpdF9maXggZGF0YSB3aWxsIGJlIHVzZWQgdG8gZm9ybWF0IHRoZSBmaXguCi0gKi8KLWJpdF9maXhTICoKLWJpdF9maXhfbmV3IChzaXplLCBvZmZzZXQsIG1pbiwgbWF4LCBhZGQsIGJhc2VfdHlwZSwgYmFzZV9hZGopCi0gICAgIGNoYXIgc2l6ZTsJCQkvKiBMZW5ndGggb2YgYml0ZmllbGQJCSovCi0gICAgIGNoYXIgb2Zmc2V0OwkJLyogQml0IG9mZnNldCB0byBiaXRmaWVsZAkqLwotICAgICBsb25nIG1pbjsJCQkvKiBTaWduZXh0ZW5kZWQgbWluIGZvciBiaXRmaWVsZCAqLwotICAgICBsb25nIG1heDsJCQkvKiBTaWduZXh0ZW5kZWQgbWF4IGZvciBiaXRmaWVsZCAqLwotICAgICBsb25nIGFkZDsJCQkvKiBBZGQgbWFzaywgdXNlZCBmb3IgaHVmZm1hbiBwcmVmaXggKi8KLSAgICAgbG9uZyBiYXNlX3R5cGU7CQkvKiAwIG9yIDEsIGlmIDEgaXQncyBleHBsb2RlZCB0byBvcGNvZGUgcHRyICovCi0gICAgIGxvbmcgYmFzZV9hZGo7Ci17Ci0gIHJlZ2lzdGVyIGJpdF9maXhTICpiaXRfZml4UDsKLQotICBiaXRfZml4UCA9IChiaXRfZml4UyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoYml0X2ZpeFMpKTsKLQotICBiaXRfZml4UC0+ZnhfYml0X3NpemUgPSBzaXplOwotICBiaXRfZml4UC0+ZnhfYml0X29mZnNldCA9IG9mZnNldDsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9iYXNlID0gYmFzZV90eXBlOwotICBiaXRfZml4UC0+ZnhfYml0X2Jhc2VfYWRqID0gYmFzZV9hZGo7Ci0gIGJpdF9maXhQLT5meF9iaXRfbWF4ID0gbWF4OwotICBiaXRfZml4UC0+ZnhfYml0X21pbiA9IG1pbjsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9hZGQgPSBhZGQ7Ci0KLSAgcmV0dXJuIChiaXRfZml4UCk7Ci19Ci0KLXZvaWQKLWZpeF9uZXdfbnMzMmsgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLCBvZmZzZXQsIHBjcmVsLAotCSAgICAgICBpbV9kaXNwLCBiaXRfZml4UCwgYnNyLCBvcGNvZGVfZnJhZywgb3Bjb2RlX29mZnNldCkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyICBvciA0IHVzdWFsbHkuICovCi0gICAgIHN5bWJvbFMgKmFkZF9zeW1ib2w7CS8qIFhfYWRkX3N5bWJvbC4gKi8KLSAgICAgbG9uZyBvZmZzZXQ7CQkvKiBYX2FkZF9udW1iZXIuICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gICAgIGNoYXIgaW1fZGlzcDsJCS8qIHRydWUgaWYgdGhlIHZhbHVlIHRvIHdyaXRlIGlzIGEKLQkJCQkgICBkaXNwbGFjZW1lbnQgKi8KLSAgICAgYml0X2ZpeFMgKmJpdF9maXhQOwkvKiBwb2ludGVyIGF0IHN0cnVjdCBvZiBiaXRfZml4J3MsIGlnbm9yZWQgaWYKLQkJCQkgICBOVUxMICovCi0gICAgIGNoYXIgYnNyOwkJCS8qIHNlcXVlbnQtbGlua2VyLWhhY2s6IDEgd2hlbiByZWxvY29iamVjdCBpcwotCQkJCSAgIGEgYnNyICovCi0gICAgIGZyYWdTICpvcGNvZGVfZnJhZzsKLSAgICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQ7Ci0KLXsKLSAgZml4UyAqZml4UCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLAotCQkJb2Zmc2V0LCBwY3JlbCwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JCQliaXRfZml4UD8gTk9fUkVMT0M6IHJlbG9jKHNpemUsIHBjcmVsLCBpbV9kaXNwKQotI2Vsc2UKLQkJCU5PX1JFTE9DCi0jZW5kaWYKLQkJCSk7Ci0KLSAgZml4X29wY29kZV9mcmFnKGZpeFApID0gb3Bjb2RlX2ZyYWc7Ci0gIGZpeF9vcGNvZGVfb2Zmc2V0KGZpeFApID0gb3Bjb2RlX29mZnNldDsKLSAgZml4X2ltX2Rpc3AoZml4UCkgPSBpbV9kaXNwOwotICBmaXhfYnNyKGZpeFApID0gYnNyOwotICBmaXhfYml0X2ZpeFAoZml4UCkgPSBiaXRfZml4UDsKLX0JCQkJLyogZml4X25ld19uczMyaygpICovCi0KLXZvaWQKLWZpeF9uZXdfbnMzMmtfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwKLQkJICAgaW1fZGlzcCwgYml0X2ZpeFAsIGJzciwgb3Bjb2RlX2ZyYWcsIG9wY29kZV9vZmZzZXQpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBleHByZXNzaW9uUyAqZXhwOwkJLyogRXhwcmVzc2lvbi4gKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgICAgY2hhciBpbV9kaXNwOwkJLyogdHJ1ZSBpZiB0aGUgdmFsdWUgdG8gd3JpdGUgaXMgYQotCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotICAgICBiaXRfZml4UyAqYml0X2ZpeFA7CS8qIHBvaW50ZXIgYXQgc3RydWN0IG9mIGJpdF9maXgncywgaWdub3JlZCBpZgotCQkJCSAgIE5VTEwgKi8KLSAgICAgY2hhciBic3I7CQkJLyogc2VxdWVudC1saW5rZXItaGFjazogMSB3aGVuIHJlbG9jb2JqZWN0IGlzCi0JCQkJICAgYSBic3IgKi8KLSAgICAgZnJhZ1MgKm9wY29kZV9mcmFnOwotICAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldDsKLXsKLSAgZml4UyAqZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JCQkgICAgYml0X2ZpeFA/IE5PX1JFTE9DOiByZWxvYyhzaXplLCBwY3JlbCwgaW1fZGlzcCkKLSNlbHNlCi0JCQkgICAgTk9fUkVMT0MKLSNlbmRpZgotCQkJICAgICk7Ci0KLSAgZml4X29wY29kZV9mcmFnKGZpeFApID0gb3Bjb2RlX2ZyYWc7Ci0gIGZpeF9vcGNvZGVfb2Zmc2V0KGZpeFApID0gb3Bjb2RlX29mZnNldDsKLSAgZml4X2ltX2Rpc3AoZml4UCkgPSBpbV9kaXNwOwotICBmaXhfYnNyKGZpeFApID0gYnNyOwotICBmaXhfYml0X2ZpeFAoZml4UCkgPSBiaXRfZml4UDsKLX0JCQkJLyogZml4X25ld19uczMyaygpICovCi0KLS8qIFRoaXMgaXMgVENfQ09OU19GSVhfTkVXLCBjYWxsZWQgYnkgZW1pdF9leHByIGluIHJlYWQuYy4gICovCi0KLXZvaWQKLWNvbnNfZml4X25ld19uczMyayAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyICBvciA0IHVzdWFsbHkuICovCi0gICAgIGV4cHJlc3Npb25TICpleHA7CQkvKiBFeHByZXNzaW9uLiAqLwotewotICBmaXhfbmV3X25zMzJrX2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwKLQkJICAgICAwLCAyLCAwLCAwLCAwLCAwKTsKLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gc2l6ZTsJCQkvKiBCeXRlIGFsaWdubWVudCBpcyBmaW5lICovCi19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8gIE9uIHRoZQotICAgbnMzMmssIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGxvbmcgcmVzOwotICByZXMgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCi0gIGlmIChmcmFnX2JzcihmaXhQLT5meF9mcmFnKSkKLSAgICByZXMgKz0gMHgxMgkJCS8qIEZPTyBLbHVkZ2UgYWxlcnQhICovCi0jZW5kaWYKLSAgICAgIHJldHVybiByZXM7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLQotICBjb2RlID0gcmVsb2MoZml4cC0+Znhfc2l6ZSwgZml4cC0+ZnhfcGNyZWwsIGZpeF9pbV9kaXNwKGZpeHApKTsKLQotICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIGlmICghcmVsLT5ob3d0bykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQluYW1lID0gXygiPHVua25vd24+Iik7Ci0gICAgICBhc19mYXRhbCAoXygiQ2Fubm90IGZpbmQgcmVsb2NhdGlvbiB0eXBlIGZvciBzeW1ib2wgJXMsIGNvZGUgJWQiKSwKLQkJbmFtZSwgKGludCkgY29kZSk7Ci0gICAgfQotCi0gIHJldHVybiByZWw7Ci19Ci0jZWxzZSAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBPQkpfQU9VVAotdm9pZAotY29uc19maXhfbmV3X25zMzJrICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBzdHJ1Y3QgZml4ICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgLyoKLSAgICogSW46IGxlbmd0aCBvZiByZWxvY2F0aW9uIChvciBvZiBhZGRyZXNzKSBpbiBjaGFyczogMSwgMiBvciA0LgotICAgKiBPdXQ6IEdOVSBMRCByZWxvY2F0aW9uIGxlbmd0aCBjb2RlOiAwLCAxLCBvciAyLgotICAgKi8KLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlICsgNCwKLQkJICAgICAgKChsb25nKSAocl9zeW1ib2xudW0pCi0JCSAgICAgICB8IChsb25nKSAoZml4UC0+ZnhfcGNyZWwgPDwgMjQpCi0JCSAgICAgICB8IChsb25nKSAobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDI1KQotCQkgICAgICAgfCAobG9uZykgKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDI3KQotCQkgICAgICAgfCAobG9uZykgKGZpeF9ic3IoZml4UCkgPDwgMjgpCi0JCSAgICAgICB8IChsb25nKSAoZml4X2ltX2Rpc3AoZml4UCkgPDwgMjkpKSwKLQkJICAgICAgNCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQU9VVCAqLwotI2VuZGlmIC8qIEJGRF9BU1NNRUJMRVIgKi8KLQotLyogZW5kIG9mIHRjLW5zMzJrLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbnMzMmsuaCBiL2dhcy9jb25maWcvdGMtbnMzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljODZlYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW5zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyogdGMtbnMzMmsuaCAtLSBPcGNvZGUgdGFibGUgZm9yIE5hdGlvbmFsIFNlbWkgMzJrIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfTlMzMksKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkwCi0KLSNkZWZpbmUgVENfUENSRUxfQURKVVNUKEYpIG1kX3BjcmVsX2FkanVzdChGKQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBOT19SRUxPQyBCRkRfUkVMT0NfTk9ORQotCi0jZGVmaW5lIFRBUkdFVF9BUkNICQliZmRfYXJjaF9uczMyawotCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQJCS8qIE1heWJlIGRlZmluZWQgaW4gdGUtKi5oICovCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1wYzUzMi1tYWNoIgotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBOT19SRUxPQyAwCi0jZW5kaWYKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAiYml0X2ZpeC5oIgotCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLQotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotI2RlZmluZSBERUZfTU9ERUMgMjAKLSNkZWZpbmUgREVGX01PREVMIDIxCi0jZW5kaWYKLQotI2lmbmRlZiBERUZfTU9ERUMKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZW5kaWYKLQotI2lmbmRlZiBERUZfTU9ERUwKLSNkZWZpbmUgREVGX01PREVMIDIwCi0jZW5kaWYKLQotI2RlZmluZSBNQVhfQVJHUyA0Ci0jZGVmaW5lIEFSR19MRU4gNTAKLQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X25zMzJrCi1leHRlcm4gdm9pZCBmaXhfbmV3X25zMzJrX2V4cCBQQVJBTVMoKGZyYWdTICpmcmFnLAotCQkJCSAgIGludCB3aGVyZSwKLQkJCQkgICBpbnQgc2l6ZSwKLQkJCQkgICBleHByZXNzaW9uUyAqZXhwLAotCQkJCSAgIGludCBwY3JlbCwKLQkJCQkgICBpbnQgaW1fZGlzcCwKLQkJCQkgICBiaXRfZml4UyAqYml0X2ZpeFAsCS8qIHJlYWxseSBiaXRfZml4UyAqLwotCQkJCSAgIGludCBic3IsCi0JCQkJICAgZnJhZ1MgKm9wY29kZV9mcmFnLAotCQkJCSAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0KSk7Ci0KLQotZXh0ZXJuIHZvaWQgZml4X25ld19uczMyayBQQVJBTVMgKChmcmFnUyAqZnJhZywKLQkJCQkgICBpbnQgd2hlcmUsCi0JCQkJICAgaW50IHNpemUsCi0JCQkJICAgc3ltYm9sUyAqYWRkX3N5bWJvbCwKLQkJCQkgICBsb25nIG9mZnNldCwKLQkJCQkgICBpbnQgcGNyZWwsCi0JCQkJICAgaW50IGltX2Rpc3AsCi0JCQkJICAgYml0X2ZpeFMgKmJpdF9maXhQLAkvKiByZWFsbHkgYml0X2ZpeFMgKi8KLQkJCQkgICBpbnQgYnNyLAotCQkJCSAgIGZyYWdTICpvcGNvZGVfZnJhZywKLQkJCQkgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldCkpOwotCi1leHRlcm4gdm9pZCBjb25zX2ZpeF9uZXdfbnMzMmsgUEFSQU1TICgoZnJhZ1MgKmZyYWcsCi0JCQkJCWludCB3aGVyZSwKLQkJCQkJaW50IHNpemUsCi0JCQkJCWV4cHJlc3Npb25TICpleHApKTsKLQotLyogdGhlIE5TMzJ4MzIgaGFzIGEgbm9uIDAgbm9wIGluc3RydWN0aW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGFsaWducyAqLwotI2RlZmluZSBOT1BfT1BDT0RFIDB4YTIKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLSNkZWZpbmUgVENfRlJBR19UWVBFCQkJCVwKLXN0cnVjdCB7CQkJCQlcCi0gIGZyYWdTICpmcl9vcGNvZGVfZnJhZ1A7CQkJXAotICB1bnNpZ25lZCBpbnQgZnJfb3Bjb2RlX29mZnNldDsJCVwKLSAgY2hhciBmcl9ic3I7CQkJCQlcCi19Ci0KLSNkZWZpbmUgVENfRlJBR19JTklUKFgpCQkJCVwKLSAgZG8JCQkJCQlcCi0gICAgIHsJCQkJCQlcCi0gICAgICAgZnJhZ19vcGNvZGVfZnJhZyAoWCkgPSBOVUxMOwkJXAotICAgICAgIGZyYWdfb3Bjb2RlX29mZnNldCAoWCkgPSAwOwkJXAotICAgICAgIGZyYWdfYnNyIChYKSA9IDA7CQkJCVwKLSAgICAgfQkJCQkJCVwKLSAgd2hpbGUoMCkKLQotLyogQWNjZXNzb3IgbWFjcm9zIGZvciB0aGluZ3Mgd2hpY2ggbWF5IG1vdmUgYXJvdW5kICovCi0jZGVmaW5lIGZyYWdfb3Bjb2RlX2ZyYWcoWCkgICAoWCktPnRjX2ZyYWdfZGF0YS5mcl9vcGNvZGVfZnJhZ1AKLSNkZWZpbmUgZnJhZ19vcGNvZGVfb2Zmc2V0KFgpIChYKS0+dGNfZnJhZ19kYXRhLmZyX29wY29kZV9vZmZzZXQKLSNkZWZpbmUgZnJhZ19ic3IoWCkgICAgICAgICAgIChYKS0+dGNfZnJhZ19kYXRhLmZyX2JzcgotCi0jZGVmaW5lIFRDX0ZJWF9UWVBFCQkJCVwKLXN0cnVjdAkJCQkJCVwKLXsJCQkJCQlcCi0gIGZyYWdTICpvcGNvZGVfZnJhZ1A7CQkJCVwKLSAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQ7CQkJXAotICB1bnNpZ25lZCBpbnQgYnNyIDogMTsJCQkJXAotfQotCi0vKiBBY2Nlc3NvciBtYWNyb3MgZm9yIHRoaW5ncyB3aGljaCBtYXkgbW92ZSBhcm91bmQuCi0gICBTZWUgY29tbWVudHMgaW4gd3JpdGUuaC4gICovCi0jZGVmaW5lIGZpeF9pbV9kaXNwKFgpICAgICAgIChYKS0+ZnhfaW1fZGlzcAotI2RlZmluZSBmaXhfYml0X2ZpeFAoWCkgICAgICAoWCktPmZ4X2JpdF9maXhQCi0jZGVmaW5lIGZpeF9vcGNvZGVfZnJhZyhYKSAgIChYKS0+dGNfZml4X2RhdGEub3Bjb2RlX2ZyYWdQCi0jZGVmaW5lIGZpeF9vcGNvZGVfb2Zmc2V0KFgpIChYKS0+dGNfZml4X2RhdGEub3Bjb2RlX29mZnNldAotI2RlZmluZSBmaXhfYnNyKFgpICAgICAgICAgICAoWCktPnRjX2ZpeF9kYXRhLmJzcgotCi0jZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoWCkJCQlcCi0gIGRvCQkJCQkJXAotICAgICB7CQkJCQkJXAotICAgICAgIGZpeF9vcGNvZGVfZnJhZyhYKSA9IE5VTEw7CQlcCi0gICAgICAgZml4X29wY29kZV9vZmZzZXQoWCkgPSAwOwkJXAotICAgICAgIGZpeF9ic3IoWCkgPSAwOwkJCQlcCi0gICAgIH0JCQkJCQlcCi0gIHdoaWxlKDApCi0KLSNkZWZpbmUgVENfRklYX0RBVEFfUFJJTlQoRklMRSwgRklYUCkJCQkJCVwKLSAgZG8JCQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGZwcmludGYoKEZJTEUpLCAib3Bjb2RlX2ZyYWc9JWxkLCBvcGVyYW5kIG9mZnNldD0lZCwgYnNyPSVkXG4iLAlcCi0JICAgICAgKHVuc2lnbmVkIGxvbmcpIGZpeF9vcGNvZGVfZnJhZyAoRklYUCksCQkJXAotCSAgICAgIGZpeF9vcGNvZGVfb2Zmc2V0IChGSVhQKSwJCQkJCVwKLQkgICAgICBmaXhfYnNyIChGSVhQKSk7CQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIHdoaWxlKDApCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXBwYy5jIGIvZ2FzL2NvbmZpZy90Yy1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjMmE0OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAyNSArMCwwIEBACi0vKiB0Yy1wcGMuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFBvd2VyUEMgb3IgUE9XRVIgKFJTLzYwMDApCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImVsZi9wcGMuaCIKLSNlbmRpZgotCi0jaWZkZWYgVEVfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotLyogVGhpcyBpcyB0aGUgYXNzZW1ibGVyIGZvciB0aGUgUG93ZXJQQyBvciBQT1dFUiAoUlMvNjAwMCkgY2hpcHMuICAqLwotCi0vKiBUZWxsIHRoZSBtYWluIGNvZGUgd2hhdCB0aGUgZW5kaWFubmVzcyBpcy4gICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiBXaGV0aGVyIG9yIG5vdCwgd2UndmUgc2V0IHRhcmdldF9iaWdfZW5kaWFuLiAgKi8KLXN0YXRpYyBpbnQgc2V0X3RhcmdldF9lbmRpYW4gPSAwOwotCi0vKiBXaGV0aGVyIHRvIHVzZSB1c2VyIGZyaWVuZGx5IHJlZ2lzdGVyIG5hbWVzLiAgKi8KLSNpZm5kZWYgVEFSR0VUX1JFR19OQU1FU19QCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgVEFSR0VUX1JFR19OQU1FU19QIHRydWUKLSNlbHNlCi0jZGVmaW5lIFRBUkdFVF9SRUdfTkFNRVNfUCBmYWxzZQotI2VuZGlmCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gcmVnX25hbWVzX3AgPSBUQVJHRVRfUkVHX05BTUVTX1A7Ci0KLXN0YXRpYyBib29sZWFuIHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgcHBjX3NldF9jcHUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHBjX2luc2VydF9vcGVyYW5kCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZCwKLQkgICBvZmZzZXRUIHZhbCwgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpKTsKLXN0YXRpYyB2b2lkIHBwY19tYWNybyBQQVJBTVMgKChjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNybykpOwotc3RhdGljIHZvaWQgcHBjX2J5dGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IHBwY19pc190b2Nfc3ltIFBBUkFNUyAoKHN5bWJvbFMgKnN5bSkpOwotc3RhdGljIHZvaWQgcHBjX3RjIFBBUkFNUyAoKGludCkpOwotCi0jaWZkZWYgT0JKX1hDT0ZGCi1zdGF0aWMgdm9pZCBwcGNfY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19iYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19iYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19iZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19iaWVpIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2ViIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VjIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2NzZWN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2NoYW5nZV9jc2VjdCBQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIHBwY19mdW5jdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19leHRlcm4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfbGdsb2JsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfbmFtZWRfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19zdGFieCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19yZW5hbWUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfdG9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3hjb2ZmX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfdmJ5dGUgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcHBjX2VsZl9zdWZmaXggUEFSQU1TICgoY2hhciAqKiwgZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgcHBjX2VsZl9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl9yZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfbGNvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChmaXhTICosIHNlZ1QpKTsKLSNlbmRpZgotCi0jaWZkZWYgVEVfUEUKLXN0YXRpYyB2b2lkIHBwY19zZXRfY3VycmVudF9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKLXN0YXRpYyB2b2lkIHBwY19wcmV2aW91cyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19wZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY195ZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19yZWxkYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3JkYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3VhbG9uZyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY196bm9wIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BlX2NvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19wZV9mdW5jdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19wZV90b2NkIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0MCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwKLSAgIHRhcmdldHMuICAqLwotCi0jaWZkZWYgT0JKX0VMRgotLyogVGhpcyBzdHJpbmcgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLiAgVGhlIG1hY3JvCi0gICB0Y19jb21tZW50X2NoYXJzIHBvaW50cyB0byB0aGlzLiAgV2UgdXNlIHRoaXMsIHJhdGhlciB0aGFuIHRoZQotICAgdXN1YWwgY29tbWVudF9jaGFycywgc28gdGhhdCB3ZSBjYW4gc3dpdGNoIGZvciBTb2xhcmlzIGNvbnZlbnRpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIHBwY19zb2xhcmlzX2NvbW1lbnRfY2hhcnNbXSA9ICIjISI7Ci1zdGF0aWMgY29uc3QgY2hhciBwcGNfZWFiaV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLSNpZmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCi1jb25zdCBjaGFyICpwcGNfY29tbWVudF9jaGFycyA9IHBwY19zb2xhcmlzX2NvbW1lbnRfY2hhcnM7Ci0jZWxzZQotY29uc3QgY2hhciAqcHBjX2NvbW1lbnRfY2hhcnMgPSBwcGNfZWFiaV9jb21tZW50X2NoYXJzOwotI2VuZGlmCi0jZWxzZQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0jZW5kaWYKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZwotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LAotICAgYXMgaW4gMGQxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0MCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIC8qIFBzZXVkby1vcHMgd2hpY2ggbXVzdCBiZSBvdmVycmlkZGVuLiAgKi8KLSAgeyAiYnl0ZSIsCXBwY19ieXRlLAkwIH0sCi0KLSNpZmRlZiBPQkpfWENPRkYKLSAgLyogUHNldWRvLW9wcyBzcGVjaWZpYyB0byB0aGUgUlMvNjAwMCBYQ09GRiBmb3JtYXQuICBTb21lIG9mIHRoZXNlCi0gICAgIGxlZ2l0aW1hdGVseSBiZWxvbmcgaW4gdGhlIG9iai0qLmMgZmlsZS4gIEhvd2V2ZXIsIFhDT0ZGIGlzIGJhc2VkCi0gICAgIG9uIENPRkYsIGFuZCBpcyBvbmx5IGltcGxlbWVudGVkIGZvciB0aGUgUlMvNjAwMC4gIFdlIGp1c3QgdXNlCi0gICAgIG9iai1jb2ZmLmMsIGFuZCBhZGQgd2hhdCB3ZSBuZWVkIGhlcmUuICAqLwotICB7ICJjb21tIiwJcHBjX2NvbW0sCTAgfSwKLSAgeyAibGNvbW0iLAlwcGNfY29tbSwJMSB9LAotICB7ICJiYiIsCXBwY19iYiwJCTAgfSwKLSAgeyAiYmMiLAlwcGNfYmMsCQkwIH0sCi0gIHsgImJmIiwJcHBjX2JmLAkJMCB9LAotICB7ICJiaSIsCXBwY19iaWVpLAkwIH0sCi0gIHsgImJzIiwJcHBjX2JzLAkJMCB9LAotICB7ICJjc2VjdCIsCXBwY19jc2VjdCwJMCB9LAotICB7ICJkYXRhIiwJcHBjX3NlY3Rpb24sCSdkJyB9LAotICB7ICJlYiIsCXBwY19lYiwJCTAgfSwKLSAgeyAiZWMiLAlwcGNfZWMsCQkwIH0sCi0gIHsgImVmIiwJcHBjX2VmLAkJMCB9LAotICB7ICJlaSIsCXBwY19iaWVpLAkxIH0sCi0gIHsgImVzIiwJcHBjX2VzLAkJMCB9LAotICB7ICJleHRlcm4iLAlwcGNfZXh0ZXJuLAkwIH0sCi0gIHsgImZ1bmN0aW9uIiwJcHBjX2Z1bmN0aW9uLAkwIH0sCi0gIHsgImxnbG9ibCIsCXBwY19sZ2xvYmwsCTAgfSwKLSAgeyAicmVuYW1lIiwJcHBjX3JlbmFtZSwJMCB9LAotICB7ICJzZWN0aW9uIiwJcHBjX25hbWVkX3NlY3Rpb24sIDAgfSwKLSAgeyAic3RhYngiLAlwcGNfc3RhYngsCTAgfSwKLSAgeyAidGV4dCIsCXBwY19zZWN0aW9uLAkndCcgfSwKLSAgeyAidG9jIiwJcHBjX3RvYywJMCB9LAotICB7ICJsb25nIiwJcHBjX3hjb2ZmX2NvbnMsCTIgfSwKLSAgeyAid29yZCIsCXBwY194Y29mZl9jb25zLAkxIH0sCi0gIHsgInNob3J0IiwJcHBjX3hjb2ZmX2NvbnMsCTEgfSwKLSAgeyAidmJ5dGUiLCAgICBwcGNfdmJ5dGUsCTAgfSwKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotICB7ICJsb25nIiwJcHBjX2VsZl9jb25zLAk0IH0sCi0gIHsgIndvcmQiLAlwcGNfZWxmX2NvbnMsCTIgfSwKLSAgeyAic2hvcnQiLAlwcGNfZWxmX2NvbnMsCTIgfSwKLSAgeyAicmRhdGEiLAlwcGNfZWxmX3JkYXRhLAkwIH0sCi0gIHsgInJvZGF0YSIsCXBwY19lbGZfcmRhdGEsCTAgfSwKLSAgeyAibGNvbW0iLAlwcGNfZWxmX2xjb21tLAkwIH0sCi0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi0gIC8qIFBzZXVkby1vcHMgc3BlY2lmaWMgdG8gdGhlIFdpbmRvd3MgTlQgUG93ZXJQQyBQRSAoY29mZikgZm9ybWF0ICovCi0gIHsgInByZXZpb3VzIiwgcHBjX3ByZXZpb3VzLCAgIDAgfSwKLSAgeyAicGRhdGEiLCAgICBwcGNfcGRhdGEsICAgICAgMCB9LAotICB7ICJ5ZGF0YSIsICAgIHBwY195ZGF0YSwgICAgICAwIH0sCi0gIHsgInJlbGRhdGEiLCAgcHBjX3JlbGRhdGEsICAgIDAgfSwKLSAgeyAicmRhdGEiLCAgICBwcGNfcmRhdGEsICAgICAgMCB9LAotICB7ICJ1YWxvbmciLCAgIHBwY191YWxvbmcsICAgICAwIH0sCi0gIHsgInpub3AiLCAgICAgcHBjX3pub3AsICAgICAgIDAgfSwKLSAgeyAiY29tbSIsCXBwY19wZV9jb21tLAkwIH0sCi0gIHsgImxjb21tIiwJcHBjX3BlX2NvbW0sCTEgfSwKLSAgeyAic2VjdGlvbiIsICBwcGNfcGVfc2VjdGlvbiwgMCB9LAotICB7ICJmdW5jdGlvbiIsCXBwY19wZV9mdW5jdGlvbiwwIH0sCi0gIHsgInRvY2QiLCAgICAgcHBjX3BlX3RvY2QsICAgIDAgfSwKLSNlbmRpZgotCi0gIC8qIFRoaXMgcHNldWRvLW9wIGlzIHVzZWQgZXZlbiB3aGVuIG5vdCBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dC4gICovCi0gIHsgInRjIiwJcHBjX3RjLAkJMCB9LAotCi0gIHsgTlVMTCwJTlVMTCwJCTAgfQotfTsKLQotDAotLyogUHJlZGVmaW5lZCByZWdpc3RlciBuYW1lcyBpZiAtbXJlZ25hbWVzIChvciBkZWZhdWx0IGZvciBXaW5kb3dzIE5UKS4gICovCi0vKiBJbiBnZW5lcmFsLCB0aGVyZSBhcmUgbG90cyBvZiB0aGVtLCBpbiBhbiBhdHRlbXB0IHRvIGJlIGNvbXBhdGlibGUgKi8KLS8qIHdpdGggYSBudW1iZXIgb2Ygb3RoZXIgV2luZG93cyBOVCBhc3NlbWJsZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCB2YWx1ZTsKLSAgfTsKLQotLyogTGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgcHJlLWRlZmluZWQ6Ci0KLSAgIEVhY2ggZ2VuZXJhbCByZWdpc3RlciBoYXMgcHJlZGVmaW5lZCBuYW1lcyBvZiB0aGUgZm9ybToKLSAgIDEuIHI8cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0gICAyLiByLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLQotCi0gICBFYWNoIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGhhcyBwcmVkZWZpbmVkIG5hbWVzIG9mIHRoZSBmb3JtOgotICAgMS4gZjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLSAgIDIuIGYuPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotCi0gICBFYWNoIGNvbmRpdGlvbiByZWdpc3RlciBoYXMgcHJlZGVmaW5lZCBuYW1lcyBvZiB0aGUgZm9ybToKLSAgIDEuIGNyPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotICAgMi4gY3IuPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotCi0gICBUaGVyZSBhcmUgaW5kaXZpZHVhbCByZWdpc3RlcnMgYXMgd2VsbDoKLSAgIHNwIG9yIHIuc3AgICAgIGhhcyB0aGUgdmFsdWUgMQotICAgcnRvYyBvciByLnRvYyAgaGFzIHRoZSB2YWx1ZSAyCi0gICBmcHNjciAgICAgICAgICBoYXMgdGhlIHZhbHVlIDAKLSAgIHhlciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMQotICAgbHIgICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSA4Ci0gICBjdHIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDkKLSAgIHBtciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMAotICAgZGFyICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAxOQotICAgZHNpc3IgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAxOAotICAgZGVjICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAyMgotICAgc2RyMSAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAyNQotICAgc3JyMCAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAyNgotICAgc3JyMSAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAyNwotCi0gICBUaGUgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQotewotICB7ICJjci4wIiwgMCB9LCAgICAvKiBDb25kaXRpb24gUmVnaXN0ZXJzICovCi0gIHsgImNyLjEiLCAxIH0sCi0gIHsgImNyLjIiLCAyIH0sCi0gIHsgImNyLjMiLCAzIH0sCi0gIHsgImNyLjQiLCA0IH0sCi0gIHsgImNyLjUiLCA1IH0sCi0gIHsgImNyLjYiLCA2IH0sCi0gIHsgImNyLjciLCA3IH0sCi0KLSAgeyAiY3IwIiwgMCB9LAotICB7ICJjcjEiLCAxIH0sCi0gIHsgImNyMiIsIDIgfSwKLSAgeyAiY3IzIiwgMyB9LAotICB7ICJjcjQiLCA0IH0sCi0gIHsgImNyNSIsIDUgfSwKLSAgeyAiY3I2IiwgNiB9LAotICB7ICJjcjciLCA3IH0sCi0KLSAgeyAiY3RyIiwgOSB9LAotCi0gIHsgImRhciIsIDE5IH0sICAgIC8qIERhdGEgQWNjZXNzIFJlZ2lzdGVyICovCi0gIHsgImRlYyIsIDIyIH0sICAgIC8qIERlY3JlbWVudGVyICovCi0gIHsgImRzaXNyIiwgMTggfSwgIC8qIERhdGEgU3RvcmFnZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCi0KLSAgeyAiZi4wIiwgMCB9LCAgICAgLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCi0gIHsgImYuMSIsIDEgfSwgCi0gIHsgImYuMTAiLCAxMCB9LCAKLSAgeyAiZi4xMSIsIDExIH0sIAotICB7ICJmLjEyIiwgMTIgfSwgCi0gIHsgImYuMTMiLCAxMyB9LCAKLSAgeyAiZi4xNCIsIDE0IH0sIAotICB7ICJmLjE1IiwgMTUgfSwgCi0gIHsgImYuMTYiLCAxNiB9LCAKLSAgeyAiZi4xNyIsIDE3IH0sIAotICB7ICJmLjE4IiwgMTggfSwgCi0gIHsgImYuMTkiLCAxOSB9LCAKLSAgeyAiZi4yIiwgMiB9LCAKLSAgeyAiZi4yMCIsIDIwIH0sIAotICB7ICJmLjIxIiwgMjEgfSwgCi0gIHsgImYuMjIiLCAyMiB9LCAKLSAgeyAiZi4yMyIsIDIzIH0sIAotICB7ICJmLjI0IiwgMjQgfSwgCi0gIHsgImYuMjUiLCAyNSB9LCAKLSAgeyAiZi4yNiIsIDI2IH0sIAotICB7ICJmLjI3IiwgMjcgfSwgCi0gIHsgImYuMjgiLCAyOCB9LCAKLSAgeyAiZi4yOSIsIDI5IH0sIAotICB7ICJmLjMiLCAzIH0sIAotICB7ICJmLjMwIiwgMzAgfSwKLSAgeyAiZi4zMSIsIDMxIH0sCi0gIHsgImYuNCIsIDQgfSwgCi0gIHsgImYuNSIsIDUgfSwgCi0gIHsgImYuNiIsIDYgfSwgCi0gIHsgImYuNyIsIDcgfSwgCi0gIHsgImYuOCIsIDggfSwgCi0gIHsgImYuOSIsIDkgfSwgCi0KLSAgeyAiZjAiLCAwIH0sIAotICB7ICJmMSIsIDEgfSwgCi0gIHsgImYxMCIsIDEwIH0sIAotICB7ICJmMTEiLCAxMSB9LCAKLSAgeyAiZjEyIiwgMTIgfSwgCi0gIHsgImYxMyIsIDEzIH0sIAotICB7ICJmMTQiLCAxNCB9LCAKLSAgeyAiZjE1IiwgMTUgfSwgCi0gIHsgImYxNiIsIDE2IH0sIAotICB7ICJmMTciLCAxNyB9LCAKLSAgeyAiZjE4IiwgMTggfSwgCi0gIHsgImYxOSIsIDE5IH0sIAotICB7ICJmMiIsIDIgfSwgCi0gIHsgImYyMCIsIDIwIH0sIAotICB7ICJmMjEiLCAyMSB9LCAKLSAgeyAiZjIyIiwgMjIgfSwgCi0gIHsgImYyMyIsIDIzIH0sIAotICB7ICJmMjQiLCAyNCB9LCAKLSAgeyAiZjI1IiwgMjUgfSwgCi0gIHsgImYyNiIsIDI2IH0sIAotICB7ICJmMjciLCAyNyB9LCAKLSAgeyAiZjI4IiwgMjggfSwgCi0gIHsgImYyOSIsIDI5IH0sIAotICB7ICJmMyIsIDMgfSwgCi0gIHsgImYzMCIsIDMwIH0sCi0gIHsgImYzMSIsIDMxIH0sCi0gIHsgImY0IiwgNCB9LCAKLSAgeyAiZjUiLCA1IH0sIAotICB7ICJmNiIsIDYgfSwgCi0gIHsgImY3IiwgNyB9LCAKLSAgeyAiZjgiLCA4IH0sIAotICB7ICJmOSIsIDkgfSwgCi0KLSAgeyAiZnBzY3IiLCAwIH0sCi0KLSAgeyAibHIiLCA4IH0sICAgICAvKiBMaW5rIFJlZ2lzdGVyICovCi0KLSAgeyAicG1yIiwgMCB9LAotCi0gIHsgInIuMCIsIDAgfSwgICAgLyogR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVycyAqLwotICB7ICJyLjEiLCAxIH0sCi0gIHsgInIuMTAiLCAxMCB9LAotICB7ICJyLjExIiwgMTEgfSwKLSAgeyAici4xMiIsIDEyIH0sCi0gIHsgInIuMTMiLCAxMyB9LAotICB7ICJyLjE0IiwgMTQgfSwKLSAgeyAici4xNSIsIDE1IH0sCi0gIHsgInIuMTYiLCAxNiB9LAotICB7ICJyLjE3IiwgMTcgfSwKLSAgeyAici4xOCIsIDE4IH0sCi0gIHsgInIuMTkiLCAxOSB9LAotICB7ICJyLjIiLCAyIH0sCi0gIHsgInIuMjAiLCAyMCB9LAotICB7ICJyLjIxIiwgMjEgfSwKLSAgeyAici4yMiIsIDIyIH0sCi0gIHsgInIuMjMiLCAyMyB9LAotICB7ICJyLjI0IiwgMjQgfSwKLSAgeyAici4yNSIsIDI1IH0sCi0gIHsgInIuMjYiLCAyNiB9LAotICB7ICJyLjI3IiwgMjcgfSwKLSAgeyAici4yOCIsIDI4IH0sCi0gIHsgInIuMjkiLCAyOSB9LAotICB7ICJyLjMiLCAzIH0sCi0gIHsgInIuMzAiLCAzMCB9LAotICB7ICJyLjMxIiwgMzEgfSwKLSAgeyAici40IiwgNCB9LAotICB7ICJyLjUiLCA1IH0sCi0gIHsgInIuNiIsIDYgfSwKLSAgeyAici43IiwgNyB9LAotICB7ICJyLjgiLCA4IH0sCi0gIHsgInIuOSIsIDkgfSwKLQotICB7ICJyLnNwIiwgMSB9LCAgIC8qIFN0YWNrIFBvaW50ZXIgKi8KLQotICB7ICJyLnRvYyIsIDIgfSwgIC8qIFBvaW50ZXIgdG8gdGhlIHRhYmxlIG9mIGNvbnRlbnRzICovCi0KLSAgeyAicjAiLCAwIH0sICAgICAvKiBNb3JlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KLSAgeyAicjEiLCAxIH0sCi0gIHsgInIxMCIsIDEwIH0sCi0gIHsgInIxMSIsIDExIH0sCi0gIHsgInIxMiIsIDEyIH0sCi0gIHsgInIxMyIsIDEzIH0sCi0gIHsgInIxNCIsIDE0IH0sCi0gIHsgInIxNSIsIDE1IH0sCi0gIHsgInIxNiIsIDE2IH0sCi0gIHsgInIxNyIsIDE3IH0sCi0gIHsgInIxOCIsIDE4IH0sCi0gIHsgInIxOSIsIDE5IH0sCi0gIHsgInIyIiwgMiB9LAotICB7ICJyMjAiLCAyMCB9LAotICB7ICJyMjEiLCAyMSB9LAotICB7ICJyMjIiLCAyMiB9LAotICB7ICJyMjMiLCAyMyB9LAotICB7ICJyMjQiLCAyNCB9LAotICB7ICJyMjUiLCAyNSB9LAotICB7ICJyMjYiLCAyNiB9LAotICB7ICJyMjciLCAyNyB9LAotICB7ICJyMjgiLCAyOCB9LAotICB7ICJyMjkiLCAyOSB9LAotICB7ICJyMyIsIDMgfSwKLSAgeyAicjMwIiwgMzAgfSwKLSAgeyAicjMxIiwgMzEgfSwKLSAgeyAicjQiLCA0IH0sCi0gIHsgInI1IiwgNSB9LAotICB7ICJyNiIsIDYgfSwKLSAgeyAicjciLCA3IH0sCi0gIHsgInI4IiwgOCB9LAotICB7ICJyOSIsIDkgfSwKLQotICB7ICJydG9jIiwgMiB9LCAgLyogVGFibGUgb2YgY29udGVudHMgKi8KLQotICB7ICJzZHIxIiwgMjUgfSwgLyogU3RvcmFnZSBEZXNjcmlwdGlvbiBSZWdpc3RlciAxICovCi0KLSAgeyAic3AiLCAxIH0sCi0KLSAgeyAic3JyMCIsIDI2IH0sIC8qIE1hY2hpbmUgU3RhdHVzIFNhdmUvUmVzdG9yZSBSZWdpc3RlciAwICovCi0gIHsgInNycjEiLCAyNyB9LCAvKiBNYWNoaW5lIFN0YXR1cyBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMSAqLwotCi0gIHsgInhlciIsIDEgfSwKLQotfTsKLQotI2RlZmluZSBSRUdfTkFNRV9DTlQJKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKQotCi0vKiBHaXZlbiBOQU1FLCBmaW5kIHRoZSByZWdpc3RlciBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZSwgcmV0dXJuCi0gICB0aGUgaW50ZWdlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgLTEgb24gZmFpbHVyZS4gICovCi0KLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBwZF9yZWcgKiwgaW50LCBjb25zdCBjaGFyICogbmFtZSkpOwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lKQotICAgICBjb25zdCBzdHJ1Y3QgcGRfcmVnICpyZWdzOwotICAgICBpbnQgcmVnY291bnQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gcmVnY291bnQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZQotCXJldHVybiByZWdzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotCi0gIHJldHVybiAtMTsKLX0KLQotLyoKLSAqIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOglJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OglBIGV4cHJlc3Npb25TLgotICogICAgICBUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICogICAgICBYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluIGl0cwotICogICAgICBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAobmFtZVswXSA9PSAnJScgJiYgaXNhbHBoYSAobmFtZVsxXSkpCi0gICAgbmFtZSA9ICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGVsc2UgaWYgKCFyZWdfbmFtZXNfcCB8fCAhaXNhbHBoYSAobmFtZVswXSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAocHJlX2RlZmluZWRfcmVnaXN0ZXJzLCBSRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotICAgICAgCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCBzZWVuIGluIGFuIGV4cHJlc3Npb24uICBJdAotICAgaGFuZGxlcyB0aGUgc3BlY2lhbCBwYXJzaW5nIHdoaWNoIFBvd2VyUEMgYXNzZW1ibGVycyBhcmUgc3VwcG9zZWQKLSAgIHRvIHVzZSBmb3IgY29uZGl0aW9uIGNvZGVzLiAgKi8KLQotLyogV2hldGhlciB0byBkbyB0aGUgc3BlY2lhbCBwYXJzaW5nLiAgKi8KLXN0YXRpYyBib29sZWFuIGNyX29wZXJhbmQ7Ci0KLS8qIE5hbWVzIHRvIHJlY29nbml6ZSBpbiBhIGNvbmRpdGlvbiBjb2RlLiAgVGhpcyB0YWJsZSBpcyBzb3J0ZWQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwZF9yZWcgY3JfbmFtZXNbXSA9Ci17Ci0gIHsgImNyMCIsIDAgfSwKLSAgeyAiY3IxIiwgMSB9LAotICB7ICJjcjIiLCAyIH0sCi0gIHsgImNyMyIsIDMgfSwKLSAgeyAiY3I0IiwgNCB9LAotICB7ICJjcjUiLCA1IH0sCi0gIHsgImNyNiIsIDYgfSwKLSAgeyAiY3I3IiwgNyB9LAotICB7ICJlcSIsIDIgfSwKLSAgeyAiZ3QiLCAxIH0sCi0gIHsgImx0IiwgMCB9LAotICB7ICJzbyIsIDMgfSwKLSAgeyAidW4iLCAzIH0KLX07Ci0KLS8qIFBhcnNpbmcgZnVuY3Rpb24uICBUaGlzIHJldHVybnMgbm9uLXplcm8gaWYgaXQgcmVjb2duaXplZCBhbgotICAgZXhwcmVzc2lvbi4gICovCi0KLWludAotcHBjX3BhcnNlX25hbWUgKG5hbWUsIGV4cHIpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGV4cHJlc3Npb25TICpleHByOwotewotICBpbnQgdmFsOwotCi0gIGlmICghIGNyX29wZXJhbmQpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdmFsID0gcmVnX25hbWVfc2VhcmNoIChjcl9uYW1lcywgc2l6ZW9mIGNyX25hbWVzIC8gc2l6ZW9mIGNyX25hbWVzWzBdLAotCQkJIG5hbWUpOwotICBpZiAodmFsIDwgMCkKLSAgICByZXR1cm4gMDsKLQotICBleHByLT5YX29wID0gT19jb25zdGFudDsKLSAgZXhwci0+WF9hZGRfbnVtYmVyID0gdmFsOwotCi0gIHJldHVybiAxOwotfQotDAotLyogTG9jYWwgdmFyaWFibGVzLiAgKi8KLQotLyogVGhlIHR5cGUgb2YgcHJvY2Vzc29yIHdlIGFyZSBhc3NlbWJsaW5nIGZvci4gIFRoaXMgaXMgb25lIG9yIG1vcmUKLSAgIG9mIHRoZSBQUENfT1BDT0RFIGZsYWdzIGRlZmluZWQgaW4gb3Bjb2RlL3BwYy5oLiAgKi8KLXN0YXRpYyBpbnQgcHBjX2NwdSA9IDA7Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3Igd2UgYXJlIGFzc2VtYmxpbmcgZm9yLiAgVGhpcyBpcyBlaXRoZXIKLSAgIFBQQ19PUENPREVfMzIgb3IgUFBDX09QQ09ERV82NC4gICovCi1zdGF0aWMgaW50IHBwY19zaXplID0gUFBDX09QQ09ERV8zMjsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnBwY19oYXNoOwotCi0vKiBNYWNybyBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwcGNfbWFjcm9faGFzaDsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFdoYXQgdHlwZSBvZiBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIHVzZSAqLwotc3RhdGljIGVudW0geyBTSExJQl9OT05FLCBTSExJQl9QSUMsIFNISUxCX01SRUxPQ0FUQUJMRSB9IHNobGliID0gU0hMSUJfTk9ORTsKLQotLyogRmxhZ3MgdG8gc2V0IGluIHRoZSBlbGYgaGVhZGVyICovCi1zdGF0aWMgZmxhZ3dvcmQgcHBjX2ZsYWdzID0gMDsKLQotLyogV2hldGhlciB0aGlzIGlzIFNvbGFyaXMgb3Igbm90LiAgKi8KLSNpZmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCi0jZGVmaW5lIFNPTEFSSVNfUCB0cnVlCi0jZWxzZQotI2RlZmluZSBTT0xBUklTX1AgZmFsc2UKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBtc29sYXJpcyA9IFNPTEFSSVNfUDsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX1hDT0ZGCi0KLS8qIFRoZSBSUy82MDAwIGFzc2VtYmxlciB1c2VzIHRoZSAuY3NlY3QgcHNldWRvLW9wIHRvIGdlbmVyYXRlIGNvZGUKLSAgIHVzaW5nIGEgYnVuY2ggb2YgZGlmZmVyZW50IHNlY3Rpb25zLiAgVGhlc2UgYXNzZW1ibGVyIHNlY3Rpb25zLAotICAgaG93ZXZlciwgYXJlIGFsbCBlbmNvbXBhc3NlZCB3aXRoaW4gdGhlIC50ZXh0IG9yIC5kYXRhIHNlY3Rpb25zIG9mCi0gICB0aGUgZmluYWwgb3V0cHV0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBieSB1c2luZyBkaWZmZXJlbnQKLSAgIHN1YnNlZ21lbnRzIHdpdGhpbiB0aGVzZSBtYWluIHNlZ21lbnRzLiAgKi8KLQotLyogTmV4dCBzdWJzZWdtZW50IHRvIGFsbG9jYXRlIHdpdGhpbiB0aGUgLnRleHQgc2VnbWVudC4gICovCi1zdGF0aWMgc3Vic2VnVCBwcGNfdGV4dF9zdWJzZWdtZW50ID0gMjsKLQotLyogTGlua2VkIGxpc3Qgb2YgY3NlY3RzIGluIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY190ZXh0X2NzZWN0czsKLQotLyogTmV4dCBzdWJzZWdtZW50IHRvIGFsbG9jYXRlIHdpdGhpbiB0aGUgLmRhdGEgc2VnbWVudC4gICovCi1zdGF0aWMgc3Vic2VnVCBwcGNfZGF0YV9zdWJzZWdtZW50ID0gMjsKLQotLyogTGlua2VkIGxpc3Qgb2YgY3NlY3RzIGluIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY19kYXRhX2NzZWN0czsKLQotLyogVGhlIGN1cnJlbnQgY3NlY3QuICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY19jdXJyZW50X2NzZWN0OwotCi0vKiBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgdXNlcyBhIFRPQyB3aGljaCBob2xkcyBhZGRyZXNzZXMgb2YgZnVuY3Rpb25zCi0gICBhbmQgdmFyaWFibGVzLiAgU3ltYm9scyBhcmUgcHV0IGluIHRoZSBUT0Mgd2l0aCB0aGUgLnRjIHBzZXVkby1vcC4KLSAgIEEgc3BlY2lhbCByZWxvY2F0aW9uIGlzIHVzZWQgd2hlbiBhY2Nlc3NpbmcgVE9DIGVudHJpZXMuICBXZSBoYW5kbGUKLSAgIHRoZSBUT0MgYXMgYSBzdWJzZWdtZW50IHdpdGhpbiB0aGUgLmRhdGEgc2VnbWVudC4gIFdlIHNldCBpdCB1cCBpZgotICAgd2Ugc2VlIGEgLnRvYyBwc2V1ZG8tb3AsIGFuZCBzYXZlIHRoZSBjc2VjdCBzeW1ib2wgaGVyZS4gICovCi1zdGF0aWMgc3ltYm9sUyAqcHBjX3RvY19jc2VjdDsKLQotLyogVGhlIGZpcnN0IGZyYWcgaW4gdGhlIFRPQyBzdWJzZWdtZW50LiAgKi8KLXN0YXRpYyBmcmFnUyAqcHBjX3RvY19mcmFnOwotCi0vKiBUaGUgZmlyc3QgZnJhZyBpbiB0aGUgZmlyc3Qgc3Vic2VnbWVudCBhZnRlciB0aGUgVE9DIGluIHRoZSAuZGF0YQotICAgc2VnbWVudC4gIE5VTEwgaWYgdGhlcmUgYXJlIG5vIHN1YnNlZ21lbnRzIGFmdGVyIHRoZSBUT0MuICAqLwotc3RhdGljIGZyYWdTICpwcGNfYWZ0ZXJfdG9jX2ZyYWc7Ci0KLS8qIFRoZSBjdXJyZW50IHN0YXRpYyBibG9jay4gICovCi1zdGF0aWMgc3ltYm9sUyAqcHBjX2N1cnJlbnRfYmxvY2s7Ci0KLS8qIFRoZSBDT0ZGIGRlYnVnZ2luZyBzZWN0aW9uOyBzZXQgYnkgbWRfYmVnaW4uICBUaGlzIGlzIG5vdCB0aGUKLSAgIC5kZWJ1ZyBzZWN0aW9uLCBidXQgaXMgaW5zdGVhZCB0aGUgc2VjcmV0IEJGRCBzZWN0aW9uIHdoaWNoIHdpbGwKLSAgIGNhdXNlIEJGRCB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyIG9mIGEgc3ltYm9sIHRvIE5fREVCVUcuICAqLwotc3RhdGljIGFzZWN0aW9uICpwcGNfY29mZl9kZWJ1Z19zZWN0aW9uOwotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0KLSNpZmRlZiBURV9QRQotCi0vKiBWYXJpb3VzIHNlY3Rpb25zIHRoYXQgd2UgbmVlZCBmb3IgUEUgY29mZiBzdXBwb3J0LiAgKi8KLXN0YXRpYyBzZWdUIHlkYXRhX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBwZGF0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgcmVsZGF0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgcmRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHRvY2RhdGFfc2VjdGlvbjsKLQotLyogVGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgdGhlIHByZXZpb3VzIHNlY3Rpb24uIFNlZSBwcGNfcHJldmlvdXMuICovCi1zdGF0aWMgc2VnVCBwcGNfcHJldmlvdXNfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHBwY19jdXJyZW50X3NlY3Rpb247Ci0KLSNlbmRpZiAvKiBURV9QRSAqLwotCi0jaWZkZWYgT0JKX0VMRgotc3ltYm9sUyAqR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRSIgKi8KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0MCi0jaWZkZWYgT0JKX0VMRgotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImI6bDp1c206SzpWUToiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJ1bToiOwotI2VuZGlmCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAndSc6Ci0gICAgICAvKiAtdSBtZWFucyB0aGF0IGFueSB1bmRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgdHJlYXRlZCBhcwotCSBleHRlcm5hbCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGdhcyBhbnlob3cuICAqLwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSAnbCc6Ci0gICAgICAvKiBTb2xhcmlzIGFzIHRha2VzIC1sZSAocHJlc3VtYWJseSBmb3IgbGl0dGxlIGVuZGlhbikuICBGb3IgY29tcGxldGVuZXNzCi0gICAgICAgICBzYWtlLCByZWNvZ25pemUgLWJlIGFsc28uICAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiZSIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICAgIGlmIChzdHJjbXAgKGFyZywgImUiKSA9PSAwKQotCXsKLQkgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLQkgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSyc6Ci0gICAgICAvKiBSZWNvZ25pemUgLUsgUElDICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICJQSUMiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAicGljIikgPT0gMCkKLQl7Ci0JICBzaGxpYiA9IFNITElCX1BJQzsKLQkgIHBwY19mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEVfTElCOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgJ20nOgotICAgICAgLyogLW1wd3J4IGFuZCAtbXB3cjIgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlIElCTSBQT1dFUi8yCi0gICAgICAgICAoUklPUzIpLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyZywgInB3cngiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAicHdyMiIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMjsKLSAgICAgIC8qIC1tcHdyIG1lYW5zIHRvIGFzc2VtYmxlIGZvciB0aGUgSUJNIFBPV0VSIChSSU9TMSkuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwd3IiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSOwotICAgICAgLyogLW02MDEgbWVhbnMgdG8gYXNzZW1ibGUgZm9yIHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSwgd2hpY2ggaW5jbHVkZXMKLSAgICAgICAgIGluc3RydWN0aW9ucyB0aGF0IGFyZSBob2xkb3ZlcnMgZnJvbSB0aGUgUG93ZXIuICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIjYwMSIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDE7Ci0gICAgICAvKiAtbXBwYywgLW1wcGMzMiwgLW02MDMsIGFuZCAtbTYwNCBtZWFuIHRvIGFzc2VtYmxlIGZvciB0aGUKLSAgICAgICAgIE1vdG9yb2xhIFBvd2VyUEMgNjAzLzYwNC4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInBwYyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChhcmcsICJwcGMzMiIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChhcmcsICI0MDMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAiNjAzIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjYwNCIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDOwotICAgICAgLyogLW1wcGM2NCBhbmQgLW02MjAgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlIDY0LWJpdCBQb3dlclBDCi0gICAgICAgICA2MjAuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGM2NCIpID09IDAgfHwgc3RyY21wIChhcmcsICI2MjAiKSA9PSAwKQotCXsKLQkgIHBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKLQkgIHBwY19zaXplID0gUFBDX09QQ09ERV82NDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInBwYzY0YnJpZGdlIikgPT0gMCkKLQl7Ci0JICBwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzY0X0JSSURHRTsKLQkgIHBwY19zaXplID0gUFBDX09QQ09ERV82NDsKLQl9Ci0gICAgICAvKiAtbWNvbSBtZWFucyBhc3NlbWJsZSBmb3IgdGhlIGNvbW1vbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiBQb3dlcgotCSBhbmQgUG93ZXJQQy4gIEF0IHByZXNlbnQsIHdlIGp1c3QgYWxsb3cgdGhlIHVuaW9uLCByYXRoZXIKLQkgdGhhbiB0aGUgaW50ZXJzZWN0aW9uLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiY29tIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9DT01NT047Ci0gICAgICAvKiAtbWFueSBtZWFucyB0byBhc3NlbWJsZSBmb3IgYW55IGFyY2hpdGVjdHVyZSAoUFdSL1BXUlgvUFBDKS4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImFueSIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfQU5ZOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlZ25hbWVzIikgPT0gMCkKLQlyZWdfbmFtZXNfcCA9IHRydWU7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8tcmVnbmFtZXMiKSA9PSAwKQotCXJlZ19uYW1lc19wID0gZmFsc2U7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICAvKiAtbXJlbG9jYXRhYmxlLy1tcmVsb2NhdGFibGUtbGliIC0tIHdhcm4gYWJvdXQgaW5pdGlhbGl6YXRpb25zIHRoYXQgcmVxdWlyZSByZWxvY2F0aW9uICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlbG9jYXRhYmxlIikgPT0gMCkKLQl7Ci0JICBzaGxpYiA9IFNISUxCX01SRUxPQ0FUQUJMRTsKLQkgIHBwY19mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEU7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlbG9jYXRhYmxlLWxpYiIpID09IDApCi0JewotCSAgc2hsaWIgPSBTSElMQl9NUkVMT0NBVEFCTEU7Ci0JICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFX0xJQjsKLQl9Ci0KLSAgICAgIC8qIC1tZW1iLCBzZXQgZW1iZWRkZWQgYml0ICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImVtYiIpID09IDApCi0JcHBjX2ZsYWdzIHw9IEVGX1BQQ19FTUI7Ci0KLSAgICAgIC8qIC1tbGl0dGxlLy1tYmlnIHNldCB0aGUgZW5kaWFuZXNzICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImxpdHRsZSIpID09IDAgfHwgc3RyY21wIChhcmcsICJsaXR0bGUtZW5kaWFuIikgPT0gMCkKLQl7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0JICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImJpZyIpID09IDAgfHwgc3RyY21wIChhcmcsICJiaWctZW5kaWFuIikgPT0gMCkKLQl7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0JICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInNvbGFyaXMiKSA9PSAwKQotCXsKLQkgIG1zb2xhcmlzID0gdHJ1ZTsKLQkgIHBwY19jb21tZW50X2NoYXJzID0gcHBjX3NvbGFyaXNfY29tbWVudF9jaGFyczsKLQl9Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8tc29sYXJpcyIpID09IDApCi0JewotCSAgbXNvbGFyaXMgPSBmYWxzZTsKLQkgIHBwY19jb21tZW50X2NoYXJzID0gcHBjX2VhYmlfY29tbWVudF9jaGFyczsKLQl9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgc3dpdGNoIC1tJXMiKSwgYXJnKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogLVY6IFNWUjQgYXJndW1lbnQgdG8gcHJpbnQgdmVyc2lvbiBJRC4gICovCi0gICAgY2FzZSAnVic6Ci0gICAgICBwcmludF92ZXJzaW9uX2lkICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1ReSwgLVFuOiBTVlI0IGFyZ3VtZW50cyBjb250cm9sbGluZyB3aGV0aGVyIGEgLmNvbW1lbnQgc2VjdGlvbgotCSBzaG91bGQgYmUgZW1pdHRlZCBvciBub3QuICBGSVhNRTogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgICBjYXNlICdRJzoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBTb2xhcmlzIHRha2VzIC1zIHRvIHNwZWNpZnkgdGhhdCAuc3RhYnMgZ28gaW4gYSAuc3RhYnMgc2VjdGlvbiwKLQkgcmF0aGVyIHRoYW4gLnN0YWJzLmV4Y2wsIHdoaWNoIGlzIGlnbm9yZWQgYnkgdGhlIGxpbmtlci4KLQkgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAncyc6Ci0gICAgICBpZiAoYXJnKQotCXJldHVybiAwOwotCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1Qb3dlclBDIG9wdGlvbnM6XG5cCi0tdQkJCWlnbm9yZWRcblwKLS1tcHdyeCwgLW1wd3IyCQlnZW5lcmF0ZSBjb2RlIGZvciBJQk0gUE9XRVIvMiAoUklPUzIpXG5cCi0tbXB3cgkJCWdlbmVyYXRlIGNvZGUgZm9yIElCTSBQT1dFUiAoUklPUzEpXG5cCi0tbTYwMQkJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAxXG5cCi0tbXBwYywgLW1wcGMzMiwgLW00MDMsIC1tNjAzLCAtbTYwNFxuXAotCQkJZ2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MDMvNjA0XG5cCi0tbXBwYzY0LCAtbTYyMAkJZ2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MjBcblwKLS1tcHBjNjRicmlkZ2UJCWdlbmVyYXRlIGNvZGUgZm9yIFBvd2VyUEMgNjQsIGluY2x1ZGluZyBicmlkZ2UgaW5zbnNcblwKLS1tY29tCQkJZ2VuZXJhdGUgY29kZSBQb3dlci9Qb3dlclBDIGNvbW1vbiBpbnN0cnVjdGlvbnNcblwKLS1tYW55CQkJZ2VuZXJhdGUgY29kZSBmb3IgYW55IGFyY2hpdGVjdHVyZSAoUFdSL1BXUlgvUFBDKVxuXAotLW1yZWduYW1lcwkJQWxsb3cgc3ltYm9saWMgbmFtZXMgZm9yIHJlZ2lzdGVyc1xuXAotLW1uby1yZWduYW1lcwkJRG8gbm90IGFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcbiIpKTsKLSNpZmRlZiBPQkpfRUxGCi0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tbXJlbG9jYXRhYmxlCQlzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUgb3B0aW9uXG5cCi0tbXJlbG9jYXRhYmxlLWxpYglzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUtbGliIG9wdGlvblxuXAotLW1lbWIJCQlzZXQgUFBDX0VNQiBiaXQgaW4gRUxGIGZsYWdzXG5cCi0tbWxpdHRsZSwgLW1saXR0bGUtZW5kaWFuXG5cCi0JCQlnZW5lcmF0ZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZVxuXAotLW1iaWcsIC1tYmlnLWVuZGlhbglnZW5lcmF0ZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZVxuXAotLW1zb2xhcmlzCQlnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG5cCi0tbW5vLXNvbGFyaXMJCWRvIG5vdCBnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG5cCi0tVgkJCXByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlclxuXAotLVF5LCAtUW4JCWlnbm9yZWRcbiIpKTsKLSNlbmRpZgotfQotDAotLyogU2V0IHBwY19jcHUgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19zZXRfY3B1ICgpCi17Ci0gIGNvbnN0IGNoYXIgKmRlZmF1bHRfb3MgID0gVEFSR0VUX09TOwotICBjb25zdCBjaGFyICpkZWZhdWx0X2NwdSA9IFRBUkdFVF9DUFU7Ci0KLSAgaWYgKHBwY19jcHUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAoZGVmYXVsdF9vcywgImFpeCIsIDMpID09IDAKLQkgICYmIGRlZmF1bHRfb3NbM10gPj0gJzQnICYmIGRlZmF1bHRfb3NbM10gPD0gJzknKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX0NPTU1PTjsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGRlZmF1bHRfb3MsICJhaXgzIiwgNCkgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJyczYwMDAiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjbGUiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKLSAgICAgIGVsc2UKLQlhc19mYXRhbCAoXygiVW5rbm93biBkZWZhdWx0IGNwdSA9ICVzLCBvcyA9ICVzIiksIGRlZmF1bHRfY3B1LCBkZWZhdWx0X29zKTsKLSAgICB9Ci19Ci0KLS8qIEZpZ3VyZSBvdXQgdGhlIEJGRCBhcmNoaXRlY3R1cmUgdG8gdXNlLiAgKi8KLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi1wcGNfYXJjaCAoKQotewotICBjb25zdCBjaGFyICpkZWZhdWx0X2NwdSA9IFRBUkdFVF9DUFU7Ci0gIHBwY19zZXRfY3B1ICgpOwotCi0gIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfUFBDKSAhPSAwKQotICAgIHJldHVybiBiZmRfYXJjaF9wb3dlcnBjOwotICBlbHNlIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfUE9XRVIpICE9IDApCi0gICAgcmV0dXJuIGJmZF9hcmNoX3JzNjAwMDsKLSAgZWxzZSBpZiAoKHBwY19jcHUgJiAoUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWSkpICE9IDApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJyczYwMDAiKSA9PSAwKQotCXJldHVybiBiZmRfYXJjaF9yczYwMDA7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicG93ZXJwYyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGNsZSIpID09IDApCi0JcmV0dXJuIGJmZF9hcmNoX3Bvd2VycGM7Ci0gICAgfQotCi0gIGFzX2ZhdGFsIChfKCJOZWl0aGVyIFBvd2VyIG5vciBQb3dlclBDIG9wY29kZXMgd2VyZSBzZWxlY3RlZC4iKSk7Ci0gIHJldHVybiBiZmRfYXJjaF91bmtub3duOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzIHVwLiAgSXQgaXMgY2FsbGVkCi0gICBhZnRlciB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkIGFuZCB0aGUgb3V0cHV0IGZpbGUgaGFzIGJlZW4KLSAgIG9wZW5lZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3A7Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3BfZW5kOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm87Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNyb19lbmQ7Ci0gIGJvb2xlYW4gZHVwX2luc24gPSBmYWxzZTsKLQotICBwcGNfc2V0X2NwdSAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogU2V0IHRoZSBFTEYgZmxhZ3MgaWYgZGVzaXJlZC4gKi8KLSAgaWYgKHBwY19mbGFncyAmJiAhbXNvbGFyaXMpCi0gICAgYmZkX3NldF9wcml2YXRlX2ZsYWdzIChzdGRvdXRwdXQsIHBwY19mbGFncyk7Ci0jZW5kaWYKLQotICAvKiBJbnNlcnQgdGhlIG9wY29kZXMgaW50byBhIGhhc2ggdGFibGUuICAqLwotICBwcGNfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIG9wX2VuZCA9IHBvd2VycGNfb3Bjb2RlcyArIHBvd2VycGNfbnVtX29wY29kZXM7Ci0gIGZvciAob3AgPSBwb3dlcnBjX29wY29kZXM7IG9wIDwgb3BfZW5kOyBvcCsrKQotICAgIHsKLSAgICAgIGtub3cgKChvcC0+b3Bjb2RlICYgb3AtPm1hc2spID09IG9wLT5vcGNvZGUpOwotCi0gICAgICBpZiAoKG9wLT5mbGFncyAmIHBwY19jcHUpICE9IDAKLQkgICYmICgob3AtPmZsYWdzICYgKFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFXzY0KSkgPT0gMAotCSAgICAgIHx8IChvcC0+ZmxhZ3MgJiAoUFBDX09QQ09ERV8zMiB8IFBQQ19PUENPREVfNjQpKSA9PSBwcGNfc2l6ZQotCSAgICAgIHx8IChwcGNfY3B1ICYgUFBDX09QQ09ERV82NF9CUklER0UpICE9IDApKQotCXsKLQkgIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotCSAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKHBwY19oYXNoLCBvcC0+bmFtZSwgKFBUUikgb3ApOwotCSAgaWYgKHJldHZhbCAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSWdub3JlIFBvd2VyIGR1cGxpY2F0ZXMgZm9yIC1tNjAxICovCi0JICAgICAgaWYgKChwcGNfY3B1ICYgUFBDX09QQ09ERV82MDEpICE9IDAKLQkJICAmJiAob3AtPmZsYWdzICYgUFBDX09QQ09ERV9QT1dFUikgIT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBhc19iYWQgKF8oIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgaW5zdHJ1Y3Rpb24gJXMiKSwgb3AtPm5hbWUpOwotCSAgICAgIGR1cF9pbnNuID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSW5zZXJ0IHRoZSBtYWNyb3MgaW50byBhIGhhc2ggdGFibGUuICAqLwotICBwcGNfbWFjcm9faGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIG1hY3JvX2VuZCA9IHBvd2VycGNfbWFjcm9zICsgcG93ZXJwY19udW1fbWFjcm9zOwotICBmb3IgKG1hY3JvID0gcG93ZXJwY19tYWNyb3M7IG1hY3JvIDwgbWFjcm9fZW5kOyBtYWNybysrKQotICAgIHsKLSAgICAgIGlmICgobWFjcm8tPmZsYWdzICYgcHBjX2NwdSkgIT0gMCkKLQl7Ci0JICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLQkgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChwcGNfbWFjcm9faGFzaCwgbWFjcm8tPm5hbWUsIChQVFIpIG1hY3JvKTsKLQkgIGlmIChyZXR2YWwgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBtYWNybyAlcyIpLCBtYWNyby0+bmFtZSk7Ci0JICAgICAgZHVwX2luc24gPSB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZHVwX2luc24pCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogVGVsbCB0aGUgbWFpbiBjb2RlIHdoYXQgdGhlIGVuZGlhbm5lc3MgaXMgaWYgaXQgaXMgbm90IG92ZXJpZGRlbiBieSB0aGUgdXNlci4gICovCi0gIGlmICghc2V0X3RhcmdldF9lbmRpYW4pCi0gICAgewotICAgICAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSBQUENfQklHX0VORElBTjsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfWENPRkYKLSAgcHBjX2NvZmZfZGVidWdfc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoc3Rkb3V0cHV0LCBOX0RFQlVHKTsKLQotICAvKiBDcmVhdGUgZHVtbXkgc3ltYm9scyB0byBzZXJ2ZSBhcyBpbml0aWFsIGNzZWN0cy4gIFRoaXMgZm9yY2VzIHRoZQotICAgICB0ZXh0IGNzZWN0cyB0byBwcmVjZWRlIHRoZSBkYXRhIGNzZWN0cy4gIFRoZXNlIHN5bWJvbHMgd2lsbCBub3QKLSAgICAgYmUgb3V0cHV0LiAgKi8KLSAgcHBjX3RleHRfY3NlY3RzID0gc3ltYm9sX21ha2UgKCJkdW1teVwwMDEiKTsKLSAgc3ltYm9sX2dldF90YyAocHBjX3RleHRfY3NlY3RzKS0+d2l0aGluID0gcHBjX3RleHRfY3NlY3RzOwotICBwcGNfZGF0YV9jc2VjdHMgPSBzeW1ib2xfbWFrZSAoImR1bW15XDAwMSIpOwotICBzeW1ib2xfZ2V0X3RjIChwcGNfZGF0YV9jc2VjdHMpLT53aXRoaW4gPSBwcGNfZGF0YV9jc2VjdHM7Ci0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi0KLSAgcHBjX2N1cnJlbnRfc2VjdGlvbiA9IHRleHRfc2VjdGlvbjsKLSAgcHBjX3ByZXZpb3VzX3NlY3Rpb24gPSAwOyAgCi0KLSNlbmRpZgotfQotCi0vKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXBwY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIpCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTk9QVCkgIT0gMCkKLQkgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgZWxzZQotCSAgICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCi0JICBpZiAocHBjX3NpemUgPT0gUFBDX09QQ09ERV8zMikKLQkgICAgewotCSAgICAgIC8qIFNvbWUgcGVvcGxlIHdyaXRlIDMyIGJpdCBoZXggY29uc3RhbnRzIHdpdGggdGhlIHNpZ24KLQkJIGV4dGVuc2lvbiBkb25lIGJ5IGhhbmQuICBUaGlzIHNob3VsZG4ndCByZWFsbHkgYmUKLQkJIHZhbGlkLCBidXQsIHRvIHBlcm1pdCB0aGlzIGNvZGUgdG8gYXNzZW1ibGUgb24gYSA2NAotCQkgYml0IGhvc3QsIHdlIHNpZ24gZXh0ZW5kIHRoZSAzMiBiaXQgdmFsdWUuICAqLwotCSAgICAgIGlmICh2YWwgPiAwCi0JCSAgJiYgKHZhbCAmIDB4ODAwMDAwMDApICE9IDAKLQkJICAmJiAodmFsICYgMHhmZmZmZmZmZikgPT0gdmFsKQotCQl7Ci0JCSAgdmFsIC09IDB4ODAwMDAwMDA7Ci0JCSAgdmFsIC09IDB4ODAwMDAwMDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICBtaW4gPSAwOwotCX0KLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX05FR0FUSVZFKSAhPSAwKQotCXRlc3QgPSAtIHZhbDsKLSAgICAgIGVsc2UKLQl0ZXN0ID0gdmFsOwotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0JewotCSAgY29uc3QgY2hhciAqZXJyID0KLQkgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpOwotCSAgY2hhciBidWZbMTAwXTsKLQotCSAgc3ByaW50X3ZhbHVlIChidWYsIHRlc3QpOwotCSAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLQkgICAgYXNfYmFkIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgZWxzZQotCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgZXJybXNnID0gTlVMTDsKLSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIChsb25nKSB2YWwsICZlcnJtc2cpOwotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWFzX2JhZCAoZXJybXNnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBpbnNuIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCSAgICAgPDwgb3BlcmFuZC0+c2hpZnQpOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0MCi0jaWZkZWYgT0JKX0VMRgotLyogUGFyc2UgQGdvdCwgZXRjLiBhbmQgcmV0dXJuIHRoZSBkZXNpcmVkIHJlbG9jYXRpb24uICAqLwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotcHBjX2VsZl9zdWZmaXggKHN0cl9wLCBleHBfcCkKLSAgICAgY2hhciAqKnN0cl9wOwotICAgICBleHByZXNzaW9uUyAqZXhwX3A7Ci17Ci0gIHN0cnVjdCBtYXBfYmZkIHsKLSAgICBjaGFyICpzdHJpbmc7Ci0gICAgaW50IGxlbmd0aDsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIH07Ci0KLSAgY2hhciBpZGVudFsyMF07Ci0gIGNoYXIgKnN0ciA9ICpzdHJfcDsKLSAgY2hhciAqc3RyMjsKLSAgaW50IGNoOwotICBpbnQgbGVuOwotICBzdHJ1Y3QgbWFwX2JmZCAqcHRyOwotCi0jZGVmaW5lIE1BUChzdHIscmVsb2MpIHsgc3RyLCBzaXplb2Yoc3RyKS0xLCByZWxvYyB9Ci0KLSAgc3RhdGljIHN0cnVjdCBtYXBfYmZkIG1hcHBpbmdbXSA9IHsKLSAgICBNQVAgKCJsIiwJCUJGRF9SRUxPQ19MTzE2KSwKLSAgICBNQVAgKCJoIiwJCUJGRF9SRUxPQ19ISTE2KSwKLSAgICBNQVAgKCJoYSIsCQlCRkRfUkVMT0NfSEkxNl9TKSwKLSAgICBNQVAgKCJicnRha2VuIiwJQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTiksCi0gICAgTUFQICgiYnJudGFrZW4iLAlCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTiksCi0gICAgTUFQICgiZ290IiwJCUJGRF9SRUxPQ18xNl9HT1RPRkYpLAotICAgIE1BUCAoImdvdEBsIiwJQkZEX1JFTE9DX0xPMTZfR09UT0ZGKSwKLSAgICBNQVAgKCJnb3RAaCIsCUJGRF9SRUxPQ19ISTE2X0dPVE9GRiksCi0gICAgTUFQICgiZ290QGhhIiwJQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYpLAotICAgIE1BUCAoImZpeHVwIiwJQkZEX1JFTE9DX0NUT1IpLAkJLyogd2FybmluZ3Mgd2l0aCAtbXJlbG9jYXRhYmxlICovCi0gICAgTUFQICgicGx0IiwJCUJGRF9SRUxPQ18yNF9QTFRfUENSRUwpLAotICAgIE1BUCAoInBsdHJlbDI0IiwJQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCksCi0gICAgTUFQICgiY29weSIsCUJGRF9SRUxPQ19QUENfQ09QWSksCi0gICAgTUFQICgiZ2xvYmRhdCIsCUJGRF9SRUxPQ19QUENfR0xPQl9EQVQpLAotICAgIE1BUCAoImxvY2FsMjRwYyIsCUJGRF9SRUxPQ19QUENfTE9DQUwyNFBDKSwKLSAgICBNQVAgKCJsb2NhbCIsCUJGRF9SRUxPQ19QUENfTE9DQUwyNFBDKSwKLSAgICBNQVAgKCJwbHRyZWwiLAlCRkRfUkVMT0NfMzJfUExUX1BDUkVMKSwKLSAgICBNQVAgKCJwbHRAbCIsCUJGRF9SRUxPQ19MTzE2X1BMVE9GRiksCi0gICAgTUFQICgicGx0QGgiLAlCRkRfUkVMT0NfSEkxNl9QTFRPRkYpLAotICAgIE1BUCAoInBsdEBoYSIsCUJGRF9SRUxPQ19ISTE2X1NfUExUT0ZGKSwKLSAgICBNQVAgKCJzZGFyZWwiLAlCRkRfUkVMT0NfR1BSRUwxNiksCi0gICAgTUFQICgic2VjdG9mZiIsCUJGRF9SRUxPQ18zMl9CQVNFUkVMKSwKLSAgICBNQVAgKCJzZWN0b2ZmQGwiLAlCRkRfUkVMT0NfTE8xNl9CQVNFUkVMKSwKLSAgICBNQVAgKCJzZWN0b2ZmQGgiLAlCRkRfUkVMT0NfSEkxNl9CQVNFUkVMKSwKLSAgICBNQVAgKCJzZWN0b2ZmQGhhIiwJQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMKSwKLSAgICBNQVAgKCJuYWRkciIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMzIpLAotICAgIE1BUCAoIm5hZGRyMTYiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2KSwKLSAgICBNQVAgKCJuYWRkckBsIiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTyksCi0gICAgTUFQICgibmFkZHJAaCIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEkpLAotICAgIE1BUCAoIm5hZGRyQGhhIiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQSksCi0gICAgTUFQICgic2RhaTE2IiwJQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2KSwKLSAgICBNQVAgKCJzZGEycmVsIiwJQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTCksCi0gICAgTUFQICgic2RhMmkxNiIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTYpLAotICAgIE1BUCAoInNkYTIxIiwJQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEpLAotICAgIE1BUCAoIm1ya3JlZiIsCUJGRF9SRUxPQ19QUENfRU1CX01SS1JFRiksCi0gICAgTUFQICgicmVsc2VjdCIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2KSwKLSAgICBNQVAgKCJyZWxzZWN0QGwiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTyksCi0gICAgTUFQICgicmVsc2VjdEBoIiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEkpLAotICAgIE1BUCAoInJlbHNlY3RAaGEiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQSksCi0gICAgTUFQICgiYml0ZmxkIiwJQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRCksCi0gICAgTUFQICgicmVsc2RhIiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBKSwKLSAgICBNQVAgKCJ4Z290IiwJQkZEX1JFTE9DX1BQQ19UT0MxNiksCi0KLSAgICB7IChjaGFyICopMCwJMCwJQkZEX1JFTE9DX1VOVVNFRCB9Ci0gIH07Ci0KLSAgaWYgKCpzdHIrKyAhPSAnQCcpCi0gICAgcmV0dXJuIEJGRF9SRUxPQ19VTlVTRUQ7Ci0KLSAgZm9yIChjaCA9ICpzdHIsIHN0cjIgPSBpZGVudDsKLSAgICAgICAoc3RyMiA8IGlkZW50ICsgc2l6ZW9mIChpZGVudCkgLSAxCi0JJiYgKGlzYWxudW0gKGNoKSB8fCBjaCA9PSAnQCcpKTsKLSAgICAgICBjaCA9ICorK3N0cikKLSAgICB7Ci0gICAgICAqc3RyMisrID0gKGlzbG93ZXIgKGNoKSkgPyBjaCA6IHRvbG93ZXIgKGNoKTsKLSAgICB9Ci0KLSAgKnN0cjIgPSAnXDAnOwotICBsZW4gPSBzdHIyIC0gaWRlbnQ7Ci0KLSAgY2ggPSBpZGVudFswXTsKLSAgZm9yIChwdHIgPSAmbWFwcGluZ1swXTsgcHRyLT5sZW5ndGggPiAwOyBwdHIrKykKLSAgICBpZiAoY2ggPT0gcHRyLT5zdHJpbmdbMF0KLQkmJiBsZW4gPT0gcHRyLT5sZW5ndGgKLQkmJiBtZW1jbXAgKGlkZW50LCBwdHItPnN0cmluZywgcHRyLT5sZW5ndGgpID09IDApCi0gICAgICB7Ci0JaWYgKGV4cF9wLT5YX2FkZF9udW1iZXIgIT0gMAotCSAgICAmJiAocHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfMTZfR09UT0ZGCi0JCXx8IHB0ci0+cmVsb2MgPT0gQkZEX1JFTE9DX0xPMTZfR09UT0ZGCi0JCXx8IHB0ci0+cmVsb2MgPT0gQkZEX1JFTE9DX0hJMTZfR09UT0ZGCi0JCXx8IHB0ci0+cmVsb2MgPT0gQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYpKQotCSAgYXNfd2FybiAoXygiaWRlbnRpZmllcitjb25zdGFudEBnb3QgbWVhbnMgaWRlbnRpZmllckBnb3QrY29uc3RhbnQiKSk7Ci0KLQkvKiBOb3cgY2hlY2sgZm9yIGlkZW50aWZpZXJAc3VmZml4K2NvbnN0YW50ICovCi0JaWYgKCpzdHIgPT0gJy0nIHx8ICpzdHIgPT0gJysnKQotCSAgewotCSAgICBjaGFyICpvcmlnX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIGV4cHJlc3Npb25TIG5ld19leHA7Ci0KLQkgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCSAgICBleHByZXNzaW9uICgmbmV3X2V4cCk7Ci0JICAgIGlmIChuZXdfZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgICB7Ci0JCWV4cF9wLT5YX2FkZF9udW1iZXIgKz0gbmV3X2V4cC5YX2FkZF9udW1iZXI7Ci0JCXN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCZpbnB1dF9saW5lX3BvaW50ZXIgIT0gc3RyX3ApCi0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb3JpZ19saW5lOwotCSAgfQotCi0JKnN0cl9wID0gc3RyOwotCXJldHVybiBwdHItPnJlbG9jOwotICAgICAgfQotCi0gIHJldHVybiBCRkRfUkVMT0NfVU5VU0VEOwotfQotCi0vKiBMaWtlIG5vcm1hbCAubG9uZy8uc2hvcnQvLndvcmQsIGV4Y2VwdCBzdXBwb3J0IEBnb3QsIGV0Yy4gKi8KLS8qIGNsb2JiZXJzIGlucHV0X2xpbmVfcG9pbnRlciwgY2hlY2tzICovCi0vKiBlbmQtb2YtbGluZS4gKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2NvbnMgKG5ieXRlcykKLSAgICAgcmVnaXN0ZXIgaW50IG5ieXRlczsJLyogMT0uYnl0ZSwgMj0ud29yZCwgND0ubG9uZyAqLwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgICAgaWYgKGV4cC5YX29wID09IE9fc3ltYm9sCi0JICAmJiAqaW5wdXRfbGluZV9wb2ludGVyID09ICdAJwotCSAgJiYgKHJlbG9jID0gcHBjX2VsZl9zdWZmaXggKCZpbnB1dF9saW5lX3BvaW50ZXIsICZleHApKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCXsKLQkgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIHJlbG9jKTsKLQkgIGludCBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLQkgIGlmIChzaXplID4gbmJ5dGVzKQotCSAgICBhc19iYWQgKF8oIiVzIHJlbG9jYXRpb25zIGRvIG5vdCBmaXQgaW4gJWQgYnl0ZXNcbiIpLCByZWxvY19ob3d0by0+bmFtZSwgbmJ5dGVzKTsKLQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVnaXN0ZXIgY2hhciAqcCA9IGZyYWdfbW9yZSAoKGludCkgbmJ5dGVzKTsKLQkgICAgICBpbnQgb2Zmc2V0ID0gbmJ5dGVzIC0gc2l6ZTsKLQotCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LCBzaXplLCAmZXhwLCAwLCByZWxvYyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JZW1pdF9leHByICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogU29sYXJpcyBwc2VkdW8gb3AgdG8gY2hhbmdlIHRvIHRoZSAucm9kYXRhIHNlY3Rpb24uICAqLwotc3RhdGljIHZvaWQKLXBwY19lbGZfcmRhdGEgKHh4eCkKLSAgICAgaW50IHh4eDsKLXsKLSAgY2hhciAqc2F2ZV9saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBzdGF0aWMgY2hhciBzZWN0aW9uW10gPSAiLnJvZGF0YVxuIjsKLQotICAvKiBKdXN0IHByZXRlbmQgdGhpcyBpcyAuc2VjdGlvbiAucm9kYXRhICovCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNlY3Rpb247Ci0gIG9ial9lbGZfc2VjdGlvbiAoeHh4KTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2xpbmU7Ci19Ci0KLS8qIFBzZXVkbyBvcCB0byBtYWtlIGZpbGUgc2NvcGUgYnNzIGl0ZW1zICovCi1zdGF0aWMgdm9pZAotcHBjX2VsZl9sY29tbSh4eHgpCi0gICAgIGludCB4eHg7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgb2Zmc2V0VCBzaXplOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBvZmZzZXRUIGFsaWduOwotICBzZWdUIG9sZF9zZWM7Ci0gIGludCBvbGRfc3Vic2VjOwotICBjaGFyICpwZnJhZzsKLSAgaW50IGFsaWduMjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5DT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iKSwgKGxvbmcpIHNpemUpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5sY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGFsaWduID0gODsKLSAgZWxzZQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChhbGlnbiA8PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oImlnbm9yaW5nIGJhZCBhbGlnbm1lbnQiKSk7Ci0JICBhbGlnbiA9IDg7Ci0JfQotICAgIH0KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAmJiBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgc2l6ZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkxlbmd0aCBvZiAubGNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JICAgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKLQkgICAgICAobG9uZykgc2l6ZSk7Ci0KLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGFsbG9jYXRlX2JzczogKi8KLSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0gIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICBpZiAoYWxpZ24pCi0gICAgewotICAgICAgLyogY29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50ICovCi0gICAgICBmb3IgKGFsaWduMiA9IDA7IChhbGlnbiAmIDEpID09IDA7IGFsaWduID4+PSAxLCArK2FsaWduMik7Ci0gICAgICBpZiAoYWxpZ24gIT0gMSkKLQl7Ci0JICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFsaWduMiA9IDA7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduMik7Ci0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLSAgaWYgKGFsaWduMikKLSAgICBmcmFnX2FsaWduIChhbGlnbjIsIDAsIDApOwotICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0gICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0gIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwgc2l6ZSwKLQkJICAgIChjaGFyICopIDApOwotICAqcGZyYWcgPSAwOwotICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVmFsaWRhdGUgYW55IHJlbG9jYXRpb25zIGVtaXR0ZWQgZm9yIC1tcmVsb2NhdGFibGUsIHBvc3NpYmx5IGFkZGluZwotICAgZml4dXBzIGZvciB3b3JkIHJlbG9jYXRpb25zIGluIHdyaXRhYmxlIHNlZ21lbnRzLCBzbyB3ZSBjYW4gYWRqdXN0Ci0gICB0aGVtIGF0IHJ1bnRpbWUuICAqLwotc3RhdGljIHZvaWQKLXBwY19lbGZfdmFsaWRhdGVfZml4IChmaXhwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBpZiAoZml4cC0+ZnhfZG9uZSB8fCBmaXhwLT5meF9wY3JlbCkKLSAgICByZXR1cm47Ci0KLSAgc3dpdGNoIChzaGxpYikKLSAgICB7Ci0gICAgY2FzZSBTSExJQl9OT05FOgotICAgIGNhc2UgU0hMSUJfUElDOgotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBTSElMQl9NUkVMT0NBVEFCTEU6Ci0gICAgICBpZiAoZml4cC0+Znhfcl90eXBlIDw9IEJGRF9SRUxPQ19VTlVTRUQKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMTZfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0xPMTZfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzJfQkFTRVJFTAotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzE2X0JBU0VSRUwKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5nb3QyIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZHRvcnMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5jdG9ycyIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmZpeHVwIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuc3RhYiIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmdjY19leGNlcHRfdGFibGUiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5laF9mcmFtZSIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmV4X3NoYXJlZCIpICE9IDApCi0JewotCSAgaWYgKChzZWctPmZsYWdzICYgKFNFQ19SRUFET05MWSB8IFNFQ19DT0RFKSkgIT0gMAotCSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfQ1RPUikKLQkgICAgewotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJSZWxvY2F0aW9uIGNhbm5vdCBiZSBkb25lIHdoZW4gdXNpbmcgLW1yZWxvY2F0YWJsZSIpKTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotDAotI2lmZGVmIFRFX1BFCi0KLS8qCi0gKiBTdW1tYXJ5IG9mIHBhcnNlX3RvY19lbnRyeSgpLgotICoKLSAqIGluOglJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIHRoZSAnWycgaW4gb25lIG9mOgotICoKLSAqICAgICAgICBbdG9jXSBbdG9jdl0gW3RvYzMyXSBbdG9jNjRdCi0gKgotICogICAgICBBbnl0aGluZyBlbHNlIGlzIGFuIGVycm9yIG9mIG9uZSBraW5kIG9yIGFub3RoZXIuCi0gKgotICogb3V0OgkKLSAqICAgcmV0dXJuIHZhbHVlOiBzdWNjZXNzIG9yIGZhaWx1cmUKLSAqICAgdG9jX2tpbmQ6ICAgICBraW5kIG9mIHRvYyByZWZlcmVuY2UKLSAqICAgaW5wdXRfbGluZV9wb2ludGVyOgotICogICAgIHN1Y2Nlc3M6IGZpcnN0IGNoYXIgYWZ0ZXIgdGhlICddJwotICogICAgIGZhaWx1cmU6IHVuY2hhbmdlZAotICoKLSAqIHNldHRpbmdzOgotICoKLSAqICAgICBbdG9jXSAgIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBkZWZhdWx0X3RvYwotICogICAgIFt0b2N2XSAgLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IGRhdGFfaW5fdG9jCi0gKiAgICAgW3RvYzMyXSAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gbXVzdF9iZV8zMgotICogICAgIFt0b2M2NF0gLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IG11c3RfYmVfNjQKLSAqCi0gKi8KLQotZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgCi17IAotICBkZWZhdWx0X3RvYywgLyogVGhlIHRvYyBjZWxsIGNvbnN0cnVjdGVkIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgc2l6ZSAqLwotICBkYXRhX2luX3RvYywgLyogVGhpcyBpcyBhIGRpcmVjdCByZWZlcmVuY2UgdG8gYSB0b2MgY2VsbCAgICAgICAgICAgICAgICAgICAqLwotICBtdXN0X2JlXzMyLCAgLyogVGhlIHRvYyBjZWxsIGNvbnN0cnVjdGVkIG11c3QgYmUgMzIgYml0cyB3aWRlICAgICAgICAgICAgICAqLwotICBtdXN0X2JlXzY0ICAgLyogVGhlIHRvYyBjZWxsIGNvbnN0cnVjdGVkIG11c3QgYmUgNjQgYml0cyB3aWRlICAgICAgICAgICAgICAqLwotfTsKLQotc3RhdGljIGludAotcGFyc2VfdG9jX2VudHJ5KHRvY19raW5kKQotICAgICBlbnVtIHRvY19zaXplX3F1YWxpZmllciAqdG9jX2tpbmQ7Ci17Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyICp0b2Nfc3BlYzsKLSAgY2hhciBjOwotICBlbnVtIHRvY19zaXplX3F1YWxpZmllciB0OwotCi0gIC8qIHNhdmUgdGhlIGlucHV0X2xpbmVfcG9pbnRlciAqLwotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBza2lwIG92ZXIgdGhlICdbJyAsIGFuZCB3aGl0ZXNwYWNlICovCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIAotICAvKiBmaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICB0b2Nfc3BlYyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2MiKSA9PSAwKSAKLSAgICB7Ci0gICAgICB0ID0gZGVmYXVsdF90b2M7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2N2IikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IGRhdGFfaW5fdG9jOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jMzIiKSA9PSAwKSAKLSAgICB7Ci0gICAgICB0ID0gbXVzdF9iZV8zMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvYzY0IikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IG11c3RfYmVfNjQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I6IGludmFsaWQgdG9jIHNwZWNpZmllciBgJXMnIiksIHRvY19zcGVjKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBub3cgZmluZCB0aGUgJ10nICovCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7CSAgICAgLyogbGVhZGluZyB3aGl0ZXNwYWNlIGNvdWxkIGJlIHRoZXJlLiAqLwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOyAvKiBpbnB1dF9saW5lX3BvaW50ZXItPnBhc3QgY2hhciBpbiBjLiAqLwotCi0gIGlmIChjICE9ICddJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvcjogZXhwZWN0ZWQgYF0nLCBmb3VuZCAgYCVjJyIpLCBjKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAqdG9jX2tpbmQgPSB0OyAgICAgICAgICAgICAvKiBzZXQgcmV0dXJuIHZhbHVlICovCi0gIHJldHVybiAxOwotfQotI2VuZGlmCi0MCi0KLS8qIFdlIG5lZWQgdG8ga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgV2UgY2FuJ3Qgc2ltcGx5IGdlbmVyYXRlIHRoZW0gYXMKLSAgIHdlIGdvLCBiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSB1cyB0byBmaXJzdCBjcmVhdGUgdGhlIGZyYWcsIGFuZAotICAgdGhhdCB3b3VsZCBzY3JldyB1cCByZWZlcmVuY2VzIHRvIGBgLicnLiAgKi8KLQotc3RydWN0IHBwY19maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19OwotCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3Bjb2RlOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotICBpbnQgc2tpcF9vcHRpb25hbDsKLSAgaW50IG5lZWRfcGFyZW47Ci0gIGludCBuZXh0X29waW5kZXg7Ci0gIHN0cnVjdCBwcGNfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci0gIGludCBmYzsKLSAgY2hhciAqZjsKLSAgaW50IGk7Ci0jaWZkZWYgT0JKX0VMRgotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0jZW5kaWYKLQotICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQotICAgIDsKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgKnMrKyA9ICdcMCc7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3Bjb2RlIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqKSBoYXNoX2ZpbmQgKHBwY19oYXNoLCBzdHIpOwotICBpZiAob3Bjb2RlID09IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm87Ci0KLSAgICAgIG1hY3JvID0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICopIGhhc2hfZmluZCAocHBjX21hY3JvX2hhc2gsIHN0cik7Ci0gICAgICBpZiAobWFjcm8gPT0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICopIE5VTEwpCi0JYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICBlbHNlCi0JcHBjX21hY3JvIChzLCBtYWNybyk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotCi0gIHN0ciA9IHM7Ci0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICAvKiBQb3dlclBDIG9wZXJhbmRzIGFyZSBqdXN0IGV4cHJlc3Npb25zLiAgVGhlIG9ubHkgcmVhbCBpc3N1ZSBpcwotICAgICB0aGF0IGEgZmV3IG9wZXJhbmQgdHlwZXMgYXJlIG9wdGlvbmFsLiAgQWxsIGNhc2VzIHdoaWNoIG1pZ2h0IHVzZQotICAgICBhbiBvcHRpb25hbCBvcGVyYW5kIHNlcGFyYXRlIHRoZSBvcGVyYW5kcyBvbmx5IHdpdGggY29tbWFzIChpbgotICAgICBzb21lIGNhc2VzIHBhcmVudGhlc2VzIGFyZSB1c2VkLCBhcyBpbiBgYGx3eiAxLDAoMSknJyBidXQgc3VjaAotICAgICBjYXNlcyBuZXZlciBoYXZlIG9wdGlvbmFsIG9wZXJhbmRzKS4gIFRoZXJlIGlzIG5ldmVyIG1vcmUgdGhhbgotICAgICBvbmUgb3B0aW9uYWwgb3BlcmFuZCBmb3IgYW4gaW5zdHJ1Y3Rpb24uICBTbywgYmVmb3JlIHdlIHN0YXJ0Ci0gICAgIHNlcmlvdXNseSBwYXJzaW5nIHRoZSBvcGVyYW5kcywgd2UgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4KLSAgICAgb3B0aW9uYWwgb3BlcmFuZCwgYW5kLCBpZiB3ZSBkbywgd2UgY291bnQgdGhlIG51bWJlciBvZiBjb21tYXMgdG8KLSAgICAgc2VlIHdoZXRoZXIgdGhlIG9wZXJhbmQgc2hvdWxkIGJlIG9taXR0ZWQuICAqLwotICBza2lwX29wdGlvbmFsID0gMDsKLSAgZm9yIChvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4X3B0ciAhPSAwOyBvcGluZGV4X3B0cisrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLSAgICAgIG9wZXJhbmQgPSAmcG93ZXJwY19vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX09QVElPTkFMKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBvcGNvdW50OwotCi0JICAvKiBUaGVyZSBpcyBhbiBvcHRpb25hbCBvcGVyYW5kLiAgQ291bnQgdGhlIG51bWJlciBvZgotCSAgICAgY29tbWFzIGluIHRoZSBpbnB1dCBsaW5lLiAgKi8KLQkgIGlmICgqc3RyID09ICdcMCcpCi0JICAgIG9wY291bnQgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3Bjb3VudCA9IDE7Ci0JICAgICAgcyA9IHN0cjsKLQkgICAgICB3aGlsZSAoKHMgPSBzdHJjaHIgKHMsICcsJykpICE9IChjaGFyICopIE5VTEwpCi0JCXsKLQkJICArK29wY291bnQ7Ci0JCSAgKytzOwotCQl9Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlcmUgYXJlIGZld2VyIG9wZXJhbmRzIGluIHRoZSBsaW5lIHRoZW4gYXJlIGNhbGxlZAotCSAgICAgZm9yIGJ5IHRoZSBpbnN0cnVjdGlvbiwgd2Ugd2FudCB0byBza2lwIHRoZSBvcHRpb25hbAotCSAgICAgb3BlcmFuZC4gICovCi0JICBpZiAob3Bjb3VudCA8IHN0cmxlbiAob3Bjb2RlLT5vcGVyYW5kcykpCi0JICAgIHNraXBfb3B0aW9uYWwgPSAxOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEdhdGhlciB0aGUgb3BlcmFuZHMuICAqLwotICBuZWVkX3BhcmVuID0gMDsKLSAgbmV4dF9vcGluZGV4ID0gMDsKLSAgZmMgPSAwOwotICBmb3IgKG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXhfcHRyICE9IDA7IG9waW5kZXhfcHRyKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICAgIGNoYXIgKmhvbGQ7Ci0gICAgICBleHByZXNzaW9uUyBleDsKLSAgICAgIGNoYXIgZW5kYzsKLQotICAgICAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQotCW9wZXJhbmQgPSAmcG93ZXJwY19vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotICAgICAgZWxzZQotCXsKLQkgIG9wZXJhbmQgPSAmcG93ZXJwY19vcGVyYW5kc1tuZXh0X29waW5kZXhdOwotCSAgbmV4dF9vcGluZGV4ID0gMDsKLQl9Ci0KLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBmYWtlIG9wZXJhbmQsIHRoZW4gd2UgZG8gbm90IGV4cGVjdCBhbnl0aGluZwotCSBmcm9tIHRoZSBpbnB1dC4gICovCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRkFLRSkgIT0gMCkKLQl7Ci0JICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCAwTCwgJmVycm1zZyk7Ci0JICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIGFzX2JhZCAoZXJybXNnKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBvcHRpb25hbCBvcGVyYW5kLCBhbmQgd2UgYXJlIHNraXBwaW5nIGl0LCBqdXN0Ci0JIGluc2VydCBhIHplcm8uICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX09QVElPTkFMKSAhPSAwCi0JICAmJiBza2lwX29wdGlvbmFsKQotCXsKLQkgIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0JICAgIHsKLQkgICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCAwTCwgJmVycm1zZyk7Ci0JICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCQlhc19iYWQgKGVycm1zZyk7Ci0JICAgIH0KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORVhUKSAhPSAwKQotCSAgICBuZXh0X29waW5kZXggPSAqb3BpbmRleF9wdHIgKyAxOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICAqLwotICAgICAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotI2lmZGVmIFRFX1BFCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnWycpIAotCXsKLQkgIC8qIFdlIGFyZSBleHBlY3Rpbmcgc29tZXRoaW5nIGxpa2UgdGhlIHNlY29uZCBhcmd1bWVudCBoZXJlOgotCi0JICAgICAgICBsd3ogcjQsW3RvY10uR1MuMC5zdGF0aWNfaW50KHJ0b2MpCi0gICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgotCSAgICAgVGhlIGFyZ3VtZW50IGZvbGxvd2luZyB0aGUgYF0nIG11c3QgYmUgYSBzeW1ib2wgbmFtZSwgYW5kIHRoZSAKLSAgICAgICAgICAgICByZWdpc3RlciBtdXN0IGJlIHRoZSB0b2MgcmVnaXN0ZXI6ICdydG9jJyBvciAnMicKLQotCSAgICAgVGhlIGVmZmVjdCBpcyB0byAwIGFzIHRoZSBkaXNwbGFjZW1lbnQgZmllbGQKLQkgICAgIGluIHRoZSBpbnN0cnVjdGlvbiwgYW5kIGlzc3VlIGFuIElNQUdFX1JFTF9QUENfVE9DUkVMMTYgKG9yCi0JICAgICB0aGUgYXBwcm9wcmlhdGUgdmFyaWF0aW9uKSByZWxvYyBhZ2FpbnN0IGl0IGJhc2VkIG9uIHRoZSBzeW1ib2wuCi0JICAgICBUaGUgbGlua2VyIHdpbGwgYnVpbGQgdGhlIHRvYywgYW5kIGluc2VydCB0aGUgcmVzb2x2ZWQgdG9jIG9mZnNldC4KLQotCSAgICAgTm90ZToKLQkgICAgIG8gVGhlIHNpemUgb2YgdGhlIHRvYyBlbnRyeSBpcyBjdXJyZW50bHkgYXNzdW1lZCB0byBiZQotCSAgICAgICAzMiBiaXRzLiBUaGlzIHNob3VsZCBub3QgYmUgYXNzdW1lZCB0byBiZSBhIGhhcmQgY29kZWQKLQkgICAgICAgbnVtYmVyLgotCSAgICAgbyBJbiBhbiBlZmZvcnQgdG8gY29wZSB3aXRoIGEgY2hhbmdlIGZyb20gMzIgdG8gNjQgYml0cywKLQkgICAgICAgdGhlcmUgYXJlIGFsc28gdG9jIGVudHJpZXMgdGhhdCBhcmUgc3BlY2lmaWVkIHRvIGJlCi0JICAgICAgIGVpdGhlciAzMiBvciA2NCBiaXRzOgotICAgICAgICAgICAgICAgICBsd3ogcjQsW3RvYzMyXS5HUy4wLnN0YXRpY19pbnQocnRvYykKLQkgICAgICAgICBsd3ogcjQsW3RvYzY0XS5HUy4wLnN0YXRpY19pbnQocnRvYykKLQkgICAgICAgVGhlc2UgZGVtYW5kIHRvYyBlbnRyaWVzIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSwgYW5kIHRoZQotCSAgICAgICBpbnN0cnVjdGlvbiBwcm9iYWJseSByZXF1aXJlcyBpdC4KLSAgICAgICAgICAqLwotCi0JICBpbnQgdmFsaWRfdG9jOwotCSAgZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgdG9jX2tpbmQ7Ci0JICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgdG9jX3JlbG9jOwotCi0JICAvKiBnbyBwYXJzZSBvZmYgdGhlIFt0b2NYWF0gcGFydCAqLwotCSAgdmFsaWRfdG9jID0gcGFyc2VfdG9jX2VudHJ5KCZ0b2Nfa2luZCk7Ci0KLQkgIGlmICghdmFsaWRfdG9jKSAKLQkgICAgewotCSAgICAgIC8qIE5vdGU6IG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBpc3N1ZWQuICAgICAqLwotCSAgICAgIC8qIEZJWE1FOiB3aGF0IHNvcnQgb2YgcmVjb3Zlcnkgc2hvdWxkIHdlIGRvPyAqLwotCSAgICAgIC8qICAgICAgICBkZW1hbmRfcmVzdF9vZl9saW5lKCk7IHJldHVybjsgPyAgICAqLwotCSAgICB9Ci0KLQkgIC8qIE5vdyBnZXQgdGhlIHN5bWJvbCBmb2xsb3dpbmcgdGhlICddJyAqLwotCSAgZXhwcmVzc2lvbigmZXgpOwotCi0JICBzd2l0Y2ggKHRvY19raW5kKQotCSAgICB7Ci0JICAgIGNhc2UgZGVmYXVsdF90b2M6Ci0JICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBtYXkgbm90IGhhdmUgc2VlbiB0aGUgc3ltYm9sIHlldCwgc2luY2UgICovCi0JICAgICAgLyogaXQgaXMgYWxsb3dlZCB0byBhcHBlYXIgb24gYSAuZXh0ZXJuIG9yIC5nbG9ibCBvciBqdXN0IGJlICovCi0JICAgICAgLyogYSBsYWJlbCBpbiB0aGUgLmRhdGEgc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgdG9jX3JlbG9jID0gQkZEX1JFTE9DX1BQQ19UT0MxNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBkYXRhX2luX3RvYzoKLQkgICAgICAvKiAxLiBUaGUgc3ltYm9sIG11c3QgYmUgZGVmaW5lZCBhbmQgZWl0aGVyIGluIHRoZSB0b2MgICAgICAgICovCi0JICAgICAgLyogICAgc2VjdGlvbiwgb3IgYSBnbG9iYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIC8qIDIuIFRoZSByZWxvYyBnZW5lcmF0ZWQgbXVzdCBoYXZlIHRoZSBUT0NERUZOIGZsYWcgc2V0IGluICAgKi8KLQkgICAgICAvKiAgICB1cHBlciBiaXQgbWVzcyBvZiB0aGUgcmVsb2MgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgLyogRklYTUU6IEl0J3MgYSBsaXR0bGUgY29uZnVzaW5nIHdoYXQgdGhlIHRvY3YgcXVhbGlmaWVyIGNhbiAqLwotCSAgICAgIC8qICAgICAgICBiZSB1c2VkIGZvci4gQXQgdGhlIHZlcnkgbGVhc3QsIEkndmUgc2VlbiB0aHJlZSAgICAgKi8KLQkgICAgICAvKiAgICAgICAgdXNlcywgb25seSBvbmUgb2Ygd2hpY2ggSSdtIHN1cmUgSSBjYW4gZXhwbGFpbi4gICAgICovCi0JICAgICAgaWYgKGV4Llhfb3AgPT0gT19zeW1ib2wpIAotCQl7CQkgIAotCQkgIGFzc2VydCAoZXguWF9hZGRfc3ltYm9sICE9IE5VTEwpOwotCQkgIGlmIChzeW1ib2xfZ2V0X2JmZHN5bSAoZXguWF9hZGRfc3ltYm9sKS0+c2VjdGlvbgotCQkgICAgICAhPSB0b2NkYXRhX3NlY3Rpb24pCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZChfKCJbdG9jdl0gc3ltYm9sIGlzIG5vdCBhIHRvYyBzeW1ib2wiKSk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHRvY19yZWxvYyA9IEJGRF9SRUxPQ19QUENfVE9DMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgbXVzdF9iZV8zMjoKLQkgICAgICAvKiBGSVhNRTogdGhlc2UgbmV4dCB0d28gc3BlY2lmaWNhbGx5IHNwZWNpZnkgMzIvNjQgYml0IHRvYyAgICovCi0JICAgICAgLyogICAgICAgIGVudHJpZXMuIFdlIGRvbid0IHN1cHBvcnQgdGhlbSB0b2RheS4gSXMgdGhpcyB0aGUgICAqLwotCSAgICAgIC8qICAgICAgICByaWdodCB3YXkgdG8gc2F5IHRoYXQ/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgIGFzX2JhZCAoXygiVW5pbXBsZW1lbnRlZCB0b2MzMiBleHByZXNzaW9uIG1vZGlmaWVyIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIG11c3RfYmVfNjQ6Ci0JICAgICAgLyogRklYTUU6IHNlZSBhYm92ZSAqLwotCSAgICAgIHRvY19yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgICAgYXNfYmFkIChfKCJVbmltcGxlbWVudGVkIHRvYzY0IGV4cHJlc3Npb24gbW9kaWZpZXIiKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZihzdGRlcnIsIAotCQkgICAgICBfKCJVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBbJWRdIGZyb20gcGFyc2VfdG9jX2VudHJ5IVxuIiksCi0JCSAgICAgIHRvY19raW5kKTsKLQkgICAgICBhYm9ydCgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkgIGZpeHVwc1tmY10ucmVsb2MgPSB0b2NfcmVsb2M7Ci0JICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgKytmYzsKLQotICAgICAgICAgIC8qIE9rLiBXZSd2ZSBzZXQgdXAgdGhlIGZpeHVwIGZvciB0aGUgaW5zdHJ1Y3Rpb24uIE5vdyBtYWtlIGl0Ci0JICAgICBsb29rIGxpa2UgdGhlIGNvbnN0YW50IDAgd2FzIGZvdW5kIGhlcmUgKi8KLQkgIGV4LlhfdW5zaWduZWQgPSAxOwotCSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBleC5YX2FkZF9udW1iZXIgPSAwOwotCSAgZXguWF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKLQl9Ci0KLSAgICAgIGVsc2UKLSNlbmRpZgkJLyogVEVfUEUgKi8KLQl7Ci0JICBpZiAoISByZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0NSKSAhPSAwKQotCQljcl9vcGVyYW5kID0gdHJ1ZTsKLQkgICAgICBleHByZXNzaW9uICgmZXgpOwotCSAgICAgIGNyX29wZXJhbmQgPSBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotICAgICAgaWYgKGV4Llhfb3AgPT0gT19pbGxlZ2FsKQotCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOwotICAgICAgZWxzZSBpZiAoZXguWF9vcCA9PSBPX2Fic2VudCkKLQlhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19yZWdpc3RlcikKLQl7Ci0JICBpbnNuID0gcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCi0JCQkJICAgICAoY2hhciAqKSBOVUxMLCAwKTsKLQl9Ci0gICAgICBlbHNlIGlmIChleC5YX29wID09IE9fY29uc3RhbnQpCi0JewotI2lmZGVmIE9CSl9FTEYKLQkgIC8qIEFsbG93IEBIQSwgQEwsIEBIIG9uIGNvbnN0YW50cy4gKi8KLQkgIGNoYXIgKm9yaWdfc3RyID0gc3RyOwotCi0JICBpZiAoKHJlbG9jID0gcHBjX2VsZl9zdWZmaXggKCZzdHIsICZleCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JICAgIHN3aXRjaCAocmVsb2MpCi0JICAgICAgewotCSAgICAgIGRlZmF1bHQ6Ci0JCXN0ciA9IG9yaWdfc3RyOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JCS8qIFhfdW5zaWduZWQgaXMgdGhlIGRlZmF1bHQsIHNvIGlmIHRoZSB1c2VyIGhhcyBkb25lCi0gICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIHdoaWNoIGNsZWFyZWQgaXQsIHdlIGFsd2F5cyBwcm9kdWNlIGEKLSAgICAgICAgICAgICAgICAgICBzaWduZWQgdmFsdWUuICAqLwotCQlpZiAoZXguWF91bnNpZ25lZAotCQkgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSA9PSAwKQotCQkgIGV4LlhfYWRkX251bWJlciAmPSAweGZmZmY7Ci0JCWVsc2UKLQkJICBleC5YX2FkZF9udW1iZXIgPSAoKChleC5YX2FkZF9udW1iZXIgJiAweGZmZmYpCi0JCQkJICAgICAgXiAweDgwMDApCi0JCQkJICAgICAtIDB4ODAwMCk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLQkJZXguWF9hZGRfbnVtYmVyID0gKGV4LlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCQlleC5YX2FkZF9udW1iZXIgPSAoKChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmKQotCQkJCSAgICsgKChleC5YX2FkZF9udW1iZXIgPj4gMTUpICYgMSkpOwotCQlicmVhazsKLQkgICAgICB9Ci0jZW5kaWYKLQkgIGluc24gPSBwcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKLQkJCQkgICAgIChjaGFyICopIE5VTEwsIDApOwotCX0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICgocmVsb2MgPSBwcGNfZWxmX3N1ZmZpeCAoJnN0ciwgJmV4KSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICAvKiBGb3IgdGhlIGFic291bHRlIGZvcm1zIG9mIGJyYW5jaHMsIGNvbnZlcnQgdGhlIFBDIHJlbGF0aXZlIGZvcm0gYmFjayBpbnRvCi0JICAgICB0aGUgYWJzb2x1dGUuICAqLwotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyZWxvYykKLQkJewotCQljYXNlIEJGRF9SRUxPQ19QUENfQjI2OgotCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTI2OwotCQkgIGJyZWFrOwotCQljYXNlIEJGRF9SRUxPQ19QUENfQjE2OgotCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTE2OwotCQkgIGJyZWFrOwotCQljYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU46Ci0JCSAgcmVsb2MgPSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTjsKLQkJICBicmVhazsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTjoKLQkJICByZWxvYyA9IEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTjsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gMDsKLQkgIGZpeHVwc1tmY10ucmVsb2MgPSByZWxvYzsKLQkgICsrZmM7Ci0JfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICArK2ZjOwotCX0KLQotICAgICAgaWYgKG5lZWRfcGFyZW4pCi0JewotCSAgZW5kYyA9ICcpJzsKLQkgIG5lZWRfcGFyZW4gPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMCkKLQl7Ci0JICBlbmRjID0gJygnOwotCSAgbmVlZF9wYXJlbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCWVuZGMgPSAnLCc7Ci0KLSAgICAgIC8qIFRoZSBjYWxsIHRvIGV4cHJlc3Npb24gc2hvdWxkIGhhdmUgYWR2YW5jZWQgc3RyIHBhc3QgYW55Ci0JIHdoaXRlc3BhY2UuICAqLwotICAgICAgaWYgKCpzdHIgIT0gZW5kYwotCSAgJiYgKGVuZGMgIT0gJywnIHx8ICpzdHIgIT0gJ1wwJykpCi0JewotCSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I7IGZvdW5kIGAlYycgYnV0IGV4cGVjdGVkIGAlYyciKSwgKnN0ciwgZW5kYyk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICgqc3RyICE9ICdcMCcpCi0JKytzdHI7Ci0gICAgfQotCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLQotICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCi0gICAgIEJGRF9SRUxPQ19VTlVTRUQgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkKLSAgICAgaGFuZGxlIGZpeHVwcyBmb3IgYW55IG9wZXJhbmQgdHlwZSwgYWx0aG91Z2ggdGhhdCBpcyBhZG1pdHRlZGx5Ci0gICAgIG5vdCBhIHZlcnkgZXhjaXRpbmcgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbgotICAgICBtZF9hcHBseV9maXguICAqLwotICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotCi0gICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOwotICAgICAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCXsKLQkgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwc1tpXS5yZWxvYyk7Ci0JICBpbnQgc2l6ZTsKLQkgIGludCBvZmZzZXQ7Ci0JICBmaXhTICpmaXhQOwotCi0JICBpZiAoIXJlbG9jX2hvd3RvKQotCSAgICBhYm9ydCAoKTsKLQotCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCSAgb2Zmc2V0ID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAoNCAtIHNpemUpIDogMDsKLQotCSAgaWYgKHNpemUgPCAxIHx8IHNpemUgPiA0KQotCSAgICBhYm9ydCgpOwotCi0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsIHNpemUsCi0JCQkgICAgICAmZml4dXBzW2ldLmV4cCwgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJICAgICAgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgLyogVHVybiBvZmYgY29tcGxhaW50cyB0aGF0IHRoZSBhZGRlbmQgaXMgdG9vIGxhcmdlIGZvciB0aGluZ3MgbGlrZQotCSAgICAgZm9vKzEwMDAwMEBoYS4gICovCi0JICBzd2l0Y2ggKGZpeHVwc1tpXS5yZWxvYykKLQkgICAgewotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCSAgICAgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJICAgICAmZml4dXBzW2ldLmV4cCwKLQkJICAgICAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9SRUxBVElWRSkgIT0gMCwKLQkJICAgICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKLQkJICAgICAgIChmaXh1cHNbaV0ub3BpbmRleCArIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpKSk7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgYSBtYWNyby4gIEdhdGhlciBhbGwgdGhlIG9wZXJhbmRzLCB0cmFuc2Zvcm0gdGhlbSBhcwotICAgZGVzY3JpYmVkIGJ5IHRoZSBtYWNybywgYW5kIGNhbGwgbWRfYXNzZW1ibGUgcmVjdXJzaXZlbHkuICBBbGwgdGhlCi0gICBvcGVyYW5kcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hczsgd2UgZG9uJ3QgYWNjZXB0IHBhcmVudGhlc2VzCi0gICBhcm91bmQgb3BlcmFuZHMgaGVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfbWFjcm8gKHN0ciwgbWFjcm8pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotewotICBjaGFyICpvcGVyYW5kc1sxMF07Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgY2hhciAqczsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY29uc3QgY2hhciAqZm9ybWF0OwotICBpbnQgYXJnOwotICBjaGFyICpzZW5kOwotICBjaGFyICpjb21wbGV0ZTsKLQotICAvKiBHYXRoZXIgdGhlIHVzZXJzIG9wZXJhbmRzIGludG8gdGhlIG9wZXJhbmRzIGFycmF5LiAgKi8KLSAgY291bnQgPSAwOwotICBzID0gc3RyOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoY291bnQgPj0gc2l6ZW9mIG9wZXJhbmRzIC8gc2l6ZW9mIG9wZXJhbmRzWzBdKQotCWJyZWFrOwotICAgICAgb3BlcmFuZHNbY291bnQrK10gPSBzOwotICAgICAgcyA9IHN0cmNociAocywgJywnKTsKLSAgICAgIGlmIChzID09IChjaGFyICopIE5VTEwpCi0JYnJlYWs7Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICB9ICAKLQotICBpZiAoY291bnQgIT0gbWFjcm8tPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygid3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXb3JrIG91dCBob3cgbGFyZ2UgdGhlIHN0cmluZyBtdXN0IGJlICh0aGUgc2l6ZSBpcyB1bmJvdW5kZWQKLSAgICAgYmVjYXVzZSBpdCBpbmNsdWRlcyB1c2VyIGlucHV0KS4gICovCi0gIGxlbiA9IDA7Ci0gIGZvcm1hdCA9IG1hY3JvLT5mb3JtYXQ7Ci0gIHdoaWxlICgqZm9ybWF0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCpmb3JtYXQgIT0gJyUnKQotCXsKLQkgICsrbGVuOwotCSAgKytmb3JtYXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFyZyA9IHN0cnRvbCAoZm9ybWF0ICsgMSwgJnNlbmQsIDEwKTsKLQkgIGtub3cgKHNlbmQgIT0gZm9ybWF0ICYmIGFyZyA+PSAwICYmIGFyZyA8IGNvdW50KTsKLQkgIGxlbiArPSBzdHJsZW4gKG9wZXJhbmRzW2FyZ10pOwotCSAgZm9ybWF0ID0gc2VuZDsKLQl9Ci0gICAgfQotCi0gIC8qIFB1dCB0aGUgc3RyaW5nIHRvZ2V0aGVyLiAgKi8KLSAgY29tcGxldGUgPSBzID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKLSAgZm9ybWF0ID0gbWFjcm8tPmZvcm1hdDsKLSAgd2hpbGUgKCpmb3JtYXQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoKmZvcm1hdCAhPSAnJScpCi0JKnMrKyA9ICpmb3JtYXQrKzsKLSAgICAgIGVsc2UKLQl7Ci0JICBhcmcgPSBzdHJ0b2wgKGZvcm1hdCArIDEsICZzZW5kLCAxMCk7Ci0JICBzdHJjcHkgKHMsIG9wZXJhbmRzW2FyZ10pOwotCSAgcyArPSBzdHJsZW4gKHMpOwotCSAgZm9ybWF0ID0gc2VuZDsKLQl9Ci0gICAgfQotICAqcyA9ICdcMCc7Ci0KLSAgLyogQXNzZW1ibGUgdGhlIGNvbnN0cnVjdGVkIGluc3RydWN0aW9uLiAgKi8KLSAgbWRfYXNzZW1ibGUgKGNvbXBsZXRlKTsKLX0gIAotDAotI2lmZGVmIE9CSl9FTEYKLS8qIEZvciBFTEYsIGFkZCBzdXBwb3J0IGZvciBTSEZfRVhDTFVERSBhbmQgU0hUX09SREVSRUQgKi8KLQotaW50Ci1wcGNfc2VjdGlvbl9sZXR0ZXIgKGxldHRlciwgcHRyX21zZykKLSAgICAgaW50IGxldHRlcjsKLSAgICAgY2hhciAqKnB0cl9tc2c7Ci17Ci0gIGlmIChsZXR0ZXIgPT0gJ2UnKQotICAgIHJldHVybiBTSEZfRVhDTFVERTsKLQotICAqcHRyX21zZyA9IF8oIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmU6IHdhbnQgYSx3LHgsZSBpbiBzdHJpbmciKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fd29yZCAoc3RyLCBsZW4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgaWYgKGxlbiA9PSA3ICYmIHN0cm5jbXAgKHN0ciwgImV4Y2x1ZGUiLCA3KSA9PSAwKQotICAgIHJldHVybiBTSEZfRVhDTFVERTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fdHlwZSAoc3RyLCBsZW4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgaWYgKGxlbiA9PSA3ICYmIHN0cm5jbXAgKHN0ciwgIm9yZGVyZWQiLCA3KSA9PSAwKQotICAgIHJldHVybiBTSFRfT1JERVJFRDsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fZmxhZ3MgKGZsYWdzLCBhdHRyLCB0eXBlKQotICAgICBpbnQgZmxhZ3M7Ci0gICAgIGludCBhdHRyOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gU0hUX09SREVSRUQpCi0gICAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfU09SVF9FTlRSSUVTOwotCi0gIGlmIChhdHRyICYgU0hGX0VYQ0xVREUpCi0gICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgcmV0dXJuIGZsYWdzOwotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotDAotLyogUHNldWRvLW9wIGhhbmRsaW5nLiAgKi8KLQotLyogVGhlIC5ieXRlIHBzZXVkby1vcC4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgbm9ybWFsIC5ieXRlCi0gICBwc2V1ZG8tb3AsIGJ1dCBpdCBjYW4gYWxzbyB0YWtlIGEgc2luZ2xlIEFTQ0lJIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYnl0ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCInKQotICAgIHsKLSAgICAgIGNvbnMgKDEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBHYXRoZXIgY2hhcmFjdGVycy4gIEEgcmVhbCBkb3VibGUgcXVvdGUgaXMgZG91YmxlZC4gIFVudXN1YWwKLSAgICAgY2hhcmFjdGVycyBhcmUgbm90IHBlcm1pdHRlZC4gICovCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgICAgIGlmIChjID09ICdcIicpCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKLQkgICAgYnJlYWs7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0KLSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0jaWZkZWYgT0JKX1hDT0ZGCi0KLS8qIFhDT0ZGIHNwZWNpZmljIHBzZXVkby1vcCBoYW5kbGluZy4gICovCi0KLS8qIFRoaXMgaXMgc2V0IGlmIHdlIGFyZSBjcmVhdGluZyBhIC5zdGFieCBzeW1ib2wsIHNpbmNlIHdlIGRvbid0IHdhbnQKLSAgIHRvIGhhbmRsZSBzeW1ib2wgc3VmZml4ZXMgZm9yIHN1Y2ggc3ltYm9scy4gICovCi1zdGF0aWMgYm9vbGVhbiBwcGNfc3RhYl9zeW1ib2w7Ci0KLS8qIFRoZSAuY29tbSBhbmQgLmxjb21tIHBzZXVkby1vcHMgZm9yIFhDT0ZGLiAgWENPRkYgcHV0cyBjb21tb24KLSAgIHN5bWJvbHMgaW4gdGhlIC5ic3Mgc2VnbWVudCBhcyB0aG91Z2ggdGhleSB3ZXJlIGxvY2FsIGNvbW1vbgotICAgc3ltYm9scywgYW5kIHVzZXMgYSBkaWZmZXJlbnQgc21jbGFzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19jb21tIChsY29tbSkKLSAgICAgaW50IGxjb21tOwotewotICBhc2VjdGlvbiAqY3VycmVudF9zZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBjaGFyICplbmRfbmFtZTsKLSAgb2Zmc2V0VCBzaXplOwotICBvZmZzZXRUIGFsaWduOwotICBzeW1ib2xTICpsY29tbV9zeW0gPSBOVUxMOwotICBzeW1ib2xTICpzeW07Ci0gIGNoYXIgKnBmcmFnOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZW5kX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICplbmRfbmFtZSA9IGVuZGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBzaXplIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKHNpemUgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibmVnYXRpdmUgc2l6ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICghIGxjb21tKQotICAgIHsKLSAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAuY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQlhbGlnbiA9IDM7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKGFsaWduIDw9IDApCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgICAgIGFsaWduID0gMzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpsY29tbV9uYW1lOwotICAgICAgY2hhciBsY29tbV9lbmRjOwotCi0gICAgICBpZiAoc2l6ZSA8PSAxKQotCWFsaWduID0gMDsKLSAgICAgIGVsc2UgaWYgKHNpemUgPD0gMikKLQlhbGlnbiA9IDE7Ci0gICAgICBlbHNlIGlmIChzaXplIDw9IDQpCi0JYWxpZ24gPSAyOwotICAgICAgZWxzZQotCWFsaWduID0gMzsKLQotICAgICAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5sY29tbSBhcHBlYXJzIHRvIGJlIHRoZSByZWFsIGxvY2FsCi0JIGNvbW1vbiBzeW1ib2wgdG8gY3JlYXRlLiAgUmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIG5hbWVkIGluCi0JIHRoZSBmaXJzdCBhcmd1bWVudCBhcmUgdHVybmVkIGludG8gcmVmZXJlbmNlcyB0byB0aGUgdGhpcmQKLQkgYXJndW1lbnQuICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyByZWFsIHN5bWJvbCBuYW1lIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgbGNvbW1fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGxjb21tX2VuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIAotICAgICAgbGNvbW1fc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobGNvbW1fbmFtZSk7Ci0KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBsY29tbV9lbmRjOwotICAgIH0KLQotICAqZW5kX25hbWUgPSAnXDAnOwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmVuZF9uYW1lID0gZW5kYzsKLQotICBpZiAoU19JU19ERUZJTkVEIChzeW0pCi0gICAgICB8fCBTX0dFVF9WQUxVRSAoc3ltKSAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byByZWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgIAotICBpZiAoISBsY29tbQotICAgICAgfHwgISBTX0lTX0RFRklORUQgKGxjb21tX3N5bSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqZGVmX3N5bTsKLSAgICAgIG9mZnNldFQgZGVmX3NpemU7Ci0KLSAgICAgIGlmICghIGxjb21tKQotCXsKLQkgIGRlZl9zeW0gPSBzeW07Ci0JICBkZWZfc2l6ZSA9IHNpemU7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sX2dldF90YyAobGNvbW1fc3ltKS0+b3V0cHV0ID0gMTsKLQkgIGRlZl9zeW0gPSBsY29tbV9zeW07Ci0JICBkZWZfc2l6ZSA9IDA7Ci0JfQotCi0gICAgICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMSk7Ci0gICAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0gIAotICAgICAgc3ltYm9sX3NldF9mcmFnIChkZWZfc3ltLCBmcmFnX25vdyk7Ci0gICAgICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIGRlZl9zeW0sCi0JCQlkZWZfc2l6ZSwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICAqcGZyYWcgPSAwOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bSwgYnNzX3NlY3Rpb24pOwotICAgICAgc3ltYm9sX2dldF90YyAoZGVmX3N5bSktPmFsaWduID0gYWxpZ247Ci0gICAgfQotICBlbHNlIGlmIChsY29tbSkKLSAgICB7Ci0gICAgICAvKiBBbGlnbiB0aGUgc2l6ZSBvZiBsY29tbV9zeW0uICAqLwotICAgICAgc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pLT5mcl9vZmZzZXQgPQotCSgoc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pLT5mcl9vZmZzZXQgKyAoMSA8PCBhbGlnbikgLSAxKQotCSAmfiAoKDEgPDwgYWxpZ24pIC0gMSkpOwotICAgICAgaWYgKGFsaWduID4gc3ltYm9sX2dldF90YyAobGNvbW1fc3ltKS0+YWxpZ24pCi0Jc3ltYm9sX2dldF90YyAobGNvbW1fc3ltKS0+YWxpZ24gPSBhbGlnbjsKLSAgICB9Ci0KLSAgaWYgKGxjb21tKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3ltIGFuIG9mZnNldCBmcm9tIGxjb21tX3N5bS4gICovCi0gICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGJzc19zZWN0aW9uKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBzeW1ib2xfZ2V0X2ZyYWcgKGxjb21tX3N5bSkpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pLT5mcl9vZmZzZXQpOwotICAgICAgc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pLT5mcl9vZmZzZXQgKz0gc2l6ZTsKLSAgICB9Ci0KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmNzZWN0IHBzZXVkby1vcC4gIFRoaXMgc3dpdGNoZXMgdXMgaW50byBhIGRpZmZlcmVudAotICAgc3Vic2VnbWVudC4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHN5bWJvbCB3aG9zZSB2YWx1ZSBpcyB0aGUKLSAgIHN0YXJ0IG9mIHRoZSAuY3NlY3QuICBJbiBDT0ZGLCBjc2VjdCBzeW1ib2xzIGdldCBzcGVjaWFsIGF1eAotICAgZW50cmllcyBkZWZpbmVkIGJ5IHRoZSB4X2NzZWN0IGZpZWxkIG9mIHVuaW9uIGludGVybmFsX2F1eGVudC4gIFRoZQotICAgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBhbGlnbm1lbnQgKHRoZSBkZWZhdWx0IGlzIDIpLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19jc2VjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIAotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBpZiAoU19HRVRfTkFNRSAoc3ltKVswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIEFuIHVubmFtZWQgY3NlY3QgaXMgYXNzdW1lZCB0byBiZSBbUFJdLiAgKi8KLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gWE1DX1BSOwotICAgIH0KLQotICBwcGNfY2hhbmdlX2NzZWN0IChzeW0pOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIENoYW5nZSB0byBhIGRpZmZlcmVudCBjc2VjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY2hhbmdlX2NzZWN0IChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSkKLSAgICBzdWJzZWdfc2V0IChTX0dFVF9TRUdNRU5UIChzeW0pLCBzeW1ib2xfZ2V0X3RjIChzeW0pLT5zdWJzZWcpOwotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUyAqKmxpc3RfcHRyOwotICAgICAgaW50IGFmdGVyX3RvYzsKLSAgICAgIGludCBob2xkX2NodW5rc2l6ZTsKLSAgICAgIHN5bWJvbFMgKmxpc3Q7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBuZXcgY3NlY3QuICBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHN5bWJvbCBjbGFzcyB0bwotCSBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgc2hvdWxkIGdvIGluIHRoZSB0ZXh0IHNlY3Rpb24gb3IgdGhlCi0JIGRhdGEgc2VjdGlvbi4gICovCi0gICAgICBhZnRlcl90b2MgPSAwOwotICAgICAgc3dpdGNoIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcykKLQl7Ci0JY2FzZSBYTUNfUFI6Ci0JY2FzZSBYTUNfUk86Ci0JY2FzZSBYTUNfREI6Ci0JY2FzZSBYTUNfR0w6Ci0JY2FzZSBYTUNfWE86Ci0JY2FzZSBYTUNfU1Y6Ci0JY2FzZSBYTUNfVEk6Ci0JY2FzZSBYTUNfVEI6Ci0JICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0JICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5zdWJzZWcgPSBwcGNfdGV4dF9zdWJzZWdtZW50OwotCSAgKytwcGNfdGV4dF9zdWJzZWdtZW50OwotCSAgbGlzdF9wdHIgPSAmcHBjX3RleHRfY3NlY3RzOwotCSAgYnJlYWs7Ci0JY2FzZSBYTUNfUlc6Ci0JY2FzZSBYTUNfVEMwOgotCWNhc2UgWE1DX1RDOgotCWNhc2UgWE1DX0RTOgotCWNhc2UgWE1DX1VBOgotCWNhc2UgWE1DX0JTOgotCWNhc2UgWE1DX1VDOgotCSAgaWYgKHBwY190b2NfY3NlY3QgIT0gTlVMTAotCSAgICAgICYmIChzeW1ib2xfZ2V0X3RjIChwcGNfdG9jX2NzZWN0KS0+c3Vic2VnICsgMQotCQkgID09IHBwY19kYXRhX3N1YnNlZ21lbnQpKQotCSAgICBhZnRlcl90b2MgPSAxOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltLCBkYXRhX3NlY3Rpb24pOwotCSAgc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnID0gcHBjX2RhdGFfc3Vic2VnbWVudDsKLQkgICsrcHBjX2RhdGFfc3Vic2VnbWVudDsKLQkgIGxpc3RfcHRyID0gJnBwY19kYXRhX2NzZWN0czsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIFdlIHNldCB0aGUgb2JzdGFjayBjaHVuayBzaXplIHRvIGEgc21hbGwgdmFsdWUgYmVmb3JlCi0gICAgICAgICBjaGFuZ2luZyBzdWJzZWdtZW50cywgc28gdGhhdCB3ZSBkb24ndCB1c2UgYSBsb3Qgb2YgbWVtb3J5Ci0gICAgICAgICBzcGFjZSBmb3Igd2hhdCBtYXkgYmUgYSBzbWFsbCBzZWN0aW9uLiAgKi8KLSAgICAgIGhvbGRfY2h1bmtzaXplID0gY2h1bmtzaXplOwotICAgICAgY2h1bmtzaXplID0gNjQ7Ci0KLSAgICAgIHN1YnNlZ19uZXcgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSksCi0JCSAgc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnKTsKLQotICAgICAgY2h1bmtzaXplID0gaG9sZF9jaHVua3NpemU7Ci0KLSAgICAgIGlmIChhZnRlcl90b2MpCi0JcHBjX2FmdGVyX3RvY19mcmFnID0gZnJhZ19ub3c7Ci0KLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCi0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5hbGlnbiA9IDI7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+d2l0aGluID0gc3ltOwotCSAgCi0gICAgICBmb3IgKGxpc3QgPSAqbGlzdF9wdHI7Ci0JICAgc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTDsKLQkgICBsaXN0ID0gc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQpCi0JOwotICAgICAgc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQgPSBzeW07Ci0JICAKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChzeW0sIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT53aXRoaW4sICZzeW1ib2xfcm9vdFAsCi0JCSAgICAgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQotCi0gIHBwY19jdXJyZW50X2NzZWN0ID0gc3ltOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIC50ZXh0IGFuZCAuZGF0YSBwc2V1ZG8tb3BzLiAgVGhlc2UKLSAgIHBzZXVkby1vcHMgYXJlbid0IHJlYWxseSB1c2VkIGJ5IFhDT0ZGOyB3ZSBpbXBsZW1lbnQgdGhlbSBmb3IgdGhlCi0gICBjb252ZW5pZW5jZSBvZiBwZW9wbGUgd2hvIGFyZW4ndCB1c2VkIHRvIFhDT0ZGLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19zZWN0aW9uICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIGlmICh0eXBlID09ICd0JykKLSAgICBuYW1lID0gIi50ZXh0W1BSXSI7Ci0gIGVsc2UgaWYgKHR5cGUgPT0gJ2QnKQotICAgIG5hbWUgPSAiLmRhdGFbUlddIjsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gIHBwY19jaGFuZ2VfY3NlY3QgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSAuc2VjdGlvbiBwc2V1ZG8tb3AuICBUaGlzIGlzIG1vc3RseSB0bwotICAgZ2l2ZSBhbiBlcnJvciwgc2luY2UgWENPRkYgb25seSBzdXBwb3J0cyAudGV4dCwgLmRhdGEgYW5kIC5ic3MsIGJ1dAotICAgd2UgZG8gcGVybWl0IHRoZSB1c2VyIHRvIG5hbWUgdGhlIHRleHQgb3IgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19uYW1lZF9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnVzZXJfbmFtZTsKLSAgY29uc3QgY2hhciAqcmVhbF9uYW1lOwotICBjaGFyIGM7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICB1c2VyX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RyY21wICh1c2VyX25hbWUsICIudGV4dCIpID09IDApCi0gICAgcmVhbF9uYW1lID0gIi50ZXh0W1BSXSI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAodXNlcl9uYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgIHJlYWxfbmFtZSA9ICIuZGF0YVtSV10iOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJUaGUgWENPRkYgZmlsZSBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMiKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKHJlYWxfbmFtZSk7Ci0KLSAgcHBjX2NoYW5nZV9jc2VjdCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmV4dGVybiBwc2V1ZG8tb3AuICBXZSBjcmVhdGUgYW4gdW5kZWZpbmVkIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZXh0ZXJuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgKHZvaWQpIHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAubGdsb2JsIHBzZXVkby1vcC4gIEtlZXAgdGhlIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19sZ2xvYmwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5yZW5hbWUgcHNldWRvLW9wLiAgVGhlIFJTLzYwMDAgYXNzZW1ibGVyIGNhbiByZW5hbWUgc3ltYm9scywKLSAgIGFsdGhvdWdoIEkgZG9uJ3Qga25vdyB3aHkgaXQgYm90aGVycy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfcmVuYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqc3ltOwotICBpbnQgbGVuOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHJlbmFtZSBzdHJpbmciKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuc3RhYnggcHNldWRvLW9wLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGEgbm9ybWFsIC5zdGFicwotICAgcHNldWRvLW9wLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50LiAgQSBzYW1wbGUgaXMKLSAgICAgICAuc3RhYnggIm1haW46Ri0xIiwubWFpbiwxNDIsMAotICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBzeW1ib2wgbmFtZSB0byBjcmVhdGUuICBUaGUgc2Vjb25kIGlzIHRoZQotICAgdmFsdWUsIGFuZCB0aGUgdGhpcmQgaXMgdGhlIHN0b3JhZ2UgY2xhc3MuICBUaGUgZm91cnRoIHNlZW1zIHRvIGJlCi0gICBhbHdheXMgemVybywgYW5kIEkgYW0gYXNzdW1pbmcgaXQgaXMgdGhlIHR5cGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3N0YWJ4IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBsZW47Ci0gIHN5bWJvbFMgKnN5bTsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHBwY19zdGFiX3N5bWJvbCA9IHRydWU7Ci0gIHN5bSA9IHN5bWJvbF9tYWtlIChuYW1lKTsKLSAgcHBjX3N0YWJfc3ltYm9sID0gZmFsc2U7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lID0gbmFtZTsKLQotICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgc3dpdGNoIChleHAuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICBjYXNlIE9fYmlnOgotICAgICAgYXNfYmFkIChfKCJpbGxlZ2FsIC5zdGFieCBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQlzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSwgJmV4cCk7Ci0gICAgICBlbHNlCi0JewotCSAgU19TRVRfVkFMVUUgKHN5bSwKLQkJICAgICAgIGV4cC5YX2FkZF9udW1iZXIgKyBTX0dFVF9WQUxVRSAoZXhwLlhfYWRkX3N5bWJvbCkpOwotCSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIHN5bWJvbF9nZXRfZnJhZyAoZXhwLlhfYWRkX3N5bWJvbCkpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBzb21lIGNvbXBsZXggZXhwcmVzc2lvbi4gIFRoaXMgd2lsbCBwcm9iYWJseQotICAgICAgICAgZmFpbCBhdCBzb21lIGxhdGVyIHBvaW50LCBidXQgdGhpcyBpcyBwcm9iYWJseSB0aGUgcmlnaHQKLSAgICAgICAgIHRoaW5nIHRvIGRvIGhlcmUuICAqLwotICAgICAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW0sICZleHApOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIFNfU0VUX1NFR01FTlQgKHN5bSwgcHBjX2NvZmZfZGVidWdfc2VjdGlvbik7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgY2xhc3MiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHR5cGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTX1NFVF9EQVRBX1RZUEUgKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19TVFNZTSkKLSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW4gPSBwcGNfY3VycmVudF9ibG9jazsKLQotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wKLSAgICAgIHx8ICEgU19JU19FWFRFUk5BTCAoZXhwLlhfYWRkX3N5bWJvbCkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpICE9IGJzc19zZWN0aW9uKQotICAgIHBwY19mcm9iX2xhYmVsIChzeW0pOwotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgZXhwLlhfYWRkX3N5bWJvbCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAocHBjX2N1cnJlbnRfY3NlY3QpLT53aXRoaW4gPT0gZXhwLlhfYWRkX3N5bWJvbCkKLQlzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbiA9IHN5bTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5mdW5jdGlvbiBwc2V1ZG8tb3AuICBUaGlzIHRha2VzIHNldmVyYWwgYXJndW1lbnRzLiAgVGhlIGZpcnN0Ci0gICBhcmd1bWVudCBzZWVtcyB0byBiZSB0aGUgZXh0ZXJuYWwgbmFtZSBvZiB0aGUgc3ltYm9sLiAgVGhlIHNlY29uZAotICAgYXJnbWVudCBzZWVtcyB0byBiZSB0aGUgbGFiZWwgZm9yIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICBnY2MKLSAgIHVzZXMgdGhlIHNhbWUgbmFtZSBmb3IgYm90aC4gIEkgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHRoaXJkIGFuZAotICAgZm91cnRoIGFyZ3VtZW50cyBhcmUgbWVhbnQgdG8gYmUuICBUaGUgb3B0aW9uYWwgZmlmdGggYXJndW1lbnQgaXMKLSAgIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbi4gIEluIENPRkYgdGhpcyBzeW1ib2wKLSAgIGdldHMgYW4gYXV4IGVudHJ5IGxpa2UgdGhhdCB1c2VkIGZvciBhIGNzZWN0LiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19mdW5jdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIGNoYXIgKnM7Ci0gIHN5bWJvbFMgKmV4dF9zeW07Ci0gIHN5bWJvbFMgKmxhYl9zeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIElnbm9yZSBhbnkgW1BSXSBzdWZmaXguICAqLwotICBuYW1lID0gcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAobmFtZSk7Ci0gIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7Ci0gIGlmIChzICE9IChjaGFyICopIE5VTEwKLSAgICAgICYmIHN0cmNtcCAocyArIDEsICJQUl0iKSA9PSAwKQotICAgICpzID0gJ1wwJzsKLQotICBleHRfc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBzeW1ib2wgbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbGFiX3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIGlmIChleHRfc3ltICE9IGxhYl9zeW0pCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgICBleHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgZXhwLlhfYWRkX3N5bWJvbCA9IGxhYl9zeW07Ci0gICAgICBleHAuWF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBleHAuWF91bnNpZ25lZCA9IDA7Ci0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4dF9zeW0sICZleHApOwotICAgIH0KLQotICBpZiAoc3ltYm9sX2dldF90YyAoZXh0X3N5bSktPmNsYXNzID09IC0xKQotICAgIHN5bWJvbF9nZXRfdGMgKGV4dF9zeW0pLT5jbGFzcyA9IFhNQ19QUjsKLSAgc3ltYm9sX2dldF90YyAoZXh0X3N5bSktPm91dHB1dCA9IDE7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGlnbm9yZTsKLQotICAgICAgLyogSWdub3JlIHRoZSB0aGlyZCBhcmd1bWVudC4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb24gKCZpZ25vcmUpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIC8qIElnbm9yZSB0aGUgZm91cnRoIGFyZ3VtZW50LiAgKi8KLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgZXhwcmVzc2lvbiAoJmlnbm9yZSk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIGZ1bmN0aW9uIHNpemUuICAqLwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIHN5bWJvbF9nZXRfdGMgKGV4dF9zeW0pLT5zaXplID0gc3ltYm9sX25ldyAoIkwwXDAwMSIsCi0JCQkJCQkJICBhYnNvbHV0ZV9zZWN0aW9uLAotCQkJCQkJCSAgKHZhbHVlVCkgMCwKLQkJCQkJCQkgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JICAgICAgcHNldWRvX3NldCAoc3ltYm9sX2dldF90YyAoZXh0X3N5bSktPnNpemUpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBTX1NFVF9EQVRBX1RZUEUgKGV4dF9zeW0sIERUX0ZDTiA8PCBOX0JUU0hGVCk7Ci0gIFNGX1NFVF9GVU5DVElPTiAoZXh0X3N5bSk7Ci0gIFNGX1NFVF9QUk9DRVNTIChleHRfc3ltKTsKLSAgY29mZl9hZGRfbGluZXN5bSAoZXh0X3N5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5iZiBwc2V1ZG8tb3AuICBUaGlzIGlzIGp1c3QgbGlrZSBhIENPRkYgQ19GQ04gc3ltYm9sIG5hbWVkCi0gICAiLmJmIi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYmYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmJmIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0ZDTik7Ci0KLSAgY29mZl9saW5lX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgY29mZl9saW5lX2Jhc2UpOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5lZiBwc2V1ZG8tb3AuICBUaGlzIGlzIGp1c3QgbGlrZSBhIENPRkYgQ19GQ04gc3ltYm9sIG5hbWVkCi0gICAiLmVmIiwgZXhjZXB0IHRoYXQgdGhlIGxpbmUgbnVtYmVyIGlzIGFic29sdXRlLCBub3QgcmVsYXRpdmUgdG8gdGhlCi0gICBtb3N0IHJlY2VudCAiLmJmIiBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2VmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lZiIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19GQ04pOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuYmkgYW5kIC5laSBwc2V1ZG8tb3BzLiAgVGhlc2UgdGFrZSBhIHN0cmluZyBhcmd1bWVudCBhbmQKLSAgIGdlbmVyYXRlcyBhIENfQklOQ0wgb3IgQ19FSU5DTCBzeW1ib2wsIHdoaWNoIGdvZXMgYXQgdGhlIHN0YXJ0IG9mCi0gICB0aGUgc3ltYm9sIGxpc3QuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JpZWkgKGVpKQotICAgICBpbnQgZWk7Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpsYXN0X2JpZWk7Ci0KLSAgY2hhciAqbmFtZTsKLSAgaW50IGxlbjsKLSAgc3ltYm9sUyAqc3ltOwotICBzeW1ib2xTICpsb29rOwotCi0gIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZXNlIHN5bWJvbHMgaXMgYWN0dWFsbHkgZmlsZSBvZmZzZXQuICBIZXJlIHdlIHNldAotICAgICB0aGUgdmFsdWUgdG8gdGhlIGluZGV4IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMuICBJbgotICAgICBwcGNfZnJvYl9zeW1ib2xzIHdlIHNldCB0aGUgZml4X2xpbmUgZmllbGQsIHdoaWNoIHdpbGwgY2F1c2UgQkZECi0gICAgIHRvIGRvIHRoZSByaWdodCB0aGluZy4gICovCi0KLSAgc3ltID0gc3ltYm9sX21ha2UgKG5hbWUpOwotICAvKiBvYmotY29mZi5jIGN1cnJlbnRseSBvbmx5IGhhbmRsZXMgbGluZSBudW1iZXJzIGNvcnJlY3RseSBpbiB0aGUKLSAgICAgLnRleHQgc2VjdGlvbi4gICovCi0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgY29mZl9uX2xpbmVfbm9zKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBlaSA/IENfRUlOQ0wgOiBDX0JJTkNMKTsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLSAgCi0gIGZvciAobG9vayA9IGxhc3RfYmllaSA/IGxhc3RfYmllaSA6IHN5bWJvbF9yb290UDsKLSAgICAgICAobG9vayAhPSAoc3ltYm9sUyAqKSBOVUxMCi0JJiYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGxvb2spID09IENfRklMRQotCSAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChsb29rKSA9PSBDX0JJTkNMCi0JICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGxvb2spID09IENfRUlOQ0wpKTsKLSAgICAgICBsb29rID0gc3ltYm9sX25leHQgKGxvb2spKQotICAgIDsKLSAgaWYgKGxvb2sgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2luc2VydCAoc3ltLCBsb29rLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIGxhc3RfYmllaSA9IHN5bTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5icyBwc2V1ZG8tb3AuICBUaGlzIGdlbmVyYXRlcyBhIENfQlNUQVQgc3ltYm9sIG5hbWVkICIuYnMiLgotICAgVGhlcmUgaXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyBhIGNzZWN0IHN5bWJvbC4gIFRoZSB2YWx1ZSBvZiB0aGUKLSAgIC5icyBzeW1ib2wgaXMgdGhlIGluZGV4IG9mIHRoaXMgY3NlY3Qgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19icyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIHN5bWJvbFMgKmNzZWN0OwotICBzeW1ib2xTICpzeW07Ci0KLSAgaWYgKHBwY19jdXJyZW50X2Jsb2NrICE9IE5VTEwpCi0gICAgYXNfYmFkIChfKCJuZXN0ZWQgLmJzIGJsb2NrcyIpKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgY3NlY3QgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5icyIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfQlNUQVQpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW4gPSBjc2VjdDsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBwcGNfY3VycmVudF9ibG9jayA9IHN5bTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmVzIHBzZXVkby1vcC4gIEdlbmVyYXRlIGEgQ19FU1RBUlQgc3ltYm9sIG5hbWVkIC5lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZXMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIGlmIChwcGNfY3VycmVudF9ibG9jayA9PSBOVUxMKQotICAgIGFzX2JhZCAoXygiLmVzIHdpdGhvdXQgcHJlY2VkaW5nIC5icyIpKTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lcyIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfRVNUQVQpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBwcGNfY3VycmVudF9ibG9jayA9IE5VTEw7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5iYiBwc2V1ZG8tb3AuICBHZW5lcmF0ZSBhIENfQkxPQ0sgc3ltYm9sIG5hbWVkIC5iYiwgd2l0aCBhCi0gICBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYmIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmJiIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0JMT0NLKTsKLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgU0ZfU0VUX1BST0NFU1MgKHN5bSk7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5lYiBwc2V1ZG8tb3AuICBHZW5lcmF0ZSBhIENfQkxPQ0sgc3ltYm9sIG5hbWVkIC5lYiwgd2l0aCBhCi0gICBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmViIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0JMT0NLKTsKLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltLCAxKTsKLSAgU0FfU0VUX1NZTV9MTk5PIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBTRl9TRVRfUFJPQ0VTUyAoc3ltKTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmJjIHBzZXVkby1vcC4gIFRoaXMganVzdCBjcmVhdGVzIGEgQ19CQ09NTSBzeW1ib2wgd2l0aCBhCi0gICBzcGVjaWZpZWQgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYmMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGxlbjsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0gIHN5bSA9IHN5bWJvbF9tYWtlIChuYW1lKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19CQ09NTSk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIDApOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZWMgcHNldWRvLW9wLiAgVGhpcyBqdXN0IGNyZWF0ZXMgYSBDX0VDT01NIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmVjIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgcHBjX2NvZmZfZGVidWdfc2VjdGlvbik7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfRUNPTU0pOwotICBTX1NFVF9WQUxVRSAoc3ltLCAwKTsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLnRvYyBwc2V1ZG8tb3AuICBTd2l0Y2ggdG8gdGhlIC50b2Mgc3Vic2VnbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfdG9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChwcGNfdG9jX2NzZWN0ICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCBzeW1ib2xfZ2V0X3RjIChwcGNfdG9jX2NzZWN0KS0+c3Vic2VnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN1YnNlZ1Qgc3Vic2VnOwotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgc3ltYm9sUyAqbGlzdDsKLSAgICAKLSAgICAgIHN1YnNlZyA9IHBwY19kYXRhX3N1YnNlZ21lbnQ7Ci0gICAgICArK3BwY19kYXRhX3N1YnNlZ21lbnQ7Ci0KLSAgICAgIHN1YnNlZ19uZXcgKHNlZ21lbnRfbmFtZSAoZGF0YV9zZWN0aW9uKSwgc3Vic2VnKTsKLSAgICAgIHBwY190b2NfZnJhZyA9IGZyYWdfbm93OwotCi0gICAgICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlICgiVE9DW1RDMF0iKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGRhdGFfc2VjdGlvbik7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnID0gc3Vic2VnOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbiA9IHN5bTsKLQotICAgICAgcHBjX3RvY19jc2VjdCA9IHN5bTsKLQkgIAotICAgICAgZm9yIChsaXN0ID0gcHBjX2RhdGFfY3NlY3RzOwotCSAgIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0ICE9IChzeW1ib2xTICopIE5VTEw7Ci0JICAgbGlzdCA9IHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0KQotCTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0ID0gc3ltOwotCi0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoc3ltLCBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+d2l0aGluLCAmc3ltYm9sX3Jvb3RQLAotCQkgICAgICZzeW1ib2xfbGFzdFApOwotICAgIH0KLQotICBwcGNfY3VycmVudF9jc2VjdCA9IHBwY190b2NfY3NlY3Q7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIEFJWCBhc3NlbWJsZXIgYXV0b21hdGljYWxseSBhbGlnbnMgdGhlIG9wZXJhbmRzIG9mIGEgLmxvbmcgb3IKLSAgIC5zaG9ydCBwc2V1ZG8tb3AsIGFuZCB3ZSB3YW50IHRvIGJlIGNvbXBhdGlibGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3hjb2ZmX2NvbnMgKGxvZ19zaXplKQotICAgICBpbnQgbG9nX3NpemU7Ci17Ci0gIGZyYWdfYWxpZ24gKGxvZ19zaXplLCAwLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbG9nX3NpemUpOwotICBjb25zICgxIDw8IGxvZ19zaXplKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwY192Ynl0ZSAoZHVtbXkpCi0gICAgIGludCBkdW1teTsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgYnl0ZV9jb3VudDsKLQotICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJub24tY29uc3RhbnQgYnl0ZSBjb3VudCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnl0ZV9jb3VudCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNvbnMgKGJ5dGVfY291bnQpOwotfQotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0MCi0vKiBUaGUgLnRjIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgZWl0aGVyIFhDT0ZGIG9yCi0gICBFTEYuICBUaGlzIHRha2VzIHR3byBvciBtb3JlIGFyZ3VtZW50cy4KLQotICAgV2hlbiBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBuYW1lIHRvCi0gICBnaXZlIHRvIHRoaXMgbG9jYXRpb24gaW4gdGhlIHRvYzsgdGhpcyB3aWxsIGJlIGEgc3ltYm9sIHdpdGggY2xhc3MKLSAgIFRDLiAgVGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhcmUgNCBieXRlIHZhbHVlcyB0byBhY3R1YWxseSBwdXQgYXQKLSAgIHRoaXMgbG9jYXRpb24gaW4gdGhlIFRPQzsgb2Z0ZW4gdGhlcmUgaXMganVzdCBvbmUgbW9yZSBhcmd1bWVudCwgYQotICAgcmVsb2NhdGVhYmxlIHN5bWJvbCByZWZlcmVuY2UuCi0KLSAgIFdoZW4gbm90IGdlbmVyYXRpbmcgWENPRkYgb3V0cHV0LCB0aGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSwgYnV0Ci0gICB0aGUgZmlyc3QgYXJndW1lbnQgaXMgc2ltcGx5IGlnbm9yZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3RjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0jaWZkZWYgT0JKX1hDT0ZGCi0KLSAgLyogRGVmaW5lIHRoZSBUT0Mgc3ltYm9sIG5hbWUuICAqLwotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBjaGFyIGVuZGM7Ci0gICAgc3ltYm9sUyAqc3ltOwotCi0gICAgaWYgKHBwY190b2NfY3NlY3QgPT0gKHN5bWJvbFMgKikgTlVMTAotCXx8IHBwY190b2NfY3NlY3QgIT0gcHBjX2N1cnJlbnRfY3NlY3QpCi0gICAgICB7Ci0JYXNfYmFkIChfKCIudGMgbm90IGluIC50b2Mgc2VjdGlvbiIpKTsKLQlpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICAgIGlmIChTX0lTX0RFRklORUQgKHN5bSkpCi0gICAgICB7Ci0Jc3ltYm9sUyAqbGFiZWw7Ci0KLQlsYWJlbCA9IHN5bWJvbF9nZXRfdGMgKHBwY19jdXJyZW50X2NzZWN0KS0+d2l0aGluOwotCWlmIChzeW1ib2xfZ2V0X3RjIChsYWJlbCktPmNsYXNzICE9IFhNQ19UQzApCi0JICB7Ci0JICAgIGFzX2JhZCAoXygiLnRjIHdpdGggbm8gbGFiZWwiKSk7Ci0JICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgIHJldHVybjsKLQkgIH0KLQotCVNfU0VUX1NFR01FTlQgKGxhYmVsLCBTX0dFVF9TRUdNRU5UIChzeW0pKTsKLQlzeW1ib2xfc2V0X2ZyYWcgKGxhYmVsLCBzeW1ib2xfZ2V0X2ZyYWcgKHN5bSkpOwotCVNfU0VUX1ZBTFVFIChsYWJlbCwgU19HRVRfVkFMVUUgKHN5bSkpOwotCi0Jd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpOwotICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcyA9IFhNQ19UQzsKLSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gICAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0gIH0KLQotI2Vsc2UgLyogISBkZWZpbmVkIChPQkpfWENPRkYpICovCi0KLSAgLyogU2tpcCB0aGUgVE9DIHN5bWJvbCBuYW1lLiAgKi8KLSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnWycKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXScKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAneycKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnfScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogQWxpZ24gdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE9CSl9YQ09GRikgKi8KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY29ucyAoNCk7Ci0gICAgfQotfQotDAotI2lmZGVmIFRFX1BFCi0KLS8qIFBzZXVkby1vcHMgc3BlY2lmaWMgdG8gdGhlIFdpbmRvd3MgTlQgUG93ZXJQQyBQRSAoY29mZikgZm9ybWF0ICovCi0KLS8qIFNldCB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wcGNfc2V0X2N1cnJlbnRfc2VjdGlvbiAobmV3KQotICAgICBzZWdUIG5ldzsKLXsKLSAgcHBjX3ByZXZpb3VzX3NlY3Rpb24gPSBwcGNfY3VycmVudF9zZWN0aW9uOwotICBwcGNfY3VycmVudF9zZWN0aW9uID0gbmV3OwotfQotCi0vKiBwc2V1ZG8tb3A6IC5wcmV2aW91cwotICAgYmVoYXZpb3VyOiB0b2dnbGVzIHRoZSBjdXJyZW50IHNlY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgc2VjdGlvbi4KLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICAiTm8gcHJldmlvdXMgc2VjdGlvbiIKLSovCi1zdGF0aWMgdm9pZAotcHBjX3ByZXZpb3VzKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqdG1wOwotCi0gIGlmIChwcGNfcHJldmlvdXNfc2VjdGlvbiA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBhc193YXJuKF8oIk5vIHByZXZpb3VzIHNlY3Rpb24gdG8gcmV0dXJuIHRvLiBEaXJlY3RpdmUgaWdub3JlZC4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN1YnNlZ19zZXQocHBjX3ByZXZpb3VzX3NlY3Rpb24sIDApOwotCi0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHBwY19wcmV2aW91c19zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAucGRhdGEKLSAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIG9ubHkgZGF0YSBzZWN0aW9uCi0gICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQKLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0gICBpbml0aWFsOiAgIC5zZWN0aW9uIC5wZGF0YSAiYWRyMyIKLSAgICAgICAgICAgICAgYSAtIGRvbid0IGtub3cgLS0gbWF5YmUgYSBtaXNwcmludAotCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCi0JICAgICAgciAtIHJlYWRhYmxlCi0JICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgNCBieXRlIGJvdW5kYXJ5KQotCi0gICBjb21tZW50YXJ5OgotICAgVGFnIGluZGV4IHRhYmxlcyAoYWxzbyBrbm93biBhcyB0aGUgZnVuY3Rpb24gdGFibGUpIGZvciBleGNlcHRpb24KLSAgIGhhbmRsaW5nLCBkZWJ1Z2dpbmcsIGV0Yy4KLQotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcGRhdGEoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAocGRhdGFfc2VjdGlvbiA9PSAwKSAKLSAgICB7Ci0gICAgICBwZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5wZGF0YSIsIDApOwotICAgICAgCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcGRhdGFfc2VjdGlvbiwKLQkJCSAgICAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOwotICAgICAgCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHBkYXRhX3NlY3Rpb24sIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3KCIucGRhdGEiLCAwKTsKLSAgICB9Ci0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHBkYXRhX3NlY3Rpb24pOwotfQotCi0vKiBwc2V1ZG8tb3A6IC55ZGF0YQotICAgYmVoYXZpb3VyOiBwcmVkZWZpbmVkIHJlYWQgb25seSBkYXRhIHNlY3Rpb24KLSAgICAgICAgICAgICAgZG91YmxlIHdvcmQgYWxpZ25lZAotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE5vbmUKLSAgIGluaXRpYWw6ICAgLnNlY3Rpb24gLnlkYXRhICJkcnczIgotICAgICAgICAgICAgICBhIC0gZG9uJ3Qga25vdyAtLSBtYXliZSBhIG1pc3ByaW50Ci0JICAgICAgZCAtIGluaXRpYWxpemVkIGRhdGEKLQkgICAgICByIC0gcmVhZGFibGUKLQkgICAgICAzIC0gZG91YmxlIHdvcmQgYWxpZ25lZCAodGhhdCB3b3VsZCBiZSA0IGJ5dGUgYm91bmRhcnkpCi0gICBjb21tZW50YXJ5OgotICAgVGFnIHRhYmxlcyAoYWxzbyBrbm93biBhcyB0aGUgc2NvcGUgdGFibGUpIGZvciBleGNlcHRpb24gaGFuZGxpbmcsCi0gICBkZWJ1Z2dpbmcsIGV0Yy4KLSovCi1zdGF0aWMgdm9pZAotcHBjX3lkYXRhKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHlkYXRhX3NlY3Rpb24gPT0gMCkgCi0gICAgewotICAgICAgeWRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIueWRhdGEiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB5ZGF0YV9zZWN0aW9uLAotCQkJIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHlkYXRhX3NlY3Rpb24sIDMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHlkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnlkYXRhIiwgMCk7Ci0gICAgfQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbih5ZGF0YV9zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAucmVsZGF0YQotICAgYmVoYXZpb3VyOiBwcmVkZWZpbmVkIHJlYWQgd3JpdGUgZGF0YSBzZWN0aW9uCi0gICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQgKDQtYnl0ZSkKLQkgICAgICBGSVhNRTogcmVsb2NhdGlvbiBpcyBhcHBsaWVkIHRvIGl0Ci0JICAgICAgRklYTUU6IHdoYXQncyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIC5kYXRhPwotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE5vbmUKLSAgIGluaXRpYWw6ICAgLnNlY3Rpb24gLnJlbGRhdGEgImRydzMiCi0JICAgICAgZCAtIGluaXRpYWxpemVkIGRhdGEKLQkgICAgICByIC0gcmVhZGFibGUKLQkgICAgICB3IC0gd3JpdGVhYmxlCi0JICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgOCBieXRlIGJvdW5kYXJ5KQotCi0gICBjb21tZW50YXJ5OgotICAgTGlrZSAuZGF0YSwgYnV0IGludGVuZGVkIHRvIGhvbGQgZGF0YSBzdWJqZWN0IHRvIHJlbG9jYXRpb24sIHN1Y2ggYXMKLSAgIGZ1bmN0aW9uIGRlc2NyaXB0b3JzLCBldGMuCi0qLwotc3RhdGljIHZvaWQKLXBwY19yZWxkYXRhKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHJlbGRhdGFfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIHJlbGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucmVsZGF0YSIsIDApOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcmVsZGF0YV9zZWN0aW9uLAotCQkJICAgICAoIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIAotCQkJICAgICAgfCBTRUNfREFUQSApKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCByZWxkYXRhX3NlY3Rpb24sIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucmVsZGF0YSIsIDApOwotICAgIH0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24ocmVsZGF0YV9zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAucmRhdGEKLSAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIG9ubHkgZGF0YSBzZWN0aW9uCi0gICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQKLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0gICBpbml0aWFsOiAgIC5zZWN0aW9uIC5yZGF0YSAiZHIzIgotCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCi0JICAgICAgciAtIHJlYWRhYmxlCi0JICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgNCBieXRlIGJvdW5kYXJ5KQotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcmRhdGEoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAocmRhdGFfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIHJkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJkYXRhIiwgMCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcmRhdGFfc2VjdGlvbiwKLQkJCSAgICAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHJkYXRhX3NlY3Rpb24sIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJkYXRhIiwgMCk7Ci0gICAgfQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihyZGF0YV9zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAudWFsb25nCi0gICBiZWhhdmlvdXI6IG11Y2ggbGlrZSAuaW50LCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBubyBhbGlnbm1lbnQgaXMgCi0gICAgICAgICAgICAgIHBlcmZvcm1lZC4KLQkgICAgICBGSVhNRTogdGVzdCB0aGUgYWxpZ25tZW50IHN0YXRlbWVudAotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE5vbmUKLSovCi1zdGF0aWMgdm9pZAotcHBjX3VhbG9uZyhpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIHRyeSBmb3IgbG9uZyAqLwotICBjb25zICggNCApOwotfQotCi0vKiBwc2V1ZG8tb3A6IC56bm9wICA8c3ltYm9sIG5hbWU+Ci0gICBiZWhhdmlvdXI6IElzc3VlIGEgbm9wIGluc3RydWN0aW9uCi0gICAgICAgICAgICAgIElzc3VlIGEgSU1BR0VfUkVMX1BQQ19JRkdMVUUgcmVsb2NhdGlvbiBhZ2FpbnN0IGl0LCB1c2luZwotCSAgICAgIHRoZSBzdXBwbGllZCBzeW1ib2wgbmFtZS4KLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBNaXNzaW5nIHN5bWJvbCBuYW1lCi0qLwotc3RhdGljIHZvaWQKLXBwY196bm9wKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGNoYXIgKmY7Ci0KLSAgc3ltYm9sUyAqc3ltOwotCi0gIC8qIFN0cmlwIG91dCB0aGUgc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqc3ltYm9sX25hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGV4cDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBuYW1lID0geG1hbGxvYyAoaW5wdXRfbGluZV9wb2ludGVyIC0gc3ltYm9sX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzeW1ib2xfbmFtZSk7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIC8qIExvb2sgdXAgdGhlIG9wY29kZSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKikgaGFzaF9maW5kIChwcGNfaGFzaCwgIm5vcCIpOwotCi0gIC8qIHN0aWNrIGluIHRoZSBub3AgKi8KLSAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLSAgZml4X25ldyAoZnJhZ19ub3csCi0JICAgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCSAgIDQsCi0JICAgc3ltLAotCSAgIDAsCi0JICAgMCwKLQkgICBCRkRfUkVMT0NfMTZfR09UX1BDUkVMKTsKLQotfQotCi0vKiBwc2V1ZG8tb3A6IAotICAgYmVoYXZpb3VyOiAKLSAgIGVycm9yczogICAgCi0gICB3YXJuaW5nczogIAotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcGVfY29tbShsY29tbSkKLSAgICAgaW50IGxjb21tOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgdGVtcDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgb2Zmc2V0VCBhbGlnbjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5DT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iKSwgKGxvbmcpIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCEgbGNvbW0pCi0gICAgewotICAgICAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5jb21tIGlzIHRoZSBhbGlnbm1lbnQuICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCWFsaWduID0gMzsKLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAoYWxpZ24gPD0gMCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIGJhZCBhbGlnbm1lbnQiKSk7Ci0JICAgICAgYWxpZ24gPSAzOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHRlbXApCi0JYXNfYmFkIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHRlbXApOwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6Ci0gKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9Ci0gKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCi0gKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQotICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0Ci0gKiBCdXQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHF1b3RlZCBzdHJpbmcsIHRyZWF0IGl0IGFzIGEKLSAqIHN1YnNlZ21lbnQgbnVtYmVyLgotICoKLSAqIEZJWE1FOiB0aGlzIGlzIGEgY29weSBvZiB0aGUgc2VjdGlvbiBwcm9jZXNzaW5nIGZyb20gb2JqLWNvZmYuYywgd2l0aAotICogYWRkaXRpb25zL2NoYW5nZXMgZm9yIHRoZSBtb3RvLXBhcyBhc3NlbWJsZXIgc3VwcG9ydC4gVGhlcmUgYXJlIHRocmVlCi0gKiBjYXRlZ29yaWVzOgotICoKLSAqIEZJWE1FOiBJIGp1c3Qgbm90aWNlZCB0aGlzLiBUaGlzIGRvZXNuJ3Qgd29yayBhdCBhbGwgcmVhbGx5LiBJdCBpdCAKLSAqICAgICAgICBzZXR0aW5nIGJpdHMgdGhhdCBiZmQgcHJvYmFibHkgbmVpdGhlciB1bmRlcnN0YW5kcyBvciB1c2VzLiBUaGUKLSAqICAgICAgICBjb3JyZWN0IGFwcHJvYWNoICg/KSB3aWxsIGhhdmUgdG8gaW5jb3Jwb3JhdGUgZXh0cmEgZmllbGRzIGF0dGFjaGVkCi0gKiAgICAgICAgdG8gdGhlIHNlY3Rpb24gdG8gaG9sZCB0aGUgc3lzdGVtIHNwZWNpZmljIHN0dWZmLiAoa3JrKQotICoKLSAqIFNlY3Rpb24gQ29udGVudHM6Ci0gKiAnYScgLSB1bmtub3duIC0gcmVmZXJyZWQgdG8gaW4gZG9jdW1lbnRhdGlvbiwgYnV0IG5vIGRlZmluaXRpb24gc3VwcGxpZWQKLSAqICdjJyAtIHNlY3Rpb24gaGFzIGNvZGUKLSAqICdkJyAtIHNlY3Rpb24gaGFzIGluaXRpYWxpemVkIGRhdGEKLSAqICd1JyAtIHNlY3Rpb24gaGFzIHVuaW5pdGlhbGl6ZWQgZGF0YQotICogJ2knIC0gc2VjdGlvbiBjb250YWlucyBkaXJlY3RpdmVzIChpbmZvKQotICogJ24nIC0gc2VjdGlvbiBjYW4gYmUgZGlzY2FyZGVkCi0gKiAnUicgLSByZW1vdmUgc2VjdGlvbiBhdCBsaW5rIHRpbWUKLSAqCi0gKiBTZWN0aW9uIFByb3RlY3Rpb246Ci0gKiAncicgLSBzZWN0aW9uIGlzIHJlYWRhYmxlCi0gKiAndycgLSBzZWN0aW9uIGlzIHdyaXRlYWJsZQotICogJ3gnIC0gc2VjdGlvbiBpcyBleGVjdXRhYmxlCi0gKiAncycgLSBzZWN0aW9uIGlzIHNoYXJhYmxlCi0gKgotICogU2VjdGlvbiBBbGlnbm1lbnQ6Ci0gKiAnMCcgLSBhbGlnbiB0byBieXRlIGJvdW5kYXJ5Ci0gKiAnMScgLSBhbGlnbiB0byBoYWxmd29yZCB1bmRhcnkKLSAqICcyJyAtIGFsaWduIHRvIHdvcmQgYm91bmRhcnkKLSAqICczJyAtIGFsaWduIHRvIGRvdWJsZXdvcmQgYm91bmRhcnkKLSAqICc0JyAtIGFsaWduIHRvIHF1YWR3b3JkIGJvdW5kYXJ5Ci0gKiAnNScgLSBhbGlnbiB0byAzMiBieXRlIGJvdW5kYXJ5Ci0gKiAnNicgLSBhbGlnbiB0byA2NCBieXRlIGJvdW5kYXJ5Ci0gKgotICovCi0KLXZvaWQKLXBwY19wZV9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCi0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBmbGFnd29yZCBmbGFnczsKLSAgc2VnVCBzZWM7Ci0gIGludCBhbGlnbjsKLQotICBzZWN0aW9uX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBuYW1lID0geG1hbGxvYyAoaW5wdXRfbGluZV9wb2ludGVyIC0gc2VjdGlvbl9uYW1lICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc2VjdGlvbl9uYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgZXhwID0gMDsKLSAgZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQyIikgPT0gMCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkMyIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDQiKSA9PSAwKQotICAgIHsKLSAgICAgIGFsaWduID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQ1IikgPT0gMCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkNiIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAxOwotICAgIH0KLSAgZWxzZQotICAgIGFsaWduID0gNDsgLyogZGVmYXVsdCBhbGlnbm1lbnQgdG8gMTYgYnl0ZSBib3VuZGFyeSAqLwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQlleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJwotCQkgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JCXsKLQkJICAvKiBTZWN0aW9uIENvbnRlbnRzICovCi0JCWNhc2UgJ2EnOiAvKiB1bmtub3duICovCi0JCSAgYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBzZWN0aW9uIGF0dHJpYnV0ZSAtLSAnYSciKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2MnOiAvKiBjb2RlIHNlY3Rpb24gKi8KLQkJICBmbGFncyB8PSBTRUNfQ09ERTsgCi0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2QnOiAvKiBzZWN0aW9uIGhhcyBpbml0aWFsaXplZCBkYXRhICovCi0JCSAgZmxhZ3MgfD0gU0VDX0RBVEE7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3UnOiAvKiBzZWN0aW9uIGhhcyB1bmluaXRpYWxpemVkIGRhdGEgKi8KLQkJICAvKiBGSVhNRTogVGhpcyBpcyBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQQotCQkgICAgIGluIHdpbm50LmggKi8KLQkJICBmbGFncyB8PSBTRUNfUk9NOwotCQkgIGJyZWFrOwotCQljYXNlICdpJzogLyogc2VjdGlvbiBjb250YWlucyBkaXJlY3RpdmVzIChpbmZvKSAqLwotCQkgIC8qIEZJWE1FOiBUaGlzIGlzIElNQUdFX1NDTl9MTktfSU5GTwotCQkgICAgIGluIHdpbm50LmggKi8KLQkJICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCQkgIGJyZWFrOwotCQljYXNlICduJzogLyogc2VjdGlvbiBjYW4gYmUgZGlzY2FyZGVkICovCi0JCSAgZmxhZ3MgJj1+IFNFQ19MT0FEOyAKLQkJICBicmVhazsKLQkJY2FzZSAnUic6IC8qIFJlbW92ZSBzZWN0aW9uIGF0IGxpbmsgdGltZSAqLwotCQkgIGZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotCQkgIGJyZWFrOwotCi0JCSAgLyogU2VjdGlvbiBQcm90ZWN0aW9uICovCi0JCWNhc2UgJ3InOiAvKiBzZWN0aW9uIGlzIHJlYWRhYmxlICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9SRUFEOwotCQkgIGJyZWFrOwotCQljYXNlICd3JzogLyogc2VjdGlvbiBpcyB3cml0ZWFibGUgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1dSSVRFOwotCQkgIGJyZWFrOwotCQljYXNlICd4JzogLyogc2VjdGlvbiBpcyBleGVjdXRhYmxlICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9FWEVDVVRFOwotCQkgIGJyZWFrOwotCQljYXNlICdzJzogLyogc2VjdGlvbiBpcyBzaGFyYWJsZSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fU0hBUkVEOwotCQkgIGJyZWFrOwotCi0JCSAgLyogU2VjdGlvbiBBbGlnbm1lbnQgKi8KLQkJY2FzZSAnMCc6IC8qIGFsaWduIHRvIGJ5dGUgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMUJZVEVTOwotCQkgIGFsaWduID0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAnMSc6ICAvKiBhbGlnbiB0byBoYWxmd29yZCBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl8yQllURVM7Ci0JCSAgYWxpZ24gPSAxOwotCQkgIGJyZWFrOwotCQljYXNlICcyJzogIC8qIGFsaWduIHRvIHdvcmQgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fNEJZVEVTOwotCQkgIGFsaWduID0gMjsKLQkJICBicmVhazsKLQkJY2FzZSAnMyc6ICAvKiBhbGlnbiB0byBkb3VibGV3b3JkIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzhCWVRFUzsKLQkJICBhbGlnbiA9IDM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzQnOiAgLyogYWxpZ24gdG8gcXVhZHdvcmQgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMTZCWVRFUzsKLQkJICBhbGlnbiA9IDQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzUnOiAgLyogYWxpZ24gdG8gMzIgYnl0ZSBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl8zMkJZVEVTOwotCQkgIGFsaWduID0gNTsKLQkJICBicmVhazsKLQkJY2FzZSAnNic6ICAvKiBhbGlnbiB0byA2NCBieXRlIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzY0QllURVM7Ci0JCSAgYWxpZ24gPSA2OwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkKF8oInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIpLAotCQkJICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKLQkgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICBzZWMgPSBzdWJzZWdfbmV3IChuYW1lLCAoc3Vic2VnVCkgZXhwKTsKLQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihzZWMpOwotCi0gIGlmIChmbGFncyAhPSBTRUNfTk9fRkxBR1MpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywgZmxhZ3MpKQotCWFzX2JhZCAoXygiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIlc1wiOiAlcyIpLAotCQliZmRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIHNlYyksCi0JCWJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICB9Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChzdGRvdXRwdXQsIHNlYywgYWxpZ24pOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1wcGNfcGVfZnVuY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBzeW1ib2xTICpleHRfc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBleHRfc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgU19TRVRfREFUQV9UWVBFIChleHRfc3ltLCBEVF9GQ04gPDwgTl9CVFNIRlQpOwotICBTRl9TRVRfRlVOQ1RJT04gKGV4dF9zeW0pOwotICBTRl9TRVRfUFJPQ0VTUyAoZXh0X3N5bSk7Ci0gIGNvZmZfYWRkX2xpbmVzeW0gKGV4dF9zeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcGNfcGVfdG9jZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAodG9jZGF0YV9zZWN0aW9uID09IDApCi0gICAgewotICAgICAgdG9jZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi50b2NkIiwgMCk7Ci0gICAgICAvKiBGSVhNRTogc2VjdGlvbiBmbGFncyB3b24ndCB3b3JrICovCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdG9jZGF0YV9zZWN0aW9uLAotCQkJICAgICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCSAgICAgIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RBVEEgKSk7Ci0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgdG9jZGF0YV9zZWN0aW9uLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi50b2NkIiwgMCk7Ci0gICAgfQotCi0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHRvY2RhdGFfc2VjdGlvbik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogRG9uJ3QgYWRqdXN0IFRPQyByZWxvY3MgdG8gdXNlIHRoZSBzZWN0aW9uIHN5bWJvbC4gICovCi0KLWludAotcHBjX3BlX2ZpeF9hZGp1c3RhYmxlIChmaXgpCi0gICAgIGZpeFMgKmZpeDsKLXsKLSAgcmV0dXJuIGZpeC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19QUENfVE9DMTY7Ci19Ci0KLSNlbmRpZgotDAotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBYQ09GRiBzcGVjaWZpYyBzeW1ib2wgYW5kIGZpbGUgaGFuZGxpbmcuICAqLwotCi0vKiBDYW5vbmljYWxpemUgdGhlIHN5bWJvbCBuYW1lLiAgV2UgdXNlIHRoZSB0byBmb3JjZSB0aGUgc3VmZml4LCBpZgotICAgYW55LCB0byB1c2Ugc3F1YXJlIGJyYWNrZXRzLCBhbmQgdG8gYmUgaW4gdXBwZXIgY2FzZS4gICovCi0KLWNoYXIgKgotcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqczsKLQotICBpZiAocHBjX3N0YWJfc3ltYm9sKQotICAgIHJldHVybiBuYW1lOwotCi0gIGZvciAocyA9IG5hbWU7ICpzICE9ICdcMCcgJiYgKnMgIT0gJ3snICYmICpzICE9ICdbJzsgcysrKQotICAgIDsKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgewotICAgICAgY2hhciBicmFjOwotCi0gICAgICBpZiAoKnMgPT0gJ1snKQotCWJyYWMgPSAnXSc7Ci0gICAgICBlbHNlCi0JewotCSAgKnMgPSAnWyc7Ci0JICBicmFjID0gJ30nOwotCX0KLQotICAgICAgZm9yIChzKys7ICpzICE9ICdcMCcgJiYgKnMgIT0gYnJhYzsgcysrKQotCWlmIChpc2xvd2VyICgqcykpCi0JICAqcyA9IHRvdXBwZXIgKCpzKTsKLQotICAgICAgaWYgKCpzID09ICdcMCcgfHwgc1sxXSAhPSAnXDAnKQotCWFzX2JhZCAoXygiYmFkIHN5bWJvbCBzdWZmaXgiKSk7Ci0KLSAgICAgICpzID0gJ10nOwotICAgIH0KLQotICByZXR1cm4gbmFtZTsKLX0KLQotLyogU2V0IHRoZSBjbGFzcyBvZiBhIHN5bWJvbCBiYXNlZCBvbiB0aGUgc3VmZml4LCBpZiBhbnkuICBUaGlzIGlzCi0gICBjYWxsZWQgd2hlbmV2ZXIgYSBuZXcgc3ltYm9sIGlzIGNyZWF0ZWQuICAqLwotCi12b2lkCi1wcGNfc3ltYm9sX25ld19ob29rIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3RydWN0IHBwY190Y19zeSAqdGM7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgdGMgPSBzeW1ib2xfZ2V0X3RjIChzeW0pOwotICB0Yy0+bmV4dCA9IE5VTEw7Ci0gIHRjLT5vdXRwdXQgPSAwOwotICB0Yy0+Y2xhc3MgPSAtMTsKLSAgdGMtPnJlYWxfbmFtZSA9IE5VTEw7Ci0gIHRjLT5zdWJzZWcgPSAwOwotICB0Yy0+YWxpZ24gPSAwOwotICB0Yy0+c2l6ZSA9IE5VTEw7Ci0gIHRjLT53aXRoaW4gPSBOVUxMOwotCi0gIGlmIChwcGNfc3RhYl9zeW1ib2wpCi0gICAgcmV0dXJuOwotCi0gIHMgPSBzdHJjaHIgKFNfR0VUX05BTUUgKHN5bSksICdbJyk7Ci0gIGlmIChzID09IChjb25zdCBjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgLyogVGhlcmUgaXMgbm8gc3VmZml4LiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytzOwotCi0gIHN3aXRjaCAoc1swXSkKLSAgICB7Ci0gICAgY2FzZSAnQic6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiQlNdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfQlM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdEJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJEQl0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19EQjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIkRTXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX0RTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRyc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiR0xdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfR0w7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdQJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJQUl0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19QUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1InOgotICAgICAgaWYgKHN0cmNtcCAocywgIlJPXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1JPOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiUlddIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfUlc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdTJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJTVl0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19TVjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1QnOgotICAgICAgaWYgKHN0cmNtcCAocywgIlRDXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1RDOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVEldIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfVEk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJUQl0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19UQjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlRDMF0iKSA9PSAwIHx8IHN0cmNtcCAocywgIlQwXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1RDMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1UnOgotICAgICAgaWYgKHN0cmNtcCAocywgIlVBXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1VBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVUNdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfVUM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdYJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJYT10iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19YTzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAodGMtPmNsYXNzID09IC0xKQotICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIHN5bWJvbCBzdWZmaXgiKSk7Ci19Ci0KLS8qIFNldCB0aGUgY2xhc3Mgb2YgYSBsYWJlbCBiYXNlZCBvbiB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgVGhpcwotICAgaGFuZGxlcyBzeW1ib2xzIHdpdGhvdXQgc3VmZml4ZXMuICBBbHNvLCBtb3ZlIHRoZSBzeW1ib2wgc28gdGhhdCBpdAotICAgZm9sbG93cyB0aGUgY3NlY3Qgc3ltYm9sLiAgKi8KLQotdm9pZAotcHBjX2Zyb2JfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAocHBjX2N1cnJlbnRfY3NlY3QgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gLTEpCi0Jc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPSBzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPmNsYXNzOwotCi0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoc3ltLCBzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbiwKLQkJICAgICAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHBwY19jdXJyZW50X2NzZWN0KS0+d2l0aGluID0gc3ltOwotICAgIH0KLX0KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgYnkgcHBjX2Zyb2Jfc3ltYm9sIGlmIGFueSBhYnNvbHV0ZSBzeW1ib2xzIGFyZQotICAgc2Vlbi4gIEl0IHRlbGxzIHBwY19hZGp1c3Rfc3ltdGFiIHdoZXRoZXIgaXQgbmVlZHMgdG8gbG9vayB0aHJvdWdoCi0gICB0aGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuIHBwY19zYXdfYWJzOwotCi0vKiBDaGFuZ2UgdGhlIG5hbWUgb2YgYSBzeW1ib2wganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBTZXQgdGhlCi0gICByZWFsIG5hbWUgaWYgdGhlIC5yZW5hbWUgcHNldWRvLW9wIHdhcyB1c2VkLiAgT3RoZXJ3aXNlLCByZW1vdmUgYW55Ci0gICBjbGFzcyBzdWZmaXguICBSZXR1cm4gMSBpZiB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICBzeW1ib2wgdGFibGUuICAqLwotCi1pbnQKLXBwY19mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpwcGNfbGFzdF9mdW5jdGlvbjsKLSAgc3RhdGljIHN5bWJvbFMgKnNldF9lbmQ7Ci0KLSAgLyogRGlzY2FyZCBzeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IHN5bWJvbAotICAgICB0YWJsZS4gICovCi0gIGlmICghIHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHN5bSkKLSAgICAgICYmICgoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0JICB8fCAoISBTX0lTX0VYVEVSTkFMIChzeW0pCi0JICAgICAgJiYgISBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQKLQkgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRklMRSkpKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBTX1NFVF9OQU1FIChzeW0sIHN5bWJvbF9nZXRfdGMgKHN5bSktPnJlYWxfbmFtZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY29uc3QgY2hhciAqczsKLQotICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKHN5bSk7Ci0gICAgICBzID0gc3RyY2hyIChuYW1lLCAnWycpOwotICAgICAgaWYgKHMgIT0gKGNoYXIgKikgTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgY2hhciAqc25ldzsKLQotCSAgbGVuID0gcyAtIG5hbWU7Ci0JICBzbmV3ID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICBtZW1jcHkgKHNuZXcsIG5hbWUsIGxlbik7Ci0JICBzbmV3W2xlbl0gPSAnXDAnOwotCi0JICBTX1NFVF9OQU1FIChzeW0sIHNuZXcpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNldF9lbmQgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBTQV9TRVRfU1lNX0VORE5EWCAoc2V0X2VuZCwgc3ltKTsKLSAgICAgIHNldF9lbmQgPSBOVUxMOwotICAgIH0KLQotICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChzeW0pKQotICAgIHsKLSAgICAgIGlmIChwcGNfbGFzdF9mdW5jdGlvbiAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCWFzX2JhZCAoXygidHdvIC5mdW5jdGlvbiBwc2V1ZG8tb3BzIHdpdGggbm8gaW50ZXJ2ZW5pbmcgLmVmIikpOwotICAgICAgcHBjX2xhc3RfZnVuY3Rpb24gPSBzeW07Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+c2l6ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5zaXplLCAxKTsKLQkgIFNBX1NFVF9TWU1fRlNJWkUgKHN5bSwKLQkJCSAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbF9nZXRfdGMgKHN5bSktPnNpemUpKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRkNOCi0JICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChzeW0pLCAiLmVmIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocHBjX2xhc3RfZnVuY3Rpb24gPT0gKHN5bWJvbFMgKikgTlVMTCkKLQlhc19iYWQgKF8oIi5lZiB3aXRoIG5vIHByZWNlZGluZyAuZnVuY3Rpb24iKSk7Ci0gICAgICBlbHNlCi0JewotCSAgc2V0X2VuZCA9IHBwY19sYXN0X2Z1bmN0aW9uOwotCSAgcHBjX2xhc3RfZnVuY3Rpb24gPSBOVUxMOwotCi0JICAvKiBXZSBkb24ndCBoYXZlIGEgQ19FRkNOIHN5bWJvbCwgYnV0IHdlIG5lZWQgdG8gZm9yY2UgdGhlCi0JICAgICBDT0ZGIGJhY2tlbmQgdG8gYmVsaWV2ZSB0aGF0IGl0IGhhcyBzZWVuIG9uZS4gICovCi0JICBjb2ZmX2xhc3RfZnVuY3Rpb24gPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgU19JU19FWFRFUk5BTCAoc3ltKQotICAgICAgJiYgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0ZJTEUKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19GQ04KLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19CTE9DSwotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0JTVEFUCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRVNUQVQKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19CSU5DTAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0VJTkNMCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24pCi0gICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0hJREVYVCk7Ci0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FWFQKLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19ISURFWFQpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmE7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGNzZWN0IGF1eC4gICovCi0gICAgICBpID0gU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltKTsKLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgaSArIDEpOwotICAgICAgYSA9ICZjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZVtpICsgMV0udS5hdXhlbnQ7Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gWE1DX1RDMCkKLQl7Ci0JICAvKiBUaGlzIGlzIHRoZSBUT0MgdGFibGUuICAqLwotCSAga25vdyAoc3RyY21wIChTX0dFVF9OQU1FIChzeW0pLCAiVE9DIikgPT0gMCk7Ci0JICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAwOwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKDIgPDwgMykgfCBYVFlfU0Q7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnICE9IDApCi0JewotCSAgLyogVGhpcyBpcyBhIGNzZWN0IHN5bWJvbC4gIHhfc2NubGVuIGlzIHRoZSBzaXplIG9mIHRoZQotCSAgICAgY3NlY3QuICAqLwotCSAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPm5leHQgPT0gKHN5bWJvbFMgKikgTlVMTCkKLQkgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwKLQkJCQkJCSAgICAgICBTX0dFVF9TRUdNRU5UIChzeW0pKQotCQkJCSAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sX2dldF90YyAoc3ltKS0+bmV4dCwgMSk7Ci0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKFNfR0VUX1ZBTFVFIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5uZXh0KQotCQkJCSAgICAgICAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgfQotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKHN5bWJvbF9nZXRfdGMgKHN5bSktPmFsaWduIDw8IDMpIHwgWFRZX1NEOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gYnNzX3NlY3Rpb24pCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCSAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gc3ltYm9sX2dldF9mcmFnIChzeW0pLT5mcl9vZmZzZXQ7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSAoc3ltYm9sX2dldF90YyAoc3ltKS0+YWxpZ24gPDwgMykgfCBYVFlfQ007Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltKSkKLQkgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPSBYTUNfUlc7Ci0JICBlbHNlCi0JICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gWE1DX0JTOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQl7Ci0JICAvKiBUaGlzIGlzIGFuIGFic29sdXRlIHN5bWJvbC4gIFRoZSBjc2VjdCB3aWxsIGJlIGNyZWF0ZWQgYnkKLSAgICAgICAgICAgICBwcGNfYWRqdXN0X3N5bXRhYi4gICovCi0JICBwcGNfc2F3X2FicyA9IHRydWU7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfTEQ7Ci0JICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gLTEpCi0JICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gWE1DX1hPOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgU19JU19ERUZJTkVEIChzeW0pKQotCXsKLQkgIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IDA7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfRVI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gWE1DX1RDKQotCXsKLQkgIHN5bWJvbFMgKm5leHQ7Ci0KLQkgIC8qIFRoaXMgaXMgYSBUT0MgZGVmaW5pdGlvbi4gIHhfc2NubGVuIGlzIHRoZSBzaXplIG9mIHRoZQotCSAgICAgVE9DIGVudHJ5LiAgKi8KLQkgIG5leHQgPSBzeW1ib2xfbmV4dCAoc3ltKTsKLQkgIHdoaWxlIChzeW1ib2xfZ2V0X3RjIChuZXh0KS0+Y2xhc3MgPT0gWE1DX1RDMCkKLQkgICAgbmV4dCA9IHN5bWJvbF9uZXh0IChuZXh0KTsKLQkgIGlmIChuZXh0ID09IChzeW1ib2xTICopIE5VTEwKLQkgICAgICB8fCBzeW1ib2xfZ2V0X3RjIChuZXh0KS0+Y2xhc3MgIT0gWE1DX1RDKQotCSAgICB7Ci0JICAgICAgaWYgKHBwY19hZnRlcl90b2NfZnJhZyA9PSAoZnJhZ1MgKikgTlVMTCkKLQkJYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwKLQkJCQkJCQkgICBkYXRhX3NlY3Rpb24pCi0JCQkJCSAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgICBlbHNlCi0JCWEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChwcGNfYWZ0ZXJfdG9jX2ZyYWctPmZyX2FkZHJlc3MKLQkJCQkJIC0gU19HRVRfVkFMVUUgKHN5bSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAobmV4dCwgMSk7Ci0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKFNfR0VUX1ZBTFVFIChuZXh0KQotCQkJCSAgICAgICAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgfQotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKDIgPDwgMykgfCBYVFlfU0Q7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKmNzZWN0OwotCi0JICAvKiBUaGlzIGlzIGEgbm9ybWFsIHN5bWJvbCBkZWZpbml0aW9uLiAgeF9zY25sZW4gaXMgdGhlCi0JICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIGNvbnRhaW5pbmcgY3NlY3QuICAqLwotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gdGV4dF9zZWN0aW9uKQotCSAgICBjc2VjdCA9IHBwY190ZXh0X2NzZWN0czsKLQkgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gZGF0YV9zZWN0aW9uKQotCSAgICBjc2VjdCA9IHBwY19kYXRhX2NzZWN0czsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIC8qIFNraXAgdGhlIGluaXRpYWwgZHVtbXkgc3ltYm9sLiAgKi8KLQkgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0OwotCi0JICBpZiAoY3NlY3QgPT0gKHN5bWJvbFMgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIndhcm5pbmc6IHN5bWJvbCAlcyBoYXMgbm8gY3NlY3QiKSwgU19HRVRfTkFNRSAoc3ltKSk7Ci0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dCAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCQl7Ci0JCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dCwgMSk7Ci0JCSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQpCi0JCSAgICAgID4gU19HRVRfVkFMVUUgKHN5bSkpCi0JCSAgICBicmVhazsKLQkJICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dDsKLQkJfQotCi0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5wID0KLQkJY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKGNzZWN0KSktPm5hdGl2ZTsKLQkgICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZVtpICsgMV0uZml4X3NjbmxlbiA9Ci0JCTE7Ci0JICAgIH0KLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9IFhUWV9MRDsKLQl9Ci0JCi0gICAgICBhLT54X2NzZWN0LnhfcGFybWhhc2ggPSAwOwotICAgICAgYS0+eF9jc2VjdC54X3NuaGFzaCA9IDA7Ci0gICAgICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gLTEpCi0JYS0+eF9jc2VjdC54X3NtY2xhcyA9IFhNQ19QUjsKLSAgICAgIGVsc2UKLQlhLT54X2NzZWN0Lnhfc21jbGFzID0gc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3M7Ci0gICAgICBhLT54X2NzZWN0Lnhfc3RhYiA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc25zdGFiID0gMDsKLQotICAgICAgLyogRG9uJ3QgbGV0IHRoZSBDT0ZGIGJhY2tlbmQgcmVzb3J0IHRoZXNlIHN5bWJvbHMuICAqLwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9OT1RfQVRfRU5EOwotICAgIH0KLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0JTVEFUKQotICAgIHsKLSAgICAgIC8qIFdlIHdhbnQgdGhlIHZhbHVlIHRvIGJlIHRoZSBzeW1ib2wgaW5kZXggb2YgdGhlIHJlZmVyZW5jZWQKLQkgY3NlY3Qgc3ltYm9sLiAgQkZEIHdpbGwgZG8gdGhhdCBmb3IgdXMgaWYgd2Ugc2V0IHRoZSByaWdodAotCSBmbGFncy4gICovCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltLAotCQkgICAoKHZhbHVlVCkKLQkJICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltCi0JCQkJKHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbikpLT5uYXRpdmUpKTsKLSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT5maXhfdmFsdWUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX1NUU1lNKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmJsb2NrOwotICAgICAgc3ltYm9sUyAqY3NlY3Q7Ci0KLSAgICAgIC8qIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuY2xvc2luZyBjc2VjdC4gICovCi0gICAgICBibG9jayA9IHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbjsKLSAgICAgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoYmxvY2spLT53aXRoaW47Ci0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoY3NlY3QsIDEpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgU19HRVRfVkFMVUUgKHN5bSkgLSBTX0dFVF9WQUxVRSAoY3NlY3QpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19CSU5DTAotCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FSU5DTCkKLSAgICB7Ci0gICAgICAvKiBXZSB3YW50IHRoZSB2YWx1ZSB0byBiZSBhIGZpbGUgb2Zmc2V0IGludG8gdGhlIGxpbmUgbnVtYmVycy4KLSAgICAgICAgIEJGRCB3aWxsIGRvIHRoYXQgZm9yIHVzIGlmIHdlIHNldCB0aGUgcmlnaHQgZmxhZ3MuICBXZSBoYXZlCi0gICAgICAgICBhbHJlYWR5IHNldCB0aGUgdmFsdWUgY29ycmVjdGx5LiAgKi8KLSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT5maXhfbGluZSA9IDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY3JlYXRlcyBjc2VjdCBzeW1ib2xzIGZvciBhbGwKLSAgIGFic29sdXRlIHN5bWJvbHMuICAqLwotCi12b2lkCi1wcGNfYWRqdXN0X3N5bXRhYiAoKQotewotICBzeW1ib2xTICpzeW07Ci0KLSAgaWYgKCEgcHBjX3Nhd19hYnMpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqY3NlY3Q7Ci0gICAgICBpbnQgaTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYTsKLQotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gYWJzb2x1dGVfc2VjdGlvbikKLQljb250aW51ZTsKLQotICAgICAgY3NlY3QgPSBzeW1ib2xfY3JlYXRlICgiLmFic1tYT10iLCBhYnNvbHV0ZV9zZWN0aW9uLAotCQkJICAgICBTX0dFVF9WQUxVRSAoc3ltKSwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChjc2VjdCktPnZhbHVlID0gU19HRVRfVkFMVUUgKHN5bSk7Ci0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChjc2VjdCwgQ19ISURFWFQpOwotICAgICAgaSA9IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGNzZWN0KTsKLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGNzZWN0LCBpICsgMSk7Ci0gICAgICBhID0gJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChjc2VjdCkpLT5uYXRpdmVbaSArIDFdLnUuYXV4ZW50OwotICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbXR5cCA9IFhUWV9TRDsKLSAgICAgIGEtPnhfY3NlY3QueF9wYXJtaGFzaCA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc25oYXNoID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfWE87Ci0gICAgICBhLT54X2NzZWN0Lnhfc3RhYiA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc25zdGFiID0gMDsKLQotICAgICAgc3ltYm9sX2luc2VydCAoY3NlY3QsIHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgICAgIGkgPSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0pOwotICAgICAgYSA9ICZjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZVtpXS51LmF1eGVudDsKLSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ucCA9IGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChjc2VjdCkpLT5uYXRpdmU7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZVtpXS5maXhfc2NubGVuID0gMTsKLSAgICB9Ci0KLSAgcHBjX3Nhd19hYnMgPSBmYWxzZTsKLX0KLQotLyogU2V0IHRoZSBWTUEgZm9yIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIG9uIGFsbCB0aGUgc2VjdGlvbnMgaW4KLSAgIHR1cm4uICAqLwotCi12b2lkCi1wcGNfZnJvYl9zZWN0aW9uIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0YXRpYyBiZmRfc2l6ZV90eXBlIHZtYSA9IDA7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWMsIHZtYSk7Ci0gIHZtYSArPSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYyk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfWENPRkYgKi8KLQwKLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRwLiAgVGhlIG51bWJlcgotICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZXAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0cDsKLSAgICAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVwID0gcHJlYyAqIDI7Ci0KLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRwICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdHAgKz0gMjsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogQWxpZ24gYSBzZWN0aW9uIChJIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgbWFjaGluZSBkZXBlbmRlbnQpLiAgKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0KLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLS8qIFdlIGRvbid0IGhhdmUgYW55IGZvcm0gb2YgcmVsYXhpbmcuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICBXZSBuZXZlciBnZW5lcmF0ZSB0aGVzZS4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLSNpZmRlZiBPQkpfWENPRkYKLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgYSBmaXh1cCBzaG91bGQgYmUgYWRqdXN0ZWQgdG8gdXNlIGEKLSAgIHNlY3Rpb24gc3ltYm9sLiAgV2UgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIGEgZml4dXAgYWdhaW5zdAotICAgYSBzeW1ib2wgaW4gdGhlIFRPQyBzdWJzZWdtZW50IGludG8gYSByZWxvYyBhZ2FpbnN0IHRoZQotICAgY29ycmVzcG9uZGluZyAudGMgc3ltYm9sLiAgKi8KLQotaW50Ci1wcGNfZml4X2FkanVzdGFibGUgKGZpeCkKLSAgICAgZml4UyAqZml4OwotewotICB2YWx1ZVQgdmFsOwotCi0gIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmaXgtPmZ4X2FkZHN5LCAxKTsKLSAgdmFsID0gU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpOwotICBpZiAocHBjX3RvY19jc2VjdCAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiBmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmIGZpeC0+ZnhfYWRkc3kgIT0gcHBjX3RvY19jc2VjdAotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgPT0gZGF0YV9zZWN0aW9uCi0gICAgICAmJiB2YWwgPj0gcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0gICAgICAmJiAocHBjX2FmdGVyX3RvY19mcmFnID09IChmcmFnUyAqKSBOVUxMCi0JICB8fCB2YWwgPCBwcGNfYWZ0ZXJfdG9jX2ZyYWctPmZyX2FkZHJlc3MpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5OwotCi0gICAgICBmb3IgKHN5ID0gc3ltYm9sX25leHQgKHBwY190b2NfY3NlY3QpOwotCSAgIHN5ICE9IChzeW1ib2xTICopIE5VTEw7Ci0JICAgc3kgPSBzeW1ib2xfbmV4dCAoc3kpKQotCXsKLQkgIGlmIChzeW1ib2xfZ2V0X3RjIChzeSktPmNsYXNzID09IFhNQ19UQzApCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5KS0+Y2xhc3MgIT0gWE1DX1RDKQotCSAgICBicmVhazsKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeSwgMSk7Ci0JICBpZiAodmFsID09IFNfR0VUX1ZBTFVFIChzeSkpCi0JICAgIHsKLQkgICAgICBmaXgtPmZ4X2FkZHN5ID0gc3k7Ci0JICAgICAgZml4LT5meF9hZGRudW1iZXIgPSB2YWwgLSBwcGNfdG9jX2ZyYWctPmZyX2FkZHJlc3M7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGFzX2JhZF93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCSAgICBfKCJzeW1ib2wgaW4gLnRvYyBkb2VzIG5vdCBtYXRjaCBhbnkgLnRjIikpOwotICAgIH0KLQotICAvKiBQb3NzaWJseSBhZGp1c3QgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QgdGhlIGNzZWN0LiAgKi8KLSAgaWYgKGZpeC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPnN1YnNlZyA9PSAwCi0gICAgICAmJiBzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+Y2xhc3MgIT0gWE1DX1RDMAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPmNsYXNzICE9IFhNQ19UQwotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgIT0gYnNzX3NlY3Rpb24KLSAgICAgIC8qIERvbid0IGFkanVzdCBpZiB0aGlzIGlzIGEgcmVsb2MgaW4gdGhlIHRvYyBzZWN0aW9uLiAgKi8KLSAgICAgICYmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSAhPSBkYXRhX3NlY3Rpb24KLQkgIHx8IHBwY190b2NfY3NlY3QgPT0gTlVMTAotCSAgfHwgdmFsIDwgcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0JICB8fCAocHBjX2FmdGVyX3RvY19mcmFnICE9IE5VTEwKLQkgICAgICAmJiB2YWwgPj0gcHBjX2FmdGVyX3RvY19mcmFnLT5mcl9hZGRyZXNzKSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqY3NlY3Q7Ci0KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSB0ZXh0X3NlY3Rpb24pCi0JY3NlY3QgPSBwcGNfdGV4dF9jc2VjdHM7Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSBkYXRhX3NlY3Rpb24pCi0JY3NlY3QgPSBwcGNfZGF0YV9jc2VjdHM7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIFNraXAgdGhlIGluaXRpYWwgZHVtbXkgc3ltYm9sLiAgKi8KLSAgICAgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0OwotCi0gICAgICBpZiAoY3NlY3QgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICB3aGlsZSAoc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0ICE9IChzeW1ib2xTICopIE5VTEwKLQkJICYmIChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dCktPmZyX2FkZHJlc3MKLQkJICAgICA8PSBzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9hZGRyZXNzKSkKLQkgICAgewotCSAgICAgIC8qIElmIHRoZSBjc2VjdCBhZGRyZXNzIGVxdWFscyB0aGUgc3ltYm9sIHZhbHVlLCB0aGVuIHdlCi0gICAgICAgICAgICAgICAgIGhhdmUgdG8gbG9vayB0aHJvdWdoIHRoZSBmdWxsIHN5bWJvbCB0YWJsZSB0byBzZWUKLSAgICAgICAgICAgICAgICAgd2hldGhlciB0aGlzIGlzIHRoZSBjc2VjdCB3ZSB3YW50LiAgTm90ZSB0aGF0IHdlIHdpbGwKLSAgICAgICAgICAgICAgICAgb25seSBnZXQgaGVyZSBpZiB0aGUgY3NlY3QgaGFzIHplcm8gbGVuZ3RoLiAgKi8KLQkgICAgICBpZiAoKHN5bWJvbF9nZXRfZnJhZyAoY3NlY3QpLT5mcl9hZGRyZXNzCi0JCSAgID09IHN5bWJvbF9nZXRfZnJhZyAoZml4LT5meF9hZGRzeSktPmZyX2FkZHJlc3MpCi0JCSAgJiYgU19HRVRfVkFMVUUgKGNzZWN0KSA9PSBTX0dFVF9WQUxVRSAoZml4LT5meF9hZGRzeSkpCi0JCXsKLQkJICBzeW1ib2xTICpzY2FuOwotCi0JCSAgZm9yIChzY2FuID0gc3ltYm9sX25leHQgKGNzZWN0KTsKLQkJICAgICAgIHNjYW4gIT0gTlVMTDsKLQkJICAgICAgIHNjYW4gPSBzeW1ib2xfbmV4dCAoc2NhbikpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzeW1ib2xfZ2V0X3RjIChzY2FuKS0+c3Vic2VnICE9IDApCi0JCQlicmVhazsKLQkJICAgICAgaWYgKHNjYW4gPT0gZml4LT5meF9hZGRzeSkKLQkJCWJyZWFrOwotCQkgICAgfQotCi0JCSAgLyogSWYgd2UgZm91bmQgdGhlIHN5bWJvbCBiZWZvcmUgdGhlIG5leHQgY3NlY3QKLSAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwgdGhlbiB0aGlzIGlzIHRoZSBjc2VjdCB3ZSB3YW50LiAgKi8KLQkJICBpZiAoc2NhbiA9PSBmaXgtPmZ4X2FkZHN5KQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0OwotCSAgICB9Ci0KLQkgIGZpeC0+Znhfb2Zmc2V0ICs9IChTX0dFVF9WQUxVRSAoZml4LT5meF9hZGRzeSkKLQkJCSAgICAgLSBzeW1ib2xfZ2V0X2ZyYWcgKGNzZWN0KS0+ZnJfYWRkcmVzcyk7Ci0JICBmaXgtPmZ4X2FkZHN5ID0gY3NlY3Q7Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3QgYSByZWxvYyBhZ2FpbnN0IGEgLmxjb21tIHN5bWJvbCB0byBiZSBhZ2FpbnN0IHRoZSBiYXNlCi0gICAgIC5sY29tbS4gICovCi0gIGlmIChmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeC0+ZnhfYWRkc3kpID09IGJzc19zZWN0aW9uCi0gICAgICAmJiAhIFNfSVNfRVhURVJOQUwgKGZpeC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9zeW1ib2wsIDEpOwotICAgICAgZml4LT5meF9vZmZzZXQgKz0KLQkoU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpCi0JIC0gU19HRVRfVkFMVUUgKHN5bWJvbF9nZXRfZnJhZyAoZml4LT5meF9hZGRzeSktPmZyX3N5bWJvbCkpOwotICAgICAgZml4LT5meF9hZGRzeSA9IHN5bWJvbF9nZXRfZnJhZyAoZml4LT5meF9hZGRzeSktPmZyX3N5bWJvbDsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEEgcmVsb2MgZnJvbSBvbmUgY3NlY3QgdG8gYW5vdGhlciBtdXN0IGJlIGtlcHQuICBUaGUgYXNzZW1ibGVyCi0gICB3aWxsLCBvZiBjb3Vyc2UsIGtlZXAgcmVsb2NzIGJldHdlZW4gc2VjdGlvbnMsIGFuZCBpdCB3aWxsIGtlZXAKLSAgIGFic29sdXRlIHJlbG9jcywgYnV0IHdlIG5lZWQgdG8gZm9yY2UgaXQgdG8ga2VlcCBQQyByZWxhdGl2ZSByZWxvY3MKLSAgIGJldHdlZW4gdHdvIGNzZWN0cyBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KLQotaW50Ci1wcGNfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICpmaXg7Ci17Ci0gIC8qIEF0IHRoaXMgcG9pbnQgZml4LT5meF9hZGRzeSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY29udmVydGVkIHRvCi0gICAgIGEgY3NlY3Qgc3ltYm9sLiAgSWYgdGhlIGNzZWN0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZyYWdtZW50LCB0aGVuCi0gICAgIHdlIG5lZWQgdG8gZm9yY2UgdGhlIHJlbG9jYXRpb24uICAqLwotICBpZiAoZml4LT5meF9wY3JlbAotICAgICAgJiYgZml4LT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiBzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+c3Vic2VnICE9IDAKLSAgICAgICYmICgoc3ltYm9sX2dldF9mcmFnIChmaXgtPmZ4X2FkZHN5KS0+ZnJfYWRkcmVzcwotCSAgID4gZml4LT5meF9mcmFnLT5mcl9hZGRyZXNzKQotCSAgfHwgKHN5bWJvbF9nZXRfdGMgKGZpeC0+ZnhfYWRkc3kpLT5uZXh0ICE9IE5VTEwKLQkgICAgICAmJiAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+bmV4dCktPmZyX2FkZHJlc3MKLQkJICA8PSBmaXgtPmZ4X2ZyYWctPmZyX2FkZHJlc3MpKSkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfWENPRkYgKi8KLQotLyogU2VlIHdoZXRoZXIgYSBzeW1ib2wgaXMgaW4gdGhlIFRPQyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcHBjX2lzX3RvY19zeW0gKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotI2lmZGVmIE9CSl9YQ09GRgotICByZXR1cm4gc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPT0gWE1DX1RDOwotI2Vsc2UKLSAgcmV0dXJuIHN0cmNtcCAoc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKSwgIi5nb3QiKSA9PSAwOwotI2VuZGlmCi19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBjb2RlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIGZpeHVwcyB3ZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gZml4X25ld19leHAsIGFib3ZlLiAgSW4gdGhlIGNhbGwKLSAgIGFib3ZlIHdlIHVzZWQgYSByZWxvYyBjb2RlIHdoaWNoIHdhcyB0aGUgbGFyZ2VzdCBsZWdhbCByZWxvYyBjb2RlCi0gICBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgSGVyZSB3ZSB1bmRvIHRoYXQgdG8gcmVjb3ZlciB0aGUgb3BlcmFuZAotICAgaW5kZXguICBBdCB0aGlzIHBvaW50IGFsbCBzeW1ib2wgdmFsdWVzIHNob3VsZCBiZSBmdWxseSByZXNvbHZlZCwKLSAgIGFuZCB3ZSBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGUgcmVsb2MuICBJZiB3ZSBjYW4gbm90IGRvCi0gICB0aGF0LCB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVsb2MgY29kZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlCi0gICBmaXh1cC4gICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgdmFsdWVUIHZhbHVlOwotCi0jaWZkZWYgT0JKX0VMRgotICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIGAqdmFsdWVwJyBtYXkgY29udGFpbiB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBvbiB3aGljaCB0aGUgcmVsb2MKLQkgd2lsbCBiZSBiYXNlZDsgd2UgaGF2ZSB0byByZW1vdmUgaXQuICAqLwotICAgICAgaWYgKHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKGZpeHAtPmZ4X2FkZHN5KQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IGFic29sdXRlX3NlY3Rpb24KLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSB1bmRlZmluZWRfc2VjdGlvbgotCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSkpCi0JdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KTsKLQotICAgICAgLyogRklYTUU6IFdoeSAnKyc/ICBCZXR0ZXIgeWV0LCB3aGF0IGV4YWN0bHkgaXMgJyp2YWx1ZXAnCi0JIHN1cHBvc2VkIHRvIGJlPyAgSSB0aGluayB0aGlzIGlzIHJlbGF0ZWQgdG8gdmFyaW91cyBzaW1pbGFyCi0JIEZJWE1FcyBpbiB0Yy1pMzg2LmMgYW5kIHRjLXNwYXJjLmMuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXZhbHVlICs9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0jZWxzZQotICAvKiBGSVhNRSBGSVhNRSBGSVhNRTogVGhlIHZhbHVlIHdlIGFyZSBwYXNzZWQgaW4gKnZhbHVlcCBpbmNsdWRlcwotICAgICB0aGUgc3ltYm9sIHZhbHVlcy4gIFNpbmNlIHdlIGFyZSB1c2luZyBCRkRfQVNTRU1CTEVSLCBpZiB3ZSBhcmUKLSAgICAgZG9pbmcgdGhpcyByZWxvY2F0aW9uIHRoZSBjb2RlIGluIHdyaXRlLmMgaXMgZ29pbmcgdG8gY2FsbAotICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLCB3aGljaCBpcyBhbHNvIGdvaW5nIHRvIHVzZSB0aGUgc3ltYm9sCi0gICAgIHZhbHVlLiAgVGhhdCBtZWFucyB0aGF0IGlmIHRoZSByZWxvYyBpcyBmdWxseSByZXNvbHZlZCB3ZSB3YW50IHRvCi0gICAgIHVzZSAqdmFsdWVwIHNpbmNlIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gaXMgbm90IGJlaW5nIHVzZWQuCi0gICAgIEhvd2V2ZXIsIGlmIHRoZSByZWxvYyBpcyBub3QgZnVsbHkgcmVzb2x2ZWQgd2UgZG8gbm90IHdhbnQgdG8gdXNlCi0gICAgICp2YWx1ZXAsIGFuZCBtdXN0IHVzZSBmeF9vZmZzZXQgaW5zdGVhZC4gIEhvd2V2ZXIsIGlmIHRoZSByZWxvYwotICAgICBpcyBQQyByZWxhdGl2ZSwgd2UgZG8gd2FudCB0byB1c2UgKnZhbHVlcCBzaW5jZSBpdCBpbmNsdWRlcyB0aGUKLSAgICAgcmVzdWx0IG9mIG1kX3BjcmVsX2Zyb20uICBUaGlzIGlzIGNvbmZ1c2luZy4gICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgdmFsdWUgPSAqdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoKGludCkgZml4cC0+Znhfcl90eXBlID49IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaW50IG9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgY2hhciAqd2hlcmU7Ci0gICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgICAgIG9waW5kZXggPSAoaW50KSBmaXhwLT5meF9yX3R5cGUgLSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOwotCi0gICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbb3BpbmRleF07Ci0KLSNpZmRlZiBPQkpfWENPRkYKLSAgICAgIC8qIEl0IGFwcGVhcnMgdGhhdCBhbiBpbnN0cnVjdGlvbiBsaWtlCi0JICAgICBsIDksTEMuLjEoMzApCi0JIHdoZW4gTEMuLjEgaXMgbm90IGEgVE9DIHN5bWJvbCBkb2VzIG5vdCBnZW5lcmF0ZSBhIHJlbG9jLiAgSXQKLQkgdXNlcyB0aGUgb2Zmc2V0IG9mIExDLi4xIHdpdGhpbiBpdHMgY3NlY3QuICBIb3dldmVyLCAubG9uZwotCSBMQy4uMSB3aWxsIGdlbmVyYXRlIGEgcmVsb2MuICBJIGNhbid0IGZpbmQgYW55IGRvY3VtZW50YXRpb24KLQkgb24gaG93IHRoZXNlIGNhc2VzIGFyZSB0byBiZSBkaXN0aW5ndWlzaGVkLCBzbyB0aGlzIGlzIGEgd2lsZAotCSBndWVzcy4gIFRoZXNlIGNhc2VzIGFyZSBnZW5lcmF0ZWQgYnkgZ2NjIC1tbWluaW1hbC10b2MuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMAotCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgotCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMAotCSAgJiYgb3BlcmFuZC0+aW5zZXJ0ID09IE5VTEwKLQkgICYmIGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICYmIHN5bWJvbF9nZXRfdGMgKGZpeHAtPmZ4X2FkZHN5KS0+c3Vic2VnICE9IDAKLQkgICYmIHN5bWJvbF9nZXRfdGMgKGZpeHAtPmZ4X2FkZHN5KS0+Y2xhc3MgIT0gWE1DX1RDCi0JICAmJiBzeW1ib2xfZ2V0X3RjIChmaXhwLT5meF9hZGRzeSktPmNsYXNzICE9IFhNQ19UQzAKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBic3Nfc2VjdGlvbikKLQl7Ci0JICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKLQkgIGZpeHAtPmZ4X2RvbmUgPSAxOwotCX0KLSNlbmRpZgotCi0gICAgICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotCSB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KLSAgICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlCi0JaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGluc24gPSBwcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIChvZmZzZXRUKSB2YWx1ZSwKLQkJCQkgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCi0gICAgICBpZiAoZml4cC0+ZnhfZG9uZSkKLQl7Ci0JICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8gaGVyZS4gICovCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbi4KLQkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50bwotCSByZWxvY3MuCi0JIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgRFMgZmllbGQgYXQgdGhlIHZlcnkgbGVhc3QuCi0JIEZJWE1FOiBTZWxlY3RpbmcgdGhlIHJlbG9jIHR5cGUgaXMgYSBiaXQgaGFwaGF6YXJkOyBwZXJoYXBzCi0JIHRoZXJlIHNob3VsZCBiZSBhIG5ldyBmaWVsZCBpbiB0aGUgb3BlcmFuZCB0YWJsZS4gICovCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDAKLQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjYKLQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CMjY7Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9SRUxBVElWRSkgIT0gMAotCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgotCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMCkKLQlmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX0IxNjsKLSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwCi0JICAgICAgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjYKLQkgICAgICAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMCkKLQlmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX0JBMjY7Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDE2Ci0JICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CQTE2OwotICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUEFSRU5TKSAhPSAwCi0JICAgICAgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKLQkgICAgICAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5pbnNlcnQgPT0gTlVMTAotCSAgICAgICAmJiBmaXhwLT5meF9hZGRzeSAhPSBOVUxMCi0JICAgICAgICYmIHBwY19pc190b2Nfc3ltIChmaXhwLT5meF9hZGRzeSkpCi0JewotCSAgZml4cC0+Znhfc2l6ZSA9IDI7Ci0JICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgIGZpeHAtPmZ4X3doZXJlICs9IDI7Ci0JICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpzZmlsZTsKLQkgIHVuc2lnbmVkIGludCBzbGluZTsKLQotCSAgLyogVXNlIGV4cHJfc3ltYm9sX3doZXJlIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGV4cHJlc3Npb24KLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChmaXhwLT5meF9hZGRzeSwgJnNmaWxlLCAmc2xpbmUpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgIF8oInVucmVzb2x2ZWQgZXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgcmVzb2x2ZWQiKSk7Ci0JICBlbHNlCi0JICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgXygidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIikpOwotCSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmZGVmIE9CSl9FTEYKLSAgICAgIHBwY19lbGZfdmFsaWRhdGVfZml4IChmaXhwLCBzZWcpOwotI2VuZGlmCi0gICAgICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLQkgIGlmIChmaXhwLT5meF9wY3JlbCkKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCWNhc2UgQkZEX1JFTE9DX1JWQToKLQljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMjoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19MTzE2OgotCWNhc2UgQkZEX1JFTE9DXzE2OgotCWNhc2UgQkZEX1JFTE9DX0dQUkVMMTY6Ci0JY2FzZSBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzE2X0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19ISTE2X0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGOgotCWNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoKLQljYXNlIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2OgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTzoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2OgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTDoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTY6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNjoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEk6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQToKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQToKLQljYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIHsKLQkgICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQkJYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgICAgXygiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzIiksCi0JCQkgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSwKLQkJCSAgICAgIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0JICAgICAgZWxzZQotCQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgICBfKCJjYW5ub3QgZW1pdCBQQyByZWxhdGl2ZSAlcyByZWxvY2F0aW9uIiksCi0JCQkgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSk7Ci0JICAgIH0KLQotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMik7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyBjYXNlIGhhcHBlbnMgd2hlbiB5b3Ugd3JpdGUsIGZvciBleGFtcGxlLAotCSAgICAgbGlzICVyMywoTDEtTDIpQGhhCi0JICAgICB3aGVyZSBMMSBhbmQgTDIgYXJlIGRlZmluZWQgbGF0ZXIuICAqLwotCWNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSA+PiAxNiwgMik7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0JCQkgICAgICAodmFsdWUgKyAweDgwMDApID4+IDE2LCAyKTsKLQkgIGJyZWFrOwotCi0JICAvKiBCZWNhdXNlIFNEQTIxIG1vZGlmaWVzIHRoZSByZWdpc3RlciBmaWVsZCwgdGhlIHNpemUgaXMgc2V0IHRvIDQKLQkgICAgIGJ5dGVzLCByYXRoZXIgdGhhbiAyLCBzbyBvZmZzZXQgaXQgaGVyZSBhcHByb3ByaWF0ZWx5ICovCi0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMToKLQkgIGlmIChmaXhwLT5meF9wY3JlbCkKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlCi0JCQkgICAgICArICgodGFyZ2V0X2JpZ19lbmRpYW4pID8gMiA6IDApLAotCQkJICAgICAgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ184OgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMSk7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ19QUENfTE9DQUwyNFBDOgotCSAgaWYgKCFmaXhwLT5meF9wY3JlbCAmJiAhZml4cC0+ZnhfZG9uZSkKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIGlmIChmaXhwLT5meF9kb25lKQotCSAgewotCSAgICBjaGFyICp3aGVyZTsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCSAgICAKLQkgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLQkgICAgICAgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0JICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotCSAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQkgICAgZWxzZQotCSAgICAgIGluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICAgIGlmICgodmFsdWUgJiAzKSAhPSAwKQotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJtdXN0IGJyYW5jaCB0byBhbiBhZGRyZXNzIGEgbXVsdGlwbGUgb2YgNCIpKTsKLQkgICAgaWYgKChvZmZzZXRUKSB2YWx1ZSA8IC0weDQwMDAwMDAwCi0JCXx8IChvZmZzZXRUKSB2YWx1ZSA+PSAweDQwMDAwMDAwKQotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJAbG9jYWwgb3IgQHBsdCBicmFuY2ggZGVzdGluYXRpb24gaXMgdG9vIGZhciBhd2F5LCAlbGQgYnl0ZXMiKSwKLQkJCSAgICB2YWx1ZSk7Ci0JICAgIGluc24gPSBpbnNuIHwgKHZhbHVlICYgMHgwM2ZmZmZmYyk7Ci0JICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQkgICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCSAgICBlbHNlCi0JICAgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0JICBmaXhwLT5meF9kb25lID0gMDsKLQkgIGlmIChmaXhwLT5meF9hZGRzeQotCSAgICAgICYmICFTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgICYmICFTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KSkKLQkgICAgU19TRVRfV0VBSyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0JICBmaXhwLT5meF9kb25lID0gMDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGZwcmludGYoc3RkZXJyLAotCQkgIF8oIkdhcyBmYWlsdXJlLCByZWxvYyB2YWx1ZSAlZFxuIiksIGZpeHAtPmZ4X3JfdHlwZSk7Ci0JICBmZmx1c2goc3RkZXJyKTsKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIGZpeHAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotI2Vsc2UKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfUFBDX1RPQzE2KQotICAgIGZpeHAtPmZ4X2FkZG51bWJlciA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgVEVfUEUKLSAgICAgIGZpeHAtPmZ4X2FkZG51bWJlciA9IDA7Ci0jZWxzZQotICAgICAgLyogV2Ugd2FudCB0byB1c2UgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgc2VnbWVudCBvZiB0aGUKLQkgc3ltYm9sLCBub3QgdGhlIGFjdHVhbCBWTUEgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBmaXhwLT5meF9hZGRudW1iZXIgPQotCS0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkpOwotI2VuZGlmCi0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgcmVsb2MgZm9yIGEgZml4dXAuICAqLwotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtcHBjLmggYi9nYXMvY29uZmlnL3RjLXBwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQzMmQ2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcHBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyogdGMtcHBjLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXBwYy5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19QUEMKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0vKiBTZXQgdGhlIGVuZGlhbm5lc3Mgd2UgYXJlIHVzaW5nLiAgRGVmYXVsdCB0byBiaWcgZW5kaWFuLiAgKi8KLSNpZm5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBQb3dlclBDIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIElmIE9CSl9DT0ZGIGlzIGRlZmluZWQsIGFuZCBURV9QRSBpcyBub3QgZGVmaW5lZCwgd2UgYXJlIGFzc2VtYmxpbmcKLSAgIFhDT0ZGIGZvciBBSVggb3IgUG93ZXJNYWMuICBJZiBURV9QRSBpcyBkZWZpbmVkLCB3ZSBhcmUgYXNzZW1ibGluZwotICAgQ09GRiBmb3IgV2luZG93cyBOVC4gICovCi0KLSNpZmRlZiBPQkpfQ09GRgotI2lmbmRlZiBURV9QRQotI2RlZmluZSBPQkpfWENPRkYKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIChwcGNfYXJjaCAoKSkKLWV4dGVybiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgcHBjX2FyY2ggUEFSQU1TICgodm9pZCkpOwotCi0vKiBXaGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGlzIGJpZyBlbmRpYW4gKi8KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLS8qIFRoZSB0YXJnZXQgQkZEIGZvcm1hdC4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJwZS1wb3dlcnBjIiA6ICJwZS1wb3dlcnBjbGUiKQotI2Vsc2UKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYWl4Y29mZi1yczYwMDAiCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBQb3dlck1hYyBoYXMgYSBCRkQgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gQUlYJ3MuICAqLwotI2lmZGVmIFRFX1BPV0VSTUFDCi0jaWZkZWYgVEFSR0VUX0ZPUk1BVAotI3VuZGVmIFRBUkdFVF9GT1JNQVQKLSNlbmRpZgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJ4Y29mZi1wb3dlcm1hYyIKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlbGYzMi1wb3dlcnBjIiA6ICJlbGYzMi1wb3dlcnBjbGUiKQotI2VuZGlmCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiAkIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24uICAqLwotI2RlZmluZSBET0xMQVJfRE9UCi0KLS8qIFN0cmluZ3MgZG8gbm90IHVzZSBiYWNrc2xhc2ggZXNjYXBlcyB1bmRlciBDT0ZGLiAgKi8KLSNpZmRlZiBPQkpfQ09GRgotI2RlZmluZSBOT19TVFJJTkdfRVNDQVBFUwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLSNlbmRpZgotCi0jaWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgUFBDX0JJR19FTkRJQU4gMQotI2Vsc2UKLSNkZWZpbmUgUFBDX0JJR19FTkRJQU4gMAotI2VuZGlmCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogV2Ugc2V0IHRoZSBmeF9kb25lIGZpZWxkIGFwcHJvcHJpYXRlbHkgaW4gbWRfYXBwbHlfZml4LiAgKi8KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0MCi0jaWZkZWYgVEVfUEUKLQotLyogUXVlc3Rpb24gbWFya3MgYXJlIHBlcm1pdHRlZCBpbiBzeW1ib2wgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfUU0gMQotCi0vKiBEb24ndCBhZGp1c3QgVE9DIHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKGZpeHApIHBwY19wZV9maXhfYWRqdXN0YWJsZSAoZml4cCkKLWV4dGVybiBpbnQgcHBjX3BlX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBEZWNsYXJhdGlvbnMgbmVlZGVkIHdoZW4gZ2VuZXJhdGluZyBYQ09GRiBjb2RlLiAgWENPRkYgaXMgYW4KLSAgIGV4dGVuc2lvbiBvZiBDT0ZGLCB1c2VkIG9ubHkgb24gdGhlIFJTLzYwMDAuICBSYXRoZXIgdGhhbiBjcmVhdGUgYW4KLSAgIG9iai14Y29mZiwgd2UganVzdCB1c2Ugb2JqLWNvZmYsIGFuZCBoYW5kbGUgdGhlIGV4dGVuc2lvbnMgaGVyZSBpbgotICAgdGMtcHBjLiAgKi8KLQotLyogV2UgbmVlZCB0byBrZWVwIHNvbWUgaW5mb3JtYXRpb24gZm9yIHN5bWJvbHMuICAqLwotc3RydWN0IHBwY190Y19zeQotewotICAvKiBXZSBrZWVwIGEgZmV3IGxpbmtlZCBsaXN0cyBvZiBzeW1ib2xzLiAgKi8KLSAgc3ltYm9sUyAqbmV4dDsKLSAgLyogTm9uLXplcm8gaWYgdGhlIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LiAgVGhlIFJTLzYwMDAgYXNzZW1ibGVyCi0gICAgIG9ubHkgb3V0cHV0cyBzeW1ib2xzIHRoYXQgYXJlIGV4dGVybmFsIG9yIGFyZSBtZW50aW9uZWQgaW4gYQotICAgICAuZ2xvYmwgb3IgLmxnbG9ibCBzdGF0ZW1lbnQuICAqLwotICBpbnQgb3V0cHV0OwotICAvKiBUaGUgc3ltYm9sIGNsYXNzLiAgKi8KLSAgaW50IGNsYXNzOwotICAvKiBUaGUgcmVhbCBuYW1lLCBpZiB0aGUgc3ltYm9sIHdhcyByZW5hbWVkLiAgKi8KLSAgY2hhciAqcmVhbF9uYW1lOwotICAvKiBGb3IgYSBjc2VjdCBzeW1ib2wsIHRoZSBzdWJzZWdtZW50IHdlIGFyZSB1c2luZy4gIFRoaXMgaXMgemVybwotICAgICBmb3Igc3ltYm9scyB0aGF0IGFyZSBub3QgY3NlY3RzLiAgKi8KLSAgc3Vic2VnVCBzdWJzZWc7Ci0gIC8qIEZvciBhIGNzZWN0IG9yIGNvbW1vbiBzeW1ib2wsIHRoZSBhbGlnbm1lbnQgdG8gdXNlLiAgKi8KLSAgaW50IGFsaWduOwotICAvKiBGb3IgYSBmdW5jdGlvbiBzeW1ib2wsIGEgc3ltYm9sIHdob3NlIHZhbHVlIGlzIHRoZSBzaXplLiAgVGhlCi0gICAgIGZpZWxkIGlzIE5VTEwgaWYgdGhlcmUgaXMgbm8gc2l6ZS4gICovCi0gIHN5bWJvbFMgKnNpemU7Ci0gIC8qIEZvciBhIGNzZWN0IHN5bWJvbCwgdGhlIGxhc3Qgc3ltYm9sIHdoaWNoIGhhcyBiZWVuIGRlZmluZWQgaW4KLSAgICAgdGhpcyBjc2VjdCwgb3IgTlVMTCBpZiBub25lIGhhdmUgYmVlbiBkZWZpbmVkIHNvIGZhci4gIEZvciBhIC5icwotICAgICBzeW1ib2wsIHRoZSByZWZlcmVuY2VkIGNzZWN0IHN5bWJvbC4gICovCi0gIHN5bWJvbFMgKndpdGhpbjsKLX07Ci0KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzdHJ1Y3QgcHBjX3RjX3N5Ci0KLS8qIFdlIG5lZWQgYW4gYWRkaXRpb25hbCBhdXhlbnQgZm9yIGZ1bmN0aW9uIHN5bWJvbHMuICAqLwotI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyAyCi0KLS8qIFNxdWFyZSBhbmQgY3VybHkgYnJhY2tldHMgYXJlIHBlcm1pdHRlZCBpbiBzeW1ib2wgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfQlIgMwotCi0vKiBDYW5vbmljYWxpemUgdGhlIHN5bWJvbCBuYW1lLiAgKi8KLSNkZWZpbmUgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKG5hbWUpIHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCi1leHRlcm4gY2hhciAqcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBQQVJBTVMgKChjaGFyICopKTsKLQotLyogR2V0IHRoZSBzeW1ib2wgY2xhc3MgZnJvbSB0aGUgbmFtZS4gICovCi0jZGVmaW5lIHRjX3N5bWJvbF9uZXdfaG9vayhzeW0pIHBwY19zeW1ib2xfbmV3X2hvb2sgKHN5bSkKLWV4dGVybiB2b2lkIHBwY19zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIFNldCB0aGUgc3ltYm9sIGNsYXNzIG9mIGEgbGFiZWwgYmFzZWQgb24gdGhlIGNzZWN0LiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIHBwY19mcm9iX2xhYmVsIChzeW0pCi1leHRlcm4gdm9pZCBwcGNfZnJvYl9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogVE9DIHJlbG9jcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoZml4cCkgcHBjX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQotZXh0ZXJuIGludCBwcGNfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIEEgcmVsb2NhdGlvbiBmcm9tIG9uZSBjc2VjdCB0byBhbm90aGVyIG11c3QgYmUga2VwdC4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgcHBjX2ZvcmNlX3JlbG9jYXRpb24gKEZJWFApCi1leHRlcm4gaW50IHBwY19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBXZSBuZWVkIHRvIHNldCB0aGUgc2VjdGlvbiBWTUEuICAqLwotI2RlZmluZSB0Y19mcm9iX3NlY3Rpb24oc2VjKSBwcGNfZnJvYl9zZWN0aW9uIChzZWMpCi1leHRlcm4gdm9pZCBwcGNfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLQotLyogRmluaXNoIHVwIHRoZSBzeW1ib2wuICAqLwotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0sIHB1bnQpIHB1bnQgPSBwcGNfZnJvYl9zeW1ib2wgKHN5bSkKLWV4dGVybiBpbnQgcHBjX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBGaW5pc2ggdXAgdGhlIGVudGlyZSBzeW10YWIuICAqLwotI2RlZmluZSB0Y19hZGp1c3Rfc3ltdGFiKCkgcHBjX2FkanVzdF9zeW10YWIgKCkKLWV4dGVybiB2b2lkIHBwY19hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogTmljbGFzIEFuZGVyc3NvbiA8bmljYW5AaWRhLmxpdS5zZT4gc2F5cyB0aGlzIGlzIG5lZWRlZC4gICovCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIEJyYW5jaCBwcmVkaWN0aW9uIHJlbG9jYXRpb25zIG11c3QgZm9yY2UgcmVsb2NhdGlvbiwgYXMgbXVzdAotICAgdGhlIHZ0YWJsZSBkZXNjcmlwdGlvbiByZWxvY3MuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApCQkJCQlcCi0oKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTgkJCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4JCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4JCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAkJCVwKLSB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTihGSVhQLFNFQykJCQkJXAotKFRDX0ZPUkNFX1JFTE9DQVRJT04gKEZJWFApCQkJCQkJXAotIHx8ICgoRklYUCktPmZ4X2FkZHN5ICYmICEoRklYUCktPmZ4X3N1YnN5CQkJCVwKLSAgICAgJiYgU19HRVRfU0VHTUVOVCAoKEZJWFApLT5meF9hZGRzeSkgIT0gU0VDKSkKLQotLyogU3VwcG9ydCBmb3IgU0hGX0VYQ0xVREUgYW5kIFNIVF9PUkRFUkVEICovCi1leHRlcm4gaW50IHBwY19zZWN0aW9uX2xldHRlciBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLWV4dGVybiBpbnQgcHBjX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjaGFyICosIHNpemVfdCkpOwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl93b3JkIFBBUkFNUyAoKGNoYXIgKiwgc2l6ZV90KSk7Ci1leHRlcm4gaW50IHBwY19zZWN0aW9uX2ZsYWdzIFBBUkFNUyAoKGludCwgaW50LCBpbnQpKTsKLQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIoTEVUVEVSLCBQVFJfTVNHKQlwcGNfc2VjdGlvbl9sZXR0ZXIgKExFVFRFUiwgUFRSX01TRykKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fdHlwZShTVFIsIExFTikJCXBwY19zZWN0aW9uX3R5cGUgKFNUUiwgTEVOKQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl93b3JkKFNUUiwgTEVOKQkJcHBjX3NlY3Rpb25fd29yZCAoU1RSLCBMRU4pCi0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2ZsYWdzKEZMQUdTLCBBVFRSLCBUWVBFKQlwcGNfc2VjdGlvbl9mbGFncyAoRkxBR1MsIEFUVFIsIFRZUEUpCi0KLS8qIEFkZCBleHRyYSBQUEMgc2VjdGlvbnMgLS0gTm90ZSwgZm9yIG5vdywgbWFrZSAuc2JzczIgYW5kIC5QUEMuRU1CLnNic3MwIGEKLSAgIG5vcm1hbCBzZWN0aW9uLCBhbmQgbm90IGEgYnNzIHNlY3Rpb24gc28gdGhhdCB0aGUgbGlua2VyIGRvZXNuJ3QgY3JhdGVyCi0gICB3aGVuIHRyeWluZyB0byBtYWtlIG1vcmUgdGhhbiAyIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIudGFncyIsCQlTSFRfT1JERVJFRCwJU0hGX0FMTE9DIH0sIFwKLSAgeyAiLnNkYXRhIiwJCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLSAgeyAiLnNic3MiLAkJU0hUX05PQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLSAgeyAiLnNkYXRhMiIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5zYnNzMiIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5QUEMuRU1CLnNkYXRhMCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DIH0sIFwKLSAgeyAiLlBQQy5FTUIuc2JzczAiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LAotCi0jZGVmaW5lIHRjX2NvbW1lbnRfY2hhcnMgcHBjX2NvbW1lbnRfY2hhcnMKLWV4dGVybiBjb25zdCBjaGFyICpwcGNfY29tbWVudF9jaGFyczsKLQotLyogS2VlcCByZWxvY2F0aW9ucyByZWxhdGl2ZSB0byB0aGUgR09ULCBvciBub24tUEMgcmVsYXRpdmUuICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgIAkJXAotICAoKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMTZfR09UT0ZGICAgICAgICAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0xPMTZfR09UT0ZGICAgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0dPVE9GRiAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0dQUkVMMTYgICAgICAgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQkJCVwKLSAgICYmICEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCQkJXAotICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICgoRklYKS0+ZnhfcGNyZWwJCQkJICAgICAgICAJCVwKLSAgICAgICB8fCAoKEZJWCktPmZ4X3N1YnN5ICE9IE5VTEwJCQkJCVwKLQkgICAmJiAoU19HRVRfU0VHTUVOVCAoKEZJWCktPmZ4X3N1YnN5KQkJCQlcCi0JICAgICAgID09IFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9hZGRzeSkpKQkJCVwKLSAgICAgICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKChGSVgpLT5meF9hZGRzeSksICdcMDAxJykgIT0gTlVMTAkJXAotICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAoKEZJWCktPmZ4X2FkZHN5KSwgJ1wwMDInKSAhPSBOVUxMKSkKLQotLyogV2UgbXVzdCBuZXZlciBldmVyIHRyeSB0byByZXNvbHZlIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWxseSB2aXNpYmxlCi0gICBzeW1ib2xzIGluIHRoZSBhc3NlbWJsZXIsIGJlY2F1c2UgdGhlIC5vIGZpbGUgbWlnaHQgZ28gaW50byBhIHNoYXJlZAotICAgbGlicmFyeSwgYW5kIHNvbWUgb3RoZXIgc2hhcmVkIGxpYnJhcnkgbWlnaHQgb3ZlcnJpZGUgdGhhdCBzeW1ib2wuICAqLwotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAotICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLS8qIGNhbGwgbWRfYXBwbHlfZml4MyB3aXRoIHNlZ21lbnQgaW5zdGVhZCBvZiBtZF9hcHBseV9maXggKi8KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykKLWV4dGVybiBsb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLQotI2RlZmluZSBtZF9wYXJzZV9uYW1lKG5hbWUsIGV4cCkgcHBjX3BhcnNlX25hbWUgKG5hbWUsIGV4cCkKLWV4dGVybiBpbnQgcHBjX3BhcnNlX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zaC5jIGIvZ2FzL2NvbmZpZy90Yy1zaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUyZDAzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc2guYworKysgL2Rldi9udWxsCkBAIC0xLDI0MjYgKzAsMCBAQAotLyogdGMtc2guYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgSGl0YWNoaSBTdXBlci1ICi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gICBXcml0dGVuIEJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICBzYWNAY3lnbnVzLmNvbQotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlICJvcGNvZGVzL3NoLW9wYy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiISMiOwotCi1zdGF0aWMgdm9pZCBzX3VzZXMgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIHNoX2NvdW50X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgc2VnVCwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBzaF9mcm9iX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAqLwotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfYWxpZ25fYnl0ZXMgKCk7Ci1zdGF0aWMgdm9pZCBzX3VhY29ucyBQQVJBTVMgKChpbnQpKTsKLQotaW50IHNobCA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1saXR0bGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc2hsID0gMTsKLSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDR9LAotICB7IndvcmQiLCBjb25zLCAyfSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsibGl0dGxlIiwgbGl0dGxlLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7InVzZXMiLCBzX3VzZXMsIDB9LAotICB7InVhd29yZCIsIHNfdWFjb25zLCAyfSwKLSAgeyJ1YWxvbmciLCBzX3VhY29ucywgNH0sCi0gIHswLCAwLCAwfQotfTsKLQotLyppbnQgbWRfcmVsb2Nfc2l6ZTsgKi8KLQotaW50IHNoX3JlbGF4OwkJLyogc2V0IGlmIC1yZWxheCBzZWVuICovCi0KLS8qIFdoZXRoZXIgLXNtYWxsIHdhcyBzZWVuLiAgKi8KLQotaW50IHNoX3NtYWxsOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotCi0jZGVmaW5lIEpSRUcgMTQJCQkvKiBSZWdpc3RlciB1c2VkIGFzIGEgdGVtcCB3aGVuIHJlbGF4aW5nICovCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgNCkgKyAobGVuZ3RoKSkKLSNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj40KSkKLQotLyogVGhlc2UgYXJlIHRoZSB0aHJlZSB0eXBlcyBvZiByZWxheGFibGUgaW5zdHJjdGlvbiAqLwotI2RlZmluZSBDT05EX0pVTVAgMQotI2RlZmluZSBDT05EX0pVTVBfREVMQVkgMgotI2RlZmluZSBVTkNPTkRfSlVNUCAgMwotI2RlZmluZSBFTkQgNAotCi0jZGVmaW5lIFVOREVGX0RJU1AgMAotI2RlZmluZSBDT05EOCAgMQotI2RlZmluZSBDT05EMTIgMgotI2RlZmluZSBDT05EMzIgMwotI2RlZmluZSBVTkNPTkQxMiAxCi0jZGVmaW5lIFVOQ09ORDMyIDIKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDQKLQotI2RlZmluZSBVTkNPTkQxMiAxCi0jZGVmaW5lIFVOQ09ORDMyIDIKLQotLyogQnJhbmNoIGRpc3BsYWNlbWVudHMgYXJlIGZyb20gdGhlIGFkZHJlc3Mgb2YgdGhlIGJyYW5jaCBwbHVzCi0gICBmb3VyLCB0aHVzIGFsbCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBoYXZlIDQgYWRkZWQgdG8gdGhlbS4gICovCi0jZGVmaW5lIENPTkQ4X0YgMjU4Ci0jZGVmaW5lIENPTkQ4X00gLTI1MgotI2RlZmluZSBDT05EOF9MRU5HVEggMgotCi0vKiBUaGVyZSBpcyBvbmUgZXh0cmEgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBicmFuY2gsIHNvIHdlIG11c3QgYWRkCi0gICB0d28gbW9yZSBieXRlcyB0byBhY2NvdW50IGZvciBpdC4gICovCi0jZGVmaW5lIENPTkQxMl9GIDQxMDAKLSNkZWZpbmUgQ09ORDEyX00gLTQwOTAKLSNkZWZpbmUgQ09ORDEyX0xFTkdUSCA2Ci0KLSNkZWZpbmUgQ09ORDEyX0RFTEFZX0xFTkdUSCA0Ci0KLS8qID8/PyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIHdyb25nLCBidXQgdGhpcyBkb2VzIG5vdCBtYXR0ZXIKLSAgIHNpbmNlIHRoaXMgcmVsb2NhdGlvbiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgKi8KLSNkZWZpbmUgQ09ORDMyX0YgKDE8PDMwKQotI2RlZmluZSBDT05EMzJfTSAtKDE8PDMwKQotI2RlZmluZSBDT05EMzJfTEVOR1RIIDE0Ci0KLSNkZWZpbmUgVU5DT05EMTJfRiA0MDk4Ci0jZGVmaW5lIFVOQ09ORDEyX00gLTQwOTIKLSNkZWZpbmUgVU5DT05EMTJfTEVOR1RIIDIKLQotLyogPz8/IFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhcmUgd3JvbmcsIGJ1dCB0aGlzIGRvZXMgbm90IG1hdHRlcgotICAgc2luY2UgdGhpcyByZWxvY2F0aW9uIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICAqLwotI2RlZmluZSBVTkNPTkQzMl9GICgxPDwzMCkKLSNkZWZpbmUgVU5DT05EMzJfTSAtKDE8PDMwKQotI2RlZmluZSBVTkNPTkQzMl9MRU5HVEggMTQKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbQyAoRU5ELCAwKV0gPSB7Ci0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotCi0gIHsgMCB9LAotICAvKiBDIChDT05EX0pVTVAsIENPTkQ4KSAqLwotICB7IENPTkQ4X0YsIENPTkQ4X00sIENPTkQ4X0xFTkdUSCwgQyAoQ09ORF9KVU1QLCBDT05EMTIpIH0sCi0gIC8qIEMgKENPTkRfSlVNUCwgQ09ORDEyKSAqLwotICB7IENPTkQxMl9GLCBDT05EMTJfTSwgQ09ORDEyX0xFTkdUSCwgQyAoQ09ORF9KVU1QLCBDT05EMzIpLCB9LAotICAvKiBDIChDT05EX0pVTVAsIENPTkQzMikgKi8KLSAgeyBDT05EMzJfRiwgQ09ORDMyX00sIENPTkQzMl9MRU5HVEgsIDAsIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0KLSAgeyAwIH0sCi0gIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDgpICovCi0gIHsgQ09ORDhfRiwgQ09ORDhfTSwgQ09ORDhfTEVOR1RILCBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMikgfSwKLSAgLyogQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpICovCi0gIHsgQ09ORDEyX0YsIENPTkQxMl9NLCBDT05EMTJfREVMQVlfTEVOR1RILCBDIChDT05EX0pVTVBfREVMQVksIENPTkQzMiksIH0sCi0gIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDMyKSAqLwotICB7IENPTkQzMl9GLCBDT05EMzJfTSwgQ09ORDMyX0xFTkdUSCwgMCwgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLQotICB7IDAgfSwKLSAgLyogQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKSAqLwotICB7IFVOQ09ORDEyX0YsIFVOQ09ORDEyX00sIFVOQ09ORDEyX0xFTkdUSCwgQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKSwgfSwKLSAgLyogQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKSAqLwotICB7IFVOQ09ORDMyX0YsIFVOQ09ORDMyX00sIFVOQ09ORDMyX0xFTkdUSCwgMCwgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKLSAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLQotICBpZiAoISBzaGwpCi0gICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IHNoX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQl7Ci0JICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBNYWtlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHN0cmluZyAqLwotCSAgb3Bjb2RlLT5uYW1lID0gcHJldl9uYW1lOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX207Ci1zdGF0aWMgaW50IHJlZ19uOwotc3RhdGljIGludCByZWdfYjsKLQotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc2hfYXJnX3R5cGUgdHlwZTsKLSAgICBpbnQgcmVnOwotICB9Ci0KLXNoX29wZXJhbmRfaW5mbzsKLQotLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLwotc3RhdGljIGludAotcGFyc2VfcmVnIChzcmMsIG1vZGUsIHJlZykKLSAgICAgY2hhciAqc3JjOwotICAgICBpbnQgKm1vZGU7Ci0gICAgIGludCAqcmVnOwotewotICAvKiBXZSB1c2UgIWlzYWxudW0gZm9yIHRoZSBuZXh0IGNoYXJhY3RlciBhZnRlciB0aGUgcmVnaXN0ZXIgbmFtZSwgdG8KLSAgICAgbWFrZSBzdXJlIHRoYXQgd2Ugd29uJ3QgYWNjaWRlbnRhbGx5IHJlY29nbml6ZSBhIHN5bWJvbCBuYW1lIHN1Y2ggYXMKLSAgICAgJ3NyYW0nIGFzIGJlaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZWdpc3RlciAnc3InLiAgKi8KLQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnICYmIHN0cm5jbXAoJnNyY1syXSwgIl9iYW5rIiwgNSkgPT0gMAotCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzddKSkKLQl7Ci0JICAqbW9kZSA9IEFfUkVHX0I7Ci0JICAqcmVnICA9IChzcmNbMV0gLSAnMCcpOwotCSAgcmV0dXJuIDc7Ci0JfQotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID09ICcxJykKLQl7Ci0JICBpZiAoc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzUnCi0JICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gQV9SRUdfTjsKLQkgICAgICAqcmVnID0gMTAgKyBzcmNbMl0gLSAnMCc7Ci0JICAgICAgcmV0dXJuIDM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzknCi0JICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotCXsKLQkgICptb2RlID0gQV9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzFdIC0gJzAnKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncycKLSAgICAgICYmIHNyY1sxXSA9PSAncycKLSAgICAgICYmIHNyY1syXSA9PSAncicgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfU1NSOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcgJiYgc3JjWzJdID09ICdjJwotICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfU1BDOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAnZycgJiYgc3JjWzJdID09ICdyJwotICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfU0dSOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ2QnICYmIHNyY1sxXSA9PSAnYicgJiYgc3JjWzJdID09ICdyJwotICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfREJSOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncicgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfU1I7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncycgJiYgc3JjWzFdID09ICdwJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9SRUdfTjsKLSAgICAgICpyZWcgPSAxNTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdwJyAmJiBzcmNbMV0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1BSOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdwJyAmJiBzcmNbMV0gPT0gJ2MnICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0RJU1BfUEM7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2cnICYmIHNyY1sxXSA9PSAnYicgJiYgc3JjWzJdID09ICdyJwotICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfR0JSOwotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICd2JyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1ZCUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdtJyAmJiBzcmNbMV0gPT0gJ2EnICYmIHNyY1syXSA9PSAnYycKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0gICAgewotICAgICAgaWYgKHNyY1szXSA9PSAnbCcpCi0JewotCSAgKm1vZGUgPSBBX01BQ0w7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgICBpZiAoc3JjWzNdID09ICdoJykKLQl7Ci0JICAqbW9kZSA9IEFfTUFDSDsKLQkgIHJldHVybiA0OwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1syXSA9PSAnMScpCi0JewotCSAgaWYgKHNyY1szXSA+PSAnMCcgJiYgc3JjWzNdIDw9ICc1JwotCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IEZfUkVHX047Ci0JICAgICAgKnJlZyA9IDEwICsgc3JjWzNdIC0gJzAnOwotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc5JwotCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQl7Ci0JICAqbW9kZSA9IEZfUkVHX047Ci0JICAqcmVnID0gKHNyY1syXSAtICcwJyk7Ci0JICByZXR1cm4gMzsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMl0gPT0gJzEnKQotCXsKLQkgIGlmIChzcmNbM10gPj0gJzAnICYmIHNyY1szXSA8PSAnNCcgJiYgISAoKHNyY1szXSAtICcwJykgJiAxKQotCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IERfUkVHX047Ci0JICAgICAgKnJlZyA9IDEwICsgc3JjWzNdIC0gJzAnOwotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc4JyAmJiAhICgoc3JjWzJdIC0gJzAnKSAmIDEpCi0JICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotCXsKLQkgICptb2RlID0gRF9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKTsKLQkgIHJldHVybiAzOwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ3gnICYmIHNyY1sxXSA9PSAnZCcpCi0gICAgewotICAgICAgaWYgKHNyY1syXSA9PSAnMScpCi0JewotCSAgaWYgKHNyY1szXSA+PSAnMCcgJiYgc3JjWzNdIDw9ICc0JyAmJiAhICgoc3JjWzNdIC0gJzAnKSAmIDEpCi0JICAgICAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzRdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gWF9SRUdfTjsKLQkgICAgICAqcmVnID0gMTEgKyBzcmNbM10gLSAnMCc7Ci0JICAgICAgcmV0dXJuIDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzgnICYmICEgKChzcmNbMl0gLSAnMCcpICYgMSkKLQkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JewotCSAgKm1vZGUgPSBYX1JFR19OOwotCSAgKnJlZyA9IChzcmNbMl0gLSAnMCcpICsgMTsKLQkgIHJldHVybiAzOwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAndicpCi0gICAgewotICAgICAgaWYgKHNyY1syXSA9PSAnMScmJiBzcmNbM10gPT0gJzInICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0JewotCSAgKm1vZGUgPSBWX1JFR19OOwotCSAgKnJlZyA9IDEyOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgICAgaWYgKChzcmNbMl0gPT0gJzAnIHx8IHNyY1syXSA9PSAnNCcgfHwgc3JjWzJdID09ICc4JykKLQkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JewotCSAgKm1vZGUgPSBWX1JFR19OOwotCSAgKnJlZyA9IChzcmNbMl0gLSAnMCcpOwotCSAgcmV0dXJuIDM7Ci0JfQotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJyAmJiBzcmNbMl0gPT0gJ3UnICYmIHNyY1szXSA9PSAnbCcKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0gICAgewotICAgICAgKm1vZGUgPSBGUFVMX047Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJyAmJiBzcmNbMl0gPT0gJ3MnICYmIHNyY1szXSA9PSAnYycKLSAgICAgICYmIHNyY1s0XSA9PSAncicgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzVdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEZQU0NSX047Ci0gICAgICByZXR1cm4gNTsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAneCcgJiYgc3JjWzFdID09ICdtJyAmJiBzcmNbMl0gPT0gJ3QnICYmIHNyY1szXSA9PSAncicKLSAgICAgICYmIHNyY1s0XSA9PSAneCcgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzVdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IFhNVFJYX000OwotICAgICAgcmV0dXJuIDU7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgc3ltYm9sUyAqZG90KCkKLXsKLSAgY29uc3QgY2hhciAqZmFrZTsKLQotICAvKiBKRjogJy4nIGlzIHBzZXVkbyBzeW1ib2wgd2l0aCB2YWx1ZSBvZiBjdXJyZW50IGxvY2F0aW9uCi0gICAgIGluIGN1cnJlbnQgc2VnbWVudC4gICovCi0gIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0gIHJldHVybiAgc3ltYm9sX25ldyAoZmFrZSwKLQkJICAgICAgbm93X3NlZywKLQkJICAgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkgICAgICBmcmFnX25vdyk7Ci0KLX0KLQotCi1zdGF0aWMKLWNoYXIgKgotcGFyc2VfZXhwIChzKQotICAgICBjaGFyICpzOwotewotICBjaGFyICpzYXZlOwotICBjaGFyICpuZXc7Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgZXhwcmVzc2lvbiAoJmltbWVkaWF0ZSk7Ci0gIGlmIChpbW1lZGlhdGUuWF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi0KLS8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6Ci0KLSAgIFJuICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGRpcmVjdAotICAgQFJuICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgaW5kaXJlY3QKLSAgIEBSbisgICAgICAgICAgICAgICAgIEF1dG9pbmNyZW1lbnQKLSAgIEAtUm4gICAgICAgICAgICAgICAgIEF1dG9kZWNyZW1lbnQKLSAgIEAoZGlzcDo0LFJuKQotICAgQChkaXNwOjgsR0JSKQotICAgQChkaXNwOjgsUEMpCi0KLSAgIEAoUjAsUm4pCi0gICBAKFIwLEdCUikKLQotICAgZGlzcDo4Ci0gICBkaXNwOjEyCi0gICAjaW1tOAotICAgcHIsIGdiciwgdmJyLCBtYWNsLCBtYWNoCi0KLSAqLwotCi1zdGF0aWMKLWNoYXIgKgotcGFyc2VfYXQgKHNyYywgb3ApCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgc2hfb3BlcmFuZF9pbmZvICpvcDsKLXsKLSAgaW50IGxlbjsKLSAgaW50IG1vZGU7Ci0gIHNyYysrOwotICBpZiAoc3JjWzBdID09ICctJykKLSAgICB7Ci0gICAgICAvKiBNdXN0IGJlIHByZWRlY3JlbWVudCAqLwotICAgICAgc3JjKys7Ci0KLSAgICAgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJihvcC0+cmVnKSk7Ci0gICAgICBpZiAobW9kZSAhPSBBX1JFR19OKQotCWFzX2JhZCAoXygiaWxsZWdhbCByZWdpc3RlciBhZnRlciBALSIpKTsKLQotICAgICAgb3AtPnR5cGUgPSBBX0RFQ19OOwotICAgICAgc3JjICs9IGxlbjsKLSAgICB9Ci0gIGVsc2UgaWYgKHNyY1swXSA9PSAnKCcpCi0gICAgewotICAgICAgLyogQ291bGQgYmUgQChkaXNwLCBybiksIEAoZGlzcCwgZ2JyKSwgQChkaXNwLCBwYyksICBAKHIwLCBnYnIpIG9yCi0gICAgICAgICBAKHIwLCBybikgKi8KLSAgICAgIHNyYysrOwotICAgICAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLSAgICAgIGlmIChsZW4gJiYgbW9kZSA9PSBBX1JFR19OKQotCXsKLQkgIHNyYyArPSBsZW47Ci0JICBpZiAob3AtPnJlZyAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJtdXN0IGJlIEAocjAsLi4uKSIpKTsKLQkgICAgfQotCSAgaWYgKHNyY1swXSA9PSAnLCcpCi0JICAgIHNyYysrOwotCSAgLyogTm93IGNhbiBiZSBybiBvciBnYnIgKi8KLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJihvcC0+cmVnKSk7Ci0JICBpZiAobW9kZSA9PSBBX0dCUikKLQkgICAgewotCSAgICAgIG9wLT50eXBlID0gQV9SMF9HQlI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG1vZGUgPT0gQV9SRUdfTikKLQkgICAgewotCSAgICAgIG9wLT50eXBlID0gQV9JTkRfUjBfUkVHX047Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIEAocjAsLi4uKSIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBNdXN0IGJlIGFuIEAoZGlzcCwuLiB0aGluZykgKi8KLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjKTsKLQkgIGlmIChzcmNbMF0gPT0gJywnKQotCSAgICBzcmMrKzsKLQkgIC8qIE5vdyBjYW4gYmUgcm4sIGdiciBvciBwYyAqLwotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmb3AtPnJlZyk7Ci0JICBpZiAobGVuKQotCSAgICB7Ci0JICAgICAgaWYgKG1vZGUgPT0gQV9SRUdfTikKLQkJewotCQkgIG9wLT50eXBlID0gQV9ESVNQX1JFR19OOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobW9kZSA9PSBBX0dCUikKLQkJewotCQkgIG9wLT50eXBlID0gQV9ESVNQX0dCUjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG1vZGUgPT0gQV9ESVNQX1BDKQotCQl7Ci0JCSAgLyogVHVybiBhIHBsYWluIEAoNCxwYykgaW50byBAKC4rNCxwYykgKi8KLQkJICBpZiAoaW1tZWRpYXRlLlhfb3AgPT0gT19jb25zdGFudCkgeyAKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9zeW1ib2wgPSBkb3QoKTsKLQkJICAgIGltbWVkaWF0ZS5YX29wID0gT19zeW1ib2w7Ci0JCSAgfQotCQkgIG9wLT50eXBlID0gQV9ESVNQX1BDOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gQChkaXNwLFtSbiwgZ2JyLCBwY10pIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIEAoZGlzcCxbUm4sIGdiciwgcGNdKSIpKTsKLQkgICAgfQotCX0KLSAgICAgIHNyYyArPSBsZW47Ci0gICAgICBpZiAoc3JjWzBdICE9ICcpJykKLQlhc19iYWQgKF8oImV4cGVjdGluZyApIikpOwotICAgICAgZWxzZQotCXNyYysrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNyYyArPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotICAgICAgaWYgKG1vZGUgIT0gQV9SRUdfTikKLQl7Ci0JICBhc19iYWQgKF8oImlsbGVnYWwgcmVnaXN0ZXIgYWZ0ZXIgQCIpKTsKLQl9Ci0gICAgICBpZiAoc3JjWzBdID09ICcrJykKLQl7Ci0JICBvcC0+dHlwZSA9IEFfSU5DX047Ci0JICBzcmMrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3AtPnR5cGUgPSBBX0lORF9OOwotCX0KLSAgICB9Ci0gIHJldHVybiBzcmM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZCAocHRyLCBvcCkKLSAgICAgY2hhciAqKnB0cjsKLSAgICAgc2hfb3BlcmFuZF9pbmZvICpvcDsKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IG1vZGUgPSAtMTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBpZiAoc3JjWzBdID09ICcjJykKLSAgICB7Ci0gICAgICBzcmMrKzsKLSAgICAgICpwdHIgPSBwYXJzZV9leHAgKHNyYyk7Ci0gICAgICBvcC0+dHlwZSA9IEFfSU1NOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbHNlIGlmIChzcmNbMF0gPT0gJ0AnKQotICAgIHsKLSAgICAgICpwdHIgPSBwYXJzZV9hdCAoc3JjLCBvcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotICBpZiAobGVuKQotICAgIHsKLSAgICAgICpwdHIgPSBzcmMgKyBsZW47Ci0gICAgICBvcC0+dHlwZSA9IG1vZGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTm90IGEgcmVnLCB0aGUgb25seSB0aGluZyBsZWZ0IGlzIGEgZGlzcGxhY2VtZW50ICovCi0gICAgICAqcHRyID0gcGFyc2VfZXhwIChzcmMpOwotICAgICAgb3AtPnR5cGUgPSBBX0RJU1BfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotCi1zdGF0aWMKLWNoYXIgKgotZ2V0X29wZXJhbmRzIChpbmZvLCBhcmdzLCBvcGVyYW5kKQotICAgICBzaF9vcGNvZGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYXJnczsKLSAgICAgc2hfb3BlcmFuZF9pbmZvICpvcGVyYW5kOwotCi17Ci0gIGNoYXIgKnB0ciA9IGFyZ3M7Ci0gIGlmIChpbmZvLT5hcmdbMF0pCi0gICAgewotICAgICAgcHRyKys7Ci0KLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCk7Ci0gICAgICBpZiAoaW5mby0+YXJnWzFdKQotCXsKLQkgIGlmICgqcHRyID09ICcsJykKLQkgICAgewotCSAgICAgIHB0cisrOwotCSAgICB9Ci0JICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEpOwotCSAgaWYgKGluZm8tPmFyZ1syXSkKLQkgICAgewotCSAgICAgIGlmICgqcHRyID09ICcsJykKLQkJewotCQkgIHB0cisrOwotCQl9Ci0JICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAyKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZFsyXS50eXBlID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcGVyYW5kWzFdLnR5cGUgPSAwOwotCSAgb3BlcmFuZFsyXS50eXBlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb3BlcmFuZFswXS50eXBlID0gMDsKLSAgICAgIG9wZXJhbmRbMV0udHlwZSA9IDA7Ci0gICAgICBvcGVyYW5kWzJdLnR5cGUgPSAwOwotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogUGFzc2VkIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygb3Bjb2RlcyB3aGljaCB1c2UgZGlmZmVyZW50Ci0gICBhZGRyZXNzaW5nIG1vZGVzLCByZXR1cm4gdGhlIG9wY29kZSB3aGljaCBtYXRjaGVzIHRoZSBvcGNvZGVzCi0gICBwcm92aWRlZAotICovCi0KLXN0YXRpYwotc2hfb3Bjb2RlX2luZm8gKgotZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmRzKQotICAgICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBzaF9vcGVyYW5kX2luZm8gKm9wZXJhbmRzOwotewotICBzaF9vcGNvZGVfaW5mbyAqdGhpc190cnkgPSBvcGNvZGU7Ci0gIGNoYXIgKm5hbWUgPSBvcGNvZGUtPm5hbWU7Ci0gIGludCBuID0gMDsKLSAgd2hpbGUgKG9wY29kZS0+bmFtZSkKLSAgICB7Ci0gICAgICB0aGlzX3RyeSA9IG9wY29kZSsrOwotICAgICAgaWYgKHRoaXNfdHJ5LT5uYW1lICE9IG5hbWUpCi0JewotCSAgLyogV2UndmUgbG9va2VkIHNvIGZhciBkb3duIHRoZSB0YWJsZSB0aGF0IHdlJ3ZlIHJ1biBvdXQgb2YKLQkgICAgIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lICovCi0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAvKiBsb29rIGF0IGJvdGggb3BlcmFuZHMgbmVlZGVkIGJ5IHRoZSBvcGNvZGVzIGFuZCBwcm92aWRlZCBieQotICAgICAgICAgdGhlIHVzZXIgLSBzaW5jZSBhbiBhcmcgdGVzdCB3aWxsIG9mdGVuIGZhaWwgb24gdGhlIHNhbWUgYXJnCi0gICAgICAgICBhZ2FpbiBhbmQgYWdhaW4sIHdlJ2xsIHRyeSBhbmQgdGVzdCB0aGUgbGFzdCBmYWlsaW5nIGFyZyB0aGUKLSAgICAgICAgIGZpcnN0IG9uIGVhY2ggb3Bjb2RlIHRyeSAqLwotCi0gICAgICBmb3IgKG4gPSAwOyB0aGlzX3RyeS0+YXJnW25dOyBuKyspCi0JewotCSAgc2hfb3BlcmFuZF9pbmZvICp1c2VyID0gb3BlcmFuZHMgKyBuOwotCSAgc2hfYXJnX3R5cGUgYXJnID0gdGhpc190cnktPmFyZ1tuXTsKLQkgIHN3aXRjaCAoYXJnKQotCSAgICB7Ci0JICAgIGNhc2UgQV9JTU06Ci0JICAgIGNhc2UgQV9CRElTUDEyOgotCSAgICBjYXNlIEFfQkRJU1A4OgotCSAgICBjYXNlIEFfRElTUF9HQlI6Ci0JICAgIGNhc2UgQV9ESVNQX1BDOgotCSAgICBjYXNlIEFfTUFDSDoKLQkgICAgY2FzZSBBX1BSOgotCSAgICBjYXNlIEFfTUFDTDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcpCi0JCWdvdG8gZmFpbDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwOgotCSAgICAgIC8qIG9wY29kZSBuZWVkcyByMCAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IEFfUkVHX04gfHwgdXNlci0+cmVnICE9IDApCi0JCWdvdG8gZmFpbDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwX0dCUjoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBBX1IwX0dCUiB8fCB1c2VyLT5yZWcgIT0gMCkKLQkJZ290byBmYWlsOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZfRlIwOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IEZfUkVHX04gfHwgdXNlci0+cmVnICE9IDApCi0JCWdvdG8gZmFpbDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFfUkVHX046Ci0JICAgIGNhc2UgQV9JTkNfTjoKLQkgICAgY2FzZSBBX0RFQ19OOgotCSAgICBjYXNlIEFfSU5EX046Ci0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX046Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19OOgotCSAgICBjYXNlIEZfUkVHX046Ci0JICAgIGNhc2UgRF9SRUdfTjoKLQkgICAgY2FzZSBYX1JFR19OOgotCSAgICBjYXNlIFZfUkVHX046Ci0JICAgIGNhc2UgRlBVTF9OOgotCSAgICBjYXNlIEZQU0NSX046Ci0JICAgICAgLyogT3Bjb2RlIG5lZWRzIHJuICovCi0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX24gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRkRfUkVHX046Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRl9SRUdfTiAmJiB1c2VyLT50eXBlICE9IERfUkVHX04pCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbiA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEWF9SRUdfTjoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBEX1JFR19OICYmIHVzZXItPnR5cGUgIT0gWF9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19uID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfR0JSOgotCSAgICBjYXNlIEFfU1I6Ci0JICAgIGNhc2UgQV9WQlI6Ci0JICAgIGNhc2UgQV9TU1I6Ci0JICAgIGNhc2UgQV9TUEM6Ci0JICAgIGNhc2UgQV9TR1I6Ci0JICAgIGNhc2UgQV9EQlI6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQV9SRUdfQjoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcpCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfYiA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFfUkVHX006Ci0JICAgIGNhc2UgQV9JTkNfTToKLQkgICAgY2FzZSBBX0RFQ19NOgotCSAgICBjYXNlIEFfSU5EX006Ci0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX006Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19NOgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZyAtIEFfUkVHX00gKyBBX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX20gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBGX1JFR19NOgotCSAgICBjYXNlIERfUkVHX006Ci0JICAgIGNhc2UgWF9SRUdfTToKLQkgICAgY2FzZSBWX1JFR19NOgotCSAgICBjYXNlIEZQVUxfTToKLQkgICAgY2FzZSBGUFNDUl9NOgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZyAtIEZfUkVHX00gKyBGX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX20gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX006Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRF9SRUdfTiAmJiB1c2VyLT50eXBlICE9IFhfUkVHX04pCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbSA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBYTVRSWF9NNDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBYTVRSWF9NNCkKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19tID0gNDsKLQkgICAgICBicmVhazsKLQkKLQkgICAgZGVmYXVsdDoKLQkgICAgICBwcmludGYgKF8oInVuaGFuZGxlZCAlZFxuIiksIGFyZyk7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIHRoaXNfdHJ5OwotICAgIGZhaWw6OwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1jaGVjayAob3BlcmFuZCwgbG93LCBoaWdoKQotICAgICBleHByZXNzaW9uUyAqb3BlcmFuZDsKLSAgICAgaW50IGxvdzsKLSAgICAgaW50IGhpZ2g7Ci17Ci0gIGlmIChvcGVyYW5kLT5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA8IGxvdwotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyID4gaGlnaCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQiKSwgbG93LCBoaWdoKTsKLSAgICB9Ci0gIHJldHVybiBvcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWluc2VydCAod2hlcmUsIGhvdywgcGNyZWwpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBpbnQgaG93OwotICAgICBpbnQgcGNyZWw7Ci17Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkgICAgICAgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkgICAgICAgMiwKLQkgICAgICAgJmltbWVkaWF0ZSwKLQkgICAgICAgcGNyZWwsCi0JICAgICAgIGhvdyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idWlsZF9yZWxheCAob3Bjb2RlKQotICAgICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotewotICBpbnQgaGlnaF9ieXRlID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAwIDogMTsKLSAgY2hhciAqcDsKLQotICBpZiAob3Bjb2RlLT5hcmdbMF0gPT0gQV9CRElTUDgpCi0gICAgewotICAgICAgaW50IHdoYXQgPSAob3Bjb2RlLT5uaWJibGVzWzFdICYgNCkgPyBDT05EX0pVTVBfREVMQVkgOiBDT05EX0pVTVA7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkgICAgbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQ09ORDMyKV0ucmx4X2xlbmd0aCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQ4KV0ucmx4X2xlbmd0aCwKLQkJICAgIEMgKHdoYXQsIDApLAotCQkgICAgaW1tZWRpYXRlLlhfYWRkX3N5bWJvbCwKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCi0JCSAgICAwKTsKLSAgICAgIHBbaGlnaF9ieXRlXSA9IChvcGNvZGUtPm5pYmJsZXNbMF0gPDwgNCkgfCAob3Bjb2RlLT5uaWJibGVzWzFdKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1AxMikKLSAgICB7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkgICAgbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKV0ucmx4X2xlbmd0aCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMildLnJseF9sZW5ndGgsCi0JCSAgICBDIChVTkNPTkRfSlVNUCwgMCksCi0JCSAgICBpbW1lZGlhdGUuWF9hZGRfc3ltYm9sLAotCQkgICAgaW1tZWRpYXRlLlhfYWRkX251bWJlciwKLQkJICAgIDApOwotICAgICAgcFtoaWdoX2J5dGVdID0gKG9wY29kZS0+bmliYmxlc1swXSA8PCA0KTsKLSAgICB9Ci0KLX0KLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX015dGVzIChvcGNvZGUsIG9wZXJhbmQpCi0gICAgIHNoX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBpbnQgaW5kZXg7Ci0gIGNoYXIgbmJ1Zls0XTsKLSAgY2hhciAqb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgaW50IGxvd19ieXRlID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAxIDogMDsKLSAgbmJ1ZlswXSA9IDA7Ci0gIG5idWZbMV0gPSAwOwotICBuYnVmWzJdID0gMDsKLSAgbmJ1ZlszXSA9IDA7Ci0KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBzaF9uaWJibGVfdHlwZSBpID0gb3Bjb2RlLT5uaWJibGVzW2luZGV4XTsKLSAgICAgIGlmIChpIDwgMTYpCi0JewotCSAgbmJ1ZltpbmRleF0gPSBpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSBSRUdfTjoKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19uOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19NOgotCSAgICAgIG5idWZbaW5kZXhdID0gcmVnX207Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX05NOgotCSAgICAgIG5idWZbaW5kZXhdID0gcmVnX24gfCAocmVnX20gPj4gMik7Ci0JICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJFR19COgotCSAgICAgIG5idWZbaW5kZXhdID0gcmVnX2IgfCAweDA4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1BfNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzRCWTQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTRCWTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV80QlkyOgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU00QlkyLCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzhCWTQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTThCWTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV84QlkyOgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU04QlkyLCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fODoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NOCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZMjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmIChfKCJmYWlsZWQgZm9yICVkXG4iKSwgaSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikgewotICAgIG91dHB1dFsxXSA9IChuYnVmWzBdIDw8IDQpIHwgKG5idWZbMV0pOwotICAgIG91dHB1dFswXSA9IChuYnVmWzJdIDw8IDQpIHwgKG5idWZbM10pOwotICB9Ci0gIGVsc2UgewotICAgIG91dHB1dFswXSA9IChuYnVmWzBdIDw8IDQpIHwgKG5idWZbMV0pOwotICAgIG91dHB1dFsxXSA9IChuYnVmWzJdIDw8IDQpIHwgKG5idWZbM10pOwotICB9Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICB1bnNpZ25lZCBjaGFyICpvcF9zdGFydDsKLSAgdW5zaWduZWQgY2hhciAqb3BfZW5kOwotICBzaF9vcGVyYW5kX2luZm8gb3BlcmFuZFszXTsKLSAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgY2hhciBuYW1lWzIwXTsKLSAgaW50IG5sZW4gPSAwOwotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopIChzdHIpOwotICAgICAgICpvcF9lbmQKLSAgICAgICAmJiBubGVuIDwgMjAKLSAgICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBjID0gb3Bfc3RhcnRbbmxlbl07Ci0KLSAgICAgIC8qIFRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgd2lsbCBjb252ZXJ0IENNUC9FUSBpbnRvIGNtcC9FUQotCSBiZWNhdXNlIGl0IHRoaW5rcyB0aGUgJy8nIGlzIHRoZSBlbmQgb2YgdGhlIHN5bWJvbC4gIEluc3RlYWQgb2YKLQkgaGFja2luZyB1cCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlLCB3ZSBqdXN0IGRlYWwgd2l0aCBpdAotCSBoZXJlLiAgKi8KLSAgICAgIGMgPSBpc3VwcGVyIChjKSA/IHRvbG93ZXIgKGMpIDogYzsKLSAgICAgIG5hbWVbbmxlbl0gPSBjOwotICAgICAgbmxlbisrOwotICAgIH0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0KLSAgb3Bjb2RlID0gKHNoX29wY29kZV9pbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzaF9yZWxheAotICAgICAgJiYgISBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUpCi0gICAgewotICAgICAgLyogT3V0cHV0IGEgQ09ERSByZWxvYyB0byB0ZWxsIHRoZSBsaW5rZXIgdGhhdCB0aGUgZm9sbG93aW5nCi0gICAgICAgICBieXRlcyBhcmUgaW5zdHJ1Y3Rpb25zLCBub3QgZGF0YS4gICovCi0gICAgICBmaXhfbmV3IChmcmFnX25vdywgZnJhZ19ub3dfZml4ICgpLCAyLCAmYWJzX3N5bWJvbCwgMCwgMCwKLQkgICAgICAgQkZEX1JFTE9DX1NIX0NPREUpOwotICAgICAgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlID0gMTsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1AxMgotICAgICAgfHwgb3Bjb2RlLT5hcmdbMF0gPT0gQV9CRElTUDgpCi0gICAgewotICAgICAgcGFyc2VfZXhwIChvcF9lbmQgKyAxKTsKLSAgICAgIGJ1aWxkX3JlbGF4IChvcGNvZGUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcGNvZGUtPmFyZ1swXSAhPSBBX0VORCkKLQl7Ci0JICBnZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLCBvcGVyYW5kKTsKLQl9Ci0gICAgICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLSAgICAgIGlmIChvcGNvZGUgPT0gMCkKLQl7Ci0JICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLwotCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDIpOwotCi0JICB3aGVyZVswXSA9IDB4MDsKLQkgIHdoZXJlWzFdID0gMHgwOwotCSAgYXNfYmFkIChfKCJpbnZhbGlkIG9wZXJhbmRzIGZvciBvcGNvZGUiKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBidWlsZF9NeXRlcyAob3Bjb2RlLCBvcGVyYW5kKTsKLSAgICB9Ci0KLX0KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlYWNoIHRpbWUgYSBsYWJlbCBkZWZpbml0aW9uIGlzIHNlZW4uICBJdAotICAgZW1pdHMgYSBCRkRfUkVMT0NfU0hfTEFCRUwgcmVsb2MgaWYgbmVjZXNzYXJ5LiAgKi8KLQotdm9pZAotc2hfZnJvYl9sYWJlbCAoKQotewotICBzdGF0aWMgZnJhZ1MgKmxhc3RfbGFiZWxfZnJhZzsKLSAgc3RhdGljIGludCBsYXN0X2xhYmVsX29mZnNldDsKLQotICBpZiAoc2hfcmVsYXgKLSAgICAgICYmIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0OwotCi0gICAgICBvZmZzZXQgPSBmcmFnX25vd19maXggKCk7Ci0gICAgICBpZiAoZnJhZ19ub3cgIT0gbGFzdF9sYWJlbF9mcmFnCi0JICB8fCBvZmZzZXQgIT0gbGFzdF9sYWJlbF9vZmZzZXQpCi0JewkKLQkgIGZpeF9uZXcgKGZyYWdfbm93LCBvZmZzZXQsIDIsICZhYnNfc3ltYm9sLCAwLCAwLCBCRkRfUkVMT0NfU0hfTEFCRUwpOwotCSAgbGFzdF9sYWJlbF9mcmFnID0gZnJhZ19ub3c7Ci0JICBsYXN0X2xhYmVsX29mZnNldCA9IG9mZnNldDsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBpcyBhYm91dCB0byBvdXRwdXQgc29tZQotICAgZGF0YS4gIEl0IGVtaXRzIGEgQkZEX1JFTE9DX1NIX0RBVEEgcmVsb2MgaWYgbmVjZXNzYXJ5LiAgKi8KLQotdm9pZAotc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCkKLXsKLSAgaWYgKHNoX3JlbGF4Ci0gICAgICAmJiBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUpCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmFic19zeW1ib2wsIDAsIDAsCi0JICAgICAgIEJGRF9SRUxPQ19TSF9EQVRBKTsKLSAgICAgIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSA9IDA7Ci0gICAgfQotfQotCi1zeW1ib2xTICoKLURFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCi0gICAgICAgY2hhciAqbmFtZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBPQkpfQ09GRgotCi12b2lkCi1ERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi12b2lkCi1ERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0jZW5kaWYKLQotLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkgKi8KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogMjsKLQotICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBIYW5kbGUgdGhlIC51c2VzIHBzZXVkby1vcC4gIFRoaXMgcHNldWRvLW9wIGlzIHVzZWQganVzdCBiZWZvcmUgYQotICAgY2FsbCBpbnN0cnVjdGlvbi4gIEl0IHJlZmVycyB0byBhIGxhYmVsIG9mIHRoZSBpbnN0cnVjdGlvbiB3aGljaAotICAgbG9hZHMgdGhlIHJlZ2lzdGVyIHdoaWNoIHRoZSBjYWxsIHVzZXMuICBXZSB1c2UgaXQgdG8gZ2VuZXJhdGUgYQotICAgc3BlY2lhbCByZWxvYyBmb3IgdGhlIGxpbmtlci4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3VzZXMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0KLSAgaWYgKCEgc2hfcmVsYXgpCi0gICAgYXNfd2FybiAoXygiLnVzZXMgcHNldWRvLW9wIHNlZW4gd2hlbiBub3QgcmVsYXhpbmciKSk7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4KTsKLQotICBpZiAoZXguWF9vcCAhPSBPX3N5bWJvbCB8fCBleC5YX2FkZF9udW1iZXIgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCAudXNlcyBmb3JtYXQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmV4LCAxLCBCRkRfUkVMT0NfU0hfVVNFUyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotCi0jZGVmaW5lIE9QVElPTl9SRUxBWCAgKE9QVElPTl9NRF9CQVNFKQotI2RlZmluZSBPUFRJT05fTElUVExFIChPUFRJT05fTURfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TTUFMTCAoT1BUSU9OX0xJVFRMRSArIDEpCi0KLSAgeyJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVh9LAotICB7ImxpdHRsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFfSwKLSAgeyJzbWFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU01BTEx9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX1JFTEFYOgotICAgICAgc2hfcmVsYXggPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9MSVRUTEU6Ci0gICAgICBzaGwgPSAxOwotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TTUFMTDoKLSAgICAgIHNoX3NtYWxsID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1TSCBvcHRpb25zOlxuXAotLWxpdHRsZQkJCWdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gY29kZVxuXAotLXJlbGF4CQkJYWx0ZXIganVtcCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuXAotLXNtYWxsCQkJYWxpZ24gc2VjdGlvbnMgdG8gNCBieXRlIGJvdW5kYXJpZXMsIG5vdCAxNlxuIikpOwotfQotDAotdm9pZAotdGNfTm91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX05vdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGFyZ3VtZW50cyB0byBzaF9jb3VudF9yZWxvY3MgdGhyb3VnaAotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RydWN0IHNoX2NvdW50X3JlbG9jcwotewotICAvKiBTeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLSAgc3ltYm9sUyAqc3ltOwotICAvKiBDb3VudCBvZiByZWxvY3MgZm91bmQuICAqLwotICBpbnQgY291bnQ7Ci19OwotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIGZpeHVwcyBpbiBhIHNlY3Rpb24gd2hpY2ggcmVmZXIgdG8gYSBwYXJ0aWN1bGFyCi0gICBzeW1ib2wuICBXaGVuIHVzaW5nIEJGRF9BU1NFTUJMRVIsIHRoaXMgaXMgY2FsbGVkIHZpYQotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc2hfY291bnRfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzICppbmZvID0gKHN0cnVjdCBzaF9jb3VudF9yZWxvY3MgKikgZGF0YTsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gIHN5bWJvbFMgKnN5bTsKLSAgZml4UyAqZml4OwotCi0gIHNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgc3ltID0gaW5mby0+c3ltOwotICBmb3IgKGZpeCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXggIT0gTlVMTDsgZml4ID0gZml4LT5meF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChmaXgtPmZ4X2FkZHN5ID09IHN5bSkKLQl7Ci0JICArK2luZm8tPmNvdW50OwotCSAgZml4LT5meF90Y2JpdCA9IDE7Ci0JfQotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSBjb3VudCByZWxvY3MgZm9yIGEgcGFydGljdWxhciBzZWN0aW9uLiAgV2hlbiB1c2luZwotICAgQkZEX0FTU0VNQkxFUiwgdGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNoX2Zyb2Jfc2VjdGlvbiAoYWJmZCwgc2VjLCBpZ25vcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICBmaXhTICpmaXg7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKGZpeCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXggIT0gTlVMTDsgZml4ID0gZml4LT5meF9uZXh0KQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgZml4UyAqZnNjYW47Ci0gICAgICBzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzIGluZm87Ci0KLSAgICAgIGlmIChmaXgtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfVVNFUykKLQljb250aW51ZTsKLQotICAgICAgLyogVGhlIEJGRF9SRUxPQ19TSF9VU0VTIHJlbG9jIHNob3VsZCByZWZlciB0byBhIGRlZmluZWQgbG9jYWwKLQkgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24uICAqLwotICAgICAgc3ltID0gZml4LT5meF9hZGRzeTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTAotCSAgfHwgZml4LT5meF9zdWJzeSAhPSBOVUxMCi0JICB8fCBmaXgtPmZ4X2FkZG51bWJlciAhPSAwCi0JICB8fCBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHNlYwotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgZGVmaW5lZCAoT0JKX0NPRkYpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCi0jZW5kaWYKLQkgIHx8IFNfSVNfRVhURVJOQUwgKHN5bSkpCi0JewotCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCQkgXygiLnVzZXMgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBmaXh1cHMgYWdhaW4sIHRoaXMgdGltZSBsb29raW5nIGZvciBvbmUKLQkgYXQgdGhlIHNhbWUgbG9jYXRpb24gYXMgc3ltLiAgKi8KLSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW0pOwotICAgICAgZm9yIChmc2NhbiA9IHNlZ2luZm8tPmZpeF9yb290OwotCSAgIGZzY2FuICE9IE5VTEw7Ci0JICAgZnNjYW4gPSBmc2Nhbi0+ZnhfbmV4dCkKLQlpZiAodmFsID09IGZzY2FuLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZnNjYW4tPmZ4X3doZXJlCi0JICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0FMSUdOCi0JICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgICAgJiYgZnNjYW4tPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfREFUQQotCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9MQUJFTCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGZzY2FuID09IE5VTEwpCi0JewotCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCQkgXygiY2FuJ3QgZmluZCBmaXh1cCBwb2ludGVkIHRvIGJ5IC51c2VzIikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZnNjYW4tPmZ4X3RjYml0KQotCXsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgZG9uZSB0aGlzIG9uZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIGZzY2FuIHNob3VsZCBhbHNvIGJlIGEgZml4dXAgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUKLQkgc2VjdGlvbi4gICovCi0gICAgICBzeW0gPSBmc2Nhbi0+ZnhfYWRkc3k7Ci0gICAgICBpZiAoc3ltID09IE5VTEwKLQkgIHx8IGZzY2FuLT5meF9zdWJzeSAhPSBOVUxMCi0JICB8fCBmc2Nhbi0+ZnhfYWRkbnVtYmVyICE9IDAKLQkgIHx8IFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gc2VjCi0jaWYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiBkZWZpbmVkIChPQkpfQ09GRikKLQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FWFQKLSNlbmRpZgotCSAgfHwgU19JU19FWFRFUk5BTCAoc3ltKSkKLQl7Ci0JICBhc193YXJuX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwKLQkJCSBfKCIudXNlcyB0YXJnZXQgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHdlIGxvb2sgdGhyb3VnaCBhbGwgdGhlIGZpeHVwcyBvZiBhbGwgdGhlIHNlY3Rpb25zLAotCSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGZpbmQgYSByZWZlcmVuY2UgdG8gc3ltLiAgKi8KLSAgICAgIGluZm8uc3ltID0gc3ltOwotICAgICAgaW5mby5jb3VudCA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHNoX2NvdW50X3JlbG9jcywgKFBUUikgJmluZm8pOwotI2Vsc2UKLSAgICAgIHsKLQlpbnQgaXNjYW47Ci0KLQlmb3IgKGlzY2FuID0gU0VHX0UwOyBpc2NhbiA8IFNFR19VTktOT1dOOyBpc2NhbisrKQotCSAgc2hfY291bnRfcmVsb2NzICgoYmZkICopIE5VTEwsIGlzY2FuLCAoUFRSKSAmaW5mbyk7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKGluZm8uY291bnQgPCAxKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBHZW5lcmF0ZSBhIEJGRF9SRUxPQ19TSF9DT1VOVCBmaXh1cCBhdCB0aGUgbG9jYXRpb24gb2Ygc3ltLgotCSBXZSBoYXZlIGFscmVhZHkgYWRqdXN0ZWQgdGhlIHZhbHVlIG9mIHN5bSB0byBpbmNsdWRlIHRoZQotCSBmcmFnbWVudCBhZGRyZXNzLCBzbyB3ZSB1bmRvIHRoYXQgYWRqdXN0bWVudCBoZXJlLiAgKi8KLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gICAgICBmaXhfbmV3IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bSksCi0JICAgICAgIFNfR0VUX1ZBTFVFIChzeW0pIC0gc3ltYm9sX2dldF9mcmFnIChzeW0pLT5mcl9hZGRyZXNzLAotCSAgICAgICA0LCAmYWJzX3N5bWJvbCwgaW5mby5jb3VudCwgMCwgQkZEX1JFTE9DX1NIX0NPVU5UKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gY29tcGxldGVkLAotICAgYnV0IGJlZm9yZSB0aGUgcmVsb2NzIG9yIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0LgotICAgSWYgd2UgaGF2ZSBzZWVuIGFueSAudXNlcyBwc2V1ZG8tb3BzLCB0aGV5IHBvaW50IHRvIGFuIGluc3RydWN0aW9uCi0gICB3aGljaCBsb2FkcyBhIHJlZ2lzdGVyIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gIFdlIGxvb2sKLSAgIHRocm91Z2ggdGhlIGZpeHVwcyB0byBmaW5kIHdoZXJlIHRoZSBmdW5jdGlvbiBhZGRyZXNzIGlzIGJlaW5nCi0gICBsb2FkZWQgZnJvbS4gIFdlIHRoZW4gZ2VuZXJhdGUgYSBDT1VOVCByZWxvYyBnaXZpbmcgdGhlIG51bWJlciBvZgotICAgdGltZXMgdGhhdCBmdW5jdGlvbiBhZGRyZXNzIGlzIHJlZmVycmVkIHRvLiAgVGhlIGxpbmtlciB1c2VzIHRoaXMKLSAgIGluZm9ybWF0aW9uIHdoZW4gZG9pbmcgcmVsYXhpbmcsIHRvIGRlY2lkZSB3aGVuIGl0IGNhbiBlbGltaW5hdGUKLSAgIHRoZSBzdG9yZWQgZnVuY3Rpb24gYWRkcmVzcyBlbnRpcmVseS4gICovCi0KLXZvaWQKLXNoX2Zyb2JfZmlsZSAoKQotewotICBpZiAoISBzaF9yZWxheCkKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBzaF9mcm9iX3NlY3Rpb24sIChQVFIpIE5VTEwpOwotI2Vsc2UKLSAgewotICAgIGludCBpc2VnOwotCi0gICAgZm9yIChpc2VnID0gU0VHX0UwOyBpc2VnIDwgU0VHX1VOS05PV047IGlzZWcrKykKLSAgICAgIHNoX2Zyb2Jfc2VjdGlvbiAoKGJmZCAqKSBOVUxMLCBpc2VnLCAoUFRSKSBOVUxMKTsKLSAgfQotI2VuZGlmCi19Ci0KLS8qIENhbGxlZCBhZnRlciByZWxheGluZy4gIFNldCB0aGUgY29ycmVjdCBzaXplcyBvZiB0aGUgZnJhZ21lbnRzLCBhbmQKLSAgIGNyZWF0ZSByZWxvY3Mgc28gdGhhdCBtZF9hcHBseV9maXggd2lsbCBmaWxsIGluIHRoZSBjb3JyZWN0IHZhbHVlcy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZCAqaGVhZGVyczsKLSNlbHNlCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotI2VuZGlmCi0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGludCBkb25lcmVsYXggPSAwOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EOCk6Ci0gICAgY2FzZSBDIChDT05EX0pVTVBfREVMQVksIENPTkQ4KToKLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKToKLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMik6Ci0gICAgY2FzZSBDIChVTkNPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sID09IE5VTEwpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyAxMi1iaXQgZmllbGQiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzKTsKLSAgICAgIGVsc2UgaWYgKFNfSVNfREVGSU5FRCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyAxMi1iaXQgZmllbGQiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCi0JCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQotCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7Ci0KLSNpZiAwCQkJCS8qIFRoaXMgY29kZSB3b3JrcywgYnV0IGdlbmVyYXRlcyBwb29yIGNvZGUgYW5kIHRoZSBjb21waWxlcgotCQkJCSAgIHNob3VsZCBuZXZlciBwcm9kdWNlIGEgc2VxdWVuY2UgdGhhdCByZXF1aXJlcyBpdCB0byBiZSB1c2VkLiAgKi8KLQotICAgICAgLyogQSBqdW1wIHdvbnQgZml0IGluIDEyIGJpdHMsIG1ha2UgY29kZSB3aGljaCBsb29rcyBsaWtlCi0JIGJyYSBmb28KLQkgbW92LncgQCgwLCBQQyksIHIxNAotCSAubG9uZyBkaXNwCi0JIGZvbzogYnJhIEByMTQKLQkgKi8KLSAgICAgIGludCB0ID0gYnVmZmVyWzBdICYgMHgxMDsKLQotICAgICAgYnVmZmVyW2hpZ2hieXRlXSA9IDB4YTA7CS8qIGJyYW5jaCBvdmVyIG1vdmUgYW5kIGRpc3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlXSA9IDM7Ci0gICAgICBidWZmZXJbaGlnaGJ5dGUrMl0gPSAweGQwIHwgSlJFRzsJLyogQnVpbGQgbW92IGluc24gKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzJdID0gMHgwMDsKLQotICAgICAgYnVmZmVyW2hpZ2hieXRlKzRdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBqdW1wIGRpc3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzRdID0gMDsKLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs2XSA9IDA7Ci0gICAgICBidWZmZXJbbG93Ynl0ZSs2XSA9IDA7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs4XSA9IDB4NDAgfCBKUkVHOwkvKiBCdWlsZCBqbXAgQEpSRUcgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzhdID0gdCA/IDB4YiA6IDB4MmI7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSsxMF0gPSAweDIwOyAvKiBidWlsZCBub3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzEwXSA9IDB4MGI7Ci0KLSAgICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgNCwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gVU5DT05EMzJfTEVOR1RIOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBkb25lcmVsYXggPSAxOwotI2VuZGlmCi0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChDT05EX0pVTVAsIENPTkQxMik6Ci0gICAgY2FzZSBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMik6Ci0gICAgICAvKiBBIGJjb25kIHdvbid0IGZpdCwgc28gdHVybiBpdCBpbnRvIGEgYiFjb25kOyBicmEgZGlzcDsgbm9wICovCi0gICAgICAvKiBJIGZvdW5kIHRoYXQgYSByZWxheCBmYWlsdXJlIGZvciBnY2MuYy10b3J0dXJlL2V4ZWN1dGUvOTMwNjI4LTEuYwotCSB3YXMgZHVlIHRvIGdhcyBpbmNvcnJlY3RseSByZWxheGluZyBhbiBvdXQtb2YtcmFuZ2UgY29uZGl0aW9uYWwKLQkgYnJhbmNoIHdpdGggZGVsYXkgc2xvdC4gIEl0IHR1cm5lZDoKLSAgICAgICAgICAgICAgICAgICAgIGJmLnMgICAgTDYgICAgICAgICAgICAgIChzbG90IG1vdi5sICAgcjEyLEAoNDQscjApKQotICAgICAgICAgaW50bzoKLSAgIAotMmM6ICA4ZiAwMSBhMCA4YiAgICAgYmYucyAgICAzMiA8X21haW4rMzI+ICAgKHNsb3QgYnJhICAgICAgIEw2KQotMzA6ICAwMCAwOSAgICAgICAgICAgbm9wCi0zMjogIDEwIGNiICAgICAgICAgICBtb3YubCAgIHIxMixAKDQ0LHIwKQotICAgICAgICAgVGhlcmVmb3JlLCBicmFuY2hlcyB3aXRoIGRlbGF5IHNsb3RzIGhhdmUgdG8gYmUgaGFuZGxlZAotCSBkaWZmZXJlbnRseSBmcm9tIG9uZXMgd2l0aG91dCBkZWxheSBzbG90cy4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyID0KLQkgICh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotCWludCBoaWdoYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7Ci0JaW50IGxvd2J5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDEgOiAwOwotCWludCBkZWxheSA9IGZyYWdQLT5mcl9zdWJ0eXBlID09IEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDEyKTsKLQotCS8qIFRvZ2dsZSB0aGUgdHJ1ZS9mYWxzZSBiaXQgb2YgdGhlIGJjb25kLiAgKi8KLQlidWZmZXJbaGlnaGJ5dGVdIF49IDB4MjsKLQotCS8qIElmIHRoaXMgaXMgYSBkYWxheWVkIGJyYW5jaCwgd2UgbWF5IG5vdCBwdXQgdGhlIHRoZSBicmEgaW4gdGhlCi0JICAgc2xvdC4gIFNvIHdlIGNoYW5nZSBpdCB0byBhIG5vbi1kZWxheWVkIGJyYW5jaCwgbGlrZSB0aGF0OgotCSAgIGIhIGNvbmQgc2xvdF9sYWJlbDsgYnJhIGRpc3A7IHNsb3RfbGFiZWw6IHNsb3RfaW5zbgotCSAgID8/PyBXZSBzaG91bGQgdHJ5IGlmIHN3YXBwaW5nIHRoZSBjb25kaXRpb25hbCBicmFuY2ggYW5kCi0JICAgaXRzIGRlbGF5LXNsb3QgaW5zbiBhbHJlYWR5IG1ha2VzIHRoZSBicmFuY2ggcmVhY2guICAqLwotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIHRvIHNpeCAvIGZvdXIgYnl0ZXMgZmFydGhlciBvbi4gICovCi0Jc3Vic2VnX2NoYW5nZSAoc2VnLCAwKTsKLQlmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JCSBzZWN0aW9uX3N5bWJvbCAoc2VnKSwKLSNlbHNlCi0JCSBzZWdfaW5mbyAoc2VnKS0+ZG90LAotI2VuZGlmCi0JCSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggKyAoZGVsYXkgPyA0IDogNiksCi0JCSAxLCBCRkRfUkVMT0NfU0hfUENESVNQOEJZMik7Ci0KLQkvKiBTZXQgdXAgYSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLQlidWZmZXJbaGlnaGJ5dGUgKyAyXSA9IDB4YTA7Ci0JYnVmZmVyW2xvd2J5dGUgKyAyXSA9IDA7Ci0JZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyKTsKLQotCWlmIChkZWxheSkKLQkgIHsKLQkgICAgYnVmZmVyW2hpZ2hieXRlXSAmPSB+MHg0OyAvKiBSZW1vdmVzIGRlbGF5IHNsb3QgZnJvbSBicmFuY2guICAqLwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBGaWxsIGluIGEgTk9QIGluc3RydWN0aW9uLiAgKi8KLQkgICAgYnVmZmVyW2hpZ2hieXRlICsgNF0gPSAweDA7Ci0JICAgIGJ1ZmZlcltsb3dieXRlICsgNF0gPSAweDk7Ci0KLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotCSAgfQotCWZyYWdQLT5mcl92YXIgPSAwOwotCWRvbmVyZWxheCA9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMzIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMzIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wgPT0gTlVMTCkKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgb3ZlcmZsb3dzIDgtYml0IGZpZWxkIiksIAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MpOwotICAgICAgZWxzZSBpZiAoU19JU19ERUZJTkVEIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDgtYml0IGZpZWxkICIpLAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MsCQkKLQkJU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byB1bmRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCi0JCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKLQotI2lmIDAJCQkJLyogVGhpcyBjb2RlIHdvcmtzLCBidXQgZ2VuZXJhdGVzIHBvb3IgY29kZSwgYW5kIHRoZSBjb21waWxlcgotCQkJCSAgIHNob3VsZCBuZXZlciBwcm9kdWNlIGEgc2VxdWVuY2UgdGhhdCByZXF1aXJlcyBpdCB0byBiZSB1c2VkLiAgKi8KLQotICAgICAgLyogQSBiY29uZCB3b24ndCBmaXQgYW5kIGl0IHdvbid0IGdvIGludG8gYSAxMiBiaXQKLQkgZGlzcGxhY2VtZW50IGVpdGhlciwgdGhlIGNvZGUgc2VxdWVuY2UgbG9va3MgbGlrZToKLQkgYiFjb25kIGZvb3AKLQkgbW92LncgQChuLCBQQyksIHIxNAotCSBqbXAgIEByMTQKLQkgbm9wCi0JIC5sb25nIHdoZXJlCi0JIGZvb3A6Ci0JICovCi0KLSAgICAgIGJ1ZmZlclswXSBePSAweDI7CQkvKiBUb2dnbGUgVC9GIGJpdCAqLwotI2RlZmluZSBKUkVHIDE0Ci0gICAgICBidWZmZXJbMV0gPSA1OwkJLyogYnJhbmNoIG92ZXIgbW92LCBqdW1wLCBub3AgYW5kIHB0ciAqLwotICAgICAgYnVmZmVyWzJdID0gMHhkMCB8IEpSRUc7CS8qIEJ1aWxkIG1vdiBpbnNuICovCi0gICAgICBidWZmZXJbM10gPSAweDI7Ci0gICAgICBidWZmZXJbNF0gPSAweDQwIHwgSlJFRzsJLyogQnVpbGQgam1wIEBKUkVHICovCi0gICAgICBidWZmZXJbNV0gPSAweDBiOwotICAgICAgYnVmZmVyWzZdID0gMHgyMDsJCS8qIGJ1aWxkIG5vcCAqLwotICAgICAgYnVmZmVyWzddID0gMHgwYjsKLSAgICAgIGJ1ZmZlcls4XSA9IDA7CQkvKiBzcGFjZSBmb3IgMzIgYml0IGp1bXAgZGlzcCAqLwotICAgICAgYnVmZmVyWzldID0gMDsKLSAgICAgIGJ1ZmZlclsxMF0gPSAwOwotICAgICAgYnVmZmVyWzExXSA9IDA7Ci0gICAgICBidWZmZXJbMTJdID0gMDsKLSAgICAgIGJ1ZmZlclsxM10gPSAwOwotICAgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcCAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyA4LAotCSAgICAgICA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLAotCSAgICAgICBCRkRfUkVMT0NfMzIpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBDT05EMzJfTEVOR1RIOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBkb25lcmVsYXggPSAxOwotI2VuZGlmCi0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZG9uZXJlbGF4ICYmICFzaF9yZWxheCkKLSAgICBhc193YXJuX3doZXJlIChmcmFnUC0+ZnJfZmlsZSwgZnJhZ1AtPmZyX2xpbmUsCi0JCSAgIF8oIm92ZXJmbG93IGluIGJyYW5jaCB0byAlczsgY29udmVydGVkIGludG8gbG9uZ2VyIGluc3RydWN0aW9uIHNlcXVlbmNlIiksCi0JCSAgIChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwKLQkJICAgID8gU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkKLQkJICAgIDogIiIpKTsKLX0KLQotdmFsdWVUCi1ERUZVTiAobWRfc2VjdGlvbl9hbGlnbiwgKHNlZywgc2l6ZSksCi0gICAgICAgc2VnVCBzZWcgQU5ECi0gICAgICAgdmFsdWVUIHNpemUpCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE9CSl9FTEYKLSAgcmV0dXJuIHNpemU7Ci0jZWxzZSAvKiAhIE9CSl9FTEYgKi8KLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkgLSAxKQotCSAgJiAoLTEgPDwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpKSk7Ci0jZW5kaWYgLyogISBPQkpfRUxGICovCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pIC0gMSkKLQkgICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLX0KLQotLyogVGhpcyBzdGF0aWMgdmFyaWFibGUgaXMgc2V0IGJ5IHNfdWFjb25zIHRvIHRlbGwgc2hfY29uc19hbGlnbiB0aGF0Ci0gICB0aGUgZXhwZXNzaW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgYWxpZ25lZC4gICovCi0KLXN0YXRpYyBpbnQgc2hfbm9fYWxpZ25fY29ucyA9IDA7Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgdW5hbGlnbmVkIHNwYWNlIGFsbG9jYXRpb24gcHNldWRvLW9wcywgc3VjaCBhcwotICAgLnVhd29yZC4gIC51YXdvcmQgaXMganVzdCBsaWtlIC53b3JkLCBidXQgdGhlIHZhbHVlIGRvZXMgbm90IG5lZWQKLSAgIHRvIGJlIGFsaWduZWQuICAqLwotCi1zdGF0aWMgdm9pZAotc191YWNvbnMgKGJ5dGVzKQotICAgICBpbnQgYnl0ZXM7Ci17Ci0gIC8qIFRlbGwgc2hfY29uc19hbGlnbiBub3QgdG8gYWxpZ24gdGhpcyB2YWx1ZS4gICovCi0gIHNoX25vX2FsaWduX2NvbnMgPSAxOwotICBjb25zIChieXRlcyk7Ci19Ci0KLS8qIElmIGEgLndvcmQsIGV0LiBhbC4sIHBzZXVkLW9wIGlzIHNlZW4sIHdhcm4gaWYgdGhlIHZhbHVlIGlzIG5vdAotICAgYWxpZ25lZCBjb3JyZWN0bHkuICBOb3RlIHRoYXQgdGhpcyBjYW4gY2F1c2Ugd2FybmluZ3MgdG8gYmUgaXNzdWVkCi0gICB3aGVuIGFzc2VtYmxpbmcgaW5pdGlhbGl6ZWQgc3RydWN0dXJlZCB3aGljaCB3ZXJlIGRlY2xhcmVkIHdpdGggdGhlCi0gICBwYWNrZWQgYXR0cmlidXRlLiAgRklYTUU6IFBlcmhhcHMgd2Ugc2hvdWxkIHJlcXVpcmUgYW4gb3B0aW9uIHRvCi0gICBlbmFibGUgdGhpcyB3YXJuaW5nPyAgKi8KLQotdm9pZAotc2hfY29uc19hbGlnbiAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBpbnQgbmFsaWduOwotICBjaGFyICpwOwotCi0gIGlmIChzaF9ub19hbGlnbl9jb25zKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gdW5hbGlnbmVkIHBzZXVkby1vcC4gICovCi0gICAgICBzaF9ub19hbGlnbl9jb25zID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFsaWduID0gMDsKLSAgd2hpbGUgKChuYnl0ZXMgJiAxKSA9PSAwKQotICAgIHsKLSAgICAgICsrbmFsaWduOwotICAgICAgbmJ5dGVzID4+PSAxOwotICAgIH0KLQotICBpZiAobmFsaWduID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKChhYnNfc2VjdGlvbl9vZmZzZXQgJiAoKDEgPDwgbmFsaWduKSAtIDEpKSAhPSAwKQotCWFzX3dhcm4gKF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkoc3ltYm9sUyAqKSBOVUxMLCAob2Zmc2V0VCkgbmFsaWduLCAoY2hhciAqKSBOVUxMKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuYWxpZ24pOwotfQotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIG91dHB1dCBhIHJlbG9jIGZvciBhbnkgLmFsaWduIGRpcmVjdGl2ZQotICAgdGhhdCByZXF1ZXN0cyBhbGlnbm1lbnQgdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkgb3IgbGFyZ2VyLiAgVGhpcyBpcwotICAgYWxzbyB3aGVyZSB3ZSBjaGVjayBmb3IgbWlzYWxpZ25lZCBkYXRhLiAgKi8KLQotdm9pZAotc2hfaGFuZGxlX2FsaWduIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaWYgKHNoX3JlbGF4Ci0gICAgICAmJiBmcmFnLT5mcl90eXBlID09IHJzX2FsaWduCi0gICAgICAmJiBmcmFnLT5mcl9hZGRyZXNzICsgZnJhZy0+ZnJfZml4ID4gMAotICAgICAgJiYgZnJhZy0+ZnJfb2Zmc2V0ID4gMQotICAgICAgJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKLSAgICBmaXhfbmV3IChmcmFnLCBmcmFnLT5mcl9maXgsIDIsICZhYnNfc3ltYm9sLCBmcmFnLT5mcl9vZmZzZXQsIDAsCi0JICAgICBCRkRfUkVMT0NfU0hfQUxJR04pOwotCi0gIGlmIChmcmFnLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUKLSAgICAgICYmIGZyYWctPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnLT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfZml4ICE9IDApCi0gICAgYXNfd2Fybl93aGVyZSAoZnJhZy0+ZnJfZmlsZSwgZnJhZy0+ZnJfbGluZSwgXygibWlzYWxpZ25lZCBkYXRhIikpOwotfQotCi0vKiBUaGlzIG1hY3JvIGRlY2lkZXMgd2hldGhlciBhIHBhcnRpY3VsYXIgcmVsb2MgaXMgYW4gZW50cnkgaW4gYQotICAgc3dpdGNoIHRhYmxlLiAgSXQgaXMgdXNlZCB3aGVuIHJlbGF4aW5nLCBiZWNhdXNlIHRoZSBsaW5rZXIgbmVlZHMKLSAgIHRvIGtub3cgYWJvdXQgYWxsIHN1Y2ggZW50cmllcyBzbyB0aGF0IGl0IGNhbiBhZGp1c3QgdGhlbSBpZgotICAgbmVjZXNzYXJ5LiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgU1dJVENIX1RBQkxFX0NPTlMoZml4KSAoMCkKLSNlbHNlCi0jZGVmaW5lIFNXSVRDSF9UQUJMRV9DT05TKGZpeCkJCQkJXAotICAoKGZpeCktPmZ4X3JfdHlwZSA9PSAwCQkJCVwKLSAgICYmICgoZml4KS0+Znhfc2l6ZSA9PSAyCQkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfc2l6ZSA9PSAxCQkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfc2l6ZSA9PSA0KSkKLSNlbmRpZgotCi0jZGVmaW5lIFNXSVRDSF9UQUJMRShmaXgpCQkJCVwKLSAgKChmaXgpLT5meF9hZGRzeSAhPSBOVUxMCQkJCVwKLSAgICYmIChmaXgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCVwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXgpLT5meF9hZGRzeSkgPT0gdGV4dF9zZWN0aW9uCVwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXgpLT5meF9zdWJzeSkgPT0gdGV4dF9zZWN0aW9uCVwKLSAgICYmICgoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMgkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNgkJXAotICAgICAgIHx8IChmaXgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzgJCVwKLSAgICAgICB8fCBTV0lUQ0hfVEFCTEVfQ09OUyAoZml4KSkpCi0KLS8qIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxvY2F0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIG91dCBzd2l0Y2ggYW5kIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdoZW4KLSAgIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1zaF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKmZpeDsKLXsKLQotICBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIGlmICghIHNoX3JlbGF4KQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAoZml4LT5meF9wY3JlbAotCSAgfHwgU1dJVENIX1RBQkxFIChmaXgpCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQ09VTlQKLQkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9BTElHTgotCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9EQVRBCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfTEFCRUwpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotYm9vbGVhbgotc2hfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICpmaXhQOwotewotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFscDsKLSNlbHNlCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci0jZW5kaWYKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBpbnQgbG93Ynl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMSA6IDA7Ci0gIGludCBoaWdoYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBsb25nIHZhbCA9ICp2YWxwOwotI2VuZGlmCi0gIGxvbmcgbWF4LCBtaW47Ci0gIGludCBzaGlmdDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogYWRqdXN0X3JlbG9jX3N5bXMgd29uJ3QgY29udmVydCBhIHJlbG9jIGFnYWluc3QgYSB3ZWFrIHN5bWJvbAotICAgICBpbnRvIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24sIGJ1dCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdpbGwKLSAgICAgc2NyZXcgdXAgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBzbyB3ZSBoYXZlIHRvIGFkanVzdCB2YWwgaGVyZQotICAgICB0byBhdm9pZCB0aGUgc2NyZXcgdXAgbGF0ZXIuICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgdmFsIC09IFNfR0VUX1ZBTFVFICAoZml4UC0+ZnhfYWRkc3kpOwotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoZml4UC0+Znhfcl90eXBlID09IDApCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMikKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMTY7Ci0gICAgICBlbHNlIGlmIChmaXhQLT5meF9zaXplID09IDQpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyOwotICAgICAgZWxzZSBpZiAoZml4UC0+Znhfc2l6ZSA9PSAxKQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ184OwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLSNlbmRpZgotCi0gIG1heCA9IG1pbiA9IDA7Ci0gIHNoaWZ0ID0gMDsKLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTTQ6Ci0gICAgICBtYXggPSAweGY7Ci0gICAgICAqYnVmID0gKCpidWYgJiAweGYwKSB8ICh2YWwgJiAweGYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU00QlkyOgotICAgICAgbWF4ID0gMHhmOwotICAgICAgc2hpZnQgPSAxOwotICAgICAgKmJ1ZiA9ICgqYnVmICYgMHhmMCkgfCAoKHZhbCA+PiAxKSAmIDB4Zik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTTRCWTQ6Ci0gICAgICBtYXggPSAweGY7Ci0gICAgICBzaGlmdCA9IDI7Ci0gICAgICAqYnVmID0gKCpidWYgJiAweGYwKSB8ICgodmFsID4+IDIpICYgMHhmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfSU1NOEJZMjoKLSAgICAgIG1heCA9IDB4ZmY7Ci0gICAgICBzaGlmdCA9IDE7Ci0gICAgICAqYnVmID0gdmFsID4+IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTThCWTQ6Ci0gICAgICBtYXggPSAweGZmOwotICAgICAgc2hpZnQgPSAyOwotICAgICAgKmJ1ZiA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTTg6Ci0gICAgICAvKiBTb21ldGltZXMgdGhlIDggYml0IHZhbHVlIGlzIHNpZ24gZXh0ZW5kZWQgKGUuZy4sIGFkZCkgYW5kCi0gICAgICAgICBzb21ldGltZXMgaXQgaXMgbm90IChlLmcuLCBhbmQpLiAgV2UgcGVybWl0IGFueSA4IGJpdCB2YWx1ZS4KLSAgICAgICAgIE5vdGUgdGhhdCBhZGRpbmcgZnVydGhlciByZXN0cmljdGlvbnMgbWF5IGludmFsaWRhdGUKLSAgICAgICAgIHJlYXNvbmFibGUgbG9va2luZyBhc3NlbWJseSBjb2RlLCBzdWNoIGFzIGBgYW5kIC0weDEscjAnJy4gICovCi0gICAgICBtYXggPSAweGZmOwotICAgICAgbWluID0gLSAweGZmOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQ6Ci0gICAgICAvKiBUaGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlIFBDIGFyZSBjbGVhcmVkIGJlZm9yZSB0aGUKLSAgICAgICAgIGRpc3BsYWNlbWVudCBpcyBhZGRlZCBpbi4gIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgIGlzIG9uIGEgNCBieXRlIGJvdW5kYXkuICBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGFsc28gb24gYSA0Ci0gICAgICAgICBieXRlIGJvdW5kYXJ5LCB0aGVuIHdlIHdhbnQKLQkgICAodGFyZ2V0IC0gaGVyZSkgLyA0Ci0JIGFuZCB0YXJnZXQgLSBoZXJlIGlzIGEgbXVsdGlwbGUgb2YgNC4KLQkgT3RoZXJ3aXNlLCB3ZSBhcmUgb24gYSAyIGJ5dGUgYm91bmRhcnksIGFuZCB3ZSB3YW50Ci0JICAgKHRhcmdldCAtIChoZXJlIC0gMikpIC8gNAotCSBhbmQgdGFyZ2V0IC0gaGVyZSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAgQ29tcHV0aW5nCi0JICAgKHRhcmdldCAtIChoZXJlIC0gMikpIC8gNCA9PSAodGFyZ2V0IC0gaGVyZSArIDIpIC8gNAotCSB3b3JrcyBmb3IgYm90aCBjYXNlcywgc2luY2UgaW4gdGhlIGZpcnN0IGNhc2UgdGhlIGFkZGl0aW9uIG9mCi0JIDIgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBkaXZpc2lvbi4gIHRhcmdldCAtIGhlcmUgaXMgaW4gdGhlCi0JIHZhcmlhYmxlIHZhbC4gICovCi0gICAgICB2YWwgPSAodmFsICsgMikgLyA0OwotICAgICAgaWYgKHZhbCAmIH4weGZmKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygicGNyZWwgdG9vIGZhciIpKTsKLSAgICAgIGJ1Zltsb3dieXRlXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyOgotICAgICAgdmFsIC89IDI7Ci0gICAgICBpZiAodmFsICYgfjB4ZmYpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJwY3JlbCB0b28gZmFyIikpOwotICAgICAgYnVmW2xvd2J5dGVdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyOgotICAgICAgdmFsIC89IDI7Ci0gICAgICBpZiAodmFsIDwgLTB4ODAgfHwgdmFsID4gMHg3ZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInBjcmVsIHRvbyBmYXIiKSk7Ci0gICAgICBidWZbbG93Ynl0ZV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyOgotICAgICAgdmFsIC89IDI7Ci0gICAgICBpZiAodmFsIDwgLTB4ODAwIHx8IHZhbCA+PSAweDdmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInBjcmVsIHRvbyBmYXIiKSk7Ci0gICAgICBidWZbbG93Ynl0ZV0gPSB2YWwgJiAweGZmOwotICAgICAgYnVmW2hpZ2hieXRlXSB8PSAodmFsID4+IDgpICYgMHhmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKSAKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCSAgKmJ1ZisrID0gdmFsID4+IDE2OwotCSAgKmJ1ZisrID0gdmFsID4+IDI0OwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDI0OwotCSAgKmJ1ZisrID0gdmFsID4+IDE2OwotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDA7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQl9IAotICAgICAgZWxzZSAKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQkgICpidWYrKyA9IHZhbCA+PiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfVVNFUzoKLSAgICAgIC8qIFBhc3MgdGhlIHZhbHVlIGludG8gc2hfY29mZl9yZWxvY19tYW5nbGUuICAqLwotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9DT1VOVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9BTElHTjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9DT0RFOgotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0RBVEE6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU0hfTEFCRUw6Ci0gICAgICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgICByZXR1cm47Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKHNoaWZ0ICE9IDApCi0gICAgewotICAgICAgaWYgKCh2YWwgJiAoKDEgPDwgc2hpZnQpIC0gMSkpICE9IDApCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJtaXNhbGlnbmVkIG9mZnNldCIpKTsKLSAgICAgIGlmICh2YWwgPj0gMCkKLQl2YWwgPj49IHNoaWZ0OwotICAgICAgZWxzZQotCXZhbCA9ICgodmFsID4+IHNoaWZ0KQotCSAgICAgICB8ICgobG9uZykgLTEgJiB+ICgobG9uZykgLTEgPj4gc2hpZnQpKSk7Ci0gICAgfQotICBpZiAobWF4ICE9IDAgJiYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpKQotICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygib2Zmc2V0IG91dCBvZiByYW5nZSIpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyogQ2FsbGVkIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbi4gIFJldHVybiB0aGUgbGVuZ3RoCi0gICBieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDIChVTkNPTkRfSlVNUCwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLwotICAgICAgaWYgKCFmcmFnUC0+ZnJfc3ltYm9sKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBDIChDT05EX0pVTVAsIFVOREVGX0RJU1ApOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBVTkRFRl9ESVNQKToKLSAgICAgIC8qIHVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbAotCSAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGludCB3aGF0ID0gR0VUX1dIQVQgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKLQkgICAgIHNpemVkIC0gbWF5YmUgaXQgd2lsbCBmaXggdXAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgQ09ORDgpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQ4KV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlIGlmIChmcmFnUC0+ZnJfc3ltYm9sKQotCXsKLQkgIGludCB3aGF0ID0gR0VUX1dIQVQgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JICAvKiBXZSBrbm93IHRoZSBhYnMgdmFsdWUgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgQ09ORDgpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQ4KV0ucmx4X2xlbmd0aDsKLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGZyYWdQLT5mcl92YXI7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgdmFsdWVUIHVzZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyAyOwotfQotCi0jaWZkZWYgT0JKX0NPRkYKLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW2ZyYWctPmZyX3N1YnR5cGVdLnJseF9sZW5ndGg7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0vKiBXaGVuIHdlIGFsaWduIHRoZSAudGV4dCBzZWN0aW9uLCBpbnNlcnQgdGhlIGNvcnJlY3QgTk9QIHBhdHRlcm4uICAqLwotCi1pbnQKLXNoX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50IG47Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGw7Ci0gICAgIGludCBsZW47Ci0gICAgIGludCBtYXg7Ci17Ci0gIGlmIChmaWxsID09IE5VTEwKLSAgICAgICYmIHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpCi0gICAgICAmJiBuID4gMSkKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiaWdfbm9wX3BhdHRlcm5bXSA9IHsgMHgwMCwgMHgwOSB9OwotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGl0dGxlX25vcF9wYXR0ZXJuW10gPSB7IDB4MDksIDB4MDAgfTsKLQotICAgICAgLyogRmlyc3QgYWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnksIGluIGNhc2UgdGhlcmUgaXMgYW4gb2RkCi0gICAgICAgICAuYnl0ZS4gICovCi0gICAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGJpZ19ub3BfcGF0dGVybiwgc2l6ZW9mIGJpZ19ub3BfcGF0dGVybiwgbWF4KTsKLSAgICAgIGVsc2UKLQlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGxpdHRsZV9ub3BfcGF0dGVybiwgc2l6ZW9mIGxpdHRsZV9ub3BfcGF0dGVybiwKLQkJCSAgICBtYXgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfQ09GRgotCi0vKiBNYXAgQkZEIHJlbG9jcyB0byBTSCBDT0ZGIHJlbG9jcy4gICovCi0KLXN0cnVjdCByZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvYzsKLSAgaW50IHNoX3JlbG9jOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWxvY19tYXAgY29mZl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DXzMyLCBSX1NIX0lNTTMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX1NIX0lNTTE2IH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU0hfSU1NOCB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyLCBSX1NIX1BDRElTUDhCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIsIFJfU0hfUENESVNQIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTTQsIFJfU0hfSU1NNCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU00QlkyLCBSX1NIX0lNTTRCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NNEJZNCwgUl9TSF9JTU00Qlk0IH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTTgsIFJfU0hfSU1NOCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU04QlkyLCBSX1NIX0lNTThCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NOEJZNCwgUl9TSF9JTU04Qlk0IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwgUl9TSF9QQ1JFTElNTThCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX1BDUkVMSU1NOEJZNCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NIX1NXSVRDSDggfSwKLSAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMTYgfSwKLSAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMzIsIFJfU0hfU1dJVENIMzIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfVVNFUywgUl9TSF9VU0VTIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0NPVU5ULCBSX1NIX0NPVU5UIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0FMSUdOLCBSX1NIX0FMSUdOIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0NPREUsIFJfU0hfQ09ERSB9LAotICB7IEJGRF9SRUxPQ19TSF9EQVRBLCBSX1NIX0RBVEEgfSwKLSAgeyBCRkRfUkVMT0NfU0hfTEFCRUwsIFJfU0hfTEFCRUwgfSwKLSAgeyBCRkRfUkVMT0NfVU5VU0VELCAwIH0KLX07Ci0KLS8qIEFkanVzdCBhIHJlbG9jIGZvciB0aGUgU0guICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdlbmVyaWMgY29kZSwKLSAgIGJ1dCBkb2VzIHNvbWUgbWlub3IgdHdlYWtpbmcuICAqLwotCi12b2lkCi1zaF9jb2ZmX3JlbG9jX21hbmdsZSAoc2VnLCBmaXgsIGludHIsIHBhZGRyKQotICAgICBzZWdtZW50X2luZm9fdHlwZSAqc2VnOwotICAgICBmaXhTICpmaXg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgdW5zaWduZWQgaW50IHBhZGRyOwotewotICBzeW1ib2xTICpzeW1ib2xfcHRyID0gZml4LT5meF9hZGRzeTsKLSAgc3ltYm9sUyAqZG90OwotCi0gIGludHItPnJfdmFkZHIgPSBwYWRkciArIGZpeC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeC0+Znhfd2hlcmU7Ci0KLSAgaWYgKCEgU1dJVENIX1RBQkxFIChmaXgpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCByZWxvY19tYXAgKnJtOwotCi0gICAgICBmb3IgKHJtID0gY29mZl9yZWxvY19tYXA7IHJtLT5iZmRfcmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRDsgcm0rKykKLQlpZiAocm0tPmJmZF9yZWxvYyA9PSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSBmaXgtPmZ4X3JfdHlwZSkKLQkgIGJyZWFrOwotICAgICAgaWYgKHJtLT5iZmRfcmVsb2MgPT0gQkZEX1JFTE9DX1VOVVNFRCkKLQlhc19iYWRfd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkgICAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXgtPmZ4X3JfdHlwZSkpOwotICAgICAgaW50ci0+cl90eXBlID0gcm0tPnNoX3JlbG9jOwotICAgICAgaW50ci0+cl9vZmZzZXQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKHNoX3JlbGF4KTsKLQotICAgICAgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNikKLQlpbnRyLT5yX3R5cGUgPSBSX1NIX1NXSVRDSDE2OwotICAgICAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzgpCi0JaW50ci0+cl90eXBlID0gUl9TSF9TV0lUQ0g4OwotICAgICAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyKQotCWludHItPnJfdHlwZSA9IFJfU0hfU1dJVENIMzI7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIEZvciBhIHN3aXRjaCByZWxvYywgd2Ugc2V0IHJfb2Zmc2V0IHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgICAgICAgIHRoZSByZWxvYyBhZGRyZXNzIGFuZCB0aGUgc3VidHJhaGVuZC4gIFdoZW4gdGhlIGxpbmtlciBpcwotICAgICAgICAgZG9pbmcgcmVsYXhpbmcsIGl0IGNhbiB1c2UgdGhlIGRldGVybWluZSB0aGUgc3RhcnRpbmcgYW5kCi0gICAgICAgICBlbmRpbmcgcG9pbnRzIG9mIHRoZSBzd2l0Y2ggZGlmZmVyZW5jZSBleHByZXNzaW9uLiAgKi8KLSAgICAgIGludHItPnJfb2Zmc2V0ID0gaW50ci0+cl92YWRkciAtIFNfR0VUX1ZBTFVFIChmaXgtPmZ4X3N1YnN5KTsKLSAgICB9Ci0KLSAgLyogUEMgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLSAgaWYgKHN5bWJvbF9wdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZpeC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0OgotCWNhc2UgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfVVNFUzoKLQkgIHN5bWJvbF9wdHIgPSBzZWctPmRvdDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfVVNFUykKLSAgICB7Ci0gICAgICAvKiBXZSBjYW4ndCBzdG9yZSB0aGUgb2Zmc2V0IGluIHRoZSBvYmplY3QgZmlsZSwgc2luY2UgdGhpcwotCSByZWxvYyBkb2VzIG5vdCB0YWtlIHVwIGFueSBzcGFjZSwgc28gd2Ugc3RvcmUgaXQgaW4gcl9vZmZzZXQuCi0JIFRoZSBmeF9hZGRudW1iZXIgZmllbGQgd2FzIHNldCBpbiBtZF9hcHBseV9maXguICAqLwotICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X2FkZG51bWJlcjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT1VOVCkKLSAgICB7Ci0gICAgICAvKiBXZSBjYW4ndCBzdG9yZSB0aGUgY291bnQgaW4gdGhlIG9iamVjdCBmaWxlLCBzaW5jZSB0aGlzIHJlbG9jCi0gICAgICAgICBkb2VzIG5vdCB0YWtlIHVwIGFueSBzcGFjZSwgc28gd2Ugc3RvcmUgaXQgaW4gcl9vZmZzZXQuICBUaGUKLSAgICAgICAgIGZ4X29mZnNldCBmaWVsZCB3YXMgc2V0IHdoZW4gdGhlIGZpeHVwIHdhcyBjcmVhdGVkIGluCi0gICAgICAgICBzaF9jb2ZmX2Zyb2JfZmlsZS4gICovCi0gICAgICBpbnRyLT5yX29mZnNldCA9IGZpeC0+Znhfb2Zmc2V0OwotICAgICAgLyogVGhpcyByZWxvYyBpcyBhbHdheXMgYWJzb2x1dGUuICAqLwotICAgICAgc3ltYm9sX3B0ciA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04pCi0gICAgewotICAgICAgLyogU3RvcmUgdGhlIGFsaWdubWVudCBpbiB0aGUgcl9vZmZzZXQgZmllbGQuICAqLwotICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X29mZnNldDsKLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWx3YXlzIGFic29sdXRlLiAgKi8KLSAgICAgIHN5bWJvbF9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfREFUQQotCSAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9MQUJFTCkKLSAgICB7Ci0gICAgICAvKiBUaGVzZSByZWxvY3MgYXJlIGFsd2F5cyBhYnNvbHV0ZS4gICovCi0gICAgICBzeW1ib2xfcHRyID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVHVybiB0aGUgc2VnbWVudCBvZiB0aGUgc3ltYm9sIGludG8gYW4gb2Zmc2V0LiAgKi8KLSAgaWYgKHN5bWJvbF9wdHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkb3QgPSBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cildLmRvdDsKLSAgICAgIGlmIChkb3QgIT0gTlVMTCkKLQlpbnRyLT5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOwotICAgICAgZWxzZQotCWludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBDcmVhdGUgYSByZWxvYy4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIHJfdHlwZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLQotICBpZiAoU1dJVENIX1RBQkxFIChmaXhwKSkKLSAgICB7Ci0gICAgICByZWwtPmFkZGVuZCA9IHJlbC0+YWRkcmVzcyAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBpZiAocl90eXBlID09IEJGRF9SRUxPQ18xNikKLQlyX3R5cGUgPSBCRkRfUkVMT0NfU0hfU1dJVENIMTY7Ci0gICAgICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzgpCi0Jcl90eXBlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0gICAgICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzMyKQotCXJfdHlwZSA9IEJGRF9SRUxPQ19TSF9TV0lUQ0gzMjsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfU0hfVVNFUykKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ19TSF9DT1VOVCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ19TSF9BTElHTikKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgICAgICB8fCByX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByX3R5cGUpOwotICBpZiAocmVsLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocl90eXBlKSk7Ci0gICAgICAvKiBTZXQgaG93dG8gdG8gYSBnYXJiYWdlIHZhbHVlIHNvIHRoYXQgd2UgY2FuIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfMzIpOwotICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvICE9IE5VTEwpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zaC5oIGIvZ2FzL2NvbmZpZy90Yy1zaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI3OGMyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtc2guaAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfU0gKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfc2gKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IHNlZ21lbnRfaW5mb19zdHJ1Y3Q7Ci1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7Ci0jZW5kaWYKLQotLyogV2hldGhlciBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuICAqLwotZXh0ZXJuIGludCBzaGw7Ci0KLS8qIFdoZXRoZXIgLXJlbGF4IHdhcyB1c2VkLiAgKi8KLWV4dGVybiBpbnQgc2hfcmVsYXg7Ci0KLS8qIFdoZXRoZXIgLXNtYWxsIHdhcyB1c2VkLiAgKi8KLWV4dGVybiBpbnQgc2hfc21hbGw7Ci0KLS8qIERvbid0IHRyeSB0byBicmVhayB3b3Jkcy4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogV2UgcmVxdWlyZSAubG9uZywgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgc2hfY29uc19hbGlnbiAobmJ5dGVzKQotZXh0ZXJuIHZvaWQgc2hfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBnZW5lcmF0ZSByZWxvY2F0aW9ucyBmb3IgYWxpZ25tZW50Ci0gICBkaXJlY3RpdmVzLiAgKi8KLSNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWcpIHNoX2hhbmRsZV9hbGlnbiAoZnJhZykKLWV4dGVybiB2b2lkIHNoX2hhbmRsZV9hbGlnbiBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLS8qIFdlIG5lZWQgdG8gZm9yY2Ugb3V0IHNvbWUgcmVsb2NhdGlvbnMgd2hlbiByZWxheGluZy4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBzaF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IHNoX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBzaF9maXhfYWRqdXN0YWJsZShmaXhQKQotc3RydWN0IGZpeDsKLWV4dGVybiBib29sZWFuIHNoX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAoc2hsID8gIkhpdGFjaGkgU3VwZXItSCBHQVMgTGl0dGxlIEVuZGlhbiIgOiAiSGl0YWNoaSBTdXBlci1IIEdBUyBCaWcgRW5kaWFuIikKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLS8qIFdlIHVzZSBhIHNwZWNpYWwgYWxpZ25tZW50IGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgY29ycmVjdCBub3AKLSAgIHBhdHRlcm4uICAqLwotZXh0ZXJuIGludCBzaF9kb19hbGlnbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLSNkZWZpbmUgbWRfZG9fYWxpZ24obixmaWxsLGxlbixtYXgsbCkgaWYgKHNoX2RvX2FsaWduIChuLGZpbGwsbGVuLG1heCkpIGdvdG8gbAotCi0vKiBXZSByZWNvcmQsIGZvciBlYWNoIHNlY3Rpb24sIHdoZXRoZXIgd2UgaGF2ZSBtb3N0IHJlY2VudGx5IG91dHB1dCBhCi0gICBDT0RFIHJlbG9jIG9yIGEgREFUQSByZWxvYy4gICovCi1zdHJ1Y3Qgc2hfc2VnbWVudF9pbmZvX3R5cGUKLXsKLSAgaW50IGluX2NvZGUgOiAxOwotfTsKLSNkZWZpbmUgVENfU0VHTUVOVF9JTkZPX1RZUEUgc3RydWN0IHNoX3NlZ21lbnRfaW5mb190eXBlCi0KLS8qIFdlIGNhbGwgYSByb3V0aW5lIHRvIGVtaXQgYSByZWxvYyBmb3IgYSBsYWJlbCwgc28gdGhhdCB0aGUgbGlua2VyCi0gICBjYW4gYWxpZ24gbG9hZHMgYW5kIHN0b3JlcyB3aXRob3V0IGNyb3NzaW5nIGEgbGFiZWwuICAqLwotZXh0ZXJuIHZvaWQgc2hfZnJvYl9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBzaF9mcm9iX2xhYmVsICgpCi0KLS8qIFdlIGNhbGwgYSByb3V0aW5lIHRvIGZsdXNoIHBlbmRpbmcgb3V0cHV0IGluIG9yZGVyIHRvIG91dHB1dCBhIERBVEEKLSAgIHJlbG9jIHdoZW4gcmVxdWlyZWQuICAqLwotZXh0ZXJuIHZvaWQgc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCgpIHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IHNoX2Zyb2JfZmlsZQotI2Vsc2UKLSNkZWZpbmUgdGNfZnJvYl9maWxlIHNoX2Zyb2JfZmlsZQotI2VuZGlmCi1leHRlcm4gdm9pZCBzaF9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0jaWZkZWYgT0JKX0NPRkYKLS8qIENPRkYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeCkgKChmaXgpLT5meF9yX3R5cGUpCi0KLSNkZWZpbmUgQkZEX0FSQ0ggVEFSR0VUX0FSQ0gKLQotI2RlZmluZSBDT0ZGX01BR0lDIChzaGwgPyBTSF9BUkNIX01BR0lDX0xJVFRMRSA6IFNIX0FSQ0hfTUFHSUNfQklHKQotCi0vKiBXZSBuZWVkIHRvIHdyaXRlIG91dCByZWxvY3Mgd2hpY2ggaGF2ZSBub3QgYmVlbiBjb21wbGV0ZWQuICAqLwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhmaXgpICgoZml4KS0+ZnhfYWRkc3kgIT0gTlVMTCkKLQotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUoc2VnLCBmaXgsIGludCwgcGFkZHIpIFwKLSAgc2hfY29mZl9yZWxvY19tYW5nbGUgKChzZWcpLCAoZml4KSwgKGludCksIChwYWRkcikpCi1leHRlcm4gdm9pZCBzaF9jb2ZmX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3Qgc2VnbWVudF9pbmZvX3N0cnVjdCAqLCBzdHJ1Y3QgZml4ICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHVuc2lnbmVkIGludCkpOwotCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKSA7IC8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotCi0jZGVmaW5lIFRDX0tFRVBfRlhfT0ZGU0VUIDEKLQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKLWV4dGVybiBpbnQgdGNfY29mZl9zaXplbWFjaGRlcCBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLS8qIFdlIGFsaWduIG1vc3Qgc2VjdGlvbnMgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LiAgKi8KLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQkJCQkJXAotICAoc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5zdGFic3RyIiwgOCkgPT0gMAkJXAotICAgPyAwCQkJCQkJCQlcCi0gICA6ICgoc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5zdGFiIiwgNSkgPT0gMAlcCi0gICAgICAgfHwgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmN0b3JzIikgPT0gMAlcCi0gICAgICAgfHwgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmR0b3JzIikgPT0gMCkJXAotICAgICAgPyAyCQkJCQkJCVwKLSAgICAgIDogKHNoX3NtYWxsID8gMiA6IDQpKSkKLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSNpZmRlZiBPQkpfRUxGCi0vKiBFTEYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotCi0vKiBXaGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGlzIGJpZyBlbmRpYW4gKi8KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAoc2hsID8gImVsZjMyLXNobCIgOiAiZWxmMzItc2giKQotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0vKiBlbmQgb2YgdGMtc2guaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5jIGIvZ2FzL2NvbmZpZy90Yy1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZThjODkwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MzUgKzAsMCBAQAotLyogdGMtc3BhcmMuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFNQQVJDCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLTk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9zcGFyYy5oIgotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3Qgc3BhcmNfYXJjaCAqbG9va3VwX2FyY2ggUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpbml0X2RlZmF1bHRfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHNwYXJjX2lwIFBBUkFNUyAoKGNoYXIgKiwgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKikpOwotc3RhdGljIGludCBpbl9zaWduZWRfcmFuZ2UgUEFSQU1TICgoYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgaW50IGluX3Vuc2lnbmVkX3JhbmdlIFBBUkFNUyAoKGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBpbnQgaW5fYml0ZmllbGRfcmFuZ2UgUEFSQU1TICgoYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgaW50IHNwYXJjX2ZmcyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHN5bnRoZXRpemVfc2V0dXcgUEFSQU1TICgoY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKSk7Ci1zdGF0aWMgdm9pZCBzeW50aGV0aXplX3NldHN3IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotc3RhdGljIHZvaWQgc3ludGhldGl6ZV9zZXR4IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotc3RhdGljIGJmZF92bWEgQlNSIFBBUkFNUyAoKGJmZF92bWEsIGludCkpOwotc3RhdGljIGludCBjbXBfcmVnX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgaW50IHBhcnNlX2tleXdvcmRfYXJnIFBBUkFNUyAoKGludCAoKikgKGNvbnN0IGNoYXIgKiksIGNoYXIgKiosIGludCAqKSk7Ci1zdGF0aWMgaW50IHBhcnNlX2NvbnN0X2V4cHJfYXJnIFBBUkFNUyAoKGNoYXIgKiosIGludCAqKSk7Ci1zdGF0aWMgaW50IGdldF9leHByZXNzaW9uIFBBUkFNUyAoKGNoYXIgKnN0cikpOwotCi0vKiBEZWZhdWx0IGFyY2hpdGVjdHVyZS4gICovCi0vKiA/Pz8gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIFY4LCBidXQgc3BhcmNsaXRlIHN1cHBvcnQgd2FzIGFkZGVkCi0gICBieSBtYWtpbmcgaXQgdGhlIGRlZmF1bHQuICBHQ0Mgbm93IHBhc3NlcyAtQXNwYXJjbGl0ZSwgc28gbWF5YmUgc29tZXRpbWUgaW4KLSAgIHRoZSBmdXR1cmUgd2UgY2FuIHNldCB0aGlzIHRvIFY4LiAgKi8KLSNpZm5kZWYgREVGQVVMVF9BUkNICi0jZGVmaW5lIERFRkFVTFRfQVJDSCAic3BhcmNsaXRlIgotI2VuZGlmCi1zdGF0aWMgY2hhciAqZGVmYXVsdF9hcmNoID0gREVGQVVMVF9BUkNIOwotCi0vKiBOb24temVybyBpZiB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgYG1heF9hcmNoaXRlY3R1cmUnIGFuZCBgc3BhcmNfYXJjaF9zaXplJwotICAgaGF2ZSBiZWVuIHNldC4gICovCi1zdGF0aWMgaW50IGRlZmF1bHRfaW5pdF9wOwotCi0vKiBDdXJyZW50IGFyY2hpdGVjdHVyZS4gIFdlIGRvbid0IGJ1bXAgdXAgdW5sZXNzIG5lY2Vzc2FyeS4gICovCi1zdGF0aWMgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgY3VycmVudF9hcmNoaXRlY3R1cmUgPSBTUEFSQ19PUENPREVfQVJDSF9WNjsKLQotLyogVGhlIG1heGltdW0gYXJjaGl0ZWN0dXJlIGxldmVsIHdlIGNhbiBidW1wIHVwIHRvLgotICAgSW4gYSAzMiBiaXQgZW52aXJvbm1lbnQsIGRvbid0IGFsbG93IGJ1bXBpbmcgdXAgdG8gdjkgYnkgZGVmYXVsdC4KLSAgIFRoZSBuYXRpdmUgYXNzZW1ibGVyIHdvcmtzIHRoaXMgd2F5LiAgVGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gcGFzcwotICAgYW4gZXhwbGljaXQgYXJndW1lbnQgYmVmb3JlIHdlJ2xsIGNyZWF0ZSB2OSBvYmplY3QgZmlsZXMuICBIb3dldmVyLCBpZgotICAgd2UgZG9uJ3Qgc2VlIGFueSB2OSBpbnNucywgYSB2OHBsdXMgb2JqZWN0IGZpbGUgaXMgbm90IGNyZWF0ZWQuICAqLwotc3RhdGljIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIG1heF9hcmNoaXRlY3R1cmU7Ci0KLS8qIEVpdGhlciAzMiBvciA2NCwgc2VsZWN0cyBmaWxlIGZvcm1hdC4gICovCi1zdGF0aWMgaW50IHNwYXJjX2FyY2hfc2l6ZTsKLS8qIEluaXRpYWwgKGRlZmF1bHQpIHZhbHVlLCByZWNvcmRlZCBzZXBhcmF0ZWx5IGluIGNhc2UgYSB1c2VyIG9wdGlvbgotICAgY2hhbmdlcyB0aGUgdmFsdWUgYmVmb3JlIG1kX3Nob3dfdXNhZ2UgaXMgY2FsbGVkLiAgKi8KLXN0YXRpYyBpbnQgZGVmYXVsdF9hcmNoX3NpemU7Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHY5IG1lbW9yeSBtb2RlbC4gIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yCi0gICBFTEYuICAqLwotc3RhdGljIGVudW0geyBNTV9UU08sIE1NX1BTTywgTU1fUk1PIH0gc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fUk1POwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZDsKLXN0YXRpYyBpbnQgd2Fybl9vbl9idW1wOwotCi0vKiBJZiB3YXJuX29uX2J1bXAgYW5kIHRoZSBuZWVkZWQgYXJjaGl0ZWN0dXJlIGlzIGhpZ2hlciB0aGFuIHRoaXMKLSAgIGFyY2hpdGVjdHVyZSwgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLXN0YXRpYyBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZTsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIGdlbmVyYXRpbmcgUElDIGNvZGUuICAqLwotaW50IHNwYXJjX3BpY19jb2RlOwotCi0vKiBOb24temVybyBpZiB3ZSBzaG91bGQgZ2l2ZSBhbiBlcnJvciB3aGVuIG1pc2FsaWduZWQgZGF0YSBpcyBzZWVuLiAgKi8KLXN0YXRpYyBpbnQgZW5mb3JjZV9hbGlnbmVkX2RhdGE7Ci0KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLXN0YXRpYyBpbnQgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YTsKLQotLyogVjkgYW5kIDg2eCBoYXZlIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBkYXRhLCBidXQgaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgYmlnCi0gICBlbmRpYW4uICBUaGUgc3BhcmNsZXQgaGFzIGJpLWVuZGlhbiBzdXBwb3J0IGJ1dCBib3RoIGRhdGEgYW5kIGluc25zIGhhdmUKLSAgIHRoZSBzYW1lIGVuZGlhbm5lc3MuICBHbG9iYWwgYHRhcmdldF9iaWdfZW5kaWFuJyBpcyB1c2VkIGZvciBkYXRhLgotICAgVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIGZvciBpbnN0cnVjdGlvbnMuICAqLwotI2lmbmRlZiBJTlNOX0JJR19FTkRJQU4KLSNkZWZpbmUgSU5TTl9CSUdfRU5ESUFOICh0YXJnZXRfYmlnX2VuZGlhbiBcCi0JCQkgfHwgZGVmYXVsdF9hcmNoX3R5cGUgPT0gc3BhcmM4NnggXAotCQkJIHx8IFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotI2VuZGlmCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotCi1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfc2VnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZXNlcnZlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb21tb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2VtcHR5IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc191YWNvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX25jb25zIFBBUkFNUyAoKGludCkpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCS8qIERlZmF1bHRpbmcgaXMgaW52YWxpZCAoMCkgKi8KLSAgeyJjb21tb24iLCBzX2NvbW1vbiwgMH0sCi0gIHsiZW1wdHkiLCBzX2VtcHR5LCAwfSwKLSAgeyJnbG9iYWwiLCBzX2dsb2JsLCAwfSwKLSAgeyJoYWxmIiwgY29ucywgMn0sCi0gIHsibndvcmQiLCBzX25jb25zLCAwfSwKLSAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJwcm9jIiwgc19wcm9jLCAwfSwKLSAgeyJyZXNlcnZlIiwgc19yZXNlcnZlLCAwfSwKLSAgeyJzZWciLCBzX3NlZywgMH0sCi0gIHsic2tpcCIsIHNfc3BhY2UsIDB9LAotICB7IndvcmQiLCBjb25zLCA0fSwKLSAgeyJ4d29yZCIsIGNvbnMsIDh9LAotICB7InVhaGFsZiIsIHNfdWFjb25zLCAyfSwKLSAgeyJ1YXdvcmQiLCBzX3VhY29ucywgNH0sCi0gIHsidWF4d29yZCIsIHNfdWFjb25zLCA4fSwKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBzcGFyYy9zdnI0ICovCi0gIHsiMmJ5dGUiLCBzX3VhY29ucywgMn0sCi0gIHsiNGJ5dGUiLCBzX3VhY29ucywgNH0sCi0gIHsiOGJ5dGUiLCBzX3VhY29ucywgOH0sCi0jZW5kaWYKLSAge05VTEwsIDAsIDB9LAotfTsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7CS8qIEpGIHJlbW92ZWQgJ3wnIGZyb20gY29tbWVudF9jaGFycyAqLwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgc3RhcnRlZCBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzCi0gICB3b3JrIGlmICcvJyBpc24ndCBvdGhlcndpc2UgZGVmaW5lZC4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi0jZGVmaW5lIGlzb2N0YWwoYykgICgodW5zaWduZWQpKChjKSAtICcwJykgPCAnOCcpCi0KLXN0cnVjdCBzcGFyY19pdAotICB7Ci0gICAgY2hhciAqZXJyb3I7Ci0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gICAgc3RydWN0IG5saXN0ICpubGlzdHA7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGV4cHJlc3Npb25TIGV4cDI7Ci0gICAgaW50IHBjcmVsOwotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgfTsKLQotc3RydWN0IHNwYXJjX2l0IHRoZV9pbnNuLCBzZXRfaW5zbjsKLQotc3RhdGljIHZvaWQgb3V0cHV0X2luc24KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqLCBzdHJ1Y3Qgc3BhcmNfaXQgKikpOwotDAotLyogVGFibGUgb2YgYXJndW1lbnRzIHRvIC1BLgotICAgVGhlIHNwYXJjX29wY29kZV9hcmNoIHRhYmxlIGluIHNwYXJjLW9wYy5jIGlzIGluc3VmZmljaWVudCBhbmQgaW5jb3JyZWN0Ci0gICBmb3IgdGhpcyB1c2UuICBUaGF0IHRhYmxlIGlzIGZvciBvcGNvZGVzIG9ubHkuICBUaGlzIHRhYmxlIGlzIGZvciBvcGNvZGVzCi0gICBhbmQgZmlsZSBmb3JtYXRzLiAgKi8KLQotZW51bSBzcGFyY19hcmNoX3R5cGVzIHt2NiwgdjcsIHY4LCBzcGFyY2xldCwgc3BhcmNsaXRlLCBzcGFyYzg2eCwgdjhwbHVzLAotCQkgICAgICAgdjhwbHVzYSwgdjksIHY5YSwgdjlfNjR9OwotCi1zdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggewotICBjaGFyICpuYW1lOwotICBjaGFyICpvcGNvZGVfYXJjaDsKLSAgZW51bSBzcGFyY19hcmNoX3R5cGVzIGFyY2hfdHlwZTsKLSAgLyogRGVmYXVsdCB3b3JkIHNpemUsIGFzIHNwZWNpZmllZCBkdXJpbmcgY29uZmlndXJhdGlvbi4KLSAgICAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIGNhbid0IGJlIHVzZWQgdG8gc3BlY2lmeSBkZWZhdWx0IGFyY2hpdGVjdHVyZS4gICovCi0gIGludCBkZWZhdWx0X2FyY2hfc2l6ZTsKLSAgLyogQWxsb3dhYmxlIGFyZyB0byAtQT8gICovCi0gIGludCB1c2VyX29wdGlvbl9wOwotfSBzcGFyY19hcmNoX3RhYmxlW10gPSB7Ci0gIHsgInY2IiwgInY2IiwgdjYsIDAsIDEgfSwKLSAgeyAidjciLCAidjciLCB2NywgMCwgMSB9LAotICB7ICJ2OCIsICJ2OCIsIHY4LCAzMiwgMSB9LAotICB7ICJzcGFyY2xldCIsICJzcGFyY2xldCIsIHNwYXJjbGV0LCAzMiwgMSB9LAotICB7ICJzcGFyY2xpdGUiLCAic3BhcmNsaXRlIiwgc3BhcmNsaXRlLCAzMiwgMSB9LAotICB7ICJzcGFyYzg2eCIsICJzcGFyY2xpdGUiLCBzcGFyYzg2eCwgMzIsIDEgfSwKLSAgeyAidjhwbHVzIiwgInY5IiwgdjksIDAsIDEgfSwKLSAgeyAidjhwbHVzYSIsICJ2OWEiLCB2OSwgMCwgMSB9LAotICB7ICJ2OSIsICJ2OSIsIHY5LCAwLCAxIH0sCi0gIHsgInY5YSIsICJ2OWEiLCB2OSwgMCwgMSB9LAotICAvKiBUaGlzIGV4aXN0cyB0byBhbGxvdyBjb25maWd1cmUuaW4vTWFrZWZpbGUuaW4gdG8gcGFzcyBvbmUKLSAgICAgdmFsdWUgdG8gc3BlY2lmeSBib3RoIHRoZSBkZWZhdWx0IG1hY2hpbmUgYW5kIGRlZmF1bHQgd29yZCBzaXplLiAgKi8KLSAgeyAidjktNjQiLCAidjkiLCB2OSwgNjQsIDAgfSwKLSAgeyBOVUxMLCBOVUxMLCB2OCwgMCwgMCB9Ci19OwotCi0vKiBWYXJpYW50IG9mIGRlZmF1bHRfYXJjaCAqLwotc3RhdGljIGVudW0gc3BhcmNfYXJjaF90eXBlcyBkZWZhdWx0X2FyY2hfdHlwZTsKLQotc3RhdGljIHN0cnVjdCBzcGFyY19hcmNoICoKLWxvb2t1cF9hcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgc3BhcmNfYXJjaCAqc2E7Ci0KLSAgZm9yIChzYSA9ICZzcGFyY19hcmNoX3RhYmxlWzBdOyBzYS0+bmFtZSAhPSBOVUxMOyBzYSsrKQotICAgIGlmIChzdHJjbXAgKHNhLT5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChzYS0+bmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gc2E7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgb3Bjb2RlIGFyY2ggYW5kIHdvcmQgc2l6ZSBmcm9tIHRoZSBkZWZhdWx0Ci0gICBhcmNoaXRlY3R1cmUgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1pbml0X2RlZmF1bHRfYXJjaCAoKQotewotICBzdHJ1Y3Qgc3BhcmNfYXJjaCAqc2EgPSBsb29rdXBfYXJjaCAoZGVmYXVsdF9hcmNoKTsKLQotICBpZiAoc2EgPT0gTlVMTAotICAgICAgfHwgc2EtPmRlZmF1bHRfYXJjaF9zaXplID09IDApCi0gICAgYXNfZmF0YWwgKF8oIkludmFsaWQgZGVmYXVsdCBhcmNoaXRlY3R1cmUsIGJyb2tlbiBhc3NlbWJsZXIuIikpOwotCi0gIG1heF9hcmNoaXRlY3R1cmUgPSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKHNhLT5vcGNvZGVfYXJjaCk7Ci0gIGlmIChtYXhfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX0JBRCkKLSAgICBhc19mYXRhbCAoXygiQmFkIG9wY29kZSB0YWJsZSwgYnJva2VuIGFzc2VtYmxlci4iKSk7Ci0gIGRlZmF1bHRfYXJjaF9zaXplID0gc3BhcmNfYXJjaF9zaXplID0gc2EtPmRlZmF1bHRfYXJjaF9zaXplOwotICBkZWZhdWx0X2luaXRfcCA9IDE7Ci0gIGRlZmF1bHRfYXJjaF90eXBlID0gc2EtPmFyY2hfdHlwZTsKLX0KLQotLyogQ2FsbGVkIGJ5IFRBUkdFVF9GT1JNQVQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIHdlJ3JlIGNhbGxlZCwKLSAgICAgc28gaGFuZGxlIHRoYXQgbm93LiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIFRFX05ldEJTRAotICByZXR1cm4gImEub3V0LXNwYXJjLW5ldGJzZCI7Ci0jZWxzZQotI2lmZGVmIFRFX1NQQVJDQU9VVAotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgcmV0dXJuICJhLm91dC1zdW5vcy1iaWciOwotICBlbHNlIGlmIChkZWZhdWx0X2FyY2hfdHlwZSA9PSBzcGFyYzg2eCAmJiB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhKQotICAgIHJldHVybiAiYS5vdXQtc3Vub3MtYmlnIjsKLSAgZWxzZSByZXR1cm4gImEub3V0LXNwYXJjLWxpdHRsZSI7Ci0jZWxzZQotICByZXR1cm4gImEub3V0LXN1bm9zLWJpZyI7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQk9VVAotICByZXR1cm4gImIub3V0LmJpZyI7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfTFlOWAotICByZXR1cm4gImNvZmYtc3BhcmMtbHlueCI7Ci0jZWxzZQotICByZXR1cm4gImNvZmYtc3BhcmMiOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgcmV0dXJuIHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCA/ICJlbGY2NC1zcGFyYyIgOiAiZWxmMzItc3BhcmMiOwotI2VuZGlmCi0KLSAgYWJvcnQgKCk7Ci19Ci0MCi0vKgotICogbWRfcGFyc2Vfb3B0aW9uCi0gKglJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICoJU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgVGhlc2UgYXJlOgotICoKLSAqCS1idW1wCi0gKgkJV2FybiBvbiBhcmNoaXRlY3R1cmUgYnVtcHMuICBTZWUgYWxzbyAtQS4KLSAqCi0gKgktQXY2LCAtQXY3LCAtQXY4LCAtQXNwYXJjbGl0ZSwgLUFzcGFyY2xldAotICoJCVN0YW5kYXJkIDMyIGJpdCBhcmNoaXRlY3R1cmVzLgotICoJLUF2OHBsdXMsIC1BdjhwbHVzYQotICoJCVNwYXJjNjQgaW4gYSAzMiBiaXQgd29ybGQuCi0gKgktQXY5LCAtQXY5YQotICoJCVNwYXJjNjQgaW4gZWl0aGVyIGEgMzIgb3IgNjQgYml0IHdvcmxkICgtMzIvLTY0IHNheXMgd2hpY2gpLgotICoJCVRoaXMgdXNlZCB0byBvbmx5IG1lYW4gNjQgYml0cywgYnV0IHByb3Blcmx5IHNwZWNpZnlpbmcgaXQKLSAqCQljb21wbGljYXRlZCBnY2MncyBBU01fU1BFQ3MsIHNvIG5vdyBvcGNvZGUgc2VsZWN0aW9uIGlzCi0gKgkJc3BlY2lmaWVkIG9ydGhvZ29uYWxseSB0byB3b3JkIHNpemUgKGV4Y2VwdCB3aGVuIHNwZWNpZnlpbmcKLSAqCQl0aGUgZGVmYXVsdCwgYnV0IHRoYXQgaXMgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsKS4KLSAqCS14YXJjaD12OHBsdXMsIC14YXJjaD12OHBsdXNhCi0gKgkJU2FtZSBhcyAtQXY4cGx1c3ssYX0sIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3VuJ3MgYXNzZW1ibGVyLgotICoKLSAqCQlTZWxlY3QgdGhlIGFyY2hpdGVjdHVyZSBhbmQgcG9zc2libHkgdGhlIGZpbGUgZm9ybWF0LgotICoJCUluc3RydWN0aW9ucyBvciBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZAotICoJCWFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbCBlcnJvcnMuCi0gKgotICoJCVRoZSBkZWZhdWx0IGlzIHRvIHN0YXJ0IGF0IHY2LCBhbmQgYnVtcCB0aGUgYXJjaGl0ZWN0dXJlIHVwCi0gKgkJd2hlbmV2ZXIgYW4gaW5zdHJ1Y3Rpb24gaXMgc2VlbiBhdCBhIGhpZ2hlciBsZXZlbC4gIEluIDMyIGJpdAotICoJCWVudmlyb25tZW50cywgdjkgaXMgbm90IGJ1bXBlZCB1cCB0bywgdGhlIHVzZXIgbXVzdCBwYXNzCi0gKiAJCS1BdjhwbHVzeyxhfS4KLSAqCi0gKgkJSWYgLWJ1bXAgaXMgc3BlY2lmaWVkLCBhIHdhcm5pbmcgaXMgcHJpbnRpbmcgd2hlbiBidW1waW5nIHRvCi0gKgkJaGlnaGVyIGxldmVscy4KLSAqCi0gKgkJSWYgYW4gYXJjaGl0ZWN0dXJlIGlzIHNwZWNpZmllZCwgYWxsIGluc3RydWN0aW9ucyBtdXN0IG1hdGNoCi0gKgkJdGhhdCBhcmNoaXRlY3R1cmUuICBBbnkgaGlnaGVyIGxldmVsIGluc3RydWN0aW9ucyBhcmUgZmxhZ2dlZAotICoJCWFzIGVycm9ycy4gIE5vdGUgdGhhdCBpbiB0aGUgMzIgYml0IGVudmlyb25tZW50IHNwZWNpZnlpbmcKLSAqCQktQXY4cGx1cyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHY4cGx1cyBvYmplY3QgZmlsZSwgYQotICoJCXY5IGluc24gbXVzdCBiZSBzZWVuLgotICoKLSAqCQlJZiBib3RoIGFuIGFyY2hpdGVjdHVyZSBhbmQgLWJ1bXAgYXJlIHNwZWNpZmllZCwgdGhlCi0gKgkJYXJjaGl0ZWN0dXJlIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIGxldmVsLCBidXQgYnVtcHMgYXJlCi0gKgkJd2FybmluZ3MuICBOb3RlIHRoYXQgd2UgY2FuJ3Qgc2V0IGBjdXJyZW50X2FyY2hpdGVjdHVyZScgdG8KLSAqCQl0aGUgcmVxdWVzdGVkIGxldmVsIGluIHRoaXMgY2FzZTogaW4gdGhlIDMyIGJpdCBlbnZpcm9ubWVudCwKLSAqCQl3ZSBzdGlsbCBtdXN0IGF2b2lkIGNyZWF0aW5nIHY4cGx1cyBvYmplY3QgZmlsZXMgdW5sZXNzIHY5Ci0gKiAJCWluc25zIGFyZSBzZWVuLgotICoKLSAqIE5vdGU6Ci0gKgkJQnVtcGluZyBiZXR3ZWVuIGluY29tcGF0aWJsZSBhcmNoaXRlY3R1cmVzIGlzIGFsd2F5cyBhbgotICoJCWVycm9yLiAgRm9yIGV4YW1wbGUsIGZyb20gc3BhcmNsaXRlIHRvIHY5LgotICovCi0KLSNpZmRlZiBPQkpfRUxGCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQTpLOlZROnNxIjsKLSNlbHNlCi0jaWZkZWYgT0JKX0FPVVQKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOmsiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOiI7Ci0jZW5kaWYKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fQlVNUCAoT1BUSU9OX01EX0JBU0UpCi0gIHsiYnVtcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQlVNUH0sCi0jZGVmaW5lIE9QVElPTl9TUEFSQyAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7InNwYXJjIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUEFSQ30sCi0jZGVmaW5lIE9QVElPTl9YQVJDSCAoT1BUSU9OX01EX0JBU0UgKyAyKQotICB7InhhcmNoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9YQVJDSH0sCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBPUFRJT05fMzIgKE9QVElPTl9NRF9CQVNFICsgMykKLSAgeyIzMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fMzJ9LAotI2RlZmluZSBPUFRJT05fNjQgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyI2NCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fNjR9LAotI2RlZmluZSBPUFRJT05fVFNPIChPUFRJT05fTURfQkFTRSArIDUpCi0gIHsiVFNPIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UU099LAotI2RlZmluZSBPUFRJT05fUFNPIChPUFRJT05fTURfQkFTRSArIDYpCi0gIHsiUFNPIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QU099LAotI2RlZmluZSBPUFRJT05fUk1PIChPUFRJT05fTURfQkFTRSArIDcpCi0gIHsiUk1PIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9STU99LAotI2VuZGlmCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSNkZWZpbmUgT1BUSU9OX0xJVFRMRV9FTkRJQU4gKE9QVElPTl9NRF9CQVNFICsgOCkKLSAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFX0VORElBTn0sCi0jZGVmaW5lIE9QVElPTl9CSUdfRU5ESUFOIChPUFRJT05fTURfQkFTRSArIDkpCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJR19FTkRJQU59LAotI2VuZGlmCi0jZGVmaW5lIE9QVElPTl9FTkZPUkNFX0FMSUdORURfREFUQSAoT1BUSU9OX01EX0JBU0UgKyAxMCkKLSAgeyJlbmZvcmNlLWFsaWduZWQtZGF0YSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5GT1JDRV9BTElHTkVEX0RBVEF9LAotI2RlZmluZSBPUFRJT05fTElUVExFX0VORElBTl9EQVRBIChPUFRJT05fTURfQkFTRSArIDExKQotICB7ImxpdHRsZS1lbmRpYW4tZGF0YSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFX0VORElBTl9EQVRBfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIHdlJ3JlIGNhbGxlZCwKLSAgICAgc28gaGFuZGxlIHRoYXQgbm93LiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9CVU1QOgotICAgICAgd2Fybl9vbl9idW1wID0gMTsKLSAgICAgIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlID0gU1BBUkNfT1BDT0RFX0FSQ0hfVjY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1hBUkNIOgotICAgICAgLyogVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFN1bidzIGFzc2VtYmxlci4gICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICJ2OHBsdXMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFyZywgInY4cGx1c2EiKSAhPSAwKQotCXsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgLXhhcmNoPSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICB7Ci0Jc3RydWN0IHNwYXJjX2FyY2ggKnNhOwotCWVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIG9wY29kZV9hcmNoOwotCi0Jc2EgPSBsb29rdXBfYXJjaCAoYXJnKTsKLQlpZiAoc2EgPT0gTlVMTAotCSAgICB8fCAhIHNhLT51c2VyX29wdGlvbl9wKQotCSAgewotCSAgICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC1BJXMiKSwgYXJnKTsKLQkgICAgcmV0dXJuIDA7Ci0JICB9Ci0KLQlvcGNvZGVfYXJjaCA9IHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAoc2EtPm9wY29kZV9hcmNoKTsKLQlpZiAob3Bjb2RlX2FyY2ggPT0gU1BBUkNfT1BDT0RFX0FSQ0hfQkFEKQotCSAgYXNfZmF0YWwgKF8oIkJhZCBvcGNvZGUgdGFibGUsIGJyb2tlbiBhc3NlbWJsZXIuIikpOwotCi0JbWF4X2FyY2hpdGVjdHVyZSA9IG9wY29kZV9hcmNoOwotCWFyY2hpdGVjdHVyZV9yZXF1ZXN0ZWQgPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TUEFSQzoKLSAgICAgIC8qIElnbm9yZSAtc3BhcmMsIHVzZWQgYnkgU3VuT1MgbWFrZSBkZWZhdWx0IC5zLm8gcnVsZS4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VORk9SQ0VfQUxJR05FRF9EQVRBOgotICAgICAgZW5mb3JjZV9hbGlnbmVkX2RhdGEgPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBTUEFSQ19CSUVORElBTgotICAgIGNhc2UgT1BUSU9OX0xJVFRMRV9FTkRJQU46Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBpZiAoZGVmYXVsdF9hcmNoX3R5cGUgIT0gc3BhcmNsZXQpCi0JYXNfZmF0YWwgKCJUaGlzIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IC1FTCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTElUVExFX0VORElBTl9EQVRBOgotICAgICAgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSA9IDE7Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBpZiAoZGVmYXVsdF9hcmNoX3R5cGUgIT0gc3BhcmM4NngKLQkgICYmIGRlZmF1bHRfYXJjaF90eXBlICE9IHY5KQotCWFzX2ZhdGFsICgiVGhpcyB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCAtLWxpdHRsZS1lbmRpYW4tZGF0YSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fQklHX0VORElBTjoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQU9VVAotICAgIGNhc2UgJ2snOgotICAgICAgc3BhcmNfcGljX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIE9QVElPTl8zMjoKLSAgICBjYXNlIE9QVElPTl82NDoKLSAgICAgIHsKLQljb25zdCBjaGFyICoqbGlzdCwgKipsOwotCi0Jc3BhcmNfYXJjaF9zaXplID0gYyA9PSBPUFRJT05fMzIgPyAzMiA6IDY0OwotCWxpc3QgPSBiZmRfdGFyZ2V0X2xpc3QgKCk7Ci0JZm9yIChsID0gbGlzdDsgKmwgIT0gTlVMTDsgbCsrKQotCSAgewotCSAgICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDMyKQotCSAgICAgIHsKLQkJaWYgKHN0cmNtcCAoKmwsICJlbGYzMi1zcGFyYyIpID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoc3RyY21wICgqbCwgImVsZjY0LXNwYXJjIikgPT0gMCkKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKCpsID09IE5VTEwpCi0JICBhc19mYXRhbCAoXygiTm8gY29tcGlsZWQgaW4gc3VwcG9ydCBmb3IgJWQgYml0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgc3BhcmNfYXJjaF9zaXplKTsKLQlmcmVlIChsaXN0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFNPOgotICAgICAgc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fVFNPOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QU086Ci0gICAgICBzcGFyY19tZW1vcnlfbW9kZWwgPSBNTV9QU087Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1JNTzoKLSAgICAgIHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1JNTzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICBwcmludF92ZXJzaW9uX2lkICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdRJzoKLSAgICAgIC8qIFF5IC0gZG8gZW1pdCAuY29tbWVudAotCSBRbiAtIGRvIG5vdCBlbWl0IC5jb21tZW50ICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgLyogdXNlIC5zdGFiIGluc3RlYWQgb2YgLnN0YWIuZXhjbCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdxJzoKLSAgICAgIC8qIHF1aWNrIC0tIG5hdGl2ZSBhc3NlbWJsZXIgZG9lcyBmZXdlciBjaGVja3MgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSyc6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsICJQSUMiKSAhPSAwKQotCWFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBvcHRpb24gZm9sbG93aW5nIC1LIikpOwotICAgICAgZWxzZQotCXNwYXJjX3BpY19jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX2FyY2ggKmFyY2g7Ci0KLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIHdlJ3JlIGNhbGxlZCwKLSAgICAgc28gaGFuZGxlIHRoYXQgbm93LiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSAgZnByaW50ZihzdHJlYW0sIF8oIlNQQVJDIG9wdGlvbnM6XG4iKSk7Ci0gIGZvciAoYXJjaCA9ICZzcGFyY19hcmNoX3RhYmxlWzBdOyBhcmNoLT5uYW1lOyBhcmNoKyspCi0gICAgewotICAgICAgaWYgKGFyY2ggIT0gJnNwYXJjX2FyY2hfdGFibGVbMF0pCi0JZnByaW50ZiAoc3RyZWFtLCAiIHwgIik7Ci0gICAgICBpZiAoYXJjaC0+dXNlcl9vcHRpb25fcCkKLQlmcHJpbnRmIChzdHJlYW0sICItQSVzIiwgYXJjaC0+bmFtZSk7Ci0gICAgfQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIFNQQVJDIGFyY2hpdGVjdHVyZVxuXAotLWJ1bXAJCQl3YXJuIHdoZW4gYXNzZW1ibGVyIHN3aXRjaGVzIGFyY2hpdGVjdHVyZXNcblwKLS1zcGFyYwkJCWlnbm9yZWRcblwKLS0tZW5mb3JjZS1hbGlnbmVkLWRhdGEJZm9yY2UgLmxvbmcsIGV0Yy4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5XG4iKSk7Ci0jaWZkZWYgT0JKX0FPVVQKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tawkJCWdlbmVyYXRlIFBJQ1xuIikpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS0zMgkJCWNyZWF0ZSAzMiBiaXQgb2JqZWN0IGZpbGVcblwKLS02NAkJCWNyZWF0ZSA2NCBiaXQgb2JqZWN0IGZpbGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0JCQlbZGVmYXVsdCBpcyAlZF1cbiIpLCBkZWZhdWx0X2FyY2hfc2l6ZSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLVRTTwkJCXVzZSBUb3RhbCBTdG9yZSBPcmRlcmluZ1xuXAotLVBTTwkJCXVzZSBQYXJ0aWFsIFN0b3JlIE9yZGVyaW5nXG5cCi0tUk1PCQkJdXNlIFJlbGF4ZWQgTWVtb3J5IE9yZGVyaW5nXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotCQkJW2RlZmF1bHQgaXMgJXNdXG4iKSwgKGRlZmF1bHRfYXJjaF9zaXplID09IDY0KSA/ICJSTU8iIDogIlRTTyIpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1LUElDCQkJZ2VuZXJhdGUgUElDXG5cCi0tVgkJCXByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlclxuXAotLXEJCQlpZ25vcmVkXG5cCi0tUXksIC1RbgkJaWdub3JlZFxuXAotLXMJCQlpZ25vcmVkXG4iKSk7Ci0jZW5kaWYKLSNpZmRlZiBTUEFSQ19CSUVORElBTgotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1FTAkJCWdlbmVyYXRlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lXG5cCi0tRUIJCQlnZW5lcmF0ZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZVxuXAotLS1saXR0bGUtZW5kaWFuLWRhdGEJZ2VuZXJhdGUgY29kZSBmb3IgYSBtYWNoaW5lIGhhdmluZyBiaWcgZW5kaWFuXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMgYW5kIGxpdHRsZSBlbmRpYW4gZGF0YS4iKSk7Ci0jZW5kaWYKLX0KLQwKLS8qIG5hdGl2ZSBvcGVyYW5kIHNpemUgb3Bjb2RlIHRyYW5zbGF0aW9uICovCi1zdHJ1Y3QKLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgY2hhciAqbmFtZTMyOwotICAgIGNoYXIgKm5hbWU2NDsKLSAgfSBuYXRpdmVfb3BfdGFibGVbXSA9Ci17Ci0gIHsibGRuIiwgImxkIiwgImxkeCJ9LAotICB7ImxkbmEiLCAibGRhIiwgImxkeGEifSwKLSAgeyJzdG4iLCAic3QiLCAic3R4In0sCi0gIHsic3RuYSIsICJzdGEiLCAic3R4YSJ9LAotICB7InNsbG4iLCAic2xsIiwgInNsbHgifSwKLSAgeyJzcmxuIiwgInNybCIsICJzcmx4In0sCi0gIHsic3JhbiIsICJzcmEiLCAic3JheCJ9LAotICB7ImNhc24iLCAiY2FzIiwgImNhc3gifSwKLSAgeyJjYXNuYSIsICJjYXNhIiwgImNhc3hhIn0sCi0gIHsiY2xybiIsICJjbHIiLCAiY2xyeCJ9LAotICB7TlVMTCwgTlVMTCwgTlVMTH0sCi19OwotDAotLyogc3BhcmM2NCBwcml2aWxlZGdlZCByZWdpc3RlcnMgKi8KLQotc3RydWN0IHByaXZfcmVnX2VudHJ5Ci0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCByZWdudW07Ci0gIH07Ci0KLXN0cnVjdCBwcml2X3JlZ19lbnRyeSBwcml2X3JlZ190YWJsZVtdID0KLXsKLSAgeyJ0cGMiLCAwfSwKLSAgeyJ0bnBjIiwgMX0sCi0gIHsidHN0YXRlIiwgMn0sCi0gIHsidHQiLCAzfSwKLSAgeyJ0aWNrIiwgNH0sCi0gIHsidGJhIiwgNX0sCi0gIHsicHN0YXRlIiwgNn0sCi0gIHsidGwiLCA3fSwKLSAgeyJwaWwiLCA4fSwKLSAgeyJjd3AiLCA5fSwKLSAgeyJjYW5zYXZlIiwgMTB9LAotICB7ImNhbnJlc3RvcmUiLCAxMX0sCi0gIHsiY2xlYW53aW4iLCAxMn0sCi0gIHsib3RoZXJ3aW4iLCAxM30sCi0gIHsid3N0YXRlIiwgMTR9LAotICB7ImZxIiwgMTV9LAotICB7InZlciIsIDMxfSwKLSAgeyIiLCAtMX0sCQkJLyogZW5kIG1hcmtlciAqLwotfTsKLQotLyogdjlhIHNwZWNpZmljIGFzcnMgKi8KLQotc3RydWN0IHByaXZfcmVnX2VudHJ5IHY5YV9hc3JfdGFibGVbXSA9Ci17Ci0gIHsidGlja19jbXByIiwgMjN9LAotICB7InNvZnRpbnQiLCAyMn0sCi0gIHsic2V0X3NvZnRpbnQiLCAyMH0sCi0gIHsicGljIiwgMTd9LAotICB7InBjciIsIDE2fSwKLSAgeyJnc3IiLCAxOX0sCi0gIHsiZGNyIiwgMTh9LAotICB7ImNsZWFyX3NvZnRpbnQiLCAyMX0sCi0gIHsiIiwgLTF9LAkJCS8qIGVuZCBtYXJrZXIgKi8KLX07Ci0KLXN0YXRpYyBpbnQKLWNtcF9yZWdfZW50cnkgKHBhcmcsIHFhcmcpCi0gICAgIGNvbnN0IFBUUiBwYXJnOwotICAgICBjb25zdCBQVFIgcWFyZzsKLXsKLSAgY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gKGNvbnN0IHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqKSBwYXJnOwotICBjb25zdCBzdHJ1Y3QgcHJpdl9yZWdfZW50cnkgKnEgPSAoY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICopIHFhcmc7Ci0KLSAgcmV0dXJuIHN0cmNtcCAocS0+bmFtZSwgcC0+bmFtZSk7Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgaW50IGxvc2UgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIG1kX3BhcnNlX29wdGlvbgotICAgICBpcyBjYWxsZWQsIGFuZCBpdCBtYXkgbm90IGJlIGNhbGxlZCwgc28gaGFuZGxlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24KLSAgICAgbm93IGlmIG5vdCBhbHJlYWR5IGRvbmUuICAqLwotICBpZiAoISBkZWZhdWx0X2luaXRfcCkKLSAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgd2hpbGUgKGkgPCAodW5zaWduZWQgaW50KSBzcGFyY19udW1fb3Bjb2RlcykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChQVFIpICZzcGFyY19vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIkludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKLQkJICBzcGFyY19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICBsb3NlID0gMTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmIChzcGFyY19vcGNvZGVzW2ldLm1hdGNoICYgc3BhcmNfb3Bjb2Rlc1tpXS5sb3NlKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIpLAotCQkgICAgICBzcGFyY19vcGNvZGVzW2ldLm5hbWUsIHNwYXJjX29wY29kZXNbaV0uYXJncyk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoaSA8ICh1bnNpZ25lZCBpbnQpIHNwYXJjX251bV9vcGNvZGVzCi0JICAgICAmJiAhc3RyY21wIChzcGFyY19vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgbmF0aXZlX29wX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICAgICAgY2hhciAqbmFtZSA9IHNwYXJjX2FyY2hfc2l6ZSA9PSAzMiA/IG5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lMzIgOgotCQkJbmF0aXZlX29wX3RhYmxlW2ldLm5hbWU2NDsKLSAgICAgIGluc24gPSAoc3RydWN0IHNwYXJjX29wY29kZSAqKWhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7Ci0gICAgICBpZiAoaW5zbiA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgZmluZCBvcGNvZGUgYCVzJyBmb3IgYCVzJ1xuIiksCi0gICAgICAgICAgCSAgbmFtZSwgbmF0aXZlX29wX3RhYmxlW2ldLm5hbWUpOwotICAgICAgICAgIGxvc2UgPSAxOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0JewotCSAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lLCAoUFRSKSBpbnNuKTsKLQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLAotCQkgICAgICBzcGFyY19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChsb3NlKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotICBxc29ydCAocHJpdl9yZWdfdGFibGUsIHNpemVvZiAocHJpdl9yZWdfdGFibGUpIC8gc2l6ZW9mIChwcml2X3JlZ190YWJsZVswXSksCi0JIHNpemVvZiAocHJpdl9yZWdfdGFibGVbMF0pLCBjbXBfcmVnX2VudHJ5KTsKLQotICAvKiBJZiAtYnVtcCwgcmVjb3JkIHRoZSBhcmNoaXRlY3R1cmUgbGV2ZWwgYXQgd2hpY2ggd2Ugc3RhcnQgaXNzdWluZwotICAgICB3YXJuaW5ncy4gIFRoZSBiZWhhdmlvdXIgaXMgZGlmZmVyZW50IGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgYW4KLSAgICAgYXJjaGl0ZWN0dXJlIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4gIElmIGl0IHdhc24ndCwgd2UgaXNzdWUgd2FybmluZ3MKLSAgICAgZm9yIGFsbCB1cHdhcmRzIGJ1bXBzLiAgSWYgaXQgd2FzLCB3ZSBkb24ndCBzdGFydCBpc3N1aW5nIHdhcm5pbmdzIHVudGlsCi0gICAgIHdlIG5lZWQgdG8gYnVtcCBiZXlvbmQgdGhlIHJlcXVlc3RlZCBhcmNoaXRlY3R1cmUgb3Igd2hlbiB3ZSBidW1wIGJldHdlZW4KLSAgICAgY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcy4gICovCi0KLSAgaWYgKHdhcm5fb25fYnVtcAotICAgICAgJiYgYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZCkKLSAgICB7Ci0gICAgICAvKiBgbWF4X2FyY2hpdGVjdHVyZScgcmVjb3JkcyB0aGUgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZS4KLQkgSXNzdWUgd2FybmluZ3MgaWYgd2UgZ28gYWJvdmUgaXQuICAqLwotICAgICAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUgPSBtYXhfYXJjaGl0ZWN0dXJlOwotCi0gICAgICAvKiBGaW5kIHRoZSBoaWdoZXN0IGFyY2hpdGVjdHVyZSBsZXZlbCB0aGF0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aAotCSB0aGUgcmVxdWVzdGVkIG9uZS4gICovCi0gICAgICBmb3IgKG1heF9hcmNoaXRlY3R1cmUgPSBTUEFSQ19PUENPREVfQVJDSF9NQVg7Ci0JICAgbWF4X2FyY2hpdGVjdHVyZSA+IHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlOwotCSAgIC0tbWF4X2FyY2hpdGVjdHVyZSkKLQlpZiAoISBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCAobWF4X2FyY2hpdGVjdHVyZSwKLQkJCQkgICAgICAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUpKQotCSAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgYWxsIGFzc2VtYmx5IGhhcyBiZWVuIGRvbmUuICAqLwotCi12b2lkCi1zcGFyY19tZF9lbmQgKCkKLXsKLSAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OWEpOwotICAgICAgZWxzZQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OHBsdXMpOwotICAgICAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OHBsdXNhKTsKLSAgICAgIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCk7Ci0gICAgICBlbHNlIGlmIChkZWZhdWx0X2FyY2hfdHlwZSA9PSBzcGFyYzg2eCAmJiB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhKQotCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBzcGFyY2xpdGUgaXMgdHJlYXRlZCBsaWtlIGEgbm9ybWFsIHNwYXJjLiAgUGVyaGFwcyBpdCBzaG91bGRuJ3QKLQkgICAgIGJlIGJ1dCBmb3Igbm93IGl0IGlzIChzaW5jZSB0aGF0J3MgdGhlIHdheSBpdCdzIGFsd2F5cyBiZWVuCi0JICAgICB0cmVhdGVkKS4gICovCi0JICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmMpOwotCX0KLSAgICB9Ci19Ci0MCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAtKE1BWCsxKSB0byBNQVguICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaW5fc2lnbmVkX3JhbmdlICh2YWwsIG1heCkKLSAgICAgYmZkX3NpZ25lZF92bWEgdmFsLCBtYXg7Ci17Ci0gIGlmIChtYXggPD0gMCkKLSAgICBhYm9ydCAoKTsKLSAgLyogU2lnbi1leHRlbmQgdGhlIHZhbHVlIGZyb20gdGhlIGFyY2hpdGVjdHVyZSB3b3JkIHNpemUsIHNvIHRoYXQKLSAgICAgMHhmZmZmZmZmZiBpcyBhbHdheXMgY29uc2lkZXJlZCAtMSBvbiBzcGFyYzMyLiAgKi8KLSAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSAzMikKLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBzaWduID0gKGJmZF9zaWduZWRfdm1hKTEgPDwgMzE7Ci0gICAgICB2YWwgPSAoKHZhbCAmIDB4ZmZmZmZmZmYpIF4gc2lnbikgLSBzaWduOwotICAgIH0KLSAgaWYgKHZhbCA+IG1heCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHZhbCA8IH5tYXgpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAwIHRvIE1BWC4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1pbl91bnNpZ25lZF9yYW5nZSAodmFsLCBtYXgpCi0gICAgIGJmZF92bWEgdmFsLCBtYXg7Ci17Ci0gIGlmICh2YWwgPiBtYXgpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAtKE1BWC8yKzEpIHRvIE1BWC4KLSAgIChlLmcuIC0xNSB0byArMzEpLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWluX2JpdGZpZWxkX3JhbmdlICh2YWwsIG1heCkKLSAgICAgYmZkX3NpZ25lZF92bWEgdmFsLCBtYXg7Ci17Ci0gIGlmIChtYXggPD0gMCkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHZhbCA+IG1heCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHZhbCA8IH4obWF4ID4+IDEpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotc3BhcmNfZmZzIChtYXNrKQotICAgICB1bnNpZ25lZCBpbnQgbWFzazsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKG1hc2sgPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZm9yIChpID0gMDsgKG1hc2sgJiAxKSA9PSAwOyArK2kpCi0gICAgbWFzayA+Pj0gMTsKLSAgcmV0dXJuIGk7Ci19Ci0KLS8qIEltcGxlbWVudCBiaWcgc2hpZnQgcmlnaHQuICAqLwotc3RhdGljIGJmZF92bWEKLUJTUiAodmFsLCBhbW91bnQpCi0gICAgIGJmZF92bWEgdmFsOwotICAgICBpbnQgYW1vdW50OwotewotICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA8PSA0ICYmIGFtb3VudCA+PSAzMikKLSAgICBhc19mYXRhbCAoXygiU3VwcG9ydCBmb3IgNjQtYml0IGFyaXRobWV0aWMgbm90IGNvbXBpbGVkIGluLiIpKTsKLSAgcmV0dXJuIHZhbCA+PiBhbW91bnQ7Ci19Ci0MCi0vKiBGb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHNwYXJjX2lwIGFuZCBnZXRfZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci0KLS8qIFZhbHVlcyBmb3IgYHNwZWNpYWxfY2FzZScuCi0gICBJbnN0cnVjdGlvbnMgdGhhdCByZXF1aXJlIHdpZXJkIGhhbmRsaW5nIGJlY2F1c2UgdGhleSdyZSBsb25nZXIgdGhhbgotICAgNCBieXRlcy4gICovCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9OT05FCTAKLSNkZWZpbmUJU1BFQ0lBTF9DQVNFX1NFVAkxCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9TRVRTVwkyCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9TRVRYCTMKLS8qIEZJWE1FOiBzcGFyYy1vcGMuYyBkb2Vzbid0IGhhdmUgbmVjZXNzYXJ5ICJTIiB0cmlnZ2VyIHRvIGVuYWJsZSB0aGlzLiAgKi8KLSNkZWZpbmUJU1BFQ0lBTF9DQVNFX0ZESVYJNAotCi0vKiBCaXQgbWFza3Mgb2YgdmFyaW91cyBpbnNucy4gICovCi0jZGVmaW5lIE5PUF9JTlNOIDB4MDEwMDAwMDAKLSNkZWZpbmUgT1JfSU5TTiAweDgwMTAwMDAwCi0jZGVmaW5lIFhPUl9JTlNOIDB4ODAxODAwMDAKLSNkZWZpbmUgRk1PVlNfSU5TTiAweDgxQTAwMDIwCi0jZGVmaW5lIFNFVEhJX0lOU04gMHgwMTAwMDAwMAotI2RlZmluZSBTTExYX0lOU04gMHg4MTI4MTAwMAotI2RlZmluZSBTUkFfSU5TTiAweDgxMzgwMDAwCi0KLS8qIFRoZSBsYXN0IGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqbGFzdF9pbnNuOwotLyogVGhlIGFzc2VtYmxlZCBvcGNvZGUgb2YgYGxhc3RfaW5zbicuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9vcGNvZGU7Ci0MCi0vKiBIYW5kbGUgdGhlIHNldCBhbmQgc2V0dXcgc3ludGhldGljIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgdm9pZAotc3ludGhldGl6ZV9zZXR1dyAoaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLXsKLSAgaW50IG5lZWRfaGkyMl9wID0gMDsKLSAgaW50IHJkID0gKHRoZV9pbnNuLm9wY29kZSAmIFJEICh+MCkpID4+IDI1OwotCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQl7Ci0JICBpZiAoc2l6ZW9mKG9mZnNldFQpID4gNAotCSAgICAgICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgMAotCQkgIHx8IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPiAob2Zmc2V0VCkgMHhmZmZmZmZmZikpCi0JICAgIGFzX3dhcm4gKF8oInNldDogbnVtYmVyIG5vdCBpbiAwLi40Mjk0OTY3Mjk1IHJhbmdlIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc2l6ZW9mKG9mZnNldFQpID4gNAotCSAgICAgICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgLShvZmZzZXRUKSAweDgwMDAwMDAwCi0JCSAgfHwgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+IChvZmZzZXRUKSAweGZmZmZmZmZmKSkKLQkgICAgYXNfd2FybiAoXygic2V0OiBudW1iZXIgbm90IGluIC0yMTQ3NDgzNjQ4Li40Mjk0OTY3Mjk1IHJhbmdlIikpOwotCSAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA9IChpbnQpdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKLQl9Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBvcGVyYW5kIGlzIGFic29sdXRlIGFuZCBzbWFsbDsgc2tpcCBzZXRoaSBpZiBzby4gICovCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49ICgxIDw8IDEyKQotICAgICAgfHwgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8IC0oMSA8PCAxMikpCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKFNFVEhJX0lOU04gfCBSRCAocmQpCi0JCQkgfCAoKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj4gMTApCi0JCQkgICAgJiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCA/IDB4M2ZmZmZmIDogMCkpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCT8gQkZEX1JFTE9DX0hJMjIKLQkJCTogQkZEX1JFTE9DX05PTkUpOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgICBuZWVkX2hpMjJfcCA9IDE7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBvcGVyYW5kIGhhcyBubyBsb3ctb3JkZXIgYml0czsgc2tpcCBPUiBpZiBzby4gICovCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCAobmVlZF9oaTIyX3AgJiYgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgJiAweDNGRikgIT0gMCkKLSAgICAgIHx8ICEgbmVlZF9oaTIyX3ApCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKE9SX0lOU04gfCAobmVlZF9oaTIyX3AgPyBSUzEgKHJkKSA6IDApCi0JCQkgfCBSRCAocmQpIHwgSU1NRUQKLQkJCSB8ICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyCi0JCQkgICAgJiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCA/IDAgOgotCQkJICAgICAgIG5lZWRfaGkyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQk/IEJGRF9SRUxPQ19MTzEwCi0JCQk6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLX0KLSAgICAKLS8qIEhhbmRsZSB0aGUgc2V0c3cgc3ludGhldGljIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1zeW50aGV0aXplX3NldHN3IChpbnNuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotewotICBpbnQgbG93MzIsIHJkLCBvcGM7Ci0KLSAgcmQgPSAodGhlX2luc24ub3Bjb2RlICYgUkQgKH4wKSkgPj4gMjU7Ci0KLSAgaWYgKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgc3ludGhldGl6ZV9zZXR1dyAoaW5zbik7Ci0KLSAgICAgIC8qIE5lZWQgdG8gc2lnbiBleHRlbmQgaXQuICAqLwotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKFNSQV9JTlNOIHwgUlMxIChyZCkgfCBSRCAocmQpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNpemVvZihvZmZzZXRUKSA+IDQKLSAgICAgICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgLShvZmZzZXRUKSAweDgwMDAwMDAwCi0JICB8fCB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpKQotICAgIGFzX3dhcm4gKF8oInNldHN3OiBudW1iZXIgbm90IGluIC0yMTQ3NDgzNjQ4Li40Mjk0OTY3Mjk1IHJhbmdlIikpOwotCi0gIGxvdzMyID0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsJCi0JICAgICAgCi0gIGlmIChsb3czMiA+PSAwKQotICAgIHsKLSAgICAgIHN5bnRoZXRpemVfc2V0dXcgKGluc24pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvcGMgPSBPUl9JTlNOOwotICAgIAotICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotICAvKiBTZWUgaWYgb3BlcmFuZCBpcyBhYnNvbHV0ZSBhbmQgc21hbGw7IHNraXAgc2V0aGkgaWYgc28uICAqLwotICBpZiAobG93MzIgPCAtKDEgPDwgMTIpKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKHJkKQotCQkJIHwgKCgofnRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIpID4+IDEwKSAmIDB4M2ZmZmZmKSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICAgIGxvdzMyID0gMHgxYzAwIHwgKGxvdzMyICYgMHgzZmYpOwotICAgICAgb3BjID0gUlMxIChyZCkgfCBYT1JfSU5TTjsKLSAgICB9Ci0KLSAgdGhlX2luc24ub3Bjb2RlID0gKG9wYyB8IFJEIChyZCkgfCBJTU1FRAotCQkgICAgIHwgKGxvdzMyICYgMHgxZmZmKSk7Ci0gIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotfQotCi0vKiBIYW5kbGUgdGhlIHNldHN3IHN5bnRoZXRpYyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotc3ludGhldGl6ZV9zZXR4IChpbnNuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotewotICBpbnQgdXBwZXIzMiwgbG93ZXIzMjsKLSAgaW50IHRtcHJlZyA9ICh0aGVfaW5zbi5vcGNvZGUgJiBSUzEgKH4wKSkgPj4gMTQ7Ci0gIGludCBkc3RyZWcgPSAodGhlX2luc24ub3Bjb2RlICYgUkQgKH4wKSkgPj4gMjU7Ci0gIGludCB1cHBlcl9kc3RyZWc7Ci0gIGludCBuZWVkX2hoMjJfcCA9IDAsIG5lZWRfaG0xMF9wID0gMCwgbmVlZF9oaTIyX3AgPSAwLCBuZWVkX2xvMTBfcCA9IDA7Ci0gIGludCBuZWVkX3hvcjEwX3AgPSAwOwotICAgIAotI2RlZmluZSBTSUdORVhUMzIoeCkgKCgoKHgpICYgMHhmZmZmZmZmZikgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDApCi0gIGxvd2VyMzIgPSBTSUdORVhUMzIgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIpOwotICB1cHBlcjMyID0gU0lHTkVYVDMyIChCU1IgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIsIDMyKSk7Ci0jdW5kZWYgU0lHTkVYVDMyCi0KLSAgdXBwZXJfZHN0cmVnID0gdG1wcmVnOwotICAvKiBUaGUgdG1wIHJlZyBzaG91bGQgbm90IGJlIHRoZSBkc3QgcmVnLiAgKi8KLSAgaWYgKHRtcHJlZyA9PSBkc3RyZWcpCi0gICAgYXNfd2FybiAoXygic2V0eDogdGVtcG9yYXJ5IHJlZ2lzdGVyIHNhbWUgYXMgZGVzdGluYXRpb24gcmVnaXN0ZXIiKSk7Ci0KLSAgLyogPz8/IE9idmlvdXNseSB0aGVyZSBhcmUgb3RoZXIgb3B0aW1pemF0aW9ucyB3ZSBjYW4gZG8KLSAgICAgKGUuZy4gc2V0aGkrc2hpZnQgZm9yIDB4MWYwMDAwMDAwKSBhbmQgcGVyaGFwcyB3ZSBzaG91bGRuJ3QgYmUKLSAgICAgZG9pbmcgc29tZSBvZiB0aGVzZS4gIExhdGVyLiAgSWYgeW91IGRvIGNoYW5nZSB0aGluZ3MsIHRyeSB0bwotICAgICBjaGFuZ2UgYWxsIG9mIHRoaXMgdG8gYmUgdGFibGUgZHJpdmVuIGFzIHdlbGwuICAqLwotICAvKiBXaGF0IHRvIG91dHB1dCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgaWYgaXQncyBjb25zdGFudC4KLSAgICAgQ29tcHV0ZSB0aGF0IGZpcnN0LCB0aGVuIG91dHB1dCB3aGF0IHdlJ3ZlIGRlY2lkZWQgdXBvbi4gICovCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGlmIChzcGFyY19hcmNoX3NpemUgPT0gMzIpCi0JewotCSAgLyogV2hlbiBhcmNoIHNpemUgaXMgMzIsIHdlIHdhbnQgc2V0eCB0byBiZSBlcXVpdmFsZW50Ci0JICAgICB0byBzZXR1dyBmb3IgYW55dGhpbmcgYnV0IGNvbnN0YW50cy4gICovCi0JICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICY9IDB4ZmZmZmZmZmY7Ci0JICBzeW50aGV0aXplX3NldHV3IChpbnNuKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBuZWVkX2hoMjJfcCA9IG5lZWRfaG0xMF9wID0gbmVlZF9oaTIyX3AgPSBuZWVkX2xvMTBfcCA9IDE7Ci0gICAgICBsb3dlcjMyID0gMDsgdXBwZXIzMiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogUmVzZXQgWF9hZGRfbnVtYmVyLCB3ZSd2ZSBleHRyYWN0ZWQgaXQgYXMgdXBwZXIzMi9sb3dlcjMyLgotCSBPdGhlcndpc2UgZml4dXBfc2VnbWVudCB3aWxsIGNvbXBsYWluIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvCi0JIHdyaXRlIGFuIDggYnl0ZSBudW1iZXIgaW4gYSA0IGJ5dGUgZmllbGQuICAqLwotICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgCi0gICAgICAvKiBPbmx5IG5lZWQgaGgyMiBpZiBgb3InIGluc24gY2FuJ3QgaGFuZGxlIGNvbnN0YW50LiAgKi8KLSAgICAgIGlmICh1cHBlcjMyIDwgLSgxIDw8IDEyKSB8fCB1cHBlcjMyID49ICgxIDw8IDEyKSkKLQluZWVkX2hoMjJfcCA9IDE7Ci0gICAgCi0gICAgICAvKiBEb2VzIGJvdHRvbSBwYXJ0IChhZnRlciBzZXRoaSkgaGF2ZSBiaXRzPyAgKi8KLSAgICAgIGlmICgobmVlZF9oaDIyX3AgJiYgKHVwcGVyMzIgJiAweDNmZikgIT0gMCkKLQkgIC8qIE5vIGhoMjIsIGJ1dCBkb2VzIHVwcGVyMzIgc3RpbGwgaGF2ZSBiaXRzIHdlIGNhbid0IHNldAotCSAgICAgZnJvbSBsb3dlcjMyPyAgKi8KLQkgIHx8ICghIG5lZWRfaGgyMl9wICYmIHVwcGVyMzIgIT0gMCAmJiB1cHBlcjMyICE9IC0xKSkKLQluZWVkX2htMTBfcCA9IDE7Ci0gICAgCi0gICAgICAvKiBJZiB0aGUgbG93ZXIgaGFsZiBpcyBhbGwgemVybywgd2UgYnVpbGQgdGhlIHVwcGVyIGhhbGYgZGlyZWN0bHkKLQkgaW50byB0aGUgZHN0IHJlZy4gICovCi0gICAgICBpZiAobG93ZXIzMiAhPSAwCi0JICAvKiBOZWVkIGxvd2VyIGhhbGYgaWYgbnVtYmVyIGlzIHplcm8gb3IgMHhmZmZmZmZmZjAwMDAwMDAwLiAgKi8KLQkgIHx8ICghIG5lZWRfaGgyMl9wICYmICEgbmVlZF9obTEwX3ApKQotCXsKLQkgIC8qIE5vIG5lZWQgZm9yIHNldGhpIGlmIGBvcicgaW5zbiBjYW4gaGFuZGxlIGNvbnN0YW50LiAgKi8KLQkgIGlmIChsb3dlcjMyIDwgLSgxIDw8IDEyKSB8fCBsb3dlcjMyID49ICgxIDw8IDEyKQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgYSBuZWdhdGl2ZSBjb25zdGFudCBpbiB0aGUgYG9yJwotCQkgaW5zbiB1bmxlc3MgdGhlIHVwcGVyIDMyIGJpdHMgYXJlIGFsbCBvbmVzLiAgKi8KLQkgICAgICB8fCAobG93ZXIzMiA8IDAgJiYgdXBwZXIzMiAhPSAtMSkKLQkgICAgICB8fCAobG93ZXIzMiA+PSAwICYmIHVwcGVyMzIgPT0gLTEpKQotCSAgICBuZWVkX2hpMjJfcCA9IDE7Ci0JCSAgICAgIAotCSAgaWYgKG5lZWRfaGkyMl9wICYmIHVwcGVyMzIgPT0gLTEpCi0JICAgIG5lZWRfeG9yMTBfcCA9IDE7Ci0KLQkgIC8qIERvZXMgYm90dG9tIHBhcnQgKGFmdGVyIHNldGhpKSBoYXZlIGJpdHM/ICAqLwotCSAgZWxzZSBpZiAoKG5lZWRfaGkyMl9wICYmIChsb3dlcjMyICYgMHgzZmYpICE9IDApCi0JCSAgIC8qIE5vIHNldGhpLiAgKi8KLQkJICAgfHwgKCEgbmVlZF9oaTIyX3AgJiYgKGxvd2VyMzIgJiAweDFmZmYpICE9IDApCi0JCSAgIC8qIE5lZWQgYG9yJyBpZiB3ZSBkaWRuJ3Qgc2V0IGFueXRoaW5nIGVsc2UuICAqLwotCQkgICB8fCAoISBuZWVkX2hpMjJfcCAmJiAhIG5lZWRfaGgyMl9wICYmICEgbmVlZF9obTEwX3ApKQotCSAgICBuZWVkX2xvMTBfcCA9IDE7Ci0JfQotICAgICAgZWxzZQotCS8qIE91dHB1dCBkaXJlY3RseSB0byBkc3QgcmVnIGlmIGxvd2VyIDMyIGJpdHMgYXJlIGFsbCB6ZXJvLiAgKi8KLQl1cHBlcl9kc3RyZWcgPSBkc3RyZWc7Ci0gICAgfQotICAgIAotICBpZiAoIXVwcGVyX2RzdHJlZyAmJiBkc3RyZWcpCi0gICAgYXNfd2FybiAoXygic2V0eDogaWxsZWdhbCB0ZW1wb3JhcnkgcmVnaXN0ZXIgZzAiKSk7Ci0KLSAgaWYgKG5lZWRfaGgyMl9wKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKHVwcGVyX2RzdHJlZykKLQkJCSB8ICgodXBwZXIzMiA+PiAxMCkgJiAweDNmZmZmZikpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJPyBCRkRfUkVMT0NfU1BBUkNfSEgyMiA6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLSAgICAKLSAgaWYgKG5lZWRfaGkyMl9wKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKGRzdHJlZykKLQkJCSB8ICgoKG5lZWRfeG9yMTBfcCA/IH5sb3dlcjMyIDogbG93ZXIzMikKLQkJCSAgICA+PiAxMCkgJiAweDNmZmZmZikpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJPyBCRkRfUkVMT0NfU1BBUkNfTE0yMiA6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLQotICBpZiAobmVlZF9obTEwX3ApCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKE9SX0lOU04KLQkJCSB8IChuZWVkX2hoMjJfcCA/IFJTMSAodXBwZXJfZHN0cmVnKSA6IDApCi0JCQkgfCBSRCAodXBwZXJfZHN0cmVnKQotCQkJIHwgSU1NRUQKLQkJCSB8ICh1cHBlcjMyICYgKG5lZWRfaGgyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQk/IEJGRF9SRUxPQ19TUEFSQ19ITTEwIDogQkZEX1JFTE9DX05PTkUpOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgfQotICAgIAotICBpZiAobmVlZF9sbzEwX3ApCi0gICAgewotICAgICAgLyogRklYTUU6IE9uZSBuaWNlIG9wdGltaXphdGlvbiB0byBkbyBoZXJlIGlzIHRvIE9SIHRoZSBsb3cgcGFydAotCSB3aXRoIHRoZSBoaWdocGFydCBpZiBoaTIyIGlzbid0IG5lZWRlZCBhbmQgdGhlIGxvdyBwYXJ0IGlzCi0JIHBvc2l0aXZlLiAgKi8KLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOIHwgKG5lZWRfaGkyMl9wID8gUlMxIChkc3RyZWcpIDogMCkKLQkJCSB8IFJEIChkc3RyZWcpCi0JCQkgfCBJTU1FRAotCQkJIHwgKGxvd2VyMzIgJiAobmVlZF9oaTIyX3AgPyAweDNmZiA6IDB4MWZmZikpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCT8gQkZEX1JFTE9DX0xPMTAgOiBCRkRfUkVMT0NfTk9ORSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci0gICAgCi0gIC8qIElmIHdlIG5lZWRlZCB0byBidWlsZCB0aGUgdXBwZXIgcGFydCwgc2hpZnQgaXQgaW50byBwbGFjZS4gICovCi0gIGlmIChuZWVkX2hoMjJfcCB8fCBuZWVkX2htMTBfcCkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0xMWF9JTlNOIHwgUlMxICh1cHBlcl9kc3RyZWcpIHwgUkQgKHVwcGVyX2RzdHJlZykKLQkJCSB8IElNTUVEIHwgMzIpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLSAgICAKLSAgLyogVG8gZ2V0IC0xIGluIHVwcGVyMzIsIHdlIGRvIHNldGhpICVoaSh+eCksIHI7IHhvciByLCAtMHg0MDAgfCB4LCByLiAgKi8KLSAgaWYgKG5lZWRfeG9yMTBfcCkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoWE9SX0lOU04gfCBSUzEgKGRzdHJlZykgfCBSRCAoZHN0cmVnKSB8IElNTUVECi0JCQkgfCAweDFjMDAgfCAobG93ZXIzMiAmIDB4M2ZmKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgfQotCi0gIC8qIElmIHdlIG5lZWRlZCB0byBidWlsZCBib3RoIHVwcGVyIGFuZCBsb3dlciBwYXJ0cywgT1IgdGhlbSB0b2dldGhlci4gICovCi0gIGVsc2UgaWYgKChuZWVkX2hoMjJfcCB8fCBuZWVkX2htMTBfcCkgJiYgKG5lZWRfaGkyMl9wIHx8IG5lZWRfbG8xMF9wKSkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoT1JfSU5TTiB8IFJTMSAoZHN0cmVnKSB8IFJTMiAodXBwZXJfZHN0cmVnKQotCQkJIHwgUkQgKGRzdHJlZykpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLX0KLQwKLS8qIE1haW4gZW50cnkgcG9pbnQgdG8gYXNzZW1ibGUgb25lIGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICBpbnQgc3BlY2lhbF9jYXNlOwotCi0gIGtub3cgKHN0cik7Ci0gIHNwZWNpYWxfY2FzZSA9IHNwYXJjX2lwIChzdHIsICZpbnNuKTsKLQotICAvKiBXZSB3YXJuIGFib3V0IGF0dGVtcHRzIHRvIHB1dCBhIGZsb2F0aW5nIHBvaW50IGJyYW5jaCBpbiBhIGRlbGF5IHNsb3QsCi0gICAgIHVubGVzcyB0aGUgZGVsYXkgc2xvdCBoYXMgYmVlbiBhbm51bGxlZC4gICovCi0gIGlmIChpbnNuICE9IE5VTEwKLSAgICAgICYmIGxhc3RfaW5zbiAhPSBOVUxMCi0gICAgICAmJiAoaW5zbi0+ZmxhZ3MgJiBGX0ZCUikgIT0gMAotICAgICAgJiYgKGxhc3RfaW5zbi0+ZmxhZ3MgJiBGX0RFTEFZRUQpICE9IDAKLSAgICAgIC8qID8/PyBUaGlzIHRlc3QgaXNuJ3QgY29tcGxldGVseSBhY2N1cmF0ZS4gIFdlIGFzc3VtZSBhbnl0aGluZyB3aXRoCi0JIEZfe1VOQlIsQ09OREJSLEZCUn0gc2V0IGlzIGFubnVsbGFibGUuICAqLwotICAgICAgJiYgKChsYXN0X2luc24tPmZsYWdzICYgKEZfVU5CUiB8IEZfQ09OREJSIHwgRl9GQlIpKSA9PSAwCi0JICB8fCAobGFzdF9vcGNvZGUgJiBBTk5VTCkgPT0gMCkpCi0gICAgYXNfd2FybiAoXygiRlAgYnJhbmNoIGluIGRlbGF5IHNsb3QiKSk7Ci0KLSAgLyogU1BBUkMgYmVmb3JlIHY5IHJlcXVpcmVzIGEgbm9wIGluc3RydWN0aW9uIGJldHdlZW4gYSBmbG9hdGluZwotICAgICBwb2ludCBpbnN0cnVjdGlvbiBhbmQgYSBmbG9hdGluZyBwb2ludCBicmFuY2guICBXZSBpbnNlcnQgb25lCi0gICAgIGF1dG9tYXRpY2FsbHksIHdpdGggYSB3YXJuaW5nLiAgKi8KLSAgaWYgKG1heF9hcmNoaXRlY3R1cmUgPCBTUEFSQ19PUENPREVfQVJDSF9WOQotICAgICAgJiYgaW5zbiAhPSBOVUxMCi0gICAgICAmJiBsYXN0X2luc24gIT0gTlVMTAotICAgICAgJiYgKGluc24tPmZsYWdzICYgRl9GQlIpICE9IDAKLSAgICAgICYmIChsYXN0X2luc24tPmZsYWdzICYgRl9GTE9BVCkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3BhcmNfaXQgbm9wX2luc247Ci0KLSAgICAgIG5vcF9pbnNuLm9wY29kZSA9IE5PUF9JTlNOOwotICAgICAgbm9wX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmbm9wX2luc24pOwotICAgICAgYXNfd2FybiAoXygiRlAgYnJhbmNoIHByZWNlZGVkIGJ5IEZQIGluc3RydWN0aW9uOyBOT1AgaW5zZXJ0ZWQiKSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoc3BlY2lhbF9jYXNlKQotICAgIHsKLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9OT05FOgotICAgICAgLyogbm9ybWFsIGluc24gKi8KLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9TRVRTVzoKLSAgICAgIHN5bnRoZXRpemVfc2V0c3cgKGluc24pOwotICAgICAgYnJlYWs7Ci0JICAKLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9TRVQ6Ci0gICAgICBzeW50aGV0aXplX3NldHV3IChpbnNuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTUEVDSUFMX0NBU0VfU0VUWDoKLSAgICAgIHN5bnRoZXRpemVfc2V0eCAoaW5zbik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU1BFQ0lBTF9DQVNFX0ZESVY6Ci0gICAgICB7Ci0JaW50IHJkID0gKHRoZV9pbnNuLm9wY29kZSA+PiAyNSkgJiAweDFmOwotICAgIAotCW91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIAotCS8qIEFjY29yZGluZyB0byBpbmZvcm1hdGlvbiBsZWFrZWQgZnJvbSBTdW4sIHRoZSAiZmRpdiIgaW5zdHJ1Y3Rpb25zCi0JICAgb24gZWFybHkgU1BBUkMgbWFjaGluZXMgd291bGQgcHJvZHVjZSBpbmNvcnJlY3QgcmVzdWx0cyBzb21ldGltZXMuCi0JICAgVGhlIHdvcmthcm91bmQgaXMgdG8gYWRkIGFuIGZtb3ZzIG9mIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciB0bwotCSAgIGl0c2VsZiBqdXN0IGFmdGVyIHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgd2FzIHRydWUgb24gbWFjaGluZXMKLQkgICB3aXRoIFdlaXRlayAxMTY1IGZsb2F0IGNoaXBzLCBzdWNoIGFzIHRoZSBTdW4tNC8yNjAgYW5kIC8yODAuICovCi0JYXNzZXJ0ICh0aGVfaW5zbi5yZWxvYyA9PSBCRkRfUkVMT0NfTk9ORSk7Ci0JdGhlX2luc24ub3Bjb2RlID0gRk1PVlNfSU5TTiB8IHJkIHwgUkQgKHJkKTsKLQlvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc3BlY2lhbCBjYXNlIGluc24gc2FuaXR5IGNoZWNrIikpOwotICAgIH0KLX0KLQotLyogU3Vicm91dGluZSBvZiBtZF9hc3NlbWJsZSB0byBkbyB0aGUgYWN0dWFsIHBhcnNpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1zcGFyY19pcCAoc3RyLCBwaW5zbikKLSAgICAgY2hhciAqc3RyOwotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqcGluc247Ci17Ci0gIGNoYXIgKmVycm9yX21lc3NhZ2UgPSAiIjsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICBjaGFyICphcmdzU3RhcnQ7Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0gIGludCBtYXRjaCA9IDA7Ci0gIGludCBjb21tYSA9IDA7Ci0gIGludCB2OV9hcmdfcDsKLSAgaW50IHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9OT05FOwotCi0gIHMgPSBzdHI7Ci0gIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgIHsKLSAgICAgIGRvCi0JKytzOwotICAgICAgd2hpbGUgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykgfHwgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoKnMpCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLCc6Ci0gICAgICBjb21tYSA9IDE7Ci0KLSAgICAgIC8qRkFMTFRIUk9VR0ggKi8KLQotICAgIGNhc2UgJyAnOgotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICB9Ci0gIGluc24gPSAoc3RydWN0IHNwYXJjX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cik7Ci0gICpwaW5zbiA9IGluc247Ci0gIGlmIChpbnNuID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLSAgICB9Ci0gIGlmIChjb21tYSkKLSAgICB7Ci0gICAgICAqLS1zID0gJywnOwotICAgIH0KLQotICBhcmdzU3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIG9wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICB2OV9hcmdfcCA9IDA7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlCi0gICAgICAgKiBzdXJlIHRoYXQgdGhlIG9wZXJhbmRzIG1hdGNoCi0gICAgICAgKi8KLSAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7OyArK2FyZ3MpCi0JewotCSAgc3dpdGNoICgqYXJncykKLQkgICAgewotCSAgICBjYXNlICdLJzoKLQkgICAgICB7Ci0JCWludCBrbWFzayA9IDA7Ci0KLQkJLyogUGFyc2UgYSBzZXJpZXMgb2YgbWFza3MuICAqLwotCQlpZiAoKnMgPT0gJyMnKQotCQkgIHsKLQkJICAgIHdoaWxlICgqcyA9PSAnIycpCi0JCSAgICAgIHsKLQkJCWludCBtYXNrOwotCi0JCQlpZiAoISBwYXJzZV9rZXl3b3JkX2FyZyAoc3BhcmNfZW5jb2RlX21lbWJhciwgJnMsCi0JCQkJCQkgJm1hc2spKQotCQkJICB7Ci0JCQkgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBtZW1iYXIgbWFzayBuYW1lIik7Ci0JCQkgICAgZ290byBlcnJvcjsKLQkJCSAgfQotCQkJa21hc2sgfD0gbWFzazsKLQkJCXdoaWxlICgqcyA9PSAnICcpIHsgKytzOyBjb250aW51ZTsgfQotCQkJaWYgKCpzID09ICd8JyB8fCAqcyA9PSAnKycpCi0JCQkgICsrczsKLQkJCXdoaWxlICgqcyA9PSAnICcpIHsgKytzOyBjb250aW51ZTsgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2VfY29uc3RfZXhwcl9hcmcgKCZzLCAma21hc2spKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIG1lbWJhciBtYXNrIGV4cHJlc3Npb24iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChrbWFzayA8IDAgfHwga21hc2sgPiAxMjcpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgbWVtYmFyIG1hc2sgbnVtYmVyIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCW9wY29kZSB8PSBNRU1CQVIgKGttYXNrKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGNhc2UgJyonOgotCSAgICAgIHsKLQkJaW50IGZjbiA9IDA7Ci0KLQkJLyogUGFyc2UgYSBwcmVmZXRjaCBmdW5jdGlvbi4gICovCi0JCWlmICgqcyA9PSAnIycpCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9wcmVmZXRjaCwgJnMsICZmY24pKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG5hbWUiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAoISBwYXJzZV9jb25zdF9leHByX2FyZyAoJnMsICZmY24pKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIGV4cHJlc3Npb24iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChmY24gPCAwIHx8IGZjbiA+IDMxKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlciIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQkJb3Bjb2RlIHw9IFJEIChmY24pOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgY2FzZSAnISc6Ci0JICAgIGNhc2UgJz8nOgotCSAgICAgIC8qIFBhcnNlIGEgc3BhcmM2NCBwcml2aWxlZ2VkIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoKnMgPT0gJyUnKQotCQl7Ci0JCSAgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gcHJpdl9yZWdfdGFibGU7Ci0JCSAgdW5zaWduZWQgaW50IGxlbiA9IDk5OTk5OTk7IC8qIGluaXQgdG8gbWFrZSBnY2MgaGFwcHkgKi8KLQotCQkgIHMgKz0gMTsKLQkJICB3aGlsZSAocC0+bmFtZVswXSA+IHNbMF0pCi0JCSAgICBwKys7Ci0JCSAgd2hpbGUgKHAtPm5hbWVbMF0gPT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgbGVuID0gc3RybGVuIChwLT5uYW1lKTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKHAtPm5hbWUsIHMsIGxlbikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgICBwKys7Ci0JCSAgICB9Ci0JCSAgaWYgKHAtPm5hbWVbMF0gIT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgcHJpdmlsZWdlZCByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGlmICgqYXJncyA9PSAnPycpCi0JCSAgICBvcGNvZGUgfD0gKHAtPnJlZ251bSA8PCAxNCk7Ci0JCSAgZWxzZQotCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMjUpOwotCQkgIHMgKz0gbGVuOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgcHJpdmlsZWdlZCByZWdpc3RlciIpOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICBjYXNlICdfJzoKLQkgICAgY2FzZSAnLyc6Ci0JICAgICAgLyogUGFyc2UgYSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoKnMgPT0gJyUnKQotCQl7Ci0JCSAgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gdjlhX2Fzcl90YWJsZTsKLQkJICB1bnNpZ25lZCBpbnQgbGVuID0gOTk5OTk5OTsgLyogaW5pdCB0byBtYWtlIGdjYyBoYXBweSAqLwotCi0JCSAgcyArPSAxOwotCQkgIHdoaWxlIChwLT5uYW1lWzBdID4gc1swXSkKLQkJICAgIHArKzsKLQkJICB3aGlsZSAocC0+bmFtZVswXSA9PSBzWzBdKQotCQkgICAgewotCQkgICAgICBsZW4gPSBzdHJsZW4gKHAtPm5hbWUpOwotCQkgICAgICBpZiAoc3RybmNtcCAocC0+bmFtZSwgcywgbGVuKSA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICAgIHArKzsKLQkJICAgIH0KLQkJICBpZiAocC0+bmFtZVswXSAhPSBzWzBdKQotCQkgICAgewotCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaWYgKCphcmdzID09ICcvJyAmJiAocC0+cmVnbnVtID09IDIwIHx8IHAtPnJlZ251bSA9PSAyMSkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHJkIG9uIHdyaXRlIG9ubHkgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9CQkgICAgICAKLQkJICBpZiAoKmFyZ3MgPT0gJy8nKQotCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMTQpOwotCQkgIGVsc2UKLQkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDI1KTsKLQkJICBzICs9IGxlbjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHY5YSBhbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIiKTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgY2FzZSAnTSc6Ci0JICAgIGNhc2UgJ20nOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWFzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0KLQkJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgIHsKLQkJICAgICAgbG9uZyBudW0gPSAwOwotCi0JCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkJewotCQkJICBudW0gPSBudW0gKiAxMCArICpzIC0gJzAnOwotCQkJICArK3M7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCQkJewotCQkJICBpZiAobnVtIDwgMTYgfHwgMzEgPCBudW0pCi0JCQkgICAgewotCQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogYXNyIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMTYgYW5kIDMxIik7Ci0JCQkgICAgICBnb3RvIGVycm9yOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAobnVtIDwgMCB8fCAzMSA8IG51bSkKLQkJCSAgICB7Ci0JCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBhc3IgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMSIpOwotCQkJICAgICAgZ290byBlcnJvcjsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgb3Bjb2RlIHw9ICgqYXJncyA9PSAnTScgPyBSUzEgKG51bSkgOiBSRCAobnVtKSk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogZXhwZWN0aW5nICVhc3JOIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCX0gLyogaWYgJWFzciAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDXzExOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2onOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDXzEwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ1gnOgotCSAgICAgIC8qIFY4IHN5c3RlbXMgZG9uJ3QgdW5kZXJzdGFuZCBCRkRfUkVMT0NfU1BBUkNfNS4gICovCi0JICAgICAgaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQl0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ181OwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMxMzsKLQkgICAgICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVuc2lnbmVkLCBidXQgZm9yIHVwd2FyZCBjb21wYXRpYmlsaXR5LAotCQkgYWxsb3cgbmVnYXRpdmUgdmFsdWVzIGFzIHdlbGwuICAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ1knOgotCSAgICAgIC8qIFY4IHN5c3RlbXMgZG9uJ3QgdW5kZXJzdGFuZCBCRkRfUkVMT0NfU1BBUkNfNi4gICovCi0JICAgICAgaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQl0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ182OwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMxMzsKLQkgICAgICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVuc2lnbmVkLCBidXQgZm9yIHVwd2FyZCBjb21wYXRpYmlsaXR5LAotCQkgYWxsb3cgbmVnYXRpdmUgdmFsdWVzIGFzIHdlbGwuICAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2snOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gLyogUkVMT0NfV0RJU1AyXzE0ICovIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2OwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdHJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5OwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdOJzoKLQkgICAgICBpZiAoKnMgPT0gJ3AnICYmIHNbMV0gPT0gJ24nKQotCQl7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVCc6Ci0JICAgICAgaWYgKCpzID09ICdwJyAmJiBzWzFdID09ICd0JykKLQkJewotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3onOgotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCXsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVpY2MiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWic6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXhjYyIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc2JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMCIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc3JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMSIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc4JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMiIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc5JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMyIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdQJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVwYyIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdXJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV0aWNrIiwgNSkgPT0gMCkKLQkJewotCQkgIHMgKz0gNTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXsKLQkJICBtYXRjaCA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcrJzoKLQkgICAgICBpZiAoKnMgPT0gJysnKQotCQl7Ci0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKCpzID09ICctJykKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWyc6CQkvKiB0aGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KLQkgICAgY2FzZSAnXSc6Ci0JICAgIGNhc2UgJywnOgotCSAgICBjYXNlICcgJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnIyc6CQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCAqLwotCSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMrKykpCi0JCXsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgIHsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnQyc6CQkvKiBjb3Byb2Nlc3NvciBzdGF0ZSByZWdpc3RlciAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWNzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdiJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ2MnOgotCSAgICBjYXNlICdEJzoKLQkgICAgICBpZiAoKnMrKyA9PSAnJScgJiYgKnMrKyA9PSAnYycgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJewotCQkgIG1hc2sgPSAqcysrOwotCQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMTAgKiAobWFzayAtICcwJykgKyAoKnMrKyAtICcwJyk7Ci0JCSAgICAgIGlmIChtYXNrID49IDMyKQotCQkJewotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgLT0gJzAnOwotCQkgICAgfQotCQkgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICB7Ci0KLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxNDsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzazsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ0QnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAyNTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdyJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgIGNhc2UgJzEnOgotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgaWYgKCpzKysgPT0gJyUnKQotCQl7Ci0JCSAgc3dpdGNoIChjID0gKnMrKykKLQkJICAgIHsKLQotCQkgICAgY2FzZSAnZic6CS8qIGZyYW1lIHBvaW50ZXIgKi8KLQkJICAgICAgaWYgKCpzKysgPT0gJ3AnKQotCQkJewotCQkJICBtYXNrID0gMHgxZTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ2cnOgkvKiBnbG9iYWwgcmVnaXN0ZXIgKi8KLQkJICAgICAgYyA9ICpzKys7Ci0JCSAgICAgIGlmIChpc29jdGFsIChjKSkKLQkJCXsKLQkJCSAgbWFzayA9IGMgLSAnMCc7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdpJzoJLyogaW4gcmVnaXN0ZXIgKi8KLQkJICAgICAgYyA9ICpzKys7Ci0JCSAgICAgIGlmIChpc29jdGFsIChjKSkKLQkJCXsKLQkJCSAgbWFzayA9IGMgLSAnMCcgKyAyNDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ2wnOgkvKiBsb2NhbCByZWdpc3RlciAqLwotCQkgICAgICBjID0gKnMrKzsKLQkJICAgICAgaWYgKGlzb2N0YWwgKGMpKQotCQkJewotCQkJICBtYXNrID0gKGMgLSAnMCcgKyAxNik7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdvJzoJLyogb3V0IHJlZ2lzdGVyICovCi0JCSAgICAgIGMgPSAqcysrOwotCQkgICAgICBpZiAoaXNvY3RhbCAoYykpCi0JCQl7Ci0JCQkgIG1hc2sgPSAoYyAtICcwJyArIDgpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAncyc6CS8qIHN0YWNrIHBvaW50ZXIgKi8KLQkJICAgICAgaWYgKCpzKysgPT0gJ3AnKQotCQkJewotCQkJICBtYXNrID0gMHhlOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAncic6CS8qIGFueSByZWdpc3RlciAqLwotCQkgICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAoYyA9ICpzKyspKSkKLQkJCXsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLQkJICAgIGNhc2UgJzAnOgotCQkgICAgY2FzZSAnMSc6Ci0JCSAgICBjYXNlICcyJzoKLQkJICAgIGNhc2UgJzMnOgotCQkgICAgY2FzZSAnNCc6Ci0JCSAgICBjYXNlICc1JzoKLQkJICAgIGNhc2UgJzYnOgotCQkgICAgY2FzZSAnNyc6Ci0JCSAgICBjYXNlICc4JzoKLQkJICAgIGNhc2UgJzknOgotCQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJCXsKLQkJCSAgaWYgKChjID0gMTAgKiAoYyAtICcwJykgKyAoKnMrKyAtICcwJykpID49IDMyKQotCQkJICAgIHsKLQkJCSAgICAgIGdvdG8gZXJyb3I7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGMgLT0gJzAnOwotCQkJfQotCQkgICAgICBtYXNrID0gYzsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0KLQkJICAvKiBHb3QgdGhlIHJlZ2lzdGVyLCBub3cgZmlndXJlIG91dCB3aGVyZQotCQkgICAgIGl0IGdvZXMgaW4gdGhlIG9wY29kZS4gICovCi0JCSAgc3dpdGNoICgqYXJncykKLQkJICAgIHsKLQkJICAgIGNhc2UgJzEnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxNDsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJzInOgotCQkgICAgICBvcGNvZGUgfD0gbWFzazsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAyNTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ3InOgotCQkgICAgICBvcGNvZGUgfD0gKG1hc2sgPDwgMjUpIHwgKG1hc2sgPDwgMTQpOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnTyc6Ci0JCSAgICAgIG9wY29kZSB8PSAobWFzayA8PCAyNSkgfCAobWFzayA8PCAwKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdlJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ3YnOgotCSAgICBjYXNlICdWJzoKLQotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnQic6Ci0JICAgIGNhc2UgJ1InOgotCi0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdIJzoKLQkgICAgY2FzZSAnSic6Ci0JICAgICAgewotCQljaGFyIGZvcm1hdDsKLQotCQlpZiAoKnMrKyA9PSAnJScKLQkJICAgICYmICgoZm9ybWF0ID0gKnMpID09ICdmJykKLQkJICAgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKytzKSkKLQkJICB7Ci0JCSAgICBmb3IgKG1hc2sgPSAwOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpOyArK3MpCi0JCSAgICAgIHsKLQkJCW1hc2sgPSAxMCAqIG1hc2sgKyAoKnMgLSAnMCcpOwotCQkgICAgICB9CQkvKiByZWFkIHRoZSBudW1iZXIgKi8KLQotCQkgICAgaWYgKCgqYXJncyA9PSAndicKLQkJCSB8fCAqYXJncyA9PSAnQicKLQkJCSB8fCAqYXJncyA9PSAnSCcpCi0JCQkmJiAobWFzayAmIDEpKQotCQkgICAgICB7Ci0JCQlicmVhazsKLQkJICAgICAgfQkJLyogcmVnaXN0ZXIgbXVzdCBiZSBldmVuIG51bWJlcmVkICovCi0KLQkJICAgIGlmICgoKmFyZ3MgPT0gJ1YnCi0JCQkgfHwgKmFyZ3MgPT0gJ1InCi0JCQkgfHwgKmFyZ3MgPT0gJ0onKQotCQkJJiYgKG1hc2sgJiAzKSkKLQkJICAgICAgewotCQkJYnJlYWs7Ci0JCSAgICAgIH0JCS8qIHJlZ2lzdGVyIG11c3QgYmUgbXVsdGlwbGUgb2YgNCAqLwotCi0JCSAgICBpZiAobWFzayA+PSA2NCkKLQkJICAgICAgewotCQkJaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSA2NCBmIHJlZ2lzdGVyczsgWzAtNjNdIik7Ci0JCQllbHNlCi0JCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFRoZXJlIGFyZSBvbmx5IDMyIGYgcmVnaXN0ZXJzOyBbMC0zMV0iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0JLyogb24gZXJyb3IgKi8KLQkJICAgIGVsc2UgaWYgKG1hc2sgPj0gMzIpCi0JCSAgICAgIHsKLQkJCWlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJCSAgewotCQkJICAgIHY5X2FyZ19wID0gMTsKLQkJCSAgICBtYXNrIC09IDMxOwkvKiB3cmFwIGhpZ2ggYml0ICovCi0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFRoZXJlIGFyZSBvbmx5IDMyIGYgcmVnaXN0ZXJzOyBbMC0zMV0iKTsKLQkJCSAgICBnb3RvIGVycm9yOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBicmVhazsKLQkJICB9CS8qIGlmIG5vdCBhbiAnZicgcmVnaXN0ZXIuICovCi0KLQkJc3dpdGNoICgqYXJncykKLQkJICB7Ci0JCSAgY2FzZSAndic6Ci0JCSAgY2FzZSAnVic6Ci0JCSAgY2FzZSAnZSc6Ci0JCSAgICBvcGNvZGUgfD0gUlMxIChtYXNrKTsKLQkJICAgIGNvbnRpbnVlOwotCi0KLQkJICBjYXNlICdmJzoKLQkJICBjYXNlICdCJzoKLQkJICBjYXNlICdSJzoKLQkJICAgIG9wY29kZSB8PSBSUzIgKG1hc2spOwotCQkgICAgY29udGludWU7Ci0KLQkJICBjYXNlICdnJzoKLQkJICBjYXNlICdIJzoKLQkJICBjYXNlICdKJzoKLQkJICAgIG9wY29kZSB8PSBSRCAobWFzayk7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9CQkvKiBwYWNrIGl0IGluLiAqLwotCi0JCWtub3cgKDApOwotCQlicmVhazsKLQkgICAgICB9CQkJLyogZmxvYXQgYXJnICovCi0KLQkgICAgY2FzZSAnRic6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnNyIiwgNCkgPT0gMCkKLQkJewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzAnOgkJLyogNjQgYml0IGltbWVkaWF0ZSAoc2V0LCBzZXRzdywgc2V0eCBpbnNuKSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7IC8qIHJlbG9jIGhhbmRsZWQgZWxzZXdoZXJlICovCi0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnbCc6CQkvKiAyMiBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMjsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnTCc6CQkvKiAzMCBiaXQgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfMzJfUENSRUxfUzI7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2gnOgotCSAgICBjYXNlICduJzoJCS8qIDIyIGJpdCBpbW1lZGlhdGUgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQzIyOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2knOgkJLyogMTMgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7Ci0KLQkgICAgICAvKiBmYWxsdGhyb3VnaCAqLwotCi0JICAgIGltbWVkaWF0ZToKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQlzKys7Ci0KLQkgICAgICB7Ci0JCWNoYXIgKnMxOwotCQljaGFyICpvcF9hcmcgPSBOVUxMOwotCQlleHByZXNzaW9uUyBvcF9leHA7Ci0JCWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBvbGRfcmVsb2MgPSB0aGVfaW5zbi5yZWxvYzsKLQotCQkvKiBDaGVjayBmb3IgJWhpLCBldGMuICAqLwotCQlpZiAoKnMgPT0gJyUnKQotCQkgIHsKLQkJICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BzIHsKLQkJICAgICAgLyogVGhlIG5hbWUgYXMgaXQgYXBwZWFycyBpbiBhc3NlbWJsZXIuICAqLwotCQkgICAgICBjaGFyICpuYW1lOwotCQkgICAgICAvKiBzdHJsZW4gKG5hbWUpLCBwcmVjb21wdXRlZCBmb3Igc3BlZWQgKi8KLQkJICAgICAgaW50IGxlbjsKLQkJICAgICAgLyogVGhlIHJlbG9jIHRoaXMgcHNldWRvLW9wIHRyYW5zbGF0ZXMgdG8uICAqLwotCQkgICAgICBpbnQgcmVsb2M7Ci0JCSAgICAgIC8qIE5vbi16ZXJvIGlmIGZvciB2OSBvbmx5LiAgKi8KLQkJICAgICAgaW50IHY5X3A7Ci0JCSAgICAgIC8qIE5vbi16ZXJvIGlmIGNhbiBiZSB1c2VkIGluIHBjLXJlbGF0aXZlIGNvbnRleHRzLiAgKi8KLQkJICAgICAgaW50IHBjcmVsX3A7LypGSVhNRTp3aXAqLwotCQkgICAgfSBvcHNbXSA9IHsKLQkJICAgICAgLyogaGl4L2xveCBtdXN0IGFwcGVhciBiZWZvcmUgaGkvbG8gc28gJWhpeCB3b24ndCBiZQotCQkJIG1pc3Rha2VuIGZvciAlaGkuICAqLwotCQkgICAgICB7ICJoaXgiLCAzLCBCRkRfUkVMT0NfU1BBUkNfSElYMjIsIDEsIDAgfSwKLQkJICAgICAgeyAibG94IiwgMywgQkZEX1JFTE9DX1NQQVJDX0xPWDEwLCAxLCAwIH0sCi0JCSAgICAgIHsgImhpIiwgMiwgQkZEX1JFTE9DX0hJMjIsIDAsIDEgfSwKLQkJICAgICAgeyAibG8iLCAyLCBCRkRfUkVMT0NfTE8xMCwgMCwgMSB9LAotCQkgICAgICB7ICJoaCIsIDIsIEJGRF9SRUxPQ19TUEFSQ19ISDIyLCAxLCAxIH0sCi0JCSAgICAgIHsgImhtIiwgMiwgQkZEX1JFTE9DX1NQQVJDX0hNMTAsIDEsIDEgfSwKLQkJICAgICAgeyAibG0iLCAyLCBCRkRfUkVMT0NfU1BBUkNfTE0yMiwgMSwgMSB9LAotCQkgICAgICB7ICJoNDQiLCAzLCBCRkRfUkVMT0NfU1BBUkNfSDQ0LCAxLCAwIH0sCi0JCSAgICAgIHsgIm00NCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19NNDQsIDEsIDAgfSwKLQkJICAgICAgeyAibDQ0IiwgMywgQkZEX1JFTE9DX1NQQVJDX0w0NCwgMSwgMCB9LAotCQkgICAgICB7ICJ1aGkiLCAzLCBCRkRfUkVMT0NfU1BBUkNfSEgyMiwgMSwgMCB9LAotCQkgICAgICB7ICJ1bG8iLCAzLCBCRkRfUkVMT0NfU1BBUkNfSE0xMCwgMSwgMCB9LAotCQkgICAgICB7IE5VTEwgfQotCQkgICAgfTsKLQkJICAgIGNvbnN0IHN0cnVjdCBvcHMgKm87Ci0gIAotCQkgICAgZm9yIChvID0gb3BzOyBvLT5uYW1lOyBvKyspCi0JCSAgICAgIGlmIChzdHJuY21wIChzICsgMSwgby0+bmFtZSwgby0+bGVuKSA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICBpZiAoby0+bmFtZSA9PSBOVUxMKQotCQkgICAgICBicmVhazsKLQkJICAgICAgCi0JCSAgICBpZiAoc1tvLT5sZW4gKyAxXSAhPSAnKCcpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kczogJSUlcyByZXF1aXJlcyBhcmd1bWVudHMgaW4gKCkiKSwgby0+bmFtZSk7Ci0JCQlyZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkgICAgICB9Ci0KLQkJICAgIG9wX2FyZyA9IG8tPm5hbWU7Ci0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IG8tPnJlbG9jOwotCQkgICAgcyArPSBvLT5sZW4gKyAyOwotCQkgICAgdjlfYXJnX3AgPSBvLT52OV9wOwotCQkgIH0KLQotCQkvKiBOb3RlIHRoYXQgaWYgdGhlIGdldF9leHByZXNzaW9uKCkgZmFpbHMsIHdlIHdpbGwgc3RpbGwKLQkJICAgaGF2ZSBjcmVhdGVkIFUgZW50cmllcyBpbiB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUKLQkJICAgJ3N5bWJvbHMnIGluIHRoZSBpbnB1dCBzdHJpbmcuICBUcnkgbm90IHRvIGNyZWF0ZSBVCi0JCSAgIHN5bWJvbHMgZm9yIHJlZ2lzdGVycywgZXRjLiAgKi8KLQotCQkvKiBUaGlzIHN0dWZmIGNoZWNrcyB0byBzZWUgaWYgdGhlIGV4cHJlc3Npb24gZW5kcyBpbgotCQkgICArJXJlZy4gIElmIGl0IGRvZXMsIGl0IHJlbW92ZXMgdGhlIHJlZ2lzdGVyIGZyb20KLQkJICAgdGhlIGV4cHJlc3Npb24sIGFuZCByZS1zZXRzICdzJyB0byBwb2ludCB0byB0aGUKLQkJICAgcmlnaHQgcGxhY2UuICAqLwotCi0JCWlmIChvcF9hcmcpCi0JCSAgewotCQkgICAgaW50IG5wYXIgPSAwOwotCi0JCSAgICBmb3IgKHMxID0gczsgKnMxICYmICpzMSAhPSAnLCcgJiYgKnMxICE9ICddJzsgczErKykKLQkJICAgICAgaWYgKCpzMSA9PSAnKCcpCi0JCQlucGFyKys7Ci0JCSAgICAgIGVsc2UgaWYgKCpzMSA9PSAnKScpCi0JCQl7Ci0JCQkgIGlmICghbnBhcikKLQkJCSAgICBicmVhazsKLQkJCSAgbnBhci0tOwotCQkJfQotCi0JCSAgICBpZiAoKnMxICE9ICcpJykKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzOiAlJSVzIHJlcXVpcmVzIGFyZ3VtZW50cyBpbiAoKSIpLCBvcF9hcmcpOwotCQkJcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICAqczEgPSAnXDAnOwotCQkgICAgKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJICAgICpzMSA9ICcpJzsKLQkJICAgIHMgPSBzMSArIDE7Ci0JCSAgICBpZiAoKnMgPT0gJywnIHx8ICpzID09ICddJyB8fCAhKnMpCi0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgaWYgKCpzICE9ICcrJyAmJiAqcyAhPSAnLScpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kczogQ2FuJ3QgZG8gYXJpdGhtZXRpY3Mgb3RoZXIgdGhhbiArIGFuZCAtIGludm9sdmluZyAlJSVzKCkiKSwgb3BfYXJnKTsKLQkJCXJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JCSAgICAgIH0KLQkJICAgICpzMSA9ICcwJzsKLQkJICAgIHMgPSBzMTsKLQkJICAgIG9wX2V4cCA9IHRoZV9pbnNuLmV4cDsKLQkJICAgIG1lbXNldCAoJnRoZV9pbnNuLmV4cCwgMCwgc2l6ZW9mKHRoZV9pbnNuLmV4cCkpOwotCQkgIH0KLQotCQlmb3IgKHMxID0gczsgKnMxICYmICpzMSAhPSAnLCcgJiYgKnMxICE9ICddJzsgczErKykgOwotCi0JCWlmIChzMSAhPSBzICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzMVstMV0pKQotCQkgIHsKLQkJICAgIGlmIChzMVstMl0gPT0gJyUnICYmIHMxWy0zXSA9PSAnKycpCi0JCSAgICAgIHMxIC09IDM7Ci0JCSAgICBlbHNlIGlmIChzdHJjaHIgKCJnb2xpMDEyMzQ1Njc4OSIsIHMxWy0yXSkgJiYgczFbLTNdID09ICclJyAmJiBzMVstNF0gPT0gJysnKQotCQkgICAgICBzMSAtPSA0OwotCQkgICAgZWxzZQotCQkgICAgICBzMSA9IE5VTEw7Ci0JCSAgICBpZiAoczEpCi0JCSAgICAgIHsKLQkJCSpzMSA9ICdcMCc7Ci0JCQkodm9pZCkgZ2V0X2V4cHJlc3Npb24gKHMpOwotCQkJKnMxID0gJysnOwotCQkJaWYgKG9wX2FyZykKLQkJCSAgKnMgPSAnKSc7Ci0JCQlzID0gczE7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICBzMSA9IE5VTEw7Ci0KLQkJaWYgKCFzMSkKLQkJICB7Ci0JCSAgICAodm9pZCkgZ2V0X2V4cHJlc3Npb24gKHMpOwotCQkgICAgaWYgKG9wX2FyZykKLQkJICAgICAgKnMgPSAnKSc7Ci0JCSAgICBzID0gZXhwcl9lbmQ7Ci0JCSAgfQotCi0JCWlmIChvcF9hcmcpCi0JCSAgewotCQkgICAgdGhlX2luc24uZXhwMiA9IHRoZV9pbnNuLmV4cDsKLQkJICAgIHRoZV9pbnNuLmV4cCA9IG9wX2V4cDsKLQkJICAgIGlmICh0aGVfaW5zbi5leHAyLlhfb3AgPT0gT19hYnNlbnQpCi0JCSAgICAgIHRoZV9pbnNuLmV4cDIuWF9vcCA9IE9faWxsZWdhbDsKLQkJICAgIGVsc2UgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fYWJzZW50KQotCQkgICAgICB7Ci0JCQl0aGVfaW5zbi5leHAgPSB0aGVfaW5zbi5leHAyOwotCQkJdGhlX2luc24uZXhwMi5YX29wID0gT19pbGxlZ2FsOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgICB7Ci0JCQl2YWx1ZVQgdmFsID0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKLQkJCXN3aXRjaCAodGhlX2luc24ucmVsb2MpCi0JCQkgIHsKLQkJCSAgZGVmYXVsdDoKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISDIyOgotCQkJICAgIHZhbCA9IEJTUiAodmFsLCAzMik7Ci0JCQkgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MTTIyOgotCQkJICBjYXNlIEJGRF9SRUxPQ19ISTIyOgotCQkJICAgIHZhbCA9ICh2YWwgPj4gMTApICYgMHgzZmZmZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSE0xMDoKLQkJCSAgICB2YWwgPSBCU1IgKHZhbCwgMzIpOwotCQkJICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfTE8xMDoKLQkJCSAgICB2YWwgJj0gMHgzZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSDQ0OgotCQkJICAgIHZhbCA+Pj0gMjI7Ci0JCQkgICAgdmFsICY9IDB4M2ZmZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX000NDoKLQkJCSAgICB2YWwgPj49IDEyOwotCQkJICAgIHZhbCAmPSAweDNmZjsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MNDQ6Ci0JCQkgICAgdmFsICY9IDB4ZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hJWDIyOgotCQkJICAgIHZhbCA9IH4gdmFsOwotCQkJICAgIHZhbCA9ICh2YWwgPj4gMTApICYgMHgzZmZmZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE9YMTA6Ci0JCQkgICAgdmFsID0gKHZhbCAmIDB4M2ZmKSB8IDB4MWMwMDsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkJdGhlX2luc24uZXhwID0gdGhlX2luc24uZXhwMjsKLQkJCXRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgKz0gdmFsOwotCQkJdGhlX2luc24uZXhwMi5YX29wID0gT19pbGxlZ2FsOwotCQkJdGhlX2luc24ucmVsb2MgPSBvbGRfcmVsb2M7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHRoZV9pbnNuLmV4cDIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6IENhbid0IGFkZCBub24tY29uc3RhbnQgZXhwcmVzc2lvbiB0byAlJSVzKCkiKSwgb3BfYXJnKTsKLQkJCXJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaWYgKDEgfHwgb2xkX3JlbG9jICE9IEJGRF9SRUxPQ19TUEFSQzEzCi0JCQkgICAgfHwgdGhlX2luc24ucmVsb2MgIT0gQkZEX1JFTE9DX0xPMTAKLQkJCSAgICB8fCBzcGFyY19hcmNoX3NpemUgIT0gNjQKLQkJCSAgICB8fCBzcGFyY19waWNfY29kZSkKLQkJCSAgewotCQkJICAgIGFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kczogQ2FuJ3QgZG8gYXJpdGhtZXRpY3MgaW52b2x2aW5nICUlJXMoKSBvZiBhIHJlbG9jYXRhYmxlIHN5bWJvbCIpLCBvcF9hcmcpOwotCQkJICAgIHJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JCQkgIH0KLQkJCXRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDX09MTzEwOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICAvKiBDaGVjayBmb3IgY29uc3RhbnRzIHRoYXQgZG9uJ3QgcmVxdWlyZSBlbWl0dGluZyBhIHJlbG9jLiAgKi8KLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudAotCQkgICYmIHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gMAotCQkgICYmIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSAwKQotCQl7Ci0JCSAgLyogRm9yIHBjLXJlbGF0aXZlIGNhbGwgaW5zdHJ1Y3Rpb25zLCB3ZSByZWplY3QKLQkJICAgICBjb25zdGFudHMgdG8gZ2V0IGJldHRlciBjb2RlLiAgKi8KLQkJICBpZiAodGhlX2luc24ucGNyZWwKLQkJICAgICAgJiYgdGhlX2luc24ucmVsb2MgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi0JCSAgICAgICYmIGluX3NpZ25lZF9yYW5nZSAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciwgMHgzZmZmKSkKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogUEMtcmVsYXRpdmUgb3BlcmFuZCBjYW4ndCBiZSBhIGNvbnN0YW50Iik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0KLQkJICAvKiBDb25zdGFudHMgdGhhdCB3b24ndCBmaXQgYXJlIGNoZWNrZWQgaW4gbWRfYXBwbHlfZml4MwotCQkgICAgIGFuZCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLgotCQkgICAgID8/PyBJdCB3b3VsZCBiZSBwcmVmZXJhYmxlIHRvIGluc3RhbGwgdGhlIGNvbnN0YW50cwotCQkgICAgIGludG8gdGhlIGluc24gaGVyZSBhbmQgc2F2ZSBoYXZpbmcgdG8gY3JlYXRlIGEgZml4UwotCQkgICAgIGZvciBlYWNoIG9uZS4gIFRoZXJlIGFscmVhZHkgZXhpc3RzIGNvZGUgdG8gaGFuZGxlCi0JCSAgICAgYWxsIHRoZSB2YXJpb3VzIGNhc2VzIChlLmcuIGluIG1kX2FwcGx5X2ZpeDMgYW5kCi0JCSAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbikgc28gZHVwbGljYXRpbmcgYWxsIHRoYXQgY29kZQotCQkgICAgIGhlcmUgaXNuJ3QgcmlnaHQuICAqLwotCQl9Ci0KLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdhJzoKLQkgICAgICBpZiAoKnMrKyA9PSAnYScpCi0JCXsKLQkJICBvcGNvZGUgfD0gQU5OVUw7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdBJzoKLQkgICAgICB7Ci0JCWludCBhc2kgPSAwOwotCi0JCS8qIFBhcnNlIGFuIGFzaS4gICovCi0JCWlmICgqcyA9PSAnIycpCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9hc2ksICZzLCAmYXNpKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBBU0kgbmFtZSIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmICghIHBhcnNlX2NvbnN0X2V4cHJfYXJnICgmcywgJmFzaSkpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgQVNJIGV4cHJlc3Npb24iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChhc2kgPCAwIHx8IGFzaSA+IDI1NSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBBU0kgbnVtYmVyIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCQlvcGNvZGUgfD0gQVNJIChhc2kpOwotCQljb250aW51ZTsKLQkgICAgICB9CQkJLyogYWx0ZXJuYXRlIHNwYWNlICovCi0KLQkgICAgY2FzZSAncCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlcHNyIiwgNCkgPT0gMCkKLQkJewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3EnOgkJLyogZmxvYXRpbmcgcG9pbnQgcXVldWUgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVmcSIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdRJzoJCS8qIGNvcHJvY2Vzc29yIHF1ZXVlICovCi0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlY3EiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgaWYgKHN0cmNtcCAoc3RyLCAic2V0IikgPT0gMAotCQkgIHx8IHN0cmNtcCAoc3RyLCAic2V0dXciKSA9PSAwKQotCQl7Ci0JCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX1NFVDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAic2V0c3ciKSA9PSAwKQotCQl7Ci0JCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX1NFVFNXOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChzdHIsICJzZXR4IikgPT0gMCkKLQkJewotCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9TRVRYOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAoc3RyLCAiZmRpdiIsIDQpID09IDApCi0JCXsKLQkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfRkRJVjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ28nOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWFzaSIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdzJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVmcHJzIiwgNSkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA1OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0UnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWNjciIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd0JzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV0YnIiLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAndyc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIld2ltIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIHsKLQkJY2hhciAqcHVzaCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJZXhwcmVzc2lvblMgZTsKLQotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCQlleHByZXNzaW9uICgmZSk7Ci0JCWlmIChlLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICB7Ci0JCSAgICBpbnQgbiA9IGUuWF9hZGRfbnVtYmVyOwotCQkgICAgaWYgKG4gIT0gZS5YX2FkZF9udW1iZXIgfHwgKG4gJiB+MHgxZmYpICE9IDApCi0JCSAgICAgIGFzX2JhZCAoXygiT1BGIGltbWVkaWF0ZSBvcGVyYW5kIG91dCBvZiByYW5nZSAoMC0weDFmZikiKSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG9wY29kZSB8PSBlLlhfYWRkX251bWJlciA8PCA1OwotCQkgIH0KLQkJZWxzZQotCQkgIGFzX2JhZCAoXygibm9uLWltbWVkaWF0ZSBPUEYgb3BlcmFuZCwgaWdub3JlZCIpKTsKLQkJcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJaW5wdXRfbGluZV9wb2ludGVyID0gcHVzaDsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGNhc2UgJ3knOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXkiLCAyKSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDI7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAndSc6Ci0JICAgIGNhc2UgJ1UnOgotCSAgICAgIHsKLQkJLyogUGFyc2UgYSBzcGFyY2xldCBjcHJlZy4gICovCi0JCWludCBjcHJlZzsKLQkJaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9zcGFyY2xldF9jcHJlZywgJnMsICZjcHJlZykpCi0JCSAgewotCQkgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBjcHJlZyBuYW1lIik7Ci0JCSAgICBnb3RvIGVycm9yOwotCQkgIH0KLQkJb3Bjb2RlIHw9ICgqYXJncyA9PSAnVScgPyBSUzEgKGNwcmVnKSA6IFJEIChjcHJlZykpOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JICAgIH0JCQkvKiBzd2l0Y2ggb24gYXJnIGNvZGUgKi8KLQotCSAgLyogQnJlYWsgb3V0IG9mIGZvcigpIGxvb3AuICAqLwotCSAgYnJlYWs7Ci0JfQkJCS8qIGZvciBlYWNoIGFyZyB0aGF0IHdlIGV4cGVjdCAqLwotCi0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLQl7Ci0JICAvKiBBcmdzIGRvbid0IG1hdGNoLiAqLwotCSAgaWYgKCZpbnNuWzFdIC0gc3BhcmNfb3Bjb2RlcyA8IHNwYXJjX251bV9vcGNvZGVzCi0JICAgICAgJiYgKGluc24tPm5hbWUgPT0gaW5zblsxXS5uYW1lCi0JCSAgfHwgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkpCi0JICAgIHsKLQkgICAgICArK2luc247Ci0JICAgICAgcyA9IGFyZ3NTdGFydDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzJXMiKSwgZXJyb3JfbWVzc2FnZSk7Ci0JICAgICAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBoYXZlIGEgbWF0Y2guICBOb3cgc2VlIGlmIHRoZSBhcmNoaXRlY3R1cmUgaXMgb2suICAqLwotCSAgaW50IG5lZWRlZF9hcmNoX21hc2sgPSBpbnNuLT5hcmNoaXRlY3R1cmU7Ci0KLQkgIGlmICh2OV9hcmdfcCkKLQkgICAgewotCSAgICAgIG5lZWRlZF9hcmNoX21hc2sgJj0gfiAoKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjkpCi0JCQkJICAgICB8ICgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkpOwotCSAgICAgIG5lZWRlZF9hcmNoX21hc2sgfD0gKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjkpOwotCSAgICB9Ci0KLQkgIGlmIChuZWVkZWRfYXJjaF9tYXNrICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCSAgICA7IC8qIG9rICovCi0JICAvKiBDYW4gd2UgYnVtcCB1cCB0aGUgYXJjaGl0ZWN0dXJlPyAgKi8KLQkgIGVsc2UgaWYgKG5lZWRlZF9hcmNoX21hc2sgJiBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkgICAgewotCSAgICAgIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIG5lZWRlZF9hcmNoaXRlY3R1cmUgPQotCQlzcGFyY19mZnMgKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKG1heF9hcmNoaXRlY3R1cmUpCi0JCQkgICAmIG5lZWRlZF9hcmNoX21hc2spOwotCi0JICAgICAgYXNzZXJ0IChuZWVkZWRfYXJjaGl0ZWN0dXJlIDw9IFNQQVJDX09QQ09ERV9BUkNIX01BWCk7Ci0JICAgICAgaWYgKHdhcm5fb25fYnVtcAotCQkgICYmIG5lZWRlZF9hcmNoaXRlY3R1cmUgPiB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSkKLQkJewotCQkgIGFzX3dhcm4gKF8oImFyY2hpdGVjdHVyZSBidW1wZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIG9uIFwiJXNcIiIpLAotCQkJICAgc3BhcmNfb3Bjb2RlX2FyY2hzW2N1cnJlbnRfYXJjaGl0ZWN0dXJlXS5uYW1lLAotCQkJICAgc3BhcmNfb3Bjb2RlX2FyY2hzW25lZWRlZF9hcmNoaXRlY3R1cmVdLm5hbWUsCi0JCQkgICBzdHIpOwotCQkgIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlID0gbmVlZGVkX2FyY2hpdGVjdHVyZTsKLQkJfQotCSAgICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlID0gbmVlZGVkX2FyY2hpdGVjdHVyZTsKLQkgICAgfQotCSAgLyogQ29uZmxpY3QuICAqLwotCSAgLyogPz8/IFRoaXMgc2VlbXMgdG8gYmUgYSBiaXQgZnJhZ2lsZS4gIFdoYXQgaWYgdGhlIG5leHQgZW50cnkgaW4KLQkgICAgIHRoZSBvcGNvZGUgdGFibGUgaXMgdGhlIG9uZSB3ZSB3YW50IGFuZCBpdCBpcyBzdXBwb3J0ZWQ/Ci0JICAgICBJdCBpcyBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSB0YWJsZSB0b2RheSBzbyB0aGF0IHRoaXMgY2FuJ3QKLQkgICAgIGhhcHBlbiBidXQgd2hhdCBhYm91dCB0b21vcnJvdz8gICovCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgYXJjaCxwcmludGVkX29uZV9wID0gMDsKLQkgICAgICBjaGFyICpwOwotCSAgICAgIGNoYXIgcmVxdWlyZWRfYXJjaHNbU1BBUkNfT1BDT0RFX0FSQ0hfTUFYICogMTZdOwotCi0JICAgICAgLyogQ3JlYXRlIGEgbGlzdCBvZiB0aGUgYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgdGhlIGluc24uICAqLwotCSAgICAgIG5lZWRlZF9hcmNoX21hc2sgJj0gfiBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChtYXhfYXJjaGl0ZWN0dXJlKTsKLQkgICAgICBwID0gcmVxdWlyZWRfYXJjaHM7Ci0JICAgICAgYXJjaCA9IHNwYXJjX2ZmcyAobmVlZGVkX2FyY2hfbWFzayk7Ci0JICAgICAgd2hpbGUgKCgxIDw8IGFyY2gpIDw9IG5lZWRlZF9hcmNoX21hc2spCi0JCXsKLQkJICBpZiAoKDEgPDwgYXJjaCkgJiBuZWVkZWRfYXJjaF9tYXNrKQotCQkgICAgewotCQkgICAgICBpZiAocHJpbnRlZF9vbmVfcCkKLQkJCSpwKysgPSAnfCc7Ci0JCSAgICAgIHN0cmNweSAocCwgc3BhcmNfb3Bjb2RlX2FyY2hzW2FyY2hdLm5hbWUpOwotCQkgICAgICBwICs9IHN0cmxlbiAocCk7Ci0JCSAgICAgIHByaW50ZWRfb25lX3AgPSAxOwotCQkgICAgfQotCQkgICsrYXJjaDsKLQkJfQotCi0JICAgICAgYXNfYmFkIChfKCJBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggb24gXCIlc1wiLiIpLCBzdHIpOwotCSAgICAgIGFzX3Rza3RzayAoXygiIChSZXF1aXJlcyAlczsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyAlcy4pIiksCi0JCQkgcmVxdWlyZWRfYXJjaHMsCi0JCQkgc3BhcmNfb3Bjb2RlX2FyY2hzW21heF9hcmNoaXRlY3R1cmVdLm5hbWUpOwotCSAgICAgIHJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JICAgIH0KLQl9IC8qIGlmIG5vIG1hdGNoICovCi0KLSAgICAgIGJyZWFrOwotICAgIH0gLyogZm9yZXZlciBsb29raW5nIGZvciBhIG1hdGNoICovCi0KLSAgdGhlX2luc24ub3Bjb2RlID0gb3Bjb2RlOwotICByZXR1cm4gc3BlY2lhbF9jYXNlOwotfQotCi0vKiBQYXJzZSBhbiBhcmd1bWVudCB0aGF0IGNhbiBiZSBleHByZXNzZWQgYXMgYSBrZXl3b3JkLgotICAgKGVnOiAjU3RvcmVTdG9yZSBvciAlY2NmcikuCi0gICBUaGUgcmVzdWx0IGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0gICBJZiBzdWNjZXNzZnVsLCBJTlBVVF9QT0lOVEVSIGlzIHVwZGF0ZWQuICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9rZXl3b3JkX2FyZyAobG9va3VwX2ZuLCBpbnB1dF9wb2ludGVyUCwgdmFsdWVQKQotICAgICBpbnQgKCpsb29rdXBfZm4pIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotICAgICBjaGFyICoqaW5wdXRfcG9pbnRlclA7Ci0gICAgIGludCAqdmFsdWVQOwotewotICBpbnQgdmFsdWU7Ci0gIGNoYXIgYywgKnAsICpxOwotCi0gIHAgPSAqaW5wdXRfcG9pbnRlclA7Ci0gIGZvciAocSA9IHAgKyAoKnAgPT0gJyMnIHx8ICpwID09ICclJyk7Ci0gICAgICAgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpxKSB8fCAqcSA9PSAnXyc7Ci0gICAgICAgKytxKQotICAgIGNvbnRpbnVlOwotICBjID0gKnE7Ci0gICpxID0gMDsKLSAgdmFsdWUgPSAoKmxvb2t1cF9mbikgKHApOwotICAqcSA9IGM7Ci0gIGlmICh2YWx1ZSA9PSAtMSkKLSAgICByZXR1cm4gMDsKLSAgKnZhbHVlUCA9IHZhbHVlOwotICAqaW5wdXRfcG9pbnRlclAgPSBxOwotICByZXR1cm4gMTsKLX0KLQotLyogUGFyc2UgYW4gYXJndW1lbnQgdGhhdCBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24uCi0gICBUaGUgcmVzdWx0IGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9jb25zdF9leHByX2FyZyAoaW5wdXRfcG9pbnRlclAsIHZhbHVlUCkKLSAgICAgY2hhciAqKmlucHV0X3BvaW50ZXJQOwotICAgICBpbnQgKnZhbHVlUDsKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9ICppbnB1dF9wb2ludGVyUDsKLSAgLyogVGhlIG5leHQgZXhwcmVzc2lvbiBtYXkgYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBjb25zdGFudAotICAgICAoc2F5IGlmIHdlJ3JlIG5vdCBwcm9jZXNzaW5nIHRoZSByaWdodCB2YXJpYW50IG9mIHRoZSBpbnNuKS4KLSAgICAgRG9uJ3QgY2FsbCBleHByZXNzaW9uIHVubGVzcyB3ZSdyZSBzdXJlIGl0IHdpbGwgc3VjY2VlZCBhcyBpdCB3aWxsCi0gICAgIHNpZ25hbCBhbiBlcnJvciAod2hpY2ggd2Ugd2FudCB0byBkZWZlciB1bnRpbCBsYXRlcikuICAqLwotICAvKiBGSVhNRTogSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGRlZmluZSBtZF9vcGVyYW5kIGFuZCBoYXZlIGl0IHJlY29nbml6ZQotICAgICB0aGluZ3MgbGlrZSAlYXNpLCBldGMuIGJ1dCBjb250aW51aW5nIHRoYXQgcm91dGUgdGhyb3VnaCB0byB0aGUgZW5kCi0gICAgIGlzIGEgbG90IG9mIHdvcmsuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJScpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICppbnB1dF9wb2ludGVyUCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgcmV0dXJuIDA7Ci0gICp2YWx1ZVAgPSBleHAuWF9hZGRfbnVtYmVyOwotICByZXR1cm4gMTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBzcGFyY19pcCB0byBwYXJzZSBhbiBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIGludAotZ2V0X2V4cHJlc3Npb24gKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzYXZlX2luOwotICBzZWdUIHNlZzsKLQotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0gIHNlZyA9IGV4cHJlc3Npb24gKCZ0aGVfaW5zbi5leHApOwotICBpZiAoc2VnICE9IGFic29sdXRlX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSBic3Nfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLmVycm9yID0gXygiYmFkIHNlZ21lbnQiKTsKLSAgICAgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAwOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG1kX2Fzc2VtYmxlIHRvIG91dHB1dCBvbmUgaW5zbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vdXRwdXRfaW5zbiAoaW5zbiwgdGhlX2luc24pCi0gICAgIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKmluc247Ci0gICAgIHN0cnVjdCBzcGFyY19pdCAqdGhlX2luc247Ci17Ci0gIGNoYXIgKnRvUCA9IGZyYWdfbW9yZSAoNCk7Ci0KLSAgLyogcHV0IG91dCB0aGUgb3Bjb2RlICovCi0gIGlmIChJTlNOX0JJR19FTkRJQU4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAodG9QLCAodmFsdWVUKSB0aGVfaW5zbi0+b3Bjb2RlLCA0KTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHRvUCwgKHZhbHVlVCkgdGhlX2luc24tPm9wY29kZSwgNCk7Ci0KLSAgLyogcHV0IG91dCB0aGUgc3ltYm9sLWRlcGVuZGVudCBzdHVmZiAqLwotICBpZiAodGhlX2luc24tPnJlbG9jICE9IEJGRF9SRUxPQ19OT05FKQotICAgIHsKLSAgICAgIGZpeFMgKmZpeFAgPSAgZml4X25ld19leHAgKGZyYWdfbm93LAkvKiB3aGljaCBmcmFnICovCi0JCQkJICh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCS8qIHdoZXJlICovCi0JCQkJIDQsCQkvKiBzaXplICovCi0JCQkJICZ0aGVfaW5zbi0+ZXhwLAotCQkJCSB0aGVfaW5zbi0+cGNyZWwsCi0JCQkJIHRoZV9pbnNuLT5yZWxvYyk7Ci0gICAgICAvKiBUdXJuIG9mZiBvdmVyZmxvdyBjaGVja2luZyBpbiBmaXh1cF9zZWdtZW50LiAgV2UnbGwgZG8gb3VyCi0JIG93biBvdmVyZmxvdyBjaGVja2luZyBpbiBtZF9hcHBseV9maXgzLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQotCSB0aGUgaW5zbiBzaXplIGlzIDQgYW5kIGZpeHVwX3NlZ21lbnQgd2lsbCBzaWduYWwgYW4gb3ZlcmZsb3cgZm9yCi0JIGxhcmdlIDggYnl0ZSBxdWFudGl0aWVzLiAgKi8KLSAgICAgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLSAgICB9Ci0KLSAgbGFzdF9pbnNuID0gaW5zbjsKLSAgbGFzdF9vcGNvZGUgPSB0aGVfaW5zbi0+b3Bjb2RlOwotfQotDAotLyoKLSAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG1kX2F0b2YgaW4gbTY4ay5jLiAgSSB0aGluayB0aGlzIGlzIHJpZ2h0LAotICBidXQgSSdtIG5vdCBzdXJlLgotCi0gIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gICovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBpLHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gICAgIAotICByZXR1cm4gMDsKLX0KLQotLyogV3JpdGUgYSB2YWx1ZSBvdXQgdG8gdGhlIG9iamVjdCBmaWxlLCB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgIGVuZGlhbm5lc3MuICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlIGlmICh0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhCi0JICAgJiYgKChuID09IDQgfHwgbiA9PSAyKSAmJiB+bm93X3NlZy0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQotICAgIC8qIE91dHB1dCBkZWJ1ZyB3b3Jkcywgd2hpY2ggYXJlIG5vdCBpbiBhbGxvY2F0ZWQgc2VjdGlvbnMsIGFzIGJpZyBlbmRpYW4gKi8KLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UgaWYgKHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEgfHwgISB0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0MCi0vKiBBcHBseSBhIGZpeFMgdG8gdGhlIGZyYWdzLCBub3cgdGhhdCB3ZSBrbm93IHRoZSB2YWx1ZSBpdCBvdWdodCB0bwotICAgaG9sZC4gKi8KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWx1ZSwgc2VnbWVudCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWx1ZTsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIG9mZnNldFQgdmFsOwotICBsb25nIGluc247Ci0KLSAgdmFsID0gKnZhbHVlOwotCi0gIGFzc2VydCAoZml4UC0+Znhfcl90eXBlIDwgQkZEX1JFTE9DX1VOVVNFRCk7Ci0KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgZW1pdF9yZWxvYyAqLwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBGSVhNRTogU1BBUkMgRUxGIHJlbG9jYXRpb25zIGRvbid0IHVzZSBhbiBhZGRlbmQgaW4gdGhlIGRhdGEKLSAgICAgZmllbGQgaXRzZWxmLiAgVGhpcyB3aG9sZSBhcHByb2FjaCBzaG91bGQgYmUgc29tZWhvdyBjb21iaW5lZAotICAgICB3aXRoIHRoZSBjYWxscyB0byBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgQWxzbywgdGhlIHZhbHVlIHBhc3NlZAotICAgICBpbiBieSBmaXh1cF9zZWdtZW50IGluY2x1ZGVzIHRoZSB2YWx1ZSBvZiBhIGRlZmluZWQgc3ltYm9sLiAgV2UKLSAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSB2YWx1ZSBvZiBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgfHwgKHNwYXJjX3BpY19jb2RlICYmICEgZml4UC0+ZnhfcGNyZWwpCi0JICAgICAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWdtZW50Ci0JCSAgJiYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCQkJICAgICAgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKQotCQkgICAgICAgJiBTRUNfTElOS19PTkNFKSAhPSAwCi0JCSAgICAgIHx8IHN0cm5jbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKSwKLQkJCQkgICIuZ251LmxpbmtvbmNlIiwKLQkJCQkgIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKSkpCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gYWJzb2x1dGVfc2VjdGlvbgotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JICAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKSkKLQlmaXhQLT5meF9hZGRudW1iZXIgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFRoaXMgaXMgYSBoYWNrLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSB0bwotICAgICBoYW5kbGUgdGhpcy4gIFByb2JhYmx5IGluIHRlcm1zIG9mIGhvd3RvIGZpZWxkcywgb25jZQotICAgICB3ZSBjYW4gbG9vayBhdCB0aGVzZSBmaXh1cHMgaW4gdGVybXMgb2YgaG93dG9zLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgdmFsICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLQotI2lmZGVmIE9CSl9BT1VUCi0gIC8qIEZJWE1FOiBNb3JlIHJpZGljdWxvdXMgZ2FzIHJlbG9jIGhhY2tpbmcuICBJZiB3ZSBhcmUgZ29pbmcgdG8KLSAgICAgZ2VuZXJhdGUgYSByZWxvYywgdGhlbiB3ZSBqdXN0IHdhbnQgdG8gbGV0IHRoZSByZWxvYyBhZGRlbmQgc2V0Ci0gICAgIHRoZSB2YWx1ZS4gIFdlIGRvIG5vdCB3YW50IHRvIGFsc28gc3R1ZmYgdGhlIGFkZGVuZCBpbnRvIHRoZQotICAgICBvYmplY3QgZmlsZS4gIEluY2x1ZGluZyB0aGUgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZSB3b3JrcyB3aGVuCi0gICAgIGRvaW5nIGEgc3RhdGljIGxpbmssIGJlY2F1c2UgdGhlIGxpbmtlciB3aWxsIGlnbm9yZSB0aGUgb2JqZWN0Ci0gICAgIGZpbGUgY29udGVudHMuICBIb3dldmVyLCB0aGUgZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgaWdub3JlIHRoZQotICAgICBvYmplY3QgZmlsZSBjb250ZW50cy4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiBmaXhQLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyKQotICAgIHZhbCA9IDA7Ci0KLSAgLyogV2hlbiBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBkbyBub3Qgd2FudCBhbiBhZGRlbmQgZm9yIGEgcmVsb2MKLSAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gIFdlIGFkanVzdCBmeF9hZGRudW1iZXIgdG8gY2FuY2VsIG91dCB0aGUKLSAgICAgdmFsdWUgYWxyZWFkeSBpbmNsdWRlZCBpbiB2YWwsIGFuZCB0byBhbHNvIGNhbmNlbCBvdXQgdGhlCi0gICAgIGFkanVzdG1lbnQgd2hpY2ggYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGNyZWF0ZS4gICovCi0gIGlmIChzcGFyY19waWNfY29kZQotICAgICAgJiYgZml4UC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgISBTX0lTX0NPTU1PTiAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiBzeW1ib2xfc2VjdGlvbl9wIChmaXhQLT5meF9hZGRzeSkpCi0gICAgZml4UC0+ZnhfYWRkbnVtYmVyIC09IDIgKiBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpOwotCi0gIC8qIFdoZW4gZ2VuZXJhdGluZyBQSUMgY29kZSwgd2UgbmVlZCB0byBmaWRkbGUgdG8gZ2V0Ci0gICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBhIFBDIHJlbGF0aXZlCi0gICAgIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIGtlZXAuICAqLwotICBpZiAoc3BhcmNfcGljX2NvZGUKLSAgICAgICYmIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmIChTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgICAgJiYgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICYmICEgU19JU19DT01NT04gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICB2YWwgPSAwOwotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyIC09IDIgKiBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElmIHRoaXMgaXMgYSBkYXRhIHJlbG9jYXRpb24sIGp1c3Qgb3V0cHV0IFZBTC4gICovCi0KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMTYpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgMik7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyCi0JICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TUEFSQ19SRVYzMikKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCA0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfNjQpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgOCk7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIAotICAgICAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEl0J3MgYSByZWxvY2F0aW9uIGFnYWluc3QgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi0gICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotCWluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgIAotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMX1MyOgotCSAgdmFsID0gdmFsID4+IDI7Ci0JICAvKiBGSVhNRTogVGhpcyBpbmNyZW1lbnQtYnktb25lIGRlc2VydmVzIGEgY29tbWVudCBvZiB3aHkgaXQncwotCSAgICAgYmVpbmcgZG9uZSEgICovCi0JICBpZiAoISBzcGFyY19waWNfY29kZQotCSAgICAgIHx8IGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwKLQkgICAgICB8fCBzeW1ib2xfc2VjdGlvbl9wIChmaXhQLT5meF9hZGRzeSkpCi0JICAgICsrdmFsOwotCSAgaW5zbiB8PSB2YWwgJiAweDNmZmZmZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ18xMToKLQkgIGlmICghIGluX3NpZ25lZF9yYW5nZSAodmFsLCAweDdmZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHg3ZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzEwOgotCSAgaWYgKCEgaW5fc2lnbmVkX3JhbmdlICh2YWwsIDB4M2ZmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDNmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfNzoKLQkgIGlmICghIGluX2JpdGZpZWxkX3JhbmdlICh2YWwsIDB4N2YpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4N2Y7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzY6Ci0JICBpZiAoISBpbl9iaXRmaWVsZF9yYW5nZSAodmFsLCAweDNmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDNmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ181OgotCSAgaWYgKCEgaW5fYml0ZmllbGRfcmFuZ2UgKHZhbCwgMHgxZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgxZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNjoKLQkgIC8qIEZJWE1FOiBzaW1wbGlmeSAqLwotCSAgaWYgKCgodmFsID4gMCkgJiYgKHZhbCAmIH4weDNmZmZjKSkKLQkgICAgICB8fCAoKHZhbCA8IDApICYmICh+KHZhbCAtIDEpICYgfjB4M2ZmZmMpKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgLyogRklYTUU6IFRoZSArMSBkZXNlcnZlcyBhIGNvbW1lbnQuICAqLwotCSAgdmFsID0gKHZhbCA+PiAyKSArIDE7Ci0JICBpbnNuIHw9ICgodmFsICYgMHhjMDAwKSA8PCA2KSB8ICh2YWwgJiAweDNmZmYpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5OgotCSAgLyogRklYTUU6IHNpbXBsaWZ5ICovCi0JICBpZiAoKCh2YWwgPiAwKSAmJiAodmFsICYgfjB4MWZmZmZjKSkKLQkgICAgICB8fCAoKHZhbCA8IDApICYmICh+KHZhbCAtIDEpICYgfjB4MWZmZmZjKSkpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIC8qIEZJWE1FOiBUaGUgKzEgZGVzZXJ2ZXMgYSBjb21tZW50LiAgKi8KLQkgIHZhbCA9ICh2YWwgPj4gMikgKyAxOwotCSAgaW5zbiB8PSB2YWwgJiAweDdmZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19ISDIyOgotCSAgdmFsID0gQlNSICh2YWwsIDMyKTsKLQkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19MTTIyOgotCWNhc2UgQkZEX1JFTE9DX0hJMjI6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgaW5zbiB8PSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogTmVlZCBjb21tZW50IGV4cGxhaW5pbmcgd2h5IHdlIGRvIHRoaXMuICAqLwotCSAgICAgIGluc24gJj0gfjB4ZmZmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQzIyOgotCSAgaWYgKHZhbCAmIH4weDAwM2ZmZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9ICh2YWwgJiAweDNmZmZmZik7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0hNMTA6Ci0JICB2YWwgPSBCU1IgKHZhbCwgMzIpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgaW5zbiB8PSB2YWwgJiAweDNmZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IE5lZWQgY29tbWVudCBleHBsYWluaW5nIHdoeSB3ZSBkbyB0aGlzLiAgKi8KLQkgICAgICBpbnNuICY9IH4weGZmOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDMTM6Ci0JICBpZiAoISBpbl9zaWduZWRfcmFuZ2UgKHZhbCwgMHgxZmZmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDFmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI6Ci0JICB2YWwgPSAodmFsID4+IDIpICsgMTsKLQkgIC8qIEZBTExUSFJPVUdIICovCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyOgotCSAgaW5zbiB8PSB2YWwgJiAweDNmZmZmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfSDQ0OgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdHZhbCA9IHZhbDsKLQkgICAgICB0dmFsID4+PSAyMjsKLQkgICAgICBpbnNuIHw9IHR2YWwgJiAweDNmZmZmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICBpbnNuIHw9ICh2YWwgPj4gMTIpICYgMHgzZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0w0NDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIGluc24gfD0gdmFsICYgMHhmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0hJWDIyOgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIHZhbCBePSB+IChvZmZzZXRUKSAwOwotCSAgICAgIGluc24gfD0gKHZhbCA+PiAxMCkgJiAweDNmZmZmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19MT1gxMDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIGluc24gfD0gMHgxYzAwIHwgKHZhbCAmIDB4M2ZmKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfTk9ORToKLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygiYmFkIG9yIHVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIpLAotCQkJZml4UC0+Znhfcl90eXBlKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKElOU05fQklHX0VORElBTikKLQliZmRfcHV0YjMyIChpbnNuLCAodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKGluc24sICh1bnNpZ25lZCBjaGFyICopIGJ1Zik7Ci0gICAgfQotCi0gIC8qIEFyZSB3ZSBmaW5pc2hlZCB3aXRoIHRoaXMgcmVsb2NhdGlvbiBub3c/ICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiAhZml4UC0+ZnhfcGNyZWwpCi0gICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzEwOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMX1MyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDMTM6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkMyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19CQVNFMTM6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfNToKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ182OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzc6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfMTE6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSEgyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ITTEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0xNMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUENfSEgyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1BDX0xNMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSDQ0OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX000NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MNDQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSElYMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE9YMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUkVWMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9BT1VUKQotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBQSUMgY29kZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIGRpZmZlcmVudAotICAgICBzZXQgb2YgcmVsb2NzLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgR09UX05BTUUgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbHNlCi0jZGVmaW5lIEdPVF9OQU1FICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotI2VuZGlmCi0KLSAgaWYgKHNwYXJjX3BpY19jb2RlKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY29kZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUxfUzI6Ci0JICBpZiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfQ09NTU9OIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX0VYVEVSTkFMIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KSkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19XUExUMzA7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ19ISTIyOgotCSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSwgR09UX05BTUUpID09IDApCi0JICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfUEMyMjsKLQkgIGVsc2UKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19HT1QyMjsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpLCBHT1RfTkFNRSkgPT0gMCkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19QQzEwOwotCSAgZWxzZQotCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX0dPVDEwOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfU1BBUkMxMzoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfR09UMTM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQU9VVCkgKi8KLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiksCi0JCSAgICBmaXhwLT5meF9yX3R5cGUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQEAgV2h5IGZ4X2FkZG51bWJlciBzb21ldGltZXMgYW5kIGZ4X29mZnNldCBvdGhlciB0aW1lcz8gICovCi0jaWZkZWYgT0JKX0FPVVQKLQotICBpZiAocmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSA9PSAwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzEwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzIyKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UgaWYgKHNwYXJjX3BpY19jb2RlCi0JICAgJiYgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotCSAgICYmIGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAmJiAoU19JU19FWFRFUk5BTCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgIHx8IFNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQotCSAgICYmIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgJiYgISBTX0lTX0NPTU1PTiAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0IC0gcmVsb2MtPmFkZHJlc3M7Ci0KLSNlbHNlIC8qIGVsZiBvciBjb2ZmICovCi0KLSAgaWYgKHJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUgPT0gMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMxMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMyMikKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlIGlmIChzeW1ib2xfc2VjdGlvbl9wIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmVsb2MtPmFkZGVuZCA9IChzZWN0aW9uLT52bWEKLQkJICAgICArIGZpeHAtPmZ4X2FkZG51bWJlcgotCQkgICAgICsgbWRfcGNyZWxfZnJvbSAoZml4cCkpOwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSNlbmRpZgotCi0gIHJldHVybiByZWxvYzsKLX0KLQwKLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0JCQkJLyogbWRfdW5kZWZpbmVkX3N5bWJvbCgpICovCi0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZm5kZWYgT0JKX0VMRgotICAvKiBUaGlzIGlzIG5vdCByaWdodCBmb3IgRUxGOyBhLm91dCB3YW50cyBpdCwgYW5kIENPRkYgd2lsbCBmb3JjZQotICAgICB0aGUgYWxpZ25tZW50IGFueXdheXMuICAqLwotICB2YWx1ZVQgYWxpZ24gPSAoKHZhbHVlVCkgMQotCQkgIDw8ICh2YWx1ZVQpIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCkpOwotICB2YWx1ZVQgbmV3c2l6ZTsKLSAgLyogdHVybiBhbGlnbm1lbnQgdmFsdWUgaW50byBhIG1hc2sgKi8KLSAgYWxpZ24tLTsKLSAgbmV3c2l6ZSA9IChzaXplICsgYWxpZ24pICYgfmFsaWduOwotICByZXR1cm4gbmV3c2l6ZTsKLSNlbHNlCi0gIHJldHVybiBzaXplOwotI2VuZGlmCi19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBzcGFyYywgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCi0gICBpdHMgc2l6ZS4gIFRoaXMgZ2V0cyB1cyB0byB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLgotICAgKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTikgKi8KLWxvbmcgCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBsb25nIHJldDsKLQotICByZXQgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0gIGlmICghIHNwYXJjX3BpY19jb2RlCi0gICAgICB8fCBmaXhQLT5meF9hZGRzeSA9PSBOVUxMCi0gICAgICB8fCBzeW1ib2xfc2VjdGlvbl9wIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0ICs9IGZpeFAtPmZ4X3NpemU7Ci0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBSZXR1cm4gbG9nMiAoVkFMVUUpLCBvciAtMSBpZiBWQUxVRSBpcyBub3QgYW4gZXhhY3QgcG9zaXRpdmUgcG93ZXIKLSAgIG9mIHR3by4gICovCi0KLXN0YXRpYyBpbnQKLWxvZzIgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGludCBzaGlmdDsKLQotICBpZiAodmFsdWUgPD0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZm9yIChzaGlmdCA9IDA7ICh2YWx1ZSAmIDEpID09IDA7IHZhbHVlID4+PSAxKQotICAgICsrc2hpZnQ7Ci0KLSAgcmV0dXJuICh2YWx1ZSA9PSAxKSA/IHNoaWZ0IDogLTE7Ci19Ci0KLS8qCi0gKiBzb3J0IG9mIGxpa2Ugc19sY29tbQotICovCi0KLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIGludCBtYXhfYWxpZ25tZW50ID0gMTU7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXNfcmVzZXJ2ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyICpwOwotICBjaGFyIGM7Ci0gIGludCBhbGlnbjsKLSAgaW50IHNpemU7Ci0gIGludCB0ZW1wOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmICgoc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCBzaXplKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBiYWQgbGVuZ3RoICovCi0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLFwiYnNzXCIiLCA2KSAhPSAwCi0gICAgICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIsXCIuYnNzXCIiLCA3KSAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIC5yZXNlcnZlIHNlZ21lbnQgLS0gZXhwZWN0ZWQgQlNTIHNlZ21lbnQiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMl0gPT0gJy4nKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA3OwotICBlbHNlCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIGFsaWdubWVudCIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBhbGlnbiA9IChpbnQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCi0JewotCSAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OwotCSAgYXNfd2FybiAoXygiYWxpZ25tZW50IHRvbyBsYXJnZTsgYXNzdW1pbmcgJWQiKSwgYWxpZ24pOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoYWxpZ24gPCAwKQotCXsKLQkgIGFzX2JhZCAoXygibmVnYXRpdmUgYWxpZ25tZW50IikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChhbGlnbiAhPSAwKQotCXsKLQkgIHRlbXAgPSBsb2cyIChhbGlnbik7Ci0JICBpZiAodGVtcCA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGFsaWduID0gdGVtcDsKLQl9Ci0KLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0gICAgfQotICBlbHNlCi0gICAgYWxpZ24gPSAwOwotCi0gIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKQotI2lmZGVmIE9CSl9BT1VUCi0gICAgICAmJiBTX0dFVF9PVEhFUiAoc3ltYm9sUCkgPT0gMAotICAgICAgJiYgU19HRVRfREVTQyAoc3ltYm9sUCkgPT0gMAotI2VuZGlmCi0gICAgICApCi0gICAgewotICAgICAgaWYgKCEgbmVlZF9wYXNzXzIpCi0JewotCSAgY2hhciAqcGZyYWc7Ci0JICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLQkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMSk7IC8qIHN3aXRjaCB0byBic3MgKi8KLQotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7IC8qIGRvIGFsaWdubWVudCAqLwotCi0JICAvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZyAqLwotCSAgaWYgKFNfR0VUX1NFR01FTlQoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IE5VTEw7Ci0KLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCQkgICAgKG9mZnNldFQpIHNpemUsIChjaGFyICopMCk7Ci0JICAqcGZyYWcgPSAwOwotCi0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0KLQkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgJXMiLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICB9CQkJCS8qIGlmIG5vdCByZWRlZmluaW5nICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY29tbW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgaW50IHRlbXAsIHNpemU7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5DT01Nb24gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzaXplID0gdGVtcDsKLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgc2l6ZSkKLQl7Ci0JICBhc193YXJuIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iKSwKLQkJICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSNlbmRpZgotICAgIH0KLSAga25vdyAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBjb21tb24gbGVuZ3RoIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSNpZm5kZWYgT0JKX0VMRgotICAgICAgaWYgKHRlbXAgPiBtYXhfYWxpZ25tZW50KQotCXsKLQkgIHRlbXAgPSBtYXhfYWxpZ25tZW50OwotCSAgYXNfd2FybiAoXygiYWxpZ25tZW50IHRvbyBsYXJnZTsgYXNzdW1pbmcgJWQiKSwgdGVtcCk7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmICh0ZW1wIDwgMCkKLQl7Ci0JICBhc19iYWQgKF8oIm5lZ2F0aXZlIGFsaWdubWVudCIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwpCi0JewotCSAgc2VnVCBvbGRfc2VjOwotCSAgaW50IG9sZF9zdWJzZWM7Ci0JICBjaGFyICpwOwotCSAgaW50IGFsaWduOwotCi0JICBvbGRfc2VjID0gbm93X3NlZzsKLQkgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotCi0JICBpZiAodGVtcCA9PSAwKQotCSAgICBhbGlnbiA9IDA7Ci0JICBlbHNlCi0JICAgIGFsaWduID0gbG9nMiAodGVtcCk7Ci0KLQkgIGlmIChhbGlnbiA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkgICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCi0JCQkob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7Ci0JICAqcCA9IDA7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQl7Ci0JYWxsb2NhdGVfY29tbW9uOgotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotI2lmZGVmIE9CSl9FTEYKLQkgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCB0ZW1wKTsKLQkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotI2VuZGlmCi0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQotCXsKLQkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCSAgICA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotLyogSGFuZGxlIHRoZSAuZW1wdHkgcHNldWRvLW9wLiAgVGhpcyBzdXByZXNzZXMgdGhlIHdhcm5pbmdzIGFib3V0Ci0gICBpbnZhbGlkIGRlbGF5IHNsb3QgdXNhZ2UuICAqLwotCi1zdGF0aWMgdm9pZAotc19lbXB0eSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBUaGUgZWFzeSB3YXkgdG8gaW1wbGVtZW50IGlzIHRvIGp1c3QgZm9yZ2V0IGFib3V0IHRoZSBsYXN0Ci0gICAgIGluc3RydWN0aW9uLiAgKi8KLSAgbGFzdF9pbnNuID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXNfc2VnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlwidGV4dFwiIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfdGV4dCAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJkYXRhXCIiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotICAgICAgc19kYXRhICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcImRhdGExXCIiLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA3OwotICAgICAgc19kYXRhMSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcImJzc1wiIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIC8qIFdlIG9ubHkgc3VwcG9ydCAyIHNlZ21lbnRzIC0tIHRleHQgYW5kIGRhdGEgLS0gZm9yIG5vdywgc28KLQkgdGhpbmdzIGluIHRoZSAiYnNzIHNlZ21lbnQiIHdpbGwgaGF2ZSB0byBnbyBpbnRvIGRhdGEgZm9yIG5vdy4KLQkgWW91IGNhbiBzdGlsbCBhbGxvY2F0ZSBTRUdfQlNTIHN0dWZmIHdpdGggLmxjb21tIG9yIC5yZXNlcnZlLiAqLwotICAgICAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAyNTUpOwkvKiBGSVhNRS1TT01FREFZICovCi0gICAgICByZXR1cm47Ci0gICAgfQotICBhc19iYWQgKF8oIlVua25vd24gc2VnbWVudCB0eXBlIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19kYXRhMSAoKQotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19wcm9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGlzIHNldCBieSBzX3VhY29ucyB0byB0ZWxsIHNwYXJjX2NvbnNfYWxpZ24KLSAgIHRoYXQgdGhlIGV4cGVzc2lvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsaWduZWQuICAqLwotCi1zdGF0aWMgaW50IHNwYXJjX25vX2FsaWduX2NvbnMgPSAwOwotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIHVuYWxpZ25lZCBzcGFjZSBhbGxvY2F0aW9uIHBzZXVkby1vcHMsIHN1Y2ggYXMKLSAgIC51YXdvcmQuICAudWF3b3JkIGlzIGp1c3QgbGlrZSAud29yZCwgYnV0IHRoZSB2YWx1ZSBkb2VzIG5vdCBuZWVkCi0gICB0byBiZSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfdWFjb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICAvKiBUZWxsIHNwYXJjX2NvbnNfYWxpZ24gbm90IHRvIGFsaWduIHRoaXMgdmFsdWUuICAqLwotICBzcGFyY19ub19hbGlnbl9jb25zID0gMTsKLSAgY29ucyAoYnl0ZXMpOwotfQotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIG5hdGl2ZSB3b3JkIGFsbG9jYXRpb24gcHNldWRvLW9wIC5ud29yZC4KLSAgIEZvciBzcGFyY19hcmNoX3NpemUgMzIgaXQgaXMgZXF1aXZhbGVudCB0byAud29yZCwgIGZvcgotICAgc3BhcmNfYXJjaF9zaXplIDY0IGl0IGlzIGVxdWl2YWxlbnQgdG8gLnh3b3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbmNvbnMgKGJ5dGVzKQotICAgICBpbnQgYnl0ZXM7Ci17Ci0gIGNvbnMgKHNwYXJjX2FyY2hfc2l6ZSA9PSAzMiA/IDQgOiA4KTsKLX0KLQotLyogSWYgdGhlIC0tZW5mb3JjZS1hbGlnbmVkLWRhdGEgb3B0aW9uIGlzIHVzZWQsIHdlIHJlcXVpcmUgLndvcmQsCi0gICBldC4gYWwuLCB0byBiZSBhbGlnbmVkIGNvcnJlY3RseS4gIFdlIGRvIGl0IGJ5IHNldHRpbmcgdXAgYW4KLSAgIHJzX2FsaWduX2NvZGUgZnJhZywgYW5kIGNoZWNraW5nIGluIEhBTkRMRV9BTElHTiB0byBtYWtlIHN1cmUgdGhhdAotICAgbm8gdW5leHBlY3RlZCBhbGlnbm1lbnQgd2FzIGludHJvZHVjZWQuCi0KLSAgIFRoZSBTdW5PUyBhbmQgU29sYXJpcyBuYXRpdmUgYXNzZW1ibGVycyBlbmZvcmNlIGFsaWduZWQgZGF0YSBieQotICAgZGVmYXVsdC4gIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhhdCwgYmVjYXVzZSBnY2MgY2FuIGRlbGliZXJhdGVseQotICAgZ2VuZXJhdGUgbWlzYWxpZ25lZCBkYXRhIGlmIHRoZSBwYWNrZWQgYXR0cmlidXRlIGlzIHVzZWQuICBJbnN0ZWFkLAotICAgd2UgcGVybWl0IG1pc2FsaWduZWQgZGF0YSBieSBkZWZhdWx0LCBhbmQgcGVybWl0IHRoZSB1c2VyIHRvIHNldCBhbgotICAgb3B0aW9uIHRvIGNoZWNrIGZvciBpdC4gICovCi0KLXZvaWQKLXNwYXJjX2NvbnNfYWxpZ24gKG5ieXRlcykKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgaW50IG5hbGlnbjsKLSAgY2hhciAqcDsKLQotICAvKiBPbmx5IGRvIHRoaXMgaWYgd2UgYXJlIGVuZm9yY2luZyBhbGlnbmVkIGRhdGEuICAqLwotICBpZiAoISBlbmZvcmNlX2FsaWduZWRfZGF0YSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHNwYXJjX25vX2FsaWduX2NvbnMpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiB1bmFsaWduZWQgcHNldWRvLW9wLiAgKi8KLSAgICAgIHNwYXJjX25vX2FsaWduX2NvbnMgPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYWxpZ24gPSBsb2cyIChuYnl0ZXMpOwotICBpZiAobmFsaWduID09IDApCi0gICAgcmV0dXJuOwotCi0gIGFzc2VydCAobmFsaWduID4gMCk7Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoKGFic19zZWN0aW9uX29mZnNldCAmICgoMSA8PCBuYWxpZ24pIC0gMSkpICE9IDApCi0JYXNfYmFkIChfKCJtaXNhbGlnbmVkIGRhdGEiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHAgPSBmcmFnX3ZhciAocnNfYWxpZ25fY29kZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKLQkJKHN5bWJvbFMgKikgTlVMTCwgKG9mZnNldFQpIG5hbGlnbiwgKGNoYXIgKikgTlVMTCk7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbmFsaWduKTsKLX0KLQotLyogVGhpcyBpcyB3aGVyZSB3ZSBkbyB0aGUgdW5leHBlY3RlZCBhbGlnbm1lbnQgY2hlY2suCi0gICBUaGlzIGlzIGNhbGxlZCBmcm9tIEhBTkRMRV9BTElHTiBpbiB0Yy1zcGFyYy5oLiAgKi8KLQotdm9pZAotc3BhcmNfaGFuZGxlX2FsaWduIChmcmFncCkKLSAgICAgZnJhZ1MgKmZyYWdwOwotewotICBpZiAoZnJhZ3AtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSAmJiAhZnJhZ3AtPmZyX3N1YnR5cGUKLSAgICAgICYmIGZyYWdwLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfZml4ICE9IDApCi0gICAgYXNfYmFkX3doZXJlIChmcmFncC0+ZnJfZmlsZSwgZnJhZ3AtPmZyX2xpbmUsIF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLSAgaWYgKGZyYWdwLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUgJiYgZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMTAyNCkKLSAgICB7Ci0gICAgICBpbnQgY291bnQgPSBmcmFncC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2ZpeDsKLSAgICAgIAotICAgICAgaWYgKGNvdW50ID49IDQKLQkgICYmICEoY291bnQgJiAzKQotCSAgJiYgY291bnQgPD0gMTAyNAotCSAgJiYgISgobG9uZykoZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4KSAmIDMpKQotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgKnAgPSAodW5zaWduZWQgKikoZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4KTsKLSAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAKLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gNCwgcCsrKQotICAgICAgICAgICAgaWYgKElOU05fQklHX0VORElBTikKLSAgICAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoKGNoYXIgKilwLCAweDAxMDAwMDAwLCA0KTsgLyogZW1pdCBub3BzICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKChjaGFyICopcCwgMHgxMDAwMDAwMCwgNCk7Ci0KLSAgICAgICAgICBpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkgJiYgY291bnQgPiA4KQotICAgICAgICAgICAgewotCSAgICAgIGNoYXIgKndhZGRyID0gJmZyYWdwLT5mcl9saXRlcmFsW2ZyYWdwLT5mcl9maXhdOwotCSAgICAgIHVuc2lnbmVkIHd2YWwgPSAoMHgzMDY4MDAwMCB8IGNvdW50ID4+IDIpOyAvKiBiYSxhLHB0ICV4Y2MsIDFmICovCi0JICAgICAgaWYgKElOU05fQklHX0VORElBTikKLQkJbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAod2FkZHIsIHd2YWwsIDQpOwotCSAgICAgIGVsc2UKLQkJbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAod2FkZHIsIHd2YWwsIDQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIGZyYWdwLT5mcl92YXIgPSBjb3VudDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotI2lmZGVmIE9CSl9FTEYKLS8qIFNvbWUgc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBhIFNwYXJjIEVMRiBmaWxlLiAgKi8KLQotdm9pZAotc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgKCkKLXsKLSAgLyogU2V0IHRoZSBTcGFyYyBFTEYgZmxhZyBiaXRzLiAgRklYTUU6IFRoZXJlIHNob3VsZCBwcm9iYWJseSBiZSBzb21lCi0gICAgIHNvcnQgb2YgQkZEIGludGVyZmFjZSBmb3IgdGhpcy4gICovCi0gIGlmIChzcGFyY19hcmNoX3NpemUgPT0gNjQpCi0gICAgewotICAgICAgc3dpdGNoIChzcGFyY19tZW1vcnlfbW9kZWwpCi0JewotCWNhc2UgTU1fUk1POgotCSAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9TUEFSQ1Y5X1JNTzsKLQkgIGJyZWFrOwotCWNhc2UgTU1fUFNPOgotCSAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9TUEFSQ1Y5X1BTTzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUzsKLSAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDX1NVTl9VUzE7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgZW1pdF9leHByIHZpYSBUQ19DT05TX0ZJWF9ORVcgd2hlbiBjcmVhdGluZyBhCi0gICByZWxvYyBmb3IgYSBjb25zLiAgV2UgY291bGQgdXNlIHRoZSBkZWZpbml0aW9uIHRoZXJlLCBleGNlcHQgdGhhdAotICAgd2Ugd2FudCB0byBoYW5kbGUgbGl0dGxlIGVuZGlhbiByZWxvY3Mgc3BlY2lhbGx5LiAgKi8KLQotdm9pZAotY29uc19maXhfbmV3X3NwYXJjIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotCi0gIHIgPSAobmJ5dGVzID09IDEgPyBCRkRfUkVMT0NfOCA6Ci0gICAgICAgKG5ieXRlcyA9PSAyID8gQkZEX1JFTE9DXzE2IDoKLQkobmJ5dGVzID09IDQgPyBCRkRfUkVMT0NfMzIgOiBCRkRfUkVMT0NfNjQpKSk7Ci0KLSAgaWYgKHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEgJiYgbmJ5dGVzID09IDQKLSAgICAgICYmIG5vd19zZWctPmZsYWdzICYgU0VDX0FMTE9DKSAgCi0gICAgciA9IEJGRF9SRUxPQ19TUEFSQ19SRVYzMjsKLSAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCAoaW50KSBuYnl0ZXMsIGV4cCwgMCwgcik7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi1pbnQKLWVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgICBzdHJ1Y3QgZml4ICpmaXhwOwotewotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0gCi0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc3BhcmMuaCBiL2dhcy9jb25maWcvdGMtc3BhcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwMzFmNi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyogdGMtc3BhcmMuaCAtIE1hY3JvcyBhbmQgdHlwZSBkZWZpbmVzIGZvciB0aGUgc3BhcmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLTk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCi0gICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVENfU1BBUkMKLSNkZWZpbmUgVENfU1BBUkMgMQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgZnJhZzsKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBgdGFyZ2V0X2JpZ19lbmRpYW4nLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfc3BhcmMKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBUQVJHRVRfRk9STUFUIHNwYXJjX3RhcmdldF9mb3JtYXQgKCkKLQotI2lmIDAKLSNpZmRlZiBURV9TUEFSQ0FPVVQKLS8qIEJpLWVuZGlhbiBzdXBwb3J0IG1heSBldmVudHVhbGx5IGJlIHVuY29uZGl0aW9uYWwsIGJ1dCB1bnRpbCB0aGluZ3MgYXJlCi0gICB3b3JraW5nIHdlbGwgaXQncyBvbmx5IHByb3ZpZGVkIGZvciB0YXJnZXRzIHRoYXQgbmVlZCBpdC4gICovCi0jZGVmaW5lIFNQQVJDX0JJRU5ESUFOCi0jZW5kaWYKLSNlbmRpZgotLyogTWFrZSBpdCB1bmNvbmRpdGlvbmFsIGFuZCBjaGVjayBpZiAtRUwgaXMgdmFsaWQgYWZ0ZXIgb3B0aW9uIHBhcnNpbmcgKi8KLSNkZWZpbmUgU1BBUkNfQklFTkRJQU4KLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIscyxmKQkJe2FzX2ZhdGFsIChfKCJzcGFyYyBjb252ZXJ0X2ZyYWdcbiIpKTt9Ci0jZGVmaW5lIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KGYscykgXAotCQkJKGFzX2ZhdGFsKF8oImVzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGNhbGxlZCIpKSwxKQotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJTUEFSQyBHQVMgIgotCi1leHRlcm4gaW50IHNwYXJjX3BpY19jb2RlOwotCi0jZGVmaW5lIG1kX2RvX2FsaWduKG4sIGZpbGwsIGxlbiwgbWF4LCBhcm91bmQpCQkJCVwKLWlmICgobikgJiYgKG4pIDw9IDEwICYmICFuZWVkX3Bhc3NfMiAmJiAhKGZpbGwpCQkJCVwKLSAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSkJCQkJCQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgY2hhciAqcDsJCQkJCQkJCVwKLSAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDEgPDwgbiwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMTAyNCwJXAotICAgICAgICAgICAgICAgICAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIChuKSwgKGNoYXIgKikgMCk7CQlcCi0gICAgKnAgPSAweDAwOwkJCQkJCQkJXAotICAgIGdvdG8gYXJvdW5kOwkJCQkJCQlcCi0gIH0KLQotLyogV2UgcmVxdWlyZSAud29yZCwgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgc3BhcmNfY29uc19hbGlnbiAobmJ5dGVzKQotZXh0ZXJuIHZvaWQgc3BhcmNfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWdwKSBzcGFyY19oYW5kbGVfYWxpZ24gKGZyYWdwKQotZXh0ZXJuIHZvaWQgc3BhcmNfaGFuZGxlX2FsaWduIFBBUkFNUyAoKHN0cnVjdCBmcmFnICopKTsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9BT1VUKQotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsCi0gICBvYmplY3QgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4KLSAgIFRydWUgaWYgd2UgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcKLSAgIHRoZSAubyBmaWxlLgotCi0gICBJZiB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLCB0aGVuIHRoZQotICAgYS5vdXQgYXNzZW1ibGVyIHNob3VsZCBub3QgZG8gdGhlIHJlbG9jYXRpb24gaWYgZ2VuZXJhdGluZyBQSUMsIGFuZAotICAgdGhlIEVMRiBhc3NlbWJsZXIgc2hvdWxkIG5ldmVyIGRvIHRoZSByZWxvY2F0aW9uLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgb2JqX3JlbG9jYXRlX2V4dGVybiAwCi0jZWxzZQotI2RlZmluZSBvYmpfcmVsb2NhdGVfZXh0ZXJuICghIHNwYXJjX3BpY19jb2RlKQotI2VuZGlmCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKG9ial9yZWxvY2F0ZV9leHRlcm4gXAotICAgfHwgKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0jZW5kaWYKLQotLyogSSBrbm93IHRoYXQgImNhbGwgMCIgZmFpbHMgaW4gc3BhcmMtY29mZiBpZiB0aGlzIGRvZXNuJ3QgcmV0dXJuIDEuICBJCi0gICBkb24ndCBrbm93IGFib3V0IG90aGVyIHJlbG9jYXRpb24gdHlwZXMsIG9yIG90aGVyIGZvcm1hdHMsIHlldC4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQlcCi0JKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiBcCi0JICYmICgoRklYUCktPmZ4X2FkZHN5ID09IDAgXAotCSAgICAgfHwgU19HRVRfU0VHTUVOVCAoKEZJWFApLT5meF9hZGRzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0jZGVmaW5lIFJFTE9DX1JFUVVJUkVTX1NZTUJPTAotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQotZXh0ZXJuIGludCBlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2lmZGVmIE9CSl9FTEYKLS8qIEtlZXAgcmVsb2NhdGlvbnMgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gIERvbid0IHR1cm4gdGhlbSBpbnRvCi0gICByZWxvY2F0aW9ucyBhZ2FpbnN0IHNlY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMKLSAgIGxpbmtlciB0byBvcGVyYXRlIHByb3Blcmx5LiAgV2hlbiBnZW5lcmF0aW5nIFBJQywgd2UgbmVlZCB0byBrZWVwCi0gICBhbnkgbm9uIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKQkJCQkJCVwKLSAgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCQkJXAotICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICghIHNwYXJjX3BpY19jb2RlCQkJCQkJCVwKLSAgICAgICB8fCAoRklYKS0+ZnhfcGNyZWwJCQkJCQlcCi0gICAgICAgfHwgKChGSVgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCQlcCi0JICAgJiYgKFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9zdWJzeSkJCQkJXAotCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UICgoRklYKS0+ZnhfYWRkc3kpKSkJCQlcCi0gICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FICgoRklYKS0+ZnhfYWRkc3kpLCAnXDAwMScpICE9IE5VTEwJCVwKLSAgICAgICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKChGSVgpLT5meF9hZGRzeSksICdcMDAyJykgIT0gTlVMTCkpCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9BT1VUCi0vKiBXaGVuIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG11c3Qgbm90IGFkanVzdCBhbnkgcmVsb2Mgd2hpY2ggd2lsbAotICAgdHVybiBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgbm9yIGFueSByZWxvYwotICAgd2hpY2ggd2Ugd2lsbCBuZWVkIGlmIGEgc3ltYm9sIGlzIG92ZXJyaWRkZW4uICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpCQkJCQkJXAotICAoISBzcGFyY19waWNfY29kZQkJCQkJCQlcCi0gICB8fCAoKEZJWCktPmZ4X3BjcmVsCQkJCQkJCVwKLSAgICAgICAmJiAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLQkgICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KSkpKQkJCVwKLSAgIHx8IChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2CQkJCQlcCi0gICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMikKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nCi1leHRlcm4gdm9pZCBzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gdm9pZCBzcGFyY19tZF9lbmQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9lbmQoKSBzcGFyY19tZF9lbmQgKCkKLQotI2VuZGlmCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19zcGFyYwotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X3NwYXJjCi0gIFBBUkFNUyAoKHN0cnVjdCBmcmFnICosIGludCwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOwotCi0vKiBlbmQgb2YgdGMtc3BhcmMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5jIGIvZ2FzL2NvbmZpZy90Yy10YWhvZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmE3NTI0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGFob2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMjcgKzAsMCBAQAotLyogdGMtdGFob2UuYwotICAgTm90IHBhcnQgb2YgR0FTIHlldC4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiB0aGlzIGJpdCBnbG9tbWVkIGZyb20gdGFob2UtaW5zdC5oICovCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlOwotdHlwZWRlZiBieXRlIHRhaG9lX29wY29kZVQ7Ci0KLS8qCi0gKiBUaGlzIGlzIHBhcnQgb2YgdGFob2UtaW5zLXBhcnNlLmMgJiBmcmllbmRzLgotICogV2Ugd2FudCB0byBwYXJzZSBhIHRhaG9lIGluc3RydWN0aW9uIHRleHQgaW50byBhIHRyZWUgZGVmaW5lZCBoZXJlLgotICovCi0KLSNkZWZpbmUgVElUX01BWF9PUEVSQU5EUyAoNCkJLyogbWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gb25lCi0JCQkJICAgc2luZ2xlIHRhaG9lIGluc3RydWN0aW9uICovCi0KLXN0cnVjdCB0b3AJCQkvKiB0YWhvZSBpbnN0cnVjdGlvbiBvcGVyYW5kICovCi17Ci0gIGludCB0b3BfbmR4OwkJCS8qIC0xLCBvciBpbmRleCByZWdpc3Rlci4gZWcgNz1bUjddICovCi0gIGludCB0b3BfcmVnOwkJCS8qIC0xLCBvciByZWdpc3RlciBudW1iZXIuIGVnIDcgPSBSNyBvciAoUjcpICovCi0gIGJ5dGUgdG9wX21vZGU7CQkvKiBBZGRyZXNzaW5nIG1vZGUgYnl0ZS4gVGhpcyBieXRlLCBkZWZpbmVzCi0JCQkJICAgd2hpY2ggb2YgdGhlIDExIG1vZGVzIG9wY29kZSBpcy4gKi8KLQotICBjaGFyIHRvcF9hY2Nlc3M7CQkvKiBBY2Nlc3MgdHlwZSB3YW50ZWQgZm9yIHRoaXMgb3BwZXJhbmQKLQkJCQkgICAnYidicmFuY2ggJyAnbm8taW5zdHJ1Y3Rpb24gJ2FtcnZ3JyAqLwotICBjaGFyIHRvcF93aWR0aDsJCS8qIE9wZXJhbmQgd2lkdGggZXhwZWN0ZWQsIG9uZSBvZiAiYndscT8tOiEiICovCi0KLSAgY2hhciAqdG9wX2Vycm9yOwkJLyogU2F5IGlmIG9wZXJhbmQgaXMgaW5hcHByb3ByaWF0ZSAgICAgICAgICovCi0KLSAgc2VnVCBzZWdfb2Zfb3BlcmFuZDsJCS8qIHNlZ21lbnQgYXMgcmV0dXJuZWQgYnkgZXhwcmVzc2lvbigpKi8KLQotICBleHByZXNzaW9uUyBleHBfb2Zfb3BlcmFuZDsJLyogVGhlIGV4cHJlc3Npb24gYXMgcGFyc2VkIGJ5IGV4cHJlc3Npb24oKSovCi0KLSAgYnl0ZSB0b3BfZGlzcHNpemU7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRpc3BsYWNlbWVudCBpZiB3ZQotCQkJCSAgIGNhbiBmaWd1cmUgaXQgb3V0ICovCi19OwotCi0vKiBUaGUgYWRkcmVzc2luZyBtb2RlcyBmb3IgYW4gb3BlcmFuZC4gVGhlc2UgbnVtYmVycyBhcmUgdGhlIGFjdXRhbCB2YWx1ZXMKLSAgIGZvciBjZXJ0YWluIG1vZGVzLCBzbyBiZSBjYXJlZnVsbCBpZiB5b3Ugc2NyZXcgd2l0aCB0aGVtLiAqLwotI2RlZmluZSBUQUhPRV9ESVJFQ1RfUkVHICgweDUwKQotI2RlZmluZSBUQUhPRV9SRUdfREVGRVJSRUQgKDB4NjApCi0KLSNkZWZpbmUgVEFIT0VfUkVHX0RJU1AgKDB4RTApCi0jZGVmaW5lIFRBSE9FX1JFR19ESVNQX0RFRkVSUkVEICgweEYwKQotCi0jZGVmaW5lIFRBSE9FX0lNTUVESUFURSAoMHg4RikKLSNkZWZpbmUgVEFIT0VfSU1NRURJQVRFX0JZVEUgKDB4ODgpCi0jZGVmaW5lIFRBSE9FX0lNTUVESUFURV9XT1JEICgweDg5KQotI2RlZmluZSBUQUhPRV9JTU1FRElBVEVfTE9OR1dPUkQgKDB4OEYpCi0jZGVmaW5lIFRBSE9FX0FCU09MVVRFX0FERFIgKDB4OUYpCi0KLSNkZWZpbmUgVEFIT0VfRElTUExBQ0VEX1JFTEFUSVZFICgweEVGKQotI2RlZmluZSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRCAoMHhGRikKLQotI2RlZmluZSBUQUhPRV9BVVRPX0RFQyAoMHg3RSkKLSNkZWZpbmUgVEFIT0VfQVVUT19JTkMgKDB4OEUpCi0jZGVmaW5lIFRBSE9FX0FVVE9fSU5DX0RFRkVSUkVEICgweDlFKQotLyogSU5ERVhFRF9SRUcgaXMgZGVjaWRlZCBieSB0aGUgZXhpc3RhbmNlIG9yIGxhY2sgb2YgYSBbcmVnXSAqLwotCi0vKiBUaGVzZSBhcmUgZW5jb2RlZCBpbnRvIHRvcF93aWR0aCB3aGVuIHRvcF9hY2Nlc3M9PSdiJwotICAgYW5kIGl0J3MgYSBwc3VlZG8gb3AuKi8KLSNkZWZpbmUgVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVAgICAgICAnLScKLSNkZWZpbmUgVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUCAnPycKLSNkZWZpbmUgVEFIT0VfV0lEVEhfQklHX1JFVl9KVU1QICAgICAnIScKLSNkZWZpbmUgVEFIT0VfV0lEVEhfQklHX05PTl9SRVZfSlVNUCAnOicKLQotLyogVGhlIGhleCBjb2RlIGZvciBjZXJ0YWluIHRhaG9lIGNvbW1hbmRzIGFuZCBtb2Rlcy4KLSAgIFRoaXMgaXMganVzdCBmb3IgcmVhZGFiaWxpdHkuICovCi0jZGVmaW5lIFRBSE9FX0pNUCAoMHg3MSkKLSNkZWZpbmUgVEFIT0VfUENfUkVMX0xPTkcgKDB4RUYpCi0jZGVmaW5lIFRBSE9FX0JSQiAoMHgxMSkKLSNkZWZpbmUgVEFIT0VfQlJXICgweDEzKQotLyogVGhlc2UsIHdoZW4gJ29yZWQnIHdpdGgsIG9yIGFkZGVkIHRvLCBhIHJlZ2lzdGVyIG51bWJlciwKLSAgIHNldCB1cCB0aGUgbnVtYmVyIGZvciB0aGUgZGlzcGxhY2VtZW50IG1vZGUuICovCi0jZGVmaW5lIFRBSE9FX1BDX09SX0JZVEUgKDB4QTApCi0jZGVmaW5lIFRBSE9FX1BDX09SX1dPUkQgKDB4QzApCi0jZGVmaW5lIFRBSE9FX1BDX09SX0xPTkcgKDB4RTApCi0KLXN0cnVjdCB0aXQJCQkvKiBnZXQgaXQgb3V0IG9mIHRoZSBzZXdlciwgaXQgc3RhbmRzIGZvcgotCQkJCSAgIHRhaG9lIGluc3RydWN0aW9uIHRyZWUgKEdlZXplISkgKi8KLXsKLSAgdGFob2Vfb3Bjb2RlVCB0aXRfb3Bjb2RlOwkvKiBUaGUgb3Bjb2RlLiAqLwotICBieXRlIHRpdF9vcGVyYW5kczsJCS8qIEhvdyBtYW55IG9wZXJhbmRzIGFyZSBoZXJlLiAqLwotICBzdHJ1Y3QgdG9wIHRpdF9vcGVyYW5kW1RJVF9NQVhfT1BFUkFORFNdOwkvKiBPcGVyYW5kcyAqLwotICBjaGFyICp0aXRfZXJyb3I7CQkvKiAiIiBvciBmYXRhbCBlcnJvciB0ZXh0ICovCi19OwotCi0vKiBlbmQ6IHRhaG9lLWluc3QuaCAqLwotCi0vKiB0YWhvZS5jIC0gdGFob2Utc3BlY2lmaWMgLQotICAgTm90IHBhcnQgb2YgZ2FzIHlldC4KLSAgICovCi0KLSNpbmNsdWRlICJvcGNvZGUvdGFob2UuaCIKLQotLyogVGhpcyBpcyB0aGUgbnVtYmVyIHRvIHB1dCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhLm91dCBmaWxlICovCi1sb25nIG9tYWdpYyA9IE9NQUdJQzsKLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCBvciBhIHF1b3RlZCBzdHJpbmcuICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjOyI7Ci0KLS8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgYXMgaW4gMGYxMjMuNDU2Ci0gICBvciAgICAwZDEuMjM0RS0xMiAoc2VlIGV4cCBjaGFycyBhYm92ZSkKLSAgIE5vdGU6IFRoZSBUYWhvZSBwb3J0IGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuIFRoaXMgaXMKLSAgICAgICAgIGNvbnNpc3RhbnQgd2l0aCAnYXMnIElmIGl0J3MgbmVlZGVkLCBJIGNhbiBhbHdheXMgYWRkIGl0IGxhdGVyLiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkZiI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4KLSAgIChUaGUgdGFob2UgaGFzIHBsZW50eSBvZiByb29tLCBzbyB0aGUgY2hhbmdlIGN1cnJlbnRseSBpc24ndCBuZWVkZWQuKQotICAgKi8KLQotc3RhdGljIHN0cnVjdCB0aXQgdDsJCS8qIEEgdGFob2UgaW5zdHJ1Y3Rpb24gYWZ0ZXIgZGVjb2RpbmcuICovCi0KLXZvaWQgZmxvYXRfY29ucyAoKTsKLS8qIEEgdGFibGUgb2YgcHNldWRvIG9wcyAoc2FucyAuKSwgdGhlIGZ1bmN0aW9uIGNhbGxlZCwgYW5kIGFuIGludGVnZXIgb3AKLSAgIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoLiAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgezB9Ci19OwotDAotLyoKLSAqIEZvciBUYWhvZSwgcmVsYXRpdmUgYWRkcmVzc2VzIG9mICJqdXN0IHRoZSByaWdodCBsZW5ndGgiIGFyZSBwcmV0dHkgZWFzeS4KLSAqIFRoZSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGFsd2F5cyB0aGUgbGFzdCBvcGVyYW5kLCBldmVuIGluCi0gKiBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLgotICogRm9yIFRhaG9lLCB3ZSBlbmNvZGUgdGhlIHJlbGF4X3N1YnN0YXRlVHMgKGluIGUuZy4gZnJfc3Vic3RhdGUpIGFzOgotICoKLSAqCQkgICAgNCAgICAgICAzICAgICAgIDIgICAgICAgMSAgICAgICAwCSAgICAgYml0IG51bWJlcgotICoJLS0tLyAvLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICoJCXwgICAgIHdoYXQgc3RhdGUgPwl8ICBob3cgbG9uZyA/CXwKLSAqCS0tLS8gLy0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAqCi0gKiBUaGUgImhvdyBsb25nIiBiaXRzIGFyZSAwMD1ieXRlLCAwMT13b3JkLCAxMD1sb25nLgotICogVGhpcyBpcyBhIFVuKnggY29udmVudGlvbi4KLSAqIE5vdCBhbGwgbGVuZ3RocyBhcmUgbGVnaXQgZm9yIGEgZ2l2ZW4gdmFsdWUgb2YgKHdoYXQgc3RhdGUpLgotICogVGhlIGZvdXIgc3RhdGVzIGFyZSBsaXN0ZWQgYmVsb3cuCi0gKiBUaGUgImhvdyBsb25nIiByZWZlcnMgbWVyZWx5IHRvIHRoZSBkaXNwbGFjZW1lbnQgbGVuZ3RoLgotICogVGhlIGFkZHJlc3MgdXN1YWxseSBoYXMgc29tZSBjb25zdGFudCBieXRlcyBpbiBpdCBhcyB3ZWxsLgotICoKLQotU3RhdGVzIGZvciBUYWhvZSBhZGRyZXNzIHJlbGF4aW5nLgotMS4JVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVAgKC0pCi0JRm9ybWF0OiAiYi0iCi0JVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCi0JCWpyCQkxMQotCQlqYnIJCTExCi0JU2ltcGxlIGJyYW5jaC4KLQlBbHdheXMsIDEgYnl0ZSBvcGNvZGUsIHRoZW4gZGlzcGxhY2VtZW50L2Fic29sdXRlLgotCUlmIHdvcmQgb3IgbG9uZ3dvcmQsIGNoYW5nZSBvcGNvZGUgdG8gYnJ3IG9yIGptcC4KLQotCQotMi4JVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUCAoPykKLQlKPGNvbmQ+IHdoZXJlIDxjb25kPiBpcyBhIHNpbXBsZSBmbGFnIHRlc3QuCi0JRm9ybWF0OiAiYj8iCi0JVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCi0JCWpuZXEvam5lcXUJMjEKLQkJamVxbC9qZXFsdQkzMQotCQlqZ3RyCQk0MQotCQlqbGVxCQk1MQotCQlqZ2VxCQk4MQotCQlqbHNzCQk5MQotCQlqZ3RydQkJYTEKLQkJamxlcXUJCWIxCi0JCWp2YwkJYzEKLQkJanZzCQlkMQotCQlqbHNzdS9qY3MJZTEKLQkJamdlcXUvamNjCWYxCi0JQWx3YXlzLCB5b3UgY29tcGxlbWVudCA0dGggYml0IHRvIHJldmVyc2UgdGhlIGNvbmRpdGlvbi4KLQlBbHdheXMsIDEtYnl0ZSBvcGNvZGUsIHRoZW4gMS1ieXRlIGRpc3BsYWNlbWVudC4KLQotMy4JVEFIT0VfV0lEVEhfQklHX1JFVl9KVU1QICghKQotCUpiYy9KYnMgd2hlcmUgY29uZCB0ZXN0cyBhIG1lbW9yeSBiaXQuCi0JRm9ybWF0OiAicmx2bGIhIgotCVRhaG9lIG9wY29kZXMgYXJlOgkoSGV4KQotCQlqYnMJCTBlCi0JCWpiYwkJMWUKLQlBbHdheXMsIHlvdSBjb21wbGVtZW50IDR0aCBiaXQgdG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uLgotCUFsd2F5cywgMS1ieXRlIG9wY2RlLCBsb25nd29yZCwgbG9uZ3dvcmQtYWRkcmVzcywgMS13b3JkLWRpc3BsYWNlbWVudAotCi00LglUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QICg6KQotCUphb2JsWFgvSmJzc2kKLQlGb3JtYXQ6ICJybG1sYjoiCi0JVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCi0JCWFvamxzcwkJMmYKLQkJamFvYmxzcwkJMmYKLQkJYW9qbGVxCQkzZgotCQlqYW9ibGVxCQkzZgotCQlqYnNzaQkJNWYKLQlBbHdheXMsIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoOyB3ZSBoYXZlIGEgd29yZAotCWRpc3BsYWNlbWVudC4KLQotV2UgbmVlZCB0byBtb2RpZnkgdGhlIG9wY29kZSBpcyBmb3IgY2xhc3MgMSwgMiBhbmQgMyBpbnN0cnVjdGlvbnMuCi1BZnRlciByZWxheCgpIHdlIG1heSBjb21wbGVtZW50IHRoZSA0dGggYml0IG9mIDIgb3IgMyB0byByZXZlcnNlIHNlbnNlIG9mCi1icmFuY2guCi0KLVdlIHNvbWV0aW1lcyBzdG9yZSBjb250ZXh0IGluIHRoZSBvcGVyYW5kIGxpdGVyYWwuIFRoaXMgd2F5IHdlIGNhbiBmaWd1cmUgb3V0Ci1hZnRlciByZWxheCgpIHdoYXQgdGhlIG9yaWdpbmFsIGFkZHJlc3NpbmcgbW9kZSB3YXMuIChXYXMgaXMgcGNfcmVsLCBvcgotcGNfcmVsX2Rpc3A/IFRoYXQgc29ydCBvZiB0aGluZy4pICovCi0MCi0vKiBUaGVzZSBkaXNwbGFjZW1lbnRzIGFyZSByZWxhdGl2ZSB0byB0aGUgU1RBUlQgYWRkcmVzcyBvZiB0aGUKLSAgIGRpc3BsYWNlbWVudCB3aGljaCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGRpc3BsYWNlbWVudCwgbm90IHRoZSBlbmQgb2YKLSAgIHRoZSBpbnN0cnVjdGlvbi4gVGhlIGhhcmR3YXJlIHBjX3JlbCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbnMuCi0gICBUaGF0J3Mgd2h5IGFsbCB0aGUgZGlzcGxhY2VtZW50cyBoYXZlIHRoZSBsZW5ndGggb2YgdGhlIGRpc3BsYWNlbWVudCBhZGRlZAotICAgdG8gdGhlbS4gKFdGICsgbGVuZ3RoKHdvcmQpKQotCi0gICBUaGUgZmlyc3QgbGV0dGVyIGlzIEJ5dGUsIFdvcmQuCi0gICAybmQgbGV0dGVyIGlzIEZvcndhcmQsIEJhY2t3YXJkLiAqLwotI2RlZmluZSBCRiAoMSsgMTI3KQotI2RlZmluZSBCQiAoMSstMTI4KQotI2RlZmluZSBXRiAoMisgMzI3NjcpCi0jZGVmaW5lIFdCICgyKy0zMjc2OCkKLS8qIERvbnQgbmVlZCBMRiwgTEIgYmVjYXVzZSB0aGV5IGFsd2F5cyByZWFjaC4gW1RoZXkgYXJlIGNvZGVkIGFzIDAuXSAqLwotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotLyogVGhpcyBtYWNybyBoYXMgbm8gc2lkZS1lZmZlY3RzLiAqLwotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0jZGVmaW5lIFJFTEFYX1NUQVRFKHdoYXQpICgod2hhdCkgPj4gMikKLSNkZWZpbmUgUkVMQVhfTEVOR1RIKGxlbmd0aCkgKChsZW5ndGgpICYmIDMpCi0KLSNkZWZpbmUgU1RBVEVfQUxXQVlTX0JSQU5DSCAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNIICAgICAgICAoMikKLSNkZWZpbmUgU1RBVEVfQklHX1JFVl9CUkFOQ0ggICAgICAgICAgICAoMykKLSNkZWZpbmUgU1RBVEVfQklHX05PTl9SRVZfQlJBTkNIICAgICAgICAoNCkKLSNkZWZpbmUgU1RBVEVfUENfUkVMQVRJVkUJCSg1KQotCi0jZGVmaW5lIFNUQVRFX0JZVEUgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFNUQVRFX1dPUkQgICAgICAgICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFNUQVRFX0xPTkcgICAgICAgICAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFNUQVRFX1VOREYgICAgICAgICAgICAgICAgICAgICAgKDMpCS8qIFN5bWJvbCB1bmRlZmluZWQgaW4gcGFzczEgKi8KLQotLyogVGhpcyBpcyB0aGUgdGFibGUgdXNlZCBieSBnYXMgdG8gZmlndXJlIG91dCByZWxheGluZyBtb2Rlcy4gVGhlIGZpZWxkcyBhcmUKLSAgIGZvcndhcmRfYnJhbmNoIHJlYWNoLCBiYWNrd2FyZF9icmFuY2ggcmVhY2gsIG51bWJlciBvZiBieXRlcyBpdCB3b3VsZCB0YWtlLAotICAgd2hlcmUgdGhlIG5leHQgYmlnZ2VzdCBicmFuY2ggaXMuICovCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogZXJyb3Igc2VudGluZWwgICAwLDAJKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAwLDEJKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAwLDIJKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAwLDMJKi8KLS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoIGNhc2VzICJqcmIiCi0gICAgIFRoZSByZWxheCBwYXJ0IGlzIHRoZSBhY3R1YWwgZGlzcGxhY2VtZW50ICovCi0gIHsKLSAgICBCRiwgQkIsIDEsIEMgKDEsIDEpCi0gIH0sCQkJCS8qIGJyYiBCYGZvbwkgICAgMSwwICovCi0gIHsKLSAgICBXRiwgV0IsIDIsIEMgKDEsIDIpCi0gIH0sCQkJCS8qIGJydyBXYGZvbwkgICAgMSwxICovCi0gIHsKLSAgICAwLCAwLCA1LCAwCi0gIH0sCQkJCS8qIEptcCBMYGZvbwkgICAgMSwyICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMSwzICovCi0vKiBSZXZlcnNpYmxlIENvbmRpdGlvbmFsIEJyYW5jaC4gSWYgdGhlIGJyYW5jaCB3b24ndCByZWFjaCwgcmV2ZXJzZQotICAgICBpdCwgYW5kIGp1bXAgb3ZlciBhIGJydyBvciBhIGptcCB0aGF0IHdpbGwgcmVhY2guIFRoZSByZWxheCBwYXJ0IGlzIHRoZQotICAgICBhY3R1YWwgYWRkcmVzcy4gKi8KLSAgewotICAgIEJGLCBCQiwgMSwgQyAoMiwgMSkKLSAgfSwJCQkJLyogYjxjb25kPiBCYGZvbyAgICAyLDAgKi8KLSAgewotICAgIFdGICsgMiwgV0IgKyAyLCA0LCBDICgyLCAyKQotICB9LAkJCQkvKiBicmV2IG92ZXIsIGJydyBXYGZvbywgb3ZlcjogMiwxICovCi0gIHsKLSAgICAwLCAwLCA3LCAwCi0gIH0sCQkJCS8qIGJyZXYgb3Zlciwgam1wIExgZm9vLCBvdmVyOiAyLDIgKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAyLDMgKi8KLS8qIEFub3RoZXIgdHlwZSBvZiByZXZlcnNhYmxlIGJyYW5jaC4gQnV0IHRoaXMgb25seSBoYXMgYSB3b3JkCi0gICAgIGRpc3BsYWNlbWVudC4gKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAzLDAgKi8KLSAgewotICAgIFdGLCBXQiwgMiwgQyAoMywgMikKLSAgfSwJCQkJLyogamJYIFdgZm9vCSAgICAzLDEgKi8KLSAgewotICAgIDAsIDAsIDgsIDAKLSAgfSwJCQkJLyoganJldlggb3Zlciwgam1wIExgZm9vLCBvdmVyOiAgMywyICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMywzICovCi0vKiBUaGVzZSBhcmUgdGhlIG5vbiByZXZlcnNhYmxlIGJyYW5jaGVzLCBhbGwgb2Ygd2hpY2ggaGF2ZSBhIHdvcmQKLSAgICAgZGlzcGxhY2VtZW50LiBJZiBJIGNhbid0IHJlYWNoLCBicmFuY2ggb3ZlciBhIGJ5dGUgYnJhbmNoLCB0byBhCi0gICAgIGp1bXAgdGhhdCB3aWxsIHJlYWNoLiBUaGUganVtcGVkIGJyYW5jaCBqdW1wcyBvdmVyIHRoZSByZWFjaGluZwotICAgICBicmFuY2gsIHRvIGNvbnRpbnVlIHdpdGggdGhlIGZsb3cgb2YgdGhlIHByb2dyYW0uIEl0J3MgbGlrZSBwbGF5aW5nCi0gICAgIGxlYXAgZnJvZy4gKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICA0LDAgKi8KLSAgewotICAgIFdGLCBXQiwgMiwgQyAoNCwgMikKLSAgfSwJCQkJLyogYW9ibF8gV2Bmb28JICAgIDQsMSAqLwotICB7Ci0gICAgMCwgMCwgMTAsIDAKLSAgfSwJCQkJLyphb2JsXyBXYGhvcCxiciBvdmVyLGhvcDogam1wIExeZm9vLG92ZXIgNCwyKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICA0LDMgKi8KLS8qIE5vcm1hbCBkaXNwbGFjZW1lbnQgbW9kZSwgbm8ganVtcGluZyBvciBhbnl0aGluZyBsaWtlIHRoYXQuCi0gICAgIFRoZSByZWxheCBwb2ludHMgdG8gb25lIGJ5dGUgYmVmb3JlIHRoZSBhZGRyZXNzLCB0aGF0cyB3aHkgYWxsCi0gICAgIHRoZSBudW1iZXJzIGFyZSB1cCBieSBvbmUuICovCi0gIHsKLSAgICBCRiArIDEsIEJCICsgMSwgMiwgQyAoNSwgMSkKLSAgfSwJCQkJLyogQl4iZm9vIgkgICAgNSwwICovCi0gIHsKLSAgICBXRiArIDEsIFdCICsgMSwgMywgQyAoNSwgMikKLSAgfSwJCQkJLyogV14iZm9vIgkgICAgNSwxICovCi0gIHsKLSAgICAwLCAwLCA1LCAwCi0gIH0sCQkJCS8qIExeImZvbyIJICAgIDUsMiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDUsMyAqLwotfTsKLQotI3VuZGVmIEMKLSN1bmRlZiBCRgotI3VuZGVmIEJCCi0jdW5kZWYgV0YKLSN1bmRlZiBXQgotLyogRW5kIHJlbGF4IHN0dWZmICovCi0MCi0vKiBIYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlLiAgTlVMTCBtZWFucyBhbnkgdXNlIGJlZm9yZQotICAgbWRfYmVnaW4oKSB3aWxsIGNyYXNoLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotCi0vKiBJbml0IGZ1bmN0aW9uLiBCdWlsZCB0aGUgaGFzaCB0YWJsZS4gKi8KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHN0cnVjdCB0b3QgKnRQOwotICBjaGFyICplcnJvcnZhbCA9IDA7Ci0gIGludCBzeW50aGV0aWNfdG9vID0gMTsJLyogSWYgMCwganVzdCB1c2UgcmVhbCBvcGNvZGVzLiAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKHRQID0gdG90c3RyczsgKnRQLT5uYW1lICYmICFlcnJvcnZhbDsgdFArKykKLSAgICBlcnJvcnZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB0UC0+bmFtZSwgJnRQLT5kZXRhaWwpOwotCi0gIGlmIChzeW50aGV0aWNfdG9vKQotICAgIGZvciAodFAgPSBzeW50aGV0aWNfdG90c3RyczsgKnRQLT5uYW1lICYmICFlcnJvcnZhbDsgdFArKykKLSAgICAgIGVycm9ydmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIHRQLT5uYW1lLCAmdFAtPmRldGFpbCk7Ci0KLSAgaWYgKGVycm9ydmFsKQotICAgIGFzX2ZhdGFsIChlcnJvcnZhbCk7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiYWQ6U1R0OlYiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ2EnOgotICAgICAgYXNfd2FybiAoXygiVGhlIC1hIG9wdGlvbiBkb2Vzbid0IGV4aXN0LiAoRGVzcGl0ZSB3aGF0IHRoZSBtYW4gcGFnZSBzYXlzISIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBhc193YXJuIChfKCJEaXNwbGFjZW1lbnQgbGVuZ3RoICVzIGlnbm9yZWQhIiksIGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgYXNfd2FybiAoXygiU1lNQk9MIFRBQkxFIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICBhc193YXJuIChfKCJUT0tFTiBUUkFDRSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgICAgYXNfd2FybiAoXygiSSBkb24ndCBuZWVkIG9yIHVzZSB0ZW1wLiBmaWxlIFwiJXNcIi4iKSwgYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICBhc193YXJuIChfKCJJIGRvbid0IHVzZSBhbiBpbnRlcnBhc3MgZmlsZSEgLVYgaWdub3JlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1UYWhvZSBvcHRpb25zOlxuXAotLWEJCQlpZ25vcmVkXG5cCi0tZCBMRU5HVEgJCWlnbm9yZWRcblwKLS1KCQkJaWdub3JlZFxuXAotLVMJCQlpZ25vcmVkXG5cCi0tdCBGSUxFCQkJaWdub3JlZFxuXAotLVQJCQlpZ25vcmVkXG5cCi0tVgkJCWlnbm9yZWRcbiIpKTsKLX0KLQwKLS8qIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBzZWN0aW9uIHRha2UgbnVtYmVycyBpbiB0aGUgbWFjaGluZSBmb3JtYXQsIGFuZAotICAgbXVuZ2VzIHRoZW0gaW50byBUYWhvZSBieXRlIG9yZGVyLgotICAgVGhleSBleGlzdCBwcmltYXJpbHkgZm9yIGNyb3NzIGFzc2VtYmx5IHB1cnBvc2UuICovCi12b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCi1tZF9udW1iZXJfdG9fY2hhcnMgKGNvbiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciBjb25bXTsJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICB2YWx1ZVQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotI2lmZGVmIGNvbW1lbnQKLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX251bWJlcl90b19pbW0gKGNvbiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciBjb25bXTsJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICBsb25nIGludCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLXZvaWQKLXRjX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCAqLwotICBrbm93ICgwKTsKLX0KLQotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfbnVtYmVyX3RvX2Rpc3AgKGNvbiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciBjb25bXTsJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICBsb25nIGludCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX251bWJlcl90b19maWVsZCAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgaW50IHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIG1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotLyogUHV0IHRoZSBiaXRzIGluIGFuIG9yZGVyIHRoYXQgYSB0YWhvZSB3aWxsIHVuZGVyc3RhbmQsIGRlc3BpdGUgdGhlIG9yZGVyaW5nCi0gICBvZiB0aGUgbmF0aXZlIG1hY2hpbmUuCi0gICBPbiBUYWhvZTogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGJpZyBlbmRpYW4gbG9uZywKLSAgIG5leHQgdGhyZWUgYnl0ZXMgYXJlIHN5bWJvbG51bSwgaW4ga2luZCBvZiAzIGJ5dGUgYmlnIGVuZGlhbiAobGVhc3Qgc2lnLiBieXRlIGxhc3QpLgotICAgVGhlIGxhc3QgYnl0ZSBpcyBicm9rZW4gdXAgd2l0aCBiaXQgNyBhcyBwY3JlbCwKLSAgIAliaXRzIDYgJiA1IGFzIGxlbmd0aCwKLQliaXQgNCBhcyBleHRlcm4gYW5kIHRoZSBsYXN0IG5pYmJsZSBhcyAndW5kZWZpbmVkJy4gKi8KLQotI2lmIGNvbW1lbnQKLXZvaWQKLW1kX3JpX3RvX2NoYXJzIChyaV9wLCByaSkKLSAgICAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcmlfcCwgcmk7Ci17Ci0gIGJ5dGUgdGhlX2J5dGVzW3NpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyldOwotICAvKiBUaGUgcmVhc29uIEkgY2FuJ3QganVzdCBlbmNvZGUgdGhlc2UgZGlyZWN0bHkgaW50byByaV9wIGlzIHRoYXQKLSAgICAgcmlfcCBtYXkgcG9pbnQgdG8gcmkuICovCi0KLSAgLyogVGhpcyBpcyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAodGhlX2J5dGVzLCByaS5yX2FkZHJlc3MsIHNpemVvZiAocmkucl9hZGRyZXNzKSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgdGhlX2J5dGVzWzRdID0gKHJpLnJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmkucl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzZdID0gcmkucl9zeW1ib2xudW0gJiAweDBmZjsKLSAgdGhlX2J5dGVzWzddID0gKCgocmkucl9leHRlcm4gPDwgNCkgJiAweDEwKSB8ICgocmkucl9sZW5ndGggPDwgNSkgJiAweDYwKSB8Ci0JCSAgKChyaS5yX3BjcmVsIDw8IDcpICYgMHg4MCkpICYgMHhmMDsKLQotICBiY29weSAodGhlX2J5dGVzLCAoY2hhciAqKSByaV9wLCBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotLyogUHV0IHRoZSBiaXRzIGluIGFuIG9yZGVyIHRoYXQgYSB0YWhvZSB3aWxsIHVuZGVyc3RhbmQsIGRlc3BpdGUgdGhlIG9yZGVyaW5nCi0gICBvZiB0aGUgbmF0aXZlIG1hY2hpbmUuCi0gICBPbiBUYWhvZTogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGJpZyBlbmRpYW4gbG9uZywKLSAgIG5leHQgdGhyZWUgYnl0ZXMgYXJlIHN5bWJvbG51bSwgaW4ga2luZCBvZiAzIGJ5dGUgYmlnIGVuZGlhbiAobGVhc3Qgc2lnLiBieXRlIGxhc3QpLgotICAgVGhlIGxhc3QgYnl0ZSBpcyBicm9rZW4gdXAgd2l0aCBiaXQgNyBhcyBwY3JlbCwKLSAgIAliaXRzIDYgJiA1IGFzIGxlbmd0aCwKLQliaXQgNCBhcyBleHRlcm4gYW5kIHRoZSBsYXN0IG5pYmJsZSBhcyAndW5kZWZpbmVkJy4gKi8KLQotdm9pZCAKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotICAgICAgIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAotCQkgICAgICA0KTsKLQotICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKLQkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7Ci0KLSAgd2hlcmVbNF0gPSAocl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHdoZXJlWzVdID0gKHJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHdoZXJlWzZdID0gcl9zeW1ib2xudW0gJiAweDBmZjsKLSAgd2hlcmVbN10gPSAoKChpc19wY3JlbCAoZml4UCkgPDwgNykgJiAweDgwKQotCSAgICAgIHwgKCgoKGZpeFAtPmZ4X3R5cGUgPT0gRlhfOCB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMOAotCQkgICAgPyAwCi0JCSAgICA6IChmaXhQLT5meF90eXBlID09IEZYXzE2IHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwxNgotCQkgICAgICAgPyAxCi0JCSAgICA6IChmaXhQLT5meF90eXBlID09IEZYXzMyIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwzMgotCQkgICAgICAgPyAyCi0JCSAgICAgICA6IDQyKSkpKSA8PCA1KSAmIDB4NjApCi0JICAgICAgfCAoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSA8PCA0KSAmIDB4MTApKTsKLX0KLQotLyogUmVsb2NhdGUgYnl0ZSBzdHVmZiAqLwotDAotLyogVGhpcyBpcyBmb3IgYnJva2VuIHdvcmQuICovCi1jb25zdCBpbnQgbWRfc2hvcnRfanVtcF9zaXplID0gMzsKLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMSk7Ci0gICpwdHIrKyA9IFRBSE9FX0JSVzsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgMik7Ci19Ci0KLWNvbnN0IGludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDY7Ci1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyA0KTsKLSAgKnB0cisrID0gVEFIT0VfSk1QOwotICAqcHRyKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgNCk7Ci19Ci0MCi0vKgotICoJCQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpCi0gKgotICogQ2FsbGVkIGp1c3QgYmVmb3JlIHJlbGF4KCkuCi0gKiBBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZCwgc28gd2UgYXNzdW1lZAotICogdGhhdCBpdCB3aWxsIGJlIHJlc29sdmVkIGJ5IHRoZSBsaW5rZXIuCi0gKiBSZXR1cm4gdGhlIGNvcnJlY3QgZnJfc3VidHlwZSBpbiB0aGUgZnJhZywgZm9yIHJlbGF4KCkKLSAqIFJldHVybiB0aGUgaW5pdGlhbCAiZ3Vlc3MgZm9yIGZyX3ZhciIgdG8gY2FsbGVyLiAoSG93IGJpZyBJIHRoaW5rIHRoaXMKLSAqIHdpbGwgYmUuKQotICogVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICogV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAqIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAqIDAgdmFsdWUuCi0gKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50X3R5cGU7CQkvKiBOX0RBVEEgb3IgTl9URVhULiAqLwotewotICByZWdpc3RlciBjaGFyICpwOwotICByZWdpc3RlciBpbnQgb2xkX2ZyX2ZpeDsKLSAgLyogIGludCBwY19yZWw7IEZJWE1FOiByZW1vdmUgdGhpcyAqLwotCi0gIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICAvKiBUaGUgc3ltYm9sIHdhcyBpbiB0aGUgc2FtZSBzZWdtZW50IGFzIHRoZSBvcGNvZGUsIGFuZCBpdCdzCi0JIGEgcmVhbCBwY19yZWwgY2FzZSBzbyBpdCdzIGEgcmVsYXhhYmxlIGNhc2UuICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGNhc2UgaXMgc3RpbGwgdW5kZWZpbmVkLCBzbyBhc3VtZSBpdCdzIGEgbG9uZyB3b3JkIGZvciB0aGUKLQkgbGlua2VyIHRvIGZpeC4gKi8KLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqcCB8PSBUQUhPRV9QQ19PUl9MT05HOwotCSAgLyogV2Ugbm93IGtub3cgaG93IGJpZyBpdCB3aWxsIGJlLCBvbmUgbG9uZyB3b3JkLiAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9CWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpmcmFnUC0+ZnJfb3Bjb2RlIF49IDB4MTA7CS8qIFJldmVyc2Ugc2Vuc2Ugb2YgYnJhbmNoLiAqLwotCSAgKnArKyA9IDY7Ci0JICAqcCsrID0gVEFIT0VfSk1QOwotCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgMSArIDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAzLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPQotCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILCBTVEFURV9XT1JEKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpmcmFnUC0+ZnJfb3Bjb2RlIF49IDB4MTA7CS8qIFJldmVyc2Ugc2Vuc2Ugb2YgYnJhbmNoLiAqLwotCSAgKnArKyA9IDA7Ci0JICAqcCsrID0gNjsKLQkgICpwKysgPSBUQUhPRV9KTVA7Ci0JICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDIgKyAyICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILCBTVEFURV9XT1JEKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpwKysgPSAyOwotCSAgKnArKyA9IDA7Ci0JICAqcCsrID0gVEFIT0VfQlJCOwotCSAgKnArKyA9IDY7Ci0JICAqcCsrID0gVEFIT0VfSk1QOwotCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAyICsgMiArIDIgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyA2LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSA9IFRBSE9FX0pNUDsKLQkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19CQkJCS8qIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgKi8KLQwKLS8qCi0gKgkJCW1kX2NvbnZlcnRfZnJhZygpOwotICoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmFkZHJlc3NQOwkvKiAtPiBfdmFyIHRvIGNoYW5nZS4gKi8KLSAgcmVnaXN0ZXIgY2hhciAqb3Bjb2RlUDsJLyogLT4gb3Bjb2RlIGNoYXIocykgdG8gY2hhbmdlLiAqLwotICByZWdpc3RlciBzaG9ydCBpbnQgbGVuZ3RoX2NvZGU7CS8qIDI9bG9uZyAxPXdvcmQgMD1ieXRlICovCi0gIHJlZ2lzdGVyIHNob3J0IGludCBleHRlbnNpb24gPSAwOwkvKiBTaXplIG9mIHJlbGF4ZWQgYWRkcmVzcy4KLQkJCQkgICBBZGRlZCB0byBmcl9maXg6IGluY2wuIEFMTCB2YXIgY2hhcnMuICovCi0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHJlZ2lzdGVyIGxvbmcgaW50IHdoZXJlOwotICByZWdpc3RlciBsb25nIGludCBhZGRyZXNzX29mX3ZhcjsKLSAgLyogV2hlcmUsIGluIGZpbGUgc3BhY2UsIGlzIF92YXIgb2YgKmZyYWdQPyAqLwotICByZWdpc3RlciBsb25nIGludCB0YXJnZXRfYWRkcmVzczsKLSAgLyogV2hlcmUsIGluIGZpbGUgc3BhY2UsIGRvZXMgYWRkciBwb2ludD8gKi8KLQotICBrbm93IChmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudCk7Ci0gIGxlbmd0aF9jb2RlID0gUkVMQVhfTEVOR1RIIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gIGtub3cgKGxlbmd0aF9jb2RlID49IDAgJiYgbGVuZ3RoX2NvZGUgPCAzKTsKLSAgd2hlcmUgPSBmcmFnUC0+ZnJfZml4OwotICBhZGRyZXNzUCA9IGZyYWdQLT5mcl9saXRlcmFsICsgd2hlcmU7Ci0gIG9wY29kZVAgPSBmcmFnUC0+ZnJfb3Bjb2RlOwotICBzeW1ib2xQID0gZnJhZ1AtPmZyX3N5bWJvbDsKLSAga25vdyAoc3ltYm9sUCk7Ci0gIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKHN5bWJvbFApICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgYWRkcmVzc19vZl92YXIgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlOwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOgotICAgICAgLyogKmFkZHJlc3NQIGhvbGRzIHRoZSByZWdpc3RlcnMgbnVtYmVyLCBwbHVzIDB4MTAsIGlmIGl0J3MgZGVmZXJyZWQKLSAgICAgICBtb2RlLiBUbyBzZXQgdXAgdGhlIHJpZ2h0IG1vZGUsIGp1c3QgT1IgdGhlIHNpemUgb2YgdGhpcyBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIC8qIEJ5dGUgZGlzcGxhY2VtZW50LiAqLwotICAgICAgKmFkZHJlc3NQKysgfD0gVEFIT0VfUENfT1JfQllURTsKLSAgICAgICphZGRyZXNzUCA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1dPUkQpOgotICAgICAgLyogV29yZCBkaXNwbGFjZW1lbnQuICovCi0gICAgICAqYWRkcmVzc1ArKyB8PSBUQUhPRV9QQ19PUl9XT1JEOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAzKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0xPTkcpOgotICAgICAgLyogTG9uZyB3b3JkIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgICphZGRyZXNzUCsrIHw9IFRBSE9FX1BDX09SX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOgotICAgICAgKmFkZHJlc3NQID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKLSAgICAgIGV4dGVuc2lvbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgKm9wY29kZVAgXj0gMHgxMDsJCS8qIFJldmVyc2Ugc2Vuc2Ugb2YgdGVzdC4gKi8KLSAgICAgICphZGRyZXNzUCsrID0gMzsJCS8qIEp1bXAgb3ZlciB3b3JkIGJyYW5jaCAqLwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9CUlc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDQpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgKm9wY29kZVAgXj0gMHgxMDsJCS8qIFJldmVyc2Ugc2Vuc2Ugb2YgdGVzdC4gKi8KLSAgICAgICphZGRyZXNzUCsrID0gNjsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfSk1QOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9CWVRFKToKLSAgICAgICphZGRyZXNzUCA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7Ci0gICAgICBleHRlbnNpb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICAqb3Bjb2RlUCA9IFRBSE9FX0JSVzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMiksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgKm9wY29kZVAgPSBUQUhPRV9KTVA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA1KSwgNCk7Ci0gICAgICBleHRlbnNpb24gPSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgKm9wY29kZVAgXj0gMHgxMDsKLSAgICAgICphZGRyZXNzUCsrID0gMDsKLSAgICAgICphZGRyZXNzUCsrID0gNjsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfSk1QOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILCBTVEFURV9MT05HKToKLSAgICAgICphZGRyZXNzUCsrID0gMDsKLSAgICAgICphZGRyZXNzUCsrID0gMjsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfQlJCOwotICAgICAgKmFkZHJlc3NQKysgPSA2OwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9KTVA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MsIDQpOwotICAgICAgZXh0ZW5zaW9uID0gMTA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKLX0JCQkJLyogbWRfY29udmVydF9mcmFnICovCi0MCi0KLS8qIFRoaXMgaXMgdGhlIHN0dWZmIGZvciBtZF9hc3NlbWJsZS4gKi8KLSNkZWZpbmUgRlBfUkVHIDEzCi0jZGVmaW5lIFNQX1JFRyAxNAotI2RlZmluZSBQQ19SRUcgMTUKLSNkZWZpbmUgQklHR0VTVFJFRyBQQ19SRUcKLQotLyoKLSAqIFBhcnNlIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTVEFSVAotICogSWYgaXQgcmVwcmVzZW50cyBhIHZhbGlkIHJlZ2lzdGVyLCBwb2ludCBTVEFSVCB0byB0aGUgY2hhcmFjdGVyIGFmdGVyCi0gKiB0aGUgbGFzdCB2YWxpZCByZWdpc3RlciBjaGFyLCBhbmQgcmV0dXJuIHRoZSByZWdpc3RlciBudW1iZXIgKDAtMTUpLgotICogSWYgaW52YWxpZCwgbGVhdmUgU1RBUlQgYWxvbmUsIHJldHVybiAtMS4KLSAqIFRoZSBmb3JtYXQgaGFzIHRvIGJlIGV4YWN0LiBJIGRvbid0IGRvIHRoaW5ncyBsaWtlIGVhdCBsZWFkaW5nIHplcm9zCi0gKiBvciB0aGUgbGlrZS4KLSAqIE5vdGU6IFRoaXMgZG9lc24ndCBjaGVjayBmb3IgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgbWFraW5nCi0gKiB0aGlzIGludmFsaWQuIEV4OiBSMTIzIHdvdWxkIHJldHVybiAxMiwgaXQncyB0aGUgY2FsbGVycyBqb2IgdG8gY2hlY2sKLSAqIHdoYXQgc3RhcnQgaXMgcG9pbnQgdG8gYXBvbiByZXR1cm4uCi0gKgotICogVmFsaWQgcmVnaXN0ZXJzIGFyZSBSMS1SMTUsICUxLSUxNSwgRlAgKDEzKSwgU1AgKDE0KSwgUEMgKDE1KQotICogQ2FzZSBkb2Vzbid0IG1hdHRlci4KLSAqLwotaW50Ci10YWhvZV9yZWdfcGFyc2UgKHN0YXJ0KQotICAgICBjaGFyICoqc3RhcnQ7CQkvKiBBIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0byBwYXJzZS4gKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmVncG9pbnQgPSAqc3RhcnQ7Ci0gIHJlZ2lzdGVyIGludCByZWdudW0gPSAtMTsKLQotICBzd2l0Y2ggKCpyZWdwb2ludCsrKQotICAgIHsKLSAgICBjYXNlICclJzoJCQkvKiBSZWdpc3RlcnMgY2FuIHN0YXJ0IHdpdGggYSAlLAotCQkJCSAgIFIgb3IgciwgYW5kIHRoZW4gYSBudW1iZXIuICovCi0gICAgY2FzZSAnUic6Ci0gICAgY2FzZSAncic6Ci0gICAgICBpZiAoaXNkaWdpdCAoKnJlZ3BvaW50KSkKLQl7Ci0JICAvKiBHb3QgdGhlIGZpcnN0IGRpZ2l0LiAqLwotCSAgcmVnbnVtID0gKnJlZ3BvaW50KysgLSAnMCc7Ci0JICBpZiAoKHJlZ251bSA9PSAxKSAmJiBpc2RpZ2l0ICgqcmVncG9pbnQpKQotCSAgICB7Ci0JICAgICAgLyogSXRzIGEgdHdvIGRpZ2l0IG51bWJlci4gKi8KLQkgICAgICByZWdudW0gPSAxMCArICgqcmVncG9pbnQrKyAtICcwJyk7Ci0JICAgICAgaWYgKHJlZ251bSA+IEJJR0dFU1RSRUcpCi0JCXsJCS8qIE51bWJlciB0b28gYmlnPyAqLwotCQkgIHJlZ251bSA9IC0xOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdGJzoJCQkvKiBJcyBpdCB0aGUgRlAgKi8KLSAgICBjYXNlICdmJzoKLSAgICAgIHN3aXRjaCAoKnJlZ3BvaW50KyspCi0JewotCWNhc2UgJ3AnOgotCWNhc2UgJ1AnOgotCSAgcmVnbnVtID0gRlBfUkVHOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgkJCS8qIEhvdyBhYm91dCB0aGUgU1AgKi8KLSAgICBjYXNlICdTJzoKLSAgICAgIHN3aXRjaCAoKnJlZ3BvaW50KyspCi0JewotCWNhc2UgJ3AnOgotCWNhc2UgJ1AnOgotCSAgcmVnbnVtID0gU1BfUkVHOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3AnOgkJCS8qIE9SIHRoZSBQQyBldmVuICovCi0gICAgY2FzZSAnUCc6Ci0gICAgICBzd2l0Y2ggKCpyZWdwb2ludCsrKQotCXsKLQljYXNlICdjJzoKLQljYXNlICdDJzoKLQkgIHJlZ251bSA9IFBDX1JFRzsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJlZ251bSAhPSAtMSkKLSAgICB7CQkJCS8qIE5vIGVycm9yLCBzbyBtb3ZlIHN0cmluZyBwb2ludGVyICovCi0gICAgICAqc3RhcnQgPSByZWdwb2ludDsKLSAgICB9Ci0gIHJldHVybiByZWdudW07CQkvKiBSZXR1cm4gcmVzdWx0cyAqLwotfQkJCQkvKiB0YWhvZV9yZWdfcGFyc2UgKi8KLQwKLS8qCi0gKiBUaGlzIGNob3BzIHVwIGFuIG9wZXJhbmQgYW5kIGZpZ3VyZXMgb3V0IGl0cyBtb2RlcyBhbmQgc3R1ZmYuCi0gKiBJdCdzIGEgbGl0dGxlIHRvdWNoeSBhYm91dCBleHRyYSBjaGFyYWN0ZXJzLgotICogT3B0ZXggdG8gc3RhcnQgd2l0aCBvbmUgZXh0cmEgY2hhcmFjdGVyIHNvIGl0IGNhbiBiZSBvdmVyd3JpdHRlbiBmb3IKLSAqIHRoZSBiYWNrd2FyZCBwYXJ0IG9mIHRoZSBwYXJzaW5nLgotICogWW91IGNhbid0IHB1dCBhIGJ1bmNoIG9mIGV4dHJhIGNoYXJhY3RlcnMgaW4gc2lkZSB0bwotICogbWFrZSB0aGUgY29tbWFuZCBsb29rIGN1dGUuIGllOiAqIGZvbyAoIHIxICkgWyAgcjAgXQotICogSWYgeW91IGxpa2UgZG9pbmcgYSBsb3Qgb2YgdHlwaW5nLCB0cnkgQ09CT0whCi0gKiBBY3R1YWxseSwgdGhpcyBwYXJzZXIgaXMgYSBsaXR0bGUgd2VhayBhbGwgYXJvdW5kLiBJdCdzIGRlc2lnbmVkIHRvIGJlCi0gKiB1c2VkIHdpdGggY29tcGxpZXJzLCBzbyBJIGVtcGhpc2lzZSBjb3JyZWN0IGRlY29kaW5nIG9mIHZhbGlkIGNvZGUgcXVpY2tseQotICogcmF0aGVyIHRoYXQgY2F0Y2hpbmcgZXZlcnkgcG9zc2FibGUgZXJyb3IuCi0gKiBOb3RlOiBUaGlzIHVzZXMgdGhlIGV4cHJlc3Npb24gZnVuY3Rpb24sIHNvIHNhdmUgaW5wdXRfbGluZV9wb2ludGVyIGJlZm9yZQotICogY2FsbGluZy4KLSAqCi0gKiBTcGVycnkgZGVmaW5lcyB0aGUgc2VtYW50aWNzIG9mIGFkZHJlc3MgbW9kZXMgKGFuZCB2YWx1ZXMpCi0gKiBieSBhIHR3by1sZXR0ZXIgY29kZSwgZXhwbGFpbmVkIGhlcmUuCi0gKgotICogICBsZXR0ZXIgMTogICBhY2Nlc3MgdHlwZQotICoKLSAqICAgICBhICAgICAgICAgYWRkcmVzcyBjYWxjdWxhdGlvbiAtIG5vIGRhdGEgYWNjZXNzLCByZWdpc3RlcnMgZm9yYmlkZGVuCi0gKiAgICAgYiAgICAgICAgIGJyYW5jaCBkaXNwbGFjZW1lbnQKLSAqICAgICBtICAgICAgICAgcmVhZCAtIGxldCBnbyBvZiBidXMgLSB3cml0ZSBiYWNrICJtb2RpZnkiCi0gKiAgICAgciAgICAgICAgIHJlYWQKLSAqICAgICB3ICAgICAgICAgd3JpdGUKLSAqICAgICB2ICAgICAgICAgYml0IGZpZWxkIGFkZHJlc3M6IGxpa2UgJ2EnIGJ1dCByZWdpc3RlcnMgYXJlIE9LCi0gKgotICogICBsZXR0ZXIgMjogICBkYXRhIHR5cGUgKGkuZS4gd2lkdGgsIGFsaWdubWVudCkKLSAqCi0gKiAgICAgYiAgICAgICAgIGJ5dGUKLSAqICAgICB3ICAgICAgICAgd29yZAotICogICAgIGwgICAgICAgICBsb25nd29yZAotICogICAgIHEgICAgICAgICBxdWFkd29yZCAoRXZlbiByZWdzIDwgMTQgYWxsb3dlZCkgKGlmIDEyLCB5b3UgZ2V0IGEgd2FybmluZykKLSAqICAgICAtCSB1bmNvbmRpdGlvbmFsIHN5bnRoZXRpYyBqYnIgb3BlcmFuZAotICogICAgID8JIHNpbXBsZSBzeW50aGV0aWMgcmV2ZXJzYWJsZSBicmFuY2ggb3BlcmFuZAotICogICAgICEJIGNvbXBsZXggc3ludGhldGljIHJldmVyc2FibGUgYnJhbmNoIG9wZXJhbmQKLSAqICAgICA6CSBjb21wbGV4IHN5bnRoZXRpYyBub24tcmV2ZXJzYWJsZSBicmFuY2ggb3BlcmFuZAotICoKLSAqIFRoZSAnLT8hOicgbGV0dGVyIDIncyBhcmUgbm90IGZvciBleHRlcm5hbCBjb25zdW1wdGlvbi4gVGhleSBhcmUgdXNlZAotICogYnkgR0FTIGZvciBwc3VlZG8gb3BzIHJlbGF4aW5nIGNvZGUuCi0gKgotICogQWZ0ZXIgcGFyc2luZyB0b3BQIGhhczoKLSAqCi0gKiAgIHRvcF9uZHg6ICAgICAgICAtMSwgb3IgdGhlIGluZGV4IHJlZ2lzdGVyLiBlZyA3PVtSN10KLSAqICAgdG9wX3JlZzogICAgICAgIC0xLCBvciByZWdpc3RlciBudW1iZXIuIGVnIDcgPSBSNyBvciAoUjcpCi0gKiAgIHRvcF9tb2RlOiAgICAgICBUaGUgYWRkcmVzc2luZyBtb2RlIGJ5dGUuIFRoaXMgYnl0ZSwgZGVmaW5lcyB3aGljaCBvZgotICogICAgICAgICAgICAgICAgICAgdGhlIDExIG1vZGVzIG9wY29kZSBpcy4KLSAqICAgdG9wX2FjY2VzczogICAgIEFjY2VzcyB0eXBlIHdhbnRlZCBmb3IgdGhpcyBvcHBlcmFuZCAnYidicmFuY2ggJyAnCi0gKiAgICAgICAgICAgICAgICAgICBuby1pbnN0cnVjdGlvbiAnYW1ydncnCi0gKiAgIHRvcF93aWR0aDogICAgICBPcGVyYW5kIHdpZHRoIGV4cGVjdGVkLCBvbmUgb2YgImJ3bHE/LTohIgotICogICBleHBfb2Zfb3BlcmFuZDogVGhlIGV4cHJlc3Npb24gYXMgcGFyc2VkIGJ5IGV4cHJlc3Npb24oKQotICogICB0b3BfZGlzcHNpemU6ICAgTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBkaXNwbGFjZW1lbnQgaWYgd2UgY2FuIGZpZ3VyZSBpdAotICogICAgICAgICAgICAgICAgICAgb3V0IGFuZCBpdCdzIHJlbGF2ZW50LgotICoKLSAqIE5lZWQgc3ludGF4IGNoZWNrcyBidWlsdC4KLSAqLwotCi12b2lkCi10aXBfb3AgKG9wdGV4LCB0b3BQKQotICAgICBjaGFyICpvcHRleDsJCS8qIFRoZSB1c2VycyB0ZXh0IGlucHV0LCB3aXRoIG9uZSBsZWFkaW5nIGNoYXJhY3RlciAqLwotICAgICBzdHJ1Y3QgdG9wICp0b3BQOwkJLyogVGhlIHRhaG9lIGluc3RydWN0aW9uIHdpdGggc29tZSBmaWVsZHMgYWxyZWFkeSBzZXQ6Ci0JCQkgaW46IGFjY2Vzcywgd2lkdGgKLQkJCSBvdXQ6IG5keCwgcmVnLCBtb2RlLCBlcnJvciwgZGlzcHNpemUgKi8KLQotewotICBpbnQgbW9kZSA9IDA7CQkJLyogVGhpcyBvcGVyYW5kJ3MgbW9kZS4gKi8KLSAgY2hhciBzZWdmYXVsdCA9ICpvcHRleDsJLyogVG8ga2VlcCB0aGUgYmFjayBwYXJzaW5nIGZyb20gZnJlYWtpbmcuICovCi0gIGNoYXIgKnBvaW50ID0gb3B0ZXggKyAxOwkvKiBQYXJzaW5nIGZyb20gZnJvbnQgdG8gYmFjay4gKi8KLSAgY2hhciAqZW5kOwkJCS8qIFBhcnNpbmcgZnJvbSBiYWNrIHRvIGZyb250LiAqLwotICBpbnQgcmVnID0gLTE7CQkJLyogbWFqb3IgcmVnaXN0ZXIsIC0xIG1lYW5zIGFic2VudCAqLwotICBpbnQgaW1yZWcgPSAtMTsJCS8qIE1ham9yIHJlZ2lzdGVyIGluIGltbWVkaWF0ZSBtb2RlICovCi0gIGludCBuZHggPSAtMTsJCQkvKiBpbmRleCByZWdpc3RlciBudW1iZXIsIC0xIG1lYW5zIGFic2VudCAqLwotICBjaGFyIGRlY19pbmMgPSAnICc7CQkvKiBJcyB0aGUgU1AgYXV0by1pbmNyZW1lbnRlZCAnKycgb3IKLQkJCQkgICBhdXRvLWRlY3JlbWVudGVkICctJyBvciBuZWl0aGVyICcgJy4gKi8KLSAgaW50IGltbWVkaWF0ZSA9IDA7CQkvKiAxIGlmICckJyBpbW1lZGlhdGUgbW9kZSAqLwotICBpbnQgY2FsbF93aWR0aCA9IDA7CQkvKiBJZiB0aGUgY2FsbGVyIGNhc3RzIHRoZSBkaXNwbGFjZW1lbnQgKi8KLSAgaW50IGFic193aWR0aCA9IDA7CQkvKiBUaGUgd2lkdGggb2YgdGhlIGFic29sdXRlIGRpc3BsYWNtZW50ICovCi0gIGludCBjb21fd2lkdGggPSAwOwkJLyogRGlzcGxhY2VtZW50IHdpZHRoIHJlcXVpcmVkIGJ5IGJyYW5jaCAqLwotICBpbnQgZGVmZXJyZWQgPSAwOwkJLyogMSBpZiAnKicgZGVmZXJyYWwgaXMgdXNlZCAqLwotICBieXRlIGRpc3Bfc2l6ZSA9IDA7CQkvKiBIb3cgYmlnIGlzIHRoaXMgb3BlcmFuZC4gMCA9PSBkb24ndCBrbm93ICovCi0gIGNoYXIgKm9wX2JhZCA9ICIiOwkJLyogQmFkIG9wZXJhbmQgZXJyb3IgKi8KLQotICBjaGFyICp0cCwgKnRlbXAsIGM7CQkvKiBUZW1wb3JhcnkgaG9sZGVycyAqLwotCi0gIGNoYXIgYWNjZXNzID0gdG9wUC0+dG9wX2FjY2VzczsJLyogU2F2ZSBvbiBhIGRlcmVmLiAqLwotICBjaGFyIHdpZHRoID0gdG9wUC0+dG9wX3dpZHRoOwotCi0gIGludCByZWFsbHlfbm9uZSA9IDA7CQkvKiBFbXB0eSBleHByZXNzaW9ucyBldmFsdWF0ZSB0byAwCi0JCQkJICAgYnV0IEkgbmVlZCB0byBrbm93IGlmIGl0J3MgdGhlcmUgb3Igbm90ICovCi0gIGV4cHJlc3Npb25TICpleHBQOwkJLyogLT4gZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIHRoaXMgb3BlcmFuZCAqLwotCi0gIC8qIERvZXMgdGhpcyBjb21tYW5kIHJlc3RyaWN0IHRoZSBkaXNwbGFjZW1lbnQgc2l6ZS4gKi8KLSAgaWYgKGFjY2VzcyA9PSAnYicpCi0gICAgY29tX3dpZHRoID0gKHdpZHRoID09ICdiJyA/IDEgOgotCQkgKHdpZHRoID09ICd3JyA/IDIgOgotCQkgICh3aWR0aCA9PSAnbCcgPyA0IDogMCkpKTsKLQotICAqb3B0ZXggPSAnXDAnOwkJLyogVGhpcyBpcyBraW5kIG9mIGEgYmFjayBzdG9wIGZvciBhbGwKLQkJCQkgICB0aGUgc2VhcmNoZXMgdG8gZmFpbCBvbiBpZiBuZWVkZWQuKi8KLSAgaWYgKCpwb2ludCA9PSAnKicpCi0gICAgewkJCQkvKiBBIGRlcmVmZXJlbmNlPyAqLwotICAgICAgZGVmZXJyZWQgPSAxOwotICAgICAgcG9pbnQrKzsKLSAgICB9Ci0KLSAgLyogRm9yY2Ugd29yZHMgaW50byBhIGNlcnRhaW4gbW9kZSAqLwotICAvKiBCaXRjaCwgQml0Y2gsIEJpdGNoISAqLwotICAvKgotICAgKiBVc2luZyB0aGUgXiBvcGVyYXRvciBpcyBhbWJpZ291cy4gSWYgSSBoYXZlIGFuIGFic29sdXRlIGxhYmVsCi0gICAqIGNhbGxlZCAndycgc2V0IHRvLCBzYXkgMiwgYW5kIEkgaGF2ZSB0aGUgZXhwcmVzc2lvbiAnd14xJywgZG8gSSBnZXQKLSAgICogMSwgZm9yY2VkIHRvIGJlIGluIHdvcmQgZGlzcGxhY2VtZW50IG1vZGUsIG9yIGRvIEkgZ2V0IHRoZSB2YWx1ZSBvZgotICAgKiAndycgb3InZWQgd2l0aCAxICgzIGluIHRoaXMgY2FzZSkuCi0gICAqIFRoZSBkZWZhdWx0IGlzICd3JyBhcyBhbiBvZmZzZXQsIHNvIHRoYXQncyB3aGF0IEkgdXNlLgotICAgKiBTdGljayB3aXRoIGAsIGl0IGRvZXMgdGhlIHNhbWUsIGFuZCBpc24ndCBhbWJpZy4KLSAgICovCi0KLSAgaWYgKCpwb2ludCAhPSAnXDAnICYmICgocG9pbnRbMV0gPT0gJ14nKSB8fCAocG9pbnRbMV0gPT0gJ2AnKSkpCi0gICAgc3dpdGNoICgqcG9pbnQpCi0gICAgICB7Ci0gICAgICBjYXNlICdiJzoKLSAgICAgIGNhc2UgJ0InOgotICAgICAgY2FzZSAndyc6Ci0gICAgICBjYXNlICdXJzoKLSAgICAgIGNhc2UgJ2wnOgotICAgICAgY2FzZSAnTCc6Ci0JaWYgKGNvbV93aWR0aCkKLQkgIGFzX3dhcm4gKF8oIkNhc3RpbmcgYSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGJhZCBmb3JtLCBhbmQgaXMgaWdub3JlZC4iKSk7Ci0JZWxzZQotCSAgewotCSAgICBjID0gKGlzdXBwZXIgKCpwb2ludCkgPyB0b2xvd2VyICgqcG9pbnQpIDogKnBvaW50KTsKLQkgICAgY2FsbF93aWR0aCA9ICgoYyA9PSAnYicpID8gMSA6Ci0JCQkgICgoYyA9PSAndycpID8gMiA6IDQpKTsKLQkgIH0KLQlwb2ludCArPSAyOwotCWJyZWFrOwotICAgICAgfQotCi0gIC8qIFNldHRpbmcgaW1tZWRpYXRlIG1vZGUgKi8KLSAgaWYgKCpwb2ludCA9PSAnJCcpCi0gICAgewotICAgICAgaW1tZWRpYXRlID0gMTsKLSAgICAgIHBvaW50Kys7Ci0gICAgfQotCi0gIC8qCi0gICAqIEkndmUgcHVsbGVkIG9mZiBhbGwgdGhlIGVhc3kgc3R1ZmYgb2ZmIHRoZSBmcm9udCwgbW92ZSB0byB0aGUgZW5kIGFuZAotICAgKiB5YW5rLgotICAgKi8KLQotICBmb3IgKGVuZCA9IHBvaW50OyAqZW5kICE9ICdcMCc7IGVuZCsrKQkvKiBNb3ZlIHRvIHRoZSBlbmQuICovCi0gICAgOwotCi0gIGlmIChlbmQgIT0gcG9pbnQpCQkvKiBOdWxsIHN0cmluZz8gKi8KLSAgICBlbmQtLTsKLQotICBpZiAoZW5kID4gcG9pbnQgJiYgKmVuZCA9PSAnICcgJiYgZW5kWy0xXSAhPSAnXCcnKQotICAgIGVuZC0tOwkJCS8qIEhvcCB3aGl0ZSBzcGFjZSAqLwotCi0gIC8qIElzIHRoaXMgYW4gaW5kZXggcmVnLiAqLwotICBpZiAoKCplbmQgPT0gJ10nKSAmJiAoZW5kWy0xXSAhPSAnXCcnKSkKLSAgICB7Ci0gICAgICB0ZW1wID0gZW5kOwotCi0gICAgICAvKiBGaW5kIG9wZW5pbmcgYnJhY2UuICovCi0gICAgICBmb3IgKC0tZW5kOyAoKmVuZCAhPSAnWycgJiYgZW5kICE9IHBvaW50KTsgZW5kLS0pCi0JOwotCi0gICAgICAvKiBJZiBJIGZvdW5kIHRoZSBvcGVuaW5nIGJyYWNlLCBnZXQgdGhlIGluZGV4IHJlZ2lzdGVyIG51bWJlci4gKi8KLSAgICAgIGlmICgqZW5kID09ICdbJykKLQl7Ci0JICB0cCA9IGVuZCArIDE7CQkvKiB0cCBzaG91bGQgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGEgcmVnLiAqLwotCSAgbmR4ID0gdGFob2VfcmVnX3BhcnNlICgmdHApOwotCSAgaWYgKHRwICE9IHRlbXApCi0JICAgIHsJCQkvKiBSZWcuIHBhcnNlIGVycm9yLiAqLwotCSAgICAgIG5keCA9IC0xOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbmQtLTsJCS8qIEZvdW5kIGl0LCBtb3ZlIHBhc3QgYnJhY2UuICovCi0JICAgIH0KLQkgIGlmIChuZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBvcF9iYWQgPSBfKCJDb3VsZG4ndCBwYXJzZSB0aGUgW2luZGV4XSBpbiB0aGlzIG9wZXJhbmQuIik7Ci0JICAgICAgZW5kID0gcG9pbnQ7CS8qIEZvcmNlIGFsbCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgdG8gZmFpbC4gKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcF9iYWQgPSBfKCJDb3VsZG4ndCBmaW5kIHRoZSBvcGVuaW5nICdbJyBmb3IgdGhlIGluZGV4IG9mIHRoaXMgb3BlcmFuZC4iKTsKLQkgIGVuZCA9IHBvaW50OwkJLyogRm9yY2UgYWxsIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB0byBmYWlsLiAqLwotCX0KLSAgICB9Ci0KLSAgLyogUG9zdCBpbmNyZW1lbnQ/ICovCi0gIGlmICgqZW5kID09ICcrJykKLSAgICB7Ci0gICAgICBkZWNfaW5jID0gJysnOwotICAgICAgLyogd2FzOiAgICAqZW5kLS07ICovCi0gICAgICBlbmQtLTsKLSAgICB9Ci0KLSAgLyogcmVnaXN0ZXIgaW4gcGFyZW5zPyAqLwotICBpZiAoKCplbmQgPT0gJyknKSAmJiAoZW5kWy0xXSAhPSAnXCcnKSkKLSAgICB7Ci0gICAgICB0ZW1wID0gZW5kOwotCi0gICAgICAvKiBGaW5kIG9wZW5pbmcgcGFyZW4uICovCi0gICAgICBmb3IgKC0tZW5kOyAoKmVuZCAhPSAnKCcgJiYgZW5kICE9IHBvaW50KTsgZW5kLS0pCi0JOwotCi0gICAgICAvKiBJZiBJIGZvdW5kIHRoZSBvcGVuaW5nIHBhcmVuLCBnZXQgdGhlIHJlZ2lzdGVyIG51bWJlci4gKi8KLSAgICAgIGlmICgqZW5kID09ICcoJykKLQl7Ci0JICB0cCA9IGVuZCArIDE7Ci0JICByZWcgPSB0YWhvZV9yZWdfcGFyc2UgKCZ0cCk7Ci0JICBpZiAodHAgIT0gdGVtcCkKLQkgICAgewotCSAgICAgIC8qIE5vdCBhIHJlZ2lzdGVyLCBidXQgY291bGQgYmUgcGFydCBvZiB0aGUgZXhwcmVzc2lvbi4gKi8KLQkgICAgICByZWcgPSAtMTsKLQkgICAgICBlbmQgPSB0ZW1wOwkvKiBSZXN0IHRoZSBwb2ludGVyIGJhY2sgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZW5kLS07CQkvKiBGb3VuZCB0aGUgcmVnLiBtb3ZlIGJlZm9yZSBvcGVuaW5nIHBhcmVuLiAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wX2JhZCA9IF8oIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJygnIGZvciB0aGUgZGVyZWYgb2YgdGhpcyBvcGVyYW5kLiIpOwotCSAgZW5kID0gcG9pbnQ7CQkvKiBGb3JjZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHRvIGZhaWwuICovCi0JfQotICAgIH0KLQotICAvKiBQcmUgZGVjcmVtZW50PyAqLwotICBpZiAoKmVuZCA9PSAnLScpCi0gICAgewotICAgICAgaWYgKGRlY19pbmMgIT0gJyAnKQotCXsKLQkgIG9wX2JhZCA9IF8oIk9wZXJhbmQgY2FuJ3QgYmUgYm90aCBwcmUtaW5jIGFuZCBwb3N0LWRlYy4iKTsKLQkgIGVuZCA9IHBvaW50OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkZWNfaW5jID0gJy0nOwotCSAgLyogd2FzOiAgICAgICplbmQtLTsgKi8KLQkgIGVuZC0tOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogRXZlcnl0aGluZyBiZXR3ZWVuIHBvaW50IGFuZCBlbmQgaXMgdGhlICdleHByZXNzaW9uJywgdW5sZXNzIGl0J3MKLSAgICogYSByZWdpc3RlciBuYW1lLgotICAgKi8KLQotICBjID0gZW5kWzFdOwotICBlbmRbMV0gPSAnXDAnOwotCi0gIHRwID0gcG9pbnQ7Ci0gIGltcmVnID0gdGFob2VfcmVnX3BhcnNlICgmcG9pbnQpOwkvKiBHZXQgdGhlIGltbWVkaWF0ZSByZWdpc3RlcgotCQkJCSAgICAgIGlmIGl0IGlzIHRoZXJlLiovCi0gIGlmICgqcG9pbnQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSBpcyBqdW5rIGFmdGVyIHBvaW50LCB0aGVuIHRoZSBpdCdzIG5vdCBpbW1lZGlhdGUgcmVnLiAqLwotICAgICAgcG9pbnQgPSB0cDsKLSAgICAgIGltcmVnID0gLTE7Ci0gICAgfQotCi0gIGlmIChpbXJlZyAhPSAtMSAmJiByZWcgIT0gLTEpCi0gICAgb3BfYmFkID0gXygiSSBwYXJzZWQgMiByZWdpc3RlcnMgaW4gdGhpcyBvcGVyYW5kLiIpOwotCi0gIC8qCi0gICAqIEV2YWx1YXRlIHdoYXRzIGxlZnQgb2YgdGhlIGV4cHJlc3Npb24gdG8gc2VlIGlmIGl0J3MgdmFsaWQuCi0gICAqIE5vdGUgYWdhaW46IFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjYWxsaW5nIGV4cHJlc3Npb24gaGFzIHNhdmVkCi0gICAqIGlucHV0X2xpbmVfcG9pbnRlci4gKE5hZywgbmFnLCBuYWchKQotICAgKi8KLQotICBpZiAoKm9wX2JhZCA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIHN0YXRlbWVudCBoYXMgbm8gc3ludGF4IGdvb2ZzIHlldDogbGV0cyBzbmlmZiB0aGUgZXhwcmVzc2lvbiAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcG9pbnQ7Ci0gICAgICBleHBQID0gJih0b3BQLT5leHBfb2Zfb3BlcmFuZCk7Ci0gICAgICB0b3BQLT5zZWdfb2Zfb3BlcmFuZCA9IGV4cHJlc3Npb24gKGV4cFApOwotICAgICAgc3dpdGNoIChleHBQLT5YX29wKQotCXsKLQljYXNlIE9fYWJzZW50OgotCSAgLyogTm8gZXhwcmVzc2lvbi4gRm9yIEJTRDQuMiBjb21wYXRpYmlsaXR5LCBtaXNzaW5nIGV4cHJlc3Npb24gaXMKLQkgICAgIGFic29sdXRlIDAgKi8KLQkgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXhwUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIHJlYWxseV9ub25lID0gMTsKLQljYXNlIE9fY29uc3RhbnQ6Ci0JICAvKiBmb3IgU0VHX0FCU09MVVRFLCB3ZSBzaG91bGRudCBuZWVkIHRvIHNldCBYX29wX3N5bWJvbCwKLQkgICAgIFhfYWRkX3N5bWJvbCB0byBhbnkgcGFydGljdWxhciB2YWx1ZS4gKi8KLQkgIC8qIEJ1dCwgd2Ugd2lsbCBwcm9ncmFtIGRlZmVuc2l2ZWx5LiBTaW5jZSB0aGlzIHNpdHVhdGlvbiBvY2N1cnMKLQkgICAgIHJhcmVseSBzbyBpdCBjb3N0cyB1cyBsaXR0bGUgdG8gZG8gc28uICovCi0JICBleHBQLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgZXhwUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgLyogSG93IG1hbnkgYnl0ZXMgYXJlIG5lZWRlZCB0byBleHByZXNzIHRoaXMgYWJzIHZhbHVlPyAqLwotCSAgYWJzX3dpZHRoID0KLQkgICAgKCgoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRkZGODApID09IDApIHx8Ci0JICAgICAgKChleHBQLT5YX2FkZF9udW1iZXIgJiAweEZGRkZGRjgwKSA9PSAweEZGRkZGRjgwKSkgPyAxIDoKLQkgICAgICgoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRjgwMDApID09IDApIHx8Ci0JICAgICAgKChleHBQLT5YX2FkZF9udW1iZXIgJiAweEZGRkY4MDAwKSA9PSAweEZGRkY4MDAwKSkgPyAyIDogNCk7Ci0KLQljYXNlIE9fc3ltYm9sOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgLyoKLQkgICAqIE1ham9yIGJ1Zy4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBjYXNlIG9mIGEgb3BlcmF0b3IKLQkgICAqIGV4cHJlc3Npb24gaW4gYSBzeW50aGV0aWMgb3Bjb2RlIHZhcmlhYmxlLWxlbmd0aAotCSAgICogaW5zdHJ1Y3Rpb24uICBXZSBkb24ndCBoYXZlIGEgZnJhZyB0eXBlIHRoYXQgaXMgc21hcnQKLQkgICAqIGVub3VnaCB0byByZWxheCBhIG9wZXJhdG9yLCBhbmQgc28gd2UganVzdCBmb3JjZSBhbGwKLQkgICAqIG9wZXJhdG9ycyB0byBiZWhhdmUgbGlrZSBTRUdfUEFTUzFzLiAgQ2xlYXJseSwgaWYgdGhlcmUgaXMKLQkgICAqIGEgZGVtYW5kIHdlIGNhbiBpbnZlbnQgYSBuZXcgb3IgbW9kaWZpZWQgZnJhZyB0eXBlIGFuZAotCSAgICogdGhlbiBjb2RpbmcgdXAgYSBmcmFnIGZvciB0aGlzIGNhc2Ugd2lsbCBiZSBlYXN5LgotCSAgICovCi0JICBuZWVkX3Bhc3NfMiA9IDE7Ci0JICBvcF9iYWQgPSBfKCJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIGVycm9yLiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fYmlnOgotCSAgLyogVGhpcyBpcyBhbiBlcnJvci4gVGFob2UgZG9lc24ndCBhbGxvdyBhbnkgZXhwcmVzc2lvbnMKLQkgICAgIGJpZ2dlciB0aGF0IGEgMzIgYml0IGxvbmcgd29yZC4gQW55IGJpZ2dlciBoYXMgdG8gYmUgcmVmZXJlbmNlZAotCSAgICAgYnkgYWRkcmVzcy4gKi8KLQkgIG9wX2JhZCA9IF8oIkV4cHJlc3Npb24gaXMgdG9vIGxhcmdlIGZvciBhIDMyIGJpdHMuIik7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXDAnKQotCXsKLQkgIG9wX2JhZCA9IF8oIkp1bmsgYXQgZW5kIG9mIGV4cHJlc3Npb24uIik7Ci0JfQotICAgIH0KLQotICBlbmRbMV0gPSBjOwotCi0gIC8qIEknbSBkb25lLCBzbyByZXN0b3JlIG9wdGV4ICovCi0gICpvcHRleCA9IHNlZ2ZhdWx0OwotCi0KLSAgLyoKLSAgICogQXQgdGhpcyBwb2ludCBpbiB0aGUgZ2FtZSwgd2UgKGluIHRoZW9yeSkgaGF2ZSBhbGwgdGhlIGNvbXBvbmVudHMgb2YKLSAgICogdGhlIG9wZXJhbmQgYXQgbGVhc3QgcGFyc2VkLiBOb3cgaXQncyB0aW1lIHRvIGNoZWNrIGZvciBzeW50YXgvc2VtYW50aWMKLSAgICogZXJyb3JzLCBhbmQgYnVpbGQgdGhlIG1vZGUuCi0gICAqIFRoaXMgaXMgd2hhdCBJIGhhdmU6Ci0gICAqICAgZGVmZXJyZWQgPSAxIGlmICcqJwotICAgKiAgIGNhbGxfd2lkdGggPSAwLDEsMiw0Ci0gICAqICAgYWJzX3dpZHRoID0gMCwxLDIsNAotICAgKiAgIGNvbV93aWR0aCA9IDAsMSwyLDQKLSAgICogICBpbW1lZGlhdGUgPSAxIGlmICckJwotICAgKiAgIG5keCA9IC0xIG9yIHJlZyBudW0KLSAgICogICBkZWNfaW5jID0gJy0nIG9yICcrJyBvciAnICcKLSAgICogICByZWcgPSAtMSBvciByZWcgbnVtCi0gICAqICAgaW1yZWcgPSAtMSBvciByZWcgbnVtCi0gICAqICAgdG9wUC0+ZXhwX29mX29wZXJhbmQKLSAgICogICByZWFsbHlfbm9uZQotICAgKi8KLSAgLyogSXMgdGhlcmUgYSBkaXNwbGFjZW1lbnQgc2l6ZT8gKi8KLSAgZGlzcF9zaXplID0gKGNhbGxfd2lkdGggPyBjYWxsX3dpZHRoIDoKLQkgICAgICAgKGNvbV93aWR0aCA/IGNvbV93aWR0aCA6Ci0JCWFic193aWR0aCA/IGFic193aWR0aCA6IDApKTsKLQotICBpZiAoKm9wX2JhZCA9PSAnXDAnKQotICAgIHsKLSAgICAgIGlmIChpbXJlZyAhPSAtMSkKLQl7Ci0JICAvKiBSbiAqLwotCSAgbW9kZSA9IFRBSE9FX0RJUkVDVF9SRUc7Ci0JICBpZiAoZGVmZXJyZWQgfHwgaW1tZWRpYXRlIHx8IChkZWNfaW5jICE9ICcgJykgfHwKLQkgICAgICAocmVnICE9IC0xKSB8fCAhcmVhbGx5X25vbmUpCi0JICAgIG9wX2JhZCA9IF8oIlN5bnRheCBlcnJvciBpbiBkaXJlY3QgcmVnaXN0ZXIgbW9kZS4iKTsKLQkgIGVsc2UgaWYgKG5keCAhPSAtMSkKLQkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGluZGV4IGEgcmVnaXN0ZXIgaW4gZGlyZWN0IHJlZ2lzdGVyIG1vZGUuIik7Ci0JICBlbHNlIGlmIChpbXJlZyA9PSBTUF9SRUcgJiYgYWNjZXNzID09ICdyJykKLQkgICAgb3BfYmFkID0KLQkgICAgICBfKCJTUCBjYW4ndCBiZSB0aGUgc291cmNlIG9wZXJhbmQgd2l0aCBkaXJlY3QgcmVnaXN0ZXIgYWRkcmVzc2luZy4iKTsKLQkgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYScpCi0JICAgIG9wX2JhZCA9IF8oIkNhbid0IHRha2UgdGhlIGFkZHJlc3Mgb2YgYSByZWdpc3Rlci4iKTsKLQkgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCi0JICAgIG9wX2JhZCA9IF8oIkRpcmVjdCBSZWdpc3RlciBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOwotCSAgZWxzZSBpZiAod2lkdGggPT0gJ3EnICYmICgoaW1yZWcgJSAyKSB8fCAoaW1yZWcgPiAxMykpKQotCSAgICBvcF9iYWQgPSBfKCJGb3IgcXVhZCBhY2Nlc3MsIHRoZSByZWdpc3RlciBtdXN0IGJlIGV2ZW4gYW5kIDwgMTQuIik7Ci0JICBlbHNlIGlmIChjYWxsX3dpZHRoKQotCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgY2FzdCBhIGRpcmVjdCByZWdpc3Rlci4iKTsKLQotCSAgaWYgKCpvcF9iYWQgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIE5vIGVycm9ycywgY2hlY2sgZm9yIHdhcm5pbmdzICovCi0JICAgICAgaWYgKHdpZHRoID09ICdxJyAmJiBpbXJlZyA9PSAxMikKLQkJYXNfd2FybiAoXygiVXNpbmcgcmVnIDE0IGZvciBxdWFkd29yZHMgY2FuIHRyb21wIHRoZSBGUCByZWdpc3Rlci4iKSk7Ci0KLQkgICAgICByZWcgPSBpbXJlZzsKLQkgICAgfQotCi0JICAvKiBXZSBrbm93OiBpbW0gPSAtMSAqLwotCX0KLSAgICAgIGVsc2UgaWYgKGRlY19pbmMgPT0gJy0nKQotCXsKLQkgIC8qIC0oU1ApICovCi0JICBtb2RlID0gVEFIT0VfQVVUT19ERUM7Ci0JICBpZiAoZGVmZXJyZWQgfHwgaW1tZWRpYXRlIHx8ICFyZWFsbHlfbm9uZSkKLQkgICAgb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIGF1dG8tZGVjIG1vZGUuIik7Ci0JICBlbHNlIGlmIChuZHggIT0gLTEpCi0JICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGF1dG8gZGVjIG1vZGUuIik7Ci0JICBlbHNlIGlmIChhY2Nlc3MgPT0gJ3InKQotCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyBtb2RlIGNhbnQgYmUgdXNlZCBmb3IgcmVhZGluZy4iKTsKLQkgIGVsc2UgaWYgKHJlZyAhPSBTUF9SRUcpCi0JICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIpOwotCSAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKLQkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iKTsKLQkgIGVsc2UgaWYgKHdpZHRoID09ICdxJykKLQkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgd29uJ3Qgd29yayB3aXRoIHF1YWR3b3Jkcy4iKTsKLQotCSAgLyogV2Uga25vdzogaW1tID0gLTEsIGRlY19pbmMgIT0gJy0nICovCi0JfQotICAgICAgZWxzZSBpZiAoZGVjX2luYyA9PSAnKycpCi0JewotCSAgaWYgKGltbWVkaWF0ZSB8fCAhcmVhbGx5X25vbmUpCi0JICAgIG9wX2JhZCA9IF8oIlN5bnRheCBlcnJvciBpbiBvbmUgb2YgdGhlIGF1dG8taW5jIG1vZGVzLiIpOwotCSAgZWxzZSBpZiAoZGVmZXJyZWQpCi0JICAgIHsKLQkgICAgICAvKiAqKFNQKSsgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfQVVUT19JTkNfREVGRVJSRUQ7Ci0JICAgICAgaWYgKHJlZyAhPSBTUF9SRUcpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIGRlZmVycmVkIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIpOwotCSAgICAgIGVsc2UgaWYgKG5keCAhPSAtMSkKLQkJb3BfYmFkID0gXygiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggYXV0byBpbmMgZGVmZXJyZWQgbW9kZS4iKTsKLQkgICAgICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiAoU1ApKyAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9BVVRPX0lOQzsKLQkgICAgICBpZiAoYWNjZXNzID09ICdtJyB8fCBhY2Nlc3MgPT0gJ3cnKQotCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3Qgd3JpdGUgdG8gYW4gYXV0byBpbmMgcmVnaXN0ZXIuIik7Ci0JICAgICAgZWxzZSBpZiAocmVnICE9IFNQX1JFRykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIik7Ci0JICAgICAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iKTsKLQkgICAgICBlbHNlIGlmICh3aWR0aCA9PSAncScpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIHdvbid0IHdvcmsgd2l0aCBxdWFkd29yZHMuIik7Ci0JICAgICAgZWxzZSBpZiAobmR4ICE9IC0xKQotCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBpbiBhdXRvIGluYyBtb2RlLiIpOwotCSAgICB9Ci0KLQkgIC8qIFdlIGtub3c6IGltbSA9IC0xLCBkZWNfaW5jID09ICcgJyAqLwotCX0KLSAgICAgIGVsc2UgaWYgKHJlZyAhPSAtMSkKLQl7Ci0JICBpZiAoKG5keCAhPSAtMSkgJiYgKHJlZyA9PSBTUF9SRUcpKQotCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaW5kZXggdGhlIHNwIHJlZ2lzdGVyLiIpOwotCSAgaWYgKGRlZmVycmVkKQotCSAgICB7Ci0JICAgICAgLyogKjxkaXNwPihSbikgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQ7Ci0JICAgICAgaWYgKGltbWVkaWF0ZSkKLQkJb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIHJlZ2lzdGVyIGRpc3BsYWNlZCBtb2RlLiIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChyZWFsbHlfbm9uZSkKLQkgICAgewotCSAgICAgIC8qIChSbikgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfUkVHX0RFRkVSUkVEOwotCSAgICAgIC8qIGlmIHJlZyA9IFNQIHRoZW4gY2FudCBiZSBpbmRleGVkICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIDxkaXNwPihSbikgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfUkVHX0RJU1A7Ci0JICAgIH0KLQotCSAgLyogV2Uga25vdzogaW1tID0gLTEsIGRlY19pbmMgPT0gJyAnLCBSZWcgPSAtMSAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVhbGx5X25vbmUpCi0JICAgIG9wX2JhZCA9IF8oIkFuIG9mZmVzdCBpcyBuZWVkZWQgZm9yIHRoaXMgb3BlcmFuZC4iKTsKLQkgIGlmIChkZWZlcnJlZCAmJiBpbW1lZGlhdGUpCi0JICAgIHsKLQkgICAgICAvKiAqJDxBRERSPiAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9BQlNPTFVURV9BRERSOwotCSAgICAgIGRpc3Bfc2l6ZSA9IDQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGltbWVkaWF0ZSkKLQkgICAgewotCSAgICAgIC8qICQ8ZGlzcD4gKi8KLQkgICAgICBtb2RlID0gVEFIT0VfSU1NRURJQVRFOwotCSAgICAgIGlmIChuZHggIT0gLTEpCi0JCW9wX2JhZCA9IF8oIllvdSBjYW4ndCBpbmRleCBhIHJlZ2lzdGVyIGluIGltbWVkaWF0ZSBtb2RlLiIpOwotCSAgICAgIGlmIChhY2Nlc3MgPT0gJ2EnKQotCQlvcF9iYWQgPSBfKCJJbW1lZGlhdGUgYWNjZXNzIGNhbid0IGJlIHVzZWQgYXMgYW4gYWRkcmVzcy4iKTsKLQkgICAgICAvKiBwb25kZXIgdGhlIHdpc2RvbSBvZiBhIGNhc3QgYmVjYXVzZSBpdCBkb2Vzbid0IGRvIGFueSBnb29kLiAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChkZWZlcnJlZCkKLQkgICAgewotCSAgICAgIC8qICo8ZGlzcD4gKi8KLQkgICAgICBtb2RlID0gVEFIT0VfRElTUF9SRUxfREVGRVJSRUQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIDxkaXNwPiAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9ESVNQTEFDRURfUkVMQVRJVkU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIEF0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3JzIHdlIGNhbiBkbyBoYXZlIGJlIGNoZWNrZWQgZm9yLgotICAgKiBXZSBjYW4gYnVpbGQgdGhlICd0b3AnLiAqLwotCi0gIHRvcFAtPnRvcF9uZHggPSBuZHg7Ci0gIHRvcFAtPnRvcF9yZWcgPSByZWc7Ci0gIHRvcFAtPnRvcF9tb2RlID0gbW9kZTsKLSAgdG9wUC0+dG9wX2Vycm9yID0gb3BfYmFkOwotICB0b3BQLT50b3BfZGlzcHNpemUgPSBkaXNwX3NpemU7Ci19CQkJCS8qIHRpcF9vcCAqLwotDAotLyoKLSAqICAgICAgICAgICAgICAgICAgdCBpIHAgKCApCi0gKgotICogVGhpcyBjb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgdGFob2UgaW5zdHJ1Y3Rpb24uCi0gKiBUaGUgc3RyaW5nIG11c3QgYmUgYSBiYXJlIHNpbmdsZSBpbnN0cnVjdGlvbiBpbiB0YWhvZSAod2l0aCBCU0Q0IGZyb2JzKQotICogZm9ybWF0LgotICogSXQgcHJvdmlkZXMgYXQgbW9zdCBvbmUgZmF0YWwgZXJyb3IgbWVzc2FnZSAod2hpY2ggc3RvcHMgdGhlIHNjYW4pCi0gKiBzb21lIHdhcm5pbmcgbWVzc2FnZXMgYXMgaXQgZmluZHMgdGhlbS4KLSAqIFRoZSB0YWhvZSBpbnN0cnVjdGlvbiBpcyByZXR1cm5lZCBpbiBleHBsb2RlZCBmb3JtLgotICoKLSAqIFRoZSBleHBsb2RlZCBpbnN0cnVjdGlvbiBpcyByZXR1cm5lZCB0byBhIHN0cnVjdCB0aXQgb2YgeW91ciBjaG9pY2UuCi0gKiAjaW5jbHVkZSAidGFob2UtaW5zdC5oIiB0byBrbm93IHdoYXQgYSBzdHJ1Y3QgdGl0IGlzLgotICoKLSAqLwotCi1zdGF0aWMgdm9pZAotdGlwICh0aXRQLCBpbnN0cmluZykKLSAgICAgc3RydWN0IHRpdCAqdGl0UDsJCS8qIFdlIGJ1aWxkIGFuIGV4cGxvZGVkIGluc3RydWN0aW9uIGhlcmUuICovCi0gICAgIGNoYXIgKmluc3RyaW5nOwkJLyogVGV4dCBvZiBhIHZheCBpbnN0cnVjdGlvbjogd2UgbW9kaWZ5LiAqLwotewotICByZWdpc3RlciBzdHJ1Y3QgdG90X3dvdCAqdHdQID0gTlVMTDsJLyogSG93IHRvIGJpdC1lbmNvZGUgdGhpcyBvcGNvZGUuICovCi0gIHJlZ2lzdGVyIGNoYXIgKnA7CQkvKiAxL3NraXAgd2hpdGVzcGFjZS4yL3NjYW4gdm90X2hvdyAqLwotICByZWdpc3RlciBjaGFyICpxOwkJLyogICovCi0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY291bnQ7CS8qIGNvdW50cyBudW1iZXIgb2Ygb3BlcmFuZHMgc2VlbiAqLwotICByZWdpc3RlciBzdHJ1Y3QgdG9wICpvcGVyYW5kcDsvKiBzY2FuIG9wZXJhbmRzIGluIHN0cnVjdCB0aXQgKi8KLSAgcmVnaXN0ZXIgY2hhciAqYWxsb3BlcnIgPSAiIjsJLyogZXJyb3Igb3ZlciBhbGwgb3BlcmFuZHMgKi8KLSAgcmVnaXN0ZXIgY2hhciBjOwkJLyogUmVtZW1iZXIgY2hhciwgKHdlIGNsb2JiZXIgaXQKLQkJCQkgICB3aXRoICdcMCcgdGVtcG9yYXJpbHkpLiAqLwotICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoKmluc3RyaW5nID09ICcgJykKLSAgICArK2luc3RyaW5nOwkJCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotICBmb3IgKHAgPSBpbnN0cmluZzsgKnAgJiYgKnAgIT0gJyAnOyBwKyspCi0gICAgOwkJCQkvKiBNVVNUIGVuZCBpbiBlbmQtb2Ytc3RyaW5nIG9yCi0JCQkJICAgZXhhY3RseSAxIHNwYWNlLiAqLwotICAvKiBTY2FubmVkIHVwIHRvIGVuZCBvZiBvcGVyYXRpb24tY29kZS4gKi8KLSAgLyogT3BlcmF0aW9uLWNvZGUgaXMgZW5kZWQgd2l0aCB3aGl0ZXNwYWNlLiAqLwotICBpZiAocCA9PSBpbnN0cmluZykKLSAgICB7Ci0gICAgICB0aXRQLT50aXRfZXJyb3IgPSBfKCJObyBvcGVyYXRvciIpOwotICAgICAgY291bnQgPSAwOwotICAgICAgdGl0UC0+dGl0X29wY29kZSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgLyoKLSAgICAgKiBIZXJlIHdpdGggaW5zdHJpbmcgcG9pbnRpbmcgdG8gd2hhdCBiZXR0ZXIgYmUgYW4gb3AtbmFtZSwgYW5kIHAKLSAgICAgKiBwb2ludGluZyB0byBjaGFyYWN0ZXIganVzdCBwYXN0IHRoYXQuCi0gICAgICogV2UgdHJ1c3QgaW5zdHJpbmcgcG9pbnRzIHRvIGFuIG9wLW5hbWUsIHdpdGggbm8gd2hpdGVzcGFjZS4KLSAgICAgKi8KLSAgICAgIHR3UCA9IChzdHJ1Y3QgdG90X3dvdCAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIGluc3RyaW5nKTsKLSAgICAgICpwID0gYzsJCQkvKiBSZXN0b3JlIGNoYXIgYWZ0ZXIgb3AtY29kZS4gKi8KLSAgICAgIGlmICh0d1AgPT0gMCkKLQl7Ci0JICB0aXRQLT50aXRfZXJyb3IgPSBfKCJVbmtub3duIG9wZXJhdG9yIik7Ci0JICBjb3VudCA9IDA7Ci0JICB0aXRQLT50aXRfb3Bjb2RlID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoKLSAgICAgICAqIFdlIGZvdW5kIGEgbWF0Y2ghIFNvIGxldHMgcGljayB1cCBhcyBtYW55IG9wZXJhbmRzIGFzIHRoZQotICAgICAgICogaW5zdHJ1Y3Rpb24gd2FudHMsIGFuZCBldmVuIGdyaXBlIGlmIHRoZXJlIGFyZSB0b28gbWFueS4KLSAgICAgICAqIFdlIGV4cGVjdCBjb21tYSB0byBzZXBlcmF0ZSBlYWNoIG9wZXJhbmQuCi0gICAgICAgKiBXZSBsZXQgaW5zdHJpbmcgdHJhY2sgdGhlIHRleHQsIHdoaWxlIHAgdHJhY2tzIGEgcGFydCBvZiB0aGUKLSAgICAgICAqIHN0cnVjdCB0b3QuCi0gICAgICAgKi8KLQotCSAgY291bnQgPSAwOwkJLyogbm8gb3BlcmFuZHMgc2VlbiB5ZXQgKi8KLQkgIGluc3RyaW5nID0gcCArICgqcCAhPSAnXDAnKTsJLyogcG9pbnQgcGFzdCB0aGUgb3BlcmF0aW9uIGNvZGUgKi8KLQkgIC8qIHRpcF9vcCgpIHNjcmV3cyB3aXRoIHRoZSBpbnB1dF9saW5lX3BvaW50ZXIsIHNvIHNhdmUgaXQgYmVmb3JlCi0JIEkganVtcCBpbiAqLwotCSAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBmb3IgKHAgPSB0d1AtPmFyZ3MsIG9wZXJhbmRwID0gdGl0UC0+dGl0X29wZXJhbmQ7Ci0JICAgICAgICEqYWxsb3BlcnIgJiYgKnA7Ci0JICAgICAgIG9wZXJhbmRwKyssIHAgKz0gMikKLQkgICAgewotCSAgICAgIC8qCi0JICogSGVyZSB0byBwYXJzZSBvbmUgb3BlcmFuZC4gTGVhdmUgaW5zdHJpbmcgcG9pbnRpbmcganVzdAotCSAqIHBhc3QgYW55IG9uZSAnLCcgdGhhdCBtYXJrcyB0aGUgZW5kIG9mIHRoaXMgb3BlcmFuZC4KLQkgKi8KLQkgICAgICBpZiAoIXBbMV0pCi0JCWFzX2ZhdGFsIChfKCJDb21waWxlciBidWc6IE9ERCBudW1iZXIgb2YgYnl0ZXMgaW4gYXJnIHN0cnVjdHVyZSAlcy4iKSwKLQkJCSAgdHdQLT5hcmdzKTsKLQkgICAgICBlbHNlIGlmICgqaW5zdHJpbmcpCi0JCXsKLQkJICBmb3IgKHEgPSBpbnN0cmluZzsgKCpxICE9ICcsJyAmJiAqcSAhPSAnXDAnKTsgcSsrKQotCQkgICAgewotCQkgICAgICBpZiAoKnEgPT0gJ1wnJyAmJiBxWzFdICE9ICdcMCcpCS8qIEp1bXAgcXVvdGVkIGNoYXJhY3RlcnMgKi8KLQkJCXErKzsKLQkJICAgIH0KLQkJICBjID0gKnE7Ci0JCSAgLyoKLQkgICAqIFEgcG9pbnRzIHRvICcsJyBvciAnXDAnIHRoYXQgZW5kcyBhcmd1bWVudC4gQyBpcyB0aGF0Ci0JICAgKiBjaGFyYWN0ZXIuCi0JICAgKi8KLQkJICAqcSA9ICdcMCc7Ci0JCSAgb3BlcmFuZHAtPnRvcF9hY2Nlc3MgPSBwWzBdOwotCQkgIG9wZXJhbmRwLT50b3Bfd2lkdGggPSBwWzFdOwotCQkgIHRpcF9vcCAoaW5zdHJpbmcgLSAxLCBvcGVyYW5kcCk7Ci0JCSAgKnEgPSBjOwkvKiBSZXN0b3JlIGlucHV0IHRleHQuICovCi0JCSAgaWYgKCoob3BlcmFuZHAtPnRvcF9lcnJvcikpCi0JCSAgICB7Ci0JCSAgICAgIGFsbG9wZXJyID0gb3BlcmFuZHAtPnRvcF9lcnJvcjsKLQkJICAgIH0KLQkJICBpbnN0cmluZyA9IHEgKyAoYyA/IDEgOiAwKTsJLyogbmV4dCBvcGVyYW5kIChpZiBhbnkpICovCi0JCSAgY291bnQrKzsJLyogIHdvbiBhbm90aGVyIGFyZ3VtZW50LCBtYXkgaGF2ZSBhbiBvcGVyciAqLwotCQl9Ci0JICAgICAgZWxzZQotCQlhbGxvcGVyciA9IF8oIk5vdCBlbm91Z2ggb3BlcmFuZHMiKTsKLQkgICAgfQotCSAgLyogUmVzdG9yZSB0aGUgcG9pbnRlci4gKi8KLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCi0JICBpZiAoISphbGxvcGVycikKLQkgICAgewotCSAgICAgIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotCQlpbnN0cmluZysrOwkvKiBTa2lwIHdoaXRlc3BhY2UuICovCi0JICAgICAgaWYgKCppbnN0cmluZykKLQkJYWxsb3BlcnIgPSBfKCJUb28gbWFueSBvcGVyYW5kcyIpOwotCSAgICB9Ci0JICB0aXRQLT50aXRfZXJyb3IgPSBhbGxvcGVycjsKLQl9Ci0gICAgfQotCi0gIHRpdFAtPnRpdF9vcGNvZGUgPSB0d1AtPmNvZGU7CS8qIFRoZSBvcC1jb2RlLiAqLwotICB0aXRQLT50aXRfb3BlcmFuZHMgPSBjb3VudDsKLX0JCQkJLyogdGlwICovCi0MCi0vKiBtZF9hc3NlbWJsZSgpIGVtaXQgZnJhZ3MgZm9yIDEgaW5zdHJ1Y3Rpb24gKi8KLXZvaWQKLW1kX2Fzc2VtYmxlIChpbnN0cnVjdGlvbl9zdHJpbmcpCi0gICAgIGNoYXIgKmluc3RydWN0aW9uX3N0cmluZzsJLyogQSBzdHJpbmc6IGFzc2VtYmxlIDEgaW5zdHJ1Y3Rpb24uICovCi17Ci0gIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIHN0cnVjdCB0b3AgKm9wZXJhbmRQOy8qIEFuIG9wZXJhbmQuIFNjYW5zIGFsbCBvcGVyYW5kcy4gKi8KLSAgLyogIGNoYXIgY19zYXZlOwlmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIFdoYXQgdXNlZCB0byBsaXZlIGFmdGVyIGFuIGV4cHJlc3Npb24uICovCi0gIC8qICBzdHJ1Y3QgZnJhZyAqZnJhZ1A7CWZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogRnJhZ21lbnQgb2YgY29kZSB3ZSBqdXN0IG1hZGUuICovCi0gIC8qICByZWdpc3RlciBzdHJ1Y3QgdG9wICplbmRfb3BlcmFuZFA7IGZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogLT4gc2xvdCBqdXN0IGFmdGVyIGxhc3Qgb3BlcmFuZAotCQkJCQlMaW1pdCBvZiB0aGUgZm9yIChlYWNoIG9wZXJhbmQpLiAqLwotICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsJLyogLT4gZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIHRoaXMgb3BlcmFuZCAqLwotCi0gIC8qIFRoZXNlIHJlZmVyIHRvIGFuIGluc3RydWN0aW9uIG9wZXJhbmQgZXhwcmVzc2lvbi4gKi8KLSAgc2VnVCB0b19zZWc7CQkJLyogVGFyZ2V0IHNlZ21lbnQgb2YgdGhlIGFkZHJlc3MuCSAqLwotCi0gIHJlZ2lzdGVyIHZhbHVlVCB0aGlzX2FkZF9udW1iZXI7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnRoaXNfYWRkX3N5bWJvbDsJLyogK3ZlIChtaW51ZW5kKSBzeW1ib2wuICovCi0KLSAgLyogIHRhaG9lX29wY29kZVQgb3Bjb2RlX2FzX251bWJlcjsgZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBUaGUgb3Bjb2RlIGFzIGEgbnVtYmVyLiAqLwotICBjaGFyICpvcGNvZGVQOwkJLyogV2hlcmUgaXQgaXMgaW4gYSBmcmFnLiAqLwotICAvKiAgY2hhciAqb3Btb2RlUDsJZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBXaGVyZSBvcGNvZGUgdHlwZSBpcywgaW4gYSBmcmFnLiAqLwotCi0gIGludCBkaXNwc2l6ZTsJCQkvKiBGcm9tIHRvcF9kaXNwc2l6ZTogdGFob2Vfb3BlcmFuZF93aWR0aAotCQkJCSAgIChpbiBieXRlcykgKi8KLSAgaW50IGlzX3VuZGVmaW5lZDsJCS8qIDEgaWYgb3BlcmFuZCBleHByZXNzaW9uJ3MKLQkJCQkgICBzZWdtZW50IG5vdCBrbm93biB5ZXQuICovCi0gIGludCBwY19yZWw7CQkJLyogSXMgdGhpcyBvcGVyYW5kIHBjIHJlbGF0aXZlPyAqLwotCi0gIC8qIERlY29kZSB0aGUgb3BlcmFuZC4gKi8KLSAgdGlwICgmdCwgaW5zdHJ1Y3Rpb25fc3RyaW5nKTsKLQotICAvKgotICAgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBvcGVyYW5kIGRlY29kZSBwcm9wZXJseS4KLSAgICogTm90aWNlIHRoYXQgd2UgaGF2ZW4ndCBtYWRlIGFueSBmcmFncyB5ZXQuCi0gICAqIElmIGl0IGdvb2ZlZCwgdGhlbiB0aGlzIGluc3RydWN0aW9uIHdpbGwgd2VkZ2UgaW4gYW55IHBhc3MsCi0gICAqIGFuZCB3ZSBjYW4gc2FmZWx5IGZsdXNoIGl0LCB3aXRob3V0IGNhdXNpbmcgaW50ZXJwYXNzIHN5bWJvbCBwaGFzZQotICAgKiBlcnJvcnMuIFRoYXQgaXMsIHdpdGhvdXQgY2hhbmdpbmcgbGFiZWwgdmFsdWVzIGluIGRpZmZlcmVudCBwYXNzZXMuCi0gICAqLwotICBpZiAoKnQudGl0X2Vycm9yKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIklnbm9yaW5nIHN0YXRlbWVudCBkdWUgdG8gXCIlc1wiIiksIHQudGl0X2Vycm9yKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBzYXcgbm8gZXJyb3JzIGluIGFueSBvcGVyYW5kcyAtIHRyeSB0byBtYWtlIGZyYWcocykgKi8KLSAgICAgIC8qIEVtaXQgb3AtY29kZS4gKi8KLSAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIGl0IGlzLCBpbiBjYXNlIHdlIHdhbnQgdG8gbW9kaWZ5IHRoZSBvcC1jb2RlIGxhdGVyLiAqLwotICAgICAgb3Bjb2RlUCA9IGZyYWdfbW9yZSAoMSk7Ci0gICAgICAqb3Bjb2RlUCA9IHQudGl0X29wY29kZTsKLSAgICAgIC8qIE5vdyBkbyBlYWNoIG9wZXJhbmQuICovCi0gICAgICBmb3IgKG9wZXJhbmRQID0gdC50aXRfb3BlcmFuZDsKLQkgICBvcGVyYW5kUCA8IHQudGl0X29wZXJhbmQgKyB0LnRpdF9vcGVyYW5kczsKLQkgICBvcGVyYW5kUCsrKQotCXsJCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCi0JICBleHBQID0gJihvcGVyYW5kUC0+ZXhwX29mX29wZXJhbmQpOwotCSAgaWYgKG9wZXJhbmRQLT50b3BfbmR4ID49IDApCi0JICAgIHsKLQkgICAgICAvKiBJbmRleGVkIGFkZHJlc3NpbmcgYnl0ZQotCSAgIExlZ2FsaXR5IG9mIGluZGV4ZWQgbW9kZSBhbHJlYWR5IGNoZWNrZWQ6IGl0IGlzIE9LICovCi0JICAgICAgRlJBR19BUFBFTkRfMV9DSEFSICgweDQwICsgb3BlcmFuZFAtPnRvcF9uZHgpOwotCSAgICB9CQkJLyogaWYodG9wX25keD49MCkgKi8KLQotCSAgLyogSGVyZSB0byBtYWtlIG1haW4gb3BlcmFuZCBmcmFnKHMpLiAqLwotCSAgdGhpc19hZGRfbnVtYmVyID0gZXhwUC0+WF9hZGRfbnVtYmVyOwotCSAgdGhpc19hZGRfc3ltYm9sID0gZXhwUC0+WF9hZGRfc3ltYm9sOwotCSAgdG9fc2VnID0gb3BlcmFuZFAtPnNlZ19vZl9vcGVyYW5kOwotCSAga25vdyAodG9fc2VnID09IFNFR19VTktOT1dOIHx8IFwKLQkJdG9fc2VnID09IFNFR19BQlNPTFVURSB8fCBcCi0JCXRvX3NlZyA9PSBTRUdfREFUQSB8fCBcCi0JCXRvX3NlZyA9PSBTRUdfVEVYVCB8fCBcCi0JCXRvX3NlZyA9PSBTRUdfQlNTKTsKLQkgIGlzX3VuZGVmaW5lZCA9ICh0b19zZWcgPT0gU0VHX1VOS05PV04pOwotCSAgLyogRG8gd2Uga25vdyBob3cgYmlnIHRoaXMgb3BwZXJhbmQgaXM/ICovCi0JICBkaXNwc2l6ZSA9IG9wZXJhbmRQLT50b3BfZGlzcHNpemU7Ci0JICBwY19yZWwgPSAwOwotCSAgLyogRGVhbCB3aXRoIHRoZSBicmFuY2ggcG9zc2FiaWxpdGllcy4gKE5vdGUsIHRoaXMgZG9lc24ndCBpbmNsdWRlCi0JIGp1bXBzLikqLwotCSAgaWYgKG9wZXJhbmRQLT50b3BfYWNjZXNzID09ICdiJykKLQkgICAgewotCSAgICAgIC8qIEJyYW5jaGVzIG11c3QgYmUgZXhwcmVzc2lvbnMuIEEgcHN1ZWRvIGJyYW5jaCBjYW4gYWxzbyBqdW1wIHRvCi0JICAgYW4gYWJzb2x1dGUgYWRkcmVzcy4gKi8KLQkgICAgICBpZiAodG9fc2VnID09IG5vd19zZWcgfHwgaXNfdW5kZWZpbmVkKQotCQl7Ci0JCSAgLyogSWYgaXNfdW5kZWZpbmVkLCB0aGVuIGl0IG1pZ2h0IEJFQ09NRSBub3dfc2VnIGJ5IHJlbGF4IHRpbWUuICovCi0JCSAgaWYgKGRpc3BzaXplKQotCQkgICAgewotCQkgICAgICAvKiBJIGtub3cgaG93IGJpZyB0aGUgYnJhbmNoIGlzIHN1cHBvc2VkIHRvIGJlIChpdCdzIGEgbm9ybWFsCi0JICAgICAgIGJyYW5jaCksIHNvIEkgc2V0IHVwIHRoZSBmcmFnLCBhbmQgbGV0IEdBUyBkbyB0aGUgcmVzdC4gKi8KLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoZGlzcHNpemUpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIHNpemVfdG9fZnggKGRpc3BzaXplLCAxKSwKLQkJCSAgICAgICBOVUxMKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qICh0b19zZWc9PW5vd19zZWcgfHwgdG9fc2VnID09IFNFR19VTktOT1dOKSAmJiBkaXNwc2l6ZT09MCAqLwotCQkgICAgICAvKiBJZiB3ZSBkb24ndCBrbm93IGhvdyBiaWcgaXQgaXMsIHRoZW4gaXRzIGEgc3ludGhldGljIGJyYW5jaCwKLQkgICAgICAgc28gd2Ugc2V0IHVwIGEgc2ltcGxlIHJlbGF4IHN0YXRlLiAqLwotCQkgICAgICBzd2l0Y2ggKG9wZXJhbmRQLT50b3Bfd2lkdGgpCi0JCQl7Ci0JCQljYXNlIFRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVA6Ci0JCQkgIC8qIFNpbXBsZSAoY29uZGl0aW9uYWwpIGp1bXAuIEkgbWF5IGhhdmUgdG8gcmV2ZXJzZSB0aGUKLQkJIGNvbmRpdGlvbiBvZiBvcGNvZGVQLCBhbmQgdGhlbiBqdW1wIHRvIG15IGRlc3RpbmF0aW9uLgotCQkgSSBzZXQgMSBieXRlIGFzaWRlIGZvciB0aGUgYnJhbmNoIG9mZiBzZXQsIGFuZCBjb3VsZCBuZWVkIDYKLQkJIG1vcmUgYnl0ZXMgZm9yIHRoZSBwY19yZWwganVtcCAqLwotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDcsIDEsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURSksCi0JCQkJIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLCBvcGNvZGVQKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIFRBSE9FX1dJRFRIX0FMV0FZU19KVU1QOgotCQkJICAvKiBTaW1wbGUgKHVuY29uZGl0aW9uYWwpIGp1bXAuIEkgbWF5IGhhdmUgdG8gY29udmVydCB0aGlzIHRvCi0JCSBhIHdvcmQgYnJhbmNoLCBvciBhbiBhYnNvbHV0ZSBqdW1wLiAqLwotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDUsIDEsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEUpLAotCQkJCSB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgb3Bjb2RlUCk7Ci0JCQkgIGJyZWFrOwotCQkJICAvKiBUaGUgc21hbGxlc3Qgc2l6ZSBmb3IgdGhlIG5leHQgMiBjYXNlcyBpcyB3b3JkLiAqLwotCQkJY2FzZSBUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVA6Ci0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMiwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX1dPUkQpLAotCQkJCSAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCQkgICAgb3Bjb2RlUCk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSBUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QOgotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEwLCAyLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX1dPUkQpLAotCQkJCSAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCQkgICAgb3Bjb2RlUCk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgYXNfZmF0YWwgKF8oIkNvbXBsaWxlciBidWc6IEdvdCBhIGNhc2UgKCVkKSBJIHdhc24ndCBleHBlY3RpbmcuIiksCi0JCQkJICAgIG9wZXJhbmRQLT50b3Bfd2lkdGgpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogdG9fc2VnICE9IG5vd19zZWcgJiYgdG9fc2VnICE9IHNlZ191bmtub3duIChzdGlsbCBpbiBicmFuY2gpCi0JICAgICBJbiBvdGhlciB3b3JkcywgSSdtIGp1bXBpbmcgb3V0IG9mIG15IHNlZ21lbnQgc28gZXh0ZW5kIHRoZQotCSAgICAgYnJhbmNoZXMgdG8ganVtcHMsIGFuZCBsZXQgR0FTIGZpeCB0aGVtLiAqLwotCi0JCSAgLyogVGhlc2UgYXJlICJicmFuY2hlcyIgd2hhdCB3aWxsIGFsd2F5cyBiZSBicmFuY2hlcyBhcm91bmQgYSBqdW1wCi0JICAgICB0byB0aGUgY29ycmVjdCBhZGRyZXNzcyBpbiByZWFsIGxpZmUuCi0JICAgICBJZiB0b19zZWcgaXMgU0VHX0FCU09MVVRFLCBqdXN0IGVuY29kZSB0aGUgYnJhbmNoIGluLAotCSAgICAgZWxzZSBsZXQgR0FTIGZpeCB0aGUgYWRkcmVzcy4gKi8KLQotCQkgIHN3aXRjaCAob3BlcmFuZFAtPnRvcF93aWR0aCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIHRoZW9yeToKLQkgICAgICAgRm9yIFNFR19BQlNPTFVURSwgdGhlbiBtb2RlIGlzIEFCU09MVVRFX0FERFIsIGp1bXAKLQkgICAgICAgdG8gdGhhdCBhZGRyZXNzcyAobm90IHBjX3JlbCkuCi0JICAgICAgIEZvciBvdGhlciBzZWdzLCBhZGRyZXNzIGlzIGEgbG9uZyB3b3JkIFBDIHJlbCBqdW1wLiAqLwotCQkgICAgY2FzZSBUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QOgotCQkgICAgICAvKiBiPGNvbmQ+ICovCi0JCSAgICAgIC8qIFRvIHJldmVyc2UgdGhlIGNvbmRpdGlvbiBpbiBhIFRBSE9FIGJyYW5jaCwKLQkgICAgICAgY29tcGxlbWVudCBiaXQgNCAqLwotCQkgICAgICAqb3Bjb2RlUCBePSAweDEwOwotCQkgICAgICBwID0gZnJhZ19tb3JlICg3KTsKLQkJICAgICAgKnArKyA9IDY7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9KTVA7Ci0JCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09Ci0JCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6Ci0JCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOwotCQkgICAgICAvKgotCSAgICAgKiBOb3cgKGVnKQlCTEVRCTFmCi0JICAgICAqCQlKTVAJZm9vCi0JICAgICAqCTE6Ci0JICAgICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVA6Ci0JCSAgICAgIC8qIGJyLCBqdXN0IHR1cm4gaXQgaW50byBhIGp1bXAgKi8KLQkJICAgICAgKm9wY29kZVAgPSBUQUhPRV9KTVA7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkgICAgICAqcCsrID0gKG9wZXJhbmRQLT50b3BfbW9kZSA9PQotCQkJICAgICAgVEFIT0VfQUJTT0xVVEVfQUREUiA/IFRBSE9FX0FCU09MVVRFX0FERFIgOgotCQkJICAgICAgVEFIT0VfUENfUkVMX0xPTkcpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkgICAgICAgKHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpID8gRlhfUENSRUwzMiA6IEZYXzMyLCBOVUxMKTsKLQkJICAgICAgLyogTm93IChlZykgSk1QIGZvbyAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVEFIT0VfV0lEVEhfQklHX1JFVl9KVU1QOgotCQkgICAgICBwID0gZnJhZ19tb3JlICg4KTsKLQkJICAgICAgKm9wY29kZVAgXj0gMHgxMDsKLQkJICAgICAgKnArKyA9IDA7Ci0JCSAgICAgICpwKysgPSA2OwotCQkgICAgICAqcCsrID0gVEFIT0VfSk1QOwotCQkgICAgICAqcCsrID0gKG9wZXJhbmRQLT50b3BfbW9kZSA9PQotCQkJICAgICAgVEFIT0VfQUJTT0xVVEVfQUREUiA/IFRBSE9FX0FCU09MVVRFX0FERFIgOgotCQkJICAgICAgVEFIT0VfUENfUkVMX0xPTkcpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkgICAgICAgKHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpID8gRlhfUENSRUwzMiA6IEZYXzMyLCBOVUxMKTsKLQkJICAgICAgLyoKLQkgICAgICogTm93IChlZykJQUNCeAkxZgotCSAgICAgKgkJSk1QICAgICBmb28KLQkgICAgICoJMToKLQkgICAgICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QOgotCQkgICAgICBwID0gZnJhZ19tb3JlICgxMCk7Ci0JCSAgICAgICpwKysgPSAwOwotCQkgICAgICAqcCsrID0gMjsKLQkJICAgICAgKnArKyA9IFRBSE9FX0JSQjsKLQkJICAgICAgKnArKyA9IDY7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9KTVA7Ci0JCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09Ci0JCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6Ci0JCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOwotCQkgICAgICAvKgotCSAgICAgKiBOb3cgKGVnKQl4T0J4eHgJMWYKLQkgICAgICoJCUJSQgkyZgotCSAgICAgKgkxOglKTVAJQCNmb28KLQkgICAgICoJMjoKLQkgICAgICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYic6Ci0JCSAgICBjYXNlICd3JzoKLQkJICAgICAgYXNfd2FybiAoXygiUmVhbCBicmFuY2ggZGlzcGxhY2VtZW50cyBtdXN0IGJlIGV4cHJlc3Npb25zLiIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBhc19mYXRhbCAoXygiQ29tcGxpZXIgZXJyb3I6IEkgZ290IGFuIHVua25vd24gc3ludGhldGljIGJyYW5jaCA6JWMiKSwKLQkJCQlvcGVyYW5kUC0+dG9wX3dpZHRoKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSXQgYWluJ3QgYSBicmFuY2ggb3BlcmFuZC4gKi8KLQkgICAgICBzd2l0Y2ggKG9wZXJhbmRQLT50b3BfbW9kZSkKLQkJewotCQkgIC8qIEF1dG8tZm9vIGFjY2Vzcywgb25seSB3b3JrcyBmb3Igb25lIHJlZyAoU1ApCi0JICAgICBzbyB0aGUgb25seSB0aGluZyBuZWVkZWQgaXMgdGhlIG1vZGUuICovCi0JCWNhc2UgVEFIT0VfQVVUT19ERUM6Ci0JCWNhc2UgVEFIT0VfQVVUT19JTkM6Ci0JCWNhc2UgVEFIT0VfQVVUT19JTkNfREVGRVJSRUQ6Ci0JCSAgRlJBR19BUFBFTkRfMV9DSEFSIChvcGVyYW5kUC0+dG9wX21vZGUpOwotCQkgIGJyZWFrOwotCi0JCSAgLyogTnVtYmVyZWQgUmVnaXN0ZXIgb25seSBhY2Nlc3MuIE9ubHkgdGhpbmcgbmVlZGVkIGlzIHRoZQotCSAgICAgbW9kZSArIFJlZ2lzdGVyIG51bWJlciAqLwotCQljYXNlIFRBSE9FX0RJUkVDVF9SRUc6Ci0JCWNhc2UgVEFIT0VfUkVHX0RFRkVSUkVEOgotCQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAob3BlcmFuZFAtPnRvcF9tb2RlICsgb3BlcmFuZFAtPnRvcF9yZWcpOwotCQkgIGJyZWFrOwotCi0JCSAgLyogQW4gYWJzb2x1dGUgYWRkcmVzcy4gSXQncyBzaXplIGlzIGFsd2F5cyA1IGJ5dGVzLgotCSAgICAgKG1vZGVfdHlwZSArIDQgYnl0ZSBhZGRyZXNzKS4gKi8KLQkJY2FzZSBUQUhPRV9BQlNPTFVURV9BRERSOgotCQkgIGtub3cgKCh0aGlzX2FkZF9zeW1ib2wgPT0gTlVMTCkpOwotCQkgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkgICpwID0gVEFIT0VfQUJTT0xVVEVfQUREUjsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAxLCB0aGlzX2FkZF9udW1iZXIsIDQpOwotCQkgIGJyZWFrOwotCi0JCSAgLyogSW1tZWRpYXRlIGRhdGEuIElmIHRoZSBzaXplIGlzbid0IGtub3duLCB0aGVuIGl0J3MgYW4gYWRkcmVzcwotCSAgICAgKyBhbmQgb2Zmc2V0LCB3aGljaCBpcyA0IGJ5dGVzIGJpZy4gKi8KLQkJY2FzZSBUQUhPRV9JTU1FRElBVEU6Ci0JCSAgaWYgKHRoaXNfYWRkX3N5bWJvbCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBwID0gZnJhZ19tb3JlICg1KTsKLQkJICAgICAgKnArKyA9IFRBSE9FX0lNTUVESUFURV9MT05HV09SRDsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCSAgICAgICBGWF8zMiwgTlVMTCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBJdCdzIGEgaW50ZWdlciwgYW5kIEkga25vdyBpdCdzIHNpemUuICovCi0JCSAgICAgIGlmICgodW5zaWduZWQpIHRoaXNfYWRkX251bWJlciA8IDB4NDApCi0JCQl7Ci0JCQkgIC8qIFdpbGwgaXQgZml0IGluIGEgbGl0ZXJhbD8gKi8KLQkJCSAgRlJBR19BUFBFTkRfMV9DSEFSICgoYnl0ZSkgdGhpc19hZGRfbnVtYmVyKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBwID0gZnJhZ19tb3JlIChkaXNwc2l6ZSArIDEpOwotCQkJICBzd2l0Y2ggKGRpc3BzaXplKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIDE6Ci0JCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX0JZVEU7Ci0JCQkgICAgICAqcCA9IChieXRlKSB0aGlzX2FkZF9udW1iZXI7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIDI6Ci0JCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX1dPUkQ7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHRoaXNfYWRkX251bWJlciwgMik7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIDQ6Ci0JCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX0xPTkdXT1JEOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB0aGlzX2FkZF9udW1iZXIsIDQpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCSAgLyogRGlzdGFuY2UgZnJvbSB0aGUgUEMuIElmIHRoZSBzaXplIGlzbid0IGtub3duLCB3ZSBoYXZlIHRvIHJlbGF4Ci0JICAgICBpbnRvIGl0LiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGRpc3Aoc3ApIGlzIHRoYXQKLQkgICAgIHRoaXMgb2Zmc2V0IGlzIHBjX3JlbCwgYW5kIGRpc3Aoc3ApIGlzbid0LgotCSAgICAgTm90ZSB0aGUgZHJvcCB0aHJvdWdoIGNvZGUuICovCi0KLQkJY2FzZSBUQUhPRV9ESVNQTEFDRURfUkVMQVRJVkU6Ci0JCWNhc2UgVEFIT0VfRElTUF9SRUxfREVGRVJSRUQ6Ci0JCSAgb3BlcmFuZFAtPnRvcF9yZWcgPSBQQ19SRUc7Ci0JCSAgcGNfcmVsID0gMTsKLQotCQkgIC8qIFJlZ2lzdGVyLCBwbHVzIGEgZGlzcGxhY2VtZW50IG1vZGUuIFNhdmUgdGhlIHJlZ2lzdGVyIG51bWJlciwKLQkgICAgIGFuZCB3ZWF0aGVyIGl0cyBkZWZmZXJlZCBvciBub3QsIGFuZCByZWxheCB0aGUgc2l6ZSBpZiBpdCBpc24ndAotCSAgICAga25vd24uICovCi0JCWNhc2UgVEFIT0VfUkVHX0RJU1A6Ci0JCWNhc2UgVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQ6Ci0JCSAgaWYgKG9wZXJhbmRQLT50b3BfbW9kZSA9PSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRCB8fAotCQkgICAgICBvcGVyYW5kUC0+dG9wX21vZGUgPT0gVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQpCi0JCSAgICBvcGVyYW5kUC0+dG9wX3JlZyArPSAweDEwOwkvKiBkZWZmZXJlZCBtb2RlIGlzIGFsd2F5cyAweDEwIGhpZ2hlcgotCQkJCQkgIHRoYW4gaXQncyBub24tZGVmZmVyZWQgc2libGluZy4gKi8KLQotCQkgIC8qIElzIHRoaXMgYSB2YWx1ZSBvdXQgb2YgdGhpcyBzZWdtZW50PwotCSAgICAgVGhlIGZpcnN0IHBhcnQgb2YgdGhpcyBjb25kaXRpb25hbCBpcyBhIGNsdWRnZSB0byBtYWtlIGdhcwotCSAgICAgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQgYXMgJ2FzJyB3aGVuIHRoZXJlIGlzIGEgbGFibGUsIGluCi0JICAgICB0aGUgY3VycmVudCBzZWdtZW50LCBkaXNwbGFjZWluZyBhIHJlZ2lzdGVyLiBJdCdzIHN0cmFuZ2UsCi0JICAgICBhbmQgbm8gb25lIGluIHRoZWlyIHJpZ2h0IG1pbmQgd291bGQgZG8gaXQsIGJ1dCBpdCdzIGVhc3kKLQkgICAgIHRvIGNsdWRnZS4gKi8KLQkJICBpZiAoKGRpc3BzaXplID09IDAgJiYgIXBjX3JlbCkgfHwKLQkJICAgICAgKHRvX3NlZyAhPSBub3dfc2VnICYmICFpc191bmRlZmluZWQgJiYgdG9fc2VnICE9IFNFR19BQlNPTFVURSkpCi0JCSAgICBkaXNwc2l6ZSA9IDQ7Ci0KLQkJICBpZiAoZGlzcHNpemUgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyoKLQkgICAgICogV2UgaGF2ZSBhIFNFR19VTktOT1dOIHN5bWJvbCwgb3IgdGhlIHNpemUgaXNuJ3QgY2FzdC4KLQkgICAgICogSXQgbWlnaHQgdHVybiBvdXQgdG8gYmUgaW4gdGhlIHNhbWUgc2VnbWVudCBhcwotCSAgICAgKiB0aGUgaW5zdHJ1Y3Rpb24sIHBlcm1pdHRpbmcgcmVsYXhhdGlvbi4KLQkgICAgICovCi0JCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDUsIDIsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9CWVRFKSwKLQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIDApOwotCQkgICAgICAqcCA9IG9wZXJhbmRQLT50b3BfcmVnOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogRWl0aGVyIHRoaXMgaXMgYW4gYWJzLCBvciBhIGNhc3QuICovCi0JCSAgICAgIHAgPSBmcmFnX21vcmUgKGRpc3BzaXplICsgMSk7Ci0JCSAgICAgIHN3aXRjaCAoZGlzcHNpemUpCi0JCQl7Ci0JCQljYXNlIDE6Ci0JCQkgICpwID0gVEFIT0VfUENfT1JfQllURSArIG9wZXJhbmRQLT50b3BfcmVnOwotCQkJICBicmVhazsKLQkJCWNhc2UgMjoKLQkJCSAgKnAgPSBUQUhPRV9QQ19PUl9XT1JEICsgb3BlcmFuZFAtPnRvcF9yZWc7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSA0OgotCQkJICAqcCA9IFRBSE9FX1BDX09SX0xPTkcgKyBvcGVyYW5kUC0+dG9wX3JlZzsKLQkJCSAgYnJlYWs7Ci0JCQl9OwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCSAgICAgICBzaXplX3RvX2Z4IChkaXNwc2l6ZSwgcGNfcmVsKSwgTlVMTCk7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYXNfZmF0YWwgKF8oIkJhcmYsIGJhZCBtb2RlICV4XG4iKSwgb3BlcmFuZFAtPnRvcF9tb2RlKTsKLQkJfQotCSAgICB9Ci0JfQkJCS8qIGZvcihvcGVyYW5kUCkgKi8KLSAgICB9CQkJCS8qIGlmKCFuZWVkX3Bhc3NfMiAmJiAhZ29vZmVkKSAqLwotfQkJCQkvKiB0YWhvZV9hc3NlbWJsZSgpICovCi0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQkJCQkvKiBtZF91bmRlZmluZWRfc3ltYm9sKCkgKi8KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gKChzaXplICsgNykgJiB+Nyk7CS8qIFJvdW5kIGFsbCBzZWN0cyB0byBtdWx0aXBsZSBvZiA4ICovCi19CQkJCS8qIG1kX3NlY3Rpb25fYWxpZ24oKSAqLwotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgc3BhcmMsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cwotICAgaXRzIHNpemUuICBUaGlzIGdldHMgdXMgdG8gdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4KLSAgICg/Pz8gSXMgdGhpcyByaWdodD8gIEZJWE1FLVNPT04pICovCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuICgoKGZpeFAtPmZ4X3R5cGUgPT0gRlhfOAotCSAgICB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMOCkKLQkgICA/IDEKLQkgICA6ICgoZml4UC0+ZnhfdHlwZSA9PSBGWF8xNgotCSAgICAgICB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMMTYpCi0JICAgICAgPyAyCi0JICAgICAgOiAoKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMzIKLQkJICB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMMzIpCi0JCSA/IDQKLQkJIDogMCkpKSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyk7Ci19CQkJCS8qIG1kX3BjcmVsX2Zyb20oKSAqLwotCi1pbnQgCi10Y19pc19wY3JlbCAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCAqLwotICBrbm93ICgwKTsKLSAgcmV0dXJuICgwKTsKLX0JCQkJLyogdGNfaXNfcGNyZWwoKSAqLwotCi0vKiBlbmQgb2YgdGMtdGFob2UuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5oIGIvZ2FzL2NvbmZpZy90Yy10YWhvZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZThhNWJlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGFob2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy10YWhvZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfVEFIT0UgMQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBOT19MSVNUSU5HCi0KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogZG9uJ3QgbmVlZCBpdC4gKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBkb24ndCBuZWVkIGl0LiAqLwotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKGEpCXs7fQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLXRhaG9lLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGljMzAuYyBiL2dhcy9jb25maWcvdGMtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1YzA2YS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRpYzMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODg4ICswLDAgQEAKLS8qIHRjLWMzMC5jIC0tIEFzc2VtYmx5IGNvZGUgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwIG1hY2hpbmUgc3BlY2lmaWMgZ2FzLgotICAgV3JpdHRlbiBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KS4KLSAgIEJ1Z3MgJiBzdWdnZXN0aW9ucyBhcmUgY29tcGxldGVseSB3ZWxjb21lLiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLgotICAgUGxlYXNlIGhlbHAgdXMgbWFrZSBpdCBiZXR0ZXIuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzMwLmgiCi0KLS8qIHB1dCBoZXJlIGFsbCBub24tZGlnaXQgbm9uLWxldHRlciBjaGFyY3RlcnMgdGhhdCBtYXkgb2NjdXIgaW4gYW4gb3BlcmFuZCAqLwotc3RhdGljIGNoYXIgb3BlcmFuZF9zcGVjaWFsX2NoYXJzW10gPSAiJSQtKygsKSouX34vPD4mXiE6W0BdIjsKLXN0YXRpYyBjaGFyICpvcmRpbmFsX25hbWVzW10gPQoteyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiLCAiZm91cnRoIiwgImZpZnRoIn07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gMDsKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIioiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRmREeFgiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIHRhYmxlcyBmb3IgbGV4aWNhbCBhbmFseXNpcyAqLwotc3RhdGljIGNoYXIgb3Bjb2RlX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciByZWdpc3Rlcl9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgb3BlcmFuZF9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgc3BhY2VfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIGlkZW50aWZpZXJfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIGRpZ2l0X2NoYXJzWzI1Nl07Ci0KLS8qIGxleGljYWwgbWFjcm9zICovCi0jZGVmaW5lIGlzX29wY29kZV9jaGFyKHgpIChvcGNvZGVfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19vcGVyYW5kX2NoYXIoeCkgKG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19yZWdpc3Rlcl9jaGFyKHgpIChyZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX3NwYWNlX2NoYXIoeCkgKHNwYWNlX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfaWRlbnRpZmllcl9jaGFyKHgpIChpZGVudGlmaWVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfZGlnaXRfY2hhcih4KSAoZGlnaXRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7MCwgMCwgMH0KLX07Ci0KLSN1bmRlZiBVU0VfU1RET1VUCi0jZGVmaW5lIFVTRV9TVERPVVQgMQotCi0jaWZkZWYgVVNFX1NUREFSRwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLWludAotZGVidWcgKGNvbnN0IGNoYXIgKnN0cmluZywuLi4pCi17Ci0gIGlmIChmbGFnX2RlYnVnKQotICAgIHsKLSAgICAgIHZhX2xpc3QgYXJncHRyOwotICAgICAgY2hhciBzdHJbMTAwXTsKLQotICAgICAgdmFfc3RhcnQgKGFyZ3B0ciwgc3RyaW5nKTsKLSAgICAgIHZzcHJpbnRmIChzdHIsIHN0cmluZywgYXJncHRyKTsKLSAgICAgIGlmIChzdHJbMF0gPT0gJ1wwJykKLQlyZXR1cm4gKDApOwotICAgICAgdmFfZW5kIChhcmdwdHIpOwotICAgICAgZnB1dHMgKHN0ciwgVVNFX1NURE9VVCA/IHN0ZG91dCA6IHN0ZGVycik7Ci0gICAgICByZXR1cm4gc3RybGVuIChzdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotI2Vsc2UKLWludAotZGVidWcgKHN0cmluZywgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgdmFfZGNsCi17Ci0gIGlmIChmbGFnX2RlYnVnKQotICAgIHsKLSAgICAgIHZhX2xpc3QgYXJncHRyOwotICAgICAgY2hhciBzdHJbMTAwXTsKLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIHZhX3N0YXJ0IChhcmdwdHIsIHN0cmluZyk7Ci0gICAgICBjbnQgPSB2c3ByaW50ZiAoc3RyLCBzdHJpbmcsIGFyZ3B0cik7Ci0gICAgICBpZiAoc3RyWzBdID09IE5VTEwpCi0JcmV0dXJuICgwKTsKLSAgICAgIHZhX2VuZCAoYXJncHRyKTsKLSAgICAgIGZwdXRzIChzdHIsIFVTRV9TVERPVVQgPyBzdGRvdXQgOiBzdGRlcnIpOwotICAgICAgcmV0dXJuIChjbnQpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIGhhc2ggdGFibGUgZm9yIG9wY29kZSBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotLyogaGFzaCB0YWJsZSBmb3IgcGFyYWxsZWwgb3Bjb2RlIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnBhcm9wX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciByZWdpc3RlciBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsKLS8qIGhhc2ggdGFibGUgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqaW5kX2hhc2g7Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKmhhc2hfZXJyOwotICBkZWJ1ZyAoIkluIG1kX2JlZ2luKClcbiIpOwotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICBjb25zdCB0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9IHRpYzMwX29wdGFiOwotICAgIGZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgY3VycmVudF9vcHRhYi0+bmFtZSwgKGNoYXIgKikgY3VycmVudF9vcHRhYik7Ci0JaWYgKGhhc2hfZXJyKQotCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X29wdGFiLT5uYW1lLCBoYXNoX2Vycik7Ci0gICAgICB9Ci0gIH0KLSAgcGFyb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgY29uc3QgcGFydGVtcGxhdGUgKmN1cnJlbnRfcGFyb3AgPSB0aWMzMF9wYXJvcHRhYjsKLSAgICBmb3IgKDsgY3VycmVudF9wYXJvcCA8IHRpYzMwX3Bhcm9wdGFiX2VuZDsgY3VycmVudF9wYXJvcCsrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKHBhcm9wX2hhc2gsIGN1cnJlbnRfcGFyb3AtPm5hbWUsIChjaGFyICopIGN1cnJlbnRfcGFyb3ApOwotCWlmIChoYXNoX2VycikKLQkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9wYXJvcC0+bmFtZSwgaGFzaF9lcnIpOwotICAgICAgfQotICB9Ci0gIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICBjb25zdCByZWcgKmN1cnJlbnRfcmVnID0gdGljMzBfcmVndGFiOwotICAgIGZvciAoOyBjdXJyZW50X3JlZyA8IHRpYzMwX3JlZ3RhYl9lbmQ7IGN1cnJlbnRfcmVnKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIGN1cnJlbnRfcmVnLT5uYW1lLCAoY2hhciAqKSBjdXJyZW50X3JlZyk7Ci0JaWYgKGhhc2hfZXJyKQotCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X3JlZy0+bmFtZSwgaGFzaF9lcnIpOwotICAgICAgfQotICB9Ci0gIGluZF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICBjb25zdCBpbmRfYWRkcl90eXBlICpjdXJyZW50X2luZCA9IHRpYzMwX2luZGFkZHJfdGFiOwotICAgIGZvciAoOyBjdXJyZW50X2luZCA8IHRpYzMwX2luZGFkZHJ0YWJfZW5kOyBjdXJyZW50X2luZCsrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKGluZF9oYXNoLCBjdXJyZW50X2luZC0+c3ludGF4LCAoY2hhciAqKSBjdXJyZW50X2luZCk7Ci0JaWYgKGhhc2hfZXJyKQotCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X2luZC0+c3ludGF4LCBoYXNoX2Vycik7Ci0gICAgICB9Ci0gIH0KLSAgLyogZmlsbCBpbiBsZXhpY2FsIHRhYmxlczogIG9wY29kZV9jaGFycywgb3BlcmFuZF9jaGFycywgc3BhY2VfY2hhcnMgKi8KLSAgewotICAgIHJlZ2lzdGVyIGludCBjOwotICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0KLSAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCi0gICAgICB7Ci0JaWYgKGlzbG93ZXIgKGMpIHx8IGlzZGlnaXQgKGMpKQotCSAgewotCSAgICBvcGNvZGVfY2hhcnNbY10gPSBjOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0JZWxzZSBpZiAoaXN1cHBlciAoYykpCi0JICB7Ci0JICAgIG9wY29kZV9jaGFyc1tjXSA9IHRvbG93ZXIgKGMpOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IG9wY29kZV9jaGFyc1tjXTsKLQkgIH0KLQllbHNlIGlmIChjID09ICcpJyB8fCBjID09ICcoJykKLQkgIHsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOwotCSAgfQotCWlmIChpc3VwcGVyIChjKSB8fCBpc2xvd2VyIChjKSB8fCBpc2RpZ2l0IChjKSkKLQkgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCWlmIChpc2RpZ2l0IChjKSB8fCBjID09ICctJykKLQkgIGRpZ2l0X2NoYXJzW2NdID0gYzsKLQlpZiAoaXNhbHBoYSAoYykgfHwgYyA9PSAnXycgfHwgYyA9PSAnLicgfHwgaXNkaWdpdCAoYykpCi0JICBpZGVudGlmaWVyX2NoYXJzW2NdID0gYzsKLQlpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCSAgc3BhY2VfY2hhcnNbY10gPSBjOwotCWlmIChjID09ICdfJykKLQkgIG9wY29kZV9jaGFyc1tjXSA9IGM7Ci0gICAgICB9Ci0gICAgZm9yIChwID0gb3BlcmFuZF9zcGVjaWFsX2NoYXJzOyAqcCAhPSAnXDAnOyBwKyspCi0gICAgICBvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqcF0gPSAqcDsKLSAgfQotfQotCi0vKiBBZGRyZXNzIE1vZGUgT1IgdmFsdWVzICovCi0jZGVmaW5lIEFNX1JlZ2lzdGVyICAweDAwMDAwMDAwCi0jZGVmaW5lIEFNX0RpcmVjdCAgICAweDAwMjAwMDAwCi0jZGVmaW5lIEFNX0luZGlyZWN0ICAweDAwNDAwMDAwCi0jZGVmaW5lIEFNX0ltbWVkaWF0ZSAweDAwNjAwMDAwCi0jZGVmaW5lIEFNX05vdFJlcSAgICAweEZGRkZGRkZGCi0KLS8qIFBDIFJlbGF0aXZlIE9SIHZhbHVlcyAqLwotI2RlZmluZSBQQ19SZWdpc3RlciAweDAwMDAwMDAwCi0jZGVmaW5lIFBDX1JlbGF0aXZlIDB4MDIwMDAwMDAKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgb3BfdHlwZTsKLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IHJlc29sdmVkOwotICAgICAgdW5zaWduZWQgYWRkcmVzczsKLSAgICAgIGNoYXIgKmxhYmVsOwotICAgICAgZXhwcmVzc2lvblMgZGlyZWN0X2V4cHI7Ci0gICAgfQotICBkaXJlY3Q7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIG1vZDsKLSAgICAgIGludCBBUm51bTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZGlzcDsKLSAgICB9Ci0gIGluZGlyZWN0OwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBvcGNvZGU7Ci0gICAgfQotICByZWc7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCByZXNvbHZlZDsKLSAgICAgIGludCBkZWNpbWFsX2ZvdW5kOwotICAgICAgZmxvYXQgZl9udW1iZXI7Ci0gICAgICBpbnQgc19udW1iZXI7Ci0gICAgICB1bnNpZ25lZCBpbnQgdV9udW1iZXI7Ci0gICAgICBjaGFyICpsYWJlbDsKLSAgICAgIGV4cHJlc3Npb25TIGltbV9leHByOwotICAgIH0KLSAgaW1tZWRpYXRlOwotfQotb3BlcmFuZDsKLQotaW50IHRpYzMwX3BhcmFsbGVsX2luc24gUEFSQU1TICgoY2hhciAqKSk7Ci1vcGVyYW5kICp0aWMzMF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKikpOwotY2hhciAqdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7Ci0KLXRlbXBsYXRlICpvcGNvZGU7Ci0KLXN0cnVjdCB0aWMzMF9pbnNuCi0gIHsKLSAgICB0ZW1wbGF0ZSAqdG07CQkvKiBUZW1wbGF0ZSBvZiBjdXJyZW50IGluc3RydWN0aW9uICovCi0gICAgdW5zaWduZWQgb3Bjb2RlOwkJLyogRmluYWwgb3Bjb2RlICovCi0gICAgaW50IG9wZXJhbmRzOwkJLyogTnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzICovCi0gICAgLyogVHlwZSBvZiBvcGVyYW5kIGdpdmVuIGluIGluc3RydWN0aW9uICovCi0gICAgb3BlcmFuZCAqb3BlcmFuZF90eXBlW01BWF9PUEVSQU5EU107Ci0gICAgdW5zaWduZWQgYWRkcmVzc2luZ19tb2RlOwkvKiBGaW5hbCBhZGRyZXNzaW5nIG1vZGUgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgfTsKLQotc3RydWN0IHRpYzMwX2luc24gaW5zbjsKLXN0YXRpYyBpbnQgZm91bmRfcGFyYWxsZWxfaW5zbjsKLQotdm9pZAotbWRfYXNzZW1ibGUgKGxpbmUpCi0gICAgIGNoYXIgKmxpbmU7Ci17Ci0gIHRlbXBsYXRlICpvcGNvZGU7Ci0gIGNoYXIgKmN1cnJlbnRfcG9zbjsKLSAgY2hhciAqdG9rZW5fc3RhcnQ7Ci0gIGNoYXIgc2F2ZV9jaGFyOwotICBpbnQgY291bnQ7Ci0KLSAgZGVidWcgKCJJbiBtZF9hc3NlbWJsZSgpIHdpdGggYXJndW1lbnQgJXNcbiIsIGxpbmUpOwotICBtZW1zZXQgKCZpbnNuLCAnXDAnLCBzaXplb2YgKGluc24pKTsKLSAgaWYgKGZvdW5kX3BhcmFsbGVsX2luc24pCi0gICAgewotICAgICAgZGVidWcgKCJMaW5lIGlzIHNlY29uZCBwYXJ0IG9mIHBhcmFsbGVsIGluc3RydWN0aW9uXG5cbiIpOwotICAgICAgZm91bmRfcGFyYWxsZWxfaW5zbiA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoKGN1cnJlbnRfcG9zbiA9IHRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbiAobGluZSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSkpID09IE5VTEwpCi0gICAgY3VycmVudF9wb3NuID0gbGluZTsKLSAgZWxzZQotICAgIGZvdW5kX3BhcmFsbGVsX2luc24gPSAxOwotICB3aGlsZSAoaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0gICAgY3VycmVudF9wb3NuKys7Ci0gIHRva2VuX3N0YXJ0ID0gY3VycmVudF9wb3NuOwotICBpZiAoIWlzX29wY29kZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGNvZGUiLCBvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyogQ2hlY2sgaWYgaW5zdHJ1Y3Rpb24gaXMgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbiBieSBzZWVpbmcgaWYgdGhlIGZpcnN0Ci0gICAgIGNoYXJhY3RlciBpcyBhIHEuICovCi0gIGlmICgqdG9rZW5fc3RhcnQgPT0gJ3EnKQotICAgIHsKLSAgICAgIGlmICh0aWMzMF9wYXJhbGxlbF9pbnNuICh0b2tlbl9zdGFydCkpCi0JewotCSAgaWYgKGZvdW5kX3BhcmFsbGVsX2luc24pCi0JICAgIGZyZWUgKHRva2VuX3N0YXJ0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICB3aGlsZSAoaXNfb3Bjb2RlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotICAgIGN1cnJlbnRfcG9zbisrOwotICB7CQkJCS8qIEZpbmQgaW5zdHJ1Y3Rpb24gKi8KLSAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOwotICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOwotICAgIG9wY29kZSA9ICh0ZW1wbGF0ZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHRva2VuX3N0YXJ0KTsKLSAgICBpZiAob3Bjb2RlKQotICAgICAgewotCWRlYnVnICgiRm91bmQgaW5zdHJ1Y3Rpb24gJXNcbiIsIG9wY29kZS0+bmFtZSk7Ci0JaW5zbi50bSA9IG9wY29kZTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JZGVidWcgKCJEaWRuJ3QgZmluZCBpbnNuXG4iKTsKLQlhc19iYWQgKCJVbmtub3duIFRNUzMyMEMzMCBpbnN0cnVjdGlvbjogJXMiLCB0b2tlbl9zdGFydCk7Ci0JcmV0dXJuOwotICAgICAgfQotICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7Ci0gIH0KLSAgaWYgKCpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pCi0gICAgewkJCQkvKiBGaW5kIG9wZXJhbmRzICovCi0gICAgICBpbnQgcGFyZW5fbm90X2JhbGFuY2VkOwotICAgICAgaW50IGV4cGVjdGluZ19vcGVyYW5kID0gMDsKLSAgICAgIGludCB0aGlzX29wZXJhbmQ7Ci0gICAgICBkbwotCXsKLQkgIC8qIHNraXAgb3B0aW9uYWwgd2hpdGUgc3BhY2UgYmVmb3JlIG9wZXJhbmQgKi8KLQkgIHdoaWxlICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKQotCSAgICB7Ci0JICAgICAgaWYgKCFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLQkJewotCQkgIGFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSAlcyBvcGVyYW5kIiwKLQkJCSAgb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAotCQkJICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBjdXJyZW50X3Bvc24rKzsKLQkgICAgfQotCSAgdG9rZW5fc3RhcnQgPSBjdXJyZW50X3Bvc247CS8qIGFmdGVyIHdoaXRlIHNwYWNlICovCi0JICBwYXJlbl9ub3RfYmFsYW5jZWQgPSAwOwotCSAgd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqY3VycmVudF9wb3NuICE9ICcsJykKLQkgICAgewotCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQotCQl7Ci0JCSAgaWYgKHBhcmVuX25vdF9iYWxhbmNlZCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiVW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiAlcyBvcGVyYW5kLiIsCi0JCQkgICAgICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwkvKiB3ZSBhcmUgZG9uZSAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotCQl7Ci0JCSAgYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gJXMgb3BlcmFuZCIsCi0JCQkgIG91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKLQkJCSAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJygnKQotCQkrK3BhcmVuX25vdF9iYWxhbmNlZDsKLQkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKScpCi0JCS0tcGFyZW5fbm90X2JhbGFuY2VkOwotCSAgICAgIGN1cnJlbnRfcG9zbisrOwotCSAgICB9Ci0JICBpZiAoY3VycmVudF9wb3NuICE9IHRva2VuX3N0YXJ0KQotCSAgICB7CQkJLyogeWVzLCB3ZSd2ZSByZWFkIGluIGFub3RoZXIgb3BlcmFuZCAqLwotCSAgICAgIHRoaXNfb3BlcmFuZCA9IGluc24ub3BlcmFuZHMrKzsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IE1BWF9PUEVSQU5EUykKLQkJewotCQkgIGFzX2JhZCAoIlNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIsCi0JCQkgIE1BWF9PUEVSQU5EUyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2luc24nIGFzIHdlIGdvIGFsb25nICovCi0JICAgICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKLQkgICAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKLQkgICAgICBpbnNuLm9wZXJhbmRfdHlwZVt0aGlzX29wZXJhbmRdID0gdGljMzBfb3BlcmFuZCAodG9rZW5fc3RhcnQpOwotCSAgICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW3RoaXNfb3BlcmFuZF0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoZXhwZWN0aW5nX29wZXJhbmQpCi0JCXsKLQkJICBhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQotCQl7Ci0JCSAgYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYmVmb3JlICcsJzsgZ290IG5vdGhpbmciKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgLyogbm93ICpjdXJyZW50X3Bvc24gbXVzdCBiZSBlaXRoZXIgJywnIG9yIEVORF9PRl9JTlNOICovCi0JICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBpZiAoKisrY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQotCQl7CQkvKiBqdXN0IHNraXAgaXQsIGlmIGl0J3MgXG4gY29tcGxhaW4gKi8KLQkJICBhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXhwZWN0aW5nX29wZXJhbmQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKCpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pOwkvKiB1bnRpbCB3ZSBnZXQgZW5kIG9mIGluc24gKi8KLSAgICB9Ci0gIGRlYnVnICgiTnVtYmVyIG9mIG9wZXJhbmRzIGZvdW5kOiAlZFxuIiwgaW5zbi5vcGVyYW5kcyk7Ci0gIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIG9wZXJhbmRzIGlzIGNvcnJlY3QgKi8KLSAgaWYgKGluc24ub3BlcmFuZHMgIT0gaW5zbi50bS0+b3BlcmFuZHMpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgbnVtb3BzID0gaW5zbi50bS0+b3BlcmFuZHM7Ci0gICAgICAvKiBJZiBvcGVyYW5kcyBhcmUgbm90IHRoZSBzYW1lLCB0aGVuIHNlZSBpZiBhbnkgb2YgdGhlIG9wZXJhbmRzIGFyZSBub3QKLSAgICAgICAgIHJlcXVpcmVkLiAgVGhlbiByZWNoZWNrIHdpdGggbnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzLiAgSWYgdGhleSBhcmUgc3RpbGwgbm90Ci0gICAgICAgICB0aGUgc2FtZSwgdGhlbiBnaXZlIGFuIGVycm9yLCBvdGhlcndpc2UgY2Fycnkgb24uICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zbi50bS0+b3BlcmFuZHM7IGkrKykKLQlpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1tpXSAmIE5vdFJlcSkKLQkgIG51bW9wcy0tOwotICAgICAgaWYgKGluc24ub3BlcmFuZHMgIT0gbnVtb3BzKQotCXsKLQkgIGFzX2JhZCAoIkluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX05vdFJlcTsKLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgaW5zbi5vcGVyYW5kczsgY291bnQrKykKLSAgICB7Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdLT5vcF90eXBlICYgaW5zbi50bS0+b3BlcmFuZF90eXBlc1tjb3VudF0pCi0JewotCSAgZGVidWcgKCJPcGVyYW5kICVkIG1hdGNoZXNcbiIsIGNvdW50ICsgMSk7Ci0JICAvKiBJZiBpbnN0cnVjdGlvbiBoYXMgdHdvIG9wZXJhbmRzIGFuZCBoYXMgYW4gQWRkcmVzc01vZGUgbW9kaWZpZXIgdGhlbiBzZXQKLQkgICAgIGFkZHJlc3NpbmcgbW9kZSB0eXBlIGZvciBpbnN0cnVjdGlvbiAqLwotCSAgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBBZGRyZXNzTW9kZSkKLQkgICAgewotCSAgICAgIGludCBhZGRyX2luc24gPSAwOwotCSAgICAgIC8qIFN0b3JlIGluc3RydWN0aW9uIHVzZXMgdGhlIHNlY29uZCBvcGVyYW5kIGZvciB0aGUgYWRkcmVzcyBtb2RlLiAqLwotCSAgICAgIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1sxXSAmIChJbmRpcmVjdCB8IERpcmVjdCkpID09IChJbmRpcmVjdCB8IERpcmVjdCkpCi0JCWFkZHJfaW5zbiA9IDE7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW2FkZHJfaW5zbl0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9SZWdpc3RlcjsKLQkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthZGRyX2luc25dLT5vcF90eXBlICYgRGlyZWN0KQotCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0RpcmVjdDsKLQkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthZGRyX2luc25dLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW5kaXJlY3Q7Ci0JICAgICAgZWxzZQotCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0ltbWVkaWF0ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKCJUaGUgJXMgb3BlcmFuZCBkb2Vzbid0IG1hdGNoIiwgb3JkaW5hbF9uYW1lc1tjb3VudF0pOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIC8qIE5vdyBzZXQgdGhlIGFkZHJlc3NpbmcgbW9kZSBmb3IgMyBvcGVyYW5kIGluc3RydWN0aW9ucy4gKi8KLSAgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgb3AzVDEpICYmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzFdICYgb3AzVDIpKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgYWRkcmVzc2luZyBtb2RlIHRvIHRoZSB2YWx1ZXMgdXNlZCBmb3IgMiBvcGVyYW5kIGluc3RydWN0aW9ucyBpbiB0aGUKLSAgICAgICAgIEcgYWRkcmVzc2luZyBmaWVsZCBvZiB0aGUgb3Bjb2RlLiAqLwotICAgICAgY2hhciAqcDsKLSAgICAgIHN3aXRjaCAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUpCi0JewotCWNhc2UgUm46Ci0JY2FzZSBBUm46Ci0JY2FzZSBEUFJlZzoKLQljYXNlIE90aGVyUmVnOgotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgKEFsbFJlZykpCi0JICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fUmVnaXN0ZXI7Ci0JICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0RpcmVjdDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNob3VsZG4ndCBtYWtlIGl0IHRvIHRoaXMgc3RhZ2UgKi8KLQkgICAgICBhc19iYWQgKCJJbmNvbXBhdGlibGUgZmlyc3QgYW5kIHNlY29uZCBvcGVyYW5kcyBpbiBpbnN0cnVjdGlvbiIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJbmRpcmVjdDoKLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0luZGlyZWN0OwotCSAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbW1lZGlhdGU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTaG91bGRuJ3QgbWFrZSBpdCB0byB0aGlzIHN0YWdlICovCi0JICAgICAgYXNfYmFkICgiSW5jb21wYXRpYmxlIGZpcnN0IGFuZCBzZWNvbmQgb3BlcmFuZHMgaW4gaW5zdHJ1Y3Rpb24iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIE5vdyBtYWtlIHVwIHRoZSBvcGNvZGUgZm9yIHRoZSAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLiAgQXMgaW4gcGFyYWxsZWwKLSAgICAgICAgIGluc3RydWN0aW9ucywgdGhlcmUgd2lsbCBiZSBubyB1bnJlc29sdmVkIHZhbHVlcywgc28gdGhleSBjYW4gYmUgZnVsbHkgZm9ybWVkCi0gICAgICAgICBhbmQgYWRkZWQgdG8gdGhlIGZyYWcgdGFibGUuICovCi0gICAgICBpbnNuLm9wY29kZSA9IGluc24udG0tPmJhc2Vfb3Bjb2RlOwotICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JewotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQl9Ci0gICAgICBlbHNlCi0JaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCXsKLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JfQotICAgICAgZWxzZQotCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCA4KTsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID09IDMpCi0JaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzJdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLSAgICAgIGluc24ub3Bjb2RlIHw9IGluc24uYWRkcmVzc2luZ19tb2RlOwotICAgICAgcCA9IGZyYWdfbW9yZSAoSU5TTl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewkJCQkvKiBOb3QgYSB0aHJlZSBvcGVyYW5kIGluc3RydWN0aW9uICovCi0gICAgICBjaGFyICpwOwotICAgICAgaW50IGFtX2luc24gPSAtMTsKLSAgICAgIGluc24ub3Bjb2RlID0gaW5zbi50bS0+YmFzZV9vcGNvZGU7Ci0gICAgICAvKiBDcmVhdGUgZnJhZyBmb3IgaW5zdHJ1Y3Rpb24gLSBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSA0IGJ5dGVzIGxvbmcuICovCi0gICAgICBwID0gZnJhZ19tb3JlIChJTlNOX1NJWkUpOwotICAgICAgaWYgKChpbnNuLm9wZXJhbmRzID4gMCkgJiYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBBZGRyZXNzTW9kZSkpCi0JewotCSAgaW5zbi5vcGNvZGUgfD0gaW5zbi5hZGRyZXNzaW5nX21vZGU7Ci0JICBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fSW5kaXJlY3QpCi0JICAgIHsKLQkgICAgICAvKiBEZXRlcm1pbmUgd2hpY2ggb3BlcmFuZCBnaXZlcyB0aGUgYWRkcmVzc2luZyBtb2RlICovCi0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JCWFtX2luc24gPSAwOwotCSAgICAgIGlmICgoaW5zbi5vcGVyYW5kcyA+IDEpICYmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KSkKLQkJYW1faW5zbiA9IDE7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5pbmRpcmVjdC5kaXNwKTsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVshYW1faW5zbl0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX1JlZ2lzdGVyKQotCSAgICB7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fRGlyZWN0KQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgRGlyZWN0KQotCQlhbV9pbnNuID0gMDsKLQkgICAgICBpZiAoKGluc24ub3BlcmFuZHMgPiAxKSAmJiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBEaXJlY3QpKQotCQlhbV9pbnNuID0gMTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVshYW1faW5zbl0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+ZGlyZWN0LnJlc29sdmVkID09IDEpCi0JCXsKLQkJICAvKiBSZXNvbHZlZCB2YWx1ZXMgY2FuIGJlIHBsYWNlZCBzdHJhaWdodCBpbnRvIGluc3RydWN0aW9uIHdvcmQsIGFuZCBvdXRwdXQgKi8KLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmRpcmVjdC5hZGRyZXNzICYgMHgwMDAwRkZGRik7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogVW5yZXNvbHZlZCBkaXJlY3QgYWRkcmVzc2luZyBtb2RlIGluc3RydWN0aW9uICovCi0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMiwgJmluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5kaXJlY3QuZGlyZWN0X2V4cHIsIDAsIDApOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX0ltbWVkaWF0ZSkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JCXsKLQkJICBjaGFyICprZWVwbG9jOwotCQkgIGludCBzaXplOwotCQkgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JCSAgc3dpdGNoIChpbnNuLnRtLT5pbW1fYXJnX3R5cGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEltbV9GbG9hdDoKLQkJICAgICAgZGVidWcgKCJGbG9hdGluZyBwb2ludCBmaXJzdCBvcGVyYW5kXG4iKTsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgICAga2VlcGxvYyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5sYWJlbDsKLQkJICAgICAgaWYgKG1kX2F0b2YgKCdmJywgcCArIDIsICZzaXplKSAhPSAwKQotCQkJewotCQkJICBhc19iYWQgKCJpbnZhbGlkIHNob3J0IGZvcm0gZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIG9wZXJhbmQiKTsKLQkJCSAgcmV0dXJuOwotCQkJfQotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBrZWVwbG9jOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgSW1tX1VJbnQ6Ci0JCSAgICAgIGRlYnVnICgiVW5zaWduZWQgaW50IGZpcnN0IG9wZXJhbmRcbiIpOwotCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kKQotCQkJYXNfd2FybiAoInJvdW5kaW5nIGRvd24gZmlyc3Qgb3BlcmFuZCBmbG9hdCB0byB1bnNpZ25lZCBpbnQiKTsKLQkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgPiAweEZGRkYpCi0JCQlhc193YXJuICgib25seSBsb3dlciAxNi1iaXRzIG9mIGZpcnN0IG9wZXJhbmQgYXJlIHVzZWQiKTsKLQkJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgJiAweDAwMDBGRkZGTCk7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBJbW1fU0ludDoKLQkJICAgICAgZGVidWcgKCJJbnQgZmlyc3Qgb3BlcmFuZFxuIik7Ci0JCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQpCi0JCQlhc193YXJuICgicm91bmRpbmcgZG93biBmaXJzdCBvcGVyYW5kIGZsb2F0IHRvIHNpZ25lZCBpbnQiKTsKLQkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPCAtMzI3NjggfHwKLQkJCSAgaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA+IDMyNzY3KQotCQkJewotCQkJICBhc19iYWQgKCJmaXJzdCBvcGVyYW5kIGlzIHRvbyBsYXJnZSBmb3IgMTYtYml0IHNpZ25lZCBpbnQiKTsKLQkJCSAgcmV0dXJuOwotCQkJfQotCQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciAmIDB4MDAwMEZGRkZMKTsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsJCS8qIFVucmVzb2x2ZWQgaW1tZWRpYXRlIGxhYmVsICovCi0JCSAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQkgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMCwgMCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBQQ1JlbCkKLQl7Ci0JICAvKiBDb25kaXRpb25hbCBCcmFuY2ggYW5kIENhbGwgaW5zdHJ1Y3Rpb25zICovCi0JICBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiAoQWxsUmVnIHwgRGlzcCkpID09IChBbGxSZWcgfCBEaXNwKSkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCQl7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWdpc3RlcjsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVsYXRpdmU7Ci0JCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkJICAgIHsKLQkJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgJiAweDAwMDBGRkZGKTsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMSwgMCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBBUm4pID09IEFSbikKLQkgICAgewotCSAgICAgIC8qIERlY3JlbWVudCBhbmQgQnJhbmNoIGluc3RydWN0aW9ucyAqLwotCSAgICAgIGluc24ub3Bjb2RlIHw9ICgoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUgLSAweDA4KSA8PCAyMik7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgKEFsbFJlZykpCi0JCXsKLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUpOwotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlZ2lzdGVyOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JCXsKLQkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJmaXJzdCBvcGVyYW5kIGlzIGZsb2F0aW5nIHBvaW50Iik7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA8IC0zMjc2OCB8fAotCQkgICAgICBpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyID4gMzI3NjcpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoImZpcnN0IG9wZXJhbmQgaXMgdG9vIGxhcmdlIGZvciAxNi1iaXQgc2lnbmVkIGludCIpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbW1lZGlhdGUuc19udW1iZXIpOwotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlbGF0aXZlOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWxhdGl2ZTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwgJmluc24ub3BlcmFuZF90eXBlWzFdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDEsIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdID09IElWZWN0b3IpCi0JewotCSAgLyogVHJhcCBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIElWZWN0b3IpCi0JICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyKTsKLQkgIGVsc2UKLQkgICAgewkJCS8qIFNob3VsZG4ndCBnZXQgaGVyZSAqLwotCSAgICAgIGFzX2JhZCAoImludGVycnVwdCB2ZWN0b3IgZm9yIHRyYXAgaW5zdHJ1Y3Rpb24gb3V0IG9mIHJhbmdlIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBTdGFja09wIHx8IGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBSb3RhdGUpCi0JewotCSAgLyogUHVzaCwgUG9wIGFuZCBSb3RhdGUgaW5zdHJ1Y3Rpb25zICovCi0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBlbHNlIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIChBYnMyNCB8IERpcmVjdCkpID09IChBYnMyNCB8IERpcmVjdCkpCi0JewotCSAgLyogTERQIEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIHRlc3RlZCBmb3IgYmVmb3JlIHRoZSBuZXh0IHNlY3Rpb24gKi8KLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIERpcmVjdCkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LnJlc29sdmVkID09IDEpCi0JCXsKLQkJICAvKiBEaXJlY3QgYWRkcmVzc2luZyB1c2VzIGxvd2VyIDggYml0cyBvZiBkaXJlY3QgYWRkcmVzcyAqLwotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LmFkZHJlc3MgJiAweDAwRkYwMDAwKSA+PiAxNjsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZml4UyAqZml4OwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4ID0gZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMyAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDEsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LmRpcmVjdF9leHByLCAwLCAwKTsKLQkJICAvKiBFbnN1cmUgdGhhdCB0aGUgYXNzZW1ibGVyIGRvZXNuJ3QgY29tcGxhaW4gYWJvdXQgZml0dGluZyBhIDI0LWJpdAotCQkgICAgIGFkZHJlc3MgaW50byA4IGJpdHMuICovCi0JCSAgZml4LT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIC8qIEltbWVkaWF0ZSBhZGRyZXNzaW5nIHVzZXMgdXBwZXIgOCBiaXRzIG9mIGFkZHJlc3MgKi8KLQkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciA+IDB4MDBGRkZGRkYpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoIkxEUCBpbnN0cnVjdGlvbiBuZWVkcyBhIDI0LWJpdCBvcGVyYW5kIik7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBpbnNuLm9wY29kZSB8PSAoKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZpeFMgKmZpeDsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDMgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAxLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMCwgMCk7Ci0JCSAgZml4LT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiAoSW1tMjQpKQotCXsKLQkgIC8qIFVuY29uZGl0aW9uYWwgQnJhbmNoIGFuZCBDYWxsIGluc3RydWN0aW9ucyAqLwotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyID4gMHgwMEZGRkZGRikKLQkJYXNfd2FybiAoImZpcnN0IG9wZXJhbmQgaXMgdG9vIGxhcmdlIGZvciBhIDI0LWJpdCBkaXNwbGFjZW1lbnQiKTsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciAmIDB4MDBGRkZGRkYpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMSAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDMsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAwLCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBOb3RSZXEpCi0JewotCSAgLyogQ2hlY2sgZm9yIE5PUCBpbnN0cnVjdGlvbiB3aXRob3V0IGFyZ3VtZW50cy4gKi8KLQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZHMgPT0gMCkKLQl7Ci0JICAvKiBDaGVjayBmb3IgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgb3BlcmFuZHMuICovCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCX0KLSAgICB9Ci0gIGRlYnVnICgiQWRkcmVzc2luZyBtb2RlOiAlMDhYXG4iLCBpbnNuLmFkZHJlc3NpbmdfbW9kZSk7Ci0gIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zbi5vcGVyYW5kczsgaSsrKQotICAgICAgewotCWlmIChpbnNuLm9wZXJhbmRfdHlwZVtpXS0+aW1tZWRpYXRlLmxhYmVsKQotCSAgZnJlZSAoaW5zbi5vcGVyYW5kX3R5cGVbaV0tPmltbWVkaWF0ZS5sYWJlbCk7Ci0JZnJlZSAoaW5zbi5vcGVyYW5kX3R5cGVbaV0pOwotICAgICAgfQotICB9Ci0gIGRlYnVnICgiRmluYWwgb3Bjb2RlOiAlMDhYXG4iLCBpbnNuLm9wY29kZSk7Ci0gIGRlYnVnICgiXG4iKTsKLX0KLQotc3RydWN0IHRpYzMwX3Bhcl9pbnNuCi17Ci0gIHBhcnRlbXBsYXRlICp0bTsJCS8qIFRlbXBsYXRlIG9mIGN1cnJlbnQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gKi8KLSAgaW50IG9wZXJhbmRzWzJdOwkJLyogTnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzIGZvciBlYWNoIGluc24gKi8KLSAgLyogVHlwZSBvZiBvcGVyYW5kIGdpdmVuIGluIGluc3RydWN0aW9uICovCi0gIG9wZXJhbmQgKm9wZXJhbmRfdHlwZVsyXVtNQVhfT1BFUkFORFNdOwotICBpbnQgc3dhcF9vcGVyYW5kczsJCS8qIFdoZXRoZXIgdG8gc3dhcCBvcGVyYW5kcyBhcm91bmQuICovCi0gIHVuc2lnbmVkIHBfZmllbGQ7CQkvKiBWYWx1ZSBvZiBwIGZpZWxkIGluIG11bHRpcGx5IGFkZC9zdWIgaW5zdHJ1Y3Rpb25zICovCi0gIHVuc2lnbmVkIG9wY29kZTsJCS8qIEZpbmFsIG9wY29kZSAqLwotfTsKLQotc3RydWN0IHRpYzMwX3Bhcl9pbnNuIHBfaW5zbjsKLQotaW50Ci10aWMzMF9wYXJhbGxlbF9pbnNuIChjaGFyICp0b2tlbikKLXsKLSAgc3RhdGljIHBhcnRlbXBsYXRlICpwX29wY29kZTsKLSAgY2hhciAqY3VycmVudF9wb3NuID0gdG9rZW47Ci0gIGNoYXIgKnRva2VuX3N0YXJ0OwotICBjaGFyIHNhdmVfY2hhcjsKLQotICBkZWJ1ZyAoIkluIHRpYzMwX3BhcmFsbGVsX2luc24gd2l0aCAlc1xuIiwgdG9rZW4pOwotICBtZW1zZXQgKCZwX2luc24sICdcMCcsIHNpemVvZiAocF9pbnNuKSk7Ci0gIHdoaWxlIChpc19vcGNvZGVfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0gICAgY3VycmVudF9wb3NuKys7Ci0gIHsJCQkJLyogRmluZCBpbnN0cnVjdGlvbiAqLwotICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247Ci0gICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7Ci0gICAgcF9vcGNvZGUgPSAocGFydGVtcGxhdGUgKikgaGFzaF9maW5kIChwYXJvcF9oYXNoLCB0b2tlbik7Ci0gICAgaWYgKHBfb3Bjb2RlKQotICAgICAgewotCWRlYnVnICgiRm91bmQgaW5zdHJ1Y3Rpb24gJXNcbiIsIHBfb3Bjb2RlLT5uYW1lKTsKLQlwX2luc24udG0gPSBwX29wY29kZTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JY2hhciBmaXJzdF9vcGNvZGVbNl0gPQotCXswfTsKLQljaGFyIHNlY29uZF9vcGNvZGVbNl0gPQotCXswfTsKLQlpbnQgaTsKLQlpbnQgY3VycmVudF9vcGNvZGUgPSAtMTsKLQlpbnQgY2hhcl9wdHIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHN0cmxlbiAodG9rZW4pOyBpKyspCi0JICB7Ci0JICAgIGNoYXIgY2ggPSAqKHRva2VuICsgaSk7Ci0JICAgIGlmIChjaCA9PSAnXycgJiYgY3VycmVudF9vcGNvZGUgPT0gLTEpCi0JICAgICAgewotCQljdXJyZW50X29wY29kZSA9IDA7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgaWYgKGNoID09ICdfJyAmJiBjdXJyZW50X29wY29kZSA9PSAwKQotCSAgICAgIHsKLQkJY3VycmVudF9vcGNvZGUgPSAxOwotCQljaGFyX3B0ciA9IDA7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgc3dpdGNoIChjdXJyZW50X29wY29kZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAwOgotCQlmaXJzdF9vcGNvZGVbY2hhcl9wdHIrK10gPSBjaDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAxOgotCQlzZWNvbmRfb3Bjb2RlW2NoYXJfcHRyKytdID0gY2g7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQlkZWJ1ZyAoImZpcnN0X29wY29kZSA9ICVzXG4iLCBmaXJzdF9vcGNvZGUpOwotCWRlYnVnICgic2Vjb25kX29wY29kZSA9ICVzXG4iLCBzZWNvbmRfb3Bjb2RlKTsKLQlzcHJpbnRmICh0b2tlbiwgInFfJXNfJXMiLCBzZWNvbmRfb3Bjb2RlLCBmaXJzdF9vcGNvZGUpOwotCXBfb3Bjb2RlID0gKHBhcnRlbXBsYXRlICopIGhhc2hfZmluZCAocGFyb3BfaGFzaCwgdG9rZW4pOwotCWlmIChwX29wY29kZSkKLQkgIHsKLQkgICAgZGVidWcgKCJGb3VuZCBpbnN0cnVjdGlvbiAlc1xuIiwgcF9vcGNvZGUtPm5hbWUpOwotCSAgICBwX2luc24udG0gPSBwX29wY29kZTsKLQkgICAgcF9pbnNuLnN3YXBfb3BlcmFuZHMgPSAxOwotCSAgfQotCWVsc2UKLQkgIHJldHVybiAwOwotICAgICAgfQotICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7Ci0gIH0KLSAgewkJCQkvKiBGaW5kIG9wZXJhbmRzICovCi0gICAgaW50IHBhcmVuX25vdF9iYWxhbmNlZDsKLSAgICBpbnQgZXhwZWN0aW5nX29wZXJhbmQgPSAwOwotICAgIGludCBmb3VuZF9zZXBhcmF0b3IgPSAwOwotICAgIGRvCi0gICAgICB7Ci0JLyogc2tpcCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBiZWZvcmUgb3BlcmFuZCAqLwotCXdoaWxlICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKQotCSAgewotCSAgICBpZiAoIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICpjdXJyZW50X3Bvc24gIT0gUEFSQUxMRUxfU0VQQVJBVE9SKQotCSAgICAgIHsKLQkJYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlICVzIG9wZXJhbmQiLAotCQkJb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAotCQkJb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gUEFSQUxMRUxfU0VQQVJBVE9SKQotCSAgICAgIGZvdW5kX3NlcGFyYXRvciA9IDE7Ci0JICAgIGN1cnJlbnRfcG9zbisrOwotCSAgfQotCXRva2VuX3N0YXJ0ID0gY3VycmVudF9wb3NuOwkvKiBhZnRlciB3aGl0ZSBzcGFjZSAqLwotCXBhcmVuX25vdF9iYWxhbmNlZCA9IDA7Ci0Jd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqY3VycmVudF9wb3NuICE9ICcsJykKLQkgIHsKLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCi0JICAgICAgewotCQlpZiAocGFyZW5fbm90X2JhbGFuY2VkKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoIlVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gJXMgb3BlcmFuZC4iLAotCQkJICAgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQkgICAgcmV0dXJuIDE7Ci0JCSAgfQotCQllbHNlCi0JCSAgYnJlYWs7CS8qIHdlIGFyZSBkb25lICovCi0JICAgICAgfQotCSAgICBlbHNlIGlmICgqY3VycmVudF9wb3NuID09IFBBUkFMTEVMX1NFUEFSQVRPUikKLQkgICAgICB7Ci0JCXdoaWxlIChpc19zcGFjZV9jaGFyICgqKGN1cnJlbnRfcG9zbiAtIDEpKSkKLQkJICBjdXJyZW50X3Bvc24tLTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAhaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0JICAgICAgewotCQlhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBpbiAlcyBvcGVyYW5kIiwKLQkJCW91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKLQkJCW9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09ICcoJykKLQkgICAgICArK3BhcmVuX25vdF9iYWxhbmNlZDsKLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJyknKQotCSAgICAgIC0tcGFyZW5fbm90X2JhbGFuY2VkOwotCSAgICBjdXJyZW50X3Bvc24rKzsKLQkgIH0KLQlpZiAoY3VycmVudF9wb3NuICE9IHRva2VuX3N0YXJ0KQotCSAgewkJCS8qIHllcywgd2UndmUgcmVhZCBpbiBhbm90aGVyIG9wZXJhbmQgKi8KLQkgICAgcF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0rKzsKLQkgICAgaWYgKHBfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdID4gTUFYX09QRVJBTkRTKQotCSAgICAgIHsKLQkJYXNfYmFkICgiU3B1cmlvdXMgb3BlcmFuZHM7ICglZCBvcGVyYW5kcy9pbnN0cnVjdGlvbiBtYXgpIiwKLQkJCU1BWF9PUEVSQU5EUyk7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2luc24nIGFzIHdlIGdvIGFsb25nICovCi0JICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247Ci0JICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOwotCSAgICBwX2luc24ub3BlcmFuZF90eXBlW2ZvdW5kX3NlcGFyYXRvcl1bcF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0gLSAxXSA9Ci0JICAgICAgdGljMzBfb3BlcmFuZCAodG9rZW5fc3RhcnQpOwotCSAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOwotCSAgICBpZiAoIXBfaW5zbi5vcGVyYW5kX3R5cGVbZm91bmRfc2VwYXJhdG9yXVtwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSAtIDFdKQotCSAgICAgIHJldHVybiAxOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGV4cGVjdGluZ19vcGVyYW5kKQotCSAgICAgIHsKLQkJYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09ICcsJykKLQkgICAgICB7Ci0JCWFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgIH0KLQkvKiBub3cgKmN1cnJlbnRfcG9zbiBtdXN0IGJlIGVpdGhlciAnLCcgb3IgRU5EX09GX0lOU04gKi8KLQlpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCi0JICB7Ci0JICAgIGlmICgqKytjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCi0JICAgICAgewkJCS8qIGp1c3Qgc2tpcCBpdCwgaWYgaXQncyBcbiBjb21wbGFpbiAqLwotCQlhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgZXhwZWN0aW5nX29wZXJhbmQgPSAxOwotCSAgfQotICAgICAgfQotICAgIHdoaWxlICgqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKTsJLyogdW50aWwgd2UgZ2V0IGVuZCBvZiBpbnNuICovCi0gIH0KLSAgaWYgKHBfaW5zbi5zd2FwX29wZXJhbmRzKQotICAgIHsKLSAgICAgIGludCB0ZW1wX251bSwgaTsKLSAgICAgIG9wZXJhbmQgKnRlbXBfb3A7Ci0KLSAgICAgIHRlbXBfbnVtID0gcF9pbnNuLm9wZXJhbmRzWzBdOwotICAgICAgcF9pbnNuLm9wZXJhbmRzWzBdID0gcF9pbnNuLm9wZXJhbmRzWzFdOwotICAgICAgcF9pbnNuLm9wZXJhbmRzWzFdID0gdGVtcF9udW07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX09QRVJBTkRTOyBpKyspCi0JewotCSAgdGVtcF9vcCA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1baV07Ci0JICBwX2luc24ub3BlcmFuZF90eXBlWzBdW2ldID0gcF9pbnNuLm9wZXJhbmRfdHlwZVsxXVtpXTsKLQkgIHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1baV0gPSB0ZW1wX29wOwotCX0KLSAgICB9Ci0gIGlmIChwX2luc24ub3BlcmFuZHNbMF0gIT0gcF9pbnNuLnRtLT5vcGVyYW5kc18xKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4gaW4gdGhlIGZpcnN0IGluc3RydWN0aW9uIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChwX2luc24ub3BlcmFuZHNbMV0gIT0gcF9pbnNuLnRtLT5vcGVyYW5kc18yKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4gaW4gdGhlIHNlY29uZCBpbnN0cnVjdGlvbiIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBkZWJ1ZyAoIk51bWJlciBvZiBvcGVyYW5kcyBpbiBmaXJzdCBpbnNuOiAlZFxuIiwgcF9pbnNuLm9wZXJhbmRzWzBdKTsKLSAgZGVidWcgKCJOdW1iZXIgb2Ygb3BlcmFuZHMgaW4gc2Vjb25kIGluc246ICVkXG4iLCBwX2luc24ub3BlcmFuZHNbMV0pOwotICB7CQkJCS8qIE5vdyBjaGVjayBpZiBvcGVyYW5kcyBhcmUgY29ycmVjdCAqLwotICAgIGludCBjb3VudDsKLSAgICBpbnQgbnVtX3JuID0gMDsKLSAgICBpbnQgbnVtX2luZCA9IDA7Ci0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjsgY291bnQrKykKLSAgICAgIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgcF9pbnNuLm9wZXJhbmRzW2NvdW50XTsgaSsrKQotCSAgewotCSAgICBpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdW2ldLT5vcF90eXBlICYKLQkJIHBfaW5zbi50bS0+b3BlcmFuZF90eXBlc1tjb3VudF1baV0pID09IDApCi0JICAgICAgewotCQlhc19iYWQgKCIlcyBpbnN0cnVjdGlvbiwgb3BlcmFuZCAlZCBkb2Vzbid0IG1hdGNoIiwgb3JkaW5hbF9uYW1lc1tjb3VudF0sIGkgKyAxKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICAvKiBHZXQgbnVtYmVyIG9mIFIgcmVnaXN0ZXIgYW5kIGluZGlyZWN0IHJlZmVyZW5jZSBjb250YWluZWQgd2l0aGluIHRoZSBmaXJzdAotCSAgICAgICB0d28gb3BlcmFuZHMgb2YgZWFjaCBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBtdWx0aXBseQotCSAgICAgICBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgd2hpY2ggcmVxdWlyZSB0d28gUiByZWdpc3RlcnMgYW5kIHR3byBpbmRpcmVjdAotCSAgICAgICByZWZlcmVuY2VzLCBidXQgbm90IGluIGFueSBwYXJ0aWN1bGFyIHBsYWNlLiAqLwotCSAgICBpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdW2ldLT5vcF90eXBlICYgUm4pICYmIGkgPCAyKQotCSAgICAgIG51bV9ybisrOwotCSAgICBlbHNlIGlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVtjb3VudF1baV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkgJiYgaSA8IDIpCi0JICAgICAgbnVtX2luZCsrOwotCSAgfQotICAgICAgfQotICAgIGlmICgocF9pbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdWzBdICYgKEluZGlyZWN0IHwgUm4pKSA9PSAoSW5kaXJlY3QgfCBSbikpCi0gICAgICB7Ci0JLyogQ2hlY2sgZm9yIHRoZSBtdWx0aXBseSBpbnN0cnVjdGlvbnMgKi8KLQlpZiAobnVtX3JuICE9IDIpCi0JICB7Ci0JICAgIGFzX2JhZCAoImluY29ycmVjdCBmb3JtYXQgZm9yIG11bHRpcGx5IHBhcmFsbGVsIGluc3RydWN0aW9uIik7Ci0JICAgIHJldHVybiAxOwotCSAgfQotCWlmIChudW1faW5kICE9IDIpCi0JICB7CQkJLyogU2hvdWxkbid0IGdldCBoZXJlICovCi0JICAgIGFzX2JhZCAoImluY29ycmVjdCBmb3JtYXQgZm9yIG11bHRpcGx5IHBhcmFsbGVsIGluc3RydWN0aW9uIik7Ci0JICAgIHJldHVybiAxOwotCSAgfQotCWlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSAhPSAweDAwKSAmJgotCSAgICAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSAhPSAweDAxKSkKLQkgIHsKLQkgICAgYXNfYmFkICgiZGVzdGluYXRpb24gZm9yIG11bHRpcGx5IGNhbiBvbmx5IGJlIFIwIG9yIFIxIik7Ci0JICAgIHJldHVybiAxOwotCSAgfQotCWlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsyXS0+cmVnLm9wY29kZSAhPSAweDAyKSAmJgotCSAgICAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsyXS0+cmVnLm9wY29kZSAhPSAweDAzKSkKLQkgIHsKLQkgICAgYXNfYmFkICgiZGVzdGluYXRpb24gZm9yIGFkZC9zdWJ0cmFjdCBjYW4gb25seSBiZSBSMiBvciBSMyIpOwotCSAgICByZXR1cm4gMTsKLQkgIH0KLQkvKiBOb3cgZGV0ZXJtaW5lIHRoZSBQIGZpZWxkIGZvciB0aGUgaW5zdHJ1Y3Rpb24gKi8KLQlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgewotCSAgICBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMDAwMDAwMDsJLyogSW5kICogSW5kLCBSbiAgKy8tIFJuICAqLwotCSAgICBlbHNlIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAxMDAwMDAwOwkvKiBJbmQgKiBSbiwgIEluZCArLy0gUm4gICovCi0JICAgIGVsc2UKLQkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDMwMDAwMDA7CS8qIEluZCAqIFJuLCAgUm4gICsvLSBJbmQgKi8KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5vcF90eXBlICYgUm4pCi0JICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAyMDAwMDAwOwkvKiBSbiAgKiBSbiwgIEluZCArLy0gSW5kICovCi0JICAgIGVsc2UgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgICB7Ci0JCW9wZXJhbmQgKnRlbXA7Ci0JCXBfaW5zbi5wX2ZpZWxkID0gMHgwMTAwMDAwMDsJLyogUm4gICogSW5kLCBJbmQgKy8tIFJuICAqLwotCQkvKiBOZWVkIHRvIHN3YXAgdGhlIHR3byBtdWx0aXBseSBvcGVyYW5kcyBhcm91bmQgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCi0JCSAgIGl0cyBwbGFjZSBmb3IgdGhlIG9wY29kZSBtYWtldXAgaWUgc28gSW5kICogUm4sIEluZCArLy0gUm4gKi8KLQkJdGVtcCA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF07Ci0JCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0gPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdOwotCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdID0gdGVtcDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW9wZXJhbmQgKnRlbXA7Ci0JCXBfaW5zbi5wX2ZpZWxkID0gMHgwMzAwMDAwMDsJLyogUm4gICogSW5kLCBSbiAgKy8tIEluZCAqLwotCQl0ZW1wID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXTsKLQkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXSA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV07Ci0JCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0gPSB0ZW1wOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgfQotICBkZWJ1ZyAoIlAgZmllbGQ6ICUwOFhcbiIsIHBfaW5zbi5wX2ZpZWxkKTsKLSAgLyogRmluYWxpc2Ugb3Bjb2RlLiAgVGhpcyBpcyBlYXNpZXIgZm9yIHBhcmFsbGVsIGluc3RydWN0aW9ucyBhcyB0aGV5IGhhdmUgdG8gYmUKLSAgICAgZnVsbHkgcmVzb2x2ZWQsIHRoZXJlIGFyZSBubyBtZW1vcnkgYWRkcmVzc2VzIGFsbG93ZWQsIGV4Y2VwdCB0aHJvdWdoIGluZGlyZWN0Ci0gICAgIGFkZHJlc3NpbmcsIHNvIHRoZXJlIGFyZSBubyBsYWJlbHMgdG8gcmVzb2x2ZS4gKi8KLSAgewotICAgIHBfaW5zbi5vcGNvZGUgPSBwX2luc24udG0tPmJhc2Vfb3Bjb2RlOwotICAgIHN3aXRjaCAocF9pbnNuLnRtLT5vcG9yZGVyKQotICAgICAgewotICAgICAgY2FzZSBPT180b3AxOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fNG9wMjoKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPT0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSkKLQkgIGFzX3dhcm4gKCJsb2FkaW5nIHRoZSBzYW1lIHJlZ2lzdGVyIGluIHBhcmFsbGVsIG9wZXJhdGlvbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT180b3AzOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fNW9wMToKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PXzVvcDI6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT19QRmllbGQ6Ci0JcF9pbnNuLm9wY29kZSB8PSBwX2luc24ucF9maWVsZDsKLQlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSA9PSAweDAxKQotCSAgcF9pbnNuLm9wY29kZSB8PSAweDAwODAwMDAwOwotCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzJdLT5yZWcub3Bjb2RlID09IDB4MDMpCi0JICBwX2luc24ub3Bjb2RlIHw9IDB4MDA0MDAwMDA7Ci0Jc3dpdGNoIChwX2luc24ucF9maWVsZCkKLQkgIHsKLQkgIGNhc2UgMHgwMDAwMDAwMDoKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAweDAxMDAwMDAwOgotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDB4MDIwMDAwMDA6Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMHgwMzAwMDAwMDoKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWJyZWFrOwotICAgICAgfQotICB9CQkJCS8qIE9wY29kZSBpcyBmaW5hbGlzZWQgYXQgdGhpcyBwb2ludCBmb3IgYWxsIHBhcmFsbGVsIGluc3RydWN0aW9ucy4gKi8KLSAgewkJCQkvKiBPdXRwdXQgb3Bjb2RlICovCi0gICAgY2hhciAqcDsKLSAgICBwID0gZnJhZ19tb3JlIChJTlNOX1NJWkUpOwotICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgcF9pbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLSAgfQotICB7Ci0gICAgaW50IGksIGo7Ci0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgIGZvciAoaiA9IDA7IGogPCBwX2luc24ub3BlcmFuZHNbaV07IGorKykKLQlmcmVlIChwX2luc24ub3BlcmFuZF90eXBlW2ldW2pdKTsKLSAgfQotICBkZWJ1ZyAoIkZpbmFsIG9wY29kZTogJTA4WFxuIiwgcF9pbnNuLm9wY29kZSk7Ci0gIGRlYnVnICgiXG4iKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLW9wZXJhbmQgKgotdGljMzBfb3BlcmFuZCAodG9rZW4pCi0gICAgIGNoYXIgKnRva2VuOwotewotICBpbnQgY291bnQ7Ci0gIGNoYXIgaW5kX2J1ZmZlcltzdHJsZW4gKHRva2VuKV07Ci0gIG9wZXJhbmQgKmN1cnJlbnRfb3A7Ci0KLSAgZGVidWcgKCJJbiB0aWMzMF9vcGVyYW5kIHdpdGggJXNcbiIsIHRva2VuKTsKLSAgY3VycmVudF9vcCA9IChvcGVyYW5kICopIG1hbGxvYyAoc2l6ZW9mIChvcGVyYW5kKSk7Ci0gIG1lbXNldCAoY3VycmVudF9vcCwgJ1wwJywgc2l6ZW9mIChvcGVyYW5kKSk7Ci0gIGlmICgqdG9rZW4gPT0gRElSRUNUX1JFRkVSRU5DRSkKLSAgICB7Ci0gICAgICBjaGFyICp0b2tlbl9wb3NuID0gdG9rZW4gKyAxOwotICAgICAgaW50IGRpcmVjdF9sYWJlbCA9IDA7Ci0gICAgICBkZWJ1ZyAoIkZvdW5kIGRpcmVjdCByZWZlcmVuY2VcbiIpOwotICAgICAgd2hpbGUgKCp0b2tlbl9wb3NuKQotCXsKLQkgIGlmICghaXNfZGlnaXRfY2hhciAoKnRva2VuX3Bvc24pKQotCSAgICBkaXJlY3RfbGFiZWwgPSAxOwotCSAgdG9rZW5fcG9zbisrOwotCX0KLSAgICAgIGlmIChkaXJlY3RfbGFiZWwpCi0JewotCSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBzZWdUIHJldHZhbDsKLQkgIGRlYnVnICgiRGlyZWN0IHJlZmVyZW5jZSBpcyBhIGxhYmVsXG4iKTsKLQkgIGN1cnJlbnRfb3AtPmRpcmVjdC5sYWJlbCA9IHRva2VuICsgMTsKLQkgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gdG9rZW4gKyAxOwotCSAgZGVidWcgKCJDdXJyZW50IGlucHV0X2xpbmVfcG9pbnRlcjogJXNcbiIsIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICByZXR2YWwgPSBleHByZXNzaW9uICgmY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByKTsKLQkgIGRlYnVnICgiRXhwcmVzc2lvbiB0eXBlOiAlZFxuIiwgY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfb3ApOwotCSAgZGVidWcgKCJFeHByZXNzaW9uIGFkZG51bTogJWRcbiIsIGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX2FkZF9udW1iZXIpOwotCSAgZGVidWcgKCJTZWdtZW50OiAlZFxuIiwgcmV0dmFsKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaWYgKGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBjdXJyZW50X29wLT5kaXJlY3QuYWRkcmVzcyA9IGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX2FkZF9udW1iZXI7Ci0JICAgICAgY3VycmVudF9vcC0+ZGlyZWN0LnJlc29sdmVkID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkZWJ1ZyAoIkRpcmVjdCByZWZlcmVuY2UgaXMgYSBudW1iZXJcbiIpOwotCSAgY3VycmVudF9vcC0+ZGlyZWN0LmFkZHJlc3MgPSBhdG9pICh0b2tlbiArIDEpOwotCSAgY3VycmVudF9vcC0+ZGlyZWN0LnJlc29sdmVkID0gMTsKLQl9Ci0gICAgICBjdXJyZW50X29wLT5vcF90eXBlID0gRGlyZWN0OwotICAgIH0KLSAgZWxzZSBpZiAoKnRva2VuID09IElORElSRUNUX1JFRkVSRU5DRSkKLSAgICB7CQkJCS8qIEluZGlyZWN0IHJlZmVyZW5jZSBvcGVyYW5kICovCi0gICAgICBpbnQgZm91bmRfYXIgPSAwOwotICAgICAgaW50IGZvdW5kX2Rpc3AgPSAwOwotICAgICAgaW50IGFyX251bWJlciA9IC0xOwotICAgICAgaW50IGRpc3BfbnVtYmVyID0gMDsKLSAgICAgIGludCBidWZmZXJfcG9zbiA9IDE7Ci0gICAgICBpbmRfYWRkcl90eXBlICppbmRfYWRkcl9vcDsKLSAgICAgIGRlYnVnICgiRm91bmQgaW5kaXJlY3QgcmVmZXJlbmNlXG4iKTsKLSAgICAgIGluZF9idWZmZXJbMF0gPSAqdG9rZW47Ci0gICAgICBmb3IgKGNvdW50ID0gMTsgY291bnQgPCBzdHJsZW4gKHRva2VuKTsgY291bnQrKykKLQl7CQkJLyogU3RyaXAgb3BlcmFuZCAqLwotCSAgaW5kX2J1ZmZlcltidWZmZXJfcG9zbl0gPSB0b2xvd2VyICgqKHRva2VuICsgY291bnQpKTsKLQkgIGlmICgoKih0b2tlbiArIGNvdW50IC0gMSkgPT0gJ2EnIHx8ICoodG9rZW4gKyBjb3VudCAtIDEpID09ICdBJykgJiYKLQkgICAgICAoKih0b2tlbiArIGNvdW50KSA9PSAncicgfHwgKih0b2tlbiArIGNvdW50KSA9PSAnUicpKQotCSAgICB7Ci0JICAgICAgLyogQVIgcmVmZXJlbmNlIGlzIGZvdW5kLCBzbyBnZXQgaXRzIG51bWJlciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGJ1ZmZlcgotCSAgICAgICAgIHNvIGl0IGNhbiBwYXNzIHRocm91Z2ggaGFzaF9maW5kKCkgKi8KLQkgICAgICBpZiAoZm91bmRfYXIpCi0JCXsKLQkJICBhc19iYWQgKCJNb3JlIHRoYW4gb25lIEFSIHJlZ2lzdGVyIGZvdW5kIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCQkgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgaWYgKCoodG9rZW4gKyBjb3VudCArIDEpIDwgJzAnIHx8ICoodG9rZW4gKyBjb3VudCArIDEpID4gJzcnKQotCQl7Ci0JCSAgYXNfYmFkICgiSWxsZWdhbCBBUiByZWdpc3RlciBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkJICByZXR1cm4gTlVMTDsKLQkJfQotCSAgICAgIGFyX251bWJlciA9ICoodG9rZW4gKyBjb3VudCArIDEpIC0gJzAnOwotCSAgICAgIGZvdW5kX2FyID0gMTsKLQkgICAgICBjb3VudCsrOwotCSAgICB9Ci0JICBpZiAoKih0b2tlbiArIGNvdW50KSA9PSAnKCcpCi0JICAgIHsKLQkgICAgICAvKiBQYXJlbnRoZXNpcyBmb3VuZCwgc28gY2hlY2sgaWYgYSBkaXNwbGFjZW1lbnQgdmFsdWUgaXMgaW5zaWRlLiAgSWYgc28sIGdldAotCSAgICAgICAgIHRoZSB2YWx1ZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGJ1ZmZlci4gKi8KLQkgICAgICBpZiAoaXNfZGlnaXRfY2hhciAoKih0b2tlbiArIGNvdW50ICsgMSkpKQotCQl7Ci0JCSAgY2hhciBkaXNwWzEwXTsKLQkJICBpbnQgZGlzcF9wb3NuID0gMDsKLQotCQkgIGlmIChmb3VuZF9kaXNwKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJNb3JlIHRoYW4gb25lIGRpc3BsYWNlbWVudCBmb3VuZCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkJICAgICAgcmV0dXJuIE5VTEw7Ci0JCSAgICB9Ci0JCSAgY291bnQrKzsKLQkJICB3aGlsZSAoKih0b2tlbiArIGNvdW50KSAhPSAnKScpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghaXNfZGlnaXRfY2hhciAoKih0b2tlbiArIGNvdW50KSkpCi0JCQl7Ci0JCQkgIGFzX2JhZCAoIkludmFsaWQgZGlzcGxhY2VtZW50IGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCQkJICByZXR1cm4gTlVMTDsKLQkJCX0KLQkJICAgICAgZGlzcFtkaXNwX3Bvc24rK10gPSAqKHRva2VuICsgKGNvdW50KyspKTsKLQkJICAgIH0KLQkJICBkaXNwW2Rpc3BfcG9zbl0gPSAnXDAnOwotCQkgIGRpc3BfbnVtYmVyID0gYXRvaSAoZGlzcCk7Ci0JCSAgY291bnQtLTsKLQkJICBmb3VuZF9kaXNwID0gMTsKLQkJfQotCSAgICB9Ci0JICBidWZmZXJfcG9zbisrOwotCX0KLSAgICAgIGluZF9idWZmZXJbYnVmZmVyX3Bvc25dID0gJ1wwJzsKLSAgICAgIGlmICghZm91bmRfYXIpCi0JewotCSAgYXNfYmFkICgiQVIgcmVnaXN0ZXIgbm90IGZvdW5kIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgaW5kX2FkZHJfb3AgPSAoaW5kX2FkZHJfdHlwZSAqKSBoYXNoX2ZpbmQgKGluZF9oYXNoLCBpbmRfYnVmZmVyKTsKLSAgICAgIGlmIChpbmRfYWRkcl9vcCkKLQl7Ci0JICBkZWJ1ZyAoIkZvdW5kIGluZGlyZWN0IHJlZmVyZW5jZTogJXNcbiIsIGluZF9hZGRyX29wLT5zeW50YXgpOwotCSAgaWYgKGluZF9hZGRyX29wLT5kaXNwbGFjZW1lbnQgPT0gSU1QTElFRF9ESVNQKQotCSAgICB7Ci0JICAgICAgZm91bmRfZGlzcCA9IDE7Ci0JICAgICAgZGlzcF9udW1iZXIgPSAxOwotCSAgICB9Ci0JICBlbHNlIGlmICgoaW5kX2FkZHJfb3AtPmRpc3BsYWNlbWVudCA9PSBESVNQX1JFUVVJUkVEKSAmJiAhZm91bmRfZGlzcCkKLQkgICAgewotCSAgICAgIC8qIE1heWJlIGFuIGltcGxpZWQgZGlzcGxhY2VtZW50IG9mIDEgYWdhaW4gKi8KLQkgICAgICBhc19iYWQgKCJyZXF1aXJlZCBkaXNwbGFjZW1lbnQgd2Fzbid0IGdpdmVuIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoImlsbGVnYWwgaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBpZiAoZm91bmRfZGlzcCAmJiAoZGlzcF9udW1iZXIgPCAwIHx8IGRpc3BfbnVtYmVyID4gMjU1KSkKLQl7Ci0JICBhc19iYWQgKCJkaXNwbGFjZW1lbnQgbXVzdCBiZSBhbiB1bnNpZ25lZCA4LWJpdCBudW1iZXIiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0Lm1vZCA9IGluZF9hZGRyX29wLT5tb2RmaWVsZDsKLSAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0LmRpc3AgPSBkaXNwX251bWJlcjsKLSAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0LkFSbnVtID0gYXJfbnVtYmVyOwotICAgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IEluZGlyZWN0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZyAqcmVnb3AgPSAocmVnICopIGhhc2hfZmluZCAocmVnX2hhc2gsIHRva2VuKTsKLSAgICAgIGlmIChyZWdvcCkKLQl7Ci0JICBkZWJ1ZyAoIkZvdW5kIHJlZ2lzdGVyIG9wZXJhbmQ6ICVzXG4iLCByZWdvcC0+bmFtZSk7Ci0JICBpZiAocmVnb3AtPnJlZ3R5cGUgPT0gUkVHX0FSbikKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IEFSbjsKLQkgIGVsc2UgaWYgKHJlZ29wLT5yZWd0eXBlID09IFJFR19SbikKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IFJuOwotCSAgZWxzZSBpZiAocmVnb3AtPnJlZ3R5cGUgPT0gUkVHX0RQKQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gRFBSZWc7Ci0JICBlbHNlCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBPdGhlclJlZzsKLQkgIGN1cnJlbnRfb3AtPnJlZy5vcGNvZGUgPSByZWdvcC0+b3Bjb2RlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCp0b2tlbikgfHwgKih0b2tlbiArIDEpID09ICd4JyB8fCBzdHJjaHIgKHRva2VuLCAnaCcpKQotCSAgICB7Ci0JICAgICAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgc2VnVCByZXR2YWw7Ci0JICAgICAgZGVidWcgKCJQcm9iYWJseSBhIGxhYmVsOiAlc1xuIiwgdG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuICh0b2tlbikgKyAxKTsKLQkgICAgICBzdHJjcHkgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCwgdG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbFtzdHJsZW4gKHRva2VuKV0gPSAnXDAnOwotCSAgICAgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRva2VuOwotCSAgICAgIGRlYnVnICgiQ3VycmVudCBpbnB1dF9saW5lX3BvaW50ZXI6ICVzXG4iLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgICAgIHJldHZhbCA9IGV4cHJlc3Npb24gKCZjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIpOwotCSAgICAgIGRlYnVnICgiRXhwcmVzc2lvbiB0eXBlOiAlZFxuIiwgY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfb3ApOwotCSAgICAgIGRlYnVnICgiRXhwcmVzc2lvbiBhZGRudW06ICVkXG4iLCBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkgICAgICBkZWJ1ZyAoIlNlZ21lbnQ6ICVkXG4iLCByZXR2YWwpOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnNfbnVtYmVyID0gY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfYWRkX251bWJlcjsKLQkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPSAodW5zaWduZWQgaW50KSBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5yZXNvbHZlZCA9IDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY291bnQ7Ci0JICAgICAgZGVidWcgKCJGb3VuZCBhIG51bWJlciBvciBkaXNwbGFjZW1lbnRcbiIpOwotCSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN0cmxlbiAodG9rZW4pOyBjb3VudCsrKQotCQlpZiAoKih0b2tlbiArIGNvdW50KSA9PSAnLicpCi0JCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQgPSAxOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuICh0b2tlbikgKyAxKTsKLQkgICAgICBzdHJjcHkgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCwgdG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbFtzdHJsZW4gKHRva2VuKV0gPSAnXDAnOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5mX251bWJlciA9IChmbG9hdCkgYXRvZiAodG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5zX251bWJlciA9IChpbnQpIGF0b2kgKHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPSAodW5zaWduZWQgaW50KSBhdG9pICh0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnJlc29sdmVkID0gMTsKLQkgICAgfQotCSAgY3VycmVudF9vcC0+b3BfdHlwZSA9IERpc3AgfCBBYnMyNCB8IEltbTE2IHwgSW1tMjQ7Ci0JICBpZiAoY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyID49IDAgJiYgY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyIDw9IDMxKQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlIHw9IElWZWN0b3I7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGN1cnJlbnRfb3A7Ci19Ci0KLS8qIG5leHRfbGluZSBwb2ludHMgdG8gdGhlIG5leHQgbGluZSBhZnRlciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiAoY3VycmVudF9saW5lKS4KLSAgIFNlYXJjaCBmb3IgdGhlIHBhcmFsbGVsIGJhcnMsIGFuZCBpZiBmb3VuZCwgbWVyZ2UgdHdvIGxpbmVzIGludG8gaW50ZXJuYWwgc3ludGF4Ci0gICBmb3IgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbjoKLSAgIHFfW0lOU04xXV9bSU5TTjJdIFtPUEVSQU5EUzFdIHwgW09QRVJBTkRTMl0KLSAgIEJ5IHRoaXMgc3RhZ2UsIGFsbCBjb21tZW50cyBhcmUgc2NydWJiZWQsIGFuZCBvbmx5IHRoZSBiYXJlIGxpbmVzIGFyZSBnaXZlbi4KLSAqLwotCi0jZGVmaW5lIE5PTkUgICAgICAgICAgIDAKLSNkZWZpbmUgU1RBUlRfT1BDT0RFICAgMQotI2RlZmluZSBFTkRfT1BDT0RFICAgICAyCi0jZGVmaW5lIFNUQVJUX09QRVJBTkRTIDMKLSNkZWZpbmUgRU5EX09QRVJBTkRTICAgNAotCi1jaGFyICoKLXRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbiAoY3VycmVudF9saW5lLCBuZXh0X2xpbmUpCi0gICAgIGNoYXIgKmN1cnJlbnRfbGluZTsKLSAgICAgY2hhciAqbmV4dF9saW5lOwotewotICBpbnQgZm91bmRfcGFyYWxsZWwgPSAwOwotICBjaGFyIGZpcnN0X29wY29kZVsyNTZdOwotICBjaGFyIHNlY29uZF9vcGNvZGVbMjU2XTsKLSAgY2hhciBmaXJzdF9vcGVyYW5kc1syNTZdOwotICBjaGFyIHNlY29uZF9vcGVyYW5kc1syNTZdOwotICBjaGFyICpwYXJhbGxlbF9pbnNuOwotCi0gIGRlYnVnICgiSW4gdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuKClcbiIpOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyhpbnQpICpuZXh0X2xpbmVdKQotICAgIHsKLSAgICAgIGlmICgqbmV4dF9saW5lID09IFBBUkFMTEVMX1NFUEFSQVRPUiAmJiAqKG5leHRfbGluZSArIDEpID09IFBBUkFMTEVMX1NFUEFSQVRPUikKLQl7Ci0JICBmb3VuZF9wYXJhbGxlbCA9IDE7Ci0JICBuZXh0X2xpbmUrKzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIG5leHRfbGluZSsrOwotICAgIH0KLSAgaWYgKCFmb3VuZF9wYXJhbGxlbCkKLSAgICByZXR1cm4gTlVMTDsKLSAgZGVidWcgKCJGb3VuZCBhIHBhcmFsbGVsIGluc3RydWN0aW9uXG4iKTsKLSAgewotICAgIGludCBpOwotICAgIGNoYXIgKm9wY29kZSwgKm9wZXJhbmRzLCAqbGluZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICB7Ci0JaWYgKGkgPT0gMCkKLQkgIHsKLQkgICAgb3Bjb2RlID0gJmZpcnN0X29wY29kZVswXTsKLQkgICAgb3BlcmFuZHMgPSAmZmlyc3Rfb3BlcmFuZHNbMF07Ci0JICAgIGxpbmUgPSBjdXJyZW50X2xpbmU7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBvcGNvZGUgPSAmc2Vjb25kX29wY29kZVswXTsKLQkgICAgb3BlcmFuZHMgPSAmc2Vjb25kX29wZXJhbmRzWzBdOwotCSAgICBsaW5lID0gbmV4dF9saW5lOwotCSAgfQotCXsKLQkgIGludCBzZWFyY2hfc3RhdHVzID0gTk9ORTsKLQkgIGludCBjaGFyX3B0ciA9IDA7Ci0JICBjaGFyIGM7Ci0KLQkgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKGludCkgKGMgPSAqbGluZSldICYmICpsaW5lKQotCSAgICB7Ci0JICAgICAgaWYgKGlzX29wY29kZV9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IE5PTkUpCi0JCXsKLQkJICBvcGNvZGVbY2hhcl9wdHIrK10gPSB0b2xvd2VyIChjKTsKLQkJICBzZWFyY2hfc3RhdHVzID0gU1RBUlRfT1BDT0RFOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaXNfb3Bjb2RlX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gU1RBUlRfT1BDT0RFKQotCQl7Ci0JCSAgb3Bjb2RlW2NoYXJfcHRyKytdID0gdG9sb3dlciAoYyk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICghaXNfb3Bjb2RlX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gU1RBUlRfT1BDT0RFKQotCQl7Ci0JCSAgb3Bjb2RlW2NoYXJfcHRyXSA9ICdcMCc7Ci0JCSAgY2hhcl9wdHIgPSAwOwotCQkgIHNlYXJjaF9zdGF0dXMgPSBFTkRfT1BDT0RFOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaXNfb3BlcmFuZF9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IFNUQVJUX09QRVJBTkRTKQotCQl7Ci0JCSAgb3BlcmFuZHNbY2hhcl9wdHIrK10gPSBjOwotCQl9Ci0JICAgICAgaWYgKGlzX29wZXJhbmRfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBFTkRfT1BDT0RFKQotCQl7Ci0JCSAgb3BlcmFuZHNbY2hhcl9wdHIrK10gPSBjOwotCQkgIHNlYXJjaF9zdGF0dXMgPSBTVEFSVF9PUEVSQU5EUzsKLQkJfQotCSAgICAgIGxpbmUrKzsKLQkgICAgfQotCSAgaWYgKHNlYXJjaF9zdGF0dXMgIT0gU1RBUlRfT1BFUkFORFMpCi0JICAgIHJldHVybiBOVUxMOwotCSAgb3BlcmFuZHNbY2hhcl9wdHJdID0gJ1wwJzsKLQl9Ci0gICAgICB9Ci0gIH0KLSAgcGFyYWxsZWxfaW5zbiA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChmaXJzdF9vcGNvZGUpICsgc3RybGVuIChmaXJzdF9vcGVyYW5kcykgKwotCQkgICAgIHN0cmxlbiAoc2Vjb25kX29wY29kZSkgKyBzdHJsZW4gKHNlY29uZF9vcGVyYW5kcykgKyA4KTsKLSAgc3ByaW50ZiAocGFyYWxsZWxfaW5zbiwgInFfJXNfJXMgJXMgfCAlcyIsIGZpcnN0X29wY29kZSwgc2Vjb25kX29wY29kZSwgZmlyc3Rfb3BlcmFuZHMsIHNlY29uZF9vcGVyYW5kcyk7Ci0gIGRlYnVnICgicGFyYWxsZWwgaW5zbiA9ICVzXG4iLCBwYXJhbGxlbF9pbnNuKTsKLSAgcmV0dXJuIHBhcmFsbGVsX2luc247Ci19Ci0KLSN1bmRlZiBOT05FCi0jdW5kZWYgU1RBUlRfT1BDT0RFCi0jdW5kZWYgRU5EX09QQ09ERQotI3VuZGVmIFNUQVJUX09QRVJBTkRTCi0jdW5kZWYgRU5EX09QRVJBTkRTCi0KLS8qIEluIG9yZGVyIHRvIGdldCBnYXMgdG8gaWdub3JlIGFueSB8IGNoYXJzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUsCi0gICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhIHwgaXMgZm91bmQgaW4gYSBsaW5lLiAqLwotCi1pbnQKLXRpYzMwX3VucmVjb2duaXplZF9saW5lIChjKQotICAgICBpbnQgYzsKLXsKLSAgZGVidWcgKCJJbiB0Y191bnJlY29nbml6ZWRfbGluZVxuIik7Ci0gIHJldHVybiAoYyA9PSBQQVJBTExFTF9TRVBBUkFUT1IpOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIGRlYnVnICgiSW4gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKVxuIik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgZGVidWcgKCJJbiBtZF9jb252ZXJ0X2ZyYWcoKVxuIik7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxQKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbFA7Ci17Ci0gIHZhbHVlVCB2YWx1ZSA9ICp2YWxQOwotCi0gIGRlYnVnICgiSW4gbWRfYXBwbHlfZml4KCkgd2l0aCB2YWx1ZSA9ICVsZFxuIiwgKGxvbmcpIHZhbHVlKTsKLSAgZGVidWcgKCJWYWx1ZXMgaW4gZml4UFxuIik7Ci0gIGRlYnVnICgiZnhfc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKLSAgZGVidWcgKCJmeF9wY3JlbCA9ICVkXG4iLCBmaXhQLT5meF9wY3JlbCk7Ci0gIGRlYnVnICgiZnhfd2hlcmUgPSAlZFxuIiwgZml4UC0+Znhfd2hlcmUpOwotICBkZWJ1ZyAoImZ4X29mZnNldCA9ICVkXG4iLCAoaW50KSBmaXhQLT5meF9vZmZzZXQpOwotICB7Ci0gICAgY2hhciAqYnVmID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICAgIHZhbHVlIC89IElOU05fU0laRTsKLSAgICBpZiAoZml4UC0+Znhfc2l6ZSA9PSAxKQotICAgICAgewkJCQkvKiBTcGVjaWFsIGZpeCBmb3IgTERQIGluc3RydWN0aW9uLiAqLwotCXZhbHVlID0gKHZhbHVlICYgMHgwMEZGMDAwMCkgPj4gMTY7Ci0gICAgICB9Ci0gICAgZGVidWcgKCJuZXcgdmFsdWUgPSAlbGRcbiIsIChsb25nKSB2YWx1ZSk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBmaXhQLT5meF9zaXplKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgaW50IGk7Ci0KLSAgZGVidWcgKCJJbiBtZF9wYXJzZV9vcHRpb24oKVxuIik7Ci0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgcHJpbnRmICgiJWNcbiIsIGFyZ1tjXSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGRlYnVnICgiSW4gbWRfc2hvd191c2FnZSgpXG4iKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBkZWJ1ZyAoIkluIG1kX3VuZGVmaW5lZF9zeW1ib2woKVxuIik7Ci0gIHJldHVybiAoc3ltYm9sUyAqKSAwOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGRlYnVnICgiSW4gbWRfc2VjdGlvbl9hbGlnbigpIHNlZ21lbnQgPSAlZCBhbmQgc2l6ZSA9ICVkXG4iLCBzZWdtZW50LCBzaXplKTsKLSAgc2l6ZSA9IChzaXplICsgMykgLyA0OwotICBzaXplICo9IDQ7Ci0gIGRlYnVnICgiTmV3IHNpemUgdmFsdWUgPSAlZFxuIiwgc2l6ZSk7Ci0gIHJldHVybiBzaXplOwotfQotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpbnQgb2Zmc2V0OwotCi0gIGRlYnVnICgiSW4gbWRfcGNyZWxfZnJvbSgpXG4iKTsKLSAgZGVidWcgKCJmeF93aGVyZSA9ICVkXG4iLCBmaXhQLT5meF93aGVyZSk7Ci0gIGRlYnVnICgiZnhfc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKLSAgLyogRmluZCB0aGUgb3Bjb2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpbiB0aGUgZnJfbGl0ZXJhbAotICAgICBzdG9yYWdlIGFyZWEsIGFuZCBjaGVjayBiaXQgMjEuICBCaXQgMjEgY29udGFpbnMgd2hldGhlciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbgotICAgICBpcyBhIGRlbGF5ZWQgb25lIG9yIG5vdCwgYW5kIHRoZW4gc2V0IHRoZSBvZmZzZXQgdmFsdWUgYXBwcm9wcmlhdGVseS4gKi8KLSAgaWYgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWxbZml4UC0+Znhfd2hlcmUgLSBmaXhQLT5meF9zaXplICsgMV0gJiAweDIwKQotICAgIG9mZnNldCA9IDM7Ci0gIGVsc2UKLSAgICBvZmZzZXQgPSAxOwotICBkZWJ1ZyAoIm9mZnNldCA9ICVkXG4iLCBvZmZzZXQpOwotICAvKiBQQyBSZWxhdGl2ZSBpbnN0cnVjdGlvbnMgaGF2ZSBhIGZvcm1hdDoKLSAgICAgZGlzcGxhY2VtZW50ID0gTGFiZWwgLSAoUEMgKyBvZmZzZXQpCi0gICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBQQyArIG9mZnNldCB3aGVyZToKLSAgICAgZnhfd2hlcmUgLSBmeF9zaXplID0gUEMKLSAgICAgSU5TTl9TSVpFICogb2Zmc2V0ID0gb2Zmc2V0IG51bWJlciBvZiBpbnN0cnVjdGlvbnMKLSAgICovCi0gIHJldHVybiBmaXhQLT5meF93aGVyZSAtIGZpeFAtPmZ4X3NpemUgKyAoSU5TTl9TSVpFICogb2Zmc2V0KTsKLX0KLQotY2hhciAqCi1tZF9hdG9mICh3aGF0X3N0YXRlbWVudF90eXBlLCBsaXRlcmFsUCwgc2l6ZVApCi0gICAgIGludCB3aGF0X3N0YXRlbWVudF90eXBlOwotICAgICBjaGFyICpsaXRlcmFsUDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIGNoYXIgKnRva2VuOwotICBjaGFyIGtlZXB2YWw7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIC8qICBjaGFyICphdG9mX2llZWUgKCk7ICovCi0gIGZsb2F0IGZsb2F0X3ZhbHVlOwotICBkZWJ1ZyAoIkluIG1kX2F0b2YoKVxuIik7Ci0gIGRlYnVnICgicHJlY2lzaW9uID0gJWNcbiIsIHdoYXRfc3RhdGVtZW50X3R5cGUpOwotICBkZWJ1ZyAoImxpdGVyYWwgPSAlc1xuIiwgbGl0ZXJhbFApOwotICBkZWJ1ZyAoImxpbmUgPSAiKTsKLSAgdG9rZW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkKSAqaW5wdXRfbGluZV9wb2ludGVyXSAmJiAoKmlucHV0X2xpbmVfcG9pbnRlcikgJiYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKSkKLSAgICB7Ci0gICAgICBkZWJ1ZyAoIiVjIiwgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGtlZXB2YWwgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLSAgZGVidWcgKCJcbiIpOwotICBmbG9hdF92YWx1ZSA9IChmbG9hdCkgYXRvZiAodG9rZW4pOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0ga2VlcHZhbDsKLSAgZGVidWcgKCJmbG9hdF92YWx1ZSA9ICVmXG4iLCBmbG9hdF92YWx1ZSk7Ci0gIHN3aXRjaCAod2hhdF9zdGF0ZW1lbnRfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSI7Ci0gICAgfQotICBpZiAoZmxvYXRfdmFsdWUgPT0gMC4wKQotICAgIHsKLSAgICAgIHZhbHVlID0gKHByZWMgPT0gMikgPyAweDAwMDA4MDAwTCA6IDB4ODAwMDAwMDBMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXhwLCBzaWduLCBtYW50LCB0bXNmbG9hdDsKLSAgICAgIHRtc2Zsb2F0ID0gKigobG9uZyAqKSAmZmxvYXRfdmFsdWUpOwotICAgICAgc2lnbiA9IHRtc2Zsb2F0ICYgMHg4MDAwMDAwMDsKLSAgICAgIG1hbnQgPSB0bXNmbG9hdCAmIDB4MDA3RkZGRkY7Ci0gICAgICBleHAgPSB0bXNmbG9hdCAmIDB4N0Y4MDAwMDA7Ci0gICAgICBleHAgPDw9IDE7Ci0gICAgICBpZiAoZXhwID09IDB4RkYwMDAwMDApCi0JewotCSAgaWYgKG1hbnQgPT0gMCkKLQkgICAgdmFsdWUgPSAweDdGN0ZGRkZGOwotCSAgZWxzZSBpZiAoc2lnbiA9PSAwKQotCSAgICB2YWx1ZSA9IDB4N0Y3RkZGRkY7Ci0JICBlbHNlCi0JICAgIHZhbHVlID0gMHg3RjgwMDAwMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwIC09IDB4N0YwMDAwMDA7Ci0JICBpZiAoc2lnbikKLQkgICAgewotCSAgICAgIG1hbnQgPSBtYW50ICYgMHgwMDdGRkZGRjsKLQkgICAgICBtYW50ID0gLW1hbnQ7Ci0JICAgICAgbWFudCA9IG1hbnQgJiAweDAwRkZGRkZGOwotCSAgICAgIGlmIChtYW50ID09IDApCi0JCXsKLQkJICBtYW50IHw9IDB4MDA4MDAwMDA7Ci0JCSAgZXhwID0gKGxvbmcpIGV4cCAtIDB4MDEwMDAwMDA7Ci0JCX0KLQkgICAgfQotCSAgdG1zZmxvYXQgPSBleHAgfCBtYW50OwotCSAgdmFsdWUgPSB0bXNmbG9hdDsKLQl9Ci0gICAgICBpZiAocHJlYyA9PSAyKQotCXsKLQkgIGxvbmcgZXhwLCBtYW50OwotCi0JICBpZiAodG1zZmxvYXQgPT0gMHg4MDAwMDAwMCkKLQkgICAgewotCSAgICAgIHZhbHVlID0gMHg4MDAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IDA7Ci0JICAgICAgZXhwID0gKHRtc2Zsb2F0ICYgMHhGRjAwMDAwMCk7Ci0JICAgICAgZXhwID4+PSAyNDsKLQkgICAgICBtYW50ID0gdG1zZmxvYXQgJiAweDAwN0ZGRkZGOwotCSAgICAgIGlmICh0bXNmbG9hdCAmIDB4MDA4MDAwMDApCi0JCXsKLQkJICBtYW50IHw9IDB4RkYwMDAwMDA7Ci0JCSAgbWFudCArPSAweDAwMDAwODAwOwotCQkgIG1hbnQgPj49IDEyOwotCQkgIG1hbnQgfD0gMHgwMDAwMDgwMDsKLQkJICBtYW50ICY9IDB4MEZGRjsKLQkJICBpZiAoZXhwID4gNykKLQkJICAgIHZhbHVlID0gMHg3ODAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbWFudCB8PSAweDAwODAwMDAwOwotCQkgIG1hbnQgKz0gMHgwMDAwMDgwMDsKLQkJICBleHAgKz0gKG1hbnQgPj4gMjQpOwotCQkgIG1hbnQgPj49IDEyOwotCQkgIG1hbnQgJj0gMHgwN0ZGOwotCQkgIGlmIChleHAgPiA3KQotCQkgICAgdmFsdWUgPSAweDc3RkY7Ci0JCX0KLQkgICAgICBpZiAoZXhwIDwgLTgpCi0JCXZhbHVlID0gMHg4MDAwOwotCSAgICAgIGlmICh2YWx1ZSA9PSAwKQotCQl7Ci0JCSAgbWFudCA9IChleHAgPDwgMTIpIHwgbWFudDsKLQkJICB2YWx1ZSA9IG1hbnQgJiAweEZGRkY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsIHZhbHVlLCBwcmVjKTsKLSAgKnNpemVQID0gcHJlYzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGRlYnVnICgiSW4gbWRfbnVtYmVyX3RvX2NoYXJzKClcbiIpOwotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIC8qICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuKGJ1Zix2YWwsbik7ICovCi19Ci0KLSNkZWZpbmUgRihTWixQQ1JFTCkJCSgoKFNaKSA8PCAxKSArIChQQ1JFTCkpCi0jZGVmaW5lIE1BUChTWixQQ1JFTCxUWVBFKQljYXNlIEYoU1osUENSRUwpOiBjb2RlID0gKFRZUEUpOyBicmVhawotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4UCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUgPSAwOwotCi0gIGRlYnVnICgiSW4gdGNfZ2VuX3JlbG9jKClcbiIpOwotICBkZWJ1ZyAoImZpeFAuc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKLSAgZGVidWcgKCJmaXhQLnBjcmVsID0gJWRcbiIsIGZpeFAtPmZ4X3BjcmVsKTsKLSAgZGVidWcgKCJhZGRzeS5uYW1lID0gJXNcbiIsIFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KSk7Ci0gIHN3aXRjaCAoRiAoZml4UC0+Znhfc2l6ZSwgZml4UC0+ZnhfcGNyZWwpKQotICAgIHsKLSAgICAgIE1BUCAoMSwgMCwgQkZEX1JFTE9DX1RJQzMwX0xEUCk7Ci0gICAgICBNQVAgKDIsIDAsIEJGRF9SRUxPQ18xNik7Ci0gICAgICBNQVAgKDMsIDAsIEJGRF9SRUxPQ18yNCk7Ci0gICAgICBNQVAgKDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBNQVAgKDQsIDAsIEJGRF9SRUxPQ18zMik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoIkNhbiBub3QgZG8gJWQgYnl0ZSAlc3JlbG9jYXRpb24iLCBmaXhQLT5meF9zaXplLAotCSAgICAgIGZpeFAtPmZ4X3BjcmVsID8gInBjLXJlbGF0aXZlICIgOiAiIik7Ci0gICAgfQotI3VuZGVmIE1BUAotI3VuZGVmIEYKLQotICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgYXNzZXJ0IChyZWwgIT0gMCk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpOwotICByZWwtPmFkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbC0+YWRkZW5kID0gMDsKLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgaWYgKCFyZWwtPmhvd3RvKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBuYW1lID0gU19HRVRfTkFNRSAoZml4UC0+ZnhfYWRkc3kpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQluYW1lID0gIjx1bmtub3duPiI7Ci0gICAgICBhc19mYXRhbCAoIkNhbm5vdCBnZW5lcmF0ZSByZWxvY2F0aW9uIHR5cGUgZm9yIHN5bWJvbCAlcywgY29kZSAlcyIsIG5hbWUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgfQotICByZXR1cm4gcmVsOwotfQotCi12b2lkCi10Y19hb3V0X3ByZV93cml0ZV9ob29rICgpCi17Ci0gIGRlYnVnICgiSW4gdGNfYW91dF9wcmVfd3JpdGVfaG9vaygpXG4iKTsKLX0KLQotdm9pZAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgZGVidWcgKCJJbiBtZF9vcGVyYW5kKClcbiIpOwotfQotCi1jaGFyIG91dHB1dF9pbnZhbGlkX2J1Zls4XTsKLQotY2hhciAqCi1vdXRwdXRfaW52YWxpZCAoYykKLSAgICAgY2hhciBjOwotewotICBpZiAoaXNwcmludCAoYykpCi0gICAgc3ByaW50ZiAob3V0cHV0X2ludmFsaWRfYnVmLCAiJyVjJyIsIGMpOwotICBlbHNlCi0gICAgc3ByaW50ZiAob3V0cHV0X2ludmFsaWRfYnVmLCAiKDB4JXgpIiwgKHVuc2lnbmVkKSBjKTsKLSAgcmV0dXJuIG91dHB1dF9pbnZhbGlkX2J1ZjsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGljMzAuaCBiL2dhcy9jb25maWcvdGMtdGljMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3MmQyZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRpYzMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiB0Yy10aWMzMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy10aWMzMC5jCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfVENfVElDMzBfSF8KLSNkZWZpbmUgX1RDX1RJQzMwX0hfCi0KLSNkZWZpbmUgVENfVElDMzAgMQotCi0jaWZkZWYgT0JKX0FPVVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtdGljMzAiCi0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQVJDSAkJYmZkX2FyY2hfdGljMzAKLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JMQotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotY2hhciAqb3V0cHV0X2ludmFsaWQgUEFSQU1TICgoaW50IGMpKTsKLQotI2RlZmluZSBFTkRfT0ZfSU5TTiAnXDAnCi0jZGVmaW5lIE1BWF9PUEVSQU5EUyA2Ci0jZGVmaW5lIERJUkVDVF9SRUZFUkVOQ0UgJ0AnCi0jZGVmaW5lIElORElSRUNUX1JFRkVSRU5DRSAnKicKLSNkZWZpbmUgUEFSQUxMRUxfU0VQQVJBVE9SICd8JwotI2RlZmluZSBJTlNOX1NJWkUgNAotCi0vKiBEZWZpbmUgdGhpcyB0byAxIGlmIHlvdSB3YW50IHRoZSBkZWJ1ZyBvdXRwdXQgdG8gYmUgb24gc3Rkb3V0LAotICAgb3RoZXJ3aXNlIHN0ZGVyciB3aWxsIGJlIHVzZWQuICBJZiBzdGRlcnIgaXMgdXNlZCwgdGhlcmUgd2lsbCBiZSBhCi0gICBiZXR0ZXIgc3luY2hyb25pc2F0aW9uIHdpdGggdGhlIGFzX2JhZCBvdXRwdXRzLCBidXQgeW91IGNhbid0Ci0gICBjYXB0dXJlIHRoZSBvdXRwdXQuICovCi0jZGVmaW5lIFVTRV9TVERPVVQgMAotCi0jZGVmaW5lIHRjX3VucmVjb2duaXplZF9saW5lIHRpYzMwX3VucmVjb2duaXplZF9saW5lCi0KLWV4dGVybiBpbnQgdGljMzBfdW5yZWNvZ25pemVkX2xpbmUgUEFSQU1TICgoaW50KSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5jIGIvZ2FzL2NvbmZpZy90Yy10aWM4MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzFkYmEzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljODAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjEgKzAsMCBAQAotLyogdGMtdGljODAuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFRJIFRNUzMyMEM4MCAoTVYpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9wY29kZS90aWM4MC5oIgotCi0jZGVmaW5lIGludGVybmFsX2Vycm9yKHdoYXQpIFwKLSAgYXNfZmF0YWwoXygiaW50ZXJuYWwgZXJyb3I6JXM6JWQ6ICVzXG4iKSxfX0ZJTEVfXyxfX0xJTkVfXyx3aGF0KQotI2RlZmluZSBpbnRlcm5hbF9lcnJvcl9hKHdoYXQsYXJnKSBcCi0gIGFzX2ZhdGFsKF8oImludGVybmFsIGVycm9yOiVzOiVkOiAlcyAlZFxuIiksX19GSUxFX18sX19MSU5FX18sd2hhdCxhcmcpCi0KLQwKLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbCB0YXJnZXRzLiAqLwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICI7KiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgc2luZ2xlCi0gICBsaW5lLiBUaGUgc2VtaWNvbG9uIGlzIHN1Y2ggYSBjaGFyYWN0ZXIgYnkgZGVmYXVsdCBhbmQgc2hvdWxkIG5vdCBiZQotICAgZXhwbGljaXRseSBsaXN0ZWQuICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nIAotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCAKLSAgIGFzIGluIDBmMS4wLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkYiOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotCi0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBpbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiAqLwotCi1leHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJhbGlnbiIsCXNfYWxpZ25fYnl0ZXMsCQk0IH0sCS8qIERvIGJ5dGUgYWxpZ25tZW50LCBkZWZhdWx0IGlzIGEgNCBieXRlIGJvdW5kYXJ5ICovCi0gIHsgIndvcmQiLAljb25zLAkJCTQgfSwJLyogRklYTUU6IFNob3VsZCB0aGlzIGJlIG1hY2hpbmUgaW5kZXBlbmRlbnQ/ICovCi0gIHsgImJzcyIsCXNfbGNvbW1fYnl0ZXMsCQkxIH0sCi0gIHsgInNlY3QiLAlvYmpfY29mZl9zZWN0aW9uLAkwfSwJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBUSSB0b29scyAqLwotICB7ICJzZWN0aW9uIiwJb2JqX2NvZmZfc2VjdGlvbiwJMH0sCS8qIFN0YW5kYXJkIENPRkYgLnNlY3Rpb24gcHNldWRvLW9wICovCi0gIHsgTlVMTCwJTlVMTCwJCQkwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0aWM4MF9oYXNoOwotCi1zdGF0aWMgc3RydWN0IHRpYzgwX29wY29kZSAqIGZpbmRfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCB0aWM4MF9vcGNvZGUgKiwgZXhwcmVzc2lvblMgW10pKTsKLXN0YXRpYyB2b2lkIGJ1aWxkX2luc24gUEFSQU1TICgoc3RydWN0IHRpYzgwX29wY29kZSAqLCBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgaW50IGdldF9vcGVyYW5kcyBQQVJBTVMgKChleHByZXNzaW9uUyBleHBbXSkpOwotc3RhdGljIGludCBjb25zdF9vdmVyZmxvdyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG51bSwgaW50IGJpdHMsIGludCBmbGFncykpOwotCi0vKiBSZXBsYWNlIHNob3J0IFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyB3aXRoIGxvbmcgZm9ybSB3aGVuIG5lY2Vzc2FyeS4gIEN1cnJlbnRseQotICAgdGhpcyBpcyBvZmYgYnkgZGVmYXVsdCBvciB3aGVuIGdpdmVuIHRoZSAtbm8tcmVsYXggb3B0aW9uLiAgVHVybmluZyBpdCBvbiBieSB1c2luZwotICAgdGhlIC1yZWxheCBvcHRpb24gZm9yY2VzIGFsbCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgdG8gdXNlIHRoZSBsb25nIGZvcm0sIHdoaWNoCi0gICBpcyB3aHkgaXQgaXMgY3VycmVudGx5IG5vdCB0aGUgZGVmYXVsdC4gKi8KLXN0YXRpYyBpbnQgdGljODBfcmVsYXggPSAwOwotCi0MCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBpbnRlcm5hbF9lcnJvciAoXygiUmVsYXhhdGlvbiBpcyBhIGx1eHVyeSB3ZSBjYW4ndCBhZmZvcmQiKSk7Ci0gIHJldHVybiAoLTEpOwotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUyA0Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLSAgCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiAoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgICB9Ci0gIAotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIAotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBjb25zdGFudCB2YWx1ZSBpbiBOVU0gd2lsbCBmaXQgaW4gYSBmaWVsZCBvZgotICAgd2lkdGggQklUUyBpZiBpdCBoYXMgZmxhZ3MgRkxBR1MuICovCi0KLXN0YXRpYyBpbnQKLWNvbnN0X292ZXJmbG93IChudW0sIGJpdHMsIGZsYWdzKQotICAgICB1bnNpZ25lZCBsb25nIG51bTsKLSAgICAgaW50IGJpdHM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgbG9uZyBtaW4sIG1heDsKLSAgaW50IHJldHZhbCA9IDA7Ci0KLSAgLyogT25seSBuZWVkIHRvIGNoZWNrIGZpZWxkcyBsZXNzIHRoYW4gMzIgYml0cyB3aWRlICovCi0gIGlmIChiaXRzIDwgMzIpCi0gICAgaWYgKGZsYWdzICYgVElDODBfT1BFUkFORF9TSUdORUQpCi0gICAgICB7Ci0JbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOyAKLQltaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOyAgCi0JcmV0dmFsID0gKChsb25nKSBudW0gPiBtYXgpIHx8ICgobG9uZykgbnVtIDwgbWluKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JbWF4ID0gKDEgPDwgYml0cykgLSAxOwotCW1pbiA9IDA7Ci0JcmV0dmFsID0gKG51bSA+IG1heCkgfHwgKG51bSA8IG1pbik7Ci0gICAgICB9Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQotLyogZ2V0X29wZXJhbmRzKCkgcGFyc2VzIGEgc3RyaW5nIG9mIG9wZXJhbmRzIGFuZCBmaWxscyBpbiBhIHBhc3NlZCBhcnJheSBvZgotICAgZXhwcmVzc2lvbnMgaW4gRVhQLgotCi0gICBOb3RlIHRoYXQgd2UgdXNlIE9fYWJzZW50IGV4cHJlc3Npb25zIHRvIHJlY29yZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICBhYm91dCB0aGUgcHJldmlvdXMgbm9uLU9fYWJzZW50IGV4cHJlc3Npb24sIHN1Y2ggYXMgIjptIiBvciAiOnMiCi0gICBtb2RpZmllcnMgb3IgcmVnaXN0ZXIgbnVtYmVycyBlbmNsb3NlZCBpbiBwYXJlbnMgbGlrZSAiKHIxMCkiLgotCi0gICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgdGhhdCB3ZXJlIHBsYWNlZCBpbiBFWFAuCi0KLSAgICovCi0KLXN0YXRpYyBpbnQKLWdldF9vcGVyYW5kcyAoZXhwKSAKLSAgICAgZXhwcmVzc2lvblMgZXhwW107Ci17Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBudW1leHAgPSAwOwotICBpbnQgbWZsYWcgPSAwOwotICBpbnQgc2ZsYWcgPSAwOwotICBpbnQgcGFyZW5zID0gMDsKLQotICB3aGlsZSAoKnApICAKLSAgICB7Ci0gICAgICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCi0JewotCSAgcCsrOwotCX0KLQotICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW55IG9wZXJhbmRzIGxlZnQgdG8gcGFyc2UgKi8KLSAgICAgIGlmICgqcCA9PSAwIHx8ICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJykgCi0JewotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICAvKiBOb3RpY2Ugc2NhbGluZyBvciBkaXJlY3QgbWVtb3J5IG9wZXJhbmQgbW9kaWZpZXJzIGFuZCBzYXZlIHRoZW0gaW4KLQkgYW4gT19hYnNlbnQgZXhwcmVzc2lvbiBhZnRlciB0aGUgZXhwcmVzc2lvbiB0aGF0IHRoZXkgbW9kaWZ5LiAqLwotCi0gICAgICBpZiAoKnAgPT0gJzonKSAKLQl7Ci0JICBwKys7Ci0JICBleHBbbnVtZXhwXS5YX29wID0gT19hYnNlbnQ7Ci0JICBpZiAoKnAgPT0gJ20nKSAKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICAvKiBUaGlzIGlzIGEgIjptIiBtb2RpZmllciAqLwotCSAgICAgIGV4cFtudW1leHBdLlhfYWRkX251bWJlciA9IFRJQzgwX09QRVJBTkRfTV9TSSB8IFRJQzgwX09QRVJBTkRfTV9MSTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnAgPT0gJ3MnKQotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIC8qIFRoaXMgaXMgYSAiOnMiIG1vZGlmaWVyICovCi0JICAgICAgZXhwW251bWV4cF0uWF9hZGRfbnVtYmVyID0gVElDODBfT1BFUkFORF9TQ0FMRUQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiJzonIG5vdCBmb2xsb3dlZCBieSAnbScgb3IgJ3MnIikpOwotCSAgICB9Ci0JICBudW1leHArKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSGFuZGxlIGxlYWRpbmcgJygnIG9uIG9wZXJhbmRzIHRoYXQgdXNlIHRoZW0sIGJ5IHJlY29yZGluZyB0aGF0IHdlCi0JIGhhdmUgZW50ZXJlZCBhIHBhcmVuIG5lc3RpbmcgbGV2ZWwgYW5kIHRoZW4gY29udGludWluZy4gIFdlIGNvbXBsYWluCi0JIGFib3V0IG11bHRpcGxlIG5lc3RpbmcuICovCi0KLSAgICAgIGlmICgqcCA9PSAnKCcpCi0JewotCSAgaWYgKCsrcGFyZW5zICE9IDEpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInBhcmVuIG5lc3RpbmciKSk7Ci0JICAgIH0KLQkgIHArKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSGFuZGxlIHRyYWlsaW5nICcpJyBvbiBvcGVyYW5kcyB0aGF0IHVzZSB0aGVtLCBieSByZWR1Y2luZyB0aGUKLQkgbmVzdGluZyBsZXZlbCBhbmQgdGhlbiBjb250aW51aW5nLiAgV2UgY29tcGxhaW4gaWYgdGhlcmUgd2VyZSB0b28KLQkgbWFueSBjbG9zdXJlcy4gKi8KLQotICAgICAgaWYgKCpwID09ICcpJykgCi0JewotCSAgLyogUmVjb3JkIHRoYXQgd2UgaGF2ZSBsZWZ0IGEgcGFyZW4gZ3JvdXAgYW5kIGNvbnRpbnVlICovCi0JICBpZiAoLS1wYXJlbnMgPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJtaXNtYXRjaGVkIHBhcmVudGhlc2lzIikpOwotCSAgICB9Ci0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEJlZ2luIG9wZXJhbmQgcGFyc2luZyBhdCB0aGUgY3VycmVudCBzY2FuIHBvaW50LiAqLwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgICAgZXhwcmVzc2lvbiAoJmV4cFtudW1leHBdKTsKLQotICAgICAgaWYgKGV4cFtudW1leHBdLlhfb3AgPT0gT19pbGxlZ2FsKQotCXsKLQkgIGFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cFtudW1leHBdLlhfb3AgPT0gT19hYnNlbnQpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0JfQotCi0gICAgICBudW1leHArKzsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGlmIChwYXJlbnMpCi0gICAgewotICAgICAgZXhwW251bWV4cF0uWF9vcCA9IE9fYWJzZW50OwotICAgICAgZXhwW251bWV4cCsrXS5YX2FkZF9udW1iZXIgPSBUSUM4MF9PUEVSQU5EX1BBUkVOUzsKLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgZW5kIG9mIHRoZSB2YWxpZCBvcGVyYW5kcyB3aXRoIGFuIGlsbGVnYWwgZXhwcmVzc2lvbi4gKi8KLSAgZXhwW251bWV4cF0uWF9vcCA9IE9faWxsZWdhbDsKLQotICByZXR1cm4gKG51bWV4cCk7Ci19Ci0KLS8qIGZpbmRfb3Bjb2RlKCkgZ2V0cyBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUgdGhhdAotICAgbWF0Y2hlcyB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYXNzZW1ibGVkLCBvciByZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBtYXRjaAotICAgaXMgZm91bmQuCi0KLSAgIEZpcnN0IGl0IHBhcnNlcyBhbGwgdGhlIG9wZXJhbmRzIGFuZCBzYXZlIHRoZW0gYXMgZXhwcmVzc2lvbnMuICBOb3RlIHRoYXQKLSAgIHdlIHVzZSBPX2Fic2VudCBleHByZXNzaW9ucyB0byByZWNvcmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAgIHByZXZpb3VzIG5vbi1PX2Fic2VudCBleHByZXNzaW9uLCBzdWNoIGFzICI6bSIgb3IgIjpzIiBtb2RpZmllcnMgb3IKLSAgIHJlZ2lzdGVyIG51bWJlcnMgZW5jbG9zZWQgaW4gcGFyZW5zIGxpa2UgIihyMTApIi4KLQotICAgSXQgdGhlbiBsb29rcyBhdCBhbGwgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHVzZXMgdGhlIG9wZXJhbmRzIHRvCi0gICBjaG9vc2UgdGhlIGNvcnJlY3Qgb3Bjb2RlLiAgKi8KLQotc3RhdGljIHN0cnVjdCB0aWM4MF9vcGNvZGUgKgotZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpCi0gICAgIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKLSAgICAgZXhwcmVzc2lvblMgbXlvcHNbXTsKLXsKLSAgaW50IG51bWV4cDsJCQkJLyogTnVtYmVyIG9mIGV4cHJlc3Npb25zIGZyb20gcGFyc2luZyBvcGVyYW5kcyAqLwotICBpbnQgZXhwaTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBleHByZXNzaW9uIHRvIG1hdGNoICovCi0gIGludCBvcGk7CQkJCS8qIEluZGV4IG9mIGN1cnJlbnQgb3BlcmFuZCB0byBtYXRjaCAqLwotICBpbnQgbWF0Y2ggPSAwOwkJCS8qIFNldCB0byAxIHdoZW4gYW4gb3BlcmFuZCBtYXRjaCBpcyBmb3VuZCAqLwotICBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGMgPSBvcGNvZGU7CS8qIFBvaW50ZXIgdG8gY3VycmVudCBvcGNvZGUgdGFibGUgZW50cnkgKi8KLSAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqZW5kOwkvKiBQb2ludGVyIHRvIGVuZCBvZiBvcGNvZGUgdGFibGUgKi8KLQotICAvKiBGaXJzdCBwYXJzZSBhbGwgdGhlIG9wZXJhbmRzIHNvIHdlIG9ubHkgaGF2ZSB0byBkbyBpdCBvbmNlLiAgVGhlcmUgbWF5Ci0gICAgIGJlIG1vcmUgZXhwcmVzc2lvbnMgZ2VuZXJhdGVkIHRoYW4gdGhlcmUgYXJlIG9wZXJhbmRzLiAqLwotCi0gIG51bWV4cCA9IGdldF9vcGVyYW5kcyAobXlvcHMpOwotCi0gIC8qIEZvciBlYWNoIG9wY29kZSB3aXRoIHRoZSBzYW1lIG5hbWUsIHRyeSB0byBtYXRjaCBpdCBhZ2FpbnN0IHRoZSBwYXJzZWQKLSAgICAgb3BlcmFuZHMuICovCi0KLSAgZW5kID0gdGljODBfb3Bjb2RlcyArIHRpYzgwX251bV9vcGNvZGVzOwotICB3aGlsZSAoIW1hdGNoICYmIChvcGMgPCBlbmQpICYmIChzdHJjbXAgKG9wYyAtPiBuYW1lLCBvcGNvZGUgLT4gbmFtZSkgPT0gMCkpCi0gICAgewotICAgICAgLyogU3RhcnQgb2ZmIGFzc3VtaW5nIGEgbWF0Y2guICBJZiB3ZSBmaW5kIGEgbWlzbWF0Y2gsIHRoZW4gdGhpcyBpcwotCSByZXNldCBhbmQgdGhlIG9wZXJhbmQvZXhwciBtYXRjaGluZyBsb29wIHRlcm1pbmF0ZXMgd2l0aCBtYXRjaAotCSBlcXVhbCB0byB6ZXJvLCB3aGljaCBhbGxvd3MgdXMgdG8gdHJ5IHRoZSBuZXh0IG9wY29kZS4gKi8KLQotICAgICAgbWF0Y2ggPSAxOwotCi0gICAgICAvKiBGb3IgZWFjaCBleHByZXNzaW9uLCB0cnkgdG8gbWF0Y2ggaXQgYWdhaW5zdCB0aGUgY3VycmVudCBvcGVyYW5kCi0JIGZvciB0aGUgY3VycmVudCBvcGNvZGUuICBVcG9uIGFueSBtaXNtYXRjaCwgd2UgYWJhbmRvbiBmdXJ0aGVyCi0JIG1hdGNoaW5nIGZvciB0aGUgY3VycmVudCBvcGNvZGUgdGFibGUgZW50cnkuICAqLwotCi0gICAgICBmb3IgKGV4cGkgPSAwLCBvcGkgPSAtMTsgKGV4cGkgPCBudW1leHApICYmIG1hdGNoOyBleHBpKyspCi0JewotCSAgaW50IGJpdHMsIGZsYWdzLCBYX29wLCBudW07Ci0KLQkgIFhfb3AgPSBteW9wc1tleHBpXS5YX29wOwotCSAgbnVtID0gbXlvcHNbZXhwaV0uWF9hZGRfbnVtYmVyOwotCi0JICAvKiBUaGUgT19hYnNlbnQgZXhwcmVzc2lvbnMgYXBwbHkgdG8gdGhlIHNhbWUgb3BlcmFuZCBhcyB0aGUgbW9zdAotCSAgICAgcmVjZW50IG5vbiBPX2Fic2VudCBleHByZXNzaW9uLiAgU28gb25seSBpbmNyZW1lbnQgdGhlIG9wZXJhbmQKLQkgICAgIGluZGV4IHdoZW4gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBub3Qgb25lIG9mIHRoZXNlIHNwZWNpYWwKLQkgICAgIGV4cHJlc3Npb25zLiAqLwotCi0JICBpZiAoWF9vcCAhPSBPX2Fic2VudCkKLQkgICAgewotCSAgICAgIG9waSsrOwotCSAgICB9Ci0KLQkgIGZsYWdzID0gdGljODBfb3BlcmFuZHNbb3BjIC0+IG9wZXJhbmRzW29waV1dLmZsYWdzOwotCSAgYml0cyA9IHRpYzgwX29wZXJhbmRzW29wYyAtPiBvcGVyYW5kc1tvcGldXS5iaXRzOwotCi0JICBzd2l0Y2ggKFhfb3ApCi0JICAgIHsKLQkgICAgY2FzZSBPX3JlZ2lzdGVyOgotCSAgICAgIC8qIEFsc28gY2hlY2sgdGhhdCByZWdpc3RlcnMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgZXZlbiBhY3R1YWxseQotCQkgYXJlIGV2ZW4uICovCi0JICAgICAgaWYgKCgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0dQUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfR1BSKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0ZQQSkpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQ1IpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0NSKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9FVkVOKSAmJiAobnVtICYgMSkpIHx8Ci0JCSAgY29uc3Rfb3ZlcmZsb3cgKG51bSAmIH5USUM4MF9PUEVSQU5EX01BU0ssIGJpdHMsIGZsYWdzKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0JICAgICAgaWYgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRU5ETUFTSykgJiYgKG51bSA9PSAzMikpCi0JCXsKLQkJICAvKiBFbmRtYXNrIHZhbHVlcyBvZiAwIGFuZCAzMiBnaXZlIGlkZW50aWNhbCByZXN1bHRzICovCi0JCSAgbnVtID0gMDsKLQkJfQotCSAgICAgIGlmICgoZmxhZ3MgJiAoVElDODBfT1BFUkFORF9GUEEgfCBUSUM4MF9PUEVSQU5EX0dQUikpIHx8Ci0JCSAgY29uc3Rfb3ZlcmZsb3cgKG51bSwgYml0cywgZmxhZ3MpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19zeW1ib2w6Ci0JICAgICAgaWYgKChiaXRzIDwgMzIpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUENSRUwpICYmICF0aWM4MF9yZWxheCkKLQkJewotCQkgIC8qIFRoZSBkZWZhdWx0IGlzIHRvIHByZWZlciB0aGUgc2hvcnQgZm9ybSBvZiBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQkJICAgICBUaGlzIGlzIHRoZSBvbmx5IGZvcm0gdGhhdCB0aGUgVEkgYXNzZW1ibGVyIHN1cHBvcnRzLgotCQkgICAgIElmIHRoZSAtcmVsYXggb3B0aW9uIGlzIGdpdmVuLCB3ZSBuZXZlciB1c2UgdGhlIHNob3J0IGZvcm1zLgotCQkgICAgIEZJWE1FOiBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2UgImJlc3QtZml0Ii4gKi8KLQkJfQotCSAgICAgIGVsc2UgaWYgKChiaXRzID09IDMyKSAvKiAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JBU0VSRUwpICovKQotCQl7Ci0JCSAgLyogVGhlIGRlZmF1bHQgaXMgdG8gcHJlZmVyIHRoZSBsb25nIGZvcm0gb2YgYmFzZSByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQkJICAgICBUaGlzIGlzIHRoZSBvbmx5IGZvcm0gdGhhdCB0aGUgVEkgYXNzZW1ibGVyIHN1cHBvcnRzLgotCQkgICAgIElmIHRoZSAtbm8tcmVsYXggb3B0aW9uIGlzIGdpdmVuLCB3ZSBhbHdheXMgdXNlIHRoZSBsb25nIGZvcm0gb2YKLQkJICAgICBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQkJICAgICBGSVhNRTogU2hvdWxkIGJlIGFibGUgdG8gY2hvb3NlICJiZXN0LWZpdCIuICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBTeW1ib2xzIHRoYXQgZG9uJ3QgbWF0Y2ggb25lIG9mIHRoZSBhYm92ZSBjYXNlcyBhcmUKLQkJICAgICByZWplY3RlZCBhcyBhbiBvcGVyYW5kLiAqLwotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fYWJzZW50OgotCSAgICAgIC8qIElmIHRoaXMgaXMgYW4gT19hYnNlbnQgZXhwcmVzc2lvbiwgdGhlbiBpdCBtYXkgYmUgYW4gZXhwcmVzc2lvbiB0aGF0Ci0JCSBzdXBwbGllcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcGVyYW5kLCBzdWNoIGFzICI6bSIgb3IKLQkJICI6cyIgbW9kaWZpZXJzLiBDaGVjayB0byBzZWUgdGhhdCB0aGUgb3BlcmFuZCBtYXRjaGVzIHRoaXMgcmVxdWlyZW1lbnQuICovCi0JICAgICAgaWYgKCEoKG51bSAmIFRJQzgwX09QRVJBTkRfTV9TSSkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9NX1NJKSB8fAotCQkgICAgKG51bSAmIFRJQzgwX09QRVJBTkRfTV9MSSkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9NX0xJKSB8fAotCQkgICAgKG51bSAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19iaWc6Ci0JICAgICAgaWYgKChudW0gPiAwKSB8fCAhKGZsYWdzICYgVElDODBfT1BFUkFORF9GTE9BVCkpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2lsbGVnYWw6Ci0JICAgIGNhc2UgT19zeW1ib2xfcnZhOgotCSAgICBjYXNlIE9fdW1pbnVzOgotCSAgICBjYXNlIE9fYml0X25vdDoKLQkgICAgY2FzZSBPX2xvZ2ljYWxfbm90OgotCSAgICBjYXNlIE9fbXVsdGlwbHk6Ci0JICAgIGNhc2UgT19kaXZpZGU6Ci0JICAgIGNhc2UgT19tb2R1bHVzOgotCSAgICBjYXNlIE9fbGVmdF9zaGlmdDoKLQkgICAgY2FzZSBPX3JpZ2h0X3NoaWZ0OgotCSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoKLQkgICAgY2FzZSBPX2JpdF9vcl9ub3Q6Ci0JICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotCSAgICBjYXNlIE9fYml0X2FuZDoKLQkgICAgY2FzZSBPX2FkZDoKLQkgICAgY2FzZSBPX3N1YnRyYWN0OgotCSAgICBjYXNlIE9fZXE6Ci0JICAgIGNhc2UgT19uZToKLQkgICAgY2FzZSBPX2x0OgotCSAgICBjYXNlIE9fbGU6Ci0JICAgIGNhc2UgT19nZToKLQkgICAgY2FzZSBPX2d0OgotCSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6Ci0JICAgIGNhc2UgT19sb2dpY2FsX29yOgotCSAgICBjYXNlIE9fbWF4OgotCSAgICBkZWZhdWx0OgotCSAgICAgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCBleHByZXNzaW9uIHR5cGUiKSwgWF9vcCk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoIW1hdGNoKQotCXsKLQkgIG9wYysrOwotCX0KLSAgICB9ICAKLQotICByZXR1cm4gKG1hdGNoID8gb3BjIDogTlVMTCk7Ci0KLSNpZiAwCi0KLSAgLyogTm93IHNlYXJjaCB0aGUgb3Bjb2RlIHRhYmxlIHRhYmxlIGZvciBvbmUgd2l0aCBvcGVyYW5kcyB0aGF0Ci0gICAgIG1hdGNoZXMgd2hhdCB3ZSd2ZSBnb3QuICovCi0KLSAgd2hpbGUgKCFtYXRjaCkKLSAgICB7Ci0gICAgICBtYXRjaCA9IDE7Ci0gICAgICBmb3IgKGkgPSAwOyBvcGNvZGUgLT4gb3BlcmFuZHNbaV07IGkrKykgCi0JewotCSAgaW50IGZsYWdzID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0JICBpbnQgWF9vcCA9IG15b3BzW2ldLlhfb3A7Ci0JICBpbnQgbnVtID0gbXlvcHNbaV0uWF9hZGRfbnVtYmVyOwotCi0JICBpZiAoWF9vcCA9PSAwKSAKLQkgICAgewotCSAgICAgIG1hdGNoID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgICAgIAotCSAgaWYgKGZsYWdzICYgKFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9GUEEgfCBUSUM4MF9PUEVSQU5EX0NSKSkgCi0JICAgIHsKLQkgICAgICBpZiAoKFhfb3AgIT0gT19yZWdpc3RlcikgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9HUFIpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0dQUikpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRlBBKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9GUEEpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9DUikpKQotCQl7Ci0JCSAgbWF0Y2g9MDsKLQkJICBicmVhazsKLQkJfQkgIAotCSAgICB9Ci0JICAgICAgCi0JICBpZiAoKChmbGFncyAmIFRJQzgwX09QRVJBTkRfTUlOVVMpICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX01JTlVTKSkpIHx8Ci0JICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfUExVUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfUExVUykpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0FUTUlOVVMpICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX0FUTUlOVVMpKSkgfHwKLQkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9BVFBBUikgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfQVRQQVIpKSkgfHwKLQkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9BVFNJR04pICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX0FUU0lHTikpKSkgCi0JICAgIHsKLQkgICAgICBtYXRjaD0wOwotCSAgICAgIGJyZWFrOwotCSAgICB9CSAgICAgIAotCX0KLSAgICAgIC8qIHdlJ3JlIG9ubHkgZG9uZSBpZiB0aGUgb3BlcmFuZHMgbWF0Y2hlZCBzbyBmYXIgQU5EIHRoZXJlCi0JIGFyZSBubyBtb3JlIHRvIGNoZWNrICovCi0gICAgICBpZiAobWF0Y2ggJiYgbXlvcHNbaV0uWF9vcD09MCkgCi0JYnJlYWs7Ci0gICAgICBlbHNlCi0JbWF0Y2ggPSAwOwotCi0gICAgICBuZXh0X29wY29kZSA9IG9wY29kZSsxOwotICAgICAgaWYgKG5leHRfb3Bjb2RlLT5vcGNvZGUgPT0gMCkgCi0JYnJlYWs7Ci0gICAgICBpZiAoc3RyY21wKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQotCWJyZWFrOwotICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpICAKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiKSk7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLQotICAvKiBDaGVjayB0aGF0IGFsbCByZWdpc3RlcnMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgZXZlbiBhcmUuICovCi0gIC8qIEFsc28sIGlmIGFueSBvcGVyYW5kcyB3ZXJlIG1hcmtlZCBhcyByZWdpc3RlcnMsIGJ1dCB3ZXJlIHJlYWxseSBzeW1ib2xzICovCi0gIC8qIGZpeCB0aGF0IGhlcmUuICovCi0gIGZvciAoaT0wOyBvcGNvZGUtPm9wZXJhbmRzW2ldOyBpKyspIAotICAgIHsKLSAgICAgIGlmICgodGljODBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VWRU4pICYmCi0JICAobXlvcHNbaV0uWF9hZGRfbnVtYmVyICYgMSkpIAotCWFzX2ZhdGFsIChfKCJSZWdpc3RlciBudW1iZXIgbXVzdCBiZSBFVkVOIikpOwotICAgICAgaWYgKG15b3BzW2ldLlhfb3AgPT0gT19yZWdpc3RlcikKLQl7Ci0JICBpZiAoISh0aWM4MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIFRJQzgwX09QRVJBTkRfUkVHKSkgCi0JICAgIHsKLQkgICAgICBteW9wc1tpXS5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgbXlvcHNbaV0uWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNoYXIgKilteW9wc1tpXS5YX29wX3N5bWJvbCk7Ci0JICAgICAgbXlvcHNbaV0uWF9hZGRfbnVtYmVyID0gMDsKLQkgICAgICBteW9wc1tpXS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jZW5kaWYKLX0KLQotLyogYnVpbGRfaW5zbiB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIG9wY29kZSBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlCi0gICBhbmQgdGhlIGFycmF5IG9mIG9wZXJhbmQgZXhwcmVzc2lvbnMgYW5kIHdyaXRlcyBvdXQgdGhlIGluc3RydWN0aW9uLgotCi0gICBOb3RlIHRoYXQgdGhlIG9wY29kZSB3b3JkIGFuZCBleHRlbmRlZCB3b3JkIG1heSBiZSB3cml0dGVuIHRvIGRpZmZlcmVudAotICAgZnJhZ3MsIHdpdGggdGhlIG9wY29kZSBhdCB0aGUgZW5kIG9mIG9uZSBmcmFnIGFuZCB0aGUgZXh0ZW5zaW9uIGF0IHRoZQotICAgYmVnaW5uaW5nIG9mIHRoZSBuZXh0LiAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaW5zbiAob3Bjb2RlLCBvcGVycykgCi0gICAgIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJzOwotewotICBpbnQgZXhwaTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBleHByZXNzaW9uIHRvIG1hdGNoICovCi0gIGludCBvcGk7CQkJCS8qIEluZGV4IG9mIGN1cnJlbnQgb3BlcmFuZCB0byBtYXRjaCAqLwotICB1bnNpZ25lZCBsb25nIGluc25bMl07CQkvKiBJbnN0cnVjdGlvbiBhbmQgbG9uZyBpbW1lZGlhdGUgKGlmIGFueSkgKi8KLSAgY2hhciAqZjsJCQkJLyogUG9pbnRlciB0byBmcmFnIGxvY2F0aW9uIGZvciBpbnNuWzBdICovCi0gIGZyYWdTICpmZnJhZzsJCQkJLyogRnJhZyBjb250YWluaW5nIGxvY2F0aW9uIGYgKi8KLSAgY2hhciAqZnggPSBOVUxMOwkJCS8qIFBvaW50ZXIgdG8gZnJhZyBsb2NhdGlvbiBmb3IgaW5zblsxXSAqLwotICBmcmFnUyAqZnhmcmFnOwkJCS8qIEZyYWcgY29udGFpbmluZyBsb2NhdGlvbiBmeCAqLwotCi0gIC8qIFN0YXJ0IHdpdGggdGhlIHJhdyBvcGNvZGUgYml0cyBmcm9tIHRoZSBvcGNvZGUgdGFibGUuICovCi0gIGluc25bMF0gPSBvcGNvZGUgLT4gb3Bjb2RlOwotCi0gIC8qIFdlIGFyZSBnb2luZyB0byBpbnNlcnQgYXQgbGVhc3Qgb25lIDMyIGJpdCBvcGNvZGUgc28gZ2V0IHRoZQotICAgICBmcmFnIG5vdy4gKi8KLQotICBmID0gZnJhZ19tb3JlICg0KTsKLSAgZmZyYWcgPSBmcmFnX25vdzsKLQotICAvKiBGb3IgZWFjaCBvcGVyYW5kIGV4cHJlc3Npb24sIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgYml0cyBpbnRvIHRoZQotICAgICBpbnN0cnVjdGlvbiAuICovCi0gIGZvciAoZXhwaSA9IDAsIG9waSA9IC0xOyBvcGVyc1tleHBpXS5YX29wICE9IE9faWxsZWdhbDsgZXhwaSsrKQotICAgIHsKLSAgICAgIGludCBiaXRzLCBzaGlmdCwgZmxhZ3MsIFhfb3AsIG51bTsKLQotICAgICAgWF9vcCA9IG9wZXJzW2V4cGldLlhfb3A7Ci0gICAgICBudW0gPSBvcGVyc1tleHBpXS5YX2FkZF9udW1iZXI7Ci0KLSAgICAgIC8qIFRoZSBPX2Fic2VudCBleHByZXNzaW9ucyBhcHBseSB0byB0aGUgc2FtZSBvcGVyYW5kIGFzIHRoZSBtb3N0Ci0JIHJlY2VudCBub24gT19hYnNlbnQgZXhwcmVzc2lvbi4gIFNvIG9ubHkgaW5jcmVtZW50IHRoZSBvcGVyYW5kCi0JIGluZGV4IHdoZW4gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBub3Qgb25lIG9mIHRoZXNlIHNwZWNpYWwKLQkgZXhwcmVzc2lvbnMuICovCi0KLSAgICAgIGlmIChYX29wICE9IE9fYWJzZW50KQotCXsKLQkgIG9waSsrOwotCX0KLQotICAgICAgZmxhZ3MgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUgLT4gb3BlcmFuZHNbb3BpXV0uZmxhZ3M7Ci0gICAgICBiaXRzID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlIC0+IG9wZXJhbmRzW29waV1dLmJpdHM7Ci0gICAgICBzaGlmdCA9IHRpYzgwX29wZXJhbmRzW29wY29kZSAtPiBvcGVyYW5kc1tvcGldXS5zaGlmdDsKLQotICAgICAgc3dpdGNoIChYX29wKQotCXsKLQljYXNlIE9fcmVnaXN0ZXI6Ci0JICBudW0gJj0gflRJQzgwX09QRVJBTkRfTUFTSzsKLQkgIGluc25bMF0gPSBpbnNuWzBdIHwgKG51bSA8PCBzaGlmdCk7Ci0JICBicmVhazsKLQljYXNlIE9fY29uc3RhbnQ6Ci0JICBpZiAoKGZsYWdzICYgVElDODBfT1BFUkFORF9FTkRNQVNLKSAmJiAobnVtID09IDMyKSkKLQkgICAgewotCSAgICAgIC8qIEVuZG1hc2sgdmFsdWVzIG9mIDAgYW5kIDMyIGdpdmUgaWRlbnRpY2FsIHJlc3VsdHMgKi8KLQkgICAgICBudW0gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JJVE5VTSkpCi0JICAgIHsKLQkgICAgICAvKiBCSVROVU0gdmFsdWVzIGFyZSBzdG9yZWQgaW4gb25lJ3MgY29tcGxlbWVudCBmb3JtICovCi0JICAgICAgbnVtID0gKH5udW0gJiAweDFGKTsKLQkgICAgfQotCSAgLyogTWFzayBvZmYgdXBwZXIgYml0cywganVzdCBpdCBjYXNlIGl0IGlzIHNpZ25lZCBhbmQgaXMgbmVnYXRpdmUgKi8KLQkgIGlmIChiaXRzIDwgMzIpCi0JICAgIHsKLQkgICAgICBudW0gJj0gKDEgPDwgYml0cykgLSAxOwotCSAgICAgIGluc25bMF0gPSBpbnNuWzBdIHwgKG51bSA8PCBzaGlmdCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZ4ID0gZnJhZ19tb3JlICg0KTsKLQkgICAgICBmeGZyYWcgPSBmcmFnX25vdzsKLQkgICAgICBpbnNuWzFdID0gbnVtOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9fc3ltYm9sOgotCSAgaWYgKGJpdHMgPT0gMzIpCi0JICAgIHsKLQkgICAgICBmeCA9IGZyYWdfbW9yZSAoNCk7Ci0JICAgICAgZnhmcmFnID0gZnJhZ19ub3c7Ci0JICAgICAgaW5zblsxXSA9IDA7Ci0JICAgICAgaWYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkKLQkJewotCQkgIGZpeF9uZXdfZXhwIChmeGZyYWcsCi0JCQkgICAgICAgZnggLSAoZnhmcmFnIC0+IGZyX2xpdGVyYWwpLAotCQkJICAgICAgIDQsCi0JCQkgICAgICAgJm9wZXJzW2V4cGldLCAKLQkJCSAgICAgICAxLAotCQkJICAgICAgIFJfTVBQQ1IpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZml4X25ld19leHAgKGZ4ZnJhZywKLQkJCSAgICAgICBmeCAtIChmeGZyYWcgLT4gZnJfbGl0ZXJhbCksCi0JCQkgICAgICAgNCwKLQkJCSAgICAgICAmb3BlcnNbZXhwaV0sIAotCQkJICAgICAgIDAsCi0JCQkgICAgICAgUl9SRUxMT05HWCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKQotCSAgICB7Ci0JICAgICAgZml4X25ld19leHAgKGZmcmFnLAotCQkJICAgZiAtIChmZnJhZyAtPiBmcl9saXRlcmFsKSwKLQkJCSAgIDQsCQkJLyogRklYTUUhIGhvdyBpcyB0aGlzIHVzZWQ/ICovCi0JCQkgICAmb3BlcnNbZXhwaV0sCi0JCQkgICAxLAotCQkJICAgUl9NUFBDUjE1Vyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludGVybmFsX2Vycm9yIChfKCJzeW1ib2wgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgb3IgMzIgYml0cyIpKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX2Fic2VudDoKLQkgIC8qIEVhY2ggT19hYnNlbnQgZXhwcmVzc2lvbiBjYW4gaW5kaWNhdGUgZXhhY3RseSBvbmUgcG9zc2libGUgbW9kaWZpZXIuICovCi0JICBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfTV9TSSkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9NX1NJKSkKLQkgICAgewotCSAgICAgIGluc25bMF0gPSBpbnNuWzBdIHwgKDEgPDwgMTcpOwotCSAgICB9Ci0JICBlbHNlIGlmICgobnVtICYgVElDODBfT1BFUkFORF9NX0xJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fTEkpKQotCSAgICB7Ci0JICAgICAgaW5zblswXSA9IGluc25bMF0gfCAoMSA8PCAxNSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9TQ0FMRUQpKQotCSAgICB7Ci0JICAgICAgaW5zblswXSA9IGluc25bMF0gfCAoMSA8PCAxMSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX1BBUkVOUykgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQVJFTlMpKQotCSAgICB7Ci0JICAgICAgLyogTm8gY29kZSB0byBnZW5lcmF0ZSwganVzdCBhY2NlcHQgYW5kIGRpc2NhcmQgdGhpcyBleHByZXNzaW9uICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCBvcGVyYW5kIG1vZGlmaWVyIiksIG9wZXJzW2V4cGldLlhfYWRkX251bWJlcik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT19iaWc6Ci0JICBmeCA9IGZyYWdfbW9yZSAoNCk7Ci0JICBmeGZyYWcgPSBmcmFnX25vdzsKLQkgIHsKLQkgICAgaW50IHByZWNpc2lvbiA9IDI7Ci0JICAgIGxvbmcgZXhwb25lbnRfYml0cyA9IDhMOwotCSAgICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1syXTsKLQkgICAgLyogVmFsdWUgaXMgc3RpbGwgaW4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgKi8KLQkgICAgZ2VuX3RvX3dvcmRzICh3b3JkcywgcHJlY2lzaW9uLCBleHBvbmVudF9iaXRzKTsKLQkgICAgaW5zblsxXSA9ICh3b3Jkc1swXSA8PCAxNikgfCB3b3Jkc1sxXTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT19pbGxlZ2FsOgotCWNhc2UgT19zeW1ib2xfcnZhOgotCWNhc2UgT191bWludXM6Ci0JY2FzZSBPX2JpdF9ub3Q6Ci0JY2FzZSBPX2xvZ2ljYWxfbm90OgotCWNhc2UgT19tdWx0aXBseToKLQljYXNlIE9fZGl2aWRlOgotCWNhc2UgT19tb2R1bHVzOgotCWNhc2UgT19sZWZ0X3NoaWZ0OgotCWNhc2UgT19yaWdodF9zaGlmdDoKLQljYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoKLQljYXNlIE9fYml0X29yX25vdDoKLQljYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoKLQljYXNlIE9fYml0X2FuZDoKLQljYXNlIE9fYWRkOgotCWNhc2UgT19zdWJ0cmFjdDoKLQljYXNlIE9fZXE6Ci0JY2FzZSBPX25lOgotCWNhc2UgT19sdDoKLQljYXNlIE9fbGU6Ci0JY2FzZSBPX2dlOgotCWNhc2UgT19ndDoKLQljYXNlIE9fbG9naWNhbF9hbmQ6Ci0JY2FzZSBPX2xvZ2ljYWxfb3I6Ci0JY2FzZSBPX21heDoKLQlkZWZhdWx0OgotCSAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIGV4cHJlc3Npb24iKSwgWF9vcCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24sIGVpdGhlciA0IG9yIDggYnl0ZXMuICAqLwotCi0gIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zblswXSwgNCk7Ci0gIGlmIChmeCAhPSBOVUxMKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZngsIGluc25bMV0sIDQpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIEdhcwotICAgY2FsbHMgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBpbnB1dCBsaW5lIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYQotICAgcHNldWRvb3AuCi0KLSAgU1RSIHBvaW50cyB0byBhIE5VTEwgdGVybWluYXRlZCBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMKLSAgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdCB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzY2FuOwotICB1bnNpZ25lZCBjaGFyICppbnB1dF9saW5lX3NhdmU7Ci0gIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKLSAgZXhwcmVzc2lvblMgbXlvcHNbMTZdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgLyogRW5zdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0aGVyZSB0byBhc3NlbWJsZS4gKi8KLSAgYXNzZXJ0IChzdHIpOwotCi0gIC8qIERyb3AgYW55IGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgIH0KLQotICAvKiBJc29sYXRlIHRoZSBtbmVtb25pYyBmcm9tIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgYnkgZmluZGluZyB0aGUgZmlyc3QKLSAgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgYW5kIHphcHBpbmcgaXQgdG8gYSBudWxsIGJ5dGUuICovCi0gIGZvciAoc2NhbiA9IHN0cjsgKnNjYW4gIT0gJ1wwMDAnICYmICFpc3NwYWNlICgqc2Nhbik7IHNjYW4rKykgezt9Ci0gIGlmICgqc2NhbiAhPSAnXDAwMCcpCi0gICAgewotICAgICAgKnNjYW4rKyA9ICdcMDAwJzsKLSAgICB9Ci0KLSAgLyogVHJ5IHRvIGZpbmQgdGhpcyBtbmVtb25pYyBpbiB0aGUgaGFzaCB0YWJsZSAqLwotICBpZiAoKG9wY29kZSA9IChzdHJ1Y3QgdGljODBfb3Bjb2RlICopIGhhc2hfZmluZCAodGljODBfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkludmFsaWQgbW5lbW9uaWM6ICclcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RyID0gc2NhbjsKLSAgd2hpbGUgKGlzc3BhY2UgKCpzY2FuKSkKLSAgICB7Ci0gICAgICBzY2FuKys7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIG9wY29kZSA9IGZpbmRfb3Bjb2RlIChvcGNvZGUsIG15b3BzKTsKLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBvcGVyYW5kczogJyVzJyIpLCBpbnB1dF9saW5lX3NhdmUpOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3NhdmU7Ci0gIGJ1aWxkX2luc24gKG9wY29kZSwgbXlvcHMpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGF0IHRoZSBzdGFydCBvZiBhc3NlbWJseSwgYWZ0ZXIgdGhlIGNvbW1hbmQKLSAgIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFsbCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudAotICAgaW5pdGlhbGl6YXRpb25zIGhhdmUgYmVlbiBjb21wbGV0ZWQuCi0KLSAgIEl0IHNob3VsZCBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4sIHRoYXQgdGhlIG1hY2hpbmUgZGVwZW5kZW50IHBhcnQgb2YKLSAgIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLiAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcF9lbmQ7Ci0gIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKLSAgZXh0ZXJuIGludCBjb2ZmX2ZsYWdzOwkJCS8qIERlZmluZWQgaW4gb2JqLWNvZmYuYyAqLwotCi0gIC8qIFNldCBGX0FSMzJXUiBpbiBjb2ZmX2ZsYWdzLCB3aGljaCB3aWxsIGVuZCB1cCBpbiB0aGUgZmlsZSBoZWFkZXIKLSAgICAgZl9mbGFncyBmaWVsZC4gKi8KLQotICBjb2ZmX2ZsYWdzIHw9IEZfQVIzMldSOwkvKiBUSWM4MCBpcyAzMiBiaXQgbGl0dGxlIGVuZGlhbiAqLwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIFRJYzgwIGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICB0aWM4MF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIG9wX2VuZCA9IHRpYzgwX29wY29kZXMgKyB0aWM4MF9udW1fb3Bjb2RlczsKLSAgZm9yIChvcCA9IHRpYzgwX29wY29kZXM7IG9wIDwgb3BfZW5kOyBvcCsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3AgLT4gbmFtZSkgIT0gMCkgCi0JewotCSAgcHJldl9uYW1lID0gKGNoYXIgKikgb3AgLT4gbmFtZTsKLQkgIGhhc2hfaW5zZXJ0ICh0aWM4MF9oYXNoLCBvcCAtPiBuYW1lLCAoY2hhciAqKSBvcCk7Ci0JfQotICAgIH0KLQotICAvKiBJbnNlcnQgdGhlIHByZWRlZmluZWQgc3ltYm9scyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBXZSB1c2Ugc3ltYm9sX2NyZWF0ZQotICAgICByYXRoZXIgdGhhbiBzeW1ib2xfbmV3IHNvIHRoYXQgdGhlc2Ugc3ltYm9scyBkb24ndCBlbmQgdXAgaW4gdGhlIG9iamVjdAotICAgICBmaWxlcycgc3ltYm9sIHRhYmxlLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIHByZWRlZmluZWQgc3ltYm9scyBpbmNsdWRlCi0gICAgIHNvbWUgdXBwZXIgYml0cyB0aGF0IGRpc3Rpbmd1aXNoIHRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKHJlZ2lzdGVyLCBiaXRudW0sCi0gICAgIGNvbmRpdGlvbiBjb2RlLCBldGMpIGFuZCB0aGVzZSBiaXRzIG11c3QgYmUgbWFza2VkIGF3YXkgYmVmb3JlIGFjdHVhbGx5Ci0gICAgIGluc2VydGluZyB0aGUgdmFsdWVzIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4gIEZvciByZWdpc3RlcnMgd2UgcHV0Ci0gICAgIHRoZXNlIGJpdHMgaW4gdGhlIHN5bWJvbCB0YWJsZSBzaW5jZSB3ZSB1c2UgdGhlbSBsYXRlciBhbmQgdGhlcmUgaXMgbm8KLSAgICAgcXVlc3Rpb24gdGhhdCB0aGV5IGFyZW4ndCBwYXJ0IG9mIHRoZSByZWdpc3RlciBudW1iZXIuICBGb3IgY29uc3RhbnRzIHdlCi0gICAgIGNhbid0IGRvIHRoYXQgc2luY2UgdGhlIGNvbnN0YW50IGNhbiBiZSBhbnkgdmFsdWUsIHNvIHRoZXkgYXJlIG1hc2tlZCBvZmYKLSAgICAgYmVmb3JlIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICovCi0KLSAgcGRzcCA9IE5VTEw7Ci0gIHdoaWxlICgocGRzcCA9IHRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgKHBkc3ApKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgIHZhbHVlVCB2YWx1OwotICAgICAgaW50IHN5bXR5cGU7Ci0KLSAgICAgIHN5bXR5cGUgPSBQRFNfVkFMVUUgKHBkc3ApICYgVElDODBfT1BFUkFORF9NQVNLOwotICAgICAgc3dpdGNoIChzeW10eXBlKQotCXsKLQljYXNlIFRJQzgwX09QRVJBTkRfR1BSOgotCWNhc2UgVElDODBfT1BFUkFORF9GUEE6Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0NSOgotCSAgc2VnbWVudCA9IHJlZ19zZWN0aW9uOwotCSAgdmFsdSA9IFBEU19WQUxVRSAocGRzcCk7Ci0JICBicmVhazsKLQljYXNlIFRJQzgwX09QRVJBTkRfQ0M6Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0JJVE5VTToKLQkgIHNlZ21lbnQgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCSAgdmFsdSA9IFBEU19WQUxVRSAocGRzcCkgJiB+VElDODBfT1BFUkFORF9NQVNLOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCBwcmVkZWZpbmVkIHN5bWJvbCBiaXRzIiksIHN5bXR5cGUpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX2NyZWF0ZSAoUERTX05BTUUgKHBkc3ApLCBzZWdtZW50LCB2YWx1LAotCQkJCQkgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICAgIH0KLX0KLQotDAotCi0vKiBUaGUgYXNzZW1ibGVyIGFkZHMgbWRfc2hvcnRvcHRzIHRvIHRoZSBzdHJpbmcgcGFzc2VkIHRvIGdldG9wdC4gKi8KLQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci0KLS8qIFRoZSBhc3NlbWJsZXIgYWRkcyBtZF9sb25nb3B0cyB0byB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBsb25nIG9wdGlvbnMKLSAgIHRoYXQgYXJlIHBhc3NlZCB0byBnZXRvcHQuICovCi0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLQotI2RlZmluZSBPUFRJT05fUkVMQVgJKE9QVElPTl9NRF9CQVNFKQotICB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0KLSNkZWZpbmUgT1BUSU9OX05PX1JFTEFYCShPUFRJT05fUkVMQVggKyAxKQotICB7Im5vLXJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19SRUxBWH0sCi0KLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi0vKiBUaGUgbWRfcGFyc2Vfb3B0aW9uIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGdldG9wdCByZXR1cm5zIGFuCi0gICB1bnJlY29nbml6ZWQgY29kZSwgcHJlc3VtYWJseSBpbmRpY2F0aW5nIGEgc3BlY2lhbCBjb2RlIHZhbHVlIHdoaWNoCi0gICBhcHBlYXJzIGluIG1kX2xvbmdvcHRzIGZvciBtYWNoaW5lIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zLiAqLwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX1JFTEFYOgotICAgICAgdGljODBfcmVsYXggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTk9fUkVMQVg6Ci0gICAgICB0aWM4MF9yZWxheCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIHJldHVybiAoMSk7Ci19Ci0KLS8qIFRoZSBtZF9zaG93X3VzYWdlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgdXNhZ2UgbWVzc2FnZSBpcwotICAgcHJpbnRlZC4gIEl0IHNob3VsZCBwcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtYWNoaW5lIHNwZWNpZmljIG9wdGlvbnMKLSAgIGZvdW5kIGluIG1kX2xvbmdvcHRzLiAqLwotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCAiXAotVEljODAgb3B0aW9uczpcblwKLS1yZWxheAkJCWFsdGVyIFBDIHJlbGF0aXZlIGJyYW5jaCBpbnN0cnVjdGlvbnMgdG8gdXNlIGxvbmcgZm9ybSB3aGVuIG5lZWRlZFxuXAotLW5vLXJlbGF4CQlhbHdheXMgdXNlIHNob3J0IFBDIHJlbGF0aXZlIGJyYW5jaCBpbnN0cnVjdGlvbnMsIGVycm9yIG9uIG92ZXJmbG93XG4iKTsKLX0KLQotDAotLyogQXR0ZW1wdCB0byBzaW1wbGlmeSBvciBldmVuIGVsaW1pbmF0ZSBhIGZpeHVwLiAgVGhlIHJldHVybiB2YWx1ZSBpcwotICAgaWdub3JlZDsgcGVyaGFwcyBpdCB3YXMgb25jZSBtZWFuaW5nZnVsLCBidXQgbm93IGl0IGlzIGhpc3RvcmljYWwuCi0gICBUbyBpbmRpY2F0ZSB0aGF0IGEgZml4dXAgaGFzIGJlZW4gZWxpbWluYXRlZCwgc2V0IGZpeFAtPmZ4X2RvbmUuCi0gICAqLwotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmRlc3QgPSAgZml4UCAtPiBmeF9mcmFnIC0+IGZyX2xpdGVyYWwgKyBmaXhQIC0+IGZ4X3doZXJlOwotICBpbnQgb3ZlcmZsb3c7Ci0KLSAgc3dpdGNoIChmaXhQIC0+IGZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1JFTExPTkdYOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChkZXN0LCAodmFsdWVUKSB2YWwsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01QUENSOgotICAgICAgdmFsID4+PSAyOwotICAgICAgdmFsICs9IDE7CSAgLyogVGFyZ2V0IGFkZHJlc3MgY29tcHV0ZWQgZnJvbSBpbnN0IHN0YXJ0ICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGRlc3QsICh2YWx1ZVQpIHZhbCwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTVBQQ1IxNVc6Ci0gICAgICBvdmVyZmxvdyA9ICh2YWwgPCAtNjU1MzZMKSB8fCAodmFsID4gNjU1MzJMKTsKLSAgICAgIGlmIChvdmVyZmxvdykKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAgLT4gZnhfZmlsZSwgZml4UCAtPiBmeF9saW5lLAotCQkJXygiUEMgb2Zmc2V0IDB4JWx4IG91dHNpZGUgcmFuZ2UgMHglbHgtMHglbHgiKSwKLQkJCXZhbCwgLTY1NTM2TCwgNjU1MzJMKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdmFsID4+PSAyOwotCSAgKmRlc3QrKyA9IHZhbCAmIDB4RkY7Ci0JICB2YWwgPj49IDg7Ci0JICAqZGVzdCA9ICgqZGVzdCAmIDB4ODApIHwgKHZhbCAmIDB4N0YpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9BQlM6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGRlc3QsICh2YWx1ZVQpIHZhbCwgZml4UCAtPiBmeF9zaXplKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlIGluIGZpeHVwIiksIGZpeFAgLT4gZnhfcl90eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4KLQotICAgRm9yIHRoZSBUSWM4MCwgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgMzIgYml0IG9wY29kZSBjb250YWluaW5nCi0gICB0aGUgUEMgcmVsYXRpdmUgZmllbGQuICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiAoZml4UCAtPiBmeF9mcmFnIC0+IGZyX2FkZHJlc3MgKyBmaXhQIC0+IGZ4X3doZXJlKSA7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KLSAqIEluOglBZGRyZXNzIG9mIGZyYWcuCi0gKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCi0gKgotICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgotICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGludGVybmFsX2Vycm9yIChfKCJtZF9jb252ZXJ0X2ZyYWcoKSBub3QgaW1wbGVtZW50ZWQgeWV0IikpOwotICBhYm9ydCAoKTsKLX0KLQotDAotLypBUkdTVVNFRCovCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKGlnbm9yZSkKLSAgICAgc3ltYm9sUyAqaWdub3JlOwotewotfQotCi0jaWYgZGVmaW5lZCBPQkpfQ09GRgotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiAoZml4UCAtPiBmeF9yX3R5cGUpOwotfQotCi0jZW5kaWYJLyogT0JKX0NPRkYgKi8KLQotLyogZW5kIG9mIHRjLXRpYzgwLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGljODAuaCBiL2dhcy9jb25maWcvdGMtdGljODAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmZjI0OS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRpYzgwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtdGljODAuaAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX1RJQzgwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIFRBUkdFVF9BUkNICWJmZF9hcmNoX3RpYzgwCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJImNvZmYtdGljODAiCi0jZGVmaW5lIEJGRF9BUkNICVRBUkdFVF9BUkNICi0KLS8qIFdlIG5lZWQgdGhlIGV4dHJhIGZpZWxkIGluIHRoZSBmaXh1cCBzdHJ1Y3QgdG8gcHV0IHRoZSByZWxvY2F0aW9uIGluLiAqLwotCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFCi0KLS8qIERlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgYXMgdGhlIGFwcHJvcHJpYXRlIHN0YW5kYXJkIGJpZyBlbmRpYW4gb3IKLSAgIGxpdHRsZSBlbmRpYW4gZnVuY3Rpb24uICBTaG91bGQgd2Ugc29tZWRheSBzdXBwb3J0IGVuZGlhbm5lc3MgYXMgYQotICAgcnVudGltZSBkZWNpc2lvbiwgdGhpcyB3aWxsIG5lZWQgdG8gY2hhbmdlLiAqLwotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycyBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCi0KLS8qIERlZmluZSBhd2F5IHRoZSBjYWxsIHRvIG1kX29wZXJhbmQgaW4gdGhlIGV4cHJlc3Npb24gcGFyc2luZyBjb2RlLgotICAgVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGV4cHJlc3Npb24gcGFyc2VyIGNhbid0IHBhcnNlIHRoZSBpbnB1dAotICAgYW5kIGdpdmVzIHRoZSBhc3NlbWJsZXIgYmFja2VuZCBhIGNoYW5jZSB0byBkZWFsIHdpdGggaXQgaW5zdGVhZC4gKi8KLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNpZmRlZiBPQkpfQ09GRgotCi0vKiBDT0ZGIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBDT0ZGX01BR0lDCVRJQzgwX0FSQ0hfTUFHSUMKLQotLyogV2hldGhlciBhIHJlbG9jIHNob3VsZCBiZSBvdXRwdXQuICAqLwotCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKGZpeHApICgoZml4cCkgLT4gZnhfYWRkc3kgIT0gTlVMTCkKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLQotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQotCi1leHRlcm4gc2hvcnQgdGNfY29mZl9maXgycnR5cGUgKCk7Ci0KLSNlbmRpZgkvKiBPQkpfQ09GRiAqLwotCi0vKiBlbmQgb2YgdGMtdGljODAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12ODUwLmMgYi9nYXMvY29uZmlnL3RjLXY4NTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkMzA4Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXY4NTAuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NzkgKzAsMCBAQAotLyogdGMtdjg1MC5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTkVDIFY4NTAKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJvcGNvZGUvdjg1MC5oIgotCi0jZGVmaW5lIEFSRUFfWkRBIDAKLSNkZWZpbmUgQVJFQV9TREEgMQotI2RlZmluZSBBUkVBX1REQSAyCi0KLS8qIHNpZ24tZXh0ZW5kIGEgMTYtYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUMTYoeCkJKCgoKHgpICYgMHhmZmZmKSBeICh+IDB4N2ZmZikpICsgMHg4MDAwKQotCi0vKiBUZW1wb3JhcmlseSBob2xkcyB0aGUgcmVsb2MgaW4gYSBjb25zIGV4cHJlc3Npb24uICAqLwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBob2xkX2NvbnNfcmVsb2M7Ci0KLS8qIFNldCB0byBUUlVFIGlmIHdlIHdhbnQgdG8gYmUgcGVkYW50aWMgYWJvdXQgc2lnbmVkIG92ZXJmbG93cy4gICovCi1zdGF0aWMgYm9vbGVhbiB3YXJuX3NpZ25lZF9vdmVyZmxvd3MgICA9IEZBTFNFOwotc3RhdGljIGJvb2xlYW4gd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MgPSBGQUxTRTsKLQotLyogSW5kaWNhdGVzIHRoZSB0YXJnZXQgQkZEIG1hY2hpbmUgbnVtYmVyLiAgKi8KLXN0YXRpYyBpbnQgICAgIG1hY2hpbmUgPSAtMTsKLQotLyogSW5kaWNhdGVzIHRoZSB0YXJnZXQgcHJvY2Vzc29yKHMpIGZvciB0aGUgYXNzZW1ibGUuICAqLwotc3RhdGljIHVuc2lnbmVkIGludAlwcm9jZXNzb3JfbWFzayA9IC0xOwotCi0MCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcmVnX25hbWUKLXsKLSAgY29uc3QgY2hhciAqIG5hbWU7Ci0gIGludCAgICAgICAgICB2YWx1ZTsKLX07Ci0KLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbCB0YXJnZXRzLiAqLwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICI7IyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSAKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nIAotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCAKLSAgIGFzIGluIDBkMS4wLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotDAotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgLyogQ29uZGl0aW9uYWwgYnJhbmNoZXMuICAqLwotICB7MHhmZiwgICAgIC0weDEwMCwgICAgMiwgMX0sCi0gIHsweDFmZmZmZiwgLTB4MjAwMDAwLCA2LCAwfSwKLSAgLyogVW5jb25kaXRpb25hbCBicmFuY2hlcy4gICovCi0gIHsweGZmLCAgICAgLTB4MTAwLCAgICAyLCAzfSwKLSAgezB4MWZmZmZmLCAtMHgyMDAwMDAsIDQsIDB9LAotfTsKLQotCi1zdGF0aWMgc2VnVCBzZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHRkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgemRhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCBzYnNzX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgdGJzc19zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHpic3Nfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCByb3NkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1Qgcm96ZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHNjb21tb25fc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB0Y29tbW9uX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgemNvbW1vbl9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIGNhbGxfdGFibGVfdGV4dF9zZWN0aW9uID0gTlVMTDsKLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCB2ODUwX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TICAgICAgICAgICAgICBleHA7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19OwotCi1zdHJ1Y3Qgdjg1MF9maXh1cCBmaXh1cHMgW01BWF9JTlNOX0ZJWFVQU107Ci1zdGF0aWMgaW50IGZjOwotCi0MCi12b2lkCi12ODUwX3NkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHNkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF90ZGF0YSAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0ICh0ZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF96ZGF0YSAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0ICh6ZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9zYnNzIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHNic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfdGJzcyAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0ICh0YnNzX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3pic3MgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoemJzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9yb3NkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHJvc2RhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfcm96ZGF0YSAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChyb3pkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX2NhbGxfdGFibGVfZGF0YSAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChjYWxsX3RhYmxlX2RhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfY2FsbF90YWJsZV90ZXh0IChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKGNhbGxfdGFibGVfdGV4dF9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9ic3MgKGludCBpZ25vcmUpCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIHRlbXApOwotICAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfb2Zmc2V0IChpbnQgaWdub3JlKQotewotICBpbnQgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAKLSAgdGVtcCAtPSBmcmFnX25vd19maXgoKTsKLSAgCi0gIGlmICh0ZW1wID4gMCkKLSAgICAodm9pZCkgZnJhZ19tb3JlICh0ZW1wKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIENvcGllZCBmcm9tIG9ial9lbGZfY29tbW9uKCkgaW4gZ2FzL2NvbmZpZy9vYmotZWxmLmMgKi8KLXN0YXRpYyB2b2lkCi12ODUwX2NvbW0gKGFyZWEpCi0gICAgIGludCBhcmVhOwotewotICBjaGFyICogICAgbmFtZTsKLSAgY2hhciAgICAgIGM7Ci0gIGNoYXIgKiAgICBwOwotICBpbnQgICAgICAgdGVtcDsKLSAgaW50ICAgICAgIHNpemU7Ci0gIHN5bWJvbFMgKiBzeW1ib2xQOwotICBpbnQgICAgICAgaGF2ZV9hbGlnbjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIAotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICAKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICAKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGlucHV0X2xpbmVfcG9pbnRlciArKzsJCS8qIHNraXAgJywnICovCi0gIAotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oIi5DT01Nb24gbGVuZ3RoICglZC4pIDwgMCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIHNpemUgPSB0ZW1wOwotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICAKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IHNpemUpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGFzX3dhcm4gKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIpLAotCQkgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZSk7Ci0JfQotICAgIH0KLSAgCi0gIGtub3cgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgPT0gJiB6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIAotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgaGF2ZV9hbGlnbiA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYXZlX2FsaWduID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgCi0gIGlmICghIGhhdmVfYWxpZ24gfHwgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0gICAgewotICAgICAgaWYgKCEgaGF2ZV9hbGlnbikKLQl0ZW1wID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICAKLQkgIGlmICh0ZW1wIDwgMCkKLQkgICAgewotCSAgICAgIHRlbXAgPSAwOwotCSAgICAgIGFzX3dhcm4gKF8oIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIpKTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwpCi0JewotCSAgc2VnVCAgIG9sZF9zZWM7Ci0JICBpbnQgICAgb2xkX3N1YnNlYzsKLQkgIGNoYXIgKiBwZnJhZzsKLQkgIGludCAgICBhbGlnbjsKLQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7Ci0KLQkgIG9sZF9zZWMgPSBub3dfc2VnOwotCSAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gICAgICAKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCQkgIAotCSAgYXBwbGljYWJsZSAmPSBTRUNfQUxMT0M7Ci0JICAKLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIGlmIChzYnNzX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIHNic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDApOwotCSAgICAgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUpOwotCSAgICAgIAotCQkgIHNlZ19pbmZvIChzYnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAKLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICBpZiAoemJzc19zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICB6YnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnpic3MiLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2Jzc19zZWN0aW9uLCBhcHBsaWNhYmxlKTsKLQkgICAgICAKLQkJICBzZWdfaW5mbyAoemJzc19zZWN0aW9uKS0+YnNzID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgaWYgKHRic3Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgdGJzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi50YnNzIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHRic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSk7Ci0JCSAgCi0JCSAgc2VnX2luZm8gKHRic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAodGVtcCkKLQkgICAgewotCSAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLwotCSAgICAgIGZvciAoYWxpZ24gPSAwOyAodGVtcCAmIDEpID09IDA7IHRlbXAgPj49IDEsICsrYWxpZ24pCi0JCTsKLQkgICAgICAKLQkgICAgICBpZiAodGVtcCAhPSAxKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBhbGlnbiA9IDA7Ci0JICAKLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHNic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgICAgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotCSAgICAgIHN1YnNlZ19zZXQgKHNic3Nfc2VjdGlvbiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICByZWNvcmRfYWxpZ25tZW50ICh6YnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgICAgICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLQkgICAgICBzdWJzZWdfc2V0ICh6YnNzX3NlY3Rpb24sIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgcmVjb3JkX2FsaWdubWVudCAodGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICAgICAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0JICAgICAgc3Vic2VnX3NldCAodGJzc19zZWN0aW9uLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQkgIAotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0KLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBzYnNzX3NlY3Rpb24pCi0JCXN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gemJzc19zZWN0aW9uKQotCQlzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHRic3Nfc2VjdGlvbikKLQkJc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICAKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKLQkgICpwZnJhZyA9IDA7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2Jzc19zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCB6YnNzX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSRUFfVERBOgotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHRic3Nfc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCSAgICAKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0JICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCWFsbG9jYXRlX2NvbW1vbjoKLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLQkgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCB0ZW1wKTsKLQkgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgaWYgKHNjb21tb25fc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQkJICAKLQkJICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkJICAKLQkJICBzY29tbW9uX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnNjb21tb24iLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2NvbW1vbl9zZWN0aW9uLCBhcHBsaWNhYmxlCi0JCSAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfREFUQQotCQkJfCBTRUNfSEFTX0NPTlRFTlRTKSB8IFNFQ19JU19DT01NT04pOwotCQl9Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2NvbW1vbl9zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICBpZiAoemNvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZAlhcHBsaWNhYmxlOwotCQkgIAotCQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCQkgIAotCQkgIHpjb21tb25fc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuemNvbW1vbiIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB6Y29tbW9uX3NlY3Rpb24sIGFwcGxpY2FibGUKLQkJICAgICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19EQVRBCi0JCQl8IFNFQ19IQVNfQ09OVEVOVFMpIHwgU0VDX0lTX0NPTU1PTik7Ci0JCX0KLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCB6Y29tbW9uX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSRUFfVERBOgotCSAgICAgIGlmICh0Y29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7Ci0JCSAgCi0JCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JCSAgdGNvbW1vbl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi50Y29tbW9uIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHRjb21tb25fc2VjdGlvbiwgYXBwbGljYWJsZQotCQkgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0RBVEEKLQkJCXwgU0VDX0hBU19DT05URU5UUykgfCBTRUNfSVNfQ09NTU9OKTsKLQkJfQotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHRjb21tb25fc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qIEBAIFNvbWUgdXNlIHRoZSBkb3QsIHNvbWUgZG9uJ3QuICBDYW4gd2UgZ2V0IHNvbWUgY29uc2lzdGVuY3k/PyAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcuJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qIEBAIFNvbWUgc2F5IGRhdGEsIHNvbWUgc2F5IGJzcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYnNzXCIiLCA0KQotCSAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZGF0YVwiIiwgNSkpCi0JewotCSAgd2hpbGUgKCotLWlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JICAgIDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCSAgZ290byBiYWRfY29tbW9uX3NlZ21lbnQ7Ci0JfQotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnIicpCi0JOwotICAgICAgZ290byBhbGxvY2F0ZV9jb21tb247Ci0gICAgfQotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZXR1cm47Ci0KLSAgewotICBiYWRfY29tbW9uX3NlZ21lbnQ6Ci0gICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJ1xuJykKLSAgICAgIHArKzsKLSAgICBjID0gKnA7Ci0gICAgKnAgPSAnXDAnOwotICAgIGFzX2JhZCAoXygiYmFkIC5jb21tb24gc2VnbWVudCAlcyIpLCBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKLSAgICAqcCA9IGM7Ci0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkCi1zZXRfbWFjaGluZSAoaW50IG51bWJlcikKLXsKLSAgbWFjaGluZSA9IG51bWJlcjsKLSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIG1hY2hpbmUpOwotCi0gIHN3aXRjaCAobWFjaGluZSkKLSAgICB7Ci0gICAgY2FzZSAwOiBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEU7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7IGJyZWFrOwotICAgIH0KLX0KLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJzZGF0YSIsICAgdjg1MF9zZGF0YSwgICAwfSwKLSAgeyJ0ZGF0YSIsICAgdjg1MF90ZGF0YSwgICAwfSwKLSAgeyJ6ZGF0YSIsICAgdjg1MF96ZGF0YSwgICAwfSwKLSAgeyJzYnNzIiwgICAgdjg1MF9zYnNzLCAgICAwfSwKLSAgeyJ0YnNzIiwgICAgdjg1MF90YnNzLCAgICAwfSwKLSAgeyJ6YnNzIiwgICAgdjg1MF96YnNzLCAgICAwfSwKLSAgeyJyb3NkYXRhIiwgdjg1MF9yb3NkYXRhLCAwfSwKLSAgeyJyb3pkYXRhIiwgdjg1MF9yb3pkYXRhLCAwfSwKLSAgeyJic3MiLCAgICAgdjg1MF9ic3MsICAgICAwfSwKLSAgeyJvZmZzZXQiLCAgdjg1MF9vZmZzZXQsICAwfSwKLSAgeyJ3b3JkIiwgICAgY29ucywgICAgICAgICA0fSwKLSAgeyJ6Y29tbSIsICAgdjg1MF9jb21tLCAgICBBUkVBX1pEQX0sCi0gIHsic2NvbW0iLCAgIHY4NTBfY29tbSwgICAgQVJFQV9TREF9LAotICB7InRjb21tIiwgICB2ODUwX2NvbW0sICAgIEFSRUFfVERBfSwKLSAgeyJ2ODUwIiwgICAgc2V0X21hY2hpbmUsICAwfSwKLSAgeyJjYWxsX3RhYmxlX2RhdGEiLCB2ODUwX2NhbGxfdGFibGVfZGF0YSwgMH0sCi0gIHsiY2FsbF90YWJsZV90ZXh0Iiwgdjg1MF9jYWxsX3RhYmxlX3RleHQsIDB9LAotICB7InY4NTBlIiwgICAgICAgICAgIHNldF9tYWNoaW5lLCAgICAgICAgICBiZmRfbWFjaF92ODUwZX0sCi0gIHsidjg1MGVhIiwgICAgICAgICAgc2V0X21hY2hpbmUsICAgICAgICAgIGJmZF9tYWNoX3Y4NTBlYX0sCi0gIHsgTlVMTCwgICAgIE5VTEwsICAgICAgICAgMH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp2ODUwX2hhc2g7Ci0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQotewotICB7ICJlcCIsICAzMCB9LAkJLyogZXAgLSBlbGVtZW50IHB0ciAqLwotICB7ICJncCIsICAgNCB9LAkJLyogZ3AgLSBnbG9iYWwgcHRyICovCi0gIHsgImhwIiwgICAyIH0sCQkvKiBocCAtIGhhbmRsZXIgc3RhY2sgcHRyICovCi0gIHsgImxwIiwgIDMxIH0sCQkvKiBscCAtIGxpbmsgcHRyICovCi0gIHsgInIwIiwgICAwIH0sCi0gIHsgInIxIiwgICAxIH0sCi0gIHsgInIxMCIsIDEwIH0sCi0gIHsgInIxMSIsIDExIH0sCi0gIHsgInIxMiIsIDEyIH0sCi0gIHsgInIxMyIsIDEzIH0sCi0gIHsgInIxNCIsIDE0IH0sCi0gIHsgInIxNSIsIDE1IH0sCi0gIHsgInIxNiIsIDE2IH0sCi0gIHsgInIxNyIsIDE3IH0sCi0gIHsgInIxOCIsIDE4IH0sCi0gIHsgInIxOSIsIDE5IH0sCi0gIHsgInIyIiwgICAyIH0sCi0gIHsgInIyMCIsIDIwIH0sCi0gIHsgInIyMSIsIDIxIH0sCi0gIHsgInIyMiIsIDIyIH0sCi0gIHsgInIyMyIsIDIzIH0sCi0gIHsgInIyNCIsIDI0IH0sCi0gIHsgInIyNSIsIDI1IH0sCi0gIHsgInIyNiIsIDI2IH0sCi0gIHsgInIyNyIsIDI3IH0sCi0gIHsgInIyOCIsIDI4IH0sCi0gIHsgInIyOSIsIDI5IH0sCi0gIHsgInIzIiwgICAzIH0sCi0gIHsgInIzMCIsIDMwIH0sCi0gIHsgInIzMSIsIDMxIH0sCi0gIHsgInI0IiwgICA0IH0sCi0gIHsgInI1IiwgICA1IH0sCi0gIHsgInI2IiwgICA2IH0sCi0gIHsgInI3IiwgICA3IH0sCi0gIHsgInI4IiwgICA4IH0sCi0gIHsgInI5IiwgICA5IH0sCi0gIHsgInNwIiwgICAzIH0sCQkvKiBzcCAtIHN0YWNrIHB0ciAqLwotICB7ICJ0cCIsICAgNSB9LAkJLyogdHAgLSB0ZXh0IHB0ciAqLwotICB7ICJ6ZXJvIiwgMCB9LAotfTsKLSNkZWZpbmUgUkVHX05BTUVfQ05UCShzaXplb2YgKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2YgKHN0cnVjdCByZWdfbmFtZSkpCi0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBzeXN0ZW1fcmVnaXN0ZXJzW10gPSAKLXsKLSAgeyAiY3RicCIsICAyMCB9LAotICB7ICJjdHBjIiwgIDE2IH0sCi0gIHsgImN0cHN3IiwgMTcgfSwKLSAgeyAiZGJwYyIsICAxOCB9LAotICB7ICJkYnBzdyIsIDE5IH0sCi0gIHsgImVjciIsICAgIDQgfSwKLSAgeyAiZWlwYyIsICAgMCB9LAotICB7ICJlaXBzdyIsICAxIH0sCi0gIHsgImZlcGMiLCAgIDIgfSwKLSAgeyAiZmVwc3ciLCAgMyB9LAotICB7ICJwc3ciLCAgICA1IH0sCi19OwotI2RlZmluZSBTWVNSRUdfTkFNRV9DTlQJKHNpemVvZiAoc3lzdGVtX3JlZ2lzdGVycykgLyBzaXplb2YgKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgc3lzdGVtX2xpc3RfcmVnaXN0ZXJzW10gPQotewotICB7IlBTIiwgICAgICA1IH0sCi0gIHsiU1IiLCAgICAgIDAgKyAxfQotfTsKLSNkZWZpbmUgU1lTUkVHTElTVF9OQU1FX0NOVAkoc2l6ZW9mIChzeXN0ZW1fbGlzdF9yZWdpc3RlcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGNjX25hbWVzW10gPQotewotICB7ICJjIiwgIDB4MSB9LAotICB7ICJlIiwgIDB4MiB9LAotICB7ICJnZSIsIDB4ZSB9LAotICB7ICJndCIsIDB4ZiB9LAotICB7ICJoIiwgIDB4YiB9LAotICB7ICJsIiwgIDB4MSB9LAotICB7ICJsZSIsIDB4NyB9LAotICB7ICJsdCIsIDB4NiB9LAotICB7ICJuIiwgIDB4NCB9LAotICB7ICJuYyIsIDB4OSB9LAotICB7ICJuZSIsIDB4YSB9LAotICB7ICJuaCIsIDB4MyB9LAotICB7ICJubCIsIDB4OSB9LAotICB7ICJucyIsIDB4YyB9LAotICB7ICJudiIsIDB4OCB9LAotICB7ICJueiIsIDB4YSB9LAotICB7ICJwIiwgIDB4YyB9LAotICB7ICJzIiwgIDB4NCB9LAotICB7ICJzYSIsIDB4ZCB9LAotICB7ICJ0IiwgIDB4NSB9LAotICB7ICJ2IiwgIDB4MCB9LAotICB7ICJ6IiwgIDB4MiB9LAotfTsKLSNkZWZpbmUgQ0NfTkFNRV9DTlQJKHNpemVvZiAoY2NfbmFtZXMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIHRhYmxlCi0gICB0byBzZWUgaWYgIm5hbWUiIGlzIGEgdmFsaWQgcmVnaXRlciBuYW1lLiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIKLSAgIG51bWJlciBmcm9tIHRoZSBhcnJheSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLiAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lLCBhY2NlcHRfbnVtYmVycykKLSAgICAgY29uc3Qgc3RydWN0IHJlZ19uYW1lICogcmVnczsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVnY291bnQ7Ci0gICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgIG5hbWU7Ci0gICAgIGJvb2xlYW4gICAgICAgICAgICAgICAgIGFjY2VwdF9udW1iZXJzOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0gIHN5bWJvbFMgKiBzeW1ib2xQOwotCi0gIC8qIElmIHRoZSByZWdpc3RlciBuYW1lIGlzIGEgc3ltYm9sLCB0aGVuIGV2YWx1YXRlIGl0LiAgKi8KLSAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgYW4gYWxpYXMgZm9yIGFub3RoZXIgbmFtZSB0aGVuIHVzZSB0aGF0LgotCSBJZiB0aGUgc3ltYm9sIGlzIGFuIGFsaWFzIGZvciBhIG51bWJlciwgdGhlbiByZXR1cm4gdGhlIG51bWJlci4gICovCi0gICAgICBpZiAoc3ltYm9sX2VxdWF0ZWRfcCAoc3ltYm9sUCkpCi0JewotCSAgbmFtZSA9IFNfR0VUX05BTUUgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltYm9sUCktPlhfYWRkX3N5bWJvbCk7Ci0JfQotICAgICAgZWxzZSBpZiAoYWNjZXB0X251bWJlcnMpCi0JewotCSAgaW50IHJlZyA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgIAotCSAgaWYgKHJlZyA+PSAwICYmIHJlZyA8PSAzMSkKLQkgICAgcmV0dXJuIHJlZzsKLQl9Ci0KLSAgICAgIC8qIE90aGVyd2lzZSBkcm9wIHRocm91Z2ggYW5kIHRyeSBwYXJzaW5nIG5hbWUgbm9ybWFsbHkuICAqLwotICAgIH0KLSAgCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdjb3VudCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcmVnc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHJlZ3NbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaW50ICAgIHJlZ19udW1iZXI7Ci0gIGNoYXIgKiBuYW1lOwotICBjaGFyICogc3RhcnQ7Ci0gIGNoYXIgICBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAocHJlX2RlZmluZWRfcmVnaXN0ZXJzLCBSRUdfTkFNRV9DTlQsCi0JCQkJbmFtZSwgRkFMU0UpOwotCi0gICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAKLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgICAgICAgICA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCAgPSBOVUxMOwotICAgICAgCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwotICAgICAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHN5c3RlbV9yZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46ICBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKiAgICAgIGV4cHJlc3Npb25QIHBvaW50cyB0byBhbiBleHByZXNzaW9uIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgaW4uCi0gKiAgICAgIGFjY2VwdF9udW1iZXJzIGlzIHRydWUgaWZmIG51bWVyaWNhbCByZWdpc3RlciBuYW1lcyBtYXkgYmUgdXNlZC4KLSAqICAgICAgYWNjZXB0X2xpc3RfbmFtZXMgaXMgdHJ1ZSBpZmYgdGhlIHNwZWNpYWwgbmFtZXMgUFMgYW5kIFNSIG1heSBiZSAKLSAqICAgICAgYWNjZXB0ZWQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TIHN0cnVjdHVyZSBpbiBleHByZXNzaW9uUC4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1zeXN0ZW1fcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblAsIGFjY2VwdF9udW1iZXJzLCBhY2NlcHRfbGlzdF9uYW1lcykKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLSAgICAgYm9vbGVhbiAgICAgICBhY2NlcHRfbnVtYmVyczsKLSAgICAgYm9vbGVhbiAgICAgICBhY2NlcHRfbGlzdF9uYW1lczsKLXsKLSAgaW50ICAgIHJlZ19udW1iZXI7Ci0gIGNoYXIgKiBuYW1lOwotICBjaGFyICogc3RhcnQ7Ci0gIGNoYXIgICBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHN5c3RlbV9yZWdpc3RlcnMsIFNZU1JFR19OQU1FX0NOVCwgbmFtZSwKLQkJCQlhY2NlcHRfbnVtYmVycyk7Ci0KLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgCi0gIGlmIChyZWdfbnVtYmVyIDwgMAotICAgICAgJiYgYWNjZXB0X251bWJlcnMpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICAgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0KLSAgICAgIGlmIChpc2RpZ2l0ICgqIGlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgcmVnX251bWJlciA9IHN0cnRvbCAoaW5wdXRfbGluZV9wb2ludGVyLCAmIGlucHV0X2xpbmVfcG9pbnRlciwgMTApOwotCi0JICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGFsbG93YWJsZS4gKi8KLQkgIGlmICggICByZWdfbnVtYmVyIDwgMAotCQkgfHwgcmVnX251bWJlciA+IDUKLQkJICYmIHJlZ19udW1iZXIgPCAxNgotCQkgfHwgcmVnX251bWJlciA+IDIwCi0JCSApCi0JICAgIHsKLQkgICAgICByZWdfbnVtYmVyID0gLTE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChhY2NlcHRfbGlzdF9uYW1lcykKLQl7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChzeXN0ZW1fbGlzdF9yZWdpc3RlcnMsCi0JCQkJCVNZU1JFR0xJU1RfTkFNRV9DTlQsIG5hbWUsIEZBTFNFKTsKLQotCSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLQl9Ci0gICAgfQotICAKLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgICAgICAgICA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCAgPSBOVUxMOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwotICAgICAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIGNjX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1jY19uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaW50ICAgIHJlZ19udW1iZXI7Ci0gIGNoYXIgKiBuYW1lOwotICBjaGFyICogc3RhcnQ7Ci0gIGNoYXIgICBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGNjX25hbWVzLCBDQ19OQU1FX0NOVCwgbmFtZSwgRkFMU0UpOwotCi0gICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gIAotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCAgICAgICAgID0gT19jb25zdGFudDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICA9IE5VTEw7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7Ci0gICAgICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1za2lwX3doaXRlX3NwYWNlICh2b2lkKQotewotICB3aGlsZSAoICAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnCi0JIHx8ICogaW5wdXRfbGluZV9wb2ludGVyID09ICdcdCcpCi0gICAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0vKiBTdW1tYXJ5IG9mIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciAgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIGEgbGlzdCBvZiByZWdpc3RlcnMuCi0gKiAgICAgaW5zbiAgICAgICAgICAgICAgICBpcyB0aGUgcGFydGlhbGx5IGNvbnN0cnVjdGVkIGluc3RydWN0aW9uLgotICogICAgIG9wZXJhbmQgICAgICAgICAgICAgaXMgdGhlIG9wZXJhbmQgYmVpbmcgaW5zZXJ0ZWQuCi0gKgotICogb3V0OiBOVUxMIGlmIHRoZSBwYXJzZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgYQotICogICAgICBwb2ludGVyIHRvIGFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQuICBJZiB0aGUgcGFyc2UKLSAqICAgICAgY29tcGxldGVzIHRoZSBjb3JyZWN0IGJpdCBmaWVsZHMgaW4gdGhlIGluc3RydWN0aW9uCi0gKiAgICAgIHdpbGwgYmUgZmlsbGVkIGluLgotICoKLSAqIFBhcnNlcyByZWdpc3RlciBsaXN0cyB3aXRoIHRoZSBzeW50YXg6Ci0gKgotICogICB7IHJYIH0KLSAqICAgeyByWCwgclkgfQotICogICB7IHJYIC0gclkgfQotICogICB7IHJYIC0gclksIHJaIH0KLSAqICAgZXRjCi0gKgotICogYW5kIGFsc28gcGFyc2VzIGNvbnN0YW50IGVweHJlc3Npb25zIHdob2VzIGJpdHMgaW5kaWNhdGUgdGhlCi0gKiByZWdpc3RlcnMgaW4gdGhlIGxpc3RzLiAgVGhlIExTQiBpbiB0aGUgZXhwcmVzc2lvbiByZWZlcnMgdG8KLSAqIHRoZSBsb3dlc3QgbnVtYmVyZWQgcGVybWlzc2FibGUgcmVnaXN0ZXIgaW4gdGhlIHJlZ2lzdGVyIGxpc3QsCi0gKiBhbmQgc28gb24gdXB3YXJkcy4gIFN5c3RlbSByZWdpc3RlcnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdmVyeQotICogaGlnaCBudW1iZXJzLgotICogCi0gKi8KLXN0YXRpYyBjaGFyICoKLXBhcnNlX3JlZ2lzdGVyX2xpc3QKLSgKLSAgdW5zaWduZWQgbG9uZyAqICAgICAgICAgICAgIGluc24sCi0gIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kCi0pCi17Ci0gIHN0YXRpYyBpbnQgIHR5cGUxX3JlZ3NbIDMyIF0gPSB7IDMwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07Ci0gIHN0YXRpYyBpbnQgIHR5cGUyX3JlZ3NbIDMyIF0gPSB7IDE5LCAxOCwgMTcsIDE2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07Ci0gIHN0YXRpYyBpbnQgIHR5cGUzX3JlZ3NbIDMyIF0gPSB7ICAzLCAgMiwgIDEsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxNCwgMTUsIDEzLCAxMiwgIDcsICA2LCAgNSwgIDQsIDExLCAxMCwgIDksICA4IH07Ci0gIGludCAqICAgICAgIHJlZ3M7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotCi0gIC8qIFNlbGVjdCBhIHJlZ2lzdGVyIGFycmF5IHRvIHBhcnNlLiAqLwotICBzd2l0Y2ggKG9wZXJhbmQtPnNoaWZ0KQotICAgIHsKLSAgICBjYXNlIDB4ZmZlMDAwMDE6IHJlZ3MgPSB0eXBlMV9yZWdzOyBicmVhazsKLSAgICBjYXNlIDB4ZmZmODAwMGY6IHJlZ3MgPSB0eXBlMl9yZWdzOyBicmVhazsKLSAgICBjYXNlIDB4ZmZmODAwMWY6IHJlZ3MgPSB0eXBlM19yZWdzOyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wZXJhbmQgc2hpZnQ6ICV4XG4iKSwgb3BlcmFuZC0+c2hpZnQpOwotICAgICAgcmV0dXJuIF8oImludGVybmFsIGZhaWx1cmUgaW4gcGFyc2VfcmVnaXN0ZXJfbGlzdCIpOwotICAgIH0KLQotICBza2lwX3doaXRlX3NwYWNlICgpOwotCi0gIC8qIElmIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIGEgY3VybHkgYnJhY2UgaXQgaXMgYSByZWdpc3RlciBsaXN0LgotICAgICBPdGhlcndpc2UgaXQgaXMgYSBjb25zdGFudCBleHByZXNzaW9uLCB3aG9lcyBiaXRzIGluZGljYXRlIHdoaWNoCi0gICAgIHJlZ2lzdGVycyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuICAqLwotICAKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyICE9ICd7JykKLSAgICB7Ci0gICAgICBpbnQgYml0czsKLSAgICAgIGludCByZWc7Ci0gICAgICBpbnQgaTsKLQkJCi0gICAgICBleHByZXNzaW9uICgmIGV4cCk7Ci0gICAgICAKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXJldHVybiBfKCJjb25zdGFudCBleHByZXNzaW9uIG9yIHJlZ2lzdGVyIGxpc3QgZXhwZWN0ZWQiKTsKLQotICAgICAgaWYgKHJlZ3MgPT0gdHlwZTFfcmVncykKLQl7Ci0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmIDB4RkZGRkYwMDApCi0JICAgIHJldHVybiBfKCJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIpOwotCSAgCi0JICBmb3IgKHJlZyA9IDIwOyByZWcgPCAzMjsgcmVnICsrKQotCSAgICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IChyZWcgLSAyMCkpKQotCSAgICAgIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCSAgaWYgKHJlZ3NbaV0gPT0gcmVnKQotCQkgICAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCSAgICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChyZWdzID09IHR5cGUyX3JlZ3MpCi0JewotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAweEZGRkUwMDAwKQotCSAgICByZXR1cm4gXygiaGlnaCBiaXRzIHNldCBpbiByZWdpc3RlciBsaXN0IGV4cHJlc3Npb24iKTsKLQkgIAotCSAgZm9yIChyZWcgPSAxOyByZWcgPCAxNjsgcmVnICsrKQotCSAgICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IChyZWcgLSAxKSkpCi0JICAgICAgewotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICBpZiAocmVnc1tpXSA9PSByZWcpCi0JCSAgICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JICAgICAgfQotCi0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IDE1KSkKLQkgICAgKiBpbnNuIHw9ICgxIDw8IDMpOwotCSAgCi0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IDE2KSkKLQkgICAgKiBpbnNuIHw9ICgxIDw8IDE5KTsKLQl9Ci0gICAgICBlbHNlIC8qIHJlZ3MgPT0gdHlwZTNfcmVncyAqLwotCXsKLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgMHhGRkZFMDAwMCkKLQkgICAgcmV0dXJuIF8oImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIik7Ci0JICAKLQkgIGZvciAocmVnID0gMTY7IHJlZyA8IDMyOyByZWcgKyspCi0JICAgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgKHJlZyAtIDE2KSkpCi0JICAgICAgewotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICBpZiAocmVnc1tpXSA9PSByZWcpCi0JCSAgICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JICAgICAgfQotCi0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IDE2KSkKLQkgICAgKiBpbnNuIHw9ICgxIDw8IDE5KTsKLQl9Ci0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0KLSAgLyogUGFyc2UgdGhlIHJlZ2lzdGVyIGxpc3QgdW50aWwgYSB0ZXJtaW5hdG9yIChjbG9zaW5nIGN1cmx5IGJyYWNlIG9yCi0gICAgIG5ldy1saW5lKSBpcyBmb3VuZC4gICovCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKHJlZ2lzdGVyX25hbWUgKCYgZXhwKSkKLQl7Ci0JICBpbnQgIGk7Ci0JICAKLQkgIC8qIExvY2F0ZSB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdGhlIGxpc3QsIGFuZCBpZiBpdCBpcyB0aGVyZSwKLQkgICAgIGluc2VydCB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAocmVnc1sgaSBdID09IGV4cC5YX2FkZF9udW1iZXIpCi0JCXsKLQkJICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaSA9PSAzMikKLQkgICAgewotCSAgICAgIHJldHVybiBfKCJpbGxlZ2FsIHJlZ2lzdGVyIGluY2x1ZGVkIGluIGxpc3QiKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN5c3RlbV9yZWdpc3Rlcl9uYW1lICgmIGV4cCwgdHJ1ZSwgdHJ1ZSkpCi0JewotCSAgaWYgKHJlZ3MgPT0gdHlwZTFfcmVncykKLQkgICAgewotCSAgICAgIHJldHVybiBfKCJzeXN0ZW0gcmVnaXN0ZXJzIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cC5YX2FkZF9udW1iZXIgPT0gNSkKLQkgICAgewotCSAgICAgIGlmIChyZWdzID09IHR5cGUyX3JlZ3MpCi0JCXJldHVybiBfKCJQU1cgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiKTsKLQkgICAgICBlbHNlCi0JCSogaW5zbiB8PSAweDg7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cC5YX2FkZF9udW1iZXIgPCA0KQotCSAgICAqIGluc24gfD0gMHg4MDAwMDsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIF8oIkhpZ2ggdmFsdWUgc3lzdGVtIHJlZ2lzdGVycyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIpOwotCX0KLSAgICAgIGVsc2UgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICd9JykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZSBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotCXsKLQkgIC8qIFdlIGhhdmUgZW5jb3VudGVyZWQgYSByYW5nZSBvZiByZWdpc3RlcnM6IHJYIC0gclkgKi8KLQkgIGludCAgICAgICAgIGo7Ci0JICBleHByZXNzaW9uUyBleHAyOwotCi0JICAvKiBTa2lwIHRoZSBkYXNoLiAgKi8KLQkgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLQotCSAgLyogR2V0IHRoZSBzZWNvbmQgcmVnaXN0ZXIgaW4gdGhlIHJhbmdlLiAgKi8KLQkgIGlmICghIHJlZ2lzdGVyX25hbWUgKCYgZXhwMikpCi0JICAgIHsKLQkgICAgICByZXR1cm4gXygic2Vjb25kIHJlZ2lzdGVyIHNob3VsZCBmb2xsb3cgZGFzaCBpbiByZWdpc3RlciBsaXN0Iik7Ci0JICAgICAgZXhwMi5YX2FkZF9udW1iZXIgPSBleHAuWF9hZGRfbnVtYmVyOwotCSAgICB9Ci0KLQkgIC8qIEFkZCB0aGUgcmVzdCBvZiB0aGUgcmVnaXN0ZXJzIGluIHRoZSByYW5nZS4gICovCi0JICBmb3IgKGogPSBleHAuWF9hZGRfbnVtYmVyICsgMTsgaiA8PSBleHAyLlhfYWRkX251bWJlcjsgaisrKQotCSAgICB7Ci0JICAgICAgaW50ICBpOwotCSAgCi0JICAgICAgLyogTG9jYXRlIHRoZSBnaXZlbiByZWdpc3RlciBpbiB0aGUgbGlzdCwgYW5kIGlmIGl0IGlzIHRoZXJlLAotCQkgaW5zZXJ0IHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCXsKLQkJICBpZiAocmVnc1sgaSBdID09IGopCi0JCSAgICB7Ci0JCSAgICAgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChpID09IDMyKQotCQlyZXR1cm4gXygiaWxsZWdhbCByZWdpc3RlciBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBza2lwX3doaXRlX3NwYWNlICgpOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotQ09OU1QgY2hhciAqIG1kX3Nob3J0b3B0cyA9ICJtOiI7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiBtZF9sb25nb3B0czsgCi0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICogc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBWODUwIG9wdGlvbnM6XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXdhcm4tc2lnbmVkLW92ZXJmbG93ICAgIFdhcm4gaWYgc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3dcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1td2Fybi11bnNpZ25lZC1vdmVyZmxvdyAgV2FybiBpZiB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTAgICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTBlICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW12ODUwZWEgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MGVhXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTBhbnkgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIGdlbmVyaWMsIGRlc3BpdGUgYW55IHByb2Nlc3NvciBzcGVjaWZpYyBpbnN0cnVjdGlvbnNcbiIpKTsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50ICAgIGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIGlmIChjICE9ICdtJykKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ1bmtub3duIGNvbW1hbmQgbGluZSBvcHRpb246IC0lYyVzXG4iKSwgYywgYXJnKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoc3RyY21wIChhcmcsICJ3YXJuLXNpZ25lZC1vdmVyZmxvdyIpID09IDApCi0gICAgewotICAgICAgd2Fybl9zaWduZWRfb3ZlcmZsb3dzID0gVFJVRTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAid2Fybi11bnNpZ25lZC1vdmVyZmxvdyIpID09IDApCi0gICAgewotICAgICAgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MgPSBUUlVFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwIikgPT0gMCkKLSAgICB7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTBlIikgPT0gMCkKLSAgICB7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfdjg1MGU7Ci0gICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MGVhIikgPT0gMCkKLSAgICB7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfdjg1MGVhOwotICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwYW55IikgPT0gMCkKLSAgICB7Ci0gICAgICBtYWNoaW5lID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlbGwgdGhlIHdvcmxkIHRoYXQgdGhpcyBpcyBmb3IgYW55IHY4NTAgY2hpcC4gICovCi0gICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7IC8qIEJ1dCBzdXBwb3J0IGluc3RydWN0aW9ucyBmb3IgdGhlIGV4dGVuZGVkIHZlcnNpb25zLiAgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ1bmtub3duIGNvbW1hbmQgbGluZSBvcHRpb246IC0lYyVzXG4iKSwgYywgYXJnKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIHJldHVybiAxOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKiBuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRwLCBzaXplcCkKLSAgaW50ICAgIHR5cGU7Ci0gIGNoYXIgKiBsaXRwOwotICBpbnQgKiAgc2l6ZXA7Ci17Ci0gIGludCAgICAgICAgICAgIHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICogICAgICAgICB0OwotICBpbnQgICAgICAgICAgICBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplcCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLSAgCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplcCA9IHByZWMgKiAyOwotCi0gIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLSAgICAgIGxpdHAgKz0gMjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogVmVyeSBncm9zcy4gICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqICAgICAgYWJmZDsKLSAgYXNlY3Rpb24gKiBzZWM7Ci0gIGZyYWdTICogICAgZnJhZ1A7Ci17Ci0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gIAotICAvKiBJbiByYW5nZSBjb25kaXRpb25hbCBvciB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwIHx8IGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19VTlVTRUQgKyAoaW50KWZyYWdQLT5mcl9vcGNvZGUpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICAvKiBPdXQgb2YgcmFuZ2UgY29uZGl0aW9uYWwgYnJhbmNoLiAgRW1pdCBhIGJyYW5jaCBhcm91bmQgYSBqdW1wLiAgKi8KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAKLQkodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKLQotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgYnVmZmVyWzBdIF49IDB4MDg7Ci0gICAgICAvKiBNYXNrIG9mZiBhbGwgdGhlIGRpc3BsYWNlbWVudCBiaXRzLiAgKi8KLSAgICAgIGJ1ZmZlclswXSAmPSAweDhmOwotICAgICAgYnVmZmVyWzFdICY9IDB4MDc7Ci0gICAgICAvKiBOb3cgc2V0IHRoZSBkaXNwbGFjZW1lbnQgYml0cyBzbyB0aGF0IHdlIGJyYW5jaAotCSBhcm91bmQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIGJ1ZmZlclswXSB8PSAweDMwOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZSBmaW5hbAotCSB0YXJnZXQuICAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXIgKyAyLCAweDAwMDAwNzgwLCA0KTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1VOVVNFRCArCi0JICAgICAgIChpbnQpIGZyYWdQLT5mcl9vcGNvZGUgKyAxKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotICAgIH0KLSAgLyogT3V0IG9mIHJhbmdlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgRW1pdCBhIGp1bXAuICAqLwotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsLCAweDAwMDAwNzgwLCA0KTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfVU5VU0VEICsKLQkgICAgICAgKGludCkgZnJhZ1AtPmZyX29wY29kZSArIDEpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqIHNlZzsKLSAgICAgdmFsdWVUICAgICBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlICogb3A7Ci0gIGZsYWd3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGU7Ci0KLSAgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJ2ODUwZWEiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtYWNoaW5lID09IC0xKQotCW1hY2hpbmUgPSBiZmRfbWFjaF92ODUwZWE7Ci0gICAgICAKLSAgICAgIGlmIChwcm9jZXNzb3JfbWFzayA9PSAtMSkKLQlwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChUQVJHRVRfQ1BVLCAidjg1MGUiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtYWNoaW5lID09IC0xKQotCW1hY2hpbmUgICAgICAgID0gYmZkX21hY2hfdjg1MGU7Ci0gICAgICAKLSAgICAgIGlmIChwcm9jZXNzb3JfbWFzayA9PSAtMSkKLQlwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRTsKLSAgICB9Ci0gIGVsc2UKLSAgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJ2ODUwIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWFjaGluZSA9PSAtMSkKLQltYWNoaW5lICAgICAgICA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChwcm9jZXNzb3JfbWFzayA9PSAtMSkKLQlwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwOwotICAgIH0KLSAgZWxzZQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgYXNfYmFkIChfKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGRlZmF1bHQgdGFyZ2V0IHByb2Nlc3NvciBmcm9tIHN0cmluZzogJXMiKSwgCi0gICAgICAgICAgICBUQVJHRVRfQ1BVKTsKLQotICB2ODUwX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIFY4NTAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIG9wID0gdjg1MF9vcGNvZGVzOwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcC0+bmFtZSkpIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKHY4NTBfaGFzaCwgb3AtPm5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBUQVJHRVRfQVJDSCwgbWFjaGluZSk7Ci0KLSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gIAotICBjYWxsX3RhYmxlX2RhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuY2FsbF90YWJsZV9kYXRhIiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBjYWxsX3RhYmxlX2RhdGFfc2VjdGlvbiwKLQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIAotICBjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuY2FsbF90YWJsZV90ZXh0IiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiwKLQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZCi0JCQkJICAgICAgIHwgU0VDX0NPREUpKTsKLSAgCi0gIC8qIFJlc3RvcmUgdGV4dCBzZWN0aW9uIGFzIHRoZSBjdXJyZW50IGRlZmF1bHQuICAqLwotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotfQotCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWhhbmRsZV9jdG9mZiAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kID09IE5VTEwpCi0gICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVDsKLQotICBpZiAoICAgb3BlcmFuZC0+Yml0cyAgIT0gNgotICAgICAgfHwgb3BlcmFuZC0+c2hpZnQgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImN0b2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiKSk7Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzY0OyAgLyogVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotICAgIH0KLSAgICAgIAotICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotaGFuZGxlX3NkYW9mZiAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMTUgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMTcpIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQ7Ci0gIAotICBpZiAoICAgb3BlcmFuZC0+Yml0cyAgIT0gMTYKLSAgICAgIHx8IG9wZXJhbmQtPnNoaWZ0ICE9IDE2KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic2Rhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiKSk7Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzY0OyAgLyogVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotICAgIH0KLSAgCi0gIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1oYW5kbGVfemRhb2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAxNSAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxNykgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQ7Ci0gIGlmIChvcGVyYW5kLT5iaXRzID09IC0xKSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDsKLQotICBpZiAoICAgb3BlcmFuZC0+Yml0cyAgIT0gMTYKLSAgICAgIHx8IG9wZXJhbmQtPnNoaWZ0ICE9IDE2KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiemRhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiKSk7Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzY0OyAgLyogVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotICAgIH0KLSAgCi0gIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1oYW5kbGVfdGRhb2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUOyAgLyogZGF0YSBpdGVtLCBub3QgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSA2ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDEpICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQ7ICAvKiBzbGQudy9zc3Qudywgb3BlcmFuZDogRDhfNiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gNCAmJiBvcGVyYW5kLT5pbnNlcnQgIT0gTlVMTCkgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VUOyAgLyogc2xkLmh1LCBvcGVyYW5kOiBENS00ICovCi0gIGlmIChvcGVyYW5kLT5iaXRzID09IDQgJiYgb3BlcmFuZC0+aW5zZXJ0ID09IE5VTEwpIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVDsgIC8qIHNsZC5idSwgb3BlcmFuZDogRDQgICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAxNiAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxNikgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVDsgLyogc2V0MSAmIGNodW1zLCBvcGVyYW5kczogRDE2ICovCi0gIAotICBpZiAob3BlcmFuZC0+Yml0cyAhPSA3KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidGRhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiKSk7Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzY0OyAgLyogVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotICAgIH0KLSAgCi0gIHJldHVybiAgb3BlcmFuZC0+aW5zZXJ0ICE9IE5VTEwKLSAgICA/IEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VUICAgICAvKiBzbGQuaC9zc3QuaCwgb3BlcmFuZDogRDhfNyAqLwotICAgIDogQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQ7ICAgIC8qIHNsZC5iL3NzdC5iLCBvcHJlYW5kOiBENyAgICovCi19Ci0KLS8qIFdhcm5pbmc6IFRoZSBjb2RlIGluIHRoaXMgZnVuY3Rpb24gcmVsaWVzIHVwb24gdGhlIGRlZmluaXRpb25zCi0gICBpbiB0aGUgdjg1MF9vcGVyYW5kc1tdIGFycmF5IChkZWZpbmVkIGluIG9wY29kZXMvdjg1MC1vcGMuYykKLSAgIG1hdGNoaW5nIHRoZSBoYXJkIGNvZGVkIHZhbHVlcyBjb250YWluZWQgaGVyZWluLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotdjg1MF9yZWxvY19wcmVmaXggKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBib29sZWFuIHBhcmVuX3NraXBwZWQgPSBmYWxzZTsKLQotCi0gIC8qIFNraXAgbGVhZGluZyBvcGVuaW5nIHBhcmVudGhlc2lzLiAgKi8KLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcoJykKLSAgICB7Ci0gICAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBwYXJlbl9za2lwcGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSNkZWZpbmUgQ0hFQ0tfKG5hbWUsIHJlbG9jKSAJCQkJCQlcCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsIG5hbWUjIyIoIiwgc3RybGVuIChuYW1lKSArIDEpID09IDApCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IHN0cmxlbiAobmFtZSk7CQkJCVwKLSAgICAgIHJldHVybiByZWxvYzsJCQkJCQkJXAotICAgIH0KLSAgCi0gIENIRUNLXyAoImhpMCIsICAgIEJGRF9SRUxPQ19ISTE2KTsKLSAgQ0hFQ0tfICgiaGkiLCAgICAgQkZEX1JFTE9DX0hJMTZfUyk7Ci0gIENIRUNLXyAoImxvIiwgICAgIEJGRF9SRUxPQ19MTzE2KTsKLSAgQ0hFQ0tfICgic2Rhb2ZmIiwgaGFuZGxlX3NkYW9mZiAob3BlcmFuZCkpOwotICBDSEVDS18gKCJ6ZGFvZmYiLCBoYW5kbGVfemRhb2ZmIChvcGVyYW5kKSk7Ci0gIENIRUNLXyAoInRkYW9mZiIsIGhhbmRsZV90ZGFvZmYgKG9wZXJhbmQpKTsKLSAgQ0hFQ0tfICgiaGlsbyIsICAgQkZEX1JFTE9DXzMyKTsKLSAgQ0hFQ0tfICgiY3RvZmYiLCAgaGFuZGxlX2N0b2ZmIChvcGVyYW5kKSk7Ci0gIAotICAvKiBSZXN0b3JlIHNraXBwZWQgcGFyZW50aGVzaXMuICAqLwotICBpZiAocGFyZW5fc2tpcHBlZCkKLSAgICAtLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICByZXR1cm4gQkZEX1JFTE9DX1VOVVNFRDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi12ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCB2YWwsIGZpbGUsIGxpbmUsIHN0cikKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kOwotICAgICBvZmZzZXRUICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgZmlsZTsKLSAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGxpbmU7Ci0gICAgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBzdHI7Ci17Ci0gIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2UgPSBOVUxMOwotICAgICAgCi0gICAgICBpbnNuID0gb3BlcmFuZC0+aW5zZXJ0IChpbnNuLCB2YWwsICYgbWVzc2FnZSk7Ci0gICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKQotCXsKLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCSAgICAgICYmICEgd2Fybl9zaWduZWRfb3ZlcmZsb3dzCi0JICAgICAgJiYgc3Ryc3RyIChtZXNzYWdlLCAib3V0IG9mIHJhbmdlIikgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIHNraXAgd2FybmluZy4uLiAqLwotCSAgICB9Ci0JICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKSA9PSAwCi0JCSAgICYmICEgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MKLQkJICAgJiYgc3Ryc3RyIChtZXNzYWdlLCAib3V0IG9mIHJhbmdlIikgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIHNraXAgd2FybmluZy4uLiAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHIpCi0JICAgIHsKLQkgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCQlhc193YXJuICgiJXM6ICVzIiwgc3RyLCBtZXNzYWdlKTsKLQkgICAgICBlbHNlCi0JCWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsICIlczogJXMiLCBzdHIsIG1lc3NhZ2UpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCQlhc193YXJuIChtZXNzYWdlKTsKLQkgICAgICBlbHNlCi0JCWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIG1lc3NhZ2UpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyKQotCXsKLQkgIGxvbmcgICAgbWluLCBtYXg7Ci0JICBvZmZzZXRUIHRlc3Q7Ci0KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgd2Fybl9zaWduZWRfb3ZlcmZsb3dzKQotCQltYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICAgICAgZWxzZQotCQltYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICAgICAgCi0JICAgICAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgICAgIAotCSAgICAgIGlmICghIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzKQotCQltaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCSAgICAgIGVsc2UKLQkJbWluID0gMDsKLQkgICAgfQotCSAgCi0JICBpZiAodmFsIDwgKG9mZnNldFQpIG1pbiB8fCB2YWwgPiAob2Zmc2V0VCkgbWF4KQotCSAgICB7Ci0JICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgICBjb25zdCBjaGFyICogZXJyID0gXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpOwotCSAgICAgIGNoYXIgICAgICAgICBidWZbMTAwXTsKLQkgICAgICAKLQkgICAgICAvKiBSZXN0b3JlIG1pbiBhbmQgbWl4IHRvIGV4cGVjdGVkIHZhbHVlcyBmb3IgZGVjaW1hbCByYW5nZXMuICAqLwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCQkgICYmICEgd2Fybl9zaWduZWRfb3ZlcmZsb3dzKQotCQltYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0KLQkgICAgICBpZiAoISAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCQkgICYmICEgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MpCi0JCW1pbiA9IDA7Ci0KLQkgICAgICBpZiAoc3RyKQotCQl7Ci0JCSAgc3ByaW50ZiAoYnVmLCAiJXM6ICIsIHN0cik7Ci0JCSAgCi0JCSAgc3ByaW50X3ZhbHVlIChidWYgKyBzdHJsZW4gKGJ1ZiksIHZhbCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXNwcmludF92YWx1ZSAoYnVmLCB2YWwpOwotCSAgICAgIAotCSAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JCWFzX3dhcm4gKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICAgICAgZWxzZQotCQlhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgICB9Ci0JfQotCi0gICAgICBpbnNuIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0gICAgfQotICAKLSAgcmV0dXJuIGluc247Ci19Ci0KLQwKLXN0YXRpYyBjaGFyICAgICAgICAgICAgICAgICBjb3B5X29mX2luc3RydWN0aW9uIFsxMjhdOwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKSAKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICBzOwotICBjaGFyICogICAgICAgICAgICAgICAgICAgIHN0YXJ0X29mX29wZXJhbmRzOwotICBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiAgICAgIG9wY29kZTsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICogICAgICBuZXh0X29wY29kZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqICAgICBvcGluZGV4X3B0cjsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICBuZXh0X29waW5kZXg7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgcmVsYXhhYmxlOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgaW5zbl9zaXplOwotICBjaGFyICogICAgICAgICAgICAgICAgICAgIGY7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDsKLSAgYm9vbGVhbiAgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSBmYWxzZTsKLSAgdW5zaWduZWQgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhX2xlbjsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBleHRyYV9kYXRhOwotICBjaGFyICoJCSAgICBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgCi0gIHN0cm5jcHkgKGNvcHlfb2ZfaW5zdHJ1Y3Rpb24sIHN0ciwgc2l6ZW9mIChjb3B5X29mX2luc3RydWN0aW9uKSAtIDEpOwotICAKLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICBjb250aW51ZTsKLSAgCi0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIGZpbmQgdGhlIGZpcnN0IG9wY29kZSB3aXRoIHRoZSBwcm9wZXIgbmFtZSAqLwotICBvcGNvZGUgPSAoc3RydWN0IHY4NTBfb3Bjb2RlICopIGhhc2hfZmluZCAodjg1MF9oYXNoLCBzdHIpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RyID0gczsKLSAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLSAgICArKyBzdHI7Ci0KLSAgc3RhcnRfb2Zfb3BlcmFuZHMgPSBzdHI7Ci0KLSAgc2F2ZWRfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLQotICAgICAgbWF0Y2ggPSAwOwotICAgICAgCi0gICAgICBpZiAoKG9wY29kZS0+cHJvY2Vzc29ycyAmIHByb2Nlc3Nvcl9tYXNrKSA9PSAwKQotCXsKLQkgIGVycm1zZyA9IF8oIlRhcmdldCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGluc3RydWN0aW9uLiIpOwotCSAgZ290byBlcnJvcjsKLQl9Ci0gICAgICAKLSAgICAgIHJlbGF4YWJsZSA9IDA7Ci0gICAgICBmYyA9IDA7Ci0gICAgICBuZXh0X29waW5kZXggPSAwOwotICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotICAgICAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gZmFsc2U7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0ciA9IHN0YXJ0X29mX29wZXJhbmRzOwotCi0gICAgICBmb3IgKG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXhfcHRyICE9IDA7IG9waW5kZXhfcHRyICsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kOwotCSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIGhvbGQ7Ci0JICBleHByZXNzaW9uUyAgICAgICAgICAgICAgICAgZXg7Ci0JICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgICAgcmVsb2M7Ci0KLQkgIGlmIChuZXh0X29waW5kZXggPT0gMCkKLQkgICAgewotCSAgICAgIG9wZXJhbmQgPSAmIHY4NTBfb3BlcmFuZHNbICogb3BpbmRleF9wdHIgXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCAgICAgID0gJiB2ODUwX29wZXJhbmRzWyBuZXh0X29waW5kZXggXTsKLQkgICAgICBuZXh0X29waW5kZXggPSAwOwotCSAgICB9Ci0KLQkgIGVycm1zZyA9IE5VTEw7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJyB8fCAqc3RyID09ICdbJyB8fCAqc3RyID09ICddJykKLQkgICAgKysgc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVMQVgpCi0JICAgIHJlbGF4YWJsZSA9IDE7Ci0KLQkgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gKi8KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JICAKLQkgIC8qIGxvKCksIGhpKCksIGhpMCgpLCBldGMuLi4gKi8KLQkgIGlmICgocmVsb2MgPSB2ODUwX3JlbG9jX3ByZWZpeCAob3BlcmFuZCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZmFrZSByZWxvYywgdXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotCSAgICAgIGlmIChyZWxvYyA9PSBCRkRfUkVMT0NfNjQpCi0JCXsKLQkJICBtYXRjaCA9IDE7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCQkgCi0JICAgICAgZXhwcmVzc2lvbiAoJiBleCk7Ci0KLQkgICAgICBpZiAoZXguWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgc3dpdGNoIChyZWxvYykKLQkJICAgIHsKLQkJICAgIGNhc2UgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDoKLQkJICAgICAgLyogVG8gY29wZSB3aXRoICJub3QxIDcsIHpkYW9mZigweGZmZmZmMDA2KVtyMF0iCi0JCQkgYW5kIHRoZSBsaWtlLiAgKi8KLQkJICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJICAgICAgCi0JCSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCQkgICAgICB7Ci0JCQkvKiBUcnVuY2F0ZSwgdGhlbiBzaWduIGV4dGVuZCB0aGUgdmFsdWUuICAqLwotCQkJZXguWF9hZGRfbnVtYmVyID0gU0VYVDE2IChleC5YX2FkZF9udW1iZXIpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLQkJICAgICAgewotCQkJLyogVHJ1bmNhdGUsIHRoZW4gc2lnbiBleHRlbmQgdGhlIHZhbHVlLiAgKi8KLQkJCWV4LlhfYWRkX251bWJlciA9IFNFWFQxNiAoZXguWF9hZGRfbnVtYmVyID4+IDE2KTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkJICAgICAgewotCQkJLyogVHJ1bmNhdGUsIHRoZW4gc2lnbiBleHRlbmQgdGhlIHZhbHVlLiAgKi8KLQkJICAgICAgICBpbnQgdGVtcCA9IChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCi0JCQl0ZW1wICs9IChleC5YX2FkZF9udW1iZXIgPj4gMTUpICYgMTsKLQotCQkJZXguWF9hZGRfbnVtYmVyID0gU0VYVDE2ICh0ZW1wKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICAKLQkJICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotCQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMzIpID09IDApCi0JCQl7Ci0JCQkgIGVycm1zZyA9IF8oImltbWVkaWF0ZSBvcGVyYW5kIGlzIHRvbyBsYXJnZSIpOwotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgICAKLQkJICAgICAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gdHJ1ZTsKLQkJICAgICAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gNDsKLQkJICAgICAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOwotCQkgICAgICBleC5YX2FkZF9udW1iZXIgICAgICAgPSAwOwotCQkgICAgICBicmVhazsKLQkJICAgICAgCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJyZWxvYzogJWRcbiIsIHJlbG9jKTsKLQkJICAgICAgYXNfYmFkIChfKCJBQUFSRyAtPiB1bmhhbmRsZWQgY29uc3RhbnQgcmVsb2MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgaWYgKGZjID4gTUFYX0lOU05fRklYVVBTKQotCQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQkJICAKLQkJICBmaXh1cHNbIGZjIF0uZXhwICAgICA9IGV4OwotCQkgIGZpeHVwc1sgZmMgXS5vcGluZGV4ID0gKiBvcGluZGV4X3B0cjsKLQkJICBmaXh1cHNbIGZjIF0ucmVsb2MgICA9IHJlbG9jOwotCQkgIGZjKys7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocmVsb2MgPT0gQkZEX1JFTE9DXzMyKQotCQkgICAgewotCQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMzIpID09IDApCi0JCQl7Ci0JCQkgIGVycm1zZyA9IF8oImltbWVkaWF0ZSBvcGVyYW5kIGlzIHRvbyBsYXJnZSIpOwotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgICAKLQkJICAgICAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gdHJ1ZTsKLQkJICAgICAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gNDsKLQkJICAgICAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOwotCQkgICAgfQotCQkgICAgICAKLQkJICBpZiAoZmMgPiBNQVhfSU5TTl9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JCSAgZml4dXBzWyBmYyBdLmV4cCAgICAgPSBleDsKLQkJICBmaXh1cHNbIGZjIF0ub3BpbmRleCA9ICogb3BpbmRleF9wdHI7Ci0JCSAgZml4dXBzWyBmYyBdLnJlbG9jICAgPSByZWxvYzsKLQkJICBmYysrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVycm1zZyA9IE5VTEw7Ci0JICAgICAgCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpICE9IDApIAotCQl7Ci0JCSAgaWYgKCFyZWdpc3Rlcl9uYW1lICgmIGV4KSkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCByZWdpc3RlciBuYW1lIik7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9OT1RfUjApCi0JCSAgICAgICYmIGV4LlhfYWRkX251bWJlciA9PSAwKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJyZWdpc3RlciByMCBjYW5ub3QgYmUgdXNlZCBoZXJlIik7Ci0JCSAgICAgIAotCQkgICAgICAvKiBGb3JjZSBhbiBlcnJvciBtZXNzYWdlIHRvIGJlIGdlbmVyYXRlZCBieQotCQkJIHNraXBwaW5nIG92ZXIgYW55IGZvbGxvd2luZyBwb3RlbnRpYWwgbWF0Y2hlcwotCQkJIGZvciB0aGlzIG9wY29kZS4gICovCi0JCSAgICAgIG9wY29kZSArPSAzOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NSRykgIT0gMCkgCi0JCXsKLQkJICBpZiAoIXN5c3RlbV9yZWdpc3Rlcl9uYW1lICgmIGV4LCB0cnVlLCBmYWxzZSkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oImludmFsaWQgc3lzdGVtIHJlZ2lzdGVyIG5hbWUiKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9FUCkgIT0gMCkKLQkJewotCQkgIGNoYXIgKiBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBjaGFyICAgYyAgICAgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkJICAKLQkJICBpZiAoc3RyY21wIChzdGFydCwgImVwIikgIT0gMCAmJiBzdHJjbXAgKHN0YXJ0LCAicjMwIikgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogUHV0IHRoaW5ncyBiYWNrIHRoZSB3YXkgd2UgZm91bmQgdGhlbS4gICovCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKLQkJICAgICAgZXJybXNnID0gXygiZXhwZWN0ZWQgRVAgcmVnaXN0ZXIiKTsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICAKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICAKLQkJICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcgfHwgKnN0ciA9PSAnWycgfHwgKnN0ciA9PSAnXScpCi0JCSAgICArKyBzdHI7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfQ0MpICE9IDApIAotCQl7Ci0JCSAgaWYgKCFjY19uYW1lICgmIGV4KSkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCBjb25kaXRpb24gY29kZSBuYW1lIik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX1BVU0hfUE9QKSAKLQkJewotCQkgIGVycm1zZyA9IHBhcnNlX3JlZ2lzdGVyX2xpc3QgKCYgaW5zbiwgb3BlcmFuZCk7Ci0JCSAgCi0JCSAgLyogVGhlIHBhcnNlX3JlZ2lzdGVyX2xpc3QoKSBmdW5jdGlvbiBoYXMgYWxyZWFkeSBkb25lCi0JCSAgICAgZXZlcnl0aGluZywgc28gZmFrZSBhIGR1bW15IGV4cHJlc3Npb24uICAqLwotCQkgIGV4Llhfb3AgICAgICAgICA9IE9fY29uc3RhbnQ7Ci0JCSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMTYpIAotCQl7Ci0JCSAgZXhwcmVzc2lvbiAoJiBleCk7Ci0KLQkJICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgZXJybXNnID0gXygiY29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCQkgIGVsc2UgaWYgKGV4LlhfYWRkX251bWJlciAmIDB4ZmZmZjAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChleC5YX2FkZF9udW1iZXIgJiAweGZmZmYpCi0JCQllcnJtc2cgPSBfKCJjb25zdGFudCB0b28gYmlnIHRvIGZpdCBpbnRvIGluc3RydWN0aW9uIik7Ci0JCSAgICAgIGVsc2UgaWYgKChpbnNuICYgMHgwMDFmZmZjMCkgPT0gMHgwMDEzMDc4MCkKLQkJCWV4LlhfYWRkX251bWJlciA+Pj0gMTY7Ci0JCSAgICAgIGVsc2UKLQkJCWVycm1zZyA9IF8oImNvbnN0YW50IHRvbyBiaWcgdG8gZml0IGludG8gaW5zdHJ1Y3Rpb24iKTsKLQkJICAgIH0KLQkJICAKLQkJICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOwotCQkgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDI7Ci0JCSAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOwotCQkgIGV4LlhfYWRkX251bWJlciAgICAgICA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX0lNTUVESUFURTMyKSAKLQkJewotCQkgIGV4cHJlc3Npb24gKCYgZXgpOwotCQkgIAotCQkgIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICBlcnJtc2cgPSBfKCJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JCSAgCi0JCSAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gdHJ1ZTsKLQkJICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSA0OwotCQkgIGV4dHJhX2RhdGEgICAgICAgICAgICA9IGV4LlhfYWRkX251bWJlcjsKLQkJICBleC5YX2FkZF9udW1iZXIgICAgICAgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocmVnaXN0ZXJfbmFtZSAoJiBleCkKLQkJICAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpID09IDApCi0JCXsKLQkJICBjaGFyIGM7Ci0JCSAgaW50ICBleGlzdHMgPSAwOwotCQkgIAotCQkgIC8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgYW4gYWxpYXMgaGFzIGJlZW4gZGVmaW5lZCB0aGF0Ci0JCSAgICAgbWF0Y2hlcyBhIHJlZ2lzdGVyIG5hbWUuICBGb3IgZXhhbXBsZSB0aGUgY29kZSBtYXkKLQkJICAgICBpbmNsdWRlIGEgIi5zZXQgWkVSTywgMCIgZGlyZWN0aXZlLCB3aGljaCBtYXRjaGVzCi0JCSAgICAgdGhlIHJlZ2lzdGVyIG5hbWUgInplcm8iLiAgQXR0ZW1wdCB0byByZXBhcnNlIHRoZQotCQkgICAgIGZpZWxkIGFzIGFuIGV4cHJlc3Npb24sIGFuZCBvbmx5IGNvbXBsYWluIGlmIHdlCi0JCSAgICAgY2Fubm90IGdlbmVyYXRlIGEgY29uc3RhbnQuICAqLwotCi0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0JCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCQkgIAotCQkgIGlmIChzeW1ib2xfZmluZCAoc3RyKSAhPSBOVUxMKQotCQkgICAgZXhpc3RzID0gMTsKLQkJICAKLQkJICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCQkgIAotCQkgIGV4cHJlc3Npb24gKCYgZXgpOwotCi0JCSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgdGhpcyByZWdpc3RlciBpcyBhY3R1YWxseSBvY2N1cmluZyB0b28gZWFybHkgb24KLQkJCSB0aGUgcGFyc2luZyBvZiB0aGUgaW5zdHJ1Y3Rpb24sIChiZWNhdXNlIGFub3RoZXIKLQkJCSBmaWVsZCBpcyBtaXNzaW5nKSB0aGVuIHJlcG9ydCB0aGlzLiAgKi8KLQkJICAgICAgaWYgKG9waW5kZXhfcHRyWzFdICE9IDAKLQkJCSAgJiYgKHY4NTBfb3BlcmFuZHMgW29waW5kZXhfcHRyIFsxXV0uZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSkKLQkJCWVycm1zZyA9IF8oInN5bnRheCBlcnJvcjogdmFsdWUgaXMgbWlzc2luZyBiZWZvcmUgdGhlIHJlZ2lzdGVyIG5hbWUiKTsKLQkJICAgICAgZWxzZQotCQkJZXJybXNnID0gXygic3ludGF4IGVycm9yOiByZWdpc3RlciBub3QgZXhwZWN0ZWQiKTsKLQotCQkgICAgICAvKiBJZiB3ZSBjcmVhdGVkIGEgc3ltYm9sIGluIHRoZSBwcm9jZXNzIG9mIHRoaXMgdGVzdCB0aGVuCi0JCQkgZGVsZXRlIGl0IG5vdywgc28gdGhhdCBpdCB3aWxsIG5vdCBiZSBvdXRwdXQgd2l0aCB0aGUgcmVhbAotCQkJIHN5bWJvbHMuLi4gKi8KLQkJICAgICAgaWYgKGV4aXN0cyA9PSAwCi0JCQkgICYmIGV4Llhfb3AgPT0gT19zeW1ib2wpCi0JCQlzeW1ib2xfcmVtb3ZlIChleC5YX2FkZF9zeW1ib2wsCi0JCQkJICAgICAgICYgc3ltYm9sX3Jvb3RQLCAmIHN5bWJvbF9sYXN0UCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzeXN0ZW1fcmVnaXN0ZXJfbmFtZSAoJiBleCwgZmFsc2UsIGZhbHNlKQotCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NSRykgPT0gMCkKLQkJewotCQkgIGVycm1zZyA9IF8oInN5bnRheCBlcnJvcjogc3lzdGVtIHJlZ2lzdGVyIG5vdCBleHBlY3RlZCIpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoY2NfbmFtZSAoJmV4KQotCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX0NDKSA9PSAwKQotCQl7Ci0JCSAgZXJybXNnID0gXygic3ludGF4IGVycm9yOiBjb25kaXRpb24gY29kZSBub3QgZXhwZWN0ZWQiKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGV4cHJlc3Npb24gKCYgZXgpOwotCQkgIC8qIFNwZWNpYWwgY2FzZToKLQkJICAgICBJZiB3ZSBhcmUgYXNzZW1ibGluZyBhIE1PViBpbnN0cnVjdGlvbiAob3IgYSBDQUxMVC4uLi4gOi0pCi0JCSAgICAgYW5kIHRoZSBpbW1lZGlhdGUgdmFsdWUgZG9lcyBub3QgZml0IGludG8gdGhlIGJpdHMKLQkJICAgICBhdmFpbGFibGUgdGhlbiBjcmVhdGUgYSBmYWtlIGVycm9yIHNvIHRoYXQgdGhlIG5leHQgTU9WCi0JCSAgICAgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBzZWxlY3RlZC4gIFRoaXMgb25lIGhhcyBhIDMyIGJpdAotCQkgICAgIGltbWVkaWF0ZSBmaWVsZC4gICovCi0KLQkJICBpZiAoKChpbnNuICYgMHgwN2UwKSA9PSAweDAyMDApCi0JCSAgICAgICYmIGV4Llhfb3AgPT0gT19jb25zdGFudAotCQkgICAgICAmJiAoZXguWF9hZGRfbnVtYmVyIDwgKC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkpCi0JCQkgIHx8IGV4LlhfYWRkX251bWJlciA+ICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSkKLQkJICAgIGVycm1zZyA9IF8oImltbWVkaWF0ZSBvcGVyYW5kIGlzIHRvbyBsYXJnZSIpOwotCQl9Ci0KLQkgICAgICBpZiAoZXJybXNnKQotCQlnb3RvIGVycm9yOwotCSAgICAgIAotLyogZnByaW50ZiAoc3RkZXJyLCAiIGluc246ICV4LCBvcGVyYW5kICVkLCBvcDogJWQsIGFkZF9udW1iZXI6ICVkXG4iLAotICAgaW5zbiwgb3BpbmRleF9wdHIgLSBvcGNvZGUtPm9wZXJhbmRzLCBleC5YX29wLCBleC5YX2FkZF9udW1iZXIpOyAqLwotCi0JICAgICAgc3dpdGNoIChleC5YX29wKSAKLQkJewotCQljYXNlIE9faWxsZWdhbDoKLQkJICBlcnJtc2cgPSBfKCJpbGxlZ2FsIG9wZXJhbmQiKTsKLQkJICBnb3RvIGVycm9yOwotCQljYXNlIE9fYWJzZW50OgotCQkgIGVycm1zZyA9IF8oIm1pc3Npbmcgb3BlcmFuZCIpOwotCQkgIGdvdG8gZXJyb3I7Ci0JCWNhc2UgT19yZWdpc3RlcjoKLQkJICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgKFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX09QRVJBTkRfU1JHKSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCBvcGVyYW5kIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaW5zbiA9IHY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKLQkJCQkJICAgICAgKGNoYXIgKikgTlVMTCwgMCwKLQkJCQkJICAgICAgY29weV9vZl9pbnN0cnVjdGlvbik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBPX2NvbnN0YW50OgotCQkgIGluc24gPSB2ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCi0JCQkJCSAgICAgIChjaGFyICopIE5VTEwsIDAsCi0JCQkJCSAgICAgIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24pOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotCQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JCSAgZml4dXBzWyBmYyBdLmV4cCAgICAgPSBleDsKLQkJICBmaXh1cHNbIGZjIF0ub3BpbmRleCA9ICogb3BpbmRleF9wdHI7Ci0JCSAgZml4dXBzWyBmYyBdLnJlbG9jICAgPSBCRkRfUkVMT0NfVU5VU0VEOwotCQkgICsrZmM7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcgfHwgKnN0ciA9PSAnWycgfHwgKnN0ciA9PSAnXScKLQkJIHx8ICpzdHIgPT0gJyknKQotCSAgICArK3N0cjsKLQl9Ci0gICAgICBtYXRjaCA9IDE7Ci0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotICAgICAgICB7Ci0JICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7Ci0JICBpZiAobmV4dF9vcGNvZGUtPm5hbWUgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotCi0JICAgICAgLyogU2tpcCB2ZXJzaW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQKLQkJIHByb2Nlc3Nvci4gICovCi0JICAgICAgaWYgKChvcGNvZGUtPnByb2Nlc3NvcnMgJiBwcm9jZXNzb3JfbWFzaykgPT0gMCkKLQkJZ290byBlcnJvcjsKLQkgICAgICAKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgCi0JICBhc19iYWQgKCIlczogJXMiLCBjb3B5X29mX2luc3RydWN0aW9uLCBlcnJtc2cpOwotCSAgCi0JICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJ10nKQotCSAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAgIAotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAqLwotICAKLSAgaWYgKHJlbGF4YWJsZSAmJiBmYyA+IDApCi0gICAgewotICAgICAgaW5zbl9zaXplID0gMjsKLSAgICAgIGZjID0gMDsKLQotICAgICAgaWYgKCFzdHJjbXAgKG9wY29kZS0+bmFtZSwgImJyIikpCi0JewotCSAgZiA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMiwgMiwKLQkJCWZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCQkoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgaW5zbl9zaXplKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiArIDIsIDAsIDIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA2LCA0LCAwLAotCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCQlmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKLQkJCShjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCBpbnNuX3NpemUpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgMiwgMCwgNCk7Ci0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBGb3VyIGJ5dGUgaW5zbnMgaGF2ZSBhbiBvcGNvZGUgd2l0aCB0aGUgdHdvIGhpZ2ggYml0cyBvbi4gICovCi0gICAgICBpZiAoKGluc24gJiAweDA2MDApID09IDB4MDYwMCkKLQlpbnNuX3NpemUgPSA0OwotICAgICAgZWxzZQotCWluc25fc2l6ZSA9IDI7Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZTogMzIgYml0IE1PViAqLwotICAgICAgaWYgKChpbnNuICYgMHhmZmUwKSA9PSAweDA2MjApCi0JaW5zbl9zaXplID0gMjsKLSAgICAgIAotICAgICAgZiA9IGZyYWdfbW9yZSAoaW5zbl9zaXplKTsKLSAgICAgIAotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCBpbnNuX3NpemUpOwotCi0gICAgICBpZiAoZXh0cmFfZGF0YV9hZnRlcl9pbnNuKQotCXsKLQkgIGYgPSBmcmFnX21vcmUgKGV4dHJhX2RhdGFfbGVuKTsKLQkgIAotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBleHRyYV9kYXRhLCBleHRyYV9kYXRhX2xlbik7Ci0KLQkgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCB1c2UgYQotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotICAgICBCRkRfUkVMT0NfVU5VU0VEIHBsdXMgdGhlIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5Ci0gICAgIGhhbmRsZSBmaXh1cHMgZm9yIGFueSBvcGVyYW5kIHR5cGUsIGFsdGhvdWdoIHRoYXQgaXMgYWRtaXR0ZWRseQotICAgICBub3QgYSB2ZXJ5IGV4Y2l0aW5nIGZlYXR1cmUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4KLSAgICAgbWRfYXBwbHlfZml4LiAgKi8gIAotICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZDsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgICByZWxvYzsKLSAgICAgIAotICAgICAgb3BlcmFuZCA9ICYgdjg1MF9vcGVyYW5kc1sgZml4dXBzW2ldLm9waW5kZXggXTsKLQotICAgICAgcmVsb2MgPSBmaXh1cHNbaV0ucmVsb2M7Ci0gICAgICAKLSAgICAgIGlmIChyZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCXsKLQkgIHJlbG9jX2hvd3RvX3R5cGUgKiByZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LAotCQkJCQkJCQkgIHJlbG9jKTsKLQkgIGludCAgICAgICAgICAgICAgICBzaXplOwotCSAgaW50ICAgICAgICAgICAgICAgIGFkZHJlc3M7Ci0JICBmaXhTICogICAgICAgICAgICAgZml4UDsKLQotCSAgaWYgKCFyZWxvY19ob3d0bykKLQkgICAgYWJvcnQoKTsKLQkgIAotCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCi0JICAvKiBYWFggVGhpcyB3aWxsIGFib3J0IG9uIGFuIFJfVjg1MF84IHJlbG9jIC0KLQkgICAgIGlzIHRoaXMgcmVsb2MgYWN0dWFsbHkgdXNlZCA/ICovCi0JICBpZiAoc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgCi0JICAgIGFib3J0ICgpOwotCi0JICBhZGRyZXNzID0gKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkgKyBpbnNuX3NpemUgLSBzaXplOwotCi0JICBpZiAocmVsb2MgPT0gQkZEX1JFTE9DXzMyKQotCSAgICB7Ci0JICAgICAgYWRkcmVzcyArPSAyOwotCSAgICB9Ci0JICAKLQkgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGFkZHJlc3MsIHNpemUsCi0JCQkgICAgICAmIGZpeHVwc1tpXS5leHAsIAotCQkJICAgICAgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJICAgICAgcmVsb2MpOwotCi0JICBzd2l0Y2ggKHJlbG9jKQotCSAgICB7Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkgICAgICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZml4X25ld19leHAgKAotCQkgICAgICAgZnJhZ19ub3csCi0JCSAgICAgICBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCSAgICAgICAmIGZpeHVwc1tpXS5leHAsCi0JCSAgICAgICAxIC8qIEZJWE1FOiBWODUwX09QRVJBTkRfUkVMQVRJVkUgPz8/ICovLAotCQkgICAgICAgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgKGZpeHVwc1tpXS5vcGluZGV4Ci0JCQkJCQkgICArIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0JCSAgICAgICApOwotCX0KLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZWRfaW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0KLS8qIElmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUuICAqLwotICAgICAgICAgICAgICAgICAKLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICogc2VnOwotICAgICBmaXhTICogICAgIGZpeHA7Ci17Ci0gIGFyZWxlbnQgKiByZWxvYzsKLSAgCi0gIHJlbG9jICAgICAgICAgICAgICA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0cj0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgICAgID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gICAgICAgPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLQotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIChpbnQpIGZpeHAtPmZ4X3JfdHlwZSk7Ci0KLSAgICAgIHhmcmVlIChyZWxvYyk7Ci0gICAgICAKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgCi0gIHJldHVybiByZWxvYzsKLX0KLQotLyogQXNzdW1lIGV2ZXJ5dGhpbmcgd2lsbCBmaXQgaW4gdHdvIGJ5dGVzLCB0aGVuIGV4cGFuZCBhcyBuZWNlc3NhcnkuICAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKiBmcmFncDsKLSAgICAgYXNlY3Rpb24gKiBzZWc7Ci17Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIGZyYWdwLT5mcl92YXIgPSA0OwotICBlbHNlIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIGZyYWdwLT5mcl92YXIgPSAyOwotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiAyOwotfSAKLQotbG9uZwotdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlY3Rpb24pCi0gICAgIGZpeFMgKiBmaXhwOwotICAgICBzZWdUICAgc2VjdGlvbjsKLXsKLSAgLyogSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIG9yIGluIGEgc2VjdGlvbiBvdGhlciB0aGFuIG91ciBvd24sCi0gICAgIHRoZW4gbGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWN0aW9uKSkpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQvbm90IGluIG91ciBzZWN0aW9uLgotCSBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICogICBmaXhwOwotICAgICB2YWx1ZVQgKiB2YWx1ZXA7Ci0gICAgIHNlZ1QgICAgIHNlZzsKLXsKLSAgdmFsdWVUIHZhbHVlOwotICBjaGFyICogd2hlcmU7Ci0KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKiB2YWx1ZXA7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKiB2YWx1ZXA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKLSAgICAgIGlmIChmaXhwLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoKGludCkgZml4cC0+Znhfcl90eXBlID49IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBpbnNuOwotCi0gICAgICBvcGluZGV4ID0gKGludCkgZml4cC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLSAgICAgIG9wZXJhbmQgPSAmIHY4NTBfb3BlcmFuZHNbIG9waW5kZXggXTsKLQotICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLSAgICAgICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uCi0KLQkgTm90ZSB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gc3RvcmVkIGluIGxpdHRsZSBlbmRpYW4KLQkgZm9ybWF0ISAgKi8KLSAgICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotCi0gICAgICBpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgaW5zbiA9IHY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIChvZmZzZXRUKSB2YWx1ZSwKLQkJCQkgIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIE5VTEwpOwotICAgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgLyogTm90aGluZyBlbHNlIHRvIGRvIGhlcmUuICovCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbi4gIAotCSBXZSBhcmUgb25seSBwcmVwYXJlZCB0byB0dXJuIGEgZmV3IG9mIHRoZSBvcGVyYW5kcyBpbnRvIHJlbG9jcy4gKi8KLQotICAgICAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMjIpCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUw7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5iaXRzID09IDkpCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBmcHJpbnRmIChzdGRlcnIsICJiaXRzOiAlZCwgaW5zbjogJXhcbiIsIG9wZXJhbmQtPmJpdHMsIGluc24pOyAqLwotCSAgCi0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAgICBfKCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIikpOwotCSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9kb25lKQotICAgIHsKLSAgICAgIC8qIFdlIHN0aWxsIGhhdmUgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBpbnRvIG1lbW9yeSEgICovCi0gICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMSkKLQkqIHdoZXJlID0gdmFsdWUgJiAweGZmOwotICAgICAgZWxzZSBpZiAoZml4cC0+Znhfc2l6ZSA9PSAyKQotCWJmZF9wdXRsMTYgKHZhbHVlICYgMHhmZmZmLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlIGlmIChmaXhwLT5meF9zaXplID09IDQpCi0JYmZkX3B1dGwzMiAodmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICB9Ci0gIAotICBmaXhwLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQwKLS8qIFBhcnNlIGEgY29ucyBleHByZXNzaW9uLiAgV2UgaGF2ZSB0byBoYW5kbGUgaGkoKSwgbG8oKSwgZXRjCi0gICBvbiB0aGUgdjg1MC4gICovCi12b2lkCi1wYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MCAoZXhwKQotICBleHByZXNzaW9uUyAqZXhwOwotewotICAvKiBTZWUgaWYgdGhlcmUncyBhIHJlbG9jIHByZWZpeCBsaWtlIGhpKCkgd2UgaGF2ZSB0byBoYW5kbGUuICAqLwotICBob2xkX2NvbnNfcmVsb2MgPSB2ODUwX3JlbG9jX3ByZWZpeCAoTlVMTCk7Ci0KLSAgLyogRG8gbm9ybWFsIGV4cHJlc3Npb24gcGFyc2luZy4gICovCi0gIGV4cHJlc3Npb24gKGV4cCk7Ci19Ci0KLS8qIENyZWF0ZSBhIGZpeHVwIGZvciBhIGNvbnMgZXhwcmVzc2lvbi4gIElmIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwCi0gICBmb3VuZCBhIHJlbG9jIHByZWZpeCwgdGhlbiB3ZSB1c2UgdGhhdCByZWxvYywgZWxzZSB3ZSBjaG9vc2UgYW4KLSAgIGFwcHJvcHJpYXRlIG9uZSBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgZXhwcmVzc2lvbi4gICovCi12b2lkCi1jb25zX2ZpeF9uZXdfdjg1MCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGlmIChob2xkX2NvbnNfcmVsb2MgPT0gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZSA9PSA0KQotCWhvbGRfY29uc19yZWxvYyA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGlmIChzaXplID09IDIpCi0JaG9sZF9jb25zX3JlbG9jID0gQkZEX1JFTE9DXzE2OwotICAgICAgaWYgKHNpemUgPT0gMSkKLQlob2xkX2NvbnNfcmVsb2MgPSBCRkRfUkVMT0NfODsKLSAgICB9Ci0KLSAgaWYgKGV4cCAhPSBOVUxMKQotICAgIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCAwLCBob2xkX2NvbnNfcmVsb2MpOwotICBlbHNlCi0gICAgZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIE5VTEwsIDAsIDAsIGhvbGRfY29uc19yZWxvYyk7Ci19Ci1ib29sZWFuCi12ODUwX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgIGZpeFMgKmZpeFA7Ci17Ci0gCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgLyogRG9uJ3QgYWRqdXN0IGZ1bmN0aW9uIG5hbWVzICovCi0gIGlmIChTX0lTX0ZVTkNUSU9OIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0gCi0gIHJldHVybiAxOwotfQotIAotaW50Ci12ODUwX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgICBzdHJ1Y3QgZml4ICpmaXhwOwotewotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0gCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12ODUwLmggYi9nYXMvY29uZmlnL3RjLXY4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkNGQxYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXY4NTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qIHRjLXY4NTAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtdjg1MC5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfVjg1MAotCi0jaW5jbHVkZSA8ZWxmL3Y4NTAuaD4KLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBWODUwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIAkJYmZkX2FyY2hfdjg1MAotCi0vKiBUaGUgdGFyZ2V0IEJGRCBmb3JtYXQuICAqLwotI2RlZmluZSBUQVJHRVRfRk9STUFUIAkJImVsZjMyLXY4NTAiCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIHY4NTBfZml4X2FkanVzdGFibGUoZml4UCkKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSB2ODUwX2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKLWV4dGVybiBpbnQgdjg1MF9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotICAgICAKLS8qIFdlIG5lZWQgdG8gaGFuZGxlIGxvKCksIGhpKCksIGV0YyBldGMgaW4gLmh3b3JkLCAud29yZCwgZXRjCi0gICBkaXJlY3RpdmVzLCBzbyB3ZSBoYXZlIHRvIHBhcnNlICJjb25zIiBleHByZXNzaW9ucyBvdXJzZWx2ZXMuICAqLwotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwIChFWFApCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfdjg1MAotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgc21hbGwgZGF0YSBhcmVhIChwb2ludGVkIHRvIGJ5IEdQKS4gICovCi0jZGVmaW5lIFNIRl9WODUwX0dQUkVMCQkweDEwMDAwMDAwCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgdGlueSBkYXRhIGFyZWEgKHBvaW50ZWQgdG8gYnkgRVApLiAgKi8KLSNkZWZpbmUgU0hGX1Y4NTBfRVBSRUwJCTB4MjAwMDAwMDAKLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSB6ZXJvIGRhdGEgYXJlYSAocG9pbnRlZCB0byBieSBSMCkuICAqLwotI2RlZmluZSBTSEZfVjg1MF9SMFJFTAkJMHg0MDAwMDAwMAotCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnNkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfR1BSRUwJfSwgXAotICB7ICIucm9zZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArICAgICAgICAgICAgIFNIRl9WODUwX0dQUkVMCX0sIFwKLSAgeyAiLnNic3MiLAlTSFRfTk9CSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfR1BSRUwJfSwgXAotICB7ICIuc2NvbW1vbiIsCVNIVF9WODUwX1NDT01NT04sIAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9HUFJFTAl9LCBcCi0gIHsgIi50ZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0VQUkVMCX0sIFwKLSAgeyAiLnRic3MiLAlTSFRfTk9CSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfRVBSRUwJfSwgXAotICB7ICIudGNvbW1vbiIsCVNIVF9WODUwX1RDT01NT04sCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLnpkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfUjBSRUwJfSwgXAotICB7ICIucm96ZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArICAgICAgICAgICAgIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLnpic3MiLAlTSFRfTk9CSVRTLAkgIAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi56Y29tbW9uIiwJU0hUX1Y4NTBfWkNPTU1PTiwgCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLmNhbGxfdGFibGVfZGF0YSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sCSAgIFwKLSAgeyAiLmNhbGxfdGFibGVfdGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX0VYRUNJTlNUUiB9LAotCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihmaXhQLHNlY3Rpb24pIHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWN0aW9uKQotZXh0ZXJuIGxvbmcgdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24gKCk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXZheC5jIGIvZ2FzL2NvbmZpZy90Yy12YXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyNWNjYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI0MyArMCwwIEBACi0vKiB0Yy12YXguYyAtIHZheC1zcGVjaWZpYyAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgInZheC1pbnN0LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgkJLyogRm9yIEZSQUdfQVBQRU5EXzFfQ0hBUiBtYWNybyBpbiAiZnJhZ3MuaCIgKi8KLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLwotLyogTm90ZSB0aGF0IGZvciB0aGUgVkFYIHRoZSBhcmUgdGhlIHNhbWUgYXMgY29tbWVudF9jaGFycyBhYm92ZS4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBhcyBpbiAwZjEyMy40NTYgKi8KLS8qIG9yICAgIDBIMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKSAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRGZGZ0doSCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLS8qIEhvbGQgZGV0YWlscyBvZiBhbiBvcGVyYW5kIGV4cHJlc3Npb24gKi8KLXN0YXRpYyBleHByZXNzaW9uUyBleHBfb2Zfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsKLXN0YXRpYyBzZWdUIHNlZ19vZl9vcGVyYW5kW1ZJVF9NQVhfT1BFUkFORFNdOwotCi0vKiBBIHZheCBpbnN0cnVjdGlvbiBhZnRlciBkZWNvZGluZy4gKi8KLXN0YXRpYyBzdHJ1Y3Qgdml0IHY7Ci0KLS8qIEhvbGQgZGV0YWlscyBvZiBiaWcgb3BlcmFuZHMuICovCi1MSVRUTEVOVU1fVFlQRSBiaWdfb3BlcmFuZF9iaXRzW1ZJVF9NQVhfT1BFUkFORFNdW1NJWkVfT0ZfTEFSR0VfTlVNQkVSXTsKLUZMT05VTV9UWVBFIGZsb2F0X29wZXJhbmRbVklUX01BWF9PUEVSQU5EU107Ci0vKiBBYm92ZSBpcyBtYWRlIHRvIHBvaW50IGludG8gYmlnX29wZXJhbmRfYml0cyBieSBtZF9iZWdpbigpLiAqLwotCi1pbnQgZmxhZ19oYXNoX2xvbmdfbmFtZXM7CS8qIC0rICovCi1pbnQgZmxhZ19vbmU7CQkJLyogLTEgKi8KLWludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1IICovCi1pbnQgZmxhZ19ub19oYXNoX21peGVkX2Nhc2U7CS8qIC1oIE5VTSAqLwotDAotLyoKLSAqIEZvciBWQVgsIHJlbGF0aXZlIGFkZHJlc3NlcyBvZiAianVzdCB0aGUgcmlnaHQgbGVuZ3RoIiBhcmUgZWFzeS4KLSAqIFRoZSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGFsd2F5cyB0aGUgbGFzdCBvcGVyYW5kLCBldmVuIGluCi0gKiBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLgotICogRm9yIFZBWCwgd2UgZW5jb2RlIHRoZSByZWxheF9zdWJzdGF0ZVRzIChpbiBlLmcuIGZyX3N1YnN0YXRlKSBhczoKLSAqCi0gKgkJICAgIDQgICAgICAgMyAgICAgICAyICAgICAgIDEgICAgICAgMAkgICAgIGJpdCBudW1iZXIKLSAqCS0tLS8gLy0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAqCQl8ICAgICB3aGF0IHN0YXRlID8JfCAgaG93IGxvbmcgPwl8Ci0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgotICogVGhlICJob3cgbG9uZyIgYml0cyBhcmUgMDA9Ynl0ZSwgMDE9d29yZCwgMTA9bG9uZy4KLSAqIFRoaXMgaXMgYSBVbip4IGNvbnZlbnRpb24uCi0gKiBOb3QgYWxsIGxlbmd0aHMgYXJlIGxlZ2l0IGZvciBhIGdpdmVuIHZhbHVlIG9mICh3aGF0IHN0YXRlKS4KLSAqIFRoZSAiaG93IGxvbmciIHJlZmVycyBtZXJlbHkgdG8gdGhlIGRpc3BsYWNlbWVudCBsZW5ndGguCi0gKiBUaGUgYWRkcmVzcyB1c3VhbGx5IGhhcyBzb21lIGNvbnN0YW50IGJ5dGVzIGluIGl0IGFzIHdlbGwuCi0gKgotCi0gZ3JvdXBzIGZvciBWQVggYWRkcmVzcyByZWxheGluZy4KLQotIDEuCSJmb28iIHBjLXJlbGF0aXZlLgotIGxlbmd0aCBvZiBieXRlLCB3b3JkLCBsb25nCi0KLSAyYS4JSjxjb25kPiB3aGVyZSA8Y29uZD4gaXMgYSBzaW1wbGUgZmxhZyB0ZXN0LgotIGxlbmd0aCBvZiBieXRlLCB3b3JkLCBsb25nLgotIFZBWCBvcGNvZGVzIGFyZToJKEhleCkKLSBibmVxL2JuZXF1CTEyCi0gYmVxbC9iZXFsdQkxMwotIGJndHIJCTE0Ci0gYmxlcQkJMTUKLSBiZ2VxCQkxOAotIGJsc3MJCTE5Ci0gYmd0cnUJCTFhCi0gYmxlcXUJCTFiCi0gYnZjCQkxYwotIGJ2cwkJMWQKLSBiZ2VxdS9iY2MJMWUKLSBibHNzdS9iY3MJMWYKLSBBbHdheXMsIHlvdSBjb21wbGVtZW50IDB0aCBiaXQgdG8gcmV2ZXJzZSBjb25kaXRpb24uCi0gQWx3YXlzLCAxLWJ5dGUgb3Bjb2RlLCB0aGVuIDEtYnl0ZSBkaXNwbGFjZW1lbnQuCi0KLSAyYi4JSjxjb25kPiB3aGVyZSBjb25kIHRlc3RzIGEgbWVtb3J5IGJpdC4KLSBsZW5ndGggb2YgYnl0ZSwgd29yZCwgbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYmJzCQllMAotIGJiYwkJZTEKLSBiYnNzCQllMgotIGJiY3MJCWUzCi0gYmJzYwkJZTQKLSBiYmNjCQllNQotIGJic3NpCQllNgotIGJiY2NpCQllNwotIEFsd2F5cywgeW91IGNvbXBsZW1lbnQgMHRoIGJpdCB0byByZXZlcnNlIGNvbmRpdGlvbi4KLSBBbHdheXMsIDEtYnl0ZSBvcGNkZSwgbG9uZ3dvcmQtYWRkcmVzcywgYnl0ZS1hZGRyZXNzLCAxLWJ5dGUtZGlzcGxhY2VtZW50Ci0KLSAyYy4JSjxjb25kPiB3aGVyZSBjb25kIHRlc3RzIGxvdy1vcmRlciBtZW1vcnkgYml0Ci0gbGVuZ3RoIG9mIGJ5dGUsd29yZCxsb25nLgotIFZheCBvcGNvZGVzIGFyZToJKEhleCkKLSBibGJzCQllOAotIGJsYmMJCWU5Ci0gQWx3YXlzLCB5b3UgY29tcGxlbWVudCAwdGggYml0IHRvIHJldmVyc2UgY29uZGl0aW9uLgotIEFsd2F5cywgMS1ieXRlIG9wY29kZSwgbG9uZ3dvcmQtYWRkcmVzcywgMS1ieXRlIGRpc3BsYWNlbWVudC4KLQotIDMuCUpicy9KYnIuCi0gbGVuZ3RoIG9mIGJ5dGUsd29yZCxsb25nLgotIFZheCBvcGNvZGVzIGFyZToJKEhleCkKLSBic2JiCQkxMAotIGJyYgkJMTEKLSBUaGVzZSBhcmUgbGlrZSAoMikgYnV0IHRoZXJlIGlzIG5vIGNvbmRpdGlvbiB0byByZXZlcnNlLgotIEFsd2F5cywgMSBieXRlIG9wY29kZSwgdGhlbiBkaXNwbGFjZW1lbnQvYWJzb2x1dGUuCi0KLSA0YS4JSmFjYlgKLSBsZW5ndGggb2Ygd29yZCwgbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYWNidwkJM2QKLSBhY2JmCQk0ZgotIGFjYmQJCTZmCi0gYWJjYgkJOWQKLSBhY2JsCQlmMQotIGFjYmcJICAgICAgNGZmZAotIGFjYmgJICAgICAgNmZmZAotIEFsd2F5cywgd2UgY2Fubm90IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2g7IHdlIGhhdmUgYSB3b3JkCi0gZGlzcGxhY2VtZW50LgotIFRoZSBkb3VibGUtYnl0ZSBvcC1jb2RlcyBkb24ndCBodXJ0OiB3ZSBuZXZlciB3YW50IHRvIG1vZGlmeSB0aGUKLSBvcGNvZGUsIHNvIHdlIGRvbid0IGNhcmUgaG93IG1hbnkgYnl0ZXMgYXJlIGJldHdlZW4gdGhlIG9wY29kZSBhbmQKLSB0aGUgb3BlcmFuZC4KLQotIDRiLglKWG9iWFhYCi0gbGVuZ3RoIG9mIGxvbmcsIGxvbmcsIGJ5dGUuCi0gVmF4IG9wY29kZXMgYXJlOgkoSGV4KQotIGFvYmxzcwkJZjIKLSBhb2JsZXEJCWYzCi0gc29iZ2VxCQlmNAotIHNvYmd0cgkJZjUKLSBBbHdheXMsIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoOyB3ZSBoYXZlIGEgYnl0ZQotIGRpc3BsYWNlbWVudC4KLQotIFRoZSBvbmx5IHRpbWUgd2UgbmVlZCB0byBtb2RpZnkgdGhlIG9wY29kZSBpcyBmb3IgY2xhc3MgMiBpbnN0cnVjdGlvbnMuCi0gQWZ0ZXIgcmVsYXgoKSB3ZSBtYXkgY29tcGxlbWVudCB0aGUgbG93ZXN0IG9yZGVyIGJpdCBvZiBzdWNoIGluc3RydWN0aW9uCi0gdG8gcmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guCi0KLSBGb3IgY2xhc3MgMiBpbnN0cnVjdGlvbnMsIHdlIHN0b3JlIGNvbnRleHQgb2YgIndoZXJlIGlzIHRoZSBvcGNvZGUgbGl0ZXJhbCIuCi0gV2UgY2FuIGNoYW5nZSBhbiBvcGNvZGUncyBsb3dlc3Qgb3JkZXIgYml0IHdpdGhvdXQgYnJlYWtpbmcgYW55dGhpbmcgZWxzZS4KLQotIFdlIHNvbWV0aW1lcyBzdG9yZSBjb250ZXh0IGluIHRoZSBvcGVyYW5kIGxpdGVyYWwuIFRoaXMgd2F5IHdlIGNhbiBmaWd1cmUgb3V0Ci0gYWZ0ZXIgcmVsYXgoKSB3aGF0IHRoZSBvcmlnaW5hbCBhZGRyZXNzaW5nIG1vZGUgd2FzLgotICovCi0MCi0vKiBUaGVzZSBkaXNwbGFjZW1lbnRzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKLSAgIGRpc3BsYWNlbWVudC4gIFRoZSBmaXJzdCBsZXR0ZXIgaXMgQnl0ZSwgV29yZC4gIDJuZCBsZXR0ZXIgaXMKLSAgIEZvcndhcmQsIEJhY2t3YXJkLiAqLwotI2RlZmluZSBCRiAoMSsgMTI3KQotI2RlZmluZSBCQiAoMSstMTI4KQotI2RlZmluZSBXRiAoMisgMzI3NjcpCi0jZGVmaW5lIFdCICgyKy0zMjc2OCkKLS8qIERvbnQgbmVlZCBMRiwgTEIgYmVjYXVzZSB0aGV5IGFsd2F5cyByZWFjaC4gW1RoZXkgYXJlIGNvZGVkIGFzIDAuXSAqLwotCi0KLSNkZWZpbmUgQyhhLGIpIEVOQ09ERV9SRUxBWChhLGIpCi0vKiBUaGlzIG1hY3JvIGhhcyBubyBzaWRlLWVmZmVjdHMuICovCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHsxLCAxLCAwLCAwfSwJCQkvKiBlcnJvciBzZW50aW5lbCAgIDAsMAkqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAwLDEJKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMCwyCSovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDAsMwkqLwotICB7QkYgKyAxLCBCQiArIDEsIDIsIEMgKDEsIDEpfSwvKiBCXiJmb28iCSAgICAxLDAgKi8KLSAge1dGICsgMSwgV0IgKyAxLCAzLCBDICgxLCAyKX0sLyogV14iZm9vIgkgICAgMSwxICovCi0gIHswLCAwLCA1LCAwfSwJCQkvKiBMXiJmb28iCSAgICAxLDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMSwzICovCi0gIHtCRiwgQkIsIDEsIEMgKDIsIDEpfSwJLyogYjxjb25kPiBCXiJmb28iICAyLDAgKi8KLSAge1dGICsgMiwgV0IgKyAyLCA0LCBDICgyLCAyKX0sLyogYnIuKz8gYnJ3IFgJICAgIDIsMSAqLwotICB7MCwgMCwgNywgMH0sCQkJLyogYnIuKz8gam1wIFgJICAgIDIsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAyLDMgKi8KLSAge0JGLCBCQiwgMSwgQyAoMywgMSl9LAkvKiBicmIgQl5mb28JICAgIDMsMCAqLwotICB7V0YsIFdCLCAyLCBDICgzLCAyKX0sCS8qIGJydyBXXmZvbwkgICAgMywxICovCi0gIHswLCAwLCA1LCAwfSwJCQkvKiBKbXAgTF5mb28JICAgIDMsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAzLDMgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgNCwwICovCi0gIHtXRiwgV0IsIDIsIEMgKDQsIDIpfSwJLyogYWNiXyBeV2ZvbwkgICAgNCwxICovCi0gIHswLCAwLCAxMCwgMH0sCQkvKiBhY2JfLGJyLGptcCBMXmZvbzQsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICA0LDMgKi8KLSAge0JGLCBCQiwgMSwgQyAoNSwgMSl9LAkvKiBYb2JfX18sLGZvbyAgICAgIDUsMCAqLwotICB7V0YgKyA0LCBXQiArIDQsIDYsIEMgKDUsIDIpfSwvKiBYb2IuKzIsYnJiLiszLGJydzUsMSAqLwotICB7MCwgMCwgOSwgMH0sCQkJLyogWG9iLisyLGJyYi4rNixqbXA1LDIgKi8KLX07Ci0KLSN1bmRlZiBDCi0jdW5kZWYgQkYKLSN1bmRlZiBCQgotI3VuZGVmIFdGCi0jdW5kZWYgV0IKLQotdm9pZCBmbG9hdF9jb25zICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJnZmxvYXQiLCBmbG9hdF9jb25zLCAnZyd9LAotICB7ImhmbG9hdCIsIGZsb2F0X2NvbnMsICdoJ30sCi0gIHswfSwKLX07Ci0KLSNkZWZpbmUgU1RBVEVfUENfUkVMQVRJVkUJCSgxKQotI2RlZmluZSBTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gJKDIpCi0jZGVmaW5lIFNUQVRFX0FMV0FZU19CUkFOQ0gJCSgzKQkvKiBpbmNsdWRlcyBCU0IuLi4gKi8KLSNkZWZpbmUgU1RBVEVfQ09NUExFWF9CUkFOQ0gJICAgICAgICAoNCkKLSNkZWZpbmUgU1RBVEVfQ09NUExFWF9IT1AJCSg1KQotCi0jZGVmaW5lIFNUQVRFX0JZVEUJCQkoMCkKLSNkZWZpbmUgU1RBVEVfV09SRAkJCSgxKQotI2RlZmluZSBTVEFURV9MT05HCQkJKDIpCi0jZGVmaW5lIFNUQVRFX1VOREYJCQkoMykJLyogU3ltYm9sIHVuZGVmaW5lZCBpbiBwYXNzMSAqLwotCi0KLSNkZWZpbmUgbWluKGEsIGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0KLWludCBmbG9udW1fZ2VuMnZheCBQQVJBTVMgKChjaGFyIGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKLQkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqdmlwX2JlZ2luIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB2aXBfb3BfZGVmYXVsdHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgdmlwX29wIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IHZvcCAqKSk7Ci1zdGF0aWMgdm9pZCB2aXAgUEFSQU1TICgoc3RydWN0IHZpdCAqLCBjaGFyICopKTsKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqZXJydHh0OwotICBGTE9OVU1fVFlQRSAqZlA7Ci0gIGludCBpOwotCi0gIGlmICgoZXJydHh0ID0gdmlwX2JlZ2luICgxLCAiJCIsICIqIiwgImAiKSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiVklQX0JFR0lOIGVycm9yOiVzIiksIGVycnR4dCk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGZQID0gZmxvYXRfb3BlcmFuZDsKLSAgICAgICBmUCA8IGZsb2F0X29wZXJhbmQgKyBWSVRfTUFYX09QRVJBTkRTOwotICAgICAgIGkrKywgZlArKykKLSAgICB7Ci0gICAgICBmUC0+bG93ID0gJmJpZ19vcGVyYW5kX2JpdHNbaV1bMF07Ci0gICAgICBmUC0+aGlnaCA9ICZiaWdfb3BlcmFuZF9iaXRzW2ldW1NJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMV07Ci0gICAgfQotfQotDAotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotLyogRml4IHVwIHNvbWUgZGF0YSBvciBpbnN0cnVjdGlvbnMgYWZ0ZXIgd2UgZmluZCBvdXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sCi0gICB0aGF0IHRoZXkgcmVmZXJlbmNlLiAgKi8KLQotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfYXBwbHlfZml4IChmaXhQLCB2YWx1ZSkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsLAotCQkJCSh2YWx1ZVQpIHZhbHVlLCBmaXhQLT5meF9zaXplKTsKLX0KLQotbG9uZwotbWRfY2hhcnNfdG9fbnVtYmVyIChjb24sIG5ieXRlcykKLSAgICAgdW5zaWduZWQgY2hhciBjb25bXTsJLyogTG93IG9yZGVyIGJ5dGUgMXN0LiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dC4gKi8KLXsKLSAgbG9uZyByZXR2YWw7Ci0gIGZvciAocmV0dmFsID0gMCwgY29uICs9IG5ieXRlcyAtIDE7IG5ieXRlcy0tOyBjb24tLSkKLSAgICB7Ci0gICAgICByZXR2YWwgPDw9IEJJVFNfUEVSX0NIQVI7Ci0gICAgICByZXR2YWwgfD0gKmNvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi0vKiB2YXg6bWRfYXNzZW1ibGUoKSBlbWl0IGZyYWdzIGZvciAxIGluc3RydWN0aW9uICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChpbnN0cnVjdGlvbl9zdHJpbmcpCi0gICAgIGNoYXIgKmluc3RydWN0aW9uX3N0cmluZzsJLyogQSBzdHJpbmc6IGFzc2VtYmxlIDEgaW5zdHJ1Y3Rpb24uICovCi17Ci0gIC8qIE5vbi16ZXJvIGlmIG9wZXJhbmQgZXhwcmVzc2lvbidzIHNlZ21lbnQgaXMgbm90IGtub3duIHlldC4gKi8KLSAgaW50IGlzX3VuZGVmaW5lZDsKLQotICBpbnQgbGVuZ3RoX2NvZGU7Ci0gIGNoYXIgKnA7Ci0gIC8qIEFuIG9wZXJhbmQuIFNjYW5zIGFsbCBvcGVyYW5kcy4gKi8KLSAgc3RydWN0IHZvcCAqb3BlcmFuZFA7Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCQkJLyogV2hhdCB1c2VkIHRvIGxpdmUgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4gKi8KLSAgY2hhciBjX3NhdmU7Ci0gIC8qIDE6IGluc3RydWN0aW9uX3N0cmluZyBiYWQgZm9yIGFsbCBwYXNzZXMuICovCi0gIGludCBnb29mZWQ7Ci0gIC8qIFBvaW50cyB0byBzbG90IGp1c3QgYWZ0ZXIgbGFzdCBvcGVyYW5kLiAgKi8KLSAgc3RydWN0IHZvcCAqZW5kX29wZXJhbmRQOwotICAvKiBQb2ludHMgdG8gZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIHRoaXMgb3BlcmFuZC4gICovCi0gIGV4cHJlc3Npb25TICpleHBQOwotICBzZWdUICpzZWdQOwotCi0gIC8qIFRoZXNlIHJlZmVyIHRvIGFuIGluc3RydWN0aW9uIG9wZXJhbmQgZXhwcmVzc2lvbi4gKi8KLSAgLyogVGFyZ2V0IHNlZ21lbnQgb2YgdGhlIGFkZHJlc3MuCSAqLwotICBzZWdUIHRvX3NlZzsKLSAgdmFsdWVUIHRoaXNfYWRkX251bWJlcjsKLSAgLyogUG9zaXRpdmUgKG1pbnVlbmQpIHN5bWJvbC4gKi8KLSAgc3ltYm9sUyAqdGhpc19hZGRfc3ltYm9sOwotICAvKiBBcyBhIG51bWJlci4gKi8KLSAgbG9uZyBvcGNvZGVfYXNfbnVtYmVyOwotICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIDFzdC4gKi8KLSAgY2hhciAqb3Bjb2RlX2FzX2NoYXJzOwotICAvKiBBcyBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAqLwotICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIDFzdCAqLwotICBjaGFyICpvcGNvZGVfbG93X2J5dGVQOwotICAvKiBsZW5ndGggKGJ5dGVzKSBtZWFudCBieSB2b3Bfc2hvcnQuICovCi0gIGludCBsZW5ndGg7Ci0gIC8qIDAsIG9yIDEgaWYgJ0AnIGlzIGluIGFkZHJlc3NpbmcgbW9kZS4gKi8KLSAgaW50IGF0OwotICAvKiBGcm9tIHZvcF9uYnl0ZXM6IHZheF9vcGVyYW5kX3dpZHRoIChpbiBieXRlcykgKi8KLSAgaW50IG5ieXRlczsKLSAgRkxPTlVNX1RZUEUgKmZsb2F0UDsKLSAgTElUVExFTlVNX1RZUEUgbGl0ZXJhbF9mbG9hdFs4XTsKLSAgLyogQmlnIGVub3VnaCBmb3IgYW55IGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuICovCi0KLSAgdmlwICgmdiwgaW5zdHJ1Y3Rpb25fc3RyaW5nKTsKLQotICAvKgotICAgKiBOb3cgd2UgdHJ5IHRvIGZpbmQgYXMgbWFueSBhc193YXJuKClzIGFzIHdlIGNhbi4gSWYgd2UgZG8gYW55IGFzX3dhcm4oKXMKLSAgICogdGhlbiBnb29mZWQ9MS4gTm90aWNlIHRoYXQgd2UgZG9uJ3QgbWFrZSBhbnkgZnJhZ3MgeWV0LgotICAgKiBTaG91bGQgZ29vZmVkIGJlIDEsIHRoZW4gdGhpcyBpbnN0cnVjdGlvbiB3aWxsIHdlZGdlIGluIGFueSBwYXNzLAotICAgKiBhbmQgd2UgY2FuIHNhZmVseSBmbHVzaCBpdCwgd2l0aG91dCBjYXVzaW5nIGludGVycGFzcyBzeW1ib2wgcGhhc2UKLSAgICogZXJyb3JzLiBUaGF0IGlzLCB3aXRob3V0IGNoYW5naW5nIGxhYmVsIHZhbHVlcyBpbiBkaWZmZXJlbnQgcGFzc2VzLgotICAgKi8KLSAgaWYgKChnb29mZWQgPSAoKnYudml0X2Vycm9yKSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgZHVlIHRvIFwiJXNcIiIpLCB2LnZpdF9lcnJvcik7Ci0gICAgfQotICAvKgotICAgKiBXZSBuZWVkIHRvIHVzZSBleHByZXNzaW9uKCkgYW5kIGZyaWVuZHMsIHdoaWNoIHJlcXVpcmUgdXMgdG8gZGlkZGxlCi0gICAqIGlucHV0X2xpbmVfcG9pbnRlci4gU28gd2Ugc2F2ZSBpdCBhbmQgcmVzdG9yZSBpdCBsYXRlci4KLSAgICovCi0gIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBmb3IgKG9wZXJhbmRQID0gdi52aXRfb3BlcmFuZCwKLSAgICAgICBleHBQID0gZXhwX29mX29wZXJhbmQsCi0gICAgICAgc2VnUCA9IHNlZ19vZl9vcGVyYW5kLAotICAgICAgIGZsb2F0UCA9IGZsb2F0X29wZXJhbmQsCi0gICAgICAgZW5kX29wZXJhbmRQID0gdi52aXRfb3BlcmFuZCArIHYudml0X29wZXJhbmRzOwotCi0gICAgICAgb3BlcmFuZFAgPCBlbmRfb3BlcmFuZFA7Ci0KLSAgICAgICBvcGVyYW5kUCsrLCBleHBQKyssIHNlZ1ArKywgZmxvYXRQKyspCi0gICAgewkJCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCi0gICAgICBpZiAob3BlcmFuZFAtPnZvcF9lcnJvcikKLQl7Ci0JICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgYmVjYXVzZSBcIiVzXCIiKSwgb3BlcmFuZFAtPnZvcF9lcnJvcik7Ci0JICBnb29mZWQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzdGF0ZW1lbnQgaGFzIG5vIHN5bnRheCBnb29mczogbGV0cyBzbmlmZiB0aGUgZXhwcmVzc2lvbiAqLwotCSAgaW50IGNhbl9iZV9zaG9ydCA9IDA7CS8qIDEgaWYgYSBiaWdudW0gY2FuIGJlIHJlZHVjZWQgdG8gYSBzaG9ydCBsaXRlcmFsLiAqLwotCi0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcGVyYW5kUC0+dm9wX2V4cHJfYmVnaW47Ci0JICBjX3NhdmUgPSBvcGVyYW5kUC0+dm9wX2V4cHJfZW5kWzFdOwotCSAgb3BlcmFuZFAtPnZvcF9leHByX2VuZFsxXSA9ICdcMCc7Ci0JICAvKiBJZiB0b19zZWcgPT0gU0VHX1BBU1MxLCBleHByZXNzaW9uKCkgd2lsbCBoYXZlIHNldCBuZWVkX3Bhc3NfMiA9IDEuICovCi0JICAqc2VnUCA9IGV4cHJlc3Npb24gKGV4cFApOwotCSAgc3dpdGNoIChleHBQLT5YX29wKQotCSAgICB7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgLyogZm9yIEJTRDQuMiBjb21wYXRpYmlsaXR5LCBtaXNzaW5nIGV4cHJlc3Npb24gaXMgYWJzb2x1dGUgMCAqLwotCSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgLyogRm9yIFNFR19BQlNPTFVURSwgd2Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IFhfb3Bfc3ltYm9sLAotCQkgWF9hZGRfc3ltYm9sIHRvIGFueSBwYXJ0aWN1bGFyIHZhbHVlLiAgQnV0LCB3ZSB3aWxsIHByb2dyYW0KLQkJIGRlZmVuc2l2ZWx5LiBTaW5jZSB0aGlzIHNpdHVhdGlvbiBvY2N1cnMgcmFyZWx5IHNvIGl0IGNvc3RzCi0JCSB1cyBsaXR0bGUgdG8gZG8sIGFuZCBzdG9wcyBEZWFuIHdvcnJ5aW5nIGFib3V0IHRoZSBvcmlnaW4gb2YKLQkJIHJhbmRvbSBiaXRzIGluIGV4cHJlc3Npb25TJ3MuICAqLwotCSAgICAgIGV4cFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICAgICAgZXhwUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT19zeW1ib2w6Ci0JICAgIGNhc2UgT19jb25zdGFudDoKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qCi0JICAgICAgICogTWFqb3IgYnVnLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGNhc2Ugb2YgYQotCSAgICAgICAqIFNFR19PUCBleHByZXNzaW9uIGluIGEgVklUX09QQ09ERV9TWU5USEVUSUMKLQkgICAgICAgKiB2YXJpYWJsZS1sZW5ndGggaW5zdHJ1Y3Rpb24uCi0JICAgICAgICogV2UgZG9uJ3QgaGF2ZSBhIGZyYWcgdHlwZSB0aGF0IGlzIHNtYXJ0IGVub3VnaCB0bwotCSAgICAgICAqIHJlbGF4IGEgU0VHX09QLCBhbmQgc28gd2UganVzdCBmb3JjZSBhbGwKLQkgICAgICAgKiBTRUdfT1BzIHRvIGJlaGF2ZSBsaWtlIFNFR19QQVNTMXMuCi0JICAgICAgICogQ2xlYXJseSwgaWYgdGhlcmUgaXMgYSBkZW1hbmQgd2UgY2FuIGludmVudCBhIG5ldyBvcgotCSAgICAgICAqIG1vZGlmaWVkIGZyYWcgdHlwZSBhbmQgdGhlbiBjb2RpbmcgdXAgYSBmcmFnIGZvciB0aGlzCi0JICAgICAgICogY2FzZSB3aWxsIGJlIGVhc3kuIFNFR19PUCB3YXMgaW52ZW50ZWQgZm9yIHRoZQotCSAgICAgICAqIC53b3JkcyBhZnRlciBhIENBU0Ugb3Bjb2RlLCBhbmQgd2FzIG5ldmVyIGludGVuZGVkIGZvcgotCSAgICAgICAqIGluc3RydWN0aW9uIG9wZXJhbmRzLgotCSAgICAgICAqLwotCSAgICAgIG5lZWRfcGFzc18yID0gMTsKLQkgICAgICBhc193YXJuIChfKCJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIikpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT19iaWc6Ci0JICAgICAgLyogUHJlc2VydmUgdGhlIGJpdHMuICovCi0JICAgICAgaWYgKGV4cFAtPlhfYWRkX251bWJlciA+IDApCi0JCXsKLQkJICBiaWdudW1fY29weSAoZ2VuZXJpY19iaWdudW0sIGV4cFAtPlhfYWRkX251bWJlciwKLQkJCSAgICAgICBmbG9hdFAtPmxvdywgU0laRV9PRl9MQVJHRV9OVU1CRVIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAga25vdyAoZXhwUC0+WF9hZGRfbnVtYmVyIDwgMCk7Ci0JCSAgZmxvbnVtX2NvcHkgKCZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciwKLQkJCSAgICAgICBmbG9hdFApOwotCQkgIGlmIChzdHJjaHIgKCJzIGkiLCBvcGVyYW5kUC0+dm9wX3Nob3J0KSkKLQkJICAgIHsKLQkJICAgICAgLyogQ291bGQgcG9zc2libHkgYmVjb21lIFNeIyAqLwotCQkgICAgICBmbG9udW1fZ2VuMnZheCAoLWV4cFAtPlhfYWRkX251bWJlciwgZmxvYXRQLCBsaXRlcmFsX2Zsb2F0KTsKLQkJICAgICAgc3dpdGNoICgtZXhwUC0+WF9hZGRfbnVtYmVyKQotCQkJewotCQkJY2FzZSAnZic6Ci0JCQkgIGNhbl9iZV9zaG9ydCA9Ci0JCQkgICAgKGxpdGVyYWxfZmxvYXRbMF0gJiAweEZDMEYpID09IDB4NDAwMAotCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbMV0gPT0gMDsKLQkJCSAgYnJlYWs7Ci0KLQkJCWNhc2UgJ2QnOgotCQkJICBjYW5fYmVfc2hvcnQgPQotCQkJICAgIChsaXRlcmFsX2Zsb2F0WzBdICYgMHhGQzBGKSA9PSAweDQwMDAKLQkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzFdID09IDAKLQkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzJdID09IDAKLQkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzNdID09IDA7Ci0JCQkgIGJyZWFrOwotCi0JCQljYXNlICdnJzoKLQkJCSAgY2FuX2JlX3Nob3J0ID0KLQkJCSAgICAobGl0ZXJhbF9mbG9hdFswXSAmIDB4RkY4MSkgPT0gMHg0MDAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsxXSA9PSAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsyXSA9PSAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFszXSA9PSAwOwotCQkJICBicmVhazsKLQotCQkJY2FzZSAnaCc6Ci0JCQkgIGNhbl9iZV9zaG9ydCA9ICgobGl0ZXJhbF9mbG9hdFswXSAmIDB4RkZGOCkgPT0gMHg0MDAwCi0JCQkJCSAgJiYgKGxpdGVyYWxfZmxvYXRbMV0gJiAweEUwMDApID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzJdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzNdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzRdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzVdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzZdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzddID09IDApOwotCQkJICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCSAgQkFEX0NBU0UgKC1leHBQLT5YX2FkZF9udW1iZXIpOwotCQkJICBicmVhazsKLQkJCX0JLyogc3dpdGNoIChmbG9hdCB0eXBlKSAqLwotCQkgICAgfQkJLyogaWYgKGNvdWxkIHdhbnQgdG8gYmVjb21lIFNeIy4uLikgKi8KLQkJfQkJLyogYmlnbnVtIG9yIGZsb251bSA/ICovCi0KLQkgICAgICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAncycKLQkJICB8fCBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICdpJwotCQkgIHx8IChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJwotCQkgICAgICAmJiBvcGVyYW5kUC0+dm9wX3JlZyA9PSAweEYKLQkJICAgICAgJiYgKG9wZXJhbmRQLT52b3BfbW9kZSAmIDB4RSkgPT0gMHg4KSkKLQkJewotCQkgIC8qIFNhdyBhICcjJy4gKi8KLQkJICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIG11c3QgY2hvc2UgU14gb3IgSV4uICovCi0JCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPiAwKQotCQkJewotCQkJICAvKiBCaWdudW06IFNob3J0IGxpdGVyYWwgaW1wb3NzaWJsZS4gKi8KLQkJCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJCSAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKLQkJCSAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQy4gKi8KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBGbG9udW06IFRyeSB0byBkbyBpdC4gKi8KLQkJCSAgaWYgKGNhbl9iZV9zaG9ydCkKLQkJCSAgICB7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ3MnOwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9tb2RlID0gMDsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3BfbmR4ID0gLTE7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IC0xOwotCQkJICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDg7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsJLyogVkFYIFBDICovCi0JCQkgICAgfQotCQkJfQkvKiBiaWdudW0gb3IgZmxvbnVtID8gKi8KLQkJICAgIH0JCS8qICBpZiAjLCBidXQgbm8gU14gb3IgSV4gc2Vlbi4gKi8KLQkJICAvKiBObyBtb3JlICcgJyBjYXNlOiBlaXRoZXIgJ3MnIG9yICdpJy4gKi8KLQkJICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAncycpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdhbnRzIHRvIGJlIGEgc2hvcnQgbGl0ZXJhbC4gKi8KLQkJICAgICAgaWYgKGV4cFAtPlhfYWRkX251bWJlciA+IDApCi0JCQl7Ci0JCQkgIGFzX3dhcm4gKF8oIkJpZ251bSBub3QgcGVybWl0dGVkIGluIHNob3J0IGxpdGVyYWwuIEltbWVkaWF0ZSBtb2RlIGFzc3VtZWQuIikpOwotCQkJICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOwotCQkJICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkJICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsJLyogVkFYIFBDLiAqLwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGlmICghY2FuX2JlX3Nob3J0KQotCQkJICAgIHsKLQkJCSAgICAgIGFzX3dhcm4gKF8oIkNhbid0IGRvIGZsb251bSBzaG9ydCBsaXRlcmFsOiBpbW1lZGlhdGUgbW9kZSB1c2VkLiIpKTsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAnaSc7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQy4gKi8KLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7CS8qIEVuY29kZSBzaG9ydCBsaXRlcmFsIG5vdy4gKi8KLQkJCSAgICAgIGludCB0ZW1wID0gMDsKLQotCQkJICAgICAgc3dpdGNoICgtZXhwUC0+WF9hZGRfbnVtYmVyKQotCQkJCXsKLQkJCQljYXNlICdmJzoKLQkJCQljYXNlICdkJzoKLQkJCQkgIHRlbXAgPSBsaXRlcmFsX2Zsb2F0WzBdID4+IDQ7Ci0JCQkJICBicmVhazsKLQotCQkJCWNhc2UgJ2cnOgotCQkJCSAgdGVtcCA9IGxpdGVyYWxfZmxvYXRbMF0gPj4gMTsKLQkJCQkgIGJyZWFrOwotCi0JCQkJY2FzZSAnaCc6Ci0JCQkJICB0ZW1wID0gKChsaXRlcmFsX2Zsb2F0WzBdIDw8IDMpICYgMDcwKQotCQkJCSAgICB8ICgobGl0ZXJhbF9mbG9hdFsxXSA+PiAxMykgJiAwNyk7Ci0JCQkJICBicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJICBCQURfQ0FTRSAoLWV4cFAtPlhfYWRkX251bWJlcik7Ci0JCQkJICBicmVhazsKLQkJCQl9Ci0KLQkJCSAgICAgIGZsb2F0UC0+bG93WzBdID0gdGVtcCAmIDA3NzsKLQkJCSAgICAgIGZsb2F0UC0+bG93WzFdID0gMDsKLQkJCSAgICB9CS8qIGlmIGNhbiBiZSBzaG9ydCBsaXRlcmFsIGZsb2F0ICovCi0JCQl9CS8qIGZsb251bSBvciBiaWdudW0gPyAqLwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsJCS8qIEleIyBzZWVuOiBzZXQgaXQgdXAgaWYgZmxvYXQuICovCi0JCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPCAwKQotCQkJewotCQkJICBtZW1jcHkgKGZsb2F0UC0+bG93LCBsaXRlcmFsX2Zsb2F0LCBzaXplb2YgKGxpdGVyYWxfZmxvYXQpKTsKLQkJCX0KLQkJICAgIH0JCS8qIGlmIFNeIyBzZWVuLiAqLwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfd2FybiAoXygiQSBiaWdudW0vZmxvbnVtIG1heSBub3QgYmUgYSBkaXNwbGFjZW1lbnQ6IDB4JWx4IHVzZWQiKSwKLQkJCSAgIChleHBQLT5YX2FkZF9udW1iZXIgPSAweDgwMDAwMDAwTCkpOwotCQkgIC8qIENob3NlbiBzbyBsdXNlciBnZXRzIHRoZSBtb3N0IG9mZnNldCBiaXRzIHRvIHBhdGNoIGxhdGVyLiAqLwotCQl9Ci0JICAgICAgZXhwUC0+WF9hZGRfbnVtYmVyID0gZmxvYXRQLT5sb3dbMF0KLQkJfCAoKExJVFRMRU5VTV9NQVNLICYgKGZsb2F0UC0+bG93WzFdKSkgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQkgICAgICAvKgotCSAgICAgICAqIEZvciB0aGUgT19iaWcgY2FzZSB3ZSBoYXZlOgotCSAgICAgICAqIElmIHZvcF9zaG9ydCA9PSAncycgdGhlbiBhIHNob3J0IGZsb2F0aW5nIGxpdGVyYWwgaXMgaW4gdGhlCi0JICAgICAgICoJbG93ZXN0IDYgYml0cyBvZiBmbG9hdFAgLT4gbG93IFswXSwgd2hpY2ggaXMKLQkgICAgICAgKgliaWdfb3BlcmFuZF9iaXRzIFstLS1dIFswXS4KLQkgICAgICAgKiBJZiB2b3Bfc2hvcnQgPT0gJ2knIHRoZW4gdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBlbGVtZW50cwotCSAgICAgICAqCW9mIGJpZ19vcGVyYW5kX2JpdHMgWy0tLV0gWy4uLl0gYXJlIHNldCB1cCB3aXRoIHRoZSBjb3JyZWN0Ci0JICAgICAgICoJYml0cy4KLQkgICAgICAgKiBBbHNvLCBqdXN0IGluIGNhc2Ugd2lkdGggaXMgYnl0ZSB3b3JkIG9yIGxvbmcsIHdlIGNvcHkgdGhlIGxvd2VzdAotCSAgICAgICAqIDMyIGJpdHMgb2YgdGhlIG51bWJlciB0byBYX2FkZF9udW1iZXIuCi0JICAgICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgIT0gb3BlcmFuZFAtPnZvcF9leHByX2VuZCArIDEpCi0JICAgIHsKLQkgICAgICBhc193YXJuICgiSnVuayBhdCBlbmQgb2YgZXhwcmVzc2lvbiBcIiVzXCIiLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgICAgIGdvb2ZlZCA9IDE7Ci0JICAgIH0KLQkgIG9wZXJhbmRQLT52b3BfZXhwcl9lbmRbMV0gPSBjX3NhdmU7Ci0JfQotICAgIH0JCQkJLyogZm9yKGVhY2ggb3BlcmFuZCkgKi8KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAobmVlZF9wYXNzXzIgfHwgZ29vZmVkKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAvKiBFbWl0IG9wLWNvZGUuICovCi0gIC8qIFJlbWVtYmVyIHdoZXJlIGl0IGlzLCBpbiBjYXNlIHdlIHdhbnQgdG8gbW9kaWZ5IHRoZSBvcC1jb2RlIGxhdGVyLiAqLwotICBvcGNvZGVfbG93X2J5dGVQID0gZnJhZ19tb3JlICh2LnZpdF9vcGNvZGVfbmJ5dGVzKTsKLSAgbWVtY3B5IChvcGNvZGVfbG93X2J5dGVQLCB2LnZpdF9vcGNvZGUsIHYudml0X29wY29kZV9uYnl0ZXMpOwotICBvcGNvZGVfYXNfbnVtYmVyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChvcGNvZGVfYXNfY2hhcnMgPSB2LnZpdF9vcGNvZGUsIDQpOwotICBmb3IgKG9wZXJhbmRQID0gdi52aXRfb3BlcmFuZCwKLSAgICAgICBleHBQID0gZXhwX29mX29wZXJhbmQsCi0gICAgICAgc2VnUCA9IHNlZ19vZl9vcGVyYW5kLAotICAgICAgIGZsb2F0UCA9IGZsb2F0X29wZXJhbmQsCi0gICAgICAgZW5kX29wZXJhbmRQID0gdi52aXRfb3BlcmFuZCArIHYudml0X29wZXJhbmRzOwotCi0gICAgICAgb3BlcmFuZFAgPCBlbmRfb3BlcmFuZFA7Ci0KLSAgICAgICBvcGVyYW5kUCsrLAotICAgICAgIGZsb2F0UCsrLAotICAgICAgIHNlZ1ArKywKLSAgICAgICBleHBQKyspCi0gICAgewotICAgICAgaWYgKG9wZXJhbmRQLT52b3BfbmR4ID49IDApCi0JewotCSAgLyogaW5kZXhlZCBhZGRyZXNzaW5nIGJ5dGUgKi8KLQkgIC8qIExlZ2FsaXR5IG9mIGluZGV4ZWQgbW9kZSBhbHJlYWR5IGNoZWNrZWQ6IGl0IGlzIE9LICovCi0JICBGUkFHX0FQUEVORF8xX0NIQVIgKDB4NDAgKyBvcGVyYW5kUC0+dm9wX25keCk7Ci0JfQkJCS8qIGlmKHZvcF9uZHg+PTApICovCi0KLSAgICAgIC8qIEhlcmUgdG8gbWFrZSBtYWluIG9wZXJhbmQgZnJhZyhzKS4gKi8KLSAgICAgIHRoaXNfYWRkX251bWJlciA9IGV4cFAtPlhfYWRkX251bWJlcjsKLSAgICAgIHRoaXNfYWRkX3N5bWJvbCA9IGV4cFAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIHRvX3NlZyA9ICpzZWdQOwotICAgICAgaXNfdW5kZWZpbmVkID0gKHRvX3NlZyA9PSBTRUdfVU5LTk9XTik7Ci0gICAgICBhdCA9IG9wZXJhbmRQLT52b3BfbW9kZSAmIDE7Ci0gICAgICBsZW5ndGggPSAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnYicKLQkJPyAxIDogKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3cnCi0JCSAgICAgICA/IDIgOiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnbCcKLQkJCSAgICAgID8gNCA6IDApKSk7Ci0gICAgICBuYnl0ZXMgPSBvcGVyYW5kUC0+dm9wX25ieXRlczsKLSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnYicpCi0JewotCSAgaWYgKHRvX3NlZyA9PSBub3dfc2VnIHx8IGlzX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIC8qIElmIGlzX3VuZGVmaW5lZCwgdGhlbiBpdCBtaWdodCBCRUNPTUUgbm93X3NlZy4gKi8KLQkgICAgICBpZiAobmJ5dGVzKQotCQl7Ci0JCSAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKLQkJICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBuYnl0ZXMsCi0JCQkgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiB0b19zZWc9PW5vd19zZWcgfHwgdG9fc2VnID09IFNFR19VTktOT1dOICovCi0JCSAgLyogbmJ5dGVzPT0wICovCi0JCSAgbGVuZ3RoX2NvZGUgPSBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURTsKLQkJICBpZiAob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1BFQ0lBTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCkKLQkJCXsKLQkJCSAgLyogYnIgb3IganNiICovCi0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMSwKLQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIGxlbmd0aF9jb2RlKSwKLQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJICAgIG9wY29kZV9sb3dfYnl0ZVApOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9XT1JEX0pVTVApCi0JCQkgICAgewotCQkJICAgICAgbGVuZ3RoX2NvZGUgPSBTVEFURV9XT1JEOwotCQkJICAgICAgLyogSkY6IFRoZXJlIGlzIG5vIHN0YXRlX2J5dGUgZm9yIHRoaXMgb25lISAqLwotCQkJICAgICAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMiwKLQkJCQkJRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgbGVuZ3RoX2NvZGUpLAotCQkJCQl0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCQkJb3Bjb2RlX2xvd19ieXRlUCk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAga25vdyAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfQllURV9KVU1QKTsKLQkJCSAgICAgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOSwgMSwKLQkJCSAgICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIGxlbmd0aF9jb2RlKSwKLQkJCQkJdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJCW9wY29kZV9sb3dfYnl0ZVApOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0NPTkRJVElPTkFMX0pVTVApOwotCQkgICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDcsIDEsCi0JCSAgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgbGVuZ3RoX2NvZGUpLAotCQkJCXRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCW9wY29kZV9sb3dfYnl0ZVApOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHRvX3NlZyAhPSBub3dfc2VnICYmIHRvX3NlZyAhPSBTRUdfVU5LTk9XTiAqLwotCSAgICAgIC8qCi0JICAgICAgICogLS0tIFNFRyBGTE9BVCBNQVkgQVBQRUFSIEhFUkUgLS0tLQotCSAgICAgICAqLwotCSAgICAgIGlmICh0b19zZWcgPT0gU0VHX0FCU09MVVRFKQotCQl7Ci0JCSAgaWYgKG5ieXRlcykKLQkJICAgIHsKLQkJICAgICAga25vdyAoIShvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TWU5USEVUSUMpKTsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKLQkJICAgICAgLyogQ29udmVudGlvbmFsIHJlbG9jYXRpb24uICovCi0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgbmJ5dGVzLCAmYWJzX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIDEsIE5PX1JFTE9DKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NZTlRIRVRJQyk7Ci0JCSAgICAgIGlmIChvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TUEVDSUFMKQotCQkJewotCQkJICBpZiAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfVU5DT05ESVRJT05BTF9KVU1QKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIGJyIG9yIGpzYiAqLwotCQkJICAgICAgKm9wY29kZV9sb3dfYnl0ZVAgPSBvcGNvZGVfYXNfY2hhcnNbMF0gKyBWQVhfV0lERU5fTE9ORzsKLQkJCSAgICAgIGtub3cgKG9wY29kZV9hc19jaGFyc1sxXSA9PSAwKTsKLQkJCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkJICAgICAgcFswXSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCSAgICAgIC8qIE5vdyAoZWcpIEpNUCBAI2ZvbyBvciBKU0IgQCNmb28uICovCi0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1dPUkRfSlVNUCkKLQkJCQl7Ci0JCQkJICBwID0gZnJhZ19tb3JlICgxMCk7Ci0JCQkJICBwWzBdID0gMjsKLQkJCQkgIHBbMV0gPSAwOwotCQkJCSAgcFsyXSA9IFZBWF9CUkI7Ci0JCQkJICBwWzNdID0gNjsKLQkJCQkgIHBbNF0gPSBWQVhfSk1QOwotCQkJCSAgcFs1XSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLwotCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNiwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCQkgIC8qCi0JCQkJICAgKiBOb3cgKGVnKQlBQ0J4CTFmCi0JCQkJICAgKgkJQlJCCTJmCi0JCQkJICAgKgkxOglKTVAJQCNmb28KLQkJCQkgICAqCTI6Ci0JCQkJICAgKi8KLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfQllURV9KVU1QKTsKLQkJCQkgIHAgPSBmcmFnX21vcmUgKDkpOwotCQkJCSAgcFswXSA9IDI7Ci0JCQkJICBwWzFdID0gVkFYX0JSQjsKLQkJCQkgIHBbMl0gPSA2OwotCQkJCSAgcFszXSA9IFZBWF9KTVA7Ci0JCQkJICBwWzRdID0gVkFYX1BDX1JFTEFUSVZFX01PREUgKyAxOwkvKiBAIy4uLiAqLwotCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCQkgIC8qCi0JCQkJICAgKiBOb3cgKGVnKQl4T0J4eHgJMWYKLQkJCQkgICAqCQlCUkIJMmYKLQkJCQkgICAqCTE6CUpNUAlAI2ZvbwotCQkJCSAgICoJMjoKLQkJCQkgICAqLwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogYjxjb25kPiAqLwotCQkJICAqb3Bjb2RlX2xvd19ieXRlUCBePSAxOwotCQkJICAvKiBUbyByZXZlcnNlIHRoZSBjb25kaXRpb24gaW4gYSBWQVggYnJhbmNoLAotCQkJICAgICBjb21wbGVtZW50IHRoZSBsb3dlc3Qgb3JkZXIgYml0LiAqLwotCQkJICBwID0gZnJhZ19tb3JlICg3KTsKLQkJCSAgcFswXSA9IDY7Ci0JCQkgIHBbMV0gPSBWQVhfSk1QOwotCQkJICBwWzJdID0gVkFYX0FCU09MVVRFX01PREU7CS8qIEAjLi4uICovCi0JCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDMsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkgIC8qCi0JCQkgICAqIE5vdyAoZWcpCUJMRVEJMWYKLQkJCSAgICoJCUpNUAlAI2ZvbwotCQkJICAgKgkxOgotCQkJICAgKi8KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIHRvX3NlZyAhPSBub3dfc2VnICYmIHRvX3NlZyAhPSBTRUdfVU5LTk9XTiAmJiB0b19TZWcgIT0gU0VHX0FCU09MVVRFICovCi0JCSAgaWYgKG5ieXRlcyA+IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFBjLXJlbGF0aXZlLiBDb252ZW50aW9uYWwgcmVsb2NhdGlvbi4gKi8KLQkJICAgICAga25vdyAoIShvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TWU5USEVUSUMpKTsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICBuYnl0ZXMsICZhYnNfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkgICAgICAgMSwgTk9fUkVMT0MpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAga25vdyAob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1lOVEhFVElDKTsKLQkJICAgICAgaWYgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NQRUNJQUwpCi0JCQl7Ci0JCQkgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9VTkNPTkRJVElPTkFMX0pVTVApCi0JCQkgICAgewotCQkJICAgICAgLyogYnIgb3IganNiICovCi0JCQkgICAgICBrbm93IChvcGNvZGVfYXNfY2hhcnNbMV0gPT0gMCk7Ci0JCQkgICAgICAqb3Bjb2RlX2xvd19ieXRlUCA9IG9wY29kZV9hc19jaGFyc1swXSArIFZBWF9XSURFTl9MT05HOwotCQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCQkgICAgICBwWzBdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7Ci0JCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywKLQkJCQkgICAgICAgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgICAgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCSAgICAgIC8qIE5vdyBlZyBKTVAgZm9vIG9yIEpTQiBmb28uICovCi0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1dPUkRfSlVNUCkKLQkJCQl7Ci0JCQkJICBwID0gZnJhZ19tb3JlICgxMCk7Ci0JCQkJICBwWzBdID0gMDsKLQkJCQkgIHBbMV0gPSAyOwotCQkJCSAgcFsyXSA9IFZBWF9CUkI7Ci0JCQkJICBwWzNdID0gNjsKLQkJCQkgIHBbNF0gPSBWQVhfSk1QOwotCQkJCSAgcFs1XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotCQkJCSAgZml4X25ldyAoZnJhZ19ub3csCi0JCQkJCSAgIHAgKyA2IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCQkJCSAgIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkJICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7Ci0JCQkJICAvKgotCQkJCSAgICogTm93IChlZykJQUNCeAkxZgotCQkJCSAgICoJCUJSQgkyZgotCQkJCSAgICoJMToJSk1QCWZvbwotCQkJCSAgICoJMjoKLQkJCQkgICAqLwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9CWVRFX0pVTVApOwotCQkJCSAgcCA9IGZyYWdfbW9yZSAoMTApOwotCQkJCSAgcFswXSA9IDI7Ci0JCQkJICBwWzFdID0gVkFYX0JSQjsKLQkJCQkgIHBbMl0gPSA2OwotCQkJCSAgcFszXSA9IFZBWF9KTVA7Ci0JCQkJICBwWzRdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7Ci0JCQkJICBmaXhfbmV3IChmcmFnX25vdywKLQkJCQkJICAgcCArIDUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCQkJICAgNCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCQkgIC8qCi0JCQkJICAgKiBOb3cgKGVnKQl4T0J4eHgJMWYKLQkJCQkgICAqCQlCUkIJMmYKLQkJCQkgICAqCTE6CUpNUAlmb28KLQkJCQkgICAqCTI6Ci0JCQkJICAgKi8KLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0NPTkRJVElPTkFMX0pVTVApOwotCQkJICAqb3Bjb2RlX2xvd19ieXRlUCBePSAxOwkvKiBSZXZlcnNlIGJyYW5jaCBjb25kaXRpb24uICovCi0JCQkgIHAgPSBmcmFnX21vcmUgKDcpOwotCQkJICBwWzBdID0gNjsKLQkJCSAgcFsxXSA9IFZBWF9KTVA7Ci0JCQkgIHBbMl0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLQkJCSAgZml4X25ldyAoZnJhZ19ub3csIHAgKyAzIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJICAgNCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAga25vdyAob3BlcmFuZFAtPnZvcF9hY2Nlc3MgIT0gJ2InKTsJLyogU28gaXQgaXMgb3JkaW5hcnkgb3BlcmFuZC4gKi8KLQkgIGtub3cgKG9wZXJhbmRQLT52b3BfYWNjZXNzICE9ICcgJyk7CS8qICcgJyB0YXJnZXQtaW5kZXBlbmRlbnQ6IGVsc2V3aGVyZS4gKi8KLQkgIGtub3cgKG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICdhJwotCQl8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnbScKLQkJfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ3InCi0JCXx8IG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICd2JwotCQl8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndycpOwotCSAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnKQotCSAgICB7Ci0JICAgICAgaWYgKHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUpCi0JCXsKLQkJICBpZiAodGhpc19hZGRfbnVtYmVyID49IDY0KQotCQkgICAgewotCQkgICAgICBhc193YXJuIChfKCJTaG9ydCBsaXRlcmFsIG92ZXJmbG93KCVsZC4pLCBpbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIpLAotCQkJICAgICAgIChsb25nKSB0aGlzX2FkZF9udW1iZXIpOwotCQkgICAgICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOwotCQkgICAgICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX3dhcm4gKF8oIkZvcmNlZCBzaG9ydCBsaXRlcmFsIHRvIGltbWVkaWF0ZSBtb2RlLiBub3dfc2VnPSVzIHRvX3NlZz0lcyIpLAotCQkJICAgc2VnbWVudF9uYW1lIChub3dfc2VnKSwgc2VnbWVudF9uYW1lICh0b19zZWcpKTsKLQkJICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOwotCQkgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDg7Ci0JCSAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7Ci0JCX0KLQkgICAgfQotCSAgaWYgKG9wZXJhbmRQLT52b3BfcmVnID49IDAgJiYgKG9wZXJhbmRQLT52b3BfbW9kZSA8IDgKLQkJICB8fCAob3BlcmFuZFAtPnZvcF9yZWcgIT0gMHhGICYmIG9wZXJhbmRQLT52b3BfbW9kZSA8IDEwKSkpCi0JICAgIHsKLQkgICAgICAvKiBPbmUgYnl0ZSBvcGVyYW5kLiAqLwotCSAgICAgIGtub3cgKG9wZXJhbmRQLT52b3BfbW9kZSA+IDMpOwotCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAob3BlcmFuZFAtPnZvcF9tb2RlIDw8IDQgfCBvcGVyYW5kUC0+dm9wX3JlZyk7Ci0JICAgICAgLyogQWxsIDEtYnl0ZXMgZXhjZXB0IFNeIyBoYXBwZW4gaGVyZS4gKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyoge0B9e3FefWZvb3soUm4pfSBvciBTXiNmb28gKi8KLQkgICAgICBpZiAob3BlcmFuZFAtPnZvcF9yZWcgPT0gLTEgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAncycpCi0JCXsKLQkJICAvKiAie0B9e3FefWZvbyIgKi8KLQkJICBpZiAodG9fc2VnID09IG5vd19zZWcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQkJCXsKLQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpOwotCQkJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMiwKLQkJCSAgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKSwKLQkJCQkJdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJCW9wY29kZV9sb3dfYnl0ZVApOwotCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX21vZGUgPT0gMTAgKyBhdCk7Ci0JCQkgICpwID0gYXQgPDwgNDsKLQkJCSAgLyogQXQgaXMgdGhlIG9ubHkgY29udGV4dCB3ZSBuZWVkIHRvIGNhcnJ5Ci0JCQkgICAgIHRvIG90aGVyIHNpZGUgb2YgcmVsYXgoKSBwcm9jZXNzLiAgTXVzdAotCQkJICAgICBiZSBpbiB0aGUgY29ycmVjdCBiaXQgcG9zaXRpb24gb2YgVkFYCi0JCQkgICAgIG9wZXJhbmQgc3BlYy4gYnl0ZS4gKi8KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBrbm93IChsZW5ndGgpOwotCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3Nob3J0ICE9ICcgJyk7Ci0JCQkgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOwotCQkJICBwWzBdID0gMHhGIHwgKChhdCArICI/XDEyXDE0P1wxNiJbbGVuZ3RoXSkgPDwgNCk7Ci0JCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCSAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsJCS8qIHRvX3NlZyAhPSBub3dfc2VnICovCi0JCSAgICAgIGlmICh0aGlzX2FkZF9zeW1ib2wgPT0gTlVMTCkKLQkJCXsKLQkJCSAga25vdyAodG9fc2VnID09IFNFR19BQlNPTFVURSk7Ci0JCQkgIC8qIERvIEAjZm9vOiBzaW1wbGVyIHJlbG9jYXRpb24gdGhhbiBmb28tLihwYykgYW55d2F5LiAqLwotCQkJICBwID0gZnJhZ19tb3JlICg1KTsKLQkJCSAgcFswXSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLwotCQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAxLCB0aGlzX2FkZF9udW1iZXIsIDQpOwotCQkJICBpZiAobGVuZ3RoICYmIGxlbmd0aCAhPSA0KQotCQkJICAgIHsKLQkJCSAgICAgIGFzX3dhcm4gKF8oIkxlbmd0aCBzcGVjaWZpY2F0aW9uIGlnbm9yZWQuIEFkZHJlc3MgbW9kZSA5RiB1c2VkIikpOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiB7QH17cV59b3RoZXJfc2VnICovCi0JCQkgIGtub3cgKChsZW5ndGggPT0gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJykKLQkJCSAgICAgfHwgKGxlbmd0aCA+IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAnICcpKTsKLQkJCSAgaWYgKGlzX3VuZGVmaW5lZCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICogV2UgaGF2ZSBhIFNFR19VTktOT1dOIHN5bWJvbC4gSXQgbWlnaHQKLQkJCSAgICAgICAqIHR1cm4gb3V0IHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMKLQkJCSAgICAgICAqIHRoZSBpbnN0cnVjdGlvbiwgcGVybWl0dGluZyByZWxheGF0aW9uLgotCQkJICAgICAgICovCi0JCQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA1LCAyLAotCQkJICAgICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1VOREYpLAotCQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJCSAgICAwKTsKLQkJCSAgICAgIHBbMF0gPSBhdCA8PCA0OwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQkJCQl7Ci0JCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJyk7Ci0JCQkJICBsZW5ndGggPSA0OwkvKiBMb25nZXN0IHBvc3NpYmxlLiAqLwotCQkJCX0KLQkJCSAgICAgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOwotCQkJICAgICAgcFswXSA9IDB4RiB8ICgoYXQgKyAiP1wxMlwxND9cMTYiW2xlbmd0aF0pIDw8IDQpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCBsZW5ndGgpOwotCQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csCi0JCQkJICAgICAgIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJICAgICAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgICAgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB7QH17cV59Zm9vKFJuKSBvciBTXiMgb3IgSV4jIG9yICMgKi8KLQkJICBpZiAob3BlcmFuZFAtPnZvcF9tb2RlIDwgMHhBKQotCQkgICAgewotCQkgICAgICAvKiAjIG9yIFNeIyBvciBJXiMgKi8KLQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICd2JwotCQkJICB8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnYScpCi0JCQl7Ci0JCQkgIGlmIChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndicpCi0JCQkgICAgYXNfd2FybiAoXygiSW52YWxpZCBvcGVyYW5kOiAgaW1tZWRpYXRlIHZhbHVlIHVzZWQgYXMgYmFzZSBhZGRyZXNzLiIpKTsKLQkJCSAgZWxzZQotCQkJICAgIGFzX3dhcm4gKF8oIkludmFsaWQgb3BlcmFuZDogIGltbWVkaWF0ZSB2YWx1ZSB1c2VkIGFzIGFkZHJlc3MuIikpOwotCQkJICAvKiBnY2MgMi42LjMgaXMga25vd24gdG8gZ2VuZXJhdGUgdGhlc2UgaW4gYXQgbGVhc3QKLQkJCSAgICAgb25lIGNhc2UuICAqLwotCQkJfQotCQkgICAgICBpZiAobGVuZ3RoID09IDAKLQkJCSAgJiYgdG9fc2VnID09IFNFR19BQlNPTFVURSAmJiAoZXhwUC0+WF9vcCAhPSBPX2JpZykKLQkJCSAgJiYgb3BlcmFuZFAtPnZvcF9tb2RlID09IDgJLyogTm8gJ0AnLiAqLwotCQkJICAmJiB0aGlzX2FkZF9udW1iZXIgPCA2NCkKLQkJCXsKLQkJCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdzJzsKLQkJCX0KLQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnKQotCQkJewotCQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKHRoaXNfYWRkX251bWJlcik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogSV4jLi4uICovCi0JCQkgIGtub3cgKG5ieXRlcyk7Ci0JCQkgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyArIDEpOwotCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3JlZyA9PSAweEYpOwotCQkJICBwWzBdID0gKG9wZXJhbmRQLT52b3BfbW9kZSA8PCA0KSB8IDB4RjsKLQkJCSAgaWYgKCh0b19zZWcgPT0gU0VHX0FCU09MVVRFKSAmJiAoZXhwUC0+WF9vcCAhPSBPX2JpZykpCi0JCQkgICAgewotCQkJICAgICAgLyoKLQkJCSAgICAgICAqIElmIG5ieXRlcyA+IDQsIHRoZW4gd2UgYXJlIHNjcm9kLiBXZQotCQkJICAgICAgICogZG9uJ3Qga25vdyBpZiB0aGUgaGlnaCBvcmRlciBieXRlcwotCQkJICAgICAgICogYXJlIHRvIGJlIDB4RkYgb3IgMHgwMC4gIEJTRDQuMiAmIFJNUwotCQkJICAgICAgICogc2F5IHVzZSAweDAwLiBPSyAtLS0gYnV0IHRoaXMKLQkJCSAgICAgICAqIGFzc2VtYmxlciBuZWVkcyBBTk9USEVSIHJld3JpdGUgdG8KLQkJCSAgICAgICAqIGNvcGUgcHJvcGVybHkgd2l0aCB0aGlzIGJ1Zy4gKi8KLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgbWluICg0LCBuYnl0ZXMpKTsKLQkJCSAgICAgIGlmIChuYnl0ZXMgPiA0KQotCQkJCXsKLQkJCQkgIG1lbXNldCAocCArIDUsICdcMCcsIG5ieXRlcyAtIDQpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoZXhwUC0+WF9vcCA9PSBPX2JpZykKLQkJCQl7Ci0JCQkJICAvKgotCQkJCSAgICogUHJvYmxlbSBoZXJlIGlzIHRvIGdldCB0aGUgYnl0ZXMKLQkJCQkgICAqIGluIHRoZSByaWdodCBvcmRlci4gIFdlIHN0b3JlZAotCQkJCSAgICogb3VyIGNvbnN0YW50IGFzIExJVFRMRU5VTXMsIG5vdAotCQkJCSAgICogYnl0ZXMuICovCi0JCQkJICBMSVRUTEVOVU1fVFlQRSAqbFA7Ci0KLQkJCQkgIGxQID0gZmxvYXRQLT5sb3c7Ci0JCQkJICBpZiAobmJ5dGVzICYgMSkKLQkJCQkgICAgewotCQkJCSAgICAgIGtub3cgKG5ieXRlcyA9PSAxKTsKLQkJCQkgICAgICBwWzFdID0gKmxQOwotCQkJCSAgICB9Ci0JCQkJICBlbHNlCi0JCQkJICAgIHsKLQkJCQkgICAgICBmb3IgKHArKzsgbmJ5dGVzOyBuYnl0ZXMgLT0gMiwgcCArPSAyLCBsUCsrKQotCQkJCQl7Ci0JCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAqbFAsIDIpOwotCQkJCQl9Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgZml4X25ldyAoZnJhZ19ub3csIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJCSAgIG5ieXRlcywgdGhpc19hZGRfc3ltYm9sLAotCQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDAsIE5PX1JFTE9DKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsJCS8qIHtAfXtxXn1mb28oUm4pICovCi0JCSAgICAgIGtub3cgKChsZW5ndGggPT0gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJykKLQkJCSAgICB8fCAobGVuZ3RoID4gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ICE9ICcgJykpOwotCQkgICAgICBpZiAobGVuZ3RoID09IDApCi0JCQl7Ci0JCQkgIGlmICh0b19zZWcgPT0gU0VHX0FCU09MVVRFKQotCQkJICAgIHsKLQkJCSAgICAgIGxvbmcgdGVzdDsKLQotCQkJICAgICAgdGVzdCA9IHRoaXNfYWRkX251bWJlcjsKLQotCQkJICAgICAgaWYgKHRlc3QgPCAwKQotCQkJCXRlc3QgPSB+dGVzdDsKLQotCQkJICAgICAgbGVuZ3RoID0gdGVzdCAmIDB4ZmZmZjgwMDAgPyA0Ci0JCQkJOiB0ZXN0ICYgMHhmZmZmZmY4MCA/IDIKLQkJCQk6IDE7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgbGVuZ3RoID0gNDsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDEgKyBsZW5ndGgpOwotCQkgICAgICBrbm93IChvcGVyYW5kUC0+dm9wX3JlZyA+PSAwKTsKLQkJICAgICAgcFswXSA9IG9wZXJhbmRQLT52b3BfcmVnCi0JCQl8ICgoYXQgfCAiP1wxMlwxND9cMTYiW2xlbmd0aF0pIDw8IDQpOwotCQkgICAgICBpZiAodG9fc2VnID09IFNFR19BQlNPTFVURSkKLQkJCXsKLQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCBsZW5ndGgpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCSAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMCwgTk9fUkVMT0MpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0JCQkvKiBpZihzaW5nbGUtYnl0ZS1vcGVyYW5kKSAqLwotCX0KLSAgICB9CQkJCS8qIGZvcihvcGVyYW5kUCkgKi8KLX0JCQkJLyogdmF4X2Fzc2VtYmxlKCkgKi8KLQwKLS8qCi0gKgkJCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkKLSAqCi0gKiBDYWxsZWQganVzdCBiZWZvcmUgcmVsYXgoKS4KLSAqIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgotICogUmV0dXJuIHRoZSBjb3JyZWN0IGZyX3N1YnR5cGUgaW4gdGhlIGZyYWcuCi0gKiBSZXR1cm4gdGhlIGluaXRpYWwgImd1ZXNzIGZvciBmcl92YXIiIHRvIGNhbGxlci4KLSAqIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KLSAqIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCi0gKiBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCi0gKiAwIHZhbHVlLgotICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIGNoYXIgKnA7Ci0gIGludCBvbGRfZnJfZml4OwotCi0gIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewkJCS8qIEEgcmVsYXhhYmxlIGNhc2UuICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgcFswXSB8PSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogUHJlc2VydmUgQCBiaXQuICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSBePSAxOwkvKiBSZXZlcnNlIHNlbnNlIG9mIGJyYW5jaC4gKi8KLQkgIHBbMF0gPSA2OwotCSAgcFsxXSA9IFZBWF9KTVA7Ci0JICBwWzJdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihQQykgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDEgKyAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMywgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfQlJBTkNILCBTVEFURV9XT1JEKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgIHBbMF0gPSAyOwotCSAgcFsxXSA9IDA7Ci0JICBwWzJdID0gVkFYX0JSQjsKLQkgIHBbM10gPSA2OwotCSAgcFs0XSA9IFZBWF9KTVA7Ci0JICBwWzVdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihwYykgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMiArIDIgKyAxICsgMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDYsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICBwWzBdID0gMjsKLQkgIHBbMV0gPSBWQVhfQlJCOwotCSAgcFsyXSA9IDY7Ci0JICBwWzNdID0gVkFYX0pNUDsKLQkgIHBbNF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogLi4uKHBjKSAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgMiArIDEgKyAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgNSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSArPSBWQVhfV0lERU5fTE9ORzsKLQkgIHBbMF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogLi4uKFBDKSAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19CQkJCS8qIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgKi8KLQwKLS8qCi0gKgkJCW1kX2NvbnZlcnRfZnJhZygpOwotICoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGNoYXIgKmFkZHJlc3NQOwkJLyogLT4gX3ZhciB0byBjaGFuZ2UuICovCi0gIGNoYXIgKm9wY29kZVA7CQkvKiAtPiBvcGNvZGUgY2hhcihzKSB0byBjaGFuZ2UuICovCi0gIHNob3J0IGludCBsZW5ndGhfY29kZTsJLyogMj1sb25nIDE9d29yZCAwPWJ5dGUgKi8KLSAgc2hvcnQgaW50IGV4dGVuc2lvbiA9IDA7CS8qIFNpemUgb2YgcmVsYXhlZCBhZGRyZXNzLiAqLwotICAvKiBBZGRlZCB0byBmcl9maXg6IGluY2wuIEFMTCB2YXIgY2hhcnMuICovCi0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGxvbmcgd2hlcmU7Ci0gIGxvbmcgYWRkcmVzc19vZl92YXI7Ci0gIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBpcyBfdmFyIG9mICpmcmFnUD8gKi8KLSAgbG9uZyB0YXJnZXRfYWRkcmVzcyA9IDA7Ci0gIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBkb2VzIGFkZHIgcG9pbnQ/ICovCi0KLSAga25vdyAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQpOwotICBsZW5ndGhfY29kZSA9IGZyYWdQLT5mcl9zdWJ0eXBlICYgMzsJLyogZGVwZW5kcyBvbiBFTkNPREVfUkVMQVgoKSAqLwotICBrbm93IChsZW5ndGhfY29kZSA+PSAwICYmIGxlbmd0aF9jb2RlIDwgMyk7Ci0gIHdoZXJlID0gZnJhZ1AtPmZyX2ZpeDsKLSAgYWRkcmVzc1AgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICBvcGNvZGVQID0gZnJhZ1AtPmZyX29wY29kZTsKLSAgc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0gIGtub3cgKHN5bWJvbFApOwotICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gIGFkZHJlc3Nfb2ZfdmFyID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZTsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk6Ci0gICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCi0gICAgICBhZGRyZXNzUFswXSB8PSAweEFGOwkvKiBCeXRlIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgIGFkZHJlc3NQWzFdID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfV09SRCk6Ci0gICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCi0gICAgICBhZGRyZXNzUFswXSB8PSAweENGOwkvKiBXb3JkIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAxLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDMpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfTE9ORyk6Ci0gICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCi0gICAgICBhZGRyZXNzUFswXSB8PSAweEVGOwkvKiBMb25nIHdvcmQgZGlzcGxhY2VtZW50LiAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDEsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNSksIDQpOwotICAgICAgZXh0ZW5zaW9uID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk6Ci0gICAgICBhZGRyZXNzUFswXSA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7Ci0gICAgICBleHRlbnNpb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgIG9wY29kZVBbMF0gXj0gMTsJCS8qIFJldmVyc2Ugc2Vuc2Ugb2YgdGVzdC4gKi8KLSAgICAgIGFkZHJlc3NQWzBdID0gMzsKLSAgICAgIGFkZHJlc3NQWzFdID0gVkFYX0JSQiArIFZBWF9XSURFTl9XT1JEOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDIsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNCksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICBvcGNvZGVQWzBdIF49IDE7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCi0gICAgICBhZGRyZXNzUFswXSA9IDY7Ci0gICAgICBhZGRyZXNzUFsxXSA9IFZBWF9KTVA7Ci0gICAgICBhZGRyZXNzUFsyXSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDMsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9CWVRFKToKLSAgICAgIGFkZHJlc3NQWzBdID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKLSAgICAgIGV4dGVuc2lvbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgIG9wY29kZVBbMF0gKz0gVkFYX1dJREVOX1dPUkQ7CS8qIGJyYiAtPiBicncsIGJzYmIgLT4gYnNidyAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICBvcGNvZGVQWzBdICs9IFZBWF9XSURFTl9MT05HOwkvKiBicmIgLT4gam1wLCBic2JiIC0+IGpzYiAqLwotICAgICAgYWRkcmVzc1BbMF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAxLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICBhZGRyZXNzUFswXSA9IDI7Ci0gICAgICBhZGRyZXNzUFsxXSA9IDA7Ci0gICAgICBhZGRyZXNzUFsyXSA9IFZBWF9CUkI7Ci0gICAgICBhZGRyZXNzUFszXSA9IDY7Ci0gICAgICBhZGRyZXNzUFs0XSA9IFZBWF9KTVA7Ci0gICAgICBhZGRyZXNzUFs1XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDYsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIFNUQVRFX0JZVEUpOgotICAgICAgYWRkcmVzc1BbMF0gPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOwotICAgICAgZXh0ZW5zaW9uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBTVEFURV9XT1JEKToKLSAgICAgIGFkZHJlc3NQWzBdID0gMjsKLSAgICAgIGFkZHJlc3NQWzFdID0gVkFYX0JSQjsKLSAgICAgIGFkZHJlc3NQWzJdID0gMzsKLSAgICAgIGFkZHJlc3NQWzNdID0gVkFYX0JSVzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyA0LCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDYpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfTE9ORyk6Ci0gICAgICBhZGRyZXNzUFswXSA9IDI7Ci0gICAgICBhZGRyZXNzUFsxXSA9IFZBWF9CUkI7Ci0gICAgICBhZGRyZXNzUFsyXSA9IDY7Ci0gICAgICBhZGRyZXNzUFszXSA9IFZBWF9KTVA7Ci0gICAgICBhZGRyZXNzUFs0XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDUsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKLX0JCQkJLyogbWRfY29udmVydF9mcmFnKCkgKi8KLQotLyogVHJhbnNsYXRlIGludGVybmFsIGZvcm1hdCBvZiByZWxvY2F0aW9uIGluZm8gaW50byB0YXJnZXQgZm9ybWF0LgotCi0gICBPbiB2YXg6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nLCBuZXh0IHRocmVlIGJ5dGVzCi0gICBhcmUgc3ltYm9sbnVtLCBsZWFzdCBzaWcuIGJ5dGUgZmlyc3QuICBMYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGgKLSAgIHRoZSB1cHBlciBuaWJibGUgYXMgbnV0aGluLCBiaXQgMyBhcyBleHRlcm4sIGJpdHMgMiAmIDEgYXMgbGVuZ3RoLCBhbmQKLSAgIGJpdCAwIGFzIHBjcmVsLiAqLwotI2lmZGVmIGNvbW1lbnQKLXZvaWQKLW1kX3JpX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpKQotICAgICBjaGFyICp0aGVfYnl0ZXM7Ci0gICAgIHN0cnVjdCByZWxvY19pbmZvX2dlbmVyaWMgcmk7Ci17Ci0gIC8qIHRoaXMgaXMgZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkucl9hZGRyZXNzLCBzaXplb2YgKHJpLnJfYWRkcmVzcykpOwotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNl0gPSAocmkucl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s1XSA9IChyaS5yX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNF0gPSByaS5yX3N5bWJvbG51bSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKChyaS5yX2V4dGVybiA8PCAzKSAmIDB4MDgpIHwgKChyaS5yX2xlbmd0aCA8PCAxKSAmIDB4MDYpIHwKLQkJICAoKHJpLnJfcGNyZWwgPDwgMCkgJiAweDAxKSkgJiAweDBGOwotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi12b2lkIAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICAvKgotICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCi0gICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCi0gICAqLwotCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzZdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs0XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgMykgJiAweDA4KQotCSAgICAgIHwgKChuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV0gPDwgMSkgJiAweDA2KQotCSAgICAgIHwgKCgoZml4UC0+ZnhfcGNyZWwgPDwgMCkgJiAweDAxKSAmIDB4MGYpKTsKLX0KLQotLyoKLSAqICAgICAgIEJVR1MsIEdSSVBFUywgIEFQT0xPR0lBLCBldGMuCi0gKgotICogVGhlIG9wY29kZSB0YWJsZSAndm90c3RycycgbmVlZHMgdG8gYmUgc29ydGVkIG9uIG9wY29kZSBmcmVxdWVuY3kuCi0gKiBUaGF0IGlzLCBBRlRFUiB3ZSBoYXNoIGl0IHdpdGggaGFzaF8uLi4oKSwgd2Ugd2FudCBtb3N0LXVzZWQgb3Bjb2RlcwotICogdG8gY29tZSBvdXQgb2YgdGhlIGhhc2ggdGFibGUgZmFzdGVyLgotICoKLSAqIEkgYW0gc29ycnkgdG8gaW5mbGljdCB5ZXQgYW5vdGhlciBWQVggYXNzZW1ibGVyIG9uIHRoZSB3b3JsZCwgYnV0Ci0gKiBSTVMgc2F5cyB3ZSBtdXN0IGRvIGV2ZXJ5dGhpbmcgZnJvbSBzY3JhdGNoLCB0byBwcmV2ZW50IHBpbi1oZWFkcwotICogcmVzdHJpY3RpbmcgdGhpcyBzb2Z0d2FyZS4KLSAqLwotCi0vKgotICogVGhpcyBpcyBhIHZhZ3VlbHkgbW9kdWxhciBzZXQgb2Ygcm91dGluZXMgaW4gQyB0byBwYXJzZSBWQVgKLSAqIGFzc2VtYmx5IGNvZGUgdXNpbmcgREVDIG1uZW1vbmljcy4gSXQgaXMgTk9UIHVuKnggc3BlY2lmaWMuCi0gKgotICogVGhlIGlkZWEgaGVyZSBpcyB0aGF0IHRoZSBhc3NlbWJsZXIgaGFzIHRha2VuIGNhcmUgb2YgYWxsOgotICogICBsYWJlbHMKLSAqICAgbWFjcm9zCi0gKiAgIGxpc3RpbmcKLSAqICAgcHNldWRvLW9wcwotICogICBsaW5lIGNvbnRpbnVhdGlvbgotICogICBjb21tZW50cwotICogICBjb25kZW5zaW5nIGFueSB3aGl0ZXNwYWNlIGRvd24gdG8gZXhhY3RseSBvbmUgc3BhY2UKLSAqIGFuZCBhbGwgd2UgaGF2ZSB0byBkbyBpcyBwYXJzZSAxIGxpbmUgaW50byBhIHZheCBpbnN0cnVjdGlvbgotICogcGFydGlhbGx5IGZvcm1lZC4gV2Ugd2lsbCBhY2NlcHQgYSBsaW5lLCBhbmQgZGVsaXZlcjoKLSAqICAgYW4gZXJyb3IgbWVzc2FnZSAoaG9wZWZ1bGx5IGVtcHR5KQotICogICBhIHNrZWxldG9uIFZBWCBpbnN0cnVjdGlvbiAodHJlZSBzdHJ1Y3R1cmUpCi0gKiAgIHRleHR1YWwgcG9pbnRlcnMgdG8gYWxsIHRoZSBvcGVyYW5kIGV4cHJlc3Npb25zCi0gKiAgIGEgd2FybmluZyBtZXNzYWdlIHRoYXQgbm90ZXMgYSBzaWxseSBvcGVyYW5kIChob3BlZnVsbHkgZW1wdHkpCi0gKi8KLQwKLS8qCi0gKgkJRSBEIEkgVCAgIEggSSBTIFQgTyBSIFkKLSAqCi0gKiAxN21heTg2IERlYW4gRWxzbmVyLiBCdWcgaWYgbGluZSBlbmRzIGltbWVkaWF0ZWx5IGFmdGVyIG9wY29kZS4KLSAqIDMwYXByODYgRGVhbiBFbHNuZXIuIE5ldyB2aXBfb3AoKSB1c2VzIGFyZyBibG9jayBzbyBjaGFuZ2UgY2FsbC4KLSAqICA2amFuODYgRGVhbiBFbHNuZXIuIENyb2NrIHZpcF9iZWdpbigpIHRvIGNhbGwgdmlwX29wX2RlZmF1bHRzKCkuCi0gKiAgMmphbjg2IERlYW4gRWxzbmVyLiBJbnZlbnQgc3ludGhldGljIG9wY29kZXMuCi0gKglXaWRlbiB2YXhfb3Bjb2RlVCB0byAzMiBiaXRzLiBVc2UgYSBiaXQgZm9yIFZJVF9PUENPREVfU1lOVEhFVElDLAotICoJd2hpY2ggbWVhbnMgdGhpcyBpcyBub3QgYSByZWFsIG9wY29kZSwgaXQgaXMgbGlrZSBhIG1hY3JvOyBpdCB3aWxsCi0gKgliZSByZWxheCgpZWQgaW50byAxIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zLgotICoJVXNlIGFub3RoZXIgYml0IGZvciBWSVRfT1BDT0RFX1NQRUNJQUwgaWYgdGhlIG9wLWNvZGUgaXMgbm90IG9wdGltaXNlZAotICoJbGlrZSBhIHJlZ3VsYXIgYnJhbmNoIGluc3RydWN0aW9uLiBPcHRpb24gYWRkZWQgdG8gdmlwX2JlZ2luKCk6Ci0gKglleGNsdWRlCXN5bnRoZXRpYyBvcGNvZGVzLiBJbnZlbnQgc3ludGhldGljX3ZvdHN0cnNbXS4KLSAqIDMxZGVjODUgRGVhbiBFbHNuZXIuIEludmVudCB2aXRfb3Bjb2RlX25ieXRlcy4KLSAqCUFsc28gbWFrZSB2aXRfb3Bjb2RlIGludG8gYSBjaGFyW10uIFdlIG5vdyBoYXZlIG4tYnl0ZSB2YXggb3Bjb2RlcywKLSAqCXNvIGNhbGxlcidzIGRvbid0IGhhdmUgdG8ga25vdyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgMS1ieXRlICYgYQotICoJMi1ieXRlIG9wLWNvZGUuIFN0aWxsIG5lZWQgdmF4X29wY29kZVQgY29uY2VwdCwgc28gd2Uga25vdyBob3cKLSAqCWJpZyBhbiBvYmplY3QgbXVzdCBiZSB0byBob2xkIGFuIG9wLmNvZGUuCi0gKiAzMGRlYzg1IERlYW4gRWxzbmVyLiBXaWRlbiB0eXBlZGVmIHZheF9vcGNvZGVUIGluICJ2YXgtaW5zdC5oIgotICoJYmVjYXVzZSB2YXggb3Bjb2RlcyBtYXkgYmUgMTYgYml0cy4gT3VyIGNydWZ0eSBDIGNvbXBpbGVyIHdhcwotICoJaGFwcGlseSBpbml0aWFsaXNpbmcgOC1iaXQgdm90X2NvZGVzIHdpdGggMTYtYml0IG51bWJlcnMhCi0gKgkoV291bGRuJ3QgdGhlICdwaG9uZSBjb21wYW55IGxpa2UgdG8gY29tcHJlc3MgZGF0YSBzbyBlYXNpbHkhKQotICogMjlkZWM4NSBEZWFuIEVsc25lci4gTmV3IHN0YXRpYyB0YWJsZSB2YXhfb3BlcmFuZF93aWR0aF9zaXplW10uCi0gKglJbnZlbnRlZCBzbyB3ZSBrbm93IGh3IG1hbnkgYnl0ZXMgYSAiSV4jNDIiIG5lZWRzIGluIGl0cyBpbW1lZGlhdGUKLSAqCW9wZXJhbmQuIFJldmlzZWQgc3RydWN0IHZvcCBpbiAidmF4LWluc3QuaCI6IGV4cGxpY2l0bHkgaW5jbHVkZQotICoJYnl0ZSBsZW5ndGggb2YgZWFjaCBvcGVyYW5kLCBhbmQgaXQncyBsZXR0ZXItY29kZSBkYXR1bSB0eXBlLgotICogMTdub3Y4NSBEZWFuIEVsc25lci4gTmFtZSBDaGFuZ2UuCi0gKglEdWUgdG8gYXIoMSkgdHJ1bmNhdGluZyBuYW1lcywgd2UgbGVhcm5lZCB0aGUgaGFyZCB3YXkgdGhhdAotICoJInZheC1pbnN0LXBhcnNlLmMiIC0+ICJ2YXgtaW5zdC1wYXJzZS4iIGRyb3BwaW5nIHRoZSAibyIgb2ZmCi0gKgl0aGUgYXJjaGl2ZWQgb2JqZWN0IG5hbWUuIFNPLi4uIHdlIHNob3J0ZW5lZCB0aGUgbmFtZSBvZiB0aGlzCi0gKglzb3VyY2UgZmlsZSwgYW5kIGNoYW5nZWQgdGhlIG1ha2VmaWxlLgotICovCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotCi0vKgotICogSW46CTEgY2hhcmFjdGVyLCBmcm9tICJiZGZnaGxvcXB3IiBiZWluZyB0aGUgZGF0YS10eXBlIG9mIGFuIG9wZXJhbmQKLSAqCW9mIGEgdmF4IGluc3RydWN0aW9uLgotICoKLSAqIE91dDoJdGhlIGxlbmd0aCBvZiBhbiBvcGVyYW5kIG9mIHRoYXQgdHlwZSwgaW4gYnl0ZXMuCi0gKglTcGVjaWFsIGJyYW5jaCBvcGVyYW5kcyB0eXBlcyAiLT8hIiBoYXZlIGxlbmd0aCAwLgotICovCi0KLXN0YXRpYyBjb25zdCBzaG9ydCBpbnQgdmF4X29wZXJhbmRfd2lkdGhfc2l6ZVsyNTZdID0KLXsKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDEsIDAsIDgsIDAsIDQsIDgsIDE2LCAwLCAwLCAwLCA0LCAwLCAwLDE2LAkvKiAuLmIuZC5mZ2guLi5sLi5vICovCi0gIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDIsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAucS4uLi4udy4uLi4uLi4uICovCi0gIDAsIDAsIDEsIDAsIDgsIDAsIDQsIDgsIDE2LCAwLCAwLCAwLCA0LCAwLCAwLDE2LAkvKiAuLmIuZC5mZ2guLi5sLi5vICovCi0gIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDIsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAucS4uLi4udy4uLi4uLi4uICovCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLX07Ci0MCi0vKgotICogVGhpcyBwZXJ2ZXJzaW9uIGVuY29kZXMgYWxsIHRoZSB2YXggb3Bjb2RlcyBhcyBhIGJ1bmNoIG9mIHN0cmluZ3MuCi0gKiBSTVMgc2F5cyB3ZSBzaG91bGQgYnVpbGQgb3VyIGhhc2gtdGFibGUgYXQgcnVuLXRpbWUuIEhtbS4KLSAqIFBsZWFzZSB3b3VsZCBzb21lb25lIGFycmFuZ2UgdGhlc2UgaW4gZGVjcmVhc2luZyBmcmVxdWVuY3kgb2Ygb3Bjb2RlPwotICogQmVjYXVzZSBvZiB0aGUgd2F5IGhhc2hfLi4uKCkgd29ya3MsIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcGNvZGUKLSAqIHNob3VsZCBiZSB0ZXh0dWFsbHkgZmlyc3QgYW5kIHNvIG9uLgotICoKLSAqIElucHV0IGZvciB0aGlzIHRhYmxlIHdhcyAndmF4Lm9wY29kZXMnLCBhd2soMSllZCBieSAndmF4Lm9wY29kZXMuYy5hd2snIC4KLSAqIFNvIGNoYW5nZSAndmF4Lm9wY29kZXMnLCB0aGVuIHJlLWdlbmVyYXRlIHRoaXMgdGFibGUuCi0gKi8KLQotI2luY2x1ZGUgIm9wY29kZS92YXguaCIKLQwKLS8qCi0gKiBUaGlzIGlzIGEgdGFibGUgb2Ygb3B0aW9uYWwgb3AtY29kZXMuIEFsbCBvZiB0aGVtIHJlcHJlc2VudAotICogJ3N5bnRoZXRpYycgaW5zdHJ1Y3Rpb25zIHRoYXQgc2VlbSBwb3B1bGFyLgotICoKLSAqIEhlcmUgd2UgbWFrZSBzb21lIHBzZXVkbyBvcC1jb2Rlcy4gRXZlcnkgY29kZSBoYXMgYSBiaXQgc2V0IHRvIHNheQotICogaXQgaXMgc3ludGhldGljLiBUaGlzIGxldHMgeW91IGNhdGNoIHRoZW0gaWYgeW91IHdhbnQgdG8KLSAqIGJhbiB0aGVzZSBvcGNvZGVzLiBUaGV5IGFyZSBtbmVtb25pY3MgZm9yICJlbGFzdGljIiBpbnN0cnVjdGlvbnMKLSAqIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGFzc2VtYmxlIGludG8gdGhlIGZld2VzdCBieXRlcyBuZWVkZWQgdG8gZG8gYQotICogYnJhbmNoLCBvciB0byBkbyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgb3Igd2hhdGV2ZXIuCi0gKgotICogVGhlIG9wY29kZSBpcyBpbiB0aGUgdXN1YWwgcGxhY2UgW2xvdy1vcmRlciBuKjggYml0c10uIFRoaXMgbWVhbnMKLSAqIHRoYXQgaWYgeW91IG1hc2sgb2ZmIHRoZSBidWNreSBiaXRzLCB0aGUgdXN1YWwgcnVsZXMgYXBwbHkgYWJvdXQKLSAqIGhvdyBsb25nIHRoZSBvcGNvZGUgaXMuCi0gKgotICogQWxsIFZBWCBicmFuY2ggZGlzcGxhY2VtZW50cyBjb21lIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uLgotICogRm9yIHNpbXBsZSBicmFuY2hlcyAoMS1ieXRlIG9wY29kZSArIDEtYnl0ZSBkaXNwbGFjZW1lbnQpIHRoZSBsYXN0Ci0gKiBvcGVyYW5kIGlzIGNvZGVkICdiPycgd2hlcmUgdGhlICJkYXRhIHR5cGUiICc/JyBpcyBhIGNsdWUgdGhhdCB3ZQotICogbWF5IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2ggKGNvbXBsZW1lbnQgbG93ZXN0IG9yZGVyIGJpdCkKLSAqIGFuZCBicmFuY2ggYXJvdW5kIGEganVtcC4gVGhpcyBpcyBieSBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2UuCi0gKiBUaGF0IGlzIHdoeSB0aGUgVklUX09QQ09ERV9TWU5USEVUSUMgYml0IGlzIHNldDogaXQgc2F5cyB0aGlzIGlzCi0gKiBhIDAtYnl0ZSBvcC1jb2RlIGZvbGxvd2VkIGJ5IDIgb3IgbW9yZSBieXRlcyBvZiBvcGVyYW5kIGFkZHJlc3MuCi0gKgotICogSWYgdGhlIG9wLWNvZGUgaGFzIFZJVF9PUENPREVfU1BFQ0lBTCBzZXQsIHRoZW4gd2UgaGF2ZSBhIG1vcmUgdW51c3VhbAotICogY2FzZS4KLSAqCi0gKiBGb3IgSkJTQiAmIEpCUiB0aGUgdHJlYXRtZW50IGlzIHRoZSBzaW1pbGFyLCBleGNlcHQgKDEpIHdlIGhhdmUgYSAnYncnCi0gKiBvcHRpb24gYmVmb3JlICgyKSB3ZSBjYW4gZGlyZWN0bHkgSlNCL0pNUCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbmRpdGlvbi4KLSAqIFRoZXNlIG9wZXJhbmRzIGhhdmUgJ2ItJyBhcyB0aGVpciBhY2Nlc3MvZGF0YSB0eXBlLgotICoKLSAqIFRoYXQgbGVhdmVzIGEgYnVuY2ggb2YgcmFuZG9tIG9wY29kZXM6IEpBQ0J4LCBKeE9CeHh4LiBJbiB0aGVzZQotICogY2FzZXMsIHdlIGRvIHRoZSBzYW1lIGlkZWEuIEpBQ0J4eHggYXJlIGFsbCBtYXJrZWQgd2l0aCBhICdiIScKLSAqIEpBT0J4eHggJiBKU09CeHh4IGFyZSBtYXJrZWQgd2l0aCBhICdiOicuCi0gKgotICovCi0jaWYgKFZJVF9PUENPREVfU1lOVEhFVElDICE9IDB4ODAwMDAwMDApCi1Zb3UgaGF2ZSBqdXN0IGJyb2tlbiB0aGUgZW5jb2RpbmcgYmVsb3csIHdoaWNoIGFzc3VtZXMgdGhlIHNpZ24gYml0Ci0gIG1lYW5zICdJIGFtIGFuIGltYWdpbmFyeSBpbnN0cnVjdGlvbicuCi0jZW5kaWYKLQotI2lmIChWSVRfT1BDT0RFX1NQRUNJQUwgIT0gMHg0MDAwMDAwMCkKLSAgWW91IGhhdmUganVzdCBicm9rZW4gdGhlIGVuY29kaW5nIGJlbG93LCB3aGljaCBhc3N1bWVzIHRoZSAweDQwIE0gYml0IG1lYW5zCi0gICdJIGFtIG5vdCB0byBiZSAib3B0aW1pc2VkIiB0aGUgd2F5IG5vcm1hbCBicmFuY2hlcyBhcmUnLgotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm90Ci0gIHN5bnRoZXRpY192b3RzdHJzW10gPQotewotICB7Impic2IiLAl7ImItIiwgMHhDMDAwMDAxMH19LAkJLyogQlNEIDQuMiAqLwotLyoganNiIHVzZWQgYWxyZWFkeSAqLwotICB7ImpiciIsCXsiYi0iLCAweEMwMDAwMDExfX0sCQkvKiBCU0QgNC4yICovCi0gIHsianIiLAl7ImItIiwgMHhDMDAwMDAxMX19LAkJLyogY29uc2lzdGVudCAqLwotICB7ImpuZXEiLAl7ImI/IiwgMHg4MDAwMDAxMn19LAotICB7ImpuZXF1IiwJeyJiPyIsIDB4ODAwMDAwMTJ9fSwKLSAgeyJqZXFsIiwJeyJiPyIsIDB4ODAwMDAwMTN9fSwKLSAgeyJqZXFsdSIsCXsiYj8iLCAweDgwMDAwMDEzfX0sCi0gIHsiamd0ciIsCXsiYj8iLCAweDgwMDAwMDE0fX0sCi0gIHsiamxlcSIsCXsiYj8iLCAweDgwMDAwMDE1fX0sCi0vKiB1bi11c2VkIG9wY29kZXMgaGVyZSAqLwotICB7ImpnZXEiLAl7ImI/IiwgMHg4MDAwMDAxOH19LAotICB7Impsc3MiLAl7ImI/IiwgMHg4MDAwMDAxOX19LAotICB7ImpndHJ1IiwJeyJiPyIsIDB4ODAwMDAwMWF9fSwKLSAgeyJqbGVxdSIsCXsiYj8iLCAweDgwMDAwMDFifX0sCi0gIHsianZjIiwJeyJiPyIsIDB4ODAwMDAwMWN9fSwKLSAgeyJqdnMiLAl7ImI/IiwgMHg4MDAwMDAxZH19LAotICB7ImpnZXF1IiwJeyJiPyIsIDB4ODAwMDAwMWV9fSwKLSAgeyJqY2MiLAl7ImI/IiwgMHg4MDAwMDAxZX19LAotICB7Impsc3N1IiwJeyJiPyIsIDB4ODAwMDAwMWZ9fSwKLSAgeyJqY3MiLAl7ImI/IiwgMHg4MDAwMDAxZn19LAotCi0gIHsiamFjYnciLAl7InJ3cndtd2IhIiwgMHhDMDAwMDAzZH19LAotICB7ImphY2JmIiwJeyJyZnJmbWZiISIsIDB4QzAwMDAwNGZ9fSwKLSAgeyJqYWNiZCIsCXsicmRyZG1kYiEiLCAweEMwMDAwMDZmfX0sCi0gIHsiamFjYmIiLAl7InJicmJtYmIhIiwgMHhDMDAwMDA5ZH19LAotICB7ImphY2JsIiwJeyJybHJsbWxiISIsIDB4QzAwMDAwZjF9fSwKLSAgeyJqYWNiZyIsCXsicmdyZ21nYiEiLCAweEMwMDA0ZmZkfX0sCi0gIHsiamFjYmgiLAl7InJocmhtaGIhIiwgMHhDMDAwNmZmZH19LAotCi0gIHsiamJzIiwJeyJybHZiYj8iLCAweDgwMDAwMGUwfX0sCi0gIHsiamJjIiwJeyJybHZiYj8iLCAweDgwMDAwMGUxfX0sCi0gIHsiamJzcyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlMn19LAotICB7ImpiY3MiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTN9fSwKLSAgeyJqYnNjIiwJeyJybHZiYj8iLCAweDgwMDAwMGU0fX0sCi0gIHsiamJjYyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlNX19LAotICB7Impic3NpIiwJeyJybHZiYj8iLCAweDgwMDAwMGU2fX0sCi0gIHsiamJjY2kiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTd9fSwKLSAgeyJqbGJzIiwJeyJybGI/IiwgMHg4MDAwMDBlOH19LAotICB7ImpsYmMiLAl7InJsYj8iLCAweDgwMDAwMGU5fX0sCi0KLSAgeyJqYW9ibHNzIiwJeyJybG1sYjoiLCAweEMwMDAwMGYyfX0sCi0gIHsiamFvYmxlcSIsCXsicmxtbGI6IiwgMHhDMDAwMDBmM319LAotICB7Impzb2JnZXEiLAl7Im1sYjoiLCAweEMwMDAwMGY0fX0sCi0gIHsianNvYmd0ciIsCXsibWxiOiIsIDB4QzAwMDAwZjV9fSwKLQotLyogQ0FTRXggaGFzIG5vIGJyYW5jaCBhZGRyZXNzZXMgaW4gb3VyIGNvbmNlcHRpb24gb2YgaXQuICovCi0vKiBZb3Ugc2hvdWxkIHVzZSAiLndvcmQgLi4uIiBzdGF0ZW1lbnRzIGFmdGVyIHRoZSAiY2FzZSAuLi4iLiAqLwotCi0gIHsiIiwJeyIiLCAwfX0JCQkvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KLQotfTsJCQkJLyogc3ludGhldGljX3ZvdHN0cnMgKi8KLQwKLS8qCi0gKiAgICAgICAgICAgICAgICAgIHYgaSBwIF8gYiBlIGcgaSBuICggKQotICoKLSAqIENhbGwgbWUgb25jZSBiZWZvcmUgeW91IGRlY29kZSBhbnkgbGluZXMuCi0gKiBJIGRlY29kZSB2b3RzdHJzIGludG8gYSBoYXNoIHRhYmxlIGF0IG9wX2hhc2ggKHdoaWNoIEkgY3JlYXRlKS4KLSAqIEkgcmV0dXJuIGFuIGVycm9yIHRleHQgb3IgbnVsbC4KLSAqIElmIHlvdSB3YW50LCBJIHdpbGwgaW5jbHVkZSB0aGUgJ3N5bnRoZXRpYycgalhYWCBpbnN0cnVjdGlvbnMgaW4gdGhlCi0gKiBpbnN0cnVjdGlvbiB0YWJsZS4KLSAqIFlvdSBtdXN0IG5vbWluYXRlIG1ldGFjaGFyYWN0ZXJzIGZvciBlZyBERUMncyAiIyIsICJAIiwgIl4iLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXZpcF9iZWdpbiAoc3ludGhldGljX3RvbywgaW1tZWRpYXRlLCBpbmRpcmVjdCwgZGlzcGxlbikKLSAgICAgaW50IHN5bnRoZXRpY190b287CQkvKiAxIG1lYW5zIGluY2x1ZGUgalhYWCBvcC1jb2Rlcy4gKi8KLSAgICAgY29uc3QgY2hhciAqaW1tZWRpYXRlLCAqaW5kaXJlY3QsICpkaXNwbGVuOwotewotICBjb25zdCBzdHJ1Y3Qgdm90ICp2UDsJCS8qIHNjYW4gdm90c3RycyAqLwotICBjb25zdCBjaGFyICpyZXR2YWwgPSAwOwkvKiBlcnJvciB0ZXh0ICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAodlAgPSB2b3RzdHJzOyAqdlAtPnZvdF9uYW1lICYmICFyZXR2YWw7IHZQKyspCi0gICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIHZQLT52b3RfbmFtZSwgKFBUUikgJnZQLT52b3RfZGV0YWlsKTsKLQotICBpZiAoc3ludGhldGljX3RvbykKLSAgICBmb3IgKHZQID0gc3ludGhldGljX3ZvdHN0cnM7ICp2UC0+dm90X25hbWUgJiYgIXJldHZhbDsgdlArKykKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB2UC0+dm90X25hbWUsIChQVFIpICZ2UC0+dm90X2RldGFpbCk7Ci0KLSNpZm5kZWYgQ09OU1RfVEFCTEUKLSAgdmlwX29wX2RlZmF1bHRzIChpbW1lZGlhdGUsIGluZGlyZWN0LCBkaXNwbGVuKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLQotLyoKLSAqICAgICAgICAgICAgICAgICAgdiBpIHAgKCApCi0gKgotICogVGhpcyBjb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgdmF4IGluc3RydWN0aW9uLgotICogVGhlIHN0cmluZyBtdXN0IGJlIGEgYmFyZSBzaW5nbGUgaW5zdHJ1Y3Rpb24gaW4gZGVjLXZheCAod2l0aCBCU0Q0IGZyb2JzKQotICogZm9ybWF0LgotICogSXQgcHJvdmlkZXMgc29tZSBlcnJvciBtZXNzYWdlczogYXQgbW9zdCBvbmUgZmF0YWwgZXJyb3IgbWVzc2FnZSAod2hpY2gKLSAqIHN0b3BzIHRoZSBzY2FuKSBhbmQgYXQgbW9zdCBvbmUgd2FybmluZyBtZXNzYWdlIGZvciBlYWNoIG9wZXJhbmQuCi0gKiBUaGUgdmF4IGluc3RydWN0aW9uIGlzIHJldHVybmVkIGluIGV4cGxvZGVkIGZvcm0sIHNpbmNlIHdlIGhhdmUgbm8KLSAqIGtub3dsZWRnZSBvZiBob3cgeW91IHBhcnNlIChvciBldmFsdWF0ZSkgeW91ciBleHByZXNzaW9ucy4KLSAqIFdlIGRvIGhvd2V2ZXIgc3RyaXAgb2ZmIGFuZCBkZWNvZGUgYWRkcmVzc2luZyBtb2RlcyBhbmQgb3BlcmF0aW9uCi0gKiBtbmVtb25pYy4KLSAqCi0gKiBUaGUgZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaXMgcmV0dXJuZWQgdG8gYSBzdHJ1Y3Qgdml0IG9mIHlvdXIgY2hvaWNlLgotICogI2luY2x1ZGUgInZheC1pbnN0LmgiIHRvIGtub3cgd2hhdCBhIHN0cnVjdCB2aXQgaXMuCi0gKgotICogVGhpcyBmdW5jdGlvbidzIHZhbHVlIGlzIGEgc3RyaW5nLiBJZiBpdCBpcyBub3QgIiIgdGhlbiBhbiBpbnRlcm5hbAotICogbG9naWMgZXJyb3Igd2FzIGZvdW5kOiByZWFkIHRoaXMgY29kZSB0byBhc3NpZ24gbWVhbmluZyB0byB0aGUgc3RyaW5nLgotICogTm8gYXJndW1lbnQgc3RyaW5nIHNob3VsZCBnZW5lcmF0ZSBzdWNoIGFuIGVycm9yIHN0cmluZzoKLSAqIGl0IG1lYW5zIGEgYnVnIGluIG91ciBjb2RlLCBub3QgaW4gdGhlIHVzZXIncyB0ZXh0LgotICoKLSAqIFlvdSBNVVNUIGhhdmUgY2FsbGVkIHZpcF9iZWdpbigpIG9uY2UgYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCi0gKi8KLQotc3RhdGljIHZvaWQKLXZpcCAodml0UCwgaW5zdHJpbmcpCi0gICAgIHN0cnVjdCB2aXQgKnZpdFA7CQkvKiBXZSBidWlsZCBhbiBleHBsb2RlZCBpbnN0cnVjdGlvbiBoZXJlLiAqLwotICAgICBjaGFyICppbnN0cmluZzsJCS8qIFRleHQgb2YgYSB2YXggaW5zdHJ1Y3Rpb246IHdlIG1vZGlmeS4gKi8KLXsKLSAgLyogSG93IHRvIGJpdC1lbmNvZGUgdGhpcyBvcGNvZGUuICovCi0gIHN0cnVjdCB2b3Rfd290ICp2d1A7Ci0gIC8qIDEvc2tpcCB3aGl0ZXNwYWNlLjIvc2NhbiB2b3RfaG93ICovCi0gIGNoYXIgKnA7Ci0gIGNoYXIgKnE7Ci0gIC8qIGNvdW50cyBudW1iZXIgb2Ygb3BlcmFuZHMgc2VlbiAqLwotICB1bnNpZ25lZCBjaGFyIGNvdW50OwotICAvKiBzY2FuIG9wZXJhbmRzIGluIHN0cnVjdCB2aXQgKi8KLSAgc3RydWN0IHZvcCAqb3BlcmFuZHA7Ci0gIC8qIGVycm9yIG92ZXIgYWxsIG9wZXJhbmRzICovCi0gIGNvbnN0IGNoYXIgKmFsbG9wZXJyOwotICAvKiBSZW1lbWJlciBjaGFyLCAod2UgY2xvYmJlciBpdCB3aXRoICdcMCcgdGVtcG9yYXJpbHkpLiAqLwotICBjaGFyIGM7Ci0gIC8qIE9wLWNvZGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4gKi8KLSAgdmF4X29wY29kZVQgb2M7Ci0KLSAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0gICAgKytpbnN0cmluZzsJCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLSAgZm9yIChwID0gaW5zdHJpbmc7ICpwICYmICpwICE9ICcgJzsgcCsrKTs7CS8qIE1VU1QgZW5kIGluIGVuZC1vZi1zdHJpbmcgb3IgZXhhY3RseSAxIHNwYWNlLiAqLwotICAvKiBTY2FubmVkIHVwIHRvIGVuZCBvZiBvcGVyYXRpb24tY29kZS4gKi8KLSAgLyogT3BlcmF0aW9uLWNvZGUgaXMgZW5kZWQgd2l0aCB3aGl0ZXNwYWNlLiAqLwotICBpZiAocCAtIGluc3RyaW5nID09IDApCi0gICAgewotICAgICAgdml0UC0+dml0X2Vycm9yID0gXygiTm8gb3BlcmF0b3IiKTsKLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIG1lbXNldCAodml0UC0+dml0X29wY29kZSwgJ1wwJywgc2l6ZW9mICh2aXRQLT52aXRfb3Bjb2RlKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgLyoKLSAgICAgICAqIEhlcmUgd2l0aCBpbnN0cmluZyBwb2ludGluZyB0byB3aGF0IGJldHRlciBiZSBhbiBvcC1uYW1lLCBhbmQgcAotICAgICAgICogcG9pbnRpbmcgdG8gY2hhcmFjdGVyIGp1c3QgcGFzdCB0aGF0LgotICAgICAgICogV2UgdHJ1c3QgaW5zdHJpbmcgcG9pbnRzIHRvIGFuIG9wLW5hbWUsIHdpdGggbm8gd2hpdGVzcGFjZS4KLSAgICAgICAqLwotICAgICAgdndQID0gKHN0cnVjdCB2b3Rfd290ICopIGhhc2hfZmluZCAob3BfaGFzaCwgaW5zdHJpbmcpOwotICAgICAgKnAgPSBjOwkJCS8qIFJlc3RvcmUgY2hhciBhZnRlciBvcC1jb2RlLiAqLwotICAgICAgaWYgKHZ3UCA9PSAwKQotCXsKLQkgIHZpdFAtPnZpdF9lcnJvciA9IF8oIlVua25vd24gb3BlcmF0b3IiKTsKLQkgIGNvdW50ID0gMDsKLQkgIG1lbXNldCAodml0UC0+dml0X29wY29kZSwgJ1wwJywgc2l6ZW9mICh2aXRQLT52aXRfb3Bjb2RlKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBXZSBmb3VuZCBhIG1hdGNoISBTbyBsZXRzIHBpY2sgdXAgYXMgbWFueSBvcGVyYW5kcyBhcyB0aGUKLQkgICAqIGluc3RydWN0aW9uIHdhbnRzLCBhbmQgZXZlbiBncmlwZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkuCi0JICAgKiBXZSBleHBlY3QgY29tbWEgdG8gc2VwZXJhdGUgZWFjaCBvcGVyYW5kLgotCSAgICogV2UgbGV0IGluc3RyaW5nIHRyYWNrIHRoZSB0ZXh0LCB3aGlsZSBwIHRyYWNrcyBhIHBhcnQgb2YgdGhlCi0JICAgKiBzdHJ1Y3Qgdm90LgotCSAgICovCi0JICBjb25zdCBjaGFyICpob3dwOwotCSAgLyoKLQkgICAqIFRoZSBsaW5lcyBiZWxvdyBrbm93IGFib3V0IDItYnl0ZSBvcGNvZGVzIHN0YXJ0aW5nIEZELEZFIG9yIEZGLgotCSAgICogVGhleSBhbHNvIHVuZGVyc3RhbmQgc3ludGhldGljIG9wY29kZXMuIE5vdGU6Ci0JICAgKiB3ZSByZXR1cm4gMzIgYml0cyBvZiBvcGNvZGUsIGluY2x1ZGluZyBidWNreSBiaXRzLCBCVVQKLQkgICAqIGFuIG9wY29kZSBsZW5ndGggaXMgZWl0aGVyIDggb3IgMTYgYml0cyBmb3Igdml0X29wY29kZV9uYnl0ZXMuCi0JICAgKi8KLQkgIG9jID0gdndQLT52b3RfY29kZTsJLyogVGhlIG9wLWNvZGUuICovCi0JICB2aXRQLT52aXRfb3Bjb2RlX25ieXRlcyA9IChvYyAmIDB4RkYpID49IDB4RkQgPyAyIDogMTsKLQkgIG1kX251bWJlcl90b19jaGFycyAodml0UC0+dml0X29wY29kZSwgb2MsIDQpOwotCSAgY291bnQgPSAwOwkJLyogbm8gb3BlcmFuZHMgc2VlbiB5ZXQgKi8KLQkgIGluc3RyaW5nID0gcDsJCS8qIHBvaW50IGp1c3QgcGFzdCBvcGVyYXRpb24gY29kZSAqLwotCSAgYWxsb3BlcnIgPSAiIjsKLQkgIGZvciAoaG93cCA9IHZ3UC0+dm90X2hvdywgb3BlcmFuZHAgPSB2aXRQLT52aXRfb3BlcmFuZDsKLQkgICAgICAgIShhbGxvcGVyciAmJiAqYWxsb3BlcnIpICYmICpob3dwOwotCSAgICAgICBvcGVyYW5kcCsrLCBob3dwICs9IDIpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIEhlcmUgdG8gcGFyc2Ugb25lIG9wZXJhbmQuIExlYXZlIGluc3RyaW5nIHBvaW50aW5nIGp1c3QKLQkgICAgICAgKiBwYXN0IGFueSBvbmUgJywnIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGlzIG9wZXJhbmQuCi0JICAgICAgICovCi0JICAgICAgaWYgKCFob3dwWzFdKQotCQlhc19mYXRhbCAoXygib2RkIG51bWJlciBvZiBieXRlcyBpbiBvcGVyYW5kIGRlc2NyaXB0aW9uIikpOwotCSAgICAgIGVsc2UgaWYgKCppbnN0cmluZykKLQkJewotCQkgIGZvciAocSA9IGluc3RyaW5nOyAoYyA9ICpxKSAmJiBjICE9ICcsJzsgcSsrKQotCQkgICAgOwotCQkgIC8qCi0JCSAgICogUSBwb2ludHMgdG8gJywnIG9yICdcMCcgdGhhdCBlbmRzIGFyZ3VtZW50LiBDIGlzIHRoYXQKLQkJICAgKiBjaGFyYWN0ZXIuCi0JCSAgICovCi0JCSAgKnEgPSAwOwotCQkgIG9wZXJhbmRwLT52b3Bfd2lkdGggPSBob3dwWzFdOwotCQkgIG9wZXJhbmRwLT52b3BfbmJ5dGVzID0gdmF4X29wZXJhbmRfd2lkdGhfc2l6ZVsodW5zaWduZWQpIGhvd3BbMV1dOwotCQkgIG9wZXJhbmRwLT52b3BfYWNjZXNzID0gaG93cFswXTsKLQkJICB2aXBfb3AgKGluc3RyaW5nLCBvcGVyYW5kcCk7Ci0JCSAgKnEgPSBjOwkvKiBSZXN0b3JlIGlucHV0IHRleHQuICovCi0JCSAgaWYgKG9wZXJhbmRwLT52b3BfZXJyb3IpCi0JCSAgICBhbGxvcGVyciA9IF8oIkJhZCBvcGVyYW5kIik7Ci0JCSAgaW5zdHJpbmcgPSBxICsgKGMgPyAxIDogMCk7CS8qIG5leHQgb3BlcmFuZCAoaWYgYW55KSAqLwotCQkgIGNvdW50Kys7CS8qICB3b24gYW5vdGhlciBhcmd1bWVudCwgbWF5IGhhdmUgYW4gb3BlcnIgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJYWxsb3BlcnIgPSBfKCJOb3QgZW5vdWdoIG9wZXJhbmRzIik7Ci0JICAgIH0KLQkgIGlmICghKmFsbG9wZXJyKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0JCWluc3RyaW5nKys7CS8qIFNraXAgd2hpdGVzcGFjZS4gKi8KLQkgICAgICBpZiAoKmluc3RyaW5nKQotCQlhbGxvcGVyciA9IF8oIlRvbyBtYW55IG9wZXJhbmRzIik7Ci0JICAgIH0KLQkgIHZpdFAtPnZpdF9lcnJvciA9IGFsbG9wZXJyOwotCX0KLSAgICB9Ci0gIHZpdFAtPnZpdF9vcGVyYW5kcyA9IGNvdW50OwotfQotDAotI2lmZGVmIHRlc3QKLQotLyoKLSAqIFRlc3QgcHJvZ3JhbSBmb3IgYWJvdmUuCi0gKi8KLQotc3RydWN0IHZpdCBteXZpdDsJCS8qIGJ1aWxkIGFuIGV4cGxvZGVkIHZheCBpbnN0cnVjdGlvbiBoZXJlICovCi1jaGFyIGFuc3dlclsxMDBdOwkJLyogaHVtYW4gdHlwZXMgYSBsaW5lIG9mIHZheCBhc3NlbWJsZXIgaGVyZSAqLwotY2hhciAqbXlidWc7CQkJLyogIiIgb3IgYW4gaW50ZXJuYWwgbG9naWMgZGlhZ25vc3RpYyAqLwotaW50IG15Y291bnQ7CQkJLyogbnVtYmVyIG9mIG9wZXJhbmRzICovCi1zdHJ1Y3Qgdm9wICpteXZvcDsJCS8qIHNjYW4gb3BlcmFuZHMgZnJvbSBteXZpdCAqLwotaW50IG15c3ludGg7CQkJLyogMSBtZWFucyB3YW50IHN5bnRoZXRpYyBvcGNvZGVzLiAqLwotY2hhciBteV9pbW1lZGlhdGVbMjAwXTsKLWNoYXIgbXlfaW5kaXJlY3RbMjAwXTsKLWNoYXIgbXlfZGlzcGxlblsyMDBdOwotCi1tYWluICgpCi17Ci0gIGNoYXIgKnA7Ci0KLSAgcHJpbnRmICgiMCBtZWFucyBubyBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLiAgICIpOwotICBwcmludGYgKCJWYWx1ZSBmb3IgdmlwX2JlZ2luPyAgIik7Ci0gIGdldHMgKGFuc3dlcik7Ci0gIHNzY2FuZiAoYW5zd2VyLCAiJWQiLCAmbXlzeW50aCk7Ci0gIHByaW50ZiAoIlN5bnRoZXRpYyBvcGNvZGVzICVzIGJlIGluY2x1ZGVkLlxuIiwgbXlzeW50aCA/ICJ3aWxsIiA6ICJ3aWxsIG5vdCIpOwotICBwcmludGYgKCJlbnRlciBpbW1lZGlhdGUgc3ltYm9scyBlZyBlbnRlciAjICAgIik7Ci0gIGdldHMgKG15X2ltbWVkaWF0ZSk7Ci0gIHByaW50ZiAoImVudGVyIGluZGlyZWN0IHN5bWJvbHMgIGVnIGVudGVyIEAgICAiKTsKLSAgZ2V0cyAobXlfaW5kaXJlY3QpOwotICBwcmludGYgKCJlbnRlciBkaXNwbGVuIHN5bWJvbHMgICBlZyBlbnRlciBeICAgIik7Ci0gIGdldHMgKG15X2Rpc3BsZW4pOwotICBpZiAocCA9IHZpcF9iZWdpbiAobXlzeW50aCwgbXlfaW1tZWRpYXRlLCBteV9pbmRpcmVjdCwgbXlfZGlzcGxlbikpCi0gICAgewotICAgICAgZXJyb3IgKCJ2aXBfYmVnaW49JXMiLCBwKTsKLSAgICB9Ci0gIHByaW50ZiAoIkFuIGVtcHR5IGlucHV0IGxpbmUgd2lsbCBxdWl0IHlvdSBmcm9tIHRoZSB2YXggaW5zdHJ1Y3Rpb24gcGFyc2VyXG4iKTsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwcmludGYgKCJ2YXggaW5zdHJ1Y3Rpb246ICIpOwotICAgICAgZmZsdXNoIChzdGRvdXQpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIGlmICghKmFuc3dlcikKLQl7Ci0JICBicmVhazsJCS8qIG91dCBvZiBmb3IgZWFjaCBpbnB1dCB0ZXh0IGxvb3AgKi8KLQl9Ci0gICAgICB2aXAgKCZteXZpdCwgYW5zd2VyKTsKLSAgICAgIGlmICgqbXl2aXQudml0X2Vycm9yKQotCXsKLQkgIHByaW50ZiAoIkVSUjpcIiVzXCJcbiIsIG15dml0LnZpdF9lcnJvcik7Ci0JfQotICAgICAgcHJpbnRmICgib3Bjb2RlPSIpOwotICAgICAgZm9yIChteWNvdW50ID0gbXl2aXQudml0X29wY29kZV9uYnl0ZXMsIHAgPSBteXZpdC52aXRfb3Bjb2RlOwotCSAgIG15Y291bnQ7Ci0JICAgbXljb3VudC0tLCBwKysKLQkpCi0JewotCSAgcHJpbnRmICgiJTAyeCAiLCAqcCAmIDB4RkYpOwotCX0KLSAgICAgIHByaW50ZiAoIiAgIG9wZXJhbmQgY291bnQ9JWQuXG4iLCBteWNvdW50ID0gbXl2aXQudml0X29wZXJhbmRzKTsKLSAgICAgIGZvciAobXl2b3AgPSBteXZpdC52aXRfb3BlcmFuZDsgbXljb3VudDsgbXljb3VudC0tLCBteXZvcCsrKQotCXsKLQkgIHByaW50ZiAoIm1vZGU9JXh4IHJlZz0leHggbmR4PSV4eCBsZW49JyVjJz0lYyVjJWQuIGV4cHI9XCIiLAotCQkgIG15dm9wLT52b3BfbW9kZSwgbXl2b3AtPnZvcF9yZWcsIG15dm9wLT52b3BfbmR4LAotCQkgIG15dm9wLT52b3Bfc2hvcnQsIG15dm9wLT52b3BfYWNjZXNzLCBteXZvcC0+dm9wX3dpZHRoLAotCQkgIG15dm9wLT52b3BfbmJ5dGVzKTsKLQkgIGZvciAocCA9IG15dm9wLT52b3BfZXhwcl9iZWdpbjsgcCA8PSBteXZvcC0+dm9wX2V4cHJfZW5kOyBwKyspCi0JICAgIHsKLQkgICAgICBwdXRjaGFyICgqcCk7Ci0JICAgIH0KLQkgIHByaW50ZiAoIlwiXG4iKTsKLQkgIGlmIChteXZvcC0+dm9wX2Vycm9yKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiICBlcnI6XCIlc1wiXG4iLCBteXZvcC0+dm9wX2Vycm9yKTsKLQkgICAgfQotCSAgaWYgKG15dm9wLT52b3Bfd2FybikKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAgd3JuOlwiJXNcIlxuIiwgbXl2b3AtPnZvcF93YXJuKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHZpcF9lbmQgKCk7Ci0gIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci19Ci0KLSNlbmRpZiAvKiAjaWZkZWYgdGVzdCAqLwotCi0vKiBlbmQgb2YgdmF4X2luc19wYXJzZS5jICovCi0KLS8qIHZheF9yZWdfcGFyc2UuYyAtIGNvbnZlcnQgYSBWQVggcmVnaXN0ZXIgbmFtZSB0byBhIG51bWJlciAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIEEgcGFydCBvZiBHTlUuICovCi0KLS8qCi0gKiAgICAgICAgICB2IGEgeCBfIHIgZSBnIF8gcCBhIHIgcyBlICggKQotICoKLSAqIFRha2UgMyBjaGFyLnMsIHRoZSBsYXN0IG9mIHdoaWNoIG1heSBiZSBgXDBgIChub24tZXhpc3RlbnQpCi0gKiBhbmQgcmV0dXJuIHRoZSBWQVggcmVnaXN0ZXIgbnVtYmVyIHRoYXQgdGhleSByZXByZXNlbnQuCi0gKgotICogUmV0dXJuIC0xIGlmIHRoZXkgZG9uJ3QgZm9ybSBhIHJlZ2lzdGVyIG5hbWUuIEdvb2QgbmFtZXMgcmV0dXJuCi0gKiBhIG51bWJlciBmcm9tIDA6MTUgaW5jbHVzaXZlLgotICoKLSAqIENhc2UgaXMgbm90IGltcG9ydGFudCBpbiBhIG5hbWUuCi0gKgotICogUmVnaXN0ZXIgbmFtZXMgdW5kZXJzdG9vZCBhcmU6Ci0gKgotICoJUjAKLSAqCVIxCi0gKglSMgotICoJUjMKLSAqCVI0Ci0gKglSNQotICoJUjYKLSAqIAlSNwotICoJUjgKLSAqCVI5Ci0gKglSMTAKLSAqCVIxMQotICoJUjEyCUFQCi0gKglSMTMJRlAKLSAqCVIxNAlTUAotICoJUjE1CVBDCi0gKgotICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBBUCAoMTIpCi0jZGVmaW5lIEZQICgxMykKLSNkZWZpbmUgU1AgKDE0KQotI2RlZmluZSBQQyAoMTUpCi0MCi1pbnQJCQkJLyogcmV0dXJuIC0xIG9yIDA6MTUgKi8KLXZheF9yZWdfcGFyc2UgKGMxLCBjMiwgYzMpCS8qIDMgY2hhcnMgb2YgcmVnaXN0ZXIgbmFtZSAqLwotICAgICBjaGFyIGMxLCBjMiwgYzM7CQkvKiBjMyA9PSAwIGlmIDItY2hhcmFjdGVyIHJlZyBuYW1lICovCi17Ci0gIGludCByZXR2YWw7CQkvKiByZXR1cm4gLTE6MTUgKi8KLQotICByZXR2YWwgPSAtMTsKLQotICBpZiAoaXN1cHBlciAoYzEpKQotICAgIGMxID0gdG9sb3dlciAoYzEpOwotICBpZiAoaXN1cHBlciAoYzIpKQotICAgIGMyID0gdG9sb3dlciAoYzIpOwotICBpZiAoaXNkaWdpdCAoYzIpICYmIGMxID09ICdyJykKLSAgICB7Ci0gICAgICByZXR2YWwgPSBjMiAtICcwJzsKLSAgICAgIGlmIChpc2RpZ2l0IChjMykpCi0JewotCSAgcmV0dmFsID0gcmV0dmFsICogMTAgKyBjMyAtICcwJzsKLQkgIHJldHZhbCA9IChyZXR2YWwgPiAxNSkgPyAtMSA6IHJldHZhbDsKLQkgIC8qIGNsYW1wIHRoZSByZWdpc3RlciB2YWx1ZSB0byAxIGhleCBkaWdpdCAqLwotCX0KLSAgICAgIGVsc2UgaWYgKGMzKQotCXJldHZhbCA9IC0xOwkJLyogYzMgbXVzdCBiZSAnXDAnIG9yIGEgZGlnaXQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKGMzKQkJCS8qIFRoZXJlIGFyZSBubyB0aHJlZSBsZXR0ZXIgcmVncyAqLwotICAgIHJldHZhbCA9IC0xOwotICBlbHNlIGlmIChjMiA9PSAncCcpCi0gICAgewotICAgICAgc3dpdGNoIChjMSkKLQl7Ci0JY2FzZSAncyc6Ci0JICByZXR2YWwgPSBTUDsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgcmV0dmFsID0gRlA7Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIHJldHZhbCA9IEFQOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHZhbCA9IC0xOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGMxID09ICdwJyAmJiBjMiA9PSAnYycpCi0gICAgcmV0dmFsID0gUEM7Ci0gIGVsc2UKLSAgICByZXR2YWwgPSAtMTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi0vKgotICogICAgICAgICAgICAgICB2IGkgcCBfIG8gcCAoICkKLSAqCi0gKiBQYXJzZSBhIHZheCBvcGVyYW5kIGluIERFQyBhc3NlbWJsZXIgbm90YXRpb24uCi0gKiBGb3Igc3BlZWQsIGV4cGVjdCBhIHN0cmluZyBvZiB3aGl0ZXNwYWNlIHRvIGJlIHJlZHVjZWQgdG8gYSBzaW5nbGUgJyAnLgotICogVGhpcyBpcyB0aGUgY2FzZSBmb3IgR05VIEFTLCBhbmQgaXMgZWFzeSBmb3Igb3RoZXIgREVDLWNvbXBhdGlibGUKLSAqIGFzc2VtYmxlcnMuCi0gKgotICogS25vd2xlZGdlIGFib3V0IERFQyBWQVggYXNzZW1ibGVyIG9wZXJhbmQgbm90YXRpb24gbGl2ZXMgaGVyZS4KLSAqIFRoaXMgZG9lc24ndCBldmVuIGtub3cgd2hhdCBhIHJlZ2lzdGVyIG5hbWUgaXMsIGV4Y2VwdCBpdCBiZWxpZXZlcwotICogYWxsIHJlZ2lzdGVyIG5hbWVzIGFyZSAyIG9yIDMgY2hhcmFjdGVycywgYW5kIGxldHMgdmF4X3JlZ19wYXJzZSgpIHNheQotICogd2hhdCBudW1iZXIgZWFjaCBuYW1lIHJlcHJlc2VudHMuCi0gKiBJdCBkb2VzLCBob3dldmVyLCBrbm93IHRoYXQgUEMsIFNQIGV0YyBhcmUgc3BlY2lhbCByZWdpc3RlcnMgc28gaXQgY2FuCi0gKiBkZXRlY3QgYWRkcmVzc2luZyBtb2RlcyB0aGF0IGFyZSBzaWxseSBmb3IgdGhvc2UgcmVnaXN0ZXJzLgotICoKLSAqIFdoZXJlIHBvc3NpYmxlLCBpdCBkZWxpdmVycyAxIGZhdGFsIG9yIDEgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBvcGVyYW5kCi0gKiBpcyBzdXNwZWN0LiBFeGFjdGx5IHdoYXQgd2UgdGVzdCBmb3IgaXMgc3RpbGwgZXZvbHZpbmcuCi0gKi8KLQotLyoKLSAqCQkgICAJQiB1IGcgcwotICoKLSAqCUFyZyBibG9jay4KLSAqCi0gKiBUaGVyZSB3ZXJlIGEgbnVtYmVyIG9mICdtaXNtYXRjaGVkIGFyZ3VtZW50IHR5cGUnIGJ1Z3MgdG8gdmlwX29wLgotICogVGhlIG1vc3QgZ2VuZXJhbCBzb2x1dGlvbiBpcyB0byB0eXBlZGVmIGVhY2ggKG9mIG1hbnkpIGFyZ3VtZW50cy4KLSAqIFdlIHVzZWQgaW5zdGVhZCBhIHR5cGVkZWYnZCBhcmd1bWVudCBibG9jay4gVGhpcyBpcyBsZXNzIG1vZHVsYXIKLSAqIHRoYW4gdXNpbmcgc2VwZXJhdGUgcmV0dXJuIHBvaW50ZXJzIGZvciBlYWNoIHJlc3VsdCwgYnV0IHJ1bnMgZmFzdGVyCi0gKiBvbiBtb3N0IGVuZ2luZXMsIGFuZCBzZWVtcyB0byBrZWVwIHByb2dyYW1tZXJzIGhhcHB5LiBJdCB3aWxsIGhhdmUKLSAqIHRvIGJlIGRvbmUgcHJvcGVybHkgaWYgd2UgZXZlciB3YW50IHRvIHVzZSB2aXBfb3AgYXMgYSBnZW5lcmFsLXB1cnBvc2UKLSAqIG1vZHVsZSAoaXQgd2FzIGRlc2lnbmVkIHRvIGJlKS4KLSAqCi0gKglHXgotICoKLSAqIERvZXNuJ3Qgc3VwcG9ydCBERUMgIkdeIiBmb3JtYXQgb3BlcmFuZHMuIFRoZXNlIGFsd2F5cyB0YWtlIDUgYnl0ZXMKLSAqIHRvIGV4cHJlc3MsIGFuZCBjb2RlIGFzIG1vZGVzIDhGIG9yIDlGLiBSZWFzb246ICJHXiIgZGVwcml2ZXMgeW91IG9mCi0gKiBvcHRpbWlzaW5nIHRvIChzYXkpIGEgIkJeIiBpZiB5b3UgYXJlIGx1Y2t5IGluIHRoZSB3YXkgeW91IGxpbmsuCi0gKiBXaGVuIHNvbWVvbmUgYnVpbGRzIGEgbGlua2VyIHNtYXJ0IGVub3VnaCB0byBjb252ZXJ0ICJHXiIgdG8gIkJeIiwgIldeIgotICogd2hlbmV2ZXIgcG9zc2libGUsIHRoZW4gd2Ugc2hvdWxkIGltcGxlbWVudCBpdC4KLSAqIElmIHRoZXJlIGlzIHNvbWUgb3RoZXIgdXNlIGZvciAiR14iLCBmZWVsIGZyZWUgdG8gY29kZSBpdCBpbiEKLSAqCi0gKgotICoJc3BlZWQKLSAqCi0gKiBJZiBJIG5lc3RlZCBpZigpcyBtb3JlLCBJIGNvdWxkIGF2b2lkIHRlc3RpbmcgKCplcnIpIHdoaWNoIHdvdWxkIHNhdmUKLSAqIHRpbWUsIHNwYWNlIGFuZCBwYWdlIGZhdWx0cy4gSSBkaWRuJ3QgbmVzdCBhbGwgdGhvc2UgaWYoKXMgZm9yIGNsYXJpdHkKLSAqIGFuZCBiZWNhdXNlIEkgdGhpbmsgdGhlIG1vZGUgdGVzdGluZyBjYW4gYmUgcmUtYXJyYW5nZWQgMXN0IHRvIHRlc3QgdGhlCi0gKiBjb21tb25lciBjb25zdHJ1Y3RzIDFzdC4gRG9lcyBhbnlib2R5IGhhdmUgc3RhdGlzdGljcyBvbiB0aGlzPwotICoKLSAqCi0gKgotICoJZXJyb3IgbWVzc2FnZXMKLSAqCi0gKiBJbiBmdXR1cmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvICdjb21wb3NlJyBlcnJvciBtZXNzYWdlcyBpbiBhIHNjcmF0Y2ggYXJlYQotICogYW5kIGdpdmUgdGhlIHVzZXIgTVVDSCBtb3JlIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzLiBBbHRob3VnaCB0aGlzIHRha2VzCi0gKiBhIGxpdHRsZSBtb3JlIGNvZGUgYXQgcnVuLXRpbWUsIGl0IHdpbGwgbWFrZSB0aGlzIG1vZHVsZSBtdWNoIG1vcmUgc2VsZi0KLSAqIGRvY3VtZW50aW5nLiBBcyBhbiBleGFtcGxlIG9mIHdoYXQgc3Vja3Mgbm93OiBtb3N0IGVycm9yIG1lc3NhZ2VzIGhhdmUKLSAqIGhhcmR3aXJlZCBpbnRvIHRoZW0gdGhlIERFQyBWQVggbWV0YWNoYXJhY3RlcnMgIiNeQCIgd2hpY2ggYXJlIG5vdGhpbmcgbGlrZQotICogdGhlIFVuKnggY2hhcmFjdGVycyAiJGAqIiwgdGhhdCBtb3N0IHVzZXJzIHdpbGwgZXhwZWN0IGZyb20gdGhpcyBBUy4KLSAqLwotDAotLyoKLSAqIFRoZSBpbnB1dCBpcyBhIHN0cmluZywgZW5kaW5nIHdpdGggJ1wwJy4KLSAqCi0gKiBXZSBhbHNvIHJlcXVpcmUgYSAnaGludCcgb2Ygd2hhdCBraW5kIG9mIG9wZXJhbmQgaXMgZXhwZWN0ZWQ6IHNvCi0gKiB3ZSBjYW4gcmVtaW5kIGNhbGxlciBub3QgdG8gd3JpdGUgaW50byBsaXRlcmFscyBmb3IgaW5zdGFuY2UuCi0gKgotICogVGhlIG91dHB1dCBpcyBhIHNrZWxldGFsIGluc3RydWN0aW9uLgotICoKLSAqIFRoZSBhbGdvcml0aG0gaGFzIHR3byBwYXJ0cy4KLSAqIDEuIGV4dHJhY3QgdGhlIHN5bnRhY3RpYyBmZWF0dXJlcyAocGFyc2Ugb2ZmIGFsbCB0aGUgQF4jLSgpK1tdIG1vZGUgY3J1ZCk7Ci0gKiAyLiBleHByZXNzIHRoZSBAXiMtKCkrW10gYXMgc29tZSBwYXJhbWV0ZXJzIHN1aXRlZCB0byBmdXJ0aGVyIGFuYWx5c2lzLgotICoKLSAqIDJuZCBzdGVwIGlzIHdoZXJlIHdlIGRldGVjdCB0aGUgZ29vZ2xlcyBvZiBwb3NzaWJsZSBpbnZhbGlkIGNvbWJpbmF0aW9ucwotICogYSBodW1hbiAob3IgY29tcGlsZXIpIG1pZ2h0IHdyaXRlLiBOb3RlIHRoYXQgaWYgd2UgZG8gYSBoYWxmLXdheQotICogZGVjZW50IGFzc2VtYmxlciwgd2UgZG9uJ3Qga25vdyBob3cgbG9uZyB0byBtYWtlIChlZykgZGlzcGxhY2VtZW50Ci0gKiBmaWVsZHMgd2hlbiB3ZSBmaXJzdCBtZWV0IHRoZW0gKGJlY2F1c2UgdGhleSBtYXkgbm90IGhhdmUgZGVmaW5lZCB2YWx1ZXMpLgotICogU28gd2UgbXVzdCB3YWl0IHVudGlsIHdlIGtub3cgaG93IG1hbnkgYml0cyBhcmUgbmVlZGVkIGZvciBlYWNoIGFkZHJlc3MsCi0gKiB0aGVuIHdlIGNhbiBrbm93IGJvdGggbGVuZ3RoIGFuZCBvcGNvZGVzIG9mIGluc3RydWN0aW9ucy4KLSAqIEZvciByZWFzb24ocykgYWJvdmUsIHdlIHdpbGwgcGFzcyB0byBvdXIgY2FsbGVyIGEgJ2Jyb2tlbicgaW5zdHJ1Y3Rpb24KLSAqIG9mIHRoZXNlIG1ham9yIGNvbXBvbmVudHMsIGZyb20gd2hpY2ggb3VyIGNhbGxlciBjYW4gZ2VuZXJhdGUgaW5zdHJ1Y3Rpb25zOgotICogIC0gIGRpc3BsYWNlbWVudCBsZW5ndGggICAgICBJXiBTXiBMXiBCXiBXXiB1bnNwZWNpZmllZAotICogIC0gIG1vZGUgICAgICAgICAgICAgICAgICAgICAobWFueSkKLSAqICAtICByZWdpc3RlciAgICAgICAgICAgICAgICAgUjAtUjE1IG9yIGFic2VudAotICogIC0gIGluZGV4IHJlZ2lzdGVyICAgICAgICAgICBSMC1SMTUgb3IgYWJzZW50Ci0gKiAgLSAgZXhwcmVzc2lvbiB0ZXh0ICAgICAgICAgIHdoYXQgd2UgZG9uJ3QgcGFyc2UKLSAqICAtICBlcnJvciB0ZXh0KHMpICAgICAgICAgICAgd2h5IHdlIGNvdWxkbid0IHVuZGVyc3RhbmQgdGhlIG9wZXJhbmQKLSAqLwotCi0vKgotICogVG8gZGVjb2RlIG91dHB1dCBvZiB0aGlzLCB0ZXN0IGVycnR4dC4gSWYgZXJydHh0WzBdID09ICdcMCcsIHRoZW4KLSAqIHdlIGhhZCBubyBlcnJvcnMgdGhhdCBwcmV2ZW50ZWQgcGFyc2luZy4gQWxzbywgaWYgd2UgZXZlciByZXBvcnQKLSAqIGFuIGludGVybmFsIGJ1ZywgZXJydHh0WzBdIGlzIHNldCBub24temVyby4gU28gb25lIHRlc3QgdGVsbHMgeW91Ci0gKiBpZiB0aGUgb3RoZXIgb3V0cHV0cyBhcmUgdG8gYmUgdGFrZW4gc2VyaW91c2x5LgotICovCi0KLQotLyoKLSAqIEJlY2F1c2UgdGhpcyBtb2R1bGUgaXMgdXNlZnVsIGZvciBib3RoIFZNUyBhbmQgVU4qWCBzdHlsZSBhc3NlbWJsZXJzCi0gKiBhbmQgYmVjYXVzZSBvZiB0aGUgdmFyaWV0eSBvZiBVTipYIGFzc2VtYmxlcnMgd2UgbXVzdCByZWNvZ25pc2UKLSAqIHRoZSBkaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIGFzc2VtYmxlciBvcGVyYW5kIG5vdGF0aW9uLiBGb3IgZXhhbXBsZQotICogVk1TIHNheXMgIiM0MiIgZm9yIGltbWVkaWF0ZSBtb2RlLCB3aGlsZSBtb3N0IFVOKlggc2F5ICIkNDIiLgotICogV2UgcGVybWl0IGFyYml0cmFyeSBzZXRzIG9mIChzaW5nbGUpIGNoYXJhY3RlcnMgdG8gcmVwcmVzZW50IHRoZQotICogMyBjb25jZXB0cyB0aGF0IERFQyB3cml0ZXMgJyMnLCAnQCcsICdeJy4KLSAqLwotCi0vKiBjaGFyYWN0ZXIgdGVzdHMgKi8KLSNkZWZpbmUgVklQX0lNTUVESUFURSAwMQkvKiBDaGFyYWN0ZXIgaXMgbGlrZSBERUMgIyAqLwotI2RlZmluZSBWSVBfSU5ESVJFQ1QgIDAyCS8qIENoYXIgaXMgbGlrZSBERUMgQCAqLwotI2RlZmluZSBWSVBfRElTUExFTiAgIDA0CS8qIENoYXIgaXMgbGlrZSBERUMgXiAqLwotCi0jZGVmaW5lIElNTUVESUFURVAoYykJKHZpcF9tZXRhY2hhcmFjdGVycyBbKGMpJjB4ZmZdJlZJUF9JTU1FRElBVEUpCi0jZGVmaW5lIElORElSRUNUUChjKQkodmlwX21ldGFjaGFyYWN0ZXJzIFsoYykmMHhmZl0mVklQX0lORElSRUNUKQotI2RlZmluZSBESVNQTEVOUChjKQkodmlwX21ldGFjaGFyYWN0ZXJzIFsoYykmMHhmZl0mVklQX0RJU1BMRU4pCi0KLS8qIFdlIGFzc3VtZSA4IGJpdHMgcGVyIGJ5dGUuIFVzZSB2aXBfb3BfZGVmYXVsdHMoKSB0byBzZXQgdGhlc2UgdXAgQkVGT1JFIHdlCi0gKiBhcmUgZXZlciBjYWxsZWQuCi0gKi8KLQotI2lmIGRlZmluZWQoQ09OU1RfVEFCTEUpCi0jZGVmaW5lIF8gMCwKLSNkZWZpbmUgSSBWSVBfSU1NRURJQVRFLAotI2RlZmluZSBTIFZJUF9JTkRJUkVDVCwKLSNkZWZpbmUgRCBWSVBfRElTUExFTiwKLXN0YXRpYyBjb25zdCBjaGFyCi12aXBfbWV0YWNoYXJhY3RlcnNbMjU2XSA9Ci17Ci0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLyogXkAgXkEgXkIgXkMgXkQgXkUgXkYgXkcgXkggXkkgXkogXksgXkwgXk0gXk4gXk8qLwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qIF5QIF5RIF5SIF5TIF5UIF5VIF5WIF5XIF5YIF5ZIF5aIF5bIF5cIF5dIF5eIF5fICovCi0gIF8gXyBfIF8gSSBfIF8gXyBfIF8gUyBfIF8gXyBfIF8JLyogc3AgISAgIiAgIyAgJCAgJSAgJiAnICAoICApICAqICArICAsICAtICAuICAvICovCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLyowICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5ICA6ICA7ICA8ICA9ICA+ICA/Ki8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKkAgIEEgIEIgIEMgIEQgIEUgIEYgIEcgIEggIEkgIEogIEsgIEwgIE0gIE4gIE8qLwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qUCAgUSAgUiAgUyAgVCAgVSAgViAgVyAgWCAgWSAgWiAgWyAgXCAgXSAgXiAgXyovCi0gIEQgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLypgICBhICBiICBjICBkICBlICBmICBnICBoICBpICBqICBrICBsICBtICBuICBvKi8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKnAgIHEgIHIgIHMgIHQgIHUgIHYgIHcgIHggIHkgIHogIHsgIHwgIH0gIH4gIF4/Ki8KLQotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLX07Ci0jdW5kZWYgXwotI3VuZGVmIEkKLSN1bmRlZiBTCi0jdW5kZWYgRAotI2Vsc2UKLXN0YXRpYyBjaGFyIHZpcF9tZXRhY2hhcmFjdGVyc1syNTZdOwotCi1zdGF0aWMgdm9pZAotdmlwX29wXzEgKGJpdCwgc3ltcykKLSAgICAgaW50IGJpdDsKLSAgICAgY29uc3QgY2hhciAqc3ltczsKLXsKLSAgdW5zaWduZWQgY2hhciB0OwotCi0gIHdoaWxlICgodCA9ICpzeW1zKyspICE9IDApCi0gICAgdmlwX21ldGFjaGFyYWN0ZXJzW3RdIHw9IGJpdDsKLX0KLQotLyogQ2FuIGJlIGNhbGxlZCBhbnkgdGltZS4gIE1vcmUgYXJndW1lbnRzIG1heSBhcHBlYXIgaW4gZnV0dXJlLiAgKi8KLXN0YXRpYyB2b2lkIAotdmlwX29wX2RlZmF1bHRzIChpbW1lZGlhdGUsIGluZGlyZWN0LCBkaXNwbGVuKQotICAgICBjb25zdCBjaGFyICppbW1lZGlhdGU7Ci0gICAgIGNvbnN0IGNoYXIgKmluZGlyZWN0OwotICAgICBjb25zdCBjaGFyICpkaXNwbGVuOwotewotICB2aXBfb3BfMSAoVklQX0lNTUVESUFURSwgaW1tZWRpYXRlKTsKLSAgdmlwX29wXzEgKFZJUF9JTkRJUkVDVCwgaW5kaXJlY3QpOwotICB2aXBfb3BfMSAoVklQX0RJU1BMRU4sIGRpc3BsZW4pOwotfQotCi0jZW5kaWYKLQwKLQotLyoKLSAqIERlYyBkZWZpbmVzIHRoZSBzZW1hbnRpY3Mgb2YgYWRkcmVzcyBtb2RlcyAoYW5kIHZhbHVlcykKLSAqIGJ5IGEgdHdvLWxldHRlciBjb2RlLCBleHBsYWluZWQgaGVyZS4KLSAqCi0gKiAgIGxldHRlciAxOiAgIGFjY2VzcyB0eXBlCi0gKgotICogICAgIGEgICAgICAgICBhZGRyZXNzIGNhbGN1bGF0aW9uIC0gbm8gZGF0YSBhY2Nlc3MsIHJlZ2lzdGVycyBmb3JiaWRkZW4KLSAqICAgICBiICAgICAgICAgYnJhbmNoIGRpc3BsYWNlbWVudAotICogICAgIG0gICAgICAgICByZWFkIC0gbGV0IGdvIG9mIGJ1cyAtIHdyaXRlIGJhY2sgICAgIm1vZGlmeSIKLSAqICAgICByICAgICAgICAgcmVhZAotICogICAgIHYgICAgICAgICBiaXQgZmllbGQgYWRkcmVzczogbGlrZSAnYScgYnV0IHJlZ2lzdGVycyBhcmUgT0sKLSAqICAgICB3ICAgICAgICAgd3JpdGUKLSAqICAgICBzcGFjZQkgbm8gb3BlcmF0b3IgKGVnICIubG9uZyBmb28iKSBbb3VyIGNvbnZlbnRpb25dCi0gKgotICogICBsZXR0ZXIgMjogICBkYXRhIHR5cGUgKGkuZS4gd2lkdGgsIGFsaWdubWVudCkKLSAqCi0gKiAgICAgYiAgICAgICAgIGJ5dGUKLSAqICAgICBkICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCAoRCBmb3JtYXQpCi0gKiAgICAgZiAgICAgICAgIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKEYgZm9ybWF0KQotICogICAgIGcgICAgICAgICBHIGZvcm1hdCBmbG9hdGluZwotICogICAgIGggICAgICAgICBIIGZvcm1hdCBmbG9hdGluZwotICogICAgIGwgICAgICAgICBsb25nd29yZAotICogICAgIG8gICAgICAgICBvY3Rhd29yZAotICogICAgIHEgICAgICAgICBxdWFkd29yZAotICogICAgIHcgICAgICAgICB3b3JkCi0gKiAgICAgPwkgc2ltcGxlIHN5bnRoZXRpYyBicmFuY2ggb3BlcmFuZAotICogICAgIC0JIHVuY29uZGl0aW9uYWwgc3ludGhldGljIEpTQi9KU1Igb3BlcmFuZAotICogICAgICEJIGNvbXBsZXggc3ludGhldGljIGJyYW5jaCBvcGVyYW5kCi0gKgotICogVGhlICctPyEnIGxldHRlciAyJ3MgYXJlIG5vdCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24uIFRoZXkgYXJlIHVzZWQKLSAqIGZvciB2YXJpb3VzIGFzc2VtYmxlcnMuIEdlbmVyYWxseSwgYWxsIHVua25vd24gd2lkdGhzIGFyZSBhc3N1bWVkIDAuCi0gKiBXZSBkb24ndCBsaW1pdCB5b3VyIGNob2ljZSBvZiB3aWR0aCBjaGFyYWN0ZXIuCi0gKgotICogREVDIG9wZXJhbmRzIGFyZSBoYXJkIHdvcmsgdG8gcGFyc2UuIEZvciBleGFtcGxlLCAnQCcgYXMgdGhlIGZpcnN0Ci0gKiBjaGFyYWN0ZXIgbWVhbnMgaW5kaXJlY3QgKGRlZmVycmVkKSBtb2RlIGJ1dCBlbHN3aGVyZSBpdCBpcyBhIHNoaWZ0Ci0gKiBvcGVyYXRvci4KLSAqIFRoZSBsb25nLXdpbmRlZCBleHBsYW5hdGlvbiBvZiBob3cgdGhpcyBpcyBzdXBwb3NlZCB0byB3b3JrIGlzCi0gKiBjYW5jZWxsZWQuIFJlYWQgYSBERUMgdmF4IG1hbnVhbC4KLSAqIFdlIHRyeSBoYXJkIG5vdCB0byBwYXJzZSBhbnl0aGluZyB0aGF0IE1JR0hUIGJlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24KLSAqIGJ1cmllZCBpbiB0aGF0IHN5bnRheC4gRm9yIGV4YW1wbGUgaWYgd2Ugc2VlIEAuLi4oUm4pIHdlIGRvbid0IGNoZWNrCi0gKiBmb3IgJy0nIGJlZm9yZSB0aGUgJygnIGJlY2F1c2UgbW9kZSBALShSbikgZG9lcyBub3QgZXhpc3QuCi0gKgotICogQWZ0ZXIgcGFyc2luZyB3ZSBoYXZlOgotICoKLSAqIGF0ICAgICAgICAgICAgICAgICAgICAgMSBpZiBsZWFkaW5nICdAJyAob3IgVW4qeCAnKicpCi0gKiBsZW4gICAgICAgICAgICAgICAgICAgIHRha2VzIG9uZSB2YWx1ZSBmcm9tICIgYmlsc3ciLiBlZyBCXiAtPiAnYicuCi0gKiBoYXNoICAgICAgICAgICAgICAgICAgIDEgaWYgbGVhZGluZyAnIycgKG9yIFVuKnggJyQnKQotICogZXhwcl9iZWdpbiwgZXhwcl9lbmQgICB0aGUgZXhwcmVzc2lvbiB3ZSBkaWQgbm90IHBhcnNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIHdlIGRvbid0IGludGVycHJldCBpdCwgd2UgbWFrZSB1c2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb2YgaXRzIHByZXNlbmNlIG9yIGFic2VuY2UuCi0gKiBzaWduICAgICAgICAgICAgICAgICAgIC0xOiAtKFJuKSAgICAwOiBhYnNlbnQgICAgKzE6IChSbikrCi0gKiBwYXJlbiAgICAgICAgICAgICAgICAgIDEgaWYgKCkgYXJlIGFyb3VuZCByZWdpc3RlcgotICogcmVnICAgICAgICAgICAgICAgICAgICBtYWpvciByZWdpc3RlciBudW1iZXIgMDoxNSAgICAtMSBtZWFucyBhYnNlbnQKLSAqIG5keCAgICAgICAgICAgICAgICAgICAgaW5kZXggcmVnaXN0ZXIgbnVtYmVyIDA6MTUgICAgLTEgbWVhbnMgYWJzZW50Ci0gKgotICogQWdhaW4sIEkgZGFyZSBub3QgZXhwbGFpbiBpdDoganVzdCB0cmFjZSBBTEwgdGhlIGNvZGUhCi0gKi8KLQwKLXN0YXRpYyB2b2lkCi12aXBfb3AgKG9wdGV4dCwgdm9wUCkKLSAgICAgLyogdXNlcidzIGlucHV0IHN0cmluZyBlLmcuOiAiQEJeZm9vQGJhcihBUClbRlBdOiIgKi8KLSAgICAgY2hhciAqb3B0ZXh0OwotICAgICAvKiBJbnB1dCBmaWVsZHM6IHZvcF9hY2Nlc3MsIHZvcF93aWR0aC4KLQlPdXRwdXQgZmllbGRzOiBfbmR4LCBfcmVnLCBfbW9kZSwgX3Nob3J0LCBfd2FybiwKLQlfZXJyb3IgX2V4cHJfYmVnaW4sIF9leHByX2VuZCwgX25ieXRlcy4KLQl2b3BfbmJ5dGVzIDogbnVtYmVyIG9mIGJ5dGVzIGluIGEgZGF0dW0uICovCi0gICAgIHN0cnVjdCB2b3AgKnZvcFA7Ci17Ci0gIC8qIHRyYWNrIG9wZXJhbmQgdGV4dCBmb3J3YXJkICovCi0gIGNoYXIgKnA7Ci0gIC8qIHRyYWNrIG9wZXJhbmQgdGV4dCBiYWNrd2FyZCAqLwotICBjaGFyICpxOwotICAvKiAxIGlmIGxlYWRpbmcgJ0AnICgnKicpIHNlZW4gKi8KLSAgaW50IGF0OwotICAvKiBvbmUgb2YgIiBiaWxzdyIgKi8KLSAgY2hhciBsZW47Ci0gIC8qIDEgaWYgbGVhZGluZyAnIycgKCckJykgc2VlbiAqLwotICBpbnQgaGFzaDsKLSAgLyogLTEsIDAgb3IgKzEgKi8KLSAgaW50IHNpZ24gPSAwOwotICAvKiAxIGlmICgpIHN1cnJvdW5kIHJlZ2lzdGVyICovCi0gIGludCBwYXJlbiA9IDA7Ci0gIC8qIHJlZ2lzdGVyIG51bWJlciwgLTE6YWJzZW50ICovCi0gIGludCByZWcgPSAwOwotICAvKiBpbmRleCByZWdpc3RlciBudW1iZXIgLTE6YWJzZW50ICovCi0gIGludCBuZHggPSAwOwotICAvKiByZXBvcnQgaWxsZWdhbCBvcGVyYW5kLCAiIj09T0sgKi8KLSAgLyogIiAiIGlzIGEgRkFLRSBlcnJvcjogbWVhbnMgd2Ugd29uICovCi0gIC8qIEFOWSBlcnIgdGhhdCBiZWdpbnMgd2l0aCAnICcgaXMgYSBmYWtlLiAqLwotICAvKiAiICIgaXMgY29udmVydGVkIHRvICIiIGJlZm9yZSByZXR1cm4gKi8KLSAgY29uc3QgY2hhciAqZXJyOwotICAvKiB3YXJuIGFib3V0IHdlaXJkIG1vZGVzIHBmIGFkZHJlc3MgKi8KLSAgY29uc3QgY2hhciAqd3JuOwotICAvKiBwcmVzZXJ2ZSBxIGluIGNhc2Ugd2UgYmFja3VwICovCi0gIGNoYXIgKm9sZHEgPSBOVUxMOwotICAvKiBidWlsZCB1cCA0LWJpdCBvcGVyYW5kIG1vZGUgaGVyZSAqLwotICAvKiBub3RlOiBpbmRleCBtb2RlIGlzIGluIG5keCwgdGhpcyBpcyAqLwotICAvKiB0aGUgbWFqb3IgbW9kZSBvZiBvcGVyYW5kIGFkZHJlc3MgKi8KLSAgaW50IG1vZGUgPSAwOwotICAvKgotICAgKiBOb3RpY2UgaG93IHdlIG1vdmUgd3JvbmctYXJnLXR5cGUgYnVncyBJTlNJREUgdGhpcyBtb2R1bGU6IGlmIHdlCi0gICAqIGdldCB0aGUgdHlwZXMgd3JvbmcgYmVsb3csIHdlIGxvc2UgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGF0Ci0gICAqIGxpbnQgb3IgcnVuIHRpbWUuCi0gICAqLwotICBjaGFyIGFjY2Vzc19tb2RlOwkJLyogdm9wX2FjY2Vzcy4gKi8KLSAgY2hhciB3aWR0aDsJCQkvKiB2b3Bfd2lkdGguICovCi0KLSAgYWNjZXNzX21vZGUgPSB2b3BQLT52b3BfYWNjZXNzOwotICB3aWR0aCA9IHZvcFAtPnZvcF93aWR0aDsKLSAgLyogTm9uZSBvZiBvdXIgY29kZSBidWdzICh5ZXQpLCBubyB1c2VyIHRleHQgZXJyb3JzLCBubyB3YXJuaW5ncwotICAgICBldmVuLiAgKi8KLSAgZXJyID0gd3JuID0gMDsKLQotICBwID0gb3B0ZXh0OwotCi0gIGlmICgqcCA9PSAnICcpCQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0gICAgcCsrOwkJCS8qIHNraXAgb3ZlciB3aGl0ZXNwYWNlICovCi0KLSAgaWYgKChhdCA9IElORElSRUNUUCAoKnApKSAhPSAwKQotICAgIHsJCQkJLyogMSBpZiAqcD09J0AnKG9yICcqJyBmb3IgVW4qeCkgKi8KLSAgICAgIHArKzsJCQkvKiBhdCBpcyBkZXRlcm1pbmVkICovCi0gICAgICBpZiAoKnAgPT0gJyAnKQkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLwotCXArKzsJCQkvKiBza2lwIG92ZXIgd2hpdGVzcGFjZSAqLwotICAgIH0KLQotICAvKgotICAgKiBUaGlzIGNvZGUgaXMgc3VidGxlLiBJdCB0cmllcyB0byBkZXRlY3QgYWxsIGxlZ2FsIChsZXR0ZXIpJ14nCi0gICAqIGJ1dCBpdCBkb2Vzbid0IHdhc3RlIHRpbWUgZXhwbGljaXRseSB0ZXN0aW5nIGZvciBwcmVtYXR1cmUgJ1wwJyBiZWNhdXNlCi0gICAqIHRoaXMgY2FzZSBpcyByZWplY3RlZCBhcyBhIG1pc21hdGNoIGFnYWluc3QgZWl0aGVyIChsZXR0ZXIpIG9yICdeJy4KLSAgICovCi0gIHsKLSAgICBjaGFyIGM7Ci0KLSAgICBjID0gKnA7Ci0gICAgaWYgKGlzdXBwZXIgKGMpKQotICAgICAgYyA9IHRvbG93ZXIgKGMpOwotICAgIGlmIChESVNQTEVOUCAocFsxXSkgJiYgc3RyY2hyICgiYmlsd3MiLCBsZW4gPSBjKSkKLSAgICAgIHAgKz0gMjsJCQkvKiBza2lwIChsZXR0ZXIpICdeJyAqLwotICAgIGVsc2UJCQkvKiBubyAobGV0dGVyKSAnXicgc2VlbiAqLwotICAgICAgbGVuID0gJyAnOwkJLyogbGVuIGlzIGRldGVybWluZWQgKi8KLSAgfQotCi0gIGlmICgqcCA9PSAnICcpCQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0gICAgcCsrOwkJCS8qIHNraXAgb3ZlciB3aGl0ZXNwYWNlICovCi0KLSAgaWYgKChoYXNoID0gSU1NRURJQVRFUCAoKnApKSAhPSAwKQkvKiAxIGlmICpwPT0nIycgKCckJyBmb3IgVW4qeCkgKi8KLSAgICBwKys7CQkJLyogaGFzaCBpcyBkZXRlcm1pbmVkICovCi0KLSAgLyoKLSAgICogcCBwb2ludHMgdG8gd2hhdCBtYXkgYmUgdGhlIGJlZ2lubmluZyBvZiBhbiBleHByZXNzaW9uLgotICAgKiBXZSBoYXZlIHBlZWxlZCBvZmYgdGhlIGZyb250IGFsbCB0aGF0IGlzIHBlZWxhYmxlLgotICAgKiBXZSBrbm93IGF0LCBsZW4sIGhhc2guCi0gICAqCi0gICAqIExldHMgcG9pbnQgcSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0IGFuZCBwYXJzZSB0aGF0IChiYWNrd2FyZHMpLgotICAgKi8KLQotICBmb3IgKHEgPSBwOyAqcTsgcSsrKQotICAgIDsKLSAgcS0tOwkJCQkvKiBub3cgcSBwb2ludHMgYXQgbGFzdCBjaGFyIG9mIHRleHQgKi8KLQwKLSAgaWYgKCpxID09ICcgJyAmJiBxID49IHApCS8qIEV4cGVjdCBhbGwgd2hpdGVzcGFjZSByZWR1Y2VkIHRvICcgJy4gKi8KLSAgICBxLS07Ci0gIC8qIHJldmVyc2Ugb3ZlciB3aGl0ZXNwYWNlLCBidXQgZG9uJ3QgKi8KLSAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLwotCi0gIC8qCi0gICAqIEFzIGEgbWF0dGVyIG9mIHBvbGljeSBoZXJlLCB3ZSBsb29rIGZvciBbUm5dLCBhbHRob3VnaCBib3RoIFJuIGFuZCBTXiMKLSAgICogZm9yYmlkIFtSbl0uIFRoaXMgaXMgYmVjYXVzZSBpdCBpcyBlYXN5LCBhbmQgYmVjYXVzZSBvbmx5IGEgc2ljawotICAgKiBjeWJvcmcgd291bGQgaGF2ZSBbLi4uXSB0cmFpbGluZyBhbiBleHByZXNzaW9uIGluIGEgVkFYLWxpa2UgYXNzZW1ibGVyLgotICAgKiBBIG1ldGljdWxvdXMgcGFyc2VyIHdvdWxkIGZpcnN0IGNoZWNrIGZvciBSbiBmb2xsb3dlZCBieSAnKCcgb3IgJ1snCi0gICAqIGFuZCBub3QgcGFyc2UgYSB0cmFpbGluZyAnXScgaWYgaXQgZm91bmQgYW5vdGhlci4gV2UganVzdCBiYW4gZXhwcmVzc2lvbnMKLSAgICogZW5kaW5nIGluICddJy4KLSAgICovCi0gIGlmICgqcSA9PSAnXScpCi0gICAgewotICAgICAgd2hpbGUgKHEgPj0gcCAmJiAqcSAhPSAnWycpCi0JcS0tOwotICAgICAgLyogZWl0aGVyIHE8cCBvciB3ZSBnb3QgbWF0Y2hpbmcgJ1snICovCi0gICAgICBpZiAocSA8IHApCi0JZXJyID0gXygibm8gJ1snIHRvIG1hdGNoICddJyIpOwotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBDb25mdXNlcnMgbGlrZSAiW10iIHdpbGwgZXZlbnR1YWxseSBsb3NlIHdpdGggYSBiYWQgcmVnaXN0ZXIKLQkgICAqIG5hbWUgZXJyb3IuIFNvIGFnYWluIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGVhcmx5ICdcMCcuCi0JICAgKi8KLQkgIGlmIChxWzNdID09ICddJykKLQkgICAgbmR4ID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgMCk7Ci0JICBlbHNlIGlmIChxWzRdID09ICddJykKLQkgICAgbmR4ID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgcVszXSk7Ci0JICBlbHNlCi0JICAgIG5keCA9IC0xOwotCSAgLyoKLQkgICAqIFNpbmNlIHdlIHNhdyBhICddJyB3ZSB3aWxsIGRlbWFuZCBhIHJlZ2lzdGVyIG5hbWUgaW4gdGhlIFtdLgotCSAgICogSWYgbHVzZXIgaGFzbid0IGdpdmVuIHVzIG9uZTogYmUgcnVkZS4KLQkgICAqLwotCSAgaWYgKG5keCA8IDApCi0JICAgIGVyciA9IF8oImJhZCByZWdpc3RlciBpbiBbXSIpOwotCSAgZWxzZSBpZiAobmR4ID09IFBDKQotCSAgICBlcnIgPSBfKCJbUENdIGluZGV4IGJhbm5lZCIpOwotCSAgZWxzZQotCSAgICBxLS07CQkvKiBwb2ludCBxIGp1c3QgYmVmb3JlICJbLi4uXSIgKi8KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgbmR4ID0gLTE7CQkJLyogbm8gJ10nLCBzbyBubyBpTkRlWCByZWdpc3RlciAqLwotCi0gIC8qCi0gICAqIElmIGVyciA9ICIuLi4iIHRoZW4gd2UgbG9zdDogcnVuIGF3YXkuCi0gICAqIE90aGVyd2lzZSBuZHggPT0gLTEgaWYgdGhlcmUgd2FzIG5vICJbLi4uXSIuCi0gICAqIE90aGVyd2lzZSwgbmR4IGlzIGluZGV4IHJlZ2lzdGVyIG51bWJlciwgYW5kIHEgcG9pbnRzIGJlZm9yZSAiWy4uLl0iLgotICAgKi8KLQwKLSAgaWYgKCpxID09ICcgJyAmJiBxID49IHApCS8qIEV4cGVjdCBhbGwgd2hpdGVzcGFjZSByZWR1Y2VkIHRvICcgJy4gKi8KLSAgICBxLS07Ci0gIC8qIHJldmVyc2Ugb3ZlciB3aGl0ZXNwYWNlLCBidXQgZG9uJ3QgKi8KLSAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLwotICBpZiAoIWVyciB8fCAhKmVycikKLSAgICB7Ci0gICAgICBzaWduID0gMDsJCQkvKiBubyAoKSsgb3IgLSgpIHNlZW4geWV0ICovCi0KLSAgICAgIGlmIChxID4gcCArIDMgJiYgKnEgPT0gJysnICYmIHFbLTFdID09ICcpJykKLQl7Ci0JICBzaWduID0gMTsJCS8qIHdlIHNhdyBhICIpKyIgKi8KLQkgIHEtLTsJCQkvKiBxIHBvaW50cyB0byAnKScgKi8KLQl9Ci0KLSAgICAgIGlmICgqcSA9PSAnKScgJiYgcSA+IHAgKyAyKQotCXsKLQkgIHBhcmVuID0gMTsJCS8qIGFzc3VtZSB3ZSBoYXZlICIoLi4uKSIgKi8KLQkgIHdoaWxlIChxID49IHAgJiYgKnEgIT0gJygnKQotCSAgICBxLS07Ci0JICAvKiBlaXRoZXIgcTxwIG9yIHdlIGdvdCBtYXRjaGluZyAnKCcgKi8KLQkgIGlmIChxIDwgcCkKLQkgICAgZXJyID0gXygibm8gJygnIHRvIG1hdGNoICcpJyIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBDb25mdXNlcnMgbGlrZSAiKCkiIHdpbGwgZXZlbnR1YWxseSBsb3NlIHdpdGggYSBiYWQgcmVnaXN0ZXIKLQkgICAgICAgKiBuYW1lIGVycm9yLiBTbyBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBlYXJseSAnXDAnLgotCSAgICAgICAqLwotCSAgICAgIGlmIChxWzNdID09ICcpJykKLQkJcmVnID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgMCk7Ci0JICAgICAgZWxzZSBpZiAocVs0XSA9PSAnKScpCi0JCXJlZyA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIHFbM10pOwotCSAgICAgIGVsc2UKLQkJcmVnID0gLTE7Ci0JICAgICAgLyoKLQkgICAgICAgKiBTaW5jZSB3ZSBzYXcgYSAnKScgd2Ugd2lsbCBkZW1hbmQgYSByZWdpc3RlciBuYW1lIGluIHRoZSAnKScuCi0JICAgICAgICogVGhpcyBpcyBuYXN0eTogd2h5IGNhbid0IG91ciBoeXBvdGhldGljYWwgYXNzZW1ibGVyIHBlcm1pdAotCSAgICAgICAqIHBhcmVudGhlc2lzZWQgZXhwcmVzc2lvbnM/IEJFQ0FVU0UgSSBBTSBMQVpZISBUaGF0IGlzIHdoeS4KLQkgICAgICAgKiBBYnVzZSBsdXNlciBpZiB3ZSBkaWRuJ3Qgc3B5IGEgcmVnaXN0ZXIgbmFtZS4KLQkgICAgICAgKi8KLQkgICAgICBpZiAocmVnIDwgMCkKLQkJewotCQkgIC8qIEpGIGFsbG93IHBhcmVudGhhc2l6ZWQgZXhwcmVzc2lvbnMuICBJIGhvcGUgdGhpcyB3b3JrcyAqLwotCQkgIHBhcmVuID0gMDsKLQkJICB3aGlsZSAoKnEgIT0gJyknKQotCQkgICAgcSsrOwotCQkgIC8qIGVyciA9ICJ1bmtub3duIHJlZ2lzdGVyIGluICgpIjsgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJcS0tOwkJLyogcG9pbnQganVzdCBiZWZvcmUgJygnIG9mICIoLi4uKSIgKi8KLQkgICAgICAvKgotCSAgICAgICAqIElmIGVyciA9PSAiLi4uIiB0aGVuIHdlIGxvc3QuIFJ1biBhd2F5LgotCSAgICAgICAqIE90aGVyd2lzZSBpZiByZWcgPj0gMCB0aGVuIHdlIHNhdyAoUm4pLgotCSAgICAgICAqLwotCSAgICB9Ci0JICAvKgotCSAgICogSWYgZXJyID09ICIuLi4iIHRoZW4gd2UgbG9zdC4KLQkgICAqIE90aGVyd2lzZSBwYXJlbj09MSBhbmQgcmVnID0gcmVnaXN0ZXIgaW4gIigpIi4KLQkgICAqLwotCX0KLSAgICAgIGVsc2UKLQlwYXJlbiA9IDA7Ci0gICAgICAvKgotICAgICAgICogSWYgZXJyID09ICIuLi4iIHRoZW4gd2UgbG9zdC4KLSAgICAgICAqIE90aGVyd2lzZSwgcSBwb2ludHMganVzdCBiZWZvcmUgIihSbikiLCBpZiBhbnkuCi0gICAgICAgKiBJZiB0aGVyZSB3YXMgYSAiKC4uLikiIHRoZW4gcGFyZW49PTEsIGFuZCByZWcgaXMgdGhlIHJlZ2lzdGVyLgotICAgICAgICovCi0MCi0gICAgICAvKgotICAgICAgICogV2Ugc2hvdWxkIG9ubHkgc2VlayAnLScgb2YgIi0oLi4uKSIgaWY6Ci0gICAgICAgKiAgIHdlIHNhdyAiKC4uLikiICAgICAgICAgICAgICAgICAgICBwYXJlbiA9PSAxCi0gICAgICAgKiAgIHdlIGhhdmUgbm8gZXJyb3JzIHNvIGZhciAgICAgICAgICAhICplcnIKLSAgICAgICAqICAgd2UgZGlkIG5vdCBzZWUgJysnIG9mICIoLi4uKSsiICAgIHNpZ24gPCAxCi0gICAgICAgKiBXZSBkb24ndCBjaGVjayBsZW4uIFdlIHdhbnQgYSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIGxhdGVyIGlmCi0gICAgICAgKiB1c2VyIHRyaWVzICJ4Xi4uLi0oUm4pIi4gVGhpcyBpcyBhIGZlYXR1cmUgbm90IGEgYnVnLgotICAgICAgICovCi0gICAgICBpZiAoIWVyciB8fCAhKmVycikKLQl7Ci0JICBpZiAocGFyZW4gJiYgc2lnbiA8IDEpLyogIXNpZ24gaXMgYWRlcXVhdGUgdGVzdCAqLwotCSAgICB7Ci0JICAgICAgaWYgKCpxID09ICctJykKLQkJewotCQkgIHNpZ24gPSAtMTsKLQkJICBxLS07Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqIFdlIGhhdmUgYmFjay10cmFja2VkIG92ZXIgbW9zdAotCSAgICogb2YgdGhlIGNydWQgYXQgdGhlIGVuZCBvZiBhbiBvcGVyYW5kLgotCSAgICogVW5sZXNzIGVyciwgd2Uga25vdzogc2lnbiwgcGFyZW4uIElmIHBhcmVuLCB3ZSBrbm93IHJlZy4KLQkgICAqIFRoZSBsYXN0IGNhc2UgaXMgb2YgYW4gZXhwcmVzc2lvbiAiUm4iLgotCSAgICogVGhpcyBpcyB3b3J0aCBodW50aW5nIGZvciBpZiAhZXJyLCAhcGFyZW4uCi0JICAgKiBXZSB3b3VsZG4ndCBiZSBoZXJlIGlmIGVyci4KLQkgICAqIFdlIHJlbWVtYmVyIHRvIHNhdmUgcSwgaW4gY2FzZSB3ZSBkaWRuJ3Qgd2FudCAiUm4iIGFueXdheS4KLQkgICAqLwotCSAgaWYgKCFwYXJlbikKLQkgICAgewotCSAgICAgIGlmICgqcSA9PSAnICcgJiYgcSA+PSBwKQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0JCXEtLTsKLQkgICAgICAvKiByZXZlcnNlIG92ZXIgd2hpdGVzcGFjZSwgYnV0IGRvbid0ICovCi0JICAgICAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLwotCSAgICAgIGlmIChxID4gcCAmJiBxIDwgcCArIDMpCS8qIHJvb20gZm9yIFJuIG9yIFJubiBleGFjdGx5PyAqLwotCQlyZWcgPSB2YXhfcmVnX3BhcnNlIChwWzBdLCBwWzFdLCBxIDwgcCArIDIgPyAwIDogcFsyXSk7Ci0JICAgICAgZWxzZQotCQlyZWcgPSAtMTsJLyogYWx3YXlzIGNvbWVzIGhlcmUgaWYgbm8gcmVnaXN0ZXIgYXQgYWxsICovCi0JICAgICAgLyoKLQkgICAgICAgKiBIZXJlIHdpdGggYSBkZWZpbml0aXZlIHJlZyB2YWx1ZS4KLQkgICAgICAgKi8KLQkgICAgICBpZiAocmVnID49IDApCi0JCXsKLQkJICBvbGRxID0gcTsKLQkJICBxID0gcCAtIDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qCi0gICAqIGhhdmUgcmVnLiAtMTphYnNlbnQ7IGVsc2UgMDoxNQotICAgKi8KLQotICAvKgotICAgKiBXZSBoYXZlOiAgZXJyLCBhdCwgbGVuLCBoYXNoLCBuZHgsIHNpZ24sIHBhcmVuLCByZWcuCi0gICAqIEFsc28sIGFueSByZW1haW5pbmcgZXhwcmVzc2lvbiBpcyBmcm9tICpwIHRocm91Z2ggKnEgaW5jbHVzaXZlLgotICAgKiBTaG91bGQgdGhlcmUgYmUgbm8gZXhwcmVzc2lvbiwgcT09cC0xLiBTbyBleHByZXNzaW9uIGxlbmd0aCA9IHEtcCsxLgotICAgKiBUaGlzIGNvbXBsZXRlcyB0aGUgZmlyc3QgcGFydDogcGFyc2luZyB0aGUgb3BlcmFuZCB0ZXh0LgotICAgKi8KLQwKLSAgLyoKLSAgICogV2Ugbm93IHdhbnQgdG8gYm9pbCB0aGUgZGF0YSBkb3duLCBjaGVja2luZyBjb25zaXN0ZW5jeSBvbiB0aGUgd2F5LgotICAgKiBXZSB3YW50OiAgbGVuLCBtb2RlLCByZWcsIG5keCwgZXJyLCBwLCBxLCB3cm4sIGJ1Zy4KLSAgICogV2Ugd2lsbCBkZWxpdmVyIGEgNC1iaXQgcmVnLCBhbmQgYSA0LWJpdCBtb2RlLgotICAgKi8KLQotICAvKgotICAgKiBDYXNlIG9mIGJyYW5jaCBvcGVyYW5kLiBEaWZmZXJlbnQuIE5vIExeQl5XXkleU14gYWxsb3dlZCBmb3IgaW5zdGFuY2UuCi0gICAqCi0gICAqIGluOiAgYXQJPwotICAgKiAgICAgIGxlbgk/Ci0gICAqICAgICAgaGFzaAk/Ci0gICAqICAgICAgcDpxCT8KLSAgICogICAgICBzaWduICA/Ci0gICAqICAgICAgcGFyZW4JPwotICAgKiAgICAgIHJlZyAgID8KLSAgICogICAgICBuZHggICA/Ci0gICAqCi0gICAqIG91dDogbW9kZSAgMAotICAgKiAgICAgIHJlZyAgIC0xCi0gICAqICAgICAgbGVuCScgJwotICAgKiAgICAgIHA6cQl3aGF0ZXZlciB3YXMgaW5wdXQKLSAgICogICAgICBuZHgJLTEKLSAgICogICAgICBlcnIJIiAiCQkgb3IgZXJyb3IgbWVzc2FnZSwgYW5kIG90aGVyIG91dHB1dHMgdHJhc2hlZAotICAgKi8KLSAgLyogYnJhbmNoIG9wZXJhbmRzIGhhdmUgcmVzdHJpY3RlZCBmb3JtcyAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmIGFjY2Vzc19tb2RlID09ICdiJykKLSAgICB7Ci0gICAgICBpZiAoYXQgfHwgaGFzaCB8fCBzaWduIHx8IHBhcmVuIHx8IG5keCA+PSAwIHx8IHJlZyA+PSAwIHx8IGxlbiAhPSAnICcpCi0JZXJyID0gXygiaW52YWxpZCBicmFuY2ggb3BlcmFuZCIpOwotICAgICAgZWxzZQotCWVyciA9ICIgIjsKLSAgICB9Ci0MCi0gIC8qIFNpbmNlIG5vYm9keSBzZWVtcyB0byB1c2UgaXQ6IGNvbW1lbnQgdGhpcyAnZmVhdHVyZScoPykgb3V0IGZvciBub3cuICovCi0jaWZkZWYgTkVWRVIKLSAgLyoKLSAgICogQ2FzZSBvZiBzdGFuZC1hbG9uZSBvcGVyYW5kLiBlLmcuICIubG9uZyBmb28iCi0gICAqCi0gICAqIGluOiAgYXQJPwotICAgKiAgICAgIGxlbgk/Ci0gICAqICAgICAgaGFzaAk/Ci0gICAqICAgICAgcDpxCT8KLSAgICogICAgICBzaWduICA/Ci0gICAqICAgICAgcGFyZW4JPwotICAgKiAgICAgIHJlZyAgID8KLSAgICogICAgICBuZHggICA/Ci0gICAqCi0gICAqIG91dDogbW9kZSAgMAotICAgKiAgICAgIHJlZyAgIC0xCi0gICAqICAgICAgbGVuCScgJwotICAgKiAgICAgIHA6cQl3aGF0ZXZlciB3YXMgaW5wdXQKLSAgICogICAgICBuZHgJLTEKLSAgICogICAgICBlcnIJIiAiCQkgb3IgZXJyb3IgbWVzc2FnZSwgYW5kIG90aGVyIG91dHB1dHMgdHJhc2hlZAotICAgKi8KLSAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBhY2Nlc3NfbW9kZSA9PSAnICcpCi0gICAgewotICAgICAgaWYgKGF0KQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIEAiKTsKLSAgICAgIGVsc2UgaWYgKGhhc2gpCi0JZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgIyIpOwotICAgICAgZWxzZSBpZiAoc2lnbikKLQl7Ci0JICBpZiAoc2lnbiA8IDApCi0JICAgIGVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIC0oKSIpOwotCSAgZWxzZQotCSAgICBlcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyAoKSsiKTsKLQl9Ci0gICAgICBlbHNlIGlmIChwYXJlbikKLQllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyAoKSIpOwotICAgICAgZWxzZSBpZiAobmR4ID49IDApCi0JZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgW10iKTsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSAwKQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIHJlZ2lzdGVyIik7Ci0gICAgICBlbHNlIGlmIChsZW4gIT0gJyAnKQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIGRpc3BsYWNlbWVudCBsZW5ndGggc3BlY2lmaWVyIik7Ci0gICAgICBlbHNlCi0JewotCSAgZXJyID0gIiAiOwkvKiBzdWNjZWVkICovCi0JICBtb2RlID0gMDsKLQl9Ci0gICAgfQotI2VuZGlmIC8qI0lmZGVmIE5FVkVSKi8KLQwKLSAgLyoKLSAgICogQ2FzZSBvZiBTXiMuCi0gICAqCi0gICAqIGluOiAgYXQgICAgICAgMAotICAgKiAgICAgIGxlbiAgICAgICdzJyAgICAgICAgICAgICAgIGRlZmluaXRpb24KLSAgICogICAgICBoYXNoICAgICAxICAgICAgICAgICAgICBkZW1hbmQKLSAgICogICAgICBwOnEgICAgICAgICAgICAgICAgICAgICAgICBkZW1hbmQgbm90IGVtcHR5Ci0gICAqICAgICAgc2lnbiAgICAgMCAgICAgICAgICAgICAgICAgYnkgcGFyZW49PTAKLSAgICogICAgICBwYXJlbiAgICAwICAgICAgICAgICAgIGJ5ICIoKSIgc2NhbiBsb2dpYyBiZWNhdXNlICJTXiIgc2VlbgotICAgKiAgICAgIHJlZyAgICAgIC0xICAgICAgICAgICAgICAgIG9yIG5uIGJ5IG1pc3Rha2UKLSAgICogICAgICBuZHggICAgICAtMQotICAgKgotICAgKiBvdXQ6IG1vZGUgICAgIDAKLSAgICogICAgICByZWcgICAgICAtMQotICAgKiAgICAgIGxlbiAgICAgICdzJwotICAgKiAgICAgIGV4cAotICAgKiAgICAgIG5keCAgICAgIC0xCi0gICAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmIGxlbiA9PSAncycpCi0gICAgewotICAgICAgaWYgKCFoYXNoIHx8IHBhcmVuIHx8IGF0IHx8IG5keCA+PSAwKQotCWVyciA9IF8oImludmFsaWQgb3BlcmFuZCBvZiBTXiMiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVnID49IDApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFNISVQhIHdlIHNhdyBTXiNSbm4gISBwdXQgdGhlIFJubiBiYWNrIGluCi0JICAgICAgICogZXhwcmVzc2lvbi4gS0xVREdFISBVc2Ugb2xkcSBzbyB3ZSBkb24ndAotCSAgICAgICAqIG5lZWQgdG8ga25vdyBleGFjdCBsZW5ndGggb2YgcmVnIG5hbWUuCi0JICAgICAgICovCi0JICAgICAgcSA9IG9sZHE7Ci0JICAgICAgcmVnID0gMDsKLQkgICAgfQotCSAgLyoKLQkgICAqIFdlIGhhdmUgYWxsIHRoZSBleHByZXNzaW9uIHdlIHdpbGwgZXZlciBnZXQuCi0JICAgKi8KLQkgIGlmIChwID4gcSkKLQkgICAgZXJyID0gXygiU14jIG5lZWRzIGV4cHJlc3Npb24iKTsKLQkgIGVsc2UgaWYgKGFjY2Vzc19tb2RlID09ICdyJykKLQkgICAgewotCSAgICAgIGVyciA9ICIgIjsJLyogV0lOISAqLwotCSAgICAgIG1vZGUgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGVyciA9IF8oIlNeIyBtYXkgb25seSByZWFkLWFjY2VzcyIpOwotCX0KLSAgICB9Ci0MCi0gIC8qCi0gICAqIENhc2Ugb2YgLShSbiksIHdoaWNoIGlzIHdlaXJkIGNhc2UuCi0gICAqCi0gICAqIGluOiAgYXQgICAgICAgMAotICAgKiAgICAgIGxlbiAgICAgICcKLSAgICogICAgICBoYXNoICAgICAwCi0gICAqICAgICAgcDpxICAgICAgcTxwCi0gICAqICAgICAgc2lnbiAgICAgLTEgICAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIHBhcmVuICAgIDEgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICByZWcgICAgICBwcmVzZW50ICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKLSAgICoKLSAgICogb3V0OiBtb2RlICAgICA3Ci0gICAqICAgICAgcmVnICAgICAgcHJlc2VudAotICAgKiAgICAgIGxlbiAgICAgICcgJwotICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgc2lnbiA8IDApCi0gICAgewotICAgICAgaWYgKGxlbiAhPSAnICcgfHwgaGFzaCB8fCBhdCB8fCBwIDw9IHEpCi0JZXJyID0gXygiaW52YWxpZCBvcGVyYW5kIG9mIC0oKSIpOwotICAgICAgZWxzZQotCXsKLQkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLwotCSAgbW9kZSA9IDc7Ci0JICBpZiAocmVnID09IFBDKQotCSAgICB3cm4gPSBfKCItKFBDKSB1bnByZWRpY3RhYmxlIik7Ci0JICBlbHNlIGlmIChyZWcgPT0gbmR4KQotCSAgICB3cm4gPSBfKCJbXWluZGV4IHNhbWUgYXMgLSgpcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiKTsKLQl9Ci0gICAgfQotDAotICAvKgotICAgKiBXZSBjb252ZXJ0ICIoUm4pIiB0byAiQFJuIiBmb3Igb3VyIGNvbnZlbmllbmNlLgotICAgKiAoSSBob3BlIHRoaXMgaXMgY29udmVuaWVudDogaGFzIHNvbWVvbmUgZ290IGEgYmV0dGVyIHdheSB0byBwYXJzZSB0aGlzPykKLSAgICogQSBzaWRlLWVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgIkBSbiIgaXMgYSB2YWxpZCBvcGVyYW5kLgotICAgKi8KLSAgaWYgKHBhcmVuICYmICFzaWduICYmICFoYXNoICYmICFhdCAmJiBsZW4gPT0gJyAnICYmIHAgPiBxKQotICAgIHsKLSAgICAgIGF0ID0gMTsKLSAgICAgIHBhcmVuID0gMDsKLSAgICB9Ci0KLSAgLyoKLSAgICogQ2FzZSBvZiAoUm4pKywgd2hpY2ggaXMgc2xpZ2h0bHkgZGlmZmVyZW50LgotICAgKgotICAgKiBpbjogIGF0Ci0gICAqICAgICAgbGVuICAgICAgJyAnCi0gICAqICAgICAgaGFzaCAgICAgMAotICAgKiAgICAgIHA6cSAgICAgIHE8cAotICAgKiAgICAgIHNpZ24gICAgICsxICAgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBwYXJlbiAgICAxICAgICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgcmVnICAgICAgcHJlc2VudCAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCi0gICAqCi0gICAqIG91dDogbW9kZSAgICAgOCtACi0gICAqICAgICAgcmVnICAgICAgcHJlc2VudAotICAgKiAgICAgIGxlbiAgICAgICcgJwotICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgc2lnbiA+IDApCi0gICAgewotICAgICAgaWYgKGxlbiAhPSAnICcgfHwgaGFzaCB8fCBwIDw9IHEpCi0JZXJyID0gXygiaW52YWxpZCBvcGVyYW5kIG9mICgpKyIpOwotICAgICAgZWxzZQotCXsKLQkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLwotCSAgbW9kZSA9IDggKyAoYXQgPyAxIDogMCk7Ci0JICBpZiAocmVnID09IFBDKQotCSAgICB3cm4gPSBfKCIoUEMpKyB1bnByZWRpY3RhYmxlIik7Ci0JICBlbHNlIGlmIChyZWcgPT0gbmR4KQotCSAgICB3cm4gPSBfKCJbXWluZGV4IHNhbWUgYXMgKCkrcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiKTsKLQl9Ci0gICAgfQotDAotICAvKgotICAgKiBDYXNlIG9mICMsIHdpdGhvdXQgU14uCi0gICAqCi0gICAqIGluOiAgYXQKLSAgICogICAgICBsZW4gICAgICAnICcgb3IgJ2knCi0gICAqICAgICAgaGFzaCAgICAgMSAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIHA6cQotICAgKiAgICAgIHNpZ24gICAgIDAKLSAgICogICAgICBwYXJlbiAgICAwCi0gICAqICAgICAgcmVnICAgICAgYWJzZW50Ci0gICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKLSAgICoKLSAgICogb3V0OiBtb2RlICAgICA4K0AKLSAgICogICAgICByZWcgICAgICBQQwotICAgKiAgICAgIGxlbiAgICAgICcgJyBvciAnaScKLSAgICogICAgICBleHAKLSAgICogICAgICBuZHggICAgICBvcHRpb25hbAotICAgKi8KLSAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBoYXNoKQotICAgIHsKLSAgICAgIGlmIChsZW4gIT0gJ2knICYmIGxlbiAhPSAnICcpCi0JZXJyID0gXygiIyBjb25mbGljdHMgbGVuZ3RoIik7Ci0gICAgICBlbHNlIGlmIChwYXJlbikKLQllcnIgPSBfKCIjIGJhcnMgcmVnaXN0ZXIiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVnID49IDApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFNISVQhIHdlIHNhdyAjUm5uISBQdXQgdGhlIFJubiBiYWNrIGludG8gdGhlIGV4cHJlc3Npb24uCi0JICAgICAgICogQnkgdXNpbmcgb2xkcSwgd2UgZG9uJ3QgbmVlZCB0byBrbm93IGhvdyBsb25nIFJubiB3YXMuCi0JICAgICAgICogS0xVREdFIQotCSAgICAgICAqLwotCSAgICAgIHEgPSBvbGRxOwotCSAgICAgIHJlZyA9IC0xOwkJLyogbm8gcmVnaXN0ZXIgYW55IG1vcmUgKi8KLQkgICAgfQotCSAgZXJyID0gIiAiOwkJLyogd2luICovCi0KLQkgIC8qIEpGIGEgYnVnZml4LCBJIHRoaW5rISAqLwotCSAgaWYgKGF0ICYmIGFjY2Vzc19tb2RlID09ICdhJykKLQkgICAgdm9wUC0+dm9wX25ieXRlcyA9IDQ7Ci0KLQkgIG1vZGUgPSAoYXQgPyA5IDogOCk7Ci0JICByZWcgPSBQQzsKLQkgIGlmICgoYWNjZXNzX21vZGUgPT0gJ20nIHx8IGFjY2Vzc19tb2RlID09ICd3JykgJiYgIWF0KQotCSAgICB3cm4gPSBfKCJ3cml0aW5nIG9yIG1vZGlmeWluZyAjIGlzIHVucHJlZGljdGFibGUiKTsKLQl9Ci0gICAgfQotICAvKgotICAgKiBJZiAhKmVyciwgdGhlbiAgICAgICAgc2lnbiA9PSAwCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBoYXNoID09IDAKLSAgICovCi0MCi0gIC8qCi0gICAqIENhc2Ugb2YgUm4uIFdlIHNlcGVyYXRlIHRoaXMgb25lIGJlY2F1c2UgaXQgaGFzIGEgZmV3IHNwZWNpYWwKLSAgICogZXJyb3JzIHRoZSByZW1haW5pbmcgbW9kZXMgbGFjay4KLSAgICoKLSAgICogaW46ICBhdCAgICAgICBvcHRpb25hbAotICAgKiAgICAgIGxlbiAgICAgICcgJwotICAgKiAgICAgIGhhc2ggICAgIDAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYwotICAgKiAgICAgIHA6cSAgICAgIGVtcHR5Ci0gICAqICAgICAgc2lnbiAgICAgMCAgICAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYwotICAgKiAgICAgIHBhcmVuICAgIDAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbAotICAgKgotICAgKiBvdXQ6IG1vZGUgICAgIDUrQAotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQKLSAgICogICAgICBsZW4gICAgICAnICcgICAgICAgICAgICAgICBlbmZvcmNlIG5vIGxlbmd0aAotICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgIXBhcmVuICYmIHJlZyA+PSAwKQotICAgIHsKLSAgICAgIGlmIChsZW4gIT0gJyAnKQotCWVyciA9IF8oImxlbmd0aCBub3QgbmVlZGVkIik7Ci0gICAgICBlbHNlIGlmIChhdCkKLQl7Ci0JICBlcnIgPSAiICI7CQkvKiB3aW4gKi8KLQkgIG1vZGUgPSA2OwkJLyogQFJuICovCi0JfQotICAgICAgZWxzZSBpZiAobmR4ID49IDApCi0JZXJyID0gXygiY2FuJ3QgW11pbmRleCBhIHJlZ2lzdGVyLCBiZWNhdXNlIGl0IGhhcyBubyBhZGRyZXNzIik7Ci0gICAgICBlbHNlIGlmIChhY2Nlc3NfbW9kZSA9PSAnYScpCi0JZXJyID0gXygiYSByZWdpc3RlciBoYXMgbm8gYWRkcmVzcyIpOwotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBJZGVhIGhlcmUgaXMgdG8gZGV0ZWN0IGZyb20gbGVuZ3RoIG9mIGRhdHVtCi0JICAgKiBhbmQgZnJvbSByZWdpc3RlciBudW1iZXIgaWYgd2Ugd2lsbCB0b3VjaCBQQy4KLQkgICAqIFdhcm4gaWYgd2UgZG8uCi0JICAgKiB2b3BfbmJ5dGVzIGlzIG51bWJlciBvZiBieXRlcyBpbiBvcGVyYW5kLgotCSAgICogQ29tcHV0ZSBoaWdoZXN0IGJ5dGUgYWZmZWN0ZWQsIGNvbXBhcmUgdG8gUEMwLgotCSAgICovCi0JICBpZiAoKHZvcFAtPnZvcF9uYnl0ZXMgKyByZWcgKiA0KSA+IDYwKQotCSAgICB3cm4gPSBfKCJQQyBwYXJ0IG9mIG9wZXJhbmQgdW5wcmVkaWN0YWJsZSIpOwotCSAgZXJyID0gIiAiOwkJLyogd2luICovCi0JICBtb2RlID0gNTsJCS8qIFJuICovCi0JfQotICAgIH0KLSAgLyoKLSAgICogSWYgISplcnIsICAgICAgICBzaWduICA9PSAwCi0gICAqICAgICAgICAgICAgICAgICAgaGFzaCAgPT0gMAotICAgKiAgICAgICAgICAgICAgICAgIHBhcmVuID09IDEgIE9SIHJlZz09LTEKLSAgICovCi0MCi0gIC8qCi0gICAqIFJlc3Qgb2YgY2FzZXMgZml0IGludG8gb25lIGJ1bmNoLgotICAgKgotICAgKiBpbjogIGF0ICAgICAgIG9wdGlvbmFsCi0gICAqICAgICAgbGVuICAgICAgJyAnIG9yICdiJyBvciAndycgb3IgJ2wnCi0gICAqICAgICAgaGFzaCAgICAgMCAgICAgICAgICAgICBieSBwcm9ncmFtIGxvZ2ljCi0gICAqICAgICAgcDpxICAgICAgZXhwZWN0ZWQgICAgICAgICAgKGVtcHR5IGlzIG5vdCBhbiBlcnJvcikKLSAgICogICAgICBzaWduICAgICAwICAgICAgICAgICAgICAgICBieSBwcm9ncmFtIGxvZ2ljCi0gICAqICAgICAgcGFyZW4gICAgb3B0aW9uYWwKLSAgICogICAgICByZWcgICAgICBvcHRpb25hbAotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCi0gICAqCi0gICAqIG91dDogbW9kZSAgICAgMTAgKyBAICsgbGVuCi0gICAqICAgICAgcmVnICAgICAgb3B0aW9uYWwKLSAgICogICAgICBsZW4gICAgICAnICcgb3IgJ2InIG9yICd3JyBvciAnbCcKLSAgICogICAgICBleHAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSBlbXB0eQotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKLSAgICovCi0gIGlmICghZXJyIHx8ICEqZXJyKQotICAgIHsKLSAgICAgIGVyciA9ICIgIjsJCS8qIHdpbiAoYWx3YXlzKSAqLwotICAgICAgbW9kZSA9IDEwICsgKGF0ID8gMSA6IDApOwotICAgICAgc3dpdGNoIChsZW4pCi0JewotCWNhc2UgJ2wnOgotCSAgbW9kZSArPSAyOwotCWNhc2UgJ3cnOgotCSAgbW9kZSArPSAyOwotCWNhc2UgJyAnOgkJLyogYXNzdW1lZCBCXiB1bnRpbCBvdXIgY2FsbGVyIGNoYW5nZXMgaXQgKi8KLQljYXNlICdiJzoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogaGVyZSB3aXRoIGNvbXBsZXRlbHkgc3BlY2lmaWVkICAgICBtb2RlCi0gICAqCQkJCQlsZW4KLSAgICoJCQkJCXJlZwotICAgKgkJCQkJZXhwcmVzc2lvbiAgIHAscQotICAgKgkJCQkJbmR4Ci0gICAqLwotCi0gIGlmICgqZXJyID09ICcgJykKLSAgICBlcnIgPSAwOwkJCS8qICIgIiBpcyBubyBsb25nZXIgYW4gZXJyb3IgKi8KLQotICB2b3BQLT52b3BfbW9kZSA9IG1vZGU7Ci0gIHZvcFAtPnZvcF9yZWcgPSByZWc7Ci0gIHZvcFAtPnZvcF9zaG9ydCA9IGxlbjsKLSAgdm9wUC0+dm9wX2V4cHJfYmVnaW4gPSBwOwotICB2b3BQLT52b3BfZXhwcl9lbmQgPSBxOwotICB2b3BQLT52b3BfbmR4ID0gbmR4OwotICB2b3BQLT52b3BfZXJyb3IgPSBlcnI7Ci0gIHZvcFAtPnZvcF93YXJuID0gd3JuOwotfQotDAotLyoKLQotICBTdW1tYXJ5IG9mIHZpcF9vcCBvdXRwdXRzLgotCi0gIG1vZGUJcmVnCWxlbgluZHgKLSAgKFJuKSA9PiBAUm4KLSAge0B9Um4JCQk1K0AJbgknICcJb3B0aW9uYWwKLSAgYnJhbmNoIG9wZXJhbmQJCTAJLTEJJyAnCS0xCi0gIFNeI2ZvbwkJCTAJLTEJJ3MnCS0xCi0gIC0oUm4pCQkJNwluCScgJwlvcHRpb25hbAotICB7QH0oUm4pKwkJOCtACW4JJyAnCW9wdGlvbmFsCi0gIHtAfSNmb28sIG5vIFNeCQk4K0AJUEMJIiBpIglvcHRpb25hbAotICB7QH17cV59eyhSbil9CQkxMCtAK3EJb3B0aW9uCSIgYndsIglvcHRpb25hbAotCi0gICovCi0MCi0jaWZkZWYgVEVTVAkJCS8qICNEZWZpbmUgdG8gdXNlIHRoaXMgdGVzdGJlZC4gKi8KLQotLyoKLSAqIEZvbGxvd3MgYSB0ZXN0IHByb2dyYW0gZm9yIHRoaXMgZnVuY3Rpb24uCi0gKiBXZSBkZWNsYXJlIGFycmF5cyBub24tbG9jYWwgaW4gY2FzZSBzb21lIG9mIG91ciB0aW55LW1pbmRlZCBtYWNoaW5lcwotICogZGVmYXVsdCB0byBzbWFsbCBzdGFja3MuIEFsc28sIGhlbHBzIHdpdGggc29tZSBkZWJ1Z2dlcnMuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWNoYXIgYW5zd2VyWzEwMF07CQkvKiBodW1hbiB0eXBlcyBpbnRvIGhlcmUgKi8KLWNoYXIgKnA7CQkJLyogICovCi1jaGFyICpteWVycjsKLWNoYXIgKm15d3JuOwotY2hhciAqbXlidWc7Ci1jaGFyIG15YWNjZXNzOwotY2hhciBteXdpZHRoOwotY2hhciBteW1vZGU7Ci1jaGFyIG15cmVnOwotY2hhciBteWxlbjsKLWNoYXIgKm15bGVmdDsKLWNoYXIgKm15cmlnaHQ7Ci1jaGFyIG15bmR4OwotaW50IG15X29wZXJhbmRfbGVuZ3RoOwotY2hhciBteV9pbW1lZGlhdGVbMjAwXTsKLWNoYXIgbXlfaW5kaXJlY3RbMjAwXTsKLWNoYXIgbXlfZGlzcGxlblsyMDBdOwotCi1tYWluICgpCi17Ci0gIHByaW50ZiAoImVudGVyIGltbWVkaWF0ZSBzeW1ib2xzIGVnIGVudGVyICMgICAiKTsKLSAgZ2V0cyAobXlfaW1tZWRpYXRlKTsKLSAgcHJpbnRmICgiZW50ZXIgaW5kaXJlY3Qgc3ltYm9scyAgZWcgZW50ZXIgQCAgICIpOwotICBnZXRzIChteV9pbmRpcmVjdCk7Ci0gIHByaW50ZiAoImVudGVyIGRpc3BsZW4gc3ltYm9scyAgIGVnIGVudGVyIF4gICAiKTsKLSAgZ2V0cyAobXlfZGlzcGxlbik7Ci0gIHZpcF9vcF9kZWZhdWx0cyAobXlfaW1tZWRpYXRlLCBteV9pbmRpcmVjdCwgbXlfZGlzcGxlbik7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgcHJpbnRmICgiYWNjZXNzLHdpZHRoIChlZyAnYWInIG9yICd3aCcpIFtlbXB0eSBsaW5lIHRvIHF1aXRdIDogICIpOwotICAgICAgZmZsdXNoIChzdGRvdXQpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIGlmICghYW5zd2VyWzBdKQotCWV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0gICAgICBteWFjY2VzcyA9IGFuc3dlclswXTsKLSAgICAgIG15d2lkdGggPSBhbnN3ZXJbMV07Ci0gICAgICBzd2l0Y2ggKG15d2lkdGgpCi0JewotCWNhc2UgJ2InOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDg7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gNDsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAxNjsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAzMjsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSA0OwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDE2OwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDg7Ci0JICBicmVhazsKLQljYXNlICd3JzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMjsKLQkgIGJyZWFrOwotCWNhc2UgJyEnOgotCWNhc2UgJz8nOgotCWNhc2UgJy0nOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAwOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAyOwotCSAgcHJpbnRmICgiSSBkbid0IHVuZGVyc3RhbmQgYWNjZXNzIHdpZHRoICVjXG4iLCBteXdpZHRoKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIlZBWCBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gb3BlcmFuZDogIik7Ci0gICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gICAgICBnZXRzIChhbnN3ZXIpOwotICAgICAgbXlidWcgPSB2aXBfb3AgKGFuc3dlciwgbXlhY2Nlc3MsIG15d2lkdGgsIG15X29wZXJhbmRfbGVuZ3RoLAotCQkgICAgICAmbXltb2RlLCAmbXlyZWcsICZteWxlbiwgJm15bGVmdCwgJm15cmlnaHQsICZteW5keCwKLQkJICAgICAgJm15ZXJyLCAmbXl3cm4pOwotICAgICAgaWYgKCpteWVycikKLQl7Ci0JICBwcmludGYgKCJlcnJvcjogXCIlc1wiXG4iLCBteWVycik7Ci0JICBpZiAoKm15YnVnKQotCSAgICBwcmludGYgKCIgYnVnOiBcIiVzXCJcbiIsIG15YnVnKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCpteXdybikKLQkgICAgcHJpbnRmICgid2FybmluZzogXCIlc1wiXG4iLCBteXdybik7Ci0JICBtdW1ibGUgKCJtb2RlIiwgbXltb2RlKTsKLQkgIG11bWJsZSAoInJlZ2lzdGVyIiwgbXlyZWcpOwotCSAgbXVtYmxlICgiaW5kZXgiLCBteW5keCk7Ci0JICBwcmludGYgKCJ3aWR0aDonJWMnICAiLCBteWxlbik7Ci0JICBwcmludGYgKCJleHByZXNzaW9uOiBcIiIpOwotCSAgd2hpbGUgKG15bGVmdCA8PSBteXJpZ2h0KQotCSAgICBwdXRjaGFyICgqbXlsZWZ0KyspOwotCSAgcHJpbnRmICgiXCJcbiIpOwotCX0KLSAgICB9Ci19Ci0KLW11bWJsZSAodGV4dCwgdmFsdWUpCi0gICAgIGNoYXIgKnRleHQ7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgcHJpbnRmICgiJXM6IiwgdGV4dCk7Ci0gIGlmICh2YWx1ZSA+PSAwKQotICAgIHByaW50ZiAoIiV4eCIsIHZhbHVlKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIkFCU0VOVCIpOwotICBwcmludGYgKCIgICIpOwotfQotCi0jZW5kaWYgLyogaWZkZWYgVEVTVCAqLwotCi0vKiBlbmQ6IHZpcF9vcC5jICovCi0KLWNvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOwotY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplID0gNjsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgLyogVGhpcyBmb3JtZXIgY2FsY3VsYXRpb24gd2FzIG9mZiBieSB0d286Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDEpOwotICAgICBXZSBuZWVkIHRvIGFjY291bnQgZm9yIHRoZSBvbmUgYnl0ZSBpbnN0cnVjdGlvbiBhbmQgYWxzbyBpdHMKLSAgICAgdHdvIGJ5dGUgb3BlcmFuZC4gICovCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMSArIDIpOwotICAqcHRyKysgPSBWQVhfQlJXOwkJLyogYnJhbmNoIHdpdGggd29yZCAoMTYgYml0KSBvZmZzZXQgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgMik7Ci19Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKLSAgKnB0cisrID0gVkFYX0pNUDsJCS8qIGFyYml0cmFyeSBqdW1wICovCi0gICpwdHIrKyA9IFZBWF9BQlNPTFVURV9NT0RFOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCA0KTsKLSAgZml4X25ldyAoZnJhZywgcHRyIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwgdG9fc3ltYm9sLCAobG9uZykgMCwgMCwgTk9fUkVMT0MpOwotfQotDAotI2lmZGVmIE9CSl9WTVMKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJkOlNUdDpWKzFoOkh2OjoiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJkOlNUdDpWIjsKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ1MnOgotICAgICAgYXNfd2FybiAoXygiU1lNQk9MIFRBQkxFIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICBhc193YXJuIChfKCJUT0tFTiBUUkFDRSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgYXNfd2FybiAoXygiRGlzcGxhY2VtZW50IGxlbmd0aCAlcyBpZ25vcmVkISIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgbmVlZCBvciB1c2UgdGVtcC4gZmlsZSBcIiVzXCIuIiksIGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgYXNfd2FybiAoXygiSSBkb24ndCB1c2UgYW4gaW50ZXJwYXNzIGZpbGUhIC1WIGlnbm9yZWQiKSk7Ci0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9WTVMKLSAgICBjYXNlICcrJzoJCQkvKiBGb3IgZysrLiAgSGFzaCBhbnkgbmFtZSA+IDMxIGNoYXJzIGxvbmcuICovCi0gICAgICBmbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzEnOgkJCS8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0gICAgICBmbGFnX29uZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgkJCS8qIFNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb24gKi8KLSAgICAgIGZsYWdfc2hvd19hZnRlcl90cnVuYyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgkJCS8qIE5vIGhhc2hpbmcgb2YgbWl4ZWQtY2FzZSBuYW1lcyAqLwotICAgICAgewotCWV4dGVybiBjaGFyIHZtc19uYW1lX21hcHBpbmc7Ci0Jdm1zX25hbWVfbWFwcGluZyA9IGF0b2kgKGFyZyk7Ci0JZmxhZ19ub19oYXNoX21peGVkX2Nhc2UgPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd2JzoKLSAgICAgIHsKLQlleHRlcm4gY2hhciAqY29tcGlsZXJfdmVyc2lvbl9zdHJpbmc7Ci0JaWYgKCFhcmcgfHwgISphcmcgfHwgYWNjZXNzIChhcmcsIDApID09IDApCi0JICByZXR1cm4gMDsJCS8qIGhhdmUgY2FsbGVyIHNob3cgdGhlIGFzc2VtYmxlciB2ZXJzaW9uICovCi0JY29tcGlsZXJfdmVyc2lvbl9zdHJpbmcgPSBhcmc7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1WQVggb3B0aW9uczpcblwKLS1kIExFTkdUSAkJaWdub3JlZFxuXAotLUoJCQlpZ25vcmVkXG5cCi0tUwkJCWlnbm9yZWRcblwKLS10IEZJTEUJCQlpZ25vcmVkXG5cCi0tVAkJCWlnbm9yZWRcblwKLS1WCQkJaWdub3JlZFxuIikpOwotI2lmZGVmIE9CSl9WTVMKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1WTVMgb3B0aW9uczpcblwKLS0rCQkJaGFzaCBlbmNvZGUgbmFtZXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVyc1xuXAotLTEJCQlgY29uc3QnIGhhbmRsaW5nIGNvbXBhdGlibGUgd2l0aCBnY2MgMS54XG5cCi0tSAkJCXNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cblwKLS1oIE5VTQkJCWRvbid0IGhhc2ggbWl4ZWQtY2FzZSBuYW1lcywgYW5kIGFkanVzdCBjYXNlOlxuXAotCQkJMCA9IHVwcGVyLCAyID0gbG93ZXIsIDMgPSBwcmVzZXJ2ZSBjYXNlXG5cCi0tdlwiVkVSU0lPTlwiCQljb2RlIGJlaW5nIGFzc2VtYmxlZCB3YXMgcHJvZHVjZWQgYnkgY29tcGlsZXIgXCJWRVJTSU9OXCJcbiIpKTsKLSNlbmRpZgotfQotDAotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgdmF4LCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQsIHBsdXMKLSAgIGl0cyBzaXplLiAoPz8/IElzIHRoaXMgcmlnaHQ/ICBGSVhNRS1TT09OKSAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLS8qIGVuZCBvZiB0Yy12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12YXguaCBiL2dhcy9jb25maWcvdGMtdmF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzkxZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12YXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIHRjLXZheC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy12YXguYy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfVkFYIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgTk9fUkVMT0MgMAotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDEKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotbG9uZyBtZF9jaGFyc190b19udW1iZXIgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLXZheC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXc2NS5jIGIvZ2FzL2NvbmZpZy90Yy13NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3ZWIwZi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0vKiB0Yy13NjUuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgVzY1ODE2Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICAgc2FjQGN5Z251cy5jb20KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiLi4vb3Bjb2Rlcy93NjUtb3BjLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7Ci1DT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiEjIjsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gKi8KLQotI2RlZmluZSBPUF9CQ0MJMHg5MAotI2RlZmluZSBPUF9CQ1MJMHhCMAotI2RlZmluZSBPUF9CRVEJMHhGMAotI2RlZmluZSBPUF9CTUkJMHgzMAotI2RlZmluZSBPUF9CTkUJMHhEMAotI2RlZmluZSBPUF9CUEwJMHgxMAotI2RlZmluZSBPUF9CUkEJMHg4MAotI2RlZmluZSBPUF9CUkwJMHg4MgotI2RlZmluZSBPUF9CVkMJMHg1MAotI2RlZmluZSBPUF9CVlMJMHg3MAotCi12b2lkIHNfbG9uZ2EgKCk7Ci1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDJ9LAotICB7IndvcmQiLCBjb25zLCAyfSwKLSAgeyJsb25nYSIsIHNfbG9uZ2EsIDB9LAotICB7ImxvbmdpIiwgc19sb25nYSwgMX0sCi0gIHswLCAwLCAwfQotfTsKLQotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfYWxpZ25fYnl0ZXMgKCk7Ci0KLQotLyppbnQgbWRfcmVsb2Nfc2l6ZTsgKi8KLQotc3RhdGljIGludCByZWxheDsJCS8qIHNldCBpZiAtcmVsYXggc2VlbiAqLwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0KLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotaW50IE07CQkJCS8qIE0gZmxhZyAqLwotaW50IFg7CQkJCS8qIFggZmxhZyAqLwotCi0KLQotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0KLSNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj4yKSkKLQotI2RlZmluZSBCWVRFX0RJU1AgMQotI2RlZmluZSBXT1JEX0RJU1AgMgotI2RlZmluZSBVTkRFRl9CWVRFX0RJU1AgMAotI2RlZmluZSBVTkRFRl9XT1JEX0RJU1AgMwotCi0jZGVmaW5lIENPTkRfQlJBTkNIIAkxCi0jZGVmaW5lIFVOQ09ORF9CUkFOQ0ggICAyCi0jZGVmaW5lIEVORCAJMwotCi0jZGVmaW5lIEJZVEVfRiAxMjcJCS8qIEhvdyBmYXIgd2UgY2FuIGJyYW5jaCBmb3J3YXJkcyAqLwotI2RlZmluZSBCWVRFX0IgLTEyNgkJLyogSG93IGZhciB3ZSBjYW4gYnJhbmNoIGJhY2t3YXJkcyAqLwotI2RlZmluZSBXT1JEX0YgMzI3NjcKLSNkZWZpbmUgV09SRF9CIDMyNzY4Ci0KLXJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldOwotCi0vKgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKLSAqLwotCi0KLXZvaWQKLXNfbG9uZ2EgKHhtb2RlKQotewotICBpbnQgKnAgPSB4bW9kZSA/ICZYIDogJk07Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIm9uIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICAgICpwID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIm9mZiIsIDMpID09IDApCi0gICAgewotICAgICAgKnAgPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJuZWVkIG9uIG9yIG9mZi4iKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWxheF90eXBlUyAqdGFibGU7Ci0gIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0KLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlICovCi0gIGZvciAob3Bjb2RlID0gb3B0YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCi0JewotCSAgcHJldl9uYW1lID0gb3Bjb2RlLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBzdHJpbmcgKi8KLQkgIG9wY29kZS0+bmFtZSA9IHByZXZfbmFtZTsKLQl9Ci0gICAgfQotCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgcmVsYXggdGFibGUuICBXZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSB0byBhdm9pZAotICAgICB3YXJuaW5ncyBhYm91dCBtb2RpZnlpbmcgYSBzdXBwb3NlZGx5IGNvbnN0IGRhdGEgc3RydWN0dXJlLiAgKi8KLSAgdGFibGUgPSAocmVsYXhfdHlwZVMgKikgbWRfcmVsYXhfdGFibGU7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfZm9yd2FyZCA9IEJZVEVfRjsKLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9sZW5ndGggPSAyOwotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X21vcmUgPSBDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2ZvcndhcmQgPSBXT1JEX0Y7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBXT1JEX0I7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gNTsKLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKLQotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfZm9yd2FyZCA9IEJZVEVfRjsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2JhY2t3YXJkID0gQllURV9COwotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMjsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X21vcmUgPSBDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApOwotCi0gIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBXT1JEX0I7Ci0gIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9sZW5ndGggPSAzOwotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLSAgZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2sgPSAxOwotfQotCi1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlOwkvKiBhYnNvbHV0ZSBleHByZXNzaW9uICovCi1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlMTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotCi0KLXN0YXRpYyBzeW1ib2xTICoKLWRvdCAoKQotewotICBjb25zdCBjaGFyICpmYWtlOwotCi0gIC8qIEpGOiAnLicgaXMgcHNldWRvIHN5bWJvbCB3aXRoIHZhbHVlIG9mIGN1cnJlbnQgbG9jYXRpb24KLSAgICAgaW4gY3VycmVudCBzZWdtZW50LiAgKi8KLSAgZmFrZSA9IEZBS0VfTEFCRUxfTkFNRTsKLSAgcmV0dXJuIHN5bWJvbF9uZXcgKGZha2UsCi0JCSAgICAgbm93X3NlZywKLQkJICAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCSAgICAgZnJhZ19ub3cpOwotCi19Ci0KLWludCBleHByX3NpemU7Ci1pbnQgZXhwcl9zaGlmdDsKLWludCB0Y19jb25zX3JlbG9jOwotdm9pZAotdzY1X2V4cHJlc3Npb24gKGRlc3QsIGJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZGVzdDsKLSAgICAgdW5zaWduZWQgaW50IGJ5dGVzOwotewotICBleHByX3NpemUgPSAwOwotICBleHByX3NoaWZ0ID0gMDsKLSAgdGNfY29uc19yZWxvYyA9IDA7Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPCcpCi0gICAgewotICAgICAgZXhwcl9zaXplID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPicpCi0gICAgewotICAgICAgZXhwcl9zaGlmdCA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ14nKQotICAgIHsKLSAgICAgIGV4cHJfc2hpZnQgPSAyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotCi0gIGV4cHIgKDAsIGRlc3QpOwotfQotCi1pbnQgYW1vZGU7Ci1zdGF0aWMKLWNoYXIgKgotcGFyc2VfZXhwIChzLCBieXRlcykKLSAgICAgY2hhciAqczsKLSAgICAgaW50IGJ5dGVzOwotewotICBjaGFyICpzYXZlOwotICBjaGFyICpuZXc7Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgdzY1X2V4cHJlc3Npb24gKCZpbW1lZGlhdGUsIGJ5dGVzKTsKLSAgaWYgKGltbWVkaWF0ZS5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAoaW5mbywgcHRyKQotICAgICBzdHJ1Y3Qgb3BpbmZvICppbmZvOwotICAgICBjaGFyICpwdHI7Ci17Ci0gIHJlZ2lzdGVyIGludCBvdmVycmlkZV9sZW4gPSAwOwotICByZWdpc3RlciBpbnQgYnl0ZXMgPSAwOwotICB3aGlsZSAoKnB0ciA9PSAnICcpCi0gICAgcHRyKys7Ci0KLSAgaWYgKHB0clswXSA9PSAnIycpCi0gICAgewotICAgICAgcHRyKys7Ci0gICAgICBzd2l0Y2ggKGluZm8tPmFtb2RlKQotCXsKLQljYXNlIEFERFJfSU1NVE9JOgotCSAgYnl0ZXMgPSBYID8gMSA6IDI7Ci0JICBhbW9kZSA9IEFERFJfSU1NVE9JOwotCSAgYnJlYWs7Ci0JY2FzZSBBRERSX0lNTVRPQToKLQkgIGJ5dGVzID0gTSA/IDEgOiAyOwotCSAgYW1vZGUgPSBBRERSX0lNTVRPQTsKLQkgIGJyZWFrOwotCWNhc2UgQUREUl9JTU1DT1A6Ci0JICBieXRlcyA9IDE7Ci0JICBhbW9kZSA9IEFERFJfSU1NQ09QOwotCSAgYnJlYWs7Ci0JY2FzZSBBRERSX0RJUjoKLQkgIGJ5dGVzID0gMjsKLQkgIGFtb2RlID0gQUREUl9BQlM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0cik7Ci0gICAgfQotICBlbHNlIGlmIChwdHJbMF0gPT0gJyEnKQotICAgIHsKLSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyICsgMSk7Ci0gICAgICBpZiAocHRyWzBdID09ICcsJykKLQl7Ci0JICBpZiAocHRyWzFdID09ICd5JykKLQkgICAgewotCSAgICAgIGFtb2RlID0gQUREUl9BQlNfSURYX1k7Ci0JICAgICAgYnl0ZXMgPSAyOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlIGlmIChwdHJbMV0gPT0gJ3gnKQotCSAgICB7Ci0JICAgICAgYW1vZGUgPSBBRERSX0FCU19JRFhfWDsKLQkgICAgICBieXRlcyA9IDI7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGFmdGVyIDxleHAiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYW1vZGUgPSBBRERSX0FCUzsKLQkgIGJ5dGVzID0gMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChwdHJbMF0gPT0gJz4nKQotICAgIHsKLSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyICsgMSk7Ci0gICAgICBpZiAocHRyWzBdID09ICcsJyAmJiBwdHJbMV0gPT0gJ3gnKQotCXsKLQkgIGFtb2RlID0gQUREUl9BQlNfTE9OR19JRFhfWDsKLQkgIGJ5dGVzID0gMzsKLQkgIHB0ciArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhbW9kZSA9IEFERFJfQUJTX0xPTkc7Ci0JICBieXRlcyA9IDM7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICc8JykKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotICAgICAgaWYgKHB0clswXSA9PSAnLCcpCi0JewotCSAgaWYgKHB0clsxXSA9PSAneScpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfRElSX0lEWF9ZOwotCSAgICAgIHB0ciArPSAyOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAocHRyWzFdID09ICd4JykKLQkgICAgewotCSAgICAgIGFtb2RlID0gQUREUl9ESVJfSURYX1g7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgICAgYnl0ZXMgPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBhZnRlciA8ZXhwIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFtb2RlID0gQUREUl9ESVI7Ci0JICBieXRlcyA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICdhJykKLSAgICB7Ci0gICAgICBhbW9kZSA9IEFERFJfQUNDOwotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICcoJykKLSAgICB7Ci0gICAgICAvKiBMb29rIGZvciAoZXhwKSx5Ci0JICg8ZXhwKSx5Ci0JIChleHAseCkKLQkgKDxleHAseCkKLQkgKGV4cCkKLQkgKCFleHApCi0JIChleHApCi0JICg8ZXhwKQotCSAoZXhwLHgpCi0JICghZXhwLHgpCi0JIChleHAscykKLQkgKGV4cCxzKSx5ICovCi0KLSAgICAgIHB0cisrOwotICAgICAgaWYgKHB0clswXSA9PSAnPCcpCi0JewotCSAgb3ZlcnJpZGVfbGVuID0gMTsKLQkgIHB0cisrOwotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnIScpCi0JewotCSAgb3ZlcnJpZGVfbGVuID0gMjsKLQkgIHB0cisrOwotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnPicpCi0JewotCSAgb3ZlcnJpZGVfbGVuID0gMzsKLQkgIHB0cisrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvdmVycmlkZV9sZW4gPSAwOwotCX0KLSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyKTsKLQotICAgICAgaWYgKHB0clswXSA9PSAnLCcpCi0JewotCSAgcHRyKys7Ci0JICBpZiAocHRyWzBdID09ICd4JyAmJiBwdHJbMV0gPT0gJyknKQotCSAgICB7Ci0JICAgICAgcHRyICs9IDI7Ci0KLQkgICAgICBpZiAob3ZlcnJpZGVfbGVuID09IDEpCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfRElSX0lEWF9JTkRfWDsKLQkJICBieXRlcyA9IDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfQUJTX0lORF9JRFg7Ci0JCSAgYnl0ZXMgPSAyOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHB0clswXSA9PSAncycgJiYgcHRyWzFdID09ICcpJyAmJiBwdHJbMl0gPT0gJywnICYmIHB0clszXSA9PSAneScpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfU1RBQ0tfUkVMX0lORFhfSURYOwotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBwdHIgKz0gNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnKScpCi0JewotCSAgaWYgKHB0clsxXSA9PSAnLCcgJiYgcHRyWzJdID09ICd5JykKLQkgICAgewotCSAgICAgIGFtb2RlID0gQUREUl9ESVJfSU5EX0lEWF9ZOwotCSAgICAgIHB0ciArPSAzOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0RJUl9JTkQ7Ci0JCSAgYnl0ZXMgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0FCU19JTkQ7Ci0JCSAgYnl0ZXMgPSAyOwotCQl9Ci0JICAgICAgcHRyKys7Ci0KLQkgICAgfQotCX0KLQotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICdbJykKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotICAgICAgaWYgKHB0clswXSA9PSAnXScpCi0JewotCSAgcHRyKys7Ci0JICBpZiAocHRyWzBdID09ICcsJyAmJiBwdHJbMV0gPT0gJ3knKQotCSAgICB7Ci0JICAgICAgYnl0ZXMgPSAxOwotCSAgICAgIGFtb2RlID0gQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkc7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbmZvLT5jb2RlID09IE9fam1wKSAKLQkJewotCQlieXRlcyA9IDI7Ci0JCWFtb2RlID0gQUREUl9BQlNfSU5EX0xPTkc7Ci0JICAgICAgfSAKLQkgICAgICBlbHNlIAotewotCQlieXRlcyA9IDE7Ci0JICAgICAgCi0JCWFtb2RlID0gQUREUl9ESVJfSU5EX0xPTkc7Ci0JICAgICAgfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyLCAyKTsKLSAgICAgIGlmIChwdHJbMF0gPT0gJywnKQotCXsKLQkgIGlmIChwdHJbMV0gPT0gJ3knKQotCSAgICB7Ci0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYnl0ZXMgPSAxOwotCQkgIGFtb2RlID0gQUREUl9ESVJfSURYX1k7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfQUJTX0lEWF9ZOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlIGlmIChwdHJbMV0gPT0gJ3gnKQotCSAgICB7Ci0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0RJUl9JRFhfWDsKLQkJICBieXRlcyA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfQUJTX0lEWF9YOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlIGlmIChwdHJbMV0gPT0gJ3MnKQotCSAgICB7Ci0JICAgICAgYnl0ZXMgPSAxOwotCSAgICAgIGFtb2RlID0gQUREUl9TVEFDS19SRUw7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBpbW1lZGlhdGUxID0gaW1tZWRpYXRlOwotCSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyICsgMSk7Ci0JICAgICAgYW1vZGUgPSBBRERSX0JMT0NLX01PVkU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpbmZvLT5hbW9kZSkKLQkgICAgewotCSAgICBjYXNlIEFERFJfUENfUkVMOgotCSAgICAgIGFtb2RlID0gQUREUl9QQ19SRUw7Ci0JICAgICAgYnl0ZXMgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFERFJfUENfUkVMX0xPTkc6Ci0JICAgICAgYW1vZGUgPSBBRERSX1BDX1JFTF9MT05HOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpZiAob3ZlcnJpZGVfbGVuID09IDEpCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfRElSOwotCQkgIGJ5dGVzID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG92ZXJyaWRlX2xlbiA9PSAzKQotCQl7Ci0JCSAgYnl0ZXMgPSAzOwotCQkgIGFtb2RlID0gQUREUl9BQlNfTE9ORzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFtb2RlID0gQUREUl9BQlM7Ci0JCSAgYnl0ZXMgPSAyOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAoYnl0ZXMpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHN3aXRjaCAoZXhwcl9zaGlmdCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGFtb2RlID09IEFERFJfRElSKQotCXRjX2NvbnNfcmVsb2MgPSBSX1c2NV9EUDsKLQkgIGVsc2UKLXRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlM4OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgdGNfY29uc19yZWxvYyA9IFJfVzY1X0FCUzhTODsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIHRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlM4UzE2OwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgc3dpdGNoIChleHByX3NoaWZ0KQotCXsKLQljYXNlIDA6Ci0JICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTMTY7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTMTZTODsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIHRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlMxNlMxNjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAotICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcwotICAgcHJvdmlkZWQKLSAqLwotCi1zdGF0aWMKLXN0cnVjdCBvcGluZm8gKgotZ2V0X3NwZWNpZmljIChvcGNvZGUpCi0gICAgIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKLXsKLSAgaW50IG9jb2RlID0gb3Bjb2RlLT5jb2RlOwotCi0gIGZvciAoOyBvcGNvZGUtPmNvZGUgPT0gb2NvZGU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChvcGNvZGUtPmFtb2RlID09IGFtb2RlKQotCXJldHVybiBvcGNvZGU7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1jaGVjayAob3BlcmFuZCwgbG93LCBoaWdoKQotICAgICBleHByZXNzaW9uUyAqb3BlcmFuZDsKLSAgICAgaW50IGxvdzsKLSAgICAgaW50IGhpZ2g7Ci17Ci0gIGlmIChvcGVyYW5kLT5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA8IGxvdwotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyID4gaGlnaCkKLSAgICB7Ci0gICAgICBhc19iYWQgKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiwgbG93LCBoaWdoKTsKLSAgICB9Ci0gIHJldHVybiBvcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci19Ci0KLQotc3RhdGljIGludCBsb2cyW10gPQotezAsIDAsIDEsIDAsIDJ9OwotCi0vKiBOb3cgd2Uga25vdyB3aGF0IHNvcnQgb2Ygb3Bjb2RlcyBpdCBpcywgbGV0cyBidWlsZCB0aGUgYnl0ZXMgLQotICovCi1zdGF0aWMgdm9pZAotYnVpbGRfTXl0ZXMgKG9wY29kZSkKLSAgICAgc3RydWN0IG9waW5mbyAqb3Bjb2RlOwotewotICBpbnQgc2l6ZTsKLSAgaW50IHR5cGU7Ci0gIGludCBwY3JlbDsKLSAgY2hhciAqb3V0cHV0OwotCi0gIGlmIChvcGNvZGUtPmFtb2RlID09IEFERFJfSU1QTElFRCkKLSAgICB7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDEpOwotICAgIH0KLSAgZWxzZSBpZiAob3Bjb2RlLT5hbW9kZSA9PSBBRERSX1BDX1JFTCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIC8qIFRoaXMgaXMgYSByZWxheGFibGUgaW5zbiwgc28gd2UgZG8gc29tZSBzcGVjaWFsIGhhbmRsaW5nICovCi0gICAgICB0eXBlID0gb3Bjb2RlLT52YWwgPT0gT1BfQlJBID8gVU5DT05EX0JSQU5DSCA6IENPTkRfQlJBTkNIOwotICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKHR5cGUsIFdPUkRfRElTUCldLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAodHlwZSwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCwKLQkJCSBDICh0eXBlLCBVTkRFRl9CWVRFX0RJU1ApLAotCQkJIGltbWVkaWF0ZS5YX2FkZF9zeW1ib2wsCi0JCQkgaW1tZWRpYXRlLlhfYWRkX251bWJlciwKLQkJCSAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wY29kZS0+YW1vZGUpCi0JewotCSAgR0VUSU5GTyAoc2l6ZSwgdHlwZSwgcGNyZWwpOwotCX0KLQotICAgICAgLyogSWYgc29tZXRoaW5nIHNwZWNpYWwgd2FzIGRvbmUgaW4gdGhlCi0JIGV4cHJlc3Npb24gbW9kaWZ5IHRoZSByZWxvYyB0eXBlICovCi0gICAgICBpZiAodGNfY29uc19yZWxvYykKLQl7Ci0JICB0eXBlID0gdGNfY29uc19yZWxvYzsKLQl9Ci0KLQotCi0gICAgICAvKiAxIGJ5dGUgZm9yIHRoZSBvcGNvZGUgKyB0aGUgYnl0ZXMgZm9yIHRoZSBhZGRybW9kZSAqLwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlIChzaXplICsgMSk7Ci0KLSAgICAgIGlmIChvcGNvZGUtPmFtb2RlID09IEFERFJfQkxPQ0tfTU9WRSkKLQl7Ci0JICAvKiBUd28gcmVsb2NzIGZvciB0aGlzIG9uZSAqLwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0ICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICAgICAgMSwKLQkJICAgICAgICZpbW1lZGlhdGUsCi0JCSAgICAgICAwLAotCQkgICAgICAgUl9XNjVfQUJTOFMxNik7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCArIDIgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDEsCi0JCSAgICAgICAmaW1tZWRpYXRlMSwKLQkJICAgICAgIDAsCi0JCSAgICAgICBSX1c2NV9BQlM4UzE2KTsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlID49IDAKLQkgICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX0lNUExJRUQKLQkgICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX0FDQwotCSAgICAgICAmJiBvcGNvZGUtPmFtb2RlICE9IEFERFJfU1RBQ0spCi0JewotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0ICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICAgICAgc2l6ZSwKLQkJICAgICAgICZpbW1lZGlhdGUsCi0JCSAgICAgICBwY3JlbCwKLQkJICAgICAgIHR5cGUpOwotCX0KLSAgICB9Ci0gIG91dHB1dFswXSA9IG9wY29kZS0+dmFsOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqb3Bfc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKLSAgc3RydWN0IG9waW5mbyAqb3Bjb2RlOwotICBjaGFyIG5hbWVbMjBdOwotICBpbnQgbmxlbiA9IDA7Ci0gIGNoYXIgKnA7Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGFsbCBvcGNvZGVzIGFyZSB0aHJlZSBsZXR0ZXJzICovCi0gIG5hbWVbMF0gPSBzdHJbMF07Ci0gIG5hbWVbMV0gPSBzdHJbMV07Ci0gIG5hbWVbMl0gPSBzdHJbMl07Ci0gIG5hbWVbM10gPSAwOwotCi0gIHRjX2NvbnNfcmVsb2MgPSAwOwotICBzdHIgKz0gMzsKLSAgb3Bjb2RlID0gKHN0cnVjdCBvcGluZm8gKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBuYW1lKTsKLQotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZS0+YW1vZGUgIT0gQUREUl9JTVBMSUVECi0gICAgICAmJiBvcGNvZGUtPmFtb2RlICE9IEFERFJfU1RBQ0spCi0gICAgewotICAgICAgZ2V0X29wZXJhbmRzIChvcGNvZGUsIHN0cik7Ci0gICAgICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSk7Ci0gICAgfQotCi0gIGlmIChvcGNvZGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLwotCi0KLSAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgxKTsKLQotICAgICAgd2hlcmVbMF0gPSAweDA7Ci0gICAgICB3aGVyZVsxXSA9IDB4MDsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWlsZF9NeXRlcyAob3Bjb2RlKTsKLX0KLQotCi12b2lkCi1ERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi1zeW1ib2xTICoKLURFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCi0gICAgICAgY2hhciAqbmFtZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLURFRlVOICh0Y19oZWFkZXJzX2hvb2ssIChoZWFkZXJzKSwKLSAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfTlRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWMgLSAxOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUC0tKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYyxhKQotICAgIGludCBjOwotICAgIGNoYXIgKmE7Ci0KLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLXRjX05vdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19Ob3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qCi1jYWxsZWQgYWZ0ZXIgcmVsYXhpbmcsIGNoYW5nZSB0aGUgZnJhZ3Mgc28gdGhleSBrbm93IGhvdyBiaWcgdGhleSBhcmUKLSovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBpbnQgZGlzcF9zaXplID0gMDsKLSAgaW50IGluc3Rfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCk6Ci0gICAgY2FzZSBDIChVTkNPTkRfQlJBTkNILCBCWVRFX0RJU1ApOgotICAgICAgZGlzcF9zaXplID0gMTsKLSAgICAgIGluc3Rfc2l6ZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogY29uZCBicmFuY2hlcyB0byBhIGtub3duIDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApOgotICAgICAgc3dpdGNoIChidWZmZXJbMF0pCi0JewotCWNhc2UgT1BfQkNDOgotCWNhc2UgT1BfQkNTOgotCWNhc2UgT1BfQkVROgotCWNhc2UgT1BfQk1JOgotCWNhc2UgT1BfQk5FOgotCWNhc2UgT1BfQlBMOgotCWNhc2UgT1BfQlZTOgotCWNhc2UgT1BfQlZDOgotCSAgLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiB0aGUgdGVzdCAqLwotCSAgYnVmZmVyWzBdIF49IDB4MjA7Ci0JICBidWZmZXJbMV0gPSAzOwkvKiBKdW1wIG92ZXIgZm9sbG93aW5nIGJybCAqLwotCSAgYnVmZmVyWzJdID0gT1BfQlJMOwotCSAgYnVmZmVyWzNdID0gMDsKLQkgIGJ1ZmZlcls0XSA9IDA7Ci0JICBkaXNwX3NpemUgPSAyOwotCSAgaW5zdF9zaXplID0gMzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEMgKFVOQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCk6Ci0gICAgICAvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvIGEga25vd24gMTYgYml0IGRpc3BsYWNlbWVudCAqLwotCi0gICAgICBzd2l0Y2ggKGJ1ZmZlclswXSkKLQl7Ci0JY2FzZSBPUF9CUkE6Ci0JICBidWZmZXJbMF0gPSBPUF9CUkw7Ci0JICBkaXNwX3NpemUgPSAyOwotCSAgaW5zdF9zaXplID0gMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIC8qIGdvdCB0byBjcmVhdGUgYSBicmFuY2ggb3ZlciBhIHJlbG9jIGhlcmUgKi8KLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgYnVmZmVyWzBdIF49IDB4MjA7CS8qIGludmVydCB0ZXN0ICovCi0gICAgICBidWZmZXJbMV0gPSAzOwotICAgICAgYnVmZmVyWzJdID0gT1BfQlJMOwotICAgICAgYnVmZmVyWzNdID0gMDsKLSAgICAgIGJ1ZmZlcls0XSA9IDA7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwKLQkgICAgICAgZnJhZ1AtPmZyX2ZpeCArIDMsCi0JICAgICAgIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDAsCi0JICAgICAgIFJfVzY1X1BDUjE2KTsKLQotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQyAoVU5DT05EX0JSQU5DSCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGJ1ZmZlclswXSA9IE9QX0JSTDsKLSAgICAgIGJ1ZmZlclsxXSA9IDA7Ci0gICAgICBidWZmZXJbMl0gPSAwOwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyAxLAotCSAgICAgICA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLAotCSAgICAgICBSX1c2NV9QQ1IxNik7Ci0KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBpZiAoaW5zdF9zaXplKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgICAgaW50IG5leHRfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzcyArIGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGludCB0YXJnX2FkZHIgPSAoU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsKLQkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgICAgaW50IGRpc3AgPSB0YXJnX2FkZHIgLSBuZXh0X2luc3Q7Ci0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyICsgaW5zdF9zaXplLCBkaXNwLCBkaXNwX3NpemUpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICB9Ci19Ci0KLQotdmFsdWVUCi1ERUZVTiAobWRfc2VjdGlvbl9hbGlnbiwgKHNlZywgc2l6ZSksCi0gICAgICAgc2VnVCBzZWcgQU5ECi0gICAgICAgdmFsdWVUIHNpemUpCi17Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpCi0JICAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0KLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGludCBhZGRyID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZml4UC0+Znhfc2l6ZSA9PSAxKQotCWZpeFAtPmZ4X3JfdHlwZSA9IFJfVzY1X0FCUzg7Ci0gICAgICBlbHNlCi0JZml4UC0+Znhfcl90eXBlID0gUl9XNjVfQUJTMTY7Ci0gICAgfQotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVzY1X0FCUzhTMTY6Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgY2FzZSBSX1c2NV9BQlM4Uzg6Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgY2FzZSBSX1c2NV9BQlM4OgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNlMxNjoKLSAgICAgIHZhbCA+Pj0gODsKLSAgICBjYXNlIFJfVzY1X0FCUzE2Uzg6Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNjoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAwOwotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0FCUzI0OgotICAgICAgKmJ1ZisrID0gdmFsID4+IDA7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gODsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfUENSODoKLSAgICAgICpidWYrKyA9IHZhbCAtIGFkZHIgLSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9QQ1IxNjoKLSAgICAgIHZhbCA9IHZhbCAtIGFkZHIgLSAxOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0RQOgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpbnQgZ2FwID0gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIDE7Ci0gIHJldHVybiBnYXA7Ci19Ci0KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoeCkKLSAgICBzeW1ib2xTICp4OwotewotfQotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeF9wdHIpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci17Ci0gIHJldHVybiBmaXhfcHRyLT5meF9yX3R5cGU7Ci19Ci0KLXZvaWQKLXRjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKLSAgICAgZml4UyAqZml4X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOwotICAgICBiZmRfdm1hIGJhc2U7Ci0KLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKLQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU04OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZml4X3B0ci0+Znhfc2l6ZSA9PSA0KQotCWludHItPnJfdHlwZSA9IFJfVzY1X0FCUzI0OwotICAgICAgZWxzZQotCWludHItPnJfdHlwZSA9IGZpeF9wdHItPmZ4X3JfdHlwZTsKLSAgICB9Ci0KLSAgaW50ci0+cl92YWRkciA9IGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZSArIGJhc2U7Ci0gIGludHItPnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotCi0gIC8qIFR1cm4gdGhlIHNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpbnRvIGFuIG9mZnNldC4gICovCi0gIGlmIChzeW1ib2xfcHRyKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmRvdDsKLQotICAgICAgZG90ID0gc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpXS5kb3Q7Ci0gICAgICBpZiAoZG90KQotCXsKLQkgIGludHItPnJfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW1ib2xfcHRyKTsKLQkgIGludHItPnJfc3ltbmR4ID0gZG90LT5zeV9udW1iZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotICAgIH0KLX0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW2ZyYWctPmZyX3N1YnR5cGVdLnJseF9sZW5ndGg7Ci19Ci0KLQotCi0KLQotLyoKLWNhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24sIHJldHVybiB0aGUgbGVuZ3RoCi1ieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uCi0qLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBVTkRFRl9CWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoVU5DT05EX0JSQU5DSCwgVU5ERUZfQllURV9ESVNQKToKLSAgICAgIC8qIHVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duICovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKLQkgc2l6ZWQgLSBtYXliZSBpdCB3aWxsIGZpeCB1cCAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBCWVRFX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIEJZVEVfRElTUCldLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoOwotCX0KLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0KLQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl9SRUxBWCAoT1BUSU9OX01EX0JBU0UpCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotCi19Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdzY1LmggYi9nYXMvY29uZmlnL3RjLXc2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzk0YWQyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdzY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtdzY1LmgKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIFRDX1c2NQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQotCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX3c2NQotI2RlZmluZSBDT0ZGX01BR0lDIDB4NjUwMAotCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIlc2NTgxNiBHQVMgIgotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0jZGVmaW5lIFJFTE9DXzMyIDEyMzQKLQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSB3NjVfZXhwcmVzc2lvbiAoRVhQLCBOQllURVMpCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQotI2RlZmluZSBUQ19DT05TX1JFTE9DIHRjX2NvbnNfcmVsb2MKLSNkZWZpbmUgRE9OVF9PVkVSRkxPVwotaW50IHRjX2NvbnNfcmVsb2M7Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBlbmQgb2YgdGMtdzY1LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtejhrLmMgYi9nYXMvY29uZmlnL3RjLXo4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODliMTRiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtejhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg5ICswLDAgQEAKLS8qIHRjLXo4ay5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBaaWxvZyBaODAwbgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICBzYWNAY3lnbnVzLmNvbQotICAqLwotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAib3Bjb2Rlcy96OGstb3BjLmgiCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0KLXsnIScsIDB9OwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0KLXsnOycsIDB9OwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9Ci17JyMnLCAwfTsKLQotZXh0ZXJuIGludCBtYWNoaW5lOwotZXh0ZXJuIGludCBjb2ZmX2ZsYWdzOwotaW50IHNlZ21lbnRlZF9tb2RlOwotY29uc3QgaW50IG1kX3JlbG9jX3NpemU7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotdm9pZCBjb25zICgpOwotCi12b2lkCi1zX3NlZ20gKCkKLXsKLSAgc2VnbWVudGVkX21vZGUgPSAxOwotICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDE7Ci0gIGNvZmZfZmxhZ3MgPSBGX1o4MDAxOwotfQotCi12b2lkCi1zX3Vuc2VnICgpCi17Ci0gIHNlZ21lbnRlZF9tb2RlID0gMDsKLSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAyOwotICBjb2ZmX2ZsYWdzID0gRl9aODAwMjsKLX0KLQotc3RhdGljCi12b2lkCi1ldmVuICgpCi17Ci0gIGZyYWdfYWxpZ24gKDEsIDAsIDApOwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLX0KLQotdm9pZCBvYmpfY29mZl9zZWN0aW9uICgpOwotCi1pbnQKLXRvaGV4IChjKQotICAgICBpbnQgYzsKLXsKLSAgaWYgKGlzZGlnaXQgKGMpKQotICAgIHJldHVybiBjIC0gJzAnOwotICBpZiAoaXNsb3dlciAoYykpCi0gICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKLSAgcmV0dXJuIGMgLSAnQScgKyAxMDsKLX0KLQotdm9pZAotc3ZhbCAoKQotewotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLSAgICB7Ci0gICAgICBpbnQgYzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHdoaWxlIChjICE9ICdcJycpCi0JewotCSAgaWYgKGMgPT0gJyUnKQotCSAgICB7Ci0JICAgICAgYyA9ICh0b2hleCAoaW5wdXRfbGluZV9wb2ludGVyWzBdKSA8PCA0KQotCQl8IHRvaGV4IChpbnB1dF9saW5lX3BvaW50ZXJbMV0pOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgICB9Ci0JICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotCSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLQotfQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCAyfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ6ODAwMSIsIHNfc2VnbSwgMH0sCi0gIHsiejgwMDIiLCBzX3Vuc2VnLCAwfSwKLQotCi0gIHsic2VnbSIsIHNfc2VnbSwgMH0sCi0gIHsidW5zZWdtIiwgc191bnNlZywgMH0sCi0gIHsidW5zZWciLCBzX3Vuc2VnLCAwfSwKLSAgeyJuYW1lIiwgc19hcHBfZmlsZSwgMH0sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsid3ZhbCIsIGNvbnMsIDJ9LAotICB7Imx2YWwiLCBjb25zLCA0fSwKLSAgeyJidmFsIiwgY29ucywgMX0sCi0gIHsic3ZhbCIsIHN2YWwsIDB9LAotICB7InJzZWN0Iiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7ImJsb2NrIiwgc19zcGFjZSwgMH0sCi0gIHsiZXZlbiIsIGV2ZW4sIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIG9wY29kZV9lbnRyeV90eXBlICpvcGNvZGU7Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICBpbnQgaWR4ID0gMDsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgZm9yIChvcGNvZGUgPSB6OGtfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgLyogT25seSBlbnRlciB1bmlxdWUgY29kZXMgaW50byB0aGUgdGFibGUgKi8KLSAgICAgIGNoYXIgKnNyYyA9IG9wY29kZS0+bmFtZTsKLQotICAgICAgaWYgKHN0cmNtcCAob3Bjb2RlLT5uYW1lLCBwcmV2X25hbWUpKQotCXsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0JICBpZHgrKzsKLQl9Ci0gICAgICBvcGNvZGUtPmlkeCA9IGlkeDsKLSAgICAgIHByZXZfbmFtZSA9IG9wY29kZS0+bmFtZTsKLSAgICB9Ci0KLSAgLyogZGVmYXVsdCB0byB6ODAwMiAqLwotICBzX3Vuc2VnICgpOwotCi0gIC8qIGluc2VydCB0aGUgcHNldWRvIG9wcyB0b28gKi8KLSAgZm9yIChpZHggPSAwOyBtZF9wc2V1ZG9fdGFibGVbaWR4XS5wb2NfbmFtZTsgaWR4KyspCi0gICAgewotICAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKmZha2Vfb3Bjb2RlOwotICAgICAgZmFrZV9vcGNvZGUgPSAob3Bjb2RlX2VudHJ5X3R5cGUgKikgbWFsbG9jIChzaXplb2YgKG9wY29kZV9lbnRyeV90eXBlKSk7Ci0gICAgICBmYWtlX29wY29kZS0+bmFtZSA9IG1kX3BzZXVkb190YWJsZVtpZHhdLnBvY19uYW1lLAotCWZha2Vfb3Bjb2RlLT5mdW5jID0gKHZvaWQgKikgKG1kX3BzZXVkb190YWJsZSArIGlkeCk7Ci0gICAgICBmYWtlX29wY29kZS0+b3Bjb2RlID0gMjUwOwotICAgICAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIGZha2Vfb3Bjb2RlLT5uYW1lLCBmYWtlX29wY29kZSk7Ci0gICAgfQotCi0gIGxpbmtyZWxheCA9IDE7Ci19Ci0KLXN0cnVjdCB6OGtfZXhwCi17Ci0gIGNoYXIgKmVfYmVnOwotICBjaGFyICplX2VuZDsKLSAgZXhwcmVzc2lvblMgZV9leHA7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgejhrX29wCi17Ci0gIGNoYXIgcmVnc2l6ZTsJCQkvKiAnYicsJ3cnLCdyJywncScgKi8KLSAgdW5zaWduZWQgaW50IHJlZzsJCS8qIDAuLjE1ICovCi0KLSAgaW50IG1vZGU7Ci0KLSAgdW5zaWduZWQgaW50IHhfcmVnOwkJLyogYW55IG90aGVyIHJlZ2lzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZSAqLwotICBleHByZXNzaW9uUyBleHA7CQkvKiBhbnkgZXhwcmVzc2lvbiAqLwotfQotCi1vcF90eXBlOwotCi1zdGF0aWMgZXhwcmVzc2lvblMgKmRhX29wZXJhbmQ7Ci1zdGF0aWMgZXhwcmVzc2lvblMgKmltbV9vcGVyYW5kOwotCi1pbnQgcmVnWzE2XTsKLWludCB0aGVfY2M7Ci1pbnQgdGhlX2N0cmw7Ci1pbnQgdGhlX2ZsYWdzOwotaW50IHRoZV9pbnRlcnJ1cHQ7Ci0KLWNoYXIgKgotREVGVU4gKHdoYXRyZWcsIChyZWcsIHNyYyksCi0gICAgICAgaW50ICpyZWcgQU5ECi0gICAgICAgY2hhciAqc3JjKQotewotICBpZiAoaXNkaWdpdCAoc3JjWzFdKSkKLSAgICB7Ci0gICAgICAqcmVnID0gKHNyY1swXSAtICcwJykgKiAxMCArIHNyY1sxXSAtICcwJzsKLSAgICAgIHJldHVybiBzcmMgKyAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyZWcgPSAoc3JjWzBdIC0gJzAnKTsKLSAgICAgIHJldHVybiBzcmMgKyAxOwotICAgIH0KLX0KLQotLyoKLSAgcGFyc2Ugb3BlcmFuZHMKLQotICByaDAtcmg3LCBybDAtcmw3Ci0gIHIwLXIxNQotICBycjAtcnIxNAotICBycTAtLXJxMTIKLSAgV1JFRyByMCxyMSxyMixyMyxyNCxyNSxyNixyNyxmcCxzcAotICByMGwscjBoLC4ucjdsLHI3aAotICBAV1JFRwotICBAV1JFRysKLSAgQC1XUkVHCi0gICNjb25zdAotCi0gICovCi0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLWNoYXIgKgotREVGVU4gKHBhcnNlX3JlZywgKHNyYywgbW9kZSwgcmVnKSwKLSAgICAgICBjaGFyICpzcmMgQU5ECi0gICAgICAgaW50ICptb2RlIEFORAotICAgICAgIHVuc2lnbmVkIGludCAqcmVnKQotewotICBjaGFyICpyZXMgPSAwOwotICBjaGFyIHJlZ25vOwotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgaWYgKHNlZ21lbnRlZF9tb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfTE9ORzsKLSAgICAgICAgICAqcmVnID0gMTQ7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX1dPUkQ7Ci0gICAgICAgICAgKnJlZyA9IDE1OwotICAgICAgICB9Ci0gICAgICByZXR1cm4gc3JjICsgMjsKLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMV0gPT0gJ3InKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfTE9ORzsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gMTQpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJyJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNyY1sxXSA9PSAnaCcpCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19CWVRFOwotICAgICAgICAgIHJlcyA9IHdoYXRyZWcgKHJlZywgc3JjICsgMik7Ci0JICByZWdubyA9ICpyZWc7Ci0JICBpZiAocmVnbm8gPiA3KQotICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciByaCVkLCBvdXQgb2YgcmFuZ2UuIikscmVnbm8pOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChzcmNbMV0gPT0gJ2wnKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfQllURTsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gNykKLSAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgcmwlZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgICAqcmVnICs9IDg7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNyY1sxXSA9PSAncScpCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19RVUFEOwotICAgICAgICAgIHJlcyA9IHdoYXRyZWcgKHJlZywgc3JjICsgMik7Ci0JICByZWdubyA9ICpyZWc7Ci0JICBpZiAocmVnbm8gPiAxMikKLSAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgcnElZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfV09SRDsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDEpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gMTUpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHIlZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHJlczsKLQotfQotCi1jaGFyICoKLURFRlVOIChwYXJzZV9leHAsIChzLCBvcCksCi0gICAgICAgY2hhciAqcyBBTkQKLSAgICAgICBleHByZXNzaW9uUyAqIG9wKQotewotICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyICpuZXc7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgZXhwcmVzc2lvbiAob3ApOwotICBpZiAob3AtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogVGhlIG1hbnkgZm9ybXMgb2Ygb3BlcmFuZDoKLQotICAgPHJiPgotICAgPHI+Ci0gICA8cnI+Ci0gICA8cnE+Ci0gICBAcgotICAgI2V4cAotICAgZXhwCi0gICBleHAocikKLSAgIHIoI2V4cCkKLSAgIHIocikKLQotCi0KLSAgICovCi0KLXN0YXRpYwotY2hhciAqCi1ERUZVTiAoY2hlY2tmb3IsIChwdHIsIHdoYXQpLAotICAgICAgIGNoYXIgKnB0ciBBTkQKLSAgICAgICBjaGFyIHdoYXQpCi17Ci0gIGlmICgqcHRyID09IHdoYXQpCi0gICAgcHRyKys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkICVjIiksIHdoYXQpOwotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogTWFrZSBzdXJlIHRoZSBtb2RlIHN1cHBsaWVkIGlzIHRoZSBzaXplIG9mIGEgd29yZCAqLwotc3RhdGljIHZvaWQKLURFRlVOIChyZWd3b3JkLCAobW9kZSwgc3RyaW5nKSwKLSAgICAgICBpbnQgbW9kZSBBTkQKLSAgICAgICBjaGFyICpzdHJpbmcpCi17Ci0gIGludCBvazsKLQotICBvayA9IENMQVNTX1JFR19XT1JEOwotICBpZiAob2sgIT0gbW9kZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGEgd29yZCAlcyIpLCBzdHJpbmcpOwotICAgIH0KLX0KLQotLyogTWFrZSBzdXJlIHRoZSBtb2RlIHN1cHBsaWVkIGlzIHRoZSBzaXplIG9mIGFuIGFkZHJlc3MgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocmVnYWRkciwgKG1vZGUsIHN0cmluZyksCi0gICAgICAgaW50IG1vZGUgQU5ECi0gICAgICAgY2hhciAqc3RyaW5nKQotewotICBpbnQgb2s7Ci0KLSAgb2sgPSBzZWdtZW50ZWRfbW9kZSA/IENMQVNTX1JFR19MT05HIDogQ0xBU1NfUkVHX1dPUkQ7Ci0gIGlmIChvayAhPSBtb2RlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygicmVnaXN0ZXIgaXMgd3Jvbmcgc2l6ZSBmb3IgYWRkcmVzcyAlcyIpLCBzdHJpbmcpOwotICAgIH0KLX0KLQotc3RydWN0IGN0cmxfbmFtZXMKLXsKLSAgIGludCB2YWx1ZTsKLSAgIGNoYXIgKm5hbWU7Ci19OwotCi1zdHJ1Y3QgY3RybF9uYW1lcyBjdHJsX3RhYmxlW10gPQotewotICAgMHgyLCAiZmN3IiwKLSAgIDBYMywgInJlZnJlc2giLAotICAgMHg0LCAicHNhcHNlZyIsCi0gICAweDUsICJwc2Fwb2ZmIiwKLSAgIDB4NSwgInBzYXAiLAotICAgMHg2LCAibnNwc2VnIiwKLSAgIDB4NywgIm5zcG9mZiIsCi0gICAweDcsICJuc3AiLAotICAgMCwgMAotfTsKLSAgIAotc3RhdGljIHZvaWQKLURFRlVOIChnZXRfY3RybF9vcGVyYW5kLCAocHRyLCBtb2RlLCBkc3QpLAotICAgICAgIGNoYXIgKipwdHIgQU5ECi0gICAgICAgc3RydWN0IHo4a19vcCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgZHN0KQotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgcjsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKCpzcmMgPT0gJyAnKQotICAgIHNyYysrOwotCi0gIG1vZGUtPm1vZGUgPSBDTEFTU19DVFJMOwotICBmb3IgKGkgPSAwOyBjdHJsX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgY3RybF90YWJsZVtpXS5uYW1lW2pdOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3RybF90YWJsZVtpXS5uYW1lW2pdICE9IHNyY1tqXSkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgdGhlX2N0cmwgPSBjdHJsX3RhYmxlW2ldLnZhbHVlOwotICAgICAgKnB0ciA9IHNyYyArIGo7Ci0gICAgICByZXR1cm47Ci0gICAgZmFpbDo7Ci0gICAgfQotICB0aGVfY3RybCA9IDA7Ci0gIHJldHVybjsKLX0KLQotc3RydWN0IGZsYWdfbmFtZXMKLXsKLSAgaW50IHZhbHVlOwotICBjaGFyICpuYW1lOwotCi19OwotCi1zdHJ1Y3QgZmxhZ19uYW1lcyBmbGFnX3RhYmxlW10gPQotewotICAweDEsICJwIiwKLSAgMHgxLCAidiIsCi0gIDB4MiwgInMiLAotICAweDQsICJ6IiwKLSAgMHg4LCAiYyIsCi0gIDB4MCwgIisiLAotICAwLCAwCi19OwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGdldF9mbGFnc19vcGVyYW5kLCAocHRyLCBtb2RlLCBkc3QpLAotICAgICAgIGNoYXIgKipwdHIgQU5ECi0gICAgICAgc3RydWN0IHo4a19vcCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgZHN0KQotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgcjsKLSAgaW50IGk7Ci0gIGludCBqOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLQotICBtb2RlLT5tb2RlID0gQ0xBU1NfRkxBR1M7Ci0gIHRoZV9mbGFncyA9IDA7Ci0gIGZvciAoaiA9IDA7IGogPD0gOTsgaisrKQotICAgIHsKLSAgICAgaWYgKCFzcmNbal0pCi0JZ290byBkb25lOwotICAgICBmb3IgKGkgPSAwOyBmbGFnX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChmbGFnX3RhYmxlW2ldLm5hbWVbMF0gPT0gc3JjW2pdKQotCQl7Ci0JICAgICAgICB0aGVfZmxhZ3MgPSB0aGVfZmxhZ3MgfCBmbGFnX3RhYmxlW2ldLnZhbHVlOwotCQlnb3RvIG1hdGNoOwotCQl9Ci0gICAgICAgIH0KLSAgICAgIGdvdG8gZG9uZTsKLSAgICBtYXRjaDoKLSAgICAgOwotICAgIH0KLSAgZG9uZToKLSAgKnB0ciA9IHNyYyArIGo7Ci0gIHJldHVybjsKLX0KLQotCi1zdHJ1Y3QgaW50ZXJydXB0X25hbWVzCi17Ci0gIGludCB2YWx1ZTsKLSAgY2hhciAqbmFtZTsKLQotfTsKLQotc3RydWN0IGludGVycnVwdF9uYW1lcyBpbnRyX3RhYmxlW10gPQotewotICAweDEsICJudmkiLAotICAweDIsICJ2aSIsCi0gIDB4MywgImJvdGgiLAotICAweDMsICJhbGwiLAotICAwLCAwCi19OwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGdldF9pbnRlcnJ1cHRfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKLSAgICAgICBjaGFyICoqcHRyIEFORAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGRzdCkKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IHI7Ci0gIGludCBpOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLQotICBtb2RlLT5tb2RlID0gQ0xBU1NfSU1NOwotICBmb3IgKGkgPSAwOyBpbnRyX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgaW50cl90YWJsZVtpXS5uYW1lW2pdOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW50cl90YWJsZVtpXS5uYW1lW2pdICE9IHNyY1tqXSkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgdGhlX2ludGVycnVwdCA9IGludHJfdGFibGVbaV0udmFsdWU7Ci0gICAgICAqcHRyID0gc3JjICsgajsKLSAgICAgIHJldHVybjsKLSAgICBmYWlsOjsKLSAgICB9Ci0gIHRoZV9pbnRlcnJ1cHQgPSAweDA7Ci0gIHJldHVybjsKLX0KLQotc3RydWN0IGNjX25hbWVzCi17Ci0gIGludCB2YWx1ZTsKLSAgY2hhciAqbmFtZTsKLQotfTsKLQotc3RydWN0IGNjX25hbWVzIHRhYmxlW10gPQotewotICAweDAsICJmIiwKLSAgMHgxLCAibHQiLAotICAweDIsICJsZSIsCi0gIDB4MywgInVsZSIsCi0gIDB4NCwgIm92IiwKLSAgMHg0LCAicGUiLAotICAweDUsICJtaSIsCi0gIDB4NiwgImVxIiwKLSAgMHg2LCAieiIsCi0gIDB4NywgImMiLAotICAweDcsICJ1bHQiLAotICAweDgsICJ0IiwKLSAgMHg5LCAiZ2UiLAotICAweGEsICJndCIsCi0gIDB4YiwgInVndCIsCi0gIDB4YywgIm5vdiIsCi0gIDB4YywgInBvIiwKLSAgMHhkLCAicGwiLAotICAweGUsICJuZSIsCi0gIDB4ZSwgIm56IiwKLSAgMHhmLCAibmMiLAotICAweGYsICJ1Z2UiLAotICAwLCAwCi19OwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGdldF9jY19vcGVyYW5kLCAocHRyLCBtb2RlLCBkc3QpLAotICAgICAgIGNoYXIgKipwdHIgQU5ECi0gICAgICAgc3RydWN0IHo4a19vcCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgZHN0KQotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgcjsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKCpzcmMgPT0gJyAnKQotICAgIHNyYysrOwotCi0gIG1vZGUtPm1vZGUgPSBDTEFTU19DQzsKLSAgZm9yIChpID0gMDsgdGFibGVbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGludCBqOwotCi0gICAgICBmb3IgKGogPSAwOyB0YWJsZVtpXS5uYW1lW2pdOyBqKyspCi0JewotCSAgaWYgKHRhYmxlW2ldLm5hbWVbal0gIT0gc3JjW2pdKQotCSAgICBnb3RvIGZhaWw7Ci0JfQotICAgICAgdGhlX2NjID0gdGFibGVbaV0udmFsdWU7Ci0gICAgICAqcHRyID0gc3JjICsgajsKLSAgICAgIHJldHVybjsKLSAgICBmYWlsOjsKLSAgICB9Ci0gIHRoZV9jYyA9IDB4ODsKLX0KLQotc3RhdGljIHZvaWQKLWdldF9vcGVyYW5kIChwdHIsIG1vZGUsIGRzdCkKLSAgICAgY2hhciAqKnB0cjsKLSAgICAgc3RydWN0IHo4a19vcCAqbW9kZTsKLSAgICAgdW5zaWduZWQgaW50IGRzdDsKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgY2hhciAqZW5kOwotICB1bnNpZ25lZCBpbnQgbnVtOwotICB1bnNpZ25lZCBpbnQgbGVuOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotICBtb2RlLT5tb2RlID0gMDsKLQotICB3aGlsZSAoKnNyYyA9PSAnICcpCi0gICAgc3JjKys7Ci0gIGlmICgqc3JjID09ICcjJykKLSAgICB7Ci0gICAgICBtb2RlLT5tb2RlID0gQ0xBU1NfSU1NOwotICAgICAgaW1tX29wZXJhbmQgPSAmKG1vZGUtPmV4cCk7Ci0gICAgICBzcmMgPSBwYXJzZV9leHAgKHNyYyArIDEsICYobW9kZS0+ZXhwKSk7Ci0gICAgfQotICBlbHNlIGlmICgqc3JjID09ICdAJykKLSAgICB7Ci0gICAgICBpbnQgZDsKLQotICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX0lSOwotICAgICAgc3JjID0gcGFyc2VfcmVnIChzcmMgKyAxLCAmZCwgJm1vZGUtPnJlZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IHJlZ247Ci0KLSAgICAgIGVuZCA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZS0+bW9kZSwgJnJlZ24pOwotCi0gICAgICBpZiAoZW5kKQotCXsKLQkgIGludCBudywgbnI7Ci0KLQkgIHNyYyA9IGVuZDsKLQkgIGlmICgqc3JjID09ICcoJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIGVuZCA9IHBhcnNlX3JlZyAoc3JjLCAmbncsICZucik7Ci0JICAgICAgaWYgKGVuZCkKLQkJewotCQkgIC8qIEdvdCBSYShSYikgKi8KLQkJICBzcmMgPSBlbmQ7Ci0KLQkJICBpZiAoKnNyYyAhPSAnKScpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiTWlzc2luZyApIGluIHJhKHJiKSIpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHNyYysrOwotCQkgICAgfQotCi0JCSAgcmVnYWRkciAobW9kZS0+bW9kZSwgInJhKHJiKSByYSIpOwotLyoJCSAgcmVnd29yZCAobW9kZS0+bW9kZSwgInJhKHJiKSByYiIpOyovCi0JCSAgbW9kZS0+bW9kZSA9IENMQVNTX0JYOwotCQkgIG1vZGUtPnJlZyA9IHJlZ247Ci0JCSAgbW9kZS0+eF9yZWcgPSBucjsKLQkJICByZWdbQVJHX1JYXSA9IG5yOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR290IFJhKGRpc3ApICovCi0JCSAgaWYgKCpzcmMgPT0gJyMnKQotCQkgICAgc3JjKys7Ci0JCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICYobW9kZS0+ZXhwKSk7Ci0JCSAgc3JjID0gY2hlY2tmb3IgKHNyYywgJyknKTsKLQkJICBtb2RlLT5tb2RlID0gQ0xBU1NfQkE7Ci0JCSAgbW9kZS0+cmVnID0gcmVnbjsKLQkJICBtb2RlLT54X3JlZyA9IDA7Ci0JCSAgaW1tX29wZXJhbmQgPSAmKG1vZGUtPmV4cCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbW9kZS0+cmVnID0gcmVnbjsKLQkgICAgICBtb2RlLT54X3JlZyA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gaW5pdGlhbCByZWcgKi8KLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmKG1vZGUtPmV4cCkpOwotCSAgaWYgKCpzcmMgPT0gJygnKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgZW5kID0gcGFyc2VfcmVnIChzcmMsICYobW9kZS0+bW9kZSksICZyZWduKTsKLQkgICAgICByZWd3b3JkIChtb2RlLT5tb2RlLCAiYWRkcihSYSkgcmEiKTsKLQkgICAgICBtb2RlLT5tb2RlID0gQ0xBU1NfWDsKLQkgICAgICBtb2RlLT5yZWcgPSByZWduOwotCSAgICAgIG1vZGUtPnhfcmVnID0gMDsKLQkgICAgICBkYV9vcGVyYW5kID0gJihtb2RlLT5leHApOwotCSAgICAgIHNyYyA9IGNoZWNrZm9yIChlbmQsICcpJyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEp1c3QgYW4gYWRkcmVzcyAqLwotCSAgICAgIG1vZGUtPm1vZGUgPSBDTEFTU19EQTsKLQkgICAgICBtb2RlLT5yZWcgPSAwOwotCSAgICAgIG1vZGUtPnhfcmVnID0gMDsKLQkgICAgICBkYV9vcGVyYW5kID0gJihtb2RlLT5leHApOwotCSAgICB9Ci0JfQotICAgIH0KLSAgKnB0ciA9IHNyYzsKLX0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAob3Bjb2RlLCBvcF9lbmQsIG9wZXJhbmQpCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpvcGNvZGU7Ci0gICAgIGNoYXIgKm9wX2VuZDsKLSAgICAgb3BfdHlwZSAqb3BlcmFuZDsKLXsKLSAgY2hhciAqcHRyID0gb3BfZW5kOwotY2hhciAqc2F2cHRyOwotICBzd2l0Y2ggKG9wY29kZS0+bm9wZXJhbmRzKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBvcGVyYW5kWzBdLm1vZGUgPSAwOwotICAgICAgb3BlcmFuZFsxXS5tb2RlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgcHRyKys7Ci0gICAgICBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSBDTEFTU19DQykKLSAgICAgICAgewotICAgICAgICAgIGdldF9jY19vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gQ0xBU1NfRkxBR1MpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfZmxhZ3Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IChDTEFTU19JTU0gKyhBUkdfSU1NMikpKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X2ludGVycnVwdF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIG9wZXJhbmRbMV0ubW9kZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIHB0cisrOwotICAgICAgc2F2cHRyID0gcHRyOwotICAgICAgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gQ0xBU1NfQ0MpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfY2Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0NUUkwpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZ2V0X2N0cmxfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICAgICAgICAgaWYgKHRoZV9jdHJsID09IDApCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBwdHIgPSBzYXZwdHI7Ci0gICAgICAgICAgICAgICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICBpZiAocHRyID09IDApCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgaWYgKCpwdHIgPT0gJywnKQotICAgICAgICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgICAgZ2V0X2N0cmxfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEpOwotICAgICAgICAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBpZiAocHRyID09IDApCi0gICAgICAgIHJldHVybjsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLSAgICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAyLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMiwgMik7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfY2Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDMsIDMpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gICAqLwotCi1zdGF0aWMKLW9wY29kZV9lbnRyeV90eXBlICoKLURFRlVOIChnZXRfc3BlY2lmaWMsIChvcGNvZGUsIG9wZXJhbmRzKSwKLSAgICAgICBvcGNvZGVfZW50cnlfdHlwZSAqIG9wY29kZSBBTkQKLSAgICAgICBvcF90eXBlICogb3BlcmFuZHMpCi0KLXsKLSAgb3Bjb2RlX2VudHJ5X3R5cGUgKnRoaXNfdHJ5ID0gb3Bjb2RlOwotICBpbnQgZm91bmQgPSAwOwotICB1bnNpZ25lZCBpbnQgbm9wZXJhbmRzID0gb3Bjb2RlLT5ub3BlcmFuZHM7Ci0KLSAgdW5zaWduZWQgaW50IGRpc3ByZWc7Ci0gIHVuc2lnbmVkIGludCB0aGlzX2luZGV4ID0gb3Bjb2RlLT5pZHg7Ci0KLSAgd2hpbGUgKHRoaXNfaW5kZXggPT0gb3Bjb2RlLT5pZHggJiYgIWZvdW5kKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICB0aGlzX3RyeSA9IG9wY29kZSsrOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5vcGVyYW5kczsgaSsrKQotCXsKLQkgIGludCBtb2RlID0gb3BlcmFuZHNbaV0ubW9kZTsKLQotCSAgaWYgKChtb2RlICYgQ0xBU1NfTUFTSykgIT0gKHRoaXNfdHJ5LT5hcmdfaW5mb1tpXSAmIENMQVNTX01BU0spKQotCSAgICB7Ci0JICAgICAgLyogaXQgY291bGQgYmUgYW4gcGMgcmVsIG9wZXJhbmQsIGlmIHRoaXMgaXMgYSBkYSBtb2RlIGFuZAotCSAgIHdlIGxpa2UgZGlzcHMsIHRoZW4gaW5zZXJ0IGl0ICovCi0KLQkgICAgICBpZiAobW9kZSA9PSBDTEFTU19EQSAmJiB0aGlzX3RyeS0+YXJnX2luZm9baV0gPT0gQ0xBU1NfRElTUCkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGNhc2UgKi8KLQkJICBvcGVyYW5kc1tpXS5tb2RlID0gQ0xBU1NfRElTUDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG1vZGUgPT0gQ0xBU1NfQkEgJiYgdGhpc190cnktPmFyZ19pbmZvW2ldKQotCQl7Ci0JCSAgLyogQ2FuJ3QgdGhpbmsgb2YgYSB3YXkgdG8gdHVybiB3aGF0IHdlJ3ZlIGJlZW4gZ2l2ZW4gaW50bwotCSAgICAgc29tZXRoaW5nIHRoYXQncyBvayAqLwotCQkgIGdvdG8gZmFpbDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHRoaXNfdHJ5LT5hcmdfaW5mb1tpXSAmIENMQVNTX1BSKQotCQl7Ci0JCSAgaWYgKG1vZGUgPT0gQ0xBU1NfUkVHX0xPTkcgJiYgc2VnbWVudGVkX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIG9rICovCi0JCSAgICB9Ci0JCSAgZWxzZSBpZiAobW9kZSA9PSBDTEFTU19SRUdfV09SRCAmJiAhc2VnbWVudGVkX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIG9rICovCi0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZ290byBmYWlsOwotCQl9Ci0JICAgICAgZWxzZQotCQlnb3RvIGZhaWw7Ci0JICAgIH0KLQkgIHN3aXRjaCAobW9kZSAmIENMQVNTX01BU0spCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU19YOgotCSAgICBjYXNlIENMQVNTX0lSOgotCSAgICBjYXNlIENMQVNTX0JBOgotCSAgICBjYXNlIENMQVNTX0JYOgotCSAgICBjYXNlIENMQVNTX0RJU1A6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHOgotCSAgICBjYXNlIENMQVNTX1JFR19XT1JEOgotCSAgICBjYXNlIENMQVNTX1JFR19CWVRFOgotCSAgICBjYXNlIENMQVNTX1JFR19RVUFEOgotCSAgICBjYXNlIENMQVNTX1JFR19MT05HOgotCSAgICBjYXNlIENMQVNTX1JFR04wOgotCSAgICAgIHJlZ1t0aGlzX3RyeS0+YXJnX2luZm9baV0gJiBBUkdfTUFTS10gPSBvcGVyYW5kc1tpXS5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZvdW5kID0gMTsKLSAgICBmYWlsOjsKLSAgICB9Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdGhpc190cnk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLURFRlVOIChjaGVja19vcGVyYW5kLCAob3BlcmFuZCwgd2lkdGgsIHN0cmluZyksCi0gICAgICAgc3RydWN0IHo4a19vcCAqb3BlcmFuZCBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGggQU5ECi0gICAgICAgY2hhciAqc3RyaW5nKQotewotICBpZiAob3BlcmFuZC0+ZXhwLlhfYWRkX3N5bWJvbCA9PSAwCi0gICAgICAmJiBvcGVyYW5kLT5leHAuWF9vcF9zeW1ib2wgPT0gMCkKLSAgICB7Ci0KLSAgICAgIC8qIE5vIHN5bWJvbCBpbnZvbHZlZCwgbGV0J3MgbG9vayBhdCBvZmZzZXQsIGl0J3MgZGFuZ2Vyb3VzIGlmIGFueSBvZgotICAgICAgIHRoZSBoaWdoIGJpdHMgYXJlIG5vdCAwIG9yIGZmJ3MsIGZpbmQgb3V0IGJ5IG9yaW5nIG9yIGFuZGluZyB3aXRoCi0gICAgICAgdGhlIHdpZHRoIGFuZCBzZWVpbmcgaWYgdGhlIGFuc3dlciBpcyAwIG9yIGFsbCBmcyovCi0gICAgICBpZiAoKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJiB+d2lkdGgpICE9IDAgJiYKLQkgIChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyIHwgd2lkdGgpICE9ICh+MCkpCi0JewotCSAgYXNfd2FybiAoXygib3BlcmFuZCAlczB4JXggb3V0IG9mIHJhbmdlLiIpLCBzdHJpbmcsIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpOwotCX0KLSAgICB9Ci0KLX0KLQotc3RhdGljIGNoYXIgYnVmZmVyWzIwXTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChuZXdmaXgsIChwdHIsIHR5cGUsIG9wZXJhbmQpLAotICAgICAgIGludCBwdHIgQU5ECi0gICAgICAgaW50IHR5cGUgQU5ECi0gICAgICAgZXhwcmVzc2lvblMgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZC0+WF9hZGRfc3ltYm9sCi0gICAgICB8fCBvcGVyYW5kLT5YX29wX3N5bWJvbAotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyKQotICAgIHsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgcHRyLAotCQkgICAxLAotCQkgICBvcGVyYW5kLAotCQkgICAwLAotCQkgICB0eXBlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLURFRlVOIChhcHBseV9maXgsIChwdHIsIHR5cGUsIG9wZXJhbmQsIHNpemUpLAotICAgICAgIGNoYXIgKnB0ciBBTkQKLSAgICAgICBpbnQgdHlwZSBBTkQKLSAgICAgICBleHByZXNzaW9uUyAqIG9wZXJhbmQgQU5ECi0gICAgICAgaW50IHNpemUpCi17Ci0gIGludCBuID0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotCi0gIG9wZXJhbmQtPlhfYWRkX251bWJlciA9IG47Ci0gIG5ld2ZpeCAoKHB0ciAtIGJ1ZmZlcikgLyAyLCB0eXBlLCBvcGVyYW5kKTsKLSNpZiAxCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA4OgkJCS8qIDggbmliYmxlcyA9PSAzMiBiaXRzICovCi0gICAgICAqcHRyKysgPSBuID4+IDI4OwotICAgICAgKnB0cisrID0gbiA+PiAyNDsKLSAgICAgICpwdHIrKyA9IG4gPj4gMjA7Ci0gICAgICAqcHRyKysgPSBuID4+IDE2OwotICAgIGNhc2UgNDoJCQkvKiA0IG5pYmxsZXMgPT0gMTYgYml0cyAqLwotICAgICAgKnB0cisrID0gbiA+PiAxMjsKLSAgICAgICpwdHIrKyA9IG4gPj4gODsKLSAgICBjYXNlIDI6Ci0gICAgICAqcHRyKysgPSBuID4+IDQ7Ci0gICAgY2FzZSAxOgotICAgICAgKnB0cisrID0gbiA+PiAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmCi0gIHJldHVybiBwdHI7Ci0KLX0KLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotI2RlZmluZSBJTlNFUlQoeCx5KSAqeCsrID0geT4+MjQ7ICp4KysgPSB5Pj4gMTY7ICp4Kys9eT4+ODsgKngrKyA9eTsKLXN0YXRpYyB2b2lkCi1idWlsZF9ieXRlcyAodGhpc190cnksIG9wZXJhbmQpCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICogdGhpc190cnk7Ci0gICAgIHN0cnVjdCB6OGtfb3AgKm9wZXJhbmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGludCBsZW5ndGg7Ci0gIGNoYXIgKm91dHB1dDsKLSAgY2hhciAqb3V0cHV0X3B0ciA9IGJ1ZmZlcjsKLSAgY2hhciBwYXJ0OwotICBpbnQgYzsKLSAgY2hhciBoaWdoOwotICBpbnQgbmliOwotICBpbnQgbmliYmxlOwotICB1bnNpZ25lZCBpbnQgKmNsYXNzX3B0cjsKLQotICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgZnJhZ19uZXcgKDApOwotCi0gIG1lbXNldCAoYnVmZmVyLCAyMCwgMCk7Ci0gIGNsYXNzX3B0ciA9IHRoaXNfdHJ5LT5ieXRlX2luZm87Ci10b3A6OwotCi0gIGZvciAobmliYmxlID0gMDsgYyA9ICpjbGFzc19wdHIrKzsgbmliYmxlKyspCi0gICAgewotCi0gICAgICBzd2l0Y2ggKGMgJiBDTEFTU19NQVNLKQotCXsKLQlkZWZhdWx0OgotCi0JICBhYm9ydCAoKTsKLQljYXNlIENMQVNTX0FERFJFU1M6Ci0JICAvKiBEaXJlY3QgYWRkcmVzcywgd2UgZG9uJ3QgY29wZSB3aXRoIHRoZSBTUyBtb2RlIHJpZ2h0IG5vdyAqLwotCSAgaWYgKHNlZ21lbnRlZF9tb2RlKQotCSAgICB7Ci0JICAgICAgZGFfb3BlcmFuZC0+WF9hZGRfbnVtYmVyIHw9IDB4ODAwMDAwMDA7Ci0JICAgICAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0zMiwgZGFfb3BlcmFuZCwgOCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMTYsIGRhX29wZXJhbmQsIDQpOwotCSAgICB9Ci0JICBkYV9vcGVyYW5kID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRElTUDg6Ci0JICAvKiBwYyByZWwgOCBiaXQgKi8KLQkgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSlIsIGRhX29wZXJhbmQsIDIpOwotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgQ0xBU1NfMERJU1A3OgotCSAgLyogcGMgcmVsIDcgYml0ICovCi0JICAqb3V0cHV0X3B0ciA9IDA7Ci0JICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0RJU1A3LCBkYV9vcGVyYW5kLCAyKTsKLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENMQVNTXzFESVNQNzoKLQkgIC8qIHBjIHJlbCA3IGJpdCAqLwotCSAgKm91dHB1dF9wdHIgPSAweDgwOwotCSAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9ESVNQNywgZGFfb3BlcmFuZCwgMik7Ci0gICAgICAgICAgb3V0cHV0X3B0clstMl0gPSAgMHg4OwotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgQ0xBU1NfQklUXzFPUjI6Ci0JICAqb3V0cHV0X3B0ciA9IGMgJiAweGY7Ci0JICBpZiAoaW1tX29wZXJhbmQpCi0JICAgIHsKLQkgICAgICBpZiAoaW1tX29wZXJhbmQtPlhfYWRkX251bWJlciA9PSAyKQotCQl7Ci0JCSAgKm91dHB1dF9wdHIgfD0gMjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgIT0gMSkKLQkJewotCQkgIGFzX2JhZCAoXygiaW1tZWRpYXRlIG11c3QgYmUgMSBvciAyIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiaW1tZWRpYXRlIDEgb3IgMiBleHBlY3RlZCIpKTsKLQkgICAgfQotCSAgb3V0cHV0X3B0cisrOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DQzoKLQkgICpvdXRwdXRfcHRyKysgPSB0aGVfY2M7Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU18wQ0NDOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSB0aGVfY3RybDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU18xQ0NDOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSB0aGVfY3RybCB8IDB4ODsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU18wMElJOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSAofnRoZV9pbnRlcnJ1cHQgJiAweDMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENMQVNTXzAxSUk6Ci0gICAgICAgICAgKm91dHB1dF9wdHIrKyA9ICh+dGhlX2ludGVycnVwdCAmIDB4MykgfCAweDQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfRkxBR1M6Ci0gICAgICAgICAgKm91dHB1dF9wdHIrKyA9IHRoZV9mbGFnczsKLSAgICAgICAgICBicmVhazsKLQljYXNlIENMQVNTX0JJVDoKLQkgICpvdXRwdXRfcHRyKysgPSBjICYgMHhmOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdOMDoKLQkgIGlmIChyZWdbYyAmIDB4Zl0gPT0gMCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgdXNlIFIwIGhlcmUiKSk7Ci0JICAgIH0KLQljYXNlIENMQVNTX1JFRzoKLQljYXNlIENMQVNTX1JFR19CWVRFOgotCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6Ci0JY2FzZSBDTEFTU19SRUdfTE9ORzoKLQljYXNlIENMQVNTX1JFR19RVUFEOgotCSAgLyogSW5zZXJ0IGJpdCBtYXR0ZXJuIG9mCi0JIHJpZ2h0IHJlZyAqLwotCSAgKm91dHB1dF9wdHIrKyA9IHJlZ1tjICYgMHhmXTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRElTUDoKLQkgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMTYsIGRhX29wZXJhbmQsIDQpOwotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgQ0xBU1NfSU1NOgotCSAgewotCSAgICBuaWIgPSAwOwotCSAgICBzd2l0Y2ggKGMgJiBBUkdfTUFTSykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBBUkdfSU1NNDoKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU00TCwgaW1tX29wZXJhbmQsIDEpOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19JTU00TTE6Ci0JCWltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXItLTsKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU00TCwgaW1tX29wZXJhbmQsIDEpOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19JTU1OTUlOVVMxOgotCQlpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyLS07Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NNEwsIGltbV9vcGVyYW5kLCAxKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfTklNODoKLQkJaW1tX29wZXJhbmQtPlhfYWRkX251bWJlciA9IC1pbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotCSAgICAgIGNhc2UgQVJHX0lNTTg6Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NOCwgaW1tX29wZXJhbmQsIDIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19JTU0xNjoKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0xNiwgaW1tX29wZXJhbmQsIDQpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQVJHX0lNTTMyOgotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTMyLCBpbW1fb3BlcmFuZCwgOCk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJYWJvcnQgKCk7Ci0JICAgICAgfQotCSAgfQotCX0KLSAgICB9Ci0KLSAgLyogQ29weSBmcm9tIHRoZSBuaWJibGUgYnVmZmVyIGludG8gdGhlIGZyYWcgKi8KLQotICB7Ci0gICAgaW50IGxlbmd0aCA9IChvdXRwdXRfcHRyIC0gYnVmZmVyKSAvIDI7Ci0gICAgY2hhciAqc3JjID0gYnVmZmVyOwotICAgIGNoYXIgKmZyYWdwID0gZnJhZ19tb3JlIChsZW5ndGgpOwotCi0gICAgd2hpbGUgKHNyYyA8IG91dHB1dF9wdHIpCi0gICAgICB7Ci0JKmZyYWdwID0gKHNyY1swXSA8PCA0KSB8IHNyY1sxXTsKLQlzcmMgKz0gMjsKLQlmcmFncCsrOwotICAgICAgfQotCi0gIH0KLQotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jaXRvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotdm9pZAotREVGVU4gKG1kX2Fzc2VtYmxlLCAoc3RyKSwKLSAgICAgICBjaGFyICpzdHIpCi17Ci0gIGNoYXIgKm9wX3N0YXJ0OwotICBjaGFyICpvcF9lbmQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdHJ1Y3QgejhrX29wIG9wZXJhbmRbM107Ci0gIG9wY29kZV9lbnRyeV90eXBlICpvcGNvZGU7Ci0gIG9wY29kZV9lbnRyeV90eXBlICpwcmV2X29wY29kZTsKLQotICBjaGFyICpkb3QgPSAwOwotICBjaGFyIGM7Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSBzdHI7Ci0gICAgICAgKm9wX2VuZCAhPSAwICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICB9Ci0KLSAgOwotCi0gIGlmIChvcF9lbmQgPT0gb3Bfc3RhcnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0gICAgfQotICBjID0gKm9wX2VuZDsKLQotICAqb3BfZW5kID0gMDsKLQotICBvcGNvZGUgPSAob3Bjb2RlX2VudHJ5X3R5cGUgKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLAotCQkJCQkgICAgb3Bfc3RhcnQpOwotCi0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChvcGNvZGUtPm9wY29kZSA9PSAyNTApCi0gICAgewotICAgICAgLyogd2FzIHJlYWxseSBhIHBzZXVkbyBvcCAqLwotCi0gICAgICBwc2V1ZG9fdHlwZVMgKnA7Ci0gICAgICBjaGFyIG9jOwotCi0gICAgICBjaGFyICpvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqb3BfZW5kID0gYzsKLQotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcF9lbmQ7Ci0KLSAgICAgIG9jID0gKm9sZDsKLSAgICAgICpvbGQgPSAnXG4nOwotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgcCA9IChwc2V1ZG9fdHlwZVMgKikgKG9wY29kZS0+ZnVuYyk7Ci0KLSAgICAgIChwLT5wb2NfaGFuZGxlcikgKHAtPnBvY192YWwpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkOwotICAgICAgKm9sZCA9IG9jOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGdldF9vcGVyYW5kcyAob3Bjb2RlLCBvcF9lbmQsCi0JCQkJCSBvcGVyYW5kKTsKLSAgICAgIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotCi0gICAgICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLSAgICAgIGlmIChvcGNvZGUgPT0gMCkKLQl7Ci0JICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLwotCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDIpOwotCi0JICB3aGVyZVswXSA9IDB4MDsKLQkgIHdoZXJlWzFdID0gMHgwOwotCi0JICBhc19iYWQgKF8oIkNhbid0IGZpbmQgb3Bjb2RlIHRvIG1hdGNoIG9wZXJhbmRzIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0gICAgfQotfQotCi12b2lkCi1ERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi1zeW1ib2xTICoKLURFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCi0gICAgICAgY2hhciAqbmFtZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLURFRlVOICh0Y19oZWFkZXJzX2hvb2ssIChoZWFkZXJzKSwKLSAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJ6OiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAneic6Ci0gICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiODAwMSIpKQotCXNfc2VnbSAoKTsKLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIjgwMDIiKSkKLQlzX3Vuc2VnICgpOwotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgLXolcyIpLCBhcmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLVo4SyBvcHRpb25zOlxuXAotLXo4MDAxCQkJZ2VuZXJhdGUgc2VnbWVudGVkIGNvZGVcblwKLS16ODAwMgkJCWdlbmVyYXRlIHVuc2VnbWVudGVkIGNvZGVcbiIpKTsKLX0KLQwKLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19hb3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0byBtZF9jb252ZXJ0X2ZyYWcgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi12YWx1ZVQKLURFRlVOIChtZF9zZWN0aW9uX2FsaWduLCAoc2VnLCBzaXplKSwKLSAgICAgICBzZWdUIHNlZyBBTkQKLSAgICAgICB2YWx1ZVQgc2l6ZSkKLXsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pIC0gMSkgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOwotCi19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSU1NNEw6Ci0gICAgICBidWZbMF0gPSAoYnVmWzBdICYgMHhmMCkgfCAoKGJ1ZlswXSArIHZhbCkgJiAweGYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSlI6Ci0KLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIC8qICAgIGlmICh2YWwgIT0gMCkgYWJvcnQoKTsqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRElTUDc6Ci0KLSAgICAgICpidWYrKyArPSB2YWw7Ci0gICAgICAvKiAgICBpZiAodmFsICE9IDApIGFib3J0KCk7Ki8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTg6Ci0gICAgICBidWZbMF0gKz0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTE2OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU0zMjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0jaWYgMAotICAgIGNhc2UgUl9EQSB8IFJfU0VHOgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAweDAwOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIDA6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBmaXhQLT5meF9zaXplKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgfQotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBwcmludGYgKF8oImNhbGwgdG9tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi12b2lkCi1ERUZVTiAobWRfbnVtYmVyX3RvX2NoYXJzLCAocHRyLCB1c2UsIG5ieXRlcyksCi0gICAgICAgY2hhciAqcHRyIEFORAotICAgICAgIHZhbHVlVCB1c2UgQU5ECi0gICAgICAgaW50IG5ieXRlcykKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBhYm9ydCAoKTsKLX0KLQotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChzKQotICAgICBzeW1ib2xTICpzOwotewotfQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgaWYgKGZpeF9wdHItPmZ4X2FkZHN5ICYmCi0gICAgICBmaXhfcHRyLT5meF9zdWJzeSkgCi0gICAgewotICAgICAgc3ltYm9sUyAqYWRkID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0gICAgICBzeW1ib2xTICpzdWIgPSBmaXhfcHRyLT5meF9zdWJzeTsKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UKGFkZCkgIT0gU19HRVRfU0VHTUVOVChzdWIpKQotCXsKLQkgIGFzX2JhZChfKCJDYW4ndCBzdWJ0cmFjdCBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyAlcyAlcyIpLAotCQkgU19HRVRfTkFNRShhZGQpLCBTX0dFVF9OQU1FKHN1YikpOwotCX0KLSAgICAgIGVsc2UgewotCWludCBkaWZmID0gU19HRVRfVkFMVUUoYWRkKSAtIFNfR0VUX1ZBTFVFKHN1Yik7Ci0JZml4X3B0ci0+ZnhfYWRkc3kgPSAwOwotCWZpeF9wdHItPmZ4X3N1YnN5ID0gMDsKLQlmaXhfcHRyLT5meF9vZmZzZXQgKz0gZGlmZjsKLSAgICAgIH0KLSAgICB9Ci0gIHN5bWJvbF9wdHIgPSBmaXhfcHRyLT5meF9hZGRzeTsKLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgYXR0YWNoZWQgdG8gYSBzeW1ib2wgdGhlbiBpdCdzIG9rCi0gICAgIHRvIG91dHB1dCBpdCAqLwotICBpZiAoZml4X3B0ci0+Znhfcl90eXBlID09IDApCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uICovCi0gICAgICBzd2l0Y2ggKGZpeF9wdHItPmZ4X3NpemUpCi0JewotCWNhc2UgMjoKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NMTY7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTg7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTMyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludHItPnJfdHlwZSA9IGZpeF9wdHItPmZ4X3JfdHlwZTsKLSAgICB9Ci0KLSAgaW50ci0+cl92YWRkciA9IGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZSArIGJhc2U7Ci0gIGludHItPnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotCi0gIGlmIChzeW1ib2xfcHRyKQotICAgIGludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotICBlbHNlCi0gICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy16OGsuaCBiL2dhcy9jb25maWcvdGMtejhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGI2NTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy16OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy16OGsuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIsIDkzLCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBUQ19aOEsKLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7Ci0jZW5kaWYKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTCh4KSAwCi0jZW5kaWYKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgYWJvcnQoKTsKLQotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF96OGsKLSNkZWZpbmUgQ09GRl9NQUdJQyAweDgwMDAKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKDEpCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIlppbG9nIFo4MDAwIEdBUyAiCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLSNkZWZpbmUgUkVMT0NfMzIgMTIzNAotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogZW5kIG9mIHRjLXo4ay5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLTM4NmJzZC5oIGIvZ2FzL2NvbmZpZy90ZS0zODZic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmZjk5MC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLTM4NmJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogdGUtMzg2YnNkLmggLS0gMzg2QlNEIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBURV8zODZCU0QJMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGUtc3VuMy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWF1eC5oIGIvZ2FzL2NvbmZpZy90ZS1hdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZmEwMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWF1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI2RlZmluZSBURV9BVVgKLQotLyogRnJvbSBvYmotY29mZi5oOgotICAgVGhpcyBpbnRlcm5hbF9saW5lbm8gY3JhcCBpcyB0byBzdG9wIG5hbWVzcGFjZSBwb2xsdXRpb24gZnJvbSB0aGUKLSAgIGJmZCBpbnRlcm5hbCBjb2ZmIGhlYWRlcmZpbGUuICovCi0jZGVmaW5lIGludGVybmFsX2xpbmVubyBiZmRfaW50ZXJuYWxfbGluZW5vCi0jaW5jbHVkZSAiY29mZi9hdXgtY29mZi5oIgkvKiBvdmVycmlkZSBiaXRzIGluIGNvZmYvaW50ZXJuYWwuaCAqLwotI3VuZGVmIGludGVybmFsX2xpbmVubwotCi0jZGVmaW5lIENPRkZfTk9MT0FEX1BST0JMRU0KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLSNpZm5kZWYgTE9DQUxfTEFCRUxTX0ZCCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZGVsdDg4LmggYi9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNkNmI3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZGVsdDg4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGUtZGVsdGE4OC5oLiAgKi8KLQotI2RlZmluZSBURV9ERUxUQTg4IDEKLQotI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCTEKLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIJMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIJCTEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZGVsdGEuaCBiL2dhcy9jb25maWcvdGUtZGVsdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2YzYyYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWRlbHRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jZGVmaW5lIFRFX0RFTFRBCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLSNkZWZpbmUgQ09GRl9OT0xPQURfUFJPQkxFTQkxCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAkxCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSCTEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCCQkxCi0KLS8qIGVuZCBvZiB0ZS1kZWx0YS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRweDIuaCBiL2dhcy9jb25maWcvdGUtZHB4Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTM0MWNhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZHB4Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLyogTWFjaGluZSBzcGVjaWZpYyBkZWZpbmVzIGZvciB0aGUgZHB4MiBtYWNoaW5lICovCi0KLS8qIFRoZSBtYWdpYyBudW1iZXIgaXMgbm90IHRoZSB1c3VhbCBNQzY4TUFHSUMuICovCi0jZGVmaW5lIENPRkZfTUFHSUMgICAgICAgTUM2OEtCQ1NNQUdJQwotCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCAxCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1tNjhrLXVuIgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtZHB4Mi5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWR5bml4LmggYi9nYXMvY29uZmlnL3RlLWR5bml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllN2IzMGYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1keW5peC5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vKiBUaGlzIGlzIGZvciBpMzg2LXNlcXVlbnQtYnNkLiAgVGhlIGFzc2VtYmxlciBwcm9iYWJseSBkb2VzIG5vdAotICAgYWN0dWFsbHkgd29yaywgYXMgdGhlIHN1cHBvcnQgaW4gQkZEIGlzIG5vdCBjb21wbGV0ZSBhcyBvZiB0aGlzCi0gICB3cml0aW5nLiAgU2VlIGJmZC9pMzg2LWR5bml4LmMuICAqLwotCi0jZGVmaW5lIFRFX0RZTklYIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oIGIvZ2FzL2NvbmZpZy90ZS1lcG9jLXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNWY5MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1lcG9jLXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNkZWZpbmUgVEVfUEUKLSNkZWZpbmUgVEVfRVBPQwotI2RlZmluZSBMRVhfQVQgMSAvKiBjYW4gaGF2ZSBAJ3MgaW5zaWRlIGxhYmVscyAqLwotCi0vKiBUaGUgUEUgZm9ybWF0IHN1cHBvcnRzIGxvbmcgc2VjdGlvbiBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWdlbmVyaWMuaCBiL2dhcy9jb25maWcvdGUtZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGVkYTQ1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZ2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gKiB0YXJnZXQgZW52aXJvbm1lbnQgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotICoKLSAqIEl0IGlzIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSB3aWxsIGV2b2x2ZSBpbnRvIGEgZmlsZSBzdWl0YWJsZSBmb3IgY29uZmlnLAotICogY29tcGlsZSwgYW5kIGNvcHlpbmcgYXMgYW4gYWlkIGZvciB0ZXN0aW5nIGFuZCBwb3J0aW5nLiAgeG94b3JpY2guCi0gKi8KLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLwotI2lmZGVmIE9CSl9IRUFERVIKLSNpbmNsdWRlIE9CSl9IRUFERVIKLSNlbHNlCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotI2VuZGlmCi0KLS8qIGVuZCBvZiB0ZS1nZW5lcmljLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZ28zMi5oIGIvZ2FzL2NvbmZpZy90ZS1nbzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZmJkMmUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1nbzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWdvMzIuaAotICovCi0KLSNkZWZpbmUgVEVfR08zMgotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtZ28zMiIKLQotLyogR0FTIHNob3VsZCB0cmVhdCAnLmFsaWduIHZhbHVlJyBhcyBhbiBhbGlnbm1lbnQgb2YgMioqdmFsdWUgKi8KLSNkZWZpbmUgVVNFX0FMSUdOX1BUV08KLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWhwMzAwLmggYi9nYXMvY29uZmlnL3RlLWhwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOTRhYjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1ocDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogdGUtaHAzMDAuaCAtLSBocHV4IDkwMDAvMzAwIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLWhwMzAwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtaHBwYS5oIGIvZ2FzL2NvbmZpZy90ZS1ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzRmYTcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBNYWNoaW5lIHNwZWNpZmljIGRlZmluZXMgZm9yIHRoZSBQQSBtYWNoaW5lCi0gICBDb3B5cmlnaHQgMTk4NywgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCUhQIFBBLVJJU0MgYW5kIE9TRi8xIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yCi0JU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLgotICovCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pMzg2YWl4LmggYi9nYXMvY29uZmlnL3RlLWkzODZhaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmMDk0NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWkzODZhaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtaTM4NmFpeC5oIGFuZCBpcyBidWlsdCBmcm9tIHBpZWNlcyBvZiBjb2RlIGZyb20gTWluaCBUcmFuLUxlCi0gKiA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4gYnkgcmljaEBjeWdudXMuY29tLgotICovCi0KLSNkZWZpbmUgVEVfSTM4NkFJWCAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qCi0gKiBVbmRlZmluZSBSRVZFUlNFX1NPUlRfUkVMT0NTIHRvIGtlZXAgdGhlIHJlbG9jYXRpb24gZW50cmllcyBzb3J0ZWQKLSAqIGluIGFzY2VuZGluZyB2YWRkci4KLSAqLwotI3VuZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKLQotLyoKLSAqIERlZmluZSBLRUVQX1JFTE9DX0lORk8gc28gdGhhdCB0aGUgc3RyaXAgcmVsb2MgaW5mbyBmbGFnIEZfUkVMRkxHCi0gKiBpcyBub3QgdXNlZCBpbiB0aGUgZmlsZWhkciBmb3IgQ09GRiBvdXRwdXQuCi0gKi8KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDc5Ci0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRlLWkzODZhaXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oIGIvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzMxZmI5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtaWM5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0ZS1pYzk2MC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiwgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWljOTYwLmggYW5kIGlzIGludGVuZGVkIHRvIGRlZmluZSBpYzk2MCBlbnZpcm9ubWVudAotICogc3BlY2lmaWMgZGlmZmVyZW5jZXMuCi0gKi8KLQotI2RlZmluZSBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKChuYW1lWzBdID09J0wnKSBcCi0JCQkgICB8fCAobmFtZVswXSA9PScuJyBcCi0JCQkgICAgICAgJiYgKG5hbWVbMV09PSdDJyBcCi0JCQkJICAgfHwgbmFtZVsxXT09J0knIFwKLQkJCQkgICB8fCBuYW1lWzFdPT0nLicpKSkKLSNlbmRpZgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtaWM5NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1saW51eC5oIGIvZ2FzL2NvbmZpZy90ZS1saW51eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM1YTdhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI2RlZmluZSBURV9MSU5VWAotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1sbmV3cy5oIGIvZ2FzL2NvbmZpZy90ZS1sbmV3cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2JjYzVhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbG5ld3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotLyogdGUtbG5ld3MuaCAtLSBsaXR0bGUtZW5kaWFuIE5FV1MgZW11bGF0aW9uLiAgKi8KLQotI2RlZmluZSBFQ09GRl9MSVRUTEVfRk9STUFUICJlY29mZi1iaWdsaXR0bGVtaXBzIgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1seW54LmggYi9nYXMvY29uZmlnL3RlLWx5bnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4NTE1ZC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWx5bnguaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2RlZmluZSBURV9MWU5YCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLSNpZm5kZWYgTE9DQUxfTEFCRUxTX0ZCCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbWFjaC5oIGIvZ2FzL2NvbmZpZy90ZS1tYWNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NTQ3ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1tYWNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNkZWZpbmUgVEVfTWFjaAotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbWFjb3MuaCBiL2dhcy9jb25maWcvdGUtbWFjb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0OGRjNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW1hY29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGUtbWFjb3MuaC4gICovCi0KLSNkZWZpbmUgVEVfUE9XRVJNQUMgMQotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW11bHRpLmggYi9nYXMvY29uZmlnL3RlLW11bHRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZWRhNDUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1tdWx0aS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gKiB0YXJnZXQgZW52aXJvbm1lbnQgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotICoKLSAqIEl0IGlzIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSB3aWxsIGV2b2x2ZSBpbnRvIGEgZmlsZSBzdWl0YWJsZSBmb3IgY29uZmlnLAotICogY29tcGlsZSwgYW5kIGNvcHlpbmcgYXMgYW4gYWlkIGZvciB0ZXN0aW5nIGFuZCBwb3J0aW5nLiAgeG94b3JpY2guCi0gKi8KLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLwotI2lmZGVmIE9CSl9IRUFERVIKLSNpbmNsdWRlIE9CSl9IRUFERVIKLSNlbHNlCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotI2VuZGlmCi0KLS8qIGVuZCBvZiB0ZS1nZW5lcmljLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbmJzZC5oIGIvZ2FzL2NvbmZpZy90ZS1uYnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZTQ2MDAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1uYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiB0ZS1uYnNkLmggLS0gTmV0QlNEIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBURV9OZXRCU0QJMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbmJzZDUzMi5oIGIvZ2FzL2NvbmZpZy90ZS1uYnNkNTMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZjllNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1uYnNkNTMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLW5ldGJzZDUzMi5oCi0gKgotICogV3JpdHRlbiBieSBJYW4gRGFsbCA8aWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXU+Ci0gKiAKLSAqIDE5LUp1bi05NAotICogCi0gKi8KLQotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtbnMzMmstbmV0YnNkIgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBNYXliZSB0aGVzZSBzaG91bGQgYmUgbW9yZSBsaWtlIFRDX05TMzI1MzIgYW5kIFRDX05TMzIzODEgaW4gY2FzZQotICogb2YgY29uZmxpY3RzLiBOUzMyMzgxIGlzIHVzZWQgaW4gb3Bjb2RlL25zMzJrLmggYW5kIHRoYXQgaXMgYWxzbwotICogdXNlZCBieSBHREIuIE5lZWQgdG8gY2hlY2suCi0gKi8KLSNkZWZpbmUgTlMzMjUzMgotI2RlZmluZSBOUzMyMzgxCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBjNTMybWFjaC5oIGIvZ2FzL2NvbmZpZy90ZS1wYzUzMm1hY2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlN2ZmOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXBjNTMybWFjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1wYzUzMi5oCi0gKgotICogV3JpdHRlbiBieSBJYW4gRGFsbCA8aWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXU+Ci0gKiAKLSAqIDI0LU1heS05NAotICogCi0gKi8KLQotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtcGM1MzItbWFjaCIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogTWF5YmUgdGhlc2Ugc2hvdWxkIGJlIG1vcmUgbGlrZSBUQ19OUzMyNTMyIGFuZCBUQ19OUzMyMzgxIGluIGNhc2UKLSAqIG9mIGNvbmZsaWN0cy4gTlMzMjM4MSBpcyB1c2VkIGluIG9wY29kZS9uczMyay5oIGFuZCB0aGF0IGlzIGFsc28KLSAqIHVzZWQgYnkgR0RCLiBOZWVkIHRvIGNoZWNrLgotICovCi0jZGVmaW5lIE5TMzI1MzIKLSNkZWZpbmUgTlMzMjM4MQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wZS5oIGIvZ2FzL2NvbmZpZy90ZS1wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzFmMGIyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2RlZmluZSBURV9QRQotI2RlZmluZSBMRVhfQVQgMSAvKiBjYW4gaGF2ZSBAJ3MgaW5zaWRlIGxhYmVscyAqLwotCi0vKiBUaGUgUEUgZm9ybWF0IHN1cHBvcnRzIGxvbmcgc2VjdGlvbiBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBwY253LmggYi9nYXMvY29uZmlnL3RlLXBwY253LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGYwNTAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1wcGNudy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogdGUtcHBjbncuaCAtLSBQb3dlciBQQyBydW5uaW5nIE5ldHdhcmUgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGdjYyB1c2VzIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHBwYy9uZXR3YXJlICovCi0KLSN1bmRlZiBOT19TVFJJTkdfRVNDQVBFUwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wc29zLmggYi9nYXMvY29uZmlnL3RlLXBzb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkNDE1My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXBzb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtcHNvcy5oIGZvciBlbWJlZGRlZCBzeXN0ZW1zIHJ1bm5pbmcgcFNPUy4KLSAqIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBBbmFudGhhcmFtYW4gKG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZSkKLSAqLwotCi0jZGVmaW5lIFRFX1BTT1MKLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIFRoaXMgbWFrZXMgR0FTIG1vcmUgdmVyc2F0aWxlIGFuZCBibG9ja3Mgc29tZSBFTEYnaXNtcyBpbgotICAgdGMtbTY4ay5oLiAqLwotCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGVuZCBvZiB0ZS1wc29zLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcmlzY2l4LmggYi9nYXMvY29uZmlnL3RlLXJpc2NpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzcyNTNlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcmlzY2l4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNkZWZpbmUgVEVfUklTQ0lYCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXNwYXJjYW91dC5oIGIvZ2FzL2NvbmZpZy90ZS1zcGFyY2FvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxMDE4NC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXNwYXJjYW91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogdGUtc3BhcmNhb3V0LmggLS0gZW1iZWRkZWQgc3BhcmMtYW91dCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEVfU1BBUkNBT1VUCTEKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXN1bjMuaCBiL2dhcy9jb25maWcvdGUtc3VuMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzVkNDJiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtc3VuMy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogdGUtc3VuMy5oIC0tIFN1bi0zIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgI2RlZmluZXMgc3BlY2lmaWMKLSAgIHRvIFNVTiBjb21wdXRlciBTVU4gMyBzZXJpZXMgY29tcHV0ZXJzLiAgKFRoZSBvbmx5IGtpbmQKLSAgIHdlIGhhdmUgYXJvdW5kIGhlcmUsIHVuZm9ydHVuYXRseS4pCi0KLSAgIFJ1bW9yIGhhcyBpdCB0aGF0IHRoaXMgZmlsZSB3aWxsIHdvcmsgb24gdGhlIFN1bi0yIGlmIHRoZSBhc3NlbWJsZXIKLSAgIGlzIGNhbGxlZCB3aXRoIC1tNjgwMTAgIFRoaXMgaXMgbm90IHRlc3RlZC4gICovCi0KLQotI2RlZmluZSBURV9TVU4zCTEKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogQ291bGQgYWxzbyBiZSA6Ci0gICAjZGVmaW5lIFNfTE9DQUxfTkFNRShzKQkoU19HRVRfTkFNRShzKVswXSA9PSAnLicgJiYKLSAgIFNfR0VUX05BTUUocylbMV0gPT0gJ0wnIHx8Ci0gICBTX0dFVF9OQU1FKHMpWzFdID09ICcuJykKLSAgICovCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0ZS1zdW4zLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3ZyNC5oIGIvZ2FzL2NvbmZpZy90ZS1zdnI0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTdlZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1zdnI0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNkZWZpbmUgVEVfU1ZSNAotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zeXN2MzIuaCBiL2dhcy9jb25maWcvdGUtc3lzdjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2U2ZTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1zeXN2MzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLyogUmVtb3ZlIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIHRoZSBnY2MgZ2VuZXJhdGVkIHN5bWJvbCBuYW1lcyAqLwotI2RlZmluZSBTVFJJUF9VTkRFUlNDT1JFCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGVuZCBvZiB0ZS1zeXN2MzIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92YXgtaW5zdC5oIGIvZ2FzL2NvbmZpZy92YXgtaW5zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ4Zjk4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdmF4LWluc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qIHZheC1pbnN0LmggLSBHTlUgLSBQYXJ0IG9mIHZheC5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTIsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgaXMgcGFydCBvZiB2YXgtaW5zLXBhcnNlLmMgJiBmcmllbmRzLgotICogV2Ugd2FudCB0byBwYXJzZSBhIHZheCBpbnN0cnVjdGlvbiB0ZXh0IGludG8gYSB0cmVlIGRlZmluZWQgaGVyZS4KLSAqLwotCi0jZGVmaW5lIFZJVF9NQVhfT1BFUkFORFMgKDYpCS8qIG1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGluIG9uZSAgICAgICAqLwotLyogc2luZ2xlIHZheCBpbnN0cnVjdGlvbiAqLwotCi1zdHJ1Y3Qgdm9wCQkJLyogdmF4IGluc3RydWN0aW9uIG9wZXJhbmQgICAgICAgICAgICAgICAgICovCi17Ci0gIHNob3J0IGludCB2b3BfbmR4OwkJLyogLTEsIG9yIGluZGV4IHJlZ2lzdGVyLiBlZyA3PVtSN10JICAgKi8KLSAgc2hvcnQgaW50IHZvcF9yZWc7CQkvKiAtMSwgb3IgcmVnaXN0ZXIgbnVtYmVyLiBlZyBASV4jPTB4RiAgICAgKi8KLSAgLyogSGVscHMgZGlzdGluZ3Vpc2ggImFicyIgZnJvbSAiYWJzKFBDKSIuICovCi0gIHNob3J0IGludCB2b3BfbW9kZTsJCS8qIGFkZHJlc3NpbmcgbW9kZSA0IGJpdHMuIGVnIEleIz0weDkJICAgKi8KLSAgY2hhciB2b3Bfc2hvcnQ7CQkvKiBvcGVyYW5kIGRpc3BsYWNlbWVudCBsZW5ndGggYXMgd3JpdHRlbiAgKi8KLSAgLyogJyAnPW5vbmUsICJiaWxzdyI9Ql5JXkxeU15XXi4gICAgICAgICAgICovCi0gIGNoYXIgdm9wX2FjY2VzczsJCS8qICdiJ2JyYW5jaCAnICduby1pbnN0cnVjdGlvbiAnYW1ydncnbm9ybSAqLwotICBjaGFyIHZvcF93aWR0aDsJCS8qIE9wZXJhbmQgd2lkdGgsIG9uZSBvZiAiYmRmZ2hsb3F3IgkgICAqLwotICBjb25zdCBjaGFyICp2b3Bfd2FybjsJCS8qIHdhcm5pbmcgbWVzc2FnZSBvZiB0aGlzIG9wZXJhbmQsIGlmIGFueSAqLwotICBjb25zdCBjaGFyICp2b3BfZXJyb3I7CS8qIHNheSBpZiBvcGVyYW5kIGlzIGluYXBwcm9wcmlhdGUgICAgICAgICAqLwotICBjaGFyICp2b3BfZXhwcl9iZWdpbjsJCS8qIFVucGFyc2VkIGV4cHJlc3Npb24sIDFzdCBjaGFyIC4uLgkgICAqLwotICBjaGFyICp2b3BfZXhwcl9lbmQ7CQkvKiAuLi4gbGFzdCBjaGFyLgkJCSAgICovCi0gIHVuc2lnbmVkIGNoYXIgdm9wX25ieXRlczsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGRhdHVtCQkgICAqLwotfTsKLQotCi10eXBlZGVmIGxvbmcgdmF4X29wY29kZVQ7CS8qIEZvciBpbml0aWFsaXNpbmcgYXJyYXkgb2Ygb3Bjb2RlcwkgICAqLwotLyogU29tZSBzeW50aGV0aWMgb3Bjb2RlcyA+IDE2IGJpdHMhICAgICAgICovCi0KLSNkZWZpbmUgVklUX09QQ09ERV9TWU5USEVUSUMgMHg4MDAwMDAwMAkvKiBOb3QgcmVhbCBoYXJkd2FyZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFZJVF9PUENPREVfU1BFQ0lBTCAgIDB4NDAwMDAwMDAJLyogTm90IG5vcm1hbCBicmFuY2ggb3B0aW1pc2luZy4gICAqLwotLyogTmV2ZXIgc2V0IHdpdGhvdXQgLi4uX1NZTlRIRVRJQyAqLwotCi0jZGVmaW5lIFZBWF9XSURUSF9VTkNPTkRJVElPTkFMX0pVTVAgJy0nCS8qIFRoZXNlIGFyZSBlbmNvZGVkIGludG8gICAgICAgICAqLwotI2RlZmluZSBWQVhfV0lEVEhfQ09ORElUSU9OQUxfSlVNUCAgICc/JwkvKiB2b3Bfd2lkdGggd2hlbiB2b3BfYWNjZXNzPT0nYicgKi8KLSNkZWZpbmUgVkFYX1dJRFRIX1dPUkRfSlVNUCAgICAgICAgICAnIScJLyogYW5kIFZJVF9PUENPREVfU1lOVEhFVElDIHNldC4gICovCi0jZGVmaW5lIFZBWF9XSURUSF9CWVRFX0pVTVAJICAgICAnOicJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgVkFYX0pNUCAoMHgxNykJCS8qIFVzZWZ1bCBmb3IgYnJhbmNoIG9wdGltaXNpbmcuIEp1bXAgaW5zdHIqLwotI2RlZmluZSBWQVhfUENfUkVMQVRJVkVfTU9ERSAoMHhlZikJLyogVXNlIGl0IGFmdGVyIFZBWF9KTVAJCSAgICovCi0jZGVmaW5lIFZBWF9BQlNPTFVURV9NT0RFICgweDlGKS8qIFVzZSBhcyBAIy4uLgkJCSAgICovCi0jZGVmaW5lIFZBWF9CUkIgKDB4MTEpCQkvKiBDYW5vbmljYWwgYnJhbmNoLgkJCSAgICovCi0jZGVmaW5lIFZBWF9CUlcgKDB4MzEpCQkvKiBBbm90aGVyIGNhbm9uaWNhbCBicmFuY2gJCSAgICovCi0jZGVmaW5lIFZBWF9XSURFTl9XT1JEICgweDIwKQkvKiBBZGQgdGhpcyB0byBieXRlIGJyYW5jaCB0byBnZXQgd29yZCBici4gKi8KLSNkZWZpbmUgVkFYX1dJREVOX0xPTkcgKDB4NikJLyogQWRkIHRoaXMgdG8gYnl0ZSBicmFuY2ggdG8gZ2V0IGxvbmcgam1wLiovCi0vKiBOZWVkcyBWQVhfUENfUkVMQVRJVkVfTU9ERSBieXRlIGFmdGVyIGl0Ki8KLQotc3RydWN0IHZpdAkJCS8qIHZheCBpbnN0cnVjdGlvbiB0cmVlICAgICAgICAgICAgICAgICAgICAqLwotewotICAvKiB2aXRfb3Bjb2RlIGlzIGNoYXJbXSBmb3IgcG9ydGFiaWxpdHkuICAgKi8KLSAgY2hhciB2aXRfb3Bjb2RlW3NpemVvZiAodmF4X29wY29kZVQpXTsKLSAgdW5zaWduZWQgY2hhciB2aXRfb3Bjb2RlX25ieXRlczsJLyogSG93IGxvbmcgaXMgX29wY29kZT8gKGNoYXJzKQkgICAqLwotICB1bnNpZ25lZCBjaGFyIHZpdF9vcGVyYW5kczsJLyoJCQkJCSAgICovCi0gIHN0cnVjdCB2b3Agdml0X29wZXJhbmRbVklUX01BWF9PUEVSQU5EU107CS8qIG9wZXJhbmRzICAgICAgICAgICAgICovCi0gIGNvbnN0IGNoYXIgKnZpdF9lcnJvcjsJLyogIiIgb3IgZXJyb3IgdGV4dCAqLwotfTsKLQotLyogZW5kIG9mIHZheC1pbnN0LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdm1zLWEtY29uZi5oIGIvZ2FzL2NvbmZpZy92bXMtYS1jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OGZjNjguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy92bXMtYS1jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogdm1zLWFscGhhLWNvbmYuaC4gIEdlbmVyYXRlZCBtYW51YWxseSBmcm9tIGNvbmYuaW4sCi0gICBhbmQgdXNlZCBieSBjb25maWctZ2FzLWFscGhhLmNvbSB3aGVuIGNvbnN0cnVjdGluZyBjb25maWcuaC4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBDX0FMTE9DQQotI2Vsc2UKLSNkZWZpbmUgQ19BTExPQ0EKLSNlbmRpZgotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIGlubGluZQotI2Vsc2UKLSNkZWZpbmUgaW5saW5lCi0jZW5kaWYKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLQlTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0JU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0JU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gKC0xKQotCi0vKiBTaG91bGQgZ2FzIHVzZSBoaWdoLWxldmVsIEJGRCBpbnRlcmZhY2VzPyAgKi8KLSNkZWZpbmUgQkZEX0FTU0VNQkxFUgotCi0vKiBTb21lIGFzc2VydC9wcmVwcm9jZXNzb3IgY29tYmluYXRpb25zIGFyZSBpbmNhcGFibGUgb2YgaGFuZGxpbmcKLSAgIGNlcnRhaW4ga2luZHMgb2YgY29uc3RydWN0cyBpbiB0aGUgYXJndW1lbnQgb2YgYXNzZXJ0LiAgRm9yIGV4YW1wbGUsCi0gICBxdW90ZWQgc3RyaW5ncyAoaWYgcmVxdW90aW5nIGlzbid0IGRvbmUgcmlnaHQpIG9yIG5ld2xpbmVzLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIEJST0tFTl9BU1NFUlQKLSNlbHNlCi0jZGVmaW5lIEJST0tFTl9BU1NFUlQKLSNlbmRpZgotCi0vKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgY3Jvc3MtYXNzZW1ibGluZywgc29tZSBvcGVyYXRpb25zIGNhbiBiZSBvcHRpbWl6ZWQsCi0gICBzaW5jZSBieXRlIG9yZGVycyBhbmQgdmFsdWUgc2l6ZXMgZG9uJ3QgbmVlZCB0byBiZSBhZGp1c3RlZC4gICovCi0jdW5kZWYgQ1JPU1NfQ09NUElMRQotCi0vKiBTb21lIGdhcyBjb2RlIHdhbnRzIHRvIGtub3cgdGhlc2UgcGFyYW1ldGVycy4gICovCi0jZGVmaW5lIFRBUkdFVF9BTElBUwkiYWxwaGEtdm1zIgotI2RlZmluZSBUQVJHRVRfQ1BVCSJhbHBoYSIKLSNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTAkiYWxwaGEtZGVjLXZtcyIKLSNkZWZpbmUgVEFSR0VUX09TCSJvcGVuVk1TL0FscGhhIgotI2RlZmluZSBUQVJHRVRfVkVORE9SCSJkZWMiCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIG1hbGxvYyBhbmQgcmVhbGxvYy4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgZnJlZS4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi0KLS8qIFNvbWV0aW1lcyBlcnJuby5oIGRvZXNuJ3QgZGVjbGFyZSBlcnJubyBpdHNlbGYuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRVJSTk8KLQotI3VuZGVmIE1BTllfU0VHTUVOVFMKLQotLyogTmVlZGVkIG9ubHkgZm9yIHNwYXJjIGNvbmZpZ3VyYXRpb24gKi8KLSN1bmRlZiBzcGFyY3Y5Ci0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVtb3ZlIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9SRU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1bmxpbmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVU5MSU5LCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUREFSR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0gKLSNlbHNlCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotI2VuZGlmCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfVU5JU1REX0gJLyogY29uZmlnLWdhcy5jb20gd2lsbCBtYWtlIG9uZSBpZiBuZWNlc3NhcnkgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFyYXJncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQVJBUkdTX0gKLQotLyogVk1TLXNwZWNpZmljOiAgd2UgbmVlZCB0byBzZXQgdXAgRVhJVF94eHggaGVyZSBiZWNhdXNlIHRoZSBkZWZhdWx0Ci0gICB2YWx1ZXMgaW4gYXMuaCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgVk1TLCBidXQgd2UgYWxzbyB3YW50IHRvIHByZXZlbnQKLSAgIGFzLmgncyBpbmNsdXNpb24gb2YgPHN0ZGxpYi5oPiBmcm9tIHRyaWdnZXJpbmcgcmVkZWZpbml0aW9uIHdhcm5pbmdzLgotICAgPHN0ZGxpYi5oPiBndWFyZHMgaXRzZWxmIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLCBzbyBpbmNsdWRpbmcgaXQKLSAgIGhlcmUgdHVybnMgYXMuaCdzIGxhdGVyICNpbmNsdWRlIGludG8gYSBuby1vcC4gIChXZSBjYW4ndCBzaW1wbHkgdXNlCi0gICAjaWZuZGVmIEhBVkVfU1RETElCX0ggaGVyZSwgYmVjYXVzZSB0aGUgPHN0ZGxpYi5oPiBpbiBzZXZlcmFsIG9sZGVyCi0gICBnY2Mtdm1zIGRpc3RyaWJ1dGlvbnMgbmVnbGVjdHMgdG8gZGVmaW5lIHRoZXNlIHR3byByZXF1aXJlZCBtYWNyb3MuKSAgKi8KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZiBfX0RFQ0MKLSN1bmRlZiBFWElUX1NVQ0NFU1MKLSN1bmRlZiBFWElUX0ZBSUxVUkUKLSNkZWZpbmUgRVhJVF9TVUNDRVNTIDEJCQkvKiBTUyRfTk9STUFMLCBTVFMkS19TVUNDRVNTICovCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAweDEwMDAwMDAyCQkvKiAoU1RTJEtfRVJST1IgfCBTVFMkTV9JTkhJQl9NU0cpICovCi0jZW5kaWYKLQotI2luY2x1ZGUgPHVuaXhsaWIuaD4KLSNpZiBfX0RFQ0MKLWV4dGVybiBpbnQgc3RyY2FzZWNtcCAoKTsKLWV4dGVybiBpbnQgc3RybmNhc2VjbXAgKCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdm1zLWNvbmYuaCBiL2dhcy9jb25maWcvdm1zLWNvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyNWNmYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3Ztcy1jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyogdm1zLWNvbmYuaC4gIEdlbmVyYXRlZCBtYW51YWxseSBmcm9tIGNvbmYuaW4sCi0gICBhbmQgdXNlZCBieSBjb25maWctZ2FzLmNvbSB3aGVuIGNvbnN0cnVjdGluZyBjb25maWcuaC4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBDX0FMTE9DQQotI2Vsc2UKLSNkZWZpbmUgQ19BTExPQ0EKLSNlbmRpZgotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIGlubGluZQotI2Vsc2UKLSNkZWZpbmUgaW5saW5lCi0jZW5kaWYKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gKC0xKQotCi0vKiBEZWZpbmUgaWYgbGV4IGRlY2xhcmVzIHl5dGV4dCBhcyBhIGNoYXIgKiBieSBkZWZhdWx0LCBub3QgYSBjaGFyW10uICAqLwotI3VuZGVmIFlZVEVYVF9QT0lOVEVSCi0KLS8qIE5hbWUgb2YgcGFja2FnZS4gICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG9mIHBhY2thZ2UuICAqLwotLyogRGVmaW5lIGluIGJ5IGNvbmZpZy1nYXMuY29tICovCi0vKiAjdW5kZWYgVkVSU0lPTiAqLwotCi0vKiBTaG91bGQgZ2FzIHVzZSBoaWdoLWxldmVsIEJGRCBpbnRlcmZhY2VzPyAgKi8KLSN1bmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFNvbWUgYXNzZXJ0L3ByZXByb2Nlc3NvciBjb21iaW5hdGlvbnMgYXJlIGluY2FwYWJsZSBvZiBoYW5kbGluZwotICAgY2VydGFpbiBraW5kcyBvZiBjb25zdHJ1Y3RzIGluIHRoZSBhcmd1bWVudCBvZiBhc3NlcnQuICBGb3IgZXhhbXBsZSwKLSAgIHF1b3RlZCBzdHJpbmdzIChpZiByZXF1b3RpbmcgaXNuJ3QgZG9uZSByaWdodCkgb3IgbmV3bGluZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgQlJPS0VOX0FTU0VSVAotI2Vsc2UKLSNkZWZpbmUgQlJPS0VOX0FTU0VSVAotI2VuZGlmCi0KLS8qIElmIHdlIGFyZW4ndCBkb2luZyBjcm9zcy1hc3NlbWJsaW5nLCBzb21lIG9wZXJhdGlvbnMgY2FuIGJlIG9wdGltaXplZCwKLSAgIHNpbmNlIGJ5dGUgb3JkZXJzIGFuZCB2YWx1ZSBzaXplcyBkb24ndCBuZWVkIHRvIGJlIGFkanVzdGVkLiAgKi8KLSN1bmRlZiBDUk9TU19DT01QSUxFCi0KLS8qIFNvbWUgZ2FzIGNvZGUgd2FudHMgdG8ga25vdyB0aGVzZSBwYXJhbWV0ZXJzLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FMSUFTCSJ2bXMiCi0jZGVmaW5lIFRBUkdFVF9DUFUJInZheCIKLSNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTAkidmF4LWRlYy12bXMiCi0jZGVmaW5lIFRBUkdFVF9PUwkidm1zIgotI2RlZmluZSBUQVJHRVRfVkVORE9SCSJkZWMiCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIHN0cnN0ci4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgbWFsbG9jIGFuZCByZWFsbG9jLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBmcmVlLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgc2Jyay4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0KLS8qIFNvbWV0aW1lcyBlcnJuby5oIGRvZXNuJ3QgZGVjbGFyZSBlcnJubyBpdHNlbGYuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRVJSTk8KLQotI3VuZGVmIE1BTllfU0VHTUVOVFMKLQotLyogVGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGVmaW5lcyB0aGlzIGZvciBzb21lIHRhcmdldHMgYmFzZWQgb24gdGhlCi0gICB0YXJnZXQgbmFtZSB1c2VkLiAgSXQgaXMgbm90IGFsd2F5cyBkZWZpbmVkLiAgKi8KLSN1bmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotCi0vKiBOZWVkZWQgb25seSBmb3Igc29tZSBjb25maWd1cmF0aW9ucyB0aGF0IGNhbiBwcm9kdWNlIG11bHRpcGxlIG91dHB1dAotICAgZm9ybWF0cy4gICovCi0jdW5kZWYgREVGQVVMVF9FTVVMQVRJT04KLSN1bmRlZiBFTVVMQVRJT05TCi0jdW5kZWYgVVNFX0VNVUxBVElPTlMKLSN1bmRlZiBPQkpfTUFZQkVfQU9VVAotI3VuZGVmIE9CSl9NQVlCRV9CT1VUCi0jdW5kZWYgT0JKX01BWUJFX0NPRkYKLSN1bmRlZiBPQkpfTUFZQkVfRUNPRkYKLSN1bmRlZiBPQkpfTUFZQkVfRUxGCi0jdW5kZWYgT0JKX01BWUJFX0dFTkVSSUMKLSN1bmRlZiBPQkpfTUFZQkVfSFAzMDAKLSN1bmRlZiBPQkpfTUFZQkVfSUVFRQotI3VuZGVmIE9CSl9NQVlCRV9TT00KLSN1bmRlZiBPQkpfTUFZQkVfVk1TCi0KLS8qIFVzZWQgZm9yIHNvbWUgb2YgdGhlIENPRkYgY29uZmlndXJhdGlvbnMsIHdoZW4gdGhlIENPRkYgY29kZSBuZWVkcwotICAgdG8gc2VsZWN0IHNvbWV0aGluZyBiYXNlZCBvbiB0aGUgQ1BVIHR5cGUgYmVmb3JlIGl0IGtub3dzIGl0Li4uICovCi0jdW5kZWYgSTM4NkNPRkYKLSN1bmRlZiBNNjhLQ09GRgotI3VuZGVmIE04OEtDT0ZGCi0KLS8qIFVzaW5nIGNnZW4gY29kZT8gICovCi0jdW5kZWYgVVNJTkdfQ0dFTgotCi0vKiBOZWVkZWQgb25seSBmb3Igc3BhcmMgY29uZmlndXJhdGlvbi4gICovCi0jdW5kZWYgREVGQVVMVF9BUkNICi0KLS8qIE5lZWRlZCBvbmx5IGZvciBQb3dlclBDIFNvbGFyaXMuICAqLwotI3VuZGVmIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQKLQotLyogTmVlZGVkIG9ubHkgZm9yIFNDTyA1LiAgKi8KLSN1bmRlZiBTQ09fRUxGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVtb3ZlIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9SRU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLS8qIHNicmsoKSBpcyBhdmFpbGFibGUsIGJ1dCB3ZSBkb24ndCB3YW50IGdhcyB0byB1c2UgaXQuICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVubGluayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VTkxJTksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0VSUk5PX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1REQVJHX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAotI2Vsc2UKLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0jZW5kaWYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSAkvKiBjb25maWctZ2FzLmNvbSB3aWxsIG1ha2Ugb25lIGlmIG5lY2Vzc2FyeSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotCi0vKiBWTVMtc3BlY2lmaWM6ICB3ZSBuZWVkIHRvIHNldCB1cCBFWElUX3h4eCBoZXJlIGJlY2F1c2UgdGhlIGRlZmF1bHQKLSAgIHZhbHVlcyBpbiBhcy5oIGFyZSBpbmFwcHJvcHJpYXRlIGZvciBWTVMsIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gcHJldmVudAotICAgYXMuaCdzIGluY2x1c2lvbiBvZiA8c3RkbGliLmg+IGZyb20gdHJpZ2dlcmluZyByZWRlZmluaXRpb24gd2FybmluZ3MuCi0gICA8c3RkbGliLmg+IGd1YXJkcyBpdHNlbGYgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24sIHNvIGluY2x1ZGluZyBpdAotICAgaGVyZSB0dXJucyBhcy5oJ3MgbGF0ZXIgI2luY2x1ZGUgaW50byBhIG5vLW9wLiAgKFdlIGNhbid0IHNpbXBseSB1c2UKLSAgICNpZm5kZWYgSEFWRV9TVERMSUJfSCBoZXJlLCBiZWNhdXNlIHRoZSA8c3RkbGliLmg+IGluIHNldmVyYWwgb2xkZXIKLSAgIGdjYy12bXMgZGlzdHJpYnV0aW9ucyBuZWdsZWN0cyB0byBkZWZpbmUgdGhlc2UgdHdvIHJlcXVpcmVkIG1hY3Jvcy4pICAqLwotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSN1bmRlZiBFWElUX1NVQ0NFU1MKLSN1bmRlZiBFWElUX0ZBSUxVUkUKLSNlbmRpZgotI2RlZmluZSBFWElUX1NVQ0NFU1MgMQkJCS8qIFNTJF9OT1JNQUwsIFNUUyRLX1NVQ0NFU1MgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDB4MTAwMDAwMDIJCS8qIChTVFMkS19FUlJPUiB8IFNUUyRNX0lOSElCX01TRykgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWd1cmUgYi9nYXMvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDQ0YzgxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw2MTE3ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyICB1c2UgQkZEIGJhY2sgZW5kIGZvciB3cml0aW5nIG9iamVjdCBmaWxlcyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gICAgdGFyZ2V0cyAgICAgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyBiZXNpZGVzIHRoZSBwcmltYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1hcy5oCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYwNzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Mjg6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0NjogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2ODE6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzM0OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc5MTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0KLVBBQ0tBR0U9Z2FzCi0KLVZFUlNJT049Mi45LjQKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4Mzc6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODUwOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4ODk6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTE4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxMTI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTYwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE2NTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTkzOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIzNjogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjYwOiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNjM6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjk5OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzE1OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM1MzogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogCVwoJGFjX3N5bWNvZGVcKSAJIAkqXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQyMDogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLQotZmkKLQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLWVjaG8gIiRhY190IiIkYWNfcmVzdWx0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTE4OiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTI3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MzA6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5jID4mNQotZmkKLXJtIC1yZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiIDE+JjYKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU1NjogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTU5OCAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU5OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjIwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYyNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjg3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc1NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotdXNlcl9iZmRfZ2FzPQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJmZC1hc3NlbWJsZXIgb3IgLS1kaXNhYmxlLWJmZC1hc3NlbWJsZXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfYmZkX2Fzc2VtYmxlcitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfYmZkX2Fzc2VtYmxlciIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIG5lZWRfYmZkPXllcyB1c2VyX2JmZF9nYXM9eWVzIDs7Ci0gIG5vKSAgdXNlcl9iZmRfZ2FzPW5vIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGdpdmVuIGZvciBiZmQtYXNzZW1ibGVyIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0JICAgIDs7Ci0gIG5vKQkgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopCSAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWZpCi0KLXVzaW5nX2NnZW49bm8KLQotIyBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlCi0KLQotCi0KLXRlX2ZpbGU9Z2VuZXJpYwotCi0jIE1ha2VmaWxlIHRhcmdldCBmb3IgaW5zdGFsbGluZyBnYXMgaW4gJCh0b29sZGlyKS9iaW4uCi1pbnN0YWxsX3Rvb2xkaXI9aW5zdGFsbC1leGVjLXRvb2xkaXIKLQotY2Fub25fdGFyZ2V0cz0iIgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgZm9yIHQgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2A7IGRvCi0gICAgcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdCAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLSAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0jICAgIGVsc2UKLSMgICAgICAjIFBlcm1pdCAiYWxsIiwgZXRjLiAgV2UgZG9uJ3Qgc3VwcG9ydCBpdCB5ZXQgdGhvdWdoLgotIyAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0IgotICAgIGZpCi0gIGRvbmUKLSAgX2dhc191bmlxX2xpc3Q9IiRjYW5vbl90YXJnZXRzIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgJF9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSAkX2dhc191bmlxX2kgaW4KLSAgX2dhc191bmlxX2R1bW15KSA7OwotICAqKSBjYXNlICIgJF9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiAkX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IiRfZ2FzX3VuaXFfbmV3bGlzdCAkX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotY2Fub25fdGFyZ2V0cz0kX2dhc191bmlxX25ld2xpc3QKLQotZmkKLQotZW11bGF0aW9ucz0iIgotCi1mb3IgdGhpc190YXJnZXQgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cyA7IGRvCi0KLSAgICBldmFsIGBlY2hvICR0aGlzX3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL2NwdT1cMSB2ZW5kb3I9XDIgb3M9XDMvJ2AKLQotICAgICMgY2hlY2sgZm9yIGFyY2hpdGVjdHVyZSB2YXJpYW50cwotICAgIGFyY2g9Ci0gICAgZW5kaWFuPQotICAgIGNhc2UgJHtjcHV9IGluCi0gICAgICBhbHBoYSopCQljcHVfdHlwZT1hbHBoYSA7OwotICAgICAgYXJtZWIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgYXJtKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmwpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtdipiKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKLSAgICAgIHN0cm9uZ2FybSopCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICB0aHVtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgaHBwYSopCQljcHVfdHlwZT1ocHBhIDs7Ci0gICAgICBpWzQ1Nl04NikJCWNwdV90eXBlPWkzODYgOzsKLSAgICAgIG02ODBbMDEyMzQ2XTApCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODAwOCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODM/PykJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG01MjAwKQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTgqKQkJY3B1X3R5cGU9bTg4ayA7OwotICAgICAgbWlwcyplbCkJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcyopCQljcHVfdHlwZT1taXBzIGVuZGlhbj1iaWcgOzsKLSAgICAgIHBvd2VycGNsZSopCWNwdV90eXBlPXBwYyBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBwb3dlcnBjKikJCWNwdV90eXBlPXBwYyBlbmRpYW49YmlnIDs7Ci0gICAgICByczYwMDAqKQkJY3B1X3R5cGU9cHBjIDs7Ci0gICAgICBzcGFyY2xpdGUqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGl0ZSA7OwotICAgICAgc3BhcmNsZXQqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGV0IDs7Ci0gICAgICBzcGFyYzY0KikJCWNwdV90eXBlPXNwYXJjIGFyY2g9djktNjQgOzsKLSAgICAgIHNwYXJjODZ4KikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyYzg2eCAgOzsKLSAgICAgIHNwYXJjKikJCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsaXRlIDs7ICMgPz8/IFNlZSB0Yy1zcGFyYy5jLgotICAgICAgdjg1MCopCQljcHVfdHlwZT12ODUwIDs7Ci0gICAgICAqKQkJY3B1X3R5cGU9JHtjcHV9IDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICB0YXJnZXRfY3B1X3R5cGU9JHtjcHVfdHlwZX0KLSAgICBlbGlmIHRlc3QgJHt0YXJnZXRfY3B1X3R5cGV9ICE9ICR7Y3B1X3R5cGV9IDsgdGhlbgotICAgICAgY29udGludWUKLSAgICBmaQotCi0gICAgZ2VuZXJpY190YXJnZXQ9JHtjcHVfdHlwZX0tJHZlbmRvci0kb3MKLSAgICBkZXY9bm8KLSAgICBiZmRfZ2FzPW5vCi0gICAgZW09Z2VuZXJpYwotCi0gICAgIyBhc3NpZ24gb2JqZWN0IGZvcm1hdAotICAgIGNhc2UgJHtnZW5lcmljX3RhcmdldH0gaW4KLSAgICAgIGEyOWstKi1jb2ZmKSAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1hbWQtdWRpKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLWFtZC1lYm1vbikgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstbnl1LXN5bTEpICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay0qLXZ4d29ya3MqKSAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIGFscGhhKi0qLSp2bXMqKQkgICAgZm10PWV2YXggOzsKLSAgICAgIGFscGhhKi0qLW5ldHdhcmUqKSAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIGFscGhhKi0qLW9wZW5ic2QqKSAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIGFscGhhKi0qLW9zZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIGFscGhhKi0qLWxpbnV4ZWNvZmYqKSBmbXQ9ZWNvZmYgOzsKLSAgICAgIGFscGhhKi0qLWxpbnV4LWdudSopICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBhbHBoYSotKi1uZXRic2QqKSAgICAgZm10PWVsZiBlbT1uYnNkIDs7Ci0KLSAgICAgIGFyYy0qLWVsZiopICAgICAgICAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIGFybS0qLWFvdXQpCSAgICAgICAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgYXJtLSotY29mZiB8IHRodW1iLSotY29mZikgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhcm0tKi1lbGYgfCB0aHVtYi0qLWVsZikgICAgICAgICAgZm10PWVsZiA7OwotICAgICAgYXJtLSotbGludXgqYW91dCopCSAgICAgICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIGFybS0qLWxpbnV4KiB8IGFybXYqLSotbGludXgtZ251KQlmbXQ9ZWxmICBlbT1saW51eCA7OwotICAgICAgYXJtLSotbmV0YnNkKikJICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGFybS0qLW9hYmkgfCB0aHVtYi0qLW9hYmkpICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBhcm0tZXBvYy1wZSB8IHRodW1iLWVwb2MtcGUpICAgICAgZm10PWNvZmYgZW09ZXBvYy1wZSA7OwotICAgICAgYXJtLSotcGUgfCB0aHVtYi0qLXBlKSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBhcm0tKi1yaXNjaXgqKQkgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09cmlzY2l4IDs7Ci0KLSAgICAgIGQxMHYtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGQzMHYtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotCi0gICAgICBmcjMwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIGhwcGEtKi0qZWxmKikgICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1saXRlcyopICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1vc2YqKSAgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ydGVtcyopICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ocHV4KikgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1tcGVpeCopICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ic2QqKSAgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1oaXV4KikgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLQotICAgICAgaDgzMDAtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIGkzODYtaWJtLWFpeCopICAgICAgICBmbXQ9Y29mZiBlbT1pMzg2YWl4IDs7Ci0gICAgICBpMzg2LXNlcXVlbnQtYnNkKikgICAgZm10PWFvdXQgZW09ZHluaXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1iZW9zcGUqKSAgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJlb3NlbGYqIHwgaTM4Ni0qLWJlb3MqKSBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYnNkKikgICAgICAgICAgZm10PWFvdXQgZW09Mzg2YnNkIDs7Ci0gICAgICBpMzg2LSotbmV0YnNkMC44KSAgICAgZm10PWFvdXQgZW09Mzg2YnNkIDs7Ci0gICAgICBpMzg2LSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllczs7Ci0gICAgICBpMzg2LSotb3BlbmJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllczs7Ci0gICAgICBpMzg2LSotbGludXgqYW91dCogfCBpMzg2LSotbGludXhvbGRsZCkgICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgaTM4Ni0qLWxpbnV4KmNvZmYqKSAgIGZtdD1jb2ZmIGVtPWxpbnV4IDs7Ci0gICAgICBpMzg2LSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1saW51eCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWx5bnhvcyopICAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIGkzODYtKi1zeXN2NCogfCBpMzg2LSotc29sYXJpcyogfCBpMzg2LSotZWxmKQotCQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1mcmVlYnNkYW91dCogfCBpMzg2LSotZnJlZWJzZDEyLiogfCBpMzg2LSotZnJlZWJzZDEyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLWZyZWVic2QqKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWNvZmYgfCBpMzg2LSotc3lzdiogfCBpMzg2LSotc2NvMy4ydjUqY29mZiB8IGkzODYtKi1pc2MqKQotICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLXNjbzMuMnY1KikgICAgICBmbXQ9ZWxmCi0JCQkgICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQ7IHRoZW4KLQkJCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU0NPX0VMRiAxCi1FT0YKLQotCQkJICAgIGZpCi0JCQkgICAgOzsKLSAgICAgIGkzODYtKi1zY28zLjIqKSAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLXZzdGEpICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpMzg2LSotbXNkb3NkamdwcCogfCBpMzg2LSotZ28zMiogfCBpMzg2LWdvMzItcnRlbXMqKQotCQkJICAgIGZtdD1jb2ZmIGVtPWdvMzI7OwotICAgICAgaTM4Ni0qLXJ0ZW1zZWxmKikgICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLWdudSopICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1tYWNoKikKLQkJCSAgICBmbXQ9YW91dCBlbT1tYWNoIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbXNkb3MqKSAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGkzODYtKi1tb3NzKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgaTM4Ni0qLWN5Z3dpbiopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbWluZ3czMiopICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi0qbnQqKSAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgaTk2MC0qLWJvdXQpICAgICAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotY29mZikgICAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLW5pbmR5KikgICAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczQqKSAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4wKSAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M1LiopICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotdnh3b3JrcyopICAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi1lbGYqKQkgICAgZm10PWVsZiA7OwotCi0gICAgICBtMzJyLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIG02OGstKi12eHdvcmtzKiB8IG02OGstZXJpY3Nzb24tb3NlIHwgbTY4ay0qLXN1bm9zKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICBtNjhrLW1vdG9yb2xhLXN5c3YqKSAgZm10PWNvZmYgZW09ZGVsdGEgOzsKLSAgICAgIG02OGstYnVsbC1zeXN2MyopICAgICBmbXQ9Y29mZiBlbT1kcHgyIDs7Ci0gICAgICBtNjhrLWFwb2xsby0qKSAgICAgICAgZm10PWNvZmYgZW09YXBvbGxvIDs7Ci0gICAgICBtNjhrLSotc3lzdjQqKSAjIG11c3QgYmUgYmVmb3JlIC1zeXN2KgotCQkJICAgIGZtdD1lbGYgZW09c3ZyNCA7OwotICAgICAgbTY4ay0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtNjhrLSotY29mZiB8IG02OGstKi1zeXN2KiB8IG02OGstKi1ydGVtcyopCi0JCQkgICAgZm10PWNvZmYgOzsKLSAgICAgIG02OGstKi1ocHV4KikgICAgICAgICBmbXQ9aHAzMDAgZW09aHAzMDAgOzsKLSAgICAgIG02OGstKi1saW51eCphb3V0KikgICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgbTY4ay0qLWxpbnV4LWdudSopICAgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIG02OGstKi1nbnUqKQkgICAgZm10PWVsZiA7OwotICAgICAgbTY4ay0qLWx5bnhvcyopICAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIG02OGstKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtNjhrLSotb3BlbmJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgbTY4ay1hcHBsZS1hdXgqKSAgICAgIGZtdD1jb2ZmIGVtPWF1eCA7OwotICAgICAgbTY4ay0qLXBzb3MqKSAgICAgICAgIGZtdD1lbGYgZW09cHNvczs7Ci0KLSAgICAgIG04OGstbW90b3JvbGEtc3lzdjMqKSBmbXQ9Y29mZiBlbT1kZWx0ODggOzsKLSAgICAgIG04OGstKi1jb2ZmKikgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBtY29yZS0qLWVsZikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG1jb3JlLSotcGUpCSAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotCi0gICAgICAjIGRvbid0IGNoYW5nZSBlbSBsaWtlICotKi1ic2QgZG9lcwotICAgICAgbWlwcy1kZWMtbmV0YnNkKikJICAgIGZtdD1lbGYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1kZWMtb3BlbmJzZCopICAgIGZtdD1lbGYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1kZWMtYnNkKikgICAgICAgIGZtdD1hb3V0IGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtc29ueS1ic2QqKSAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1ic2QqKSAgICAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVua25vd24gdmVuZG9yIGZvciBtaXBzLWJzZCBjb25maWd1cmF0aW9uLiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci0gICAgICBtaXBzLSotdWx0cml4KikgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1vc2YqKSAgICAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWlyaXg2KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4NSopICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotaXJpeCopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotbG5ld3MqKSAgICAgICAgZm10PWVjb2ZmIGVtPWxuZXdzIDs7Ci0gICAgICBtaXBzLSotcmlzY29zKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotc3lzdiopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotZWxmKiB8IG1pcHMtKi1ydGVtcyogfCBtaXBzLSotbGludXgtZ251KiB8IG1pcHMtKi1nbnUqIHwgbWlwcy0qLW9wZW5ic2QqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi12eHdvcmtzKikgICAgICBmbXQ9ZWxmCi0JCQkgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE1JUFNfU1RBQlNfRUxGIDEKLUVPRgotCi0JCQkgICAgOzsKLSAgICAgIG1uMTAyMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbW4xMDMwMC0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBwcGMtKi1wZSB8IHBwYy0qLWN5Z3dpbiogfCBwcGMtKi13aW5udCopCi0JCSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBwcGMtKi1haXgqKSAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLWJlb3MqKSAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgcHBjLSotKmJzZCogfCBwcGMtKi1lbGYqIHwgcHBjLSotZWFiaSogfCBwcGMtKi1zeXN2NCopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbGludXgtZ251KikJICAgIGZtdD1lbGYKLQkJCSAgICBjYXNlICIkZW5kaWFuIiBpbgotCQkJICAgIGJpZykgIDs7Ci0JCQkgICAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHTlUvTGludXggbXVzdCBiZSBjb25maWd1cmVkIGJpZyBlbmRpYW4iIDE+JjI7IGV4aXQgMTsgfSA7OwotCQkJICAgIGVzYWMKLQkJCSAgICA7OwotICAgICAgcHBjLSotc29sYXJpcyopCSAgICBmbXQ9ZWxmCi0JCQkgICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQ7IHRoZW4KLQkJCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVCAxCi1FT0YKLQotCQkJICAgIGZpCi0JCQkgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgotCQkJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogU29sYXJpcyBtdXN0IGJlIGNvbmZpZ3VyZWQgbGl0dGxlIGVuZGlhbiIgMT4mMjsgZXhpdCAxOyB9Ci0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgcHBjLSotcnRlbXMqKQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbWFjb3MqIHwgcHBjLSotbXB3KikKLQkJCSAgICBmbXQ9Y29mZiBlbT1tYWNvcyA7OwotICAgICAgcHBjLSotbmV0d2FyZSopICAgICAgIGZtdD1lbGYgZW09cHBjbncgOzsKLSAgICAgIHBwYy0qLXZ4d29ya3MqKSAgICAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIHNoLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIHNoLSotY29mZiopICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc2gtKi1ydGVtc2VsZiopICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIHNoLSotcnRlbXMqKQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopICAgIGZtdD1hb3V0IGVtPXBjNTMybWFjaCA7OwotICAgICAgbnMzMmstcGM1MzItbmV0YnNkKiB8IG5zMzJrLXBjNTMyLWxpdGVzKikgIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKLSAgICAgIG5zMzJrLXBjNTMyLW9wZW5ic2QqKSBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0KLSAgICAgIHNwYXJjLSotcnRlbXMqKSAgICAgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1zdW5vczQqKSAgICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIHNwYXJjLSotYW91dCB8IHNwYXJjKi0qLXZ4d29ya3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXNwYXJjYW91dCA7OwotICAgICAgc3BhcmMtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4KmFvdXQqKSAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIHNwYXJjLSotbGludXgtZ251KikgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWx5bnhvcyopICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgc3BhcmMtZnVqaXRzdS1ub25lKSAgIGZtdD1hb3V0IDs7Ci0gICAgICBzcGFyYy0qLWVsZiB8IHNwYXJjLSotc3lzdjQqIHwgc3BhcmMtKi1zb2xhcmlzKikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzcGFyYy0qLW5ldGJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCA7OwotICAgICAgc3BhcmMtKi1vcGVuYnNkKikgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLQotICAgICAgc3Ryb25nYXJtLSotY29mZikgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzdHJvbmdhcm0tKi1lbGYpICAgICAgZm10PWVsZiA7OwotCi0gICAgICB0aWMzMC0qLSphb3V0KikJICAgIGZtdD1hb3V0IGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWMzMC0qLSpjb2ZmKikgICAgICAgZm10PWNvZmYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHRpYzgwLSotKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHY4NTAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHY4NTBlLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHY4NTBlYS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIHZheC0qLWJzZCogfCB2YXgtKi11bHRyaXgqKQotCQkJICAgIGZtdD1hb3V0IDs7Ci0gICAgICB2YXgtKi12bXMpICAgICAgICAgICAgZm10PXZtcyA7OwotCi0KLSAgICAgIHo4ay0qLWNvZmYgfCB6OGstKi1zaW0pCi0JCQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgdzY1LSotKikgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgICotKi1hb3V0IHwgKi0qLXNjb3V0KQotCQkJICAgIGZtdD1hb3V0IDs7Ci0gICAgICAqLSotbmluZHkqKQotCQkJICAgIGZtdD1ib3V0IDs7Ci0gICAgICAqLSotYnNkKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICAqLSotZ2VuZXJpYykgICAgICAgICAgZm10PWdlbmVyaWMgOzsKLSAgICAgICotKi14cmF5IHwgKi0qLWhtcykgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLXNpbSkgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICAqLSotZWxmIHwgKi0qLXN5c3Y0KiB8ICotKi1zb2xhcmlzKikKLQkJCSAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IEdBUyBzdXBwb3J0IGZvciAke2dlbmVyaWNfdGFyZ2V0fSBpcyBpbmNvbXBsZXRlLiIgMT4mMgotCQkJICAgIGZtdD1lbGYgZGV2PXllcyA7OwotICAgICAgKi0qLXZ4d29ya3MpICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICAqLSotbmV0d2FyZSkgICAgICAgICAgZm10PWVsZiA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgZW5kaWFuX2RlZj0KLSAgICAgIGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhiaWc7IHRoZW4KLQllbmRpYW5fZGVmPTEKLSAgICAgIGVsaWYgdGVzdCB4JHtlbmRpYW59ID0geGxpdHRsZTsgdGhlbgotCWVuZGlhbl9kZWY9MAotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgeCR7ZW5kaWFuX2RlZn0gIT0geDsgdGhlbgotCWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOICRlbmRpYW5fZGVmCi1FT0YKLQotICAgICAgZmkKLSAgICBmaQotCi0gICAgY2FzZSAke2NwdV90eXBlfS0ke2ZtdH0gaW4KLSAgICAgIGFscGhhKi0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgYXJtLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgIyBub3QgeWV0Ci0gICAgIyBpMzg2LWFvdXQpCWJmZF9nYXM9cHJlZmVycmVkIDs7Ci0gICAgICBtaXBzLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBuczMyay0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgcHBjLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBzcGFyYy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgc3Ryb25nYXJtLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLWVsZikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotZWNvZmYpCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLXNvbSkJYmZkX2dhcz15ZXMgOzsKLSAgICAgICopCQk7OwotICAgIGVzYWMKLQotIyBPdGhlciByYW5kb20gc3R1ZmYuCi0KLSAgICAjIERvIHdlIG5lZWQgdGhlIG9wY29kZXMgbGlicmFyeT8KLSAgICBjYXNlICR7Y3B1X3R5cGV9IGluCi0gICAgICB2YXggfCBpMzg2IHwgdGljMzApCi0JOzsKLQotICAgICAgKikKLQluZWVkX29wY29kZXM9eWVzCi0KLQljYXNlICIke2VuYWJsZV9zaGFyZWR9IiBpbgotCXllcykgc2hhcmVkX29wY29kZXM9dHJ1ZSA7OwotCSpvcGNvZGVzKikgc2hhcmVkX29wY29kZXM9dHJ1ZSA7OwotCSopIHNoYXJlZF9vcGNvZGVzPWZhbHNlIDs7Ci0JZXNhYwotCWlmIHRlc3QgIiR7c2hhcmVkX29wY29kZXN9IiA9ICJ0cnVlIjsgdGhlbgotCSAgIyBBIHNoYXJlZCBsaWJvcGNvZGVzIG11c3QgYmUgbGlua2VkIGFnYWluc3QgbGliYmZkLgotCSAgbmVlZF9iZmQ9eWVzCi0JZmkKLQk7OwotICAgIGVzYWMKLQotICAgICMgQW55IG90aGVyIHNwZWNpYWwgb2JqZWN0IGZpbGVzIG5lZWRlZCA/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgZnIzMCB8IG0zMnIpCi0JdXNpbmdfY2dlbj15ZXMKLQk7OwotCi0gICAgICBtNjhrKQotCWNhc2UgJHtleHRyYV9vYmplY3RzfSBpbgotCSptNjhrLXBhcnNlLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG02OGstcGFyc2UubyIgOzsKLQllc2FjCi0JOzsKLQotICAgICAgbWlwcykKLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLXBhcnNlLm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLXBhcnNlLm8iCi0JZmkKLQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0YmwtbGV4Lm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLWxleC5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLW9wcy5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1vcHMubyIKLQlmaQotCTs7Ci0KLSAgICAgIHNwYXJjKQotCWlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIERFRkFVTFRfQVJDSCAiJHthcmNofSIKLUVPRgotCi0JZmkKLQk7OwotICAgICAgKikKLQk7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JY2FzZSAieCR7ZXh0cmFfb2JqZWN0c30iIGluCi0JKmNnZW4ubyopIDs7Ci0JKikgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgY2dlbi5vIiA7OwotCWVzYWMKLSAgICBmaQotCi0jIFNlZSBpZiB3ZSByZWFsbHkgY2FuIHN1cHBvcnQgdGhpcyBjb25maWd1cmF0aW9uIHdpdGggdGhlIGVtdWxhdGlvbiBjb2RlLgotCi0gICAgaWYgdGVzdCAkdGhpc190YXJnZXQgPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgcHJpbWFyeV9iZmRfZ2FzPSRiZmRfZ2FzCi0gICAgICBvYmpfZm9ybWF0PSRmbXQKLSAgICAgIHRlX2ZpbGU9JGVtCi0KLSAgICAgIGlmIHRlc3QgJGJmZF9nYXMgPSBubyA7IHRoZW4KLQkjIENhbid0IHN1cHBvcnQgb3RoZXIgY29uZmlndXJhdGlvbnMgdGhpcyB3YXkuCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZWxpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0gICAgICAjIENhbid0IHN1cHBvcnQgdGhpcyBjb25maWd1cmF0aW9uLgotICAgICAgYnJlYWsKLSAgICBmaQotCi0jIEZyb20gdGFyZ2V0IG5hbWUgYW5kIGZvcm1hdCwgcHJvZHVjZSBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9LSR7Zm10fSBpbgotICAgICAgbWlwcy0qLWlyaXg1Ki0qKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLSAgICAgIG1pcHMtKi1saW51eC1nbnUqLSopIGNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiBtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVsZiBtaXBzYmVsZiBtaXBzZWxmIG1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotbG5ld3MqLWVjb2ZmKSA7OwotICAgICAgbWlwcy0qLSotZWNvZmYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlY29mZiBtaXBzYmVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCWVzYWMgOzsKLSAgICAgIG1pcHMtKi0qLWVsZikJY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVsZiBtaXBzYmVsZiBtaXBzZWxmIiA7OwotICAgICAgIyBVbmNvbW1lbnRpbmcgdGhlIG5leHQgbGluZSB3aWxsIHR1cm4gb24gc3VwcG9ydCBmb3IgaTM4NiBDT0ZGCi0gICAgICAjIGluIGFueSBpMzg2IEVMRiBjb25maWd1cmF0aW9uLiAgVGhpcyBwcm9iYWJseSBkb2Vzbid0IHdvcmsKLSAgICAgICMgY29ycmVjdGx5LgotICAgICAgIyBpMzg2LSotKi1lbGYpCWVtdWxhdGlvbj0iaTM4NmNvZmYgaTM4NmVsZiIgOzsKLQkJCWVzYWMgOzsKLSAgICBlc2FjCi0KLSAgICBlbXVsYXRpb25zPSIkZW11bGF0aW9ucyAkZW11bGF0aW9uIgotCi1kb25lCi0KLSMgQXNzaWduIGZsb2F0aW5nIHBvaW50IHR5cGUuICBNb3N0IHByb2Nlc3NvcnMgd2l0aCBGUCBzdXBwb3J0Ci0jIElFRUUgRlAuICBPbiB0aG9zZSB0aGF0IGRvbid0IHN1cHBvcnQgRlAgYXQgYWxsLCB1c3VhbGx5IElFRUUKLSMgaXMgZW11bGF0ZWQuCi1jYXNlICR7dGFyZ2V0X2NwdX0gaW4KLSAgdmF4IHwgdGFob2UgKQlhdG9mPSR7dGFyZ2V0X2NwdX0gOzsKLSAgKikJCWF0b2Y9aWVlZSA7OwotZXNhYwotCi1jYXNlICIke29ial9mb3JtYXR9IiBpbgotICAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHQVMgZG9lcyBub3Qga25vdyB3aGF0IGZvcm1hdCB0byB1c2UgZm9yIHRhcmdldCAke3RhcmdldH0iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0jIFVuZm9ydHVuYXRlbHkgdGhlIGNwdSBpbiBjcHUtb3BjLmggZmlsZSBpc24ndCBhbHdheXMgJChUQVJHRVRfQ1BVKS4KLWNnZW5fY3B1X3ByZWZpeD0iIgotaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLSAgY2FzZSAke3RhcmdldF9jcHV9IGluCi0gICAgKikgY2dlbl9jcHVfcHJlZml4PSR7dGFyZ2V0X2NwdX0gOzsKLSAgZXNhYwotICAKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTSU5HX0NHRU4gMQotRU9GCi0KLWZpCi0KLQotaWYgdGVzdCAhIC1yICR7c3JjZGlyfS9jb25maWcvdGMtJHt0YXJnZXRfY3B1X3R5cGV9LmM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHQVMgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgQ1BVICR7dGFyZ2V0X2NwdV90eXBlfSIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1pZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy9vYmotJHtvYmpfZm9ybWF0fS5jOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0ICR7b2JqX2Zvcm1hdH0iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotY2FzZSAke3VzZXJfYmZkX2dhc30tJHtwcmltYXJ5X2JmZF9nYXN9IGluCi0gIHllcy15ZXMgfCBuby1ubykKLSAgICAjIFdlIGRpZG4ndCBvdmVycmlkZSB1c2VyJ3MgY2hvaWNlLgotICAgIDs7Ci0gIG5vLXllcykKLSAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IFVzZSBvZiBCRkQgaXMgcmVxdWlyZWQgZm9yICR7dGFyZ2V0fTsgb3ZlcnJpZGluZyBjb25maWcgb3B0aW9ucy4iIDE+JjIKLSAgICA7OwotICBuby1wcmVmZXJyZWQpCi0gICAgcHJpbWFyeV9iZmRfZ2FzPW5vCi0gICAgOzsKLSAgKi1wcmVmZXJyZWQpCi0gICAgcHJpbWFyeV9iZmRfZ2FzPXllcwotICAgIDs7Ci0gIHllcy0qKQotICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKLSAgICA7OwotICAtKikKLSAgICAjIFVzZXIgc3BlY2lmaWVkIG5vdGhpbmcuCi0gICAgOzsKLWVzYWMKLQotIyBTb21lIENPRkYgY29uZmlndXJhdGlvbnMgd2FudCB0aGVzZSByYW5kb20gb3RoZXIgZmxhZ3Mgc2V0LgotY2FzZSAke29ial9mb3JtYXR9IGluCi0gIGNvZmYpCi0gICAgY2FzZSAke3RhcmdldF9jcHVfdHlwZX0gaW4KLSAgICAgIGkzODYpIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBJMzg2Q09GRiAxCi1FT0YKLSA7OwotICAgICAgbTY4aykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE02OEtDT0ZGIDEKLUVPRgotIDs7Ci0gICAgICBtODhrKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTTg4S0NPRkYgMQotRU9GCi0gOzsKLSAgICBlc2FjCi0gICAgOzsKLWVzYWMKLQotIyBHZXR0aW5nIHRoaXMgZG9uZSByaWdodCBpcyBnb2luZyB0byBiZSBhIGJpdGNoLiAgRWFjaCBjb25maWd1cmF0aW9uIHNwZWNpZmllZAotIyB3aXRoIC0tZW5hYmxlLXRhcmdldHM9Li4uIHNob3VsZCBiZSBjaGVja2VkIGZvciBlbnZpcm9ubWVudCwgZm9ybWF0LCBjcHUsIGFuZAotIyBiZmRfZ2FzIHNldHRpbmcuCi0jCi0jIEZvciBlYWNoIGNvbmZpZ3VyYXRpb24sIHRoZSBuZWNlc3Nhcnkgb2JqZWN0IGZpbGUgc3VwcG9ydCBjb2RlIG11c3QgYmUgbGlua2VkCi0jIGluLiAgVGhpcyBtaWdodCBiZSBvbmx5IG9uZSwgaXQgbWlnaHQgYmUgdXAgdG8gZm91ci4gIFRoZSBuZWNlc3NhcnkgZW11bGF0aW9uCi0jIGNvZGUgbmVlZHMgdG8gYmUgcHJvdmlkZWQsIHRvby4KLSMKLSMgQW5kIHRoZW4gdGhlcmUncyAiLS1lbmFibGUtdGFyZ2V0cz1hbGwiLi4uLgotIwotIyBGb3Igbm93LCBqdXN0IGFsd2F5cyBkbyBpdCBmb3IgTUlQUyBFTEYgb3IgRUNPRkYgY29uZmlndXJhdGlvbnMuICBTaWdoLgotCi1mb3JtYXRzPSIke29ial9mb3JtYXR9IgotZW1maWxlcz0iIgotRU1VTEFUSU9OUz0iIgotX2dhc191bmlxX2xpc3Q9IiRlbXVsYXRpb25zIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgJF9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSAkX2dhc191bmlxX2kgaW4KLSAgX2dhc191bmlxX2R1bW15KSA7OwotICAqKSBjYXNlICIgJF9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiAkX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IiRfZ2FzX3VuaXFfbmV3bGlzdCAkX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotZW11bGF0aW9ucz0kX2dhc191bmlxX25ld2xpc3QKLQotZm9yIGVtIGluIC4gJGVtdWxhdGlvbnMgOyBkbwotICBjYXNlICRlbSBpbgotICAgIC4pCWNvbnRpbnVlIDs7Ci0gICAgbWlwc2JlbGYgfCBtaXBzbGVsZikKLQlmbXQ9ZWxmICAgZmlsZT1taXBzZWxmIDs7Ci0gICAgbWlwc2JlY29mZiB8IG1pcHNsZWNvZmYpCi0JZm10PWVjb2ZmIGZpbGU9bWlwc2Vjb2ZmIDs7Ci0gICAgaTM4NmNvZmYpCi0JZm10PWNvZmYgIGZpbGU9aTM4NmNvZmYgOzsKLSAgICBpMzg2ZWxmKQotCWZtdD1lbGYgICBmaWxlPWkzODZlbGYgOzsKLSAgZXNhYwotICBmb3JtYXRzPSIkZm9ybWF0cyAkZm10IgotICBlbWZpbGVzPSIkZW1maWxlcyBlLSRmaWxlLm8iCi0gIEVNVUxBVElPTlM9IiRFTVVMQVRJT05TICYkZW0sIgotZG9uZQotX2dhc191bmlxX2xpc3Q9IiRmb3JtYXRzIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgJF9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSAkX2dhc191bmlxX2kgaW4KLSAgX2dhc191bmlxX2R1bW15KSA7OwotICAqKSBjYXNlICIgJF9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiAkX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IiRfZ2FzX3VuaXFfbmV3bGlzdCAkX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotZm9ybWF0cz0kX2dhc191bmlxX25ld2xpc3QKLQotX2dhc191bmlxX2xpc3Q9IiRlbWZpbGVzIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgJF9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSAkX2dhc191bmlxX2kgaW4KLSAgX2dhc191bmlxX2R1bW15KSA7OwotICAqKSBjYXNlICIgJF9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiAkX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IiRfZ2FzX3VuaXFfbmV3bGlzdCAkX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotZW1maWxlcz0kX2dhc191bmlxX25ld2xpc3QKLQotaWYgdGVzdCBgc2V0IC4gJGZvcm1hdHMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAxIDsgdGhlbgotICBmb3IgZm10IGluICRmb3JtYXRzIDsgZG8KLSAgICBjYXNlICRmbXQgaW4KLSAgICAgIGFvdXQpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfQU9VVCAxCi1FT0YKLSAgIDs7Ci0gICAgICBib3V0KQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0JPVVQgMQotRU9GCi0gICA7OwotICAgICAgY29mZikJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9DT0ZGIDEKLUVPRgotICAgIDs7Ci0gICAgICBlY29mZikJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9FQ09GRiAxCi1FT0YKLSAgIDs7Ci0gICAgICBlbGYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfRUxGIDEKLUVPRgotICAgICA7OwotICAgICAgZ2VuZXJpYykJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9HRU5FUklDIDEKLUVPRgotIDs7Ci0gICAgICBocDMwMCkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9IUDMwMCAxCi1FT0YKLSAgIDs7Ci0gICAgICBpZWVlKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0lFRUUgMQotRU9GCi0gICAgOzsKLSAgICAgIHNvbSkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9TT00gMQotRU9GCi0gICAgIDs7Ci0gICAgICB2bXMpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfVk1TIDEKLUVPRgotICAgICA7OwotICAgIGVzYWMKLSAgICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBvYmotJGZtdC5vIgotICBkb25lCi0gIG9ial9mb3JtYXQ9bXVsdGkKLWZpCi1pZiB0ZXN0IGBzZXQgLiAkZW1maWxlcyA7IHNoaWZ0IDsgZWNobyAkI2AgLWd0IDAgOyB0aGVuCi0gIHRlX2ZpbGU9bXVsdGkKLSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgJGVtZmlsZXMiCi0gIERFRkFVTFRfRU1VTEFUSU9OPWBzZXQgLiAkZW11bGF0aW9ucyA7IGVjaG8gJDJgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfRU1VTEFUSU9OUyAxCi1FT0YKLQotZmkKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgRU1VTEFUSU9OUyAkRU1VTEFUSU9OUwotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIERFRkFVTFRfRU1VTEFUSU9OICIkREVGQVVMVF9FTVVMQVRJT04iCi1FT0YKLQotCi1jYXNlICR7cHJpbWFyeV9iZmRfZ2FzfS0ke3RhcmdldF9jcHVfdHlwZX0tJHtvYmpfZm9ybWF0fSBpbgotICB5ZXMtKi1jb2ZmKQluZWVkX2JmZD15ZXMgOzsKLSAgbm8tKi1jb2ZmKQluZWVkX2JmZD15ZXMKLQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE1BTllfU0VHTUVOVFMgMQotRU9GCi0gOzsKLWVzYWMKLQotcmVqZWN0X2Rldl9jb25maWdzPXllcwotCi1jYXNlICR7cmVqZWN0X2Rldl9jb25maWdzfS0ke2Rldn0gaW4KLSAgeWVzLXllcykgIyBPb3BzLgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IHN1cHBvcnQgdGhlICR7Z2VuZXJpY190YXJnZXR9IGNvbmZpZ3VyYXRpb24uIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotZXNhYwotCi0KLQotCi0KLQotCi1jYXNlICIke3ByaW1hcnlfYmZkX2dhc30iIGluCi0gIHllcykJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEJGRF9BU1NFTUJMRVIgMQotRU9GCi0KLQluZWVkX2JmZD15ZXMgOzsKLWVzYWMKLQotIyBkbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci1jYXNlICIke25lZWRfb3Bjb2Rlc30iIGluCi15ZXMpCi0gIE9QQ09ERVNfTElCPS4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotICA7OwotZXNhYwotCi1jYXNlICIke25lZWRfYmZkfSIgaW4KLXllcykKLSAgQkZETElCPS4uL2JmZC9saWJiZmQubGEKLSAgQUxMX09CSl9ERVBTPSIkQUxMX09CSl9ERVBTIC4uL2JmZC9iZmQuaCIKLSAgOzsKLWVzYWMKLQotCi0KLQotCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9BTElBUyAiJHt0YXJnZXRfYWxpYXN9IgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwgIiR7dGFyZ2V0fSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQ1BVICIke3RhcmdldF9jcHV9IgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IgIiR7dGFyZ2V0X3ZlbmRvcn0iCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX09TICIke3RhcmdldF9vc30iCi1FT0YKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzU2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzg4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyNzk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODMwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgzNTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg0NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODYzOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLWZvciBhY19wcm9nIGluICdiaXNvbiAteScgYnlhY2MKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBhY19jdl9wcm9nX1lBQ0M9IiRZQUNDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ZQUNDPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotWUFDQz0iJGFjX2N2X3Byb2dfWUFDQyIKLWlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFlBQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkWUFDQyIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRZQUNDIiB8fCBZQUNDPSJ5YWNjIgotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkzMTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTQ2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTUyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTYzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTY5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTg2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1mb3IgYWNfcHJvZyBpbiBmbGV4IGxleAotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRMRVgiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkTEVYIiB8fCBMRVg9IiIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IiIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSJmbGV4IgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MRVgiICYmIGFjX2N2X3Byb2dfTEVYPSJsZXgiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkTEVYTElCIgotdGhlbgotICBjYXNlICIkTEVYIiBpbgotICBmbGV4KikgYWNfbGliPWZsIDs7Ci0gICopIGFjX2xpYj1sIDs7Ci0gIGVzYWMKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwODM6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWwkYWNfbGliICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwOTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciB5eXdyYXAoKTsKLQotaW50IG1haW4oKSB7Ci15eXdyYXAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExFWExJQj0iLWwkYWNfbGliIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTI1OiBjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfcm9vdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlIG1pbmltYWwgbGV4IHByb2dyYW0gaXMganVzdCBhIHNpbmdsZSBsaW5lOiAlJS4gIEJ1dCBzb21lIGJyb2tlbiBsZXhlcwotIyAoU29sYXJpcywgSSB0aGluayBpdCB3YXMpIHdhbnQgdHdvICUlIGxpbmVzLCBzbyBhY2NvbW1vZGF0ZSB0aGVtLgotZWNobyAnJSUKLSUlJyB8ICRMRVgKLWlmIHRlc3QgLWYgbGV4Lnl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKLWVsaWYgdGVzdCAtZiBsZXh5eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4eXkKLWVsc2UKLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW5ub3QgZmluZCBvdXRwdXQgZnJvbSAkTEVYOyBnaXZpbmcgdXAiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfcm9vdCIgMT4mNgotTEVYX09VVFBVVF9ST09UPSRhY19jdl9wcm9nX2xleF9yb290Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE0NjogY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgUE9TSVggc2F5cyBsZXggY2FuIGRlY2xhcmUgeXl0ZXh0IGVpdGhlciBhcyBhIHBvaW50ZXIgb3IgYW4gYXJyYXk7IHRoZQotIyBkZWZhdWx0IGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKLSMgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSB0aGUgJXBvaW50ZXIgYW5kICVhcnJheSBkZWNsYXJhdGlvbnMuCi1hY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj1ubwotZWNobyAnZXh0ZXJuIGNoYXIgKnl5dGV4dDsnID4+JExFWF9PVVRQVVRfUk9PVC5jCi1hY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iJExJQlMgJExFWExJQiIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotYGNhdCAkTEVYX09VVFBVVF9ST09ULmNgCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi1ybSAtZiAiJHtMRVhfT1VUUFVUX1JPT1R9LmMiCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBZWVRFWFRfUE9JTlRFUiAxCi1FT0YKLQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTg5OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjEwOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjIzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyOTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMxNDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNjg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM4OTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQwMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0Mjk6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ2MjogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDY3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDk3OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTA5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUzMDogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTk1OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MjU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2MzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY1MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjgwOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MzI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzQyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NzE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc5OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgyNDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk3MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMDA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDEwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA0MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDk3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTAyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE1OTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxOTI6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIxMjogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjMxOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQyNDE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjU4OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyNzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI4NjogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyOTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzIxOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM2MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM5NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDUwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQ4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDU1ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzE4OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzQ2OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzUxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQ3NTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDgxOTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4NDI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4NDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4NTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4NzU6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDg4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4ODc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDkwNjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDkxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdGRsaWIuaCBtZW1vcnkuaCBzdHJpbmdzLmggdW5pc3RkLmggc3RkYXJnLmggdmFyYXJncy5oIGVycm5vLmggc3lzL3R5cGVzLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTQxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDk0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk1MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBQdXQgdGhpcyBoZXJlIHNvIHRoYXQgYXV0b2NvbmYncyAiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlIGRvZXNuJ3QgY29uZnVzZQotIyBwZW9wbGUgd2hvIGFyZSBub3QgY3Jvc3MtY29tcGlsaW5nIGJ1dCBhcmUgY29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcnMuCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGNvbXBpbGluZyBhIGNyb3NzLWFzc2VtYmxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDk4MTogY2hlY2tpbmcgd2hldGhlciBjb21waWxpbmcgYSBjcm9zcy1hc3NlbWJsZXIiID4mNQotaWYgdGVzdCAiJHtob3N0fSIgPSAiJHt0YXJnZXR9IjsgdGhlbgotICBjcm9zc19nYXM9bm8KLWVsc2UKLSAgY3Jvc3NfZ2FzPXllcwotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ1JPU1NfQ09NUElMRSAxCi1FT0YKLQotZmkKLWVjaG8gIiRhY190IiIkY3Jvc3NfZ2FzIiAxPiY2Ci0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5OTY6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDAxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDI5OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwOTQ6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTEyNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTEyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxNzk6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjI4OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyMzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLQotIyBWTVMgZG9lc24ndCBoYXZlIHVubGluay4KLWZvciBhY19mdW5jIGluIHVubGluayByZW1vdmUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyNzI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyNzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTMwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBzeXN0ZW1zIGRvbid0IGhhdmUgc2JyaygpLgotZm9yIGFjX2Z1bmMgaW4gc2JyawotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTMyOTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTMzNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBub24tQU5TSSBwcmVwcm9jZXNzb3JzIGJvdGNoIHJlcXVvdGluZyBpbnNpZGUgc3RyaW5ncy4gIFRoYXQncyBiYWQKLSMgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLSMgd29ya2luZyBwcm9wZXJseSEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFzc2VydCBtYWNybyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTM4NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfYXNzZXJ0X29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTM5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBtYWluKCkgewotCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2Fzc2VydF9vaz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2Fzc2VydF9vaz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2Fzc2VydF9vayIgMT4mNgotdGVzdCAkZ2FzX2N2X2Fzc2VydF9vayA9IHllcyB8fCBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQlJPS0VOX0FTU0VSVCAxCi1FT0YKLQotCi0KLSMgT24gc29tZSBzeXN0ZW1zLCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBtYXkgbm90IGRlY2xhcmUgbWFsbG9jLCByZWFsbG9jLAotIyBhbmQgZnJlZS4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgZ2FzIG5lZWRzIHRoZXNlIGZ1bmN0aW9ucyB0byBoYXZlIGJlZW4KLSMgZGVjbGFyZWQgLS0gc3VjaCBhcyB3aGVuIHRha2luZyB0aGVpciBhZGRyZXNzZXMuCi1nYXNfdGVzdF9oZWFkZXJzPSIKLSNpZmRlZiBIQVZFX01FTU9SWV9ICi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3Igc3Ryc3RyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDQ4OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzdHJzdHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIHN0cnN0cjsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0NjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgbWFsbG9jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDg1OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBtYWxsb2MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIG1hbGxvYzsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZnJlZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTUyMjogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZnJlZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NTI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiB2b2lkICgqZikoKTsKLWYgeDsKLXggPSAoZikgZnJlZTsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1Mzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9mcmVlPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9mcmVlID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzYnJrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTU5OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzYnJrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU1NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKigqZikoKTsKLWYgeDsKLXggPSAoZikgc2JyazsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1NzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zYnJrPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zYnJrPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU0JSSyAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlbnZpcm9uIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTk2OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlbnZpcm9uIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU2MDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKipmOwotZiB4OwoteCA9IChmKSBlbnZpcm9uOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTYxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OIDEKLUVPRgotCi1maQotCi0KLSMgRG9lcyBlcnJuby5oIGRlY2xhcmUgZXJybm8sIG9yIGRvIHdlIGhhdmUgdG8gYWRkIGEgc2VwYXJhdGUgZGVjbGFyYXRpb24KLSMgZm9yIGl0PwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlcnJubyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTYzNjogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZXJybm8iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9lcnJubycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU2NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgSEFWRV9FUlJOT19ICi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBpbnQgZjsKLWYgeDsKLXggPSAoZikgZXJybm87Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm89bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm8gPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FUlJOTyAxCi1FT0YKLQotZmkKLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSAuZ2RiaW5pdDpnZGJpbml0LmluIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAY2dlbl9jcHVfcHJlZml4QCUkY2dlbl9jcHVfcHJlZml4JWcKLXMlQGV4dHJhX29iamVjdHNAJSRleHRyYV9vYmplY3RzJWcKLXMlQHRhcmdldF9jcHVfdHlwZUAlJHRhcmdldF9jcHVfdHlwZSVnCi1zJUBvYmpfZm9ybWF0QCUkb2JqX2Zvcm1hdCVnCi1zJUB0ZV9maWxlQCUkdGVfZmlsZSVnCi1zJUBpbnN0YWxsX3Rvb2xkaXJAJSRpbnN0YWxsX3Rvb2xkaXIlZwotcyVAYXRvZkAlJGF0b2YlZwotcyVAQkZETElCQCUkQkZETElCJWcKLXMlQE9QQ09ERVNfTElCQCUkT1BDT0RFU19MSUIlZwotcyVAQUxMX09CSl9ERVBTQCUkQUxMX09CSl9ERVBTJWcKLXMlQFlBQ0NAJSRZQUNDJWcKLXMlQExFWEAlJExFWCVnCi1zJUBMRVhMSUJAJSRMRVhMSUIlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQExFWF9PVVRQVVRfUk9PVEAlJExFWF9PVVRQVVRfUk9PVCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBkb2MvTWFrZWZpbGUgLmdkYmluaXQ6Z2RiaW5pdC5pbiBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi10YXJnZXRfY3B1X3R5cGU9JHt0YXJnZXRfY3B1X3R5cGV9Ci0gY2dlbl9jcHVfcHJlZml4PSR7Y2dlbl9jcHVfcHJlZml4fQotIG9ial9mb3JtYXQ9JHtvYmpfZm9ybWF0fQotIHRlX2ZpbGU9JHt0ZV9maWxlfQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotcm0gLWYgdGFyZy1jcHUuYyB0YXJnLWNwdS5oIG9iai1mb3JtYXQuaCBvYmotZm9ybWF0LmMgdGFyZy1lbnYuaCBhdG9mLXRhcmcuYyBpdGJsLWNwdS5oCi0gZWNobyAnI2luY2x1ZGUgInRjLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gdGFyZy1jcHUuaAotIGVjaG8gJyNpbmNsdWRlICJvYmotJyIke29ial9mb3JtYXR9IicuaCInID4gb2JqLWZvcm1hdC5oCi0gZWNobyAnI2luY2x1ZGUgInRlLSciJHt0ZV9maWxlfSInLmgiJyA+IHRhcmctZW52LmgKLSBlY2hvICcjaW5jbHVkZSAiaXRibC0nIiR7dGFyZ2V0X2NwdV90eXBlfSInLmgiJyA+IGl0YmwtY3B1LmgKLSBpZiB0ZXN0ICJ4JGNnZW5fY3B1X3ByZWZpeCIgIT0geCA7IHRoZW4KLSAgIGVjaG8gJyNpbmNsdWRlICJvcGNvZGVzLyciJHtjZ2VuX2NwdV9wcmVmaXh9IictZGVzYy5oIicgPiBjZ2VuLWRlc2MuaAotIGZpCi0KLSBzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlndXJlLmJhdCBiL2dhcy9jb25maWd1cmUuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmQyNjlmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotQGVjaG8gb2ZmDQotaWYgIiUxIiA9PSAiaDgvMzAwIiBnb3RvIGg4MzAwDQotDQotZWNobyBDb25maWd1cmluZyBnYXMgZm9yIGdvMzINCi11cGRhdGUgY29uZmlnL3RjLWkzODYuYyB0YXJnLWNwdS5jDQotdXBkYXRlIGNvbmZpZy90Yy1pMzg2LmggdGFyZy1jcHUuaA0KLXVwZGF0ZSBjb25maWcvdGUtZ28zMi5oIHRhcmctZW52LmgNCi11cGRhdGUgY29uZmlnL29iai1jb2ZmLmggb2JqLWZvcm1hdC5oDQotdXBkYXRlIGNvbmZpZy9vYmotY29mZi5jIG9iai1mb3JtYXQuYw0KLXVwZGF0ZSBjb25maWcvYXRvZi1pZWVlLmMgYXRvZi10YXJnLmMNCi1nb3RvIGNvbW1vbg0KLQ0KLTpoODMwMA0KLWVjaG8gQ29uZmlndXJpbmcgZ2FzIGZvciBIOC8zMDANCi1jb3B5IGNvbmZpZ1xoby1nbzMyLmggaG9zdC5oDQotY29weSBjb25maWdcdGMtaDgzMDAuYyB0YXJnLWNwdS5jDQotY29weSBjb25maWdcdGMtaDgzMDAuaCB0YXJnLWNwdS5oDQotY29weSBjb25maWdcdGUtZ2VuZXJpYy5oIHRhcmctZW52LmgNCi1jb3B5IGNvbmZpZ1xvYmpjb2ZmYmZkLmggb2JqLWZvcm1hdC5oDQotY29weSBjb25maWdcb2JqY29mZmJmZC5jIG9iai1mb3JtYXQuYw0KLWNvcHkgY29uZmlnXGF0b2YtaWVlZS5jIGF0b2YtdGFyZy5jDQotDQotOmNvbW1vbg0KLQ0KLWVjaG8gIyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgImNvbmZpZ3VyZS5iYXQiPiBNYWtlZmlsZS4yDQotZWNobyBhbGwuZG9zIDogYXMubmV3IGdhc3AubmV3Pj4gTWFrZWZpbGUuMg0KLQ0KLWlmIGV4aXN0IGNvbmZpZy5zZWQgZGVsIGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL0BzcmNkaXJALy4vZwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0B0YXJnZXRfYWxpYXNAL2dvMzIvCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AcHJlZml4QC8vCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQENDQC9nY2MvZwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BPUENPREVTX0xJQkAvLi5cL29wY29kZXNcL2xpYm9wY29kZXMuYS9nCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AQkZETElCQC8uLlwvYmZkXC9saWJiZmQuYS9nCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BBTExfT0JKX0RFUFNALy4uXC9iZmRcL2JmZC5oL2cJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9eYWxsWyAJXSo6LyBhXAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJkdW1teToJCQkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvXC91c3JbXiBdKi5oLy9nCQkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9eY29uZmlnLmhbIAldKjovIGQJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL15NYWtlZmlsZS9ub3QtTWFrZWZpbGUvCQkJCSI+PiBjb25maWcuc2VkDQotDQotc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KLXNlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZS4yDQotdXBkYXRlIE1ha2VmaWxlLjIgTWFrZWZpbGUNCi1kZWwgTWFrZWZpbGUuMg0KLWRlbCBjb25maWcuc2VkDQotZGVsIGNvbmZpZzIuc2VkDQotDQotZWNobyAjaWZuZGVmIEdBU19WRVJTSU9OPiBjb25maWcubmV3DQotc2VkIC1uICIvXlZFUlNJT049L3AiIE1ha2VmaWxlLmluIHwgc2VkIC1lICJzL1ZFUlNJT049LyNkZWZpbmUgR0FTX1ZFUlNJT04gXCIvIiAtZSAicy8kL1wiLyI+PiBjb25maWcubmV3DQotdHlwZSBjb25maWdcZ28zMi5jZmcgPj4gY29uZmlnLm5ldw0KLWVjaG8gI2VuZGlmPj4gY29uZmlnLm5ldw0KLXVwZGF0ZSBjb25maWcubmV3IGNvbmZpZy5oDQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZ3VyZS5pbiBiL2dhcy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljY2FiMDYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLWRubAotZG5sIEFuZCBiZSBjYXJlZnVsIHdoZW4gY2hhbmdpbmcgaXQhICBJZiB5b3UgbXVzdCBhZGQgdGVzdHMgd2l0aCBzcXVhcmUKLWRubCBicmFja2V0cywgYmUgc3VyZSBjaGFuZ2VxdW90ZSBpbnZvY2F0aW9ucyBzdXJyb3VuZCBpdC4KLWRubAotZG5sCi1kbmwgdjIuNSBuZWVkZWQgZm9yIC0tYmluZGlyIGV0IGFsCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQoYXMuaCkKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BTV9JTklUX0FVVE9NQUtFKGdhcywgMi45LjQpCi0KLUFNX1BST0dfTElCVE9PTAotCi11c2VyX2JmZF9nYXM9Ci1BQ19BUkdfRU5BQkxFKGJmZC1hc3NlbWJsZXIsCi1bICAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyICB1c2UgQkZEIGJhY2sgZW5kIGZvciB3cml0aW5nIG9iamVjdCBmaWxlc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIG5lZWRfYmZkPXllcyB1c2VyX2JmZF9nYXM9eWVzIDs7Ci0gIG5vKSAgdXNlcl9iZmRfZ2FzPW5vIDs7Ci0gICopICAgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZ2l2ZW4gZm9yIGJmZC1hc3NlbWJsZXIgb3B0aW9uKSA7OwotZXNhY10pZG5sCi1BQ19BUkdfRU5BQkxFKHRhcmdldHMsCi1bICAgIHRhcmdldHMgICAgICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMgYmVzaWRlcyB0aGUgcHJpbWFyeV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0JICAgIDs7Ci0gIG5vKQkgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopCSAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoY29tbW9uYmZkbGliLAotWyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotCi11c2luZ19jZ2VuPW5vCi0KLSMgR2VuZXJhdGUgYSBoZWFkZXIgZmlsZQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLXRlX2ZpbGU9Z2VuZXJpYwotCi0jIE1ha2VmaWxlIHRhcmdldCBmb3IgaW5zdGFsbGluZyBnYXMgaW4gJCh0b29sZGlyKS9iaW4uCi1pbnN0YWxsX3Rvb2xkaXI9aW5zdGFsbC1leGVjLXRvb2xkaXIKLQotY2Fub25fdGFyZ2V0cz0iIgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgZm9yIHQgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2A7IGRvCi0gICAgcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdCAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLSAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0jICAgIGVsc2UKLSMgICAgICAjIFBlcm1pdCAiYWxsIiwgZXRjLiAgV2UgZG9uJ3Qgc3VwcG9ydCBpdCB5ZXQgdGhvdWdoLgotIyAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0IgotICAgIGZpCi0gIGRvbmUKLSAgR0FTX1VOSVEoY2Fub25fdGFyZ2V0cykKLWZpCi0KLWVtdWxhdGlvbnM9IiIKLQotZm9yIHRoaXNfdGFyZ2V0IGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMgOyBkbwotCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIGV2YWwgYGVjaG8gJHRoaXNfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvY3B1PVwxIHZlbmRvcj1cMiBvcz1cMy8nYAotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0gICAgIyBjaGVjayBmb3IgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzCi0gICAgYXJjaD0KLSAgICBlbmRpYW49Ci0gICAgY2FzZSAke2NwdX0gaW4KLSAgICAgIGFscGhhKikJCWNwdV90eXBlPWFscGhhIDs7Ci0gICAgICBhcm1lYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7Ci0gICAgICBhcm0qKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybXYqbCkJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgc3Ryb25nYXJtKikJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIHRodW1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBocHBhKikJCWNwdV90eXBlPWhwcGEgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgICBpWzQ1Nl04NikJCWNwdV90eXBlPWkzODYgOzsKLSAgICAgIG02ODBbMDEyMzQ2XTApCWNwdV90eXBlPW02OGsgOzsKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgIG02ODAwOCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODM/PykJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG01MjAwKQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTgqKQkJY3B1X3R5cGU9bTg4ayA7OwotICAgICAgbWlwcyplbCkJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcyopCQljcHVfdHlwZT1taXBzIGVuZGlhbj1iaWcgOzsKLSAgICAgIHBvd2VycGNsZSopCWNwdV90eXBlPXBwYyBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBwb3dlcnBjKikJCWNwdV90eXBlPXBwYyBlbmRpYW49YmlnIDs7Ci0gICAgICByczYwMDAqKQkJY3B1X3R5cGU9cHBjIDs7Ci0gICAgICBzcGFyY2xpdGUqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGl0ZSA7OwotICAgICAgc3BhcmNsZXQqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGV0IDs7Ci0gICAgICBzcGFyYzY0KikJCWNwdV90eXBlPXNwYXJjIGFyY2g9djktNjQgOzsKLSAgICAgIHNwYXJjODZ4KikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyYzg2eCAgOzsKLSAgICAgIHNwYXJjKikJCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsaXRlIDs7ICMgPz8/IFNlZSB0Yy1zcGFyYy5jLgotICAgICAgdjg1MCopCQljcHVfdHlwZT12ODUwIDs7Ci0gICAgICAqKQkJY3B1X3R5cGU9JHtjcHV9IDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICB0YXJnZXRfY3B1X3R5cGU9JHtjcHVfdHlwZX0KLSAgICBlbGlmIHRlc3QgJHt0YXJnZXRfY3B1X3R5cGV9ICE9ICR7Y3B1X3R5cGV9IDsgdGhlbgotICAgICAgY29udGludWUKLSAgICBmaQotCi0gICAgZ2VuZXJpY190YXJnZXQ9JHtjcHVfdHlwZX0tJHZlbmRvci0kb3MKLSAgICBkZXY9bm8KLSAgICBiZmRfZ2FzPW5vCi0gICAgZW09Z2VuZXJpYwotCi0gICAgIyBhc3NpZ24gb2JqZWN0IGZvcm1hdAotICAgIGNhc2UgJHtnZW5lcmljX3RhcmdldH0gaW4KLSAgICAgIGEyOWstKi1jb2ZmKSAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1hbWQtdWRpKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLWFtZC1lYm1vbikgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstbnl1LXN5bTEpICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay0qLXZ4d29ya3MqKSAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIGFscGhhKi0qLSp2bXMqKQkgICAgZm10PWV2YXggOzsKLSAgICAgIGFscGhhKi0qLW5ldHdhcmUqKSAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIGFscGhhKi0qLW9wZW5ic2QqKSAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIGFscGhhKi0qLW9zZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIGFscGhhKi0qLWxpbnV4ZWNvZmYqKSBmbXQ9ZWNvZmYgOzsKLSAgICAgIGFscGhhKi0qLWxpbnV4LWdudSopICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBhbHBoYSotKi1uZXRic2QqKSAgICAgZm10PWVsZiBlbT1uYnNkIDs7Ci0KLSAgICAgIGFyYy0qLWVsZiopICAgICAgICAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIGFybS0qLWFvdXQpCSAgICAgICAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgYXJtLSotY29mZiB8IHRodW1iLSotY29mZikgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhcm0tKi1lbGYgfCB0aHVtYi0qLWVsZikgICAgICAgICAgZm10PWVsZiA7OwotICAgICAgYXJtLSotbGludXgqYW91dCopCSAgICAgICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIGFybS0qLWxpbnV4KiB8IGFybXYqLSotbGludXgtZ251KQlmbXQ9ZWxmICBlbT1saW51eCA7OwotICAgICAgYXJtLSotbmV0YnNkKikJICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGFybS0qLW9hYmkgfCB0aHVtYi0qLW9hYmkpICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBhcm0tZXBvYy1wZSB8IHRodW1iLWVwb2MtcGUpICAgICAgZm10PWNvZmYgZW09ZXBvYy1wZSA7OwotICAgICAgYXJtLSotcGUgfCB0aHVtYi0qLXBlKSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBhcm0tKi1yaXNjaXgqKQkgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09cmlzY2l4IDs7Ci0KLSAgICAgIGQxMHYtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGQzMHYtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotCi0gICAgICBmcjMwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIGhwcGEtKi0qZWxmKikgICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1saXRlcyopICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1vc2YqKSAgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ydGVtcyopICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ocHV4KikgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1tcGVpeCopICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ic2QqKSAgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1oaXV4KikgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLQotICAgICAgaDgzMDAtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIGkzODYtaWJtLWFpeCopICAgICAgICBmbXQ9Y29mZiBlbT1pMzg2YWl4IDs7Ci0gICAgICBpMzg2LXNlcXVlbnQtYnNkKikgICAgZm10PWFvdXQgZW09ZHluaXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1iZW9zcGUqKSAgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJlb3NlbGYqIHwgaTM4Ni0qLWJlb3MqKSBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYnNkKikgICAgICAgICAgZm10PWFvdXQgZW09Mzg2YnNkIDs7Ci0gICAgICBpMzg2LSotbmV0YnNkMC44KSAgICAgZm10PWFvdXQgZW09Mzg2YnNkIDs7Ci0gICAgICBpMzg2LSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllczs7Ci0gICAgICBpMzg2LSotb3BlbmJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllczs7Ci0gICAgICBpMzg2LSotbGludXgqYW91dCogfCBpMzg2LSotbGludXhvbGRsZCkgICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgaTM4Ni0qLWxpbnV4KmNvZmYqKSAgIGZtdD1jb2ZmIGVtPWxpbnV4IDs7Ci0gICAgICBpMzg2LSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1saW51eCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWx5bnhvcyopICAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIGkzODYtKi1zeXN2NCogfCBpMzg2LSotc29sYXJpcyogfCBpMzg2LSotZWxmKQotCQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1mcmVlYnNkYW91dCogfCBpMzg2LSotZnJlZWJzZFsxMl0uKiB8IGkzODYtKi1mcmVlYnNkWzEyXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1mcmVlYnNkKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1jb2ZmIHwgaTM4Ni0qLXN5c3YqIHwgaTM4Ni0qLXNjbzMuMnY1KmNvZmYgfCBpMzg2LSotaXNjKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1zY28zLjJ2NSopICAgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJQUNfREVGSU5FKFNDT19FTEYsIDEsCi0JCQkJICAgIFtEZWZpbmUgaWYgZGVmYXVsdGluZyB0byBFTEYgb24gU0NPIDUuXSkKLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBpMzg2LSotc2NvMy4yKikgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi12c3RhKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1zZG9zZGpncHAqIHwgaTM4Ni0qLWdvMzIqIHwgaTM4Ni1nbzMyLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiBlbT1nbzMyOzsKLSAgICAgIGkzODYtKi1ydGVtc2VsZiopICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1nbnUqKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotbWFjaCopCi0JCQkgICAgZm10PWFvdXQgZW09bWFjaCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1zZG9zKikgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpMzg2LSotbW9zcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGkzODYtKi1jeWd3aW4qKSAgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1pbmd3MzIqKSAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotKm50KikgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGk5NjAtKi1ib3V0KSAgICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1uaW5keSopICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M0KikgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuMCkgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4qKSAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3MqKSAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLQotICAgICAgbTMyci0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBtNjhrLSotdnh3b3JrcyogfCBtNjhrLWVyaWNzc29uLW9zZSB8IG02OGstKi1zdW5vcyopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgbTY4ay1tb3Rvcm9sYS1zeXN2KikgIGZtdD1jb2ZmIGVtPWRlbHRhIDs7Ci0gICAgICBtNjhrLWJ1bGwtc3lzdjMqKSAgICAgZm10PWNvZmYgZW09ZHB4MiA7OwotICAgICAgbTY4ay1hcG9sbG8tKikgICAgICAgIGZtdD1jb2ZmIGVtPWFwb2xsbyA7OwotICAgICAgbTY4ay0qLXN5c3Y0KikgIyBtdXN0IGJlIGJlZm9yZSAtc3lzdioKLQkJCSAgICBmbXQ9ZWxmIGVtPXN2cjQgOzsKLSAgICAgIG02OGstKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbTY4ay0qLWNvZmYgfCBtNjhrLSotc3lzdiogfCBtNjhrLSotcnRlbXMqKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBtNjhrLSotaHB1eCopICAgICAgICAgZm10PWhwMzAwIGVtPWhwMzAwIDs7Ci0gICAgICBtNjhrLSotbGludXgqYW91dCopICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIG02OGstKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotZ251KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBtNjhrLSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgbTY4ay0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstYXBwbGUtYXV4KikgICAgICBmbXQ9Y29mZiBlbT1hdXggOzsKLSAgICAgIG02OGstKi1wc29zKikgICAgICAgICBmbXQ9ZWxmIGVtPXBzb3M7OwotCi0gICAgICBtODhrLW1vdG9yb2xhLXN5c3YzKikgZm10PWNvZmYgZW09ZGVsdDg4IDs7Ci0gICAgICBtODhrLSotY29mZiopICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgbWNvcmUtKi1lbGYpCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtY29yZS0qLXBlKQkgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgIyBkb24ndCBjaGFuZ2UgZW0gbGlrZSAqLSotYnNkIGRvZXMKLSAgICAgIG1pcHMtZGVjLW5ldGJzZCopCSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLW9wZW5ic2QqKSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLWJzZCopICAgICAgICBmbXQ9YW91dCBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLXNvbnktYnNkKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotYnNkKikgICAgICAgICAgQUNfTVNHX0VSUk9SKFVua25vd24gdmVuZG9yIGZvciBtaXBzLWJzZCBjb25maWd1cmF0aW9uLikgOzsKLSAgICAgIG1pcHMtKi11bHRyaXgqKSAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLW9zZiopICAgICAgICAgIGZtdD1lY29mZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLSotZWNvZmYqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotZWNvZmYqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotaXJpeDYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLWlyaXg1KikgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1sbmV3cyopICAgICAgICBmbXQ9ZWNvZmYgZW09bG5ld3MgOzsKLSAgICAgIG1pcHMtKi1yaXNjb3MqKSAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1zeXN2KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1lbGYqIHwgbWlwcy0qLXJ0ZW1zKiB8IG1pcHMtKi1saW51eC1nbnUqIHwgbWlwcy0qLWdudSogfCBtaXBzLSotb3BlbmJzZCopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLXZ4d29ya3MqKSAgICAgIGZtdD1lbGYKLQkJCSAgICBBQ19ERUZJTkUoTUlQU19TVEFCU19FTEYsIDEsCi0JCQkJW1VzZSBFTEYgc3RhYnMgZm9yIE1JUFMsIG5vdCBFQ09GRiBzdGFic10pCi0JCQkgICAgOzsKLSAgICAgIG1uMTAyMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbW4xMDMwMC0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBwcGMtKi1wZSB8IHBwYy0qLWN5Z3dpbiogfCBwcGMtKi13aW5udCopCi0JCSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBwcGMtKi1haXgqKSAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLWJlb3MqKSAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgcHBjLSotKmJzZCogfCBwcGMtKi1lbGYqIHwgcHBjLSotZWFiaSogfCBwcGMtKi1zeXN2NCopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbGludXgtZ251KikJICAgIGZtdD1lbGYKLQkJCSAgICBjYXNlICIkZW5kaWFuIiBpbgotCQkJICAgIGJpZykgIDs7Ci0JCQkgICAgKikgICAgQUNfTVNHX0VSUk9SKEdOVS9MaW51eCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmlnIGVuZGlhbikgOzsKLQkJCSAgICBlc2FjCi0JCQkgICAgOzsKLSAgICAgIHBwYy0qLXNvbGFyaXMqKQkgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJQUNfREVGSU5FKFRBUkdFVF9TT0xBUklTX0NPTU1FTlQsIDEsCi0JCQkJW0RlZmluZSBpZiBkZWZhdWx0IHRhcmdldCBpcyBQb3dlclBDIFNvbGFyaXMuXSkKLQkJCSAgICBmaQotCQkJICAgIGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhiaWc7IHRoZW4KLQkJCQlBQ19NU0dfRVJST1IoU29sYXJpcyBtdXN0IGJlIGNvbmZpZ3VyZWQgbGl0dGxlIGVuZGlhbikKLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1ydGVtcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1tYWNvcyogfCBwcGMtKi1tcHcqKQotCQkJICAgIGZtdD1jb2ZmIGVtPW1hY29zIDs7Ci0gICAgICBwcGMtKi1uZXR3YXJlKikgICAgICAgZm10PWVsZiBlbT1wcGNudyA7OwotICAgICAgcHBjLSotdnh3b3JrcyopICAgICAgIGZtdD1lbGYgOzsKLQotICAgICAgc2gtKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgc2gtKi1jb2ZmKikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzaC0qLXJ0ZW1zZWxmKikgICAgICAgZm10PWVsZiA7OwotICAgICAgc2gtKi1ydGVtcyopCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBuczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikgICAgZm10PWFvdXQgZW09cGM1MzJtYWNoIDs7Ci0gICAgICBuczMyay1wYzUzMi1uZXRic2QqIHwgbnMzMmstcGM1MzItbGl0ZXMqKSAgZm10PWFvdXQgZW09bmJzZDUzMiA7OwotICAgICAgbnMzMmstcGM1MzItb3BlbmJzZCopIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKLQotICAgICAgc3BhcmMtKi1ydGVtcyopICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBzcGFyYy0qLXN1bm9zNCopICAgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgc3BhcmMtKi1hb3V0IHwgc3BhcmMqLSotdnh3b3JrcyopCi0JCQkgICAgZm10PWFvdXQgZW09c3BhcmNhb3V0IDs7Ci0gICAgICBzcGFyYy0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHNwYXJjLSotbGludXgqYW91dCopICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgc3BhcmMtKi1saW51eC1nbnUqKSAgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIHNwYXJjLSotbHlueG9zKikgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBzcGFyYy1mdWppdHN1LW5vbmUpICAgZm10PWFvdXQgOzsKLSAgICAgIHNwYXJjLSotZWxmIHwgc3BhcmMtKi1zeXN2NCogfCBzcGFyYy0qLXNvbGFyaXMqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHNwYXJjLSotbmV0YnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7Ci0gICAgICBzcGFyYy0qLW9wZW5ic2QqKSAgICAgZm10PWFvdXQgZW09bmJzZCA7OwotCi0gICAgICBzdHJvbmdhcm0tKi1jb2ZmKSAgICAgZm10PWNvZmYgOzsKLSAgICAgIHN0cm9uZ2FybS0qLWVsZikgICAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIHRpYzMwLSotKmFvdXQqKQkgICAgZm10PWFvdXQgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHRpYzMwLSotKmNvZmYqKSAgICAgICBmbXQ9Y29mZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdGljODAtKi0qKQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgdjg1MC0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdjg1MGUtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdjg1MGVhLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgdmF4LSotYnNkKiB8IHZheC0qLXVsdHJpeCopCi0JCQkgICAgZm10PWFvdXQgOzsKLSAgICAgIHZheC0qLXZtcykgICAgICAgICAgICBmbXQ9dm1zIDs7Ci0KLQotICAgICAgejhrLSotY29mZiB8IHo4ay0qLXNpbSkKLQkJCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICB3NjUtKi0qKSAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgKi0qLWFvdXQgfCAqLSotc2NvdXQpCi0JCQkgICAgZm10PWFvdXQgOzsKLSAgICAgICotKi1uaW5keSopCi0JCQkgICAgZm10PWJvdXQgOzsKLSAgICAgICotKi1ic2QqKQotCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgICotKi1nZW5lcmljKSAgICAgICAgICBmbXQ9Z2VuZXJpYyA7OwotICAgICAgKi0qLXhyYXkgfCAqLSotaG1zKSAgIGZtdD1jb2ZmIDs7Ci0gICAgICAqLSotc2ltKSAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgICotKi1lbGYgfCAqLSotc3lzdjQqIHwgKi0qLXNvbGFyaXMqKQotCQkJICAgIEFDX01TR19XQVJOKEdBUyBzdXBwb3J0IGZvciAke2dlbmVyaWNfdGFyZ2V0fSBpcyBpbmNvbXBsZXRlLikKLQkJCSAgICBmbXQ9ZWxmIGRldj15ZXMgOzsKLSAgICAgICotKi12eHdvcmtzKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5ldHdhcmUpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIGVuZGlhbl9kZWY9Ci0gICAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JZW5kaWFuX2RlZj0xCi0gICAgICBlbGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhsaXR0bGU7IHRoZW4KLQllbmRpYW5fZGVmPTAKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IHgke2VuZGlhbl9kZWZ9ICE9IHg7IHRoZW4KLQlBQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sICRlbmRpYW5fZGVmLAotCQkJICAgW0RlZmluZSBhcyAxIGlmIGJpZyBlbmRpYW4uXSkKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGNhc2UgJHtjcHVfdHlwZX0tJHtmbXR9IGluCi0gICAgICBhbHBoYSotKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIGFybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICMgbm90IHlldAotICAgICMgaTM4Ni1hb3V0KQliZmRfZ2FzPXByZWZlcnJlZCA7OwotICAgICAgbWlwcy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgbnMzMmstKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBwYy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgc3BhcmMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHN0cm9uZ2FybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lbGYpCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLWVjb2ZmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1zb20pCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqKQkJOzsKLSAgICBlc2FjCi0KLSMgT3RoZXIgcmFuZG9tIHN0dWZmLgotCi0gICAgIyBEbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgdmF4IHwgaTM4NiB8IHRpYzMwKQotCTs7Ci0KLSAgICAgICopCi0JbmVlZF9vcGNvZGVzPXllcwotCi0JY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLQl5ZXMpIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqb3Bjb2RlcyopIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqKSBzaGFyZWRfb3Bjb2Rlcz1mYWxzZSA7OwotCWVzYWMKLQlpZiB0ZXN0ICIke3NoYXJlZF9vcGNvZGVzfSIgPSAidHJ1ZSI7IHRoZW4KLQkgICMgQSBzaGFyZWQgbGlib3Bjb2RlcyBtdXN0IGJlIGxpbmtlZCBhZ2FpbnN0IGxpYmJmZC4KLQkgIG5lZWRfYmZkPXllcwotCWZpCi0JOzsKLSAgICBlc2FjCi0KLSAgICAjIEFueSBvdGhlciBzcGVjaWFsIG9iamVjdCBmaWxlcyBuZWVkZWQgPwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIGZyMzAgfCBtMzJyKQotCXVzaW5nX2NnZW49eWVzCi0JOzsKLQotICAgICAgbTY4aykKLQljYXNlICR7ZXh0cmFfb2JqZWN0c30gaW4KLQkqbTY4ay1wYXJzZS5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBtNjhrLXBhcnNlLm8iIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIG1pcHMpCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1wYXJzZS5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1wYXJzZS5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLWxleC5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1sZXgubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1vcHMubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0Ymwtb3BzLm8iCi0JZmkKLQk7OwotCi0gICAgICBzcGFyYykKLQlpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0JICBBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9BUkNILCAiJHthcmNofSIsIFtEZWZhdWx0IGFyY2hpdGVjdHVyZS5dKQotCWZpCi0JOzsKLSAgICAgICopCi0JOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCWNhc2UgIngke2V4dHJhX29iamVjdHN9IiBpbgotCSpjZ2VuLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGNnZW4ubyIgOzsKLQllc2FjCi0gICAgZmkKLQotIyBTZWUgaWYgd2UgcmVhbGx5IGNhbiBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBlbXVsYXRpb24gY29kZS4KLQotICAgIGlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHByaW1hcnlfYmZkX2dhcz0kYmZkX2dhcwotICAgICAgb2JqX2Zvcm1hdD0kZm10Ci0gICAgICB0ZV9maWxlPSRlbQotCi0gICAgICBpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0JIyBDYW4ndCBzdXBwb3J0IG90aGVyIGNvbmZpZ3VyYXRpb25zIHRoaXMgd2F5LgotCWJyZWFrCi0gICAgICBmaQotICAgIGVsaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotICAgICAgIyBDYW4ndCBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICAgIGJyZWFrCi0gICAgZmkKLQotIyBGcm9tIHRhcmdldCBuYW1lIGFuZCBmb3JtYXQsIHByb2R1Y2UgYSBsaXN0IG9mIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fS0ke2ZtdH0gaW4KLSAgICAgIG1pcHMtKi1pcml4NSotKikJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0gICAgICBtaXBzLSotbGludXgtZ251Ki0qKSBjYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiBtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLWxuZXdzKi1lY29mZikgOzsKLSAgICAgIG1pcHMtKi0qLWVjb2ZmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotKi1lbGYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiIgOzsKLSAgICAgICMgVW5jb21tZW50aW5nIHRoZSBuZXh0IGxpbmUgd2lsbCB0dXJuIG9uIHN1cHBvcnQgZm9yIGkzODYgQ09GRgotICAgICAgIyBpbiBhbnkgaTM4NiBFTEYgY29uZmlndXJhdGlvbi4gIFRoaXMgcHJvYmFibHkgZG9lc24ndCB3b3JrCi0gICAgICAjIGNvcnJlY3RseS4KLSAgICAgICMgaTM4Ni0qLSotZWxmKQllbXVsYXRpb249ImkzODZjb2ZmIGkzODZlbGYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgZXNhYwotCi0gICAgZW11bGF0aW9ucz0iJGVtdWxhdGlvbnMgJGVtdWxhdGlvbiIKLQotZG9uZQotCi0jIEFzc2lnbiBmbG9hdGluZyBwb2ludCB0eXBlLiAgTW9zdCBwcm9jZXNzb3JzIHdpdGggRlAgc3VwcG9ydAotIyBJRUVFIEZQLiAgT24gdGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IEZQIGF0IGFsbCwgdXN1YWxseSBJRUVFCi0jIGlzIGVtdWxhdGVkLgotY2FzZSAke3RhcmdldF9jcHV9IGluCi0gIHZheCB8IHRhaG9lICkJYXRvZj0ke3RhcmdldF9jcHV9IDs7Ci0gICopCQlhdG9mPWllZWUgOzsKLWVzYWMKLQotY2FzZSAiJHtvYmpfZm9ybWF0fSIgaW4KLSAgIiIpIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3Qga25vdyB3aGF0IGZvcm1hdCB0byB1c2UgZm9yIHRhcmdldCAke3RhcmdldH0pIDs7Ci1lc2FjCi0KLSMgVW5mb3J0dW5hdGVseSB0aGUgY3B1IGluIGNwdS1vcGMuaCBmaWxlIGlzbid0IGFsd2F5cyAkKFRBUkdFVF9DUFUpLgotY2dlbl9jcHVfcHJlZml4PSIiCi1pZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotICBjYXNlICR7dGFyZ2V0X2NwdX0gaW4KLSAgICAqKSBjZ2VuX2NwdV9wcmVmaXg9JHt0YXJnZXRfY3B1fSA7OwotICBlc2FjCi0gIEFDX1NVQlNUKGNnZW5fY3B1X3ByZWZpeCkKLSAgQUNfREVGSU5FKFVTSU5HX0NHRU4sIDEsIFtVc2luZyBjZ2VuIGNvZGU/XSkKLWZpCi0KLWRubAotZG5sIE1ha2Ugc3VyZSB0aGUgZGVzaXJlZCBzdXBwb3J0IGZpbGVzIGV4aXN0LgotZG5sCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL3RjLSR7dGFyZ2V0X2NwdV90eXBlfS5jOyB0aGVuCi0gIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgQ1BVICR7dGFyZ2V0X2NwdV90eXBlfSkKLWZpCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL29iai0ke29ial9mb3JtYXR9LmM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKEdBUyBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdCAke29ial9mb3JtYXR9KQotZmkKLQotY2FzZSAke3VzZXJfYmZkX2dhc30tJHtwcmltYXJ5X2JmZF9nYXN9IGluCi0gIHllcy15ZXMgfCBuby1ubykKLSAgICAjIFdlIGRpZG4ndCBvdmVycmlkZSB1c2VyJ3MgY2hvaWNlLgotICAgIDs7Ci0gIG5vLXllcykKLSAgICBBQ19NU0dfV0FSTihVc2Ugb2YgQkZEIGlzIHJlcXVpcmVkIGZvciAke3RhcmdldH07IG92ZXJyaWRpbmcgY29uZmlnIG9wdGlvbnMuKQotICAgIDs7Ci0gIG5vLXByZWZlcnJlZCkKLSAgICBwcmltYXJ5X2JmZF9nYXM9bm8KLSAgICA7OwotICAqLXByZWZlcnJlZCkKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgeWVzLSopCi0gICAgcHJpbWFyeV9iZmRfZ2FzPXllcwotICAgIDs7Ci0gIC0qKQotICAgICMgVXNlciBzcGVjaWZpZWQgbm90aGluZy4KLSAgICA7OwotZXNhYwotCi0jIFNvbWUgQ09GRiBjb25maWd1cmF0aW9ucyB3YW50IHRoZXNlIHJhbmRvbSBvdGhlciBmbGFncyBzZXQuCi1jYXNlICR7b2JqX2Zvcm1hdH0gaW4KLSAgY29mZikKLSAgICBjYXNlICR7dGFyZ2V0X2NwdV90eXBlfSBpbgotICAgICAgaTM4NikgQUNfREVGSU5FKEkzODZDT0ZGLCAxLCBbVXNpbmcgaTM4NiBDT0ZGP10pIDs7Ci0gICAgICBtNjhrKSBBQ19ERUZJTkUoTTY4S0NPRkYsIDEsIFtVc2luZyBtNjhrIENPRkY/XSkgOzsKLSAgICAgIG04OGspIEFDX0RFRklORShNODhLQ09GRiwgMSwgW1VzaW5nIG04OGsgQ09GRj9dKSA7OwotICAgIGVzYWMKLSAgICA7OwotZXNhYwotCi0jIEdldHRpbmcgdGhpcyBkb25lIHJpZ2h0IGlzIGdvaW5nIHRvIGJlIGEgYml0Y2guICBFYWNoIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkCi0jIHdpdGggLS1lbmFibGUtdGFyZ2V0cz0uLi4gc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGVudmlyb25tZW50LCBmb3JtYXQsIGNwdSwgYW5kCi0jIGJmZF9nYXMgc2V0dGluZy4KLSMKLSMgRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgdGhlIG5lY2Vzc2FyeSBvYmplY3QgZmlsZSBzdXBwb3J0IGNvZGUgbXVzdCBiZSBsaW5rZWQKLSMgaW4uICBUaGlzIG1pZ2h0IGJlIG9ubHkgb25lLCBpdCBtaWdodCBiZSB1cCB0byBmb3VyLiAgVGhlIG5lY2Vzc2FyeSBlbXVsYXRpb24KLSMgY29kZSBuZWVkcyB0byBiZSBwcm92aWRlZCwgdG9vLgotIwotIyBBbmQgdGhlbiB0aGVyZSdzICItLWVuYWJsZS10YXJnZXRzPWFsbCIuLi4uCi0jCi0jIEZvciBub3csIGp1c3QgYWx3YXlzIGRvIGl0IGZvciBNSVBTIEVMRiBvciBFQ09GRiBjb25maWd1cmF0aW9ucy4gIFNpZ2guCi0KLWZvcm1hdHM9IiR7b2JqX2Zvcm1hdH0iCi1lbWZpbGVzPSIiCi1FTVVMQVRJT05TPSIiCi1HQVNfVU5JUShlbXVsYXRpb25zKQotZm9yIGVtIGluIC4gJGVtdWxhdGlvbnMgOyBkbwotICBjYXNlICRlbSBpbgotICAgIC4pCWNvbnRpbnVlIDs7Ci0gICAgbWlwc2JlbGYgfCBtaXBzbGVsZikKLQlmbXQ9ZWxmICAgZmlsZT1taXBzZWxmIDs7Ci0gICAgbWlwc2JlY29mZiB8IG1pcHNsZWNvZmYpCi0JZm10PWVjb2ZmIGZpbGU9bWlwc2Vjb2ZmIDs7Ci0gICAgaTM4NmNvZmYpCi0JZm10PWNvZmYgIGZpbGU9aTM4NmNvZmYgOzsKLSAgICBpMzg2ZWxmKQotCWZtdD1lbGYgICBmaWxlPWkzODZlbGYgOzsKLSAgZXNhYwotICBmb3JtYXRzPSIkZm9ybWF0cyAkZm10IgotICBlbWZpbGVzPSIkZW1maWxlcyBlLSRmaWxlLm8iCi0gIEVNVUxBVElPTlM9IiRFTVVMQVRJT05TICYkZW0sIgotZG9uZQotR0FTX1VOSVEoZm9ybWF0cykKLUdBU19VTklRKGVtZmlsZXMpCi1pZiB0ZXN0IGBzZXQgLiAkZm9ybWF0cyA7IHNoaWZ0IDsgZWNobyAkI2AgLWd0IDEgOyB0aGVuCi0gIGZvciBmbXQgaW4gJGZvcm1hdHMgOyBkbwotICAgIGNhc2UgJGZtdCBpbgotICAgICAgYW91dCkJQUNfREVGSU5FKE9CSl9NQVlCRV9BT1VULCAxLCAgICBbYS5vdXQgc3VwcG9ydD9dKSAgIDs7Ci0gICAgICBib3V0KQlBQ19ERUZJTkUoT0JKX01BWUJFX0JPVVQsIDEsICAgIFtiLm91dCBzdXBwb3J0P10pICAgOzsKLSAgICAgIGNvZmYpCUFDX0RFRklORShPQkpfTUFZQkVfQ09GRiwgMSwgICAgW0NPRkYgc3VwcG9ydD9dKSAgICA7OwotICAgICAgZWNvZmYpCUFDX0RFRklORShPQkpfTUFZQkVfRUNPRkYsIDEsICAgW0VDT0ZGIHN1cHBvcnQ/XSkgICA7OwotICAgICAgZWxmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0VMRiwgMSwgICAgIFtFTEYgc3VwcG9ydD9dKSAgICAgOzsKLSAgICAgIGdlbmVyaWMpCUFDX0RFRklORShPQkpfTUFZQkVfR0VORVJJQywgMSwgW2dlbmVyaWMgc3VwcG9ydD9dKSA7OwotICAgICAgaHAzMDApCUFDX0RFRklORShPQkpfTUFZQkVfSFAzMDAsIDEsICAgW0hQMzAwIHN1cHBvcnQ/XSkgICA7OwotICAgICAgaWVlZSkJQUNfREVGSU5FKE9CSl9NQVlCRV9JRUVFLCAxLCAgICBbSUVFRSBzdXBwb3J0P10pICAgIDs7Ci0gICAgICBzb20pCUFDX0RFRklORShPQkpfTUFZQkVfU09NLCAxLCAgICAgW1NPTSBzdXBwb3J0P10pICAgICA7OwotICAgICAgdm1zKQlBQ19ERUZJTkUoT0JKX01BWUJFX1ZNUywgMSwgICAgIFtWTVMgc3VwcG9ydD9dKSAgICAgOzsKLSAgICBlc2FjCi0gICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgb2JqLSRmbXQubyIKLSAgZG9uZQotICBvYmpfZm9ybWF0PW11bHRpCi1maQotaWYgdGVzdCBgc2V0IC4gJGVtZmlsZXMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAwIDsgdGhlbgotICB0ZV9maWxlPW11bHRpCi0gIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzICRlbWZpbGVzIgotICBERUZBVUxUX0VNVUxBVElPTj1gc2V0IC4gJGVtdWxhdGlvbnMgOyBlY2hvICQyYAotICBBQ19ERUZJTkUoVVNFX0VNVUxBVElPTlMsIDEsIFtVc2UgZW11bGF0aW9uIHN1cHBvcnQ/XSkKLWZpCi1BQ19TVUJTVChleHRyYV9vYmplY3RzKQotQUNfREVGSU5FX1VOUVVPVEVEKEVNVUxBVElPTlMsICRFTVVMQVRJT05TLCBbU3VwcG9ydGVkIGVtdWxhdGlvbnMuXSkKLUFDX0RFRklORV9VTlFVT1RFRChERUZBVUxUX0VNVUxBVElPTiwgIiRERUZBVUxUX0VNVUxBVElPTiIsCi0JCSAgIFtEZWZhdWx0IGVtdWxhdGlvbi5dKQotCi1jYXNlICR7cHJpbWFyeV9iZmRfZ2FzfS0ke3RhcmdldF9jcHVfdHlwZX0tJHtvYmpfZm9ybWF0fSBpbgotICB5ZXMtKi1jb2ZmKQluZWVkX2JmZD15ZXMgOzsKLSAgbm8tKi1jb2ZmKQluZWVkX2JmZD15ZXMKLQkJQUNfREVGSU5FKE1BTllfU0VHTUVOVFMsIDEsIFtvbGQgQ09GRiBzdXBwb3J0P10pIDs7Ci1lc2FjCi0KLXJlamVjdF9kZXZfY29uZmlncz15ZXMKLQotY2FzZSAke3JlamVjdF9kZXZfY29uZmlnc30tJHtkZXZ9IGluCi0gIHllcy15ZXMpICMgT29wcy4KLSAgICBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IHN1cHBvcnQgdGhlICR7Z2VuZXJpY190YXJnZXR9IGNvbmZpZ3VyYXRpb24uKQotICAgIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKHRhcmdldF9jcHVfdHlwZSkKLUFDX1NVQlNUKG9ial9mb3JtYXQpCi1BQ19TVUJTVCh0ZV9maWxlKQotQUNfU1VCU1QoaW5zdGFsbF90b29sZGlyKQotQUNfU1VCU1QoYXRvZikKLWRubCBBQ19TVUJTVChlbXVsYXRpb24pCi0KLWNhc2UgIiR7cHJpbWFyeV9iZmRfZ2FzfSIgaW4KLSAgeWVzKQlBQ19ERUZJTkUoQkZEX0FTU0VNQkxFUiwgMSwgW1VzZSBCRkQgaW50ZXJmYWNlP10pCi0JbmVlZF9iZmQ9eWVzIDs7Ci1lc2FjCi0KLSMgZG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PwotY2FzZSAiJHtuZWVkX29wY29kZXN9IiBpbgoteWVzKQotICBPUENPREVTX0xJQj0uLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKLSAgOzsKLWVzYWMKLQotY2FzZSAiJHtuZWVkX2JmZH0iIGluCi15ZXMpCi0gIEJGRExJQj0uLi9iZmQvbGliYmZkLmxhCi0gIEFMTF9PQkpfREVQUz0iJEFMTF9PQkpfREVQUyAuLi9iZmQvYmZkLmgiCi0gIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKEJGRExJQikKLUFDX1NVQlNUKE9QQ09ERVNfTElCKQotCi1BQ19TVUJTVChBTExfT0JKX0RFUFMpCi0KLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfQUxJQVMsCSIke3RhcmdldF9hbGlhc30iLCBbVGFyZ2V0IGFsaWFzLl0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0NBTk9OSUNBTCwJIiR7dGFyZ2V0fSIsICAgICAgIFtDYW5vbmljYWwgdGFyZ2V0Ll0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0NQVSwJCSIke3RhcmdldF9jcHV9IiwgICBbVGFyZ2V0IENQVS5dKQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9WRU5ET1IsCSIke3RhcmdldF92ZW5kb3J9IiwgW1RhcmdldCB2ZW5kb3IuXSkKLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfT1MsCQkiJHt0YXJnZXRfb3N9IiwgICAgW1RhcmdldCBPUy5dKQotCi1BQ19QUk9HX0NDCi0KLUFDX1BST0dfWUFDQwotQU1fUFJPR19MRVgKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0ZGxpYi5oIG1lbW9yeS5oIHN0cmluZ3MuaCB1bmlzdGQuaCBzdGRhcmcuaCB2YXJhcmdzLmggZXJybm8uaCBzeXMvdHlwZXMuaCkKLQotIyBQdXQgdGhpcyBoZXJlIHNvIHRoYXQgYXV0b2NvbmYncyAiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlIGRvZXNuJ3QgY29uZnVzZQotIyBwZW9wbGUgd2hvIGFyZSBub3QgY3Jvc3MtY29tcGlsaW5nIGJ1dCBhcmUgY29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcnMuCi1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBjb21waWxpbmcgYSBjcm9zcy1hc3NlbWJsZXIpCi1pZiB0ZXN0ICIke2hvc3R9IiA9ICIke3RhcmdldH0iOyB0aGVuCi0gIGNyb3NzX2dhcz1ubwotZWxzZQotICBjcm9zc19nYXM9eWVzCi0gIEFDX0RFRklORShDUk9TU19DT01QSUxFLCAxLCBbQ29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcj9dKQotZmkKLUFDX01TR19SRVNVTFQoJGNyb3NzX2dhcykKLQotZG5sIGFuc2lkZWNsLmggd2lsbCBkZWFsIHdpdGggY29uc3QKLWRubCBBQ19DT05TVAotQUNfRlVOQ19BTExPQ0EKLUFDX0NfSU5MSU5FCi0KLSMgVk1TIGRvZXNuJ3QgaGF2ZSB1bmxpbmsuCi1BQ19DSEVDS19GVU5DUyh1bmxpbmsgcmVtb3ZlLCBicmVhaykKLQotIyBTb21lIHN5c3RlbXMgZG9uJ3QgaGF2ZSBzYnJrKCkuCi1BQ19DSEVDS19GVU5DUyhzYnJrKQotCi0jIFNvbWUgbm9uLUFOU0kgcHJlcHJvY2Vzc29ycyBib3RjaCByZXF1b3RpbmcgaW5zaWRlIHN0cmluZ3MuICBUaGF0J3MgYmFkCi0jIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi0jIHdvcmtpbmcgcHJvcGVybHkhCi1HQVNfV09SS0lOR19BU1NFUlQKLQotIyBPbiBzb21lIHN5c3RlbXMsIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIG1heSBub3QgZGVjbGFyZSBtYWxsb2MsIHJlYWxsb2MsCi0jIGFuZCBmcmVlLiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSBnYXMgbmVlZHMgdGhlc2UgZnVuY3Rpb25zIHRvIGhhdmUgYmVlbgotIyBkZWNsYXJlZCAtLSBzdWNoIGFzIHdoZW4gdGFraW5nIHRoZWlyIGFkZHJlc3Nlcy4KLWdhc190ZXN0X2hlYWRlcnM9IgotI2lmZGVmIEhBVkVfTUVNT1JZX0gKLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotIgotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKHN0cnN0ciwgZiwgY2hhciAqKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKLUdBU19DSEVDS19ERUNMX05FRURFRChtYWxsb2MsIGYsIGNoYXIgKigqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoZnJlZSwgZiwgdm9pZCAoKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKHNicmssIGYsIGNoYXIgKigqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoZW52aXJvbiwgZiwgY2hhciAqKmYsICRnYXNfdGVzdF9oZWFkZXJzKQotCi0jIERvZXMgZXJybm8uaCBkZWNsYXJlIGVycm5vLCBvciBkbyB3ZSBoYXZlIHRvIGFkZCBhIHNlcGFyYXRlIGRlY2xhcmF0aW9uCi0jIGZvciBpdD8KLUdBU19DSEVDS19ERUNMX05FRURFRChlcnJubywgZiwgaW50IGYsIFsKLSNpZmRlZiBIQVZFX0VSUk5PX0gKLSNpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi1dKQotCi1kbmwgVGhpcyBtdXN0IGNvbWUgbGFzdC4KLQotZG5sIFdlIHVzZWQgdG8gbWFrZSBzeW1saW5rcyB0byBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgYnV0IG5vdwotZG5sIHdlIGp1c3QgdXNlIHRoZSByaWdodCBuYW1lIGZvciAuYyBmaWxlcywgYW5kIGNyZWF0ZSAuaCBmaWxlcyBpbgotZG5sIHRoZSBidWlsZCBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZSB0aGUgcmlnaHQgLmggZmlsZS4gIE1ha2Ugc3VyZQotZG5sIHRoZSBvbGQgc3ltbGlua3MgZG9uJ3QgZXhpc3QsIHNvIHRoYXQgYSByZWNvbmZpZ3VyZSBpbiBhbiBleGlzdGluZwotZG5sIGRpcmVjdG9yeSBiZWhhdmVzIHJlYXNvbmFibHkuCi0KLUFDX09VVFBVVChNYWtlZmlsZSBkb2MvTWFrZWZpbGUgLmdkYmluaXQ6Z2RiaW5pdC5pbiBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3JtIC1mIHRhcmctY3B1LmMgdGFyZy1jcHUuaCBvYmotZm9ybWF0Lmggb2JqLWZvcm1hdC5jIHRhcmctZW52LmggYXRvZi10YXJnLmMgaXRibC1jcHUuaAotIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiR7dGFyZ2V0X2NwdV90eXBlfSInLmgiJyA+IHRhcmctY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAib2JqLSciJHtvYmpfZm9ybWF0fSInLmgiJyA+IG9iai1mb3JtYXQuaAotIGVjaG8gJyNpbmNsdWRlICJ0ZS0nIiR7dGVfZmlsZX0iJy5oIicgPiB0YXJnLWVudi5oCi0gZWNobyAnI2luY2x1ZGUgIml0YmwtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiBpdGJsLWNwdS5oCi0gaWYgdGVzdCAieCRjZ2VuX2NwdV9wcmVmaXgiICE9IHggOyB0aGVuCi0gICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiR7Y2dlbl9jcHVfcHJlZml4fSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmgKLSBmaQotCi0gc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSwKLVt0YXJnZXRfY3B1X3R5cGU9JHt0YXJnZXRfY3B1X3R5cGV9Ci0gY2dlbl9jcHVfcHJlZml4PSR7Y2dlbl9jcHVfcHJlZml4fQotIG9ial9mb3JtYXQ9JHtvYmpfZm9ybWF0fQotIHRlX2ZpbGU9JHt0ZV9maWxlfV0pCmRpZmYgLS1naXQgYS9nYXMvZGVidWcuYyBiL2dhcy9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTlmMjNmLi4wMDAwMDAwCi0tLSBhL2dhcy9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBkZWJ1Zy5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogUm91dGluZXMgZm9yIGRlYnVnIHVzZSBvbmx5LiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi1kbXBfZnJhZ3MgKCkKLXsKLSAgZnJjaGFpblMgKmNocDsKLSAgY2hhciAqcDsKLQotICBmb3IgKGNocCA9IGZyY2hhaW5fcm9vdDsgY2hwOyBjaHAgPSBjaHAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNocC0+ZnJjaF9zZWcpCi0JewotCWNhc2UgU0VHX0RBVEE6Ci0JICBwID0gIkRhdGEiOwotCSAgYnJlYWs7Ci0JY2FzZSBTRUdfVEVYVDoKLQkgIHAgPSAiVGV4dCI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcCA9ICI/Pz8iOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJpbnRmICgiXG5TRUdNRU5UICVzICVkXG4iLCBwLCBjaHAtPmZyY2hfc3Vic2VnKTsKLSAgICAgIGRtcF9mcmFnIChjaHAtPmZyY2hfcm9vdCwgIlx0Iik7Ci0gICAgfQotfQotCi1kbXBfZnJhZyAoZnAsIGluZGVudCkKLSAgICAgc3RydWN0IGZyYWcgKmZwOwotICAgICBjaGFyICppbmRlbnQ7Ci17Ci0gIGZvciAoOyBmcDsgZnAgPSBmcC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlc0ZSQUdNRU5UIEAgMHgleFxuIiwgaW5kZW50LCBmcCk7Ci0gICAgICBzd2l0Y2ggKGZwLT5mcl90eXBlKQotCXsKLQljYXNlIHJzX2FsaWduOgotCSAgcHJpbnRmICgiJXNyc19hbGlnbiglZClcbiIsIGluZGVudCwgZnAtPmZyX29mZnNldCk7Ci0JICBicmVhazsKLQljYXNlIHJzX2ZpbGw6Ci0JICBwcmludGYgKCIlc3JzX2ZpbGwoJWQpXG4iLCBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotCSAgcHJpbnRmICgiJXMiLCBpbmRlbnQpOwotCSAgdmFyX2NoYXJzIChmcCwgZnAtPmZyX3ZhciArIGZwLT5mcl9maXgpOwotCSAgcHJpbnRmICgiJXNcdCByZXBlYXRlZCAlZCB0aW1lcywiLAotCQkgIGluZGVudCwgZnAtPmZyX29mZnNldCk7Ci0JICBwcmludGYgKCIgZml4ZWQgbGVuZ3RoIGlmICMgY2hhcnMgPT0gMClcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19vcmc6Ci0JICBwcmludGYgKCIlc3JzX29yZyglZCtzeW0gQDB4JXgpXG4iLCBpbmRlbnQsCi0JCSAgZnAtPmZyX29mZnNldCwgZnAtPmZyX3N5bWJvbCk7Ci0JICBwcmludGYgKCIlc2ZpbGwgd2l0aCAiLCBpbmRlbnQpOwotCSAgdmFyX2NoYXJzIChmcCwgMSk7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgIHByaW50ZiAoIiVzbWFjaGluZV9kZXBcbiIsIGluZGVudCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcHJpbnRmICgiJXN1bmtub3duIHR5cGVcbiIsIGluZGVudCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmludGYgKCIlc2FkZHI9JWQoMHgleClcbiIsIGluZGVudCwgZnAtPmZyX2FkZHJlc3MsIGZwLT5mcl9hZGRyZXNzKTsKLSAgICAgIHByaW50ZiAoIiVzZnJfZml4PSVkXG4iLCBpbmRlbnQsIGZwLT5mcl9maXgpOwotICAgICAgcHJpbnRmICgiJXNmcl92YXI9JWRcbiIsIGluZGVudCwgZnAtPmZyX3Zhcik7Ci0gICAgICBwcmludGYgKCIlc2ZyX29mZnNldD0lZFxuIiwgaW5kZW50LCBmcC0+ZnJfb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoIiVzY2hhcnMgQCAweCV4XG4iLCBpbmRlbnQsIGZwLT5mcl9saXRlcmFsKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi12YXJfY2hhcnMgKGZwLCBuKQotICAgICBzdHJ1Y3QgZnJhZyAqZnA7Ci0gICAgIGludCBuOwotewotICB1bnNpZ25lZCBjaGFyICpwOwotCi0gIGZvciAocCA9ICh1bnNpZ25lZCBjaGFyICopIGZwLT5mcl9saXRlcmFsOyBuOyBuLS0sIHArKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlMDJ4ICIsICpwKTsKLSAgICB9Ci19Ci0KLS8qIGVuZCBvZiBkZWJ1Zy5jICovCmRpZmYgLS1naXQgYS9nYXMvZGVwLWluLnNlZCBiL2dhcy9kZXAtaW4uc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzcxZjBmLi4wMDAwMDAwCi0tLSBhL2dhcy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyEgLi4vY29uZmlnLmghIWcKLXMhIC4uLy4uL2JmZC9iZmQuaCEhZwotcyEgLi4vaXRibC1wYXJzZS5oISFnCi1zIUBJTkNESVJAISQoSU5DRElSKSFnCi1zIUBCRkRESVJAISQoQkZERElSKSFnCi1zIUBTUkNESVJAL2NvbmZpZyEkKHNyY2RpcikvY29uZmlnIWcKLXMhQFNSQ0RJUkAvLi4vb3Bjb2RlcyEkKHNyY2RpcikvLi4vb3Bjb2RlcyFnCi1zIUBTUkNESVJALyEhZwotcyEgY29uZmlnLmghIWcKLXMhIGFzLmghIWcKLXMhIGFzaW50bC5oISFnCi1zISB0YXJnLWVudi5oISFnCi1zISBvYmotZm9ybWF0LmghIWcKLXMhIHRhcmctY3B1LmghIWcKLXMhIGZsb251bS5oISFnCi1zISBleHByLmghIWcKLXMhIHdyaXRlLmghIWcKLXMhIGZyYWdzLmghIWcKLXMhIGhhc2guaCEhZwotcyEgcmVhZC5oISFnCi1zISBzeW1ib2xzLmghIWcKLXMhIHRjLmghIWcKLXMhIG9iai5oISFnCi1zISBsaXN0aW5nLmghIWcKLXMhIGJpZ251bS5oISFnCi1zISBiaXRfZml4LmghIWcKLXMhIGl0YmwtY3B1LmghIWcKLXMhIFwkKHNyY2RpcikvY29uZmlnL3RlLWdlbmVyaWMuaCEhZwotcyEgXCQoSU5DRElSKS9saWJpYmVydHkuaCEhZwotcyEgXCQoSU5DRElSKS9hbnNpZGVjbC5oISFnCi1zISBcJChJTkNESVIpL2ZvcGVuLXNhbWUuaCEhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi0vOiQvZAotCi1zL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAotICAvZwpkaWZmIC0tZ2l0IGEvZ2FzL2RlcGVuZC5jIGIvZ2FzL2RlcGVuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdjN2M4Li4wMDAwMDAwCi0tLSBhL2dhcy9kZXBlbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiBkZXBlbmQuYyAtIEhhbmRsZSBkZXBlbmRlbmN5IHRyYWNraW5nLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogVGhlIGZpbGUgdG8gd3JpdGUgdG8sIG9yIE5VTEwgaWYgbm8gZGVwZW5kZW5jaWVzIGJlaW5nIGtlcHQuICAqLwotc3RhdGljIGNoYXIgKmRlcF9maWxlID0gTlVMTDsKLQotc3RydWN0IGRlcGVuZGVuY3kKLXsKLSAgY2hhciAqZmlsZTsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKm5leHQ7Ci19OwotCi0vKiBBbGwgdGhlIGZpbGVzIHdlIGRlcGVuZCBvbi4gICovCi1zdGF0aWMgc3RydWN0IGRlcGVuZGVuY3kgKmRlcF9jaGFpbiA9IE5VTEw7Ci0KLS8qIEN1cnJlbnQgY29sdW1uIGluIG91dHB1dCBmaWxlLiAgKi8KLXN0YXRpYyBpbnQgY29sdW1uID0gMDsKLQotc3RhdGljIGludCBxdW90ZV9zdHJpbmdfZm9yX21ha2UgUEFSQU1TICgoRklMRSAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdyYXBfb3V0cHV0IFBBUkFNUyAoKEZJTEUgKiwgY2hhciAqLCBpbnQpKTsKLQotLyogTnVtYmVyIG9mIGNvbHVtbnMgYWxsb3dhYmxlLiAgKi8KLSNkZWZpbmUgTUFYX0NPTFVNTlMgNzIKLQotDAotCi0vKiBTdGFydCBzYXZpbmcgZGVwZW5kZW5jaWVzLCB0byBiZSB3cml0dGVuIHRvIEZJTEVOQU1FLiAgSWYgdGhpcyBpcwotICAgbmV2ZXIgY2FsbGVkLCB0aGVuIGRlcGVuZGVuY3kgdHJhY2tpbmcgaXMgc2ltcGx5IHNraXBwZWQuICAqLwotCi12b2lkCi1zdGFydF9kZXBlbmRlbmNpZXMgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgZGVwX2ZpbGUgPSBmaWxlbmFtZTsKLX0KLQotLyogTm90aWNlZCBhIG5ldyBmaWxlbmFtZSwgc28gdHJ5IHRvIHJlZ2lzdGVyIGl0LiAgKi8KLQotdm9pZAotcmVnaXN0ZXJfZGVwZW5kZW5jeSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgZGVwZW5kZW5jeSAqZGVwOwotCi0gIGlmIChkZXBfZmlsZSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKGRlcCA9IGRlcF9jaGFpbjsgZGVwICE9IE5VTEw7IGRlcCA9IGRlcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBzdHJjbXAgKGZpbGVuYW1lLCBkZXAtPmZpbGUpKQotCXJldHVybjsKLSAgICB9Ci0KLSAgZGVwID0gKHN0cnVjdCBkZXBlbmRlbmN5ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGRlcGVuZGVuY3kpKTsKLSAgZGVwLT5maWxlID0geHN0cmR1cCAoZmlsZW5hbWUpOwotICBkZXAtPm5leHQgPSBkZXBfY2hhaW47Ci0gIGRlcF9jaGFpbiA9IGRlcDsKLX0KLQotLyogUXVvdGUgYSBmaWxlIG5hbWUgdGhlIHdheSBgbWFrZScgd2FudHMgaXQsIGFuZCBwcmludCBpdCB0byBGSUxFLgotICAgSWYgRklMRSBpcyBOVUxMLCBkbyBubyBwcmludGluZywgYnV0IHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZQotICAgcXVvdGVkIHN0cmluZy4KLQotICAgVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gZ2NjIHdpdGggb25seSBtaW5vciBjaGFuZ2VzLiAgKi8KLQotc3RhdGljIGludAotcXVvdGVfc3RyaW5nX2Zvcl9tYWtlIChmaWxlLCBzcmMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGNoYXIgKnNyYzsKLXsKLSAgY2hhciAqcCA9IHNyYzsKLSAgaW50IGkgPSAwOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGNoYXIgYyA9ICpwKys7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ1wwJzoKLQljYXNlICcgJzoKLQljYXNlICdcdCc6Ci0JICB7Ci0JICAgIC8qIEdOVSBtYWtlIHVzZXMgYSB3ZWlyZCBxdW90aW5nIHNjaGVtZSBmb3Igd2hpdGUgc3BhY2UuCi0JICAgICAgIEEgc3BhY2Ugb3IgdGFiIHByZWNlZGVkIGJ5IDJOKzEgYmFja3NsYXNoZXMgcmVwcmVzZW50cwotCSAgICAgICBOIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IHNwYWNlOyBhIHNwYWNlIG9yIHRhYgotCSAgICAgICBwcmVjZWRlZCBieSAyTiBiYWNrc2xhc2hlcyByZXByZXNlbnRzIE4gYmFja3NsYXNoZXMgYXQKLQkgICAgICAgdGhlIGVuZCBvZiBhIGZpbGUgbmFtZTsgYW5kIGJhY2tzbGFzaGVzIGluIG90aGVyCi0JICAgICAgIGNvbnRleHRzIHNob3VsZCBub3QgYmUgZG91YmxlZC4gICovCi0JICAgIGNoYXIgKnE7Ci0JICAgIGZvciAocSA9IHAgLSAxOyBzcmMgPCBxICYmIHFbLTFdID09ICdcXCc7ICBxLS0pCi0JICAgICAgewotCQlpZiAoZmlsZSkKLQkJICBwdXRjICgnXFwnLCBmaWxlKTsKLQkJaSsrOwotCSAgICAgIH0KLQkgIH0KLQkgIGlmICghYykKLQkgICAgcmV0dXJuIGk7Ci0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoJ1xcJywgZmlsZSk7Ci0JICBpKys7Ci0JICBnb3RvIG9yZGluYXJ5X2NoYXI7Ci0JICAKLQljYXNlICckJzoKLQkgIGlmIChmaWxlKQotCSAgICBwdXRjIChjLCBmaWxlKTsKLQkgIGkrKzsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gIFRoaXMgY2FuIG1pc2hhbmRsZSB0aGluZ3MgbGlrZSAiJCgiIGJ1dAotCSAgICAgdGhlcmUncyBubyBlYXN5IGZpeC4gICovCi0JZGVmYXVsdDoKLQlvcmRpbmFyeV9jaGFyOgotCSAgLyogVGhpcyBjYW4gbWlzaGFuZGxlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyAiXDBcbiUqP1tcXH4iOwotCSAgICAgZXhhY3RseSB3aGljaCBjaGFycyBhcmUgbWlzaGFuZGxlZCBkZXBlbmRzIG9uIHRoZSBgbWFrZScgdmVyc2lvbi4KLQkgICAgIFdlIGtub3cgb2Ygbm8gcG9ydGFibGUgc29sdXRpb24gZm9yIHRoaXM7Ci0JICAgICBldmVuIEdOVSBtYWtlIDMuNzYuMSBkb2Vzbid0IHNvbHZlIHRoZSBwcm9ibGVtIGVudGlyZWx5LgotCSAgICAgKEFsc28sICdcMCcgaXMgbWlzaGFuZGxlZCBkdWUgdG8gb3VyIGNhbGxpbmcgY29udmVudGlvbnMuKSAgKi8KLQkgIGlmIChmaWxlKQotCSAgICBwdXRjIChjLCBmaWxlKTsKLQkgIGkrKzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIEFwcGVuZCBzb21lIG91dHB1dCB0byB0aGUgZmlsZSwga2VlcGluZyB0cmFjayBvZiBjb2x1bW5zIGFuZCBkb2luZwotICAgd3JhcHBpbmcgYXMgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLXdyYXBfb3V0cHV0IChmLCBzdHJpbmcsIHNwYWNlcikKLSAgICAgRklMRSAqZjsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgc3BhY2VyOwotewotICBpbnQgbGVuID0gcXVvdGVfc3RyaW5nX2Zvcl9tYWtlIChOVUxMLCBzdHJpbmcpOwotCi0gIGlmIChsZW4gPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGNvbHVtbiAmJiBNQVhfQ09MVU1OUyAtIDEgLypzcGFjZXIqLyAtIDIgLypgIFwnKi8gPCBjb2x1bW4gKyBsZW4pCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIiBcXFxuICIpOwotICAgICAgY29sdW1uID0gMDsKLSAgICAgIGlmIChzcGFjZXIgPT0gJyAnKQotCXNwYWNlciA9ICdcMCc7Ci0gICAgfQotCi0gIGlmIChzcGFjZXIgPT0gJyAnKQotICAgIHsKLSAgICAgIHB1dGMgKHNwYWNlciwgZik7Ci0gICAgICArK2NvbHVtbjsKLSAgICB9Ci0KLSAgcXVvdGVfc3RyaW5nX2Zvcl9tYWtlIChmLCBzdHJpbmcpOwotICBjb2x1bW4gKz0gbGVuOwotCi0gIGlmIChzcGFjZXIgPT0gJzonKQotICAgIHsKLSAgICAgIHB1dGMgKHNwYWNlciwgZik7Ci0gICAgICArK2NvbHVtbjsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGRlcGVuZGVuY3kgZmlsZS4gICovCi0KLXZvaWQKLXByaW50X2RlcGVuZGVuY2llcyAoKQotewotICBGSUxFICpmOwotICBzdHJ1Y3QgZGVwZW5kZW5jeSAqZGVwOwotCi0gIGlmIChkZXBfZmlsZSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmID0gZm9wZW4gKGRlcF9maWxlLCAidyIpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkNhbid0IG9wZW4gYCVzJyBmb3Igd3JpdGluZyIpLCBkZXBfZmlsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvbHVtbiA9IDA7Ci0gIHdyYXBfb3V0cHV0IChmLCBvdXRfZmlsZV9uYW1lLCAnOicpOwotICBmb3IgKGRlcCA9IGRlcF9jaGFpbjsgZGVwICE9IE5VTEw7IGRlcCA9IGRlcC0+bmV4dCkKLSAgICB3cmFwX291dHB1dCAoZiwgZGVwLT5maWxlLCAnICcpOwotCi0gIHB1dGMgKCdcbicsIGYpOwotCi0gIGlmIChmY2xvc2UgKGYpKQotICAgIGFzX3dhcm4gKF8oIkNhbid0IGNsb3NlIGAlcyciKSwgZGVwX2ZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9NYWtlZmlsZS5hbSBiL2dhcy9kb2MvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjVhNGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi0jIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHlvdSB3YW50OyAiYWxsIiBpbmNsdWRlcyBldmVyeXRoaW5nCi1DT05GSUc9YWxsCi0KLW1hbl9NQU5TID0gYXMuMQotCi1pbmZvX1RFWElORk9TID0gYXMudGV4aW5mbyBnYXNwLnRleGkKLQotYXNjb25maWcudGV4aTogJChDT05GSUcpLnRleGkKLQlybSAtZiBhc2NvbmZpZy50ZXhpCi0JbG4gLXMgJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgbG4gJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aQotCi1DUFVfRE9DUyA9IFwKLQljLWEyOWsudGV4aSBcCi0JYy1hcm0udGV4aSBcCi0JYy1kMTB2LnRleGkgXAotCWMtaDgzMDAudGV4aSBcCi0JYy1oODUwMC50ZXhpIFwKLQljLWhwcGEudGV4aSBcCi0JYy1pMzg2LnRleGkgXAotCWMtaTk2MC50ZXhpIFwKLQljLW02OGsudGV4aSBcCi0JYy1taXBzLnRleGkgXAotCWMtbnMzMmsudGV4aSBcCi0JYy1zaC50ZXhpIFwKLQljLXNwYXJjLnRleGkgXAotCWMtdmF4LnRleGkgXAotCWMtdjg1MC50ZXhpIFwKLQljLXo4ay50ZXhpCi0KLWdhc3Zlci50ZXhpOiBNYWtlZmlsZQotCXJtIC1mICRACi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gJEAKLQotYXMuaW5mbzogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotYXMuZHZpOiAkKHNyY2RpcikvYXMudGV4aW5mbyBhc2NvbmZpZy50ZXhpIGdhc3Zlci50ZXhpICQoQ1BVX0RPQ1MpCi0KLSMgVGhpcyBvbmUgaXNuJ3QgcmVhZHkgZm9yIHByaW1lIHRpbWUgeWV0LiAgTm90IGV2ZW4gYSBsaXR0bGUgYml0LgotCi1ub2luc3RfVEVYSU5GT1MgPSBpbnRlcm5hbHMudGV4aQotCi1ESVNUQ0xFQU5GSUxFUyA9IGFzY29uZmlnLnRleGkKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBnYXN2ZXIudGV4aQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9NYWtlZmlsZS5pbiBiL2dhcy9kb2MvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMzk5ZjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4uCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQUxMX09CSl9ERVBTID0gQEFMTF9PQkpfREVQU0AKLUFTID0gQEFTQAotQkZETElCID0gQEJGRExJQkAKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxFWCA9IEBMRVhACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotT1BDT0RFU19MSUIgPSBAT1BDT0RFU19MSUJACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRSA9IEBVU0VfU1lNQk9MX1VOREVSU0NPUkVACi1WRVJTSU9OID0gQFZFUlNJT05ACi1ZQUNDID0gQFlBQ0NACi1hdG9mID0gQGF0b2ZACi1jZ2VuX2NwdV9wcmVmaXggPSBAY2dlbl9jcHVfcHJlZml4QAotZXh0cmFfb2JqZWN0cyA9IEBleHRyYV9vYmplY3RzQAotaW5zdGFsbF90b29sZGlyID0gQGluc3RhbGxfdG9vbGRpckAKLWwgPSBAbEAKLW9ial9mb3JtYXQgPSBAb2JqX2Zvcm1hdEAKLXRhcmdldF9jcHVfdHlwZSA9IEB0YXJnZXRfY3B1X3R5cGVACi10ZV9maWxlID0gQHRlX2ZpbGVACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZwotQ09ORklHID0gYWxsCi0KLW1hbl9NQU5TID0gYXMuMQotCi1pbmZvX1RFWElORk9TID0gYXMudGV4aW5mbyBnYXNwLnRleGkKLQotQ1BVX0RPQ1MgPSBcCi0JYy1hMjlrLnRleGkgXAotCWMtYXJtLnRleGkgXAotCWMtZDEwdi50ZXhpIFwKLQljLWg4MzAwLnRleGkgXAotCWMtaDg1MDAudGV4aSBcCi0JYy1ocHBhLnRleGkgXAotCWMtaTM4Ni50ZXhpIFwKLQljLWk5NjAudGV4aSBcCi0JYy1tNjhrLnRleGkgXAotCWMtbWlwcy50ZXhpIFwKLQljLW5zMzJrLnRleGkgXAotCWMtc2gudGV4aSBcCi0JYy1zcGFyYy50ZXhpIFwKLQljLXZheC50ZXhpIFwKLQljLXY4NTAudGV4aSBcCi0JYy16OGsudGV4aQotCi0KLSMgVGhpcyBvbmUgaXNuJ3QgcmVhZHkgZm9yIHByaW1lIHRpbWUgeWV0LiAgTm90IGV2ZW4gYSBsaXR0bGUgYml0LgotCi1ub2luc3RfVEVYSU5GT1MgPSBpbnRlcm5hbHMudGV4aQotCi1ESVNUQ0xFQU5GSUxFUyA9IGFzY29uZmlnLnRleGkKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBnYXN2ZXIudGV4aQotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IC4uL2NvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLVRFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4Ci1JTkZPX0RFUFMgPSBhcy5pbmZvIGdhc3AuaW5mbwotRFZJUyA9IGFzLmR2aSBnYXNwLmR2aQotVEVYSU5GT1MgPSBhcy50ZXhpbmZvIGdhc3AudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotRElTVF9DT01NT04gPSAgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmR2aSAuaW5mbyAucHMgLnRleGkgLnRleGluZm8gLnR4aQotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBkb2MvTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLQotYXMuaW5mbzogYXMudGV4aW5mbwotYXMuZHZpOiBhcy50ZXhpbmZvCi0KLQotZ2FzcC5pbmZvOiBnYXNwLnRleGkKLWdhc3AuZHZpOiBnYXNwLnRleGkKLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgYXMuYXV4IGFzLmNwIGFzLmNwcyBhcy5kdmkgYXMuZm4gYXMuZm5zIGFzLmt5IGFzLmt5cyBhcy5wcyBcCi0JICBhcy5sb2cgYXMucGcgYXMudG9jIGFzLnRwIGFzLnRwcyBhcy52ciBhcy52cnMgYXMub3AgYXMudHIgXAotCSAgYXMuY3YgYXMuY24gZ2FzcC5hdXggZ2FzcC5jcCBnYXNwLmNwcyBnYXNwLmR2aSBnYXNwLmZuIFwKLQkgIGdhc3AuZm5zIGdhc3Aua3kgZ2FzcC5reXMgZ2FzcC5wcyBnYXNwLmxvZyBnYXNwLnBnIGdhc3AudG9jIFwKLQkgIGdhc3AudHAgZ2FzcC50cHMgZ2FzcC52ciBnYXNwLnZycyBnYXNwLm9wIGdhc3AudHIgZ2FzcC5jdiBcCi0JICBnYXNwLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotCi1pbnN0YWxsLW1hbjE6Ci0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChtYW4xZGlyKQotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCi0JICBlbHNlIGZpbGU9JCRpOyBmaTsgXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tYW4xOgotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotaW5zdGFsbC1tYW46ICQoTUFOUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLW1hbjEKLXVuaW5zdGFsbC1tYW46Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtbWFuMQotdGFnczogVEFHUwotVEFHUzoKLQotCi1kaXN0ZGlyID0gJCh0b3BfYnVpbGRkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLQotc3ViZGlyID0gZG9jCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tYW0KLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktYW0KLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLWFtCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi1pbnN0YWxsLWV4ZWMtYW06Ci1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1hbQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotYWxsLWFtOiBNYWtlZmlsZSAkKE1BTlMpCi1hbGwtcmVkaXJlY3Q6IGFsbC1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1jbGVhbi1hbTogIGNsZWFuLWFtaW5mbyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1hbQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0KLS5QSE9OWTogaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIG1vc3RseWNsZWFuLWFtaW5mbyBcCi1kaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgXAotdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gdW5pbnN0YWxsLW1hbiB0YWdzIGRpc3RkaXIgaW5mby1hbSBpbmZvIFwKLWR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBpbnN0YWxsLWluZm8tYW0gXAotaW5zdGFsbC1pbmZvIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBcCi1pbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBhbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBcCi1pbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgXAotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIG1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotYXNjb25maWcudGV4aTogJChDT05GSUcpLnRleGkKLQlybSAtZiBhc2NvbmZpZy50ZXhpCi0JbG4gLXMgJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgbG4gJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aQotCi1nYXN2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWFzLmluZm86ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLWFzLmR2aTogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9nYXMvZG9jL2FsbC50ZXhpIGIvZ2FzL2RvYy9hbGwudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5MGM1Yi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FsbC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEdBUyBtYW51YWwKLQotQGMgQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYWxsLWluY2x1c2l2ZSB2ZXJzaW9uIG9mIG1hbnVhbAotCi1AYyBzd2l0Y2hlczotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBjIFByb3BlcnRpZXMgb2YgdGhlIG1hbnVhbAotQGMgPT09PT09PT09PT09PT09PT09PT09PT09Ci1AYyBEaXNjdXNzIGFsbCBhcmNoaXRlY3R1cmVzPwotQHNldCBBTEwtQVJDSAotQGMgQSBnZW5lcmljIGZvcm0gb2YgbWFudWFsIChub3QgdGFpbG9yZWQgdG8gc3BlY2lmaWMgdGFyZ2V0KT8KLUBzZXQgR0VORVJJQwotQGMgSW5jbHVkZSB0ZXh0IG9uIGFzc2VtYmxlciBpbnRlcm5hbHM/Ci1AY2xlYXIgSU5URVJOQUxTCi1AYyBNYW55IG9iamVjdCBmb3JtYXRzIHN1cHBvcnRlZCBpbiB0aGlzIGNvbmZpZz8KLUBzZXQgTVVMVEktT0JKCi0KLUBjIE9iamVjdCBmb3JtYXRzIG9mIGludGVyZXN0Ci1AYyA9PT09PT09PT09PT09PT09PT09PT09PT09PQotQHNldCBBT1VUCi1Ac2V0IEJPVVQKLUBzZXQgQ09GRgotQHNldCBFTEYKLUBzZXQgU09NCi0KLUBjIENQVXMgb2YgaW50ZXJlc3QKLUBjID09PT09PT09PT09PT09PT0KLUBzZXQgQTI5SwotQHNldCBBUkMKLUBzZXQgQVJNCi1Ac2V0IEQxMFYKLUBzZXQgRDMwVgotQHNldCBIOC8zMDAKLUBzZXQgSDgvNTAwCi1Ac2V0IFNICi1Ac2V0IEk4MDM4NgotQHNldCBJOTYwCi1Ac2V0IE1DT1JFCi1Ac2V0IE1JUFMKLUBzZXQgTTMyUgotQHNldCBNNjgwWDAKLUBzZXQgWjgwMDAKLUBzZXQgU1BBUkMKLUBzZXQgVkFYCi1Ac2V0IFZYV09SS1MKLUBzZXQgSFBQQQotQHNldCBWODUwCi0KLUBjIERvZXMgdGhpcyB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgdXNlIHRoZSBkaWZmZXJlbmNlLXRhYmxlIGtsdWdlPwotQHNldCBESUZGLVRCTC1LTFVHRQotCi1AYyBEbyBhbGwgbWFjaGluZXMgZGVzY3JpYmVkIHVzZSBJRUVFIGZsb2F0aW5nIHBvaW50PwotQGNsZWFyIElFRUVGTE9BVAotCi1AYyBJcyBhIHdvcmQgMzIgYml0cywgb3IgMTY/Ci1AY2xlYXIgVzMyCi1Ac2V0IFcxNgotCi1AYyBEbyBzeW1ib2xzIGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcnMgdGhhbiB1c3VhbD8KLUBjbGVhciBTUEVDSUFMLVNZTVMKLQotQGMgc3RyaW5nczotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBjIE5hbWUgb2YgdGhlIGFzc2VtYmxlcjoKLUBzZXQgQVMgYXMKLUBjIE5hbWUgb2YgQyBjb21waWxlcjoKLUBzZXQgR0NDIGdjYwotQGMgTmFtZSBvZiBsaW5rZXI6Ci1Ac2V0IExEIGxkCi1AYyBUZXh0IGZvciB0YXJnZXQgbWFjaGluZSAoYmVzdCBub3QgdXNlZCBpbiBnZW5lcmljIGNhc2U7IGJ1dCBqdXN0IGluIGNhc2UuLi4pCi1Ac2V0IFRBUkdFVCBtYWNoaW5lIHNwZWNpZmljCi1AYyBOYW1lIG9mIG9iamVjdCBmb3JtYXQgTk9UIFNFVCBpbiBnZW5lcmljIHZlcnNpb24KLUBjbGVhciBPQkotTkFNRQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9hcy4xIGIvZ2FzL2RvYy9hcy4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYyODg2Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYXMuMQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggYXMgMSAiMjkgTWFyY2ggMTk5NiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotCi0uU0ggTkFNRQotR05VIGFzIFwtIHRoZSBwb3J0YWJsZSBHTlUgYXNzZW1ibGVyLgotCi0uU0ggU1lOT1BTSVMKLS5uYQotLkIgYXMKLS5SQiAiW1x8IiBcLWEgIltcfCIgZGhsbnMgIlx8XSIgXGMKLVwmXFtcfFw9XGMKLS5JIGZpbGVcYwotXCZcfF1cfF0KLS5SQiAiW1x8IiBcLUQgIlx8XSIKLS5SQiAiW1x8IiBcLVwtZGVmc3ltXCBTWU09VkFMICJcfF0iCi0uUkIgIltcfCIgXC1mICJcfF0iCi0uUkIgIltcfCIgXC1cLWdzdGFicyAiXHxdIgotLlJCICJbXHwiIFwtSQotLkkgcGF0aFxjCi1cJlx8XQotLlJCICJbXHwiIFwtSyAiXHxdIgotLlJCICJbXHwiIFwtTCAiXHxdIgotLlJCICJbXHwiIFwtTVwgfFwgXC1cLW1yaSAiXHxdIgotLlJCICJbXHwiIFwtbyAKLS5JIG9iamZpbGVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtdHJhZGl0aW9uYWxcLWZvcm1hdCAiXHxdIgotLlJCICJbXHwiIFwtdiAiXHxdIgotLlJCICJbXHwiIFwtdyAiXHxdIgotLlJCICJbXHwiIFwtXF5cLSAiXCB8XCAiIFxjCi0uSSBmaWxlc1xjCi1cJlx8Llx8Llx8Llx8XQotCi0uSSBpOTYwLW9ubHkgb3B0aW9uczoKLS5icgotLlJCICJbXHwiIFwtQUNBICJcfHxcfCIgXC1BQ0FfQSAiXHx8XHwiIFwtQUNCXGMKLS5SQiAiXHx8XHwiIFwtQUNDICJcfHxcfCIgXC1BS0EgIlx8fFx8IiBcLUFLQlxjCi0uUkIgIlx8fFx8IiBcLUFLQyAiXHx8XHwiIFwtQU1DICJcfF0iCi0uUkIgIltcfCIgXC1iICJcfF0iCi0uUkIgIltcfCIgXC1uby1yZWxheCAiXHxdIgotCi0uSSBtNjgweDAtb25seSBvcHRpb25zOgotLmJyCi0uUkIgIltcfCIgXC1sICJcfF0iCi0uUkIgIltcfCIgXC1tYzY4MDAwICJcfHxcfCIgXC1tYzY4MDEwICJcfHxcfCIgXC1tYzY4MDIwICJcfF0iCi0uYWQgYgotCi0uU0ggREVTQ1JJUFRJT04KLUdOVSBcYwotLkIgYXNcYwotXCYgaXMgcmVhbGx5IGEgZmFtaWx5IG9mIGFzc2VtYmxlcnMuICAKLUlmIHlvdSB1c2UgKG9yIGhhdmUgdXNlZCkgdGhlIEdOVSBhc3NlbWJsZXIgb24gb25lIGFyY2hpdGVjdHVyZSwgeW91Ci1zaG91bGQgZmluZCBhIGZhaXJseSBzaW1pbGFyIGVudmlyb25tZW50IHdoZW4geW91IHVzZSBpdCBvbiBhbm90aGVyCi1hcmNoaXRlY3R1cmUuICBFYWNoIHZlcnNpb24gaGFzIG11Y2ggaW4gY29tbW9uIHdpdGggdGhlIG90aGVycywKLWluY2x1ZGluZyBvYmplY3QgZmlsZSBmb3JtYXRzLCBtb3N0IGFzc2VtYmxlciBkaXJlY3RpdmVzIChvZnRlbiBjYWxsZWQKLVxjCi0uSSBwc2V1ZG8tb3BzKVxjCi1cJiBhbmQgYXNzZW1ibGVyIHN5bnRheC4gIAotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wcyB1c2VkIGJ5IEdOVSBcYwotLkIgYXNcYwotXCYsIHNlZSBgXHxcYwotLkIgYXNcYwotXHwnIGVudHJ5IGluIFxjCi0uQiBpbmZvIFxjCi0ob3IgdGhlIG1hbnVhbCBcYwotLkkKLS5JCi1Vc2luZyBhczogVGhlIEdOVSBBc3NlbWJsZXJcYwotXCYpLgotCi1cYwotLkIgYXNcYwotXCYgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YgdGhlIEdOVSBDCi1jb21waWxlciBcYwotLkIgZ2NjXGMKLVwmIGZvciB1c2UgYnkgdGhlIGxpbmtlciBcYwotLkIgbGRcYwotXCYuICBOZXZlcnRoZWxlc3MsCi13ZSd2ZSB0cmllZCB0byBtYWtlIFxjCi0uQiBhc1xjCi1cJiBhc3NlbWJsZSBjb3JyZWN0bHkgZXZlcnl0aGluZyB0aGF0IHRoZSBuYXRpdmUKLWFzc2VtYmxlciB3b3VsZC4KLVRoaXMgZG9lc24ndCBtZWFuIFxjCi0uQiBhc1xjCi1cJiBhbHdheXMgdXNlcyB0aGUgc2FtZSBzeW50YXggYXMgYW5vdGhlcgotYXNzZW1ibGVyIGZvciB0aGUgc2FtZSBhcmNoaXRlY3R1cmU7IGZvciBleGFtcGxlLCB3ZSBrbm93IG9mIHNldmVyYWwKLWluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiA2ODB4MCBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXguCi0KLUVhY2ggdGltZSB5b3UgcnVuIFxjCi0uQiBhc1xjCi1cJiBpdCBhc3NlbWJsZXMgZXhhY3RseSBvbmUgc291cmNlCi1wcm9ncmFtLiAgVGhlIHNvdXJjZSBwcm9ncmFtIGlzIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUgZmlsZXMuCi0oVGhlIHN0YW5kYXJkIGlucHV0IGlzIGFsc28gYSBmaWxlLikKLQotSWYgXGMKLS5CIGFzXGMKLVwmIGlzIGdpdmVuIG5vIGZpbGUgbmFtZXMgaXQgYXR0ZW1wdHMgdG8gcmVhZCBvbmUgaW5wdXQgZmlsZQotZnJvbSB0aGUgXGMKLS5CIGFzXGMKLVwmIHN0YW5kYXJkIGlucHV0LCB3aGljaCBpcyBub3JtYWxseSB5b3VyIHRlcm1pbmFsLiAgWW91Ci1tYXkgaGF2ZSB0byB0eXBlIFxjCi0uQiBjdGwtRFxjCi1cJiB0byB0ZWxsIFxjCi0uQiBhc1xjCi1cJiB0aGVyZSBpcyBubyBtb3JlIHByb2dyYW0KLXRvIGFzc2VtYmxlLiAgVXNlIGBcfFxjCi0uQiBcLVxeXC1cYwotXHwnIGlmIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgbmFtZSB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotaW4geW91ciBjb21tYW5kIGxpbmUuCi0KLS5CIGFzXGMKLVwmIG1heSB3cml0ZSB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkIGVycm9yCi1maWxlICh1c3VhbGx5IHlvdXIgdGVybWluYWwpLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aGVuIFxjCi0uQiBhc1xjCi1cJiBpcwotcnVuIGF1dG9tYXRpY2FsbHkgYnkgYSBjb21waWxlci4gIFdhcm5pbmdzIHJlcG9ydCBhbiBhc3N1bXB0aW9uIG1hZGUgc28KLXRoYXQgXGMKLS5CIGFzXGMKLVwmIGNvdWxkIGtlZXAgYXNzZW1ibGluZyBhIGZsYXdlZCBwcm9ncmFtOyBlcnJvcnMgcmVwb3J0IGEKLWdyYXZlIHByb2JsZW0gdGhhdCBzdG9wcyB0aGUgYXNzZW1ibHkuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CUiBcLWEKLVR1cm4gb24gYXNzZW1ibHkgbGlzdGluZ3MuICBUaGVyZSBhcmUgdmFyaW91cyBzdWJvcHRpb25zLgotLkIgZAotb21pdHMgZGVidWdnaW5nIGRpcmVjdGl2ZXMuCi0uQiBoCi1pbmNsdWRlcyB0aGUgaGlnaCBsZXZlbCBzb3VyY2UgY29kZTsgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUKLXNvdXJjZSBmaWxlIGNhbiBiZSBmb3VuZCwgYW5kIHRoZSBjb2RlIHdhcyBjb21waWxlZCB3aXRoCi0uQiBcLWcuCi0uQiBsCi1pbmNsdWRlcyBhbiBhc3NlbWJseSBsaXN0aW5nLgotLkIgbgotb21pdHMgZm9ybXMgcHJvY2Vzc2luZy4KLS5CIHMKLWluY2x1ZGVzIGEgc3ltYm9sIGxpc3RpbmcuCi0uQiA9Ci0uSSBmaWxlCi1zZXRzIHRoZSBsaXN0aW5nIGZpbGUgbmFtZTsgdGhpcyBtdXN0IGJlIHRoZSBsYXN0IHN1Ym9wdGlvbi4KLVRoZSBkZWZhdWx0IHN1Ym9wdGlvbnMgYXJlCi0uQiBobHMuCi0uVFAKLS5CIFwtRAotVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgb25seSBmb3Igc2NyaXB0IGNvbXBhdGliaWxpdHkgd2l0aCBjYWxscyB0bwotb3RoZXIgYXNzZW1ibGVyczsgaXQgaGFzIG5vIGVmZmVjdCBvbiBcYwotLkIgYXNcYwotXCYuCi0uVFAKLS5CIFwtXC1kZWZzeW0gU1lNPVZBTFVFCi1EZWZpbmUgdGhlIHN5bWJvbCBTWU0gdG8gYmUgVkFMVUUgYmVmb3JlIGFzc2VtYmxpbmcgdGhlIGlucHV0IGZpbGUuCi1WQUxVRSBtdXN0IGJlIGFuIGludGVnZXIgY29uc3RhbnQuICBBcyBpbiBDLCBhIGxlYWRpbmcgMHggaW5kaWNhdGVzIGEKLWhleGFkZWNpbWFsIHZhbHVlLCBhbmQgYSBsZWFkaW5nIDAgaW5kaWNhdGVzIGFuIG9jdGFsIHZhbHVlLgotLlRQCi0uQiBcLWYKLWBgZmFzdCcnLS1za2lwIHByZXByb2Nlc3NpbmcgKGFzc3VtZSBzb3VyY2UgaXMgY29tcGlsZXIgb3V0cHV0KS4KLS5UUAotLkJJICJcLUlcICIgcGF0aAotQWRkIAotLkkgcGF0aAotdG8gdGhlIHNlYXJjaCBsaXN0IGZvciAKLS5CIC5pbmNsdWRlCi1kaXJlY3RpdmVzLgotLlRQCi0uQiBcLVwtZ3N0YWJzCi1HZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggYXNzZW1ibGVyIGxpbmUuICBUaGlzCi1tYXkgaGVscCBkZWJ1Z2dpbmcgYXNzZW1ibGVyIGNvZGUsIGlmIHRoZSBkZWJ1Z2dlciBjYW4gaGFuZGxlIGl0LgotLlRQCi0uQiBcLUsKLUlzc3VlIHdhcm5pbmdzIHdoZW4gZGlmZmVyZW5jZSB0YWJsZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgotLlRQCi0uQiBcLUwKLUtlZXAgKGluIHN5bWJvbCB0YWJsZSkgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgd2l0aCBgXHxcYwotLkIgTFxjCi1cfCcKLS5UUAotLkIgXC1NLCBcLVwtbXJpCi1Bc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotLlRQCi0uQkkgIlwtb1wgIiBvYmpmaWxlCi1OYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgZnJvbSBcYwotLkIgYXMKLS5UUAotLkIgXC1SCi1Gb2xkIGRhdGEgc2VjdGlvbiBpbnRvIHRleHQgc2VjdGlvbgotLlRQCi0uQiBcLVwtdHJhZGl0aW9uYWxcLWZvcm1hdAotVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBhc3NlbWJsZXIsIHdoZW4gcG9zc2libGUuCi0uVFAKLS5CIFwtdgotQW5ub3VuY2UgXGMKLS5CIGFzXGMKLVwmIHZlcnNpb24KLS5UUAotLkIgXC1XCi1TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzCi0uVFAKLS5JUiAiXC1cXlwtIiAiXCB8XCAiICJmaWxlc1x8Llx8Llx8LiIKLVNvdXJjZSBmaWxlcyB0byBhc3NlbWJsZSwgb3Igc3RhbmRhcmQgaW5wdXQgKFxjCi0uQlIgIlwtXF5cLSIgIikiCi0uVFAKLS5CSSBcLUEgdmFyCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLVNwZWNpZnkgd2hpY2ggdmFyaWFudCBvZiB0aGUgOTYwIGFyY2hpdGVjdHVyZSBpcyB0aGUgdGFyZ2V0LgotLlRQCi0uQiBcLWIKLS5JCi0oV2hlbiBjb25maWd1cmVkIGZvciBJbnRlbCA5NjAuKQotQWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuLgotLlRQCi0uQiBcLW5vLXJlbGF4Ci0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLURvIG5vdCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHM7Ci1lcnJvciBpZiBuZWNlc3NhcnkuCi0uVFAKLS5CIFwtbAotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIE1vdG9yb2xhIDY4MDAwKS4gIAotLmJyCi1TaG9ydGVuIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkIHN5bWJvbHMsIHRvIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvLgotLlRQCi0uQlIgIlwtbWM2ODAwMCIgIlx8fFx8IiAiXC1tYzY4MDEwIiAiXHx8XHwiICJcLW1jNjgwMjAiCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgTW90b3JvbGEgNjgwMDApLiAgCi0uYnIKLVNwZWNpZnkgd2hhdCBwcm9jZXNzb3IgaW4gdGhlIDY4MDAwIGZhbWlseSBpcyB0aGUgdGFyZ2V0IChkZWZhdWx0IDY4MDIwKQotCi0uUFAKLU9wdGlvbnMgbWF5IGJlIGluIGFueSBvcmRlciwgYW5kIG1heSBiZQotYmVmb3JlLCBhZnRlciwgb3IgYmV0d2VlbiBmaWxlIG5hbWVzLiAgVGhlIG9yZGVyIG9mIGZpbGUgbmFtZXMgaXMKLXNpZ25pZmljYW50LgotCi1gXHxcYwotLkIgXC1cXlwtXGMKLVx8JyAodHdvIGh5cGhlbnMpIGJ5IGl0c2VsZiBuYW1lcyB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotZXhwbGljaXRseSwgYXMgb25lIG9mIHRoZSBmaWxlcyBmb3IgXGMKLS5CIGFzXGMKLVwmIHRvIGFzc2VtYmxlLgotCi1FeGNlcHQgZm9yIGBcfFxjCi0uQiBcLVxeXC1cYwotXHwnIGFueSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdGhhdCBiZWdpbnMgd2l0aCBhCi1oeXBoZW4gKGBcfFxjCi0uQiBcLVxjCi1cfCcpIGlzIGFuIG9wdGlvbi4gIEVhY2ggb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCi1cYwotLkIgYXNcYwotXCYuICBObyBvcHRpb24gY2hhbmdlcyB0aGUgd2F5IGFub3RoZXIgb3B0aW9uIHdvcmtzLiAgQW4KLW9wdGlvbiBpcyBhIGBcfFxjCi0uQiBcLVxjCi1cfCcgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbGV0dGVyczsgdGhlIGNhc2Ugb2YKLXRoZSBsZXR0ZXIgaXMgaW1wb3J0YW50LiAgIEFsbCBvcHRpb25zIGFyZSBvcHRpb25hbC4KLQotVGhlIGBcfFxjCi0uQiBcLW9cYwotXHwnIG9wdGlvbiBleHBlY3RzIGV4YWN0bHkgb25lIGZpbGUgbmFtZSB0byBmb2xsb3cuICBUaGUgZmlsZQotbmFtZSBtYXkgZWl0aGVyIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgb3B0aW9uJ3MgbGV0dGVyIChjb21wYXRpYmxlCi13aXRoIG9sZGVyIGFzc2VtYmxlcnMpIG9yIGl0IG1heSBiZSB0aGUgbmV4dCBjb21tYW5kIGFyZ3VtZW50IChHTlUKLXN0YW5kYXJkKS4gIAotCi1UaGVzZSB0d28gY29tbWFuZCBsaW5lcyBhcmUgZXF1aXZhbGVudDoKLS5icgotLkIKLWFzXCBcIFwtb1wgXCBteVwtb2JqZWN0XC1maWxlLm9cIFwgbXVtYmxlLnMKLS5icgotLkIKLWFzXCBcIFwtb215XC1vYmplY3RcLWZpbGUub1wgXCBtdW1ibGUucwotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGFzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1Vc2luZyBhczogVGhlIEdOVSBBc3NlbWJsZXJcYwotXCY7Ci0uQlIgZ2NjICIoIiAxICIpLCIKLS5CUiBsZCAiKCIgMSAiKS4iCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYXMudGV4aW5mbyBiL2dhcy9kb2MvYXMudGV4aW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlMzYyYS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FzLnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1MzIyICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvIEBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLVRleGluZm8tKi0KLUBjICBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLUBjICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFVQREFURSEhICBPbiBmdXR1cmUgdXBkYXRlcy0tCi1AYyAgICgxKSAgIGNoZWNrIGZvciBuZXcgbWFjaGluZS1kZXAgY21kbGluZSBvcHRpb25zIGluCi1AYyAgICAgICAgIG1kX3BhcnNlX29wdGlvbiBkZWZpbml0aW9ucyBpbiBjb25maWcvdGMtKi5jCi1AYyAgICgyKSAgIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXJlY3RpdmVzLCBleGFtaW5lIG1kX3BzZXVkb19vcAotQGMgICAgICAgICBpbiBjb25maWcvdGMtKi5jCi1AYyAgICgzKSAgIGZvciBvYmplY3QtZm9ybWF0IHNwZWNpZmljIGRpcmVjdGl2ZXMsIGV4YW1pbmUgb2JqX3BzZXVkb19vcAotQGMgICAgICAgICBpbiBjb25maWcvb2JqLSouYyAgICAgICAKLUBjICAgKDQpICAgcG9ydGFibGUgZGlyZWN0aXZlcyBpbiBwb3RhYmxlW10gaW4gcmVhZC5jCi1AYyAlKipzdGFydCBvZiBoZWFkZXIKLUBzZXRmaWxlbmFtZSBhcy5pbmZvCi1AYyAtLS1jb25maWctLS0KLUBjIGRlZmF1bHRzLCBjb25maWcgZmlsZSBtYXkgb3ZlcnJpZGU6Ci1Ac2V0IGhhdmUtc3RhYnMKLUBjIC0tLQotQGluY2x1ZGUgYXNjb25maWcudGV4aQotQGluY2x1ZGUgZ2FzdmVyLnRleGkKLUBjIC0tLQotQGMgY29tbW9uIE9SIGNvbWJpbmF0aW9ucyBvZiBjb25kaXRpb25zCi1AaWZzZXQgQU9VVAotQHNldCBhb3V0LWJvdXQKLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0vVGh1bWIKLUBzZXQgQVJNCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQk9VVAotQHNldCBhb3V0LWJvdXQKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC8zMDAKLUBzZXQgSDgKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLUBzZXQgSDgKLUBlbmQgaWZzZXQKLUBpZnNldCBTSAotQHNldCBIOAotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUBzZXQgYWJub3JtYWwtc2VwYXJhdG9yCi1AZW5kIGlmc2V0Ci1AYyAtLS0tLS0tLS0tLS0KLUBpZnNldCBHRU5FUklDCi1Ac2V0dGl0bGUgVXNpbmcgQHZhbHVle0FTfQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQHNldHRpdGxlIFVzaW5nIEB2YWx1ZXtBU30gKEB2YWx1ZXtUQVJHRVR9KQotQGVuZCBpZmNsZWFyCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLUBjIEBzbWFsbGJvb2sKLUBjIEBzZXQgU01BTEwKLUBjIFdBUkUhIFNvbWUgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IHNlY3Rpb25zIGNvbnRhaW4gdGFibGVzIG9mIG1hY2hpbmUKLUBjIGluc3RydWN0aW9ucy4gIEV4Y2VwdCBpbiBtdWx0aS1jb2x1bW4gZm9ybWF0LCB0aGVzZSB0YWJsZXMgbG9vayBzaWxseS4KLUBjIFVuZm9ydHVuYXRlbHksIFRleGluZm8gZG9lc24ndCBoYXZlIGEgZ2VuZXJhbC1wdXJwb3NlIG11bHRpLWNvbCBmb3JtYXQsIHNvCi1AYyB0aGUgbXVsdGktY29sIGZvcm1hdCBpcyBmYWtlZCB3aXRoaW4gQGV4YW1wbGUgc2VjdGlvbnMuCi1AYyAKLUBjIEFnYWluIHVuZm9ydHVuYXRlbHksIHRoZSBuYXR1cmFsIHNpemUgdGhhdCBmaXRzIG9uIGEgcGFnZSwgZm9yIHRoZXNlIHRhYmxlcywKLUBjIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3Qgc21hbGxib29rIGlzIHR1cm5lZCBvbi4KLUBjIFRoaXMgbWF0dGVycywgYmVjYXVzZSBvZiBvcmRlcjogdGV4dCBmbG93IHN3aXRjaGVzIGNvbHVtbnMgYXQgZWFjaCBwYWdlCi1AYyBicmVhay4KLUBjIAotQGMgVGhlIGZvcm1hdCBmYWtlZCBpbiB0aGlzIHNvdXJjZSB3b3JrcyByZWFzb25hYmx5IHdlbGwgZm9yIHNtYWxsYm9vaywKLUBjIG5vdCB3ZWxsIGZvciB0aGUgZGVmYXVsdCBsYXJnZS1wYWdlIGZvcm1hdC4gIFRoaXMgbWFudWFsIGV4cGVjdHMgdGhhdCBpZiB5b3UKLUBjIHR1cm4gb24gQHNtYWxsYm9vaywgeW91IHdpbGwgYWxzbyB1bmNvbW1lbnQgdGhlICJAc2V0IFNNQUxMIiB0byBlbmFibGUgdGhlCi1AYyB0YWJsZXMgaW4gcXVlc3Rpb24uICBZb3UgY2FuIHR1cm4gb24gb25lIHdpdGhvdXQgdGhlIG90aGVyIGF0IHlvdXIKLUBjIGRpc2NyZXRpb24sIG9mIGNvdXJzZS4gCi1AaWZpbmZvCi1Ac2V0IFNNQUxMCi1AYyB0aGUgaW5zbiB0YWJsZXMgbG9vayBqdXN0IGFzIHNpbGx5IGluIGluZm8gZmlsZXMgcmVnYXJkbGVzcyBvZiBzbWFsbGJvb2ssCi1AYyBtaWdodCBhcyB3ZWxsIHNob3cgJ2VtIGFueXdheXMuCi1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBBczogKGFzKS4gICAgICAgICAgICAgICAgICAgICBUaGUgR05VIGFzc2VtYmxlci4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBmaW5hbG91dAotQHN5bmNvZGVpbmRleCBreSBjcAotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBHTlUgQXNzZW1ibGVyICJAdmFsdWV7QVN9Ii4KLQotQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzIG1hbnVhbAotdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZSByZXN1bHRpbmcKLWRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8KLXRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCBpZmluZm8KLQotQHRpdGxlcGFnZQotQHRpdGxlIFVzaW5nIEB2YWx1ZXtBU30KLUBzdWJ0aXRsZSBUaGUgQHNje2dudX0gQXNzZW1ibGVyCi1AaWZjbGVhciBHRU5FUklDCi1Ac3VidGl0bGUgZm9yIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHkKLUBlbmQgaWZjbGVhcgotQHNwIDEKLUBzdWJ0aXRsZSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfQotQHNwIDEKLUBzcCAxMwotVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBJbmMuICB0aGFua3MgVGhlIE5pY2UgQ29tcHV0ZXIKLUNvbXBhbnkgb2YgQXVzdHJhbGlhIGZvciBsb2FuaW5nIERlYW4gRWxzbmVyIHRvIHdyaXRlIHRoZQotZmlyc3QgKFZheCkgdmVyc2lvbiBvZiBAY29kZXthc30gZm9yIFByb2plY3QgQHNje2dudX0uCi1UaGUgcHJvcHJpZXRvcnMsIG1hbmFnZW1lbnQgYW5kIHN0YWZmIG9mIFROQ0NBIHRoYW5rIEZTRiBmb3IKLWRpc3RyYWN0aW5nIHRoZSBib3NzIHdoaWxlIHRoZXkgZ290IHNvbWUgd29yawotZG9uZS4KLUBzcCAzCi1AYXV0aG9yIERlYW4gRWxzbmVyLCBKYXkgRmVubGFzb24gJiBmcmllbmRzCi1AcGFnZQotQHRleAote1xwYXJza2lwPTBwdAotXGhmaWxsIHtcaXQgVXNpbmcge1x0dCBAdmFsdWV7QVN9fX1ccGFyCi1caGZpbGwgRWRpdGVkIGJ5IEN5Z251cyBTdXBwb3J0XHBhcgotfQotJSJib3hpdCIgbWFjcm8gZm9yIGZpZ3VyZXM6Ci0lTW9kaWZpZWQgZnJvbSBLbnV0aCdzIGBgYm94aXQnJyBtYWNybyBmcm9tIFRlWGJvb2sgKGFuc3dlciB0byBleGVyY2lzZSAyMS4zKQotXGdkZWZcYm94aXQjMSMye1x2Ym94e1xocnVsZVxoYm94e1x2cnVsZVxrZXJuM3B0Ci0gICAgIFx2Ym94e1xwYXJpbmRlbnQ9MHB0XHBhcnNraXA9MHB0XGhzaXplPSMxXGtlcm4zcHRcc3RydXRcaGZpbAotIzJcaGZpbFxzdHJ1dFxrZXJuM3B0fVxrZXJuM3B0XHZydWxlfVxocnVsZX19JWJveCB3aXRoIHZpc2libGUgb3V0bGluZQotXGdkZWZcaWJveCMxIzJ7XGhib3ggdG8gIzF7IzJcaGZpbH1ca2VybjhwdH0lIGludmlzaWJsZSBib3gKLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzIG1hbnVhbAotdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZSByZXN1bHRpbmcKLWRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8KLXRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFVzaW5nIEB2YWx1ZXtBU30KLQotVGhpcyBmaWxlIGlzIGEgdXNlciBndWlkZSB0byB0aGUgQHNje2dudX0gYXNzZW1ibGVyIEBjb2Rle0B2YWx1ZXtBU319IHZlcnNpb24KLUB2YWx1ZXtWRVJTSU9OfS4KLUBpZmNsZWFyIEdFTkVSSUMKLVRoaXMgdmVyc2lvbiBvZiB0aGUgZmlsZSBkZXNjcmliZXMgQGNvZGV7QHZhbHVle0FTfX0gY29uZmlndXJlZCB0byBnZW5lcmF0ZQotY29kZSBmb3IgQHZhbHVle1RBUkdFVH0gYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZjbGVhcgotQG1lbnUKLSogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXcKLSogSW52b2tpbmc6OiAgICAgICAgICAgICAgICAgICAgQ29tbWFuZC1MaW5lIE9wdGlvbnMKLSogU3ludGF4OjogICAgICAgICAgICAgICAgICAgICAgU3ludGF4Ci0qIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgICAgIFNlY3Rpb25zIGFuZCBSZWxvY2F0aW9uCi0qIFN5bWJvbHM6OiAgICAgICAgICAgICAgICAgICAgIFN5bWJvbHMKLSogRXhwcmVzc2lvbnM6OiAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbnMKLSogUHNldWRvIE9wczo6ICAgICAgICAgICAgICAgICAgQXNzZW1ibGVyIERpcmVjdGl2ZXMKLSogTWFjaGluZSBEZXBlbmRlbmNpZXM6OiAgICAgICAgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLSogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKLSogQWNrbm93bGVkZ2VtZW50czo6ICAgICAgICAgICAgV2hvIERpZCBXaGF0Ci0qIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ci1AZW5kIG1lbnUKLUBlbmQgaWZpbmZvCi0KLUBub2RlIE92ZXJ2aWV3Ci1AY2hhcHRlciBPdmVydmlldwotQGlmdGV4Ci1UaGlzIG1hbnVhbCBpcyBhIHVzZXIgZ3VpZGUgdG8gdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBAY29kZXtAdmFsdWV7QVN9fS4KLUBpZmNsZWFyIEdFTkVSSUMKLVRoaXMgdmVyc2lvbiBvZiB0aGUgbWFudWFsIGRlc2NyaWJlcyBAY29kZXtAdmFsdWV7QVN9fSBjb25maWd1cmVkIHRvIGdlbmVyYXRlCi1jb2RlIGZvciBAdmFsdWV7VEFSR0VUfSBhcmNoaXRlY3R1cmVzLgotQGVuZCBpZmNsZWFyCi1AZW5kIGlmdGV4Ci0KLUBjaW5kZXggaW52b2NhdGlvbiBzdW1tYXJ5Ci1AY2luZGV4IG9wdGlvbiBzdW1tYXJ5Ci1AY2luZGV4IHN1bW1hcnkgb2Ygb3B0aW9ucwotSGVyZSBpcyBhIGJyaWVmIHN1bW1hcnkgb2YgaG93IHRvIGludm9rZSBAY29kZXtAdmFsdWV7QVN9fS4gIEZvciBkZXRhaWxzLAotQHB4cmVme0ludm9raW5nLCxDb21hbmQtTGluZSBPcHRpb25zfS4KLQotQGMgV2UgZG9uJ3QgdXNlIGRlZmZuIGFuZCBmcmllbmRzIGZvciB0aGUgZm9sbG93aW5nIGJlY2F1c2UgdGhleSBzZWVtCi1AYyB0byBiZSBsaW1pdGVkIHRvIG9uZSBsaW5lIGZvciB0aGUgaGVhZGVyLgotQHNtYWxsZXhhbXBsZQotQHZhbHVle0FTfSBbIC1hW2NkaGxuc11bPWZpbGVdIF0gWyAtRCBdICBbIC0tZGVmc3ltIEB2YXJ7c3ltfT1AdmFye3ZhbH0gXQotIFsgLWYgXSBbIC0tZ3N0YWJzIF0gWyAtLWhlbHAgXSBbIC1JIEB2YXJ7ZGlyfSBdIFsgLUogXSBbIC1LIF0gWyAtTCBdCi0gWyAtLWtlZXAtbG9jYWxzIF0gWyAtbyBAdmFye29iamZpbGV9IF0gWyAtUiBdIFsgLS1zdGF0aXN0aWNzIF0gWyAtdiBdCi0gWyAtdmVyc2lvbiBdIFsgLS12ZXJzaW9uIF0gWyAtVyBdIFsgLXcgXSBbIC14IF0gWyAtWiBdCi1AaWZzZXQgQTI5SwotQGMgYW0yOWsgaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJDCi0gWyAtbWJpZy1lbmRpYW4gfCAtbWxpdHRsZS1lbmRpYW4gXQotQGVuZCBpZnNldAotQGlmc2V0IEFSTQotIFsgLW1bYXJtXTEgfCAtbVthcm1dMiB8IC1tW2FybV0yNTAgfCAtbVthcm1dMyB8IC1tW2FybV02IHwgLW1bYXJtXTdbdF1bW2RdbVtpXV0gXQotIFsgLW1bYXJtXXYyIHwgLW1bYXJtXXYyYSB8IC1tW2FybV12MyB8IC1tW2FybV12M20gfCAtbVthcm1ddjQgfCAtbVthcm1ddjR0IF0KLSBbIC1tdGh1bWIgfCAtbWFsbCBdCi0gWyAtbWZwYTEwIHwgLW1mcGExMSB8IC1tZnBlLW9sZCB8IC1tbm8tZnB1IF0KLSBbIC1FQiB8IC1FTCBdCi0gWyAtbWFwY3MtMzIgfCAtbWFwY3MtMjYgXQotQGVuZCBpZnNldAotQGlmc2V0IEQxMFYKLSBbIC1PIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBEMzBWCi0gWyAtTyB8IC1uIHwgLU4gXQotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci1AYyBIaXRhY2hpIGZhbWlseSBjaGlwcyBoYXZlIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotQGMgSFBQQSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMgKHlldCkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU1BBUkMKLUBjIFRoZSBvcmRlciBoZXJlIGlzIGltcG9ydGFudC4gIFNlZSBjLXNwYXJjLnRleGkuCi0gWyAtQXY2IHwgLUF2NyB8IC1BdjggfCAtQXNwYXJjbGV0IHwgLUFzcGFyY2xpdGUKLSAgIC1BdjhwbHVzIHwgLUF2OHBsdXNhIHwgLUF2OSB8IC1BdjlhIF0KLSBbIC14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYSBdIFsgLWJ1bXAgXSBbIC0zMiB8IC02NCBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLUBjIFo4MDAwIGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUBjIHNlZSBtZF9wYXJzZV9vcHRpb24gaW4gdGMtaTk2MC5jCi0gWyAtQUNBIHwgLUFDQV9BIHwgLUFDQiB8IC1BQ0MgfCAtQUtBIHwgLUFLQiB8IC1BS0MgfCAtQU1DIF0KLSBbIC1iIF0gWyAtbm8tcmVsYXggXQotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotIFsgLWwgXSBbIC1tNjgwMDAgfCAtbTY4MDEwIHwgLW02ODAyMCB8IC4uLiBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTUNPUkUKLSBbIC1qc3JpMmJzciBdIFsgLXNpZmlsdGVyIF0gWyAtcmVsYXggXQotQGVuZCBpZnNldAotQGlmc2V0IE1JUFMKLSBbIC1ub2NwcCBdIFsgLUVMIF0gWyAtRUIgXSBbIC1HIEB2YXJ7bnVtfSBdIFsgLW1jcHU9QHZhcntDUFV9IF0KLSBbIC1taXBzMSBdIFsgLW1pcHMyIF0gWyAtbWlwczMgXSBbIC1tNDY1MCBdIFsgLW5vLW00NjUwIF0KLSBbIC0tdHJhcCBdIFsgLS1icmVhayBdCi0gWyAtLWVtdWxhdGlvbj1AdmFye25hbWV9IF0KLUBlbmQgaWZzZXQKLSBbIC0tIHwgQHZhcntmaWxlc30gQGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hW2NkaGxtbnNdCi1UdXJuIG9uIGxpc3RpbmdzLCBpbiBhbnkgb2YgYSB2YXJpZXR5IG9mIHdheXM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWFjCi1vbWl0IGZhbHNlIGNvbmRpdGlvbmFscwotCi1AaXRlbSAtYWQKLW9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXMKLQotQGl0ZW0gLWFoCi1pbmNsdWRlIGhpZ2gtbGV2ZWwgc291cmNlCi0KLUBpdGVtIC1hbAotaW5jbHVkZSBhc3NlbWJseQotCi1AaXRlbSAtYW0KLWluY2x1ZGUgbWFjcm8gZXhwYW5zaW9ucwotCi1AaXRlbSAtYW4KLW9taXQgZm9ybXMgcHJvY2Vzc2luZwotCi1AaXRlbSAtYXMKLWluY2x1ZGUgc3ltYm9scwotCi1AaXRlbSA9ZmlsZQotc2V0IHRoZSBuYW1lIG9mIHRoZSBsaXN0aW5nIGZpbGUKLUBlbmQgdGFibGUKLQotWW91IG1heSBjb21iaW5lIHRoZXNlIG9wdGlvbnM7IGZvciBleGFtcGxlLCB1c2UgQHNhbXB7LWFsbn0gZm9yIGFzc2VtYmx5Ci1saXN0aW5nIHdpdGhvdXQgZm9ybXMgcHJvY2Vzc2luZy4gIFRoZSBAc2FtcHs9ZmlsZX0gb3B0aW9uLCBpZiB1c2VkLCBtdXN0IGJlCi10aGUgbGFzdCBvbmUuICBCeSBpdHNlbGYsIEBzYW1wey1hfSBkZWZhdWx0cyB0byBAc2FtcHstYWhsc30uCi0KLUBpdGVtIC1ECi1JZ25vcmVkLiAgVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgZm9yIHNjcmlwdCBjb21wYXRpYmlsaXR5IHdpdGggY2FsbHMgdG8KLW90aGVyIGFzc2VtYmxlcnMuCi0KLUBpdGVtIC0tZGVmc3ltIEB2YXJ7c3ltfT1AdmFye3ZhbHVlfQotRGVmaW5lIHRoZSBzeW1ib2wgQHZhcntzeW19IHRvIGJlIEB2YXJ7dmFsdWV9IGJlZm9yZSBhc3NlbWJsaW5nIHRoZSBpbnB1dCBmaWxlLgotQHZhcnt2YWx1ZX0gbXVzdCBiZSBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgQXMgaW4gQywgYSBsZWFkaW5nIEBzYW1wezB4fQotaW5kaWNhdGVzIGEgaGV4YWRlY2ltYWwgdmFsdWUsIGFuZCBhIGxlYWRpbmcgQHNhbXB7MH0gaW5kaWNhdGVzIGFuIG9jdGFsIHZhbHVlLgotCi1AaXRlbSAtZgotYGBmYXN0JyctLS1za2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZyAoYXNzdW1lIHNvdXJjZSBpcwotY29tcGlsZXIgb3V0cHV0KS4KLQotQGl0ZW0gLS1nc3RhYnMKLUdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhc3NlbWJsZXIgbGluZS4gIFRoaXMKLW1heSBoZWxwIGRlYnVnZ2luZyBhc3NlbWJsZXIgY29kZSwgaWYgdGhlIGRlYnVnZ2VyIGNhbiBoYW5kbGUgaXQuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgZXhpdC4KLQotQGl0ZW0gLUkgQHZhcntkaXJ9Ci1BZGQgZGlyZWN0b3J5IEB2YXJ7ZGlyfSB0byB0aGUgc2VhcmNoIGxpc3QgZm9yIEBjb2Rley5pbmNsdWRlfSBkaXJlY3RpdmVzLgotCi1AaXRlbSAtSgotRG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3cuCi0KLUBpdGVtIC1LCi1AaWZjbGVhciBESUZGLVRCTC1LTFVHRQotVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgYnV0IGhhcyBubyBlZmZlY3Qgb24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi1Jc3N1ZSB3YXJuaW5ncyB3aGVuIGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50cy4KLUBlbmQgaWZzZXQKLQotQGl0ZW0gLUwKLUBpdGVteCAtLWtlZXAtbG9jYWxzCi1LZWVwIChpbiB0aGUgc3ltYm9sIHRhYmxlKSBsb2NhbCBzeW1ib2xzLiAgT24gdHJhZGl0aW9uYWwgYS5vdXQgc3lzdGVtcwotdGhlc2Ugc3RhcnQgd2l0aCBAc2FtcHtMfSwgYnV0IGRpZmZlcmVudCBzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IGxvY2FsCi1sYWJlbCBwcmVmaXhlcy4KLQotQGl0ZW0gLW8gQHZhcntvYmpmaWxlfQotTmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IGZyb20gQGNvZGV7QHZhbHVle0FTfX0gQHZhcntvYmpmaWxlfS4KLQotQGl0ZW0gLVIKLUZvbGQgdGhlIGRhdGEgc2VjdGlvbiBpbnRvIHRoZSB0ZXh0IHNlY3Rpb24uCi0KLUBpdGVtIC0tc3RhdGlzdGljcwotUHJpbnQgdGhlIG1heGltdW0gc3BhY2UgKGluIGJ5dGVzKSBhbmQgdG90YWwgdGltZSAoaW4gc2Vjb25kcykgdXNlZCBieQotYXNzZW1ibHkuCi0KLUBpdGVtIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUKLVJlbW92ZSBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzIGZyb20gdGhlIG91dGdvaW5nIHN5bWJvbCB0YWJsZS4KLQotQGl0ZW0gLXYKLUBpdGVteCAtdmVyc2lvbgotUHJpbnQgdGhlIEBjb2Rle2FzfSB2ZXJzaW9uLgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50IHRoZSBAY29kZXthc30gdmVyc2lvbiBhbmQgZXhpdC4KLQotQGl0ZW0gLVcKLVN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMuCi0KLUBpdGVtIC13Ci1JZ25vcmVkLgotCi1AaXRlbSAteAotSWdub3JlZC4KLQotQGl0ZW0gLVoKLUdlbmVyYXRlIGFuIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzLgotCi1AaXRlbSAtLSB8IEB2YXJ7ZmlsZXN9IEBkb3Rze30KLVN0YW5kYXJkIGlucHV0LCBvciBzb3VyY2UgZmlsZXMgdG8gYXNzZW1ibGUuCi0KLUBlbmQgdGFibGUKLQotQGlmc2V0IEFSQwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hbiBBUkMgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBBUkMgZW5kaWFubmVzcwotQGNpbmRleCBlbmRpYW5uZXNzLCBBUkMKLUBjaW5kZXggYmlnIGVuZGlhbiBvdXRwdXQsIEFSQwotQGl0ZW0gLW1iaWctZW5kaWFuCi1HZW5lcmF0ZSBgYGJpZyBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AY2luZGV4IGxpdHRsZSBlbmRpYW4gb3V0cHV0LCBBUkMKLUBpdGVtIC1tbGl0dGxlLWVuZGlhbgotR2VuZXJhdGUgYGBsaXR0bGUgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgQVJNCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgdGhlIEFSTQotcHJvY2Vzc29yIGZhbWlseS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtbVthcm1dMSB8IC1tW2FybV0yIHwgLW1bYXJtXTI1MCB8IC1tW2FybV0zIHwgLW1bYXJtXTYgfCAtbVthcm1dN1t0XVtbZF1tXSB8IC1tW2FybV12MiB8IC1tW2FybV12MmEgfCAtbVthcm1ddjMgfCAtbVthcm1ddjNtIHwgLW1bYXJtXXY0IHwgLW1bYXJtXXY0dCAKLVNwZWNpZnkgd2hpY2ggdmFyaWFudCBvZiB0aGUgQVJNIGFyY2hpdGVjdHVyZSBpcyB0aGUgdGFyZ2V0LgotQGl0ZW0gLW10aHVtYiB8IC1tYWxsCi1FbmFibGUgb3IgZGlzYWJsZSBUaHVtYiBvbmx5IGluc3RydWN0aW9uIGRlY29kaW5nLgotQGl0ZW0gLW1mcGExMCB8IC1tZnBhMTEgfCAtbWZwZS1vbGQgfCAtbW5vLWZwdQotU2VsZWN0IHdoaWNoIEZsb2F0aW5nIFBvaW50IGFyY2hpdGN0dXJlIGlzIHRoZSB0YXJnZXQuCi1AaXRlbSAtbWFwY3MtMzIgfCAtbWFwY3MtMjYKLVNlbGVjdCB3aGljaCBwcm9jZWR1cmUgY2FsbGluZyBjb252ZW50aW9uIGlzIGluIHVzZS4KLUBpdGVtIC1FQiB8IC1FTAotU2VsZWN0IGVpdGhlciBiaWctZW5kaWFuICgtRUIpIG9yIGxpdHRsZS1lbmRpYW4gKC1FTCkgb3V0cHV0LgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgRDEwVgotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hIEQxMFYgcHJvY2Vzc29yLgotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEQxMFYgb3B0aW1pemF0aW9uCi1AY2luZGV4IG9wdGltaXphdGlvbiwgRDEwVgotQGl0ZW0gLU8KLU9wdGltaXplIG91dHB1dCBieSBwYXJhbGxlbGl6aW5nIGluc3RydWN0aW9ucy4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQzMFYKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciBhIEQzMFYKLXByb2Nlc3Nvci4KLUB0YWJsZSBAY29kZQotQGNpbmRleCBEMzBWIG9wdGltaXphdGlvbgotQGNpbmRleCBvcHRpbWl6YXRpb24sIEQzMFYKLUBpdGVtIC1PCi1PcHRpbWl6ZSBvdXRwdXQgYnkgcGFyYWxsZWxpemluZyBpbnN0cnVjdGlvbnMuCi0KLUBjaW5kZXggRDMwViBub3BzCi1AaXRlbSAtbgotV2FybiB3aGVuIG5vcHMgYXJlIGdlbmVyYXRlZC4KLQotQGNpbmRleCBEMzBWIG5vcHMgYWZ0ZXIgMzItYml0IG11bHRpcGx5Ci1AaXRlbSAtTgotV2FybiB3aGVuIGEgbm9wIGFmdGVyIGEgMzItYml0IG11bHRpcGx5IGluc3RydWN0aW9uIGlzIGdlbmVyYXRlZC4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEk5NjAKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciB0aGUKLUludGVsIDgwOTYwIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQUNBIHwgLUFDQV9BIHwgLUFDQiB8IC1BQ0MgfCAtQUtBIHwgLUFLQiB8IC1BS0MgfCAtQU1DCi1TcGVjaWZ5IHdoaWNoIHZhcmlhbnQgb2YgdGhlIDk2MCBhcmNoaXRlY3R1cmUgaXMgdGhlIHRhcmdldC4KLQotQGl0ZW0gLWIKLUFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlbi4KLQotQGl0ZW0gLW5vLXJlbGF4Ci1EbyBub3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzOwotZXJyb3IgaWYgbmVjZXNzYXJ5LgotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLQotQGlmc2V0IE02ODBYMAotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZQotTW90b3JvbGEgNjgwMDAgc2VyaWVzLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLWwKLVNob3J0ZW4gcmVmZXJlbmNlcyB0byB1bmRlZmluZWQgc3ltYm9scywgdG8gb25lIHdvcmQgaW5zdGVhZCBvZiB0d28uCi0KLUBpdGVtIC1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjAKLUBpdGVteCB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW1jcHUzMiB8IC1tNTIwMAotU3BlY2lmeSB3aGF0IHByb2Nlc3NvciBpbiB0aGUgNjgwMDAgZmFtaWx5IGlzIHRoZSB0YXJnZXQuICBUaGUgZGVmYXVsdAotaXMgbm9ybWFsbHkgdGhlIDY4MDIwLCBidXQgdGhpcyBjYW4gYmUgY2hhbmdlZCBhdCBjb25maWd1cmF0aW9uIHRpbWUuCi0KLUBpdGVtIC1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODIKLVRoZSB0YXJnZXQgbWFjaGluZSBkb2VzIChvciBkb2VzIG5vdCkgaGF2ZSBhIGZsb2F0aW5nLXBvaW50IGNvcHJvY2Vzc29yLgotVGhlIGRlZmF1bHQgaXMgdG8gYXNzdW1lIGEgY29wcm9jZXNzb3IgZm9yIDY4MDIwLCA2ODAzMCwgYW5kIGNwdTMyLiAgQWx0aG91Z2gKLXRoZSBiYXNpYyA2ODAwMCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSA2ODg4MSwgYSBjb21iaW5hdGlvbiBvZiB0aGUKLXR3byBjYW4gYmUgc3BlY2lmaWVkLCBzaW5jZSBpdCdzIHBvc3NpYmxlIHRvIGRvIGVtdWxhdGlvbiBvZiB0aGUKLWNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB3aXRoIHRoZSBtYWluIHByb2Nlc3Nvci4KLQotQGl0ZW0gLW02ODg1MSB8IC1tbm8tNjg4NTEKLVRoZSB0YXJnZXQgbWFjaGluZSBkb2VzIChvciBkb2VzIG5vdCkgaGF2ZSBhIG1lbW9yeS1tYW5hZ2VtZW50Ci11bml0IGNvcHJvY2Vzc29yLiAgVGhlIGRlZmF1bHQgaXMgdG8gYXNzdW1lIGFuIE1NVSBmb3IgNjgwMjAgYW5kIHVwLgotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBTUEFSQwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkCi1mb3IgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQXY2IHwgLUF2NyB8IC1BdjggfCAtQXNwYXJjbGV0IHwgLUFzcGFyY2xpdGUKLUBpdGVteCAtQXY4cGx1cyB8IC1BdjhwbHVzYSB8IC1BdjkgfCAtQXY5YQotRXhwbGljaXRseSBzZWxlY3QgYSB2YXJpYW50IG9mIHRoZSBTUEFSQyBhcmNoaXRlY3R1cmUuCi0KLUBzYW1wey1BdjhwbHVzfSBhbmQgQHNhbXB7LUF2OHBsdXNhfSBzZWxlY3QgYSAzMiBiaXQgZW52aXJvbm1lbnQuCi1Ac2FtcHstQXY5fSBhbmQgQHNhbXB7LUF2OWF9IHNlbGVjdCBhIDY0IGJpdCBlbnZpcm9ubWVudC4KLQotQHNhbXB7LUF2OHBsdXNhfSBhbmQgQHNhbXB7LUF2OWF9IGVuYWJsZSB0aGUgU1BBUkMgVjkgaW5zdHJ1Y3Rpb24gc2V0IHdpdGgKLVVsdHJhU1BBUkMgZXh0ZW5zaW9ucy4KLQotQGl0ZW0gLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhCi1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIHY5IGFzc2VtYmxlci4gIFRoZXNlIG9wdGlvbnMgYXJlCi1lcXVpdmFsZW50IHRvIC1BdjhwbHVzIGFuZCAtQXY4cGx1c2EsIHJlc3BlY3RpdmVseS4KLQotQGl0ZW0gLWJ1bXAKLVdhcm4gd2hlbiB0aGUgYXNzZW1ibGVyIHN3aXRjaGVzIHRvIGFub3RoZXIgYXJjaGl0ZWN0dXJlLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUlQUwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hIE1JUFMgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1HIEB2YXJ7bnVtfQotVGhpcyBvcHRpb24gc2V0cyB0aGUgbGFyZ2VzdCBzaXplIG9mIGFuIG9iamVjdCB0aGF0IGNhbiBiZSByZWZlcmVuY2VkCi1pbXBsaWNpdGx5IHdpdGggdGhlIEBjb2Rle2dwfSByZWdpc3Rlci4gIEl0IGlzIG9ubHkgYWNjZXB0ZWQgZm9yIHRhcmdldHMgdGhhdAotdXNlIEVDT0ZGIGZvcm1hdCwgc3VjaCBhcyBhIERFQ3N0YXRpb24gcnVubmluZyBVbHRyaXguICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LgotCi1AY2luZGV4IE1JUFMgZW5kaWFubmVzcwotQGNpbmRleCBlbmRpYW5uZXNzLCBNSVBTCi1AY2luZGV4IGJpZyBlbmRpYW4gb3V0cHV0LCBNSVBTCi1AaXRlbSAtRUIKLUdlbmVyYXRlIGBgYmlnIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBjaW5kZXggbGl0dGxlIGVuZGlhbiBvdXRwdXQsIE1JUFMKLUBpdGVtIC1FTAotR2VuZXJhdGUgYGBsaXR0bGUgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGNpbmRleCBNSVBTIElTQQotQGl0ZW0gLW1pcHMxCi1AaXRlbXggLW1pcHMyCi1AaXRlbXggLW1pcHMzCi1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsLgotQHNhbXB7LW1pcHMxfSBjb3JyZXNwb25kcyB0byB0aGUgQHNje3IyMDAwfSBhbmQgQHNje3IzMDAwfSBwcm9jZXNzb3JzLAotQHNhbXB7LW1pcHMyfSB0byB0aGUgQHNje3I2MDAwfSBwcm9jZXNzb3IsIGFuZCBAc2FtcHstbWlwczN9IHRvIHRoZSBAc2N7cjQwMDB9Ci1wcm9jZXNzb3IuCi0KLUBpdGVtIC1tNDY1MAotQGl0ZW14IC1uby1tNDY1MAotR2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMgQHNje3I0NjUwfSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdAotdGhlIEBzYW1we21hZH0gYW5kIEBzYW1we21hZHV9IGluc3RydWN0aW9uLCBhbmQgdG8gbm90IHNjaGVkdWxlIEBzYW1we25vcH0KLWluc3RydWN0aW9ucyBhcm91bmQgYWNjZXNzZXMgdG8gdGhlIEBzYW1we0hJfSBhbmQgQHNhbXB7TE99IHJlZ2lzdGVycy4KLUBzYW1wey1uby1tNDY1MH0gdHVybnMgb2ZmIHRoaXMgb3B0aW9uLgotCi1AaXRlbSAtbWNwdT1AdmFye0NQVX0KLUdlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIGNwdS4gIFRoaXMgaGFzIGxpdHRsZSBlZmZlY3Qgb24gdGhlCi1hc3NlbWJsZXIsIGJ1dCBpdCBpcyBwYXNzZWQgYnkgQGNvZGV7QHZhbHVle0dDQ319LgotCi1AY2luZGV4IGVtdWxhdGlvbgotQGl0ZW0gLS1lbXVsYXRpb249QHZhcntuYW1lfQotVGhpcyBvcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGVtdWxhdGUgQGNvZGV7QHZhbHVle0FTfX0gY29uZmlndXJlZAotZm9yIHNvbWUgb3RoZXIgdGFyZ2V0LCBpbiBhbGwgcmVzcGVjdHMsIGluY2x1ZGluZyBvdXRwdXQgZm9ybWF0IChjaG9vc2luZwotYmV0d2VlbiBFTEYgYW5kIEVDT0ZGIG9ubHkpLCBoYW5kbGluZyBvZiBwc2V1ZG8tb3Bjb2RlcyB3aGljaCBtYXkgZ2VuZXJhdGUKLWRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvciBzdG9yZSBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24sIGFuZCBkZWZhdWx0Ci1lbmRpYW5uZXNzLiAgVGhlIGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIG5hbWVzIGFyZTogQHNhbXB7bWlwc2Vjb2ZmfSwKLUBzYW1we21pcHNlbGZ9LCBAc2FtcHttaXBzbGVjb2ZmfSwgQHNhbXB7bWlwc2JlY29mZn0sIEBzYW1we21pcHNsZWxmfSwKLUBzYW1we21pcHNiZWxmfS4gIFRoZSBmaXJzdCB0d28gZG8gbm90IGFsdGVyIHRoZSBkZWZhdWx0IGVuZGlhbm5lc3MgZnJvbSB0aGF0Ci1vZiB0aGUgcHJpbWFyeSB0YXJnZXQgZm9yIHdoaWNoIHRoZSBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQ7IHRoZSBvdGhlcnMgY2hhbmdlCi10aGUgZGVmYXVsdCB0byBsaXR0bGUtIG9yIGJpZy1lbmRpYW4gYXMgaW5kaWNhdGVkIGJ5IHRoZSBAc2FtcHtifSBvciBAc2FtcHtsfQotaW4gdGhlIG5hbWUuICBVc2luZyBAc2FtcHstRUJ9IG9yIEBzYW1wey1FTH0gd2lsbCBvdmVycmlkZSB0aGUgZW5kaWFubmVzcwotc2VsZWN0aW9uIGluIGFueSBjYXNlLgotCi1UaGlzIG9wdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgd2hlbiB0aGUgcHJpbWFyeSB0YXJnZXQKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIGlzIGEgTUlQUyBFTEYgb3IgRUNPRkYgdGFyZ2V0LgotRnVydGhlcm1vcmUsIHRoZSBwcmltYXJ5IHRhcmdldCBvciBvdGhlcnMgc3BlY2lmaWVkIHdpdGgKLUBzYW1wey0tZW5hYmxlLXRhcmdldHM9QGRvdHN7fX0gYXQgY29uZmlndXJhdGlvbiB0aW1lIG11c3QgaW5jbHVkZSBzdXBwb3J0IGZvcgotdGhlIG90aGVyIGZvcm1hdCwgaWYgYm90aCBhcmUgdG8gYmUgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsIHRoZSBJcml4IDUKLWNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgc3VwcG9ydCBmb3IgYm90aC4KLQotRXZlbnR1YWxseSwgdGhpcyBvcHRpb24gd2lsbCBzdXBwb3J0IG1vcmUgY29uZmlndXJhdGlvbnMsIHdpdGggbW9yZQotZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgYXNzZW1ibGVyJ3MgYmVoYXZpb3IsIGFuZCB3aWxsIGJlIHN1cHBvcnRlZCBmb3IKLW1vcmUgcHJvY2Vzc29ycy4KLQotQGl0ZW0gLW5vY3BwCi1AY29kZXtAdmFsdWV7QVN9fSBpZ25vcmVzIHRoaXMgb3B0aW9uLiAgSXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotdGhlIG5hdGl2ZSB0b29scy4KLQotQG5lZWQgOTAwCi1AaXRlbSAtLXRyYXAKLUBpdGVteCAtLW5vLXRyYXAKLUBpdGVteCAtLWJyZWFrCi1AaXRlbXggLS1uby1icmVhawotQ29udHJvbCBob3cgdG8gZGVhbCB3aXRoIG11bHRpcGxpY2F0aW9uIG92ZXJmbG93IGFuZCBkaXZpc2lvbiBieSB6ZXJvLgotQHNhbXB7LS10cmFwfSBvciBAc2FtcHstLW5vLWJyZWFrfSAod2hpY2ggYXJlIHN5bm9ueW1zKSB0YWtlIGEgdHJhcCBleGNlcHRpb24KLShhbmQgb25seSB3b3JrIGZvciBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsIDIgYW5kIGhpZ2hlcik7Ci1Ac2FtcHstLWJyZWFrfSBvciBAc2FtcHstLW5vLXRyYXB9IChhbHNvIHN5bm9ueW1zLCBhbmQgdGhlIGRlZmF1bHQpIHRha2UgYQotYnJlYWsgZXhjZXB0aW9uLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUNPUkUKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYW4gTUNvcmUgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1qc3JpMmJzcgotQGl0ZW14IC1ub2pzcmkyYnNyCi1FbmFibGUgb3IgZGlzYWJsZSB0aGUgSlNSSSB0byBCU1IgdHJhbnNmb3JtYXRpb24uICBCeSBkZWZhdWx0IHRoaXMgaXMgZW5hYmxlZC4KLVRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIEBzYW1wey1ub2pzcmkyYnNyfSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGl0LgotCi1AaXRlbSAtc2lmaWx0ZXIKLUBpdGVteCAtbm9zaWZpbHRlcgotRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNpbGljb24gZmlsdGVyIGJlaGF2aW91ci4gIEJ5IGRlZmF1bHQgdGhpcyBpcyBkaXNhYmxlZC4KLVRoZSBkZWZhdWx0IGNhbiBiZSBvdmVyaWRkZW4gYnkgdGhlIEBzYW1wey1zaWZpbHRlcn0gY29tbWFuZCBsaW5lIG9wdGlvbi4KLQotQGl0ZW0gLXJlbGF4Ci1BbHRlciBqdW1wIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgotCi0KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQG1lbnUKLSogTWFudWFsOjogICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIG9mIHRoaXMgTWFudWFsCi0qIEdOVSBBc3NlbWJsZXI6OiAgICAgICAgICAgICAgIFRoZSBHTlUgQXNzZW1ibGVyCi0qIE9iamVjdCBGb3JtYXRzOjogICAgICAgICAgICAgIE9iamVjdCBGaWxlIEZvcm1hdHMKLSogQ29tbWFuZCBMaW5lOjogICAgICAgICAgICAgICAgQ29tbWFuZCBMaW5lCi0qIElucHV0IEZpbGVzOjogICAgICAgICAgICAgICAgIElucHV0IEZpbGVzCi0qIE9iamVjdDo6ICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCAoT2JqZWN0KSBGaWxlCi0qIEVycm9yczo6ICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGFuZCBXYXJuaW5nIE1lc3NhZ2VzCi1AZW5kIG1lbnUKLQotQG5vZGUgTWFudWFsCi1Ac2VjdGlvbiBTdHJ1Y3R1cmUgb2YgdGhpcyBNYW51YWwKLQotQGNpbmRleCBtYW51YWwsIHN0cnVjdHVyZSBhbmQgcHVycG9zZQotVGhpcyBtYW51YWwgaXMgaW50ZW5kZWQgdG8gZGVzY3JpYmUgd2hhdCB5b3UgbmVlZCB0byBrbm93IHRvIHVzZQotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0uICBXZSBjb3ZlciB0aGUgc3ludGF4IGV4cGVjdGVkIGluIHNvdXJjZSBmaWxlcywgaW5jbHVkaW5nCi1ub3RhdGlvbiBmb3Igc3ltYm9scywgY29uc3RhbnRzLCBhbmQgZXhwcmVzc2lvbnM7IHRoZSBkaXJlY3RpdmVzIHRoYXQKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzOyBhbmQgb2YgY291cnNlIGhvdyB0byBpbnZva2UgQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpZmNsZWFyIEdFTkVSSUMKLVdlIGFsc28gY292ZXIgc3BlY2lhbCBmZWF0dXJlcyBpbiB0aGUgQHZhbHVle1RBUkdFVH0KLWNvbmZpZ3VyYXRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0sIGluY2x1ZGluZyBhc3NlbWJsZXIgZGlyZWN0aXZlcy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLVRoaXMgbWFudWFsIGFsc28gZGVzY3JpYmVzIHNvbWUgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGZlYXR1cmVzIG9mCi12YXJpb3VzIGZsYXZvcnMgb2YgdGhlIGFzc2VtYmxlci4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucyAobm90IGNvdmVyZWQpCi1PbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyBtYW51YWwgaXMgQGVtcGh7bm90fSBpbnRlbmRlZCBhcyBhbiBpbnRyb2R1Y3Rpb24KLXRvIHByb2dyYW1taW5nIGluIGFzc2VtYmx5IGxhbmd1YWdlLS0tbGV0IGFsb25lIHByb2dyYW1taW5nIGluIGdlbmVyYWwhCi1JbiBhIHNpbWlsYXIgdmVpbiwgd2UgbWFrZSBubyBhdHRlbXB0IHRvIGludHJvZHVjZSB0aGUgbWFjaGluZQotYXJjaGl0ZWN0dXJlOyB3ZSBkbyBAZW1waHtub3R9IGRlc2NyaWJlIHRoZSBpbnN0cnVjdGlvbiBzZXQsIHN0YW5kYXJkCi1tbmVtb25pY3MsIHJlZ2lzdGVycyBvciBhZGRyZXNzaW5nIG1vZGVzIHRoYXQgYXJlIHN0YW5kYXJkIHRvIGEKLXBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLgotQGlmc2V0IEdFTkVSSUMKLVlvdSBtYXkgd2FudCB0byBjb25zdWx0IHRoZSBtYW51ZmFjdHVyZXIncwotbWFjaGluZSBhcmNoaXRlY3R1cmUgbWFudWFsIGZvciB0aGlzIGluZm9ybWF0aW9uLgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4LzMwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBIOC8zMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtIOC8zMDAKLVNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIEFERS0tNjAyLS0wMjUpLiAgRm9yIHRoZSBIOC8zMDBILAotc2VlIEBjaXRle0g4LzMwMEggU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkpLgotQGVuZCBpZnNldAotQGlmc2V0IEg4LzUwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBIOC81MDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtIOC81MDAKLVNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIE0yMVQwMDEpLgotQGVuZCBpZnNldAotQGlmc2V0IFNICi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIEhpdGFjaGkgU0ggbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7U0gtTWljcm9jb21wdXRlciBVc2VyJ3MgTWFudWFsfSAoSGl0YWNoaSBNaWNybyBTeXN0ZW1zLCBJbmMuKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBaODAwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle1o4MDAwIENQVSBUZWNobmljYWwgTWFudWFsfQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBjIEkgdGhpbmsgdGhpcyBpcyBwcmVtYXR1cmUtLS1kb2NAY3lnbnVzLmNvbSwgMTdqYW4xOTkxCi1AaWdub3JlCi1UaHJvdWdob3V0IHRoaXMgbWFudWFsLCB3ZSBhc3N1bWUgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgQGRmbntHTlV9LAotdGhlIHBvcnRhYmxlIG9wZXJhdGluZyBzeXN0ZW0gZnJvbSB0aGUgQGRmbntGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMufS4gIFRoaXMgcmVzdHJpY3RzIG91ciBhdHRlbnRpb24gdG8gY2VydGFpbiBraW5kcyBvZgotY29tcHV0ZXIgKGluIHBhcnRpY3VsYXIsIHRoZSBraW5kcyBvZiBjb21wdXRlcnMgdGhhdCBAc2N7Z251fSBjYW4gcnVuIG9uKTsKLW9uY2UgdGhpcyBhc3N1bXB0aW9uIGlzIGdyYW50ZWQgZXhhbXBsZXMgYW5kIGRlZmluaXRpb25zIG5lZWQgbGVzcwotcXVhbGlmaWNhdGlvbi4KLQotQGNvZGV7QHZhbHVle0FTfX0gaXMgcGFydCBvZiBhIHRlYW0gb2YgcHJvZ3JhbXMgdGhhdCB0dXJuIGEgaGlnaC1sZXZlbAotaHVtYW4tcmVhZGFibGUgc2VyaWVzIG9mIGluc3RydWN0aW9ucyBpbnRvIGEgbG93LWxldmVsCi1jb21wdXRlci1yZWFkYWJsZSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zLiAgRGlmZmVyZW50IHZlcnNpb25zIG9mCi1AY29kZXtAdmFsdWV7QVN9fSBhcmUgdXNlZCBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGNvbXB1dGVyLgotQGVuZCBpZ25vcmUKLQotQGMgVGhlcmUgdXNlZCB0byBiZSBhIHNlY3Rpb24gIlRlcm1pbm9sb2d5IiBoZXJlLCB3aGljaCBkZWZpbmVkCi1AYyAiY29udGVudHMiLCAiYnl0ZSIsICJ3b3JkIiwgYW5kICJsb25nIi4gIERlZmluaW5nICJ3b3JkIiB0byBhbnkKLUBjIHBhcnRpY3VsYXIgc2l6ZSBpcyBjb25mdXNpbmcgd2hlbiB0aGUgLndvcmQgZGlyZWN0aXZlIG1heSBnZW5lcmF0ZSAxNgotQGMgYml0cyBvbiBvbmUgbWFjaGluZSBhbmQgMzIgYml0cyBvbiBhbm90aGVyOyBpbiBnZW5lcmFsLCBmb3IgdGhlIHVzZXIKLUBjIHZlcnNpb24gb2YgdGhpcyBtYW51YWwsIG5vbmUgb2YgdGhlc2UgdGVybXMgc2VlbSBlc3NlbnRpYWwgdG8gZGVmaW5lLgotQGMgVGhleSB3ZXJlIHVzZWQgdmVyeSBsaXR0bGUgZXZlbiBpbiB0aGUgZm9ybWVyIGRyYWZ0IG9mIHRoZSBtYW51YWw7Ci1AYyB0aGlzIGRyYWZ0IG1ha2VzIGFuIGVmZm9ydCB0byBhdm9pZCB0aGVtIChleGNlcHQgaW4gbmFtZXMgb2YKLUBjIGRpcmVjdGl2ZXMpLgotCi1Abm9kZSBHTlUgQXNzZW1ibGVyCi1Ac2VjdGlvbiBUaGUgR05VIEFzc2VtYmxlcgotCi1Ac2N7Z251fSBAY29kZXthc30gaXMgcmVhbGx5IGEgZmFtaWx5IG9mIGFzc2VtYmxlcnMuCi1AaWZjbGVhciBHRU5FUklDCi1UaGlzIG1hbnVhbCBkZXNjcmliZXMgQGNvZGV7QHZhbHVle0FTfX0sIGEgbWVtYmVyIG9mIHRoYXQgZmFtaWx5IHdoaWNoIGlzCi1jb25maWd1cmVkIGZvciB0aGUgQHZhbHVle1RBUkdFVH0gYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZjbGVhcgotSWYgeW91IHVzZSAob3IgaGF2ZSB1c2VkKSB0aGUgQHNje2dudX0gYXNzZW1ibGVyIG9uIG9uZSBhcmNoaXRlY3R1cmUsIHlvdQotc2hvdWxkIGZpbmQgYSBmYWlybHkgc2ltaWxhciBlbnZpcm9ubWVudCB3aGVuIHlvdSB1c2UgaXQgb24gYW5vdGhlcgotYXJjaGl0ZWN0dXJlLiAgRWFjaCB2ZXJzaW9uIGhhcyBtdWNoIGluIGNvbW1vbiB3aXRoIHRoZSBvdGhlcnMsCi1pbmNsdWRpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cywgbW9zdCBhc3NlbWJsZXIgZGlyZWN0aXZlcyAob2Z0ZW4gY2FsbGVkCi1AZGZue3BzZXVkby1vcHN9KSBhbmQgYXNzZW1ibGVyIHN5bnRheC5AcmVmaWxsCi0KLUBjaW5kZXggcHVycG9zZSBvZiBAc2N7Z251fSBhc3NlbWJsZXIKLUBjb2Rle0B2YWx1ZXtBU319IGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhc3NlbWJsZSB0aGUgb3V0cHV0IG9mIHRoZQotQHNje2dudX0gQyBjb21waWxlciBAY29kZXtAdmFsdWV7R0NDfX0gZm9yIHVzZSBieSB0aGUgbGlua2VyCi1AY29kZXtAdmFsdWV7TER9fS4gIE5ldmVydGhlbGVzcywgd2UndmUgdHJpZWQgdG8gbWFrZSBAY29kZXtAdmFsdWV7QVN9fQotYXNzZW1ibGUgY29ycmVjdGx5IGV2ZXJ5dGhpbmcgdGhhdCBvdGhlciBhc3NlbWJsZXJzIGZvciB0aGUgc2FtZQotbWFjaGluZSB3b3VsZCBhc3NlbWJsZS4KLUBpZnNldCBWQVgKLUFueSBleGNlcHRpb25zIGFyZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkgKEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLgotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotQGMgVGhpcyByZW1hcmsgc2hvdWxkIGFwcGVhciBpbiBnZW5lcmljIHZlcnNpb24gb2YgbWFudWFsOyBhc3N1bXB0aW9uCi1AYyBoZXJlIGlzIHRoYXQgZ2VuZXJpYyB2ZXJzaW9uIHNldHMgTTY4MHgwLgotVGhpcyBkb2Vzbid0IG1lYW4gQGNvZGV7QHZhbHVle0FTfX0gYWx3YXlzIHVzZXMgdGhlIHNhbWUgc3ludGF4IGFzIGFub3RoZXIKLWFzc2VtYmxlciBmb3IgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlOyBmb3IgZXhhbXBsZSwgd2Uga25vdyBvZiBzZXZlcmFsCi1pbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgNjgweDAgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4LgotQGVuZCBpZnNldAotCi1Vbmxpa2Ugb2xkZXIgYXNzZW1ibGVycywgQGNvZGV7QHZhbHVle0FTfX0gaXMgZGVzaWduZWQgdG8gYXNzZW1ibGUgYSBzb3VyY2UKLXByb2dyYW0gaW4gb25lIHBhc3Mgb2YgdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBoYXMgYSBzdWJ0bGUgaW1wYWN0IG9uIHRoZQotQGtiZHsub3JnfSBkaXJlY3RpdmUgKEBweHJlZntPcmcsLEBjb2Rley5vcmd9fSkuCi0KLUBub2RlIE9iamVjdCBGb3JtYXRzCi1Ac2VjdGlvbiBPYmplY3QgRmlsZSBGb3JtYXRzCi0KLUBjaW5kZXggb2JqZWN0IGZpbGUgZm9ybWF0Ci1UaGUgQHNje2dudX0gYXNzZW1ibGVyIGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2Ugc2V2ZXJhbCBhbHRlcm5hdGl2ZQotb2JqZWN0IGZpbGUgZm9ybWF0cy4gIEZvciB0aGUgbW9zdCBwYXJ0LCB0aGlzIGRvZXMgbm90IGFmZmVjdCBob3cgeW91Ci13cml0ZSBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtczsgYnV0IGRpcmVjdGl2ZXMgZm9yIGRlYnVnZ2luZyBzeW1ib2xzCi1hcmUgdHlwaWNhbGx5IGRpZmZlcmVudCBpbiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzLiAgQHhyZWZ7U3ltYm9sCi1BdHRyaWJ1dGVzLCxTeW1ib2wgQXR0cmlidXRlc30uCi1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBNVUxUSS1PQkoKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCB0byBwcm9kdWNlCi1AdmFsdWV7T0JKLU5BTUV9IGZvcm1hdCBvYmplY3QgZmlsZXMuCi1AZW5kIGlmY2xlYXIKLUBjIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGV4aGF1c3QgYWxsIGNvbmZpZ3MgdGhhdCBzZXQgTVVMVEktT0JKLCBpZGVhbGx5Ci1AaWZzZXQgQTI5SwotT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGVpdGhlcgotQGNvZGV7YS5vdXR9IG9yIENPRkYgZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2UgZWl0aGVyCi1AY29kZXtiLm91dH0gb3IgQ09GRiBmb3JtYXQgb2JqZWN0IGZpbGVzLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBlaXRoZXIKLVNPTSBvciBFTEYgZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBDb21tYW5kIExpbmUKLUBzZWN0aW9uIENvbW1hbmQgTGluZQotCi1AY2luZGV4IGNvbW1hbmQgbGluZSBjb252ZW50aW9ucwotQWZ0ZXIgdGhlIHByb2dyYW0gbmFtZSBAY29kZXtAdmFsdWV7QVN9fSwgdGhlIGNvbW1hbmQgbGluZSBtYXkgY29udGFpbgotb3B0aW9ucyBhbmQgZmlsZSBuYW1lcy4gIE9wdGlvbnMgbWF5IGFwcGVhciBpbiBhbnkgb3JkZXIsIGFuZCBtYXkgYmUKLWJlZm9yZSwgYWZ0ZXIsIG9yIGJldHdlZW4gZmlsZSBuYW1lcy4gIFRoZSBvcmRlciBvZiBmaWxlIG5hbWVzIGlzCi1zaWduaWZpY2FudC4KLQotQGNpbmRleCBzdGFuZGFyZCBpbnB1dCwgYXMgaW5wdXQgZmlsZQotQGtpbmRleCAtLQotQGZpbGV7LS19ICh0d28gaHlwaGVucykgYnkgaXRzZWxmIG5hbWVzIHRoZSBzdGFuZGFyZCBpbnB1dCBmaWxlCi1leHBsaWNpdGx5LCBhcyBvbmUgb2YgdGhlIGZpbGVzIGZvciBAY29kZXtAdmFsdWV7QVN9fSB0byBhc3NlbWJsZS4KLQotQGNpbmRleCBvcHRpb25zLCBjb21tYW5kIGxpbmUKLUV4Y2VwdCBmb3IgQHNhbXB7LS19IGFueSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdGhhdCBiZWdpbnMgd2l0aCBhCi1oeXBoZW4gKEBzYW1wey19KSBpcyBhbiBvcHRpb24uICBFYWNoIG9wdGlvbiBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgotQGNvZGV7QHZhbHVle0FTfX0uICBObyBvcHRpb24gY2hhbmdlcyB0aGUgd2F5IGFub3RoZXIgb3B0aW9uIHdvcmtzLiAgQW4KLW9wdGlvbiBpcyBhIEBzYW1wey19IGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGxldHRlcnM7IHRoZSBjYXNlIG9mCi10aGUgbGV0dGVyIGlzIGltcG9ydGFudC4gICBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwuCi0KLVNvbWUgb3B0aW9ucyBleHBlY3QgZXhhY3RseSBvbmUgZmlsZSBuYW1lIHRvIGZvbGxvdyB0aGVtLiAgVGhlIGZpbGUKLW5hbWUgbWF5IGVpdGhlciBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG9wdGlvbidzIGxldHRlciAoY29tcGF0aWJsZQotd2l0aCBvbGRlciBhc3NlbWJsZXJzKSBvciBpdCBtYXkgYmUgdGhlIG5leHQgY29tbWFuZCBhcmd1bWVudCAoQHNje2dudX0KLXN0YW5kYXJkKS4gIFRoZXNlIHR3byBjb21tYW5kIGxpbmVzIGFyZSBlcXVpdmFsZW50OgotCi1Ac21hbGxleGFtcGxlCi1AdmFsdWV7QVN9IC1vIG15LW9iamVjdC1maWxlLm8gbXVtYmxlLnMKLUB2YWx1ZXtBU30gLW9teS1vYmplY3QtZmlsZS5vIG11bWJsZS5zCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBJbnB1dCBGaWxlcwotQHNlY3Rpb24gSW5wdXQgRmlsZXMKLQotQGNpbmRleCBpbnB1dAotQGNpbmRleCBzb3VyY2UgcHJvZ3JhbQotQGNpbmRleCBmaWxlcywgaW5wdXQKLVdlIHVzZSB0aGUgcGhyYXNlIEBkZm57c291cmNlIHByb2dyYW19LCBhYmJyZXZpYXRlZCBAZGZue3NvdXJjZX0sIHRvCi1kZXNjcmliZSB0aGUgcHJvZ3JhbSBpbnB1dCB0byBvbmUgcnVuIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhlIHByb2dyYW0gbWF5Ci1iZSBpbiBvbmUgb3IgbW9yZSBmaWxlczsgaG93IHRoZSBzb3VyY2UgaXMgcGFydGl0aW9uZWQgaW50byBmaWxlcwotZG9lc24ndCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHNvdXJjZS4KLQotQGMgSSBhZGRlZCAiY29uIiBwcmVmaXggdG8gImNhdGVuYXRpb24iIGp1c3QgdG8gcHJvdmUgSSBjYW4gb3ZlcmNvbWUgbXkKLUBjIEFQTCB0cmFpbmluZy4uLiAgIGRvY0BjeWdudXMuY29tCi1UaGUgc291cmNlIHByb2dyYW0gaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0ZXh0IGluIGFsbCB0aGUgZmlsZXMsIGluIHRoZQotb3JkZXIgc3BlY2lmaWVkLgotCi1FYWNoIHRpbWUgeW91IHJ1biBAY29kZXtAdmFsdWV7QVN9fSBpdCBhc3NlbWJsZXMgZXhhY3RseSBvbmUgc291cmNlCi1wcm9ncmFtLiAgVGhlIHNvdXJjZSBwcm9ncmFtIGlzIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUgZmlsZXMuCi0oVGhlIHN0YW5kYXJkIGlucHV0IGlzIGFsc28gYSBmaWxlLikKLQotWW91IGdpdmUgQGNvZGV7QHZhbHVle0FTfX0gYSBjb21tYW5kIGxpbmUgdGhhdCBoYXMgemVybyBvciBtb3JlIGlucHV0IGZpbGUKLW5hbWVzLiAgVGhlIGlucHV0IGZpbGVzIGFyZSByZWFkIChmcm9tIGxlZnQgZmlsZSBuYW1lIHRvIHJpZ2h0KS4gIEEKLWNvbW1hbmQgbGluZSBhcmd1bWVudCAoaW4gYW55IHBvc2l0aW9uKSB0aGF0IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcKLWlzIHRha2VuIHRvIGJlIGFuIGlucHV0IGZpbGUgbmFtZS4KLQotSWYgeW91IGdpdmUgQGNvZGV7QHZhbHVle0FTfX0gbm8gZmlsZSBuYW1lcyBpdCBhdHRlbXB0cyB0byByZWFkIG9uZSBpbnB1dCBmaWxlCi1mcm9tIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdGFuZGFyZCBpbnB1dCwgd2hpY2ggaXMgbm9ybWFsbHkgeW91ciB0ZXJtaW5hbC4gIFlvdQotbWF5IGhhdmUgdG8gdHlwZSBAa2V5e2N0bC1EfSB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRoZXJlIGlzIG5vIG1vcmUgcHJvZ3JhbQotdG8gYXNzZW1ibGUuCi0KLVVzZSBAc2FtcHstLX0gaWYgeW91IG5lZWQgdG8gZXhwbGljaXRseSBuYW1lIHRoZSBzdGFuZGFyZCBpbnB1dCBmaWxlCi1pbiB5b3VyIGNvbW1hbmQgbGluZS4KLQotSWYgdGhlIHNvdXJjZSBpcyBlbXB0eSwgQGNvZGV7QHZhbHVle0FTfX0gcHJvZHVjZXMgYSBzbWFsbCwgZW1wdHkgb2JqZWN0Ci1maWxlLgotCi1Ac3ViaGVhZGluZyBGaWxlbmFtZXMgYW5kIExpbmUtbnVtYmVycwotCi1AY2luZGV4IGlucHV0IGZpbGUgbGluZW51bWJlcnMKLUBjaW5kZXggbGluZSBudW1iZXJzLCBpbiBpbnB1dCBmaWxlcwotVGhlcmUgYXJlIHR3byB3YXlzIG9mIGxvY2F0aW5nIGEgbGluZSBpbiB0aGUgaW5wdXQgZmlsZSAob3IgZmlsZXMpIGFuZAotZWl0aGVyIG1heSBiZSB1c2VkIGluIHJlcG9ydGluZyBlcnJvciBtZXNzYWdlcy4gIE9uZSB3YXkgcmVmZXJzIHRvIGEgbGluZQotbnVtYmVyIGluIGEgcGh5c2ljYWwgZmlsZTsgdGhlIG90aGVyIHJlZmVycyB0byBhIGxpbmUgbnVtYmVyIGluIGEKLWBgbG9naWNhbCcnIGZpbGUuICBAeHJlZntFcnJvcnMsICxFcnJvciBhbmQgV2FybmluZyBNZXNzYWdlc30uCi0KLUBkZm57UGh5c2ljYWwgZmlsZXN9IGFyZSB0aG9zZSBmaWxlcyBuYW1lZCBpbiB0aGUgY29tbWFuZCBsaW5lIGdpdmVuCi10byBAY29kZXtAdmFsdWV7QVN9fS4KLQotQGRmbntMb2dpY2FsIGZpbGVzfSBhcmUgc2ltcGx5IG5hbWVzIGRlY2xhcmVkIGV4cGxpY2l0bHkgYnkgYXNzZW1ibGVyCi1kaXJlY3RpdmVzOyB0aGV5IGJlYXIgbm8gcmVsYXRpb24gdG8gcGh5c2ljYWwgZmlsZXMuICBMb2dpY2FsIGZpbGUgbmFtZXMgaGVscAotZXJyb3IgbWVzc2FnZXMgcmVmbGVjdCB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gc291cmNlCi1pcyBpdHNlbGYgc3ludGhlc2l6ZWQgZnJvbSBvdGhlciBmaWxlcy4gIEBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZQotQHNhbXB7I30gZGlyZWN0aXZlcyBlbWl0dGVkIGJ5IHRoZSBAY29kZXtAdmFsdWV7R0NDfX0gcHJlcHJvY2Vzc29yLiAgU2VlIGFsc28KLUByZWZ7RmlsZSwsQGNvZGV7LmZpbGV9fS4KLQotQG5vZGUgT2JqZWN0Ci1Ac2VjdGlvbiBPdXRwdXQgKE9iamVjdCkgRmlsZQotCi1AY2luZGV4IG9iamVjdCBmaWxlCi1AY2luZGV4IG91dHB1dCBmaWxlCi1Aa2luZGV4IGEub3V0Ci1Aa2luZGV4IC5vCi1FdmVyeSB0aW1lIHlvdSBydW4gQGNvZGV7QHZhbHVle0FTfX0gaXQgcHJvZHVjZXMgYW4gb3V0cHV0IGZpbGUsIHdoaWNoIGlzCi15b3VyIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW0gdHJhbnNsYXRlZCBpbnRvIG51bWJlcnMuICBUaGlzIGZpbGUKLWlzIHRoZSBvYmplY3QgZmlsZS4gIEl0cyBkZWZhdWx0IG5hbWUgaXMKLUBpZmNsZWFyIEJPVVQKLUBjb2Rle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEJPVVQKLUBpZnNldCBHRU5FUklDCi1AY29kZXthLm91dH0sIG9yIAotQGVuZCBpZnNldAotQGNvZGV7Yi5vdXR9IHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgdGhlIEludGVsIDgwOTYwLgotQGVuZCBpZnNldAotWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSBieSB1c2luZyB0aGUgQGNvZGV7LW99IG9wdGlvbi4gIENvbnZlbnRpb25hbGx5LAotb2JqZWN0IGZpbGUgbmFtZXMgZW5kIHdpdGggQGZpbGV7Lm99LiAgVGhlIGRlZmF1bHQgbmFtZSBpcyB1c2VkIGZvciBoaXN0b3JpY2FsCi1yZWFzb25zOiBvbGRlciBhc3NlbWJsZXJzIHdlcmUgY2FwYWJsZSBvZiBhc3NlbWJsaW5nIHNlbGYtY29udGFpbmVkIHByb2dyYW1zCi1kaXJlY3RseSBpbnRvIGEgcnVubmFibGUgcHJvZ3JhbS4gIChGb3Igc29tZSBmb3JtYXRzLCB0aGlzIGlzbid0IGN1cnJlbnRseQotcG9zc2libGUsIGJ1dCBpdCBjYW4gYmUgZG9uZSBmb3IgdGhlIEBjb2Rle2Eub3V0fSBmb3JtYXQuKQotCi1AY2luZGV4IGxpbmtlcgotQGtpbmRleCBsZAotVGhlIG9iamVjdCBmaWxlIGlzIG1lYW50IGZvciBpbnB1dCB0byB0aGUgbGlua2VyIEBjb2Rle0B2YWx1ZXtMRH19LiAgSXQgY29udGFpbnMKLWFzc2VtYmxlZCBwcm9ncmFtIGNvZGUsIGluZm9ybWF0aW9uIHRvIGhlbHAgQGNvZGV7QHZhbHVle0xEfX0gaW50ZWdyYXRlCi10aGUgYXNzZW1ibGVkIHByb2dyYW0gaW50byBhIHJ1bm5hYmxlIGZpbGUsIGFuZCAob3B0aW9uYWxseSkgc3ltYm9saWMKLWluZm9ybWF0aW9uIGZvciB0aGUgZGVidWdnZXIuCi0KLUBjIGxpbmsgYWJvdmUgdG8gc29tZSBpbmZvIGZpbGUocykgbGlrZSB0aGUgZGVzY3JpcHRpb24gb2YgYS5vdXQuCi1AYyBkb24ndCBmb3JnZXQgdG8gZGVzY3JpYmUgQHNje2dudX0gaW5mbyBhcyB3ZWxsIGFzIFVuaXggbG9zc2FnZS4KLQotQG5vZGUgRXJyb3JzCi1Ac2VjdGlvbiBFcnJvciBhbmQgV2FybmluZyBNZXNzYWdlcwotCi1AY2luZGV4IGVycm9yIG1lc3NzYWdlcwotQGNpbmRleCB3YXJuaW5nIG1lc3NhZ2VzCi1AY2luZGV4IG1lc3NhZ2VzIGZyb20gYXNzZW1ibGVyCi1AY29kZXtAdmFsdWV7QVN9fSBtYXkgd3JpdGUgd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBzdGFuZGFyZCBlcnJvcgotZmlsZSAodXN1YWxseSB5b3VyIHRlcm1pbmFsKS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiAgYSBjb21waWxlcgotcnVucyBAY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5LiAgV2FybmluZ3MgcmVwb3J0IGFuIGFzc3VtcHRpb24gbWFkZSBzbwotdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBjb3VsZCBrZWVwIGFzc2VtYmxpbmcgYSBmbGF3ZWQgcHJvZ3JhbTsgZXJyb3JzIHJlcG9ydCBhCi1ncmF2ZSBwcm9ibGVtIHRoYXQgc3RvcHMgdGhlIGFzc2VtYmx5LgotCi1AY2luZGV4IGZvcm1hdCBvZiB3YXJuaW5nIG1lc3NhZ2VzCi1XYXJuaW5nIG1lc3NhZ2VzIGhhdmUgdGhlIGZvcm1hdAotCi1Ac21hbGxleGFtcGxlCi1maWxlX25hbWU6QGJ7Tk5OfTpXYXJuaW5nIE1lc3NhZ2UgVGV4dAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1AY2luZGV4IGxpbmUgbnVtYmVycywgaW4gd2FybmluZ3MvZXJyb3JzCi0od2hlcmUgQGJ7Tk5OfSBpcyBhIGxpbmUgbnVtYmVyKS4gIElmIGEgbG9naWNhbCBmaWxlIG5hbWUgaGFzIGJlZW4gZ2l2ZW4KLShAcHhyZWZ7RmlsZSwsQGNvZGV7LmZpbGV9fSkgaXQgaXMgdXNlZCBmb3IgdGhlIGZpbGVuYW1lLCBvdGhlcndpc2UgdGhlIG5hbWUgb2YKLXRoZSBjdXJyZW50IGlucHV0IGZpbGUgaXMgdXNlZC4gIElmIGEgbG9naWNhbCBsaW5lIG51bWJlciB3YXMgZ2l2ZW4KLUBpZnNldCBHRU5FUklDCi0oQHB4cmVme0xpbmUsLEBjb2Rley5saW5lfX0pCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBBMjlLCi0oQHB4cmVme0xpbmUsLEBjb2Rley5saW5lfX0pCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBBMjlLCi0oQHB4cmVme0xuLCxAY29kZXsubG59fSkKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotdGhlbiBpdCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIHByaW50ZWQsCi1vdGhlcndpc2UgdGhlIGFjdHVhbCBsaW5lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGlzIHByaW50ZWQuICBUaGUKLW1lc3NhZ2UgdGV4dCBpcyBpbnRlbmRlZCB0byBiZSBzZWxmIGV4cGxhbmF0b3J5IChpbiB0aGUgZ3JhbmQgVW5peAotdHJhZGl0aW9uKS4KLQotQGNpbmRleCBmb3JtYXQgb2YgZXJyb3IgbWVzc2FnZXMKLUVycm9yIG1lc3NhZ2VzIGhhdmUgdGhlIGZvcm1hdAotQHNtYWxsZXhhbXBsZQotZmlsZV9uYW1lOkBie05OTn06RkFUQUw6RXJyb3IgTWVzc2FnZSBUZXh0Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlIGRlcml2ZWQgYXMgZm9yIHdhcm5pbmcKLW1lc3NhZ2VzLiAgVGhlIGFjdHVhbCBtZXNzYWdlIHRleHQgbWF5IGJlIHJhdGhlciBsZXNzIGV4cGxhbmF0b3J5Ci1iZWNhdXNlIG1hbnkgb2YgdGhlbSBhcmVuJ3Qgc3VwcG9zZWQgdG8gaGFwcGVuLgotCi1Abm9kZSBJbnZva2luZwotQGNoYXB0ZXIgQ29tbWFuZC1MaW5lIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zLCBhbGwgdmVyc2lvbnMgb2YgYXNzZW1ibGVyCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGNvbW1hbmQtbGluZSBvcHRpb25zIGF2YWlsYWJsZSBpbiBAZW1waHthbGx9Ci12ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyOyBAcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LCBmb3Igb3B0aW9ucyBzcGVjaWZpYwotQGlmY2xlYXIgR0VORVJJQwotdG8gdGhlIEB2YWx1ZXtUQVJHRVR9LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotdG8gcGFydGljdWxhciBtYWNoaW5lIGFyY2hpdGVjdHVyZXMuCi1AZW5kIGlmc2V0Ci0KLUlmIHlvdSBhcmUgaW52b2tpbmcgQGNvZGV7QHZhbHVle0FTfX0gdmlhIHRoZSBAc2N7Z251fSBDIGNvbXBpbGVyICh2ZXJzaW9uIDIpLAoteW91IGNhbiB1c2UgdGhlIEBzYW1wey1XYX0gb3B0aW9uIHRvIHBhc3MgYXJndW1lbnRzIHRocm91Z2ggdG8gdGhlIGFzc2VtYmxlci4KLVRoZSBhc3NlbWJsZXIgYXJndW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAoYW5kIHRoZSBAc2FtcHstV2F9KQotYnkgY29tbWFzLiAgRm9yIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLWdjYyAtYyAtZyAtTyAtV2EsLWFsaCwtTCBmaWxlLmMKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBwYXNzZXMgdHdvIG9wdGlvbnMgdG8gdGhlIGFzc2VtYmxlcjogQHNhbXB7LWFsaH0gKGVtaXQgYSBsaXN0aW5nIHRvCi1zdGFuZGFyZCBvdXRwdXQgd2l0aCB3aXRoIGhpZ2gtbGV2ZWwgYW5kIGFzc2VtYmx5IHNvdXJjZSkgYW5kIEBzYW1wey1MfSAocmV0YWluCi1sb2NhbCBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUpLgotCi1Vc3VhbGx5IHlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBAc2FtcHstV2F9IG1lY2hhbmlzbSwgc2luY2UgbWFueSBjb21waWxlcgotY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgcGFzc2VkIHRvIHRoZSBhc3NlbWJsZXIgYnkgdGhlIGNvbXBpbGVyLgotKFlvdSBjYW4gY2FsbCB0aGUgQHNje2dudX0gY29tcGlsZXIgZHJpdmVyIHdpdGggdGhlIEBzYW1wey12fSBvcHRpb24gdG8gc2VlCi1wcmVjaXNlbHkgd2hhdCBvcHRpb25zIGl0IHBhc3NlcyB0byBlYWNoIGNvbXBpbGF0aW9uIHBhc3MsIGluY2x1ZGluZyB0aGUKLWFzc2VtYmxlci4pCi0KLUBtZW51Ci0qIGE6OiAgICAgICAgICAgICAtYVtjZGhsbnNdIGVuYWJsZSBsaXN0aW5ncwotKiBEOjogICAgICAgICAgICAgLUQgZm9yIGNvbXBhdGliaWxpdHkKLSogZjo6ICAgICAgICAgICAgIC1mIHRvIHdvcmsgZmFzdGVyCi0qIEk6OiAgICAgICAgICAgICAtSSBmb3IgLmluY2x1ZGUgc2VhcmNoIHBhdGgKLUBpZmNsZWFyIERJRkYtVEJMLUtMVUdFCi0qIEs6OiAgICAgICAgICAgICAtSyBmb3IgY29tcGF0aWJpbGl0eQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgRElGRi1UQkwtS0xVR0UKLSogSzo6ICAgICAgICAgICAgIC1LIGZvciBkaWZmZXJlbmNlIHRhYmxlcwotQGVuZCBpZnNldAotCi0qIEw6OiAgICAgICAgICAgICAtTCB0byByZXRhaW4gbG9jYWwgbGFiZWxzCi0qIE06OgkJICAtTSBvciAtLW1yaSB0byBhc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlCi0qIE1EOjogICAgICAgICAgICAtLU1EIGZvciBkZXBlbmRlbmN5IHRyYWNraW5nCi0qIG86OiAgICAgICAgICAgICAtbyB0byBuYW1lIHRoZSBvYmplY3QgZmlsZQotKiBSOjogICAgICAgICAgICAgLVIgdG8gam9pbiBkYXRhIGFuZCB0ZXh0IHNlY3Rpb25zCi0qIHN0YXRpc3RpY3M6OiAgICAtLXN0YXRpc3RpY3MgdG8gc2VlIHN0YXRpc3RpY3MgYWJvdXQgYXNzZW1ibHkKLSogdHJhZGl0aW9uYWwtZm9ybWF0OjogLS10cmFkaXRpb25hbC1mb3JtYXQgZm9yIGNvbXBhdGlibGUgb3V0cHV0Ci0qIHY6OiAgICAgICAgICAgICAtdiB0byBhbm5vdW5jZSB2ZXJzaW9uCi0qIFc6OiAgICAgICAgICAgICAtVyB0byBzdXBwcmVzcyB3YXJuaW5ncwotKiBaOjogICAgICAgICAgICAgLVogdG8gbWFrZSBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9ycwotQGVuZCBtZW51Ci0KLUBub2RlIGEKLUBzZWN0aW9uIEVuYWJsZSBMaXN0aW5nczogQGNvZGV7LWFbY2RobG5zXX0KLQotQGtpbmRleCAtYQotQGtpbmRleCAtYWMKLUBraW5kZXggLWFkCi1Aa2luZGV4IC1haAotQGtpbmRleCAtYWwKLUBraW5kZXggLWFuCi1Aa2luZGV4IC1hcwotQGNpbmRleCBsaXN0aW5ncywgZW5hYmxpbmcKLUBjaW5kZXggYXNzZW1ibHkgbGlzdGluZ3MsIGVuYWJsaW5nCi0KLVRoZXNlIG9wdGlvbnMgZW5hYmxlIGxpc3Rpbmcgb3V0cHV0IGZyb20gdGhlIGFzc2VtYmxlci4gIEJ5IGl0c2VsZiwKLUBzYW1wey1hfSByZXF1ZXN0cyBoaWdoLWxldmVsLCBhc3NlbWJseSwgYW5kIHN5bWJvbHMgbGlzdGluZy4KLVlvdSBjYW4gdXNlIG90aGVyIGxldHRlcnMgdG8gc2VsZWN0IHNwZWNpZmljIG9wdGlvbnMgZm9yIHRoZSBsaXN0OgotQHNhbXB7LWFofSByZXF1ZXN0cyBhIGhpZ2gtbGV2ZWwgbGFuZ3VhZ2UgbGlzdGluZywKLUBzYW1wey1hbH0gcmVxdWVzdHMgYW4gb3V0cHV0LXByb2dyYW0gYXNzZW1ibHkgbGlzdGluZywgYW5kCi1Ac2FtcHstYXN9IHJlcXVlc3RzIGEgc3ltYm9sIHRhYmxlIGxpc3RpbmcuCi1IaWdoLWxldmVsIGxpc3RpbmdzIHJlcXVpcmUgdGhhdCBhIGNvbXBpbGVyIGRlYnVnZ2luZyBvcHRpb24gbGlrZQotQHNhbXB7LWd9IGJlIHVzZWQsIGFuZCB0aGF0IGFzc2VtYmx5IGxpc3RpbmdzIChAc2FtcHstYWx9KSBiZSByZXF1ZXN0ZWQKLWFsc28uCi0KLVVzZSB0aGUgQHNhbXB7LWFjfSBvcHRpb24gdG8gb21pdCBmYWxzZSBjb25kaXRpb25hbHMgZnJvbSBhIGxpc3RpbmcuICBBbnkgbGluZXMKLXdoaWNoIGFyZSBub3QgYXNzZW1ibGVkIGJlY2F1c2Ugb2YgYSBmYWxzZSBAY29kZXsuaWZ9IChvciBAY29kZXsuaWZkZWZ9LCBvciBhbnkKLW90aGVyIGNvbmRpdGlvbmFsKSwgb3IgYSB0cnVlIEBjb2Rley5pZn0gZm9sbG93ZWQgYnkgYW4gQGNvZGV7LmVsc2V9LCB3aWxsIGJlCi1vbWl0dGVkIGZyb20gdGhlIGxpc3RpbmcuCi0KLVVzZSB0aGUgQHNhbXB7LWFkfSBvcHRpb24gdG8gb21pdCBkZWJ1Z2dpbmcgZGlyZWN0aXZlcyBmcm9tIHRoZQotbGlzdGluZy4KLQotT25jZSB5b3UgaGF2ZSBzcGVjaWZpZWQgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gZnVydGhlciBjb250cm9sCi1saXN0aW5nIG91dHB1dCBhbmQgaXRzIGFwcGVhcmFuY2UgdXNpbmcgdGhlIGRpcmVjdGl2ZXMgQGNvZGV7Lmxpc3R9LAotQGNvZGV7Lm5vbGlzdH0sIEBjb2Rley5wc2l6ZX0sIEBjb2Rley5lamVjdH0sIEBjb2Rley50aXRsZX0sIGFuZAotQGNvZGV7LnNidHRsfS4KLVRoZSBAc2FtcHstYW59IG9wdGlvbiB0dXJucyBvZmYgYWxsIGZvcm1zIHByb2Nlc3NpbmcuCi1JZiB5b3UgZG8gbm90IHJlcXVlc3QgbGlzdGluZyBvdXRwdXQgd2l0aCBvbmUgb2YgdGhlIEBzYW1wey1hfSBvcHRpb25zLCB0aGUKLWxpc3RpbmctY29udHJvbCBkaXJlY3RpdmVzIGhhdmUgbm8gZWZmZWN0LgotCi1UaGUgbGV0dGVycyBhZnRlciBAc2FtcHstYX0gbWF5IGJlIGNvbWJpbmVkIGludG8gb25lIG9wdGlvbiwKLUBlbXBoe2UuZy59LCBAc2FtcHstYWxufS4KLQotQG5vZGUgRAotQHNlY3Rpb24gQGNvZGV7LUR9Ci0KLUBraW5kZXggLUQKLVRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hhdHNvZXZlciwgYnV0IGl0IGlzIGFjY2VwdGVkIHRvIG1ha2UgaXQgbW9yZQotbGlrZWx5IHRoYXQgc2NyaXB0cyB3cml0dGVuIGZvciBvdGhlciBhc3NlbWJsZXJzIGFsc28gd29yayB3aXRoCi1AY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgZgotQHNlY3Rpb24gV29yayBGYXN0ZXI6IEBjb2Rley1mfQotCi1Aa2luZGV4IC1mCi1AY2luZGV4IHRydXN0ZWQgY29tcGlsZXIKLUBjaW5kZXggZmFzdGVyIHByb2Nlc3NpbmcgKEBjb2Rley1mfSkKLUBzYW1wey1mfSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gYXNzZW1ibGluZyBwcm9ncmFtcyB3cml0dGVuIGJ5IGEKLSh0cnVzdGVkKSBjb21waWxlci4gIEBzYW1wey1mfSBzdG9wcyB0aGUgYXNzZW1ibGVyIGZyb20gZG9pbmcgd2hpdGVzcGFjZQotYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZyBvbgotdGhlIGlucHV0IGZpbGUocykgYmVmb3JlIGFzc2VtYmxpbmcgdGhlbS4gIEB4cmVme1ByZXByb2Nlc3NpbmcsCi0sUHJlcHJvY2Vzc2luZ30uCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBpZiB5b3UgdXNlIEBzYW1wey1mfSB3aGVuIHRoZSBmaWxlcyBhY3R1YWxseSBuZWVkIHRvIGJlCi1wcmVwcm9jZXNzZWQgKGlmIHRoZXkgY29udGFpbiBjb21tZW50cywgZm9yIGV4YW1wbGUpLCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzCi1ub3Qgd29yayBjb3JyZWN0bHkuCi1AZW5kIHF1b3RhdGlvbgotCi1Abm9kZSBJCi1Ac2VjdGlvbiBAY29kZXsuaW5jbHVkZX0gc2VhcmNoIHBhdGg6IEBjb2Rley1JfSBAdmFye3BhdGh9Ci0KLUBraW5kZXggLUkgQHZhcntwYXRofQotQGNpbmRleCBwYXRocyBmb3IgQGNvZGV7LmluY2x1ZGV9Ci1AY2luZGV4IHNlYXJjaCBwYXRoIGZvciBAY29kZXsuaW5jbHVkZX0KLUBjaW5kZXggQGNvZGV7aW5jbHVkZX0gZGlyZWN0aXZlIHNlYXJjaCBwYXRoCi1Vc2UgdGhpcyBvcHRpb24gdG8gYWRkIGEgQHZhcntwYXRofSB0byB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcwotQGNvZGV7QHZhbHVle0FTfX0gc2VhcmNoZXMgZm9yIGZpbGVzIHNwZWNpZmllZCBpbiBAY29kZXsuaW5jbHVkZX0KLWRpcmVjdGl2ZXMgKEBweHJlZntJbmNsdWRlLCxAY29kZXsuaW5jbHVkZX19KS4gIFlvdSBtYXkgdXNlIEBjb2Rley1JfSBhcwotbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkgdG8gaW5jbHVkZSBhIHZhcmlldHkgb2YgcGF0aHMuICBUaGUgY3VycmVudAotd29ya2luZyBkaXJlY3RvcnkgaXMgYWx3YXlzIHNlYXJjaGVkIGZpcnN0OyBhZnRlciB0aGF0LCBAY29kZXtAdmFsdWV7QVN9fQotc2VhcmNoZXMgYW55IEBzYW1wey1JfSBkaXJlY3RvcmllcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IHdlcmUKLXNwZWNpZmllZCAobGVmdCB0byByaWdodCkgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotQG5vZGUgSwotQHNlY3Rpb24gRGlmZmVyZW5jZSBUYWJsZXM6IEBjb2Rley1LfQotCi1Aa2luZGV4IC1LCi1AaWZjbGVhciBESUZGLVRCTC1LTFVHRQotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgdGhpcyBvcHRpb24gaXMgYWxsb3dlZCwgYnV0IGhhcyBubyBlZmZlY3QuICBJdCBpcwotcGVybWl0dGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBvbiBvdGhlciBwbGF0Zm9ybXMsCi13aGVyZSBpdCBjYW4gYmUgdXNlZCB0byB3YXJuIHdoZW4gdGhlIGFzc2VtYmxlciBhbHRlcnMgdGhlIG1hY2hpbmUgY29kZQotZ2VuZXJhdGVkIGZvciBAc2FtcHsud29yZH0gZGlyZWN0aXZlcyBpbiBkaWZmZXJlbmNlIHRhYmxlcy4gIFRoZSBAdmFsdWV7VEFSR0VUfQotZmFtaWx5IGRvZXMgbm90IGhhdmUgdGhlIGFkZHJlc3NpbmcgbGltaXRhdGlvbnMgdGhhdCBzb21ldGltZXMgbGVhZCB0byB0aGlzCi1hbHRlcmF0aW9uIG9uIG90aGVyIHBsYXRmb3Jtcy4KLUBlbmQgaWZjbGVhcgotCi1AaWZzZXQgRElGRi1UQkwtS0xVR0UKLUBjaW5kZXggZGlmZmVyZW5jZSB0YWJsZXMsIHdhcm5pbmcKLUBjaW5kZXggd2FybmluZyBmb3IgYWx0ZXJlZCBkaWZmZXJlbmNlIHRhYmxlcwotQGNvZGV7QHZhbHVle0FTfX0gc29tZXRpbWVzIGFsdGVycyB0aGUgY29kZSBlbWl0dGVkIGZvciBkaXJlY3RpdmVzIG9mIHRoZSBmb3JtCi1Ac2FtcHsud29yZCBAdmFye3N5bTF9LUB2YXJ7c3ltMn19OyBAcHhyZWZ7V29yZCwsQGNvZGV7LndvcmR9fS4KLVlvdSBjYW4gdXNlIHRoZSBAc2FtcHstS30gb3B0aW9uIGlmIHlvdSB3YW50IGEgd2FybmluZyBpc3N1ZWQgd2hlbiB0aGlzCi1pcyBkb25lLgotQGVuZCBpZnNldAotCi1Abm9kZSBMCi1Ac2VjdGlvbiBJbmNsdWRlIExvY2FsIExhYmVsczogQGNvZGV7LUx9Ci0KLUBraW5kZXggLUwKLUBjaW5kZXggbG9jYWwgbGFiZWxzLCByZXRhaW5pbmcgaW4gb3V0cHV0Ci1MYWJlbHMgYmVnaW5uaW5nIHdpdGggQHNhbXB7TH0gKHVwcGVyIGNhc2Ugb25seSkgYXJlIGNhbGxlZCBAZGZue2xvY2FsCi1sYWJlbHN9LiBAeHJlZntTeW1ib2wgTmFtZXN9LiAgTm9ybWFsbHkgeW91IGRvIG5vdCBzZWUgc3VjaCBsYWJlbHMgd2hlbgotZGVidWdnaW5nLCBiZWNhdXNlIHRoZXkgYXJlIGludGVuZGVkIGZvciB0aGUgdXNlIG9mIHByb2dyYW1zIChsaWtlCi1jb21waWxlcnMpIHRoYXQgY29tcG9zZSBhc3NlbWJsZXIgcHJvZ3JhbXMsIG5vdCBmb3IgeW91ciBub3RpY2UuCi1Ob3JtYWxseSBib3RoIEBjb2Rle0B2YWx1ZXtBU319IGFuZCBAY29kZXtAdmFsdWV7TER9fSBkaXNjYXJkIHN1Y2ggbGFiZWxzLCBzbyB5b3UgZG8gbm90Ci1ub3JtYWxseSBkZWJ1ZyB3aXRoIHRoZW0uCi0KLVRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHJldGFpbiB0aG9zZSBAc2FtcHtMQGRvdHN7fX0gc3ltYm9scwotaW4gdGhlIG9iamVjdCBmaWxlLiAgVXN1YWxseSBpZiB5b3UgZG8gdGhpcyB5b3UgYWxzbyB0ZWxsIHRoZSBsaW5rZXIKLUBjb2Rle0B2YWx1ZXtMRH19IHRvIHByZXNlcnZlIHN5bWJvbHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBAc2FtcHtMfS4KLQotQnkgZGVmYXVsdCwgYSBsb2NhbCBsYWJlbCBpcyBhbnkgbGFiZWwgYmVnaW5uaW5nIHdpdGggQHNhbXB7TH0sIGJ1dCBlYWNoCi10YXJnZXQgaXMgYWxsb3dlZCB0byByZWRlZmluZSB0aGUgbG9jYWwgbGFiZWwgcHJlZml4LgotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBIGxvY2FsIGxhYmVscyBiZWdpbiB3aXRoIEBzYW1we0wkfS4KLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0KLUBzYW1wezt9IGZvciB0aGUgQVJNIGZhbWlseTsKLUBlbmQgaWZzZXQKLQotQG5vZGUgTQotQHNlY3Rpb24gQXNzZW1ibGUgaW4gTVJJIENvbXBhdGliaWxpdHkgTW9kZTogQGNvZGV7LU19Ci0KLUBraW5kZXggLU0KLUBjaW5kZXggTVJJIGNvbXBhdGliaWxpdHkgbW9kZQotVGhlIEBjb2Rley1NfSBvciBAY29kZXstLW1yaX0gb3B0aW9uIHNlbGVjdHMgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4gIFRoaXMKLWNoYW5nZXMgdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wIGhhbmRsaW5nIG9mIEBjb2Rle0B2YWx1ZXtBU319IHRvIG1ha2UgaXQKLWNvbXBhdGlibGUgd2l0aCB0aGUgQGNvZGV7QVNNNjhLfSBvciB0aGUgQGNvZGV7QVNNOTYwfSAoZGVwZW5kaW5nIHVwb24gdGhlCi1jb25maWd1cmVkIHRhcmdldCkgYXNzZW1ibGVyIGZyb20gTWljcm90ZWMgUmVzZWFyY2guICBUaGUgZXhhY3QgbmF0dXJlIG9mIHRoZQotTVJJIHN5bnRheCB3aWxsIG5vdCBiZSBkb2N1bWVudGVkIGhlcmU7IHNlZSB0aGUgTVJJIG1hbnVhbHMgZm9yIG1vcmUKLWluZm9ybWF0aW9uLiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGhhbmRsaW5nIG9mIG1hY3JvcyBhbmQgbWFjcm8KLWFyZ3VtZW50cyBpcyBzb21ld2hhdCBkaWZmZXJlbnQuICBUaGUgcHVycG9zZSBvZiB0aGlzIG9wdGlvbiBpcyB0byBwZXJtaXQKLWFzc2VtYmxpbmcgZXhpc3RpbmcgTVJJIGFzc2VtYmxlciBjb2RlIHVzaW5nIEBjb2Rle0B2YWx1ZXtBU319LgotCi1UaGUgTVJJIGNvbXBhdGliaWxpdHkgaXMgbm90IGNvbXBsZXRlLiAgQ2VydGFpbiBvcGVyYXRpb25zIG9mIHRoZSBNUkkgYXNzZW1ibGVyCi1kZXBlbmQgdXBvbiBpdHMgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY2FuIG5vdCBiZSBzdXBwb3J0ZWQgdXNpbmcgb3RoZXIgb2JqZWN0Ci1maWxlIGZvcm1hdHMuICBTdXBwb3J0aW5nIHRoZXNlIHdvdWxkIHJlcXVpcmUgZW5oYW5jaW5nIGVhY2ggb2JqZWN0IGZpbGUgZm9ybWF0Ci1pbmRpdmlkdWFsbHkuICBUaGVzZSBhcmU6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIGdsb2JhbCBzeW1ib2xzIGluIGNvbW1vbiBzZWN0aW9uCi0KLVRoZSBtNjhrIE1SSSBhc3NlbWJsZXIgc3VwcG9ydHMgY29tbW9uIHNlY3Rpb25zIHdoaWNoIGFyZSBtZXJnZWQgYnkgdGhlIGxpbmtlci4KLU90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMgZG8gbm90IHN1cHBvcnQgdGhpcy4gIEBjb2Rle0B2YWx1ZXtBU319IGhhbmRsZXMKLWNvbW1vbiBzZWN0aW9ucyBieSB0cmVhdGluZyB0aGVtIGFzIGEgc2luZ2xlIGNvbW1vbiBzeW1ib2wuICBJdCBwZXJtaXRzIGxvY2FsCi1zeW1ib2xzIHRvIGJlIGRlZmluZWQgd2l0aGluIGEgY29tbW9uIHNlY3Rpb24sIGJ1dCBpdCBjYW4gbm90IHN1cHBvcnQgZ2xvYmFsCi1zeW1ib2xzLCBzaW5jZSBpdCBoYXMgbm8gd2F5IHRvIGRlc2NyaWJlIHRoZW0uCi0KLUBpdGVtIGNvbXBsZXggcmVsb2NhdGlvbnMKLQotVGhlIE1SSSBhc3NlbWJsZXJzIHN1cHBvcnQgcmVsb2NhdGlvbnMgYWdhaW5zdCBhIG5lZ2F0ZWQgc2VjdGlvbiBhZGRyZXNzLCBhbmQKLXJlbG9jYXRpb25zIHdoaWNoIGNvbWJpbmUgdGhlIHN0YXJ0IGFkZHJlc3NlcyBvZiB0d28gb3IgbW9yZSBzZWN0aW9ucy4gIFRoZXNlCi1hcmUgbm90IHN1cHBvcnQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQGl0ZW0gQGNvZGV7RU5EfSBwc2V1ZG8tb3Agc3BlY2lmeWluZyBzdGFydCBhZGRyZXNzCi0KLVRoZSBNUkkgQGNvZGV7RU5EfSBwc2V1ZG8tb3AgcGVybWl0cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHN0YXJ0IGFkZHJlc3MuCi1UaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoZSBzdGFydCBhZGRyZXNzIG1heQotaW5zdGVhZCBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIEBjb2Rley1lfSBvcHRpb24gdG8gdGhlIGxpbmtlciwgb3IgaW4gYSBsaW5rZXIKLXNjcmlwdC4KLQotQGl0ZW0gQGNvZGV7SUROVH0sIEBjb2Rley5pZGVudH0gYW5kIEBjb2Rle05BTUV9IHBzZXVkby1vcHMKLQotVGhlIE1SSSBAY29kZXtJRE5UfSwgQGNvZGV7LmlkZW50fSBhbmQgQGNvZGV7TkFNRX0gcHNldWRvLW9wcyBhc3NpZ24gYSBtb2R1bGUKLW5hbWUgdG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUBpdGVtIEBjb2Rle09SR30gcHNldWRvLW9wCi0KLVRoZSBtNjhrIE1SSSBAY29kZXtPUkd9IHBzZXVkby1vcCBiZWdpbnMgYW4gYWJzb2x1dGUgc2VjdGlvbiBhdCBhIGdpdmVuCi1hZGRyZXNzLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlIHVzdWFsIEBjb2Rle0B2YWx1ZXtBU319IEBjb2Rley5vcmd9IHBzZXVkby1vcCwKLXdoaWNoIGNoYW5nZXMgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgY3VycmVudCBzZWN0aW9uLiAgQWJzb2x1dGUgc2VjdGlvbnMgYXJlCi1ub3Qgc3VwcG9ydGVkIGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuICBUaGUgYWRkcmVzcyBvZiBhIHNlY3Rpb24gbWF5IGJlCi1hc3NpZ25lZCB3aXRoaW4gYSBsaW5rZXIgc2NyaXB0LgotQGVuZCBpdGVtaXplCi0KLVRoZXJlIGFyZSBzb21lIG90aGVyIGZlYXR1cmVzIG9mIHRoZSBNUkkgYXNzZW1ibGVyIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fSwgdHlwaWNhbGx5IGVpdGhlciBiZWNhdXNlIHRoZXkgYXJlIGRpZmZpY3VsdCBvciBiZWNhdXNlIHRoZXkKLXNlZW0gb2YgbGl0dGxlIGNvbnNlcXVlbmNlLiAgU29tZSBvZiB0aGVzZSBtYXkgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSByZWxlYXNlcy4KLQotQGl0ZW1pemUgQGJ1bGxldAotCi1AaXRlbSBFQkNESUMgc3RyaW5ncwotCi1FQkNESUMgc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gcGFja2VkIGJpbmFyeSBjb2RlZCBkZWNpbWFsCi0KLVBhY2tlZCBiaW5hcnkgY29kZWQgZGVjaW1hbCBpcyBub3Qgc3VwcG9ydGVkLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBAY29kZXtEQy5QfQotYW5kIEBjb2Rle0RDQi5QfSBwc2V1ZG8tb3BzIGFyZSBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXtGRVFVfSBwc2V1ZG8tb3AKLQotVGhlIG02OGsgQGNvZGV7RkVRVX0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rle05PT0JKfSBwc2V1ZG8tb3AKLQotVGhlIG02OGsgQGNvZGV7Tk9PQkp9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXtPUFR9IGJyYW5jaCBjb250cm9sIG9wdGlvbnMKLQotVGhlIG02OGsgQGNvZGV7T1BUfSBicmFuY2ggY29udHJvbCBvcHRpb25zLS0tQGNvZGV7Qn0sIEBjb2Rle0JSU30sIEBjb2Rle0JSQn0sCi1AY29kZXtCUkx9LCBhbmQgQGNvZGV7QlJXfS0tLWFyZSBpZ25vcmVkLiAgQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseQotcmVsYXhlcyBhbGwgYnJhbmNoZXMsIHdoZXRoZXIgZm9yd2FyZCBvciBiYWNrd2FyZCwgdG8gYW4gYXBwcm9wcmlhdGUgc2l6ZSwgc28KLXRoZXNlIG9wdGlvbnMgc2VydmUgbm8gcHVycG9zZS4KLQotQGl0ZW0gQGNvZGV7T1BUfSBsaXN0IGNvbnRyb2wgb3B0aW9ucwotCi1UaGUgZm9sbG93aW5nIG02OGsgQGNvZGV7T1BUfSBsaXN0IGNvbnRyb2wgb3B0aW9ucyBhcmUgaWdub3JlZDogQGNvZGV7Q30sCi1AY29kZXtDRVh9LCBAY29kZXtDTH0sIEBjb2Rle0NSRX0sIEBjb2Rle0V9LCBAY29kZXtHfSwgQGNvZGV7SX0sIEBjb2Rle019LAotQGNvZGV7TUVYfSwgQGNvZGV7TUN9LCBAY29kZXtNRH0sIEBjb2Rle1h9LgotCi1AaXRlbSBvdGhlciBAY29kZXtPUFR9IG9wdGlvbnMKLQotVGhlIGZvbGxvd2luZyBtNjhrIEBjb2Rle09QVH0gb3B0aW9ucyBhcmUgaWdub3JlZDogQGNvZGV7TkVTVH0sIEBjb2Rle099LAotQGNvZGV7T0xEfSwgQGNvZGV7T1B9LCBAY29kZXtQfSwgQGNvZGV7UENPfSwgQGNvZGV7UENSfSwgQGNvZGV7UENTfSwgQGNvZGV7Un0uCi0KLUBpdGVtIEBjb2Rle09QVH0gQGNvZGV7RH0gb3B0aW9uIGlzIGRlZmF1bHQKLQotVGhlIG02OGsgQGNvZGV7T1BUfSBAY29kZXtEfSBvcHRpb24gaXMgdGhlIGRlZmF1bHQsIHVubGlrZSB0aGUgTVJJIGFzc2VtYmxlci4KLUBjb2Rle09QVCBOT0R9IG1heSBiZSB1c2VkIHRvIHR1cm4gaXQgb2ZmLgotCi1AaXRlbSBAY29kZXtYUkVGfSBwc2V1ZG8tb3AuCi0KLVRoZSBtNjhrIEBjb2Rle1hSRUZ9IHBzZXVkby1vcCBpcyBpZ25vcmVkLgotCi1AaXRlbSBAY29kZXsuZGVidWd9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuZGVidWd9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsuZXh0ZW5kZWR9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuZXh0ZW5kZWR9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsubGlzdH0gcHNldWRvLW9wLgotCi1UaGUgdmFyaW91cyBvcHRpb25zIG9mIHRoZSBpOTYwIEBjb2Rley5saXN0fSBwc2V1ZG8tb3AgYXJlIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5vcHRpbWl6ZX0gcHNldWRvLW9wCi0KLVRoZSBpOTYwIEBjb2Rley5vcHRpbWl6ZX0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5vdXRwdXR9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsub3V0cHV0fSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7LnNldHJlYWx9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuc2V0cmVhbH0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBNRAotQHNlY3Rpb24gRGVwZW5kZW5jeSB0cmFja2luZzogQGNvZGV7LS1NRH0KLQotQGtpbmRleCAtLU1ECi1AY2luZGV4IGRlcGVuZGVuY3kgdHJhY2tpbmcKLUBjaW5kZXggbWFrZSBydWxlcwotCi1AY29kZXtAdmFsdWV7QVN9fSBjYW4gZ2VuZXJhdGUgYSBkZXBlbmRlbmN5IGZpbGUgZm9yIHRoZSBmaWxlIGl0IGNyZWF0ZXMuICBUaGlzCi1maWxlIGNvbnNpc3RzIG9mIGEgc2luZ2xlIHJ1bGUgc3VpdGFibGUgZm9yIEBjb2Rle21ha2V9IGRlc2NyaWJpbmcgdGhlCi1kZXBlbmRlbmNpZXMgb2YgdGhlIG1haW4gc291cmNlIGZpbGUuCi0KLVRoZSBydWxlIGlzIHdyaXR0ZW4gdG8gdGhlIGZpbGUgbmFtZWQgaW4gaXRzIGFyZ3VtZW50LgotCi1UaGlzIGZlYXR1cmUgaXMgdXNlZCBpbiB0aGUgYXV0b21hdGljIHVwZGF0aW5nIG9mIG1ha2VmaWxlcy4KLQotQG5vZGUgbwotQHNlY3Rpb24gTmFtZSB0aGUgT2JqZWN0IEZpbGU6IEBjb2Rley1vfQotCi1Aa2luZGV4IC1vCi1AY2luZGV4IG5hbWluZyBvYmplY3QgZmlsZQotQGNpbmRleCBvYmplY3QgZmlsZSBuYW1lCi1UaGVyZSBpcyBhbHdheXMgb25lIG9iamVjdCBmaWxlIG91dHB1dCB3aGVuIHlvdSBydW4gQGNvZGV7QHZhbHVle0FTfX0uICBCeQotZGVmYXVsdCBpdCBoYXMgdGhlIG5hbWUKLUBpZnNldCBHRU5FUklDCi1AaWZzZXQgSTk2MAotQGZpbGV7YS5vdXR9IChvciBAZmlsZXtiLm91dH0sIGZvciBJbnRlbCA5NjAgdGFyZ2V0cyBvbmx5KS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEk5NjAKLUBmaWxle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEk5NjAKLUBmaWxle2Iub3V0fS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEk5NjAKLUBmaWxle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGVuZCBpZmNsZWFyCi1Zb3UgdXNlIHRoaXMgb3B0aW9uICh3aGljaCB0YWtlcyBleGFjdGx5IG9uZSBmaWxlbmFtZSkgdG8gZ2l2ZSB0aGUKLW9iamVjdCBmaWxlIGEgZGlmZmVyZW50IG5hbWUuCi0KLVdoYXRldmVyIHRoZSBvYmplY3QgZmlsZSBpcyBjYWxsZWQsIEBjb2Rle0B2YWx1ZXtBU319IG92ZXJ3cml0ZXMgYW55Ci1leGlzdGluZyBmaWxlIG9mIHRoZSBzYW1lIG5hbWUuCi0KLUBub2RlIFIKLUBzZWN0aW9uIEpvaW4gRGF0YSBhbmQgVGV4dCBTZWN0aW9uczogQGNvZGV7LVJ9Ci0KLUBraW5kZXggLVIKLUBjaW5kZXggZGF0YSBhbmQgdGV4dCBzZWN0aW9ucywgam9pbmluZwotQGNpbmRleCB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLCBqb2luaW5nCi1AY2luZGV4IGpvaW5pbmcgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucwotQGNpbmRleCBtZXJnaW5nIHRleHQgYW5kIGRhdGEgc2VjdGlvbnMKLUBjb2Rley1SfSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byB3cml0ZSB0aGUgb2JqZWN0IGZpbGUgYXMgaWYgYWxsCi1kYXRhLXNlY3Rpb24gZGF0YSBsaXZlcyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBpcyBvbmx5IGRvbmUgYXQKLXRoZSB2ZXJ5IGxhc3QgbW9tZW50OiAgeW91ciBiaW5hcnkgZGF0YSBhcmUgdGhlIHNhbWUsIGJ1dCBkYXRhCi1zZWN0aW9uIHBhcnRzIGFyZSByZWxvY2F0ZWQgZGlmZmVyZW50bHkuICBUaGUgZGF0YSBzZWN0aW9uIHBhcnQgb2YKLXlvdXIgb2JqZWN0IGZpbGUgaXMgemVybyBieXRlcyBsb25nIGJlY2F1c2UgYWxsIGl0cyBieXRlcyBhcmUKLWFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNlY3Rpb24uICAoQHhyZWZ7U2VjdGlvbnMsLFNlY3Rpb25zIGFuZCBSZWxvY2F0aW9ufS4pCi0KLVdoZW4geW91IHNwZWNpZnkgQGNvZGV7LVJ9IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGdlbmVyYXRlIHNob3J0ZXIKLWFkZHJlc3MgZGlzcGxhY2VtZW50cyAoYmVjYXVzZSB3ZSBkbyBub3QgaGF2ZSB0byBjcm9zcyBiZXR3ZWVuIHRleHQgYW5kCi1kYXRhIHNlY3Rpb24pLiAgV2UgcmVmcmFpbiBmcm9tIGRvaW5nIHRoaXMgc2ltcGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLW9sZGVyIHZlcnNpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgSW4gZnV0dXJlLCBAY29kZXstUn0gbWF5IHdvcmsgdGhpcyB3YXkuCi0KLUBpZnNldCBDT0ZGCi1XaGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIENPRkYgb3V0cHV0LAotdGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IHVzZSBzZWN0aW9ucyBuYW1lZCBAc2FtcHsudGV4dH0gYW5kCi1Ac2FtcHsuZGF0YX0uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AY29kZXstUn0gaXMgbm90IHN1cHBvcnRlZCBmb3IgYW55IG9mIHRoZSBIUFBBIHRhcmdldHMuICBVc2luZwotQGNvZGV7LVJ9IGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSBAY29kZXtAdmFsdWV7QVN9fS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgc3RhdGlzdGljcwotQHNlY3Rpb24gRGlzcGxheSBBc3NlbWJseSBTdGF0aXN0aWNzOiBAY29kZXstLXN0YXRpc3RpY3N9Ci0KLUBraW5kZXggLS1zdGF0aXN0aWNzCi1AY2luZGV4IHN0YXRpc3RpY3MsIGFib3V0IGFzc2VtYmx5Ci1AY2luZGV4IHRpbWUsIHRvdGFsIGZvciBhc3NlbWJseQotQGNpbmRleCBzcGFjZSB1c2VkLCBtYXhpbXVtIGZvciBhc3NlbWJseQotVXNlIEBzYW1wey0tc3RhdGlzdGljc30gdG8gZGlzcGxheSB0d28gc3RhdGlzdGljcyBhYm91dCB0aGUgcmVzb3VyY2VzIHVzZWQgYnkKLUBjb2Rle0B2YWx1ZXtBU319OiB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3BhY2UgYWxsb2NhdGVkIGR1cmluZyB0aGUgYXNzZW1ibHkKLShpbiBieXRlcyksIGFuZCB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgdGFrZW4gZm9yIHRoZSBhc3NlbWJseSAoaW4gQHNje2NwdX0KLXNlY29uZHMpLgotCi1Abm9kZSB0cmFkaXRpb25hbC1mb3JtYXQKLUBzZWN0aW9uIENvbXBhdGlibGUgb3V0cHV0OiBAY29kZXstLXRyYWRpdGlvbmFsLWZvcm1hdH0KLQotQGtpbmRleCAtLXRyYWRpdGlvbmFsLWZvcm1hdAotRm9yIHNvbWUgdGFyZ2V0cywgdGhlIG91dHB1dCBvZiBAY29kZXtAdmFsdWV7QVN9fSBpcyBkaWZmZXJlbnQgaW4gc29tZSB3YXlzCi1mcm9tIHRoZSBvdXRwdXQgb2Ygc29tZSBleGlzdGluZyBhc3NlbWJsZXIuICBUaGlzIHN3aXRjaCByZXF1ZXN0cwotQGNvZGV7QHZhbHVle0FTfX0gdG8gdXNlIHRoZSB0cmFkaXRpb25hbCBmb3JtYXQgaW5zdGVhZC4KLQotRm9yIGV4YW1wbGUsIGl0IGRpc2FibGVzIHRoZSBleGNlcHRpb24gZnJhbWUgb3B0aW1pemF0aW9ucyB3aGljaAotQGNvZGV7QHZhbHVle0FTfX0gbm9ybWFsbHkgZG9lcyBieSBkZWZhdWx0IG9uIEBjb2Rle0B2YWx1ZXtHQ0N9fSBvdXRwdXQuCi0KLUBub2RlIHYKLUBzZWN0aW9uIEFubm91bmNlIFZlcnNpb246IEBjb2Rley12fQotCi1Aa2luZGV4IC12Ci1Aa2luZGV4IC12ZXJzaW9uCi1AY2luZGV4IGFzc2VtYmxlciB2ZXJzaW9uCi1AY2luZGV4IHZlcnNpb24gb2YgYXNzZW1ibGVyCi1Zb3UgY2FuIGZpbmQgb3V0IHdoYXQgdmVyc2lvbiBvZiBhcyBpcyBydW5uaW5nIGJ5IGluY2x1ZGluZyB0aGUKLW9wdGlvbiBAc2FtcHstdn0gKHdoaWNoIHlvdSBjYW4gYWxzbyBzcGVsbCBhcyBAc2FtcHstdmVyc2lvbn0pIG9uIHRoZQotY29tbWFuZCBsaW5lLgotCi1Abm9kZSBXCi1Ac2VjdGlvbiBTdXBwcmVzcyBXYXJuaW5nczogQGNvZGV7LVd9Ci0KLUBraW5kZXggLVcKLUBjaW5kZXggc3VwcHJlc3Npbmcgd2FybmluZ3MKLUBjaW5kZXggd2FybmluZ3MsIHN1cHByZXNzaW5nCi1AY29kZXtAdmFsdWV7QVN9fSBzaG91bGQgbmV2ZXIgZ2l2ZSBhIHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSB3aGVuCi1hc3NlbWJsaW5nIGNvbXBpbGVyIG91dHB1dC4gIEJ1dCBwcm9ncmFtcyB3cml0dGVuIGJ5IHBlb3BsZSBvZnRlbgotY2F1c2UgQGNvZGV7QHZhbHVle0FTfX0gdG8gZ2l2ZSBhIHdhcm5pbmcgdGhhdCBhIHBhcnRpY3VsYXIgYXNzdW1wdGlvbiB3YXMKLW1hZGUuICBBbGwgc3VjaCB3YXJuaW5ncyBhcmUgZGlyZWN0ZWQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIGZpbGUuCi1JZiB5b3UgdXNlIHRoaXMgb3B0aW9uLCBubyB3YXJuaW5ncyBhcmUgaXNzdWVkLiAgVGhpcyBvcHRpb24gb25seQotYWZmZWN0cyB0aGUgd2FybmluZyBtZXNzYWdlczogaXQgZG9lcyBub3QgY2hhbmdlIGFueSBwYXJ0aWN1bGFyIG9mIGhvdwotQGNvZGV7QHZhbHVle0FTfX0gYXNzZW1ibGVzIHlvdXIgZmlsZS4gIEVycm9ycywgd2hpY2ggc3RvcCB0aGUgYXNzZW1ibHksIGFyZQotc3RpbGwgcmVwb3J0ZWQuCi0KLUBub2RlIFoKLUBzZWN0aW9uIEdlbmVyYXRlIE9iamVjdCBGaWxlIGluIFNwaXRlIG9mIEVycm9yczogQGNvZGV7LVp9Ci1AY2luZGV4IG9iamVjdCBmaWxlLCBhZnRlciBlcnJvcnMKLUBjaW5kZXggZXJyb3JzLCBjb250aW51aW5nIGFmdGVyCi1BZnRlciBhbiBlcnJvciBtZXNzYWdlLCBAY29kZXtAdmFsdWV7QVN9fSBub3JtYWxseSBwcm9kdWNlcyBubyBvdXRwdXQuICBJZiBmb3IKLXNvbWUgcmVhc29uIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBvYmplY3QgZmlsZSBvdXRwdXQgZXZlbiBhZnRlcgotQGNvZGV7QHZhbHVle0FTfX0gZ2l2ZXMgYW4gZXJyb3IgbWVzc2FnZSBvbiB5b3VyIHByb2dyYW0sIHVzZSB0aGUgQHNhbXB7LVp9Ci1vcHRpb24uICBJZiB0aGVyZSBhcmUgYW55IGVycm9ycywgQGNvZGV7QHZhbHVle0FTfX0gY29udGludWVzIGFueXdheXMsIGFuZAotd3JpdGVzIGFuIG9iamVjdCBmaWxlIGFmdGVyIGEgZmluYWwgd2FybmluZyBtZXNzYWdlIG9mIHRoZSBmb3JtIEBzYW1we0B2YXJ7bn0KLWVycm9ycywgQHZhcnttfSB3YXJuaW5ncywgZ2VuZXJhdGluZyBiYWQgb2JqZWN0IGZpbGUufQotCi1Abm9kZSBTeW50YXgKLUBjaGFwdGVyIFN5bnRheAotCi1AY2luZGV4IG1hY2hpbmUtaW5kZXBlbmRlbnQgc3ludGF4Ci1AY2luZGV4IHN5bnRheCwgbWFjaGluZS1pbmRlcGVuZGVudAotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgbWFjaGluZS1pbmRlcGVuZGVudCBzeW50YXggYWxsb3dlZCBpbiBhCi1zb3VyY2UgZmlsZS4gIEBjb2Rle0B2YWx1ZXtBU319IHN5bnRheCBpcyBzaW1pbGFyIHRvIHdoYXQgbWFueSBvdGhlcgotYXNzZW1ibGVycyB1c2U7IGl0IGlzIGluc3BpcmVkIGJ5IHRoZSBCU0QgNC4yCi1AaWZjbGVhciBWQVgKLWFzc2VtYmxlci4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IFZBWAotYXNzZW1ibGVyLCBleGNlcHQgdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBhc3NlbWJsZSBWYXggYml0LWZpZWxkcy4KLUBlbmQgaWZzZXQKLQotQG1lbnUKLSogUHJlcHJvY2Vzc2luZzo6ICAgICAgICAgICAgICBQcmVwcm9jZXNzaW5nCi0qIFdoaXRlc3BhY2U6OiAgICAgICAgICAgICAgICAgIFdoaXRlc3BhY2UKLSogQ29tbWVudHM6OiAgICAgICAgICAgICAgICAgICAgQ29tbWVudHMKLSogU3ltYm9sIEludHJvOjogICAgICAgICAgICAgICAgU3ltYm9scwotKiBTdGF0ZW1lbnRzOjogICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRzCi0qIENvbnN0YW50czo6ICAgICAgICAgICAgICAgICAgIENvbnN0YW50cwotQGVuZCBtZW51Ci0KLUBub2RlIFByZXByb2Nlc3NpbmcKLUBzZWN0aW9uIFByZXByb2Nlc3NpbmcKLQotQGNpbmRleCBwcmVwcm9jZXNzaW5nCi1UaGUgQGNvZGV7QHZhbHVle0FTfX0gaW50ZXJuYWwgcHJlcHJvY2Vzc29yOgotQGl0ZW1pemUgQGJ1bGxldAotQGNpbmRleCB3aGl0ZXNwYWNlLCByZW1vdmVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLWFkanVzdHMgYW5kIHJlbW92ZXMgZXh0cmEgd2hpdGVzcGFjZS4gIEl0IGxlYXZlcyBvbmUgc3BhY2Ugb3IgdGFiIGJlZm9yZQotdGhlIGtleXdvcmRzIG9uIGEgbGluZSwgYW5kIHR1cm5zIGFueSBvdGhlciB3aGl0ZXNwYWNlIG9uIHRoZSBsaW5lIGludG8KLWEgc2luZ2xlIHNwYWNlLgotCi1AY2luZGV4IGNvbW1lbnRzLCByZW1vdmVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLXJlbW92ZXMgYWxsIGNvbW1lbnRzLCByZXBsYWNpbmcgdGhlbSB3aXRoIGEgc2luZ2xlIHNwYWNlLCBvciBhbgotYXBwcm9wcmlhdGUgbnVtYmVyIG9mIG5ld2xpbmVzLgotCi1AY2luZGV4IGNvbnN0YW50cywgY29udmVydGVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLWNvbnZlcnRzIGNoYXJhY3RlciBjb25zdGFudHMgaW50byB0aGUgYXBwcm9wcmlhdGUgbnVtZXJpYyB2YWx1ZXMuCi1AZW5kIGl0ZW1pemUKLQotSXQgZG9lcyBub3QgZG8gbWFjcm8gcHJvY2Vzc2luZywgaW5jbHVkZSBmaWxlIGhhbmRsaW5nLCBvcgotYW55dGhpbmcgZWxzZSB5b3UgbWF5IGdldCBmcm9tIHlvdXIgQyBjb21waWxlcidzIHByZXByb2Nlc3Nvci4gIFlvdSBjYW4KLWRvIGluY2x1ZGUgZmlsZSBwcm9jZXNzaW5nIHdpdGggdGhlIEBjb2Rley5pbmNsdWRlfSBkaXJlY3RpdmUKLShAcHhyZWZ7SW5jbHVkZSwsQGNvZGV7LmluY2x1ZGV9fSkuICBZb3UgY2FuIHVzZSB0aGUgQHNje2dudX0gQyBjb21waWxlciBkcml2ZXIKLXRvIGdldCBvdGhlciBgYENQUCcnIHN0eWxlIHByZXByb2Nlc3NpbmcsIGJ5IGdpdmluZyB0aGUgaW5wdXQgZmlsZSBhCi1Ac2FtcHsuU30gc3VmZml4LiAgQHhyZWZ7T3ZlcmFsbCBPcHRpb25zLCwgT3B0aW9ucyBDb250cm9sbGluZyB0aGUgS2luZCBvZgotT3V0cHV0LCBnY2MuaW5mbywgVXNpbmcgR05VIENDfS4KLQotRXhjZXNzIHdoaXRlc3BhY2UsIGNvbW1lbnRzLCBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cwotY2Fubm90IGJlIHVzZWQgaW4gdGhlIHBvcnRpb25zIG9mIHRoZSBpbnB1dCB0ZXh0IHRoYXQgYXJlIG5vdAotcHJlcHJvY2Vzc2VkLgotCi1AY2luZGV4IHR1cm5pbmcgcHJlcHJvY2Vzc2luZyBvbiBhbmQgb2ZmCi1AY2luZGV4IHByZXByb2Nlc3NpbmcsIHR1cm5pbmcgb24gYW5kIG9mZgotQGtpbmRleCAjTk9fQVBQCi1Aa2luZGV4ICNBUFAKLUlmIHRoZSBmaXJzdCBsaW5lIG9mIGFuIGlucHV0IGZpbGUgaXMgQGNvZGV7I05PX0FQUH0gb3IgaWYgeW91IHVzZSB0aGUKLUBzYW1wey1mfSBvcHRpb24sIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBmaWxlLgotV2l0aGluIGFuIGlucHV0IGZpbGUsIHlvdSBjYW4gYXNrIGZvciB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IHJlbW92YWwgaW4KLXNwZWNpZmljIHBvcnRpb25zIG9mIHRoZSBieSBwdXR0aW5nIGEgbGluZSB0aGF0IHNheXMgQGNvZGV7I0FQUH0gYmVmb3JlIHRoZQotdGV4dCB0aGF0IG1heSBjb250YWluIHdoaXRlc3BhY2Ugb3IgY29tbWVudHMsIGFuZCBwdXR0aW5nIGEgbGluZSB0aGF0IHNheXMKLUBjb2RleyNOT19BUFB9IGFmdGVyIHRoaXMgdGV4dC4gIFRoaXMgZmVhdHVyZSBpcyBtYWlubHkgaW50ZW5kIHRvIHN1cHBvcnQKLUBjb2Rle2FzbX0gc3RhdGVtZW50cyBpbiBjb21waWxlcnMgd2hvc2Ugb3V0cHV0IGlzIG90aGVyd2lzZSBmcmVlIG9mIGNvbW1lbnRzCi1hbmQgd2hpdGVzcGFjZS4KLQotQG5vZGUgV2hpdGVzcGFjZQotQHNlY3Rpb24gV2hpdGVzcGFjZQotCi1AY2luZGV4IHdoaXRlc3BhY2UKLUBkZm57V2hpdGVzcGFjZX0gaXMgb25lIG9yIG1vcmUgYmxhbmtzIG9yIHRhYnMsIGluIGFueSBvcmRlci4KLVdoaXRlc3BhY2UgaXMgdXNlZCB0byBzZXBhcmF0ZSBzeW1ib2xzLCBhbmQgdG8gbWFrZSBwcm9ncmFtcyBuZWF0ZXIgZm9yCi1wZW9wbGUgdG8gcmVhZC4gIFVubGVzcyB3aXRoaW4gY2hhcmFjdGVyIGNvbnN0YW50cwotKEBweHJlZntDaGFyYWN0ZXJzLCxDaGFyYWN0ZXIgQ29uc3RhbnRzfSksIGFueSB3aGl0ZXNwYWNlIG1lYW5zIHRoZSBzYW1lCi1hcyBleGFjdGx5IG9uZSBzcGFjZS4KLQotQG5vZGUgQ29tbWVudHMKLUBzZWN0aW9uIENvbW1lbnRzCi0KLUBjaW5kZXggY29tbWVudHMKLVRoZXJlIGFyZSB0d28gd2F5cyBvZiByZW5kZXJpbmcgY29tbWVudHMgdG8gQGNvZGV7QHZhbHVle0FTfX0uICBJbiBib3RoCi1jYXNlcyB0aGUgY29tbWVudCBpcyBlcXVpdmFsZW50IHRvIG9uZSBzcGFjZS4KLQotQW55dGhpbmcgZnJvbSBAc2FtcHsvKn0gdGhyb3VnaCB0aGUgbmV4dCBAc2FtcHsqL30gaXMgYSBjb21tZW50LgotVGhpcyBtZWFucyB5b3UgbWF5IG5vdCBuZXN0IHRoZXNlIGNvbW1lbnRzLgotCi1Ac21hbGxleGFtcGxlCi0vKgotICBUaGUgb25seSB3YXkgdG8gaW5jbHVkZSBhIG5ld2xpbmUgKCdcbicpIGluIGEgY29tbWVudAotICBpcyB0byB1c2UgdGhpcyBzb3J0IG9mIGNvbW1lbnQuCi0qLwotCi0vKiBUaGlzIHNvcnQgb2YgY29tbWVudCBkb2VzIG5vdCBuZXN0LiAqLwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Bbnl0aGluZyBmcm9tIHRoZSBAZGZue2xpbmUgY29tbWVudH0gY2hhcmFjdGVyIHRvIHRoZSBuZXh0IG5ld2xpbmUKLWlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBpZ25vcmVkLiAgVGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgaXMKLUBpZnNldCBBMjlLCi1Ac2FtcHs7fSBmb3IgdGhlIEFNRCAyOUsgZmFtaWx5OwotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotQHNhbXB7O30gb24gdGhlIEFSQzsKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC8zMDAKLUBzYW1wezt9IGZvciB0aGUgSDgvMzAwIGZhbWlseTsKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLUBzYW1weyF9IGZvciB0aGUgSDgvNTAwIGZhbWlseTsKLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1Ac2FtcHs7fSBmb3IgdGhlIEhQUEE7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotQHNhbXB7I30gb24gdGhlIGk5NjA7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgU0gKLUBzYW1weyF9IGZvciB0aGUgSGl0YWNoaSBTSDsKLUBlbmQgaWZzZXQKLUBpZnNldCBTUEFSQwotQHNhbXB7IX0gb24gdGhlIFNQQVJDOwotQGVuZCBpZnNldAotQGlmc2V0IE0zMlIKLUBzYW1weyN9IG9uIHRoZSBtMzJyOwotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotQHNhbXB7fH0gb24gdGhlIDY4MHgwOwotQGVuZCBpZnNldAotQGlmc2V0IFZBWAotQHNhbXB7I30gb24gdGhlIFZheDsKLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotQHNhbXB7IX0gZm9yIHRoZSBaODAwMDsKLUBlbmQgaWZzZXQKLUBpZnNldCBWODUwCi1Ac2FtcHsjfSBvbiB0aGUgVjg1MDsKLUBlbmQgaWZzZXQKLXNlZSBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4gIEByZWZpbGwKLUBjIEZJWE1FIFdoYXQgYWJvdXQgaTM4NiwgbTg4aywgaTg2MD8KLQotQGlmc2V0IEdFTkVSSUMKLU9uIHNvbWUgbWFjaGluZXMgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgbGluZSBjb21tZW50IGNoYXJhY3RlcnMuICBPbmUKLWNoYXJhY3RlciBvbmx5IGJlZ2lucyBhIGNvbW1lbnQgaWYgaXQgaXMgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBvbgotYSBsaW5lLCB3aGlsZSB0aGUgb3RoZXIgYWx3YXlzIGJlZ2lucyBhIGNvbW1lbnQuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBWODUwCi1UaGUgVjg1MCBhc3NlbWJsZXIgYWxzbyBzdXBwb3J0cyBhIGRvdWJsZSBkYXNoIGFzIHN0YXJ0aW5nIGEgY29tbWVudCB0aGF0Ci1leHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCi0KLUBzYW1wey0tfTsKLUBlbmQgaWZzZXQKLQotQGtpbmRleCAjCi1AY2luZGV4IGxpbmVzIHN0YXJ0aW5nIHdpdGggQGNvZGV7I30KLUBjaW5kZXggbG9naWNhbCBsaW5lIG51bWJlcnMKLVRvIGJlIGNvbXBhdGlibGUgd2l0aCBwYXN0IGFzc2VtYmxlcnMsIGxpbmVzIHRoYXQgYmVnaW4gd2l0aCBAc2FtcHsjfSBoYXZlIGEKLXNwZWNpYWwgaW50ZXJwcmV0YXRpb24uICBGb2xsb3dpbmcgdGhlIEBzYW1weyN9IHNob3VsZCBiZSBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbiAoQHB4cmVme0V4cHJlc3Npb25zfSk6IHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyIG9mIHRoZSBAZW1waHtuZXh0fQotbGluZS4gIFRoZW4gYSBzdHJpbmcgKEBweHJlZntTdHJpbmdzLCwgU3RyaW5nc30pIGlzIGFsbG93ZWQ6IGlmIHByZXNlbnQgaXQgaXMgYQotbmV3IGxvZ2ljYWwgZmlsZSBuYW1lLiAgVGhlIHJlc3Qgb2YgdGhlIGxpbmUsIGlmIGFueSwgc2hvdWxkIGJlIHdoaXRlc3BhY2UuCi0KLUlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIG9uIHRoZSBsaW5lIGFyZSBub3QgbnVtZXJpYywKLXRoZSBsaW5lIGlzIGlnbm9yZWQuICAoSnVzdCBsaWtlIGEgY29tbWVudC4pCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIG9yZGluYXJ5IGNvbW1lbnQuCi0jIDQyLTYgIm5ld19maWxlX25hbWUiICAgICMgTmV3IGxvZ2ljYWwgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBsb2dpY2FsIGxpbmUgIyAzNi4KLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIGZlYXR1cmUgaXMgZGVwcmVjYXRlZCwgYW5kIG1heSBkaXNhcHBlYXIgZnJvbSBmdXR1cmUgdmVyc2lvbnMKLW9mIEBjb2Rle0B2YWx1ZXtBU319LgotCi1Abm9kZSBTeW1ib2wgSW50cm8KLUBzZWN0aW9uIFN5bWJvbHMKLQotQGNpbmRleCBjaGFyYWN0ZXJzIHVzZWQgaW4gc3ltYm9scwotQGlmY2xlYXIgU1BFQ0lBTC1TWU1TCi1BIEBkZm57c3ltYm9sfSBpcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGNob3NlbiBmcm9tIHRoZSBzZXQgb2YgYWxsCi1sZXR0ZXJzIChib3RoIHVwcGVyIGFuZCBsb3dlciBjYXNlKSwgZGlnaXRzIGFuZCB0aGUgdGhyZWUgY2hhcmFjdGVycwotQHNhbXB7Xy4kfS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IFNQRUNJQUwtU1lNUwotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4Ci1BIEBkZm57c3ltYm9sfSBpcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGNob3NlbiBmcm9tIHRoZSBzZXQgb2YgYWxsCi1sZXR0ZXJzIChib3RoIHVwcGVyIGFuZCBsb3dlciBjYXNlKSwgZGlnaXRzIGFuZCB0aGUgdGhyZWUgY2hhcmFjdGVycwotQHNhbXB7Ll8kfS4gIChTYXZlIHRoYXQsIG9uIHRoZSBIOC8zMDAgb25seSwgeW91IG1heSBub3QgdXNlIEBzYW1weyR9IGluCi1zeW1ib2wgbmFtZXMuKQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci1AaWZzZXQgR0VORVJJQwotT24gbW9zdCBtYWNoaW5lcywgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXM7IGV4Y2VwdGlvbnMKLWFyZSBub3RlZCBpbiBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLU5vIHN5bWJvbCBtYXkgYmVnaW4gd2l0aCBhIGRpZ2l0LiAgQ2FzZSBpcyBzaWduaWZpY2FudC4KLVRoZXJlIGlzIG5vIGxlbmd0aCBsaW1pdDogYWxsIGNoYXJhY3RlcnMgYXJlIHNpZ25pZmljYW50LiAgU3ltYm9scyBhcmUKLWRlbGltaXRlZCBieSBjaGFyYWN0ZXJzIG5vdCBpbiB0aGF0IHNldCwgb3IgYnkgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUKLShzaW5jZSB0aGUgc291cmNlIHByb2dyYW0gbXVzdCBlbmQgd2l0aCBhIG5ld2xpbmUsIHRoZSBlbmQgb2YgYSBmaWxlIGlzCi1ub3QgYSBwb3NzaWJsZSBzeW1ib2wgZGVsaW1pdGVyKS4gIEB4cmVme1N5bWJvbHN9LgotQGNpbmRleCBsZW5ndGggb2Ygc3ltYm9scwotCi1Abm9kZSBTdGF0ZW1lbnRzCi1Ac2VjdGlvbiBTdGF0ZW1lbnRzCi0KLUBjaW5kZXggc3RhdGVtZW50cywgc3RydWN0dXJlIG9mCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yIGNoYXJhY3RlcgotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yIGNoYXJhY3RlcgotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYWJub3JtYWwtc2VwYXJhdG9yCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYXQgYQotc2VtaWNvbG9uIChAc2FtcHs7fSkuICBUaGUgbmV3bGluZSBvciBzZW1pY29sb24gaXMgY29uc2lkZXJlZCBwYXJ0IG9mCi10aGUgcHJlY2VkaW5nIHN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBzZW1pY29sb25zIHdpdGhpbiBjaGFyYWN0ZXIKLWNvbnN0YW50cyBhcmUgYW4gZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IGFibm9ybWFsLXNlcGFyYXRvcgotQGlmc2V0IEEyOUsKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KSBvciBhbiBgYGF0JycKLXNpZ24gKEBzYW1we0BAfSkuICBUaGUgbmV3bGluZSBvciBhdCBzaWduIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUKLXByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgYXQgc2lnbnMgd2l0aGluIGNoYXJhY3RlciBjb25zdGFudHMKLWFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KSBvciBhbiBleGNsYW1hdGlvbiAKLXBvaW50IChAc2FtcHshfSkuICBUaGUgbmV3bGluZSBvciBleGNsYW1hdGlvbiBwb2ludCBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCi1wcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIGV4Y2xhbWF0aW9uIHBvaW50cyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KTsgb3IgKGZvciB0aGUKLUg4LzMwMCkgYSBkb2xsYXIgc2lnbiAoQHNhbXB7JH0pOyBvciAoZm9yIHRoZQotSGl0YWNoaS1TSCBvciB0aGUKLUg4LzUwMCkgYSBzZW1pY29sb24KLShAc2FtcHs7fSkuICBUaGUgbmV3bGluZSBvciBzZXBhcmF0b3IgY2hhcmFjdGVyIGlzIGNvbnNpZGVyZWQgcGFydCBvZgotdGhlIHByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgc2VwYXJhdG9ycyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgbGluZQotc2VwYXJhdG9yIGNoYXJhY3Rlci4gIChUaGUgbGluZSBzZXBhcmF0b3IgaXMgdXN1YWxseSBAc2FtcHs7fSwgdW5sZXNzCi10aGlzIGNvbmZsaWN0cyB3aXRoIHRoZSBjb21tZW50IGNoYXJhY3RlcjsgQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4pICBUaGUKLW5ld2xpbmUgb3Igc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByZWNlZGluZwotc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIHNlcGFyYXRvcnMgd2l0aGluIGNoYXJhY3RlciBjb25zdGFudHMgYXJlIGFuCi1leGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotCi1AY2luZGV4IG5ld2xpbmUsIHJlcXVpcmVkIGF0IGZpbGUgZW5kCi1AY2luZGV4IEVPRiwgbmV3bGluZSBtdXN0IHByZWNlZGUKLUl0IGlzIGFuIGVycm9yIHRvIGVuZCBhbnkgc3RhdGVtZW50IHdpdGggZW5kLW9mLWZpbGU6ICB0aGUgbGFzdAotY2hhcmFjdGVyIG9mIGFueSBpbnB1dCBmaWxlIHNob3VsZCBiZSBhIG5ld2xpbmUuQHJlZmlsbAotCi1BbiBlbXB0eSBzdGF0ZW1lbnQgaXMgYWxsb3dlZCwgYW5kIG1heSBpbmNsdWRlIHdoaXRlc3BhY2UuICBJdCBpcyBpZ25vcmVkLgotCi1AY2luZGV4IGluc3RydWN0aW9ucyBhbmQgZGlyZWN0aXZlcwotQGNpbmRleCBkaXJlY3RpdmVzIGFuZCBpbnN0cnVjdGlvbnMKLUBjICJrZXkgc3ltYm9sIiBpcyBub3QgdXNlZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50OyBzZWVtcyBwZWRhbnRpYyB0bwotQGMgQGRlZm57fSBpdCBpbiB0aGF0IGNhc2UsIGFzIHdhcyBkb25lIHByZXZpb3VzbHkuLi4gIGRvY0BjeWdudXMuY29tLAotQGMgMTNmZWI5MS4KLUEgc3RhdGVtZW50IGJlZ2lucyB3aXRoIHplcm8gb3IgbW9yZSBsYWJlbHMsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYQota2V5IHN5bWJvbCB3aGljaCBkZXRlcm1pbmVzIHdoYXQga2luZCBvZiBzdGF0ZW1lbnQgaXQgaXMuICBUaGUga2V5Ci1zeW1ib2wgZGV0ZXJtaW5lcyB0aGUgc3ludGF4IG9mIHRoZSByZXN0IG9mIHRoZSBzdGF0ZW1lbnQuICBJZiB0aGUKLXN5bWJvbCBiZWdpbnMgd2l0aCBhIGRvdCBAc2FtcHsufSB0aGVuIHRoZSBzdGF0ZW1lbnQgaXMgYW4gYXNzZW1ibGVyCi1kaXJlY3RpdmU6IHR5cGljYWxseSB2YWxpZCBmb3IgYW55IGNvbXB1dGVyLiAgSWYgdGhlIHN5bWJvbCBiZWdpbnMgd2l0aAotYSBsZXR0ZXIgdGhlIHN0YXRlbWVudCBpcyBhbiBhc3NlbWJseSBsYW5ndWFnZSBAZGZue2luc3RydWN0aW9ufTogaXQKLWFzc2VtYmxlcyBpbnRvIGEgbWFjaGluZSBsYW5ndWFnZSBpbnN0cnVjdGlvbi4KLUBpZnNldCBHRU5FUklDCi1EaWZmZXJlbnQgdmVyc2lvbnMgb2YgQGNvZGV7QHZhbHVle0FTfX0gZm9yIGRpZmZlcmVudCBjb21wdXRlcnMKLXJlY29nbml6ZSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zLiAgSW4gZmFjdCwgdGhlIHNhbWUgc3ltYm9sIG1heQotcmVwcmVzZW50IGEgZGlmZmVyZW50IGluc3RydWN0aW9uIGluIGEgZGlmZmVyZW50IGNvbXB1dGVyJ3MgYXNzZW1ibHkKLWxhbmd1YWdlLkByZWZpbGwKLUBlbmQgaWZzZXQKLQotQGNpbmRleCBAY29kZXs6fSAobGFiZWwpCi1AY2luZGV4IGxhYmVsIChAY29kZXs6fSkKLUEgbGFiZWwgaXMgYSBzeW1ib2wgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb2xvbiAoQGNvZGV7On0pLgotV2hpdGVzcGFjZSBiZWZvcmUgYSBsYWJlbCBvciBhZnRlciBhIGNvbG9uIGlzIHBlcm1pdHRlZCwgYnV0IHlvdSBtYXkgbm90Ci1oYXZlIHdoaXRlc3BhY2UgYmV0d2VlbiBhIGxhYmVsJ3Mgc3ltYm9sIGFuZCBpdHMgY29sb24uIEB4cmVme0xhYmVsc30uCi0KLUBpZnNldCBIUFBBCi1Gb3IgSFBQQSB0YXJnZXRzLCBsYWJlbHMgbmVlZCBub3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb2xvbiwgYnV0IAotdGhlIGRlZmluaXRpb24gb2YgYSBsYWJlbCBtdXN0IGJlZ2luIGluIGNvbHVtbiB6ZXJvLiAgVGhpcyBhbHNvIGltcGxpZXMgdGhhdAotb25seSBvbmUgbGFiZWwgbWF5IGJlIGRlZmluZWQgb24gZWFjaCBsaW5lLgotQGVuZCBpZnNldAotCi1Ac21hbGxleGFtcGxlCi1sYWJlbDogICAgIC5kaXJlY3RpdmUgICAgZm9sbG93ZWQgYnkgc29tZXRoaW5nCi1hbm90aGVyX2xhYmVsOiAgICAgICAgICAgIyBUaGlzIGlzIGFuIGVtcHR5IHN0YXRlbWVudC4KLSAgICAgICAgICAgaW5zdHJ1Y3Rpb24gICBvcGVyYW5kXzEsIG9wZXJhbmRfMiwgQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgQ29uc3RhbnRzCi1Ac2VjdGlvbiBDb25zdGFudHMKLQotQGNpbmRleCBjb25zdGFudHMKLUEgY29uc3RhbnQgaXMgYSBudW1iZXIsIHdyaXR0ZW4gc28gdGhhdCBpdHMgdmFsdWUgaXMga25vd24gYnkKLWluc3BlY3Rpb24sIHdpdGhvdXQga25vd2luZyBhbnkgY29udGV4dC4gIExpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotLmJ5dGUgIDc0LCAwMTEyLCAwOTIsIDB4NEEsIDBYNGEsICdKLCAnXEogIyBBbGwgdGhlIHNhbWUgdmFsdWUuCi0uYXNjaWkgIlJpbmcgdGhlIGJlbGxcNyIgICAgICAgICAgICAgICAgICAjIEEgc3RyaW5nIGNvbnN0YW50LgotLm9jdGEgIDB4MTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OUFCQ0RFRjAgIyBBIGJpZ251bS4KLS5mbG9hdCAwZi0zMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjdcCi05NTAyODg0MTk3MS42OTM5OTM3NTFFLTQwICAgICAgICAgICAgICAgICAjIC0gcGksIGEgZmxvbnVtLgotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG1lbnUKLSogQ2hhcmFjdGVyczo6ICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyIENvbnN0YW50cwotKiBOdW1iZXJzOjogICAgICAgICAgICAgICAgICAgICBOdW1iZXIgQ29uc3RhbnRzCi1AZW5kIG1lbnUKLQotQG5vZGUgQ2hhcmFjdGVycwotQHN1YnNlY3Rpb24gQ2hhcmFjdGVyIENvbnN0YW50cwotCi1AY2luZGV4IGNoYXJhY3RlciBjb25zdGFudHMKLUBjaW5kZXggY29uc3RhbnRzLCBjaGFyYWN0ZXIKLVRoZXJlIGFyZSB0d28ga2luZHMgb2YgY2hhcmFjdGVyIGNvbnN0YW50cy4gIEEgQGRmbntjaGFyYWN0ZXJ9IHN0YW5kcwotZm9yIG9uZSBjaGFyYWN0ZXIgaW4gb25lIGJ5dGUgYW5kIGl0cyB2YWx1ZSBtYXkgYmUgdXNlZCBpbgotbnVtZXJpYyBleHByZXNzaW9ucy4gIFN0cmluZyBjb25zdGFudHMgKHByb3Blcmx5IGNhbGxlZCBzdHJpbmcKLUBlbXBoe2xpdGVyYWxzfSkgYXJlIHBvdGVudGlhbGx5IG1hbnkgYnl0ZXMgYW5kIHRoZWlyIHZhbHVlcyBtYXkgbm90IGJlCi11c2VkIGluIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMuCi0KLUBtZW51Ci0qIFN0cmluZ3M6OiAgICAgICAgICAgICAgICAgICAgIFN0cmluZ3MKLSogQ2hhcnM6OiAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVycwotQGVuZCBtZW51Ci0KLUBub2RlIFN0cmluZ3MKLUBzdWJzdWJzZWN0aW9uIFN0cmluZ3MKLQotQGNpbmRleCBzdHJpbmcgY29uc3RhbnRzCi1AY2luZGV4IGNvbnN0YW50cywgc3RyaW5nCi1BIEBkZm57c3RyaW5nfSBpcyB3cml0dGVuIGJldHdlZW4gZG91YmxlLXF1b3Rlcy4gIEl0IG1heSBjb250YWluCi1kb3VibGUtcXVvdGVzIG9yIG51bGwgY2hhcmFjdGVycy4gIFRoZSB3YXkgdG8gZ2V0IHNwZWNpYWwgY2hhcmFjdGVycwotaW50byBhIHN0cmluZyBpcyB0byBAZGZue2VzY2FwZX0gdGhlc2UgY2hhcmFjdGVyczogcHJlY2VkZSB0aGVtIHdpdGgKLWEgYmFja3NsYXNoIEBzYW1we1x9IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlIEBzYW1we1xcfSByZXByZXNlbnRzCi1vbmUgYmFja3NsYXNoOiAgdGhlIGZpcnN0IEBjb2Rle1x9IGlzIGFuIGVzY2FwZSB3aGljaCB0ZWxscwotQGNvZGV7QHZhbHVle0FTfX0gdG8gaW50ZXJwcmV0IHRoZSBzZWNvbmQgY2hhcmFjdGVyIGxpdGVyYWxseSBhcyBhIGJhY2tzbGFzaAotKHdoaWNoIHByZXZlbnRzIEBjb2Rle0B2YWx1ZXtBU319IGZyb20gcmVjb2duaXppbmcgdGhlIHNlY29uZCBAY29kZXtcfSBhcyBhbgotZXNjYXBlIGNoYXJhY3RlcikuICBUaGUgY29tcGxldGUgbGlzdCBvZiBlc2NhcGVzIGZvbGxvd3MuCi0KLUBjaW5kZXggZXNjYXBlIGNvZGVzLCBjaGFyYWN0ZXIKLUBjaW5kZXggY2hhcmFjdGVyIGVzY2FwZSBjb2RlcwotQHRhYmxlIEBrYmQKLUBjICAgICAgQGl0ZW0gXGEKLUBjICAgICAgTW5lbW9uaWMgZm9yIEFDS25vd2xlZGdlOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAwNy4KLUBjCi1AY2luZGV4IEBjb2Rle1xifSAoYmFja3NwYWNlIGNoYXJhY3RlcikKLUBjaW5kZXggYmFja3NwYWNlIChAY29kZXtcYn0pCi1AaXRlbSBcYgotTW5lbW9uaWMgZm9yIGJhY2tzcGFjZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTAuCi0KLUBjICAgICAgQGl0ZW0gXGUKLUBjICAgICAgTW5lbW9uaWMgZm9yIEVPVGV4dDsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMDQuCi1AYwotQGNpbmRleCBAY29kZXtcZn0gKGZvcm1mZWVkIGNoYXJhY3RlcikKLUBjaW5kZXggZm9ybWZlZWQgKEBjb2Rle1xmfSkKLUBpdGVtIFxmCi1NbmVtb25pYyBmb3IgRm9ybUZlZWQ7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDE0LgotCi1AY2luZGV4IEBjb2Rle1xufSAobmV3bGluZSBjaGFyYWN0ZXIpCi1AY2luZGV4IG5ld2xpbmUgKEBjb2Rle1xufSkKLUBpdGVtIFxuCi1NbmVtb25pYyBmb3IgbmV3bGluZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTIuCi0KLUBjICAgICAgQGl0ZW0gXHAKLUBjICAgICAgTW5lbW9uaWMgZm9yIHByZWZpeDsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMzMsIHVzdWFsbHkga25vd24gYXMgQGNvZGV7ZXNjYXBlfS4KLUBjCi1AY2luZGV4IEBjb2Rle1xyfSAoY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlcikKLUBjaW5kZXggY2FycmlhZ2UgcmV0dXJuIChAY29kZXtccn0pCi1AaXRlbSBccgotTW5lbW9uaWMgZm9yIGNhcnJpYWdlLVJldHVybjsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTUuCi0KLUBjICAgICAgQGl0ZW0gXHMKLUBjICAgICAgTW5lbW9uaWMgZm9yIHNwYWNlOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDA0MC4gIEluY2x1ZGVkIGZvciBjb21wbGlhbmNlIHdpdGgKLUBjICAgICAgb3RoZXIgYXNzZW1ibGVycy4KLUBjCi1AY2luZGV4IEBjb2Rle1x0fSAodGFiKQotQGNpbmRleCB0YWIgKEBjb2Rle1x0fSkKLUBpdGVtIFx0Ci1NbmVtb25pYyBmb3IgaG9yaXpvbnRhbCBUYWI7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDExLgotCi1AYyAgICAgIEBpdGVtIFx2Ci1AYyAgICAgIE1uZW1vbmljIGZvciBWZXJ0aWNhbCB0YWI7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEzLgotQGMgICAgICBAaXRlbSBceCBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fQotQGMgICAgICBBIGhleGFkZWNpbWFsIGNoYXJhY3RlciBjb2RlLiAgVGhlIG51bWVyaWMgY29kZSBpcyAzIGhleGFkZWNpbWFsIGRpZ2l0cy4KLUBjCi1AY2luZGV4IEBjb2Rle1xAdmFye2RkZH19IChvY3RhbCBjaGFyYWN0ZXIgY29kZSkKLUBjaW5kZXggb2N0YWwgY2hhcmFjdGVyIGNvZGUgKEBjb2Rle1xAdmFye2RkZH19KQotQGl0ZW0gXCBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fQotQW4gb2N0YWwgY2hhcmFjdGVyIGNvZGUuICBUaGUgbnVtZXJpYyBjb2RlIGlzIDMgb2N0YWwgZGlnaXRzLgotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBVbml4IHN5c3RlbXMsIDggYW5kIDkgYXJlIGFjY2VwdGVkIGFzIGRpZ2l0czoKLWZvciBleGFtcGxlLCBAY29kZXtcMDA4fSBoYXMgdGhlIHZhbHVlIDAxMCwgYW5kIEBjb2Rle1wwMDl9IHRoZSB2YWx1ZSAwMTEuCi0KLUBjaW5kZXggQGNvZGV7XEB2YXJ7eGQuLi59fSAoaGV4IGNoYXJhY3RlciBjb2RlKQotQGNpbmRleCBoZXggY2hhcmFjdGVyIGNvZGUgKEBjb2Rle1xAdmFye3hkLi4ufX0pCi1AaXRlbSBcQGNvZGV7eH0gQHZhcntoZXgtZGlnaXRzLi4ufQotQSBoZXggY2hhcmFjdGVyIGNvZGUuICBBbGwgdHJhaWxpbmcgaGV4IGRpZ2l0cyBhcmUgY29tYmluZWQuICBFaXRoZXIgdXBwZXIgb3IKLWxvd2VyIGNhc2UgQGNvZGV7eH0gd29ya3MuCi0KLUBjaW5kZXggQGNvZGV7XFx9IChAc2FtcHtcfSBjaGFyYWN0ZXIpCi1AY2luZGV4IGJhY2tzbGFzaCAoQGNvZGV7XFx9KQotQGl0ZW0gXFwKLVJlcHJlc2VudHMgb25lIEBzYW1we1x9IGNoYXJhY3Rlci4KLQotQGMgICAgICBAaXRlbSBcJwotQGMgICAgICBSZXByZXNlbnRzIG9uZSBAc2FtcHsnfSAoYWNjZW50IGFjdXRlKSBjaGFyYWN0ZXIuCi1AYyAgICAgIFRoaXMgaXMgbmVlZGVkIGluIHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbHMKLUBjICAgICAgKEB4cmVme0NoYXJhY3RlcnMsLENoYXJhY3RlciBDb25zdGFudHN9LikgdG8gcmVwcmVzZW50Ci1AYyAgICAgIGEgQHNhbXB7J30uCi1AYwotQGNpbmRleCBAY29kZXtcIn0gKGRvdWJsZXF1b3RlIGNoYXJhY3RlcikKLUBjaW5kZXggZG91YmxlcXVvdGUgKEBjb2Rle1wifSkKLUBpdGVtIFwiCi1SZXByZXNlbnRzIG9uZSBAc2FtcHsifSBjaGFyYWN0ZXIuICBOZWVkZWQgaW4gc3RyaW5ncyB0byByZXByZXNlbnQKLXRoaXMgY2hhcmFjdGVyLCBiZWNhdXNlIGFuIHVuZXNjYXBlZCBAc2FtcHsifSB3b3VsZCBlbmQgdGhlIHN0cmluZy4KLQotQGl0ZW0gXCBAdmFye2FueXRoaW5nLWVsc2V9Ci1Bbnkgb3RoZXIgY2hhcmFjdGVyIHdoZW4gZXNjYXBlZCBieSBAa2Jke1x9IGdpdmVzIGEgd2FybmluZywgYnV0Ci1hc3NlbWJsZXMgYXMgaWYgdGhlIEBzYW1we1x9IHdhcyBub3QgcHJlc2VudC4gIFRoZSBpZGVhIGlzIHRoYXQgaWYKLXlvdSB1c2VkIGFuIGVzY2FwZSBzZXF1ZW5jZSB5b3UgY2xlYXJseSBkaWRuJ3Qgd2FudCB0aGUgbGl0ZXJhbAotaW50ZXJwcmV0YXRpb24gb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIuICBIb3dldmVyIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBubwotb3RoZXIgaW50ZXJwcmV0YXRpb24sIHNvIEBjb2Rle0B2YWx1ZXtBU319IGtub3dzIGl0IGlzIGdpdmluZyB5b3UgdGhlIHdyb25nCi1jb2RlIGFuZCB3YXJucyB5b3Ugb2YgdGhlIGZhY3QuCi1AZW5kIHRhYmxlCi0KLVdoaWNoIGNoYXJhY3RlcnMgYXJlIGVzY2FwYWJsZSwgYW5kIHdoYXQgdGhvc2UgZXNjYXBlcyByZXByZXNlbnQsCi12YXJpZXMgd2lkZWx5IGFtb25nIGFzc2VtYmxlcnMuICBUaGUgY3VycmVudCBzZXQgaXMgd2hhdCB3ZSB0aGluawotdGhlIEJTRCA0LjIgYXNzZW1ibGVyIHJlY29nbml6ZXMsIGFuZCBpcyBhIHN1YnNldCBvZiB3aGF0IG1vc3QgQwotY29tcGlsZXJzIHJlY29nbml6ZS4gIElmIHlvdSBhcmUgaW4gZG91YnQsIGRvIG5vdCB1c2UgYW4gZXNjYXBlCi1zZXF1ZW5jZS4KLQotQG5vZGUgQ2hhcnMKLUBzdWJzdWJzZWN0aW9uIENoYXJhY3RlcnMKLQotQGNpbmRleCBzaW5nbGUgY2hhcmFjdGVyIGNvbnN0YW50Ci1AY2luZGV4IGNoYXJhY3Rlciwgc2luZ2xlCi1AY2luZGV4IGNvbnN0YW50LCBzaW5nbGUgY2hhcmFjdGVyCi1BIHNpbmdsZSBjaGFyYWN0ZXIgbWF5IGJlIHdyaXR0ZW4gYXMgYSBzaW5nbGUgcXVvdGUgaW1tZWRpYXRlbHkKLWZvbGxvd2VkIGJ5IHRoYXQgY2hhcmFjdGVyLiAgVGhlIHNhbWUgZXNjYXBlcyBhcHBseSB0byBjaGFyYWN0ZXJzIGFzCi10byBzdHJpbmdzLiAgU28gaWYgeW91IHdhbnQgdG8gd3JpdGUgdGhlIGNoYXJhY3RlciBiYWNrc2xhc2gsIHlvdQotbXVzdCB3cml0ZSBAa2JkeydcXH0gd2hlcmUgdGhlIGZpcnN0IEBjb2Rle1x9IGVzY2FwZXMgdGhlIHNlY29uZAotQGNvZGV7XH0uICBBcyB5b3UgY2FuIHNlZSwgdGhlIHF1b3RlIGlzIGFuIGFjdXRlIGFjY2VudCwgbm90IGEKLWdyYXZlIGFjY2VudC4gIEEgbmV3bGluZQotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYWJub3JtYWwtc2VwYXJhdG9yCi0ob3Igc2VtaWNvbG9uIEBzYW1wezt9KQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgYWJub3JtYWwtc2VwYXJhdG9yCi1AaWZzZXQgQTI5SwotKG9yIGF0IHNpZ24gQHNhbXB7QEB9KQotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci0ob3IgZG9sbGFyIHNpZ24gQHNhbXB7JH0sIGZvciB0aGUgSDgvMzAwOyBvciBzZW1pY29sb24gQHNhbXB7O30gZm9yIHRoZQotSGl0YWNoaSBTSCBvcgotSDgvNTAwKQotQGVuZCBpZnNldAotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1pbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gYWN1dGUgYWNjZW50IGlzIHRha2VuIGFzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIKLWFuZCBkb2VzIG5vdCBjb3VudCBhcyB0aGUgZW5kIG9mIGEgc3RhdGVtZW50LiAgVGhlIHZhbHVlIG9mIGEgY2hhcmFjdGVyCi1jb25zdGFudCBpbiBhIG51bWVyaWMgZXhwcmVzc2lvbiBpcyB0aGUgbWFjaGluZSdzIGJ5dGUtd2lkZSBjb2RlIGZvcgotdGhhdCBjaGFyYWN0ZXIuICBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIHlvdXIgY2hhcmFjdGVyIGNvZGUgaXMgQVNDSUk6Ci1Aa2JkeydBfSBtZWFucyA2NSwgQGtiZHsnQn0gbWVhbnMgNjYsIGFuZCBzbyBvbi4gQHJlZmlsbAotCi1Abm9kZSBOdW1iZXJzCi1Ac3Vic2VjdGlvbiBOdW1iZXIgQ29uc3RhbnRzCi0KLUBjaW5kZXggY29uc3RhbnRzLCBudW1iZXIKLUBjaW5kZXggbnVtYmVyIGNvbnN0YW50cwotQGNvZGV7QHZhbHVle0FTfX0gZGlzdGluZ3Vpc2hlcyB0aHJlZSBraW5kcyBvZiBudW1iZXJzIGFjY29yZGluZyB0byBob3cgdGhleQotYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBAZW1waHtJbnRlZ2Vyc30gYXJlIG51bWJlcnMgdGhhdAotd291bGQgZml0IGludG8gYW4gQGNvZGV7aW50fSBpbiB0aGUgQyBsYW5ndWFnZS4gIEBlbXBoe0JpZ251bXN9IGFyZQotaW50ZWdlcnMsIGJ1dCB0aGV5IGFyZSBzdG9yZWQgaW4gbW9yZSB0aGFuIDMyIGJpdHMuICBAZW1waHtGbG9udW1zfQotYXJlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGRlc2NyaWJlZCBiZWxvdy4KLQotQG1lbnUKLSogSW50ZWdlcnM6OiAgICAgICAgICAgICAgICAgICAgSW50ZWdlcnMKLSogQmlnbnVtczo6ICAgICAgICAgICAgICAgICAgICAgQmlnbnVtcwotKiBGbG9udW1zOjogICAgICAgICAgICAgICAgICAgICBGbG9udW1zCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSTk2MAotKiBCaXQgRmllbGRzOjogICAgICAgICAgICAgICAgICBCaXQgRmllbGRzCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBlbmQgbWVudQotCi1Abm9kZSBJbnRlZ2VycwotQHN1YnN1YnNlY3Rpb24gSW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMKLUBjaW5kZXggY29uc3RhbnRzLCBpbnRlZ2VyCi0KLUBjaW5kZXggYmluYXJ5IGludGVnZXJzCi1AY2luZGV4IGludGVnZXJzLCBiaW5hcnkKLUEgYmluYXJ5IGludGVnZXIgaXMgQHNhbXB7MGJ9IG9yIEBzYW1wezBCfSBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgb2YKLXRoZSBiaW5hcnkgZGlnaXRzIEBzYW1wezAxfS4KLQotQGNpbmRleCBvY3RhbCBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2Vycywgb2N0YWwKLUFuIG9jdGFsIGludGVnZXIgaXMgQHNhbXB7MH0gZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIG9mIHRoZSBvY3RhbAotZGlnaXRzIChAc2FtcHswMTIzNDU2N30pLgotCi1AY2luZGV4IGRlY2ltYWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIGRlY2ltYWwKLUEgZGVjaW1hbCBpbnRlZ2VyIHN0YXJ0cyB3aXRoIGEgbm9uLXplcm8gZGlnaXQgZm9sbG93ZWQgYnkgemVybyBvcgotbW9yZSBkaWdpdHMgKEBzYW1wezAxMjM0NTY3ODl9KS4KLQotQGNpbmRleCBoZXhhZGVjaW1hbCBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2VycywgaGV4YWRlY2ltYWwKLUEgaGV4YWRlY2ltYWwgaW50ZWdlciBpcyBAc2FtcHsweH0gb3IgQHNhbXB7MFh9IGZvbGxvd2VkIGJ5IG9uZSBvcgotbW9yZSBoZXhhZGVjaW1hbCBkaWdpdHMgY2hvc2VuIGZyb20gQHNhbXB7MDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRn0uCi0KLUludGVnZXJzIGhhdmUgdGhlIHVzdWFsIHZhbHVlcy4gIFRvIGRlbm90ZSBhIG5lZ2F0aXZlIGludGVnZXIsIHVzZQotdGhlIHByZWZpeCBvcGVyYXRvciBAc2FtcHstfSBkaXNjdXNzZWQgdW5kZXIgZXhwcmVzc2lvbnMKLShAcHhyZWZ7UHJlZml4IE9wcywsUHJlZml4IE9wZXJhdG9yc30pLgotCi1Abm9kZSBCaWdudW1zCi1Ac3Vic3Vic2VjdGlvbiBCaWdudW1zCi0KLUBjaW5kZXggYmlnbnVtcwotQGNpbmRleCBjb25zdGFudHMsIGJpZ251bQotQSBAZGZue2JpZ251bX0gaGFzIHRoZSBzYW1lIHN5bnRheCBhbmQgc2VtYW50aWNzIGFzIGFuIGludGVnZXIKLWV4Y2VwdCB0aGF0IHRoZSBudW1iZXIgKG9yIGl0cyBuZWdhdGl2ZSkgdGFrZXMgbW9yZSB0aGFuIDMyIGJpdHMgdG8KLXJlcHJlc2VudCBpbiBiaW5hcnkuICBUaGUgZGlzdGluY3Rpb24gaXMgbWFkZSBiZWNhdXNlIGluIHNvbWUgcGxhY2VzCi1pbnRlZ2VycyBhcmUgcGVybWl0dGVkIHdoaWxlIGJpZ251bXMgYXJlIG5vdC4KLQotQG5vZGUgRmxvbnVtcwotQHN1YnN1YnNlY3Rpb24gRmxvbnVtcwotQGNpbmRleCBmbG9udW1zCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMKLUBjaW5kZXggY29uc3RhbnRzLCBmbG9hdGluZyBwb2ludAotCi1AY2luZGV4IHByZWNpc2lvbiwgZmxvYXRpbmcgcG9pbnQKLUEgQGRmbntmbG9udW19IHJlcHJlc2VudHMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICBUaGUgdHJhbnNsYXRpb24gaXMKLWluZGlyZWN0OiBhIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGZyb20gdGhlIHRleHQgaXMgY29udmVydGVkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fSB0byBhIGdlbmVyaWMgYmluYXJ5IGZsb2F0aW5nIHBvaW50IG51bWJlciBvZiBtb3JlIHRoYW4KLXN1ZmZpY2llbnQgcHJlY2lzaW9uLiAgVGhpcyBnZW5lcmljIGZsb2F0aW5nIHBvaW50IG51bWJlciBpcyBjb252ZXJ0ZWQKLXRvIGEgcGFydGljdWxhciBjb21wdXRlcidzIGZsb2F0aW5nIHBvaW50IGZvcm1hdCAob3IgZm9ybWF0cykgYnkgYQotcG9ydGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBzcGVjaWFsaXplZCB0byB0aGF0IGNvbXB1dGVyLgotCi1BIGZsb251bSBpcyB3cml0dGVuIGJ5IHdyaXRpbmcgKGluIG9yZGVyKQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBkaWdpdCBAc2FtcHswfS4KLUBpZnNldCBIUFBBCi0oQHNhbXB7MH0gaXMgb3B0aW9uYWwgb24gdGhlIEhQUEEuKQotQGVuZCBpZnNldAotCi1AaXRlbQotQSBsZXR0ZXIsIHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0gdGhlIHJlc3Qgb2YgdGhlIG51bWJlciBpcyBhIGZsb251bS4KLUBpZnNldCBHRU5FUklDCi1Aa2Jke2V9IGlzIHJlY29tbWVuZGVkLiAgQ2FzZSBpcyBub3QgaW1wb3J0YW50LgotQGlnbm9yZQotQGMgRklYTUU6IHZlcmlmeSBpZiBmbG9udW0gc3ludGF4IHJlYWxseSB0aGlzIHZhZ3VlIGZvciBtb3N0IGNhc2VzCi0oQW55IG90aGVyd2lzZSBpbGxlZ2FsIGxldHRlciB3b3JrcyBoZXJlLCBidXQgdGhhdCBtaWdodCBiZSBjaGFuZ2VkLiAgVmF4IEJTRAotNC4yIGFzc2VtYmxlciBzZWVtcyB0byBhbGxvdyBhbnkgb2YgQHNhbXB7ZGVmZ2hERUZHSH0uKQotQGVuZCBpZ25vcmUKLQotT24gdGhlIEg4LzMwMCwgSDgvNTAwLAotSGl0YWNoaSBTSCwKLWFuZCBBTUQgMjlLIGFyY2hpdGVjdHVyZXMsIHRoZSBsZXR0ZXIgbXVzdCBiZQotb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotCi1PbiB0aGUgQVJDLCB0aGUgbGV0dGVyIG11c3QgYmUgb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUlN9Ci0oaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi0KLU9uIHRoZSBJbnRlbCA5NjAgYXJjaGl0ZWN0dXJlLCB0aGUgbGV0dGVyIG11c3QgYmUKLW9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlR9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLQotT24gdGhlIEhQUEEgYXJjaGl0ZWN0dXJlLCB0aGUgbGV0dGVyIG11c3QgYmUgQHNhbXB7RX0gKHVwcGVyIGNhc2Ugb25seSkuCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgQTI5SwotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUlN9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBIOAotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLVRoZSBsZXR0ZXIgQHNhbXB7RX0gKHVwcGVyIGNhc2Ugb25seSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGVH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBzaWduOiBlaXRoZXIgQHNhbXB7K30gb3IgQHNhbXB7LX0uCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBAZGZue2ludGVnZXIgcGFydH06IHplcm8gb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLQotQGl0ZW0KLUFuIG9wdGlvbmFsIEBkZm57ZnJhY3Rpb25hbCBwYXJ0fTogQHNhbXB7Ln0gZm9sbG93ZWQgYnkgemVybwotb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLQotQGl0ZW0KLUFuIG9wdGlvbmFsIGV4cG9uZW50LCBjb25zaXN0aW5nIG9mOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQW4gQHNhbXB7RX0gb3IgQHNhbXB7ZX0uCi1AYyBJIGNhbid0IGZpbmQgYSBjb25maWcgd2hlcmUgIkVYUF9DSEFSUyIgaXMgb3RoZXIgdGhhbiAnZUUnLCBidXQgaW4KLUBjIHByaW5jaXBsZSB0aGlzIGNhbiBwZXJmZWN0bHkgd2VsbCBiZSBkaWZmZXJlbnQgb24gZGlmZmVyZW50IHRhcmdldHMuCi1AaXRlbQotT3B0aW9uYWwgc2lnbjogZWl0aGVyIEBzYW1weyt9IG9yIEBzYW1wey19LgotQGl0ZW0KLU9uZSBvciBtb3JlIGRlY2ltYWwgZGlnaXRzLgotQGVuZCBpdGVtaXplCi0KLUBlbmQgaXRlbWl6ZQotCi1BdCBsZWFzdCBvbmUgb2YgdGhlIGludGVnZXIgcGFydCBvciB0aGUgZnJhY3Rpb25hbCBwYXJ0IG11c3QgYmUKLXByZXNlbnQuICBUaGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGhhcyB0aGUgdXN1YWwgYmFzZS0xMCB2YWx1ZS4KLQotQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBhbGwgcHJvY2Vzc2luZyB1c2luZyBpbnRlZ2Vycy4gIEZsb251bXMgYXJlIGNvbXB1dGVkCi1pbmRlcGVuZGVudGx5IG9mIGFueSBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSBpbiB0aGUgY29tcHV0ZXIgcnVubmluZwotQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJOTYwCi1AYyBCaXQgZmllbGRzIGFyZSB3cml0dGVuIGFzIGEgZ2VuZXJhbCBmYWNpbGl0eSBidXQgYXJlIGFsc28gY29udHJvbGxlZAotQGMgYnkgYSBjb25kaXRpb25hbC1jb21waWxhdGlvbiBmbGFnLS0td2hpY2ggaXMgYXMgb2Ygbm93ICgyMW1hcjkxKQotQGMgdHVybmVkIG9uIG9ubHkgYnkgdGhlIGk5NjAgY29uZmlnIG9mIEdBUy4KLUBub2RlIEJpdCBGaWVsZHMKLUBzdWJzdWJzZWN0aW9uIEJpdCBGaWVsZHMKLQotQGNpbmRleCBiaXQgZmllbGRzCi1AY2luZGV4IGNvbnN0YW50cywgYml0IGZpZWxkCi1Zb3UgY2FuIGFsc28gZGVmaW5lIG51bWVyaWMgY29uc3RhbnRzIGFzIEBkZm57Yml0IGZpZWxkc30uCi1zcGVjaWZ5IHR3byBudW1iZXJzIHNlcGFyYXRlZCBieSBhIGNvbG9uLS0tCi1AZXhhbXBsZQotQHZhcnttYXNrfTpAdmFye3ZhbHVlfQotQGVuZCBleGFtcGxlCi1Abm9pbmRlbnQKLUBjb2Rle0B2YWx1ZXtBU319IGFwcGxpZXMgYSBiaXR3aXNlIEBzY3thbmR9IGJldHdlZW4gQHZhcnttYXNrfSBhbmQKLUB2YXJ7dmFsdWV9LgotCi1UaGUgcmVzdWx0aW5nIG51bWJlciBpcyB0aGVuIHBhY2tlZAotQGlmc2V0IEdFTkVSSUMKLUBjIHRoaXMgY29uZGl0aW9uYWwgcGFyZW4gaW4gY2FzZSBiaXQgZmllbGRzIHR1cm5lZCBvbiBlbHNld2hlcmUgdGhhbiA5NjAKLShpbiBob3N0LWRlcGVuZGVudCBieXRlIG9yZGVyKQotQGVuZCBpZnNldAotaW50byBhIGZpZWxkIHdob3NlIHdpZHRoIGRlcGVuZHMgb24gd2hpY2ggYXNzZW1ibGVyIGRpcmVjdGl2ZSBoYXMgdGhlCi1iaXQtZmllbGQgYXMgaXRzIGFyZ3VtZW50LiAgT3ZlcmZsb3cgKGEgcmVzdWx0IGZyb20gdGhlIGJpdHdpc2UgYW5kCi1yZXF1aXJpbmcgbW9yZSBiaW5hcnkgZGlnaXRzIHRvIHJlcHJlc2VudCkgaXMgbm90IGFuIGVycm9yOyBpbnN0ZWFkLAotbW9yZSBjb25zdGFudHMgYXJlIGdlbmVyYXRlZCwgb2YgdGhlIHNwZWNpZmllZCB3aWR0aCwgYmVnaW5uaW5nIHdpdGggdGhlCi1sZWFzdCBzaWduaWZpY2FudCBkaWdpdHMuQHJlZmlsbAotCi1UaGUgZGlyZWN0aXZlcyBAY29kZXsuYnl0ZX0sIEBjb2Rley5od29yZH0sIEBjb2Rley5pbnR9LCBAY29kZXsubG9uZ30sCi1AY29kZXsuc2hvcnR9LCBhbmQgQGNvZGV7LndvcmR9IGFjY2VwdCBiaXQtZmllbGQgYXJndW1lbnRzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIFNlY3Rpb25zCi1AY2hhcHRlciBTZWN0aW9ucyBhbmQgUmVsb2NhdGlvbgotQGNpbmRleCBzZWN0aW9ucwotQGNpbmRleCByZWxvY2F0aW9uCi0KLUBtZW51Ci0qIFNlY3MgQmFja2dyb3VuZDo6ICAgICAgICAgICAgIEJhY2tncm91bmQKLSogTGQgU2VjdGlvbnM6OiAgICAgICAgICAgICAgICAgTGlua2VyIFNlY3Rpb25zCi0qIEFzIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgIEFzc2VtYmxlciBJbnRlcm5hbCBTZWN0aW9ucwotKiBTdWItU2VjdGlvbnM6OiAgICAgICAgICAgICAgICBTdWItU2VjdGlvbnMKLSogYnNzOjogICAgICAgICAgICAgICAgICAgICAgICAgYnNzIFNlY3Rpb24KLUBlbmQgbWVudQotCi1Abm9kZSBTZWNzIEJhY2tncm91bmQKLUBzZWN0aW9uIEJhY2tncm91bmQKLQotUm91Z2hseSwgYSBzZWN0aW9uIGlzIGEgcmFuZ2Ugb2YgYWRkcmVzc2VzLCB3aXRoIG5vIGdhcHM7IGFsbCBkYXRhCi1gYGluJycgdGhvc2UgYWRkcmVzc2VzIGlzIHRyZWF0ZWQgdGhlIHNhbWUgZm9yIHNvbWUgcGFydGljdWxhciBwdXJwb3NlLgotRm9yIGV4YW1wbGUgdGhlcmUgbWF5IGJlIGEgYGByZWFkIG9ubHknJyBzZWN0aW9uLgotCi1AY2luZGV4IGxpbmtlciwgYW5kIGFzc2VtYmxlcgotQGNpbmRleCBhc3NlbWJsZXIsIGFuZCBsaW5rZXIKLVRoZSBsaW5rZXIgQGNvZGV7QHZhbHVle0xEfX0gcmVhZHMgbWFueSBvYmplY3QgZmlsZXMgKHBhcnRpYWwgcHJvZ3JhbXMpIGFuZAotY29tYmluZXMgdGhlaXIgY29udGVudHMgdG8gZm9ybSBhIHJ1bm5hYmxlIHByb2dyYW0uICBXaGVuIEBjb2Rle0B2YWx1ZXtBU319Ci1lbWl0cyBhbiBvYmplY3QgZmlsZSwgdGhlIHBhcnRpYWwgcHJvZ3JhbSBpcyBhc3N1bWVkIHRvIHN0YXJ0IGF0IGFkZHJlc3MgMC4KLUBjb2Rle0B2YWx1ZXtMRH19IGFzc2lnbnMgdGhlIGZpbmFsIGFkZHJlc3NlcyBmb3IgdGhlIHBhcnRpYWwgcHJvZ3JhbSwgc28gdGhhdAotZGlmZmVyZW50IHBhcnRpYWwgcHJvZ3JhbXMgZG8gbm90IG92ZXJsYXAuICBUaGlzIGlzIGFjdHVhbGx5IGFuCi1vdmVyc2ltcGxpZmljYXRpb24sIGJ1dCBpdCBzdWZmaWNlcyB0byBleHBsYWluIGhvdyBAY29kZXtAdmFsdWV7QVN9fSB1c2VzCi1zZWN0aW9ucy4KLQotQGNvZGV7QHZhbHVle0xEfX0gbW92ZXMgYmxvY2tzIG9mIGJ5dGVzIG9mIHlvdXIgcHJvZ3JhbSB0byB0aGVpciBydW4tdGltZQotYWRkcmVzc2VzLiAgVGhlc2UgYmxvY2tzIHNsaWRlIHRvIHRoZWlyIHJ1bi10aW1lIGFkZHJlc3NlcyBhcyByaWdpZAotdW5pdHM7IHRoZWlyIGxlbmd0aCBkb2VzIG5vdCBjaGFuZ2UgYW5kIG5laXRoZXIgZG9lcyB0aGUgb3JkZXIgb2YgYnl0ZXMKLXdpdGhpbiB0aGVtLiAgU3VjaCBhIHJpZ2lkIHVuaXQgaXMgY2FsbGVkIGEgQGVtcGh7c2VjdGlvbn0uICBBc3NpZ25pbmcKLXJ1bi10aW1lIGFkZHJlc3NlcyB0byBzZWN0aW9ucyBpcyBjYWxsZWQgQGRmbntyZWxvY2F0aW9ufS4gIEl0IGluY2x1ZGVzCi10aGUgdGFzayBvZiBhZGp1c3RpbmcgbWVudGlvbnMgb2Ygb2JqZWN0LWZpbGUgYWRkcmVzc2VzIHNvIHRoZXkgcmVmZXIgdG8KLXRoZSBwcm9wZXIgcnVuLXRpbWUgYWRkcmVzc2VzLgotQGlmc2V0IEg4Ci1Gb3IgdGhlIEg4LzMwMCBhbmQgSDgvNTAwLAotYW5kIGZvciB0aGUgSGl0YWNoaSBTSCwKLUBjb2Rle0B2YWx1ZXtBU319IHBhZHMgc2VjdGlvbnMgaWYgbmVlZGVkIHRvCi1lbnN1cmUgdGhleSBlbmQgb24gYSB3b3JkIChzaXh0ZWVuIGJpdCkgYm91bmRhcnkuCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggc3RhbmRhcmQgYXNzZW1ibGVyIHNlY3Rpb25zCi1BbiBvYmplY3QgZmlsZSB3cml0dGVuIGJ5IEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhdCBsZWFzdCB0aHJlZSBzZWN0aW9ucywgYW55Ci1vZiB3aGljaCBtYXkgYmUgZW1wdHkuICBUaGVzZSBhcmUgbmFtZWQgQGRmbnt0ZXh0fSwgQGRmbntkYXRhfSBhbmQKLUBkZm57YnNzfSBzZWN0aW9ucy4KLQotQGlmc2V0IENPRkYKLUBpZnNldCBHRU5FUklDCi1XaGVuIGl0IGdlbmVyYXRlcyBDT0ZGIG91dHB1dCwKLUBlbmQgaWZzZXQKLUBjb2Rle0B2YWx1ZXtBU319IGNhbiBhbHNvIGdlbmVyYXRlIHdoYXRldmVyIG90aGVyIG5hbWVkIHNlY3Rpb25zIHlvdSBzcGVjaWZ5Ci11c2luZyB0aGUgQHNhbXB7LnNlY3Rpb259IGRpcmVjdGl2ZSAoQHB4cmVme1NlY3Rpb24sLEBjb2Rley5zZWN0aW9ufX0pLgotSWYgeW91IGRvIG5vdCB1c2UgYW55IGRpcmVjdGl2ZXMgdGhhdCBwbGFjZSBvdXRwdXQgaW4gdGhlIEBzYW1wey50ZXh0fQotb3IgQHNhbXB7LmRhdGF9IHNlY3Rpb25zLCB0aGVzZSBzZWN0aW9ucyBzdGlsbCBleGlzdCwgYnV0IGFyZSBlbXB0eS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLUBpZnNldCBHRU5FUklDCi1XaGVuIEBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBTT00gb3IgRUxGIG91dHB1dCBmb3IgdGhlIEhQUEEsCi1AZW5kIGlmc2V0Ci1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYWxzbyBnZW5lcmF0ZSB3aGF0ZXZlciBvdGhlciBuYW1lZCBzZWN0aW9ucyB5b3UKLXNwZWNpZnkgdXNpbmcgdGhlIEBzYW1wey5zcGFjZX0gYW5kIEBzYW1wey5zdWJzcGFjZX0gZGlyZWN0aXZlcy4gIFNlZQotQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAgQXNzZW1ibHkgTGFuZ3VhZ2UgUmVmZXJlbmNlIE1hbnVhbH0KLShIUCA5MjQzMi05MDAwMSkgZm9yIGRldGFpbHMgb24gdGhlIEBzYW1wey5zcGFjZX0gYW5kIEBzYW1wey5zdWJzcGFjZX0KLWFzc2VtYmxlciBkaXJlY3RpdmVzLgotCi1AaWZzZXQgU09NCi1BZGRpdGlvbmFsbHksIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgc3RhbmRhcmQKLXRleHQsIGRhdGEsIGFuZCBic3Mgc2VjdGlvbnMgd2hlbiBnZW5lcmF0aW5nIFNPTSBvdXRwdXQuICBQcm9ncmFtIHRleHQKLWlzIHBsYWNlZCBpbnRvIHRoZSBAc2FtcHskQ09ERSR9IHNlY3Rpb24sIGRhdGEgaW50byBAc2FtcHskREFUQSR9LCBhbmQKLUJTUyBpbnRvIEBzYW1weyRCU1MkfS4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotV2l0aGluIHRoZSBvYmplY3QgZmlsZSwgdGhlIHRleHQgc2VjdGlvbiBzdGFydHMgYXQgYWRkcmVzcyBAY29kZXswfSwgdGhlCi1kYXRhIHNlY3Rpb24gZm9sbG93cywgYW5kIHRoZSBic3Mgc2VjdGlvbiBmb2xsb3dzIHRoZSBkYXRhIHNlY3Rpb24uCi0KLUBpZnNldCBIUFBBCi1XaGVuIGdlbmVyYXRpbmcgZWl0aGVyIFNPTSBvciBFTEYgb3V0cHV0IGZpbGVzIG9uIHRoZSBIUFBBLCB0aGUgdGV4dAotc2VjdGlvbiBzdGFydHMgYXQgYWRkcmVzcyBAY29kZXswfSwgdGhlIGRhdGEgc2VjdGlvbiBhdCBhZGRyZXNzCi1AY29kZXsweDQwMDAwMDB9LCBhbmQgdGhlIGJzcyBzZWN0aW9uIGZvbGxvd3MgdGhlIGRhdGEgc2VjdGlvbi4KLUBlbmQgaWZzZXQKLQotVG8gbGV0IEBjb2Rle0B2YWx1ZXtMRH19IGtub3cgd2hpY2ggZGF0YSBjaGFuZ2VzIHdoZW4gdGhlIHNlY3Rpb25zIGFyZQotcmVsb2NhdGVkLCBhbmQgaG93IHRvIGNoYW5nZSB0aGF0IGRhdGEsIEBjb2Rle0B2YWx1ZXtBU319IGFsc28gd3JpdGVzIHRvIHRoZQotb2JqZWN0IGZpbGUgZGV0YWlscyBvZiB0aGUgcmVsb2NhdGlvbiBuZWVkZWQuICBUbyBwZXJmb3JtIHJlbG9jYXRpb24KLUBjb2Rle0B2YWx1ZXtMRH19IG11c3Qga25vdywgZWFjaCB0aW1lIGFuIGFkZHJlc3MgaW4gdGhlIG9iamVjdAotZmlsZSBpcyBtZW50aW9uZWQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotV2hlcmUgaW4gdGhlIG9iamVjdCBmaWxlIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyByZWZlcmVuY2UgdG8KLWFuIGFkZHJlc3M/Ci1AaXRlbQotSG93IGxvbmcgKGluIGJ5dGVzKSBpcyB0aGlzIHJlZmVyZW5jZT8KLUBpdGVtCi1XaGljaCBzZWN0aW9uIGRvZXMgdGhlIGFkZHJlc3MgcmVmZXIgdG8/ICBXaGF0IGlzIHRoZSBudW1lcmljIHZhbHVlIG9mCi1AZGlzcGxheQotKEB2YXJ7YWRkcmVzc30pIEBtaW51c3t9IChAdmFye3N0YXJ0LWFkZHJlc3Mgb2Ygc2VjdGlvbn0pPwotQGVuZCBkaXNwbGF5Ci1AaXRlbQotSXMgdGhlIHJlZmVyZW5jZSB0byBhbiBhZGRyZXNzIGBgUHJvZ3JhbS1Db3VudGVyIHJlbGF0aXZlJyc/Ci1AZW5kIGl0ZW1pemUKLQotQGNpbmRleCBhZGRyZXNzZXMsIGZvcm1hdCBvZgotQGNpbmRleCBzZWN0aW9uLXJlbGF0aXZlIGFkZHJlc3NpbmcKLUluIGZhY3QsIGV2ZXJ5IGFkZHJlc3MgQGNvZGV7QHZhbHVle0FTfX0gZXZlciB1c2VzIGlzIGV4cHJlc3NlZCBhcwotQGRpc3BsYXkKLShAdmFye3NlY3Rpb259KSArIChAdmFye29mZnNldCBpbnRvIHNlY3Rpb259KQotQGVuZCBkaXNwbGF5Ci1Abm9pbmRlbnQKLUZ1cnRoZXIsIG1vc3QgZXhwcmVzc2lvbnMgQGNvZGV7QHZhbHVle0FTfX0gY29tcHV0ZXMgaGF2ZSB0aGlzIHNlY3Rpb24tcmVsYXRpdmUKLW5hdHVyZS4KLUBpZnNldCBTT00KLShGb3Igc29tZSBvYmplY3QgZm9ybWF0cywgc3VjaCBhcyBTT00gZm9yIHRoZSBIUFBBLCBzb21lIGV4cHJlc3Npb25zIGFyZQotc3ltYm9sLXJlbGF0aXZlIGluc3RlYWQuKQotQGVuZCBpZnNldAotCi1JbiB0aGlzIG1hbnVhbCB3ZSB1c2UgdGhlIG5vdGF0aW9uIEB7QHZhcntzZWNuYW1lfSBAdmFye059QH0gdG8gbWVhbiBgYG9mZnNldAotQHZhcntOfSBpbnRvIHNlY3Rpb24gQHZhcntzZWNuYW1lfS4nJwotCi1BcGFydCBmcm9tIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB5b3UgbmVlZCB0byBrbm93IGFib3V0IHRoZQotQGRmbnthYnNvbHV0ZX0gc2VjdGlvbi4gIFdoZW4gQGNvZGV7QHZhbHVle0xEfX0gbWl4ZXMgcGFydGlhbCBwcm9ncmFtcywKLWFkZHJlc3NlcyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiByZW1haW4gdW5jaGFuZ2VkLiAgRm9yIGV4YW1wbGUsIGFkZHJlc3MKLUBjb2Rle0B7YWJzb2x1dGUgMEB9fSBpcyBgYHJlbG9jYXRlZCcnIHRvIHJ1bi10aW1lIGFkZHJlc3MgMCBieQotQGNvZGV7QHZhbHVle0xEfX0uICBBbHRob3VnaCB0aGUgbGlua2VyIG5ldmVyIGFycmFuZ2VzIHR3byBwYXJ0aWFsIHByb2dyYW1zJwotZGF0YSBzZWN0aW9ucyB3aXRoIG92ZXJsYXBwaW5nIGFkZHJlc3NlcyBhZnRlciBsaW5raW5nLCBAZW1waHtieSBkZWZpbml0aW9ufQotdGhlaXIgYWJzb2x1dGUgc2VjdGlvbnMgbXVzdCBvdmVybGFwLiAgQWRkcmVzcyBAY29kZXtAe2Fic29sdXRlQCAyMzlAfX0gaW4gb25lCi1wYXJ0IG9mIGEgcHJvZ3JhbSBpcyBhbHdheXMgdGhlIHNhbWUgYWRkcmVzcyB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcgYXMKLWFkZHJlc3MgQGNvZGV7QHthYnNvbHV0ZUAgMjM5QH19IGluIGFueSBvdGhlciBwYXJ0IG9mIHRoZSBwcm9ncmFtLgotCi1UaGUgaWRlYSBvZiBzZWN0aW9ucyBpcyBleHRlbmRlZCB0byB0aGUgQGRmbnt1bmRlZmluZWR9IHNlY3Rpb24uICBBbnkKLWFkZHJlc3Mgd2hvc2Ugc2VjdGlvbiBpcyB1bmtub3duIGF0IGFzc2VtYmx5IHRpbWUgaXMgYnkgZGVmaW5pdGlvbgotcmVuZGVyZWQgQHt1bmRlZmluZWQgQHZhcntVfUB9LS0td2hlcmUgQHZhcntVfSBpcyBmaWxsZWQgaW4gbGF0ZXIuCi1TaW5jZSBudW1iZXJzIGFyZSBhbHdheXMgZGVmaW5lZCwgdGhlIG9ubHkgd2F5IHRvIGdlbmVyYXRlIGFuIHVuZGVmaW5lZAotYWRkcmVzcyBpcyB0byBtZW50aW9uIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBBIHJlZmVyZW5jZSB0byBhIG5hbWVkCi1jb21tb24gYmxvY2sgd291bGQgYmUgc3VjaCBhIHN5bWJvbDogaXRzIHZhbHVlIGlzIHVua25vd24gYXQgYXNzZW1ibHkKLXRpbWUgc28gaXQgaGFzIHNlY3Rpb24gQGVtcGh7dW5kZWZpbmVkfS4KLQotQnkgYW5hbG9neSB0aGUgd29yZCBAZW1waHtzZWN0aW9ufSBpcyB1c2VkIHRvIGRlc2NyaWJlIGdyb3VwcyBvZiBzZWN0aW9ucyBpbgotdGhlIGxpbmtlZCBwcm9ncmFtLiAgQGNvZGV7QHZhbHVle0xEfX0gcHV0cyBhbGwgcGFydGlhbCBwcm9ncmFtcycgdGV4dAotc2VjdGlvbnMgaW4gY29udGlndW91cyBhZGRyZXNzZXMgaW4gdGhlIGxpbmtlZCBwcm9ncmFtLiAgSXQgaXMKLWN1c3RvbWFyeSB0byByZWZlciB0byB0aGUgQGVtcGh7dGV4dCBzZWN0aW9ufSBvZiBhIHByb2dyYW0sIG1lYW5pbmcgYWxsCi10aGUgYWRkcmVzc2VzIG9mIGFsbCBwYXJ0aWFsIHByb2dyYW1zJyB0ZXh0IHNlY3Rpb25zLiAgTGlrZXdpc2UgZm9yCi1kYXRhIGFuZCBic3Mgc2VjdGlvbnMuCi0KLVNvbWUgc2VjdGlvbnMgYXJlIG1hbmlwdWxhdGVkIGJ5IEBjb2Rle0B2YWx1ZXtMRH19OyBvdGhlcnMgYXJlIGludmVudGVkIGZvcgotdXNlIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFuZCBoYXZlIG5vIG1lYW5pbmcgZXhjZXB0IGR1cmluZyBhc3NlbWJseS4KLQotQG5vZGUgTGQgU2VjdGlvbnMKLUBzZWN0aW9uIExpbmtlciBTZWN0aW9ucwotQGNvZGV7QHZhbHVle0xEfX0gZGVhbHMgd2l0aCBqdXN0IGZvdXIga2luZHMgb2Ygc2VjdGlvbnMsIHN1bW1hcml6ZWQgYmVsb3cuCi0KLUB0YWJsZSBAc3Ryb25nCi0KLUBpZnNldCBDT0ZGCi1AY2luZGV4IG5hbWVkIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zLCBuYW1lZAotQGl0ZW0gbmFtZWQgc2VjdGlvbnMKLUBlbmQgaWZzZXQKLUBpZnNldCBhb3V0LWJvdXQKLUBjaW5kZXggdGV4dCBzZWN0aW9uCi1AY2luZGV4IGRhdGEgc2VjdGlvbgotQGl0ZW14IHRleHQgc2VjdGlvbgotQGl0ZW14IGRhdGEgc2VjdGlvbgotQGVuZCBpZnNldAotVGhlc2Ugc2VjdGlvbnMgaG9sZCB5b3VyIHByb2dyYW0uICBAY29kZXtAdmFsdWV7QVN9fSBhbmQgQGNvZGV7QHZhbHVle0xEfX0gdHJlYXQgdGhlbSBhcwotc2VwYXJhdGUgYnV0IGVxdWFsIHNlY3Rpb25zLiAgQW55dGhpbmcgeW91IGNhbiBzYXkgb2Ygb25lIHNlY3Rpb24gaXMKLXRydWUgYW5vdGhlci4KLUBpZnNldCBhb3V0LWJvdXQKLVdoZW4gdGhlIHByb2dyYW0gaXMgcnVubmluZywgaG93ZXZlciwgaXQgaXMKLWN1c3RvbWFyeSBmb3IgdGhlIHRleHQgc2VjdGlvbiB0byBiZSB1bmFsdGVyYWJsZS4gIFRoZQotdGV4dCBzZWN0aW9uIGlzIG9mdGVuIHNoYXJlZCBhbW9uZyBwcm9jZXNzZXM6IGl0IGNvbnRhaW5zCi1pbnN0cnVjdGlvbnMsIGNvbnN0YW50cyBhbmQgdGhlIGxpa2UuICBUaGUgZGF0YSBzZWN0aW9uIG9mIGEgcnVubmluZwotcHJvZ3JhbSBpcyB1c3VhbGx5IGFsdGVyYWJsZTogZm9yIGV4YW1wbGUsIEMgdmFyaWFibGVzIHdvdWxkIGJlIHN0b3JlZAotaW4gdGhlIGRhdGEgc2VjdGlvbi4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBic3Mgc2VjdGlvbgotQGl0ZW0gYnNzIHNlY3Rpb24KLVRoaXMgc2VjdGlvbiBjb250YWlucyB6ZXJvZWQgYnl0ZXMgd2hlbiB5b3VyIHByb2dyYW0gYmVnaW5zIHJ1bm5pbmcuICBJdAotaXMgdXNlZCB0byBob2xkIHVuaXRpYWxpemVkIHZhcmlhYmxlcyBvciBjb21tb24gc3RvcmFnZS4gIFRoZSBsZW5ndGggb2YKLWVhY2ggcGFydGlhbCBwcm9ncmFtJ3MgYnNzIHNlY3Rpb24gaXMgaW1wb3J0YW50LCBidXQgYmVjYXVzZSBpdCBzdGFydHMKLW91dCBjb250YWluaW5nIHplcm9lZCBieXRlcyB0aGVyZSBpcyBubyBuZWVkIHRvIHN0b3JlIGV4cGxpY2l0IHplcm8KLWJ5dGVzIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBic3Mgc2VjdGlvbiB3YXMgaW52ZW50ZWQgdG8gZWxpbWluYXRlCi10aG9zZSBleHBsaWNpdCB6ZXJvcyBmcm9tIG9iamVjdCBmaWxlcy4KLQotQGNpbmRleCBhYnNvbHV0ZSBzZWN0aW9uCi1AaXRlbSBhYnNvbHV0ZSBzZWN0aW9uCi1BZGRyZXNzIDAgb2YgdGhpcyBzZWN0aW9uIGlzIGFsd2F5cyBgYHJlbG9jYXRlZCcnIHRvIHJ1bnRpbWUgYWRkcmVzcyAwLgotVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmVmZXIgdG8gYW4gYWRkcmVzcyB0aGF0IEBjb2Rle0B2YWx1ZXtMRH19IG11c3QKLW5vdCBjaGFuZ2Ugd2hlbiByZWxvY2F0aW5nLiAgSW4gdGhpcyBzZW5zZSB3ZSBzcGVhayBvZiBhYnNvbHV0ZQotYWRkcmVzc2VzIGJlaW5nIGBgdW5yZWxvY2F0YWJsZScnOiB0aGV5IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHJlbG9jYXRpb24uCi0KLUBjaW5kZXggdW5kZWZpbmVkIHNlY3Rpb24KLUBpdGVtIHVuZGVmaW5lZCBzZWN0aW9uCi1UaGlzIGBgc2VjdGlvbicnIGlzIGEgY2F0Y2gtYWxsIGZvciBhZGRyZXNzIHJlZmVyZW5jZXMgdG8gb2JqZWN0cyBub3QgaW4KLXRoZSBwcmVjZWRpbmcgc2VjdGlvbnMuCi1AYyBGSVhNRTogcmVmIHRvIHNvbWUgb3RoZXIgZG9jIG9uIG9iai1maWxlIGZvcm1hdHMgY291bGQgZ28gaGVyZS4KLUBlbmQgdGFibGUKLQotQGNpbmRleCByZWxvY2F0aW9uIGV4YW1wbGUKLUFuIGlkZWFsaXplZCBleGFtcGxlIG9mIHRocmVlIHJlbG9jYXRhYmxlIHNlY3Rpb25zIGZvbGxvd3MuCi1AaWZzZXQgQ09GRgotVGhlIGV4YW1wbGUgdXNlcyB0aGUgdHJhZGl0aW9uYWwgc2VjdGlvbiBuYW1lcyBAc2FtcHsudGV4dH0gYW5kIEBzYW1wey5kYXRhfS4KLUBlbmQgaWZzZXQKLU1lbW9yeSBhZGRyZXNzZXMgYXJlIG9uIHRoZSBob3Jpem9udGFsIGF4aXMuCi0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgICAgICArLS0tLS0rLS0tLSstLSsKLXBhcnRpYWwgcHJvZ3JhbSAjIDE6ICB8dHR0dHR8ZGRkZHwwMHwKLSAgICAgICAgICAgICAgICAgICAgICArLS0tLS0rLS0tLSstLSsKLQotICAgICAgICAgICAgICAgICAgICAgIHRleHQgICBkYXRhIGJzcwotICAgICAgICAgICAgICAgICAgICAgIHNlZy4gICBzZWcuIHNlZy4KLQotICAgICAgICAgICAgICAgICAgICAgICstLS0rLS0tKy0tLSsKLXBhcnRpYWwgcHJvZ3JhbSAjIDI6ICB8VFRUfERERHwwMDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tLSstLS0rLS0tKwotCi0gICAgICAgICAgICAgICAgICAgICAgKy0tKy0tLSstLS0tLSstLSstLS0tKy0tLSstLS0tLSt+fgotbGlua2VkIHByb2dyYW06ICAgICAgIHwgIHxUVFR8dHR0dHR8ICB8ZGRkZHxERER8MDAwMDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tKy0tLSstLS0tLSstLSstLS0tKy0tLSstLS0tLSt+fgotCi0gICAgYWRkcmVzc2VzOiAgICAgICAgMCBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AbmVlZCA1MDAwCi1AdGV4Ci0KLVxsaW5le1xpdCBQYXJ0aWFsIHByb2dyYW0gXCMxOiBcaGZpbH0KLVxsaW5le1xpYm94ezIuNWNtfXtcdHQgdGV4dH1caWJveHsyY219e1x0dCBkYXRhfVxpYm94ezFjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsyLjVjbX17XHR0IHR0dHR0fVxib3hpdHsyY219e1x0dCBkZGRkfVxib3hpdHsxY219e1x0dCAwMH1caGZpbH0KLQotXGxpbmV7XGl0IFBhcnRpYWwgcHJvZ3JhbSBcIzI6IFxoZmlsfQotXGxpbmV7XGlib3h7MWNtfXtcdHQgdGV4dH1caWJveHsxLjVjbX17XHR0IGRhdGF9XGlib3h7MWNtfXtcdHQgYnNzfVxoZmlsfQotXGxpbmV7XGJveGl0ezFjbX17XHR0IFRUVH1cYm94aXR7MS41Y219e1x0dCBEREREfVxib3hpdHsxY219e1x0dCAwMDB9XGhmaWx9Ci0KLVxsaW5le1xpdCBsaW5rZWQgcHJvZ3JhbTogXGhmaWx9Ci1cbGluZXtcaWJveHsuNWNtfXt9XGlib3h7MWNtfXtcdHQgdGV4dH1caWJveHsyLjVjbX17fVxpYm94ey43NWNtfXt9XGlib3h7MmNtfXtcdHQgZGF0YX1caWJveHsxLjVjbX17fVxpYm94ezJjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsuNWNtfXt9XGJveGl0ezFjbX17XHR0IFRUVH1cYm94aXR7Mi41Y219e1x0dAotdHR0dHR9XGJveGl0ey43NWNtfXt9XGJveGl0ezJjbX17XHR0IGRkZGR9XGJveGl0ezEuNWNtfXtcdHQKLURERER9XGJveGl0ezJjbX17XHR0IDAwMDAwfVwgXGRvdHNcaGZpbH0KLQotXGxpbmV7XGl0IGFkZHJlc3NlczogXGhmaWx9Ci1cbGluZXswXGRvdHNcaGZpbH0KLQotQGVuZCB0ZXgKLUBjIEVORCBURVhJMlJPRkYtS0lMTAotCi1Abm9kZSBBcyBTZWN0aW9ucwotQHNlY3Rpb24gQXNzZW1ibGVyIEludGVybmFsIFNlY3Rpb25zCi0KLUBjaW5kZXggaW50ZXJuYWwgYXNzZW1ibGVyIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zIGluIG1lc3NhZ2VzLCBpbnRlcm5hbAotVGhlc2Ugc2VjdGlvbnMgYXJlIG1lYW50IG9ubHkgZm9yIHRoZSBpbnRlcm5hbCB1c2Ugb2YgQGNvZGV7QHZhbHVle0FTfX0uICBUaGV5Ci1oYXZlIG5vIG1lYW5pbmcgYXQgcnVuLXRpbWUuICBZb3UgZG8gbm90IHJlYWxseSBuZWVkIHRvIGtub3cgYWJvdXQgdGhlc2UKLXNlY3Rpb25zIGZvciBtb3N0IHB1cnBvc2VzOyBidXQgdGhleSBjYW4gYmUgbWVudGlvbmVkIGluIEBjb2Rle0B2YWx1ZXtBU319Ci13YXJuaW5nIG1lc3NhZ2VzLCBzbyBpdCBtaWdodCBiZSBoZWxwZnVsIHRvIGhhdmUgYW4gaWRlYSBvZiB0aGVpcgotbWVhbmluZ3MgdG8gQGNvZGV7QHZhbHVle0FTfX0uICBUaGVzZSBzZWN0aW9ucyBhcmUgdXNlZCB0byBwZXJtaXQgdGhlCi12YWx1ZSBvZiBldmVyeSBleHByZXNzaW9uIGluIHlvdXIgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbSB0byBiZSBhCi1zZWN0aW9uLXJlbGF0aXZlIGFkZHJlc3MuCi0KLUB0YWJsZSBAYgotQGNpbmRleCBhc3NlbWJsZXIgaW50ZXJuYWwgbG9naWMgZXJyb3IKLUBpdGVtIEFTU0VNQkxFUi1JTlRFUk5BTC1MT0dJQy1FUlJPUiEKLUFuIGludGVybmFsIGFzc2VtYmxlciBsb2dpYyBlcnJvciBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgbWVhbnMgdGhlcmUgaXMgYQotYnVnIGluIHRoZSBhc3NlbWJsZXIuCi0KLUBjaW5kZXggZXhwciAoaW50ZXJuYWwgc2VjdGlvbikKLUBpdGVtIGV4cHIgc2VjdGlvbgotVGhlIGFzc2VtYmxlciBzdG9yZXMgY29tcGxleCBleHByZXNzaW9uIGludGVybmFsbHkgYXMgY29tYmluYXRpb25zIG9mCi1zeW1ib2xzLiAgV2hlbiBpdCBuZWVkcyB0byByZXByZXNlbnQgYW4gZXhwcmVzc2lvbiBhcyBhIHN5bWJvbCwgaXQgcHV0cwotaXQgaW4gdGhlIGV4cHIgc2VjdGlvbi4KLUBjIEZJWE1FIGl0ZW0gZGVidWcKLUBjIEZJWE1FIGl0ZW0gdHJhbnNmZXJbdF0gdmVjdG9yIHByZWxvYWQKLUBjIEZJWE1FIGl0ZW0gdHJhbnNmZXJbdF0gdmVjdG9yIHBvc3Rsb2FkCi1AYyBGSVhNRSBpdGVtIHJlZ2lzdGVyCi1AZW5kIHRhYmxlCi0KLUBub2RlIFN1Yi1TZWN0aW9ucwotQHNlY3Rpb24gU3ViLVNlY3Rpb25zCi0KLUBjaW5kZXggbnVtYmVyZWQgc3Vic2VjdGlvbnMKLUBjaW5kZXggZ3JvdXBpbmcgZGF0YQotQGlmc2V0IGFvdXQtYm91dAotQXNzZW1ibGVkIGJ5dGVzCi1AaWZzZXQgQ09GRgotY29udmVudGlvbmFsbHkKLUBlbmQgaWZzZXQKLWZhbGwgaW50byB0d28gc2VjdGlvbnM6IHRleHQgYW5kIGRhdGEuCi1AZW5kIGlmc2V0Ci1Zb3UgbWF5IGhhdmUgc2VwYXJhdGUgZ3JvdXBzIG9mCi1AaWZzZXQgR0VORVJJQwotZGF0YSBpbiBuYW1lZCBzZWN0aW9ucwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYW91dC1ib3V0Ci1kYXRhIGluIG5hbWVkIHNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBhb3V0LWJvdXQKLXRleHQgb3IgZGF0YQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi10aGF0IHlvdSB3YW50IHRvIGVuZCB1cCBuZWFyIHRvIGVhY2ggb3RoZXIgaW4gdGhlIG9iamVjdCBmaWxlLCBldmVuIHRob3VnaCB0aGV5Ci1hcmUgbm90IGNvbnRpZ3VvdXMgaW4gdGhlIGFzc2VtYmxlciBzb3VyY2UuICBAY29kZXtAdmFsdWV7QVN9fSBhbGxvd3MgeW91IHRvCi11c2UgQGRmbntzdWJzZWN0aW9uc30gZm9yIHRoaXMgcHVycG9zZS4gIFdpdGhpbiBlYWNoIHNlY3Rpb24sIHRoZXJlIGNhbiBiZQotbnVtYmVyZWQgc3Vic2VjdGlvbnMgd2l0aCB2YWx1ZXMgZnJvbSAwIHRvIDgxOTIuICBPYmplY3RzIGFzc2VtYmxlZCBpbnRvIHRoZQotc2FtZSBzdWJzZWN0aW9uIGdvIGludG8gdGhlIG9iamVjdCBmaWxlIHRvZ2V0aGVyIHdpdGggb3RoZXIgb2JqZWN0cyBpbiB0aGUgc2FtZQotc3Vic2VjdGlvbi4gIEZvciBleGFtcGxlLCBhIGNvbXBpbGVyIG1pZ2h0IHdhbnQgdG8gc3RvcmUgY29uc3RhbnRzIGluIHRoZSB0ZXh0Ci1zZWN0aW9uLCBidXQgbWlnaHQgbm90IHdhbnQgdG8gaGF2ZSB0aGVtIGludGVyc3BlcnNlZCB3aXRoIHRoZSBwcm9ncmFtIGJlaW5nCi1hc3NlbWJsZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBjb21waWxlciBjb3VsZCBpc3N1ZSBhIEBzYW1wey50ZXh0IDB9IGJlZm9yZSBlYWNoCi1zZWN0aW9uIG9mIGNvZGUgYmVpbmcgb3V0cHV0LCBhbmQgYSBAc2FtcHsudGV4dCAxfSBiZWZvcmUgZWFjaCBncm91cCBvZgotY29uc3RhbnRzIGJlaW5nIG91dHB1dC4KLQotU3Vic2VjdGlvbnMgYXJlIG9wdGlvbmFsLiAgSWYgeW91IGRvIG5vdCB1c2Ugc3Vic2VjdGlvbnMsIGV2ZXJ5dGhpbmcKLWdvZXMgaW4gc3Vic2VjdGlvbiBudW1iZXIgemVyby4KLQotQGlmc2V0IEdFTkVSSUMKLUVhY2ggc3Vic2VjdGlvbiBpcyB6ZXJvLXBhZGRlZCB1cCB0byBhIG11bHRpcGxlIG9mIGZvdXIgYnl0ZXMuCi0oU3Vic2VjdGlvbnMgbWF5IGJlIHBhZGRlZCBhIGRpZmZlcmVudCBhbW91bnQgb24gZGlmZmVyZW50IGZsYXZvcnMKLW9mIEBjb2Rle0B2YWx1ZXtBU319LikKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOAotT24gdGhlIEg4LzMwMCBhbmQgSDgvNTAwIHBsYXRmb3JtcywgZWFjaCBzdWJzZWN0aW9uIGlzIHplcm8tcGFkZGVkIHRvIGEgd29yZAotYm91bmRhcnkgKHR3byBieXRlcykuCi1UaGUgc2FtZSBpcyB0cnVlIG9uIHRoZSBIaXRhY2hpIFNILgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUBjIEZJWE1FIHNlY3Rpb24gcGFkZGluZyAoYWxpZ25tZW50KT8KLUBjIFJpY2ggUGl4bGV5IHNheXMgcGFkZGluZyBoZXJlIGRlcGVuZHMgb24gdGFyZ2V0IG9iaiBjb2RlIGZvcm1hdDsgdGhhdAotQGMgZG9lc24ndCBzZWVtIHBhcnRpY3VsYXJseSB1c2VmdWwgdG8gc2F5IHdpdGhvdXQgZnVydGhlciBlbGFib3JhdGlvbiwKLUBjIHNvIGZvciBub3cgSSBzYXkgbm90aGluZyBhYm91dCBpdC4gIElmIHRoaXMgaXMgYSBnZW5lcmljIEJGRCBpc3N1ZSwKLUBjIHRoZXNlIHBhcmFncmFwaHMgbWlnaHQgbmVlZCB0byB2YW5pc2ggZnJvbSB0aGlzIG1hbnVhbCwgYW5kIGJlCi1AYyBkaXNjdXNzZWQgaW4gQkZEIGNoYXB0ZXIgb2YgYmludXRpbHMgKG9yIHNvbWUgc3VjaCkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQTI5SwotT24gdGhlIEFNRCAyOUsgZmFtaWx5LCBubyBwYXJ0aWN1bGFyIHBhZGRpbmcgaXMgYWRkZWQgdG8gc2VjdGlvbiBvcgotc3Vic2VjdGlvbiBzaXplczsgQHZhbHVle0FTfSBmb3JjZXMgbm8gYWxpZ25tZW50IG9uIHRoaXMgcGxhdGZvcm0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotU3Vic2VjdGlvbnMgYXBwZWFyIGluIHlvdXIgb2JqZWN0IGZpbGUgaW4gbnVtZXJpYyBvcmRlciwgbG93ZXN0IG51bWJlcmVkCi10byBoaWdoZXN0LiAgKEFsbCB0aGlzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLikKLVRoZSBvYmplY3QgZmlsZSBjb250YWlucyBubyByZXByZXNlbnRhdGlvbiBvZiBzdWJzZWN0aW9uczsgQGNvZGV7QHZhbHVle0xEfX0gYW5kCi1vdGhlciBwcm9ncmFtcyB0aGF0IG1hbmlwdWxhdGUgb2JqZWN0IGZpbGVzIHNlZSBubyB0cmFjZSBvZiB0aGVtLgotVGhleSBqdXN0IHNlZSBhbGwgeW91ciB0ZXh0IHN1YnNlY3Rpb25zIGFzIGEgdGV4dCBzZWN0aW9uLCBhbmQgYWxsIHlvdXIKLWRhdGEgc3Vic2VjdGlvbnMgYXMgYSBkYXRhIHNlY3Rpb24uCi0KLVRvIHNwZWNpZnkgd2hpY2ggc3Vic2VjdGlvbiB5b3Ugd2FudCBzdWJzZXF1ZW50IHN0YXRlbWVudHMgYXNzZW1ibGVkCi1pbnRvLCB1c2UgYSBudW1lcmljIGFyZ3VtZW50IHRvIHNwZWNpZnkgaXQsIGluIGEgQHNhbXB7LnRleHQKLUB2YXJ7ZXhwcmVzc2lvbn19IG9yIGEgQHNhbXB7LmRhdGEgQHZhcntleHByZXNzaW9ufX0gc3RhdGVtZW50LgotQGlmc2V0IENPRkYKLUBpZnNldCBHRU5FUklDCi1XaGVuIGdlbmVyYXRpbmcgQ09GRiBvdXRwdXQsIHlvdQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotWW91Ci1AZW5kIGlmY2xlYXIKLWNhbiBhbHNvIHVzZSBhbiBleHRyYSBzdWJzZWN0aW9uCi1hcmd1bWVudCB3aXRoIGFyYml0cmFyeSBuYW1lZCBzZWN0aW9uczogQHNhbXB7LnNlY3Rpb24gQHZhcntuYW1lfSwKLUB2YXJ7ZXhwcmVzc2lvbn19LgotQGVuZCBpZnNldAotQHZhcntFeHByZXNzaW9ufSBzaG91bGQgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4KLShAeHJlZntFeHByZXNzaW9uc30uKSAgSWYgeW91IGp1c3Qgc2F5IEBzYW1wey50ZXh0fSB0aGVuIEBzYW1wey50ZXh0IDB9Ci1pcyBhc3N1bWVkLiAgTGlrZXdpc2UgQHNhbXB7LmRhdGF9IG1lYW5zIEBzYW1wey5kYXRhIDB9LiAgQXNzZW1ibHkKLWJlZ2lucyBpbiBAY29kZXt0ZXh0IDB9LiAgRm9yIGluc3RhbmNlOgotQHNtYWxsZXhhbXBsZQotLnRleHQgMCAgICAgIyBUaGUgZGVmYXVsdCBzdWJzZWN0aW9uIGlzIHRleHQgMCBhbnl3YXkuCi0uYXNjaWkgIlRoaXMgbGl2ZXMgaW4gdGhlIGZpcnN0IHRleHQgc3Vic2VjdGlvbi4gKiIKLS50ZXh0IDEKLS5hc2NpaSAiQnV0IHRoaXMgbGl2ZXMgaW4gdGhlIHNlY29uZCB0ZXh0IHN1YnNlY3Rpb24uIgotLmRhdGEgMAotLmFzY2lpICJUaGlzIGxpdmVzIGluIHRoZSBkYXRhIHNlY3Rpb24sIgotLmFzY2lpICJpbiB0aGUgZmlyc3QgZGF0YSBzdWJzZWN0aW9uLiIKLS50ZXh0IDAKLS5hc2NpaSAiVGhpcyBsaXZlcyBpbiB0aGUgZmlyc3QgdGV4dCBzZWN0aW9uLCIKLS5hc2NpaSAiaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBhc3RlcmlzayAoKikuIgotQGVuZCBzbWFsbGV4YW1wbGUKLQotRWFjaCBzZWN0aW9uIGhhcyBhIEBkZm57bG9jYXRpb24gY291bnRlcn0gaW5jcmVtZW50ZWQgYnkgb25lIGZvciBldmVyeSBieXRlCi1hc3NlbWJsZWQgaW50byB0aGF0IHNlY3Rpb24uICBCZWNhdXNlIHN1YnNlY3Rpb25zIGFyZSBtZXJlbHkgYSBjb252ZW5pZW5jZQotcmVzdHJpY3RlZCB0byBAY29kZXtAdmFsdWV7QVN9fSB0aGVyZSBpcyBubyBjb25jZXB0IG9mIGEgc3Vic2VjdGlvbiBsb2NhdGlvbgotY291bnRlci4gIFRoZXJlIGlzIG5vIHdheSB0byBkaXJlY3RseSBtYW5pcHVsYXRlIGEgbG9jYXRpb24gY291bnRlci0tLWJ1dCB0aGUKLUBjb2Rley5hbGlnbn0gZGlyZWN0aXZlIGNoYW5nZXMgaXQsIGFuZCBhbnkgbGFiZWwgZGVmaW5pdGlvbiBjYXB0dXJlcyBpdHMKLWN1cnJlbnQgdmFsdWUuICBUaGUgbG9jYXRpb24gY291bnRlciBvZiB0aGUgc2VjdGlvbiB3aGVyZSBzdGF0ZW1lbnRzIGFyZSBiZWluZwotYXNzZW1ibGVkIGlzIHNhaWQgdG8gYmUgdGhlIEBkZm57YWN0aXZlfSBsb2NhdGlvbiBjb3VudGVyLgotCi1Abm9kZSBic3MKLUBzZWN0aW9uIGJzcyBTZWN0aW9uCi0KLUBjaW5kZXggYnNzIHNlY3Rpb24KLUBjaW5kZXggY29tbW9uIHZhcmlhYmxlIHN0b3JhZ2UKLVRoZSBic3Mgc2VjdGlvbiBpcyB1c2VkIGZvciBsb2NhbCBjb21tb24gdmFyaWFibGUgc3RvcmFnZS4KLVlvdSBtYXkgYWxsb2NhdGUgYWRkcmVzcyBzcGFjZSBpbiB0aGUgYnNzIHNlY3Rpb24sIGJ1dCB5b3UgbWF5Ci1ub3QgZGljdGF0ZSBkYXRhIHRvIGxvYWQgaW50byBpdCBiZWZvcmUgeW91ciBwcm9ncmFtIGV4ZWN1dGVzLiAgV2hlbgoteW91ciBwcm9ncmFtIHN0YXJ0cyBydW5uaW5nLCBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBic3MKLXNlY3Rpb24gYXJlIHplcm9lZCBieXRlcy4KLQotVGhlIEBjb2Rley5sY29tbX0gcHNldWRvLW9wIGRlZmluZXMgYSBzeW1ib2wgaW4gdGhlIGJzcyBzZWN0aW9uOyBzZWUKLUByZWZ7TGNvbW0sLEBjb2Rley5sY29tbX19LgotCi1UaGUgQGNvZGV7LmNvbW19IHBzZXVkby1vcCBtYXkgYmUgdXNlZCB0byBkZWNsYXJlIGEgY29tbW9uIHN5bWJvbCwgd2hpY2ggaXMKLWFub3RoZXIgZm9ybSBvZiB1bmluaXRpYWxpemVkIHN5bWJvbDsgc2VlIEB4cmVme0NvbW0sLEBjb2Rley5jb21tfX0uCi0KLUBpZnNldCBHRU5FUklDCi1XaGVuIGFzc2VtYmxpbmcgZm9yIGEgdGFyZ2V0IHdoaWNoIHN1cHBvcnRzIG11bHRpcGxlIHNlY3Rpb25zLCBzdWNoIGFzIEVMRiBvcgotQ09GRiwgeW91IG1heSBzd2l0Y2ggaW50byB0aGUgQGNvZGV7LmJzc30gc2VjdGlvbiBhbmQgZGVmaW5lIHN5bWJvbHMgYXMgdXN1YWw7Ci1zZWUgQHJlZntTZWN0aW9uLCxAY29kZXsuc2VjdGlvbn19LiAgWW91IG1heSBvbmx5IGFzc2VtYmxlIHplcm8gdmFsdWVzIGludG8gdGhlCi1zZWN0aW9uLiAgVHlwaWNhbGx5IHRoZSBzZWN0aW9uIHdpbGwgb25seSBjb250YWluIHN5bWJvbCBkZWZpbml0aW9ucyBhbmQKLUBjb2Rley5za2lwfSBkaXJlY3RpdmVzIChAcHhyZWZ7U2tpcCwsQGNvZGV7LnNraXB9fSkuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFN5bWJvbHMKLUBjaGFwdGVyIFN5bWJvbHMKLQotQGNpbmRleCBzeW1ib2xzCi1TeW1ib2xzIGFyZSBhIGNlbnRyYWwgY29uY2VwdDogdGhlIHByb2dyYW1tZXIgdXNlcyBzeW1ib2xzIHRvIG5hbWUKLXRoaW5ncywgdGhlIGxpbmtlciB1c2VzIHN5bWJvbHMgdG8gbGluaywgYW5kIHRoZSBkZWJ1Z2dlciB1c2VzIHN5bWJvbHMKLXRvIGRlYnVnLgotCi1AcXVvdGF0aW9uCi1AY2luZGV4IGRlYnVnZ2VycywgYW5kIHN5bWJvbCBvcmRlcgotQGVtcGh7V2FybmluZzp9IEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHBsYWNlIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlIGluCi10aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZGVjbGFyZWQuICBUaGlzIG1heSBicmVhayBzb21lIGRlYnVnZ2Vycy4KLUBlbmQgcXVvdGF0aW9uCi0KLUBtZW51Ci0qIExhYmVsczo6ICAgICAgICAgICAgICAgICAgICAgIExhYmVscwotKiBTZXR0aW5nIFN5bWJvbHM6OiAgICAgICAgICAgICBHaXZpbmcgU3ltYm9scyBPdGhlciBWYWx1ZXMKLSogU3ltYm9sIE5hbWVzOjogICAgICAgICAgICAgICAgU3ltYm9sIE5hbWVzCi0qIERvdDo6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBTcGVjaWFsIERvdCBTeW1ib2wKLSogU3ltYm9sIEF0dHJpYnV0ZXM6OiAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBMYWJlbHMKLUBzZWN0aW9uIExhYmVscwotCi1AY2luZGV4IGxhYmVscwotQSBAZGZue2xhYmVsfSBpcyB3cml0dGVuIGFzIGEgc3ltYm9sIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24KLUBzYW1wezp9LiAgVGhlIHN5bWJvbCB0aGVuIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCi1hY3RpdmUgbG9jYXRpb24gY291bnRlciwgYW5kIGlzLCBmb3IgZXhhbXBsZSwgYSBzdWl0YWJsZSBpbnN0cnVjdGlvbgotb3BlcmFuZC4gIFlvdSBhcmUgd2FybmVkIGlmIHlvdSB1c2UgdGhlIHNhbWUgc3ltYm9sIHRvIHJlcHJlc2VudCB0d28KLWRpZmZlcmVudCBsb2NhdGlvbnM6IHRoZSBmaXJzdCBkZWZpbml0aW9uIG92ZXJyaWRlcyBhbnkgb3RoZXIKLWRlZmluaXRpb25zLgotCi1AaWZzZXQgSFBQQQotT24gdGhlIEhQUEEsIHRoZSB1c3VhbCBmb3JtIGZvciBhIGxhYmVsIG5lZWQgbm90IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEKLWNvbG9uLCBidXQgaW5zdGVhZCBtdXN0IHN0YXJ0IGluIGNvbHVtbiB6ZXJvLiAgT25seSBvbmUgbGFiZWwgbWF5IGJlIGRlZmluZWQgb24KLWEgc2luZ2xlIGxpbmUuICBUbyB3b3JrIGFyb3VuZCB0aGlzLCB0aGUgSFBQQSB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFsc28KLXByb3ZpZGVzIGEgc3BlY2lhbCBkaXJlY3RpdmUgQGNvZGV7LmxhYmVsfSBmb3IgZGVmaW5pbmcgbGFiZWxzIG1vcmUgZmxleGlibHkuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFNldHRpbmcgU3ltYm9scwotQHNlY3Rpb24gR2l2aW5nIFN5bWJvbHMgT3RoZXIgVmFsdWVzCi0KLUBjaW5kZXggYXNzaWduaW5nIHZhbHVlcyB0byBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbCB2YWx1ZXMsIGFzc2lnbmluZwotQSBzeW1ib2wgY2FuIGJlIGdpdmVuIGFuIGFyYml0cmFyeSB2YWx1ZSBieSB3cml0aW5nIGEgc3ltYm9sLCBmb2xsb3dlZAotYnkgYW4gZXF1YWxzIHNpZ24gQHNhbXB7PX0sIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24KLShAcHhyZWZ7RXhwcmVzc2lvbnN9KS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB1c2luZyB0aGUgQGNvZGV7LnNldH0KLWRpcmVjdGl2ZS4gIEB4cmVme1NldCwsQGNvZGV7LnNldH19LgotCi1Abm9kZSBTeW1ib2wgTmFtZXMKLUBzZWN0aW9uIFN5bWJvbCBOYW1lcwotCi1AY2luZGV4IHN5bWJvbCBuYW1lcwotQGNpbmRleCBuYW1lcywgc3ltYm9sCi1AaWZjbGVhciBTUEVDSUFMLVNZTVMKLVN5bWJvbCBuYW1lcyBiZWdpbiB3aXRoIGEgbGV0dGVyIG9yIHdpdGggb25lIG9mIEBzYW1wey5ffS4gIE9uIG1vc3QKLW1hY2hpbmVzLCB5b3UgY2FuIGFsc28gdXNlIEBjb2RleyR9IGluIHN5bWJvbCBuYW1lczsgZXhjZXB0aW9ucyBhcmUKLW5vdGVkIGluIEByZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LiAgVGhhdCBjaGFyYWN0ZXIgbWF5IGJlIGZvbGxvd2VkIGJ5IGFueQotc3RyaW5nIG9mIGRpZ2l0cywgbGV0dGVycywgZG9sbGFyIHNpZ25zICh1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkIGluCi1AcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSksIGFuZCB1bmRlcnNjb3Jlcy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEEyOUsKLUZvciB0aGUgQU1EIDI5SyBmYW1pbHksIEBzYW1wez99IGlzIGFsc28gYWxsb3dlZCBpbiB0aGUKLWJvZHkgb2YgYSBzeW1ib2wgbmFtZSwgdGhvdWdoIG5vdCBhdCBpdHMgYmVnaW5uaW5nLgotQGVuZCBpZnNldAotCi1AaWZzZXQgU1BFQ0lBTC1TWU1TCi1AaWZzZXQgSDgKLVN5bWJvbCBuYW1lcyBiZWdpbiB3aXRoIGEgbGV0dGVyIG9yIHdpdGggb25lIG9mIEBzYW1wey5ffS4gIE9uIHRoZQotSGl0YWNoaSBTSCBvciB0aGUKLUg4LzUwMCwgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMuICBUaGF0IGNoYXJhY3RlciBtYXkKLWJlIGZvbGxvd2VkIGJ5IGFueSBzdHJpbmcgb2YgZGlnaXRzLCBsZXR0ZXJzLCBkb2xsYXIgc2lnbnMgKHNhdmUgb24gdGhlCi1IOC8zMDApLCBhbmQgdW5kZXJzY29yZXMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUNhc2Ugb2YgbGV0dGVycyBpcyBzaWduaWZpY2FudDogQGNvZGV7Zm9vfSBpcyBhIGRpZmZlcmVudCBzeW1ib2wgbmFtZQotdGhhbiBAY29kZXtGb299LgotCi1FYWNoIHN5bWJvbCBoYXMgZXhhY3RseSBvbmUgbmFtZS4gIEVhY2ggbmFtZSBpbiBhbiBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtCi1yZWZlcnMgdG8gZXhhY3RseSBvbmUgc3ltYm9sLiAgWW91IG1heSB1c2UgdGhhdCBzeW1ib2wgbmFtZSBhbnkgbnVtYmVyIG9mIHRpbWVzCi1pbiBhIHByb2dyYW0uCi0KLUBzdWJoZWFkaW5nIExvY2FsIFN5bWJvbCBOYW1lcwotCi1AY2luZGV4IGxvY2FsIHN5bWJvbCBuYW1lcwotQGNpbmRleCBzeW1ib2wgbmFtZXMsIGxvY2FsCi1AY2luZGV4IHRlbXBvcmFyeSBzeW1ib2wgbmFtZXMKLUBjaW5kZXggc3ltYm9sIG5hbWVzLCB0ZW1wb3JhcnkKLUxvY2FsIHN5bWJvbHMgaGVscCBjb21waWxlcnMgYW5kIHByb2dyYW1tZXJzIHVzZSBuYW1lcyB0ZW1wb3JhcmlseS4KLVRoZXJlIGFyZSB0ZW4gbG9jYWwgc3ltYm9sIG5hbWVzLCB3aGljaCBhcmUgcmUtdXNlZCB0aHJvdWdob3V0IHRoZQotcHJvZ3JhbS4gIFlvdSBtYXkgcmVmZXIgdG8gdGhlbSB1c2luZyB0aGUgbmFtZXMgQHNhbXB7MH0gQHNhbXB7MX0KLUBkb3Rze30gQHNhbXB7OX0uICBUbyBkZWZpbmUgYSBsb2NhbCBzeW1ib2wsIHdyaXRlIGEgbGFiZWwgb2YgdGhlIGZvcm0KLUBzYW1we0Bie059On0gKHdoZXJlIEBie059IHJlcHJlc2VudHMgYW55IGRpZ2l0KS4gIFRvIHJlZmVyIHRvIHRoZSBtb3N0Ci1yZWNlbnQgcHJldmlvdXMgZGVmaW5pdGlvbiBvZiB0aGF0IHN5bWJvbCB3cml0ZSBAc2FtcHtAYntOfWJ9LCB1c2luZyB0aGUKLXNhbWUgZGlnaXQgYXMgd2hlbiB5b3UgZGVmaW5lZCB0aGUgbGFiZWwuICBUbyByZWZlciB0byB0aGUgbmV4dAotZGVmaW5pdGlvbiBvZiBhIGxvY2FsIGxhYmVsLCB3cml0ZSBAc2FtcHtAYntOfWZ9LS0td2hlcmUgQGJ7Tn0gZ2l2ZXMgeW91Ci1hIGNob2ljZSBvZiAxMCBmb3J3YXJkIHJlZmVyZW5jZXMuICBUaGUgQHNhbXB7Yn0gc3RhbmRzIGZvcgotYGBiYWNrd2FyZHMnJyBhbmQgdGhlIEBzYW1we2Z9IHN0YW5kcyBmb3IgYGBmb3J3YXJkcycnLgotCi1Mb2NhbCBzeW1ib2xzIGFyZSBub3QgZW1pdHRlZCBieSB0aGUgY3VycmVudCBAc2N7Z251fSBDIGNvbXBpbGVyLgotCi1UaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBob3cgeW91IGNhbiB1c2UgdGhlc2UgbGFiZWxzLCBidXQKLXJlbWVtYmVyIHRoYXQgYXQgYW55IHBvaW50IGluIHRoZSBhc3NlbWJseSB5b3UgY2FuIHJlZmVyIHRvIGF0IG1vc3QKLTEwIHByaW9yIGxvY2FsIGxhYmVscyBhbmQgdG8gYXQgbW9zdCAxMCBmb3J3YXJkIGxvY2FsIGxhYmVscy4KLQotTG9jYWwgc3ltYm9sIG5hbWVzIGFyZSBvbmx5IGEgbm90YXRpb24gZGV2aWNlLiAgVGhleSBhcmUgaW1tZWRpYXRlbHkKLXRyYW5zZm9ybWVkIGludG8gbW9yZSBjb252ZW50aW9uYWwgc3ltYm9sIG5hbWVzIGJlZm9yZSB0aGUgYXNzZW1ibGVyCi11c2VzIHRoZW0uICBUaGUgc3ltYm9sIG5hbWVzIHN0b3JlZCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBhcHBlYXJpbmcgaW4KLWVycm9yIG1lc3NhZ2VzIGFuZCBvcHRpb25hbGx5IGVtaXR0ZWQgdG8gdGhlIG9iamVjdCBmaWxlIGhhdmUgdGhlc2UKLXBhcnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEwKLUFsbCBsb2NhbCBsYWJlbHMgYmVnaW4gd2l0aCBAc2FtcHtMfS4gTm9ybWFsbHkgYm90aCBAY29kZXtAdmFsdWV7QVN9fSBhbmQKLUBjb2Rle0B2YWx1ZXtMRH19IGZvcmdldCBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCBAc2FtcHtMfS4gVGhlc2UgbGFiZWxzIGFyZQotdXNlZCBmb3Igc3ltYm9scyB5b3UgYXJlIG5ldmVyIGludGVuZGVkIHRvIHNlZS4gIElmIHlvdSB1c2UgdGhlCi1Ac2FtcHstTH0gb3B0aW9uIHRoZW4gQGNvZGV7QHZhbHVle0FTfX0gcmV0YWlucyB0aGVzZSBzeW1ib2xzIGluIHRoZQotb2JqZWN0IGZpbGUuIElmIHlvdSBhbHNvIGluc3RydWN0IEBjb2Rle0B2YWx1ZXtMRH19IHRvIHJldGFpbiB0aGVzZSBzeW1ib2xzLAoteW91IG1heSB1c2UgdGhlbSBpbiBkZWJ1Z2dpbmcuCi0KLUBpdGVtIEB2YXJ7ZGlnaXR9Ci1JZiB0aGUgbGFiZWwgaXMgd3JpdHRlbiBAc2FtcHswOn0gdGhlbiB0aGUgZGlnaXQgaXMgQHNhbXB7MH0uCi1JZiB0aGUgbGFiZWwgaXMgd3JpdHRlbiBAc2FtcHsxOn0gdGhlbiB0aGUgZGlnaXQgaXMgQHNhbXB7MX0uCi1BbmQgc28gb24gdXAgdGhyb3VnaCBAc2FtcHs5On0uCi0KLUBpdGVtIEBrYmR7Qy1BfQotVGhpcyB1bnVzdWFsIGNoYXJhY3RlciBpcyBpbmNsdWRlZCBzbyB5b3UgZG8gbm90IGFjY2lkZW50YWxseSBpbnZlbnQKLWEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICBUaGUgY2hhcmFjdGVyIGhhcyBBU0NJSSB2YWx1ZQotQHNhbXB7XDAwMX0uCi0KLUBpdGVtIEBlbXBoe29yZGluYWwgbnVtYmVyfQotVGhpcyBpcyBhIHNlcmlhbCBudW1iZXIgdG8ga2VlcCB0aGUgbGFiZWxzIGRpc3RpbmN0LiAgVGhlIGZpcnN0Ci1Ac2FtcHswOn0gZ2V0cyB0aGUgbnVtYmVyIEBzYW1wezF9OyBUaGUgMTV0aCBAc2FtcHswOn0gZ2V0cyB0aGUKLW51bWJlciBAc2FtcHsxNX07IEBlbXBoe2V0Yy59LiAgTGlrZXdpc2UgZm9yIHRoZSBvdGhlciBsYWJlbHMgQHNhbXB7MTp9Ci10aHJvdWdoIEBzYW1wezk6fS4KLUBlbmQgdGFibGUKLQotRm9yIGluc3RhbmNlLCB0aGUgZmlyc3QgQGNvZGV7MTp9IGlzIG5hbWVkIEBjb2Rle0wxQGtiZHtDLUF9MX0sIHRoZSA0NHRoCi1AY29kZXszOn0gaXMgbmFtZWQgQGNvZGV7TDNAa2Jke0MtQX00NH0uCi0KLUBub2RlIERvdAotQHNlY3Rpb24gVGhlIFNwZWNpYWwgRG90IFN5bWJvbAotCi1AY2luZGV4IGRvdCAoc3ltYm9sKQotQGNpbmRleCBAY29kZXsufSAoc3ltYm9sKQotQGNpbmRleCBjdXJyZW50IGFkZHJlc3MKLUBjaW5kZXggbG9jYXRpb24gY291bnRlcgotVGhlIHNwZWNpYWwgc3ltYm9sIEBzYW1wey59IHJlZmVycyB0byB0aGUgY3VycmVudCBhZGRyZXNzIHRoYXQKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGFzc2VtYmxpbmcgaW50by4gIFRodXMsIHRoZSBleHByZXNzaW9uIEBzYW1we21lbHZpbjoKLS5sb25nIC59IGRlZmluZXMgQGNvZGV7bWVsdmlufSB0byBjb250YWluIGl0cyBvd24gYWRkcmVzcy4KLUFzc2lnbmluZyBhIHZhbHVlIHRvIEBjb2Rley59IGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSBAY29kZXsub3JnfQotZGlyZWN0aXZlLiAgVGh1cywgdGhlIGV4cHJlc3Npb24gQHNhbXB7Lj0uKzR9IGlzIHRoZSBzYW1lIGFzIHNheWluZwotQGlmY2xlYXIgbm8tc3BhY2UtZGlyCi1Ac2FtcHsuc3BhY2UgNH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBuby1zcGFjZS1kaXIKLUBpZnNldCBBMjlLCi1Ac2FtcHsuYmxvY2sgNH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFN5bWJvbCBBdHRyaWJ1dGVzCi1Ac2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcwotCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IGF0dHJpYnV0ZXMsIHN5bWJvbAotRXZlcnkgc3ltYm9sIGhhcywgYXMgd2VsbCBhcyBpdHMgbmFtZSwgdGhlIGF0dHJpYnV0ZXMgYGBWYWx1ZScnIGFuZAotYGBUeXBlJycuICBEZXBlbmRpbmcgb24gb3V0cHV0IGZvcm1hdCwgc3ltYm9scyBjYW4gYWxzbyBoYXZlIGF1eGlsaWFyeQotYXR0cmlidXRlcy4KLUBpZnNldCBJTlRFUk5BTFMKLVRoZSBkZXRhaWxlZCBkZWZpbml0aW9ucyBhcmUgaW4gQGZpbGV7YS5vdXQuaH0uCi1AZW5kIGlmc2V0Ci0KLUlmIHlvdSB1c2UgYSBzeW1ib2wgd2l0aG91dCBkZWZpbmluZyBpdCwgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB6ZXJvIGZvcgotYWxsIHRoZXNlIGF0dHJpYnV0ZXMsIGFuZCBwcm9iYWJseSB3b24ndCB3YXJuIHlvdS4gIFRoaXMgbWFrZXMgdGhlCi1zeW1ib2wgYW4gZXh0ZXJuYWxseSBkZWZpbmVkIHN5bWJvbCwgd2hpY2ggaXMgZ2VuZXJhbGx5IHdoYXQgeW91Ci13b3VsZCB3YW50LgotCi1AbWVudQotKiBTeW1ib2wgVmFsdWU6OiAgICAgICAgICAgICAgICBWYWx1ZQotKiBTeW1ib2wgVHlwZTo6ICAgICAgICAgICAgICAgICBUeXBlCi1AaWZzZXQgYW91dC1ib3V0Ci1AaWZzZXQgR0VORVJJQwotKiBhLm91dCBTeW1ib2xzOjogICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBCT1VUCi0qIGEub3V0IFN5bWJvbHM6OiAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEJPVVQKLSogYS5vdXQgU3ltYm9sczo6ICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fSwgQGNvZGV7Yi5vdXR9Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLUBpZnNldCBDT0ZGCi0qIENPRkYgU3ltYm9sczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBDT0ZGCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU09NCi0qIFNPTSBTeW1ib2xzOjogICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXMgZm9yIFNPTQotQGVuZCBpZnNldAotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbCBWYWx1ZQotQHN1YnNlY3Rpb24gVmFsdWUKLQotQGNpbmRleCB2YWx1ZSBvZiBhIHN5bWJvbAotQGNpbmRleCBzeW1ib2wgdmFsdWUKLVRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBpcyAodXN1YWxseSkgMzIgYml0cy4gIEZvciBhIHN5bWJvbCB3aGljaCBsYWJlbHMgYQotbG9jYXRpb24gaW4gdGhlIHRleHQsIGRhdGEsIGJzcyBvciBhYnNvbHV0ZSBzZWN0aW9ucyB0aGUgdmFsdWUgaXMgdGhlCi1udW1iZXIgb2YgYWRkcmVzc2VzIGZyb20gdGhlIHN0YXJ0IG9mIHRoYXQgc2VjdGlvbiB0byB0aGUgbGFiZWwuCi1OYXR1cmFsbHkgZm9yIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgY2hhbmdlcwotYXMgQGNvZGV7QHZhbHVle0xEfX0gY2hhbmdlcyBzZWN0aW9uIGJhc2UgYWRkcmVzc2VzIGR1cmluZyBsaW5raW5nLiAgQWJzb2x1dGUKLXN5bWJvbHMnIHZhbHVlcyBkbyBub3QgY2hhbmdlIGR1cmluZyBsaW5raW5nOiB0aGF0IGlzIHdoeSB0aGV5IGFyZQotY2FsbGVkIGFic29sdXRlLgotCi1UaGUgdmFsdWUgb2YgYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuICBJZiBpdCBpcwotMCB0aGVuIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBhc3NlbWJsZXIgc291cmNlIGZpbGUsIGFuZAotQGNvZGV7QHZhbHVle0xEfX0gdHJpZXMgdG8gZGV0ZXJtaW5lIGl0cyB2YWx1ZSBmcm9tIG90aGVyIGZpbGVzIGxpbmtlZCBpbnRvIHRoZQotc2FtZSBwcm9ncmFtLiAgWW91IG1ha2UgdGhpcyBraW5kIG9mIHN5bWJvbCBzaW1wbHkgYnkgbWVudGlvbmluZyBhIHN5bWJvbAotbmFtZSB3aXRob3V0IGRlZmluaW5nIGl0LiAgQSBub24temVybyB2YWx1ZSByZXByZXNlbnRzIGEgQGNvZGV7LmNvbW19Ci1jb21tb24gZGVjbGFyYXRpb24uICBUaGUgdmFsdWUgaXMgaG93IG11Y2ggY29tbW9uIHN0b3JhZ2UgdG8gcmVzZXJ2ZSwgaW4KLWJ5dGVzIChhZGRyZXNzZXMpLiAgVGhlIHN5bWJvbCByZWZlcnMgdG8gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgdGhlCi1hbGxvY2F0ZWQgc3RvcmFnZS4KLQotQG5vZGUgU3ltYm9sIFR5cGUKLUBzdWJzZWN0aW9uIFR5cGUKLQotQGNpbmRleCB0eXBlIG9mIGEgc3ltYm9sCi1AY2luZGV4IHN5bWJvbCB0eXBlCi1UaGUgdHlwZSBhdHRyaWJ1dGUgb2YgYSBzeW1ib2wgY29udGFpbnMgcmVsb2NhdGlvbiAoc2VjdGlvbikKLWluZm9ybWF0aW9uLCBhbnkgZmxhZyBzZXR0aW5ncyBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgaXMgZXh0ZXJuYWwsIGFuZAotKG9wdGlvbmFsbHkpLCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgbGlua2VycyBhbmQgZGVidWdnZXJzLiAgVGhlIGV4YWN0Ci1mb3JtYXQgZGVwZW5kcyBvbiB0aGUgb2JqZWN0LWNvZGUgb3V0cHV0IGZvcm1hdCBpbiB1c2UuCi0KLUBpZnNldCBhb3V0LWJvdXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBCT1VUCi1AYyBUaGUgZm9sbG93aW5nIGF2b2lkcyBhICJ3aWRvdyIgc3Vic2VjdGlvbiB0aXRsZS4gIEBncm91cCB3b3VsZCBiZQotQGMgYmV0dGVyIGlmIGl0IHdlcmUgYXZhaWxhYmxlIG91dHNpZGUgZXhhbXBsZXMuCi1AbmVlZCAxMDAwCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9LCBAY29kZXtiLm91dH0KLQotQGNpbmRleCBAY29kZXtiLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Iub3V0fQotVGhlc2Ugc3ltYm9sIGF0dHJpYnV0ZXMgYXBwZWFyIG9ubHkgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvcgotb25lIG9mIHRoZSBCZXJrZWxleS1kZXNjZW5kZWQgb2JqZWN0IG91dHB1dCBmb3JtYXRzLS0tQGNvZGV7YS5vdXR9IG9yCi1AY29kZXtiLm91dH0uCi0KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEJPVVQKLUBub2RlIGEub3V0IFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLQotQGNpbmRleCBAY29kZXthLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Eub3V0fQotCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLUBub2RlIGEub3V0IFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLQotQGNpbmRleCBAY29kZXthLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Eub3V0fQotCi1AZW5kIGlmc2V0Ci1AbWVudQotKiBTeW1ib2wgRGVzYzo6ICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yCi0qIFN5bWJvbCBPdGhlcjo6ICAgICAgICAgICAgICAgIE90aGVyCi1AZW5kIG1lbnUKLQotQG5vZGUgU3ltYm9sIERlc2MKLUBzdWJzdWJzZWN0aW9uIERlc2NyaXB0b3IKLQotQGNpbmRleCBkZXNjcmlwdG9yLCBvZiBAY29kZXthLm91dH0gc3ltYm9sCi1UaGlzIGlzIGFuIGFyYml0cmFyeSAxNi1iaXQgdmFsdWUuICBZb3UgbWF5IGVzdGFibGlzaCBhIHN5bWJvbCdzCi1kZXNjcmlwdG9yIHZhbHVlIGJ5IHVzaW5nIGEgQGNvZGV7LmRlc2N9IHN0YXRlbWVudAotKEBweHJlZntEZXNjLCxAY29kZXsuZGVzY319KS4gIEEgZGVzY3JpcHRvciB2YWx1ZSBtZWFucyBub3RoaW5nIHRvCi1AY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgU3ltYm9sIE90aGVyCi1Ac3Vic3Vic2VjdGlvbiBPdGhlcgotCi1AY2luZGV4IG90aGVyIGF0dHJpYnV0ZSwgb2YgQGNvZGV7YS5vdXR9IHN5bWJvbAotVGhpcyBpcyBhbiBhcmJpdHJhcnkgOC1iaXQgdmFsdWUuICBJdCBtZWFucyBub3RoaW5nIHRvIEBjb2Rle0B2YWx1ZXtBU319LgotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgQ09GRiBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcyBmb3IgQ09GRgotCi1AY2luZGV4IENPRkYgc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIENPRkYKLQotVGhlIENPRkYgZm9ybWF0IHN1cHBvcnRzIGEgbXVsdGl0dWRlIG9mIGF1eGlsaWFyeSBzeW1ib2wgYXR0cmlidXRlczsKLWxpa2UgdGhlIHByaW1hcnkgc3ltYm9sIGF0dHJpYnV0ZXMsIHRoZXkgYXJlIHNldCBiZXR3ZWVuIEBjb2Rley5kZWZ9IGFuZAotQGNvZGV7LmVuZGVmfSBkaXJlY3RpdmVzLgotCi1Ac3Vic3Vic2VjdGlvbiBQcmltYXJ5IEF0dHJpYnV0ZXMKLQotQGNpbmRleCBwcmltYXJ5IGF0dHJpYnV0ZXMsIENPRkYgc3ltYm9scwotVGhlIHN5bWJvbCBuYW1lIGlzIHNldCB3aXRoIEBjb2Rley5kZWZ9OyB0aGUgdmFsdWUgYW5kIHR5cGUsCi1yZXNwZWN0aXZlbHksIHdpdGggQGNvZGV7LnZhbH0gYW5kIEBjb2Rley50eXBlfS4KLQotQHN1YnN1YnNlY3Rpb24gQXV4aWxpYXJ5IEF0dHJpYnV0ZXMKLQotQGNpbmRleCBhdXhpbGlhcnkgYXR0cmlidXRlcywgQ09GRiBzeW1ib2xzCi1UaGUgQGNvZGV7QHZhbHVle0FTfX0gZGlyZWN0aXZlcyBAY29kZXsuZGltfSwgQGNvZGV7LmxpbmV9LCBAY29kZXsuc2NsfSwKLUBjb2Rley5zaXplfSwgYW5kIEBjb2Rley50YWd9IGNhbiBnZW5lcmF0ZSBhdXhpbGlhcnkgc3ltYm9sIHRhYmxlCi1pbmZvcm1hdGlvbiBmb3IgQ09GRi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNPTQotQG5vZGUgU09NIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBTT00KLQotQGNpbmRleCBTT00gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIFNPTQotCi1UaGUgU09NIGZvcm1hdCBmb3IgdGhlIEhQUEEgc3VwcG9ydHMgYSBtdWx0aXR1ZGUgb2Ygc3ltYm9sIGF0dHJpYnV0ZXMgc2V0IHdpdGgKLXRoZSBAY29kZXsuRVhQT1JUfSBhbmQgQGNvZGV7LklNUE9SVH0gZGlyZWN0aXZlcy4KLQotVGhlIGF0dHJpYnV0ZXMgYXJlIGRlc2NyaWJlZCBpbiBAY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMCBBc3NlbWJseSAKLUxhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9IChIUCA5MjQzMi05MDAwMSkgdW5kZXIgdGhlIEBjb2Rle0lNUE9SVH0gYW5kCi1AY29kZXtFWFBPUlR9IGFzc2VtYmxlciBkaXJlY3RpdmUgZG9jdW1lbnRhdGlvbi4KLUBlbmQgaWZzZXQKLQotQG5vZGUgRXhwcmVzc2lvbnMKLUBjaGFwdGVyIEV4cHJlc3Npb25zCi0KLUBjaW5kZXggZXhwcmVzc2lvbnMKLUBjaW5kZXggYWRkcmVzc2VzCi1AY2luZGV4IG51bWVyaWMgdmFsdWVzCi1BbiBAZGZue2V4cHJlc3Npb259IHNwZWNpZmllcyBhbiBhZGRyZXNzIG9yIG51bWVyaWMgdmFsdWUuCi1XaGl0ZXNwYWNlIG1heSBwcmVjZWRlIGFuZC9vciBmb2xsb3cgYW4gZXhwcmVzc2lvbi4KLQotVGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIG11c3QgYmUgYW4gYWJzb2x1dGUgbnVtYmVyLCBvciBlbHNlIGFuIG9mZnNldCBpbnRvCi1hIHBhcnRpY3VsYXIgc2VjdGlvbi4gIElmIGFuIGV4cHJlc3Npb24gaXMgbm90IGFic29sdXRlLCBhbmQgdGhlcmUgaXMgbm90Ci1lbm91Z2ggaW5mb3JtYXRpb24gd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBzZWVzIHRoZSBleHByZXNzaW9uIHRvIGtub3cgaXRzCi1zZWN0aW9uLCBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIHNvdXJjZSBwcm9ncmFtIG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBpbnRlcnByZXQKLXRoZSBleHByZXNzaW9uLS0tYnV0IHRoZSBzZWNvbmQgcGFzcyBpcyBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkLgotQGNvZGV7QHZhbHVle0FTfX0gYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIHNpdHVhdGlvbi4KLQotQG1lbnUKLSogRW1wdHkgRXhwcnM6OiAgICAgICAgICAgICAgICAgRW1wdHkgRXhwcmVzc2lvbnMKLSogSW50ZWdlciBFeHByczo6ICAgICAgICAgICAgICAgSW50ZWdlciBFeHByZXNzaW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIEVtcHR5IEV4cHJzCi1Ac2VjdGlvbiBFbXB0eSBFeHByZXNzaW9ucwotCi1AY2luZGV4IGVtcHR5IGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBlbXB0eQotQW4gZW1wdHkgZXhwcmVzc2lvbiBoYXMgbm8gdmFsdWU6IGl0IGlzIGp1c3Qgd2hpdGVzcGFjZSBvciBudWxsLgotV2hlcmV2ZXIgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBpcyByZXF1aXJlZCwgeW91IG1heSBvbWl0IHRoZQotZXhwcmVzc2lvbiwgYW5kIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgYSB2YWx1ZSBvZiAoYWJzb2x1dGUpIDAuICBUaGlzCi1pcyBjb21wYXRpYmxlIHdpdGggb3RoZXIgYXNzZW1ibGVycy4KLQotQG5vZGUgSW50ZWdlciBFeHBycwotQHNlY3Rpb24gSW50ZWdlciBFeHByZXNzaW9ucwotCi1AY2luZGV4IGludGVnZXIgZXhwcmVzc2lvbnMKLUBjaW5kZXggZXhwcmVzc2lvbnMsIGludGVnZXIKLUFuIEBkZm57aW50ZWdlciBleHByZXNzaW9ufSBpcyBvbmUgb3IgbW9yZSBAZW1waHthcmd1bWVudHN9IGRlbGltaXRlZAotYnkgQGVtcGh7b3BlcmF0b3JzfS4KLQotQG1lbnUKLSogQXJndW1lbnRzOjogICAgICAgICAgICAgICAgICAgQXJndW1lbnRzCi0qIE9wZXJhdG9yczo6ICAgICAgICAgICAgICAgICAgIE9wZXJhdG9ycwotKiBQcmVmaXggT3BzOjogICAgICAgICAgICAgICAgICBQcmVmaXggT3BlcmF0b3JzCi0qIEluZml4IE9wczo6ICAgICAgICAgICAgICAgICAgIEluZml4IE9wZXJhdG9ycwotQGVuZCBtZW51Ci0KLUBub2RlIEFyZ3VtZW50cwotQHN1YnNlY3Rpb24gQXJndW1lbnRzCi0KLUBjaW5kZXggZXhwcmVzc2lvbiBhcmd1bWVudHMKLUBjaW5kZXggYXJndW1lbnRzIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IG9wZXJhbmRzIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IGFyaXRobWV0aWMgb3BlcmFuZHMKLUBkZm57QXJndW1lbnRzfSBhcmUgc3ltYm9scywgbnVtYmVycyBvciBzdWJleHByZXNzaW9ucy4gIEluIG90aGVyCi1jb250ZXh0cyBhcmd1bWVudHMgYXJlIHNvbWV0aW1lcyBjYWxsZWQgYGBhcml0aG1ldGljIG9wZXJhbmRzJycuICBJbgotdGhpcyBtYW51YWwsIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGVtIHdpdGggdGhlIGBgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMnJyBvZgotdGhlIG1hY2hpbmUgbGFuZ3VhZ2UsIHdlIHVzZSB0aGUgdGVybSBgYGFyZ3VtZW50JycgdG8gcmVmZXIgdG8gcGFydHMgb2YKLWV4cHJlc3Npb25zIG9ubHksIHJlc2VydmluZyB0aGUgd29yZCBgYG9wZXJhbmQnJyB0byByZWZlciBvbmx5IHRvIG1hY2hpbmUKLWluc3RydWN0aW9uIG9wZXJhbmRzLgotCi1TeW1ib2xzIGFyZSBldmFsdWF0ZWQgdG8geWllbGQgQHtAdmFye3NlY3Rpb259IEB2YXJ7Tk5OfUB9IHdoZXJlCi1AdmFye3NlY3Rpb259IGlzIG9uZSBvZiB0ZXh0LCBkYXRhLCBic3MsIGFic29sdXRlLAotb3IgdW5kZWZpbmVkLiAgQHZhcntOTk59IGlzIGEgc2lnbmVkLCAyJ3MgY29tcGxlbWVudCAzMiBiaXQKLWludGVnZXIuCi0KLU51bWJlcnMgYXJlIHVzdWFsbHkgaW50ZWdlcnMuCi0KLUEgbnVtYmVyIGNhbiBiZSBhIGZsb251bSBvciBiaWdudW0uICBJbiB0aGlzIGNhc2UsIHlvdSBhcmUgd2FybmVkCi10aGF0IG9ubHkgdGhlIGxvdyBvcmRlciAzMiBiaXRzIGFyZSB1c2VkLCBhbmQgQGNvZGV7QHZhbHVle0FTfX0gcHJldGVuZHMKLXRoZXNlIDMyIGJpdHMgYXJlIGFuIGludGVnZXIuICBZb3UgbWF5IHdyaXRlIGludGVnZXItbWFuaXB1bGF0aW5nCi1pbnN0cnVjdGlvbnMgdGhhdCBhY3Qgb24gZXhvdGljIGNvbnN0YW50cywgY29tcGF0aWJsZSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzLgotCi1AY2luZGV4IHN1YmV4cHJlc3Npb25zCi1TdWJleHByZXNzaW9ucyBhcmUgYSBsZWZ0IHBhcmVudGhlc2lzIEBzYW1weyh9IGZvbGxvd2VkIGJ5IGFuIGludGVnZXIKLWV4cHJlc3Npb24sIGZvbGxvd2VkIGJ5IGEgcmlnaHQgcGFyZW50aGVzaXMgQHNhbXB7KX07IG9yIGEgcHJlZml4Ci1vcGVyYXRvciBmb2xsb3dlZCBieSBhbiBhcmd1bWVudC4KLQotQG5vZGUgT3BlcmF0b3JzCi1Ac3Vic2VjdGlvbiBPcGVyYXRvcnMKLQotQGNpbmRleCBvcGVyYXRvcnMsIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IGFyaXRobWV0aWMgZnVuY3Rpb25zCi1AY2luZGV4IGZ1bmN0aW9ucywgaW4gZXhwcmVzc2lvbnMKLUBkZm57T3BlcmF0b3JzfSBhcmUgYXJpdGhtZXRpYyBmdW5jdGlvbnMsIGxpa2UgQGNvZGV7K30gb3IgQGNvZGV7JX0uICBQcmVmaXgKLW9wZXJhdG9ycyBhcmUgZm9sbG93ZWQgYnkgYW4gYXJndW1lbnQuICBJbmZpeCBvcGVyYXRvcnMgYXBwZWFyCi1iZXR3ZWVuIHRoZWlyIGFyZ3VtZW50cy4gIE9wZXJhdG9ycyBtYXkgYmUgcHJlY2VkZWQgYW5kL29yIGZvbGxvd2VkIGJ5Ci13aGl0ZXNwYWNlLgotCi1Abm9kZSBQcmVmaXggT3BzCi1Ac3Vic2VjdGlvbiBQcmVmaXggT3BlcmF0b3IKLQotQGNpbmRleCBwcmVmaXggb3BlcmF0b3JzCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgdGhlIGZvbGxvd2luZyBAZGZue3ByZWZpeCBvcGVyYXRvcnN9LiAgVGhleSBlYWNoIHRha2UKLW9uZSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhYnNvbHV0ZS4KLQotQGMgdGhlIHRleC9lbmQgdGV4IHN0dWZmIHN1cnJvdW5kaW5nIHRoaXMgc21hbGwgdGFibGUgaXMgbWVhbnQgdG8gbWFrZQotQGMgaXQgYWxpZ24sIG9uIHRoZSBwcmludGVkIHBhZ2UsIHdpdGggdGhlIHNpbWlsYXIgdGFibGUgaW4gdGhlIG5leHQKLUBjIHNlY3Rpb24gKHdoaWNoIGlzIGluc2lkZSBhbiBlbnVtZXJhdGUpLgotQHRleAotXGdsb2JhbFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxpdGVtaW5kZW50Ci1AZW5kIHRleAotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC0KLUBkZm57TmVnYXRpb259LiAgVHdvJ3MgY29tcGxlbWVudCBuZWdhdGlvbi4KLUBpdGVtIH4KLUBkZm57Q29tcGxlbWVudGF0aW9ufS4gIEJpdHdpc2Ugbm90LgotQGVuZCB0YWJsZQotCi1AdGV4Ci1cZ2xvYmFsXGFkdmFuY2VcbGVmdHNraXAgYnkgLVxpdGVtaW5kZW50Ci1AZW5kIHRleAotCi1Abm9kZSBJbmZpeCBPcHMKLUBzdWJzZWN0aW9uIEluZml4IE9wZXJhdG9ycwotCi1AY2luZGV4IGluZml4IG9wZXJhdG9ycwotQGNpbmRleCBvcGVyYXRvcnMsIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBkZm57SW5maXggb3BlcmF0b3JzfSB0YWtlIHR3byBhcmd1bWVudHMsIG9uZSBvbiBlaXRoZXIgc2lkZS4gIE9wZXJhdG9ycwotaGF2ZSBwcmVjZWRlbmNlLCBidXQgb3BlcmF0aW9ucyB3aXRoIGVxdWFsIHByZWNlZGVuY2UgYXJlIHBlcmZvcm1lZCBsZWZ0Ci10byByaWdodC4gIEFwYXJ0IGZyb20gQGNvZGV7K30gb3IgQGNvZGV7LX0sIGJvdGggYXJndW1lbnRzIG11c3QgYmUKLWFic29sdXRlLCBhbmQgdGhlIHJlc3VsdCBpcyBhYnNvbHV0ZS4KLQotQGVudW1lcmF0ZQotQGNpbmRleCBvcGVyYXRvciBwcmVjZWRlbmNlCi1AY2luZGV4IHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzCi0KLUBpdGVtCi1IaWdoZXN0IFByZWNlZGVuY2UKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAqCi1AZGZue011bHRpcGxpY2F0aW9ufS4KLQotQGl0ZW0gLwotQGRmbntEaXZpc2lvbn0uICBUcnVuY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBDIG9wZXJhdG9yIEBzYW1wey99Ci0KLUBpdGVtICUKLUBkZm57UmVtYWluZGVyfS4KLQotQGl0ZW0gPAotQGl0ZW14IDw8Ci1AZGZue1NoaWZ0IExlZnR9LiAgU2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHs8PH0uCi0KLUBpdGVtID4KLUBpdGVteCA+PgotQGRmbntTaGlmdCBSaWdodH0uICBTYW1lIGFzIHRoZSBDIG9wZXJhdG9yIEBzYW1wez4+fS4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLUludGVybWVkaWF0ZSBwcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gfAotCi1AZGZue0JpdHdpc2UgSW5jbHVzaXZlIE9yfS4KLQotQGl0ZW0gJgotQGRmbntCaXR3aXNlIEFuZH0uCi0KLUBpdGVtIF4KLUBkZm57Qml0d2lzZSBFeGNsdXNpdmUgT3J9LgotCi1AaXRlbSAhCi1AZGZue0JpdHdpc2UgT3IgTm90fS4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLUxvd2VzdCBQcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBhZGRpdGlvbiwgcGVybWl0dGVkIGFyZ3VtZW50cwotQGNpbmRleCBwbHVzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBmb3IgYWRkaXRpb24KLUBpdGVtICsKLUBkZm57QWRkaXRpb259LiAgSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGFic29sdXRlLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2VjdGlvbiBvZgotdGhlIG90aGVyIGFyZ3VtZW50LiAgWW91IG1heSBub3QgYWRkIHRvZ2V0aGVyIGFyZ3VtZW50cyBmcm9tIGRpZmZlcmVudAotc2VjdGlvbnMuCi0KLUBjaW5kZXggc3VidHJhY3Rpb24sIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggbWludXMsIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggYXJndW1lbnRzIGZvciBzdWJ0cmFjdGlvbgotQGl0ZW0gLQotQGRmbntTdWJ0cmFjdGlvbn0uICBJZiB0aGUgcmlnaHQgYXJndW1lbnQgaXMgYWJzb2x1dGUsIHRoZQotcmVzdWx0IGhhcyB0aGUgc2VjdGlvbiBvZiB0aGUgbGVmdCBhcmd1bWVudC4KLUlmIGJvdGggYXJndW1lbnRzIGFyZSBpbiB0aGUgc2FtZSBzZWN0aW9uLCB0aGUgcmVzdWx0IGlzIGFic29sdXRlLgotWW91IG1heSBub3Qgc3VidHJhY3QgYXJndW1lbnRzIGZyb20gZGlmZmVyZW50IHNlY3Rpb25zLgotQGMgRklYTUUgaXMgdGhlcmUgc3RpbGwgc29tZXRoaW5nIHVzZWZ1bCB0byBzYXkgYWJvdXQgdW5kZWZpbmVkIC0gdW5kZWZpbmVkID8KLUBlbmQgdGFibGUKLUBlbmQgZW51bWVyYXRlCi0KLUluIHNob3J0LCBpdCdzIG9ubHkgbWVhbmluZ2Z1bCB0byBhZGQgb3Igc3VidHJhY3QgdGhlIEBlbXBoe29mZnNldHN9IGluIGFuCi1hZGRyZXNzOyB5b3UgY2FuIG9ubHkgaGF2ZSBhIGRlZmluZWQgc2VjdGlvbiBpbiBvbmUgb2YgdGhlIHR3byBhcmd1bWVudHMuCi0KLUBub2RlIFBzZXVkbyBPcHMKLUBjaGFwdGVyIEFzc2VtYmxlciBEaXJlY3RpdmVzCi0KLUBjaW5kZXggZGlyZWN0aXZlcywgbWFjaGluZSBpbmRlcGVuZGVudAotQGNpbmRleCBwc2V1ZG8tb3BzLCBtYWNoaW5lIGluZGVwZW5kZW50Ci1AY2luZGV4IG1hY2hpbmUgaW5kZXBlbmRlbnQgZGlyZWN0aXZlcwotQWxsIGFzc2VtYmxlciBkaXJlY3RpdmVzIGhhdmUgbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgcGVyaW9kIChAc2FtcHsufSkuCi1UaGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBsZXR0ZXJzLCB1c3VhbGx5IGluIGxvd2VyIGNhc2UuCi0KLVRoaXMgY2hhcHRlciBkaXNjdXNzZXMgZGlyZWN0aXZlcyB0aGF0IGFyZSBhdmFpbGFibGUgcmVnYXJkbGVzcyBvZiB0aGUKLXRhcmdldCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIuCi1AaWZzZXQgR0VORVJJQwotU29tZSBtYWNoaW5lIGNvbmZpZ3VyYXRpb25zIHByb3ZpZGUgYWRkaXRpb25hbCBkaXJlY3RpdmVzLgotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IG1hY2hpbmUtZGlyZWN0aXZlcwotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9IGZvciBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG1lbnUKLSogQWJvcnQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFib3J0fQotQGlmc2V0IENPRkYKLSogQUJPUlQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LkFCT1JUfQotQGVuZCBpZnNldAotCi0qIEFsaWduOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5hbGlnbiBAdmFye2Ficy1leHByfSAsIEB2YXJ7YWJzLWV4cHJ9fQotKiBBc2NpaTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYXNjaWkgIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotKiBBc2Npejo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYXNjaXogIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotKiBCYWxpZ246OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYmFsaWduIEB2YXJ7YWJzLWV4cHJ9ICwgQHZhcnthYnMtZXhwcn19Ci0qIEJ5dGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5ieXRlIEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBDb21tOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH0gfQotKiBEYXRhOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZGF0YSBAdmFye3N1YnNlY3Rpb259fQotQGlmc2V0IENPRkYKLSogRGVmOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRlZiBAdmFye25hbWV9fQotQGVuZCBpZnNldAotQGlmc2V0IGFvdXQtYm91dAotKiBEZXNjOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZGVzYyBAdmFye3N5bWJvbH0sIEB2YXJ7YWJzLWV4cHJlc3Npb259fQotQGVuZCBpZnNldAotQGlmc2V0IENPRkYKLSogRGltOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRpbX0KLUBlbmQgaWZzZXQKLQotKiBEb3VibGU6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZG91YmxlIEB2YXJ7ZmxvbnVtc319Ci0qIEVqZWN0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lamVjdH0KLSogRWxzZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVsc2V9Ci0qIEVuZDo6CQkJCUBjb2Rley5lbmR9Ci1AaWZzZXQgQ09GRgotKiBFbmRlZjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZW5kZWZ9Ci1AZW5kIGlmc2V0Ci0KLSogRW5kZnVuYzo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVuZGZ1bmN9Ci0qIEVuZGlmOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbmRpZn0KLSogRXF1OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVxdSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIEVxdWl2OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lcXVpdiBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIEVycjo6CQkJCUBjb2Rley5lcnJ9Ci0qIEV4aXRtOjoJCQlAY29kZXsuZXhpdG19Ci0qIEV4dGVybjo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5leHRlcm59Ci0qIEZhaWw6OgkJCUBjb2Rley5mYWlsfQotQGlmY2xlYXIgbm8tZmlsZS1kaXIKLSogRmlsZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZpbGUgQHZhcntzdHJpbmd9fQotQGVuZCBpZmNsZWFyCi0KLSogRmlsbDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZpbGwgQHZhcntyZXBlYXR9ICwgQHZhcntzaXplfSAsIEB2YXJ7dmFsdWV9fQotKiBGbG9hdDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZmxvYXQgQHZhcntmbG9udW1zfX0KLSogRnVuYzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZ1bmN9ICAKLSogR2xvYmFsOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lmdsb2JhbCBAdmFye3N5bWJvbH19LCBAY29kZXsuZ2xvYmwgQHZhcntzeW1ib2x9fQotKiBod29yZDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuaHdvcmQgQHZhcntleHByZXNzaW9uc319Ci0qIElkZW50OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pZGVudH0KLSogSWY6OiAgICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmlmIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn19Ci0qIEluY2x1ZGU6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pbmNsdWRlICJAdmFye2ZpbGV9In0KLSogSW50OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmludCBAdmFye2V4cHJlc3Npb25zfX0KLSogSXJwOjoJCQkJQGNvZGV7LmlycCBAdmFye3N5bWJvbH0sQHZhcnt2YWx1ZXN9fUBkb3Rze30KLSogSXJwYzo6CQkJQGNvZGV7LmlycGMgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0qIExjb21tOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH19Ci0qIExmbGFnczo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sZmxhZ3N9Ci1AaWZjbGVhciBuby1saW5lLWRpcgotKiBMaW5lOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGluZSBAdmFye2xpbmUtbnVtYmVyfX0KLUBlbmQgaWZjbGVhcgotCi0qIExuOjogICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sbiBAdmFye2xpbmUtbnVtYmVyfX0KLSogTGlua29uY2U6OgkJCUBjb2Rley5saW5rb25jZSBbQHZhcnt0eXBlfV19Ci0qIExpc3Q6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5saXN0fQotKiBMb25nOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubG9uZyBAdmFye2V4cHJlc3Npb25zfX0KLUBpZ25vcmUKLSogTHN5bTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxzeW0gQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotQGVuZCBpZ25vcmUKLQotKiBNYWNybzo6CQkJQGNvZGV7Lm1hY3JvIEB2YXJ7bmFtZX0gQHZhcnthcmdzfX1AZG90c3t9Ci0qIE1SSTo6CQkJCUBjb2Rley5tcmkgQHZhcnt2YWx9fQotCi0qIE5vbGlzdDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5ub2xpc3R9Ci0qIE9jdGE6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5vY3RhIEB2YXJ7YmlnbnVtc319Ci0qIE9yZzo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5vcmcgQHZhcntuZXctbGN9ICwgQHZhcntmaWxsfX0KLSogUDJhbGlnbjo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnAyYWxpZ24gQHZhcnthYnMtZXhwcn0gLCBAdmFye2Ficy1leHByfX0KLSogUHJpbnQ6OgkJCUBjb2Rley5wcmludCBAdmFye3N0cmluZ319Ci0qIFBzaXplOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5wc2l6ZSBAdmFye2xpbmVzfSwgQHZhcntjb2x1bW5zfX0KLSogUHVyZ2VtOjoJCQlAY29kZXsucHVyZ2VtIEB2YXJ7bmFtZX19Ci0qIFF1YWQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5xdWFkIEB2YXJ7YmlnbnVtc319Ci0qIFJlcHQ6OgkJCUBjb2Rley5yZXB0IEB2YXJ7Y291bnR9fQotKiBTYnR0bDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2J0dGwgIkB2YXJ7c3ViaGVhZGluZ30ifQotQGlmc2V0IENPRkYKLSogU2NsOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNjbCBAdmFye2NsYXNzfX0KLSogU2VjdGlvbjo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNlY3Rpb24gQHZhcntuYW1lfSwgQHZhcntzdWJzZWN0aW9ufX0KLUBlbmQgaWZzZXQKLQotKiBTZXQ6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2V0IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLSogU2hvcnQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNob3J0IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBTaW5nbGU6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2luZ2xlIEB2YXJ7ZmxvbnVtc319Ci1AaWZzZXQgQ09GRgotKiBTaXplOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2l6ZX0KLUBlbmQgaWZzZXQKLQotKiBTa2lwOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2tpcCBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLSogU2xlYjEyODo6CQkJQGNvZGV7LnNsZWIxMjggQHZhcntleHByZXNzaW9uc319Ci0qIFNwYWNlOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zcGFjZSBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLUBpZnNldCBoYXZlLXN0YWJzCi0qIFN0YWI6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zdGFiZCwgLnN0YWJuLCAuc3RhYnN9Ci1AZW5kIGlmc2V0Ci0KLSogU3RyaW5nOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnN0cmluZyAiQHZhcntzdHJ9In0KLSogU3RydWN0OjoJCQlAY29kZXsuc3RydWN0IEB2YXJ7ZXhwcmVzc2lvbn19Ci1AaWZzZXQgRUxGCi0qIFN5bXZlcjo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zeW12ZXIgQHZhcntuYW1lfSxAdmFye25hbWUyQEBub2RlbmFtZX19Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgQ09GRgotKiBUYWc6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudGFnIEB2YXJ7c3RydWN0bmFtZX19Ci1AZW5kIGlmc2V0Ci0KLSogVGV4dDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRleHQgQHZhcntzdWJzZWN0aW9ufX0KLSogVGl0bGU6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRpdGxlICJAdmFye2hlYWRpbmd9In0KLUBpZnNldCBDT0ZGCi0qIFR5cGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50eXBlIEB2YXJ7aW50fX0KLSogVmFsOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnZhbCBAdmFye2FkZHJ9fQotQGVuZCBpZnNldAotCi0qIFVsZWIxMjg6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley51bGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBXb3JkOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsud29yZCBAdmFye2V4cHJlc3Npb25zfX0KLSogRGVwcmVjYXRlZDo6ICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZCBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQWJvcnQKLUBzZWN0aW9uIEBjb2Rley5hYm9ydH0KLQotQGNpbmRleCBAY29kZXthYm9ydH0gZGlyZWN0aXZlCi1AY2luZGV4IHN0b3BwaW5nIHRoZSBhc3NlbWJseQotVGhpcyBkaXJlY3RpdmUgc3RvcHMgdGhlIGFzc2VtYmx5IGltbWVkaWF0ZWx5LiAgSXQgaXMgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4gIFRoZSBvcmlnaW5hbCBpZGVhIHdhcyB0aGF0IHRoZQotYXNzZW1ibHkgbGFuZ3VhZ2Ugc291cmNlIHdvdWxkIGJlIHBpcGVkIGludG8gdGhlIGFzc2VtYmxlci4gIElmIHRoZSBzZW5kZXIKLW9mIHRoZSBzb3VyY2UgcXVpdCwgaXQgY291bGQgdXNlIHRoaXMgZGlyZWN0aXZlIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvCi1xdWl0IGFsc28uICBPbmUgZGF5IEBjb2Rley5hYm9ydH0gd2lsbCBub3QgYmUgc3VwcG9ydGVkLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgQUJPUlQKLUBzZWN0aW9uIEBjb2Rley5BQk9SVH0KLQotQGNpbmRleCBAY29kZXtBQk9SVH0gZGlyZWN0aXZlCi1XaGVuIHByb2R1Y2luZyBDT0ZGIG91dHB1dCwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBhcyBhCi1zeW5vbnltIGZvciBAc2FtcHsuYWJvcnR9LgotCi1AaWZzZXQgQk9VVAotV2hlbiBwcm9kdWNpbmcgQGNvZGV7Yi5vdXR9IG91dHB1dCwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwKLWJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBBbGlnbgotQHNlY3Rpb24gQGNvZGV7LmFsaWduIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn19Ci0KLUBjaW5kZXggcGFkZGluZyB0aGUgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBAY29kZXthbGlnbn0gZGlyZWN0aXZlCi1QYWQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgKGluIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIHRvIGEgcGFydGljdWxhciBzdG9yYWdlCi1ib3VuZGFyeS4gIFRoZSBmaXJzdCBleHByZXNzaW9uICh3aGljaCBtdXN0IGJlIGFic29sdXRlKSBpcyB0aGUgYWxpZ25tZW50Ci1yZXF1aXJlZCwgYXMgZGVzY3JpYmVkIGJlbG93LgotCi1UaGUgc2Vjb25kIGV4cHJlc3Npb24gKGFsc28gYWJzb2x1dGUpIGdpdmVzIHRoZSBmaWxsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKLXBhZGRpbmcgYnl0ZXMuICBJdCAoYW5kIHRoZSBjb21tYSkgbWF5IGJlIG9taXR0ZWQuICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUKLXBhZGRpbmcgYnl0ZXMgYXJlIG5vcm1hbGx5IHplcm8uICBIb3dldmVyLCBvbiBzb21lIHN5c3RlbXMsIGlmIHRoZSBzZWN0aW9uIGlzCi1tYXJrZWQgYXMgY29udGFpbmluZyBjb2RlIGFuZCB0aGUgZmlsbCB2YWx1ZSBpcyBvbWl0dGVkLCB0aGUgc3BhY2UgaXMgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucy4KLQotVGhlIHRoaXJkIGV4cHJlc3Npb24gaXMgYWxzbyBhYnNvbHV0ZSwgYW5kIGlzIGFsc28gb3B0aW9uYWwuICBJZiBpdCBpcyBwcmVzZW50LAotaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYnkgdGhpcyBhbGlnbm1lbnQKLWRpcmVjdGl2ZS4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gdGhlCi1zcGVjaWZpZWQgbWF4aW11bSwgdGhlbiB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4gIFlvdSBjYW4gb21pdCB0aGUKLWZpbGwgdmFsdWUgKHRoZSBzZWNvbmQgYXJndW1lbnQpIGVudGlyZWx5IGJ5IHNpbXBseSB1c2luZyB0d28gY29tbWFzIGFmdGVyIHRoZQotcmVxdWlyZWQgYWxpZ25tZW50OyB0aGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGFsaWdubWVudCB0byBiZSBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVRoZSB3YXkgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBpcyBzcGVjaWZpZWQgdmFyaWVzIGZyb20gc3lzdGVtIHRvIHN5c3RlbS4KLUZvciB0aGUgYTI5aywgaHBwYSwgbTY4aywgbTg4aywgdzY1LCBzcGFyYywgYW5kIEhpdGFjaGkgU0gsIGFuZCBpMzg2IHVzaW5nIEVMRgotZm9ybWF0LAotdGhlIGZpcnN0IGV4cHJlc3Npb24gaXMgdGhlCi1hbGlnbm1lbnQgcmVxdWVzdCBpbiBieXRlcy4gIEZvciBleGFtcGxlIEBzYW1wey5hbGlnbiA4fSBhZHZhbmNlcwotdGhlIGxvY2F0aW9uIGNvdW50ZXIgdW50aWwgaXQgaXMgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIKLWlzIGFscmVhZHkgYSBtdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1Gb3Igb3RoZXIgc3lzdGVtcywgaW5jbHVkaW5nIHRoZSBpMzg2IHVzaW5nIGEub3V0IGZvcm1hdCwgaXQgaXMgdGhlCi1udW1iZXIgb2YgbG93LW9yZGVyIHplcm8gYml0cyB0aGUgbG9jYXRpb24gY291bnRlciBtdXN0IGhhdmUgYWZ0ZXIKLWFkdmFuY2VtZW50LiAgRm9yIGV4YW1wbGUgQHNhbXB7LmFsaWduIDN9IGFkdmFuY2VzIHRoZSBsb2NhdGlvbgotY291bnRlciB1bnRpbCBpdCBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlciBpcyBhbHJlYWR5IGEKLW11bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCi0KLVRoaXMgaW5jb25zaXN0ZW5jeSBpcyBkdWUgdG8gdGhlIGRpZmZlcmVudCBiZWhhdmlvcnMgb2YgdGhlIHZhcmlvdXMKLW5hdGl2ZSBhc3NlbWJsZXJzIGZvciB0aGVzZSBzeXN0ZW1zIHdoaWNoIEdBUyBtdXN0IGVtdWxhdGUuCi1HQVMgYWxzbyBwcm92aWRlcyBAY29kZXsuYmFsaWdufSBhbmQgQGNvZGV7LnAyYWxpZ259IGRpcmVjdGl2ZXMsCi1kZXNjcmliZWQgbGF0ZXIsIHdoaWNoIGhhdmUgYSBjb25zaXN0ZW50IGJlaGF2aW9yIGFjcm9zcyBhbGwKLWFyY2hpdGVjdHVyZXMgKGJ1dCBhcmUgc3BlY2lmaWMgdG8gR0FTKS4KLQotQG5vZGUgQXNjaWkKLUBzZWN0aW9uIEBjb2Rley5hc2NpaSAiQHZhcntzdHJpbmd9In1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7YXNjaWl9IGRpcmVjdGl2ZQotQGNpbmRleCBzdHJpbmcgbGl0ZXJhbHMKLUBjb2Rley5hc2NpaX0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgc3RyaW5nIGxpdGVyYWxzIChAcHhyZWZ7U3RyaW5nc30pCi1zZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQgYXNzZW1ibGVzIGVhY2ggc3RyaW5nICh3aXRoIG5vIGF1dG9tYXRpYwotdHJhaWxpbmcgemVybyBieXRlKSBpbnRvIGNvbnNlY3V0aXZlIGFkZHJlc3Nlcy4KLQotQG5vZGUgQXNjaXoKLUBzZWN0aW9uIEBjb2Rley5hc2NpeiAiQHZhcntzdHJpbmd9In1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7YXNjaXp9IGRpcmVjdGl2ZQotQGNpbmRleCB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncwotQGNpbmRleCBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncwotQGNvZGV7LmFzY2l6fSBpcyBqdXN0IGxpa2UgQGNvZGV7LmFzY2lpfSwgYnV0IGVhY2ggc3RyaW5nIGlzIGZvbGxvd2VkIGJ5Ci1hIHplcm8gYnl0ZS4gIFRoZSBgYHonJyBpbiBAc2FtcHsuYXNjaXp9IHN0YW5kcyBmb3IgYGB6ZXJvJycuCi0KLUBub2RlIEJhbGlnbgotQHNlY3Rpb24gQGNvZGV7LmJhbGlnblt3bF0gQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfX0KLQotQGNpbmRleCBwYWRkaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGdpdmVuIG51bWJlciBvZiBieXRlcwotQGNpbmRleCBAY29kZXtiYWxpZ259IGRpcmVjdGl2ZQotUGFkIHRoZSBsb2NhdGlvbiBjb3VudGVyIChpbiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSB0byBhIHBhcnRpY3VsYXIKLXN0b3JhZ2UgYm91bmRhcnkuICBUaGUgZmlyc3QgZXhwcmVzc2lvbiAod2hpY2ggbXVzdCBiZSBhYnNvbHV0ZSkgaXMgdGhlCi1hbGlnbm1lbnQgcmVxdWVzdCBpbiBieXRlcy4gIEZvciBleGFtcGxlIEBzYW1wey5iYWxpZ24gOH0gYWR2YW5jZXMKLXRoZSBsb2NhdGlvbiBjb3VudGVyIHVudGlsIGl0IGlzIGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyCi1pcyBhbHJlYWR5IGEgbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KLQotVGhlIHNlY29uZCBleHByZXNzaW9uIChhbHNvIGFic29sdXRlKSBnaXZlcyB0aGUgZmlsbCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1wYWRkaW5nIGJ5dGVzLiAgSXQgKGFuZCB0aGUgY29tbWEpIG1heSBiZSBvbWl0dGVkLiAgSWYgaXQgaXMgb21pdHRlZCwgdGhlCi1wYWRkaW5nIGJ5dGVzIGFyZSBub3JtYWxseSB6ZXJvLiAgSG93ZXZlciwgb24gc29tZSBzeXN0ZW1zLCBpZiB0aGUgc2VjdGlvbiBpcwotbWFya2VkIGFzIGNvbnRhaW5pbmcgY29kZSBhbmQgdGhlIGZpbGwgdmFsdWUgaXMgb21pdHRlZCwgdGhlIHNwYWNlIGlzIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMuCi0KLVRoZSB0aGlyZCBleHByZXNzaW9uIGlzIGFsc28gYWJzb2x1dGUsIGFuZCBpcyBhbHNvIG9wdGlvbmFsLiAgSWYgaXQgaXMgcHJlc2VudCwKLWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoaXMgYWxpZ25tZW50Ci1kaXJlY3RpdmUuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIHRoZQotc3BlY2lmaWVkIG1heGltdW0sIHRoZW4gdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuICBZb3UgY2FuIG9taXQgdGhlCi1maWxsIHZhbHVlICh0aGUgc2Vjb25kIGFyZ3VtZW50KSBlbnRpcmVseSBieSBzaW1wbHkgdXNpbmcgdHdvIGNvbW1hcyBhZnRlciB0aGUKLXJlcXVpcmVkIGFsaWdubWVudDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBhbGlnbm1lbnQgdG8gYmUgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlLgotCi1AY2luZGV4IEBjb2Rle2JhbGlnbnd9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtiYWxpZ25sfSBkaXJlY3RpdmUKLVRoZSBAY29kZXsuYmFsaWdud30gYW5kIEBjb2Rley5iYWxpZ25sfSBkaXJlY3RpdmVzIGFyZSB2YXJpYW50cyBvZiB0aGUKLUBjb2Rley5iYWxpZ259IGRpcmVjdGl2ZS4gIFRoZSBAY29kZXsuYmFsaWdud30gZGlyZWN0aXZlIHRyZWF0cyB0aGUgZmlsbAotcGF0dGVybiBhcyBhIHR3byBieXRlIHdvcmQgdmFsdWUuICBUaGUgQGNvZGV7LmJhbGlnbmx9IGRpcmVjdGl2ZXMgdHJlYXRzIHRoZQotZmlsbCBwYXR0ZXJuIGFzIGEgZm91ciBieXRlIGxvbmd3b3JkIHZhbHVlLiAgRm9yIGV4YW1wbGUsIEBjb2Rley5iYWxpZ253Ci00LDB4MzY4ZH0gd2lsbCBhbGlnbiB0byBhIG11bHRpcGxlIG9mIDQuICBJZiBpdCBza2lwcyB0d28gYnl0ZXMsIHRoZXkgd2lsbCBiZQotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIDB4MzY4ZCAodGhlIGV4YWN0IHBsYWNlbWVudCBvZiB0aGUgYnl0ZXMgZGVwZW5kcyB1cG9uCi10aGUgZW5kaWFubmVzcyBvZiB0aGUgcHJvY2Vzc29yKS4gIElmIGl0IHNraXBzIDEgb3IgMyBieXRlcywgdGhlIGZpbGwgdmFsdWUgaXMKLXVuZGVmaW5lZC4KLQotQG5vZGUgQnl0ZQotQHNlY3Rpb24gQGNvZGV7LmJ5dGUgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7Ynl0ZX0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXJzLCBvbmUgYnl0ZQotQGNvZGV7LmJ5dGV9IGV4cGVjdHMgemVybyBvciBtb3JlIGV4cHJlc3Npb25zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgotRWFjaCBleHByZXNzaW9uIGlzIGFzc2VtYmxlZCBpbnRvIHRoZSBuZXh0IGJ5dGUuCi0KLUBub2RlIENvbW0KLUBzZWN0aW9uIEBjb2Rley5jb21tIEB2YXJ7c3ltYm9sfSAsIEB2YXJ7bGVuZ3RofSB9Ci0KLUBjaW5kZXggQGNvZGV7Y29tbX0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCwgY29tbW9uCi1AY29kZXsuY29tbX0gZGVjbGFyZXMgYSBjb21tb24gc3ltYm9sIG5hbWVkIEB2YXJ7c3ltYm9sfS4gIFdoZW4gbGlua2luZywgYQotY29tbW9uIHN5bWJvbCBpbiBvbmUgb2JqZWN0IGZpbGUgbWF5IGJlIG1lcmdlZCB3aXRoIGEgZGVmaW5lZCBvciBjb21tb24gc3ltYm9sCi1vZiB0aGUgc2FtZSBuYW1lIGluIGFub3RoZXIgb2JqZWN0IGZpbGUuICBJZiBAY29kZXtAdmFsdWV7TER9fSBkb2VzIG5vdCBzZWUgYQotZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbC0tanVzdCBvbmUgb3IgbW9yZSBjb21tb24gc3ltYm9scy0tdGhlbiBpdCB3aWxsCi1hbGxvY2F0ZSBAdmFye2xlbmd0aH0gYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuICBAdmFye2xlbmd0aH0gbXVzdCBiZSBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbi4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IHNlZXMgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgd2l0aAotdGhlIHNhbWUgbmFtZSwgYW5kIHRoZXkgZG8gbm90IGFsbCBoYXZlIHRoZSBzYW1lIHNpemUsIGl0IHdpbGwgYWxsb2NhdGUgc3BhY2UKLXVzaW5nIHRoZSBsYXJnZXN0IHNpemUuCi0KLUBpZnNldCBFTEYKLVdoZW4gdXNpbmcgRUxGLCB0aGUgQGNvZGV7LmNvbW19IGRpcmVjdGl2ZSB0YWtlcyBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudC4KLVRoaXMgaXMgdGhlIGRlc2lyZWQgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wsIHNwZWNpZmllZCBhcyBhIGJ5dGUgYm91bmRhcnkgKGZvcgotZXhhbXBsZSwgYW4gYWxpZ25tZW50IG9mIDE2IG1lYW5zIHRoYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IDQgYml0cyBvZiB0aGUKLWFkZHJlc3Mgc2hvdWxkIGJlIHplcm8pLiAgVGhlIGFsaWdubWVudCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24sIGFuZCBpdAotbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IGFsbG9jYXRlcyB1bmluaXRpYWxpemVkIG1lbW9yeQotZm9yIHRoZSBjb21tb24gc3ltYm9sLCBpdCB3aWxsIHVzZSB0aGUgYWxpZ25tZW50IHdoZW4gcGxhY2luZyB0aGUgc3ltYm9sLiAgSWYKLW5vIGFsaWdubWVudCBpcyBzcGVjaWZpZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgc2V0IHRoZSBhbGlnbm1lbnQgdG8gdGhlCi1sYXJnZXN0IHBvd2VyIG9mIHR3byBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHN5bWJvbCwgdXAgdG8gYQotbWF4aW11bSBvZiAxNi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rley5jb21tfSBkaWZmZXJzIHNsaWdodGx5IG9uIHRoZSBIUFBBLiAgVGhlIHN5bnRheCBpcwotQHNhbXB7QHZhcntzeW1ib2x9IC5jb21tLCBAdmFye2xlbmd0aH19OyBAdmFye3N5bWJvbH0gaXMgb3B0aW9uYWwuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIERhdGEKLUBzZWN0aW9uIEBjb2Rley5kYXRhIEB2YXJ7c3Vic2VjdGlvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZGF0YX0gZGlyZWN0aXZlCi1AY29kZXsuZGF0YX0gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIG9udG8gdGhlCi1lbmQgb2YgdGhlIGRhdGEgc3Vic2VjdGlvbiBudW1iZXJlZCBAdmFye3N1YnNlY3Rpb259ICh3aGljaCBpcyBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbikuICBJZiBAdmFye3N1YnNlY3Rpb259IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzCi10byB6ZXJvLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgRGVmCi1Ac2VjdGlvbiBAY29kZXsuZGVmIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7ZGVmfSBkaXJlY3RpdmUKLUBjaW5kZXggQ09GRiBzeW1ib2xzLCBkZWJ1Z2dpbmcKLUBjaW5kZXggZGVidWdnaW5nIENPRkYgc3ltYm9scwotQmVnaW4gZGVmaW5pbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbCBAdmFye25hbWV9OyB0aGUKLWRlZmluaXRpb24gZXh0ZW5kcyB1bnRpbCB0aGUgQGNvZGV7LmVuZGVmfSBkaXJlY3RpdmUgaXMgZW5jb3VudGVyZWQuCi1AaWZzZXQgQk9VVAotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IG9ic2VydmVkIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgQ09GRgotZm9ybWF0IG91dHB1dDsgd2hlbiBwcm9kdWNpbmcgQGNvZGV7Yi5vdXR9LCBAc2FtcHsuZGVmfSBpcyByZWNvZ25pemVkLAotYnV0IGlnbm9yZWQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBpZnNldCBhb3V0LWJvdXQKLUBub2RlIERlc2MKLUBzZWN0aW9uIEBjb2Rley5kZXNjIEB2YXJ7c3ltYm9sfSwgQHZhcnthYnMtZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZGVzY30gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgc3ltYm9sIGRlc2NyaXB0b3IKLUBjaW5kZXggc3ltYm9sIGRlc2NyaXB0b3IsIENPRkYKLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHN5bWJvbCAoQHB4cmVme1N5bWJvbCBBdHRyaWJ1dGVzfSkKLXRvIHRoZSBsb3cgMTYgYml0cyBvZiBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLgotCi1AaWZzZXQgQ09GRgotVGhlIEBzYW1wey5kZXNjfSBkaXJlY3RpdmUgaXMgbm90IGF2YWlsYWJsZSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBDT0ZGIG91dHB1dDsgaXQgaXMgb25seSBmb3IgQGNvZGV7YS5vdXR9IG9yIEBjb2Rle2Iub3V0fQotb2JqZWN0IGZvcm1hdC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXRpYmlsaXR5LCBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzCi1pdCwgYnV0IHByb2R1Y2VzIG5vIG91dHB1dCwgd2hlbiBjb25maWd1cmVkIGZvciBDT0ZGLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgRGltCi1Ac2VjdGlvbiBAY29kZXsuZGltfQotCi1AY2luZGV4IEBjb2Rle2RpbX0gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgYXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbgotQGNpbmRleCBhdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey5kaW19IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIERvdWJsZQotQHNlY3Rpb24gQGNvZGV7LmRvdWJsZSBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKGRvdWJsZSkKLUBjb2Rley5kb3VibGV9IGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotYXNzZW1ibGVzIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSBAc2FtcHsuZG91YmxlfSBlbWl0cyA2NC1iaXQgZmxvYXRpbmctcG9pbnQgbnVtYmVycwotaW4gQHNje2llZWV9IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBFamVjdAotQHNlY3Rpb24gQGNvZGV7LmVqZWN0fQotCi1AY2luZGV4IEBjb2Rle2VqZWN0fSBkaXJlY3RpdmUKLUBjaW5kZXggbmV3IHBhZ2UsIGluIGxpc3RpbmdzCi1AY2luZGV4IHBhZ2UsIGluIGxpc3RpbmdzCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogbmV3IHBhZ2UKLUZvcmNlIGEgcGFnZSBicmVhayBhdCB0aGlzIHBvaW50LCB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLUBub2RlIEVsc2UKLUBzZWN0aW9uIEBjb2Rley5lbHNlfQotCi1AY2luZGV4IEBjb2Rle2Vsc2V9IGRpcmVjdGl2ZQotQGNvZGV7LmVsc2V9IGlzIHBhcnQgb2YgdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsCi1hc3NlbWJseTsgQHB4cmVme0lmLCxAY29kZXsuaWZ9fS4gIEl0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uCi1vZiBjb2RlIHRvIGJlIGFzc2VtYmxlZCBpZiB0aGUgY29uZGl0aW9uIGZvciB0aGUgcHJlY2VkaW5nIEBjb2Rley5pZn0KLXdhcyBmYWxzZS4KLQotQG5vZGUgRW5kCi1Ac2VjdGlvbiBAY29kZXsuZW5kfQotCi1AY2luZGV4IEBjb2Rle2VuZH0gZGlyZWN0aXZlCi1AY29kZXsuZW5kfSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSBmaWxlLiAgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QKLXByb2Nlc3MgYW55dGhpbmcgaW4gdGhlIGZpbGUgcGFzdCB0aGUgQGNvZGV7LmVuZH0gZGlyZWN0aXZlLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgRW5kZWYKLUBzZWN0aW9uIEBjb2Rley5lbmRlZn0KLQotQGNpbmRleCBAY29kZXtlbmRlZn0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBmbGFncyB0aGUgZW5kIG9mIGEgc3ltYm9sIGRlZmluaXRpb24gYmVndW4gd2l0aAotQGNvZGV7LmRlZn0uCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsuZW5kZWZ9IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyBpZgotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCB0byBnZW5lcmF0ZSBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcwotZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBFbmRmdW5jCi1Ac2VjdGlvbiBAY29kZXsuZW5kZnVuY30KLUBjaW5kZXggQGNvZGV7ZW5kZnVuY30gZGlyZWN0aXZlCi1AY29kZXsuZW5kZnVuY30gbWFya3MgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIHNwZWNpZmllZCB3aXRoIEBjb2Rley5mdW5jfS4KLQotQG5vZGUgRW5kaWYKLUBzZWN0aW9uIEBjb2Rley5lbmRpZn0KLQotQGNpbmRleCBAY29kZXtlbmRpZn0gZGlyZWN0aXZlCi1AY29kZXsuZW5kaWZ9IGlzIHBhcnQgb2YgdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsIGFzc2VtYmx5OwotaXQgbWFya3MgdGhlIGVuZCBvZiBhIGJsb2NrIG9mIGNvZGUgdGhhdCBpcyBvbmx5IGFzc2VtYmxlZAotY29uZGl0aW9uYWxseS4gIEB4cmVme0lmLCxAY29kZXsuaWZ9fS4KLQotQG5vZGUgRXF1Ci1Ac2VjdGlvbiBAY29kZXsuZXF1IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLQotQGNpbmRleCBAY29kZXtlcXV9IGRpcmVjdGl2ZQotQGNpbmRleCBhc3NpZ25pbmcgdmFsdWVzIHRvIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgYXNzaWduaW5nIHZhbHVlcyB0bwotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgdmFsdWUgb2YgQHZhcntzeW1ib2x9IHRvIEB2YXJ7ZXhwcmVzc2lvbn0uCi1JdCBpcyBzeW5vbnltb3VzIHdpdGggQHNhbXB7LnNldH07IEBweHJlZntTZXQsLEBjb2Rley5zZXR9fS4KLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rle2VxdX0gb24gdGhlIEhQUEEgaXMgCi1Ac2FtcHtAdmFye3N5bWJvbH0gLmVxdSBAdmFye2V4cHJlc3Npb259fS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgRXF1aXYKLUBzZWN0aW9uIEBjb2Rley5lcXVpdiBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci1AY2luZGV4IEBjb2Rle2VxdWl2fSBkaXJlY3RpdmUKLVRoZSBAY29kZXsuZXF1aXZ9IGRpcmVjdGl2ZSBpcyBsaWtlIEBjb2Rley5lcXV9IGFuZCBAY29kZXsuc2V0fSwgZXhjZXB0IHRoYXQKLXRoZSBhc3NlbWJsZXIgd2lsbCBzaWduYWwgYW4gZXJyb3IgaWYgQHZhcntzeW1ib2x9IGlzIGFscmVhZHkgZGVmaW5lZC4KLQotRXhjZXB0IGZvciB0aGUgY29udGVudHMgb2YgdGhlIGVycm9yIG1lc3NhZ2UsIHRoaXMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIAotQHNtYWxsZXhhbXBsZQotLmlmZGVmIFNZTQotLmVycgotLmVuZGlmCi0uZXF1IFNZTSxWQUwKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEVycgotQHNlY3Rpb24gQGNvZGV7LmVycn0KLUBjaW5kZXggQGNvZGV7ZXJyfSBkaXJlY3RpdmUKLUlmIEBjb2Rle0B2YWx1ZXtBU319IGFzc2VtYmxlcyBhIEBjb2Rley5lcnJ9IGRpcmVjdGl2ZSwgaXQgd2lsbCBwcmludCBhbiBlcnJvcgotbWVzc2FnZSBhbmQsIHVubGVzcyB0aGUgQGNvZGV7LVp9IG9wdGlvbiB3YXMgdXNlZCwgaXQgd2lsbCBub3QgZ2VuZXJhdGUgYW4KLW9iamVjdCBmaWxlLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzaWduYWwgZXJyb3IgYW4gY29uZGl0aW9uYWxseSBjb21waWxlZCBjb2RlLgotCi1Abm9kZSBFeGl0bQotQHNlY3Rpb24gQGNvZGV7LmV4aXRtfQotRXhpdCBlYXJseSBmcm9tIHRoZSBjdXJyZW50IG1hY3JvIGRlZmluaXRpb24uICBAeHJlZntNYWNyb30uCi0KLUBub2RlIEV4dGVybgotQHNlY3Rpb24gQGNvZGV7LmV4dGVybn0KLQotQGNpbmRleCBAY29kZXtleHRlcm59IGRpcmVjdGl2ZQotQGNvZGV7LmV4dGVybn0gaXMgYWNjZXB0ZWQgaW4gdGhlIHNvdXJjZSBwcm9ncmFtLS0tZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgYXNzZW1ibGVycy0tLWJ1dCBpdCBpcyBpZ25vcmVkLiAgQGNvZGV7QHZhbHVle0FTfX0gdHJlYXRzCi1hbGwgdW5kZWZpbmVkIHN5bWJvbHMgYXMgZXh0ZXJuYWwuCi0KLUBub2RlIEZhaWwKLUBzZWN0aW9uIEBjb2Rley5mYWlsIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZmFpbH0gZGlyZWN0aXZlCi1HZW5lcmF0ZXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLiAgSWYgdGhlIHZhbHVlIG9mIHRoZSBAdmFye2V4cHJlc3Npb259IGlzIDUwMAotb3IgbW9yZSwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBwcmludCBhIHdhcm5pbmcgbWVzc2FnZS4gIElmIHRoZSB2YWx1ZSBpcyBsZXNzCi10aGFuIDUwMCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBwcmludCBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIG1lc3NhZ2Ugd2lsbAotaW5jbHVkZSB0aGUgdmFsdWUgb2YgQHZhcntleHByZXNzaW9ufS4gIFRoaXMgY2FuIG9jY2FzaW9uYWxseSBiZSB1c2VmdWwgaW5zaWRlCi1jb21wbGV4IG5lc3RlZCBtYWNyb3Mgb3IgY29uZGl0aW9uYWwgYXNzZW1ibHkuCi0KLUBpZmNsZWFyIG5vLWZpbGUtZGlyCi1Abm9kZSBGaWxlCi1Ac2VjdGlvbiBAY29kZXsuZmlsZSBAdmFye3N0cmluZ319Ci0KLUBjaW5kZXggQGNvZGV7ZmlsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGxvZ2ljYWwgZmlsZSBuYW1lCi1AY2luZGV4IGZpbGUgbmFtZSwgbG9naWNhbAotQGNvZGV7LmZpbGV9IHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRoYXQgd2UgYXJlIGFib3V0IHRvIHN0YXJ0IGEgbmV3IGxvZ2ljYWwKLWZpbGUuICBAdmFye3N0cmluZ30gaXMgdGhlIG5ldyBmaWxlIG5hbWUuICBJbiBnZW5lcmFsLCB0aGUgZmlsZW5hbWUgaXMKLXJlY29nbml6ZWQgd2hldGhlciBvciBub3QgaXQgaXMgc3Vycm91bmRlZCBieSBxdW90ZXMgQHNhbXB7In07IGJ1dCBpZiB5b3Ugd2lzaAotdG8gc3BlY2lmeSBhbiBlbXB0eSBmaWxlIG5hbWUsIHlvdSBtdXN0IGdpdmUgdGhlIHF1b3Rlcy0tQGNvZGV7IiJ9LiAgVGhpcwotc3RhdGVtZW50IG1heSBnbyBhd2F5IGluIGZ1dHVyZTogaXQgaXMgb25seSByZWNvZ25pemVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aAotb2xkIEBjb2Rle0B2YWx1ZXtBU319IHByb2dyYW1zLgotQGlmc2V0IEEyOUsKLUluIHNvbWUgY29uZmlndXJhdGlvbnMgb2YgQGNvZGV7QHZhbHVle0FTfX0sIEBjb2Rley5maWxlfSBoYXMgYWxyZWFkeSBiZWVuCi1yZW1vdmVkIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIGFzc2VtYmxlcnMuICBAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgRmlsbAotQHNlY3Rpb24gQGNvZGV7LmZpbGwgQHZhcntyZXBlYXR9ICwgQHZhcntzaXplfSAsIEB2YXJ7dmFsdWV9fQotCi1AY2luZGV4IEBjb2Rle2ZpbGx9IGRpcmVjdGl2ZQotQGNpbmRleCB3cml0aW5nIHBhdHRlcm5zIGluIG1lbW9yeQotQGNpbmRleCBwYXR0ZXJucywgd3JpdGluZyBpbiBtZW1vcnkKLUB2YXJ7cmVzdWx0fSwgQHZhcntzaXplfSBhbmQgQHZhcnt2YWx1ZX0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLgotVGhpcyBlbWl0cyBAdmFye3JlcGVhdH0gY29waWVzIG9mIEB2YXJ7c2l6ZX0gYnl0ZXMuICBAdmFye1JlcGVhdH0KLW1heSBiZSB6ZXJvIG9yIG1vcmUuICBAdmFye1NpemV9IG1heSBiZSB6ZXJvIG9yIG1vcmUsIGJ1dCBpZiBpdCBpcwotbW9yZSB0aGFuIDgsIHRoZW4gaXQgaXMgZGVlbWVkIHRvIGhhdmUgdGhlIHZhbHVlIDgsIGNvbXBhdGlibGUgd2l0aAotb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4gIFRoZSBjb250ZW50cyBvZiBlYWNoIEB2YXJ7cmVwZWF0fSBieXRlcwotaXMgdGFrZW4gZnJvbSBhbiA4LWJ5dGUgbnVtYmVyLiAgVGhlIGhpZ2hlc3Qgb3JkZXIgNCBieXRlcyBhcmUKLXplcm8uICBUaGUgbG93ZXN0IG9yZGVyIDQgYnl0ZXMgYXJlIEB2YXJ7dmFsdWV9IHJlbmRlcmVkIGluIHRoZQotYnl0ZS1vcmRlciBvZiBhbiBpbnRlZ2VyIG9uIHRoZSBjb21wdXRlciBAY29kZXtAdmFsdWV7QVN9fSBpcyBhc3NlbWJsaW5nIGZvci4KLUVhY2ggQHZhcntzaXplfSBieXRlcyBpbiBhIHJlcGV0aXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgbG93ZXN0IG9yZGVyCi1AdmFye3NpemV9IGJ5dGVzIG9mIHRoaXMgbnVtYmVyLiAgQWdhaW4sIHRoaXMgYml6YXJyZSBiZWhhdmlvciBpcwotY29tcGF0aWJsZSB3aXRoIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuCi0KLUB2YXJ7c2l6ZX0gYW5kIEB2YXJ7dmFsdWV9IGFyZSBvcHRpb25hbC4KLUlmIHRoZSBzZWNvbmQgY29tbWEgYW5kIEB2YXJ7dmFsdWV9IGFyZSBhYnNlbnQsIEB2YXJ7dmFsdWV9IGlzCi1hc3N1bWVkIHplcm8uICBJZiB0aGUgZmlyc3QgY29tbWEgYW5kIGZvbGxvd2luZyB0b2tlbnMgYXJlIGFic2VudCwKLUB2YXJ7c2l6ZX0gaXMgYXNzdW1lZCB0byBiZSAxLgotCi1Abm9kZSBGbG9hdAotQHNlY3Rpb24gQGNvZGV7LmZsb2F0IEB2YXJ7ZmxvbnVtc319Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoc2luZ2xlKQotQGNpbmRleCBAY29kZXtmbG9hdH0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBhc3NlbWJsZXMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBAY29kZXsuc2luZ2xlfS4KLUBpZnNldCBHRU5FUklDCi1UaGUgZXhhY3Qga2luZCBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzIGVtaXR0ZWQgZGVwZW5kcyBvbiBob3cKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQuCi1AeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSUVFRUZMT0FUCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LCBAY29kZXsuZmxvYXR9IGVtaXRzIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXJzCi1pbiBAc2N7aWVlZX0gZm9ybWF0LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIEZ1bmMKLUBzZWN0aW9uIEBjb2Rley5mdW5jIEB2YXJ7bmFtZX1bLEB2YXJ7bGFiZWx9XX0KLUBjaW5kZXggQGNvZGV7ZnVuY30gZGlyZWN0aXZlCi1AY29kZXsuZnVuY30gZW1pdHMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSBmdW5jdGlvbiBAdmFye25hbWV9LCBhbmQKLWlzIGlnbm9yZWQgdW5sZXNzIHRoZSBmaWxlIGlzIGFzc2VtYmxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLgotT25seSBAc2FtcHstLWdzdGFic30gaXMgY3VycmVudGx5IHN1cHBvcnRlZC4KLUB2YXJ7bGFiZWx9IGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgZnVuY3Rpb24gYW5kIGlmIG9taXR0ZWQgQHZhcntuYW1lfQotcHJlcGVuZGVkIHdpdGggdGhlIEBzYW1we2xlYWRpbmcgY2hhcn0gaXMgdXNlZC4KLUBzYW1we2xlYWRpbmcgY2hhcn0gaXMgdXN1YWxseSBAY29kZXtffSBvciBub3RoaW5nLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KLUFsbCBmdW5jdGlvbnMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIHRvIGhhdmUgQGNvZGV7dm9pZH0gcmV0dXJuIHR5cGUuCi1UaGUgZnVuY3Rpb24gbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggQGNvZGV7LmVuZGZ1bmN9LgotCi1Abm9kZSBHbG9iYWwKLUBzZWN0aW9uIEBjb2Rley5nbG9iYWwgQHZhcntzeW1ib2x9fSwgQGNvZGV7Lmdsb2JsIEB2YXJ7c3ltYm9sfX0KLQotQGNpbmRleCBAY29kZXtnbG9iYWx9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wsIG1ha2luZyB2aXNpYmxlIHRvIGxpbmtlcgotQGNvZGV7Lmdsb2JhbH0gbWFrZXMgdGhlIHN5bWJvbCB2aXNpYmxlIHRvIEBjb2Rle0B2YWx1ZXtMRH19LiAgSWYgeW91IGRlZmluZQotQHZhcntzeW1ib2x9IGluIHlvdXIgcGFydGlhbCBwcm9ncmFtLCBpdHMgdmFsdWUgaXMgbWFkZSBhdmFpbGFibGUgdG8KLW90aGVyIHBhcnRpYWwgcHJvZ3JhbXMgdGhhdCBhcmUgbGlua2VkIHdpdGggaXQuICBPdGhlcndpc2UsCi1AdmFye3N5bWJvbH0gdGFrZXMgaXRzIGF0dHJpYnV0ZXMgZnJvbSBhIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lCi1mcm9tIGFub3RoZXIgZmlsZSBsaW5rZWQgaW50byB0aGUgc2FtZSBwcm9ncmFtLgotCi1Cb3RoIHNwZWxsaW5ncyAoQHNhbXB7Lmdsb2JsfSBhbmQgQHNhbXB7Lmdsb2JhbH0pIGFyZSBhY2NlcHRlZCwgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4KLQotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBLCBAY29kZXsuZ2xvYmFsfSBpcyBub3QgYWx3YXlzIGVub3VnaCB0byBtYWtlIGl0IGFjY2Vzc2libGUgdG8gb3RoZXIKLXBhcnRpYWwgcHJvZ3JhbXMuICBZb3UgbWF5IG5lZWQgdGhlIEhQUEEtb25seSBAY29kZXsuRVhQT1JUfSBkaXJlY3RpdmUgYXMgd2VsbC4KLUB4cmVme0hQUEEgRGlyZWN0aXZlcywsIEhQUEEgQXNzZW1ibGVyIERpcmVjdGl2ZXN9LgotQGVuZCBpZnNldAotCi1Abm9kZSBod29yZAotQHNlY3Rpb24gQGNvZGV7Lmh3b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle2h3b3JkfSBkaXJlY3RpdmUKLUBjaW5kZXggaW50ZWdlcnMsIDE2LWJpdAotQGNpbmRleCBudW1iZXJzLCAxNi1iaXQKLUBjaW5kZXggc2l4dGVlbiBiaXQgaW50ZWdlcnMKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIGFuZCBlbWl0cwotYSAxNiBiaXQgbnVtYmVyIGZvciBlYWNoLgotCi1AaWZzZXQgR0VORVJJQwotVGhpcyBkaXJlY3RpdmUgaXMgYSBzeW5vbnltIGZvciBAc2FtcHsuc2hvcnR9OyBkZXBlbmRpbmcgb24gdGhlIHRhcmdldAotYXJjaGl0ZWN0dXJlLCBpdCBtYXkgYWxzbyBiZSBhIHN5bm9ueW0gZm9yIEBzYW1wey53b3JkfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMzIKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgQHNhbXB7LnNob3J0fS4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMTYKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgYm90aCBAc2FtcHsuc2hvcnR9IGFuZCBAc2FtcHsud29yZH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSWRlbnQKLUBzZWN0aW9uIEBjb2Rley5pZGVudH0KLQotQGNpbmRleCBAY29kZXtpZGVudH0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBpcyB1c2VkIGJ5IHNvbWUgYXNzZW1ibGVycyB0byBwbGFjZSB0YWdzIGluIG9iamVjdCBmaWxlcy4KLUBjb2Rle0B2YWx1ZXtBU319IHNpbXBseSBhY2NlcHRzIHRoZSBkaXJlY3RpdmUgZm9yIHNvdXJjZS1maWxlCi1jb21wYXRpYmlsaXR5IHdpdGggc3VjaCBhc3NlbWJsZXJzLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgZW1pdCBhbnl0aGluZwotZm9yIGl0LgotCi1Abm9kZSBJZgotQHNlY3Rpb24gQGNvZGV7LmlmIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggY29uZGl0aW9uYWwgYXNzZW1ibHkKLUBjaW5kZXggQGNvZGV7aWZ9IGRpcmVjdGl2ZQotQGNvZGV7LmlmfSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2VjdGlvbiBvZiBjb2RlIHdoaWNoIGlzIG9ubHkKLWNvbnNpZGVyZWQgcGFydCBvZiB0aGUgc291cmNlIHByb2dyYW0gYmVpbmcgYXNzZW1ibGVkIGlmIHRoZSBhcmd1bWVudAotKHdoaWNoIG11c3QgYmUgYW4gQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufSkgaXMgbm9uLXplcm8uICBUaGUgZW5kIG9mCi10aGUgY29uZGl0aW9uYWwgc2VjdGlvbiBvZiBjb2RlIG11c3QgYmUgbWFya2VkIGJ5IEBjb2Rley5lbmRpZn0KLShAcHhyZWZ7RW5kaWYsLEBjb2Rley5lbmRpZn19KTsgb3B0aW9uYWxseSwgeW91IG1heSBpbmNsdWRlIGNvZGUgZm9yIHRoZQotYWx0ZXJuYXRpdmUgY29uZGl0aW9uLCBmbGFnZ2VkIGJ5IEBjb2Rley5lbHNlfSAoQHB4cmVme0Vsc2UsLEBjb2Rley5lbHNlfX0pLgotCi1UaGUgZm9sbG93aW5nIHZhcmlhbnRzIG9mIEBjb2Rley5pZn0gYXJlIGFsc28gc3VwcG9ydGVkOgotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2lmZGVmfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmRlZiBAdmFye3N5bWJvbH0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgc3BlY2lmaWVkIEB2YXJ7c3ltYm9sfQotaGFzIGJlZW4gZGVmaW5lZC4KLQotQGNpbmRleCBAY29kZXtpZmN9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmYyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIHRoZSBzYW1lLiAgVGhlCi1zdHJpbmdzIG1heSBiZSBvcHRpb25hbGx5IHF1b3RlZCB3aXRoIHNpbmdsZSBxdW90ZXMuICBJZiB0aGV5IGFyZSBub3QgcXVvdGVkLAotdGhlIGZpcnN0IHN0cmluZyBzdG9wcyBhdCB0aGUgZmlyc3QgY29tbWEsIGFuZCB0aGUgc2Vjb25kIHN0cmluZyBzdG9wcyBhdCB0aGUKLWVuZCBvZiB0aGUgbGluZS4gIFN0cmluZ3Mgd2hpY2ggY29udGFpbiB3aGl0ZXNwYWNlIHNob3VsZCBiZSBxdW90ZWQuICBUaGUKLXN0cmluZyBjb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLgotCi1AY2luZGV4IEBjb2Rle2lmZXF9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmZXEgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmZXFzfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmVxcyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUFub3RoZXIgZm9ybSBvZiBAY29kZXsuaWZjfS4gIFRoZSBzdHJpbmdzIG11c3QgYmUgcXVvdGVkIHVzaW5nIGRvdWJsZSBxdW90ZXMuCi0KLUBjaW5kZXggQGNvZGV7aWZnZX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZnZSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiBvcgotZXF1YWwgdG8gemVyby4KLQotQGNpbmRleCBAY29kZXtpZmd0fSBkaXJlY3RpdmUKLUBpdGVtIC5pZmd0IEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZsZX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZsZSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbAotdG8gemVyby4KLQotQGNpbmRleCBAY29kZXtpZmx0fSBkaXJlY3RpdmUKLUBpdGVtIC5pZmx0IEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZuY30gZGlyZWN0aXZlCi1AaXRlbSAuaWZuYyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0uCi1MaWtlIEBjb2Rley5pZmN9LCBidXQgdGhlIHNlbnNlIG9mIHRoZSB0ZXN0IGlzIHJldmVyc2VkOiB0aGlzIGFzc2VtYmxlcyB0aGUKLWZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUuCi0KLUBjaW5kZXggQGNvZGV7aWZuZGVmfSBkaXJlY3RpdmUKLUBjaW5kZXggQGNvZGV7aWZub3RkZWZ9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbmRlZiBAdmFye3N5bWJvbH0KLUBpdGVteCAuaWZub3RkZWYgQHZhcntzeW1ib2x9Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHNwZWNpZmllZCBAdmFye3N5bWJvbH0KLWhhcyBub3QgYmVlbiBkZWZpbmVkLiAgQm90aCBzcGVsbGluZyB2YXJpYW50cyBhcmUgZXF1aXZhbGVudC4KLQotQGNpbmRleCBAY29kZXtpZm5lfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5lIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGVxdWFsIHRvIHplcm8KLShpbiBvdGhlciB3b3JkcywgdGhpcyBpcyBlcXVpdmFsZW50IHRvIEBjb2Rley5pZn0pLgotCi1AY2luZGV4IEBjb2Rle2lmbmVzfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5lcyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUxpa2UgQGNvZGV7LmlmZXFzfSwgYnV0IHRoZSBzZW5zZSBvZiB0aGUgdGVzdCBpcyByZXZlcnNlZDogdGhpcyBhc3NlbWJsZXMgdGhlCi1mb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmNsdWRlCi1Ac2VjdGlvbiBAY29kZXsuaW5jbHVkZSAiQHZhcntmaWxlfSJ9Ci0KLUBjaW5kZXggQGNvZGV7aW5jbHVkZX0gZGlyZWN0aXZlCi1AY2luZGV4IHN1cHBvcnRpbmcgZmlsZXMsIGluY2x1ZGluZwotQGNpbmRleCBmaWxlcywgaW5jbHVkaW5nCi1UaGlzIGRpcmVjdGl2ZSBwcm92aWRlcyBhIHdheSB0byBpbmNsdWRlIHN1cHBvcnRpbmcgZmlsZXMgYXQgc3BlY2lmaWVkCi1wb2ludHMgaW4geW91ciBzb3VyY2UgcHJvZ3JhbS4gIFRoZSBjb2RlIGZyb20gQHZhcntmaWxlfSBpcyBhc3NlbWJsZWQgYXMKLWlmIGl0IGZvbGxvd2VkIHRoZSBwb2ludCBvZiB0aGUgQGNvZGV7LmluY2x1ZGV9OyB3aGVuIHRoZSBlbmQgb2YgdGhlCi1pbmNsdWRlZCBmaWxlIGlzIHJlYWNoZWQsIGFzc2VtYmx5IG9mIHRoZSBvcmlnaW5hbCBmaWxlIGNvbnRpbnVlcy4gIFlvdQotY2FuIGNvbnRyb2wgdGhlIHNlYXJjaCBwYXRocyB1c2VkIHdpdGggdGhlIEBzYW1wey1JfSBjb21tYW5kLWxpbmUgb3B0aW9uCi0oQHB4cmVme0ludm9raW5nLCxDb21tYW5kLUxpbmUgT3B0aW9uc30pLiAgUXVvdGF0aW9uIG1hcmtzIGFyZSByZXF1aXJlZAotYXJvdW5kIEB2YXJ7ZmlsZX0uCi0KLUBub2RlIEludAotQHNlY3Rpb24gQGNvZGV7LmludCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZQotQGNpbmRleCBpbnRlZ2VycywgMzItYml0Ci1FeHBlY3QgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBvZiBhbnkgc2VjdGlvbiwgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLUZvciBlYWNoIGV4cHJlc3Npb24sIGVtaXQgYSBudW1iZXIgdGhhdCwgYXQgcnVuIHRpbWUsIGlzIHRoZSB2YWx1ZSBvZiB0aGF0Ci1leHByZXNzaW9uLiAgVGhlIGJ5dGUgb3JkZXIgYW5kIGJpdCBzaXplIG9mIHRoZSBudW1iZXIgZGVwZW5kcyBvbiB3aGF0IGtpbmQKLW9mIHRhcmdldCB0aGUgYXNzZW1ibHkgaXMgZm9yLgotCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgKLU9uIHRoZSBIOC81MDAgYW5kIG1vc3QgZm9ybXMgb2YgdGhlIEg4LzMwMCwgQGNvZGV7LmludH0gZW1pdHMgMTYtYml0Ci1pbnRlZ2Vycy4gIE9uIHRoZSBIOC8zMDBIIGFuZCB0aGUgSGl0YWNoaSBTSCwgaG93ZXZlciwgQGNvZGV7LmludH0gZW1pdHMKLTMyLWJpdCBpbnRlZ2Vycy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBJcnAKLUBzZWN0aW9uIEBjb2Rley5pcnAgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7aXJwfSBkaXJlY3RpdmUKLUV2YWx1YXRlIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBhc3NpZ25pbmcgZGlmZmVyZW50IHZhbHVlcyB0byBAdmFye3N5bWJvbH0uCi1UaGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBzdGFydHMgYXQgdGhlIEBjb2Rley5pcnB9IGRpcmVjdGl2ZSwgYW5kIGlzCi10ZXJtaW5hdGVkIGJ5IGFuIEBjb2Rley5lbmRyfSBkaXJlY3RpdmUuICBGb3IgZWFjaCBAdmFye3ZhbHVlfSwgQHZhcntzeW1ib2x9IGlzCi1zZXQgdG8gQHZhcnt2YWx1ZX0sIGFuZCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcyBhc3NlbWJsZWQuICBJZiBubwotQHZhcnt2YWx1ZX0gaXMgbGlzdGVkLCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcyBhc3NlbWJsZWQgb25jZSwgd2l0aAotQHZhcntzeW1ib2x9IHNldCB0byB0aGUgbnVsbCBzdHJpbmcuICBUbyByZWZlciB0byBAdmFye3N5bWJvbH0gd2l0aGluIHRoZQotc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgdXNlIEB2YXJ7XHN5bWJvbH0uCi0KLUZvciBleGFtcGxlLCBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5pcnAgICAgcGFyYW0sMSwyLDMKLSAgICAgICAgbW92ZSAgICBkXHBhcmFtLHNwQEAtCi0gICAgICAgIC5lbmRyCi1AZW5kIGV4YW1wbGUKLQotaXMgZXF1aXZhbGVudCB0byBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIG1vdmUgICAgZDEsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMixzcEBALQotICAgICAgICBtb3ZlICAgIGQzLHNwQEAtCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgSXJwYwotQHNlY3Rpb24gQGNvZGV7LmlycGMgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7aXJwY30gZGlyZWN0aXZlCi1FdmFsdWF0ZSBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgYXNzaWduaW5nIGRpZmZlcmVudCB2YWx1ZXMgdG8gQHZhcntzeW1ib2x9LgotVGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgc3RhcnRzIGF0IHRoZSBAY29kZXsuaXJwY30gZGlyZWN0aXZlLCBhbmQgaXMKLXRlcm1pbmF0ZWQgYnkgYW4gQGNvZGV7LmVuZHJ9IGRpcmVjdGl2ZS4gIEZvciBlYWNoIGNoYXJhY3RlciBpbiBAdmFye3ZhbHVlfSwKLUB2YXJ7c3ltYm9sfSBpcyBzZXQgdG8gdGhlIGNoYXJhY3RlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzCi1hc3NlbWJsZWQuICBJZiBubyBAdmFye3ZhbHVlfSBpcyBsaXN0ZWQsIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzCi1hc3NlbWJsZWQgb25jZSwgd2l0aCBAdmFye3N5bWJvbH0gc2V0IHRvIHRoZSBudWxsIHN0cmluZy4gIFRvIHJlZmVyIHRvCi1AdmFye3N5bWJvbH0gd2l0aGluIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLCB1c2UgQHZhcntcc3ltYm9sfS4KLQotRm9yIGV4YW1wbGUsIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgLmlycGMgICAgcGFyYW0sMTIzCi0gICAgICAgIG1vdmUgICAgZFxwYXJhbSxzcEBALQotICAgICAgICAuZW5kcgotQGVuZCBleGFtcGxlCi0KLWlzIGVxdWl2YWxlbnQgdG8gYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICBtb3ZlICAgIGQxLHNwQEAtCi0gICAgICAgIG1vdmUgICAgZDIsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMyxzcEBALQotQGVuZCBleGFtcGxlCi0KLUBub2RlIExjb21tCi1Ac2VjdGlvbiBAY29kZXsubGNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9fQotCi1AY2luZGV4IEBjb2Rle2xjb21tfSBkaXJlY3RpdmUKLUBjaW5kZXggbG9jYWwgY29tbW9uIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgbG9jYWwgY29tbW9uCi1SZXNlcnZlIEB2YXJ7bGVuZ3RofSAoYW4gYWJzb2x1dGUgZXhwcmVzc2lvbikgYnl0ZXMgZm9yIGEgbG9jYWwgY29tbW9uCi1kZW5vdGVkIGJ5IEB2YXJ7c3ltYm9sfS4gIFRoZSBzZWN0aW9uIGFuZCB2YWx1ZSBvZiBAdmFye3N5bWJvbH0gYXJlCi10aG9zZSBvZiB0aGUgbmV3IGxvY2FsIGNvbW1vbi4gIFRoZSBhZGRyZXNzZXMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgYnNzCi1zZWN0aW9uLCBzbyB0aGF0IGF0IHJ1bi10aW1lIHRoZSBieXRlcyBzdGFydCBvZmYgemVyb2VkLiAgQHZhcntTeW1ib2x9Ci1pcyBub3QgZGVjbGFyZWQgZ2xvYmFsIChAcHhyZWZ7R2xvYmFsLCxAY29kZXsuZ2xvYmFsfX0pLCBzbyBpcyBub3JtYWxseQotbm90IHZpc2libGUgdG8gQGNvZGV7QHZhbHVle0xEfX0uCi0KLUBpZnNldCBHRU5FUklDCi1Tb21lIHRhcmdldHMgcGVybWl0IGEgdGhpcmQgYXJndW1lbnQgdG8gYmUgdXNlZCB3aXRoIEBjb2Rley5sY29tbX0uICBUaGlzCi1hcmd1bWVudCBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wgaW4gdGhlIGJzcyBzZWN0aW9uLgotQGVuZCBpZnNldAotCi1AaWZzZXQgSFBQQQotVGhlIHN5bnRheCBmb3IgQGNvZGV7Lmxjb21tfSBkaWZmZXJzIHNsaWdodGx5IG9uIHRoZSBIUFBBLiAgVGhlIHN5bnRheCBpcwotQHNhbXB7QHZhcntzeW1ib2x9IC5sY29tbSwgQHZhcntsZW5ndGh9fTsgQHZhcntzeW1ib2x9IGlzIG9wdGlvbmFsLgotQGVuZCBpZnNldAotCi1Abm9kZSBMZmxhZ3MKLUBzZWN0aW9uIEBjb2Rley5sZmxhZ3N9Ci0KLUBjaW5kZXggQGNvZGV7bGZsYWdzfSBkaXJlY3RpdmUgKGlnbm9yZWQpCi1AY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzLCBidXQgaWdub3JlcyBpdC4KLQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLUBub2RlIExpbmUKLUBzZWN0aW9uIEBjb2Rley5saW5lIEB2YXJ7bGluZS1udW1iZXJ9fQotCi1AY2luZGV4IEBjb2Rle2xpbmV9IGRpcmVjdGl2ZQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgbm8tbGluZS1kaXIKLUBub2RlIExuCi1Ac2VjdGlvbiBAY29kZXsubG4gQHZhcntsaW5lLW51bWJlcn19Ci0KLUBjaW5kZXggQGNvZGV7bG59IGRpcmVjdGl2ZQotQGVuZCBpZnNldAotQGNpbmRleCBsb2dpY2FsIGxpbmUgbnVtYmVyCi1AaWZzZXQgYW91dC1ib3V0Ci1DaGFuZ2UgdGhlIGxvZ2ljYWwgbGluZSBudW1iZXIuICBAdmFye2xpbmUtbnVtYmVyfSBtdXN0IGJlIGFuIGFic29sdXRlCi1leHByZXNzaW9uLiAgVGhlIG5leHQgbGluZSBoYXMgdGhhdCBsb2dpY2FsIGxpbmUgbnVtYmVyLiAgVGhlcmVmb3JlIGFueSBvdGhlcgotc3RhdGVtZW50cyBvbiB0aGUgY3VycmVudCBsaW5lIChhZnRlciBhIHN0YXRlbWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyKSBhcmUKLXJlcG9ydGVkIGFzIG9uIGxvZ2ljYWwgbGluZSBudW1iZXIgQHZhcntsaW5lLW51bWJlcn0gQG1pbnVze30gMS4gIE9uZSBkYXkKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgbm8gbG9uZ2VyIHN1cHBvcnQgdGhpcyBkaXJlY3RpdmU6IGl0IGlzIHJlY29nbml6ZWQgb25seQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhc3NlbWJsZXIgcHJvZ3JhbXMuCi0KLUBpZnNldCBHRU5FUklDCi1AaWZzZXQgQTI5SwotQGVtcGh7V2FybmluZzp9IEluIHRoZSBBTUQyOUsgY29uZmlndXJhdGlvbiBvZiBAdmFsdWV7QVN9LCB0aGlzIGNvbW1hbmQgaXMKLW5vdCBhdmFpbGFibGU7IHVzZSB0aGUgc3lub255bSBAY29kZXsubG59IGluIHRoYXQgY29udGV4dC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLUV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBkaXJlY3RpdmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBAY29kZXthLm91dH0gb3IKLUBjb2Rle2Iub3V0fSBvYmplY3QtY29kZSBmb3JtYXRzLCBAY29kZXtAdmFsdWV7QVN9fSBzdGlsbCByZWNvZ25pemVzIGl0Ci13aGVuIHByb2R1Y2luZyBDT0ZGIG91dHB1dCwgYW5kIHRyZWF0cyBAc2FtcHsubGluZX0gYXMgdGhvdWdoIGl0Ci13ZXJlIHRoZSBDT0ZGIEBzYW1wey5sbn0gQGVtcGh7aWZ9IGl0IGlzIGZvdW5kIG91dHNpZGUgYQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlyLgotCi1JbnNpZGUgYSBAY29kZXsuZGVmfSwgQHNhbXB7LmxpbmV9IGlzLCBpbnN0ZWFkLCBvbmUgb2YgdGhlIGRpcmVjdGl2ZXMKLXVzZWQgYnkgY29tcGlsZXJzIHRvIGdlbmVyYXRlIGF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24gZm9yCi1kZWJ1Z2dpbmcuCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgTGlua29uY2UKLUBzZWN0aW9uIEBjb2Rley5saW5rb25jZSBbQHZhcnt0eXBlfV19Ci1AY2luZGV4IENPTURBVAotQGNpbmRleCBAY29kZXtsaW5rb25jZX0gZGlyZWN0aXZlCi1AY2luZGV4IGNvbW1vbiBzZWN0aW9ucwotTWFyayB0aGUgY3VycmVudCBzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBvbmx5IGluY2x1ZGVzIGEgc2luZ2xlIGNvcHkgb2YgaXQuCi1UaGlzIG1heSBiZSB1c2VkIHRvIGluY2x1ZGUgdGhlIHNhbWUgc2VjdGlvbiBpbiBzZXZlcmFsIGRpZmZlcmVudCBvYmplY3QgZmlsZXMsCi1idXQgZW5zdXJlIHRoYXQgdGhlIGxpbmtlciB3aWxsIG9ubHkgaW5jbHVkZSBpdCBvbmNlIGluIHRoZSBmaW5hbCBvdXRwdXQgZmlsZS4KLVRoZSBAY29kZXsubGlua29uY2V9IHBzZXVkby1vcCBtdXN0IGJlIHVzZWQgZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIHNlY3Rpb24uCi1EdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGRldGVjdGVkIGJhc2VkIG9uIHRoZSBzZWN0aW9uIG5hbWUsIHNvIGl0IHNob3VsZCBiZQotdW5pcXVlLgotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBhIGZldyBvYmplY3QgZmlsZSBmb3JtYXRzOyBhcyBvZiB0aGlzCi13cml0aW5nLCB0aGUgb25seSBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgaXQgaXMgdGhlIFBvcnRhYmxlCi1FeGVjdXRhYmxlIGZvcm1hdCB1c2VkIG9uIFdpbmRvd3MgTlQuCi0KLVRoZSBAdmFye3R5cGV9IGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIG9uZSBvZiB0aGUKLWZvbGxvd2luZyBzdHJpbmdzLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0ubGlua29uY2Ugc2FtZV9zaXplCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90IGFsbCB0eXBlcyBtYXkgYmUgc3VwcG9ydGVkIG9uIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGRpc2NhcmQKLVNpbGVudGx5IGRpc2NhcmQgZHVwbGljYXRlIHNlY3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLQotQGl0ZW0gb25lX29ubHkKLVdhcm4gaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBzZWN0aW9ucywgYnV0IHN0aWxsIGtlZXAgb25seSBvbmUgY29weS4KLQotQGl0ZW0gc2FtZV9zaXplCi1XYXJuIGlmIGFueSBvZiB0aGUgZHVwbGljYXRlcyBoYXZlIGRpZmZlcmVudCBzaXplcy4KLQotQGl0ZW0gc2FtZV9jb250ZW50cwotV2FybiBpZiBhbnkgb2YgdGhlIGR1cGxpY2F0ZXMgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBjb250ZW50cy4KLUBlbmQgdGFibGUKLQotQG5vZGUgTG4KLUBzZWN0aW9uIEBjb2Rley5sbiBAdmFye2xpbmUtbnVtYmVyfX0KLQotQGNpbmRleCBAY29kZXtsbn0gZGlyZWN0aXZlCi1AaWZjbGVhciBuby1saW5lLWRpcgotQHNhbXB7LmxufSBpcyBhIHN5bm9ueW0gZm9yIEBzYW1wey5saW5lfS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IG5vLWxpbmUtZGlyCi1UZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRvIGNoYW5nZSB0aGUgbG9naWNhbCBsaW5lIG51bWJlci4gIEB2YXJ7bGluZS1udW1iZXJ9Ci1tdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgbmV4dCBsaW5lIGhhcyB0aGF0IGxvZ2ljYWwKLWxpbmUgbnVtYmVyLCBzbyBhbnkgb3RoZXIgc3RhdGVtZW50cyBvbiB0aGUgY3VycmVudCBsaW5lIChhZnRlciBhCi1zdGF0ZW1lbnQgc2VwYXJhdG9yIGNoYXJhY3RlciBAY29kZXs7fSkgYXJlIHJlcG9ydGVkIGFzIG9uIGxvZ2ljYWwKLWxpbmUgbnVtYmVyIEB2YXJ7bGluZS1udW1iZXJ9IEBtaW51c3t9IDEuCi1AaWZzZXQgQk9VVAotCi1UaGlzIGRpcmVjdGl2ZSBpcyBhY2NlcHRlZCwgYnV0IGlnbm9yZWQsIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMKLWNvbmZpZ3VyZWQgZm9yIEBjb2Rle2Iub3V0fTsgaXRzIGVmZmVjdCBpcyBvbmx5IGFzc29jaWF0ZWQgd2l0aCBDT0ZGCi1vdXRwdXQgZm9ybWF0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBNUkkKLUBzZWN0aW9uIEBjb2Rley5tcmkgQHZhcnt2YWx9fQotCi1AY2luZGV4IEBjb2Rle21yaX0gZGlyZWN0aXZlCi1AY2luZGV4IE1SSSBtb2RlLCB0ZW1wb3JhcmlseQotSWYgQHZhcnt2YWx9IGlzIG5vbi16ZXJvLCB0aGlzIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGVudGVyIE1SSSBtb2RlLiAgSWYKLUB2YXJ7dmFsfSBpcyB6ZXJvLCB0aGlzIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGV4aXQgTVJJIG1vZGUuICBUaGlzIGNoYW5nZQotYWZmZWN0cyBjb2RlIGFzc2VtYmxlZCB1bnRpbCB0aGUgbmV4dCBAY29kZXsubXJpfSBkaXJlY3RpdmUsIG9yIHVudGlsIHRoZSBlbmQKLW9mIHRoZSBmaWxlLiAgQHhyZWZ7TSwgTVJJIG1vZGUsIE1SSSBtb2RlfS4KLQotQG5vZGUgTGlzdAotQHNlY3Rpb24gQGNvZGV7Lmxpc3R9Ci0KLUBjaW5kZXggQGNvZGV7bGlzdH0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbCwgdHVybmluZyBvbgotQ29udHJvbCAoaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQGNvZGV7Lm5vbGlzdH0gZGlyZWN0aXZlKSB3aGV0aGVyIG9yCi1ub3QgYXNzZW1ibHkgbGlzdGluZ3MgYXJlIGdlbmVyYXRlZC4gIFRoZXNlIHR3byBkaXJlY3RpdmVzIG1haW50YWluIGFuCi1pbnRlcm5hbCBjb3VudGVyICh3aGljaCBpcyB6ZXJvIGluaXRpYWxseSkuICAgQGNvZGV7Lmxpc3R9IGluY3JlbWVudHMgdGhlCi1jb3VudGVyLCBhbmQgQGNvZGV7Lm5vbGlzdH0gZGVjcmVtZW50cyBpdC4gIEFzc2VtYmx5IGxpc3RpbmdzIGFyZQotZ2VuZXJhdGVkIHdoZW5ldmVyIHRoZSBjb3VudGVyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi1CeSBkZWZhdWx0LCBsaXN0aW5ncyBhcmUgZGlzYWJsZWQuICBXaGVuIHlvdSBlbmFibGUgdGhlbSAod2l0aCB0aGUKLUBzYW1wey1hfSBjb21tYW5kIGxpbmUgb3B0aW9uOyBAcHhyZWZ7SW52b2tpbmcsLENvbW1hbmQtTGluZSBPcHRpb25zfSksCi10aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgbGlzdGluZyBjb3VudGVyIGlzIG9uZS4KLQotQG5vZGUgTG9uZwotQHNlY3Rpb24gQGNvZGV7LmxvbmcgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7bG9uZ30gZGlyZWN0aXZlCi1AY29kZXsubG9uZ30gaXMgdGhlIHNhbWUgYXMgQHNhbXB7LmludH0sIEBweHJlZntJbnQsLEBjb2Rley5pbnR9fS4KLQotQGlnbm9yZQotQGMgbm8gb25lIHNlZW1zIHRvIGtub3cgd2hhdCB0aGlzIGlzIGZvciBvciB3aGV0aGVyIHRoaXMgZGVzY3JpcHRpb24gaXMKLUBjIHdoYXQgaXQgcmVhbGx5IG91Z2h0IHRvIGRvCi1Abm9kZSBMc3ltCi1Ac2VjdGlvbiBAY29kZXsubHN5bSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7bHN5bX0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCwgbm90IHJlZmVyZW5jZWQgaW4gYXNzZW1ibHkKLUBjb2Rley5sc3ltfSBjcmVhdGVzIGEgbmV3IHN5bWJvbCBuYW1lZCBAdmFye3N5bWJvbH0sIGJ1dCBkb2VzIG5vdCBwdXQgaXQgaW4KLXRoZSBoYXNoIHRhYmxlLCBlbnN1cmluZyBpdCBjYW5ub3QgYmUgcmVmZXJlbmNlZCBieSBuYW1lIGR1cmluZyB0aGUKLXJlc3Qgb2YgdGhlIGFzc2VtYmx5LiAgVGhpcyBzZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzeW1ib2wgdG8gYmUKLXRoZSBzYW1lIGFzIHRoZSBleHByZXNzaW9uIHZhbHVlOgotQHNtYWxsZXhhbXBsZQotQHZhcntvdGhlcn0gPSBAdmFye2Rlc2NyaXB0b3J9ID0gMAotQHZhcnt0eXBlfSA9IEByeyhzZWN0aW9uIG9mIEB2YXJ7ZXhwcmVzc2lvbn0pfQotQHZhcnt2YWx1ZX0gPSBAdmFye2V4cHJlc3Npb259Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGUgbmV3IHN5bWJvbCBpcyBub3QgZmxhZ2dlZCBhcyBleHRlcm5hbC4KLUBlbmQgaWdub3JlCi0KLUBub2RlIE1hY3JvCi1Ac2VjdGlvbiBAY29kZXsubWFjcm99Ci0KLUBjaW5kZXggbWFjcm9zCi1UaGUgY29tbWFuZHMgQGNvZGV7Lm1hY3JvfSBhbmQgQGNvZGV7LmVuZG19IGFsbG93IHlvdSB0byBkZWZpbmUgbWFjcm9zIHRoYXQKLWdlbmVyYXRlIGFzc2VtYmx5IG91dHB1dC4gIEZvciBleGFtcGxlLCB0aGlzIGRlZmluaXRpb24gc3BlY2lmaWVzIGEgbWFjcm8KLUBjb2Rle3N1bX0gdGhhdCBwdXRzIGEgc2VxdWVuY2Ugb2YgbnVtYmVycyBpbnRvIG1lbW9yeToKLQotQGV4YW1wbGUKLSAgICAgICAgLm1hY3JvICBzdW0gZnJvbT0wLCB0bz01Ci0gICAgICAgIC5sb25nICAgXGZyb20KLSAgICAgICAgLmlmICAgICBcdG8tXGZyb20KLSAgICAgICAgc3VtICAgICAiKFxmcm9tKzEpIixcdG8KLSAgICAgICAgLmVuZGlmCi0gICAgICAgIC5lbmRtCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1XaXRoIHRoYXQgZGVmaW5pdGlvbiwgQHNhbXB7U1VNIDAsNX0gaXMgZXF1aXZhbGVudCB0byB0aGlzIGFzc2VtYmx5IGlucHV0OgotCi1AZXhhbXBsZQotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmxvbmcgICAxCi0gICAgICAgIC5sb25nICAgMgotICAgICAgICAubG9uZyAgIDMKLSAgICAgICAgLmxvbmcgICA0Ci0gICAgICAgIC5sb25nICAgNQotQGVuZCBleGFtcGxlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5tYWNybyBAdmFye21hY25hbWV9Ci1AaXRlbXggLm1hY3JvIEB2YXJ7bWFjbmFtZX0gQHZhcnttYWNhcmdzfSBAZG90c3t9Ci1AY2luZGV4IEBjb2Rle21hY3JvfSBkaXJlY3RpdmUKLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEB2YXJ7bWFjbmFtZX0uICBJZiB5b3VyIG1hY3JvCi1kZWZpbml0aW9uIHJlcXVpcmVzIGFyZ3VtZW50cywgc3BlY2lmeSB0aGVpciBuYW1lcyBhZnRlciB0aGUgbWFjcm8gbmFtZSwKLXNlcGFyYXRlZCBieSBjb21tYXMgb3Igc3BhY2VzLiAgWW91IGNhbiBzdXBwbHkgYSBkZWZhdWx0IHZhbHVlIGZvciBhbnkKLW1hY3JvIGFyZ3VtZW50IGJ5IGZvbGxvd2luZyB0aGUgbmFtZSB3aXRoIEBzYW1wez1AdmFye2RlZmx0fX0uICBGb3IKLWV4YW1wbGUsIHRoZXNlIGFyZSBhbGwgdmFsaWQgQGNvZGV7Lm1hY3JvfSBzdGF0ZW1lbnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5tYWNybyBjb21tCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtjb21tfSwgd2hpY2ggdGFrZXMgbm8KLWFyZ3VtZW50cy4KLQotQGl0ZW0gLm1hY3JvIHBsdXMxIHAsIHAxCi1AaXRlbXggLm1hY3JvIHBsdXMxIHAgcDEKLUVpdGhlciBzdGF0ZW1lbnQgYmVnaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle3BsdXMxfSwKLXdoaWNoIHRha2VzIHR3byBhcmd1bWVudHM7IHdpdGhpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgd3JpdGUKLUBzYW1we1xwfSBvciBAc2FtcHtccDF9IHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMuCi0KLUBpdGVtIC5tYWNybyByZXNlcnZlX3N0ciBwMT0wIHAyCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtyZXNlcnZlX3N0cn0sIHdpdGggdHdvCi1hcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYnV0IG5vdCB0aGUgc2Vjb25kLgotQWZ0ZXIgdGhlIGRlZmluaXRpb24gaXMgY29tcGxldGUsIHlvdSBjYW4gY2FsbCB0aGUgbWFjcm8gZWl0aGVyIGFzCi1Ac2FtcHtyZXNlcnZlX3N0ciBAdmFye2F9LEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xwMX0gZXZhbHVhdGluZyB0bwotQHZhcnthfSBhbmQgQHNhbXB7XHAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLCBvciBhcyBAc2FtcHtyZXNlcnZlX3N0cgotLEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xwMX0gZXZhbHVhdGluZyBhcyB0aGUgZGVmYXVsdCwgaW4gdGhpcyBjYXNlCi1Ac2FtcHswfSwgYW5kIEBzYW1we1xwMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KS4KLUBlbmQgdGFibGUKLQotV2hlbiB5b3UgY2FsbCBhIG1hY3JvLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHZhbHVlcyBlaXRoZXIgYnkKLXBvc2l0aW9uLCBvciBieSBrZXl3b3JkLiAgRm9yIGV4YW1wbGUsIEBzYW1we3N1bSA5LDE3fSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHtzdW0gdG89MTcsIGZyb209OX0uCi0KLUBpdGVtIC5lbmRtCi1AY2luZGV4IEBjb2Rle2VuZG19IGRpcmVjdGl2ZQotTWFyayB0aGUgZW5kIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotQGl0ZW0gLmV4aXRtCi1AY2luZGV4IEBjb2Rle2V4aXRtfSBkaXJlY3RpdmUKLUV4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLgotCi1AY2luZGV4IG51bWJlciBvZiBtYWNyb3MgZXhlY3V0ZWQKLUBjaW5kZXggbWFjcm9zLCBjb3VudCBleGVjdXRlZAotQGl0ZW0gXEBACi1AY29kZXtAdmFsdWV7QVN9fSBtYWludGFpbnMgYSBjb3VudGVyIG9mIGhvdyBtYW55IG1hY3JvcyBpdCBoYXMKLWV4ZWN1dGVkIGluIHRoaXMgcHNldWRvLXZhcmlhYmxlOyB5b3UgY2FuIGNvcHkgdGhhdCBudW1iZXIgdG8geW91cgotb3V0cHV0IHdpdGggQHNhbXB7XEBAfSwgYnV0IEBlbXBoe29ubHkgd2l0aGluIGEgbWFjcm8gZGVmaW5pdGlvbn0uCi0KLUBpZ25vcmUKLUBpdGVtIExPQ0FMIEB2YXJ7bmFtZX0gWyAsIEBkb3Rze30gXQotQGVtcGh7V2FybmluZzogQGNvZGV7TE9DQUx9IGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3QgYGBhbHRlcm5hdGUKLW1hY3JvIHN5bnRheCcnIHdpdGggQHNhbXB7LWF9IG9yIEBzYW1wey0tYWx0ZXJuYXRlfS59ICBAeHJlZntBbHRlcm5hdGUsLAotQWx0ZXJuYXRlIG1hY3JvIHN5bnRheH0uCi0KLUdlbmVyYXRlIGEgc3RyaW5nIHJlcGxhY2VtZW50IGZvciBlYWNoIG9mIHRoZSBAdmFye25hbWV9IGFyZ3VtZW50cywgYW5kCi1yZXBsYWNlIGFueSBpbnN0YW5jZXMgb2YgQHZhcntuYW1lfSBpbiBlYWNoIG1hY3JvIGV4cGFuc2lvbi4gIFRoZQotcmVwbGFjZW1lbnQgc3RyaW5nIGlzIHVuaXF1ZSBpbiB0aGUgYXNzZW1ibHksIGFuZCBkaWZmZXJlbnQgZm9yIGVhY2gKLXNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbi4gIEBjb2Rle0xPQ0FMfSBhbGxvd3MgeW91IHRvIHdyaXRlIG1hY3JvcyB0aGF0Ci1kZWZpbmUgc3ltYm9scywgd2l0aG91dCBmZWFyIG9mIGNvbmZsaWN0IGJldHdlZW4gc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9ucy4KLUBlbmQgaWdub3JlCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBOb2xpc3QKLUBzZWN0aW9uIEBjb2Rley5ub2xpc3R9Ci0KLUBjaW5kZXggQGNvZGV7bm9saXN0fSBkaXJlY3RpdmUKLUBjaW5kZXggbGlzdGluZyBjb250cm9sLCB0dXJuaW5nIG9mZgotQ29udHJvbCAoaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQGNvZGV7Lmxpc3R9IGRpcmVjdGl2ZSkgd2hldGhlciBvcgotbm90IGFzc2VtYmx5IGxpc3RpbmdzIGFyZSBnZW5lcmF0ZWQuICBUaGVzZSB0d28gZGlyZWN0aXZlcyBtYWludGFpbiBhbgotaW50ZXJuYWwgY291bnRlciAod2hpY2ggaXMgemVybyBpbml0aWFsbHkpLiAgIEBjb2Rley5saXN0fSBpbmNyZW1lbnRzIHRoZQotY291bnRlciwgYW5kIEBjb2Rley5ub2xpc3R9IGRlY3JlbWVudHMgaXQuICBBc3NlbWJseSBsaXN0aW5ncyBhcmUKLWdlbmVyYXRlZCB3aGVuZXZlciB0aGUgY291bnRlciBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotQG5vZGUgT2N0YQotQHNlY3Rpb24gQGNvZGV7Lm9jdGEgQHZhcntiaWdudW1zfX0KLQotQGMgRklYTUU6IGRvdWJsZSBzaXplIGVtaXR0ZWQgZm9yICJvY3RhIiBvbiBpOTYwLCBvdGhlcnM/ICBPciB3YXJuPwotQGNpbmRleCBAY29kZXtvY3RhfSBkaXJlY3RpdmUKLUBjaW5kZXggaW50ZWdlciwgMTYtYnl0ZQotQGNpbmRleCBzaXh0ZWVuIGJ5dGUgaW50ZWdlcgotVGhpcyBkaXJlY3RpdmUgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgYmlnbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEZvciBlYWNoCi1iaWdudW0sIGl0IGVtaXRzIGEgMTYtYnl0ZSBpbnRlZ2VyLgotCi1UaGUgdGVybSBgYG9jdGEnJyBjb21lcyBmcm9tIGNvbnRleHRzIGluIHdoaWNoIGEgYGB3b3JkJycgaXMgdHdvIGJ5dGVzOwotaGVuY2UgQGVtcGh7b2N0YX0td29yZCBmb3IgMTYgYnl0ZXMuCi0KLUBub2RlIE9yZwotQHNlY3Rpb24gQGNvZGV7Lm9yZyBAdmFye25ldy1sY30gLCBAdmFye2ZpbGx9fQotCi1AY2luZGV4IEBjb2Rle29yZ30gZGlyZWN0aXZlCi1AY2luZGV4IGxvY2F0aW9uIGNvdW50ZXIsIGFkdmFuY2luZwotQGNpbmRleCBhZHZhbmNpbmcgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBjdXJyZW50IGFkZHJlc3MsIGFkdmFuY2luZwotQWR2YW5jZSB0aGUgbG9jYXRpb24gY291bnRlciBvZiB0aGUgY3VycmVudCBzZWN0aW9uIHRvCi1AdmFye25ldy1sY30uICBAdmFye25ldy1sY30gaXMgZWl0aGVyIGFuIGFic29sdXRlIGV4cHJlc3Npb24gb3IgYW4KLWV4cHJlc3Npb24gd2l0aCB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24uICBUaGF0IGlzLAoteW91IGNhbid0IHVzZSBAY29kZXsub3JnfSB0byBjcm9zcyBzZWN0aW9uczogaWYgQHZhcntuZXctbGN9IGhhcyB0aGUKLXdyb25nIHNlY3Rpb24sIHRoZSBAY29kZXsub3JnfSBkaXJlY3RpdmUgaXMgaWdub3JlZC4gIFRvIGJlIGNvbXBhdGlibGUKLXdpdGggZm9ybWVyIGFzc2VtYmxlcnMsIGlmIHRoZSBzZWN0aW9uIG9mIEB2YXJ7bmV3LWxjfSBpcyBhYnNvbHV0ZSwKLUBjb2Rle0B2YWx1ZXtBU319IGlzc3VlcyBhIHdhcm5pbmcsIHRoZW4gcHJldGVuZHMgdGhlIHNlY3Rpb24gb2YgQHZhcntuZXctbGN9Ci1pcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzdWJzZWN0aW9uLgotCi1AY29kZXsub3JnfSBtYXkgb25seSBpbmNyZWFzZSB0aGUgbG9jYXRpb24gY291bnRlciwgb3IgbGVhdmUgaXQKLXVuY2hhbmdlZDsgeW91IGNhbm5vdCB1c2UgQGNvZGV7Lm9yZ30gdG8gbW92ZSB0aGUgbG9jYXRpb24gY291bnRlcgotYmFja3dhcmRzLgotCi1AYyBkb3VibGUgbmVnYXRpdmUgdXNlZCBiZWxvdyAibm90IHVuZGVmaW5lZCIgYmVjYXVzZSB0aGlzIGlzIGEgc3BlY2lmaWMKLUBjIHJlZmVyZW5jZSB0byAidW5kZWZpbmVkIiAoYXMgU0VHX1VOS05PV04gaXMgY2FsbGVkIGluIHRoaXMgbWFudWFsKQotQGMgc2VjdGlvbi4gZG9jQGN5Z251cy5jb20gMThmZWI5MQotQmVjYXVzZSBAY29kZXtAdmFsdWV7QVN9fSB0cmllcyB0byBhc3NlbWJsZSBwcm9ncmFtcyBpbiBvbmUgcGFzcywgQHZhcntuZXctbGN9Ci1tYXkgbm90IGJlIHVuZGVmaW5lZC4gIElmIHlvdSByZWFsbHkgZGV0ZXN0IHRoaXMgcmVzdHJpY3Rpb24gd2UgZWFnZXJseSBhd2FpdAotYSBjaGFuY2UgdG8gc2hhcmUgeW91ciBpbXByb3ZlZCBhc3NlbWJsZXIuCi0KLUJld2FyZSB0aGF0IHRoZSBvcmlnaW4gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBub3QKLXRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic2VjdGlvbi4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyCi1wZW9wbGUncyBhc3NlbWJsZXJzLgotCi1XaGVuIHRoZSBsb2NhdGlvbiBjb3VudGVyIChvZiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSBpcyBhZHZhbmNlZCwgdGhlCi1pbnRlcnZlbmluZyBieXRlcyBhcmUgZmlsbGVkIHdpdGggQHZhcntmaWxsfSB3aGljaCBzaG91bGQgYmUgYW4KLWFic29sdXRlIGV4cHJlc3Npb24uICBJZiB0aGUgY29tbWEgYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsCi1AdmFye2ZpbGx9IGRlZmF1bHRzIHRvIHplcm8uCi0KLUBub2RlIFAyYWxpZ24KLUBzZWN0aW9uIEBjb2Rley5wMmFsaWduW3dsXSBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9fQotCi1AY2luZGV4IHBhZGRpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIgZ2l2ZW4gYSBwb3dlciBvZiB0d28KLUBjaW5kZXggQGNvZGV7cDJhbGlnbn0gZGlyZWN0aXZlCi1QYWQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgKGluIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIHRvIGEgcGFydGljdWxhcgotc3RvcmFnZSBib3VuZGFyeS4gIFRoZSBmaXJzdCBleHByZXNzaW9uICh3aGljaCBtdXN0IGJlIGFic29sdXRlKSBpcyB0aGUKLW51bWJlciBvZiBsb3ctb3JkZXIgemVybyBiaXRzIHRoZSBsb2NhdGlvbiBjb3VudGVyIG11c3QgaGF2ZSBhZnRlcgotYWR2YW5jZW1lbnQuICBGb3IgZXhhbXBsZSBAc2FtcHsucDJhbGlnbiAzfSBhZHZhbmNlcyB0aGUgbG9jYXRpb24KLWNvdW50ZXIgdW50aWwgaXQgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgYWxyZWFkeSBhCi1tdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1UaGUgc2Vjb25kIGV4cHJlc3Npb24gKGFsc28gYWJzb2x1dGUpIGdpdmVzIHRoZSBmaWxsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKLXBhZGRpbmcgYnl0ZXMuICBJdCAoYW5kIHRoZSBjb21tYSkgbWF5IGJlIG9taXR0ZWQuICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUKLXBhZGRpbmcgYnl0ZXMgYXJlIG5vcm1hbGx5IHplcm8uICBIb3dldmVyLCBvbiBzb21lIHN5c3RlbXMsIGlmIHRoZSBzZWN0aW9uIGlzCi1tYXJrZWQgYXMgY29udGFpbmluZyBjb2RlIGFuZCB0aGUgZmlsbCB2YWx1ZSBpcyBvbWl0dGVkLCB0aGUgc3BhY2UgaXMgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucy4KLQotVGhlIHRoaXJkIGV4cHJlc3Npb24gaXMgYWxzbyBhYnNvbHV0ZSwgYW5kIGlzIGFsc28gb3B0aW9uYWwuICBJZiBpdCBpcyBwcmVzZW50LAotaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYnkgdGhpcyBhbGlnbm1lbnQKLWRpcmVjdGl2ZS4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gdGhlCi1zcGVjaWZpZWQgbWF4aW11bSwgdGhlbiB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4gIFlvdSBjYW4gb21pdCB0aGUKLWZpbGwgdmFsdWUgKHRoZSBzZWNvbmQgYXJndW1lbnQpIGVudGlyZWx5IGJ5IHNpbXBseSB1c2luZyB0d28gY29tbWFzIGFmdGVyIHRoZQotcmVxdWlyZWQgYWxpZ25tZW50OyB0aGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGFsaWdubWVudCB0byBiZSBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCi0KLUBjaW5kZXggQGNvZGV7cDJhbGlnbnd9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtwMmFsaWdubH0gZGlyZWN0aXZlCi1UaGUgQGNvZGV7LnAyYWxpZ253fSBhbmQgQGNvZGV7LnAyYWxpZ25sfSBkaXJlY3RpdmVzIGFyZSB2YXJpYW50cyBvZiB0aGUKLUBjb2Rley5wMmFsaWdufSBkaXJlY3RpdmUuICBUaGUgQGNvZGV7LnAyYWxpZ253fSBkaXJlY3RpdmUgdHJlYXRzIHRoZSBmaWxsCi1wYXR0ZXJuIGFzIGEgdHdvIGJ5dGUgd29yZCB2YWx1ZS4gIFRoZSBAY29kZXsucDJhbGlnbmx9IGRpcmVjdGl2ZXMgdHJlYXRzIHRoZQotZmlsbCBwYXR0ZXJuIGFzIGEgZm91ciBieXRlIGxvbmd3b3JkIHZhbHVlLiAgRm9yIGV4YW1wbGUsIEBjb2Rley5wMmFsaWdudwotMiwweDM2OGR9IHdpbGwgYWxpZ24gdG8gYSBtdWx0aXBsZSBvZiA0LiAgSWYgaXQgc2tpcHMgdHdvIGJ5dGVzLCB0aGV5IHdpbGwgYmUKLWZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSAweDM2OGQgKHRoZSBleGFjdCBwbGFjZW1lbnQgb2YgdGhlIGJ5dGVzIGRlcGVuZHMgdXBvbgotdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHByb2Nlc3NvcikuICBJZiBpdCBza2lwcyAxIG9yIDMgYnl0ZXMsIHRoZSBmaWxsIHZhbHVlIGlzCi11bmRlZmluZWQuCi0KLUBub2RlIFByaW50Ci1Ac2VjdGlvbiBAY29kZXsucHJpbnQgQHZhcntzdHJpbmd9fQotCi1AY2luZGV4IEBjb2Rle3ByaW50fSBkaXJlY3RpdmUKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgQHZhcntzdHJpbmd9IG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgZHVyaW5nCi1hc3NlbWJseS4gIFlvdSBtdXN0IHB1dCBAdmFye3N0cmluZ30gaW4gZG91YmxlIHF1b3Rlcy4KLQotQG5vZGUgUHNpemUKLUBzZWN0aW9uIEBjb2Rley5wc2l6ZSBAdmFye2xpbmVzfSAsIEB2YXJ7Y29sdW1uc319Ci0KLUBjaW5kZXggQGNvZGV7cHNpemV9IGRpcmVjdGl2ZQotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IHBhcGVyIHNpemUKLUBjaW5kZXggcGFwZXIgc2l6ZSwgZm9yIGxpc3RpbmdzCi1Vc2UgdGhpcyBkaXJlY3RpdmUgdG8gZGVjbGFyZSB0aGUgbnVtYmVyIG9mIGxpbmVzLS0tYW5kLCBvcHRpb25hbGx5LCB0aGUKLW51bWJlciBvZiBjb2x1bW5zLS0tdG8gdXNlIGZvciBlYWNoIHBhZ2UsIHdoZW4gZ2VuZXJhdGluZyBsaXN0aW5ncy4KLQotSWYgeW91IGRvIG5vdCB1c2UgQGNvZGV7LnBzaXplfSwgbGlzdGluZ3MgdXNlIGEgZGVmYXVsdCBsaW5lLWNvdW50Ci1vZiA2MC4gIFlvdSBtYXkgb21pdCB0aGUgY29tbWEgYW5kIEB2YXJ7Y29sdW1uc30gc3BlY2lmaWNhdGlvbjsgdGhlCi1kZWZhdWx0IHdpZHRoIGlzIDIwMCBjb2x1bW5zLgotCi1AY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgZm9ybWZlZWRzIHdoZW5ldmVyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCi1saW5lcyBpcyBleGNlZWRlZCAob3Igd2hlbmV2ZXIgeW91IGV4cGxpY2l0bHkgcmVxdWVzdCBvbmUsIHVzaW5nCi1AY29kZXsuZWplY3R9KS4KLQotSWYgeW91IHNwZWNpZnkgQHZhcntsaW5lc30gYXMgQGNvZGV7MH0sIG5vIGZvcm1mZWVkcyBhcmUgZ2VuZXJhdGVkIHNhdmUKLXRob3NlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHdpdGggQGNvZGV7LmVqZWN0fS4KLQotQG5vZGUgUHVyZ2VtCi1Ac2VjdGlvbiBAY29kZXsucHVyZ2VtIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7cHVyZ2VtfSBkaXJlY3RpdmUKLVVuZGVmaW5lIHRoZSBtYWNybyBAdmFye25hbWV9LCBzbyB0aGF0IGxhdGVyIHVzZXMgb2YgdGhlIHN0cmluZyB3aWxsIG5vdCBiZQotZXhwYW5kZWQuICBAeHJlZntNYWNyb30uCi0KLUBub2RlIFF1YWQKLUBzZWN0aW9uIEBjb2Rley5xdWFkIEB2YXJ7YmlnbnVtc319Ci0KLUBjaW5kZXggQGNvZGV7cXVhZH0gZGlyZWN0aXZlCi1AY29kZXsucXVhZH0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgYmlnbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEZvcgotZWFjaCBiaWdudW0sIGl0IGVtaXRzCi1AaWZjbGVhciBiaWdudW0tMTYKLWFuIDgtYnl0ZSBpbnRlZ2VyLiAgSWYgdGhlIGJpZ251bSB3b24ndCBmaXQgaW4gOCBieXRlcywgaXQgcHJpbnRzIGEKLXdhcm5pbmcgbWVzc2FnZTsgYW5kIGp1c3QgdGFrZXMgdGhlIGxvd2VzdCBvcmRlciA4IGJ5dGVzIG9mIHRoZSBiaWdudW0uCi1AY2luZGV4IGVpZ2h0LWJ5dGUgaW50ZWdlcgotQGNpbmRleCBpbnRlZ2VyLCA4LWJ5dGUKLQotVGhlIHRlcm0gYGBxdWFkJycgY29tZXMgZnJvbSBjb250ZXh0cyBpbiB3aGljaCBhIGBgd29yZCcnIGlzIHR3byBieXRlczsKLWhlbmNlIEBlbXBoe3F1YWR9LXdvcmQgZm9yIDggYnl0ZXMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBiaWdudW0tMTYKLWEgMTYtYnl0ZSBpbnRlZ2VyLiAgSWYgdGhlIGJpZ251bSB3b24ndCBmaXQgaW4gMTYgYnl0ZXMsIGl0IHByaW50cyBhCi13YXJuaW5nIG1lc3NhZ2U7IGFuZCBqdXN0IHRha2VzIHRoZSBsb3dlc3Qgb3JkZXIgMTYgYnl0ZXMgb2YgdGhlIGJpZ251bS4KLUBjaW5kZXggc2l4dGVlbi1ieXRlIGludGVnZXIKLUBjaW5kZXggaW50ZWdlciwgMTYtYnl0ZQotQGVuZCBpZnNldAotCi1Abm9kZSBSZXB0Ci1Ac2VjdGlvbiBAY29kZXsucmVwdCBAdmFye2NvdW50fX0KLQotQGNpbmRleCBAY29kZXtyZXB0fSBkaXJlY3RpdmUKLVJlcGVhdCB0aGUgc2VxdWVuY2Ugb2YgbGluZXMgYmV0d2VlbiB0aGUgQGNvZGV7LnJlcHR9IGRpcmVjdGl2ZSBhbmQgdGhlIG5leHQKLUBjb2Rley5lbmRyfSBkaXJlY3RpdmUgQHZhcntjb3VudH0gdGltZXMuCi0KLUZvciBleGFtcGxlLCBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5yZXB0ICAgMwotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmVuZHIKLUBlbmQgZXhhbXBsZQotCi1pcyBlcXVpdmFsZW50IHRvIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgLmxvbmcgICAwCi0gICAgICAgIC5sb25nICAgMAotICAgICAgICAubG9uZyAgIDAKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBTYnR0bAotQHNlY3Rpb24gQGNvZGV7LnNidHRsICJAdmFye3N1YmhlYWRpbmd9In0KLQotQGNpbmRleCBAY29kZXtzYnR0bH0gZGlyZWN0aXZlCi1AY2luZGV4IHN1YnRpdGxlcyBmb3IgbGlzdGluZ3MKLUBjaW5kZXggbGlzdGluZyBjb250cm9sOiBzdWJ0aXRsZQotVXNlIEB2YXJ7c3ViaGVhZGluZ30gYXMgdGhlIHRpdGxlICh0aGlyZCBsaW5lLCBpbW1lZGlhdGVseSBhZnRlciB0aGUKLXRpdGxlIGxpbmUpIHdoZW4gZ2VuZXJhdGluZyBhc3NlbWJseSBsaXN0aW5ncy4KLQotVGhpcyBkaXJlY3RpdmUgYWZmZWN0cyBzdWJzZXF1ZW50IHBhZ2VzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBhZ2UgaWYKLWl0IGFwcGVhcnMgd2l0aGluIHRlbiBsaW5lcyBvZiB0aGUgdG9wIG9mIGEgcGFnZS4KLQotQGlmc2V0IENPRkYKLUBub2RlIFNjbAotQHNlY3Rpb24gQGNvZGV7LnNjbCBAdmFye2NsYXNzfX0KLQotQGNpbmRleCBAY29kZXtzY2x9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgc3RvcmFnZSBjbGFzcyAoQ09GRikKLUBjaW5kZXggQ09GRiBzeW1ib2wgc3RvcmFnZSBjbGFzcwotU2V0IHRoZSBzdG9yYWdlLWNsYXNzIHZhbHVlIGZvciBhIHN5bWJvbC4gIFRoaXMgZGlyZWN0aXZlIG1heSBvbmx5IGJlCi11c2VkIGluc2lkZSBhIEBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpci4gIFN0b3JhZ2UgY2xhc3MgbWF5IGZsYWcKLXdoZXRoZXIgYSBzeW1ib2wgaXMgc3RhdGljIG9yIGV4dGVybmFsLCBvciBpdCBtYXkgcmVjb3JkIGZ1cnRoZXIKLXN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLUBpZnNldCBCT1VUCi0KLVRoZSBAc2FtcHsuc2NsfSBkaXJlY3RpdmUgaXMgcHJpbWFyaWx5IGFzc29jaWF0ZWQgd2l0aCBDT0ZGIG91dHB1dDsgd2hlbgotY29uZmlndXJlZCB0byBnZW5lcmF0ZSBAY29kZXtiLm91dH0gb3V0cHV0IGZvcm1hdCwgQGNvZGV7QHZhbHVle0FTfX0KLWFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFNlY3Rpb24KLUBzZWN0aW9uIEBjb2Rley5zZWN0aW9uIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7c2VjdGlvbn0gZGlyZWN0aXZlCi1AY2luZGV4IG5hbWVkIHNlY3Rpb24KLVVzZSB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSB0byBhc3NlbWJsZSB0aGUgZm9sbG93aW5nIGNvZGUgaW50byBhIHNlY3Rpb24KLW5hbWVkIEB2YXJ7bmFtZX0uCi0KLVRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB0YXJnZXRzIHRoYXQgYWN0dWFsbHkgc3VwcG9ydCBhcmJpdHJhcmlseQotbmFtZWQgc2VjdGlvbnM7IG9uIEBjb2Rle2Eub3V0fSB0YXJnZXRzLCBmb3IgZXhhbXBsZSwgaXQgaXMgbm90IGFjY2VwdGVkLCBldmVuCi13aXRoIGEgc3RhbmRhcmQgQGNvZGV7YS5vdXR9IHNlY3Rpb24gbmFtZS4KLQotQGlmc2V0IENPRkYKLUZvciBDT0ZGIHRhcmdldHMsIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIGlzIHVzZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcKLXdheXM6Ci1Ac21hbGxleGFtcGxlCi0uc2VjdGlvbiBAdmFye25hbWV9WywgIkB2YXJ7ZmxhZ3N9Il0KLS5zZWN0aW9uIEB2YXJ7bmFtZX1bLCBAdmFye3N1YnNlZ21lbnR9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGlzIHF1b3RlZCwgaXQgaXMgdGFrZW4gYXMgZmxhZ3MgdG8gdXNlIGZvciB0aGUKLXNlY3Rpb24uICBFYWNoIGZsYWcgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLiAgVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgcmVjb2duaXplZDoKLUB0YWJsZSBAY29kZQotQGl0ZW0gYgotYnNzIHNlY3Rpb24gKHVuaW5pdGlhbGl6ZWQgZGF0YSkKLUBpdGVtIG4KLXNlY3Rpb24gaXMgbm90IGxvYWRlZAotQGl0ZW0gdwotd3JpdGFibGUgc2VjdGlvbgotQGl0ZW0gZAotZGF0YSBzZWN0aW9uCi1AaXRlbSByCi1yZWFkLW9ubHkgc2VjdGlvbgotQGl0ZW0geAotZXhlY3V0YWJsZSBzZWN0aW9uCi1AZW5kIHRhYmxlCi0KLUlmIG5vIGZsYWdzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGZsYWdzIGRlcGVuZCB1cG9uIHRoZSBzZWN0aW9uIG5hbWUuICBJZgotdGhlIHNlY3Rpb24gbmFtZSBpcyBub3QgcmVjb2duaXplZCwgdGhlIGRlZmF1bHQgd2lsbCBiZSBmb3IgdGhlIHNlY3Rpb24gdG8gYmUKLWxvYWRlZCBhbmQgd3JpdGFibGUuCi0KLUlmIHRoZSBvcHRpb25hbCBhcmd1bWVudCB0byB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBpcyBub3QgcXVvdGVkLCBpdCBpcwotdGFrZW4gYXMgYSBzdWJzZWdtZW50IG51bWJlciAoQHB4cmVme1N1Yi1TZWN0aW9uc30pLgotQGVuZCBpZnNldAotCi1AaWZzZXQgRUxGCi1Gb3IgRUxGIHRhcmdldHMsIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIGlzIHVzZWQgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnNlY3Rpb24gQHZhcntuYW1lfVssICJAdmFye2ZsYWdzfSJbLCBAQEB2YXJ7dHlwZX1dXQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSBvcHRpb25hbCBAdmFye2ZsYWdzfSBhcmd1bWVudCBpcyBhIHF1b3RlZCBzdHJpbmcgd2hpY2ggbWF5IGNvbnRhaW4gYW55Ci1jb21iaW50aW9uIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gYQotc2VjdGlvbiBpcyBhbGxvY2F0YWJsZQotQGl0ZW0gdwotc2VjdGlvbiBpcyB3cml0YWJsZQotQGl0ZW0geAotc2VjdGlvbiBpcyBleGVjdXRhYmxlCi1AZW5kIHRhYmxlCi0KLVRoZSBvcHRpb25hbCBAdmFye3R5cGV9IGFyZ3VtZW50IG1heSBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKLUB0YWJsZSBAY29kZQotQGl0ZW0gQEBwcm9nYml0cwotc2VjdGlvbiBjb250YWlucyBkYXRhCi1AaXRlbSBAQG5vYml0cwotc2VjdGlvbiBkb2VzIG5vdCBjb250YWluIGRhdGEgKGkuZS4sIHNlY3Rpb24gb25seSBvY2N1cGllcyBzcGFjZSkKLUBlbmQgdGFibGUKLQotSWYgbm8gZmxhZ3MgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgZmxhZ3MgZGVwZW5kIHVwb24gdGhlIHNlY3Rpb24gbmFtZS4gIElmCi10aGUgc2VjdGlvbiBuYW1lIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgZGVmYXVsdCB3aWxsIGJlIGZvciB0aGUgc2VjdGlvbiB0byBoYXZlCi1ub25lIG9mIHRoZSBhYm92ZSBmbGFnczogaXQgd2lsbCBub3QgYmUgYWxsb2NhdGVkIGluIG1lbW9yeSwgbm9yIHdyaXRhYmxlLCBub3IKLWV4ZWN1dGFibGUuICBUaGUgc2VjdGlvbiB3aWxsIGNvbnRhaW4gZGF0YS4KLQotRm9yIEVMRiB0YXJnZXRzLCB0aGUgYXNzZW1ibGVyIHN1cHBvcnRzIGFub3RoZXIgdHlwZSBvZiBAY29kZXsuc2VjdGlvbn0KLWRpcmVjdGl2ZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIGFzc2VtYmxlcjoKLUBzbWFsbGV4YW1wbGUKLS5zZWN0aW9uICJAdmFye25hbWV9IlssIEB2YXJ7ZmxhZ3N9Li4uXQotQGVuZCBzbWFsbGV4YW1wbGUKLU5vdGUgdGhhdCB0aGUgc2VjdGlvbiBuYW1lIGlzIHF1b3RlZC4gIFRoZXJlIG1heSBiZSBhIHNlcXVlbmNlIG9mIGNvbW1hCi1zZXBhcmF0ZWQgZmxhZ3M6Ci1AdGFibGUgQGNvZGUKLUBpdGVtICNhbGxvYwotc2VjdGlvbiBpcyBhbGxvY2F0YWJsZQotQGl0ZW0gI3dyaXRlCi1zZWN0aW9uIGlzIHdyaXRhYmxlCi1AaXRlbSAjZXhlY2luc3RyCi1zZWN0aW9uIGlzIGV4ZWN1dGFibGUKLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQG5vZGUgU2V0Ci1Ac2VjdGlvbiBAY29kZXsuc2V0IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLQotQGNpbmRleCBAY29kZXtzZXR9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgdmFsdWUsIHNldHRpbmcKLVNldCB0aGUgdmFsdWUgb2YgQHZhcntzeW1ib2x9IHRvIEB2YXJ7ZXhwcmVzc2lvbn0uICBUaGlzCi1jaGFuZ2VzIEB2YXJ7c3ltYm9sfSdzIHZhbHVlIGFuZCB0eXBlIHRvIGNvbmZvcm0gdG8KLUB2YXJ7ZXhwcmVzc2lvbn0uICBJZiBAdmFye3N5bWJvbH0gd2FzIGZsYWdnZWQgYXMgZXh0ZXJuYWwsIGl0IHJlbWFpbnMKLWZsYWdnZWQgKEBweHJlZntTeW1ib2wgQXR0cmlidXRlc30pLgotCi1Zb3UgbWF5IEBjb2Rley5zZXR9IGEgc3ltYm9sIG1hbnkgdGltZXMgaW4gdGhlIHNhbWUgYXNzZW1ibHkuCi0KLUlmIHlvdSBAY29kZXsuc2V0fSBhIGdsb2JhbCBzeW1ib2wsIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIG9iamVjdAotZmlsZSBpcyB0aGUgbGFzdCB2YWx1ZSBzdG9yZWQgaW50byBpdC4KLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rle3NldH0gb24gdGhlIEhQUEEgaXMKLUBzYW1we0B2YXJ7c3ltYm9sfSAuc2V0IEB2YXJ7ZXhwcmVzc2lvbn19LgotQGVuZCBpZnNldAotCi1Abm9kZSBTaG9ydAotQHNlY3Rpb24gQGNvZGV7LnNob3J0IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3Nob3J0fSBkaXJlY3RpdmUKLUBpZnNldCBHRU5FUklDCi1AY29kZXsuc2hvcnR9IGlzIG5vcm1hbGx5IHRoZSBzYW1lIGFzIEBzYW1wey53b3JkfS4KLUB4cmVme1dvcmQsLEBjb2Rley53b3JkfX0uCi0KLUluIHNvbWUgY29uZmlndXJhdGlvbnMsIGhvd2V2ZXIsIEBjb2Rley5zaG9ydH0gYW5kIEBjb2Rley53b3JkfSBnZW5lcmF0ZQotbnVtYmVycyBvZiBkaWZmZXJlbnQgbGVuZ3RoczsgQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMTYKLUBjb2Rley5zaG9ydH0gaXMgdGhlIHNhbWUgYXMgQHNhbXB7LndvcmR9LiAgQHhyZWZ7V29yZCwsQGNvZGV7LndvcmR9fS4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMzIKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIGFuZCBlbWl0cwotYSAxNiBiaXQgbnVtYmVyIGZvciBlYWNoLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIFNpbmdsZQotQHNlY3Rpb24gQGNvZGV7LnNpbmdsZSBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IEBjb2Rle3NpbmdsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHNpbmdsZSkKLVRoaXMgZGlyZWN0aXZlIGFzc2VtYmxlcyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEl0Ci1oYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEBjb2Rley5mbG9hdH0uCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgQGNvZGV7LnNpbmdsZX0gZW1pdHMgMzItYml0IGZsb2F0aW5nIHBvaW50Ci1udW1iZXJzIGluIEBzY3tpZWVlfSBmb3JtYXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IENPRkYKLUBub2RlIFNpemUKLUBzZWN0aW9uIEBjb2Rley5zaXplfQotCi1AY2luZGV4IEBjb2Rle3NpemV9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgaXMgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVycyB0byBpbmNsdWRlIGF1eGlsaWFyeSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJdCBpcyBvbmx5IHBlcm1pdHRlZCBpbnNpZGUKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsuc2l6ZX0gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gZ2VuZXJhdGluZyBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KLUBjb2Rle0B2YWx1ZXtBU319IGlzIGdlbmVyYXRpbmcgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dAotaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgU2xlYjEyOAotQHNlY3Rpb24gQGNvZGV7LnNsZWIxMjggQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7c2xlYjEyOH0gZGlyZWN0aXZlCi1AdmFye3NsZWIxMjh9IHN0YW5kcyBmb3IgYGBzaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOC4nJyAgVGhpcyBpcyBhIAotY29tcGFjdCwgdmFyaWFibGUgbGVuZ3RoIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgdXNlZCBieSB0aGUgRFdBUkYKLXN5bWJvbGljIGRlYnVnZ2luZyBmb3JtYXQuICBAeHJlZntVbGViMTI4LEBjb2Rley51bGViMTI4fX0uCi0KLUBpZmNsZWFyIG5vLXNwYWNlLWRpcgotQG5vZGUgU2tpcAotQHNlY3Rpb24gQGNvZGV7LnNraXAgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci0KLUBjaW5kZXggQGNvZGV7c2tpcH0gZGlyZWN0aXZlCi1AY2luZGV4IGZpbGxpbmcgbWVtb3J5Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYSBhbmQKLUB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLiAgVGhpcyBpcyB0aGUgc2FtZSBhcwotQHNhbXB7LnNwYWNlfS4KLQotQG5vZGUgU3BhY2UKLUBzZWN0aW9uIEBjb2Rley5zcGFjZSBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLQotQGNpbmRleCBAY29kZXtzcGFjZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZpbGxpbmcgbWVtb3J5Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYQotYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLiAgVGhpcyBpcyB0aGUgc2FtZQotYXMgQHNhbXB7LnNraXB9LgotCi1AaWZzZXQgSFBQQQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rley5zcGFjZX0gaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbWVhbmluZyBmb3IgSFBQQQotdGFyZ2V0czsgdXNlIEBjb2Rley5ibG9ja30gYXMgYSBzdWJzdGl0dXRlLiAgU2VlIEBjaXRle0hQOTAwMCBTZXJpZXMgODAwCi1Bc3NlbWJseSBMYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpIGZvciB0aGUgbWVhbmluZyBvZiB0aGUKLUBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLiAgQHhyZWZ7SFBQQSBEaXJlY3RpdmVzLCxIUFBBIEFzc2VtYmxlciBEaXJlY3RpdmVzfSwKLWZvciBhIHN1bW1hcnkuCi1AZW5kIHF1b3RhdGlvbgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBBMjlLCi1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBTcGFjZQotQHNlY3Rpb24gQGNvZGV7LnNwYWNlfQotQGNpbmRleCBAY29kZXtzcGFjZX0gZGlyZWN0aXZlCi1AZW5kIGlmY2xlYXIKLU9uIHRoZSBBTUQgMjlLLCB0aGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBBTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBJbiBtb3N0IHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIsIHRoZSBkaXJlY3RpdmUKLUBjb2Rley5zcGFjZX0gaGFzIHRoZSBlZmZlY3Qgb2YgQGNvZGV7LmJsb2NrfSAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBxdW90YXRpb24KLUBlbmQgaWZzZXQKLQotQGlmc2V0IGhhdmUtc3RhYnMKLUBub2RlIFN0YWIKLUBzZWN0aW9uIEBjb2Rley5zdGFiZCwgLnN0YWJuLCAuc3RhYnN9Ci0KLUBjaW5kZXggc3ltYm9saWMgZGVidWdnZXJzLCBpbmZvcm1hdGlvbiBmb3IKLUBjaW5kZXggQGNvZGV7c3RhYkB2YXJ7eH19IGRpcmVjdGl2ZXMKLVRoZXJlIGFyZSB0aHJlZSBkaXJlY3RpdmVzIHRoYXQgYmVnaW4gQHNhbXB7LnN0YWJ9LgotQWxsIGVtaXQgc3ltYm9scyAoQHB4cmVme1N5bWJvbHN9KSwgZm9yIHVzZSBieSBzeW1ib2xpYyBkZWJ1Z2dlcnMuCi1UaGUgc3ltYm9scyBhcmUgbm90IGVudGVyZWQgaW4gdGhlIEBjb2Rle0B2YWx1ZXtBU319IGhhc2ggdGFibGU6IHRoZXkKLWNhbm5vdCBiZSByZWZlcmVuY2VkIGVsc2V3aGVyZSBpbiB0aGUgc291cmNlIGZpbGUuCi1VcCB0byBmaXZlIGZpZWxkcyBhcmUgcmVxdWlyZWQ6Ci0KLUB0YWJsZSBAdmFyCi1AaXRlbSBzdHJpbmcKLVRoaXMgaXMgdGhlIHN5bWJvbCdzIG5hbWUuICBJdCBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdAotQHNhbXB7XDAwMH0sIHNvIGlzIG1vcmUgZ2VuZXJhbCB0aGFuIG9yZGluYXJ5IHN5bWJvbCBuYW1lcy4gIFNvbWUKLWRlYnVnZ2VycyB1c2VkIHRvIGNvZGUgYXJiaXRyYXJpbHkgY29tcGxleCBzdHJ1Y3R1cmVzIGludG8gc3ltYm9sIG5hbWVzCi11c2luZyB0aGlzIGZpZWxkLgotCi1AaXRlbSB0eXBlCi1BbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIHN5bWJvbCdzIHR5cGUgaXMgc2V0IHRvIHRoZSBsb3cgOCBiaXRzIG9mCi10aGlzIGV4cHJlc3Npb24uICBBbnkgYml0IHBhdHRlcm4gaXMgcGVybWl0dGVkLCBidXQgQGNvZGV7QHZhbHVle0xEfX0KLWFuZCBkZWJ1Z2dlcnMgY2hva2Ugb24gc2lsbHkgYml0IHBhdHRlcm5zLgotCi1AaXRlbSBvdGhlcgotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBzeW1ib2wncyBgYG90aGVyJycgYXR0cmlidXRlIGlzIHNldCB0byB0aGUKLWxvdyA4IGJpdHMgb2YgdGhpcyBleHByZXNzaW9uLgotCi1AaXRlbSBkZXNjCi1BbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIHN5bWJvbCdzIGRlc2NyaXB0b3IgaXMgc2V0IHRvIHRoZSBsb3cgMTYKLWJpdHMgb2YgdGhpcyBleHByZXNzaW9uLgotCi1AaXRlbSB2YWx1ZQotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aGljaCBiZWNvbWVzIHRoZSBzeW1ib2wncyB2YWx1ZS4KLUBlbmQgdGFibGUKLQotSWYgYSB3YXJuaW5nIGlzIGRldGVjdGVkIHdoaWxlIHJlYWRpbmcgYSBAY29kZXsuc3RhYmR9LCBAY29kZXsuc3RhYm59LAotb3IgQGNvZGV7LnN0YWJzfSBzdGF0ZW1lbnQsIHRoZSBzeW1ib2wgaGFzIHByb2JhYmx5IGFscmVhZHkgYmVlbiBjcmVhdGVkOwoteW91IGdldCBhIGhhbGYtZm9ybWVkIHN5bWJvbCBpbiB5b3VyIG9iamVjdCBmaWxlLiAgVGhpcyBpcwotY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgYXNzZW1ibGVycyEKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle3N0YWJkfSBkaXJlY3RpdmUKLUBpdGVtIC5zdGFiZCBAdmFye3R5cGV9ICwgQHZhcntvdGhlcn0gLCBAdmFye2Rlc2N9Ci0KLVRoZSBgYG5hbWUnJyBvZiB0aGUgc3ltYm9sIGdlbmVyYXRlZCBpcyBub3QgZXZlbiBhbiBlbXB0eSBzdHJpbmcuCi1JdCBpcyBhIG51bGwgcG9pbnRlciwgZm9yIGNvbXBhdGliaWxpdHkuICBPbGRlciBhc3NlbWJsZXJzIHVzZWQgYQotbnVsbCBwb2ludGVyIHNvIHRoZXkgZGlkbid0IHdhc3RlIHNwYWNlIGluIG9iamVjdCBmaWxlcyB3aXRoIGVtcHR5Ci1zdHJpbmdzLgotCi1UaGUgc3ltYm9sJ3MgdmFsdWUgaXMgc2V0IHRvIHRoZSBsb2NhdGlvbiBjb3VudGVyLAotcmVsb2NhdGFibHkuICBXaGVuIHlvdXIgcHJvZ3JhbSBpcyBsaW5rZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIHN5bWJvbAotaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgd2hlbiB0aGUgQGNvZGV7LnN0YWJkfSB3YXMKLWFzc2VtYmxlZC4KLQotQGNpbmRleCBAY29kZXtzdGFibn0gZGlyZWN0aXZlCi1AaXRlbSAuc3RhYm4gQHZhcnt0eXBlfSAsIEB2YXJ7b3RoZXJ9ICwgQHZhcntkZXNjfSAsIEB2YXJ7dmFsdWV9Ci1UaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nIEBjb2RleyIifS4KLQotQGNpbmRleCBAY29kZXtzdGFic30gZGlyZWN0aXZlCi1AaXRlbSAuc3RhYnMgQHZhcntzdHJpbmd9ICwgIEB2YXJ7dHlwZX0gLCBAdmFye290aGVyfSAsIEB2YXJ7ZGVzY30gLCBAdmFye3ZhbHVlfQotQWxsIGZpdmUgZmllbGRzIGFyZSBzcGVjaWZpZWQuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci1AYyBlbmQgICAgIGhhdmUtc3RhYnMKLQotQG5vZGUgU3RyaW5nCi1Ac2VjdGlvbiBAY29kZXsuc3RyaW5nfSAiQHZhcntzdHJ9IgotCi1AY2luZGV4IHN0cmluZywgY29weWluZyB0byBvYmplY3QgZmlsZQotQGNpbmRleCBAY29kZXtzdHJpbmd9IGRpcmVjdGl2ZQotCi1Db3B5IHRoZSBjaGFyYWN0ZXJzIGluIEB2YXJ7c3RyfSB0byB0aGUgb2JqZWN0IGZpbGUuICBZb3UgbWF5IHNwZWNpZnkgbW9yZSB0aGFuCi1vbmUgc3RyaW5nIHRvIGNvcHksIHNlcGFyYXRlZCBieSBjb21tYXMuICBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBmb3IgYQotcGFydGljdWxhciBtYWNoaW5lLCB0aGUgYXNzZW1ibGVyIG1hcmtzIHRoZSBlbmQgb2YgZWFjaCBzdHJpbmcgd2l0aCBhIDAgYnl0ZS4KLVlvdSBjYW4gdXNlIGFueSBvZiB0aGUgZXNjYXBlIHNlcXVlbmNlcyBkZXNjcmliZWQgaW4gQHJlZntTdHJpbmdzLCxTdHJpbmdzfS4KLQotQG5vZGUgU3RydWN0Ci1Ac2VjdGlvbiBAY29kZXsuc3RydWN0IEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7c3RydWN0fSBkaXJlY3RpdmUKLVN3aXRjaCB0byB0aGUgYWJzb2x1dGUgc2VjdGlvbiwgYW5kIHNldCB0aGUgc2VjdGlvbiBvZmZzZXQgdG8gQHZhcntleHByZXNzaW9ufSwKLXdoaWNoIG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFlvdSBtaWdodCB1c2UgdGhpcyBhcyBmb2xsb3dzOgotQHNtYWxsZXhhbXBsZQotICAgICAgICAuc3RydWN0IDAKLWZpZWxkMToKLSAgICAgICAgLnN0cnVjdCBmaWVsZDEgKyA0Ci1maWVsZDI6Ci0gICAgICAgIC5zdHJ1Y3QgZmllbGQyICsgNAotZmllbGQzOgotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgd291bGQgZGVmaW5lIHRoZSBzeW1ib2wgQGNvZGV7ZmllbGQxfSB0byBoYXZlIHRoZSB2YWx1ZSAwLCB0aGUgc3ltYm9sCi1AY29kZXtmaWVsZDJ9IHRvIGhhdmUgdGhlIHZhbHVlIDQsIGFuZCB0aGUgc3ltYm9sIEBjb2Rle2ZpZWxkM30gdG8gaGF2ZSB0aGUKLXZhbHVlIDguICBBc3NlbWJseSB3b3VsZCBiZSBsZWZ0IGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBhbmQgeW91IHdvdWxkIG5lZWQgdG8KLXVzZSBhIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgb2Ygc29tZSBzb3J0IHRvIGNoYW5nZSB0byBzb21lIG90aGVyIHNlY3Rpb24KLWJlZm9yZSBmdXJ0aGVyIGFzc2VtYmx5LgotCi1AaWZzZXQgRUxGCi1Abm9kZSBTeW12ZXIKLUBzZWN0aW9uIEBjb2Rley5zeW12ZXJ9Ci1AY2luZGV4IEBjb2Rle3N5bXZlcn0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCB2ZXJzaW9uaW5nCi1AY2luZGV4IHZlcnNpb25zIG9mIHN5bWJvbHMKLVVzZSB0aGUgQGNvZGV7LnN5bXZlcn0gZGlyZWN0aXZlIHRvIGJpbmQgc3ltYm9scyB0byBzcGVjaWZpYyB2ZXJzaW9uIG5vZGVzCi13aXRoaW4gYSBzb3VyY2UgZmlsZS4gIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgb24gRUxGIHBsYXRmb3JtcywgYW5kIGlzCi10eXBpY2FsbHkgdXNlZCB3aGVuIGFzc2VtYmxpbmcgZmlsZXMgdG8gYmUgbGlua2VkIGludG8gYSBzaGFyZWQgbGlicmFyeS4KLVRoZXJlIGFyZSBjYXNlcyB3aGVyZSBpdCBtYXkgbWFrZSBzZW5zZSB0byB1c2UgdGhpcyBpbiBvYmplY3RzIHRvIGJlIGJvdW5kCi1pbnRvIGFuIGFwcGxpY2F0aW9uIGl0c2VsZiBzbyBhcyB0byBvdmVycmlkZSBhIHZlcnNpb25lZCBzeW1ib2wgZnJvbSBhCi1zaGFyZWQgbGlicmFyeS4KLQotRm9yIEVMRiB0YXJnZXRzLCB0aGUgQGNvZGV7LnN5bXZlcn0gZGlyZWN0aXZlIGlzIHVzZWQgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnN5bXZlciBAdmFye25hbWV9LCBAdmFye25hbWUyQEBub2RlbmFtZX0KLUBlbmQgc21hbGxleGFtcGxlCi1JbiB0aGlzIGNhc2UsIHRoZSBzeW1ib2wgQHZhcntuYW1lfSBtdXN0IGV4aXN0IGFuZCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZmlsZQotYmVpbmcgYXNzZW1ibGVkLiAgVGhlIEBjb2Rley52ZXJzeW19IGRpcmVjdGl2ZSBlZmZlY3RpdmVseSBjcmVhdGVzIGEgc3ltYm9sCi1hbGlhcyB3aXRoIHRoZSBuYW1lIEB2YXJ7bmFtZTJAQG5vZGVuYW1lfSwgYW5kIGluIGZhY3QgdGhlIG1haW4gcmVhc29uIHRoYXQgd2UKLWp1c3QgZG9uJ3QgdHJ5IGFuZCBjcmVhdGUgYSByZWd1bGFyIGFsaWFzIGlzIHRoYXQgdGhlIEB2YXJ7QEB9IGNoYXJhY3RlciBpc24ndAotcGVybWl0dGVkIGluIHN5bWJvbCBuYW1lcy4gIFRoZSBAdmFye25hbWUyfSBwYXJ0IG9mIHRoZSBuYW1lIGlzIHRoZSBhY3R1YWwgbmFtZQotb2YgdGhlIHN5bWJvbCBieSB3aGljaCBpdCB3aWxsIGJlIGV4dGVybmFsbHkgcmVmZXJlbmNlZC4gIFRoZSBuYW1lIEB2YXJ7bmFtZX0KLWl0c2VsZiBpcyBtZXJlbHkgYSBuYW1lIG9mIGNvbnZlbmllbmNlIHRoYXQgaXMgdXNlZCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCi1oYXZlIGRlZmluaXRpb25zIGZvciBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhIGZ1bmN0aW9uIHdpdGhpbiBhIHNpbmdsZSBzb3VyY2UKLWZpbGUsIGFuZCBzbyB0aGF0IHRoZSBjb21waWxlciBjYW4gdW5hbWJpZ3VvdXNseSBrbm93IHdoaWNoIHZlcnNpb24gb2YgYQotZnVuY3Rpb24gaXMgYmVpbmcgbWVudGlvbmVkLiAgVGhlIEB2YXJ7bm9kZW5hbWV9IHBvcnRpb24gb2YgdGhlIGFsaWFzIHNob3VsZCBiZQotdGhlIG5hbWUgb2YgYSBub2RlIHNwZWNpZmllZCBpbiB0aGUgdmVyc2lvbiBzY3JpcHQgc3VwcGxpZWQgdG8gdGhlIGxpbmtlciB3aGVuCi1idWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgSWYgeW91IGFyZSBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGEgdmVyc2lvbmVkCi1zeW1ib2wgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIEB2YXJ7bm9kZW5hbWV9IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZQotbm9kZW5hbWUgb2YgdGhlIHN5bWJvbCB5b3UgYXJlIHRyeWluZyB0byBvdmVycmlkZS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIFRhZwotQHNlY3Rpb24gQGNvZGV7LnRhZyBAdmFye3N0cnVjdG5hbWV9fQotCi1AY2luZGV4IENPRkYgc3RydWN0dXJlIGRlYnVnZ2luZwotQGNpbmRleCBzdHJ1Y3R1cmUgZGVidWdnaW5nLCBDT0ZGCi1AY2luZGV4IEBjb2Rle3RhZ30gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4gIFRhZ3MgYXJlIHVzZWQgdG8gbGluayBzdHJ1Y3R1cmUKLWRlZmluaXRpb25zIGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCBpbnN0YW5jZXMgb2YgdGhvc2Ugc3RydWN0dXJlcy4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey50YWd9IGlzIG9ubHkgdXNlZCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFRleHQKLUBzZWN0aW9uIEBjb2Rley50ZXh0IEB2YXJ7c3Vic2VjdGlvbn19Ci0KLUBjaW5kZXggQGNvZGV7dGV4dH0gZGlyZWN0aXZlCi1UZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byBhc3NlbWJsZSB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgb250byB0aGUgZW5kIG9mCi10aGUgdGV4dCBzdWJzZWN0aW9uIG51bWJlcmVkIEB2YXJ7c3Vic2VjdGlvbn0sIHdoaWNoIGlzIGFuIGFic29sdXRlCi1leHByZXNzaW9uLiAgSWYgQHZhcntzdWJzZWN0aW9ufSBpcyBvbWl0dGVkLCBzdWJzZWN0aW9uIG51bWJlciB6ZXJvCi1pcyB1c2VkLgotCi1Abm9kZSBUaXRsZQotQHNlY3Rpb24gQGNvZGV7LnRpdGxlICJAdmFye2hlYWRpbmd9In0KLQotQGNpbmRleCBAY29kZXt0aXRsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogdGl0bGUgbGluZQotVXNlIEB2YXJ7aGVhZGluZ30gYXMgdGhlIHRpdGxlIChzZWNvbmQgbGluZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi1zb3VyY2UgZmlsZSBuYW1lIGFuZCBwYWdlbnVtYmVyKSB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLVRoaXMgZGlyZWN0aXZlIGFmZmVjdHMgc3Vic2VxdWVudCBwYWdlcywgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBwYWdlIGlmCi1pdCBhcHBlYXJzIHdpdGhpbiB0ZW4gbGluZXMgb2YgdGhlIHRvcCBvZiBhIHBhZ2UuCi0KLUBpZnNldCBDT0ZGCi1Abm9kZSBUeXBlCi1Ac2VjdGlvbiBAY29kZXsudHlwZSBAdmFye2ludH19Ci0KLUBjaW5kZXggQ09GRiBzeW1ib2wgdHlwZQotQGNpbmRleCBzeW1ib2wgdHlwZSwgQ09GRgotQGNpbmRleCBAY29kZXt0eXBlfSBkaXJlY3RpdmUKLVRoaXMgZGlyZWN0aXZlLCBwZXJtaXR0ZWQgb25seSB3aXRoaW4gQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycywKLXJlY29yZHMgdGhlIGludGVnZXIgQHZhcntpbnR9IGFzIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey50eXBlfSBpcyBhc3NvY2lhdGVkIG9ubHkgd2l0aCBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIEBjb2Rle2Iub3V0fSBvdXRwdXQsIGl0IGFjY2VwdHMgdGhpcwotZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgVmFsCi1Ac2VjdGlvbiBAY29kZXsudmFsIEB2YXJ7YWRkcn19Ci0KLUBjaW5kZXggQGNvZGV7dmFsfSBkaXJlY3RpdmUKLUBjaW5kZXggQ09GRiB2YWx1ZSBhdHRyaWJ1dGUKLUBjaW5kZXggdmFsdWUgYXR0cmlidXRlLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSwgcGVybWl0dGVkIG9ubHkgd2l0aGluIEBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMsCi1yZWNvcmRzIHRoZSBhZGRyZXNzIEB2YXJ7YWRkcn0gYXMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiBhIHN5bWJvbCB0YWJsZQotZW50cnkuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsudmFsfSBpcyB1c2VkIG9ubHkgZm9yIENPRkYgb3V0cHV0OyB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFVsZWIxMjgKLUBzZWN0aW9uIEBjb2Rley51bGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3VsZWIxMjh9IGRpcmVjdGl2ZQotQHZhcnt1bGViMTI4fSBzdGFuZHMgZm9yIGBgdW5zaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOC4nJyAgVGhpcyBpcyBhIAotY29tcGFjdCwgdmFyaWFibGUgbGVuZ3RoIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgdXNlZCBieSB0aGUgRFdBUkYKLXN5bWJvbGljIGRlYnVnZ2luZyBmb3JtYXQuICBAeHJlZntTbGViMTI4LEBjb2Rley5zbGViMTI4fX0uCi0KLUBub2RlIFdvcmQKLUBzZWN0aW9uIEBjb2Rley53b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIG9mIGFueSBzZWN0aW9uLAotc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMzIKLUZvciBlYWNoIGV4cHJlc3Npb24sIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzIGEgMzItYml0IG51bWJlci4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMTYKLUZvciBlYWNoIGV4cHJlc3Npb24sIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzIGEgMTYtYml0IG51bWJlci4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLQotVGhlIHNpemUgb2YgdGhlIG51bWJlciBlbWl0dGVkLCBhbmQgaXRzIGJ5dGUgb3JkZXIsCi1kZXBlbmQgb24gd2hhdCB0YXJnZXQgY29tcHV0ZXIgdGhlIGFzc2VtYmx5IGlzIGZvci4KLUBlbmQgaWZzZXQKLQotQGMgb24gYW1kMjlrLCBpOTYwLCBzcGFyYyB0aGUgInNwZWNpYWwgdHJlYXRtZW50IHRvIHN1cHBvcnQgY29tcGlsZXJzIiBkb2Vzbid0Ci1AYyBoYXBwZW4tLS0zMi1iaXQgYWRkcmVzc2FiaWxpdHksIHBlcmlvZDsgbm8gbG9uZy9zaG9ydCBqdW1wcy4KLUBpZnNldCBESUZGLVRCTC1LTFVHRQotQGNpbmRleCBkaWZmZXJlbmNlIHRhYmxlcyBhbHRlcmVkCi1AY2luZGV4IGFsdGVyZWQgZGlmZmVyZW5jZSB0YWJsZXMKLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6IFNwZWNpYWwgVHJlYXRtZW50IHRvIHN1cHBvcnQgQ29tcGlsZXJzfQotQGVuZCBxdW90YXRpb24KLQotQGlmc2V0IEdFTkVSSUMKLU1hY2hpbmVzIHdpdGggYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSwgYnV0IHRoYXQgZG8gbGVzcyB0aGFuIDMyLWJpdAotYWRkcmVzc2luZywgcmVxdWlyZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgdHJlYXRtZW50LiAgSWYgdGhlIG1hY2hpbmUgb2YKLWludGVyZXN0IHRvIHlvdSBkb2VzIDMyLWJpdCBhZGRyZXNzaW5nIChvciBkb2Vzbid0IHJlcXVpcmUgaXQ7Ci1AcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9KSwgeW91IGNhbiBpZ25vcmUgdGhpcyBpc3N1ZS4KLQotQGVuZCBpZnNldAotSW4gb3JkZXIgdG8gYXNzZW1ibGUgY29tcGlsZXIgb3V0cHV0IGludG8gc29tZXRoaW5nIHRoYXQgd29ya3MsCi1AY29kZXtAdmFsdWV7QVN9fSBvY2Nhc2lvbmxseSBkb2VzIHN0cmFuZ2UgdGhpbmdzIHRvIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzLgotRGlyZWN0aXZlcyBvZiB0aGUgZm9ybSBAc2FtcHsud29yZCBzeW0xLXN5bTJ9IGFyZSBvZnRlbiBlbWl0dGVkIGJ5Ci1jb21waWxlcnMgYXMgcGFydCBvZiBqdW1wIHRhYmxlcy4gIFRoZXJlZm9yZSwgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBhc3NlbWJsZXMgYQotZGlyZWN0aXZlIG9mIHRoZSBmb3JtIEBzYW1wey53b3JkIHN5bTEtc3ltMn0sIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi1AY29kZXtzeW0xfSBhbmQgQGNvZGV7c3ltMn0gZG9lcyBub3QgZml0IGluIDE2IGJpdHMsIEBjb2Rle0B2YWx1ZXtBU319Ci1jcmVhdGVzIGEgQGRmbntzZWNvbmRhcnkganVtcCB0YWJsZX0sIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgbmV4dCBsYWJlbC4KLVRoaXMgc2Vjb25kYXJ5IGp1bXAgdGFibGUgaXMgcHJlY2VkZWQgYnkgYSBzaG9ydC1qdW1wIHRvIHRoZQotZmlyc3QgYnl0ZSBhZnRlciB0aGUgc2Vjb25kYXJ5IHRhYmxlLiAgVGhpcyBzaG9ydC1qdW1wIHByZXZlbnRzIHRoZSBmbG93Ci1vZiBjb250cm9sIGZyb20gYWNjaWRlbnRhbGx5IGZhbGxpbmcgaW50byB0aGUgbmV3IHRhYmxlLiAgSW5zaWRlIHRoZQotdGFibGUgaXMgYSBsb25nLWp1bXAgdG8gQGNvZGV7c3ltMn0uICBUaGUgb3JpZ2luYWwgQHNhbXB7LndvcmR9Ci1jb250YWlucyBAY29kZXtzeW0xfSBtaW51cyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9uZy1qdW1wIHRvCi1AY29kZXtzeW0yfS4KLQotSWYgdGhlcmUgd2VyZSBzZXZlcmFsIG9jY3VycmVuY2VzIG9mIEBzYW1wey53b3JkIHN5bTEtc3ltMn0gYmVmb3JlIHRoZQotc2Vjb25kYXJ5IGp1bXAgdGFibGUsIGFsbCBvZiB0aGVtIGFyZSBhZGp1c3RlZC4gIElmIHRoZXJlIHdhcyBhCi1Ac2FtcHsud29yZCBzeW0zLXN5bTR9LCB0aGF0IGFsc28gZGlkIG5vdCBmaXQgaW4gc2l4dGVlbiBiaXRzLCBhCi1sb25nLWp1bXAgdG8gQGNvZGV7c3ltNH0gaXMgaW5jbHVkZWQgaW4gdGhlIHNlY29uZGFyeSBqdW1wIHRhYmxlLAotYW5kIHRoZSBAY29kZXsud29yZH0gZGlyZWN0aXZlcyBhcmUgYWRqdXN0ZWQgdG8gY29udGFpbiBAY29kZXtzeW0zfQotbWludXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvbmctanVtcCB0byBAY29kZXtzeW00fTsgYW5kIHNvIG9uLCBmb3IgYXMgbWFueQotZW50cmllcyBpbiB0aGUgb3JpZ2luYWwganVtcCB0YWJsZSBhcyBuZWNlc3NhcnkuCi0KLUBpZnNldCBJTlRFUk5BTFMKLUBlbXBoe1RoaXMgZmVhdHVyZSBtYXkgYmUgZGlzYWJsZWQgYnkgY29tcGlsaW5nIEBjb2Rle0B2YWx1ZXtBU319IHdpdGggdGhlCi1Ac2FtcHstRFdPUktJTkdfRE9UX1dPUkR9IG9wdGlvbi59IFRoaXMgZmVhdHVyZSBpcyBsaWtlbHkgdG8gY29uZnVzZQotYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci1AYyBlbmQgICAgIERJRkYtVEJMLUtMVUdFCi0KLUBub2RlIERlcHJlY2F0ZWQKLUBzZWN0aW9uIERlcHJlY2F0ZWQgRGlyZWN0aXZlcwotCi1AY2luZGV4IGRlcHJlY2F0ZWQgZGlyZWN0aXZlcwotQGNpbmRleCBvYnNvbGVzY2VudCBkaXJlY3RpdmVzCi1PbmUgZGF5IHRoZXNlIGRpcmVjdGl2ZXMgd29uJ3Qgd29yay4KLVRoZXkgYXJlIGluY2x1ZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgYXNzZW1ibGVycy4KLUB0YWJsZSBAdAotQGl0ZW0gLmFib3J0Ci1AaXRlbSAubGluZQotQGVuZCB0YWJsZQotCi1AaWZzZXQgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggbWFjaGluZSBkZXBlbmRlbmNpZXMKLVRoZSBtYWNoaW5lIGluc3RydWN0aW9uIHNldHMgYXJlIChhbG1vc3QgYnkgZGVmaW5pdGlvbikgZGlmZmVyZW50IG9uCi1lYWNoIG1hY2hpbmUgd2hlcmUgQGNvZGV7QHZhbHVle0FTfX0gcnVucy4gIEZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9ucwotdmFyeSBhcyB3ZWxsLCBhbmQgQGNvZGV7QHZhbHVle0FTfX0gb2Z0ZW4gc3VwcG9ydHMgYSBmZXcgYWRkaXRpb25hbAotZGlyZWN0aXZlcyBvciBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzIG9uIGEgcGFydGljdWxhciBwbGF0Zm9ybS4gIEZpbmFsbHksIHNvbWUgdmVyc2lvbnMgb2YKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgc3BlY2lhbCBwc2V1ZG8taW5zdHJ1Y3Rpb25zIGZvciBicmFuY2gKLW9wdGltaXphdGlvbi4KLQotVGhpcyBjaGFwdGVyIGRpc2N1c3NlcyBtb3N0IG9mIHRoZXNlIGRpZmZlcmVuY2VzLCB0aG91Z2ggaXQgZG9lcyBub3QKLWluY2x1ZGUgZGV0YWlscyBvbiBhbnkgbWFjaGluZSdzIGluc3RydWN0aW9uIHNldC4gIEZvciBkZXRhaWxzIG9uIHRoYXQKLXN1YmplY3QsIHNlZSB0aGUgaGFyZHdhcmUgbWFudWZhY3R1cmVyJ3MgbWFudWFsLgotCi1AbWVudQotQGlmc2V0IEEyOUsKLSogQU1EMjlLLURlcGVuZGVudDo6ICAgICAgICAgICAgQU1EIDI5SyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLSogQVJDLURlcGVuZGVudDo6ICAgICAgICAgICAgICAgQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEFSTQotKiBBUk0tRGVwZW5kZW50OjogICAgICAgICAgICAgICBBUk0gRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgRDEwVgotKiBEMTBWLURlcGVuZGVudDo6ICAgICAgICAgICAgICBEMTBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEQzMFYKLSogRDMwVi1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgRDMwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC8zMDAKLSogSDgvMzAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC8zMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvNTAwCi0qIEg4LzUwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEhpdGFjaGkgSDgvNTAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLSogSFBQQS1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgSFBQQSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBJODAzODYKLSogaTM4Ni1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgSW50ZWwgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotKiBpOTYwLURlcGVuZGVudDo6ICAgICAgICAgICAgICBJbnRlbCA4MDk2MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLSogTTY4Sy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IE1JUFMKLSogTUlQUy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgTUlQUyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBTSAotKiBTSC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgICBIaXRhY2hpIFNIIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFNQQVJDCi0qIFNwYXJjLURlcGVuZGVudDo6ICAgICAgICAgICAgIFNQQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFY4NTAKLSogVjg1MC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgVjg1MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotKiBaODAwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICBaODAwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBWQVgKLSogVmF4LURlcGVuZGVudDo6ICAgICAgICAgICAgICAgVkFYIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGVuZCBtZW51Ci0KLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmc2V0Ci0KLUBjIFRoZSBmb2xsb3dpbmcgbWFqb3Igbm9kZXMgYXJlICpzZWN0aW9ucyogaW4gdGhlIEdFTkVSSUMgdmVyc2lvbiwgKmNoYXB0ZXJzKgotQGMgaW4gc2luZ2xlLWNwdSB2ZXJzaW9ucy4gIFRoaXMgaXMgbWFpbmx5IGFjaGlldmVkIGJ5IEBsb3dlcnNlY3Rpb25zLiAgVGhlcmUgaXMgYQotQGMgcGVjdWxpYXJpdHk6IHRvIHByZXNlcnZlIGNyb3NzLXJlZmVyZW5jZXMsIHRoZXJlIG11c3QgYmUgYSBub2RlIGNhbGxlZAotQGMgIk1hY2hpbmUgRGVwZW5kZW5jaWVzIi4gIEhlbmNlIHRoZSBjb25kaXRpb25hbCBub2RlbmFtZXMgaW4gZWFjaAotQGMgbWFqb3Igbm9kZSBiZWxvdy4gIE5vZGUgZGVmYXVsdGluZyBpbiBtYWtlaW5mbyByZXF1aXJlcyBhZGphY2VuY3kgb2YKLUBjIG5vZGUgYW5kIHNlY3Rpb25pbmcgY29tbWFuZHM7IGhlbmNlIHRoZSByZXBldGl0aW9uIG9mIEBjaGFwdGVyIEJMQUgKLUBjIGluIGJvdGggY29uZGl0aW9uYWwgYmxvY2tzLgotCi1AaWZzZXQgQVJDCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEFSQy1EZXBlbmRlbnQKLUBjaGFwdGVyIEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBBUkMgc3VwcG9ydAotQG1lbnUKLSogQVJDLU9wdHM6OiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucwotKiBBUkMtRmxvYXQ6OiAgICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBBUkMtRGlyZWN0aXZlczo6ICAgICAgICAgICAgICBTcGFyYyBNYWNoaW5lIERpcmVjdGl2ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBUkMtT3B0cwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMgZm9yIEFSQwotQGNpbmRleCBBUkMgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmVzLCBBUkMKLUBjaW5kZXggQVJDIGFyY2hpdGVjdHVyZXMKLVRoZSBBUkMgY2hpcCBmYW1pbHkgaW5jbHVkZXMgc2V2ZXJhbCBzdWNjZXNzaXZlIGxldmVscyAob3Igb3RoZXIKLXZhcmlhbnRzKSBvZiBjaGlwLCB1c2luZyB0aGUgc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCwgYnV0IGluY2x1ZGluZwotYSBmZXcgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgZWFjaCBsZXZlbC4KLQotQnkgZGVmYXVsdCwgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB0aGUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKEFSQwotYmFzZSkuICBUaGUgQGNvZGV7LmNwdX0gcHNldWRvLW9wIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gc2VsZWN0Ci10aGUgdmFyaWFudC4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1tYmlnLWVuZGlhbn0gb3B0aW9uIChBUkMpCi1AY2luZGV4IEBjb2Rley1tbGl0dGxlLWVuZGlhbn0gb3B0aW9uIChBUkMpCi1AY2luZGV4IEFSQyBiaWctZW5kaWFuIG91dHB1dAotQGNpbmRleCBBUkMgbGl0dGxlLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggYmlnLWVuZGlhbiBvdXRwdXQsIEFSQwotQGNpbmRleCBsaXR0bGUtZW5kaWFuIG91dHB1dCwgQVJDCi1AaXRlbSAtbWJpZy1lbmRpYW4KLUBpdGVteCAtbWxpdHRsZS1lbmRpYW4KLUFueSBAc2N7YXJjfSBjb25maWd1cmF0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBzZWxlY3QgYmlnLWVuZGlhbiBvcgotbGl0dGxlLWVuZGlhbiBvdXRwdXQgYXQgcnVuIHRpbWUgKHVubGlrZSBtb3N0IG90aGVyIEBzY3tnbnV9IGRldmVsb3BtZW50Ci10b29scywgd2hpY2ggbXVzdCBiZSBjb25maWd1cmVkIGZvciBvbmUgb3IgdGhlIG90aGVyKS4gIFVzZQotQHNhbXB7LW1iaWctZW5kaWFufSB0byBzZWxlY3QgYmlnLWVuZGlhbiBvdXRwdXQsIGFuZCBAc2FtcHstbWxpdHRsZS1lbmRpYW59Ci1mb3IgbGl0dGxlLWVuZGlhbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgQVJDLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBBUkMgKEBzY3tpZWVlfSkKLUBjaW5kZXggQVJDIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgQVJDIGNwdSBmYW1pbHkgY3VycmVudGx5IGRvZXMgbm90IGhhdmUgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQKLXN1cHBvcnQuICBTb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGlzIHByb3ZpZGVkIGJ5IEBjb2Rle0dDQ30KLWFuZCB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBBUkMtRGlyZWN0aXZlcwotQHNlY3Rpb24gQVJDIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IEFSQyBtYWNoaW5lIGRpcmVjdGl2ZXMKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBUkMKLVRoZSBBUkMgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwKLW1hY2hpbmUgZGlyZWN0aXZlczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAuY3B1Ci1AY2luZGV4IEBjb2Rle2NwdX0gZGlyZWN0aXZlLCBTUEFSQwotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBkZXNpcmVkIGNwdS4KLVRoZSBBUkMgaXMgaW50ZW5kZWQgdG8gYmUgY3VzdG9taXphYmxlLCBAY29kZXsuY3B1fSBpcyB1c2VkIHRvCi1zZWxlY3QgdGhlIGRlc2lyZWQgdmFyaWFudCBbdGhvdWdoIGN1cnJlbnRseSB0aGVyZSBhcmUgbm9uZV0uCi0KLUBlbmQgdGFibGUKLQotQGVuZCBpZnNldAotCi1AaWZzZXQgQTI5SwotQGluY2x1ZGUgYy1hMjlrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEFSTQotQGluY2x1ZGUgYy1hcm0udGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSGl0YWNoaS1hbGwKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1UaGUgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXRzIGFyZSBkaWZmZXJlbnQgb24gZWFjaCBIaXRhY2hpIGNoaXAgZmFtaWx5LAotYW5kIHRoZXJlIGFyZSBhbHNvIHNvbWUgc3ludGF4IGRpZmZlcmVuY2VzIGFtb25nIHRoZSBmYW1pbGllcy4gIFRoaXMKLWNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBzcGVjaWZpYyBAY29kZXtAdmFsdWV7QVN9fSBmZWF0dXJlcyBmb3IgZWFjaAotZmFtaWx5LgotCi1AbWVudQotKiBIOC8zMDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzMwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLSogSDgvNTAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCi0qIFNILURlcGVuZGVudDo6ICAgICAgICAgICAgICAgIEhpdGFjaGkgU0ggRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIG1lbnUKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQxMFYKLUBpbmNsdWRlIGMtZDEwdi50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBEMzBWCi1AaW5jbHVkZSBjLWQzMHYudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSDgvMzAwCi1AaW5jbHVkZSBjLWg4MzAwLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEg4LzUwMAotQGluY2x1ZGUgYy1oODUwMC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AaW5jbHVkZSBjLWhwcGEudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSTgwMzg2Ci1AaW5jbHVkZSBjLWkzODYudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSTk2MAotQGluY2x1ZGUgYy1pOTYwLnRleGkKLUBlbmQgaWZzZXQKLQotCi1AaWZzZXQgTTY4MFgwCi1AaW5jbHVkZSBjLW02OGsudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUlQUwotQGluY2x1ZGUgYy1taXBzLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IE5TMzJLCi1AaW5jbHVkZSBjLW5zMzJrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNICi1AaW5jbHVkZSBjLXNoLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNQQVJDCi1AaW5jbHVkZSBjLXNwYXJjLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFo4MDAwCi1AaW5jbHVkZSBjLXo4ay50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBWQVgKLUBpbmNsdWRlIGMtdmF4LnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFY4NTAKLUBpbmNsdWRlIGMtdjg1MC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBHRU5FUklDCi1AYyByZXZlcnNlIGVmZmVjdCBvZiBAZG93biBhdCB0b3Agb2YgZ2VuZXJpYyBNYWNoaW5lLURlcCBjaGFwdGVyCi1AcmFpc2VzZWN0aW9ucwotQGVuZCBpZnNldAotCi1Abm9kZSBSZXBvcnRpbmcgQnVncwotQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKLUBjaW5kZXggYnVncyBpbiBhc3NlbWJsZXIKLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MgaW4gYXNzZW1ibGVyCi0KLVlvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgQGNvZGV7QHZhbHVle0FTfX0gcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yIGl0IG1heQotbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzIHRvIGhlbHAgdGhlCi1lbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHdvcmsgYmV0dGVyLgotQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZSBtYWludGVuYW5jZSBvZiBAY29kZXtAdmFsdWV7QVN9fS4KLQotSW4gb3JkZXIgZm9yIGEgYnVnIHJlcG9ydCB0byBzZXJ2ZSBpdHMgcHVycG9zZSwgeW91IG11c3QgaW5jbHVkZSB0aGUKLWluZm9ybWF0aW9uIHRoYXQgZW5hYmxlcyB1cyB0byBmaXggdGhlIGJ1Zy4KLQotQG1lbnUKLSogQnVnIENyaXRlcmlhOjogICAgICAgICAgICAgICAgSGF2ZSB5b3UgZm91bmQgYSBidWc/Ci0qIEJ1ZyBSZXBvcnRpbmc6OiAgICAgICAgICAgICAgIEhvdyB0byByZXBvcnQgYnVncwotQGVuZCBtZW51Ci0KLUBub2RlIEJ1ZyBDcml0ZXJpYQotQHNlY3Rpb24gSGF2ZSB5b3UgZm91bmQgYSBidWc/Ci1AY2luZGV4IGJ1ZyBjcml0ZXJpYQotCi1JZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgeW91IGhhdmUgZm91bmQgYSBidWcsIGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGNpbmRleCBmYXRhbCBzaWduYWwKLUBjaW5kZXggYXNzZW1ibGVyIGNyYXNoCi1AY2luZGV4IGNyYXNoIG9mIGFzc2VtYmxlcgotQGl0ZW0KLUlmIHRoZSBhc3NlbWJsZXIgZ2V0cyBhIGZhdGFsIHNpZ25hbCwgZm9yIGFueSBpbnB1dCB3aGF0ZXZlciwgdGhhdCBpcyBhCi1AY29kZXtAdmFsdWV7QVN9fSBidWcuICBSZWxpYWJsZSBhc3NlbWJsZXJzIG5ldmVyIGNyYXNoLgotCi1AY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7QHZhbHVle0FTfX0gcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYSBidWcuCi0KLUBjaW5kZXggaW52YWxpZCBpbnB1dAotQGl0ZW0KLUlmIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCBpbnB1dCwgdGhhdAotaXMgYSBidWcuICBIb3dldmVyLCB5b3Ugc2hvdWxkIG5vdGUgdGhhdCB5b3VyIGlkZWEgb2YgYGBpbnZhbGlkIGlucHV0JycgbWlnaHQKLWJlIG91ciBpZGVhIG9mIGBgYW4gZXh0ZW5zaW9uJycgb3IgYGBzdXBwb3J0IGZvciB0cmFkaXRpb25hbCBwcmFjdGljZScnLgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGFzc2VtYmxlcnMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50Ci1vZiBAY29kZXtAdmFsdWV7QVN9fSBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggYXNzZW1ibGVyIGJ1Z3MsIHJlcG9ydGluZwotCi1BIG51bWJlciBvZiBjb21wYW5pZXMgYW5kIGluZGl2aWR1YWxzIG9mZmVyIHN1cHBvcnQgZm9yIEBzY3tnbnV9IHByb2R1Y3RzLiAgSWYKLXlvdSBvYnRhaW5lZCBAY29kZXtAdmFsdWV7QVN9fSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UKLWNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCi0KLVlvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcwotZGlzdHJpYnV0aW9uLgotCi1JbiBhbnkgZXZlbnQsIHdlIGFsc28gcmVjb21tZW5kIHRoYXQgeW91IHNlbmQgYnVnIHJlcG9ydHMgZm9yIEBjb2Rle0B2YWx1ZXtBU319Ci10byBAc2FtcHtidWctZ251LXV0aWxzQEBnbnUub3JnfS4KLQotVGhlIGZ1bmRhbWVudGFsIHByaW5jaXBsZSBvZiByZXBvcnRpbmcgYnVncyB1c2VmdWxseSBpcyB0aGlzOgotQHN0cm9uZ3tyZXBvcnQgYWxsIHRoZSBmYWN0c30uICBJZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgdG8gc3RhdGUgYQotZmFjdCBvciBsZWF2ZSBpdCBvdXQsIHN0YXRlIGl0IQotCi1PZnRlbiBwZW9wbGUgb21pdCBmYWN0cyBiZWNhdXNlIHRoZXkgdGhpbmsgdGhleSBrbm93IHdoYXQgY2F1c2VzIHRoZSBwcm9ibGVtCi1hbmQgYXNzdW1lIHRoYXQgc29tZSBkZXRhaWxzIGRvIG5vdCBtYXR0ZXIuICBUaHVzLCB5b3UgbWlnaHQgYXNzdW1lIHRoYXQgdGhlCi1uYW1lIG9mIGEgc3ltYm9sIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuICBXZWxsLCBwcm9iYWJseSBpdCBkb2VzCi1ub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMgYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoCi1oYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlIHRoYXQgbmFtZSBpcyBzdG9yZWQgaW4gbWVtb3J5OwotcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZSBjb250ZW50cyBvZiB0aGF0IGxvY2F0aW9uIHdvdWxkIGZvb2wKLXRoZSBhc3NlbWJsZXIgaW50byBkb2luZyB0aGUgcmlnaHQgdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZAotZ2l2ZSBhIHNwZWNpZmljLCBjb21wbGV0ZSBleGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLAotYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgQGNvZGV7QHZhbHVle0FTfX0gYW5ub3VuY2VzIGl0IGlmIHlvdSBzdGFydAotaXQgd2l0aCB0aGUgQHNhbXB7LS12ZXJzaW9ufSBhcmd1bWVudC4KLQotV2l0aG91dCB0aGlzLCB3ZSB3aWxsIG5vdCBrbm93IHdoZXRoZXIgdGhlcmUgaXMgYW55IHBvaW50IGluIGxvb2tpbmcgZm9yCi10aGUgYnVnIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpdGVtCi1BbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc291cmNlLgotCi1AaXRlbQotVGhlIHR5cGUgb2YgbWFjaGluZSB5b3UgYXJlIHVzaW5nLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmFtZSBhbmQKLXZlcnNpb24gbnVtYmVyLgotCi1AaXRlbQotV2hhdCBjb21waWxlciAoYW5kIGl0cyB2ZXJzaW9uKSB3YXMgdXNlZCB0byBjb21waWxlIEBjb2Rle0B2YWx1ZXtBU319LS0tZS5nLgotYGBAY29kZXtnY2MtMi43fScnLgotCi1AaXRlbQotVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBhc3NlbWJsZXIgdG8gYXNzZW1ibGUgeW91ciBleGFtcGxlIGFuZAotb2JzZXJ2ZSB0aGUgYnVnLiAgVG8gZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbQotYWxsLiAgQSBjb3B5IG9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUgYnVnLiAgSWYgdGhlIGJ1ZyBpcyBvYnNlcnZlZCB3aGVuCi10aGUgYXNzZW1ibGVyIGlzIGludm9rZWQgdmlhIGEgY29tcGlsZXIsIHNlbmQgdGhlIGFzc2VtYmxlciBzb3VyY2UsIG5vdCB0aGUKLWhpZ2ggbGV2ZWwgbGFuZ3VhZ2Ugc291cmNlLiAgTW9zdCBjb21waWxlcnMgd2lsbCBwcm9kdWNlIHRoZSBhc3NlbWJsZXIgc291cmNlCi13aGVuIHJ1biB3aXRoIHRoZSBAc2FtcHstU30gb3B0aW9uLiAgSWYgeW91IGFyZSB1c2luZyBAY29kZXtAdmFsdWV7R0NDfX0sIHVzZQotdGhlIG9wdGlvbnMgQHNhbXB7LXYgLS1zYXZlLXRlbXBzfTsgdGhpcyB3aWxsIHNhdmUgdGhlIGFzc2VtYmxlciBzb3VyY2UgaW4gYQotZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsuc30sIGFuZCBhbHNvIHNob3cgeW91IGV4YWN0bHkgaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBiZWluZyBydW4uCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBnZXRzIGEgZmF0YWwgc2lnbmFsLCB0aGVuIHdlCi13aWxsIGNlcnRhaW5seSBub3RpY2UgaXQuICBCdXQgaWYgdGhlIGJ1ZyBpcyBpbmNvcnJlY3Qgb3V0cHV0LCB3ZSBtaWdodCBub3QKLW5vdGljZSB1bmxlc3MgaXQgaXMgZ2xhcmluZ2x5IHdyb25nLiAgWW91IG1pZ2h0IGFzIHdlbGwgbm90IGdpdmUgdXMgYSBjaGFuY2UgdG8KLW1ha2UgYSBtaXN0YWtlLgotCi1FdmVuIGlmIHRoZSBwcm9ibGVtIHlvdSBleHBlcmllbmNlIGlzIGEgZmF0YWwgc2lnbmFsLCB5b3Ugc2hvdWxkIHN0aWxsIHNheSBzbwotZXhwbGljaXRseS4gIFN1cHBvc2Ugc29tZXRoaW5nIHN0cmFuZ2UgaXMgZ29pbmcgb24sIHN1Y2ggYXMsIHlvdXIgY29weSBvZgotQGNvZGV7QHZhbHVle0FTfX0gaXMgb3V0IG9mIHN5bmNoLCBvciB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1ZyBpbiB0aGUgQwotbGlicmFyeSBvbiB5b3VyIHN5c3RlbS4gIChUaGlzIGhhcyBoYXBwZW5lZCEpICBZb3VyIGNvcHkgbWlnaHQgY3Jhc2ggYW5kIG91cnMKLXdvdWxkIG5vdC4gIElmIHlvdSB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdoZW4gb3VycyBmYWlscyB0byBjcmFzaCwgd2UKLXdvdWxkIGtub3cgdGhhdCB0aGUgYnVnIHdhcyBub3QgaGFwcGVuaW5nIGZvciB1cy4gIElmIHlvdSBoYWQgbm90IHRvbGQgdXMgdG8KLWV4cGVjdCBhIGNyYXNoLCB0aGVuIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGRyYXcgYW55IGNvbmNsdXNpb24gZnJvbSBvdXIKLW9ic2VydmF0aW9ucy4KLQotQGl0ZW0KLUlmIHlvdSB3aXNoIHRvIHN1Z2dlc3QgY2hhbmdlcyB0byB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc291cmNlLCBzZW5kIHVzIGNvbnRleHQKLWRpZmZzLCBhcyBnZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yIEBzYW1wey1wfQotb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgSWYgeW91IGV2ZW4KLWRpc2N1c3Mgc29tZXRoaW5nIGluIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5IGNvbnRleHQsIG5vdAotYnkgbGluZSBudW1iZXIuCi0KLVRoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgotc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCi0KLU9mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZwotd2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAotY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCi0KLVRoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCi13aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCi13aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCi0KLU9mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQotb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKLW91dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKLWxlc3MgdGltZSwgYW5kIHNvIG9uLgotCi1Ib3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAotcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgotCi1AaXRlbQotQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KLQotQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAotdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1hIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCi10byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KLQotU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEBjb2Rle0B2YWx1ZXtBU319IGl0IGlzIHZlcnkgaGFyZCB0bwotY29uc3RydWN0IGFuIGV4YW1wbGUgdGhhdCB3aWxsIG1ha2UgdGhlIHByb2dyYW0gZm9sbG93IGEgY2VydGFpbiBwYXRoIHRocm91Z2gKLXRoZSBjb2RlLiAgSWYgeW91IGRvIG5vdCBzZW5kIHVzIHRoZSBleGFtcGxlLCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbnN0cnVjdAotb25lLCBzbyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHZlcmlmeSB0aGF0IHRoZSBidWcgaXMgZml4ZWQuCi0KLUFuZCBpZiB3ZSBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGJ1ZyB5b3UgYXJlIHRyeWluZyB0byBmaXgsIG9yIHdoeSB5b3VyCi1wYXRjaCBzaG91bGQgYmUgYW4gaW1wcm92ZW1lbnQsIHdlIHdpbGwgbm90IGluc3RhbGwgaXQuICBBIHRlc3QgY2FzZSB3aWxsCi1oZWxwIHVzIHRvIHVuZGVyc3RhbmQuCi0KLUBpdGVtCi1BIGd1ZXNzIGFib3V0IHdoYXQgdGhlIGJ1ZyBpcyBvciB3aGF0IGl0IGRlcGVuZHMgb24uCi0KLVN1Y2ggZ3Vlc3NlcyBhcmUgdXN1YWxseSB3cm9uZy4gIEV2ZW4gd2UgY2Fubm90IGd1ZXNzIHJpZ2h0IGFib3V0IHN1Y2gKLXRoaW5ncyB3aXRob3V0IGZpcnN0IHVzaW5nIHRoZSBkZWJ1Z2dlciB0byBmaW5kIHRoZSBmYWN0cy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBBY2tub3dsZWRnZW1lbnRzCi1AY2hhcHRlciBBY2tub3dsZWRnZW1lbnRzCi0KLUlmIHlvdSBoYXZlIGNvbnRyaWJ1dGVkIHRvIEBjb2Rle0B2YWx1ZXtBU319IGFuZCB5b3VyIG5hbWUgaXNuJ3QgbGlzdGVkIGhlcmUsCi1pdCBpcyBub3QgbWVhbnQgYXMgYSBzbGlnaHQuICBXZSBqdXN0IGRvbid0IGtub3cgYWJvdXQgaXQuICBTZW5kIG1haWwgdG8gdGhlCi1tYWludGFpbmVyLCBhbmQgd2UnbGwgY29ycmVjdCB0aGUgc2l0dWF0aW9uLiAgQ3VycmVudGx5IAotQGMgKEphbnVhcnkgMTk5NCksIAotdGhlIG1haW50YWluZXIgaXMgS2VuIFJhZWJ1cm4gKGVtYWlsIGFkZHJlc3MgQGNvZGV7cmFlYnVybkBAY3lnbnVzLmNvbX0pLgotCi1EZWFuIEVsc25lciB3cm90ZSB0aGUgb3JpZ2luYWwgQHNje2dudX0gYXNzZW1ibGVyIGZvciB0aGUgVkFYLkBmb290bm90ZXtBbnkKLW1vcmUgZGV0YWlscz99Ci0KLUpheSBGZW5sYXNvbiBtYWludGFpbmVkIEdBUyBmb3IgYSB3aGlsZSwgYWRkaW5nIHN1cHBvcnQgZm9yIEdEQi1zcGVjaWZpYyBkZWJ1ZwotaW5mb3JtYXRpb24gYW5kIHRoZSA2OGsgc2VyaWVzIG1hY2hpbmVzLCBtb3N0IG9mIHRoZSBwcmVwcm9jZXNzaW5nIHBhc3MsIGFuZAotZXh0ZW5zaXZlIGNoYW5nZXMgaW4gQGZpbGV7bWVzc2FnZXMuY30sIEBmaWxle2lucHV0LWZpbGUuY30sIEBmaWxle3dyaXRlLmN9LgotCi1LLiBSaWNoYXJkIFBpeGxleSBtYWludGFpbmVkIEdBUyBmb3IgYSB3aGlsZSwgYWRkaW5nIHZhcmlvdXMgZW5oYW5jZW1lbnRzIGFuZAotbWFueSBidWcgZml4ZXMsIGluY2x1ZGluZyBtZXJnaW5nIHN1cHBvcnQgZm9yIHNldmVyYWwgcHJvY2Vzc29ycywgYnJlYWtpbmcgR0FTCi11cCB0byBoYW5kbGUgbXVsdGlwbGUgb2JqZWN0IGZpbGUgZm9ybWF0IGJhY2sgZW5kcyAoaW5jbHVkaW5nIGhlYXZ5IHJld3JpdGUsCi10ZXN0aW5nLCBhbiBpbnRlZ3JhdGlvbiBvZiB0aGUgY29mZiBhbmQgYi5vdXQgYmFjayBlbmRzKSwgYWRkaW5nIGNvbmZpZ3VyYXRpb24KLWluY2x1ZGluZyBoZWF2eSB0ZXN0aW5nIGFuZCB2ZXJpZmljYXRpb24gb2YgY3Jvc3MgYXNzZW1ibGVycyBhbmQgZmlsZSBzcGxpdHMKLWFuZCByZW5hbWluZywgY29udmVydGVkIEdBUyB0byBzdHJpY3RseSBBTlNJIEMgaW5jbHVkaW5nIGZ1bGwgcHJvdG90eXBlcywgYWRkZWQKLXN1cHBvcnQgZm9yIG02ODBbMzRdMCBhbmQgY3B1MzIsIGRpZCBjb25zaWRlcmFibGUgd29yayBvbiBpOTYwIGluY2x1ZGluZyBhIENPRkYKLXBvcnQgKGluY2x1ZGluZyBjb25zaWRlcmFibGUgYW1vdW50cyBvZiByZXZlcnNlIGVuZ2luZWVyaW5nKSwgYSBTUEFSQyBvcGNvZGUKLWZpbGUgcmV3cml0ZSwgREVDc3RhdGlvbiwgcnM2MDAwLCBhbmQgaHAzMDBocHV4IGhvc3QgcG9ydHMsIHVwZGF0ZWQgYGBrbm93JycKLWFzc2VydGlvbnMgYW5kIG1hZGUgdGhlbSB3b3JrLCBtdWNoIG90aGVyIHJlb3JnYW5pemF0aW9uLCBjbGVhbnVwLCBhbmQgbGludC4KLQotS2VuIFJhZWJ1cm4gd3JvdGUgdGhlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZSBjb2RlIHRvIHJlcGxhY2UgbW9zdCBvZiB0aGUgY29kZQotaW4gZm9ybWF0LXNwZWNpZmljIEkvTyBtb2R1bGVzLgotCi1UaGUgb3JpZ2luYWwgVk1TIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IERhdmlkIEwuIEthc2h0YW4uICBFcmljIFlvdW5nZGFsZQotaGFzIGRvbmUgbXVjaCB3b3JrIHdpdGggaXQgc2luY2UuCi0KLVRoZSBJbnRlbCA4MDM4NiBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyB3cml0dGVuIGJ5IEVsaW90IERyZXNzZWxoYXVzLgotCi1NaW5oIFRyYW4tTGUgYXQgSW50ZWxsaUNvcnAgY29udHJpYnV0ZWQgc29tZSBBSVggMzg2IHN1cHBvcnQuCi0KLVRoZSBNb3Rvcm9sYSA4OGsgbWFjaGluZSBkZXNjcmlwdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbwotVW5pdmVyc2l0eSBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0KLUtlaXRoIEtub3dsZXMgYXQgdGhlIE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiB3cm90ZSB0aGUgb3JpZ2luYWwgTUlQUyBiYWNrIGVuZAotKEBmaWxle3RjLW1pcHMuY30sIEBmaWxle3RjLW1pcHMuaH0pLCBhbmQgY29udHJpYnV0ZWQgUm9zZSBmb3JtYXQgc3VwcG9ydAotKHdoaWNoIGhhc24ndCBiZWVuIG1lcmdlZCBpbiB5ZXQpLiAgUmFscGggQ2FtcGJlbGwgd29ya2VkIHdpdGggdGhlIE1JUFMgY29kZSB0bwotc3VwcG9ydCBhLm91dCBmb3JtYXQuCi0KLVN1cHBvcnQgZm9yIHRoZSBaaWxvZyBaOGsgYW5kIEhpdGFjaGkgSDgvMzAwIGFuZCBIOC81MDAgcHJvY2Vzc29ycyAodGMtejhrLAotdGMtaDgzMDAsIHRjLWg4NTAwKSwgYW5kIElFRUUgNjk1IG9iamVjdCBmaWxlIGZvcm1hdCAob2JqLWllZWUpLCB3YXMgd3JpdHRlbiBieQotU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuICBTdGV2ZSBhbHNvIG1vZGlmaWVkIHRoZSBDT0ZGIGJhY2sgZW5kIHRvCi11c2UgQkZEIGZvciBzb21lIGxvdy1sZXZlbCBvcGVyYXRpb25zLCBmb3IgdXNlIHdpdGggdGhlIEg4LzMwMCBhbmQgQU1EIDI5awotdGFyZ2V0cy4KLQotSm9obiBHaWxtb3JlIGJ1aWx0IHRoZSBBTUQgMjkwMDAgc3VwcG9ydCwgYWRkZWQgQGNvZGV7LmluY2x1ZGV9IHN1cHBvcnQsIGFuZAotc2ltcGxpZmllZCB0aGUgY29uZmlndXJhdGlvbiBvZiB3aGljaCB2ZXJzaW9ucyBhY2NlcHQgd2hpY2ggZGlyZWN0aXZlcy4gIEhlCi11cGRhdGVkIHRoZSA2OGsgbWFjaGluZSBkZXNjcmlwdGlvbiBzbyB0aGF0IE1vdG9yb2xhJ3Mgb3Bjb2RlcyBhbHdheXMgcHJvZHVjZWQKLWZpeGVkLXNpemUgaW5zdHJ1Y3Rpb25zIChlLmcuIEBjb2Rle2pzcn0pLCB3aGlsZSBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zCi1yZW1haW5lZCBzaHJpbmthYmxlIChAY29kZXtqYnNyfSkuICBKb2huIGZpeGVkIG1hbnkgYnVncywgaW5jbHVkaW5nIHRydWUgdGVzdGVkCi1jcm9zcy1jb21waWxhdGlvbiBzdXBwb3J0LCBhbmQgb25lIGJ1ZyBpbiByZWxheGF0aW9uIHRoYXQgdG9vayBhIHdlZWsgYW5kCi1yZXF1aXJlZCB0aGUgcHJvdmVyYmlhbCBvbmUtYml0IGZpeC4KLQotSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMgU3VwcG9ydCBtZXJnZWQgdGhlIE1vdG9yb2xhIGFuZCBNSVQgc3ludGF4IGZvciB0aGUKLTY4aywgY29tcGxldGVkIHN1cHBvcnQgZm9yIHNvbWUgQ09GRiB0YXJnZXRzICg2OGssIGkzODYgU1ZSMywgYW5kIFNDTyBVbml4KSwKLWFkZGVkIHN1cHBvcnQgZm9yIE1JUFMgRUNPRkYgYW5kIEVMRiB0YXJnZXRzLCB3cm90ZSB0aGUgaW5pdGlhbCBSUy82MDAwIGFuZAotUG93ZXJQQyBhc3NlbWJsZXIsIGFuZCBtYWRlIGEgZmV3IG90aGVyIG1pbm9yIHBhdGNoZXMuCi0KLVN0ZXZlIENoYW1iZXJsYWluIG1hZGUgQGNvZGV7QHZhbHVle0FTfX0gYWJsZSB0byBnZW5lcmF0ZSBsaXN0aW5ncy4KLQotSGV3bGV0dC1QYWNrYXJkIGNvbnRyaWJ1dGVkIHN1cHBvcnQgZm9yIHRoZSBIUDkwMDAvMzAwLgotCi1KZWZmIExhdyB3cm90ZSBHQVMgYW5kIEJGRCBzdXBwb3J0IGZvciB0aGUgbmF0aXZlIEhQUEEgb2JqZWN0IGZvcm1hdCAoU09NKQotYWxvbmcgd2l0aCBhIGZhaXJseSBleHRlbnNpdmUgSFBQQSB0ZXN0c3VpdGUgKGZvciBib3RoIFNPTSBhbmQgRUxGIG9iamVjdAotZm9ybWF0cykuICBUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSBib3RoIHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQKLXRoZSBVbml2ZXJzaXR5IG9mIFV0YWggYW5kIEN5Z251cyBTdXBwb3J0LgotCi1TdXBwb3J0IGZvciBFTEYgZm9ybWF0IGZpbGVzIGhhcyBiZWVuIHdvcmtlZCBvbiBieSBNYXJrIEVpY2hpbiBvZiBDeWdudXMKLVN1cHBvcnQgKG9yaWdpbmFsLCBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGZvciBTUEFSQyksIFBldGUgSG9vZ2VuYm9vbSBhbmQKLUplZmYgTGF3IGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggKEhQUEEgbWFpbmx5KSwgTWljaGFlbCBNZWlzc25lciBvZiB0aGUgT3BlbgotU29mdHdhcmUgRm91bmRhdGlvbiAoaTM4NiBtYWlubHkpLCBhbmQgS2VuIFJhZWJ1cm4gb2YgQ3lnbnVzIFN1cHBvcnQgKHNwYXJjLAotYW5kIHNvbWUgaW5pdGlhbCA2NC1iaXQgc3VwcG9ydCkuCi0KLVJpY2hhcmQgSGVuZGVyc29uIHJld3JvdGUgdGhlIEFscGhhIGFzc2VtYmxlci4gS2xhdXMgS2FlbXBmIHdyb3RlIEdBUyBhbmQgQkZECi1zdXBwb3J0IGZvciBvcGVuVk1TL0FscGhhLgotCi1TZXZlcmFsIGVuZ2luZWVycyBhdCBDeWdudXMgU3VwcG9ydCBoYXZlIGFsc28gcHJvdmlkZWQgbWFueSBzbWFsbCBidWcgZml4ZXMgYW5kCi1jb25maWd1cmF0aW9uIGVuaGFuY2VtZW50cy4KLQotTWFueSBvdGhlcnMgaGF2ZSBjb250cmlidXRlZCBsYXJnZSBvciBzbWFsbCBidWdmaXhlcyBhbmQgZW5oYW5jZW1lbnRzLiAgSWYKLXlvdSBoYXZlIGNvbnRyaWJ1dGVkIHNpZ25pZmljYW50IHdvcmsgYW5kIGFyZSBub3QgbWVudGlvbmVkIG9uIHRoaXMgbGlzdCwgYW5kCi13YW50IHRvIGJlLCBsZXQgdXMga25vdy4gIFNvbWUgb2YgdGhlIGhpc3RvcnkgaGFzIGJlZW4gbG9zdDsgd2UgYXJlIG5vdAotaW50ZW50aW9uYWxseSBsZWF2aW5nIGFueW9uZSBvdXQuCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKLUBjIExvY2FsIFZhcmlhYmxlczoKLUBjIGZpbGwtY29sdW1uOiA3OQotQGMgRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWEyOWsudGV4aSBiL2dhcy9kb2MvYy1hMjlrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTE1ZDguLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWEyOWsudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgQU1EMjlLLURlcGVuZGVudAotQGNoYXB0ZXIgQU1EIDI5SyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBBTUQgMjlLIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggQU1EIDI5SyBzdXBwb3J0Ci1AY2luZGV4IDI5SyBzdXBwb3J0Ci1AbWVudQotKiBBTUQyOUsgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEFNRDI5SyBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBBTUQyOUsgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBBTUQyOUsgRGlyZWN0aXZlczo6ICAgICAgICAgICBBTUQgMjlLIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBBTUQyOUsgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQU1EMjlLIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLUBjaW5kZXggQU1EIDI5SyBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zIGZvciBBTUQyOUsgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEFNRAotMjlLIGZhbWlseS4KLQotQG5vZGUgQU1EMjlLIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBBTUQyOUstTWFjcm9zOjoJCU1hY3JvcwotKiBBTUQyOUstQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogQU1EMjlLLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBTUQyOUstTWFjcm9zCi1Ac3Vic2VjdGlvbiBNYWNyb3MKLQotQGNpbmRleCBNYWNyb3MsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBtYWNyb3MKLVRoZSBtYWNybyBzeW50YXggdXNlZCBvbiB0aGUgQU1EIDI5SyBpcyBsaWtlIHRoYXQgZGVzY3JpYmVkIGluIHRoZSBBTUQKLTI5SyBGYW1pbHkgTWFjcm8gQXNzZW1ibGVyIFNwZWNpZmljYXRpb24uICBOb3JtYWwgQGNvZGV7QHZhbHVle0FTfX0KLW1hY3JvcyBzaG91bGQgc3RpbGwgd29yay4KLQotQG5vZGUgQU1EMjlLLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggaWRlbnRpZmllcnMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBpZGVudGlmaWVycwotVGhlIGNoYXJhY3RlciBAc2FtcHs/fSBpcyBwZXJtaXR0ZWQgaW4gaWRlbnRpZmllcnMgKGJ1dCBtYXkgbm90IGJlZ2luCi1hbiBpZGVudGlmaWVyKS4KLQotQG5vZGUgQU1EMjlLLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggQU1EIDI5SyByZWdpc3RlciBuYW1lcwotQGNpbmRleCByZWdpc3RlciBuYW1lcywgQU1EIDI5SwotR2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgcHJlZGVmaW5lZCBzeW1ib2xzIG9mIHRoZQotZm9ybSBAc2FtcHtHUkB2YXJ7bm5ufX0gKGZvciBnbG9iYWwgcmVnaXN0ZXJzKSBvciBAc2FtcHtMUkB2YXJ7bm5ufX0KLShmb3IgbG9jYWwgcmVnaXN0ZXJzKSwgd2hlcmUgQHZhcntubm59IHJlcHJlc2VudHMgYSBudW1iZXIgYmV0d2VlbgotQGNvZGV7MH0gYW5kIEBjb2RlezEyN30sIHdyaXR0ZW4gd2l0aCBubyBsZWFkaW5nIHplcm9zLiAgVGhlIGxlYWRpbmcKLWxldHRlcnMgbWF5IGJlIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlOyBmb3IgZXhhbXBsZSwgQHNhbXB7Z3IxM30KLWFuZCBAc2FtcHtMUjd9IGFyZSBib3RoIHZhbGlkIHJlZ2lzdGVyIG5hbWVzLgotCi1Zb3UgbWF5IGFsc28gcmVmZXIgdG8gZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycyBieSBzcGVjaWZ5aW5nIHRoZQotcmVnaXN0ZXIgbnVtYmVyIGFzIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiAocHJlZml4ZWQgd2l0aCBAc2FtcHslJX0KLXRvIGZsYWcgdGhlIGV4cHJlc3Npb24gYXMgYSByZWdpc3RlciBudW1iZXIpOgotQHNtYWxsZXhhbXBsZQotJSVAdmFye2V4cHJlc3Npb259Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci0tLS13aGVyZSBAdmFye2V4cHJlc3Npb259IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGEKLW51bWJlciBiZXR3ZWVuIEBjb2RlezB9IGFuZCBAY29kZXsyNTV9LiAgVGhlIHJhbmdlIFswLCAxMjddIHJlZmVycyB0bwotZ2xvYmFsIHJlZ2lzdGVycywgYW5kIHRoZSByYW5nZSBbMTI4LCAyNTVdIHRvIGxvY2FsIHJlZ2lzdGVycy4KLQotQGNpbmRleCBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgc3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVycwotQGNpbmRleCBwcm90ZWN0ZWQgcmVnaXN0ZXJzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgcHJvdGVjdGVkIHJlZ2lzdGVycwotSW4gYWRkaXRpb24sIEBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgcHJvdGVjdGVkCi1zcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgZm9yIHRoZSBBTUQgMjlLIGZhbWlseToKLQotQHNtYWxsZXhhbXBsZQotICB2YWIgICAgY2hkICAgIHBjMAotICBvcHMgICAgY2hjICAgIHBjMQotICBjcHMgICAgcmJwICAgIHBjMgotICBjZmcgICAgdG1jICAgIG1tdQotICBjaGEgICAgdG1yICAgIGxydQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlc2UgdW5wcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG5hbWVzIGFyZSBhbHNvIHJlY29nbml6ZWQ6Ci1Ac21hbGxleGFtcGxlCi0gIGlwYyAgICBhbHUgICAgZnBlCi0gIGlwYSAgICBicCAgICAgaW50ZQotICBpcGIgICAgZmMgICAgIGZwcwotICBxICAgICAgY3IgICAgIGV4b3AKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEFNRDI5SyBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgQU1EIDI5SyAoQHNje2llZWV9KQotQGNpbmRleCBBTUQgMjlLIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgQU1EIDI5SyBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgQU1EMjlLIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEFNRCAyOUsgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgbWFjaGluZSBkaXJlY3RpdmVzCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7YmxvY2t9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmJsb2NrIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYQotYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLgotCi1JbiBvdGhlciB2ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyLCB0aGlzIGRpcmVjdGl2ZSBpcyBjYWxsZWQKLUBzYW1wey5zcGFjZX0uCi1AZW5kIHRhYmxlCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtjcHV0eXBlfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5jcHV0eXBlCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1BTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBjaW5kZXggQGNvZGV7ZmlsZX0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAuZmlsZQotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gaW4gb3RoZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciwgQGNvZGV7LmZpbGV9IGlzCi11c2VkIGZvciB0aGUgZGlyZWN0aXZlIGNhbGxlZCBAY29kZXsuYXBwLWZpbGV9IGluIHRoZSBBTUQgMjlLIHN1cHBvcnQuCi1AZW5kIHF1b3RhdGlvbgotCi1AY2luZGV4IEBjb2Rle2xpbmV9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmxpbmUKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQGlnbm9yZQotQGMgc2luY2Ugd2UncmUgaWdub3JpbmcgLmxzeW0uLi4KLUBjaW5kZXggQGNvZGV7cmVnfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5yZWcgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259Ci1AY29kZXsucmVnfSBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEBjb2Rley5sc3ltfTsgQHB4cmVme0xzeW0sLEBjb2Rley5sc3ltfX0uCi1AZW5kIGlnbm9yZQotCi1AY2luZGV4IEBjb2Rle3NlY3R9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLnNlY3QKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQGNpbmRleCBAY29kZXt1c2V9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLnVzZSBAdmFye3NlY3Rpb24gbmFtZX0KLUVzdGFibGlzaGVzIHRoZSBzZWN0aW9uIGFuZCBzdWJzZWN0aW9uIGZvciB0aGUgZm9sbG93aW5nIGNvZGU7Ci1AdmFye3NlY3Rpb24gbmFtZX0gbWF5IGJlIG9uZSBvZiBAY29kZXsudGV4dH0sIEBjb2Rley5kYXRhfSwKLUBjb2Rley5kYXRhMX0sIG9yIEBjb2Rley5saXR9LiAgV2l0aCBvbmUgb2YgdGhlIGZpcnN0IHRocmVlIEB2YXJ7c2VjdGlvbgotbmFtZX0gb3B0aW9ucywgQHNhbXB7LnVzZX0gaXMgZXF1aXZhbGVudCB0byB0aGUgbWFjaGluZSBkaXJlY3RpdmUKLUB2YXJ7c2VjdGlvbiBuYW1lfTsgdGhlIHJlbWFpbmluZyBjYXNlLCBAc2FtcHsudXNlIC5saXR9LCBpcyB0aGUgc2FtZSBhcwotQHNhbXB7LmRhdGEgMjAwfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQU1EMjlLIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBBTUQgMjlLIG9wY29kZXMKLUBjaW5kZXggb3Bjb2RlcyBmb3IgQU1EIDI5SwotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEFNRCAyOUsgb3Bjb2Rlcy4gIE5vCi1hZGRpdGlvbmFsIHBzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4KLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSAyOUsgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtBbTI5MDAwCi1Vc2VyJ3MgTWFudWFsfSwgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtYXJtLnRleGkgYi9nYXMvZG9jL2MtYXJtLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MzhhYzkuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWFybS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEFSTS1EZXBlbmRlbnQKLUBjaGFwdGVyIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEFSTSBzdXBwb3J0Ci1AY2luZGV4IFRodW1iIHN1cHBvcnQKLUBtZW51Ci0qIEFSTSBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogQVJNIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEFSTSBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEFSTSBEaXJlY3RpdmVzOjogICAgICAgICAgIEFSTSBNYWNoaW5lIERpcmVjdGl2ZXMKLSogQVJNIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEFSTSBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY2luZGV4IEFSTSBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zIGZvciBBUk0gKG5vbmUpCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7LW1hcm19IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hcm0gQHZhcntbMnwyNTB8M3w2fDYwfDYwMHw2MTB8NjIwfDd8N218N2R8N2RtfDdkaXw3ZG1pfDcwfDcwMHw3MDBpfDcxMHw3MTBjfDcxMDB8NzUwMHw3NTAwZmV8N3RkbWl8OHw4MTB8OXw5dGRtaXw5MjB8fHN0cm9uZ2FybXxzdHJvbmdhcm0xMTB8c3Ryb25nYXJtMTEwMF19Ci1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHRhcmdldCBwcm9jZXNzb3IuICBUaGUgYXNzZW1ibGVyIHdpbGwgaXNzdWUgYW4KLWVycm9yIG1lc3NhZ2UgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFzc2VtYmxlIGFuIGluc3RydWN0aW9uIHdoaWNoCi13aWxsIG5vdCBleGVjdXRlIG9uIHRoZSB0YXJnZXQgcHJvY2Vzc29yLgotQGNpbmRleCBAY29kZXstbWFybXZ9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hcm12IEB2YXJ7WzJ8MmF8M3wzbXw0fDR0fDV8NXRdfQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAgVGhlIGFzc2VtYmxlciB3aWxsIGlzc3VlCi1hbiBlcnJvciBtZXNzYWdlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhc3NlbWJsZSBhbiBpbnN0cnVjdGlvbiB3aGljaAotd2lsbCBub3QgZXhlY3V0ZSBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KLUBjaW5kZXggQGNvZGV7LW10aHVtYn0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbXRodW1iCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCBvbmx5IFRodW1iIGluc3RydWN0aW9ucyBzaG91bGQgYmUgYXNzZW1ibGVkLgotQGNpbmRleCBAY29kZXstbWFsbH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWFsbAotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgYW55IEFybSBvciBUaHVtYiBpbnN0cnVjdGlvbiBzaG91bGQgYmUgYXNzZW1ibGVkLgotQGNpbmRleCBAY29kZXstbWZwYX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWZwYSBAdmFye1sxMHwxMV19Ci1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IGFyY2hpdGVjdHVyZSBpbiB1c2Ugb24gdGhlCi10YXJnZXQgcHJvY2Vzc29yLiAKLUBjaW5kZXggQGNvZGV7LW1mcGUtb2xkfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tZnBlLW9sZAotRG8gbm90IGFsbG93IHRoZSBhc3NlbWJsZSBvZiBmbG9hdGluZyBwb2ludCBtdWx0aXBsZSBpbnN0cnVjdGlvbnMuCi1AY2luZGV4IEBjb2Rley1tbm8tZnB1fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tbm8tZnB1Ci1EbyBub3QgYWxsb3cgdGhlIGFzc2VtYmx5IG9mIGFueSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuCi1AY2luZGV4IEBjb2Rley1tdGh1bWItaW50ZXJ3b3JrfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tdGh1bWItaW50ZXJ3b3JrCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAotYmUgbWFya2VkIGFzIHN1cHBvcnRpbmcgaW50ZXJ3b3JraW5nLgotQGNpbmRleCBAY29kZXstbWFwY3N9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hcGNzIEB2YXJ7WzI2fDMyXX0KLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgc2hvdWxkCi1iZSBtYXJrZWQgYXMgc3VwcG9ydGluZyB0aGUgaW5kaWNhdGVkIHZlcnNpb24gb2YgdGhlIEFybSBQcm9jZWR1cmUuCi1DYWxsaW5nIFN0YW5kYXJkLgotQGl0ZW0gLW1hcGNzLWZsb2F0Ci1UaGlzIGluZGljYXRlcyB0aGUgdGhlIGZsb2F0aW5nIHBvaW50IHZhcmlhbnQgb2YgdGhlIEFQQ1Mgc2hvdWxkIGJlCi11c2VkLiAgSW4gdGhpcyB2YXJpYW50IGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIEZQCi1yZWdpc3RlcnMgcmF0ZWhyIHRoYW4gaW50ZWdlciByZWdpc3RlcnMuCi1AaXRlbSAtbWFwY3MtcmVlbnRyYW50Ci1UaGlzIGluZGljYXRlcyB0aGF0IHRoZSByZWVudHJhbnQgdmFyaWFudCBvZiB0aGUgQVBDUyBzaG91bGQgYmUgdXNlZC4KLVRoaXMgdmFyaWFudCBzdXBwb3J0cyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLgotQGNpbmRleCBAY29kZXstRUJ9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLUVCCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAotYmUgbWFya2VkIGFzIGJlaW5nIGVuY29kZWQgZm9yIGEgYmlnLWVuZGlhbiBwcm9jZXNzb3IuCi1AY2luZGV4IEBjb2Rley1FTH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtRUwKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgc2hvdWxkCi1iZSBtYXJrZWQgYXMgYmVpbmcgZW5jb2RlZCBmb3IgYSBsaXR0bGUtZW5kaWFuIHByb2Nlc3Nvci4KLUBjaW5kZXggQGNvZGV7LWt9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGNpbmRleCBQSUMgY29kZSBnZW5lcmF0aW9uIGZvciBBUk0KLUBpdGVtIC1rCi1UaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBnZW5lcmF0aW9uIG9mIFBJQyAocG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSkuCi1AaXRlbSAtbW9hYmkKLVRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGFzc2VtYmxlZCB1c2luZyB0aGUgb2xkIEFSTSBFTEYKLWNvbnZlbnRpb25zLCBiYXNlZCBvbiBhIGJldGEgcmVsZWFzZSByZWxlYXNlIG9mIHRoZSBBUk0tRUxGCi1zcGVjaWZpY2F0aW9ucywgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgY29udmVudGlvbnMgd2hpY2ggYXJlIGJhc2VkIG9uCi10aGUgZmluYWwgcmVsZWFzZSBvZiB0aGUgQVJNLUVMRiBzcGVjaWZpY2F0aW9ucy4KLUBlbmQgdGFibGUKLQotCi1Abm9kZSBBUk0gU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIEFSTS1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBBUk0tUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotQGVuZCBtZW51Ci0KLUBub2RlIEFSTS1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgQVJNCi1AY2luZGV4IEFSTSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1UaGUgcHJlc2VuY2Ugb2YgYSBAc2FtcHsjfSBhbmQgQHNhbXB7QEB9IG9uIGEgbGluZSBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mCi1hIGNvbW1lbnQgdGhhdCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS4KLQotQGNpbmRleCBpZGVudGlmaWVycywgQVJNCi1AY2luZGV4IEFSTSBpZGVudGlmaWVycwotKlRPRE8qIEV4cGxhaW4gYWJvdXQgL2RhdGEgbW9kaWZpZXIgb24gc3ltYm9scy4KLQotQG5vZGUgQVJNLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggQVJNIHJlZ2lzdGVyIG5hbWVzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBBUk0KLSpUT0RPKiBFeHBsYWluIGFib3V0IEFSTSByZWdpc3RlciBuYW1pbmcsIGFuZCB0aGUgcHJlZGVmaW5lZCBuYW1lcy4KLQotQG5vZGUgQVJNIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBBUk0gKEBzY3tpZWVlfSkKLUBjaW5kZXggQVJNIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgQVJNIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi0KLQotQG5vZGUgQVJNIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEFSTSBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEFSTQotQGNpbmRleCBBUk0gbWFjaGluZSBkaXJlY3RpdmVzCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBAY29kZXtyZXF9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSBAdmFye25hbWV9IC5yZXEgQHZhcntyZWdpc3RlciBuYW1lfQotVGhpcyBjcmVhdGVzIGFuIGFsaWFzIGZvciBAdmFye3JlZ2lzdGVyIG5hbWV9IGNhbGxlZCBAdmFye25hbWV9LiAgRm9yCi1leGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIGZvbyAucmVxIHIwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IEBjb2Rle2NvZGV9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAuY29kZSBAdmFye1sxNnwzMl19Ci1UaGlzIGRpcmVjdGl2ZSBzZWxlY3RzIHRoZSBpbnN0cnVjdGlvbiBzZXQgYmVpbmcgZ2VuZXJhdGVkLiBUaGUgdmFsdWUgMTYKLXNlbGVjdHMgVGh1bWIsIHdpdGggdGhlIHZhbHVlIDMyIHNlbGVjdGluZyBBUk0uCi0KLUBjaW5kZXggQGNvZGV7dGh1bWJ9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAudGh1bWIKLVRoaXMgcGVyZm9ybXMgdGhlIHNhbWUgYWN0aW9uIGFzIEB2YXJ7LmNvZGUgMTZ9LgotCi1AY2luZGV4IEBjb2Rle2FybX0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5hcm0KLVRoaXMgcGVyZm9ybXMgdGhlIHNhbWUgYWN0aW9uIGFzIEB2YXJ7LmNvZGUgMzJ9LgotCi1AY2luZGV4IEBjb2Rle2ZvcmNlX3RodW1ifSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLmZvcmNlX3RodW1iCi1UaGlzIGRpcmVjdGl2ZSBmb3JjZXMgdGhlIHNlbGVjdGlvbiBvZiBUaHVtYiBpbnN0cnVjdGlvbnMsIGV2ZW4gaWYgdGhlCi10YXJnZXQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhvc2UgaW5zdHJ1Y3Rpb25zCi0KLUBjaW5kZXggQGNvZGV7dGh1bWJfZnVuY30gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC50aHVtYl9mdW5jCi1UaGlzIGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhhdCB0aGUgZm9sbG93aW5nIHN5bWJvbCBpcyB0aGUgbmFtZSBvZiBhCi1UaHVtYiBlbmNvZGVkIGZ1bmN0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gYWxsb3cKLXRoZSBhc3NlbWJsZXIgYW5kIGxpbmtlciB0byBnZW5lcmF0ZSBjb3JyZWN0IGNvZGUgZm9yIGludGVyd29ya2luZwotYmV0d2VlbiBBcm0gYW5kIFRodW1iIGluc3RydWN0aW9ucyBhbmQgc2hvdWxkIGJlIHVzZWQgZXZlbiBpZgotaW50ZXJ3b3JraW5nIGlzIG5vdCBnb2luZyB0byBiZSBwZXJmb3JtZWQuCi0KLUBjaW5kZXggQGNvZGV7Lmx0b3JnfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLmx0b3JnCi1UaGlzIGRpcmVjdGl2ZSBjYXVzZXMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGxpdGVyYWwgcG9vbCB0byBiZQotZHVtcGVkIGludG8gdGhlIGN1cnJlbnQgc2VjdGlvbiAod2hpY2ggaXMgYXNzdW1lZCB0byBiZSB0aGUgLnRleHQKLXNlY3Rpb24pIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIChhbGlnbmVkIHRvIGEgd29yZCBib3VuZGFyeSkuCi0KLUBjaW5kZXggQGNvZGV7LnBvb2x9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAucG9vbAotVGhpcyBpcyBhIHN5bm9ueW0gZm9yIC5sdG9yZy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBBUk0gT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IEFSTSBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMgZm9yIEFSTQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEFSTSBvcGNvZGVzLiAgSXQgYWxzbwotaW1wbGVtZW50cyBzZXZlcmFsIHBzZXVkbyBvcGNvZGVzLCBpbmNsdWRpbmcgc2V2ZXJhbCBzeW50aGV0aWMgbG9hZAotaW5zdHJ1Y3Rpb25zLiAKLQotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQGNvZGV7Tk9QfSBwc2V1ZG8gb3AsIEFSTQotQGl0ZW0gTk9QCi1Ac21hbGxleGFtcGxlCi0gIG5vcAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyBwc2V1ZG8gb3Agd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gYSBsZWdhbCBBUk0gaW5zdHJ1Y3Rpb24gdGhhdCBkb2VzCi1ub3RoaW5nLiAgQ3VycmVudGx5IGl0IHdpbGwgZXZhbHVhdGUgdG8gTU9WIHIwLCByMC4KLQotQGNpbmRleCBAY29kZXtMRFIgcmVnLD08bGFiZWw+fSBwc2V1ZG8gb3AsIEFSTQotQGl0ZW0gTERSIAotQHNtYWxsZXhhbXBsZQotICBsZHIgPHJlZ2lzdGVyPiAsID0gPGV4cHJlc3Npb24+Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIG51bWVyaWMgY29uc3RhbnQgdGhlbiBhIE1PViBvciBNVk4KLWluc3RydWN0aW9uIHdpbGwgYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgTERSIGluc3RydWN0aW9uLCBpZiB0aGUKLWNvbnN0YW50IGNhbiBiZSBnZW5lcmF0ZWQgYnkgZWl0aGVyIG9mIHRoZXNlIGluc3RydWN0aW9ucy4gIE90aGVyd2lzZQotdGhlIGNvbnN0YW50IHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIG5lYXJlc3QgbGl0ZXJhbCBwb29sIChpZiBpdCBub3QKLWFscmVhZHkgdGhlcmUpIGFuZCBhIFBDIHJlbGF0aXZlIExEUiBpbnN0cnVjdGlvbiB3aWxsIGJlIGdlbmVyYXRlZC4KLQotQGNpbmRleCBAY29kZXtBRFIgcmVnLDxsYWJlbD59IHBzZXVkbyBvcCwgQVJNCi1AaXRlbSBBRFIKLUBzbWFsbGV4YW1wbGUKLSAgYWRyIDxyZWdpc3Rlcj4gPGxhYmVsPgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyBpbnN0cnVjdGlvbiB3aWxsIGxvYWQgdGhlIGFkZHJlc3Mgb2YgQHZhcntsYWJlbH0gaW50byB0aGUgaW5kaWNhdGVkCi1yZWdpc3Rlci4gIFRoZSBpbnN0cnVjdGlvbiB3aWxsIGV2YWx1YXRlIHRvIGEgUEMgcmVsYXRpdmUgQUREIG9yIFNVQgotaW5zdHJ1Y3Rpb24gZGVwZW5kaW5nIHVwb24gd2hlcmUgdGhlIGxhYmVsIGlzIGxvY2F0ZWQuICBJZiB0aGUgbGFiZWwgaXMKLW91dCBvZiByYW5nZSwgb3IgaWYgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZSAoYW5kIHNlY3Rpb24pIGFzCi10aGUgQURSIGluc3RydWN0aW9uLCB0aGVuIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLiAgVGhpcyBpbnN0cnVjdGlvbgotd2lsbCBub3QgbWFrZSB1c2Ugb2YgdGhlIGxpdGVyYWwgcG9vbC4KLQotQGNpbmRleCBAY29kZXtBRFJMIHJlZyw8bGFiZWw+fSBwc2V1ZG8gb3AsIEFSTQotQGl0ZW0gQURSTCAKLUBzbWFsbGV4YW1wbGUKLSAgYWRybCA8cmVnaXN0ZXI+IDxsYWJlbD4KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCBsb2FkIHRoZSBhZGRyZXNzIG9mIEB2YXJ7bGFiZWx9IGludG8gdGhlIGluZGljYXRlZAotcmVnaXN0ZXIuICBUaGUgaW5zdHJ1Y3Rpb24gd2lsbCBldmFsdWF0ZSB0byBvbmUgb3IgdHdvIGEgUEMgcmVsYXRpdmUgQURECi1vciBTVUIgaW5zdHJ1Y3Rpb25zIGRlcGVuZGluZyB1cG9uIHdoZXJlIHRoZSBsYWJlbCBpcyBsb2NhdGVkLiAgSWYgYQotc2Vjb25kIGluc3RydWN0aW9uIGlzIG5vdCBuZWVkZWQgYSBOT1AgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQgaW4KLWl0cyBwbGFjZSwgc28gdGhhdCB0aGlzIGluc3RydWN0aW9uIGlzIGFsd2F5cyA4IGJ5dGVzIGxvbmcuCi0KLUlmIHRoZSBsYWJlbCBpcyBvdXQgb2YgcmFuZ2UsIG9yIGlmIGl0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUKLShhbmQgc2VjdGlvbikgYXMgdGhlIEFEUkwgaW5zdHJ1Y3Rpb24sIHRoZW4gYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuCi1UaGlzIGluc3RydWN0aW9uIHdpbGwgbm90IG1ha2UgdXNlIG9mIHRoZSBsaXRlcmFsIHBvb2wuCi0KLUBlbmQgdGFibGUKLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBBUk0gb3IgVGh1bWIgaW5zdHJ1Y3Rpb24gc2V0cywgc2VlIEBjaXRle0FSTQotU29mdHdhcmUgRGV2ZWxvcG1lbnQgVG9vbGtpdCBSZWZlcmVuY2UgTWFudWFsfSwgQWR2YW5jZWQgUklTQyBNYWNoaW5lcwotTHRkLgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtZDEwdi50ZXhpIGIvZ2FzL2RvYy9jLWQxMHYudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3YmY4OC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtZDEwdi50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBEMTBWLURlcGVuZGVudAotQGNoYXB0ZXIgRDEwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBEMTBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggRDEwViBzdXBwb3J0Ci1AbWVudQotKiBEMTBWLU9wdHM6OiAgICAgICAgICAgICAgICAgICBEMTBWIE9wdGlvbnMKLSogRDEwVi1TeW50YXg6OiAgICAgICAgICAgICAgICAgU3ludGF4Ci0qIEQxMFYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEQxMFYtT3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBEMTBWLU9wdHMKLUBzZWN0aW9uIEQxMFYgT3B0aW9ucwotQGNpbmRleCBvcHRpb25zLCBEMTBWCi1AY2luZGV4IEQxMFYgb3B0aW9ucwotVGhlIE1pdHN1YmlzaGkgRDEwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhIGZldyBtYWNoaW5lCi1kZXBlbmRlbnQgb3B0aW9ucy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAtTwotVGhlIEQxMFYgY2FuIG9mdGVuIGV4ZWN1dGUgdHdvIHN1Yi1pbnN0cnVjdGlvbnMgaW4gcGFyYWxsZWwuIFdoZW4gdGhpcyBvcHRpb24KLWlzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXR0ZW1wdCB0byBvcHRpbWl6ZSBpdHMgb3V0cHV0IGJ5IGRldGVjdGluZyB3aGVuCi1pbnN0cnVjdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgotQGl0ZW0gLS1ub3dhcm5zd2FwCi1UbyBvcHRpbWl6ZSBleGVjdXRpb24gcGVyZm9ybWFuY2UsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgc29tZXRpbWVzIHN3YXAgdGhlCi1vcmRlciBvZiBpbnN0cnVjdGlvbnMuIE5vcm1hbGx5IHRoaXMgZ2VuZXJhdGVzIGEgd2FybmluZy4gV2hlbiB0aGlzIG9wdGlvbiAKLWlzIHVzZWQsIG5vIHdhcm5pbmcgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBpbnN0cnVjdGlvbnMgYXJlIHN3YXBwZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQxMFYtU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBjaW5kZXggRDEwViBzeW50YXgKLUBjaW5kZXggc3ludGF4LCBEMTBWCi0KLVRoZSBEMTBWIHN5bnRheCBpcyBiYXNlZCBvbiB0aGUgc3ludGF4IGluIE1pdHN1YmlzaGkncyBEMTBWIGFyY2hpdGVjdHVyZSBtYW51YWwuCi1UaGUgZGlmZmVyZW5jZXMgYXJlIGRldGFpbGVkIGJlbG93LgotCi1AbWVudQotKiBEMTBWLVNpemU6OiAgICAgICAgICAgICAgICAgU2l6ZSBNb2RpZmllcnMKLSogRDEwVi1TdWJzOjogICAgICAgICAgICAgICAgIFN1Yi1JbnN0cnVjdGlvbnMKLSogRDEwVi1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBEMTBWLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogRDEwVi1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLSogRDEwVi1Xb3JkOjogICAgICAgICAgICAgICAgIEBAV09SRCBNb2RpZmllcgotQGVuZCBtZW51Ci0KLQotQG5vZGUgRDEwVi1TaXplCi1Ac3Vic2VjdGlvbiBTaXplIE1vZGlmaWVycwotQGNpbmRleCBEMTBWIHNpemUgbW9kaWZpZXJzCi1AY2luZGV4IHNpemUgbW9kaWZpZXJzLCBEMTBWCi1UaGUgRDEwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgdGhlIGluc3RydWN0aW9uIG5hbWVzIGluIHRoZSBEMTBWCi1BcmNoaXRlY3R1cmUgTWFudWFsLiAgSG93ZXZlciwgdGhlIG5hbWVzIGluIHRoZSBtYW51YWwgYXJlIHNvbWV0aW1lcyBhbWJpZ3VvdXMuCi1UaGVyZSBhcmUgaW5zdHJ1Y3Rpb24gbmFtZXMgdGhhdCBjYW4gYXNzZW1ibGUgdG8gYSBzaG9ydCBvciBsb25nIGZvcm0gb3Bjb2RlLgotSG93IGRvZXMgdGhlIGFzc2VtYmxlciBwaWNrIHRoZSBjb3JyZWN0IGZvcm0/ICBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGFsd2F5cyBwaWNrIHRoZQotc21hbGxlc3QgZm9ybSBpZiBpdCBjYW4uICBXaGVuIGRlYWxpbmcgd2l0aCBhIHN5bWJvbCB0aGF0IGlzIG5vdCBkZWZpbmVkIHlldCB3aGVuIGEKLWxpbmUgaXMgYmVpbmcgYXNzZW1ibGVkLCBpdCB3aWxsIGFsd2F5cyB1c2UgdGhlIGxvbmcgZm9ybS4gIElmIHlvdSBuZWVkIHRvIGZvcmNlIHRoZSAKLWFzc2VtYmxlciB0byB1c2UgZWl0aGVyIHRoZSBzaG9ydCBvciBsb25nIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uLCB5b3UgY2FuIGFwcGVuZAotZWl0aGVyIEBzYW1wey5zfSAoc2hvcnQpIG9yIEBzYW1wey5sfSAobG9uZykgdG8gaXQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB3cml0aW5nIAotYW4gYXNzZW1ibHkgcHJvZ3JhbSBhbmQgeW91IHdhbnQgdG8gZG8gYSBicmFuY2ggdG8gYSBzeW1ib2wgdGhhdCBpcyBkZWZpbmVkIGxhdGVyCi1pbiB5b3VyIHByb2dyYW0sIHlvdSBjYW4gd3JpdGUgQHNhbXB7YnJhLnMgICBmb299LiAgCi1PYmpkdW1wIGFuZCBHREIgd2lsbCBhbHdheXMgYXBwZW5kIEBzYW1wey5zfSBvciBAc2FtcHsubH0gdG8gaW5zdHJ1Y3Rpb25zIHdoaWNoCi1oYXZlIGJvdGggc2hvcnQgYW5kIGxvbmcgZm9ybXMuCi0KLUBub2RlIEQxMFYtU3VicwotQHN1YnNlY3Rpb24gU3ViLUluc3RydWN0aW9ucwotQGNpbmRleCBEMTBWIHN1Yi1pbnN0cnVjdGlvbnMKLUBjaW5kZXggc3ViLWluc3RydWN0aW9ucywgRDEwVgotVGhlIEQxMFYgYXNzZW1ibGVyIHRha2VzIGFzIGlucHV0IGEgc2VyaWVzIG9mIGluc3RydWN0aW9ucywgZWl0aGVyIG9uZS1wZXItbGluZSwKLW9yIGluIHRoZSBzcGVjaWFsIHR3by1wZXItbGluZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICBTb21lIG9mIHRoZXNlCi1pbnN0cnVjdGlvbnMgd2lsbCBiZSBzaG9ydC1mb3JtIG9yIHN1Yi1pbnN0cnVjdGlvbnMuICBUaGVzZSBzdWItaW5zdHJ1Y3Rpb25zIGNhbiBiZSBwYWNrZWQKLWludG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyIHdpbGwgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiAgSXQgd2lsbCBhbHNvIGRldGVjdAotd2hlbiBpdCBzaG91bGQgbm90IHBhY2sgaW5zdHJ1Y3Rpb25zLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSBsYWJlbCBpcyBkZWZpbmVkLCB0aGUgbmV4dAotaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBwYWNrYWdlZCB3aXRoIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuZXZlciBhIGJyYW5jaCBhbmQgbGluawotaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkLCBpdCB3aWxsIG5vdCBiZSBwYWNrYWdlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uIHNvIHRoZSByZXR1cm4KLWFkZHJlc3Mgd2lsbCBiZSB2YWxpZC4gIE5vcHMgYXJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgd2hlbiBuZWNlc3NhcnkuCi0KLUlmIHlvdSBkbyBub3Qgd2FudCB0aGUgYXNzZW1ibGVyIGF1dG9tYXRpY2FsbHkgbWFraW5nIHRoZXNlIGRlY2lzaW9ucywgeW91IGNhbiBjb250cm9sCi10aGUgcGFja2FnaW5nIGFuZCBleGVjdXRpb24gdHlwZSAocGFyYWxsZWwgb3Igc2VxdWVudGlhbCkgd2l0aCB0aGUgc3BlY2lhbCBleGVjdXRpb24gCi1zeW1ib2xzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgCi0KLUBub2RlIEQxMFYtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBEMTBWCi1AY2luZGV4IEQxMFYgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gYW5kIEBzYW1weyN9IGFyZSB0aGUgbGluZSBjb21tZW50IGNoYXJhY3RlcnMuCi1AY2luZGV4IHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZywgRDEwVgotQGNpbmRleCBEMTBWIHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZwotU3ViLWluc3RydWN0aW9ucyBtYXkgYmUgZXhlY3V0ZWQgaW4gb3JkZXIsIGluIHJldmVyc2Utb3JkZXIsIG9yIGluIHBhcmFsbGVsLgotSW5zdHJ1Y3Rpb25zIGxpc3RlZCBpbiB0aGUgc3RhbmRhcmQgb25lLXBlci1saW5lIGZvcm1hdCB3aWxsIGJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseS4KLVRvIHNwZWNpZnkgdGhlIGV4ZWN1dGluZyBvcmRlciwgdXNlIHRoZSBmb2xsb3dpbmcgc3ltYm9sczogCi1AdGFibGUgQHNhbXAKLUBpdGVtIC0+Ci1TZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIGxlZnQgZmlyc3QuCi1AaXRlbSA8LQotU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBmaXJzdC4KLUBpdGVtIHx8Ci1QYXJhbGxlbAotQGVuZCB0YWJsZQotVGhlIEQxMFYgc3ludGF4IGFsbG93cyBlaXRoZXIgb25lIGluc3RydWN0aW9uIHBlciBsaW5lLCBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUgd2l0aAotdGhlIGV4ZWN1dGlvbiBzeW1ib2wsIG9yIHR3byBpbnN0cnVjdGlvbnMgcGVyIGxpbmUuICBGb3IgZXhhbXBsZQotQHRhYmxlIEBjb2RlCi1AaXRlbSBhYnMgICAgICAgYTEgICAgICAtPiAgICAgIGFicyAgICAgcjAKLUV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKLWNvbnRhaW5lciBhbmQgaXMgZXhlY3V0ZWQgc2Vjb25kLgotQGl0ZW0gYWJzICAgICAgIHIwICAgICAgPC0gICAgICBhYnMgICAgIGExCi1FeGVjdXRlIHRoZXNlIHJldmVyc2Utc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKLWNvbnRhaW5lciwgYW5kIGlzIGV4ZWN1dGVkIGZpcnN0LgotQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIHx8ICAgICAgbWFjICAgICBhMCxyMCxyNwotRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KLUBpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICB8fCAgICAgIAotQGl0ZW14IG1hYyAgICAgYTAscjAscjcKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KLUBpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICAKLUBpdGVteCBtYWMgICAgIGEwLHIwLHI3Ci1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgQXNzZW1ibGVyIHdpbGwKLXB1dCB0aGVtIGluIHRoZSBwcm9wZXIgY29udGFpbmVycy4KLUBpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICAtPgotQGl0ZW14IG1hYyAgICAgYTAscjAscjcKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBTYW1lIGFzIGFib3ZlIGJ1dAotc2Vjb25kIGluc3RydWN0aW9uIHdpbGwgYWx3YXlzIGdvIGludG8gcmlnaHQgY29udGFpbmVyLiAgCi1AZW5kIHRhYmxlCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIEQxMFYtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLUBjaW5kZXggRDEwViByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBEMTBWCi1Zb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSB0aHJvdWdoIEBzYW1we3IxNX0gdG8gcmVmZXIgdG8gdGhlIEQxMFYgCi1yZWdpc3RlcnMuICBZb3UgY2FuIGFsc28gdXNlIEBzYW1we3NwfSBhcyBhbiBhbGlhcyBmb3IgQHNhbXB7cjE1fS4gIFRoZSBhY2N1bXVsYXRvcnMKLWFyZSBAc2FtcHthMH0gYW5kIEBzYW1we2ExfS4gIFRoZXJlIGFyZSBzcGVjaWFsIHJlZ2lzdGVyLXBhaXIgbmFtZXMgdGhhdCBtYXkgCi1vcHRpb25hbGx5IGJlIHVzZWQgaW4gb3Bjb2RlcyB0aGF0IHJlcXVpcmUgZXZlbi1udW1iZXJlZCByZWdpc3RlcnMuIFJlZ2lzdGVyIG5hbWVzIGFyZSAKLW5vdCBjYXNlIHNlbnNpdGl2ZS4gIAotCi1SZWdpc3RlciBQYWlycwotQHRhYmxlIEBjb2RlCi1AaXRlbSByMC1yMQotQGl0ZW0gcjItcjMKLUBpdGVtIHI0LXI1Ci1AaXRlbSByNi1yNwotQGl0ZW0gcjgtcjkKLUBpdGVtIHIxMC1yMTEKLUBpdGVtIHIxMi1yMTMKLUBpdGVtIHIxNC1yMTUKLUBlbmQgdGFibGUKLQotVGhlIEQxMFYgYWxzbyBoYXMgcHJlZGVmaW5lZCBzeW1ib2xzIGZvciB0aGVzZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgc3RhdHVzIGJpdHM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIHBzdwotUHJvY2Vzc29yIFN0YXR1cyBXb3JkCi1AaXRlbSBicHN3Ci1CYWNrdXAgUHJvY2Vzc29yIFN0YXR1cyBXb3JkCi1AaXRlbSBwYwotUHJvZ3JhbSBDb3VudGVyCi1AaXRlbSBicGMKLUJhY2t1cCBQcm9ncmFtIENvdW50ZXIKLUBpdGVtIHJwdF9jCi1SZXBlYXQgQ291bnQKLUBpdGVtIHJwdF9zCi1SZXBlYXQgU3RhcnQgYWRkcmVzcwotQGl0ZW0gcnB0X2UKLVJlcGVhdCBFbmQgYWRkcmVzcwotQGl0ZW0gbW9kX3MKLU1vZHVsbyBTdGFydCBhZGRyZXNzCi1AaXRlbSBtb2RfZQotTW9kdWxvIEVuZCBhZGRyZXNzCi1AaXRlbSBpYmEKLUluc3RydWN0aW9uIEJyZWFrIEFkZHJlc3MKLUBpdGVtIGYwCi1GbGFnIDAKLUBpdGVtIGYxCi1GbGFnIDEKLUBpdGVtIGMKLUNhcnJ5IGZsYWcKLUBlbmQgdGFibGUKLSAgICAgICAgCi1Abm9kZSBEMTBWLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgRDEwVgotQGNpbmRleCBEMTBWIGFkZHJlc3NpbmcgbW9kZXMKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEQxMFYuCi1AY29kZXtSQHZhcntufX0gaW4gdGhlIGZvbGxvd2luZyByZWZlcnMgdG8gYW55IG9mIHRoZSBudW1iZXJlZAotcmVnaXN0ZXJzLCBidXQgQGVtcGh7bm90fSB0aGUgY29udHJvbCByZWdpc3RlcnMuCi1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLUBpdGVtIEBAUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotQGl0ZW0gQEBSQHZhcntufS0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1kZWNyZW1lbnQKLUBpdGVtIEBALVNQCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLUBpdGVtIEBAKEB2YXJ7ZGlzcH0sIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLUBpdGVtIEB2YXJ7YWRkcn0KLVBDIHJlbGF0aXZlIGFkZHJlc3MgKGZvciBicmFuY2ggb3IgcmVwKS4gCi1AaXRlbSAjQHZhcntpbW19Ci1JbW1lZGlhdGUgZGF0YSAodGhlIEBzYW1weyN9IGlzIG9wdGlvbmFsIGFuZCBpZ25vcmVkKQotQGVuZCB0YWJsZQotCi1Abm9kZSBEMTBWLVdvcmQKLUBzdWJzZWN0aW9uIEBAV09SRCBNb2RpZmllcgotQGNpbmRleCBEMTBWIEBAd29yZCBtb2RpZmllcgotQGNpbmRleCBAQHdvcmQgbW9kaWZpZXIsIEQxMFYKLUFueSBzeW1ib2wgZm9sbG93ZWQgYnkgQGNvZGV7QEB3b3JkfSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBzeW1ib2wncyB2YWx1ZQotc2hpZnRlZCByaWdodCBieSAyLiAgVGhpcyBpcyB1c2VkIGluIHNpdHVhdGlvbnMgc3VjaCBhcyBsb2FkaW5nIGEgcmVnaXN0ZXIKLXdpdGggdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiAob3IgYW55IG90aGVyIGNvZGUgZnJhZ21lbnQpLiAgRm9yIGV4YW1wbGUsIGlmCi15b3Ugd2FudCB0byBsb2FkIGEgcmVnaXN0ZXIgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIGZ1bmN0aW9uIEBjb2Rle21haW59IHRoZW4KLWp1bXAgdG8gdGhhdCBmdW5jdGlvbiwgeW91IGNvdWxkIGRvIGl0IGFzIGZvbGx3czoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotbGRpICAgICByMiwgbWFpbkBAd29yZAotam1wICAgICByMgotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgRDEwVi1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEQxMFYKLUBjaW5kZXggRDEwViBmbG9hdGluZyBwb2ludAotVGhlIEQxMFYgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0gYW5kIEBjb2Rley5kb3VibGV9Ci1kaXJlY3RpdmVzIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4gCi0KLUBub2RlIEQxMFYtT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotQGNpbmRleCBEMTBWIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBEMTBWCi1AY2luZGV4IG1uZW1vbmljcywgRDEwVgotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBEMTBWCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEQxMFYgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7RDEwViBBcmNoaXRlY3R1cmU6IEEgVkxJVyBNaWNyb3Byb2Nlc3NvciBmb3IgTXVsdGltZWRpYSBBcHBsaWNhdGlvbnN9IAotKE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4pLgotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEQxMFYgb3Bjb2Rlcy4gIFRoZSBvbmx5IGNoYW5nZXMgYXJlIHRob3NlCi1kZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gb24gc2l6ZSBtb2RpZmllcnMKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWQzMHYudGV4aSBiL2dhcy9kb2MvYy1kMzB2LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMWIzNDQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWQzMHYudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgRDMwVi1EZXBlbmRlbnQKLUBjaGFwdGVyIEQzMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgRDMwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEQzMFYgc3VwcG9ydAotQG1lbnUKLSogRDMwVi1PcHRzOjogICAgICAgICAgICAgICAgICAgRDMwViBPcHRpb25zCi0qIEQzMFYtU3ludGF4OjogICAgICAgICAgICAgICAgIFN5bnRheAotKiBEMzBWLUZsb2F0OjogICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBEMzBWLU9wY29kZXM6OiAgICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgRDMwVi1PcHRzCi1Ac2VjdGlvbiBEMzBWIE9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgRDMwVgotQGNpbmRleCBEMzBWIG9wdGlvbnMKLVRoZSBNaXRzdWJpc2hpIEQzMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQotZGVwZW5kZW50IG9wdGlvbnMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gLU8KLVRoZSBEMzBWIGNhbiBvZnRlbiBleGVjdXRlIHR3byBzdWItaW5zdHJ1Y3Rpb25zIGluIHBhcmFsbGVsLiBXaGVuIHRoaXMgb3B0aW9uCi1pcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGF0dGVtcHQgdG8gb3B0aW1pemUgaXRzIG91dHB1dCBieSBkZXRlY3Rpbmcgd2hlbgotaW5zdHJ1Y3Rpb25zIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gLW4KLVdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBpc3N1ZSBhIHdhcm5pbmcgZXZlcnkKLXRpbWUgaXQgYWRkcyBhIG5vcCBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gLU4KLVdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQKLW5lZWRzIHRvIGluc2VydCBhIG5vcCBhZnRlciBhIDMyLWJpdCBtdWx0aXBseSBiZWZvcmUgYSBsb2FkIG9yIDE2LWJpdAotbXVsdGlwbHkgaW5zdHJ1Y3Rpb24uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQzMFYtU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBjaW5kZXggRDMwViBzeW50YXgKLUBjaW5kZXggc3ludGF4LCBEMzBWCi0KLVRoZSBEMzBWIHN5bnRheCBpcyBiYXNlZCBvbiB0aGUgc3ludGF4IGluIE1pdHN1YmlzaGkncyBEMzBWIGFyY2hpdGVjdHVyZSBtYW51YWwuCi1UaGUgZGlmZmVyZW5jZXMgYXJlIGRldGFpbGVkIGJlbG93LgotCi1AbWVudQotKiBEMzBWLVNpemU6OiAgICAgICAgICAgICAgICAgU2l6ZSBNb2RpZmllcnMKLSogRDMwVi1TdWJzOjogICAgICAgICAgICAgICAgIFN1Yi1JbnN0cnVjdGlvbnMKLSogRDMwVi1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBEMzBWLUd1YXJkZWQ6OiAgICAgICAgICAgICAgR3VhcmRlZCBFeGVjdXRpb24KLSogRDMwVi1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIEQzMFYtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotCi1Abm9kZSBEMzBWLVNpemUKLUBzdWJzZWN0aW9uIFNpemUgTW9kaWZpZXJzCi1AY2luZGV4IEQzMFYgc2l6ZSBtb2RpZmllcnMKLUBjaW5kZXggc2l6ZSBtb2RpZmllcnMsIEQzMFYKLVRoZSBEMzBWIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaW4gdGhlIEQzMFYKLUFyY2hpdGVjdHVyZSBNYW51YWwuICBIb3dldmVyLCB0aGUgbmFtZXMgaW4gdGhlIG1hbnVhbCBhcmUgc29tZXRpbWVzIGFtYmlndW91cy4KLVRoZXJlIGFyZSBpbnN0cnVjdGlvbiBuYW1lcyB0aGF0IGNhbiBhc3NlbWJsZSB0byBhIHNob3J0IG9yIGxvbmcgZm9ybSBvcGNvZGUuCi1Ib3cgZG9lcyB0aGUgYXNzZW1ibGVyIHBpY2sgdGhlIGNvcnJlY3QgZm9ybT8gIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYWx3YXlzIHBpY2sgdGhlCi1zbWFsbGVzdCBmb3JtIGlmIGl0IGNhbi4gIFdoZW4gZGVhbGluZyB3aXRoIGEgc3ltYm9sIHRoYXQgaXMgbm90IGRlZmluZWQgeWV0IHdoZW4gYQotbGluZSBpcyBiZWluZyBhc3NlbWJsZWQsIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgbG9uZyBmb3JtLiAgSWYgeW91IG5lZWQgdG8gZm9yY2UgdGhlIAotYXNzZW1ibGVyIHRvIHVzZSBlaXRoZXIgdGhlIHNob3J0IG9yIGxvbmcgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHlvdSBjYW4gYXBwZW5kCi1laXRoZXIgQHNhbXB7LnN9IChzaG9ydCkgb3IgQHNhbXB7Lmx9IChsb25nKSB0byBpdC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHdyaXRpbmcgCi1hbiBhc3NlbWJseSBwcm9ncmFtIGFuZCB5b3Ugd2FudCB0byBkbyBhIGJyYW5jaCB0byBhIHN5bWJvbCB0aGF0IGlzIGRlZmluZWQgbGF0ZXIKLWluIHlvdXIgcHJvZ3JhbSwgeW91IGNhbiB3cml0ZSBAc2FtcHticmEucyBmb299LiAKLU9iamR1bXAgYW5kIEdEQiB3aWxsIGFsd2F5cyBhcHBlbmQgQHNhbXB7LnN9IG9yIEBzYW1wey5sfSB0byBpbnN0cnVjdGlvbnMgd2hpY2gKLWhhdmUgYm90aCBzaG9ydCBhbmQgbG9uZyBmb3Jtcy4KLQotQG5vZGUgRDMwVi1TdWJzCi1Ac3Vic2VjdGlvbiBTdWItSW5zdHJ1Y3Rpb25zCi1AY2luZGV4IEQzMFYgc3ViLWluc3RydWN0aW9ucwotQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb25zLCBEMzBWCi1UaGUgRDMwViBhc3NlbWJsZXIgdGFrZXMgYXMgaW5wdXQgYSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zLCBlaXRoZXIgb25lLXBlci1saW5lLAotb3IgaW4gdGhlIHNwZWNpYWwgdHdvLXBlci1saW5lIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIFNvbWUgb2YgdGhlc2UKLWluc3RydWN0aW9ucyB3aWxsIGJlIHNob3J0LWZvcm0gb3Igc3ViLWluc3RydWN0aW9ucy4gIFRoZXNlIHN1Yi1pbnN0cnVjdGlvbnMgY2FuIGJlIHBhY2tlZAotaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFRoZSBhc3NlbWJsZXIgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuICBJdCB3aWxsIGFsc28gZGV0ZWN0Ci13aGVuIGl0IHNob3VsZCBub3QgcGFjayBpbnN0cnVjdGlvbnMuICBGb3IgZXhhbXBsZSwgd2hlbiBhIGxhYmVsIGlzIGRlZmluZWQsIHRoZSBuZXh0Ci1pbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIHBhY2thZ2VkIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gIFdoZW5ldmVyIGEgYnJhbmNoIGFuZCBsaW5rCi1pbnN0cnVjdGlvbiBpcyBjYWxsZWQsIGl0IHdpbGwgbm90IGJlIHBhY2thZ2VkIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24gc28gdGhlIHJldHVybgotYWRkcmVzcyB3aWxsIGJlIHZhbGlkLiAgTm9wcyBhcmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCB3aGVuIG5lY2Vzc2FyeS4KLQotSWYgeW91IGRvIG5vdCB3YW50IHRoZSBhc3NlbWJsZXIgYXV0b21hdGljYWxseSBtYWtpbmcgdGhlc2UgZGVjaXNpb25zLCB5b3UgY2FuIGNvbnRyb2wKLXRoZSBwYWNrYWdpbmcgYW5kIGV4ZWN1dGlvbiB0eXBlIChwYXJhbGxlbCBvciBzZXF1ZW50aWFsKSB3aXRoIHRoZSBzcGVjaWFsIGV4ZWN1dGlvbiAKLXN5bWJvbHMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICAKLQotQG5vZGUgRDMwVi1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEQzMFYKLUBjaW5kZXggRDMwViBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHs7fSBhbmQgQHNhbXB7I30gYXJlIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVycy4KLUBjaW5kZXggc3ViLWluc3RydWN0aW9uIG9yZGVyaW5nLCBEMzBWCi1AY2luZGV4IEQzMFYgc3ViLWluc3RydWN0aW9uIG9yZGVyaW5nCi1TdWItaW5zdHJ1Y3Rpb25zIG1heSBiZSBleGVjdXRlZCBpbiBvcmRlciwgaW4gcmV2ZXJzZS1vcmRlciwgb3IgaW4gcGFyYWxsZWwuCi1JbnN0cnVjdGlvbnMgbGlzdGVkIGluIHRoZSBzdGFuZGFyZCBvbmUtcGVyLWxpbmUgZm9ybWF0IHdpbGwgYmUgZXhlY3V0ZWQKLXNlcXVlbnRpYWxseSB1bmxlc3MgeW91IHVzZSB0aGUgQHNhbXB7LU99IG9wdGlvbi4KLQotVG8gc3BlY2lmeSB0aGUgZXhlY3V0aW5nIG9yZGVyLCB1c2UgdGhlIGZvbGxvd2luZyBzeW1ib2xzOiAKLUB0YWJsZSBAc2FtcAotQGl0ZW0gLT4KLVNlcXVlbnRpYWwgd2l0aCBpbnN0cnVjdGlvbiBvbiB0aGUgbGVmdCBmaXJzdC4KLQotQGl0ZW0gPC0KLVNlcXVlbnRpYWwgd2l0aCBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgZmlyc3QuCi0KLUBpdGVtIHx8Ci1QYXJhbGxlbAotQGVuZCB0YWJsZQotCi1UaGUgRDMwViBzeW50YXggYWxsb3dzIGVpdGhlciBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUsIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSB3aXRoCi10aGUgZXhlY3V0aW9uIHN5bWJvbCwgb3IgdHdvIGluc3RydWN0aW9ucyBwZXIgbGluZS4gIEZvciBleGFtcGxlCi1AdGFibGUgQGNvZGUKLUBpdGVtIGFicyByMixyMyAtPiBhYnMgcjQscjUKLUV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKLWNvbnRhaW5lciBhbmQgaXMgZXhlY3V0ZWQgc2Vjb25kLgotCi1AaXRlbSBhYnMgcjIscjMgPC0gYWJzIHI0LHI1Ci1FeGVjdXRlIHRoZXNlIHJldmVyc2Utc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKLWNvbnRhaW5lciwgYW5kIGlzIGV4ZWN1dGVkIGZpcnN0LgotCi1AaXRlbSBhYnMgcjIscjMgfHwgYWJzIHI0LHI1Ci1FeGVjdXRlIHRoZXNlIGluIHBhcmFsbGVsLgotCi1AaXRlbSBsZHcgcjIsQEAocjMscjQpIHx8Ci1AaXRlbXggbXVseCByNixyOCxyOQotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIGluIHBhcmFsbGVsLgotCi1AaXRlbSBtdWx4IGEwLHI4LHI5Ci1AaXRlbXggc3R3IHIyLEBAKHIzLHI0KQotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseSB1bmxlc3MgQHNhbXB7LU99IG9wdGlvbiBpcwotdXNlZC4gIElmIHRoZSBAc2FtcHstT30gb3B0aW9uIGlzIHVzZWQsIHRoZSBhc3NlbWJsZXIgd2lsbCBkZXRlcm1pbmUgaWYKLXRoZSBpbnN0cnVjdGlvbnMgY291bGQgYmUgZG9uZSBpbiBwYXJhbGxlbCAodGhlIGFib3ZlIHR3byBpbnN0cnVjdGlvbnMKLWNhbiBiZSBkb25lIGluIHBhcmFsbGVsKSwgYW5kIGlmIHNvLCBlbWl0IHRoZW0gYXMgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLgotVGhlIGFzc2VtYmxlciB3aWxsIHB1dCB0aGVtIGluIHRoZSBwcm9wZXIgY29udGFpbmVycy4gIEluIHRoZSBhYm92ZQotZXhhbXBsZSwgdGhlIGFzc2VtYmxlciB3aWxsIHB1dCB0aGUgQHNhbXB7c3R3fSBpbnN0cnVjdGlvbiBpbiBsZWZ0Ci1jb250YWluZXIgYW5kIHRoZSBAc2FtcHttdWx4fSBpbnN0cnVjdGlvbiBpbiB0aGUgcmlnaHQgY29udGFpbmVyLgotCi1AaXRlbSBzdHcgcjIsQEAocjMscjQpIC0+Ci1AaXRlbXggbXVseCBhMCxyOCxyOQotVHdvLWxpbmUgZm9ybWF0LiAgRXhlY3V0ZSB0aGUgQHNhbXB7c3R3fSBpbnN0cnVjdGlvbiBmb2xsb3dlZCBieSB0aGUKLUBzYW1we211bHh9IGluc3RydWN0aW9uIHNlcXVlbnRpYWxseS4gIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiBnb2VzIGluIHRoZQotbGVmdCBjb250YWluZXIgYW5kIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gZ29lcyBpbnRvIHJpZ2h0IGNvbnRhaW5lci4KLVRoZSBhc3NlbWJsZXIgd2lsbCBnaXZlIGFuIGVycm9yIGlmIHRoZSBtYWNoaW5lIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZQotdmlvbGF0ZWQuCi0KLUBpdGVtIHN0dyByMixAQChyMyxyNCkgPC0KLUBpdGVteCBtdWx4IGEwLHI4LHI5Ci1TYW1lIGFzIHByZXZpb3VzIGV4YW1wbGUsIGV4Y2VwdCB0aGF0IHRoZSBAc2FtcHttdWx4fSBpbnN0cnVjdGlvbiBpcwotZXhlY3V0ZWQgYmVmb3JlIHRoZSBAc2FtcHtzdHd9IGluc3RydWN0aW9uLgotQGVuZCB0YWJsZQotCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIEQzMFYtR3VhcmRlZAotQHN1YnNlY3Rpb24gR3VhcmRlZCBFeGVjdXRpb24KLUBjaW5kZXggRDMwViBHdWFyZGVkIEV4ZWN1dGlvbgotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlIGZ1bGwgcmFuZ2Ugb2YgZ3VhcmRlZCBleGVjdXRpb24KLWRpcmVjdGl2ZXMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uICBKdXN0IGFwcGVuZCB0aGUgZGlyZWN0aXZlIGFmdGVyIHRoZQotaW5zdHJ1Y3Rpb24gcHJvcGVyLiAgVGhlIGRpcmVjdGl2ZXMgYXJlOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC90eAotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMCBpcyB0cnVlLgotQGl0ZW0gL2Z4Ci1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYwIGlzIGZhbHNlLgotQGl0ZW0gL3h0Ci1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYxIGlzIHRydWUuCi1AaXRlbSAveGYKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjEgaXMgZmFsc2UuCi1AaXRlbSAvdHQKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGJvdGggZmxhZ3MgZjAgYW5kIGYxIGFyZSB0cnVlLgotQGl0ZW0gL3RmCi1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYwIGlzIHRydWUgYW5kIGZsYWcgZjEgaXMgZmFsc2UuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQzMFYtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLUBjaW5kZXggRDMwViByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBEMzBWCi1Zb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSB0aHJvdWdoIEBzYW1we3I2M30gdG8gcmVmZXIKLXRvIHRoZSBEMzBWIHJlZ2lzdGVycy4gIFlvdSBjYW4gYWxzbyB1c2UgQHNhbXB7c3B9IGFzIGFuIGFsaWFzIGZvcgotQHNhbXB7cjYzfSBhbmQgQHNhbXB7bGlua30gYXMgYW4gYWxpYXMgZm9yIEBzYW1we3I2Mn0uICBUaGUgYWNjdW11bGF0b3JzCi1hcmUgQHNhbXB7YTB9IGFuZCBAc2FtcHthMX0uCi0KLVRoZSBEMzBWIGFsc28gaGFzIHByZWRlZmluZWQgc3ltYm9scyBmb3IgdGhlc2UgY29udHJvbCByZWdpc3RlcnMgYW5kIHN0YXR1cyBiaXRzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBwc3cKLVByb2Nlc3NvciBTdGF0dXMgV29yZAotQGl0ZW0gYnBzdwotQmFja3VwIFByb2Nlc3NvciBTdGF0dXMgV29yZAotQGl0ZW0gcGMKLVByb2dyYW0gQ291bnRlcgotQGl0ZW0gYnBjCi1CYWNrdXAgUHJvZ3JhbSBDb3VudGVyCi1AaXRlbSBycHRfYwotUmVwZWF0IENvdW50Ci1AaXRlbSBycHRfcwotUmVwZWF0IFN0YXJ0IGFkZHJlc3MKLUBpdGVtIHJwdF9lCi1SZXBlYXQgRW5kIGFkZHJlc3MKLUBpdGVtIG1vZF9zCi1Nb2R1bG8gU3RhcnQgYWRkcmVzcwotQGl0ZW0gbW9kX2UKLU1vZHVsbyBFbmQgYWRkcmVzcwotQGl0ZW0gaWJhCi1JbnN0cnVjdGlvbiBCcmVhayBBZGRyZXNzCi1AaXRlbSBmMAotRmxhZyAwCi1AaXRlbSBmMQotRmxhZyAxCi1AaXRlbSBmMgotRmxhZyAyCi1AaXRlbSBmMwotRmxhZyAzCi1AaXRlbSBmNAotRmxhZyA0Ci1AaXRlbSBmNQotRmxhZyA1Ci1AaXRlbSBmNgotRmxhZyA2Ci1AaXRlbSBmNwotRmxhZyA3Ci1AaXRlbSBzCi1TYW1lIGFzIGZsYWcgNCAoc2F0dXJhdGlvbiBmbGFnKQotQGl0ZW0gdgotU2FtZSBhcyBmbGFnIDUgKG92ZXJmbG93IGZsYWcpCi1AaXRlbSB2YQotU2FtZSBhcyBmbGFnIDYgKHN0aWNreSBvdmVyZmxvdyBmbGFnKQotQGl0ZW0gYwotU2FtZSBhcyBmbGFnIDcgKGNhcnJ5L2JvcnJvdyBmbGFnKQotQGl0ZW0gYgotU2FtZSBhcyBmbGFnIDcgKGNhcnJ5L2JvcnJvdyBmbGFnKQotQGVuZCB0YWJsZQotICAgICAgICAKLUBub2RlIEQzMFYtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBEMzBWCi1AY2luZGV4IEQzMFYgYWRkcmVzc2luZyBtb2RlcwotQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgRDMwVi4KLUBjb2Rle1JAdmFye259fSBpbiB0aGUgZm9sbG93aW5nIHJlZmVycyB0byBhbnkgb2YgdGhlIG51bWJlcmVkCi1yZWdpc3RlcnMsIGJ1dCBAZW1waHtub3R9IHRoZSBjb250cm9sIHJlZ2lzdGVycy4KLUB0YWJsZSBAY29kZQotQGl0ZW0gUkB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLUBpdGVtIEBAUkB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci1AaXRlbSBAQFJAdmFye259LQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWRlY3JlbWVudAotQGl0ZW0gQEAtU1AKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotQGl0ZW0gQEAoQHZhcntkaXNwfSwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotQGl0ZW0gQHZhcnthZGRyfQotUEMgcmVsYXRpdmUgYWRkcmVzcyAoZm9yIGJyYW5jaCBvciByZXApLiAKLUBpdGVtICNAdmFye2ltbX0KLUltbWVkaWF0ZSBkYXRhICh0aGUgQHNhbXB7I30gaXMgb3B0aW9uYWwgYW5kIGlnbm9yZWQpCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQzMFYtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBEMzBWCi1AY2luZGV4IEQzMFYgZmxvYXRpbmcgcG9pbnQKLVRoZSBEMzBWIGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9IGFuZCBAY29kZXsuZG91YmxlfQotZGlyZWN0aXZlcyBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuIAotCi1Abm9kZSBEMzBWLU9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLUBjaW5kZXggRDMwViBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgRDMwVgotQGNpbmRleCBtbmVtb25pY3MsIEQzMFYKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgRDMwVgotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBEMzBWIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle0QzMFYgQXJjaGl0ZWN0dXJlOiBBIFZMSVcgTWljcm9wcm9jZXNzb3IgZm9yIE11bHRpbWVkaWEgQXBwbGljYXRpb25zfSAKLShNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuKS4KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBEMzBWIG9wY29kZXMuICBUaGUgb25seSBjaGFuZ2VzIGFyZSB0aG9zZQotZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIG9uIHNpemUgbW9kaWZpZXJzCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1oODMwMC50ZXhpIGIvZ2FzL2RvYy9jLWg4MzAwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzA5MTguLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWg4MzAwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBlbmQgaWZzZXQKLUBub2RlIEg4LzMwMC1EZXBlbmRlbnQKLUBjaGFwdGVyIEg4LzMwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBIOC8zMDAgc3VwcG9ydAotQG1lbnUKLSogSDgvMzAwIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBIOC8zMDAgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogSDgvMzAwIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogSDgvMzAwIERpcmVjdGl2ZXM6OiAgICAgICAgICAgSDgvMzAwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBIOC8zMDAgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSDgvMzAwIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBIOC8zMDAgb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucywgSDgvMzAwIChub25lKQotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBIaXRhY2hpCi1IOC8zMDAgZmFtaWx5LgotCi1Abm9kZSBIOC8zMDAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIEg4LzMwMC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBIOC8zMDAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBIOC8zMDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSDgvMzAwLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBIOC8zMDAKLUBjaW5kZXggSDgvMzAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1wezt9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBIOC8zMDAKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgSDgvMzAwCi1AY2luZGV4IEg4LzMwMCBsaW5lIHNlcGFyYXRvcgotQHNhbXB7JH0gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLVRoZXJlZm9yZSBAZW1waHt5b3UgbWF5IG5vdCB1c2UgQHNhbXB7JH0gaW4gc3ltYm9sIG5hbWVzfSBvbiB0aGUgSDgvMzAwLgotCi1Abm9kZSBIOC8zMDAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBIOC8zMDAgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBIOC8zMDAKLVlvdSBjYW4gdXNlIHByZWRlZmluZWQgc3ltYm9scyBvZiB0aGUgZm9ybSBAc2FtcHtyQHZhcntufWh9IGFuZAotQHNhbXB7ckB2YXJ7bn1sfSB0byByZWZlciB0byB0aGUgSDgvMzAwIHJlZ2lzdGVycyBhcyBzaXh0ZWVuIDgtYml0Ci1nZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzLiAgQHZhcntufSBpcyBhIGRpZ2l0IGZyb20gQHNhbXB7MH0gdG8KLUBzYW1wezd9KTsgZm9yIGluc3RhbmNlLCBib3RoIEBzYW1we3IwaH0gYW5kIEBzYW1we3I3bH0gYXJlIHZhbGlkCi1yZWdpc3RlciBuYW1lcy4KLQotWW91IGNhbiBhbHNvIHVzZSB0aGUgZWlnaHQgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3JAdmFye259fSB0byByZWZlcgotdG8gdGhlIEg4LzMwMCByZWdpc3RlcnMgYXMgMTYtYml0IHJlZ2lzdGVycyAoeW91IG11c3QgdXNlIHRoaXMgZm9ybSBmb3IKLWFkZHJlc3NpbmcpLgotCi1PbiB0aGUgSDgvMzAwSCwgeW91IGNhbiBhbHNvIHVzZSB0aGUgZWlnaHQgcHJlZGVmaW5lZCBzeW1ib2xzCi1Ac2FtcHtlckB2YXJ7bn19IChAc2FtcHtlcjB9IEBkb3Rze30gQHNhbXB7ZXI3fSkgdG8gcmVmZXIgdG8gdGhlIDMyLWJpdAotZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KLQotVGhlIHR3byBjb250cm9sIHJlZ2lzdGVycyBhcmUgY2FsbGVkIEBjb2Rle3BjfSAocHJvZ3JhbSBjb3VudGVyOyBhCi0xNi1iaXQgcmVnaXN0ZXIsIGV4Y2VwdCBvbiB0aGUgSDgvMzAwSCB3aGVyZSBpdCBpcyAyNCBiaXRzKSBhbmQKLUBjb2Rle2Njcn0gKGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyOyBhbiA4LWJpdCByZWdpc3RlcikuICBAY29kZXtyN30gaXMKLXVzZWQgYXMgdGhlIHN0YWNrIHBvaW50ZXIsIGFuZCBjYW4gYWxzbyBiZSBjYWxsZWQgQGNvZGV7c3B9LgotCi1Abm9kZSBIOC8zMDAtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEg4LzMwMAotQGNpbmRleCBIOC8zMDAgYWRkcmVzc2luZyBtb2RlcwotQHZhbHVle0FTfSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBIOC8zMDA6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIHJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEByQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLQotQG5lZWQgMTIwMAotQGl0ZW0gQEAoQHZhcntkfSwgckB2YXJ7bn0pCi1AaXRlbXggQEAoQHZhcntkfToxNiwgckB2YXJ7bn0pCi1AaXRlbXggQEAoQHZhcntkfToyNCwgckB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdDogMTYtYml0IG9yIDI0LWJpdCBkaXNwbGFjZW1lbnQgQHZhcntkfSBmcm9tIHJlZ2lzdGVyCi1AdmFye259LiAgKDI0LWJpdCBkaXNwbGFjZW1lbnRzIGFyZSBvbmx5IG1lYW5pbmdmdWwgb24gdGhlIEg4LzMwMEguKQotCi1AaXRlbSBAQHJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotCi1AaXRlbSBAQC1yQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci0KLUBpdGVtIEBjb2Rle0BAfUB2YXJ7YWF9Ci1AaXRlbXggQGNvZGV7QEB9QHZhcnthYX06OAotQGl0ZW14IEBjb2Rle0BAfUB2YXJ7YWF9OjE2Ci1AaXRlbXggQGNvZGV7QEB9QHZhcnthYX06MjQKLUFic29sdXRlIGFkZHJlc3MgQGNvZGV7YWF9LiAgKFRoZSBhZGRyZXNzIHNpemUgQHNhbXB7OjI0fSBvbmx5IG1ha2VzCi1zZW5zZSBvbiB0aGUgSDgvMzAwSC4pCi0KLUBpdGVtICNAdmFye3h4fQotQGl0ZW14ICNAdmFye3h4fTo4Ci1AaXRlbXggI0B2YXJ7eHh9OjE2Ci1AaXRlbXggI0B2YXJ7eHh9OjMyCi1JbW1lZGlhdGUgZGF0YSBAdmFye3h4fS4gIFlvdSBtYXkgc3BlY2lmeSB0aGUgQHNhbXB7Ojh9LCBAc2FtcHs6MTZ9LCBvcgotQHNhbXB7OjMyfSBmb3IgY2xhcml0eSwgaWYgeW91IHdpc2g7IGJ1dCBAY29kZXtAdmFsdWV7QVN9fSBuZWl0aGVyCi1yZXF1aXJlcyB0aGlzIG5vciB1c2VzIGl0LS0tdGhlIGRhdGEgc2l6ZSByZXF1aXJlZCBpcyB0YWtlbiBmcm9tCi1jb250ZXh0LgotCi1AaXRlbSBAY29kZXtAQH1AY29kZXtAQH1AdmFye2FhfQotQGl0ZW14IEBjb2Rle0BAfUBjb2Rle0BAfUB2YXJ7YWF9OjgKLU1lbW9yeSBpbmRpcmVjdC4gIFlvdSBtYXkgc3BlY2lmeSB0aGUgQHNhbXB7Ojh9IGZvciBjbGFyaXR5LCBpZiB5b3UKLXdpc2g7IGJ1dCBAY29kZXtAdmFsdWV7QVN9fSBuZWl0aGVyIHJlcXVpcmVzIHRoaXMgbm9yIHVzZXMgaXQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEg4LzMwMCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgSDgvMzAwIChAc2N7aWVlZX0pCi1AY2luZGV4IEg4LzMwMCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEg4LzMwMCBmYW1pbHkgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0KLWRpcmVjdGl2ZSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuCi0KLUBwYWdlCi1Abm9kZSBIOC8zMDAgRGlyZWN0aXZlcwotQHNlY3Rpb24gSDgvMzAwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IEg4LzMwMCBtYWNoaW5lIGRpcmVjdGl2ZXMgKG5vbmUpCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgSDgvMzAwIChub25lKQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIEg4LzMwMAotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZSwgSDgvMzAwCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgb25seSBvbmUgbWFjaGluZS1kZXBlbmRlbnQgZGlyZWN0aXZlIGZvciB0aGUKLUg4LzMwMDoKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEg4LzMwMEgsIGFzc2VtYmxpbmcgZm9yCi1AaXRlbSAuaDgzMDBoCi1SZWNvZ25pemUgYW5kIGVtaXQgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBIOC8zMDBIIHZhcmlhbnQsIGFuZAotYWxzbyBtYWtlIEBjb2Rley5pbnR9IGVtaXQgMzItYml0IG51bWJlcnMgcmF0aGVyIHRoYW4gdGhlIHVzdWFsICgxNi1iaXQpCi1mb3IgdGhlIEg4LzMwMCBmYW1pbHkuCi1AZW5kIHRhYmxlCi0KLU9uIHRoZSBIOC8zMDAgZmFtaWx5IChpbmNsdWRpbmcgdGhlIEg4LzMwMEgpIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzCi1nZW5lcmF0ZSAxNi1iaXQgbnVtYmVycy4KLQotQG5vZGUgSDgvMzAwIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBIOC8zMDAgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIEg4LzMwMAotQGNpbmRleCBtbmVtb25pY3MsIEg4LzMwMAotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBIOC8zMDAKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgSDgvMzAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle0g4LzMwMCBTZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSBBREUtLTYwMi0tMDI1KS4gIEZvcgotaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIEg4LzMwMEgsIHNlZSBAY2l0ZXtIOC8zMDBIIFNlcmllcwotUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSkuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBIOC8zMDAgb3Bjb2Rlcy4gIE5vIGFkZGl0aW9uYWwKLXBzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4KLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBIOC8zMDAgb3Bjb2RlcywgYW5kIHRoZWlyIGFyZ3VtZW50cy4KLUVudHJpZXMgbWFya2VkIEBzYW1weyp9IGFyZSBvcGNvZGVzIHVzZWQgb25seSBvbiB0aGUgSDgvMzAwSC4KLQotQHNtYWxsZXhhbXBsZQotQGMgVXNpbmcgQGdyb3VwIHNlZW1zIHRvIHVzZSB0aGUgbm9ybWFsIGJhc2VsaW5lc2tpcCwgbm90IHRoZSBzbWFsbGV4YW1wbGUKLUBjIGJhc2VsaW5lc2tpcDsgbG9va3MgYXBwcm94IGRvdWJsZXNwYWNlZC4KLSAgICAgICAgIEBpe0xlZ2VuZDp9Ci0gICAgICAgICAgICBScyAgIEBye3NvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIFJkICAgQHJ7ZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBhYnMgIEBye2Fic29sdXRlIGFkZHJlc3N9Ci0gICAgICAgICAgICBpbW0gIEBye2ltbWVkaWF0ZSBkYXRhfQotICAgICAgICAgZGlzcDpOICBAcntOLWJpdCBkaXNwbGFjZW1lbnQgZnJvbSBhIHJlZ2lzdGVyfQotICAgICAgICBwY3JlbDpOICBAcntOLWJpdCBkaXNwbGFjZW1lbnQgcmVsYXRpdmUgdG8gcHJvZ3JhbSBjb3VudGVyfQotCi0gICBhZGQuYiAjaW1tLHJkICAgICAgICAgICAgICAqICBhbmRjICNpbW0sY2NyCi0gICBhZGQuYiBycyxyZCAgICAgICAgICAgICAgICAgICBiYW5kICNpbW0scmQKLSAgIGFkZC53IHJzLHJkICAgICAgICAgICAgICAgICAgIGJhbmQgI2ltbSxAQHJkCi0qICBhZGQudyAjaW1tLHJkICAgICAgICAgICAgICAgICBiYW5kICNpbW0sQEBhYnM6OAotKiAgYWRkLmwgcnMscmQgICAgICAgICAgICAgICAgICAgYnJhICBwY3JlbDo4Ci0qICBhZGQubCAjaW1tLHJkICAgICAgICAgICAgICAqICBicmEgIHBjcmVsOjE2Ci0gICBhZGRzICNpbW0scmQgICAgICAgICAgICAgICAgICBidCAgIHBjcmVsOjgKLSAgIGFkZHggI2ltbSxyZCAgICAgICAgICAgICAgICogIGJ0ICAgcGNyZWw6MTYKLSAgIGFkZHggcnMscmQgICAgICAgICAgICAgICAgICAgIGJybiAgcGNyZWw6OAotICAgYW5kLmIgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYnJuICBwY3JlbDoxNgotICAgYW5kLmIgcnMscmQgICAgICAgICAgICAgICAgICAgYmYgICBwY3JlbDo4Ci0qICBhbmQudyBycyxyZCAgICAgICAgICAgICAgICAqICBiZiAgIHBjcmVsOjE2Ci0qICBhbmQudyAjaW1tLHJkICAgICAgICAgICAgICAgICBiaGkgIHBjcmVsOjgKLSogIGFuZC5sICNpbW0scmQgICAgICAgICAgICAgICogIGJoaSAgcGNyZWw6MTYKLSogIGFuZC5sIHJzLHJkICAgICAgICAgICAgICAgICAgIGJscyAgcGNyZWw6OAotQHBhZ2UKLSogIGJscyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJsZCAgI2ltbSxyZAotICAgYmNjICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYmxkICAjaW1tLEBAcmQKLSogIGJjYyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJsZCAgI2ltbSxAQGFiczo4Ci0gICBiaHMgIHBjcmVsOjggICAgICAgICAgICAgICAgICBibm90ICNpbW0scmQKLSogIGJocyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJub3QgI2ltbSxAQHJkCi0gICBiY3MgIHBjcmVsOjggICAgICAgICAgICAgICAgICBibm90ICNpbW0sQEBhYnM6OAotKiAgYmNzICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm5vdCBycyxyZAotICAgYmxvICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm5vdCBycyxAQHJkCi0qICBibG8gIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibm90IHJzLEBAYWJzOjgKLSAgIGJuZSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJvciAgI2ltbSxyZAotKiAgYm5lICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm9yICAjaW1tLEBAcmQKLSAgIGJlcSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJvciAgI2ltbSxAQGFiczo4Ci0qICBiZXEgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic2V0ICNpbW0scmQKLSAgIGJ2YyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzZXQgI2ltbSxAQHJkCi0qICBidmMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic2V0ICNpbW0sQEBhYnM6OAotICAgYnZzICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNldCBycyxyZAotKiAgYnZzICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNldCBycyxAQHJkCi0gICBicGwgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic2V0IHJzLEBAYWJzOjgKLSogIGJwbCAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzciAgcGNyZWw6OAotICAgYm1pICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNyICBwY3JlbDoxNgotKiAgYm1pICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnN0ICAjaW1tLHJkCi0gICBiZ2UgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic3QgICNpbW0sQEByZAotKiAgYmdlICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnN0ICAjaW1tLEBAYWJzOjgKLSAgIGJsdCAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJ0c3QgI2ltbSxyZAotKiAgYmx0ICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnRzdCAjaW1tLEBAcmQKLSAgIGJndCAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJ0c3QgI2ltbSxAQGFiczo4Ci0qICBiZ3QgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBidHN0IHJzLHJkCi0gICBibGUgIHBjcmVsOjggICAgICAgICAgICAgICAgICBidHN0IHJzLEBAcmQKLSogIGJsZSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJ0c3QgcnMsQEBhYnM6OAotICAgYmNsciAjaW1tLHJkICAgICAgICAgICAgICAgICAgYnhvciAjaW1tLHJkCi0gICBiY2xyICNpbW0sQEByZCAgICAgICAgICAgICAgICAgYnhvciAjaW1tLEBAcmQKLSAgIGJjbHIgI2ltbSxAQGFiczo4ICAgICAgICAgICAgICBieG9yICNpbW0sQEBhYnM6OAotICAgYmNsciBycyxyZCAgICAgICAgICAgICAgICAgICAgY21wLmIgI2ltbSxyZAotICAgYmNsciBycyxAQHJkICAgICAgICAgICAgICAgICAgIGNtcC5iIHJzLHJkCi0gICBiY2xyIHJzLEBAYWJzOjggICAgICAgICAgICAgICAgY21wLncgcnMscmQKLSAgIGJpYW5kICNpbW0scmQgICAgICAgICAgICAgICAgIGNtcC53IHJzLHJkCi0gICBiaWFuZCAjaW1tLEBAcmQgICAgICAgICAgICAgKiAgY21wLncgI2ltbSxyZAotICAgYmlhbmQgI2ltbSxAQGFiczo4ICAgICAgICAgICogIGNtcC5sICNpbW0scmQKLSAgIGJpbGQgI2ltbSxyZCAgICAgICAgICAgICAgICogIGNtcC5sIHJzLHJkCi0gICBiaWxkICNpbW0sQEByZCAgICAgICAgICAgICAgICAgZGFhICBycwotICAgYmlsZCAjaW1tLEBAYWJzOjggICAgICAgICAgICAgIGRhcyAgcnMKLSAgIGJpb3IgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGRlYy5iIHJzCi0gICBiaW9yICNpbW0sQEByZCAgICAgICAgICAgICAgKiAgZGVjLncgI2ltbSxyZAotICAgYmlvciAjaW1tLEBAYWJzOjggICAgICAgICAgICogIGRlYy5sICNpbW0scmQKLSAgIGJpc3QgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGRpdnh1LmIgcnMscmQKLSAgIGJpc3QgI2ltbSxAQHJkICAgICAgICAgICAgICAqICBkaXZ4dS53IHJzLHJkCi0gICBiaXN0ICNpbW0sQEBhYnM6OCAgICAgICAgICAgKiAgZGl2eHMuYiBycyxyZAotICAgYml4b3IgI2ltbSxyZCAgICAgICAgICAgICAgKiAgZGl2eHMudyBycyxyZAotICAgYml4b3IgI2ltbSxAQHJkICAgICAgICAgICAgICAgIGVlcG1vdgotICAgYml4b3IgI2ltbSxAQGFiczo4ICAgICAgICAgICogIGVlcG1vdncKLUBwYWdlCi0qICBleHRzLncgcmQgICAgICAgICAgICAgICAgICAgICBtb3YudyBycyxAQGFiczoxNgotKiAgZXh0cy5sIHJkICAgICAgICAgICAgICAgICAgKiAgbW92LmwgI2ltbSxyZAotKiAgZXh0dS53IHJkICAgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMscmQKLSogIGV4dHUubCByZCAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAcnMscmQKLSAgIGluYyAgcnMgICAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAKGRpc3A6MTYscnMpLHJkCi0qICBpbmMudyAjaW1tLHJkICAgICAgICAgICAgICAqICBtb3YubCBAQChkaXNwOjI0LHJzKSxyZAotKiAgaW5jLmwgI2ltbSxyZCAgICAgICAgICAgICAgKiAgbW92LmwgQEBycysscmQKLSAgIGptcCAgQEBycyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQGFiczoxNixyZAotICAgam1wICBhYnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEBhYnM6MjQscmQKLSAgIGptcCAgQEBAQGFiczo4ICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEByZAotICAganNyICBAQHJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAKGRpc3A6MTYscmQpCi0gICBqc3IgIGFicyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBycyxAQChkaXNwOjI0LHJkKQotICAganNyICBAQEBAYWJzOjggICAgICAgICAgICAgICAqICBtb3YubCBycyxAQC1yZAotICAgbGRjICAjaW1tLGNjciAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEBhYnM6MTYKLSAgIGxkYyAgcnMsY2NyICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAYWJzOjI0Ci0qICBsZGMgIEBAYWJzOjE2LGNjciAgICAgICAgICAgICAgbW92ZnBlIEBAYWJzOjE2LHJkCi0qICBsZGMgIEBAYWJzOjI0LGNjciAgICAgICAgICAgICAgbW92dHBlIHJzLEBAYWJzOjE2Ci0qICBsZGMgIEBAKGRpc3A6MTYscnMpLGNjciAgICAgICAgbXVseHUuYiBycyxyZAotKiAgbGRjICBAQChkaXNwOjI0LHJzKSxjY3IgICAgICogIG11bHh1LncgcnMscmQKLSogIGxkYyAgQEBycyssY2NyICAgICAgICAgICAgICAqICBtdWx4cy5iIHJzLHJkCi0qICBsZGMgIEBAcnMsY2NyICAgICAgICAgICAgICAgKiAgbXVseHMudyBycyxyZAotKiAgbW92LmIgQEAoZGlzcDoyNCxycykscmQgICAgICAgIG5lZy5iIHJzCi0qICBtb3YuYiBycyxAQChkaXNwOjI0LHJkKSAgICAgKiAgbmVnLncgcnMKLSAgIG1vdi5iIEBAYWJzOjE2LHJkICAgICAgICAgICAqICBuZWcubCBycwotICAgbW92LmIgcnMscmQgICAgICAgICAgICAgICAgICAgbm9wCi0gICBtb3YuYiBAQGFiczo4LHJkICAgICAgICAgICAgICAgbm90LmIgcnMKLSAgIG1vdi5iIHJzLEBAYWJzOjggICAgICAgICAgICAqICBub3QudyBycwotICAgbW92LmIgcnMscmQgICAgICAgICAgICAgICAgKiAgbm90LmwgcnMKLSAgIG1vdi5iICNpbW0scmQgICAgICAgICAgICAgICAgIG9yLmIgI2ltbSxyZAotICAgbW92LmIgQEBycyxyZCAgICAgICAgICAgICAgICAgIG9yLmIgcnMscmQKLSAgIG1vdi5iIEBAKGRpc3A6MTYscnMpLHJkICAgICAqICBvci53ICNpbW0scmQKLSAgIG1vdi5iIEBAcnMrLHJkICAgICAgICAgICAgICAqICBvci53IHJzLHJkCi0gICBtb3YuYiBAQGFiczo4LHJkICAgICAgICAgICAgKiAgb3IubCAjaW1tLHJkCi0gICBtb3YuYiBycyxAQHJkICAgICAgICAgICAgICAgKiAgb3IubCBycyxyZAotICAgbW92LmIgcnMsQEAoZGlzcDoxNixyZCkgICAgICAgIG9yYyAgI2ltbSxjY3IKLSAgIG1vdi5iIHJzLEBALXJkICAgICAgICAgICAgICAgICBwb3AudyBycwotICAgbW92LmIgcnMsQEBhYnM6OCAgICAgICAgICAgICogIHBvcC5sIHJzCi0gICBtb3YudyBycyxAQHJkICAgICAgICAgICAgICAgICAgcHVzaC53IHJzCi0qICBtb3YudyBAQChkaXNwOjI0LHJzKSxyZCAgICAgKiAgcHVzaC5sIHJzCi0qICBtb3YudyBycyxAQChkaXNwOjI0LHJkKSAgICAgICAgcm90bC5iIHJzCi0qICBtb3YudyBAQGFiczoyNCxyZCAgICAgICAgICAgKiAgcm90bC53IHJzCi0qICBtb3YudyBycyxAQGFiczoyNCAgICAgICAgICAgKiAgcm90bC5sIHJzCi0gICBtb3YudyBycyxyZCAgICAgICAgICAgICAgICAgICByb3RyLmIgcnMKLSAgIG1vdi53ICNpbW0scmQgICAgICAgICAgICAgICogIHJvdHIudyBycwotICAgbW92LncgQEBycyxyZCAgICAgICAgICAgICAgICogIHJvdHIubCBycwotICAgbW92LncgQEAoZGlzcDoxNixycykscmQgICAgICAgIHJvdHhsLmIgcnMKLSAgIG1vdi53IEBAcnMrLHJkICAgICAgICAgICAgICAqICByb3R4bC53IHJzCi0gICBtb3YudyBAQGFiczoxNixyZCAgICAgICAgICAgKiAgcm90eGwubCBycwotICAgbW92LncgcnMsQEAoZGlzcDoxNixyZCkgICAgICAgIHJvdHhyLmIgcnMKLSAgIG1vdi53IHJzLEBALXJkICAgICAgICAgICAgICAqICByb3R4ci53IHJzCi1AcGFnZQotKiAgcm90eHIubCBycyAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEAoZGlzcDoyNCxyZCkKLSAgIGJwdCAgICAgICAgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBALXJkCi0gICBydGUgICAgICAgICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQGFiczoxNgotICAgcnRzICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEBhYnM6MjQKLSAgIHNoYWwuYiBycyAgICAgICAgICAgICAgICAgICAgIHN1Yi5iIHJzLHJkCi0qICBzaGFsLncgcnMgICAgICAgICAgICAgICAgICAgICBzdWIudyBycyxyZAotKiAgc2hhbC5sIHJzICAgICAgICAgICAgICAgICAgKiAgc3ViLncgI2ltbSxyZAotICAgc2hhci5iIHJzICAgICAgICAgICAgICAgICAgKiAgc3ViLmwgcnMscmQKLSogIHNoYXIudyBycyAgICAgICAgICAgICAgICAgICogIHN1Yi5sICNpbW0scmQKLSogIHNoYXIubCBycyAgICAgICAgICAgICAgICAgICAgIHN1YnMgI2ltbSxyZAotICAgc2hsbC5iIHJzICAgICAgICAgICAgICAgICAgICAgc3VieCAjaW1tLHJkCi0qICBzaGxsLncgcnMgICAgICAgICAgICAgICAgICAgICBzdWJ4IHJzLHJkCi0qICBzaGxsLmwgcnMgICAgICAgICAgICAgICAgICAqICB0cmFwYSAjaW1tCi0gICBzaGxyLmIgcnMgICAgICAgICAgICAgICAgICAgICB4b3IgICNpbW0scmQKLSogIHNobHIudyBycyAgICAgICAgICAgICAgICAgICAgIHhvciAgcnMscmQKLSogIHNobHIubCBycyAgICAgICAgICAgICAgICAgICogIHhvci53ICNpbW0scmQKLSAgIHNsZWVwICAgICAgICAgICAgICAgICAgICAgICogIHhvci53IHJzLHJkCi0gICBzdGMgIGNjcixyZCAgICAgICAgICAgICAgICAqICB4b3IubCAjaW1tLHJkCi0qICBzdGMgIGNjcixAQHJzICAgICAgICAgICAgICAgKiAgeG9yLmwgcnMscmQKLSogIHN0YyAgY2NyLEBAKGRpc3A6MTYscmQpICAgICAgICB4b3JjICNpbW0sY2NyCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBpZnNldAotCi1AY2luZGV4IHNpemUgc3VmZml4ZXMsIEg4LzMwMAotQGNpbmRleCBIOC8zMDAgc2l6ZSBzdWZmaXhlcwotRm91ciBIOC8zMDAgaW5zdHJ1Y3Rpb25zIChAY29kZXthZGR9LCBAY29kZXtjbXB9LCBAY29kZXttb3Z9LAotQGNvZGV7c3VifSkgYXJlIGRlZmluZWQgd2l0aCB2YXJpYW50cyB1c2luZyB0aGUgc3VmZml4ZXMgQHNhbXB7LmJ9LAotQHNhbXB7Lnd9LCBhbmQgQHNhbXB7Lmx9IHRvIHNwZWNpZnkgdGhlIHNpemUgb2YgYSBtZW1vcnkgb3BlcmFuZC4KLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZXNlIHN1ZmZpeGVzLCBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGVtOwotc2luY2Ugb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhbHdheXMgYSByZWdpc3RlciwgQGNvZGV7QHZhbHVle0FTfX0gY2FuCi1kZWR1Y2UgdGhlIGNvcnJlY3Qgc2l6ZS4KLQotRm9yIGV4YW1wbGUsIHNpbmNlIEBjb2Rle3IwfSByZWZlcnMgdG8gYSAxNi1iaXQgcmVnaXN0ZXIsCi1AZXhhbXBsZQotbW92ICAgIHIwLEBAZm9vCi1AZXhkZW50IGlzIGVxdWl2YWxlbnQgdG8KLW1vdi53ICByMCxAQGZvbwotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSB1c2UgdGhlIHNpemUgc3VmZml4ZXMsIEBjb2Rle0B2YWx1ZXtBU319IGlzc3VlcyBhIHdhcm5pbmcgd2hlbgotdGhlIHN1ZmZpeCBhbmQgdGhlIHJlZ2lzdGVyIHNpemUgZG8gbm90IG1hdGNoLgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWg4NTAwLnRleGkgYi9nYXMvZG9jL2MtaDg1MDAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmMGU2NC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaDg1MDAudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBwYWdlCi1Abm9kZSBIOC81MDAtRGVwZW5kZW50Ci1AY2hhcHRlciBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggSDgvNTAwIHN1cHBvcnQKLUBtZW51Ci0qIEg4LzUwMCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogSDgvNTAwIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEg4LzUwMCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEg4LzUwMCBEaXJlY3RpdmVzOjogICAgICAgICAgIEg4LzUwMCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogSDgvNTAwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEg4LzUwMCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggSDgvNTAwIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMsIEg4LzUwMCAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQotSDgvNTAwIGZhbWlseS4KLQotQG5vZGUgSDgvNTAwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci0KLUBtZW51Ci0qIEg4LzUwMC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBIOC81MDAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBIOC81MDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSDgvNTAwLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBIOC81MDAKLUBjaW5kZXggSDgvNTAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1weyF9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBIOC81MDAKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgSDgvNTAwCi1AY2luZGV4IEg4LzUwMCBsaW5lIHNlcGFyYXRvcgotQHNhbXB7O30gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotQGNpbmRleCBzeW1ib2wgbmFtZXMsIEBzYW1weyR9IGluCi1AY2luZGV4IEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcwotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBIOC81MDAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBIOC81MDAgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgSDgvNTAwCi1Zb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSwgQHNhbXB7cjF9LCBAc2FtcHtyMn0sCi1Ac2FtcHtyM30sIEBzYW1we3I0fSwgQHNhbXB7cjV9LCBAc2FtcHtyNn0sIGFuZCBAc2FtcHtyN30gdG8gcmVmZXIgdG8KLXRoZSBIOC81MDAgcmVnaXN0ZXJzLgotCi1UaGUgSDgvNTAwIGFsc28gaGFzIHRoZXNlIGNvbnRyb2wgcmVnaXN0ZXJzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGNwCi1jb2RlIHBvaW50ZXIKLQotQGl0ZW0gZHAKLWRhdGEgcG9pbnRlcgotCi1AaXRlbSBicAotYmFzZSBwb2ludGVyCi0KLUBpdGVtIHRwCi1zdGFjayB0b3AgcG9pbnRlcgotCi1AaXRlbSBlcAotZXh0cmEgcG9pbnRlcgotCi1AaXRlbSBzcgotc3RhdHVzIHJlZ2lzdGVyCi0KLUBpdGVtIGNjcgotY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXIKLUBlbmQgdGFibGUKLQotQWxsIHJlZ2lzdGVycyBhcmUgMTYgYml0cyBsb25nLiAgVG8gcmVwcmVzZW50IDMyIGJpdCBudW1iZXJzLCB1c2UgdHdvCi1hZGphY2VudCByZWdpc3RlcnM7IGZvciBkaXN0YW50IG1lbW9yeSBhZGRyZXNzZXMsIHVzZSBvbmUgb2YgdGhlIHNlZ21lbnQKLXBvaW50ZXJzIChAY29kZXtjcH0gZm9yIHRoZSBwcm9ncmFtIGNvdW50ZXI7IEBjb2Rle2RwfSBmb3IKLUBjb2Rle3IwfS0tQGNvZGV7cjN9OyBAY29kZXtlcH0gZm9yIEBjb2Rle3I0fSBhbmQgQGNvZGV7cjV9OyBhbmQKLUBjb2Rle3RwfSBmb3IgQGNvZGV7cjZ9IGFuZCBAY29kZXtyN30uCi0KLUBub2RlIEg4LzUwMC1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi0KLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgSDgvNTAwCi1AY2luZGV4IEg4LzUwMCBhZGRyZXNzaW5nIG1vZGVzCi1AdmFsdWV7QVN9IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEg4LzUwMDoKLUB0YWJsZSBAY29kZQotQGl0ZW0gUkB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotCi1AaXRlbSBAQFJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotCi1AaXRlbSBAQChkOjgsIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50Ci0KLUBpdGVtIEBAKGQ6MTYsIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudAotCi1AaXRlbSBAQC1SQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci0KLUBpdGVtIEBAUkB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci0KLUBpdGVtIEBAQHZhcnthYX06OAotOCBiaXQgYWJzb2x1dGUgYWRkcmVzcwotCi1AaXRlbSBAQEB2YXJ7YWF9OjE2Ci0xNiBiaXQgYWJzb2x1dGUgYWRkcmVzcwotCi1AaXRlbSAjQHZhcnt4eH06OAotOCBiaXQgaW1tZWRpYXRlCi0KLUBpdGVtICNAdmFye3h4fToxNgotMTYgYml0IGltbWVkaWF0ZQotQGVuZCB0YWJsZQotCi1Abm9kZSBIOC81MDAgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEg4LzUwMCAoQHNje2llZWV9KQotQGNpbmRleCBIOC81MDAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBIOC81MDAgZmFtaWx5IGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9Ci1kaXJlY3RpdmUgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLgotCi1Abm9kZSBIOC81MDAgRGlyZWN0aXZlcwotQHNlY3Rpb24gSDgvNTAwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IEg4LzUwMCBtYWNoaW5lIGRpcmVjdGl2ZXMgKG5vbmUpCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgSDgvNTAwIChub25lKQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIEg4LzUwMAotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZSwgSDgvNTAwCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgZGlyZWN0aXZlcyBmb3IgdGhlIEg4LzUwMC4KLUhvd2V2ZXIsIG9uIHRoaXMgcGxhdGZvcm0gdGhlIEBzYW1wey5pbnR9IGFuZCBAc2FtcHsud29yZH0gZGlyZWN0aXZlcwotZ2VuZXJhdGUgMTYtYml0IG51bWJlcnMuCi0KLUBub2RlIEg4LzUwMCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggSDgvNTAwIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBIOC81MDAKLUBjaW5kZXggbW5lbW9uaWNzLCBIOC81MDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgSDgvNTAwCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEg4LzUwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtIOC81MDAgU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgTTIxVDAwMSkuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBIOC81MDAgb3Bjb2Rlcy4gIE5vIGFkZGl0aW9uYWwKLXBzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4KLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIEg4LzUwMCBvcGNvZGVzIGFuZCB0aGVpciBvcGVyYW5kczoKLQotQGMgVXNlIEBncm91cCBpZiBpdCBldmVyIHdvcmtzLCBpbnN0ZWFkIG9mIEBwYWdlCi1AcGFnZQotQHNtYWxsZXhhbXBsZQotQGl7TGVnZW5kOn0KLWFiczggICAgICBAcns4LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQotYWJzMTYgICAgIEByezE2LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQotYWJzMjQgICAgIEByezI0LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQotY3JiICAgICAgIEBye0Bjb2Rle2Njcn0sIEBjb2Rle2JyfSwgQGNvZGV7ZXB9LCBAY29kZXtkcH0sIEBjb2Rle3RwfSwgQGNvZGV7ZHB9fQotZGlzcDggICAgIEByezgtYml0IGRpc3BsYWNlbWVudH0KLWVhICAgICAgICBAcntAY29kZXtybn0sIEBjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQotICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fSx9Ci0gICAgICAgICAgQHJ7QGNvZGV7I3h4Ojh9LCBAY29kZXsjeHg6MTZ9fQotZWFfbWVtICAgIEBye0Bjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQotICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fX0KLWVhX25vaW1tICBAcntAY29kZXtybn0sIEBjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQotICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fX0KLWZwICAgICAgICByNgotaW1tNCAgICAgIEByezQtYml0IGltbWVkaWF0ZSBkYXRhfQotaW1tOCAgICAgIEByezgtYml0IGltbWVkaWF0ZSBkYXRhfQotaW1tMTYgICAgIEByezE2LWJpdCBpbW1lZGlhdGUgZGF0YX0KLXBjcmVsOCAgICBAcns4LWJpdCBvZmZzZXQgZnJvbSBwcm9ncmFtIGNvdW50ZXJ9Ci1wY3JlbDE2ICAgQHJ7MTYtYml0IG9mZnNldCBmcm9tIHByb2dyYW0gY291bnRlcn0KLXFpbSAgICAgICBAcntAY29kZXstMn0sIEBjb2Rley0xfSwgQGNvZGV7MX0sIEBjb2RlezJ9fQotcmQgICAgICAgIEBye2FueSByZWdpc3Rlcn0KLXJzICAgICAgICBAcnthIHJlZ2lzdGVyIGRpc3RpbmN0IGZyb20gcmR9Ci1ybGlzdCAgICAgQHJ7Y29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIHBhcmVudGhlc2VzO30KLSAgICAgICAgICBAcntyZWdpc3RlciByYW5nZXMgQGNvZGV7cmQtcnN9IGFyZSBhbGxvd2VkfQotc3AgICAgICAgIEBye3N0YWNrIHBvaW50ZXIgKEBjb2Rle3I3fSl9Ci1zciAgICAgICAgQHJ7c3RhdHVzIHJlZ2lzdGVyfQotc3ogICAgICAgIEBye3NpemU7IEBzYW1wey5ifSBvciBAc2FtcHsud30uICBJZiBvbWl0dGVkLCBkZWZhdWx0IEBzYW1wey53fX0KLQotbGRjWy5iXSBlYSxjcmIgICAgICAgICAgICAgICAgIGJjY1sud10gcGNyZWwxNgotbGRjWy53XSBlYSxzciAgICAgICAgICAgICAgICAgIGJjY1suYl0gcGNyZWw4IAotYWRkWzpxXSBzeiBxaW0sZWFfbm9pbW0gICAgICAgIGJoc1sud10gcGNyZWwxNgotYWRkWzpnXSBzeiBlYSxyZCAgICAgICAgICAgICAgIGJoc1suYl0gcGNyZWw4IAotYWRkcyBzeiBlYSxyZCAgICAgICAgICAgICAgICAgIGJjc1sud10gcGNyZWwxNgotYWRkeCBzeiBlYSxyZCAgICAgICAgICAgICAgICAgIGJjc1suYl0gcGNyZWw4IAotYW5kIHN6IGVhLHJkICAgICAgICAgICAgICAgICAgIGJsb1sud10gcGNyZWwxNgotYW5kY1suYl0gaW1tOCxjcmIgICAgICAgICAgICAgIGJsb1suYl0gcGNyZWw4IAotYW5kY1sud10gaW1tMTYsc3IgICAgICAgICAgICAgIGJuZVsud10gcGNyZWwxNgotYnB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJuZVsuYl0gcGNyZWw4IAotYnJhWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJlcVsud10gcGNyZWwxNgotYnJhWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJlcVsuYl0gcGNyZWw4IAotYnRbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgIGJ2Y1sud10gcGNyZWwxNgotYnRbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgIGJ2Y1suYl0gcGNyZWw4IAotYnJuWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJ2c1sud10gcGNyZWwxNgotYnJuWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJ2c1suYl0gcGNyZWw4IAotYmZbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgIGJwbFsud10gcGNyZWwxNgotYmZbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgIGJwbFsuYl0gcGNyZWw4IAotYmhpWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJtaVsud10gcGNyZWwxNgotYmhpWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJtaVsuYl0gcGNyZWw4IAotYmxzWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJnZVsud10gcGNyZWwxNgotYmxzWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJnZVsuYl0gcGNyZWw4IAotQHBhZ2UKLWJsdFsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtb3ZbOmddWy5iXSBpbW04LGVhX21lbSAgICAgICAKLWJsdFsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBtb3ZbOmddWy53XSBpbW0xNixlYV9tZW0gICAgICAKLWJndFsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtb3ZmcGVbLmJdIGVhLHJkICAgICAgICAgICAgICAKLWJndFsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBtb3Z0cGVbLmJdIHJzLGVhX25vaW1tICAgICAgICAKLWJsZVsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtdWx4dSBzeiBlYSxyZCAgICAgICAgICAgICAgICAKLWJsZVsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBuZWcgc3ogZWEgICAgICAgICAgICAgICAgICAgICAKLWJjbHIgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWJjbHIgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBub3Qgc3ogZWEgICAgICAgICAgICAgICAgICAgICAKLWJub3Qgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBvciBzeiBlYSxyZCAgICAgICAgICAgICAgICAgICAKLWJub3Qgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBvcmNbLmJdIGltbTgsY3JiICAgICAgICAgICAgICAKLWJzZXQgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBvcmNbLnddIGltbTE2LHNyICAgICAgICAgICAgICAKLWJzZXQgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBwam1wIGFiczI0ICAgICAgICAgICAgICAgICAgICAKLWJzclsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBwam1wIEBAcmQgICAgICAgICAgICAgICAgICAgICAKLWJzclsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBwanNyIGFiczI0ICAgICAgICAgICAgICAgICAgICAKLWJ0c3Qgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBwanNyIEBAcmQgICAgICAgICAgICAgICAgICAgICAKLWJ0c3Qgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBwcnRkIGltbTggICAgICAgICAgICAgICAgICAgICAKLWNsciBzeiBlYSAgICAgICAgICAgICAgICAgICAgICBwcnRkIGltbTE2ICAgICAgICAgICAgICAgICAgICAKLWNtcFs6ZV1bLmJdIGltbTgscmQgICAgICAgICAgICBwcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAKLWNtcFs6aV1bLnddIGltbTE2LHJkICAgICAgICAgICByb3RsIHN6IGVhICAgICAgICAgICAgICAgICAgICAKLWNtcFs6Z10uYiBpbW04LGVhX25vaW1tICAgICAgICByb3RyIHN6IGVhICAgICAgICAgICAgICAgICAgICAKLWNtcFs6Z11bLnddIGltbTE2LGVhX25vaW1tICAgICByb3R4bCBzeiBlYSAgICAgICAgICAgICAgICAgICAKLUNtcFs6Z10gc3ogZWEscmQgICAgICAgICAgICAgICByb3R4ciBzeiBlYSAgICAgICAgICAgICAgICAgICAKLWRhZGQgcnMscmQgICAgICAgICAgICAgICAgICAgICBydGQgaW1tOCAgICAgICAgICAgICAgICAgICAgIAotZGl2eHUgc3ogZWEscmQgICAgICAgICAgICAgICAgIHJ0ZCBpbW0xNiAgICAgICAgICAgICAgICAgICAgCi1kc3ViIHJzLHJkICAgICAgICAgICAgICAgICAgICAgcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAKLWV4dHNbLmJdIHJkICAgICAgICAgICAgICAgICAgICBzY2IvZiBycyxwY3JlbDggICAgICAgICAgICAgICAKLWV4dHVbLmJdIHJkICAgICAgICAgICAgICAgICAgICBzY2IvbmUgcnMscGNyZWw4ICAgICAgICAgICAgIAotam1wIEBAcmQgICAgICAgICAgICAgICAgICAgICAgICBzY2IvZXEgcnMscGNyZWw4ICAgICAgICAgICAgIAotam1wIEBAKGltbTgscmQpICAgICAgICAgICAgICAgICBzaGFsIHN6IGVhICAgICAgICAgICAgICAgICAgIAotam1wIEBAKGltbTE2LHJkKSAgICAgICAgICAgICAgICBzaGFyIHN6IGVhICAgICAgICAgICAgICAgICAgICAKLWptcCBhYnMxNiAgICAgICAgICAgICAgICAgICAgICBzaGxsIHN6IGVhICAgICAgICAgICAgCi1qc3IgQEByZCAgICAgICAgICAgICAgICAgICAgICAgIHNobHIgc3ogZWEgICAgICAgICAgICAKLWpzciBAQChpbW04LHJkKSAgICAgICAgICAgICAgICAgc2xlZXAgICAgICAgICAgICAgICAgIAotanNyIEBAKGltbTE2LHJkKSAgICAgICAgICAgICAgICBzdGNbLmJdIGNyYixlYV9ub2ltbSAgCi1qc3IgYWJzMTYgICAgICAgICAgICAgICAgICAgICAgc3RjWy53XSBzcixlYV9ub2ltbSAgIAotbGRtIEBAc3ArLChybGlzdCkgICAgICAgICAgICAgICBzdG0gKHJsaXN0KSxAQC1zcCAgICAgCi1saW5rIGZwLGltbTggICAgICAgICAgICAgICAgICAgc3ViIHN6IGVhLHJkICAgICAgICAgIAotbGluayBmcCxpbW0xNiAgICAgICAgICAgICAgICAgIHN1YnMgc3ogZWEscmQgICAgICAgICAKLW1vdls6ZV1bLmJdIGltbTgscmQgICAgICAgICAgICBzdWJ4IHN6IGVhLHJkICAgICAgICAgCi1tb3ZbOmldWy53XSBpbW0xNixyZCAgICAgICAgICAgc3dhcFsuYl0gcmQgICAgICAgICAgIAotbW92WzpsXVsud10gYWJzOCxyZCAgICAgICAgICAgIHRhc1suYl0gZWEgICAgIAotbW92WzpsXS5iIGFiczgscmQgICAgICAgICAgICAgIHRyYXBhIGltbTQgICAgIAotbW92WzpzXVsud10gcnMsYWJzOCAgICAgICAgICAgIHRyYXAvdnMgICAgICAgIAotbW92WzpzXS5iIHJzLGFiczggICAgICAgICAgICAgIHRzdCBzeiBlYSAgICAgIAotbW92WzpmXVsud10gQEAoZGlzcDgsZnApLHJkICAgICB1bmxrIGZwICAgICAgICAKLW1vdls6Zl1bLnddIHJzLEBAKGRpc3A4LGZwKSAgICAgeGNoWy53XSBycyxyZCAKLW1vdls6Zl0uYiBAQChkaXNwOCxmcCkscmQgICAgICAgeG9yIHN6IGVhLHJkICAgCi1tb3ZbOmZdLmIgcnMsQEAoZGlzcDgsZnApICAgICAgIHhvcmMuYiBpbW04LGNyYgotbW92WzpnXSBzeiBycyxlYV9tZW0gICAgICAgICAgIHhvcmMudyBpbW0xNixzcgotbW92WzpnXSBzeiBlYSxyZCAgICAgICAgICAgICAgCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBpZnNldApkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWhwcGEudGV4aSBiL2dhcy9kb2MvYy1ocHBhLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTUzNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWhwcGEudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBwYWdlCi1Abm9kZSBIUFBBLURlcGVuZGVudAotQGNoYXB0ZXIgSFBQQSBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCAgc3VwcG9ydAotQG1lbnUKLSogSFBQQSBOb3Rlczo6ICAgICAgICAgICAgICAgIE5vdGVzCi0qIEhQUEEgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEhQUEEgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogSFBQQSBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEhQUEEgRGlyZWN0aXZlczo6ICAgICAgICAgICBIUFBBIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBIUFBBIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEhQUEEgTm90ZXMKLUBzZWN0aW9uIE5vdGVzCi1BcyBhIGJhY2sgZW5kIGZvciBAc2N7Z251fSBAc2N7Y2N9IEBjb2Rle0B2YWx1ZXtBU319IGhhcyBiZWVuIHRocm91Z2hseSB0ZXN0ZWQgYW5kIHNob3VsZAotd29yayBleHRyZW1lbHkgd2VsbC4gIFdlIGhhdmUgdGVzdGVkIGl0IG9ubHkgbWluaW1hbGx5IG9uIGhhbmQgd3JpdHRlbiBhc3NlbWJseQotY29kZSBhbmQgbm8gb25lIGhhcyB0ZXN0ZWQgaXQgbXVjaCBvbiB0aGUgYXNzZW1ibHkgb3V0cHV0IGZyb20gdGhlIEhQCi1jb21waWxlcnMuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIGRlYnVnZ2luZyBzZWN0aW9ucyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgb3JpZ2luYWwKLUBjb2Rle0B2YWx1ZXtBU319IHBvcnQgKHZlcnNpb24gMS4zWCkgd2FzIHJlbGVhc2VkOyB0aGVyZWZvcmUsCi15b3UgbXVzdCByZWJ1aWxkIGFsbCBIUFBBIG9iamVjdHMgYW5kIGxpYnJhcmllcyB3aXRoIHRoZSBuZXcgCi1hc3NlbWJsZXIgc28gdGhhdCB5b3UgY2FuIGRlYnVnIHRoZSBmaW5hbCBleGVjdXRhYmxlLgotCi1UaGUgSFBQQSBAY29kZXtAdmFsdWV7QVN9fSBwb3J0IGdlbmVyYXRlcyBhIHNtYWxsIHN1YnNldCBvZiB0aGUgcmVsb2NhdGlvbnMKLWF2YWlsYWJsZSBpbiB0aGUgU09NIGFuZCBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIEFkZGl0aW9uYWwgcmVsb2NhdGlvbgotc3VwcG9ydCB3aWxsIGJlIGFkZGVkIGFzIGl0IGJlY29tZXMgbmVjZXNzYXJ5LiAgCi0KLUBub2RlIEhQUEEgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSFBQQS4KLQotQGNpbmRleCBIUFBBIFN5bnRheAotQG5vZGUgSFBQQSBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotVGhlIGFzc2VtYmxlciBzeW50YXggY2xvc2VseSBmb2xsb3dzIHRoZSBIUFBBIGluc3RydWN0aW9uIHNldAotcmVmZXJlbmNlIG1hbnVhbDsgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgYW5kIGdlbmVyYWwgc3ludGF4IGNsb3NlbHkgZm9sbG93IHRoZQotSFBQQSBhc3NlbWJseSBsYW5ndWFnZSByZWZlcmVuY2UgbWFudWFsLCB3aXRoIGEgZmV3IG5vdGV3b3J0aHkgZGlmZmVyZW5jZXMuCi0KLUZpcnN0LCBhIGNvbG9uIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgYSBsYWJlbCBkZWZpbml0aW9uLiAgVGhpcyBpcwotc2ltcGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggaG93IG1vc3QgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMKLXdyaXRlIGNvZGUuCi0KLVNvbWUgb2JzY3VyZSBleHByZXNzaW9uIHBhcnNpbmcgcHJvYmxlbXMgbWF5IGFmZmVjdCBoYW5kIHdyaXR0ZW4gY29kZSB3aGljaAotdXNlcyB0aGUgQGNvZGV7c3BvcH0gaW5zdHJ1Y3Rpb25zLCBvciBjb2RlIHdoaWNoIG1ha2VzIHNpZ25pZmljYW50Ci11c2Ugb2YgdGhlIEBjb2RleyF9IGxpbmUgc2VwYXJhdG9yLgotCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBtdWNoIGxlc3MgZm9yZ2l2aW5nIGFib3V0IG1pc3NpbmcgYXJndW1lbnRzIGFuZCBvdGhlcgotc2ltaWxhciBvdmVyc2lnaHRzIHRoYW4gdGhlIEhQIGFzc2VtYmxlci4gIEBjb2Rle0B2YWx1ZXtBU319IG5vdGlmaWVzIHlvdQotb2YgbWlzc2luZyBhcmd1bWVudHMgYXMgc3ludGF4IGVycm9yczsgdGhpcyBpcyByZWdhcmRlZCBhcyBhIGZlYXR1cmUsIG5vdCBhCi1idWcuCi0KLUZpbmFsbHksIEBjb2Rle0B2YWx1ZXtBU319IGFsbG93cyB5b3UgdG8gdXNlIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRob3V0Ci1leHBsaWNpdGx5IGltcG9ydGluZyB0aGUgc3ltYm9sLiAgQGVtcGh7V2FybmluZzp9IGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIGJlCi1hbiBlcnJvciBmb3IgSFBQQSB0YXJnZXRzLgotCi1TcGVjaWFsIGNoYXJhY3RlcnMgZm9yIEhQUEEgdGFyZ2V0cyBpbmNsdWRlOgotCi1Ac2FtcHs7fSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQHNhbXB7IX0gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBIUFBBIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgSFBQQSAoQHNje2llZWV9KQotQGNpbmRleCBIUFBBIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgSFBQQSBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgSFBQQSBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBIUFBBIEFzc2VtYmxlciBEaXJlY3RpdmVzCi0KLUBjb2Rle0B2YWx1ZXtBU319IGZvciB0aGUgSFBQQSBzdXBwb3J0cyBtYW55IGFkZGl0aW9uYWwgZGlyZWN0aXZlcyBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCB0aGUgbmF0aXZlIGFzc2VtYmxlci4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlbSBvbmx5Ci1icmllZmx5LiAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIEhQUEEtc3BlY2lmaWMgYXNzZW1ibGVyIGRpcmVjdGl2ZXMsIHNlZQotQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAgQXNzZW1ibHkgTGFuZ3VhZ2UgUmVmZXJlbmNlIE1hbnVhbH0gKEhQIDkyNDMyLTkwMDAxKS4KLQotQGNpbmRleCBIUFBBIGRpcmVjdGl2ZXMgbm90IHN1cHBvcnRlZAotQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBAZW1waHtub3R9IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBhc3NlbWJsZXIgZGlyZWN0aXZlcwotZGVzY3JpYmVkIGluIHRoZSBIUCBtYW51YWw6Ci0KLUBleGFtcGxlCi0uZW5kbSAgICAgICAgICAgLmxpc3RvbgotLmVudGVyICAgICAgICAgIC5sb2NjdAotLmxlYXZlICAgICAgICAgIC5tYWNybyAgCi0ubGlzdG9mZgotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggQGNvZGV7LnBhcmFtfSBvbiBIUFBBCi1CZXlvbmQgdGhvc2UgaW1wbGVtZW50ZWQgZm9yIGNvbXBhdGliaWxpdHksIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIG9uZQotYWRkaXRpb25hbCBhc3NlbWJsZXIgZGlyZWN0aXZlIGZvciB0aGUgSFBQQTogQGNvZGV7LnBhcmFtfS4gIEl0IGNvbnZleXMKLXJlZ2lzdGVyIGFyZ3VtZW50IGxvY2F0aW9ucyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gIEl0cyBzeW50YXggY2xvc2VseSBmb2xsb3dzCi10aGUgQGNvZGV7LmV4cG9ydH0gZGlyZWN0aXZlLgotCi1AY2luZGV4IEhQUEEtb25seSBkaXJlY3RpdmVzCi1UaGVzZSBhcmUgdGhlIGFkZGl0aW9uYWwgZGlyZWN0aXZlcyBpbiBAY29kZXtAdmFsdWV7QVN9fSBmb3IgdGhlIEhQUEE6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLmJsb2NrIEB2YXJ7bn0KLUBpdGVteCAuYmxvY2t6IEB2YXJ7bn0KLVJlc2VydmUgQHZhcntufSBieXRlcyBvZiBzdG9yYWdlLCBhbmQgaW5pdGlhbGl6ZSB0aGVtIHRvIHplcm8uCi0KLUBpdGVtIC5jYWxsIAotTWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcHJvY2VkdXJlIGNhbGwuICBPbmx5IHRoZSBzcGVjaWFsIGNhc2Ugd2l0aCBAZW1waHtubwotYXJndW1lbnRzfSBpcyBhbGxvd2VkLgotCi1AaXRlbSAuY2FsbGluZm8gWyBAdmFye3BhcmFtfT1AdmFye3ZhbHVlfSwgQGRvdHN7fSBdICBbIEB2YXJ7ZmxhZ30sIEBkb3Rze30gXQotU3BlY2lmeSBhIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCBmbGFncyB0aGF0IGRlZmluZSB0aGUgZW52aXJvbm1lbnQgZm9yIGEKLXByb2NlZHVyZS4KLQotQHZhcntwYXJhbX0gbWF5IGJlIGFueSBvZiBAc2FtcHtmcmFtZX0gKGZyYW1lIHNpemUpLCBAc2FtcHtlbnRyeV9ncn0gKGVuZCBvZgotZ2VuZXJhbCByZWdpc3RlciByYW5nZSksIEBzYW1we2VudHJ5X2ZyfSAoZW5kIG9mIGZsb2F0IHJlZ2lzdGVyIHJhbmdlKSwKLUBzYW1we2VudHJ5X3NyfSAoZW5kIG9mIHNwYWNlIHJlZ2lzdGVyIHJhbmdlKS4KLQotVGhlIHZhbHVlcyBmb3IgQHZhcntmbGFnfSBhcmUgQHNhbXB7Y2FsbHN9IG9yIEBzYW1we2NhbGxlcn0gKHByb2MgaGFzCi1zdWJyb3V0aW5lcyksIEBzYW1we25vX2NhbGxzfSAocHJvYyBkb2VzIG5vdCBjYWxsIHN1YnJvdXRpbmVzKSwgQHNhbXB7c2F2ZV9ycH0KLShwcmVzZXJ2ZSByZXR1cm4gcG9pbnRlciksIEBzYW1we3NhdmVfc3B9IChwcm9jIHByZXNlcnZlcyBzdGFjayBwb2ludGVyKSwKLUBzYW1we25vX3Vud2luZH0gKGRvIG5vdCB1bndpbmQgdGhpcyBwcm9jKSwgQHNhbXB7aHB1eF9pbnR9IChwcm9jIGlzIGludGVycnVwdAotcm91dGluZSkuCi0KLUBpdGVtIC5jb2RlCi1Bc3NlbWJsZSBpbnRvIHRoZSBzdGFuZGFyZCBzZWN0aW9uIGNhbGxlZCBAc2FtcHskVEVYVCR9LCBzdWJzZWN0aW9uCi1Ac2FtcHskQ09ERSR9LgotCi1AaWZzZXQgU09NCi1AaXRlbSAuY29weXJpZ2h0ICJAdmFye3N0cmluZ30iCi1JbiB0aGUgU09NIG9iamVjdCBmb3JtYXQsIGluc2VydCBAdmFye3N0cmluZ30gaW50byB0aGUgb2JqZWN0IGNvZGUsIG1hcmtlZCBhcyBhCi1jb3B5cmlnaHQgc3RyaW5nLgotQGVuZCBpZnNldAotCi1AaWZzZXQgRUxGCi1AaXRlbSAuY29weXJpZ2h0ICJAdmFye3N0cmluZ30iCi1JbiB0aGUgRUxGIG9iamVjdCBmb3JtYXQsIGluc2VydCBAdmFye3N0cmluZ30gaW50byB0aGUgb2JqZWN0IGNvZGUsIG1hcmtlZCBhcyBhCi12ZXJzaW9uIHN0cmluZy4KLUBlbmQgaWZzZXQKLQotQGl0ZW0gLmVudGVyCi1Ob3QgeWV0IHN1cHBvcnRlZDsgdGhlIGFzc2VtYmxlciByZWplY3RzIHByb2dyYW1zIGNvbnRhaW5pbmcgdGhpcyBkaXJlY3RpdmUuCi0KLUBpdGVtIC5lbnRyeQotTWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcHJvY2VkdXJlLgotCi1AaXRlbSAuZXhpdAotTWFyayB0aGUgZW5kIG9mIGEgcHJvY2VkdXJlLgotCi1AaXRlbSAuZXhwb3J0IEB2YXJ7bmFtZX0gWyAsQHZhcnt0eXB9IF0gIFsgLEB2YXJ7cGFyYW19PUB2YXJ7cn0gXQotTWFrZSBhIHByb2NlZHVyZSBAdmFye25hbWV9IGF2YWlsYWJsZSB0byBjYWxsZXJzLiAgQHZhcnt0eXB9LCBpZiBwcmVzZW50LCBtdXN0Ci1iZSBvbmUgb2YgQHNhbXB7YWJzb2x1dGV9LCBAc2FtcHtjb2RlfSAoRUxGIG9ubHksIG5vdCBTT00pLCBAc2FtcHtkYXRhfSwKLUBzYW1we2VudHJ5fSwgQHNhbXB7ZGF0YX0sIEBzYW1we2VudHJ5fSwgQHNhbXB7bWlsbGljb2RlfSwgQHNhbXB7cGxhYmVsfSwKLUBzYW1we3ByaV9wcm9nfSwgb3IgQHNhbXB7c2VjX3Byb2d9LgotCi1AdmFye3BhcmFtfSwgaWYgcHJlc2VudCwgcHJvdmlkZXMgZWl0aGVyIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZQotcHJvY2VkdXJlIGFyZ3VtZW50cyBhbmQgcmVzdWx0LCBvciBhIHByaXZpbGVnZSBsZXZlbC4gIEB2YXJ7cGFyYW19IG1heSBiZQotQHNhbXB7YXJnd0B2YXJ7bn19ICh3aGVyZSBAdmFye259IHJhbmdlcyBmcm9tIEBjb2RlezB9IHRvIEBjb2RlezN9LCBhbmQKLWluZGljYXRlcyBvbmUgb2YgZm91ciBvbmUtd29yZCBhcmd1bWVudHMpOyBAc2FtcHtydG52YWx9ICh0aGUgcHJvY2VkdXJlJ3MKLXJlc3VsdCk7IG9yIEBzYW1we3ByaXZfbGV2fSAocHJpdmlsZWdlIGxldmVsKS4gIEZvciBhcmd1bWVudHMgb3IgdGhlIHJlc3VsdCwKLUB2YXJ7cn0gc3BlY2lmaWVzIGhvdyB0byByZWxvY2F0ZSwgYW5kIG11c3QgYmUgb25lIG9mIEBzYW1we25vfSAobm90Ci1yZWxvY2F0YWJsZSksIEBzYW1we2dyfSAoYXJndW1lbnQgaXMgaW4gZ2VuZXJhbCByZWdpc3RlciksIEBzYW1we2ZyfSAoaW4KLWZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyKSwgb3IgQHNhbXB7ZnV9ICh1cHBlciBoYWxmIG9mIGZsb2F0IHJlZ2lzdGVyKS4KLUZvciBAc2FtcHtwcml2X2xldn0sIEB2YXJ7cn0gaXMgYW4gaW50ZWdlci4KLQotQGl0ZW0gLmhhbGYgQHZhcntufQotRGVmaW5lIGEgdHdvLWJ5dGUgaW50ZWdlciBjb25zdGFudCBAdmFye259OyBzeW5vbnltIGZvciB0aGUgcG9ydGFibGUKLUBjb2Rle0B2YWx1ZXtBU319IGRpcmVjdGl2ZSBAY29kZXsuc2hvcnR9LgotCi1AaXRlbSAuaW1wb3J0IEB2YXJ7bmFtZX0gWyAsQHZhcnt0eXB9IF0KLUNvbnZlcnNlIG9mIEBjb2Rley5leHBvcnR9OyBtYWtlIGEgcHJvY2VkdXJlIGF2YWlsYWJsZSB0byBjYWxsLiAgVGhlIGFyZ3VtZW50cwotdXNlIHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGZvciBAY29kZXsuZXhwb3J0fS4KLQotQGl0ZW0gLmxhYmVsIEB2YXJ7bmFtZX0KLURlZmluZSBAdmFye25hbWV9IGFzIGEgbGFiZWwgZm9yIHRoZSBjdXJyZW50IGFzc2VtYmx5IGxvY2F0aW9uLgotCi1AaXRlbSAubGVhdmUKLU5vdCB5ZXQgc3VwcG9ydGVkOyB0aGUgYXNzZW1ibGVyIHJlamVjdHMgcHJvZ3JhbXMgY29udGFpbmluZyB0aGlzIGRpcmVjdGl2ZS4KLQotQGl0ZW0gLm9yaWdpbiBAdmFye2xjfQotQWR2YW5jZSBsb2NhdGlvbiBjb3VudGVyIHRvIEB2YXJ7bGN9LiBTeW5vbnltIGZvciB0aGUgQGNvZGV7QHZhbHVle2FzfX0KLXBvcnRhYmxlIGRpcmVjdGl2ZSBAY29kZXsub3JnfS4KLQotQGl0ZW0gLnBhcmFtIEB2YXJ7bmFtZX0gWyAsQHZhcnt0eXB9IF0gIFsgLEB2YXJ7cGFyYW19PUB2YXJ7cn0gXQotQGMgTm90IGluIEhQIG1hbnVhbDsgQHNje2dudX0gSFBQQSBleHRlbnNpb24KLVNpbWlsYXIgdG8gQGNvZGV7LmV4cG9ydH0sIGJ1dCB1c2VkIGZvciBzdGF0aWMgcHJvY2VkdXJlcy4KLQotQGl0ZW0gLnByb2MKLVVzZSBwcmVjZWRpbmcgdGhlIGZpcnN0IHN0YXRlbWVudCBvZiBhIHByb2NlZHVyZS4KLQotQGl0ZW0gLnByb2NlbmQKLVVzZSBmb2xsb3dpbmcgdGhlIGxhc3Qgc3RhdGVtZW50IG9mIGEgcHJvY2VkdXJlLgotCi1AaXRlbSBAdmFye2xhYmVsfSAucmVnIEB2YXJ7ZXhwcn0KLUBjID8/IE5vdCBpbiBIUCBtYW51YWwgKEphbiAxOTg4IHZuKQotU3lub255bSBmb3IgQGNvZGV7LmVxdX07IGRlZmluZSBAdmFye2xhYmVsfSB3aXRoIHRoZSBhYnNvbHV0ZSBleHByZXNzaW9uCi1AdmFye2V4cHJ9IGFzIGl0cyB2YWx1ZS4KLQotQGl0ZW0gLnNwYWNlIEB2YXJ7c2VjbmFtZX0gWyAsQHZhcntwYXJhbXN9IF0KLVN3aXRjaCB0byBzZWN0aW9uIEB2YXJ7c2VjbmFtZX0sIGNyZWF0aW5nIGEgbmV3IHNlY3Rpb24gYnkgdGhhdCBuYW1lIGlmCi1uZWNlc3NhcnkuICBZb3UgbWF5IG9ubHkgdXNlIEB2YXJ7cGFyYW1zfSB3aGVuIGNyZWF0aW5nIGEgbmV3IHNlY3Rpb24sIG5vdAotd2hlbiBzd2l0Y2hpbmcgdG8gYW4gZXhpc3Rpbmcgb25lLiAgQHZhcntzZWNuYW1lfSBtYXkgaWRlbnRpZnkgYSBzZWN0aW9uIGJ5Ci1udW1iZXIgcmF0aGVyIHRoYW4gYnkgbmFtZS4KLQotSWYgc3BlY2lmaWVkLCB0aGUgbGlzdCBAdmFye3BhcmFtc30gZGVjbGFyZXMgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbiwKLWlkZW50aWZpZWQgYnkga2V5d29yZHMuICBUaGUga2V5d29yZHMgcmVjb2duaXplZCBhcmUgQHNhbXB7c3BudW09QHZhcntleHB9fQotKGlkZW50aWZ5IHRoaXMgc2VjdGlvbiBieSB0aGUgbnVtYmVyIEB2YXJ7ZXhwfSwgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiksCi1Ac2FtcHtzb3J0PUB2YXJ7ZXhwfX0gKG9yZGVyIHNlY3Rpb25zIGFjY29yZGluZyB0byB0aGlzIHNvcnQga2V5IHdoZW4gbGlua2luZzsKLUB2YXJ7ZXhwfSBpcyBhbiBhYnNvbHV0ZSBleHByZXNzaW9uKSwgQHNhbXB7dW5sb2FkYWJsZX0gKHNlY3Rpb24gY29udGFpbnMgbm8KLWxvYWRhYmxlIGRhdGEpLCBAc2FtcHtub3RkZWZpbmVkfSAodGhpcyBzZWN0aW9uIGRlZmluZWQgZWxzZXdoZXJlKSwgYW5kCi1Ac2FtcHtwcml2YXRlfSAoZGF0YSBpbiB0aGlzIHNlY3Rpb24gbm90IGF2YWlsYWJsZSB0byBvdGhlciBwcm9ncmFtcykuCi0KLUBpdGVtIC5zcG51bSBAdmFye3NlY25hbX0KLUBjID8/IE5vdCBpbiBIUCBtYW51YWwgKEphbiAxOTg4KQotQWxsb2NhdGUgZm91ciBieXRlcyBvZiBzdG9yYWdlLCBhbmQgaW5pdGlhbGl6ZSB0aGVtIHdpdGggdGhlIHNlY3Rpb24gbnVtYmVyIG9mCi10aGUgc2VjdGlvbiBuYW1lZCBAdmFye3NlY25hbX0uICAoWW91IGNhbiBkZWZpbmUgdGhlIHNlY3Rpb24gbnVtYmVyIHdpdGggdGhlCi1IUFBBIEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLikKLQotQGNpbmRleCBAY29kZXtzdHJpbmd9IGRpcmVjdGl2ZSBvbiBIUFBBCi1AaXRlbSAuc3RyaW5nICJAdmFye3N0cn0iCi1Db3B5IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgQHZhcntzdHJ9IHRvIHRoZSBvYmplY3QgZmlsZS4KLUB4cmVme1N0cmluZ3MsLFN0cmluZ3N9LCBmb3IgaW5mb3JtYXRpb24gb24gZXNjYXBlIHNlcXVlbmNlcyB5b3UgY2FuIHVzZSBpbgotQGNvZGV7QHZhbHVle0FTfX0gc3RyaW5ncy4KLQotQGVtcGh7V2FybmluZyF9IFRoZSBIUFBBIHZlcnNpb24gb2YgQGNvZGV7LnN0cmluZ30gZGlmZmVycyBmcm9tIHRoZQotdXN1YWwgQGNvZGV7QHZhbHVle0FTfX0gZGVmaW5pdGlvbjogaXQgZG9lcyBAZW1waHtub3R9IHdyaXRlIGEgemVybyBieXRlCi1hZnRlciBjb3B5aW5nIEB2YXJ7c3RyfS4KLQotQGl0ZW0gLnN0cmluZ3ogIkB2YXJ7c3RyfSIKLUxpa2UgQGNvZGV7LnN0cmluZ30sIGJ1dCBhcHBlbmRzIGEgemVybyBieXRlIGFmdGVyIGNvcHlpbmcgQHZhcntzdHJ9IHRvIG9iamVjdAotZmlsZS4KLQotQGl0ZW0gLnN1YnNwYSBAdmFye25hbWV9IFsgLEB2YXJ7cGFyYW1zfSBdCi1AaXRlbXggLm5zdWJzcGEgQHZhcntuYW1lfSBbICxAdmFye3BhcmFtc30gXQotU2ltaWxhciB0byBAY29kZXsuc3BhY2V9LCBidXQgc2VsZWN0cyBhIHN1YnNlY3Rpb24gQHZhcntuYW1lfSB3aXRoaW4gdGhlCi1jdXJyZW50IHNlY3Rpb24uICBZb3UgbWF5IG9ubHkgc3BlY2lmeSBAdmFye3BhcmFtc30gd2hlbiB5b3UgY3JlYXRlIGEKLXN1YnNlY3Rpb24gKGluIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBAY29kZXsuc3Vic3BhfSBmb3IgdGhpcyBAdmFye25hbWV9KS4KLQotSWYgc3BlY2lmaWVkLCB0aGUgbGlzdCBAdmFye3BhcmFtc30gZGVjbGFyZXMgYXR0cmlidXRlcyBvZiB0aGUgc3Vic2VjdGlvbiwKLWlkZW50aWZpZWQgYnkga2V5d29yZHMuICBUaGUga2V5d29yZHMgcmVjb2duaXplZCBhcmUgQHNhbXB7cXVhZD1AdmFye2V4cHJ9fQotKGBgcXVhZHJhbnQnJyBmb3IgdGhpcyBzdWJzZWN0aW9uKSwgQHNhbXB7YWxpZ249QHZhcntleHByfX0gKGFsaWdubWVudCBmb3IKLWJlZ2lubmluZyBvZiB0aGlzIHN1YnNlY3Rpb247IGEgcG93ZXIgb2YgdHdvKSwgQHNhbXB7YWNjZXNzPUB2YXJ7ZXhwcn19ICh2YWx1ZQotZm9yIGBgYWNjZXNzIHJpZ2h0cycnIGZpZWxkKSwgQHNhbXB7c29ydD1AdmFye2V4cHJ9fSAoc29ydGluZyBvcmRlciBmb3IgdGhpcwotc3Vic3BhY2UgaW4gbGluayksIEBzYW1we2NvZGVfb25seX0gKHN1YnNlY3Rpb24gY29udGFpbnMgb25seSBjb2RlKSwKLUBzYW1we3VubG9hZGFibGV9IChzdWJzZWN0aW9uIGNhbm5vdCBiZSBsb2FkZWQgaW50byBtZW1vcnkpLCBAc2FtcHtjb21tb259Ci0oc3Vic2VjdGlvbiBpcyBjb21tb24gYmxvY2spLCBAc2FtcHtkdXBfY29tbX0gKGluaXRpYWxpemVkIGRhdGEgbWF5IGhhdmUKLWR1cGxpY2F0ZSBuYW1lcyksIG9yIEBzYW1we3plcm99IChzdWJzZWN0aW9uIGlzIGFsbCB6ZXJvcywgZG8gbm90IHdyaXRlIGluCi1vYmplY3QgZmlsZSkuCi0KLUBjb2Rley5uc3Vic3BhfSBhbHdheXMgY3JlYXRlcyBhIG5ldyBzdWJzcGFjZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBldmVuCi1pZiBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotCi1AaXRlbSAudmVyc2lvbiAiQHZhcntzdHJ9IgotV3JpdGUgQHZhcntzdHJ9IGFzIHZlcnNpb24gaWRlbnRpZmllciBpbiBvYmplY3QgY29kZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgSFBQQSBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEhQUEEgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7UEEtUklTQyBBcmNoaXRlY3R1cmUgYW5kIEluc3RydWN0aW9uIFNldCBSZWZlcmVuY2UgTWFudWFsfSAKLShIUCAwOTc0MC05MDAzOSkuCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaTM4Ni50ZXhpIGIvZ2FzL2RvYy9jLWkzODYudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3ODkzYi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaTM4Ni50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIGkzODYtRGVwZW5kZW50Ci1AY2hhcHRlciA4MDM4NiBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciA4MDM4NiBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IGkzODYgc3VwcG9ydAotQGNpbmRleCBpODAzMDYgc3VwcG9ydAotQG1lbnUKLSogaTM4Ni1PcHRpb25zOjogICAgICAgICAgICAgICAgT3B0aW9ucwotKiBpMzg2LVN5bnRheDo6ICAgICAgICAgICAgICAgICBBVCZUIFN5bnRheCB2ZXJzdXMgSW50ZWwgU3ludGF4Ci0qIGkzODYtTW5lbW9uaWNzOjogICAgICAgICAgICAgIEluc3RydWN0aW9uIE5hbWluZwotKiBpMzg2LVJlZ3M6OiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1pbmcKLSogaTM4Ni1QcmVmaXhlczo6ICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gUHJlZml4ZXMKLSogaTM4Ni1NZW1vcnk6OiAgICAgICAgICAgICAgICAgTWVtb3J5IFJlZmVyZW5jZXMKLSogaTM4Ni1qdW1wczo6ICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgb2YgSnVtcCBJbnN0cnVjdGlvbnMKLSogaTM4Ni1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogaTM4Ni1TSU1EOjogICAgICAgICAgICAgICAgICAgSW50ZWwncyBNTVggYW5kIEFNRCdzIDNETm93ISBTSU1EIE9wZXJhdGlvbnMKLSogaTM4Ni0xNmJpdDo6ICAgICAgICAgICAgICAgICAgV3JpdGluZyAxNi1iaXQgQ29kZQotKiBpMzg2LUJ1Z3M6OiAgICAgICAgICAgICAgICAgICBBVCZUIFN5bnRheCBidWdzCi0qIGkzODYtTm90ZXM6OiAgICAgICAgICAgICAgICAgIE5vdGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgaTM4Ni1PcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucyBmb3IgaTM4NiAobm9uZSkKLUBjaW5kZXggaTM4NiBvcHRpb25zIChub25lKQotVGhlIDgwMzg2IGhhcyBubyBtYWNoaW5lIGRlcGVuZGVudCBvcHRpb25zLgotCi1Abm9kZSBpMzg2LVN5bnRheAotQHNlY3Rpb24gQVQmVCBTeW50YXggdmVyc3VzIEludGVsIFN5bnRheAotCi1AY2luZGV4IGkzODYgc3ludGF4IGNvbXBhdGliaWxpdHkKLUBjaW5kZXggc3ludGF4IGNvbXBhdGliaWxpdHksIGkzODYKLUluIG9yZGVyIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb3V0cHV0IG9mIEBjb2Rle0B2YWx1ZXtHQ0N9fSwKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIEFUJlQgU3lzdGVtIFYvMzg2IGFzc2VtYmxlciBzeW50YXguICBUaGlzIGlzIHF1aXRlCi1kaWZmZXJlbnQgZnJvbSBJbnRlbCBzeW50YXguICBXZSBtZW50aW9uIHRoZXNlIGRpZmZlcmVuY2VzIGJlY2F1c2UKLWFsbW9zdCBhbGwgODAzODYgZG9jdW1lbnRzIHVzZSBJbnRlbCBzeW50YXguICBOb3RhYmxlIGRpZmZlcmVuY2VzCi1iZXR3ZWVuIHRoZSB0d28gc3ludGF4ZXMgYXJlOgotCi1AY2luZGV4IGltbWVkaWF0ZSBvcGVyYW5kcywgaTM4NgotQGNpbmRleCBpMzg2IGltbWVkaWF0ZSBvcGVyYW5kcwotQGNpbmRleCByZWdpc3RlciBvcGVyYW5kcywgaTM4NgotQGNpbmRleCBpMzg2IHJlZ2lzdGVyIG9wZXJhbmRzCi1AY2luZGV4IGp1bXAvY2FsbCBvcGVyYW5kcywgaTM4NgotQGNpbmRleCBpMzg2IGp1bXAvY2FsbCBvcGVyYW5kcwotQGNpbmRleCBvcGVyYW5kIGRlbGltaXRlcnMsIGkzODYKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1BVCZUIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgcHJlY2VkZWQgYnkgQHNhbXB7JH07IEludGVsIGltbWVkaWF0ZQotb3BlcmFuZHMgYXJlIHVuZGVsaW1pdGVkIChJbnRlbCBAc2FtcHtwdXNoIDR9IGlzIEFUJlQgQHNhbXB7cHVzaGwgJDR9KS4KLUFUJlQgcmVnaXN0ZXIgb3BlcmFuZHMgYXJlIHByZWNlZGVkIGJ5IEBzYW1weyV9OyBJbnRlbCByZWdpc3RlciBvcGVyYW5kcwotYXJlIHVuZGVsaW1pdGVkLiAgQVQmVCBhYnNvbHV0ZSAoYXMgb3Bwb3NlZCB0byBQQyByZWxhdGl2ZSkganVtcC9jYWxsCi1vcGVyYW5kcyBhcmUgcHJlZml4ZWQgYnkgQHNhbXB7Kn07IHRoZXkgYXJlIHVuZGVsaW1pdGVkIGluIEludGVsIHN5bnRheC4KLQotQGNpbmRleCBpMzg2IHNvdXJjZSwgZGVzdGluYXRpb24gb3BlcmFuZHMKLUBjaW5kZXggc291cmNlLCBkZXN0aW5hdGlvbiBvcGVyYW5kczsgaTM4NgotQGl0ZW0KLUFUJlQgYW5kIEludGVsIHN5bnRheCB1c2UgdGhlIG9wcG9zaXRlIG9yZGVyIGZvciBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCi1vcGVyYW5kcy4gIEludGVsIEBzYW1we2FkZCBlYXgsIDR9IGlzIEBzYW1we2FkZGwgJDQsICVlYXh9LiAgVGhlCi1Ac2FtcHtzb3VyY2UsIGRlc3R9IGNvbnZlbnRpb24gaXMgbWFpbnRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi1wcmV2aW91cyBVbml4IGFzc2VtYmxlcnMuICBOb3RlIHRoYXQgaW5zdHJ1Y3Rpb25zIHdpdGggbW9yZSB0aGFuIG9uZQotc291cmNlIG9wZXJhbmQsIHN1Y2ggYXMgdGhlIEBzYW1we2VudGVyfSBpbnN0cnVjdGlvbiwgZG8gQGVtcGh7bm90fSBoYXZlCi1yZXZlcnNlZCBvcmRlci4gIEByZWZ7aTM4Ni1CdWdzfS4KLQotQGNpbmRleCBtbmVtb25pYyBzdWZmaXhlcywgaTM4NgotQGNpbmRleCBzaXplcyBvcGVyYW5kcywgaTM4NgotQGNpbmRleCBpMzg2IHNpemUgc3VmZml4ZXMKLUBpdGVtCi1JbiBBVCZUIHN5bnRheCB0aGUgc2l6ZSBvZiBtZW1vcnkgb3BlcmFuZHMgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBsYXN0Ci1jaGFyYWN0ZXIgb2YgdGhlIGluc3RydWN0aW9uIG1uZW1vbmljLiAgTW5lbW9uaWMgc3VmZml4ZXMgb2YgQHNhbXB7Yn0sCi1Ac2FtcHt3fSwgYW5kIEBzYW1we2x9IHNwZWNpZnkgYnl0ZSAoOC1iaXQpLCB3b3JkICgxNi1iaXQpLCBhbmQgbG9uZwotKDMyLWJpdCkgbWVtb3J5IHJlZmVyZW5jZXMuICBJbnRlbCBzeW50YXggYWNjb21wbGlzaGVzIHRoaXMgYnkgcHJlZml4aW5nCi1tZW1vcnkgb3BlcmFuZHMgKEBlbXBoe25vdH0gdGhlIGluc3RydWN0aW9uIG1uZW1vbmljcykgd2l0aCBAc2FtcHtieXRlCi1wdHJ9LCBAc2FtcHt3b3JkIHB0cn0sIGFuZCBAc2FtcHtkd29yZCBwdHJ9LiAgVGh1cywgSW50ZWwgQHNhbXB7bW92IGFsLAotYnl0ZSBwdHIgQHZhcntmb299fSBpcyBAc2FtcHttb3ZiIEB2YXJ7Zm9vfSwgJWFsfSBpbiBBVCZUIHN5bnRheC4KLQotQGNpbmRleCByZXR1cm4gaW5zdHJ1Y3Rpb25zLCBpMzg2Ci1AY2luZGV4IGkzODYganVtcCwgY2FsbCwgcmV0dXJuCi1AaXRlbQotSW1tZWRpYXRlIGZvcm0gbG9uZyBqdW1wcyBhbmQgY2FsbHMgYXJlCi1Ac2FtcHtsY2FsbC9sam1wICRAdmFye3NlY3Rpb259LCAkQHZhcntvZmZzZXR9fSBpbiBBVCZUIHN5bnRheDsgdGhlCi1JbnRlbCBzeW50YXggaXMKLUBzYW1we2NhbGwvam1wIGZhciBAdmFye3NlY3Rpb259OkB2YXJ7b2Zmc2V0fX0uICBBbHNvLCB0aGUgZmFyIHJldHVybgotaW5zdHJ1Y3Rpb24KLWlzIEBzYW1we2xyZXQgJEB2YXJ7c3RhY2stYWRqdXN0fX0gaW4gQVQmVCBzeW50YXg7IEludGVsIHN5bnRheCBpcwotQHNhbXB7cmV0IGZhciBAdmFye3N0YWNrLWFkanVzdH19LgotCi1AY2luZGV4IHNlY3Rpb25zLCBpMzg2Ci1AY2luZGV4IGkzODYgc2VjdGlvbnMKLUBpdGVtCi1UaGUgQVQmVCBhc3NlbWJsZXIgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciBtdWx0aXBsZSBzZWN0aW9uCi1wcm9ncmFtcy4gIFVuaXggc3R5bGUgc3lzdGVtcyBleHBlY3QgYWxsIHByb2dyYW1zIHRvIGJlIHNpbmdsZSBzZWN0aW9ucy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBpMzg2LU1uZW1vbmljcwotQHNlY3Rpb24gSW5zdHJ1Y3Rpb24gTmFtaW5nCi0KLUBjaW5kZXggaTM4NiBpbnN0cnVjdGlvbiBuYW1pbmcKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gbmFtaW5nLCBpMzg2Ci1JbnN0cnVjdGlvbiBtbmVtb25pY3MgYXJlIHN1ZmZpeGVkIHdpdGggb25lIGNoYXJhY3RlciBtb2RpZmllcnMgd2hpY2gKLXNwZWNpZnkgdGhlIHNpemUgb2Ygb3BlcmFuZHMuICBUaGUgbGV0dGVycyBAc2FtcHtifSwgQHNhbXB7d30sIGFuZAotQHNhbXB7bH0gc3BlY2lmeSBieXRlLCB3b3JkLCBhbmQgbG9uZyBvcGVyYW5kcy4gIElmIG5vIHN1ZmZpeCBpcwotc3BlY2lmaWVkIGJ5IGFuIGluc3RydWN0aW9uIHRoZW4gQGNvZGV7QHZhbHVle0FTfX0gdHJpZXMgdG8gZmlsbCBpbiB0aGUKLW1pc3Npbmcgc3VmZml4IGJhc2VkIG9uIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBvcGVyYW5kICh0aGUgbGFzdCBvbmUKLWJ5IGNvbnZlbnRpb24pLiAgVGh1cywgQHNhbXB7bW92ICVheCwgJWJ4fSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdncKLSVheCwgJWJ4fTsgYWxzbywgQHNhbXB7bW92ICQxLCAlYnh9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7bW92dyAkMSwKLSVieH0uICBOb3RlIHRoYXQgdGhpcyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQVQmVCBVbml4IGFzc2VtYmxlciB3aGljaAotYXNzdW1lcyB0aGF0IGEgbWlzc2luZyBtbmVtb25pYyBzdWZmaXggaW1wbGllcyBsb25nIG9wZXJhbmQgc2l6ZS4gIChUaGlzCi1pbmNvbXBhdGliaWxpdHkgZG9lcyBub3QgYWZmZWN0IGNvbXBpbGVyIG91dHB1dCBzaW5jZSBjb21waWxlcnMgYWx3YXlzCi1leHBsaWNpdGx5IHNwZWNpZnkgdGhlIG1uZW1vbmljIHN1ZmZpeC4pCi0KLUFsbW9zdCBhbGwgaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIHNhbWUgbmFtZXMgaW4gQVQmVCBhbmQgSW50ZWwgZm9ybWF0LgotVGhlcmUgYXJlIGEgZmV3IGV4Y2VwdGlvbnMuICBUaGUgc2lnbiBleHRlbmQgYW5kIHplcm8gZXh0ZW5kCi1pbnN0cnVjdGlvbnMgbmVlZCB0d28gc2l6ZXMgdG8gc3BlY2lmeSB0aGVtLiAgVGhleSBuZWVkIGEgc2l6ZSB0bwotc2lnbi96ZXJvIGV4dGVuZCBAZW1waHtmcm9tfSBhbmQgYSBzaXplIHRvIHplcm8gZXh0ZW5kIEBlbXBoe3RvfS4gIFRoaXMKLWlzIGFjY29tcGxpc2hlZCBieSB1c2luZyB0d28gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgaW4gQVQmVAotc3ludGF4LiAgQmFzZSBuYW1lcyBmb3Igc2lnbiBleHRlbmQgYW5kIHplcm8gZXh0ZW5kIGFyZQotQHNhbXB7bW92c0Bkb3Rze319IGFuZCBAc2FtcHttb3Z6QGRvdHN7fX0gaW4gQVQmVCBzeW50YXggKEBzYW1we21vdnN4fQotYW5kIEBzYW1we21vdnp4fSBpbiBJbnRlbCBzeW50YXgpLiAgVGhlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzCi1hcmUgdGFja2VkIG9uIHRvIHRoaXMgYmFzZSBuYW1lLCB0aGUgQGVtcGh7ZnJvbX0gc3VmZml4IGJlZm9yZSB0aGUKLUBlbXBoe3RvfSBzdWZmaXguICBUaHVzLCBAc2FtcHttb3ZzYmwgJWFsLCAlZWR4fSBpcyBBVCZUIHN5bnRheCBmb3IKLWBgbW92ZSBzaWduIGV4dGVuZCBAZW1waHtmcm9tfSAlYWwgQGVtcGh7dG99ICVlZHguJycgIFBvc3NpYmxlIHN1ZmZpeGVzLAotdGh1cywgYXJlIEBzYW1we2JsfSAoZnJvbSBieXRlIHRvIGxvbmcpLCBAc2FtcHtid30gKGZyb20gYnl0ZSB0byB3b3JkKSwKLWFuZCBAc2FtcHt3bH0gKGZyb20gd29yZCB0byBsb25nKS4KLQotQGNpbmRleCBjb252ZXJzaW9uIGluc3RydWN0aW9ucywgaTM4NgotQGNpbmRleCBpMzg2IGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb25zCi1UaGUgSW50ZWwtc3ludGF4IGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb25zCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Ac2FtcHtjYnd9IC0tLSBzaWduLWV4dGVuZCBieXRlIGluIEBzYW1weyVhbH0gdG8gd29yZCBpbiBAc2FtcHslYXh9LAotCi1AaXRlbQotQHNhbXB7Y3dkZX0gLS0tIHNpZ24tZXh0ZW5kIHdvcmQgaW4gQHNhbXB7JWF4fSB0byBsb25nIGluIEBzYW1weyVlYXh9LAotCi1AaXRlbQotQHNhbXB7Y3dkfSAtLS0gc2lnbi1leHRlbmQgd29yZCBpbiBAc2FtcHslYXh9IHRvIGxvbmcgaW4gQHNhbXB7JWR4OiVheH0sCi0KLUBpdGVtCi1Ac2FtcHtjZHF9IC0tLSBzaWduLWV4dGVuZCBkd29yZCBpbiBAc2FtcHslZWF4fSB0byBxdWFkIGluIEBzYW1weyVlZHg6JWVheH0sCi1AZW5kIGl0ZW1pemUKLQotQG5vaW5kZW50Ci1hcmUgY2FsbGVkIEBzYW1we2NidHd9LCBAc2FtcHtjd3RsfSwgQHNhbXB7Y3d0ZH0sIGFuZCBAc2FtcHtjbHRkfSBpbgotQVQmVCBuYW1pbmcuICBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGVpdGhlciBuYW1pbmcgZm9yIHRoZXNlIGluc3RydWN0aW9ucy4KLQotQGNpbmRleCBqdW1wIGluc3RydWN0aW9ucywgaTM4NgotQGNpbmRleCBjYWxsIGluc3RydWN0aW9ucywgaTM4NgotRmFyIGNhbGwvanVtcCBpbnN0cnVjdGlvbnMgYXJlIEBzYW1we2xjYWxsfSBhbmQgQHNhbXB7bGptcH0gaW4KLUFUJlQgc3ludGF4LCBidXQgYXJlIEBzYW1we2NhbGwgZmFyfSBhbmQgQHNhbXB7anVtcCBmYXJ9IGluIEludGVsCi1jb252ZW50aW9uLgotCi1Abm9kZSBpMzg2LVJlZ3MKLUBzZWN0aW9uIFJlZ2lzdGVyIE5hbWluZwotCi1AY2luZGV4IGkzODYgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgaTM4NgotUmVnaXN0ZXIgb3BlcmFuZHMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoIEBzYW1weyV9LiAgVGhlIDgwMzg2IHJlZ2lzdGVycwotY29uc2lzdCBvZgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIDggMzItYml0IHJlZ2lzdGVycyBAc2FtcHslZWF4fSAodGhlIGFjY3VtdWxhdG9yKSwgQHNhbXB7JWVieH0sCi1Ac2FtcHslZWN4fSwgQHNhbXB7JWVkeH0sIEBzYW1weyVlZGl9LCBAc2FtcHslZXNpfSwgQHNhbXB7JWVicH0gKHRoZQotZnJhbWUgcG9pbnRlciksIGFuZCBAc2FtcHslZXNwfSAodGhlIHN0YWNrIHBvaW50ZXIpLgotCi1AaXRlbQotdGhlIDggMTYtYml0IGxvdy1lbmRzIG9mIHRoZXNlOiBAc2FtcHslYXh9LCBAc2FtcHslYnh9LCBAc2FtcHslY3h9LAotQHNhbXB7JWR4fSwgQHNhbXB7JWRpfSwgQHNhbXB7JXNpfSwgQHNhbXB7JWJwfSwgYW5kIEBzYW1weyVzcH0uCi0KLUBpdGVtCi10aGUgOCA4LWJpdCByZWdpc3RlcnM6IEBzYW1weyVhaH0sIEBzYW1weyVhbH0sIEBzYW1weyViaH0sCi1Ac2FtcHslYmx9LCBAc2FtcHslY2h9LCBAc2FtcHslY2x9LCBAc2FtcHslZGh9LCBhbmQgQHNhbXB7JWRsfSAoVGhlc2UKLWFyZSB0aGUgaGlnaC1ieXRlcyBhbmQgbG93LWJ5dGVzIG9mIEBzYW1weyVheH0sIEBzYW1weyVieH0sCi1Ac2FtcHslY3h9LCBhbmQgQHNhbXB7JWR4fSkKLQotQGl0ZW0KLXRoZSA2IHNlY3Rpb24gcmVnaXN0ZXJzIEBzYW1weyVjc30gKGNvZGUgc2VjdGlvbiksIEBzYW1weyVkc30KLShkYXRhIHNlY3Rpb24pLCBAc2FtcHslc3N9IChzdGFjayBzZWN0aW9uKSwgQHNhbXB7JWVzfSwgQHNhbXB7JWZzfSwKLWFuZCBAc2FtcHslZ3N9LgotCi1AaXRlbQotdGhlIDMgcHJvY2Vzc29yIGNvbnRyb2wgcmVnaXN0ZXJzIEBzYW1weyVjcjB9LCBAc2FtcHslY3IyfSwgYW5kCi1Ac2FtcHslY3IzfS4KLQotQGl0ZW0KLXRoZSA2IGRlYnVnIHJlZ2lzdGVycyBAc2FtcHslZGIwfSwgQHNhbXB7JWRiMX0sIEBzYW1weyVkYjJ9LAotQHNhbXB7JWRiM30sIEBzYW1weyVkYjZ9LCBhbmQgQHNhbXB7JWRiN30uCi0KLUBpdGVtCi10aGUgMiB0ZXN0IHJlZ2lzdGVycyBAc2FtcHsldHI2fSBhbmQgQHNhbXB7JXRyN30uCi0KLUBpdGVtCi10aGUgOCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzdGFjayBAc2FtcHslc3R9IG9yIGVxdWl2YWxlbnRseQotQHNhbXB7JXN0KDApfSwgQHNhbXB7JXN0KDEpfSwgQHNhbXB7JXN0KDIpfSwgQHNhbXB7JXN0KDMpfSwKLUBzYW1weyVzdCg0KX0sIEBzYW1weyVzdCg1KX0sIEBzYW1weyVzdCg2KX0sIGFuZCBAc2FtcHslc3QoNyl9LgotQGVuZCBpdGVtaXplCi0KLUBub2RlIGkzODYtUHJlZml4ZXMKLUBzZWN0aW9uIEluc3RydWN0aW9uIFByZWZpeGVzCi0KLUBjaW5kZXggaTM4NiBpbnN0cnVjdGlvbiBwcmVmaXhlcwotQGNpbmRleCBpbnN0cnVjdGlvbiBwcmVmaXhlcywgaTM4NgotQGNpbmRleCBwcmVmaXhlcywgaTM4NgotSW5zdHJ1Y3Rpb24gcHJlZml4ZXMgYXJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uICBUaGV5Ci1hcmUgdXNlZCB0byByZXBlYXQgc3RyaW5nIGluc3RydWN0aW9ucywgdG8gcHJvdmlkZSBzZWN0aW9uIG92ZXJyaWRlcywgdG8KLXBlcmZvcm0gYnVzIGxvY2sgb3BlcmF0aW9ucywgYW5kIHRvIGNoYW5nZSBvcGVyYW5kIGFuZCBhZGRyZXNzIHNpemVzLgotKE1vc3QgaW5zdHJ1Y3Rpb25zIHRoYXQgbm9ybWFsbHkgb3BlcmF0ZSBvbiAzMi1iaXQgb3BlcmFuZHMgd2lsbCB1c2UKLTE2LWJpdCBvcGVyYW5kcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGFuIGBgb3BlcmFuZCBzaXplJycgcHJlZml4LikKLUluc3RydWN0aW9uIHByZWZpeGVzIGFyZSBiZXN0IHdyaXR0ZW4gb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaW5zdHJ1Y3Rpb24KLXRoZXkgYWN0IHVwb24uIEZvciBleGFtcGxlLCB0aGUgQHNhbXB7c2Nhc30gKHNjYW4gc3RyaW5nKSBpbnN0cnVjdGlvbiBpcwotcmVwZWF0ZWQgd2l0aDoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICByZXBuZSBzY2FzICVlczooJWVkaSksJWFsCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Zb3UgbWF5IGFsc28gcGxhY2UgcHJlZml4ZXMgb24gdGhlIGxpbmVzIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUKLWluc3RydWN0aW9uLCBidXQgdGhpcyBjaXJjdW12ZW50cyBjaGVja3MgdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzCi13aXRoIHByZWZpeGVzLCBhbmQgd2lsbCBub3Qgd29yayB3aXRoIGFsbCBwcmVmaXhlcy4KLQotSGVyZSBpcyBhIGxpc3Qgb2YgaW5zdHJ1Y3Rpb24gcHJlZml4ZXM6Ci0KLUBjaW5kZXggc2VjdGlvbiBvdmVycmlkZSBwcmVmaXhlcywgaTM4NgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVNlY3Rpb24gb3ZlcnJpZGUgcHJlZml4ZXMgQHNhbXB7Y3N9LCBAc2FtcHtkc30sIEBzYW1we3NzfSwgQHNhbXB7ZXN9LAotQHNhbXB7ZnN9LCBAc2FtcHtnc30uICBUaGVzZSBhcmUgYXV0b21hdGljYWxseSBhZGRlZCBieSBzcGVjaWZ5aW5nCi11c2luZyB0aGUgQHZhcntzZWN0aW9ufTpAdmFye21lbW9yeS1vcGVyYW5kfSBmb3JtIGZvciBtZW1vcnkgcmVmZXJlbmNlcy4KLQotQGNpbmRleCBzaXplIHByZWZpeGVzLCBpMzg2Ci1AaXRlbQotT3BlcmFuZC9BZGRyZXNzIHNpemUgcHJlZml4ZXMgQHNhbXB7ZGF0YTE2fSBhbmQgQHNhbXB7YWRkcjE2fQotY2hhbmdlIDMyLWJpdCBvcGVyYW5kcy9hZGRyZXNzZXMgaW50byAxNi1iaXQgb3BlcmFuZHMvYWRkcmVzc2VzLAotd2hpbGUgQHNhbXB7ZGF0YTMyfSBhbmQgQHNhbXB7YWRkcjMyfSBjaGFuZ2UgMTYtYml0IG9uZXMgKGluIGEKLUBjb2Rley5jb2RlMTZ9IHNlY3Rpb24pIGludG8gMzItYml0IG9wZXJhbmRzL2FkZHJlc3Nlcy4gIFRoZXNlIHByZWZpeGVzCi1AZW1waHttdXN0fSBhcHBlYXIgb24gdGhlIHNhbWUgbGluZSBvZiBjb2RlIGFzIHRoZSBpbnN0cnVjdGlvbiB0aGV5Ci1tb2RpZnkuIEZvciBleGFtcGxlLCBpbiBhIDE2LWJpdCBAY29kZXsuY29kZTE2fSBzZWN0aW9uLCB5b3UgbWlnaHQKLXdyaXRlOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIGFkZHIzMiBqbXBsICooJWVieCkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggYnVzIGxvY2sgcHJlZml4ZXMsIGkzODYKLUBjaW5kZXggaW5oaWJpdGluZyBpbnRlcnJ1cHRzLCBpMzg2Ci1AaXRlbQotVGhlIGJ1cyBsb2NrIHByZWZpeCBAc2FtcHtsb2NrfSBpbmhpYml0cyBpbnRlcnJ1cHRzIGR1cmluZyBleGVjdXRpb24gb2YKLXRoZSBpbnN0cnVjdGlvbiBpdCBwcmVjZWRlcy4gIChUaGlzIGlzIG9ubHkgdmFsaWQgd2l0aCBjZXJ0YWluCi1pbnN0cnVjdGlvbnM7IHNlZSBhIDgwMzg2IG1hbnVhbCBmb3IgZGV0YWlscykuCi0KLUBjaW5kZXggY29wcm9jZXNzb3Igd2FpdCwgaTM4NgotQGl0ZW0KLVRoZSB3YWl0IGZvciBjb3Byb2Nlc3NvciBwcmVmaXggQHNhbXB7d2FpdH0gd2FpdHMgZm9yIHRoZSBjb3Byb2Nlc3NvciB0bwotY29tcGxldGUgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIHNob3VsZCBuZXZlciBiZSBuZWVkZWQgZm9yIHRoZQotODAzODYvODAzODcgY29tYmluYXRpb24uCi0KLUBjaW5kZXggcmVwZWF0IHByZWZpeGVzLCBpMzg2Ci1AaXRlbQotVGhlIEBzYW1we3JlcH0sIEBzYW1we3JlcGV9LCBhbmQgQHNhbXB7cmVwbmV9IHByZWZpeGVzIGFyZSBhZGRlZAotdG8gc3RyaW5nIGluc3RydWN0aW9ucyB0byBtYWtlIHRoZW0gcmVwZWF0IEBzYW1weyVlY3h9IHRpbWVzIChAc2FtcHslY3h9Ci10aW1lcyBpZiB0aGUgY3VycmVudCBhZGRyZXNzIHNpemUgaXMgMTYtYml0cykuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgaTM4Ni1NZW1vcnkKLUBzZWN0aW9uIE1lbW9yeSBSZWZlcmVuY2VzCi0KLUBjaW5kZXggaTM4NiBtZW1vcnkgcmVmZXJlbmNlcwotQGNpbmRleCBtZW1vcnkgcmVmZXJlbmNlcywgaTM4NgotQW4gSW50ZWwgc3ludGF4IGluZGlyZWN0IG1lbW9yeSByZWZlcmVuY2Ugb2YgdGhlIGZvcm0KLQotQHNtYWxsZXhhbXBsZQotQHZhcntzZWN0aW9ufTpbQHZhcntiYXNlfSArIEB2YXJ7aW5kZXh9KkB2YXJ7c2NhbGV9ICsgQHZhcntkaXNwfV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotaXMgdHJhbnNsYXRlZCBpbnRvIHRoZSBBVCZUIHN5bnRheAotCi1Ac21hbGxleGFtcGxlCi1AdmFye3NlY3Rpb259OkB2YXJ7ZGlzcH0oQHZhcntiYXNlfSwgQHZhcntpbmRleH0sIEB2YXJ7c2NhbGV9KQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBAdmFye2Jhc2V9IGFuZCBAdmFye2luZGV4fSBhcmUgdGhlIG9wdGlvbmFsIDMyLWJpdCBiYXNlIGFuZAotaW5kZXggcmVnaXN0ZXJzLCBAdmFye2Rpc3B9IGlzIHRoZSBvcHRpb25hbCBkaXNwbGFjZW1lbnQsIGFuZAotQHZhcntzY2FsZX0sIHRha2luZyB0aGUgdmFsdWVzIDEsIDIsIDQsIGFuZCA4LCBtdWx0aXBsaWVzIEB2YXJ7aW5kZXh9Ci10byBjYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG9wZXJhbmQuICBJZiBubyBAdmFye3NjYWxlfSBpcwotc3BlY2lmaWVkLCBAdmFye3NjYWxlfSBpcyB0YWtlbiB0byBiZSAxLiAgQHZhcntzZWN0aW9ufSBzcGVjaWZpZXMgdGhlCi1vcHRpb25hbCBzZWN0aW9uIHJlZ2lzdGVyIGZvciB0aGUgbWVtb3J5IG9wZXJhbmQsIGFuZCBtYXkgb3ZlcnJpZGUgdGhlCi1kZWZhdWx0IHNlY3Rpb24gcmVnaXN0ZXIgKHNlZSBhIDgwMzg2IG1hbnVhbCBmb3Igc2VjdGlvbiByZWdpc3RlcgotZGVmYXVsdHMpLiBOb3RlIHRoYXQgc2VjdGlvbiBvdmVycmlkZXMgaW4gQVQmVCBzeW50YXggQGVtcGh7bXVzdH0KLWJlIHByZWNlZGVkIGJ5IGEgQHNhbXB7JX0uICBJZiB5b3Ugc3BlY2lmeSBhIHNlY3Rpb24gb3ZlcnJpZGUgd2hpY2gKLWNvaW5jaWRlcyB3aXRoIHRoZSBkZWZhdWx0IHNlY3Rpb24gcmVnaXN0ZXIsIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgQGVtcGh7bm90fQotb3V0cHV0IGFueSBzZWN0aW9uIHJlZ2lzdGVyIG92ZXJyaWRlIHByZWZpeGVzIHRvIGFzc2VtYmxlIHRoZSBnaXZlbgotaW5zdHJ1Y3Rpb24uICBUaHVzLCBzZWN0aW9uIG92ZXJyaWRlcyBjYW4gYmUgc3BlY2lmaWVkIHRvIGVtcGhhc2l6ZSB3aGljaAotc2VjdGlvbiByZWdpc3RlciBpcyB1c2VkIGZvciBhIGdpdmVuIG1lbW9yeSBvcGVyYW5kLgotCi1IZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIEludGVsIGFuZCBBVCZUIHN0eWxlIG1lbW9yeSByZWZlcmVuY2VzOgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIEFUJlQ6IEBzYW1wey00KCVlYnApfSwgSW50ZWw6ICBAc2FtcHtbZWJwIC0gNF19Ci1AdmFye2Jhc2V9IGlzIEBzYW1weyVlYnB9OyBAdmFye2Rpc3B9IGlzIEBzYW1wey00fS4gQHZhcntzZWN0aW9ufSBpcwotbWlzc2luZywgYW5kIHRoZSBkZWZhdWx0IHNlY3Rpb24gaXMgdXNlZCAoQHNhbXB7JXNzfSBmb3IgYWRkcmVzc2luZyB3aXRoCi1Ac2FtcHslZWJwfSBhcyB0aGUgYmFzZSByZWdpc3RlcikuICBAdmFye2luZGV4fSwgQHZhcntzY2FsZX0gYXJlIGJvdGggbWlzc2luZy4KLQotQGl0ZW0gQVQmVDogQHNhbXB7Zm9vKCwlZWF4LDQpfSwgSW50ZWw6IEBzYW1we1tmb28gKyBlYXgqNF19Ci1AdmFye2luZGV4fSBpcyBAc2FtcHslZWF4fSAoc2NhbGVkIGJ5IGEgQHZhcntzY2FsZX0gNCk7IEB2YXJ7ZGlzcH0gaXMKLUBzYW1we2Zvb30uICBBbGwgb3RoZXIgZmllbGRzIGFyZSBtaXNzaW5nLiAgVGhlIHNlY3Rpb24gcmVnaXN0ZXIgaGVyZQotZGVmYXVsdHMgdG8gQHNhbXB7JWRzfS4KLQotQGl0ZW0gQVQmVDogQHNhbXB7Zm9vKCwxKX07IEludGVsIEBzYW1we1tmb29dfQotVGhpcyB1c2VzIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IEBzYW1we2Zvb30gYXMgYSBtZW1vcnkgb3BlcmFuZC4KLU5vdGUgdGhhdCBAdmFye2Jhc2V9IGFuZCBAdmFye2luZGV4fSBhcmUgYm90aCBtaXNzaW5nLCBidXQgdGhlcmUgaXMgb25seQotQGVtcGh7b25lfSBAc2FtcHssfS4gIFRoaXMgaXMgYSBzeW50YWN0aWMgZXhjZXB0aW9uLgotCi1AaXRlbSBBVCZUOiBAc2FtcHslZ3M6Zm9vfTsgSW50ZWwgQHNhbXB7Z3M6Zm9vfQotVGhpcyBzZWxlY3RzIHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFibGUgQHNhbXB7Zm9vfSB3aXRoIHNlY3Rpb24KLXJlZ2lzdGVyIEB2YXJ7c2VjdGlvbn0gYmVpbmcgQHNhbXB7JWdzfS4KLUBlbmQgdGFibGUKLQotQWJzb2x1dGUgKGFzIG9wcG9zZWQgdG8gUEMgcmVsYXRpdmUpIGNhbGwgYW5kIGp1bXAgb3BlcmFuZHMgbXVzdCBiZQotcHJlZml4ZWQgd2l0aCBAc2FtcHsqfS4gIElmIG5vIEBzYW1weyp9IGlzIHNwZWNpZmllZCwgQGNvZGV7QHZhbHVle0FTfX0KLWFsd2F5cyBjaG9vc2VzIFBDIHJlbGF0aXZlIGFkZHJlc3NpbmcgZm9yIGp1bXAvY2FsbCBsYWJlbHMuCi0KLUFueSBpbnN0cnVjdGlvbiB0aGF0IGhhcyBhIG1lbW9yeSBvcGVyYW5kLCBidXQgbm8gcmVnaXN0ZXIgb3BlcmFuZCwKLUBlbXBoe211c3R9IHNwZWNpZnkgaXRzIHNpemUgKGJ5dGUsIHdvcmQsIG9yIGxvbmcpIHdpdGggYW4gaW5zdHJ1Y3Rpb24KLW1uZW1vbmljIHN1ZmZpeCAoQHNhbXB7Yn0sIEBzYW1we3d9LCBvciBAc2FtcHtsfSwgcmVzcGVjdGl2ZWx5KS4KLQotQG5vZGUgaTM4Ni1qdW1wcwotQHNlY3Rpb24gSGFuZGxpbmcgb2YgSnVtcCBJbnN0cnVjdGlvbnMKLQotQGNpbmRleCBqdW1wIG9wdGltaXphdGlvbiwgaTM4NgotQGNpbmRleCBpMzg2IGp1bXAgb3B0aW1pemF0aW9uCi1KdW1wIGluc3RydWN0aW9ucyBhcmUgYWx3YXlzIG9wdGltaXplZCB0byB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlCi1kaXNwbGFjZW1lbnRzLiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgYnl0ZSAoOC1iaXQpIGRpc3BsYWNlbWVudAotanVtcHMgd2hlbmV2ZXIgdGhlIHRhcmdldCBpcyBzdWZmaWNpZW50bHkgY2xvc2UuICBJZiBhIGJ5dGUgZGlzcGxhY2VtZW50Ci1pcyBpbnN1ZmZpY2llbnQgYSBsb25nICgzMi1iaXQpIGRpc3BsYWNlbWVudCBpcyB1c2VkLiAgV2UgZG8gbm90IHN1cHBvcnQKLXdvcmQgKDE2LWJpdCkgZGlzcGxhY2VtZW50IGp1bXBzIGluIDMyLWJpdCBtb2RlIChpLmUuIHByZWZpeGluZyB0aGUganVtcAotaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgQHNhbXB7ZGF0YTE2fSBpbnN0cnVjdGlvbiBwcmVmaXgpLCBzaW5jZSB0aGUgODAzODYKLWluc2lzdHMgdXBvbiBtYXNraW5nIEBzYW1weyVlaXB9IHRvIDE2IGJpdHMgYWZ0ZXIgdGhlIHdvcmQgZGlzcGxhY2VtZW50Ci1pcyBhZGRlZC4KLQotTm90ZSB0aGF0IHRoZSBAc2FtcHtqY3h6fSwgQHNhbXB7amVjeHp9LCBAc2FtcHtsb29wfSwgQHNhbXB7bG9vcHp9LAotQHNhbXB7bG9vcGV9LCBAc2FtcHtsb29wbnp9IGFuZCBAc2FtcHtsb29wbmV9IGluc3RydWN0aW9ucyBvbmx5IGNvbWUgaW4gYnl0ZQotZGlzcGxhY2VtZW50cywgc28gdGhhdCBpZiB5b3UgdXNlIHRoZXNlIGluc3RydWN0aW9ucyAoQGNvZGV7QHZhbHVle0dDQ319IGRvZXMKLW5vdCB1c2UgdGhlbSkgeW91IG1heSBnZXQgYW4gZXJyb3IgbWVzc2FnZSAoYW5kIGluY29ycmVjdCBjb2RlKS4gIFRoZSBBVCZUCi04MDM4NiBhc3NlbWJsZXIgdHJpZXMgdG8gZ2V0IGFyb3VuZCB0aGlzIHByb2JsZW0gYnkgZXhwYW5kaW5nIEBzYW1we2pjeHogZm9vfQotdG8KLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAgamN4eiBjeF96ZXJvCi0gICAgICAgICBqbXAgY3hfbm9uemVybwotY3hfemVybzogam1wIGZvbwotY3hfbm9uemVybzoKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIGkzODYtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggaTM4NiBmbG9hdGluZyBwb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgaTM4NgotQWxsIDgwMzg3IGZsb2F0aW5nIHBvaW50IHR5cGVzIGV4Y2VwdCBwYWNrZWQgQkNEIGFyZSBzdXBwb3J0ZWQuCi0oQkNEIHN1cHBvcnQgbWF5IGJlIGFkZGVkIHdpdGhvdXQgbXVjaCBkaWZmaWN1bHR5KS4gIFRoZXNlIGRhdGEKLXR5cGVzIGFyZSAxNi0sIDMyLSwgYW5kIDY0LSBiaXQgaW50ZWdlcnMsIGFuZCBzaW5nbGUgKDMyLWJpdCksCi1kb3VibGUgKDY0LWJpdCksIGFuZCBleHRlbmRlZCAoODAtYml0KSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQuCi1FYWNoIHN1cHBvcnRlZCB0eXBlIGhhcyBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggYW5kIGEgY29uc3RydWN0b3IKLWFzc29jaWF0ZWQgd2l0aCBpdC4gIEluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIHNwZWNpZnkgdGhlIG9wZXJhbmQncwotZGF0YSB0eXBlLiAgQ29uc3RydWN0b3JzIGJ1aWxkIHRoZXNlIGRhdGEgdHlwZXMgaW50byBtZW1vcnkuCi0KLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtzaW5nbGV9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXt0ZmxvYXR9IGRpcmVjdGl2ZSwgaTM4NgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUZsb2F0aW5nIHBvaW50IGNvbnN0cnVjdG9ycyBhcmUgQHNhbXB7LmZsb2F0fSBvciBAc2FtcHsuc2luZ2xlfSwKLUBzYW1wey5kb3VibGV9LCBhbmQgQHNhbXB7LnRmbG9hdH0gZm9yIDMyLSwgNjQtLCBhbmQgODAtYml0IGZvcm1hdHMuCi1UaGVzZSBjb3JyZXNwb25kIHRvIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIEBzYW1we3N9LCBAc2FtcHtsfSwKLWFuZCBAc2FtcHt0fS4gQHNhbXB7dH0gc3RhbmRzIGZvciA4MC1iaXQgKHRlbiBieXRlKSByZWFsLiAgVGhlIDgwMzg3Ci1vbmx5IHN1cHBvcnRzIHRoaXMgZm9ybWF0IHZpYSB0aGUgQHNhbXB7ZmxkdH0gKGxvYWQgODAtYml0IHJlYWwgdG8gc3RhY2sKLXRvcCkgYW5kIEBzYW1we2ZzdHB0fSAoc3RvcmUgODAtYml0IHJlYWwgYW5kIHBvcCBzdGFjaykgaW5zdHJ1Y3Rpb25zLgotCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtsb25nfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7cXVhZH0gZGlyZWN0aXZlLCBpMzg2Ci1AaXRlbQotSW50ZWdlciBjb25zdHJ1Y3RvcnMgYXJlIEBzYW1wey53b3JkfSwgQHNhbXB7Lmxvbmd9IG9yIEBzYW1wey5pbnR9LCBhbmQKLUBzYW1wey5xdWFkfSBmb3IgdGhlIDE2LSwgMzItLCBhbmQgNjQtYml0IGludGVnZXIgZm9ybWF0cy4gIFRoZQotY29ycmVzcG9uZGluZyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBhcmUgQHNhbXB7c30gKHNpbmdsZSksCi1Ac2FtcHtsfSAobG9uZyksIGFuZCBAc2FtcHtxfSAocXVhZCkuICBBcyB3aXRoIHRoZSA4MC1iaXQgcmVhbCBmb3JtYXQsCi10aGUgNjQtYml0IEBzYW1we3F9IGZvcm1hdCBpcyBvbmx5IHByZXNlbnQgaW4gdGhlIEBzYW1we2ZpbGRxfSAobG9hZAotcXVhZCBpbnRlZ2VyIHRvIHN0YWNrIHRvcCkgYW5kIEBzYW1we2Zpc3RwcX0gKHN0b3JlIHF1YWQgaW50ZWdlciBhbmQgcG9wCi1zdGFjaykgaW5zdHJ1Y3Rpb25zLgotQGVuZCBpdGVtaXplCi0KLVJlZ2lzdGVyIHRvIHJlZ2lzdGVyIG9wZXJhdGlvbnMgc2hvdWxkIG5vdCB1c2UgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMuCi1Ac2FtcHtmc3RsICVzdCwgJXN0KDEpfSB3aWxsIGdpdmUgYSB3YXJuaW5nLCBhbmQgYmUgYXNzZW1ibGVkIGFzIGlmIHlvdQotd3JvdGUgQHNhbXB7ZnN0ICVzdCwgJXN0KDEpfSwgc2luY2UgYWxsIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyIG9wZXJhdGlvbnMKLXVzZSA4MC1iaXQgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMuIChDb250cmFzdCB0aGlzIHdpdGggQHNhbXB7ZnN0bCAlc3QsIG1lbX0sCi13aGljaCBjb252ZXJ0cyBAc2FtcHslc3R9IGZyb20gODAtYml0IHRvIDY0LWJpdCBmbG9hdGluZyBwb2ludCBmb3JtYXQsCi10aGVuIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoZSA0IGJ5dGUgbG9jYXRpb24gQHNhbXB7bWVtfSkKLQotQG5vZGUgaTM4Ni1TSU1ECi1Ac2VjdGlvbiBJbnRlbCdzIE1NWCBhbmQgQU1EJ3MgM0ROb3chIFNJTUQgT3BlcmF0aW9ucwotCi1AY2luZGV4IE1NWCwgaTM4NgotQGNpbmRleCAzRE5vdyEsIGkzODYKLUBjaW5kZXggU0lNRCwgaTM4NgotCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBJbnRlbCdzIE1NWCBpbnN0cnVjdGlvbiBzZXQgKFNJTUQKLWluc3RydWN0aW9ucyBmb3IgaW50ZWdlciBkYXRhKSwgYXZhaWxhYmxlIG9uIEludGVsJ3MgUGVudGl1bSBNTVgKLXByb2Nlc3NvcnMgYW5kIFBlbnRpdW0gSUkgcHJvY2Vzc29ycywgQU1EJ3MgSzYgYW5kIEs2LTIgcHJvY2Vzc29ycywKLUN5cml4JyBNMiBwcm9jZXNzb3IsIGFuZCBwcm9iYWJseSBvdGhlcnMuICBJdCBhbHNvIHN1cHBvcnRzIEFNRCdzIDNETm93IQotaW5zdHJ1Y3Rpb24gc2V0IChTSU1EIGluc3RydWN0aW9ucyBmb3IgMzItYml0IGZsb2F0aW5nIHBvaW50IGRhdGEpCi1hdmFpbGFibGUgb24gQU1EJ3MgSzYtMiBwcm9jZXNzb3IgYW5kIHBvc3NpYmx5IG90aGVycyBpbiB0aGUgZnV0dXJlLgotCi1DdXJyZW50bHksIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHN1cHBvcnQgSW50ZWwncyBmbG9hdGluZyBwb2ludAotU0lNRCwgS2F0bWFpIChLTkkpLgotCi1UaGUgZWlnaHQgNjQtYml0IE1NWCBvcGVyYW5kcywgYWxzbyB1c2VkIGJ5IDNETm93ISwgYXJlIGNhbGxlZCBAc2FtcHslbW0wfSwKLUBzYW1weyVtbTF9LCAuLi4gQHNhbXB7JW1tN30uICBUaGV5IGNvbnRhaW4gZWlnaHQgOC1iaXQgaW50ZWdlcnMsIGZvdXIKLTE2LWJpdCBpbnRlZ2VycywgdHdvIDMyLWJpdCBpbnRlZ2Vycywgb25lIDY0LWJpdCBpbnRlZ2VyLCBvciB0d28gMzItYml0Ci1mbG9hdGluZyBwb2ludCB2YWx1ZXMuICBUaGUgTU1YIHJlZ2lzdGVycyBjYW5ub3QgYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lCi1hcyB0aGUgZmxvYXRpbmcgcG9pbnQgc3RhY2suCi0KLVNlZSBJbnRlbCBhbmQgQU1EIGRvY3VtZW50YXRpb24sIGtlZXBpbmcgaW4gbWluZCB0aGF0IHRoZSBvcGVyYW5kIG9yZGVyIGluCi1pbnN0cnVjdGlvbnMgaXMgcmV2ZXJzZWQgZnJvbSB0aGUgSW50ZWwgc3ludGF4LgotCi1Abm9kZSBpMzg2LTE2Yml0Ci1Ac2VjdGlvbiBXcml0aW5nIDE2LWJpdCBDb2RlCi0KLUBjaW5kZXggaTM4NiAxNi1iaXQgY29kZQotQGNpbmRleCAxNi1iaXQgY29kZSwgaTM4NgotQGNpbmRleCByZWFsLW1vZGUgY29kZSwgaTM4NgotQGNpbmRleCBAY29kZXtjb2RlMTZ9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtjb2RlMzJ9IGRpcmVjdGl2ZSwgaTM4NgotV2hpbGUgQGNvZGV7QHZhbHVle0FTfX0gbm9ybWFsbHkgd3JpdGVzIG9ubHkgYGBwdXJlJycgMzItYml0IGkzODYgY29kZSwKLWl0IGFsc28gc3VwcG9ydHMgd3JpdGluZyBjb2RlIHRvIHJ1biBpbiByZWFsIG1vZGUgb3IgaW4gMTYtYml0IHByb3RlY3RlZAotbW9kZSBjb2RlIHNlZ21lbnRzLiAgVG8gZG8gdGhpcywgcHV0IGEgQHNhbXB7LmNvZGUxNn0gZGlyZWN0aXZlIGJlZm9yZQotdGhlIGFzc2VtYmx5IGxhbmd1YWdlIGluc3RydWN0aW9ucyB0byBiZSBydW4gaW4gMTYtYml0IG1vZGUuICBZb3UgY2FuCi1zd2l0Y2ggQGNvZGV7QHZhbHVle0FTfX0gYmFjayB0byB3cml0aW5nIG5vcm1hbCAzMi1iaXQgY29kZSB3aXRoIHRoZQotQHNhbXB7LmNvZGUzMn0gZGlyZWN0aXZlLgotCi1UaGUgY29kZSB3aGljaCBAY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgaW4gMTYtYml0IG1vZGUgd2lsbCBub3QKLW5lY2Vzc2FyaWx5IHJ1biBvbiBhIDE2LWJpdCBwcmUtODAzODYgcHJvY2Vzc29yLiAgVG8gd3JpdGUgY29kZSB0aGF0Ci1ydW5zIG9uIHN1Y2ggYSBwcm9jZXNzb3IsIHlvdSBtdXN0IHJlZnJhaW4gZnJvbSB1c2luZyBAZW1waHthbnl9IDMyLWJpdAotY29uc3RydWN0cyB3aGljaCByZXF1aXJlIEBjb2Rle0B2YWx1ZXtBU319IHRvIG91dHB1dCBhZGRyZXNzIG9yIG9wZXJhbmQKLXNpemUgcHJlZml4ZXMuCi0KLU5vdGUgdGhhdCB3cml0aW5nIDE2LWJpdCBjb2RlIGluc3RydWN0aW9ucyBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgYQotcHJlZml4IG9yIGFuIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCB3aXRoaW4gYSAzMi1iaXQgY29kZSBzZWN0aW9uCi1nZW5lcmF0ZXMgZGlmZmVyZW50IG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHRoYW4gdGhvc2UgZ2VuZXJhdGVkIGZvciBhCi0xNi1iaXQgY29kZSBzZWdtZW50LiAgSW4gYSAzMi1iaXQgY29kZSBzZWN0aW9uLCB0aGUgZm9sbG93aW5nIGNvZGUKLWdlbmVyYXRlcyB0aGUgbWFjaGluZSBvcGNvZGUgYnl0ZXMgQHNhbXB7NjYgNmEgMDR9LCB3aGljaCBwdXNoZXMgdGhlCi12YWx1ZSBAc2FtcHs0fSBvbnRvIHRoZSBzdGFjaywgZGVjcmVtZW50aW5nIEBzYW1weyVlc3B9IGJ5IDIuCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgcHVzaHcgJDQKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBzYW1lIGNvZGUgaW4gYSAxNi1iaXQgY29kZSBzZWN0aW9uIHdvdWxkIGdlbmVyYXRlIHRoZSBtYWNoaW5lCi1vcGNvZGUgYnl0ZXMgQHNhbXB7NmEgMDR9IChpZS4gd2l0aG91dCB0aGUgb3BlcmFuZCBzaXplIHByZWZpeCksIHdoaWNoCi1pcyBjb3JyZWN0IHNpbmNlIHRoZSBwcm9jZXNzb3IgZGVmYXVsdCBvcGVyYW5kIHNpemUgaXMgYXNzdW1lZCB0byBiZSAxNgotYml0cyBpbiBhIDE2LWJpdCBjb2RlIHNlY3Rpb24uCi0KLUBub2RlIGkzODYtQnVncwotQHNlY3Rpb24gQVQmVCBTeW50YXggYnVncwotCi1UaGUgVW5peFdhcmUgYXNzZW1ibGVyLCBhbmQgcHJvYmFibHkgb3RoZXIgQVQmVCBkZXJpdmVkIGl4ODYgVW5peAotYXNzZW1ibGVycywgZ2VuZXJhdGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHdpdGggcmV2ZXJzZWQgc291cmNlCi1hbmQgZGVzdGluYXRpb24gcmVnaXN0ZXJzIGluIGNlcnRhaW4gY2FzZXMuICBVbmZvcnR1bmF0ZWx5LCBnY2MgYW5kCi1wb3NzaWJseSBtYW55IG90aGVyIHByb2dyYW1zIHVzZSB0aGlzIHJldmVyc2VkIHN5bnRheCwgc28gd2UncmUgc3R1Y2sKLXdpdGggaXQuCi0KLUZvciBleGFtcGxlCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgZnN1YiAlc3QsJXN0KDMpCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1yZXN1bHRzIGluIEBzYW1weyVzdCgzKX0gYmVpbmcgdXBkYXRlZCB0byBAc2FtcHslc3QgLSAlc3QoMyl9IHJhdGhlcgotdGhhbiB0aGUgZXhwZWN0ZWQgQHNhbXB7JXN0KDMpIC0gJXN0fS4gIFRoaXMgaGFwcGVucyB3aXRoIGFsbCB0aGUKLW5vbi1jb21tdXRhdGl2ZSBhcml0aG1ldGljIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgd2l0aCB0d28gcmVnaXN0ZXIKLW9wZXJhbmRzIHdoZXJlIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMgQHNhbXB7JXN0fSBhbmQgdGhlIGRlc3RpbmF0aW9uCi1yZWdpc3RlciBpcyBAc2FtcHslc3QoaSl9LgotCi1Abm9kZSBpMzg2LU5vdGVzCi1Ac2VjdGlvbiBOb3RlcwotCi1AY2luZGV4IGkzODYgQGNvZGV7bXVsfSwgQGNvZGV7aW11bH0gaW5zdHJ1Y3Rpb25zCi1AY2luZGV4IEBjb2Rle211bH0gaW5zdHJ1Y3Rpb24sIGkzODYKLUBjaW5kZXggQGNvZGV7aW11bH0gaW5zdHJ1Y3Rpb24sIGkzODYKLVRoZXJlIGlzIHNvbWUgdHJpY2tlcnkgY29uY2VybmluZyB0aGUgQHNhbXB7bXVsfSBhbmQgQHNhbXB7aW11bH0KLWluc3RydWN0aW9ucyB0aGF0IGRlc2VydmVzIG1lbnRpb24uICBUaGUgMTYtLCAzMi0sIGFuZCA2NC1iaXQgZXhwYW5kaW5nCi1tdWx0aXBsaWVzIChiYXNlIG9wY29kZSBAc2FtcHsweGY2fTsgZXh0ZW5zaW9uIDQgZm9yIEBzYW1we211bH0gYW5kIDUKLWZvciBAc2FtcHtpbXVsfSkgY2FuIGJlIG91dHB1dCBvbmx5IGluIHRoZSBvbmUgb3BlcmFuZCBmb3JtLiAgVGh1cywKLUBzYW1we2ltdWwgJWVieCwgJWVheH0gZG9lcyBAZW1waHtub3R9IHNlbGVjdCB0aGUgZXhwYW5kaW5nIG11bHRpcGx5OwotdGhlIGV4cGFuZGluZyBtdWx0aXBseSB3b3VsZCBjbG9iYmVyIHRoZSBAc2FtcHslZWR4fSByZWdpc3RlciwgYW5kIHRoaXMKLXdvdWxkIGNvbmZ1c2UgQGNvZGV7QHZhbHVle0dDQ319IG91dHB1dC4gIFVzZSBAc2FtcHtpbXVsICVlYnh9IHRvIGdldCB0aGUKLTY0LWJpdCBwcm9kdWN0IGluIEBzYW1weyVlZHg6JWVheH0uCi0KLVdlIGhhdmUgYWRkZWQgYSB0d28gb3BlcmFuZCBmb3JtIG9mIEBzYW1we2ltdWx9IHdoZW4gdGhlIGZpcnN0IG9wZXJhbmQKLWlzIGFuIGltbWVkaWF0ZSBtb2RlIGV4cHJlc3Npb24gYW5kIHRoZSBzZWNvbmQgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyLgotVGhpcyBpcyBqdXN0IGEgc2hvcnRoYW5kLCBzbyB0aGF0LCBtdWx0aXBseWluZyBAc2FtcHslZWF4fSBieSA2OSwgZm9yCi1leGFtcGxlLCBjYW4gYmUgZG9uZSB3aXRoIEBzYW1we2ltdWwgJDY5LCAlZWF4fSByYXRoZXIgdGhhbiBAc2FtcHtpbXVsCi0kNjksICVlYXgsICVlYXh9LgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaTk2MC50ZXhpIGIvZ2FzL2RvYy9jLWk5NjAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3MDMwYS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaTk2MC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBpOTYwLURlcGVuZGVudAotQGNoYXB0ZXIgSW50ZWwgODA5NjAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgSW50ZWwgODA5NjAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBpOTYwIHN1cHBvcnQKLUBtZW51Ci0qIE9wdGlvbnMtaTk2MDo6ICAgICAgICAgICAgICAgIGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnMKLSogRmxvYXRpbmcgUG9pbnQtaTk2MDo6ICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogRGlyZWN0aXZlcy1pOTYwOjogICAgICAgICAgICAgaTk2MCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogT3Bjb2RlcyBmb3IgaTk2MDo6ICAgICAgICAgICAgaTk2MCBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQGMgRklYTUUhIEFkZCBTeW50YXggc2VjIHdpdGggZGlzY3Vzc2lvbiBvZiBiaXRmaWVsZHMgaGVyZSwgYXQgbGVhc3Qgc28KLUBjIGxvbmcgYXMgdGhleSdyZSBub3QgdHVybmVkIG9uIGZvciBvdGhlciBtYWNoaW5lcyB0aGFuIDk2MC4KLQotQG5vZGUgT3B0aW9ucy1pOTYwCi0KLUBzZWN0aW9uIGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnMKLQotQGNpbmRleCBpOTYwIG9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgaTk2MAotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggaTk2MCBhcmNoaXRlY3R1cmUgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmUgb3B0aW9ucywgaTk2MAotQGNpbmRleCBAY29kZXstQX0gb3B0aW9ucywgaTk2MAotQGl0ZW0gLUFDQSB8IC1BQ0FfQSB8IC1BQ0IgfCAtQUNDIHwgLUFLQSB8IC1BS0IgfCAtQUtDIHwgLUFNQwotU2VsZWN0IHRoZSA4MDk2MCBhcmNoaXRlY3R1cmUuICBJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90IHN1cHBvcnRlZAotYnkgdGhlIHNlbGVjdGVkIGFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbCBlcnJvcnMuCi0KLUBzYW1wey1BQ0F9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7LUFDQV9BfTsgQHNhbXB7LUFLQ30gaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7LUFNQ30uICBTeW5vbnltcyBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciB0b29scy4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBvZiB0aGVzZSBvcHRpb25zLCBAY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgY29kZQotZm9yIGFueSBpbnN0cnVjdGlvbiBvciBmZWF0dXJlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IEBlbXBoe3NvbWV9IHZlcnNpb24gb2YgdGhlCi05NjAgKGV2ZW4gaWYgdGhpcyBtZWFucyBtaXhpbmcgYXJjaGl0ZWN0dXJlcyEpLiAgSW4gcHJpbmNpcGxlLAotQGNvZGV7QHZhbHVle0FTfX0gYXR0ZW1wdHMgdG8gZGVkdWNlIHRoZSBtaW5pbWFsIHN1ZmZpY2llbnQgcHJvY2Vzc29yIHR5cGUgaWYKLW5vbmUgaXMgc3BlY2lmaWVkOyBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCBjb2RlIGZvcm1hdCwgdGhlIHByb2Nlc3NvciB0eXBlIG1heQotYmUgcmVjb3JkZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgSWYgaXQgaXMgY3JpdGljYWwgdGhhdCB0aGUgQGNvZGV7QHZhbHVle0FTfX0KLW91dHB1dCBtYXRjaCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSwgc3BlY2lmeSB0aGF0IGFyY2hpdGVjdHVyZSBleHBsaWNpdGx5LgotCi1AY2luZGV4IEBjb2Rley1ifSBvcHRpb24sIGk5NjAKLUBjaW5kZXggYnJhbmNoIHJlY29yZGluZywgaTk2MAotQGNpbmRleCBpOTYwIGJyYW5jaCByZWNvcmRpbmcKLUBpdGVtIC1iCi1BZGQgY29kZSB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRha2VuLCBmb3IKLWxhdGVyIG9wdGltaXphdGlvbiB1c2luZyBicmFuY2ggcHJlZGljdGlvbiBiaXRzLiAgKFRoZSBjb25kaXRpb25hbCBicmFuY2gKLWluc3RydWN0aW9ucyBoYXZlIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgaW4gdGhlIENBLCBDQiwgYW5kIENDCi1hcmNoaXRlY3R1cmVzLikgIElmIEB2YXJ7QlJ9IHJlcHJlc2VudHMgYSBjb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb24sCi10aGUgZm9sbG93aW5nIHJlcHJlc2VudHMgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgd2hlbgotQHNhbXB7LWJ9IGlzIHNwZWNpZmllZDoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBjYWxsICAgIEB2YXJ7aW5jcmVtZW50IHJvdXRpbmV9Ci0gICAgICAgIC53b3JkICAgMCAgICAgICAjIHByZS1jb3VudGVyCi1MYWJlbDogIEB2YXJ7QlJ9Ci0gICAgICAgIGNhbGwgICAgQHZhcntpbmNyZW1lbnQgcm91dGluZX0KLSAgICAgICAgLndvcmQgICAwICAgICAgICMgcG9zdC1jb3VudGVyCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgY291bnRlciBmb2xsb3dpbmcgYSBicmFuY2ggcmVjb3JkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYnJhbmNoCi13YXMgQGVtcGh7bm90fSB0YWtlbjsgdGhlIGRpZmZlcmVuYyBiZXR3ZWVuIHRoZSB0d28gY291bnRlcnMgaXMgdGhlCi1udW1iZXIgb2YgdGltZXMgdGhlIGJyYW5jaCBAZW1waHt3YXN9IHRha2VuLgotCi1AY2luZGV4IEBjb2Rle2dicjk2MH0sIGk5NjAgcG9zdHByb2Nlc3NvcgotQGNpbmRleCBicmFuY2ggc3RhdGlzdGljcyB0YWJsZSwgaTk2MAotQSB0YWJsZSBvZiBldmVyeSBzdWNoIEBjb2Rle0xhYmVsfSBpcyBhbHNvIGdlbmVyYXRlZCwgc28gdGhhdCB0aGUKLWV4dGVybmFsIHBvc3Rwcm9jZXNzb3IgQGNvZGV7Z2JyOTYwfSAoc3VwcGxpZWQgYnkgSW50ZWwpIGNhbiBsb2NhdGUgYWxsCi10aGUgY291bnRlcnMuICBUaGlzIHRhYmxlIGlzIGFsd2F5cyBsYWJlbGxlZCBAc2FtcHtfX0JSQU5DSF9UQUJMRV9ffTsKLXRoaXMgaXMgYSBsb2NhbCBzeW1ib2wgdG8gcGVybWl0IGNvbGxlY3Rpbmcgc3RhdGlzdGljcyBmb3IgbWFueSBzZXBhcmF0ZQotb2JqZWN0IGZpbGVzLiAgVGhlIHRhYmxlIGlzIHdvcmQgYWxpZ25lZCwgYW5kIGJlZ2lucyB3aXRoIGEgdHdvLXdvcmQKLWhlYWRlci4gIFRoZSBmaXJzdCB3b3JkLCBpbml0aWFsaXplZCB0byAwLCBpcyB1c2VkIGluIG1haW50YWluaW5nIGxpbmtlZAotbGlzdHMgb2YgYnJhbmNoIHRhYmxlcy4gIFRoZSBzZWNvbmQgd29yZCBpcyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YKLWVudHJpZXMgaW4gdGhlIHRhYmxlLCB3aGljaCBmb2xsb3cgaW1tZWRpYXRlbHk6IGVhY2ggaXMgYSB3b3JkLCBwb2ludGluZwotdG8gb25lIG9mIHRoZSBsYWJlbHMgaWxsdXN0cmF0ZWQgYWJvdmUuCi0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBleGFtcGxlCi0gKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAuLi4gKy0tLS0tLS0tLS0tLSsKLSB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgfAotIHwgICpORVhUICAgICB8ICBDT1VOVDogTiAgfCAqQlJMQUIgMSAgIHwgICAgIHwgKkJSTEFCIE4gICB8Ci0gfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgfCAgICAgICAgICAgIHwKLSArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rIC4uLiArLS0tLS0tLS0tLS0tKwotCi0gICAgICAgICAgICAgICBfX0JSQU5DSF9UQUJMRV9fIGxheW91dAotQGVuZCBleGFtcGxlCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUBuZWVkIDIwMDAKLUB0ZXgKLVx2c2tpcCAxcGMKLVxsaW5le1xsZWZ0c2tpcD0wcHRcaHNraXBcdGFibGVpbmRlbnQKLVxib3hpdHsyY219e1x0dCAqTkVYVH1cYm94aXR7MmNtfXtcdHQgQ09VTlQ6IFxpdCBOfVxib3hpdHsyY219e1x0dAotKkJSTEFCIDF9XGlib3h7MWNtfXtccXVhZFxkb3RzfVxib3hpdHsyY219e1x0dCAqQlJMQUIgXGl0IE59XGhmaWx9Ci1cY2VudGVybGluZXtcaXQge1x0dCBcX1xfQlJBTkNIXF9UQUJMRVxfXF99IGxheW91dH0KLUBlbmQgdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotVGhlIGZpcnN0IHdvcmQgb2YgdGhlIGhlYWRlciBpcyB1c2VkIHRvIGxvY2F0ZSBtdWx0aXBsZSBicmFuY2ggdGFibGVzLAotc2luY2UgZWFjaCBvYmplY3QgZmlsZSBtYXkgY29udGFpbiBvbmUuIE5vcm1hbGx5IHRoZSBsaW5rcyBhcmUKLW1haW50YWluZWQgd2l0aCBhIGNhbGwgdG8gYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSwgcGxhY2VkIGF0IHRoZQotYmVnaW5uaW5nIG9mIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGZpbGUuICBUaGUgQHNje2dudX0gQyBjb21waWxlcgotZ2VuZXJhdGVzIHRoZXNlIGNhbGxzIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgZ2l2ZSBpdCBhIEBzYW1wey1ifSBvcHRpb24uCi1Gb3IgZnVydGhlciBkZXRhaWxzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQHNhbXB7Z2JyOTYwfS4KLQotQGNpbmRleCBAY29kZXstbm8tcmVsYXh9IG9wdGlvbiwgaTk2MAotQGl0ZW0gLW5vLXJlbGF4Ci1Ob3JtYWxseSwgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9ucyB3aXRoIHRhcmdldHMgdGhhdCByZXF1aXJlCi1kaXNwbGFjZW1lbnRzIGdyZWF0ZXIgdGhhbiAxMyBiaXRzIChvciB0aGF0IGhhdmUgZXh0ZXJuYWwgdGFyZ2V0cykgYXJlCi1yZXBsYWNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgKG9yIEBzYW1we2Noa2JpdH0pIGFuZCBicmFuY2gKLWluc3RydWN0aW9ucy4gIFlvdSBjYW4gdXNlIHRoZSBAc2FtcHstbm8tcmVsYXh9IG9wdGlvbiB0byBzcGVjaWZ5IHRoYXQKLUBjb2Rle0B2YWx1ZXtBU319IHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMgaW5zdGVhZCwgaWYgdGhlIHRhcmdldCBkaXNwbGFjZW1lbnQKLWlzIGxhcmdlciB0aGFuIDEzIGJpdHMuCi0KLVRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgQ29tcGFyZS1hbmQtSnVtcCBpbnN0cnVjdGlvbnM7IHRoZSBjb2RlCi1lbWl0dGVkIGZvciB0aGVtIGlzIEBlbXBoe2Fsd2F5c30gYWRqdXN0ZWQgd2hlbiBuZWNlc3NhcnkgKGRlcGVuZGluZyBvbgotZGlzcGxhY2VtZW50IHNpemUpLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91IHVzZSBAc2FtcHstbm8tcmVsYXh9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBGbG9hdGluZyBQb2ludC1pOTYwCi1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBpOTYwIChAc2N7aWVlZX0pCi1AY2luZGV4IGk5NjAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLUBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgdGhlIGRpcmVjdGl2ZXMKLUBzYW1wey5mbG9hdH0sIEBzYW1wey5kb3VibGV9LCBAc2FtcHsuZXh0ZW5kZWR9LCBhbmQgQHNhbXB7LnNpbmdsZX0uCi0KLUBub2RlIERpcmVjdGl2ZXMtaTk2MAotQHNlY3Rpb24gaTk2MCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIGk5NjAKLUBjaW5kZXggaTk2MCBtYWNoaW5lIGRpcmVjdGl2ZXMKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2Jzc30gZGlyZWN0aXZlLCBpOTYwCi1AaXRlbSAuYnNzIEB2YXJ7c3ltYm9sfSwgQHZhcntsZW5ndGh9LCBAdmFye2FsaWdufQotUmVzZXJ2ZSBAdmFye2xlbmd0aH0gYnl0ZXMgaW4gdGhlIGJzcyBzZWN0aW9uIGZvciBhIGxvY2FsIEB2YXJ7c3ltYm9sfSwKLWFsaWduZWQgdG8gdGhlIHBvd2VyIG9mIHR3byBzcGVjaWZpZWQgYnkgQHZhcnthbGlnbn0uICBAdmFye2xlbmd0aH0gYW5kCi1AdmFye2FsaWdufSBtdXN0IGJlIHBvc2l0aXZlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgVGhpcyBkaXJlY3RpdmUKLWRpZmZlcnMgZnJvbSBAc2FtcHsubGNvbW19IG9ubHkgaW4gdGhhdCBpdCBwZXJtaXRzIHlvdSB0byBzcGVjaWZ5Ci1hbiBhbGlnbm1lbnQuICBAeHJlZntMY29tbSwsQGNvZGV7Lmxjb21tfX0uCi1AZW5kIHRhYmxlCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtleHRlbmRlZH0gZGlyZWN0aXZlLCBpOTYwCi1AaXRlbSAuZXh0ZW5kZWQgQHZhcntmbG9udW1zfQotQGNvZGV7LmV4dGVuZGVkfSBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzOyBmb3IKLWVhY2ggZmxvbnVtLCBAc2FtcHsuZXh0ZW5kZWR9IGVtaXRzIGFuIEBzY3tpZWVlfSBleHRlbmRlZC1mb3JtYXQgKDgwLWJpdCkKLWZsb2F0aW5nLXBvaW50IG51bWJlci4KLQotQGNpbmRleCBAY29kZXtsZWFmcHJvY30gZGlyZWN0aXZlLCBpOTYwCi1AaXRlbSAubGVhZnByb2MgQHZhcntjYWxsLWxhYn0sIEB2YXJ7YmFsLWxhYn0KLVlvdSBjYW4gdXNlIHRoZSBAc2FtcHsubGVhZnByb2N9IGRpcmVjdGl2ZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotb3B0aW1pemVkIEBjb2Rle2NhbGxqfSBpbnN0cnVjdGlvbiB0byBlbmFibGUgZmFzdGVyIGNhbGxzIG9mIGxlYWYKLXByb2NlZHVyZXMuICBJZiBhIHByb2NlZHVyZSBpcyBrbm93biB0byBjYWxsIG5vIG90aGVyIHByb2NlZHVyZXMsIHlvdQotbWF5IGRlZmluZSBhbiBlbnRyeSBwb2ludCB0aGF0IHNraXBzIHByb2NlZHVyZSBwcm9sb2cgY29kZSAoYW5kIHRoYXQgZG9lcwotbm90IGRlcGVuZCBvbiBzeXN0ZW0tc3VwcGxpZWQgc2F2ZWQgY29udGV4dCksIGFuZCBkZWNsYXJlIGl0IGFzIHRoZQotQHZhcntiYWwtbGFifSB1c2luZyBAc2FtcHsubGVhZnByb2N9LiAgSWYgdGhlIHByb2NlZHVyZSBhbHNvIGhhcyBhbgotZW50cnkgcG9pbnQgdGhhdCBnb2VzIHRocm91Z2ggdGhlIG5vcm1hbCBwcm9sb2csIHlvdSBjYW4gc3BlY2lmeSB0aGF0Ci1lbnRyeSBwb2ludCBhcyBAdmFye2NhbGwtbGFifS4KLQotQSBAc2FtcHsubGVhZnByb2N9IGRlY2xhcmF0aW9uIGlzIG1lYW50IGZvciB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLW9wdGltaXplZCBjYWxsIGluc3RydWN0aW9uIEBzYW1we2NhbGxqfTsgdGhlIGRpcmVjdGl2ZSByZWNvcmRzIHRoZSBkYXRhCi1uZWVkZWQgbGF0ZXIgdG8gY2hvb3NlIGJldHdlZW4gY29udmVydGluZyB0aGUgQHNhbXB7Y2FsbGp9IGludG8gYQotQGNvZGV7YmFsfSBvciBhIEBjb2Rle2NhbGx9LgotCi1AdmFye2NhbGwtbGFifSBpcyBvcHRpb25hbDsgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJlc2VudCwgb3IgaWYgdGhlCi10d28gYXJndW1lbnRzIGFyZSBpZGVudGljYWwsIHRoZSBzaW5nbGUgYXJndW1lbnQgaXMgYXNzdW1lZCB0byBiZSB0aGUKLUBjb2Rle2JhbH0gZW50cnkgcG9pbnQuCi0KLUBjaW5kZXggQGNvZGV7c3lzcHJvY30gZGlyZWN0aXZlLCBpOTYwCi1AaXRlbSAuc3lzcHJvYyBAdmFye25hbWV9LCBAdmFye2luZGV4fQotVGhlIEBzYW1wey5zeXNwcm9jfSBkaXJlY3RpdmUgZGVmaW5lcyBhIG5hbWUgZm9yIGEgc3lzdGVtIHByb2NlZHVyZS4KLUFmdGVyIHlvdSBkZWZpbmUgaXQgdXNpbmcgQHNhbXB7LnN5c3Byb2N9LCB5b3UgY2FuIHVzZSBAdmFye25hbWV9IHRvCi1yZWZlciB0byB0aGUgc3lzdGVtIHByb2NlZHVyZSBpZGVudGlmaWVkIGJ5IEB2YXJ7aW5kZXh9IHdoZW4gY2FsbGluZwotcHJvY2VkdXJlcyB3aXRoIHRoZSBvcHRpbWl6ZWQgY2FsbCBpbnN0cnVjdGlvbiBAc2FtcHtjYWxsan0uCi0KLUJvdGggYXJndW1lbnRzIGFyZSByZXF1aXJlZDsgQHZhcntpbmRleH0gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDMxCi0oaW5jbHVzaXZlKS4KLUBlbmQgdGFibGUKLQotQG5vZGUgT3Bjb2RlcyBmb3IgaTk2MAotQHNlY3Rpb24gaTk2MCBPcGNvZGVzCi0KLUBjaW5kZXggb3Bjb2RlcywgaTk2MAotQGNpbmRleCBpOTYwIG9wY29kZXMKLUFsbCBJbnRlbCA5NjAgbWFjaGluZSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZDsKLUBweHJlZntPcHRpb25zLWk5NjAsLGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnN9IGZvciBhIGRpc2N1c3Npb24gb2YKLXNlbGVjdGluZyB0aGUgaW5zdHJ1Y3Rpb24gc3Vic2V0IGZvciBhIHBhcnRpY3VsYXIgOTYwCi1hcmNoaXRlY3R1cmUuQHJlZmlsbAotCi1Tb21lIG9wY29kZXMgYXJlIHByb2Nlc3NlZCBiZXlvbmQgc2ltcGx5IGVtaXR0aW5nIGEgc2luZ2xlIGNvcnJlc3BvbmRpbmcKLWluc3RydWN0aW9uOiBAc2FtcHtjYWxsan0sIGFuZCBDb21wYXJlLWFuZC1CcmFuY2ggb3IgQ29tcGFyZS1hbmQtSnVtcAotaW5zdHJ1Y3Rpb25zIHdpdGggdGFyZ2V0IGRpc3BsYWNlbWVudHMgbGFyZ2VyIHRoYW4gMTMgYml0cy4KLQotQG1lbnUKLSogY2FsbGotaTk2MDo6ICAgICAgICAgICAgICAgICAgQGNvZGV7Y2FsbGp9Ci0qIENvbXBhcmUtYW5kLWJyYW5jaC1pOTYwOjogICAgIENvbXBhcmUtYW5kLUJyYW5jaAotQGVuZCBtZW51Ci0KLUBub2RlIGNhbGxqLWk5NjAKLUBzdWJzZWN0aW9uIEBjb2Rle2NhbGxqfQotCi1AY2luZGV4IEBjb2Rle2NhbGxqfSwgaTk2MCBwc2V1ZG8tb3Bjb2RlCi1AY2luZGV4IGk5NjAgQGNvZGV7Y2FsbGp9IHBzZXVkby1vcGNvZGUKLVlvdSBjYW4gd3JpdGUgQGNvZGV7Y2FsbGp9IHRvIGhhdmUgdGhlIGFzc2VtYmxlciBvciB0aGUgbGlua2VyIGRldGVybWluZQotdGhlIG1vc3QgYXBwcm9wcmlhdGUgZm9ybSBvZiBzdWJyb3V0aW5lIGNhbGw6IEBzYW1we2NhbGx9LAotQHNhbXB7YmFsfSwgb3IgQHNhbXB7Y2FsbHN9LiAgSWYgdGhlIGFzc2VtYmx5IHNvdXJjZSBjb250YWlucwotZW5vdWdoIGluZm9ybWF0aW9uLS0tYSBAc2FtcHsubGVhZnByb2N9IG9yIEBzYW1wey5zeXNwcm9jfSBkaXJlY3RpdmUKLWRlZmluaW5nIHRoZSBvcGVyYW5kLS0tdGhlbiBAY29kZXtAdmFsdWV7QVN9fSB0cmFuc2xhdGVzIHRoZQotQGNvZGV7Y2FsbGp9OyBpZiBub3QsIGl0IHNpbXBseSBlbWl0cyB0aGUgQGNvZGV7Y2FsbGp9LCBsZWF2aW5nIGl0Ci1mb3IgdGhlIGxpbmtlciB0byByZXNvbHZlLgotCi1Abm9kZSBDb21wYXJlLWFuZC1icmFuY2gtaTk2MAotQHN1YnNlY3Rpb24gQ29tcGFyZS1hbmQtQnJhbmNoCi0KLUBjaW5kZXggaTk2MCBjb21wYXJlL2JyYW5jaCBpbnN0cnVjdGlvbnMKLUBjaW5kZXggY29tcGFyZS9icmFuY2ggaW5zdHJ1Y3Rpb25zLCBpOTYwCi1UaGUgOTYwIGFyY2hpdGVjdHVyZXMgcHJvdmlkZSBjb21iaW5lZCBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb25zCi10aGF0IHBlcm1pdCB5b3UgdG8gc3RvcmUgdGhlIGJyYW5jaCB0YXJnZXQgaW4gdGhlIGxvd2VyIDEzIGJpdHMgb2YgdGhlCi1pbnN0cnVjdGlvbiB3b3JkIGl0c2VsZi4gIEhvd2V2ZXIsIGlmIHlvdSBzcGVjaWZ5IGEgYnJhbmNoIHRhcmdldCBmYXIKLWVub3VnaCBhd2F5IHRoYXQgaXRzIGFkZHJlc3Mgd29uJ3QgZml0IGluIDEzIGJpdHMsIHRoZSBhc3NlbWJsZXIgY2FuCi1laXRoZXIgaXNzdWUgYW4gZXJyb3IsIG9yIGNvbnZlcnQgeW91ciBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb24KLWludG8gc2VwYXJhdGUgaW5zdHJ1Y3Rpb25zIHRvIGRvIHRoZSBjb21wYXJlIGFuZCB0aGUgYnJhbmNoLgotCi1AY2luZGV4IGNvbXBhcmUgYW5kIGp1bXAgZXhwYW5zaW9ucywgaTk2MAotQGNpbmRleCBpOTYwIGNvbXBhcmUgYW5kIGp1bXAgZXhwYW5zaW9ucwotV2hldGhlciBAY29kZXtAdmFsdWV7QVN9fSBnaXZlcyBhbiBlcnJvciBvciBleHBhbmRzIHRoZSBpbnN0cnVjdGlvbiBkZXBlbmRzCi1vbiB0d28gY2hvaWNlcyB5b3UgY2FuIG1ha2U6IHdoZXRoZXIgeW91IHVzZSB0aGUgQHNhbXB7LW5vLXJlbGF4fSBvcHRpb24sCi1hbmQgd2hldGhlciB5b3UgdXNlIGEgYGBDb21wYXJlIGFuZCBCcmFuY2gnJyBpbnN0cnVjdGlvbiBvciBhIGBgQ29tcGFyZQotYW5kIEp1bXAnJyBpbnN0cnVjdGlvbi4gIFRoZSBgYEp1bXAnJyBpbnN0cnVjdGlvbnMgYXJlIEBlbXBoe2Fsd2F5c30KLWV4cGFuZGVkIGlmIG5lY2Vzc2FyeTsgdGhlIGBgQnJhbmNoJycgaW5zdHJ1Y3Rpb25zIGFyZSBleHBhbmRlZCB3aGVuCi1uZWNlc3NhcnkgQGVtcGh7dW5sZXNzfSB5b3Ugc3BlY2lmeSBAY29kZXstbm8tcmVsYXh9LS0taW4gd2hpY2ggY2FzZQotQGNvZGV7QHZhbHVle0FTfX0gZ2l2ZXMgYW4gZXJyb3IgaW5zdGVhZC4KLQotVGhlc2UgYXJlIHRoZSBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb25zLCB0aGVpciBgYEp1bXAnJyB2YXJpYW50cywKLWFuZCB0aGUgaW5zdHJ1Y3Rpb24gcGFpcnMgdGhleSBtYXkgZXhwYW5kIGludG86Ci0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBleGFtcGxlCi0gICAgICAgIENvbXBhcmUgYW5kCi0gICAgIEJyYW5jaCAgICAgIEp1bXAgICAgICAgRXhwYW5kZWQgdG8KLSAgICAgLS0tLS0tICAgIC0tLS0tLSAgICAgICAtLS0tLS0tLS0tLS0KLSAgICAgICAgYmJjICAgICAgICAgICAgICAgICBjaGtiaXQ7IGJubwotICAgICAgICBiYnMgICAgICAgICAgICAgICAgIGNoa2JpdDsgYm8KLSAgICAgY21waWJlICAgIGNtcGlqZSAgICAgICBjbXBpOyBiZQotICAgICBjbXBpYmcgICAgY21waWpnICAgICAgIGNtcGk7IGJnCi0gICAgY21waWJnZSAgIGNtcGlqZ2UgICAgICAgY21waTsgYmdlCi0gICAgIGNtcGlibCAgICBjbXBpamwgICAgICAgY21waTsgYmwKLSAgICBjbXBpYmxlICAgY21waWpsZSAgICAgICBjbXBpOyBibGUKLSAgICBjbXBpYm5vICAgY21waWpubyAgICAgICBjbXBpOyBibm8KLSAgICBjbXBpYm5lICAgY21waWpuZSAgICAgICBjbXBpOyBibmUKLSAgICAgY21waWJvICAgIGNtcGlqbyAgICAgICBjbXBpOyBibwotICAgICBjbXBvYmUgICAgY21wb2plICAgICAgIGNtcG87IGJlCi0gICAgIGNtcG9iZyAgICBjbXBvamcgICAgICAgY21wbzsgYmcKLSAgICBjbXBvYmdlICAgY21wb2pnZSAgICAgICBjbXBvOyBiZ2UKLSAgICAgY21wb2JsICAgIGNtcG9qbCAgICAgICBjbXBvOyBibAotICAgIGNtcG9ibGUgICBjbXBvamxlICAgICAgIGNtcG87IGJsZQotICAgIGNtcG9ibmUgICBjbXBvam5lICAgICAgIGNtcG87IGJuZQotQGVuZCBleGFtcGxlCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUB0ZXgKLVxoc2tpcFx0YWJsZWluZGVudAotXGhhbGlnbntcaGZpbCB7XHR0ICN9XHF1YWQmXGhmaWwge1x0dCAjfVxxcXVhZCZ7XHR0ICN9XGhmaWxcY3IKLVxvbWl0e1xoZmlsXGl0IENvbXBhcmUgYW5kXGhmaWx9XHNwYW5cb21pdCZcY3IKLXtcaXQgQnJhbmNofSZ7XGl0IEp1bXB9JntcaXQgRXhwYW5kZWQgdG99XGNyCi0gICAgICAgIGJiYyYgICAgICAgICAgICAgICAgICYgY2hrYml0OyBibm9cY3IKLSAgICAgICAgYmJzJiAgICAgICAgICAgICAgICAgJiBjaGtiaXQ7IGJvXGNyCi0gICAgIGNtcGliZSYgICAgY21waWplJiAgICAgICBjbXBpOyBiZVxjcgotICAgICBjbXBpYmcmICAgIGNtcGlqZyYgICAgICAgY21waTsgYmdcY3IKLSAgICBjbXBpYmdlJiAgIGNtcGlqZ2UmICAgICAgIGNtcGk7IGJnZVxjcgotICAgICBjbXBpYmwmICAgIGNtcGlqbCYgICAgICAgY21waTsgYmxcY3IKLSAgICBjbXBpYmxlJiAgIGNtcGlqbGUmICAgICAgIGNtcGk7IGJsZVxjcgotICAgIGNtcGlibm8mICAgY21waWpubyYgICAgICAgY21waTsgYm5vXGNyCi0gICAgY21waWJuZSYgICBjbXBpam5lJiAgICAgICBjbXBpOyBibmVcY3IKLSAgICAgY21waWJvJiAgICBjbXBpam8mICAgICAgIGNtcGk7IGJvXGNyCi0gICAgIGNtcG9iZSYgICAgY21wb2plJiAgICAgICBjbXBvOyBiZVxjcgotICAgICBjbXBvYmcmICAgIGNtcG9qZyYgICAgICAgY21wbzsgYmdcY3IKLSAgICBjbXBvYmdlJiAgIGNtcG9qZ2UmICAgICAgIGNtcG87IGJnZVxjcgotICAgICBjbXBvYmwmICAgIGNtcG9qbCYgICAgICAgY21wbzsgYmxcY3IKLSAgICBjbXBvYmxlJiAgIGNtcG9qbGUmICAgICAgIGNtcG87IGJsZVxjcgotICAgIGNtcG9ibmUmICAgY21wb2puZSYgICAgICAgY21wbzsgYm5lXGNyfQotQGVuZCB0ZXgKLUBjIEVORCBURVhJMlJPRkYtS0lMTApkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW0zMnIudGV4aSBiL2dhcy9kb2MvYy1tMzJyLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjFlZGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW0zMnIudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBNMzJSLURlcGVuZGVudAotQGNoYXB0ZXIgTTMyUiBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBNMzJSIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1tNjhrLnRleGkgYi9nYXMvZG9jL2MtbTY4ay50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY4NTdmLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1tNjhrLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgTTY4Sy1EZXBlbmRlbnQKLUBjaGFwdGVyIE02ODB4MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBNNjgweDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBNNjgweDAgc3VwcG9ydAotQG1lbnUKLSogTTY4Sy1PcHRzOjogICAgICAgICAgICAgICAgICAgTTY4MHgwIE9wdGlvbnMKLSogTTY4Sy1TeW50YXg6OiAgICAgICAgICAgICAgICAgU3ludGF4Ci0qIE02OEstTW90by1TeW50YXg6OiAgICAgICAgICAgIE1vdG9yb2xhIFN5bnRheAotKiBNNjhLLUZsb2F0OjogICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBNNjhLLURpcmVjdGl2ZXM6OiAgICAgICAgICAgICA2ODB4MCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogTTY4Sy1vcGNvZGVzOjogICAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIE02OEstT3B0cwotQHNlY3Rpb24gTTY4MHgwIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIG9wdGlvbnMKLVRoZSBNb3Rvcm9sYSA2ODB4MCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhIGZldyBtYWNoaW5lCi1kZXBlbmRlbnQgb3B0aW9ucy4KLQotQGNpbmRleCBAc2FtcHstbH0gb3B0aW9uLCBNNjgweDAKLVlvdSBjYW4gdXNlIHRoZSBAc2FtcHstbH0gb3B0aW9uIHRvIHNob3J0ZW4gdGhlIHNpemUgb2YgcmVmZXJlbmNlcyB0byB1bmRlZmluZWQKLXN5bWJvbHMuICBJZiB5b3UgZG8gbm90IHVzZSB0aGUgQHNhbXB7LWx9IG9wdGlvbiwgcmVmZXJlbmNlcyB0byB1bmRlZmluZWQKLXN5bWJvbHMgYXJlIHdpZGUgZW5vdWdoIGZvciBhIGZ1bGwgQGNvZGV7bG9uZ30gKDMyIGJpdHMpLiAgKFNpbmNlCi1AY29kZXtAdmFsdWV7QVN9fSBjYW5ub3Qga25vdyB3aGVyZSB0aGVzZSBzeW1ib2xzIGVuZCB1cCwgQGNvZGV7QHZhbHVle0FTfX0gY2FuCi1vbmx5IGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbGlua2VyIHRvIGZpbGwgaW4gbGF0ZXIuICBTaW5jZSBAY29kZXtAdmFsdWV7QVN9fQotZG9lcyBub3Qga25vdyBob3cgZmFyIGF3YXkgdGhlc2Ugc3ltYm9scyBhcmUsIGl0IGFsbG9jYXRlcyBhcyBtdWNoIHNwYWNlIGFzIGl0Ci1jYW4uKSAgSWYgeW91IHVzZSB0aGlzIG9wdGlvbiwgdGhlIHJlZmVyZW5jZXMgYXJlIG9ubHkgb25lIHdvcmQgd2lkZSAoMTYgYml0cykuCi1UaGlzIG1heSBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIG9iamVjdCBmaWxlIHRvIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLCBhbmQKLXlvdSBrbm93IHRoYXQgdGhlIHJlbGV2YW50IHN5bWJvbHMgYXJlIGFsd2F5cyBsZXNzIHRoYW4gMTcgYml0cyBhd2F5LgotCi1AY2luZGV4IEBzYW1wey0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsfSBvcHRpb24sIE02ODB4MAotRm9yIHNvbWUgY29uZmlndXJhdGlvbnMsIGVzcGVjaWFsbHkgdGhvc2Ugd2hlcmUgdGhlIGNvbXBpbGVyIG5vcm1hbGx5Ci1kb2VzIG5vdCBwcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8gdGhlIG5hbWVzIG9mIHVzZXIgdmFyaWFibGVzLCB0aGUKLWFzc2VtYmxlciByZXF1aXJlcyBhIEBzYW1weyV9IGJlZm9yZSBhbnkgdXNlIG9mIGEgcmVnaXN0ZXIgbmFtZS4gIFRoaXMKLWlzIGludGVuZGVkIHRvIGxldCB0aGUgYXNzZW1ibGVyIGRpc3Rpbmd1aXNoIGJldHdlZW4gQyB2YXJpYWJsZXMgYW5kCi1mdW5jdGlvbnMgbmFtZWQgQHNhbXB7YTB9IHRocm91Z2ggQHNhbXB7YTd9LCBhbmQgc28gb24uICBUaGUgQHNhbXB7JX0gaXMKLWFsd2F5cyBhY2NlcHRlZCwgYnV0IGlzIG5vdCByZXF1aXJlZCBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucywgbm90YWJseQotQHNhbXB7c3VuM30uICBUaGUgQHNhbXB7LS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWx9IG9wdGlvbiBtYXkgYmUgdXNlZAotdG8gcGVybWl0IG9taXR0aW5nIHRoZSBAc2FtcHslfSBldmVuIGZvciBjb25maWd1cmF0aW9ucyBmb3Igd2hpY2ggaXQgaXMKLW5vcm1hbGx5IHJlcXVpcmVkLiAgSWYgdGhpcyBpcyBkb25lLCBpdCB3aWxsIGdlbmVyYWxseSBiZSBpbXBvc3NpYmxlIHRvCi1yZWZlciB0byBDIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZXMgYXMgcmVnaXN0ZXIKLW5hbWVzLgotCi1AY2luZGV4IEBzYW1wey0tYml0d2lzZS1vcn0gb3B0aW9uLCBNNjgweDAKLU5vcm1hbGx5IHRoZSBjaGFyYWN0ZXIgQHNhbXB7fH0gaXMgdHJlYXRlZCBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyLCB3aGljaAotbWVhbnMgdGhhdCBpdCBjYW4gbm90IGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMuICBUaGUgQHNhbXB7LS1iaXR3aXNlLW9yfQotb3B0aW9uIHR1cm5zIEBzYW1we3x9IGludG8gYSBub3JtYWwgY2hhcmFjdGVyLiAgSW4gdGhpcyBtb2RlLCB5b3UgbXVzdAotZWl0aGVyIHVzZSBDIHN0eWxlIGNvbW1lbnRzLCBvciBzdGFydCBjb21tZW50cyB3aXRoIGEgQHNhbXB7I30gY2hhcmFjdGVyCi1hdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4KLQotQGNpbmRleCBAc2FtcHstLWJhc2Utc2l6ZS1kZWZhdWx0LTE2fQotQGNpbmRleCBAc2FtcHstLWJhc2Utc2l6ZS1kZWZhdWx0LTMyfQotSWYgeW91IHVzZSBhbiBhZGRyZXNzaW5nIG1vZGUgd2l0aCBhIGJhc2UgcmVnaXN0ZXIgd2l0aG91dCBzcGVjaWZ5aW5nCi10aGUgc2l6ZSwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBub3JtYWxseSB1c2UgdGhlIGZ1bGwgMzIgYml0IHZhbHVlLgotRm9yIGV4YW1wbGUsIHRoZSBhZGRyZXNzaW5nIG1vZGUgQHNhbXB7JWEwQEAoJWQwKX0gaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7JWEwQEAoJWQwOmwpfS4gIFlvdSBtYXkgdXNlIHRoZSBAc2FtcHstLWJhc2Utc2l6ZS1kZWZhdWx0LTE2fQotb3B0aW9uIHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0gdG8gZGVmYXVsdCB0byB1c2luZyB0aGUgMTYgYml0IHZhbHVlLgotSW4gdGhpcyBjYXNlLCBAc2FtcHslYTBAQCglZDApfSBpcyBlcXVpdmFsZW50IHRvIEBzYW1weyVhMEBAKCVkMDp3KX0uCi1Zb3UgbWF5IHVzZSB0aGUgQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0zMn0gb3B0aW9uIHRvIHJlc3RvcmUgdGhlCi1kZWZhdWx0IGJlaGF2aW91ci4KLQotQGNpbmRleCBAc2FtcHstLWRpc3Atc2l6ZS1kZWZhdWx0LTE2fQotQGNpbmRleCBAc2FtcHstLWRpc3Atc2l6ZS1kZWZhdWx0LTMyfQotSWYgeW91IHVzZSBhbiBhZGRyZXNzaW5nIG1vZGUgd2l0aCBhIGRpc3BsYWNlbWVudCwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUKLWRpc3BsYWNlbWVudCBpcyBub3Qga25vd24sIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgbm9ybWFsbHkgYXNzdW1lIHRoYXQKLXRoZSB2YWx1ZSBpcyAzMiBiaXRzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBzeW1ib2wgQHNhbXB7ZGlzcH0gaGFzIG5vdAotYmVlbiBkZWZpbmVkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGFzc2VtYmxlIHRoZSBhZGRyZXNzaW5nIG1vZGUKLUBzYW1weyVhMEBAKGRpc3AsJWQwKX0gYXMgdGhvdWdoIEBzYW1we2Rpc3B9IGlzIGEgMzIgYml0IHZhbHVlLiAgWW91IG1heQotdXNlIHRoZSBAc2FtcHstLWRpc3Atc2l6ZS1kZWZhdWx0LTE2fSBvcHRpb24gdG8gdGVsbCBAY29kZXtAdmFsdWV7QVN9fQotdG8gaW5zdGVhZCBhc3N1bWUgdGhhdCB0aGUgZGlzcGxhY2VtZW50IGlzIDE2IGJpdHMuICBJbiB0aGlzIGNhc2UsCi1AY29kZXtAdmFsdWV7QVN9fSB3aWxsIGFzc2VtYmxlIEBzYW1weyVhMEBAKGRpc3AsJWQwKX0gYXMgdGhvdWdoCi1Ac2FtcHtkaXNwfSBpcyBhIDE2IGJpdCB2YWx1ZS4gIFlvdSBtYXkgdXNlIHRoZQotQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0zMn0gb3B0aW9uIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLgotCi1AY2luZGV4IEBzYW1wey1tNjgwMDB9IGFuZCByZWxhdGVkIG9wdGlvbnMKLUBjaW5kZXggYXJjaGl0ZWN0dXJlIG9wdGlvbnMsIE02ODB4MAotQGNpbmRleCBNNjgweDAgYXJjaGl0ZWN0dXJlIG9wdGlvbnMKLUBjb2Rle0B2YWx1ZXtBU319IGNhbiBhc3NlbWJsZSBjb2RlIGZvciBzZXZlcmFsIGRpZmZlcmVudCBtZW1iZXJzIG9mIHRoZQotTW90b3JvbGEgNjgweDAgZmFtaWx5LiAgVGhlIGRlZmF1bHQgZGVwZW5kcyB1cG9uIGhvdyBAY29kZXtAdmFsdWV7QVN9fQotd2FzIGNvbmZpZ3VyZWQgd2hlbiBpdCB3YXMgYnVpbHQ7IG5vcm1hbGx5LCB0aGUgZGVmYXVsdCBpcyB0byBhc3NlbWJsZQotY29kZSBmb3IgdGhlIDY4MDIwIG1pY3JvcHJvY2Vzc29yLiAgVGhlIGZvbGxvd2luZyBvcHRpb25zIG1heSBiZSB1c2VkIHRvCi1jaGFuZ2UgdGhlIGRlZmF1bHQuICBUaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hpY2ggaW5zdHJ1Y3Rpb25zIGFuZAotYWRkcmVzc2luZyBtb2RlcyBhcmUgcGVybWl0dGVkLiAgVGhlIG1lbWJlcnMgb2YgdGhlIDY4MHgwIGZhbWlseSBhcmUKLXZlcnkgc2ltaWxhci4gIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlmZmVyZW5jZXMsIHNlZSB0aGUKLU1vdG9yb2xhIG1hbnVhbHMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gLW02ODAwMAotQGl0ZW14IC1tNjhlYzAwMAotQGl0ZW14IC1tNjhoYzAwMAotQGl0ZW14IC1tNjhoYzAwMQotQGl0ZW14IC1tNjgwMDgKLUBpdGVteCAtbTY4MzAyCi1AaXRlbXggLW02ODMwNgotQGl0ZW14IC1tNjgzMDcKLUBpdGVteCAtbTY4MzIyCi1AaXRlbXggLW02ODM1NgotQXNzZW1ibGUgZm9yIHRoZSA2ODAwMC4gQHNhbXB7LW02ODAwOH0sIEBzYW1wey1tNjgzMDJ9LCBhbmQgc28gb24gYXJlIHN5bm9ueW1zCi1mb3IgQHNhbXB7LW02ODAwMH0sIHNpbmNlIHRoZSBjaGlwcyBhcmUgdGhlIHNhbWUgZnJvbSB0aGUgcG9pbnQgb2Ygdmlldwotb2YgdGhlIGFzc2VtYmxlci4KLQotQGl0ZW0gLW02ODAxMAotQXNzZW1ibGUgZm9yIHRoZSA2ODAxMC4KLQotQGl0ZW0gLW02ODAyMAotQGl0ZW14IC1tNjhlYzAyMAotQXNzZW1ibGUgZm9yIHRoZSA2ODAyMC4gIFRoaXMgaXMgbm9ybWFsbHkgdGhlIGRlZmF1bHQuCi0KLUBpdGVtIC1tNjgwMzAKLUBpdGVteCAtbTY4ZWMwMzAKLUFzc2VtYmxlIGZvciB0aGUgNjgwMzAuCi0KLUBpdGVtIC1tNjgwNDAKLUBpdGVteCAtbTY4ZWMwNDAKLUFzc2VtYmxlIGZvciB0aGUgNjgwNDAuCi0KLUBpdGVtIC1tNjgwNjAKLUBpdGVteCAtbTY4ZWMwNjAKLUFzc2VtYmxlIGZvciB0aGUgNjgwNjAuCi0KLUBpdGVtIC1tY3B1MzIKLUBpdGVteCAtbTY4MzMwCi1AaXRlbXggLW02ODMzMQotQGl0ZW14IC1tNjgzMzIKLUBpdGVteCAtbTY4MzMzCi1AaXRlbXggLW02ODMzNAotQGl0ZW14IC1tNjgzMzYKLUBpdGVteCAtbTY4MzQwCi1AaXRlbXggLW02ODM0MQotQGl0ZW14IC1tNjgzNDkKLUBpdGVteCAtbTY4MzYwCi1Bc3NlbWJsZSBmb3IgdGhlIENQVTMyIGZhbWlseSBvZiBjaGlwcy4KLQotQGl0ZW0gLW01MjAwCi1Bc3NlbWJsZSBmb3IgdGhlIENvbGRGaXJlIGZhbWlseSBvZiBjaGlwcy4KLQotQGl0ZW0gLW02ODg4MQotQGl0ZW14IC1tNjg4ODIKLUFzc2VtYmxlIDY4ODgxIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZQotNjgwMjAsIDY4MDMwLCBhbmQgdGhlIENQVTMyLiAgVGhlIDY4MDQwIGFuZCA2ODA2MCBhbHdheXMgc3VwcG9ydAotZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSAtbW5vLTY4ODgxCi1EbyBub3QgYXNzZW1ibGUgNjg4ODEgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdAotZm9yIDY4MDAwIGFuZCB0aGUgNjgwMTAuICBUaGUgNjgwNDAgYW5kIDY4MDYwIGFsd2F5cyBzdXBwb3J0IGZsb2F0aW5nCi1wb2ludCBpbnN0cnVjdGlvbnMsIGV2ZW4gaWYgdGhpcyBvcHRpb24gaXMgdXNlZC4KLQotQGl0ZW0gLW02ODg1MQotQXNzZW1ibGUgNjg4NTEgTU1VIGluc3RydWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZSA2ODAyMCwKLTY4MDMwLCBhbmQgNjgwNjAuICBUaGUgNjgwNDAgYWNjZXB0cyBhIHNvbWV3aGF0IGRpZmZlcmVudCBzZXQgb2YgTU1VCi1pbnN0cnVjdGlvbnM7IEBzYW1wey1tNjg4NTF9IGFuZCBAc2FtcHstbTY4MDQwfSBzaG91bGQgbm90IGJlIHVzZWQKLXRvZ2V0aGVyLgotCi1AaXRlbSAtbW5vLTY4ODUxCi1EbyBub3QgYXNzZW1ibGUgNjg4NTEgTU1VIGluc3RydWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZQotNjgwMDAsIDY4MDEwLCBhbmQgdGhlIENQVTMyLiAgVGhlIDY4MDQwIGFjY2VwdHMgYSBzb21ld2hhdCBkaWZmZXJlbnQgc2V0Ci1vZiBNTVUgaW5zdHJ1Y3Rpb25zLgotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLVN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci0KLUBjaW5kZXggQHNje21pdH0KLVRoaXMgc3ludGF4IGZvciB0aGUgTW90b3JvbGEgNjgweDAgd2FzIGRldmVsb3BlZCBhdCBAc2N7bWl0fS4KLQotQGNpbmRleCBNNjgweDAgc3ludGF4Ci1AY2luZGV4IHN5bnRheCwgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBzaXplIG1vZGlmaWVycwotQGNpbmRleCBzaXplIG1vZGlmaWVycywgTTY4MHgwCi1UaGUgNjgweDAgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIGluc3RydWN0aW9ucyBuYW1lcyBhbmQKLXN5bnRheCBjb21wYXRpYmxlIHdpdGggdGhlIFN1biBhc3NlbWJsZXIuICBJbnRlcnZlbmluZyBwZXJpb2RzIGFyZQotaWdub3JlZDsgZm9yIGV4YW1wbGUsIEBzYW1we21vdmx9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7bW92Lmx9LgotCi1JbiB0aGUgZm9sbG93aW5nIHRhYmxlIEB2YXJ7YXBjfSBzdGFuZHMgZm9yIGFueSBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcnMKLShAc2FtcHslYTB9IHRocm91Z2ggQHNhbXB7JWE3fSksIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyVwY30pLCB0aGUKLXplcm8tYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgcHJvZ3JhbSBjb3VudGVyIChAc2FtcHslenBjfSksIGEgc3VwcHJlc3NlZAotYWRkcmVzcyByZWdpc3RlciAoQHNhbXB7JXphMH0gdGhyb3VnaCBAc2FtcHslemE3fSksIG9yIGl0IG1heSBiZSBvbWl0dGVkCi1lbnRpcmVseS4gIFRoZSB1c2Ugb2YgQHZhcntzaXplfSBtZWFucyBvbmUgb2YgQHNhbXB7d30gb3IgQHNhbXB7bH0sIGFuZAotaXQgbWF5IGJlIG9taXR0ZWQsIGFsb25nIHdpdGggdGhlIGxlYWRpbmcgY29sb24sIHVubGVzcyBhIHNjYWxlIGlzIGFsc28KLXNwZWNpZmllZC4gIFRoZSB1c2Ugb2YgQHZhcntzY2FsZX0gbWVhbnMgb25lIG9mIEBzYW1wezF9LCBAc2FtcHsyfSwKLUBzYW1wezR9LCBvciBAc2FtcHs4fSwgYW5kIGl0IG1heSBhbHdheXMgYmUgb21pdHRlZCBhbG9uZyB3aXRoIHRoZQotbGVhZGluZyBjb2xvbi4KLQotQGNpbmRleCBNNjgweDAgYWRkcmVzc2luZyBtb2RlcwotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBNNjgweDAKLVRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBhcmUgdW5kZXJzdG9vZDoKLUB0YWJsZSBAZGZuCi1AaXRlbSBJbW1lZGlhdGUKLUBzYW1weyNAdmFye251bWJlcn19Ci0KLUBpdGVtIERhdGEgUmVnaXN0ZXIKLUBzYW1weyVkMH0gdGhyb3VnaCBAc2FtcHslZDd9Ci0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIKLUBzYW1weyVhMH0gdGhyb3VnaCBAc2FtcHslYTd9QCoKLUBzYW1weyVhN30gaXMgYWxzbyBrbm93biBhcyBAc2FtcHslc3B9LCBpLmUuIHRoZSBTdGFjayBQb2ludGVyLiAgQGNvZGV7JWE2fQotaXMgYWxzbyBrbm93biBhcyBAc2FtcHslZnB9LCB0aGUgRnJhbWUgUG9pbnRlci4KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBJbmRpcmVjdAotQHNhbXB7JWEwQEB9IHRocm91Z2ggQHNhbXB7JWE3QEB9Ci0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgUG9zdGluY3JlbWVudAotQHNhbXB7JWEwQEArfSB0aHJvdWdoIEBzYW1weyVhN0BAK30KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQcmVkZWNyZW1lbnQKLUBzYW1weyVhMEBALX0gdGhyb3VnaCBAc2FtcHslYTdAQC19Ci0KLUBpdGVtIEluZGlyZWN0IFBsdXMgT2Zmc2V0Ci1Ac2FtcHtAdmFye2FwY31AQChAdmFye251bWJlcn0pfQotCi1AaXRlbSBJbmRleAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9LEB2YXJ7cmVnaXN0ZXJ9OkB2YXJ7c2l6ZX06QHZhcntzY2FsZX0pfQotCi1UaGUgQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkLgotCi1AaXRlbSBQb3N0aW5kZXgKLUBzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSlAQChAdmFye29udW1iZXJ9LEB2YXJ7cmVnaXN0ZXJ9OkB2YXJ7c2l6ZX06QHZhcntzY2FsZX0pfQotCi1UaGUgQHZhcntvbnVtYmVyfSBvciB0aGUgQHZhcntyZWdpc3Rlcn0sIGJ1dCBub3QgYm90aCwgbWF5IGJlIG9taXR0ZWQuCi0KLUBpdGVtIFByZWluZGV4Ci1Ac2FtcHtAdmFye2FwY31AQChAdmFye251bWJlcn0sQHZhcntyZWdpc3Rlcn06QHZhcntzaXplfTpAdmFye3NjYWxlfSlAQChAdmFye29udW1iZXJ9KX0KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZC4gIE9taXR0aW5nIHRoZSBAdmFye3JlZ2lzdGVyfSBwcm9kdWNlcwotdGhlIFBvc3RpbmRleCBhZGRyZXNzaW5nIG1vZGUuCi0KLUBpdGVtIEFic29sdXRlCi1Ac2FtcHtAdmFye3N5bWJvbH19LCBvciBAc2FtcHtAdmFye2RpZ2l0c319LCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5Ci1Ac2FtcHs6Yn0sIEBzYW1wezp3fSwgb3IgQHNhbXB7Omx9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLU1vdG8tU3ludGF4Ci1Ac2VjdGlvbiBNb3Rvcm9sYSBTeW50YXgKLQotQGNpbmRleCBNb3Rvcm9sYSBzeW50YXggZm9yIHRoZSA2ODB4MAotQGNpbmRleCBhbHRlcm5hdGUgc3ludGF4IGZvciB0aGUgNjgweDAKLQotVGhlIHN0YW5kYXJkIE1vdG9yb2xhIHN5bnRheCBmb3IgdGhpcyBjaGlwIGRpZmZlcnMgZnJvbSB0aGUgc3ludGF4Ci1hbHJlYWR5IGRpc2N1c3NlZCAoQHB4cmVme002OEstU3ludGF4LCxTeW50YXh9KS4gIEBjb2Rle0B2YWx1ZXtBU319IGNhbgotYWNjZXB0IE1vdG9yb2xhIHN5bnRheCBmb3Igb3BlcmFuZHMsIGV2ZW4gaWYgQHNje21pdH0gc3ludGF4IGlzIHVzZWQgZm9yCi1vdGhlciBvcGVyYW5kcyBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gIFRoZSB0d28ga2luZHMgb2Ygc3ludGF4IGFyZQotZnVsbHkgY29tcGF0aWJsZS4KLQotSW4gdGhlIGZvbGxvd2luZyB0YWJsZSBAdmFye2FwY30gc3RhbmRzIGZvciBhbnkgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXJzCi0oQHNhbXB7JWEwfSB0aHJvdWdoIEBzYW1weyVhN30pLCB0aGUgcHJvZ3JhbSBjb3VudGVyIChAc2FtcHslcGN9KSwgdGhlCi16ZXJvLWFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXpwY30pLCBvciBhCi1zdXBwcmVzc2VkIGFkZHJlc3MgcmVnaXN0ZXIgKEBzYW1weyV6YTB9IHRocm91Z2ggQHNhbXB7JXphN30pLiAgVGhlIHVzZQotb2YgQHZhcntzaXplfSBtZWFucyBvbmUgb2YgQHNhbXB7d30gb3IgQHNhbXB7bH0sIGFuZCBpdCBtYXkgYWx3YXlzIGJlCi1vbWl0dGVkIGFsb25nIHdpdGggdGhlIGxlYWRpbmcgZG90LiAgVGhlIHVzZSBvZiBAdmFye3NjYWxlfSBtZWFucyBvbmUgb2YKLUBzYW1wezF9LCBAc2FtcHsyfSwgQHNhbXB7NH0sIG9yIEBzYW1wezh9LCBhbmQgaXQgbWF5IGFsd2F5cyBiZSBvbWl0dGVkCi1hbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGFzdGVyaXNrLgotCi1UaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYWRkcmVzc2luZyBtb2RlcyBhcmUgdW5kZXJzdG9vZDoKLQotQHRhYmxlIEBkZm4KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QKLUBzYW1weyglYTApfSB0aHJvdWdoIEBzYW1weyglYTcpfUAqIAotQHNhbXB7JWE3fSBpcyBhbHNvIGtub3duIGFzIEBzYW1weyVzcH0sIGkuZS4gdGhlIFN0YWNrIFBvaW50ZXIuICBAY29kZXslYTZ9Ci1pcyBhbHNvIGtub3duIGFzIEBzYW1weyVmcH0sIHRoZSBGcmFtZSBQb2ludGVyLgotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFBvc3RpbmNyZW1lbnQKLUBzYW1weyglYTApK30gdGhyb3VnaCBAc2FtcHsoJWE3KSt9Ci0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgUHJlZGVjcmVtZW50Ci1Ac2FtcHstKCVhMCl9IHRocm91Z2ggQHNhbXB7LSglYTcpfQotCi1AaXRlbSBJbmRpcmVjdCBQbHVzIE9mZnNldAotQHNhbXB7QHZhcntudW1iZXJ9KEB2YXJ7JWEwfSl9IHRocm91Z2ggQHNhbXB7QHZhcntudW1iZXJ9KEB2YXJ7JWE3fSl9LAotb3IgQHNhbXB7QHZhcntudW1iZXJ9KEB2YXJ7JXBjfSl9LgotCi1UaGUgQHZhcntudW1iZXJ9IG1heSBhbHNvIGFwcGVhciB3aXRoaW4gdGhlIHBhcmVudGhlc2VzLCBhcyBpbgotQHNhbXB7KEB2YXJ7bnVtYmVyfSxAdmFyeyVhMH0pfS4gIFdoZW4gdXNlZCB3aXRoIHRoZSBAdmFye3BjfSwgdGhlCi1AdmFye251bWJlcn0gbWF5IGJlIG9taXR0ZWQgKHdpdGggYW4gYWRkcmVzcyByZWdpc3Rlciwgb21pdHRpbmcgdGhlCi1AdmFye251bWJlcn0gcHJvZHVjZXMgQWRkcmVzcyBSZWdpc3RlciBJbmRpcmVjdCBtb2RlKS4KLQotQGl0ZW0gSW5kZXgKLUBzYW1we0B2YXJ7bnVtYmVyfShAdmFye2FwY30sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfSl9Ci0KLVRoZSBAdmFye251bWJlcn0gbWF5IGJlIG9taXR0ZWQsIG9yIGl0IG1heSBhcHBlYXIgd2l0aGluIHRoZQotcGFyZW50aGVzZXMuICBUaGUgQHZhcnthcGN9IG1heSBiZSBvbWl0dGVkLiAgVGhlIEB2YXJ7cmVnaXN0ZXJ9IGFuZCB0aGUKLUB2YXJ7YXBjfSBtYXkgYXBwZWFyIGluIGVpdGhlciBvcmRlci4gIElmIGJvdGggQHZhcnthcGN9IGFuZAotQHZhcntyZWdpc3Rlcn0gYXJlIGFkZHJlc3MgcmVnaXN0ZXJzLCBhbmQgdGhlIEB2YXJ7c2l6ZX0gYW5kIEB2YXJ7c2NhbGV9Ci1hcmUgb21pdHRlZCwgdGhlbiB0aGUgZmlyc3QgcmVnaXN0ZXIgaXMgdGFrZW4gYXMgdGhlIGJhc2UgcmVnaXN0ZXIsIGFuZAotdGhlIHNlY29uZCBhcyB0aGUgaW5kZXggcmVnaXN0ZXIuCi0KLUBpdGVtIFBvc3RpbmRleAotQHNhbXB7KFtAdmFye251bWJlcn0sQHZhcnthcGN9XSxAdmFye3JlZ2lzdGVyfS5AdmFye3NpemV9KkB2YXJ7c2NhbGV9LEB2YXJ7b251bWJlcn0pfQotCi1UaGUgQHZhcntvbnVtYmVyfSwgb3IgdGhlIEB2YXJ7cmVnaXN0ZXJ9LCBvciBib3RoLCBtYXkgYmUgb21pdHRlZC4KLUVpdGhlciB0aGUgQHZhcntudW1iZXJ9IG9yIHRoZSBAdmFye2FwY30gbWF5IGJlIG9taXR0ZWQsIGJ1dCBub3QgYm90aC4KLQotQGl0ZW0gUHJlaW5kZXgKLUBzYW1weyhbQHZhcntudW1iZXJ9LEB2YXJ7YXBjfSxAdmFye3JlZ2lzdGVyfS5AdmFye3NpemV9KkB2YXJ7c2NhbGV9XSxAdmFye29udW1iZXJ9KX0KLQotVGhlIEB2YXJ7bnVtYmVyfSwgb3IgdGhlIEB2YXJ7YXBjfSwgb3IgdGhlIEB2YXJ7cmVnaXN0ZXJ9LCBvciBhbnkgdHdvIG9mCi10aGVtLCBtYXkgYmUgb21pdHRlZC4gIFRoZSBAdmFye29udW1iZXJ9IG1heSBiZSBvbWl0dGVkLiAgVGhlCi1AdmFye3JlZ2lzdGVyfSBhbmQgdGhlIEB2YXJ7YXBjfSBtYXkgYXBwZWFyIGluIGVpdGhlciBvcmRlci4gIElmIGJvdGgKLUB2YXJ7YXBjfSBhbmQgQHZhcntyZWdpc3Rlcn0gYXJlIGFkZHJlc3MgcmVnaXN0ZXJzLCBhbmQgdGhlIEB2YXJ7c2l6ZX0KLWFuZCBAdmFye3NjYWxlfSBhcmUgb21pdHRlZCwgdGhlbiB0aGUgZmlyc3QgcmVnaXN0ZXIgaXMgdGFrZW4gYXMgdGhlCi1iYXNlIHJlZ2lzdGVyLCBhbmQgdGhlIHNlY29uZCBhcyB0aGUgaW5kZXggcmVnaXN0ZXIuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIE02ODB4MAotQGNpbmRleCBNNjgweDAgZmxvYXRpbmcgcG9pbnQKLVBhY2tlZCBkZWNpbWFsIChQKSBmb3JtYXQgZmxvYXRpbmcgbGl0ZXJhbHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi1GZWVsIGZyZWUgdG8gYWRkIHRoZSBjb2RlIQotCi1UaGUgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cyBnZW5lcmF0ZWQgYnkgZGlyZWN0aXZlcyBhcmUgdGhlc2UuCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtmbG9hdH0gZGlyZWN0aXZlLCBNNjgweDAKLUBpdGVtIC5mbG9hdAotQGNvZGV7U2luZ2xlfSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlLCBNNjgweDAKLUBpdGVtIC5kb3VibGUKLUBjb2Rle0RvdWJsZX0gcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtleHRlbmR9IGRpcmVjdGl2ZSBNNjgweDAKLUBjaW5kZXggQGNvZGV7bGRvdWJsZX0gZGlyZWN0aXZlIE02ODB4MAotQGl0ZW0gLmV4dGVuZAotQGl0ZW14IC5sZG91YmxlCi1AY29kZXtFeHRlbmRlZH0gcHJlY2lzaW9uIChAY29kZXtsb25nIGRvdWJsZX0pIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1EaXJlY3RpdmVzCi1Ac2VjdGlvbiA2ODB4MCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBNNjgweDAgZGlyZWN0aXZlcwotQGNpbmRleCBkaXJlY3RpdmVzLCBNNjgweDAKLUluIG9yZGVyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgU3VuIGFzc2VtYmxlciB0aGUgNjgweDAgYXNzZW1ibGVyCi11bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMuCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtkYXRhMX0gZGlyZWN0aXZlLCBNNjgweDAKLUBpdGVtIC5kYXRhMQotVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LmRhdGEgMX0gZGlyZWN0aXZlLgotCi1AY2luZGV4IEBjb2Rle2RhdGEyfSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmRhdGEyCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZGVudGljYWwgdG8gYSBAY29kZXsuZGF0YSAyfSBkaXJlY3RpdmUuCi0KLUBjaW5kZXggQGNvZGV7ZXZlbn0gZGlyZWN0aXZlLCBNNjgweDAKLUBpdGVtIC5ldmVuCi1UaGlzIGRpcmVjdGl2ZSBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgQGNvZGV7LmFsaWdufSBkaXJlY3RpdmU7IGl0Ci1hbGlnbnMgdGhlIG91dHB1dCB0byBhbiBldmVuIGJ5dGUgYm91bmRhcnkuCi0KLUBjaW5kZXggQGNvZGV7c2tpcH0gZGlyZWN0aXZlLCBNNjgweDAKLUBpdGVtIC5za2lwCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZGVudGljYWwgdG8gYSBAY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4KLUBlbmQgdGFibGUKLQotQG5lZWQgMjAwMAotQG5vZGUgTTY4Sy1vcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggTTY4MHgwIG9wY29kZXMKLUBjaW5kZXggb3Bjb2RlcywgTTY4MHgwCi1AY2luZGV4IGluc3RydWN0aW9uIHNldCwgTTY4MHgwCi1AYyBkb2NAY3lnbnVzLmNvbTogSSBkb24ndCBzZWUgYW55IHBvaW50IGluIHRoZSBmb2xsb3dpbmcKLUBjICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC4gIEJ1Z3MgYXJlIGJ1Z3M7IGhvdyBkb2VzIHNheWluZyB0aGlzCi1AYyAgICAgICAgICAgICAgICAgICBoZWxwIGFueW9uZT8KLUBpZ25vcmUKLURhbmdlcjogIFNldmVyYWwgYnVncyBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIG9wY29kZSB0YWJsZSAoYW5kCi1maXhlZCkuICBNb3JlIGJ1Z3MgbWF5IGV4aXN0LiAgQmUgY2FyZWZ1bCB3aGVuIHVzaW5nIG9ic2N1cmUKLWluc3RydWN0aW9ucy4KLUBlbmQgaWdub3JlCi0KLUBtZW51Ci0qIE02OEstQnJhbmNoOjogICAgICAgICAgICAgICAgIEJyYW5jaCBJbXByb3ZlbWVudAotKiBNNjhLLUNoYXJzOjogICAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLUBlbmQgbWVudQotCi1Abm9kZSBNNjhLLUJyYW5jaAotQHN1YnNlY3Rpb24gQnJhbmNoIEltcHJvdmVtZW50Ci0KLUBjaW5kZXggcHNldWRvLW9wY29kZXMsIE02ODB4MAotQGNpbmRleCBNNjgweDAgcHNldWRvLW9wY29kZXMKLUBjaW5kZXggYnJhbmNoIGltcHJvdmVtZW50LCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGJyYW5jaCBpbXByb3ZlbWVudAotQ2VydGFpbiBwc2V1ZG8gb3Bjb2RlcyBhcmUgcGVybWl0dGVkIGZvciBicmFuY2ggaW5zdHJ1Y3Rpb25zLgotVGhleSBleHBhbmQgdG8gdGhlIHNob3J0ZXN0IGJyYW5jaCBpbnN0cnVjdGlvbiB0aGF0IHJlYWNoIHRoZQotdGFyZ2V0LiAgR2VuZXJhbGx5IHRoZXNlIG1uZW1vbmljcyBhcmUgbWFkZSBieSBzdWJzdGl0dXRpbmcgQHNhbXB7an0gZm9yCi1Ac2FtcHtifSBhdCB0aGUgc3RhcnQgb2YgYSBNb3Rvcm9sYSBtbmVtb25pYy4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBwc2V1ZG8tb3BlcmF0aW9ucy4gIEEgQGNvZGV7Kn0gZmxhZ3MKLWNhc2VzIHRoYXQgYXJlIG1vcmUgZnVsbHkgZGVzY3JpYmVkIGFmdGVyIHRoZSB0YWJsZToKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAgIERpc3BsYWNlbWVudAotICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgfCAgICAgICAgICAgICAgICA2ODAyMCAgIDY4MDAwLzEwCi1Qc2V1ZG8tT3AgfEJZVEUgICAgV09SRCAgICBMT05HICAgIExPTkcgICAgICBub24tUEMgcmVsYXRpdmUKLSAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBqYnNyIHxic3JzICAgIGJzciAgICAgYnNybCAgICBqc3IgICAgICAganNyCi0gICAgICBqcmEgfGJyYXMgICAgYnJhICAgICBicmFsICAgIGptcCAgICAgICBqbXAKLSogICAgIGpYWCB8YlhYcyAgICBiWFggICAgIGJYWGwgICAgYk5YcztqbXBsIGJOWHM7am1wCi0qICAgIGRiWFggfGRiWFggICAgZGJYWCAgICAgICAgZGJYWDsgYnJhOyBqbXBsCi0qICAgIGZqWFggfGZiWFh3ICAgZmJYWHcgICBmYlhYbCAgICAgICAgICAgICBmYk5YdztqbXAKLQotWFg6IGNvbmRpdGlvbgotTlg6IG5lZ2F0aXZlIG9mIGNvbmRpdGlvbiBYWAotCi1AZW5kIHNtYWxsZXhhbXBsZQotQGNlbnRlciBAY29kZXsqfS0tLXNlZSBmdWxsIGRlc2NyaXB0aW9uIGJlbG93Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gamJzcgotQGl0ZW14IGpyYQotVGhlc2UgYXJlIHRoZSBzaW1wbGVzdCBqdW1wIHBzZXVkby1vcGVyYXRpb25zOyB0aGV5IGFsd2F5cyBtYXAgdG8gb25lCi1wYXJ0aWN1bGFyIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sIGRlcGVuZGluZyBvbiB0aGUgZGlzcGxhY2VtZW50IHRvIHRoZQotYnJhbmNoIHRhcmdldC4KLQotQGl0ZW0gakB2YXJ7WFh9Ci1IZXJlLCBAc2FtcHtqQHZhcntYWH19IHN0YW5kcyBmb3IgYW4gZW50aXJlIGZhbWlseSBvZiBwc2V1ZG8tb3BlcmF0aW9ucywKLXdoZXJlIEB2YXJ7WFh9IGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoIG9yIGNvbmRpdGlvbi1jb2RlIHRlc3QuICBUaGUgZnVsbAotbGlzdCBvZiBwc2V1ZG8tb3BzIGluIHRoaXMgZmFtaWx5IGlzOgotQHNtYWxsZXhhbXBsZQotIGpoaSAgIGpscyAgIGpjYyAgIGpjcyAgIGpuZSAgIGplcSAgIGp2YwotIGp2cyAgIGpwbCAgIGptaSAgIGpnZSAgIGpsdCAgIGpndCAgIGpsZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotRm9yIHRoZSBjYXNlcyBvZiBub24tUEMgcmVsYXRpdmUgZGlzcGxhY2VtZW50cyBhbmQgbG9uZyBkaXNwbGFjZW1lbnRzIG9uCi10aGUgNjgwMDAgb3IgNjgwMTAsIEBjb2Rle0B2YWx1ZXtBU319IGlzc3VlcyBhIGxvbmdlciBjb2RlIGZyYWdtZW50IGluIHRlcm1zIG9mCi1AdmFye05YfSwgdGhlIG9wcG9zaXRlIGNvbmRpdGlvbiB0byBAdmFye1hYfS4gIEZvciBleGFtcGxlLCBmb3IgdGhlCi1ub24tUEMgcmVsYXRpdmUgY2FzZToKLUBzbWFsbGV4YW1wbGUKLSAgICBqQHZhcntYWH0gZm9vCi1AZW5kIHNtYWxsZXhhbXBsZQotZ2l2ZXMKLUBzbWFsbGV4YW1wbGUKLSAgICAgYkB2YXJ7Tlh9cyBvb2YKLSAgICAgam1wIGZvbwotIG9vZjoKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIGRiQHZhcntYWH0KLVRoZSBmdWxsIGZhbWlseSBvZiBwc2V1ZG8tb3BlcmF0aW9ucyBjb3ZlcmVkIGhlcmUgaXMKLUBzbWFsbGV4YW1wbGUKLSBkYmhpICAgZGJscyAgIGRiY2MgICBkYmNzICAgZGJuZSAgIGRiZXEgICBkYnZjCi0gZGJ2cyAgIGRicGwgICBkYm1pICAgZGJnZSAgIGRibHQgICBkYmd0ICAgZGJsZQotIGRiZiAgICBkYnJhICAgZGJ0Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1PdGhlciB0aGFuIGZvciB3b3JkIGFuZCBieXRlIGRpc3BsYWNlbWVudHMsIHdoZW4gdGhlIHNvdXJjZSByZWFkcwotQHNhbXB7ZGJAdmFye1hYfSBmb299LCBAY29kZXtAdmFsdWV7QVN9fSBlbWl0cwotQHNtYWxsZXhhbXBsZQotICAgICBkYkB2YXJ7WFh9IG9vMQotICAgICBicmEgb28yCi0gb28xOmptcGwgZm9vCi0gb28yOgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gZmpAdmFye1hYfQotVGhpcyBmYW1pbHkgaW5jbHVkZXMKLUBzbWFsbGV4YW1wbGUKLSBmam5lICAgZmplcSAgIGZqZ2UgICBmamx0ICAgZmpndCAgIGZqbGUgICBmamYKLSBmanQgICAgZmpnbCAgIGZqZ2xlICBmam5nZSAgZmpuZ2wgIGZqbmdsZSBmam5ndAotIGZqbmxlICBmam5sdCAgZmpvZ2UgIGZqb2dsICBmam9ndCAgZmpvbGUgIGZqb2x0Ci0gZmpvciAgIGZqc2VxICBmanNmICAgZmpzbmUgIGZqc3QgICBmanVlcSAgZmp1Z2UKLSBmanVndCAgZmp1bGUgIGZqdWx0ICBmanVuCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Gb3IgYnJhbmNoIHRhcmdldHMgdGhhdCBhcmUgbm90IFBDIHJlbGF0aXZlLCBAY29kZXtAdmFsdWV7QVN9fSBlbWl0cwotQHNtYWxsZXhhbXBsZQotICAgICBmYkB2YXJ7Tlh9IG9vZgotICAgICBqbXAgZm9vCi0gb29mOgotQGVuZCBzbWFsbGV4YW1wbGUKLXdoZW4gaXQgZW5jb3VudGVycyBAc2FtcHtmakB2YXJ7WFh9IGZvb30uCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggc3BlY2lhbCBjaGFyYWN0ZXJzLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGltbWVkaWF0ZSBjaGFyYWN0ZXIKLUBjaW5kZXggaW1tZWRpYXRlIGNoYXJhY3RlciwgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIE02ODB4MAotQGNpbmRleCBjb21tZW50cywgTTY4MHgwCi1UaGUgaW1tZWRpYXRlIGNoYXJhY3RlciBpcyBAc2FtcHsjfSBmb3IgU3VuIGNvbXBhdGliaWxpdHkuICBUaGUKLWxpbmUtY29tbWVudCBjaGFyYWN0ZXIgaXMgQHNhbXB7fH0gKHVubGVzcyB0aGUgQHNhbXB7LS1iaXR3aXNlLW9yfQotb3B0aW9uIGlzIHVzZWQpLiAgSWYgYSBAc2FtcHsjfSBhcHBlYXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLCBpdAotaXMgdHJlYXRlZCBhcyBhIGNvbW1lbnQgdW5sZXNzIGl0IGxvb2tzIGxpa2UgQHNhbXB7IyBsaW5lIGZpbGV9LCBpbgotd2hpY2ggY2FzZSBpdCBpcyB0cmVhdGVkIG5vcm1hbGx5LgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtbWlwcy50ZXhpIGIvZ2FzL2RvYy9jLW1pcHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzZGRhMy4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtbWlwcy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgTUlQUy1EZXBlbmRlbnQKLUBjaGFwdGVyIE1JUFMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTUlQUyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IE1JUFMgcHJvY2Vzc29yCi1Ac2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fSBmb3IgQHNje21pcHN9IGFyY2hpdGVjdHVyZXMgc3VwcG9ydHMgc2V2ZXJhbAotZGlmZmVyZW50IEBzY3ttaXBzfSBwcm9jZXNzb3JzLCBhbmQgTUlQUyBJU0EgbGV2ZWxzIEkgdGhyb3VnaCBJVi4gIEZvcgotaW5mb3JtYXRpb24gYWJvdXQgdGhlIEBzY3ttaXBzfSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtNSVBTIFJJU0MKLUFyY2hpdGVjdHVyZX0sIGJ5IEthbmUgYW5kIEhlaW5kcmljaCAoUHJlbnRpY2UtSGFsbCkuICBGb3IgYW4gb3ZlcnZpZXcKLW9mIEBzY3ttaXBzfSBhc3NlbWJseSBjb252ZW50aW9ucywgc2VlIGBgQXBwZW5kaXggRDogQXNzZW1ibHkgTGFuZ3VhZ2UKLVByb2dyYW1taW5nJycgaW4gdGhlIHNhbWUgd29yay4KLQotQG1lbnUKLSogTUlQUyBPcHRzOjogICAJQXNzZW1ibGVyIG9wdGlvbnMKLSogTUlQUyBPYmplY3Q6OiAJRUNPRkYgb2JqZWN0IGNvZGUKLSogTUlQUyBTdGFiczo6ICAJRGlyZWN0aXZlcyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0qIE1JUFMgSVNBOjogICAgCURpcmVjdGl2ZXMgdG8gb3ZlcnJpZGUgdGhlIElTQSBsZXZlbAotKiBNSVBTIGF1dG9leHRlbmQ6OglEaXJlY3RpdmVzIGZvciBleHRlbmRpbmcgTUlQUyAxNiBiaXQgaW5zdHJ1Y3Rpb25zCi0qIE1JUFMgaW5zbjo6CQlEaXJlY3RpdmUgdG8gbWFyayBkYXRhIGFzIGFuIGluc3RydWN0aW9uCi0qIE1JUFMgb3B0aW9uIHN0YWNrOjoJRGlyZWN0aXZlcyB0byBzYXZlIGFuZCByZXN0b3JlIG9wdGlvbnMKLUBlbmQgbWVudQotCi1Abm9kZSBNSVBTIE9wdHMKLUBzZWN0aW9uIEFzc2VtYmxlciBvcHRpb25zCi0KLVRoZSBAc2N7bWlwc30gY29uZmlndXJhdGlvbnMgb2YgQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydCB0aGVzZQotc3BlY2lhbCBvcHRpb25zOgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7LUd9IG9wdGlvbiAoTUlQUykKLUBpdGVtIC1HIEB2YXJ7bnVtfQotVGhpcyBvcHRpb24gc2V0cyB0aGUgbGFyZ2VzdCBzaXplIG9mIGFuIG9iamVjdCB0aGF0IGNhbiBiZSByZWZlcmVuY2VkCi1pbXBsaWNpdGx5IHdpdGggdGhlIEBjb2Rle2dwfSByZWdpc3Rlci4gIEl0IGlzIG9ubHkgYWNjZXB0ZWQgZm9yIHRhcmdldHMKLXRoYXQgdXNlIEBzY3tlY29mZn0gZm9ybWF0LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4KLQotQGNpbmRleCBAY29kZXstRUJ9IG9wdGlvbiAoTUlQUykKLUBjaW5kZXggQGNvZGV7LUVMfSBvcHRpb24gKE1JUFMpCi1AY2luZGV4IE1JUFMgYmlnLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggTUlQUyBsaXR0bGUtZW5kaWFuIG91dHB1dAotQGNpbmRleCBiaWctZW5kaWFuIG91dHB1dCwgTUlQUwotQGNpbmRleCBsaXR0bGUtZW5kaWFuIG91dHB1dCwgTUlQUwotQGl0ZW0gLUVCCi1AaXRlbXggLUVMCi1BbnkgQHNje21pcHN9IGNvbmZpZ3VyYXRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gY2FuIHNlbGVjdCBiaWctZW5kaWFuIG9yCi1saXR0bGUtZW5kaWFuIG91dHB1dCBhdCBydW4gdGltZSAodW5saWtlIHRoZSBvdGhlciBAc2N7Z251fSBkZXZlbG9wbWVudAotdG9vbHMsIHdoaWNoIG11c3QgYmUgY29uZmlndXJlZCBmb3Igb25lIG9yIHRoZSBvdGhlcikuICBVc2UgQHNhbXB7LUVCfQotdG8gc2VsZWN0IGJpZy1lbmRpYW4gb3V0cHV0LCBhbmQgQHNhbXB7LUVMfSBmb3IgbGl0dGxlLWVuZGlhbi4KLQotQGNpbmRleCBNSVBTIGFyY2hpdGVjdHVyZSBvcHRpb25zCi1AaXRlbSAtbWlwczEKLUBpdGVteCAtbWlwczIKLUBpdGVteCAtbWlwczMKLUBpdGVteCAtbWlwczQKLUdlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwuCi1Ac2FtcHstbWlwczF9IGNvcnJlc3BvbmRzIHRvIHRoZSBAc2N7cjIwMDB9IGFuZCBAc2N7cjMwMDB9IHByb2Nlc3NvcnMsCi1Ac2FtcHstbWlwczJ9IHRvIHRoZSBAc2N7cjYwMDB9IHByb2Nlc3NvciwgQHNhbXB7LW1pcHMzfSB0byB0aGUKLUBzY3tyNDAwMH0gcHJvY2Vzc29yLCBhbmQgQHNhbXB7LW1pcHM0fSB0byB0aGUgQHNje3I4MDAwfSBhbmQKLUBzY3tyMTAwMDB9IHByb2Nlc3NvcnMuICBZb3UgY2FuIGFsc28gc3dpdGNoIGluc3RydWN0aW9uIHNldHMgZHVyaW5nIHRoZQotYXNzZW1ibHk7IHNlZSBAcmVme01JUFMgSVNBLCwgRGlyZWN0aXZlcyB0byBvdmVycmlkZSB0aGUgSVNBIGxldmVsfS4KLQotQGl0ZW0gLW1pcHMxNgotQGl0ZW14IC1uby1taXBzMTYKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTIDE2IHByb2Nlc3Nvci4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBwdXR0aW5nCi1Ac2FtcHsuc2V0IG1pcHMxNn0gYXQgdGhlIHN0YXJ0IG9mIHRoZSBhc3NlbWJseSBmaWxlLiAgQHNhbXB7LW5vLW1pcHMxNn0KLXR1cm5zIG9mZiB0aGlzIG9wdGlvbi4KLQotQGl0ZW0gLW00MDEwCi1AaXRlbXggLW5vLW00MDEwCi1HZW5lcmF0ZSBjb2RlIGZvciB0aGUgTFNJIEBzY3tyNDAxMH0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0bwotYWNjZXB0IHRoZSBAc2N7cjQwMTB9IHNwZWNpZmljIGluc3RydWN0aW9ucyAoQHNhbXB7YWRkY2l1fSwgQHNhbXB7ZmZjfSwKLWV0Yy4pLCBhbmQgdG8gbm90IHNjaGVkdWxlIEBzYW1we25vcH0gaW5zdHJ1Y3Rpb25zIGFyb3VuZCBhY2Nlc3NlcyB0bwotdGhlIEBzYW1we0hJfSBhbmQgQHNhbXB7TE99IHJlZ2lzdGVycy4gIEBzYW1wey1uby1tNDAxMH0gdHVybnMgb2ZmIHRoaXMKLW9wdGlvbi4KLQotQGl0ZW0gLW00NjUwCi1AaXRlbXggLW5vLW00NjUwCi1HZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUyBAc2N7cjQ2NTB9IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0Ci10aGUgQHNhbXB7bWFkfSBhbmQgQHNhbXB7bWFkdX0gaW5zdHJ1Y3Rpb24sIGFuZCB0byBub3Qgc2NoZWR1bGUgQHNhbXB7bm9wfQotaW5zdHJ1Y3Rpb25zIGFyb3VuZCBhY2Nlc3NlcyB0byB0aGUgQHNhbXB7SEl9IGFuZCBAc2FtcHtMT30gcmVnaXN0ZXJzLgotQHNhbXB7LW5vLW00NjUwfSB0dXJucyBvZmYgdGhpcyBvcHRpb24uCi0KLUBpdGVteCAtbTM5MDAKLUBpdGVteCAtbm8tbTM5MDAKLUBpdGVteCAtbTQxMDAKLUBpdGVteCAtbm8tbTQxMDAKLUZvciBlYWNoIG9wdGlvbiBAc2FtcHstbUB2YXJ7bm5ubn19LCBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUwotQHNje3JAdmFye25ubm59fSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCBpbnN0cnVjdGlvbnMKLXNwZWNpZmljIHRvIHRoYXQgY2hpcCwgYW5kIHRvIHNjaGVkdWxlIGZvciB0aGF0IGNoaXAncyBoYXphcmRzLgotCi1AaXRlbSAtbWNwdT1AdmFye2NwdX0KLUdlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIGNwdS4gIEl0IGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0bwotQHNhbXB7LW1AdmFye2NwdX19LCBleGNlcHQgdGhhdCB0aGVyZSBhcmUgbW9yZSB2YWx1ZSBvZiBAdmFye2NwdX0KLXVuZGVyc3Rvb2QuICBWYWxpZCBAdmFye2NwdX0gdmFsdWUgYXJlOgotCi1AcXVvdGF0aW9uCi0yMDAwLAotMzAwMCwKLTM5MDAsCi00MDAwLAotNDAxMCwKLTQxMDAsCi00MTExLAotNDMwMCwKLTQ0MDAsCi00NjAwLAotNDY1MCwKLTUwMDAsCi02MDAwLAotODAwMCwKLTEwMDAwCi1AZW5kIHF1b3RhdGlvbgotCi0KLUBjaW5kZXggQGNvZGV7LW5vY3BwfSBpZ25vcmVkIChNSVBTKQotQGl0ZW0gLW5vY3BwCi1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkLiAgSXQgaXMgYWNjZXB0ZWQgZm9yIGNvbW1hbmQtbGluZSBjb21wYXRpYmlsaXR5IHdpdGgKLW90aGVyIGFzc2VtYmxlcnMsIHdoaWNoIHVzZSBpdCB0byB0dXJuIG9mZiBDIHN0eWxlIHByZXByb2Nlc3NpbmcuICBXaXRoCi1Ac2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fSwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgQHNhbXB7LW5vY3BwfSwgYmVjYXVzZSB0aGUKLUBzY3tnbnV9IGFzc2VtYmxlciBpdHNlbGYgbmV2ZXIgcnVucyB0aGUgQyBwcmVwcm9jZXNzb3IuCi0KLUBpdGVtIC0tdHJhcAotQGl0ZW14IC0tbm8tYnJlYWsKLUBjIEZJWE1FISAgKDEpIHJlZmxlY3QgdGhlc2Ugb3B0aW9ucyAobmV4dCBpdGVtIHRvbykgaW4gb3B0aW9uIHN1bW1hcmllczsKLUBjICAgICAgICAgKDIpIHN0b3AgdGVhc2luZywgc2F5IF93aGljaF8gaW5zdHJ1Y3Rpb25zIGV4cGFuZGVkIF9ob3dfLgotQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseSBtYWNybyBleHBhbmRzIGNlcnRhaW4gZGl2aXNpb24gYW5kCi1tdWx0aXBsaWNhdGlvbiBpbnN0cnVjdGlvbnMgdG8gY2hlY2sgZm9yIG92ZXJmbG93IGFuZCBkaXZpc2lvbiBieSB6ZXJvLiAgVGhpcwotb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byBnZW5lcmF0ZSBjb2RlIHRvIHRha2UgYSB0cmFwIGV4Y2VwdGlvbgotcmF0aGVyIHRoYW4gYSBicmVhayBleGNlcHRpb24gd2hlbiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gIFRoZSB0cmFwIGluc3RydWN0aW9ucwotYXJlIG9ubHkgc3VwcG9ydGVkIGF0IEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwgMiBhbmQgaGlnaGVyLgotCi1AaXRlbSAtLWJyZWFrCi1AaXRlbXggLS1uby10cmFwCi1HZW5lcmF0ZSBjb2RlIHRvIHRha2UgYSBicmVhayBleGNlcHRpb24gcmF0aGVyIHRoYW4gYSB0cmFwIGV4Y2VwdGlvbiB3aGVuIGFuCi1lcnJvciBpcyBkZXRlY3RlZC4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE1JUFMgT2JqZWN0Ci1Ac2VjdGlvbiBNSVBTIEVDT0ZGIG9iamVjdCBjb2RlCi0KLUBjaW5kZXggRUNPRkYgc2VjdGlvbnMKLUBjaW5kZXggTUlQUyBFQ09GRiBzZWN0aW9ucwotQXNzZW1ibGluZyBmb3IgYSBAc2N7bWlwc30gQHNje2Vjb2ZmfSB0YXJnZXQgc3VwcG9ydHMgc29tZSBhZGRpdGlvbmFsIHNlY3Rpb25zCi1iZXNpZGVzIHRoZSB1c3VhbCBAY29kZXsudGV4dH0sIEBjb2Rley5kYXRhfSBhbmQgQGNvZGV7LmJzc30uICBUaGUKLWFkZGl0aW9uYWwgc2VjdGlvbnMgYXJlIEBjb2Rley5yZGF0YX0sIHVzZWQgZm9yIHJlYWQtb25seSBkYXRhLAotQGNvZGV7LnNkYXRhfSwgdXNlZCBmb3Igc21hbGwgZGF0YSwgYW5kIEBjb2Rley5zYnNzfSwgdXNlZCBmb3Igc21hbGwKLWNvbW1vbiBvYmplY3RzLgotCi1AY2luZGV4IHNtYWxsIG9iamVjdHMsIE1JUFMgRUNPRkYKLUBjaW5kZXggQGNvZGV7Z3B9IHJlZ2lzdGVyLCBNSVBTCi1XaGVuIGFzc2VtYmxpbmcgZm9yIEBzY3tlY29mZn0sIHRoZSBhc3NlbWJsZXIgdXNlcyB0aGUgQGNvZGV7JGdwfSAoQGNvZGV7JDI4fSkKLXJlZ2lzdGVyIHRvIGZvcm0gdGhlIGFkZHJlc3Mgb2YgYSBgYHNtYWxsIG9iamVjdCcnLiAgQW55IG9iamVjdCBpbiB0aGUKLUBjb2Rley5zZGF0YX0gb3IgQGNvZGV7LnNic3N9IHNlY3Rpb25zIGlzIGNvbnNpZGVyZWQgYGBzbWFsbCcnIGluIHRoaXMgc2Vuc2UuCi1Gb3IgZXh0ZXJuYWwgb2JqZWN0cywgb3IgZm9yIG9iamVjdHMgaW4gdGhlIEBjb2Rley5ic3N9IHNlY3Rpb24sIHlvdSBjYW4gdXNlCi10aGUgQGNvZGV7QHZhbHVle0dDQ319IEBzYW1wey1HfSBvcHRpb24gdG8gY29udHJvbCB0aGUgc2l6ZSBvZiBvYmplY3RzIGFkZHJlc3NlZCB2aWEKLUBjb2RleyRncH07IHRoZSBkZWZhdWx0IHZhbHVlIGlzIDgsIG1lYW5pbmcgdGhhdCBhIHJlZmVyZW5jZSB0byBhbnkgb2JqZWN0Ci1laWdodCBieXRlcyBvciBzbWFsbGVyIHVzZXMgQGNvZGV7JGdwfS4gIFBhc3NpbmcgQHNhbXB7LUcgMH0gdG8KLUBjb2Rle0B2YWx1ZXtBU319IHByZXZlbnRzIGl0IGZyb20gdXNpbmcgdGhlIEBjb2RleyRncH0gcmVnaXN0ZXIgb24gdGhlIGJhc2lzCi1vZiBvYmplY3Qgc2l6ZSAoYnV0IHRoZSBhc3NlbWJsZXIgdXNlcyBAY29kZXskZ3B9IGZvciBvYmplY3RzIGluIEBjb2Rley5zZGF0YX0KLW9yIEBjb2Rle3Nic3N9IGluIGFueSBjYXNlKS4gIFRoZSBzaXplIG9mIGFuIG9iamVjdCBpbiB0aGUgQGNvZGV7LmJzc30gc2VjdGlvbgotaXMgc2V0IGJ5IHRoZSBAY29kZXsuY29tbX0gb3IgQGNvZGV7Lmxjb21tfSBkaXJlY3RpdmUgdGhhdCBkZWZpbmVzIGl0LiAgVGhlCi1zaXplIG9mIGFuIGV4dGVybmFsIG9iamVjdCBtYXkgYmUgc2V0IHdpdGggdGhlIEBjb2Rley5leHRlcm59IGRpcmVjdGl2ZS4gIEZvcgotZXhhbXBsZSwgQHNhbXB7LmV4dGVybiBzeW0sNH0gZGVjbGFyZXMgdGhhdCB0aGUgb2JqZWN0IGF0IEBjb2Rle3N5bX0gaXMgNCBieXRlcwotaW4gbGVuZ3RoLCB3aGllIGxlYXZpbmcgQGNvZGV7c3ltfSBvdGhlcndpc2UgdW5kZWZpbmVkLgotCi1Vc2luZyBzbWFsbCBAc2N7ZWNvZmZ9IG9iamVjdHMgcmVxdWlyZXMgbGlua2VyIHN1cHBvcnQsIGFuZCBhc3N1bWVzIHRoYXQgdGhlCi1AY29kZXskZ3B9IHJlZ2lzdGVyIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCAobm9ybWFsbHkgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5Ci10aGUgc3RhcnR1cCBjb2RlKS4gIEBzY3ttaXBzfSBAc2N7ZWNvZmZ9IGFzc2VtYmx5IGNvZGUgbXVzdCBub3QgbW9kaWZ5IHRoZQotQGNvZGV7JGdwfSByZWdpc3Rlci4KLQotQG5vZGUgTUlQUyBTdGFicwotQHNlY3Rpb24gRGlyZWN0aXZlcyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0KLUBjaW5kZXggTUlQUyBkZWJ1Z2dpbmcgZGlyZWN0aXZlcwotQHNje21pcHN9IEBzY3tlY29mZn0gQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgc2V2ZXJhbCBkaXJlY3RpdmVzIHVzZWQgZm9yCi1nZW5lcmF0aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGljaCBhcmUgbm90IHN1cHBvcnQgYnkgdHJhZGl0aW9uYWwgQHNje21pcHN9Ci1hc3NlbWJsZXJzLiAgVGhlc2UgYXJlIEBjb2Rley5kZWZ9LCBAY29kZXsuZW5kZWZ9LCBAY29kZXsuZGltfSwgQGNvZGV7LmZpbGV9LAotQGNvZGV7LnNjbH0sIEBjb2Rley5zaXplfSwgQGNvZGV7LnRhZ30sIEBjb2Rley50eXBlfSwgQGNvZGV7LnZhbH0sCi1AY29kZXsuc3RhYmR9LCBAY29kZXsuc3RhYm59LCBhbmQgQGNvZGV7LnN0YWJzfS4gIFRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLWdlbmVyYXRlZCBieSB0aGUgdGhyZWUgQGNvZGV7LnN0YWJ9IGRpcmVjdGl2ZXMgY2FuIG9ubHkgYmUgcmVhZCBieSBAc2N7Z2RifSwKLW5vdCBieSB0cmFkaXRpb25hbCBAc2N7bWlwc30gZGVidWdnZXJzICh0aGlzIGVuaGFuY2VtZW50IGlzIHJlcXVpcmVkIHRvIGZ1bGx5Ci1zdXBwb3J0IEMrKyBkZWJ1Z2dpbmcpLiAgVGhlc2UgZGlyZWN0aXZlcyBhcmUgcHJpbWFyaWx5IHVzZWQgYnkgY29tcGlsZXJzLCBub3QKLWFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzIQotCi1Abm9kZSBNSVBTIElTQQotQHNlY3Rpb24gRGlyZWN0aXZlcyB0byBvdmVycmlkZSB0aGUgSVNBIGxldmVsCi0KLUBjaW5kZXggTUlQUyBJU0Egb3ZlcnJpZGUKLUBraW5kZXggQGNvZGV7LnNldCBtaXBzQHZhcntufX0KLUBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIGFuIGFkZGl0aW9uYWwgZGlyZWN0aXZlIHRvIGNoYW5nZQotdGhlIEBzY3ttaXBzfSBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsIG9uIHRoZSBmbHk6IEBjb2Rley5zZXQKLW1pcHNAdmFye259fS4gIEB2YXJ7bn0gc2hvdWxkIGJlIGEgbnVtYmVyIGZyb20gMCB0byA0LiAgQSB2YWx1ZSBmcm9tIDEKLXRvIDQgbWFrZXMgdGhlIGFzc2VtYmxlciBhY2NlcHQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY29ycmVzcG9uZGluZwotQHNje2lzYX0gbGV2ZWwsIGZyb20gdGhhdCBwb2ludCBvbiBpbiB0aGUgYXNzZW1ibHkuICBAY29kZXsuc2V0Ci1taXBzQHZhcntufX0gYWZmZWN0cyBub3Qgb25seSB3aGljaCBpbnN0cnVjdGlvbnMgYXJlIHBlcm1pdHRlZCwgYnV0IGFsc28KLWhvdyBjZXJ0YWluIG1hY3JvcyBhcmUgZXhwYW5kZWQuICBAY29kZXsuc2V0IG1pcHMwfSByZXN0b3JlcyB0aGUKLUBzY3tpc2F9IGxldmVsIHRvIGl0cyBvcmlnaW5hbCBsZXZlbDogZWl0aGVyIHRoZSBsZXZlbCB5b3Ugc2VsZWN0ZWQgd2l0aAotY29tbWFuZCBsaW5lIG9wdGlvbnMsIG9yIHRoZSBkZWZhdWx0IGZvciB5b3VyIGNvbmZpZ3VyYXRpb24uICBZb3UgY2FuCi11c2UgdGhpcyBmZWF0dXJlIHRvIHBlcm1pdCBzcGVjaWZpYyBAc2N7cjQwMDB9IGluc3RydWN0aW9ucyB3aGlsZQotYXNzZW1ibGluZyBpbiAzMiBiaXQgbW9kZS4gIFVzZSB0aGlzIGRpcmVjdGl2ZSB3aXRoIGNhcmUhCi0KLVRoZSBkaXJlY3RpdmUgQHNhbXB7LnNldCBtaXBzMTZ9IHB1dHMgdGhlIGFzc2VtYmxlciBpbnRvIE1JUFMgMTYgbW9kZSwKLWluIHdoaWNoIGl0IHdpbGwgYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgTUlQUyAxNiBwcm9jZXNzb3IuICBVc2UKLUBzYW1wey5zZXQgbm9taXBzMTZ9IHRvIHJldHVybiB0byBub3JtYWwgMzIgYml0IG1vZGUuCi0KLVRyYWRpdGlvbmFsIEBzY3ttaXBzfSBhc3NlbWJsZXJzIGRvIG5vdCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlLiAgCi0KLUBub2RlIE1JUFMgYXV0b2V4dGVuZAotQHNlY3Rpb24gRGlyZWN0aXZlcyBmb3IgZXh0ZW5kaW5nIE1JUFMgMTYgYml0IGluc3RydWN0aW9ucwotCi1Aa2luZGV4IEBjb2Rley5zZXQgYXV0b2V4dGVuZH0KLUBraW5kZXggQGNvZGV7LnNldCBub2F1dG9leHRlbmR9Ci1CeSBkZWZhdWx0LCBNSVBTIDE2IGluc3RydWN0aW9ucyBhcmUgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byAzMiBiaXRzCi13aGVuIG5lY2Vzc2FyeS4gIFRoZSBkaXJlY3RpdmUgQHNhbXB7LnNldCBub2F1dG9leHRlbmR9IHdpbGwgdHVybiB0aGlzCi1vZmYuICBXaGVuIEBzYW1wey5zZXQgbm9hdXRvZXh0ZW5kfSBpcyBpbiBlZmZlY3QsIGFueSAzMiBiaXQgaW5zdHJ1Y3Rpb24KLW11c3QgYmUgZXhwbGljaXRseSBleHRlbmRlZCB3aXRoIHRoZSBAc2FtcHsuZX0gbW9kaWZpZXIgKGUuZy4sCi1Ac2FtcHtsaS5lICQ0LDEwMDB9KS4gIFRoZSBkaXJlY3RpdmUgQHNhbXB7LnNldCBhdXRvZXh0ZW5kfSBtYXkgYmUgdXNlZAotdG8gb25jZSBhZ2FpbiBhdXRvbWF0aWNhbGx5IGV4dGVuZCBpbnN0cnVjdGlvbnMgd2hlbiBuZWNlc3NhcnkuCi0KLVRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGluIE1JUFMgMTYgbW9kZS4gIFRyYWRpdGlvbmFsCi1Ac2N7bWlwc30gYXNzZW1ibGVycyBkbyBub3Qgc3VwcG9ydCB0aGlzIGRpcmVjdGl2ZS4KLQotQG5vZGUgTUlQUyBpbnNuCi1Ac2VjdGlvbiBEaXJlY3RpdmUgdG8gbWFyayBkYXRhIGFzIGFuIGluc3RydWN0aW9uCi0KLUBraW5kZXggQGNvZGV7Lmluc259Ci1UaGUgQGNvZGV7Lmluc259IGRpcmVjdGl2ZSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0aGF0IHRoZSBmb2xsb3dpbmcKLWRhdGEgaXMgYWN0dWFsbHkgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gTUlQUyAxNiBtb2RlOgotd2hlbiBsb2FkaW5nIHRoZSBhZGRyZXNzIG9mIGEgbGFiZWwgd2hpY2ggcHJlY2VkZXMgaW5zdHJ1Y3Rpb25zLAotQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseSBhZGRzIDEgdG8gdGhlIHZhbHVlLCBzbyB0aGF0IGp1bXBpbmcgdG8KLXRoZSBsb2FkZWQgYWRkcmVzcyB3aWxsIGRvIHRoZSByaWdodCB0aGluZy4KLQotQG5vZGUgTUlQUyBvcHRpb24gc3RhY2sKLUBzZWN0aW9uIERpcmVjdGl2ZXMgdG8gc2F2ZSBhbmQgcmVzdG9yZSBvcHRpb25zCi0KLUBjaW5kZXggTUlQUyBvcHRpb24gc3RhY2sKLUBraW5kZXggQGNvZGV7LnNldCBwdXNofQotQGtpbmRleCBAY29kZXsuc2V0IHBvcH0KLVRoZSBkaXJlY3RpdmVzIEBjb2Rley5zZXQgcHVzaH0gYW5kIEBjb2Rley5zZXQgcG9wfSBtYXkgYmUgdXNlZCB0byBzYXZlCi1hbmQgcmVzdG9yZSB0aGUgY3VycmVudCBzZXR0aW5ncyBmb3IgYWxsIHRoZSBvcHRpb25zIHdoaWNoIGFyZQotY29udHJvbGxlZCBieSBAY29kZXsuc2V0fS4gIFRoZSBAY29kZXsuc2V0IHB1c2h9IGRpcmVjdGl2ZSBzYXZlcyB0aGUKLWN1cnJlbnQgc2V0dGluZ3Mgb24gYSBzdGFjay4gIFRoZSBAY29kZXsuc2V0IHBvcH0gZGlyZWN0aXZlIHBvcHMgdGhlCi1zdGFjayBhbmQgcmVzdG9yZXMgdGhlIHNldHRpbmdzLgotCi1UaGVzZSBkaXJlY3RpdmVzIGNhbiBiZSB1c2VmdWwgaW5zaWRlIGFuIG1hY3JvIHdoaWNoIG11c3QgY2hhbmdlIGFuCi1vcHRpb24gc3VjaCBhcyB0aGUgSVNBIGxldmVsIG9yIGluc3RydWN0aW9uIHJlb3JkZXJpbmcgYnV0IGRvZXMgbm90IHdhbnQKLXRvIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGNvZGUgd2hpY2ggaW52b2tlZCB0aGUgbWFjcm8uCi0KLVRyYWRpdGlvbmFsIEBzY3ttaXBzfSBhc3NlbWJsZXJzIGRvIG5vdCBzdXBwb3J0IHRoZXNlIGRpcmVjdGl2ZXMuCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtbnMzMmsudGV4aSBiL2dhcy9kb2MvYy1uczMyay50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM2MWQ5Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1uczMyay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQGMgIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotCi1AaWdub3JlCi1AYyBGSVhNRSEgIFN0b3AgaWdub3Jpbmcgd2hlbiBmaWxsZWQgaW4uCi1Abm9kZSAzMngzMgotQGNoYXB0ZXIgMzJ4MzIKLQotQHNlY3Rpb24gT3B0aW9ucwotVGhlIDMyeDMyIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyBhIEBzYW1wey1tMzIwMzJ9IG9wdGlvbiB0bwotc3BlY2lmeSB0aGlhdCBpdCBpcyBjb21waWxpbmcgZm9yIGEgMzIwMzIgcHJvY2Vzc29yLCBvciBhCi1Ac2FtcHstbTMyNTMyfSB0byBzcGVjaWZ5IHRoYXQgaXQgaXMgY29tcGlsaW5nIGZvciBhIDMyNTMyIG9wdGlvbi4KLVRoZSBkZWZhdWx0IChpZiBuZWl0aGVyIGlzIHNwZWNpZmllZCkgaXMgY2hvc2VuIHdoZW4gdGhlIGFzc2VtYmxlcgotaXMgY29tcGlsZWQuCi0KLUBzZWN0aW9uIFN5bnRheAotSSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSAzMngzMiBzeW50YXggYXNzZW1ibGVkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fS4gIFNvbWVvbmUgd2hvIHVuZGVyc2FuZHMgdGhlIHByb2Nlc3NvciAoSSd2ZSBuZXZlciBzZWVuCi1vbmUpIGFuZCB0aGUgcG9zc2libGUgc3ludGF4ZXMgc2hvdWxkIHdyaXRlIHRoaXMgc2VjdGlvbi4KLQotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLVRoZSAzMngzMiB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBidXQgQGNvZGV7QHZhbHVle0FTfX0KLW9ubHkgY3JlYXRlcyBzaW5nbGUgb3IgZG91YmxlIHByZWNpc2lvbiB2YWx1ZXMuICBJIGRvbid0IGtub3cgaWYgdGhlCi0zMngzMiB1bmRlcnN0YW5kcyBleHRlbmRlZCBwcmVjaXNpb24gbnVtYmVycy4KLQotQHNlY3Rpb24gMzJ4MzIgTWFjaGluZSBEaXJlY3RpdmVzCi1UaGUgMzJ4MzIgaGFzIG5vIG1hY2hpbmUgZGVwZW5kZW50IGRpcmVjdGl2ZXMuCi0KLUBlbmQgaWdub3JlCmRpZmYgLS1naXQgYS9nYXMvZG9jL2Mtc2gudGV4aSBiL2dhcy9kb2MvYy1zaC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjBmNTU0Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1zaC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBwYWdlCi1Abm9kZSBTSC1EZXBlbmRlbnQKLUBjaGFwdGVyIEhpdGFjaGkgU0ggRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggU0ggc3VwcG9ydAotQG1lbnUKLSogU0ggT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIFNIIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIFNIIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogU0ggRGlyZWN0aXZlczo6ICAgICAgICAgICBTSCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogU0ggT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgU0ggT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IFNIIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMsIFNIIChub25lKQotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBIaXRhY2hpCi1TSCBmYW1pbHkuCi0KLUBub2RlIFNIIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci0KLUBtZW51Ci0qIFNILUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIFNILVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogU0gtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgU0gtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIFNICi1AY2luZGV4IFNIIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1weyF9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBTSAotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBTSAotQGNpbmRleCBTSCBsaW5lIHNlcGFyYXRvcgotWW91IGNhbiB1c2UgQHNhbXB7O30gaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotQGNpbmRleCBzeW1ib2wgbmFtZXMsIEBzYW1weyR9IGluCi1AY2luZGV4IEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcwotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBTSC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IFNIIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIFNICi1Zb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSwgQHNhbXB7cjF9LCBAc2FtcHtyMn0sCi1Ac2FtcHtyM30sIEBzYW1we3I0fSwgQHNhbXB7cjV9LCBAc2FtcHtyNn0sIEBzYW1we3I3fSwgQHNhbXB7cjh9LAotQHNhbXB7cjl9LCBAc2FtcHtyMTB9LCBAc2FtcHtyMTF9LCBAc2FtcHtyMTJ9LCBAc2FtcHtyMTN9LCBAc2FtcHtyMTR9LAotYW5kIEBzYW1we3IxNX0gdG8gcmVmZXIgdG8gdGhlIFNIIHJlZ2lzdGVycy4KLQotVGhlIFNIIGFsc28gaGFzIHRoZXNlIGNvbnRyb2wgcmVnaXN0ZXJzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHByCi1wcm9jZWR1cmUgcmVnaXN0ZXIgKGhvbGRzIHJldHVybiBhZGRyZXNzKQotCi1AaXRlbSBwYwotcHJvZ3JhbSBjb3VudGVyCi0KLUBpdGVtIG1hY2gKLUBpdGVteCBtYWNsCi1oaWdoIGFuZCBsb3cgbXVsdGlwbHkgYWNjdW11bGF0b3IgcmVnaXN0ZXJzCi0KLUBpdGVtIHNyCi1zdGF0dXMgcmVnaXN0ZXIKLQotQGl0ZW0gZ2JyCi1nbG9iYWwgYmFzZSByZWdpc3RlcgotCi1AaXRlbSB2YnIKLXZlY3RvciBiYXNlIHJlZ2lzdGVyIChmb3IgaW50ZXJydXB0IHZlY3RvcnMpCi1AZW5kIHRhYmxlCi0KLUBub2RlIFNILUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLQotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBTSAotQGNpbmRleCBTSCBhZGRyZXNzaW5nIG1vZGVzCi1AY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBTSC4KLUBjb2Rle1JAdmFye259fSBpbiB0aGUgZm9sbG93aW5nIHJlZmVycyB0byBhbnkgb2YgdGhlIG51bWJlcmVkCi1yZWdpc3RlcnMsIGJ1dCBAZW1waHtub3R9IHRoZSBjb250cm9sIHJlZ2lzdGVycy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBSQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci0KLUBpdGVtIEBAUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci0KLUBpdGVtIEBALVJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLQotQGl0ZW0gQEBSQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLQotQGl0ZW0gQEAoQHZhcntkaXNwfSwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotCi1AaXRlbSBAQChSMCwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRleGVkCi0KLUBpdGVtIEBAKEB2YXJ7ZGlzcH0sIEdCUikKLUBjb2Rle0dCUn0gb2Zmc2V0Ci0KLUBpdGVtIEBAKFIwLCBHQlIpCi1HQlIgaW5kZXhlZAotCi1AaXRlbSBAdmFye2FkZHJ9Ci1AaXRlbXggQEAoQHZhcntkaXNwfSwgUEMpCi1QQyByZWxhdGl2ZSBhZGRyZXNzIChmb3IgYnJhbmNoIG9yIGZvciBhZGRyZXNzaW5nIG1lbW9yeSkuICBUaGUKLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudGF0aW9uIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBzaW1wbGVyIGZvcm0KLUB2YXJ7YWRkcn0gYW55d2hlcmUgYSBQQyByZWxhdGl2ZSBhZGRyZXNzIGlzIGNhbGxlZCBmb3I7IHRoZSBhbHRlcm5hdGUKLWZvcm0gaXMgc3VwcG9ydGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4KLQotQGl0ZW0gI0B2YXJ7aW1tfQotSW1tZWRpYXRlIGRhdGEKLUBlbmQgdGFibGUKLQotQG5vZGUgU0ggRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIFNIIChAc2N7aWVlZX0pCi1AY2luZGV4IFNIIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgU0ggZmFtaWx5IGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9Ci1kaXJlY3RpdmUgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLgotCi1Abm9kZSBTSCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBTSCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBTSCBtYWNoaW5lIGRpcmVjdGl2ZXMKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBTSAotQGNpbmRleCBAY29kZXt1YXdvcmR9IGRpcmVjdGl2ZSwgU0gKLUBjaW5kZXggQGNvZGV7dWFsb25nfSBkaXJlY3RpdmUsIFNICi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gdWF3b3JkCi1AaXRlbXggdWFsb25nCi1AY29kZXtAdmFsdWV7QVN9fSB3aWxsIGlzc3VlIGEgd2FybmluZyB3aGVuIGEgbWlzYWxpZ25lZCBAY29kZXsud29yZH0gb3IKLUBjb2Rley5sb25nfSBkaXJlY3RpdmUgaXMgdXNlZC4gIFlvdSBtYXkgdXNlIEBjb2Rley51YXdvcmR9IG9yCi1AY29kZXsudWFsb25nfSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlbnRpb25hbGx5IG1pc2FsaWduZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIFNIIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBTSCBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgU0gKLUBjaW5kZXggbW5lbW9uaWNzLCBTSAotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBTSAotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBTSCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtTSC1NaWNyb2NvbXB1dGVyIFVzZXIncyBNYW51YWx9IChIaXRhY2hpIE1pY3JvIFN5c3RlbXMsIEluYy4pLgotCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgU0ggb3Bjb2Rlcy4gIE5vIGFkZGl0aW9uYWwKLXBzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQKLWJlY2F1c2UgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgYSBzaW1wbGVyIGZvcm0gb2YgUEMtcmVsYXRpdmUKLWFkZHJlc3NpbmcsIHlvdSBtYXkgc2ltcGx5IHdyaXRlIChmb3IgZXhhbXBsZSkKLQotQGV4YW1wbGUKLW1vdi5sICBiYXIscjAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZXJlIG90aGVyIGFzc2VtYmxlcnMgbWlnaHQgcmVxdWlyZSBhbiBleHBsaWNpdCBkaXNwbGFjZW1lbnQgdG8KLUBjb2Rle2Jhcn0gZnJvbSB0aGUgcHJvZ3JhbSBjb3VudGVyOgotCi1AZXhhbXBsZQotbW92LmwgIEBAKEB2YXJ7ZGlzcH0sIFBDKQotQGVuZCBleGFtcGxlCi0KLUBpZnNldCBTTUFMTAotQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5Ci1AYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCi0KLUhlcmUgaXMgYSBzdW1tYXJ5IG9mIFNIIG9wY29kZXM6Ci0KLUBwYWdlCi1Ac21hbGxleGFtcGxlCi1AaXtMZWdlbmQ6fQotUm4gICAgICAgIEBye2EgbnVtYmVyZWQgcmVnaXN0ZXJ9Ci1SbSAgICAgICAgQHJ7YW5vdGhlciBudW1iZXJlZCByZWdpc3Rlcn0KLSNpbW0gICAgICBAcntpbW1lZGlhdGUgZGF0YX0KLWRpc3AgICAgICBAcntkaXNwbGFjZW1lbnR9Ci1kaXNwOCAgICAgQHJ7OC1iaXQgZGlzcGxhY2VtZW50fQotZGlzcDEyICAgIEByezEyLWJpdCBkaXNwbGFjZW1lbnR9Ci0KLWFkZCAjaW1tLFJuICAgICAgICAgICAgICAgICAgICBsZHMubCBAQFJuKyxQUiAgICAgICAgICAgICAgCi1hZGQgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgbWFjLncgQEBSbSssQEBSbisgICAgICAgICAgIAotYWRkYyBSbSxSbiAgICAgICAgICAgICAgICAgICAgIG1vdiAjaW1tLFJuICAgICAgICAgICAgICAgICAKLWFkZHYgUm0sUm4gICAgICAgICAgICAgICAgICAgICBtb3YgUm0sUm4gICAgICAgICAgICAgICAgICAgCi1hbmQgI2ltbSxSMCAgICAgICAgICAgICAgICAgICAgbW92LmIgUm0sQEAoUjAsUm4pICAgICAgICAgIAotYW5kIFJtLFJuICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIFJtLEBALVJuICAgICAgICAgICAgICAKLWFuZC5iICNpbW0sQEAoUjAsR0JSKSAgICAgICAgICAgbW92LmIgUm0sQEBSbiAgICAgICAgICAgICAgIAotYmYgZGlzcDggICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAKGRpc3AsUm0pLFIwICAgICAgICAKLWJyYSBkaXNwMTIgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQChkaXNwLEdCUiksUjAgICAgICAgCi1ic3IgZGlzcDEyICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEAoUjAsUm0pLFJuICAgICAgICAgIAotYnQgZGlzcDggICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAUm0rLFJuICAgICAgICAgICAgICAKLWNscm1hYyAgICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQFJtLFJuICAgICAgICAgICAgICAgCi1jbHJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgUjAsQEAoZGlzcCxSbSkgICAgICAgIAotY21wL2VxICNpbW0sUjAgICAgICAgICAgICAgICAgIG1vdi5iIFIwLEBAKGRpc3AsR0JSKSAgICAgICAKLWNtcC9lcSBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBSbSxAQChkaXNwLFJuKSAgICAgICAgCi1jbXAvZ2UgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEAoUjAsUm4pICAgICAgICAgIAotY21wL2d0IFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBALVJuICAgICAgICAgICAgICAKLWNtcC9oaSBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBSbSxAQFJuICAgICAgICAgICAgICAgCi1jbXAvaHMgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgQEAoZGlzcCxSbiksUm0gICAgICAgIAotY21wL3BsIFJuICAgICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKGRpc3AsR0JSKSxSMCAgICAgICAKLWNtcC9weiBSbiAgICAgICAgICAgICAgICAgICAgICBtb3YubCBAQChkaXNwLFBDKSxSbiAgICAgICAgCi1jbXAvc3RyIFJtLFJuICAgICAgICAgICAgICAgICAgbW92LmwgQEAoUjAsUm0pLFJuICAgICAgICAgIAotZGl2MHMgUm0sUm4gICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAUm0rLFJuICAgICAgICAgICAgICAKLWRpdjB1ICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YubCBAQFJtLFJuICAgICAgICAgICAgICAgCi1kaXYxIFJtLFJuICAgICAgICAgICAgICAgICAgICAgbW92LmwgUjAsQEAoZGlzcCxHQlIpICAgICAgIAotZXh0cy5iIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi53IFJtLEBAKFIwLFJuKSAgICAgICAgICAKLWV4dHMudyBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBSbSxAQC1SbiAgICAgICAgICAgICAgCi1leHR1LmIgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgUm0sQEBSbiAgICAgICAgICAgICAgIAotZXh0dS53IFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKGRpc3AsUm0pLFIwICAgICAgICAKLWptcCBAQFJuICAgICAgICAgICAgICAgICAgICAgICAgbW92LncgQEAoZGlzcCxHQlIpLFIwICAgICAgIAotanNyIEBAUm4gICAgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQChkaXNwLFBDKSxSbiAgICAgICAgCi1sZGMgUm4sR0JSICAgICAgICAgICAgICAgICAgICAgbW92LncgQEAoUjAsUm0pLFJuICAgICAgICAgIAotbGRjIFJuLFNSICAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAUm0rLFJuICAgICAgICAgICAgICAKLWxkYyBSbixWQlIgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQFJtLFJuICAgICAgICAgICAgICAgCi1sZGMubCBAQFJuKyxHQlIgICAgICAgICAgICAgICAgIG1vdi53IFIwLEBAKGRpc3AsUm0pICAgICAgICAKLWxkYy5sIEBAUm4rLFNSICAgICAgICAgICAgICAgICAgbW92LncgUjAsQEAoZGlzcCxHQlIpICAgICAgIAotbGRjLmwgQEBSbissVkJSICAgICAgICAgICAgICAgICBtb3ZhIEBAKGRpc3AsUEMpLFIwICAgICAgICAgCi1sZHMgUm4sTUFDSCAgICAgICAgICAgICAgICAgICAgbW92dCBSbiAgICAgICAgICAgICAgICAgICAgIAotbGRzIFJuLE1BQ0wgICAgICAgICAgICAgICAgICAgIG11bHMgUm0sUm4gICAgICAgICAgICAgICAgICAKLWxkcyBSbixQUiAgICAgICAgICAgICAgICAgICAgICBtdWx1IFJtLFJuICAgICAgICAgICAgICAgICAgCi1sZHMubCBAQFJuKyxNQUNIICAgICAgICAgICAgICAgIG5lZyBSbSxSbiAgICAgICAgICAgICAgICAgICAKLWxkcy5sIEBAUm4rLE1BQ0wgICAgICAgICAgICAgICAgbmVnYyBSbSxSbiAgICAgICAgICAgICAgICAgIAotQHBhZ2UKLW5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGMgVkJSLFJuICAgICAgICAgICAgICAgIAotbm90IFJtLFJuICAgICAgICAgICAgICAgICAgICAgIHN0Yy5sIEdCUixAQC1SbiAgICAgICAgICAgCi1vciAjaW1tLFIwICAgICAgICAgICAgICAgICAgICAgc3RjLmwgU1IsQEAtUm4gICAgICAgICAgICAKLW9yIFJtLFJuICAgICAgICAgICAgICAgICAgICAgICBzdGMubCBWQlIsQEAtUm4gICAgICAgICAgIAotb3IuYiAjaW1tLEBAKFIwLEdCUikgICAgICAgICAgICBzdHMgTUFDSCxSbiAgICAgICAgICAgICAgIAotcm90Y2wgUm4gICAgICAgICAgICAgICAgICAgICAgIHN0cyBNQUNMLFJuICAgICAgICAgICAgICAgCi1yb3RjciBSbiAgICAgICAgICAgICAgICAgICAgICAgc3RzIFBSLFJuICAgICAgICAgICAgICAgICAKLXJvdGwgUm4gICAgICAgICAgICAgICAgICAgICAgICBzdHMubCBNQUNILEBALVJuICAgICAgICAgIAotcm90ciBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5sIE1BQ0wsQEAtUm4gICAgICAgICAgCi1ydGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RzLmwgUFIsQEAtUm4gICAgICAgICAgICAKLXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgUm0sUm4gICAgICAgICAgICAgICAgIAotc2V0dCAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmMgUm0sUm4gICAgICAgICAgICAgICAgCi1zaGFsIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3VidiBSbSxSbiAgICAgICAgICAgICAgICAKLXNoYXIgUm4gICAgICAgICAgICAgICAgICAgICAgICBzd2FwLmIgUm0sUm4gICAgICAgICAgICAgIAotc2hsbCBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAudyBSbSxSbiAgICAgICAgICAgICAgCi1zaGxsMTYgUm4gICAgICAgICAgICAgICAgICAgICAgdGFzLmIgQEBSbiAgICAgICAgICAgICAgICAKLXNobGwyIFJuICAgICAgICAgICAgICAgICAgICAgICB0cmFwYSAjaW1tICAgICAgICAgICAgICAgIAotc2hsbDggUm4gICAgICAgICAgICAgICAgICAgICAgIHRzdCAjaW1tLFIwICAgICAgICAgICAgICAgCi1zaGxyIFJuICAgICAgICAgICAgICAgICAgICAgICAgdHN0IFJtLFJuICAgICAgICAgICAgICAgICAKLXNobHIxNiBSbiAgICAgICAgICAgICAgICAgICAgICB0c3QuYiAjaW1tLEBAKFIwLEdCUikgICAgIAotc2hscjIgUm4gICAgICAgICAgICAgICAgICAgICAgIHhvciAjaW1tLFIwICAgICAgICAgICAgICAgCi1zaGxyOCBSbiAgICAgICAgICAgICAgICAgICAgICAgeG9yIFJtLFJuICAgICAgICAgICAgICAgICAKLXNsZWVwICAgICAgICAgICAgICAgICAgICAgICAgICB4b3IuYiAjaW1tLEBAKFIwLEdCUikgICAgIAotc3RjIEdCUixSbiAgICAgICAgICAgICAgICAgICAgIHh0cmN0IFJtLFJuICAgICAgICAgICAgICAgCi1zdGMgU1IsUm4KLUBlbmQgc21hbGxleGFtcGxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIaXRhY2hpLWFsbAotQGlmY2xlYXIgR0VORVJJQwotQHJhaXNlc2VjdGlvbnMKLUBlbmQgaWZjbGVhcgotQGVuZCBpZnNldAotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2Mtc3BhcmMudGV4aSBiL2dhcy9kb2MvYy1zcGFyYy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODcxYzgyLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1zcGFyYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBTcGFyYy1EZXBlbmRlbnQKLUBjaGFwdGVyIFNQQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIFNQQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggU1BBUkMgc3VwcG9ydAotQG1lbnUKLSogU3BhcmMtT3B0czo6ICAgICAgICAgICAgICAgICAgT3B0aW9ucwotKiBTcGFyYy1BbGlnbmVkLURhdGE6OgkJT3B0aW9uIHRvIGVuZm9yY2UgYWxpZ25lZCBkYXRhCi0qIFNwYXJjLUZsb2F0OjogICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIFNwYXJjLURpcmVjdGl2ZXM6OiAgICAgICAgICAgIFNwYXJjIE1hY2hpbmUgRGlyZWN0aXZlcwotQGVuZCBtZW51Ci0KLUBub2RlIFNwYXJjLU9wdHMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zIGZvciBTUEFSQwotQGNpbmRleCBTUEFSQyBvcHRpb25zCi1AY2luZGV4IGFyY2hpdGVjdHVyZXMsIFNQQVJDCi1AY2luZGV4IFNQQVJDIGFyY2hpdGVjdHVyZXMKLVRoZSBTUEFSQyBjaGlwIGZhbWlseSBpbmNsdWRlcyBzZXZlcmFsIHN1Y2Nlc3NpdmUgbGV2ZWxzLCB1c2luZyB0aGUgc2FtZQotY29yZSBpbnN0cnVjdGlvbiBzZXQsIGJ1dCBpbmNsdWRpbmcgYSBmZXcgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQKLWVhY2ggbGV2ZWwuICBUaGVyZSBhcmUgZXhjZXB0aW9ucyB0byB0aGlzIGhvd2V2ZXIuICBGb3IgZGV0YWlscyBvbiB3aGF0Ci1pbnN0cnVjdGlvbnMgZWFjaCB2YXJpYW50IHN1cHBvcnRzLCBwbGVhc2Ugc2VlIHRoZSBjaGlwJ3MgYXJjaGl0ZWN0dXJlCi1yZWZlcmVuY2UgbWFudWFsLgotCi1CeSBkZWZhdWx0LCBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIHRoZSBjb3JlIGluc3RydWN0aW9uIHNldCAoU1BBUkMKLXY2KSwgYnV0IGBgYnVtcHMnJyB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIGFzIG5lZWRlZDogaXQgc3dpdGNoZXMgdG8KLXN1Y2Nlc3NpdmVseSBoaWdoZXIgYXJjaGl0ZWN0dXJlcyBhcyBpdCBlbmNvdW50ZXJzIGluc3RydWN0aW9ucyB0aGF0Ci1vbmx5IGV4aXN0IGluIHRoZSBoaWdoZXIgbGV2ZWxzLgotCi1JZiBub3QgY29uZmlndXJlZCBmb3IgU1BBUkMgdjkgKEBjb2Rle3NwYXJjNjQtKi0qfSkgR0FTIHdpbGwgbm90IGJ1bXAKLXBhc3NlZCBzcGFyY2xpdGUgYnkgZGVmYXVsdCwgYW4gb3B0aW9uIG11c3QgYmUgcGFzc2VkIHRvIGVuYWJsZSB0aGUKLXY5IGluc3RydWN0aW9ucy4KLQotR0FTIHRyZWF0cyBzcGFyY2xpdGUgYXMgYmVpbmcgY29tcGF0aWJsZSB3aXRoIHY4LCB1bmxlc3MgYW4gYXJjaGl0ZWN0dXJlCi1pcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gIFNQQVJDIHY5IGlzIGFsd2F5cyBpbmNvbXBhdGlibGUgd2l0aCBzcGFyY2xpdGUuCi0KLUBjIFRoZSBvcmRlciBoZXJlIGlzIHRoZSBzYW1lIGFzIHRoZSBvcmRlciBvZiBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbAotQGMgdG8gZ2l2ZSB0aGUgdXNlciBhIHNlbnNlIG9mIHRoZSBvcmRlciBvZiB0aGUgImJ1bXBpbmciLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggLUF2NgotQGtpbmRleCBBdjcKLUBraW5kZXggLUF2OAotQGtpbmRleCAtQXNwYXJjbGV0Ci1Aa2luZGV4IC1Bc3BhcmNsaXRlCi1Aa2luZGV4IC1BdjkKLUBraW5kZXggLUF2OWEKLUBpdGVtIC1BdjYgfCAtQXY3IHwgLUF2OCB8IC1Bc3BhcmNsZXQgfCAtQXNwYXJjbGl0ZQotQGl0ZW14IC1BdjhwbHVzIHwgLUF2OHBsdXNhIHwgLUF2OSB8IC1BdjlhCi1Vc2Ugb25lIG9mIHRoZSBAc2FtcHstQX0gb3B0aW9ucyB0byBzZWxlY3Qgb25lIG9mIHRoZSBTUEFSQwotYXJjaGl0ZWN0dXJlcyBleHBsaWNpdGx5LiAgSWYgeW91IHNlbGVjdCBhbiBhcmNoaXRlY3R1cmUgZXhwbGljaXRseSwKLUBjb2Rle0B2YWx1ZXtBU319IHJlcG9ydHMgYSBmYXRhbCBlcnJvciBpZiBpdCBlbmNvdW50ZXJzIGFuIGluc3RydWN0aW9uCi1vciBmZWF0dXJlIHJlcXVpcmluZyBhbiBpbmNvbXBhdGlibGUgb3IgaGlnaGVyIGxldmVsLgotCi1Ac2FtcHstQXY4cGx1c30gYW5kIEBzYW1wey1BdjhwbHVzYX0gc2VsZWN0IGEgMzIgYml0IGVudmlyb25tZW50LgotCi1Ac2FtcHstQXY5fSBhbmQgQHNhbXB7LUF2OWF9IHNlbGVjdCBhIDY0IGJpdCBlbnZpcm9ubWVudCBhbmQgYXJlIG5vdAotYXZhaWxhYmxlIHVubGVzcyBHQVMgaXMgZXhwbGljaXRseSBjb25maWd1cmVkIHdpdGggNjQgYml0IGVudmlyb25tZW50Ci1zdXBwb3J0LgotCi1Ac2FtcHstQXY4cGx1c2F9IGFuZCBAc2FtcHstQXY5YX0gZW5hYmxlIHRoZSBTUEFSQyBWOSBpbnN0cnVjdGlvbiBzZXQgd2l0aAotVWx0cmFTUEFSQyBleHRlbnNpb25zLgotCi1AaXRlbSAteGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2EKLUZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgdjkgYXNzZW1ibGVyLiAgVGhlc2Ugb3B0aW9ucyBhcmUKLWVxdWl2YWxlbnQgdG8gLUF2OHBsdXMgYW5kIC1BdjhwbHVzYSwgcmVzcGVjdGl2ZWx5LgotCi1AaXRlbSAtYnVtcAotV2FybiB3aGVuZXZlciBpdCBpcyBuZWNlc3NhcnkgdG8gc3dpdGNoIHRvIGFub3RoZXIgbGV2ZWwuCi1JZiBhbiBhcmNoaXRlY3R1cmUgbGV2ZWwgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQsIEdBUyB3aWxsIG5vdCBpc3N1ZQotd2FybmluZ3MgdW50aWwgdGhhdCBsZXZlbCBpcyByZWFjaGVkLCBhbmQgd2lsbCB0aGVuIGJ1bXAgdGhlIGxldmVsCi1hcyByZXF1aXJlZCAoZXhjZXB0IGJldHdlZW4gaW5jb21wYXRpYmxlIGxldmVscykuCi0KLUBpdGVtIC0zMiB8IC02NAotU2VsZWN0IHRoZSB3b3JkIHNpemUsIGVpdGhlciAzMiBiaXRzIG9yIDY0IGJpdHMuCi1UaGVzZSBvcHRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSB3aXRoIHRoZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0LAotYW5kIHJlcXVpcmUgdGhhdCB0aGUgbmVjZXNzYXJ5IEJGRCBzdXBwb3J0IGhhcyBiZWVuIGluY2x1ZGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBTcGFyYy1BbGlnbmVkLURhdGEKLUBzZWN0aW9uIEVuZm9yY2luZyBhbGlnbmVkIGRhdGEKLQotQGNpbmRleCBkYXRhIGFsaWdubWVudCBvbiBTUEFSQwotQGNpbmRleCBTUEFSQyBkYXRhIGFsaWdubWVudAotU1BBUkMgR0FTIG5vcm1hbGx5IHBlcm1pdHMgZGF0YSB0byBiZSBtaXNhbGlnbmVkLiAgRm9yIGV4YW1wbGUsIGl0Ci1wZXJtaXRzIHRoZSBAY29kZXsubG9uZ30gcHNldWRvLW9wIHRvIGJlIHVzZWQgb24gYSBieXRlIGJvdW5kYXJ5LgotSG93ZXZlciwgdGhlIG5hdGl2ZSBTdW5PUyBhbmQgU29sYXJpcyBhc3NlbWJsZXJzIGlzc3VlIGFuIGVycm9yIHdoZW4KLXRoZXkgc2VlIG1pc2FsaWduZWQgZGF0YS4KLQotQGtpbmRleCAtLWVuZm9yY2UtYWxpZ25lZC1kYXRhCi1Zb3UgY2FuIHVzZSB0aGUgQGNvZGV7LS1lbmZvcmNlLWFsaWduZWQtZGF0YX0gb3B0aW9uIHRvIG1ha2UgU1BBUkMgR0FTCi1hbHNvIGlzc3VlIGFuIGVycm9yIGFib3V0IG1pc2FsaWduZWQgZGF0YSwganVzdCBhcyB0aGUgU3VuT1MgYW5kIFNvbGFyaXMKLWFzc2VtYmxlcnMgZG8uCi0KLVRoZSBAY29kZXstLWVuZm9yY2UtYWxpZ25lZC1kYXRhfSBvcHRpb24gaXMgbm90IHRoZSBkZWZhdWx0IGJlY2F1c2UgZ2NjCi1pc3N1ZXMgbWlzYWxpZ25lZCBkYXRhIHBzZXVkby1vcHMgd2hlbiBpdCBpbml0aWFsaXplcyBjZXJ0YWluIHBhY2tlZAotZGF0YSBzdHJ1Y3R1cmVzIChzdHJ1Y3R1cmVzIGRlZmluZWQgdXNpbmcgdGhlIEBjb2Rle3BhY2tlZH0gYXR0cmlidXRlKS4KLVlvdSBtYXkgaGF2ZSB0byBhc3NlbWJsZSB3aXRoIEdBUyBpbiBvcmRlciB0byBpbml0aWFsaXplIHBhY2tlZCBkYXRhCi1zdHJ1Y3R1cmVzIGluIHlvdXIgb3duIGNvZGUuCi0KLUBpZ25vcmUKLUBjIEZJWE1FOiAoc3BhcmMpIEZpbGwgaW4gInN5bnRheCIgc2VjdGlvbiEKLUBjIHN1YnNlY3Rpb24gc3ludGF4Ci1JIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgU3BhcmMgc3ludGF4LiAgU29tZW9uZSB3aG8gZG9lcwotd2lsbCBoYXZlIHRvIHdyaXRlIHRoaXMgc2VjdGlvbi4KLUBlbmQgaWdub3JlCi0KLUBub2RlIFNwYXJjLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBTUEFSQyAoQHNje2llZWV9KQotQGNpbmRleCBTUEFSQyBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIFNwYXJjIHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0KLUBub2RlIFNwYXJjLURpcmVjdGl2ZXMKLUBzZWN0aW9uIFNwYXJjIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IFNQQVJDIG1hY2hpbmUgZGlyZWN0aXZlcwotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIFNQQVJDCi1UaGUgU3BhcmMgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwKLW1hY2hpbmUgZGlyZWN0aXZlczoKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2FsaWdufSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuYWxpZ24KLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgaW4gYnl0ZXMuCi0KLUBjaW5kZXggQGNvZGV7Y29tbW9ufSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuY29tbW9uCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzeW1ib2wgbmFtZSwgYSBwb3NpdGl2ZSBudW1iZXIsIGFuZAotQGNvZGV7ImJzcyJ9LiAgVGhpcyBiZWhhdmVzIHNvbWV3aGF0IGxpa2UgQGNvZGV7LmNvbW19LCBidXQgdGhlCi1zeW50YXggaXMgZGlmZmVyZW50LgotCi1AY2luZGV4IEBjb2Rle2hhbGZ9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5oYWxmCi1UaGlzIGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gQGNvZGV7LnNob3J0fS4KLQotQGNpbmRleCBAY29kZXtwcm9jfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAucHJvYwotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZC4gIEFueSB0ZXh0IGZvbGxvd2luZyBpdCBvbiB0aGUgc2FtZQotbGluZSBpcyBhbHNvIGlnbm9yZWQuCi0KLUBjaW5kZXggQGNvZGV7cmVzZXJ2ZX0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnJlc2VydmUKLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHN5bWJvbCBuYW1lLCBhIHBvc2l0aXZlIG51bWJlciwgYW5kCi1AY29kZXsiYnNzIn0uICBUaGlzIGJlaGF2ZXMgc29tZXdoYXQgbGlrZSBAY29kZXsubGNvbW19LCBidXQgdGhlCi1zeW50YXggaXMgZGlmZmVyZW50LgotCi1AY2luZGV4IEBjb2Rle3NlZ30gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnNlZwotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IEBjb2RleyJ0ZXh0In0sIEBjb2RleyJkYXRhIn0sIG9yCi1AY29kZXsiZGF0YTEifS4gIEl0IGJlaGF2ZXMgbGlrZSBAY29kZXsudGV4dH0sIEBjb2Rley5kYXRhfSwgb3IKLUBjb2Rley5kYXRhIDF9LgotCi1AY2luZGV4IEBjb2Rle3NraXB9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5za2lwCi1UaGlzIGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gdGhlIEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLgotCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC53b3JkCi1PbiB0aGUgU3BhcmMsIHRoZSBAY29kZXsud29yZH0gZGlyZWN0aXZlIHByb2R1Y2VzIDMyIGJpdCB2YWx1ZXMsCi1pbnN0ZWFkIG9mIHRoZSAxNiBiaXQgdmFsdWVzIGl0IHByb2R1Y2VzIG9uIG1hbnkgb3RoZXIgbWFjaGluZXMuCi0KLUBjaW5kZXggQGNvZGV7eHdvcmR9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC54d29yZAotT24gdGhlIFNwYXJjIFY5IHByb2Nlc3NvciwgdGhlIEBjb2Rley54d29yZH0gZGlyZWN0aXZlIHByb2R1Y2VzCi02NCBiaXQgdmFsdWVzLgotQGVuZCB0YWJsZQotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2Mtdjg1MC50ZXhpIGIvZ2FzL2RvYy9jLXY4NTAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNmUwZi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2Mtdjg1MC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotCi1Abm9kZSBWODUwLURlcGVuZGVudAotQGNoYXB0ZXIgdjg1MCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBWODUwIHN1cHBvcnQKLUBtZW51Ci0qIFY4NTAgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIFY4NTAgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogVjg1MCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIFY4NTAgRGlyZWN0aXZlczo6ICAgICAgICAgICBWODUwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBWODUwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFY4NTAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotQGNpbmRleCBWODUwIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMgZm9yIFY4NTAgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMKLWZvciB0aGUgVjg1MCBwcm9jZXNzb3IgZmFtaWx5OgotCi1AY2luZGV4IGNvbW1hbmQgbGluZSBvcHRpb25zLCBWODUwCi1AY2luZGV4IFY4NTAgY29tbWFuZCBsaW5lIG9wdGlvbnMKLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rley13c2lnbmVkX292ZXJmbG93fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtd3NpZ25lZF9vdmVyZmxvdwotQ2F1c2VzIHdhcm5pbmdzIHRvIGJlIHByb2R1Y2VkIHdoZW4gc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3cgdGhlCi1zcGFjZSBhdmFpbGFibGUgZm9yIHRoZW4gd2l0aGluIHRoZWlyIG9wY29kZXMuICBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uCi1pcyBkaXNhYmxlZCBhcyBpdCBpcyBwb3NzaWJsZSB0byByZWNlaXZlIHNwdXJpb3VzIHdhcm5pbmdzIGR1ZSB0byB1c2luZwotZXhhY3QgYml0IHBhdHRlcm5zIGFzIGltbWVkaWF0ZSBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7LXd1bnNpZ25lZF9vdmVyZmxvd30gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLXd1bnNpZ25lZF9vdmVyZmxvdwotQ2F1c2VzIHdhcm5pbmdzIHRvIGJlIHByb2R1Y2VkIHdoZW4gdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvdwotdGhlIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlbiB3aXRoaW4gdGhlaXIgb3Bjb2Rlcy4gIEJ5IGRlZmF1bHQgdGhpcwotb3B0aW9uIGlzIGRpc2FibGVkIGFzIGl0IGlzIHBvc3NpYmxlIHRvIHJlY2VpdmUgc3B1cmlvdXMgd2FybmluZ3MgZHVlIHRvCi11c2luZyBleGFjdCBiaXQgcGF0dGVybnMgYXMgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXstbXY4NTB9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC1tdjg1MAotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwIHByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGxpbmsKLXN1Y2ggY29kZSB3aXRoIGNvZGUgYXNzZW1ibGVkIGZvciBvdGhlciBwcm9jZXNzb3JzLgotCi1AY2luZGV4IEBjb2Rley1tdjg1MGV9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC1tdjg1MGUKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MEUgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBjaW5kZXggQGNvZGV7LW12ODUwYW55fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtbXY4NTBhbnkKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MCBwcm9jZXNzb3IgYnV0IHN1cHBvcnQgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZQotZXh0ZW5kZWQgdmFyaWFudHMgb2YgdGhlIHByb2Nlc3MuICBUaGlzIGFsbG93cyB0aGUgcHJvZHVjdGlvbiBvZgotYmluYXJpZXMgdGhhdCBjb250YWluIHRhcmdldCBzcGVjaWZpYyBjb2RlLCBidXQgd2hpY2ggYXJlIGFsc28gaW50ZW5kZWQKLXRvIGJlIHVzZWQgaW4gYSBnZW5lcmljIGZhc2hpb24uICBGb3IgZXhhbXBsZSBsaWJnY2MuYSBjb250YWlucyBnZW5lcmljCi1yb3V0aW5lcyB1c2VkIGJ5IHRoZSBjb2RlIHByb2R1Y2VkIGJ5IEdDQyBmb3IgYWxsIHZlcnNpb25zIG9mIHRoZSB2ODUwCi1hcmNoaXRlY3R1cmUsIHRvZ2V0aGVyIHdpdGggc3VwcG9ydCByb3V0aW5lcyBvbmx5IHVzZWQgYnkgdGhlIFY4NTBFCi1hcmNoaXRlY3R1cmUuCi0KLUBlbmQgdGFibGUKLQotCi1Abm9kZSBWODUwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBWODUwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIFY4NTAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotQGVuZCBtZW51Ci0KLUBub2RlIFY4NTAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIFY4NTAKLUBjaW5kZXggVjg1MCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHsjfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLUBub2RlIFY4NTAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBWODUwIHJlZ2lzdGVyIG5hbWVzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBWODUwCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG5hbWVzIGZvciByZWdpc3RlcnM6Ci1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7emVyb30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMAotcjAsIHplcm8KLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMQotcjEKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMgotcjIsIGhwCi1AY2luZGV4IEBjb2Rle3NwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAzCi1yMywgc3AKLUBjaW5kZXggQGNvZGV7Z3B9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDQKLXI0LCBncAotQGNpbmRleCBAY29kZXt0cH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNQotcjUsIHRwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDYKLXI2Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDcKLXI3Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDgKLXI4Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDkKLXI5Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEwCi1yMTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTEKLXIxMQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxMgotcjEyCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEzCi1yMTMKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTQKLXIxNAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNQotcjE1Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE2Ci1yMTYKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTcKLXIxNwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxOAotcjE4Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE5Ci1yMTkKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjAKLXIyMAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMQotcjIxCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIyCi1yMjIKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjMKLXIyMwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNAotcjI0Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI1Ci1yMjUKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjYKLXIyNgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNwotcjI3Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI4Ci1yMjgKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjkKLXIyOQotQGNpbmRleCBAY29kZXtlcH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMzAKLXIzMCwgZXAKLUBjaW5kZXggQGNvZGV7bHB9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDMxCi1yMzEsIGxwCi1AY2luZGV4IEBjb2Rle2VpcGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMAotZWlwYwotQGNpbmRleCBAY29kZXtlaXBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxCi1laXBzdwotQGNpbmRleCBAY29kZXtmZXBjfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDIKLWZlcGMKLUBjaW5kZXggQGNvZGV7ZmVwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMwotZmVwc3cKLUBjaW5kZXggQGNvZGV7ZWNyfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDQKLWVjcgotQGNpbmRleCBAY29kZXtwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgNQotcHN3Ci1AY2luZGV4IEBjb2Rle2N0cGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTYKLWN0cGMKLUBjaW5kZXggQGNvZGV7Y3Rwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTcKLWN0cHN3Ci1AY2luZGV4IEBjb2Rle2RicGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTgKLWRicGMKLUBjaW5kZXggQGNvZGV7ZGJwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTkKLWRicHN3Ci1AY2luZGV4IEBjb2Rle2N0YnB9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMjAKLWN0YnAKLUBlbmQgdGFibGUKLQotQG5vZGUgVjg1MCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgVjg1MCAoQHNje2llZWV9KQotQGNpbmRleCBWODUwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgVjg1MCBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgVjg1MCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBWODUwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgVjg1MAotQGNpbmRleCBWODUwIG1hY2hpbmUgZGlyZWN0aXZlcwotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle29mZnNldH0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAub2Zmc2V0IEB2YXJ7PGV4cHJlc3Npb24+fQotTW92ZXMgdGhlIG9mZnNldCBpbnRvIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBhbW91bnQuIAotCi1AY2luZGV4IEBjb2Rle3NlY3Rpb259IGRpcmVjdGl2ZSwgVjg1MAotQGl0ZW0gLnNlY3Rpb24gIm5hbWUiLCA8dHlwZT4KLVRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBzdGFuZGFyZCAuc2VjdGlvbiBkaXJlY3RpdmUuICBJdCBzZXRzIHRoZQotY3VycmVudCBzZWN0aW9uIHRvIGJlIDx0eXBlPiBhbmQgY3JlYXRlcyBhbiBhbGlhcyBmb3IgdGhpcyBzZWN0aW9uCi1jYWxsZWQgIm5hbWUiLiAKLQotQGNpbmRleCBAY29kZXsudjg1MH0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAudjg1MAotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwIHByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGxpbmsKLXN1Y2ggY29kZSB3aXRoIGNvZGUgYXNzZW1ibGVkIGZvciBvdGhlciBwcm9jZXNzb3JzLgotCi1AY2luZGV4IEBjb2Rley52ODUwZX0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAudjg1MGUKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MEUgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgVjg1MCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggVjg1MCBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMgZm9yIFY4NTAKLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBWODUwIG9wY29kZXMuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGFsc28gaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIHBzZXVkbyBvcHM6Ci0KLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rle2hpMH0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBoaTAoKQotQ29tcHV0ZXMgdGhlIGhpZ2hlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCBzdG9yZXMgaXQgaW50bwotdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgQHNhbXB7bXVsaGkgaGkwKGhlcmUgLSB0aGVyZSksIHI1LCByNn0KLQotY29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiBsYWJlbHMgJ2hlcmUnIGFuZAotJ3RoZXJlJywgdGFrZXMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhpcyBkaWZmZXJlbmNlLCBzaGlmdHMgaXQgZG93biAxNgotYml0cyBhbmQgdGhlbiBtdXRsaXBsaWVzIGl0IGJ5IHRoZSBsb3dlciAxNiBiaXRzIGluIHJlZ2lzdGVyIDUsIHB1dHRpbmcKLXRoZSByZXN1bHQgaW50byByZWdpc3RlciA2LiAKLQotQGNpbmRleCBAY29kZXtsb30gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBsbygpCi1Db21wdXRlcyB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgc3RvcmVzIGl0IGludG8KLXRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZToKLQotICAgIEBzYW1we2FkZGkgbG8oaGVyZSAtIHRoZXJlKSwgcjUsIHI2fQotCi1jb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGxhYmVscyAnaGVyZScgYW5kCi0ndGhlcmUnLCB0YWtlcyB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGlzIGRpZmZlcmVuY2UgYW5kIGFkZHMgaXQgdG8KLXJlZ2lzdGVyIDUsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbnRvIHJlZ2lzdGVyIDYuCi0KLUBjaW5kZXggQGNvZGV7aGl9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gaGkoKQotQ29tcHV0ZXMgdGhlIGhpZ2hlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCB0aGVuIGFkZHMgdGhlCi12YWx1ZSBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIGV4cHJlc3Npb24KLWFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4KLWluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlCi1hZGRyZXNzIG9mIHRoZSBsYWJlbCAnaGVyZScgYW5kIHN0b3JlIGl0IGludG8gcmVnaXN0ZXIgNjoKLQotICAgIEBzYW1we21vdmhpIGhpKGhlcmUpLCByMCwgcjZ9Ci0gICAgQHNhbXB7bW92ZWEgbG8oaGVyZSksIHI2LCByNn0KLQotVGhlIHJlYXNvbiBmb3IgdGhpcyBzcGVjaWFsIGJlaGF2aW91ciBpcyB0aGF0IG1vdmVhIHBlcmZvcm1zIGEgc2lnbgotZXh0ZW50aW9uIG9uIGl0cyBpbW1lZGlhdGUgb3BlcmFuZC4gIFNvIGZvciBleGFtcGxlIGlmIHRoZSBhZGRyZXNzIG9mCi0naGVyZScgd2FzIDB4RkZGRkZGRkYgdGhlbiB3aXRob3V0IHRoZSBzcGVjaWFsIGJlaGF2aW91ciBvZiB0aGUgaGkoKQotcHNldWRvLW9wIHRoZSBtb3ZoaSBpbnN0cnVjdGlvbiB3b3VsZCBwdXQgMHhGRkZGMDAwMCBpbnRvIHI2LCB0aGVuIHRoZQotbW92ZWEgaW5zdHJ1Y3Rpb24gd291bGQgdGFrZXMgaXRzIGltbWVkaWF0ZSBvcGVyYW5kLCAweEZGRkYsIHNpZ24gZXh0ZW5kCi1pdCB0byAzMiBiaXRzLCAweEZGRkZGRkZGLCBhbmQgdGhlbiBhZGQgaXQgaW50byByNiBnaXZpbmcgMHhGRkZFRkZGRgotd2hpY2ggaXMgd3JvbmcgKHRoZSBmaWZ0aCBuaWJibGUgaXMgRSkuICBXaXRoIHRoZSBoaSgpIHBzZXVkbyBvcCBhZGRpbmcKLWluIHRoZSB0b3AgYml0IG9mIHRoZSBsbygpIHBzZXVkbyBvcCwgdGhlIG1vdmhpIGluc3RydWN0aW9uIGFjdHVhbGx5Ci1zdG9yZXMgMCBpbnRvIHI2ICgweEZGRkYgKyAxID0gMHgwMDAwKSwgc28gdGhhdCB0aGUgbW92ZWEgaW5zdHJ1Y3Rpb24KLXN0b3JlcyAweEZGRkZGRkZGIGludG8gcjYgLSB0aGUgcmlnaHQgdmFsdWUuCi0KLUBjaW5kZXggQGNvZGV7aGlsb30gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBoaWxvKCkKLUNvbXB1dGVzIHRoZSAzMiBiaXQgdmFsdWUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHN0b3JlcyBpdCBpbnRvCi10aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uICh3aGljaCBtdXN0IGJlIGEKLW1vdiBpbnN0cnVjdGlvbikuICBGb3IgZXhhbXBsZToKLQotICAgIEBzYW1we21vdiBoaWxvKGhlcmUpLCByNn0KLQotY29tcHV0ZXMgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgbGFiZWwgJ2hlcmUnIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50bwotcmVnaXN0ZXIgNi4gIAotCi1AY2luZGV4IEBjb2Rle3NkYW9mZn0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBzZGFvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFNtYWxsCi1EYXRhIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiByZWdpc3RlciA0LCB0aGUgR1AgcmVnaXN0ZXIpIGFuZAotc3RvcmVzIHRoZSByZXN1bHQgYXMgYSAxNiBiaXQgc2lnbmVkIHZhbHVlIGluIHRoZSBpbW1lZGlhdGUgb3BlcmFuZAotZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6IAotCi0gICAgICBAc2FtcHtsZC53IHNkYW9mZihfYV92YXJpYWJsZSlbZ3BdLHI2fQotCi1sb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIGxhYmVsICdfYV92YXJpYWJsZScKLWludG8gcmVnaXN0ZXIgNiwgcHJvdmlkZWQgdGhhdCB0aGUgbGFiZWwgaXMgbG9jYXRlZCBzb21ld2hlcmUgd2l0aGluICsvLQotMzJLIG9mIHRoZSBhZGRyZXNzIGhlbGQgaW4gdGhlIEdQIHJlZ2lzdGVyLiAgW05vdGUgdGhlIGxpbmtlciBhc3N1bWVzCi10aGF0IHRoZSBHUCByZWdpc3RlciBjb250YWlucyBhIGZpeGVkIGFkZHJlc3Mgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZQotbGFiZWwgY2FsbGVkICdfX2dwJy4gIFRoaXMgY2FuIGVpdGhlciBiZSBzZXQgdXAgYXV0b21hdGljYWxseSBieSB0aGUKLWxpbmtlciwgb3Igc3BlY2lmaWNhbGx5IHNldCBieSB1c2luZyB0aGUgQHNhbXB7LS1kZWZzeW0gX19ncD08dmFsdWU+fQotY29tbWFuZCBsaW5lIG9wdGlvbl0uCi0KLUBjaW5kZXggQGNvZGV7dGRhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIHRkYW9mZigpCi1Db21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgVGlueQotRGF0YSBBcmVhICh3aG9lcyBhZGRyZXNzIGlzIGhlbGQgaW4gcmVnaXN0ZXIgMzAsIHRoZSBFUCByZWdpc3RlcikgYW5kCi1zdG9yZXMgdGhlIHJlc3VsdCBhcyBhIDQsNSwgNyBvciA4IGJpdCB1bnNpZ25lZCB2YWx1ZSBpbiB0aGUgaW1tZWRpYXRlCi1vcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgICBAc2FtcHtzbGQudyB0ZGFvZmYoX2FfdmFyaWFibGUpW2VwXSxyNn0KLQotbG9hZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBsYWJlbCAnX2FfdmFyaWFibGUnCi1pbnRvIHJlZ2lzdGVyIDYsIHByb3ZpZGVkIHRoYXQgdGhlIGxhYmVsIGlzIGxvY2F0ZWQgc29tZXdoZXJlIHdpdGhpbiArMjU2Ci1ieXRlcyBvZiB0aGUgYWRkcmVzcyBoZWxkIGluIHRoZSBFUCByZWdpc3Rlci4gIFtOb3RlIHRoZSBsaW5rZXIgYXNzdW1lcwotdGhhdCB0aGUgRVAgcmVnaXN0ZXIgY29udGFpbnMgYSBmaXhlZCBhZGRyZXNzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUKLWxhYmVsIGNhbGxlZCAnX19lcCcuICBUaGlzIGNhbiBlaXRoZXIgYmUgc2V0IHVwIGF1dG9tYXRpY2FsbHkgYnkgdGhlCi1saW5rZXIsIG9yIHNwZWNpZmljYWxseSBzZXQgYnkgdXNpbmcgdGhlIEBzYW1wey0tZGVmc3ltIF9fZXA9PHZhbHVlPn0KLWNvbW1hbmQgbGluZSBvcHRpb25dLgotCi1AY2luZGV4IEBjb2Rle3pkYW9mZn0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSB6ZGFvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSBhZGRyZXNzIDAgYW5kIHN0b3JlcyB0aGUKLXJlc3VsdCBhcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUgaW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZQotZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZToKLQotICAgICAgQHNhbXB7bW92ZWEgemRhb2ZmKF9hX3ZhcmlhYmxlKSx6ZXJvLHI2fQotCi1wdXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBsYWJlbCAnX2FfdmFyaWFibGUnIGludG8gcmVnaXN0ZXIgNiwgYXNzdW1pbmcKLXRoYXQgdGhlIGxhYmVsIGlzIHNvbWV3aGVyZSB3aXRoaW4gdGhlIGZpcnN0IDMySyBvZiBtZW1vcnkuICAoU3RyaWN0bHkKLXNwZWFraW5nIGl0IGFsc28gcG9zc2libGUgdG8gYWNjZXNzIHRoZSBsYXN0IDMySyBvZiBtZW1vcnkgYXMgd2VsbCwgYXMKLXRoZSBvZmZzZXRzIGFyZSBzaWduZWQpLgotCi1AY2luZGV4IEBjb2Rle2N0b2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGN0b2ZmKCkKLUNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWVkIHZhcmlhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBDYWxsCi1UYWJsZSBBcmVhICh3aG9lcyBhZGRyZXNzIGlzIGhlbGcgaW4gc3lzdGVtIHJlZ2lzdGVyIDIwLCB0aGUgQ1RCUAotcmVnaXN0ZXIpIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBhIDYgb3IgMTYgYml0IHVuc2lnbmVkIHZhbHVlIGluIHRoZQotaW1tZWRpYXRlIGZpZWxkIG9mIHRoZW4gZ2l2ZW4gaW5zdHJ1Y3Rpb24gb3IgcGllY2Ugb2YgZGF0YS4gIEZvcgotZXhhbXBsZToKLQotICAgICBAc2FtcHtjYWxsdCBjdG9mZih0YWJsZV9mdW5jMSl9Ci0KLXdpbGwgcHV0IHRoZSBjYWxsIHRoZSBmdW5jdGlvbiB3aG9lcyBhZGRyZXNzIGlzIGhlbGQgaW4gdGhlIGNhbGwgdGFibGUKLWF0IHRoZSBsb2NhdGlvbiBsYWJlbGVkICd0YWJsZV9mdW5jMScuCi0KLUBlbmQgdGFibGUKLQotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIFY4NTAgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7Vjg1MAotRmFtaWx5IDMyLS8xNi1CaXQgc2luZ2xlLUNoaXAgTWljcm9jb250cm9sbGVyIEFyY2hpdGVjdHVyZSBNYW51YWx9IGZyb20gTkVDLgotTHRkLgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtdmF4LnRleGkgYi9nYXMvZG9jL2MtdmF4LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxM2Q3ZTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXZheC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AYyBWQVgvVk1TIGRlc2NyaXB0aW9uIGV4aGFuY2VkIGFuZCBjb3JyZWN0ZWQgYnkgS2xhdXMgSyJhZW1wZiwga2thZW1wZkBwcm9naXMuZGUKLUBpZnNldCBHRU5FUklDCi1Abm9kZSBWYXgtRGVwZW5kZW50Ci1AY2hhcHRlciBWQVggRGVwZW5kZW50IEZlYXR1cmVzCi1AY2luZGV4IFZBWCBzdXBwb3J0Ci0KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBWQVggRGVwZW5kZW50IEZlYXR1cmVzCi1AY2luZGV4IFZBWCBzdXBwb3J0Ci0KLUBlbmQgaWZjbGVhcgotCi1AbWVudQotKiBWQVgtT3B0czo6ICAgICAgICAgICAgICAgICAgICBWQVggQ29tbWFuZC1MaW5lIE9wdGlvbnMKLSogVkFYLWZsb2F0OjogICAgICAgICAgICAgICAgICAgVkFYIEZsb2F0aW5nIFBvaW50Ci0qIFZBWC1kaXJlY3RpdmVzOjogICAgICAgICAgICAgIFZheCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogVkFYLW9wY29kZXM6OiAgICAgICAgICAgICAgICAgVkFYIE9wY29kZXMKLSogVkFYLWJyYW5jaDo6ICAgICAgICAgICAgICAgICAgVkFYIEJyYW5jaCBJbXByb3ZlbWVudAotKiBWQVgtb3BlcmFuZHM6OiAgICAgICAgICAgICAgICBWQVggT3BlcmFuZHMKLSogVkFYLW5vOjogICAgICAgICAgICAgICAgICAgICAgTm90IFN1cHBvcnRlZCBvbiBWQVgKLUBlbmQgbWVudQotCi0KLUBub2RlIFZBWC1PcHRzCi1Ac2VjdGlvbiBWQVggQ29tbWFuZC1MaW5lIE9wdGlvbnMKLQotQGNpbmRleCBjb21tYW5kLWxpbmUgb3B0aW9ucyBpZ25vcmVkLCBWQVgKLUBjaW5kZXggVkFYIGNvbW1hbmQtbGluZSBvcHRpb25zIGlnbm9yZWQKLVRoZSBWYXggdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMsCi1naXZlcyBhIHdhcm5pbmcgbWVzc2FnZSB0aGF0IHRoZSBvcHRpb24gd2FzIGlnbm9yZWQgYW5kIHByb2NlZWRzLgotVGhlc2Ugb3B0aW9ucyBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzY3JpcHRzIGRlc2lnbmVkIGZvciBvdGhlcgotcGVvcGxlJ3MgYXNzZW1ibGVycy4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1EfSwgaWdub3JlZCBvbiBWQVgKLUBjaW5kZXggQGNvZGV7LVN9LCBpZ25vcmVkIG9uIFZBWAotQGNpbmRleCBAY29kZXstVH0sIGlnbm9yZWQgb24gVkFYCi1AaXRlbSBAY29kZXstRH0gKERlYnVnKQotQGl0ZW14IEBjb2Rley1TfSAoU3ltYm9sIFRhYmxlKQotQGl0ZW14IEBjb2Rley1UfSAoVG9rZW4gVHJhY2UpCi1UaGVzZSBhcmUgb2Jzb2xldGUgb3B0aW9ucyB1c2VkIHRvIGRlYnVnIG9sZCBhc3NlbWJsZXJzLgotCi1AY2luZGV4IEBjb2Rley1kfSwgVkFYIG9wdGlvbgotQGl0ZW0gQGNvZGV7LWR9IChEaXNwbGFjZW1lbnQgc2l6ZSBmb3IgSlVNUHMpCi1UaGlzIG9wdGlvbiBleHBlY3RzIGEgbnVtYmVyIGZvbGxvd2luZyB0aGUgQHNhbXB7LWR9LiAgTGlrZSBvcHRpb25zCi10aGF0IGV4cGVjdCBmaWxlbmFtZXMsIHRoZSBudW1iZXIgbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUKLUBzYW1wey1kfSAob2xkIHN0YW5kYXJkKSBvciBjb25zdGl0dXRlIHRoZSB3aG9sZSBvZiB0aGUgY29tbWFuZCBsaW5lCi1hcmd1bWVudCB0aGF0IGZvbGxvd3MgQHNhbXB7LWR9IChAc2N7Z251fSBzdGFuZGFyZCkuCi0KLUBjaW5kZXggQGNvZGV7LVZ9LCByZWR1bmRhbnQgb24gVkFYCi1AaXRlbSBAY29kZXstVn0gKFZpcnR1YWxpemUgSW50ZXJwYXNzIFRlbXBvcmFyeSBGaWxlKQotU29tZSBvdGhlciBhc3NlbWJsZXJzIHVzZSBhIHRlbXBvcmFyeSBmaWxlLiAgVGhpcyBvcHRpb24KLWNvbW1hbmRlZCB0aGVtIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGluIGFjdGl2ZSBtZW1vcnkgcmF0aGVyCi10aGFuIGluIGEgZGlzayBmaWxlLiAgQGNvZGV7QHZhbHVle0FTfX0gYWx3YXlzIGRvZXMgdGhpcywgc28gdGhpcwotb3B0aW9uIGlzIHJlZHVuZGFudC4KLQotQGNpbmRleCBAY29kZXstSn0sIGlnbm9yZWQgb24gVkFYCi1AaXRlbSBAY29kZXstSn0gKEpVTVBpZnkgTG9uZ2VyIEJyYW5jaGVzKQotTWFueSAzMi1iaXQgY29tcHV0ZXJzIHBlcm1pdCBhIHZhcmlldHkgb2YgYnJhbmNoIGluc3RydWN0aW9ucwotdG8gZG8gdGhlIHNhbWUgam9iLiAgU29tZSBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgYXJlIHNob3J0IChhbmQKLWZhc3QpIGJ1dCBoYXZlIGEgbGltaXRlZCByYW5nZTsgb3RoZXJzIGFyZSBsb25nIChhbmQgc2xvdykgYnV0Ci1jYW4gYnJhbmNoIGFueXdoZXJlIGluIHZpcnR1YWwgbWVtb3J5LiAgT2Z0ZW4gdGhlcmUgYXJlIDMKLWZsYXZvcnMgb2YgYnJhbmNoOiBzaG9ydCwgbWVkaXVtIGFuZCBsb25nLiAgU29tZSBvdGhlcgotYXNzZW1ibGVycyB3b3VsZCBlbWl0IHNob3J0IGFuZCBtZWRpdW0gYnJhbmNoZXMsIHVubGVzcyB0b2xkIGJ5Ci10aGlzIG9wdGlvbiB0byBlbWl0IHNob3J0IGFuZCBsb25nIGJyYW5jaGVzLgotCi1AY2luZGV4IEBjb2Rley10fSwgaWdub3JlZCBvbiBWQVgKLUBpdGVtIEBjb2Rley10fSAoVGVtcG9yYXJ5IEZpbGUgRGlyZWN0b3J5KQotU29tZSBvdGhlciBhc3NlbWJsZXJzIG1heSB1c2UgYSB0ZW1wb3JhcnkgZmlsZSwgYW5kIHRoaXMgb3B0aW9uCi10YWtlcyBhIGZpbGVuYW1lIGJlaW5nIHRoZSBkaXJlY3RvcnkgdG8gc2l0ZSB0aGUgdGVtcG9yYXJ5Ci1maWxlLiAgU2luY2UgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgdXNlIGEgdGVtcG9yYXJ5IGRpc2sgZmlsZSwgdGhpcwotb3B0aW9uIG1ha2VzIG5vIGRpZmZlcmVuY2UuICBAc2FtcHstdH0gbmVlZHMgZXhhY3RseSBvbmUKLWZpbGVuYW1lLgotQGVuZCB0YWJsZQotCi1AY2luZGV4IFZNUyAoVkFYKSBvcHRpb25zCi1AY2luZGV4IG9wdGlvbnMgZm9yIFZBWC9WTVMKLUBjaW5kZXggVkFYL1ZNUyBvcHRpb25zCi1AY2luZGV4IFZheC0xMSBDIGNvbXBhdGliaWxpdHkKLUBjaW5kZXggc3ltYm9scyB3aXRoIHVwcGVyY2FzZSwgVkFYL1ZNUwotVGhlIFZheCB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgYWNjZXB0cyBhZGRpdGlvbmFsIG9wdGlvbnMgd2hlbgotY29tcGlsZWQgZm9yIFZNUzoKLQotQHRhYmxlIEBzYW1wCi1AY2luZGV4IEBzYW1wey1ofSBvcHRpb24sIFZBWC9WTVMKLUBpdGVtIC1oIEB2YXJ7bn0KLUV4dGVybmFsIHN5bWJvbCBvciBzZWN0aW9uICh1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzKSBuYW1lcyBhcmUgbm90Ci1jYXNlIHNlbnNpdGl2ZSBvbiBWQVgvVk1TIGFuZCBhbHdheXMgbWFwcGVkIHRvIHVwcGVyIGNhc2UuICBUaGlzIGlzCi1jb250cmFyeSB0byB0aGUgQyBsYW5ndWFnZSBkZWZpbml0aW9uIHdoaWNoIGV4cGxpY2l0bHkgZGlzdGluZ3Vpc2hlcwotdXBwZXIgYW5kIGxvd2VyIGNhc2UuICBUbyBpbXBsZW1lbnQgYSBzdGFuZGFyZCBjb25mb3JtaW5nIEMgY29tcGlsZXIsCi1uYW1lcyBtdXN0IGJlIGNoYW5nZWQgKG1hcHBlZCkgdG8gcHJlc2VydmUgdGhlIGNhc2UgaW5mb3JtYXRpb24uICBUaGUKLWRlZmF1bHQgbWFwcGluZyBpcyB0byBjb252ZXJ0IGFsbCBsb3dlciBjYXNlIGNoYXJhY3RlcnMgdG8gdXBwZXJjYXNlIGFuZAotYWRkaW5nIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYSA2IGRpZ2l0IGhleCB2YWx1ZSwgcmVwcmVzZW50aW5nIGEgMjQKLWRpZ2l0IGJpbmFyeSB2YWx1ZS4gIFRoZSBvbmUgZGlnaXRzIGluIHRoZSBiaW5hcnkgdmFsdWUgcmVwcmVzZW50IHdoaWNoCi1jaGFyYWN0ZXJzIGFyZSB1cHBlcmNhc2UgaW4gdGhlIG9yaWdpbmFsIHN5bWJvbCBuYW1lLgotCi1UaGUgQHNhbXB7LWggQHZhcntufX0gb3B0aW9uIGRldGVybWluZXMgaG93IHdlIG1hcCBuYW1lcy4gIFRoaXMgdGFrZXMKLXNldmVyYWwgdmFsdWVzLiAgTm8gQHNhbXB7LWh9IHN3aXRjaCBhdCBhbGwgYWxsb3dzIGNhc2UgaGFja2luZyBhcwotZGVzY3JpYmVkIGFib3ZlLiAgQSB2YWx1ZSBvZiB6ZXJvIChAc2FtcHstaDB9KSBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotdXBwZXIgY2FzZSwgYW5kIGluaGliaXRzIHRoZSBjYXNlIGhhY2suICBBIHZhbHVlIG9mIDIgKEBzYW1wey1oMn0pCi1pbXBsaWVzIG5hbWVzIHNob3VsZCBiZSBhbGwgbG93ZXIgY2FzZSwgd2l0aCBubyBjYXNlIGhhY2suICBBIHZhbHVlIG9mIDMKLShAc2FtcHstaDN9KSBpbXBsaWVzIHRoYXQgY2FzZSBzaG91bGQgYmUgcHJlc2VydmVkLiAgVGhlIHZhbHVlIDEgaXMKLXVudXNlZC4gIFRoZSBAY29kZXstSH0gb3B0aW9uIGRpcmVjdHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZGlzcGxheQotZXZlcnkgbWFwcGVkIHN5bWJvbCBkdXJpbmcgYXNzZW1ibHkuCi0KLVN5bWJvbHMgd2hvc2UgbmFtZXMgaW5jbHVkZSBhIGRvbGxhciBzaWduIEBzYW1weyR9IGFyZSBleGNlcHRpb25zIHRvIHRoZQotZ2VuZXJhbCBuYW1lIG1hcHBpbmcuICBUaGVzZSBzeW1ib2xzIGFyZSBub3JtYWxseSBvbmx5IHVzZWQgdG8gcmVmZXJlbmNlCi1WTVMgbGlicmFyeSBuYW1lcy4gIFN1Y2ggc3ltYm9scyBhcmUgYWx3YXlzIG1hcHBlZCB0byB1cHBlciBjYXNlLgotCi1AY2luZGV4IEBzYW1wey0rfSBvcHRpb24sIFZBWC9WTVMKLUBpdGVtIC0rCi1UaGUgQHNhbXB7LSt9IG9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gdHJ1bmNhdGUgYW55IHN5bWJvbAotbmFtZSBsYXJnZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLiAgVGhlIEBzYW1wey0rfSBvcHRpb24gYWxzbyBwcmV2ZW50cyBzb21lCi1jb2RlIGZvbGxvd2luZyB0aGUgQHNhbXB7X21haW59IHN5bWJvbCBub3JtYWxseSBhZGRlZCB0byBtYWtlIHRoZSBvYmplY3QKLWZpbGUgY29tcGF0aWJsZSB3aXRoIFZheC0xMSAiQyIuCi0KLUBjaW5kZXggQHNhbXB7LTF9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLTEKLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBAY29kZXtAdmFsdWV7QVN9fQotdmVyc2lvbiAxLnguCi0KLUBjaW5kZXggQHNhbXB7LUh9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLUgKLVRoZSBAc2FtcHstSH0gb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byBwcmludCBldmVyeSBzeW1ib2wKLXdoaWNoIHdhcyBjaGFuZ2VkIGJ5IGNhc2UgbWFwcGluZy4KLUBlbmQgdGFibGUKLQotQG5vZGUgVkFYLWZsb2F0Ci1Ac2VjdGlvbiBWQVggRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBWQVggZmxvYXRpbmcgcG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIFZBWAotQ29udmVyc2lvbiBvZiBmbG9udW1zIHRvIGZsb2F0aW5nIHBvaW50IGlzIGNvcnJlY3QsIGFuZAotY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIGFzc2VtYmxlcnMuICBSb3VuZGluZyBpcwotdG93YXJkcyB6ZXJvIGlmIHRoZSByZW1haW5kZXIgaXMgZXhhY3RseSBoYWxmIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCi0KLUBjb2Rle0R9LCBAY29kZXtGfSwgQGNvZGV7R30gYW5kIEBjb2Rle0h9IGZsb2F0aW5nIHBvaW50IGZvcm1hdHMKLWFyZSB1bmRlcnN0b29kLgotCi1JbW1lZGlhdGUgZmxvYXRpbmcgbGl0ZXJhbHMgKEBlbXBoe2UuZy59IEBzYW1we1NgJDYuOX0pCi1hcmUgcmVuZGVyZWQgY29ycmVjdGx5LiAgQWdhaW4sIHJvdW5kaW5nIGlzIHRvd2FyZHMgemVybyBpbiB0aGUKLWJvdW5kYXJ5IGNhc2UuCi0KLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlLCBWQVgKLVRoZSBAY29kZXsuZmxvYXR9IGRpcmVjdGl2ZSBwcm9kdWNlcyBAY29kZXtmfSBmb3JtYXQgbnVtYmVycy4KLVRoZSBAY29kZXsuZG91YmxlfSBkaXJlY3RpdmUgcHJvZHVjZXMgQGNvZGV7ZH0gZm9ybWF0IG51bWJlcnMuCi0KLUBub2RlIFZBWC1kaXJlY3RpdmVzCi1Ac2VjdGlvbiBWYXggTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBWQVgKLUBjaW5kZXggVkFYIG1hY2hpbmUgZGlyZWN0aXZlcwotVGhlIFZheCB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgc3VwcG9ydHMgZm91ciBkaXJlY3RpdmVzIGZvcgotZ2VuZXJhdGluZyBWYXggZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLiAgVGhleSBhcmUgZGVzY3JpYmVkIGluIHRoZQotdGFibGUgYmVsb3cuCi0KLUBjaW5kZXggd2lkZSBmbG9hdGluZyBwb2ludCBkaXJlY3RpdmVzLCBWQVgKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtkZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZGZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtkfSBmb3JtYXQgNjQtYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtmZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZmZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtmfSBmb3JtYXQgMzItYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtnZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZ2Zsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtnfSBmb3JtYXQgNjQtYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtoZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuaGZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtofSBmb3JtYXQgMTI4LWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgVkFYLW9wY29kZXMKLUBzZWN0aW9uIFZBWCBPcGNvZGVzCi0KLUBjaW5kZXggVkFYIG9wY29kZSBtbmVtb25pY3MKLUBjaW5kZXggb3Bjb2RlIG1uZW1vbmljcywgVkFYCi1AY2luZGV4IG1uZW1vbmljcyBmb3Igb3Bjb2RlcywgVkFYCi1BbGwgREVDIG1uZW1vbmljcyBhcmUgc3VwcG9ydGVkLiAgQmV3YXJlIHRoYXQgQGNvZGV7Y2FzZUBkb3Rze319Ci1pbnN0cnVjdGlvbnMgaGF2ZSBleGFjdGx5IDMgb3BlcmFuZHMuICBUaGUgZGlzcGF0Y2ggdGFibGUgdGhhdAotZm9sbG93cyB0aGUgQGNvZGV7Y2FzZUBkb3Rze319IGluc3RydWN0aW9uIHNob3VsZCBiZSBtYWRlIHdpdGgKLUBjb2Rley53b3JkfSBzdGF0ZW1lbnRzLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggYWxsIHVuaXgKLWFzc2VtYmxlcnMgd2Uga25vdyBvZi4KLQotQG5vZGUgVkFYLWJyYW5jaAotQHNlY3Rpb24gVkFYIEJyYW5jaCBJbXByb3ZlbWVudAotCi1AY2luZGV4IFZBWCBicmFuY2ggaW1wcm92ZW1lbnQKLUBjaW5kZXggYnJhbmNoIGltcHJvdmVtZW50LCBWQVgKLUBjaW5kZXggcHNldWRvLW9wcyBmb3IgYnJhbmNoLCBWQVgKLUNlcnRhaW4gcHNldWRvIG9wY29kZXMgYXJlIHBlcm1pdHRlZC4gIFRoZXkgYXJlIGZvciBicmFuY2gKLWluc3RydWN0aW9ucy4gIFRoZXkgZXhwYW5kIHRvIHRoZSBzaG9ydGVzdCBicmFuY2ggaW5zdHJ1Y3Rpb24gdGhhdAotcmVhY2hlcyB0aGUgdGFyZ2V0LiAgR2VuZXJhbGx5IHRoZXNlIG1uZW1vbmljcyBhcmUgbWFkZSBieQotc3Vic3RpdHV0aW5nIEBzYW1we2p9IGZvciBAc2FtcHtifSBhdCB0aGUgc3RhcnQgb2YgYSBERUMgbW5lbW9uaWMuCi1UaGlzIGZlYXR1cmUgaXMgaW5jbHVkZWQgYm90aCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgdG8gaGVscAotY29tcGlsZXJzLiAgSWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgZmVhdHVyZSwgYXZvaWQgdGhlc2UKLW9wY29kZXMuICBIZXJlIGFyZSB0aGUgbW5lbW9uaWNzLCBhbmQgdGhlIGNvZGUgdGhleSBjYW4gZXhwYW5kIGludG8uCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gamJzYgotQHNhbXB7SnNifSBpcyBhbHJlYWR5IGFuIGluc3RydWN0aW9uIG1uZW1vbmljLCBzbyB3ZSBjaG9zZSBAc2FtcHtqYnNifS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHtic2JiIEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JzYncgQGRvdHN7fX0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBrYmR7anNiIEBkb3Rze319Ci1AZW5kIHRhYmxlCi1AaXRlbSBqYnIKLUBpdGVteCBqcgotVW5jb25kaXRpb25hbCBicmFuY2guCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7YnJiIEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JydyBAZG90c3t9fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGtiZHtqbXAgQGRvdHN7fX0KLUBlbmQgdGFibGUKLUBpdGVtIGpAdmFye0NPTkR9Ci1AdmFye0NPTkR9IG1heSBiZSBhbnkgb25lIG9mIHRoZSBjb25kaXRpb25hbCBicmFuY2hlcwotQGNvZGV7bmVxfSwgQGNvZGV7bmVxdX0sIEBjb2Rle2VxbH0sIEBjb2Rle2VxbHV9LCBAY29kZXtndHJ9LAotQGNvZGV7Z2VxfSwgQGNvZGV7bHNzfSwgQGNvZGV7Z3RydX0sIEBjb2Rle2xlcXV9LCBAY29kZXt2Y30sIEBjb2Rle3ZzfSwKLUBjb2Rle2dlcXV9LCBAY29kZXtjY30sIEBjb2Rle2xzc3V9LCBAY29kZXtjc30uCi1AdmFye0NPTkR9IG1heSBhbHNvIGJlIG9uZSBvZiB0aGUgYml0IHRlc3RzCi1AY29kZXtic30sIEBjb2Rle2JjfSwgQGNvZGV7YnNzfSwgQGNvZGV7YmNzfSwgQGNvZGV7YnNjfSwgQGNvZGV7YmNjfSwKLUBjb2Rle2Jzc2l9LCBAY29kZXtiY2NpfSwgQGNvZGV7bGJzfSwgQGNvZGV7bGJjfS4KLUB2YXJ7Tk9UQ09ORH0gaXMgdGhlIG9wcG9zaXRlIGNvbmRpdGlvbiB0byBAdmFye0NPTkR9LgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JAdmFye0NPTkR9IEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JAdmFye05PVENPTkR9IGZvbyA7IGJydyBAZG90c3t9IDsgZm9vOn0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBrYmR7YkB2YXJ7Tk9UQ09ORH0gZm9vIDsgam1wIEBkb3Rze30gOyBmb286fQotQGVuZCB0YWJsZQotQGl0ZW0gamFjYkB2YXJ7WH0KLUB2YXJ7WH0gbWF5IGJlIG9uZSBvZiBAY29kZXtiIGQgZiBnIGggbCB3fS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGtiZHtAdmFye09QQ09ERX0gQGRvdHN7fX0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBqbXAgQGRvdHN7fSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLUBpdGVtIGphb2JAdmFye1lZWX0KLUB2YXJ7WVlZfSBtYXkgYmUgb25lIG9mIEBjb2Rle2xzcyBsZXF9LgotQGl0ZW0ganNvYkB2YXJ7WlpafQotQHZhcntaWlp9IG1heSBiZSBvbmUgb2YgQGNvZGV7Z2VxIGd0cn0uCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7QHZhcntPUENPREV9IEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogYnJ3IEB2YXJ7ZGVzdGluYXRpb259IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGptcCBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLUBpdGVtIGFvYmxlcQotQGl0ZW14IGFvYmxzcwotQGl0ZW14IHNvYmdlcQotQGl0ZW14IHNvYmd0cgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke0B2YXJ7T1BDT0RFfSBAZG90c3t9fQotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGJydyBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBqbXAgQHZhcntkZXN0aW5hdGlvbn0gOwotYmFyOgotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi1AZW5kIHRhYmxlCi0KLUBub2RlIFZBWC1vcGVyYW5kcwotQHNlY3Rpb24gVkFYIE9wZXJhbmRzCi0KLUBjaW5kZXggVkFYIG9wZXJhbmQgbm90YXRpb24KLUBjaW5kZXggb3BlcmFuZCBub3RhdGlvbiwgVkFYCi1AY2luZGV4IGltbWVkaWF0ZSBjaGFyYWN0ZXIsIFZBWAotQGNpbmRleCBWQVggaW1tZWRpYXRlIGNoYXJhY3RlcgotVGhlIGltbWVkaWF0ZSBjaGFyYWN0ZXIgaXMgQHNhbXB7JH0gZm9yIFVuaXggY29tcGF0aWJpbGl0eSwgbm90Ci1Ac2FtcHsjfSBhcyBERUMgd3JpdGVzIGl0LgotCi1AY2luZGV4IGluZGlyZWN0IGNoYXJhY3RlciwgVkFYCi1AY2luZGV4IFZBWCBpbmRpcmVjdCBjaGFyYWN0ZXIKLVRoZSBpbmRpcmVjdCBjaGFyYWN0ZXIgaXMgQHNhbXB7Kn0gZm9yIFVuaXggY29tcGF0aWJpbGl0eSwgbm90Ci1Ac2FtcHtAQH0gYXMgREVDIHdyaXRlcyBpdC4KLQotQGNpbmRleCBkaXNwbGFjZW1lbnQgc2l6aW5nIGNoYXJhY3RlciwgVkFYCi1AY2luZGV4IFZBWCBkaXNwbGFjZW1lbnQgc2l6aW5nIGNoYXJhY3RlcgotVGhlIGRpc3BsYWNlbWVudCBzaXppbmcgY2hhcmFjdGVyIGlzIEBzYW1we2B9IChhbiBhY2NlbnQgZ3JhdmUpIGZvcgotVW5peCBjb21wYXRpYmlsaXR5LCBub3QgQHNhbXB7Xn0gYXMgREVDIHdyaXRlcyBpdC4gIFRoZSBsZXR0ZXIKLXByZWNlZGluZyBAc2FtcHtgfSBtYXkgaGF2ZSBlaXRoZXIgY2FzZS4gIEBzYW1we0d9IGlzIG5vdAotdW5kZXJzdG9vZCwgYnV0IGFsbCBvdGhlciBsZXR0ZXJzIChAY29kZXtiIGkgbCBzIHd9KSBhcmUgdW5kZXJzdG9vZC4KLQotQGNpbmRleCByZWdpc3RlciBuYW1lcywgVkFYCi1AY2luZGV4IFZBWCByZWdpc3RlciBuYW1lcwotUmVnaXN0ZXIgbmFtZXMgdW5kZXJzdG9vZCBhcmUgQGNvZGV7cjAgcjEgcjIgQGRvdHN7fSByMTUgYXAgZnAgc3AKLXBjfS4gIFVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMgYXJlIGVxdWl2YWxlbnQuCi0KLUZvciBpbnN0YW5jZQotQHNtYWxsZXhhbXBsZQotdHN0YiAqd2AkNChyNSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUFueSBleHByZXNzaW9uIGlzIHBlcm1pdHRlZCBpbiBhbiBvcGVyYW5kLiAgT3BlcmFuZHMgYXJlIGNvbW1hCi1zZXBhcmF0ZWQuCi0KLUBjIFRoZXJlIGlzIHNvbWUgYnVnIHRvIGRvIHdpdGggcmVjb2duaXppbmcgZXhwcmVzc2lvbnMKLUBjIGluIG9wZXJhbmRzLCBidXQgSSBmb3JnZXQgd2hhdCBpdCBpcy4gIEl0IGlzCi1AYyBhIHN5bnRheCBjbGFzaCBiZWNhdXNlICgpIGlzIHVzZWQgYXMgYW4gYWRkcmVzcyBtb2RlCi1AYyBhbmQgdG8gZW5jYXBzdWxhdGUgc3ViLWV4cHJlc3Npb25zLgotCi1Abm9kZSBWQVgtbm8KLUBzZWN0aW9uIE5vdCBTdXBwb3J0ZWQgb24gVkFYCi0KLUBjaW5kZXggVkFYIGJpdGZpZWxkcyBub3Qgc3VwcG9ydGVkCi1AY2luZGV4IGJpdGZpZWxkcywgbm90IHN1cHBvcnRlZCBvbiBWQVgKLVZheCBiaXQgZmllbGRzIGNhbiBub3QgYmUgYXNzZW1ibGVkIHdpdGggQGNvZGV7QHZhbHVle0FTfX0uICBTb21lb25lCi1jYW4gYWRkIHRoZSByZXF1aXJlZCBjb2RlIGlmIHRoZXkgcmVhbGx5IG5lZWQgaXQuCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtejhrLnRleGkgYi9nYXMvZG9jL2MtejhrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYjEwZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXo4ay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBaODAwMC1EZXBlbmRlbnQKLUBjaGFwdGVyIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggWjgwMDAgc3VwcG9ydAotVGhlIFo4MDAwIEB2YWx1ZXtBU30gc3VwcG9ydHMgYm90aCBtZW1iZXJzIG9mIHRoZSBaODAwMCBmYW1pbHk6IHRoZQotdW5zZWdtZW50ZWQgWjgwMDIsIHdpdGggMTYgYml0IGFkZHJlc3NlcywgYW5kIHRoZSBzZWdtZW50ZWQgWjgwMDEgd2l0aAotMjQgYml0IGFkZHJlc3Nlcy4KLQotV2hlbiB0aGUgYXNzZW1ibGVyIGlzIGluIHVuc2VnbWVudGVkIG1vZGUgKHNwZWNpZmllZCB3aXRoIHRoZQotQGNvZGV7dW5zZWdtfSBkaXJlY3RpdmUpLCBhbiBhZGRyZXNzIHRha2VzIHVwIG9uZSB3b3JkICgxNiBiaXQpCi1zaXplZCByZWdpc3Rlci4gIFdoZW4gdGhlIGFzc2VtYmxlciBpcyBpbiBzZWdtZW50ZWQgbW9kZSAoc3BlY2lmaWVkIHdpdGgKLXRoZSBAY29kZXtzZWdtfSBkaXJlY3RpdmUpLCBhIDI0LWJpdCBhZGRyZXNzIHRha2VzIHVwIGEgbG9uZyAoMzIgYml0KQotcmVnaXN0ZXIuICBAeHJlZntaODAwMCBEaXJlY3RpdmVzLCxBc3NlbWJsZXIgRGlyZWN0aXZlcyBmb3IgdGhlIFo4MDAwfSwKLWZvciBhIGxpc3Qgb2Ygb3RoZXIgWjgwMDAgc3BlY2lmaWMgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCi0KLUBtZW51Ci0qIFo4MDAwIE9wdGlvbnM6OiAgICAgICAgICAgICAgIE5vIHNwZWNpYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIFo4MDAwCi0qIFo4MDAwIFN5bnRheDo6ICAgICAgICAgICAgICAgIEFzc2VtYmxlciBzeW50YXggZm9yIHRoZSBaODAwMAotKiBaODAwMCBEaXJlY3RpdmVzOjogICAgICAgICAgICBTcGVjaWFsIGRpcmVjdGl2ZXMgZm9yIHRoZSBaODAwMAotKiBaODAwMCBPcGNvZGVzOjogICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgWjgwMDAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IFo4MDAwIG9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgWjgwMDAKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgWmlsb2cKLVo4MDAwIGZhbWlseS4KLQotQG5vZGUgWjgwMDAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIFo4MDAwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIFo4MDAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogWjgwMDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgWjgwMDAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIFo4MDAwCi1AY2luZGV4IFo4MDAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1weyF9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBaODAwMAotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBaODAwMAotQGNpbmRleCBaODAwMCBsaW5lIHNlcGFyYXRvcgotWW91IGNhbiB1c2UgQHNhbXB7O30gaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotQG5vZGUgWjgwMDAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBaODAwMCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBaODAwMAotVGhlIFo4MDAwIGhhcyBzaXh0ZWVuIDE2IGJpdCByZWdpc3RlcnMsIG51bWJlcmVkIDAgdG8gMTUuICBZb3UgY2FuIHJlZmVyCi10byBkaWZmZXJlbnQgc2l6ZWQgZ3JvdXBzIG9mIHJlZ2lzdGVycyBieSByZWdpc3RlciBudW1iZXIsIHdpdGggdGhlCi1wcmVmaXggQHNhbXB7cn0gZm9yIDE2IGJpdCByZWdpc3RlcnMsIEBzYW1we3JyfSBmb3IgMzIgYml0IHJlZ2lzdGVycyBhbmQKLUBzYW1we3JxfSBmb3IgNjQgYml0IHJlZ2lzdGVycy4gIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgY29udGVudHMgb2YKLXRoZSBmaXJzdCBlaWdodCAob2YgdGhlIHNpeHRlZW4gMTYgYml0IHJlZ2lzdGVycykgYnkgYnl0ZXMuICBUaGV5IGFyZQotbmFtZWQgQHNhbXB7ckB2YXJ7bn1ofSBhbmQgQHNhbXB7ckB2YXJ7bn1sfS4KLQotQHNtYWxsZXhhbXBsZQotQGV4ZGVudCBAZW1waHtieXRlIHJlZ2lzdGVyc30KLXIwbCByMGggcjFoIHIxbCByMmggcjJsIHIzaCByM2wKLXI0aCByNGwgcjVoIHI1bCByNmggcjZsIHI3aCByN2wKLQotQGV4ZGVudCBAZW1waHt3b3JkIHJlZ2lzdGVyc30KLXIwIHIxIHIyIHIzIHI0IHI1IHI2IHI3IHI4IHI5IHIxMCByMTEgcjEyIHIxMyByMTQgcjE1Ci0KLUBleGRlbnQgQGVtcGh7bG9uZyB3b3JkIHJlZ2lzdGVyc30KLXJyMCBycjIgcnI0IHJyNiBycjggcnIxMCBycjEyIHJyMTQKLQotQGV4ZGVudCBAZW1waHtxdWFkIHdvcmQgcmVnaXN0ZXJzfQotcnEwIHJxNCBycTggcnExMgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgWjgwMDAtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIFo4MDAwCi1AY2luZGV4IFo4MDAgYWRkcmVzc2luZyBtb2RlcwotQHZhbHVle0FTfSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBaODAwMDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSByQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci0KLUBpdGVtIEBAckB2YXJ7bn0KLUluZGlyZWN0IHJlZ2lzdGVyCi0KLUBpdGVtIEB2YXJ7YWRkcn0KLURpcmVjdDogdGhlIDE2IGJpdCBvciAyNCBiaXQgYWRkcmVzcyAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFzc2VtYmxlcgotaXMgaW4gc2VnbWVudGVkIG9yIHVuc2VnbWVudGVkIG1vZGUpIG9mIHRoZSBvcGVyYW5kIGlzIGluIHRoZSBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gYWRkcmVzcyhyQHZhcntufSkKLUluZGV4ZWQ6IHRoZSAxNiBvciAyNCBiaXQgYWRkcmVzcyBpcyBhZGRlZCB0byB0aGUgMTYgYml0IHJlZ2lzdGVyIHRvIHByb2R1Y2UKLXRoZSBmaW5hbCBhZGRyZXNzIGluIG1lbW9yeSBvZiB0aGUgb3BlcmFuZC4KLQotQGl0ZW0gckB2YXJ7bn0oI0B2YXJ7aW1tfSkKLUJhc2UgQWRkcmVzczogdGhlIDE2IG9yIDI0IGJpdCByZWdpc3RlciBpcyBhZGRlZCB0byB0aGUgMTYgYml0IHNpZ24KLWV4dGVuZGVkIGltbWVkaWF0ZSBkaXNwbGFjZW1lbnQgdG8gcHJvZHVjZSB0aGUgZmluYWwgYWRkcmVzcyBpbiBtZW1vcnkKLW9mIHRoZSBvcGVyYW5kLgotCi1AaXRlbSByQHZhcntufShyQHZhcnttfSkKLUJhc2UgSW5kZXg6IHRoZSAxNiBvciAyNCBiaXQgcmVnaXN0ZXIgckB2YXJ7bn0gaXMgYWRkZWQgdG8gdGhlIHNpZ24KLWV4dGVuZGVkIDE2IGJpdCBpbmRleCByZWdpc3RlciByQHZhcnttfSB0byBwcm9kdWNlIHRoZSBmaW5hbCBhZGRyZXNzIGluCi1tZW1vcnkgb2YgdGhlIG9wZXJhbmQuCi0KLUBpdGVtICNAdmFye3h4fQotSW1tZWRpYXRlIGRhdGEgQHZhcnt4eH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIFo4MDAwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEFzc2VtYmxlciBEaXJlY3RpdmVzIGZvciB0aGUgWjgwMDAKLQotQGNpbmRleCBaODAwMCBkaXJlY3RpdmVzCi1AY2luZGV4IGRpcmVjdGl2ZXMsIFo4MDAwCi1UaGUgWjgwMDAgcG9ydCBvZiBAdmFsdWV7QVN9IGluY2x1ZGVzIHRoZXNlIGFkZGl0aW9uYWwgYXNzZW1ibGVyIGRpcmVjdGl2ZXMsCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFo4MDAwIGFzc2VtYmxlcnMuICBBcyBzaG93biwgdGhlc2UgZG8gbm90Ci1iZWdpbiB3aXRoIEBzYW1wey59ICh1bmxpa2UgdGhlIG9yZGluYXJ5IEB2YWx1ZXtBU30gZGlyZWN0aXZlcykuCi0KLUB0YWJsZSBAY29kZQotQGtpbmRleCBzZWdtCi1AaXRlbSBzZWdtCi1HZW5lcmF0ZXMgY29kZSBmb3IgdGhlIHNlZ21lbnRlZCBaODAwMS4KLQotQGtpbmRleCB1bnNlZ20KLUBpdGVtIHVuc2VnbQotR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSB1bnNlZ21lbnRlZCBaODAwMi4KLQotQGtpbmRleCBuYW1lCi1AaXRlbSBuYW1lCi1TeW5vbnltIGZvciBAY29kZXsuZmlsZX0KLQotQGtpbmRleCBnbG9iYWwKLUBpdGVtIGdsb2JhbAotU3lub255bSBmb3IgQGNvZGV7Lmdsb2JhbH0KLQotQGtpbmRleCB3dmFsCi1AaXRlbSB3dmFsCi1TeW5vbnltIGZvciBAY29kZXsud29yZH0KLQotQGtpbmRleCBsdmFsCi1AaXRlbSBsdmFsCi1TeW5vbnltIGZvciBAY29kZXsubG9uZ30KLQotQGtpbmRleCBidmFsCi1AaXRlbSBidmFsCi1TeW5vbnltIGZvciBAY29kZXsuYnl0ZX0KLQotQGtpbmRleCBzdmFsCi1AaXRlbSBzdmFsCi1Bc3NlbWJsZSBhIHN0cmluZy4gIEBjb2Rle3N2YWx9IGV4cGVjdHMgb25lIHN0cmluZyBsaXRlcmFsLCBkZWxpbWl0ZWQgYnkKLXNpbmdsZSBxdW90ZXMuICBJdCBhc3NlbWJsZXMgZWFjaCBieXRlIG9mIHRoZSBzdHJpbmcgaW50byBjb25zZWN1dGl2ZQotYWRkcmVzc2VzLiAgWW91IGNhbiB1c2UgdGhlIGVzY2FwZSBzZXF1ZW5jZSBAc2FtcHslQHZhcnt4eH19ICh3aGVyZQotQHZhcnt4eH0gcmVwcmVzZW50cyBhIHR3by1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXIpIHRvIHJlcHJlc2VudCB0aGUKLWNoYXJhY3RlciB3aG9zZSBAc2N7YXNjaWl9IHZhbHVlIGlzIEB2YXJ7eHh9LiAgVXNlIHRoaXMgZmVhdHVyZSB0bwotZGVzY3JpYmUgc2luZ2xlIHF1b3RlIGFuZCBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgbWF5IG5vdCBhcHBlYXIgaW4gc3RyaW5nCi1saXRlcmFscyBhcyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBDIHN0YXRlbWVudCBAd3tAc2FtcHtjaGFyICphID0KLSJoZSBzYWlkIFwiaXQncyA1MCUgb2ZmXCIiO319IGlzIHJlcHJlc2VudGVkIGluIFo4MDAwIGFzc2VtYmx5IGxhbmd1YWdlCi0oc2hvd24gd2l0aCB0aGUgYXNzZW1ibGVyIG91dHB1dCBpbiBoZXggYXQgdGhlIGxlZnQpIGFzCi0KLUBpZnRleAotQGJlZ2luZ3JvdXAKLUBsZXRAbm9uYXJyb3dpbmc9QGNvbW1lbnQKLUBlbmQgaWZ0ZXgKLUBzbWFsbGV4YW1wbGUKLTY4NjUyMDczICAgIHN2YWwgICAgJ2hlIHNhaWQgJTIyaXQlMjdzIDUwJTI1IG9mZiUyMiUwMCcKLTYxNjk2NDIwCi0yMjY5NzQyNwotNzMyMDM1MzAKLTI1MjA2RjY2Ci02NjIyMDAKLUBlbmQgc21hbGxleGFtcGxlCi1AaWZ0ZXgKLUBlbmRncm91cAotQGVuZCBpZnRleAotCi1Aa2luZGV4IHJzZWN0Ci1AaXRlbSByc2VjdAotc3lub255bSBmb3IgQGNvZGV7LnNlY3Rpb259Ci0KLUBraW5kZXggYmxvY2sKLUBpdGVtIGJsb2NrCi1zeW5vbnltIGZvciBAY29kZXsuc3BhY2V9Ci0KLUBraW5kZXggZXZlbgotQGl0ZW0gZXZlbgotc3BlY2lhbCBjYXNlIG9mIEBjb2Rley5hbGlnbn07IGFsaWducyBvdXRwdXQgdG8gZXZlbiBieXRlIGJvdW5kYXJ5LgotQGVuZCB0YWJsZQotCi1Abm9kZSBaODAwMCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggWjgwMDAgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIFo4MDAwCi1AY2luZGV4IG1uZW1vbmljcywgWjgwMDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgWjgwMDAKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgWjgwMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7WjgwMDAgVGVjaG5pY2FsIE1hbnVhbH0uCi0KLUBpZnNldCBTTUFMTAotQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5Ci1AYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgb3Bjb2RlcyBhbmQgdGhlaXIgYXJndW1lbnRzOgotQGlmdGV4Ci1AYmVnaW5ncm91cAotQGxldEBub25hcnJvd2luZz1AY29tbWVudAotQGVuZCBpZnRleAotQHNtYWxsZXhhbXBsZQotCi0gICAgICAgICAgICBycyAgIEByezE2IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICByZCAgIEByezE2IGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJicyAgIEByezggYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJiZCAgIEByezggYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgcnJzICAgQHJ7MzIgYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJyZCAgIEByezMyIGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJxcyAgIEByezY0IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBycWQgICBAcns2NCBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBhZGRyIEByezE2LzI0IGJpdCBhZGRyZXNzfQotICAgICAgICAgICAgaW1tICBAcntpbW1lZGlhdGUgZGF0YX0KLQotYWRjIHJkLHJzICAgICAgICAgICAgICAgY2xyYiBhZGRyICAgICAgICAgICAgICAgY3BzaXIgQEByZCxAQHJzLHJyLGNjCi1hZGNiIHJiZCxyYnMgICAgICAgICAgICBjbHJiIGFkZHIocmQpICAgICAgICAgICBjcHNpcmIgQEByZCxAQHJzLHJyLGNjCi1hZGQgcmQsQEBycyAgICAgICAgICAgICAgY2xyYiByYmQgICAgICAgICAgICAgICAgZGFiIHJiZAotYWRkIHJkLGFkZHIgICAgICAgICAgICAgY29tIEBAcmQgICAgICAgICAgICAgICAgIGRiam56IHJiZCxkaXNwNwotYWRkIHJkLGFkZHIocnMpICAgICAgICAgY29tIGFkZHIgICAgICAgICAgICAgICAgZGVjIEBAcmQsaW1tNG0xCi1hZGQgcmQsaW1tMTYgICAgICAgICAgICBjb20gYWRkcihyZCkgICAgICAgICAgICBkZWMgYWRkcihyZCksaW1tNG0xCi1hZGQgcmQscnMgICAgICAgICAgICAgICBjb20gcmQgICAgICAgICAgICAgICAgICBkZWMgYWRkcixpbW00bTEKLWFkZGIgcmJkLEBAcnMgICAgICAgICAgICBjb21iIEBAcmQgICAgICAgICAgICAgICAgZGVjIHJkLGltbTRtMQotYWRkYiByYmQsYWRkciAgICAgICAgICAgY29tYiBhZGRyICAgICAgICAgICAgICAgZGVjYiBAQHJkLGltbTRtMQotYWRkYiByYmQsYWRkcihycykgICAgICAgY29tYiBhZGRyKHJkKSAgICAgICAgICAgZGVjYiBhZGRyKHJkKSxpbW00bTEKLWFkZGIgcmJkLGltbTggICAgICAgICAgIGNvbWIgcmJkICAgICAgICAgICAgICAgIGRlY2IgYWRkcixpbW00bTEKLWFkZGIgcmJkLHJicyAgICAgICAgICAgIGNvbWZsZyBmbGFncyAgICAgICAgICAgIGRlY2IgcmJkLGltbTRtMQotYWRkbCBycmQsQEBycyAgICAgICAgICAgIGNwIEBAcmQsaW1tMTYgICAgICAgICAgICBkaSBpMgotYWRkbCBycmQsYWRkciAgICAgICAgICAgY3AgYWRkcihyZCksaW1tMTYgICAgICAgZGl2IHJyZCxAQHJzCi1hZGRsIHJyZCxhZGRyKHJzKSAgICAgICBjcCBhZGRyLGltbTE2ICAgICAgICAgICBkaXYgcnJkLGFkZHIKLWFkZGwgcnJkLGltbTMyICAgICAgICAgIGNwIHJkLEBAcnMgICAgICAgICAgICAgICBkaXYgcnJkLGFkZHIocnMpCi1hZGRsIHJyZCxycnMgICAgICAgICAgICBjcCByZCxhZGRyICAgICAgICAgICAgICBkaXYgcnJkLGltbTE2Ci1hbmQgcmQsQEBycyAgICAgICAgICAgICAgY3AgcmQsYWRkcihycykgICAgICAgICAgZGl2IHJyZCxycwotYW5kIHJkLGFkZHIgICAgICAgICAgICAgY3AgcmQsaW1tMTYgICAgICAgICAgICAgZGl2bCBycWQsQEBycwotYW5kIHJkLGFkZHIocnMpICAgICAgICAgY3AgcmQscnMgICAgICAgICAgICAgICAgZGl2bCBycWQsYWRkcgotYW5kIHJkLGltbTE2ICAgICAgICAgICAgY3BiIEBAcmQsaW1tOCAgICAgICAgICAgIGRpdmwgcnFkLGFkZHIocnMpCi1hbmQgcmQscnMgICAgICAgICAgICAgICBjcGIgYWRkcihyZCksaW1tOCAgICAgICBkaXZsIHJxZCxpbW0zMgotYW5kYiByYmQsQEBycyAgICAgICAgICAgIGNwYiBhZGRyLGltbTggICAgICAgICAgIGRpdmwgcnFkLHJycwotYW5kYiByYmQsYWRkciAgICAgICAgICAgY3BiIHJiZCxAQHJzICAgICAgICAgICAgIGRqbnogcmQsZGlzcDcKLWFuZGIgcmJkLGFkZHIocnMpICAgICAgIGNwYiByYmQsYWRkciAgICAgICAgICAgIGVpIGkyCi1hbmRiIHJiZCxpbW04ICAgICAgICAgICBjcGIgcmJkLGFkZHIocnMpICAgICAgICBleCByZCxAQHJzCi1hbmRiIHJiZCxyYnMgICAgICAgICAgICBjcGIgcmJkLGltbTggICAgICAgICAgICBleCByZCxhZGRyCi1iaXQgQEByZCxpbW00ICAgICAgICAgICAgY3BiIHJiZCxyYnMgICAgICAgICAgICAgZXggcmQsYWRkcihycykKLWJpdCBhZGRyKHJkKSxpbW00ICAgICAgIGNwZCByZCxAQHJzLHJyLGNjICAgICAgICBleCByZCxycwotYml0IGFkZHIsaW1tNCAgICAgICAgICAgY3BkYiByYmQsQEBycyxycixjYyAgICAgIGV4YiByYmQsQEBycwotYml0IHJkLGltbTQgICAgICAgICAgICAgY3BkciByZCxAQHJzLHJyLGNjICAgICAgIGV4YiByYmQsYWRkcgotYml0IHJkLHJzICAgICAgICAgICAgICAgY3BkcmIgcmJkLEBAcnMscnIsY2MgICAgIGV4YiByYmQsYWRkcihycykKLWJpdGIgQEByZCxpbW00ICAgICAgICAgICBjcGkgcmQsQEBycyxycixjYyAgICAgICAgZXhiIHJiZCxyYnMKLWJpdGIgYWRkcihyZCksaW1tNCAgICAgIGNwaWIgcmJkLEBAcnMscnIsY2MgICAgICBleHQwZSBpbW04Ci1iaXRiIGFkZHIsaW1tNCAgICAgICAgICBjcGlyIHJkLEBAcnMscnIsY2MgICAgICAgZXh0MGYgaW1tOAotYml0YiByYmQsaW1tNCAgICAgICAgICAgY3BpcmIgcmJkLEBAcnMscnIsY2MgICAgIGV4dDhlIGltbTgKLWJpdGIgcmJkLHJzICAgICAgICAgICAgIGNwbCBycmQsQEBycyAgICAgICAgICAgICBleHQ4ZiBpbW04Ci1icHQgICAgICAgICAgICAgICAgICAgICBjcGwgcnJkLGFkZHIgICAgICAgICAgICBleHRzIHJyZAotY2FsbCBAQHJkICAgICAgICAgICAgICAgIGNwbCBycmQsYWRkcihycykgICAgICAgIGV4dHNiIHJkCi1jYWxsIGFkZHIgICAgICAgICAgICAgICBjcGwgcnJkLGltbTMyICAgICAgICAgICBleHRzbCBycWQKLWNhbGwgYWRkcihyZCkgICAgICAgICAgIGNwbCBycmQscnJzICAgICAgICAgICAgIGhhbHQKLWNhbHIgZGlzcDEyICAgICAgICAgICAgIGNwc2QgQEByZCxAQHJzLHJyLGNjICAgICAgaW4gcmQsQEBycwotY2xyIEBAcmQgICAgICAgICAgICAgICAgIGNwc2RiIEBAcmQsQEBycyxycixjYyAgICAgaW4gcmQsaW1tMTYKLWNsciBhZGRyICAgICAgICAgICAgICAgIGNwc2RyIEBAcmQsQEBycyxycixjYyAgICAgaW5iIHJiZCxAQHJzCi1jbHIgYWRkcihyZCkgICAgICAgICAgICBjcHNkcmIgQEByZCxAQHJzLHJyLGNjICAgIGluYiByYmQsaW1tMTYKLWNsciByZCAgICAgICAgICAgICAgICAgIGNwc2kgQEByZCxAQHJzLHJyLGNjICAgICAgaW5jIEBAcmQsaW1tNG0xCi1jbHJiIEBAcmQgICAgICAgICAgICAgICAgY3BzaWIgQEByZCxAQHJzLHJyLGNjICAgICBpbmMgYWRkcihyZCksaW1tNG0xCi1pbmMgYWRkcixpbW00bTEgICAgICAgICBsZGIgcmJkLHJzKHJ4KSAgICAgICAgICBtdWx0IHJyZCxhZGRyKHJzKQotaW5jIHJkLGltbTRtMSAgICAgICAgICAgbGRiIHJkKGltbTE2KSxyYnMgICAgICAgbXVsdCBycmQsaW1tMTYKLWluY2IgQEByZCxpbW00bTEgICAgICAgICBsZGIgcmQocngpLHJicyAgICAgICAgICBtdWx0IHJyZCxycwotaW5jYiBhZGRyKHJkKSxpbW00bTEgICAgbGRjdGwgY3RybCxycyAgICAgICAgICAgbXVsdGwgcnFkLEBAcnMKLWluY2IgYWRkcixpbW00bTEgICAgICAgIGxkY3RsIHJkLGN0cmwgICAgICAgICAgIG11bHRsIHJxZCxhZGRyCi1pbmNiIHJiZCxpbW00bTEgICAgICAgICBsZGQgQEBycyxAQHJkLHJyICAgICAgICAgIG11bHRsIHJxZCxhZGRyKHJzKQotaW5kIEBAcmQsQEBycyxyYSAgICAgICAgICBsZGRiIEBAcnMsQEByZCxyciAgICAgICAgIG11bHRsIHJxZCxpbW0zMgotaW5kYiBAQHJkLEBAcnMscmJhICAgICAgICBsZGRyIEBAcnMsQEByZCxyciAgICAgICAgIG11bHRsIHJxZCxycnMKLWluaWIgQEByZCxAQHJzLHJhICAgICAgICAgbGRkcmIgQEBycyxAQHJkLHJyICAgICAgICBuZWcgQEByZAotaW5pYnIgQEByZCxAQHJzLHJhICAgICAgICBsZGkgQEByZCxAQHJzLHJyICAgICAgICAgIG5lZyBhZGRyCi1pcmV0ICAgICAgICAgICAgICAgICAgICBsZGliIEBAcmQsQEBycyxyciAgICAgICAgIG5lZyBhZGRyKHJkKQotanAgY2MsQEByZCAgICAgICAgICAgICAgIGxkaXIgQEByZCxAQHJzLHJyICAgICAgICAgbmVnIHJkCi1qcCBjYyxhZGRyICAgICAgICAgICAgICBsZGlyYiBAQHJkLEBAcnMscnIgICAgICAgIG5lZ2IgQEByZAotanAgY2MsYWRkcihyZCkgICAgICAgICAgbGRrIHJkLGltbTQgICAgICAgICAgICAgbmVnYiBhZGRyCi1qciBjYyxkaXNwOCAgICAgICAgICAgICBsZGwgQEByZCxycnMgICAgICAgICAgICAgbmVnYiBhZGRyKHJkKQotbGQgQEByZCxpbW0xNiAgICAgICAgICAgIGxkbCBhZGRyKHJkKSxycnMgICAgICAgIG5lZ2IgcmJkCi1sZCBAQHJkLHJzICAgICAgICAgICAgICAgbGRsIGFkZHIscnJzICAgICAgICAgICAgbm9wCi1sZCBhZGRyKHJkKSxpbW0xNiAgICAgICBsZGwgcmQoaW1tMTYpLHJycyAgICAgICBvciByZCxAQHJzCi1sZCBhZGRyKHJkKSxycyAgICAgICAgICBsZGwgcmQocngpLHJycyAgICAgICAgICBvciByZCxhZGRyCi1sZCBhZGRyLGltbTE2ICAgICAgICAgICBsZGwgcnJkLEBAcnMgICAgICAgICAgICAgb3IgcmQsYWRkcihycykKLWxkIGFkZHIscnMgICAgICAgICAgICAgIGxkbCBycmQsYWRkciAgICAgICAgICAgIG9yIHJkLGltbTE2Ci1sZCByZChpbW0xNikscnMgICAgICAgICBsZGwgcnJkLGFkZHIocnMpICAgICAgICBvciByZCxycwotbGQgcmQocngpLHJzICAgICAgICAgICAgbGRsIHJyZCxpbW0zMiAgICAgICAgICAgb3JiIHJiZCxAQHJzCi1sZCByZCxAQHJzICAgICAgICAgICAgICAgbGRsIHJyZCxycnMgICAgICAgICAgICAgb3JiIHJiZCxhZGRyCi1sZCByZCxhZGRyICAgICAgICAgICAgICBsZGwgcnJkLHJzKGltbTE2KSAgICAgICBvcmIgcmJkLGFkZHIocnMpCi1sZCByZCxhZGRyKHJzKSAgICAgICAgICBsZGwgcnJkLHJzKHJ4KSAgICAgICAgICBvcmIgcmJkLGltbTgKLWxkIHJkLGltbTE2ICAgICAgICAgICAgIGxkbSBAQHJkLHJzLG4gICAgICAgICAgICBvcmIgcmJkLHJicwotbGQgcmQscnMgICAgICAgICAgICAgICAgbGRtIGFkZHIocmQpLHJzLG4gICAgICAgb3V0IEBAcmQscnMKLWxkIHJkLHJzKGltbTE2KSAgICAgICAgIGxkbSBhZGRyLHJzLG4gICAgICAgICAgIG91dCBpbW0xNixycwotbGQgcmQscnMocngpICAgICAgICAgICAgbGRtIHJkLEBAcnMsbiAgICAgICAgICAgIG91dGIgQEByZCxyYnMKLWxkYSByZCxhZGRyICAgICAgICAgICAgIGxkbSByZCxhZGRyKHJzKSxuICAgICAgIG91dGIgaW1tMTYscmJzCi1sZGEgcmQsYWRkcihycykgICAgICAgICBsZG0gcmQsYWRkcixuICAgICAgICAgICBvdXRkIEBAcmQsQEBycyxyYQotbGRhIHJkLHJzKGltbTE2KSAgICAgICAgbGRwcyBAQHJzICAgICAgICAgICAgICAgIG91dGRiIEBAcmQsQEBycyxyYmEKLWxkYSByZCxycyhyeCkgICAgICAgICAgIGxkcHMgYWRkciAgICAgICAgICAgICAgIG91dGliIEBAcmQsQEBycyxyYQotbGRhciByZCxkaXNwMTYgICAgICAgICAgbGRwcyBhZGRyKHJzKSAgICAgICAgICAgb3V0aWJyIEBAcmQsQEBycyxyYQotbGRiIEBAcmQsaW1tOCAgICAgICAgICAgIGxkciBkaXNwMTYscnMgICAgICAgICAgIHBvcCBAQHJkLEBAcnMKLWxkYiBAQHJkLHJicyAgICAgICAgICAgICBsZHIgcmQsZGlzcDE2ICAgICAgICAgICBwb3AgYWRkcihyZCksQEBycwotbGRiIGFkZHIocmQpLGltbTggICAgICAgbGRyYiBkaXNwMTYscmJzICAgICAgICAgcG9wIGFkZHIsQEBycwotbGRiIGFkZHIocmQpLHJicyAgICAgICAgbGRyYiByYmQsZGlzcDE2ICAgICAgICAgcG9wIHJkLEBAcnMKLWxkYiBhZGRyLGltbTggICAgICAgICAgIGxkcmwgZGlzcDE2LHJycyAgICAgICAgIHBvcGwgQEByZCxAQHJzCi1sZGIgYWRkcixyYnMgICAgICAgICAgICBsZHJsIHJyZCxkaXNwMTYgICAgICAgICBwb3BsIGFkZHIocmQpLEBAcnMKLWxkYiByYmQsQEBycyAgICAgICAgICAgICBtYml0ICAgICAgICAgICAgICAgICAgICBwb3BsIGFkZHIsQEBycwotbGRiIHJiZCxhZGRyICAgICAgICAgICAgbXJlcSByZCAgICAgICAgICAgICAgICAgcG9wbCBycmQsQEBycwotbGRiIHJiZCxhZGRyKHJzKSAgICAgICAgbXJlcyAgICAgICAgICAgICAgICAgICAgcHVzaCBAQHJkLEBAcnMKLWxkYiByYmQsaW1tOCAgICAgICAgICAgIG1zZXQgICAgICAgICAgICAgICAgICAgIHB1c2ggQEByZCxhZGRyCi1sZGIgcmJkLHJicyAgICAgICAgICAgICBtdWx0IHJyZCxAQHJzICAgICAgICAgICAgcHVzaCBAQHJkLGFkZHIocnMpCi1sZGIgcmJkLHJzKGltbTE2KSAgICAgICBtdWx0IHJyZCxhZGRyICAgICAgICAgICBwdXNoIEBAcmQsaW1tMTYKLXB1c2ggQEByZCxycyAgICAgICAgICAgICBzZXQgYWRkcixpbW00ICAgICAgICAgICBzdWJsIHJyZCxpbW0zMgotcHVzaGwgQEByZCxAQHJzICAgICAgICAgICBzZXQgcmQsaW1tNCAgICAgICAgICAgICBzdWJsIHJyZCxycnMKLXB1c2hsIEBAcmQsYWRkciAgICAgICAgICBzZXQgcmQscnMgICAgICAgICAgICAgICB0Y2MgY2MscmQKLXB1c2hsIEBAcmQsYWRkcihycykgICAgICBzZXRiIEBAcmQsaW1tNCAgICAgICAgICAgdGNjYiBjYyxyYmQKLXB1c2hsIEBAcmQscnJzICAgICAgICAgICBzZXRiIGFkZHIocmQpLGltbTQgICAgICB0ZXN0IEBAcmQKLXJlcyBAQHJkLGltbTQgICAgICAgICAgICBzZXRiIGFkZHIsaW1tNCAgICAgICAgICB0ZXN0IGFkZHIKLXJlcyBhZGRyKHJkKSxpbW00ICAgICAgIHNldGIgcmJkLGltbTQgICAgICAgICAgIHRlc3QgYWRkcihyZCkKLXJlcyBhZGRyLGltbTQgICAgICAgICAgIHNldGIgcmJkLHJzICAgICAgICAgICAgIHRlc3QgcmQKLXJlcyByZCxpbW00ICAgICAgICAgICAgIHNldGZsZyBpbW00ICAgICAgICAgICAgIHRlc3RiIEBAcmQKLXJlcyByZCxycyAgICAgICAgICAgICAgIHNpbmIgcmJkLGltbTE2ICAgICAgICAgIHRlc3RiIGFkZHIKLXJlc2IgQEByZCxpbW00ICAgICAgICAgICBzaW5iIHJkLGltbTE2ICAgICAgICAgICB0ZXN0YiBhZGRyKHJkKQotcmVzYiBhZGRyKHJkKSxpbW00ICAgICAgc2luZCBAQHJkLEBAcnMscmEgICAgICAgICB0ZXN0YiByYmQKLXJlc2IgYWRkcixpbW00ICAgICAgICAgIHNpbmRiIEBAcmQsQEBycyxyYmEgICAgICAgdGVzdGwgQEByZAotcmVzYiByYmQsaW1tNCAgICAgICAgICAgc2luaWIgQEByZCxAQHJzLHJhICAgICAgICB0ZXN0bCBhZGRyCi1yZXNiIHJiZCxycyAgICAgICAgICAgICBzaW5pYnIgQEByZCxAQHJzLHJhICAgICAgIHRlc3RsIGFkZHIocmQpCi1yZXNmbGcgaW1tNCAgICAgICAgICAgICBzbGEgcmQsaW1tOCAgICAgICAgICAgICB0ZXN0bCBycmQKLXJldCBjYyAgICAgICAgICAgICAgICAgIHNsYWIgcmJkLGltbTggICAgICAgICAgIHRyZGIgQEByZCxAQHJzLHJiYQotcmwgcmQsaW1tMW9yMiAgICAgICAgICAgc2xhbCBycmQsaW1tOCAgICAgICAgICAgdHJkcmIgQEByZCxAQHJzLHJiYQotcmxiIHJiZCxpbW0xb3IyICAgICAgICAgc2xsIHJkLGltbTggICAgICAgICAgICAgdHJpYiBAQHJkLEBAcnMscmJyCi1ybGMgcmQsaW1tMW9yMiAgICAgICAgICBzbGxiIHJiZCxpbW04ICAgICAgICAgICB0cmlyYiBAQHJkLEBAcnMscmJyCi1ybGNiIHJiZCxpbW0xb3IyICAgICAgICBzbGxsIHJyZCxpbW04ICAgICAgICAgICB0cnRkcmIgQEByYSxAQHJiLHJicgotcmxkYiByYmIscmJhICAgICAgICAgICAgc291dCBpbW0xNixycyAgICAgICAgICAgdHJ0aWIgQEByYSxAQHJiLHJyCi1yciByZCxpbW0xb3IyICAgICAgICAgICBzb3V0YiBpbW0xNixyYnMgICAgICAgICB0cnRpcmIgQEByYSxAQHJiLHJicgotcnJiIHJiZCxpbW0xb3IyICAgICAgICAgc291dGQgQEByZCxAQHJzLHJhICAgICAgICB0cnRyYiBAQHJhLEBAcmIscmJyCi1ycmMgcmQsaW1tMW9yMiAgICAgICAgICBzb3V0ZGIgQEByZCxAQHJzLHJiYSAgICAgIHRzZXQgQEByZAotcnJjYiByYmQsaW1tMW9yMiAgICAgICAgc291dGliIEBAcmQsQEBycyxyYSAgICAgICB0c2V0IGFkZHIKLXJyZGIgcmJiLHJiYSAgICAgICAgICAgIHNvdXRpYnIgQEByZCxAQHJzLHJhICAgICAgdHNldCBhZGRyKHJkKQotcnN2ZDM2ICAgICAgICAgICAgICAgICAgc3JhIHJkLGltbTggICAgICAgICAgICAgdHNldCByZAotcnN2ZDM4ICAgICAgICAgICAgICAgICAgc3JhYiByYmQsaW1tOCAgICAgICAgICAgdHNldGIgQEByZAotcnN2ZDc4ICAgICAgICAgICAgICAgICAgc3JhbCBycmQsaW1tOCAgICAgICAgICAgdHNldGIgYWRkcgotcnN2ZDdlICAgICAgICAgICAgICAgICAgc3JsIHJkLGltbTggICAgICAgICAgICAgdHNldGIgYWRkcihyZCkKLXJzdmQ5ZCAgICAgICAgICAgICAgICAgIHNybGIgcmJkLGltbTggICAgICAgICAgIHRzZXRiIHJiZAotcnN2ZDlmICAgICAgICAgICAgICAgICAgc3JsbCBycmQsaW1tOCAgICAgICAgICAgeG9yIHJkLEBAcnMKLXJzdmRiOSAgICAgICAgICAgICAgICAgIHN1YiByZCxAQHJzICAgICAgICAgICAgICB4b3IgcmQsYWRkcgotcnN2ZGJmICAgICAgICAgICAgICAgICAgc3ViIHJkLGFkZHIgICAgICAgICAgICAgeG9yIHJkLGFkZHIocnMpCi1zYmMgcmQscnMgICAgICAgICAgICAgICBzdWIgcmQsYWRkcihycykgICAgICAgICB4b3IgcmQsaW1tMTYKLXNiY2IgcmJkLHJicyAgICAgICAgICAgIHN1YiByZCxpbW0xNiAgICAgICAgICAgIHhvciByZCxycwotc2MgaW1tOCAgICAgICAgICAgICAgICAgc3ViIHJkLHJzICAgICAgICAgICAgICAgeG9yYiByYmQsQEBycwotc2RhIHJkLHJzICAgICAgICAgICAgICAgc3ViYiByYmQsQEBycyAgICAgICAgICAgIHhvcmIgcmJkLGFkZHIKLXNkYWIgcmJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLGFkZHIgICAgICAgICAgIHhvcmIgcmJkLGFkZHIocnMpCi1zZGFsIHJyZCxycyAgICAgICAgICAgICBzdWJiIHJiZCxhZGRyKHJzKSAgICAgICB4b3JiIHJiZCxpbW04Ci1zZGwgcmQscnMgICAgICAgICAgICAgICBzdWJiIHJiZCxpbW04ICAgICAgICAgICB4b3JiIHJiZCxyYnMKLXNkbGIgcmJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLHJicyAgICAgICAgICAgIHhvcmIgcmJkLHJicwotc2RsbCBycmQscnMgICAgICAgICAgICAgc3VibCBycmQsQEBycwotc2V0IEBAcmQsaW1tNCAgICAgICAgICAgIHN1YmwgcnJkLGFkZHIKLXNldCBhZGRyKHJkKSxpbW00ICAgICAgIHN1YmwgcnJkLGFkZHIocnMpCi1AZW5kIHNtYWxsZXhhbXBsZQotQGlmdGV4Ci1AZW5kZ3JvdXAKLUBlbmQgaWZ0ZXgKLUBlbmQgaWZzZXQKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9nYXNwLnRleGkgYi9nYXMvZG9jL2dhc3AudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjZDZmNC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2dhc3AudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDEwODYgKzAsMCBAQAotXGlucHV0IHRleGluZm8gICAgICAgICAgICAgICBAYyAgICAgICAgICAgICAtKi0gVGV4aW5mbyAtKi0KLUBzZXRmaWxlbmFtZSBnYXNwLmluZm8KLUBjCi1AYyBUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBhc3NlbWJseSBwcmVwcm9jZXNzb3IgIkdBU1AiCi1AYwotQGMgQ29weXJpZ2h0IChjKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMKLUBjIFRoaXMgdGV4dCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi1AYyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBnYXNwOiAoZ2FzcCkuICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1Ac3luY29kZWluZGV4IGt5IGNwCi1Ac3luY29kZWluZGV4IGZuIGNwCi0KLUBmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIEdBU1AKLUB0aXRsZXBhZ2UKLUBjIEZJWE1FIGJvcmluZyB0aXRsZQotQHRpdGxlIEdBU1AsIGFuIGFzc2VtYmx5IHByZXByb2Nlc3NvcgotQHN1YnRpdGxlIGZvciBHQVNQIHZlcnNpb24gMQotQHNwIDEKLUBzdWJ0aXRsZSBNYXJjaCAxOTk0Ci1AYXV0aG9yIFJvbGFuZCBQZXNjaAotQHBhZ2UKLQotQHRleAote1xwYXJza2lwPTBwdCBcaGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi19Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGEgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLQotQG5vZGUgVG9wCi1AdG9wIEdBU1AKLQotR0FTUCBpcyBhIHByZXByb2Nlc3NvciBmb3IgYXNzZW1ibHkgcHJvZ3JhbXMuCi0KLVRoaXMgZmlsZSBkZXNjcmliZXMgdmVyc2lvbiAxIG9mIEdBU1AuCi0KLVN0ZXZlIENoYW1iZXJsYWluIHdyb3RlIEdBU1A7IFJvbGFuZCBQZXNjaCB3cm90ZSB0aGlzIG1hbnVhbC4KLQotQG1lbnUKLSogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgV2hhdCBpcyBHQVNQPwotKiBJbnZva2luZyBHQVNQOjogICAgICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucy4KLSogQ29tbWFuZHM6OiAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yIGNvbW1hbmRzLgotKiBJbmRleDo6ICAgICAgICAgICAgICAgICAgICAgICBJbmRleC4KLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgT3ZlcnZpZXcKLUBjaGFwdGVyIFdoYXQgaXMgR0FTUD8KLQotVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyIGlzIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YKLW90aGVyIHByb2dyYW1zLS0tbm90YWJseSBjb21waWxlcnMuICBXaGVuIHlvdSBoYXZlIHRvIGhhbmQtY29kZQotc3BlY2lhbGl6ZWQgcm91dGluZXMgaW4gYXNzZW1ibHksIHRoYXQgbWVhbnMgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBpcwotYW4gdW5mcmllbmRseSBwcm9jZXNzb3I6IGl0IGhhcyBubyBkaXJlY3RpdmVzIGZvciBtYWNyb3MsIGNvbmRpdGlvbmFscywKLW9yIG1hbnkgb3RoZXIgY29udmVuaWVuY2VzIHRoYXQgeW91IG1pZ2h0IGV4cGVjdC4KLQotSW4gc29tZSBjYXNlcyB5b3UgY2FuIHNpbXBseSB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yLCBvciBhIGdlbmVyYWxpemVkCi1wcmVwcm9jZXNzb3IgbGlrZSBAc2N7bTR9OyBidXQgdGhpcyBjYW4gYmUgYXdrd2FyZCwgc2luY2Ugbm9uZSBvZiB0aGVzZQotdGhpbmdzIGFyZSBkZXNpZ25lZCB3aXRoIGFzc2VtYmx5IGluIG1pbmQuCi0KLUBzY3tnYXNwfSBmaWxscyB0aGlzIG5lZWQuICBJdCBpcyBleHByZXNzbHkgZGVzaWduZWQgdG8gcHJvdmlkZSB0aGUKLWZhY2lsaXRpZXMgeW91IG5lZWQgd2l0aCBoYW5kLWNvZGVkIGFzc2VtYmx5IGNvZGUuICBJbXBsZW1lbnRpbmcgaXQgYXMgYQotcHJlcHJvY2Vzc29yLCByYXRoZXIgdGhhbiBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIsIGFsbG93cyB0aGUgbWF4aW11bQotZmxleGliaWxpdHk6IHlvdSBjYW4gdXNlIGl0IHdpdGggaGFuZC1jb2RlZCBhc3NlbWJseSwgd2l0aG91dCBwYXlpbmcgYQotcGVuYWx0eSBvZiBhZGRlZCBjb21wbGV4aXR5IGluIHRoZSBhc3NlbWJsZXIgeW91IHVzZSBmb3IgY29tcGlsZXIKLW91dHB1dC4KLQotSGVyZSBpcyBhIHNtYWxsIGV4YW1wbGUgdG8gZ2l2ZSB0aGUgZmxhdm9yIG9mIEBzY3tnYXNwfS4gIFRoaXMgaW5wdXQgdG8KLUBzY3tnYXNwfQotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAuTUFDUk8gIHNhdmVyZWdzIGZyb209OCB0bz0xNAotY291bnQgICAuQVNTSUdOQSBcZnJvbQotICAgICAgICAhIHNhdmUgclxmcm9tLi5yXHRvCi0gICAgICAgIC5BV0hJTEUgIFwmY291bnQgTEUgXHRvCi0gICAgICAgIG1vdiAgICAgclwmY291bnQsQEAtc3AKLWNvdW50ICAgLkFTU0lHTkEgIFwmY291bnQgKyAxCi0gICAgICAgIC5BRU5EVwotICAgICAgICAuRU5ETQotCi0gICAgICAgIHNhdmVyZWdzIGZyb209MTIKLQotYmFyOiAgICBtb3YgICAgICNIJ2RlYWQrMTAscjAKLWZvbyAgICAgLlNEQVRBQyAiaGVsbG8iPDEwPgotICAgICAgICAuRU5ECi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBub2luZGVudAotZ2VuZXJhdGVzIHRoaXMgYXNzZW1ibHkgcHJvZ3JhbToKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgISBzYXZlIHIxMi4ucjE0Ci0gICAgICAgIG1vdiAgICAgcjEyLEBALXNwCi0gICAgICAgIG1vdiAgICAgcjEzLEBALXNwCi0gICAgICAgIG1vdiAgICAgcjE0LEBALXNwCi0KLWJhcjogICAgbW92ICAgICAjNTcwMDUrMTAscjAKLWZvbzogICAgLmJ5dGUgICA2LDEwNCwxMDEsMTA4LDEwOCwxMTEsMTAKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQG5vZGUgSW52b2tpbmcgR0FTUAotQGNoYXB0ZXIgQ29tbWFuZCBMaW5lIE9wdGlvbnMKLQotQGMgRklYTUUhICBPciBpcyB0aGVyZSBhIHNpbXBsZXIgd2F5LCBjYWxsaW5nIGZyb20gR0FTIG9wdGlvbj8KLVRoZSBzaW1wbGVzdCB3YXkgdG8gdXNlIEBzY3tnYXNwfSBpcyB0byBydW4gaXQgYXMgYSBmaWx0ZXIgYW5kIGFzc2VtYmxlCi1pdHMgb3V0cHV0LiAgSW4gVW5peCBhbmQgaXRzIGlsaywgeW91IGNhbiBkbyB0aGlzLCBmb3IgZXhhbXBsZToKLQotQGMgRklYTUUhIEdBU1AgZmlsZW5hbWUgc3VmZml4IGNvbnZlbnRpb24/Ci1AZXhhbXBsZQotJCBnYXNwIHByb2cuYXNtIHwgYXMgLW8gcHJvZy5vCi1AZW5kIGV4YW1wbGUKLQotTmF0dXJhbGx5LCB0aGVyZSBhcmUgYWxzbyBhIGZldyBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhbGxvdyB5b3UgdG8KLXJlcXVlc3QgdmFyaWF0aW9ucyBvbiB0aGlzIGJhc2ljIHRoZW1lLiAgSGVyZSBpcyB0aGUgZnVsbCBzZXQgb2YKLXBvc3NpYmlsaXRpZXMgZm9yIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lLgotCi1AZXhhbXBsZQotZ2FzcCAgWyAtYSB8IC0tYWx0ZXJuYXRlIF0KLSAgICAgIFsgLWMgQHZhcntjaGFyfSB8IC0tY29tbWVudGNoYXIgQHZhcntjaGFyfSBdCi0gICAgICBbIC1kIHwgLS1kZWJ1ZyBdICBbIC1oIHwgLS1oZWxwIF0gWyAtTSB8IC0tbXJpIF0KLSAgICAgIFsgLW8gQHZhcntvdXRmaWxlfSB8IC0tb3V0cHV0IEB2YXJ7b3V0ZmlsZX0gXQotICAgICAgWyAtcCB8IC0tcHJpbnQgXSAgWyAtcyB8IC0tY29weXNvdXJjZSBdCi0gICAgICBbIC11IHwgLS11bnJlYXNvbmFibGUgXSAgWyAtdiB8IC0tdmVyc2lvbiBdCi0gICAgICBAdmFye2luZmlsZX0gQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7aW5maWxlfSBAZG90c3t9Ci1AYyBGSVhNRSEgV2h5IG5vdCBzdGRpbiBhcyBkZWZhdWx0IGluZmlsZT8KLVRoZSBpbnB1dCBmaWxlIG5hbWVzLiAgWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsZTsgaWYgeW91Ci1zcGVjaWZ5IG1vcmUsIEBzY3tnYXNwfSBwcmVwcm9jZXNzZXMgdGhlbSBhbGwsIGNvbmNhdGVuYXRpbmcgdGhlIG91dHB1dAotaW4gdGhlIG9yZGVyIHlvdSBsaXN0IHRoZSBAdmFye2luZmlsZX0gYXJndW1lbnRzLgotCi1NYXJrIHRoZSBlbmQgb2YgZWFjaCBpbnB1dCBmaWxlIHdpdGggdGhlIHByZXByb2Nlc3NvciBjb21tYW5kCi1AY29kZXsuRU5EfS4gIEB4cmVme090aGVyIENvbW1hbmRzLCwgTWlzY2VsbGFuZW91cyBjb21tYW5kc30uCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1hbHRlcm5hdGUKLVVzZSBhbHRlcm5hdGl2ZSBtYWNybyBzeW50YXguICBAeHJlZntBbHRlcm5hdGUsLCBBbHRlcm5hdGUgbWFjcm8KLXN5bnRheH0sIGZvciBhIGRpc2N1c3Npb24gb2YgaG93IHRoaXMgc3ludGF4IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdAotQHNje2dhc3B9IHN5bnRheC4KLQotQGNpbmRleCBjb21tZW50IGNoYXJhY3RlciwgY2hhbmdpbmcKLUBjaW5kZXggc2VtaWNvbG9uLCBhcyBjb21tZW50Ci1AY2luZGV4IGV4Y2xhbWF0aW9uIG1hcmssIGFzIGNvbW1lbnQKLUBjaW5kZXggc2hyaWVrLCBhcyBjb21tZW50Ci1AY2luZGV4IGJhbmcsIGFzIGNvbW1lbnQKLUBjaW5kZXggQGNvZGV7IX0gZGVmYXVsdCBjb21tZW50IGNoYXIKLUBjaW5kZXggQGNvZGV7O30gYXMgY29tbWVudCBjaGFyCi1AaXRlbSAtYyAnQHZhcntjaGFyfScKLUBpdGVteCAtLWNvbW1lbnRjaGFyICdAdmFye2NoYXJ9JwotVXNlIEB2YXJ7Y2hhcn0gYXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLiAgVGhlIGRlZmF1bHQgY29tbWVudCBjaGFyYWN0ZXIKLWlzIEBzYW1weyF9LiAgRm9yIGV4YW1wbGUsIHRvIHVzZSBhIHNlbWljb2xvbiBhcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIsCi1zcGVjaWZ5IEB3e0BzYW1wey1jICc7J319IG9uIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lLiAgU2luY2UKLWFzc2VtYmxlciBjb21tYW5kIGNoYXJhY3RlcnMgb2Z0ZW4gaGF2ZSBzcGVjaWFsIHNpZ25pZmljYW5jZSB0byBjb21tYW5kCi1zaGVsbHMsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIHF1b3RlIG9yIGVzY2FwZSBAdmFye2NoYXJ9IHdoZW4geW91IHNwZWNpZnkKLWEgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCBhbGwgZXhhbXBsZXMgaW4gdGhpcyBtYW51YWwgdXNlIHRoZSBkZWZhdWx0Ci1jb21tZW50IGNoYXJhY3RlciBAc2FtcHshfS4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWRlYnVnCi1TaG93IGRlYnVnZ2luZyBzdGF0aXN0aWNzLiAgSW4gdGhpcyB2ZXJzaW9uIG9mIEBzY3tnYXNwfSwgdGhpcyBvcHRpb24KLXByb2R1Y2VzIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHN0cmluZyBidWZmZXJzIHRoYXQgQHNje2dhc3B9IGFsbG9jYXRlcwotaW50ZXJuYWxseS4gIEZvciBlYWNoIGRlZmluZWQgYnVmZmVyc2l6ZSBAdmFye3N9LCBAc2N7Z2FzcH0gc2hvd3MgdGhlCi1udW1iZXIgb2Ygc3RyaW5ncyBAdmFye259IHRoYXQgaXQgYWxsb2NhdGVkLCB3aXRoIGEgbGluZSBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1zdHJpbmdzIHNpemUgQHZhcntzfSA6IEB2YXJ7bn0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUBzY3tnYXNwfSBkaXNwbGF5cyB0aGVzZSBzdGF0aXN0aWNzIG9uIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0sIHdoZW4KLWRvbmUgcHJlcHJvY2Vzc2luZy4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWhlbHAKLURpc3BsYXkgYSBzdW1tYXJ5IG9mIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLUBpdGVtIC1NCi1AaXRlbXggLS1tcmkKLVVzZSBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLiAgVXNpbmcgdGhpcyBvcHRpb24gY2F1c2VzIEBzY3tnYXNwfSB0bwotYWNjZXB0IHRoZSBzeW50YXggYW5kIHBzZXVkby1vcHMgdXNlZCBieSB0aGUgTWljcm90ZWMgUmVzZWFyY2gKLUBjb2Rle0FTTTY4S30gYXNzZW1ibGVyLgotCi1AaXRlbSAtbyBAdmFye291dGZpbGV9Ci1AaXRlbXggLS1vdXRwdXQgQHZhcntvdXRmaWxlfQotV3JpdGUgdGhlIG91dHB1dCBpbiBhIGZpbGUgY2FsbGVkIEB2YXJ7b3V0ZmlsZX0uICBJZiB5b3UgZG8gbm90IHVzZSB0aGUKLUBzYW1wey1vfSBvcHRpb24sIEBzY3tnYXNwfSB3cml0ZXMgaXRzIG91dHB1dCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0Ci1zdHJlYW0uCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmludAotUHJpbnQgbGluZSBudW1iZXJzLiAgQHNje2dhc3B9IG9iZXlzIHRoaXMgb3B0aW9uIEBlbXBoe29ubHl9IGlmIHlvdSBhbHNvCi1zcGVjaWZ5IEBzYW1wey1zfSB0byBjb3B5IHNvdXJjZSBsaW5lcyB0byBpdHMgb3V0cHV0LiAgV2l0aCBAc2FtcHstcwotLXB9LCBAc2N7Z2FzcH0gZGlzcGxheXMgdGhlIGxpbmUgbnVtYmVyIG9mIGVhY2ggc291cmNlIGxpbmUgY29waWVkCi0oaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUpLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tY29weXNvdXJjZQotQ29weSB0aGUgc291cmNlIGxpbmVzIHRvIHRoZSBvdXRwdXQgZmlsZS4gIFVzZSB0aGlzIG9wdGlvbgotdG8gc2VlIHRoZSBlZmZlY3Qgb2YgZWFjaCBwcmVwcm9jZXNzb3IgbGluZSBvbiB0aGUgQHNje2dhc3B9IG91dHB1dC4KLUBzY3tnYXNwfSBwbGFjZXMgYSBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7IX0gYnkgZGVmYXVsdCkgYXQKLXRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzb3VyY2UgbGluZSBpdCBjb3BpZXMsIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcwotb3B0aW9uIGFuZCBzdGlsbCBhc3NlbWJsZSB0aGUgcmVzdWx0LgotCi1AaXRlbSAtdQotQGl0ZW14IC0tdW5yZWFzb25hYmxlCi1CeXBhc3MgYGB1bnJlYXNvbmFibGUgZXhwYW5zaW9uJycgbGltaXQuICBTaW5jZSB5b3UgY2FuIGRlZmluZSBAc2N7Z2FzcH0KLW1hY3JvcyBpbnNpZGUgb3RoZXIgbWFjcm8gZGVmaW5pdGlvbnMsIHRoZSBwcmVwcm9jZXNzb3Igbm9ybWFsbHkKLWluY2x1ZGVzIGEgc2FuaXR5IGNoZWNrLiAgSWYgeW91ciBwcm9ncmFtIHJlcXVpcmVzIG1vcmUgdGhhbiAxLDAwMAotbmVzdGVkIGV4cGFuc2lvbnMsIEBzY3tnYXNwfSBub3JtYWxseSBleGl0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBVc2UKLXRoaXMgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoaXMgY2hlY2ssIGFsbG93aW5nIHVubGltaXRlZCBuZXN0ZWQKLWV4cGFuc2lvbnMuCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5IHRoZSBAc2N7Z2FzcH0gdmVyc2lvbiBudW1iZXIuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBDb21tYW5kcwotQGNoYXB0ZXIgUHJlcHJvY2Vzc29yIENvbW1hbmRzCi0KLUBzY3tnYXNwfSBjb21tYW5kcyBoYXZlIGEgc3RyYWlnaHRmb3J3YXJkIHN5bnRheCB0aGF0IGZpdHMgaW4gd2VsbCB3aXRoCi1hc3NlbWJseSBjb252ZW50aW9ucy4gIEluIGdlbmVyYWwsIGEgY29tbWFuZCBleHRlbmRzIGZvciBhIGxpbmUsIGFuZCBtYXkKLWhhdmUgdXAgdG8gdGhyZWUgZmllbGRzOiBhbiBvcHRpb25hbCBsYWJlbCwgdGhlIGNvbW1hbmQgaXRzZWxmLCBhbmQKLW9wdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgY29tbWFuZC4gIFlvdSBjYW4gd3JpdGUgY29tbWFuZHMgaW4gdXBwZXIgb3IKLWxvd2VyIGNhc2UsIHRob3VnaCB0aGlzIG1hbnVhbCBzaG93cyB0aGVtIGluIHVwcGVyIGNhc2UuICBAeHJlZntTeW50YXgKLURldGFpbHMsLCBEZXRhaWxzIG9mIHRoZSBHQVNQIHN5bnRheH0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AbWVudQotKiBDb25kaXRpb25hbHM6OgotKiBMb29wczo6Ci0qIFZhcmlhYmxlczo6Ci0qIE1hY3Jvczo6Ci0qIERhdGE6OgotKiBMaXN0aW5nczo6Ci0qIE90aGVyIENvbW1hbmRzOjoKLSogU3ludGF4IERldGFpbHM6OgotKiBBbHRlcm5hdGU6OgotQGVuZCBtZW51Ci0KLUBub2RlIENvbmRpdGlvbmFscwotQHNlY3Rpb24gQ29uZGl0aW9uYWwgYXNzZW1ibHkKLQotVGhlIGNvbmRpdGlvbmFsLWFzc2VtYmx5IGRpcmVjdGl2ZXMgYWxsb3cgeW91IHRvIGluY2x1ZGUgb3IgZXhjbHVkZQotcG9ydGlvbnMgb2YgYW4gYXNzZW1ibHkgZGVwZW5kaW5nIG9uIGhvdyBhIHBhaXIgb2YgZXhwcmVzc2lvbnMsIG9yIGEKLXBhaXIgb2Ygc3RyaW5ncywgY29tcGFyZS4KLQotVGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGNvbmRpdGlvbmFscyBpcyBmYW1pbGlhciBmcm9tIG1hbnkgb3RoZXIKLWNvbnRleHRzLiAgQGNvZGV7LkFJRn0gbWFya3MgdGhlIHN0YXJ0IG9mIGEgY29uZGl0aW9uYWwsIGFuZCBwcmVjZWRlcwotYXNzZW1ibHkgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlLiAgIEFuIG9wdGlvbmFsCi1AY29kZXsuQUVMU0V9IHByZWNlZGVzIGFzc2VtYmx5IGZvciB0aGUgY29udmVyc2UgY2FzZSwgYW5kIGFuCi1AY29kZXsuQUVOREl9IG1hcmtzIHRoZSBlbmQgb2YgdGhlIGNvbmRpdGlvbi4KLQotQGMgRklYTUUhIFdoeSBkb2Vzbid0IC11IHR1cm4gb2ZmIHRoaXMgY2hlY2s/Ci1Zb3UgbWF5IG5lc3QgY29uZGl0aW9uYWxzIHVwIHRvIGEgZGVwdGggb2YgMTAwOyBAc2N7Z2FzcH0gcmVqZWN0cwotbmVzdGluZyBiZXlvbmQgdGhhdCwgYmVjYXVzZSBpdCBtYXkgaW5kaWNhdGUgYSBidWcgaW4geW91ciBtYWNybwotc3RydWN0dXJlLgotCi1AYyBGSVhNRSEgV2h5IGlzbid0IHRoZXJlIHNvbWV0aGluZyBsaWtlIGNwcCdzIC1EIG9wdGlvbj8gIENvbmRpdGlvbmFscwotQGMgICAgICAgIHdvdWxkIGJlIG11Y2ggbW9yZSB1c2VmdWwgaWYgdGhlcmUgd2VyZS4KLUNvbmRpdGlvbmFscyBhcmUgcHJpbWFyaWx5IHVzZWZ1bCBpbnNpZGUgbWFjcm8gZGVmaW5pdGlvbnMsIHdoZXJlIHlvdQotb2Z0ZW4gbmVlZCBkaWZmZXJlbnQgZWZmZWN0cyBkZXBlbmRpbmcgb24gYXJndW1lbnQgdmFsdWVzLgotQHhyZWZ7TWFjcm9zLCwgRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30sIGZvciBkZXRhaWxzIGFib3V0IGRlZmluaW5nCi1tYWNyb3MuCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5BSUYgQHZhcntleHByYX0gQHZhcntjbXB9IEB2YXJ7ZXhwcmJ9Ci1AaXRlbXggLkFJRiAiQHZhcntzdHJhfSIgQHZhcntjbXB9ICJAdmFye3N0cmJ9IgotCi1UaGUgZ292ZXJuaW5nIGNvbmRpdGlvbiBnb2VzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIEBjb2Rley5BSUZ9Ci1wcmVwcm9jZXNzb3IgY29tbWFuZC4gIFlvdSBtYXkgY29tcGFyZSBlaXRoZXIgdHdvIHN0cmluZ3MsIG9yIHR3bwotZXhwcmVzc2lvbnMuCi0KLVdoZW4geW91IGNvbXBhcmUgc3RyaW5ncywgb25seSB0d28gY29uZGl0aW9uYWwgQHZhcntjbXB9IGNvbXBhcmlzb24KLW9wZXJhdG9ycyBhcmUgYXZhaWxhYmxlOiBAc2FtcHtFUX0gKHRydWUgaWYgQHZhcntzdHJhfSBhbmQgQHZhcntzdHJifQotYXJlIGlkZW50aWNhbCksIGFuZCBAc2FtcHtORX0gKHRoZSBvcHBvc2l0ZSkuCi0KLVdoZW4geW91IGNvbXBhcmUgdHdvIGV4cHJlc3Npb25zLCBAZW1waHtib3RoIGV4cHJlc3Npb25zIG11c3QgYmUKLWFic29sdXRlfSAoQHB4cmVme0V4cHJlc3Npb25zLCwgQXJpdGhtZXRpYyBleHByZXNzaW9ucyBpbiBHQVNQfSkuICBZb3UKLWNhbiB1c2UgdGhlc2UgQHZhcntjbXB9IGNvbXBhcmlzb24gb3BlcmF0b3JzIHdpdGggZXhwcmVzc2lvbnM6Ci0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEVRCi1BcmUgQHZhcntleHByYX0gYW5kIEB2YXJ7ZXhwcmJ9IGVxdWFsPyAgKEZvciBzdHJpbmdzLCBhcmUgQHZhcntzdHJhfSBhbmQKLUB2YXJ7c3RyYn0gaWRlbnRpY2FsPykKLQotQGl0ZW0gTkUKLUFyZSBAdmFye2V4cHJhfSBhbmQgQHZhcntleHByYn0gZGlmZmVyZW50PyAgKEZvciBzdHJpbmdzLCBhcmUgQHZhcntzdHJhfQotYW5kIEB2YXJ7c3RyYn0gZGlmZmVyZW50PwotCi1AaXRlbSBMVAotSXMgQHZhcntleHByYX0gbGVzcyB0aGFuIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvciBzdHJpbmdzLikKLQotQGl0ZW0gTEUKLUlzIEB2YXJ7ZXhwcmF9IGxlc3MgdGhhbiBvciBlcXVhbCB0byBAdmFye2V4cHJifT8gIChOb3QgYWxsb3dlZCBmb3Igc3RyaW5ncy4pCi0KLUBpdGVtIEdUCi1JcyBAdmFye2V4cHJhfSBncmVhdGVyIHRoYW4gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yIHN0cmluZ3MuKQotCi1AaXRlbSBHRQotSXMgQHZhcntleHByYX0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvcgotc3RyaW5ncy4pCi1AZW5kIGZ0YWJsZQotCi1AaXRlbSAuQUVMU0UKLU1hcmtzIHRoZSBzdGFydCBvZiBhc3NlbWJseSBjb2RlIHRvIGJlIGluY2x1ZGVkIGlmIHRoZSBjb25kaXRpb24gZmFpbHMuCi1PcHRpb25hbCwgYW5kIG9ubHkgYWxsb3dlZCB3aXRoaW4gYSBjb25kaXRpb25hbCAoYmV0d2VlbiBAY29kZXsuQUlGfSBhbmQKLUBjb2Rley5BRU5ESX0pLgotCi1AaXRlbSAuQUVOREkKLU1hcmtzIHRoZSBlbmQgb2YgYSBjb25kaXRpb25hbCBhc3NlbWJseS4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIExvb3BzCi1Ac2VjdGlvbiBSZXBldGl0aXZlIHNlY3Rpb25zIG9mIGFzc2VtYmx5Ci0KLVR3byBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBhbGxvdyB5b3UgdG8gcmVwZWF0ZWRseSBpc3N1ZSBjb3BpZXMgb2YgdGhlCi1zYW1lIGJsb2NrIG9mIGFzc2VtYmx5IGNvZGUuCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5BUkVQRUFUIEB2YXJ7YWV4cH0KLUBpdGVteCAuQUVORFIKLUlmIHlvdSBzaW1wbHkgbmVlZCB0byByZXBlYXQgdGhlIHNhbWUgYmxvY2sgb2YgYXNzZW1ibHkgb3ZlciBhbmQgb3ZlciBhCi1maXhlZCBudW1iZXIgb2YgdGltZXMsIHNhbmR3aWNoIG9uZSBpbnN0YW5jZSBvZiB0aGUgcmVwZWF0ZWQgYmxvY2sKLWJldHdlZW4gQGNvZGV7LkFSRVBFQVR9IGFuZCBAY29kZXsuQUVORFJ9LiAgU3BlY2lmeSB0aGUgbnVtYmVyIG9mCi1jb3BpZXMgYXMgQHZhcnthZXhwfSAod2hpY2ggbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uKS4gIEZvcgotZXhhbXBsZSwgdGhpcyByZXBlYXRzIHR3byBhc3NlbWJseSBzdGF0ZW1lbnRzIHRocmVlIHRpbWVzIGluIHN1Y2Nlc3Npb246Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi0gICAgICAgIC5BUkVQRUFUICAgICAgICAzCi0gICAgICAgIHJvdGNsICAgcjIKLSAgICAgICAgZGl2MSAgICByMCxyMQotICAgICAgICAuQUVORFIKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQGl0ZW0gLkFXSElMRSBAdmFye2V4cHJhfSBAdmFye2NtcH0gQHZhcntleHByYn0KLUBpdGVteCAuQUVORFcKLUBpdGVteCAuQVdISUxFIEB2YXJ7c3RyYX0gQHZhcntjbXB9IEB2YXJ7c3RyYn0KLUBpdGVteCAuQUVORFcKLVRvIHJlcGVhdCBhIGJsb2NrIG9mIGFzc2VtYmx5IGRlcGVuZGluZyBvbiBhIGNvbmRpdGlvbmFsIHRlc3QsIHJhdGhlcgotdGhhbiByZXBlYXRpbmcgaXQgZm9yIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHRpbWVzLCB1c2UgQGNvZGV7LkFXSElMRX0uCi1AY29kZXsuQUVORFd9IG1hcmtzIHRoZSBlbmQgb2YgdGhlIHJlcGVhdGVkIGJsb2NrLiAgVGhlIGNvbmRpdGlvbmFsCi1jb21wYXJpc29uIHdvcmtzIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGZvciBAY29kZXsuQUlGfSwgd2l0aCB0aGUgc2FtZQotY29tcGFyaXNvbiBvcGVyYXRvcnMgKEBweHJlZntDb25kaXRpb25hbHMsLCBDb25kaXRpb25hbCBhc3NlbWJseX0pLgotCi1TaW5jZSB0aGUgdGVybXMgb2YgdGhlIGNvbXBhcmlzb24gbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9uLAotQGNvZGV7LkFXSElMRX0gaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aXRoaW4gbWFjcm9zLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgotQGVuZCBmdGFibGUKLQotQGNpbmRleCBsb29wcywgYnJlYWtpbmcgb3V0IG9mCi1AY2luZGV4IGJyZWFraW5nIG91dCBvZiBsb29wcwotWW91IGNhbiB1c2UgdGhlIEBjb2Rley5FWElUTX0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSB0byBicmVhayBvdXQgb2YKLWxvb3BzIGVhcmx5IChhcyB3ZWxsIGFzIHRvIGJyZWFrIG91dCBvZiBtYWNyb3MpLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgotCi1Abm9kZSBWYXJpYWJsZXMKLUBzZWN0aW9uIFByZXByb2Nlc3NvciB2YXJpYWJsZXMKLQotWW91IGNhbiB1c2UgdmFyaWFibGVzIGluIEBzY3tnYXNwfSB0byByZXByZXNlbnQgc3RyaW5ncywgcmVnaXN0ZXJzLCBvcgotdGhlIHJlc3VsdHMgb2YgZXhwcmVzc2lvbnMuCi0KLVlvdSBtdXN0IGRpc3Rpbmd1aXNoIHR3byBraW5kcyBvZiB2YXJpYWJsZXM6IAotQGVudW1lcmF0ZQotQGl0ZW0KLVZhcmlhYmxlcyBkZWZpbmVkIHdpdGggQGNvZGV7LkVRVX0gb3IgQGNvZGV7LkFTU0lHTn0uICBUbyBldmFsdWF0ZSB0aGlzCi1raW5kIG9mIHZhcmlhYmxlIGluIHlvdXIgYXNzZW1ibHkgb3V0cHV0LCBzaW1wbHkgbWVudGlvbiBpdHMgbmFtZS4gIEZvcgotZXhhbXBsZSwgdGhlc2UgdHdvIGxpbmVzIGRlZmluZSBhbmQgdXNlIGEgdmFyaWFibGUgQHNhbXB7ZWd9OgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotZWcgICAgIC5FUVUgICBGTElQLTY0Ci0gICAgICAgQGRvdHN7fQotICAgICAgIG1vdi5sICBlZyxyMAotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1AZW1waHtEbyBub3QgdXNlfSB0aGlzIGtpbmQgb2YgdmFyaWFibGUgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgb3IKLXdoaWxlIGxvb3BzOyBAc2N7Z2FzcH0gb25seSBldmFsdWF0ZXMgdGhlc2UgdmFyaWFibGVzIHdoZW4gd3JpdGluZwotYXNzZW1ibHkgb3V0cHV0LgotCi1AaXRlbQotVmFyaWFibGVzIGZvciB1c2UgZHVyaW5nIHByZXByb2Nlc3NpbmcuICBZb3UgY2FuIGRlZmluZSB0aGVzZQotd2l0aCBAY29kZXsuQVNTSUdOQ30gb3IgQGNvZGV7LkFTU0lHTkF9LiAgVG8gZXZhbHVhdGUgdGhpcwota2luZCBvZiB2YXJpYWJsZSwgd3JpdGUgQHNhbXB7XCZ9IGJlZm9yZSB0aGUgdmFyaWFibGUgbmFtZTsgZm9yIGV4YW1wbGUsCi0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi1vcGNpdCAgLkFTU0lHTkEgIDQ3Ci0gICAgICAgQGRvdHN7fQotICAgICAgIC5BV0hJTEUgIFwmb3BjaXQgR1QgMAotICAgICAgIEBkb3Rze30KLSAgICAgICAuQUVORFcKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQHNje2dhc3B9IHRyZWF0cyBtYWNybyBhcmd1bWVudHMgYWxtb3N0IHRoZSBzYW1lIHdheSwgYnV0IHRvIGV2YWx1YXRlCi10aGVtIHlvdSB1c2UgdGhlIHByZWZpeCBAc2FtcHtcfSByYXRoZXIgdGhhbiBAc2FtcHtcJn0uCi1AeHJlZntNYWNyb3MsLCBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfS4KLUBlbmQgZW51bWVyYXRlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7cHZhcn0gLkVRVSBAdmFye2V4cHJ9Ci1AYyBGSVhNRSEgIEFueXRoaW5nIHRvIGJld2FyZSBvZiByZSBHQVMgZGlyZWN0aXZlIG9mIHNhbWUgbmFtZT8KLUFzc2lnbiBwcmVwcm9jZXNzb3IgdmFyaWFibGUgQHZhcntwdmFyfSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KLUB2YXJ7ZXhwcn0uICBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHJlZGVmaW5pdGlvbjsgdXNlIEBzYW1wey5FUVV9Ci13aXRoIHRoZSBzYW1lIEB2YXJ7cHZhcn0gYXMgb2Z0ZW4gYXMgeW91IGZpbmQgaXQgY29udmVuaWVudC4KLQotQGl0ZW0gQHZhcntwdmFyfSAuQVNTSUdOIEB2YXJ7ZXhwcn0KLUFsbW9zdCB0aGUgc2FtZSBhcyBAY29kZXsuRVFVfSwgc2F2ZSB0aGF0IHlvdSBtYXkgbm90IHJlZGVmaW5lCi1AdmFye3B2YXJ9IHVzaW5nIEBjb2Rley5BU1NJR059IG9uY2UgaXQgaGFzIGEgdmFsdWUuCi1AYyBGSVhNRSEhICBTdXBwb3NlZCB0byB3b3JrIHRoaXMgd2F5LCBhcHBhcmVudGx5LCBidXQgb24gOWZlYjk0IHdvcmtzCi1AYyAgICAgICAgICBqdXN0IGxpa2UgLkVRVQotCi1AaXRlbSBAdmFye3B2YXJ9IC5BU1NJR05BIEB2YXJ7YWV4cHJ9Ci1EZWZpbmUgYSB2YXJpYWJsZSB3aXRoIGEgbnVtZXJpYyB2YWx1ZSwgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KLUB2YXJ7YWV4cHJ9IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFlvdSBjYW4gcmVkZWZpbmUgdmFyaWFibGVzCi13aXRoIEBjb2Rley5BU1NJR05BfSBhdCBhbnkgdGltZS4KLQotQGl0ZW0gQHZhcntwdmFyfSAuQVNTSUdOQyAiQHZhcntzdHJ9IgotRGVmaW5lIGEgdmFyaWFibGUgd2l0aCBhIHN0cmluZyB2YWx1ZSwgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KLVlvdSBjYW4gcmVkZWZpbmUgdmFyaWFibGVzIHdpdGggQGNvZGV7LkFTU0lHTkN9IGF0IGFueSB0aW1lLgotCi1AaXRlbSBAdmFye3B2YXJ9IC5SRUcgKEB2YXJ7cmVnaXN0ZXJ9KQotVXNlIEBjb2Rley5SRUd9IHRvIGRlZmluZSBhIHZhcmlhYmxlIHRoYXQgcmVwcmVzZW50cyBhIHJlZ2lzdGVyLiAgSW4KLXBhcnRpY3VsYXIsIEB2YXJ7cmVnaXN0ZXJ9IGlzIEBlbXBoe25vdCBldmFsdWF0ZWR9IGFzIGFuIGV4cHJlc3Npb24uCi1Zb3UgbWF5IHVzZSBAY29kZXsuUkVHfSBhdCB3aWxsIHRvIHJlZGVmaW5lIHJlZ2lzdGVyIHZhcmlhYmxlcy4KLUBlbmQgZnRhYmxlCi0KLUFsbCB0aGVzZSBkaXJlY3RpdmVzIGFjY2VwdCB0aGUgdmFyaWFibGUgbmFtZSBpbiB0aGUgYGBsYWJlbCcnIHBvc2l0aW9uLAotdGhhdCBpcyBhdCB0aGUgbGVmdCBtYXJnaW4uICBZb3UgbWF5IHNwZWNpZnkgYSBjb2xvbiBhZnRlciB0aGUgdmFyaWFibGUKLW5hbWUgaWYgeW91IHdpc2g7IHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlIGNvdWxkIGhhdmUgc3RhcnRlZCBAc2FtcHtlZzp9Ci13aXRoIHRoZSBzYW1lIGVmZmVjdC4KLQotQGMgcGFnZWJyZWFrIG1ha2VzIGZvciBiZXR0ZXIgYWVzdGhldGljcy0tLWVuc3VyZXMgbWFjcm8gYW5kIGV4cGFuc2lvbiB0b2dldGhlcgotQHBhZ2UKLUBub2RlIE1hY3JvcwotQHNlY3Rpb24gRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlcwotCi1UaGUgY29tbWFuZHMgQGNvZGV7Lk1BQ1JPfSBhbmQgQGNvZGV7LkVORE19IGFsbG93IHlvdSB0byBkZWZpbmUgbWFjcm9zCi10aGF0IGdlbmVyYXRlIGFzc2VtYmx5IG91dHB1dC4gIFlvdSBjYW4gdXNlIHRoZXNlIG1hY3JvcyB3aXRoIGEgc3ludGF4Ci1zaW1pbGFyIHRvIGJ1aWx0LWluIEBzY3tnYXNwfSBvciBhc3NlbWJsZXIgZGlyZWN0aXZlcy4gIEZvciBleGFtcGxlLAotdGhpcyBkZWZpbml0aW9uIHNwZWNpZmllcyBhIG1hY3JvIEBjb2Rle1NVTX0gdGhhdCBhZGRzIHRvZ2V0aGVyIGEgcmFuZ2Ugb2YKLWNvbnNlY3V0aXZlIHJlZ2lzdGVyczoKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgLk1BQ1JPICBTVU0gRlJPTT0wLCBUTz05Ci0gICAgICAgICEgXEZST00gXFRPCi0gICAgICAgIG1vdiAgICAgclxGUk9NLHIxMAotQ09VTlQgICAuQVNTSUdOQSAgICAgICAgXEZST00rMQotICAgICAgICAuQVdISUxFIFwmQ09VTlQgTEUgXFRPCi0gICAgICAgIGFkZCAgICAgclwmQ09VTlQscjEwCi1DT1VOVCAgIC5BU1NJR05BICAgICAgICBcJkNPVU5UKzEKLSAgICAgICAgLkFFTkRXCi0gICAgICAgIC5FTkRNCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBub2luZGVudAotV2l0aCB0aGF0IGRlZmluaXRpb24sIEBzYW1we1NVTSAwLDV9IGdlbmVyYXRlcyB0aGlzIGFzc2VtYmx5IG91dHB1dDoKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgISAwIDUKLSAgICAgICAgbW92ICAgICByMCxyMTAKLSAgICAgICAgYWRkICAgICByMSxyMTAKLSAgICAgICAgYWRkICAgICByMixyMTAKLSAgICAgICAgYWRkICAgICByMyxyMTAKLSAgICAgICAgYWRkICAgICByNCxyMTAKLSAgICAgICAgYWRkICAgICByNSxyMTAKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLk1BQ1JPIEB2YXJ7bWFjbmFtZX0KLUBpdGVteCAuTUFDUk8gQHZhcnttYWNuYW1lfSBAdmFye21hY2FyZ3N9IEBkb3Rze30KLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEB2YXJ7bWFjbmFtZX0uICBJZiB5b3VyIG1hY3JvCi1kZWZpbml0aW9uIHJlcXVpcmVzIGFyZ3VtZW50cywgc3BlY2lmeSB0aGVpciBuYW1lcyBhZnRlciB0aGUgbWFjcm8gbmFtZSwKLXNlcGFyYXRlZCBieSBjb21tYXMgb3Igc3BhY2VzLiAgWW91IGNhbiBzdXBwbHkgYSBkZWZhdWx0IHZhbHVlIGZvciBhbnkKLW1hY3JvIGFyZ3VtZW50IGJ5IGZvbGxvd2luZyB0aGUgbmFtZSB3aXRoIEBzYW1wez1AdmFye2RlZmx0fX0uICBGb3IKLWV4YW1wbGUsIHRoZXNlIGFyZSBhbGwgdmFsaWQgQGNvZGV7Lk1BQ1JPfSBzdGF0ZW1lbnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5NQUNSTyBDT01NCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtDT01NfSwgd2hpY2ggdGFrZXMgbm8KLWFyZ3VtZW50cy4KLQotQGl0ZW0gLk1BQ1JPIFBMVVMxIFAsIFAxCi1AaXRlbXggLk1BQ1JPIFBMVVMxIFAgUDEKLUVpdGhlciBzdGF0ZW1lbnQgYmVnaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle1BMVVMxfSwKLXdoaWNoIHRha2VzIHR3byBhcmd1bWVudHM7IHdpdGhpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgd3JpdGUKLUBzYW1we1xQfSBvciBAc2FtcHtcUDF9IHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMuCi0KLUBpdGVtIC5NQUNSTyBSRVNFUlZFX1NUUiBQMT0wIFAyCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtSRVNFUlZFX1NUUn0sIHdpdGggdHdvCi1hcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYnV0IG5vdCB0aGUgc2Vjb25kLgotQWZ0ZXIgdGhlIGRlZmluaXRpb24gaXMgY29tcGxldGUsIHlvdSBjYW4gY2FsbCB0aGUgbWFjcm8gZWl0aGVyIGFzCi1Ac2FtcHtSRVNFUlZFX1NUUiBAdmFye2F9LEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xQMX0gZXZhbHVhdGluZyB0bwotQHZhcnthfSBhbmQgQHNhbXB7XFAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLCBvciBhcyBAc2FtcHtSRVNFUlZFX1NUUgotLEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xQMX0gZXZhbHVhdGluZyBhcyB0aGUgZGVmYXVsdCwgaW4gdGhpcyBjYXNlCi1Ac2FtcHswfSwgYW5kIEBzYW1we1xQMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KS4KLUBlbmQgdGFibGUKLQotV2hlbiB5b3UgY2FsbCBhIG1hY3JvLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHZhbHVlcyBlaXRoZXIgYnkKLXBvc2l0aW9uLCBvciBieSBrZXl3b3JkLiAgRm9yIGV4YW1wbGUsIEBzYW1we1NVTSA5LDE3fSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHtTVU0gVE89MTcsIEZST009OX0uICBNYWNybyBhcmd1bWVudHMgYXJlIHByZXByb2Nlc3NvciB2YXJpYWJsZXMKLXNpbWlsYXIgdG8gdGhlIHZhcmlhYmxlcyB5b3UgZGVmaW5lIHdpdGggQHNhbXB7LkFTU0lHTkF9IG9yCi1Ac2FtcHsuQVNTSUdOQ307IGluIHBhcnRpY3VsYXIsIHlvdSBjYW4gdXNlIHRoZW0gaW4gY29uZGl0aW9uYWxzIG9yIGZvcgotbG9vcCBjb250cm9sLiAgKFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIHByZWZpeCB5b3Ugd3JpdGUgdG8gZXZhbHVhdGUKLXRoZSB2YXJpYWJsZTogZm9yIGEgbWFjcm8gYXJndW1lbnQsIHdyaXRlIEBzYW1we1xAdmFye2FyZ25hbWV9fSwgYnV0IGZvcgotYSBwcmVwcm9jZXNzb3IgdmFyaWFibGUsIHdyaXRlIEBzYW1we1wmQHZhcnt2YXJuYW1lfX0uKQotCi1AaXRlbSBAdmFye25hbWV9IC5NQUNSTwotQGl0ZW14IEB2YXJ7bmFtZX0gLk1BQ1JPICggQHZhcnttYWNhcmdzfSBAZG90c3t9ICkKLUBjIEZJWE1FIGNoZWNrOiBJIHRoaW5rIG5vIGVycm9yIF9hbmRfIG5vIGFyZ3MgcmVjb2duaXplZCBpZiBJIHVzZSBmb3JtCi1AYyAgICAgICBOQU1FICAuTUFDUk8gICBBUkcgQVJHCi1BbiBhbHRlcm5hdGl2ZSBmb3JtIG9mIGludHJvZHVjaW5nIGEgbWFjcm8gZGVmaW5pdGlvbjogc3BlY2lmeSB0aGUgbWFjcm8KLW5hbWUgaW4gdGhlIGxhYmVsIHBvc2l0aW9uLCBhbmQgdGhlIGFyZ3VtZW50cyAoaWYgYW55KSBiZXR3ZWVuCi1wYXJlbnRoZXNlcyBhZnRlciB0aGUgbmFtZS4gIERlZmF1bHRpbmcgcnVsZXMgYW5kIHVzYWdlIHdvcmsgdGhlIHNhbWUKLXdheSBhcyBmb3IgdGhlIG90aGVyIG1hY3JvIGRlZmluaXRpb24gc3ludGF4LgotCi1AaXRlbSAuRU5ETQotTWFyayB0aGUgZW5kIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotQGl0ZW0gLkVYSVRNCi1FeGl0IGVhcmx5IGZyb20gdGhlIGN1cnJlbnQgbWFjcm8gZGVmaW5pdGlvbiwgQGNvZGV7LkFSRVBFQVR9IGxvb3AsIG9yCi1AY29kZXsuQVdISUxFfSBsb29wLgotCi1AY2luZGV4IG51bWJlciBvZiBtYWNyb3MgZXhlY3V0ZWQKLUBjaW5kZXggbWFjcm9zLCBjb3VudCBleGVjdXRlZAotQGl0ZW0gXEBACi1Ac2N7Z2FzcH0gbWFpbnRhaW5zIGEgY291bnRlciBvZiBob3cgbWFueSBtYWNyb3MgaXQgaGFzCi1leGVjdXRlZCBpbiB0aGlzIHBzZXVkby12YXJpYWJsZTsgeW91IGNhbiBjb3B5IHRoYXQgbnVtYmVyIHRvIHlvdXIKLW91dHB1dCB3aXRoIEBzYW1we1xAQH0sIGJ1dCBAZW1waHtvbmx5IHdpdGhpbiBhIG1hY3JvIGRlZmluaXRpb259LgotCi1AaXRlbSBMT0NBTCBAdmFye25hbWV9IFsgLCBAZG90c3t9IF0KLUBlbXBoe1dhcm5pbmc6IEBjb2Rle0xPQ0FMfSBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0IGBgYWx0ZXJuYXRlCi1tYWNybyBzeW50YXgnJyB3aXRoIEBzYW1wey1hfSBvciBAc2FtcHstLWFsdGVybmF0ZX0ufSAgQHhyZWZ7QWx0ZXJuYXRlLCwKLUFsdGVybmF0ZSBtYWNybyBzeW50YXh9LgotCi1HZW5lcmF0ZSBhIHN0cmluZyByZXBsYWNlbWVudCBmb3IgZWFjaCBvZiB0aGUgQHZhcntuYW1lfSBhcmd1bWVudHMsIGFuZAotcmVwbGFjZSBhbnkgaW5zdGFuY2VzIG9mIEB2YXJ7bmFtZX0gaW4gZWFjaCBtYWNybyBleHBhbnNpb24uICBUaGUKLXJlcGxhY2VtZW50IHN0cmluZyBpcyB1bmlxdWUgaW4gdGhlIGFzc2VtYmx5LCBhbmQgZGlmZmVyZW50IGZvciBlYWNoCi1zZXBhcmF0ZSBtYWNybyBleHBhbnNpb24uICBAY29kZXtMT0NBTH0gYWxsb3dzIHlvdSB0byB3cml0ZSBtYWNyb3MgdGhhdAotZGVmaW5lIHN5bWJvbHMsIHdpdGhvdXQgZmVhciBvZiBjb25mbGljdCBiZXR3ZWVuIHNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbnMuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBEYXRhCi1Ac2VjdGlvbiBEYXRhIG91dHB1dAotCi1JbiBhc3NlbWJseSBjb2RlLCB5b3Ugb2Z0ZW4gbmVlZCB0byBzcGVjaWZ5IHdvcmtpbmcgYXJlYXMgb2YgbWVtb3J5OwotZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbiwgeW91IG1heSB3YW50IHRvIGluaXRpYWxpemUgc3VjaCBtZW1vcnkgb3IKLW5vdC4gIEBzY3tnYXNwfSBwcm92aWRlcyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB0byBoZWxwIHlvdSBhdm9pZAotcmVwZXRpdGl2ZSBjb2RpbmcgZm9yIGJvdGggcHVycG9zZXMuCi0KLVlvdSBjYW4gdXNlIGxhYmVscyBhcyB1c3VhbCB0byBtYXJrIHRoZSBkYXRhIGFyZWFzLgotCi1AbWVudQotKiBJbml0aWFsaXplZDo6Ci0qIFVuaW5pdGlhbGl6ZWQ6OgotQGVuZCBtZW51Ci0KLUBub2RlIEluaXRpYWxpemVkCi1Ac3Vic2VjdGlvbiBJbml0aWFsaXplZCBkYXRhCi0KLVRoZXNlIGFyZSB0aGUgQHNje2dhc3B9IGRpcmVjdGl2ZXMgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCB0aGUgc3RhbmRhcmQKLUBzY3tnbnV9IGFzc2VtYmxlciBkaXJlY3RpdmVzIHRoZXkgZXhwYW5kIHRvOgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuREFUQSBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuQiBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuVyBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuTCBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1FdmFsdWF0ZSBhcml0aG1ldGljIGV4cHJlc3Npb25zIEB2YXJ7ZXhwcn0sIGFuZCBlbWl0IHRoZSBjb3JyZXNwb25kaW5nCi1AY29kZXthc30gZGlyZWN0aXZlIChsYWJlbGxlZCB3aXRoIEB2YXJ7bGFifSkuICBUaGUgdW5xdWFsaWZpZWQKLUBjb2Rley5EQVRBfSBlbWl0cyBAc2FtcHsubG9uZ307IEBjb2Rley5EQVRBLkJ9IGVtaXRzIEBzYW1wey5ieXRlfTsKLUBjb2Rley5EQVRBLld9IGVtaXRzIEBzYW1wey5zaG9ydH07IGFuZCBAY29kZXsuREFUQS5MfSBlbWl0cwotQHNhbXB7Lmxvbmd9LgotCi1Gb3IgZXhhbXBsZSwgQHNhbXB7Zm9vIC5EQVRBIDEsMiwzfSBlbWl0cyBAc2FtcHtmb286IC5sb25nIDEsMiwzfS4KLQotQGl0ZW0gLkRBVEFCIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5CIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5XIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5MIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGMgRklYTUUhIExvb2tzIGxpa2UgZ2FzcCBhY2NlcHRzIGFuZCBpZ25vcmVzIGFyZ3MgYWZ0ZXIgMm5kLgotTWFrZSBAY29kZXthc30gZW1pdCBAdmFye3JlcGVhdH0gY29waWVzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbgotQHZhcntleHByfSAodXNpbmcgdGhlIEBjb2Rle2FzfSBkaXJlY3RpdmUgQGNvZGV7LmZpbGx9KS4KLUBzYW1wey5EQVRBQi5CfSByZXBlYXRzIG9uZS1ieXRlIHZhbHVlczsgQHNhbXB7LkRBVEFCLld9IHJlcGVhdHMKLXR3by1ieXRlIHZhbHVlczsgYW5kIEBzYW1wey5EQVRBQi5MfSByZXBlYXRzIGZvdXItYnl0ZSB2YWx1ZXMuCi1Ac2FtcHsuREFUQUJ9IHdpdGhvdXQgYSBzdWZmaXggcmVwZWF0cyBmb3VyLWJ5dGUgdmFsdWVzLCBqdXN0IGxpa2UKLUBzYW1wey5EQVRBQi5MfS4KLQotQGMgRklYTUUhIEFsbG93aW5nIHplcm8gbWlnaHQgYmUgdXNlZnVsIGZvciBlZGdlIGNvbmRpdGlvbnMgaW4gbWFjcm9zLgotQHZhcntyZXBlYXR9IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aXRoIGEgcG9zaXRpdmUgdmFsdWUuCi0KLUBpdGVtIC5TREFUQSAiQHZhcntzdHJ9IiBAZG90c3t9Ci1TdHJpbmcgZGF0YS4gIEVtaXRzIGEgY29uY2F0ZW5hdGlvbiBvZiBieXRlcywgcHJlY2lzZWx5IGFzIHlvdSBzcGVjaWZ5Ci10aGVtIChpbiBwYXJ0aWN1bGFyLCBAZW1waHtub3RoaW5nIGlzIGFkZGVkIHRvIG1hcmsgdGhlIGVuZH0gb2YgdGhlCi1zdHJpbmcpLiAgQHhyZWZ7Q29uc3RhbnRzLCwgU3RyaW5nIGFuZCBudW1lcmljIGNvbnN0YW50c30sIGZvciBkZXRhaWxzCi1hYm91dCBob3cgdG8gd3JpdGUgc3RyaW5ncy4gIEBjb2Rley5TREFUQX0gY29uY2F0ZW5hdGVzIG11bHRpcGxlCi1hcmd1bWVudHMsIG1ha2luZyBpdCBlYXN5IHRvIHN3aXRjaCBiZXR3ZWVuIHN0cmluZyByZXByZXNlbnRhdGlvbnMuICBZb3UKLWNhbiB1c2UgY29tbWFzIHRvIHNlcGFyYXRlIHRoZSBpbmRpdmlkdWFsIGFyZ3VtZW50cyBmb3IgY2xhcml0eSwgaWYgeW91Ci1jaG9vc2UuCi0KLUBpdGVtIC5TREFUQUIgQHZhcntyZXBlYXR9LCAiQHZhcntzdHJ9IiBAZG90c3t9Ci1SZXBlYXRlZCBzdHJpbmcgZGF0YS4gIFRoZSBmaXJzdCBhcmd1bWVudCBzcGVjaWZpZXMgaG93IG1hbnkgY29waWVzIG9mCi10aGUgc3RyaW5nIHRvIGVtaXQ7IHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHNwZWNpZnkgdGhlIHN0cmluZywgaW4gdGhlCi1zYW1lIHdheSBhcyB0aGUgYXJndW1lbnRzIHRvIEBjb2Rley5TREFUQX0uCi0KLUBpdGVtIC5TREFUQVogIkB2YXJ7c3RyfSIgQGRvdHN7fQotWmVyby10ZXJtaW5hdGVkIHN0cmluZyBkYXRhLiAgSnVzdCBsaWtlIEBjb2Rley5TREFUQX0sIGV4Y2VwdCB0aGF0Ci1AY29kZXsuU0RBVEFafSB3cml0ZXMgYSB6ZXJvIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotCi1AaXRlbSAuU0RBVEFDICJAdmFye3N0cn0iIEBkb3Rze30KLUNvdW50LXByZWZpeGVkIHN0cmluZyBkYXRhLiAgSnVzdCBsaWtlIEBjb2Rley5TREFUQX0sIGV4Y2VwdCB0aGF0Ci1Ac2N7Z2FzcH0gcHJlY2VkZXMgdGhlIHN0cmluZyB3aXRoIGEgbGVhZGluZyBvbmUtYnl0ZSBjb3VudC4gIEZvcgotZXhhbXBsZSwgQHNhbXB7LlNEQVRBQyAiSEkifSBnZW5lcmF0ZXMgQHNhbXB7LmJ5dGUgMiw3Miw3M30uICBTaW5jZSB0aGUKLWNvdW50IGZpZWxkIGlzIG9ubHkgb25lIGJ5dGUsIHlvdSBjYW4gb25seSB1c2UgQGNvZGV7LlNEQVRBQ30gZm9yCi1zdHJpbmdzIGxlc3MgdGhhbiAyNTYgYnl0ZXMgaW4gbGVuZ3RoLgotQGVuZCBmdGFibGUKLQotQG5vZGUgVW5pbml0aWFsaXplZAotQHN1YnNlY3Rpb24gVW5pbml0aWFsaXplZCBkYXRhCi0KLUBjIEZJWE1FISAgLnNwYWNlIGRpZmZlcmVudCBvbiBzb21lIHBsYXRmb3Jtcywgbm90YWJseSBIUFBBLiAgQ29uZmlnPwotVXNlIHRoZSBAY29kZXsuUkVTfSwgQGNvZGV7LlNSRVN9LCBAY29kZXsuU1JFU0N9LCBhbmQgQGNvZGV7LlNSRVNafQotZGlyZWN0aXZlcyB0byByZXNlcnZlIG1lbW9yeSBhbmQgbGVhdmUgaXQgdW5pbml0aWFsaXplZC4gIEBzY3tnYXNwfQotcmVzb2x2ZXMgdGhlc2UgZGlyZWN0aXZlcyB0byBhcHByb3ByaWF0ZSBjYWxscyBvZiB0aGUgQHNje2dudX0KLUBjb2Rle2FzfSBAY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLlJFUyBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuQiBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuVyBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuTCBAdmFye2NvdW50fQotUmVzZXJ2ZSByb29tIGZvciBAdmFye2NvdW50fSB1bmluaXRpYWxpemVkIGVsZW1lbnRzIG9mIGRhdGEuICBUaGUKLXN1ZmZpeCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50OiBAY29kZXsuUkVTLkJ9IHJlc2VydmVzCi1AdmFye2NvdW50fSBieXRlcywgQGNvZGV7LlJFUy5XfSByZXNlcnZlcyBAdmFye2NvdW50fSBwYWlycyBvZiBieXRlcywKLWFuZCBAY29kZXsuUkVTLkx9IHJlc2VydmVzIEB2YXJ7Y291bnR9IHF1YXJ0ZXRzLiAgQGNvZGV7LlJFU30gd2l0aG91dCBhCi1zdWZmaXggaXMgZXF1aXZhbGVudCB0byBAY29kZXsuUkVTLkx9LgotCi1AaXRlbSAuU1JFUyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTLkIgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFUy5XIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVMuTCBAdmFye2NvdW50fQotQGMgRklYTUUhICBUaGlzIGlzIGJvcmluZy4gIFNob3VsZG4ndCBpdCBhdCBsZWFzdCBoYXZlIGEgZGlmZmVyZW50Ci1AYyAgICAgICAgIGRlZmF1bHQgc2l6ZT8gIChlLmcuIHRoZSAiUyIgc3VnZ2VzdHMgInN0cmluZyIsIGZvciB3aGljaCAuQgotQGMgICAgICAgICB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlKQotQGNvZGV7LlNSRVN9IGlzIGEgc3lub255bSBmb3IgQHNhbXB7LlJFU30uCi0KLUBpdGVtIC5TUkVTQyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTQy5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNDLlcgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU0MuTCBAdmFye2NvdW50fQotTGlrZSBAY29kZXsuU1JFU30sIGJ1dCByZXNlcnZlcyBzcGFjZSBmb3IgQGNvZGV7QHZhcntjb3VudH0rMX0gZWxlbWVudHMuCi0KLUBpdGVtIC5TUkVTWiBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTWi5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNaLlcgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU1ouTCBAdmFye2NvdW50fQotTGlrZSBAY29kZXsuU1JFU30sIGJ1dCByZXNlcnZlcyBzcGFjZSBmb3IgQGNvZGV7QHZhcntjb3VudH0rMX0gZWxlbWVudHMuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBMaXN0aW5ncwotQHNlY3Rpb24gQXNzZW1ibHkgbGlzdGluZyBjb250cm9sCi0KLVRoZSBAc2N7Z2FzcH0gbGlzdGluZy1jb250cm9sIGRpcmVjdGl2ZXMgY29ycmVzcG9uZCB0bwotcmVsYXRlZCBAc2N7Z251fSBAY29kZXthc30gZGlyZWN0aXZlcy4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLlBSSU5UIExJU1QKLUBpdGVteCAuUFJJTlQgTk9MSVNUCi1QcmludCBjb250cm9sLiAgVGhpcyBkaXJlY3RpdmUgZW1pdHMgdGhlIEBzY3tnbnV9IEBjb2Rle2FzfSBkaXJlY3RpdmUKLUBjb2Rley5saXN0fSBvciBAY29kZXsubm9saXN0fSwgYWNjb3JkaW5nIHRvIGl0cyBhcmd1bWVudC4gIEB4cmVme0xpc3QsLAotQGNvZGV7Lmxpc3R9LCBhcy5pbmZvLCBVc2luZyBhc30sIGZvciBkZXRhaWxzIG9uIGhvdyB0aGVzZSBkaXJlY3RpdmVzCi1pbnRlcmFjdC4KLQotQGl0ZW0gLkZPUk0gTElOPUB2YXJ7bG59Ci1AaXRlbXggLkZPUk0gQ09MPUB2YXJ7Y29sc30KLUBpdGVteCAuRk9STSBMSU49QHZhcntsbn0gQ09MPUB2YXJ7Y29sc30KLVNwZWNpZnkgdGhlIHBhZ2Ugc2l6ZSBmb3IgYXNzZW1ibHkgbGlzdGluZ3M6IEB2YXJ7bG59IHJlcHJlc2VudHMgdGhlCi1udW1iZXIgb2YgbGluZXMsIGFuZCBAdmFye2NvbHN9IHRoZSBudW1iZXIgb2YgY29sdW1ucy4gIFlvdSBtYXkgc3BlY2lmeQotZWl0aGVyIHBhZ2UgZGltZW5zaW9uIGluZGVwZW5kZW50bHksIG9yIGJvdGggdG9nZXRoZXIuICBJZiB5b3UgZG8gbm90Ci1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMsIEBzY3tnYXNwfSBhc3N1bWVzIDYwIGxpbmVzOyBpZiB5b3UgZG8gbm90Ci1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucywgQHNje2dhc3B9IGFzc3VtZXMgMTMyIGNvbHVtbnMuCi0oQW55IHZhbHVlcyB5b3UgbWF5IGhhdmUgc3BlY2lmaWVkIGluIHByZXZpb3VzIGluc3RhbmNlcyBvZiBAY29kZXsuRk9STX0KLWRvIEBlbXBoe25vdH0gY2Fycnkgb3ZlciBhcyBkZWZhdWx0cy4pICBFbWl0cyB0aGUgQGNvZGV7LnBzaXplfQotYXNzZW1ibGVyIGRpcmVjdGl2ZS4KLQotQGl0ZW0gLkhFQURJTkcgQHZhcntzdHJpbmd9Ci1TcGVjaWZ5IEB2YXJ7c3RyaW5nfSBhcyB0aGUgdGl0bGUgb2YgeW91ciBhc3NlbWJseSBsaXN0aW5ncy4gIEVtaXRzCi1Ac2FtcHsudGl0bGUgIkB2YXJ7c3RyaW5nfSJ9LgotCi1AaXRlbSAuUEFHRQotRm9yY2UgYSBuZXcgcGFnZSBpbiBhc3NlbWJseSBsaXN0aW5ncy4gIEVtaXRzIEBzYW1wey5lamVjdH0uCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBPdGhlciBDb21tYW5kcwotQHNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb21tYW5kcwotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuQUxURVJOQVRFCi1Vc2UgdGhlIGFsdGVybmF0ZSBtYWNybyBzeW50YXggaGVuY2Vmb3J0aCBpbiB0aGUgYXNzZW1ibHkuCi1AeHJlZntBbHRlcm5hdGUsLCBBbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4KLQotQGl0ZW0gLk9SRwotQGMgRklYTUUhICBUaGlzIGlzIHZlcnkgc3RyYW5nZSwgc2luY2UgX0dBU18gdW5kZXJzdGFuZHMgLm9yZwotVGhpcyBjb21tYW5kIGlzIHJlY29nbml6ZWQsIGJ1dCBub3QgeWV0IGltcGxlbWVudGVkLiAgQHNje2dhc3B9Ci1nZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvZ3JhbXMgdGhhdCB1c2UgQGNvZGV7Lk9SR30uCi0KLUBpdGVtIC5SQURJWCBAdmFye3N9Ci1AYyBGSVhNRSBubyB0ZXN0IGNhc2VzIGluIHRlc3RzdWl0ZS9nYXNwCi1Ac2N7Z2FzcH0gdW5kZXJzdGFuZHMgbnVtYmVycyBpbiBhbnkgb2YgYmFzZSB0d28sIGVpZ2h0LCB0ZW4sIG9yCi1zaXh0ZWVuLiAgWW91IGNhbiBlbmNvZGUgdGhlIGJhc2UgZXhwbGljaXRseSBpbiBhbnkgbnVtZXJpYyBjb25zdGFudAotKEBweHJlZntDb25zdGFudHMsLCBTdHJpbmcgYW5kIG51bWVyaWMgY29uc3RhbnRzfSkuICBJZiB5b3Ugd3JpdGUKLW51bWJlcnMgd2l0aG91dCBhbiBleHBsaWNpdCBpbmRpY2F0aW9uIG9mIHRoZSBiYXNlLCB0aGUgbW9zdCByZWNlbnQKLUBzYW1wey5SQURJWCBAdmFye3N9fSBjb21tYW5kIGRldGVybWluZXMgaG93IHRoZXkgYXJlIGludGVycHJldGVkLgotQHZhcntzfSBpcyBhIHNpbmdsZSBsZXR0ZXIsIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5SQURJWCBCCi1CYXNlIDIuCi0KLUBpdGVtIC5SQURJWCBRCi1CYXNlIDguCi0KLUBpdGVtIC5SQURJWCBECi1CYXNlIDEwLiAgVGhpcyBpcyB0aGUgb3JpZ2luYWwgZGVmYXVsdCByYWRpeC4KLQotQGl0ZW0gLlJBRElYIEgKLUJhc2UgMTYuCi1AZW5kIHRhYmxlCi0KLVlvdSBtYXkgc3BlY2lmeSB0aGUgYXJndW1lbnQgQHZhcntzfSBpbiBsb3dlciBjYXNlIChhbnkgb2YgQHNhbXB7YnFkaH0pCi13aXRoIHRoZSBzYW1lIGVmZmVjdHMuCi0KLUBpdGVtIC5FWFBPUlQgQHZhcntuYW1lfQotQGl0ZW14IC5HTE9CQUwgQHZhcntuYW1lfQotQGMgRklYTUUhIE5vIHRlc3QgY2FzZXMgaW4gdGVzdHN1aXRlL2dhc3AKLURlY2xhcmUgQHZhcntuYW1lfSBnbG9iYWwgKGVtaXRzIEBzYW1wey5nbG9iYWwgQHZhcntuYW1lfX0pLiAgVGhlIHR3bwotZGlyZWN0aXZlcyBhcmUgc3lub255bW91cy4KLQotQGl0ZW0gLlBST0dSQU0KLU5vIGVmZmVjdDogQHNje2dhc3B9IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUsIGFuZCBzaWxlbnRseSBpZ25vcmVzIGl0LgotCi1AaXRlbSAuRU5ECi1NYXJrIGVuZCBvZiBlYWNoIHByZXByb2Nlc3NvciBmaWxlLiAgQHNje2dhc3B9IGlzc3VlcyBhIHdhcm5pbmcgaWYgaXQKLXJlYWNoZXMgZW5kIG9mIGZpbGUgd2l0aG91dCBzZWVpbmcgdGhpcyBjb21tYW5kLgotCi1AaXRlbSAuSU5DTFVERSAiQHZhcntzdHJ9IgotUHJlcHJvY2VzcyB0aGUgZmlsZSBuYW1lZCBieSBAdmFye3N0cn0sIGFzIGlmIGl0cyBjb250ZW50cyBhcHBlYXJlZAotd2hlcmUgdGhlIEBjb2Rley5JTkNMVURFfSBkaXJlY3RpdmUgZG9lcy4gIEBzY3tnYXNwfSBpbXBvc2VzIGEgbWF4aW11bQotbGltaXQgb2YgMzAgc3RhY2tlZCBpbmNsdWRlIGZpbGVzLCBhcyBhIHNhbml0eSBjaGVjay4KLUBjIEZJWE1FISAgV2h5IGlzIGluY2x1ZGUgZGVwdGggbm90IGFmZmVjdGVkIGJ5IC11PwotCi1AaXRlbSAuQUxJR04gQHZhcntzaXplfQotQGMgRklYTUUhIFdoeSBpcyB0aGlzIG5vdCB1dHRlcmx5IHBvaW50bGVzcz8KLUV2YWx1YXRlIHRoZSBhYnNvbHV0ZSBleHByZXNzaW9uIEB2YXJ7c2l6ZX0sIGFuZCBlbWl0IHRoZSBhc3NlbWJseQotaW5zdHJ1Y3Rpb24gQHNhbXB7LmFsaWduIEB2YXJ7c2l6ZX19IHVzaW5nIHRoZSByZXN1bHQuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBTeW50YXggRGV0YWlscwotQHNlY3Rpb24gRGV0YWlscyBvZiB0aGUgR0FTUCBzeW50YXgKLQotU2luY2UgQHNje2dhc3B9IGlzIG1lYW50IHRvIHdvcmsgd2l0aCBhc3NlbWJseSBjb2RlLCBpdHMgc3RhdGVtZW50Ci1zeW50YXggaGFzIG5vIHN1cnByaXNlcyBmb3IgdGhlIGFzc2VtYmx5IHByb2dyYW1tZXIuCi0KLUBjaW5kZXggd2hpdGVzcGFjZQotQGVtcGh7V2hpdGVzcGFjZX0gKGJsYW5rcyBvciB0YWJzOyBAZW1waHtub3R9IG5ld2xpbmUpIGlzIHBhcnRpYWxseQotc2lnbmlmaWNhbnQsIGluIHRoYXQgaXQgZGVsaW1pdHMgdXAgdG8gdGhyZWUgZmllbGRzIGluIGEgbGluZS4gIFRoZQotYW1vdW50IG9mIHdoaXRlc3BhY2UgZG9lcyBub3QgbWF0dGVyOyB5b3UgbWF5IGxpbmUgdXAgZmllbGRzIGluIHNlcGFyYXRlCi1saW5lcyBpZiB5b3Ugd2lzaCwgYnV0IEBzY3tnYXNwfSBkb2VzIG5vdCByZXF1aXJlIHRoYXQuCi0KLUBjaW5kZXggZmllbGRzIG9mIEBzY3tnYXNwfSBzb3VyY2UgbGluZQotQGNpbmRleCBsYWJlbCBmaWVsZAotVGhlIEBlbXBoe2ZpcnN0IGZpZWxkfSwgYW4gb3B0aW9uYWwgQGRmbntsYWJlbH0sIG11c3QgYmUgZmx1c2ggbGVmdCBpbiBhCi1saW5lICh3aXRoIG5vIGxlYWRpbmcgd2hpdGVzcGFjZSkgaWYgaXQgYXBwZWFycyBhdCBhbGwuICBZb3UgbWF5IHVzZSBhCi1jb2xvbiBhZnRlciB0aGUgbGFiZWwgaWYgeW91IHdpc2g7IEBzY3tnYXNwfSBuZWl0aGVyIHJlcXVpcmVzIHRoZSBjb2xvbgotbm9yIG9iamVjdHMgdG8gaXQgKGJ1dCB3aWxsIG5vdCBpbmNsdWRlIGl0IGFzIHBhcnQgb2YgdGhlIGxhYmVsIG5hbWUpLgotCi1AY2luZGV4IGRpcmVjdGl2ZSBmaWVsZAotVGhlIEBlbXBoe3NlY29uZCBmaWVsZH0sIHdoaWNoIG11c3QgYXBwZWFyIGFmdGVyIHNvbWUgd2hpdGVzcGFjZSwKLWNvbnRhaW5zIGEgQHNje2dhc3B9IG9yIGFzc2VtYmx5IEBkZm57ZGlyZWN0aXZlfS4KLQotQGNpbmRleCBhcmd1bWVudCBmaWVsZHMKLUFueSBAZW1waHtmdXJ0aGVyIGZpZWxkc30gb24gYSBsaW5lIGFyZSBAZGZue2FyZ3VtZW50c30gdG8gdGhlCi1kaXJlY3RpdmU7IHlvdSBjYW4gc2VwYXJhdGUgdGhlbSBmcm9tIG9uZSBhbm90aGVyIHVzaW5nIGVpdGhlciBjb21tYXMgb3IKLXdoaXRlc3BhY2UuCi0KLUBtZW51Ci0qIE1hcmtlcnM6OgotKiBDb25zdGFudHM6OgotKiBTeW1ib2xzOjoKLSogRXhwcmVzc2lvbnM6OgotKiBTdHJpbmcgQnVpbHRpbnM6OgotQGVuZCBtZW51Ci0KLUBub2RlIE1hcmtlcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgc3ludGFjdGljIG1hcmtlcnMKLQotQHNje2dhc3B9IHJlY29nbml6ZXMgYSBmZXcgc3BlY2lhbCBtYXJrZXJzOiB0byBkZWxpbWl0IGNvbW1lbnRzLCB0bwotY29udGludWUgYSBzdGF0ZW1lbnQgb24gdGhlIG5leHQgbGluZSwgdG8gc2VwYXJhdGUgc3ltYm9scyBmcm9tIG90aGVyCi1jaGFyYWN0ZXJzLCBhbmQgdG8gY29weSB0ZXh0IHRvIHRoZSBvdXRwdXQgbGl0ZXJhbGx5LiAgKE9uZSBvdGhlcgotc3BlY2lhbCBtYXJrZXIsIEBzYW1we1xAQH0sIHdvcmtzIG9ubHkgd2l0aGluIG1hY3JvIGRlZmluaXRpb25zOwotQHB4cmVme01hY3JvcywsIERlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LikKLQotQGNpbmRleCBjb21tZW50cwotVGhlIHRyYWlsaW5nIHBhcnQgb2YgYW55IEBzY3tnYXNwfSBzb3VyY2UgbGluZSBtYXkgYmUgYSBAZGZue2NvbW1lbnR9LgotQSBjb21tZW50IGJlZ2lucyB3aXRoIHRoZSBmaXJzdCB1bnF1b3RlZCBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7IX0gYnkKLWRlZmF1bHQpLCBvciBhbiBlc2NhcGVkIG9yIGRvdWJsZWQgY29tbWVudCBjaGFyYWN0ZXIgKEBzYW1we1whfSBvcgotQHNhbXB7ISF9IGJ5IGRlZmF1bHQpLCBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIGEgbGluZS4gIFlvdSBjYW4KLXNwZWNpZnkgd2hhdCBjb21tZW50IGNoYXJhY3RlciB0byB1c2Ugd2l0aCB0aGUgQHNhbXB7LWN9IG9wdGlvbgotKEBweHJlZntJbnZva2luZyBHQVNQLCwgQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIFRoZSB0d28ga2luZHMgb2YKLWNvbW1lbnQgbWFya2VycyBsZWFkIHRvIHNsaWdodGx5IGRpZmZlcmVudCB0cmVhdG1lbnQ6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gIQotQSBzaW5nbGUsIHVuLWVzY2FwZWQgY29tbWVudCBjaGFyYWN0ZXIgZ2VuZXJhdGVzIGFuIGFzc2VtYmx5IGNvbW1lbnQgaW4KLXRoZSBAc2N7Z2FzcH0gb3V0cHV0LiAgQHNje2dhc3B9IGV2YWx1YXRlcyBhbnkgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcwotKG1hY3JvIGFyZ3VtZW50cywgb3IgdmFyaWFibGVzIGRlZmluZWQgd2l0aCBAY29kZXsuQVNTSUdOQX0gb3IKLUBjb2Rley5BU1NJR05DfSkgcHJlc2VudC4gIEZvciBleGFtcGxlLCBhIG1hY3JvIHRoYXQgYmVnaW5zIGxpa2UgdGhpcwotCi1AZXhhbXBsZQotICAgICAgICAuTUFDUk8gIFNVTSBGUk9NPTAsIFRPPTkKLSAgICAgICAgISBcRlJPTSBcVE8KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWlzc3VlcyBhcyB0aGUgZmlyc3QgbGluZSBvZiBvdXRwdXQgYSBjb21tZW50IHRoYXQgcmVjb3JkcyB0aGUKLXZhbHVlcyB5b3UgdXNlZCB0byBjYWxsIHRoZSBtYWNyby4KLQotQGMgY29tbWVudHMsIHByZXByb2Nlc3Nvci1vbmx5Ci1AYyBwcmVwcm9jZXNzb3Itb25seSBjb21tZW50cwotQGMgR0FTUC1vbmx5IGNvbW1lbnRzCi1AaXRlbSBcIQotQGl0ZW14ICEhCi1FaXRoZXIgYW4gZXNjYXBlZCBjb21tZW50IGNoYXJhY3Rlciwgb3IgYSBkb3VibGUgY29tbWVudCBjaGFyYWN0ZXIsCi1tYXJrcyBhIEBzY3tnYXNwfSBzb3VyY2UgY29tbWVudC4gIEBzY3tnYXNwfSBkb2VzIG5vdCBjb3B5IHN1Y2ggY29tbWVudHMKLXRvIHRoZSBhc3NlbWJseSBvdXRwdXQuCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggY29udGludWF0aW9uIGNoYXJhY3RlcgotQGtpbmRleCArCi1UbyBAZW1waHtjb250aW51ZSBhIHN0YXRlbWVudH0gb24gdGhlIG5leHQgbGluZSBvZiB0aGUgZmlsZSwgYmVnaW4gdGhlCi1zZWNvbmQgbGluZSB3aXRoIHRoZSBjaGFyYWN0ZXIgQHNhbXB7K30uCi0KLUBjaW5kZXggbGl0ZXJhbCBjb3B5IHRvIG91dHB1dAotQGNpbmRleCBjb3B5aW5nIGxpdGVyYWxseSB0byBvdXRwdXQKLUBjaW5kZXggcHJlcHJvY2Vzc2luZywgYXZvaWRpbmcKLUBjaW5kZXggYXZvaWRpbmcgcHJlcHJvY2Vzc2luZwotT2NjYXNpb25hbGx5IHlvdSBtYXkgd2FudCB0byBwcmV2ZW50IEBzY3tnYXNwfSBmcm9tIHByZXByb2Nlc3Npbmcgc29tZQotcGFydGljdWxhciBiaXQgb2YgdGV4dC4gIFRvIEBlbXBoe2NvcHkgbGl0ZXJhbGx5fSBmcm9tIHRoZSBAc2N7Z2FzcH0KLXNvdXJjZSB0byBpdHMgb3V0cHV0LCBwbGFjZSBAc2FtcHtcKH0gYmVmb3JlIHRoZSBzdHJpbmcgdG8gY29weSwgYW5kCi1Ac2FtcHspfSBhdCB0aGUgZW5kLiAgRm9yIGV4YW1wbGUsIHdyaXRlIEBzYW1we1woXCEpfSBpZiB5b3UgbmVlZCB0aGUKLWNoYXJhY3RlcnMgQHNhbXB7XCF9IGluIHlvdXIgYXNzZW1ibHkgb3V0cHV0LgotCi1AY2luZGV4IHN5bWJvbCBzZXBhcmF0b3IKLUBjaW5kZXggdGV4dCwgc2VwYXJhdGluZyBmcm9tIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgc2VwYXJhdGluZyBmcm9tIHRleHQKLVRvIEBlbXBoe3NlcGFyYXRlIGEgcHJlcHJvY2Vzc29yIHZhcmlhYmxlfSBmcm9tIHRleHQgdG8gYXBwZWFyCi1pbW1lZGlhdGVseSBhZnRlciBpdHMgdmFsdWUsIHdyaXRlIGEgc2luZ2xlIHF1b3RlIChAY29kZXsnfSkuICBGb3IKLWV4YW1wbGUsIEBzYW1wey5TREFUQSAiXFAnMSJ9IHdyaXRlcyBhIHN0cmluZyBidWlsdCBieSBjb25jYXRlbmF0aW5nIHRoZQotdmFsdWUgb2YgQGNvZGV7UH0gYW5kIHRoZSBkaWdpdCBAc2FtcHsxfS4gIChZb3UgY2Fubm90IGFjaGlldmUgdGhpcyBieQotd3JpdGluZyBqdXN0IEBzYW1we1xQMX0sIHNpbmNlIEBzYW1we1AxfSBpcyBpdHNlbGYgYSB2YWxpZCBuYW1lIGZvciBhCi1wcmVwcm9jZXNzb3IgdmFyaWFibGUuKQotCi1Abm9kZSBDb25zdGFudHMKLUBzdWJzZWN0aW9uIFN0cmluZyBhbmQgbnVtZXJpYyBjb25zdGFudHMKLQotVGhlcmUgYXJlIHR3byB3YXlzIG9mIHdyaXRpbmcgQGRmbntzdHJpbmcgY29uc3RhbnRzfSBpbiBAc2N7Z2FzcH06IGFzCi1saXRlcmFsIHRleHQsIGFuZCBieSBudW1lcmljIGJ5dGUgdmFsdWUuICBTcGVjaWZ5IGEgc3RyaW5nIGxpdGVyYWwKLWJldHdlZW4gZG91YmxlIHF1b3RlcyAoQGNvZGV7IkB2YXJ7c3RyfSJ9KS4gIFNwZWNpZnkgYW4gaW5kaXZpZHVhbAotbnVtZXJpYyBieXRlIHZhbHVlIGFzIGFuIGFic29sdXRlIGV4cHJlc3Npb24gYmV0d2VlbiBhbmdsZSBicmFja2V0cwotKEBjb2RlezxAdmFye2V4cHJ9Pn0uICBEaXJlY3RpdmVzIHRoYXQgb3V0cHV0IHN0cmluZ3MgYWxsb3cgeW91IHRvCi1zcGVjaWZ5IGFueSBudW1iZXIgb2YgZWl0aGVyIGtpbmQgb2YgdmFsdWUsIGluIHdoYXRldmVyIG9yZGVyIGlzCi1jb252ZW5pZW50LCBhbmQgY29uY2F0ZW5hdGUgdGhlIHJlc3VsdC4gIChBbHRlcm5hdGUgc3ludGF4IG1vZGUKLWludHJvZHVjZXMgYSBudW1iZXIgb2YgYWx0ZXJuYXRpdmUgc3RyaW5nIG5vdGF0aW9uczsgQHB4cmVme0FsdGVybmF0ZSwsCi1BbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4pCi0KLUBjIERldGFpbHMgb2YgbnVtZXJpYyBub3RhdGlvbiwgZS5nLiBiYXNlIHByZWZpeGVzCi1Zb3UgY2FuIHdyaXRlIEBkZm57bnVtZXJpYyBjb25zdGFudHN9IGVpdGhlciBpbiBhIHNwZWNpZmljIGJhc2UsIG9yIGluCi13aGF0ZXZlciBiYXNlIGlzIGN1cnJlbnRseSBzZWxlY3RlZCAoZWl0aGVyIDEwLCBvciBzZWxlY3RlZCBieSB0aGUgbW9zdAotcmVjZW50IEBjb2Rley5SQURJWH0pLgotCi1UbyB3cml0ZSBhIG51bWJlciBpbiBhIEBlbXBoe3NwZWNpZmljIGJhc2V9LCB1c2UgdGhlIHBhdHRlcm4KLUBjb2Rle0B2YXJ7c30nQHZhcntkZGR9fTogYSBiYXNlIHNwZWNpZmllciBjaGFyYWN0ZXIgQHZhcntzfSwgZm9sbG93ZWQKLWJ5IGEgc2luZ2xlIHF1b3RlIGZvbGxvd2VkIGJ5IGRpZ2l0cyBAdmFye2RkZH0uICBUaGUgYmFzZSBzcGVjaWZpZXIKLWNoYXJhY3RlciBtYXRjaGVzIHRob3NlIHlvdSBjYW4gc3BlY2lmeSB3aXRoIEBjb2Rley5SQURJWH06IEBzYW1we0J9IGZvcgotYmFzZSAyLCBAc2FtcHtRfSBmb3IgYmFzZSA4LCBAc2FtcHtEfSBmb3IgYmFzZSAxMCwgYW5kIEBzYW1we0h9IGZvciBiYXNlCi0xNi4gIChZb3UgY2FuIHdyaXRlIHRoaXMgY2hhcmFjdGVyIGluIGxvd2VyIGNhc2UgaWYgeW91IHByZWZlci4pCi0KLUBjIEZJWE1FISBXaGF0IGFyZSBydWxlcyBmb3IgcmVjb2duaXppbmcgbnVtYmVyIGluIGRlZmx0IGJhc2U/ICBXaGF0ZXZlcgotQGMgICAgICAgIGlzIGxlZnQgb3ZlciBhZnRlciBwYXJzaW5nIG90aGVyIHRoaW5ncz8/Ci0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbHMKLQotQHNje2dhc3B9IHJlY29nbml6ZXMgc3ltYm9sIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhbnkgYWxwaGFiZXRpYyBjaGFyYWN0ZXIsCi1Ac2FtcHtffSwgb3IgQHNhbXB7JH0sIGFuZCBjb250aW51ZSB3aXRoIGFueSBvZiB0aGUgc2FtZSBjaGFyYWN0ZXJzIG9yCi13aXRoIGRpZ2l0cy4gIExhYmVsIG5hbWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcy4KLQotQG5vZGUgRXhwcmVzc2lvbnMKLUBzdWJzZWN0aW9uIEFyaXRobWV0aWMgZXhwcmVzc2lvbnMgaW4gR0FTUAotCi1AY2luZGV4IGFic29sdXRlIGV4cHJlc3Npb25zCi1AY2luZGV4IHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zCi1UaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGV4cHJlc3Npb25zLCBkZXBlbmRpbmcgb24gdGhlaXIgcmVzdWx0OgotQGRmbnthYnNvbHV0ZX0gZXhwcmVzc2lvbnMsIHdoaWNoIHJlc29sdmUgdG8gYSBjb25zdGFudCAodGhhdCBpcywgdGhleQotZG8gbm90IGludm9sdmUgYW55IHZhbHVlcyB1bmtub3duIHRvIEBzY3tnYXNwfSksIGFuZCBAZGZue3JlbG9jYXRhYmxlfQotZXhwcmVzc2lvbnMsIHdoaWNoIG11c3QgcmVkdWNlIHRvIHRoZSBmb3JtCi0KLUBleGFtcGxlCi1AdmFye2FkZHN5bX0rQHZhcntjb25zdH0tQHZhcntzdWJzeW19Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBAdmFye2FkZHN5bX0gYW5kIEB2YXJ7c3Vic3ltfSBhcmUgYXNzZW1ibHkgc3ltYm9scyBvZiB1bmtub3duCi12YWx1ZSwgYW5kIEB2YXJ7Y29uc3R9IGlzIGEgY29uc3RhbnQuCi0KLUFyaXRobWV0aWMgZm9yIEBzY3tnYXNwfSBleHByZXNzaW9ucyBmb2xsb3dzIHZlcnkgc2ltaWxhciBydWxlcyB0byBDLgotWW91IGNhbiB1c2UgcGFyZW50aGVzZXMgdG8gY2hhbmdlIHByZWNlZGVuY2U7IG90aGVyd2lzZSwgYXJpdGhtZXRpYwotcHJpbWl0aXZlcyBoYXZlIGRlY3JlYXNpbmcgcHJlY2VkZW5jZSBpbiB0aGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZwotbGlzdC4KLQotQGVudW1lcmF0ZQotQGl0ZW0KLVNpbmdsZS1hcmd1bWVudCBAY29kZXsrfSAoaWRlbnRpdHkpLCBAY29kZXstfSAoYXJpdGhtZXRpYyBvcHBvc2l0ZSksIG9yCi1AY29kZXt+fSAoYml0d2lzZSBuZWdhdGlvbikuICBAZW1waHtUaGUgYXJndW1lbnQgbXVzdCBiZSBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi59Ci0KLUBpdGVtCi1AY29kZXsqfSAobXVsdGlwbGljYXRpb24pIGFuZCBAY29kZXsvfSAoZGl2aXNpb24pLiAgQGVtcGh7Qm90aCBhcmd1bWVudHMKLW11c3QgYmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMufQotCi1AaXRlbQotQGNvZGV7K30gKGFkZGl0aW9uKSBhbmQgQGNvZGV7LX0gKHN1YnRyYWN0aW9uKS4gIEBlbXBoe0F0IGxlYXN0IG9uZSBhcmd1bWVudAotbXVzdCBiZSBhYnNvbHV0ZS59Ci1AYyBGSVhNRSEgIEFjdHVhbGx5LCBzdWJ0cmFjdGlvbiBkb2Vzbid0IGNoZWNrIGZvciB0aGlzLgotCi1AaXRlbQotQGNvZGV7Jn0gKGJpdHdpc2UgYW5kKS4gIEBlbXBoe0JvdGggYXJndW1lbnRzIG11c3QgYmUgYWJzb2x1dGUufQotCi1AaXRlbQotQGMgRklYTUUhICBJIGFncmVlIH4gaXMgYSBiZXR0ZXIgbm90YXRpb24gdGhhbiBeIGZvciB4b3IsIGJ1dCBpcyB0aGUKLUBjICAgICAgICAgaW1wcm92ZW1lbnQgd29ydGggZGlmZmVyaW5nIGZyb20gQz8KLUBjb2Rle3x9IChiaXR3aXNlIG9yKSBhbmQgQGNvZGV7fn0gKGJpdHdpc2UgZXhjbHVzaXZlIG9yOyBAY29kZXtefSBpbgotQykuICBAZW1waHtCb3RoIGFyZ3VtZW50cyBtdXN0IGJlIGFic29sdXRlLn0KLUBlbmQgZW51bWVyYXRlCi0KLUBub2RlIFN0cmluZyBCdWlsdGlucwotQHN1YnNlY3Rpb24gU3RyaW5nIHByaW1pdGl2ZXMKLQotWW91IGNhbiB1c2UgdGhlc2UgcHJpbWl0aXZlcyB0byBtYW5pcHVsYXRlIHN0cmluZ3MgKGluIHRoZSBhcmd1bWVudAotZmllbGQgb2YgQHNje2dhc3B9IHN0YXRlbWVudHMpOgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuTEVOKCJAdmFye3N0cn0iKQotQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2Ygc3RyaW5nIEBjb2RleyJAdmFye3N0cn0ifSwgYXMgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24uICBGb3IgZXhhbXBsZSwgQHNhbXB7LlJFUy5CIC5MRU4oInNhbXBsZSIpfSByZXNlcnZlcyBzaXgKLWJ5dGVzIG9mIG1lbW9yeS4KLQotQGl0ZW0gLklOU1RSKCJAdmFye3N0cmluZ30iLCAiQHZhcntzZWd9IiwgQHZhcntpeH0pCi1TZWFyY2ggZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIEB2YXJ7c2VnfSBhZnRlciBwb3NpdGlvbiBAdmFye2l4fSBvZgotQHZhcntzdHJpbmd9LiAgRm9yIGV4YW1wbGUsIEBzYW1wey5JTlNUUigiQUJDREVGRyIsICJDREUiLCAwKX0gZXZhbHVhdGVzCi10byB0aGUgYWJzb2x1dGUgcmVzdWx0IEBjb2RlezJ9LgotCi1UaGUgcmVzdWx0IGlzIEBjb2Rley0xfSBpZiBAdmFye3NlZ30gZG9lcyBub3Qgb2NjdXIgaW4gQHZhcntzdHJpbmd9Ci1hZnRlciBwb3NpdGlvbiBAdmFye2l4fS4KLQotQGl0ZW0gLlNVQlNUUigiQHZhcntzdHJpbmd9IixAdmFye3N0YXJ0fSxAdmFye2xlbn0pCi1UaGUgc3Vic3RyaW5nIG9mIEB2YXJ7c3RyaW5nfSBiZWdpbm5pbmcgYXQgYnl0ZSBudW1iZXIgQHZhcntzdGFydH0gYW5kCi1leHRlbmRpbmcgZm9yIEB2YXJ7bGVufSBieXRlcy4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIEFsdGVybmF0ZQotQHNlY3Rpb24gQWx0ZXJuYXRlIG1hY3JvIHN5bnRheAotCi1JZiB5b3Ugc3BlY2lmeSBAc2FtcHstYX0gb3IgQHNhbXB7LS1hbHRlcm5hdGV9IG9uIHRoZSBAc2N7Z2FzcH0gY29tbWFuZAotbGluZSwgdGhlIHByZXByb2Nlc3NvciB1c2VzIHNvbWV3aGF0IGRpZmZlcmVudCBzeW50YXguICBUaGlzIHN5bnRheCBpcwotcmVtaW5pc2NlbnQgb2YgdGhlIHN5bnRheCBvZiBQaGFyIExhcCBtYWNybyBhc3NlbWJsZXIsIGJ1dCBpdAotaXMgQGVtcGh7bm90fSBtZWFudCB0byBiZSBhIGZ1bGwgZW11bGF0aW9uIG9mIFBoYXIgTGFwIG9yIHNpbWlsYXIKLWFzc2VtYmxlcnMuICBJbiBwYXJ0aWN1bGFyLCBAc2N7Z2FzcH0gZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3RpdmVzIHN1Y2gKLWFzIEBjb2Rle0RCfSBhbmQgQGNvZGV7SVJQfSwgZXZlbiBpbiBhbHRlcm5hdGUgc3ludGF4IG1vZGUuCi0KLUluIHBhcnRpY3VsYXIsIEBzYW1wey1hfSAob3IgQHNhbXB7LS1hbHRlcm5hdGV9KSBlbGljaXRzIHRoZXNlCi1kaWZmZXJlbmNlczoKLQotQHRhYmxlIEBlbXBoCi1AaXRlbSBQcmVwcm9jZXNzb3IgZGlyZWN0aXZlcwotWW91IGNhbiB1c2UgQHNje2dhc3B9IHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHdpdGhvdXQgYSBsZWFkaW5nIEBzYW1wey59Ci1kb3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiB3cml0ZSBAc2FtcHtTREFUQX0gd2l0aCB0aGUgc2FtZSBlZmZlY3QgYXMKLUBzYW1wey5TREFUQX0uCi0KLUBpdGVtIExPQ0FMCi1PbmUgYWRkaXRpb25hbCBkaXJlY3RpdmUsIEBjb2Rle0xPQ0FMfSwgaXMgYXZhaWxhYmxlLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRvIHVzZQotQGNvZGV7TE9DQUx9LgotCi1AbmVlZCAyMDAwCi1AaXRlbSBTdHJpbmcgZGVsaW1pdGVycwotWW91IGNhbiB3cml0ZSBzdHJpbmdzIGRlbGltaXRlZCBpbiB0aGVzZSBvdGhlciB3YXlzIGJlc2lkZXMKLUBjb2RleyJAdmFye3N0cmluZ30ifToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAnQHZhcntzdHJpbmd9JwotWW91IGNhbiBkZWxpbWl0IHN0cmluZ3Mgd2l0aCBzaW5nbGUtcXVvdGUgY2hhcmF0ZXJzLgotCi1AaXRlbSA8QHZhcntzdHJpbmd9PgotWW91IGNhbiBkZWxpbWl0IHN0cmluZ3Mgd2l0aCBtYXRjaGluZyBhbmdsZSBicmFja2V0cy4KLUBlbmQgdGFibGUKLQotQGl0ZW0gc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgZXNjYXBlCi1UbyBpbmNsdWRlIGFueSBzaW5nbGUgY2hhcmFjdGVyIGxpdGVyYWxseSBpbiBhIHN0cmluZyAoZXZlbiBpZiB0aGUKLWNoYXJhY3RlciB3b3VsZCBvdGhlcndpc2UgaGF2ZSBzb21lIHNwZWNpYWwgbWVhbmluZyksIHlvdSBjYW4gcHJlZml4IHRoZQotY2hhcmFjdGVyIHdpdGggQHNhbXB7IX0gKGFuIGV4Y2xhbWF0aW9uIG1hcmspLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4KLXdyaXRlIEBzYW1wezw0LjMgIT4gNS40ISE+fSB0byBnZXQgdGhlIGxpdGVyYWwgdGV4dCBAc2FtcHs0LjMgPiA1LjQhfS4KLQotQGl0ZW0gRXhwcmVzc2lvbiByZXN1bHRzIGFzIHN0cmluZ3MKLVlvdSBjYW4gd3JpdGUgQHNhbXB7JUB2YXJ7ZXhwcn19IHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIEB2YXJ7ZXhwcn0KLWFuZCB1c2UgdGhlIHJlc3VsdCBhcyBhIHN0cmluZy4gIAotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWQgSW5kZXgKLQotQHByaW50aW5kZXggY3AKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9nYXMvZG9jL2g4LnRleGkgYi9nYXMvZG9jL2g4LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjE3MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9oOC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGNsZWFyIEFMTC1BUkNICi1AY2xlYXIgR0VORVJJQwotQGNsZWFyIElOVEVSTkFMUwotQGNsZWFyIE1VTFRJLU9CSgotQGNsZWFyIEFPVVQKLUBjbGVhciBCT1VUCi1Ac2V0IENPRkYKLUBjbGVhciBFTEYKLUBzZXQgSGl0YWNoaS1hbGwKLUBzZXQgSDgvMzAwCi1Ac2V0IEg4LzUwMAotQHNldCBTSAotQGNsZWFyIERJRkYtVEJMLUtMVUdFCi1Ac2V0IElFRUVGTE9BVAotQGNsZWFyIFczMgotQHNldCBXMTYKLUBzZXQgU1BFQ0lBTC1TWU1TCi1Ac2V0IEFTIGFzCi1Ac2V0IEdDQyBnY2MKLUBzZXQgTEQgbGQKLUBzZXQgVEFSR0VUIEg4LzMwMCBhbmQgSDgvNTAwCi1Ac2V0IFRBUkdFVCBIOC8zMDAsIEg4LzUwMCwgYW5kIEhpdGFjaGkgU0gKLUBzZXQgT0JKLU5BTUUgQ09GRgotQGMKLUBjbGVhciBoYXZlLXN0YWJzCi1Ac2V0IGFibm9ybWFsLXNlcGFyYXRvcgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9pbnRlcm5hbHMudGV4aSBiL2dhcy9kb2MvaW50ZXJuYWxzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOTIxMDUuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9pbnRlcm5hbHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE2ODcgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBpbnRlcm5hbHMuaW5mbwotQG5vZGUgVG9wCi1AdG9wIEFzc2VtYmxlciBJbnRlcm5hbHMKLUByYWlzZXNlY3Rpb25zCi1AY2luZGV4IGludGVybmFscwotCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIGFzc2VtYmxlci4gIEl0IGlzIGluY29tcGxldGUsIGJ1dAotaXQgbWF5IGhlbHAgYSBiaXQuCi0KLVRoaXMgY2hhcHRlciB3YXMgbGFzdCBtb2RpZmllZCBvbiAkRGF0ZSQuICBJdCBpcyBub3QgdXBkYXRlZCByZWd1bGFybHksIGFuZCBpdAotbWF5IGJlIG91dCBvZiBkYXRlLgotCi1AbWVudQotKiBHQVMgdmVyc2lvbnM6OiAgICAgICAgR0FTIHZlcnNpb25zCi0qIERhdGEgdHlwZXM6OgkJRGF0YSB0eXBlcwotKiBHQVMgcHJvY2Vzc2luZzo6ICAgICAgV2hhdCBHQVMgZG9lcyB3aGVuIGl0IHJ1bnMKLSogUG9ydGluZyBHQVM6OiAgICAgICAgIFBvcnRpbmcgR0FTCi0qIFJlbGF4YXRpb246OiAgICAgICAgICBSZWxheGF0aW9uCi0qIEJyb2tlbiB3b3Jkczo6ICAgICAgICBCcm9rZW4gd29yZHMKLSogSW50ZXJuYWwgZnVuY3Rpb25zOjogIEludGVybmFsIGZ1bmN0aW9ucwotKiBUZXN0IHN1aXRlOjogICAgICAgICAgVGVzdCBzdWl0ZQotQGVuZCBtZW51Ci0KLUBub2RlIEdBUyB2ZXJzaW9ucwotQHNlY3Rpb24gR0FTIHZlcnNpb25zCi0KLUdBUyBoYXMgYWNxdWlyZWQgbGF5ZXJzIG9mIGNvZGUgb3ZlciB0aW1lLiAgVGhlIG9yaWdpbmFsIEdBUyBvbmx5IHN1cHBvcnRlZCB0aGUKLWEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCwgd2l0aCB0aHJlZSBzZWN0aW9ucy4gIFN1cHBvcnQgZm9yIG11bHRpcGxlIHNlY3Rpb25zCi1oYXMgYmVlbiBhZGRlZCBpbiB0d28gZGlmZmVyZW50IHdheXMuCi0KLVRoZSBwcmVmZXJyZWQgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZSB2ZXJzaW9uIG9mIEdBUyBjcmVhdGVkIHdoZW4gdGhlIHN5bWJvbAotQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgZGVmaW5lZC4gIFRoZSBvdGhlciB2ZXJzaW9ucyBvZiBHQVMgYXJlIGRvY3VtZW50ZWQgZm9yCi1oaXN0b3JpY2FsIHB1cnBvc2VzLCBhbmQgdG8gaGVscCBhbnlib2R5IHdobyBoYXMgdG8gZGVidWcgY29kZSB3cml0dGVuIGZvcgotdGhlbS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgdXNlZCB0byByZXByZXNlbnQgYSBzZWN0aW9uIGluIGNvZGUgd2hpY2ggbXVzdCB3b3JrCi13aXRoIGFsbCB2ZXJzaW9ucyBvZiBHQVMuCi0KLUBtZW51Ci0qIE9yaWdpbmFsIEdBUzo6ICAgICAgICBPcmlnaW5hbCBHQVMgdmVyc2lvbgotKiBNQU5ZX1NFR01FTlRTOjogICAgICAgTUFOWV9TRUdNRU5UUyBnYXMgdmVyc2lvbgotKiBCRkRfQVNTRU1CTEVSOjogICAgICAgQkZEX0FTU0VNQkxFUiBnYXMgdmVyc2lvbgotQGVuZCBtZW51Ci0KLUBub2RlIE9yaWdpbmFsIEdBUwotQHN1YnNlY3Rpb24gT3JpZ2luYWwgR0FTCi0KLVRoZSBvcmlnaW5hbCBHQVMgb25seSBzdXBwb3J0ZWQgdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aXRoIHRocmVlCi1zZWN0aW9uczogQHNhbXB7LnRleHR9LCBAc2FtcHsuZGF0YX0sIGFuZCBAc2FtcHsuYnNzfS4gIFRoaXMgaXMgdGhlIHZlcnNpb24gb2YKLUdBUyB0aGF0IGlzIGNvbXBpbGVkIGlmIG5laXRoZXIgQGNvZGV7QkZEX0FTU0VNQkxFUn0gbm9yIEBjb2Rle01BTllfU0VHTUVOVFN9Ci1pcyBkZWZpbmVkLiAgVGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBzdGlsbCB1c2VkIGZvciB0aGUgbTY4ay1hb3V0IHRhcmdldCwgYW5kCi1wZXJoYXBzIG90aGVycy4KLQotVGhpcyB2ZXJzaW9uIG9mIEdBUyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueSBuZXcgZGV2ZWxvcG1lbnQuCi0KLVRoZXJlIGlzIHN0aWxsIGNvZGUgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGlzIHZlcnNpb24gb2YgR0FTLCBub3RhYmx5IGluCi1AZmlsZXt3cml0ZS5jfS4gIFRoZXJlIGlzIG5vIHdheSBmb3IgdGhpcyBjb2RlIHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlCi1zZWN0aW9uczsgaXQgc2ltcGx5IGxvb2tzIGF0IGdsb2JhbCB2YXJpYWJsZXMgbGlrZSBAY29kZXt0ZXh0X2ZyYWdfcm9vdH0gYW5kCi1AY29kZXtkYXRhX2ZyYWdfcm9vdH0uCi0KLVRoZSB0eXBlIEBjb2Rle3NlZ1R9IGlzIGFuIGVudW0uCi0KLUBub2RlIE1BTllfU0VHTUVOVFMKLUBzdWJzZWN0aW9uIE1BTllfU0VHTUVOVFMgZ2FzIHZlcnNpb24KLUBjaW5kZXggTUFOWV9TRUdNRU5UUwotCi1UaGUgQGNvZGV7TUFOWV9TRUdNRU5UU30gdmVyc2lvbiBvZiBnYXMgaXMgb25seSB1c2VkIGZvciBDT0ZGLiAgSXQgdXNlcyB0aGUgQkZECi1saWJyYXJ5LCBidXQgaXQgd3JpdGVzIG91dCBhbGwgdGhlIGRhdGEgaXRzZWxmIHVzaW5nIEBjb2Rle2JmZF93cml0ZX0uICBUaGlzCi12ZXJzaW9uIG9mIGdhcyBzdXBwb3J0cyB1cCB0byA0MCBub3JtYWwgc2VjdGlvbnMuICBUaGUgc2VjdGlvbiBuYW1lcyBhcmUgc3RvcmVkCi1pbiB0aGUgQGNvZGV7c2VnX25hbWV9IGFycmF5LiAgT3RoZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZQotQGNvZGV7c2VnbWVudF9pbmZvfSBhcnJheS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgYW4gZW51bS4gIENvZGUgdGhhdCB3YW50cyB0byBleGFtaW5lIGFsbCB0aGUgc2VjdGlvbnMKLWNhbiB1c2UgYSBAY29kZXtzZWdUfSB2YXJpYWJsZSBhcyBsb29wIGluZGV4IGZyb20gQGNvZGV7U0VHX0UwfSB1cCB0byBidXQgbm90Ci1pbmNsdWRpbmcgQGNvZGV7U0VHX1VOS05PV059LgotCi1Nb3N0IG9mIHRoZSBjb2RlIHNwZWNpZmljIHRvIHRoaXMgdmVyc2lvbiBvZiBHQVMgaXMgaW4gdGhlIGZpbGUKLUBmaWxle2NvbmZpZy9vYmotY29mZi5jfSwgaW4gdGhlIHBvcnRpb24gb2YgdGhhdCBmaWxlIHRoYXQgaXMgY29tcGlsZWQgd2hlbgotQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuCi0KLVRoaXMgdmVyc2lvbiBvZiBHQVMgaXMgc3RpbGwgdXNlZCBmb3Igc2V2ZXJhbCBDT0ZGIHRhcmdldHMuCi0KLUBub2RlIEJGRF9BU1NFTUJMRVIKLUBzdWJzZWN0aW9uIEJGRF9BU1NFTUJMRVIgZ2FzIHZlcnNpb24KLUBjaW5kZXggQkZEX0FTU0VNQkxFUgotCi1UaGUgcHJlZmVycmVkIHZlcnNpb24gb2YgR0FTIGlzIHRoZSBAY29kZXtCRkRfQVNTRU1CTEVSfSB2ZXJzaW9uLiAgSW4gdGhpcwotdmVyc2lvbiBvZiBHQVMsIHRoZSBvdXRwdXQgZmlsZSBpcyBhIG5vcm1hbCBCRkQsIGFuZCB0aGUgQkZEIHJvdXRpbmVzIGFyZSB1c2VkCi10byBnZW5lcmF0ZSB0aGUgb3V0cHV0LgotCi1AY29kZXtCRkRfQVNTRU1CTEVSfSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdXNlZCBmb3IgY2VydGFpbiB0YXJnZXRzLCBpbmNsdWRpbmcKLXRob3NlIHRoYXQgdXNlIHRoZSBFTEYsIEVDT0ZGLCBhbmQgU09NIG9iamVjdCBmaWxlIGZvcm1hdHMsIGFuZCBhbHNvIGFsbCBBbHBoYSwKLU1JUFMsIFBvd2VyUEMsIGFuZCBTUEFSQyB0YXJnZXRzLiAgWW91IGNhbiBmb3JjZSB0aGUgdXNlIG9mCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBmb3Igb3RoZXIgdGFyZ2V0cyB3aXRoIHRoZSBjb25maWd1cmUgb3B0aW9uCi1Ac2FtcHstLWVuYWJsZS1iZmQtYXNzZW1ibGVyfTsgaG93ZXZlciwgaXQgaGFzIG5vdCBiZWVuIHRlc3RlZCBmb3IgbWFueQotdGFyZ2V0cywgYW5kIGNhbiBub3QgYmUgYXNzdW1lZCB0byB3b3JrLgotCi1Abm9kZSBEYXRhIHR5cGVzCi1Ac2VjdGlvbiBEYXRhIHR5cGVzCi1AY2luZGV4IGludGVybmFscywgZGF0YSB0eXBlcwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgZnVuZGFtZW50YWwgR0FTIGRhdGEgdHlwZXMuCi0KLUBtZW51Ci0qIFN5bWJvbHM6OiAgICAgICAgICAgICBUaGUgc3ltYm9sUyBzdHJ1Y3R1cmUKLSogRXhwcmVzc2lvbnM6OiAgICAgICAgIFRoZSBleHByZXNzaW9uUyBzdHJ1Y3R1cmUKLSogRml4dXBzOjoJCVRoZSBmaXhTIHN0cnVjdHVyZQotKiBGcmFnczo6ICAgICAgICAgICAgICAgVGhlIGZyYWdTIHN0cnVjdHVyZQotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbHMKLUBjaW5kZXggaW50ZXJuYWxzLCBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGludGVybmFsCi1AY2luZGV4IHN5bWJvbFMgc3RydWN0dXJlCi0KLVRoZSBkZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sIHN0cnVjdHVyZSwgQGNvZGV7c3ltYm9sU30sIGlzIGxvY2F0ZWQgaW4KLUBmaWxle3N0cnVjLXN5bWJvbC5ofS4KLQotSW4gZ2VuZXJhbCwgdGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZSBtYXkgbm90IGJlIHJlZmVycmVkIHRvIGRpcmVjdGx5LgotSW5zdGVhZCwgeW91IG11c3QgdXNlIG9uZSBvZiB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gQGZpbGV7c3ltYm9sLmh9LgotVGhlc2UgYWNjZXNzb3IgZnVuY3Rpb25zIHNob3VsZCB3b3JrIGZvciBhbnkgR0FTIHZlcnNpb24uCi0KLVN5bWJvbCBzdHJ1Y3R1cmVzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gc3lfdmFsdWUKLVRoaXMgaXMgYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHRoYXQgZGVzY3JpYmVzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSXQgbWlnaHQKLXJlZmVyIHRvIG9uZSBvciBtb3JlIG90aGVyIHN5bWJvbHM7IGlmIHNvLCBpdHMgdHJ1ZSB2YWx1ZSBtYXkgbm90IGJlIGtub3duCi11bnRpbCBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0gaXMgY2FsbGVkIGluIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfS4KLQotVGhlIGV4cHJlc3Npb24gaXMgb2Z0ZW4gc2ltcGx5IGEgY29uc3RhbnQuICBCZWZvcmUgQGNvZGV7cmVzb2x2ZV9zeW1ib2xfdmFsdWV9Ci1pcyBjYWxsZWQsIHRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGZyYWcgKEBweHJlZntGcmFnc30pLiAgQWZ0ZXJ3YXJkLAotdGhlIGZyYWcgYWRkcmVzcyBoYXMgYmVlbiBhZGRlZCBpbi4KLQotQGl0ZW0gc3lfcmVzb2x2ZWQKLVRoaXMgZmllbGQgaXMgbm9uLXplcm8gaWYgdGhlIHN5bWJvbCdzIHZhbHVlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVzb2x2ZWQuICBJdAotaXMgdXNlZCBkdXJpbmcgdGhlIGZpbmFsIHBhc3Mgb3ZlciB0aGUgc3ltYm9sIHRhYmxlLgotCi1AaXRlbSBzeV9yZXNvbHZpbmcKLVRoaXMgZmllbGQgaXMgdXNlZCB0byBkZXRlY3QgbG9vcHMgd2hpbGUgcmVzb2x2aW5nIHRoZSBzeW1ib2wncyB2YWx1ZS4KLQotQGl0ZW0gc3lfdXNlZF9pbl9yZWxvYwotVGhpcyBmaWVsZCBpcyBub24temVybyBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvY2F0aW9uIGVudHJ5LiAgSWYgYSBsb2NhbAotc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uIGVudHJ5LCBpdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHJlZGlyZWN0IHRob3NlCi1yZWxvY2F0aW9ucyB0byBvdGhlciBzeW1ib2xzLCBvciB0aGlzIHN5bWJvbCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbAotc3ltYm9sIGxpc3QuCi0KLUBpdGVtIHN5X25leHQKLUBpdGVteCBzeV9wcmV2aW91cwotVGhlc2UgcG9pbnRlcnMgdG8gb3RoZXIgQGNvZGV7c3ltYm9sU30gc3RydWN0dXJlcyBkZXNjcmliZSBhIHNpbmdseSBvciBkb3VibHkKLWxpbmtlZCBsaXN0LiAgKElmIEBjb2Rle1NZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlN9IGlzIG5vdCBkZWZpbmVkLCB0aGUKLUBjb2Rle3N5X3ByZXZpb3VzfSBmaWVsZCB3aWxsIGJlIG9taXR0ZWQ7IEBjb2Rle1NZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlN9IGlzCi1hbHdheXMgZGVmaW5lZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfS4pICBUaGVzZSBmaWVsZHMgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGgKLXRoZSBAY29kZXtzeW1ib2xfbmV4dH0gYW5kIEBjb2Rle3N5bWJvbF9wcmV2aW91c30gbWFjcm9zLgotCi1AaXRlbSBzeV9mcmFnCi1UaGlzIHBvaW50cyB0byB0aGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkgdGhhdCB0aGlzIHN5bWJvbCBpcyBhdHRhY2hlZCB0by4KLQotQGl0ZW0gc3lfdXNlZAotV2hldGhlciB0aGUgc3ltYm9sIGlzIHVzZWQgYXMgYW4gb3BlcmFuZCBvciBpbiBhbiBleHByZXNzaW9uLiAgTm90ZTogTm90IGFsbCBvZgotdGhlIGJhY2tlbmRzIGtlZXAgdGhpcyBpbmZvcm1hdGlvbiBhY2N1cmF0ZTsgYmFja2VuZHMgd2hpY2ggdXNlIHRoaXMgYml0IGFyZQotcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaXQgd2hlbiBhIHN5bWJvbCBpcyB1c2VkIGluIGJhY2tlbmQgcm91dGluZXMuCi0KLUBpdGVtIHN5X21yaV9jb21tb24KLVdoZXRoZXIgdGhlIHN5bWJvbCBpcyBhbiBNUkkgY29tbW9uIHN5bWJvbCBjcmVhdGVkIGJ5IHRoZSBAY29kZXtDT01NT059Ci1wc2V1ZG8tb3Agd2hlbiBhc3NlbWJsaW5nIGluIE1SSSBtb2RlLgotCi1AaXRlbSBic3ltCi1JZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkLCB0aGlzIHBvaW50cyB0byB0aGUgQkZEIEBjb2Rle2FzeW1ib2x9IHRoYXQKLXdpbGwgYmUgdXNlZCBpbiB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4KLQotQGl0ZW0gc3lfbmFtZV9vZmZzZXQKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyB0aGUgcG9zaXRpb24gb2YKLXRoZSBzeW1ib2wncyBuYW1lIGluIHRoZSBzdHJpbmcgdGFibGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgT24gc29tZSBmb3JtYXRzLAotdGhpcyB3aWxsIHN0YXJ0IGF0IHBvc2l0aW9uIDQsIHdpdGggcG9zaXRpb24gMCByZXNlcnZlZCBmb3IgdW5uYW1lZCBzeW1ib2xzLgotVGhpcyBmaWVsZCBpcyBub3QgdXNlZCB1bnRpbCBAY29kZXt3cml0ZV9vYmplY3RfZmlsZX0gaXMgY2FsbGVkLgotCi1AaXRlbSBzeV9zeW1ib2wKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyB0aGUKLWZvcm1hdC1zcGVjaWZpYyBzeW1ib2wgc3RydWN0dXJlLCBhcyBpdCB3b3VsZCBiZSB3cml0dGVuIGludG8gdGhlIG9iamVjdCBmaWxlLgotCi1AaXRlbSBzeV9udW1iZXIKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyBhIDI0LWJpdCBzeW1ib2wKLW51bWJlciwgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgcmVsb2NhdGlvbiB0YWJsZSBlbnRyaWVzLgotCi1AaXRlbSBzeV9vYmoKLVRoaXMgZm9ybWF0LXNwZWNpZmljIGRhdGEgaXMgb2YgdHlwZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0uICBJZiBubyBtYWNybyBieQotdGhhdCBuYW1lIGlzIGRlZmluZWQgaW4gQGZpbGV7b2JqLWZvcm1hdC5ofSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQotQGl0ZW0gc3lfdGMKLVRoaXMgcHJvY2Vzc29yLXNwZWNpZmljIGRhdGEgaXMgb2YgdHlwZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfS4gIElmIG5vIG1hY3JvCi1ieSB0aGF0IG5hbWUgaXMgZGVmaW5lZCBpbiBAZmlsZXt0YXJnLWNwdS5ofSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQotQGVuZCB0YWJsZQotCi1IZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucy4gIFRoZXNlIHNob3VsZCBiZSB1c2VkIHJhdGhlcgotdGhhbiByZWZlcnJpbmcgdG8gdGhlIGZpZWxkcyBvZiBAY29kZXtzeW1ib2xTfSBkaXJlY3RseS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBTX1NFVF9WQUxVRQotQGNpbmRleCBTX1NFVF9WQUxVRQotU2V0IHRoZSBzeW1ib2wncyB2YWx1ZS4KLQotQGl0ZW0gU19HRVRfVkFMVUUKLUBjaW5kZXggU19HRVRfVkFMVUUKLUdldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICBUaGlzIHdpbGwgY2F1c2UgQGNvZGV7cmVzb2x2ZV9zeW1ib2xfdmFsdWV9IHRvIGJlCi1jYWxsZWQgaWYgbmVjZXNzYXJ5LCBzbyBAY29kZXtTX0dFVF9WQUxVRX0gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gaXQgaXMKLXNhZmUgdG8gcmVzb2x2ZSBzeW1ib2xzIChpLmUuLCBhZnRlciB0aGUgZW50aXJlIGlucHV0IGZpbGUgaGFzIGJlZW4gcmVhZCBhbmQKLWFsbCBzeW1ib2xzIGhhdmUgYmVlbiBkZWZpbmVkKS4KLQotQGl0ZW0gU19TRVRfU0VHTUVOVAotQGNpbmRleCBTX1NFVF9TRUdNRU5UCi1TZXQgdGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19HRVRfU0VHTUVOVAotQGNpbmRleCBTX0dFVF9TRUdNRU5UCi1HZXQgdGhlIHN5bWJvbCdzIHNlY3Rpb24uCi0KLUBpdGVtIFNfR0VUX05BTUUKLUBjaW5kZXggU19HRVRfTkFNRQotR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCi0KLUBpdGVtIFNfU0VUX05BTUUKLUBjaW5kZXggU19TRVRfTkFNRQotU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCi0KLUBpdGVtIFNfSVNfRVhURVJOQUwKLUBjaW5kZXggU19JU19FWFRFUk5BTAotUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLgotCi1AaXRlbSBTX0lTX0VYVEVSTgotQGNpbmRleCBTX0lTX0VYVEVSTgotQSBzeW5vbnltIGZvciBAY29kZXtTX0lTX0VYVEVSTkFMfS4gIERvbid0IHVzZSBpdC4KLQotQGl0ZW0gU19JU19XRUFLCi1AY2luZGV4IFNfSVNfV0VBSwotUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgd2Vhay4KLQotQGl0ZW0gU19JU19DT01NT04KLUBjaW5kZXggU19JU19DT01NT04KLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIENvbW1vbiBzeW1ib2xzIGFyZSBzb21ldGltZXMKLXJlcHJlc2VudGVkIGFzIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggYSB2YWx1ZSwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwKLW5vdCBiZSByZWxpYWJsZS4KLQotQGl0ZW0gU19JU19ERUZJTkVECi1AY2luZGV4IFNfSVNfREVGSU5FRAotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxpYWJsZSB3aGVuCi1jYWxsZWQgb24gYSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBTX0lTX0RFQlVHCi1AY2luZGV4IFNfSVNfREVCVUcKLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4KLQotQGl0ZW0gU19JU19MT0NBTAotQGNpbmRleCBTX0lTX0xPQ0FMCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhpcyBpcyBhIGxvY2FsIGFzc2VtYmxlciBzeW1ib2wgd2hpY2ggc2hvdWxkIG5vdCBiZQotaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHN5bWJvbCB0YWJsZS4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgb3Bwb3NpdGUgb2YKLUBjb2Rle1NfSVNfRVhURVJOQUx9LiAgVGhlIEBzYW1wey1MfSBhc3NlbWJsZXIgb3B0aW9uIGFmZmVjdHMgdGhlIHJldHVybiB2YWx1ZQotb2YgdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gU19TRVRfRVhURVJOQUwKLUBjaW5kZXggU19TRVRfRVhURVJOQUwKLU1hcmsgdGhlIHN5bWJvbCBhcyBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfQ0xFQVJfRVhURVJOQUwKLUBjaW5kZXggU19DTEVBUl9FWFRFUk5BTAotTWFyayB0aGUgc3ltYm9sIGFzIG5vdCBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfU0VUX1dFQUsKLUBjaW5kZXggU19TRVRfV0VBSwotTWFyayB0aGUgc3ltYm9sIGFzIHdlYWsuCi0KLUBpdGVtIFNfR0VUX1RZUEUKLUBpdGVtIFNfR0VUX0RFU0MKLUBpdGVtIFNfR0VUX09USEVSCi1AY2luZGV4IFNfR0VUX1RZUEUKLUBjaW5kZXggU19HRVRfREVTQwotQGNpbmRleCBTX0dFVF9PVEhFUgotR2V0IHRoZSBAY29kZXt0eXBlfSwgQGNvZGV7ZGVzY30sIGFuZCBAY29kZXtvdGhlcn0gZmllbGRzIG9mIHRoZSBzeW1ib2wuICBUaGVzZQotYXJlIG9ubHkgZGVmaW5lZCBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBmb3Igd2hpY2ggdGhleSBtYWtlIHNlbnNlIChwcmltYXJpbHkKLWEub3V0KS4KLQotQGl0ZW0gU19TRVRfVFlQRQotQGl0ZW0gU19TRVRfREVTQwotQGl0ZW0gU19TRVRfT1RIRVIKLUBjaW5kZXggU19TRVRfVFlQRQotQGNpbmRleCBTX1NFVF9ERVNDCi1AY2luZGV4IFNfU0VUX09USEVSCi1TZXQgdGhlIEBjb2Rle3R5cGV9LCBAY29kZXtkZXNjfSwgYW5kIEBjb2Rle290aGVyfSBmaWVsZHMgb2YgdGhlIHN5bWJvbC4gIFRoZXNlCi1hcmUgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvciB3aGljaCB0aGV5IG1ha2Ugc2Vuc2UgKHByaW1hcmlseQotYS5vdXQpLgotCi1AaXRlbSBTX0dFVF9TSVpFCi1AY2luZGV4IFNfR0VUX1NJWkUKLUdldCB0aGUgc2l6ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvcgotd2hpY2ggaXQgbWFrZXMgc2Vuc2UgKHByaW1hcmlseSBFTEYpLgotCi1AaXRlbSBTX1NFVF9TSVpFCi1AY2luZGV4IFNfU0VUX1NJWkUKLVNldCB0aGUgc2l6ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvcgotd2hpY2ggaXQgbWFrZXMgc2Vuc2UgKHByaW1hcmlseSBFTEYpLgotCi1AaXRlbSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24KLUBjaW5kZXggc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uCi1HZXQgYSBwb2ludGVyIHRvIGFuIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YKLXRoZSBzeW1ib2wgYXMgYW4gZXhwcmVzc2lvbi4KLQotQGl0ZW0gc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uCi1AY2luZGV4IHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbgotU2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCB0byBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfc2V0X2ZyYWcKLUBjaW5kZXggc3ltYm9sX3NldF9mcmFnCi1TZXQgdGhlIGZyYWcgd2hlcmUgYSBzeW1ib2wgaXMgZGVmaW5lZC4KLQotQGl0ZW0gc3ltYm9sX2dldF9mcmFnCi1AY2luZGV4IHN5bWJvbF9nZXRfZnJhZwotR2V0IHRoZSBmcmFnIHdoZXJlIGEgc3ltYm9sIGlzIGRlZmluZWQuCi0KLUBpdGVtIHN5bWJvbF9tYXJrX3VzZWQKLUBjaW5kZXggc3ltYm9sX21hcmtfdXNlZAotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBpdGVtIHN5bWJvbF9jbGVhcl91c2VkCi1AY2luZGV4IHN5bWJvbF9jbGVhcl91c2VkCi1DbGVhciB0aGUgbWFyayBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgd2FzIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQotQGl0ZW0gc3ltYm9sX3VzZWRfcAotQGNpbmRleCBzeW1ib2xfdXNlZF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCB3YXMgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jCi1AY2luZGV4IHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MKLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gdXNlZCBieSBhIHJlbG9jYXRpb24uCi0KLUBpdGVtIHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jCi1AY2luZGV4IHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jCi1DbGVhciB0aGUgbWFyayBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgd2FzIHVzZWQgaW4gYSByZWxvY2F0aW9uLgotCi1AaXRlbSBzeW1ib2xfdXNlZF9pbl9yZWxvY19wCi1AY2luZGV4IHN5bWJvbF91c2VkX2luX3JlbG9jX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIHdhcyB1c2VkIGluIGEgcmVsb2NhdGlvbi4KLQotQGl0ZW0gc3ltYm9sX21hcmtfbXJpX2NvbW1vbgotQGNpbmRleCBzeW1ib2xfbWFya19tcmlfY29tbW9uCi1NYXJrIGEgc3ltYm9sIGFzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfY2xlYXJfbXJpX2NvbW1vbgotQGNpbmRleCBzeW1ib2xfY2xlYXJfbXJpX2NvbW1vbgotQ2xlYXIgdGhlIG1hcmsgaW5kaWNhdGluZyB0aGF0IGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfbXJpX2NvbW1vbl9wCi1AY2luZGV4IHN5bWJvbF9tcmlfY29tbW9uX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfbWFya193cml0dGVuCi1AY2luZGV4IHN5bWJvbF9tYXJrX3dyaXR0ZW4KLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX2NsZWFyX3dyaXR0ZW4KLUBjaW5kZXggc3ltYm9sX2NsZWFyX3dyaXR0ZW4KLUNsZWFyIHRoZSBtYXJrIGluZGljYXRpbmcgdGhhdCBhIHN5bWJvbCB3YXMgd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX3dyaXR0ZW5fcAotQGNpbmRleCBzeW1ib2xfd3JpdHRlbl9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCB3YXMgd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX21hcmtfcmVzb2x2ZWQKLUBjaW5kZXggc3ltYm9sX21hcmtfcmVzb2x2ZWQKLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gcmVzb2x2ZWQuCi0KLUBpdGVtIHN5bWJvbF9yZXNvbHZlZF9wCi1AY2luZGV4IHN5bWJvbF9yZXNvbHZlZF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiByZXNvbHZlZC4KLQotQGl0ZW0gc3ltYm9sX3NlY3Rpb25fcAotQGNpbmRleCBzeW1ib2xfc2VjdGlvbl9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfZXF1YXRlZF9wCi1AY2luZGV4IHN5bWJvbF9lcXVhdGVkX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9jb25zdGFudF9wCi1AY2luZGV4IHN5bWJvbF9jb25zdGFudF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYSBjb25zdGFudCB2YWx1ZSwgaW5jbHVkaW5nIGJlaW5nIGFuIG9mZnNldCB3aXRoaW4KLXNvbWUgZnJhZy4KLQotQGl0ZW0gc3ltYm9sX2dldF9iZmRzeW0KLUBjaW5kZXggc3ltYm9sX2dldF9iZmRzeW0KLVJldHVybiB0aGUgQkZEIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9zZXRfYmZkc3ltCi1AY2luZGV4IHN5bWJvbF9zZXRfYmZkc3ltCi1TZXQgdGhlIEJGRCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfZ2V0X29iagotQGNpbmRleCBzeW1ib2xfZ2V0X29iagotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgQGNvZGV7T0JKX1NZTUZJRUxEX1RZUEV9IGZpZWxkIG9mIGEgc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfc2V0X29iagotQGNpbmRleCBzeW1ib2xfc2V0X29iagotU2V0IHRoZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0gZmllbGQgb2YgYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9nZXRfdGMKLUBjaW5kZXggc3ltYm9sX2dldF90YwotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgQGNvZGV7VENfU1lNRklFTERfVFlQRX0gZmllbGQgb2YgYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9zZXRfdGMKLUBjaW5kZXggc3ltYm9sX3NldF90YwotU2V0IHRoZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfSBmaWVsZCBvZiBhIHN5bWJvbC4KLQotQGVuZCB0YWJsZQotCi1XaGVuIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQsIEdBUyBhdHRlbXB0cyB0byBzdG9yZSBsb2NhbAotc3ltYm9scy0tc3ltYm9scyB3aGljaCB3aWxsIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS0tdXNpbmcgYQotZGlmZmVyZW50IHN0cnVjdHVyZSwgQGNvZGV7c3RydWN0IGxvY2FsX3N5bWJvbH0uICBUaGlzIHN0cnVjdHVyZSBjYW4gb25seQotcmVwcmVzZW50IHN5bWJvbHMgd2hvc2UgdmFsdWUgaXMgYW4gb2Zmc2V0IHdpdGhpbiBhIGZyYWcuCi0KLUNvZGUgb3V0c2lkZSBvZiB0aGUgc3ltYm9sIGhhbmRsZXIgd2lsbCBhbHdheXMgZGVhbCB3aXRoIEBjb2Rle3N5bWJvbFN9Ci1zdHJ1Y3R1cmVzIGFuZCB1c2UgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucy4gIFRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgY29ycmVjdGx5Ci1kZWFsIHdpdGggbG9jYWwgc3ltYm9scy4gIEBjb2Rle3N0cnVjdCBsb2NhbF9zeW1ib2x9IGlzIG11Y2ggc21hbGxlciB0aGFuCi1AY29kZXtzeW1ib2xTfSAod2hpY2ggYWxzbyBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBiZmQgQGNvZGV7YXN5bWJvbH0KLXN0cnVjdHVyZSksIHNvIHRoaXMgc2F2ZXMgc3BhY2Ugd2hlbiBhc3NlbWJsaW5nIGxhcmdlIGZpbGVzLgotCi1UaGUgZmlyc3QgZmllbGQgb2YgQGNvZGV7c3ltYm9sU30gaXMgQGNvZGV7YnN5bX0sIHRoZSBwb2ludGVyIHRvIHRoZSBCRkQKLXN5bWJvbC4gIFRoZSBmaXJzdCBmaWVsZCBvZiBAY29kZXtzdHJ1Y3QgbG9jYWxfc3ltYm9sfSBpcyBhIHBvaW50ZXIgd2hpY2ggaXMKLWFsd2F5cyBzZXQgdG8gTlVMTC4gIFRoaXMgaXMgaG93IHRoZSBzeW1ib2wgYWNjZXNzb3IgZnVuY3Rpb25zIGNhbiBkaXN0aW5ndWlzaAotbG9jYWwgc3ltYm9scyBmcm9tIG9yZGluYXJ5IHN5bWJvbHMuICBUaGUgc3ltYm9sIGFjY2Vzc29yIGZ1bmN0aW9ucwotYXV0b21hdGljYWxseSBjb252ZXJ0IGEgbG9jYWwgc3ltYm9sIGludG8gYW4gb3JkaW5hcnkgc3ltYm9sIHdoZW4gbmVjZXNzYXJ5LgotCi1Abm9kZSBFeHByZXNzaW9ucwotQHN1YnNlY3Rpb24gRXhwcmVzc2lvbnMKLUBjaW5kZXggaW50ZXJuYWxzLCBleHByZXNzaW9ucwotQGNpbmRleCBleHByZXNzaW9ucywgaW50ZXJuYWwKLUBjaW5kZXggZXhwcmVzc2lvblMgc3RydWN0dXJlCi0KLUV4cHJlc3Npb25zIGFyZSBzdG9yZWQgaW4gYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZS4gIFRoZSBzdHJ1Y3R1cmUgaXMKLWRlZmluZWQgaW4gQGZpbGV7ZXhwci5ofS4KLQotQGNpbmRleCBleHByZXNzaW9uCi1UaGUgbWFjcm8gQGNvZGV7ZXhwcmVzc2lvbn0gd2lsbCBjcmVhdGUgYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBiYXNlZAotb24gdGhlIHRleHQgZm91bmQgYXQgdGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtpbnB1dF9saW5lX3BvaW50ZXJ9LgotCi1AY2luZGV4IG1ha2VfZXhwcl9zeW1ib2wKLUBjaW5kZXggZXhwcl9zeW1ib2xfd2hlcmUKLUEgc2luZ2xlIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgY2FuIHJlcHJlc2VudCBhIHNpbmdsZSBvcGVyYXRpb24uCi1Db21wbGV4IGV4cHJlc3Npb25zIGFyZSBmb3JtZWQgYnkgY3JlYXRpbmcgQGRmbntleHByZXNzaW9uIHN5bWJvbHN9IGFuZAotY29tYmluaW5nIHRoZW0gaW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZXMuICBBbiBleHByZXNzaW9uIHN5bWJvbCBpcwotY3JlYXRlZCBieSBjYWxsaW5nIEBjb2Rle21ha2VfZXhwcl9zeW1ib2x9LiAgQW4gZXhwcmVzc2lvbiBzeW1ib2wgc2hvdWxkCi1uYXR1cmFsbHkgbmV2ZXIgYXBwZWFyIGluIGEgc3ltYm9sIHRhYmxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mCi1AY29kZXtTX0lTX0xPQ0FMfSAoQHB4cmVme1N5bWJvbHN9KSByZWZsZWN0cyB0aGF0LiAgVGhlIGZ1bmN0aW9uCi1AY29kZXtleHByX3N5bWJvbF93aGVyZX0gcmV0dXJucyBub24temVybyBpZiBhIHN5bWJvbCBpcyBhbiBleHByZXNzaW9uIHN5bWJvbCwKLWFuZCBhbHNvIHJldHVybnMgdGhlIGZpbGUgYW5kIGxpbmUgZm9yIHRoZSBleHByZXNzaW9uIHdoaWNoIGNhdXNlZCBpdCB0byBiZQotY3JlYXRlZC4KLQotVGhlIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgaGFzIHR3byBzeW1ib2wgZmllbGRzLCBhIG51bWJlciBmaWVsZCwgYW4KLW9wZXJhdG9yIGZpZWxkLCBhbmQgYSBmaWVsZCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG51bWJlciBpcyB1bnNpZ25lZC4KLQotVGhlIG9wZXJhdG9yIGZpZWxkIGlzIG9mIHR5cGUgQGNvZGV7b3BlcmF0b3JUfSwgYW5kIGRlc2NyaWJlcyBob3cgdG8gaW50ZXJwcmV0Ci10aGUgb3RoZXIgZmllbGRzOyBzZWUgdGhlIGRlZmluaXRpb24gaW4gQGZpbGV7ZXhwci5ofSBmb3IgdGhlIHBvc3NpYmlsaXRpZXMuCi0KLUFuIEBjb2Rle29wZXJhdG9yVH0gdmFsdWUgb2YgQGNvZGV7T19iaWd9IGluZGljYXRlcyBlaXRoZXIgYSBmbG9hdGluZyBwb2ludAotbnVtYmVyLCBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcn0sIG9yCi1hbiBpbnRlZ2VyIHRvIGxhcmdlIHRvIHN0b3JlIGluIGFuIEBjb2Rle29mZnNldFR9IHR5cGUsIHN0b3JlZCBpbiB0aGUgZ2xvYmFsCi1hcnJheSBAY29kZXtnZW5lcmljX2JpZ251bX0uICBUaGlzIHJhdGhlciBpbmZsZXhpYmxlIGFwcHJvYWNoIG1ha2VzIGl0Ci1pbXBvc3NpYmxlIHRvIHVzZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9yIGxhcmdlIGV4cHJlc3Npb25zIGluIGNvbXBsZXgKLWV4cHJlc3Npb25zLgotCi1Abm9kZSBGaXh1cHMKLUBzdWJzZWN0aW9uIEZpeHVwcwotQGNpbmRleCBpbnRlcm5hbHMsIGZpeHVwcwotQGNpbmRleCBmaXh1cHMKLUBjaW5kZXggZml4UyBzdHJ1Y3R1cmUKLQotQSBAZGZue2ZpeHVwfSBpcyBiYXNpY2FsbHkgYW55dGhpbmcgd2hpY2ggY2FuIG5vdCBiZSByZXNvbHZlZCBpbiB0aGUgZmlyc3QKLXBhc3MuICBTb21ldGltZXMgYSBmaXh1cCBjYW4gYmUgcmVzb2x2ZWQgYnkgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHk7IGlmIG5vdCwKLXRoZSBmaXh1cCBiZWNvbWVzIGEgcmVsb2NhdGlvbiBlbnRyeSBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLUBjaW5kZXggZml4X25ldwotQGNpbmRleCBmaXhfbmV3X2V4cAotQSBmaXh1cCBpcyBjcmVhdGVkIGJ5IGEgY2FsbCB0byBAY29kZXtmaXhfbmV3fSBvciBAY29kZXtmaXhfbmV3X2V4cH0uICBCb3RoCi10YWtlIGEgZnJhZyAoQHB4cmVme0ZyYWdzfSksIGEgcG9zaXRpb24gd2l0aGluIHRoZSBmcmFnLCBhIHNpemUsIGFuIGluZGljYXRpb24KLW9mIHdoZXRoZXIgdGhlIGZpeHVwIGlzIFBDIHJlbGF0aXZlLCBhbmQgYSB0eXBlLiAgSW4gYSBAY29kZXtCRkRfQVNTRU1CTEVSfQotR0FTLCB0aGUgdHlwZSBpcyBub21pbmFsbHkgYSBAY29kZXtiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGV9LCBidXQgc2V2ZXJhbAotdGFyZ2V0cyB1c2Ugb3RoZXIgdHlwZSBjb2RlcyB0byByZXByZXNlbnQgZml4dXBzIHRoYXQgY2FuIG5vdCBiZSBkZXNjcmliZWQgYXMKLXJlbG9jYXRpb25zLgotCi1UaGUgQGNvZGV7Zml4U30gc3RydWN0dXJlIGhhcyBhIG51bWJlciBvZiBmaWVsZHMsIHNldmVyYWwgb2Ygd2hpY2ggYXJlIG9ic29sZXRlCi1vciBhcmUgb25seSB1c2VkIGJ5IGEgcGFydGljdWxhciB0YXJnZXQuICBUaGUgaW1wb3J0YW50IGZpZWxkcyBhcmU6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZnhfZnJhZwotVGhlIGZyYWcgKEBweHJlZntGcmFnc30pIHRoaXMgZml4dXAgaXMgaW4uCi0KLUBpdGVtIGZ4X3doZXJlCi1UaGUgbG9jYXRpb24gd2l0aGluIHRoZSBmcmFnIHdoZXJlIHRoZSBmaXh1cCBvY2N1cnMuCi0KLUBpdGVtIGZ4X2FkZHN5Ci1UaGUgc3ltYm9sIHRoaXMgZml4dXAgaXMgYWdhaW5zdC4gIFR5cGljYWxseSwgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGlzIGFkZGVkCi1pbnRvIHRoZSBvYmplY3QgY29udGVudHMuICBUaGlzIG1heSBiZSBOVUxMLgotCi1AaXRlbSBmeF9zdWJzeQotVGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0IGNvbnRlbnRzLiAgVGhpcyBpcwotbm9ybWFsbHkgTlVMTC4KLQotQGl0ZW0gZnhfb2Zmc2V0Ci1BIG51bWJlciB3aGljaCBpcyBhZGRlZCBpbnRvIHRoZSBmaXh1cC4KLQotQGl0ZW0gZnhfYWRkbnVtYmVyCi1Tb21lIENQVSBiYWNrZW5kcyB1c2UgdGhpcyBmaWVsZCB0byBjb252ZXkgaW5mb3JtYXRpb24gYmV0d2VlbgotQGNvZGV7bWRfYXBwbHlfZml4fSBhbmQgQGNvZGV7dGNfZ2VuX3JlbG9jfS4gIFRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgZG9lcwotbm90IHVzZSBpdC4KLQotQGl0ZW0gZnhfbmV4dAotVGhlIG5leHQgZml4dXAgaW4gdGhlIHNlY3Rpb24uCi0KLUBpdGVtIGZ4X3JfdHlwZQotVGhlIHR5cGUgb2YgdGhlIGZpeHVwLiAgVGhpcyBmaWVsZCBpcyBvbmx5IGRlZmluZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0sIG9yCi1pZiB0aGUgdGFyZ2V0IGRlZmluZXMgQGNvZGV7TkVFRF9GWF9SX1RZUEV9LgotCi1AaXRlbSBmeF9zaXplCi1UaGUgc2l6ZSBvZiB0aGUgZml4dXAuICBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBlcnJvciBjaGVja2luZy4KLQotQGl0ZW0gZnhfcGNyZWwKLVdoZXRoZXIgdGhlIGZpeHVwIGlzIFBDIHJlbGF0aXZlLgotCi1AaXRlbSBmeF9kb25lCi1Ob24temVybyBpZiB0aGUgZml4dXAgaGFzIGJlZW4gYXBwbGllZCwgYW5kIG5vIHJlbG9jYXRpb24gZW50cnkgbmVlZHMgdG8gYmUKLWdlbmVyYXRlZC4KLQotQGl0ZW0gZnhfZmlsZQotQGl0ZW14IGZ4X2xpbmUKLVRoZSBmaWxlIGFuZCBsaW5lIHdoZXJlIHRoZSBmaXh1cCB3YXMgY3JlYXRlZC4KLQotQGl0ZW0gdGNfZml4X2RhdGEKLVRoaXMgaGFzIHRoZSB0eXBlIEBjb2Rle1RDX0ZJWF9UWVBFfSwgYW5kIGlzIG9ubHkgZGVmaW5lZCBpZiB0aGUgdGFyZ2V0IGRlZmluZXMKLXRoYXQgbWFjcm8uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEZyYWdzCi1Ac3Vic2VjdGlvbiBGcmFncwotQGNpbmRleCBpbnRlcm5hbHMsIGZyYWdzCi1AY2luZGV4IGZyYWdzCi1AY2luZGV4IGZyYWdTIHN0cnVjdHVyZS4KLQotVGhlIEBjb2Rle2ZyYWdTfSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBAZmlsZXthcy5ofS4gIEVhY2ggZnJhZyByZXByZXNlbnRzIGEKLXBvcnRpb24gb2YgdGhlIGZpbmFsIG9iamVjdCBmaWxlLiAgQXMgR0FTIHJlYWRzIHRoZSBzb3VyY2UgZmlsZSwgaXQgY3JlYXRlcwotZnJhZ3MgdG8gaG9sZCB0aGUgZGF0YSB0aGF0IGl0IHJlYWRzLiAgQXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkgdGhlIGZyYWdzIGFuZAotZml4dXBzIGFyZSBwcm9jZXNzZWQgdG8gcHJvZHVjZSB0aGUgZmluYWwgY29udGVudHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZnJfYWRkcmVzcwotVGhlIGFkZHJlc3Mgb2YgdGhlIGZyYWcuICBUaGlzIGlzIG5vdCBzZXQgdW50aWwgdGhlIGFzc2VtYmxlciByZXNjYW5zIHRoZSBsaXN0Ci1vZiBhbGwgZnJhZ3MgYWZ0ZXIgdGhlIGVudGlyZSBpbnB1dCBmaWxlIGlzIHBhcnNlZC4gIFRoZSBmdW5jdGlvbgotQGNvZGV7cmVsYXhfc2VnbWVudH0gZmlsbHMgaW4gdGhpcyBmaWVsZC4KLQotQGl0ZW0gZnJfbmV4dAotUG9pbnRlciB0byB0aGUgbmV4dCBmcmFnIGluIHRoaXMgKHN1YilzZWN0aW9uLgotCi1AaXRlbSBmcl9maXgKLUZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gZW1pdCB0byB0aGUgb3V0cHV0IGZpbGUuICBNYXkKLWJlIHplcm8uCi0KLUBpdGVtIGZyX3ZhcgotVmFyaWFibGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgbWF5IG91dHB1dCwgYWZ0ZXIgdGhlIGluaXRpYWwgQGNvZGV7ZnJfZml4fQotY2hhcmFjdGVycy4gIE1heSBiZSB6ZXJvLgotCi1AaXRlbSBmcl9vZmZzZXQKLVRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGZpZWxkIGlzIGNvbnRyb2xsZWQgYnkgQGNvZGV7ZnJfdHlwZX0uICBHZW5lcmFsbHksCi1pZiBAY29kZXtmcl92YXJ9IGlzIG5vbi16ZXJvLCB0aGlzIGlzIGEgcmVwZWF0IGNvdW50OiB0aGUgQGNvZGV7ZnJfdmFyfQotY2hhcmFjdGVycyBhcmUgb3V0cHV0IEBjb2Rle2ZyX29mZnNldH0gdGltZXMuCi0KLUBpdGVtIGxpbmUKLUhvbGRzIGxpbmUgbnVtYmVyIGluZm8gd2hlbiBhbiBhc3NlbWJsZXIgbGlzdGluZyB3YXMgcmVxdWVzdGVkLgotCi1AaXRlbSBmcl90eXBlCi1SZWxheGF0aW9uIHN0YXRlLiAgVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGludGVycHJldGF0aW9uIG9mIEBjb2Rle2ZyX29mZnNldH0sCi1AY29kZXtmcl9zeW1ib2x9IGFuZCB0aGUgdmFyaWFibGUtbGVuZ3RoIHRhaWwgb2YgdGhlIGZyYWcsIGFzIHdlbGwgYXMgdGhlCi10cmVhdG1lbnQgaXQgZ2V0cyBpbiB2YXJpb3VzIHBoYXNlcyBvZiBwcm9jZXNzaW5nLiAgSXQgZG9lcyBub3QgYWZmZWN0IHRoZQotaW5pdGlhbCBAY29kZXtmcl9maXh9IGNoYXJhY3RlcnM7IHRoZXkgYXJlIGFsd2F5cyBzdXBwb3NlZCB0byBiZSBvdXRwdXQKLXZlcmJhdGltIChmaXh1cHMgYXNpZGUpLiAgU2VlIGJlbG93IGZvciBzcGVjaWZpYyB2YWx1ZXMgdGhpcyBmaWVsZCBjYW4gaGF2ZS4KLQotQGl0ZW0gZnJfc3VidHlwZQotUmVsYXhhdGlvbiBzdWJzdGF0ZS4gIElmIHRoZSBtYWNybyBAY29kZXttZF9yZWxheF9mcmFnfSBpc24ndCBkZWZpbmVkLCB0aGlzIGlzCi1hc3N1bWVkIHRvIGJlIGFuIGluZGV4IGludG8gQGNvZGV7VENfR0VORVJJQ19SRUxBWF9UQUJMRX0gZm9yIHRoZSBnZW5lcmljCi1yZWxheGF0aW9uIGNvZGUgdG8gcHJvY2VzcyAoQHB4cmVme1JlbGF4YXRpb259KS4gIElmIEBjb2Rle21kX3JlbGF4X2ZyYWd9IGlzCi1kZWZpbmVkLCB0aGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgYW55IHVzZSBieSB0aGUgQ1BVLXNwZWNpZmljIGNvZGUuCi0KLUBpdGVtIGZyX3N5bWJvbAotVGhpcyBub3JtYWxseSBpbmRpY2F0ZXMgdGhlIHN5bWJvbCB0byB1c2Ugd2hlbiByZWxheGluZyB0aGUgZnJhZyBhY2NvcmRpbmcgdG8KLUBjb2Rle2ZyX3R5cGV9LgotCi1AaXRlbSBmcl9vcGNvZGUKLVBvaW50cyB0byB0aGUgbG93ZXN0LWFkZHJlc3NlZCBieXRlIG9mIHRoZSBvcGNvZGUsIGZvciB1c2UgaW4gcmVsYXhhdGlvbi4KLQotQGl0ZW0gdGNfZnJhZ19kYXRhCi1UYXJnZXQgc3BlY2lmaWMgZnJhZ21lbnQgZGF0YSBvZiB0eXBlIFRDX0ZSQUdfVFlQRS4KLU9ubHkgcHJlc2VudCBpZiBAY29kZXtUQ19GUkFHX1RZUEV9IGlzIGRlZmluZWQuCi0KLUBpdGVtIGZyX2ZpbGUKLUBpdGVteCBmcl9saW5lCi1UaGUgZmlsZSBhbmQgbGluZSB3aGVyZSB0aGlzIGZyYWcgd2FzIGxhc3QgbW9kaWZpZWQuCi0KLUBpdGVtIGZyX2xpdGVyYWwKLURlY2xhcmVkIGFzIGEgb25lLWNoYXJhY3RlciBhcnJheSwgdGhpcyBsYXN0IGZpZWxkIGdyb3dzIGFyYml0cmFyaWx5IGxhcmdlIHRvCi1ob2xkIHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlIGZyYWcuCi1AZW5kIHRhYmxlCi0KLVRoZXNlIGFyZSB0aGUgcG9zc2libGUgcmVsYXhhdGlvbiBzdGF0ZXMsIHByb3ZpZGVkIGluIHRoZSBlbnVtZXJhdGlvbiB0eXBlCi1AY29kZXtyZWxheF9zdGF0ZVR9LCBhbmQgdGhlIGludGVycHJldGF0aW9ucyB0aGV5IHJlcHJlc2VudCBmb3IgdGhlIG90aGVyCi1maWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcnNfYWxpZ24KLUBpdGVteCByc19hbGlnbl9jb2RlCi1UaGUgc3RhcnQgb2YgdGhlIGZvbGxvd2luZyBmcmFnIHNob3VsZCBiZSBhbGlnbmVkIG9uIHNvbWUgYm91bmRhcnkuICBJbiB0aGlzCi1mcmFnLCBAY29kZXtmcl9vZmZzZXR9IGlzIHRoZSBsb2dhcml0aG0gKGJhc2UgMikgb2YgdGhlIGFsaWdubWVudCBpbiBieXRlcy4KLShGb3IgZXhhbXBsZSwgaWYgYWxpZ25tZW50IG9uIGFuIDgtYnl0ZSBib3VuZGFyeSB3ZXJlIGRlc2lyZWQsIEBjb2Rle2ZyX29mZnNldH0KLXdvdWxkIGhhdmUgYSB2YWx1ZSBvZiAzLikgIFRoZSB2YXJpYWJsZSBjaGFyYWN0ZXJzIGluZGljYXRlIHRoZSBmaWxsIHBhdHRlcm4gdG8KLWJlIHVzZWQuICBUaGUgQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAKLXdoZW4gZG9pbmcgdGhpcyBhbGlnbm1lbnQuICBJZiBtb3JlIGJ5dGVzIGFyZSBuZWVkZWQsIHRoZSBhbGlnbm1lbnQgaXMgbm90Ci1kb25lLiAgQW4gQGNvZGV7ZnJfc3VidHlwZX0gdmFsdWUgb2YgMCBtZWFucyBubyBtYXhpbXVtLCB3aGljaCBpcyB0aGUgbm9ybWFsCi1jYXNlLiAgVGFyZ2V0IGJhY2tlbmRzIGNhbiB1c2UgQGNvZGV7cnNfYWxpZ25fY29kZX0gdG8gaGFuZGxlIGNlcnRhaW4gdHlwZXMgb2YKLWFsaWdubWVudCBkaWZmZXJlbnRseS4KLQotQGl0ZW0gcnNfYnJva2VuX3dvcmQKLVRoaXMgaW5kaWNhdGVzIHRoYXQgYGBicm9rZW4gd29yZCcnIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGRvbmUgKEBweHJlZntCcm9rZW4KLXdvcmRzfSkuICBJZiBicm9rZW4gd29yZCBwcm9jZXNzaW5nIGlzIG5vdCBuZWNlc3Nhcnkgb24gdGhlIHRhcmdldCBtYWNoaW5lLAotdGhpcyBlbnVtZXJhdG9yIHZhbHVlIHdpbGwgbm90IGJlIGRlZmluZWQuCi0KLUBpdGVtIHJzX2NmYQotVGhpcyBzdGF0ZSBpcyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gZnJhbWUgb3B0aW1pemF0aW9ucy4gIFRoZQotQGNvZGV7ZnJfc3ltYm9sfSBpcyBhbiBleHByZXNzaW9uIHN5bWJvbCBmb3IgdGhlIHN1YnRyYWN0aW9uIHdoaWNoIG1heSBiZQotcmVsYXhlZC4gIFRoZSBAY29kZXtmcl9vcGNvZGV9IGZpZWxkIGhvbGRzIHRoZSBmcmFnIGZvciB0aGUgcHJlY2VkaW5nIGNvbW1hbmQKLWJ5dGUuICBUaGUgQGNvZGV7ZnJfb2Zmc2V0fSBmaWVsZCBob2xkcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGF0IGZyYWcuICBUaGUKLUBjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIGlzIHVzZWQgZHVyaW5nIHJlbGF4YXRpb24gdG8gaG9sZCB0aGUgY3VycmVudCBzaXplIG9mCi10aGUgZnJhZy4KLQotQGl0ZW0gcnNfZmlsbAotVGhlIHZhcmlhYmxlIGNoYXJhY3RlcnMgYXJlIHRvIGJlIHJlcGVhdGVkIEBjb2Rle2ZyX29mZnNldH0gdGltZXMuICBJZgotQGNvZGV7ZnJfb2Zmc2V0fSBpcyAwLCB0aGlzIGZyYWcgaGFzIGEgbGVuZ3RoIG9mIEBjb2Rle2ZyX2ZpeH0uICBNb3N0IGZyYWdzCi1oYXZlIHRoaXMgdHlwZS4KLQotQGl0ZW0gcnNfbGViMTI4Ci1UaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBEV0FSRiBgYGxpdHRsZSBlbmRpYW4gYmFzZSAxMjgnJyAKLXZhcmlhYmxlIGxlbmd0aCBudW1iZXIgZm9ybWF0LiAgVGhlIEBjb2Rle2ZyX3N5bWJvbH0gaXMgYWx3YXlzIGFuIGV4cHJlc3Npb24KLXN5bWJvbCwgYXMgY29uc3RhbnQgZXhwcmVzc2lvbnMgYXJlIGVtaXR0ZWQgZGlyZWN0bHkuICBUaGUgQGNvZGV7ZnJfb2Zmc2V0fQotZmllbGQgaXMgdXNlZCBkdXJpbmcgcmVsYXhhdGlvbiB0byBob2xkIHRoZSBwcmV2aW91cyBzaXplIG9mIHRoZSBudW1iZXIgc28KLXRoYXQgd2UgY2FuIGRldGVybWluZSBpZiB0aGUgZnJhZ21lbnQgY2hhbmdlZCBzaXplLgotCi1AaXRlbSByc19tYWNoaW5lX2RlcGVuZGVudAotRGlzcGxhY2VtZW50IHJlbGF4YXRpb24gaXMgdG8gYmUgZG9uZSBvbiB0aGlzIGZyYWcuICBUaGUgdGFyZ2V0IGlzIGluZGljYXRlZCBieQotQGNvZGV7ZnJfc3ltYm9sfSBhbmQgQGNvZGV7ZnJfb2Zmc2V0fSwgYW5kIEBjb2Rle2ZyX3N1YnR5cGV9IGluZGljYXRlcyB0aGUKLXBhcnRpY3VsYXIgbWFjaGluZS1zcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGUgZGVzaXJlZC4gIEB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSByc19vcmcKLVRoZSBzdGFydCBvZiB0aGUgZm9sbG93aW5nIGZyYWcgc2hvdWxkIGJlIHB1c2hlZCBiYWNrIHRvIHNvbWUgc3BlY2lmaWMgb2Zmc2V0Ci13aXRoaW4gdGhlIHNlY3Rpb24uICAoU29tZSBhc3NlbWJsZXJzIHVzZSB0aGUgdmFsdWUgYXMgYW4gYWJzb2x1dGUgYWRkcmVzczsgR0FTCi1kb2VzIG5vdCBoYW5kbGUgZmluYWwgYWJzb2x1dGUgYWRkcmVzc2VzLCBidXQgcmF0aGVyIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmtlcgotc2V0IHRoZW0uKSAgVGhlIG9mZnNldCBpcyBnaXZlbiBieSBAY29kZXtmcl9zeW1ib2x9IGFuZCBAY29kZXtmcl9vZmZzZXR9OyBvbmUKLWNoYXJhY3RlciBmcm9tIHRoZSB2YXJpYWJsZS1sZW5ndGggdGFpbCBpcyB1c2VkIGFzIHRoZSBmaWxsIGNoYXJhY3Rlci4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBmcmNoYWluUyBzdHJ1Y3R1cmUKLUEgY2hhaW4gb2YgZnJhZ3MgaXMgYnVpbHQgdXAgZm9yIGVhY2ggc3Vic2VjdGlvbi4gIFRoZSBkYXRhIHN0cnVjdHVyZQotZGVzY3JpYmluZyBhIGNoYWluIGlzIGNhbGxlZCBhIEBjb2Rle2ZyY2hhaW5TfSwgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLWZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmcmNoX3Jvb3QKLVBvaW50cyB0byB0aGUgZmlyc3QgZnJhZyBpbiB0aGUgY2hhaW4uICBNYXkgYmUgTlVMTCBpZiB0aGVyZSBhcmUgbm8gZnJhZ3MgaW4KLXRoaXMgY2hhaW4uCi1AaXRlbSBmcmNoX2xhc3QKLVBvaW50cyB0byB0aGUgbGFzdCBmcmFnIGluIHRoZSBjaGFpbiwgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm9uZS4KLUBpdGVtIGZyY2hfbmV4dAotTmV4dCBpbiB0aGUgbGlzdCBvZiBAY29kZXtmcmNoYWluU30gc3RydWN0dXJlcy4KLUBpdGVtIGZyY2hfc2VnCi1JbmRpY2F0ZXMgdGhlIHNlY3Rpb24gdGhpcyBmcmFnIGNoYWluIGJlbG9uZ3MgdG8uCi1AaXRlbSBmcmNoX3N1YnNlZwotU3Vic2VjdGlvbiAoc3Vic2VnbWVudCkgbnVtYmVyIG9mIHRoaXMgZnJhZyBjaGFpbi4KLUBpdGVtIGZpeF9yb290LCBmaXhfdGFpbAotKERlZmluZWQgb25seSBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkKS4gIFBvaW50IHRvIGZpcnN0IGFuZCBsYXN0Ci1AY29kZXtmaXhTfSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNlY3Rpb24uCi1AaXRlbSBmcmNoX29ic3RhY2sKLU5vdCBjdXJyZW50bHkgdXNlZC4gIEludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGZyYWcgYWxsb2NhdGlvbiBmb3IgdGhpcwotc3Vic2VjdGlvbi4gIFRoaXMgc2hvdWxkIHJlZHVjZSBmcmFnIGdlbmVyYXRpb24gY2F1c2VkIGJ5IHN3aXRjaGluZyBzZWN0aW9ucy4KLUBpdGVtIGZyY2hfZnJhZ19ub3cKLVRoZSBjdXJyZW50IGZyYWcgZm9yIHRoaXMgc3Vic2VnbWVudC4KLUBlbmQgdGFibGUKLQotQSBAY29kZXtmcmNoYWluU30gY29ycmVzcG9uZHMgdG8gYSBzdWJzZWN0aW9uOyBlYWNoIHNlY3Rpb24gaGFzIGEgbGlzdCBvZgotQGNvZGV7ZnJjaGFpblN9IHJlY29yZHMgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSW4gbW9zdCBjYXNlcywgb25seSBvbmUgc3Vic2VjdGlvbgotb2YgZWFjaCBzZWN0aW9uIGlzIHVzZWQsIHNvIHRoZSBsaXN0IHdpbGwgb25seSBiZSBvbmUgZWxlbWVudCBsb25nLCBidXQgYW55Ci1wcm9jZXNzaW5nIG9mIGZyYWcgY2hhaW5zIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggbXVsdGlwbGUgY2hhaW5zIHBlcgotc2VjdGlvbi4KLQotQWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCwgYW5kIG5vIG1vcmUgZnJhZ3MgYXJlIHRvCi1iZSBnZW5lcmF0ZWQsIHRoZSBmcmFnIGNoYWlucyBhcmUgam9pbmVkIGludG8gb25lIHBlciBzZWN0aW9uIGZvciBmdXJ0aGVyCi1wcm9jZXNzaW5nLiAgQWZ0ZXIgdGhpcyBwb2ludCwgaXQgaXMgc2FmZSB0byBvcGVyYXRlIG9uIG9uZSBjaGFpbiBwZXIgc2VjdGlvbi4KLQotVGhlIGFzc2VtYmxlciBhbHdheXMgaGFzIGEgY3VycmVudCBmcmFnLCBuYW1lZCBAY29kZXtmcmFnX25vd30uICBNb3JlIHNwYWNlIGlzCi1hbGxvY2F0ZWQgZm9yIHRoZSBjdXJyZW50IGZyYWcgdXNpbmcgdGhlIEBjb2Rle2ZyYWdfbW9yZX0gZnVuY3Rpb247IHRoaXMKLXJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbW91bnQgb2YgcmVxdWVzdGVkIHNwYWNlLiAgUmVsYXhpbmcgaXMgZG9uZSB1c2luZwotdmFyaWFudCBmcmFncyBhbGxvY2F0ZWQgYnkgQGNvZGV7ZnJhZ192YXJ9IG9yIEBjb2Rle2ZyYWdfdmFyaWFudH0KLShAcHhyZWZ7UmVsYXhhdGlvbn0pLgotCi1Abm9kZSBHQVMgcHJvY2Vzc2luZwotQHNlY3Rpb24gV2hhdCBHQVMgZG9lcyB3aGVuIGl0IHJ1bnMKLUBjaW5kZXggaW50ZXJuYWxzLCBvdmVydmlldwotCi1UaGlzIGlzIGEgcXVpY2sgbG9vayBhdCB3aGF0IGFuIGFzc2VtYmxlciBydW4gbG9va3MgbGlrZS4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBhc3NlbWJsZXIgaW5pdGlhbGl6ZXMgaXRzZWxmIGJ5IGNhbGxpbmcgdmFyaW91cyBpbml0IHJvdXRpbmVzLgotCi1AaXRlbQotRm9yIGVhY2ggc291cmNlIGZpbGUsIHRoZSBAY29kZXtyZWFkX2Ffc291cmNlX2ZpbGV9IGZ1bmN0aW9uIHJlYWRzIGluIHRoZSBmaWxlCi1hbmQgcGFyc2VzIGl0LiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtpbnB1dF9saW5lX3BvaW50ZXJ9IHBvaW50cyB0byB0aGUKLWN1cnJlbnQgdGV4dDsgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IHVwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGJ1dCBub3QKLWZhcnRoZXIuCi0KLUBpdGVtCi1Gb3IgZWFjaCBsaW5lLCB0aGUgYXNzZW1ibGVyIHBhc3NlcyBsYWJlbHMgdG8gdGhlIEBjb2Rle2NvbG9ufSBmdW5jdGlvbiwgYW5kCi1pc29sYXRlcyB0aGUgZmlyc3Qgd29yZC4gIElmIGl0IGxvb2tzIGxpa2UgYSBwc2V1ZG8tb3AsIHRoZSB3b3JkIGlzIGxvb2tlZCB1cAotaW4gdGhlIHBzZXVkby1vcCBoYXNoIHRhYmxlIEBjb2Rle3BvX2hhc2h9IGFuZCBkaXNwYXRjaGVkIHRvIGEgcHNldWRvLW9wCi1yb3V0aW5lLiAgT3RoZXJ3aXNlLCB0aGUgdGFyZ2V0IGRlcGVuZGVudCBAY29kZXttZF9hc3NlbWJsZX0gcm91dGluZSBpcyBjYWxsZWQKLXRvIHBhcnNlIHRoZSBpbnN0cnVjdGlvbi4KLQotQGl0ZW0KLVdoZW4gcHNldWRvLW9wcyBvciBpbnN0cnVjdGlvbnMgb3V0cHV0IGRhdGEsIHRoZXkgYWRkIGl0IHRvIGEgZnJhZywgY2FsbGluZwotQGNvZGV7ZnJhZ19tb3JlfSB0byBnZXQgc3BhY2UgdG8gc3RvcmUgaXQgaW4uCi0KLUBpdGVtCi1Qc2V1ZG8tb3BzIGFuZCBpbnN0cnVjdGlvbnMgY2FuIGFsc28gb3V0cHV0IGZpeHVwcyBjcmVhdGVkIGJ5IEBjb2Rle2ZpeF9uZXd9IG9yCi1AY29kZXtmaXhfbmV3X2V4cH0uCi0KLUBpdGVtCi1Gb3IgY2VydGFpbiB0YXJnZXRzLCBpbnN0cnVjdGlvbnMgY2FuIGNyZWF0ZSB2YXJpYW50IGZyYWdzIHdoaWNoIGFyZSB1c2VkIHRvCi1zdG9yZSByZWxheGF0aW9uIGluZm9ybWF0aW9uIChAcHhyZWZ7UmVsYXhhdGlvbn0pLgotCi1AaXRlbQotV2hlbiB0aGUgaW5wdXQgZmlsZSBpcyBmaW5pc2hlZCwgdGhlIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfSByb3V0aW5lIGlzCi1jYWxsZWQuICBJdCBhc3NpZ25zIGFkZHJlc3NlcyB0byBhbGwgdGhlIGZyYWdzIChAY29kZXtyZWxheF9zZWdtZW50fSksIHJlc29sdmVzCi1hbGwgdGhlIGZpeHVwcyAoQGNvZGV7Zml4dXBfc2VnbWVudH0pLCByZXNvbHZlcyBhbGwgdGhlIHN5bWJvbCB2YWx1ZXMgKHVzaW5nCi1AY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0pLCBhbmQgZmluYWxseSB3cml0ZXMgb3V0IHRoZSBmaWxlIChpbiB0aGUKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IGNhc2UsIHRoaXMgaXMgZG9uZSBieSBzaW1wbHkgY2FsbGluZyBAY29kZXtiZmRfY2xvc2V9KS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBQb3J0aW5nIEdBUwotQHNlY3Rpb24gUG9ydGluZyBHQVMKLUBjaW5kZXggcG9ydGluZwotCi1FYWNoIEdBUyB0YXJnZXQgc3BlY2lmaWVzIHR3byBtYWluIHRoaW5nczogdGhlIENQVSBmaWxlIGFuZCB0aGUgb2JqZWN0IGZvcm1hdAotZmlsZS4gIFR3byBtYWluIHN3aXRjaGVzIGluIHRoZSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaGFuZGxlIHRoaXMuICBUaGUKLWZpcnN0IHN3aXRjaGVzIG9uIENQVSB0eXBlIHRvIHNldCB0aGUgc2hlbGwgdmFyaWFibGUgQGNvZGV7Y3B1X3R5cGV9LiAgVGhlCi1zZWNvbmQgc3dpdGNoZXMgb24gdGhlIGVudGlyZSB0YXJnZXQgdG8gc2V0IHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtmbXR9LgotCi1UaGUgY29uZmlndXJlIHNjcmlwdCB1c2VzIHRoZSB2YWx1ZSBvZiBAY29kZXtjcHVfdHlwZX0gdG8gc2VsZWN0IHR3byBmaWxlcyBpbgotdGhlIEBmaWxle2NvbmZpZ30gZGlyZWN0b3J5OiBAZmlsZXt0Yy1AdmFye0NQVX0uY30gYW5kIEBmaWxle3RjLUB2YXJ7Q1BVfS5ofS4KLVRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle3RhcmctY3B1Lmh9IGluIHRoZQotYnVpbGQgZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIEBmaWxle3RjLUB2YXJ7Q1BVfS5ofS4KLQotVGhlIGNvbmZpZ3VyZSBzY3JpcHQgYWxzbyB1c2VzIHRoZSB2YWx1ZSBvZiBAY29kZXtmbXR9IHRvIHNlbGVjdCB0d28gZmlsZXM6Ci1AZmlsZXtvYmotQHZhcntmbXR9LmN9IGFuZCBAZmlsZXtvYmotQHZhcntmbXR9Lmh9LiAgVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcwotd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle29iai1mb3JtYXQuaH0gaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSB3aGljaAotaW5jbHVkZXMgQGZpbGV7b2JqLUB2YXJ7Zm10fS5ofS4KLQotWW91IGNhbiBhbHNvIHNldCB0aGUgZW11bGF0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGJ5IHNldHRpbmcgdGhlIEBjb2Rle2VtfQotdmFyaWFibGUuICBOb3JtYWxseSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAc2FtcHtnZW5lcmljfSBpcyBmaW5lLiAgVGhlCi1jb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle3RhcmctZW52Lmh9IGluIHRoZSBidWlsZAotZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIEBmaWxle3RlLUB2YXJ7ZW19Lmh9LgotCi1Qb3J0aW5nIEdBUyB0byBhIG5ldyBDUFUgcmVxdWlyZXMgd3JpdGluZyB0aGUgQGZpbGV7dGMtQHZhcntDUFV9fSBmaWxlcy4KLVBvcnRpbmcgR0FTIHRvIGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCByZXF1aXJlcyB3cml0aW5nIHRoZQotQGZpbGV7b2JqLUB2YXJ7Zm10fX0gZmlsZXMuICBUaGVyZSBpcyBzb21ldGltZXMgc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZXNlCi10d28gZmlsZXMsIGJ1dCBpdCBpcyBub3JtYWxseSBtaW5pbWFsLgotCi1UaGUgYmVzdCBhcHByb2FjaCBpcywgb2YgY291cnNlLCB0byBjb3B5IGV4aXN0aW5nIGZpbGVzLiAgVGhlIGRvY3VtZW50YXRpb24KLWJlbG93IGFzc3VtZXMgdGhhdCB5b3UgYXJlIGxvb2tpbmcgYXQgZXhpc3RpbmcgZmlsZXMgdG8gc2VlIHVzYWdlIGRldGFpbHMuCi0KLVRoZXNlIGludGVyZmFjZXMgaGF2ZSBncm93biBvdmVyIHRpbWUsIGFuZCBoYXZlIG5ldmVyIGJlZW4gY2FyZWZ1bGx5IHRob3VnaHQKLW91dCBvciBkZXNpZ25lZC4gIE5vdGhpbmcgYWJvdXQgdGhlIGludGVyZmFjZXMgZGVzY3JpYmVkIGhlcmUgaXMgY2FzdCBpbiBzdG9uZS4KLUl0IGlzIHBvc3NpYmxlIHRoYXQgdGhleSB3aWxsIGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgdG8gdGhlCi1uZXh0LiAgQWxzbywgbmV3IG1hY3JvcyBhcmUgYWRkZWQgYWxsIHRoZSB0aW1lIGFzIHRoZXkgYXJlIG5lZWRlZC4KLQotQG1lbnUKLSogQ1BVIGJhY2tlbmQ6OiAgICAgICAgICAgICAgICAgV3JpdGluZyBhIENQVSBiYWNrZW5kCi0qIE9iamVjdCBmb3JtYXQgYmFja2VuZDo6ICAgICAgIFdyaXRpbmcgYW4gb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi0qIEVtdWxhdGlvbnM6OiAgICAgICAgICAgICAgICAgIFdyaXRpbmcgZW11bGF0aW9uIGZpbGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQ1BVIGJhY2tlbmQKLUBzdWJzZWN0aW9uIFdyaXRpbmcgYSBDUFUgYmFja2VuZAotQGNpbmRleCBDUFUgYmFja2VuZAotQGNpbmRleCBAZmlsZXt0Yy1AdmFye0NQVX19Ci0KLVRoZSBDUFUgYmFja2VuZCBmaWxlcyBhcmUgdGhlIGhlYXJ0IG9mIHRoZSBhc3NlbWJsZXIuICBUaGV5IGFyZSB0aGUgb25seSBwYXJ0cwotb2YgdGhlIGFzc2VtYmxlciB3aGljaCBhY3R1YWxseSBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlCi1wcm9jZXNzb3IuCi0KLVlvdSBtdXN0IGRlZmluZSBhIHJlYXNvbmFibHkgc21hbGwgbGlzdCBvZiBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBpbiB0aGUgQ1BVCi1iYWNrZW5kIGZpbGVzLiAgWW91IG1heSBkZWZpbmUgYSBsYXJnZSBudW1iZXIgb2YgYWRkaXRpb25hbCBtYWNyb3MgaW4gdGhlIENQVQotYmFja2VuZCBmaWxlcywgbm90IGFsbCBvZiB3aGljaCBhcmUgZG9jdW1lbnRlZCBoZXJlLiAgWW91IG11c3QsIG9mIGNvdXJzZSwKLWRlZmluZSBtYWNyb3MgaW4gdGhlIEBmaWxley5ofSBmaWxlLCB3aGljaCBpcyBpbmNsdWRlZCBieSBldmVyeSBhc3NlbWJsZXIKLXNvdXJjZSBmaWxlLiAgWW91IG1heSBkZWZpbmUgdGhlIGZ1bmN0aW9ucyBhcyBtYWNyb3MgaW4gdGhlIEBmaWxley5ofSBmaWxlLCBvcgotYXMgZnVuY3Rpb25zIGluIHRoZSBAZmlsZXsuY30gZmlsZS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBUQ19AdmFye0NQVX0KLUBjaW5kZXggVENfQHZhcntDUFV9Ci1CeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIGluIHRoZSBAZmlsZXsuaH0gZmlsZS4gIEZvcgotZXhhbXBsZSwgQGZpbGV7dGMtbTY4ay5ofSBkZWZpbmVzIEBjb2Rle1RDX002OEt9LiAgWW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoaXMKLWlmIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgQ1BVIHNwZWNpZmljIGNvZGUgdG8gdGhlIG9iamVjdCBmb3JtYXQgZmlsZS4KLQotQGl0ZW0gVEFSR0VUX0ZPUk1BVAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIHRhcmdldCBuYW1lIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLXdpbGwgbm9ybWFsbHkgZGVwZW5kIHVwb24gdGhlIEBjb2Rle09CSl9AdmFye0ZNVH19IG1hY3JvLgotCi1AaXRlbSBUQVJHRVRfQVJDSAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIGFyY2hpdGVjdHVyZSB0byBwYXNzIHRvIEBjb2Rle2JmZF9zZXRfYXJjaF9tYWNofS4KLQotQGl0ZW0gVEFSR0VUX01BQ0gKLVRoaXMgbWFjcm8gaXMgdGhlIEJGRCBtYWNoaW5lIG51bWJlciB0byBwYXNzIHRvIEBjb2Rle2JmZF9zZXRfYXJjaF9tYWNofS4gIElmCi1pdCBpcyBub3QgZGVmaW5lZCwgR0FTIHdpbGwgdXNlIDAuCi0KLUBpdGVtIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi1Zb3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIHRvIGJlIG5vbi16ZXJvIGlmIHRoZSB0YXJnZXQgaXMgYmlnIGVuZGlhbiwgYW5kCi16ZXJvIGlmIHRoZSB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbi4KLQotQGl0ZW0gbWRfc2hvcnRvcHRzCi1AaXRlbXggbWRfbG9uZ29wdHMKLUBpdGVteCBtZF9sb25nb3B0c19zaXplCi1AaXRlbXggbWRfcGFyc2Vfb3B0aW9uCi1AaXRlbXggbWRfc2hvd191c2FnZQotQGNpbmRleCBtZF9zaG9ydG9wdHMKLUBjaW5kZXggbWRfbG9uZ29wdHMKLUBjaW5kZXggbWRfbG9uZ29wdHNfc2l6ZQotQGNpbmRleCBtZF9wYXJzZV9vcHRpb24KLUBjaW5kZXggbWRfc2hvd191c2FnZQotR0FTIHVzZXMgdGhlc2UgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZHVyaW5nIG9wdGlvbiBwcm9jZXNzaW5nLgotQGNvZGV7bWRfc2hvcnRvcHRzfSBpcyBhIEBjb2Rle2NvbnN0IGNoYXIgKn0gd2hpY2ggR0FTIGFkZHMgdG8gdGhlIG1hY2hpbmUKLWluZGVwZW5kZW50IHN0cmluZyBwYXNzZWQgdG8gQGNvZGV7Z2V0b3B0fS4gIEBjb2Rle21kX2xvbmdvcHRzfSBpcyBhCi1AY29kZXtzdHJ1Y3Qgb3B0aW9uIFtdfSB3aGljaCBHQVMgYWRkcyB0byB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBsb25nIG9wdGlvbnMKLXBhc3NlZCB0byBAY29kZXtnZXRvcHR9OyB5b3UgbWF5IHVzZSBAY29kZXtPUFRJT05fTURfQkFTRX0sIGRlZmluZWQgaW4KLUBmaWxle2FzLmh9LCBhcyB0aGUgc3RhcnQgb2YgYSBzZXQgb2YgbG9uZyBvcHRpb24gaW5kaWNlcywgaWYgbmVjZXNzYXJ5LgotQGNvZGV7bWRfbG9uZ29wdHNfc2l6ZX0gaXMgYSBAY29kZXtzaXplX3R9IGhvbGRpbmcgdGhlIHNpemUgQGNvZGV7bWRfbG9uZ29wdHN9LgotR0FTIHdpbGwgY2FsbCBAY29kZXttZF9wYXJzZV9vcHRpb259IHdoZW5ldmVyIEBjb2Rle2dldG9wdH0gcmV0dXJucyBhbgotdW5yZWNvZ25pemVkIGNvZGUsIHByZXN1bWFibHkgaW5kaWNhdGluZyBhIHNwZWNpYWwgY29kZSB2YWx1ZSB3aGljaCBhcHBlYXJzIGluCi1AY29kZXttZF9sb25nb3B0c30uICBHQVMgd2lsbCBjYWxsIEBjb2Rle21kX3Nob3dfdXNhZ2V9IHdoZW4gYSB1c2FnZSBtZXNzYWdlIGlzCi1wcmludGVkOyBpdCBzaG91bGQgcHJpbnQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjaGluZSBzcGVjaWZpYyBvcHRpb25zLgotCi1AaXRlbSBtZF9iZWdpbgotQGNpbmRleCBtZF9iZWdpbgotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgYXNzZW1ibHksIGFmdGVyIHRoZSBjb21tYW5kCi1saW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIGFuZCBhbGwgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb25zCi1oYXZlIGJlZW4gY29tcGxldGVkLgotCi1AaXRlbSBtZF9jbGVhbnVwCi1AY2luZGV4IG1kX2NsZWFudXAKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIGVhY2ggaW5wdXQgZmlsZS4KLQotQGl0ZW0gbWRfYXNzZW1ibGUKLUBjaW5kZXggbWRfYXNzZW1ibGUKLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBpbnB1dCBsaW5lIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYQotcHNldWRvLW9wLiAgVGhlIGFyZ3VtZW50IGlzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSBmdW5jdGlvbiBzaG91bGQKLWFzc2VtYmxlIHRoZSBzdHJpbmcgYXMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBvcGVyYW5kcy4gIE5vcm1hbGx5Ci1AY29kZXttZF9hc3NlbWJsZX0gd2lsbCBkbyB0aGlzIGJ5IGNhbGxpbmcgQGNvZGV7ZnJhZ19tb3JlfSBhbmQgd3JpdGluZyBvdXQKLXNvbWUgYnl0ZXMgKEBweHJlZntGcmFnc30pLiAgQGNvZGV7bWRfYXNzZW1ibGV9IHdpbGwgY2FsbCBAY29kZXtmaXhfbmV3fSB0bwotY3JlYXRlIGZpeHVwcyBhcyBuZWVkZWQgKEBweHJlZntGaXh1cHN9KS4gIFRhcmdldHMgd2hpY2ggbmVlZCB0byBkbyBzcGVjaWFsCi1wdXJwb3NlIHJlbGF4YXRpb24gd2lsbCBjYWxsIEBjb2Rle2ZyYWdfdmFyfS4KLQotQGl0ZW0gbWRfcHNldWRvX3RhYmxlCi1AY2luZGV4IG1kX3BzZXVkb190YWJsZQotVGhpcyBpcyBhIGNvbnN0IGFycmF5IG9mIHR5cGUgQGNvZGV7cHNldWRvX3R5cGVTfS4gIEl0IGlzIGEgbWFwcGluZyBmcm9tCi1wc2V1ZG8tb3AgbmFtZXMgdG8gZnVuY3Rpb25zLiAgWW91IHNob3VsZCB1c2UgdGhpcyB0YWJsZSB0byBpbXBsZW1lbnQKLXBzZXVkby1vcHMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHRoZSBDUFUuCi0KLUBpdGVtIHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCi1AY2luZGV4IHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIEdBUyB3aWxsIGNhbGwgaXQgd2l0aCBhIEBjb2Rle3BzZXVkb190eXBlU30gYXJndW1lbnQuCi1JdCBzaG91bGQgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBwc2V1ZG8tb3AgaXMgYSBjb25kaXRpb25hbCB3aGljaCBjb250cm9scwotd2hldGhlciBjb2RlIGlzIGFzc2VtYmxlZCwgc3VjaCBhcyBAc2FtcHsuaWZ9LiAgR0FTIGtub3dzIGFib3V0IHRoZSBub3JtYWwKLWNvbmRpdGlvbmFsIHBzZXVkby1vcHMsYW5kIHlvdSBzaG91bGQgbm9ybWFsbHkgbm90IGhhdmUgdG8gZGVmaW5lIHRoaXMgbWFjcm8uCi0KLUBpdGVtIGNvbW1lbnRfY2hhcnMKLUBjaW5kZXggY29tbWVudF9jaGFycwotVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEKLWNvbW1lbnQuCi0KLUBpdGVtIHRjX2NvbW1lbnRfY2hhcnMKLUBjaW5kZXggdGNfY29tbWVudF9jaGFycwotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBHQVMgd2lsbCB1c2UgaXQgaW5zdGVhZCBvZiBAY29kZXtjb21tZW50X2NoYXJzfS4KLQotQGl0ZW0gdGNfc3ltYm9sX2NoYXJzCi1AY2luZGV4IHRjX3N5bWJvbF9jaGFycwotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBpcyBhIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgbGlzdCBvZgotY2hhcmFjdGVycyB3aGljaCBtYXkgYXBwZWFyIGluIGFuIG9wZXJhbmQuICBHQVMgYWxyZWFkeSBhc3N1bWVzIHRoYXQgYWxsCi1hbHBoYW51bWJlcmljIGNoYXJhY3RlcnMsIGFuZCBAc2FtcHskfSwgQHNhbXB7Ln0sIGFuZCBAc2FtcHtffSBtYXkgYXBwZWFyIGluIGFuCi1vcGVyYW5kIChzZWUgQHNhbXB7c3ltYm9sX2NoYXJzfSBpbiBAZmlsZXthcHAuY30pLiAgVGhpcyBtYWNybyBtYXkgYmUgZGVmaW5lZAotdG8gdHJlYXQgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFzIGFwcGVhcmluZyBpbiBhbiBvcGVyYW5kLiAgVGhpcyBhZmZlY3RzIHRoZQotd2F5IGluIHdoaWNoIEdBUyByZW1vdmVzIHdoaXRlc3BhY2UgYmVmb3JlIHBhc3NpbmcgdGhlIHN0cmluZyB0bwotQHNhbXB7bWRfYXNzZW1ibGV9LgotCi1AaXRlbSBsaW5lX2NvbW1lbnRfY2hhcnMKLUBjaW5kZXggbGluZV9jb21tZW50X2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYQotY29tbWVudCB3aGVuIHRoZXkgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCi0KLUBpdGVtIGxpbmVfc2VwYXJhdG9yX2NoYXJzCi1AY2luZGV4IGxpbmVfc2VwYXJhdG9yX2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc2VwYXJhdGUKLWxpbmVzIChzZW1pY29sb24gYW5kIG5ld2xpbmUgYXJlIHN1Y2ggY2hhcmFjdGVycyBieSBkZWZhdWx0LCBhbmQgbmVlZCBub3QgYmUKLWxpc3RlZCBpbiB0aGlzIGFycmF5KS4KLQotQGl0ZW0gRVhQX0NIQVJTCi1AY2luZGV4IEVYUF9DSEFSUwotVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIG1heSBiZQotdXNlZCBhcyB0aGUgZXhwb25lbnQgY2hhcmFjdGVyIGluIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgVGhpcyBpcyBub3JtYWxseQotQGNvZGV7ImVFIn0uCi0KLUBpdGVtIEZMVF9DSEFSUwotQGNpbmRleCBGTFRfQ0hBUlMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBtYXkgYmUKLXVzZWQgdG8gaW5kaWNhdGUgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gIEEgemVybyBmb2xsb3dlZCBieSBvbmUgb2YgdGhlc2UKLWNoYXJhY3RlcnMgaXMgYXNzdW1lZCB0byBiZSBmb2xsb3dlZCBieSBhIGZsb2F0aW5nIHBvaW50IG51bWJlcjsgdGh1cyB0aGV5Ci1vcGVyYXRlIHRoZSB3YXkgdGhhdCBAY29kZXsweH0gaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGhleGFkZWNpbWFsIGNvbnN0YW50LgotVXN1YWxseSB0aGlzIGluY2x1ZGVzIEBzYW1we3J9IGFuZCBAc2FtcHtmfS4KLQotQGl0ZW0gTEVYX0FUCi1AY2luZGV4IExFWF9BVAotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBAa2Jke0B9fSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgaXMgemVyby4KLQotTGV4aWNhbCB0eXBlcyBhcmUgYSBjb21iaW5hdGlvbiBvZiBAY29kZXtMRVhfTkFNRX0gYW5kIEBjb2Rle0xFWF9CRUdJTl9OQU1FfSwKLWJvdGggZGVmaW5lZCBpbiBAZmlsZXtyZWFkLmh9LiAgQGNvZGV7TEVYX05BTUV9IGluZGljYXRlcyB0aGF0IHRoZSBjaGFyYWN0ZXIKLW1heSBhcHBlYXIgaW4gYSBuYW1lLiAgQGNvZGV7TEVYX0JFR0lOX05BTUV9IGluZGljYXRlcyB0aGF0IHRoZSBjaGFyYWN0ZXIgbWF5Ci1hcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5lbS4KLQotQGl0ZW0gTEVYX0JSCi1AY2luZGV4IExFWF9CUgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBicmFjZSBjaGFyYWN0ZXJzIEBrYmR7QHt9LAotQGtiZHtAfX0sIEBrYmR7W30sIGFuZCBAa2Jke119LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgemVyby4KLQotQGl0ZW0gTEVYX1BDVAotQGNpbmRleCBMRVhfUENUCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7JX0gY2hhcmFjdGVyLiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIHplcm8uCi0KLUBpdGVtIExFWF9RTQotQGNpbmRleCBMRVhfUU0KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHs/fSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXQgemVyby4KLQotQGl0ZW0gTEVYX0RPTExBUgotQGNpbmRleCBMRVhfRE9MTEFSCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7JH0gY2hhcmFjdGVyLiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIEBjb2Rle0xFWF9OQU1FIHwgTEVYX0JFR0lOX05BTUV9LgotCi1AaXRlbSBTSU5HTEVfUVVPVEVfU1RSSU5HUwotQGNpbmRleCBTSU5HTEVfUVVPVEVfU1RSSU5HUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCB0cmVhdCBzaW5nbGUgcXVvdGVzIGFzIHN0cmluZyBkZWxpbWl0ZXJzLgotTm9ybWFsbHkgb25seSBkb3VibGUgcXVvdGVzIGFyZSBhY2NlcHRlZCBhcyBzdHJpbmcgZGVsaW1pdGVycy4KLQotQGl0ZW0gTk9fU1RSSU5HX0VTQ0FQRVMKLUBjaW5kZXggTk9fU1RSSU5HX0VTQ0FQRVMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgbm90IHBlcm1pdCBlc2NhcGUgc2VxdWVuY2VzIGluIGEgc3RyaW5nLgotCi1AaXRlbSBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLUBjaW5kZXggT05MWV9TVEFOREFSRF9FU0NBUEVTCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHdhcm4gYWJvdXQgdGhlIHVzZSBvZiBub25zdGFuZGFyZCBlc2NhcGUKLXNlcXVlbmNlcyBpbiBhIHN0cmluZy4KLQotQGl0ZW0gbWRfc3RhcnRfbGluZV9ob29rCi1AY2luZGV4IG1kX3N0YXJ0X2xpbmVfaG9vawotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBzdGFydCBvZiBlYWNoIGxpbmUuCi0KLUBpdGVtIExBQkVMU19XSVRIT1VUX0NPTE9OUwotQGNpbmRleCBMQUJFTFNfV0lUSE9VVF9DT0xPTlMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgYXNzdW1lIHRoYXQgYW55IHRleHQgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZQotaXMgYSBsYWJlbCwgZXZlbiBpZiBpdCBkb2VzIG5vdCBoYXZlIGEgY29sb24uCi0KLUBpdGVtIFRDX1NUQVJUX0xBQkVMCi1AY2luZGV4IFRDX1NUQVJUX0xBQkVMCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGNvbnRyb2wgd2hhdCBHQVMgY29uc2lkZXJzIHRvIGJlIGEgbGFiZWwuICBUaGUKLWRlZmF1bHQgZGVmaW5pdGlvbiBpcyB0byBhY2NlcHQgYW55IG5hbWUgZm9sbG93ZWQgYnkgYSBjb2xvbiBjaGFyYWN0ZXIuCi0KLUBpdGVtIE5PX1BTRVVET19ET1QKLUBjaW5kZXggTk9fUFNFVURPX0RPVAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBub3QgcmVxdWlyZSBwc2V1ZG8tb3BzIHRvIHN0YXJ0IHdpdGggYQotQGtiZHsufSBjaGFyYWN0ZXIuCi0KLUBpdGVtIFRDX0VRVUFMX0lOX0lOU04KLUBjaW5kZXggVENfRVFVQUxfSU5fSU5TTgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBzaG91bGQgcmV0dXJuIG5vbnplcm8gaWYgdGhlIGluc3RydWN0aW9uIGlzCi1wZXJtaXR0ZWQgdG8gY29udGFpbiBhbiBAa2Jkez19IGNoYXJhY3Rlci4gIEdBUyB3aWxsIHVzZSB0aGlzIHRvIGRlY2lkZSBpZiBhCi1Aa2Jkez19IGlzIGFuIGFzc2lnbm1lbnQgb3IgYW4gaW5zdHJ1Y3Rpb24uCi0KLUBpdGVtIFRDX0VPTF9JTl9JTlNOCi1AY2luZGV4IFRDX0VPTF9JTl9JTlNOCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gbm9uemVybyBpZiB0aGUgY3VycmVudCBpbnB1dCBsaW5lCi1wb2ludGVyIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRoZSBlbmQgb2YgYSBsaW5lLgotCi1AaXRlbSBtZF9wYXJzZV9uYW1lCi1AY2luZGV4IG1kX3BhcnNlX25hbWUKLUlmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgR0FTIHdpbGwgY2FsbCBpdCBmb3IgYW55IHN5bWJvbCBmb3VuZCBpbiBhbgotZXhwcmVzc2lvbi4gIFlvdSBjYW4gZGVmaW5lIHRoaXMgdG8gaGFuZGxlIHNwZWNpYWwgc3ltYm9scyBpbiBhIHNwZWNpYWwgd2F5LgotSWYgYSBzeW1ib2wgYWx3YXlzIGhhcyBhIGNlcnRhaW4gdmFsdWUsIHlvdSBzaG91bGQgbm9ybWFsbHkgZW50ZXIgaXQgaW4gdGhlCi1zeW1ib2wgdGFibGUsIHBlcmhhcHMgdXNpbmcgQGNvZGV7cmVnX3NlY3Rpb259LgotCi1AaXRlbSBtZF91bmRlZmluZWRfc3ltYm9sCi1AY2luZGV4IG1kX3VuZGVmaW5lZF9zeW1ib2wKLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgc3ltYm9sIHRhYmxlIGxvb2t1cCBmYWlscywgYmVmb3JlIGl0Ci1jcmVhdGVzIGEgbmV3IHN5bWJvbC4gIFR5cGljYWxseSB0aGlzIHdvdWxkIGJlIHVzZWQgdG8gc3VwcGx5IHN5bWJvbHMgd2hvc2UKLW5hbWUgb3IgdmFsdWUgY2hhbmdlcyBkeW5hbWljYWxseSwgcG9zc2libHkgaW4gYSBjb250ZXh0IHNlbnNpdGl2ZSB3YXkuCi1QcmVkZWZpbmVkIHN5bWJvbHMgd2l0aCBmaXhlZCB2YWx1ZXMsIHN1Y2ggYXMgcmVnaXN0ZXIgbmFtZXMgb3IgY29uZGl0aW9uCi1jb2RlcywgYXJlIHR5cGljYWxseSBlbnRlcmVkIGRpcmVjdGx5IGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aGVuIEBjb2Rle21kX2JlZ2lufQotaXMgY2FsbGVkLgotCi1AaXRlbSBtZF9vcGVyYW5kCi1AY2luZGV4IG1kX29wZXJhbmQKLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYW55IGV4cHJlc3Npb24gdGhhdCBjYW4gbm90IGJlIHJlY29nbml6ZWQuCi1XaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQsIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0gd2lsbCBwb2ludCB0byB0aGUgc3RhcnQKLW9mIHRoZSBleHByZXNzaW9uLgotCi1AaXRlbSB0Y191bnJlY29nbml6ZWRfbGluZQotQGNpbmRleCB0Y191bnJlY29nbml6ZWRfbGluZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IHdoZW4gaXQgZmluZHMgYSBsaW5lIHRoYXQgaXQgY2FuIG5vdAotcGFyc2UuCi0KLUBpdGVtIG1kX2RvX2FsaWduCi1AY2luZGV4IG1kX2RvX2FsaWduCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGhhbmRsZSBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlLiAgR0FTIHdpbGwgY2FsbCBpdAotd2hlbiB0aGUgZGlyZWN0aXZlIGlzIHNlZW4gaW4gdGhlIGlucHV0IGZpbGUuICBGb3IgZXhhbXBsZSwgdGhlIGkzODYgYmFja2VuZAotdXNlcyB0aGlzIHRvIGdlbmVyYXRlIGVmZmljaWVudCBub3AgaW5zdHJ1Y3Rpb25zIG9mIHZhcnlpbmcgbGVuZ3RocywgZGVwZW5kaW5nCi11cG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgYWxpZ25tZW50IHdpbGwgc2tpcC4KLQotQGl0ZW0gSEFORExFX0FMSUdOCi1AY2luZGV4IEhBTkRMRV9BTElHTgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBkbyBzcGVjaWFsIGhhbmRsaW5nIGZvciBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlLgotR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseS4KLQotQGl0ZW0gbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLUBjaW5kZXggbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBlYWNoIHRpbWUgaXQgc2tpcHMgYW55IHNwYWNlIGJlY2F1c2Ugb2YgYQotc3BhY2UgZmlsbGluZyBvciBhbGlnbm1lbnQgb3IgZGF0YSBhbGxvY2F0aW9uIHBzZXVkby1vcC4KLQotQGl0ZW0gVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi1AY2luZGV4IFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBwYXJzZSBhbiBleHByZXNzaW9uIHVzZWQgaW4gYSBkYXRhIGFsbG9jYXRpb24KLXBzZXVkby1vcCBzdWNoIGFzIEBjb2Rley53b3JkfS4gIFlvdSBjYW4gdXNlIHRoaXMgdG8gcmVjb2duaXplIHJlbG9jYXRpb24KLWRpcmVjdGl2ZXMgdGhhdCBtYXkgYXBwZWFyIGluIHN1Y2ggZGlyZWN0aXZlcy4KLQotQGl0ZW0gQklURklFTERfQ09OU19FWFBSRVNTSU9OCi1AY2luZGV4IEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCByZWNvZ25pemUgYml0ZmllbGQgaW5zdHJ1Y3Rpb25zIGluIGRhdGEKLWFsbG9jYXRpb24gcHNldWRvLW9wcywgYXMgdXNlZCBvbiB0aGUgaTk2MC4KLQotQGl0ZW0gUkVQRUFUX0NPTlNfRVhQUkVTU0lPTgotQGNpbmRleCBSRVBFQVRfQ09OU19FWFBSRVNTSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHJlY29nbml6ZSByZXBlYXQgY291bnRzIGluIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wcywgYXMgdXNlZCBvbiB0aGUgTUlQUy4KLQotQGl0ZW0gbWRfY29uc19hbGlnbgotQGNpbmRleCBtZF9jb25zX2FsaWduCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGRvIGFueSBzcGVjaWFsIGFsaWdubWVudCBiZWZvcmUgYSBkYXRhIGFsbG9jYXRpb24KLXBzZXVkby1vcC4KLQotQGl0ZW0gVENfQ09OU19GSVhfTkVXCi1AY2luZGV4IFRDX0NPTlNfRklYX05FVwotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciBhIGRhdGEgYWxsb2NhdGlvbiBwc2V1ZG8tb3AuCi0KLUBpdGVtIFRDX0lOSVRfRklYX0RBVEEgKEB2YXJ7Zml4cH0pCi1AY2luZGV4IFRDX0lOSVRfRklYX0RBVEEKLUEgQyBzdGF0ZW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IHNwZWNpZmljIGZpZWxkcyBvZiBmaXh1cCBAdmFye2ZpeHB9LgotVGhlc2UgZmllbGRzIGFyZSBkZWZpbmVkIHdpdGggdGhlIEBjb2Rle1RDX0ZJWF9UWVBFfSBtYWNyby4KLQotQGl0ZW0gVENfRklYX0RBVEFfUFJJTlQgKEB2YXJ7c3RyZWFtfSwgQHZhcntmaXhwfSkKLUBjaW5kZXggVENfRklYX0RBVEFfUFJJTlQKLUEgQyBzdGF0ZW1lbnQgdG8gb3V0cHV0IHRhcmdldCBzcGVjaWZpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yCi1maXh1cCBAdmFye2ZpeHB9IHRvIEB2YXJ7c3RyZWFtfS4gIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGJ5IEBjb2Rle3ByaW50X2ZpeHVwfS4KLQotQGl0ZW0gVENfRlJBR19JTklUIChAdmFye2ZyYWdwfSkKLUBjaW5kZXggVENfRlJBR19JTklUCi1BIEMgc3RhdGVtZW50IHRvIGluaXRpYWxpemUgdGhlIHRhcmdldCBzcGVjaWZpYyBmaWVsZHMgb2YgZnJhZyBAdmFye2ZyYWdwfS4KLVRoZXNlIGZpZWxkcyBhcmUgZGVmaW5lZCB3aXRoIHRoZSBAY29kZXtUQ19GUkFHX1RZUEV9IG1hY3JvLgotCi1AaXRlbSBtZF9udW1iZXJfdG9fY2hhcnMKLUBjaW5kZXggbWRfbnVtYmVyX3RvX2NoYXJzCi1UaGlzIHNob3VsZCBqdXN0IGNhbGwgZWl0aGVyIEBjb2Rle251bWJlcl90b19jaGFyc19iaWdlbmRpYW59IG9yCi1AY29kZXtudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFufSwgd2hpY2hldmVyIGlzIGFwcHJvcHJpYXRlLiAgT24gdGFyZ2V0cyBsaWtlCi10aGUgTUlQUyB3aGljaCBzdXBwb3J0IG9wdGlvbnMgdG8gY2hhbmdlIHRoZSBlbmRpYW5uZXNzLCB3aGljaCBmdW5jdGlvbiB0byBjYWxsCi1pcyBhIHJ1bnRpbWUgZGVjaXNpb24uICBPbiBvdGhlciB0YXJnZXRzLCBAY29kZXttZF9udW1iZXJfdG9fY2hhcnN9IGNhbiBiZSBhCi1zaW1wbGUgbWFjcm8uCi0KLUBpdGVtIG1kX3JlbG9jX3NpemUKLUBjaW5kZXggbWRfcmVsb2Nfc2l6ZQotVGhpcyB2YXJpYWJsZSBpcyBvbmx5IHVzZWQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgZ2FzIChub3QKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IGFuZCBub3QgQGNvZGV7TUFOWV9TRUdNRU5UU30pLiAgSXQgaG9sZHMgdGhlIHNpemUgb2YgYQotcmVsb2NhdGlvbiBlbnRyeS4KLQotQGl0ZW0gV09SS0lOR19ET1RfV09SRAotQGl0ZW14IG1kX3Nob3J0X2p1bXBfc2l6ZQotQGl0ZW14IG1kX2xvbmdfanVtcF9zaXplCi1AaXRlbXggbWRfY3JlYXRlX3Nob3J0X2p1bXAKLUBpdGVteCBtZF9jcmVhdGVfbG9uZ19qdW1wCi1AY2luZGV4IFdPUktJTkdfRE9UX1dPUkQKLUBjaW5kZXggbWRfc2hvcnRfanVtcF9zaXplCi1AY2luZGV4IG1kX2xvbmdfanVtcF9zaXplCi1AY2luZGV4IG1kX2NyZWF0ZV9zaG9ydF9qdW1wCi1AY2luZGV4IG1kX2NyZWF0ZV9sb25nX2p1bXAKLUlmIEBjb2Rle1dPUktJTkdfRE9UX1dPUkR9IGlzIGRlZmluZWQsIEdBUyB3aWxsIG5vdCBkbyBicm9rZW4gd29yZCBwcm9jZXNzaW5nCi0oQHB4cmVme0Jyb2tlbiB3b3Jkc30pLiAgT3RoZXJ3aXNlLCB5b3Ugc2hvdWxkIHNldCBAY29kZXttZF9zaG9ydF9qdW1wX3NpemV9IHRvCi10aGUgc2l6ZSBvZiBhIHNob3J0IGp1bXAgKGEganVtcCB0aGF0IGlzIGp1c3QgbG9uZyBlbm91Z2ggdG8ganVtcCBhcm91bmQgYSBsb25nCi1qbXApIGFuZCBAY29kZXttZF9sb25nX2p1bXBfc2l6ZX0gdG8gdGhlIHNpemUgb2YgYSBsb25nIGp1bXAgKGEganVtcCB0aGF0IGNhbgotZ28gYW55d2hlcmUgaW4gdGhlIGZ1bmN0aW9uKSwgWW91IHNob3VsZCBkZWZpbmUgQGNvZGV7bWRfY3JlYXRlX3Nob3J0X2p1bXB9IHRvCi1jcmVhdGUgYSBzaG9ydCBqdW1wIGFyb3VuZCBhIGxvbmcganVtcCwgYW5kIGRlZmluZSBAY29kZXttZF9jcmVhdGVfbG9uZ19qdW1wfQotdG8gY3JlYXRlIGEgbG9uZyBqdW1wLgotCi1AaXRlbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAotQGNpbmRleCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAotVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBzaXplIG9mIGEgQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9Ci1mcmFnIGJlZm9yZSBhbnkgcmVsYXhpbmcgaXMgZG9uZS4gIEl0IG1heSBhbHNvIGNyZWF0ZSBhbnkgbmVjZXNzYXJ5Ci1yZWxvY2F0aW9ucy4KLQotQGl0ZW0gbWRfcmVsYXhfZnJhZwotQGNpbmRleCBtZF9yZWxheF9mcmFnCi1UaGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkIHRvIHJlbGF4IGEgZnJhZy4gIEdBUyB3aWxsIGNhbGwgdGhpcyB3aXRoIHRoZSBmcmFnCi1hbmQgdGhlIGNoYW5nZSBpbiBzaXplIG9mIGFsbCBwcmV2aW91cyBmcmFnczsgQGNvZGV7bWRfcmVsYXhfZnJhZ30gc2hvdWxkCi1yZXR1cm4gdGhlIGNoYW5nZSBpbiBzaXplIG9mIHRoZSBmcmFnLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKLUBjaW5kZXggVENfR0VORVJJQ19SRUxBWF9UQUJMRQotSWYgeW91IGRvIG5vdCBkZWZpbmUgQGNvZGV7bWRfcmVsYXhfZnJhZ30sIHlvdSBtYXkgZGVmaW5lCi1AY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSBhcyBhIHRhYmxlIG9mIEBjb2Rle3JlbGF4X3R5cGVTfSBzdHJ1Y3R1cmVzLiAgVGhlCi1tYWNoaW5lIGluZGVwZW5kZW50IGNvZGUga25vd3MgaG93IHRvIHVzZSBzdWNoIGEgdGFibGUgdG8gcmVsYXggUEMgcmVsYXRpdmUKLXJlZmVyZW5jZXMuICBTZWUgQGZpbGV7dGMtbTY4ay5jfSBmb3IgYW4gZXhhbXBsZS4gIEB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSBtZF9wcmVwYXJlX3JlbGF4X3NjYW4KLUBjaW5kZXggbWRfcHJlcGFyZV9yZWxheF9zY2FuCi1JZiBkZWZpbmVkLCBpdCBpcyBhIEMgc3RhdGVtZW50IHRoYXQgaXMgaW52b2tlZCBwcmlvciB0byBzY2FubmluZwotdGhlIHJlbGF4IHRhYmxlLgotCi1AaXRlbSBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZCi1AY2luZGV4IExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgYW5kIHRoZSBnbG9iYWwgdmFyaWFibGUgQHNhbXB7bGlua3JlbGF4fSBpcyBzZXQKLShiZWNhdXNlIG9mIGEgY29tbWFuZCBsaW5lIG9wdGlvbiwgb3IgdW5jb25kaXRpb25hbGx5IGluIEBjb2Rle21kX2JlZ2lufSksIGEKLUBzYW1wey5hbGlnbn0gZGlyZWN0aXZlIHdpbGwgY2F1c2UgZXh0cmEgc3BhY2UgdG8gYmUgYWxsb2NhdGVkLiAgVGhlIGxpbmtlciBjYW4KLXRoZW4gZGlzY2FyZCB0aGlzIHNwYWNlIHdoZW4gcmVsYXhpbmcgdGhlIHNlY3Rpb24uCi0KLUBpdGVtIG1kX2NvbnZlcnRfZnJhZwotQGNpbmRleCBtZF9jb252ZXJ0X2ZyYWcKLUdBUyB3aWxsIGNhbGwgdGhpcyBmb3IgZWFjaCByc19tYWNoaW5lX2RlcGVuZGVudCBmcmFnbWVudC4KLVRoZSBpbnN0cnVjdGlvbiBpcyBjb21wbGV0ZWQgdXNpbmcgdGhlIGRhdGEgZnJvbSB0aGUgcmVsYXhhdGlvbiBwYXNzLgotSXQgbWF5IGFsc28gY3JlYXRlIGFueSBuZWNlc3NhcnkgcmVsb2NhdGlvbnMuCi1AeHJlZntSZWxheGF0aW9ufS4KLQotQGl0ZW0gbWRfYXBwbHlfZml4Ci1AY2luZGV4IG1kX2FwcGx5X2ZpeAotR0FTIHdpbGwgY2FsbCB0aGlzIGZvciBlYWNoIGZpeHVwLiAgSXQgc2hvdWxkIHN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZQotb2JqZWN0IGZpbGUuICBAY29kZXtmaXh1cF9zZWdtZW50fSBwZXJmb3JtcyBhIGdlbmVyaWMgb3ZlcmZsb3cgY2hlY2sgb24gdGhlCi1AY29kZXt2YWx1ZVQgKnZhbH0gYXJndW1lbnQgYWZ0ZXIgQGNvZGV7bWRfYXBwbHlfZml4fSByZXR1cm5zLiAgSWYgdGhlIG92ZXJmbG93Ci1jaGVjayBpcyByZWxldmFudCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLCB0aGVuIEBjb2Rle21kX2FwcGx5X2ZpeH0gc2hvdWxkCi1tb2RpZnkgQGNvZGV7dmFsdWVUICp2YWx9LCB0eXBpY2FsbHkgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLUBpdGVtIFRDX0hBTkRMRVNfRlhfRE9ORQotQGNpbmRleCBUQ19IQU5ETEVTX0ZYX0RPTkUKLUlmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgaXQgbWVhbnMgdGhhdCBAY29kZXttZF9hcHBseV9maXh9IGNvcnJlY3RseSBzZXRzIHRoZQotQGNvZGV7ZnhfZG9uZX0gZmllbGQgaW4gdGhlIGZpeHVwLgotCi1AaXRlbSB0Y19nZW5fcmVsb2MKLUBjaW5kZXggdGNfZ2VuX3JlbG9jCi1BIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IEdBUyB3aWxsIGNhbGwgdGhpcyB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgR0FTIHdpbGwgcGFzcwotdGhlIHJlc3VsdGluZyByZWxvYyB0byBAY29kZXtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufS4gIFRoaXMgY3VycmVudGx5IHdvcmtzCi1wb29ybHksIGFzIEBjb2Rle2JmZF9pbnN0YWxsX3JlbG9jYXRpb259IG9mdGVuIGRvZXMgdGhlIHdyb25nIHRoaW5nLCBhbmQKLWluc3RhbmNlcyBvZiBAY29kZXt0Y19nZW5fcmVsb2N9IGhhdmUgYmVlbiB3cml0dGVuIHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtcywKLXdoaWNoIGluIHR1cm5zIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBmaXggQGNvZGV7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0uCi0KLUBpdGVtIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotQGNpbmRleCBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgbWVhbnMgdGhhdCBAY29kZXt0Y19nZW5fcmVsb2N9IG1heSByZXR1cm4gbXVsdGlwbGUKLXJlbG9jYXRpb24gZW50cmllcyBmb3IgYSBzaW5nbGUgZml4dXAuICBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgb2YKLUBjb2Rle3RjX2dlbl9yZWxvY30gaXMgYSBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIGFycmF5LgotCi1AaXRlbSBNQVhfUkVMT0NfRVhQQU5TSU9OCi1AY2luZGV4IE1BWF9SRUxPQ19FWFBBTlNJT04KLVlvdSBtdXN0IGRlZmluZSB0aGlzIGlmIEBjb2Rle1JFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRX0gaXMgZGVmaW5lZDsgaXQKLWluZGljYXRlcyB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgcmVsb2NzIHdoaWNoIEBjb2Rle3RjX2dlbl9yZWxvY30gbWF5IHJldHVybiBmb3IKLWEgc2luZ2xlIGZpeHVwLgotCi1AaXRlbSB0Y19maXhfYWRqdXN0YWJsZQotQGNpbmRleCB0Y19maXhfYWRqdXN0YWJsZQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgZml4dXAgYWdhaW5zdCBhIGxvY2FsbHkgZGVmaW5lZAotc3ltYm9sIHNob3VsZCBiZSBhZGp1c3RlZCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbC4gIEl0IHNob3VsZCByZXR1cm4gYQotbm9uLXplcm8gdmFsdWUgaWYgdGhlIGFkanVzdG1lbnQgaXMgYWNjZXB0YWJsZS4KLQotQGl0ZW0gTURfUENSRUxfRlJPTV9TRUNUSU9OCi1AY2luZGV4IE1EX1BDUkVMX0ZST01fU0VDVElPTgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBzaG91bGQgcmV0dXJuIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiBhCi1QQyByZWxhdGl2ZSBmaXh1cCBhbmQgdGhlIHBvc2l0aW9uIGZyb20gd2hpY2ggdGhlIFBDIHJlbGF0aXZlIGFkanVzdG1lbnQgc2hvdWxkCi1iZSBtYWRlLiAgT24gbWFueSBwcm9jZXNzb3JzLCB0aGUgYmFzZSBvZiBhIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIGlzIHRoZSBuZXh0Ci1pbnN0cnVjdGlvbiwgc28gdGhpcyBtYWNybyB3b3VsZCByZXR1cm4gdGhlIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gbWRfcGNyZWxfZnJvbQotQGNpbmRleCBtZF9wY3JlbF9mcm9tCi1UaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle01EX1BDUkVMX0ZST01fU0VDVElPTn0uICBUaGUgZGlmZmVyZW5jZSBpcwotdGhhdCBAY29kZXttZF9wY3JlbF9mcm9tfSBkb2VzIG5vdCB0YWtlIGEgc2VjdGlvbiBhcmd1bWVudC4KLQotQGl0ZW0gdGNfZnJvYl9sYWJlbAotQGNpbmRleCB0Y19mcm9iX2xhYmVsCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZWFjaCB0aW1lIGEgbGFiZWwgaXMgZGVmaW5lZC4KLQotQGl0ZW0gbWRfc2VjdGlvbl9hbGlnbgotQGNpbmRleCBtZF9zZWN0aW9uX2FsaWduCi1HQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGVhY2ggc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSwgdG8KLXBlcm1pdCB0aGUgQ1BVIGJhY2tlbmQgdG8gYWRqdXN0IHRoZSBhbGlnbm1lbnQgb2YgYSBzZWN0aW9uLgotCi1AaXRlbSB0Y19mcm9iX3NlY3Rpb24KLUBjaW5kZXggdGNfZnJvYl9zZWN0aW9uCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGEgQGNvZGV7QkZEX0FTU0VNQkxFUn0gR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaAotc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseS4KLQotQGl0ZW0gdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLUBjaW5kZXggdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgc3ltYm9sIHZhbHVlcyBhcmUKLXJlc29sdmVkLCBidXQgYmVmb3JlIHRoZSBmaXh1cHMgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIHNlY3Rpb24KLXN5bWJvbHMuCi0KLUBpdGVtIHRjX2Zyb2Jfc3ltYm9sCi1AY2luZGV4IHRjX2Zyb2Jfc3ltYm9sCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZm9yIGVhY2ggc3ltYm9sLiAgWW91IGNhbiBpbmRpY2F0ZQotdGhhdCB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9iamVjdCBmaWxlIGJ5IGRlZmluaW5pbmcgdGhpcwotbWFjcm8gdG8gc2V0IGl0cyBzZWNvbmQgYXJndW1lbnQgdG8gYSBub24temVybyB2YWx1ZS4KLQotQGl0ZW0gdGNfZnJvYl9maWxlCi1AY2luZGV4IHRjX2Zyb2JfZmlsZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4KLWNvbXBsZXRlZCwgYnV0IGJlZm9yZSB0aGUgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KLQotQGl0ZW0gdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSByZWxvY3MgaGF2ZSBiZWVuCi1nZW5lcmF0ZWQuCi0KLUBpdGVtIExJU1RJTkdfSEVBREVSCi1BIHN0cmluZyB0byB1c2Ugb24gdGhlIGhlYWRlciBsaW5lIG9mIGEgbGlzdGluZy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHNpbXBseQotQGNvZGV7IkdBUyBMSVNUSU5HIn0uCi0KLUBpdGVtIExJU1RJTkdfV09SRF9TSVpFCi1UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHB1dCBpbnRvIGEgd29yZCBpbiBhIGxpc3RpbmcuICBUaGlzIGFmZmVjdHMgdGhlIHdheSB0aGUKLWJ5dGVzIGFyZSBjbHVtcGVkIHRvZ2V0aGVyIGluIHRoZSBsaXN0aW5nLiAgRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMiBtaWdodAotcHJpbnQgQHNhbXB7MTIzNCA1Njc4fSB3aGVyZSBhIHZhbHVlIG9mIDEgd291bGQgcHJpbnQgQHNhbXB7MTIgMzQgNTYgNzh9LiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIDQuCi0KLUBpdGVtIExJU1RJTkdfTEhTX1dJRFRICi1UaGUgbnVtYmVyIG9mIHdvcmRzIG9mIGRhdGEgdG8gcHJpbnQgb24gdGhlIGZpcnN0IGxpbmUgb2YgYSBsaXN0aW5nIGZvciBhCi1wYXJ0aWN1bGFyIHNvdXJjZSBsaW5lLCB3aGVyZSBlYWNoIHdvcmQgaXMgQGNvZGV7TElTVElOR19XT1JEX1NJWkV9IGJ5dGVzLiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIDEuCi0KLUBpdGVtIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORAotTGlrZSBAY29kZXtMSVNUSU5HX0xIU19XSURUSH0sIGJ1dCBhcHBseWluZyB0byB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGxpbmUKLW9mIHRoZSBkYXRhIHByaW50ZWQgZm9yIGEgcGFydGljdWxhciBzb3VyY2UgbGluZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuCi0KLUBpdGVtIExJU1RJTkdfTEhTX0NPTlRfTElORVMKLVRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250aW51YXRpb24gbGluZXMgdG8gcHJpbnQgaW4gYSBsaXN0aW5nIGZvciBhIHBhcnRpY3VsYXIKLXNvdXJjZSBsaW5lLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4KLQotQGl0ZW0gTElTVElOR19SSFNfV0lEVEgKLVRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByaW50IGZyb20gb25lIGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgMTAwLgotQGVuZCB0YWJsZQotCi1Abm9kZSBPYmplY3QgZm9ybWF0IGJhY2tlbmQKLUBzdWJzZWN0aW9uIFdyaXRpbmcgYW4gb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1AY2luZGV4IG9iamVjdCBmb3JtYXQgYmFja2VuZAotQGNpbmRleCBAZmlsZXtvYmotQHZhcntmbXR9fQotCi1BcyB3aXRoIHRoZSBDUFUgYmFja2VuZCwgdGhlIG9iamVjdCBmb3JtYXQgYmFja2VuZCBtdXN0IGRlZmluZSBhIGZldyB0aGluZ3MsCi1hbmQgbWF5IGRlZmluZSBzb21lIG90aGVyIHRoaW5ncy4gIFRoZSBpbnRlcmZhY2UgdG8gdGhlIG9iamVjdCBmb3JtYXQgYmFja2VuZAotaXMgZ2VuZXJhbGx5IHNpbXBsZXI7IG1vc3Qgb2YgdGhlIHN1cHBvcnQgZm9yIGFuIG9iamVjdCBmaWxlIGZvcm1hdCBjb25zaXN0cyBvZgotZGVmaW5pbmcgYSBudW1iZXIgb2YgcHNldWRvLW9wcy4KLQotVGhlIG9iamVjdCBmb3JtYXQgQGZpbGV7Lmh9IGZpbGUgbXVzdCBpbmNsdWRlIEBmaWxle3RhcmctY3B1Lmh9LgotCi1UaGlzIHNlY3Rpb24gd2lsbCBvbmx5IGRlZmluZSB0aGUgQGNvZGV7QkZEX0FTU0VNQkxFUn0gdmVyc2lvbiBvZiBHQVMuICBJdCBpcwotaW1wb3NzaWJsZSB0byBzdXBwb3J0IGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCB1c2luZyBhbnkgb3RoZXIgdmVyc2lvbiBhbnlob3csCi1hcyB0aGUgb3JpZ2luYWwgR0FTIHZlcnNpb24gb25seSBzdXBwb3J0cyBhLm91dCwgYW5kIHRoZSBAY29kZXtNQU5ZX1NFR01FTlRTfQotR0FTIHZlcnNpb24gb25seSBzdXBwb3J0cyBDT0ZGLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIE9CSl9AdmFye2Zvcm1hdH0KLUBjaW5kZXggT0JKX0B2YXJ7Zm9ybWF0fQotQnkgY29udmVudGlvbiwgeW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUuICBGb3IKLWV4YW1wbGUsIEBmaWxle29iai1lbGYuaH0gZGVmaW5lcyBAY29kZXtPQkpfRUxGfS4gIFlvdSBtaWdodCBoYXZlIHRvIHVzZSB0aGlzCi1pZiBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYyBjb2RlIHRvIHRoZSBDUFUgZmlsZS4KLQotQGl0ZW0gb2JqX2JlZ2luCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBhc3NlbWJseSwgYWZ0ZXIKLXRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFsbCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudAotaW5pdGlhbGl6YXRpb25zIGhhdmUgYmVlbiBjb21wbGV0ZWQuCi0KLUBpdGVtIG9ial9hcHBfZmlsZQotQGNpbmRleCBvYmpfYXBwX2ZpbGUKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgaW52b2tlIGl0IHdoZW4gaXQgc2VlcyBhIEBjb2Rley5maWxlfQotcHNldWRvLW9wIG9yIGEgQHNhbXB7I30gbGluZSBhcyB1c2VkIGJ5IHRoZSBDIHByZXByb2Nlc3Nvci4KLQotQGl0ZW0gT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKLUBjaW5kZXggT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKLVlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gdG8gY29weSBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20KLW9uZSBzeW1ib2wgdG8gYW5vdGhlci4gIEdBUyB3aWxsIGNhbGwgaXQgd2hlbiBvbmUgc3ltYm9sIGlzIGVxdWF0ZWQgdG8KLWFub3RoZXIuCi0KLUBpdGVtIG9ial9maXhfYWRqdXN0YWJsZQotQGNpbmRleCBvYmpfZml4X2FkanVzdGFibGUKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgd2hldGhlciBhIGZpeHVwIGFnYWluc3QgYSBsb2NhbGx5IGRlZmluZWQKLXN5bWJvbCBzaG91bGQgYmUgYWRqdXN0ZWQgdG8gYmUgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wuICBJdCBzaG91bGQgcmV0dXJuIGEKLW5vbi16ZXJvIHZhbHVlIGlmIHRoZSBhZGp1c3RtZW50IGlzIGFjY2VwdGFibGUuCi0KLUBpdGVtIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotQGNpbmRleCBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBPSyB0byB1c2UgYSBzZWN0aW9uIHN5bWJvbCBpbgotYSByZWxvY2F0ZWlvbiBlbnRyeS4gIElmIGl0IGlzIG5vdCwgR0FTIHdpbGwgZGVmaW5lIGEgbmV3IHN5bWJvbCBhdCB0aGUgc3RhcnQKLW9mIGEgc2VjdGlvbi4KLQotQGl0ZW0gRU1JVF9TRUNUSU9OX1NZTUJPTFMKLUBjaW5kZXggRU1JVF9TRUNUSU9OX1NZTUJPTFMKLVlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gd2l0aCBhIHplcm8gdmFsdWUgaWYgeW91IGRvIG5vdCB3YW50IHRvIGluY2x1ZGUKLXNlY3Rpb24gc3ltYm9scyBpbiB0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIG1hY3JvCi1pcyBvbmUuCi0KLUBpdGVtIG9ial9hZGp1c3Rfc3ltdGFiCi1AY2luZGV4IG9ial9hZGp1c3Rfc3ltdGFiCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGludm9rZSBpdCBqdXN0IGJlZm9yZSBzZXR0aW5nIHRoZSBzeW1ib2wKLXRhYmxlIG9mIHRoZSBvdXRwdXQgQkZELiAgRm9yIGV4YW1wbGUsIHRoZSBDT0ZGIHN1cHBvcnQgdXNlcyB0aGlzIG1hY3JvIHRvCi1nZW5lcmF0ZSBhIEBjb2Rley5maWxlfSBzeW1ib2wgaWYgbm9uZSB3YXMgZ2VuZXJhdGVkIHByZXZpb3VzbHkuCi0KLUBpdGVtIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMKLUBjaW5kZXggU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IHN0YWJzIHNob3VsZCBiZSBwbGFjZWQgaW4gc2VwYXJhdGUKLXNlY3Rpb25zLCBhcyBpbiBFTEYuCi0KLUBpdGVtIElOSVRfU1RBQl9TRUNUSU9OCi1AY2luZGV4IElOSVRfU1RBQl9TRUNUSU9OCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluaXRpYWxpemUgdGhlIHN0YWJzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCi1AaXRlbSBPQkpfUFJPQ0VTU19TVEFCCi1AY2luZGV4IE9CSl9QUk9DRVNTX1NUQUIKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gZG8gc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiBhIHN0YWJzIGVudHJ5LgotCi1AaXRlbSBvYmpfZnJvYl9zZWN0aW9uCi1AY2luZGV4IG9ial9mcm9iX3NlY3Rpb24KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaCBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlCi1hc3NlbWJseS4KLQotQGl0ZW0gb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci1AY2luZGV4IG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdmFsdWVzIGFyZQotcmVzb2x2ZWQsIGJ1dCBiZWZvcmUgdGhlIGZpeHVwcyBoYXZlIGJlZW4gY2hhbmdlZCBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gc2VjdGlvbgotc3ltYm9scy4KLQotQGl0ZW0gb2JqX2Zyb2Jfc3ltYm9sCi1AY2luZGV4IG9ial9mcm9iX3N5bWJvbAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoIHN5bWJvbC4gIFlvdSBjYW4gaW5kaWNhdGUKLXRoYXQgdGhlIHN5bWJvbCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvYmplY3QgZmlsZSBieSBkZWZpbmluaW5nIHRoaXMKLW1hY3JvIHRvIHNldCBpdHMgc2Vjb25kIGFyZ3VtZW50IHRvIGEgbm9uLXplcm8gdmFsdWUuCi0KLUBpdGVtIG9ial9mcm9iX2ZpbGUKLUBjaW5kZXggb2JqX2Zyb2JfZmlsZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4KLWNvbXBsZXRlZCwgYnV0IGJlZm9yZSB0aGUgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KLQotQGl0ZW0gb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgcmVsb2NzIGhhdmUgYmVlbgotZ2VuZXJhdGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBFbXVsYXRpb25zCi1Ac3Vic2VjdGlvbiBXcml0aW5nIGVtdWxhdGlvbiBmaWxlcwotCi1Ob3JtYWxseSB5b3UgZG8gbm90IGhhdmUgdG8gd3JpdGUgYW4gZW11bGF0aW9uIGZpbGUuICBZb3UgY2FuIGp1c3QgdXNlCi1AZmlsZXt0ZS1nZW5lcmljLmh9LgotCi1JZiB5b3UgZG8gd3JpdGUgeW91ciBvd24gZW11bGF0aW9uIGZpbGUsIGl0IG11c3QgaW5jbHVkZSBAZmlsZXtvYmotZm9ybWF0Lmh9LgotCi1BbiBlbXVsYXRpb24gZmlsZSB3aWxsIG9mdGVuIGRlZmluZSBAY29kZXtURV9AdmFye0VNfX07IHRoaXMgbWF5IHRoZW4gYmUgdXNlZAotaW4gb3RoZXIgZmlsZXMgdG8gY2hhbmdlIHRoZSBvdXRwdXQuCi0KLUBub2RlIFJlbGF4YXRpb24KLUBzZWN0aW9uIFJlbGF4YXRpb24KLUBjaW5kZXggcmVsYXhhdGlvbgotCi1AZGZue1JlbGF4YXRpb259IGlzIGEgZ2VuZXJpYyB0ZXJtIHVzZWQgd2hlbiB0aGUgc2l6ZSBvZiBzb21lIGluc3RydWN0aW9uIG9yCi1kYXRhIGRlcGVuZHMgdXBvbiB0aGUgdmFsdWUgb2Ygc29tZSBzeW1ib2wgb3Igb3RoZXIgZGF0YS4KLQotR0FTIGtub3dzIHRvIHJlbGF4IGEgcGFydGljdWxhciB0eXBlIG9mIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNpbmcgYSB0YWJsZS4KLVlvdSBjYW4gYWxzbyBkZWZpbmUgYXJiaXRyYXJpbHkgY29tcGxleCBmb3JtcyBvZiByZWxheGF0aW9uIHlvdXJzZWxmLgotCi1AbWVudQotKiBSZWxheGluZyB3aXRoIGEgdGFibGU6OiAgICAgICBSZWxheGluZyB3aXRoIGEgdGFibGUKLSogR2VuZXJhbCByZWxheGluZzo6ICAgICAgICAgICAgR2VuZXJhbCByZWxheGluZwotQGVuZCBtZW51Ci0KLUBub2RlIFJlbGF4aW5nIHdpdGggYSB0YWJsZQotQHN1YnNlY3Rpb24gUmVsYXhpbmcgd2l0aCBhIHRhYmxlCi0KLUlmIHlvdSBkbyBub3QgZGVmaW5lIEBjb2Rle21kX3JlbGF4X2ZyYWd9LCBhbmQgeW91IGRvIGRlZmluZQotQGNvZGV7VENfR0VORVJJQ19SRUxBWF9UQUJMRX0sIEdBUyB3aWxsIHJlbGF4IEBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBmcmFncwotYmFzZWQgb24gdGhlIGZyYWcgc3VidHlwZSBhbmQgdGhlIGRpc3BsYWNlbWVudCB0byBzb21lIHNwZWNpZmllZCB0YXJnZXQKLWFkZHJlc3MuICBUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IHNldmVyYWwgbWFjaGluZXMgaGF2ZSBkaWZmZXJlbnQgYWRkcmVzc2luZwotbW9kZXMgZm9yIGluc3RydWN0aW9ucyB0aGF0IGNhbiBzcGVjaWZ5IGRpZmZlcmVudCByYW5nZXMgb2YgdmFsdWVzLCB3aXRoCi1zdWNjZXNzaXZlIG1vZGVzIGFibGUgdG8gYWNjZXNzIHdpZGVyIHJhbmdlcywgaW5jbHVkaW5nIHRoZSBlbnRpcmV0eSBvZiB0aGUKLXByZXZpb3VzIHJhbmdlLiAgU21hbGxlciByYW5nZXMgYXJlIGFzc3VtZWQgdG8gYmUgbW9yZSBkZXNpcmFibGUgKHBlcmhhcHMgdGhlCi1pbnN0cnVjdGlvbiByZXF1aXJlcyBvbmUgd29yZCBpbnN0ZWFkIG9mIHR3byBvciB0aHJlZSk7IGlmIHRoaXMgaXMgbm90IHRoZQotY2FzZSwgZG9uJ3QgZGVzY3JpYmUgdGhlIHNtYWxsZXItcmFuZ2UsIGluZmVyaW9yIG1vZGUuCi0KLVRoZSBAY29kZXtmcl9zdWJ0eXBlfSBmaWVsZCBvZiBhIGZyYWcgaXMgYW4gaW5kZXggaW50byBhIENQVS1zcGVjaWZpYwotcmVsYXhhdGlvbiB0YWJsZS4gIFRoYXQgdGFibGUgZW50cnkgaW5kaWNhdGVzIHRoZSByYW5nZSBvZiB2YWx1ZXMgdGhhdCBjYW4gYmUKLXN0b3JlZCwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdpbGwgaGF2ZSB0byBiZSBhZGRlZCB0byB0aGUgZnJhZyB0bwotYWNjb21vZGF0ZSB0aGUgYWRkcmVzc2luZyBtb2RlLCBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IHRvIGV4YW1pbmUgaWYKLXRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgYWNjZXNzaWJsZSBieSB0aGUgY3VycmVudAotYWRkcmVzc2luZyBtb2RlLiAgVGhlIEBjb2Rle2ZyX3N5bWJvbH0gZmllbGQgb2YgdGhlIGZyYWcgaW5kaWNhdGVzIHdoYXQgc3ltYm9sCi1pcyB0byBiZSBhY2Nlc3NlZDsgdGhlIEBjb2Rle2ZyX29mZnNldH0gZmllbGQgaXMgYWRkZWQgaW4uCi0KLUlmIHRoZSBAY29kZXtUQ19QQ1JFTF9BREpVU1R9IG1hY3JvIGlzIGRlZmluZWQsIHdoaWNoIGN1cnJlbnRseSBzaG91bGQgb25seSBoYXBwZW4KLWZvciB0aGUgTlMzMmsgZmFtaWx5LCB0aGUgQGNvZGV7VENfUENSRUxfQURKVVNUfSBtYWNybyBpcyBjYWxsZWQgb24gdGhlIGZyYWcgdG8KLWNvbXB1dGUgYW4gYWRqdXN0bWVudCB0byBiZSBtYWRlIHRvIHRoZSBkaXNwbGFjZW1lbnQuCi0KLVRoZSB2YWx1ZSBmaXR0ZWQgYnkgdGhlIHJlbGF4YXRpb24gY29kZSBpcyBhbHdheXMgYXNzdW1lZCB0byBiZSBhIGRpc3BsYWNlbWVudAotZnJvbSB0aGUgY3VycmVudCBmcmFnLiAgKE1vcmUgc3BlY2lmaWNhbGx5LCBmcm9tIEBjb2Rle2ZyX2ZpeH0gYnl0ZXMgaW50byB0aGUKLWZyYWcuKQotQGlnbm9yZQotVGhpcyBzZWVtcyBraW5kYSBzaWxseS4gIFdoYXQgYWJvdXQgZml0dGluZyBzbWFsbCBhYnNvbHV0ZSB2YWx1ZXM/ICBJIHN1cHBvc2UKLUBjb2Rle21kX2Fzc2VtYmxlfSBpcyBzdXBwb3NlZCB0byB0YWtlIGNhcmUgb2YgdGhhdCwgYnV0IGlmIHRoZSBvcGVyYW5kIGlzIGEKLWRpZmZlcmVuY2UgYmV0d2VlbiBzeW1ib2xzLCBpdCBtaWdodCBub3QgYmUgYWJsZSB0bywgaWYgdGhlIGRpZmZlcmVuY2Ugd2FzIG5vdAotY29tcHV0YWJsZSB5ZXQuCi1AZW5kIGlnbm9yZQotCi1UaGUgZW5kIG9mIHRoZSByZWxheGF0aW9uIHNlcXVlbmNlIGlzIGluZGljYXRlZCBieSBhIGBgbmV4dCcnIHZhbHVlIG9mIDAuICBUaGlzCi1tZWFucyB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUgY2FuJ3QgYmUgdXNlZC4KLQotRm9yIHNvbWUgY29uZmlndXJhdGlvbnMsIHRoZSBsaW5rZXIgY2FuIGRvIHJlbGF4aW5nIHdpdGhpbiBhIHNlY3Rpb24gb2YgYW4KLW9iamVjdCBmaWxlLiAgSWYgY2FsbCBpbnN0cnVjdGlvbnMgb2YgdmFyaW91cyBzaXplcyBleGlzdCwgdGhlIGxpbmtlciBjYW4KLWRldGVybWluZSB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBlYWNoIGluc3RhbmNlLCB3aGVuIGEgc3ltYm9sJ3MgdmFsdWUgaXMKLXJlc29sdmVkLiAgSW4gb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gYXZvaWQgd2FzdGluZyBzcGFjZSBhbmQgaGF2aW5nIHRvIGluc2VydAotbm8tb3AgaW5zdHJ1Y3Rpb25zLCBpdCBtdXN0IGJlIGFibGUgdG8gZXhwYW5kIG9yIHNocmluayB0aGUgc2VjdGlvbiBjb250ZW50cwotd2hpbGUgc3RpbGwgcHJlc2VydmluZyBpbnRyYS1zZWN0aW9uIHJlZmVyZW5jZXMgYW5kIG1lZXRpbmcgYWxpZ25tZW50Ci1yZXF1aXJlbWVudHMuCi0KLUZvciB0aGUgaTk2MCB1c2luZyBiLm91dCBmb3JtYXQsIG5vIGV4cGFuc2lvbiBpcyBkb25lOyBpbnN0ZWFkLCBlYWNoCi1Ac2FtcHsuYWxpZ259IGRpcmVjdGl2ZSBjYXVzZXMgZXh0cmEgc3BhY2UgdG8gYmUgYWxsb2NhdGVkLCBlbm91Z2ggdGhhdCB3aGVuCi10aGUgbGlua2VyIGlzIHJlbGF4aW5nIGEgc2VjdGlvbiBhbmQgcmVtb3ZpbmcgdW5uZWVkZWQgc3BhY2UsIGl0IGNhbiBkaXNjYXJkCi1zb21lIG9yIGFsbCBvZiB0aGlzIGV4dHJhIHBhZGRpbmcgYW5kIGNhdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSB0byBiZSBjb3JyZWN0bHkKLWFsaWduZWQuCi0KLUZvciB0aGUgSDgvMzAwLCBJIHRoaW5rIHRoZSBsaW5rZXIgZXhwYW5kcyBjYWxscyB0aGF0IGNhbid0IHJlYWNoLCBhbmQgZG9lc24ndAotd29ycnkgYWJvdXQgYWxpZ25tZW50IGlzc3VlczsgdGhlIGNwdSBwcm9iYWJseSBuZXZlciBuZWVkcyBhbnkgc2lnbmlmaWNhbnQKLWFsaWdubWVudCBiZXlvbmQgdGhlIGluc3RydWN0aW9uIHNpemUuCi0KLVRoZSByZWxheGF0aW9uIHRhYmxlIHR5cGUgY29udGFpbnMgdGhlc2UgZmllbGRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGxvbmcgcmx4X2ZvcndhcmQKLUZvcndhcmQgcmVhY2gsIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgotQGl0ZW0gbG9uZyBybHhfYmFja3dhcmQKLUJhY2t3YXJkIHJlYWNoLCBtdXN0IGJlIHplcm8gb3IgbmVnYXRpdmUuCi1AaXRlbSBybHhfbGVuZ3RoCi1MZW5ndGggaW4gYnl0ZXMgb2YgdGhpcyBhZGRyZXNzaW5nIG1vZGUuCi1AaXRlbSBybHhfbW9yZQotSW5kZXggb2YgdGhlIG5leHQtbG9uZ2VyIHJlbGF4IHN0YXRlLCBvciB6ZXJvIGlmIHRoZXJlIGlzIG5vIG5leHQgcmVsYXggc3RhdGUuCi1AZW5kIHRhYmxlCi0KLVRoZSByZWxheGF0aW9uIGlzIGRvbmUgaW4gQGNvZGV7cmVsYXhfc2VnbWVudH0gaW4gQGZpbGV7d3JpdGUuY30uICBUaGUKLWRpZmZlcmVuY2UgaW4gdGhlIGxlbmd0aCBmaWVsZHMgYmV0d2VlbiB0aGUgb3JpZ2luYWwgbW9kZSBhbmQgdGhlIG9uZSBmaW5hbGx5Ci1jaG9zZW4gYnkgdGhlIHJlbGF4aW5nIGNvZGUgaXMgdGFrZW4gYXMgdGhlIHNpemUgYnkgd2hpY2ggdGhlIGN1cnJlbnQgZnJhZyB3aWxsCi1iZSBpbmNyZWFzZWQgaW4gc2l6ZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgaW5pdGlhbCByZWxheGluZyBtb2RlIGhhcyBhIGxlbmd0aAotb2YgMiBieXRlcywgYW5kIGJlY2F1c2Ugb2YgdGhlIHNpemUgb2YgdGhlIGRpc3BsYWNlbWVudCwgaXQgZ2V0cyB1cGdyYWRlZCB0byBhCi1tb2RlIHdpdGggYSBzaXplIG9mIDYgYnl0ZXMsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhZyB3aWxsIGdyb3cgYnkgNCBieXRlcy4KLShUaGUgaW5pdGlhbCB0d28gYnl0ZXMgc2hvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBmaXhlZCBwb3J0aW9uIG9mIHRoZSBmcmFnLAotc2luY2UgaXQgaXMgYWxyZWFkeSBrbm93biB0aGF0IHRoZXkgd2lsbCBiZSBvdXRwdXQuKSAgVGhpcyBncm93dGggbXVzdCBiZQotZWZmZWN0ZWQgYnkgQGNvZGV7bWRfY29udmVydF9mcmFnfTsgaXQgc2hvdWxkIGluY3JlYXNlIHRoZSBAY29kZXtmcl9maXh9IGZpZWxkCi1ieSB0aGUgYXBwcm9wcmlhdGUgc2l6ZSwgYW5kIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIG9mIHRoZSBmcmFnLgotKEVub3VnaCBzcGFjZSBmb3IgdGhlIG1heGltdW0gZ3Jvd3RoIHNob3VsZCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIHRoZSBjYWxsIHRvCi1mcmFnX3ZhciBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LikKLQotSWYgcmVsb2NhdGlvbiByZWNvcmRzIGFyZSBuZWVkZWQsIHRoZXkgc2hvdWxkIGJlIGVtaXR0ZWQgYnkKLUBjb2Rle21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4fS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGV4YW1pbmUgdGhlIHRhcmdldAotc3ltYm9sIG9mIHRoZSBzdXBwbGllZCBmcmFnIGFuZCBjb3JyZWN0IHRoZSBAY29kZXtmcl9zdWJ0eXBlfSBvZiB0aGUgZnJhZyBpZgotbmVlZGVkLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaWYgdGhlIHN5bWJvbCBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQsCi1pdCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZCBsYXRlcjsgaG93ZXZlciwgaXRzIHZhbHVlIG1heSBzdGlsbCBjaGFuZ2UgaWYgdGhlCi1zZWN0aW9uIGl0IGlzIGluIGdldHMgcmVsYXhlZC4KLQotVXN1YWxseSwgaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSBmcmFnIChnaXZlbiBieSB0aGUKLUB2YXJ7c2VjfSBhcmd1bWVudCksIHRoZSBuYXJyb3dlc3QgbGlrZWx5IHJlbGF4YXRpb24gbW9kZSBpcyBzdG9yZWQgaW4KLUBjb2Rle2ZyX3N1YnR5cGV9LCBhbmQgdGhhdCdzIHRoYXQuCi0KLUlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBvciBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIChhbmQgdGhlcmVmb3JlIG1vdmVhYmxlCi10byBhbiBhcmJpdHJhcmlseSBsYXJnZSBkaXN0YW5jZSksIHRoZSBsYXJnZXN0IGF2YWlsYWJsZSByZWxheGF0aW9uIG1vZGUgaXMKLXNwZWNpZmllZCwgQGNvZGV7Zml4X25ld30gaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHJlbG9jYXRpb24gcmVjb3JkLAotQGNvZGV7ZnJfZml4fSBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aGUgcmVsb2NhdGVkIGZpZWxkIChyZW1lbWJlciwgdGhpcwotc3RvcmFnZSB3YXMgYWxsb2NhdGVkIHdoZW4gQGNvZGV7ZnJhZ192YXJ9IHdhcyBjYWxsZWQpLCBhbmQgQGNvZGV7ZnJhZ193YW5lfSBpcwotY2FsbGVkIHRvIGNvbnZlcnQgdGhlIGZyYWcgdG8gYW4gQGNvZGV7cnNfZmlsbH0gZnJhZyB3aXRoIG5vIHZhcmlhbnQgcGFydC4KLVNvbWV0aW1lcyBjaGFuZ2luZyBhZGRyZXNzaW5nIG1vZGVzIG1heSBhbHNvIHJlcXVpcmUgcmV3cml0aW5nIHRoZSBpbnN0cnVjdGlvbi4KLUl0IGNhbiBiZSBhY2Nlc3NlZCB2aWEgQGNvZGV7ZnJfb3Bjb2RlfSBvciBAY29kZXtmcl9maXh9LgotCi1Tb21ldGltZXMgQGNvZGV7ZnJfdmFyfSBpcyBpbmNyZWFzZWQgaW5zdGVhZCwgYW5kIEBjb2Rle2ZyYWdfd2FuZX0gaXMgbm90Ci1jYWxsZWQuICBJJ20gbm90IHN1cmUsIGJ1dCBJIHRoaW5rIHRoaXMgaXMgdG8ga2VlcCBAY29kZXtmcl9maXh9IHJlZmVycmluZyB0bwotYW4gZWFybGllciBieXRlLCBhbmQgQGNvZGV7ZnJfc3VidHlwZX0gc2V0IHRvIEBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBzbwotdGhhdCBAY29kZXttZF9jb252ZXJ0X2ZyYWd9IHdpbGwgZ2V0IGNhbGxlZC4KLQotQG5vZGUgR2VuZXJhbCByZWxheGluZwotQHN1YnNlY3Rpb24gR2VuZXJhbCByZWxheGluZwotCi1JZiB1c2luZyBhIHNpbXBsZSB0YWJsZSBpcyBub3Qgc3VpdGFibGUsIHlvdSBtYXkgaW1wbGVtZW50IGFyYml0cmFyaWx5IGNvbXBsZXgKLXJlbGF4YXRpb24gc2VtYW50aWNzIHlvdXJzZWxmLiAgRm9yIGV4YW1wbGUsIHRoZSBNSVBTIGJhY2tlbmQgdXNlcyB0aGlzIHRvIGVtaXQKLWRpZmZlcmVudCBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMgZGVwZW5kaW5nIHVwb24gdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBiZWluZwotYWNjZXNzZWQuCi0KLVdoZW4geW91IGFzc2VtYmxlIGFuIGluc3RydWN0aW9uIHRoYXQgbWF5IG5lZWQgcmVsYXhhdGlvbiwgeW91IHNob3VsZCBhbGxvY2F0ZQotYSBmcmFnIHVzaW5nIEBjb2Rle2ZyYWdfdmFyfSBvciBAY29kZXtmcmFnX3ZhcmlhbnR9IHdpdGggYSB0eXBlIG9mCi1AY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0uICBZb3Ugc2hvdWxkIHN0b3JlIHNvbWUgc29ydCBvZiBpbmZvcm1hdGlvbiBpbiB0aGUKLUBjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIHNvIHRoYXQgeW91IGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCB0aGUgZnJhZwotbGF0ZXIuCi0KLVdoZW4gR0FTIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZSwgaXQgd2lsbCBsb29rIHRocm91Z2ggdGhlIGZyYWdzIGFuZAotd29yayBvdXQgdGhlaXIgZmluYWwgc2l6ZXMuCi0KLUdBUyB3aWxsIGZpcnN0IGNhbGwgQGNvZGV7bWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXh9IG9uIGVhY2gKLUBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBmcmFnLiAgVGhpcyBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiBlc3RpbWF0ZWQgc2l6ZQotZm9yIHRoZSBmcmFnLgotCi1HQVMgd2lsbCB0aGVuIGxvb3Agb3ZlciB0aGUgZnJhZ3MsIGNhbGxpbmcgQGNvZGV7bWRfcmVsYXhfZnJhZ30gb24gZWFjaAotQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWcuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGNoYW5nZSBpbgotc2l6ZSBvZiB0aGUgZnJhZy4gIEdBUyB3aWxsIGtlZXAgbG9vcGluZyBvdmVyIHRoZSBmcmFncyB1bnRpbCBub25lIG9mIHRoZSBmcmFncwotY2hhbmdlcyBzaXplLgotCi1Abm9kZSBCcm9rZW4gd29yZHMKLUBzZWN0aW9uIEJyb2tlbiB3b3JkcwotQGNpbmRleCBpbnRlcm5hbHMsIGJyb2tlbiB3b3JkcwotQGNpbmRleCBicm9rZW4gd29yZHMKLQotU29tZSBjb21waWxlcnMsIGluY2x1ZGluZyBHQ0MsIHdpbGwgc29tZXRpbWVzIGVtaXQgc3dpdGNoIHRhYmxlcyBzcGVjaWZ5aW5nCi0xNi1iaXQgQGNvZGV7LndvcmR9IGRpc3BsYWNlbWVudHMgdG8gYnJhbmNoIHRhcmdldHMsIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zCi10aGF0IGxvYWQgZW50cmllcyBmcm9tIHRoYXQgdGFibGUgdG8gY29tcHV0ZSB0aGUgdGFyZ2V0IGFkZHJlc3MuICBJZiB0aGlzIGlzCi1kb25lIG9uIGEgMzItYml0IG1hY2hpbmUsIHRoZXJlIGlzIGEgY2hhbmNlIChhdCBsZWFzdCB3aXRoIHJlYWxseSBsYXJnZQotZnVuY3Rpb25zKSB0aGF0IHRoZSBkaXNwbGFjZW1lbnQgd2lsbCBub3QgZml0IGluIDE2IGJpdHMuICBUaGUgYXNzZW1ibGVyCi1oYW5kbGVzIHRoaXMgdXNpbmcgYSBjb25jZXB0IGNhbGxlZCBAZGZue2Jyb2tlbiB3b3Jkc30uICBUaGlzIGlkZWEgaXMgd2VsbAotbmFtZWQsIHNpbmNlIHRoZXJlIGlzIGFuIGltcGxpZWQgcHJvbWlzZSB0aGF0IHRoZSAxNi1iaXQgZmllbGQgd2lsbCBpbiBmYWN0Ci1ob2xkIHRoZSBzcGVjaWZpZWQgZGlzcGxhY2VtZW50LgotCi1JZiBicm9rZW4gd29yZCBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIGFuZCBhIHNpdHVhdGlvbiBsaWtlIHRoaXMgaXMgZW5jb3VudGVyZWQsCi10aGUgYXNzZW1ibGVyIHdpbGwgaW5zZXJ0IGEganVtcCBpbnN0cnVjdGlvbiBpbnRvIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0sIGNsb3NlCi1lbm91Z2ggdG8gYmUgcmVhY2hlZCB3aXRoIHRoZSAxNi1iaXQgZGlzcGxhY2VtZW50LiAgVGhpcyBqdW1wIGluc3RydWN0aW9uIHdpbGwKLXRyYW5zZmVyIHRvIHRoZSByZWFsIGRlc2lyZWQgdGFyZ2V0IGFkZHJlc3MuICBUaHVzLCBhcyBsb25nIGFzIHRoZSBAY29kZXsud29yZH0KLXZhbHVlIHJlYWxseSBpcyB1c2VkIGFzIGEgZGlzcGxhY2VtZW50IHRvIGNvbXB1dGUgYW4gYWRkcmVzcyB0byBqdW1wIHRvLCB0aGUKLW5ldCBlZmZlY3Qgd2lsbCBiZSBjb3JyZWN0IChtaW51cyBhIHZlcnkgc21hbGwgZWZmaWNpZW5jeSBjb3N0KS4gIElmCi1AY29kZXsud29yZH0gZGlyZWN0aXZlcyB3aXRoIGxhYmVsIGRpZmZlcmVuY2VzIGZvciB2YWx1ZXMgYXJlIHVzZWQgZm9yIG90aGVyCi1wdXJwb3NlcywgaG93ZXZlciwgdGhpbmdzIG1heSBub3Qgd29yayBwcm9wZXJseS4gIEZvciB0YXJnZXRzIHdoaWNoIHVzZSBicm9rZW4KLXdvcmRzLCB0aGUgQHNhbXB7LUt9IG9wdGlvbiB3aWxsIHdhcm4gd2hlbiBhIGJyb2tlbiB3b3JkIGlzIGRpc2NvdmVyZWQuCi0KLVRoZSBicm9rZW4gd29yZCBjb2RlIGlzIHR1cm5lZCBvZmYgYnkgdGhlIEBjb2Rle1dPUktJTkdfRE9UX1dPUkR9IG1hY3JvLiAgSXQKLWlzbid0IG5lZWRlZCBpZiBAY29kZXsud29yZH0gZW1pdHMgYSB2YWx1ZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbiBhZGRyZXNzCi0ob3IsIG1vcmUgY29ycmVjdGx5LCBhbnkgcG9zc2libGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhZGRyZXNzZXMpLgotCi1Abm9kZSBJbnRlcm5hbCBmdW5jdGlvbnMKLUBzZWN0aW9uIEludGVybmFsIGZ1bmN0aW9ucwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGJhc2ljIGludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGJ5IEdBUy4KLQotQG1lbnUKLSogV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXM6OiAgV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMKLSogSGFzaCB0YWJsZXM6OiAgICAgICAgICAgICAgICAgSGFzaCB0YWJsZXMKLUBlbmQgbWVudQotCi1Abm9kZSBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotQHN1YnNlY3Rpb24gV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMKLQotQGRlZnR5cGVmdW4gIEB7QH0gaW50IGhhZF93YXJuaW5ncyAodm9pZCkKLUBkZWZ0eXBlZnVueCBAe0B9IGludCBoYWRfZXJyb3JzICh2b2lkKQotUmV0dXJucyBub24temVybyBpZiBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzLCByZXNwZWN0aXZlbHksIGhhdmUgYmVlbiBwcmludGVkCi1kdXJpbmcgdGhpcyBpbnZvY2F0aW9uLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gdm9pZCBhc19wZXJyb3IgKGNvbnN0IGNoYXIgKkB2YXJ7Z3JpcGV9LCBjb25zdCBjaGFyICpAdmFye2ZpbGVuYW1lfSkKLURpc3BsYXlzIGEgQkZEIG9yIHN5c3RlbSBlcnJvciwgdGhlbiBjbGVhcnMgdGhlIGVycm9yIHN0YXR1cy4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biAgQHtAfSB2b2lkIGFzX3Rza3RzayAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX3dhcm4gKGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBhc19iYWQgKGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBhc19mYXRhbCAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1UaGVzZSBmdW5jdGlvbnMgZGlzcGxheSBtZXNzYWdlcyBhYm91dCBzb21ldGhpbmcgYW1pc3Mgd2l0aCB0aGUgaW5wdXQgZmlsZSwgb3IKLWludGVybmFsIHByb2JsZW1zIGluIHRoZSBhc3NlbWJsZXIgaXRzZWxmLiAgVGhlIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lCi1udW1iZXIgYXJlIHByaW50ZWQsIGZvbGxvd2VkIGJ5IHRoZSBzdXBwbGllZCBtZXNzYWdlLCBmb3JtYXR0ZWQgdXNpbmcKLUBjb2Rle3ZmcHJpbnRmfSwgYW5kIGEgZmluYWwgbmV3bGluZS4KLQotQW4gZXJyb3IgaW5kaWNhdGVkIGJ5IEBjb2Rle2FzX2JhZH0gd2lsbCByZXN1bHQgaW4gYSBub24temVybyBleGl0IHN0YXR1cyB3aGVuCi10aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZC4gIENhbGxpbmcgQGNvZGV7YXNfZmF0YWx9IHdpbGwgcmVzdWx0IGluIGltbWVkaWF0ZQotdGVybWluYXRpb24gb2YgdGhlIGFzc2VtYmxlciBwcm9jZXNzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gdm9pZCBhc193YXJuX3doZXJlIChjaGFyICpAdmFye2ZpbGV9LCB1bnNpZ25lZCBpbnQgQHZhcntsaW5lfSwgY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2JhZF93aGVyZSAoY2hhciAqQHZhcntmaWxlfSwgdW5zaWduZWQgaW50IEB2YXJ7bGluZX0sIGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotVGhlc2UgdmFyaWFudHMgcGVybWl0IHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCBhcmUKLXVzZWQgd2hlbiBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQgd2hlbiByZXByb2Nlc3NpbmcgaW5mb3JtYXRpb24gc2F2ZWQgYXdheSB3aGVuCi1wcm9jZXNzaW5nIHNvbWUgZWFybGllciBwYXJ0IG9mIHRoZSBmaWxlLiAgRm9yIGV4YW1wbGUsIGZpeHVwcyBhcmUgcHJvY2Vzc2VkCi1hZnRlciBhbGwgaW5wdXQgaGFzIGJlZW4gcmVhZCwgYnV0IG1lc3NhZ2VzIGFib3V0IGZpeHVwcyBzaG91bGQgcmVmZXIgdG8gdGhlCi1vcmlnaW5hbCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIgdGhhdCB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gdm9pZCBmcHJpbnRfdmFsdWUgKEZJTEUgKkB2YXJ7ZmlsZX0sIHZhbHVlVCBAdmFye3ZhbH0pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIHNwcmludF92YWx1ZSAoY2hhciAqQHZhcntidWZ9LCB2YWx1ZVQgQHZhcnt2YWx9KQotVGhlc2UgZnVuY3Rpb25zIGFyZSBoZWxwZnVsIGZvciBjb252ZXJ0aW5nIGEgQGNvZGV7dmFsdWVUfSB2YWx1ZSBpbnRvIHByaW50YWJsZQotZm9ybWF0LCBpbiBjYXNlIGl0J3Mgd2lkZXIgdGhhbiBtb2RlcyB0aGF0IEBjb2RleypwcmludGZ9IGNhbiBoYW5kbGUuICBJZiB0aGUKLXR5cGUgaXMgbmFycm93IGVub3VnaCwgYSBkZWNpbWFsIG51bWJlciB3aWxsIGJlIHByb2R1Y2VkOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUKLWluIGhleGFkZWNpbWFsLiAgVGhlIHZhbHVlIGl0c2VsZiBpcyBub3QgZXhhbWluZWQgdG8gbWFrZSB0aGlzIGRldGVybWluYXRpb24uCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgSGFzaCB0YWJsZXMKLUBzdWJzZWN0aW9uIEhhc2ggdGFibGVzCi1AY2luZGV4IGhhc2ggdGFibGVzCi0KLUBkZWZ0eXBlZnVuIEB7QH0gQHtzdHJ1Y3QgaGFzaF9jb250cm9sICpAfSBoYXNoX25ldyAodm9pZCkKLUNyZWF0ZXMgdGhlIGhhc2ggdGFibGUgY29udHJvbCBzdHJ1Y3R1cmUuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGhhc2hfZGllIChzdHJ1Y3QgaGFzaF9jb250cm9sICopCi1EZXN0cm95IGEgaGFzaCB0YWJsZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IFBUUiBoYXNoX2RlbGV0ZSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICopCi1EZWxldGVzIGVudHJ5IGZyb20gdGhlIGhhc2ggdGFibGUsIHJldHVybnMgdGhlIHZhbHVlIGl0IGhhZC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IFBUUiBoYXNoX3JlcGxhY2UgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqLCBQVFIpCi1VcGRhdGVzIHRoZSB2YWx1ZSBmb3IgYW4gZW50cnkgYWxyZWFkeSBpbiB0aGUgdGFibGUsIHJldHVybmluZyB0aGUgb2xkIHZhbHVlLgotSWYgbm8gZW50cnkgd2FzIGZvdW5kLCBqdXN0IHJldHVybnMgTlVMTC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IEB7Y29uc3QgY2hhciAqQH0gaGFzaF9pbnNlcnQgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqLCBQVFIpCi1JbnNlcnRpbmcgYSB2YWx1ZSBhbHJlYWR5IGluIHRoZSB0YWJsZSBpcyBhbiBlcnJvci4KLVJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gQHtjb25zdCBjaGFyICpAfSBoYXNoX2phbSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKLUluc2VydHMgaWYgdGhlIHZhbHVlIGlzbid0IGFscmVhZHkgcHJlc2VudCwgdXBkYXRlcyBpdCBpZiBpdCBpcy4KLUBlbmQgZGVmdHlwZWZ1bgotCi1Abm9kZSBUZXN0IHN1aXRlCi1Ac2VjdGlvbiBUZXN0IHN1aXRlCi1AY2luZGV4IHRlc3Qgc3VpdGUKLQotVGhlIHRlc3Qgc3VpdGUgaXMga2luZCBvZiBsYW1lIGZvciBtb3N0IHByb2Nlc3NvcnMuICBPZnRlbiBpdCBvbmx5IGNoZWNrcyB0bwotc2VlIGlmIGEgY291cGxlIG9mIGZpbGVzIGNhbiBiZSBhc3NlbWJsZWQgd2l0aG91dCB0aGUgYXNzZW1ibGVyIHJlcG9ydGluZyBhbnkKLWVycm9ycy4gIEZvciBtb3JlIGNvbXBsZXRlIHRlc3RpbmcsIHdyaXRlIGEgdGVzdCB3aGljaCBlaXRoZXIgZXhhbWluZXMgdGhlCi1hc3NlbWJsZXIgbGlzdGluZywgb3IgcnVucyBAY29kZXtvYmpkdW1wfSBhbmQgZXhhbWluZXMgaXRzIG91dHB1dC4gIEZvciB0aGUKLWxhdHRlciwgdGhlIFRDTCBwcm9jZWR1cmUgQGNvZGV7cnVuX2R1bXBfdGVzdH0gbWF5IGNvbWUgaW4gaGFuZHkuICBJdCB0YWtlcyB0aGUKLWJhc2UgbmFtZSBvZiBhIGZpbGUsIGFuZCBsb29rcyBmb3IgQGZpbGV7QHZhcntmaWxlfS5kfS4gIFRoaXMgZmlsZSBzaG91bGQKLWNvbnRhaW4gYXMgaXRzIGluaXRpYWwgbGluZXMgYSBzZXQgb2YgdmFyaWFibGUgc2V0dGluZ3MgaW4gQHNhbXB7I30gY29tbWVudHMsCi1pbiB0aGUgZm9ybToKLQotQGV4YW1wbGUKLSAgICAgICAgI0B2YXJ7dmFybmFtZX06IEB2YXJ7dmFsdWV9Ci1AZW5kIGV4YW1wbGUKLQotVGhlIEB2YXJ7dmFybmFtZX0gbWF5IGJlIEBjb2Rle29iamR1bXB9LCBAY29kZXtubX0sIG9yIEBjb2Rle2FzfSwgaW4gd2hpY2ggY2FzZQotaXQgc3BlY2lmaWVzIHRoZSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byB0aGUgc3BlY2lmaWVkIHByb2dyYW1zLiAgRXhhY3RseSBvbmUKLW9mIEBjb2Rle29iamR1bXB9IG9yIEBjb2Rle25tfSBtdXN0IGJlIHNwZWNpZmllZCwgYXMgdGhhdCBhbHNvIHNwZWNpZmllcyB3aGljaAotcHJvZ3JhbSB0byBydW4gYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQuICBJZiBAdmFye3Zhcm5hbWV9IGlzCi1AY29kZXtzb3VyY2V9LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlOyBvdGhlcndpc2UsCi1AZmlsZXtAdmFye2ZpbGV9LnN9IGlzIHVzZWQuICBJZiBAdmFye3Zhcm5hbWV9IGlzIEBjb2Rle25hbWV9LCBpdCBzcGVjaWZpZXMgdGhlCi1uYW1lIG9mIHRoZSB0ZXN0IHRvIGJlIHVzZWQgaW4gdGhlIEBjb2Rle3Bhc3N9IG9yIEBjb2Rle2ZhaWx9IG1lc3NhZ2VzLgotCi1UaGUgbm9uLWNvbW1lbnRlZCBwYXJ0cyBvZiB0aGUgZmlsZSBhcmUgaW50ZXJwcmV0ZWQgYXMgcmVndWxhciBleHByZXNzaW9ucywgb25lCi1wZXIgbGluZS4gIEJsYW5rIGxpbmVzIGluIHRoZSBAY29kZXtvYmpkdW1wfSBvciBAY29kZXtubX0gb3V0cHV0IGFyZSBza2lwcGVkLAotYXMgYXJlIGJsYW5rIGxpbmVzIGluIHRoZSBAY29kZXsuZH0gZmlsZTsgdGhlIG90aGVyIGxpbmVzIGFyZSB0ZXN0ZWQgdG8gc2VlIGlmCi10aGUgcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMgdGhlIHByb2dyYW0gb3V0cHV0LiAgSWYgaXQgZG9lcyBub3QsIHRoZSB0ZXN0Ci1mYWlscy4KLQotTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhlIHRlc3RzIG11c3QgYmUgbW9kaWZpZWQgaWYgdGhlIEBjb2Rle29iamR1bXB9IG91dHB1dAotc3R5bGUgaXMgY2hhbmdlZC4KLQotQGJ5ZQotQGMgTG9jYWwgVmFyaWFibGVzOgotQGMgZmlsbC1jb2x1bW46IDc5Ci1AYyBFbmQ6CmRpZmYgLS1naXQgYS9nYXMvZHdhcmYyZGJnLmMgYi9nYXMvZHdhcmYyZGJnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTk2NDYuLjAwMDAwMDAKLS0tIGEvZ2FzL2R3YXJmMmRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIwICswLDAgQEAKLS8qIGR3YXJmMmRiZy5jIC0gRFdBUkYyIGRlYnVnIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTG9naWNhbCBsaW5lIG51bWJlcnMgY2FuIGJlIGNvbnRyb2xsZWQgYnkgdGhlIGNvbXBpbGVyIHZpYSB0aGUKLSAgIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKLQotCS5maWxlIEZJTEVOTyAiZmlsZS5jIgotCS5sb2MgIEZJTEVOTyBMSU5FTk8gW0NPTFVNTl0KLQotICAgRklMRU5PIGlzIHRoZSBmaWxlbnVtYmVyLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImR3YXJmMmRiZy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKLQotLyogU2luY2Ugd2UgY2FuJ3QgZ2VuZXJhdGUgdGhlIHByb2xvZyB1bnRpbCB0aGUgYm9keSBpcyBjb21wbGV0ZSwgd2UKLSAgIHVzZSB0aHJlZSBkaWZmZXJlbnQgc3Vic2VnbWVudHMgZm9yIC5kZWJ1Z19saW5lOiBvbmUgaG9sZGluZyB0aGUKLSAgIHByb2xvZywgb25lIGZvciB0aGUgZGlyZWN0b3J5IGFuZCBmaWxlbmFtZSBpbmZvLCBhbmQgb25lIGZvciB0aGUKLSAgIGJvZHkgKCJzdGF0ZW1lbnQgcHJvZ3JhbSIpLiAgKi8KLSNkZWZpbmUgRExfUFJPTE9HCTAKLSNkZWZpbmUgRExfRklMRVMJMQotI2RlZmluZSBETF9CT0RZCQkyCi0KLS8qIEZpcnN0IHNwZWNpYWwgbGluZSBvcGNkZSAtIGxlYXZlIHJvb20gZm9yIHRoZSBzdGFuZGFyZCBvcGNvZGVzLgotICAgTm90ZTogSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoaXMsIHlvdSdsbCBoYXZlIHRvIHVwZGF0ZSB0aGUKLSAgICJzdGFuZGFyZF9vcGNvZGVfbGVuZ3RocyIgdGFibGUgdGhhdCBpcyBlbWl0dGVkIGJlbG93IGluCi0gICBkd2FyZjJfZmluaXNoKCkuICAqLwotI2RlZmluZSBEV0FSRjJfTElORV9PUENPREVfQkFTRQkJMTAKLQotI2lmbmRlZiBEV0FSRjJfTElORV9CQVNFCi0gIC8qIE1pbmltdW0gbGluZSBvZmZzZXQgaW4gYSBzcGVjaWFsIGxpbmUgaW5mby4gb3Bjb2RlLiAgVGhpcyB2YWx1ZQotICAgICB3YXMgY2hvc2VuIHRvIGdpdmUgYSByZWFzb25hYmxlIHJhbmdlIG9mIHZhbHVlcy4gICovCi0jIGRlZmluZSBEV0FSRjJfTElORV9CQVNFCQktNQotI2VuZGlmCi0KLS8qIFJhbmdlIG9mIGxpbmUgb2Zmc2V0cyBpbiBhIHNwZWNpYWwgbGluZSBpbmZvLiBvcGNvZGUuICAqLwotI2lmbmRlZiBEV0FSRjJfTElORV9SQU5HRQotIyBkZWZpbmUgRFdBUkYyX0xJTkVfUkFOR0UJCTE0Ci0jZW5kaWYKLQotI2lmbmRlZiBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEgKLSAgLyogRGVmaW5lIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IG1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoIChpbgotICAgICBieXRlcykuICBUaGlzIHZhbHVlIHNob3VsZCBiZSByYXRoZXIgdG9vIHNtYWxsIHRoYW4gdG9vIGJpZy4gICovCi0jIGRlZmluZSBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEgJNAotI2VuZGlmCi0KLS8qIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGlzX3N0bXRfc3RhcnQgZmxhZy4KLSAgIEluIHRoZSBwcmVzZW50IGltcGxlbWVudGF0aW9uLCB3ZSBkbyBub3QgbWFyayBhbnkgbGluZXMgYXMKLSAgIHRoZSBiZWdpbm5pbmcgb2YgYSBzb3VyY2Ugc3RhdGVtZW50LCBiZWNhdXNlIHRoYXQgaW5mb3JtYXRpb24KLSAgIGlzIG5vdCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgR0NDIGZyb250LWVuZC4gICovCi0jZGVmaW5lCURXQVJGMl9MSU5FX0RFRkFVTFRfSVNfU1RNVAkxCi0KLS8qIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGlzX3N0bXRfc3RhcnQgZmxhZy4KLSAgIEluIHRoZSBwcmVzZW50IGltcGxlbWVudGF0aW9uLCB3ZSBkbyBub3QgbWFyayBhbnkgbGluZXMgYXMKLSAgIHRoZSBiZWdpbm5pbmcgb2YgYSBzb3VyY2Ugc3RhdGVtZW50LCBiZWNhdXNlIHRoYXQgaW5mb3JtYXRpb24KLSAgIGlzIG5vdCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgR0NDIGZyb250LWVuZC4gICovCi0jZGVmaW5lCURXQVJGMl9MSU5FX0RFRkFVTFRfSVNfU1RNVAkxCi0KLS8qIEdpdmVuIGEgc3BlY2lhbCBvcCwgcmV0dXJuIHRoZSBsaW5lIHNraXAgYW1vdW50OiAqLwotI2RlZmluZSBTUEVDSUFMX0xJTkUob3ApIFwKLQkoKChvcCkgLSBEV0FSRjJfTElORV9PUENPREVfQkFTRSklRFdBUkYyX0xJTkVfUkFOR0UgKyBEV0FSRjJfTElORV9CQVNFKQotCi0vKiBHaXZlbiBhIHNwZWNpYWwgb3AsIHJldHVybiB0aGUgYWRkcmVzcyBza2lwIGFtb3VudCAoaW4gdW5pdHMgb2YKLSAgIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSC4gICovCi0jZGVmaW5lIFNQRUNJQUxfQUREUihvcCkgKCgob3ApIC0gRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UpL0RXQVJGMl9MSU5FX1JBTkdFKQotCi0vKiBUaGUgbWF4aW11bSBhZGRyZXNzIHNraXAgYW1vbnQgdGhhdCBjYW4gYmUgZW5jb2RlZCB3aXRoIGEgc3BlY2lhbCBvcDogKi8KLSNkZWZpbmUgTUFYX1NQRUNJQUxfQUREUl9ERUxUQQkJU1BFQ0lBTF9BRERSKDI1NSkKLQotI2RlZmluZSBJTklUSUFMX1NUQVRFCQkJCQkJXAotICAvKiBpbml0aWFsaXplIGFzIHBlciBEV0FSRjIuMCBzdGFuZGFyZDogKi8JCQlcCi0gIDAsCQkJCQkvKiBhZGRyZXNzICovCQlcCi0gIDEsCQkJCQkvKiBmaWxlICovCQlcCi0gIDEsCQkJCQkvKiBsaW5lICovCQlcCi0gIDAsCQkJCQkvKiBjb2x1bW4gKi8JCVwKLSAgRFdBUkYyX0xJTkVfREVGQVVMVF9JU19TVE1ULAkJLyogaXNfc3RtdCAqLwkJXAotICAwLAkJCQkJLyogYmFzaWNfYmxvY2sgKi8JXAotICAxCQkJCQkvKiBlbXB0eV9zZXF1ZW5jZSAqLwotCi1zdGF0aWMgc3RydWN0Ci0gIHsKLSAgICAvKiBzdGF0ZSBtYWNoaW5lIHN0YXRlIGFzIHBlciBEV0FSRjIgbWFudWFsOiAqLwotICAgIHN0cnVjdCBkd2FyZjJfc20KLSAgICAgIHsKLQlhZGRyZXNzVCBhZGRyOwotCXVuc2lnbmVkIGludCBmaWxlbnVtOwotCXVuc2lnbmVkIGludCBsaW5lOwotCXVuc2lnbmVkIGludCBjb2x1bW47Ci0JdW5zaWduZWQgaW50Ci0JICBpc19zdG10IDogMSwKLQkgIGJhc2ljX2Jsb2NrIDogMSwKLQkgIGVtcHR5X3NlcXVlbmNlIDogMTsJCS8qIGN1cnJlbnQgY29kZSBzZXF1ZW5jZSBoYXMgbm8gRFdBUkYyIGRpcmVjdGl2ZXM/ICovCi0gICAgICB9Ci0gICAgc207Ci0KLSAgICB1bnNpZ25lZCBpbnQKLSAgICAgIGFueV9kd2FyZjJfZGlyZWN0aXZlcyA6IDE7CS8qIGRpZCB3ZSBlbWl0IGFueSBEV0FSRjIgbGluZSBkZWJ1ZyBkaXJlY3RpdmVzPyAqLwotCi0gICAgc2VnVCB0ZXh0X3NlZzsJLyogdGV4dCBzZWdtZW50ICJhZGRyIiBpcyByZWxhdGl2ZSB0byAqLwotICAgIHN1YnNlZ1QgdGV4dF9zdWJzZWc7Ci0gICAgc2VnVCBsaW5lX3NlZzsJLyogIi5kZWJ1Z19saW5lIiBzZWdtZW50ICovCi0gICAgaW50IGxhc3RfZmlsZW5hbWU7CS8qIGluZGV4IG9mIGxhc3QgZmlsZW5hbWUgdGhhdCB3YXMgdXNlZCAqLwotICAgIGludCBudW1fZmlsZW5hbWVzOwkvKiBpbmRleCBvZiBsYXN0IGZpbGVuYW1lIGluIHVzZSAqLwotICAgIGludCBmaWxlbmFtZV9sZW47CS8qIGxlbmd0aCBvZiB0aGUgZmlsZW5hbWUgYXJyYXkgKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlpbnQgZGlyOwkvKiB2YWxpZCBhZnRlciBnZW5fZGlyX2xpc3QoKSBvbmx5ICovCi0JY2hhciAqbmFtZTsgLyogZnVsbCBwYXRoIGJlZm9yZSBnZW5fZGlyX2xpc3QoKSwgZmlsZW5hbWUgYWZ0ZXJ3YXJkcyAqLwotICAgICAgfQotICAgICpmaWxlOwotCi0gICAgc3RydWN0IGR3YXJmMl9saW5lX2luZm8gY3VycmVudDsJLyogY3VycmVudCBzb3VyY2UgaW5mbzogKi8KLQotICAgIC8qIGNvdW50ZXJzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3NlczogKi8KLSAgICB1bnNpZ25lZCBpbnQgbnVtX2xpbmVfZW50cmllczsKLSAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX2hpc3RbMjU2XTsJLyogaGlzdG9ncmFtIG9mIG9wY29kZSBmcmVxdWVuY2llcyAqLwotICB9Ci1scyA9Ci0gIHsKLSAgICB7Ci0gICAgICBJTklUSUFMX1NUQVRFCi0gICAgfSwKLSAgfTsKLQotCi0vKiBGdW5jdGlvbiBwcm90b3R5cGVzOiAqLwotc3RhdGljIHZvaWQgb3V0X3VsZWIxMjggUEFSQU1TICgoYWRkcmVzc1QpKTsKLXN0YXRpYyB2b2lkIG91dF9zbGViMTI4IFBBUkFNUyAoKG9mZnNldFQpKTsKLXN0YXRpYyB2b2lkIGdlbl9hZGRyX2xpbmUgUEFSQU1TICgoaW50LCBhZGRyZXNzVCkpOwotc3RhdGljIHZvaWQgcmVzZXRfc3RhdGVfbWFjaGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBvdXRfc2V0X2FkZHIgUEFSQU1TICgoYWRkcmVzc1QpKTsKLXN0YXRpYyB2b2lkIG91dF9lbmRfc2VxdWVuY2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBnZXRfZmlsZW51bSBQQVJBTVMgKChpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2VuX2Rpcl9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdlbl9maWxlX2xpc3QgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcHJpbnRfc3RhdHMgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotCi0KLSNkZWZpbmUgb3V0X2J5dGUoYnl0ZSkJRlJBR19BUFBFTkRfMV9DSEFSKGJ5dGUpCi0jZGVmaW5lIG91dF9vcGNvZGUob3BjKQkob3V0X2J5dGUgKChvcGMpKSwgKytscy5vcGNvZGVfaGlzdFsob3BjKSAmIDB4ZmZdKQotCi0vKiBPdXRwdXQgYW4gdW5zaWduZWQgImxpdHRsZS1lbmRpYW4gYmFzZSAxMjgiIG51bWJlci4gICovCi1zdGF0aWMgdm9pZAotb3V0X3VsZWIxMjggKHZhbHVlKQotICAgICBhZGRyZXNzVCB2YWx1ZTsKLXsKLSAgdW5zaWduZWQgY2hhciBieXRlLCBtb3JlID0gMHg4MDsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSB2YWx1ZSAmIDB4N2Y7Ci0gICAgICB2YWx1ZSA+Pj0gNzsKLSAgICAgIGlmICh2YWx1ZSA9PSAwKQotCW1vcmUgPSAwOwotICAgICAgb3V0X2J5dGUgKG1vcmUgfCBieXRlKTsKLSAgICB9Ci0gIHdoaWxlIChtb3JlKTsKLX0KLQotLyogT3V0cHV0IGEgc2lnbmVkICJsaXR0bGUtZW5kaWFuIGJhc2UgMTI4IiBudW1iZXIuICAqLwotc3RhdGljIHZvaWQKLW91dF9zbGViMTI4ICh2YWx1ZSkKLSAgICAgb2Zmc2V0VCB2YWx1ZTsKLXsKLSAgdW5zaWduZWQgY2hhciBieXRlLCBtb3JlID0gMHg4MDsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSB2YWx1ZSAmIDB4N2Y7Ci0gICAgICB2YWx1ZSA+Pj0gNzsKLSAgICAgIGlmICgoKHZhbHVlID09IDApICYmICgoYnl0ZSAmIDB4NDApID09IDApKQotCSAgfHwgKCh2YWx1ZSA9PSAtMSkgJiYgKChieXRlICYgMHg0MCkgIT0gMCkpKQotCW1vcmUgPSAwOwotICAgICAgb3V0X2J5dGUgKG1vcmUgfCBieXRlKTsKLSAgICB9Ci0gIHdoaWxlIChtb3JlKTsKLX0KLQotLyogRW5jb2RlIGEgcGFpciBvZiBsaW5lIGFuZCBhZGRyZXNzIHNraXBzIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLgotICAgTm90ZSB0aGF0IHRoZSBsaW5lIHNraXAgaXMgc2lnbmVkLCB3aGVyZWFzIHRoZSBhZGRyZXNzIHNraXAgaXMKLSAgIHVuc2lnbmVkLiAgKi8KLXN0YXRpYyB2b2lkCi1nZW5fYWRkcl9saW5lIChsaW5lX2RlbHRhLCBhZGRyX2RlbHRhKQotICAgICBpbnQgbGluZV9kZWx0YTsKLSAgICAgYWRkcmVzc1QgYWRkcl9kZWx0YTsKLXsKLSAgdW5zaWduZWQgaW50IHRtcCwgb3Bjb2RlOwotCi0gIHRtcCA9IGxpbmVfZGVsdGEgLSBEV0FSRjJfTElORV9CQVNFOwotCi0gIGlmICh0bXAgPj0gRFdBUkYyX0xJTkVfUkFOR0UpCi0gICAgewotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX2FkdmFuY2VfbGluZSk7Ci0gICAgICBvdXRfc2xlYjEyOCAobGluZV9kZWx0YSk7Ci0gICAgICB0bXAgPSAwIC0gRFdBUkYyX0xJTkVfQkFTRTsKLSAgICAgIGxpbmVfZGVsdGEgPSAwOwotICAgIH0KLQotICB0bXAgKz0gRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0U7Ci0KLSAgLyogdHJ5IHVzaW5nIGEgc3BlY2lhbCBvcGNvZGU6ICovCi0gIG9wY29kZSA9IHRtcCArIGFkZHJfZGVsdGEqRFdBUkYyX0xJTkVfUkFOR0U7Ci0gIGlmIChvcGNvZGUgPD0gMjU1KQotICAgIHsKLSAgICAgIG91dF9vcGNvZGUgKG9wY29kZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHRyeSB1c2luZyBEV19MTlNfY29uc3RfYWRkX3BjIGZvbGxvd2VkIGJ5IHNwZWNpYWwgb3A6ICovCi0gIG9wY29kZSA9IHRtcCArIChhZGRyX2RlbHRhIC0gTUFYX1NQRUNJQUxfQUREUl9ERUxUQSkqRFdBUkYyX0xJTkVfUkFOR0U7Ci0gIGlmIChvcGNvZGUgPD0gMjU1KQotICAgIHsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19jb25zdF9hZGRfcGMpOwotICAgICAgb3V0X29wY29kZSAob3Bjb2RlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgb3V0X29wY29kZSAoRFdfTE5TX2FkdmFuY2VfcGMpOwotICBvdXRfdWxlYjEyOCAoYWRkcl9kZWx0YSk7Ci0KLSAgaWYgKGxpbmVfZGVsdGEpCi0gICAgb3V0X29wY29kZSAodG1wKTsJCS8qIG91dHB1dCBsaW5lLWRlbHRhICovCi0gIGVsc2UKLSAgICBvdXRfb3Bjb2RlIChEV19MTlNfY29weSk7CS8qIGFwcGVuZCBuZXcgcm93IHdpdGggY3VycmVudCBpbmZvICovCi19Ci0KLXN0YXRpYyB2b2lkCi1yZXNldF9zdGF0ZV9tYWNoaW5lICgpCi17Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHdhcmYyX3NtIGluaXRpYWxfc3RhdGUgPSB7IElOSVRJQUxfU1RBVEUgfTsKLQotICBscy5zbSA9IGluaXRpYWxfc3RhdGU7Ci19Ci0KLS8qIFNldCBhbiBhYnNvbHV0ZSBhZGRyZXNzIChtYXkgcmVzdWx0cyBpbiBhIHJlbG9jYXRpb24gZW50cnkpOiAqLwotc3RhdGljIHZvaWQKLW91dF9zZXRfYWRkciAoYWRkcikKLSAgICAgYWRkcmVzc1QgYWRkcjsKLXsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWc7Ci0gIHNlZ1Qgc2F2ZWRfc2VnOwotICBleHByZXNzaW9uUyBleHByOwotICBzeW1ib2xTICpzeW07Ci0gIGludCBieXRlc19wZXJfYWRkcmVzczsKLQotICBzYXZlZF9zZWcgPSBub3dfc2VnOwotICBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0gIHN1YnNlZ19zZXQgKGxzLnRleHRfc2VnLCBscy50ZXh0X3N1YnNlZyk7Ci0gIHN5bSA9IHN5bWJvbF9uZXcgKCIuTDBcMDAxIiwgbm93X3NlZywgYWRkciwgZnJhZ19ub3cpOwotCi0gIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYnl0ZXNfcGVyX2FkZHJlc3MgPSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpIC8gODsKLSNlbHNlCi0gIC8qIEZJWE1FLiAgKi8KLSAgYnl0ZXNfcGVyX2FkZHJlc3MgPSA0OwotI2VuZGlmCi0KLSAgb3V0X29wY29kZSAoRFdfTE5TX2V4dGVuZGVkX29wKTsKLSAgb3V0X3VsZWIxMjggKGJ5dGVzX3Blcl9hZGRyZXNzICsgMSk7Ci0KLSAgb3V0X29wY29kZSAoRFdfTE5FX3NldF9hZGRyZXNzKTsKLSAgZXhwci5YX29wID0gT19zeW1ib2w7Ci0gIGV4cHIuWF9hZGRfc3ltYm9sID0gc3ltOwotICBleHByLlhfYWRkX251bWJlciA9IDA7Ci0gIGVtaXRfZXhwciAoJmV4cHIsIGJ5dGVzX3Blcl9hZGRyZXNzKTsKLX0KLQotLyogRW1pdCBEV19MTlNfZW5kX3NlcXVlbmNlIGFuZCByZXNldCBzdGF0ZSBtYWNoaW5lLiAgRG9lcyBub3QKLSAgIHByZXNlcnZlIHRoZSBjdXJyZW50IHNlZ21lbnQvc3ViLXNlZ21lbnQhICAqLwotc3RhdGljIHZvaWQKLW91dF9lbmRfc2VxdWVuY2UgKCkKLXsKLSAgYWRkcmVzc1QgYWRkciwgZGVsdGE7Ci0KLSAgaWYgKGxzLnRleHRfc2VnKQotICAgIHsKLSAgICAgIHN1YnNlZ19zZXQgKGxzLnRleHRfc2VnLCBscy50ZXh0X3N1YnNlZyk7Ci0jaWZkZWYgbWRfY3VycmVudF90ZXh0X2FkZHIKLSAgICAgIGFkZHIgPSBtZF9jdXJyZW50X3RleHRfYWRkciAoKTsKLSNlbHNlCi0gICAgICBhZGRyID0gZnJhZ19ub3dfZml4ICgpOwotI2VuZGlmCi0gICAgICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfQk9EWSk7Ci0gICAgICBpZiAoYWRkciA8IGxzLnNtLmFkZHIpCi0JewotCSAgb3V0X3NldF9hZGRyIChhZGRyKTsKLQkgIGxzLnNtLmFkZHIgPSBhZGRyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkZWx0YSA9IGFkZHIgLSBscy5zbS5hZGRyOwotCSAgaWYgKGRlbHRhID4gMCkKLQkgICAgZ2VuX2FkZHJfbGluZSAoMCwgZGVsdGEgLyBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEgpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfQk9EWSk7Ci0KLSAgb3V0X29wY29kZSAoRFdfTE5TX2V4dGVuZGVkX29wKTsKLSAgb3V0X3VsZWIxMjggKDEpOwotICBvdXRfYnl0ZSAoRFdfTE5FX2VuZF9zZXF1ZW5jZSk7Ci0KLSAgcmVzZXRfc3RhdGVfbWFjaGluZSAoKTsKLX0KLQotLyogTG9vayB1cCBhIGZpbGVudW1iZXIgZWl0aGVyIGJ5IGZpbGVuYW1lIG9yIGJ5IGZpbGVudW1iZXIuICBJZiBib3RoCi0gICBhIGZpbGVudW1iZXIgYW5kIGEgZmlsZW5hbWUgYXJlIHNwZWNpZmllZCwgbG9va3VwIGJ5IGZpbGVuYW1lIHRha2VzCi0gICBwcmVjZWRlbmNlLiAgSWYgdGhlIGZpbGVuYW1lIGNhbm5vdCBiZSBmb3VuZCwgaXQgaXMgYWRkZWQgdG8gdGhlCi0gICBmaWxldGFibGUgdGhlIGZpbGVudW1iZXIgZm9yIHRoZSBuZXcgZW50cnkgaXMgcmV0dXJuZWQuICAqLwotc3RhdGljIGludAotZ2V0X2ZpbGVudW0gKGZpbGVudW0sIGZpbGUpCi0gICAgIGludCBmaWxlbnVtOwotICAgICBjaGFyICpmaWxlOwotewotICBpbnQgaSwgbGFzdCA9IGZpbGVudW0gLSAxOwotICBjaGFyIGNoYXIwID0gZmlsZVswXTsKLQotICBpZiAoKHVuc2lnbmVkKSBsYXN0ID49IGxzLm51bV9maWxlbmFtZXMpCi0gICAgbGFzdCA9IGxzLmxhc3RfZmlsZW5hbWU7Ci0KLSAgLyogZG8gYSBxdWljayBjaGVjayBhZ2FpbnN0IHRoZSBwcmV2aW91c2x5IHVzZWQgZmlsZW5hbWU6ICovCi0gIGlmIChscy5udW1fZmlsZW5hbWVzID4gMCAmJiBscy5maWxlW2xhc3RdLm5hbWVbMF0gPT0gY2hhcjAKLSAgICAgICYmIHN0cmNtcCAobHMuZmlsZVtsYXN0XS5uYW1lICsgMSwgZmlsZSArIDEpID09IDApCi0gICAgcmV0dXJuIGxhc3QgKyAxOwotCi0gIC8qIG5vIG1hdGNoLCBmYWxsIGJhY2sgdG8gc2ltcGxlIGxpbmVhciBzY2FuOiAqLwotICBmb3IgKGkgPSAwOyBpIDwgbHMubnVtX2ZpbGVuYW1lczsgKytpKQotICAgIHsKLSAgICAgIGlmIChscy5maWxlW2ldLm5hbWVbMF0gPT0gY2hhcjAKLQkgICYmIHN0cmNtcCAobHMuZmlsZVtpXS5uYW1lICsgMSwgZmlsZSArIDEpID09IDApCi0JewotCSAgbHMubGFzdF9maWxlbmFtZSA9IGk7Ci0JICByZXR1cm4gaSArIDE7Ci0JfQotICAgIH0KLQotICAvKiBubyBtYXRjaDogZW50ZXIgbmV3IGZpbGVuYW1lICovCi0gIGlmIChscy5udW1fZmlsZW5hbWVzID49IGxzLmZpbGVuYW1lX2xlbikKLSAgICB7Ci0gICAgICBscy5maWxlbmFtZV9sZW4gKz0gMTM7Ci0gICAgICBscy5maWxlID0geHJlYWxsb2MgKGxzLmZpbGUsIGxzLmZpbGVuYW1lX2xlbiAqIHNpemVvZiAobHMuZmlsZVswXSkpOwotICAgIH0KLSAgbHMuZmlsZVtscy5udW1fZmlsZW5hbWVzXS5kaXIgPSAwOwotICBscy5maWxlW2xzLm51bV9maWxlbmFtZXNdLm5hbWUgPSBmaWxlOwotICByZXR1cm4gKytscy5udW1fZmlsZW5hbWVzOwotfQotCi12b2lkCi1kd2FyZjJfZ2VuX2xpbmVfaW5mbyAoYWRkciwgbCkKLSAgICAgYWRkcmVzc1QgYWRkcjsKLSAgICAgc3RydWN0IGR3YXJmMl9saW5lX2luZm8gKmw7Ci17Ci0gIHVuc2lnbmVkIGludCBmaWxlbnVtID0gbC0+ZmlsZW51bTsKLSAgdW5zaWduZWQgaW50IGFueV9vdXRwdXQgPSAwOwotICBzdWJzZWdUIHNhdmVkX3N1YnNlZzsKLSAgc2VnVCBzYXZlZF9zZWc7Ci0KLSAgaWYgKGZsYWdfZGVidWcpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAibGluZTogYWRkciAlbGx4IGZpbGUgYCVzJyBsaW5lICV1IGNvbCAldSBmbGFncyAleFxuIiwKLQkgICAgIChsb25nIGxvbmcpIGFkZHIsIGwtPmZpbGVuYW1lLCBsLT5saW5lLCBsLT5jb2x1bW4sIGwtPmZsYWdzKTsKLQotICBpZiAoZmlsZW51bSA+IDAgJiYgIWwtPmZpbGVuYW1lKQotICAgIHsKLSAgICAgIGlmIChmaWxlbnVtID49IGxzLm51bV9maWxlbmFtZXMpCi0JewotCSAgYXNfd2FybiAoIkVuY291bnRlcmVkIGJhZCBmaWxlIG51bWJlciBpbiBsaW5lIG51bWJlciBkZWJ1ZyBpbmZvISIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGwtPmZpbGVuYW1lKQotICAgIGZpbGVudW0gPSBnZXRfZmlsZW51bSAoZmlsZW51bSwgbC0+ZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcmV0dXJuOwkvKiBubyBmaWxlbmFtZSwgbm8gZmlsbnVtID0+IG5vIHBsYXkgKi8KLQotICBpZiAoIWxzLmxpbmVfc2VnKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBzeW1ib2xTICpzZWNzeW07Ci0jZW5kaWYKLQotICAgICAgbHMubGluZV9zZWcgPSBzdWJzZWdfbmV3ICgiLmRlYnVnX2xpbmUiLCAwKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBscy5saW5lX3NlZywgU0VDX1JFQURPTkxZKTsKLQotICAgICAgLyogV2UncmUgZ29pbmcgdG8gbmVlZCB0aGlzIHN5bWJvbC4gICovCi0gICAgICBzZWNzeW0gPSBzeW1ib2xfZmluZCAoIi5kZWJ1Z19saW5lIik7Ci0gICAgICBpZiAoc2Vjc3ltICE9IE5VTEwpCi0gICAgICAgIHN5bWJvbF9zZXRfYmZkc3ltIChzZWNzeW0sIGxzLmxpbmVfc2VnLT5zeW1ib2wpOwotICAgICAgZWxzZQotICAgICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAobHMubGluZV9zZWcpKTsKLSNlbmRpZgotICAgIH0KLQotICBzYXZlZF9zZWcgPSBub3dfc2VnOwotICBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfQk9EWSk7Ci0KLSAgaWYgKGxzLnRleHRfc2VnICE9IHNhdmVkX3NlZyB8fCBscy50ZXh0X3N1YnNlZyAhPSBzYXZlZF9zdWJzZWcpCi0gICAgewotICAgICAgaWYgKCFscy5zbS5lbXB0eV9zZXF1ZW5jZSkKLQl7Ci0JICBvdXRfZW5kX3NlcXVlbmNlICgpOwkJLyogdGVybWluYXRlIHByZXZpb3VzIHNlcXVlbmNlICovCi0JICBscy5zbS5lbXB0eV9zZXF1ZW5jZSA9IDE7Ci0JfQotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBscy50ZXh0X3NlZyA9IHNhdmVkX3NlZzsKLSAgICAgIGxzLnRleHRfc3Vic2VnID0gc2F2ZWRfc3Vic2VnOwotICAgICAgb3V0X3NldF9hZGRyIChhZGRyKTsKLSAgICAgIGxzLnNtLmFkZHIgPSBhZGRyOwotICAgIH0KLQotICBpZiAobHMuc20uZmlsZW51bSAhPSBmaWxlbnVtKQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX3NldF9maWxlKTsKLSAgICAgIG91dF91bGViMTI4IChmaWxlbnVtKTsKLSAgICAgIGxzLnNtLmZpbGVudW0gPSBmaWxlbnVtOwotICAgIH0KLQotICBpZiAobHMuc20uY29sdW1uICE9IGwtPmNvbHVtbikKLSAgICB7Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19zZXRfY29sdW1uKTsKLSAgICAgIG91dF91bGViMTI4IChsLT5jb2x1bW4pOwotICAgICAgbHMuc20uY29sdW1uID0gbC0+Y29sdW1uOwotICAgIH0KLQotICBpZiAoKChsLT5mbGFncyAmIERXQVJGMl9GTEFHX0JFR0lOX1NUTVQpICE9IDApICE9IGxzLnNtLmlzX3N0bXQpCi0gICAgewotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfbmVnYXRlX3N0bXQpOwotICAgIH0KLQotICBpZiAobC0+ZmxhZ3MgJiBEV0FSRjJfRkxBR19CRUdJTl9CTE9DSykKLSAgICB7Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19zZXRfYmFzaWNfYmxvY2spOwotICAgIH0KLQotICBpZiAobHMuc20ubGluZSAhPSBsLT5saW5lKQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgaWYgKGFkZHIgPCBscy5zbS5hZGRyKQotCXsKLQkgIC8qIFRoaXMgaGFwcGVucyB3aGVuIGEgbmV3IGZyYWcgZ290IGFsbG9jYXRlZCAoZm9yIHdoYXRldmVyCi0JICAgICByZWFzb24pLiAgRGVhbCB3aXRoIGl0IGJ5IGdlbmVyYXRpbmcgYSByZWZlcmVuY2Ugc3ltYm9sLgotCSAgICAgTm90ZTogbm8gZW5kX3NlcXVlbmNlIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBiZWNhdXNlIHRoZQotCSAgICAgYWRkcmVzcyBkaWQgbm90IHJlYWxseSBkZWNyZWFzZSAob25seSB0aGUgcmVmZXJlbmNlIHBvaW50Ci0JICAgICBjaGFuZ2VkKS4KLQotCSAgICAgPz8/IFBlcmhhcHMgd2Ugc2hvdWxkIGRpcmVjdGx5IGNoZWNrIGZvciBhIGNoYW5nZSBvZgotCSAgICAgZnJhZ19ub3cgaW5zdGVhZD8gICovCi0JICBvdXRfc2V0X2FkZHIgKGFkZHIpOwotCSAgbHMuc20uYWRkciA9IGFkZHI7Ci0JfQotICAgICAgZ2VuX2FkZHJfbGluZSAobC0+bGluZSAtIGxzLnNtLmxpbmUsCi0JCSAgICAgKGFkZHIgLSBscy5zbS5hZGRyKSAvIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSCk7Ci0gICAgICBscy5zbS5iYXNpY19ibG9jayA9IDA7Ci0gICAgICBscy5zbS5saW5lID0gbC0+bGluZTsKLSAgICAgIGxzLnNtLmFkZHIgPSBhZGRyOwotICAgIH0KLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci0KLSAgbHMubnVtX2xpbmVfZW50cmllcyArPSBhbnlfb3V0cHV0OwotICBpZiAoYW55X291dHB1dCkKLSAgICBscy5zbS5lbXB0eV9zZXF1ZW5jZSA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZGlyX2xpc3QgKCkKLXsKLSAgY2hhciAqc3RyLCAqc2xhc2gsICpkaXJfbGlzdCwgKmRwLCAqY3A7Ci0gIGludCBpLCBqLCBudW1fZGlyczsKLQotICBkaXJfbGlzdCA9IGZyYWdfbW9yZSAoMCk7Ci0gIG51bV9kaXJzID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgbHMubnVtX2ZpbGVuYW1lczsgKytpKQotICAgIHsKLSAgICAgIHN0ciA9IGxzLmZpbGVbaV0ubmFtZTsKLSAgICAgIHNsYXNoID0gc3RycmNociAoc3RyLCAnLycpOwotICAgICAgaWYgKHNsYXNoKQotCXsKLQkgICpzbGFzaCA9ICdcMCc7Ci0JICBmb3IgKGogPSAwLCBkcCA9IGRpcl9saXN0OyBqIDwgbnVtX2RpcnM7ICsraikKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKHN0ciwgZHApID09IDApCi0JCXsKLQkJICBscy5maWxlW2ldLmRpciA9IGogKyAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZHAgKz0gc3RybGVuIChkcCk7Ci0JICAgIH0KLQkgIGlmIChqID49IG51bV9kaXJzKQotCSAgICB7Ci0JICAgICAgLyogZGlkbid0IGZpbmQgdGhpcyBkaXJlY3Rvcnk6IGFwcGVuZCBpdCB0byB0aGUgbGlzdCAqLwotCSAgICAgIHNpemVfdCBzaXplID0gc3RybGVuIChzdHIpICsgMTsKLQkgICAgICBjcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0JICAgICAgbWVtY3B5IChjcCwgc3RyLCBzaXplKTsKLQkgICAgICBscy5maWxlW2ldLmRpciA9ICsrbnVtX2RpcnM7Ci0JICAgIH0KLQkgICpzbGFzaCA9ICcvJzsKLQkgIGxzLmZpbGVbaV0ubmFtZSA9IHNsYXNoICsgMTsKLQl9Ci0gICAgfQotICBvdXRfYnl0ZSAoJ1wwJyk7CS8qIHRlcm1pbmF0ZSBkaXJlY3RvcnkgbGlzdCAqLwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2ZpbGVfbGlzdCAoKQotewotICBzaXplX3Qgc2l6ZTsKLSAgY2hhciAqY3A7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBscy5udW1fZmlsZW5hbWVzOyArK2kpCi0gICAgewotICAgICAgc2l6ZSA9IHN0cmxlbiAobHMuZmlsZVtpXS5uYW1lKSArIDE7Ci0gICAgICBjcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0gICAgICBtZW1jcHkgKGNwLCBscy5maWxlW2ldLm5hbWUsIHNpemUpOwotCi0gICAgICBvdXRfdWxlYjEyOCAobHMuZmlsZVtpXS5kaXIpOwkvKiBkaXJlY3RvcnkgbnVtYmVyICovCi0gICAgICBvdXRfdWxlYjEyOCAoMCk7CQkJLyogbGFzdCBtb2RpZmljYXRpb24gdGltZXN0YW1wICovCi0gICAgICBvdXRfdWxlYjEyOCAoMCk7CQkJLyogZmlsZXNpemUgKi8KLSAgICB9Ci0gIG91dF9ieXRlICgwKTsJCS8qIHRlcm1pbmF0ZSBmaWxlbmFtZSBsaXN0ICovCi19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0cyAodG90YWxfc2l6ZSkKLSAgICAgdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwotewotICBzdGF0aWMgY29uc3QgY2hhciAqb3BjX25hbWVbXSA9Ci0gICAgewotICAgICAgImV4dGVuZGVkIiwgImNvcHkiLCAiYWR2YW5jZV9wYyIsICJhZHZhbmNlX2xpbmUiLCAic2V0X2ZpbGUiLAotICAgICAgInNldF9jb2x1bW4iLCAibmVnYXRlX3N0bXQiLCAic2V0X2Jhc2ljX2Jsb2NrIiwgImNvbnN0X2FkZF9wYyIsCi0gICAgICAiZml4ZWRfYWR2YW5jZV9wYyIKLSAgICB9OwotICBpbnQgaSwgajsKLQotICBmcHJpbnRmIChzdGRlcnIsICJBdmVyYWdlIHNpemU6ICVnIGJ5dGVzL2xpbmVcbiIsCi0JICAgdG90YWxfc2l6ZSAvIChkb3VibGUpIGxzLm51bV9saW5lX2VudHJpZXMpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuU3RhbmRhcmQgb3Bjb2RlIGhpc3RvZ3JhbTpcbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wY19uYW1lKS9zaXplb2YgKG9wY19uYW1lWzBdKTsgKytpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzIiwgb3BjX25hbWVbaV0pOwotICAgICAgZm9yIChqID0gc3RybGVuIChvcGNfbmFtZVtpXSk7IGogPCAxNjsgKytqKQotCWZwcmludGYgKHN0ZGVyciwgIiAiKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogJXVcbiIsIGxzLm9wY29kZV9oaXN0W2ldKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG5TcGVjaWFsIG9wY29kZXM6XG5hZGRyXHRcdFx0XHRsaW5lIHNraXBcbiIpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgInNraXA6ICIpOwotICBmb3IgKGogPSBEV0FSRjJfTElORV9CQVNFOyBqIDwgRFdBUkYyX0xJTkVfQkFTRSArIERXQVJGMl9MSU5FX1JBTkdFOyArK2opCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJTNkIiwgaik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuLS0tLS0iKTsKLQotICBmb3IgKDsgaSA8IDI1NjsgKytpKQotICAgIHsKLSAgICAgIGogPSBTUEVDSUFMX0xJTkUgKGkpOwotICAgICAgaWYgKGogPT0gRFdBUkYyX0xJTkVfQkFTRSkKLQlmcHJpbnRmIChzdGRlcnIsICJcbiU0dTogIiwKLQkJIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSCpTUEVDSUFMX0FERFIgKGkpKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAlMnUiLCBscy5vcGNvZGVfaGlzdFtpXSk7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi12b2lkCi1kd2FyZjJfZmluaXNoICgpCi17Ci0gIGFkZHJlc3NUIGJvZHlfc2l6ZSwgdG90YWxfc2l6ZSwgcHJvbG9nX3NpemU7Ci0gIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnOwotICBzZWdUIHNhdmVkX3NlZzsKLSAgY2hhciAqY3A7Ci0KLSAgaWYgKCFscy5saW5lX3NlZykKLSAgICAvKiBubyAuZGVidWdfbGluZSBzZWdtZW50LCBubyB3b3JrIHRvIGRvLi4uICovCi0gICAgcmV0dXJuOwotCi0gIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgaWYgKCFscy5zbS5lbXB0eV9zZXF1ZW5jZSkKLSAgICBvdXRfZW5kX3NlcXVlbmNlICgpOwotICB0b3RhbF9zaXplID0gYm9keV9zaXplID0gZnJhZ19ub3dfZml4ICgpOwotCi0gIC8qIG5vdyBnZW5lcmF0ZSB0aGUgZGlyZWN0b3J5IGFuZCBmaWxlIGxpc3RzOiAqLwotICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfRklMRVMpOwotICBnZW5fZGlyX2xpc3QgKCk7Ci0gIGdlbl9maWxlX2xpc3QgKCk7Ci0gIHRvdGFsX3NpemUgKz0gZnJhZ19ub3dfZml4ICgpOwotCi0gIC8qIGFuZCBub3cgdGhlIGhlYWRlciAoInN0YXRlbWVudCBwcm9ncmFtIHByb2xvZyIsIGluIERXQVJGMiBsaW5nby4uLikgKi8KLSAgc3Vic2VnX3NldCAobHMubGluZV9zZWcsIERMX1BST0xPRyk7Ci0KLSAgY3AgPSBmcmFnX21vcmUgKDE1ICsgRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UgLSAxKTsKLQotICB0b3RhbF9zaXplICs9IGZyYWdfbm93X2ZpeCAoKTsKLSAgcHJvbG9nX3NpemUgPSB0b3RhbF9zaXplIC0gYm9keV9zaXplIC0gMTA7Ci0KLSMgZGVmaW5lIFNUVUZGKHZhbCxzaXplKQltZF9udW1iZXJfdG9fY2hhcnMgKGNwLCB2YWwsIHNpemUpOyBjcCArPSBzaXplOwotICBTVFVGRiAodG90YWxfc2l6ZSAtIDQsIDQpOwkvKiBsZW5ndGggKi8KLSAgU1RVRkYgKDIsIDIpOwkJCS8qIHZlcnNpb24gKi8KLSAgU1RVRkYgKHByb2xvZ19zaXplLCA0KTsJLyogcHJvbG9ndWVfbGVuZ3RoICovCi0gIFNUVUZGIChEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEgsIDEpOwotICBTVFVGRiAoRFdBUkYyX0xJTkVfREVGQVVMVF9JU19TVE1ULCAxKTsKLSAgU1RVRkYgKERXQVJGMl9MSU5FX0JBU0UsIDEpOwotICBTVFVGRiAoRFdBUkYyX0xJTkVfUkFOR0UsIDEpOwotICBTVFVGRiAoRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UsIDEpOwotCi0gIC8qIHN0YW5kYXJkX29wY29kZV9sZW5ndGhzOiAqLwotICBTVFVGRiAoMCwgMSk7CQkJLyogRFdfTE5TX2NvcHkgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19hZHZhbmNlX3BjICovCi0gIFNUVUZGICgxLCAxKTsJCQkvKiBEV19MTlNfYWR2YW5jZV9saW5lICovCi0gIFNUVUZGICgxLCAxKTsJCQkvKiBEV19MTlNfc2V0X2ZpbGUgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19zZXRfY29sdW1uICovCi0gIFNUVUZGICgwLCAxKTsJCQkvKiBEV19MTlNfbmVnYXRlX3N0bXQgKi8KLSAgU1RVRkYgKDAsIDEpOwkJCS8qIERXX0xOU19zZXRfYmFzaWNfYmxvY2sgKi8KLSAgU1RVRkYgKDAsIDEpOwkJCS8qIERXX0xOU19jb25zdF9hZGRfcGMgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19maXhlZF9hZHZhbmNlX3BjICovCi0KLSAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotCi0gIGlmIChmbGFnX2RlYnVnKQotICAgIHByaW50X3N0YXRzICh0b3RhbF9zaXplKTsKLX0KLQotdm9pZAotZHdhcmYyX2RpcmVjdGl2ZV9maWxlIChkdW1teSkKLSAgICAgaW50IGR1bW15OwotewotICBpbnQgbGVuOwotCi0gIC8qIENvbnRpbnVlIHRvIGFjY2VwdCBhIGJhcmUgc3RyaW5nIGFuZCBwYXNzIGl0IG9mZi4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotICAgIHsKLSAgICAgIHNfYXBwX2ZpbGUgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBscy5hbnlfZHdhcmYyX2RpcmVjdGl2ZXMgPSAxOwotCi0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX05PTkUpCi0gICAgLyogQXV0b21hdGljYWxseSB0dXJuIG9uIERXQVJGMiBkZWJ1ZyBpbmZvIHVubGVzcyBzb21ldGhpbmcgZWxzZQotICAgICAgIGhhcyBiZWVuIHNlbGVjdGVkLiAgKi8KLSAgICBkZWJ1Z190eXBlID0gREVCVUdfRFdBUkYyOwotCi0gIGxzLmN1cnJlbnQuZmlsZW51bSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBscy5jdXJyZW50LmZpbGVuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLWR3YXJmMl9kaXJlY3RpdmVfbG9jIChkdW1teSkKLSAgICAgaW50IGR1bW15OwotewotICBscy5hbnlfZHdhcmYyX2RpcmVjdGl2ZXMgPSAxOwotCi0gIGxzLmN1cnJlbnQuZmlsZW51bSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGxzLmN1cnJlbnQubGluZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGxzLmN1cnJlbnQuY29sdW1uID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgbHMuY3VycmVudC5mbGFncyA9IERXQVJGMl9GTEFHX0JFR0lOX1NUTVQ7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3NvdXJjZV9saW5lIChscy5jdXJyZW50LmxpbmUpOwotI2VuZGlmCi19Ci0KLXZvaWQKLWR3YXJmMl93aGVyZSAobGluZSkKLSAgICAgc3RydWN0IGR3YXJmMl9saW5lX2luZm8gKmxpbmU7Ci17Ci0gIGlmIChscy5hbnlfZHdhcmYyX2RpcmVjdGl2ZXMpCi0gICAgKmxpbmUgPSBscy5jdXJyZW50OwotICBlbHNlCi0gICAgewotICAgICAgYXNfd2hlcmUgKCZsaW5lLT5maWxlbmFtZSwgJmxpbmUtPmxpbmUpOwotICAgICAgbGluZS0+ZmlsZW51bSA9IDA7Ci0gICAgICBsaW5lLT5jb2x1bW4gPSAwOwotICAgICAgbGluZS0+ZmxhZ3MgPSBEV0FSRjJfRkxBR19CRUdJTl9TVE1UOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy9kd2FyZjJkYmcuaCBiL2dhcy9kd2FyZjJkYmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlZWMxYy4uMDAwMDAwMAotLS0gYS9nYXMvZHdhcmYyZGJnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBkd2FyZjJkYmcuaCAtIERXQVJGMiBkZWJ1ZyBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQVNfRFdBUkYyREJHX0gKLSNkZWZpbmUgQVNfRFdBUkYyREJHX0gKLQotI2luY2x1ZGUgImFzLmgiCi0KLSNkZWZpbmUgRFdBUkYyX0ZMQUdfQkVHSU5fU1RNVAkoMSA8PCAwKQkvKiBiZWdpbm5pbmcgb2Ygc3RhdGVtZW50ICovCi0jZGVmaW5lIERXQVJGMl9GTEFHX0JFR0lOX0JMT0NLCSgxIDw8IDEpCS8qIGJlZ2lubmluZyBvZiBiYXNpYyBibG9jayAqLwotCi1zdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbwotICB7Ci0gICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgdW5zaWduZWQgaW50IGZpbGVudW07Ci0gICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgdW5zaWduZWQgaW50IGNvbHVtbjsKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0gIH07Ci0KLS8qIEltcGxlbWVudHMgdGhlIC5maWxlIEZJTEVOTyAiRklMRU5BTUUiIGRpcmVjdGl2ZS4gIEZJTEVOTyBjYW4gYmUgMAotICAgdG8gaW5kaWNhdGUgdGhhdCBubyBmaWxlIG51bWJlciBoYXMgYmVlbiBhc3NpZ25lZC4gIEFsbCByZWFsIGZpbGUKLSAgIG51bWJlciBtdXN0IGJlID4wLiAgKi8KLWV4dGVybiB2b2lkIGR3YXJmMl9kaXJlY3RpdmVfZmlsZSBQQVJBTVMgKChpbnQgZHVtbXkpKTsKLQotLyogSW1wbGVtZW50cyB0aGUgLmxvYyBGSUxFTk8gTElORU5PIFtDT0xVTU5dIGRpcmVjdGl2ZS4gIEZJTEVOTyBpcwotICAgdGhlIGZpbGUgbnVtYmVyLCBMSU5FTk8gdGhlIGxpbmUgbnVtYmVyIGFuZCB0aGUgKG9wdGlvbmFsKSBDT0xVTU4KLSAgIHRoZSBjb2x1bW4gb2YgdGhlIHNvdXJjZSBjb2RlIHRoYXQgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbgotICAgY29ycmVzcG9uZHMgdG8uICBGSUxFTk8gY2FuIGJlIDAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmlsZW5hbWUKLSAgIHNwZWNpZmllZCBieSB0aGUgdGV4dHVhbGx5IG1vc3QgcmVjZW50IC5maWxlIGRpcmVjdGl2ZSBzaG91bGQgYmUKLSAgIHVzZWQuICAqLwotZXh0ZXJuIHZvaWQgZHdhcmYyX2RpcmVjdGl2ZV9sb2MgUEFSQU1TICgoaW50IGR1bW15KSk7Ci0KLS8qIFJldHVybnMgdGhlIGN1cnJlbnQgc291cmNlIGluZm9ybWF0aW9uLiAgSWYgLmZpbGUgZGlyZWN0aXZlcyBoYXZlCi0gICBiZWVuIGVuY291bnRlcmVkLCB0aGUgaW5mbyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGUgaXMKLSAgIHJldHVybmVkLiAgT3RoZXJ3aXNlLCB0aGUgaW5mbyBmb3IgdGhlIGFzc2VtYmx5IHNvdXJjZSBmaWxlIGlzCi0gICByZXR1cm5lZC4gICovCi1leHRlcm4gdm9pZCBkd2FyZjJfd2hlcmUgUEFSQU1TICgoc3RydWN0IGR3YXJmMl9saW5lX2luZm8gKmwpKTsKLQotLyogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgLmRlYnVnX2xpbmUgaW5mbyBiYXNlZCBvbiB0aGUgYWRkcmVzcyBhbmQKLSAgIHNvdXJjZSBpbmZvcm1hdGlvbiBwYXNzZWQgaW4gdGhlIGFyZ3VtZW50cy4gIEFERFIgc2hvdWxkIGJlIHRoZQotICAgZnJhZy1yZWxhdGl2ZSBvZmZzZXQgb2YgdGhlIGluc3RydWN0aW9uIHRoZSBpbmZvcm1hdGlvbiBpcyBmb3IgYW5kCi0gICBMIGlzIHRoZSBzb3VyY2UgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQKLSAgIGFkZHJlc3MuICovCi1leHRlcm4gdm9pZCBkd2FyZjJfZ2VuX2xpbmVfaW5mbyBQQVJBTVMgKChhZGRyZXNzVCBhZGRyLAotCQkJCQkgIHN0cnVjdCBkd2FyZjJfbGluZV9pbmZvICpsKSk7Ci0KLS8qIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCBvdGhlciBpbnB1dCBpcyBwcm9jZXNzZWQgdG8gZmluaXNoIHVwIHRoZQotICAgLmRlYnVnX2xpbmUgc2VjdGlvbi4gICovCi1leHRlcm4gdm9pZCBkd2FyZjJfZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIEFTX0RXQVJGMkRCR19IICovCmRpZmYgLS1naXQgYS9nYXMvZWNvZmYuYyBiL2dhcy9lY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZjOGM0Li4wMDAwMDAwCi0tLSBhL2dhcy9lY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMxOCArMCwwIEBACi0vKiBFQ09GRiBkZWJ1Z2dpbmcgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBUaGlzIGZpbGUgd2FzIHB1dCB0b2dldGhlciBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICBBCi0gICBnb29kIGRlYWwgb2YgaXQgY29tZXMgZGlyZWN0bHkgZnJvbSBtaXBzLXRmaWxlLmMsIGJ5IE1pY2hhZWwKLSAgIE1laXNzbmVyIDxtZWlzc25lckBvc2Yub3JnPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGNvbmRpdGlvbmFsbHkgZm9yIHRob3NlIHRhcmdldHMgd2hpY2ggdXNlCi0gICBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKGUuZy4sIE1JUFMgRUNPRkYsIE1JUFMgRUxGLCBBbHBoYQotICAgRUNPRkYpLiAgKi8KLQotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogV2h5IGlzbid0IHRoaXMgaW4gY29mZi9zeW0uaD8gICovCi0jZGVmaW5lIFNUX1JGREVTQ0FQRSAweGZmZgotCi0vKiBUaGlzIGZpbGUgY29uc3RydWN0cyB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgRUNPRkYgZGVidWdnaW5nCi0gICBmb3JtYXQuICBJdCBqdXN0IGJ1aWxkcyBhIGxhcmdlIGJsb2NrIG9mIGRhdGEuCi0KLSAgIFdlIHN1cHBvcnQgYm90aCBFQ09GRiBzdHlsZSBkZWJ1Z2dpbmcgYW5kIHN0YWJzIGRlYnVnZ2luZyAodGhlCi0gICBzdGFicyBzeW1ib2xzIGFyZSBlbmNhcHN1bGF0ZWQgaW4gRUNPRkYgc3ltYm9scykuICBUaGlzIHNob3VsZCBsZXQKLSAgIHVzIGhhbmRsZSBhbnl0aGluZyB0aGUgY29tcGlsZXIgbWlnaHQgdGhyb3cgYXQgdXMuICAqLwotCi0vKiBIZXJlIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIE1JUFMgRUNPRkYgc3ltYm9sIHRhYmxlLCBieQotICAgTWljaGFlbCBNZWlzc25lci4gIFRoZSBNSVBTIHN5bWJvbCB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBwaWVjZXM6Ci0KLQlTeW1ib2xpYyBIZWFkZXIKLQkgICAgfAotCSAgICArLS0JQXV4aWxpYXJ5IFN5bWJvbHMKLQkgICAgfAotCSAgICArLS0JRGVuc2UgbnVtYmVyIHRhYmxlCi0JICAgIHwKLQkgICAgKy0tCU9wdGltaXplciBTeW1ib2xzCi0JICAgIHwKLQkgICAgKy0tCUV4dGVybmFsIFN0cmluZ3MKLQkgICAgfAotCSAgICArLS0JRXh0ZXJuYWwgU3ltYm9scwotCSAgICB8Ci0JICAgICstLQlSZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3JzCi0JICAgIHwKLQkgICAgKy0tCUZpbGUgdGFibGUKLQkJICAgIHwKLQkJICAgICstLQlQcm9jZWR1cmUgdGFibGUKLQkJICAgIHwKLQkJICAgICstLQlMaW5lIG51bWJlciB0YWJsZQotCQkgICAgfAotCQkgICAgKy0tCUxvY2FsIFN0cmluZ3MKLQkJICAgIHwKLQkJICAgICstLQlMb2NhbCBTeW1ib2xzCi0KLSAgIFRoZSBzeW1ib2xpYyBoZWFkZXIgcG9pbnRzIHRvIGVhY2ggb2YgdGhlIG90aGVyIHRhYmxlcywgYW5kIGFsc28KLSAgIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZW50cmllcy4gIEl0IGFsc28gY29udGFpbnMgYSBtYWdpYyBudW1iZXIKLSAgIGFuZCBNSVBTIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzIDIuMC4KLQotICAgVGhlIGF1eGlsaWFyeSB0YWJsZSBpcyBhIHNlcmllcyBvZiAzMiBiaXQgaW50ZWdlcnMsIHRoYXQgYXJlCi0gICByZWZlcmVuY2VkIGFzIG5lZWRlZCBmcm9tIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUuICBVbmxpa2Ugc3RhbmRhcmQKLSAgIENPRkYsIHRoZSBhdXguICBpbmZvcm1hdGlvbiBkb2VzIG5vdCBmb2xsb3cgdGhlIHN5bWJvbCB0aGF0IHVzZXMKLSAgIGl0LCBidXQgcmF0aGVyIGlzIGEgc2VwYXJhdGUgdGFibGUuICBJbiB0aGVvcnksIHRoaXMgd291bGQgYWxsb3cKLSAgIHRoZSBNSVBTIGNvbXBpbGVycyB0byBjb2xsYXBzZSBkdXBsaWNhdGUgYXV4LiBlbnRyaWVzLCBidXQgSSd2ZSBub3QKLSAgIG5vdGljZWQgdGhpcyBoYXBwZW5pbmcgd2l0aCB0aGUgMS4zMSBjb21waWxlciBzdWl0ZS4gIFRoZSBkaWZmZXJlbnQKLSAgIHR5cGVzIG9mIGF1eC4gZW50cmllcyBhcmU6Ci0KLSAgICAxKQlkbkxvdzogTG93IGJvdW5kIG9uIGFycmF5IGRpbWVuc2lvbi4KLQotICAgIDIpCWRuSGlnaDogSGlnaCBib3VuZCBvbiBhcnJheSBkaW1lbnNpb24uCi0KLSAgICAzKQlpc3ltOiBJbmRleCB0byB0aGUgbG9jYWwgc3ltYm9sIHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUKLQlmdW5jdGlvbiBmb3IgdGhlIGVuZCBvZiBmdW5jdGlvbiBmaXJzdCBhdXguIGVudHJ5LgotCi0gICAgNCkJd2lkdGg6IFdpZHRoIG9mIHN0cnVjdHVyZXMgYW5kIGJpdGZpZWxkcy4KLQotICAgIDUpCWNvdW50OiBDb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgcGFydC4KLQotICAgIDYpCXJuZHg6IEEgcmVsYXRpdmUgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIHJlbGF0aXZlCi0JaW5kZXggZmllbGQgaGFzIHR3byBwYXJ0czogcmZkIHdoaWNoIGlzIGEgcG9pbnRlciBpbnRvIHRoZQotCXJlbGF0aXZlIGZpbGUgaW5kZXggdGFibGUgb3IgU1RfUkZERVNDQVBFIHdoaWNoIHNheXMgdGhlIG5leHQKLQlhdXguIGVudHJ5IGlzIHRoZSBmaWxlIG51bWJlciwgYW5kIGluZGV4OiB3aGljaCBpcyB0aGUgcG9pbnRlcgotCWludG8gdGhlIGxvY2FsIHN5bWJvbCB3aXRoaW4gYSBnaXZlbiBmaWxlIHRhYmxlLiAgVGhpcyBpcyBmb3IKLQl0aGluZ3MgbGlrZSByZWZlcmVuY2VzIHRvIHR5cGVzIGRlZmluZWQgaW4gYW5vdGhlciBmaWxlLgotCi0gICAgNykJVHlwZSBpbmZvcm1hdGlvbjogVGhpcyBpcyBsaWtlIHRoZSBDT0ZGIHR5cGUgYml0cywgZXhjZXB0IGl0Ci0JaXMgMzIgYml0cyBpbnN0ZWFkIG9mIDE2OyB0aGV5IHN0aWxsIGhhdmUgcm9vbSB0byBhZGQgbmV3Ci0JYmFzaWMgdHlwZXM7IGFuZCB0aGV5IGNhbiBoYW5kbGUgbW9yZSB0aGFuIDYgbGV2ZWxzIG9mIGFycmF5LAotCXBvaW50ZXIsIGZ1bmN0aW9uLCBldGMuICBFYWNoIHR5cGUgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMKLQl0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzOgotCi0JICAgIGEpCWZCaXRmaWVsZDogYSBiaXQgdGhhdCBzYXlzIHRoaXMgaXMgYSBiaXRmaWVsZCwgYW5kIHRoZQotCQlzaXplIGluIGJpdHMgZm9sbG93cyBhcyB0aGUgbmV4dCBhdXguIGVudHJ5LgotCi0JICAgIGIpCWNvbnRpbnVlZDogYSBiaXQgdGhhdCBzYXlzIHRoZSBuZXh0IGF1eC4gZW50cnkgaXMgYQotCQljb250aW51YXRpb24gb2YgdGhlIGN1cnJlbnQgdHlwZSBpbmZvcm1hdGlvbiAoaW4gY2FzZQotCQl0aGVyZSBhcmUgbW9yZSB0aGFuIDYgbGV2ZWxzIG9mIGFycmF5L3B0ci9mdW5jdGlvbikuCi0KLQkgICAgYykJYnQ6IGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYmFzZSB0eXBlIGJlZm9yZSBhZGRpbmcKLQkJYXJyYXksIHBvaW50ZXIsIGZ1bmN0aW9uLCBldGMuIHF1YWxpZmllcnMuICBUaGUKLQkJY3VycmVudCBiYXNlIHR5cGVzIHRoYXQgSSBoYXZlIGRvY3VtZW50YXRpb24gZm9yIGFyZToKLQotCQkJYnROaWwJCS0tIHVuZGVmaW5lZAotCQkJYnRBZHIJCS0tIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwdHIKLQkJCWJ0Q2hhcgkJLS0gY2hhcmFjdGVyCi0JCQlidFVDaGFyCQktLSB1bnNpZ25lZCBjaGFyYWN0ZXIKLQkJCWJ0U2hvcnQJCS0tIHNob3J0Ci0JCQlidFVTaG9ydAktLSB1bnNpZ25lZCBzaG9ydAotCQkJYnRJbnQJCS0tIGludAotCQkJYnRVSW50CQktLSB1bnNpZ25lZCBpbnQKLQkJCWJ0TG9uZwkJLS0gbG9uZwotCQkJYnRVTG9uZwkJLS0gdW5zaWduZWQgbG9uZwotCQkJYnRGbG9hdAkJLS0gZmxvYXQgKHJlYWwpCi0JCQlidERvdWJsZQktLSBEb3VibGUgKHJlYWwpCi0JCQlidFN0cnVjdAktLSBTdHJ1Y3R1cmUgKFJlY29yZCkKLQkJCWJ0VW5pb24JCS0tIFVuaW9uICh2YXJpYW50KQotCQkJYnRFbnVtCQktLSBFbnVtZXJhdGVkCi0JCQlidFR5cGVkZWYJLS0gZGVmaW5lZCB2aWEgYSB0eXBlZGVmIGlzeW1SZWYKLQkJCWJ0UmFuZ2UJCS0tIHN1YnJhbmdlIG9mIGludAotCQkJYnRTZXQJCS0tIHBhc2NhbCBzZXRzCi0JCQlidENvbXBsZXgJLS0gZm9ydHJhbiBjb21wbGV4Ci0JCQlidERDb21wbGV4CS0tIGZvcnRyYW4gZG91YmxlIGNvbXBsZXgKLQkJCWJ0SW5kaXJlY3QJLS0gZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYKLQkJCWJ0Rml4ZWREZWMJLS0gRml4ZWQgRGVjaW1hbAotCQkJYnRGbG9hdERlYwktLSBGbG9hdCBEZWNpbWFsCi0JCQlidFN0cmluZwktLSBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nCi0JCQlidEJpdAkJLS0gQWxpZ25lZCBCaXQgU3RyaW5nCi0JCQlidFBpY3R1cmUJLS0gUGljdHVyZQotCQkJYnRWb2lkCQktLSBWb2lkIChNSVBTIGNjIHJldmlzaW9uID49IDIuMDApCi0KLQkgICAgZCkJdHEwIC0gdHE1OiB0eXBlIHF1YWxpZmllciBmaWVsZHMgYXMgbmVlZGVkLiAgVGhlCi0JCWN1cnJlbnQgdHlwZSBxdWFsaWZpZXIgZmllbGRzIEkgaGF2ZSBkb2N1bWVudGF0aW9uIGZvcgotCQlhcmU6Ci0KLQkJCXRxTmlsCQktLSBubyBtb3JlIHF1YWxpZmllcnMKLQkJCXRxUHRyCQktLSBwb2ludGVyCi0JCQl0cVByb2MJCS0tIHByb2NlZHVyZQotCQkJdHFBcnJheQkJLS0gYXJyYXkKLQkJCXRxRmFyCQktLSA4MDg2IGZhciBwb2ludGVycwotCQkJdHFWb2wJCS0tIHZvbGF0aWxlCi0KLQotICAgVGhlIGRlbnNlIG51bWJlciB0YWJsZSBpcyB1c2VkIGluIHRoZSBmcm9udCBlbmRzLCBhbmQgZGlzYXBwZWFycyBieQotICAgdGhlIHRpbWUgdGhlIC5vIGlzIGNyZWF0ZWQuCi0KLSAgIFdpdGggdGhlIDEuMzEgY29tcGlsZXIgc3VpdGUsIHRoZSBvcHRpbWl6YXRpb24gc3ltYm9scyBkb24ndCBzZWVtCi0gICB0byBiZSB1c2VkIGFzIGZhciBhcyBJIGNhbiB0ZWxsLgotCi0gICBUaGUgbGlua2VyIGlzIHRoZSBmaXJzdCBlbnRpdHkgdGhhdCBjcmVhdGVzIHRoZSByZWxhdGl2ZSBmaWxlCi0gICBkZXNjcmlwdG9yIHRhYmxlLCBhbmQgSSBiZWxpZXZlIGl0IGlzIHVzZWQgc28gdGhhdCB0aGUgaW5kaXZpZHVhbAotICAgZmlsZSB0YWJsZSBwb2ludGVycyBkb24ndCBoYXZlIHRvIGJlIHJld3JpdHRlbiB3aGVuIHRoZSBvYmplY3RzIGFyZQotICAgbWVyZ2VkIHRvZ2V0aGVyIGludG8gdGhlIHByb2dyYW0gZmlsZS4KLQotICAgVW5saWtlIENPRkYsIHRoZSBiYXNpYyBzeW1ib2wgJiBzdHJpbmcgdGFibGVzIGFyZSBzcGxpdCBpbnRvCi0gICBleHRlcm5hbCBhbmQgbG9jYWwgc3ltYm9scy9zdHJpbmdzLiAgVGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24KLSAgIG9ubHkgZ29lcyBvZmYgb2YgdGhlIGV4dGVybmFsIHN5bWJvbCB0YWJsZSwgYW5kIHRoZSBkZWJ1ZwotICAgaW5mb3JtYXRpb24gb25seSBnb2VzIG9mZiBvZiB0aGUgaW50ZXJuYWwgc3ltYm9sIHRhYmxlLiAgVGhlCi0gICBleHRlcm5hbCBzeW1ib2xzIGNhbiBoYXZlIGxpbmtzIHRvIGFuIGFwcHJvcHJpYXRlIGZpbGUgaW5kZXggYW5kCi0gICBzeW1ib2wgd2l0aGluIHRoZSBmaWxlIHRvIGdpdmUgaXQgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaW5mb3JtYXRpb24uCi0gICBCZWNhdXNlIG9mIHRoaXMsIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFyZSBhY3R1YWxseSBsYXJnZXIgdGhhbiB0aGUKLSAgIGludGVybmFsIHN5bWJvbHMgKHRvIGNvbnRhaW4gdGhlIGxpbmsgaW5mb3JtYXRpb24pLCBhbmQgY29udGFpbiB0aGUKLSAgIGxvY2FsIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgYSBtZW1iZXIsIHRob3VnaCB0aGlzIG1lbWJlciBpcyBub3QgdGhlCi0gICBmaXJzdCBtZW1iZXIgb2YgdGhlIGV4dGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUgKCEpLiAgSSBzdXNwZWN0IHRoaXMKLSAgIHNwbGl0IGlzIHRvIG1ha2Ugc3RyaXAgZWFzaWVyIHRvIGRlYWwgd2l0aC4KLQotICAgRWFjaCBmaWxlIHRhYmxlIGhhcyBvZmZzZXRzIGZvciB3aGVyZSB0aGUgbGluZSBudW1iZXJzLCBsb2NhbAotICAgc3RyaW5ncywgbG9jYWwgc3ltYm9scywgYW5kIHByb2NlZHVyZSB0YWJsZSBzdGFydHMgZnJvbSB3aXRoaW4gdGhlCi0gICBnbG9iYWwgdGFibGVzLCBhbmQgdGhlIGluZGV4cyBhcmUgcmVzZXQgdG8gMCBmb3IgZWFjaCBvZiB0aG9zZQotICAgdGFibGVzIGZvciB0aGUgZmlsZS4KLQotICAgVGhlIHByb2NlZHVyZSB0YWJsZSBjb250YWlucyB0aGUgYmluYXJ5IGVxdWl2YWxlbnRzIG9mIHRoZSAuZW50Ci0gICAoc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGFkZHJlc3MpLCAuZnJhbWUgKHdoYXQgcmVnaXN0ZXIgaXMgdGhlCi0gICB2aXJ0dWFsIGZyYW1lIHBvaW50ZXIsIGNvbnN0YW50IG9mZnNldCBmcm9tIHRoZSByZWdpc3RlciB0byBvYnRhaW4KLSAgIHRoZSBWRlAsIGFuZCB3aGF0IHJlZ2lzdGVyIGhvbGRzIHRoZSByZXR1cm4gYWRkcmVzcyksIC5tYXNrLy5mbWFzawotICAgKGJpdG1hc2sgb2Ygc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgd2hlcmUgdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHN0b3JlZAotICAgcmVsYXRpdmUgdG8gdGhlIFZGUCkgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuICBJdCBhbHNvIGNvbnRhaW5zIHRoZQotICAgbG93IGFuZCBoaWdoIGJvdW5kcyBvZiB0aGUgbGluZSBudW1iZXJzIGlmIGRlYnVnZ2luZyBpcyB0dXJuZWQgb24uCi0KLSAgIFRoZSBsaW5lIG51bWJlciB0YWJsZSBpcyBhIGNvbXByZXNzZWQgZm9ybSBvZiB0aGUgbm9ybWFsIENPRkYgbGluZQotICAgdGFibGUuICBFYWNoIGxpbmUgbnVtYmVyIGVudHJ5IGlzIGVpdGhlciAxIG9yIDMgYnl0ZXMgbG9uZywgYW5kCi0gICBjb250YWlucyBhIHNpZ25lZCBkZWx0YSBmcm9tIHRoZSBwcmV2aW91cyBsaW5lLCBhbmQgYW4gdW5zaWduZWQKLSAgIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoaXMgc3RhdGVtZW50IHRha2VzLgotCi0gICBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOgotCi0gICAgMSkJaXNzOiBpbmRleCB0byB0aGUgbG9jYWwgc3RyaW5nIHRhYmxlIGdpdmluZyB0aGUgbmFtZSBvZiB0aGUKLQlzeW1ib2wuCi0KLSAgICAyKQl2YWx1ZTogdmFsdWUgb2YgdGhlIHN5bWJvbCAoYWRkcmVzcywgcmVnaXN0ZXIgbnVtYmVyLCBldGMuKS4KLQotICAgIDMpCXN0OiBzeW1ib2wgdHlwZS4gIFRoZSBjdXJyZW50IHN5bWJvbCB0eXBlcyBhcmU6Ci0KLQkgICAgc3ROaWwJICAtLSBOdXRoaW4nIHNwZWNpYWwKLQkgICAgc3RHbG9iYWwJICAtLSBleHRlcm5hbCBzeW1ib2wKLQkgICAgc3RTdGF0aWMJICAtLSBzdGF0aWMKLQkgICAgc3RQYXJhbQkgIC0tIHByb2NlZHVyZSBhcmd1bWVudAotCSAgICBzdExvY2FsCSAgLS0gbG9jYWwgdmFyaWFibGUKLQkgICAgc3RMYWJlbAkgIC0tIGxhYmVsCi0JICAgIHN0UHJvYwkgIC0tIEV4dGVybmFsIFByb2NlZHVyZQotCSAgICBzdEJsb2NrCSAgLS0gYmVnaW5uaW5nIG9mIGJsb2NrCi0JICAgIHN0RW5kCSAgLS0gZW5kIChvZiBhbnl0aGluZykKLQkgICAgc3RNZW1iZXIJICAtLSBtZW1iZXIgKG9mIGFueXRoaW5nKQotCSAgICBzdFR5cGVkZWYJICAtLSB0eXBlIGRlZmluaXRpb24KLQkgICAgc3RGaWxlCSAgLS0gZmlsZSBuYW1lCi0JICAgIHN0UmVnUmVsb2MJICAtLSByZWdpc3RlciByZWxvY2F0aW9uCi0JICAgIHN0Rm9yd2FyZAkgIC0tIGZvcndhcmRpbmcgYWRkcmVzcwotCSAgICBzdFN0YXRpY1Byb2MgIC0tIFN0YXRpYyBwcm9jZWR1cmUKLQkgICAgc3RDb25zdGFudAkgIC0tIGNvbnN0Ci0KLSAgICA0KQlzYzogc3RvcmFnZSBjbGFzcy4gIFRoZSBjdXJyZW50IHN0b3JhZ2UgY2xhc3NlcyBhcmU6Ci0KLQkgICAgc2NUZXh0CSAgLS0gdGV4dCBzeW1ib2wKLQkgICAgc2NEYXRhCSAgLS0gaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wKLQkgICAgc2NCc3MJICAtLSB1bi1pbml0aWFsaXplZCBkYXRhIHN5bWJvbAotCSAgICBzY1JlZ2lzdGVyCSAgLS0gdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlcgotCSAgICBzY0FicwkgIC0tIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZQotCSAgICBzY1VuZGVmaW5lZCAgIC0tIHdobyBrbm93cz8KLQkgICAgc2NDZGJMb2NhbAkgIC0tIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gc2UtPnZhLj8/Ci0JICAgIHNjQml0cwkgIC0tIHRoaXMgaXMgYSBiaXQgZmllbGQKLQkgICAgc2NDZGJTeXN0ZW0JICAtLSB2YWx1ZSBpcyBJTiBkZWJ1Z2dlcidzIGFkZHJlc3Mgc3BhY2UKLQkgICAgc2NSZWdJbWFnZQkgIC0tIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrCi0JICAgIHNjSW5mbwkgIC0tIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbgotCSAgICBzY1VzZXJTdHJ1Y3QgIC0tIGFkZHIgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcwotCSAgICBzY1NEYXRhCSAgLS0gbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YQotCSAgICBzY1NCc3MJICAtLSBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24KLQkgICAgc2NSRGF0YQkgIC0tIGxvYWQgdGltZSBvbmx5IHJlYWQgb25seSBkYXRhCi0JICAgIHNjVmFyCSAgLS0gVmFyIHBhcmFtZXRlciAoZm9ydHJhbnBhc2NhbCkKLQkgICAgc2NDb21tb24JICAtLSBjb21tb24gdmFyaWFibGUKLQkgICAgc2NTQ29tbW9uCSAgLS0gc21hbGwgY29tbW9uCi0JICAgIHNjVmFyUmVnaXN0ZXIgLS0gVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyCi0JICAgIHNjVmFyaWFudAkgIC0tIFZhcmlhbnQgcmVjb3JkCi0JICAgIHNjU1VuZGVmaW5lZCAgLS0gc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhCi0JICAgIHNjSW5pdAkgIC0tIC5pbml0IHNlY3Rpb24gc3ltYm9sCi0KLSAgICA1KQlpbmRleDogcG9pbnRlciB0byBhIGxvY2FsIHN5bWJvbCBvciBhdXguIGVudHJ5LgotCi0KLQotICAgRm9yIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbToKLQotCSNpbmNsdWRlIDxzdGRpby5oPgotCi0JbWFpbigpewotCQlwcmludGYoIkhlbGxvIFdvcmxkIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotICAgTWlwcy10ZHVtcCBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotCi0gICBHbG9iYWwgZmlsZSBoZWFkZXI6Ci0gICAgICAgbWFnaWMgbnVtYmVyICAgICAgICAgICAgIDB4MTYyCi0gICAgICAgIyBzZWN0aW9ucyAgICAgICAgICAgICAgIDIKLSAgICAgICB0aW1lc3RhbXAgICAgICAgICAgICAgICAgNjQ1MzExNzk5LCBXZWQgSnVuIDEzIDE3OjE2OjM5IDE5OTAKLSAgICAgICBzeW1ib2xpYyBoZWFkZXIgb2Zmc2V0ICAgMjg0Ci0gICAgICAgc3ltYm9saWMgaGVhZGVyIHNpemUgICAgIDk2Ci0gICAgICAgb3B0aW9uYWwgaGVhZGVyICAgICAgICAgIDU2Ci0gICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgIDB4MAotCi0gICBTeW1ib2xpYyBoZWFkZXIsIG1hZ2ljIG51bWJlciA9IDB4NzAwOSwgdnN0YW1wID0gMS4zMToKLQotICAgICAgIEluZm8gICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgTnVtYmVyICAgICAgIEJ5dGVzCi0gICAgICAgPT09PSAgICAgICAgICAgICAgICAgICAgICA9PT09PT0gICAgICA9PT09PT0gICAgICA9PT09PQotCi0gICAgICAgTGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAzODAgICAgICAgICAgIDQgICAgICAgICAgIDQgWzEzXQotICAgICAgIERlbnNlIG51bWJlcnMgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgUHJvY2VkdXJlcyBUYWJsZXMgICAgICAgICAgICAzODQgICAgICAgICAgIDEgICAgICAgICAgNTIKLSAgICAgICBMb2NhbCBTeW1ib2xzICAgICAgICAgICAgICAgIDQzNiAgICAgICAgICAxNiAgICAgICAgIDE5MgotICAgICAgIE9wdGltaXphdGlvbiBTeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgQXV4aWxpYXJ5IFN5bWJvbHMgICAgICAgICAgICA2MjggICAgICAgICAgMzkgICAgICAgICAxNTYKLSAgICAgICBMb2NhbCBTdHJpbmdzICAgICAgICAgICAgICAgIDc4NCAgICAgICAgICA4MCAgICAgICAgICA4MAotICAgICAgIEV4dGVybmFsIFN0cmluZ3MgICAgICAgICAgICAgODY0ICAgICAgICAgMTQ0ICAgICAgICAgMTQ0Ci0gICAgICAgRmlsZSBUYWJsZXMgICAgICAgICAgICAgICAgIDEwMDggICAgICAgICAgIDIgICAgICAgICAxNDQKLSAgICAgICBSZWxhdGl2ZSBGaWxlcyAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotICAgICAgIEV4dGVybmFsIFN5bWJvbHMgICAgICAgICAgICAxMTUyICAgICAgICAgIDIwICAgICAgICAgMzIwCi0KLSAgIEZpbGUgIzAsICJoZWxsbzIuYyIKLQotICAgICAgIE5hbWUgaW5kZXggID0gMSAgICAgICAgICBSZWFkaW4gICAgICA9IE5vCi0gICAgICAgTWVyZ2UgICAgICAgPSBObyAgICAgICAgIEVuZGlhbiAgICAgID0gTElUVExFCi0gICAgICAgRGVidWcgbGV2ZWwgPSBHMiAgICAgICAgIExhbmd1YWdlICAgID0gQwotICAgICAgIEFkciAgICAgICAgID0gMHgwMDAwMDAwMAotCi0gICAgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgICBOdW1iZXIgICAgICAgIFNpemUgICAgICBPZmZzZXQKLSAgICAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgICA9PT09PSAgICAgID09PT09PSAgICAgICAgPT09PSAgICAgID09PT09PQotICAgICAgIExvY2FsIHN0cmluZ3MgICAgICAgICAgICAgICAgICAwICAgICAgICAgIDE1ICAgICAgICAgIDE1ICAgICAgICAgNzg0Ci0gICAgICAgTG9jYWwgc3ltYm9scyAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDYgICAgICAgICAgNzIgICAgICAgICA0MzYKLSAgICAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAxMyAgICAgICAgICAxMyAgICAgICAgIDM4MAotICAgICAgIE9wdGltaXphdGlvbiBzeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgUHJvY2VkdXJlcyAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAgNTIgICAgICAgICAzODQKLSAgICAgICBBdXhpbGlhcnkgc3ltYm9scyAgICAgICAgICAgICAgMCAgICAgICAgICAxNCAgICAgICAgICA1NiAgICAgICAgIDYyOAotICAgICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0KLSAgICBUaGVyZSBhcmUgNiBsb2NhbCBzeW1ib2xzLCBzdGFydGluZyBhdCA0MzYKLQotCVN5bWJvbCMgMDogImhlbGxvMi5jIgotCSAgICBFbmQrMSBzeW1ib2wgID0gNgotCSAgICBTdHJpbmcgaW5kZXggID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gNgotCSAgICBTeW1ib2wgdHlwZSAgID0gRmlsZSAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOiAibWFpbiIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDUKLQkgICAgVHlwZSAgICAgICAgICA9IGludAotCSAgICBTdHJpbmcgaW5kZXggID0gMTAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEyCi0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDI6ICIiCi0JICAgIEVuZCsxIHN5bWJvbCAgPSA0Ci0JICAgIFN0cmluZyBpbmRleCAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSA0Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBCbG9jayAgICAgICBWYWx1ZSAgPSA4Ci0KLQlTeW1ib2wjIDM6ICIiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAyCi0JICAgIFN0cmluZyBpbmRleCAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAyCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAyOAotCi0JU3ltYm9sIyA0OiAibWFpbiIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDEKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSA1MgotCi0JU3ltYm9sIyA1OiAiaGVsbG8yLmMiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAwCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCi0KLSAgICBUaGVyZSBhcmUgMTQgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDYyOC4KLQotCSogIzAgICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMxICAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0JKiAjMiAgICAgICAgICAgICAgIDgsIFsgICA4LyAgICAgIDBdLCBbIDIgMDowIDA6MDowOjA6MDowXQotCSogIzMgICAgICAgICAgICAgIDE2LCBbICAxNi8gICAgICAwXSwgWyA0IDA6MCAwOjA6MDowOjA6MF0KLQkqICM0ICAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0JKiAjNSAgICAgICAgICAgICAgMzIsIFsgIDMyLyAgICAgIDBdLCBbIDggMDowIDA6MDowOjA6MDowXQotCSogIzYgICAgICAgICAgICAgIDQwLCBbICA0MC8gICAgICAwXSwgWzEwIDA6MCAwOjA6MDowOjA6MF0KLQkqICM3ICAgICAgICAgICAgICA0NCwgWyAgNDQvICAgICAgMF0sIFsxMSAwOjAgMDowOjA6MDowOjBdCi0JKiAjOCAgICAgICAgICAgICAgMTIsIFsgIDEyLyAgICAgIDBdLCBbIDMgMDowIDA6MDowOjA6MDowXQotCSogIzkgICAgICAgICAgICAgIDIwLCBbICAyMC8gICAgICAwXSwgWyA1IDA6MCAwOjA6MDowOjA6MF0KLQkqICMxMCAgICAgICAgICAgICAyOCwgWyAgMjgvICAgICAgMF0sIFsgNyAwOjAgMDowOjA6MDowOjBdCi0JKiAjMTEgICAgICAgICAgICAgMzYsIFsgIDM2LyAgICAgIDBdLCBbIDkgMDowIDA6MDowOjA6MDowXQotCSAgIzEyICAgICAgICAgICAgICA1LCBbICAgNS8gICAgICAwXSwgWyAxIDE6MCAwOjA6MDowOjA6MF0KLQkgICMxMyAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0KLSAgICBUaGVyZSBhcmUgMSBwcm9jZWR1cmUgZGVzY3JpcHRvciBlbnRyaWVzLCBzdGFydGluZyBhdCAwLgotCi0JUHJvY2VkdXJlIGRlc2NyaXB0b3IgMDoKLQkgICAgTmFtZSBpbmRleCAgID0gMTAgICAgICAgICAgTmFtZSAgICAgICAgICA9ICJtYWluIgotCSAgICAubWFzayAweDgwMDAwMDAwLC00ICAgICAgICAuZm1hc2sgMHgwMDAwMDAwMCwwCi0JICAgIC5mcmFtZSAkMjksMjQsJDMxCi0JICAgIE9wdC4gc3RhcnQgICA9IC0xICAgICAgICAgIFN5bWJvbHMgc3RhcnQgPSAxCi0JICAgIEZpcnN0IGxpbmUgIyA9IDMgICAgICAgICAgIExhc3QgbGluZSAjICAgPSA2Ci0JICAgIExpbmUgT2Zmc2V0ICA9IDAgICAgICAgICAgIEFkZHJlc3MgICAgICAgPSAweDAwMDAwMDAwCi0KLQlUaGVyZSBhcmUgNCBieXRlcyBob2xkaW5nIGxpbmUgbnVtYmVycywgc3RhcnRpbmcgYXQgMzgwLgotCSAgICBMaW5lICAgICAgICAgICAzLCAgIGRlbHRhICAgICAwLCAgIGNvdW50ICAyCi0JICAgIExpbmUgICAgICAgICAgIDQsICAgZGVsdGEgICAgIDEsICAgY291bnQgIDMKLQkgICAgTGluZSAgICAgICAgICAgNSwgICBkZWx0YSAgICAgMSwgICBjb3VudCAgMgotCSAgICBMaW5lICAgICAgICAgICA2LCAgIGRlbHRhICAgICAxLCAgIGNvdW50ICA2Ci0KLSAgIEZpbGUgIzEsICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKLQotICAgIE5hbWUgaW5kZXggID0gMSAgICAgICAgICBSZWFkaW4gICAgICA9IE5vCi0gICAgTWVyZ2UgICAgICAgPSBZZXMgICAgICAgIEVuZGlhbiAgICAgID0gTElUVExFCi0gICAgRGVidWcgbGV2ZWwgPSBHMiAgICAgICAgIExhbmd1YWdlICAgID0gQwotICAgIEFkciAgICAgICAgID0gMHgwMDAwMDAwMAotCi0gICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgICBOdW1iZXIgICAgICAgIFNpemUgICAgICBPZmZzZXQKLSAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgICA9PT09PSAgICAgID09PT09PSAgICAgICAgPT09PSAgICAgID09PT09PQotICAgIExvY2FsIHN0cmluZ3MgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgIDY1ICAgICAgICAgIDY1ICAgICAgICAgNzk5Ci0gICAgTG9jYWwgc3ltYm9scyAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgMTAgICAgICAgICAxMjAgICAgICAgICA1MDgKLSAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgIDM4MAotICAgIE9wdGltaXphdGlvbiBzeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgUHJvY2VkdXJlcyAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICA0MzYKLSAgICBBdXhpbGlhcnkgc3ltYm9scyAgICAgICAgICAgICAxNCAgICAgICAgICAyNSAgICAgICAgIDEwMCAgICAgICAgIDY4NAotICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0KLSAgICBUaGVyZSBhcmUgMTAgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgYXQgNDQyCi0KLQlTeW1ib2wjIDA6ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDEwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxMAotCSAgICBTeW1ib2wgdHlwZSAgID0gRmlsZSAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOiAiX2lvYnVmIgotCSAgICBFbmQrMSBzeW1ib2wgID0gOQotCSAgICBTdHJpbmcgaW5kZXggID0gMjIKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDkKLQkgICAgU3ltYm9sIHR5cGUgICA9IEJsb2NrICAgICAgIFZhbHVlICA9IDIwCi0KLQlTeW1ib2wjIDI6ICJfY250IgotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSAyOQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gNAotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAzOiAiX3B0ciIKLQkgICAgVHlwZSAgICAgICAgICA9IHB0ciB0byBjaGFyCi0JICAgIFN0cmluZyBpbmRleCAgPSAzNAotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMTUKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDMyCi0KLQlTeW1ib2wjIDQ6ICJfYmFzZSIKLQkgICAgVHlwZSAgICAgICAgICA9IHB0ciB0byBjaGFyCi0JICAgIFN0cmluZyBpbmRleCAgPSAzOQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMTYKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDY0Ci0KLQlTeW1ib2wjIDU6ICJfYnVmc2l6IgotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSA0NQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gNAotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gOTYKLQotCVN5bWJvbCMgNjogIl9mbGFnIgotCSAgICBUeXBlICAgICAgICAgID0gc2hvcnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUzCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAzCi0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSAxMjgKLQotCVN5bWJvbCMgNzogIl9maWxlIgotCSAgICBUeXBlICAgICAgICAgID0gY2hhcgotCSAgICBTdHJpbmcgaW5kZXggID0gNTkKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDIKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDE0NAotCi0JU3ltYm9sIyA4OiAiIgotCSAgICBGaXJzdCBzeW1ib2wgID0gMQotCSAgICBTdHJpbmcgaW5kZXggID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMQotCSAgICBTeW1ib2wgdHlwZSAgID0gRW5kICAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA5OiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAwCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCi0KLSAgICBUaGVyZSBhcmUgMjUgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDY0Mi4KLQotCSogIzE0ICAgICAgICAgICAgIC0xLCBbNDA5NS8xMDQ4NTc1XSwgWzYzIDE6MSBmOmY6ZjpmOmY6Zl0KLQkgICMxNSAgICAgICAgICA2NTU0NCwgWyAgIDgvICAgICAxNl0sIFsgMiAwOjAgMTowOjA6MDowOjBdCi0JICAjMTYgICAgICAgICAgNjU1NDQsIFsgICA4LyAgICAgMTZdLCBbIDIgMDowIDE6MDowOjA6MDowXQotCSogIzE3ICAgICAgICAgMTk2NjU2LCBbICA0OC8gICAgIDQ4XSwgWzEyIDA6MCAzOjA6MDowOjA6MF0KLQkqICMxOCAgICAgICAgICAgODE5MSwgWzQwOTUvICAgICAgMV0sIFs2MyAxOjEgMDowOjA6MDpmOjFdCi0JKiAjMTkgICAgICAgICAgICAgIDEsIFsgICAxLyAgICAgIDBdLCBbIDAgMTowIDA6MDowOjA6MDowXQotCSogIzIwICAgICAgICAgIDIwNDc5LCBbNDA5NS8gICAgICA0XSwgWzYzIDE6MSAwOjA6MDowOmY6NF0KLQkqICMyMSAgICAgICAgICAgICAgMSwgWyAgIDEvICAgICAgMF0sIFsgMCAxOjAgMDowOjA6MDowOjBdCi0JKiAjMjIgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzIzICAgICAgICAgICAgICAyLCBbICAgMi8gICAgICAwXSwgWyAwIDA6MSAwOjA6MDowOjA6MF0KLQkqICMyNCAgICAgICAgICAgIDE2MCwgWyAxNjAvICAgICAgMF0sIFs0MCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjUgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI2ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyNyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjggICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI5ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzEgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzMyICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzQgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM1ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzNiAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzcgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM4ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQotICAgIFRoZXJlIGFyZSAwIHByb2NlZHVyZSBkZXNjcmlwdG9yIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDEuCi0KLSAgIFRoZXJlIGFyZSAyMCBleHRlcm5hbCBzeW1ib2xzLCBzdGFydGluZyBhdCAxMTUyCi0KLQlTeW1ib2wjIDA6ICJfaW9iIgotCSAgICBUeXBlICAgICAgICAgID0gYXJyYXkgWzMgezE2MH1dIG9mIHN0cnVjdCBfaW9idWYgeyBpZmQgPSAxLCBpbmRleCA9IDEgfQotCSAgICBTdHJpbmcgaW5kZXggID0gMCAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTcKLQkgICAgU3ltYm9sIHR5cGUgICA9IEdsb2JhbCAgICAgIFZhbHVlICA9IDYwCi0KLQlTeW1ib2wjIDE6ICJmb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUgICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMjogImZkb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDExICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMzogImZyZW9wZW4iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxOCAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDQ6ICJwb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDI2ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNTogInRtcGZpbGUiCi0JICAgIFN0cmluZyBpbmRleCAgPSAzMiAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDY6ICJmdGVsbCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDQwICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNzogInJld2luZCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDQ2ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgODogInNldGJ1ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUzICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgOTogInNldGJ1ZmZlciIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDYwICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTA6ICJzZXRsaW5lYnVmIgotCSAgICBTdHJpbmcgaW5kZXggID0gNzAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMTogImZnZXRzIgotCSAgICBTdHJpbmcgaW5kZXggID0gODEgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMjogImdldHMiCi0JICAgIFN0cmluZyBpbmRleCAgPSA4NyAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDEzOiAiY3Rlcm1pZCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDkyICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTQ6ICJjdXNlcmlkIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTAwICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNTogInRlbXBuYW0iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMDggICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE2OiAidG1wbmFtIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTE2ICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNzogInNwcmludGYiCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMjMgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE4OiAibWFpbiIKLQkgICAgVHlwZSAgICAgICAgICA9IGludAotCSAgICBTdHJpbmcgaW5kZXggID0gMTMxICAgICAgICAgSWZkICAgID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOTogInByaW50ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEzNiAgICAgICAgIElmZCAgICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFVuZGVmaW5lZCAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotICAgVGhlIGZvbGxvd2luZyBhdXhpbGlhcnkgdGFibGUgZW50cmllcyB3ZXJlIHVudXNlZDoKLQotICAgICMwICAgICAgICAgICAgICAgMCAgMHgwMDAwMDAwMCAgdm9pZAotICAgICMyICAgICAgICAgICAgICAgOCAgMHgwMDAwMDAwOCAgY2hhcgotICAgICMzICAgICAgICAgICAgICAxNiAgMHgwMDAwMDAxMCAgc2hvcnQKLSAgICAjNCAgICAgICAgICAgICAgMjQgIDB4MDAwMDAwMTggIGludAotICAgICM1ICAgICAgICAgICAgICAzMiAgMHgwMDAwMDAyMCAgbG9uZwotICAgICM2ICAgICAgICAgICAgICA0MCAgMHgwMDAwMDAyOCAgZmxvYXQKLSAgICAjNyAgICAgICAgICAgICAgNDQgIDB4MDAwMDAwMmMgIGRvdWJsZQotICAgICM4ICAgICAgICAgICAgICAxMiAgMHgwMDAwMDAwYyAgdW5zaWduZWQgY2hhcgotICAgICM5ICAgICAgICAgICAgICAyMCAgMHgwMDAwMDAxNCAgdW5zaWduZWQgc2hvcnQKLSAgICAjMTAgICAgICAgICAgICAgMjggIDB4MDAwMDAwMWMgIHVuc2lnbmVkIGludAotICAgICMxMSAgICAgICAgICAgICAzNiAgMHgwMDAwMDAyNCAgdW5zaWduZWQgbG9uZwotICAgICMxNCAgICAgICAgICAgICAgMCAgMHgwMDAwMDAwMCAgdm9pZAotICAgICMxNSAgICAgICAgICAgICAyNCAgMHgwMDAwMDAxOCAgaW50Ci0gICAgIzE5ICAgICAgICAgICAgIDMyICAweDAwMDAwMDIwICBsb25nCi0gICAgIzIwICAgICAgICAgICAgIDQwICAweDAwMDAwMDI4ICBmbG9hdAotICAgICMyMSAgICAgICAgICAgICA0NCAgMHgwMDAwMDAyYyAgZG91YmxlCi0gICAgIzIyICAgICAgICAgICAgIDEyICAweDAwMDAwMDBjICB1bnNpZ25lZCBjaGFyCi0gICAgIzIzICAgICAgICAgICAgIDIwICAweDAwMDAwMDE0ICB1bnNpZ25lZCBzaG9ydAotICAgICMyNCAgICAgICAgICAgICAyOCAgMHgwMDAwMDAxYyAgdW5zaWduZWQgaW50Ci0gICAgIzI1ICAgICAgICAgICAgIDM2ICAweDAwMDAwMDI0ICB1bnNpZ25lZCBsb25nCi0gICAgIzI2ICAgICAgICAgICAgIDQ4ICAweDAwMDAwMDMwICBzdHJ1Y3Qgbm8gbmFtZSB7IGlmZCA9IC0xLCBpbmRleCA9IDEwNDg1NzUgfQotKi8KLQwKLS8qIFJlZGVmaW5pdGlvbiBvZiBvZiBzdG9yYWdlIGNsYXNzZXMgYXMgYW4gZW51bWVyYXRpb24gZm9yIGJldHRlcgotICAgZGVidWdnaW5nLiAgKi8KLQotdHlwZWRlZiBlbnVtIHNjIHsKLSAgc2NfTmlsCSA9IHNjTmlsLAkgIC8qIG5vIHN0b3JhZ2UgY2xhc3MgKi8KLSAgc2NfVGV4dAkgPSBzY1RleHQsCSAgLyogdGV4dCBzeW1ib2wgKi8KLSAgc2NfRGF0YQkgPSBzY0RhdGEsCSAgLyogaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSAgc2NfQnNzCSA9IHNjQnNzLAkgIC8qIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0gIHNjX1JlZ2lzdGVyCSA9IHNjUmVnaXN0ZXIsCSAgLyogdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlciAqLwotICBzY19BYnMJID0gc2NBYnMsCSAgLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCi0gIHNjX1VuZGVmaW5lZAkgPSBzY1VuZGVmaW5lZCwJICAvKiB3aG8ga25vd3M/ICovCi0gIHNjX0NkYkxvY2FsCSA9IHNjQ2RiTG9jYWwsCSAgLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBzZS0+dmEuPz8gKi8KLSAgc2NfQml0cwkgPSBzY0JpdHMsCSAgLyogdGhpcyBpcyBhIGJpdCBmaWVsZCAqLwotICBzY19DZGJTeXN0ZW0JID0gc2NDZGJTeXN0ZW0sCSAgLyogdmFsdWUgaXMgSU4gQ0RCJ3MgYWRkcmVzcyBzcGFjZSAqLwotICBzY19SZWdJbWFnZQkgPSBzY1JlZ0ltYWdlLAkgIC8qIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrICovCi0gIHNjX0luZm8JID0gc2NJbmZvLAkgIC8qIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiAqLwotICBzY19Vc2VyU3RydWN0CSA9IHNjVXNlclN0cnVjdCwgIC8qIGFkZHIgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcyAqLwotICBzY19TRGF0YQkgPSBzY1NEYXRhLAkgIC8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGRhdGEgKi8KLSAgc2NfU0JzcwkgPSBzY1NCc3MsCSAgLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgY29tbW9uICovCi0gIHNjX1JEYXRhCSA9IHNjUkRhdGEsCSAgLyogbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEgKi8KLSAgc2NfVmFyCSA9IHNjVmFyLAkgIC8qIFZhciBwYXJhbWV0ZXIgKGZvcnRyYW4scGFzY2FsKSAqLwotICBzY19Db21tb24JID0gc2NDb21tb24sCSAgLyogY29tbW9uIHZhcmlhYmxlICovCi0gIHNjX1NDb21tb24JID0gc2NTQ29tbW9uLAkgIC8qIHNtYWxsIGNvbW1vbiAqLwotICBzY19WYXJSZWdpc3RlciA9IHNjVmFyUmVnaXN0ZXIsIC8qIFZhciBwYXJhbWV0ZXIgaW4gYSByZWdpc3RlciAqLwotICBzY19WYXJpYW50CSA9IHNjVmFyaWFudCwJICAvKiBWYXJpYW50IHJlY29yZCAqLwotICBzY19TVW5kZWZpbmVkCSA9IHNjU1VuZGVmaW5lZCwgIC8qIHNtYWxsIHVuZGVmaW5lZChleHRlcm5hbCkgZGF0YSAqLwotICBzY19Jbml0CSA9IHNjSW5pdCwJICAvKiAuaW5pdCBzZWN0aW9uIHN5bWJvbCAqLwotICBzY19NYXgJID0gc2NNYXgJICAvKiBNYXggc3RvcmFnZSBjbGFzcysxICovCi19IHNjX3Q7Ci0KLS8qIFJlZGVmaW5pdGlvbiBvZiBzeW1ib2wgdHlwZS4gICovCi0KLXR5cGVkZWYgZW51bSBzdCB7Ci0gIHN0X05pbAk9IHN0TmlsLAkvKiBOdXRoaW4nIHNwZWNpYWwgKi8KLSAgc3RfR2xvYmFsCT0gc3RHbG9iYWwsCS8qIGV4dGVybmFsIHN5bWJvbCAqLwotICBzdF9TdGF0aWMJPSBzdFN0YXRpYywJLyogc3RhdGljICovCi0gIHN0X1BhcmFtCT0gc3RQYXJhbSwJLyogcHJvY2VkdXJlIGFyZ3VtZW50ICovCi0gIHN0X0xvY2FsCT0gc3RMb2NhbCwJLyogbG9jYWwgdmFyaWFibGUgKi8KLSAgc3RfTGFiZWwJPSBzdExhYmVsLAkvKiBsYWJlbCAqLwotICBzdF9Qcm9jCT0gc3RQcm9jLAkvKiAgICAgIiAgICAgICIJIFByb2NlZHVyZSAqLwotICBzdF9CbG9jawk9IHN0QmxvY2ssCS8qIGJlZ2lubmluZyBvZiBibG9jayAqLwotICBzdF9FbmQJPSBzdEVuZCwJLyogZW5kIChvZiBhbnl0aGluZykgKi8KLSAgc3RfTWVtYmVyCT0gc3RNZW1iZXIsCS8qIG1lbWJlciAob2YgYW55dGhpbmcJLSBzdHJ1Y3QvdW5pb24vZW51bSAqLwotICBzdF9UeXBlZGVmCT0gc3RUeXBlZGVmLAkvKiB0eXBlIGRlZmluaXRpb24gKi8KLSAgc3RfRmlsZQk9IHN0RmlsZSwJLyogZmlsZSBuYW1lICovCi0gIHN0X1JlZ1JlbG9jCT0gc3RSZWdSZWxvYywJLyogcmVnaXN0ZXIgcmVsb2NhdGlvbiAqLwotICBzdF9Gb3J3YXJkCT0gc3RGb3J3YXJkLAkvKiBmb3J3YXJkaW5nIGFkZHJlc3MgKi8KLSAgc3RfU3RhdGljUHJvYwk9IHN0U3RhdGljUHJvYywJLyogbG9hZCB0aW1lIG9ubHkgc3RhdGljIHByb2NzICovCi0gIHN0X0NvbnN0YW50CT0gc3RDb25zdGFudCwJLyogY29uc3QgKi8KLSAgc3RfU3RyCT0gc3RTdHIsCS8qIHN0cmluZyAqLwotICBzdF9OdW1iZXIJPSBzdE51bWJlciwJLyogcHVyZSBudW1iZXIgKGllLiA0IE5PUiAyKzIpICovCi0gIHN0X0V4cHIJPSBzdEV4cHIsCS8qIDIrMiB2cy4gNCAqLwotICBzdF9UeXBlCT0gc3RUeXBlLAkvKiBwb3N0LWNvZXJjaW9uIFNFUiAqLwotICBzdF9NYXgJPSBzdE1heAkJLyogbWF4IHR5cGUrMSAqLwotfSBzdF90OwotCi0vKiBSZWRlZmluaXRpb24gb2YgdHlwZSBxdWFsaWZpZXJzLiAgKi8KLQotdHlwZWRlZiBlbnVtIHRxIHsKLSAgdHFfTmlsCT0gdHFOaWwsCS8qIGJ0IGlzIHdoYXQgeW91IHNlZSAqLwotICB0cV9QdHIJPSB0cVB0ciwJLyogcG9pbnRlciAqLwotICB0cV9Qcm9jCT0gdHFQcm9jLAkvKiBwcm9jZWR1cmUgKi8KLSAgdHFfQXJyYXkJPSB0cUFycmF5LAkvKiBkdWggKi8KLSAgdHFfRmFyCT0gdHFGYXIsCS8qIGxvbmdlciBhZGRyZXNzaW5nIC0gODA4Ni84IGxhbmQgKi8KLSAgdHFfVm9sCT0gdHFWb2wsCS8qIHZvbGF0aWxlICovCi0gIHRxX01heAk9IHRxTWF4CQkvKiBNYXggdHlwZSBxdWFsaWZpZXIrMSAqLwotfSB0cV90OwotCi0vKiBSZWRlZmluaXRpb24gb2YgYmFzaWMgdHlwZXMuICAqLwotCi10eXBlZGVmIGVudW0gYnQgewotICBidF9OaWwJPSBidE5pbCwJLyogdW5kZWZpbmVkICovCi0gIGJ0X0Fkcgk9IGJ0QWRyLAkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLwotICBidF9DaGFyCT0gYnRDaGFyLAkvKiBjaGFyYWN0ZXIgKi8KLSAgYnRfVUNoYXIJPSBidFVDaGFyLAkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KLSAgYnRfU2hvcnQJPSBidFNob3J0LAkvKiBzaG9ydCAqLwotICBidF9VU2hvcnQJPSBidFVTaG9ydCwJLyogdW5zaWduZWQgc2hvcnQgKi8KLSAgYnRfSW50CT0gYnRJbnQsCS8qIGludCAqLwotICBidF9VSW50CT0gYnRVSW50LAkvKiB1bnNpZ25lZCBpbnQgKi8KLSAgYnRfTG9uZwk9IGJ0TG9uZywJLyogbG9uZyAqLwotICBidF9VTG9uZwk9IGJ0VUxvbmcsCS8qIHVuc2lnbmVkIGxvbmcgKi8KLSAgYnRfRmxvYXQJPSBidEZsb2F0LAkvKiBmbG9hdCAocmVhbCkgKi8KLSAgYnRfRG91YmxlCT0gYnREb3VibGUsCS8qIERvdWJsZSAocmVhbCkgKi8KLSAgYnRfU3RydWN0CT0gYnRTdHJ1Y3QsCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLwotICBidF9Vbmlvbgk9IGJ0VW5pb24sCS8qIFVuaW9uICh2YXJpYW50KSAqLwotICBidF9FbnVtCT0gYnRFbnVtLAkvKiBFbnVtZXJhdGVkICovCi0gIGJ0X1R5cGVkZWYJPSBidFR5cGVkZWYsCS8qIGRlZmluZWQgdmlhIGEgdHlwZWRlZiwgaXN5bVJlZiBwb2ludHMgKi8KLSAgYnRfUmFuZ2UJPSBidFJhbmdlLAkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KLSAgYnRfU2V0CT0gYnRTZXQsCS8qIHBhc2NhbCBzZXRzICovCi0gIGJ0X0NvbXBsZXgJPSBidENvbXBsZXgsCS8qIGZvcnRyYW4gY29tcGxleCAqLwotICBidF9EQ29tcGxleAk9IGJ0RENvbXBsZXgsCS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSAgYnRfSW5kaXJlY3QJPSBidEluZGlyZWN0LAkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLwotICBidF9GaXhlZERlYwk9IGJ0Rml4ZWREZWMsCS8qIEZpeGVkIERlY2ltYWwgKi8KLSAgYnRfRmxvYXREZWMJPSBidEZsb2F0RGVjLAkvKiBGbG9hdCBEZWNpbWFsICovCi0gIGJ0X1N0cmluZwk9IGJ0U3RyaW5nLAkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCi0gIGJ0X0JpdAk9IGJ0Qml0LAkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KLSAgYnRfUGljdHVyZQk9IGJ0UGljdHVyZSwJLyogUGljdHVyZSAqLwotICBidF9Wb2lkCT0gYnRWb2lkLAkvKiBWb2lkICovCi0gIGJ0X01heAk9IGJ0TWF4CQkvKiBNYXggYmFzaWMgdHlwZSsxICovCi19IGJ0X3Q7Ci0KLSNkZWZpbmUgTl9UUSBpdHFNYXgKLQotLyogU3RhdGVzIGZvciB3aGV0aGVyIHRvIGhhc2ggdHlwZSBvciBub3QuICAqLwotdHlwZWRlZiBlbnVtIGhhc2hfc3RhdGUgewotICBoYXNoX25vCT0gMCwJCS8qIGRvbid0IGhhc2ggdHlwZSAqLwotICBoYXNoX3llcwk9IDEsCQkvKiBvayB0byBoYXNoIHR5cGUsIG9yIHVzZSBwcmV2aW91cyBoYXNoICovCi0gIGhhc2hfcmVjb3JkCT0gMgkJLyogb2sgdG8gcmVjb3JkIGhhc2gsIGJ1dCBkb24ndCB1c2UgcHJldi4gKi8KLX0gaGFzaF9zdGF0ZV90OwotCi0vKiBUeXBlcyBvZiBkaWZmZXJlbnQgc2l6ZWQgYWxsb2NhdGlvbiByZXF1ZXN0cy4gICovCi1lbnVtIGFsbG9jX3R5cGUgewotICBhbGxvY190eXBlX25vbmUsCQkvKiBkdW1teSB2YWx1ZSAqLwotICBhbGxvY190eXBlX3Njb3BlLAkJLyogbmVzdGVkIHNjb3BlcyBsaW5rZWQgbGlzdCAqLwotICBhbGxvY190eXBlX3ZsaW5rcywJCS8qIGdsdWUgbGlua2luZyBwYWdlcyBpbiB2YXJyYXkgKi8KLSAgYWxsb2NfdHlwZV9zaGFzaCwJCS8qIHN0cmluZyBoYXNoIGVsZW1lbnQgKi8KLSAgYWxsb2NfdHlwZV90aGFzaCwJCS8qIHR5cGUgaGFzaCBlbGVtZW50ICovCi0gIGFsbG9jX3R5cGVfdGFnLAkJLyogc3RydWN0L3VuaW9uL3RhZyBlbGVtZW50ICovCi0gIGFsbG9jX3R5cGVfZm9yd2FyZCwJCS8qIGVsZW1lbnQgdG8gaG9sZCB1bmtub3duIHRhZyAqLwotICBhbGxvY190eXBlX3RoZWFkLAkJLyogaGVhZCBvZiB0eXBlIGhhc2ggbGlzdCAqLwotICBhbGxvY190eXBlX3ZhcnJheSwJCS8qIGdlbmVyYWwgdmFycmF5IGFsbG9jYXRpb24gKi8KLSAgYWxsb2NfdHlwZV9saW5lbm8sCQkvKiBsaW5lIG51bWJlciBsaXN0ICovCi0gIGFsbG9jX3R5cGVfbGFzdAkJLyogbGFzdCsxIGVsZW1lbnQgZm9yIGFycmF5IGJvdW5kcyAqLwotfTsKLQotLyogVHlwZXMgb2YgYXV4aWxpYXJ5IHR5cGUgaW5mb3JtYXRpb24uICAqLwotZW51bSBhdXhfdHlwZSB7Ci0gIGF1eF90aXIsCQkJLyogVElSIHR5cGUgaW5mb3JtYXRpb24gKi8KLSAgYXV4X3JuZHgsCQkJLyogcmVsYXRpdmUgaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KLSAgYXV4X2RuTG93LAkJCS8qIGxvdyBkaW1lbnNpb24gKi8KLSAgYXV4X2RuSGlnaCwJCQkvKiBoaWdoIGRpbWVuc2lvbiAqLwotICBhdXhfaXN5bSwJCQkvKiBzeW1ib2wgdGFibGUgaW5kZXggKGVuZCBvZiBwcm9jKSAqLwotICBhdXhfaXNzLAkJCS8qIGluZGV4IGludG8gc3RyaW5nIHNwYWNlIChub3QgdXNlZCkgKi8KLSAgYXV4X3dpZHRoLAkJCS8qIHdpZHRoIGZvciBub24tZGVmYXVsdCBzaXplZCBzdHJ1YyBmaWVsZHMgKi8KLSAgYXV4X2NvdW50CQkJLyogY291bnQgb2YgcmFuZ2VzIGZvciB2YXJpYW50IGFybSAqLwotfTsKLQwKLS8qIFN0cnVjdHVyZXMgdG8gcHJvdmlkZSBuLW51bWJlciBvZiB2aXJ0dWFsIGFycmF5cywgZWFjaCBvZiB3aGljaCBjYW4KLSAgIGdyb3cgbGluZWFybHksIGFuZCB3aGljaCBhcmUgd3JpdHRlbiBpbiB0aGUgb2JqZWN0IGZpbGUgYXMKLSAgIHNlcXVlbnRpYWwgcGFnZXMuICBPbiBzeXN0ZW1zIHdpdGggYSBCU0QgbWFsbG9jLCB0aGUKLSAgIE1BWF9DTFVTVEVSX1BBR0VTIHNob3VsZCBiZSAxIGxlc3MgdGhhbiBhIHBvd2VyIG9mIHR3bywgc2luY2UKLSAgIG1hbGxvYyBhZGRzIGl0J3Mgb3ZlcmhlYWQsIGFuZCByb3VuZHMgdXAgdG8gdGhlIG5leHQgcG93ZXIgb2YgMi4KLSAgIFBhZ2VzIGFyZSBsaW5rZWQgdG9nZXRoZXIgdmlhIGEgbGlua2VkIGxpc3QuCi0KLSAgIElmIFBBR0VfU0laRSBpcyA+IDQwOTYsIHRoZSBzdHJpbmcgbGVuZ3RoIGluIHRoZSBzaGFzaF90IHN0cnVjdHVyZQotICAgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgKGFzc3VtaW5nIHRoZXJlIGFyZSBzdHJpbmdzID4gNDA5NiBieXRlcykuICAqLwotCi0vKiBGSVhNRTogWWVzLCB0aGVyZSBjYW4gYmUgc3VjaCBzdHJpbmdzIHdoaWxlIGVtaXR0aW5nIEMrKyBjbGFzcyBkZWJ1ZwotICAgaW5mby4gIFRlbXBsYXRlcyBhcmUgdGhlIG9mZmVuZGVyIGhlcmUsIHRoZSB0ZXN0IGNhc2UgaW4gcXVlc3Rpb24gCi0gICBoYXZpbmcgYSBtYW5nbGVkIGNsYXNzIG5hbWUgb2YKLQotICAgICB0N3JiX3RyZWU0WjR4a2V5WnQ0cGFpcjJaQzR4a2V5WnQ3eHNvY2tldDFaNFVzZXJadDlzZWxlY3Qxc3QyWnQ0cGFpclwKLSAgICAgMlpDNHhrZXladDd4c29ja2V0MVo0VXNlclo0eGtleVp0NGxlc3MxWjR4a2V5Ci0KLSAgIFJlcGVhdCB0aGF0IGEgY291cGxlIGRvemVuIHRpbWVzIHdoaWxlIGxpc3RpbmcgdGhlIGNsYXNzIG1lbWJlcnMgYW5kCi0gICB5b3UndmUgZ290IHN0cmluZ3Mgb3ZlciA0ay4gIEhhY2sgYXJvdW5kIHRoaXMgZm9yIG5vdyBieSBpbmNyZWFzaW5nCi0gICB0aGUgcGFnZSBzaXplLiAgQSBwcm9wZXIgc29sdXRpb24gd291bGQgYWJhbmRvbiB0aGlzIHN0cnVjdHVyZSBzY2hlbWUKLSAgIGNlcnRhaW5seSBmb3IgdmVyeSBsYXJnZSBzdHJpbmdzLCBhbmQgcG9zc2libHkgZW50aXJlbHkuICAqLwotCi0jaWZuZGVmIFBBR0VfU0laRQotI2RlZmluZSBQQUdFX1NJWkUgKDgqMTAyNCkJLyogc2l6ZSBvZiB2YXJyYXkgcGFnZXMgKi8KLSNlbmRpZgotCi0jZGVmaW5lIFBBR0VfVVNJWkUgKCh1bnNpZ25lZCBsb25nKSBQQUdFX1NJWkUpCi0KLSNpZm5kZWYgTUFYX0NMVVNURVJfUEFHRVMJLyogIyBwYWdlcyB0byBnZXQgZnJvbSBzeXN0ZW0gKi8KLSNkZWZpbmUgTUFYX0NMVVNURVJfUEFHRVMgNjMKLSNlbmRpZgotCi0vKiBMaW5rZWQgbGlzdCBjb25uZWN0aW5nIHNlcGFyYXRlIHBhZ2UgYWxsb2NhdGlvbnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdmxpbmtzIHsKLSAgc3RydWN0IHZsaW5rcwkqcHJldjsJCS8qIHByZXZpb3VzIHNldCBvZiBwYWdlcyAqLwotICBzdHJ1Y3QgdmxpbmtzICpuZXh0OwkJLyogbmV4dCBzZXQgb2YgcGFnZXMgKi8KLSAgdW5pb24gIHBhZ2UgICAqZGF0dW07CQkvKiBzdGFydCBvZiBwYWdlICovCi0gIHVuc2lnbmVkIGxvbmcJIHN0YXJ0X2luZGV4OwkvKiBzdGFydGluZyBpbmRleCAjIG9mIHBhZ2UgKi8KLX0gdmxpbmtzX3Q7Ci0KLQotLyogVmlydHVhbCBhcnJheSBoZWFkZXIuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdmFycmF5IHsKLSAgdmxpbmtzX3QJKmZpcnN0OwkJCS8qIGZpcnN0IHBhZ2UgbGluayAqLwotICB2bGlua3NfdAkqbGFzdDsJCQkvKiBsYXN0IHBhZ2UgbGluayAqLwotICB1bnNpZ25lZCBsb25nCSBudW1fYWxsb2NhdGVkOwkJLyogIyBvYmplY3RzIGFsbG9jYXRlZCAqLwotICB1bnNpZ25lZCBzaG9ydCBvYmplY3Rfc2l6ZTsJCS8qIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBvYmplY3QgKi8KLSAgdW5zaWduZWQgc2hvcnQgb2JqZWN0c19wZXJfcGFnZTsJLyogIyBvYmplY3RzIHRoYXQgY2FuIGZpdCBvbiBhIHBhZ2UgKi8KLSAgdW5zaWduZWQgc2hvcnQgb2JqZWN0c19sYXN0X3BhZ2U7CS8qICMgb2JqZWN0cyBhbGxvY2F0ZWQgb24gbGFzdCBwYWdlICovCi19IHZhcnJheV90OwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotI2RlZmluZSBPQkpFQ1RTX1BFUl9QQUdFKHR5cGUpIChQQUdFX1NJWkUgLyBzaXplb2YgKHR5cGUpKQotI2Vsc2UKLSNkZWZpbmUgT0JKRUNUU19QRVJfUEFHRSh0eXBlKSAoKHNpemVvZiAodHlwZSkgPiAxKSA/IDEgOiBQQUdFX1NJWkUpCi0jZW5kaWYKLQotI2RlZmluZSBJTklUX1ZBUlJBWSh0eXBlKSB7CS8qIG1hY3JvIHRvIGluaXRpYWxpemUgYSB2YXJyYXkgKi8JXAotICAodmxpbmtzX3QgKikwLAkJLyogZmlyc3QgKi8JCQkJXAotICAodmxpbmtzX3QgKikwLAkJLyogbGFzdCAqLwkJCQlcCi0gIDAsCQkJCS8qIG51bV9hbGxvY2F0ZWQgKi8JCQlcCi0gIHNpemVvZiAodHlwZSksCQkvKiBvYmplY3Rfc2l6ZSAqLwkJCVwKLSAgT0JKRUNUU19QRVJfUEFHRSAodHlwZSksCS8qIG9iamVjdHNfcGVyX3BhZ2UgKi8JCQlcCi0gIE9CSkVDVFNfUEVSX1BBR0UgKHR5cGUpLAkvKiBvYmplY3RzX2xhc3RfcGFnZSAqLwkJCVwKLX0KLQotCi0vKiBNYXN0ZXIgdHlwZSBmb3IgaW5kZXhlcyB3aXRoaW4gdGhlIHN5bWJvbCB0YWJsZS4gKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbnRfdDsKLQotCi0vKiBMaW5rZWQgbGlzdCBzdXBwb3J0IGZvciBuZXN0ZWQgc2NvcGVzIChmaWxlLCBibG9jaywgc3RydWN0dXJlLCBldGMuKS4gICovCi10eXBlZGVmIHN0cnVjdCBzY29wZSB7Ci0gIHN0cnVjdCBzY29wZQkqcHJldjsJCS8qIHByZXZpb3VzIHNjb3BlIGxldmVsICovCi0gIHN0cnVjdCBzY29wZQkqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCi0gIHN0cnVjdCBsb2NhbHN5bSAqbHN5bTsJLyogcG9pbnRlciB0byBsb2NhbCBzeW1ib2wgbm9kZSAqLwotICBzdF90CQkgdHlwZTsJCS8qIHR5cGUgb2YgdGhlIG5vZGUgKi8KLX0gc2NvcGVfdDsKLQotCi0vKiBGb3IgYSBsb2NhbCBzeW1ib2wgd2Ugc3RvcmUgYSBnYXMgc3ltYm9sIGFzIHdlbGwgYXMgdGhlIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gd2UgZ2VuZXJhdGUuICBUaGUgZ2FzIHN5bWJvbCB3aWxsIGJlIE5VTEwgaWYgdGhpcyBpcwotICAgb25seSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotdHlwZWRlZiBzdHJ1Y3QgbG9jYWxzeW0gewotICBjb25zdCBjaGFyICpuYW1lOwkJLyogc3ltYm9sIG5hbWUgKi8KLSAgc3ltYm9sUyAqYXNfc3ltOwkJLyogc3ltYm9sIGFzIHNlZW4gYnkgZ2FzICovCi0gIGJmZF92bWEgYWRkZW5kOwkJLyogYWRkZW5kIHRvIGFzX3N5bSB2YWx1ZSAqLwotICBzdHJ1Y3QgZWZkciAqZmlsZV9wdHI7CS8qIGZpbGUgcG9pbnRlciAqLwotICBzdHJ1Y3QgZWNvZmZfcHJvYyAqcHJvY19wdHI7CS8qIHByb2MgcG9pbnRlciAqLwotICBzdHJ1Y3QgbG9jYWxzeW0gKmJlZ2luX3B0cjsJLyogc3ltYm9sIGF0IHN0YXJ0IG9mIGJsb2NrICovCi0gIHN0cnVjdCBlY29mZl9hdXggKmluZGV4X3B0cjsJLyogaW5kZXggdmFsdWUgdG8gYmUgZmlsbGVkIGluICovCi0gIHN0cnVjdCBmb3J3YXJkICpmb3J3YXJkX3JlZjsJLyogZm9yd2FyZCByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sICovCi0gIGxvbmcgc3ltX2luZGV4OwkJLyogZmluYWwgc3ltYm9sIGluZGV4ICovCi0gIEVYVFIgZWNvZmZfc3ltOwkJLyogRUNPRkYgZGVidWdnaW5nIHN5bWJvbCAqLwotfSBsb2NhbHN5bV90OwotCi0KLS8qIEZvciBhdXggaW5mb3JtYXRpb24gd2Uga2VlcCB0aGUgdHlwZSBhbmQgdGhlIGRhdGEuICAqLwotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfYXV4IHsKLSAgZW51bSBhdXhfdHlwZSB0eXBlOwkJLyogYXV4IHR5cGUgKi8KLSAgQVVYVSBkYXRhOwkJCS8qIGF1eCBkYXRhICovCi19IGF1eF90OwotCi0vKiBGb3IgYSBwcm9jZWR1cmUgd2Ugc3RvcmUgdGhlIGdhcyBzeW1ib2wgYXMgd2VsbCBhcyB0aGUgUERSCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfcHJvYyB7Ci0gIGxvY2Fsc3ltX3QgKnN5bTsJCS8qIGFzc29jaWF0ZWQgc3ltYm9sICovCi0gIFBEUiBwZHI7CQkJLyogRUNPRkYgZGVidWdnaW5nIGluZm8gKi8KLX0gcHJvY190OwotCi0vKiBOdW1iZXIgb2YgcHJvY190IHN0cnVjdHVyZXMgYWxsb2NhdGVkLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHByb2NfY250OwotCi0KLS8qIEZvcndhcmQgcmVmZXJlbmNlIGxpc3QgZm9yIHRhZ3MgcmVmZXJlbmNlZCwgYnV0IG5vdCB5ZXQgZGVmaW5lZC4gICovCi10eXBlZGVmIHN0cnVjdCBmb3J3YXJkIHsKLSAgc3RydWN0IGZvcndhcmQgKm5leHQ7CQkvKiBuZXh0IGZvcndhcmQgcmVmZXJlbmNlICovCi0gIHN0cnVjdCBmb3J3YXJkICpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgYXV4X3QJCSAqaWZkX3B0cjsJLyogcG9pbnRlciB0byBzdG9yZSBmaWxlIGluZGV4ICovCi0gIGF1eF90CQkgKmluZGV4X3B0cjsJLyogcG9pbnRlciB0byBzdG9yZSBzeW1ib2wgaW5kZXggKi8KLX0gZm9yd2FyZF90OwotCi0KLS8qIExpbmtlZCBsaXN0IHN1cHBvcnQgZm9yIHRhZ3MuICBUaGUgZmlyc3QgdGFnIGluIHRoZSBsaXN0IGlzIGFsd2F5cwotICAgdGhlIGN1cnJlbnQgdGFnIGZvciB0aGF0IGJsb2NrLiAgKi8KLXR5cGVkZWYgc3RydWN0IHRhZyB7Ci0gIHN0cnVjdCB0YWcJICpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgc3RydWN0IHNoYXNoCSAqaGFzaF9wdHI7CS8qIHBvaW50ZXIgdG8gdGhlIGhhc2ggdGFibGUgaGVhZCAqLwotICBzdHJ1Y3QgdGFnCSAqc2FtZV9uYW1lOwkvKiB0YWcgd2l0aCBzYW1lIG5hbWUgaW4gb3V0ZXIgc2NvcGUgKi8KLSAgc3RydWN0IHRhZwkgKnNhbWVfYmxvY2s7CS8qIG5leHQgdGFnIGRlZmluZWQgaW4gdGhlIHNhbWUgYmxvY2suICAqLwotICBzdHJ1Y3QgZm9yd2FyZCAqZm9yd2FyZF9yZWY7CS8qIGxpc3Qgb2YgZm9yd2FyZCByZWZlcmVuY2VzICovCi0gIGJ0X3QJCSAgYmFzaWNfdHlwZTsJLyogYnRfU3RydWN0LCBidF9Vbmlvbiwgb3IgYnRfRW51bSAqLwotICBzeW1pbnRfdAkgIGlmZDsJCS8qIGZpbGUgIyB0YWcgZGVmaW5lZCBpbiAqLwotICBsb2NhbHN5bV90CSAqc3ltOwkJLyogZmlsZSdzIGxvY2FsIHN5bWJvbHMgKi8KLX0gdGFnX3Q7Ci0KLQotLyogSGVhZCBvZiBhIGJsb2NrJ3MgbGlua2VkIGxpc3Qgb2YgdGFncy4gICovCi10eXBlZGVmIHN0cnVjdCB0aGVhZCB7Ci0gIHN0cnVjdCB0aGVhZAkqcHJldjsJCS8qIHByZXZpb3VzIGJsb2NrICovCi0gIHN0cnVjdCB0aGVhZAkqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCi0gIHN0cnVjdCB0YWcJKmZpcnN0X3RhZzsJLyogZmlyc3QgdGFnIGluIGJsb2NrIGRlZmluZWQgKi8KLX0gdGhlYWRfdDsKLQotCi0vKiBVbmlvbiBjb250YWluaW5nIHBvaW50ZXJzIHRvIGVhY2ggdGhlIHNtYWxsIHN0cnVjdHVyZXMgd2hpY2ggYXJlIGZyZWVkIHVwLiAgKi8KLXR5cGVkZWYgdW5pb24gc21hbGxfZnJlZSB7Ci0gIHNjb3BlX3QJKmZfc2NvcGU7CS8qIHNjb3BlIHN0cnVjdHVyZSAqLwotICB0aGVhZF90CSpmX3RoZWFkOwkvKiB0YWcgaGVhZCBzdHJ1Y3R1cmUgKi8KLSAgdGFnX3QJCSpmX3RhZzsJCS8qIHRhZyBlbGVtZW50IHN0cnVjdHVyZSAqLwotICBmb3J3YXJkX3QJKmZfZm9yd2FyZDsJLyogZm9yd2FyZCB0YWcgcmVmZXJlbmNlICovCi19IHNtYWxsX2ZyZWVfdDsKLQotCi0vKiBTdHJpbmcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNoYXNoIHsKLSAgY2hhcgkJKnN0cmluZzsJLyogc3RyaW5nIHdlIGFyZSBoYXNoaW5nICovCi0gIHN5bWludF90CSBpbmR4OwkJLyogaW5kZXggd2l0aGluIHN0cmluZyB0YWJsZSAqLwotICBFWFRSCQkqZXN5bV9wdHI7CS8qIGdsb2JhbCBzeW1ib2wgcG9pbnRlciAqLwotICBsb2NhbHN5bV90CSpzeW1fcHRyOwkvKiBsb2NhbCBzeW1ib2wgcG9pbnRlciAqLwotICBsb2NhbHN5bV90CSplbmRfcHRyOwkvKiBzeW1ib2wgcG9pbnRlciB0byBlbmQgYmxvY2sgKi8KLSAgdGFnX3QJCSp0YWdfcHRyOwkvKiB0YWcgcG9pbnRlciAqLwotICBwcm9jX3QJKnByb2NfcHRyOwkvKiBwcm9jZWR1cmUgZGVzY3JpcHRvciBwb2ludGVyICovCi19IHNoYXNoX3Q7Ci0KLQotLyogVHlwZSBoYXNoIHRhYmxlIHN1cHBvcnQuICBUaGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBtdXN0IGZpdAotICAgd2l0aGluIGEgcGFnZSB3aXRoIHRoZSBvdGhlciBleHRlbmRlZCBmaWxlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24uCi0gICBCZWNhdXNlIHVuaXF1ZSB0eXBlcyB3aGljaCBhcmUgaGFzaGVkIGFyZSBmZXdlciBpbiBudW1iZXIgdGhhbgotICAgc3RyaW5ncywgd2UgdXNlIGEgc21hbGxlciBoYXNoIHZhbHVlLiAgKi8KLQotI2RlZmluZSBIQVNIQklUUyAzMAotCi0jaWZuZGVmIFRIQVNIX1NJWkUKLSNkZWZpbmUgVEhBU0hfU0laRSAxMTMKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB0aGFzaCB7Ci0gIHN0cnVjdCB0aGFzaAkqbmV4dDsJCS8qIG5leHQgaGFzaCB2YWx1ZSAqLwotICBBVVhVCQkgdHlwZTsJCS8qIHR5cGUgd2UgYXJlIGhhc2hpbmcgKi8KLSAgc3ltaW50X3QJIGluZHg7CQkvKiBpbmRleCB3aXRoaW4gc3RyaW5nIHRhYmxlICovCi19IHRoYXNoX3Q7Ci0KLQotLyogRXh0ZW5kZWQgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBzdXBwb3J0IG5lY2Vzc2FyeQotICAgdG8gYWRkIHRoaW5ncyB0byBlYWNoIGZpbGUgc2VwYXJhdGVseS4gICovCi10eXBlZGVmIHN0cnVjdCBlZmRyIHsKLSAgRkRSCQkgZmRyOwkJLyogRmlsZSBoZWFkZXIgdG8gYmUgd3JpdHRlbiBvdXQgKi8KLSAgRkRSCQkqb3JpZ19mZHI7CS8qIG9yaWdpbmFsIGZpbGUgaGVhZGVyICovCi0gIGNoYXIJCSpuYW1lOwkJLyogZmlsZW5hbWUgKi8KLSAgaW50CQkgZmFrZTsJCS8qIHdoZXRoZXIgdGhpcyBpcyBmYWtlZCAuZmlsZSAqLwotICBzeW1pbnRfdAkgdm9pZF90eXBlOwkvKiBhdXguIHBvaW50ZXIgdG8gJ3ZvaWQnIHR5cGUgKi8KLSAgc3ltaW50X3QJIGludF90eXBlOwkvKiBhdXguIHBvaW50ZXIgdG8gJ2ludCcgdHlwZSAqLwotICBzY29wZV90CSpjdXJfc2NvcGU7CS8qIGN1cnJlbnQgbmVzdGVkIHNjb3BlcyAqLwotICBzeW1pbnRfdAkgZmlsZV9pbmRleDsJLyogY3VycmVudCBmaWxlIG51bWJlciAqLwotICBpbnQJCSBuZXN0ZWRfc2NvcGVzOwkvKiAjIG5lc3RlZCBzY29wZXMgKi8KLSAgdmFycmF5X3QJIHN0cmluZ3M7CS8qIGxvY2FsIHN0cmluZ3MgKi8KLSAgdmFycmF5X3QJIHN5bWJvbHM7CS8qIGxvY2FsIHN5bWJvbHMgKi8KLSAgdmFycmF5X3QJIHByb2NzOwkJLyogcHJvY2VkdXJlcyAqLwotICB2YXJyYXlfdAkgYXV4X3N5bXM7CS8qIGF1eGlsaWFyeSBzeW1ib2xzICovCi0gIHN0cnVjdCBlZmRyCSpuZXh0X2ZpbGU7CS8qIG5leHQgZmlsZSBkZXNjcmlwdG9yICovCi0JCQkJLyogc3RyaW5nL3R5cGUgaGFzaCB0YWJsZXMgKi8KLSAgc3RydWN0IGhhc2hfY29udHJvbCAqc3RyX2hhc2g7CS8qIHN0cmluZyBoYXNoIHRhYmxlICovCi0gIHRoYXNoX3QJKnRoYXNoX2hlYWRbVEhBU0hfU0laRV07Ci19IGVmZHJfdDsKLQotLyogUHJlLWluaXRpYWxpemVkIGV4dGVuZGVkIGZpbGUgc3RydWN0dXJlLiAgKi8KLXN0YXRpYyBjb25zdCBlZmRyX3QgaW5pdF9maWxlID0KLXsKLSAgewkJCS8qIEZEUiBzdHJ1Y3R1cmUgKi8KLSAgICAwLAkJCS8qIGFkcjoJCW1lbW9yeSBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBmaWxlICovCi0gICAgMCwJCQkvKiByc3M6CQlmaWxlIG5hbWUgKG9mIHNvdXJjZSwgaWYga25vd24pICovCi0gICAgMCwJCQkvKiBpc3NCYXNlOglmaWxlJ3Mgc3RyaW5nIHNwYWNlICovCi0gICAgMCwJCQkvKiBjYlNzOgludW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNzICovCi0gICAgMCwJCQkvKiBpc3ltQmFzZToJYmVnaW5uaW5nIG9mIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGNzeW06CWNvdW50IGZpbGUncyBvZiBzeW1ib2xzICovCi0gICAgMCwJCQkvKiBpbGluZUJhc2U6CWZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGNsaW5lOgljb3VudCBvZiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0gICAgMCwJCQkvKiBpb3B0QmFzZToJZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCi0gICAgMCwJCQkvKiBjb3B0Ogljb3VudCBvZiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLSAgICAwLAkJCS8qIGlwZEZpcnN0OglzdGFydCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLSAgICAwLAkJCS8qIGNwZDoJCWNvdW50IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotICAgIDAsCQkJLyogaWF1eEJhc2U6CWZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLwotICAgIDAsCQkJLyogY2F1eDoJY291bnQgb2YgZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0gICAgMCwJCQkvKiByZmRCYXNlOglpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCi0gICAgMCwJCQkvKiBjcmZkOgljb3VudCBmaWxlIGluZGlyZWN0IGVudHJpZXMgKi8KLSAgICBsYW5nQywJCS8qIGxhbmc6CWxhbmd1YWdlIGZvciB0aGlzIGZpbGUgKi8KLSAgICAxLAkJCS8qIGZNZXJnZToJd2hldGhlciB0aGlzIGZpbGUgY2FuIGJlIG1lcmdlZCAqLwotICAgIDAsCQkJLyogZlJlYWRpbjoJdHJ1ZSBpZiByZWFkIGluIChub3QganVzdCBjcmVhdGVkKSAqLwotICAgIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCAgLyogZkJpZ2VuZGlhbjoJaWYgMSwgY29tcGlsZWQgb24gYmlnIGVuZGlhbiBtYWNoaW5lICovCi0gICAgR0xFVkVMXzIsCQkvKiBnbGV2ZWw6CWxldmVsIHRoaXMgZmlsZSB3YXMgY29tcGlsZWQgd2l0aCAqLwotICAgIDAsCQkJLyogcmVzZXJ2ZWQ6CXJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0gICAgMCwJCQkvKiBjYkxpbmVPZmZzZXQ6IGJ5dGUgb2Zmc2V0IGZyb20gaGVhZGVyIGZvciB0aGlzIGZpbGUgbG4ncyAqLwotICAgIDAsCQkJLyogY2JMaW5lOglzaXplIG9mIGxpbmVzIGZvciB0aGlzIGZpbGUgKi8KLSAgfSwKLQotICAoRkRSICopMCwJCS8qIG9yaWdfZmRyOglvcmlnaW5hbCBmaWxlIGhlYWRlciBwb2ludGVyICovCi0gIChjaGFyICopMCwJCS8qIG5hbWU6CXBvaW50ZXIgdG8gZmlsZW5hbWUgKi8KLSAgMCwJCQkvKiBmYWtlOgl3aGV0aGVyIHRoaXMgaXMgYSBmYWtlZCAuZmlsZSAqLwotICAwLAkJCS8qIHZvaWRfdHlwZToJcHRyIHRvIGF1eCBub2RlIGZvciB2b2lkIHR5cGUgKi8KLSAgMCwJCQkvKiBpbnRfdHlwZToJcHRyIHRvIGF1eCBub2RlIGZvciBpbnQgdHlwZSAqLwotICAoc2NvcGVfdCAqKTAsCQkvKiBjdXJfc2NvcGU6CWN1cnJlbnQgc2NvcGUgYmVpbmcgcHJvY2Vzc2VkICovCi0gIDAsCQkJLyogZmlsZV9pbmRleDoJY3VycmVudCBmaWxlICMgKi8KLSAgMCwJCQkvKiBuZXN0ZWRfc2NvcGVzOiAjIG5lc3RlZCBzY29wZXMgKi8KLSAgSU5JVF9WQVJSQVkgKGNoYXIpLAkvKiBzdHJpbmdzOglsb2NhbCBzdHJpbmcgdmFycmF5ICovCi0gIElOSVRfVkFSUkFZIChsb2NhbHN5bV90KSwJLyogc3ltYm9sczoJbG9jYWwgc3ltYm9scyB2YXJyYXkgKi8KLSAgSU5JVF9WQVJSQVkgKHByb2NfdCksCS8qIHByb2NzOglwcm9jZWR1cmUgdmFycmF5ICovCi0gIElOSVRfVkFSUkFZIChhdXhfdCksCS8qIGF1eF9zeW1zOglhdXhpbGlhcnkgc3ltYm9scyB2YXJyYXkgKi8KLQotICAoc3RydWN0IGVmZHIgKikwLAkvKiBuZXh0X2ZpbGU6CW5leHQgZmlsZSBzdHJ1Y3R1cmUgKi8KLQotICAoc3RydWN0IGhhc2hfY29udHJvbCAqKTAsCS8qIHN0cl9oYXNoOglzdHJpbmcgaGFzaCB0YWJsZSAqLwotICB7IDAgfSwJCS8qIHRoYXNoX2hlYWQ6CXR5cGUgaGFzaCB0YWJsZSAqLwotfTsKLQotCi1zdGF0aWMgZWZkcl90ICpmaXJzdF9maWxlOwkJCS8qIGZpcnN0IGZpbGUgZGVzY3JpcHRvciAqLwotc3RhdGljIGVmZHJfdCAqKmxhc3RfZmlsZV9wdHIgPSAmZmlyc3RfZmlsZTsJLyogZmlsZSBkZXNjcmlwdG9yIHRhaWwgKi8KLQotCi0vKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpcyBrZXB0IGluIGEgbGlzdCB1bnRpbCB0aGUgYXNzZW1ibHkgaXMKLSAgIGZpbmlzaGVkLiAgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19saXN0IHsKLSAgc3RydWN0IGxpbmVub19saXN0ICpuZXh0OwkvKiBuZXh0IGVsZW1lbnQgaW4gbGlzdCAqLwotICBlZmRyX3QgKmZpbGU7CQkJLyogZmlsZSB0aGlzIGxpbmUgaXMgaW4gKi8KLSAgcHJvY190ICpwcm9jOwkJCS8qIHByb2NlZHVyZSB0aGlzIGxpbmUgaXMgaW4gKi8KLSAgZnJhZ1MgKmZyYWc7CQkJLyogZnJhZ21lbnQgdGhpcyBsaW5lIG51bWJlciBpcyBpbiAqLwotICB1bnNpZ25lZCBsb25nIHBhZGRyOwkJLyogb2Zmc2V0IHdpdGhpbiBmcmFnbWVudCAqLwotICBsb25nIGxpbmVubzsJCQkvKiBhY3R1YWwgbGluZSBudW1iZXIgKi8KLX0gbGluZW5vX2xpc3RfdDsKLQotc3RhdGljIGxpbmVub19saXN0X3QgKmZpcnN0X2xpbmVubzsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICpsYXN0X2xpbmVubzsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICoqbGFzdF9saW5lbm9fcHRyID0gJmZpcnN0X2xpbmVubzsKLQotLyogU29tZXRpbWVzIHRoZXJlIHdpbGwgYmUgc29tZSAubG9jIHN0YXRlbWVudHMgYmVmb3JlIGEgLmVudC4gIFdlCi0gICBrZWVwIHRoZW0gaW4gdGhpcyBsaXN0IHNvIHRoYXQgd2UgY2FuIGZpbGwgaW4gdGhlIHByb2NlZHVyZSBwb2ludGVyCi0gICBhZnRlciB3ZSBzZWUgdGhlIC5lbnQuICAqLwotc3RhdGljIGxpbmVub19saXN0X3QgKm5vcHJvY19saW5lbm87Ci0KLS8qIFVuaW9uIG9mIHZhcmlvdXMgdGhpbmdzIHRoYXQgYXJlIGhlbGQgaW4gcGFnZXMuICAqLwotdHlwZWRlZiB1bmlvbiBwYWdlIHsKLSAgY2hhcgkJYnl0ZQlbIFBBR0VfU0laRSBdOwotICB1bnNpZ25lZCBjaGFyCXVieXRlCVsgUEFHRV9TSVpFIF07Ci0gIGVmZHJfdAlmaWxlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChlZmRyX3QpCSAgICAgXTsKLSAgRkRSCQlvZmlsZQlbIFBBR0VfU0laRSAvIHNpemVvZiAoRkRSKQkgICAgIF07Ci0gIHByb2NfdAlwcm9jCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChwcm9jX3QpCSAgICAgXTsKLSAgbG9jYWxzeW1fdAlzeW0JWyBQQUdFX1NJWkUgLyBzaXplb2YgKGxvY2Fsc3ltX3QpICAgIF07Ci0gIGF1eF90CQlhdXgJWyBQQUdFX1NJWkUgLyBzaXplb2YgKGF1eF90KQkgICAgIF07Ci0gIEROUgkJZGVuc2UJWyBQQUdFX1NJWkUgLyBzaXplb2YgKEROUikJICAgICBdOwotICBzY29wZV90CXNjb3BlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChzY29wZV90KQkgICAgIF07Ci0gIHZsaW5rc190CXZsaW5rcwlbIFBBR0VfU0laRSAvIHNpemVvZiAodmxpbmtzX3QpCSAgICAgXTsKLSAgc2hhc2hfdAlzaGFzaAlbIFBBR0VfU0laRSAvIHNpemVvZiAoc2hhc2hfdCkJICAgICBdOwotICB0aGFzaF90CXRoYXNoCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGFzaF90KQkgICAgIF07Ci0gIHRhZ190CQl0YWcJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHRhZ190KQkgICAgIF07Ci0gIGZvcndhcmRfdAlmb3J3YXJkCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChmb3J3YXJkX3QpICAgICBdOwotICB0aGVhZF90CXRoZWFkCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGVhZF90KQkgICAgIF07Ci0gIGxpbmVub19saXN0X3QJbGluZW5vCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChsaW5lbm9fbGlzdF90KSBdOwotfSBwYWdlX3R5cGU7Ci0KLQotLyogU3RydWN0dXJlIGhvbGRpbmcgYWxsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3Igc21hbGwgc2l6ZWQgc3RydWN0dXJlcy4gICovCi10eXBlZGVmIHN0cnVjdCBhbGxvY19pbmZvIHsKLSAgY2hhcgkJKmFsbG9jX25hbWU7CS8qIG5hbWUgb2YgdGhpcyBhbGxvY2F0aW9uIHR5cGUgKG11c3QgYmUgZmlyc3QpICovCi0gIHBhZ2VfdHlwZQkqY3VyX3BhZ2U7CS8qIGN1cnJlbnQgcGFnZSBiZWluZyBhbGxvY2F0ZWQgZnJvbSAqLwotICBzbWFsbF9mcmVlX3QJIGZyZWVfbGlzdDsJLyogY3VycmVudCBmcmVlIGxpc3QgaWYgYW55ICovCi0gIGludAkJIHVuYWxsb2NhdGVkOwkvKiBudW1iZXIgb2YgZWxlbWVudHMgdW5hbGxvY2F0ZWQgb24gcGFnZSAqLwotICBpbnQJCSB0b3RhbF9hbGxvYzsJLyogdG90YWwgbnVtYmVyIG9mIGFsbG9jYXRpb25zICovCi0gIGludAkJIHRvdGFsX2ZyZWU7CS8qIHRvdGFsIG51bWJlciBvZiBmcmVlcyAqLwotICBpbnQJCSB0b3RhbF9wYWdlczsJLyogdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFsbG9jYXRlZCAqLwotfSBhbGxvY19pbmZvX3Q7Ci0KLQotLyogVHlwZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgdG9nZXRoZXIuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdHlwZV9pbmZvIHsKLSAgYnRfdAkgICAgICBiYXNpY190eXBlOwkJLyogYmFzaWMgdHlwZSAqLwotICBpbnQJICAgICAgb3JpZ190eXBlOwkJLyogb3JpZ2luYWwgQ09GRi1iYXNlZCB0eXBlICovCi0gIGludAkgICAgICBudW1fdHE7CQkJLyogIyB0eXBlIHF1YWxpZmllcnMgKi8KLSAgaW50CSAgICAgIG51bV9kaW1zOwkJCS8qICMgZGltZW5zaW9ucyAqLwotICBpbnQJICAgICAgbnVtX3NpemVzOwkJLyogIyBzaXplcyAqLwotICBpbnQJICAgICAgZXh0cmFfc2l6ZXM7CQkvKiAjIGV4dHJhIHNpemVzIG5vdCB0aWVkIHdpdGggZGltcyAqLwotICB0YWdfdCAqICAgICB0YWdfcHRyOwkJCS8qIHRhZyBwb2ludGVyICovCi0gIGludAkgICAgICBiaXRmaWVsZDsJCQkvKiBzeW1ib2wgaXMgYSBiaXRmaWVsZCAqLwotICB0cV90CSAgICAgIHR5cGVfcXVhbGlmaWVyc1tOX1RRXTsJLyogdHlwZSBxdWFsaWZpZXJzIChwdHIsIGZ1bmMsIGFycmF5KSovCi0gIHN5bWludF90ICAgIGRpbWVuc2lvbnMgICAgIFtOX1RRXTsJLyogZGltZW5zaW9ucyBmb3IgZWFjaCBhcnJheSAqLwotICBzeW1pbnRfdCAgICBzaXplcwkgICAgIFtOX1RRKzJdOwkvKiBzaXplcyBvZiBlYWNoIGFycmF5IHNsaWNlICsgc2l6ZSBvZgotCQkJCQkgICBzdHJ1Y3QvdW5pb24vZW51bSArIGJpdGZpZWxkIHNpemUgKi8KLX0gdHlwZV9pbmZvX3Q7Ci0KLS8qIFByZS1pbml0aWFsaXplZCB0eXBlX2luZm8gc3RydWN0LiAgKi8KLXN0YXRpYyBjb25zdCB0eXBlX2luZm9fdCB0eXBlX2luZm9faW5pdCA9IHsKLSAgYnRfTmlsLAkJCQkvKiBiYXNpYyB0eXBlICovCi0gIFRfTlVMTCwJCQkJLyogb3JpZ2luYWwgQ09GRi1iYXNlZCB0eXBlICovCi0gIDAsCQkJCQkvKiAjIHR5cGUgcXVhbGlmaWVycyAqLwotICAwLAkJCQkJLyogIyBkaW1lbnNpb25zICovCi0gIDAsCQkJCQkvKiAjIHNpemVzICovCi0gIDAsCQkJCQkvKiBzaXplcyBub3QgdGllZCB3aXRoIGRpbXMgKi8KLSAgTlVMTCwJCQkJCS8qIHB0ciB0byB0YWcgKi8KLSAgMCwJCQkJCS8qIGJpdGZpZWxkICovCi0gIHsJCQkJCS8qIHR5cGUgcXVhbGlmaWVycyAqLwotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICB9LAotICB7CQkJCQkvKiBkaW1lbnNpb25zICovCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAKLSAgfSwKLSAgewkJCQkJLyogc2l6ZXMgKi8KLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gIH0sCi19OwotCi0vKiBHbG9iYWwgaGFzaCB0YWJsZSBmb3IgdGhlIHRhZ3MgdGFibGUgYW5kIGdsb2JhbCB0YWJsZSBmb3IgZmlsZQotICAgZGVzY3JpcHRvcnMuICAqLwotCi1zdGF0aWMgdmFycmF5X3QgZmlsZV9kZXNjCT0gSU5JVF9WQVJSQVkgKGVmZHJfdCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWdfaGFzaDsKLQotLyogU3RhdGljIHR5cGVzIGZvciBpbnQgYW5kIHZvaWQuICBBbHNvLCByZW1lbWJlciB0aGUgbGFzdCBmdW5jdGlvbidzCi0gICB0eXBlICh3aGljaCBpcyBzZXQgdXAgd2hlbiB3ZSBlbmNvdW50ZXIgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUKLSAgIGZ1bmN0aW9uLCBhbmQgdXNlZCB3aGVuIHRoZSBlbmQgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBlbWl0dGVkLiAgKi8KLQotc3RhdGljIHR5cGVfaW5mb190IGludF90eXBlX2luZm87Ci1zdGF0aWMgdHlwZV9pbmZvX3Qgdm9pZF90eXBlX2luZm87Ci1zdGF0aWMgdHlwZV9pbmZvX3QgbGFzdF9mdW5jX3R5cGVfaW5mbzsKLXN0YXRpYyBzeW1ib2xTICpsYXN0X2Z1bmNfc3ltX3ZhbHVlOwotCi0KLS8qIENvbnZlcnQgQ09GRiBiYXNpYyB0eXBlIHRvIEVDT0ZGIGJhc2ljIHR5cGUuICBUaGUgVF9OVUxMIHR5cGUKLSAgIHJlYWxseSBzaG91bGQgdXNlIGJ0X1ZvaWQsIGJ1dCB0aGlzIGNhdXNlcyB0aGUgY3VycmVudCBlY29mZiBHREIgdG8KLSAgIGlzc3VlIHVuc3VwcG9ydGVkIHR5cGUgbWVzc2FnZXMsIGFuZCB0aGUgVWx0cml4IDQuMDAgZGJ4IChha2EgTUlQUwotICAgMi4wKSBkb2Vzbid0IHVuZGVyc3RhbmQgaXQsIGV2ZW4gdGhvdWdoIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgaXQuCi0gICBNYXliZSB0aGlzIHdpbGwgYmUgZml4ZWQgaW4gMi4xMCBvciAyLjIwIG9mIHRoZSBNSVBTIGNvbXBpbGVyCi0gICBzdWl0ZSwgYnV0IGZvciBub3cgZ28gd2l0aCB3aGF0IHdvcmtzLgotCi0gICBJdCB3b3VsZCBtYWtlIHNlbnNlIGZvciB0aGUgLnR5cGUgYW5kIC5zY2wgZGlyZWN0aXZlcyB0byB1c2UgdGhlCi0gICBFQ09GRiBudW1iZXJzIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyB0aGUgQ09GRiBudW1iZXJzIGFuZAotICAgbWFwcGluZyB0aGVtLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBoaXN0b3JpY2FsbHkgd2hhdCBtaXBzLXRmaWxlCi0gICBleHBlY3RzLCBhbmQgY2hhbmdpbmcgZ2NjIG5vdyB3b3VsZCBiZSBhIGNvbnNpZGVyYWJsZSBwYWluICh0aGUKLSAgIG5hdGl2ZSBjb21waWxlciBnZW5lcmF0ZXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludGVybmFsbHksIHJhdGhlcgotICAgdGhhbiB2aWEgdGhlIGFzc2VtYmxlciwgc28gaXQgd2lsbCBuZXZlciB1c2UgLnR5cGUgb3IgLnNjbCkuICAqLwotCi1zdGF0aWMgY29uc3QgYnRfdCBtYXBfY29mZl90eXBlc1tdID0gewotICBidF9OaWwsCQkJLyogVF9OVUxMICovCi0gIGJ0X05pbCwJCQkvKiBUX0FSRyAqLwotICBidF9DaGFyLAkJCS8qIFRfQ0hBUiAqLwotICBidF9TaG9ydCwJCQkvKiBUX1NIT1JUICovCi0gIGJ0X0ludCwJCQkvKiBUX0lOVCAqLwotICBidF9Mb25nLAkJCS8qIFRfTE9ORyAqLwotICBidF9GbG9hdCwJCQkvKiBUX0ZMT0FUICovCi0gIGJ0X0RvdWJsZSwJCQkvKiBUX0RPVUJMRSAqLwotICBidF9TdHJ1Y3QsCQkJLyogVF9TVFJVQ1QgKi8KLSAgYnRfVW5pb24sCQkJLyogVF9VTklPTiAqLwotICBidF9FbnVtLAkJCS8qIFRfRU5VTSAqLwotICBidF9FbnVtLAkJCS8qIFRfTU9FICovCi0gIGJ0X1VDaGFyLAkJCS8qIFRfVUNIQVIgKi8KLSAgYnRfVVNob3J0LAkJCS8qIFRfVVNIT1JUICovCi0gIGJ0X1VJbnQsCQkJLyogVF9VSU5UICovCi0gIGJ0X1VMb25nCQkJLyogVF9VTE9ORyAqLwotfTsKLQotLyogQ29udmVydCBDT0ZGIHN0b3JhZ2UgY2xhc3MgdG8gRUNPRkYgc3RvcmFnZSBjbGFzcy4gICovCi1zdGF0aWMgY29uc3Qgc2NfdCBtYXBfY29mZl9zdG9yYWdlW10gPSB7Ci0gIHNjX05pbCwJCQkvKiAgIDA6IENfTlVMTCAqLwotICBzY19BYnMsCQkJLyogICAxOiBDX0FVVE8JICBhdXRvIHZhciAqLwotICBzY19VbmRlZmluZWQsCQkJLyogICAyOiBDX0VYVAkgIGV4dGVybmFsICovCi0gIHNjX0RhdGEsCQkJLyogICAzOiBDX1NUQVQJICBzdGF0aWMgKi8KLSAgc2NfUmVnaXN0ZXIsCQkJLyogICA0OiBDX1JFRwkgIHJlZ2lzdGVyICovCi0gIHNjX1VuZGVmaW5lZCwJCQkvKiAgIDU6IENfRVhUREVGICA/Pz8gKi8KLSAgc2NfVGV4dCwJCQkvKiAgIDY6IENfTEFCRUwJICBsYWJlbCAqLwotICBzY19UZXh0LAkJCS8qICAgNzogQ19VTEFCRUwgIHVzZXIgbGFiZWwgKi8KLSAgc2NfSW5mbywJCQkvKiAgIDg6IENfTU9TCSAgbWVtYmVyIG9mIHN0cnVjdCAqLwotICBzY19BYnMsCQkJLyogICA5OiBDX0FSRwkgIGFyZ3VtZW50ICovCi0gIHNjX0luZm8sCQkJLyogIDEwOiBDX1NUUlRBRyAgc3RydWN0IHRhZyAqLwotICBzY19JbmZvLAkJCS8qICAxMTogQ19NT1UJICBtZW1iZXIgb2YgdW5pb24gKi8KLSAgc2NfSW5mbywJCQkvKiAgMTI6IENfVU5UQUcgICB1bmlvbiB0YWcgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTM6IENfVFBERUYJICB0eXBlZGVmICovCi0gIHNjX0RhdGEsCQkJLyogIDE0OiBDX1VTVEFUSUMgPz8/ICovCi0gIHNjX0luZm8sCQkJLyogIDE1OiBDX0VOVEFHCSAgZW51bSB0YWcgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTY6IENfTU9FCSAgbWVtYmVyIG9mIGVudW0gKi8KLSAgc2NfUmVnaXN0ZXIsCQkJLyogIDE3OiBDX1JFR1BBUk0gcmVnaXN0ZXIgcGFyYW1ldGVyICovCi0gIHNjX0JpdHMsCQkJLyogIDE4OyBDX0ZJRUxECSAgYml0ZmllbGQgKi8KLSAgc2NfTmlsLAkJCS8qICAxOSAqLwotICBzY19OaWwsCQkJLyogIDIwICovCi0gIHNjX05pbCwJCQkvKiAgMjEgKi8KLSAgc2NfTmlsLAkJCS8qICAyMiAqLwotICBzY19OaWwsCQkJLyogIDIzICovCi0gIHNjX05pbCwJCQkvKiAgMjQgKi8KLSAgc2NfTmlsLAkJCS8qICAyNSAqLwotICBzY19OaWwsCQkJLyogIDI2ICovCi0gIHNjX05pbCwJCQkvKiAgMjcgKi8KLSAgc2NfTmlsLAkJCS8qICAyOCAqLwotICBzY19OaWwsCQkJLyogIDI5ICovCi0gIHNjX05pbCwJCQkvKiAgMzAgKi8KLSAgc2NfTmlsLAkJCS8qICAzMSAqLwotICBzY19OaWwsCQkJLyogIDMyICovCi0gIHNjX05pbCwJCQkvKiAgMzMgKi8KLSAgc2NfTmlsLAkJCS8qICAzNCAqLwotICBzY19OaWwsCQkJLyogIDM1ICovCi0gIHNjX05pbCwJCQkvKiAgMzYgKi8KLSAgc2NfTmlsLAkJCS8qICAzNyAqLwotICBzY19OaWwsCQkJLyogIDM4ICovCi0gIHNjX05pbCwJCQkvKiAgMzkgKi8KLSAgc2NfTmlsLAkJCS8qICA0MCAqLwotICBzY19OaWwsCQkJLyogIDQxICovCi0gIHNjX05pbCwJCQkvKiAgNDIgKi8KLSAgc2NfTmlsLAkJCS8qICA0MyAqLwotICBzY19OaWwsCQkJLyogIDQ0ICovCi0gIHNjX05pbCwJCQkvKiAgNDUgKi8KLSAgc2NfTmlsLAkJCS8qICA0NiAqLwotICBzY19OaWwsCQkJLyogIDQ3ICovCi0gIHNjX05pbCwJCQkvKiAgNDggKi8KLSAgc2NfTmlsLAkJCS8qICA0OSAqLwotICBzY19OaWwsCQkJLyogIDUwICovCi0gIHNjX05pbCwJCQkvKiAgNTEgKi8KLSAgc2NfTmlsLAkJCS8qICA1MiAqLwotICBzY19OaWwsCQkJLyogIDUzICovCi0gIHNjX05pbCwJCQkvKiAgNTQgKi8KLSAgc2NfTmlsLAkJCS8qICA1NSAqLwotICBzY19OaWwsCQkJLyogIDU2ICovCi0gIHNjX05pbCwJCQkvKiAgNTcgKi8KLSAgc2NfTmlsLAkJCS8qICA1OCAqLwotICBzY19OaWwsCQkJLyogIDU5ICovCi0gIHNjX05pbCwJCQkvKiAgNjAgKi8KLSAgc2NfTmlsLAkJCS8qICA2MSAqLwotICBzY19OaWwsCQkJLyogIDYyICovCi0gIHNjX05pbCwJCQkvKiAgNjMgKi8KLSAgc2NfTmlsLAkJCS8qICA2NCAqLwotICBzY19OaWwsCQkJLyogIDY1ICovCi0gIHNjX05pbCwJCQkvKiAgNjYgKi8KLSAgc2NfTmlsLAkJCS8qICA2NyAqLwotICBzY19OaWwsCQkJLyogIDY4ICovCi0gIHNjX05pbCwJCQkvKiAgNjkgKi8KLSAgc2NfTmlsLAkJCS8qICA3MCAqLwotICBzY19OaWwsCQkJLyogIDcxICovCi0gIHNjX05pbCwJCQkvKiAgNzIgKi8KLSAgc2NfTmlsLAkJCS8qICA3MyAqLwotICBzY19OaWwsCQkJLyogIDc0ICovCi0gIHNjX05pbCwJCQkvKiAgNzUgKi8KLSAgc2NfTmlsLAkJCS8qICA3NiAqLwotICBzY19OaWwsCQkJLyogIDc3ICovCi0gIHNjX05pbCwJCQkvKiAgNzggKi8KLSAgc2NfTmlsLAkJCS8qICA3OSAqLwotICBzY19OaWwsCQkJLyogIDgwICovCi0gIHNjX05pbCwJCQkvKiAgODEgKi8KLSAgc2NfTmlsLAkJCS8qICA4MiAqLwotICBzY19OaWwsCQkJLyogIDgzICovCi0gIHNjX05pbCwJCQkvKiAgODQgKi8KLSAgc2NfTmlsLAkJCS8qICA4NSAqLwotICBzY19OaWwsCQkJLyogIDg2ICovCi0gIHNjX05pbCwJCQkvKiAgODcgKi8KLSAgc2NfTmlsLAkJCS8qICA4OCAqLwotICBzY19OaWwsCQkJLyogIDg5ICovCi0gIHNjX05pbCwJCQkvKiAgOTAgKi8KLSAgc2NfTmlsLAkJCS8qICA5MSAqLwotICBzY19OaWwsCQkJLyogIDkyICovCi0gIHNjX05pbCwJCQkvKiAgOTMgKi8KLSAgc2NfTmlsLAkJCS8qICA5NCAqLwotICBzY19OaWwsCQkJLyogIDk1ICovCi0gIHNjX05pbCwJCQkvKiAgOTYgKi8KLSAgc2NfTmlsLAkJCS8qICA5NyAqLwotICBzY19OaWwsCQkJLyogIDk4ICovCi0gIHNjX05pbCwJCQkvKiAgOTkgKi8KLSAgc2NfVGV4dCwJCQkvKiAxMDA6IENfQkxPQ0sgIGJsb2NrIHN0YXJ0L2VuZCAqLwotICBzY19UZXh0LAkJCS8qIDEwMTogQ19GQ04JIGZ1bmN0aW9uIHN0YXJ0L2VuZCAqLwotICBzY19JbmZvLAkJCS8qIDEwMjogQ19FT1MJIGVuZCBvZiBzdHJ1Y3QvdW5pb24vZW51bSAqLwotICBzY19OaWwsCQkJLyogMTAzOiBDX0ZJTEUJIGZpbGUgc3RhcnQgKi8KLSAgc2NfTmlsLAkJCS8qIDEwNDogQ19MSU5FCSBsaW5lIG51bWJlciAqLwotICBzY19OaWwsCQkJLyogMTA1OiBDX0FMSUFTCSBjb21iaW5lZCB0eXBlIGluZm8gKi8KLSAgc2NfTmlsLAkJCS8qIDEwNjogQ19ISURERU4gPz8/ICovCi19OwotCi0vKiBDb252ZXJ0IENPRkYgc3RvcmFnZSBjbGFzcyB0byBFQ09GRiBzeW1ib2wgdHlwZS4gICovCi1zdGF0aWMgY29uc3Qgc3RfdCBtYXBfY29mZl9zeW1fdHlwZVtdID0gewotICBzdF9OaWwsCQkJLyogICAwOiBDX05VTEwgKi8KLSAgc3RfTG9jYWwsCQkJLyogICAxOiBDX0FVVE8JICBhdXRvIHZhciAqLwotICBzdF9HbG9iYWwsCQkJLyogICAyOiBDX0VYVAkgIGV4dGVybmFsICovCi0gIHN0X1N0YXRpYywJCQkvKiAgIDM6IENfU1RBVAkgIHN0YXRpYyAqLwotICBzdF9Mb2NhbCwJCQkvKiAgIDQ6IENfUkVHCSAgcmVnaXN0ZXIgKi8KLSAgc3RfR2xvYmFsLAkJCS8qICAgNTogQ19FWFRERUYgID8/PyAqLwotICBzdF9MYWJlbCwJCQkvKiAgIDY6IENfTEFCRUwJICBsYWJlbCAqLwotICBzdF9MYWJlbCwJCQkvKiAgIDc6IENfVUxBQkVMICB1c2VyIGxhYmVsICovCi0gIHN0X01lbWJlciwJCQkvKiAgIDg6IENfTU9TCSAgbWVtYmVyIG9mIHN0cnVjdCAqLwotICBzdF9QYXJhbSwJCQkvKiAgIDk6IENfQVJHCSAgYXJndW1lbnQgKi8KLSAgc3RfQmxvY2ssCQkJLyogIDEwOiBDX1NUUlRBRyAgc3RydWN0IHRhZyAqLwotICBzdF9NZW1iZXIsCQkJLyogIDExOiBDX01PVQkgIG1lbWJlciBvZiB1bmlvbiAqLwotICBzdF9CbG9jaywJCQkvKiAgMTI6IENfVU5UQUcgICB1bmlvbiB0YWcgKi8KLSAgc3RfVHlwZWRlZiwJCQkvKiAgMTM6IENfVFBERUYJICB0eXBlZGVmICovCi0gIHN0X1N0YXRpYywJCQkvKiAgMTQ6IENfVVNUQVRJQyA/Pz8gKi8KLSAgc3RfQmxvY2ssCQkJLyogIDE1OiBDX0VOVEFHCSAgZW51bSB0YWcgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAxNjogQ19NT0UJICBtZW1iZXIgb2YgZW51bSAqLwotICBzdF9QYXJhbSwJCQkvKiAgMTc6IENfUkVHUEFSTSByZWdpc3RlciBwYXJhbWV0ZXIgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAxODsgQ19GSUVMRAkgIGJpdGZpZWxkICovCi0gIHN0X05pbCwJCQkvKiAgMTkgKi8KLSAgc3RfTmlsLAkJCS8qICAyMCAqLwotICBzdF9OaWwsCQkJLyogIDIxICovCi0gIHN0X05pbCwJCQkvKiAgMjIgKi8KLSAgc3RfTmlsLAkJCS8qICAyMyAqLwotICBzdF9OaWwsCQkJLyogIDI0ICovCi0gIHN0X05pbCwJCQkvKiAgMjUgKi8KLSAgc3RfTmlsLAkJCS8qICAyNiAqLwotICBzdF9OaWwsCQkJLyogIDI3ICovCi0gIHN0X05pbCwJCQkvKiAgMjggKi8KLSAgc3RfTmlsLAkJCS8qICAyOSAqLwotICBzdF9OaWwsCQkJLyogIDMwICovCi0gIHN0X05pbCwJCQkvKiAgMzEgKi8KLSAgc3RfTmlsLAkJCS8qICAzMiAqLwotICBzdF9OaWwsCQkJLyogIDMzICovCi0gIHN0X05pbCwJCQkvKiAgMzQgKi8KLSAgc3RfTmlsLAkJCS8qICAzNSAqLwotICBzdF9OaWwsCQkJLyogIDM2ICovCi0gIHN0X05pbCwJCQkvKiAgMzcgKi8KLSAgc3RfTmlsLAkJCS8qICAzOCAqLwotICBzdF9OaWwsCQkJLyogIDM5ICovCi0gIHN0X05pbCwJCQkvKiAgNDAgKi8KLSAgc3RfTmlsLAkJCS8qICA0MSAqLwotICBzdF9OaWwsCQkJLyogIDQyICovCi0gIHN0X05pbCwJCQkvKiAgNDMgKi8KLSAgc3RfTmlsLAkJCS8qICA0NCAqLwotICBzdF9OaWwsCQkJLyogIDQ1ICovCi0gIHN0X05pbCwJCQkvKiAgNDYgKi8KLSAgc3RfTmlsLAkJCS8qICA0NyAqLwotICBzdF9OaWwsCQkJLyogIDQ4ICovCi0gIHN0X05pbCwJCQkvKiAgNDkgKi8KLSAgc3RfTmlsLAkJCS8qICA1MCAqLwotICBzdF9OaWwsCQkJLyogIDUxICovCi0gIHN0X05pbCwJCQkvKiAgNTIgKi8KLSAgc3RfTmlsLAkJCS8qICA1MyAqLwotICBzdF9OaWwsCQkJLyogIDU0ICovCi0gIHN0X05pbCwJCQkvKiAgNTUgKi8KLSAgc3RfTmlsLAkJCS8qICA1NiAqLwotICBzdF9OaWwsCQkJLyogIDU3ICovCi0gIHN0X05pbCwJCQkvKiAgNTggKi8KLSAgc3RfTmlsLAkJCS8qICA1OSAqLwotICBzdF9OaWwsCQkJLyogIDYwICovCi0gIHN0X05pbCwJCQkvKiAgNjEgKi8KLSAgc3RfTmlsLAkJCS8qICA2MiAqLwotICBzdF9OaWwsCQkJLyogIDYzICovCi0gIHN0X05pbCwJCQkvKiAgNjQgKi8KLSAgc3RfTmlsLAkJCS8qICA2NSAqLwotICBzdF9OaWwsCQkJLyogIDY2ICovCi0gIHN0X05pbCwJCQkvKiAgNjcgKi8KLSAgc3RfTmlsLAkJCS8qICA2OCAqLwotICBzdF9OaWwsCQkJLyogIDY5ICovCi0gIHN0X05pbCwJCQkvKiAgNzAgKi8KLSAgc3RfTmlsLAkJCS8qICA3MSAqLwotICBzdF9OaWwsCQkJLyogIDcyICovCi0gIHN0X05pbCwJCQkvKiAgNzMgKi8KLSAgc3RfTmlsLAkJCS8qICA3NCAqLwotICBzdF9OaWwsCQkJLyogIDc1ICovCi0gIHN0X05pbCwJCQkvKiAgNzYgKi8KLSAgc3RfTmlsLAkJCS8qICA3NyAqLwotICBzdF9OaWwsCQkJLyogIDc4ICovCi0gIHN0X05pbCwJCQkvKiAgNzkgKi8KLSAgc3RfTmlsLAkJCS8qICA4MCAqLwotICBzdF9OaWwsCQkJLyogIDgxICovCi0gIHN0X05pbCwJCQkvKiAgODIgKi8KLSAgc3RfTmlsLAkJCS8qICA4MyAqLwotICBzdF9OaWwsCQkJLyogIDg0ICovCi0gIHN0X05pbCwJCQkvKiAgODUgKi8KLSAgc3RfTmlsLAkJCS8qICA4NiAqLwotICBzdF9OaWwsCQkJLyogIDg3ICovCi0gIHN0X05pbCwJCQkvKiAgODggKi8KLSAgc3RfTmlsLAkJCS8qICA4OSAqLwotICBzdF9OaWwsCQkJLyogIDkwICovCi0gIHN0X05pbCwJCQkvKiAgOTEgKi8KLSAgc3RfTmlsLAkJCS8qICA5MiAqLwotICBzdF9OaWwsCQkJLyogIDkzICovCi0gIHN0X05pbCwJCQkvKiAgOTQgKi8KLSAgc3RfTmlsLAkJCS8qICA5NSAqLwotICBzdF9OaWwsCQkJLyogIDk2ICovCi0gIHN0X05pbCwJCQkvKiAgOTcgKi8KLSAgc3RfTmlsLAkJCS8qICA5OCAqLwotICBzdF9OaWwsCQkJLyogIDk5ICovCi0gIHN0X0Jsb2NrLAkJCS8qIDEwMDogQ19CTE9DSyAgYmxvY2sgc3RhcnQvZW5kICovCi0gIHN0X1Byb2MsCQkJLyogMTAxOiBDX0ZDTgkgZnVuY3Rpb24gc3RhcnQvZW5kICovCi0gIHN0X0VuZCwJCQkvKiAxMDI6IENfRU9TCSBlbmQgb2Ygc3RydWN0L3VuaW9uL2VudW0gKi8KLSAgc3RfRmlsZSwJCQkvKiAxMDM6IENfRklMRQkgZmlsZSBzdGFydCAqLwotICBzdF9OaWwsCQkJLyogMTA0OiBDX0xJTkUJIGxpbmUgbnVtYmVyICovCi0gIHN0X05pbCwJCQkvKiAxMDU6IENfQUxJQVMJIGNvbWJpbmVkIHR5cGUgaW5mbyAqLwotICBzdF9OaWwsCQkJLyogMTA2OiBDX0hJRERFTiA/Pz8gKi8KLX07Ci0KLQotLyogS2VlcCB0cmFjayBvZiBkaWZmZXJlbnQgc2l6ZWQgYWxsb2NhdGlvbiByZXF1ZXN0cy4gICovCi1zdGF0aWMgYWxsb2NfaW5mb190IGFsbG9jX2NvdW50c1sgKGludClhbGxvY190eXBlX2xhc3QgXTsKLQwKLS8qIFJlY29yZCB3aGV0aGVyIHdlIGhhdmUgc2VlbiBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWludCBlY29mZl9kZWJ1Z2dpbmdfc2VlbiA9IDA7Ci0KLS8qIFZhcmlvdXMgc3RhdGljcy4gICovCi1zdGF0aWMgZWZkcl90ICAqY3VyX2ZpbGVfcHRyCT0gKGVmZHJfdCAqKSAwOwkvKiBjdXJyZW50IGZpbGUgZGVzYy4gaGVhZGVyICovCi1zdGF0aWMgcHJvY190ICAqY3VyX3Byb2NfcHRyCT0gKHByb2NfdCAqKSAwOwkvKiBjdXJyZW50IHByb2NlZHVyZSBoZWFkZXIgKi8KLXN0YXRpYyBwcm9jX3QgICpmaXJzdF9wcm9jX3B0ciAgPSAocHJvY190ICopIDA7IC8qIGZpcnN0IHByb2NlZHVyZSBoZWFkZXIgKi8KLXN0YXRpYyB0aGVhZF90ICp0b3BfdGFnX2hlYWQJPSAodGhlYWRfdCAqKSAwOyAvKiB0b3AgbGV2ZWwgdGFnIGhlYWQgKi8KLXN0YXRpYyB0aGVhZF90ICpjdXJfdGFnX2hlYWQJPSAodGhlYWRfdCAqKSAwOyAvKiBjdXJyZW50IHRhZyBoZWFkICovCi0jaWZkZWYgRUNPRkZfREVCVUcKLXN0YXRpYyBpbnQJZGVidWcJCT0gMDsgCQkvKiB0cmFjZSBmdW5jdGlvbnMgKi8KLSNlbmRpZgotc3RhdGljIGludAlzdGFic19zZWVuCT0gMDsJCS8qICE9IDAgaWYgc3RhYnMgaGF2ZSBiZWVuIHNlZW4gKi8KLQotc3RhdGljIGludCBjdXJyZW50X2ZpbGVfaWR4Owotc3RhdGljIGNvbnN0IGNoYXIgKmN1cnJlbnRfc3RhYnNfZmlsZW5hbWU7Ci0KLS8qIFBzZXVkbyBzeW1ib2wgdG8gdXNlIHdoZW4gcHV0dGluZyBzdGFicyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotI2lmbmRlZiBTVEFCU19TWU1CT0wKLSNkZWZpbmUgU1RBQlNfU1lNQk9MICJAc3RhYnMiCi0jZW5kaWYKLQotc3RhdGljIGNoYXIgc3RhYnNfc3ltYm9sW10gPSBTVEFCU19TWU1CT0w7Ci0MCi0vKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZCBhZGRfdmFycmF5X3BhZ2UgUEFSQU1TICgodmFycmF5X3QgKnZwKSk7Ci1zdGF0aWMgc3ltaW50X3QgYWRkX3N0cmluZyBQQVJBTVMgKCh2YXJyYXlfdCAqdnAsCi0JCQkJICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfdGJsLAotCQkJCSAgICBjb25zdCBjaGFyICpzdHIsCi0JCQkJICAgIHNoYXNoX3QgKipyZXRfaGFzaCkpOwotc3RhdGljIGxvY2Fsc3ltX3QgKmFkZF9lY29mZl9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyLCBzdF90IHR5cGUsCi0JCQkJCSAgICAgc2NfdCBzdG9yYWdlLCBzeW1ib2xTICpzeW0sCi0JCQkJCSAgICAgYmZkX3ZtYSBhZGRlbmQsIHN5bWludF90IHZhbHVlLAotCQkJCQkgICAgIHN5bWludF90IGluZHgpKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV9zeW1pbnQgUEFSQU1TICgoc3ltaW50X3QgYXV4X3dvcmQpKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV9ybmR4IFBBUkFNUyAoKGludCBmaWxlX2luZGV4LAotCQkJCQkgIHN5bWludF90IHN5bV9pbmRleCkpOwotc3RhdGljIHN5bWludF90IGFkZF9hdXhfc3ltX3RpciBQQVJBTVMgKCh0eXBlX2luZm9fdCAqdCwKLQkJCQkJIGhhc2hfc3RhdGVfdCBzdGF0ZSwKLQkJCQkJIHRoYXNoX3QgKipoYXNoX3RibCkpOwotc3RhdGljIHRhZ190ICpnZXRfdGFnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnRhZywgbG9jYWxzeW1fdCAqc3ltLAotCQkJICAgICAgIGJ0X3QgYmFzaWNfdHlwZSkpOwotc3RhdGljIHZvaWQgYWRkX3Vua25vd25fdGFnIFBBUkFNUyAoKHRhZ190ICpwdGFnKSk7Ci1zdGF0aWMgdm9pZCBhZGRfcHJvY2VkdXJlIFBBUkFNUyAoKGNoYXIgKmZ1bmMpKTsKLXN0YXRpYyB2b2lkIGFkZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGluZHgsIGludCBmYWtlKSk7Ci0jaWZkZWYgRUNPRkZfREVCVUcKLXN0YXRpYyBjaGFyICpzY190b19zdHJpbmcgUEFSQU1TICgoc2NfdCBzdG9yYWdlX2NsYXNzKSk7Ci1zdGF0aWMgY2hhciAqc3RfdG9fc3RyaW5nIFBBUkFNUyAoKHN0X3Qgc3ltYm9sX3R5cGUpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgbWFya19zdGFicyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBjaGFyICplY29mZl9hZGRfYnl0ZXMgUEFSQU1TICgoY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkJCQkgICAgICBjaGFyICpidWZwdHIsIHVuc2lnbmVkIGxvbmcgbmVlZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfcGFkZGluZ19hZGp1c3QKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGNoYXIgKipidWZwdHJwdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2xpbmVubwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgbG9uZyAqbGluZWNudHB0cikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3ltYm9scwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfcHJvY3MKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2F1eAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3RyaW5ncyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCQkJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQkJCSAgdmFycmF5X3QgKnZwKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9zcwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfZmRyCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zZXR1cF9leHQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHBhZ2VfdHlwZSAqYWxsb2NhdGVfY2x1c3RlciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG5wYWdlcykpOwotc3RhdGljIHBhZ2VfdHlwZSAqYWxsb2NhdGVfcGFnZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgc2NvcGVfdCAqYWxsb2NhdGVfc2NvcGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV9zY29wZSBQQVJBTVMgKChzY29wZV90ICpwdHIpKTsKLXN0YXRpYyB2bGlua3NfdCAqYWxsb2NhdGVfdmxpbmtzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzaGFzaF90ICphbGxvY2F0ZV9zaGFzaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdGhhc2hfdCAqYWxsb2NhdGVfdGhhc2ggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHRhZ190ICphbGxvY2F0ZV90YWcgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV90YWcgUEFSQU1TICgodGFnX3QgKnB0cikpOwotc3RhdGljIGZvcndhcmRfdCAqYWxsb2NhdGVfZm9yd2FyZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdGhlYWRfdCAqYWxsb2NhdGVfdGhlYWQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV90aGVhZCBQQVJBTVMgKCh0aGVhZF90ICpwdHIpKTsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICphbGxvY2F0ZV9saW5lbm9fbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN0YXJ0cyB1cC4gICovCi0KLXZvaWQKLWVjb2ZmX3JlYWRfYmVnaW5faG9vayAoKQotewotICB0YWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB0b3BfdGFnX2hlYWQgPSBhbGxvY2F0ZV90aGVhZCAoKTsKLSAgdG9wX3RhZ19oZWFkLT5maXJzdF90YWcgPSAodGFnX3QgKikgTlVMTDsKLSAgdG9wX3RhZ19oZWFkLT5mcmVlID0gKHRoZWFkX3QgKikgTlVMTDsKLSAgdG9wX3RhZ19oZWFkLT5wcmV2ID0gY3VyX3RhZ19oZWFkOwotICBjdXJfdGFnX2hlYWQgPSB0b3BfdGFnX2hlYWQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGlzIGNyZWF0ZWQuICAqLwotCi12b2lkCi1lY29mZl9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIE9CSl9TWU1GSUVMRF9UWVBFICpvYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGZpbGUgcG9pbnRlciwgYnV0IG9ubHkgaWYgd2UgaGF2ZSBzZWVuIGEKLSAgICAgZmlsZS4gIElmIHdlIGhhdmVuJ3Qgc2VlbiBhIGZpbGUsIHRoZW4gdGhpcyBpcyBhIHByb2JhYmx5IHNwZWNpYWwKLSAgICAgc3ltYm9sIGNyZWF0ZWQgYnkgbWRfYmVnaW4gd2hpY2ggbWF5IHJlcXVpcmVkIHNwZWNpYWwgaGFuZGxpbmcgYXQKLSAgICAgc29tZSBwb2ludC4gIENyZWF0aW5nIGEgZHVtbXkgZmlsZSB3aXRoIGEgZHVtbXkgbmFtZSBpcyBjZXJ0YWlubHkKLSAgICAgd3JvbmcuICAqLwotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTAotICAgICAgJiYgc2Vlbl9hdF9sZWFzdF8xX2ZpbGUgKCkpCi0gICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOwotICBvYmogPSBzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCk7Ci0gIG9iai0+ZWNvZmZfZmlsZSA9IGN1cl9maWxlX3B0cjsKLSAgb2JqLT5lY29mZl9zeW1ib2wgPSBOVUxMOwotICBvYmotPmVjb2ZmX2V4dGVybl9zaXplID0gMDsKLX0KLQwKLS8qIEFkZCBhIHBhZ2UgdG8gYSB2YXJyYXkgb2JqZWN0LiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF92YXJyYXlfcGFnZSAodnApCi0gICAgIHZhcnJheV90ICp2cDsJCQkJLyogdmFycmF5IHRvIGFkZCBwYWdlIHRvICovCi17Ci0gIHZsaW5rc190ICpuZXdfbGlua3MgPSBhbGxvY2F0ZV92bGlua3MgKCk7Ci0KLSNpZmRlZiBNQUxMT0NfQ0hFQ0sKLSAgaWYgKHZwLT5vYmplY3Rfc2l6ZSA+IDEpCi0gICAgbmV3X2xpbmtzLT5kYXR1bSA9IChwYWdlX3R5cGUgKikgeGNhbGxvYyAoMSwgdnAtPm9iamVjdF9zaXplKTsKLSAgZWxzZQotI2VuZGlmCi0gICAgbmV3X2xpbmtzLT5kYXR1bSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92YXJyYXldLnRvdGFsX2FsbG9jKys7Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmFycmF5XS50b3RhbF9wYWdlcysrOwotCi0gIG5ld19saW5rcy0+c3RhcnRfaW5kZXggPSB2cC0+bnVtX2FsbG9jYXRlZDsKLSAgdnAtPm9iamVjdHNfbGFzdF9wYWdlID0gMDsKLQotICBpZiAodnAtPmZpcnN0ID09ICh2bGlua3NfdCAqKSBOVUxMKQkJLyogZmlyc3QgYWxsb2NhdGlvbj8gKi8KLSAgICB2cC0+Zmlyc3QgPSB2cC0+bGFzdCA9IG5ld19saW5rczsKLSAgZWxzZQotICAgIHsJCQkJCQkvKiAybmQgb3IgZ3JlYXRlciBhbGxvY2F0aW9uICovCi0gICAgICBuZXdfbGlua3MtPnByZXYgPSB2cC0+bGFzdDsKLSAgICAgIHZwLT5sYXN0LT5uZXh0ID0gbmV3X2xpbmtzOwotICAgICAgdnAtPmxhc3QgPSBuZXdfbGlua3M7Ci0gICAgfQotfQotDAotLyogQWRkIGEgc3RyaW5nIChhbmQgbnVsbCBwYWQpIHRvIG9uZSBvZiB0aGUgc3RyaW5nIHRhYmxlcy4gICovCi0KLXN0YXRpYyBzeW1pbnRfdAotYWRkX3N0cmluZyAodnAsIGhhc2hfdGJsLCBzdHIsIHJldF9oYXNoKQotICAgICB2YXJyYXlfdCAqdnA7CQkJLyogc3RyaW5nIG9ic3RhY2sgKi8KLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqaGFzaF90Ymw7CS8qIHB0ciB0byBoYXNoIHRhYmxlICovCi0gICAgIGNvbnN0IGNoYXIgKnN0cjsJCQkvKiBzdHJpbmcgKi8KLSAgICAgc2hhc2hfdCAqKnJldF9oYXNoOwkJLyogcmV0dXJuIGhhc2ggcG9pbnRlciAqLwotewotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGxlbiA9IHN0cmxlbiAoc3RyKTsKLSAgcmVnaXN0ZXIgc2hhc2hfdCAqaGFzaF9wdHI7Ci0KLSAgaWYgKGxlbiA+PSBQQUdFX1VTSVpFKQotICAgIGFzX2ZhdGFsIChfKCJTdHJpbmcgdG9vIGJpZyAoJWx1IGJ5dGVzKSIpLCBsZW4pOwotCi0gIGhhc2hfcHRyID0gKHNoYXNoX3QgKikgaGFzaF9maW5kIChoYXNoX3RibCwgc3RyKTsKLSAgaWYgKGhhc2hfcHRyID09IChzaGFzaF90ICopIE5VTEwpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyOwotCi0gICAgICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlICsgbGVuID49IFBBR0VfVVNJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICB2cC0+bnVtX2FsbG9jYXRlZCA9Ci0gICAgICAgICAgICAoKHZwLT5udW1fYWxsb2NhdGVkICsgUEFHRV9VU0laRSAtIDEpIC8gUEFHRV9VU0laRSkgKiBQQUdFX1VTSVpFOwotICAgICAgICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotICAgICAgICB9Ci0KLSAgICAgIGhhc2hfcHRyID0gYWxsb2NhdGVfc2hhc2ggKCk7Ci0gICAgICBoYXNoX3B0ci0+aW5keCA9IHZwLT5udW1fYWxsb2NhdGVkOwotCi0gICAgICBoYXNoX3B0ci0+c3RyaW5nID0gJnZwLT5sYXN0LT5kYXR1bS0+Ynl0ZVt2cC0+b2JqZWN0c19sYXN0X3BhZ2VdOwotCi0gICAgICB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgKz0gbGVuICsgMTsKLSAgICAgIHZwLT5udW1fYWxsb2NhdGVkICs9IGxlbiArIDE7Ci0KLSAgICAgIHN0cmNweSAoaGFzaF9wdHItPnN0cmluZywgc3RyKTsKLQotICAgICAgZXJyID0gaGFzaF9pbnNlcnQgKGhhc2hfdGJsLCBzdHIsIChjaGFyICopIGhhc2hfcHRyKTsKLSAgICAgIGlmIChlcnIpCi0JYXNfZmF0YWwgKF8oIkluc2VydGluZyBcIiVzXCIgaW50byBzdHJpbmcgaGFzaCB0YWJsZTogJXMiKSwKLQkJICBzdHIsIGVycik7Ci0gICAgfQotCi0gIGlmIChyZXRfaGFzaCAhPSAoc2hhc2hfdCAqKikgTlVMTCkKLSAgICAqcmV0X2hhc2ggPSBoYXNoX3B0cjsKLQotICByZXR1cm4gaGFzaF9wdHItPmluZHg7Ci19Ci0MCi0vKiBBZGQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyBsb2NhbHN5bV90ICoKLWFkZF9lY29mZl9zeW1ib2wgKHN0ciwgdHlwZSwgc3RvcmFnZSwgc3ltX3ZhbHVlLCBhZGRlbmQsIHZhbHVlLCBpbmR4KQotICAgICBjb25zdCBjaGFyICpzdHI7CQkJLyogc3ltYm9sIG5hbWUgKi8KLSAgICAgc3RfdCB0eXBlOwkJCQkvKiBzeW1ib2wgdHlwZSAqLwotICAgICBzY190IHN0b3JhZ2U7CQkJLyogc3RvcmFnZSBjbGFzcyAqLwotICAgICBzeW1ib2xTICpzeW1fdmFsdWU7CQkvKiBhc3NvY2lhdGVkIHN5bWJvbC4gICovCi0gICAgIGJmZF92bWEgYWRkZW5kOwkJCS8qIGFkZGVuZCB0byBzeW1fdmFsdWUuICAqLwotICAgICBzeW1pbnRfdCB2YWx1ZTsJCQkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLSAgICAgc3ltaW50X3QgaW5keDsJCQkvKiBpbmRleCB0byBsb2NhbC9hdXguIHN5bXMgKi8KLXsKLSAgbG9jYWxzeW1fdCAqcHN5bTsKLSAgcmVnaXN0ZXIgc2NvcGVfdCAqcHNjb3BlOwotICByZWdpc3RlciB0aGVhZF90ICpwdGFnX2hlYWQ7Ci0gIHJlZ2lzdGVyIHRhZ190ICpwdGFnOwotICByZWdpc3RlciB0YWdfdCAqcHRhZ19uZXh0OwotICByZWdpc3RlciB2YXJyYXlfdCAqdnA7Ci0gIHJlZ2lzdGVyIGludCBzY29wZV9kZWx0YSA9IDA7Ci0gIHNoYXNoX3QgKmhhc2hfcHRyID0gKHNoYXNoX3QgKikgTlVMTDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5zeW1ib2xzOwotCi0gaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBwc3ltID0gJnZwLT5sYXN0LT5kYXR1bS0+c3ltWyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UrKyBdOwotCi0gIGlmIChzdHIgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCAmJiBzeW1fdmFsdWUgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBwc3ltLT5uYW1lID0gU19HRVRfTkFNRSAoc3ltX3ZhbHVlKTsKLSAgZWxzZQotICAgIHBzeW0tPm5hbWUgPSBzdHI7Ci0gIHBzeW0tPmFzX3N5bSA9IHN5bV92YWx1ZTsKLSAgaWYgKHN5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHN5bWJvbF9nZXRfb2JqIChzeW1fdmFsdWUpLT5lY29mZl9zeW1ib2wgPSBwc3ltOwotICBwc3ltLT5hZGRlbmQgPSBhZGRlbmQ7Ci0gIHBzeW0tPmZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICBwc3ltLT5wcm9jX3B0ciA9IGN1cl9wcm9jX3B0cjsKLSAgcHN5bS0+YmVnaW5fcHRyID0gKGxvY2Fsc3ltX3QgKikgTlVMTDsKLSAgcHN5bS0+aW5kZXhfcHRyID0gKGF1eF90ICopIE5VTEw7Ci0gIHBzeW0tPmZvcndhcmRfcmVmID0gKGZvcndhcmRfdCAqKSBOVUxMOwotICBwc3ltLT5zeW1faW5kZXggPSAtMTsKLSAgbWVtc2V0ICgmcHN5bS0+ZWNvZmZfc3ltLCAwLCBzaXplb2YgKEVYVFIpKTsKLSAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPSB2YWx1ZTsKLSAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAodW5zaWduZWQpIHR5cGU7Ci0gIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLnNjID0gKHVuc2lnbmVkKSBzdG9yYWdlOwotICBwc3ltLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGluZHg7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCBzeW1ib2wsIHdlIHdhaXQgdW50aWwgdGhlIGVuZCBvZiB0aGUKLSAgICAgYXNzZW1ibHkgYmVmb3JlIGRlY2lkaW5nIHdoZXJlIHRvIHB1dCB0aGUgbmFtZSAoaXQgbWF5IGJlIGp1c3QgYW4KLSAgICAgZXh0ZXJuYWwgc3ltYm9sKS4gIE90aGVyd2lzZSwgdGhpcyBpcyBqdXN0IGEgZGVidWdnaW5nIHN5bWJvbCBhbmQKLSAgICAgdGhlIG5hbWUgc2hvdWxkIGdvIHdpdGggdGhlIGN1cnJlbnQgZmlsZS4gICovCi0gIGlmIChzeW1fdmFsdWUgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBwc3ltLT5lY29mZl9zeW0uYXN5bS5pc3MgPSAoKHN0ciA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCQkJCT8gMAotCQkJCTogYWRkX3N0cmluZyAoJmN1cl9maWxlX3B0ci0+c3RyaW5ncywKLQkJCQkJICAgICAgY3VyX2ZpbGVfcHRyLT5zdHJfaGFzaCwKLQkJCQkJICAgICAgc3RyLAotCQkJCQkgICAgICAmaGFzaF9wdHIpKTsKLQotICArK3ZwLT5udW1fYWxsb2NhdGVkOwotCi0gIGlmIChFQ09GRl9JU19TVEFCICgmcHN5bS0+ZWNvZmZfc3ltLmFzeW0pKQotICAgIHJldHVybiBwc3ltOwotCi0gIC8qIFNhdmUgdGhlIHN5bWJvbCB3aXRoaW4gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhIHN0YXRpYwotICAgICBpdGVtLCBhbmQgaXQgaGFzIGEgbmFtZS4gICovCi0gIGlmIChoYXNoX3B0ciAhPSAoc2hhc2hfdCAqKSBOVUxMCi0gICAgICAmJiAodHlwZSA9PSBzdF9HbG9iYWwgfHwgdHlwZSA9PSBzdF9TdGF0aWMgfHwgdHlwZSA9PSBzdF9MYWJlbAotCSAgfHwgdHlwZSA9PSBzdF9Qcm9jIHx8IHR5cGUgPT0gc3RfU3RhdGljUHJvYykpCi0gICAgaGFzaF9wdHItPnN5bV9wdHIgPSBwc3ltOwotCi0gIC8qIHB1c2ggb3IgcG9wIGEgc2NvcGUgaWYgYXBwcm9wcmlhdGUuICAqLwotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugc3RfRmlsZToJCQkvKiBiZWdpbm5pbmcgb2YgZmlsZSAqLwotICAgIGNhc2Ugc3RfUHJvYzoJCQkvKiBwcm9jZWR1cmUgKi8KLSAgICBjYXNlIHN0X1N0YXRpY1Byb2M6CQkJLyogc3RhdGljIHByb2NlZHVyZSAqLwotICAgIGNhc2Ugc3RfQmxvY2s6CQkJLyogYmVnaW4gc2NvcGUgKi8KLSAgICAgIHBzY29wZSA9IGFsbG9jYXRlX3Njb3BlICgpOwotICAgICAgcHNjb3BlLT5wcmV2ID0gY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGU7Ci0gICAgICBwc2NvcGUtPmxzeW0gPSBwc3ltOwotICAgICAgcHNjb3BlLT50eXBlID0gdHlwZTsKLSAgICAgIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlID0gcHNjb3BlOwotCi0gICAgICBpZiAodHlwZSAhPSBzdF9GaWxlKQotCXNjb3BlX2RlbHRhID0gMTsKLQotICAgICAgLyogRm9yIGV2ZXJ5IGJsb2NrIHR5cGUgZXhjZXB0IGZpbGUsIHN0cnVjdCwgdW5pb24sIG9yCi0JIGVudW1lcmF0aW9uIGJsb2NrcywgcHVzaCBhIGxldmVsIG9uIHRoZSB0YWcgc3RhY2suICBXZSBvbWl0Ci0JIGZpbGUgdHlwZXMsIHNvIHRoYXQgdGFncyBjYW4gc3BhbiBmaWxlIGJvdW5kYXJpZXMuICAqLwotICAgICAgaWYgKHR5cGUgIT0gc3RfRmlsZSAmJiBzdG9yYWdlICE9IHNjX0luZm8pCi0JewotCSAgcHRhZ19oZWFkID0gYWxsb2NhdGVfdGhlYWQgKCk7Ci0JICBwdGFnX2hlYWQtPmZpcnN0X3RhZyA9IDA7Ci0JICBwdGFnX2hlYWQtPnByZXYgPSBjdXJfdGFnX2hlYWQ7Ci0JICBjdXJfdGFnX2hlYWQgPSBwdGFnX2hlYWQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHN0X0VuZDoKLSAgICAgIHBzY29wZSA9IGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlOwotICAgICAgaWYgKHBzY29wZSA9PSAoc2NvcGVfdCAqKSBOVUxMKQotCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBzdF9FbmQncyIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdF90IGJlZ2luX3R5cGUgPSAoc3RfdCkgcHNjb3BlLT5sc3ltLT5lY29mZl9zeW0uYXN5bS5zdDsKLQotCSAgcHN5bS0+YmVnaW5fcHRyID0gcHNjb3BlLT5sc3ltOwotCi0JICBpZiAoYmVnaW5fdHlwZSAhPSBzdF9GaWxlKQotCSAgICBzY29wZV9kZWx0YSA9IC0xOwotCi0JICAvKiBFeGNlcHQgZm9yIGZpbGUsIHN0cnVjdHVyZSwgdW5pb24sIG9yIGVudW1lcmF0aW9uIGVuZAotCSAgICAgYmxvY2tzIHJlbW92ZSBhbGwgdGFncyBjcmVhdGVkIHdpdGhpbiB0aGlzIHNjb3BlLiAgKi8KLQkgIGlmIChiZWdpbl90eXBlICE9IHN0X0ZpbGUgJiYgc3RvcmFnZSAhPSBzY19JbmZvKQotCSAgICB7Ci0JICAgICAgcHRhZ19oZWFkID0gY3VyX3RhZ19oZWFkOwotCSAgICAgIGN1cl90YWdfaGVhZCA9IHB0YWdfaGVhZC0+cHJldjsKLQotCSAgICAgIGZvciAocHRhZyA9IHB0YWdfaGVhZC0+Zmlyc3RfdGFnOwotCQkgICBwdGFnICE9ICh0YWdfdCAqKSBOVUxMOwotCQkgICBwdGFnID0gcHRhZ19uZXh0KQotCQl7Ci0JCSAgaWYgKHB0YWctPmZvcndhcmRfcmVmICE9IChmb3J3YXJkX3QgKikgTlVMTCkKLQkJICAgIGFkZF91bmtub3duX3RhZyAocHRhZyk7Ci0KLQkJICBwdGFnX25leHQgPSBwdGFnLT5zYW1lX2Jsb2NrOwotCQkgIHB0YWctPmhhc2hfcHRyLT50YWdfcHRyID0gcHRhZy0+c2FtZV9uYW1lOwotCQkgIGZyZWVfdGFnIChwdGFnKTsKLQkJfQotCi0JICAgICAgZnJlZV90aGVhZCAocHRhZ19oZWFkKTsKLQkgICAgfQotCi0JICBjdXJfZmlsZV9wdHItPmN1cl9zY29wZSA9IHBzY29wZS0+cHJldjsKLQotCSAgLyogYmxvY2sgYmVnaW4gZ2V0cyBuZXh0IHN5bSAjLiAgVGhpcyBpcyBzZXQgd2hlbiB3ZSBrbm93Ci0JICAgICB0aGUgc3ltYm9sIGluZGV4IHZhbHVlLiAgKi8KLQotCSAgLyogRnVuY3Rpb25zIHB1c2ggdHdvIG9yIG1vcmUgYXV4IHdvcmRzIGFzIGZvbGxvd3M6Ci0JICAgICAxc3Qgd29yZDogaW5kZXgrMSBvZiB0aGUgZW5kIHN5bWJvbCAoZmlsbGVkIGluIGxhdGVyKS4KLQkgICAgIDJuZCB3b3JkOiB0eXBlIG9mIHRoZSBmdW5jdGlvbiAocGx1cyBhbnkgYXV4IHdvcmRzIG5lZWRlZCkuCi0JICAgICBBbHNvLCB0aWUgdGhlIGV4dGVybmFsIHBvaW50ZXIgYmFjayB0byB0aGUgZnVuY3Rpb24gYmVnaW4gc3ltYm9sLiAgKi8KLQkgIGlmIChiZWdpbl90eXBlICE9IHN0X0ZpbGUgJiYgYmVnaW5fdHlwZSAhPSBzdF9CbG9jaykKLQkgICAgewotCSAgICAgIHN5bWludF90IHR5OwotCSAgICAgIHZhcnJheV90ICpzdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKLQotCSAgICAgIHBzY29wZS0+bHN5bS0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBhZGRfYXV4X3N5bV9zeW1pbnQgKDApOwotCSAgICAgIHBzY29wZS0+bHN5bS0+aW5kZXhfcHRyID0KLQkJJnN2cC0+bGFzdC0+ZGF0dW0tPmF1eFtzdnAtPm9iamVjdHNfbGFzdF9wYWdlIC0gMV07Ci0JICAgICAgdHkgPSBhZGRfYXV4X3N5bV90aXIgKCZsYXN0X2Z1bmNfdHlwZV9pbmZvLAotCQkJCSAgICBoYXNoX25vLAotCQkJCSAgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKLQotLyogVGhpcyBzZWVtcyB0byBiZSB1bm5lY2Vzc2FyeS4gIEknbSBub3QgZXZlbiBzdXJlIHdoYXQgaXQgaXMKLSAqIGludGVuZGVkIHRvIGRvLiAgSXQncyBmcm9tIG1pcHMtdGZpbGUuCi0gKgkgICAgICBpZiAobGFzdF9mdW5jX3N5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICoJCXsKLSAqCQkgIGxhc3RfZnVuY19zeW1fdmFsdWUtPmlmZCA9IGN1cl9maWxlX3B0ci0+ZmlsZV9pbmRleDsKLSAqCQkgIGxhc3RfZnVuY19zeW1fdmFsdWUtPmluZGV4ID0gdHk7Ci0gKgkJfQotICovCi0JICAgIH0KLQotCSAgZnJlZV9zY29wZSAocHNjb3BlKTsKLQl9Ci0gICAgfQotCi0gIGN1cl9maWxlX3B0ci0+bmVzdGVkX3Njb3BlcyArPSBzY29wZV9kZWx0YTsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZyAmJiB0eXBlICE9IHN0X0ZpbGUKLSAgICAgICYmIChkZWJ1ZyA+IDIgfHwgdHlwZSA9PSBzdF9CbG9jayB8fCB0eXBlID09IHN0X0VuZAotCSAgfHwgdHlwZSA9PSBzdF9Qcm9jIHx8IHR5cGUgPT0gc3RfU3RhdGljUHJvYykpCi0gICAgewotICAgICAgY2hhciAqc2Nfc3RyID0gc2NfdG9fc3RyaW5nIChzdG9yYWdlKTsKLSAgICAgIGNoYXIgKnN0X3N0ciA9IHN0X3RvX3N0cmluZyAodHlwZSk7Ci0gICAgICBpbnQgZGVwdGggPSBjdXJfZmlsZV9wdHItPm5lc3RlZF9zY29wZXMgKyAoc2NvcGVfZGVsdGEgPCAwKTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXHRsc3ltXHR2PSAlMTBsZCwgZGVwdGg9ICUyZCwgc2M9ICUtMTJzIiwKLQkgICAgICAgdmFsdWUsIGRlcHRoLCBzY19zdHIpOwotCi0gICAgICBpZiAoc3RyX3N0YXJ0ICYmIHN0cl9lbmRfcDEgLSBzdHJfc3RhcnQgPiAwKQotCWZwcmludGYgKHN0ZGVyciwgIiBzdD0gJS0xMXMgbmFtZT0gJS4qc1xuIiwgc3Rfc3RyLCBzdHJfZW5kX3AxIC0gc3RyX3N0YXJ0LCBzdHJfc3RhcnQpOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuIChzdF9zdHIpOwotCSAgZnByaW50ZiAoc3RkZXJyLCAiIHN0PSAlLipzXG4iLCBsZW4tMSwgc3Rfc3RyKTsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHBzeW07Ci19Ci0MCi0vKiBBZGQgYW4gYXV4aWxpYXJ5IHN5bWJvbCAocGFzc2luZyBhIHN5bWludCkuICBUaGlzIGlzIGFjdHVhbGx5IHVzZWQKLSAgIGZvciBpbnRlZ3JhbCBhdXggdHlwZXMsIG5vdCBqdXN0IHN5bWludHMuICAqLwotCi1zdGF0aWMgc3ltaW50X3QKLWFkZF9hdXhfc3ltX3N5bWludCAoYXV4X3dvcmQpCi0gICAgIHN5bWludF90IGF1eF93b3JkOwkJLyogYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHdvcmQgKi8KLXsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBhdXhfdCAqYXV4X3B0cjsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKLQotICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIGF1eF9wdHIgPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbdnAtPm9iamVjdHNfbGFzdF9wYWdlKytdOwotICBhdXhfcHRyLT50eXBlID0gYXV4X2lzeW07Ci0gIGF1eF9wdHItPmRhdGEuaXN5bSA9IGF1eF93b3JkOwotCi0gIHJldHVybiB2cC0+bnVtX2FsbG9jYXRlZCsrOwotfQotCi0KLS8qIEFkZCBhbiBhdXhpbGlhcnkgc3ltYm9sIChwYXNzaW5nIGEgZmlsZS9zeW1ib2wgaW5kZXggY29tYm8pLiAgKi8KLQotc3RhdGljIHN5bWludF90Ci1hZGRfYXV4X3N5bV9ybmR4IChmaWxlX2luZGV4LCBzeW1faW5kZXgpCi0gICAgIGludCBmaWxlX2luZGV4OwotICAgICBzeW1pbnRfdCBzeW1faW5kZXg7Ci17Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgYXV4X3QgKmF1eF9wdHI7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIHZwID0gJmN1cl9maWxlX3B0ci0+YXV4X3N5bXM7Ci0KLSAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBhdXhfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4W3ZwLT5vYmplY3RzX2xhc3RfcGFnZSsrXTsKLSAgYXV4X3B0ci0+dHlwZSA9IGF1eF9ybmR4OwotICBhdXhfcHRyLT5kYXRhLnJuZHgucmZkICAgPSBmaWxlX2luZGV4OwotICBhdXhfcHRyLT5kYXRhLnJuZHguaW5kZXggPSBzeW1faW5kZXg7Ci0KLSAgcmV0dXJuIHZwLT5udW1fYWxsb2NhdGVkKys7Ci19Ci0MCi0vKiBBZGQgYW4gYXV4aWxpYXJ5IHN5bWJvbCAocGFzc2luZyB0aGUgYmFzaWMgdHlwZSBhbmQgcG9zc2libHkKLSAgIHR5cGUgcXVhbGlmaWVycykuICAqLwotCi1zdGF0aWMgc3ltaW50X3QKLWFkZF9hdXhfc3ltX3RpciAodCwgc3RhdGUsIGhhc2hfdGJsKQotICAgICB0eXBlX2luZm9fdCAqdDsJCS8qIGN1cnJlbnQgdHlwZSBpbmZvcm1hdGlvbiAqLwotICAgICBoYXNoX3N0YXRlX3Qgc3RhdGU7CS8qIHdoZXRoZXIgdG8gaGFzaCB0eXBlIG9yIG5vdCAqLwotICAgICB0aGFzaF90ICoqaGFzaF90Ymw7CS8qIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSB0byB1c2UgKi8KLXsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBhdXhfdCAqYXV4X3B0cjsKLSAgc3RhdGljIEFVWFUgaW5pdF9hdXg7Ci0gIHN5bWludF90IHJldDsKLSAgaW50IGk7Ci0gIEFVWFUgYXV4OwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPmF1eF9zeW1zOwotCi0gIGF1eCA9IGluaXRfYXV4OwotICBhdXgudGkuYnQgPSAoaW50KSB0LT5iYXNpY190eXBlOwotICBhdXgudGkuY29udGludWVkID0gMDsKLSAgYXV4LnRpLmZCaXRmaWVsZCA9IHQtPmJpdGZpZWxkOwotCi0gIGF1eC50aS50cTAgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMF07Ci0gIGF1eC50aS50cTEgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMV07Ci0gIGF1eC50aS50cTIgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMl07Ci0gIGF1eC50aS50cTMgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbM107Ci0gIGF1eC50aS50cTQgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbNF07Ci0gIGF1eC50aS50cTUgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbNV07Ci0KLQotICAvKiBGb3IgYW55dGhpbmcgdGhhdCBhZGRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHdlIG11c3Qgbm90IGhhc2gsCi0gICAgIHNvIGNoZWNrIGhlcmUsIGFuZCByZXNldCBvdXIgc3RhdGUuICovCi0KLSAgaWYgKHN0YXRlICE9IGhhc2hfbm8KLSAgICAgICYmICh0LT50eXBlX3F1YWxpZmllcnNbMF0gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1sxXSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzJdID09IHRxX0FycmF5Ci0JICB8fCB0LT50eXBlX3F1YWxpZmllcnNbM10gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1s0XSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzVdID09IHRxX0FycmF5Ci0JICB8fCB0LT5iYXNpY190eXBlID09IGJ0X1N0cnVjdAotCSAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9VbmlvbgotCSAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9FbnVtCi0JICB8fCB0LT5iaXRmaWVsZAotCSAgfHwgdC0+bnVtX2RpbXMgPiAwKSkKLSAgICBzdGF0ZSA9IGhhc2hfbm87Ci0KLSAgLyogU2VlIGlmIHdlIGNhbiBoYXNoIHRoaXMgdHlwZSwgYW5kIHNhdmUgc29tZSBzcGFjZSwgYnV0IHNvbWUgdHlwZXMKLSAgICAgY2FuJ3QgYmUgaGFzaGVkIChiZWNhdXNlIHRoZXkgY29udGFpbiBhcnJheXMgb3IgY29udGludWF0aW9ucyksCi0gICAgIGFuZCBvdGhlcnMgY2FuIGJlIHB1dCBpbnRvIHRoZSBoYXNoIGxpc3QsIGJ1dCBjYW5ub3QgdXNlIGV4aXN0aW5nCi0gICAgIHR5cGVzIGJlY2F1c2Ugb3RoZXIgYXV4IGVudHJpZXMgcHJlY2VkZSB0aGlzIG9uZS4gICovCi0KLSAgaWYgKHN0YXRlICE9IGhhc2hfbm8pCi0gICAgewotICAgICAgcmVnaXN0ZXIgdGhhc2hfdCAqaGFzaF9wdHI7Ci0gICAgICByZWdpc3RlciBzeW1pbnRfdCBoaTsKLQotICAgICAgaGkgPSBhdXguaXN5bSAmICgoMSA8PCBIQVNIQklUUykgLSAxKTsKLSAgICAgIGhpICU9IFRIQVNIX1NJWkU7Ci0KLSAgICAgIGZvciAoaGFzaF9wdHIgPSBoYXNoX3RibFtoaV07Ci0JICAgaGFzaF9wdHIgIT0gKHRoYXNoX3QgKikwOwotCSAgIGhhc2hfcHRyID0gaGFzaF9wdHItPm5leHQpCi0JewotCSAgaWYgKGF1eC5pc3ltID09IGhhc2hfcHRyLT50eXBlLmlzeW0pCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGhhc2hfcHRyICE9ICh0aGFzaF90ICopIE5VTEwgJiYgc3RhdGUgPT0gaGFzaF95ZXMpCi0JcmV0dXJuIGhhc2hfcHRyLT5pbmR4OwotCi0gICAgICBpZiAoaGFzaF9wdHIgPT0gKHRoYXNoX3QgKikgTlVMTCkKLQl7Ci0JICBoYXNoX3B0ciA9IGFsbG9jYXRlX3RoYXNoICgpOwotCSAgaGFzaF9wdHItPm5leHQgPSBoYXNoX3RibFtoaV07Ci0JICBoYXNoX3B0ci0+dHlwZSA9IGF1eDsKLQkgIGhhc2hfcHRyLT5pbmR4ID0gdnAtPm51bV9hbGxvY2F0ZWQ7Ci0JICBoYXNoX3RibFtoaV0gPSBoYXNoX3B0cjsKLQl9Ci0gICAgfQotCi0gIC8qIEV2ZXJ5dGhpbmcgaXMgc2V0IHVwLCBhZGQgdGhlIGF1eCBzeW1ib2wuICovCi0gIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCi0gICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0KLSAgYXV4X3B0ciA9ICZ2cC0+bGFzdC0+ZGF0dW0tPmF1eFsgdnAtPm9iamVjdHNfbGFzdF9wYWdlKysgXTsKLSAgYXV4X3B0ci0+dHlwZSA9IGF1eF90aXI7Ci0gIGF1eF9wdHItPmRhdGEgPSBhdXg7Ci0KLSAgcmV0ID0gdnAtPm51bV9hbGxvY2F0ZWQrKzsKLQotICAvKiBBZGQgYml0ZmllbGQgbGVuZ3RoIGlmIGl0IGV4aXN0cy4KLQotICAgICBOT1RFOiAgTWlwcyBkb2N1bWVudGF0aW9uIGNsYWltcyBiaXRmaWVsZCBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgIEFVWCByZWNvcmQsIGJ1dCB0aGUgREVDc3RhdGlvbiBjb21waWxlciBlbWl0cyBpdCBoZXJlLgotICAgICAoVGhpcyB3b3VsZCBvbmx5IG1ha2UgYSBkaWZmZXJlbmNlIGZvciBlbnVtIGJpdGZpZWxkcy4pCi0KLSAgICAgQWxzbyBub3RlOiAgV2UgdXNlIHRoZSBsYXN0IHNpemUgZ2l2ZW4gc2luY2UgZ2NjIG1heSBlbWl0IDIKLSAgICAgZm9yIGFuIGVudW0gYml0ZmllbGQuICAqLwotCi0gIGlmICh0LT5iaXRmaWVsZCkKLSAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgoc3ltaW50X3QpdC0+c2l6ZXNbdC0+bnVtX3NpemVzLTFdKTsKLQotCi0gIC8qIEFkZCB0YWcgaW5mb3JtYXRpb24gaWYgbmVlZGVkLiAgU3RydWN0dXJlLCB1bmlvbiwgYW5kIGVudW0KLSAgICAgcmVmZXJlbmNlcyBhZGQgMiBhdXggc3ltYm9sczogYSBbZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4XQotICAgICBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgdHlwZSwgYW5kIHRoZSBjdXJyZW50IGZpbGUgaW5kZXguICAqLwotCi0gIGlmICh0LT5iYXNpY190eXBlID09IGJ0X1N0cnVjdAotICAgICAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9VbmlvbgotICAgICAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9FbnVtKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN5bWludF90IGZpbGVfaW5kZXggPSB0LT50YWdfcHRyLT5pZmQ7Ci0gICAgICByZWdpc3RlciBsb2NhbHN5bV90ICpzeW0gID0gdC0+dGFnX3B0ci0+c3ltOwotICAgICAgcmVnaXN0ZXIgZm9yd2FyZF90ICpmb3J3YXJkX3JlZiA9IGFsbG9jYXRlX2ZvcndhcmQgKCk7Ci0KLSAgICAgIGlmIChzeW0gIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKLQl7Ci0JICBmb3J3YXJkX3JlZi0+bmV4dCA9IHN5bS0+Zm9yd2FyZF9yZWY7Ci0JICBzeW0tPmZvcndhcmRfcmVmID0gZm9yd2FyZF9yZWY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvcndhcmRfcmVmLT5uZXh0ID0gdC0+dGFnX3B0ci0+Zm9yd2FyZF9yZWY7Ci0JICB0LT50YWdfcHRyLT5mb3J3YXJkX3JlZiA9IGZvcndhcmRfcmVmOwotCX0KLQotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3JuZHggKFNUX1JGREVTQ0FQRSwgaW5kZXhOaWwpOwotICAgICAgZm9yd2FyZF9yZWYtPmluZGV4X3B0cgotCT0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4WyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgLSAxXTsKLQotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoZmlsZV9pbmRleCk7Ci0gICAgICBmb3J3YXJkX3JlZi0+aWZkX3B0cgotCT0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4WyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgLSAxXTsKLSAgICB9Ci0KLSAgLyogQWRkIGluZm9ybWF0aW9uIGFib3V0IGFycmF5IGJvdW5kcyBpZiB0aGV5IGV4aXN0LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHQtPm51bV9kaW1zOyBpKyspCi0gICAgewotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3JuZHggKFNUX1JGREVTQ0FQRSwKLQkJCSAgICAgICBjdXJfZmlsZV9wdHItPmludF90eXBlKTsKLQotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4KTsJLyogZmlsZSBpbmRleCovCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgoc3ltaW50X3QpIDApOwkJCS8qIGxvdyBib3VuZCAqLwotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAodC0+ZGltZW5zaW9uc1tpXSAtIDEpOwkJLyogaGlnaCBib3VuZCovCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgodC0+ZGltZW5zaW9uc1tpXSA9PSAwKQkvKiBzdHJpZGUgKi8KLQkJCQkgPyAwCi0JCQkJIDogKHQtPnNpemVzW2ldICogOCkgLyB0LT5kaW1lbnNpb25zW2ldKTsKLSAgICB9OwotCi0gIC8qIE5PVEU6ICBNaXBzIGRvY3VtZW50YXRpb24gY2xhaW1zIHRoYXQgdGhlIGJpdGZpZWxkIHdpZHRoIGdvZXMgaGVyZS4KLSAgICAgQnV0IGl0IG5lZWRzIHRvIGJlIGVtaXR0ZWQgZWFybGllci4gKi8KLQotICByZXR1cm4gcmV0OwotfQotDAotLyogQWRkIGEgdGFnIHRvIHRoZSB0YWcgdGFibGUgKHVubGVzcyBpdCBhbHJlYWR5IGV4aXN0cykuICAqLwotCi1zdGF0aWMgdGFnX3QgKgotZ2V0X3RhZyAodGFnLCBzeW0sIGJhc2ljX3R5cGUpCi0gICAgIGNvbnN0IGNoYXIgKnRhZzsJCQkvKiB0YWcgbmFtZSAqLwotICAgICBsb2NhbHN5bV90ICpzeW07CQkJLyogdGFnIHN0YXJ0IGJsb2NrICovCi0gICAgIGJ0X3QgYmFzaWNfdHlwZTsJCQkvKiBidF9TdHJ1Y3QsIGJ0X1VuaW9uLCBvciBidF9FbnVtICovCi17Ci0gIHNoYXNoX3QgKmhhc2hfcHRyOwotICBjb25zdCBjaGFyICplcnI7Ci0gIHRhZ190ICp0YWdfcHRyOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICBoYXNoX3B0ciA9IChzaGFzaF90ICopIGhhc2hfZmluZCAodGFnX2hhc2gsIHRhZyk7Ci0KLSAgaWYgKGhhc2hfcHRyICE9IChzaGFzaF90ICopIE5VTEwKLSAgICAgICYmIGhhc2hfcHRyLT50YWdfcHRyICE9ICh0YWdfdCAqKSBOVUxMKQotICB7Ci0gICAgdGFnX3B0ciA9IGhhc2hfcHRyLT50YWdfcHRyOwotICAgIGlmIChzeW0gIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKLSAgICAgIHsKLQl0YWdfcHRyLT5iYXNpY190eXBlID0gYmFzaWNfdHlwZTsKLQl0YWdfcHRyLT5pZmQJICAgID0gY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4OwotCXRhZ19wdHItPnN5bQkgICAgPSBzeW07Ci0gICAgICB9Ci0gICAgcmV0dXJuIHRhZ19wdHI7Ci0gIH0KLQotICBpZiAoaGFzaF9wdHIgPT0gKHNoYXNoX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpwZXJtOwotCi0gICAgICBwZXJtID0geG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKHRhZykgKyAxKSk7Ci0gICAgICBzdHJjcHkgKHBlcm0sIHRhZyk7Ci0gICAgICBoYXNoX3B0ciA9IGFsbG9jYXRlX3NoYXNoICgpOwotICAgICAgZXJyID0gaGFzaF9pbnNlcnQgKHRhZ19oYXNoLCBwZXJtLCAoY2hhciAqKSBoYXNoX3B0cik7Ci0gICAgICBpZiAoZXJyKQotCWFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gdGFnIGhhc2ggdGFibGU6ICVzIiksCi0JCSAgdGFnLCBlcnIpOwotICAgICAgaGFzaF9wdHItPnN0cmluZyA9IHBlcm07Ci0gICAgfQotCi0gIHRhZ19wdHIgPSBhbGxvY2F0ZV90YWcgKCk7Ci0gIHRhZ19wdHItPmZvcndhcmRfcmVmCT0gKGZvcndhcmRfdCAqKSBOVUxMOwotICB0YWdfcHRyLT5oYXNoX3B0cgk9IGhhc2hfcHRyOwotICB0YWdfcHRyLT5zYW1lX25hbWUJPSBoYXNoX3B0ci0+dGFnX3B0cjsKLSAgdGFnX3B0ci0+YmFzaWNfdHlwZQk9IGJhc2ljX3R5cGU7Ci0gIHRhZ19wdHItPnN5bQkJPSBzeW07Ci0gIHRhZ19wdHItPmlmZAkJPSAoKHN5bSA9PSAobG9jYWxzeW1fdCAqKSBOVUxMKQotCQkJICAgPyAoc3ltaW50X3QpIC0xCi0JCQkgICA6IGN1cl9maWxlX3B0ci0+ZmlsZV9pbmRleCk7Ci0gIHRhZ19wdHItPnNhbWVfYmxvY2sJPSBjdXJfdGFnX2hlYWQtPmZpcnN0X3RhZzsKLQotICBjdXJfdGFnX2hlYWQtPmZpcnN0X3RhZyA9IHRhZ19wdHI7Ci0gIGhhc2hfcHRyLT50YWdfcHRyCSAgPSB0YWdfcHRyOwotCi0gIHJldHVybiB0YWdfcHRyOwotfQotDAotLyogQWRkIGFuIHVua25vd24ge3N0cnVjdCwgdW5pb24sIGVudW19IHRhZy4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfdW5rbm93bl90YWcgKHB0YWcpCi0gICAgIHRhZ190CSpwdGFnOwkJLyogcG9pbnRlciB0byB0YWcgaW5mb3JtYXRpb24gKi8KLXsKLSAgc2hhc2hfdCAqaGFzaF9wdHIJPSBwdGFnLT5oYXNoX3B0cjsKLSAgY2hhciAqbmFtZQkJPSBoYXNoX3B0ci0+c3RyaW5nOwotICBsb2NhbHN5bV90ICpzeW07Ci0gIGZvcndhcmRfdCAqKnBmOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnID4gMSkKLSAgICB7Ci0gICAgICBjaGFyICphZ2dfdHlwZQk9ICJ7dW5rbm93biBhZ2dyZWdhdGUgdHlwZX0iOwotICAgICAgc3dpdGNoIChwdGFnLT5iYXNpY190eXBlKQotCXsKLQljYXNlIGJ0X1N0cnVjdDoJYWdnX3R5cGUgPSAic3RydWN0IjsJYnJlYWs7Ci0JY2FzZSBidF9VbmlvbjoJYWdnX3R5cGUgPSAidW5pb24iOwlicmVhazsKLQljYXNlIGJ0X0VudW06CWFnZ190eXBlID0gImVudW0iOwlicmVhazsKLQlkZWZhdWx0OgkJCQlicmVhazsKLQl9Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInVua25vd24gJXMgJS4qcyBmb3VuZFxuIiwgYWdnX3R5cGUsCi0JICAgICAgIGhhc2hfcHRyLT5sZW4sIG5hbWVfc3RhcnQpOwotICAgIH0KLSNlbmRpZgotCi0gIHN5bSA9IGFkZF9lY29mZl9zeW1ib2wgKG5hbWUsCi0JCQkgIHN0X0Jsb2NrLAotCQkJICBzY19JbmZvLAotCQkJICAoc3ltYm9sUyAqKSBOVUxMLAotCQkJICAoYmZkX3ZtYSkgMCwKLQkJCSAgKHN5bWludF90KSAwLAotCQkJICAoc3ltaW50X3QpIDApOwotCi0gICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChuYW1lLAotCQkJICAgc3RfRW5kLAotCQkJICAgc2NfSW5mbywKLQkJCSAgIChzeW1ib2xTICopIE5VTEwsCi0JCQkgICAoYmZkX3ZtYSkgMCwKLQkJCSAgIChzeW1pbnRfdCkgMCwKLQkJCSAgIChzeW1pbnRfdCkgMCk7Ci0KLSAgZm9yIChwZiA9ICZzeW0tPmZvcndhcmRfcmVmOyAqcGYgIT0gKGZvcndhcmRfdCAqKSBOVUxMOyBwZiA9ICYoKnBmKS0+bmV4dCkKLSAgICA7Ci0gICpwZiA9IHB0YWctPmZvcndhcmRfcmVmOwotfQotDAotLyogQWRkIGEgcHJvY2VkdXJlIHRvIHRoZSBjdXJyZW50IGZpbGUncyBsaXN0IG9mIHByb2NlZHVyZXMsIGFuZCByZWNvcmQKLSAgIHRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvY2VkdXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9wcm9jZWR1cmUgKGZ1bmMpCi0gICAgIGNoYXIgKmZ1bmM7CQkJLyogZnVuYyBuYW1lICovCi17Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgcHJvY190ICpuZXdfcHJvY19wdHI7Ci0gIHN5bWJvbFMgKnN5bTsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZykKLSAgICBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSNlbmRpZgotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPnByb2NzOwotCi0gIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCi0gICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0KLSAgY3VyX3Byb2NfcHRyID0gbmV3X3Byb2NfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+cHJvY1t2cC0+b2JqZWN0c19sYXN0X3BhZ2UrK107Ci0KLSAgaWYgKGZpcnN0X3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICBmaXJzdF9wcm9jX3B0ciA9IG5ld19wcm9jX3B0cjsKLQotICB2cC0+bnVtX2FsbG9jYXRlZCsrOwotCi0gIG5ld19wcm9jX3B0ci0+cGRyLmlzeW0gPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIuaWxpbmUgPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIubG5Mb3cgPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIubG5IaWdoID0gLTE7Ci0KLSAgLyogU2V0IHRoZSBCU0ZfRlVOQ1RJT04gZmxhZyBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKGZ1bmMpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCi0gIC8qIFB1c2ggdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIG5ld19wcm9jX3B0ci0+c3ltID0gYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfUHJvYywgc2NfVGV4dCwKLQkJCQkJc3ltLCAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLAotCQkJCQkoc3ltaW50X3QpIDApOwotCi0gICsrcHJvY19jbnQ7Ci0KLSAgLyogRmlsbCBpbiB0aGUgbGluZW5vcyBwcmVjZWRpbmcgdGhlIC5lbnQsIGlmIGFueS4gICovCi0gIGlmIChub3Byb2NfbGluZW5vICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCi0gICAgewotICAgICAgbGluZW5vX2xpc3RfdCAqbDsKLQotICAgICAgZm9yIChsID0gbm9wcm9jX2xpbmVubzsgbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLQlsLT5wcm9jID0gbmV3X3Byb2NfcHRyOwotICAgICAgKmxhc3RfbGluZW5vX3B0ciA9IG5vcHJvY19saW5lbm87Ci0gICAgICB3aGlsZSAoKmxhc3RfbGluZW5vX3B0ciAhPSBOVUxMKQotCXsKLQkgIGxhc3RfbGluZW5vID0gKmxhc3RfbGluZW5vX3B0cjsKLQkgIGxhc3RfbGluZW5vX3B0ciA9ICZsYXN0X2xpbmVuby0+bmV4dDsKLQl9Ci0gICAgICBub3Byb2NfbGluZW5vID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgICB9Ci19Ci0KLXN5bWJvbFMgKgotZWNvZmZfZ2V0X2N1cl9wcm9jX3N5bSAoKQotewotICByZXR1cm4gKGN1cl9wcm9jX3B0ciA/IGN1cl9wcm9jX3B0ci0+c3ltLT5hc19zeW0gOiBOVUxMKTsKLX0KLQwKLS8qIEFkZCBhIG5ldyBmaWxlbmFtZSwgYW5kIHNldCB1cCBhbGwgb2YgdGhlIGZpbGUgcmVsYXRpdmUKLSAgIHZpcnR1YWwgYXJyYXlzIChzdHJpbmdzLCBzeW1ib2xzLCBhdXggc3ltcywgZXRjLikuICBSZWNvcmQKLSAgIHdoZXJlIHRoZSBjdXJyZW50IGZpbGUgc3RydWN0dXJlIGxpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9maWxlIChmaWxlX25hbWUsIGluZHgsIGZha2UpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZTsJCS8qIGZpbGUgbmFtZSAqLwotICAgICBpbnQgaW5keDsKLSAgICAgaW50IGZha2U7Ci17Ci0gIHJlZ2lzdGVyIGludCBmaXJzdF9jaDsKLSAgcmVnaXN0ZXIgZWZkcl90ICpmaWxfcHRyOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnKQotICAgIGZwcmludGYgKHN0ZGVyciwgIlx0ZmlsZVx0JS4qc1xuIiwgbGVuLCBmaWxlX3N0YXJ0KTsKLSNlbmRpZgotCi0gIC8qIElmIHRoZSBmaWxlIG5hbWUgaXMgTlVMTCwgdGhlbiBubyAuZmlsZSBzeW1ib2wgYXBwZWFyZWQsIGFuZCB3ZQotICAgICB3YW50IHRvIHVzZSB0aGUgYWN0dWFsIGZpbGUgbmFtZS4gICovCi0gIGlmIChmaWxlX25hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlOwotCi0gICAgICBpZiAoZmlyc3RfZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCi0JYXNfZmF0YWwgKF8oImZha2UgLmZpbGUgYWZ0ZXIgcmVhbCBvbmUiKSk7Ci0gICAgICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gICAgICBmaWxlX25hbWUgPSAoY29uc3QgY2hhciAqKSBmaWxlOwotCi0gICAgICAvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgc2luY2UgSQotICAgICAgICAgdGhpbmsgdGhhdCdzIHdoYXQgb3RoZXIgRUNPRkYgYXNzZW1ibGVycyBkby4gIFdlIGRvbid0IGRvCi0gICAgICAgICB0aGlzIGlmIHdlIHNlZSBhIC5maWxlIGRpcmVjdGl2ZSB3aXRoIGEgc3RyaW5nLCBzaW5jZSB0aGF0Ci0gICAgICAgICBpbXBsaWVzIHRoYXQgc29tZSBzb3J0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBiZWluZwotICAgICAgICAgcHJvdmlkZWQuICAqLwotICAgICAgaWYgKCEgc3ltYm9sX3RhYmxlX2Zyb3plbiAmJiBkZWJ1Z190eXBlID09IERFQlVHX05PTkUpCi0JZGVidWdfdHlwZSA9IERFQlVHX0VDT0ZGOwotICAgIH0KLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGlmIChsaXN0aW5nKQotICAgIGxpc3Rpbmdfc291cmNlX2ZpbGUgKGZpbGVfbmFtZSk7Ci0jZW5kaWYKLQotICBjdXJyZW50X3N0YWJzX2ZpbGVuYW1lID0gZmlsZV9uYW1lOwotCi0gIC8qIElmIHdlJ3JlIGNyZWF0aW5nIHN0YWJzLCB0aGVuIHdlIGRvbid0IGFjdHVhbGx5IG1ha2UgYSBuZXcgRkRSLgotICAgICBJbnN0ZWFkLCB3ZSBqdXN0IGNyZWF0ZSBhIHN0YWJzIHN5bWJvbC4gICovCi0gIGlmIChzdGFic19zZWVuKQotICAgIHsKLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChmaWxlX25hbWUsIHN0X05pbCwgc2NfTmlsLAotCQkJICAgICAgIHN5bWJvbF9uZXcgKCJMMFwwMDEiLCBub3dfc2VnLAotCQkJCQkgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSAgIGZyYWdfbm93KSwKLQkJCSAgICAgICAoYmZkX3ZtYSkgMCwgMCwgRUNPRkZfTUFSS19TVEFCIChOX1NPTCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmaXJzdF9jaCA9ICpmaWxlX25hbWU7Ci0KLSAgLyogRklYTUU6IFdlIGNhbid0IHNhZmVseSBtZXJnZSBmaWxlcyB3aGljaCBoYXZlIGxpbmUgbnVtYmVyCi0gICAgIGluZm9ybWF0aW9uIChmTWVyZ2Ugd2lsbCBiZSB6ZXJvIGluIHRoaXMgY2FzZSkuICBPdGhlcndpc2UsIHdlCi0gICAgIGdldCBpbmNvcnJlY3QgbGluZSBudW1iZXIgZGVidWdnaW5nIGluZm8uICBTZWUgZm9yIGluc3RhbmNlCi0gICAgIGVjb2ZmX2J1aWxkX2xpbmVubywgd2hpY2ggd2lsbCBlbmQgdXAgc2V0dGluZyBhbGwgZmlsZS0+ZmRyLioKLSAgICAgZmllbGRzIG11bHRpcGxlIHRpbWVzLCByZXN1bHRpbmcgaW4gaW5jb3JyZWN0IGRlYnVnIGluZm8uICBJbgotICAgICBvcmRlciB0byBtYWtlIHRoaXMgd29yayByaWdodCwgYWxsIGxpbmUgbnVtYmVyIGFuZCBzeW1ib2wgaW5mbwotICAgICBmb3IgdGhlIHNhbWUgc291cmNlIGZpbGUgaGFzIHRvIGJlIGFkamFjZW50IGluIHRoZSBvYmplY3QgZmlsZSwKLSAgICAgc28gdGhhdCBhIHNpbmdsZSBmaWxlIGRlc2NyaXB0b3IgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlbS4KLSAgICAgVGhpcyB3b3VsZCByZXF1aXJlIG1haW50YWluaW5nIGZpbGUgc3BlY2lmaWMgbGlzdHMgb2YgbGluZQotICAgICBudW1iZXJzIGFuZCBzeW1ib2xzIGZvciBlYWNoIGZpbGUsIHNvIHRoYXQgdGhleSBjYW4gYmUgbWVyZ2VkCi0gICAgIHRvZ2V0aGVyIChvciBvdXRwdXQgdG9nZXRoZXIpIHdoZW4gdHdvIC5maWxlIHBzZXVkby1vcHMgYXJlCi0gICAgIG1lcmdlZCBpbnRvIG9uZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotCi0gIC8qIFNlZSBpZiB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuICAqLwotICBmb3IgKGZpbF9wdHIgPSBmaXJzdF9maWxlOwotICAgICAgIGZpbF9wdHIgIT0gKGVmZHJfdCAqKSBOVUxMOwotICAgICAgIGZpbF9wdHIgPSBmaWxfcHRyLT5uZXh0X2ZpbGUpCi0gICAgewotICAgICAgaWYgKGZpcnN0X2NoID09IGZpbF9wdHItPm5hbWVbMF0KLQkgICYmIHN0cmNtcCAoZmlsZV9uYW1lLCBmaWxfcHRyLT5uYW1lKSA9PSAwCi0JICAmJiBmaWxfcHRyLT5mZHIuZk1lcmdlKQotCXsKLQkgIGN1cl9maWxlX3B0ciA9IGZpbF9wdHI7Ci0JICBpZiAoISBmYWtlKQotCSAgICBjdXJfZmlsZV9wdHItPmZha2UgPSAwOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbmV3IGZpbGUsIGNyZWF0ZSBpdC4gKi8KLSAgaWYgKGZpbF9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2UgPT0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2UpCi0JYWRkX3ZhcnJheV9wYWdlICgmZmlsZV9kZXNjKTsKLQotICAgICAgZmlsX3B0ciA9IGN1cl9maWxlX3B0ciA9Ci0JJmZpbGVfZGVzYy5sYXN0LT5kYXR1bS0+ZmlsZVtmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2UrK107Ci0gICAgICAqZmlsX3B0ciA9IGluaXRfZmlsZTsKLQotICAgICAgZmlsX3B0ci0+ZmlsZV9pbmRleCA9IGN1cnJlbnRfZmlsZV9pZHgrKzsKLSAgICAgICsrZmlsZV9kZXNjLm51bV9hbGxvY2F0ZWQ7Ci0KLSAgICAgIGZpbF9wdHItPmZha2UgPSBmYWtlOwotCi0gICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotICAgICAgZmlsX3B0ci0+c3RyX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAgICAgLyogTWFrZSBzdXJlIDAgYnl0ZSBpbiBzdHJpbmcgdGFibGUgaXMgbnVsbCAgKi8KLSAgICAgIGFkZF9zdHJpbmcgKCZmaWxfcHRyLT5zdHJpbmdzLAotCQkgIGZpbF9wdHItPnN0cl9oYXNoLAotCQkgICIiLAotCQkgIChzaGFzaF90ICoqKTApOwotCi0gICAgICBpZiAoc3RybGVuIChmaWxlX25hbWUpID4gUEFHRV9VU0laRSAtIDIpCi0JYXNfZmF0YWwgKF8oIkZpbGVuYW1lIGdvZXMgb3ZlciBvbmUgcGFnZSBib3VuZGFyeS4iKSk7Ci0KLSAgICAgIC8qIFB1c2ggdGhlIHN0YXJ0IG9mIHRoZSBmaWxlbmFtZS4gV2UgYXNzdW1lIHRoYXQgdGhlIGZpbGVuYW1lCi0gICAgICAgICB3aWxsIGJlIHN0b3JlZCBhdCBzdHJpbmcgb2Zmc2V0IDEuICAqLwotICAgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKGZpbGVfbmFtZSwgc3RfRmlsZSwgc2NfVGV4dCwKLQkJCSAgICAgICAoc3ltYm9sUyAqKSBOVUxMLCAoYmZkX3ZtYSkgMCwKLQkJCSAgICAgICAoc3ltaW50X3QpIDAsIChzeW1pbnRfdCkgMCk7Ci0gICAgICBmaWxfcHRyLT5mZHIucnNzID0gMTsKLSAgICAgIGZpbF9wdHItPm5hbWUgPSAmZmlsX3B0ci0+c3RyaW5ncy5sYXN0LT5kYXR1bS0+Ynl0ZVsxXTsKLQotICAgICAgLyogVXBkYXRlIHRoZSBsaW5rZWQgbGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KLSAgICAgICpsYXN0X2ZpbGVfcHRyID0gZmlsX3B0cjsKLSAgICAgIGxhc3RfZmlsZV9wdHIgPSAmZmlsX3B0ci0+bmV4dF9maWxlOwotCi0gICAgICAvKiBBZGQgdm9pZCAmIGludCB0eXBlcyB0byB0aGUgZmlsZSAodm9pZCBzaG91bGQgYmUgZmlyc3QgdG8gY2F0Y2gKLQkgZXJyYW50IDAncyB3aXRoaW4gdGhlIGluZGV4IGZpZWxkcykuICAqLwotICAgICAgZmlsX3B0ci0+dm9pZF90eXBlID0gYWRkX2F1eF9zeW1fdGlyICgmdm9pZF90eXBlX2luZm8sCi0JCQkJCSAgICBoYXNoX3llcywKLQkJCQkJICAgICZjdXJfZmlsZV9wdHItPnRoYXNoX2hlYWRbMF0pOwotCi0gICAgICBmaWxfcHRyLT5pbnRfdHlwZSA9IGFkZF9hdXhfc3ltX3RpciAoJmludF90eXBlX2luZm8sCi0JCQkJCSAgIGhhc2hfeWVzLAotCQkJCQkgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBub3RpY2VzIGEgcHJlcHJvY2Vzc29yCi0gICBkaXJlY3RpdmUgc3dpdGNoaW5nIHRvIGEgbmV3IGZpbGUuICBUaGlzIHdpbGwgbm90IGhhcHBlbiBpbgotICAgY29tcGlsZXIgb3V0cHV0LCBvbmx5IGluIGhhbmQgY29kZWQgYXNzZW1ibGVyLiAgKi8KLQotdm9pZAotZWNvZmZfbmV3X2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChjdXJfZmlsZV9wdHIgIT0gTlVMTCAmJiBzdHJjbXAgKGN1cl9maWxlX3B0ci0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICByZXR1cm47Ci0gIGFkZF9maWxlIChuYW1lLCAwLCAwKTsKLQotICAvKiBUaGlzIGlzIGEgaGFuZCBjb2RlZCBhc3NlbWJsZXIgZmlsZSwgc28gYXV0b21hdGljYWxseSB0dXJuIG9uCi0gICAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX05PTkUpCi0gICAgZGVidWdfdHlwZSA9IERFQlVHX0VDT0ZGOwotfQotDAotI2lmZGVmIEVDT0ZGX0RFQlVHCi0KLS8qIENvbnZlcnQgc3RvcmFnZSBjbGFzcyB0byBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zY190b19zdHJpbmcoc3RvcmFnZV9jbGFzcykKLSAgICAgc2NfdCBzdG9yYWdlX2NsYXNzOwotewotICBzd2l0Y2goc3RvcmFnZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBzY19OaWw6CSByZXR1cm4gIk5pbCwiOwotICAgIGNhc2Ugc2NfVGV4dDoJIHJldHVybiAiVGV4dCwiOwotICAgIGNhc2Ugc2NfRGF0YToJIHJldHVybiAiRGF0YSwiOwotICAgIGNhc2Ugc2NfQnNzOgkgcmV0dXJuICJCc3MsIjsKLSAgICBjYXNlIHNjX1JlZ2lzdGVyOgkgcmV0dXJuICJSZWdpc3RlciwiOwotICAgIGNhc2Ugc2NfQWJzOgkgcmV0dXJuICJBYnMsIjsKLSAgICBjYXNlIHNjX1VuZGVmaW5lZDoJIHJldHVybiAiVW5kZWZpbmVkLCI7Ci0gICAgY2FzZSBzY19DZGJMb2NhbDoJIHJldHVybiAiQ2RiTG9jYWwsIjsKLSAgICBjYXNlIHNjX0JpdHM6CSByZXR1cm4gIkJpdHMsIjsKLSAgICBjYXNlIHNjX0NkYlN5c3RlbToJIHJldHVybiAiQ2RiU3lzdGVtLCI7Ci0gICAgY2FzZSBzY19SZWdJbWFnZToJIHJldHVybiAiUmVnSW1hZ2UsIjsKLSAgICBjYXNlIHNjX0luZm86CSByZXR1cm4gIkluZm8sIjsKLSAgICBjYXNlIHNjX1VzZXJTdHJ1Y3Q6CSByZXR1cm4gIlVzZXJTdHJ1Y3QsIjsKLSAgICBjYXNlIHNjX1NEYXRhOgkgcmV0dXJuICJTRGF0YSwiOwotICAgIGNhc2Ugc2NfU0JzczoJIHJldHVybiAiU0JzcywiOwotICAgIGNhc2Ugc2NfUkRhdGE6CSByZXR1cm4gIlJEYXRhLCI7Ci0gICAgY2FzZSBzY19WYXI6CSByZXR1cm4gIlZhciwiOwotICAgIGNhc2Ugc2NfQ29tbW9uOgkgcmV0dXJuICJDb21tb24sIjsKLSAgICBjYXNlIHNjX1NDb21tb246CSByZXR1cm4gIlNDb21tb24sIjsKLSAgICBjYXNlIHNjX1ZhclJlZ2lzdGVyOiByZXR1cm4gIlZhclJlZ2lzdGVyLCI7Ci0gICAgY2FzZSBzY19WYXJpYW50OgkgcmV0dXJuICJWYXJpYW50LCI7Ci0gICAgY2FzZSBzY19TVW5kZWZpbmVkOgkgcmV0dXJuICJTVW5kZWZpbmVkLCI7Ci0gICAgY2FzZSBzY19Jbml0OgkgcmV0dXJuICJJbml0LCI7Ci0gICAgY2FzZSBzY19NYXg6CSByZXR1cm4gIk1heCwiOwotICAgIH0KLQotICByZXR1cm4gIj8/PywiOwotfQotCi0jZW5kaWYgLyogREVCVUcgKi8KLQwKLSNpZmRlZiBFQ09GRl9ERUJVRwotCi0vKiBDb252ZXJ0IHN5bWJvbCB0eXBlIHRvIHN0cmluZy4gICovCi0KLXN0YXRpYyBjaGFyICoKLXN0X3RvX3N0cmluZyhzeW1ib2xfdHlwZSkKLSAgICAgc3RfdCBzeW1ib2xfdHlwZTsKLXsKLSAgc3dpdGNoKHN5bWJvbF90eXBlKQotICAgIHsKLSAgICBjYXNlIHN0X05pbDoJcmV0dXJuICJOaWwsIjsKLSAgICBjYXNlIHN0X0dsb2JhbDoJcmV0dXJuICJHbG9iYWwsIjsKLSAgICBjYXNlIHN0X1N0YXRpYzoJcmV0dXJuICJTdGF0aWMsIjsKLSAgICBjYXNlIHN0X1BhcmFtOglyZXR1cm4gIlBhcmFtLCI7Ci0gICAgY2FzZSBzdF9Mb2NhbDoJcmV0dXJuICJMb2NhbCwiOwotICAgIGNhc2Ugc3RfTGFiZWw6CXJldHVybiAiTGFiZWwsIjsKLSAgICBjYXNlIHN0X1Byb2M6CXJldHVybiAiUHJvYywiOwotICAgIGNhc2Ugc3RfQmxvY2s6CXJldHVybiAiQmxvY2ssIjsKLSAgICBjYXNlIHN0X0VuZDoJcmV0dXJuICJFbmQsIjsKLSAgICBjYXNlIHN0X01lbWJlcjoJcmV0dXJuICJNZW1iZXIsIjsKLSAgICBjYXNlIHN0X1R5cGVkZWY6CXJldHVybiAiVHlwZWRlZiwiOwotICAgIGNhc2Ugc3RfRmlsZToJcmV0dXJuICJGaWxlLCI7Ci0gICAgY2FzZSBzdF9SZWdSZWxvYzoJcmV0dXJuICJSZWdSZWxvYywiOwotICAgIGNhc2Ugc3RfRm9yd2FyZDoJcmV0dXJuICJGb3J3YXJkLCI7Ci0gICAgY2FzZSBzdF9TdGF0aWNQcm9jOglyZXR1cm4gIlN0YXRpY1Byb2MsIjsKLSAgICBjYXNlIHN0X0NvbnN0YW50OglyZXR1cm4gIkNvbnN0YW50LCI7Ci0gICAgY2FzZSBzdF9TdHI6CXJldHVybiAiU3RyaW5nLCI7Ci0gICAgY2FzZSBzdF9OdW1iZXI6CXJldHVybiAiTnVtYmVyLCI7Ci0gICAgY2FzZSBzdF9FeHByOglyZXR1cm4gIkV4cHIsIjsKLSAgICBjYXNlIHN0X1R5cGU6CXJldHVybiAiVHlwZSwiOwotICAgIGNhc2Ugc3RfTWF4OglyZXR1cm4gIk1heCwiOwotICAgIH0KLQotICByZXR1cm4gIj8/PywiOwotfQotCi0jZW5kaWYgLyogREVCVUcgKi8KLQwKLS8qIFBhcnNlIC5iZWdpbiBkaXJlY3RpdmVzIHdoaWNoIGhhdmUgYSBsYWJlbCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKLSAgIHdoaWNoIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2JlZ2luIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmJlZ2luIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5iZWdpbiBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X0Jsb2NrLCBzY19UZXh0LAotCQkJICAgc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSksCi0JCQkgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAvKiBUaGUgbGluZSBudW1iZXIgZm9sbG93cywgYnV0IHdlIGRvbid0IHVzZSBpdC4gICovCi0gICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5iZW5kIGRpcmVjdGl2ZXMgd2hpY2ggaGF2ZSBhIGxhYmVsIGFzIHRoZSBmaXJzdCBhcmd1bWVudAotICAgd2hpY2ggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGJsb2NrLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2JlbmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLSAgc3ltYm9sUyAqZW5kc3ltOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5iZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5iZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBUaGUgdmFsdWUgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIC5iZW5kIGRpcmVjdGl2ZSBhbmQgdGhlCi0gICAgIGNvcnJlc3BvbmRpbmcgc3ltYm9sLiAgV2UgZmlsbCBpbiB0aGUgb2Zmc2V0IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICAgIHRoZSBzeW1ib2wuICAqLwotICBlbmRzeW0gPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gIGlmIChlbmRzeW0gPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBhc193YXJuIChfKCIuYmVuZCBkaXJlY3RpdmUgbmFtZXMgdW5rbm93biBzeW1ib2wiKSk7Ci0gIGVsc2UKLSAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfRW5kLCBzY19UZXh0LCBlbmRzeW0sCi0JCQkgICAgIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIDAsIChzeW1pbnRfdCkgMCk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIC8qIFRoZSBsaW5lIG51bWJlciBmb2xsb3dzLCBidXQgd2UgZG9uJ3QgdXNlIGl0LiAgKi8KLSAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYXMgYSBzZXJpZXMgb2YgZGlyZWN0aXZlcwotICAgKC5kZWYsIC5zY2wsIGV0Yy4pLiAgV2UgYnVpbGQgdXAgaW5mb3JtYXRpb24gYXMgd2UgcmVhZCB0aGUKLSAgIGRpcmVjdGl2ZXMgaW4gdGhlIGZvbGxvd2luZyBzdGF0aWMgdmFyaWFibGVzLCBhbmQgZmlsZSBpdCBhd2F5IHdoZW4KLSAgIHdlIHJlYWNoIHRoZSAuZW5kZWYgZGlyZWN0aXZlLiAgKi8KLXN0YXRpYyBjaGFyICpjb2ZmX3N5bV9uYW1lOwotc3RhdGljIHR5cGVfaW5mb190IGNvZmZfdHlwZTsKLXN0YXRpYyBzY190IGNvZmZfc3RvcmFnZV9jbGFzczsKLXN0YXRpYyBzdF90IGNvZmZfc3ltYm9sX3R5cDsKLXN0YXRpYyBpbnQgY29mZl9pc19mdW5jdGlvbjsKLXN0YXRpYyBjaGFyICpjb2ZmX3RhZzsKLXN0YXRpYyB2YWx1ZVQgY29mZl92YWx1ZTsKLXN0YXRpYyBzeW1ib2xTICpjb2ZmX3N5bV92YWx1ZTsKLXN0YXRpYyBiZmRfdm1hIGNvZmZfc3ltX2FkZGVuZDsKLXN0YXRpYyBpbnQgY29mZl9pbnNpZGVfZW51bWVyYXRpb247Ci0KLS8qIEhhbmRsZSBhIC5kZWYgZGlyZWN0aXZlOiBzdGFydCBkZWZpbmluZyBhIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9kZWYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLQotICBlY29mZl9kZWJ1Z2dpbmdfc2VlbiA9IDE7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBhc193YXJuIChfKCIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgZWxzZSBpZiAoKm5hbWUgPT0gJ1wwJykKLSAgICBhc193YXJuIChfKCJFbXB0eSBzeW1ib2wgbmFtZSBpbiAuZGVmOyBpZ25vcmVkIikpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGNvZmZfc3ltX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLQlmcmVlIChjb2ZmX3N5bV9uYW1lKTsKLSAgICAgIGlmIChjb2ZmX3RhZyAhPSAoY2hhciAqKSBOVUxMKQotCWZyZWUgKGNvZmZfdGFnKTsKLSAgICAgIGNvZmZfc3ltX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgKHN0cmxlbiAobmFtZSkgKyAxKSk7Ci0gICAgICBzdHJjcHkgKGNvZmZfc3ltX25hbWUsIG5hbWUpOwotICAgICAgY29mZl90eXBlID0gdHlwZV9pbmZvX2luaXQ7Ci0gICAgICBjb2ZmX3N0b3JhZ2VfY2xhc3MgPSBzY19OaWw7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXAgPSBzdF9OaWw7Ci0gICAgICBjb2ZmX2lzX2Z1bmN0aW9uID0gMDsKLSAgICAgIGNvZmZfdGFnID0gKGNoYXIgKikgTlVMTDsKLSAgICAgIGNvZmZfdmFsdWUgPSAwOwotICAgICAgY29mZl9zeW1fdmFsdWUgPSAoc3ltYm9sUyAqKSBOVUxMOwotICAgICAgY29mZl9zeW1fYWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5kaW0gZGlyZWN0aXZlLCB1c2VkIHRvIGdpdmUgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkuICBUaGUKLSAgIGFyZ3VtZW50cyBhcmUgY29tbWEgc2VwYXJhdGVkIG51bWJlcnMuICBtaXBzLXRmaWxlIGFzc3VtZXMgdGhhdAotICAgdGhlcmUgd2lsbCBub3QgYmUgbW9yZSB0aGFuIDYgZGltZW5zaW9ucywgYW5kIGdkYiB3b24ndCByZWFkIGFueQotICAgbW9yZSB0aGFuIHRoYXQgYW55aG93LCBzbyBJIHdpbGwgYWxzbyBtYWtlIHRoYXQgYXNzdW1wdGlvbi4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9kaW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGRpbWVuc1tOX1RRXTsKLSAgaW50IGk7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgTl9UUTsgaSsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGRpbWVuc1tpXSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZWxzZQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicKLQkgICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICc7JykKLQkgICAgYXNfd2FybiAoXygiQmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaSA9PSBOX1RRKQotICAgIC0taTsKLQotICAvKiBUaGUgZGltZW5zaW9ucyBhcmUgc3RvcmVkIGF3YXkgaW4gcmV2ZXJzZSBvcmRlci4gICovCi0gIGZvciAoOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBpZiAoY29mZl90eXBlLm51bV9kaW1zID49IE5fVFEpCi0JewotCSAgYXNfd2FybiAoXygiVG9vIG1hbnkgLmRpbSBlbnRyaWVzIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgY29mZl90eXBlLmRpbWVuc2lvbnNbY29mZl90eXBlLm51bV9kaW1zXSA9IGRpbWVuc1tpXTsKLSAgICAgICsrY29mZl90eXBlLm51bV9kaW1zOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuc2NsIGRpcmVjdGl2ZSwgd2hpY2ggc2V0cyB0aGUgQ09GRiBzdG9yYWdlIGNsYXNzIG9mIHRoZQotICAgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGNvZmZfc3ltYm9sX3R5cCA9IG1hcF9jb2ZmX3N5bV90eXBlW3ZhbF07Ci0gIGNvZmZfc3RvcmFnZV9jbGFzcyA9IG1hcF9jb2ZmX3N0b3JhZ2VbdmFsXTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuc2l6ZSBkaXJlY3RpdmUuICBGb3Igc29tZSByZWFzb24gbWlwcy10ZmlsZS5jIHRoaW5rcyB0aGF0Ci0gICAuc2l6ZSBjYW4gaGF2ZSBtdWx0aXBsZSBhcmd1bWVudHMuICBXZSBodW1vciBpdCwgYWx0aG91Z2ggZ2NjIHdpbGwKLSAgIG5ldmVyIGdlbmVyYXRlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgc2l6ZXNbTl9UUV07Ci0gIGludCBpOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNpemUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBOX1RROyBpKyspCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc2l6ZXNbaV0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nCi0JICAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOycpCi0JICAgIGFzX3dhcm4gKF8oIkJhZGx5IGZvcm1lZCAuc2l6ZSBkaXJlY3RpdmUiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpID09IE5fVFEpCi0gICAgLS1pOwotCi0gIC8qIFRoZSBzaXplcyBhcmUgc3RvcmVkIGF3YXkgaW4gcmV2ZXJzZSBvcmRlci4gICovCi0gIGZvciAoOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBpZiAoY29mZl90eXBlLm51bV9zaXplcyA+PSBOX1RRKQotCXsKLQkgIGFzX3dhcm4gKF8oIlRvbyBtYW55IC5zaXplIGVudHJpZXMiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBjb2ZmX3R5cGUuc2l6ZXNbY29mZl90eXBlLm51bV9zaXplc10gPSBzaXplc1tpXTsKLSAgICAgICsrY29mZl90eXBlLm51bV9zaXplczsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudHlwZSBkaXJlY3RpdmUsIHdoaWNoIGdpdmVzIHRoZSBDT0ZGIHR5cGUgb2YgdGhlCi0gICBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLSAgdHFfdCAqdHFfcHRyOwotICB0cV90ICp0cV9zaGZ0OwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnR5cGUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGNvZmZfdHlwZS5vcmlnX3R5cGUgPSBCVFlQRSAodmFsKTsKLSAgY29mZl90eXBlLmJhc2ljX3R5cGUgPSBtYXBfY29mZl90eXBlc1tjb2ZmX3R5cGUub3JpZ190eXBlXTsKLQotICB0cV9wdHIgPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1tOX1RRXTsKLSAgd2hpbGUgKHZhbCAmfiBOX0JUTUFTSykKLSAgICB7Ci0gICAgICBpZiAodHFfcHRyID09ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzWzBdKQotCXsKLQkgIC8qIEZJWE1FOiBXZSBjb3VsZCBoYW5kbGUgdGhpcyBieSBzZXR0aW5nIHRoZSBjb250aW51ZWQgYml0LgotICAgICAgICAgICAgIFRoZXJlIHdvdWxkIHN0aWxsIGJlIGEgbGltaXQ6IHRoZSAudHlwZSBhcmd1bWVudCBjYW4gbm90Ci0gICAgICAgICAgICAgYmUgaW5maW5pdGUuICAqLwotCSAgYXNfd2FybiAoXygiVGhlIHR5cGUgb2YgJXMgaXMgdG9vIGNvbXBsZXg7IGl0IHdpbGwgYmUgc2ltcGxpZmllZCIpLAotCQkgICBjb2ZmX3N5bV9uYW1lKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChJU1BUUiAodmFsKSkKLQkqLS10cV9wdHIgPSB0cV9QdHI7Ci0gICAgICBlbHNlIGlmIChJU0ZDTiAodmFsKSkKLQkqLS10cV9wdHIgPSB0cV9Qcm9jOwotICAgICAgZWxzZSBpZiAoSVNBUlkgKHZhbCkpCi0JKi0tdHFfcHRyID0gdHFfQXJyYXk7Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIlVucmVjb2duaXplZCAudHlwZSBhcmd1bWVudCIpKTsKLQotICAgICAgdmFsID0gREVDUkVGICh2YWwpOwotICAgIH0KLQotICB0cV9zaGZ0ID0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbMF07Ci0gIHdoaWxlICh0cV9wdHIgIT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbTl9UUV0pCi0gICAgKnRxX3NoZnQrKyA9ICp0cV9wdHIrKzsKLQotICBpZiAodHFfc2hmdCAhPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1swXSAmJiB0cV9zaGZ0Wy0xXSA9PSB0cV9Qcm9jKQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgaWdub3JlIGl0LCBzbyB0aGF0IHdlIGRvbid0IGdldCB0d28KLQkgZW50cmllcyAob25lIGZyb20gdGhlIC5lbnQsIGFuZCBvbmUgZm9yIHRoZSAuZGVmIHRoYXQKLQkgcHJlY2VkZXMgaXQpLiAgU2F2ZSB0aGUgdHlwZSBpbmZvcm1hdGlvbiBzbyB0aGF0IHRoZSBlbmQKLQkgYmxvY2sgY2FuIHByb3Blcmx5IGFkZCBpdCBhZnRlciB0aGUgYmVnaW4gYmxvY2sgaW5kZXguICBGb3IKLQkgTUlQUyBrbm93cyB3aGF0IHJlYXNvbiwgd2UgbXVzdCBzdHJpcCBvZmYgdGhlIGZ1bmN0aW9uIHR5cGUKLQkgYXQgdGhpcyBwb2ludC4gICovCi0gICAgICBjb2ZmX2lzX2Z1bmN0aW9uID0gMTsKLSAgICAgIHRxX3NoZnRbLTFdID0gdHFfTmlsOwotICAgIH0KLQotICB3aGlsZSAodHFfc2hmdCAhPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1tOX1RRXSkKLSAgICAqdHFfc2hmdCsrID0gdHFfTmlsOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnRhZyBkaXJlY3RpdmUsIHdoaWNoIGdpdmVzIHRoZSBuYW1lIG9mIGEgc3RydWN0dXJlLAotICAgdW5pb24gb3IgZW51bS4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV90YWcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgY29mZl90YWcgPSAoY2hhciAqKSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgKHN0cmxlbiAobmFtZSkgKyAxKSk7Ci0gIHN0cmNweSAoY29mZl90YWcsIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC52YWwgZGlyZWN0aXZlLCB3aGljaCBnaXZlcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEl0Ci0gICBtYXkgYmUgdGhlIG5hbWUgb2YgYSBzdGF0aWMgb3IgZ2xvYmFsIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV92YWwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50ICYmIGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnZhbCBleHByZXNzaW9uIGlzIHRvbyBjb3BtbGV4IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgY29mZl92YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb2ZmX3N5bV92YWx1ZSA9IGV4cC5YX2FkZF9zeW1ib2w7Ci0gICAgICBjb2ZmX3N5bV9hZGRlbmQgPSBleHAuWF9hZGRfbnVtYmVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5lbmRlZiBkaXJlY3RpdmUsIHdoaWNoIHRlcm1pbmF0ZXMgcHJvY2Vzc2luZyBvZiBDT0ZGCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2VuZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN5bWludF90IGluZHg7Ci0gIGxvY2Fsc3ltX3QgKnN5bTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZGVmIHBzZXVkby1vcCB1c2VkIGJlZm9yZSAuZGVmOyBpZ25vcmVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gY29mZl9zeW1fbmFtZTsKLSAgY29mZl9zeW1fbmFtZSA9IChjaGFyICopIE5VTEw7Ci0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBhIHN0YXRpYyBvciBleHRlcm5hbCwgd2UgaGF2ZSBhbHJlYWR5IGdvdHRlbiB0aGUKLSAgICAgYXBwcm9wcmlhdGUgdHlwZSBhbmQgY2xhc3MsIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVycmlkZSB0aG9zZQotICAgICB2YWx1ZXMuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lIHR5cGUgYW5kIGNsYXNzZXMKLSAgICAgdGhhdCBhcmUgbm90IGluIENPRkYsIHN1Y2ggYXMgc2hvcnQgZGF0YSwgZXRjLiAgKi8KLSAgaWYgKGNvZmZfc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwID0gc3RfTmlsOwotICAgICAgY29mZl9zdG9yYWdlX2NsYXNzID0gc2NfTmlsOwotICAgIH0KLQotICBjb2ZmX3R5cGUuZXh0cmFfc2l6ZXMgPSBjb2ZmX3RhZyAhPSAoY2hhciAqKSBOVUxMOwotICBpZiAoY29mZl90eXBlLm51bV9kaW1zID4gMCkKLSAgICB7Ci0gICAgICBpbnQgZGlmZiA9IGNvZmZfdHlwZS5udW1fZGltcyAtIGNvZmZfdHlwZS5udW1fc2l6ZXM7Ci0gICAgICBpbnQgaSA9IGNvZmZfdHlwZS5udW1fZGltcyAtIDE7Ci0gICAgICBpbnQgajsKLQotICAgICAgaWYgKGNvZmZfdHlwZS5udW1fc2l6ZXMgIT0gMSB8fCBkaWZmIDwgMCkKLQl7Ci0JICBhc193YXJuIChfKCJCYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mbyIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gYXJyYXksIG1ha2Ugc3VyZSB0aGUgc2FtZSBudW1iZXIgb2YgZGltZW5zaW9ucwotCSBhbmQgc2l6ZXMgd2VyZSBwYXNzZWQsIGNyZWF0aW5nIGV4dHJhIHNpemVzIGZvciBtdWx0aXBseQotCSBkaW1lbnNpb25lZCBhcnJheXMgaWYgbm90IHBhc3NlZC4gICovCi0gICAgICBjb2ZmX3R5cGUuZXh0cmFfc2l6ZXMgPSAwOwotICAgICAgaWYgKGRpZmYpCi0JewotCSAgaiA9IChzaXplb2YgKGNvZmZfdHlwZS5zaXplcykgLyBzaXplb2YgKGNvZmZfdHlwZS5zaXplc1swXSkpIC0gMTsKLQkgIHdoaWxlIChqID49IDApCi0JICAgIHsKLQkgICAgICBjb2ZmX3R5cGUuc2l6ZXNbal0gPSAoKChqIC0gZGlmZikgPj0gMCkKLQkJCQkgICAgPyBjb2ZmX3R5cGUuc2l6ZXNbaiAtIGRpZmZdCi0JCQkJICAgIDogMCk7Ci0JICAgICAgai0tOwotCSAgICB9Ci0KLQkgIGNvZmZfdHlwZS5udW1fc2l6ZXMgPSBpICsgMTsKLQkgIGZvciAoaS0tOyBpID49IDA7IGktLSkKLQkgICAgY29mZl90eXBlLnNpemVzW2ldID0gKGNvZmZfdHlwZS5kaW1lbnNpb25zW2kgKyAxXSA9PSAwCi0JCQkJICA/IDAKLQkJCQkgIDogKGNvZmZfdHlwZS5zaXplc1tpICsgMV0KLQkJCQkgICAgIC8gY29mZl90eXBlLmRpbWVuc2lvbnNbaSArIDFdKSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoY29mZl9zeW1ib2xfdHlwID09IHN0X01lbWJlcgotCSAgICYmIGNvZmZfdHlwZS5udW1fc2l6ZXMgLSBjb2ZmX3R5cGUuZXh0cmFfc2l6ZXMgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBJcyB0aGlzIGEgYml0ZmllbGQ/ICBUaGlzIGlzIGluZGljYXRlZCBieSBhIHN0cnVjdHVyZSBtZW1lYmVyCi0JIGhhdmluZyBhIHNpemUgZmllbGQgdGhhdCBpc24ndCBhbiBhcnJheS4gICovCi0gICAgICBjb2ZmX3R5cGUuYml0ZmllbGQgPSAxOwotICAgIH0KLQotICAvKiBFeGNlcHQgZm9yIGVudW1lcmF0aW9uIG1lbWJlcnMgJiBiZWdpbi9lbmRpbmcgb2Ygc2NvcGVzLCBwdXQgdGhlCi0gICAgIHR5cGUgd29yZCBpbiB0aGUgYXV4LiBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoY29mZl9zeW1ib2xfdHlwID09IHN0X0Jsb2NrIHx8IGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9FbmQpCi0gICAgaW5keCA9IDA7Ci0gIGVsc2UgaWYgKGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uKQotICAgIGluZHggPSBjdXJfZmlsZV9wdHItPnZvaWRfdHlwZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9PSBidF9TdHJ1Y3QKLQkgIHx8IGNvZmZfdHlwZS5iYXNpY190eXBlID09IGJ0X1VuaW9uCi0JICB8fCBjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9PSBidF9FbnVtKQotCXsKLQkgIGlmIChjb2ZmX3RhZyA9PSAoY2hhciAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiTm8gdGFnIHNwZWNpZmllZCBmb3IgJXMiKSwgbmFtZSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGNvZmZfdHlwZS50YWdfcHRyID0gZ2V0X3RhZyAoY29mZl90YWcsIChsb2NhbHN5bV90ICopIE5VTEwsCi0JCQkJICAgICAgIGNvZmZfdHlwZS5iYXNpY190eXBlKTsKLQl9Ci0KLSAgICAgIGlmIChjb2ZmX2lzX2Z1bmN0aW9uKQotCXsKLQkgIGxhc3RfZnVuY190eXBlX2luZm8gPSBjb2ZmX3R5cGU7Ci0JICBsYXN0X2Z1bmNfc3ltX3ZhbHVlID0gY29mZl9zeW1fdmFsdWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpbmR4ID0gYWRkX2F1eF9zeW1fdGlyICgmY29mZl90eXBlLAotCQkJICAgICAgaGFzaF95ZXMsCi0JCQkgICAgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKLSAgICB9Ci0KLSAgLyogRG8gYW55IGxhc3QgbWludXRlIGFkanVzdG1lbnRzIHRoYXQgYXJlIG5lY2Vzc2FyeS4gICovCi0gIHN3aXRjaCAoY29mZl9zeW1ib2xfdHlwKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEZvciB0aGUgYmVnaW5uaW5nIG9mIHN0cnVjdHMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucywgdGhlCi0JIHNpemUgaW5mbyBuZWVkcyB0byBiZSBwYXNzZWQgaW4gdGhlIHZhbHVlIGZpZWxkLiAgKi8KLSAgICBjYXNlIHN0X0Jsb2NrOgotICAgICAgaWYgKGNvZmZfdHlwZS5udW1fc2l6ZXMgLSBjb2ZmX3R5cGUubnVtX2RpbXMgLSBjb2ZmX3R5cGUuZXh0cmFfc2l6ZXMKLQkgICE9IDEpCi0JewotCSAgYXNfd2FybiAoXygiQmFkIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQljb2ZmX3ZhbHVlID0gY29mZl90eXBlLnNpemVzWzBdOwotCi0gICAgICBjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbiA9IChjb2ZmX3R5cGUub3JpZ190eXBlID09IFRfRU5VTSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogRm9yIHRoZSBlbmQgb2Ygc3RydWN0cywgdW5pb25zLCBhbmQgZW51bWVyYXRpb25zLCBvbWl0IHRoZQotCSBuYW1lIHdoaWNoIGlzIGFsd2F5cyAiLmVvcyIuICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgbGFzdCwgc28KLQkgdGhhdCBhbnkgZXJyb3IgcmVwb3J0aW5nIGFib3ZlIGdpdmVzIHRoZSBjb3JyZWN0IG5hbWUuICAqLwotICAgIGNhc2Ugc3RfRW5kOgotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgICBuYW1lID0gKGNoYXIgKikgTlVMTDsKLSAgICAgIGNvZmZfdmFsdWUgPSAwOwotICAgICAgY29mZl9pbnNpZGVfZW51bWVyYXRpb24gPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE1lbWJlcnMgb2Ygc3RydWN0dXJlcyBhbmQgdW5pb25zIHRoYXQgYXJlbid0IGJpdGZpZWxkcywgbmVlZAotCSB0byBhZGp1c3QgdGhlIHZhbHVlIGZyb20gYSBieXRlIG9mZnNldCB0byBhIGJpdCBvZmZzZXQuCi0JIE1lbWJlcnMgb2YgZW51bWVyYXRpb25zIGRvIG5vdCBoYXZlIHRoZSB2YWx1ZSBhZGp1c3RlZCwgYW5kCi0JIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGJ5IGluZHggPT0gaW5kZXhOaWwuICBGb3IgZW51bWVyYXRpb25zLAotCSB1cGRhdGUgdGhlIG1heGltdW0gZW51bWVyYXRpb24gdmFsdWUuICAqLwotICAgIGNhc2Ugc3RfTWVtYmVyOgotICAgICAgaWYgKCEgY29mZl90eXBlLmJpdGZpZWxkICYmICEgY29mZl9pbnNpZGVfZW51bWVyYXRpb24pCi0JY29mZl92YWx1ZSAqPSA4OwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSBzeW1ib2wuICAqLwotICBzeW0gPSBhZGRfZWNvZmZfc3ltYm9sIChuYW1lLAotCQkJICBjb2ZmX3N5bWJvbF90eXAsCi0JCQkgIGNvZmZfc3RvcmFnZV9jbGFzcywKLQkJCSAgY29mZl9zeW1fdmFsdWUsCi0JCQkgIGNvZmZfc3ltX2FkZGVuZCwKLQkJCSAgKHN5bWludF90KSBjb2ZmX3ZhbHVlLAotCQkJICBpbmR4KTsKLQotICAvKiBkZWFsIHdpdGggc3RydWN0LCB1bmlvbiwgYW5kIGVudW0gdGFncy4gICovCi0gIGlmIChjb2ZmX3N5bWJvbF90eXAgPT0gc3RfQmxvY2spCi0gICAgewotICAgICAgLyogQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgdGFnIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHRhZ190ICp0YWdfcHRyID0gZ2V0X3RhZyAobmFtZSwKLQkJCQlzeW0sCi0JCQkJY29mZl90eXBlLmJhc2ljX3R5cGUpOwotICAgICAgZm9yd2FyZF90ICoqcGY7Ci0KLSAgICAgIC8qIFJlbWVtYmVyIGFueSBmb3J3YXJkIHJlZmVyZW5jZXMuICAqLwotICAgICAgZm9yIChwZiA9ICZzeW0tPmZvcndhcmRfcmVmOwotCSAgICpwZiAhPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0JICAgcGYgPSAmKCpwZiktPm5leHQpCi0JOwotICAgICAgKnBmID0gdGFnX3B0ci0+Zm9yd2FyZF9yZWY7Ci0gICAgICB0YWdfcHRyLT5mb3J3YXJkX3JlZiA9IChmb3J3YXJkX3QgKikgTlVMTDsKLSAgICB9Ci19Ci0MCi0vKiBQYXJzZSAuZW5kIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIHJlZ2lzdGVyIGludCBjaDsKLSAgc3ltYm9sUyAqZW50OwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgY2ggPSAqbmFtZTsKLSAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoY2gpKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSAuZW5kIGRpcmVjdGl2ZSBhbmQgdGhlCi0gICAgIGNvcnJlc3BvbmRpbmcgc3ltYm9sLiAgV2UgY3JlYXRlIGEgZmFrZSBzeW1ib2wgdG8gaG9sZCB0aGUKLSAgICAgY3VycmVudCBsb2NhdGlvbiwgYW5kIHB1dCBpbiB0aGUgb2Zmc2V0IHdoZW4gd2Ugd3JpdGUgb3V0IHRoZQotICAgICBzeW1ib2wuICAqLwotICBlbnQgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gIGlmIChlbnQgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSBuYW1lcyB1bmtub3duIHN5bWJvbCIpKTsKLSAgZWxzZQotICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9FbmQsIHNjX1RleHQsCi0JCQkgICAgIHN5bWJvbF9uZXcgKCJMMFwwMDEiLCBub3dfc2VnLAotCQkJCQkgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgZnJhZ19ub3cpLAotCQkJICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOwotCi0gIGN1cl9wcm9jX3B0ciA9IChwcm9jX3QgKikgTlVMTDsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuZW50IGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIHJlZ2lzdGVyIGludCBjaDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhZGRfZmlsZSAoKGNvbnN0IGNoYXIgKikgTlVMTCwgMCwgMSk7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygic2Vjb25kIC5lbnQgZGlyZWN0aXZlIGZvdW5kIGJlZm9yZSAuZW5kIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgY2ggPSAqbmFtZTsKLSAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoY2gpKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYWRkX3Byb2NlZHVyZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIC8qIFRoZSAuZW50IGRpcmVjdGl2ZSBpcyBzb21ldGltZXMgZm9sbG93ZWQgYnkgYSBudW1iZXIuICBJJ20gbm90Ci0gICAgIHJlYWxseSBzdXJlIHdoYXQgdGhlIG51bWJlciBtZWFucy4gIEkgZG9uJ3Qgc2VlIGFueSB3YXkgdG8gc3RvcmUKLSAgICAgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBQRFIuICBUaGUgSXJpeCA0IGFzc2VtYmxlciBzZWVtcyB0byBpZ25vcmUKLSAgICAgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLSAgICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5leHRlcm4gZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbHA7Ci0gIHZhbHVlVCBzaXplOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9scCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9scCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICBzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgc3ltYm9sX2dldF9vYmogKHN5bWJvbHApLT5lY29mZl9leHRlcm5fc2l6ZSA9IHNpemU7Ci19Ci0MCi0vKiBQYXJzZSAuZmlsZSBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2ZpbGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGluZHg7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBsZW47Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTm8gd2F5IHRvIGhhbmRsZSAuZmlsZSB3aXRoaW4gLmVudC8uZW5kIHNlY3Rpb24iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbmR4ID0gKGludCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgLyogRklYTUU6IHdlIGRvbid0IGhhdmUgdG8gc2F2ZSB0aGUgbmFtZSBoZXJlLiAgKi8KLSAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICBhZGRfZmlsZSAobmFtZSwgaW5keCAtIDEsIDApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuZm1hc2sgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mbWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmZyZWdtYXNrID0gdmFsOwotICBjdXJfcHJvY19wdHItPnBkci5mcmVnb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5mcmFtZSBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2ZyYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5mcmFtZSBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5mcmFtZXJlZyA9IHRjX2dldF9yZWdpc3RlciAoMSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJwotICAgICAgfHwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZyYW1lIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZnJhbWVvZmZzZXQgPSB2YWw7Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIucGNyZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOwotCi0jaWYgMCAvKiBBbHBoYS1PU0YxIGFkZHMgInRoZSBvZmZzZXQgb2Ygc2F2ZWQgJGEwIGZyb20gJHNwIiwgYWNjb3JkaW5nCi0JIHRvIFNhbmRyby4gIEkgZG9uJ3QgeWV0IGtub3cgd2hlcmUgdGhpcyB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkLCBpZgotCSBhbnl3aGVyZS4gICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0jZWxzZQotICBzX2lnbm9yZSAoNDIpOwotI2VuZGlmCi19Ci0MCi0vKiBQYXJzZSAubWFzayBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX21hc2sgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIucmVnbWFzayA9IHZhbDsKLSAgY3VyX3Byb2NfcHRyLT5wZHIucmVnb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5sb2MgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9sb2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbGluZW5vX2xpc3RfdCAqbGlzdDsKLSAgc3ltaW50X3QgbGluZW5vOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2MgYmVmb3JlIC5maWxlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2Mgb3V0c2lkZSBvZiAudGV4dCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGxpbmVubyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ19zb3VyY2VfbGluZSAobGluZW5vKTsKLSNlbmRpZgotCi0gIC8qIElmIHdlJ3JlIGJ1aWxkaW5nIHN0YWJzLCB0aGVuIG91dHB1dCBhIHNwZWNpYWwgbGFiZWwgcmF0aGVyIHRoYW4KLSAgICAgRUNPRkYgbGluZSBudW1iZXIgaW5mby4gICovCi0gIGlmIChzdGFic19zZWVuKQotICAgIHsKLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY2hhciAqKSBOVUxMLCBzdF9MYWJlbCwgc2NfVGV4dCwKLQkJCSAgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkJICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgICBmcmFnX25vdyksCi0JCQkgICAgICAgKGJmZF92bWEpIDAsIDAsIGxpbmVubyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxpc3QgPSBhbGxvY2F0ZV9saW5lbm9fbGlzdCAoKTsKLQotICBsaXN0LT5uZXh0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgbGlzdC0+ZmlsZSA9IGN1cl9maWxlX3B0cjsKLSAgbGlzdC0+cHJvYyA9IGN1cl9wcm9jX3B0cjsKLSAgbGlzdC0+ZnJhZyA9IGZyYWdfbm93OwotICBsaXN0LT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgbGlzdC0+bGluZW5vID0gbGluZW5vOwotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcnMuICAqLwotICBjdXJfZmlsZV9wdHItPmZkci5mTWVyZ2UgPSAwOwotCi0gIC8qIEEgLmxvYyBkaXJlY3RpdmUgd2lsbCBzb21ldGltZXMgYXBwZWFyIGJlZm9yZSBhIC5lbnQgZGlyZWN0aXZlLAotICAgICB3aGljaCBtZWFucyB0aGF0IGN1cl9wcm9jX3B0ciB3aWxsIGJlIE5VTEwgaGVyZS4gIEFycmFuZ2UgdG8KLSAgICAgcGF0Y2ggdGhpcyB1cC4gICovCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVub19saXN0X3QgKipwbDsKLQotICAgICAgcGwgPSAmbm9wcm9jX2xpbmVubzsKLSAgICAgIHdoaWxlICgqcGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLQlwbCA9ICYoKnBsKS0+bmV4dDsKLSAgICAgICpwbCA9IGxpc3Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGFzdF9saW5lbm8gPSBsaXN0OwotICAgICAgKmxhc3RfbGluZW5vX3B0ciA9IGxpc3Q7Ci0gICAgICBsYXN0X2xpbmVub19wdHIgPSAmbGlzdC0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIFRoZSBNSVBTIGFzc2VtYmxlciBzb21ldGltZXMgaW5zZXJ0cyBub3AgaW5zdHJ1Y3Rpb25zIGluIHRoZQotICAgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgV2hlbiB0aGlzIGhhcHBlbnMsIHdlIG11c3QgcGF0Y2ggdXAgdGhlIC5sb2MKLSAgIGluZm9ybWF0aW9uIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgbm9wLiAgKi8KLQotdm9pZAotZWNvZmZfZml4X2xvYyAob2xkX2ZyYWcsIG9sZF9mcmFnX29mZnNldCkKLSAgICAgZnJhZ1MgKm9sZF9mcmFnOwotICAgICB1bnNpZ25lZCBsb25nIG9sZF9mcmFnX29mZnNldDsKLXsKLSAgaWYgKGxhc3RfbGluZW5vICE9IE5VTEwKLSAgICAgICYmIGxhc3RfbGluZW5vLT5mcmFnID09IG9sZF9mcmFnCi0gICAgICAmJiBsYXN0X2xpbmVuby0+cGFkZHIgPT0gb2xkX2ZyYWdfb2Zmc2V0KQotICAgIHsKLSAgICAgIGxhc3RfbGluZW5vLT5mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBsYXN0X2xpbmVuby0+cGFkZHIgPSBmcmFnX25vd19maXggKCk7Ci0gICAgfQotfQotDAotLyogTWFrZSBzdXJlIHRoZSBAc3RhYnMgc3ltYm9sIGlzIGVtaXR0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbWFya19zdGFicyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoISBzdGFic19zZWVuKQotICAgIHsKLSAgICAgIC8qIEFkZCBhIGR1bW15IEBzdGFicyBkeW1ib2wuICovCi0gICAgICBzdGFic19zZWVuID0gMTsKLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChzdGFic19zeW1ib2wsIHN0TmlsLCBzY0luZm8sCi0JCQkgICAgICAgKHN5bWJvbFMgKikgTlVMTCwKLQkJCSAgICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAtMSwKLQkJCSAgICAgICBFQ09GRl9NQVJLX1NUQUIgKDApKTsKLSAgICB9Ci19Ci0MCi0vKiBQYXJzZSAud2Vha2V4dCBkaXJlY3RpdmVzLiAgKi8KLSNpZm5kZWYgVENfTUlQUwotLyogRm9yIFRDX01JUFMgdXNlIHRoZSB2ZXJzaW9uIGluIHRjLW1pcHMuYy4gKi8KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JewotCSAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCQkgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICBleHByZXNzaW9uICgmZXhwKTsKLQkgIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYmFkIC53ZWFrZXh0IGRpcmVjdGl2ZSIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsICZleHApOwotCX0KLSAgICB9Ci0KLSAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLSNlbmRpZiAvKiBub3QgVENfTUlQUyAqLwotDAotLyogSGFuZGxlIC5zdGFicyBkaXJlY3RpdmVzLiAgVGhlIGFjdHVhbCBwYXJzaW5nIHJvdXRpbmUgaXMgZG9uZSBieSBhCi0gICBnZW5lcmljIHJvdXRpbmUuICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHZpYSBPQkpfUFJPQ0VTU19TVEFCLgotICAgV2hlbiB0aGlzIGlzIGNhbGxlZCwgaW5wdXRfbGluZV9wb2ludGVyIHdpbGwgYmUgcG9pbnRpbmcgYXQgdGhlCi0gICB2YWx1ZSBmaWVsZCBvZiB0aGUgc3RhYi4KLQotICAgLnN0YWJzIGRpcmVjdGl2ZXMgaGF2ZSBmaXZlIGZpZWxkczoKLQkic3RyaW5nIglhIHN0cmluZywgZW5jb2RpbmcgdGhlIHR5cGUgaW5mb3JtYXRpb24uCi0JY29kZQkJYSBudW1lcmljIGNvZGUsIGRlZmluZWQgaW4gPHN0YWIuaD4KLQkwCQlhIHplcm8KLQlkZXNjCQlhIHplcm8gb3IgbGluZSBudW1iZXIKLQl2YWx1ZQkJYSBudW1lcmljIHZhbHVlIG9yIGFuIGFkZHJlc3MuCi0KLSAgICBJZiB0aGUgdmFsdWUgaXMgcmVsb2NhdGFibGUsIHdlIHRyYW5zZm9ybSB0aGlzIGludG86Ci0JaXNzCQlwb2ludHMgYXMgYW4gaW5kZXggaW50byBzdHJpbmcgc3BhY2UKLQl2YWx1ZQkJdmFsdWUgZnJvbSBsb29rdXAgb2YgdGhlIG5hbWUKLQlzdAkJc3QgZnJvbSBsb29rdXAgb2YgdGhlIG5hbWUKLQlzYwkJc2MgZnJvbSBsb29rdXAgb2YgdGhlIG5hbWUKLQlpbmRleAkJY29kZXxDT0RFX01BU0sKLQotICAgIElmIHRoZSB2YWx1ZSBpcyBub3QgcmVsb2NhdGFibGUsIHdlIHRyYW5zZm9ybSB0aGlzIGludG86Ci0JaXNzCQlwb2ludHMgYXMgYW4gaW5kZXggaW50byBzdHJpbmcgc3BhY2UKLQl2YWx1ZQkJdmFsdWUKLQlzdAkJc3RfTmlsCi0Jc2MJCXNjX05pbAotCWluZGV4CQljb2RlfENPREVfTUFTSwotCi0gICAgLnN0YWJuIGRpcmVjdGl2ZXMgaGF2ZSBmb3VyIGZpZWxkcyAoc3RyaW5nIGlzIG51bGwpOgotCWNvZGUJCWEgbnVtZXJpYyBjb2RlLCBkZWZpbmVkIGluIDxzdGFiLmg+Ci0JMAkJYSB6ZXJvCi0JZGVzYwkJYSB6ZXJvIG9yIGEgbGluZSBudW1iZXIKLQl2YWx1ZQkJYSBudW1lcmljIHZhbHVlIG9yIGFuIGFkZHJlc3MuICAqLwotCi12b2lkCi1lY29mZl9zdGFiIChzZWMsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpCi0gICAgIHNlZ1Qgc2VjOwotICAgICBpbnQgd2hhdDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IG90aGVyOwotICAgICBpbnQgZGVzYzsKLXsKLSAgZWZkcl90ICpzYXZlX2ZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICBzeW1ib2xTICpzeW07Ci0gIHN5bWludF90IHZhbHVlOwotICBiZmRfdm1hIGFkZGVuZDsKLSAgc3RfdCBzdDsKLSAgc2NfdCBzYzsKLSAgc3ltaW50X3QgaW5keDsKLSAgbG9jYWxzeW1fdCAqaG9sZCA9IE5VTEw7Ci0KLSAgZWNvZmZfZGVidWdnaW5nX3NlZW4gPSAxOwotCi0gIC8qIFdlIGRvbid0IGhhbmRsZSAuc3RhYmQuICAqLwotICBpZiAod2hhdCAhPSAncycgJiYgd2hhdCAhPSAnbicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuc3RhYiVjIGlzIG5vdCBzdXBwb3J0ZWQiKSwgd2hhdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEEgLnN0YWJuIHVzZXMgYSBudWxsIG5hbWUsIG5vdCBhbiBlbXB0eSBzdHJpbmcuICAqLwotICBpZiAod2hhdCA9PSAnbicpCi0gICAgc3RyaW5nID0gTlVMTDsKLQotICAvKiBXZSBpZ25vcmUgdGhlIG90aGVyIGZpZWxkLiAgKi8KLSAgaWYgKG90aGVyICE9IDApCi0gICAgYXNfd2FybiAoXygiLnN0YWIlYzogaWdub3Jpbmcgbm9uLXplcm8gb3RoZXIgZmllbGQiKSwgd2hhdCk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBjdXJyZW50IGZpbGUuICAqLwotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhZGRfZmlsZSAoKGNvbnN0IGNoYXIgKikgTlVMTCwgMCwgMSk7Ci0gICAgICBzYXZlX2ZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICAgIH0KLQotICAvKiBGb3Igc3RhYnMgaW4gRUNPRkYsIHRoZSBmaXJzdCBzeW1ib2wgbXVzdCBiZSBAc3RhYnMuICBUaGlzIGlzIGEKLSAgICAgc2lnbmFsIHRvIGdkYi4gICovCi0gIGlmIChzdGFic19zZWVuID09IDApCi0gICAgbWFya19zdGFicyAoMCk7Ci0KLSAgLyogTGluZSBudW1iZXIgc3RhYnMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHNpbmNlIHRoZXkgaGF2ZSB0d28KLSAgICAgdmFsdWVzLCB0aGUgbGluZSBudW1iZXIgYW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBsYWJlbC4gIFdlIHVzZSB0aGUKLSAgICAgaW5kZXggZmllbGQgKGFrYSBkZXNjKSB0byBob2xkIHRoZSBsaW5lIG51bWJlciwgYW5kIHRoZSB2YWx1ZQotICAgICBmaWVsZCB0byBob2xkIHRoZSBhZGRyZXNzLiAgVGhlIHN5bWJvbCB0eXBlIGlzIHN0X0xhYmVsLCB3aGljaAotICAgICBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIHN0YWJzLCBzbyB0aGF0IGdkYiBjYW4KLSAgICAgcmVjb2duaXplIGl0LiAgKi8KLSAgaWYgKHR5cGUgPT0gTl9TTElORSkKLSAgICB7Ci0gICAgICBTWU1SIGR1bW15X3N5bXI7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgY2hhciBuYW1lX2VuZDsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gICAgICBpZiAobGlzdGluZykKLQlsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBkZXNjKTsKLSNlbmRpZgotCi0gICAgICBkdW1teV9zeW1yLmluZGV4ID0gZGVzYzsKLSAgICAgIGlmIChkdW1teV9zeW1yLmluZGV4ICE9IGRlc2MpCi0JewotCSAgYXNfd2FybiAoXygiTGluZSBudW1iZXIgKCVkKSBmb3IgLnN0YWIlYyBkaXJlY3RpdmUgY2Fubm90IGZpdCBpbiBpbmRleCBmaWVsZCAoMjAgYml0cykiKSwKLQkJICAgZGVzYywgd2hhdCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICBzdCA9IHN0X0xhYmVsOwotICAgICAgc2MgPSBzY19UZXh0OwotICAgICAgaW5keCA9IGRlc2M7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmbmRlZiBOT19MSVNUSU5HCi0gICAgICBpZiAobGlzdGluZyAmJiAodHlwZSA9PSBOX1NPIHx8IHR5cGUgPT0gTl9TT0wpKQotCWxpc3Rpbmdfc291cmNlX2ZpbGUgKHN0cmluZyk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKQotCSAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScKLQkgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJysnKQotCXsKLQkgIHN0ID0gc3RfTmlsOwotCSAgc2MgPSBzY19OaWw7Ci0JICBzeW0gPSAoc3ltYm9sUyAqKSBOVUxMOwotCSAgdmFsdWUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgYXNfd2FybiAoXygiSWxsZWdhbCAuc3RhYiVjIGRpcmVjdGl2ZSwgYmFkIGNoYXJhY3RlciIpLCB3aGF0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcmVzc2lvblMgZXhwOwotCi0JICBzYyA9IHNjX05pbDsKLQkgIHN0ID0gc3RfTmlsOwotCi0JICBleHByZXNzaW9uICgmZXhwKTsKLQkgIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgc3ltID0gTlVMTDsKLQkgICAgICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wpCi0JICAgIHsKLQkgICAgICBzeW0gPSBleHAuWF9hZGRfc3ltYm9sOwotCSAgICAgIHZhbHVlID0gMDsKLQkgICAgICBhZGRlbmQgPSBleHAuWF9hZGRfbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmZXhwKTsKLQkgICAgICB2YWx1ZSA9IDA7Ci0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaW5keCA9IEVDT0ZGX01BUktfU1RBQiAodHlwZSk7Ci0gICAgfQotCi0gIC8qIERvbid0IHN0b3JlIHRoZSBzdGFicyBzeW1ib2wgd2UgYXJlIGNyZWF0aW5nIGFzIHRoZSB0eXBlIG9mIHRoZQotICAgICBFQ09GRiBzeW1ib2wuICBXZSB3YW50IHRvIGNvbXB1dGUgdGhlIHR5cGUgb2YgdGhlIEVDT0ZGIHN5bWJvbAotICAgICBpbmRlcGVuZGVudGx5LiAgKi8KLSAgaWYgKHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIGhvbGQgPSBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sOwotCi0gICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChzdHJpbmcsIHN0LCBzYywgc3ltLCBhZGRlbmQsIHZhbHVlLCBpbmR4KTsKLQotICBpZiAoc3ltICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbCA9IGhvbGQ7Ci0KLSAgLyogUmVzdG9yZSBub3JtYWwgZmlsZSB0eXBlLiAgKi8KLSAgY3VyX2ZpbGVfcHRyID0gc2F2ZV9maWxlX3B0cjsKLX0KLQwKLS8qIEZyb2IgYW4gRUNPRkYgc3ltYm9sLiAgU21hbGwgY29tbW9uIHN5bWJvbHMgZ28gaW50byBhIHNwZWNpYWwKLSAgIC5zY29tbW9uIHNlY3Rpb24gcmF0aGVyIHRoYW4gYmZkX2NvbV9zZWN0aW9uLiAgKi8KLQotdm9pZAotZWNvZmZfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAoU19JU19DT01NT04gKHN5bSkKLSAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pID4gMAotICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPD0gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKQotICAgIHsKLSAgICAgIHN0YXRpYyBhc2VjdGlvbiBzY29tX3NlY3Rpb247Ci0gICAgICBzdGF0aWMgYXN5bWJvbCBzY29tX3N5bWJvbDsKLQotICAgICAgLyogV2UgbXVzdCBjb25zdHJ1Y3QgYSBmYWtlIHNlY3Rpb24gc2ltaWxhciB0byBiZmRfY29tX3NlY3Rpb24KLQkgYnV0IHdpdGggdGhlIG5hbWUgLnNjb21tb24uICAqLwotICAgICAgaWYgKHNjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgc2NvbV9zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uOwotCSAgc2NvbV9zZWN0aW9uLm5hbWUgPSAiLnNjb21tb24iOwotCSAgc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJnNjb21fc2VjdGlvbjsKLQkgIHNjb21fc2VjdGlvbi5zeW1ib2wgPSAmc2NvbV9zeW1ib2w7Ci0JICBzY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmc2NvbV9zZWN0aW9uLnN5bWJvbDsKLQkgIHNjb21fc3ltYm9sID0gKmJmZF9jb21fc2VjdGlvbi5zeW1ib2w7Ci0JICBzY29tX3N5bWJvbC5uYW1lID0gIi5zY29tbW9uIjsKLQkgIHNjb21fc3ltYm9sLnNlY3Rpb24gPSAmc2NvbV9zZWN0aW9uOwotCX0KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgJnNjb21fc2VjdGlvbik7Ci0gICAgfQotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoU19JU19XRUFLIChzeW0pKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0NPTU1PTiAoc3ltKSkKLQlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKLQkJU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgfQotfQotDAotLyogQWRkIGJ5dGVzIHRvIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBidWZmZXIuICAqLwotCi1zdGF0aWMgY2hhciAqCi1lY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBidWZwdHIsIG5lZWQpCi0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIGNoYXIgKmJ1ZnB0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBuZWVkOwotewotICB1bnNpZ25lZCBsb25nIGF0OwotICB1bnNpZ25lZCBsb25nIHdhbnQ7Ci0KLSAgYXQgPSBidWZwdHIgLSAqYnVmOwotICBuZWVkIC09ICpidWZlbmQgLSBidWZwdHI7Ci0gIGlmIChuZWVkIDwgUEFHRV9TSVpFKQotICAgIG5lZWQgPSBQQUdFX1NJWkU7Ci0gIHdhbnQgPSAoKmJ1ZmVuZCAtICpidWYpICsgbmVlZDsKLSAgKmJ1ZiA9IHhyZWFsbG9jICgqYnVmLCB3YW50KTsKLSAgKmJ1ZmVuZCA9ICpidWYgKyB3YW50OwotICByZXR1cm4gKmJ1ZiArIGF0OwotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGJ1ZmZlciB0byB0aGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gICBmb3IgdGhlIEVDT0ZGIHRhcmdldCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfcGFkZGluZ19hZGp1c3QgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQsIGJ1ZnB0cnB0cikKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICBjaGFyICoqYnVmcHRycHRyOwotewotICBiZmRfc2l6ZV90eXBlIGFsaWduOwotCi0gIGFsaWduID0gYmFja2VuZC0+ZGVidWdfYWxpZ247Ci0gIGlmICgob2Zmc2V0ICYgKGFsaWduIC0gMSkpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0KLSAgICAgIGFkZCA9IGFsaWduIC0gKG9mZnNldCAmIChhbGlnbiAtIDEpKTsKLSAgICAgIGlmICgqYnVmZW5kIC0gKCpidWYgKyBvZmZzZXQpIDwgYWRkKQotCSh2b2lkKSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCAqYnVmICsgb2Zmc2V0LCBhZGQpOwotICAgICAgbWVtc2V0ICgqYnVmICsgb2Zmc2V0LCAwLCBhZGQpOwotICAgICAgb2Zmc2V0ICs9IGFkZDsKLSAgICAgIGlmIChidWZwdHJwdHIgIT0gKGNoYXIgKiopIE5VTEwpCi0JKmJ1ZnB0cnB0ciA9ICpidWYgKyBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQ7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9saW5lbm8gKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQsIGxpbmVjbnRwdHIpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgbG9uZyAqbGluZWNudHB0cjsKLXsKLSAgY2hhciAqYnVmcHRyOwotICByZWdpc3RlciBsaW5lbm9fbGlzdF90ICpsOwotICBsaW5lbm9fbGlzdF90ICpsYXN0OwotICBlZmRyX3QgKmZpbGU7Ci0gIHByb2NfdCAqcHJvYzsKLSAgdW5zaWduZWQgbG9uZyBjOwotICBsb25nIGlsaW5lOwotICBsb25nIHRvdGNvdW50OwotICBsaW5lbm9fbGlzdF90IGZpcnN0OwotICBsaW5lbm9fbGlzdF90ICpsb2NhbF9maXJzdF9saW5lbm8gPSBmaXJzdF9saW5lbm87Ci0KLSAgaWYgKGxpbmVjbnRwdHIgIT0gKGxvbmcgKikgTlVMTCkKLSAgICAqbGluZWNudHB0ciA9IDA7Ci0KLSAgYnVmcHRyID0gKmJ1ZiArIG9mZnNldDsKLQotICBmaWxlID0gKGVmZHJfdCAqKSBOVUxMOwotICBwcm9jID0gKHByb2NfdCAqKSBOVUxMOwotICBsYXN0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgYyA9IG9mZnNldDsKLSAgaWxpbmUgPSAwOwotICB0b3Rjb3VudCA9IDA7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwcm9jZWR1cmUgaXMgaWdub3JlZAotICAgICB3aGVuIHJlYWRpbmcgbGluZSBudW1iZXJzLiAgVGhpcyBkb2Vzbid0IG1hdHRlciBpZiB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgZmlyc3QgcHJvY2VkdXJlIGlzIDAsIGJ1dCB3aGVuIGdjYyBpcyBnZW5lcmF0aW5nIE1JUFMKLSAgICAgZW1iZWRkZWQgUElDIGNvZGUsIGl0IHdpbGwgcHV0IHN0cmluZ3MgaW4gdGhlIC50ZXh0IHNlY3Rpb24KLSAgICAgYmVmb3JlIHRoZSBmaXJzdCBwcm9jZWR1cmUuICBXZSBjb3BlIGJ5IGluc2VydGluZyBhIGR1bW15IGxpbmUgaWYKLSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByb2NlZHVyZSBpcyBub3QgMC4gIEhvcGVmdWxseSB0aGlzCi0gICAgIHdvbid0IHNjcmV3IHRoaW5ncyB1cCB0b28gYmFkbHkuICAKLQotICAgICBEb24ndCBkbyB0aGlzIGZvciBFQ09GRiBhc3NlbWJseSBzb3VyY2UgbGluZSBudW1iZXJzLiAgVGhleSB3b3JrCi0gICAgIHdpdGhvdXQgdGhpcyBleHRyYSBhdHRlbnRpb24uICAqLwotICBpZiAoZGVidWdfdHlwZSAhPSBERUJVR19FQ09GRgotICAgICAgJiYgZmlyc3RfcHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMCi0gICAgICAmJiBsb2NhbF9maXJzdF9saW5lbm8gIT0gKGxpbmVub19saXN0X3QgKikgTlVMTAotICAgICAgJiYgKChTX0dFVF9WQUxVRSAoZmlyc3RfcHJvY19wdHItPnN5bS0+YXNfc3ltKQotCSAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LAotCQkJCSAgU19HRVRfU0VHTUVOVCAoZmlyc3RfcHJvY19wdHItPnN5bS0+YXNfc3ltKSkpCi0JICAhPSAwKSkKLSAgICB7Ci0gICAgICBmaXJzdC5maWxlID0gbG9jYWxfZmlyc3RfbGluZW5vLT5maWxlOwotICAgICAgZmlyc3QucHJvYyA9IGxvY2FsX2ZpcnN0X2xpbmVuby0+cHJvYzsKLSAgICAgIGZpcnN0LmZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgICBmaXJzdC5wYWRkciA9IDA7Ci0gICAgICBmaXJzdC5saW5lbm8gPSAwOwotCi0gICAgICBmaXJzdC5uZXh0ID0gbG9jYWxfZmlyc3RfbGluZW5vOwotICAgICAgbG9jYWxfZmlyc3RfbGluZW5vID0gJmZpcnN0OwotICAgIH0KLQotICBmb3IgKGwgPSBsb2NhbF9maXJzdF9saW5lbm87IGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgbG9uZyBjb3VudDsKLSAgICAgIGxvbmcgZGVsdGE7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IHRvIHRoZSBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgbmV4dCBsaW5lIG51bWJlcgotCSAoaW4gd29yZHMpLiAgRG8gdGhpcyBmaXJzdCwgc28gdGhhdCB3ZSBjYW4gc2tpcCBhaGVhZCB0byB0aGUKLQkgbmV4dCB1c2VmdWwgbGluZSBudW1iZXIgZW50cnkuICAqLwotICAgICAgaWYgKGwtPm5leHQgPT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLQl7Ci0JICAvKiBXZSB3YW50IGEgY291bnQgb2YgemVybywgYnV0IGl0IHdpbGwgYmUgZGVjcmVtZW50ZWQKLQkgICAgIGJlZm9yZSBpdCBpcyB1c2VkLiAgKi8KLQkgIGNvdW50ID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChsLT5uZXh0LT5mcmFnLT5mcl9hZGRyZXNzICsgbC0+bmV4dC0+cGFkZHIKLQkgICAgICAgPiBsLT5mcmFnLT5mcl9hZGRyZXNzICsgbC0+cGFkZHIpCi0JewotCSAgY291bnQgPSAoKGwtPm5leHQtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5uZXh0LT5wYWRkcgotCQkgICAgLSAobC0+ZnJhZy0+ZnJfYWRkcmVzcyArIGwtPnBhZGRyKSkKLQkJICAgPj4gMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvbid0IGNoYW5nZSBsYXN0LCBzbyB3ZSBzdGlsbCBnZXQgdGhlIHJpZ2h0IGRlbHRhLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGwtPmZpbGUgIT0gZmlsZSB8fCBsLT5wcm9jICE9IHByb2MpCi0JewotCSAgaWYgKGwtPnByb2MgIT0gcHJvYyAmJiBwcm9jICE9IChwcm9jX3QgKikgTlVMTCkKLQkgICAgcHJvYy0+cGRyLmxuSGlnaCA9IGxhc3QtPmxpbmVubzsKLQkgIGlmIChsLT5maWxlICE9IGZpbGUgJiYgZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBmaWxlLT5mZHIuY2JMaW5lID0gYyAtIGZpbGUtPmZkci5jYkxpbmVPZmZzZXQ7Ci0JICAgICAgZmlsZS0+ZmRyLmNsaW5lID0gdG90Y291bnQgKyBjb3VudDsKLQkgICAgICBpZiAobGluZWNudHB0ciAhPSAobG9uZyAqKSBOVUxMKQotCQkqbGluZWNudHB0ciArPSB0b3Rjb3VudCArIGNvdW50OwotCSAgICAgIHRvdGNvdW50ID0gMDsKLQkgICAgfQotCi0JICBpZiAobC0+ZmlsZSAhPSBmaWxlKQotCSAgICB7Ci0JICAgICAgZWZkcl90ICpsYXN0X2ZpbGUgPSBmaWxlOwotCi0JICAgICAgZmlsZSA9IGwtPmZpbGU7Ci0JICAgICAgaWYgKGxhc3RfZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCi0JCWZpbGUtPmZkci5pbGluZUJhc2UKLQkJICA9IGxhc3RfZmlsZS0+ZmRyLmlsaW5lQmFzZSArIGxhc3RfZmlsZS0+ZmRyLmNsaW5lOwotCSAgICAgIGVsc2UKLQkJZmlsZS0+ZmRyLmlsaW5lQmFzZSA9IDA7Ci0JICAgICAgZmlsZS0+ZmRyLmNiTGluZU9mZnNldCA9IGM7Ci0JICAgIH0KLQkgIGlmIChsLT5wcm9jICE9IHByb2MpCi0JICAgIHsKLQkgICAgICBwcm9jID0gbC0+cHJvYzsKLQkgICAgICBpZiAocHJvYyAhPSAocHJvY190ICopIE5VTEwpCi0JCXsKLQkJICBwcm9jLT5wZHIubG5Mb3cgPSBsLT5saW5lbm87Ci0JCSAgcHJvYy0+cGRyLmNiTGluZU9mZnNldCA9IGMgLSBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0OwotCQkgIHByb2MtPnBkci5pbGluZSA9IHRvdGNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgbGFzdCA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7Ci0JfQotCi0gICAgICB0b3Rjb3VudCArPSBjb3VudDsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgdG8gdGhpcyBsaW5lIG51bWJlci4gICovCi0gICAgICBpZiAobGFzdCA9PSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotCWRlbHRhID0gMDsKLSAgICAgIGVsc2UKLQlkZWx0YSA9IGwtPmxpbmVubyAtIGxhc3QtPmxpbmVubzsKLQotICAgICAgLyogUHV0IGluIHRoZSBvZmZzZXQgdG8gdGhpcyBsaW5lIG51bWJlci4gICovCi0gICAgICB3aGlsZSAoZGVsdGEgIT0gMCkKLQl7Ci0JICBpbnQgc2V0Y291bnQ7Ci0KLQkgIC8qIDEgaXMgYWRkZWQgdG8gZWFjaCBjb3VudCByZWFkLiAgKi8KLQkgIC0tY291bnQ7Ci0JICAvKiBXZSBjYW4gb25seSBhZGp1c3QgdGhlIHdvcmQgY291bnQgYnkgdXAgdG8gMTUgd29yZHMgYXQgYQotCSAgICAgdGltZS4gICovCi0JICBpZiAoY291bnQgPD0gMHgwZikKLQkgICAgewotCSAgICAgIHNldGNvdW50ID0gY291bnQ7Ci0JICAgICAgY291bnQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZXRjb3VudCA9IDB4MGY7Ci0JICAgICAgY291bnQgLT0gMHgwZjsKLQkgICAgfQotCSAgaWYgKGRlbHRhID49IC03ICYmIGRlbHRhIDw9IDcpCi0JICAgIHsKLQkgICAgICBpZiAoYnVmcHRyID49ICpidWZlbmQpCi0JCWJ1ZnB0ciA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgKGxvbmcpIDEpOwotCSAgICAgICpidWZwdHIrKyA9IHNldGNvdW50ICsgKGRlbHRhIDw8IDQpOwotCSAgICAgIGRlbHRhID0gMDsKLQkgICAgICArK2M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBzZXQ7Ci0KLQkgICAgICBpZiAoKmJ1ZmVuZCAtIGJ1ZnB0ciA8IDMpCi0JCWJ1ZnB0ciA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgKGxvbmcpIDMpOwotCSAgICAgICpidWZwdHIrKyA9IHNldGNvdW50ICsgKDggPDwgNCk7Ci0JICAgICAgaWYgKGRlbHRhIDwgLTB4ODAwMCkKLQkJewotCQkgIHNldCA9IC0weDgwMDA7Ci0JCSAgZGVsdGEgKz0gMHg4MDAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoZGVsdGEgPiAweDdmZmYpCi0JCXsKLQkJICBzZXQgPSAweDdmZmY7Ci0JCSAgZGVsdGEgLT0gMHg3ZmZmOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2V0ID0gZGVsdGE7Ci0JCSAgZGVsdGEgPSAwOwotCQl9Ci0JICAgICAgKmJ1ZnB0cisrID0gc2V0ID4+IDg7Ci0JICAgICAgKmJ1ZnB0cisrID0gc2V0ICYgMHhmZmZmOwotCSAgICAgIGMgKz0gMzsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmluaXNoIGFkanVzdGluZyB0aGUgY291bnQuICAqLwotICAgICAgd2hpbGUgKGNvdW50ID4gMCkKLQl7Ci0JICBpZiAoYnVmcHRyID49ICpidWZlbmQpCi0JICAgIGJ1ZnB0ciA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgKGxvbmcpIDEpOwotCSAgLyogMSBpcyBhZGRlZCB0byBlYWNoIGNvdW50IHJlYWQuICAqLwotCSAgLS1jb3VudDsKLQkgIGlmIChjb3VudCA+IDB4MGYpCi0JICAgIHsKLQkgICAgICAqYnVmcHRyKysgPSAweDBmOwotCSAgICAgIGNvdW50IC09IDB4MGY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpidWZwdHIrKyA9IGNvdW50OwotCSAgICAgIGNvdW50ID0gMDsKLQkgICAgfQotCSAgKytjOwotCX0KLQotICAgICAgKytpbGluZTsKLSAgICAgIGxhc3QgPSBsOwotICAgIH0KLQotICBpZiAocHJvYyAhPSAocHJvY190ICopIE5VTEwpCi0gICAgcHJvYy0+cGRyLmxuSGlnaCA9IGxhc3QtPmxpbmVubzsKLSAgaWYgKGZpbGUgIT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZpbGUtPmZkci5jYkxpbmUgPSBjIC0gZmlsZS0+ZmRyLmNiTGluZU9mZnNldDsKLSAgICAgIGZpbGUtPmZkci5jbGluZSA9IHRvdGNvdW50OwotICAgIH0KLQotICBpZiAobGluZWNudHB0ciAhPSAobG9uZyAqKSBOVUxMKQotICAgICpsaW5lY250cHRyICs9IHRvdGNvdW50OwotCi0gIGMgPSBlY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIGMsICZidWZwdHIpOwotCi0gIHJldHVybiBjOwotfQotCi0vKiBCdWlsZCBhbmQgc3dhcCBvdXQgdGhlIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfc3ltYm9scyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9zeW1fb3V0OwotICBjaGFyICpzeW1fb3V0OwotICBsb25nIGlzeW07Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgc3ltX291dCA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgaXN5bSA9IDA7Ci0KLSAgLyogVGhlIHN5bWJvbHMgYXJlIHN0b3JlZCBieSBmaWxlLiAgKi8KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgaWZpbGVzeW07Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgdmxpbmtzX3QgKnN5bV9saW5rOwotCi0JICBmaWxfcHRyLT5mZHIuaXN5bUJhc2UgPSBpc3ltOwotCSAgaWZpbGVzeW0gPSBpc3ltOwotCSAgZm9yIChzeW1fbGluayA9IGZpbF9wdHItPnN5bWJvbHMuZmlyc3Q7Ci0JICAgICAgIHN5bV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotCSAgICAgICBzeW1fbGluayA9IHN5bV9saW5rLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IHN5bV9jbnQ7Ci0JICAgICAgbG9jYWxzeW1fdCAqc3ltX3B0cjsKLQkgICAgICBsb2NhbHN5bV90ICpzeW1fZW5kOwotCi0JICAgICAgaWYgKHN5bV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCQlzeW1fY250ID0gZmlsX3B0ci0+c3ltYm9scy5vYmplY3RzX2xhc3RfcGFnZTsKLQkgICAgICBlbHNlCi0JCXN5bV9jbnQgPSBmaWxfcHRyLT5zeW1ib2xzLm9iamVjdHNfcGVyX3BhZ2U7Ci0JICAgICAgc3ltX3B0ciA9IHN5bV9saW5rLT5kYXR1bS0+c3ltOwotCSAgICAgIHN5bV9lbmQgPSBzeW1fcHRyICsgc3ltX2NudDsKLQkgICAgICBmb3IgKDsgc3ltX3B0ciA8IHN5bV9lbmQ7IHN5bV9wdHIrKykKLQkJewotCQkgIGludCBsb2NhbDsKLQkJICBzeW1ib2xTICphc19zeW07Ci0JCSAgZm9yd2FyZF90ICpmOwotCi0JCSAga25vdyAoc3ltX3B0ci0+ZmlsZV9wdHIgPT0gZmlsX3B0cik7Ci0KLQkJICAvKiBJZiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGdhcyBzeW1ib2wsIHRoZW4gdGhpcwotCQkgICAgIGlzIGEgcHVyZSBkZWJ1Z2dpbmcgc3ltYm9sLiAgV2UgaGF2ZSBhbHJlYWR5Ci0JCSAgICAgYWRkZWQgdGhlIG5hbWUgKGlmIGFueSkgdG8gZmlsX3B0ci0+c3RyaW5ncy4KLQkJICAgICBPdGhlcndpc2Ugd2UgbXVzdCBkZWNpZGUgd2hldGhlciB0aGlzIGlzIGFuCi0JCSAgICAgZXh0ZXJuYWwgb3IgYSBsb2NhbCBzeW1ib2wgKGFjdHVhbGx5LCBpdCBtYXkgYmUKLQkJICAgICBib3RoIGlmIHRoZSBsb2NhbCBwcm92aWRlcyBhZGRpdGlvbmFsIGRlYnVnZ2luZwotCQkgICAgIGluZm9ybWF0aW9uIGZvciB0aGUgZXh0ZXJuYWwpLiAgKi8KLQkJICBsb2NhbCA9IDE7Ci0JCSAgYXNfc3ltID0gc3ltX3B0ci0+YXNfc3ltOwotCQkgIGlmIChhc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3ltaW50X3QgaW5keDsKLQotCQkgICAgICAvKiBUaGUgdmFsdWUgb2YgYSBibG9jayBzdGFydCBzeW1ib2wgaXMgdGhlCi0JCQkgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwcm9jZWR1cmUuICBGb3IKLQkJCSBvdGhlciBzeW1ib2xzIHdlIGp1c3QgdXNlIHRoZSBnYXMgdmFsdWUgKGJ1dAotCQkJIHdlIG11c3Qgb2Zmc2V0IGl0IGJ5IHRoZSB2bWEgb2YgdGhlIHNlY3Rpb24sCi0JCQkganVzdCBhcyBCRkQgZG9lcywgYmVjYXVzZSBCRkQgd2lsbCBub3Qgc2VlCi0JCQkgdGhpcyB2YWx1ZSkuICAqLwotCQkgICAgICBpZiAoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPT0gKGludCkgc3RfQmxvY2sKLQkJCSAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgPT0gKGludCkgc2NfVGV4dCkKLQkJCXsKLQkJCSAgc3ltYm9sUyAqYmVnaW5fc3ltOwotCi0JCQkgIGtub3cgKHN5bV9wdHItPnByb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTCk7Ci0JCQkgIGJlZ2luX3N5bSA9IHN5bV9wdHItPnByb2NfcHRyLT5zeW0tPmFzX3N5bTsKLQkJCSAgaWYgKFNfR0VUX1NFR01FTlQgKGFzX3N5bSkKLQkJCSAgICAgICE9IFNfR0VUX1NFR01FTlQgKGJlZ2luX3N5bSkpCi0JCQkgICAgYXNfd2FybiAoXygiLmJlZ2luLy5iZW5kIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQotCQkJICAgIFNfR0VUX1ZBTFVFIChhc19zeW0pIC0gU19HRVRfVkFMVUUgKGJlZ2luX3N5bSk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0KLQkJCSAgKFNfR0VUX1ZBTFVFIChhc19zeW0pCi0JCQkgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwKLQkJCQkJCSAgU19HRVRfU0VHTUVOVCAoYXNfc3ltKSkKLQkJCSAgICsgc3ltX3B0ci0+YWRkZW5kKTsKLQotCQkgICAgICBzeW1fcHRyLT5lY29mZl9zeW0ud2Vha2V4dCA9IFNfSVNfV0VBSyAoYXNfc3ltKTsKLQotCQkgICAgICAvKiBTZXQgc3RfUHJvYyB0byBzdF9TdGF0aWNQcm9jIGZvciBsb2NhbAotCQkJIGZ1bmN0aW9ucy4gICovCi0JCSAgICAgIGlmIChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSBzdF9Qcm9jCi0JCQkgICYmIFNfSVNfREVGSU5FRCAoYXNfc3ltKQotCQkJICAmJiAhIFNfSVNfRVhURVJOQUwgKGFzX3N5bSkKLQkJCSAgJiYgISBTX0lTX1dFQUsgKGFzX3N5bSkpCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9IHN0X1N0YXRpY1Byb2M7Ci0KLQkJICAgICAgLyogR2V0IHRoZSB0eXBlIGFuZCBzdG9yYWdlIGNsYXNzIGJhc2VkIG9uIHdoZXJlCi0JCQkgdGhlIHN5bWJvbCBhY3R1YWxseSB3b3VuZCB1cC4gIFRyYWRpdGlvbmFsbHksCi0JCQkgTl9MQlJBQyBhbmQgTl9SQlJBQyBhcmUgKm5vdCogcmVsb2NhdGVkLiAqLwotCQkgICAgICBpbmR4ID0gc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXg7Ci0JCSAgICAgIGlmIChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSBzdF9OaWwKLQkJCSAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgPT0gc2NfTmlsCi0JCQkgICYmICghIEVDT0ZGX0lTX1NUQUIgKCZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSkKLQkJCSAgICAgIHx8ICgoRUNPRkZfVU5NQVJLX1NUQUIgKGluZHgpICE9IE5fTEJSQUMpCi0JCQkJICAmJiAoRUNPRkZfVU5NQVJLX1NUQUIgKGluZHgpICE9IE5fUkJSQUMpKSkpCi0JCQl7Ci0JCQkgIHNlZ1Qgc2VnOwotCQkJICBjb25zdCBjaGFyICpzZWduYW1lOwotCQkJICBzdF90IHN0OwotCQkJICBzY190IHNjOwotCi0JCQkgIHNlZyA9IFNfR0VUX1NFR01FTlQgKGFzX3N5bSk7Ci0JCQkgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKHNlZyk7Ci0KLQkJCSAgaWYgKCEgRUNPRkZfSVNfU1RBQiAoJnN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltKQotCQkJICAgICAgJiYgKFNfSVNfRVhURVJOQUwgKGFzX3N5bSkKLQkJCQkgIHx8IFNfSVNfV0VBSyAoYXNfc3ltKQotCQkJCSAgfHwgISBTX0lTX0RFRklORUQgKGFzX3N5bSkpKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoc3ltYm9sX2dldF9iZmRzeW0gKGFzX3N5bSktPmZsYWdzCi0JCQkJICAgJiBCU0ZfRlVOQ1RJT04pICE9IDApCi0JCQkJc3QgPSBzdF9Qcm9jOwotCQkJICAgICAgZWxzZQotCQkJCXN0ID0gc3RfR2xvYmFsOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoc2VnID09IHRleHRfc2VjdGlvbikKLQkJCSAgICBzdCA9IHN0X0xhYmVsOwotCQkJICBlbHNlCi0JCQkgICAgc3QgPSBzdF9TdGF0aWM7Ci0KLQkJCSAgaWYgKCEgU19JU19ERUZJTkVEIChhc19zeW0pKQotCQkJICAgIHsKLQkJCSAgICAgIHZhbHVlVCBzOwotCi0JCQkgICAgICBzID0gc3ltYm9sX2dldF9vYmogKGFzX3N5bSktPmVjb2ZmX2V4dGVybl9zaXplOwotCQkJICAgICAgaWYgKHMgPT0gMAotCQkJCSAgfHwgcyA+IGJmZF9nZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0KSkKLQkJCQlzYyA9IHNjX1VuZGVmaW5lZDsKLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBzYyA9IHNjX1NVbmRlZmluZWQ7Ci0JCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9IHM7Ci0JCQkJfQotI2lmZGVmIFNfU0VUX1NJWkUKLQkJCSAgICAgIFNfU0VUX1NJWkUgKGFzX3N5bSwgcyk7Ci0jZW5kaWYKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKFNfSVNfQ09NTU9OIChhc19zeW0pKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChTX0dFVF9WQUxVRSAoYXNfc3ltKSA+IDAKLQkJCQkgICYmIChTX0dFVF9WQUxVRSAoYXNfc3ltKQotCQkJCSAgICAgIDw9IGJmZF9nZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0KSkpCi0JCQkJc2MgPSBzY19TQ29tbW9uOwotCQkJICAgICAgZWxzZQotCQkJCXNjID0gc2NfQ29tbW9uOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoc2VnID09IHRleHRfc2VjdGlvbikKLQkJCSAgICBzYyA9IHNjX1RleHQ7Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSBkYXRhX3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19EYXRhOwotCQkJICBlbHNlIGlmIChzdHJjbXAgKHNlZ25hbWUsICIucmRhdGEiKSA9PSAwCi0JCQkJICAgfHwgc3RyY21wIChzZWduYW1lLCAiLnJvZGF0YSIpID09IDApCi0JCQkgICAgc2MgPSBzY19SRGF0YTsKLQkJCSAgZWxzZSBpZiAoc3RyY21wIChzZWduYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJCSAgICBzYyA9IHNjX1NEYXRhOwotCQkJICBlbHNlIGlmIChzZWcgPT0gYnNzX3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19Cc3M7Ci0JCQkgIGVsc2UgaWYgKHN0cmNtcCAoc2VnbmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJCSAgICBzYyA9IHNjX1NCc3M7Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSAmYmZkX2Fic19zZWN0aW9uKQotCQkJICAgIHNjID0gc2NfQWJzOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgLyogVGhpcyBtdXN0IGJlIGEgdXNlciBuYW1lZCBzZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBub3QgcG9zc2libGUgaW4gRUNPRkYsIGJ1dCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gRUxGLiAgKi8KLQkJCSAgICAgIHNjID0gc2NfRGF0YTsKLQkJCSAgICB9Ci0KLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAoaW50KSBzdDsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAoaW50KSBzYzsKLQkJCX0KLQotCQkgICAgICAvKiBUaGlzIGlzIGp1c3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGlzCi0JCQkgb3V0c2lkZSBhIHByb2NlZHVyZSBhbmQgaXQgaGFzIGEgdHlwZS4KLQkJCSBGSVhNRTogZysrIHdpbGwgZ2VuZXJhdGUgc3ltYm9scyB3aGljaCBoYXZlCi0JCQkgZGlmZmVyZW50IG5hbWVzIGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQkJCSB0aGFuIHRoZSBhY3R1YWwgc3ltYm9sLiAgU2hvdWxkIHdlIGhhbmRsZQotCQkJIHRoZW0gaGVyZT8gICovCi0JCSAgICAgIGlmICgoU19JU19FWFRFUk5BTCAoYXNfc3ltKQotCQkJICAgfHwgU19JU19XRUFLIChhc19zeW0pCi0JCQkgICB8fCAhIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkKLQkJCSAgJiYgc3ltX3B0ci0+cHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMCi0JCQkgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ICE9IChpbnQpIHN0X05pbAotCQkJICAmJiAhIEVDT0ZGX0lTX1NUQUIgKCZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSkpCi0JCQlsb2NhbCA9IDA7Ci0KLQkJICAgICAgLyogVGhpcyBpcyBqdXN0IGFuIGV4dGVybmFsIHN5bWJvbCBpZiBpdCBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uIHN5bWJvbC4gICovCi0JCSAgICAgIGlmIChTX0lTX0NPTU1PTiAoYXNfc3ltKSkKLQkJCWxvY2FsID0gMDsKLQotCQkgICAgICAvKiBJZiBhbiBzdF9lbmQgc3ltYm9sIGhhcyBhbiBhc3NvY2lhdGVkIGdhcwotCQkJIHN5bWJvbCwgdGhlbiBpdCBpcyBhIGxvY2FsIGxhYmVsIGNyZWF0ZWQgZm9yCi0JCQkgYSAuYmVuZCBvciAuZW5kIGRpcmVjdGl2ZS4gIFN0YWJzIGxpbmUKLQkJCSBudW1iZXJzIHdpbGwgaGF2ZSBcMDAxIGluIHRoZSBuYW1lcy4gICovCi0JCSAgICAgIGlmIChsb2NhbAotCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCAhPSBzdF9FbmQKLQkJCSAgJiYgc3RyY2hyIChzeW1fcHRyLT5uYW1lLCAnXDAwMScpID09IDApCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3MgPQotCQkJICBhZGRfc3RyaW5nICgmZmlsX3B0ci0+c3RyaW5ncywKLQkJCQkgICAgICBmaWxfcHRyLT5zdHJfaGFzaCwKLQkJCQkgICAgICBzeW1fcHRyLT5uYW1lLAotCQkJCSAgICAgIChzaGFzaF90ICoqKSBOVUxMKTsKLQkJICAgIH0KLQotCQkgIC8qIFdlIG5vdyBrbm93IHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbDsgZmlsbCBpbgotCQkgICAgIGxvY2F0aW9ucyB0aGF0IGhhdmUgYmVlbiB3YWl0aW5nIGZvciB0aGF0Ci0JCSAgICAgaW5mb3JtYXRpb24uICAqLwotCQkgIGlmIChzeW1fcHRyLT5iZWdpbl9wdHIgIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgbG9jYWxzeW1fdCAqYmVnaW5fcHRyOwotCQkgICAgICBzdF90IGJlZ2luX3R5cGU7Ci0KLQkJICAgICAga25vdyAobG9jYWwpOwotCQkgICAgICBiZWdpbl9wdHIgPSBzeW1fcHRyLT5iZWdpbl9wdHI7Ci0JCSAgICAgIGtub3cgKGJlZ2luX3B0ci0+c3ltX2luZGV4ICE9IC0xKTsKLQkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBiZWdpbl9wdHItPnN5bV9pbmRleDsKLQkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnNjICE9IChpbnQpIHNjX0luZm8pCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3MgPQotCQkJICBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLmlzczsKLQotCQkgICAgICBiZWdpbl90eXBlID0gYmVnaW5fcHRyLT5lY29mZl9zeW0uYXN5bS5zdDsKLQkJICAgICAgaWYgKGJlZ2luX3R5cGUgPT0gc3RfRmlsZQotCQkJICB8fCBiZWdpbl90eXBlID09IHN0X0Jsb2NrKQotCQkJewotCQkJICBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0KLQkJCSAgICBpc3ltIC0gaWZpbGVzeW0gKyAxOwotCQkJICAoKnN3YXBfc3ltX291dCkgKHN0ZG91dHB1dCwKLQkJCQkJICAgJmJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0sCi0JCQkJCSAgICgqYnVmCi0JCQkJCSAgICArIG9mZnNldAotCQkJCQkgICAgKyAoYmVnaW5fcHRyLT5zeW1faW5kZXgKLQkJCQkJICAgICAgICogZXh0ZXJuYWxfc3ltX3NpemUpKSk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAga25vdyAoYmVnaW5fcHRyLT5pbmRleF9wdHIgIT0gKGF1eF90ICopIE5VTEwpOwotCQkJICBiZWdpbl9wdHItPmluZGV4X3B0ci0+ZGF0YS5pc3ltID0KLQkJCSAgICBpc3ltIC0gaWZpbGVzeW0gKyAxOwotCQkJfQotCi0JCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiBhCi0JCQkgcHJvY2VkdXJlIGlzIHRoZSBzaXplIG9mIHRoZSBwcm9jZWR1cmUuICBUaGUKLQkJCSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiBhCi0JCQkgYmxvY2sgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLQkJCSBwcm9jZWR1cmUgdG8gdGhlIGJsb2NrLiAgKi8KLQkJICAgICAgaWYgKGJlZ2luX3R5cGUgPT0gc3RfUHJvYwotCQkJICB8fCBiZWdpbl90eXBlID09IHN0X1N0YXRpY1Byb2MpCi0JCQl7Ci0JCQkgIGtub3cgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKLQkJCSAga25vdyAoYmVnaW5fcHRyLT5hc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTCk7Ci0JCQkgIGlmIChTX0dFVF9TRUdNRU5UIChhc19zeW0pCi0JCQkgICAgICAhPSBTX0dFVF9TRUdNRU5UIChiZWdpbl9wdHItPmFzX3N5bSkpCi0JCQkgICAgYXNfd2FybiAoXygiLmJlZ2luLy5iZW5kIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQotCQkJICAgIChTX0dFVF9WQUxVRSAoYXNfc3ltKQotCQkJICAgICAtIFNfR0VUX1ZBTFVFIChiZWdpbl9wdHItPmFzX3N5bSkpOwotCi0JCQkgIC8qIElmIHRoZSBzaXplIGlzIG9kZCwgdGhpcyBpcyBwcm9iYWJseSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHMxNiBmdW5jdGlvbjsgZm9yY2UgaXQgdG8gYmUgZXZlbi4gICovCi0JCQkgIGlmICgoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgJiAxKSAhPSAwKQotCQkJICAgICsrc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWU7Ci0KLSNpZmRlZiBTX1NFVF9TSVpFCi0JCQkgIFNfU0VUX1NJWkUgKGJlZ2luX3B0ci0+YXNfc3ltLAotCQkJCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlKTsKLSNlbmRpZgotCQkJfQotCQkgICAgICBlbHNlIGlmIChiZWdpbl90eXBlID09IHN0X0Jsb2NrCi0JCQkgICAgICAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgIT0gKGludCkgc2NfSW5mbykKLQkJCXsKLQkJCSAgc3ltYm9sUyAqYmVnaW5fc3ltOwotCi0JCQkgIGtub3cgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKLQkJCSAga25vdyAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKTsKLQkJCSAgYmVnaW5fc3ltID0gc3ltX3B0ci0+cHJvY19wdHItPnN5bS0+YXNfc3ltOwotCQkJICBpZiAoU19HRVRfU0VHTUVOVCAoYXNfc3ltKQotCQkJICAgICAgIT0gU19HRVRfU0VHTUVOVCAoYmVnaW5fc3ltKSkKLQkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkgICAgU19HRVRfVkFMVUUgKGFzX3N5bSkgLSBTX0dFVF9WQUxVRSAoYmVnaW5fc3ltKTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGZvciAoZiA9IHN5bV9wdHItPmZvcndhcmRfcmVmOwotCQkgICAgICAgZiAhPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0JCSAgICAgICBmID0gZi0+bmV4dCkKLQkJICAgIHsKLQkJICAgICAga25vdyAobG9jYWwpOwotCQkgICAgICBmLT5pZmRfcHRyLT5kYXRhLmlzeW0gPSBmaWxfcHRyLT5maWxlX2luZGV4OwotCQkgICAgICBmLT5pbmRleF9wdHItPmRhdGEucm5keC5pbmRleCA9IGlzeW0gLSBpZmlsZXN5bTsKLQkJICAgIH0KLQotCQkgIGlmIChsb2NhbCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCpidWZlbmQgLSBzeW1fb3V0IDwgZXh0ZXJuYWxfc3ltX3NpemUpCi0JCQlzeW1fb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwKLQkJCQkJCSAgIHN5bV9vdXQsCi0JCQkJCQkgICBleHRlcm5hbF9zeW1fc2l6ZSk7Ci0JCSAgICAgICgqc3dhcF9zeW1fb3V0KSAoc3Rkb3V0cHV0LCAmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0sCi0JCQkJICAgICAgIHN5bV9vdXQpOwotCQkgICAgICBzeW1fb3V0ICs9IGV4dGVybmFsX3N5bV9zaXplOwotCi0JCSAgICAgIHN5bV9wdHItPnN5bV9pbmRleCA9IGlzeW07Ci0KLQkJICAgICAgaWYgKHN5bV9wdHItPnByb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTAotCQkJICAmJiBzeW1fcHRyLT5wcm9jX3B0ci0+c3ltID09IHN5bV9wdHIpCi0JCQlzeW1fcHRyLT5wcm9jX3B0ci0+cGRyLmlzeW0gPSBpc3ltIC0gaWZpbGVzeW07Ci0KLQkJICAgICAgKytpc3ltOwotCQkgICAgfQotCi0JCSAgLyogUmVjb3JkIHRoZSBsb2NhbCBzeW1ib2wgaW5kZXggYW5kIGZpbGUgbnVtYmVyIGluCi0JCSAgICAgY2FzZSB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gIE5vdGUgdGhhdCB0aGlzCi0JCSAgICAgZGVzdHJveXMgdGhlIGFzeW0uaW5kZXggZmllbGQuICAqLwotCQkgIGlmIChhc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTAotCQkgICAgICAmJiBzeW1ib2xfZ2V0X29iaiAoYXNfc3ltKS0+ZWNvZmZfc3ltYm9sID09IHN5bV9wdHIpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPT0gc3RfUHJvYwotCQkJICAgfHwgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPT0gc3RfU3RhdGljUHJvYykKLQkJCSAgJiYgbG9jYWwpCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGlzeW0gLSBpZmlsZXN5bSAtIDE7Ci0JCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS5pZmQgPSBmaWxfcHRyLT5maWxlX2luZGV4OwotCi0JCSAgICAgIC8qIERvbid0IHRyeSB0byBtZXJnZSBhbiBGRFIgd2hpY2ggaGFzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgc3ltYm9sIGF0dGFjaGVkIHRvIGl0LiAgKi8KLQkJICAgICAgaWYgKFNfSVNfRVhURVJOQUwgKGFzX3N5bSkgfHwgU19JU19XRUFLIChhc19zeW0pKQotCQkJZmlsX3B0ci0+ZmRyLmZNZXJnZSA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZmlsX3B0ci0+ZmRyLmNzeW0gPSBpc3ltIC0gZmlsX3B0ci0+ZmRyLmlzeW1CYXNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldCArIGlzeW0gKiBleHRlcm5hbF9zeW1fc2l6ZTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIHByb2NlZHVyZSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9wcm9jcyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9wZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUERSICosIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX3Bkcl9vdXQ7Ci0gIGNoYXIgKnBkcl9vdXQ7Ci0gIGxvbmcgaXByb2M7Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgcGRyX291dCA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgaXByb2MgPSAwOwotCi0gIC8qIFRoZSBwcm9jZWR1cmVzIGFyZSBzdG9yZWQgYnkgZmlsZS4gICovCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIHZsaW5rc190ICpwcm9jX2xpbms7Ci0JICBpbnQgZmlyc3Q7Ci0KLQkgIGZpbF9wdHItPmZkci5pcGRGaXJzdCA9IGlwcm9jOwotCSAgZmlyc3QgPSAxOwotCSAgZm9yIChwcm9jX2xpbmsgPSBmaWxfcHRyLT5wcm9jcy5maXJzdDsKLQkgICAgICAgcHJvY19saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotCSAgICAgICBwcm9jX2xpbmsgPSBwcm9jX2xpbmstPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgcHJjX2NudDsKLQkgICAgICBwcm9jX3QgKnByb2NfcHRyOwotCSAgICAgIHByb2NfdCAqcHJvY19lbmQ7Ci0KLQkgICAgICBpZiAocHJvY19saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCQlwcmNfY250ID0gZmlsX3B0ci0+cHJvY3Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0JICAgICAgZWxzZQotCQlwcmNfY250ID0gZmlsX3B0ci0+cHJvY3Mub2JqZWN0c19wZXJfcGFnZTsKLQkgICAgICBwcm9jX3B0ciA9IHByb2NfbGluay0+ZGF0dW0tPnByb2M7Ci0JICAgICAgcHJvY19lbmQgPSBwcm9jX3B0ciArIHByY19jbnQ7Ci0JICAgICAgZm9yICg7IHByb2NfcHRyIDwgcHJvY19lbmQ7IHByb2NfcHRyKyspCi0JCXsKLQkJICBzeW1ib2xTICphZHJfc3ltOwotCQkgIHVuc2lnbmVkIGxvbmcgYWRyOwotCi0JCSAgYWRyX3N5bSA9IHByb2NfcHRyLT5zeW0tPmFzX3N5bTsKLQkJICBhZHIgPSAoU19HRVRfVkFMVUUgKGFkcl9zeW0pCi0JCQkgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsCi0JCQkJCQlTX0dFVF9TRUdNRU5UIChhZHJfc3ltKSkpOwotCQkgIGlmIChmaXJzdCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gZm9yY2UgdGhlIGFkciBvZiB0aGUgdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGZkciB0byBiZSAwLiAgSG93ZXZlciwgdGhlIG5hdGl2ZSB0b29scwotICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGRvIHRoYXQsIGFuZCBJIGNhbid0IHJlbWVtYmVyIHdoeSBpdAotICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gd29yayB0aGF0IHdheSwgc28gSSB0b29rIGl0IG91dC4gICovCi0JCSAgICAgIGZpbF9wdHItPmZkci5hZHIgPSBhZHI7Ci0JCSAgICAgIGZpcnN0ID0gMDsKLQkJICAgIH0KLQkJICBwcm9jX3B0ci0+cGRyLmFkciA9IGFkciAtIGZpbF9wdHItPmZkci5hZHI7Ci0JCSAgaWYgKCpidWZlbmQgLSBwZHJfb3V0IDwgZXh0ZXJuYWxfcGRyX3NpemUpCi0JCSAgICBwZHJfb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwKLQkJCQkJICAgICAgIHBkcl9vdXQsCi0JCQkJCSAgICAgICBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0JCSAgKCpzd2FwX3Bkcl9vdXQpIChzdGRvdXRwdXQsICZwcm9jX3B0ci0+cGRyLCBwZHJfb3V0KTsKLQkJICBwZHJfb3V0ICs9IGV4dGVybmFsX3Bkcl9zaXplOwotCQkgICsraXByb2M7Ci0JCX0KLQkgICAgfQotCSAgZmlsX3B0ci0+ZmRyLmNwZCA9IGlwcm9jIC0gZmlsX3B0ci0+ZmRyLmlwZEZpcnN0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldCArIGlwcm9jICogZXh0ZXJuYWxfcGRyX3NpemU7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBhdXggaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfYXV4IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGludCBiaWdlbmRpYW47Ci0gIHVuaW9uIGF1eF9leHQgKmF1eF9vdXQ7Ci0gIGxvbmcgaWF1eDsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBiaWdlbmRpYW4gPSBiZmRfYmlnX2VuZGlhbiAoc3Rkb3V0cHV0KTsKLQotICBhdXhfb3V0ID0gKHVuaW9uIGF1eF9leHQgKikgKCpidWYgKyBvZmZzZXQpOwotCi0gIGlhdXggPSAwOwotCi0gIC8qIFRoZSBhdXggZW50cmllcyBhcmUgc3RvcmVkIGJ5IGZpbGUuICAqLwotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICB2bGlua3NfdCAqYXV4X2xpbms7Ci0KLQkgIGZpbF9wdHItPmZkci5mQmlnZW5kaWFuID0gYmlnZW5kaWFuOwotCSAgZmlsX3B0ci0+ZmRyLmlhdXhCYXNlID0gaWF1eDsKLQkgIGZvciAoYXV4X2xpbmsgPSBmaWxfcHRyLT5hdXhfc3ltcy5maXJzdDsKLQkgICAgICAgYXV4X2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0JICAgICAgIGF1eF9saW5rID0gYXV4X2xpbmstPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgYXV4X2NudDsKLQkgICAgICBhdXhfdCAqYXV4X3B0cjsKLQkgICAgICBhdXhfdCAqYXV4X2VuZDsKLQotCSAgICAgIGlmIChhdXhfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQkJYXV4X2NudCA9IGZpbF9wdHItPmF1eF9zeW1zLm9iamVjdHNfbGFzdF9wYWdlOwotCSAgICAgIGVsc2UKLQkJYXV4X2NudCA9IGZpbF9wdHItPmF1eF9zeW1zLm9iamVjdHNfcGVyX3BhZ2U7Ci0JICAgICAgYXV4X3B0ciA9IGF1eF9saW5rLT5kYXR1bS0+YXV4OwotCSAgICAgIGF1eF9lbmQgPSBhdXhfcHRyICsgYXV4X2NudDsKLQkgICAgICBmb3IgKDsgYXV4X3B0ciA8IGF1eF9lbmQ7IGF1eF9wdHIrKykKLQkJewotCQkgIGlmICgqYnVmZW5kIC0gKGNoYXIgKikgYXV4X291dCA8IHNpemVvZiAodW5pb24gYXV4X2V4dCkpCi0JCSAgICBhdXhfb3V0ID0gKCh1bmlvbiBhdXhfZXh0ICopCi0JCQkgICAgICAgZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwKLQkJCQkJCShjaGFyICopIGF1eF9vdXQsCi0JCQkJCQlzaXplb2YgKHVuaW9uIGF1eF9leHQpKSk7Ci0JCSAgc3dpdGNoIChhdXhfcHRyLT50eXBlKQotCQkgICAgewotCQkgICAgY2FzZSBhdXhfdGlyOgotCQkgICAgICAoKmJhY2tlbmQtPnN3YXBfdGlyX291dCkgKGJpZ2VuZGlhbiwKLQkJCQkJCSZhdXhfcHRyLT5kYXRhLnRpLAotCQkJCQkJJmF1eF9vdXQtPmFfdGkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X3JuZHg6Ci0JCSAgICAgICgqYmFja2VuZC0+c3dhcF9ybmR4X291dCkgKGJpZ2VuZGlhbiwKLQkJCQkJCSAmYXV4X3B0ci0+ZGF0YS5ybmR4LAotCQkJCQkJICZhdXhfb3V0LT5hX3JuZHgpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2RuTG93OgotCQkgICAgICBBVVhfUFVUX0ROTE9XIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuZG5Mb3csCi0JCQkJICAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9kbkhpZ2g6Ci0JCSAgICAgIEFVWF9QVVRfRE5ISUdIIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuZG5IaWdoLAotCQkJCSAgICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2lzeW06Ci0JCSAgICAgIEFVWF9QVVRfSVNZTSAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmlzeW0sCi0JCQkJICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2lzczoKLQkJICAgICAgQVVYX1BVVF9JU1MgKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5pc3MsCi0JCQkJICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfd2lkdGg6Ci0JCSAgICAgIEFVWF9QVVRfV0lEVEggKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS53aWR0aCwKLQkJCQkgICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2NvdW50OgotCQkgICAgICBBVVhfUFVUX0NPVU5UIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuY291bnQsCi0JCQkJICAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICArK2F1eF9vdXQ7Ci0JCSAgKytpYXV4OwotCQl9Ci0JICAgIH0KLQkgIGZpbF9wdHItPmZkci5jYXV4ID0gaWF1eCAtIGZpbF9wdHItPmZkci5pYXV4QmFzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBlY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsCi0JCQkgICAgICAgb2Zmc2V0ICsgaWF1eCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JCQkgICAgICAgKGNoYXIgKiopIE5VTEwpOwotfQotCi0vKiBDb3B5IG91dCB0aGUgc3RyaW5ncyBmcm9tIGEgdmFycmF5X3QuICBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZgotICAgYnl0ZXMgY29waWVkLCByYXRoZXIgdGhhbiB0aGUgbmV3IG9mZnNldC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9zdHJpbmdzIChidWYsIGJ1ZmVuZCwgb2Zmc2V0LCB2cCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIHZhcnJheV90ICp2cDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpc3RyOwotICBjaGFyICpzdHJfb3V0OwotICB2bGlua3NfdCAqc3RyX2xpbms7Ci0KLSAgc3RyX291dCA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgaXN0ciA9IDA7Ci0KLSAgZm9yIChzdHJfbGluayA9IHZwLT5maXJzdDsKLSAgICAgICBzdHJfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBzdHJfbGluayA9IHN0cl9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RyX2NudDsKLQotICAgICAgaWYgKHN0cl9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCXN0cl9jbnQgPSB2cC0+b2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0Jc3RyX2NudCA9IHZwLT5vYmplY3RzX3Blcl9wYWdlOwotCi0gICAgICBpZiAoKmJ1ZmVuZCAtIHN0cl9vdXQgPCBzdHJfY250KQotCXN0cl9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBzdHJfb3V0LCBzdHJfY250KTsKLQotICAgICAgbWVtY3B5IChzdHJfb3V0LCBzdHJfbGluay0+ZGF0dW0tPmJ5dGUsIHN0cl9jbnQpOwotICAgICAgc3RyX291dCArPSBzdHJfY250OwotICAgICAgaXN0ciArPSBzdHJfY250OwotICAgIH0KLQotICByZXR1cm4gaXN0cjsKLX0KLQotLyogRHVtcCBvdXQgdGhlIGxvY2FsIHN0cmluZ3MuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfc3MgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgbG9uZyBpc3M7Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgaXNzID0gMDsKLQotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICBsb25nIHNzX2NudDsKLQotCSAgZmlsX3B0ci0+ZmRyLmlzc0Jhc2UgPSBpc3M7Ci0JICBzc19jbnQgPSBlY29mZl9idWlsZF9zdHJpbmdzIChidWYsIGJ1ZmVuZCwgb2Zmc2V0ICsgaXNzLAotCQkJCQkmZmlsX3B0ci0+c3RyaW5ncyk7Ci0JICBmaWxfcHRyLT5mZHIuY2JTcyA9IHNzX2NudDsKLQkgIGlzcyArPSBzc19jbnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZWNvZmZfcGFkZGluZ19hZGp1c3QgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQgKyBpc3MsCi0JCQkgICAgICAgKGNoYXIgKiopIE5VTEwpOwotfQotCi0vKiBTd2FwIG91dCB0aGUgZmlsZSBkZXNjcmlwdG9ycy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9mZHIgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX2Zkcl9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9mZHJfb3V0OwotICBsb25nIGlmaWxlOwotICBjaGFyICpmZHJfb3V0OwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIGlmaWxlID0gMDsKLQotICBmZHJfb3V0ID0gKmJ1ZiArIG9mZnNldDsKLQotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICBpZiAoKmJ1ZmVuZCAtIGZkcl9vdXQgPCBleHRlcm5hbF9mZHJfc2l6ZSkKLQkgICAgZmRyX291dCA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGZkcl9vdXQsCi0JCQkJICAgICAgIGV4dGVybmFsX2Zkcl9zaXplKTsKLQkgICgqc3dhcF9mZHJfb3V0KSAoc3Rkb3V0cHV0LCAmZmlsX3B0ci0+ZmRyLCBmZHJfb3V0KTsKLQkgIGZkcl9vdXQgKz0gZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICArK2lmaWxlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldCArIGlmaWxlICogZXh0ZXJuYWxfZmRyX3NpemU7Ci19Ci0KLS8qIFNldCB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIFRoZXNlIGFyZSBzdXBwb3NlZCB0byBiZSBoYW5kbGVkIGJ5Ci0gICB0aGUgYmFja2VuZC4gIFRoaXMgcm91dGluZSBqdXN0IGdldHMgdGhlIHJpZ2h0IGluZm9ybWF0aW9uIGFuZAotICAgY2FsbHMgYSBiYWNrZW5kIGZ1bmN0aW9uIHRvIGRlYWwgd2l0aCBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zZXR1cF9leHQgKCkKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltOwotCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gKHN5bWJvbFMgKikgTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2wgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgdGhlbiBmb3JjZSB0aGUgZmllbGRzIHRvIHplcm8uICAqLwotICAgICAgaWYgKCEgU19JU19FWFRFUk5BTCAoc3ltKQotCSAgJiYgISBTX0lTX1dFQUsgKHN5bSkKLQkgICYmIFNfSVNfREVGSU5FRCAoc3ltKSkKLQl7Ci0JICBzdHJ1Y3QgbG9jYWxzeW0gKmxzeW07Ci0KLQkgIGxzeW0gPSBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sOwotCSAgbHN5bS0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPSAwOwotCSAgbHN5bS0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAoaW50KSBzdF9OaWw7Ci0JICBsc3ltLT5lY29mZl9zeW0uYXN5bS5zYyA9IChpbnQpIHNjX05pbDsKLQkgIGxzeW0tPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0JfQotCi0gICAgICBvYmpfZWNvZmZfc2V0X2V4dCAoc3ltLCAmc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltKTsKLSAgICB9Ci19Ci0KLS8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi11bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9kZWJ1ZyAoaGRyLCBidWZwLCBiYWNrZW5kKQotICAgICBIRFJSICpoZHI7Ci0gICAgIGNoYXIgKipidWZwOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3Bkcl9zaXplOwotICB0YWdfdCAqcHRhZzsKLSAgdGFnX3QgKnB0YWdfbmV4dDsKLSAgZWZkcl90ICpmaWxfcHRyOwotICBpbnQgZW5kX3dhcm5pbmc7Ci0gIGVmZHJfdCAqaG9sZF9maWxlX3B0cjsKLSAgcHJvY190ICogaG9sZF9wcm9jX3B0cjsKLSAgc3ltYm9sUyAqc3ltOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKmJ1ZmVuZDsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBmaWxlLiAgKi8KLSAgaWYgKGZpcnN0X2ZpbGUgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLQotICAvKiBIYW5kbGUgYW55IHRvcCBsZXZlbCB0YWdzLiAgKi8KLSAgZm9yIChwdGFnID0gdG9wX3RhZ19oZWFkLT5maXJzdF90YWc7Ci0gICAgICAgcHRhZyAhPSAodGFnX3QgKikgTlVMTDsKLSAgICAgICBwdGFnID0gcHRhZ19uZXh0KQotICAgIHsKLSAgICAgIGlmIChwdGFnLT5mb3J3YXJkX3JlZiAhPSAoZm9yd2FyZF90ICopIE5VTEwpCi0JYWRkX3Vua25vd25fdGFnIChwdGFnKTsKLQotICAgICAgcHRhZ19uZXh0ID0gcHRhZy0+c2FtZV9ibG9jazsKLSAgICAgIHB0YWctPmhhc2hfcHRyLT50YWdfcHRyID0gcHRhZy0+c2FtZV9uYW1lOwotICAgICAgZnJlZV90YWcgKHB0YWcpOwotICAgIH0KLQotICBmcmVlX3RoZWFkICh0b3BfdGFnX2hlYWQpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scy4gIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2gKLSAgICAgc3ltYm9sIHRoYXQgaGFzIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGl0LiAgKi8KLSAgaG9sZF9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKLSAgaG9sZF9wcm9jX3B0ciA9IGN1cl9wcm9jX3B0cjsKLSAgY3VyX3Byb2NfcHRyID0gKHByb2NfdCAqKSBOVUxMOwotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IChzeW1ib2xTICopIE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sICE9IE5VTEwKLQkgIHx8IHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9maWxlID09IChlZmRyX3QgKikgTlVMTAotCSAgfHwgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgY3VyX2ZpbGVfcHRyID0gc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2ZpbGU7Ci0gICAgICBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9OaWwsIHNjX05pbCwgc3ltLAotCQkJKGJmZF92bWEpIDAsIFNfR0VUX1ZBTFVFIChzeW0pLCBpbmRleE5pbCk7Ci0gICAgfQotICBjdXJfcHJvY19wdHIgPSBob2xkX3Byb2NfcHRyOwotICBjdXJfZmlsZV9wdHIgPSBob2xkX2ZpbGVfcHRyOwotCi0gIC8qIE91dHB1dCBhbiBlbmRpbmcgc3ltYm9sIGZvciBhbGwgdGhlIGZpbGVzLiAgV2UgaGF2ZSB0byBkbyB0aGlzCi0gICAgIGhlcmUgZm9yIHRoZSBsYXN0IGZpbGUsIHNvIHdlIG1heSBhcyB3ZWxsIGRvIGl0IGZvciBhbGwgb2YgdGhlCi0gICAgIGZpbGVzLiAgKi8KLSAgZW5kX3dhcm5pbmcgPSAwOwotICBmb3IgKGZpbF9wdHIgPSBmaXJzdF9maWxlOwotICAgICAgIGZpbF9wdHIgIT0gKGVmZHJfdCAqKSBOVUxMOwotICAgICAgIGZpbF9wdHIgPSBmaWxfcHRyLT5uZXh0X2ZpbGUpCi0gICAgewotICAgICAgY3VyX2ZpbGVfcHRyID0gZmlsX3B0cjsKLSAgICAgIHdoaWxlIChjdXJfZmlsZV9wdHItPmN1cl9zY29wZSAhPSAoc2NvcGVfdCAqKSBOVUxMCi0JICAgICAmJiBjdXJfZmlsZV9wdHItPmN1cl9zY29wZS0+cHJldiAhPSAoc2NvcGVfdCAqKSBOVUxMKQotCXsKLQkgIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlID0gY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUtPnByZXY7Ci0JICBpZiAoISBlbmRfd2FybmluZyAmJiAhIGN1cl9maWxlX3B0ci0+ZmFrZSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIk1pc3NpbmcgLmVuZCBvciAuYmVuZCBhdCBlbmQgb2YgZmlsZSIpKTsKLQkgICAgICBlbmRfd2FybmluZyA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgIT0gKHNjb3BlX3QgKikgTlVMTCkKLQkodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgc3RfRW5kLCBzY19UZXh0LAotCQkJCSAoc3ltYm9sUyAqKSBOVUxMLAotCQkJCSAoYmZkX3ZtYSkgMCwKLQkJCQkgKHN5bWludF90KSAwLAotCQkJCSAoc3ltaW50X3QpIDApOwotICAgIH0KLQotICAvKiBCdWlsZCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBvZmZzZXQgPSAwOwotICBidWYgPSB4bWFsbG9jIChQQUdFX1NJWkUpOwotICBidWZlbmQgPSBidWYgKyBQQUdFX1NJWkU7Ci0KLSAgLyogQnVpbGQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLSAgaGRyLT5jYkxpbmVPZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX2xpbmVubyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0LAotCQkJICAgICAgICZoZHItPmlsaW5lTWF4KTsKLSAgaGRyLT5jYkxpbmUgPSBvZmZzZXQgLSBoZHItPmNiTGluZU9mZnNldDsKLQotICAvKiBXZSBkb24ndCB1c2UgZGVuc2UgbnVtYmVycyBhdCBhbGwuICAqLwotICBoZHItPmlkbk1heCA9IDA7Ci0gIGhkci0+Y2JEbk9mZnNldCA9IDA7Ci0KLSAgLyogV2UgY2FuJ3QgYnVpbGQgdGhlIFBEUiB0YWJsZSB1bnRpbCB3ZSBoYXZlIGJ1aWx0IHRoZSBzeW1ib2xzLAotICAgICBiZWNhdXNlIGEgUERSIGNvbnRhaW5zIGEgc3ltYm9sIGluZGV4LiAgSG93ZXZlciwgd2Ugc2V0IGFzaWRlCi0gICAgIHNwYWNlIGF0IHRoaXMgcG9pbnQuICAqLwotICBoZHItPmlwZE1heCA9IHByb2NfY250OwotICBoZHItPmNiUGRPZmZzZXQgPSBvZmZzZXQ7Ci0gIGlmIChidWZlbmQgLSAoYnVmICsgb2Zmc2V0KSA8IHByb2NfY250ICogZXh0ZXJuYWxfcGRyX3NpemUpCi0gICAgKHZvaWQpIGVjb2ZmX2FkZF9ieXRlcyAoJmJ1ZiwgJmJ1ZmVuZCwgYnVmICsgb2Zmc2V0LAotCQkJICAgIHByb2NfY250ICogZXh0ZXJuYWxfcGRyX3NpemUpOwotICBvZmZzZXQgKz0gcHJvY19jbnQgKiBleHRlcm5hbF9wZHJfc2l6ZTsKLQotICAvKiBCdWlsZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gIGhkci0+Y2JTeW1PZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX3N5bWJvbHMgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCk7Ci0gIGhkci0+aXN5bU1heCA9IChvZmZzZXQgLSBoZHItPmNiU3ltT2Zmc2V0KSAvIGJhY2tlbmQtPmV4dGVybmFsX3N5bV9zaXplOwotCi0gIC8qIEJ1aWxkaW5nIHRoZSBzeW1ib2xzIGluaXRpYWxpemVzIHRoZSBzeW1ib2wgaW5kZXggaW4gdGhlIFBEUidzLgotICAgICBOb3cgd2UgY2FuIHN3YXAgb3V0IHRoZSBQRFIncy4gICovCi0gICh2b2lkKSBlY29mZl9idWlsZF9wcm9jcyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgaGRyLT5jYlBkT2Zmc2V0KTsKLQotICAvKiBXZSBkb24ndCB1c2Ugb3B0aW1pemF0aW9uIHN5bWJvbHMuICAqLwotICBoZHItPmlvcHRNYXggPSAwOwotICBoZHItPmNiT3B0T2Zmc2V0ID0gMDsKLQotICAvKiBTd2FwIG91dCB0aGUgYXV4aWxpYXJ5IHR5cGUgaW5mb3JtYXRpb24uICAqLwotICBoZHItPmNiQXV4T2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9hdXggKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCk7Ci0gIGhkci0+aWF1eE1heCA9IChvZmZzZXQgLSBoZHItPmNiQXV4T2Zmc2V0KSAvIHNpemVvZiAodW5pb24gYXV4X2V4dCk7Ci0KLSAgLyogQ29weSBvdXQgdGhlIGxvY2FsIHN0cmluZ3MuICAqLwotICBoZHItPmNiU3NPZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX3NzIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOwotICBoZHItPmlzc01heCA9IG9mZnNldCAtIGhkci0+Y2JTc09mZnNldDsKLQotICAvKiBXZSBkb24ndCB1c2UgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9ycy4gICovCi0gIGhkci0+Y3JmZCA9IDA7Ci0gIGhkci0+Y2JSZmRPZmZzZXQgPSAwOwotCi0gIC8qIFN3YXAgb3V0IHRoZSBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KLSAgaGRyLT5jYkZkT2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9mZHIgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCk7Ci0gIGhkci0+aWZkTWF4ID0gKG9mZnNldCAtIGhkci0+Y2JGZE9mZnNldCkgLyBiYWNrZW5kLT5leHRlcm5hbF9mZHJfc2l6ZTsKLQotICAvKiBTZXQgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMsIHdoaWNoIGFyZSBoYW5kbGVkIGJ5IHRoZSBCRkQgYmFjawotICAgICBlbmQuICAqLwotICBoZHItPmlzc0V4dE1heCA9IDA7Ci0gIGhkci0+Y2JTc0V4dE9mZnNldCA9IDA7Ci0gIGhkci0+aWV4dE1heCA9IDA7Ci0gIGhkci0+Y2JFeHRPZmZzZXQgPSAwOwotICBlY29mZl9zZXR1cF9leHQgKCk7Ci0KLSAga25vdyAoKG9mZnNldCAmIChiYWNrZW5kLT5kZWJ1Z19hbGlnbiAtIDEpKSA9PSAwKTsKLQotICAvKiBGSVhNRTogVGhpcyB2YWx1ZSBzaG91bGQgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSAudmVyc3RhbXAgZGlyZWN0aXZlLAotICAgICB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gY29uZmlnIGZpbGVzLiAgKi8KLSNpZmRlZiBUQ19BTFBIQQotICBoZHItPnZzdGFtcCA9IDB4MDMwYjsKLSNlbHNlCi0gIGhkci0+dnN0YW1wID0gMHgwMjBiOwotI2VuZGlmCi0KLSAgKmJ1ZnAgPSBidWY7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBhIGNsdXN0ZXIgb2YgcGFnZXMuICAqLwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi1zdGF0aWMgcGFnZV90eXBlICoKLWFsbG9jYXRlX2NsdXN0ZXIgKG5wYWdlcykKLSAgICAgdW5zaWduZWQgbG9uZyBucGFnZXM7Ci17Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqdmFsdWUgPSAocGFnZV90eXBlICopIHhtYWxsb2MgKG5wYWdlcyAqIFBBR0VfVVNJWkUpOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnID4gMykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcdGFsbG9jXHRucGFnZXMgPSAlZCwgdmFsdWUgPSAweCUuOHhcbiIsIG5wYWdlcywgdmFsdWUpOwotI2VuZGlmCi0KLSAgbWVtc2V0ICh2YWx1ZSwgMCwgbnBhZ2VzICogUEFHRV9VU0laRSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLXN0YXRpYyBwYWdlX3R5cGUgKmNsdXN0ZXJfcHRyID0gTlVMTDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2VzX2xlZnQgPSAwOwotCi0jZW5kaWYgLyogTUFMTE9DX0NIRUNLICovCi0KLS8qIEFsbG9jYXRlIG9uZSBwYWdlICh3aGljaCBpcyBpbml0aWFsaXplZCB0byAwKS4gICovCi0KLXN0YXRpYyBwYWdlX3R5cGUgKgotYWxsb2NhdGVfcGFnZSAoKQotewotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICBpZiAocGFnZXNfbGVmdCA9PSAwKQotICAgIHsKLSAgICAgIHBhZ2VzX2xlZnQgPSBNQVhfQ0xVU1RFUl9QQUdFUzsKLSAgICAgIGNsdXN0ZXJfcHRyID0gYWxsb2NhdGVfY2x1c3RlciAocGFnZXNfbGVmdCk7Ci0gICAgfQotCi0gIHBhZ2VzX2xlZnQtLTsKLSAgcmV0dXJuIGNsdXN0ZXJfcHRyKys7Ci0KLSNlbHNlCS8qIE1BTExPQ19DSEVDSyAqLwotCi0gIHBhZ2VfdHlwZSAqcHRyOwotCi0gIHB0ciA9IHhtYWxsb2MgKFBBR0VfVVNJWkUpOwotICBtZW1zZXQgKHB0ciwgMCwgUEFHRV9VU0laRSk7Ci0gIHJldHVybiBwdHI7Ci0KLSNlbmRpZgkvKiBNQUxMT0NfQ0hFQ0sgKi8KLX0KLQwKLS8qIEFsbG9jYXRlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgc2NvcGVfdCAqCi1hbGxvY2F0ZV9zY29wZSAoKQotewotICByZWdpc3RlciBzY29wZV90ICpwdHI7Ci0gIHN0YXRpYyBzY29wZV90IGluaXRpYWxfc2NvcGU7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcHRyID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uZnJlZV9saXN0LmZfc2NvcGU7Ci0gIGlmIChwdHIgIT0gKHNjb3BlX3QgKikgTlVMTCkKLSAgICBhbGxvY19jb3VudHNbIChpbnQpYWxsb2NfdHlwZV9zY29wZSBdLmZyZWVfbGlzdC5mX3Njb3BlID0gcHRyLT5mcmVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkCT0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udW5hbGxvY2F0ZWQ7Ci0gICAgICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlCT0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uY3VyX3BhZ2U7Ci0KLSAgICAgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotCXsKLQkgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChzY29wZV90KTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udG90YWxfcGFnZXMrKzsKLQl9Ci0KLSAgICAgIHB0ciA9ICZjdXJfcGFnZS0+c2NvcGVbLS11bmFsbG9jYXRlZF07Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotICAgIH0KLQotI2Vsc2UKLQotICBwdHIgPSAoc2NvcGVfdCAqKSB4bWFsbG9jIChzaXplb2YgKHNjb3BlX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfc2NvcGU7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIEZyZWUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX3Njb3BlIChwdHIpCi0gICAgIHNjb3BlX3QgKnB0cjsKLXsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udG90YWxfZnJlZSsrOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotICBwdHItPmZyZWUgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5mcmVlX2xpc3QuZl9zY29wZTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uZnJlZV9saXN0LmZfc2NvcGUgPSBwdHI7Ci0jZWxzZQotICBmcmVlICgoUFRSKSBwdHIpOwotI2VuZGlmCi19Ci0MCi0vKiBBbGxvY2F0ZSBsaW5rcyBmb3IgcGFnZXMgaW4gYSB2aXJ0dWFsIGFycmF5LiAgKi8KLQotc3RhdGljIHZsaW5rc190ICoKLWFsbG9jYXRlX3ZsaW5rcyAoKQotewotICByZWdpc3RlciB2bGlua3NfdCAqcHRyOwotICBzdGF0aWMgdmxpbmtzX3QgaW5pdGlhbF92bGlua3M7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh2bGlua3NfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT52bGlua3NbLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9ICh2bGlua3NfdCAqKSB4bWFsbG9jIChzaXplb2YgKHZsaW5rc190KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF92bGlua3M7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBzdHJpbmcgaGFzaCBidWNrZXRzLiAgKi8KLQotc3RhdGljIHNoYXNoX3QgKgotYWxsb2NhdGVfc2hhc2ggKCkKLXsKLSAgcmVnaXN0ZXIgc2hhc2hfdCAqcHRyOwotICBzdGF0aWMgc2hhc2hfdCBpbml0aWFsX3NoYXNoOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHNoYXNoX3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPnNoYXNoWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9IChzaGFzaF90ICopIHhtYWxsb2MgKHNpemVvZiAoc2hhc2hfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF9zaGFzaDsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIEFsbG9jYXRlIHR5cGUgaGFzaCBidWNrZXRzLiAgKi8KLQotc3RhdGljIHRoYXNoX3QgKgotYWxsb2NhdGVfdGhhc2ggKCkKLXsKLSAgcmVnaXN0ZXIgdGhhc2hfdCAqcHRyOwotICBzdGF0aWMgdGhhc2hfdCBpbml0aWFsX3RoYXNoOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHRoYXNoX3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPnRoYXNoWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9ICh0aGFzaF90ICopIHhtYWxsb2MgKHNpemVvZiAodGhhc2hfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF90aGFzaDsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIEFsbG9jYXRlIHN0cnVjdHVyZSwgdW5pb24sIG9yIGVudW0gdGFnIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHRhZ190ICoKLWFsbG9jYXRlX3RhZyAoKQotewotICByZWdpc3RlciB0YWdfdCAqcHRyOwotICBzdGF0aWMgdGFnX3QgaW5pdGlhbF90YWc7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcHRyID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZzsKLSAgaWYgKHB0ciAhPSAodGFnX3QgKikgTlVMTCkKLSAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnID0gcHRyLT5mcmVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnVuYWxsb2NhdGVkOwotICAgICAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5jdXJfcGFnZTsKLQotICAgICAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0JewotCSAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHRhZ190KTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS50b3RhbF9wYWdlcysrOwotCX0KLQotICAgICAgcHRyID0gJmN1cl9wYWdlLT50YWdbLS11bmFsbG9jYXRlZF07Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLSAgICB9Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHRhZ190ICopIHhtYWxsb2MgKHNpemVvZiAodGFnX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3RhZzsKLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogRnJlZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfdGFnIChwdHIpCi0gICAgIHRhZ190ICpwdHI7Ci17Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS50b3RhbF9mcmVlKys7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0gIHB0ci0+ZnJlZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWc7Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWcgPSBwdHI7Ci0jZWxzZQotICBmcmVlICgoUFRSX1QpIHB0cik7Ci0jZW5kaWYKLX0KLQwKLS8qIEFsbG9jYXRlIGZvcndhcmQgcmVmZXJlbmNlIHRvIGEgeWV0IHVua25vd24gdGFnLiAgKi8KLQotc3RhdGljIGZvcndhcmRfdCAqCi1hbGxvY2F0ZV9mb3J3YXJkICgpCi17Ci0gIHJlZ2lzdGVyIGZvcndhcmRfdCAqcHRyOwotICBzdGF0aWMgZm9yd2FyZF90IGluaXRpYWxfZm9yd2FyZDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAoZm9yd2FyZF90KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+Zm9yd2FyZFstLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9IChmb3J3YXJkX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3J3YXJkX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF9mb3J3YXJkOwotICByZXR1cm4gcHRyOwotfQotDAotLyogQWxsb2NhdGUgaGVhZCBvZiB0eXBlIGhhc2ggbGlzdC4gICovCi0KLXN0YXRpYyB0aGVhZF90ICoKLWFsbG9jYXRlX3RoZWFkICgpCi17Ci0gIHJlZ2lzdGVyIHRoZWFkX3QgKnB0cjsKLSAgc3RhdGljIHRoZWFkX3QgaW5pdGlhbF90aGVhZDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICBwdHIgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5mcmVlX2xpc3QuZl90aGVhZDsKLSAgaWYgKHB0ciAhPSAodGhlYWRfdCAqKSBOVUxMKQotICAgIGFsbG9jX2NvdW50c1sgKGludClhbGxvY190eXBlX3RoZWFkIF0uZnJlZV9saXN0LmZfdGhlYWQgPSBwdHItPmZyZWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS51bmFsbG9jYXRlZDsKLSAgICAgIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5jdXJfcGFnZTsKLQotICAgICAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0JewotCSAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHRoZWFkX3QpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS50b3RhbF9wYWdlcysrOwotCX0KLQotICAgICAgcHRyID0gJmN1cl9wYWdlLT50aGVhZFstLXVuYWxsb2NhdGVkXTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0gICAgfQotCi0jZWxzZQotCi0gIHB0ciA9ICh0aGVhZF90ICopIHhtYWxsb2MgKHNpemVvZiAodGhlYWRfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF90aGVhZDsKLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogRnJlZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfdGhlYWQgKHB0cikKLSAgICAgdGhlYWRfdCAqcHRyOwotewotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS50b3RhbF9mcmVlKys7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0gIHB0ci0+ZnJlZSA9ICh0aGVhZF90ICopIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmZyZWVfbGlzdC5mX3RoZWFkOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5mcmVlX2xpc3QuZl90aGVhZCA9IHB0cjsKLSNlbHNlCi0gIGZyZWUgKChQVFJfVCkgcHRyKTsKLSNlbmRpZgotfQotDAotc3RhdGljIGxpbmVub19saXN0X3QgKgotYWxsb2NhdGVfbGluZW5vX2xpc3QgKCkKLXsKLSAgcmVnaXN0ZXIgbGluZW5vX2xpc3RfdCAqcHRyOwotICBzdGF0aWMgbGluZW5vX2xpc3RfdCBpbml0aWFsX2xpbmVub19saXN0OwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAobGluZW5vX2xpc3RfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT5saW5lbm9bLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotCi0jZWxzZQotCi0gIHB0ciA9IChsaW5lbm9fbGlzdF90ICopIHhtYWxsb2MgKHNpemVvZiAobGluZW5vX2xpc3RfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfbGluZW5vX2xpc3Q7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLXZvaWQKLWVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSAoc3opCi0gICAgIGludCBzejsKLXsKLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAwKQotICAgIHJldHVybjsKLQotICBjdXJfcHJvY19wdHItPnBkci5ncF9wcm9sb2d1ZSA9IHN6OwotICBpZiAoY3VyX3Byb2NfcHRyLT5wZHIuZ3BfcHJvbG9ndWUgIT0gc3opCi0gICAgewotICAgICAgYXNfd2FybiAoXygiR1AgcHJvbG9ndWUgc2l6ZSBleGNlZWRzIGZpZWxkIHNpemUsIHVzaW5nIDAgaW5zdGVhZCIpKTsKLSAgICAgIGN1cl9wcm9jX3B0ci0+cGRyLmdwX3Byb2xvZ3VlID0gMDsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZ3BfdXNlZCA9IDE7Ci19Ci0KLWludCAKLWVjb2ZmX25vX2N1cnJlbnRfZmlsZSAoKQotewotICByZXR1cm4gY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTDsKLX0KLQotdm9pZAotZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKQotewotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICBjaGFyICpmaWxlbmFtZTsKLSAgbGluZW5vX2xpc3RfdCAqbGlzdDsKLQotICBhc193aGVyZSAoJmZpbGVuYW1lLCAmbGluZW5vKTsKLQotICBpZiAoY3VycmVudF9zdGFic19maWxlbmFtZSA9PSAoY2hhciAqKU5VTEwKLSAgICAgIHx8IHN0cmNtcCAoY3VycmVudF9zdGFic19maWxlbmFtZSwgZmlsZW5hbWUpKQotICAgIGFkZF9maWxlIChmaWxlbmFtZSwgMCwgMSk7Ci0KLSAgbGlzdCA9IGFsbG9jYXRlX2xpbmVub19saXN0ICgpOwotCi0gIGxpc3QtPm5leHQgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICBsaXN0LT5maWxlID0gY3VyX2ZpbGVfcHRyOwotICBsaXN0LT5wcm9jID0gY3VyX3Byb2NfcHRyOwotICBsaXN0LT5mcmFnID0gZnJhZ19ub3c7Ci0gIGxpc3QtPnBhZGRyID0gZnJhZ19ub3dfZml4ICgpOwotICBsaXN0LT5saW5lbm8gPSBsaW5lbm87Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBtZXJnZSBmaWxlcyB3aGljaCBoYXZlIGxpbmUgbnVtYmVycy4gICovCi0gIGN1cl9maWxlX3B0ci0+ZmRyLmZNZXJnZSA9IDA7Ci0KLSAgLyogQSAubG9jIGRpcmVjdGl2ZSB3aWxsIHNvbWV0aW1lcyBhcHBlYXIgYmVmb3JlIGEgLmVudCBkaXJlY3RpdmUsCi0gICAgIHdoaWNoIG1lYW5zIHRoYXQgY3VyX3Byb2NfcHRyIHdpbGwgYmUgTlVMTCBoZXJlLiAgQXJyYW5nZSB0bwotICAgICBwYXRjaCB0aGlzIHVwLiAgKi8KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgbGluZW5vX2xpc3RfdCAqKnBsOwotCi0gICAgICBwbCA9ICZub3Byb2NfbGluZW5vOwotICAgICAgd2hpbGUgKCpwbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotICAgICAgICBwbCA9ICYoKnBsKS0+bmV4dDsKLSAgICAgICpwbCA9IGxpc3Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGFzdF9saW5lbm8gPSBsaXN0OwotICAgICAgKmxhc3RfbGluZW5vX3B0ciA9IGxpc3Q7Ci0gICAgICBsYXN0X2xpbmVub19wdHIgPSAmbGlzdC0+bmV4dDsKLSAgICB9Ci19Ci0KLSNlbHNlCi0KLXZvaWQKLWVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gKCkKLXsKLX0KLQotI2VuZGlmIC8qIEVDT0ZGX0RFQlVHR0lORyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Vjb2ZmLmggYi9nYXMvZWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjNjVmOC4uMDAwMDAwMAotLS0gYS9nYXMvZWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKiBlY29mZi5oIC0tIGhlYWRlciBmaWxlIGZvciBFQ09GRiBkZWJ1Z2dpbmcgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFB1dCB0b2dldGhlciBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgR0FTX0VDT0ZGX0gKLSNkZWZpbmUgR0FTX0VDT0ZGX0gKLQotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBzZWVuIGFueSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGludCBlY29mZl9kZWJ1Z2dpbmdfc2VlbjsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhc3NlbWJseSwgYnkKLSAgIG9ial9yZWFkX2JlZ2luX2hvb2suICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfcmVhZF9iZWdpbl9ob29rIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBzd2l0Y2hlcyB0byBhIG5ldwotICAgZmlsZS4gICovCi1leHRlcm4gdm9pZCBlY29mZl9uZXdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBuZXcgc3ltYm9sIGlzIGNyZWF0ZWQsIGJ5Ci0gICBvYmpfc3ltYm9sX25ld19ob29rLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX3N5bWJvbF9uZXdfaG9vayBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBvYmpfZnJvYl9zeW1ib2wgaG9vay4gICovCi1leHRlcm4gdm9pZCBlY29mZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogQnVpbGQgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieQotICAgb2JqX2Zyb2JfZmlsZS4gIFRoaXMgZmlsbHMgaW4gdGhlIGNvdW50cyBpbiAqSERSOyB0aGUgb2Zmc2V0cyBhcmUKLSAgIGZpbGxlZCBpbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlICpCVUZQLiAgSXQgc2V0cyAqQlVGUCB0byBhCi0gICBibG9jayBvZiBtZW1vcnkgaG9sZGluZyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSXQgcmV0dXJucyB0aGUKLSAgIGxlbmd0aCBvZiAqQlVGUC4gICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9kZWJ1ZwotICBQQVJBTVMgKChIRFJSICpoZHIsIGNoYXIgKipidWZwLCBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqKSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBkaXJlY3RpdmVzLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9iZWdpbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9iZW5kIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2VuZCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9lbnQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZm1hc2sgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZnJhbWUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfbG9jIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX21hc2sgUEFSQU1TICgoaW50KSk7Ci0KLS8qIE90aGVyIEVDT0ZGIGRpcmVjdGl2ZXMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2V4dGVybiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0IFBBUkFNUyAoKGludCkpOwotCi0vKiBGdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBDT0ZGIGRlYnVnZ2luZyBkaXJlY3RpdmVzLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9kZWYgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZGltIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2VuZGVmIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2ZpbGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfc2NsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3NpemUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfdGFnIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3R5cGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfdmFsIFBBUkFNUyAoKGludCkpOwotCi0vKiBIYW5kbGUgc3RhYnMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfc3RhYiBQQVJBTVMgKChzZWdUIHNlYywgaW50IHdoYXQsIGNvbnN0IGNoYXIgKnN0cmluZywKLQkJCQlpbnQgdHlwZSwgaW50IG90aGVyLCBpbnQgZGVzYykpOwotCi0vKiBTZXQgdGhlIEdQIHByb2xvZ3VlIHNpemUuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplIFBBUkFNUyAoKGludCBzeikpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIEVDT0ZGIGNvZGUgdG8gc2V0IHRoZSBleHRlcm5hbAotICAgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLSNpZm5kZWYgb2JqX2Vjb2ZmX3NldF9leHQKLWV4dGVybiB2b2lkIG9ial9lY29mZl9zZXRfZXh0IFBBUkFNUyAoKHN5bWJvbFMgKiwgRVhUUiAqKSk7Ci0jZW5kaWYKLQotLyogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcGF0Y2ggdXAgYSBsaW5lIG51bWJlciBkaXJlY3RpdmUgd2hlbgotICAgaW5zdHJ1Y3Rpb25zIGFyZSBtb3ZlZCBhcm91bmQuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZml4X2xvYyBQQVJBTVMgKChmcmFnUyAqLCB1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gcmVhZC5jIHRvIHBlZWsgYXQgY3VyX2ZpbGVfcHRyLiAgKi8KLWV4dGVybiBpbnQgZWNvZmZfbm9fY3VycmVudF9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHByb2MuICAqLwotZXh0ZXJuIHN5bWJvbFMgKmVjb2ZmX2dldF9jdXJfcHJvY19zeW0gUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogRUNPRkZfREVCVUdHSU5HICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSByZWFkLmMgdG8gZ2VuZXJhdGUgbGluZSBudW1iZXIgZm9yIC5zIGZpbGUuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiAhIEdBU19FQ09GRl9IICovCmRpZmYgLS1naXQgYS9nYXMvZWhvcHQuYyBiL2dhcy9laG9wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGE1ZjYyLi4wMDAwMDAwCi0tLSBhL2dhcy9laG9wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qIGVob3B0LmMtLW9wdGltaXplIGdjYyBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLS8qIFdlIGluY2x1ZGUgdGhpcyBFTEYgZmlsZSwgZXZlbiB0aG91Z2ggd2UgbWF5IG5vdCBiZSBhc3NlbWJsaW5nIGZvcgotICAgRUxGLCBzaW5jZSB0aGUgZXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uIGlzIGFsd2F5cyBpbiBhIGZvcm1hdAotICAgZGVyaXZlZCBmcm9tIERXQVJGLiAgKi8KLQotI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKLQotLyogVHJ5IHRvIG9wdGltaXplIGdjYyAyLjggZXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uLgotCi0gICBFeGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gaXMgZW1pdHRlZCBmb3IgZXZlcnkgZnVuY3Rpb24gaW4gdGhlCi0gICAuZWhfZnJhbWUgc2VjdGlvbi4gIFNpbXBsZSBpbmZvcm1hdGlvbiBmb3IgYSBmdW5jdGlvbiB3aXRoIG5vCi0gICBleGNlcHRpb25zIGxvb2tzIGxpa2UgdGhpczoKLQotX19GUkFNRV9CRUdJTl9fOgotCS40Ynl0ZQkuTExDSUUxCS8gTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQotLkxTQ0lFMToKLQkuNGJ5dGUJMHgwCS8gQ0lFIElkZW50aWZpZXIgVGFnCi0JLmJ5dGUJMHgxCS8gQ0lFIFZlcnNpb24KLQkuYnl0ZQkweDAJLyBDSUUgQXVnbWVudGF0aW9uIChub25lKQotCS5ieXRlCTB4MQkvIFVMRUIxMjggMHgxIChDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yKQotCS5ieXRlCTB4N2MJLyBTTEVCMTI4IC00IChDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yKQotCS5ieXRlCTB4OAkvIENJRSBSQSBDb2x1bW4KLQkuYnl0ZQkweGMJLyBEV19DRkFfZGVmX2NmYQotCS5ieXRlCTB4NAkvIFVMRUIxMjggMHg0Ci0JLmJ5dGUJMHg0CS8gVUxFQjEyOCAweDQKLQkuYnl0ZQkweDg4CS8gRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OAotCS5ieXRlCTB4MQkvIFVMRUIxMjggMHgxCi0JLmFsaWduIDQKLS5MRUNJRTE6Ci0JLnNldAkuTExDSUUxLC5MRUNJRTEtLkxTQ0lFMQkvIENJRSBMZW5ndGggU3ltYm9sCi0JLjRieXRlCS5MTEZERTEJLyBGREUgTGVuZ3RoCi0uTFNGREUxOgotCS40Ynl0ZQkuTFNGREUxLV9fRlJBTUVfQkVHSU5fXwkvIEZERSBDSUUgb2Zmc2V0Ci0JLjRieXRlCS5MRkIxCS8gRkRFIGluaXRpYWwgbG9jYXRpb24KLQkuNGJ5dGUJLkxGRTEtLkxGQjEJLyBGREUgYWRkcmVzcyByYW5nZQotCS5ieXRlCTB4NAkvIERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuNGJ5dGUJLkxDRkkwLS5MRkIxCi0JLmJ5dGUJMHhlCS8gRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0Ci0JLmJ5dGUJMHg4CS8gVUxFQjEyOCAweDgKLQkuYnl0ZQkweDg1CS8gRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NQotCS5ieXRlCTB4MgkvIFVMRUIxMjggMHgyCi0JLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkuTENGSTEtLkxDRkkwCi0JLmJ5dGUJMHhkCS8gRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIKLQkuYnl0ZQkweDUJLyBVTEVCMTI4IDB4NQotCS5ieXRlCTB4NAkvIERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuNGJ5dGUJLkxDRkkyLS5MQ0ZJMQotCS5ieXRlCTB4MmUJLyBEV19DRkFfR05VX2FyZ3Nfc2l6ZQotCS5ieXRlCTB4NAkvIFVMRUIxMjggMHg0Ci0JLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkuTENGSTMtLkxDRkkyCi0JLmJ5dGUJMHgyZQkvIERXX0NGQV9HTlVfYXJnc19zaXplCi0JLmJ5dGUJMHgwCS8gVUxFQjEyOCAweDAKLQkuYWxpZ24gNAotLkxFRkRFMToKLQkuc2V0CS5MTEZERTEsLkxFRkRFMS0uTFNGREUxCS8gRkRFIExlbmd0aCBTeW1ib2wKLQotICAgVGhlIGltbWVkaWF0ZSBpc3N1ZSB3ZSBjYW4gYWRkcmVzcyBpbiB0aGUgYXNzZW1ibGVyIGlzIHRoZQotICAgRFdfQ0ZBX2FkdmFuY2VfbG9jNCBmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSB2YWx1ZS4gIFRoZSB2YWx1ZSBpcwotICAgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGFkZHJlc3NlcyBpbiB0aGUgZnVuY3Rpb24uICBTaW5jZSBnY2MgZG9lcwotICAgbm90IGtub3cgdGhpcyB2YWx1ZSwgaXQgYWx3YXlzIHVzZXMgZm91ciBieXRlcy4gIFdlIHdpbGwga25vdyB0aGUKLSAgIHZhbHVlIGF0IHRoZSBlbmQgb2YgYXNzZW1ibHksIHNvIHdlIGNhbiBkbyBiZXR0ZXIuICAqLwotCi1zdGF0aWMgaW50IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogR2V0IHRoZSBjb2RlIGFsaWdubWVudCBmYWN0b3IgZnJvbSB0aGUgQ0lFLiAgKi8KLQotc3RhdGljIGludAotZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCkKLXsKLSAgc3RhdGljIGludCBjb2RlX2FsaWdubWVudDsKLSAgc2VnVCBjdXJyZW50X3NlZzsKLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZzsKLSAgZnJhZ1MgKmY7Ci0gIGZpeFMgKmZpeDsKLSAgaW50IG9mZnNldDsKLSAgY2hhciBhdWdtZW50YXRpb25bMTBdOwotICBpbnQgaWF1ZzsKLQotICBpZiAoY29kZV9hbGlnbm1lbnQgIT0gMCkKLSAgICByZXR1cm4gY29kZV9hbGlnbm1lbnQ7Ci0KLSAgLyogV2Ugc2hvdWxkIGZpbmQgdGhlIENJRSBhdCB0aGUgc3RhcnQgb2YgdGhlIC5laF9mcmFtZSBzZWN0aW9uLiAgKi8KLQotICBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0gIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgc3Vic2VnX25ldyAoIi5laF9mcmFtZSIsIDApOwotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8IGRlZmluZWQgKE1BTllfU0VHTUVOVFMpCi0gIGYgPSBzZWdfaW5mbyAobm93X3NlZyktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0jZWxzZQotICBmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsKLSNlbmRpZgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZml4ID0gc2VnX2luZm8gKG5vd19zZWcpLT5mcmNoYWluUC0+Zml4X3Jvb3Q7Ci0jZWxzZQotICBmaXggPSAqc2VnX2ZpeF9yb290UDsKLSNlbmRpZgotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgZnJhZ3Mgb2YgdGhlIHNlY3Rpb24gdG8gZmluZCB0aGUgY29kZSBhbGlnbm1lbnQuICAqLwotCi0gIC8qIEZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBDSUUgSWRlbnRpZmllciBUYWcgaXMgMC4gICovCi0KLSAgb2Zmc2V0ID0gNDsKLSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotICAgIHsKLSAgICAgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0gICAgICBmID0gZi0+ZnJfbmV4dDsKLSAgICB9Ci0gIGlmIChmID09IE5VTEwKLSAgICAgIHx8IGYtPmZyX2ZpeCAtIG9mZnNldCA8IDQKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAhPSAwCi0gICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldCArIDFdICE9IDAKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gIT0gMAotICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSAhPSAwKQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIE5leHQgbWFrZSBzdXJlIHRoZSBDSUUgdmVyc2lvbiBudW1iZXIgaXMgMS4gICovCi0KLSAgb2Zmc2V0ICs9IDQ7Ci0gIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKLSAgICB7Ci0gICAgICBvZmZzZXQgLT0gZi0+ZnJfZml4OwotICAgICAgZiA9IGYtPmZyX25leHQ7Ci0gICAgfQotICBpZiAoZiA9PSBOVUxMCi0gICAgICB8fCBmLT5mcl9maXggLSBvZmZzZXQgPCAxCi0gICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldF0gIT0gMSkKLSAgICB7Ci0gICAgICBjb2RlX2FsaWdubWVudCA9IC0xOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBTa2lwIHRoZSBhdWdtZW50YXRpb24gKGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZykuICAqLwotCi0gIGlhdWcgPSAwOwotICArK29mZnNldDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotCXsKLQkgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0JICBmID0gZi0+ZnJfbmV4dDsKLQl9Ci0gICAgICBpZiAoZiA9PSBOVUxMKQotCXsKLQkgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgd2hpbGUgKG9mZnNldCA8IGYtPmZyX2ZpeCAmJiBmLT5mcl9saXRlcmFsW29mZnNldF0gIT0gJ1wwJykKLQl7Ci0JICBpZiAoKHNpemVfdCkgaWF1ZyA8IChzaXplb2YgYXVnbWVudGF0aW9uKSAtIDEpCi0JICAgIHsKLQkgICAgICBhdWdtZW50YXRpb25baWF1Z10gPSBmLT5mcl9saXRlcmFsW29mZnNldF07Ci0JICAgICAgKytpYXVnOwotCSAgICB9Ci0JICArK29mZnNldDsKLQl9Ci0gICAgICBpZiAob2Zmc2V0IDwgZi0+ZnJfZml4KQotCWJyZWFrOwotICAgIH0KLSAgKytvZmZzZXQ7Ci0gIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKLSAgICB7Ci0gICAgICBvZmZzZXQgLT0gZi0+ZnJfZml4OwotICAgICAgZiA9IGYtPmZyX25leHQ7Ci0gICAgfQotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGF1Z21lbnRhdGlvbltpYXVnXSA9ICdcMCc7Ci0gIGlmIChhdWdtZW50YXRpb25bMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBObyBhdWdtZW50YXRpb24uICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhdWdtZW50YXRpb24sICJlaCIpID09IDApCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBza2lwIGEgcG9pbnRlci4gIFVuZm9ydHVuYXRlbHksIHdlIGRvbid0IGtub3cgaG93Ci0JIGxhcmdlIGl0IGlzLiAgV2UgZmluZCBvdXQgYnkgbG9va2luZyBmb3IgYSBtYXRjaGluZyBmaXh1cC4gICovCi0gICAgICB3aGlsZSAoZml4ICE9IE5VTEwKLQkgICAgICYmIChmaXgtPmZ4X2ZyYWcgIT0gZiB8fCBmaXgtPmZ4X3doZXJlICE9IG9mZnNldCkpCi0JZml4ID0gZml4LT5meF9uZXh0OwotICAgICAgaWYgKGZpeCA9PSBOVUxMKQotCW9mZnNldCArPSA0OwotICAgICAgZWxzZQotCW9mZnNldCArPSBmaXgtPmZ4X3NpemU7Ci0gICAgICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCi0JewotCSAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKLQkgIGYgPSBmLT5mcl9uZXh0OwotCX0KLSAgICAgIGlmIChmID09IE5VTEwpCi0JewotCSAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogV2UncmUgbm93IGF0IHRoZSBjb2RlIGFsaWdubWVudCBmYWN0b3IsIHdoaWNoIGlzIGEgVUxFQjEyOC4gIElmCi0gICAgIGl0IGlzbid0IGEgc2luZ2xlIGJ5dGUsIGZvcmdldCBpdC4gICovCi0KLSAgY29kZV9hbGlnbm1lbnQgPSBmLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotICBpZiAoKGNvZGVfYWxpZ25tZW50ICYgMHg4MCkgIT0gMCB8fCBjb2RlX2FsaWdubWVudCA9PSAwKQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBjb2RlX2FsaWdubWVudDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBlbWl0X2V4cHIuICBJdCBsb29rcyBmb3IgY2FzZXMgd2hpY2gKLSAgIHdlIGNhbiBvcHRpbWl6ZS4KLQotICAgUmF0aGVyIHRoYW4gdHJ5IHRvIHBhcnNlIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFzIHdlIHJlYWQgaXQsIHdlCi0gICBsb29rIGZvciBhIHNpbmdsZSBieXRlIERXX0NGQV9hZHZhbmNlX2xvYzQgZm9sbG93ZWQgYnkgYSA0IGJ5dGUKLSAgIGRpZmZlcmVuY2UuICBXZSB0dXJuIHRoYXQgaW50byBhIHJzX2NmYV9hZHZhbmNlIGZyYWcsIGFuZCBoYW5kbGUKLSAgIHRob3NlIGZyYWdzIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LiAgSWYgdGhlIGdjYyBvdXRwdXQgY2hhbmdlcwotICAgc29tZXdoYXQsIHRoaXMgb3B0aW1pemF0aW9uIG1heSBzdG9wIHdvcmtpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiBpdCBoYW5kbGVkIHRoZSBleHByZXNzaW9uIGFuZAotICAgZW1pdF9leHByIHNob3VsZCBub3QgZG8gYW55dGhpbmcsIG9yIHplcm8gb3RoZXJ3aXNlLiAgSXQgY2FuIGFsc28KLSAgIGNoYW5nZSAqRVhQIGFuZCAqUE5CWVRFUy4gICovCi0KLWludAotY2hlY2tfZWhfZnJhbWUgKGV4cCwgcG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50ICpwbmJ5dGVzOwotewotICBzdGF0aWMgaW50IHNhd19zaXplOwotICBzdGF0aWMgc3ltYm9sUyAqc2l6ZV9lbmRfc3ltOwotICBzdGF0aWMgaW50IHNhd19hZHZhbmNlX2xvYzQ7Ci0gIHN0YXRpYyBmcmFnUyAqbG9jNF9mcmFnOwotICBzdGF0aWMgaW50IGxvYzRfZml4OwotCi0gIGlmIChzYXdfc2l6ZQotICAgICAgJiYgU19JU19ERUZJTkVEIChzaXplX2VuZF9zeW0pKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgY29tZSB0byB0aGUgZW5kIG9mIHRoZSBDSUUgb3IgRkRFLiAgU2VlIGJlbG93IHdoZXJlCi0gICAgICAgICB3ZSBzZXQgc2F3X3NpemUuICBXZSBtdXN0IGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZSB3ZSBtYXkgbm93Ci0gICAgICAgICBiZSBsb29raW5nIGF0IHRoZSBuZXh0IHNpemUuICAqLwotICAgICAgc2F3X3NpemUgPSAwOwotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0gICAgfQotCi0gIGlmIChmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBvcHRpbWl6ZS4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZWhfZnJhbWUiKSAhPSAwKQotICAgIHsKLSAgICAgIHNhd19zaXplID0gMDsKLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoISBzYXdfc2l6ZQotCSAgICYmICpwbmJ5dGVzID09IDQpCi0gICAgewotICAgICAgLyogVGhpcyBtaWdodCBiZSB0aGUgc2l6ZSBvZiB0aGUgQ0lFIG9yIEZERS4gIFdlIHdhbnQgdG8ga25vdwotICAgICAgICAgdGhlIHNpemUgc28gdGhhdCB3ZSBkb24ndCBhY2NpZGVudGFsbHkgb3B0aW1pemUgYWNyb3NzIGFuIEZERQotICAgICAgICAgYm91bmRhcnkuICBXZSByZWNvZ25pemUgdGhlIHNpemUgaW4gb25lIG9mIHR3byBmb3JtczogYQotICAgICAgICAgc3ltYm9sIHdoaWNoIHdpbGwgbGF0ZXIgYmUgZGVmaW5lZCBhcyBhIGRpZmZlcmVuY2UsIG9yIGEKLSAgICAgICAgIHN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzLiAgRWl0aGVyIHdheSwgd2UgY2FuIHRlbGwgd2hlbiB3ZQotICAgICAgICAgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIEZERSBiZWNhdXNlIHRoZSBzeW1ib2wgYmVjb21lcyBkZWZpbmVkCi0gICAgICAgICAoaW4gdGhlIGNhc2Ugb2YgYSBzdWJ0cmFjdGlvbiwgdGhlIGVuZCBzeW1ib2wsIGZyb20gd2hpY2ggdGhlCi0gICAgICAgICBzdGFydCBzeW1ib2wgaXMgYmVpbmcgc3VidHJhY3RlZCkuICBPdGhlciB3YXlzIG9mIGRlc2NyaWJpbmcKLSAgICAgICAgIHRoZSBzaXplIHdpbGwgbm90IGJlIG9wdGltaXplZC4gICovCi0gICAgICBpZiAoKGV4cC0+WF9vcCA9PSBPX3N5bWJvbCB8fCBleHAtPlhfb3AgPT0gT19zdWJ0cmFjdCkKLQkgICYmICEgU19JU19ERUZJTkVEIChleHAtPlhfYWRkX3N5bWJvbCkpCi0JewotCSAgc2F3X3NpemUgPSAxOwotCSAgc2l6ZV9lbmRfc3ltID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc2F3X3NpemUKLQkgICAmJiAqcG5ieXRlcyA9PSAxCi0JICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSBEV19DRkFfYWR2YW5jZV9sb2M0KQotICAgIHsKLSAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBEV19DRkFfYWR2YW5jZV9sb2M0LiAgUmVjb3JkIHRoZSBmcmFnIGFuZCB0aGUKLSAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiB0aGUgZnJhZywgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIGl0IGxhdGVyLiAgKi8KLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAxOwotICAgICAgZnJhZ19ncm93ICgxKTsKLSAgICAgIGxvYzRfZnJhZyA9IGZyYWdfbm93OwotICAgICAgbG9jNF9maXggPSBmcmFnX25vd19maXggKCk7Ci0gICAgfQotICBlbHNlIGlmIChzYXdfYWR2YW5jZV9sb2M0Ci0JICAgJiYgKnBuYnl0ZXMgPT0gNAotCSAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGludCBjYTsKLQotICAgICAgLyogVGhpcyBpcyBhIGNhc2Ugd2hpY2ggd2UgY2FuIG9wdGltaXplLiAgVGhlIHR3byBzeW1ib2xzIGJlaW5nCi0gICAgICAgICBzdWJ0cmFjdGVkIHdlcmUgaW4gdGhlIHNhbWUgZnJhZyBhbmQgdGhlIGV4cHJlc3Npb24gd2FzCi0gICAgICAgICByZWR1Y2VkIHRvIGEgY29uc3RhbnQuICBXZSBjYW4gZG8gdGhlIG9wdGltaXphdGlvbiBlbnRpcmVseQotICAgICAgICAgaW4gdGhpcyBmdW5jdGlvbi4gICovCi0KLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOwotCi0gICAgICBjYSA9IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50ICgpOwotICAgICAgaWYgKGNhIDwgMCkKLQl7Ci0JICAvKiBEb24ndCBvcHRpbWl6ZS4gICovCi0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9udW1iZXIgJSBjYSA9PSAwCi0JICAgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyIC8gY2EgPCAweDQwKQotCXsKLQkgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0KLQkgICAgPSBEV19DRkFfYWR2YW5jZV9sb2MgfCAoZXhwLT5YX2FkZF9udW1iZXIgLyBjYSk7Ci0JICAvKiBObyBtb3JlIGJ5dGVzIG5lZWRlZC4gICovCi0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChleHAtPlhfYWRkX251bWJlciA8IDB4MTAwKQotCXsKLQkgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MxOwotCSAgKnBuYnl0ZXMgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMjsKLQkgICpwbmJ5dGVzID0gMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzYXdfYWR2YW5jZV9sb2M0Ci0JICAgJiYgKnBuYnl0ZXMgPT0gNAotCSAgICYmIGV4cC0+WF9vcCA9PSBPX3N1YnRyYWN0KQotICAgIHsKLQotICAgICAgLyogVGhpcyBpcyBhIGNhc2Ugd2UgY2FuIG9wdGltaXplLiAgVGhlIGV4cHJlc3Npb24gd2FzIG5vdAotICAgICAgICAgcmVkdWNlZCwgc28gd2UgY2FuIG5vdCBmaW5pc2ggdGhlIG9wdGltaXphdGlvbiB1bnRpbCB0aGUgZW5kCi0gICAgICAgICBvZiB0aGUgYXNzZW1ibHkuICBXZSBzZXQgdXAgYSB2YXJpYW50IGZyYWcgd2hpY2ggd2UgaGFuZGxlCi0gICAgICAgICBsYXRlci4gICovCi0KLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOwotCi0gICAgICBmcmFnX3ZhciAocnNfY2ZhLCA0LCAwLCAwLCBtYWtlX2V4cHJfc3ltYm9sIChleHApLAotCQlsb2M0X2ZpeCwgKGNoYXIgKikgbG9jNF9mcmFnKTsKLQotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIHNpemUgb2YgYSByc19jZmEgdmFyaWFudCBmcmFnIGJhc2VkIG9uCi0gICB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMuICBJdCBpcyBjYWxsZWQgYmVmb3JlIHRoZQotICAgcmVsYXhhdGlvbiBsb29wLiAgV2Ugc2V0IGZyX3N1YnR5cGUgdG8gdGhlIGV4cGVjdGVkIGxlbmd0aC4gICovCi0KLWludAotZWhfZnJhbWVfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBpbnQgY2E7Ci0gIG9mZnNldFQgZGlmZjsKLSAgaW50IHJldDsKLQotICBjYSA9IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50ICgpOwotICBkaWZmID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWctPmZyX3N5bWJvbCwgMCk7Ci0KLSAgaWYgKGNhIDwgMCkKLSAgICByZXQgPSA0OwotICBlbHNlIGlmIChkaWZmICUgY2EgPT0gMCAmJiBkaWZmIC8gY2EgPCAweDQwKQotICAgIHJldCA9IDA7Ci0gIGVsc2UgaWYgKGRpZmYgPCAweDEwMCkKLSAgICByZXQgPSAxOwotICBlbHNlIGlmIChkaWZmIDwgMHgxMDAwMCkKLSAgICByZXQgPSAyOwotICBlbHNlCi0gICAgcmV0ID0gNDsKLQotICBmcmFnLT5mcl9zdWJ0eXBlID0gcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmVsYXhlcyBhIHJzX2NmYSB2YXJpYW50IGZyYWcgYmFzZWQgb24gdGhlIGN1cnJlbnQKLSAgIHZhbHVlcyBvZiB0aGUgc3ltYm9scy4gIGZyX3N1YnR5cGUgaXMgdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZQotICAgZnJhZy4gIFRoaXMgcmV0dXJucyB0aGUgY2hhbmdlIGluIGZyYWcgbGVuZ3RoLiAgKi8KLQotaW50Ci1laF9mcmFtZV9yZWxheF9mcmFnIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaW50IG9sZHNpemUsIG5ld3NpemU7Ci0KLSAgb2xkc2l6ZSA9IGZyYWctPmZyX3N1YnR5cGU7Ci0gIG5ld3NpemUgPSBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZyk7Ci0gIHJldHVybiBuZXdzaXplIC0gb2xkc2l6ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHJzX2NmYSB2YXJpYW50IGZyYWcgaW50byBhIG5vcm1hbCBmaWxsCi0gICBmcmFnLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHJlbGF4YXRpb24gaGFzIGJlZW4gZG9uZS4KLSAgIGZyX3N1YnR5cGUgd2lsbCBiZSB0aGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIGZyYWcuICAqLwotCi12b2lkCi1laF9mcmFtZV9jb252ZXJ0X2ZyYWcgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBvZmZzZXRUIGRpZmY7Ci0gIGZyYWdTICpsb2M0X2ZyYWc7Ci0gIGludCBsb2M0X2ZpeDsKLQotICBsb2M0X2ZyYWcgPSAoZnJhZ1MgKikgZnJhZy0+ZnJfb3Bjb2RlOwotICBsb2M0X2ZpeCA9IChpbnQpIGZyYWctPmZyX29mZnNldDsKLQotICBkaWZmID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWctPmZyX3N5bWJvbCwgMSk7Ci0KLSAgaWYgKGZyYWctPmZyX3N1YnR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgY2E7Ci0KLSAgICAgIGNhID0gZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCk7Ci0gICAgICBhc3NlcnQgKGNhID4gMCAmJiBkaWZmICUgY2EgPT0gMCAmJiBkaWZmIC8gY2EgPCAweDQwKTsKLSAgICAgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MgfCAoZGlmZiAvIGNhKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWctPmZyX3N1YnR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGRpZmYgPCAweDEwMCk7Ci0gICAgICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMTsKLSAgICAgIGZyYWctPmZyX2xpdGVyYWxbZnJhZy0+ZnJfZml4XSA9IGRpZmY7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgYXNzZXJ0IChkaWZmIDwgMHgxMDAwMCk7Ci0gICAgICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMjsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZy0+ZnJfbGl0ZXJhbCArIGZyYWctPmZyX2ZpeCwgZGlmZiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnLT5mcl9saXRlcmFsICsgZnJhZy0+ZnJfZml4LCBkaWZmLCA0KTsKLQotICBmcmFnLT5mcl9maXggKz0gZnJhZy0+ZnJfc3VidHlwZTsKLSAgZnJhZy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0gIGZyYWctPmZyX29mZnNldCA9IDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvZW11bC10YXJnZXQuaCBiL2dhcy9lbXVsLXRhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzA0MDUwLi4wMDAwMDAwCi0tLSBhL2dhcy9lbXVsLXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotI2lmbmRlZiBlbXVsX2luaXQKLSNkZWZpbmUgZW11bF9pbml0CQkJY29tbW9uX2VtdWxfaW5pdAotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2JmZF9uYW1lCQkJZGVmYXVsdF9lbXVsX2JmZF9uYW1lCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2xvY2FsX2xhYmVsc19mYgotI2RlZmluZSBlbXVsX2xvY2FsX2xhYmVsc19mYgkJMAotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9sb2NhbF9sYWJlbHNfZG9sbGFyCi0jZGVmaW5lIGVtdWxfbG9jYWxfbGFiZWxzX2RvbGxhcgkwCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2xlYWRpbmdfdW5kZXJzY29yZQotI2RlZmluZSBlbXVsX2xlYWRpbmdfdW5kZXJzY29yZQkJMgotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9zdHJpcF91bmRlcnNjb3JlCi0jZGVmaW5lIGVtdWxfc3RyaXBfdW5kZXJzY29yZQkJMAotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9kZWZhdWx0X2VuZGlhbgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuCQkyCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2Zha2VfbGFiZWxfbmFtZQotI2RlZmluZSBlbXVsX2Zha2VfbGFiZWxfbmFtZQkJMAotI2VuZGlmCi0KLXN0cnVjdCBlbXVsYXRpb24gZW11bF9zdHJ1Y3RfbmFtZSA9IHsKLSAgMCwKLSAgZW11bF9uYW1lLAotICBlbXVsX2luaXQsCi0gIGVtdWxfYmZkX25hbWUsCi0gIGVtdWxfbG9jYWxfbGFiZWxzX2ZiLCBlbXVsX2xvY2FsX2xhYmVsc19kb2xsYXIsCi0gIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlLCBlbXVsX3N0cmlwX3VuZGVyc2NvcmUsCi0gIGVtdWxfZGVmYXVsdF9lbmRpYW4sCi0gIGVtdWxfZmFrZV9sYWJlbF9uYW1lLAotICBlbXVsX2Zvcm1hdCwKLX07CmRpZmYgLS1naXQgYS9nYXMvZW11bC5oIGIvZ2FzL2VtdWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjNDZkOC4uMDAwMDAwMAotLS0gYS9nYXMvZW11bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2lmbmRlZiBFTVVMX0RFRlMKLSNkZWZpbmUgRU1VTF9ERUZTCi0KLXN0cnVjdCBlbXVsYXRpb24gewotICB2b2lkICgqbWF0Y2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotICBjb25zdCBjaGFyICpuYW1lOwotICB2b2lkICgqaW5pdCkgUEFSQU1TICgodm9pZCkpOwotICBjb25zdCBjaGFyICooKmJmZF9uYW1lKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIHVuc2lnbmVkIGxvY2FsX2xhYmVsc19mYiA6IDE7Ci0gIHVuc2lnbmVkIGxvY2FsX2xhYmVsc19kb2xsYXIgOiAxOwotICB1bnNpZ25lZCBsZWFkaW5nX3VuZGVyc2NvcmUgOiAyOwotICB1bnNpZ25lZCBzdHJpcF91bmRlcnNjb3JlIDogMTsKLSAgdW5zaWduZWQgZGVmYXVsdF9lbmRpYW4gOiAyOwotICBjb25zdCBjaGFyICpmYWtlX2xhYmVsX25hbWU7Ci0gIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzICpmb3JtYXQ7Ci19OwotCi1DT01NT04gc3RydWN0IGVtdWxhdGlvbiAqdGhpc19lbXVsYXRpb247Ci0KLWV4dGVybiBjb25zdCBjaGFyICpkZWZhdWx0X2VtdWxfYmZkX25hbWUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgY29tbW9uX2VtdWxfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2V4cHIuYyBiL2dhcy9leHByLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGUyYzIuLjAwMDAwMDAKLS0tIGEvZ2FzL2V4cHIuYworKysgL2Rldi9udWxsCkBAIC0xLDE4ODcgKzAsMCBAQAotLyogZXhwci5jIC1vcGVyYW5kcywgZXhwcmVzc2lvbnMtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0gKiBUaGlzIGlzIHJlYWxseSBhIGJyYW5jaCBvZmZpY2Ugb2YgYXMtcmVhZC5jLiBJIHNwbGl0IGl0IG91dCB0byBjbGVhcmx5Ci0gKiBkaXN0aW5ndWlzaCB0aGUgd29ybGQgb2YgZXhwcmVzc2lvbnMgZnJvbSB0aGUgd29ybGQgb2Ygc3RhdGVtZW50cy4KLSAqIChJdCBhbHNvIGdpdmVzIHNtYWxsZXIgZmlsZXMgdG8gcmUtY29tcGlsZS4pCi0gKiBIZXJlLCAib3BlcmFuZCJzIGFyZSBvZiBleHByZXNzaW9ucywgbm90IGluc3RydWN0aW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgbWluKGEsIGIpICAgICAgICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotc3RhdGljIHZvaWQgZmxvYXRpbmdfY29uc3RhbnQgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotc3RhdGljIHZhbHVlVCBnZW5lcmljX2JpZ251bV90b19pbnQzMiBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZkZWYgQkZENjQKLXN0YXRpYyB2YWx1ZVQgZ2VuZXJpY19iaWdudW1fdG9faW50NjQgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBpbnRlZ2VyX2NvbnN0YW50IFBBUkFNUyAoKGludCByYWRpeCwgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotc3RhdGljIHZvaWQgbXJpX2NoYXJfY29uc3RhbnQgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgY3VycmVudF9sb2NhdGlvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbl91cF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLXN0YXRpYyBzZWdUIG9wZXJhbmQgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIG9wZXJhdG9yVCBvcGVyYXRvciBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiBjb25zdCBjaGFyIEVYUF9DSEFSU1tdLCBGTFRfQ0hBUlNbXTsKLQotLyogV2Uga2VlcCBhIG1hcHBpbmcgb2YgZXhwcmVzc2lvbiBzeW1ib2xzIHRvIGZpbGUgcG9zaXRpb25zLCBzbyB0aGF0Ci0gICB3ZSBjYW4gcHJvdmlkZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuICAqLwotCi1zdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZQotewotICBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbmV4dDsKLSAgc3ltYm9sUyAqc3ltOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqZXhwcl9zeW1ib2xfbGluZXM7Ci0MCi0vKiBCdWlsZCBhIGR1bW15IHN5bWJvbCB0byBob2xkIGEgY29tcGxleCBleHByZXNzaW9uLiAgVGhpcyBpcyBob3cgd2UKLSAgIGJ1aWxkIGV4cHJlc3Npb25zIHVwIG91dCBvZiBvdGhlciBleHByZXNzaW9ucy4gIFRoZSBzeW1ib2wgaXMgcHV0Ci0gICBpbnRvIHRoZSBmYWtlIHNlY3Rpb24gZXhwcl9zZWN0aW9uLiAgKi8KLQotc3ltYm9sUyAqCi1tYWtlX2V4cHJfc3ltYm9sIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBleHByZXNzaW9uUyB6ZXJvOwotICBjb25zdCBjaGFyICpmYWtlOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbjsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICByZXR1cm4gZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbDsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgLyogVGhpcyB3b24ndCB3b3JrLCBiZWNhdXNlIHRoZSBhY3R1YWwgdmFsdWUgaXMgc3RvcmVkIGluCi0gICAgICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciBvciBnZW5lcmljX2JpZ251bSwgYW5kIHdlIGFyZQotICAgICAgICAgZ29pbmcgdG8gbG9zZSBpdCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICB6ZXJvLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgemVyby5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgemVyby5YX3Vuc2lnbmVkID0gMDsKLSAgICAgIGNsZWFuX3VwX2V4cHJlc3Npb24gKCZ6ZXJvKTsKLSAgICAgIGV4cHJlc3Npb25QID0gJnplcm87Ci0gICAgfQotCi0gIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0KLSAgLyogUHV0dGluZyBjb25zdGFudCBzeW1ib2xzIGluIGFic29sdXRlX3NlY3Rpb24gcmF0aGVyIHRoYW4KLSAgICAgZXhwcl9zZWN0aW9uIGlzIGNvbnZlbmllbnQgZm9yIHRoZSBvbGQgYS5vdXQgY29kZSwgZm9yIHdoaWNoCi0gICAgIFNfR0VUX1NFR01FTlQgZG9lcyBub3QgYWx3YXlzIHJldHJpZXZlIHRoZSB2YWx1ZSBwdXQgaW4gYnkKLSAgICAgU19TRVRfU0VHTUVOVC4gICovCi0gIHN5bWJvbFAgPSBzeW1ib2xfY3JlYXRlIChmYWtlLAotCQkJICAgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQKLQkJCSAgICA/IGFic29sdXRlX3NlY3Rpb24KLQkJCSAgICA6IGV4cHJfc2VjdGlvbiksCi0JCQkgICAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsIGV4cHJlc3Npb25QKTsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLSAgbiA9IChzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5zeW0gPSBzeW1ib2xQOwotICBhc193aGVyZSAoJm4tPmZpbGUsICZuLT5saW5lKTsKLSAgbi0+bmV4dCA9IGV4cHJfc3ltYm9sX2xpbmVzOwotICBleHByX3N5bWJvbF9saW5lcyA9IG47Ci0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0KLS8qIFJldHVybiB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZm9yIGFuIGV4cHIgc3ltYm9sLiAgUmV0dXJuCi0gICBub24temVybyBpZiBzb21ldGhpbmcgd2FzIGZvdW5kLCAwIGlmIG5vIGluZm9ybWF0aW9uIGlzIGtub3duIGZvcgotICAgdGhlIHN5bWJvbC4gICovCi0KLWludAotZXhwcl9zeW1ib2xfd2hlcmUgKHN5bSwgcGZpbGUsIHBsaW5lKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGNoYXIgKipwZmlsZTsKLSAgICAgdW5zaWduZWQgaW50ICpwbGluZTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKmw7Ci0KLSAgZm9yIChsID0gZXhwcl9zeW1ib2xfbGluZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnN5bSA9PSBzeW0pCi0JewotCSAgKnBmaWxlID0gbC0+ZmlsZTsKLQkgICpwbGluZSA9IGwtPmxpbmU7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotDAotLyogVXRpbGl0aWVzIGZvciBidWlsZGluZyBleHByZXNzaW9ucy4KLSAgIFNpbmNlIGNvbXBsZXggZXhwcmVzc2lvbnMgYXJlIHJlY29yZGVkIGFzIHN5bWJvbHMgZm9yIHVzZSBpbiBvdGhlcgotICAgZXhwcmVzc2lvbnMgdGhlc2UgcmV0dXJuIGEgc3ltYm9sUyAqIGFuZCBub3QgYW4gZXhwcmVzc2lvblMgKi4KLSAgIFRoZXNlIGV4cGxpY2l0bHkgZG8gbm90IHRha2UgYW4gImFkZF9udW1iZXIiIGFyZ3VtZW50LiAgKi8KLS8qID8/PyBGb3IgY29tcGxldGVuZXNzJyBzYWtlIG9uZSBtaWdodCB3YW50IGV4cHJfYnVpbGRfc3ltYm9sLgotICAgSXQgd291bGQganVzdCByZXR1cm4gaXRzIGFyZ3VtZW50LiAgKi8KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgYW4gdW5zaWduZWQgY29uc3RhbnQuCi0gICBUaGUgY29ycmVzcG9uZGluZyBvbmUgZm9yIHNpZ25lZCBjb25zdGFudHMgaXMgbWlzc2luZyBiZWNhdXNlCi0gICB0aGVyZSdzIGN1cnJlbnRseSBubyBuZWVkIGZvciBpdC4gIE9uZSBjb3VsZCBhZGQgYW4gdW5zaWduZWRfcCBmbGFnCi0gICBidXQgdGhhdCBzZWVtcyBtb3JlIGNsdW1zeS4gICovCi0KLXN5bWJvbFMgKgotZXhwcl9idWlsZF91Y29uc3RhbnQgKHZhbHVlKQotICAgICBvZmZzZXRUIHZhbHVlOwotewotICBleHByZXNzaW9uUyBlOwotCi0gIGUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGUuWF9hZGRfbnVtYmVyID0gdmFsdWU7Ci0gIGUuWF91bnNpZ25lZCA9IDE7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIE9QIHMxLiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX3VuYXJ5IChvcCwgczEpCi0gICAgIG9wZXJhdG9yVCBvcDsKLSAgICAgc3ltYm9sUyAqczE7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0KLSAgZS5YX29wID0gb3A7Ci0gIGUuWF9hZGRfc3ltYm9sID0gczE7Ci0gIGUuWF9hZGRfbnVtYmVyID0gMDsKLSAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKLX0KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgczEgT1AgczIuICAqLwotCi1zeW1ib2xTICoKLWV4cHJfYnVpbGRfYmluYXJ5IChvcCwgczEsIHMyKQotICAgICBvcGVyYXRvclQgb3A7Ci0gICAgIHN5bWJvbFMgKnMxOwotICAgICBzeW1ib2xTICpzMjsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLQotICBlLlhfb3AgPSBvcDsKLSAgZS5YX2FkZF9zeW1ib2wgPSBzMTsKLSAgZS5YX29wX3N5bWJvbCA9IHMyOwotICBlLlhfYWRkX251bWJlciA9IDA7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uICgnLicpLiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX2RvdCAoKQotewotICBleHByZXNzaW9uUyBlOwotCi0gIGN1cnJlbnRfbG9jYXRpb24gKCZlKTsKLSAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKLX0KLQwKLS8qCi0gKiBCdWlsZCBhbnkgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbCBoZXJlLgotICogQWxzbyBidWlsZCBhbnkgYmlnbnVtIGxpdGVyYWwgaGVyZS4KLSAqLwotCi0vKiBTZWVtcyBhdG9mX21hY2hpbmUgY2FuIGJhY2tzY2FuIHRocm91Z2ggZ2VuZXJpY19iaWdudW0gYW5kIGhpdCB3aGF0ZXZlcgotICAgaGFwcGVucyB0byBiZSBsb2FkZWQgYmVmb3JlIGl0IGluIG1lbW9yeS4gIEFuZCBpdHMgd2F5IHRvbyBjb21wbGljYXRlZAotICAgZm9yIG1lIHRvIGZpeCByaWdodC4gIFRodXMgYSBoYWNrLiAgSkY6ICBKdXN0IG1ha2UgZ2VuZXJpY19iaWdudW0gYmlnZ2VyLAotICAgYW5kIG5ldmVyIHdyaXRlIGludG8gdGhlIGVhcmx5IHdvcmRzLCB0aHVzIHRoZXknbGwgYWx3YXlzIGJlIHplcm8uCi0gICBJIGhhdGUgRGVhbidzIGZsb2F0aW5nLXBvaW50IGNvZGUuICBCbGVoLiAgKi8KLUxJVFRMRU5VTV9UWVBFIGdlbmVyaWNfYmlnbnVtW1NJWkVfT0ZfTEFSR0VfTlVNQkVSICsgNl07Ci1GTE9OVU1fVFlQRSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciA9Ci17Ci0gICZnZW5lcmljX2JpZ251bVs2XSwJCS8qIGxvdyAoSkY6IFdhcyAwKSAqLwotICAmZ2VuZXJpY19iaWdudW1bU0laRV9PRl9MQVJHRV9OVU1CRVIgKyA2IC0gMV0sIC8qIGhpZ2ggSkY6IChhZGRlZCArNikgKi8KLSAgMCwJCQkJLyogbGVhZGVyICovCi0gIDAsCQkJCS8qIGV4cG9uZW50ICovCi0gIDAJCQkJLyogc2lnbiAqLwotfTsKLS8qIElmIG5vbnplcm8sIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgbmFuLCAraW5mIG9yIC1pbmYgKi8KLWludCBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X21hZ2ljOwotDAotc3RhdGljIHZvaWQKLWZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPiovCi0gIC8qIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50LiAqLwotICBpbnQgZXJyb3JfY29kZTsKLQotICBlcnJvcl9jb2RlID0gYXRvZl9nZW5lcmljICgmaW5wdXRfbGluZV9wb2ludGVyLCAiLiIsIEVYUF9DSEFSUywKLQkJCSAgICAgJmdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKTsKLQotICBpZiAoZXJyb3JfY29kZSkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfY29kZSA9PSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVykKLQl7Ci0JICBhc19iYWQgKF8oImJhZCBmbG9hdGluZy1wb2ludCBjb25zdGFudDogZXhwb25lbnQgb3ZlcmZsb3csIHByb2JhYmx5IGFzc2VtYmxpbmcganVuayIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IHVua25vd24gZXJyb3IgY29kZT0lZC4iKSwgZXJyb3JfY29kZSk7Ci0JfQotICAgIH0KLSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKLSAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5qdXN0IGFmdGVyIGNvbnN0YW50LCAqLwotICAvKiB3aGljaCBtYXkgcG9pbnQgdG8gd2hpdGVzcGFjZS4gKi8KLSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IC0xOwotfQotCi1zdGF0aWMgdmFsdWVUIAotZ2VuZXJpY19iaWdudW1fdG9faW50MzIgKCkgCi17Ci0gIHZhbHVlVCBudW1iZXIgPQotCSAgICgoZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgIHwgKGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spOwotICBudW1iZXIgJj0gMHhmZmZmZmZmZjsKLSAgcmV0dXJuIG51bWJlcjsKLX0KLQotI2lmZGVmIEJGRDY0Ci1zdGF0aWMgdmFsdWVUIAotZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCkgCi17Ci0gIHZhbHVlVCBudW1iZXIgPSAKLQkgICAoKCgoKCgoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bM10gJiBMSVRUTEVOVU1fTUFTSykKLQkJIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzJdICYgTElUVExFTlVNX01BU0spKQotCSAgICAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgICAgfCAoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykpCi0JICAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spKTsKLSAgcmV0dXJuIG51bWJlcjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotaW50ZWdlcl9jb25zdGFudCAocmFkaXgsIGV4cHJlc3Npb25QKQotICAgICBpbnQgcmFkaXg7Ci0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciAqc3RhcnQ7CQkvKiBzdGFydCBvZiBudW1iZXIuICovCi0gIGNoYXIgKnN1ZmZpeCA9IE5VTEw7Ci0gIGNoYXIgYzsKLSAgdmFsdWVUIG51bWJlcjsJLyogb2Zmc2V0IG9yIChhYnNvbHV0ZSkgdmFsdWUgKi8KLSAgc2hvcnQgaW50IGRpZ2l0OwkvKiB2YWx1ZSBvZiBuZXh0IGRpZ2l0IGluIGN1cnJlbnQgcmFkaXggKi8KLSAgc2hvcnQgaW50IG1heGRpZyA9IDA7LyogaGlnaGVzdCBwZXJtaXR0ZWQgZGlnaXQgdmFsdWUuICovCi0gIGludCB0b29fbWFueV9kaWdpdHMgPSAwOwkvKiBpZiB3ZSBzZWUgPj0gdGhpcyBudW1iZXIgb2YgKi8KLSAgY2hhciAqbmFtZTsJCS8qIHBvaW50cyB0byBuYW1lIG9mIHN5bWJvbCAqLwotICBzeW1ib2xTICpzeW1ib2xQOwkvKiBwb2ludHMgdG8gc3ltYm9sICovCi0KLSAgaW50IHNtYWxsOwkJCS8qIHRydWUgaWYgZml0cyBpbiAzMiBiaXRzLiAqLwotCi0gIC8qIE1heSBiZSBiaWdudW0sIG9yIG1heSBmaXQgaW4gMzIgYml0cy4gKi8KLSAgLyogTW9zdCBudW1iZXJzIGZpdCBpbnRvIDMyIGJpdHMsIGFuZCB3ZSB3YW50IHRoaXMgY2FzZSB0byBiZSBmYXN0LgotICAgICBzbyB3ZSBwcmV0ZW5kIGl0IHdpbGwgZml0IGludG8gMzIgYml0cy4gIElmLCBhZnRlciBtYWtpbmcgdXAgYSAzMgotICAgICBiaXQgbnVtYmVyLCB3ZSByZWFsaXNlIHRoYXQgd2UgaGF2ZSBzY2FubmVkIG1vcmUgZGlnaXRzIHRoYW4KLSAgICAgY29tZm9ydGFibHkgZml0IGludG8gMzIgYml0cywgd2UgcmUtc2NhbiB0aGUgZGlnaXRzIGNvZGluZyB0aGVtCi0gICAgIGludG8gYSBiaWdudW0uICBGb3IgZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycyB3ZSBhcmUKLSAgICAgY29uc2VydmF0aXZlOiBTb21lIG51bWJlcnMgbWF5IGJlIGFzc3VtZWQgYmlnbnVtcyB3aGVuIGluIGZhY3QKLSAgICAgdGhleSBkbyBmaXQgaW50byAzMiBiaXRzLiAgTnVtYmVycyBvZiBhbnkgcmFkaXggY2FuIGhhdmUgZXhjZXNzCi0gICAgIGxlYWRpbmcgemVyb3M6IFdlIHN0cml2ZSB0byByZWNvZ25pc2UgdGhpcyBhbmQgY2FzdCB0aGVtIGJhY2sKLSAgICAgaW50byAzMiBiaXRzLiAgV2UgbXVzdCBjaGVjayB0aGF0IHRoZSBiaWdudW0gcmVhbGx5IGlzIG1vcmUgdGhhbgotICAgICAzMiBiaXRzLCBhbmQgY2hhbmdlIGl0IGJhY2sgdG8gYSAzMi1iaXQgbnVtYmVyIGlmIGl0IGZpdHMuICBUaGUKLSAgICAgbnVtYmVyIHdlIGFyZSBsb29raW5nIGZvciBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGlmIGl0Ci0gICAgIGZpdHMgaW50byAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIG51bWJlciwgd2UgbGV0IGl0IGJlIGEgMzItYml0Ci0gICAgIG51bWJlci4gIFRoZSBjYXZhbGllciBhcHByb2FjaCBpcyBmb3Igc3BlZWQgaW4gb3JkaW5hcnkgY2FzZXMuICovCi0gIC8qIFRoaXMgaGFzIGJlZW4gZXh0ZW5kZWQgZm9yIDY0IGJpdHMuICBXZSBibGluZGx5IGFzc3VtZSB0aGF0IGlmCi0gICAgIHlvdSdyZSBjb21waWxpbmcgaW4gNjQtYml0IG1vZGUsIHRoZSB0YXJnZXQgaXMgYSA2NC1iaXQgbWFjaGluZS4KLSAgICAgVGhpcyBzaG91bGQgYmUgY2xlYW5lZCB1cC4gICovCi0KLSNpZmRlZiBCRkQ2NAotI2RlZmluZSB2YWx1ZXNpemUgNjQKLSNlbHNlIC8qIGluY2x1ZGVzIG5vbi1iZmQgY2FzZSwgbW9zdGx5ICovCi0jZGVmaW5lIHZhbHVlc2l6ZSAzMgotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgcmFkaXggPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZmx0ID0gMDsKLQotICAgICAgLyogSW4gTVJJIG1vZGUsIHRoZSBudW1iZXIgbWF5IGhhdmUgYSBzdWZmaXggaW5kaWNhdGluZyB0aGUKLSAgICAgICAgIHJhZGl4LiAgRm9yIHRoYXQgbWF0dGVyLCBpdCBtaWdodCBhY3R1YWxseSBiZSBhIGZsb2F0aW5nCi0gICAgICAgICBwb2ludCBjb25zdGFudC4gICovCi0gICAgICBmb3IgKHN1ZmZpeCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnN1ZmZpeCk7Ci0JICAgc3VmZml4KyspCi0JewotCSAgaWYgKCpzdWZmaXggPT0gJ2UnIHx8ICpzdWZmaXggPT0gJ0UnKQotCSAgICBmbHQgPSAxOwotCX0KLQotICAgICAgaWYgKHN1ZmZpeCA9PSBpbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCSAgcmFkaXggPSAxMDsKLQkgIHN1ZmZpeCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGMgPSAqLS1zdWZmaXg7Ci0JICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICBjID0gdG91cHBlciAoYyk7Ci0JICBpZiAoYyA9PSAnQicpCi0JICAgIHJhZGl4ID0gMjsKLQkgIGVsc2UgaWYgKGMgPT0gJ0QnKQotCSAgICByYWRpeCA9IDEwOwotCSAgZWxzZSBpZiAoYyA9PSAnTycgfHwgYyA9PSAnUScpCi0JICAgIHJhZGl4ID0gODsKLQkgIGVsc2UgaWYgKGMgPT0gJ0gnKQotCSAgICByYWRpeCA9IDE2OwotCSAgZWxzZSBpZiAoc3VmZml4WzFdID09ICcuJyB8fCBjID09ICdFJyB8fCBmbHQpCi0JICAgIHsKLQkgICAgICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmFkaXggPSAxMDsKLQkgICAgICBzdWZmaXggPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKHJhZGl4KQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICBtYXhkaWcgPSAyOwotICAgICAgdG9vX21hbnlfZGlnaXRzID0gdmFsdWVzaXplICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIG1heGRpZyA9IHJhZGl4ID0gODsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9ICh2YWx1ZXNpemUgKyAyKSAvIDMgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIG1heGRpZyA9IHJhZGl4ID0gMTY7Ci0gICAgICB0b29fbWFueV9kaWdpdHMgPSAodmFsdWVzaXplICsgMykgLyA0ICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTA6Ci0gICAgICBtYXhkaWcgPSByYWRpeCA9IDEwOwotICAgICAgdG9vX21hbnlfZGlnaXRzID0gKHZhbHVlc2l6ZSArIDEyKSAvIDQ7IC8qIHZlcnkgcm91Z2ggKi8KLSAgICB9Ci0jdW5kZWYgdmFsdWVzaXplCi0gIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICBmb3IgKG51bWJlciA9IDA7Ci0gICAgICAgKGRpZ2l0ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7Ci0gICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLSAgICB7Ci0gICAgICBudW1iZXIgPSBudW1iZXIgKiByYWRpeCArIGRpZ2l0OwotICAgIH0KLSAgLyogYyBjb250YWlucyBjaGFyYWN0ZXIgYWZ0ZXIgbnVtYmVyLiAqLwotICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPmNoYXIgYWZ0ZXIgYy4gKi8KLSAgc21hbGwgPSAoaW5wdXRfbGluZV9wb2ludGVyIC0gc3RhcnQgLSAxKSA8IHRvb19tYW55X2RpZ2l0czsKLQotICBpZiAocmFkaXggPT0gMTYgJiYgYyA9PSAnXycpIAotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgbGl0ZXJhbCBvZiB0aGUgZm9ybSAweDMzM18wXzEyMzQ1Njc4XzEuCi0gICAgICAgICBUaGlzIGV4YW1wbGUgaXMgZXF1aXZhbGVudCB0byAweDAwMDAwMzMzMDAwMDAwMDAxMjM0NTY3ODAwMDAwMDAxLiAgKi8KLQotICAgICAgaW50IG51bV9saXR0bGVfZGlnaXRzID0gMDsKLSAgICAgIGludCBpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7CS8qLT4xc3QgZGlnaXQuICovCi0KLSAgICAgIGtub3cgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyA9PSAxNik7Ci0KLSAgICAgIGZvciAoYyA9ICdfJzsgYyA9PSAnXyc7IG51bV9saXR0bGVfZGlnaXRzKz0yKQotCXsKLQotCSAgLyogQ29udmVydCBvbmUgNjQtYml0IHdvcmQuICovCi0JICBpbnQgbmRpZ2l0ID0gMDsgCi0JICBudW1iZXIgPSAwOwotCSAgZm9yIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgICAoZGlnaXQgPSBoZXhfdmFsdWUgKGMpKSA8IG1heGRpZzsKLQkgICAgICAgYyA9ICooaW5wdXRfbGluZV9wb2ludGVyKyspKQotCSAgICB7Ci0JICAgICAgbnVtYmVyID0gbnVtYmVyICogcmFkaXggKyBkaWdpdDsKLQkgICAgICBuZGlnaXQrKzsKLQkgICAgfQotCi0JICAvKiBDaGVjayBmb3IgOCBkaWdpdCBwZXIgd29yZCBtYXguICAqLwotCSAgaWYgKG5kaWdpdCA+IDgpIAotCSAgICBhc19iYWQgKF8oIkEgYmlnbnVtIHdpdGggdW5kZXJzY29yZXMgbWF5IG5vdCBoYXZlIG1vcmUgdGhhbiA4IGhleCBkaWdpdHMgaW4gYW55IHdvcmQuIikpOwotCi0JICAvKiBBZGQgdGhpcyBjaHVuayB0byB0aGUgYmlnbnVtLiAgU2hpZnQgdGhpbmdzIGRvd24gMiBsaXR0bGUgZGlnaXRzLiovCi0JICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotCSAgZm9yIChpID0gbWluIChudW1fbGl0dGxlX2RpZ2l0cyArIDEsIFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMSk7IGkgPj0gMjsgaS0tKQotCSAgICBnZW5lcmljX2JpZ251bVtpXSA9IGdlbmVyaWNfYmlnbnVtW2ktMl07Ci0KLQkgIC8qIEFkZCB0aGUgbmV3IGRpZ2l0cyBhcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbmV3IG9uZXMuICovCi0JICBnZW5lcmljX2JpZ251bVswXSA9IG51bWJlciAmIDB4ZmZmZmZmZmY7Ci0JICBnZW5lcmljX2JpZ251bVsxXSA9IG51bWJlciA+PiAxNjsKLQl9Ci0KLSAgICAgIC8qIEFnYWluLCBjIGlzIGNoYXIgYWZ0ZXIgbnVtYmVyLCBpbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyIGMuICovCi0KLSAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA+IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMSkKLQludW1fbGl0dGxlX2RpZ2l0cyA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMTsKLQotICAgICAgYXNzZXJ0IChudW1fbGl0dGxlX2RpZ2l0cyA+PSA0KTsKLQotICAgICAgaWYgKG51bV9saXR0bGVfZGlnaXRzICE9IDgpCi0JYXNfYmFkIChfKCJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG11c3QgaGF2ZSBleGFjdGx5IDQgd29yZHMuIikpOwotCi0gICAgICAvKiBXZSBtaWdodCBoYXZlIHNvbWUgbGVhZGluZyB6ZXJvcy4gIFRoZXNlIGNhbiBiZSB0cmltbWVkIHRvIGdpdmUKLSAgICAgICAqIHVzIGEgY2hhbmdlIHRvIGZpdCB0aGlzIGNvbnN0YW50IGludG8gYSBzbWFsbCBudW1iZXIuCi0gICAgICAgKi8KLSAgICAgIHdoaWxlIChnZW5lcmljX2JpZ251bVtudW1fbGl0dGxlX2RpZ2l0cy0xXSA9PSAwICYmIG51bV9saXR0bGVfZGlnaXRzID4gMSkKLQludW1fbGl0dGxlX2RpZ2l0cy0tOwotCQotICAgICAgaWYgKG51bV9saXR0bGVfZGlnaXRzIDw9IDIpCi0JewotCSAgLyogd2lsbCBmaXQgaW50byAzMiBiaXRzLiAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50MzIgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2lmZGVmIEJGRDY0Ci0gICAgICBlbHNlIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA8PSA0KQotCXsKLQkgIC8qIFdpbGwgZml0IGludG8gNjQgYml0cy4gICovCi0JICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQ2NCAoKTsKLQkgIHNtYWxsID0gMTsKLQl9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQl7Ci0JICBzbWFsbCA9IDA7Ci0JICBudW1iZXIgPSBudW1fbGl0dGxlX2RpZ2l0czsgLyogbnVtYmVyIG9mIGxpdHRsZW51bXMgaW4gdGhlIGJpZ251bS4gKi8KLQl9Ci0gICAgfQotICBlbHNlIGlmICghc21hbGwpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIHdlIHNhdyBhIGxvdCBvZiBkaWdpdHMuIG1hbnVmYWN0dXJlIGEgYmlnbnVtIHRoZSBoYXJkIHdheS4KLSAgICAgICAqLwotICAgICAgTElUVExFTlVNX1RZUEUgKmxlYWRlcjsJLyotPmhpZ2ggb3JkZXIgbGl0dGxlbnVtIG9mIHRoZSBiaWdudW0uICovCi0gICAgICBMSVRUTEVOVU1fVFlQRSAqcG9pbnRlcjsJLyotPmxpdHRsZW51bSB3ZSBhcmUgZnJvYmJpbmcgbm93LiAqLwotICAgICAgbG9uZyBjYXJyeTsKLQotICAgICAgbGVhZGVyID0gZ2VuZXJpY19iaWdudW07Ci0gICAgICBnZW5lcmljX2JpZ251bVswXSA9IDA7Ci0gICAgICBnZW5lcmljX2JpZ251bVsxXSA9IDA7Ci0gICAgICBnZW5lcmljX2JpZ251bVsyXSA9IDA7Ci0gICAgICBnZW5lcmljX2JpZ251bVszXSA9IDA7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsJLyotPjFzdCBkaWdpdC4gKi8KLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmb3IgKDsKLQkgICAoY2FycnkgPSBoZXhfdmFsdWUgKGMpKSA8IG1heGRpZzsKLQkgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKQotCXsKLQkgIGZvciAocG9pbnRlciA9IGdlbmVyaWNfYmlnbnVtOwotCSAgICAgICBwb2ludGVyIDw9IGxlYWRlcjsKLQkgICAgICAgcG9pbnRlcisrKQotCSAgICB7Ci0JICAgICAgbG9uZyB3b3JrOwotCi0JICAgICAgd29yayA9IGNhcnJ5ICsgcmFkaXggKiAqcG9pbnRlcjsKLQkgICAgICAqcG9pbnRlciA9IHdvcmsgJiBMSVRUTEVOVU1fTUFTSzsKLQkgICAgICBjYXJyeSA9IHdvcmsgPj4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgICB9Ci0JICBpZiAoY2FycnkpCi0JICAgIHsKLQkgICAgICBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCi0JCXsKLQkJICAvKiByb29tIHRvIGdyb3cgYSBsb25nZXIgYmlnbnVtLiAqLwotCQkgICorK2xlYWRlciA9IGNhcnJ5OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBhZ2FpbiwgYyBpcyBjaGFyIGFmdGVyIG51bWJlciwgKi8KLSAgICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgYy4gKi8KLSAgICAgIGtub3cgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyA9PSAxNik7Ci0gICAgICBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyAyKQotCXsKLQkgIC8qIHdpbGwgZml0IGludG8gMzIgYml0cy4gKi8KLQkgIG51bWJlciA9IGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyICgpOwotCSAgc21hbGwgPSAxOwotCX0KLSNpZmRlZiBCRkQ2NAotICAgICAgZWxzZSBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyA0KQotCXsKLQkgIC8qIFdpbGwgZml0IGludG8gNjQgYml0cy4gICovCi0JICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQ2NCAoKTsKLQkgIHNtYWxsID0gMTsKLQl9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQl7Ci0JICBudW1iZXIgPSBsZWFkZXIgLSBnZW5lcmljX2JpZ251bSArIDE7CS8qIG51bWJlciBvZiBsaXR0bGVudW1zIGluIHRoZSBiaWdudW0uICovCi0JfQotICAgIH0KLQotICBpZiAoZmxhZ19tNjhrX21yaSAmJiBzdWZmaXggIT0gTlVMTCAmJiBpbnB1dF9saW5lX3BvaW50ZXIgLSAxID09IHN1ZmZpeCkKLSAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gIGlmIChzbWFsbCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogaGVyZSB3aXRoIG51bWJlciwgaW4gY29ycmVjdCByYWRpeC4gYyBpcyB0aGUgbmV4dCBjaGFyLgotICAgICAgICogbm90ZSB0aGF0IHVubGlrZSB1bip4LCB3ZSBhbGxvdyAiMDExZiIgIjB4OWYiIHRvCi0gICAgICAgKiBib3RoIG1lYW4gdGhlIHNhbWUgYXMgdGhlIChjb252ZW50aW9uYWwpICI5ZiIuIHRoaXMgaXMgc2ltcGx5IGVhc2llcgotICAgICAgICogdGhhbiBjaGVja2luZyBmb3Igc3RyaWN0IGNhbm9uaWNhbCBmb3JtLiBzeW50YXggc3V4IQotICAgICAgICovCi0KLSAgICAgIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgYyA9PSAnYicpCi0JewotCSAgLyoKLQkgICAqIGJhY2t3YXJkIHJlZiB0byBsb2NhbCBsYWJlbC4KLQkgICAqIGJlY2F1c2UgaXQgaXMgYmFja3dhcmQsIGV4cGVjdCBpdCB0byBiZSBkZWZpbmVkLgotCSAgICovCi0JICAvKiBDb25zdHJ1Y3QgYSBsb2NhbCBsYWJlbC4gICovCi0JICBuYW1lID0gZmJfbGFiZWxfbmFtZSAoKGludCkgbnVtYmVyLCAwKTsKLQotCSAgLyogc2VlbiBiZWZvcmUsIG9yIHN5bWJvbCBpcyBkZWZpbmVkOiBvayAqLwotCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQkgIGlmICgoc3ltYm9sUCAhPSBOVUxMKSAmJiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkpCi0JICAgIHsKLQkgICAgICAvKiBsb2NhbCBsYWJlbHMgYXJlIG5ldmVyIGFic29sdXRlLiBkb24ndCB3YXN0ZSB0aW1lCi0JCSBjaGVja2luZyBhYnNvbHV0ZW5lc3MuICovCi0JICAgICAga25vdyAoU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpKTsKLQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIGVpdGhlciBub3Qgc2VlbiBvciBub3QgZGVmaW5lZC4gKi8KLQkgICAgICAvKiBAQCBTaG91bGQgcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCBzdHJpbmcgaW5zdGVhZCBvZgotCQkgdGhlIHBhcnNlZCBudW1iZXIuICAqLwotCSAgICAgIGFzX2JhZCAoXygiYmFja3cuIHJlZiB0byB1bmtub3duIGxhYmVsIFwiJWQ6XCIsIDAgYXNzdW1lZC4iKSwKLQkJICAgICAgKGludCkgbnVtYmVyKTsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgIH0KLQotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JfQkJCS8qIGNhc2UgJ2InICovCi0gICAgICBlbHNlIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgYyA9PSAnZicpCi0JewotCSAgLyoKLQkgICAqIGZvcndhcmQgcmVmZXJlbmNlLiBleHBlY3Qgc3ltYm9sIHRvIGJlIHVuZGVmaW5lZCBvcgotCSAgICogdW5rbm93bi4gdW5kZWZpbmVkOiBzZWVuIGl0IGJlZm9yZS4gdW5rbm93bjogbmV2ZXIgc2VlbgotCSAgICogaXQgYmVmb3JlLgotCSAgICogY29uc3RydWN0IGEgbG9jYWwgbGFiZWwgbmFtZSwgdGhlbiBhbiB1bmRlZmluZWQgc3ltYm9sLgotCSAgICogZG9uJ3QgY3JlYXRlIGEgeHNlZyBmcmFnIGZvciBpdDogY2FsbGVyIG1heSBkbyB0aGF0LgotCSAgICoganVzdCByZXR1cm4gaXQgYXMgbmV2ZXIgc2VlbiBiZWZvcmUuCi0JICAgKi8KLQkgIG5hbWUgPSBmYl9sYWJlbF9uYW1lICgoaW50KSBudW1iZXIsIDEpOwotCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCSAgLyogd2UgaGF2ZSBubyBuZWVkIHRvIGNoZWNrIHN5bWJvbCBwcm9wZXJ0aWVzLiAqLwotI2lmbmRlZiBtYW55X3NlZ21lbnRzCi0JICAvKiBzaW5jZSAia25vdyIgcHV0cyBpdHMgYXJnIGludG8gYSAic3RyaW5nIiwgd2UKLQkgICAgIGNhbid0IGhhdmUgbmV3bGluZXMgaW4gdGhlIGFyZ3VtZW50LiAgKi8KLQkgIGtub3cgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHVuZGVmaW5lZF9zZWN0aW9uIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHRleHRfc2VjdGlvbiB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBkYXRhX3NlY3Rpb24pOwotI2VuZGlmCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQl9CQkJLyogY2FzZSAnZicgKi8KLSAgICAgIGVsc2UgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIgJiYgYyA9PSAnJCcpCi0JewotCSAgLyogSWYgdGhlIGRvbGxhciBsYWJlbCBpcyAqY3VycmVudGx5KiBkZWZpbmVkLCB0aGVuIHRoaXMgaXMganVzdAotCSAgICAgYW5vdGhlciByZWZlcmVuY2UgdG8gaXQuICBJZiBpdCBpcyBub3QgKmN1cnJlbnRseSogZGVmaW5lZCwKLQkgICAgIHRoZW4gdGhpcyBpcyBhIGZyZXNoIGluc3RhbnRpYXRpb24gb2YgdGhhdCBudW1iZXIsIHNvIGNyZWF0ZQotCSAgICAgaXQuICAqLwotCi0JICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKChsb25nKSBudW1iZXIpKQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGRvbGxhcl9sYWJlbF9uYW1lICgobG9uZykgbnVtYmVyLCAwKTsKLQkgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCSAgICAgIGtub3cgKHN5bWJvbFAgIT0gTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAoKGxvbmcpIG51bWJlciwgMSk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCSAgICB9Ci0KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCX0JCQkvKiBjYXNlICckJyAqLwotICAgICAgZWxzZQotCXsKLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSNpZmRlZiBUQVJHRVRfV09SRF9TSVpFCi0JICAvKiBTaWduIGV4dGVuZCBOVU1CRVIuICAqLwotCSAgbnVtYmVyIHw9ICgtKG51bWJlciA+PiAoVEFSR0VUX1dPUkRfU0laRSAtIDEpKSkgPDwgKFRBUkdFVF9XT1JEX1NJWkUgLSAxKTsKLSNlbmRpZgotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IG51bWJlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKiByZXN0b3JlIGZvbGxvd2luZyBjaGFyYWN0ZXIuICovCi0JfQkJCS8qIHJlYWxseSBqdXN0IGEgbnVtYmVyICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogbm90IGEgc21hbGwgbnVtYmVyICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYmlnOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IG51bWJlcjsJLyogbnVtYmVyIG9mIGxpdHRsZW51bXMgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKi0+Y2hhciBmb2xsb3dpbmcgbnVtYmVyLiAqLwotICAgIH0KLX0KLQotLyogUGFyc2UgYW4gTVJJIG11bHRpIGNoYXJhY3RlciBjb25zdGFudC4gICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfY2hhcl9jb25zdGFudCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJwotICAgICAgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycpCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEluIG9yZGVyIHRvIGdldCB0aGUgY29ycmVjdCBieXRlIG9yZGVyaW5nLCB3ZSBtdXN0IGJ1aWxkIHRoZQotICAgICBudW1iZXIgaW4gcmV2ZXJzZS4gICovCi0gIGZvciAoaSA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgaW50IGo7Ci0KLSAgICAgIGdlbmVyaWNfYmlnbnVtW2ldID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBDSEFSU19QRVJfTElUVExFTlVNOyBqKyspCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkgICAgewotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJykKLQkJYnJlYWs7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGdlbmVyaWNfYmlnbnVtW2ldIDw8PSA4OwotCSAgZ2VuZXJpY19iaWdudW1baV0gKz0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLQotICAgICAgaWYgKGkgPCBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCi0JewotCSAgLyogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBsaXR0bGVudW0sIGxlZnQganVzdGlmeSB0aGUKLSAgICAgICAgICAgICBsYXN0IG9uZSB0byBtYWtlIGl0IG1hdGNoIHRoZSBlYXJsaWVyIG9uZXMuICBJZiB0aGVyZSBpcwotICAgICAgICAgICAgIG9ubHkgb25lLCB3ZSBjYW4ganVzdCB1c2UgdGhlIHZhbHVlIGRpcmVjdGx5LiAgKi8KLQkgIGZvciAoOyBqIDwgQ0hBUlNfUEVSX0xJVFRMRU5VTTsgaisrKQotCSAgICBnZW5lcmljX2JpZ251bVtpXSA8PD0gODsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycKLQkgICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDaGFyYWN0ZXIgY29uc3RhbnQgdG9vIGxhcmdlIikpOwotICAgICAgaSA9IDA7Ci0gICAgfQotCi0gIGlmIChpID4gMCkKLSAgICB7Ci0gICAgICBpbnQgYzsKLSAgICAgIGludCBqOwotCi0gICAgICBjID0gU0laRV9PRl9MQVJHRV9OVU1CRVIgLSBpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGM7IGorKykKLQlnZW5lcmljX2JpZ251bVtqXSA9IGdlbmVyaWNfYmlnbnVtW2kgKyBqXTsKLSAgICAgIGkgPSBjOwotICAgIH0KLQotICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotICBpZiAoaSA+IDIpCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGlmIChpIDwgMikKLQlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMF0gJiBMSVRUTEVOVU1fTUFTSzsKLSAgICAgIGVsc2UKLQlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0KLQkgICgoKGdlbmVyaWNfYmlnbnVtWzFdICYgTElUVExFTlVNX01BU0spCi0JICAgIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICB8IChnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLKSk7Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGZpbmFsIGNsb3NpbmcgcXVvdGUuICAqLwotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotLyogUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgVGhpcwotICAgaGFuZGxlcyB0aGUgbWFnaWMgc3ltYm9sIGAuJy4gICovCi0KLXN0YXRpYyB2b2lkCi1jdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9ucCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25wOwotewotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25wLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9udW1iZXIgPSBhYnNfc2VjdGlvbl9vZmZzZXQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltYm9scDsKLQotICAgICAgc3ltYm9scCA9IHN5bWJvbF9uZXcgKEZBS0VfTEFCRUxfTkFNRSwgbm93X3NlZywKLQkJCSAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkgICAgZnJhZ19ub3cpOwotICAgICAgZXhwcmVzc2lvbnAtPlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xwOwotICAgICAgZXhwcmVzc2lvbnAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotfQotCi0vKgotICogU3VtbWFyeSBvZiBvcGVyYW5kKCkuCi0gKgotICogaW46CUlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZCwgd2hpY2ggbWF5Ci0gKgliZSBhIHNwYWNlLgotICoKLSAqIG91dDoJQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gZW1wdHk6IGluIHRoaXMgY2FzZSBYX29wID09IE9fYWJzZW50LgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZC4KLSAqLwotCi1zdGF0aWMgc2VnVAotb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW1ib2xQOwkvKiBwb2ludHMgdG8gc3ltYm9sICovCi0gIGNoYXIgKm5hbWU7CQkvKiBwb2ludHMgdG8gbmFtZSBvZiBzeW1ib2wgKi8KLSAgc2VnVCBzZWdtZW50OwotCi0gIC8qIEFsbCBpbnRlZ2VycyBhcmUgcmVnYXJkZWQgYXMgdW5zaWduZWQgdW5sZXNzIHRoZXkgYXJlIG5lZ2F0ZWQuCi0gICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgb25seSB0aGluZyB3aGljaCBjYXJlcyB3aGV0aGVyIGEgbnVtYmVyIGlzCi0gICAgIHVuc2lnbmVkIGlzIHRoZSBjb2RlIGluIGVtaXRfZXhwciB3aGljaCBleHRlbmRzIGNvbnN0YW50cyBpbnRvCi0gICAgIGJpZ251bXMuICBJdCBzaG91bGQgb25seSBzaWduIGV4dGVuZCBuZWdhdGl2ZSBudW1iZXJzLCBzbyB0aGF0Ci0gICAgIHNvbWV0aGluZyBsaWtlIGBgLnF1YWQgMHg4MDAwMDAwMCcnIGlzIG5vdCBzaWduIGV4dGVuZGVkIGV2ZW4KLSAgICAgdGhvdWdoIGl0IGFwcGVhcnMgbmVnYXRpdmUgaWYgdmFsdWVUIGlzIDMyIGJpdHMuICAqLwotICBleHByZXNzaW9uUC0+WF91bnNpZ25lZCA9IDE7Ci0KLSAgLyogZGlnaXRzLCBhc3N1bWUgaXQgaXMgYSBiaWdudW0uICovCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogbGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsJLyogaW5wdXRfbGluZV9wb2ludGVyLT5wYXN0IGNoYXIgaW4gYy4gKi8KLQotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0KLSAgICAgIGludGVnZXJfY29uc3RhbnQgKGZsYWdfbTY4a19tcmkgPyAwIDogMTAsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgICAvKiBub24tZGVjaW1hbCByYWRpeCAqLwotCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaSkKLQl7Ci0JICBjaGFyICpzOwotCi0JICAvKiBDaGVjayBmb3IgYSBoZXggY29uc3RhbnQuICAqLwotCSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyBoZXhfcCAoKnMpOyBzKyspCi0JICAgIDsKLQkgIGlmICgqcyA9PSAnaCcgfHwgKnMgPT0gJ0gnKQotCSAgICB7Ci0JICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnbyc6Ci0JY2FzZSAnTyc6Ci0JY2FzZSAncSc6Ci0JY2FzZSAnUSc6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnOSc6Ci0JICBpZiAoZmxhZ19tNjhrX21yaSkKLQkgICAgewotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDAsIGV4cHJlc3Npb25QKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQlkZWZhdWx0OgotCWRlZmF1bHRfY2FzZToKLQkgIGlmIChjICYmIHN0cmNociAoRkxUX0NIQVJTLCBjKSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIGZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCk7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9Ci0JCS0gKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/IHRvbG93ZXIgKGMpIDogYyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBzdHJpbmcgd2FzIG9ubHkgemVybyAqLwotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWNhc2UgJ3gnOgotCWNhc2UgJ1gnOgotCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JICAgIGdvdG8gZGVmYXVsdF9jYXNlOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0KLQljYXNlICdiJzoKLQkgIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgISBmbGFnX202OGtfbXJpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gY2hlY2sgZm9yICcrJyBhbmQgJy0nIGhlcmUsIGFuZCwgaW4KLQkJIHNvbWUgY29uZGl0aW9ucywgZmFsbCB0aHJvdWdoIHRvIGNhbGwKLQkJIGludGVnZXJfY29uc3RhbnQuICBIb3dldmVyLCB0aGF0IGRpZG4ndCBtYWtlIHNlbnNlLAotCQkgYXMgaW50ZWdlcl9jb25zdGFudCBvbmx5IGFjY2VwdHMgZGlnaXRzLiAgKi8KLQkgICAgICAvKiBTb21lIG9mIG91ciBjb2RlIGVsc2V3aGVyZSBkb2VzIHBlcm1pdCBkaWdpdHMgZ3JlYXRlcgotCQkgdGhhbiB0aGUgZXhwZWN0ZWQgYmFzZTsgZm9yIGNvbnNpc3RlbmN5LCBkbyB0aGUgc2FtZQotCQkgaGVyZS4gICovCi0JICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA8ICcwJwotCQkgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA+ICc5JykKLQkJewotCQkgIC8qIFBhcnNlIHRoaXMgYXMgYSBiYWNrIHJlZmVyZW5jZSB0byBsYWJlbCAwLiAgKi8KLQkJICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkJICBpbnRlZ2VyX2NvbnN0YW50ICgxMCwgZXhwcmVzc2lvblApOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogT3RoZXJ3aXNlLCBwYXJzZSB0aGlzIGFzIGEgYmluYXJ5IG51bWJlci4gICovCi0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnQic6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKLQkgIGludGVnZXJfY29uc3RhbnQgKDIsIGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JY2FzZSAnMyc6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnNic6Ci0JY2FzZSAnNyc6Ci0JICBpbnRlZ2VyX2NvbnN0YW50IChmbGFnX202OGtfbXJpID8gMCA6IDgsIGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBpZiAoTE9DQUxfTEFCRUxTX0ZCKQotCSAgICB7Ci0JICAgICAgLyogSWYgaXQgc2F5cyAiMGYiIGFuZCBpdCBjb3VsZCBwb3NzaWJseSBiZSBhIGZsb2F0aW5nIHBvaW50Ci0JCSBudW1iZXIsIG1ha2UgaXQgb25lLiAgT3RoZXJ3aXNlLCBtYWtlIGl0IGEgbG9jYWwgbGFiZWwsCi0JCSBhbmQgdHJ5IHRvIGRlYWwgd2l0aCBwYXJzaW5nIHRoZSByZXN0IGxhdGVyLiAgKi8KLQkgICAgICBpZiAoIWlucHV0X2xpbmVfcG9pbnRlclsxXQotCQkgIHx8IChpc19lbmRfb2ZfbGluZVsweGZmICYgaW5wdXRfbGluZV9wb2ludGVyWzFdXSkpCi0JCWdvdG8gaXNfMGZfbGFiZWw7Ci0JICAgICAgewotCQljaGFyICpjcCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0JCWludCByID0gYXRvZl9nZW5lcmljICgmY3AsICIuIiwgRVhQX0NIQVJTLAotCQkJCSAgICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcik7Ci0JCXN3aXRjaCAocikKLQkJICB7Ci0JCSAgY2FzZSAwOgotCQkgIGNhc2UgRVJST1JfRVhQT05FTlRfT1ZFUkZMT1c6Ci0JCSAgICBpZiAoKmNwID09ICdmJyB8fCAqY3AgPT0gJ2InKQotCQkgICAgICAvKiBsb29rcyBsaWtlIGEgZGlmZmVyZW5jZSBleHByZXNzaW9uICovCi0JCSAgICAgIGdvdG8gaXNfMGZfbGFiZWw7Ci0JCSAgICBlbHNlIGlmIChjcCA9PSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKQotCQkgICAgICAvKiBObyBjaGFyYWN0ZXJzIGhhcyBiZWVuIGFjY2VwdGVkIC0tIGxvb2tzIGxpa2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgb2Ygb3BlcmFuZC4gKi8KLQkJICAgICAgZ290byBpc18wZl9sYWJlbDsKLQkJICAgIGVsc2UKLQkJICAgICAgZ290byBpc18wZl9mbG9hdDsKLQkJICBkZWZhdWx0OgotCQkgICAgYXNfZmF0YWwgKF8oImV4cHIuYyhvcGVyYW5kKTogYmFkIGF0b2ZfZ2VuZXJpYyByZXR1cm4gdmFsICVkIiksCi0JCQkgICAgICByKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgICAgLyogT2theSwgbm93IHdlJ3ZlIHNvcnRlZCBpdCBvdXQuICBXZSByZXN1bWUgYXQgb25lIG9mIHRoZXNlCi0JCSB0d28gbGFiZWxzLCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBkZWNpZGVkIHdlJ3JlIHByb2JhYmx5Ci0JCSBsb29raW5nIGF0LiAgKi8KLQkgICAgaXNfMGZfbGFiZWw6Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMTAsIGV4cHJlc3Npb25QKTsKLQkgICAgICBicmVhazsKLQotCSAgICBpc18wZl9mbG9hdDoKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQkgICAgICA7Ci0JICAgIH0KLQotCWNhc2UgJ2QnOgotCWNhc2UgJ0QnOgotCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JICAgIHsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnRic6Ci0JY2FzZSAncic6Ci0JY2FzZSAnZSc6Ci0JY2FzZSAnRSc6Ci0JY2FzZSAnZyc6Ci0JY2FzZSAnRyc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCk7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0KLQkgICAgLSAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpID8gdG9sb3dlciAoYykgOiBjKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnJCc6Ci0JICBpZiAoTE9DQUxfTEFCRUxTX0RPTExBUikKLQkgICAgewotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDEwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZ290byBkZWZhdWx0X2Nhc2U7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJygnOgotI2lmbmRlZiBORUVEX0lOREVYX09QRVJBVE9SCi0gICAgY2FzZSAnWyc6Ci0jZW5kaWYKLSAgICAgIC8qIGRpZG4ndCBiZWdpbiB3aXRoIGRpZ2l0ICYgbm90IGEgbmFtZSAqLwotICAgICAgc2VnbWVudCA9IGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIC8qIEV4cHJlc3Npb24oKSB3aWxsIHBhc3MgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotICAgICAgaWYgKChjID09ICcoJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyknKQotCSAgfHwgKGMgPT0gJ1snICYmICppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnXScpKQotCXsKLQkgIGFzX2JhZCAoXygiTWlzc2luZyAnKScgYXNzdW1lZCIpKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIC8qIGhlcmUgd2l0aCBpbnB1dF9saW5lX3BvaW50ZXItPmNoYXIgYWZ0ZXIgIiguLi4pIiAqLwotICAgICAgcmV0dXJuIHNlZ21lbnQ7Ci0KLSAgICBjYXNlICdFJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnKQotCWdvdG8gZGVfZmF1bHQ7Ci0gICAgICBhc19iYWQgKF8oIkVCQ0RJQyBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJ0EnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICdcJyc6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCXsKLQkgIC8qIFdhcm5pbmc6IHRvIGNvbmZvcm0gdG8gb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycyBOTwotCSAgICAgRVNDQVBFTUVOVCBpcyBwZXJtaXR0ZWQgZm9yIGEgc2luZ2xlIHF1b3RlLiBUaGUgbmV4dAotCSAgICAgY2hhcmFjdGVyLCBwYXJpdHkgZXJyb3JzIGFuZCBhbGwsIGlzIHRha2VuIGFzIHRoZSB2YWx1ZQotCSAgICAgb2YgdGhlIG9wZXJhbmQuIFZFUlkgS0lOS1kuICAqLwotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbXJpX2NoYXJfY29uc3RhbnQgKGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKyc6Ci0gICAgICAodm9pZCkgb3BlcmFuZCAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICciJzoKLSAgICAgIC8qIERvdWJsZSBxdW90ZSBpcyB0aGUgYml0d2lzZSBub3Qgb3BlcmF0b3IgaW4gTVJJIG1vZGUuICAqLwotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICd+JzoKLSAgICAgIC8qIH4gaXMgcGVybWl0dGVkIHRvIHN0YXJ0IGEgbGFiZWwgb24gdGhlIERlbHRhLiAgKi8KLSAgICAgIGlmIChpc19uYW1lX2JlZ2lubmVyIChjKSkKLQlnb3RvIGlzbmFtZTsKLSAgICBjYXNlICchJzoKLSAgICBjYXNlICctJzoKLSAgICAgIHsKLQlvcGVyYW5kIChleHByZXNzaW9uUCk7Ci0JaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQpCi0JICB7Ci0JICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlciAtPiBjaGFyIGFmdGVyIG9wZXJhbmQgKi8KLQkgICAgaWYgKGMgPT0gJy0nKQotCSAgICAgIHsKLQkJZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IC0gZXhwcmVzc2lvblAtPlhfYWRkX251bWJlcjsKLQkJLyogTm90aWNlOiAnLScgbWF5IG92ZXJmbG93OiBubyB3YXJuaW5nIGlzIGdpdmVuLiBUaGlzIGlzCi0JCSAgIGNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLiBTaWdoLiAgKi8KLQkJZXhwcmVzc2lvblAtPlhfdW5zaWduZWQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoYyA9PSAnficgfHwgYyA9PSAnIicpCi0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IH4gZXhwcmVzc2lvblAtPlhfYWRkX251bWJlcjsKLQkgICAgZWxzZQotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAhIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXI7Ci0JICB9Ci0JZWxzZSBpZiAoZXhwcmVzc2lvblAtPlhfb3AgIT0gT19pbGxlZ2FsCi0JCSAmJiBleHByZXNzaW9uUC0+WF9vcCAhPSBPX2Fic2VudCkKLQkgIHsKLQkgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKGV4cHJlc3Npb25QKTsKLQkgICAgaWYgKGMgPT0gJy0nKQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT191bWludXM7Ci0JICAgIGVsc2UgaWYgKGMgPT0gJ34nIHx8IGMgPT0gJyInKQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19iaXRfbm90OwotCSAgICBlbHNlCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2xvZ2ljYWxfbm90OwotCSAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIH0KLQllbHNlCi0JICBhc193YXJuIChfKCJVbmFyeSBvcGVyYXRvciAlYyBpZ25vcmVkIGJlY2F1c2UgYmFkIG9wZXJhbmQgZm9sbG93cyIpLAotCQkgICBjKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnJCc6Ci0gICAgICAvKiAkIGlzIHRoZSBwcm9ncmFtIGNvdW50ZXIgd2hlbiBpbiBNUkkgbW9kZSwgb3Igd2hlbiBET0xMQVJfRE9UCi0gICAgICAgICBpcyBkZWZpbmVkLiAgKi8KLSNpZm5kZWYgRE9MTEFSX0RPVAotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotI2VuZGlmCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaSAmJiBoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgLyogSW4gTVJJIG1vZGUsICQgaXMgYWxzbyB1c2VkIGFzIHRoZSBwcmVmaXggZm9yIGEKLSAgICAgICAgICAgICBoZXhhZGVjaW1hbCBjb25zdGFudC4gICovCi0JICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQlnb3RvIGlzbmFtZTsKLQotICAgICAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIGlmICghaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICBjdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInN0YXJ0b2YuIiwgOCkgPT0gMAotCQkmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzhdKSkKLQkgICAgICAgfHwgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzaXplb2YuIiwgNykgPT0gMAotCQkgICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzddKSkpCi0JewotCSAgaW50IHN0YXJ0OwotCi0JICBzdGFydCA9IChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ3QnCi0JCSAgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnVCcpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IHN0YXJ0ID8gOCA6IDc7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKCcpCi0JICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIC5zdGFydG9mLiBvciAuc2l6ZW9mLiIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxMCk7Ci0JICAgICAgaWYgKHN0YXJ0KQotCQlzcHJpbnRmIChidWYsICIuc3RhcnRvZi4lcyIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIG5hbWUpOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbWFrZSAoYnVmKTsKLQkgICAgICBmcmVlIChidWYpOwotCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKScpCi0JCWFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIC5zdGFydG9mLiBvciAuc2l6ZW9mLiIpKTsKLQkgICAgICBlbHNlCi0JCSsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZ290byBpc25hbWU7Ci0JfQotICAgIGNhc2UgJywnOgotICAgIGNhc2UgJ1xuJzoKLSAgICBjYXNlICdcMCc6Ci0gICAgZW9sOgotICAgICAgLyogY2FuJ3QgaW1hZ2luZSBhbnkgb3RoZXIga2luZCBvZiBvcGVyYW5kICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYWJzZW50OwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyUnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoMiwgZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdAJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgIGludGVnZXJfY29uc3RhbnQgKDgsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnOic6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgcmVwcmVzZW50ZWQKLSAgICAgICAgIHVzaW5nIGhleGFkZWNpbWFsIGRpZ2l0cy4gICovCi0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoMTYsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKic6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpIHx8IGlzX3BhcnRfb2ZfbmFtZSAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JZ290byBkZV9mYXVsdDsKLQotICAgICAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgIGRlX2ZhdWx0OgotICAgICAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBjXSkKLQlnb3RvIGVvbDsKLSAgICAgIGlmIChpc19uYW1lX2JlZ2lubmVyIChjKSkJLyogaGVyZSBpZiBkaWQgbm90IGJlZ2luIHdpdGggYSBkaWdpdCAqLwotCXsKLQkgIC8qCi0JICAgKiBJZGVudGlmaWVyIGJlZ2lucyBoZXJlLgotCSAgICogVGhpcyBpcyBrbHVkZ2VkIGZvciBzcGVlZCwgc28gY29kZSBpcyByZXBlYXRlZC4KLQkgICAqLwotCWlzbmFtZToKLQkgIG5hbWUgPSAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotI2lmZGVmIG1kX3BhcnNlX25hbWUKLQkgIC8qIFRoaXMgaXMgYSBob29rIGZvciB0aGUgYmFja2VuZCB0byBwYXJzZSBjZXJ0YWluIG5hbWVzCi0gICAgICAgICAgICAgc3BlY2lhbGx5IGluIGNlcnRhaW4gY29udGV4dHMuICBJZiBhIG5hbWUgYWx3YXlzIGhhcyBhCi0gICAgICAgICAgICAgc3BlY2lmaWMgdmFsdWUsIGl0IGNhbiBvZnRlbiBiZSBoYW5kbGVkIGJ5IHNpbXBseQotICAgICAgICAgICAgIGVudGVyaW5nIGl0IGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCSAgaWYgKG1kX3BhcnNlX25hbWUgKG5hbWUsIGV4cHJlc3Npb25QKSkKLQkgICAgewotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0k5NjAKLQkgIC8qIFRoZSBNUkkgaTk2MCBhc3NlbWJsZXIgcGVybWl0cwotCSAgICAgICAgIGxkYSBzaXplb2YgY29kZSxnMTMKLQkgICAgIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgbWRfcGFyc2VfbmFtZS4gICovCi0JICBpZiAoZmxhZ19tcmkKLQkgICAgICAmJiAoc3RyY2FzZWNtcCAobmFtZSwgInNpemVvZiIpID09IDAKLQkJICB8fCBzdHJjYXNlY21wIChuYW1lLCAic3RhcnRvZiIpID09IDApKQotCSAgICB7Ci0JICAgICAgaW50IHN0YXJ0OwotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgIHN0YXJ0ID0gKG5hbWVbMV0gPT0gJ3QnCi0JCSAgICAgICB8fCBuYW1lWzFdID09ICdUJyk7Ci0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxMCk7Ci0JICAgICAgaWYgKHN0YXJ0KQotCQlzcHJpbnRmIChidWYsICIuc3RhcnRvZi4lcyIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIG5hbWUpOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbWFrZSAoYnVmKTsKLQkgICAgICBmcmVlIChidWYpOwotCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotCSAgICAgIGJyZWFrOwotCSAgICB9CSAgICAgIAotI2VuZGlmCi0KLQkgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotCSAgLyogSWYgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBzeW1ib2wgb3IgYSByZWcsIHRoZW4gd2Uga25vdyBpdHMKLQkgICAgIHZhbHVlIG5vdy4gICovCi0JICBzZWdtZW50ID0gU19HRVRfU0VHTUVOVCAoc3ltYm9sUCk7Ci0JICBpZiAoc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNlZ21lbnQgPT0gcmVnX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExldCB0aGUgdGFyZ2V0IHRyeSB0byBwYXJzZSBpdC4gIFN1Y2Nlc3MgaXMgaW5kaWNhdGVkIGJ5IGNoYW5naW5nCi0JICAgICB0aGUgWF9vcCBmaWVsZCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBPX2Fic2VudCBhbmQgcG9pbnRpbmcKLQkgICAgIGlucHV0X2xpbmVfcG9pbnRlciBwYXNzZWQgdGhlIGV4cHJlc3Npb24uICBJZiBpdCBjYW4ndCBwYXJzZSB0aGUKLQkgICAgIGV4cHJlc3Npb24sIFhfb3AgYW5kIGlucHV0X2xpbmVfcG9pbnRlciBzaG91bGQgYmUgdW5jaGFuZ2VkLiAgKi8KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19hYnNlbnQ7Ci0JICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIG1kX29wZXJhbmQgKGV4cHJlc3Npb25QKTsKLQkgIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGFzX2JhZCAoXygiQmFkIGV4cHJlc3Npb24iKSk7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qCi0gICAqIEl0IGlzIG1vcmUgJ2VmZmljaWVudCcgdG8gY2xlYW4gdXAgdGhlIGV4cHJlc3Npb25TIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4KLSAgICogRG9pbmcgaXQgaGVyZSBzYXZlcyBsaW5lcyBvZiBjb2RlLgotICAgKi8KLSAgY2xlYW5fdXBfZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7CQkvKi0+MXN0IGNoYXIgYWZ0ZXIgb3BlcmFuZC4gKi8KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcpOwotCi0gIC8qIFRoZSBQQSBwb3J0IG5lZWRzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkKLSAgICBzeW1ib2xfbWFya191c2VkIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKTsKLQotICBzd2l0Y2ggKGV4cHJlc3Npb25QLT5YX29wKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGFic29sdXRlX3NlY3Rpb247Ci0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIHJldHVybiBTX0dFVF9TRUdNRU5UIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKTsKLSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0gICAgICByZXR1cm4gcmVnX3NlY3Rpb247Ci0gICAgfQotfQkJCQkvKiBvcGVyYW5kKCkgKi8KLQwKLS8qIEludGVybmFsLiBTaW1wbGlmeSBhIHN0cnVjdCBleHByZXNzaW9uIGZvciB1c2UgYnkgZXhwcigpICovCi0KLS8qCi0gKiBJbjoJYWRkcmVzcyBvZiBhIGV4cHJlc3Npb25TLgotICoJVGhlIFhfb3AgZmllbGQgb2YgdGhlIGV4cHJlc3Npb25TIG1heSBvbmx5IHRha2UgY2VydGFpbiB2YWx1ZXMuCi0gKglFbHNld2lzZSB3ZSB3YXN0ZSB0aW1lIHNwZWNpYWwtY2FzZSB0ZXN0aW5nLiBTaWdoLiBEaXR0byBTRUdfQUJTRU5ULgotICogT3V0OglleHByZXNzaW9uUyBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOgotICoJJ2Zvby1mb28nIHN5bWJvbCByZWZlcmVuY2VzIGNhbmNlbGxlZCB0byAwLAotICoJCXdoaWNoIGNoYW5nZXMgWF9vcCBmcm9tIE9fc3VidHJhY3QgdG8gT19jb25zdGFudC4KLSAqCVVudXNlZCBmaWVsZHMgemVyb2VkIHRvIGhlbHAgZXhwcigpLgotICovCi0KLXN0YXRpYyB2b2lkCi1jbGVhbl91cF9leHByZXNzaW9uIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBzd2l0Y2ggKGV4cHJlc3Npb25QLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICBjYXNlIE9fYWJzZW50OgotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19iaWc6Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgIGNhc2UgT191bWludXM6Ci0gICAgY2FzZSBPX2JpdF9ub3Q6Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9PSBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sCi0JICB8fCAoKHN5bWJvbF9nZXRfZnJhZyAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sKQotCSAgICAgICA9PSBzeW1ib2xfZ2V0X2ZyYWcgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpKQotCSAgICAgICYmIFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpKQotCSAgICAgICYmIChTX0dFVF9WQUxVRSAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sKQotCQkgID09IFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKSkpKQotCXsKLQkgIGFkZHJlc3NUIGRpZmYgPSAoU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpCi0JCQkgICAtIFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wpKTsKLQotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciArPSBkaWZmOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBFeHByZXNzaW9uIHBhcnNlci4gKi8KLQotLyoKLSAqIFdlIGFsbG93IGFuIGVtcHR5IGV4cHJlc3Npb24sIGFuZCBqdXN0IGFzc3VtZSAoYWJzb2x1dGUsMCkgc2lsZW50bHkuCi0gKiBVbmFyeSBvcGVyYXRvcnMgYW5kIHBhcmVudGhldGljYWwgZXhwcmVzc2lvbnMgYXJlIHRyZWF0ZWQgYXMgb3BlcmFuZHMuCi0gKiBBcyB1c3VhbCwgUT09cXVhbnRpdHk9PW9wZXJhbmQsIE89PW9wZXJhdG9yLCBYPT1leHByZXNzaW9uIG1uZW1vbmljcy4KLSAqCi0gKiBXZSB1c2VkIHRvIGRvIGEgYWhvL3VsbG1hbiBzaGlmdC1yZWR1Y2UgcGFyc2VyLCBidXQgdGhlIGxvZ2ljIGdvdCBzbwotICogd2FycGVkIHRoYXQgSSBmbHVzaGVkIGl0IGFuZCB3cm90ZSBhIHJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNlciBpbnN0ZWFkLgotICogTm93IHRoaW5ncyBhcmUgc3RhYmxlLCB3b3VsZCBhbnlib2R5IGxpa2UgdG8gd3JpdGUgYSBmYXN0IHBhcnNlcj8KLSAqIE1vc3QgZXhwcmVzc2lvbnMgYXJlIGVpdGhlciByZWdpc3RlciAod2hpY2ggZG9lcyBub3QgZXZlbiByZWFjaCBoZXJlKQotICogb3IgMSBzeW1ib2wuIFRoZW4gInN5bWJvbCtjb25zdGFudCIgYW5kICJzeW1ib2wtc3ltYm9sIiBhcmUgY29tbW9uLgotICogU28gSSBndWVzcyBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgaG93IGluZWZmaWNpZW50IG1vcmUgY29tcGxleCBleHByZXNzaW9ucwotICogYXJlIHBhcnNlZC4KLSAqCi0gKiBBZnRlciBleHByKFJBTksscmVzdWx0UCkgaW5wdXRfbGluZV9wb2ludGVyLT5vcGVyYXRvciBvZiByYW5rIDw9IFJBTksuCi0gKiBBbHNvLCB3ZSBoYXZlIGNvbnN1bWVkIGFueSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyAob3BlcmFuZCBkb2VzIHRoYXQpCi0gKiBhbmQgZG9uZSBhbGwgaW50ZXJ2ZW5pbmcgb3BlcmF0b3JzLgotICoKLSAqIFRoaXMgcmV0dXJucyB0aGUgc2VnbWVudCBvZiB0aGUgcmVzdWx0LCB3aGljaCB3aWxsIGJlCi0gKiBhYnNvbHV0ZV9zZWN0aW9uIG9yIHRoZSBzZWdtZW50IG9mIGEgc3ltYm9sLgotICovCi0KLSN1bmRlZiBfXwotI2RlZmluZSBfXyBPX2lsbGVnYWwKLQotc3RhdGljIGNvbnN0IG9wZXJhdG9yVCBvcF9lbmNvZGluZ1syNTZdID0KLXsJCQkJLyogbWFwcyBBU0NJSS0+b3BlcmF0b3JzICovCi0KLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotCi0gIF9fLCBPX2JpdF9vcl9ub3QsIF9fLCBfXywgX18sIE9fbW9kdWx1cywgT19iaXRfYW5kLCBfXywKLSAgX18sIF9fLCBPX211bHRpcGx5LCBPX2FkZCwgX18sIE9fc3VidHJhY3QsIF9fLCBPX2RpdmlkZSwKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgT19sdCwgX18sIE9fZ3QsIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLAotI2lmZGVmIE5FRURfSU5ERVhfT1BFUkFUT1IKLSAgT19pbmRleCwKLSNlbHNlCi0gIF9fLAotI2VuZGlmCi0gIF9fLCBfXywgT19iaXRfZXhjbHVzaXZlX29yLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIE9fYml0X2luY2x1c2l2ZV9vciwgX18sIF9fLCBfXywKLQotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18KLX07Ci0KLQotLyoKLSAqCVJhbmsJRXhhbXBsZXMKLSAqCTAJb3BlcmFuZCwgKGV4cHJlc3Npb24pCi0gKgkxCXx8Ci0gKgkyCSYmCi0gKgkzCT0gPD4gPCA8PSA+PSA+Ci0gKgk0CSsgLQotICoJNQl1c2VkIGZvciAqIC8gJSBpbiBNUkkgbW9kZQotICoJNgkmIF4gISB8Ci0gKgk3CSogLyAlIDw8ID4+Ci0gKgk4CXVuYXJ5IC0gdW5hcnkgfgotICovCi1zdGF0aWMgb3BlcmF0b3JfcmFua1Qgb3BfcmFua1tdID0KLXsKLSAgMCwJLyogT19pbGxlZ2FsICovCi0gIDAsCS8qIE9fYWJzZW50ICovCi0gIDAsCS8qIE9fY29uc3RhbnQgKi8KLSAgMCwJLyogT19zeW1ib2wgKi8KLSAgMCwJLyogT19zeW1ib2xfcnZhICovCi0gIDAsCS8qIE9fcmVnaXN0ZXIgKi8KLSAgMCwJLyogT19iaXQgKi8KLSAgOSwJLyogT191bWludXMgKi8KLSAgOSwJLyogT19iaXRfbm90ICovCi0gIDksCS8qIE9fbG9naWNhbF9ub3QgKi8KLSAgOCwJLyogT19tdWx0aXBseSAqLwotICA4LAkvKiBPX2RpdmlkZSAqLwotICA4LAkvKiBPX21vZHVsdXMgKi8KLSAgOCwJLyogT19sZWZ0X3NoaWZ0ICovCi0gIDgsCS8qIE9fcmlnaHRfc2hpZnQgKi8KLSAgNywJLyogT19iaXRfaW5jbHVzaXZlX29yICovCi0gIDcsCS8qIE9fYml0X29yX25vdCAqLwotICA3LAkvKiBPX2JpdF9leGNsdXNpdmVfb3IgKi8KLSAgNywJLyogT19iaXRfYW5kICovCi0gIDUsCS8qIE9fYWRkICovCi0gIDUsCS8qIE9fc3VidHJhY3QgKi8KLSAgNCwJLyogT19lcSAqLwotICA0LAkvKiBPX25lICovCi0gIDQsCS8qIE9fbHQgKi8KLSAgNCwJLyogT19sZSAqLwotICA0LAkvKiBPX2dlICovCi0gIDQsCS8qIE9fZ3QgKi8KLSAgMywJLyogT19sb2dpY2FsX2FuZCAqLwotICAyLAkvKiBPX2xvZ2ljYWxfb3IgKi8KLSAgMSwJLyogT19pbmRleCAqLwotfTsKLQotLyogVW5mb3J0dW5hdGVseSwgaW4gTVJJIG1vZGUgZm9yIHRoZSBtNjhrLCBtdWx0aXBsaWNhdGlvbiBhbmQKLSAgIGRpdmlzaW9uIGhhdmUgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIHRoZSBiaXQgd2lzZSBvcGVyYXRvcnMuICBUaGlzCi0gICBmdW5jdGlvbiBzZXRzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlcyBjb3JyZWN0bHkgZm9yIHRoZSBjdXJyZW50Ci0gICBtb2RlLiAgQWxzbywgTVJJIHVzZXMgYSBkaWZmZXJlbnQgYml0X25vdCBvcGVyYXRvciwgYW5kIHRoaXMgZml4ZXMKLSAgIHRoYXQgYXMgd2VsbC4gICovCi0KLSNkZWZpbmUgU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0UgKDcpCi0jZGVmaW5lIE1SSV9NVUxfUFJFQ0VERU5DRSAoNSkKLQotdm9pZAotZXhwcl9zZXRfcHJlY2VkZW5jZSAoKQotewotICBpZiAoZmxhZ19tNjhrX21yaSkKLSAgICB7Ci0gICAgICBvcF9yYW5rW09fbXVsdGlwbHldID0gTVJJX01VTF9QUkVDRURFTkNFOwotICAgICAgb3BfcmFua1tPX2RpdmlkZV0gPSBNUklfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fbW9kdWx1c10gPSBNUklfTVVMX1BSRUNFREVOQ0U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb3BfcmFua1tPX211bHRpcGx5XSA9IFNUQU5EQVJEX01VTF9QUkVDRURFTkNFOwotICAgICAgb3BfcmFua1tPX2RpdmlkZV0gPSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRTsKLSAgICAgIG9wX3JhbmtbT19tb2R1bHVzXSA9IFNUQU5EQVJEX01VTF9QUkVDRURFTkNFOwotICAgIH0KLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgZXhwcmVzc2lvbiBwYXJzZXIuICAqLwotCi12b2lkCi1leHByX2JlZ2luICgpCi17Ci0gIGV4cHJfc2V0X3ByZWNlZGVuY2UgKCk7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgWF9vcCBmaWVsZCBpcyB3aWRlIGVub3VnaC4gICovCi0gIHsKLSAgICBleHByZXNzaW9uUyBlOwotICAgIGUuWF9vcCA9IE9fbWF4OwotICAgIGFzc2VydCAoZS5YX29wID09IE9fbWF4KTsKLSAgfQotfQotDAotLyogUmV0dXJuIHRoZSBlbmNvZGluZyBmb3IgdGhlIG9wZXJhdG9yIGF0IElOUFVUX0xJTkVfUE9JTlRFUi4KLSAgIEFkdmFuY2UgSU5QVVRfTElORV9QT0lOVEVSIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgb3BlcmF0b3IKLSAgIChpLmUuLCBkb24ndCBjaGFuZ2UgaXQgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciBvcGVyYXRvcikuICAqLwotCi1zdGF0aWMgaW5saW5lIG9wZXJhdG9yVAotb3BlcmF0b3IgKCkKLXsKLSAgaW50IGM7Ci0gIG9wZXJhdG9yVCByZXQ7Ci0KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIgJiAweGZmOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgIGNhc2UgJzwnOgotICAgICAgc3dpdGNoIChpbnB1dF9saW5lX3BvaW50ZXJbMV0pCi0JewotCWRlZmF1bHQ6Ci0JICByZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0JY2FzZSAnPCc6Ci0JICByZXQgPSBPX2xlZnRfc2hpZnQ7Ci0JICBicmVhazsKLQljYXNlICc+JzoKLQkgIHJldCA9IE9fbmU7Ci0JICBicmVhazsKLQljYXNlICc9JzoKLQkgIHJldCA9IE9fbGU7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNlICc9JzoKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJz0nKQotCXJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gT19lcTsKLQotICAgIGNhc2UgJz4nOgotICAgICAgc3dpdGNoIChpbnB1dF9saW5lX3BvaW50ZXJbMV0pCi0JewotCWRlZmF1bHQ6Ci0JICByZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0JY2FzZSAnPic6Ci0JICByZXQgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgYnJlYWs7Ci0JY2FzZSAnPSc6Ci0JICByZXQgPSBPX2dlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gcmV0OwotCi0gICAgY2FzZSAnISc6Ci0gICAgICAvKiBXZSBhY2NlcHQgISEgYXMgZXF1aXZhbGVudCB0byBeIGZvciBNUkkgY29tcGF0aWJpbGl0eS4gICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICchJykKLQl7Ci0JICBpZiAoZmxhZ19tNjhrX21yaSkKLQkgICAgcmV0dXJuIE9fYml0X2luY2x1c2l2ZV9vcjsKLQkgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2JpdF9leGNsdXNpdmVfb3I7Ci0KLSAgICBjYXNlICd8JzoKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ3wnKQotCXJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gT19sb2dpY2FsX29yOwotCi0gICAgY2FzZSAnJic6Ci0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICcmJykKLQlyZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIE9fbG9naWNhbF9hbmQ7Ci0gICAgfQotCi0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFBhcnNlIGFuIGV4cHJlc3Npb24uICAqLwotCi1zZWdUCi1leHByIChyYW5rLCByZXN1bHRQKQotICAgICBvcGVyYXRvcl9yYW5rVCByYW5rOwkvKiBMYXJnZXIgIyBpcyBoaWdoZXIgcmFuay4gKi8KLSAgICAgZXhwcmVzc2lvblMgKnJlc3VsdFA7CS8qIERlbGl2ZXIgcmVzdWx0IGhlcmUuICovCi17Ci0gIHNlZ1QgcmV0dmFsOwotICBleHByZXNzaW9uUyByaWdodDsKLSAgb3BlcmF0b3JUIG9wX2xlZnQ7Ci0gIG9wZXJhdG9yVCBvcF9yaWdodDsKLQotICBrbm93IChyYW5rID49IDApOwotCi0gIHJldHZhbCA9IG9wZXJhbmQgKHJlc3VsdFApOwotCi0gIGtub3cgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnKTsJLyogT3BlcmFuZCgpIGdvYmJsZXMgc3BhY2VzLiAqLwotCi0gIG9wX2xlZnQgPSBvcGVyYXRvciAoKTsKLSAgd2hpbGUgKG9wX2xlZnQgIT0gT19pbGxlZ2FsICYmIG9wX3JhbmtbKGludCkgb3BfbGVmdF0gPiByYW5rKQotICAgIHsKLSAgICAgIHNlZ1QgcmlnaHRzZWc7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkvKi0+YWZ0ZXIgMXN0IGNoYXJhY3RlciBvZiBvcGVyYXRvci4gKi8KLQotICAgICAgcmlnaHRzZWcgPSBleHByIChvcF9yYW5rWyhpbnQpIG9wX2xlZnRdLCAmcmlnaHQpOwotICAgICAgaWYgKHJpZ2h0Llhfb3AgPT0gT19hYnNlbnQpCi0JewotCSAgYXNfd2FybiAoXygibWlzc2luZyBvcGVyYW5kOyB6ZXJvIGFzc3VtZWQiKSk7Ci0JICByaWdodC5YX29wID0gT19jb25zdGFudDsKLQkgIHJpZ2h0LlhfYWRkX251bWJlciA9IDA7Ci0JICByaWdodC5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgcmlnaHQuWF9vcF9zeW1ib2wgPSBOVUxMOwotCX0KLQotICAgICAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcpOwotCi0gICAgICBpZiAob3BfbGVmdCA9PSBPX2luZGV4KQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICddJykKLQkgICAgYXNfYmFkICgibWlzc2luZyByaWdodCBicmFja2V0Iik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChyZXR2YWwgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgaWYgKFNFR19OT1JNQUwgKHJpZ2h0c2VnKSkKLQkgICAgcmV0dmFsID0gcmlnaHRzZWc7Ci0JfQotICAgICAgZWxzZSBpZiAoISBTRUdfTk9STUFMIChyZXR2YWwpKQotCXJldHZhbCA9IHJpZ2h0c2VnOwotICAgICAgZWxzZSBpZiAoU0VHX05PUk1BTCAocmlnaHRzZWcpCi0JICAgICAgICYmIHJldHZhbCAhPSByaWdodHNlZwotI2lmZGVmIERJRkZfRVhQUl9PSwotCSAgICAgICAmJiBvcF9sZWZ0ICE9IE9fc3VidHJhY3QKLSNlbmRpZgotCSAgICAgICApCi0JYXNfYmFkIChfKCJvcGVyYXRpb24gY29tYmluZXMgc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VnbWVudHMiKSk7Ci0KLSAgICAgIG9wX3JpZ2h0ID0gb3BlcmF0b3IgKCk7Ci0KLSAgICAgIGtub3cgKG9wX3JpZ2h0ID09IE9faWxsZWdhbCB8fCBvcF9yYW5rWyhpbnQpIG9wX3JpZ2h0XSA8PSBvcF9yYW5rWyhpbnQpIG9wX2xlZnRdKTsKLSAgICAgIGtub3cgKChpbnQpIG9wX2xlZnQgPj0gKGludCkgT19tdWx0aXBseQotCSAgICAmJiAoaW50KSBvcF9sZWZ0IDw9IChpbnQpIE9fbG9naWNhbF9vcik7Ci0KLSAgICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgcmlnaHQtaGFuZCBxdWFudGl0eS4gKi8KLSAgICAgIC8qIGxlZnQtaGFuZCBxdWFudGl0eSBpbiByZXN1bHRQICovCi0gICAgICAvKiByaWdodC1oYW5kIHF1YW50aXR5IGluIHJpZ2h0LiAqLwotICAgICAgLyogb3BlcmF0b3IgaW4gb3BfbGVmdC4gKi8KLQotICAgICAgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKHJlc3VsdFAtPlhfYWRkX251bWJlciA+IDApCi0JICAgIGFzX3dhcm4gKF8oImxlZnQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiKSk7Ci0JICBlbHNlCi0JICAgIGFzX3dhcm4gKF8oImxlZnQgb3BlcmFuZCBpcyBhIGZsb2F0OyBpbnRlZ2VyIDAgYXNzdW1lZCIpKTsKLQkgIHJlc3VsdFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotICAgICAgaWYgKHJpZ2h0Llhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKHJpZ2h0LlhfYWRkX251bWJlciA+IDApCi0JICAgIGFzX3dhcm4gKF8oInJpZ2h0IG9wZXJhbmQgaXMgYSBiaWdudW07IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgZWxzZQotCSAgICBhc193YXJuIChfKCJyaWdodCBvcGVyYW5kIGlzIGEgZmxvYXQ7IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgcmlnaHQuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICByaWdodC5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmlnaHQuWF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIHJpZ2h0Llhfb3Bfc3ltYm9sID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIE9wdGltaXplIGNvbW1vbiBjYXNlcy4gICovCi0gICAgICBpZiAob3BfbGVmdCA9PSBPX2FkZCAmJiByaWdodC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogWCArIGNvbnN0YW50LiAgKi8KLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JfQotICAgICAgLyogVGhpcyBjYXNlIGNvbWVzIHVwIGluIFBJQyBjb2RlLiAgKi8KLSAgICAgIGVsc2UgaWYgKG9wX2xlZnQgPT0gT19zdWJ0cmFjdAotCSAgICAgICAmJiByaWdodC5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmIHJlc3VsdFAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgKHN5bWJvbF9nZXRfZnJhZyAocmlnaHQuWF9hZGRfc3ltYm9sKQotCQkgICA9PSBzeW1ib2xfZ2V0X2ZyYWcgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCkpCi0JICAgICAgICYmIFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKHJpZ2h0LlhfYWRkX3N5bWJvbCkpKQotCi0JewotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHJpZ2h0LlhfYWRkX251bWJlcjsKLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSAoU19HRVRfVkFMVUUgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCkKLQkJCQkgICAgLSBTX0dFVF9WQUxVRSAocmlnaHQuWF9hZGRfc3ltYm9sKSk7Ci0JICByZXN1bHRQLT5YX29wID0gT19jb25zdGFudDsKLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0ICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBYIC0gY29uc3RhbnQuICAqLwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHJpZ2h0LlhfYWRkX251bWJlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fYWRkICYmIHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBDb25zdGFudCArIFguICAqLwotCSAgcmVzdWx0UC0+WF9vcCA9IHJpZ2h0Llhfb3A7Ci0JICByZXN1bHRQLT5YX2FkZF9zeW1ib2wgPSByaWdodC5YX2FkZF9zeW1ib2w7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IHJpZ2h0Llhfb3Bfc3ltYm9sOwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IHJpZ2h0LlhfYWRkX251bWJlcjsKLQkgIHJldHZhbCA9IHJpZ2h0c2VnOwotCX0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCAmJiByaWdodC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogQ29uc3RhbnQgT1AgY29uc3RhbnQuICAqLwotCSAgb2Zmc2V0VCB2ID0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgaWYgKHYgPT0gMCAmJiAob3BfbGVmdCA9PSBPX2RpdmlkZSB8fCBvcF9sZWZ0ID09IE9fbW9kdWx1cykpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJkaXZpc2lvbiBieSB6ZXJvIikpOwotCSAgICAgIHYgPSAxOwotCSAgICB9Ci0JICBzd2l0Y2ggKG9wX2xlZnQpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoJCQlhYm9ydCAoKTsKLQkgICAgY2FzZSBPX211bHRpcGx5OgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICo9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fZGl2aWRlOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC89IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fbW9kdWx1czoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAlPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2xlZnRfc2hpZnQ6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPDw9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JICAgICAgLyogV2UgYWx3YXlzIHVzZSB1bnNpZ25lZCBzaGlmdHMsIHRvIGF2b2lkIHJlbHlpbmcgb24KLSAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgZ2FzLiAgKi8KLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQkob2Zmc2V0VCkgKCh2YWx1ZVQpIHJlc3VsdFAtPlhfYWRkX251bWJlciA+PiAodmFsdWVUKSB2KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6CXJlc3VsdFAtPlhfYWRkX251bWJlciB8PSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9vcl9ub3Q6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgfD0gfnY7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIF49IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2FuZDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAmPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2FkZDoJCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19zdWJ0cmFjdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAtPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2VxOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA9PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19uZToKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgIT0gdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbHQ6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIDwgIHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2xlOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA8PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19nZToKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPj0gdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fZ3Q6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyID4gIHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2xvZ2ljYWxfYW5kOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IHJlc3VsdFAtPlhfYWRkX251bWJlciAmJiB2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9vcjoKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSByZXN1bHRQLT5YX2FkZF9udW1iZXIgfHwgdjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgcmlnaHQuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAob3BfbGVmdCA9PSBPX2FkZAotCQkgICB8fCBvcF9sZWZ0ID09IE9fc3VidHJhY3QKLQkJICAgfHwgKHJlc3VsdFAtPlhfYWRkX251bWJlciA9PSAwCi0JCSAgICAgICAmJiByaWdodC5YX2FkZF9udW1iZXIgPT0gMCkpKQotCXsKLQkgIC8qIFN5bWJvbCBPUCBzeW1ib2wuICAqLwotCSAgcmVzdWx0UC0+WF9vcCA9IG9wX2xlZnQ7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IHJpZ2h0LlhfYWRkX3N5bWJvbDsKLQkgIGlmIChvcF9sZWZ0ID09IE9fYWRkKQotCSAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0KQotCSAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgZ2VuZXJhbCBjYXNlLiAgKi8KLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKHJlc3VsdFApOwotCSAgcmVzdWx0UC0+WF9vcF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmcmlnaHQpOwotCSAgcmVzdWx0UC0+WF9vcCA9IG9wX2xlZnQ7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmVzdWx0UC0+WF91bnNpZ25lZCA9IDE7Ci0JfQotCi0gICAgICBvcF9sZWZ0ID0gb3BfcmlnaHQ7Ci0gICAgfQkJCQkvKiBXaGlsZSBuZXh0IG9wZXJhdG9yIGlzID49IHRoaXMgcmFuay4gKi8KLQotICAvKiBUaGUgUEEgcG9ydCBuZWVkcyB0aGlzIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCkKLSAgICBzeW1ib2xfbWFya191c2VkIChyZXN1bHRQLT5YX2FkZF9zeW1ib2wpOwotCi0gIHJldHVybiByZXN1bHRQLT5YX29wID09IE9fY29uc3RhbnQgPyBhYnNvbHV0ZV9zZWN0aW9uIDogcmV0dmFsOwotfQotDAotLyoKLSAqCQkJZ2V0X3N5bWJvbF9lbmQoKQotICoKLSAqIFRoaXMgbGl2ZXMgaGVyZSBiZWNhdXNlIGl0IGJlbG9uZ3MgZXF1YWxseSBpbiBleHByLmMgJiByZWFkLmMuCi0gKiBFeHByLmMgaXMganVzdCBhIGJyYW5jaCBvZmZpY2UgcmVhZC5jIGFueXdheSwgYW5kIHB1dHRpbmcgaXQKLSAqIGhlcmUgbGVzc2VucyB0aGUgY3Jvd2QgYXQgcmVhZC5jLgotICoKLSAqIEFzc3VtZSBpbnB1dF9saW5lX3BvaW50ZXIgaXMgYXQgc3RhcnQgb2Ygc3ltYm9sIG5hbWUuCi0gKiBBZHZhbmNlIGlucHV0X2xpbmVfcG9pbnRlciBwYXN0IHN5bWJvbCBuYW1lLgotICogVHVybiB0aGF0IGNoYXJhY3RlciBpbnRvIGEgJ1wwJywgcmV0dXJuaW5nIGl0cyBmb3JtZXIgdmFsdWUuCi0gKiBUaGlzIGFsbG93cyBhIHN0cmluZyBjb21wYXJlIChSTVMgd2FudHMgc3ltYm9sIG5hbWVzIHRvIGJlIHN0cmluZ3MpCi0gKiBvZiB0aGUgc3ltYm9sIG5hbWUuCi0gKiBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhIGNoYXIgZm9sbG93aW5nIHN5bWJvbCBuYW1lLCBiZWNhdXNlIGFsbCBnb29kCi0gKiBsaW5lcyBlbmQgaW4gZW5kLW9mLWxpbmUuCi0gKi8KLWNoYXIKLWdldF9zeW1ib2xfZW5kICgpCi17Ci0gIGNoYXIgYzsKLQotICAvKiBXZSBhY2NlcHQgXDAwMSBpbiBhIG5hbWUgaW4gY2FzZSB0aGlzIGlzIGJlaW5nIGNhbGxlZCB3aXRoIGEKLSAgICAgY29uc3RydWN0ZWQgc3RyaW5nLiAgKi8KLSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspIHx8IGMgPT0gJ1wwMDEnKQotICAgIHsKLSAgICAgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0JICAgICB8fCBjID09ICdcMDAxJykKLQk7Ci0gICAgICBpZiAoaXNfbmFtZV9lbmRlciAoYykpCi0JYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gICotLWlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIHJldHVybiAoYyk7Ci19Ci0KLQotdW5zaWduZWQgaW50Ci1nZXRfc2luZ2xlX251bWJlciAoKQotewotICBleHByZXNzaW9uUyBleHA7Ci0gIG9wZXJhbmQgKCZleHApOwotICByZXR1cm4gZXhwLlhfYWRkX251bWJlcjsKLQotfQotCi0vKiBlbmQgb2YgZXhwci5jICovCmRpZmYgLS1naXQgYS9nYXMvZXhwci5oIGIvZ2FzL2V4cHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3NjQwOS4uMDAwMDAwMAotLS0gYS9nYXMvZXhwci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qIGV4cHIuaCAtPiBoZWFkZXIgZmlsZSBmb3IgZXhwci5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogQnkgcG9wdWxhciBkZW1hbmQsIHdlIGRlZmluZSBhIHN0cnVjdCB0byByZXByZXNlbnQgYW4gZXhwcmVzc2lvbi4KLSAqIFRoaXMgd2lsbCBubyBkb3VidCBtdXRhdGUgYXMgZXhwcmVzc2lvbnMgYmVjb21lIGJhcm9xdWUuCi0gKgotICogQ3VycmVudGx5LCB3ZSBzdXBwb3J0IGV4cHJlc3Npb25zIGxpa2UgImZvbyBPUCBiYXIgKyA0MiIuICBJbiBvdGhlcgotICogd29yZHMgd2UgcGVybWl0IGEgKHBvc3NpYmx5IHVuZGVmaW5lZCkgc3ltYm9sLCBhIChwb3NzaWJseQotICogdW5kZWZpbmVkKSBzeW1ib2wgYW5kIHRoZSBvcGVyYXRpb24gdXNlZCB0byBjb21iaW5lIHRoZSBzeW1ib2xzLAotICogYW5kIGFuIChhYnNvbHV0ZSkgYXVnZW5kLiAgUk1TIHNheXMgdGhpcyBpcyBzbyB3ZSBjYW4gaGF2ZSAxLXBhc3MKLSAqIGFzc2VtYmx5IGZvciBhbnkgY29tcGlsZXIgZW1pc3Npb25zLCBhbmQgYSAnY2FzZScgc3RhdGVtZW50IG1pZ2h0Ci0gKiBlbWl0ICd1bmRlZmluZWQxIC0gdW5kZWZpbmVkMicuCi0gKgotICogVGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiB1c2VkIHRvIGJlIHN0b3JlZCBhcyBhIHNlZ21lbnQuICBUaGF0IGdvdAotICogY29uZnVzaW5nIGJlY2F1c2UgaXQgb3ZlcmxvYWRlZCB0aGUgY29uY2VwdCBvZiBhIHNlZ21lbnQuICBJIGFkZGVkCi0gKiBhbiBvcGVyYXRvciBmaWVsZCwgaW5zdGVhZC4KLSAqLwotCi0vKiBUaGlzIGlzIHRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24uICBUaGUgb3BlcmF0b3IgdHlwZXMgYXJlIGFsc28KLSAgIHVzZWQgd2hpbGUgcGFyc2luZyBhbiBleHByZXNzaW9uLgotCi0gICBOT1RFOiBUaGlzIGVudW1lcmF0aW9uIG11c3QgbWF0Y2ggdGhlIG9wX3JhbmsgYXJyYXkgaW4gZXhwci5jLiAgKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gIC8qIEFuIGlsbGVnYWwgZXhwcmVzc2lvbi4gICovCi0gIE9faWxsZWdhbCwKLSAgLyogQSBub25leGlzdGVudCBleHByZXNzaW9uLiAgKi8KLSAgT19hYnNlbnQsCi0gIC8qIFhfYWRkX251bWJlciAoYSBjb25zdGFudCBleHByZXNzaW9uKS4gICovCi0gIE9fY29uc3RhbnQsCi0gIC8qIFhfYWRkX3N5bWJvbCArIFhfYWRkX251bWJlci4gICovCi0gIE9fc3ltYm9sLAotICAvKiBYX2FkZF9zeW1ib2wgKyBYX2FkZF9udW1iZXIgLSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBpbWFnZS4gICovCi0gIE9fc3ltYm9sX3J2YSwKLSAgLyogQSByZWdpc3RlciAoWF9hZGRfbnVtYmVyIGlzIHJlZ2lzdGVyIG51bWJlcikuICAqLwotICBPX3JlZ2lzdGVyLAotICAvKiBBIGJpZyB2YWx1ZS4gIElmIFhfYWRkX251bWJlciBpcyBuZWdhdGl2ZSBvciAwLCB0aGUgdmFsdWUgaXMgaW4KLSAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuICBPdGhlcndpc2UgdGhlIHZhbHVlIGlzIGluCi0gICAgIGdlbmVyaWNfYmlnbnVtLCBhbmQgWF9hZGRfbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgTElUVExFTlVNcyBpbgotICAgICB0aGUgdmFsdWUuICAqLwotICBPX2JpZywKLSAgLyogKC0gWF9hZGRfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fdW1pbnVzLAotICAvKiAofiBYX2FkZF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfbm90LAotICAvKiAoISBYX2FkZF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sb2dpY2FsX25vdCwKLSAgLyogKFhfYWRkX3N5bWJvbCAqIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbXVsdGlwbHksCi0gIC8qIChYX2FkZF9zeW1ib2wgLyBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2RpdmlkZSwKLSAgLyogWF9hZGRfc3ltYm9sICUgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19tb2R1bHVzLAotICAvKiBYX2FkZF9zeW1ib2wgPDwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sZWZ0X3NoaWZ0LAotICAvKiBYX2FkZF9zeW1ib2wgPj4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19yaWdodF9zaGlmdCwKLSAgLyogWF9hZGRfc3ltYm9sIHwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfaW5jbHVzaXZlX29yLAotICAvKiBYX2FkZF9zeW1ib2wgfH4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfb3Jfbm90LAotICAvKiBYX2FkZF9zeW1ib2wgXiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9leGNsdXNpdmVfb3IsCi0gIC8qIFhfYWRkX3N5bWJvbCAmIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYml0X2FuZCwKLSAgLyogWF9hZGRfc3ltYm9sICsgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19hZGQsCi0gIC8qIFhfYWRkX3N5bWJvbCAtIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fc3VidHJhY3QsCi0gIC8qIChYX2FkZF9zeW1ib2wgPT0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19lcSwKLSAgLyogKFhfYWRkX3N5bWJvbCAhPSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX25lLAotICAvKiAoWF9hZGRfc3ltYm9sIDwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sdCwKLSAgLyogKFhfYWRkX3N5bWJvbCA8PSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xlLAotICAvKiAoWF9hZGRfc3ltYm9sID49IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fZ2UsCi0gIC8qIChYX2FkZF9zeW1ib2wgPiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2d0LAotICAvKiAoWF9hZGRfc3ltYm9sICYmIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbG9naWNhbF9hbmQsCi0gIC8qIChYX2FkZF9zeW1ib2wgfHwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sb2dpY2FsX29yLAotICAvKiBYX29wX3N5bWJvbCBbIFhfYWRkX3N5bWJvbCBdICovCi0gIE9faW5kZXgsCi0gIC8qIHRoaXMgbXVzdCBiZSB0aGUgbGFyZ2VzdCB2YWx1ZSAqLwotICBPX21heAotfSBvcGVyYXRvclQ7Ci0KLXR5cGVkZWYgc3RydWN0IGV4cHJlc3Npb25TCi17Ci0gIC8qIFRoZSBtYWluIHN5bWJvbC4gICovCi0gIHN5bWJvbFMgKlhfYWRkX3N5bWJvbDsKLSAgLyogVGhlIHNlY29uZCBzeW1ib2wsIGlmIG5lZWRlZC4gICovCi0gIHN5bWJvbFMgKlhfb3Bfc3ltYm9sOwotICAvKiBBIG51bWJlciB0byBhZGQuICAqLwotICBvZmZzZXRUIFhfYWRkX251bWJlcjsKLSAgLyogVGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uICBXZSBjYW4ndCBhc3N1bWUgdGhhdCBhbiBhcmJpdHJhcnkKLSAgICAgY29tcGlsZXIgY2FuIGhhbmRsZSBhIGJpdGZpZWxkIG9mIGVudW0gdHlwZS4gIEZJWE1FOiBXZSBjb3VsZAotICAgICBjaGVjayB0aGlzIHVzaW5nIGF1dG9jb25mLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotICBvcGVyYXRvclQgWF9vcCA6IDc7Ci0jZWxzZQotICB1bnNpZ25lZCBYX29wIDogNzsKLSNlbmRpZgotICAvKiBOb24temVybyBpZiBYX2FkZF9udW1iZXIgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIHVuc2lnbmVkLiAgVGhpcyBpcwotICAgICBvbmx5IHZhbGlkIGZvciBPX2NvbnN0YW50IGV4cHJlc3Npb25zLiAgSXQgaXMgb25seSB1c2VkIHdoZW4gYW4KLSAgICAgT19jb25zdGFudCBtdXN0IGJlIGV4dGVuZGVkIGludG8gYSBiaWdudW0gKGkuZS4sIGl0IGlzIG5vdCB1c2VkCi0gICAgIHdoZW4gcGVyZm9ybWluZyBhcml0aG1ldGljIG9uIHRoZXNlIHZhbHVlcykuCi0gICAgIEZJWE1FOiBUaGlzIGZpZWxkIGlzIG5vdCBzZXQgdmVyeSByZWxpYWJseS4gICovCi0gIHVuc2lnbmVkIGludCBYX3Vuc2lnbmVkIDogMTsKLX0gZXhwcmVzc2lvblM7Ci0KLS8qICJyZXN1bHQiIHNob3VsZCBiZSB0eXBlIChleHByZXNzaW9uUyAqKS4gKi8KLSNkZWZpbmUgZXhwcmVzc2lvbihyZXN1bHQpIGV4cHIgKDAsIHJlc3VsdCkKLQotLyogSWYgYW4gZXhwcmVzc2lvbiBpcyBPX2JpZywgbG9vayBoZXJlIGZvciBpdHMgdmFsdWUuIFRoZXNlIGNvbW1vbgotICAgZGF0YSBtYXkgYmUgY2xvYmJlcmVkIHdoZW5ldmVyIGV4cHIoKSBpcyBjYWxsZWQuICovCi0vKiBGbG9udW1zIHJldHVybmVkIGhlcmUuICBCaWcgZW5vdWdoIHRvIGhvbGQgbW9zdCBwcmVjaXNlIGZsb251bS4gKi8KLWV4dGVybiBGTE9OVU1fVFlQRSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLS8qIEJpZ251bXMgcmV0dXJuZWQgaGVyZS4gKi8KLWV4dGVybiBMSVRUTEVOVU1fVFlQRSBnZW5lcmljX2JpZ251bVtdOwotLyogTnVtYmVyIG9mIGxpdHRsZW51bXMgaW4gYWJvdmUuICovCi0jZGVmaW5lIFNJWkVfT0ZfTEFSR0VfTlVNQkVSICgyMCkKLQotdHlwZWRlZiBjaGFyIG9wZXJhdG9yX3JhbmtUOwotCi1leHRlcm4gY2hhciBnZXRfc3ltYm9sX2VuZCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBleHByX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGV4cHJfc2V0X3ByZWNlZGVuY2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHNlZ1QgZXhwciBQQVJBTVMgKChpbnQgcmFuaywgZXhwcmVzc2lvblMgKiByZXN1bHRQKSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGdldF9zaW5nbGVfbnVtYmVyIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBzeW1ib2xTICptYWtlX2V4cHJfc3ltYm9sIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLWV4dGVybiBpbnQgZXhwcl9zeW1ib2xfd2hlcmUKLSAgUEFSQU1TICgoc3ltYm9sUyAqLCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1leHRlcm4gc3ltYm9sUyAqZXhwcl9idWlsZF91Y29uc3RhbnQgUEFSQU1TICgob2Zmc2V0VCkpOwotZXh0ZXJuIHN5bWJvbFMgKmV4cHJfYnVpbGRfdW5hcnkgUEFSQU1TICgob3BlcmF0b3JULCBzeW1ib2xTICopKTsKLWV4dGVybiBzeW1ib2xTICpleHByX2J1aWxkX2JpbmFyeSBQQVJBTVMgKChvcGVyYXRvclQsIHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci1leHRlcm4gc3ltYm9sUyAqZXhwcl9idWlsZF9kb3QgUEFSQU1TICgodm9pZCkpOwotCi0vKiBlbmQgb2YgZXhwci5oICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLWNvcHkuYyBiL2dhcy9mbG9udW0tY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmNjNWNjLi4wMDAwMDAwCi0tLSBhL2dhcy9mbG9udW0tY29weS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogZmxvbnVtX2NvcHkuYyAtIGNvcHkgYSBmbG9udW0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotdm9pZAotZmxvbnVtX2NvcHkgKGluLCBvdXQpCi0gICAgIEZMT05VTV9UWVBFICppbjsKLSAgICAgRkxPTlVNX1RZUEUgKm91dDsKLXsKLSAgdW5zaWduZWQgaW50IGluX2xlbmd0aDsJCS8qIDAgb3JpZ2luICovCi0gIHVuc2lnbmVkIGludCBvdXRfbGVuZ3RoOwkJLyogMCBvcmlnaW4gKi8KLQotICBvdXQtPnNpZ24gPSBpbi0+c2lnbjsKLSAgaW5fbGVuZ3RoID0gaW4tPmxlYWRlciAtIGluLT5sb3c7Ci0KLSAgaWYgKGluLT5sZWFkZXIgPCBpbi0+bG93KQotICAgIHsKLSAgICAgIG91dC0+bGVhZGVyID0gb3V0LT5sb3cgLSAxOwkvKiAwLjAgY2FzZSAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG91dF9sZW5ndGggPSBvdXQtPmhpZ2ggLSBvdXQtPmxvdzsKLSAgICAgIC8qCi0gICAgICAgKiBBc3N1bWUgbm8gR0FQUyBpbiBwYWNraW5nIG9mIGxpdHRsZW51bXMuCi0gICAgICAgKiBJLmUuIHNpemVvZihhcnJheSkgPT0gc2l6ZW9mKGVsZW1lbnQpICogbnVtYmVyX29mX2VsZW1lbnRzLgotICAgICAgICovCi0gICAgICBpZiAoaW5fbGVuZ3RoIDw9IG91dF9sZW5ndGgpCi0JewotCSAgewotCSAgICAvKgotCSAgICAgKiBGb3IgZGVmZW5zaXZlIHByb2dyYW1taW5nLCB6ZXJvIGFueSBoaWdoLW9yZGVyIGxpdHRsZW51bXMgd2UgZG9uJ3QgbmVlZC4KLQkgICAgICogVGhpcyBpcyBkZXN0cm95aW5nIGV2aWRlbmNlIGFuZCB3YXN0aW5nIHRpbWUsIHNvIHdoeSBib3RoZXI/Pz8KLQkgICAgICovCi0JICAgIGlmIChpbl9sZW5ndGggPCBvdXRfbGVuZ3RoKQotCSAgICAgIHsKLQkJbWVtc2V0ICgoY2hhciAqKSAob3V0LT5sb3cgKyBpbl9sZW5ndGggKyAxKSwgJ1wwJywgb3V0X2xlbmd0aCAtIGluX2xlbmd0aCk7Ci0JICAgICAgfQotCSAgfQotCSAgbWVtY3B5ICgodm9pZCAqKSAob3V0LT5sb3cpLCAodm9pZCAqKSAoaW4tPmxvdyksICgoaW5fbGVuZ3RoICsgMSkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSkpOwotCSAgb3V0LT5leHBvbmVudCA9IGluLT5leHBvbmVudDsKLQkgIG91dC0+bGVhZGVyID0gaW4tPmxlYWRlciAtIGluLT5sb3cgKyBvdXQtPmxvdzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHNob3J0ZW47CQkvKiAxLW9yaWdpbi4gTnVtYmVyIG9mIGxpdHRsZW51bXMgd2UgZHJvcC4gKi8KLQotCSAgc2hvcnRlbiA9IGluX2xlbmd0aCAtIG91dF9sZW5ndGg7Ci0JICAvKiBBc3N1bWUgb3V0X2xlbmd0aCA+PSAwICEgKi8KLQkgIG1lbWNweSAoKHZvaWQgKikgKG91dC0+bG93KSwgKHZvaWQgKikgKGluLT5sb3cgKyBzaG9ydGVuKSwgKChvdXRfbGVuZ3RoICsgMSkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSkpOwotCSAgb3V0LT5sZWFkZXIgPSBvdXQtPmhpZ2g7Ci0JICBvdXQtPmV4cG9uZW50ID0gaW4tPmV4cG9uZW50ICsgc2hvcnRlbjsKLQl9Ci0gICAgfQkJCQkvKiBpZiBhbnkgc2lnbmlmaWNhbnQgYml0cyAqLwotfQkJCQkvKiBmbG9udW1fY29weSgpICovCi0KLS8qIGVuZCBvZiBmbG9udW1fY29weS5jICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLWtvbnN0LmMgYi9nYXMvZmxvbnVtLWtvbnN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYmJhMDUuLjAwMDAwMDAKLS0tIGEvZ2FzL2Zsb251bS1rb25zdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qIGZsb251bV9jb25zdC5jIC0gVXNlZnVsIEZsb251bSBjb25zdGFudHMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgImZsb251bS5oIgotLyogSkY6ICBJIGFkZGVkIHRoZSBsYXN0IGVudHJ5IHRvIHRoaXMgdGFibGUsIGFuZCBJJ20gbm90Ci0gICBzdXJlIGlmIGl0cyByaWdodCBvciBub3QuICBDb3VsZCBnbyBlaXRoZXIgd2F5LiAgSSB3aXNoCi0gICBJIHJlYWxseSB1bmRlcnN0b29kIHRoaXMgc3R1ZmYuICovCi0KLQotY29uc3QgaW50IHRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW4gPSAxMzsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHplcm9bXSA9Ci17MX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJV2FybmluZzogdGhlIGxvdyBvcmRlciBiaXRzIG1heSBiZSBXUk9ORyBoZXJlLgkJCSoKLSAqCUkgdG9vayB0aGlzIGZyb20gYSBzdXNwZWN0IGJjKDEpIHNjcmlwdC4JCQkqCi0gKgkibWludXNfWCJbXSBpcyBzdXBwb3NlZCB0byBiZSAxMF4oMl4tWCkgZXhwcmVzc2VkIGluIGJhc2UgMl4xNi4JKgotICoJVGhlIHJhZGl4IHBvaW50IGlzIGp1c3QgQUZURVIgdGhlIGhpZ2hlc3QgZWxlbWVudCBvZiB0aGUgW10JKgotICoJCQkJCQkJCQkqCi0gKglCZWNhdXNlIGJjIHJvdW5kcyBET1dOIGZvciBwcmludGluZyAoSSB0aGluayksIHRoZSBsb3dlc3QJKgotICoJc2lnbmlmaWNhbmNlIGxpdHRsZW51bXMgc2hvdWxkIHByb2JhYmx5IGhhdmUgMSBhZGRlZCB0byB0aGVtLgkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEpGOiAgSWYgdGhpcyBlcXVhbHMgNjU1My8oMl4xNikrMzkzMjEvKDJeMzIpKy4uLiAgaXQgYXBwcm9hY2hlcyAuMSAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzFbXSA9Ci17Ci0gIDM5MzIyLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLAotICAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCA2NTUzfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzFbXSA9Ci17MTB9OwotCi0vKiBKRjogIElmIHRoaXMgZXF1YWxzIDY1NS8oMl4xNikgKyAyMzU5Mi8oMl4zMikgKyAuLi4gaXQgYXBwcm9hY2hlcyAuMDEgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18yW10gPQotewotICAxMDQ4NiwgMzY3MDAsIDYyOTE0LCAyMzU5MiwgNDk4MDcsIDEwNDg1LCAzNjcwMCwgNjI5MTQsIDIzNTkyLCA0OTgwNywKLSAgMTA0ODUsIDM2NzAwLCA2MjkxNCwgMjM1OTIsIDQ5ODA3LCAxMDQ4NSwgMzY3MDAsIDYyOTE0LCAyMzU5MiwgNjU1fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzJbXSA9Ci17MTAwfTsKLQotLyogVGhpcyBhcHByb2FjaGVzIC4wMDAxICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfM1tdID0KLXsKLSAgNTI1MzQsIDIwMDI3LCAzNzMyOSwgNjUxMTYsIDY0MDY3LCA2MDM5NywgMTQ3ODQsIDE4OTc5LCAzMzY1OSwgMTk1MDMsCi0gIDI3MjYsIDk1NDIsIDYyOSwgMjIwMiwgNDA0NzUsIDEwNTkwLCA0Mjk5LCA0NzgxNSwgMzYyODAsIDZ9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfM1tdID0KLXsxMDAwMH07Ci0KLS8qIEpGOiB0aGlzIGFwcHJvYWNoZXMgMWUtOCAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzRbXSA9Ci17Ci0gIDIyNTE3LCA0OTUwMSwgNTQyOTMsIDE5NDI0LCA2MDY5OSwgNjcxNiwgMjQzNDgsIDIyNjE4LCAyMzkwNCwgMjEzMjcsCi0gIDM5MTksIDQ0NzAzLCAxOTE0OSwgMjg4MDMsIDQ4OTU5LCA2MjU5LCA1MDI3MywgNjIyMzcsIDQyfTsKLS8qIFRoaXMgZXF1YWxzIDE1MjUgKiAyXjE2ICsgNTc2MDAgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzRbXSA9Ci17NTc2MDAsIDE1MjV9OwotCi0vKiBUaGlzIGFwcHJvYWNoZXMgMWUtMTYgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c181W10gPQotewotICAyMjE5OSwgNDU5NTcsIDE3MDA1LCAyNjI2NiwgMTA1MjYsIDE2MjYwLCA1NTAxNywgMzU2ODAsIDQwNDQzLCAxOTc4OSwKLSAgMTczNTYsIDMwMTk1LCA1NTkwNSwgMjg0MjYsIDYzMDEwLCA0NDE5NywgMTg0NH07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c181W10gPQotezI4NjA5LCAzNDU0NiwgMzV9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfNltdID0KLXsKLSAgMzA5MjYsIDI2NTE4LCAxMzExMCwgNDMwMTgsIDU0OTgyLCA0ODI1OCwgMjQ2NTgsIDE1MjA5LCA2MzM2NiwgMTE5MjksCi0gIDIwMDY5LCA0Mzg1NywgNjA0ODcsIDUxfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzZbXSA9Ci17NjEzMTMsIDM0MjIwLCAxNjczMSwgMTE2MjksIDEyNjJ9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfN1tdID0KLXsKLSAgMjk4MTksIDE0NzMzLCAyMTQ5MCwgNDA2MDIsIDMxMzE1LCA2NTE4NiwgMjY5NX07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c183W10gPQotewotICA3OTM3LCA0OTAwMiwgNjA3NzIsIDI4MjE2LCAzODg5MywgNTU5NzUsIDYzOTg4LCA1OTcxMSwgMjAyMjcsIDI0fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzhbXSA9Ci17Ci0gIDI3NTc5LCA2NDgwNywgMTI1NDMsIDc5NCwgMTM5MDcsIDYxMjk3LCAxMjAxMywgNjQzNjAsIDE1OTYxLCAyMDU2NiwKLSAgMjQxNzgsIDE1OTIyLCA1OTQyNywgMTEwfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzhbXSA9Ci17Ci0gIDE1ODczLCAxMTkyNSwgMzkxNzcsIDk5MSwgMTQ1ODksIDM4NjEsIDU4NDE1LCA5MDc2LCA2Mjk1NiwgNTQyMjMsCi0gIDU2MzI4LCA1MDE4MCwgNDUyNzQsIDQ4MzMzLCAzMjUzNywgNDI1NDcsIDk3MzEsIDU5Njc5LCA1OTB9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfOVtdID0KLXsKLSAgMTEwNDIsIDg0NjQsIDU4OTcxLCA2MzQyOSwgNjAyMiwgNjM0ODUsIDU1MDAsIDUzNDY0LCA0NzU0NSwgNTAwNjgsCi0gIDU2OTg4LCAyMjgxOSwgNDk3MDgsIDU0NDkzLCA5OTIwLCA0NzY2NywgNDA0MDksIDM1NzY0LCAxMDM4MywgNTQ0NjYsCi0gIDMyNzAyLCAxNzQ5MywgMzI0MjAsIDM0MzgyLCAyMjc1MCwgMjA2ODEsIDEyMzAwfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzlbXSA9Ci17Ci0gIDIwNjc4LCAyNzYxNCwgMjgyNzIsIDUzMDY2LCA1NTMxMSwgNTQ2NzcsIDI5MDM4LCA5OTA2LCAyNjI4OCwgNDQ0ODYsCi0gIDEzODYwLCA3NDQ1LCA1NDEwNiwgMTU0MjYsIDIxNTE4LCAyNTU5OSwgMjk2MzIsIDUyMzA5LCA2MTIwNywgMjYxMDUsCi0gIDEwNDgyLCAyMTk0OCwgNTExOTEsIDMyOTg4LCA2MDg5MiwgNjI1NzQsIDYxMzkwLCAyNDU0MCwgMjE0OTUsIDV9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMTBbXSA9Ci17Ci0gIDYyMTQsIDQ4NzcxLCAyMzQ3MSwgMzAxNjMsIDMxNzYzLCAzODAxMywgNTcwMDEsIDExNzcwLCAxODI2MywgMzYzNjYsCi0gIDIwNzQyLCA0NTA4NiwgNTY5NjksIDUzMjMxLCAzNzg1NiwgNTU4MTQsIDM4MDU3LCAxNTY5MiwgNDY3NjEsIDg3MTMsCi0gIDYxMDIsIDIwMDgzLCA4MjY5LCAxMTgzOSwgMTE1NzEsIDUwOTYzLCAxNTY0OSwgMTE2OTgsIDQwNjc1LCAyMzA4fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzEwW10gPQotewotICA2MzgzOSwgMzY1NzYsIDQ1NzEyLCA0NDUxNiwgMzc4MDMsIDI5NDgyLCA0OTY2LCAzMDU1NiwgMzc5NjEsIDIzMzEwLAotICAyNzA3MCwgNDQ5NzIsIDI5NTA3LCA0ODI1NywgNDUyMDksIDc0OTQsIDE3ODMxLCAzODcyOCwgNDE1NzcsIDI5NDQzLAotICAzNjAxNiwgNzk1NSwgMzUzMzksIDM1NDc5LCAzNjAxMSwgMTQ1NTMsIDQ5NjE4LCA1NTg4LCAyNTM5NiwgMjh9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMTFbXSA9Ci17Ci0gIDE2NjYzLCA1Njg4MiwgNjE5ODMsIDc4MDQsIDM2NTU1LCAzMjA2MCwgMzQ1MDIsIDEwMDAsIDE0MzU2LCAyMTY4MSwKLSAgNjYwNSwgMzQ3NjcsIDUxNDExLCA1OTA0OCwgNTM2MTQsIDM5ODUwLCAzMDA3OSwgNjQ5NiwgNjg0NiwgMjY4NDEsCi0gIDQwNzc4LCAxOTU3OCwgNTk4OTksIDQ0MDg1LCA1NDAxNiwgMjQyNTksIDExMjMyLCAyMTIyOSwgMjEzMTMsIDgxfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzExW10gPQotewotICA5MiwgOTA1NCwgNjI3MDcsIDE3OTkzLCA3ODIxLCA1NjgzOCwgMTM5OTIsIDIxMzIxLCAyOTYzNywgNDg0MjYsCi0gIDQyOTgyLCAzODY2OCwgNDk1NzQsIDI4ODIwLCAxODIwMCwgMTg5MjcsIDUzOTc5LCAxNjIxOSwgMzc0ODQsIDI1MTYsCi0gIDQ0NjQyLCAxNDY2NSwgMTE1ODcsIDQxOTI2LCAxMzU1NiwgMjM5NTYsIDU0MzIwLCA2NjYxLCA1NTc2NiwgODA1fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzEyW10gPQotewotICAzMzIwMiwgNDU5NjksIDU4ODA0LCA1NjczNCwgMTY0ODIsIDI2MDA3LCA0NDk4NCwgNDkzMzQsIDMxMDA3LCAzMjk0NCwKLSAgNDQ1MTcsIDYzMzI5LCA0NzEzMSwgMTUyOTEsIDU5NDY1LCAyMjY0LCAyMzIxOCwgMTE4MjksIDU5NzcxLCAzODc5OCwKLSAgMzEwNTEsIDI4NzQ4LCAyMzEyOSwgNDA1NDEsIDQxNTYyLCAzNTEwOCwgNTA2MjAsIDU5MDE0LCA1MTgxNywgNjYxM307Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xMltdID0KLXsKLSAgMTAwOTgsIDM3OTIyLCA1ODA3MCwgNzQzMiwgMTA0NzAsIDYzNDY1LCAyMzcxOCwgNjIxOTAsIDQ3NDIwLCA3MDA5LAotICAzODQ0MywgNDU4NywgNDU1OTYsIDM4NDcyLCA1MjEyOSwgNTI3NzksIDI5MDEyLCAxMzU1OSwgNDg2ODgsIDMxNjc4LAotICA0MTc1MywgNTg2NjIsIDEwNjY4LCAzNjA2NywgMjk5MDYsIDU2OTA2LCAyMTQ2MSwgNDY1NTYsIDU5NTcxLCA5fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzEzW10gPQotewotICA0NTMwOSwgMjc1OTIsIDM3MTQ0LCAzNDYzNywgMzQzMjgsIDQxNjcxLCAzNDYyMCwgMjQxMzUsIDUzNDAxLCAyMjExMiwKLSAgMjE1NzYsIDQ1MTQ3LCAzOTMxMCwgNDQwNTEsIDQ4NTcyLCAzNjc2LCA0NjU0NCwgNTk3NjgsIDMzMzUwLCAyMzIzLAotICA0OTUyNCwgNjE1NjgsIDM5MDMsIDM2NDg3LCAzNjM1NiwgMzA5MDMsIDE0OTc1LCA5MDM1LCAyOTcxNSwgNjY3fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzEzW10gPQotewotICAxODc4OCwgMTY5NjAsIDYzMTgsIDQ1Njg1LCA1NTQwMCwgNDYyMzAsIDM1Nzk0LCAyNTU4OCwgNzI1MywgNTU1NDEsCi0gIDQ5NzE2LCA1OTc2MCwgNjM1OTIsIDgxOTEsIDYzNzY1LCA1ODUzMCwgNDQ2NjcsIDEzMjk0LCAxMDAwMSwgNTU1ODYsCi0gIDQ3ODg3LCAxODczOCwgOTUwOSwgNDA4OTYsIDQyNTA2LCA1MjU4MCwgNDE3MSwgMzI1LCAxMjMyOSwgOTh9OwotCi0vKiBTaHV0IHVwIGNvbXBsYWludHMgYWJvdXQgZGlmZmVyaW5nIHBvaW50ZXIgdHlwZXMuICBUaGV5IG9ubHkgZGlmZmVyCi0gICBpbiB0aGUgY29uc3QgYXR0cmlidXRlLCBidXQgdGhlcmUgaXNuJ3QgYW55IGVhc3kgd2F5IHRvIGRvIHRoaXMKLSAgICovCi0jZGVmaW5lIFggKExJVFRMRU5VTV9UWVBFICopCi0KLWNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9uZWdhdGl2ZV9wb3dlcnNfb2ZfdGVuW10gPQotewotICB7WCB6ZXJvLCBYIHplcm8sIFggemVybywgMCwgJysnfSwKLSAge1ggbWludXNfMSwgWCBtaW51c18xICsgMTksIFggbWludXNfMSArIDE5LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzIsIFggbWludXNfMiArIDE5LCBYIG1pbnVzXzIgKyAxOSwgLTIwLCAnKyd9LAotICB7WCBtaW51c18zLCBYIG1pbnVzXzMgKyAxOSwgWCBtaW51c18zICsgMTksIC0yMCwgJysnfSwKLSAge1ggbWludXNfNCwgWCBtaW51c180ICsgMTgsIFggbWludXNfNCArIDE4LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzUsIFggbWludXNfNSArIDE2LCBYIG1pbnVzXzUgKyAxNiwgLTIwLCAnKyd9LAotICB7WCBtaW51c182LCBYIG1pbnVzXzYgKyAxMywgWCBtaW51c182ICsgMTMsIC0yMCwgJysnfSwKLSAge1ggbWludXNfNywgWCBtaW51c183ICsgNiwgWCBtaW51c183ICsgNiwgLTIwLCAnKyd9LAotICB7WCBtaW51c184LCBYIG1pbnVzXzggKyAxMywgWCBtaW51c184ICsgMTMsIC00MCwgJysnfSwKLSAge1ggbWludXNfOSwgWCBtaW51c185ICsgMjYsIFggbWludXNfOSArIDI2LCAtODAsICcrJ30sCi0gIHtYIG1pbnVzXzEwLCBYIG1pbnVzXzEwICsgMjksIFggbWludXNfMTAgKyAyOSwgLTEzNiwgJysnfSwKLSAge1ggbWludXNfMTEsIFggbWludXNfMTEgKyAyOSwgWCBtaW51c18xMSArIDI5LCAtMjQyLCAnKyd9LAotICB7WCBtaW51c18xMiwgWCBtaW51c18xMiArIDI5LCBYIG1pbnVzXzEyICsgMjksIC00NTUsICcrJ30sCi0gIHtYIG1pbnVzXzEzLCBYIG1pbnVzXzEzICsgMjksIFggbWludXNfMTMgKyAyOSwgLTg4MCwgJysnfSwKLX07Ci0KLWNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9wb3NpdGl2ZV9wb3dlcnNfb2ZfdGVuW10gPQotewotICB7WCB6ZXJvLCBYIHplcm8sIFggemVybywgMCwgJysnfSwKLSAge1ggcGx1c18xLCBYIHBsdXNfMSArIDAsIFggcGx1c18xICsgMCwgMCwgJysnfSwKLSAge1ggcGx1c18yLCBYIHBsdXNfMiArIDAsIFggcGx1c18yICsgMCwgMCwgJysnfSwKLSAge1ggcGx1c18zLCBYIHBsdXNfMyArIDAsIFggcGx1c18zICsgMCwgMCwgJysnfSwKLSAge1ggcGx1c180LCBYIHBsdXNfNCArIDEsIFggcGx1c180ICsgMSwgMCwgJysnfSwKLSAge1ggcGx1c181LCBYIHBsdXNfNSArIDIsIFggcGx1c181ICsgMiwgMSwgJysnfSwKLSAge1ggcGx1c182LCBYIHBsdXNfNiArIDQsIFggcGx1c182ICsgNCwgMiwgJysnfSwKLSAge1ggcGx1c183LCBYIHBsdXNfNyArIDksIFggcGx1c183ICsgOSwgNCwgJysnfSwKLSAge1ggcGx1c184LCBYIHBsdXNfOCArIDE4LCBYIHBsdXNfOCArIDE4LCA4LCAnKyd9LAotICB7WCBwbHVzXzksIFggcGx1c185ICsgMjksIFggcGx1c185ICsgMjksIDI0LCAnKyd9LAotICB7WCBwbHVzXzEwLCBYIHBsdXNfMTAgKyAyOSwgWCBwbHVzXzEwICsgMjksIDc3LCAnKyd9LAotICB7WCBwbHVzXzExLCBYIHBsdXNfMTEgKyAyOSwgWCBwbHVzXzExICsgMjksIDE4MywgJysnfSwKLSAge1ggcGx1c18xMiwgWCBwbHVzXzEyICsgMjksIFggcGx1c18xMiArIDI5LCAzOTYsICcrJ30sCi0gIHtYIHBsdXNfMTMsIFggcGx1c18xMyArIDI5LCBYIHBsdXNfMTMgKyAyOSwgODIxLCAnKyd9LAotfTsKLQotI2lmZGVmIFZNUwotdm9pZCBkdW1teTEgKCkgeyB9Ci0jZW5kaWYKLS8qIGVuZCBvZiBmbG9udW1fY29uc3QuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Zsb251bS1tdWx0LmMgYi9nYXMvZmxvbnVtLW11bHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0YTczYi4uMDAwMDAwMAotLS0gYS9nYXMvZmxvbnVtLW11bHQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKiBmbG9udW1fbXVsdC5jIC0gbXVsdGlwbHkgdHdvIGZsb251bXMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR2FzLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgVGhlIEdOVSBhc3NlbWJsZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvcgotICAgYWNjZXB0cyByZXNwb25zaWJpbGl0eSB0byBhbnlvbmUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQKLSAgIG9yIGZvciB3aGV0aGVyIGl0IHNlcnZlcyBhbnkgcGFydGljdWxhciBwdXJwb3NlIG9yIHdvcmtzIGF0IGFsbCwKLSAgIHVubGVzcyBoZSBzYXlzIHNvIGluIHdyaXRpbmcuICBSZWZlciB0byB0aGUgR05VIEFzc2VtYmxlciBHZW5lcmFsCi0gICBQdWJsaWMgTGljZW5zZSBmb3IgZnVsbCBkZXRhaWxzLgotCi0gICBFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUKLSAgIHRoZSBHTlUgQXNzZW1ibGVyLCBidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlCi0gICBHTlUgQXNzZW1ibGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlIGlzCi0gICBzdXBwb3NlZCB0byBoYXZlIGJlZW4gZ2l2ZW4gdG8geW91IGFsb25nIHdpdGggdGhlIEdOVSBBc3NlbWJsZXIKLSAgIHNvIHlvdSBjYW4ga25vdyB5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0IHNob3VsZCBiZQotICAgaW4gYSBmaWxlIG5hbWVkIENPUFlJTkcuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQKLSAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgImZsb251bS5oIgotCi0vKglwbGFuIGZvciBhIC4gYiA9PiBwKHJvZHVjdCkKLQkKLQkKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCXwgYQl8IGEJfCAgLi4uCXwgYQl8IGEJfAotCXwgIEEJfCAgQS0xCXwJfCAgMQl8ICAwCXwKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCQotCQotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JfCBiCXwgYgl8ICAuLi4JfCBiCXwgYgl8Ci0JfCAgQgl8ICBCLTEJfAl8ICAxCXwgIDAJfAotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JCi0JCi0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JfCBwCXwgcAl8ICAuLi4JfCBwCXwgIC4uLgl8IHAJfCBwCXwKLQl8ICBBK0IrMXwgIEErQgl8CXwgIE4JfAl8ICAxCXwgIDAJfAotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCQotCS9eXAotCShjYXJyeSkgYSAuYgkgICAuLi4JICAgIHwJICAgLi4uCSBhIC5iCSBhIC5iCi0JQSAgQiAJCSAgICB8CQkgIDAgIDEJICAwICAwCi0JfAotCS4uLgkgICAgfAkgICAuLi4JIGEgLmIKLQl8CQkgIDEgIDAKLQl8Ci0JfAkgICAuLi4KLQl8Ci0JfAotCXwKLQl8CQkgIF9fXwotCXwJCSAgXAotCSstLS0tLSAgUCAgPSAgID4gIGEgLmIKLQlOCSAgL19fICBpICBqCi0JCi0JTiA9IDAgLi4uIEErQgotCQotCWZvciBhbGwgaSxqIHdoZXJlIGkraj1OCi0JW2ksaiBpbnRlZ2VycyA+IDBdCi0JCi0JYVtdLCBiW10sIHBbXSBtYXkgbm90IGludGVyc2VjdC4KLQlaZXJvIGxlbmd0aCBmYWN0b3JzIHNpZ25pZnkgMCBzaWduaWZpY2FudCBiaXRzOiB0cmVhdCBhcyAwLjAuCi0JMC4wIGZhY3RvcnMgZG8gdGhlIHJpZ2h0IHRoaW5nLgotCVplcm8gbGVuZ3RoIHByb2R1Y3QgT0suCi0JCi0JSSBjaG9zZSB0aGUgRm9yVHJhbiBhY2NlbnQgImZvb1tiYXJdIiBpbnN0ZWFkIG9mIHRoZSBDIGFjY2VudCAiKmdhcnBseSIKLQliZWNhdXNlIEkgZmVsdCB0aGUgRm9yVHJhbiB3YXkgd2FzIG1vcmUgaW50dWl0aXZlLiBUaGUgQyB3YXkgd291bGQKLQlwcm9iYWJseSB5aWVsZCBiZXR0ZXIgY29kZSBvbiBtb3N0IEMgY29tcGlsZXJzLiBEZWFuIEVsc25lci4KLQkoQyBzdHlsZSBhbHNvIGdpdmVzIGRlZXBlciBpbnNpZ2h0IFt0byBtZV0gLi4uIG9oIHdlbGwgLi4uKQotCSovCi0MCi12b2lkIAotZmxvbnVtX211bHRpcCAoYSwgYiwgcHJvZHVjdCkKLSAgICAgY29uc3QgRkxPTlVNX1RZUEUgKmE7Ci0gICAgIGNvbnN0IEZMT05VTV9UWVBFICpiOwotICAgICBGTE9OVU1fVFlQRSAqcHJvZHVjdDsKLXsKLSAgaW50IHNpemVfb2ZfYTsJCS8qIDAgb3JpZ2luICovCi0gIGludCBzaXplX29mX2I7CQkvKiAwIG9yaWdpbiAqLwotICBpbnQgc2l6ZV9vZl9wcm9kdWN0OwkJLyogMCBvcmlnaW4gKi8KLSAgaW50IHNpemVfb2Zfc3VtOwkJLyogMCBvcmlnaW4gKi8KLSAgaW50IGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zOwkvKiAxIG9yaWdpbiAqLwotICB1bnNpZ25lZCBsb25nIHdvcms7Ci0gIHVuc2lnbmVkIGxvbmcgY2Fycnk7Ci0gIGxvbmcgZXhwb25lbnQ7Ci0gIExJVFRMRU5VTV9UWVBFICpxOwotICBsb25nIHNpZ25pZmljYW50OwkJLyogVFJVRSB3aGVuIHdlIGVtaXQgYSBub24tMCBsaXR0bGVudW0gICovCi0gIC8qIEZvclRyYW4gYWNjZW50IGZvbGxvd3MuICovCi0gIGludCBQOwkJCS8qIFNjYW4gcHJvZHVjdCBsb3ctb3JkZXIgLT4gaGlnaC4gKi8KLSAgaW50IE47CQkJLyogQXMgaW4gc3VtIGFib3ZlLiAgKi8KLSAgaW50IEE7CQkJLyogV2hpY2ggW10gb2YgYT8gKi8KLSAgaW50IEI7CQkJLyogV2hpY2ggW10gb2YgYj8gKi8KLQotICBpZiAoKGEtPnNpZ24gIT0gJy0nICYmIGEtPnNpZ24gIT0gJysnKSB8fCAoYi0+c2lnbiAhPSAnLScgJiYgYi0+c2lnbiAhPSAnKycpKQotICAgIHsKLSAgICAgIC8qIC4uLgotCQkgICBHb3QgdG8gZmFpbCBzb21laG93LiAgQW55IHN1Z2dlc3Rpb25zPyAqLwotICAgICAgcHJvZHVjdC0+c2lnbiA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBwcm9kdWN0LT5zaWduID0gKGEtPnNpZ24gPT0gYi0+c2lnbikgPyAnKycgOiAnLSc7Ci0gIHNpemVfb2ZfYSA9IGEtPmxlYWRlciAtIGEtPmxvdzsKLSAgc2l6ZV9vZl9iID0gYi0+bGVhZGVyIC0gYi0+bG93OwotICBleHBvbmVudCA9IGEtPmV4cG9uZW50ICsgYi0+ZXhwb25lbnQ7Ci0gIHNpemVfb2ZfcHJvZHVjdCA9IHByb2R1Y3QtPmhpZ2ggLSBwcm9kdWN0LT5sb3c7Ci0gIHNpemVfb2Zfc3VtID0gc2l6ZV9vZl9hICsgc2l6ZV9vZl9iOwotICBleHRyYV9wcm9kdWN0X3Bvc2l0aW9ucyA9IHNpemVfb2ZfcHJvZHVjdCAtIHNpemVfb2Zfc3VtOwotICBpZiAoZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMgPCAwKQotICAgIHsKLSAgICAgIFAgPSBleHRyYV9wcm9kdWN0X3Bvc2l0aW9uczsJLyogUCA8IDAgKi8KLSAgICAgIGV4cG9uZW50IC09IGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zOwkvKiBJbmNyZWFzZXMgZXhwb25lbnQuICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgUCA9IDA7Ci0gICAgfQotICBjYXJyeSA9IDA7Ci0gIHNpZ25pZmljYW50ID0gMDsKLSAgZm9yIChOID0gMDsgTiA8PSBzaXplX29mX3N1bTsgTisrKQotICAgIHsKLSAgICAgIHdvcmsgPSBjYXJyeTsKLSAgICAgIGNhcnJ5ID0gMDsKLSAgICAgIGZvciAoQSA9IDA7IEEgPD0gTjsgQSsrKQotCXsKLQkgIEIgPSBOIC0gQTsKLQkgIGlmIChBIDw9IHNpemVfb2ZfYSAmJiBCIDw9IHNpemVfb2ZfYiAmJiBCID49IDApCi0JICAgIHsKLSNpZmRlZiBUUkFDRQotCSAgICAgIHByaW50ZiAoImE6bG93WyVkLl09JTA0eCBiOmxvd1slZC5dPSUwNHggd29ya19iZWZvcmU9JTA4eFxuIiwgQSwgYS0+bG93W0FdLCBCLCBiLT5sb3dbQl0sIHdvcmspOwotI2VuZGlmCi0JICAgICAgLyogV2F0Y2ggb3V0IGZvciBzaWduIGV4dGVuc2lvbiEgIFdpdGhvdXQgdGhlIGNhc3RzLCBvbgotCQkgdGhlIERFQyBBbHBoYSwgdGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBpcyAqc2lnbmVkKgotCQkgaW50LCB3aGljaCBnZXRzIHNpZ24tZXh0ZW5kZWQgdG8gY29udmVydCB0byB0aGUKLQkJIHVuc2lnbmVkIGxvbmchICAqLwotCSAgICAgIHdvcmsgKz0gKHVuc2lnbmVkIGxvbmcpIGEtPmxvd1tBXSAqICh1bnNpZ25lZCBsb25nKSBiLT5sb3dbQl07Ci0JICAgICAgY2FycnkgKz0gd29yayA+PiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICAgICAgd29yayAmPSBMSVRUTEVOVU1fTUFTSzsKLSNpZmRlZiBUUkFDRQotCSAgICAgIHByaW50ZiAoIndvcms9JTA4eCBjYXJyeT0lMDR4XG4iLCB3b3JrLCBjYXJyeSk7Ci0jZW5kaWYKLQkgICAgfQotCX0KLSAgICAgIHNpZ25pZmljYW50IHw9IHdvcms7Ci0gICAgICBpZiAoc2lnbmlmaWNhbnQgfHwgUCA8IDApCi0JewotCSAgaWYgKFAgPj0gMCkKLQkgICAgewotCSAgICAgIHByb2R1Y3QtPmxvd1tQXSA9IHdvcms7Ci0jaWZkZWYgVFJBQ0UKLQkgICAgICBwcmludGYgKCJQPSVkLiB3b3JrW3BdOj0lMDR4XG4iLCBQLCB3b3JrKTsKLSNlbmRpZgotCSAgICB9Ci0JICBQKys7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zKys7Ci0JICBleHBvbmVudCsrOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIFtQXS0+IHBvc2l0aW9uICMgc2l6ZV9vZl9zdW0gKyAxLgotICAgKiBUaGlzIGlzIHdoZXJlICdjYXJyeScgc2hvdWxkIGdvLgotICAgKi8KLSNpZmRlZiBUUkFDRQotICBwcmludGYgKCJmaW5hbCBjYXJyeSA9JTA0eFxuIiwgY2FycnkpOwotI2VuZGlmCi0gIGlmIChjYXJyeSkKLSAgICB7Ci0gICAgICBpZiAoZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMgPiAwKQotCXsKLQkgIHByb2R1Y3QtPmxvd1tQXSA9IGNhcnJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBObyByb29tIGF0IGhpZ2ggb3JkZXIgZm9yIGNhcnJ5IGxpdHRsZW51bS4gKi8KLQkgIC8qIFNoaWZ0IHJpZ2h0IDEgdG8gbWFrZSByb29tIGZvciBtb3N0IHNpZ25pZmljYW50IGxpdHRsZW51bS4gKi8KLQkgIGV4cG9uZW50Kys7Ci0JICBQLS07Ci0JICBmb3IgKHEgPSBwcm9kdWN0LT5sb3cgKyBQOyBxID49IHByb2R1Y3QtPmxvdzsgcS0tKQotCSAgICB7Ci0JICAgICAgd29yayA9ICpxOwotCSAgICAgICpxID0gY2Fycnk7Ci0JICAgICAgY2FycnkgPSB3b3JrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFAtLTsKLSAgICB9Ci0gIHByb2R1Y3QtPmxlYWRlciA9IHByb2R1Y3QtPmxvdyArIFA7Ci0gIHByb2R1Y3QtPmV4cG9uZW50ID0gZXhwb25lbnQ7Ci19Ci0KLS8qIGVuZCBvZiBmbG9udW1fbXVsdC5jICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLmggYi9nYXMvZmxvbnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODRmNDkuLjAwMDAwMDAKLS0tIGEvZ2FzL2Zsb251bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIGZsb251bS5oIC0gRmxvYXRpbmcgcG9pbnQgcGFja2FnZQotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglBcmJpdHJhcnktcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuCQkJKgotICoJCQkJCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSAqCU5vdGF0aW9uOiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBpcyBleHByZXNzZWQgYXMJCSoKLSAqCU1BTlRJU1NBICogKDIgKiogRVhQT05FTlQpLgkJCQkJKgotICoJCQkJCQkJCQkqCi0gKglJZiB0aGlzIG9mZmVuZHMgbW9yZSB0cmFkaXRpb25hbCBtYXRoZW1hdGljaWFucywgdGhlbgkJKgotICoJcGxlYXNlIHRlbGwgbWUgeW91ciBub21lbmNsYXR1cmUgZm9yIGZsb251bXMhCQkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmlnbnVtLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJVmFyaWFibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCQkJKgotICoJCQkJCQkJCQkqCi0gKglFeHBvbmVudCBpcyB0aGUgcGxhY2UgdmFsdWUgb2YgdGhlIGxvdyBsaXR0bGVudW0uIEUuZy46CQkqCi0gKglJZiAgMDogIGxvdyBwb2ludHMgdG8gdGhlIHVuaXRzICAgICAgICAgICAgIGxpdHRsZW51bS4JCSoKLSAqCUlmICAxOiAgbG93IHBvaW50cyB0byB0aGUgTElUVExFTlVNX1JBRElYICAgbGl0dGxlbnVtLgkJKgotICoJSWYgLTE6ICBsb3cgcG9pbnRzIHRvIHRoZSAxL0xJVFRMRU5VTV9SQURJWCBsaXR0bGVudW0uCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEpGOiAgQSBzaWduIHZhbHVlIG9mIDAgbWVhbnMgd2UgaGF2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlIE5hTgotICAgQSBzaWduIHZhbHVlIG9mICdQJyBtZWFucyB3ZSd2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlICtJbmYKLSAgIEEgc2lnbiB2YWx1ZSBvZiAnTicgbWVhbnMgd2UndmUgYmVlbiBhc2tlZCB0byBhc3NlbWJsZSAtSW5mCi0gICAqLwotc3RydWN0IEZMT05VTV9TVFJVQ1QKLXsKLSAgTElUVExFTlVNX1RZUEUgKmxvdzsJCS8qIGxvdyBvcmRlciBsaXR0bGVudW0gb2YgYSBiaWdudW0gKi8KLSAgTElUVExFTlVNX1RZUEUgKmhpZ2g7CQkvKiBoaWdoIG9yZGVyIGxpdHRsZW51bSBvZiBhIGJpZ251bSAqLwotICBMSVRUTEVOVU1fVFlQRSAqbGVhZGVyOwkvKiAtPiAxc3Qgbm9uLXplcm8gbGl0dGxlbnVtICovCi0gIC8qIElmIGZsb251bSBpcyAwLjAsIGxlYWRlcj09bG93LTEgKi8KLSAgbG9uZyBleHBvbmVudDsJCS8qIGJhc2UgTElUVExFTlVNX1JBRElYICovCi0gIGNoYXIgc2lnbjsJCQkvKiAnKycgb3IgJy0nICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBGTE9OVU1fU1RSVUNUIEZMT05VTV9UWVBFOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJU2luY2Ugd2UgY2FuICgmIGRvKSBtZWV0IHdpdGggZXhwb25lbnRzIGxpa2UgMTBeNTAwMCwgaXQJKgotICoJaXMgc2lsbHkgdG8gbWFrZSBhIHRhYmxlIG9mIH4gMTAsMDAwIGVudHJpZXMsIG9uZSBmb3IgZWFjaAkqCi0gKglwb3dlciBvZiAxMC4gV2Uga2VlcCBhIHRhYmxlIHdoZXJlIGl0ZW0gW25dIGlzIGEgc3RydWN0CQkqCi0gKglGTE9OVU1fRkxPQVRJTkdfUE9JTlQgcmVwcmVzZW50aW5nIDEwXigyXm4pLiBXZSB0aGVuCQkqCi0gKgltdWx0aXBseSBhcHByb3ByaWF0ZSBlbnRyaWVzIGZyb20gdGhpcyB0YWJsZSB0byBnZXQgYW55CQkqCi0gKglwYXJ0aWN1bGFyIHBvd2VyIG9mIDEwLiBGb3IgdGhlIGV4YW1wbGUgb2YgMTBeNTAwMCwgYSB0YWJsZQkqCi0gKglvZiBqdXN0IDI1IGVudHJpZXMgc3VmZmljZXM6IDEwXigyXi0xMikuLi4xMF4oMl4rMTIpLgkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWV4dGVybiBjb25zdCBGTE9OVU1fVFlQRSBmbG9udW1fcG9zaXRpdmVfcG93ZXJzX29mX3RlbltdOwotZXh0ZXJuIGNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9uZWdhdGl2ZV9wb3dlcnNfb2ZfdGVuW107Ci1leHRlcm4gY29uc3QgaW50IHRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW47Ci0vKiBGbG9udW1fWFhYX3Bvd2Vyc19vZl90ZW5bXSB0YWJsZSBoYXMgKi8KLS8qIGxlZ2FsIGluZGljZXMgZnJvbSAwIHRvICovCi0vKiArIHRoaXMgbnVtYmVyIGluY2x1c2l2ZS4gKi8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJRGVjbGFyZSB3b3JrZXIgZnVuY3Rpb25zLgkJCQkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgYXRvZl9nZW5lcmljIFBBUkFNUyAoKGNoYXIgKiphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyLAotCQkJICBjb25zdCBjaGFyICpzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrcywKLQkJCSAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3MsCi0JCQkgIEZMT05VTV9UWVBFICogYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpOwotCi12b2lkIGZsb251bV9jb3B5IFBBUkFNUyAoKEZMT05VTV9UWVBFICogaW4sIEZMT05VTV9UWVBFICogb3V0KSk7Ci12b2lkIGZsb251bV9tdWx0aXAgUEFSQU1TICgoY29uc3QgRkxPTlVNX1RZUEUgKiBhLCBjb25zdCBGTE9OVU1fVFlQRSAqIGIsCi0JCQkgICAgRkxPTlVNX1RZUEUgKiBwcm9kdWN0KSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJRGVjbGFyZSBlcnJvciBjb2Rlcy4JCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRVJST1JfRVhQT05FTlRfT1ZFUkZMT1cgKDIpCi0KLS8qIGVuZCBvZiBmbG9udW0uaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2ZyYWdzLmMgYi9nYXMvZnJhZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwYjJlZS4uMDAwMDAwMAotLS0gYS9nYXMvZnJhZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKiBmcmFncy5jIC0gbWFuYWdlIGZyYWdzIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotZXh0ZXJuIGZyYWdTIHplcm9fYWRkcmVzc19mcmFnOwotZXh0ZXJuIGZyYWdTIGJzc19hZGRyZXNzX2ZyYWc7Ci0MCi0vKiBJbml0aWFsaXphdGlvbiBmb3IgZnJhZyByb3V0aW5lcy4gICovCi12b2lkCi1mcmFnX2luaXQgKCkKLXsKLSAgemVyb19hZGRyZXNzX2ZyYWcuZnJfdHlwZSA9IHJzX2ZpbGw7Ci0gIGJzc19hZGRyZXNzX2ZyYWcuZnJfdHlwZSA9IHJzX2ZpbGw7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBhIGZyYWcgb24gdGhlIHNwZWNpZmllZCBvYnN0YWNrLgotICAgQ2FsbCB0aGlzIHJvdXRpbmUgZnJvbSBldmVyeXdoZXJlIGVsc2UsIHNvIHRoYXQgYWxsIHRoZSB3ZWlyZCBhbGlnbm1lbnQKLSAgIGhhY2tlcnkgY2FuIGJlIGRvbmUgaW4ganVzdCBvbmUgcGxhY2UuICAqLwotZnJhZ1MgKgotZnJhZ19hbGxvYyAob2IpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYjsKLXsKLSAgZnJhZ1MgKnB0cjsKLSAgaW50IG9hbGlnbjsKLQotICAodm9pZCkgb2JzdGFja19hbGxvYyAob2IsIDApOwotICBvYWxpZ24gPSBvYnN0YWNrX2FsaWdubWVudF9tYXNrIChvYik7Ci0gIG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKG9iKSA9IDA7Ci0gIHB0ciA9IChmcmFnUyAqKSBvYnN0YWNrX2FsbG9jIChvYiwgU0laRU9GX1NUUlVDVF9GUkFHKTsKLSAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAob2IpID0gb2FsaWduOwotICBtZW1zZXQgKHB0ciwgMCwgU0laRU9GX1NUUlVDVF9GUkFHKTsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qCi0gKgkJCWZyYWdfZ3JvdygpCi0gKgotICogVHJ5IHRvIGF1Z21lbnQgY3VycmVudCBmcmFnIGJ5IG5jaGFycyBjaGFycy4KLSAqIElmIHRoZXJlIGlzIG5vIHJvb20sIGNsb3NlIG9mIHRoZSBjdXJyZW50IGZyYWcgd2l0aCBhICIuZmlsbCAwIgotICogYW5kIGJlZ2luIGEgbmV3IGZyYWcuIFVubGVzcyB0aGUgbmV3IGZyYWcgaGFzIG5jaGFycyBjaGFycyBhdmFpbGFibGUKLSAqIGRvIG5vdCByZXR1cm4uIERvIG5vdCBzZXQgdXAgYW55IGZpZWxkcyBvZiAqbm93X2ZyYWcuCi0gKi8KLXZvaWQgCi1mcmFnX2dyb3cgKG5jaGFycykKLSAgICAgdW5zaWduZWQgaW50IG5jaGFyczsKLXsKLSAgaWYgKG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIDwgbmNoYXJzKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuOwotICAgICAgbG9uZyBvbGRjOwotCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLSAgICAgIG9sZGMgPSBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLmNodW5rX3NpemU7Ci0gICAgICBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLmNodW5rX3NpemUgPSAyICogbmNoYXJzICsgU0laRU9GX1NUUlVDVF9GUkFHOwotICAgICAgd2hpbGUgKChuID0gb2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykpIDwgbmNoYXJzKQotCXsKLQkgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotCSAgZnJhZ19uZXcgKDApOwotCX0KLSAgICAgIGZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2suY2h1bmtfc2l6ZSA9IG9sZGM7Ci0gICAgfQotICBpZiAob2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgPCBuY2hhcnMpCi0gICAgYXNfZmF0YWwgKF8oIkNhbid0IGV4dGVuZCBmcmFnICVkLiBjaGFycyIpLCBuY2hhcnMpOwotfQotDAotLyoKLSAqCQkJZnJhZ19uZXcoKQotICoKLSAqIENhbGwgdGhpcyB0byBjbG9zZSBvZmYgYSBjb21wbGV0ZWQgZnJhZywgYW5kIHN0YXJ0IHVwIGEgbmV3IChlbXB0eSkKLSAqIGZyYWcsIGluIHRoZSBzYW1lIHN1YnNlZ21lbnQgYXMgdGhlIG9sZCBmcmFnLgotICogW2ZyY2hhaW5fbm93IHJlbWFpbnMgdGhlIHNhbWUgYnV0IGZyYWdfbm93IGlzIHVwZGF0ZWQuXQotICogQmVjYXVzZSB0aGlzIGNhbGN1bGF0ZXMgdGhlIGNvcnJlY3QgdmFsdWUgb2YgZnJfZml4IGJ5Ci0gKiBsb29raW5nIGF0IHRoZSBvYnN0YWNrICdmcmFncycsIGl0IG5lZWRzIHRvIGtub3cgaG93IG1hbnkKLSAqIGNoYXJhY3RlcnMgYXQgdGhlIGVuZCBvZiB0aGUgb2xkIGZyYWcgYmVsb25nIHRvICh0aGUgbWF4aW1hbCkKLSAqIGZyX3ZhcjogdGhlIHJlc3QgbXVzdCBiZWxvbmcgdG8gZnJfZml4LgotICogSXQgZG9lc24ndCBhY3R1YWxseSBzZXQgdXAgdGhlIG9sZCBmcmFnJ3MgZnJfdmFyOiB5b3UgbWF5IGhhdmUKLSAqIHNldCBmcl92YXIgPT0gMSwgYnV0IGFsbG9jYXRlZCAxMCBjaGFycyB0byB0aGUgZW5kIG9mIHRoZSBmcmFnOgotICogaW4gdGhpcyBjYXNlIHlvdSBwYXNzIG9sZF9mcmFnc192YXJfbWF4X3NpemUgPT0gMTAuCi0gKgotICogTWFrZSBhIG5ldyBmcmFnLCBpbml0aWFsaXNpbmcgc29tZSBjb21wb25lbnRzLiBMaW5rIG5ldyBmcmFnIGF0IGVuZAotICogb2YgZnJjaGFpbl9ub3cuCi0gKi8KLXZvaWQgCi1mcmFnX25ldyAob2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZSkKLSAgICAgLyogTnVtYmVyIG9mIGNoYXJzIChhbHJlYWR5IGFsbG9jYXRlZCBvbiBvYnN0YWNrIGZyYWdzKSBpbgotCXZhcmlhYmxlX2xlbmd0aCBwYXJ0IG9mIGZyYWcuICovCi0gICAgIGludCBvbGRfZnJhZ3NfdmFyX21heF9zaXplOwotewotICBmcmFnUyAqZm9ybWVyX2xhc3RfZnJhZ1A7Ci0gIGZyY2hhaW5TICpmcmNoUDsKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93LT5mcmNoX2xhc3QgPT0gZnJhZ19ub3cpOwotCi0gIC8qIEZpeCB1cCBvbGQgZnJhZydzIGZyX2ZpeC4gICovCi0gIGZyYWdfbm93LT5mcl9maXggPSBmcmFnX25vd19maXggKCkgLSBvbGRfZnJhZ3NfdmFyX21heF9zaXplOwotICAvKiBNYWtlIHN1cmUgaXRzIHR5cGUgaXMgdmFsaWQuICAqLwotICBhc3NlcnQgKGZyYWdfbm93LT5mcl90eXBlICE9IDApOwotCi0gIC8qIFRoaXMgd2lsbCBhbGlnbiB0aGUgb2JzdGFjayBzbyB0aGUgbmV4dCBzdHJ1Y3Qgd2UgYWxsb2NhdGUgb24gaXQKLSAgICAgd2lsbCBiZWdpbiBhdCBhIGNvcnJlY3QgYm91bmRhcnkuICovCi0gIG9ic3RhY2tfZmluaXNoICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayk7Ci0gIGZyY2hQID0gZnJjaGFpbl9ub3c7Ci0gIGtub3cgKGZyY2hQKTsKLSAgZm9ybWVyX2xhc3RfZnJhZ1AgPSBmcmNoUC0+ZnJjaF9sYXN0OwotICBhc3NlcnQgKGZvcm1lcl9sYXN0X2ZyYWdQICE9IDApOwotICBhc3NlcnQgKGZvcm1lcl9sYXN0X2ZyYWdQID09IGZyYWdfbm93KTsKLSAgZnJhZ19ub3cgPSBmcmFnX2FsbG9jICgmZnJjaFAtPmZyY2hfb2JzdGFjayk7Ci0KLSAgYXNfd2hlcmUgKCZmcmFnX25vdy0+ZnJfZmlsZSwgJmZyYWdfbm93LT5mcl9saW5lKTsKLQotICAvKiBHZW5lcmFsbHksIGZyYWdfbm93LT5wb2ludHMgdG8gYW4gYWRkcmVzcyByb3VuZGVkIHVwIHRvIG5leHQKLSAgICAgYWxpZ25tZW50LiAgSG93ZXZlciwgY2hhcmFjdGVycyB3aWxsIGFkZCB0byBvYnN0YWNrIGZyYWdzCi0gICAgIElNTUVESUFURUxZIGFmdGVyIHRoZSBzdHJ1Y3QgZnJhZywgZXZlbiBpZiB0aGV5IGFyZSBub3Qgc3RhcnRpbmcKLSAgICAgYXQgYW4gYWxpZ25tZW50IGFkZHJlc3MuICovCi0gIGZvcm1lcl9sYXN0X2ZyYWdQLT5mcl9uZXh0ID0gZnJhZ19ub3c7Ci0gIGZyY2hQLT5mcmNoX2xhc3QgPSBmcmFnX25vdzsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKmxpc3RpbmdfdGFpbDsKLSAgICBmcmFnX25vdy0+bGluZSA9IGxpc3RpbmdfdGFpbDsKLSAgfQotI2VuZGlmCi0KLSAgYXNzZXJ0IChmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKLQotICBmcmFnX25vdy0+ZnJfbmV4dCA9IE5VTEw7Ci19CQkJCS8qIGZyYWdfbmV3KCkgKi8KLQwKLS8qCi0gKgkJCWZyYWdfbW9yZSgpCi0gKgotICogU3RhcnQgYSBuZXcgZnJhZyB1bmxlc3Mgd2UgaGF2ZSBuIG1vcmUgY2hhcnMgb2Ygcm9vbSBpbiB0aGUgY3VycmVudCBmcmFnLgotICogQ2xvc2Ugb2ZmIHRoZSBvbGQgZnJhZyB3aXRoIGEgLmZpbGwgMC4KLSAqCi0gKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIDFzdCBjaGFyIHRvIHdyaXRlIGludG8uIEFkdmFuY2UKLSAqIGZyYWdfbm93X2dyb3d0aCBwYXN0IHRoZSBuZXcgY2hhcnMuCi0gKi8KLQotY2hhciAqCi1mcmFnX21vcmUgKG5jaGFycykKLSAgICAgaW50IG5jaGFyczsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmV0dmFsOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJhdHRlbXB0IHRvIGFsbG9jYXRlIGRhdGEgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLSAgICAgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci0gICAgfQotCi0gIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byBhbGxvY2F0ZSBkYXRhIGluIGNvbW1vbiBzZWN0aW9uIikpOwotICAgICAgbXJpX2NvbW1vbl9zeW1ib2wgPSBOVUxMOwotICAgIH0KLQotICBmcmFnX2dyb3cgKG5jaGFycyk7Ci0gIHJldHZhbCA9IG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayk7Ci0gIG9ic3RhY2tfYmxhbmtfZmFzdCAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2ssIG5jaGFycyk7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0JCQkJLyogZnJhZ19tb3JlKCkgKi8KLQwKLS8qCi0gKgkJCWZyYWdfdmFyKCkKLSAqCi0gKiBTdGFydCBhIG5ldyBmcmFnIHVubGVzcyB3ZSBoYXZlIG1heF9jaGFycyBtb3JlIGNoYXJzIG9mIHJvb20gaW4gdGhlIGN1cnJlbnQgZnJhZy4KLSAqIENsb3NlIG9mZiB0aGUgb2xkIGZyYWcgd2l0aCBhIC5maWxsIDAuCi0gKgotICogU2V0IHVwIGEgbWFjaGluZV9kZXBlbmRlbnQgcmVsYXhhYmxlIGZyYWcsIHRoZW4gc3RhcnQgYSBuZXcgZnJhZy4KLSAqIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgMXN0IGNoYXIgb2YgdGhlIHZhciBwYXJ0IG9mIHRoZSBvbGQgZnJhZwotICogdG8gd3JpdGUgaW50by4KLSAqLwotCi1jaGFyICoKLWZyYWdfdmFyICh0eXBlLCBtYXhfY2hhcnMsIHZhciwgc3VidHlwZSwgc3ltYm9sLCBvZmZzZXQsIG9wY29kZSkKLSAgICAgcmVsYXhfc3RhdGVUIHR5cGU7Ci0gICAgIGludCBtYXhfY2hhcnM7Ci0gICAgIGludCB2YXI7Ci0gICAgIHJlbGF4X3N1YnN0YXRlVCBzdWJ0eXBlOwotICAgICBzeW1ib2xTICpzeW1ib2w7Ci0gICAgIG9mZnNldFQgb2Zmc2V0OwotICAgICBjaGFyICpvcGNvZGU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldHZhbDsKLQotICBmcmFnX2dyb3cgKG1heF9jaGFycyk7Ci0gIHJldHZhbCA9IG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayk7Ci0gIG9ic3RhY2tfYmxhbmtfZmFzdCAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2ssIG1heF9jaGFycyk7Ci0gIGZyYWdfbm93LT5mcl92YXIgPSB2YXI7Ci0gIGZyYWdfbm93LT5mcl90eXBlID0gdHlwZTsKLSAgZnJhZ19ub3ctPmZyX3N1YnR5cGUgPSBzdWJ0eXBlOwotICBmcmFnX25vdy0+ZnJfc3ltYm9sID0gc3ltYm9sOwotICBmcmFnX25vdy0+ZnJfb2Zmc2V0ID0gb2Zmc2V0OwotICBmcmFnX25vdy0+ZnJfb3Bjb2RlID0gb3Bjb2RlOwotI2lmZGVmIFVTSU5HX0NHRU4KLSAgZnJhZ19ub3ctPmZyX2NnZW4uaW5zbiA9IDA7Ci0gIGZyYWdfbm93LT5mcl9jZ2VuLm9waW5kZXggPSAwOwotICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZm8gPSAwOwotI2VuZGlmCi0jaWZkZWYgVENfRlJBR19JTklUCi0gIFRDX0ZSQUdfSU5JVCAoZnJhZ19ub3cpOwotI2VuZGlmCi0gIGFzX3doZXJlICgmZnJhZ19ub3ctPmZyX2ZpbGUsICZmcmFnX25vdy0+ZnJfbGluZSk7Ci0gIGZyYWdfbmV3IChtYXhfY2hhcnMpOwotICByZXR1cm4gKHJldHZhbCk7Ci19Ci0MCi0vKgotICoJCQlmcmFnX3ZhcmlhbnQoKQotICoKLSAqIE9WRTogVGhpcyB2YXJpYW50IG9mIGZyYWdfdmFyIGFzc3VtZXMgdGhhdCBzcGFjZSBmb3IgdGhlIHRhaWwgaGFzIGJlZW4KLSAqICAgICAgYWxsb2NhdGVkIGJ5IGNhbGxlci4KLSAqICAgICAgTm8gY2FsbCB0byBmcmFnX2dyb3cgaXMgZG9uZS4KLSAqLwotCi1jaGFyICoKLWZyYWdfdmFyaWFudCAodHlwZSwgbWF4X2NoYXJzLCB2YXIsIHN1YnR5cGUsIHN5bWJvbCwgb2Zmc2V0LCBvcGNvZGUpCi0gICAgIHJlbGF4X3N0YXRlVCB0eXBlOwotICAgICBpbnQgbWF4X2NoYXJzOwotICAgICBpbnQgdmFyOwotICAgICByZWxheF9zdWJzdGF0ZVQgc3VidHlwZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sOwotICAgICBvZmZzZXRUIG9mZnNldDsKLSAgICAgY2hhciAqb3Bjb2RlOwotewotICByZWdpc3RlciBjaGFyICpyZXR2YWw7Ci0KLSAgcmV0dmFsID0gb2JzdGFja19uZXh0X2ZyZWUgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKTsKLSAgZnJhZ19ub3ctPmZyX3ZhciA9IHZhcjsKLSAgZnJhZ19ub3ctPmZyX3R5cGUgPSB0eXBlOwotICBmcmFnX25vdy0+ZnJfc3VidHlwZSA9IHN1YnR5cGU7Ci0gIGZyYWdfbm93LT5mcl9zeW1ib2wgPSBzeW1ib2w7Ci0gIGZyYWdfbm93LT5mcl9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGZyYWdfbm93LT5mcl9vcGNvZGUgPSBvcGNvZGU7Ci0jaWZkZWYgVVNJTkdfQ0dFTgotICBmcmFnX25vdy0+ZnJfY2dlbi5pbnNuID0gMDsKLSAgZnJhZ19ub3ctPmZyX2NnZW4ub3BpbmRleCA9IDA7Ci0gIGZyYWdfbm93LT5mcl9jZ2VuLm9waW5mbyA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBUQ19GUkFHX0lOSVQKLSAgVENfRlJBR19JTklUIChmcmFnX25vdyk7Ci0jZW5kaWYKLSAgYXNfd2hlcmUgKCZmcmFnX25vdy0+ZnJfZmlsZSwgJmZyYWdfbm93LT5mcl9saW5lKTsKLSAgZnJhZ19uZXcgKG1heF9jaGFycyk7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0JCQkJLyogZnJhZ192YXJpYW50KCkgKi8KLQwKLS8qCi0gKgkJCWZyYWdfd2FuZSgpCi0gKgotICogUmVkdWNlIHRoZSB2YXJpYWJsZSBlbmQgb2YgYSBmcmFnIHRvIGEgaGFybWxlc3Mgc3RhdGUuCi0gKi8KLXZvaWQgCi1mcmFnX3dhbmUgKGZyYWdQKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKLSAgZnJhZ1AtPmZyX29mZnNldCA9IDA7Ci0gIGZyYWdQLT5mcl92YXIgPSAwOwotfQotDAotLyogTWFrZSBhbiBhbGlnbm1lbnQgZnJhZy4gIFRoZSBzaXplIG9mIHRoaXMgZnJhZyB3aWxsIGJlIGFkanVzdGVkIHRvCi0gICBmb3JjZSB0aGUgbmV4dCBmcmFnIHRvIGhhdmUgdGhlIGFwcHJvcHJpYXRlIGFsaWdubWVudC4gIEFMSUdOTUVOVAotICAgaXMgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCB0byBhbGlnbi4gIEZJTExfQ0hBUkFDVEVSIGlzIHRoZQotICAgY2hhcmFjdGVyIHRvIHVzZSB0byBmaWxsIGluIGFueSBieXRlcyB3aGljaCBhcmUgc2tpcHBlZC4gIE1BWCBpcwotICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuIGRvaW5nIHRoZSBhbGlnbm1lbnQsCi0gICBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotCi12b2lkIAotZnJhZ19hbGlnbiAoYWxpZ25tZW50LCBmaWxsX2NoYXJhY3RlciwgbWF4KQotICAgICBpbnQgYWxpZ25tZW50OwotICAgICBpbnQgZmlsbF9jaGFyYWN0ZXI7Ci0gICAgIGludCBtYXg7Ci17Ci0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgYWRkcmVzc1QgbmV3X29mZjsKLQotICAgICAgbmV3X29mZiA9ICgoYWJzX3NlY3Rpb25fb2Zmc2V0ICsgYWxpZ25tZW50IC0gMSkKLQkJICZ+ICgoMSA8PCBhbGlnbm1lbnQpIC0gMSkpOwotICAgICAgaWYgKG1heCA9PSAwIHx8IG5ld19vZmYgLSBhYnNfc2VjdGlvbl9vZmZzZXQgPD0gKGFkZHJlc3NUKSBtYXgpCi0JYWJzX3NlY3Rpb25fb2Zmc2V0ID0gbmV3X29mZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSBtYXgsCi0JCSAgICAoc3ltYm9sUyAqKSAwLCAob2Zmc2V0VCkgYWxpZ25tZW50LCAoY2hhciAqKSAwKTsKLSAgICAgICpwID0gZmlsbF9jaGFyYWN0ZXI7Ci0gICAgfQotfQotCi0vKiBNYWtlIGFuIGFsaWdubWVudCBmcmFnIGxpa2UgZnJhZ19hbGlnbiwgYnV0IGZpbGwgd2l0aCBhIHJlcGVhdGluZwotICAgcGF0dGVybiByYXRoZXIgdGhhbiBhIHNpbmdsZSBieXRlLiAgQUxJR05NRU5UIGlzIHRoZSBwb3dlciBvZiB0d28KLSAgIHRvIHdoaWNoIHRvIGFsaWduLiAgRklMTF9QQVRURVJOIGlzIHRoZSBmaWxsIHBhdHRlcm4gdG8gcmVwZWF0IGluCi0gICB0aGUgYnl0ZXMgd2hpY2ggYXJlIHNraXBwZWQuICBOX0ZJTEwgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbgotICAgRklMTF9QQVRURVJOLiAgTUFYIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbgotICAgZG9pbmcgdGhlIGFsaWdubWVudCwgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotdm9pZCAKLWZyYWdfYWxpZ25fcGF0dGVybiAoYWxpZ25tZW50LCBmaWxsX3BhdHRlcm4sIG5fZmlsbCwgbWF4KQotICAgICBpbnQgYWxpZ25tZW50OwotICAgICBjb25zdCBjaGFyICpmaWxsX3BhdHRlcm47Ci0gICAgIGludCBuX2ZpbGw7Ci0gICAgIGludCBtYXg7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19hbGlnbiwgbl9maWxsLCBuX2ZpbGwsIChyZWxheF9zdWJzdGF0ZVQpIG1heCwKLQkJKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIGFsaWdubWVudCwgKGNoYXIgKikgMCk7Ci0gIG1lbWNweSAocCwgZmlsbF9wYXR0ZXJuLCBuX2ZpbGwpOwotfQotCi1hZGRyZXNzVAotZnJhZ19ub3dfZml4ICgpCi17Ci0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgcmV0dXJuIGFic19zZWN0aW9uX29mZnNldDsKLSAgcmV0dXJuIChhZGRyZXNzVCkgKChjaGFyKikgb2JzdGFja19uZXh0X2ZyZWUgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKQotCQkgICAgIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpOwotfQotCi12b2lkCi1mcmFnX2FwcGVuZF8xX2NoYXIgKGRhdHVtKQotICAgICBpbnQgZGF0dW07Ci17Ci0gIGlmIChvYnN0YWNrX3Jvb20gKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKSA8PSAxKQotICAgIHsKLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotICAgIH0KLSAgb2JzdGFja18xZ3JvdyAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2ssIGRhdHVtKTsKLX0KLQotLyogZW5kIG9mIGZyYWdzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9mcmFncy5oIGIvZ2FzL2ZyYWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODhlMzMuLjAwMDAwMDAKLS0tIGEvZ2FzL2ZyYWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyogZnJhZ3MuaCAtIEhlYWRlciBmaWxlIGZvciB0aGUgZnJhZyBjb25jZXB0LgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBGUkFHU19ICi0jZGVmaW5lIEZSQUdTX0gKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IG9ic3RhY2s7Ci0jZW5kaWYKLQotLyoKLSAqIEEgY29kZSBmcmFnbWVudCAoZnJhZykgaXMgc29tZSBrbm93biBudW1iZXIgb2YgY2hhcnMsIGZvbGxvd2VkIGJ5IHNvbWUKLSAqIHVua25vd24gbnVtYmVyIG9mIGNoYXJzLiBUeXBpY2FsbHkgdGhlIHVua25vd24gbnVtYmVyIG9mIGNoYXJzIGlzIGFuCi0gKiBpbnN0cnVjdGlvbiBhZGRyZXNzIHdob3NlIHNpemUgaXMgeWV0IHVua25vd24uIFdlIGFsd2F5cyBrbm93IHRoZSBncmVhdGVzdAotICogcG9zc2libGUgc2l6ZSB0aGUgdW5rbm93biBudW1iZXIgb2YgY2hhcnMgbWF5IGJlY29tZSwgYW5kIHJlc2VydmUgdGhhdAotICogbXVjaCByb29tIGF0IHRoZSBlbmQgb2YgdGhlIGZyYWcuCi0gKiBPbmNlIGNyZWF0ZWQsIGZyYWdzIGRvIG5vdCBjaGFuZ2UgYWRkcmVzcyBkdXJpbmcgYXNzZW1ibHkuCi0gKiBXZSBjaGFpbiB0aGUgZnJhZ3MgaW4gKGEpIGZvcndhcmQtbGlua2VkIGxpc3QocykuIFRoZSBvYmplY3QtZmlsZSBhZGRyZXNzCi0gKiBvZiB0aGUgMXN0IGNoYXIgb2YgYSBmcmFnIGlzIGdlbmVyYWxseSBub3Qga25vd24gdW50aWwgYWZ0ZXIgcmVsYXgoKS4KLSAqIE1hbnkgdGhpbmdzIGF0IGFzc2VtYmx5IHRpbWUgZGVzY3JpYmUgYW4gYWRkcmVzcyBieSB7b2JqZWN0LWZpbGUtYWRkcmVzcwotICogb2YgYSBwYXJ0aWN1bGFyIGZyYWd9K29mZnNldC4KLQotIEJVRzogaXQgbWF5IGJlIHNtYXJ0ZXIgdG8gaGF2ZSBhIHNpbmdsZSBwb2ludGVyIG9mZiB0byB2YXJpb3VzIGRpZmZlcmVudAotIG5vdGVzIGZvciBkaWZmZXJlbnQgZnJhZyBraW5kcy4gU2VlIGhvdyBjb2RlIHBhbnMKLSAqLwotCi1zdHJ1Y3QgZnJhZwotewotICAvKiBPYmplY3QgZmlsZSBhZGRyZXNzLiAqLwotICBhZGRyZXNzVCBmcl9hZGRyZXNzOwotICAvKiBDaGFpbiBmb3J3YXJkOyBhc2NlbmRpbmcgYWRkcmVzcyBvcmRlci4gIFJvb3RlZCBpbiBmcmNoX3Jvb3QuICovCi0gIHN0cnVjdCBmcmFnICpmcl9uZXh0OwotCi0gIC8qIChGaXhlZCkgbnVtYmVyIG9mIGNoYXJzIHdlIGtub3cgd2UgaGF2ZS4gIE1heSBiZSAwLiAqLwotICBvZmZzZXRUIGZyX2ZpeDsKLSAgLyogKFZhcmlhYmxlKSBudW1iZXIgb2YgY2hhcnMgYWZ0ZXIgYWJvdmUuICBNYXkgYmUgMC4gKi8KLSAgb2Zmc2V0VCBmcl92YXI7Ci0gIC8qIEZvciB2YXJpYWJsZS1sZW5ndGggdGFpbC4gKi8KLSAgc3ltYm9sUyAqZnJfc3ltYm9sOwotICAvKiBGb3IgdmFyaWFibGUtbGVuZ3RoIHRhaWwuICovCi0gIG9mZnNldFQgZnJfb2Zmc2V0OwotICAvKiBQb2ludHMgdG8gb3Bjb2RlIGxvdyBhZGRyIGJ5dGUsIGZvciByZWxheGF0aW9uLiAgKi8KLSAgY2hhciAqZnJfb3Bjb2RlOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKmxpbmU7Ci0jZW5kaWYKLQotICAvKiBXaGF0IHN0YXRlIGlzIG15IHRhaWwgaW4/ICovCi0gIHJlbGF4X3N0YXRlVCBmcl90eXBlOwotICByZWxheF9zdWJzdGF0ZVQgZnJfc3VidHlwZTsKLQotI2lmZGVmIFVTSU5HX0NHRU4KLSAgLyogRG9uJ3QgaW5jbHVkZSB0aGlzIHVubGVzcyB1c2luZyBDR0VOIHRvIGtlZXAgZnJhZyBzaXplIGRvd24uICAqLwotICBzdHJ1Y3QgewotICAgIC8qIENHRU5fSU5TTiBlbnRyeSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgY29uc3Qgc3RydWN0IGNnZW5faW5zbiAqaW5zbjsKLSAgICAvKiBJbmRleCBpbnRvIG9wZXJhbmQgdGFibGUuICAqLwotICAgIGludCBvcGluZGV4OwotICAgIC8qIFRhcmdldCBzcGVjaWZpYyBkYXRhLCB1c3VhbGx5IHJlbG9jIG51bWJlci4gICovCi0gICAgaW50IG9waW5mbzsKLSAgfSBmcl9jZ2VuOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19GUkFHX1RZUEUKLSAgVENfRlJBR19UWVBFIHRjX2ZyYWdfZGF0YTsKLSNlbmRpZgotCi0gIC8qIFdoZXJlIHRoZSBmcmFnIHdhcyBjcmVhdGVkLCBvciB3aGVyZSBpdCBiZWNhbWUgYSB2YXJpYW50IGZyYWcuICAqLwotICBjaGFyICpmcl9maWxlOwotICB1bnNpZ25lZCBpbnQgZnJfbGluZTsKLQotICAvKiBEYXRhIGJlZ2lucyBoZXJlLiAgKi8KLSAgY2hhciBmcl9saXRlcmFsWzFdOwotfTsKLQotI2RlZmluZSBTSVpFT0ZfU1RSVUNUX0ZSQUcgXAotKChjaGFyICopemVyb19hZGRyZXNzX2ZyYWcuZnJfbGl0ZXJhbC0oY2hhciAqKSZ6ZXJvX2FkZHJlc3NfZnJhZykKLS8qIFdlIHdhbnQgdG8gc2F5IGZyX2xpdGVyYWxbMF0gYWJvdmUuICovCi0KLS8qIEN1cnJlbnQgZnJhZyB3ZSBhcmUgYnVpbGRpbmcuICBUaGlzIGZyYWcgaXMgaW5jb21wbGV0ZS4gIEl0IGlzLAotICAgaG93ZXZlciwgaW5jbHVkZWQgaW4gZnJjaGFpbl9ub3cuICBUaGUgZnJfZml4IGZpZWxkIGlzIGJvZ3VzOwotICAgaW5zdGVhZCwgdXNlIGZyYWdfbm93X2ZpeCAoKS4gICovCi1DT01NT04gZnJhZ1MgKmZyYWdfbm93OwotZXh0ZXJuIGFkZHJlc3NUIGZyYWdfbm93X2ZpeCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZvciBmb3JlaWduLXNlZ21lbnQgc3ltYm9sIGZpeHVwcy4gKi8KLUNPTU1PTiBmcmFnUyB6ZXJvX2FkZHJlc3NfZnJhZzsKLS8qIEZvciBsb2NhbCBjb21tb24gKE5fQlNTIHNlZ21lbnQpIGZpeHVwcy4gKi8KLUNPTU1PTiBmcmFnUyBic3NfYWRkcmVzc19mcmFnOwotCi0jaWYgMAotLyoKLSAqIEEgbWFjcm8gdG8gc3BlZWQgdXAgYXBwZW5kaW5nIGV4YWN0bHkgMSBjaGFyCi0gKiB0byBjdXJyZW50IGZyYWcuCi0gKi8KLS8qIEpGIGNoYW5nZWQgPCAxIHRvIDw9IDEgdG8gYXZvaWQgYSByYWNlIGNvbmRpdG9uICovCi0jZGVmaW5lIEZSQUdfQVBQRU5EXzFfQ0hBUihkYXR1bSkJXAotewkJCQkJXAotICBpZiAob2JzdGFja19yb29tKCAmZnJhZ3MgKSA8PSAxKSB7XAotICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwlcCi0gICAgZnJhZ19uZXcgKDApOwkJXAotICB9CQkJCVwKLSAgb2JzdGFja18xZ3JvdyggJmZyYWdzLCBkYXR1bSApOwlcCi19Ci0jZWxzZQotZXh0ZXJuIHZvaWQgZnJhZ19hcHBlbmRfMV9jaGFyIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBGUkFHX0FQUEVORF8xX0NIQVIoWCkgZnJhZ19hcHBlbmRfMV9jaGFyIChYKQotI2VuZGlmCi0KLQotdm9pZCBmcmFnX2luaXQgUEFSQU1TICgodm9pZCkpOwotZnJhZ1MgKmZyYWdfYWxsb2MgUEFSQU1TICgoc3RydWN0IG9ic3RhY2sgKikpOwotdm9pZCBmcmFnX2dyb3cgUEFSQU1TICgodW5zaWduZWQgaW50IG5jaGFycykpOwotY2hhciAqZnJhZ19tb3JlIFBBUkFNUyAoKGludCBuY2hhcnMpKTsKLXZvaWQgZnJhZ19hbGlnbiBQQVJBTVMgKChpbnQgYWxpZ25tZW50LCBpbnQgZmlsbF9jaGFyYWN0ZXIsIGludCBtYXgpKTsKLXZvaWQgZnJhZ19hbGlnbl9wYXR0ZXJuIFBBUkFNUyAoKGludCBhbGlnbm1lbnQsCi0JCQkJIGNvbnN0IGNoYXIgKmZpbGxfcGF0dGVybiwKLQkJCQkgaW50IG5fZmlsbCwKLQkJCQkgaW50IG1heCkpOwotdm9pZCBmcmFnX25ldyBQQVJBTVMgKChpbnQgb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZSkpOwotdm9pZCBmcmFnX3dhbmUgUEFSQU1TICgoZnJhZ1MgKiBmcmFnUCkpOwotCi1jaGFyICpmcmFnX3ZhcmlhbnQgUEFSQU1TICgocmVsYXhfc3RhdGVUIHR5cGUsCi0JCQkgICAgaW50IG1heF9jaGFycywKLQkJCSAgICBpbnQgdmFyLAotCQkJICAgIHJlbGF4X3N1YnN0YXRlVCBzdWJ0eXBlLAotCQkJICAgIHN5bWJvbFMgKiBzeW1ib2wsCi0JCQkgICAgb2Zmc2V0VCBvZmZzZXQsCi0JCQkgICAgY2hhciAqb3Bjb2RlKSk7Ci0KLWNoYXIgKmZyYWdfdmFyIFBBUkFNUyAoKHJlbGF4X3N0YXRlVCB0eXBlLAotCQkJaW50IG1heF9jaGFycywKLQkJCWludCB2YXIsCi0JCQlyZWxheF9zdWJzdGF0ZVQgc3VidHlwZSwKLQkJCXN5bWJvbFMgKiBzeW1ib2wsCi0JCQlvZmZzZXRUIG9mZnNldCwKLQkJCWNoYXIgKm9wY29kZSkpOwotCi0jZW5kaWYgLyogRlJBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2dhc3AuYyBiL2dhcy9nYXNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Yjk4YjMuLjAwMDAwMDAKLS0tIGEvZ2FzL2dhc3AuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NTAgKzAsMCBAQAotLyogZ2FzcC5jIC0gR251IGFzc2VtYmxlciBwcmVwcm9jZXNzb3IgbWFpbiBwcm9ncmFtLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKLSAgICAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBU1AsIHRoZSBHTlUgQXNzZW1ibGVyIFByZXByb2Nlc3Nvci4KLQotICAgR0FTUCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBU1AgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVNQOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKgotCi1UaGlzIHByb2dyYW0gdHJhbnNsYXRlcyB0aGUgaW5wdXQgbWFjcm9zIGFuZCBzdHVmZiBpbnRvIGEgZm9ybQotc3VpdGFibGUgZm9yIGdhcyB0byBjb25zdW1lLgotCi0KLSAgZ2FzcCBbLXNkaGF1XSBbLWMgY2hhcl0gWy1vIDxvdXRmaWxlPl0gPGluZmlsZT4qCi0KLSAgLXMgY29weSBzb3VyY2UgdG8gb3V0cHV0Ci0gIC1jIDxjaGFyPiBjb21tZW50cyBhcmUgc3RhcnRlZCB3aXRoIDxjaGFyPiBpbnN0ZWFkIG9mICEKLSAgLXUgYWxsb3cgdW5yZWFzb25hYmxlIHN0dWZmCi0gIC1wIHByaW50IGxpbmUgbnVtYmVycwotICAtZCBwcmludCBkZWJ1Z2dpbmcgc3RhdHMKLSAgLXMgc2VtaSBjb2xvbnMgc3RhcnQgY29tbWVudHMKLSAgLWEgdXNlIGFsdGVybmF0ZSBzeW50YXgKLSAgICAgUHNldWRvIG9wcyBjYW4gc3RhcnQgd2l0aCBvciB3aXRob3V0IGEgLgotICAgICBMYWJlbHMgaGF2ZSB0byBiZSBpbiBmaXJzdCBjb2x1bW4uCi0gIC1JIHNwZWNpZnkgaW5jbHVkZSBkaXIKLSAgICBNYWNybyBhcmcgcGFyYW1ldGVycyBzdWJzaXR1dGVkIGJ5IG5hbWUsIGRvbid0IG5lZWQgdGhlICYuCi0gICAgIFN0cmluZyBjYW4gc3RhcnQgd2l0aCAnIHRvby4KLSAgICAgU3RyaW5ncyBjYW4gYmUgc3Vycm91bmRlZCBieSA8Li4+Ci0gICAgIEEgJTxleHA+IGluIGEgc3RyaW5nIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiAKLSAgICAgTGl0ZXJhbCBjaGFyIGluIGEgc3RyaW5nIHdpdGggIQotCi0KLSovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9NQUxMT0NfREVDTEFSQVRJT04KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic2IuaCIKLSNpbmNsdWRlICJtYWNyby5oIgotI2luY2x1ZGUgImFzaW50bC5oIgotCi1jaGFyICpwcm9ncmFtX3ZlcnNpb24gPSAiMS4yIjsKLQotLyogVGhpcyBpcyBub3JtYWxseSBkZWNsYXJlZCBpbiBhcy5oLCBidXQgd2UgZG9uJ3QgaW5jbHVkZSB0aGF0LiAgV2UKLSAgIG5lZWQgdGhlIGZ1bmN0aW9uIGJlY2F1c2Ugb3RoZXIgZmlsZXMgbGlua2VkIHdpdGggZ2FzcC5jIG1pZ2h0IGNhbGwKLSAgIGl0LiAgKi8KLWV4dGVybiB2b2lkIGFzX2Fib3J0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLQotLyogVGhlIGRlZmF1bHQgb2JzdGFjayBjaHVuayBzaXplLiAgSWYgd2Ugc2V0IHRoaXMgdG8gemVybywgdGhlCi0gICBvYnN0YWNrIGNvZGUgd2lsbCB1c2Ugd2hhdGV2ZXIgd2lsbCBmaXQgaW4gYSA0MDk2IGJ5dGUgYmxvY2suICBUaGlzCi0gICBpcyB1c2VkIGJ5IHRoZSBoYXNoIHRhYmxlIGNvZGUgdXNlZCBieSBtYWNyby5jLiAgKi8KLWludCBjaHVua3NpemUgPSAwOwotCi0jZGVmaW5lIE1BWF9JTkNMVURFUyAzMAkJLyogTWF4aW11bSBpbmNsdWRlIGRlcHRoICovCi0jZGVmaW5lIE1BWF9SRUFTT05BQkxFIDEwMDAJLyogTWF4aW11bSBudW1iZXIgb2YgZXhwYW5zaW9ucyAqLwotCi1pbnQgdW5yZWFzb25hYmxlOwkJLyogLXUgb24gY29tbWFuZCBsaW5lICovCi1pbnQgc3RhdHM7CQkJLyogLWQgb24gY29tbWFuZCBsaW5lICovCi1pbnQgcHJpbnRfbGluZV9udW1iZXI7CQkvKiAtcCBmbGFnIG9uIGNvbW1hbmQgbGluZSAqLwotaW50IGNvcHlzb3VyY2U7CQkJLyogLWMgZmxhZyBvbiBjb21tYW5kIGxpbmUgKi8KLWludCB3YXJuaW5nczsJCQkvKiBOdW1iZXIgb2YgV0FSTklOR3MgZ2VuZXJhdGVkIHNvIGZhci4gKi8KLWludCBlcnJvcnM7CQkJLyogTnVtYmVyIG9mIEVSUk9ScyBnZW5lcmF0ZWQgc28gZmFyLiAqLwotaW50IGZhdGFsczsJCQkvKiBOdW1iZXIgb2YgZmF0YWwgRVJST1JzIGdlbmVyYXRlZCBzbyBmYXIgKGVpdGhlciAwIG9yIDEpLiAqLwotaW50IGFsdGVybmF0ZSA9IDA7ICAgICAgICAgICAgICAvKiAtYSBvbiBjb21tYW5kIGxpbmUgKi8KLWludCBtcmkgPSAwOwkJCS8qIC1NIG9uIGNvbW1hbmQgbGluZSAqLwotY2hhciBjb21tZW50X2NoYXIgPSAnISc7Ci1pbnQgcmFkaXggPSAxMDsJCQkvKiBEZWZhdWx0IHJhZGl4ICovCi0KLWludCBoYWRfZW5kOyAvKiBTZWVuIC5FTkQgKi8KLQotLyogVGhlIG91dHB1dCBzdHJlYW0gKi8KLUZJTEUgKm91dGZpbGU7Ci0KLS8qIHRoZSBhdHRyaWJ1dGVzIG9mIGVhY2ggY2hhcmFjdGVyIGFyZSBzdG9yZWQgYXMgYSBiaXQgcGF0dGVybgotICAgY2hhcnR5cGUsIHdoaWNoIGdpdmVzIHVzIHF1aWNrIHRlc3RzLiAqLwotCi0KLSNkZWZpbmUgRklSU1RCSVQgMQotI2RlZmluZSBORVhUQklUICAyCi0jZGVmaW5lIFNFUEJJVCAgIDQKLSNkZWZpbmUgV0hJVEVCSVQgOAotI2RlZmluZSBDT01NRU5UQklUIDE2Ci0jZGVmaW5lIEJBU0VCSVQgIDMyCi0jZGVmaW5lIElTQ09NTUVOVENIQVIoeCkgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBDT01NRU5UQklUKQotI2RlZmluZSBJU0ZJUlNUQ0hBUih4KSAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBGSVJTVEJJVCkKLSNkZWZpbmUgSVNORVhUQ0hBUih4KSAgIChjaGFydHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgTkVYVEJJVCkKLSNkZWZpbmUgSVNTRVAoeCkgICAgICAgIChjaGFydHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgU0VQQklUKQotI2RlZmluZSBJU1dISVRFKHgpICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBXSElURUJJVCkKLSNkZWZpbmUgSVNCQVNFKHgpICAgICAgIChjaGFydHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgQkFTRUJJVCkKLXN0YXRpYyBjaGFyIGNoYXJ0eXBlWzI1Nl07Ci0KLQotLyogQ29uZGl0aW9uYWwgYXNzZW1ibHkgdXNlcyB0aGUgYGlmc3RhY2snLiAgRWFjaCBhaWYgcHVzaGVzIGFub3RoZXIKLSAgIGVudHJ5IG9udG8gdGhlIHN0YWNrLCBhbmQgc2V0cyB0aGUgb24gZmxhZyBpZiBpdCBzaG91bGQuICBUaGUgYWVsc2UKLSAgIHNldHMgaGFkZWxzZSwgYW5kIHRvZ2dsZXMgb24uICBBbiBhZW5kIHBvcHMgYSBsZXZlbC4gIFdlIGxpbWl0IHRvCi0gICAxMDAgbGV2ZWxzIG9mIG5lc3RpbmcsIG5vdCBiZWNhdXNlIHdlJ3JlIGZhY2lzdHMgcGlncyB3aXRoIHJlYWQKLSAgIG9ubHkgbWluZHMsIGJ1dCBiZWNhdXNlIG1vcmUgdGhhbiAxMDAgbGV2ZWxzIG9mIG5lc3RpbmcgaXMgcHJvYmFibHkKLSAgIGEgYnVnIGluIHRoZSB1c2VyJ3MgbWFjcm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBJRk5FU1RJTkcgMTAwCi1zdHJ1Y3QKLSAgewotICAgIGludCBvbjsJCQkvKiBpcyB0aGUgbGV2ZWwgYmVpbmcgb3V0cHV0ICovCi0gICAgaW50IGhhZGVsc2U7CQkvKiBoYXMgYW4gYWVsc2UgYmVlbiBzZWVuICovCi0gIH0KLWlmc3RhY2tbSUZORVNUSU5HXTsKLWludCBpZmk7Ci0KLS8qIFRoZSBmaW5hbCBhbmQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGFyZSBrZXB0IGluCi0gICBleHBfdCdzLiAgTm90ZSB0aGF0IGEgc3ltYm9sIGlzIG5vdCBhbiBzYiwgYnV0IGEgcG9pbnRlciBpbnRvIHRoZSBpbnB1dAotICAgbGluZS4gIEl0IG11c3QgYmUgY29wZWQgc29tZXdoZXJlIHNhZmUgYmVmb3JlIHRoZSBuZXh0IGxpbmUgaXMgcmVhZCBpbi4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGxlbjsKLSAgfQotc3ltYm9sOwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgaW50IHZhbHVlOwkJCS8qIGNvbnN0YW50IHBhcnQgKi8KLSAgICBzeW1ib2wgYWRkX3N5bWJvbDsJCS8qIG5hbWUgcGFydCAqLwotICAgIHN5bWJvbCBzdWJfc3ltYm9sOwkJLyogbmFtZSBwYXJ0ICovCi0gIH0KLWV4cF90OwotCi0KLS8qIEhhc2hpbmcgaXMgZG9uZSBpbiBhIHByZXR0eSBzdGFuZGFyZCB3YXkuICBBIGhhc2hfdGFibGUgaGFzIGEKLSAgIHBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgcG9pbnRlcnMgdG8gaGFzaF9lbnRyeXMsIGFuZCB0aGUgc2l6ZSBvZiB0aGUKLSAgIHZlY3Rvci4gIEEgaGFzaF9lbnRyeSBjb250YWlucyBhIHVuaW9uIG9mIGFsbCB0aGUgaW5mbyB3ZSBsaWtlIHRvCi0gICBzdG9yZSBpbiBoYXNoIHRhYmxlLiAgSWYgdGhlcmUgaXMgYSBoYXNoIGNvbGxpc2lvbiwgaGFzaF9lbnRyaWVzCi0gICB3aXRoIHRoZSBzYW1lIGhhc2ggYXJlIGtlcHQgaW4gYSBjaGFpbi4gKi8KLQotLyogV2hhdCB0aGUgZGF0YSBpbiBhIGhhc2hfZW50cnkgbWVhbnMgKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgaGFzaF9pbnRlZ2VyLAkJLyogbmFtZS0+aW50ZWdlciBtYXBwaW5nICovCi0gICAgaGFzaF9zdHJpbmcsCQkvKiBuYW1lLT5zdHJpbmcgbWFwcGluZyAqLwotICAgIGhhc2hfbWFjcm8sCQkJLyogbmFtZSBpcyBhIG1hY3JvICovCi0gICAgaGFzaF9mb3JtYWwJCQkvKiBuYW1lIGlzIGEgZm9ybWFsIGFyZ3VtZW50ICovCi0gIH0gaGFzaF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBocwotICB7Ci0gICAgc2Iga2V5OwkJCS8qIHN5bWJvbCBuYW1lICovCi0gICAgaGFzaF90eXBlIHR5cGU7CQkvKiBzeW1ib2wgbWVhbmluZyAqLwotICAgIHVuaW9uCi0gICAgICB7Ci0Jc2IgczsKLQlpbnQgaTsKLQlzdHJ1Y3QgbWFjcm9fc3RydWN0ICptOwotCXN0cnVjdCBmb3JtYWxfc3RydWN0ICpmOwotICAgICAgfSB2YWx1ZTsKLSAgICBzdHJ1Y3QgaHMgKm5leHQ7CQkvKiBuZXh0IGhhc2hfZW50cnkgd2l0aCBzYW1lIGhhc2gga2V5ICovCi0gIH0gaGFzaF9lbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGhhc2hfZW50cnkgKip0YWJsZTsKLSAgICBpbnQgc2l6ZTsKLSAgfSBoYXNoX3RhYmxlOwotCi0KLS8qIFN0cnVjdHVyZXMgdXNlZCB0byBzdG9yZSBtYWNyb3MuIAotCi0gICBFYWNoIG1hY3JvIGtub3dzIGl0cyBuYW1lIGFuZCBpbmNsdWRlZCB0ZXh0LiAgSXQgZ2V0cyBidWlsdCB3aXRoIGEKLSAgIGxpc3Qgb2YgZm9ybWFsIGFyZ3VtZW50cywgYW5kIGFsc28ga2VlcHMgYSBoYXNoIHRhYmxlIHdoaWNoIHBvaW50cwotICAgaW50byB0aGUgbGlzdCB0byBzcGVlZCB1cCBmb3JtYWwgc2VhcmNoLiAgRWFjaCBmb3JtYWwga25vd3MgaXRzCi0gICBuYW1lIGFuZCBpdHMgZGVmYXVsdCB2YWx1ZS4gIEVhY2ggdGltZSB0aGUgbWFjcm8gaXMgZXhwYW5kZWQsIHRoZQotICAgZm9ybWFscyBnZXQgdGhlIGFjdHVhbCB2YWx1ZXMgYXR0YXRjaGVkIHRvIHRoZW0uICovCi0KLS8qIGRlc2NyaWJlIHRoZSBmb3JtYWwgYXJndW1lbnRzIHRvIGEgbWFjcm8gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZm9ybWFsX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IGZvcm1hbF9zdHJ1Y3QgKm5leHQ7CS8qIG5leHQgZm9ybWFsIGluIGxpc3QgKi8KLSAgICBzYiBuYW1lOwkJCS8qIG5hbWUgb2YgdGhlIGZvcm1hbCAqLwotICAgIHNiIGRlZjsJCQkvKiB0aGUgZGVmYXVsdCB2YWx1ZSAqLwotICAgIHNiIGFjdHVhbDsJCQkvKiB0aGUgYWN0dWFsIGFyZ3VtZW50IChjaGFuZ2VkIG9uIGVhY2ggZXhwYW5zaW9uKSAqLwotICAgIGludCBpbmRleDsJCQkvKiB0aGUgaW5kZXggb2YgdGhlIGZvcm1hbCAwLi5mb3JtYWxfY291bnQtMSAqLwotICB9Ci1mb3JtYWxfZW50cnk7Ci0KLS8qIGRlc2NyaWJlIHRoZSBtYWNyby4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbWFjcm9fc3RydWN0Ci0gIHsKLSAgICBzYiBzdWI7CQkJLyogc3Vic3RpdHV0aW9uIHRleHQuICovCi0gICAgaW50IGZvcm1hbF9jb3VudDsJCS8qIG51bWJlciBvZiBmb3JtYWwgYXJncy4gKi8KLSAgICBmb3JtYWxfZW50cnkgKmZvcm1hbHM7CS8qIHBvaW50ZXIgdG8gbGlzdCBvZiBmb3JtYWxfc3RydWN0cyAqLwotICAgIGhhc2hfdGFibGUgZm9ybWFsX2hhc2g7CS8qIGhhc2ggdGFibGUgb2YgZm9ybWFscy4gKi8KLSAgfQotbWFjcm9fZW50cnk7Ci0KLS8qIGhvdyB3ZSBuZXN0IGZpbGVzIGFuZCBleHBhbmQgbWFjcm9zIGV0Yy4KLQotICAgd2Uga2VlcCBhIHN0YWNrIG9mIG9mIGluY2x1ZGVfc3RhY2sgc3RydWN0cy4gIGVhY2ggaW5jbHVkZSBmaWxlCi0gICBwdXNoZXMgYSBuZXcgbGV2ZWwgb250byB0aGUgc3RhY2suICB3ZSBrZWVwIGFuIHNiIHdpdGggYSBwdXNoYmFjawotICAgdG9vLiAgdW5nZXQgY2hhcnMgYXJlIHB1c2hlZCBvbnRvIHRoZSBwdXNoYmFjayBzYiwgZ2V0Y2hhcnMgZmlyc3QKLSAgIGNoZWNrcyB0aGUgcHVzaGJhY2sgc2IgYmVmb3JlIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgotCi0gICBzbWFsbCB0aGluZ3MgYXJlIGV4cGFuZGVkIGJ5IGFkZGluZyB0aGUgdGV4dCBvZiB0aGUgaXRlbSBvbnRvIHRoZQotICAgcHVzaGJhY2sgc2IuICBsYXJnZXIgaXRlbXMgYXJlIGdyb3duIGJ5IHB1c2hpbmcgYSBuZXcgbGV2ZWwgYW5kCi0gICBhbGxvY2F0aW5nIHRoZSBlbnRpcmUgcHVzaGJhY2sgYnVmIGZvciB0aGUgaXRlbS4gIGVhY2ggdGltZQotICAgc29tZXRoaW5nIGxpa2UgYSBtYWNybyBpcyBleHBhbmRlZCwgdGhlIHN0YWNrIGluZGV4IGlzIGNoYW5nZWQuIHdlCi0gICBjYW4gdGhlbiBwZXJmb3JtIGFuIGV4aXRtIGJ5IHBvcHBpbmcgYWxsIGVudHJpZXMgb2ZmIHRoZSBzdGFjayB3aXRoCi0gICB0aGUgc2FtZSBzdGFjayBpbmRleC4gIGlmIHdlJ3JlIGJlaW5nIHJlYXNvbmFibGUsIHdlIGNhbiBkZXRlY3QKLSAgIHJlY3VzaXZlIGV4cGFuc2lvbiBieSBjaGVja2luZyB0aGUgaW5kZXggaXMgcmVhc29uYWJseSBzbWFsbC4KLSAqLwotCi10eXBlZGVmIGVudW0KLSAgewotICAgIGluY2x1ZGVfZmlsZSwgaW5jbHVkZV9yZXBlYXQsIGluY2x1ZGVfd2hpbGUsIGluY2x1ZGVfbWFjcm8KLSAgfSBpbmNsdWRlX3R5cGU7Ci0KLXN0cnVjdCBpbmNsdWRlX3N0YWNrCi0gIHsKLSAgICBzYiBwdXNoYmFjazsJCS8qIGN1cnJlbnQgcHVzaGJhY2sgc3RyZWFtICovCi0gICAgaW50IHB1c2hiYWNrX2luZGV4OwkJLyogbmV4dCBjaGFyIHRvIHJlYWQgZnJvbSBzdHJlYW0gKi8KLSAgICBGSUxFICpoYW5kbGU7CQkvKiBvcGVuIGZpbGUgKi8KLSAgICBzYiBuYW1lOwkJCS8qIG5hbWUgb2YgZmlsZSAqLwotICAgIGludCBsaW5lY291bnQ7CQkvKiBudW1iZXIgb2YgbGluZXMgcmVhZCBzbyBmYXIgKi8KLSAgICBpbmNsdWRlX3R5cGUgdHlwZTsKLSAgICBpbnQgaW5kZXg7CQkJLyogaW5kZXggb2YgdGhpcyBsYXllciAqLwotICB9Ci1pbmNsdWRlX3N0YWNrW01BWF9JTkNMVURFU107Ci0KLXN0cnVjdCBpbmNsdWRlX3N0YWNrICpzcDsKLSNkZWZpbmUgaXNwIChzcCAtIGluY2x1ZGVfc3RhY2spCi0KLS8qIEluY2x1ZGUgZmlsZSBsaXN0ICovCi0KLXR5cGVkZWYgc3RydWN0IGluY2x1ZGVfcGF0aCAKLXsKLSAgc3RydWN0IGluY2x1ZGVfcGF0aCAqbmV4dDsKLSAgc2IgcGF0aDsKLX0gIGluY2x1ZGVfcGF0aDsKLQotaW5jbHVkZV9wYXRoICpwYXRoc19oZWFkOwotaW5jbHVkZV9wYXRoICpwYXRoc190YWlsOwotCi0KLXN0YXRpYyB2b2lkIHF1aXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgaGFzaF9uZXdfdGFibGUgUEFSQU1TICgoaW50LCBoYXNoX3RhYmxlICopKTsKLXN0YXRpYyBpbnQgaGFzaCBQQVJBTVMgKChzYiAqKSk7Ci1zdGF0aWMgaGFzaF9lbnRyeSAqaGFzaF9jcmVhdGUgUEFSQU1TICgoaGFzaF90YWJsZSAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBoYXNoX2FkZF90b19zdHJpbmdfdGFibGUgUEFSQU1TICgoaGFzaF90YWJsZSAqLCBzYiAqLCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGhhc2hfYWRkX3RvX2ludF90YWJsZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICosIGludCkpOwotc3RhdGljIGhhc2hfZW50cnkgKmhhc2hfbG9va3VwIFBBUkFNUyAoKGhhc2hfdGFibGUgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgY2hlY2tjb25zdCBQQVJBTVMgKChpbnQsIGV4cF90ICopKTsKLXN0YXRpYyBpbnQgc2Jfc3RydG9sIFBBUkFNUyAoKGludCwgc2IgKiwgaW50LCBpbnQgKikpOwotc3RhdGljIGludCBsZXZlbF8wIFBBUkFNUyAoKGludCwgc2IgKiwgZXhwX3QgKikpOwotc3RhdGljIGludCBsZXZlbF8xIFBBUkFNUyAoKGludCwgc2IgKiwgZXhwX3QgKikpOwotc3RhdGljIGludCBsZXZlbF8yIFBBUkFNUyAoKGludCwgc2IgKiwgZXhwX3QgKikpOwotc3RhdGljIGludCBsZXZlbF8zIFBBUkFNUyAoKGludCwgc2IgKiwgZXhwX3QgKikpOwotc3RhdGljIGludCBsZXZlbF80IFBBUkFNUyAoKGludCwgc2IgKiwgZXhwX3QgKikpOwotc3RhdGljIGludCBsZXZlbF81IFBBUkFNUyAoKGludCwgc2IgKiwgZXhwX3QgKikpOwotc3RhdGljIGludCBleHBfcGFyc2UgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgdm9pZCBleHBfc3RyaW5nIFBBUkFNUyAoKGV4cF90ICosIHNiICopKTsKLXN0YXRpYyBpbnQgZXhwX2dldF9hYnMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHNiICosIGludCAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgc3RyaXBfY29tbWVudHMgUEFSQU1TICgoc2IgKikpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCB1bmdldCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGluY2x1ZGVfYnVmIFBBUkFNUyAoKHNiICosIHNiICosIGluY2x1ZGVfdHlwZSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbmNsdWRlX3ByaW50X3doZXJlX2xpbmUgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCBpbmNsdWRlX3ByaW50X2xpbmUgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50IGdldF9saW5lIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyBpbnQgZ3JhYl9sYWJlbCBQQVJBTVMgKChzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBjaGFuZ2VfYmFzZSBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2VuZCBQQVJBTVMgKChzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hc3NpZ24gUEFSQU1TICgoaW50LCBpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3JhZGl4IFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0X29wc2l6ZSBQQVJBTVMgKChpbnQsIHNiICosIGludCAqKSk7Ci1zdGF0aWMgaW50IGVvbCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2RhdGEgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2RhdGFiIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fYWxpZ24gUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19yZXMgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2V4cG9ydCBQQVJBTVMgKChzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19wcmludCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2hlYWRpbmcgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19wYWdlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2Zvcm0gUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldF9hbnlfc3RyaW5nIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgc2tpcF9vcGVucCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgc2tpcF9jbG9zZXAgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IGRvbGVuIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBkb2luc3RyIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBkb3N1YnN0ciBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfYXNzaWducyBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0X2FuZF9wcm9jZXNzIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGZyZWVfb2xkX2VudHJ5IFBBUkFNUyAoKGhhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgZG9fYXNzaWduYSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2Fzc2lnbmMgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19yZWcgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IGNvbmRhc3NfbG9va3VwX25hbWUgUEFSQU1TICgoc2IgKiwgaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgd2hhdGNvbmQgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQgKikpOwotc3RhdGljIGludCBpc3RydWUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19haWYgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hZWxzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19hZW5kaSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGNvbmRhc3Nfb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9faWYgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZ2V0X21yaV9zdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2lmYyBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fYWVuZHIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9fYXdoaWxlIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fYWVuZHcgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9fZXhpdG0gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9fYXJlcGVhdCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2VuZG0gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9faXJwIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19sb2NhbCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX21hY3JvIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBtYWNyb19vcCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0c3RyaW5nIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fc2RhdGEgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX3NkYXRhYiBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgbmV3X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb19pbmNsdWRlIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgaW5jbHVkZV9wb3AgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBnZXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBsaW5lY291bnQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBpbmNsdWRlX25leHRfaW5kZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2hhcnR5cGVfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHByb2Nlc3NfcHNldWRvX29wIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgYWRkX2tleXdvcmQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19kZWZpbmUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBzaG93X3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzaG93X2hlbHAgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIEZBVEFMKHgpIFwKLSAgZG8geyBpbmNsdWRlX3ByaW50X3doZXJlX2xpbmUgKHN0ZGVycik7IGZwcmludGYgeCA7IGZhdGFscysrOyBxdWl0KCk7IH0gd2hpbGUoMCkgCi0jZGVmaW5lIEVSUk9SKHgpIFwKLSAgZG8geyBpbmNsdWRlX3ByaW50X3doZXJlX2xpbmUgKHN0ZGVycik7IGZwcmludGYgeDsgZXJyb3JzKys7IH0gd2hpbGUoMCkKLSNkZWZpbmUgV0FSTklORyh4KSBcCi0gIGRvIHsgaW5jbHVkZV9wcmludF93aGVyZV9saW5lIChzdGRlcnIpOyBmcHJpbnRmIHg7IHdhcm5pbmdzKys7fSB3aGlsZSgwKSAKLQotCi0KLS8qIGV4aXQgdGhlIHByb2dyYW0gYW5kIHJldHVybiB0aGUgcmlnaHQgRVJST1IgY29kZS4gKi8KLXN0YXRpYyB2b2lkCi1xdWl0ICgpCi17Ci0gIGludCBleGl0Y29kZTsKLSAgaWYgKGZhdGFscyArIGVycm9ycykKLSAgICBleGl0Y29kZSA9IDE7Ci0gIGVsc2UKLSAgICBleGl0Y29kZSA9IDA7Ci0KLSAgaWYgKHN0YXRzKSAKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzYl9tYXhfcG93ZXJfdHdvOyBpKyspIAotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgInN0cmluZ3Mgc2l6ZSAlOGQgOiAlZFxuIiwgMTw8aSwgc3RyaW5nX2NvdW50W2ldKTsKLQl9Ci0gICAgfQotICBleGl0IChleGl0Y29kZSk7Ci19Ci0KLS8qIGhhc2ggdGFibGUgbWFpbnRlbmFuY2UuICovCi0KLS8qIGJ1aWxkIGEgbmV3IGhhc2ggdGFibGUgd2l0aCBzaXplIGJ1Y2tldHMsIGFuZCBmaWxsIGluIHRoZSBpbmZvIGF0IHB0ci4gKi8KLQotc3RhdGljIHZvaWQKLWhhc2hfbmV3X3RhYmxlIChzaXplLCBwdHIpCi0gICAgIGludCBzaXplOwotICAgICBoYXNoX3RhYmxlICpwdHI7Ci17Ci0gIGludCBpOwotICBwdHItPnNpemUgPSBzaXplOwotICBwdHItPnRhYmxlID0gKGhhc2hfZW50cnkgKiopIHhtYWxsb2MgKHNpemUgKiAoc2l6ZW9mIChoYXNoX2VudHJ5ICopKSk7Ci0gIC8qIEZpbGwgd2l0aCBudWxsLXBvaW50ZXIsIG5vdCB6ZXJvLWJpdC1wYXR0ZXJuLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICBwdHItPnRhYmxlW2ldID0gMDsKLX0KLQotLyogY2FsY3VsYXRlIGFuZCByZXR1cm4gdGhlIGhhc2ggdmFsdWUgb2YgdGhlIHNiIGF0IGtleS4gKi8KLQotc3RhdGljIGludAotaGFzaCAoa2V5KQotICAgICBzYiAqa2V5OwotewotICBpbnQgayA9IDB4MTIzNDsKLSAgaW50IGk7Ci0gIGNoYXIgKnAgPSBrZXktPnB0cjsKLSAgZm9yIChpID0gMDsgaSA8IGtleS0+bGVuOyBpKyspCi0gICAgewotICAgICAgayBePSAoayA8PCAyKSBeICpwOwotICAgICAgcCsrOwotICAgIH0KLSAgcmV0dXJuIGsgJiAweGYwZmZmOwotfQotCi0vKiBsb29rdXAga2V5IGluIGhhc2hfdGFibGUgdGFiLCBpZiBwcmVzZW50LCB0aGVuIHJldHVybiBpdCwgb3RoZXJ3aXNlCi0gICBidWlsZCBhIG5ldyBvbmUgYW5kIGZpbGwgaXQgd2l0aCBoYXNoX2ludGVnZXIuICovCi0KLXN0YXRpYwotaGFzaF9lbnRyeSAqCi1oYXNoX2NyZWF0ZSAodGFiLCBrZXkpCi0gICAgIGhhc2hfdGFibGUgKnRhYjsKLSAgICAgc2IgKmtleTsKLXsKLSAgaW50IGsgPSBoYXNoIChrZXkpICUgdGFiLT5zaXplOwotICBoYXNoX2VudHJ5ICpwOwotICBoYXNoX2VudHJ5ICoqdGFibGUgPSB0YWItPnRhYmxlOwotCi0gIHAgPSB0YWJsZVtrXTsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoIXApCi0JewotCSAgaGFzaF9lbnRyeSAqbiA9IChoYXNoX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoaGFzaF9lbnRyeSkpOwotCSAgbi0+bmV4dCA9IHRhYmxlW2tdOwotCSAgc2JfbmV3ICgmbi0+a2V5KTsKLQkgIHNiX2FkZF9zYiAoJm4tPmtleSwga2V5KTsKLQkgIHRhYmxlW2tdID0gbjsKLQkgIG4tPnR5cGUgPSBoYXNoX2ludGVnZXI7Ci0JICByZXR1cm4gbjsKLQl9Ci0gICAgICBpZiAoc3RybmNtcCAodGFibGVba10tPmtleS5wdHIsIGtleS0+cHRyLCBrZXktPmxlbikgPT0gMCkKLQl7Ci0JICByZXR1cm4gcDsKLQl9Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIGFkZCBzYiBuYW1lIHdpdGgga2V5IGludG8gaGFzaF90YWJsZSB0YWIuICBpZiByZXBsYWNpbmcgb2xkIHZhbHVlCi0gICBhbmQgYWdhaW4sIHRoZW4gRVJST1IuICovCi0KLXN0YXRpYwotdm9pZAotaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlICh0YWIsIGtleSwgbmFtZSwgYWdhaW4pCi0gICAgIGhhc2hfdGFibGUgKnRhYjsKLSAgICAgc2IgKmtleTsKLSAgICAgc2IgKm5hbWU7Ci0gICAgIGludCBhZ2FpbjsKLXsKLSAgaGFzaF9lbnRyeSAqcHRyID0gaGFzaF9jcmVhdGUgKHRhYiwga2V5KTsKLSAgaWYgKHB0ci0+dHlwZSA9PSBoYXNoX2ludGVnZXIpCi0gICAgewotICAgICAgc2JfbmV3ICgmcHRyLT52YWx1ZS5zKTsKLSAgICB9Ci0gIGlmIChwdHItPnZhbHVlLnMubGVuKQotICAgIHsKLSAgICAgIGlmICghYWdhaW4pCi0JRVJST1IgKChzdGRlcnIsIF8oInJlZGVmaW5pdGlvbiBub3QgYWxsb3dlZFxuIikpKTsKLSAgICB9Ci0KLSAgcHRyLT50eXBlID0gaGFzaF9zdHJpbmc7Ci0gIHNiX3Jlc2V0ICgmcHRyLT52YWx1ZS5zKTsKLSAgCi0gIHNiX2FkZF9zYiAoJnB0ci0+dmFsdWUucywgbmFtZSk7Ci19Ci0KLS8qIGFkZCBpbnRlZ2VyIG5hbWUgdG8gaGFzaF90YWJsZSB0YWIgd2l0aCBzYiBrZXkuICovCi0KLXN0YXRpYwotdm9pZAotaGFzaF9hZGRfdG9faW50X3RhYmxlICh0YWIsIGtleSwgbmFtZSkKLSAgICAgaGFzaF90YWJsZSAqdGFiOwotICAgICBzYiAqa2V5OwotICAgICBpbnQgbmFtZTsKLXsKLSAgaGFzaF9lbnRyeSAqcHRyID0gaGFzaF9jcmVhdGUgKHRhYiwga2V5KTsKLSAgcHRyLT52YWx1ZS5pID0gbmFtZTsKLX0KLQotLyogbG9va3VwIHNiIGtleSBpbiBoYXNoX3RhYmxlIHRhYi4gIGlmIGZvdW5kIHJldHVybiBoYXNoX2VudHJ5IHJlc3VsdCwKLSAgIGVsc2UgMC4gKi8KLSAgIAotc3RhdGljCi1oYXNoX2VudHJ5ICoKLWhhc2hfbG9va3VwICh0YWIsIGtleSkKLSAgICAgaGFzaF90YWJsZSAqdGFiOwotICAgICBzYiAqa2V5OwotewotICBpbnQgayA9IGhhc2ggKGtleSkgJSB0YWItPnNpemU7Ci0gIGhhc2hfZW50cnkgKip0YWJsZSA9IHRhYi0+dGFibGU7Ci0gIGhhc2hfZW50cnkgKnAgPSB0YWJsZVtrXTsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgaWYgKHAtPmtleS5sZW4gPT0ga2V5LT5sZW4KLQkgICYmIHN0cm5jbXAgKHAtPmtleS5wdHIsIGtleS0+cHRyLCBrZXktPmxlbikgPT0gMCkKLQlyZXR1cm4gcDsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogZXhwcmVzc2lvbnMKLQotICAgYXJlIGhhbmRsZWQgaW4gYSByZWFsbHkgc2ltcGxlIHJlY3Vyc2l2ZSBkZWNlbnQgd2F5LiBlYWNoIGJpdCBvZgotICAgdGhlIG1hY2hpbmUgdGFrZXMgYW4gaW5kZXggaW50byBhbiBzYiBhbmQgYSBwb2ludGVyIHRvIGFuIGV4cF90LAotICAgbW9kaWZpZXMgdGhlICpleHBfdCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgcGFzdCB0aGUgcGFydCBvZiB0aGUgZXhwcmVzc2lvbiBwYXJzZWQuCi0KLSBleHByZXNzaW9uIHByZWNlZGVuY2U6Ci0gICggKQotIHVuYXJ5ICsgLSB+Ci0gICogLwotICArIC0KLSAgJgotICB8IH4KLQotKi8KLQotCi0vKiBtYWtlIHN1cmUgdGhhdCB0aGUgZXhwX3QgYXQgdGVybSBpcyBjb25zdGFudCwgaWYgbm90IHRoZSBnaXZlIHRoZSBvcCBFUlJPUi4gKi8KLQotc3RhdGljCi12b2lkCi1jaGVja2NvbnN0IChvcCwgdGVybSkKLSAgICAgaW50IG9wOwotICAgICBleHBfdCAqdGVybTsKLXsKLSAgaWYgKHRlcm0tPmFkZF9zeW1ib2wubGVuCi0gICAgICB8fCB0ZXJtLT5zdWJfc3ltYm9sLmxlbikKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygidGhlICVjIG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuXG4iKSwgb3ApKTsKLSAgICB9Ci19Ci0KLS8qIHR1cm4gdGhlIG51bWJlciBpbiBzdHJpbmcgYXQgaWR4IGludG8gYSBudW1iZXIgb2YgYmFzZSwKLSAgIGZpbGwgaW4gcHRyIGFuZCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IGluIHRoZQotICAgbnVtYmVyLiAqLwotCi1zdGF0aWMKLWludAotc2Jfc3RydG9sIChpZHgsIHN0cmluZywgYmFzZSwgcHRyKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBpbnQgYmFzZTsKLSAgICAgaW50ICpwdHI7Ci17Ci0gIGludCB2YWx1ZSA9IDA7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLQotICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4pCi0gICAgewotICAgICAgaW50IGNoID0gc3RyaW5nLT5wdHJbaWR4XTsKLSAgICAgIGludCBkaWcgPSAwOwotICAgICAgaWYgKGlzZGlnaXQgKGNoKSkKLQlkaWcgPSBjaCAtICcwJzsKLSAgICAgIGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCi0JZGlnID0gY2ggLSAnYScgKyAxMDsKLSAgICAgIGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpCi0JZGlnID0gY2ggLSAnQScgKyAxMDsKLSAgICAgIGVsc2UKLQlicmVhazsKLQotICAgICAgaWYgKGRpZyA+PSBiYXNlKQotCWJyZWFrOwotCi0gICAgICB2YWx1ZSA9IHZhbHVlICogYmFzZSArIGRpZzsKLSAgICAgIGlkeCsrOwotICAgIH0KLSAgKnB0ciA9IHZhbHVlOwotICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW50Ci1sZXZlbF8wIChpZHgsIHN0cmluZywgbGhzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqbGhzOwotewotICBsaHMtPmFkZF9zeW1ib2wubGVuID0gMDsKLSAgbGhzLT5hZGRfc3ltYm9sLm5hbWUgPSAwOwotCi0gIGxocy0+c3ViX3N5bWJvbC5sZW4gPSAwOwotICBsaHMtPnN1Yl9zeW1ib2wubmFtZSA9IDA7Ci0KLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotCi0gIGxocy0+dmFsdWUgPSAwOwotCi0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc3RyaW5nLT5wdHJbaWR4XSkpCi0gICAgewotICAgICAgaWR4ID0gc2Jfc3RydG9sIChpZHgsIHN0cmluZywgMTAsICZsaHMtPnZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKElTRklSU1RDSEFSIChzdHJpbmctPnB0cltpZHhdKSkKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gMDsKLSAgICAgIGxocy0+YWRkX3N5bWJvbC5uYW1lID0gc3RyaW5nLT5wdHIgKyBpZHg7Ci0gICAgICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4gJiYgSVNORVhUQ0hBUiAoc3RyaW5nLT5wdHJbaWR4XSkpCi0JewotCSAgaWR4Kys7Ci0JICBsZW4rKzsKLQl9Ci0gICAgICBsaHMtPmFkZF9zeW1ib2wubGVuID0gbGVuOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyaW5nLT5wdHJbaWR4XSA9PSAnIicpCi0gICAgewotICAgICAgc2IgYWNjOwotICAgICAgc2JfbmV3ICgmYWNjKTsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJzdHJpbmcgd2hlcmUgZXhwcmVzc2lvbiBleHBlY3RlZC5cbiIpKSk7Ci0gICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgc3RyaW5nLCAmYWNjKTsKLSAgICAgIHNiX2tpbGwgKCZhY2MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJjYW4ndCBmaW5kIHByaW1hcnkgaW4gZXhwcmVzc2lvbi5cbiIpKSk7Ci0gICAgICBpZHgrKzsKLSAgICB9Ci0gIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci19Ci0KLQotCi1zdGF0aWMgaW50Ci1sZXZlbF8xIChpZHgsIHN0cmluZywgbGhzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqbGhzOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci0KLSAgc3dpdGNoIChzdHJpbmctPnB0cltpZHhdKQotICAgIHsKLSAgICBjYXNlICcrJzoKLSAgICAgIGlkeCA9IGxldmVsXzEgKGlkeCArIDEsIHN0cmluZywgbGhzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ34nOgotICAgICAgaWR4ID0gbGV2ZWxfMSAoaWR4ICsgMSwgc3RyaW5nLCBsaHMpOwotICAgICAgY2hlY2tjb25zdCAoJ34nLCBsaHMpOwotICAgICAgbGhzLT52YWx1ZSA9IH5saHMtPnZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnLSc6Ci0gICAgICB7Ci0Jc3ltYm9sIHQ7Ci0JaWR4ID0gbGV2ZWxfMSAoaWR4ICsgMSwgc3RyaW5nLCBsaHMpOwotCWxocy0+dmFsdWUgPSAtbGhzLT52YWx1ZTsKLQl0ID0gbGhzLT5hZGRfc3ltYm9sOwotCWxocy0+YWRkX3N5bWJvbCA9IGxocy0+c3ViX3N5bWJvbDsKLQlsaHMtPnN1Yl9zeW1ib2wgPSB0OwotCWJyZWFrOwotICAgICAgfQotICAgIGNhc2UgJygnOgotICAgICAgaWR4Kys7Ci0gICAgICBpZHggPSBsZXZlbF81IChzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyksIHN0cmluZywgbGhzKTsKLSAgICAgIGlmIChzdHJpbmctPnB0cltpZHhdICE9ICcpJykKLQlFUlJPUiAoKHN0ZGVyciwgXygibWlzcGxhY2VkIGNsb3NpbmcgcGFyZW5zLlxuIikpKTsKLSAgICAgIGVsc2UKLQlpZHgrKzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZHggPSBsZXZlbF8wIChpZHgsIHN0cmluZywgbGhzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLX0KLQotc3RhdGljIGludAotbGV2ZWxfMiAoaWR4LCBzdHJpbmcsIGxocykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnN0cmluZzsKLSAgICAgZXhwX3QgKmxoczsKLXsKLSAgZXhwX3QgcmhzOwotCi0gIGlkeCA9IGxldmVsXzEgKGlkeCwgc3RyaW5nLCBsaHMpOwotCi0gIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbiAmJiAoc3RyaW5nLT5wdHJbaWR4XSA9PSAnKicKLQkJCSAgICAgICB8fCBzdHJpbmctPnB0cltpZHhdID09ICcvJykpCi0gICAgewotICAgICAgY2hhciBvcCA9IHN0cmluZy0+cHRyW2lkeCsrXTsKLSAgICAgIGlkeCA9IGxldmVsXzEgKGlkeCwgc3RyaW5nLCAmcmhzKTsKLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWNhc2UgJyonOgotCSAgY2hlY2tjb25zdCAoJyonLCBsaHMpOwotCSAgY2hlY2tjb25zdCAoJyonLCAmcmhzKTsKLQkgIGxocy0+dmFsdWUgKj0gcmhzLnZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnLyc6Ci0JICBjaGVja2NvbnN0ICgnLycsIGxocyk7Ci0JICBjaGVja2NvbnN0ICgnLycsICZyaHMpOwotCSAgaWYgKHJocy52YWx1ZSA9PSAwKQotCSAgICBFUlJPUiAoKHN0ZGVyciwgXygiYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVyby5cbiIpKSk7Ci0JICBlbHNlCi0JICAgIGxocy0+dmFsdWUgLz0gcmhzLnZhbHVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1sZXZlbF8zIChpZHgsIHN0cmluZywgbGhzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqbGhzOwotewotICBleHBfdCByaHM7Ci0KLSAgaWR4ID0gbGV2ZWxfMiAoaWR4LCBzdHJpbmcsIGxocyk7Ci0KLSAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuCi0JICYmIChzdHJpbmctPnB0cltpZHhdID09ICcrJwotCSAgICAgfHwgc3RyaW5nLT5wdHJbaWR4XSA9PSAnLScpKQotICAgIHsKLSAgICAgIGNoYXIgb3AgPSBzdHJpbmctPnB0cltpZHgrK107Ci0gICAgICBpZHggPSBsZXZlbF8yIChpZHgsIHN0cmluZywgJnJocyk7Ci0gICAgICBzd2l0Y2ggKG9wKQotCXsKLQljYXNlICcrJzoKLQkgIGxocy0+dmFsdWUgKz0gcmhzLnZhbHVlOwotCSAgaWYgKGxocy0+YWRkX3N5bWJvbC5uYW1lICYmIHJocy5hZGRfc3ltYm9sLm5hbWUpCi0JICAgIHsKLQkgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiY2FuJ3QgYWRkIHR3byByZWxvY2F0YWJsZSBleHByZXNzaW9uc1xuIikpKTsKLQkgICAgfQotCSAgLyogY2hhbmdlIG5uK3N5bWJvbCB0byBzeW1ib2wgKyBubiAqLwotCSAgaWYgKHJocy5hZGRfc3ltYm9sLm5hbWUpCi0JICAgIHsKLQkgICAgICBsaHMtPmFkZF9zeW1ib2wgPSByaHMuYWRkX3N5bWJvbDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnLSc6Ci0JICBsaHMtPnZhbHVlIC09IHJocy52YWx1ZTsKLQkgIGxocy0+c3ViX3N5bWJvbCA9IHJocy5hZGRfc3ltYm9sOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLX0KLQotc3RhdGljIGludAotbGV2ZWxfNCAoaWR4LCBzdHJpbmcsIGxocykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnN0cmluZzsKLSAgICAgZXhwX3QgKmxoczsKLXsKLSAgZXhwX3QgcmhzOwotCi0gIGlkeCA9IGxldmVsXzMgKGlkeCwgc3RyaW5nLCBsaHMpOwotCi0gIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbiAmJgotCSBzdHJpbmctPnB0cltpZHhdID09ICcmJykKLSAgICB7Ci0gICAgICBjaGFyIG9wID0gc3RyaW5nLT5wdHJbaWR4KytdOwotICAgICAgaWR4ID0gbGV2ZWxfMyAoaWR4LCBzdHJpbmcsICZyaHMpOwotICAgICAgc3dpdGNoIChvcCkKLQl7Ci0JY2FzZSAnJic6Ci0JICBjaGVja2NvbnN0ICgnJicsIGxocyk7Ci0JICBjaGVja2NvbnN0ICgnJicsICZyaHMpOwotCSAgbGhzLT52YWx1ZSAmPSByaHMudmFsdWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi1zdGF0aWMgaW50Ci1sZXZlbF81IChpZHgsIHN0cmluZywgbGhzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqbGhzOwotewotICBleHBfdCByaHM7Ci0KLSAgaWR4ID0gbGV2ZWxfNCAoaWR4LCBzdHJpbmcsIGxocyk7Ci0KLSAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuCi0JICYmIChzdHJpbmctPnB0cltpZHhdID09ICd8JyB8fCBzdHJpbmctPnB0cltpZHhdID09ICd+JykpCi0gICAgewotICAgICAgY2hhciBvcCA9IHN0cmluZy0+cHRyW2lkeCsrXTsKLSAgICAgIGlkeCA9IGxldmVsXzQgKGlkeCwgc3RyaW5nLCAmcmhzKTsKLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWNhc2UgJ3wnOgotCSAgY2hlY2tjb25zdCAoJ3wnLCBsaHMpOwotCSAgY2hlY2tjb25zdCAoJ3wnLCAmcmhzKTsKLQkgIGxocy0+dmFsdWUgfD0gcmhzLnZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnfic6Ci0JICBjaGVja2NvbnN0ICgnficsIGxocyk7Ci0JICBjaGVja2NvbnN0ICgnficsICZyaHMpOwotCSAgbGhzLT52YWx1ZSBePSByaHMudmFsdWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi0KLS8qIHBhcnNlIHRoZSBleHByZXNzaW9uIGF0IG9mZnNldCBpZHggaW50byBzdHJpbmcsIGZpbGwgdXAgcmVzIHdpdGgKLSAgIHRoZSByZXN1bHQuIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXIgcGFzdCB0aGUgZXhwcmVzc2lvbi4KLSAgICovCi0KLXN0YXRpYyBpbnQKLWV4cF9wYXJzZSAoaWR4LCBzdHJpbmcsIHJlcykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnN0cmluZzsKLSAgICAgZXhwX3QgKnJlczsKLXsKLSAgcmV0dXJuIGxldmVsXzUgKHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKSwgc3RyaW5nLCByZXMpOwotfQotCi0KLS8qIHR1cm4gdGhlIGV4cHJlc3Npb24gYXQgZXhwIGludG8gdGV4dCBhbmQgZ2x1ZSBpdCBvbnRvIHRoZSBlbmQgb2YKLSAgIHN0cmluZy4gKi8KLQotc3RhdGljIHZvaWQKLWV4cF9zdHJpbmcgKGV4cCwgc3RyaW5nKQotICAgICBleHBfdCAqZXhwOwotICAgICBzYiAqc3RyaW5nOwotewotICBpbnQgbnAgPSAwOwotICBpbnQgYWQgPSAwOwotICBzYl9yZXNldCAoc3RyaW5nKTsKLQotICBpZiAoZXhwLT5hZGRfc3ltYm9sLmxlbikKLSAgICB7Ci0gICAgICBzYl9hZGRfYnVmZmVyIChzdHJpbmcsIGV4cC0+YWRkX3N5bWJvbC5uYW1lLCBleHAtPmFkZF9zeW1ib2wubGVuKTsKLSAgICAgIG5wID0gMTsKLSAgICAgIGFkID0gMTsKLSAgICB9Ci0gIGlmIChleHAtPnZhbHVlKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzIwXTsKLSAgICAgIGlmIChucCkKLQlzYl9hZGRfY2hhciAoc3RyaW5nLCAnKycpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWQiLCBleHAtPnZhbHVlKTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKHN0cmluZywgYnVmKTsKLSAgICAgIG5wID0gMTsKLSAgICAgIGFkID0gMTsKLSAgICB9Ci0gIGlmIChleHAtPnN1Yl9zeW1ib2wubGVuKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyIChzdHJpbmcsICctJyk7Ci0gICAgICBzYl9hZGRfYnVmZmVyIChzdHJpbmcsIGV4cC0+YWRkX3N5bWJvbC5uYW1lLCBleHAtPmFkZF9zeW1ib2wubGVuKTsKLSAgICAgIG5wID0gMDsKLSAgICAgIGFkID0gMTsKLSAgICB9Ci0KLSAgaWYgKCFhZCkKLSAgICBzYl9hZGRfY2hhciAoc3RyaW5nLCAnMCcpOwotfQotCi0KLS8qIHBhcnNlIHRoZSBleHByZXNzaW9uIGF0IG9mZnNldCBpZHggaW50byBzYiBpbiwgcmV0dXJuIHRoZSB2YWx1ZSBpbiB2YWwuICAKLSAgIGlmIHRoZSBleHByZXNzaW9uIGlzIG5vdCBjb25zdGFudCwgZ2l2ZSBFUlJPUiBlbXNnLiAgcmV0dXJucyB0aGUgaW5kZXgKLSAgIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcGFzdCB0aGUgZW5kIG9mIHRoZSBleHByZXNzaW9uLiAqLwotCi1zdGF0aWMgaW50Ci1leHBfZ2V0X2FicyAoZW1zZywgaWR4LCBpbiwgdmFsKQotICAgICBjb25zdCBjaGFyICplbXNnOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCAqdmFsOwotewotICBleHBfdCByZXM7Ci0gIGlkeCA9IGV4cF9wYXJzZSAoaWR4LCBpbiwgJnJlcyk7Ci0gIGlmIChyZXMuYWRkX3N5bWJvbC5sZW4gfHwgcmVzLnN1Yl9zeW1ib2wubGVuKQotICAgIEVSUk9SICgoc3RkZXJyLCBlbXNnKSk7Ci0gICp2YWwgPSByZXMudmFsdWU7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLQotc2IgbGFiZWw7IC8qIGN1cnJlbnQgbGFiZWwgcGFyc2VkIGZyb20gbGluZSAqLwotaGFzaF90YWJsZSBhc3NpZ25faGFzaF90YWJsZTsgICAvKiBoYXNoIHRhYmxlIGZvciBhbGwgYXNzaWduZWQgdmFyaWFibGVzICovCi1oYXNoX3RhYmxlIGtleXdvcmRfaGFzaF90YWJsZTsgIC8qIGhhc2ggdGFibGUgZm9yIGtleXdvcmQgKi8KLWhhc2hfdGFibGUgdmFyczsgIC8qIGhhc2ggdGFibGUgZm9yICBlcSB2YXJpYWJsZXMgKi8KLQotI2RlZmluZSBpbl9jb21tZW50ICc7JwotCi0jaWYgMAotc3RhdGljIHZvaWQKLXN0cmlwX2NvbW1lbnRzIChvdXQpCi0gICAgIHNiICpvdXQ7Ci17Ci0gIGNoYXIgKnMgPSBvdXQtPnB0cjsKLSAgaW50IGkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgb3V0LT5sZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoSVNDT01NRU5UQ0hBUihzW2ldKSkKLQl7Ci0JICBvdXQtPmxlbiA9IGk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLSNlbmRpZgotCi0vKiBwdXNoIGJhY2sgY2hhcmFjdGVyIGNoIHNvIHRoYXQgaXQgY2FuIGJlIHJlYWQgYWdhaW4uICovCi0KLXN0YXRpYyB2b2lkCi11bmdldCAoY2gpCi0gICAgIGludCBjaDsKLXsKLSAgaWYgKGNoID09ICdcbicpCi0gICAgewotICAgICAgc3AtPmxpbmVjb3VudC0tOwotICAgIH0KLSAgaWYgKHNwLT5wdXNoYmFja19pbmRleCkKLSAgICBzcC0+cHVzaGJhY2tfaW5kZXgtLTsKLSAgZWxzZQotICAgIHNiX2FkZF9jaGFyICgmc3AtPnB1c2hiYWNrLCBjaCk7Ci19Ci0KLS8qIHB1c2ggdGhlIHNiIHB0ciBvbnRvIHRoZSBpbmNsdWRlIHN0YWNrLCB3aXRoIHRoZSBnaXZlbiBuYW1lLCB0eXBlIGFuZCBpbmRleC4gKi8KLQotc3RhdGljCi12b2lkCi1pbmNsdWRlX2J1ZiAobmFtZSwgcHRyLCB0eXBlLCBpbmRleCkKLSAgICAgc2IgKm5hbWU7Ci0gICAgIHNiICpwdHI7Ci0gICAgIGluY2x1ZGVfdHlwZSB0eXBlOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIHNwKys7Ci0gIGlmIChzcCAtIGluY2x1ZGVfc3RhY2sgPj0gTUFYX0lOQ0xVREVTKQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJ1bnJlYXNvbmFibGUgbmVzdGluZy5cbiIpKSk7Ci0gIHNiX25ldyAoJnNwLT5uYW1lKTsKLSAgc2JfYWRkX3NiICgmc3AtPm5hbWUsIG5hbWUpOwotICBzcC0+aGFuZGxlID0gMDsKLSAgc3AtPmxpbmVjb3VudCA9IDE7Ci0gIHNwLT5wdXNoYmFja19pbmRleCA9IDA7Ci0gIHNwLT50eXBlID0gdHlwZTsKLSAgc3AtPmluZGV4ID0gaW5kZXg7Ci0gIHNiX25ldyAoJnNwLT5wdXNoYmFjayk7Ci0gIHNiX2FkZF9zYiAoJnNwLT5wdXNoYmFjaywgcHRyKTsKLX0KLQotCi0vKiB1c2VkIGluIEVSUk9SIG1lc3NhZ2VzLCBwcmludCBpbmZvIG9uIHdoZXJlIHRoZSBpbmNsdWRlIHN0YWNrIGlzIG9udG8gZmlsZS4gKi8KLXN0YXRpYyAKLXZvaWQKLWluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgc3RydWN0IGluY2x1ZGVfc3RhY2sgKnAgPSBpbmNsdWRlX3N0YWNrICsgMTsKLQotICB3aGlsZSAocCA8PSBzcCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXM6JWQgIiwgc2JfbmFtZSAoJnAtPm5hbWUpLCBwLT5saW5lY291bnQgLSAxKTsKLSAgICAgIHArKzsKLSAgICB9Ci19Ci0KLS8qIHVzZWQgaW4gbGlzdGluZ3MsIHByaW50IHRoZSBsaW5lIG51bWJlciBvbnRvIGZpbGUuICovCi1zdGF0aWMgdm9pZAotaW5jbHVkZV9wcmludF9saW5lIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBpbnQgbjsKLSAgc3RydWN0IGluY2x1ZGVfc3RhY2sgKnAgPSBpbmNsdWRlX3N0YWNrICsgMTsKLQotICBuID0gZnByaW50ZiAoZmlsZSwgIiU0ZCIsIHAtPmxpbmVjb3VudCk7Ci0gIHArKzsKLSAgd2hpbGUgKHAgPD0gc3ApCi0gICAgewotICAgICAgbiArPSBmcHJpbnRmIChmaWxlLCAiLiVkIiwgcC0+bGluZWNvdW50KTsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHdoaWxlIChuIDwgOCAqIDMpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiAiKTsKLSAgICAgIG4rKzsKLSAgICB9Ci19Ci0KLQotLyogcmVhZCBhIGxpbmUgZnJvbSB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrIGludG8gc2IgaW4uICovCi0KLXN0YXRpYyBpbnQKLWdldF9saW5lIChpbikKLSAgICAgc2IgKmluOwotewotICBpbnQgb25saW5lID0gMDsKLSAgaW50IG1vcmUgPSAxOwotCi0gIGlmIChjb3B5c291cmNlKQotICAgIHsKLSAgICAgIHB1dGMgKGNvbW1lbnRfY2hhciwgb3V0ZmlsZSk7Ci0gICAgICBpZiAocHJpbnRfbGluZV9udW1iZXIpCi0JaW5jbHVkZV9wcmludF9saW5lIChvdXRmaWxlKTsKLSAgICB9Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IGNoID0gZ2V0ICgpOwotCi0gICAgICB3aGlsZSAoY2ggPT0gJ1xyJykKLQljaCA9IGdldCAoKTsKLQotICAgICAgaWYgKGNoID09IEVPRikKLQl7Ci0JICBpZiAob25saW5lKQotCSAgICB7Ci0JICAgICAgV0FSTklORyAoKHN0ZGVyciwgXygiRW5kIG9mIGZpbGUgbm90IGF0IHN0YXJ0IG9mIGxpbmUuXG4iKSkpOwotCSAgICAgIGlmIChjb3B5c291cmNlKQotCQlwdXRjICgnXG4nLCBvdXRmaWxlKTsKLQkgICAgICBjaCA9ICdcbic7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbW9yZSA9IDA7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChjb3B5c291cmNlKQotCXsKLQkgIHB1dGMgKGNoLCBvdXRmaWxlKTsKLQl9Ci0KLSAgICAgIGlmIChjaCA9PSAnXG4nKQotCXsKLQkgIGNoID0gZ2V0ICgpOwotCSAgb25saW5lID0gMDsKLQkgIGlmIChjaCA9PSAnKycpCi0JICAgIHsKLQkgICAgICAvKiBjb250aW51ZWQgbGluZSAqLwotCSAgICAgIGlmIChjb3B5c291cmNlKQotCQl7Ci0JCSAgcHV0YyAoY29tbWVudF9jaGFyLCBvdXRmaWxlKTsKLQkJICBwdXRjICgnKycsIG91dGZpbGUpOwotCQl9Ci0JICAgICAgY2ggPSBnZXQgKCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChjaCAhPSBFT0YpCi0JCXVuZ2V0IChjaCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2JfYWRkX2NoYXIgKGluLCBjaCk7Ci0JfQotICAgICAgb25saW5lKys7Ci0gICAgfQotCi0gIHJldHVybiBtb3JlOwotfQotCi0vKiBmaW5kIGEgbGFiZWwgZnJvbSBzYiBpbiBhbmQgcHV0IGl0IGluIG91dC4gKi8KLQotc3RhdGljIGludAotZ3JhYl9sYWJlbCAoaW4sIG91dCkKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotewotICBpbnQgaSA9IDA7Ci0gIHNiX3Jlc2V0IChvdXQpOwotICBpZiAoSVNGSVJTVENIQVIgKGluLT5wdHJbaV0pIHx8IGluLT5wdHJbaV0gPT0gJ1xcJykKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2ldKTsKLSAgICAgIGkrKzsKLSAgICAgIHdoaWxlICgoSVNORVhUQ0hBUiAoaW4tPnB0cltpXSkgCi0JICAgICAgfHwgaW4tPnB0cltpXSA9PSAnXFwnCi0JICAgICAgfHwgaW4tPnB0cltpXSA9PSAnJicpIAotCSAgICAgJiYgaSA8IGluLT5sZW4pCi0JewotCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpXSk7Ci0JICBpKys7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGk7Ci19Ci0KLS8qIGZpbmQgYWxsIHN0cmFuZ2UgYmFzZSBzdHVmZiBhbmQgdHVybiBpbnRvIGRlY2ltYWwuIGFsc28KLSAgIGZpbmQgYWxsIHRoZSBvdGhlciBudW1iZXJzIGFuZCBjb252ZXJ0IHRoZW0gZnJvbSB0aGUgZGVmYXVsdCByYWRpeCAqLwotCi1zdGF0aWMgdm9pZAotY2hhbmdlX2Jhc2UgKGlkeCwgaW4sIG91dCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotewotICBjaGFyIGJ1ZmZlclsyMF07Ci0KLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0gICAgewotICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnXFwnCi0JICAmJiBpZHggKyAxIDwgaW4tPmxlbgotCSAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnKCcpCi0JewotCSAgaWR4ICs9IDI7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCQkgJiYgaW4tPnB0cltpZHhdICE9ICcpJykKLQkgICAgewotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4XSk7Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQkgIGlmIChpZHggPCBpbi0+bGVuKQotCSAgICBpZHgrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChpZHggPCBpbi0+bGVuIC0gMSAmJiBpbi0+cHRyW2lkeCArIDFdID09ICdcJycgJiYgISBtcmkpCi0JewotCSAgaW50IGJhc2U7Ci0JICBpbnQgdmFsdWU7Ci0JICBzd2l0Y2ggKGluLT5wdHJbaWR4XSkKLQkgICAgewotCSAgICBjYXNlICdiJzoKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgYmFzZSA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3EnOgotCSAgICBjYXNlICdRJzoKLQkgICAgICBiYXNlID0gODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnaCc6Ci0JICAgIGNhc2UgJ0gnOgotCSAgICAgIGJhc2UgPSAxNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZCc6Ci0JICAgIGNhc2UgJ0QnOgotCSAgICAgIGJhc2UgPSAxMDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiSWxsZWdhbCBiYXNlIGNoYXJhY3RlciAlYy5cbiIpLCBpbi0+cHRyW2lkeF0pKTsKLQkgICAgICBiYXNlID0gMTA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWR4ID0gc2Jfc3RydG9sIChpZHggKyAyLCBpbiwgYmFzZSwgJnZhbHVlKTsKLQkgIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgdmFsdWUpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCX0KLSAgICAgIGVsc2UgaWYgKElTRklSU1RDSEFSIChpbi0+cHRyW2lkeF0pKQotCXsKLQkgIC8qIGNvcHkgZW50aXJlIG5hbWVzIHRocm91Z2ggcXVpY2tseSAqLwotCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgSVNORVhUQ0hBUiAoaW4tPnB0cltpZHhdKSkKLQkgICAgewotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4XSk7Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHhdKSkKLQl7Ci0JICBpbnQgdmFsdWU7Ci0JICAvKiBhbGwgbnVtYmVycyBtdXN0IHN0YXJ0IHdpdGggYSBkaWdpdCwgbGV0J3MgY2hldyBpdCBhbmQKLQkgICAgIHNwaXQgb3V0IGRlY2ltYWwgKi8KLQkgIGlkeCA9IHNiX3N0cnRvbCAoaWR4LCBpbiwgcmFkaXgsICZ2YWx1ZSk7Ci0JICBzcHJpbnRmIChidWZmZXIsICIlZCIsIHZhbHVlKTsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLQotCSAgLyogc2tpcCBhbGwgdW5kaWdzZXN0ZWQgbGV0dGVycyAqLwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgSVNORVhUQ0hBUiAoaW4tPnB0cltpZHhdKSkKLQkgICAgewotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4XSk7Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnKQotCXsKLQkgIGNoYXIgdGNoYXIgPSBpbi0+cHRyW2lkeF07Ci0JICAvKiBjb3B5IGVudGlyZSBuYW1lcyB0aHJvdWdoIHF1aWNrbHkgKi8KLQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4XSk7Ci0JICBpZHgrKzsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkgICAgewotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4XSk7Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbm90aGluZyBzcGVjaWFsLCBqdXN0IHBhc3MgaXQgdGhyb3VnaCAqLwotCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgIGlkeCsrOwotCX0KLSAgICB9Ci0KLX0KLQotLyogLmVuZCAqLwotc3RhdGljIHZvaWQKLWRvX2VuZCAoaW4pCi0gICAgIHNiICppbjsKLXsKLSAgaGFkX2VuZCA9IDE7Ci0gIGlmIChtcmkpCi0gICAgZnByaW50ZiAob3V0ZmlsZSwgIiVzXG4iLCBzYl9uYW1lIChpbikpOwotfQotCi0vKiAuYXNzaWduICovCi0KLXN0YXRpYyB2b2lkCi1kb19hc3NpZ24gKGFnYWluLCBpZHgsIGluKQotICAgICBpbnQgYWdhaW47Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgLyogc3RpY2sgbGFiZWwgaW4gc3ltYm9sIHRhYmxlIHdpdGggZm9sbG93aW5nIHZhbHVlICovCi0gIGV4cF90IGU7Ci0gIHNiIGFjYzsKLQotICBzYl9uZXcgKCZhY2MpOwotICBpZHggPSBleHBfcGFyc2UgKGlkeCwgaW4sICZlKTsKLSAgZXhwX3N0cmluZyAoJmUsICZhY2MpOwotICBoYXNoX2FkZF90b19zdHJpbmdfdGFibGUgKCZhc3NpZ25faGFzaF90YWJsZSwgJmxhYmVsLCAmYWNjLCBhZ2Fpbik7Ci0gIHNiX2tpbGwgKCZhY2MpOwotfQotCi0KLS8qIC5yYWRpeCBbYnxxfGR8aF0gKi8KLQotc3RhdGljCi12b2lkCi1kb19yYWRpeCAocHRyKQotICAgICBzYiAqcHRyOwotewotICBpbnQgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoMCwgcHRyKTsKLSAgc3dpdGNoIChwdHItPnB0cltpZHhdKQotICAgIHsKLSAgICBjYXNlICdCJzoKLSAgICBjYXNlICdiJzoKLSAgICAgIHJhZGl4ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3EnOgotICAgIGNhc2UgJ1EnOgotICAgICAgcmFkaXggPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICByYWRpeCA9IDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaCc6Ci0gICAgY2FzZSAnSCc6Ci0gICAgICByYWRpeCA9IDE2OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJyYWRpeCBpcyAlYyBtdXN0IGJlIG9uZSBvZiBiLCBxLCBkIG9yIGgiKSwgcmFkaXgpKTsKLSAgICB9Ci19Ci0KLQotLyogUGFyc2Ugb2ZmIGEgLmIsIC53IG9yIC5sICovCi0KLXN0YXRpYyBpbnQKLWdldF9vcHNpemUgKGlkeCwgaW4sIHNpemUpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICpzaXplOwotewotICAqc2l6ZSA9IDQ7Ci0gIGlmIChpbi0+cHRyW2lkeF0gPT0gJy4nKQotICAgIHsKLSAgICAgIGlkeCsrOwotICAgIH0KLSAgc3dpdGNoIChpbi0+cHRyW2lkeF0pCi0gICAgewotICAgIGNhc2UgJ2InOgotICAgIGNhc2UgJ0InOgotICAgICAgKnNpemUgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndyc6Ci0gICAgY2FzZSAnVyc6Ci0gICAgICAqc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdMJzoKLSAgICAgICpzaXplID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJyAnOgotICAgIGNhc2UgJ1x0JzoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygic2l6ZSBtdXN0IGJlIG9uZSBvZiBiLCB3IG9yIGwsIGlzICVjLlxuIiksIGluLT5wdHJbaWR4XSkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZHgrKzsKLQotICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgCi1pbnQgZW9sKGlkeCwgbGluZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmxpbmU7Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgbGluZSk7Ci0gIGlmIChpZHggPCBsaW5lLT5sZW4gCi0gICAgICAmJiBJU0NPTU1FTlRDSEFSKGxpbmUtPnB0cltpZHhdKSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKGlkeCA+PSBsaW5lLT5sZW4pCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiAuZGF0YSBbLmJ8Lnd8LmxdIDxkYXRhPiogCi0gICAgb3IgZFtid2xdIDxkYXRhPiogKi8KLQotc3RhdGljIHZvaWQKLWRvX2RhdGEgKGlkeCwgaW4sIHNpemUpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBvcHNpemUgPSA0OwotICBjaGFyICpvcG5hbWUgPSAiLnlpa2VzISI7Ci0gIHNiIGFjYzsKLSAgc2JfbmV3ICgmYWNjKTsKLQotICBpZiAoIXNpemUpIAotICAgIHsKLSAgICAgIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZvcHNpemUpOwotICAgIH0KLSAgZWxzZSB7Ci0gICAgb3BzaXplID0gc2l6ZTsKLSAgfQotICBzd2l0Y2ggKG9wc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgb3BuYW1lID0gIi5sb25nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG9wbmFtZSA9ICIuc2hvcnQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgb3BuYW1lID0gIi5ieXRlIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotCi0gIGZwcmludGYgKG91dGZpbGUsICIlc1x0Iiwgb3BuYW1lKTsKLQotICBpZHggPSAgIHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIGlmIChhbHRlcm5hdGUgCi0gICAgICAmJiBpZHggPCBpbi0+bGVuIAotICAgICAgJiYgaW4tPnB0cltpZHhdID09ICciJykKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmFjYyk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWNjLmxlbjsgaSsrKQotCXsKLQkgIGlmIChpKQotCSAgICBmcHJpbnRmKG91dGZpbGUsIiwiKTsKLQkgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIGFjYy5wdHJbaV0pOwotCX0KLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgd2hpbGUgKCFlb2wgKGlkeCwgaW4pKQotCXsKLQkgIGV4cF90IGU7Ci0JICBpZHggPSBleHBfcGFyc2UgKGlkeCwgaW4sICZlKTsKLQkgIGV4cF9zdHJpbmcgKCZlLCAmYWNjKTsKLQkgIHNiX2FkZF9jaGFyICgmYWNjLCAwKTsKLQkgIGZwcmludGYgKG91dGZpbGUsIGFjYy5wdHIpOwotCSAgaWYgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICcsJykKLQkgICAgewotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIsIik7Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBzYl9raWxsICgmYWNjKTsKLSAgc2JfcHJpbnRfYXQgKG91dGZpbGUsIGlkeCwgaW4pOwotICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLX0KLQotLyogLmRhdGFiIFsuYnwud3wubF0gPHJlcGVhdD4sPGZpbGw+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19kYXRhYiAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgb3BzaXplOwotICBpbnQgcmVwZWF0OwotICBpbnQgZmlsbDsKLQotICBpZHggPSBnZXRfb3BzaXplIChpZHgsIGluLCAmb3BzaXplKTsKLQotICBpZHggPSBleHBfZ2V0X2FicyAoXygiZGF0YWIgcmVwZWF0IG11c3QgYmUgY29uc3RhbnQuXG4iKSwgaWR4LCBpbiwgJnJlcGVhdCk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygiZGF0YWIgZGF0YSBtdXN0IGJlIGFic29sdXRlLlxuIiksIGlkeCwgaW4sICZmaWxsKTsKLQotICBmcHJpbnRmIChvdXRmaWxlLCAiLmZpbGxcdCVkLCVkLCVkXG4iLCByZXBlYXQsIG9wc2l6ZSwgZmlsbCk7Ci19Ci0KLS8qIC5hbGlnbiA8c2l6ZT4gKi8KLQotc3RhdGljIHZvaWQKLWRvX2FsaWduIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBhbCwgaGF2ZV9maWxsLCBmaWxsOwotCi0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJhbGlnbiBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uLlxuIiksIGlkeCwgaW4sICZhbCk7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBoYXZlX2ZpbGwgPSAwOwotICBmaWxsID0gMDsKLSAgaWYgKCEgZW9sIChpZHgsIGluKSkKLSAgICB7Ci0gICAgICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCIuYWxpZ24gbmVlZHMgYWJzb2x1dGUgZmlsbCB2YWx1ZS5cbiIpLCBpZHgsIGluLAotCQkJICZmaWxsKTsKLSAgICAgIGhhdmVfZmlsbCA9IDE7Ci0gICAgfQotCi0gIGlmIChhbCAhPSAxCi0gICAgICAmJiBhbCAhPSAyCi0gICAgICAmJiBhbCAhPSA0KQotICAgIFdBUk5JTkcgKChzdGRlcnIsIF8oImFsaWdubWVudCBtdXN0IGJlIG9uZSBvZiAxLCAyIG9yIDQuXG4iKSkpOwotCi0gIGZwcmludGYgKG91dGZpbGUsICIuYWxpZ24JJWQiLCBhbCk7Ci0gIGlmIChoYXZlX2ZpbGwpCi0gICAgZnByaW50ZiAob3V0ZmlsZSwgIiwlZCIsIGZpbGwpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLX0KLQotLyogLnJlc1suYnwud3wubF0gPHNpemU+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19yZXMgKGlkeCwgaW4sIHR5cGUpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGludCBzaXplID0gNDsKLSAgaW50IGNvdW50ID0gMDsKLQotICBpZHggPSBnZXRfb3BzaXplIChpZHgsIGluLCAmc2l6ZSk7Ci0gIHdoaWxlICghZW9sKGlkeCwgaW4pKQotICAgIHsKLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnLCcpCi0JaWR4Kys7Ci0gICAgICBpZHggPSBleHBfZ2V0X2FicyAoXygicmVzIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24gZm9yIGZpbGwgY291bnQuXG4iKSwgaWR4LCBpbiwgJmNvdW50KTsKLQotICAgICAgaWYgKHR5cGUgPT0gJ2MnIHx8IHR5cGUgPT0gJ3onKQotCWNvdW50Kys7Ci0KLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIuc3BhY2UJJWRcbiIsIGNvdW50ICogc2l6ZSk7Ci0gICAgfQotfQotCi0KLS8qIC5leHBvcnQgKi8KLQotc3RhdGljIHZvaWQKLWRvX2V4cG9ydCAoaW4pCi0gICAgIHNiICppbjsKLXsKLSAgZnByaW50ZiAob3V0ZmlsZSwgIi5nbG9iYWwJJXNcbiIsIHNiX25hbWUgKGluKSk7Ci19Ci0KLS8qIC5wcmludCBbbGlzdF0gW25vbGlzdF0gKi8KLQotc3RhdGljIHZvaWQKLWRvX3ByaW50IChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGluLT5wdHIgKyBpZHgsICJMSVNUIiwgNCkgPT0gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiLmxpc3RcbiIpOwotCSAgaWR4ICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGluLT5wdHIgKyBpZHgsICJOT0xJU1QiLCA2KSA9PSAwKQotCXsKLQkgIGZwcmludGYgKG91dGZpbGUsICIubm9saXN0XG4iKTsKLQkgIGlkeCArPSA2OwotCX0KLSAgICAgIGlkeCsrOwotICAgIH0KLX0KLQotLyogLmhlYWQgKi8KLXN0YXRpYyB2b2lkCi1kb19oZWFkaW5nIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIHNiIGhlYWQ7Ci0gIHNiX25ldyAoJmhlYWQpOwotICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZoZWFkKTsKLSAgZnByaW50ZiAob3V0ZmlsZSwgIi50aXRsZQlcIiVzXCJcbiIsIHNiX25hbWUgKCZoZWFkKSk7Ci0gIHNiX2tpbGwgKCZoZWFkKTsKLX0KLQotLyogLnBhZ2UgKi8KLQotc3RhdGljIHZvaWQKLWRvX3BhZ2UgKCkKLXsKLSAgZnByaW50ZiAob3V0ZmlsZSwgIi5lamVjdFxuIik7Ci19Ci0KLS8qIC5mb3JtIFtsaW49PHZhbHVlPl0gW2NvbD08dmFsdWU+XSAqLwotc3RhdGljIHZvaWQKLWRvX2Zvcm0gKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IGxpbmVzID0gNjA7Ci0gIGludCBjb2x1bW5zID0gMTMyOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0KLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIkxJTj0iLCA0KSA9PSAwKQotCXsKLQkgIGlkeCArPSA0OwotCSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oImZvcm0gTElOPSBuZWVkcyBhYnNvbHV0ZSBleHByZXNzc2lvbi5cbiIpLCBpZHgsIGluLCAmbGluZXMpOwotCX0KLQotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbi0+cHRyICsgaWR4LCBfKCJDT0w9IiksIDQpID09IDApCi0JewotCSAgaWR4ICs9IDQ7Ci0JICBpZHggPSBleHBfZ2V0X2FicyAoXygiZm9ybSBDT0w9IG5lZWRzIGFic29sdXRlIGV4cHJlc3NzaW9uLlxuIiksIGlkeCwgaW4sICZjb2x1bW5zKTsKLQl9Ci0KLSAgICAgIGlkeCsrOwotICAgIH0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIi5wc2l6ZSAlZCwlZFxuIiwgbGluZXMsIGNvbHVtbnMpOwotCi19Ci0KLQotLyogRmV0Y2ggc3RyaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbSwKLSAgIHJ1bGVzOgotICAgICdCeHl4PHdoaXRlc3BhY2U+ICAJLT4gcmV0dXJuICdCeHl6YQotICAgICU8Y2hhcj4JCS0+IHJldHVybiBzdHJpbmcgb2YgZGVjaW1hbCB2YWx1ZSBvZiB4Ci0gICAgIjxzdHJpbmc+IgkJLT4gcmV0dXJuIHN0cmluZwotICAgIHh5eDx3aGl0ZXNwYWNlPiAgICAgLT4gcmV0dXJuIHh5egotKi8KLXN0YXRpYyBpbnQKLWdldF9hbnlfc3RyaW5nIChpZHgsIGluLCBvdXQsIGV4cGFuZCwgcHJldGVuZF9xdW90ZWQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLSAgICAgaW50IGV4cGFuZDsKLSAgICAgaW50IHByZXRlbmRfcXVvdGVkOwotewotICBzYl9yZXNldCAob3V0KTsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgaWYgKGlkeCA8IGluLT5sZW4pCi0gICAgewotICAgICAgaWYgKGluLT5sZW4gPiAyICYmIGluLT5wdHJbaWR4KzFdID09ICdcJycgJiYgSVNCQVNFIChpbi0+cHRyW2lkeF0pKQotCXsKLQkgIHdoaWxlICghSVNTRVAgKGluLT5wdHJbaWR4XSkpCi0JICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyUnCi0JICAgICAgICYmIGFsdGVybmF0ZQotCSAgICAgICAmJiBleHBhbmQpCi0JewotCSAgaW50IHZhbDsKLQkgIGNoYXIgYnVmWzIwXTsKLQkgIC8qIFR1cm5zIHRoZSBuZXh0IGV4cHJlc3Npb24gaW50byBhIHN0cmluZyAqLwotCSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIiUgb3BlcmF0b3IgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiIpLAotCQkJICAgICBpZHggKyAxLAotCQkJICAgICBpbiwKLQkJCSAgICAgJnZhbCk7Ci0JICBzcHJpbnRmKGJ1ZiwgIiVkIiwgdmFsKTsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInCi0JICAgICAgIHx8IGluLT5wdHJbaWR4XSA9PSAnPCcKLQkgICAgICAgfHwgKGFsdGVybmF0ZSAmJiBpbi0+cHRyW2lkeF0gPT0gJ1wnJykpCi0JewotCSAgaWYgKGFsdGVybmF0ZSAmJiBleHBhbmQpCi0JICAgIHsKLQkgICAgICAvKiBLZWVwIHRoZSBxdW90ZXMgKi8KLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAgJ1wiJyk7Ci0JCSAgICAKLQkgICAgICBpZHggPSAgZ2V0c3RyaW5nIChpZHgsIGluLCBvdXQpOwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICAnXCInKTsKLQotCSAgICB9Ci0JICBlbHNlIHsKLQkgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCBvdXQpOwotCSAgfQotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gCi0JCSAmJiAoaW4tPnB0cltpZHhdID09ICciJwotCQkgICAgIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnCi0JCSAgICAgfHwgcHJldGVuZF9xdW90ZWQgCi0JCSAgICAgfHwgIUlTU0VQIChpbi0+cHRyW2lkeF0pKSkKLQkgICAgewotCSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInIAotCQkgIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnKQotCQl7Ci0JCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkJCSAmJiBpbi0+cHRyW2lkeF0gIT0gdGNoYXIpCi0JCSAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7CQkgICAgCi0JCSAgaWYgKGlkeCA9PSBpbi0+bGVuKQotCQkgICAgcmV0dXJuIGlkeDsJICAgICAgCi0JCX0KLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBpZHg7Ci19Ci0KLQotLyogc2tpcCBhbG9uZyBzYiBpbiBzdGFydGluZyBhdCBpZHgsIHN1Y2sgb2ZmIHdoaXRlc3BhY2UgYSAoIGFuZCBtb3JlCi0gICB3aGl0ZXNwYWNlLiAgcmV0dXJuIHRoZSBpZHggb2YgdGhlIG5leHQgY2hhciAqLwotCi1zdGF0aWMgaW50Ci1za2lwX29wZW5wIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBpZiAoaW4tPnB0cltpZHhdICE9ICcoJykKLSAgICBFUlJPUiAoKHN0ZGVyciwgXygibWlzcGxhY2VkICggLlxuIikpKTsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4ICsgMSwgaW4pOwotICByZXR1cm4gaWR4OwotfQotCi0vKiBza2lwIGFsb25nIHNiIGluIHN0YXJ0aW5nIGF0IGlkeCwgc3VjayBvZmYgd2hpdGVzcGFjZSBhICkgYW5kIG1vcmUKLSAgIHdoaXRlc3BhY2UuICByZXR1cm4gdGhlIGlkeCBvZiB0aGUgbmV4dCBjaGFyICovCi0KLXN0YXRpYyBpbnQKLXNraXBfY2xvc2VwIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBpZiAoaW4tPnB0cltpZHhdICE9ICcpJykKLSAgICBFUlJPUiAoKHN0ZGVyciwgXygibWlzcGxhY2VkICkuXG4iKSkpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAxLCBpbik7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIC5sZW4gKi8KLQotc3RhdGljIGludAotZG9sZW4gKGlkeCwgaW4sIG91dCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotewotCi0gIHNiIHN0cmluZ291dDsKLSAgY2hhciBidWZmZXJbMTBdOwotCi0gIHNiX25ldyAoJnN0cmluZ291dCk7Ci0gIGlkeCA9IHNraXBfb3BlbnAgKGlkeCwgaW4pOwotICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzdHJpbmdvdXQpOwotICBpZHggPSBza2lwX2Nsb3NlcCAoaWR4LCBpbik7Ci0gIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgc3RyaW5nb3V0Lmxlbik7Ci0gIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLQotICBzYl9raWxsICgmc3RyaW5nb3V0KTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotCi0vKiAuaW5zdHIgKi8KLQotc3RhdGljCi1pbnQKLWRvaW5zdHIgKGlkeCwgaW4sIG91dCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotewotICBzYiBzdHJpbmc7Ci0gIHNiIHNlYXJjaDsKLSAgaW50IGk7Ci0gIGludCBzdGFydDsKLSAgaW50IHJlczsKLSAgY2hhciBidWZmZXJbMTBdOwotCi0gIHNiX25ldyAoJnN0cmluZyk7Ci0gIHNiX25ldyAoJnNlYXJjaCk7Ci0gIGlkeCA9IHNraXBfb3BlbnAgKGlkeCwgaW4pOwotICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzdHJpbmcpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWR4ID0gZ2V0X2FuZF9wcm9jZXNzIChpZHgsIGluLCAmc2VhcmNoKTsKLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHhdKSkKLSAgICB7Ci0gICAgICBpZHggPSBleHBfZ2V0X2FicyAoXygiLmluc3RyIG5lZWRzIGFic29sdXRlIGV4cHJlc3Nvbi5cbiIpLCBpZHgsIGluLCAmc3RhcnQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YXJ0ID0gMDsKLSAgICB9Ci0gIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKLSAgcmVzID0gLTE7Ci0gIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RyaW5nLmxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChzdHJpbmcucHRyICsgaSwgc2VhcmNoLnB0ciwgc2VhcmNoLmxlbikgPT0gMCkKLQl7Ci0JICByZXMgPSBpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCByZXMpOwotICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1ZmZlcik7Ci0gIHNiX2tpbGwgKCZzdHJpbmcpOwotICBzYl9raWxsICgmc2VhcmNoKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotCi1zdGF0aWMgaW50Ci1kb3N1YnN0ciAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIHNiIHN0cmluZzsKLSAgaW50IHBvczsKLSAgaW50IGxlbjsKLSAgc2JfbmV3ICgmc3RyaW5nKTsKLQotICBpZHggPSBza2lwX29wZW5wIChpZHgsIGluKTsKLSAgaWR4ID0gZ2V0X2FuZF9wcm9jZXNzIChpZHgsIGluLCAmc3RyaW5nKTsKLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJuZWVkIGFic29sdXRlIHBvc2l0aW9uLlxuIiksIGlkeCwgaW4sICZwb3MpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIm5lZWQgYWJzb2x1dGUgbGVuZ3RoLlxuIiksIGlkeCwgaW4sICZsZW4pOwotICBpZHggPSBza2lwX2Nsb3NlcCAoaWR4LCBpbik7Ci0KLQotICBpZiAobGVuIDwgMCB8fCBwb3MgPCAwIHx8Ci0gICAgICBwb3MgPiBzdHJpbmcubGVuCi0gICAgICB8fCBwb3MgKyBsZW4gPiBzdHJpbmcubGVuKQotICAgIHsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKG91dCwgIiAiKTsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyInKTsKLSAgICAgIHdoaWxlIChsZW4gPiAwKQotCXsKLQkgIHNiX2FkZF9jaGFyIChvdXQsIHN0cmluZy5wdHJbcG9zKytdKTsKLQkgIGxlbi0tOwotCX0KLSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICciJyk7Ci0gICAgfQotICBzYl9raWxsKCZzdHJpbmcpOwotICByZXR1cm4gaWR4OwotfQotCi0vKiBzY2FuIGxpbmUsIGNoYW5nZSB0b2tlbnMgaW4gdGhlIGhhc2ggdGFibGUgdG8gdGhlaXIgcmVwbGFjZW1lbnRzICovCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCBidWYpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKmJ1ZjsKLXsKLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0gICAgewotICAgICAgaGFzaF9lbnRyeSAqcHRyOwotICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnXFwnCi0JICAmJiBpZHggKyAxIDwgaW4tPmxlbgotCSAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnKCcpCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIHNiX2FkZF9jaGFyIChidWYsIGluLT5wdHJbaWR4XSk7Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4IC0gMV0gIT0gJyknKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJ1xcJwotCSAgJiYgaWR4ICsgMSA8IGluLT5sZW4KLQkgICYmIGluLT5wdHJbaWR4ICsgMV0gPT0gJyYnKQotCXsKLQkgIGlkeCA9IGNvbmRhc3NfbG9va3VwX25hbWUgKGluLCBpZHggKyAyLCBidWYsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnXFwnCi0JICAgICAgICYmIGlkeCArIDEgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbaWR4ICsgMV0gPT0gJyQnKQotCXsKLQkgIGlkeCA9IGNvbmRhc3NfbG9va3VwX25hbWUgKGluLCBpZHggKyAyLCBidWYsIDApOwotCX0KLSAgICAgIGVsc2UgaWYgKGlkeCArIDMgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnLicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMV0pID09ICdMJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAyXSkgPT0gJ0UnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDNdKSA9PSAnTicpCi0JaWR4ID0gZG9sZW4gKGlkeCArIDQsIGluLCBidWYpOwotICAgICAgZWxzZSBpZiAoaWR4ICsgNiA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltpZHhdID09ICcuJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAxXSkgPT0gJ0knCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDJdKSA9PSAnTicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgM10pID09ICdTJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyA0XSkgPT0gJ1QnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDVdKSA9PSAnUicpCi0JaWR4ID0gZG9pbnN0ciAoaWR4ICsgNiwgaW4sIGJ1Zik7Ci0gICAgICBlbHNlIGlmIChpZHggKyA3IDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDFdKSA9PSAnUycKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMl0pID09ICdVJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAzXSkgPT0gJ0InCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDRdKSA9PSAnUycKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNV0pID09ICdUJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyA2XSkgPT0gJ1InKQotCWlkeCA9IGRvc3Vic3RyIChpZHggKyA3LCBpbiwgYnVmKTsKLSAgICAgIGVsc2UgaWYgKElTRklSU1RDSEFSIChpbi0+cHRyW2lkeF0pKQotCXsKLQkgIC8qIG1heSBiZSBhIHNpbXBsZSBuYW1lIHN1YnNpdHV0aW9uLCBzZWUgaWYgd2UgaGF2ZSBhIHdvcmQgKi8KLQkgIHNiIGFjYzsKLQkgIGludCBjdXIgPSBpZHggKyAxOwotCSAgd2hpbGUgKGN1ciA8IGluLT5sZW4KLQkJICYmIChJU05FWFRDSEFSIChpbi0+cHRyW2N1cl0pKSkKLQkgICAgY3VyKys7Ci0KLQkgIHNiX25ldyAoJmFjYyk7Ci0JICBzYl9hZGRfYnVmZmVyICgmYWNjLCBpbi0+cHRyICsgaWR4LCBjdXIgLSBpZHgpOwotCSAgcHRyID0gaGFzaF9sb29rdXAgKCZhc3NpZ25faGFzaF90YWJsZSwgJmFjYyk7Ci0JICBpZiAocHRyKQotCSAgICB7Ci0JICAgICAgLyogRm91bmQgYSBkZWZpbml0aW9uIGZvciBpdCAqLwotCSAgICAgIHNiX2FkZF9zYiAoYnVmLCAmcHRyLT52YWx1ZS5zKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm8gZGVmaW5pdGlvbiwganVzdCBjb3B5IHRoZSB3b3JkICovCi0JICAgICAgc2JfYWRkX3NiIChidWYsICZhY2MpOwotCSAgICB9Ci0JICBzYl9raWxsICgmYWNjKTsKLQkgIGlkeCA9IGN1cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2JfYWRkX2NoYXIgKGJ1ZiwgaW4tPnB0cltpZHgrK10pOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIHNiIHQ7Ci0gIHNiX25ldyAoJnQpOwotICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJnQsIDEsIDApOwotICBwcm9jZXNzX2Fzc2lnbnMgKDAsICZ0LCBvdXQpOwotICBzYl9raWxsICgmdCk7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYwotdm9pZAotcHJvY2Vzc19maWxlICgpCi17Ci0gIHNiIGxpbmU7Ci0gIHNiIHQxLCB0MjsKLSAgc2IgYWNjOwotICBzYiBsYWJlbF9pbjsKLSAgaW50IG1vcmU7Ci0KLSAgc2JfbmV3ICgmbGluZSk7Ci0gIHNiX25ldyAoJnQxKTsKLSAgc2JfbmV3ICgmdDIpOwotICBzYl9uZXcoJmFjYyk7Ci0gIHNiX25ldyAoJmxhYmVsX2luKTsKLSAgc2JfcmVzZXQgKCZsaW5lKTsKLSAgbW9yZSA9IGdldF9saW5lICgmbGluZSk7Ci0gIHdoaWxlIChtb3JlKQotICAgIHsKLSAgICAgIC8qIEZpbmQgYW55IGxhYmVsIGFuZCBwc2V1ZG8gb3AgdGhhdCB3ZSdyZSBpbnRlc3RlZCBpbiAqLwotICAgICAgaW50IGw7Ci0gICAgICBpZiAobGluZS5sZW4gPT0gMCkKLQl7Ci0JICBpZiAoY29uZGFzc19vbiAoKSkKLQkgICAgZnByaW50ZiAob3V0ZmlsZSwgIlxuIik7Ci0JfQotICAgICAgZWxzZSBpZiAobXJpCi0JICAgICAgICYmIChsaW5lLnB0clswXSA9PSAnKicKLQkJICAgfHwgbGluZS5wdHJbMF0gPT0gJyEnKSkKLQl7Ci0JICAvKiBNUkkgbGluZSBjb21tZW50LiAgKi8KLQkgIGZwcmludGYgKG91dGZpbGUsIHNiX25hbWUgKCZsaW5lKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGwgPSBncmFiX2xhYmVsICgmbGluZSwgJmxhYmVsX2luKTsKLQkgIHNiX3Jlc2V0ICgmbGFiZWwpOwkgIAkgIAotCi0JICBpZiAobGluZS5wdHJbbF0gPT0gJzonKQotCSAgICBsKys7Ci0JICB3aGlsZSAoSVNXSElURSAobGluZS5wdHJbbF0pICYmIGwgPCBsaW5lLmxlbikKLQkgICAgbCsrOwotCi0JICBpZiAobGFiZWxfaW4ubGVuKQotCSAgICB7Ci0JICAgICAgaW50IGRvX2Fzc2lnbnM7Ci0KLQkgICAgICAvKiBNdW5nZSB0aGUgbGFiZWwsIHVubGVzcyB0aGlzIGlzIEVRVSBvciBBU1NJR04uICAqLwotCSAgICAgIGRvX2Fzc2lnbnMgPSAxOwotCSAgICAgIGlmIChsIDwgbGluZS5sZW4KLQkJICAmJiAobGluZS5wdHJbbF0gPT0gJy4nIHx8IGFsdGVybmF0ZSB8fCBtcmkpKQotCQl7Ci0JCSAgaW50IGx4ID0gbDsKLQotCQkgIGlmIChsaW5lLnB0cltseF0gPT0gJy4nKQotCQkgICAgKytseDsKLQkJICBpZiAobHggKyAzIDw9IGxpbmUubGVuCi0JCSAgICAgICYmIHN0cm5jYXNlY21wICgiRVFVIiwgbGluZS5wdHIgKyBseCwgMykgPT0gMAotCQkgICAgICAmJiAobHggKyAzID09IGxpbmUubGVuCi0JCQkgIHx8ICEgSVNGSVJTVENIQVIgKGxpbmUucHRyW2x4ICsgM10pKSkKLQkJICAgIGRvX2Fzc2lnbnMgPSAwOwotCQkgIGVsc2UgaWYgKGx4ICsgNiA8PSBsaW5lLmxlbgotCQkJICAgJiYgc3RybmNhc2VjbXAgKCJBU1NJR04iLCBsaW5lLnB0ciArIGx4LCA2KSA9PSAwCi0JCQkgICAmJiAobHggKyA2ID09IGxpbmUubGVuCi0JCQkgICAgICAgfHwgISBJU0ZJUlNUQ0hBUiAobGluZS5wdHJbbHggKyA2XSkpKQotCQkgICAgZG9fYXNzaWducyA9IDA7Ci0JCX0KLQotCSAgICAgIGlmIChkb19hc3NpZ25zKQotCQlwcm9jZXNzX2Fzc2lnbnMgKDAsICZsYWJlbF9pbiwgJmxhYmVsKTsKLQkgICAgICBlbHNlCi0JCXNiX2FkZF9zYiAoJmxhYmVsLCAmbGFiZWxfaW4pOwotCSAgICB9Ci0KLQkgIGlmIChsIDwgbGluZS5sZW4pCi0JICAgIHsKLQkgICAgICBpZiAocHJvY2Vzc19wc2V1ZG9fb3AgKGwsICZsaW5lLCAmYWNjKSkKLQkJewotCi0KLQotCQl9Ci0JICAgICAgZWxzZSBpZiAoY29uZGFzc19vbiAoKSkKLQkJewotCQkgIGlmIChtYWNyb19vcCAobCwgJmxpbmUpKQotCQkgICAgewotCi0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHsKLQkJCWlmIChsYWJlbC5sZW4pCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiJXM6XHQiLCBzYl9uYW1lICgmbGFiZWwpKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBmcHJpbnRmIChvdXRmaWxlLCAiXHQiKTsKLQkJCXNiX3Jlc2V0KCZ0MSk7Ci0JCQlwcm9jZXNzX2Fzc2lnbnMgKGwsICZsaW5lLCAmdDEpOwotCQkJc2JfcmVzZXQgKCZ0Mik7Ci0JCQljaGFuZ2VfYmFzZSAoMCwgJnQxLCAmdDIpOwotCQkJZnByaW50ZiAob3V0ZmlsZSwgIiVzXG4iLCBzYl9uYW1lICgmdDIpKTsKLQkJICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UgewotCSAgICAvKiBPbmx5IGEgbGFiZWwgb24gdGhpcyBsaW5lICovCi0JICAgIGlmIChsYWJlbC5sZW4gJiYgY29uZGFzc19vbigpKQotCSAgICAgIHsKLQkJZnByaW50ZiAob3V0ZmlsZSwgIiVzOlxuIiwgc2JfbmFtZSAoJmxhYmVsKSk7Ci0JICAgICAgfQotCSAgfQotCX0KLQotICAgICAgaWYgKGhhZF9lbmQpCi0JYnJlYWs7Ci0gICAgICBzYl9yZXNldCAoJmxpbmUpOwotICAgICAgbW9yZSA9IGdldF9saW5lICgmbGluZSk7Ci0gICAgfQotCi0gIGlmICghaGFkX2VuZCAmJiAhbXJpKQotICAgIFdBUk5JTkcgKChzdGRlcnIsIF8oIkVORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuXG4iKSkpOwotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkCi1mcmVlX29sZF9lbnRyeSAocHRyKQotICAgICBoYXNoX2VudHJ5ICpwdHI7Ci17Ci0gIGlmIChwdHIpCi0gICAgewotICAgICAgaWYgKHB0ci0+dHlwZSA9PSBoYXNoX3N0cmluZykKLQlzYl9raWxsKCZwdHItPnZhbHVlLnMpOwotICAgIH0KLX0KLQotLyogbmFtZTogLkFTU0lHTkEgPHZhbHVlPiAqLwotCi1zdGF0aWMgdm9pZAotZG9fYXNzaWduYSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBzYiB0bXA7Ci0gIGludCB2YWw7Ci0gIHNiX25ldyAoJnRtcCk7Ci0KLSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmdG1wKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIi5BU1NJR05BIG5lZWRzIGNvbnN0YW50IGV4cHJlc3Npb24gYXJndW1lbnQuXG4iKSwgMCwgJnRtcCwgJnZhbCk7Ci0KLSAgaWYgKCFsYWJlbC5sZW4pCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oIi5BU1NJR05BIHdpdGhvdXQgbGFiZWwuXG4iKSkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhhc2hfZW50cnkgKnB0ciA9IGhhc2hfY3JlYXRlICgmdmFycywgJmxhYmVsKTsKLSAgICAgIGZyZWVfb2xkX2VudHJ5IChwdHIpOwotICAgICAgcHRyLT50eXBlID0gaGFzaF9pbnRlZ2VyOwotICAgICAgcHRyLT52YWx1ZS5pID0gdmFsOwotICAgIH0KLSAgc2Jfa2lsbCAoJnRtcCk7Ci19Ci0KLS8qIG5hbWU6IC5BU1NJR05DIDxzdHJpbmc+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19hc3NpZ25jIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIHNiIGFjYzsKLSAgc2JfbmV3ICgmYWNjKTsKLSAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjKTsKLQotICBpZiAoIWxhYmVsLmxlbikKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiLkFTU0lHTlMgd2l0aG91dCBsYWJlbC5cbiIpKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGFzaF9lbnRyeSAqcHRyID0gaGFzaF9jcmVhdGUgKCZ2YXJzLCAmbGFiZWwpOwotICAgICAgZnJlZV9vbGRfZW50cnkgKHB0cik7Ci0gICAgICBwdHItPnR5cGUgPSBoYXNoX3N0cmluZzsKLSAgICAgIHNiX25ldyAoJnB0ci0+dmFsdWUucyk7Ci0gICAgICBzYl9hZGRfc2IgKCZwdHItPnZhbHVlLnMsICZhY2MpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmFjYyk7Ci19Ci0KLQotLyogbmFtZTogLlJFRyAocmVnKSAqLwotCi1zdGF0aWMgdm9pZAotZG9fcmVnIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIC8qIHJlbW92ZSByZWcgc3R1ZmYgZnJvbSBpbnNpZGUgcGFyZW5zICovCi0gIHNiIHdoYXQ7Ci0gIGlmICghbXJpKQotICAgIGlkeCA9IHNraXBfb3BlbnAgKGlkeCwgaW4pOwotICBlbHNlCi0gICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIHNiX25ldyAoJndoYXQpOwotICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAmJiAobXJpCi0JICAgICA/ICEgZW9sIChpZHgsIGluKQotCSAgICAgOiBpbi0+cHRyW2lkeF0gIT0gJyknKSkKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAoJndoYXQsIGluLT5wdHJbaWR4XSk7Ci0gICAgICBpZHgrKzsKLSAgICB9Ci0gIGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSAoJmFzc2lnbl9oYXNoX3RhYmxlLCAmbGFiZWwsICZ3aGF0LCAxKTsKLSAgc2Jfa2lsbCAoJndoYXQpOwotfQotCi0KLXN0YXRpYyBpbnQKLWNvbmRhc3NfbG9va3VwX25hbWUgKGluYnVmLCBpZHgsIG91dCwgd2FybikKLSAgICAgc2IgKmluYnVmOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqb3V0OwotICAgICBpbnQgd2FybjsKLXsKLSAgaGFzaF9lbnRyeSAqcHRyOwotICBzYiBjb25kYXNzX2FjYzsKLSAgc2JfbmV3ICgmY29uZGFzc19hY2MpOwotCi0gIHdoaWxlIChpZHggPCBpbmJ1Zi0+bGVuCi0JICYmIElTTkVYVENIQVIgKGluYnVmLT5wdHJbaWR4XSkpCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKCZjb25kYXNzX2FjYywgaW5idWYtPnB0cltpZHgrK10pOwotICAgIH0KLQotICBpZiAoaW5idWYtPnB0cltpZHhdID09ICdcJycpCi0gICAgaWR4Kys7Ci0gIHB0ciA9IGhhc2hfbG9va3VwICgmdmFycywgJmNvbmRhc3NfYWNjKTsKLQotCi0gIGlmICghcHRyKQotICAgIHsKLSAgICAgIGlmICh3YXJuKSAKLQl7Ci0JICBXQVJOSU5HICgoc3RkZXJyLCBfKCJDYW4ndCBmaW5kIHByZXByb2Nlc3NvciB2YXJpYWJsZSAlcy5cbiIpLCBzYl9uYW1lICgmY29uZGFzc19hY2MpKSk7Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICBzYl9hZGRfc3RyaW5nIChvdXQsICIwIik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwdHItPnR5cGUgPT0gaGFzaF9pbnRlZ2VyKQotCXsKLQkgIGNoYXIgYnVmZmVyWzMwXTsKLQkgIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgcHRyLT52YWx1ZS5pKTsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2JfYWRkX3NiIChvdXQsICZwdHItPnZhbHVlLnMpOwotCX0KLSAgICB9Ci0gIHNiX2tpbGwgKCZjb25kYXNzX2FjYyk7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLSNkZWZpbmUgRVEgMQotI2RlZmluZSBORSAyCi0jZGVmaW5lIEdFIDMKLSNkZWZpbmUgTFQgNAotI2RlZmluZSBMRSA1Ci0jZGVmaW5lIEdUIDYKLSNkZWZpbmUgTkVWRVIgNwotCi1zdGF0aWMgaW50Ci13aGF0Y29uZCAoaWR4LCBpbiwgdmFsKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCAqdmFsOwotewotICBpbnQgY29uZDsKLQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgY29uZCA9IE5FVkVSOwotICBpZiAoaWR4ICsgMSA8IGluLT5sZW4pCi0gICAgewotICAgICAgY2hhciAqcDsKLSAgICAgIGNoYXIgYSwgYjsKLQotICAgICAgcCA9IGluLT5wdHIgKyBpZHg7Ci0gICAgICBhID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIHBbMF0pOwotICAgICAgYiA9IHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBwWzFdKTsKLSAgICAgIGlmIChhID09ICdFJyAmJiBiID09ICdRJykKLQljb25kID0gRVE7Ci0gICAgICBlbHNlIGlmIChhID09ICdOJyAmJiBiID09ICdFJykKLQljb25kID0gTkU7Ci0gICAgICBlbHNlIGlmIChhID09ICdMJyAmJiBiID09ICdUJykKLQljb25kID0gTFQ7Ci0gICAgICBlbHNlIGlmIChhID09ICdMJyAmJiBiID09ICdFJykKLQljb25kID0gTEU7Ci0gICAgICBlbHNlIGlmIChhID09ICdHJyAmJiBiID09ICdUJykKLQljb25kID0gR1Q7Ci0gICAgICBlbHNlIGlmIChhID09ICdHJyAmJiBiID09ICdFJykKLQljb25kID0gR0U7Ci0gICAgfQotICBpZiAoY29uZCA9PSBORVZFUikKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQ29tcGFyaXNvbiBvcGVyYXRvciBtdXN0IGJlIG9uZSBvZiBFUSwgTkUsIExULCBMRSwgR1Qgb3IgR0UuXG4iKSkpOwotICAgICAgY29uZCA9IE5FVkVSOwotICAgIH0KLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4ICsgMiwgaW4pOwotICAqdmFsID0gY29uZDsKLSAgcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIGludAotaXN0cnVlIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCByZXM7Ci0gIHNiIGFjY19hOwotICBzYiBjb25kOwotICBzYiBhY2NfYjsKLSAgc2JfbmV3ICgmYWNjX2EpOwotICBzYl9uZXcgKCZjb25kKTsKLSAgc2JfbmV3ICgmYWNjX2IpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBpZiAoaW4tPnB0cltpZHhdID09ICciJykKLSAgICB7Ci0gICAgICBpbnQgY29uZDsKLSAgICAgIGludCBzYW1lOwotICAgICAgLyogVGhpcyBpcyBhIHN0cmluZyBjb21wYXJpc2lvbiAqLwotICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjX2EpOwotICAgICAgaWR4ID0gd2hhdGNvbmQgKGlkeCwgaW4sICZjb25kKTsKLSAgICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmFjY19iKTsKLSAgICAgIHNhbWUgPSBhY2NfYS5sZW4gPT0gYWNjX2IubGVuICYmIChzdHJuY21wIChhY2NfYS5wdHIsIGFjY19iLnB0ciwgYWNjX2EubGVuKSA9PSAwKTsKLQotICAgICAgaWYgKGNvbmQgIT0gRVEgJiYgY29uZCAhPSBORSkKLQl7Ci0JICBFUlJPUiAoKHN0ZGVyciwgXygiQ29tcGFyaXNvbiBvcGVyYXRvciBmb3Igc3RyaW5ncyBtdXN0IGJlIEVRIG9yIE5FXG4iKSkpOwotCSAgcmVzID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JcmVzID0gKGNvbmQgIT0gRVEpIF4gc2FtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBUaGlzIGlzIGEgbnVtZXJpYyBleHByZXNzaW9uICovCi0gICAgewotICAgICAgaW50IHZhbGE7Ci0gICAgICBpbnQgdmFsYjsKLSAgICAgIGludCBjb25kOwotICAgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNvbmRpdGlvbmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kcy5cbiIpLCBpZHgsIGluLCAmdmFsYSk7Ci0gICAgICBpZHggPSB3aGF0Y29uZCAoaWR4LCBpbiwgJmNvbmQpOwotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICciJykKLQl7Ci0JICBXQVJOSU5HICgoc3RkZXJyLCBfKCJTdHJpbmcgY29tcGFyZWQgYWdhaW5zdCBleHByZXNzaW9uLlxuIikpKTsKLQkgIHJlcyA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJDb25kaXRpb25hbCBvcGVyYXRvciBtdXN0IGhhdmUgYWJzb2x1dGUgb3BlcmFuZHMuXG4iKSwgaWR4LCBpbiwgJnZhbGIpOwotCSAgc3dpdGNoIChjb25kKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmVzID0gNDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRVE6Ci0JICAgICAgcmVzID0gdmFsYSA9PSB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5FOgotCSAgICAgIHJlcyA9IHZhbGEgIT0gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBMVDoKLQkgICAgICByZXMgPSB2YWxhIDwgdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBMRToKLQkgICAgICByZXMgPSB2YWxhIDw9IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgR1Q6Ci0JICAgICAgcmVzID0gdmFsYSA+IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgR0U6Ci0JICAgICAgcmVzID0gdmFsYSA+PSB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5FVkVSOgotCSAgICAgIHJlcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHNiX2tpbGwgKCZhY2NfYSk7Ci0gIHNiX2tpbGwgKCZjb25kKTsKLSAgc2Jfa2lsbCAoJmFjY19iKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogLkFJRiAqLwotc3RhdGljIHZvaWQKLWRvX2FpZiAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpZiAoaWZpID49IElGTkVTVElORykKLSAgICB7Ci0gICAgICBGQVRBTCAoKHN0ZGVyciwgXygiQUlGIG5lc3RpbmcgdW5yZWFzb25hYmxlLlxuIikpKTsKLSAgICB9Ci0gIGlmaSsrOwotICBpZnN0YWNrW2lmaV0ub24gPSBpZnN0YWNrW2lmaS0xXS5vbiA/IGlzdHJ1ZSAoaWR4LCBpbikgOiAwOwotICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Ci19Ci0KLQotLyogLkFFTFNFICovCi1zdGF0aWMgdm9pZAotZG9fYWVsc2UgKCkKLXsKLSAgaWZzdGFja1tpZmldLm9uID0gaWZzdGFja1tpZmktMV0ub24gPyAhaWZzdGFja1tpZmldLm9uIDogMDsKLSAgaWYgKGlmc3RhY2tbaWZpXS5oYWRlbHNlKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJNdWx0aXBsZSBBRUxTRXMgaW4gQUlGLlxuIikpKTsKLSAgICB9Ci0gIGlmc3RhY2tbaWZpXS5oYWRlbHNlID0gMTsKLX0KLQotCi0vKiAuQUVOREkgKi8KLXN0YXRpYyB2b2lkCi1kb19hZW5kaSAoKQotewotICBpZiAoaWZpICE9IDApCi0gICAgewotICAgICAgaWZpLS07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRJIHdpdGhvdXQgQUlGLlxuIikpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbmRhc3Nfb24gKCkKLXsKLSAgcmV0dXJuIGlmc3RhY2tbaWZpXS5vbjsKLX0KLQotLyogTVJJIElGRVEsIElGTkUsIElGTFQsIElGTEUsIElGR0UsIElGR1QuICAqLwotCi1zdGF0aWMgdm9pZAotZG9faWYgKGlkeCwgaW4sIGNvbmQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50IGNvbmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCByZXM7Ci0KLSAgaWYgKGlmaSA+PSBJRk5FU1RJTkcpCi0gICAgewotICAgICAgRkFUQUwgKChzdGRlcnIsIF8oIklGIG5lc3RpbmcgdW5yZWFzb25hYmxlLlxuIikpKTsKLSAgICB9Ci0KLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNvbmRpdGlvbmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kcy5cbiIpLAotCQkgICAgIGlkeCwgaW4sICZ2YWwpOwotICBzd2l0Y2ggKGNvbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFUTogcmVzID0gdmFsID09IDA7IGJyZWFrOwotICAgIGNhc2UgTkU6IHJlcyA9IHZhbCAhPSAwOyBicmVhazsKLSAgICBjYXNlIExUOiByZXMgPSB2YWwgPCAgMDsgYnJlYWs7Ci0gICAgY2FzZSBMRTogcmVzID0gdmFsIDw9IDA7IGJyZWFrOwotICAgIGNhc2UgR0U6IHJlcyA9IHZhbCA+PSAwOyBicmVhazsKLSAgICBjYXNlIEdUOiByZXMgPSB2YWwgPiAgMDsgYnJlYWs7Ci0gICAgfQotCi0gIGlmaSsrOwotICBpZnN0YWNrW2lmaV0ub24gPSBpZnN0YWNrW2lmaS0xXS5vbiA/IHJlczogMDsKLSAgaWZzdGFja1tpZmldLmhhZGVsc2UgPSAwOwotfQotCi0vKiBHZXQgYSBzdHJpbmcgZm9yIHRoZSBNUkkgSUZDIG9yIElGTkMgcHNldWRvLW9wcy4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9tcmlfc3RyaW5nIChpZHgsIGluLCB2YWwsIHRlcm1pbmF0b3IpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKnZhbDsKLSAgICAgaW50IHRlcm1pbmF0b3I7Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIGlmIChpZHggPCBpbi0+bGVuCi0gICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAodmFsLCAnXCcnKTsKLSAgICAgIGZvciAoKytpZHg7IGlkeCA8IGluLT5sZW47ICsraWR4KQotCXsKLQkgIHNiX2FkZF9jaGFyICh2YWwsIGluLT5wdHJbaWR4XSk7Ci0JICBpZiAoaW4tPnB0cltpZHhdID09ICdcJycpCi0JICAgIHsKLQkgICAgICArK2lkeDsKLQkgICAgICBpZiAoaWR4ID49IGluLT5sZW4KLQkJICB8fCBpbi0+cHRyW2lkeF0gIT0gJ1wnJykKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkgICAgICYmIGluLT5wdHJbaWR4XSAhPSB0ZXJtaW5hdG9yKQotCXsKLQkgIHNiX2FkZF9jaGFyICh2YWwsIGluLT5wdHJbaWR4XSk7Ci0JICArK2lkeDsKLQl9Ci0gICAgICBpID0gdmFsLT5sZW4gLSAxOwotICAgICAgd2hpbGUgKGkgPj0gMCAmJiBJU1dISVRFICh2YWwtPnB0cltpXSkpCi0JLS1pOwotICAgICAgdmFsLT5sZW4gPSBpICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogTVJJIElGQywgSUZOQy4gICovCi0KLXN0YXRpYyB2b2lkCi1kb19pZmMgKGlkeCwgaW4sIGlmbmMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50IGlmbmM7Ci17Ci0gIHNiIGZpcnN0OwotICBzYiBzZWNvbmQ7Ci0gIGludCByZXM7Ci0KLSAgaWYgKGlmaSA+PSBJRk5FU1RJTkcpCi0gICAgewotICAgICAgRkFUQUwgKChzdGRlcnIsIF8oIklGIG5lc3RpbmcgdW5yZWFzb25hYmxlLlxuIikpKTsKLSAgICB9Ci0KLSAgc2JfbmV3ICgmZmlyc3QpOwotICBzYl9uZXcgKCZzZWNvbmQpOwotCi0gIGlkeCA9IGdldF9tcmlfc3RyaW5nIChpZHgsIGluLCAmZmlyc3QsICcsJyk7Ci0KLSAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSAhPSAnLCcpCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oIkJhZCBmb3JtYXQgZm9yIElGIG9yIElGTkMuXG4iKSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZHggPSBnZXRfbXJpX3N0cmluZyAoaWR4ICsgMSwgaW4sICZzZWNvbmQsICc7Jyk7Ci0KLSAgcmVzID0gKGZpcnN0LmxlbiA9PSBzZWNvbmQubGVuCi0JICYmIHN0cm5jbXAgKGZpcnN0LnB0ciwgc2Vjb25kLnB0ciwgZmlyc3QubGVuKSA9PSAwKTsKLSAgcmVzIF49IGlmbmM7Ci0KLSAgaWZpKys7Ci0gIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gcmVzIDogMDsKLSAgaWZzdGFja1tpZmldLmhhZGVsc2UgPSAwOwotfQotCi0vKiAuRU5EUiAqLwotc3RhdGljIHZvaWQKLWRvX2FlbmRyICgpCi17Ci0gIGlmICghbXJpKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC5cbiIpKSk7Ci0gIGVsc2UKLSAgICBFUlJPUiAoKHN0ZGVyciwgXygiRU5EUiB3aXRob3V0IGEgUkVQVC5cbiIpKSk7Ci19Ci0KLS8qIC5BV0hJTEUgKi8KLQotc3RhdGljCi12b2lkCi1kb19hd2hpbGUgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IGxpbmUgPSBsaW5lY291bnQgKCk7Ci0gIHNiIGV4cDsKLSAgc2Igc3ViOwotICBpbnQgZG9pdDsKLQotICBzYl9uZXcgKCZzdWIpOwotICBzYl9uZXcgKCZleHApOwotCi0gIHByb2Nlc3NfYXNzaWducyAoaWR4LCBpbiwgJmV4cCk7Ci0gIGRvaXQgPSBpc3RydWUgKDAsICZleHApOwotCi0gIGlmICghIGJ1ZmZlcl9hbmRfbmVzdCAoIkFXSElMRSIsICJBRU5EVyIsICZzdWIsIGdldF9saW5lKSkKLSAgICBGQVRBTCAoKHN0ZGVyciwgXygiQVdISUxFIHdpdGhvdXQgYSBBRU5EVyBhdCAlZC5cbiIpLCBsaW5lIC0gMSkpOwotCi0gIC8qIFR1cm4KLSAgICAgCS5BV0hJTEUgZXhwCi0JICAgICBmb28KLQkuQUVORFcKLSAgICAgaW50bwotICAgICAgICBmb28KLQkuQVdISUxFIGV4cAotCWZvbwotCS5FTkRXCi0gICAqLwotCi0gIGlmIChkb2l0KQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IGluY2x1ZGVfbmV4dF9pbmRleCAoKTsKLQotICAgICAgc2IgY29weTsKLSAgICAgIHNiX25ldyAoJmNvcHkpOwotICAgICAgc2JfYWRkX3NiICgmY29weSwgJnN1Yik7Ci0gICAgICBzYl9hZGRfc2IgKCZjb3B5LCBpbik7Ci0gICAgICBzYl9hZGRfc3RyaW5nICgmY29weSwgIlxuIik7Ci0gICAgICBzYl9hZGRfc2IgKCZjb3B5LCAmc3ViKTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiXHQuQUVORFdcbiIpOwotICAgICAgLyogUHVzaCBhbm90aGVyIFdISUxFICovCi0gICAgICBpbmNsdWRlX2J1ZiAoJmV4cCwgJmNvcHksIGluY2x1ZGVfd2hpbGUsIGluZGV4KTsKLSAgICAgIHNiX2tpbGwgKCZjb3B5KTsKLSAgICB9Ci0gIHNiX2tpbGwgKCZleHApOwotICBzYl9raWxsICgmc3ViKTsKLX0KLQotCi0vKiAuQUVORFcgKi8KLQotc3RhdGljIHZvaWQKLWRvX2FlbmR3ICgpCi17Ci0gIEVSUk9SICgoc3RkZXJyLCBfKCJBRU5EVyB3aXRob3V0IGEgQUVORFcuXG4iKSkpOwotfQotCi0KLS8qIC5FWElUTQotICAgCi0gICBQb3AgdGhpbmdzIG9mZiB0aGUgaW5jbHVkZSBzdGFjayB1bnRpbCB0aGUgdHlwZSBhbmQgaW5kZXggY2hhbmdlcyAqLwotCi1zdGF0aWMgdm9pZAotZG9fZXhpdG0gKCkKLXsKLSAgaW5jbHVkZV90eXBlIHR5cGUgPSBzcC0+dHlwZTsKLSAgaWYgKHR5cGUgPT0gaW5jbHVkZV9yZXBlYXQKLSAgICAgIHx8IHR5cGUgPT0gaW5jbHVkZV93aGlsZQotICAgICAgfHwgdHlwZSA9PSBpbmNsdWRlX21hY3JvKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHNwLT5pbmRleDsKLSAgICAgIGluY2x1ZGVfcG9wICgpOwotICAgICAgd2hpbGUgKHNwLT5pbmRleCA9PSBpbmRleAotCSAgICAgJiYgc3AtPnR5cGUgPT0gdHlwZSkKLQl7Ci0JICBpbmNsdWRlX3BvcCAoKTsKLQl9Ci0gICAgfQotfQotCi0vKiAuQVJFUEVBVCAqLwotCi1zdGF0aWMgdm9pZAotZG9fYXJlcGVhdCAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgbGluZSA9IGxpbmVjb3VudCAoKTsKLSAgc2IgZXhwOwkJCS8qIGJ1ZmZlciB3aXRoIGV4cHJlc3Npb24gaW4gaXQgKi8KLSAgc2IgY29weTsJCQkvKiBleHBhbmRlZCByZXBlYXQgYmxvY2sgKi8KLSAgc2Igc3ViOwkJCS8qIGNvbnRlbnRzIG9mIEFSRVBFQVQgKi8KLSAgaW50IHJjOwotICBpbnQgcmV0OwotICBjaGFyIGJ1ZmZlclszMF07Ci0KLSAgc2JfbmV3ICgmZXhwKTsKLSAgc2JfbmV3ICgmY29weSk7Ci0gIHNiX25ldyAoJnN1Yik7Ci0gIHByb2Nlc3NfYXNzaWducyAoaWR4LCBpbiwgJmV4cCk7Ci0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJBUkVQRUFUIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kLlxuIiksIDAsICZleHAsICZyYyk7Ci0gIGlmICghbXJpKQotICAgIHJldCA9IGJ1ZmZlcl9hbmRfbmVzdCAoIkFSRVBFQVQiLCAiQUVORFIiLCAmc3ViLCBnZXRfbGluZSk7Ci0gIGVsc2UKLSAgICByZXQgPSBidWZmZXJfYW5kX25lc3QgKCJSRVBUIiwgIkVORFIiLCAmc3ViLCBnZXRfbGluZSk7Ci0gIGlmICghIHJldCkKLSAgICBGQVRBTCAoKHN0ZGVyciwgXygiQVJFUEVBVCB3aXRob3V0IGEgQUVORFIgYXQgJWQuXG4iKSwgbGluZSAtIDEpKTsKLSAgaWYgKHJjID4gMCkKLSAgICB7Ci0gICAgICAvKiBQdXNoIGJhY2sgdGhlIHRleHQgZm9sbG93aW5nIHRoZSByZXBlYXQsIGFuZCBhbm90aGVyIHJlcGVhdCBibG9jawotCSBzbwotCSAuQVJFUEVBVCAyMAotCSBmb28KLQkgLkFFTkRSCi0JIGdldHMgdHVybmVkIGludG8KLQkgZm9vCi0JIC5BUkVQRUFUIDE5Ci0JIGZvbwotCSAuQUVORFIKLQkgKi8KLSAgICAgIGludCBpbmRleCA9IGluY2x1ZGVfbmV4dF9pbmRleCAoKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotICAgICAgaWYgKHJjID4gMSkKLQl7Ci0JICBpZiAoIW1yaSkKLQkgICAgc3ByaW50ZiAoYnVmZmVyLCAiXHQuQVJFUEVBVAklZFxuIiwgcmMgLSAxKTsKLQkgIGVsc2UKLQkgICAgc3ByaW50ZiAoYnVmZmVyLCAiXHRSRVBUCSVkXG4iLCByYyAtIDEpOwotCSAgc2JfYWRkX3N0cmluZyAoJmNvcHksIGJ1ZmZlcik7Ci0JICBzYl9hZGRfc2IgKCZjb3B5LCAmc3ViKTsKLQkgIGlmICghbXJpKQotCSAgICBzYl9hZGRfc3RyaW5nICgmY29weSwgIgkuQUVORFJcbiIpOwotCSAgZWxzZQotCSAgICBzYl9hZGRfc3RyaW5nICgmY29weSwgIglFTkRSXG4iKTsKLQl9Ci0KLSAgICAgIGluY2x1ZGVfYnVmICgmZXhwLCAmY29weSwgaW5jbHVkZV9yZXBlYXQsIGluZGV4KTsKLSAgICB9Ci0gIHNiX2tpbGwgKCZleHApOwotICBzYl9raWxsICgmc3ViKTsKLSAgc2Jfa2lsbCAoJmNvcHkpOwotfQotCi0vKiAuRU5ETSAqLwotCi1zdGF0aWMgdm9pZAotZG9fZW5kbSAoKQotewotICBFUlJPUiAoKHN0ZGVyciwgXygiLkVORE0gd2l0aG91dCBhIG1hdGNoaW5nIC5NQUNSTy5cbiIpKSk7Ci19Ci0KLS8qIE1SSSBJUlAgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX2lycCAoaWR4LCBpbiwgaXJwYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgaXJwYzsKLXsKLSAgY29uc3QgY2hhciAqZXJyOwotICBzYiBvdXQ7Ci0KLSAgc2JfbmV3ICgmb3V0KTsKLQotICBlcnIgPSBleHBhbmRfaXJwIChpcnBjLCBpZHgsIGluLCAmb3V0LCBnZXRfbGluZSwgY29tbWVudF9jaGFyKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIEVSUk9SICgoc3RkZXJyLCAiJXNcbiIsIGVycikpOwotCi0gIGZwcmludGYgKG91dGZpbGUsICIlcyIsIHNiX3Rlcm1pbmF0ZSAoJm91dCkpOwotCi0gIHNiX2tpbGwgKCZvdXQpOwotfQotCi0vKiBNQUNSTyBQUk9DRVNTSU5HICovCi0KLS8qIFBhcnNlIG9mZiBMT0NBTCBuMSwgbjIsLi4uIEludmVudCBhIGxhYmVsIG5hbWUgZm9yIGl0ICovCi1zdGF0aWMKLXZvaWQgCi1kb19sb2NhbCAoaWR4LCBsaW5lKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqbGluZTsKLXsKLSAgRVJST1IgKChzdGRlcnIsIF8oIkxPQ0FMIG91dHNpZGUgb2YgTUFDUk8iKSkpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbWFjcm8gKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgY29uc3QgY2hhciAqZXJyOwotICBpbnQgbGluZSA9IGxpbmVjb3VudCAoKTsKLQotICBlcnIgPSBkZWZpbmVfbWFjcm8gKGlkeCwgaW4sICZsYWJlbCwgZ2V0X2xpbmUsIChjb25zdCBjaGFyICoqKSBOVUxMKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtYWNybyBhdCBsaW5lICVkOiAlc1xuIiksIGxpbmUgLSAxLCBlcnIpKTsKLX0KLQotc3RhdGljIGludAotbWFjcm9fb3AgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgY29uc3QgY2hhciAqZXJyOwotICBzYiBvdXQ7Ci0gIHNiIG5hbWU7Ci0KLSAgaWYgKCEgbWFjcm9fZGVmaW5lZCkKLSAgICByZXR1cm4gMDsKLQotICBzYl90ZXJtaW5hdGUgKGluKTsKLSAgaWYgKCEgY2hlY2tfbWFjcm8gKGluLT5wdHIgKyBpZHgsICZvdXQsIGNvbW1lbnRfY2hhciwgJmVycikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIEVSUk9SICgoc3RkZXJyLCAiJXNcbiIsIGVycikpOwotCi0gIHNiX25ldyAoJm5hbWUpOwotICBzYl9hZGRfc3RyaW5nICgmbmFtZSwgXygibWFjcm8gZXhwYW5zaW9uIikpOwotCi0gIGluY2x1ZGVfYnVmICgmbmFtZSwgJm91dCwgaW5jbHVkZV9tYWNybywgaW5jbHVkZV9uZXh0X2luZGV4ICgpKTsKLQotICBzYl9raWxsICgmbmFtZSk7Ci0gIHNiX2tpbGwgKCZvdXQpOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBTVFJJTkcgSEFORExJTkcgKi8KLQotc3RhdGljIGludAotZ2V0c3RyaW5nIChpZHgsIGluLCBhY2MpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKmFjYzsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkgJiYgKGluLT5wdHJbaWR4XSA9PSAnIicgCi0JICAgICB8fCBpbi0+cHRyW2lkeF0gPT0gJzwnIAotCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnXCcnICYmIGFsdGVybmF0ZSkpKQotICAgIHsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCXsKLQkgIGlmIChhbHRlcm5hdGUgfHwgbXJpKQotCSAgICB7Ci0JICAgICAgaW50IG5lc3QgPSAwOwotCSAgICAgIGlkeCsrOwotCSAgICAgIHdoaWxlICgoaW4tPnB0cltpZHhdICE9ICc+JyB8fCBuZXN0KQotCQkgICAgICYmIGlkeCA8IGluLT5sZW4pCi0JCXsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09ICchJykKLQkJICAgIHsKLQkJICAgICAgaWR4KysgIDsKLQkJICAgICAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQkgICAgfQotCQkgIGVsc2UgewotCQkgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPicpCi0JCSAgICAgIG5lc3QtLTsKLQkJICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCQkgICAgICBuZXN0Kys7Ci0JCSAgICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCSAgfQotCQl9Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQkgIGVsc2UgewotCSAgICBpbnQgY29kZTsKLQkgICAgaWR4Kys7Ci0JICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJDaGFyYWN0ZXIgY29kZSBpbiBzdHJpbmcgbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9uLlxuIiksCi0JCQkgICAgICAgaWR4LCBpbiwgJmNvZGUpOwotCSAgICBzYl9hZGRfY2hhciAoYWNjLCBjb2RlKTsKLQotCSAgICBpZiAoaW4tPnB0cltpZHhdICE9ICc+JykKLQkgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiTWlzc2luZyA+IGZvciBjaGFyYWN0ZXIgY29kZS5cbiIpKSk7Ci0JICAgIGlkeCsrOwotCSAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JewotCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0JICAgIHsKLQkgICAgICBpZiAoYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnIScpCi0JCXsKLQkJICBpZHgrKyAgOwotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJfQotCSAgICAgIGVsc2UgewotCQlpZiAoaW4tPnB0cltpZHhdID09IHRjaGFyKQotCQkgIHsKLQkJICAgIGlkeCsrOwotCQkgICAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCQlzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeF0pOwotCQlpZHgrKzsKLQkgICAgICB9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogLlNEQVRBW0N8Wl0gPHN0cmluZz4gKi8KLQotc3RhdGljCi12b2lkCi1kb19zZGF0YSAoaWR4LCBpbiwgdHlwZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IG5jID0gMDsKLSAgaW50IHBpZHggPSAtMTsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiLmJ5dGVcdCIpOwotCi0gIHdoaWxlICghZW9sIChpZHgsIGluKSkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHNiX3Jlc2V0ICgmYWNjKTsKLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgICAgd2hpbGUgKCFlb2wgKGlkeCwgaW4pKQotCXsKLQkgIHBpZHggPSBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJmFjYywgMCwgMSk7Ci0JICBpZiAodHlwZSA9PSAnYycpCi0JICAgIHsKLQkgICAgICBpZiAoYWNjLmxlbiA+IDI1NSkKLQkJewotCQkgIEVSUk9SICgoc3RkZXJyLCBfKCJzdHJpbmcgZm9yIFNEQVRBQyBsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyAoJWQpLlxuIiksIGFjYy5sZW4pKTsKLQkJfQotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIGFjYy5sZW4pOwotCSAgICAgIG5jID0gMTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYWNjLmxlbjsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKG5jKQotCQl7Ci0JCSAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQkJfQotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIGFjYy5wdHJbaV0pOwotCSAgICAgIG5jID0gMTsKLQkgICAgfQotCi0JICBpZiAodHlwZSA9PSAneicpCi0JICAgIHsKLQkgICAgICBpZiAobmMpCi0JCWZwcmludGYgKG91dGZpbGUsICIsIik7Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIjAiKTsKLQkgICAgfQotCSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0JICBpZiAoaWR4ID09IHBpZHgpIGJyZWFrOwotCX0KLSAgICAgIGlmICghYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSAhPSAnLCcgJiYgaWR4ICE9IGluLT5sZW4pCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIlxuIik7Ci0JICBFUlJPUiAoKHN0ZGVyciwgXygiaWxsZWdhbCBjaGFyYWN0ZXIgaW4gU0RBVEEgbGluZSAoMHgleCkuXG4iKSwgaW4tPnB0cltpZHhdKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZHgrKzsKLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLX0KLQotLyogLlNEQVRBQiA8Y291bnQ+IDxzdHJpbmc+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19zZGF0YWIgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IHJlcGVhdDsKLSAgaW50IGk7Ci0gIHNiIGFjYzsKLSAgc2JfbmV3ICgmYWNjKTsKLQotICBpZHggPSBleHBfZ2V0X2FicyAoXygiTXVzdCBoYXZlIGFic29sdXRlIFNEQVRBQiByZXBlYXQgY291bnQuXG4iKSwgaWR4LCBpbiwgJnJlcGVhdCk7Ci0gIGlmIChyZXBlYXQgPD0gMCkKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiTXVzdCBoYXZlIHBvc2l0aXZlIFNEQVRBQiByZXBlYXQgY291bnQgKCVkKS5cbiIpLCByZXBlYXQpKTsKLSAgICAgIHJlcGVhdCA9IDE7Ci0gICAgfQotCi0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2MpOwotCi0gIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSkKLQlmcHJpbnRmIChvdXRmaWxlLCAiXHQiKTsKLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIuYnl0ZVx0Iik7Ci0gICAgICBzYl9wcmludCAob3V0ZmlsZSwgJmFjYyk7Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotCi19Ci0KLXN0YXRpYyBpbnQKLW5ld19maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBGSUxFICpuZXdvbmUgPSBmb3BlbiAobmFtZSwgInIiKTsKLSAgaWYgKCFuZXdvbmUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGlzcCA9PSBNQVhfSU5DTFVERVMpCi0gICAgRkFUQUwgKChzdGRlcnIsIF8oIlVucmVhc29uYWJsZSBpbmNsdWRlIGRlcHRoICglbGQpLlxuIiksIChsb25nKSBpc3ApKTsKLQotICBzcCsrOwotICBzcC0+aGFuZGxlID0gbmV3b25lOwotCi0gIHNiX25ldyAoJnNwLT5uYW1lKTsKLSAgc2JfYWRkX3N0cmluZyAoJnNwLT5uYW1lLCBuYW1lKTsKLQotICBzcC0+bGluZWNvdW50ID0gMTsKLSAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKLSAgc3AtPnR5cGUgPSBpbmNsdWRlX2ZpbGU7Ci0gIHNwLT5pbmRleCA9IDA7Ci0gIHNiX25ldyAoJnNwLT5wdXNoYmFjayk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotZG9faW5jbHVkZSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBzYiB0OwotICBzYiBjYXQ7Ci0gIGluY2x1ZGVfcGF0aCAqaW5jbHVkZXM7Ci0KLSAgc2JfbmV3ICgmdCk7Ci0gIHNiX25ldyAoJmNhdCk7Ci0KLSAgaWYgKCEgbXJpKQotICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJnQpOwotICBlbHNlCi0gICAgewotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiAhIElTV0hJVEUgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgc2JfYWRkX2NoYXIgKCZ0LCBpbi0+cHRyW2lkeF0pOwotCSAgKytpZHg7Ci0JfQotICAgIH0KLQotICBmb3IgKGluY2x1ZGVzID0gcGF0aHNfaGVhZDsgaW5jbHVkZXM7IGluY2x1ZGVzID0gaW5jbHVkZXMtPm5leHQpCi0gICAgewotICAgICAgc2JfcmVzZXQgKCZjYXQpOwotICAgICAgc2JfYWRkX3NiICgmY2F0LCAmaW5jbHVkZXMtPnBhdGgpOwotICAgICAgc2JfYWRkX2NoYXIgKCZjYXQsICcvJyk7Ci0gICAgICBzYl9hZGRfc2IgKCZjYXQsICZ0KTsKLSAgICAgIGlmIChuZXdfZmlsZSAoc2JfbmFtZSAoJmNhdCkpKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmICghaW5jbHVkZXMpCi0gICAgewotICAgICAgaWYgKCEgbmV3X2ZpbGUgKHNiX25hbWUgKCZ0KSkpCi0JRkFUQUwgKChzdGRlcnIsIF8oIkNhbid0IG9wZW4gaW5jbHVkZSBmaWxlIGAlcycuXG4iKSwgc2JfbmFtZSAoJnQpKSk7Ci0gICAgfQotICBzYl9raWxsICgmY2F0KTsKLSAgc2Jfa2lsbCAoJnQpOwotfQotCi1zdGF0aWMgdm9pZAotaW5jbHVkZV9wb3AgKCkKLXsKLSAgaWYgKHNwICE9IGluY2x1ZGVfc3RhY2spCi0gICAgewotICAgICAgaWYgKHNwLT5oYW5kbGUpCi0JZmNsb3NlIChzcC0+aGFuZGxlKTsKLSAgICAgIHNwLS07Ci0gICAgfQotfQotCi0vKiBHZXQgdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlIGluY2x1ZGUgc3RhY2suICBJZiB0aGVyZSdzIGFueXRoaW5nCi0gICBpbiB0aGUgcHVzaGJhY2sgYnVmZmVyLCB0YWtlIHRoYXQgZmlyc3QuICBJZiB3ZSdyZSBhdCBlb2YsIHBvcCBmcm9tCi0gICB0aGUgc3RhY2sgYW5kIHRyeSBhZ2Fpbi4gIEtlZXAgdGhlIGxpbmVjb3VudCB1cCB0byBkYXRlLiAqLwotCi1zdGF0aWMgaW50Ci1nZXQgKCkKLXsKLSAgaW50IHI7Ci0KLSAgaWYgKHNwLT5wdXNoYmFjay5sZW4gIT0gc3AtPnB1c2hiYWNrX2luZGV4KQotICAgIHsKLSAgICAgIHIgPSAoY2hhcikgKHNwLT5wdXNoYmFjay5wdHJbc3AtPnB1c2hiYWNrX2luZGV4KytdKTsKLSAgICAgIC8qIFdoZW4gdGhleSd2ZSBhbGwgZ29uZSwgcmVzZXQgdGhlIHBvaW50ZXIgKi8KLSAgICAgIGlmIChzcC0+cHVzaGJhY2tfaW5kZXggPT0gc3AtPnB1c2hiYWNrLmxlbikKLQl7Ci0JICBzcC0+cHVzaGJhY2subGVuID0gMDsKLQkgIHNwLT5wdXNoYmFja19pbmRleCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3AtPmhhbmRsZSkKLSAgICB7Ci0gICAgICByID0gZ2V0YyAoc3AtPmhhbmRsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgciA9IEVPRjsKLQotICBpZiAociA9PSBFT0YgJiYgaXNwKQotICAgIHsKLSAgICAgIGluY2x1ZGVfcG9wICgpOwotICAgICAgciA9IGdldCAoKTsKLSAgICAgIHdoaWxlIChyID09IEVPRiAmJiBpc3ApCi0JewotCSAgaW5jbHVkZV9wb3AgKCk7Ci0JICByID0gZ2V0ICgpOwotCX0KLSAgICAgIHJldHVybiByOwotICAgIH0KLSAgaWYgKHIgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBzcC0+bGluZWNvdW50Kys7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi1zdGF0aWMgaW50Ci1saW5lY291bnQgKCkKLXsKLSAgcmV0dXJuIHNwLT5saW5lY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWluY2x1ZGVfbmV4dF9pbmRleCAoKQotewotICBzdGF0aWMgaW50IGluZGV4OwotICBpZiAoIXVucmVhc29uYWJsZQotICAgICAgJiYgaW5kZXggPiBNQVhfUkVBU09OQUJMRSkKLSAgICBGQVRBTCAoKHN0ZGVyciwgXygiVW5yZWFzb25hYmxlIGV4cGFuc2lvbiAoLXUgdHVybnMgb2ZmIGNoZWNrKS5cbiIpKSk7Ci0gIHJldHVybiArK2luZGV4OwotfQotCi0KLS8qIEluaXRpYWxpemUgdGhlIGNoYXJ0eXBlIHZlY3Rvci4gKi8KLQotc3RhdGljIHZvaWQKLWNoYXJ0eXBlX2luaXQgKCkKLXsKLSAgaW50IHg7Ci0gIGZvciAoeCA9IDA7IHggPCAyNTY7IHgrKykKLSAgICB7Ci0gICAgICBpZiAoaXNhbHBoYSAoeCkgfHwgeCA9PSAnXycgfHwgeCA9PSAnJCcpCi0JY2hhcnR5cGVbeF0gfD0gRklSU1RCSVQ7Ci0KLSAgICAgIGlmIChtcmkgJiYgeCA9PSAnLicpCi0JY2hhcnR5cGVbeF0gfD0gRklSU1RCSVQ7Ci0KLSAgICAgIGlmIChpc2RpZ2l0ICh4KSB8fCBpc2FscGhhICh4KSB8fCB4ID09ICdfJyB8fCB4ID09ICckJykKLQljaGFydHlwZVt4XSB8PSBORVhUQklUOwotCi0gICAgICBpZiAoeCA9PSAnICcgfHwgeCA9PSAnXHQnIHx8IHggPT0gJywnIHx8IHggPT0gJyInIHx8IHggPT0gJzsnCi0JICB8fCB4ID09ICciJyB8fCB4ID09ICc8JyB8fCB4ID09ICc+JyB8fCB4ID09ICcpJyB8fCB4ID09ICcoJykKLQljaGFydHlwZVt4XSB8PSBTRVBCSVQ7Ci0KLSAgICAgIGlmICh4ID09ICdiJyB8fCB4ID09ICdCJwotCSAgfHwgeCA9PSAncScgfHwgeCA9PSAnUScKLQkgIHx8IHggPT0gJ2gnIHx8IHggPT0gJ0gnCi0JICB8fCB4ID09ICdkJyB8fCB4ID09ICdEJykKLQljaGFydHlwZSBbeF0gfD0gQkFTRUJJVDsKLQkgIAotICAgICAgaWYgKHggPT0gJyAnIHx8IHggPT0gJ1x0JykKLQljaGFydHlwZVt4XSB8PSBXSElURUJJVDsKLQotICAgICAgaWYgKHggPT0gY29tbWVudF9jaGFyKQotCWNoYXJ0eXBlW3hdIHw9IENPTU1FTlRCSVQ7Ci0gICAgfQotfQotCi0KLQotLyogV2hhdCB0byBkbyB3aXRoIGFsbCB0aGUga2V5d29yZHMgKi8KLSNkZWZpbmUgUFJPQ0VTUyAJMHgxMDAwICAvKiBSdW4gc3Vic3RpdHV0aW9uIG92ZXIgdGhlIGxpbmUgKi8KLSNkZWZpbmUgTEFCCQkweDIwMDAgIC8qIFNwaXQgb3V0IHRoZSBsYWJlbCAqLwotCi0jZGVmaW5lIEtfRVFVIAkJKFBST0NFU1N8MSkKLSNkZWZpbmUgS19BU1NJR04gCShQUk9DRVNTfDIpCi0jZGVmaW5lIEtfUkVHIAkJKFBST0NFU1N8MykKLSNkZWZpbmUgS19PUkcgCQkoUFJPQ0VTU3w0KQotI2RlZmluZSBLX1JBRElYIAkoUFJPQ0VTU3w1KQotI2RlZmluZSBLX0RBVEEgCQkoTEFCfFBST0NFU1N8NikKLSNkZWZpbmUgS19EQVRBQiAJKExBQnxQUk9DRVNTfDcpCi0jZGVmaW5lIEtfU0RBVEEgCShMQUJ8UFJPQ0VTU3w4KQotI2RlZmluZSBLX1NEQVRBQiAJKExBQnxQUk9DRVNTfDkpCi0jZGVmaW5lIEtfU0RBVEFDIAkoTEFCfFBST0NFU1N8MTApCi0jZGVmaW5lIEtfU0RBVEFaCShMQUJ8UFJPQ0VTU3wxMSkKLSNkZWZpbmUgS19SRVMgCQkoTEFCfFBST0NFU1N8MTIpCi0jZGVmaW5lIEtfU1JFUyAJCShMQUJ8UFJPQ0VTU3wxMykKLSNkZWZpbmUgS19TUkVTQyAJKExBQnxQUk9DRVNTfDE0KQotI2RlZmluZSBLX1NSRVNaIAkoTEFCfFBST0NFU1N8MTUpCi0jZGVmaW5lIEtfRVhQT1JUIAkoTEFCfFBST0NFU1N8MTYpCi0jZGVmaW5lIEtfR0xPQkFMIAkoTEFCfFBST0NFU1N8MTcpCi0jZGVmaW5lIEtfUFJJTlQgCShMQUJ8UFJPQ0VTU3wxOSkKLSNkZWZpbmUgS19GT1JNIAkJKExBQnxQUk9DRVNTfDIwKQotI2RlZmluZSBLX0hFQURJTkcJKExBQnxQUk9DRVNTfDIxKQotI2RlZmluZSBLX1BBR0UJCShMQUJ8UFJPQ0VTU3wyMikKLSNkZWZpbmUgS19JTVBPUlQJKExBQnxQUk9DRVNTfDIzKQotI2RlZmluZSBLX1BST0dSQU0JKExBQnxQUk9DRVNTfDI0KQotI2RlZmluZSBLX0VORAkJKFBST0NFU1N8MjUpCi0jZGVmaW5lIEtfSU5DTFVERQkoUFJPQ0VTU3wyNikKLSNkZWZpbmUgS19JR05PUkVECShQUk9DRVNTfDI3KQotI2RlZmluZSBLX0FTU0lHTkEJKFBST0NFU1N8MjgpCi0jZGVmaW5lIEtfQVNTSUdOQwkoMjkpCi0jZGVmaW5lIEtfQUlGCQkoUFJPQ0VTU3wzMCkKLSNkZWZpbmUgS19BRUxTRQkJKFBST0NFU1N8MzEpCi0jZGVmaW5lIEtfQUVOREkJCShQUk9DRVNTfDMyKQotI2RlZmluZSBLX0FSRVBFQVQJKFBST0NFU1N8MzMpCi0jZGVmaW5lIEtfQUVORFIJCShQUk9DRVNTfDM0KQotI2RlZmluZSBLX0FXSElMRQkoMzUpCi0jZGVmaW5lIEtfQUVORFcJCShQUk9DRVNTfDM2KQotI2RlZmluZSBLX0VYSVRNCQkoMzcpCi0jZGVmaW5lIEtfTUFDUk8JCShQUk9DRVNTfDM4KQotI2RlZmluZSBLX0VORE0JCSgzOSkKLSNkZWZpbmUgS19BTElHTgkJKFBST0NFU1N8TEFCfDQwKQotI2RlZmluZSBLX0FMVEVSTkFURSAgICAgKDQxKQotI2RlZmluZSBLX0RCCQkoTEFCfFBST0NFU1N8NDIpCi0jZGVmaW5lIEtfRFcJCShMQUJ8UFJPQ0VTU3w0MykKLSNkZWZpbmUgS19ETAkJKExBQnxQUk9DRVNTfDQ0KQotI2RlZmluZSBLX0xPQ0FMCQkoNDUpCi0jZGVmaW5lIEtfSUZFUQkJKFBST0NFU1N8NDYpCi0jZGVmaW5lIEtfSUZORQkJKFBST0NFU1N8NDcpCi0jZGVmaW5lIEtfSUZMVAkJKFBST0NFU1N8NDgpCi0jZGVmaW5lIEtfSUZMRQkJKFBST0NFU1N8NDkpCi0jZGVmaW5lIEtfSUZHRQkJKFBST0NFU1N8NTApCi0jZGVmaW5lIEtfSUZHVAkJKFBST0NFU1N8NTEpCi0jZGVmaW5lIEtfSUZDCQkoUFJPQ0VTU3w1MikKLSNkZWZpbmUgS19JRk5DCQkoUFJPQ0VTU3w1MykKLSNkZWZpbmUgS19JUlAJCShQUk9DRVNTfDU0KQotI2RlZmluZSBLX0lSUEMJCShQUk9DRVNTfDU1KQotCi0KLXN0cnVjdCBrZXl3b3JkCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjb2RlOwotICBpbnQgZXh0cmE7Ci19OwotCi1zdGF0aWMgc3RydWN0IGtleXdvcmQga2luZm9bXSA9Ci17Ci0gIHsgIkVRVSIsIEtfRVFVLCAwIH0sCi0gIHsgIkFMVEVSTkFURSIsIEtfQUxURVJOQVRFLCAwIH0sCi0gIHsgIkFTU0lHTiIsIEtfQVNTSUdOLCAwIH0sCi0gIHsgIlJFRyIsIEtfUkVHLCAwIH0sCi0gIHsgIk9SRyIsIEtfT1JHLCAwIH0sCi0gIHsgIlJBRElYIiwgS19SQURJWCwgMCB9LAotICB7ICJEQVRBIiwgS19EQVRBLCAwIH0sCi0gIHsgIkRCIiwgS19EQiwgMCB9LAotICB7ICJEVyIsIEtfRFcsIDAgfSwKLSAgeyAiREwiLCBLX0RMLCAwIH0sCi0gIHsgIkRBVEFCIiwgS19EQVRBQiwgMCB9LAotICB7ICJTREFUQSIsIEtfU0RBVEEsIDAgfSwKLSAgeyAiU0RBVEFCIiwgS19TREFUQUIsIDAgfSwKLSAgeyAiU0RBVEFaIiwgS19TREFUQVosIDAgfSwKLSAgeyAiU0RBVEFDIiwgS19TREFUQUMsIDAgfSwKLSAgeyAiUkVTIiwgS19SRVMsIDAgfSwKLSAgeyAiU1JFUyIsIEtfU1JFUywgMCB9LAotICB7ICJTUkVTQyIsIEtfU1JFU0MsIDAgfSwKLSAgeyAiU1JFU1oiLCBLX1NSRVNaLCAwIH0sCi0gIHsgIkVYUE9SVCIsIEtfRVhQT1JULCAwIH0sCi0gIHsgIkdMT0JBTCIsIEtfR0xPQkFMLCAwIH0sCi0gIHsgIlBSSU5UIiwgS19QUklOVCwgMCB9LAotICB7ICJGT1JNIiwgS19GT1JNLCAwIH0sCi0gIHsgIkhFQURJTkciLCBLX0hFQURJTkcsIDAgfSwKLSAgeyAiUEFHRSIsIEtfUEFHRSwgMCB9LAotICB7ICJQUk9HUkFNIiwgS19JR05PUkVELCAwIH0sCi0gIHsgIkVORCIsIEtfRU5ELCAwIH0sCi0gIHsgIklOQ0xVREUiLCBLX0lOQ0xVREUsIDAgfSwKLSAgeyAiQVNTSUdOQSIsIEtfQVNTSUdOQSwgMCB9LAotICB7ICJBU1NJR05DIiwgS19BU1NJR05DLCAwIH0sCi0gIHsgIkFJRiIsIEtfQUlGLCAwIH0sCi0gIHsgIkFFTFNFIiwgS19BRUxTRSwgMCB9LAotICB7ICJBRU5ESSIsIEtfQUVOREksIDAgfSwKLSAgeyAiQVJFUEVBVCIsIEtfQVJFUEVBVCwgMCB9LAotICB7ICJBRU5EUiIsIEtfQUVORFIsIDAgfSwKLSAgeyAiRVhJVE0iLCBLX0VYSVRNLCAwIH0sCi0gIHsgIk1BQ1JPIiwgS19NQUNSTywgMCB9LAotICB7ICJFTkRNIiwgS19FTkRNLCAwIH0sCi0gIHsgIkFXSElMRSIsIEtfQVdISUxFLCAwIH0sCi0gIHsgIkFMSUdOIiwgS19BTElHTiwgMCB9LAotICB7ICJBRU5EVyIsIEtfQUVORFcsIDAgfSwKLSAgeyAiQUxURVJOQVRFIiwgS19BTFRFUk5BVEUsIDAgfSwKLSAgeyAiTE9DQUwiLCBLX0xPQ0FMLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBBbHRob3VnaCB0aGUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFyZSBoYW5kbGVkIGJ5IGdhcywgd2UgbmVlZCB0bwotICAgaGFuZGxlIHRoZW0gaGVyZSBhcyB3ZWxsLCBpbiBjYXNlIHRoZXkgYXJlIHVzZWQgaW4gYSByZWN1cnNpdmUKLSAgIG1hY3JvIHRvIGVuZCB0aGUgcmVjdXJzaW9uLiAgKi8KLQotc3RhdGljIHN0cnVjdCBrZXl3b3JkIG1yaWtpbmZvW10gPQotewotICB7ICJJRkVRIiwgS19JRkVRLCAwIH0sCi0gIHsgIklGTkUiLCBLX0lGTkUsIDAgfSwKLSAgeyAiSUZMVCIsIEtfSUZMVCwgMCB9LAotICB7ICJJRkxFIiwgS19JRkxFLCAwIH0sCi0gIHsgIklGR0UiLCBLX0lGR0UsIDAgfSwKLSAgeyAiSUZHVCIsIEtfSUZHVCwgMCB9LAotICB7ICJJRkMiLCBLX0lGQywgMCB9LAotICB7ICJJRk5DIiwgS19JRk5DLCAwIH0sCi0gIHsgIkVMU0VDIiwgS19BRUxTRSwgMCB9LAotICB7ICJFTkRDIiwgS19BRU5ESSwgMCB9LAotICB7ICJNRVhJVCIsIEtfRVhJVE0sIDAgfSwKLSAgeyAiUkVQVCIsIEtfQVJFUEVBVCwgMCB9LAotICB7ICJJUlAiLCBLX0lSUCwgMCB9LAotICB7ICJJUlBDIiwgS19JUlBDLCAwIH0sCi0gIHsgIkVORFIiLCBLX0FFTkRSLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBMb29rIGZvciBhIHBzZXVkbyBvcCBvbiB0aGUgbGluZS4gSWYgb25lJ3MgdGhlcmUgdGhlbiBjYWxsCi0gICBpdHMgaGFuZGxlci4gKi8KLQotc3RhdGljIGludAotcHJvY2Vzc19wc2V1ZG9fb3AgKGlkeCwgbGluZSwgYWNjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqbGluZTsKLSAgICAgc2IgKmFjYzsKLXsKLSAgaW50IG9pZHggPSBpZHg7Ci0KLSAgaWYgKGxpbmUtPnB0cltpZHhdID09ICcuJyB8fCBhbHRlcm5hdGUgfHwgbXJpKQotICAgIHsKLSAgICAgIC8qIFNjYW4gZm9yd2FyZCBhbmQgZmluZCBwc2V1ZG8gbmFtZSAqLwotICAgICAgY2hhciAqaW47Ci0gICAgICBoYXNoX2VudHJ5ICpwdHI7Ci0KLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyICplOwotICAgICAgaWYgKGxpbmUtPnB0cltpZHhdID09ICcuJykKLQlpZHgrKzsKLSAgICAgIGluID0gbGluZS0+cHRyICsgaWR4OwotICAgICAgcyA9IGluOwotICAgICAgZSA9IHM7Ci0gICAgICBzYl9yZXNldCAoYWNjKTsKLQotICAgICAgd2hpbGUgKGlkeCA8IGxpbmUtPmxlbiAmJiAqZSAmJiBJU0ZJUlNUQ0hBUiAoKmUpKQotCXsKLQkgIHNiX2FkZF9jaGFyIChhY2MsICplKTsKLQkgIGUrKzsKLQkgIGlkeCsrOwotCX0KLQotICAgICAgcHRyID0gaGFzaF9sb29rdXAgKCZrZXl3b3JkX2hhc2hfdGFibGUsIGFjYyk7Ci0KLSAgICAgIGlmICghcHRyKQotCXsKLSNpZiAwCi0JICAvKiBUaGlzIG9uZSBjYXVzZXMgbG90cyBvZiBwYWluIHdoZW4gdHJ5aW5nIHRvIHByZXByb2Nlc3MKLQkgICAgIG9yZGluYXJ5IGNvZGUgKi8KLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIlVucmVjb2duaXNlZCBwc2V1ZG8gb3AgYCVzJy5cbiIpLCBzYl9uYW1lIChhY2MpKSk7Ci0jZW5kaWYKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmIChwdHItPnZhbHVlLmkgJiBMQUIpCi0JewkJCS8qIG91dHB1dCB0aGUgbGFiZWwgKi8KLQkgIGlmIChsYWJlbC5sZW4pCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChvdXRmaWxlLCAiJXM6XHQiLCBzYl9uYW1lICgmbGFiZWwpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiXHQiKTsKLQl9Ci0KLSAgICAgIGlmIChtcmkgJiYgcHRyLT52YWx1ZS5pID09IEtfRU5EKQotCXsKLQkgIHNiIHQ7Ci0KLQkgIHNiX25ldyAoJnQpOwotCSAgc2JfYWRkX2J1ZmZlciAoJnQsIGxpbmUtPnB0ciArIG9pZHgsIGlkeCAtIG9pZHgpOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgIlx0JXMiLCBzYl9uYW1lICgmdCkpOwotCSAgc2Jfa2lsbCAoJnQpOwotCX0KLQotICAgICAgaWYgKHB0ci0+dmFsdWUuaSAmIFBST0NFU1MpCi0JewotCSAgLyogUG9saXNoIHRoZSByZXN0IG9mIHRoZSBsaW5lIGJlZm9yZSBoYW5kbGluZyB0aGUgcHNldWRvIG9wICovCi0jaWYgMAotCSAgc3RyaXBfY29tbWVudHMobGluZSk7Ci0jZW5kaWYKLQkgIHNiX3Jlc2V0IChhY2MpOwotCSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGxpbmUsIGFjYyk7Ci0JICBzYl9yZXNldChsaW5lKTsKLQkgIGNoYW5nZV9iYXNlICgwLCBhY2MsIGxpbmUpOwotCSAgaWR4ID0gMDsKLQl9Ci0gICAgICBpZiAoIWNvbmRhc3Nfb24gKCkpCi0JewotCSAgc3dpdGNoIChwdHItPnZhbHVlLmkpCi0JICAgIHsKLQkgICAgY2FzZSBLX0FJRjoKLQkgICAgICBkb19haWYgKGlkeCwgbGluZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19BRUxTRToKLQkgICAgICBkb19hZWxzZSAoKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBLX0FFTkRJOgotCSAgICAgIGRvX2FlbmRpICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChwdHItPnZhbHVlLmkpCi0JICAgIHsKLQkgICAgY2FzZSBLX0FMVEVSTkFURToKLQkgICAgICBhbHRlcm5hdGUgPSAxOwotCSAgICAgIG1hY3JvX2luaXQgKDEsIG1yaSwgMCwgZXhwX2dldF9hYnMpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVMU0U6Ci0JICAgICAgZG9fYWVsc2UgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRU5ESToKLQkgICAgICBkb19hZW5kaSAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX09SRzoKLQkgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiT1JHIGNvbW1hbmQgbm90IGFsbG93ZWQuXG4iKSkpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEtfUkFESVg6Ci0JICAgICAgZG9fcmFkaXggKGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREI6Ci0JICAgICAgZG9fZGF0YSAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0RXOgotCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgMik7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19ETDoKLQkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDQpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREFUQToKLQkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDApOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREFUQUI6Ci0JICAgICAgZG9fZGF0YWIgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TREFUQToKLQkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAwKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBQjoKLQkgICAgICBkb19zZGF0YWIgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TREFUQUM6Ci0JICAgICAgZG9fc2RhdGEgKGlkeCwgbGluZSwgJ2MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBWjoKLQkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAneicpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVNTSUdOOgotCSAgICAgIGRvX2Fzc2lnbiAoMCwgMCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BSUY6Ci0JICAgICAgZG9fYWlmIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVJFUEVBVDoKLQkgICAgICBkb19hcmVwZWF0IChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVORFc6Ci0JICAgICAgZG9fYWVuZHcgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BV0hJTEU6Ci0JICAgICAgZG9fYXdoaWxlIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVORFI6Ci0JICAgICAgZG9fYWVuZHIgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FUVU6Ci0JICAgICAgZG9fYXNzaWduICgxLCBpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUxJR046Ci0JICAgICAgZG9fYWxpZ24gKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19SRVM6Ci0JICAgICAgZG9fcmVzIChpZHgsIGxpbmUsIDApOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfU1JFUzoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ3MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lOQ0xVREU6Ci0JICAgICAgZG9faW5jbHVkZSAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0xPQ0FMOgotCSAgICAgIGRvX2xvY2FsIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfTUFDUk86Ci0JICAgICAgZG9fbWFjcm8gKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FTkRNOgotCSAgICAgIGRvX2VuZG0gKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TUkVTQzoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ2MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1BSSU5UOgotCSAgICAgIGRvX3ByaW50IChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfRk9STToKLQkgICAgICBkb19mb3JtIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSEVBRElORzoKLQkgICAgICBkb19oZWFkaW5nIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfUEFHRToKLQkgICAgICBkb19wYWdlICgpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfR0xPQkFMOgotCSAgICBjYXNlIEtfRVhQT1JUOgotCSAgICAgIGRvX2V4cG9ydCAobGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JTVBPUlQ6Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TUkVTWjoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ3onKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lHTk9SRUQ6Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FTkQ6Ci0JICAgICAgZG9fZW5kIChsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FTU0lHTkE6Ci0JICAgICAgZG9fYXNzaWduYSAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FTU0lHTkM6Ci0JICAgICAgZG9fYXNzaWduYyAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VYSVRNOgotCSAgICAgIGRvX2V4aXRtICgpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfUkVHOgotCSAgICAgIGRvX3JlZyAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGRVE6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgRVEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZORToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBORSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRkxUOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIExUKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGTEU6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgTEUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZHRToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBHRSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRkdUOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIEdUKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGQzoKLQkgICAgICBkb19pZmMgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRk5DOgotCSAgICAgIGRvX2lmYyAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lSUDoKLQkgICAgICBkb19pcnAgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JUlBDOgotCSAgICAgIGRvX2lycCAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLQotLyogQWRkIGEga2V5d29yZCB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfa2V5d29yZCAobmFtZSwgY29kZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHNiIGxhYmVsOwotICBpbnQgajsKLQotICBzYl9uZXcgKCZsYWJlbCk7Ci0gIHNiX2FkZF9zdHJpbmcgKCZsYWJlbCwgbmFtZSk7Ci0KLSAgaGFzaF9hZGRfdG9faW50X3RhYmxlICgma2V5d29yZF9oYXNoX3RhYmxlLCAmbGFiZWwsIGNvZGUpOwotCi0gIHNiX3Jlc2V0ICgmbGFiZWwpOwotICBmb3IgKGogPSAwOyBuYW1lW2pdOyBqKyspCi0gICAgc2JfYWRkX2NoYXIgKCZsYWJlbCwgbmFtZVtqXSAtICdBJyArICdhJyk7Ci0gIGhhc2hfYWRkX3RvX2ludF90YWJsZSAoJmtleXdvcmRfaGFzaF90YWJsZSwgJmxhYmVsLCBjb2RlKTsKLQotICBzYl9raWxsICgmbGFiZWwpOwotfSAgCi0KLS8qIEJ1aWxkIHRoZSBrZXl3b3JkIGhhc2ggdGFibGUgLSBwdXQgZWFjaCBrZXl3b3JkIGluIHRoZSB0YWJsZSB0d2ljZSwKLSAgIG9uY2UgdXBwZXIgYW5kIG9uY2UgbG93ZXIgY2FzZS4qLwotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19pbml0ICgpCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGtpbmZvW2ldLm5hbWU7IGkrKykKLSAgICBhZGRfa2V5d29yZCAoa2luZm9baV0ubmFtZSwga2luZm9baV0uY29kZSk7Ci0KLSAgaWYgKG1yaSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBtcmlraW5mb1tpXS5uYW1lOyBpKyspCi0JYWRkX2tleXdvcmQgKG1yaWtpbmZvW2ldLm5hbWUsIG1yaWtpbmZvW2ldLmNvZGUpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fZGVmaW5lIChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc2IgbGFiZWw7Ci0gIGludCByZXMgPSAxOwotICBoYXNoX2VudHJ5ICpwdHI7Ci0gIHNiX25ldyAoJmxhYmVsKTsKLQotCi0gIHdoaWxlICgqc3RyaW5nKQotICAgIHsKLSAgICAgIGlmICgqc3RyaW5nID09ICc9JykgCi0JewotCSAgc2IgdmFsdWU7Ci0JICBzYl9uZXcgKCZ2YWx1ZSk7Ci0JICBzdHJpbmcrKzsKLQkgIHdoaWxlICgqc3RyaW5nKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKCZ2YWx1ZSwgKnN0cmluZyk7Ci0JICAgICAgc3RyaW5nKys7Ci0JICAgIH0KLQkgIGV4cF9nZXRfYWJzIChfKCJJbnZhbGlkIGV4cHJlc3Npb24gb24gY29tbWFuZCBsaW5lLlxuIiksIDAsICZ2YWx1ZSwgJnJlcyk7Ci0JICBzYl9raWxsICgmdmFsdWUpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgc2JfYWRkX2NoYXIgKCZsYWJlbCwgKnN0cmluZyk7Ci0KLSAgICAgIHN0cmluZyArKzsKLSAgICB9Ci0KLSAgcHRyID0gaGFzaF9jcmVhdGUgKCZ2YXJzLCAmbGFiZWwpOwotICBmcmVlX29sZF9lbnRyeSAocHRyKTsKLSAgcHRyLT50eXBlID0gaGFzaF9pbnRlZ2VyOwotICBwdHItPnZhbHVlLmkgPSByZXM7Ci0gIHNiX2tpbGwgKCZsYWJlbCk7Ci19Ci1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFRoZSBsaXN0IG9mIGxvbmcgb3B0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsgImFsdGVybmF0ZSIsIG5vX2FyZ3VtZW50LCAwLCAnYScgfSwKLSAgeyAiaW5jbHVkZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSScgfSwKLSAgeyAiY29tbWVudGNoYXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2MnIH0sCi0gIHsgImNvcHlzb3VyY2UiLCBub19hcmd1bWVudCwgMCwgJ3MnIH0sCi0gIHsgImRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdkJyB9LAotICB7ICJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJyB9LAotICB7ICJtcmkiLCBub19hcmd1bWVudCwgMCwgJ00nIH0sCi0gIHsgIm91dHB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbycgfSwKLSAgeyAicHJpbnQiLCBub19hcmd1bWVudCwgMCwgJ3AnIH0sCi0gIHsgInVucmVhc29uYWJsZSIsIG5vX2FyZ3VtZW50LCAwLCAndScgfSwKLSAgeyAidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAndicgfSwKLSAgeyAiZGVmaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdkJyB9LAotICB7IE5VTEwsIG5vX2FyZ3VtZW50LCAwLCAwIH0KLX07Ci0KLS8qIFNob3cgYSB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlwKLVVzYWdlOiAlcyBcblwKLSAgWy1hXSAgICAgIFstLWFsdGVybmF0ZV0gICAgICAgICBlbnRlciBhbHRlcm5hdGUgbWFjcm8gbW9kZVxuXAotICBbLWMgY2hhcl0gWy0tY29tbWVudGNoYXIgY2hhcl0gIGNoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIgZnJvbSAhXG5cCi0gIFstZF0gICAgICBbLS1kZWJ1Z10gICAgICAgICAgICAgcHJpbnQgc29tZSBkZWJ1Z2dpbmcgaW5mb1xuXAotICBbLWhdICAgICAgWy0taGVscF0gICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZVxuXAotICBbLU1dICAgICAgWy0tbXJpXSAgICAgICAgICAgICAgIGVudGVyIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcblwKLSAgWy1vIG91dF0gIFstLW91dHB1dCBvdXRdICAgICAgICBzZXQgdGhlIG91dHB1dCBmaWxlXG5cCi0gIFstcF0gICAgICBbLS1wcmludF0gICAgICAgICAgICAgcHJpbnQgbGluZSBudW1iZXJzXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiXAotICBbLXNdICAgICAgWy0tY29weXNvdXJjZV0gICAgICAgIGNvcHkgc291cmNlIHRocm91Z2ggYXMgY29tbWVudHMgXG5cCi0gIFstdV0gICAgICBbLS11bnJlYXNvbmFibGVdICAgICAgYWxsb3cgdW5yZWFzb25hYmxlIG5lc3RpbmdcblwKLSAgWy12XSAgICAgIFstLXZlcnNpb25dICAgICAgICAgICBwcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uXG5cCi0gIFstRG5hbWU9dmFsdWVdICAgICAgICAgICAgICAgICAgY3JlYXRlIHByZXByb2Nlc3NvciB2YXJpYWJsZSBjYWxsZWQgbmFtZSwgd2l0aCB2YWx1ZVxuXAotICBbLUlwYXRoXSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCB0byBpbmNsdWRlIHBhdGggbGlzdFxuXAotICBbaW4tZmlsZV1cbiIpKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHByaW50ZiAoXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogRGlzcGxheSBhIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4gICovCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IEdudSBBc3NlbWJsZXIgTWFjcm8gUHJlcHJvY2Vzc29yXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgb3B0OwotICBjaGFyICpvdXRfbmFtZSA9IDA7Ci0gIHNwID0gaW5jbHVkZV9zdGFjazsKLQotICBpZnN0YWNrWzBdLm9uID0gMTsKLSAgaWZpID0gMDsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBoYXNoX25ld190YWJsZSAoMTAxLCAma2V5d29yZF9oYXNoX3RhYmxlKTsKLSAgaGFzaF9uZXdfdGFibGUgKDEwMSwgJmFzc2lnbl9oYXNoX3RhYmxlKTsKLSAgaGFzaF9uZXdfdGFibGUgKDEwMSwgJnZhcnMpOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiSTpzZGhhdmM6dXBvOkQ6TSIsIGxvbmdfb3B0aW9ucywKLQkJCSAgICAgKGludCAqKSBOVUxMKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdvJzoKLQkgIG91dF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JICB1bnJlYXNvbmFibGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JICB7Ci0JICAgIGluY2x1ZGVfcGF0aCAqcCA9IChpbmNsdWRlX3BhdGggKikgeG1hbGxvYyAoc2l6ZW9mIChpbmNsdWRlX3BhdGgpKTsKLQkgICAgcC0+bmV4dCA9IE5VTEw7Ci0JICAgIHNiX25ldyAoJnAtPnBhdGgpOwotCSAgICBzYl9hZGRfc3RyaW5nICgmcC0+cGF0aCwgb3B0YXJnKTsKLQkgICAgaWYgKHBhdGhzX3RhaWwpCi0JICAgICAgcGF0aHNfdGFpbC0+bmV4dCA9IHA7Ci0JICAgIGVsc2UKLQkgICAgICBwYXRoc19oZWFkID0gcDsKLQkgICAgcGF0aHNfdGFpbCA9IHA7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIHByaW50X2xpbmVfbnVtYmVyID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgY29tbWVudF9jaGFyID0gb3B0YXJnWzBdOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBhbHRlcm5hdGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBjb3B5c291cmNlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgc3RhdHMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkb19kZWZpbmUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdNJzoKLQkgIG1yaSA9IDE7Ci0JICBjb21tZW50X2NoYXIgPSAnOyc7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAndic6Ci0JICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotCSAgcHJpbnRmIChfKCJHTlUgYXNzZW1ibGVyIHByZS1wcm9jZXNzb3IgJXNcbiIpLCBwcm9ncmFtX3ZlcnNpb24pOwotCSAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKLQkgIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEKi8KLQl9Ci0gICAgfQotCi0gIHByb2Nlc3NfaW5pdCAoKTsKLQotICBtYWNyb19pbml0IChhbHRlcm5hdGUsIG1yaSwgMCwgZXhwX2dldF9hYnMpOwotCi0gIGlmIChvdXRfbmFtZSkgewotICAgIG91dGZpbGUgPSBmb3BlbiAob3V0X25hbWUsICJ3Iik7Ci0gICAgaWYgKCFvdXRmaWxlKQotICAgICAgewotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gb3V0cHV0IGZpbGUgYCVzJy5cbiIpLAotCQkgcHJvZ3JhbV9uYW1lLCBvdXRfbmFtZSk7Ci0JZXhpdCAoMSk7Ci0gICAgICB9Ci0gIH0KLSAgZWxzZSAgewotICAgIG91dGZpbGUgPSBzdGRvdXQ7Ci0gIH0KLQotICBjaGFydHlwZV9pbml0ICgpOwotICBpZiAoIW91dGZpbGUpCi0gICAgb3V0ZmlsZSA9IHN0ZG91dDsKLQotICAvKiBQcm9jZXNzIGFsbCB0aGUgaW5wdXQgZmlsZXMgKi8KLQotICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBpZiAobmV3X2ZpbGUgKGFyZ3Zbb3B0aW5kXSkpCi0JewotCSAgcHJvY2Vzc19maWxlICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBvcGVuIGlucHV0IGZpbGUgYCVzJy5cbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGFyZ3Zbb3B0aW5kXSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBvcHRpbmQrKzsKLSAgICB9Ci0KLSAgcXVpdCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBiZWNhdXNlIGFuIGFib3J0IGluIHNvbWUgb2YgdGhlIG90aGVyIGZpbGVzCi0gICBtYXkgYmUgY29tcGlsZWQgaW50byBhc19hYm9ydCBiZWNhdXNlIHRoZXkgaW5jbHVkZSBhcy5oLiAgKi8KLQotdm9pZAotYXNfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlLCAqZm47Ci0gICAgIGludCBsaW5lOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkIiksIGZpbGUsIGxpbmUpOwotICBpZiAoZm4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIGluICVzIiwgZm4pOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIlxuUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIpKTsKLSAgZXhpdCAoMSk7Ci19CmRpZmYgLS1naXQgYS9nYXMvZ2RiaW5pdC5pbiBiL2dhcy9nZGJpbml0LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQ2NzI2Li4wMDAwMDAwCi0tLSBhL2dhcy9nZGJpbml0LmluCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotZGlyIEBzcmNkaXJACi1kaXIgLgotCi1icmVhayBhc193YXJuCi1icmVhayBhc193YXJuX3doZXJlCi1icmVhayBhc19iYWQKLWJyZWFrIGFzX2JhZF93aGVyZQotYnJlYWsgYXNfZmF0YWwKLWJyZWFrIGFzX3BlcnJvcgotYnJlYWsgYXNfYXNzZXJ0Ci1icmVhayBhc19hYm9ydAotCi1kZWZpbmUgcGUKLWNhbGwgcHJpbnRfZXhwciAoJCkKLWVuZAotCi1kb2N1bWVudCBwZQotUHJpbnQgKiQgYXMgYW4gZXhwcmVzc2lvblMsIGV4cGFuZGluZyBwYXJhbWV0ZXJzLgotZW5kCi0KLWRlZmluZSBwcwotY2FsbCBwcmludF9zeW1ib2xfdmFsdWUgKCQpCi1lbmQKLQotZG9jdW1lbnQgcHMKLVByaW50ICokIGFzIGEgc3ltYm9sUywgaW5jbHVkaW5nIGV4cHJlc3Npb24gdmFsdWUuCi1lbmQKLQotZGVmaW5lIHBmCi1jYWxsIHByaW50X2ZpeHVwICgkKQotZW5kCi0KLWRvY3VtZW50IHBmCi1QcmludCAqJCBhcyBhIGZpeFMsIGluY2x1ZGluZyBzeW1ib2wgdmFsdWUuCi1lbmQKLQotIyBQdXQgdGhpcyBsYXN0LCBpbiBjYXNlIGl0IGZhaWxzLgotCi1icmVhayBhYm9ydApkaWZmIC0tZ2l0IGEvZ2FzL2hhc2guYyBiL2dhcy9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDY2MzMuLjAwMDAwMDAKLS0tIGEvZ2FzL2hhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKiBoYXNoLmMgLS0gZ2FzIGhhc2ggdGFibGUgY29kZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHZlcnNpb24gb2YgdGhlIGhhc2ggdGFibGUgY29kZSBpcyBhIHdob2xlc2NhbGUgcmVwbGFjZW1lbnQgb2YKLSAgIHRoZSBvbGQgaGFzaCB0YWJsZSBjb2RlLCB3aGljaCB3YXMgZmFpcmx5IGJhZC4gIFRoaXMgaXMgYmFzZWQgb24KLSAgIHRoZSBoYXNoIHRhYmxlIGNvZGUgaW4gQkZELCBidXQgb3B0aW1pemVkIHNsaWdodGx5IGZvciB0aGUKLSAgIGFzc3NlbWJsZXIuICBUaGUgYXNzZW1ibGVyIGRvZXMgbm90IG5lZWQgdG8gZGVyaXZlIHN0cnVjdHVyZXMgdGhhdAotICAgYXJlIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4gIEluc3RlYWQsIGl0IGFsd2F5cyBzdG9yZXMgYSBwb2ludGVyLgotICAgVGhlIGFzc2VtYmxlciB1c2VzIHRoZSBoYXNoIHRhYmxlIG1vc3RseSB0byBzdG9yZSBzeW1ib2xzLCBhbmQgd2UKLSAgIGRvbid0IG5lZWQgdG8gY29uZnVzZSB0aGUgc3ltYm9sIHN0cnVjdHVyZSB3aXRoIGEgaGFzaCB0YWJsZQotICAgc3RydWN0dXJlLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgZW50cmllcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIERFRkFVTFRfU0laRSAoNDA1MSkKLQotLyogQW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGhhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogU3RyaW5nIGJlaW5nIGhhc2hlZC4gICovCi0gIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgLyogSGFzaCBjb2RlLiAgVGhpcyBpcyB0aGUgZnVsbCBoYXNoIGNvZGUsIG5vdCB0aGUgaW5kZXggaW50byB0aGUKLSAgICAgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIC8qIFBvaW50ZXIgYmVpbmcgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgUFRSIGRhdGE7Ci19OwotCi0vKiBBIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgaGFzaF9jb250cm9sCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGhhc2hfZW50cnkgKip0YWJsZTsKLSAgLyogVGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBBbiBvYnN0YWNrIGZvciB0aGlzIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgb2JzdGFjayBtZW1vcnk7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgLyogU3RhdGlzdGljcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbG9va3VwczsKLSAgdW5zaWduZWQgbG9uZyBoYXNoX2NvbXBhcmVzOwotICB1bnNpZ25lZCBsb25nIHN0cmluZ19jb21wYXJlczsKLSAgdW5zaWduZWQgbG9uZyBpbnNlcnRpb25zOwotICB1bnNpZ25lZCBsb25nIHJlcGxhY2VtZW50czsKLSAgdW5zaWduZWQgbG9uZyBkZWxldGlvbnM7Ci0jZW5kaWYgLyogSEFTSF9TVEFUSVNUSUNTICovCi19OwotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm4gYSBjb250cm9sIGJsb2NrLiAgKi8KLQotc3RydWN0IGhhc2hfY29udHJvbCAqCi1oYXNoX25ldyAoKQotewotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgc3RydWN0IGhhc2hfY29udHJvbCAqcmV0OwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgc2l6ZSA9IERFRkFVTFRfU0laRTsKLQotICByZXQgPSAoc3RydWN0IGhhc2hfY29udHJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIG9ic3RhY2tfYmVnaW4gKCZyZXQtPm1lbW9yeSwgY2h1bmtzaXplKTsKLSAgYWxsb2MgPSBzaXplICogc2l6ZW9mIChzdHJ1Y3QgaGFzaF9lbnRyeSAqKTsKLSAgcmV0LT50YWJsZSA9IChzdHJ1Y3QgaGFzaF9lbnRyeSAqKikgb2JzdGFja19hbGxvYyAoJnJldC0+bWVtb3J5LCBhbGxvYyk7Ci0gIG1lbXNldCAocmV0LT50YWJsZSwgMCwgYWxsb2MpOwotICByZXQtPnNpemUgPSBzaXplOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gIHJldC0+bG9va3VwcyA9IDA7Ci0gIHJldC0+aGFzaF9jb21wYXJlcyA9IDA7Ci0gIHJldC0+c3RyaW5nX2NvbXBhcmVzID0gMDsKLSAgcmV0LT5pbnNlcnRpb25zID0gMDsKLSAgcmV0LT5yZXBsYWNlbWVudHMgPSAwOwotICByZXQtPmRlbGV0aW9ucyA9IDA7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OyAgCi19Ci0KLS8qIERlbGV0ZSBhIGhhc2ggdGFibGUsIGZyZWVpbmcgYWxsIGFsbG9jYXRlZCBtZW1vcnkuICAqLwotCi12b2lkCi1oYXNoX2RpZSAodGFibGUpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlOwotewotICBvYnN0YWNrX2ZyZWUgKCZ0YWJsZS0+bWVtb3J5LCAwKTsKLSAgZnJlZSAodGFibGUpOwotfQotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCi0gICBoYXNoX2VudHJ5LCBvciBOVUxMIGlmIHRoZSBzdHJpbmcgaXMgbm90IGluIHRoZSB0YWJsZS4gIElmIFBMSVNUIGlzCi0gICBub3QgTlVMTCwgdGhpcyBzZXRzICpQTElTVCB0byBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3Qgd2hpY2gKLSAgIHdvdWxkIGhvbGQgdGhpcyBoYXNoIGVudHJ5LiAgSWYgUEhBU0ggaXMgbm90IE5VTEwsIHRoaXMgc2V0cyAqUEhBU0gKLSAgIHRvIHRoZSBoYXNoIGNvZGUgZm9yIEtFWS4KLQotICAgRWFjaCB0aW1lIHdlIGxvb2sgdXAgYSBzdHJpbmcsIHdlIG1vdmUgaXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0Ci0gICBmb3IgaXRzIGhhc2ggY29kZSwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgcmVmZXJlbnRpYWwgbG9jYWxpdHkuICAqLwotCi1zdGF0aWMgc3RydWN0IGhhc2hfZW50cnkgKmhhc2hfbG9va3VwIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBoYXNoX2VudHJ5ICoqKiwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKikpOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfZW50cnkgKgotaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksIHBsaXN0LCBwaGFzaCkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgc3RydWN0IGhhc2hfZW50cnkgKioqcGxpc3Q7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBoYXNoOwotewotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICoqbGlzdDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwcmV2OwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPmxvb2t1cHM7Ci0jZW5kaWYKLQotICBoYXNoID0gMDsKLSAgbGVuID0gMDsKLSAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGtleTsKLSAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBoYXNoICs9IGMgKyAoYyA8PCAxNyk7Ci0gICAgICBoYXNoIF49IGhhc2ggPj4gMjsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgaGFzaCArPSBsZW4gKyAobGVuIDw8IDE3KTsKLSAgaGFzaCBePSBoYXNoID4+IDI7Ci0KLSAgaWYgKHBoYXNoICE9IE5VTEwpCi0gICAgKnBoYXNoID0gaGFzaDsKLQotICBpbmRleCA9IGhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgbGlzdCA9IHRhYmxlLT50YWJsZSArIGluZGV4OwotCi0gIGlmIChwbGlzdCAhPSBOVUxMKQotICAgICpwbGlzdCA9IGxpc3Q7Ci0KLSAgcHJldiA9IE5VTEw7Ci0gIGZvciAocCA9ICpsaXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgICAgICsrdGFibGUtPmhhc2hfY29tcGFyZXM7Ci0jZW5kaWYKLQotICAgICAgaWYgKHAtPmhhc2ggPT0gaGFzaCkKLQl7Ci0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0JICArK3RhYmxlLT5zdHJpbmdfY29tcGFyZXM7Ci0jZW5kaWYKLQotCSAgaWYgKHN0cmNtcCAocC0+c3RyaW5nLCBrZXkpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAocHJldiAhPSBOVUxMKQotCQl7Ci0JCSAgcHJldi0+bmV4dCA9IHAtPm5leHQ7Ci0JCSAgcC0+bmV4dCA9ICpsaXN0OwotCQkgICpsaXN0ID0gcDsKLQkJfQotCi0JICAgICAgcmV0dXJuIHA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByZXYgPSBwOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW5zZXJ0IGFuIGVudHJ5IGludG8gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIE5VTEwgb24gc3VjY2Vzcy4KLSAgIE9uIGVycm9yLCBpdCByZXR1cm5zIGEgcHJpbnRhYmxlIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBlcnJvci4gIEl0Ci0gICBpcyBjb25zaWRlcmVkIHRvIGJlIGFuIGVycm9yIGlmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKLSAgIGhhc2ggdGFibGUuICAqLwotCi1jb25zdCBjaGFyICoKLWhhc2hfaW5zZXJ0ICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0KLSAgcCA9IGhhc2hfbG9va3VwICh0YWJsZSwga2V5LCAmbGlzdCwgJmhhc2gpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHJldHVybiAiZXhpc3RzIjsKLQotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICArK3RhYmxlLT5pbnNlcnRpb25zOwotI2VuZGlmCi0KLSAgcCA9IG9ic3RhY2tfYWxsb2MgKCZ0YWJsZS0+bWVtb3J5LCBzaXplb2YgKnApOwotICBwLT5zdHJpbmcgPSBrZXk7Ci0gIHAtPmhhc2ggPSBoYXNoOwotICBwLT5kYXRhID0gdmFsdWU7Ci0KLSAgcC0+bmV4dCA9ICpsaXN0OwotICAqbGlzdCA9IHA7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluc2VydCBvciByZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBOVUxMIG9uCi0gICBzdWNjZXNzLiAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlCi0gICBlcnJvci4gIElmIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWUgaXMgcmVwbGFjZWQuICAqLwotCi1jb25zdCBjaGFyICoKLWhhc2hfamFtICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0KLSAgcCA9IGhhc2hfbG9va3VwICh0YWJsZSwga2V5LCAmbGlzdCwgJmhhc2gpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgICAgICsrdGFibGUtPnJlcGxhY2VtZW50czsKLSNlbmRpZgotCi0gICAgICBwLT5kYXRhID0gdmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAgICAgKyt0YWJsZS0+aW5zZXJ0aW9uczsKLSNlbmRpZgotCi0gICAgICBwID0gb2JzdGFja19hbGxvYyAoJnRhYmxlLT5tZW1vcnksIHNpemVvZiAqcCk7Ci0gICAgICBwLT5zdHJpbmcgPSBrZXk7Ci0gICAgICBwLT5oYXNoID0gaGFzaDsKLSAgICAgIHAtPmRhdGEgPSB2YWx1ZTsKLQotICAgICAgcC0+bmV4dCA9ICpsaXN0OwotICAgICAgKmxpc3QgPSBwOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIG9sZAotICAgdmFsdWUgc3RvcmVkIGZvciB0aGUgZW50cnkuICBJZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoCi0gICB0YWJsZSwgdGhpcyBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgTlVMTC4gICovCi0KLVBUUgotaGFzaF9yZXBsYWNlICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgUFRSIHJldDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksIE5VTEwsIE5VTEwpOwotICBpZiAocCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPnJlcGxhY2VtZW50czsKLSNlbmRpZgotCi0gIHJldCA9IHAtPmRhdGE7Ci0KLSAgcC0+ZGF0YSA9IHZhbHVlOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEZpbmQgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLCByZXR1cm5pbmcgaXRzIHZhbHVlLiAgUmV0dXJucyBOVUxMCi0gICBpZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kLiAgKi8KLQotUFRSCi1oYXNoX2ZpbmQgKHRhYmxlLCBrZXkpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICprZXk7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotCi0gIHAgPSBoYXNoX2xvb2t1cCAodGFibGUsIGtleSwgTlVMTCwgTlVMTCk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIHAtPmRhdGE7Ci19Ci0KLS8qIERlbGV0ZSBhbiBlbnRyeSBmcm9tIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkCi0gICBmb3IgdGhhdCBlbnRyeSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWNoIGVudHJ5LiAgKi8KLQotUFRSCi1oYXNoX2RlbGV0ZSAodGFibGUsIGtleSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICoqbGlzdDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksICZsaXN0LCBOVUxMKTsKLSAgaWYgKHAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAocCAhPSAqbGlzdCkKLSAgICBhYm9ydCAoKTsKLQotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICArK3RhYmxlLT5kZWxldGlvbnM7Ci0jZW5kaWYKLQotICAqbGlzdCA9IHAtPm5leHQ7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIG5ldmVyIHJlY2xhaW0gdGhlIG1lbW9yeSBmb3IgdGhpcyBlbnRyeS4gIElmIGdhcwotICAgICBldmVyIHN0YXJ0cyBkZWxldGluZyBoYXNoIHRhYmxlIGVudHJpZXMgaW4gYSBiaWcgd2F5LCB0aGlzIHdpbGwKLSAgICAgaGF2ZSB0byBjaGFuZ2UuICAqLwotCi0gIHJldHVybiBwLT5kYXRhOwotfQotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUuICBDYWxsIHRoZSBmdW5jdGlvbiBvbiBldmVyeSBlbnRyeSBpbiB0aGUKLSAgIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1oYXNoX3RyYXZlcnNlICh0YWJsZSwgcGZuKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgdm9pZCAoKnBmbikgUEFSQU1TICgoY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyArK2kpCi0gICAgewotICAgICAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0KLSAgICAgIGZvciAocCA9IHRhYmxlLT50YWJsZVtpXTsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkoKnBmbikgKHAtPnN0cmluZywgcC0+ZGF0YSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBoYXNoIHRhYmxlIHN0YXRpc3RpY3Mgb24gdGhlIHNwZWNpZmllZCBmaWxlLiAgTkFNRSBpcyB0aGUKLSAgIG5hbWUgb2YgdGhlIGhhc2ggdGFibGUsIHVzZWQgZm9yIHByaW50aW5nIGEgaGVhZGVyLiAgKi8KLQotdm9pZAotaGFzaF9wcmludF9zdGF0aXN0aWNzIChmLCBuYW1lLCB0YWJsZSkKLSAgICAgRklMRSAqZjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci17Ci0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotICB1bnNpZ25lZCBsb25nIGVtcHR5OwotCi0gIGZwcmludGYgKGYsICIlcyBoYXNoIHN0YXRpc3RpY3M6XG4iLCBuYW1lKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGxvb2t1cHNcbiIsIHRhYmxlLT5sb29rdXBzKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGhhc2ggY29tcGFyaXNvbnNcbiIsIHRhYmxlLT5oYXNoX2NvbXBhcmVzKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IHN0cmluZyBjb21wYXJpc29uc1xuIiwgdGFibGUtPnN0cmluZ19jb21wYXJlcyk7Ci0gIGZwcmludGYgKGYsICJcdCVsdSBpbnNlcnRpb25zXG4iLCB0YWJsZS0+aW5zZXJ0aW9ucyk7Ci0gIGZwcmludGYgKGYsICJcdCVsdSByZXBsYWNlbWVudHNcbiIsIHRhYmxlLT5yZXBsYWNlbWVudHMpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgZGVsZXRpb25zXG4iLCB0YWJsZS0+ZGVsZXRpb25zKTsKLQotICB0b3RhbCA9IDA7Ci0gIGVtcHR5ID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyArK2kpCi0gICAgewotICAgICAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0KLSAgICAgIGlmICh0YWJsZS0+dGFibGVbaV0gPT0gTlVMTCkKLQkrK2VtcHR5OwotICAgICAgZWxzZQotCXsKLQkgIGZvciAocCA9IHRhYmxlLT50YWJsZVtpXTsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkgICAgKyt0b3RhbDsKLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGYsICJcdCVnIGF2ZXJhZ2UgY2hhaW4gbGVuZ3RoXG4iLCAoZG91YmxlKSB0b3RhbCAvIHRhYmxlLT5zaXplKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGVtcHR5IHNsb3RzXG4iLCBlbXB0eSk7Ci0jZW5kaWYKLX0KLQwKLSNpZmRlZiBURVNUCi0KLS8qIFRoaXMgdGVzdCBwcm9ncmFtIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBvbGQgaGFzaCB0YWJsZSBjb2RlLiAgKi8KLQotI2RlZmluZSBUQUJMRVMgKDYpCQkvKiBudW1iZXIgb2YgaGFzaCB0YWJsZXMgdG8gbWFpbnRhaW4gKi8KLQkJCQkvKiAoYXQgb25jZSkgaW4gYW55IHRlc3RpbmcgKi8KLSNkZWZpbmUgU1RBVEJVRlNJWkUgKDEyKQkvKiB3ZSBjYW4gaGF2ZSAxMiBzdGF0aXN0aWNzICovCi0KLWludCBzdGF0YnVmW1NUQVRCVUZTSVpFXTsJLyogZGlzcGxheSBzdGF0aXN0aWNzIGhlcmUgKi8KLWNoYXIgYW5zd2VyWzEwMF07CQkvKiBodW1hbiBmYXJ0cyBoZXJlICovCi1jaGFyICpoYXNodGFibGVbVEFCTEVTXTsJLyogd2UgdGVzdCBtYW55IGhhc2ggdGFibGVzIGF0IG9uY2UgKi8KLWNoYXIgKmg7CQkJLyogcG9pbnRzIHRvIGN1cmVudCBoYXNoX2NvbnRyb2wgKi8KLWNoYXIgKipwcDsKLWNoYXIgKnA7Ci1jaGFyICpuYW1lOwotY2hhciAqdmFsdWU7Ci1pbnQgc2l6ZTsKLWludCB1c2VkOwotY2hhciBjb21tYW5kOwotaW50IG51bWJlcjsJCQkvKiBudW1iZXIgMDpUQUJMRVMtMSBvZiBjdXJyZW50IGhhc2hlZCAqLwotCQkJCS8qIHN5bWJvbCB0YWJsZSAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSAgdm9pZCBhcHBsaWNhdGVlICgpOwotICB2b2lkIGRlc3Ryb3kgKCk7Ci0gIGNoYXIgKndoYXQgKCk7Ci0gIGludCAqaXA7Ci0KLSAgbnVtYmVyID0gMDsKLSAgaCA9IDA7Ci0gIHByaW50ZiAoInR5cGUgaCA8UkVUVVJOPiBmb3IgaGVscFxuIik7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgcHJpbnRmICgiaGFzaF90ZXN0IGNvbW1hbmQ6ICIpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIGNvbW1hbmQgPSBhbnN3ZXJbMF07Ci0gICAgICBpZiAoaXN1cHBlciAoY29tbWFuZCkpCi0JY29tbWFuZCA9IHRvbG93ZXIgKGNvbW1hbmQpOwkvKiBlY2NoISAqLwotICAgICAgc3dpdGNoIChjb21tYW5kKQotCXsKLQljYXNlICcjJzoKLQkgIHByaW50ZiAoIm9sZCBoYXNoIHRhYmxlICM9JWQuXG4iLCBudW1iZXIpOwotCSAgd2hhdHRhYmxlICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAnPyc6Ci0JICBmb3IgKHBwID0gaGFzaHRhYmxlOyBwcCA8IGhhc2h0YWJsZSArIFRBQkxFUzsgcHArKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoImFkZHJlc3Mgb2YgaGFzaCB0YWJsZSAjJWQgY29udHJvbCBibG9jayBpcyAleHhcbiIKLQkJICAgICAgLHBwIC0gaGFzaHRhYmxlLCAqcHApOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIGhhc2hfdHJhdmVyc2UgKGgsIGFwcGxpY2F0ZWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBoYXNoX3RyYXZlcnNlIChoLCBkZXN0cm95KTsKLQkgIGhhc2hfZGllIChoKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgcCA9IGhhc2hfZmluZCAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSk7Ci0JICBwcmludGYgKCJ2YWx1ZSBvZiBcIiVzXCIgaXMgXCIlc1wiXG4iLCBuYW1lLCBwID8gcCA6ICJOT1QtUFJFU0VOVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBwcmludGYgKCIjIHNob3cgb2xkLCBzZWxlY3QgbmV3IGRlZmF1bHQgaGFzaCB0YWJsZSBudW1iZXJcbiIpOwotCSAgcHJpbnRmICgiPyBkaXNwbGF5IGFsbCBoYXNodGFibGUgY29udHJvbCBibG9jayBhZGRyZXNzZXNcbiIpOwotCSAgcHJpbnRmICgiYSBhcHBseSBhIHNpbXBsZSBkaXNwbGF5LWVyIHRvIGVhY2ggc3ltYm9sIGluIHRhYmxlXG4iKTsKLQkgIHByaW50ZiAoImQgZGllOiBkZXN0cm95IGhhc2h0YWJsZVxuIik7Ci0JICBwcmludGYgKCJmIGZpbmQgdmFsdWUgb2Ygbm9taW5hdGVkIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJoIHRoaXMgaGVscFxuIik7Ci0JICBwcmludGYgKCJpIGluc2VydCB2YWx1ZSBpbnRvIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJqIGphbSB2YWx1ZSBpbnRvIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJuIG5ldyBoYXNodGFibGVcbiIpOwotCSAgcHJpbnRmICgiciByZXBsYWNlIGEgdmFsdWUgd2l0aCBhbm90aGVyXG4iKTsKLQkgIHByaW50ZiAoInMgc2F5IHdoYXQgJSUgb2YgdGFibGUgaXMgdXNlZFxuIik7Ci0JICBwcmludGYgKCJxIGV4aXQgdGhpcyBwcm9ncmFtXG4iKTsKLQkgIHByaW50ZiAoInggZGVsZXRlIGEgc3ltYm9sIGZyb20gdGFibGUsIHJlcG9ydCBpdHMgdmFsdWVcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBwID0gaGFzaF9pbnNlcnQgKGgsIG5hbWUgPSB3aGF0ICgic3ltYm9sIiksIHZhbHVlID0gd2hhdCAoInZhbHVlIikpOwotCSAgaWYgKHApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJzeW1ib2w9XCIlc1wiICB2YWx1ZT1cIiVzXCIgIGVycm9yPSVzXG4iLCBuYW1lLCB2YWx1ZSwKLQkJICAgICAgcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2onOgotCSAgcCA9IGhhc2hfamFtIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpLCB2YWx1ZSA9IHdoYXQgKCJ2YWx1ZSIpKTsKLQkgIGlmIChwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgic3ltYm9sPVwiJXNcIiAgdmFsdWU9XCIlc1wiICBlcnJvcj0lc1xuIiwgbmFtZSwgdmFsdWUsIHApOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGggPSBoYXNodGFibGVbbnVtYmVyXSA9IChjaGFyICopIGhhc2hfbmV3ICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6Ci0JICBleGl0IChFWElUX1NVQ0NFU1MpOwotCWNhc2UgJ3InOgotCSAgcCA9IGhhc2hfcmVwbGFjZSAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSwgdmFsdWUgPSB3aGF0ICgidmFsdWUiKSk7Ci0JICBwcmludGYgKCJvbGQgdmFsdWUgd2FzIFwiJXNcIlxuIiwgcCA/IHAgOiAie30iKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgaGFzaF9zYXkgKGgsIHN0YXRidWYsIFNUQVRCVUZTSVpFKTsKLQkgIGZvciAoaXAgPSBzdGF0YnVmOyBpcCA8IHN0YXRidWYgKyBTVEFUQlVGU0laRTsgaXArKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVkICIsICppcCk7Ci0JICAgIH0KLQkgIHByaW50ZiAoIlxuIik7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIHAgPSBoYXNoX2RlbGV0ZSAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSk7Ci0JICBwcmludGYgKCJvbGQgdmFsdWUgd2FzIFwiJXNcIlxuIiwgcCA/IHAgOiAie30iKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBwcmludGYgKCJJIGNhbid0IHVuZGVyc3RhbmQgY29tbWFuZCBcIiVjXCJcbiIsIGNvbW1hbmQpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotY2hhciAqCi13aGF0IChkZXNjcmlwdGlvbikKLSAgICAgY2hhciAqZGVzY3JpcHRpb247Ci17Ci0gIGNoYXIgKnJldHZhbDsKLSAgY2hhciAqbWFsbG9jICgpOwotCi0gIHByaW50ZiAoIiAgICVzIDogIiwgZGVzY3JpcHRpb24pOwotICBnZXRzIChhbnN3ZXIpOwotICAvKiB3aWxsIG9uZSBkYXkgY2xlYW4gdXAgYW5zd2VyIGhlcmUgKi8KLSAgcmV0dmFsID0gbWFsbG9jIChzdHJsZW4gKGFuc3dlcikgKyAxKTsKLSAgaWYgKCFyZXR2YWwpCi0gICAgewotICAgICAgZXJyb3IgKCJyb29tIik7Ci0gICAgfQotICAodm9pZCkgc3RyY3B5IChyZXR2YWwsIGFuc3dlcik7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQotdm9pZAotZGVzdHJveSAoc3RyaW5nLCB2YWx1ZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBjaGFyICp2YWx1ZTsKLXsKLSAgZnJlZSAoc3RyaW5nKTsKLSAgZnJlZSAodmFsdWUpOwotfQotCi0KLXZvaWQKLWFwcGxpY2F0ZWUgKHN0cmluZywgdmFsdWUpCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgY2hhciAqdmFsdWU7Ci17Ci0gIHByaW50ZiAoIiUuMjBzLSUuMjBzXG4iLCBzdHJpbmcsIHZhbHVlKTsKLX0KLQotdm9pZAotd2hhdHRhYmxlICgpCQkJLyogZGV0ZXJtaW5lIG51bWJlcjogd2hhdCBoYXNoIHRhYmxlIHRvIHVzZSAqLwotCQkJICAgICAgICAvKiBhbHNvIGRldGVybWluZSBoOiBwb2ludHMgdG8gaGFzaF9jb250cm9sICovCi17Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwcmludGYgKCIgICB3aGF0IGhhc2ggdGFibGUgKCVkOiVkKSA/ICAiLCAwLCBUQUJMRVMgLSAxKTsKLSAgICAgIGdldHMgKGFuc3dlcik7Ci0gICAgICBzc2NhbmYgKGFuc3dlciwgIiVkIiwgJm51bWJlcik7Ci0gICAgICBpZiAobnVtYmVyID49IDAgJiYgbnVtYmVyIDwgVEFCTEVTKQotCXsKLQkgIGggPSBoYXNodGFibGVbbnVtYmVyXTsKLQkgIGlmICghaCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIndhcm5pbmc6IGN1cnJlbnQgaGFzaC10YWJsZS0jJWQuIGhhcyBubyBoYXNoLWNvbnRyb2xcbiIsIG51bWJlcik7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiaW52YWxpZCBoYXNoIHRhYmxlIG51bWJlcjogJWRcbiIsIG51bWJlcik7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qICNpZmRlZiBURVNUICovCi0KLS8qIGVuZCBvZiBoYXNoLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9oYXNoLmggYi9nYXMvaGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU5ZDlmLi4wMDAwMDAwCi0tLSBhL2dhcy9oYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBoYXNoLmggLS0gaGVhZGVyIGZpbGUgZm9yIGdhcyBoYXNoIHRhYmxlIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSEFTSF9ICi0jZGVmaW5lIEhBU0hfSAotCi1zdHJ1Y3QgaGFzaF9jb250cm9sOwotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm4gYSBjb250cm9sIGJsb2NrLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfbmV3IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRGVsZXRlIGEgaGFzaCB0YWJsZSwgZnJlZWluZyBhbGwgYWxsb2NhdGVkIG1lbW9yeS4gICovCi0KLWV4dGVybiB2b2lkIGhhc2hfZGllIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikpOwotCi0vKiBJbnNlcnQgYW4gZW50cnkgaW50byBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgTlVMTCBvbiBzdWNjZXNzLgotICAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlIGVycm9yLiAgSXQKLSAgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gZXJyb3IgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzIGluIHRoZQotICAgaGFzaCB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpoYXNoX2luc2VydCBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJCWNvbnN0IGNoYXIgKmtleSwgUFRSIHZhbHVlKSk7Ci0KLS8qIEluc2VydCBvciByZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBOVUxMIG9uCi0gICBzdWNjZXNzLiAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlCi0gICBlcnJvci4gIElmIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWUgaXMgcmVwbGFjZWQuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqaGFzaF9qYW0gUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLAotCQkJCSAgICAgY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKTsKLQotLyogUmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIG9sZAotICAgdmFsdWUgc3RvcmVkIGZvciB0aGUgZW50cnkuICBJZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoCi0gICB0YWJsZSwgdGhpcyBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgTlVMTC4gICovCi0KLWV4dGVybiBQVFIgaGFzaF9yZXBsYWNlIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqa2V5LAotCQkJCSBQVFIgdmFsdWUpKTsKLQotLyogRmluZCBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUsIHJldHVybmluZyBpdHMgdmFsdWUuICBSZXR1cm5zIE5VTEwKLSAgIGlmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQuICAqLwotCi1leHRlcm4gUFRSIGhhc2hfZmluZCBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKmtleSkpOwotCi0vKiBEZWxldGUgYW4gZW50cnkgZnJvbSBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZAotICAgZm9yIHRoYXQgZW50cnksIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbnRyeS4gICovCi0KLWV4dGVybiBQVFIgaGFzaF9kZWxldGUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICprZXkpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgQ2FsbCB0aGUgZnVuY3Rpb24gb24gZXZlcnkgZW50cnkgaW4gdGhlCi0gICBoYXNoIHRhYmxlLiAgKi8KLQotZXh0ZXJuIHZvaWQgaGFzaF90cmF2ZXJzZSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJICAgdm9pZCAoKnBmbikgKGNvbnN0IGNoYXIgKmtleSwgUFRSIHZhbHVlKSkpOwotCi0vKiBQcmludCBoYXNoIHRhYmxlIHN0YXRpc3RpY3Mgb24gdGhlIHNwZWNpZmllZCBmaWxlLiAgTkFNRSBpcyB0aGUKLSAgIG5hbWUgb2YgdGhlIGhhc2ggdGFibGUsIHVzZWQgZm9yIHByaW50aW5nIGEgaGVhZGVyLiAgKi8KLQotZXh0ZXJuIHZvaWQgaGFzaF9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICAgc3RydWN0IGhhc2hfY29udHJvbCAqKSk7Ci0KLSNlbmRpZiAvKiBIQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1maWxlLmMgYi9nYXMvaW5wdXQtZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRmNmY3Li4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyogaW5wdXRfZmlsZS5jIC0gRGVhbCB3aXRoIElucHV0IEZpbGVzIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogQ29uZmluZXMgYWxsIGRldGFpbHMgb2YgcmVhZGluZyBzb3VyY2UgYnl0ZXMgdG8gdGhpcyBtb2R1bGUuCi0gKiBBbGwgTy9TIHNwZWNpZmljIGNyb2NrcyBzaG91bGQgbGl2ZSBoZXJlLgotICogV2hhdCB3ZSBsb3NlIGluICJlZmZpY2llbmN5IiB3ZSBnYWluIGluIG1vZHVsYXJpdHkuCi0gKiBOb3RlIHdlIGRvbid0IG5lZWQgdG8gI2luY2x1ZGUgdGhlICJhcy5oIiBmaWxlLiBObyBjb21tb24gY291cGxpbmchCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKLQotc3RhdGljIGludCBpbnB1dF9maWxlX2dldCBQQVJBTVMgKChjaGFyICosIGludCkpOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIG5vbi16ZXJvIGlmIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyByZWFkIHNob3VsZCBiZQotICAgcHJlcHJvY2Vzc2VkIGJ5IGFwcC4gIEl0IGlzIHplcm8gaWYgdGhlIGZpbGUgY2FuIGJlIHJlYWQgc3RyYWlnaHQgaW4uCi0gICAqLwotaW50IHByZXByb2Nlc3MgPSAwOwotCi0vKgotICogVGhpcyBjb2RlIG9wZW5zIGEgZmlsZSwgdGhlbiBkZWxpdmVycyBCVUZGRVJfU0laRSBjaGFyYWN0ZXIKLSAqIGNodW5rcyBvZiB0aGUgZmlsZSBvbiBkZW1hbmQuCi0gKiBCVUZGRVJfU0laRSBpcyBzdXBwb3NlZCB0byBiZSBhIG51bWJlciBjaG9zZW4gZm9yIHNwZWVkLgotICogVGhlIGNhbGxlciBvbmx5IGFza3Mgb25jZSB3aGF0IEJVRkZFUl9TSVpFIGlzLCBhbmQgYXNrcyBiZWZvcmUKLSAqIHRoZSBuYXR1cmUgb2YgdGhlIGlucHV0IGZpbGVzIChpZiBhbnkpIGlzIGtub3duLgotICovCi0KLSNkZWZpbmUgQlVGRkVSX1NJWkUgKDMyICogMTAyNCkKLQotLyoKLSAqIFdlIHVzZSBzdGF0aWMgZGF0YTogdGhlIGRhdGEgYXJlYSBpcyBub3Qgc2hhcmFibGUuCi0gKi8KLQotc3RhdGljIEZJTEUgKmZfaW47Ci1zdGF0aWMgY2hhciAqZmlsZV9uYW1lOwotCi0vKiBTdHJ1Y3QgZm9yIHNhdmluZyB0aGUgc3RhdGUgb2YgdGhpcyBtb2R1bGUgZm9yIGZpbGUgaW5jbHVkZXMuICAqLwotc3RydWN0IHNhdmVkX2ZpbGUKLSAgewotICAgIEZJTEUgKmZfaW47Ci0gICAgY2hhciAqZmlsZV9uYW1lOwotICAgIGludCBwcmVwcm9jZXNzOwotICAgIGNoYXIgKmFwcF9zYXZlOwotICB9OwotDAotLyogVGhlc2UgaG9va3MgYWNjb21vZGF0ZSBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zLiAqLwotCi12b2lkIAotaW5wdXRfZmlsZV9iZWdpbiAoKQotewotICBmX2luID0gKEZJTEUgKikgMDsKLX0KLQotdm9pZCAKLWlucHV0X2ZpbGVfZW5kICgpCi17Ci19Ci0KLS8qIFJldHVybiBCVUZGRVJfU0laRS4gKi8KLXVuc2lnbmVkIGludCAKLWlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCkKLXsKLSAgcmV0dXJuIChCVUZGRVJfU0laRSk7Ci19Ci0KLWludCAKLWlucHV0X2ZpbGVfaXNfb3BlbiAoKQotewotICByZXR1cm4gZl9pbiAhPSAoRklMRSAqKSAwOwotfQotCi0vKiBQdXNoIHRoZSBzdGF0ZSBvZiBvdXIgaW5wdXQsIHJldHVybmluZyBhIHBvaW50ZXIgdG8gc2F2ZWQgaW5mbyB0aGF0Ci0gICBjYW4gYmUgcmVzdG9yZWQgd2l0aCBpbnB1dF9maWxlX3BvcCAoKS4gICovCi1jaGFyICoKLWlucHV0X2ZpbGVfcHVzaCAoKQotewotICByZWdpc3RlciBzdHJ1Y3Qgc2F2ZWRfZmlsZSAqc2F2ZWQ7Ci0KLSAgc2F2ZWQgPSAoc3RydWN0IHNhdmVkX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzYXZlZCk7Ci0KLSAgc2F2ZWQtPmZfaW4gPSBmX2luOwotICBzYXZlZC0+ZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotICBzYXZlZC0+cHJlcHJvY2VzcyA9IHByZXByb2Nlc3M7Ci0gIGlmIChwcmVwcm9jZXNzKQotICAgIHNhdmVkLT5hcHBfc2F2ZSA9IGFwcF9wdXNoICgpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7CQkvKiBJbml0aWFsaXplIGZvciBuZXcgZmlsZSAqLwotCi0gIHJldHVybiAoY2hhciAqKSBzYXZlZDsKLX0KLQotdm9pZAotaW5wdXRfZmlsZV9wb3AgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3Qgc2F2ZWRfZmlsZSAqc2F2ZWQgPSAoc3RydWN0IHNhdmVkX2ZpbGUgKikgYXJnOwotCi0gIGlucHV0X2ZpbGVfZW5kICgpOwkJLyogQ2xvc2Ugb3V0IG9sZCBmaWxlICovCi0KLSAgZl9pbiA9IHNhdmVkLT5mX2luOwotICBmaWxlX25hbWUgPSBzYXZlZC0+ZmlsZV9uYW1lOwotICBwcmVwcm9jZXNzID0gc2F2ZWQtPnByZXByb2Nlc3M7Ci0gIGlmIChwcmVwcm9jZXNzKQotICAgIGFwcF9wb3AgKHNhdmVkLT5hcHBfc2F2ZSk7Ci0KLSAgZnJlZSAoYXJnKTsKLX0KLQwKLXZvaWQKLWlucHV0X2ZpbGVfb3BlbiAoZmlsZW5hbWUsIHByZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7CQkvKiAiIiBtZWFucyB1c2Ugc3RkaW4uIE11c3Qgbm90IGJlIDAuICovCi0gICAgIGludCBwcmU7Ci17Ci0gIGludCBjOwotICBjaGFyIGJ1Zls4MF07Ci0KLSAgcHJlcHJvY2VzcyA9IHByZTsKLQotICBhc3NlcnQgKGZpbGVuYW1lICE9IDApOwkvKiBGaWxlbmFtZSBtYXkgbm90IGJlIE5VTEwuICovCi0gIGlmIChmaWxlbmFtZVswXSkKLSAgICB7CQkJCS8qIFdlIGhhdmUgYSBmaWxlIG5hbWUuIFN1Y2sgaXQgYW5kIHNlZS4gKi8KLSAgICAgIGZfaW4gPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gICAgICBmaWxlX25hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHVzZSBzdGRpbiBmb3IgdGhlIGlucHV0IGZpbGUuICovCi0gICAgICBmX2luID0gc3RkaW47Ci0gICAgICBmaWxlX25hbWUgPSBfKCJ7c3RhbmRhcmQgaW5wdXR9Iik7CS8qIEZvciBlcnJvciBtZXNzYWdlcy4gKi8KLSAgICB9Ci0gIGlmIChmX2luID09IChGSUxFICopIDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW4ndCBvcGVuICVzIGZvciByZWFkaW5nLiIpLCBmaWxlX25hbWUpOwotICAgICAgYXNfcGVycm9yICgiJXMiLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjID0gZ2V0YyAoZl9pbik7Ci0gIGlmIChjID09ICcjJykKLSAgICB7CQkJCS8qIEJlZ2lucyB3aXRoIGNvbW1lbnQsIG1heSBub3Qgd2FudCB0byBwcmVwcm9jZXNzICovCi0gICAgICBjID0gZ2V0YyAoZl9pbik7Ci0gICAgICBpZiAoYyA9PSAnTicpCi0JewotCSAgZmdldHMgKGJ1ZiwgODAsIGZfaW4pOwotCSAgaWYgKCFzdHJjbXAgKGJ1ZiwgIk9fQVBQXG4iKSkKLQkgICAgcHJlcHJvY2VzcyA9IDA7Ci0JICBpZiAoIXN0cmNociAoYnVmLCAnXG4nKSkKLQkgICAgdW5nZXRjICgnIycsIGZfaW4pOwkvKiBJdCB3YXMgbG9uZ2VyICovCi0JICBlbHNlCi0JICAgIHVuZ2V0YyAoJ1xuJywgZl9pbik7Ci0JfQotICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQotCXVuZ2V0YyAoJ1xuJywgZl9pbik7Ci0gICAgICBlbHNlCi0JdW5nZXRjICgnIycsIGZfaW4pOwotICAgIH0KLSAgZWxzZQotICAgIHVuZ2V0YyAoYywgZl9pbik7Ci19Ci0KLS8qIENsb3NlIGlucHV0IGZpbGUuICAqLwotdm9pZCAKLWlucHV0X2ZpbGVfY2xvc2UgKCkKLXsKLSAgaWYgKGZfaW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmY2xvc2UgKGZfaW4pOwotICAgIH0JCQkJLyogZG9uJ3QgY2xvc2UgYSBudWxsIGZpbGUgcG9pbnRlciAqLwotICBmX2luID0gMDsKLX0JCQkJLyogaW5wdXRfZmlsZV9jbG9zZSgpICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIGRvX3NjcnViX2NoYXJzLiAgKi8KLQotc3RhdGljIGludAotaW5wdXRfZmlsZV9nZXQgKGJ1ZiwgYnVmbGVuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIGludCBzaXplOwotCi0gIHNpemUgPSBmcmVhZCAoYnVmLCBzaXplb2YgKGNoYXIpLCBidWZsZW4sIGZfaW4pOwotICBpZiAoc2l6ZSA8IDApCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJDYW4ndCByZWFkIGZyb20gJXMiKSwgZmlsZV9uYW1lKTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIFJlYWQgYSBidWZmZXIgZnJvbSB0aGUgaW5wdXQgZmlsZS4gICovCi0KLWNoYXIgKgotaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyICh3aGVyZSkKLSAgICAgY2hhciAqd2hlcmU7CQkvKiBXaGVyZSB0byBwbGFjZSAxc3QgY2hhcmFjdGVyIG9mIG5ldyBidWZmZXIuICovCi17Ci0gIGNoYXIgKnJldHVybl92YWx1ZTsJCS8qIC0+IExhc3QgY2hhciBvZiB3aGF0IHdlIHJlYWQsICsgMS4gKi8KLSAgcmVnaXN0ZXIgaW50IHNpemU7Ci0KLSAgaWYgKGZfaW4gPT0gKEZJTEUgKikgMCkKLSAgICByZXR1cm4gMDsKLSAgLyoKLSAgICogZmZsdXNoIChzdGRpbik7IGNvdWxkIGJlIGRvbmUgaGVyZSBpZiB5b3Ugd2FudCB0byBzeW5jaHJvbmlzZQotICAgKiBzdGRpbiBhbmQgc3Rkb3V0LCBmb3IgdGhlIGNhc2Ugd2hlcmUgb3VyIGlucHV0IGZpbGUgaXMgc3RkaW4uCi0gICAqIFNpbmNlIHRoZSBhc3NlbWJsZXIgc2hvdWxkbid0IGRvIGFueSBvdXRwdXQgdG8gc3Rkb3V0LCB3ZQotICAgKiBkb24ndCBib3RoZXIgdG8gc3luY2ggb3V0cHV0IGFuZCBpbnB1dC4KLSAgICovCi0gIGlmIChwcmVwcm9jZXNzKQotICAgIHNpemUgPSBkb19zY3J1Yl9jaGFycyAoaW5wdXRfZmlsZV9nZXQsIHdoZXJlLCBCVUZGRVJfU0laRSk7Ci0gIGVsc2UKLSAgICBzaXplID0gZnJlYWQgKHdoZXJlLCBzaXplb2YgKGNoYXIpLCBCVUZGRVJfU0laRSwgZl9pbik7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkNhbid0IHJlYWQgZnJvbSAlcyIpLCBmaWxlX25hbWUpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICBpZiAoc2l6ZSkKLSAgICByZXR1cm5fdmFsdWUgPSB3aGVyZSArIHNpemU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZmNsb3NlIChmX2luKSkKLQlhc19wZXJyb3IgKF8oIkNhbid0IGNsb3NlICVzIiksIGZpbGVfbmFtZSk7Ci0gICAgICBmX2luID0gKEZJTEUgKikgMDsKLSAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLS8qIGVuZCBvZiBpbnB1dC1maWxlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1maWxlLmggYi9nYXMvaW5wdXQtZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjliZjI4Li4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiBpbnB1dF9maWxlLmggaGVhZGVyIGZvciBpbnB1dC1maWxlLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiJpbnB1dF9maWxlLmMiOk9wZXJhdGluZy1zeXN0ZW0gZGVwZW5kYW50IGZ1bmN0aW9ucyB0byByZWFkIHNvdXJjZSBmaWxlcy4qLwotCi0KLS8qCi0gKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgdGhpcyBtb2R1bGUgbXVzdCBwcm92aWRlIHRoZQotICogZm9sbG93aW5nIHNlcnZpY2VzIHRvIGl0cyBjYWxsZXJzLgotICoKLSAqIGlucHV0X2ZpbGVfYmVnaW4oKQkJCUNhbGwgb25jZSBiZWZvcmUgYW55dGhpbmcgZWxzZS4KLSAqCi0gKiBpbnB1dF9maWxlX2VuZCgpCQkJQ2FsbCBvbmNlIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4KLSAqCi0gKiBpbnB1dF9maWxlX2J1ZmZlcl9zaXplKCkJCUNhbGwgYW55dGltZS4gUmV0dXJucyBsYXJnZXN0IHBvc3NpYmxlCi0gKgkJCQkJZGVsaXZlcnkgZnJvbQotICoJCQkJCWlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlcigpLgotICoKLSAqIGlucHV0X2ZpbGVfb3BlbihuYW1lKQkJQ2FsbCBvbmNlIGZvciBlYWNoIGlucHV0IGZpbGUuCi0gKgotICogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKHdoZXJlKQlDYWxsIG9uY2UgdG8gZ2V0IGVhY2ggbmV3IGJ1ZmZlci4KLSAqCQkJCQlSZXR1cm4gMDogbm8gbW9yZSBjaGFycyBsZWZ0IGluIGZpbGUsCi0gKgkJCQkJICAgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCi0gKgkJCQkJT3RoZXJ3aXNlOiByZXR1cm4gYSBwb2ludGVyIHRvIGp1c3QKLSAqCQkJCQkgICBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgd2UgcmVhZAotICoJCQkJCSAgIGludG8gdGhlIGJ1ZmZlci4KLSAqCQkJCQlJZiB3ZSBjYW4gb25seSByZWFkIDAgY2hhcmFjdGVycywgdGhlbgotICoJCQkJCWVuZC1vZi1maWxlIGlzIGZha2VkLgotICoKLSAqIGlucHV0X2ZpbGVfcHVzaCgpCQkJUHVzaCBzdGF0ZSwgd2hpY2ggY2FuIGJlIHJlc3RvcmVkCi0gKgkJCQkJbGF0ZXIuICBEb2VzIGltcGxpY2l0IGlucHV0X2ZpbGVfYmVnaW4uCi0gKgkJCQkJUmV0dXJucyBjaGFyICogdG8gc2F2ZWQgc3RhdGUuCi0gKgotICogaW5wdXRfZmlsZV9wb3AgKGFyZykJCQlQb3BzIHByZXZpb3VzbHkgc2F2ZWQgc3RhdGUuCi0gKgotICogaW5wdXRfZmlsZV9jbG9zZSAoKQkJCUNsb3NlcyBvcGVuZWQgZmlsZS4KLSAqCi0gKiBBbGwgZXJyb3JzIGFyZSByZXBvcnRlZCAodXNpbmcgYXNfcGVycm9yKSBzbyBjYWxsZXIgZG9lc24ndCBoYXZlIHRvIHRoaW5rCi0gKiBhYm91dCBJL08gZXJyb3JzLiBObyBJL08gZXJyb3JzIGFyZSBmYXRhbDogYW4gZW5kLW9mLWZpbGUgbWF5IGJlIGZha2VkLgotICovCi0KLWNoYXIgKmlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlciBQQVJBTVMgKChjaGFyICp3aGVyZSkpOwotY2hhciAqaW5wdXRfZmlsZV9wdXNoIFBBUkFNUyAoKHZvaWQpKTsKLXVuc2lnbmVkIGludCBpbnB1dF9maWxlX2J1ZmZlcl9zaXplIFBBUkFNUyAoKHZvaWQpKTsKLWludCBpbnB1dF9maWxlX2lzX29wZW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9maWxlX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9jbG9zZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X2ZpbGVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9vcGVuIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBpbnQgcHJlKSk7Ci12b2lkIGlucHV0X2ZpbGVfcG9wIFBBUkFNUyAoKGNoYXIgKmFyZykpOwotCi0vKiBlbmQgb2YgaW5wdXRfZmlsZS5oICovCmRpZmYgLS1naXQgYS9nYXMvaW5wdXQtc2NydWIuYyBiL2dhcy9pbnB1dC1zY3J1Yi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmEzYmIzLi4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1zY3J1Yi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qIGlucHV0X3NjcnViLmMgLSBCcmVhayB1cCBpbnB1dCBidWZmZXJzIGludG8gd2hvbGUgbnVtYmVycyBvZiBsaW5lcy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgkJLyogTmVlZCB0aGlzIHRvIG1ha2UgZXJybm8gZGVjbGFyYXRpb24gcmlnaHQgKi8KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgImxpc3RpbmcuaCIKLQotLyoKLSAqIE8vUyBpbmRlcGVuZGVudCBtb2R1bGUgdG8gc3VwcGx5IGJ1ZmZlcnMgb2Ygc2FuaXRpc2VkIHNvdXJjZSBjb2RlCi0gKiB0byByZXN0IG9mIGFzc2VtYmxlci4gIFdlIGdldCBzYW5pdGlzZWQgaW5wdXQgZGF0YSBvZiBhcmJpdHJhcnkgbGVuZ3RoLgotICogV2UgYnJlYWsgdGhlc2UgYnVmZmVycyBvbiBsaW5lIGJvdW5kYXJpZXMsIHJlY29tYmluZSBwaWVjZXMgdGhhdAotICogd2VyZSBicm9rZW4gYWNyb3NzIGJ1ZmZlcnMsIGFuZCByZXR1cm4gYSBidWZmZXIgb2YgZnVsbCBsaW5lcyB0bwotICogdGhlIGNhbGxlci4KLSAqIFRoZSBsYXN0IHBhcnRpYWwgbGluZSBiZWdpbnMgdGhlIG5leHQgYnVmZmVyIHdlIGJ1aWxkIGFuZCByZXR1cm4gdG8gY2FsbGVyLgotICogVGhlIGJ1ZmZlciByZXR1cm5lZCB0byBjYWxsZXIgaXMgcHJlY2VlZGVkIGJ5IEJFRk9SRV9TVFJJTkcgYW5kIGZvbGxvd2VkCi0gKiBieSBBRlRFUl9TVFJJTkcsIGFzIHNlbnRpbmVscy4gVGhlIGxhc3QgY2hhcmFjdGVyIGJlZm9yZSBBRlRFUl9TVFJJTkcKLSAqIGlzIGEgbmV3bGluZS4KLSAqIEFsc28gbG9va3MgYWZ0ZXIgbGluZSBudW1iZXJzLCBmb3IgZS5nLiBlcnJvciBtZXNzYWdlcy4KLSAqLwotCi0vKgotICogV2UgZG9uJ3QgY2FyZSBob3cgZmlsdGh5IG91ciBidWZmZXJzIGFyZSwgYnV0IG91ciBjYWxsZXJzIGFzc3VtZQotICogdGhhdCB0aGUgZm9sbG93aW5nIHNhbml0YXRpb24gaGFzIGFscmVhZHkgYmVlbiBkb25lLgotICoKLSAqIE5vIGNvbW1lbnRzLCByZWR1Y2UgYSBjb21tZW50IHRvIGEgc3BhY2UuCi0gKiBSZWR1Y2UgYSB0YWIgdG8gYSBzcGFjZSB1bmxlc3MgaXQgaXMgMXN0IGNoYXIgb2YgbGluZS4KLSAqIEFsbCBtdWx0aXBsZSB0YWJzIGFuZCBzcGFjZXMgY29sbGFwc2VkIGludG8gMSBjaGFyLiBUYWIgb25seQotICogICBsZWdhbCBpZiAxc3QgY2hhciBvZiBsaW5lLgotICogIyBsaW5lIGZpbGUgc3RhdGVtZW50cyBjb252ZXJ0ZWQgdG8gLmxpbmUgeDsuZmlsZSB5OyBzdGF0ZW1lbnRzLgotICogRXNjYXBlZCBuZXdsaW5lcyBhdCBlbmQgb2YgbGluZTogcmVtb3ZlIHRoZW0gYnV0IGFkZCBhcyBtYW55IG5ld2xpbmVzCi0gKiAgIHRvIGVuZCBvZiBzdGF0ZW1lbnQgYXMgeW91IHJlbW92ZWQgaW4gdGhlIG1pZGRsZSwgdG8gc3luY2ggbGluZSBudW1iZXJzLgotICovCi0MCi0jZGVmaW5lIEJFRk9SRV9TVFJJTkcgKCJcbiIpCi0jZGVmaW5lIEFGVEVSX1NUUklORyAoIlwwIikJLyogbWVtY3B5IG9mIDAgY2hhcnMgbWlnaHQgY2hva2UuICovCi0jZGVmaW5lIEJFRk9SRV9TSVpFICgxKQotI2RlZmluZSBBRlRFUl9TSVpFICAoMSkKLQotc3RhdGljIGNoYXIgKmJ1ZmZlcl9zdGFydDsJLyotPjFzdCBjaGFyIG9mIGZ1bGwgYnVmZmVyIGFyZWEuICovCi1zdGF0aWMgY2hhciAqcGFydGlhbF93aGVyZTsJLyotPmFmdGVyIGxhc3QgZnVsbCBsaW5lIGluIGJ1ZmZlci4gKi8KLXN0YXRpYyBpbnQgcGFydGlhbF9zaXplOwkvKiA+PTAuIE51bWJlciBvZiBjaGFycyBpbiBwYXJ0aWFsIGxpbmUgaW4gYnVmZmVyLiAqLwotc3RhdGljIGNoYXIgc2F2ZV9zb3VyY2VbQUZURVJfU0laRV07Ci0vKiBCZWNhdXNlIHdlIG5lZWQgQUZURVJfU1RSSU5HIGp1c3QgYWZ0ZXIgbGFzdCAqLwotLyogZnVsbCBsaW5lLCBpdCBjbG9iYmVycyAxc3QgcGFydCBvZiBwYXJ0aWFsICovCi0vKiBsaW5lLiBTbyB3ZSBwcmVzZXJ2ZSAxc3QgcGFydCBvZiBwYXJ0aWFsICovCi0vKiBsaW5lIGhlcmUuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmZlcl9sZW5ndGg7CS8qIFdoYXQgaXMgdGhlIGxhcmdlc3Qgc2l6ZSBidWZmZXIgdGhhdCAqLwotLyogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKCkgY291bGQgKi8KLS8qIHJldHVybiB0byB1cz8gKi8KLQotLyogVGhlIGluZGV4IGludG8gYW4gc2Igc3RydWN0dXJlIHdlIGFyZSByZWFkaW5nIGZyb20uICAtMSBpZiBub25lLiAgKi8KLXN0YXRpYyBpbnQgc2JfaW5kZXggPSAtMTsKLQotLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUsIHRoaXMgaXMgaXQuICAqLwotc3RhdGljIHNiIGZyb21fc2I7Ci0KLS8qIFRoZSBudW1iZXIgb2YgbmVzdGVkIHNiIHN0cnVjdHVyZXMgd2UgaGF2ZSBpbmNsdWRlZC4gICovCi1pbnQgbWFjcm9fbmVzdDsKLQotLyogV2UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZSBvcGVuIGF0IG9uY2UsIHRob3VnaCB0aGUgaW5mbyBmb3IgYWxsCi0gICBidXQgdGhlIGxhdGVzdCBvbmUgYXJlIHNhdmVkIG9mZiBpbiBhIHN0cnVjdCBpbnB1dF9zYXZlLiAgVGhlc2UgZmlsZXMgcmVtYWluCi0gICBvcGVuLCBzbyB3ZSBhcmUgbGltaXRlZCBieSB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgYWxsb3dlZCBieSB0aGUKLSAgIHVuZGVybHlpbmcgT1MuIFdlIG1heSBhbHNvIHNlcXVlbnRpYWxseSByZWFkIG1vcmUgdGhhbiBvbmUgc291cmNlIGZpbGUgaW4gYW4KLSAgIGFzc2VtYmx5LiAqLwotCi0vKiBXZSBtdXN0IHRyYWNrIHRoZSBwaHlzaWNhbCBmaWxlIGFuZCBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXMuIFdlIGFsc28KLSAgIHRyYWNrIGEgImxvZ2ljYWwiIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gKEM/KSAgY29tcGlsZXIKLSAgIHNvdXJjZSBsaW5lIG51bWJlcnMuICBXaGVuZXZlciB3ZSBvcGVuIGEgZmlsZSB3ZSBtdXN0IGZpbGwgaW4KLSAgIHBoeXNpY2FsX2lucHV0X2ZpbGUuIFNvIGlmIGl0IGlzIE5VTEwgd2UgaGF2ZSBub3Qgb3BlbmVkIGFueSBmaWxlcyB5ZXQuICovCi0KLXN0YXRpYyBjaGFyICpwaHlzaWNhbF9pbnB1dF9maWxlOwotc3RhdGljIGNoYXIgKmxvZ2ljYWxfaW5wdXRfZmlsZTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXJUOwkvKiAxLW9yaWdpbiBsaW5lIG51bWJlciBpbiBhIHNvdXJjZSBmaWxlLiAqLwotLyogQSBsaW5lIGVuZHMgaW4gJ1xuJyBvciBlb2YuICovCi0KLXN0YXRpYyBsaW5lX251bWJlclQgcGh5c2ljYWxfaW5wdXRfbGluZTsKLXN0YXRpYyBpbnQgbG9naWNhbF9pbnB1dF9saW5lOwotCi0vKiBTdHJ1Y3QgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgaW5wdXQgaGFuZGxlciBkdXJpbmcgaW5jbHVkZSBmaWxlcyAqLwotc3RydWN0IGlucHV0X3NhdmUKLSAgewotICAgIGNoYXIgKmJ1ZmZlcl9zdGFydDsKLSAgICBjaGFyICpwYXJ0aWFsX3doZXJlOwotICAgIGludCBwYXJ0aWFsX3NpemU7Ci0gICAgY2hhciBzYXZlX3NvdXJjZVtBRlRFUl9TSVpFXTsKLSAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX2xlbmd0aDsKLSAgICBjaGFyICpwaHlzaWNhbF9pbnB1dF9maWxlOwotICAgIGNoYXIgKmxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgICBsaW5lX251bWJlclQgcGh5c2ljYWxfaW5wdXRfbGluZTsKLSAgICBpbnQgbG9naWNhbF9pbnB1dF9saW5lOwotICAgIGludCBzYl9pbmRleDsKLSAgICBzYiBmcm9tX3NiOwotICAgIHN0cnVjdCBpbnB1dF9zYXZlICpuZXh0X3NhdmVkX2ZpbGU7CS8qIENoYWluIG9mIGlucHV0X3NhdmVzICovCi0gICAgY2hhciAqaW5wdXRfZmlsZV9zYXZlOwkvKiBTYXZlZCBzdGF0ZSBvZiBpbnB1dCByb3V0aW5lcyAqLwotICAgIGNoYXIgKnNhdmVkX3Bvc2l0aW9uOwkvKiBDYWxsZXIncyBzYXZlZCBwb3NpdGlvbiBpbiBidWYgKi8KLSAgfTsKLQotc3RhdGljIHN0cnVjdCBpbnB1dF9zYXZlICppbnB1dF9zY3J1Yl9wdXNoIFBBUkFNUyAoKGNoYXIgKnNhdmVkX3Bvc2l0aW9uKSk7Ci1zdGF0aWMgY2hhciAqaW5wdXRfc2NydWJfcG9wIFBBUkFNUyAoKHN0cnVjdCBpbnB1dF9zYXZlICphcmcpKTsKLXN0YXRpYyB2b2lkIGFzXzFfY2hhciBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgYywgRklMRSAqIHN0cmVhbSkpOwotCi0vKiBTYXZlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSB0aGF0IC5pbmNsdWRlJ2QgdGhpcyBvbmUuICBXaGVuIHdlIGhpdCBFT0YsCi0gICB3ZSBhdXRvbWF0aWNhbGx5IHBvcCB0byB0aGF0IGZpbGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqbmV4dF9zYXZlZF9maWxlOwotCi0vKiBQdXNoIHRoZSBzdGF0ZSBvZiBpbnB1dCByZWFkaW5nIGFuZCBzY3J1YmJpbmcgc28gdGhhdCB3ZSBjYW4gI2luY2x1ZGUuCi0gICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgJ3ZvaWQgKicgKGZ1ZGdlZCBmb3Igb2xkIGNvbXBpbGVycykgdG8gYSBzYXZlCi0gICBhcmVhLCB3aGljaCBjYW4gYmUgcmVzdG9yZWQgYnkgcGFzc2luZyBpdCB0byBpbnB1dF9zY3J1Yl9wb3AoKS4gKi8KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqCi1pbnB1dF9zY3J1Yl9wdXNoIChzYXZlZF9wb3NpdGlvbikKLSAgICAgY2hhciAqc2F2ZWRfcG9zaXRpb247Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBpbnB1dF9zYXZlICpzYXZlZDsKLQotICBzYXZlZCA9IChzdHJ1Y3QgaW5wdXRfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKnNhdmVkKTsKLQotICBzYXZlZC0+c2F2ZWRfcG9zaXRpb24gPSBzYXZlZF9wb3NpdGlvbjsKLSAgc2F2ZWQtPmJ1ZmZlcl9zdGFydCA9IGJ1ZmZlcl9zdGFydDsKLSAgc2F2ZWQtPnBhcnRpYWxfd2hlcmUgPSBwYXJ0aWFsX3doZXJlOwotICBzYXZlZC0+cGFydGlhbF9zaXplID0gcGFydGlhbF9zaXplOwotICBzYXZlZC0+YnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7Ci0gIHNhdmVkLT5waHlzaWNhbF9pbnB1dF9maWxlID0gcGh5c2ljYWxfaW5wdXRfZmlsZTsKLSAgc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfZmlsZSA9IGxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2xpbmUgPSBwaHlzaWNhbF9pbnB1dF9saW5lOwotICBzYXZlZC0+bG9naWNhbF9pbnB1dF9saW5lID0gbG9naWNhbF9pbnB1dF9saW5lOwotICBzYXZlZC0+c2JfaW5kZXggPSBzYl9pbmRleDsKLSAgc2F2ZWQtPmZyb21fc2IgPSBmcm9tX3NiOwotICBtZW1jcHkgKHNhdmVkLT5zYXZlX3NvdXJjZSwgc2F2ZV9zb3VyY2UsIHNpemVvZiAoc2F2ZV9zb3VyY2UpKTsKLSAgc2F2ZWQtPm5leHRfc2F2ZWRfZmlsZSA9IG5leHRfc2F2ZWRfZmlsZTsKLSAgc2F2ZWQtPmlucHV0X2ZpbGVfc2F2ZSA9IGlucHV0X2ZpbGVfcHVzaCAoKTsKLQotICBpbnB1dF9maWxlX2JlZ2luICgpOwkJLyogUmVpbml0aWFsaXplISAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKLSAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0gIHNiX2luZGV4ID0gLTE7Ci0KLSAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7Ci0gIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7Ci0KLSAgcmV0dXJuIHNhdmVkOwotfQkJCQkvKiBpbnB1dF9zY3J1Yl9wdXNoKCkgKi8KLQotc3RhdGljIGNoYXIgKgotaW5wdXRfc2NydWJfcG9wIChzYXZlZCkKLSAgICAgc3RydWN0IGlucHV0X3NhdmUgKnNhdmVkOwotewotICBjaGFyICpzYXZlZF9wb3NpdGlvbjsKLQotICBpbnB1dF9zY3J1Yl9lbmQgKCk7CQkvKiBGaW5pc2ggb2ZmIG9sZCBidWZmZXIgKi8KLQotICBpbnB1dF9maWxlX3BvcCAoc2F2ZWQtPmlucHV0X2ZpbGVfc2F2ZSk7Ci0gIHNhdmVkX3Bvc2l0aW9uID0gc2F2ZWQtPnNhdmVkX3Bvc2l0aW9uOwotICBidWZmZXJfc3RhcnQgPSBzYXZlZC0+YnVmZmVyX3N0YXJ0OwotICBidWZmZXJfbGVuZ3RoID0gc2F2ZWQtPmJ1ZmZlcl9sZW5ndGg7Ci0gIHBoeXNpY2FsX2lucHV0X2ZpbGUgPSBzYXZlZC0+cGh5c2ljYWxfaW5wdXRfZmlsZTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IHNhdmVkLT5waHlzaWNhbF9pbnB1dF9saW5lOwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSBzYXZlZC0+bG9naWNhbF9pbnB1dF9saW5lOwotICBzYl9pbmRleCA9IHNhdmVkLT5zYl9pbmRleDsKLSAgZnJvbV9zYiA9IHNhdmVkLT5mcm9tX3NiOwotICBwYXJ0aWFsX3doZXJlID0gc2F2ZWQtPnBhcnRpYWxfd2hlcmU7Ci0gIHBhcnRpYWxfc2l6ZSA9IHNhdmVkLT5wYXJ0aWFsX3NpemU7Ci0gIG5leHRfc2F2ZWRfZmlsZSA9IHNhdmVkLT5uZXh0X3NhdmVkX2ZpbGU7Ci0gIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHNhdmVkLT5zYXZlX3NvdXJjZSwgc2l6ZW9mIChzYXZlX3NvdXJjZSkpOwotCi0gIGZyZWUgKHNhdmVkKTsKLSAgcmV0dXJuIHNhdmVkX3Bvc2l0aW9uOwotfQotDAotCi12b2lkCi1pbnB1dF9zY3J1Yl9iZWdpbiAoKQotewotICBrbm93IChzdHJsZW4gKEJFRk9SRV9TVFJJTkcpID09IEJFRk9SRV9TSVpFKTsKLSAga25vdyAoc3RybGVuIChBRlRFUl9TVFJJTkcpID09IEFGVEVSX1NJWkUgfHwgKEFGVEVSX1NUUklOR1swXSA9PSAnXDAnICYmIEFGVEVSX1NJWkUgPT0gMSkpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7Ci0KLSAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0KLSAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7Ci0gIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7Ci0KLSAgLyogTGluZSBudW1iZXIgdGhpbmdzLiAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKLSAgcGh5c2ljYWxfaW5wdXRfZmlsZSA9IE5VTEw7CS8qIE5vIGZpbGUgcmVhZCB5ZXQuICovCi0gIG5leHRfc2F2ZWRfZmlsZSA9IE5VTEw7CS8qIEF0IEVPRiwgZG9uJ3QgcG9wIHRvIGFueSBvdGhlciBmaWxlICovCi0gIGRvX3NjcnViX2JlZ2luIChmbGFnX202OGtfbXJpKTsKLX0KLQotdm9pZAotaW5wdXRfc2NydWJfZW5kICgpCi17Ci0gIGlmIChidWZmZXJfc3RhcnQpCi0gICAgewotICAgICAgZnJlZSAoYnVmZmVyX3N0YXJ0KTsKLSAgICAgIGJ1ZmZlcl9zdGFydCA9IDA7Ci0gICAgICBpbnB1dF9maWxlX2VuZCAoKTsKLSAgICB9Ci19Ci0KLS8qIFN0YXJ0IHJlYWRpbmcgaW5wdXQgZnJvbSBhIG5ldyBmaWxlLiAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIHN0YXJ0IG9mIGNhbGxlcidzIHBhcnQgb2YgYnVmZmVyLiAqLwotaW5wdXRfc2NydWJfbmV3X2ZpbGUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaW5wdXRfZmlsZV9vcGVuIChmaWxlbmFtZSwgIWZsYWdfbm9fY29tbWVudHMpOwotICBwaHlzaWNhbF9pbnB1dF9maWxlID0gZmlsZW5hbWVbMF0gPyBmaWxlbmFtZSA6IF8oIntzdGFuZGFyZCBpbnB1dH0iKTsKLSAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IDA7Ci0KLSAgcGFydGlhbF9zaXplID0gMDsKLSAgcmV0dXJuIChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSk7Ci19Ci0KLQotLyogSW5jbHVkZSBhIGZpbGUgZnJvbSB0aGUgY3VycmVudCBmaWxlLiAgU2F2ZSBvdXIgc3RhdGUsIGNhdXNlIGl0IHRvCi0gICBiZSByZXN0b3JlZCBvbiBFT0YsIGFuZCBiZWdpbiBoYW5kbGluZyBhIG5ldyBmaWxlLiAgU2FtZSByZXN1bHQgYXMKLSAgIGlucHV0X3NjcnViX25ld19maWxlLiAqLwotCi1jaGFyICoKLWlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSAoZmlsZW5hbWUsIHBvc2l0aW9uKQotICAgICBjaGFyICpmaWxlbmFtZTsKLSAgICAgY2hhciAqcG9zaXRpb247Ci17Ci0gIG5leHRfc2F2ZWRfZmlsZSA9IGlucHV0X3NjcnViX3B1c2ggKHBvc2l0aW9uKTsKLSAgcmV0dXJuIGlucHV0X3NjcnViX25ld19maWxlIChmaWxlbmFtZSk7Ci19Ci0KLS8qIFN0YXJ0IGdldHRpbmcgaW5wdXQgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUuICBUaGlzIGlzIHVzZWQgd2hlbgotICAgZXhwYW5kaW5nIGEgbWFjcm8uICAqLwotCi12b2lkCi1pbnB1dF9zY3J1Yl9pbmNsdWRlX3NiIChmcm9tLCBwb3NpdGlvbikKLSAgICAgc2IgKmZyb207Ci0gICAgIGNoYXIgKnBvc2l0aW9uOwotewotICBpZiAobWFjcm9fbmVzdCA+IG1heF9tYWNyb19uZXN0KQotICAgIGFzX2ZhdGFsIChfKCJtYWNyb3MgbmVzdGVkIHRvbyBkZWVwbHkiKSk7Ci0gICsrbWFjcm9fbmVzdDsKLQotICBuZXh0X3NhdmVkX2ZpbGUgPSBpbnB1dF9zY3J1Yl9wdXNoIChwb3NpdGlvbik7Ci0KLSAgc2JfbmV3ICgmZnJvbV9zYik7Ci0gIGlmIChmcm9tLT5sZW4gPj0gMSAmJiBmcm9tLT5wdHJbMF0gIT0gJ1xuJykKLSAgICB7Ci0gICAgICAvKiBBZGQgdGhlIHNlbnRpbmVsIHJlcXVpcmVkIGJ5IHJlYWQuYy4gICovCi0gICAgICBzYl9hZGRfY2hhciAoJmZyb21fc2IsICdcbicpOwotICAgIH0KLSAgc2JfYWRkX3NiICgmZnJvbV9zYiwgZnJvbSk7Ci0gIHNiX2luZGV4ID0gMTsKLQotICAvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlc2V0IGJ5IGlucHV0X3NjcnViX3B1c2guICBSZXN0b3JlIHRoZW0KLSAgICAgc2luY2Ugd2UgYXJlLCBhZnRlciBhbGwsIHN0aWxsIGF0IHRoZSBzYW1lIHBvaW50IGluIHRoZSBmaWxlLiAgKi8KLSAgbG9naWNhbF9pbnB1dF9saW5lID0gbmV4dF9zYXZlZF9maWxlLT5sb2dpY2FsX2lucHV0X2xpbmU7Ci0gIGxvZ2ljYWxfaW5wdXRfZmlsZSA9IG5leHRfc2F2ZWRfZmlsZS0+bG9naWNhbF9pbnB1dF9maWxlOwotfQotCi12b2lkCi1pbnB1dF9zY3J1Yl9jbG9zZSAoKQotewotICBpbnB1dF9maWxlX2Nsb3NlICgpOwotfQotCi1jaGFyICoKLWlucHV0X3NjcnViX25leHRfYnVmZmVyIChidWZwKQotICAgICBjaGFyICoqYnVmcDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbGltaXQ7CQkvKi0+anVzdCBhZnRlciBsYXN0IGNoYXIgb2YgYnVmZmVyLiAqLwotCi0gIGlmIChzYl9pbmRleCA+PSAwKQotICAgIHsKLSAgICAgIGlmIChzYl9pbmRleCA+PSBmcm9tX3NiLmxlbikKLQl7Ci0JICBzYl9raWxsICgmZnJvbV9zYik7Ci0JICBjb25kX2ZpbmlzaF9jaGVjayAobWFjcm9fbmVzdCk7Ci0JICAtLW1hY3JvX25lc3Q7Ci0JICBwYXJ0aWFsX3doZXJlID0gTlVMTDsKLQkgIGlmIChuZXh0X3NhdmVkX2ZpbGUgIT0gTlVMTCkKLQkgICAgKmJ1ZnAgPSBpbnB1dF9zY3J1Yl9wb3AgKG5leHRfc2F2ZWRfZmlsZSk7Ci0JICByZXR1cm4gcGFydGlhbF93aGVyZTsKLQl9Ci0KLSAgICAgIHBhcnRpYWxfd2hlcmUgPSBmcm9tX3NiLnB0ciArIGZyb21fc2IubGVuOwotICAgICAgcGFydGlhbF9zaXplID0gMDsKLSAgICAgICpidWZwID0gZnJvbV9zYi5wdHIgKyBzYl9pbmRleDsKLSAgICAgIHNiX2luZGV4ID0gZnJvbV9zYi5sZW47Ci0gICAgICByZXR1cm4gcGFydGlhbF93aGVyZTsKLSAgICB9Ci0KLSAgKmJ1ZnAgPSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRTsKLQotICBpZiAocGFydGlhbF9zaXplKQotICAgIHsKLSAgICAgIG1lbWNweSAoYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUsIHBhcnRpYWxfd2hlcmUsCi0JICAgICAgKHVuc2lnbmVkIGludCkgcGFydGlhbF9zaXplKTsKLSAgICAgIG1lbWNweSAoYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUsIHNhdmVfc291cmNlLCBBRlRFUl9TSVpFKTsKLSAgICB9Ci0gIGxpbWl0ID0gaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIChidWZmZXJfc3RhcnQKLQkJCQkgICAgICAgKyBCRUZPUkVfU0laRQotCQkJCSAgICAgICArIHBhcnRpYWxfc2l6ZSk7Ci0gIGlmIChsaW1pdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjaGFyICpwOwkJLyogRmluZCBsYXN0IG5ld2xpbmUuICovCi0KLSAgICAgIGZvciAocCA9IGxpbWl0IC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQotCTsKLSAgICAgICsrcDsKLQotICAgICAgd2hpbGUgKHAgPD0gYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUpCi0JewotCSAgaW50IGxpbW9mZjsKLQotCSAgbGltb2ZmID0gbGltaXQgLSBidWZmZXJfc3RhcnQ7Ci0JICBidWZmZXJfbGVuZ3RoICs9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0JICBidWZmZXJfc3RhcnQgPSB4cmVhbGxvYyAoYnVmZmVyX3N0YXJ0LAotCQkJCSAgIChCRUZPUkVfU0laRQotCQkJCSAgICArIDIgKiBidWZmZXJfbGVuZ3RoCi0JCQkJICAgICsgQUZURVJfU0laRSkpOwotCSAgKmJ1ZnAgPSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRTsKLQkgIGxpbWl0ID0gaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIChidWZmZXJfc3RhcnQgKyBsaW1vZmYpOwotCi0JICBpZiAobGltaXQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oInBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIikpOwotCSAgICAgIHBhcnRpYWxfd2hlcmUgPSBOVUxMOwotCSAgICAgIGlmIChuZXh0X3NhdmVkX2ZpbGUpCi0JCSpidWZwID0gaW5wdXRfc2NydWJfcG9wIChuZXh0X3NhdmVkX2ZpbGUpOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0KLQkgIGZvciAocCA9IGxpbWl0IC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQotCSAgICA7Ci0JICArK3A7Ci0JfQotCi0gICAgICBwYXJ0aWFsX3doZXJlID0gcDsKLSAgICAgIHBhcnRpYWxfc2l6ZSA9IGxpbWl0IC0gcDsKLSAgICAgIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHBhcnRpYWxfd2hlcmUsIChpbnQpIEFGVEVSX1NJWkUpOwotICAgICAgbWVtY3B5IChwYXJ0aWFsX3doZXJlLCBBRlRFUl9TVFJJTkcsIChpbnQpIEFGVEVSX1NJWkUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBhcnRpYWxfd2hlcmUgPSAwOwotICAgICAgaWYgKHBhcnRpYWxfc2l6ZSA+IDApCi0JewotCSAgYXNfd2FybiAoXygiUGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiKSk7Ci0JfQotCi0gICAgICAvKiBUZWxsIHRoZSBsaXN0aW5nIHdlJ3ZlIGZpbmlzaGVkIHRoZSBmaWxlLiAgKi8KLSAgICAgIExJU1RJTkdfRU9GICgpOwotCi0gICAgICAvKiBJZiB3ZSBzaG91bGQgcG9wIHRvIGFub3RoZXIgZmlsZSBhdCBFT0YsIGRvIGl0LiAqLwotICAgICAgaWYgKG5leHRfc2F2ZWRfZmlsZSkKLQl7Ci0JICAqYnVmcCA9IGlucHV0X3NjcnViX3BvcCAobmV4dF9zYXZlZF9maWxlKTsJLyogUG9wIHN0YXRlICovCi0JICAvKiBwYXJ0aWFsX3doZXJlIGlzIG5vdyBjb3JyZWN0IHRvIHJldHVybiwgc2luY2Ugd2UgcG9wcGVkIGl0LiAqLwotCX0KLSAgICB9Ci0gIHJldHVybiAocGFydGlhbF93aGVyZSk7Ci19CQkJCS8qIGlucHV0X3NjcnViX25leHRfYnVmZmVyKCkgKi8KLQwKLS8qCi0gKiBUaGUgcmVtYWluaW5nIHBhcnQgb2YgdGhpcyBmaWxlIGRlYWxzIHdpdGggbGluZSBudW1iZXJzLCBlcnJvcgotICogbWVzc2FnZXMgYW5kIHNvIG9uLgotICovCi0KLQotaW50Ci1zZWVuX2F0X2xlYXN0XzFfZmlsZSAoKQkJLyogVFJVRSBpZiB3ZSBvcGVuZWQgYW55IGZpbGUuICovCi17Ci0gIHJldHVybiAocGh5c2ljYWxfaW5wdXRfZmlsZSAhPSBOVUxMKTsKLX0KLQotdm9pZAotYnVtcF9saW5lX2NvdW50ZXJzICgpCi17Ci0gIGlmIChzYl9pbmRleCA8IDApCi0gICAgewotICAgICAgKytwaHlzaWNhbF9pbnB1dF9saW5lOwotICAgICAgaWYgKGxvZ2ljYWxfaW5wdXRfbGluZSA+PSAwKQotCSsrbG9naWNhbF9pbnB1dF9saW5lOwotICAgIH0KLX0KLQwKLS8qCi0gKgkJCW5ld19sb2dpY2FsX2xpbmUoKQotICoKLSAqIFRlbGxzIHVzIHdoYXQgdGhlIG5ldyBsb2dpY2FsIGxpbmUgbnVtYmVyIGFuZCBmaWxlIGFyZS4KLSAqIElmIHRoZSBsaW5lX251bWJlciBpcyAtMSwgd2UgZG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGxvZ2ljYWwgbGluZQotICogbnVtYmVyLiAgSWYgaXQgaXMgLTIsIHdlIGRlY3JlbWVudCB0aGUgbG9naWNhbCBsaW5lIG51bWJlciAodGhpcyBpcwotICogdG8gc3VwcG9ydCB0aGUgLmFwcGZpbGUgcHNldWRvLW9wIGluc2VydGVkIGludG8gdGhlIHN0cmVhbSBieQotICogZG9fc2NydWJfY2hhcnMpLgotICogSWYgdGhlIGZuYW1lIGlzIE5VTEwsIHdlIGRvbid0IGNoYW5nZSB0aGUgY3VycmVudCBsb2dpY2FsIGZpbGUgbmFtZS4KLSAqIFJldHVybnMgbm9uemVybyBpZiB0aGUgZmlsZW5hbWUgYWN0dWFsbHkgY2hhbmdlcy4KLSAqLwotaW50Ci1uZXdfbG9naWNhbF9saW5lIChmbmFtZSwgbGluZV9udW1iZXIpCi0gICAgIGNoYXIgKmZuYW1lOwkJLyogRE9OJ1QgZGVzdHJveSBpdCEgV2UgcG9pbnQgdG8gaXQhICovCi0gICAgIGludCBsaW5lX251bWJlcjsKLXsKLSAgaWYgKGxpbmVfbnVtYmVyID49IDApCi0gICAgbG9naWNhbF9pbnB1dF9saW5lID0gbGluZV9udW1iZXI7Ci0gIGVsc2UgaWYgKGxpbmVfbnVtYmVyID09IC0yICYmIGxvZ2ljYWxfaW5wdXRfbGluZSA+IDApCi0gICAgLS1sb2dpY2FsX2lucHV0X2xpbmU7Ci0KLSAgaWYgKGZuYW1lCi0gICAgICAmJiAobG9naWNhbF9pbnB1dF9maWxlID09IE5VTEwKLQkgIHx8IHN0cmNtcCAobG9naWNhbF9pbnB1dF9maWxlLCBmbmFtZSkpKQotICAgIHsKLSAgICAgIGxvZ2ljYWxfaW5wdXRfZmlsZSA9IGZuYW1lOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19CQkJCS8qIG5ld19sb2dpY2FsX2xpbmUoKSAqLwotDAotLyoKLSAqCQkJYSBzIF8gdyBoIGUgciBlICgpCi0gKgotICogUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuCi0gKiBuYW1lcCBzaG91bGQgYmUgY2hhciAqIGNvbnN0ICosIGJ1dCB0aGVyZSBhcmUgY29tcGlsZXJzIHdoaWNoIHNjcmV3Ci0gKiB1cCBkZWNsYXJhdGlvbnMgbGlrZSB0aGF0LCBhbmQgaXQncyBlYXNpZXIgdG8gYXZvaWQgaXQuCi0gKi8KLXZvaWQgCi1hc193aGVyZSAobmFtZXAsIGxpbmVwKQotICAgICBjaGFyICoqbmFtZXA7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZXA7Ci17Ci0gIGlmIChsb2dpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTAotICAgICAgJiYgKGxpbmVwID09IE5VTEwgfHwgbG9naWNhbF9pbnB1dF9saW5lID49IDApKQotICAgIHsKLSAgICAgICpuYW1lcCA9IGxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgICAgIGlmIChsaW5lcCAhPSBOVUxMKQotCSpsaW5lcCA9IGxvZ2ljYWxfaW5wdXRfbGluZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHBoeXNpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqbmFtZXAgPSBwaHlzaWNhbF9pbnB1dF9maWxlOwotICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCi0JKmxpbmVwID0gcGh5c2ljYWxfaW5wdXRfbGluZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqbmFtZXAgPSAwOwotICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCi0JKmxpbmVwID0gMDsKLSAgICB9Ci19CQkJCS8qIGFzX3doZXJlKCkgKi8KLQwKLQotCi0KLS8qCi0gKgkJCWEgcyBfIGggbyB3IG0gdSBjIGggKCkKLSAqCi0gKiBPdXRwdXQgdG8gZ2l2ZW4gc3RyZWFtIGhvdyBtdWNoIG9mIGxpbmUgd2UgaGF2ZSBzY2FubmVkIHNvIGZhci4KLSAqIEFzc3VtZXMgd2UgaGF2ZSBzY2FubmVkIHVwIHRvIGFuZCBpbmNsdWRpbmcgaW5wdXRfbGluZV9wb2ludGVyLgotICogTm8gZnJlZSAnXG4nIGF0IGVuZCBvZiBsaW5lLgotICovCi12b2lkCi1hc19ob3dtdWNoIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsJCS8qIE9wZW5lZCBmb3Igd3JpdGUgcGxlYXNlLiAqLwotewotICByZWdpc3RlciBjaGFyICpwOwkJLyogU2NhbiBpbnB1dCBsaW5lLiAqLwotICAvKiByZWdpc3RlciBjaGFyIGM7IEpGIHVudXNlZCAqLwotCi0gIGZvciAocCA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7ICpwICE9ICdcbic7IC0tcCkKLSAgICB7Ci0gICAgfQotICArK3A7CQkJCS8qIHAtPjFzdCBjaGFyIG9mIGxpbmUuICovCi0gIGZvciAoOyBwIDw9IGlucHV0X2xpbmVfcG9pbnRlcjsgcCsrKQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSBBU0NJSS4gRUJDRElDICYgb3RoZXIgbWljcm8tY29tcHV0ZXIgY2hhciBzZXRzIGlnbm9yZWQuICovCi0gICAgICBhc18xX2NoYXIgKCh1bnNpZ25lZCBjaGFyKSAqcCwgc3RyZWFtKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIAotYXNfMV9jaGFyIChjLCBzdHJlYW0pCi0gICAgIHVuc2lnbmVkIGludCBjOwotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGlmIChjID4gMTI3KQotICAgIHsKLSAgICAgICh2b2lkKSBwdXRjICgnJScsIHN0cmVhbSk7Ci0gICAgICBjIC09IDEyODsKLSAgICB9Ci0gIGlmIChjIDwgMzIpCi0gICAgewotICAgICAgKHZvaWQpIHB1dGMgKCdeJywgc3RyZWFtKTsKLSAgICAgIGMgKz0gJ0AnOwotICAgIH0KLSAgKHZvaWQpIHB1dGMgKGMsIHN0cmVhbSk7Ci19Ci0KLS8qIGVuZCBvZiBpbnB1dF9zY3J1Yi5jICovCmRpZmYgLS1naXQgYS9nYXMvaXRibC1sZXgubCBiL2dhcy9pdGJsLWxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTA1ZGRkLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLWxleC5sCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qIGl0YmwtbGV4LmwKLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0lewotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJpdGJsLXBhcnNlLmgiCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNkZWZpbmUgTURCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpCi0jZGVmaW5lIE1EQkcoeCkKLSNlbmRpZgotCi1pbnQgaW5zbnRibF9saW5lID0gMTsKLSV9Ci0KLUFMTlVNCVtBLVphLXowLTlfXQotRElHSVQJWzAtOV0KLUFMUEhBCVtBLVphLXpfXQotSEVYCVswLTlBLUZhLWZdCi0KLSUlCi0KLSJjcmVnInwiQ1JFRyIgewotICAgIHJldHVybiBDUkVHOwotICB9Ci0iZHJlZyJ8IkRSRUciIHsKLSAgICByZXR1cm4gRFJFRzsKLSAgfQotImdyZWcifCJHUkVHIiB7Ci0gICAgcmV0dXJuIEdSRUc7Ci0gIH0KLSJpbW1lZCJ8IklNTUVEIiB7Ci0gICAgcmV0dXJuIElNTUVEOwotICB9Ci0iYWRkciJ8IkFERFIiIHsKLSAgICByZXR1cm4gQUREUjsKLSAgfQotImluc24ifCJJTlNOIiB7Ci0gICAgcmV0dXJuIElOU047Ci0gIH0KLSJwIntESUdJVH0gewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwucHJvY2Vzc29yID0gc3RydG91bCAoeXl0ZXh0KzEsIDAsIDApOwotICAgIHJldHVybiBQTlVNOwotICB9Ci17RElHSVR9KyB7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5udW0gPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotICAgIHJldHVybiBOVU07Ci0gIH0KLSIweCJ7SEVYfSsgewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwubnVtID0gc3RydG91bCAoeXl0ZXh0LCAwLCAwKTsKLSAgICByZXR1cm4gTlVNOwotICB9Ci17QUxQSEF9e0FMTlVNfSoJewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwuc3RyID0gc3RyZHVwICh5eXRleHQpOwotICAgIHJldHVybiBJRDsKLSAgfQotIjsifCIjIgl7Ci0gICAgaW50IGM7Ci0gICAgd2hpbGUgKChjID0gaW5wdXQgKCkpICE9ICBFT0YpIAotICAgICAgewotICAgICAgICBpZiAoYyA9PSAgJ1xuJykgCi0gICAgCXsKLSAgICAJCXVucHV0IChjKTsKLSAgICAJCWJyZWFrOwotICAgIAl9Ci0gICAgICB9Ci0gIH0KLSJcbiIJeyAKLSAgICBpbnNudGJsX2xpbmUrKzsgCi0gICAgTURCRyAoKCJpbiBsZXgsIE5MID0gJWQgKHgleClcbiIsIE5MLCBOTCkpOwotICAgIHJldHVybiBOTDsgCi0gIH0KLSIgInwiXHQiIHsgCi0gIH0KLS4gewotICAgIE1EQkcgKCgiY2hhciA9ICV4LCAlZFxuIiwgeXl0ZXh0WzBdLCB5eXRleHRbMF0pKTsKLSAgICByZXR1cm4geXl0ZXh0WzBdOwotICB9Ci0lJQotCi0jaWZuZGVmIHl5d3JhcAotaW50IAoteXl3cmFwICgpIAotICB7IAotICAgIHJldHVybiAxOyAKLSAgfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvaXRibC1vcHMuYyBiL2dhcy9pdGJsLW9wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2NjYTYwLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLW9wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE2ICswLDAgQEAKLS8qIGl0Ymwtb3BzLmMKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qCi0gKiBIZXJlaW4gbGllcyB0aGUgc3VwcG9ydCBmb3IgZHluYW1pYyBzcGVjaWZpY2F0aW9uIG9mIHByb2Nlc3NvcgotICogaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMuICBNbmVtb25pY3MsIHZhbHVlcywgYW5kIGZvcm1hdHMgZm9yIGVhY2gKLSAqIGluc3RydWN0aW9uIGFuZCByZWdpc3RlciBhcmUgc3BlY2lmaWVkIGluIGFuIGFzY2lpIGZpbGUgY29uc2lzdGluZyBvZgotICogdGFibGUgZW50cmllcy4gIFRoZSBncmFtbWFyIGZvciB0aGUgdGFibGUgaXMgZGVmaW5lZCBpbiB0aGUgZG9jdW1lbnQKLSAqICJQcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gdGFibGUgc3BlY2lmaWNhdGlvbiIuCi0gKgotICogSW5zdHJ1Y3Rpb25zIHVzZSB0aGUgZ251IGFzc2VtYmxlciBzeW50YXgsIHdpdGggdGhlIGFkZGl0aW9uIG9mCi0gKiBhbGxvd2luZyBtbmVtb25pY3MgZm9yIHJlZ2lzdGVyLgotICogRWcuICJmdW5jICQyLHJlZzMsMHgxMDAsc3ltYm9sIDsgY29tbWVudCIKLSAqIAlmdW5jIC0gb3Bjb2RlIG5hbWUKLSAqIAkkbiAtIHJlZ2lzdGVyIG4KLSAqIAlyZWczIC0gbW5lbW9uaWMgZm9yIHByb2Nlc3NvcidzIHJlZ2lzdGVyIGRlZmluZWQgaW4gdGFibGUKLSAqIAkweGRkZC4uZCAtIGltbWVkaWF0ZSB2YWx1ZQotICogCXN5bWJvbCAtIGFkZHJlc3Mgb2YgbGFiZWwgb3IgZXh0ZXJuYWwgc3ltYm9sCi0gKgotICogRmlyc3QsIGl0YmxfcGFyc2UgcmVhZHMgaW4gdGhlIHRhYmxlIG9mIHJlZ2lzdGVyIGFuZCBpbnN0cnVjdGlvbgotICogbmFtZXMgYW5kIGZvcm1hdHMsIGFuZCBidWlsZHMgYSBsaXN0IG9mIGVudHJpZXMgZm9yIGVhY2gKLSAqIHByb2Nlc3Nvci90eXBlIGNvbWJpbmF0aW9uLiAgbGV4IGFuZCB5YWNjIGFyZSB1c2VkIHRvIHBhcnNlCi0gKiB0aGUgZW50cmllcyBpbiB0aGUgdGFibGUgYW5kIGNhbGwgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSB0bwotICogYWRkIGVhY2ggZW50cnkgdG8gb3VyIGxpc3QuCi0gKgotICogVGhlbiwgd2hlbiBhc3NlbWJsaW5nIG9yIGRpc2Fzc2VtYmxpbmcsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHRvCi0gKiAxKSBnZXQgaW5mb3JtYXRpb24gb24gYSBwcm9jZXNzb3IncyByZWdpc3RlcnMgYW5kCi0gKiAyKSBhc3NlbWJsZS9kaXNhc3NlbWJsZSBhbiBpbnN0cnVjdGlvbi4KLSAqIFRvIGFzc2VtYmxlKGRpc2Fzc2VtYmxlKSBhbiBpbnN0cnVjdGlvbiwgdGhlIGZ1bmN0aW9uCi0gKiBpdGJsX2Fzc2VtYmxlKGl0YmxfZGlzYXNzZW1ibGUpIGlzIGNhbGxlZCB0byBzZWFyY2ggdGhlIGxpc3Qgb2YKLSAqIGluc3RydWN0aW9uIGVudHJpZXMsIGFuZCBpZiBhIG1hdGNoIGlzIGZvdW5kLCB1c2VzIHRoZSBmb3JtYXQKLSAqIGRlc2NyaWJlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gZW50cnkgc3RydWN0dXJlIHRvIGNvbXBsZXRlIHRoZSBhY3Rpb24uCi0gKgotICogRWcuIFN1cHBvc2Ugd2UgaGF2ZSBhIE1pcHMgY29wcm9jZXNzb3IgImNvcDMiIHdpdGggZGF0YSByZWdpc3RlciAiZDIiCi0gKiBhbmQgd2Ugd2FudCB0byBkZWZpbmUgZnVuY3Rpb24gInBpZyIgd2hpY2ggdGFrZXMgdHdvIG9wZXJhbmRzLgotICoKLSAqIEdpdmVuIHRoZSB0YWJsZSBlbnRyaWVzOgotICogCSJwMyBpbnNuIHBpZyAweDE6MjQtMjEgZHJlZzoyMC0xNiBpbW1lZDoxNS0wIgotICogCSJwMyBkcmVnIGQyIDB4MiIKLSAqIGFuZCB0aGF0IHRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZyBmb3IgY29wcm9jZXNzb3IgcHogaGFzIGVuY29kaW5nOgotICogCSNkZWZpbmUgTUlQU19FTkNPREVfQ09QX05VTSh6KSAoKDB4MjF8KHo8PDEpKTw8MjUpCi0gKiAJI2RlZmluZSBJVEJMX0VOQ09ERV9QTlVNKHBudW0pIE1JUFNfRU5DT0RFX0NPUF9OVU0ocG51bSkKLSAqCi0gKiBhIHN0cnVjdHVyZSB0byBkZXNjcmliZSB0aGUgaW5zdHJ1Y3Rpb24gbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZToKLSAqICAgICAgc3RydWN0IGl0YmxfZW50cnkgPSB7Ci0gKiAgICAgIGVfcHJvY2Vzc29yIHByb2Nlc3NvciA9IGVfcDMKLSAqICAgICAgZV90eXBlIHR5cGUgPSBlX2luc24KLSAqICAgICAgY2hhciAqbmFtZSA9ICJwaWciCi0gKiAgICAgIHVpbnQgdmFsdWUgPSAweDEKLSAqICAgICAgdWludCBmbGFncyA9IDAKLSAqICAgICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2UgPSAyNC0yMQotICogICAgICBzdHJ1Y3QgaXRibF9maWVsZCAqZmllbGQgPSB7Ci0gKiAgICAgICAgICAgICAgZV90eXBlIHR5cGUgPSBlX2RyZWcKLSAqICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZSA9IDIwLTE2Ci0gKiAgICAgICAgICAgICAgc3RydWN0IGl0YmxfZmllbGQgKm5leHQgPSB7Ci0gKiAgICAgICAgICAgICAgICAgICAgICBlX3R5cGUgdHlwZSA9IGVfaW1tZWQKLSAqICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlID0gMTUtMAotICogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl0YmxfZmllbGQgKm5leHQgPSAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB9OwotICogICAgICAgICAgICAgIH07Ci0gKiAgICAgIHN0cnVjdCBpdGJsX2VudHJ5ICpuZXh0ID0gMAotICogICAgICB9OwotICoKLSAqIEFuZCB0aGUgYXNzZW1ibGVyIGluc3RydWN0aW9uczoKLSAqIAkicGlnIGQyLDB4MTAwIgotICogCSJwaWcgJDIsMHgxMDAiCi0gKgotICogd291bGQgYm90aCBhc3NlbWJsZSB0byB0aGUgaGV4IHZhbHVlOgotICogCSIweDRlMjIwMTAwIgotICoKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJpdGJsLW9wcy5oIgotI2luY2x1ZGUgIml0YmwtcGFyc2UuaCIKLQotLyogI2RlZmluZSBERUJVRyAqLwotCi0jaWZkZWYgREVCVUcKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNkZWZpbmUgQVNTRVJUKHgpIGFzc2VydCh4KQotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIEFTU0VSVCh4KQotI2RlZmluZSBEQkcoeCkKLSNlbmRpZgotCi0jaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoYTxiP2E6YikKLSNlbmRpZgotCi1pbnQgaXRibF9oYXZlX2VudHJpZXMgPSAwOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogc3RydWN0dXJlcyBmb3Iga2VlcGluZyBpdGJsIGZvcm1hdCBlbnRyaWVzICovCi0KLXN0cnVjdCBpdGJsX3JhbmdlCi0gIHsKLSAgICBpbnQgc2JpdDsJCQkvKiBtYXNrIHN0YXJ0aW5nIGJpdCBwb3NpdGlvbiAqLwotICAgIGludCBlYml0OwkJCS8qIG1hc2sgZW5kaW5nIGJpdCBwb3NpdGlvbiAqLwotICB9OwotCi1zdHJ1Y3QgaXRibF9maWVsZAotICB7Ci0gICAgZV90eXBlIHR5cGU7CQkvKiBkcmVnL2NyZWcvZ3JlZy9pbW1lZC9zeW1iICovCi0gICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2U7CS8qIGZpZWxkJ3MgYml0ZmllbGQgcmFuZ2Ugd2l0aGluIGluc3RydWN0aW9uICovCi0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsJLyogZmllbGQgZmxhZ3MgKi8KLSAgICBzdHJ1Y3QgaXRibF9maWVsZCAqbmV4dDsJLyogbmV4dCBmaWVsZCBpbiBsaXN0ICovCi0gIH07Ci0KLQotLyogVGhlc2Ugc3RydWN0dXJlcyBkZWZpbmUgdGhlIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzIGZvciBhIHByb2Nlc3Nvci4KLSAqIElmIHRoZSB0eXBlIGlzIGFuIGluc3RydWN0aW9uLCB0aGUgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZvcm1hdCBvZiBhbgotICogaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIGZpZWxkcyBhcmUgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0gKiBUaGUgZmxhZ3MgZmllbGQgYmVsb3cgdXNlcyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhvc2UgZGVmaW5lZCBpbiB0aGUKLSAqIGdudSBhc3NlbWJsZXIgYW5kIGFyZSBtYWNoaW5lIHNwZWNpZmljLiAqLwotc3RydWN0IGl0YmxfZW50cnkKLSAgewotICAgIGVfcHJvY2Vzc29yIHByb2Nlc3NvcjsJLyogcHJvY2Vzc29yIG51bWJlciAqLwotICAgIGVfdHlwZSB0eXBlOwkJLyogZHJlZy9jcmVnL2dyZWcvaW5zbiAqLwotICAgIGNoYXIgKm5hbWU7CQkJLyogbW5lbWlvbmljIG5hbWUgZm9yIGluc24vcmVnaXN0ZXIgKi8KLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwkvKiBvcGNvZGUvaW5zdHJ1Y3Rpb24gbWFzay9yZWdpc3RlciBudW1iZXIgKi8KLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBlZmZlY3RzIG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlOwkvKiBiaXQgcmFuZ2Ugd2l0aGluIGluc3RydWN0aW9uIGZvciB2YWx1ZSAqLwotICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpmaWVsZHM7CS8qIGxpc3Qgb2Ygb3BlcmFuZCBkZWZpbml0aW9ucyAoaWYgYW55KSAqLwotICAgIHN0cnVjdCBpdGJsX2VudHJ5ICpuZXh0OwkvKiBuZXh0IGVudHJ5ICovCi0gIH07Ci0KLQotLyogbG9jYWwgZGF0YSBhbmQgc3RydWN0dXJlcyAqLwotCi1zdGF0aWMgaW50IGl0YmxfbnVtX29wY29kZXMgPSAwOwotLyogQXJyYXkgb2YgZW50cmllcyBmb3IgZWFjaCBwcm9jZXNzb3IgYW5kIGVudHJ5IHR5cGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqZW50cmllc1tlX25wcm9jc11bZV9udHlwZXNdID0KLXsKLSAgezAsIDAsIDAsIDAsIDAsIDB9LAotICB7MCwgMCwgMCwgMCwgMCwgMH0sCi0gIHswLCAwLCAwLCAwLCAwLCAwfSwKLSAgezAsIDAsIDAsIDAsIDAsIDB9Ci19OwotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBidWlsZF9vcGNvZGUgUEFSQU1TICgoc3RydWN0IGl0YmxfZW50cnkgKmUpKTsKLXN0YXRpYyBlX3R5cGUgZ2V0X3R5cGUgUEFSQU1TICgoaW50IHl5dHlwZSkpOwotc3RhdGljIGVfcHJvY2Vzc29yIGdldF9wcm9jZXNzb3IgUEFSQU1TICgoaW50IHl5cHJvYykpOwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoqZ2V0X2VudHJpZXMgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKLQkJCQkJCWVfdHlwZSB0eXBlKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmZpbmRfZW50cnlfYnluYW1lIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgCi0JCQkJCWVfdHlwZSB0eXBlLCBjaGFyICpuYW1lKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmZpbmRfZW50cnlfYnl2YWwgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKLQkJCWVfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgKnIpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqYWxsb2NfZW50cnkgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKLQkJZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFwcGx5X3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgdmFsdWUsIAotCQkJCQkJc3RydWN0IGl0YmxfcmFuZ2UgcikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0cmFjdF9yYW5nZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHZhbHVlLCAKLQkJCQkJCXN0cnVjdCBpdGJsX3JhbmdlIHIpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9maWVsZCAqYWxsb2NfZmllbGQgUEFSQU1TICgoZV90eXBlIHR5cGUsIGludCBzYml0LCAKLQkJCQkJaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogSW50ZXJmYWNlcyB0byB0aGUgcGFyc2VyICovCi0KLQotLyogT3BlbiB0aGUgdGFibGUgYW5kIHVzZSBsZXggYW5kIHlhY2MgdG8gcGFyc2UgdGhlIGVudHJpZXMuCi0gKiBSZXR1cm4gMSBmb3IgZmFpbHVyZTsgMCBmb3Igc3VjY2Vzcy4gICovCi0KLWludCAKLWl0YmxfcGFyc2UgKGNoYXIgKmluc250YmwpCi17Ci0gIGV4dGVybiBGSUxFICp5eWluOwotICBleHRlcm4gaW50IHl5cGFyc2UgKHZvaWQpOwotICB5eWluID0gZm9wZW4gKGluc250YmwsICJyIik7Ci0gIGlmICh5eWluID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiQ2FuJ3Qgb3BlbiBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gc3BlY2lmaWNhdGlvbiBmaWxlIFwiJXNcIlxuIiwKLQkgICAgICBpbnNudGJsKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICh5eXBhcnNlICgpKTsKLSAgICB9Ci0gIGZjbG9zZSAoeXlpbik7Ci0gIGl0YmxfaGF2ZV9lbnRyaWVzID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFkZCBhIHJlZ2lzdGVyIGVudHJ5ICovCi0KLXN0cnVjdCBpdGJsX2VudHJ5ICoKLWl0YmxfYWRkX3JlZyAoaW50IHl5cHJvY2Vzc29yLCBpbnQgeXl0eXBlLCBjaGFyICpyZWduYW1lLAotCSAgICAgIGludCByZWdudW0pCi17Ci0jaWYgMAkJCQkKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN5bWJvbHMuaCIKLSAgLyogU2luY2UgcmVnaXN0ZXIgbmFtZXMgZG9uJ3QgaGF2ZSBhIHByZWZpeCwgd2UgcHV0IHRoZW0gaW4gdGhlIHN5bWJvbCB0YWJsZSBzbwotICAgICB0aGV5IGNhbid0IGJlIHVzZWQgYXMgc3ltYm9scy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIGFyZ3VtZW50IHBhcnNpbmcgYXMKLSAgICAgd2UgY2FuIGxldCBnYXMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4gIFRoZSByZWNvcmRlZCByZWdpc3RlciBudW1iZXIgaXMKLSAgICAgcmVnbnVtLiAgKi8KLSAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaGVyZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCi0gICAgIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChyZWduYW1lLCByZWdfc2VjdGlvbiwKLQkJCQkgICAgICByZWdudW0sICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotI2VuZGlmCi0gIHJldHVybiBhbGxvY19lbnRyeSAoZ2V0X3Byb2Nlc3NvciAoeXlwcm9jZXNzb3IpLCBnZXRfdHlwZSAoeXl0eXBlKSwgcmVnbmFtZSwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHJlZ251bSk7Ci19Ci0KLS8qIEFkZCBhbiBpbnN0cnVjdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgaXRibF9lbnRyeSAqCi1pdGJsX2FkZF9pbnNuIChpbnQgeXlwcm9jZXNzb3IsIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgdmFsdWUsCi0JICAgICAgIGludCBzYml0LCBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmU7Ci0gIGUgPSBhbGxvY19lbnRyeSAoZ2V0X3Byb2Nlc3NvciAoeXlwcm9jZXNzb3IpLCBlX2luc24sIG5hbWUsIHZhbHVlKTsKLSAgaWYgKGUpCi0gICAgewotICAgICAgZS0+cmFuZ2Uuc2JpdCA9IHNiaXQ7Ci0gICAgICBlLT5yYW5nZS5lYml0ID0gZWJpdDsKLSAgICAgIGUtPmZsYWdzID0gZmxhZ3M7Ci0gICAgICBpdGJsX251bV9vcGNvZGVzKys7Ci0gICAgfQotICByZXR1cm4gZTsKLX0KLQotLyogQWRkIGFuIG9wZXJhbmQgdG8gYW4gaW5zdHJ1Y3Rpb24gZW50cnkgKi8KLQotc3RydWN0IGl0YmxfZmllbGQgKgotaXRibF9hZGRfb3BlcmFuZCAoc3RydWN0IGl0YmxfZW50cnkgKmUsIGludCB5eXR5cGUsIGludCBzYml0LAotCQkgIGludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotICBzdHJ1Y3QgaXRibF9maWVsZCAqZiwgKipsYXN0X2Y7Ci0gIGlmICghZSkKLSAgICByZXR1cm4gMDsKLSAgLyogQWRkIHRvIGVuZCBvZiBmaWVsZHMnIGxpc3QuICovCi0gIGYgPSBhbGxvY19maWVsZCAoZ2V0X3R5cGUgKHl5dHlwZSksIHNiaXQsIGViaXQsIGZsYWdzKTsKLSAgaWYgKGYpCi0gICAgewotICAgICAgbGFzdF9mID0gJmUtPmZpZWxkczsKLSAgICAgIHdoaWxlICgqbGFzdF9mKQotCWxhc3RfZiA9ICYoKmxhc3RfZiktPm5leHQ7Ci0gICAgICAqbGFzdF9mID0gZjsKLSAgICAgIGYtPm5leHQgPSAwOwotICAgIH0KLSAgcmV0dXJuIGY7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEludGVyZmFjZXMgZm9yIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyICovCi0KLSNpZm5kZWYgU1RBTkRfQUxPTkUKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN5bWJvbHMuaCIKLXN0YXRpYyB2b2lkIGFwcGVuZF9pbnNuc19hc19tYWNyb3MgKHZvaWQpOwotCi0vKiBpbml0aWFsaXplIGZvciBnYXMgKi8KLXZvaWQgCi1pdGJsX2luaXQgKHZvaWQpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOwotICBlX3Byb2Nlc3NvciBwcm9jbjsKLSAgZV90eXBlIHR5cGU7Ci0KLSAgaWYgKCFpdGJsX2hhdmVfZW50cmllcykKLQlyZXR1cm47Ci0KLSAgLyogU2luY2UgcmVnaXN0ZXIgbmFtZXMgZG9uJ3QgaGF2ZSBhIHByZWZpeCwgcHV0IHRoZW0gaW4gdGhlIHN5bWJvbCB0YWJsZSBzbwotICAgICB0aGV5IGNhbid0IGJlIHVzZWQgYXMgc3ltYm9scy4gIFRoaXMgc2ltcGxpZmllcyBhcmd1bWVudCBwYXJzaW5nIGFzCi0gICAgIHdlIGNhbiBsZXQgZ2FzIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuICovCi0gIC8qIFVzZSBzeW1ib2xfY3JlYXRlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLSAgICAgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0KLSAgZm9yICh0eXBlID0gZV9yZWd0eXBlMDsgdHlwZSA8IGVfbnJlZ3R5cGVzOyB0eXBlKyspCi0gICAgZm9yIChwcm9jbiA9IGVfcDA7IHByb2NuIDwgZV9ucHJvY3M7IHByb2NuKyspCi0gICAgICB7Ci0JZXMgPSBnZXRfZW50cmllcyAocHJvY24sIHR5cGUpOwotCWZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCi0JICB7Ci0JICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKGUtPm5hbWUsIHJlZ19zZWN0aW9uLAotCQkJCQkgICAgIGUtPnZhbHVlLCAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLQkgIH0KLSAgICAgIH0KLSAgYXBwZW5kX2luc25zX2FzX21hY3JvcyAoKTsKLX0KLQotCi0vKiBBcHBlbmQgaW5zbnMgdG8gb3Bjb2RlcyB0YWJsZSBhbmQgaW5jcmVhc2UgbnVtYmVyIG9mIG9wY29kZXMgCi0gKiBTdHJ1Y3R1cmUgb2Ygb3Bjb2RlcyB0YWJsZTogCi0gKiBzdHJ1Y3QgaXRibF9vcGNvZGUKLSAqIHsKLSAqICAgY29uc3QgY2hhciAqbmFtZTsKLSAqICAgY29uc3QgY2hhciAqYXJnczsgCQktIHN0cmluZyBkZXNjcmliaW5nIHRoZSBhcmd1bWVudHMuICAKLSAqICAgdW5zaWduZWQgbG9uZyBtYXRjaDsgCS0gb3Bjb2RlLCBvciBJU0EgbGV2ZWwgaWYgcGluZm89SU5TTl9NQUNSTyAKLSAqICAgdW5zaWduZWQgbG9uZyBtYXNrOyAJLSBvcGNvZGUgbWFzaywgb3IgbWFjcm8gaWQgaWYgcGluZm89SU5TTl9NQUNSTyAKLSAqICAgdW5zaWduZWQgbG9uZyBwaW5mbzsgCS0gaW5zbiBmbGFncywgb3IgSU5TTl9NQUNSTyAKLSAqIH07Ci0gKiBleGFtcGxlczoKLSAqCXsibGkiLCAgICAgICJ0LGkiLCAgMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCAgICB9LAotICoJeyJsaSIsICAgICAgInQsSSIsICAwLCAgICAoaW50KSBNX0xJLCAgIElOU05fTUFDUk8gIH0sCi0gKi8KLQotc3RhdGljIGNoYXIgKmZvcm1fYXJncyAoc3RydWN0IGl0YmxfZW50cnkgKmUpOwotc3RhdGljIHZvaWQgCi1hcHBlbmRfaW5zbnNfYXNfbWFjcm9zICh2b2lkKQotewotICBzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUICpuZXdfb3Bjb2RlcywgKm87Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOwotICBpbnQgbiwgaWQsIHNpemUsIG5ld19zaXplLCBuZXdfbnVtX29wY29kZXM7Ci0KLSAgaWYgKCFpdGJsX2hhdmVfZW50cmllcykKLQlyZXR1cm47Ci0KLSAgaWYgKCFpdGJsX251bV9vcGNvZGVzKQkvKiBubyBuZXcgaW5zdHJ1Y3Rpb25zIHRvIGFkZCEgKi8KLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBEQkcgKCgicHJldmlvdXMgbnVtX29wY29kZXM9JWRcbiIsIElUQkxfTlVNX09QQ09ERVMpKTsKLQotICBuZXdfbnVtX29wY29kZXMgPSBJVEJMX05VTV9PUENPREVTICsgaXRibF9udW1fb3Bjb2RlczsKLSAgQVNTRVJUIChuZXdfbnVtX29wY29kZXMgPj0gaXRibF9udW1fb3Bjb2Rlcyk7Ci0KLSAgc2l6ZSA9IHNpemVvZiAoc3RydWN0IElUQkxfT1BDT0RFX1NUUlVDVCkgKiBJVEJMX05VTV9PUENPREVTOwotICBBU1NFUlQgKHNpemUgPj0gMCk7Ci0gIERCRyAoKCJJIGdldD0lZFxuIiwgc2l6ZSAvIHNpemVvZiAoSVRCTF9PUENPREVTWzBdKSkpOwotCi0gIG5ld19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUKSAqIG5ld19udW1fb3Bjb2RlczsKLSAgQVNTRVJUIChuZXdfc2l6ZSA+IHNpemUpOwotCi0gIC8qIEZJWE1FIHNpbmNlIElUQkxfT1BDT0RFUyBjdWxkIGJlIGEgc3RhdGljIHRhYmxlLAotCQl3ZSBjYW4ndCByZWFsbG9jIG9yIGRlbGV0ZSB0aGUgb2xkIG1lbW9yeS4gKi8KLSAgbmV3X29wY29kZXMgPSAoc3RydWN0IElUQkxfT1BDT0RFX1NUUlVDVCAqKSBtYWxsb2MgKG5ld19zaXplKTsKLSAgaWYgKCFuZXdfb3Bjb2RlcykKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBpbnN0cnVjdGlvbnNcbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzaXplKQkJCS8qIGNvcHkgcHJleGlzdGluZyBvcGNvZGVzIHRhYmxlICovCi0gICAgbWVtY3B5IChuZXdfb3Bjb2RlcywgSVRCTF9PUENPREVTLCBzaXplKTsKLQotICAvKiBGSVhNRSEgc29tZSBOVU1PUENPREVTIGFyZSBjYWxjdWxhdGVkIGV4cHJlc3Npb25zLgotCQlUaGVzZSBuZWVkIHRvIGJlIGNoYW5nZWQgYmVmb3JlIGl0YmxzIGNhbiBiZSBzdXBwb3J0ZWQuICovCi0KLSAgaWQgPSBJVEJMX05VTV9NQUNST1M7CQkvKiBiZWdpbiB0aGUgbmV4dCBtYWNybyBpZCBhZnRlciB0aGUgbGFzdCAqLwotICBvID0gJm5ld19vcGNvZGVzW0lUQkxfTlVNX09QQ09ERVNdOwkvKiBhcHBlbmQgbWFjcm8gdG8gb3Bjb2RlcyBsaXN0ICovCi0gIGZvciAobiA9IGVfcDA7IG4gPCBlX25wcm9jczsgbisrKQotICAgIHsKLSAgICAgIGVzID0gZ2V0X2VudHJpZXMgKG4sIGVfaW5zbik7Ci0gICAgICBmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQotCXsKLQkgIC8qIG5hbWUsICAgIGFyZ3MsICAgbWFzaywgICAgICAgbWF0Y2gsICBwaW5mbwotCQkgKiB7ImxpIiwgICAgICAidCxpIiwgIDB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QgICAgfSwKLQkJICogeyJsaSIsICAgICAgInQsSSIsICAwLCAgICAoaW50KSBNX0xJLCAgIElOU05fTUFDUk8gIH0sCi0JCSAqIENvbnN0cnVjdCBhcmdzIGZyb20gaXRibF9maWVsZHMuCi0JCSovCi0JICBvLT5uYW1lID0gZS0+bmFtZTsKLQkgIG8tPmFyZ3MgPSBzdHJkdXAgKGZvcm1fYXJncyAoZSkpOwotCSAgby0+bWFzayA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOwotCSAgLyogRklYTUUgaG93IHRvIGNhdGNoIGR1cnJpbmcgYXNzZW1ibHk/ICovCi0JICAvKiBtYXNrIHRvIGlkZW50aWZ5IHRoaXMgaW5zbiAqLwotCSAgby0+bWF0Y2ggPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsIGUtPnJhbmdlKTsKLQkgIG8tPnBpbmZvID0gMDsKLQotI2lmZGVmIFVTRV9NQUNST1MKLQkgIG8tPm1hc2sgPSBpZCsrOwkvKiBGSVhNRSBob3cgdG8gY2F0Y2ggZHVycmluZyBhc3NlbWJseT8gKi8KLQkgIG8tPm1hdGNoID0gMDsJCS8qIGZvciBtYWNyb3MsIHRoZSBpbnNuX2lzYSBudW1iZXIgKi8KLQkgIG8tPnBpbmZvID0gSU5TTl9NQUNSTzsKLSNlbmRpZgotCi0JICAvKiBEb24ndCBhZGQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNhdXNlZCBhbiBlcnJvciAqLwotCSAgaWYgKG8tPmFyZ3MpCi0JICAgIG8rKzsKLQkgIGVsc2UKLQkgICAgbmV3X251bV9vcGNvZGVzLS07Ci0JfQotICAgIH0KLSAgSVRCTF9PUENPREVTID0gbmV3X29wY29kZXM7Ci0gIElUQkxfTlVNX09QQ09ERVMgPSBuZXdfbnVtX29wY29kZXM7Ci0KLSAgLyogRklYTUUKLQkJQXQgdGhpcyBwb2ludCwgd2UgY2FuIGZyZWUgdGhlIGVudHJpZXMsIGFzIHRoZXkgc2hvdWxkIGhhdmUKLQkJYmVlbiBhZGRlZCB0byB0aGUgYXNzZW1ibGVyJ3MgdGFibGVzLgotCQlEb24ndCBmcmVlIG5hbWUgdGhvdWdoLCBzaW5jZSBuYW1lIGlzIGJlaW5nIHVzZWQgYnkgdGhlIG5ldwotCQlvcGNvZGVzIHRhYmxlLgotCi0JCUV2ZW50dWFsbHksIHdlIHNob3VsZCBhbHNvIGZyZWUgdGhlIG5ldyBvcGNvZGVzIHRhYmxlIGl0c2VsZiAKLQkJb24gZXhpdC4KLQkqLwotfQotCi1zdGF0aWMgY2hhciAqCi1mb3JtX2FyZ3MgKHN0cnVjdCBpdGJsX2VudHJ5ICplKQotewotICBzdGF0aWMgY2hhciBzWzMxXTsKLSAgY2hhciBjID0gMCwgKnAgPSBzOwotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLQotICBBU1NFUlQgKGUpOwotICBmb3IgKGYgPSBlLT5maWVsZHM7IGY7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoZi0+dHlwZSkKLQl7Ci0JY2FzZSBlX2RyZWc6Ci0JICBjID0gJ2QnOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2NyZWc6Ci0JICBjID0gJ3QnOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2dyZWc6Ci0JICBjID0gJ3MnOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2ltbWVkOgotCSAgYyA9ICdpJzsKLQkgIGJyZWFrOwotCWNhc2UgZV9hZGRyOgotCSAgYyA9ICdhJzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBjID0gMDsJCS8qIGlnbm9yZTsgdW5rbm93biBmaWVsZCB0eXBlICovCi0JfQotICAgICAgaWYgKGMpCi0JewotCSAgaWYgKHAgIT0gcykKLQkgICAgKnArKyA9ICcsJzsKLQkgICpwKysgPSBjOwotCX0KLSAgICB9Ci0gICpwID0gMDsKLSAgcmV0dXJuIHM7Ci19Ci0jZW5kaWYgLyogIVNUQU5EX0FMT05FICovCi0KLQotLyogR2V0IHByb2Nlc3NvcidzIHJlZ2lzdGVyIG5hbWUgZnJvbSB2YWwgKi8KLQotaW50Ci1pdGJsX2dldF9yZWdfdmFsIChjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpwdmFsKQotewotICBlX3R5cGUgdDsKLSAgZV9wcm9jZXNzb3IgcDsKLQotICBmb3IgKHAgPSBlX3AwOyBwIDwgZV9ucHJvY3M7IHArKykKLSAgICB7Ci0gICAgICBmb3IgKHQgPSBlX3JlZ3R5cGUwOyB0IDwgZV9ucmVndHlwZXM7IHQrKykKLQl7Ci0JICBpZiAoaXRibF9nZXRfdmFsIChwLCB0LCBuYW1lLCBwdmFsKSkKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotaXRibF9nZXRfbmFtZSAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAvKiB0eXBlIGRlcGVuZHMgb24gaW5zdHJ1Y3Rpb24gcGFzc2VkICovCi0gIHIgPSBmaW5kX2VudHJ5X2J5dmFsIChwcm9jZXNzb3IsIHR5cGUsIHZhbCwgMCk7Ci0gIGlmIChyKQotICAgIHJldHVybiByLT5uYW1lOwotICBlbHNlCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotfQotCi0vKiBHZXQgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgdmFsdWUgZnJvbSBuYW1lICovCi0KLWludAotaXRibF9nZXRfdmFsIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCBjaGFyICpuYW1lLAotCSAgICAgIHVuc2lnbmVkIGxvbmcgKnB2YWwpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAvKiB0eXBlIGRlcGVuZHMgb24gaW5zdHJ1Y3Rpb24gcGFzc2VkICovCi0gIHIgPSBmaW5kX2VudHJ5X2J5bmFtZSAocHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgaWYgKHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgKnB2YWwgPSByLT52YWx1ZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogQXNzZW1ibGUgaW5zdHJ1Y3Rpb24gIm5hbWUiIHdpdGggb3BlcmFuZHMgInMiLgotICogbmFtZSAtIG5hbWUgb2YgaW5zdHJ1Y3Rpb24KLSAqIHMgLSBvcGVyYW5kcwotICogcmV0dXJucyAtIGxvbmcgd29yZCBmb3IgYXNzZW1ibGVkIGluc3RydWN0aW9uICovCi0KLXVuc2lnbmVkIGxvbmcgCi1pdGJsX2Fzc2VtYmxlIChjaGFyICpuYW1lLCBjaGFyICpzKQotewotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmU7Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmOwotICBjaGFyICpuOwotICBpbnQgcHJvY2Vzc29yOwotCi0gIGlmICghbmFtZSB8fCAhKm5hbWUpCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3IhICBtdXN0IGhhdmUgYSBvcGNvZGUgbmFtZS9leHByICovCi0KLSAgLyogZmluZCBlbnRyeSBpbiBsaXN0IG9mIGluc3RydWN0aW9ucyBmb3IgYWxsIHByb2Nlc3NvcnMgKi8KLSAgZm9yIChwcm9jZXNzb3IgPSAwOyBwcm9jZXNzb3IgPCBlX25wcm9jczsgcHJvY2Vzc29yKyspCi0gICAgewotICAgICAgZSA9IGZpbmRfZW50cnlfYnluYW1lIChwcm9jZXNzb3IsIGVfaW5zbiwgbmFtZSk7Ci0gICAgICBpZiAoZSkKLQlicmVhazsKLSAgICB9Ci0gIGlmICghZSkKLSAgICByZXR1cm4gMDsJCQkvKiBvcGNvZGUgbm90IGluIHRhYmxlOyBpbnZhbGlkIGluc3RydXN0aW9uICovCi0gIG9wY29kZSA9IGJ1aWxkX29wY29kZSAoZSk7Ci0KLSAgLyogcGFyc2Ugb3Bjb2RlJ3MgYXJncyAoaWYgYW55KSAqLwotICBmb3IgKGYgPSBlLT5maWVsZHM7IGY7IGYgPSBmLT5uZXh0KQkvKiBmb3IgZWFjaCBhcmcsIC4uLiAqLwotICAgIHsKLSAgICAgIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgIGlmICghcyB8fCAhKnMpCi0JcmV0dXJuIDA7CQkvKiBlcnJvciAtIG5vdCBlbm91Z2ggb3BlcmFuZHMgKi8KLSAgICAgIG4gPSBpdGJsX2dldF9maWVsZCAoJnMpOwotICAgICAgLyogbiBzaG91bGQgYmUgaW4gZm9ybSAkbiBvciAweGhoaCAoYXJlIHN5bWJvbCBuYW1lcyB2YWxpZD8/ICovCi0gICAgICBzd2l0Y2ggKGYtPnR5cGUpCi0JewotCWNhc2UgZV9kcmVnOgotCWNhc2UgZV9jcmVnOgotCWNhc2UgZV9ncmVnOgotCSAgLyogQWNjZXB0IGVpdGhlciBhIHN0cmluZyBuYW1lCi0JCQkgKiBvciAnJCcgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyIG51bWJlciAqLwotCSAgaWYgKCpuID09ICckJykKLQkgICAgewotCSAgICAgIG4rKzsKLQkgICAgICB2YWx1ZSA9IHN0cnRvbCAobiwgMCwgMTApOwotCSAgICAgIC8qIEZJWE1FISBjb3VsZCBoYXZlICIwbCIuLi4gdGhlbiB3aGF0Pz8gKi8KLQkgICAgICBpZiAodmFsdWUgPT0gMCAmJiAqbiAhPSAnMCcpCi0JCXJldHVybiAwOwkvKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHIgPSBmaW5kX2VudHJ5X2J5bmFtZSAoZS0+cHJvY2Vzc29yLCBmLT50eXBlLCBuKTsKLQkgICAgICBpZiAocikKLQkJdmFsdWUgPSByLT52YWx1ZTsKLQkgICAgICBlbHNlCi0JCXJldHVybiAwOwkvKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICovCi0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgZV9hZGRyOgotCSAgLyogdXNlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZSB0byBmaW5kIHN5bWJvbCAqLwotCSAgLyogRklYTUUhISBEbyB3ZSBuZWVkIHRoaXM/Ci0JCQkJaWYgc28sIHdoYXQgYWJvdXQgcmVsb2NzPz8KLQkJCQlteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCQkJCXJldHVybiAwOwkvLSogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLS8KLQkJCQlicmVhazsKLQkJCSovCi0JICAvKiBJZiBub3QgYSBzeW1ib2wsIGZhbGwgdGhydSB0byBJTU1FRCAqLwotCWNhc2UgZV9pbW1lZDoKLQkgIGlmICgqbiA9PSAnMCcgJiYgKihuICsgMSkgPT0gJ3gnKQkvKiBoZXggYmVnaW5zIDB4Li4uICovCi0JICAgIHsKLQkgICAgICBuICs9IDI7Ci0JICAgICAgdmFsdWUgPSBzdHJ0b2wgKG4sIDAsIDE2KTsKLQkgICAgICAvKiBGSVhNRSEgY291bGQgaGF2ZSAiMHhsIi4uLiB0aGVuIHdoYXQ/PyAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IHN0cnRvbCAobiwgMCwgMTApOwotCSAgICAgIC8qIEZJWE1FISBjb3VsZCBoYXZlICIwbCIuLi4gdGhlbiB3aGF0Pz8gKi8KLQkgICAgICBpZiAodmFsdWUgPT0gMCAmJiAqbiAhPSAnMCcpCi0JCXJldHVybiAwOwkvKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICovCi0JICAgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR1cm4gMDsJCS8qIGVycm9yOyBpbnZhbGlkIGZpZWxkIHNwZWMgKi8KLQl9Ci0gICAgICBvcGNvZGUgfD0gYXBwbHlfcmFuZ2UgKHZhbHVlLCBmLT5yYW5nZSk7Ci0gICAgfQotICBpZiAocyAmJiAqcykKLSAgICByZXR1cm4gMDsJCQkvKiBlcnJvciAtIHRvbyBtYW55IG9wZXJhbmRzICovCi0gIHJldHVybiBvcGNvZGU7CQkvKiBkb25lISAqLwotfQotCi0vKiBEaXNhc3NlbWJsZSBpbnN0cnVjdGlvbiAiaW5zbiIuCi0gKiBpbnNuIC0gaW5zdHJ1Y3Rpb24KLSAqIHMgLSBidWZmZXIgdG8gaG9sZCBkaXNhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24KLSAqIHJldHVybnMgLSAxIGlmIHN1Y2NlZWRlZDsgMCBpZiBmYWlsZWQKLSAqLwotCi1pbnQgCi1pdGJsX2Rpc2Fzc2VtYmxlIChjaGFyICpzLCB1bnNpZ25lZCBsb25nIGluc24pCi17Ci0gIGVfcHJvY2Vzc29yIHByb2Nlc3NvcjsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmU7Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmOwotCi0gIGlmICghSVRCTF9JU19JTlNOIChpbnNuKSkKLSAgICByZXR1cm4gMDsJCQkvKiBlcnJvciovCi0gIHByb2Nlc3NvciA9IGdldF9wcm9jZXNzb3IgKElUQkxfREVDT0RFX1BOVU0gKGluc24pKTsKLQotICAvKiBmaW5kIGVudHJ5IGluIGxpc3QgKi8KLSAgZSA9IGZpbmRfZW50cnlfYnl2YWwgKHByb2Nlc3NvciwgZV9pbnNuLCBpbnNuLCAwKTsKLSAgaWYgKCFlKQotICAgIHJldHVybiAwOwkJCS8qIG9wY29kZSBub3QgaW4gdGFibGU7IGludmFsaWQgaW5zdHJ1c3Rpb24gKi8KLSAgc3RyY3B5IChzLCBlLT5uYW1lKTsKLQotICAvKiBwYXJzZSBpbnNuJ3MgYXJncyAoaWYgYW55KSAqLwotICBmb3IgKGYgPSBlLT5maWVsZHM7IGY7IGYgPSBmLT5uZXh0KQkvKiBmb3IgZWFjaCBhcmcsIC4uLiAqLwotICAgIHsKLSAgICAgIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotICAgICAgaWYgKGYgPT0gZS0+ZmllbGRzKQkvKiBmaXJzdCBvcGVyYW5kIGlzIHByZWNlZWRlZCBieSB0YWIgKi8KLQlzdHJjYXQgKHMsICJcdCIpOwotICAgICAgZWxzZQkJCS8qICcsJ3Mgc2VwYXJhdGUgZm9sbG93aW5nIG9wZXJhbmRzICovCi0Jc3RyY2F0IChzLCAiLCIpOwotICAgICAgdmFsdWUgPSBleHRyYWN0X3JhbmdlIChpbnNuLCBmLT5yYW5nZSk7Ci0gICAgICAvKiBuIHNob3VsZCBiZSBpbiBmb3JtICRuIG9yIDB4aGhoIChhcmUgc3ltYm9sIG5hbWVzIHZhbGlkPz8gKi8KLSAgICAgIHN3aXRjaCAoZi0+dHlwZSkKLQl7Ci0JY2FzZSBlX2RyZWc6Ci0JY2FzZSBlX2NyZWc6Ci0JY2FzZSBlX2dyZWc6Ci0JICAvKiBBY2NlcHQgZWl0aGVyIGEgc3RyaW5nIG5hbWUKLQkJCSAqIG9yICckJyBmb2xsb3dlZCBieSB0aGUgcmVnaXN0ZXIgbnVtYmVyICovCi0JICByID0gZmluZF9lbnRyeV9ieXZhbCAoZS0+cHJvY2Vzc29yLCBmLT50eXBlLCB2YWx1ZSwgJmYtPnJhbmdlKTsKLQkgIGlmIChyKQotCSAgICBzdHJjYXQgKHMsIHItPm5hbWUpOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChzLCAiJXMkJWx1IiwgcywgdmFsdWUpOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2FkZHI6Ci0JICAvKiB1c2UgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlIHRvIGZpbmQgc3ltYm9sICovCi0JICAvKiBGSVhNRSEhIERvIHdlIG5lZWQgdGhpcz8KLQkJCSAqICAgaWYgc28sIHdoYXQgYWJvdXQgcmVsb2NzPz8KLQkJCSovCi0JICAvKiBJZiBub3QgYSBzeW1ib2wsIGZhbGwgdGhydSB0byBJTU1FRCAqLwotCWNhc2UgZV9pbW1lZDoKLQkgIHNwcmludGYgKHMsICIlczB4JWx4IiwgcywgdmFsdWUpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiAwOwkJLyogZXJyb3I7IGludmFsaWQgZmllbGQgc3BlYyAqLwotCX0KLSAgICB9Ci0gIHJldHVybiAxOwkJCS8qIGRvbmUhICovCi19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotICogTG9jYWwgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgcHJpdmF0ZSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcKLSAqIHRoZSBuYW1lcyBhbmQgZm9ybWF0IGZvciB0aGUgbmV3IGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzCi0gKiBmb3IgZWFjaCBwcm9jZXNzb3IuCi0gKi8KLQotLyogQ2FsY3VsYXRlIGluc3RydWN0aW9uJ3Mgb3Bjb2RlIGFuZCBmdW5jdGlvbiB2YWx1ZXMgZnJvbSBlbnRyeSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAKLWJ1aWxkX29wY29kZSAoc3RydWN0IGl0YmxfZW50cnkgKmUpCi17Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIG9wY29kZSA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOwotICBvcGNvZGUgfD0gSVRCTF9FTkNPREVfUE5VTSAoZS0+cHJvY2Vzc29yKTsKLSAgcmV0dXJuIG9wY29kZTsKLX0KLQotLyogQ2FsY3VsYXRlIGFic29sdXRlIHZhbHVlIGdpdmVuIHRoZSByZWxhdGl2ZSB2YWx1ZSBhbmQgYml0IHBvc2l0aW9uIHJhbmdlCi0gKiB3aXRoaW4gdGhlIGluc3RydWN0aW9uLgotICogVGhlIHJhbmdlIGlzIGluY2x1c2l2ZSB3aGVyZSAwIGlzIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KLSAqIEEgcmFuZ2Ugb2YgeyAyNCwgMjAgfSB3aWxsIGhhdmUgYSBtYXNrIG9mCi0gKiBiaXQgICAzICAgICAgICAgICAyICAgICAgICAgICAgMQotICogcG9zOiAxMDk4IDc2NTQgMzIxMCA5ODc2IDU0MzIgMTA5OCA3NjU0IDMyMTAKLSAqIGJpbjogMDAwMCAwMDAxIDExMTEgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwCi0gKiBoZXg6ICAgIDAgICAgMSAgICBmICAgIDAgICAgMCAgICAwICAgIDAgICAgMAotICogbWFzazogMHgwMWYwMDAwMC4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAKLWFwcGx5X3JhbmdlICh1bnNpZ25lZCBsb25nIHJ2YWwsIHN0cnVjdCBpdGJsX3JhbmdlIHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgdW5zaWduZWQgbG9uZyBhdmFsOwotICBpbnQgbGVuID0gTUFYX0JJVFBPUyAtIHIuc2JpdDsKLQotICBBU1NFUlQgKHIuc2JpdCA+PSByLmViaXQpOwotICBBU1NFUlQgKE1BWF9CSVRQT1MgPj0gci5zYml0KTsKLSAgQVNTRVJUIChyLmViaXQgPj0gMCk7Ci0KLSAgLyogY3JlYXRlIG1hc2sgYnkgdHJ1bmNhdGluZyAxcyBieSBzaGlmdGluZyAqLwotICBtYXNrID0gMHhmZmZmZmZmZiA8PCBsZW47Ci0gIG1hc2sgPSBtYXNrID4+IGxlbjsKLSAgbWFzayA9IG1hc2sgPj4gci5lYml0OwotICBtYXNrID0gbWFzayA8PCByLmViaXQ7Ci0KLSAgYXZhbCA9IChydmFsIDw8IHIuZWJpdCkgJiBtYXNrOwotICByZXR1cm4gYXZhbDsKLX0KLQotLyogQ2FsY3VsYXRlIHJlbGF0aXZlIHZhbHVlIGdpdmVuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhbmQgYml0IHBvc2l0aW9uIHJhbmdlCi0gKiB3aXRoaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgCi1leHRyYWN0X3JhbmdlICh1bnNpZ25lZCBsb25nIGF2YWwsIHN0cnVjdCBpdGJsX3JhbmdlIHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgdW5zaWduZWQgbG9uZyBydmFsOwotICBpbnQgbGVuID0gTUFYX0JJVFBPUyAtIHIuc2JpdDsKLQotICAvKiBjcmVhdGUgbWFzayBieSB0cnVuY2F0aW5nIDFzIGJ5IHNoaWZ0aW5nICovCi0gIG1hc2sgPSAweGZmZmZmZmZmIDw8IGxlbjsKLSAgbWFzayA9IG1hc2sgPj4gbGVuOwotICBtYXNrID0gbWFzayA+PiByLmViaXQ7Ci0gIG1hc2sgPSBtYXNrIDw8IHIuZWJpdDsKLQotICBydmFsID0gKGF2YWwgJiBtYXNrKSA+PiByLmViaXQ7Ci0gIHJldHVybiBydmFsOwotfQotCi0vKiBFeHRyYWN0IHByb2Nlc3NvcidzIGFzc2VtYmx5IGluc3RydWN0aW9uIGZpZWxkIG5hbWUgZnJvbSBzOwotICogZm9ybXMgYXJlICJuIGFyZ3MiICJuLGFyZ3MiIG9yICJuIiAqLwotLyogUmV0dXJuIG5leHQgYXJndW1lbnQgZnJvbSBzdHJpbmcgcG9pbnRlciAicyIgYW5kIGFkdmFuY2Ugcy4KLSAqIGRlbGltaXRlcnMgYXJlICIgLCgpIiAqLwotCi1jaGFyICoKLWl0YmxfZ2V0X2ZpZWxkIChjaGFyICoqUykKLXsKLSAgc3RhdGljIGNoYXIgblsxMjhdOwotICBjaGFyICpzOwotICBpbnQgbGVuOwotCi0gIHMgPSAqUzsKLSAgaWYgKCFzIHx8ICEqcykKLSAgICByZXR1cm4gMDsKLSAgLyogRklYTUU6IFRoaXMgaXMgYSB3ZWlyZCBzZXQgb2YgZGVsaW1pdGVycy4gICovCi0gIGxlbiA9IHN0cmNzcG4gKHMsICIgXHQsKCkiKTsKLSAgQVNTRVJUICgxMjggPiBsZW4gKyAxKTsKLSAgc3RybmNweSAobiwgcywgbGVuKTsKLSAgbltsZW5dID0gMDsKLSAgaWYgKHNbbGVuXSA9PSAnXDAnKQotICAgIHMgPSAwOwkJCS8qIG5vIG1vcmUgYXJncyAqLwotICBlbHNlCi0gICAgcyArPSBsZW4gKyAxOwkJLyogYWR2YW5jZSB0byBuZXh0IGFyZyAqLwotCi0gICpTID0gczsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIFNlYXJjaCBlbnRyaWVzIGZvciBhIGdpdmVuIHByb2Nlc3NvciBhbmQgdHlwZQotICogdG8gZmluZCBvbmUgbWF0Y2hpbmcgdGhlIG5hbWUgIm4iLgotICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkgKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoKLWZpbmRfZW50cnlfYnluYW1lIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsCi0JCSAgIGVfdHlwZSB0eXBlLCBjaGFyICpuKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLQotICBlcyA9IGdldF9lbnRyaWVzIChwcm9jZXNzb3IsIHR5cGUpOwotICBmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQkvKiBmb3IgZWFjaCBlbnRyeSwgLi4uICovCi0gICAgewotICAgICAgaWYgKCFzdHJjbXAgKGUtPm5hbWUsIG4pKQotCXJldHVybiBlOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNlYXJjaCBlbnRyaWVzIGZvciBhIGdpdmVuIHByb2Nlc3NvciBhbmQgdHlwZQotICogdG8gZmluZCBvbmUgbWF0Y2hpbmcgdGhlIHZhbHVlICJ2YWwiIGZvciB0aGUgcmFuZ2UgInIiLgotICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGRpc2Fzc2VtYmxpbmcgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqCi1maW5kX2VudHJ5X2J5dmFsIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAotCQkgIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgaXRibF9yYW5nZSAqcikKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIHVuc2lnbmVkIGxvbmcgZXZhbDsKLQotICBlcyA9IGdldF9lbnRyaWVzIChwcm9jZXNzb3IsIHR5cGUpOwotICBmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQkvKiBmb3IgZWFjaCBlbnRyeSwgLi4uICovCi0gICAgewotICAgICAgaWYgKHByb2Nlc3NvciAhPSBlLT5wcm9jZXNzb3IpCi0JY29udGludWU7Ci0gICAgICAvKiBGb3IgaW5zbnMsIHdlIG1pZ2h0IG5vdCBrbm93IHRoZSByYW5nZSBvZiB0aGUgb3Bjb2RlLAotCSAqIHNvIGEgcmFuZ2Ugb2YgMCB3aWxsIGFsbG93IHRoaXMgcm91dGluZSB0byBtYXRjaCBhZ2FpbnN0Ci0JICogdGhlIHJhbmdlIG9mIHRoZSBlbnRyeSB0byBiZSBjb21wYXJlZCB3aXRoLgotCSAqIFRoaXMgY291bGQgY2F1c2UgYW1iaWd1aXRpZXMuCi0JICogRm9yIG9wZXJhbmRzLCB3ZSBnZXQgYW4gZXh0cmFjdGVkIHZhbHVlIGFuZCBhIHJhbmdlLgotCSAqLwotICAgICAgLyogaWYgcmFuZ2UgaXMgMCwgbWFzayB2YWwgYWdhaW5zdCB0aGUgcmFuZ2Ugb2YgdGhlIGNvbXBhcmVkIGVudHJ5LiAqLwotICAgICAgaWYgKHIgPT0gMCkJCS8qIGlmIG5vIHJhbmdlIHBhc3NlZCwgbXVzdCBiZSB3aG9sZSAzMi1iaXRzCi0JCQkgKiBzbyBjcmVhdGUgMzItYml0IHZhbHVlIGZyb20gZW50cnkncyByYW5nZSAqLwotCXsKLQkgIGV2YWwgPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsIGUtPnJhbmdlKTsKLQkgIHZhbCAmPSBhcHBseV9yYW5nZSAoMHhmZmZmZmZmZiwgZS0+cmFuZ2UpOwotCX0KLSAgICAgIGVsc2UgaWYgKChyLT5zYml0ID09IGUtPnJhbmdlLnNiaXQgJiYgci0+ZWJpdCA9PSBlLT5yYW5nZS5lYml0KQotCSAgICAgICB8fCAoZS0+cmFuZ2Uuc2JpdCA9PSAwICYmIGUtPnJhbmdlLmViaXQgPT0gMCkpCi0JewotCSAgZXZhbCA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgKnIpOwotCSAgdmFsID0gYXBwbHlfcmFuZ2UgKHZhbCwgKnIpOwotCX0KLSAgICAgIGVsc2UKLQljb250aW51ZTsKLSAgICAgIGlmICh2YWwgPT0gZXZhbCkKLQlyZXR1cm4gZTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBsaXN0IG9mIGVudHJpZXMgZm9yIGEgZ2l2ZW4gcHJvY2Vzc29yIGFuZCB0eXBlLiAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKioKLWdldF9lbnRyaWVzIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlKQotewotICByZXR1cm4gJmVudHJpZXNbcHJvY2Vzc29yXVt0eXBlXTsKLX0KLQotLyogUmV0dXJuIGFuIGludGVncmFsIHZhbHVlIGZvciB0aGUgcHJvY2Vzc29yIHBhc3NlZCBmcm9tIHl5cGFyc2UuICovCi0KLXN0YXRpYyBlX3Byb2Nlc3NvciAKLWdldF9wcm9jZXNzb3IgKGludCB5eXByb2MpCi17Ci0gIC8qIHRyYW5zbGF0ZSBmcm9tIHlhY2MncyBwcm9jZXNzb3IgdG8gZW51bSAqLwotICBpZiAoeXlwcm9jID49IGVfcDAgJiYgeXlwcm9jIDwgZV9ucHJvY3MpCi0gICAgcmV0dXJuIChlX3Byb2Nlc3NvcikgeXlwcm9jOwotICByZXR1cm4gZV9pbnZwcm9jOwkJLyogZXJyb3I7IGludmFsaWQgcHJvY2Vzc29yICovCi19Ci0KLS8qIFJldHVybiBhbiBpbnRlZ3JhbCB2YWx1ZSBmb3IgdGhlIGVudHJ5IHR5cGUgcGFzc2VkIGZyb20geXlwYXJzZS4gKi8KLQotc3RhdGljIGVfdHlwZSAKLWdldF90eXBlIChpbnQgeXl0eXBlKQotewotICBzd2l0Y2ggKHl5dHlwZSkKLSAgICB7Ci0gICAgICAvKiB0cmFuc2xhdGUgZnJvbSB5YWNjJ3MgdHlwZSB0byBlbnVtICovCi0gICAgY2FzZSBJTlNOOgotICAgICAgcmV0dXJuIGVfaW5zbjsKLSAgICBjYXNlIERSRUc6Ci0gICAgICByZXR1cm4gZV9kcmVnOwotICAgIGNhc2UgQ1JFRzoKLSAgICAgIHJldHVybiBlX2NyZWc7Ci0gICAgY2FzZSBHUkVHOgotICAgICAgcmV0dXJuIGVfZ3JlZzsKLSAgICBjYXNlIEFERFI6Ci0gICAgICByZXR1cm4gZV9hZGRyOwotICAgIGNhc2UgSU1NRUQ6Ci0gICAgICByZXR1cm4gZV9pbW1lZDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGVfaW52dHlwZTsJCS8qIGVycm9yOyBpbnZhbGlkIHR5cGUgKi8KLSAgICB9Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gZW50cnkgKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoKLWFsbG9jX2VudHJ5IChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAotCSAgICAgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIGlmICghbmFtZSkKLSAgICByZXR1cm4gMDsKLSAgZSA9IChzdHJ1Y3QgaXRibF9lbnRyeSAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGl0YmxfZW50cnkpKTsKLSAgaWYgKGUpCi0gICAgewotICAgICAgbWVtc2V0IChlLCAwLCBzaXplb2YgKHN0cnVjdCBpdGJsX2VudHJ5KSk7Ci0gICAgICBlLT5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKHN0cmxlbiAobmFtZSkpICsgMSk7Ci0gICAgICBpZiAoZS0+bmFtZSkKLQlzdHJjcHkgKGUtPm5hbWUsIG5hbWUpOwotICAgICAgZS0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOwotICAgICAgZS0+dHlwZSA9IHR5cGU7Ci0gICAgICBlLT52YWx1ZSA9IHZhbHVlOwotICAgICAgZXMgPSBnZXRfZW50cmllcyAoZS0+cHJvY2Vzc29yLCBlLT50eXBlKTsKLSAgICAgIGUtPm5leHQgPSAqZXM7Ci0gICAgICAqZXMgPSBlOwotICAgIH0KLSAgcmV0dXJuIGU7Ci19Ci0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGVudHJ5J3MgZmllbGQgKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2ZpZWxkICoKLWFsbG9jX2ZpZWxkIChlX3R5cGUgdHlwZSwgaW50IHNiaXQsIGludCBlYml0LAotCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmY7Ci0gIGYgPSAoc3RydWN0IGl0YmxfZmllbGQgKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBpdGJsX2ZpZWxkKSk7Ci0gIGlmIChmKQotICAgIHsKLSAgICAgIG1lbXNldCAoZiwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXRibF9maWVsZCkpOwotICAgICAgZi0+dHlwZSA9IHR5cGU7Ci0gICAgICBmLT5yYW5nZS5zYml0ID0gc2JpdDsKLSAgICAgIGYtPnJhbmdlLmViaXQgPSBlYml0OwotICAgICAgZi0+ZmxhZ3MgPSBmbGFnczsKLSAgICB9Ci0gIHJldHVybiBmOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2l0Ymwtb3BzLmggYi9nYXMvaXRibC1vcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ZWE3Zi4uMDAwMDAwMAotLS0gYS9nYXMvaXRibC1vcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKiBpdGJsLW9wcy5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEV4dGVybmFsIGZ1bmN0aW9ucywgY29uc3RhbnRzIGFuZCBkZWZpbmVzIGZvciBpdGJsIHN1cHBvcnQgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEluY2x1ZGUgZmlsZSBub3RlczogImV4cHIuaCIgbmVlZGVkIGJlZm9yZSB0YXJnLSouaCwKLSAqICJ0YXJnLWVudi5oIiBpbmNsdWRlcyB0aGUgY2hhaW4gb2YgdGFyZ2V0IGRlcGVuZGFudCBoZWFkZXJzLAotICogInRhcmctY3B1LmgiIGhhcyB0aGUgSEFWRV9JVEJMX0NQVSBkZWZpbmUsIGFuZAotICogYXMuaCBpbmNsdWRlcyB0aGVtIGFsbCAqLwotI2luY2x1ZGUgImFzLmgiCi0KLSNpZmRlZiBIQVZFX0lUQkxfQ1BVCi0jaW5jbHVkZSAiaXRibC1jcHUuaCIKLSNlbmRpZgotCi0vKiBEZWZhdWx0cyBmb3IgZGVmaW5pdGlvbnMgcmVxdWlyZWQgYnkgZ2VuZXJpYyBjb2RlICovCi0jaWZuZGVmIElUQkxfTlVNQkVSX09GX1BST0NFU1NPUlMKLSNkZWZpbmUgSVRCTF9OVU1CRVJfT0ZfUFJPQ0VTU09SUyAxCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX01BWF9CSVRQT1MKLSNkZWZpbmUgSVRCTF9NQVhfQklUUE9TIDMxCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX1RZUEUKLSNkZWZpbmUgSVRCTF9UWVBFIHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfSVNfSU5TTgotI2RlZmluZSBJVEJMX0lTX0lOU04oaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9ERUNPREVfUE5VTQotI2RlZmluZSBJVEJMX0RFQ09ERV9QTlVNKGluc24pIDAKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfRU5DT0RFX1BOVU0KLSNkZWZpbmUgSVRCTF9FTkNPREVfUE5VTShwbnVtKSAwCi0jZW5kaWYKLQotdHlwZWRlZiBJVEJMX1RZUEUgdF9pbnNuOwotCi0vKiB0eXBlcyBvZiBlbnRyaWVzICovCi10eXBlZGVmIGVudW0KLSAgewotICAgIGVfaW5zbiwKLSAgICBlX2RyZWcsCi0gICAgZV9yZWd0eXBlMCA9IGVfZHJlZywKLSAgICBlX2NyZWcsCi0gICAgZV9ncmVnLAotICAgIGVfYWRkciwKLSAgICBlX25yZWd0eXBlcyA9IGVfZ3JlZyArIDEsCi0gICAgZV9pbW1lZCwKLSAgICBlX250eXBlcywKLSAgICBlX2ludnR5cGUJCQkvKiBpbnZhbGlkIHR5cGUgKi8KLSAgfSBlX3R5cGU7Ci0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgZV9wMCwKLSAgICBlX25wcm9jcyA9IE5VTUJFUl9PRl9QUk9DRVNTT1JTLAotICAgIGVfaW52cHJvYwkJCS8qIGludmFsaWQgcHJvY2Vzc29yICovCi0gIH0gZV9wcm9jZXNzb3I7Ci0KLS8qIDAgbWVhbnMgYW4gaW5zdHJ1Y3Rpb24gdGFibGUgd2FzIG5vdCBzcGVjaWZpZWQuICovCi1leHRlcm4gaW50IGl0YmxfaGF2ZV9lbnRyaWVzOwotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgdmlzaWJsZSB0byB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgKi8KLQotaW50IGl0YmxfcGFyc2UgUEFSQU1TICgoY2hhciAqaW5zbnRibCkpOwotdm9pZCBpdGJsX2luaXQgUEFSQU1TICgodm9pZCkpOwotY2hhciAqaXRibF9nZXRfZmllbGQgUEFSQU1TICgoY2hhciAqKnMpKTsKLXVuc2lnbmVkIGxvbmcgaXRibF9hc3NlbWJsZSBQQVJBTVMgKChjaGFyICpuYW1lLCBjaGFyICpvcGVyYW5kcykpOwotaW50IGl0YmxfZGlzYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGluc24pKTsKLWludCBpdGJsX3BhcnNlIFBBUkFNUyAoKGNoYXIgKnRibCkpOwkvKiBwYXJzZXMgaW5zbiB0YmwgKi8KLWludCBpdGJsX2dldF9yZWdfdmFsIFBBUkFNUyAoKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnB2YWwpKTsKLWludCBpdGJsX2dldF92YWwgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKLQkJCSAgdW5zaWduZWQgbG9uZyAqcHZhbCkpOwotY2hhciAqaXRibF9nZXRfbmFtZSBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCkpOwotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgY2FsbGVkIGJ5IHRoZSB0YWJsZSBwYXJzZXIgdXNlZCB0byBidWlsZCB0aGUKLSAgIGR5bmFtaWMgbGlzdCBvZiBuZXcgcHJvY2Vzc29yIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzLiAqLwotCi1zdHJ1Y3QgaXRibF9lbnRyeSAqaXRibF9hZGRfcmVnIFBBUkFNUyAoKGludCB5eXByb2MsIGludCB5eXR5cGUsCi0JCQkJCSBjaGFyICpyZWduYW1lLCBpbnQgcmVnbnVtKSk7Ci1zdHJ1Y3QgaXRibF9lbnRyeSAqaXRibF9hZGRfaW5zbiBQQVJBTVMgKChpbnQgeXlwcm9jLCBjaGFyICpuYW1lLAotCSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgaW50IHNiaXQsIGludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdHJ1Y3QgaXRibF9maWVsZCAqaXRibF9hZGRfb3BlcmFuZCBQQVJBTVMgKChzdHJ1Y3QgaXRibF9lbnRyeSAqIGUsIGludCB5eXR5cGUsCi0JCQkJICBpbnQgc2JpdCwgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKZGlmZiAtLWdpdCBhL2dhcy9pdGJsLXBhcnNlLnkgYi9nYXMvaXRibC1wYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTY2ZWU4Li4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLXBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyogaXRibC1wYXJzZS55Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTcgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0lewotCi0vKiAKLQotWWFjYyBncmFtbWFyIGZvciBpbnN0cnVjdGlvbiB0YWJsZSBlbnRyaWVzLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotT3JpZ2luYWwgSW5zdHJ1Y3Rpb24gdGFibGUgc3BlY2lmaWNhdGlvbiBkb2N1bWVudDoKLQotCSAgICBNSVBTIENvcHJvY2Vzc29yIFRhYmxlIFNwZWNpZmljYXRpb24KLQkgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIE1JUFMgY29wcm9jZXNzb3IgdGFibGUuICBUaGUKLXRhYmxlIHNwZWNpZmllcyBhIGxpc3Qgb2YgdmFsaWQgZnVuY3Rpb25zLCBkYXRhIHJlZ2lzdGVycyBhbmQgY29udHJvbAotcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBsaXN0LAotdG9nZXRoZXIgd2l0aCB0aGUgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gY2xhc3NlcyBsaXN0ZWQgYmVsb3csCi1zcGVjaWZpZXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbAotYmUgcmVjb2duaXplZCBhbmQgYXNzZW1ibGVkIGJ5IHRoZSBHTlUgYXNzZW1ibGVyLiAgSW4gZWZmZWN0LAotdGhpcyBtYWtlcyB0aGUgR05VIGFzc2VtYmxlciB0YWJsZS1kcml2ZW4sIHdoZXJlIHRoZSB0YWJsZSBpcwotc3BlY2lmaWVkIGJ5IHRoZSBwcm9ncmFtbWVyLgotCi1UaGUgdGFibGUgaXMgYW4gb3JkaW5hcnkgdGV4dCBmaWxlIHRoYXQgdGhlIEdOVSBhc3NlbWJsZXIgcmVhZHMgd2hlbgotaXQgc3RhcnRzLiAgVXNpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSB0YWJsZSwgdGhlIGFzc2VtYmxlcgotZ2VuZXJhdGVzIGFuIGludGVybmFsIGxpc3Qgb2YgdmFsaWQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGFuZAotZnVuY3Rpb25zLiAgVGhlIGFzc2VtYmxlciB1c2VzIHRoaXMgaW50ZXJuYWwgbGlzdCBpbiBhZGRpdGlvbiB0byB0aGUKLXN0YW5kYXJkIE1JUFMgcmVnaXN0ZXJzIGFuZCBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIGJ1aWx0LWluIHRvIHRoZSAKLWFzc2VtYmxlciBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCi1UbyBzcGVjaWZ5IHRoZSBjb3Byb2Nlc3NvciB0YWJsZSB3aGVuIGludm9raW5nIHRoZSBHTlUgYXNzZW1ibGVyLCB1c2UKLXRoZSBjb21tYW5kIGxpbmUgb3B0aW9uICItLWl0YmwgZmlsZSIsIHdoZXJlIGZpbGUgaXMgdGhlCi1jb21wbGV0ZSBuYW1lIG9mIHRoZSB0YWJsZSwgaW5jbHVkaW5nIHBhdGggYW5kIGV4dGVuc2lvbi4KLQotRXhhbXBsZXM6Ci0KLQkgICAgZ2FzIC10IGNvcC50YmwgdGVzdC5zIC1vIHRlc3QubwotCSAgICBnYXMgLXQgL3Vzci9sb2NhbC9saWIvY29wLnRibCB0ZXN0LnMgLW8gdGVzdC5vCi0JICAgIGdhcyAtLWl0YmwgZDpcZ251XGRhdGFcY29wLnRibCB0ZXN0LnMgLW8gdGVzdC5vCi0KLU9ubHkgb25lIHRhYmxlIG1heSBiZSBzdXBwbGllZCBkdXJpbmcgYSBzaW5nbGUgaW52b2NhdGlvbiBvZgotdGhlIGFzc2VtYmxlci4KLQotCi1JbnN0cnVjdGlvbiBjbGFzc2VzCi09PT09PT09PT09PT09PT09PT09Ci0KLUJlbG93IGlzIGEgbGlzdCBvZiB0aGUgdmFsaWQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gY2xhc3NlcyBmb3IKLWFueSBnaXZlbiBjb3Byb2Nlc3NvciAieiIuICBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGFscmVhZHkgcmVjb2duaXplZAotYnkgdGhlIGFzc2VtYmxlciwgYW5kIGFyZSBsaXN0ZWQgaGVyZSBvbmx5IGZvciByZWZlcmVuY2UuCi0KLUNsYXNzICAgZm9ybWF0CSAgICAJICAgIAkgICAgICBpbnN0cnVjdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNsYXNzMToKLQlvcCBiYXNlIHJ0IG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBMV0N6IHJ0LG9mZnNldCAoYmFzZSkKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgU1dDeiBydCxvZmZzZXQgKGJhc2UpCi1DbGFzczI6Ci0JQ09QeiBzdWIgcnQgcmQgMAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBNVEN6IHJ0LHJkCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIE1GQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQ1RDeiBydCxyZAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBDRkN6IHJ0LHJkCi1DbGFzczM6Ci0JQ09QeiBDTyBjb2Z1bgotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBDT1B6IGNvZnVuCi1DbGFzczQ6Ci0JQ09QeiBCQyBiciBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6VCBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6RiBvZmZzZXQKLUNsYXNzNToKLQlDT1B6IHN1YiBydCByZCAwCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIERNRkN6IHJ0LHJkCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIERNVEN6IHJ0LHJkCi1DbGFzczY6Ci0Jb3AgYmFzZSBydCBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTERDeiBydCxvZmZzZXQgKGJhc2UpCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIFNEQ3ogcnQsb2Zmc2V0IChiYXNlKQotQ2xhc3M3OgotCUNPUHogQkMgYnIgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDelRMIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pGTCBvZmZzZXQKLQotVGhlIGNvcHJvY2Vzc29yIHRhYmxlIGRlZmluZXMgY29wcm9jZXNzb3Itc3BlY2lmaWMgcmVnaXN0ZXJzIHRoYXQgY2FuCi1iZSB1c2VkIHdpdGggYWxsIG9mIHRoZSBhYm92ZSBjbGFzc2VzIG9mIGluc3RydWN0aW9ucywgd2hlcmUKLWFwcHJvcHJpYXRlLiAgSXQgYWxzbyBkZWZpbmVzIGFkZGl0aW9uYWwgY29wcm9jZXNzb3Itc3BlY2lmaWMKLWZ1bmN0aW9ucyBmb3IgQ2xhc3MzIChDT1B6IGNvZnVuKSBpbnN0cnVjdGlvbnMsIFRodXMsIHRoZSB0YWJsZSBhbGxvd3MKLXRoZSBwcm9ncmFtbWVyIHRvIHVzZSBjb252ZW5pZW50IG1uZW1vbmljcyBhbmQgb3BlcmFuZHMgZm9yIHRoZXNlCi1mdW5jdGlvbnMsIGluc3RlYWQgb2YgdGhlIENPUHogbW1lbm1vbmljIGFuZCBjb2Z1biBvcGVyYW5kLgotCi1UaGUgbmFtZXMgb2YgdGhlIE1JUFMgZ2VuZXJhbCByZWdpc3RlcnMgYW5kIHRoZWlyIGFsaWFzZXMgYXJlIGRlZmluZWQKLWJ5IHRoZSBhc3NlbWJsZXIgYW5kIHdpbGwgYmUgcmVjb2duaXplZCBhcyB2YWxpZCByZWdpc3RlciBuYW1lcyBieSB0aGUKLWFzc2VtYmxlciB3aGVuIHVzZWQgKHdoZXJlIGFsbG93ZWQpIGluIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy4KLUhvd2V2ZXIsIHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIGFsbCBjb3Byb2Nlc3NvciBkYXRhIGFuZCBjb250cm9sCi1yZWdpc3RlciBtbmVtb25pY3MgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhlIGNvcHJvY2Vzc29yIHRhYmxlLgotCi0KLVRhYmxlIEdyYW1tYXIKLT09PT09PT09PT09PT0KLQotSGVyZSBpcyB0aGUgZ3JhbW1hciBmb3IgdGhlIGNvcHJvY2Vzc29yIHRhYmxlOgotCi0JICAgIHRhYmxlIC0+IGVudHJ5KgotCi0JICAgIGVudHJ5IC0+IFt6IGVudHJ5ZGVmXSBbY29tbWVudF0gJ1xuJwotCi0JICAgIGVudHJ5ZGVmIC0+IHR5cGUgbmFtZSB2YWwKLQkgICAgZW50cnlkZWYgLT4gJ2luc24nIG5hbWUgdmFsIGZ1bmNkZWYgOyB0eXBlIG9mIGVudHJ5IChpbnN0cnVjdGlvbikKLQotCSAgICB6IC0+ICdwJ1snMCcuLiczJ10JICAgIAkgICAgIDsgcHJvY2Vzc29yIG51bWJlciAKLQkgICAgdHlwZSAtPiBbJ2RyZWcnIHwgJ2NyZWcnIHwgJ2dyZWcnIF0JICAgICA7IHR5cGUgb2YgZW50cnkgKHJlZ2lzdGVyKQotCTsgJ2RyZWcnLCAnY3JlZycgb3IgJ2dyZWcnIHNwZWNpZmllcyBhIGRhdGEsIGNvbnRyb2wsIG9yIGdlbmVyYWwKLQk7CSAgICByZWdpc3RlciBtbmVtb25pYywgcmVzcGVjdGl2ZWx5Ci0JICAgIG5hbWUgLT4gW2x0cnxkZWNdKgkgICAgCSAgICAgOyBtbmVtb25pYyBvZiByZWdpc3Rlci9mdW5jdGlvbgotCSAgICB2YWwgLT4gW2RlY3xoZXhdCSAgICAJICAgICA7IHJlZ2lzdGVyL2Z1bmN0aW9uIG51bWJlciAoaW50ZWdlciBjb25zdGFudCkKLQotCSAgICBmdW5jZGVmIC0+IGZyYW5nZSBmbGFncyBmaWVsZHMKLQkgICAgCSAgICAJICAgIAk7IGJpdGZpZWxkIHJhbmdlIGZvciBvcGNvZGUKLQkgICAgCSAgICAJICAgIAk7IGxpc3Qgb2YgZmllbGRzJyBmb3JtYXRzCi0JICAgIGZpZWxkcyAtPiBmaWVsZCoKLQkgICAgZmllbGQgLT4gWycsJ10gZnR5cGUgZnJhbmdlIGZsYWdzCi0JICAgIGZsYWdzIC0+IFsnKicgZmxhZ2V4cHJdCi0JICAgIGZsYWdleHByIC0+ICdbJyBmbGFnZXhwciAnXScKLQkgICAgZmxhZ2V4cHIgLT4gdmFsICd8JyBmbGFnZXhwciAKLQkgICAgZnR5cGUgLT4gWyB0eXBlIHwgJ2ltbWVkJyB8ICdhZGRyJyBdCi0JOyAnaW1tZWQnIHNwZWNpZmllcyBhbiBpbW1lZGlhdGUgdmFsdWU7IHNlZSBncmFtbWFyIGZvciAidmFsIiBhYm92ZQotCSAgICAJOyAnYWRkcicgc3BlY2lmaWVzIGEgQyBpZGVudGlmaWVyOyBuYW1lIG9mIHN5bWJvbCB0byBiZSByZXNvbHZlZCBhdCAKLQk7CSAgICBsaW5rIHRpbWUKLQkgICAgZnJhbmdlIC0+ICc6JyB2YWwgJy0nIHZhbAk7IHN0YXJ0aW5nIHRvIGVuZGluZyBiaXQgcG9zaXRpb25zLCB3aGVyZQotCSAgICAJICAgIAkgICAgCTsgd2hlcmUgMCBpcyBsZWFzdCBzaWduaWZpY2FudCBiaXQKLQkgICAgZnJhbmdlIC0+IChudWxsKQkgICAgCTsgZGVmYXVsdCByYW5nZSBvZiAzMS0wIHdpbGwgYmUgYXNzdW1lZAotCi0JICAgIGNvbW1lbnQgLT4gWyc7J3wnIyddIFtjaGFyXSoKLQkgICAgY2hhciAtPiBhbnkgcHJpbnRhYmxlIGNoYXJhY3RlcgotCSAgICBsdHIgLT4gWydhJy4uJ3onfCdBJy4uJ1onXSAKLQkgICAgZGVjIC0+IFsnMCcuLic5J10qCSAgICAJICAgIAkgICAgCSAgICAJICAgICA7IHZhbHVlIGluIGRlY2ltYWwKLQkgICAgaGV4IC0+ICcweCdbJzAnLi4nOScgfCAnYScuLidmJyB8ICdBJy4uJ0YnXSoJOyB2YWx1ZSBpbiBoZXhpZGVjaW1hbCAKLQotCi1FeGFtcGxlcwotPT09PT09PT0KLQotRXhhbXBsZSAxOgotCi1UaGUgdGFibGU6Ci0KLQkgICAgcDEgZHJlZyBkMSAxCSAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMSIgZm9yIENPUDEgaGFzIHZhbHVlIDEKLQkgICAgcDEgY3JlZyBjMyAzCSAgICAgOyBjdHJsIHJlZ2lzdGVyICJjMyIgZm9yIENPUDEgaGFzIHZhbHVlIDMKLQkgICAgcDMgZnVuYyBmaWxsIDB4MWY6MjQtMjAJICAgICAgOyBmdW5jdGlvbiAiZmlsbCIgZm9yIENPUDMgaGFzIHZhbHVlIDMxIGFuZCAKLQkgICAgCSAgICAJOyBubyBmaWVsZHMKLQotd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCB0aGUgZm9sbG93aW5nIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uczoKLQotCSAgICBMV0MxIGQxLDB4MTAwICgkMikKLQkgICAgZmlsbAotCi1IZXJlLCB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICIkMiIsIGFuZCBpbnN0cnVjdGlvbiAiTFdDMSIsIGFyZSBzdGFuZGFyZCAKLW1uZW1vbmljcyBidWlsdC1pbiB0byB0aGUgTUlQUyBhc3NlbWJsZXIuICAKLQotCi1FeGFtcGxlIDI6Ci0KLVRoZSB0YWJsZToKLQotCSAgICBwMyBkcmVnIGQzIDMJICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotCSAgICBwMyBjcmVnIGMyIDIyCSAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0JICAgIHAzIGZ1bmMgZmVlIDB4MWY6MjQtMjAgZHJlZzoxNy0xMyBjcmVnOjEyLTggaW1tZWQ6Ny0wIAotCSAgICAJOyBmdW5jdGlvbiAiZmVlIiBmb3IgQ09QMyBoYXMgdmFsdWUgMzEsIGFuZCAzIGZpZWxkcyAKLQkgICAgCTsgY29uc2lzdGluZyBvZiBhIGRhdGEgcmVnaXN0ZXIsIGEgY29udHJvbCByZWdpc3RlciwgCi0JICAgIAk7IGFuZCBhbiBpbW1lZGlhdGUgdmFsdWUuCi0KLXdpbGwgYWxsb3cgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQgdGhlIGZvbGxvd2luZyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbjoKLQotCSAgICBmZWUgZDMsYzIsMHgxCi0KLWFuZCB3aWxsIGVtaXQgdGhlIG9iamVjdCBjb2RlOgotCi0JICAgIDMxLTI2ICAyNSAyNC0yMCAxOS0xOCAgMTctMTMgMTItOCAgNy0wCi0JICAgIENPUHogICBDTyBmdW4JICAgIAkgICAgICBkcmVnICBjcmVnICBpbW1lZAotCSAgICAwMTAwMTEgMSAgMTExMTEgMDAJICAgICAwMDAxMSAxMDExMCAwMDAwMDAwMSAKLQotCSAgICAweDRmZjA3NjAxCi0KLQotRXhhbXBsZSAzOgotCi1UaGUgdGFibGU6Ci0KLQkgICAgcDMgZHJlZyBkMyAzCSAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLQkgICAgcDMgY3JlZyBjMiAyMgkgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotCSAgICBwMyBmdW5jIGZ1dSAweDAxZjAwMDAxIGRyZWc6MTctMTMgY3JlZzoxMi04Ci0KLXdpbGwgYWxsb3cgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQgdGhlIGZvbGxvd2luZyBjb3Byb2Nlc3NvcgotaW5zdHJ1Y3Rpb246Ci0KLQkgICAgZnV1IGQzLGMyCi0KLWFuZCB3aWxsIGVtaXQgdGhlIG9iamVjdCBjb2RlOgotCi0JICAgIDMxLTI2ICAyNSAyNC0yMCAxOS0xOCAgMTctMTMgMTItOCAgNy0wCi0JICAgIENPUHogICBDTyBmdW4JICAgIAkgICAgICBkcmVnICBjcmVnICAKLQkgICAgMDEwMDExIDEgIDExMTExIDAwCSAgICAgMDAwMTEgMTAxMTAgMDAwMDAwMDEgCi0KLQkgICAgMHg0ZmYwNzYwMQotCi1JbiB0aGlzIHdheSwgdGhlIHByb2dyYW1tZXIgY2FuIGZvcmNlIGFyYml0cmFyeSBiaXRzIG9mIGFuIGluc3RydWN0aW9uCi10byBoYXZlIHByZWRlZmluZWQgdmFsdWVzLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQWRkaXRpb25hbCBub3RlczoKLQotRW5jb2Rpbmcgb2YgcmFuZ2VzOgotVG8gaGFuZGxlIG1vcmUgdGhhbiBvbmUgYml0IHBvc2l0aW9uIHJhbmdlIHdpdGhpbiBhbiBpbnN0cnVjdGlvbiwKLXVzZSAwcyB0byBtYXNrIG91dCB0aGUgcmFuZ2VzIHdoaWNoIGRvbid0IGFwcGx5LgotTWF5IGRlY2lkZSB0byBtb2RpZnkgdGhlIHN5bnRheCB0byBhbGxvdyBjb21tYXMgc2VwYXJhdGUgbXVsdGlwbGUgCi1yYW5nZXMgd2l0aGluIGFuIGluc3RydWN0aW9uIChyYW5nZScsJ3JhbmdlKS4KLQotQ2hhbmdlcyBpbiBncmFtbWFyOgotCVRoZSBudW1iZXIgb2YgcGFybXMgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIGVudHJ5Ci13YXMgZGVsZXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBmb3JtYXQgc3VjaCB0aGF0IHdlIG5vdyBjb3VudCB0aGUgZmllbGRzLgotCi0tLS0tCi1GSVhNRSEgc2hvdWxkIHJlYWxseSBjaGFuZ2UgbGV4aWNhbCBhbmFseXplciAKLXRvIHJlY29nbml6ZSAnZHJlZycgZXRjLiBpbiBjb250ZXh0IHNlbnNhdGl2ZSB3YXkuCi1DdXJyZW50bHkgZnVuY3Rpb24gbmFtZXMgb3IgbW5lbW9uaWNzIG1heSBiZSBpbmNvcnJlY3RseSBwYXJzZWQgYXMga2V5d29yZHMKLQotRklYTUUhIGhleCBpcyBhbWJpZ3VvdXMgd2l0aCBhbnkgZGlnaXQKLQotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLQotLyogI2RlZmluZSBERUJVRyAqLwotCi0jaWZkZWYgREVCVUcKLSNpZm5kZWYgREJHX0xWTAotI2RlZmluZSBEQkdfTFZMIDEKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgREJHX0xWTCAwCi0jZW5kaWYKLQotI2lmIERCR19MVkwgPj0gMQotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIERCRyh4KSAKLSNlbmRpZgotCi0jaWYgREJHX0xWTCA+PSAyCi0jZGVmaW5lIERCR0wyKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBEQkdMMih4KSAKLSNlbmRpZgotCi1zdGF0aWMgaW50IHNiaXQsIGViaXQ7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmluc249MDsKLWV4dGVybiBpbnQgaW5zbnRibF9saW5lOwotaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotJX0KLQotJXVuaW9uIAotICB7Ci0gICAgY2hhciAqc3RyOwotICAgIGludCBudW07Ci0gICAgaW50IHByb2Nlc3NvcjsKLSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgfQotCi0ldG9rZW4JICAgIERSRUcgQ1JFRyBHUkVHIElNTUVEIEFERFIgSU5TTiBOVU0gSUQgTkwgUE5VTQotJXR5cGUJICAgIDx2YWw+IHZhbHVlIGZsYWdzIGZsYWdleHByCi0ldHlwZQkgICAgPG51bT4gbnVtYmVyIE5VTSBmdHlwZSByZWd0eXBlIHBudW0gUE5VTQotJXR5cGUJICAgIDxzdHI+IElEIG5hbWUKLQotJXN0YXJ0IGluc250YmwKLQotJSUKLQotaW5zbnRibDoKLQllbnRyeXMKLQk7Ci0KLWVudHJ5czoKLQllbnRyeSBlbnRyeXMKLQl8Ci0JOwotCi1lbnRyeToKLQlwbnVtIHJlZ3R5cGUgbmFtZSB2YWx1ZSBOTAotCSAgewotCSAgICBEQkcgKCgibGluZSAlZDogZW50cnkgcG51bT0lZCB0eXBlPSVkIG5hbWU9JXMgdmFsdWU9eCV4XG4iLCAKLQkgICAgCSAgICBpbnNudGJsX2xpbmUsICQxLCAkMiwgJDMsICQ0KSk7Ci0JICAgIGl0YmxfYWRkX3JlZyAoJDEsICQyLCAkMywgJDQpOwotCSAgfQotCXwgcG51bSBJTlNOIG5hbWUgdmFsdWUgcmFuZ2UgZmxhZ3MKLQkgIHsKLQkgICAgREJHICgoImxpbmUgJWQ6IGVudHJ5IHBudW09JWQgdHlwZT1JTlNOIG5hbWU9JXMgdmFsdWU9eCV4IiwKLQkgICAgCSAgICBpbnNudGJsX2xpbmUsICQxLCAkMywgJDQpKTsKLQkgICAgREJHICgoIiBzYml0PSVkIGViaXQ9JWQgZmxhZ3M9MHgleFxuIiwgc2JpdCwgZWJpdCwgJDYpKTsKLQkgICAgaW5zbj1pdGJsX2FkZF9pbnNuICgkMSwgJDMsICQ0LCBzYml0LCBlYml0LCAkNik7Ci0JICB9Ci0JZmllbGRzcGVjcyBOTAotCXwgTkwKLQl8IGVycm9yIE5MCi0JOwotCi1maWVsZHNwZWNzOgotCScsJyBmaWVsZHNwZWMgZmllbGRzcGVjcwotCXwgZmllbGRzcGVjIGZpZWxkc3BlY3MKLQl8Ci0JOwotCi1mdHlwZToKLQlyZWd0eXBlIAotCSAgewotCSAgICBEQkdMMiAoKCJmdHlwZVxuIikpOwotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgQUREUiAKLQkgIHsKLQkgICAgREJHTDIgKCgiYWRkclxuIikpOwotCSAgICAkJCA9IEFERFI7Ci0JICB9Ci0JfCBJTU1FRAotCSAgewotCSAgICBEQkdMMiAoKCJpbW1lZFxuIikpOwotCSAgICAkJCA9IElNTUVEOwotCSAgfQotCTsKLQotZmllbGRzcGVjOgotCWZ0eXBlIHJhbmdlIGZsYWdzCi0JICB7Ci0JICAgIERCRyAoKCJsaW5lICVkOiBmaWVsZCB0eXBlPSVkIHNiaXQ9JWQgZWJpdD0lZCwgZmxhZ3M9MHgleFxuIiwgCi0JICAgIAkgICAgaW5zbnRibF9saW5lLCAkMSwgc2JpdCwgZWJpdCwgJDMpKTsKLQkgICAgaXRibF9hZGRfb3BlcmFuZCAoaW5zbiwgJDEsIHNiaXQsIGViaXQsICQzKTsKLQkgIH0KLQk7Ci0KLWZsYWdleHByOgotCU5VTSAnfCcgZmxhZ2V4cHIKLQkgIHsKLQkgICAgJCQgPSAkMSB8ICQzOwotCSAgfQotCXwgJ1snIGZsYWdleHByICddJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgTlVNCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi1mbGFnczoKLQknKicgZmxhZ2V4cHIKLQkgIHsKLQkgICAgREJHTDIgKCgiZmxhZ3M9JWRcbiIsICQyKSk7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JfCAKLQkgIHsKLQkgICAgJCQgPSAwOwotCSAgfQotCTsKLQotcmFuZ2U6Ci0JJzonIE5VTSAnLScgTlVNCi0JICB7Ci0JICAgIERCR0wyICgoInJhbmdlICVkICVkXG4iLCAkMiwgJDQpKTsKLQkgICAgc2JpdCA9ICQyOwotCSAgICBlYml0ID0gJDQ7Ci0JICB9Ci0JfAotCSAgewotCSAgICBzYml0ID0gMzE7Ci0JICAgIGViaXQgPSAwOwotCSAgfQotCTsKLQkgICAgCi1wbnVtOgotCVBOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgicG51bT0lZFxuIiwkMSkpOwotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotcmVndHlwZToKLQkgICAgIERSRUcKLQkgIHsKLQkgICAgREJHTDIgKCgiZHJlZ1xuIikpOwotCSAgICAkJCA9IERSRUc7Ci0JICB9Ci0JfCBDUkVHCi0JICB7Ci0JICAgIERCR0wyICgoImNyZWdcbiIpKTsKLQkgICAgJCQgPSBDUkVHOwotCSAgfQotCXwgR1JFRwotCSAgewotCSAgICBEQkdMMiAoKCJncmVnXG4iKSk7Ci0JICAgICQkID0gR1JFRzsKLQkgIH0KLQk7Ci0KLW5hbWU6Ci0JSUQKLQkgIHsKLQkgICAgREJHTDIgKCgibmFtZT0lc1xuIiwkMSkpOwotCSAgICAkJCA9ICQxOyAKLQkgIH0KLQk7Ci0KLW51bWJlcjoKLQlOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgibnVtPSVkXG4iLCQxKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi12YWx1ZToKLQlOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgidmFsPXgleFxuIiwkMSkpOwotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLSUlCi0KLXN0YXRpYyBpbnQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBwcmludGYgKCJsaW5lICVkOiAlc1xuIiwgaW5zbnRibF9saW5lLCBtc2cpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9saW5rLmNtZCBiL2dhcy9saW5rLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzNWNhOC4uMDAwMDAwMAotLS0gYS9nYXMvbGluay5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1BTElHTj0xMDI0Ci1SRVNOVU0gMHgwMDAwLCAweDgwMDAKLTsgUHV0dGluZyBpbiAubGl0MSBnaXZlcyBlcnJvcnMuCi1PUkRFUiAuZGF0YT0weDgwMDAyMDAwLCAuZGF0YTEsIC5saXQsIC5ic3MKLTsgTGV0J3MgcHV0IHRoaXMgb24gdGhlIGNvbW1hbmQgbGluZSBzbyBpdCBnb2VzIGZpcnN0LCB3aGljaCBpcyB3aGF0Ci07IEdEQiBleHBlY3RzLgotOyBMT0FEIC9zMi9hbWQvMjlrL2xpYi9jcnQwLm8KLUxPQUQgL3MyL2FtZC8yOWsvbGliL2xpYnFjYjBoLmxpYgotTE9BRCAvczIvYW1kLzI5ay9saWIvbGlic2NiMGgubGliCi1MT0FEIC9zMi9hbWQvMjlrL2xpYi9saWJhY2IwaC5saWIKZGlmZiAtLWdpdCBhL2dhcy9saXN0aW5nLmMgYi9nYXMvbGlzdGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2RhOTE2Li4wMDAwMDAwCi0tLSBhL2dhcy9saXN0aW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIwICswLDAgQEAKLS8qIGxpc3RpbmcuYyAtIG1haW50aW5nIGFzc2VtYmx5IGxpc3RpbmdzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKgotIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gCQlzYWNAY3lnbnVzLmNvbQotCi0KLSBBIGxpc3RpbmcgcGFnZSBsb29rcyBsaWtlOgotCi0gTElTVElOR19IRUFERVIgIHNvdXJjZWZpbGVuYW1lIHBhZ2VudW1iZXIKLSBUSVRMRSBMSU5FCi0gU1VCVElUTEUgTElORQotIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKLSBsaW5lbnVtYmVyIGFkZHJlc3MgZGF0YSAgc291cmNlCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKLQotIElmIG5vdCBvdmVycmlkZGVuLCB0aGUgbGlzdGluZyBjb21tYW5kcyBhcmU6Ci0KLSAudGl0bGUgICJzdHVmZiIKLSAJUHV0ICJzdHVmZiIgb250byB0aGUgdGl0bGUgbGluZQotIC5zYnR0bCAgInN0dWZmIgotICAgICAgICBQdXQgc3R1ZmYgb250byB0aGUgc3VidGl0bGUgbGluZQotCi0gIElmIHRoZXNlIGNvbW1hbmRzIGNvbWUgd2l0aGluIDEwIGxpbmVzIG9mIHRoZSB0b3Agb2YgdGhlIHBhZ2UsIHRoZXkKLSAgd2lsbCBhZmZlY3QgdGhlIHBhZ2UgdGhleSBhcmUgb24sIGFzIHdlbGwgYXMgYW55IHN1YnNlcXVlbnQgcGFnZQotCi0gLmVqZWN0Ci0gCVRob3cgYSBwYWdlCi0gLmxpc3QKLSAJSW5jcmVtZW50IHRoZSBlbmFibGUgbGlzdGluZyBjb3VudGVyCi0gLm5vbGlzdAotIAlEZWNyZW1lbnQgdGhlIGVuYWJsZSBsaXN0aW5nIGNvdW50ZXIKLQotIC5wc2l6ZSBZWyxYXQotIAlTZXQgdGhlIHBhcGVyIHNpemUgdG8gWCB3aWRlIGFuZCBZIGhpZ2guIFNldHRpbmcgYSBwc2l6ZSBZIG9mCi0JemVybyB3aWxsIHN1cHByZXNzIGZvcm0gZmVlZHMgZXhjZXB0IHdoZXJlIGRlbWFuZGVkIGJ5IC5lamVjdAotCi0gSWYgdGhlIGNvdW50ZXIgZ29lcyBiZWxvdyB6ZXJvLCBsaXN0aW5nIGlzIHN1cHByZXNzZWQuCi0KLQotIExpc3RpbmdzIGFyZSBhIG1haW50YWluZWQgYnkgcmVhZCBjYWxsaW5nIHZhcmlvdXMgbGlzdGluZ188Zm9vPgotIGZ1bmN0aW9ucy4gIFdoYXQgaGFwcGVucyBtb3N0IGlzIHRoYXQgdGhlIG1hY3JvIE5PX0xJU1RJTkcgaXMgbm90Ci0gZGVmaW5lZCAoZnJvbSB0aGUgTWFrZWZpbGUpLCB0aGVuIHRoZSBtYWNybyBMSVNUSU5HX05FV0xJTkUgZXhwYW5kcwotIGludG8gYSBjYWxsIHRvIGxpc3RpbmdfbmV3bGluZS4gIFRoZSBjYWxsIGlzIGRvbmUgZnJvbSByZWFkLmMsIGV2ZXJ5Ci0gdGltZSBpdCBzZWVzIGEgbmV3bGluZSwgYW5kIC1sIGlzIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLSBUaGUgZnVuY3Rpb24gbGlzdGluZ19uZXdsaW5lIHJlbWVtYmVycyB0aGUgZnJhZyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gbmV3bGluZSwgYW5kIGNyZWF0ZXMgYSBuZXcgZnJhZyAtIG5vdGUgdGhhdCB0aGlzIGlzIHdhc3RlZnVsLCBidXQgbm90Ci0gYSBiaWcgZGVhbCwgc2luY2UgbGlzdGluZyBzbG93cyB0aGluZ3MgZG93biBhIGxvdCBhbnl3YXkuICBUaGUKLSBmdW5jdGlvbiBhbHNvIHJlbWVtZWJlcnMgd2hlbiB0aGUgZmlsZW5hbWUgY2hhbmdlcy4KLQotIFdoZW4gYWxsIHRoZSBpbnB1dCBoYXMgZmluaXNoZWQsIGFuZCBnYXMgaGFzIGhhZCBhIGNoYW5jZSB0byBzZXR0bGUKLSBkb3duLCB0aGUgbGlzdGluZyBpcyBvdXRwdXQuIFRoaXMgaXMgZG9uZSBieSBydW5uaW5nIGRvd24gdGhlIGxpc3Qgb2YKLSBmcmFnL3NvdXJjZSBmaWxlIHJlY29yZHMsIGFuZCBvcGVuaW5nIHRoZSBmaWxlcyBhcyBuZWVkZWQgYW5kIHByaW50aW5nCi0gb3V0IHRoZSBieXRlcyBhbmQgY2hhcnMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi0KLSBUaGUgb25seSB0aGluZ3Mgd2hpY2ggdGhlIGFyY2hpdGVjdHVyZSBjYW4gY2hhbmdlIGFib3V0IHRoZSBsaXN0aW5nCi0gYXJlIGRlZmluZWQgaW4gdGhlc2UgbWFjcm9zOgotCi0gTElTVElOR19IRUFERVIJCVRoZSBuYW1lIG9mIHRoZSBhcmNoaXRlY3R1cmUKLSBMSVNUSU5HX1dPUkRfU0laRSAgICAgIFRoZSBtYWtlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSB3b3JkLCB0aGlzIGRldGVybWluZXMKLSAJCQl0aGUgY2x1bXBpbmcgb2YgdGhlIG91dHB1dCBkYXRhLiBlZyBhIHZhbHVlIG9mCi0JCQkyIG1ha2VzIHdvcmRzIGxvb2sgbGlrZSAxMjM0IDU2NzgsIHdoaWxzdCAxCi0JCQl3b3VsZCBtYWtlIHRoZSBzYW1lIHZhbHVlIGxvb2sgbGlrZSAxMiAzNCA1NgotCQkJNzgKLSBMSVNUSU5HX0xIU19XSURUSCAgICAgIE51bWJlciBvZiB3b3JkcyBvZiBhYm92ZSBzaXplIGZvciB0aGUgbGhzCi0KLSBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQgICBOdW1iZXIgb2Ygd29yZHMgZm9yIHRoZSBkYXRhIG9uIHRoZSBsaHMKLSAJCQlmb3IgdGhlIHNlY29uZCBsaW5lCi0KLSBMSVNUSU5HX0xIU19DT05UX0xJTkVTCU1heCBudW1iZXIgb2YgbGluZXMgdG8gdXNlIHVwIGZvciBhIGNvbnRpbnV0YXRpb24KLSBMSVNUSU5HX1JIU19XSURUSCAgICAgIE51bWJlciBvZiBjaGFycyBmcm9tIHRoZSBpbnB1dCBmaWxlIHRvIHByaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbiBhIGxpbmUKLSovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlIDxvYnN0YWNrLmg+Ci0jaW5jbHVkZSAiaW5wdXQtZmlsZS5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0KLSNpZm5kZWYgTElTVElOR19IRUFERVIKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkdBUyBMSVNUSU5HIgotI2VuZGlmCi0jaWZuZGVmIExJU1RJTkdfV09SRF9TSVpFCi0jZGVmaW5lIExJU1RJTkdfV09SRF9TSVpFIDQKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19XSURUSAotI2RlZmluZSBMSVNUSU5HX0xIU19XSURUSCAxCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19MSFNfV0lEVEhfU0VDT05ECi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORCAxCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19SSFNfV0lEVEgKLSNkZWZpbmUgTElTVElOR19SSFNfV0lEVEggMTAwCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19MSFNfQ09OVF9MSU5FUwotI2RlZmluZSBMSVNUSU5HX0xIU19DT05UX0xJTkVTIDQKLSNlbmRpZgotCi0vKiBUaGlzIHN0cnVjdHVyZSByZW1lbWJlcnMgd2hpY2ggLnMgd2VyZSB1c2VkICovCi10eXBlZGVmIHN0cnVjdCBmaWxlX2luZm9fc3RydWN0Ci17Ci0gIHN0cnVjdCBmaWxlX2luZm9fc3RydWN0ICogbmV4dDsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTsKLSAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBwb3M7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgbGluZW51bTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICBhdF9lbmQ7Ci19Ci1maWxlX2luZm9fdHlwZTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgcmVtZW1lYnJzIHdoaWNoIGxpbmUgZnJvbSB3aGljaCBmaWxlIGdvZXMgaW50byB3aGljaAotICAgZnJhZyAqLwotc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QKLXsKLSAgLyogRnJhZyB3aGljaCB0aGlzIGxpbmUgb2Ygc291cmNlIGlzIG5lYXJlc3QgdG8gKi8KLSAgZnJhZ1MgKiBmcmFnOwotCi0gIC8qIFRoZSBhY3R1YWwgbGluZSBpbiB0aGUgc291cmNlIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIC8qIFBvaW50ZXIgdG8gdGhlIGZpbGUgaW5mbyBzdHJ1Y3QgZm9yIHRoZSBmaWxlIHdoaWNoIHRoaXMgbGluZQotICAgICBiZWxvbmdzIHRvICovCi0gIGZpbGVfaW5mb190eXBlICogZmlsZTsKLQotICAvKiBUaGUgZXhwYW5kZWQgdGV4dCBvZiBhbnkgbWFjcm8gdGhhdCBtYXkgaGF2ZSBiZWVuIGV4ZWN1dGluZy4gICovCi0gIGNoYXIgKiBsaW5lX2NvbnRlbnRzOwotCi0gIC8qIE5leHQgaW4gbGlzdCAqLwotICBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqIG5leHQ7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgZmlsZSBpbmZvIHN0cnVjdCBmb3IgdGhlIGhpZ2ggbGV2ZWwgbGFuZ3VhZ2UKLSAgICAgc291cmNlIGxpbmUgdGhhdCBiZWxvbmdzIGhlcmUgKi8KLSAgZmlsZV9pbmZvX3R5cGUgKiBobGxfZmlsZTsKLSAgLyogSGlnaCBsZXZlbCBsYW5ndWFnZSBzb3VyY2UgbGluZSAqLwotICB1bnNpZ25lZCBpbnQgaGxsX2xpbmU7Ci0KLSAgLyogUG9pbnRlciB0byBhbnkgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5lICovCi0gIGNoYXIgKiBtZXNzYWdlOwotCi0gIGVudW0KLSAgICB7Ci0gICAgICBFRElDVF9OT05FLAotICAgICAgRURJQ1RfU0JUVEwsCi0gICAgICBFRElDVF9USVRMRSwKLSAgICAgIEVESUNUX05PTElTVCwKLSAgICAgIEVESUNUX0xJU1QsCi0gICAgICBFRElDVF9OT0xJU1RfTkVYVCwKLSAgICAgIEVESUNUX0VKRUNUCi0gICAgfSBlZGljdDsKLSAgY2hhciAqIGVkaWN0X2FyZzsKLQotICAvKiBOb256ZXJvIGlmIHRoaXMgbGluZSBpcyB0byBiZSBvbWl0dGVkIGJlY2F1c2UgaXQgY29udGFpbnMKLSAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gYmVjb21lIGEgZmxhZ3MgZmllbGQgaWYgd2UgY29tZQotICAgICB1cCB3aXRoIG1vcmUgaW5mb3JtYXRpb24gdG8gc3RvcmUgaGVyZS4gICovCi0gIGludCBkZWJ1Z2dpbmc7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0IGxpc3RfaW5mb190eXBlOwotCi0KLWludCBsaXN0aW5nX2xoc193aWR0aCAgICAgICAgPSBMSVNUSU5HX0xIU19XSURUSDsKLWludCBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQgPSBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQ7Ci1pbnQgbGlzdGluZ19saHNfY29udF9saW5lcyAgID0gTElTVElOR19MSFNfQ09OVF9MSU5FUzsKLWludCBsaXN0aW5nX3Joc193aWR0aCAgICAgICAgPSBMSVNUSU5HX1JIU19XSURUSDsKLQotc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKiAgICAgICAgbGlzdGluZ190YWlsOwotCi1zdGF0aWMgZmlsZV9pbmZvX3R5cGUgKiAgICAgICAgICBmaWxlX2luZm9faGVhZDsKLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqICAgICAgICAgIGxhc3Rfb3Blbl9maWxlX2luZm87Ci1zdGF0aWMgRklMRSAqICAgICAgICAgICAgICAgICAgICBsYXN0X29wZW5fZmlsZTsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqIGhlYWQ7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgICAgICBwYXBlcl93aWR0aCA9IDIwMDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgIHBhcGVyX2hlaWdodCA9IDYwOwotCi1leHRlcm4gaW50ICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nOwotCi0vKiBGaWxlIHRvIG91dHB1dCBsaXN0aW5ncyB0by4gICovCi1zdGF0aWMgRklMRSAqIGxpc3RfZmlsZTsKLQotLyogVGhpcyBzdGF0aWMgYXJyYXkgaXMgdXNlZCB0byBrZWVwIHRoZSB0ZXh0IG9mIGRhdGEgdG8gYmUgcHJpbnRlZAotICAgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgbGluZS4gICovCi0KLSNkZWZpbmUgTUFYX0JZVEVTCQkJCQkJCVwKLSAgKCgoTElTVElOR19XT1JEX1NJWkUgKiAyKSArIDEpICogbGlzdGluZ19saHNfd2lkdGgJCQlcCi0gICArICgoKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQpCVwKLSAgICAgICogbGlzdGluZ19saHNfY29udF9saW5lcykJCQkJCQlcCi0gICArIDIwKQotCi1zdGF0aWMgY2hhciAqIGRhdGFfYnVmZmVyOwotCi0vKiBQcm90b3R5cGVzLiAgKi8KLXN0YXRpYyB2b2lkIGxpc3RpbmdfbWVzc2FnZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICptZXNzYWdlKSk7Ci1zdGF0aWMgZmlsZV9pbmZvX3R5cGUgKiBmaWxlX2luZm8gUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZV9uYW1lKSk7Ci1zdGF0aWMgdm9pZCBuZXdfZnJhZyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqIGJ1ZmZlcl9saW5lIFBBUkFNUyAoKGZpbGVfaW5mb190eXBlICpmaWxlLAotCQkJCSAgY2hhciAqbGluZSwgdW5zaWduZWQgaW50IHNpemUpKTsKLXN0YXRpYyB2b2lkIGxpc3RpbmdfcGFnZSBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqbGlzdCkpOwotc3RhdGljIHVuc2lnbmVkIGludCBjYWxjX2hleCBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqbGlzdCkpOwotc3RhdGljIHZvaWQgcHJpbnRfbGluZXMgUEFSQU1TICgobGlzdF9pbmZvX3R5cGUgKiwgdW5zaWduZWQgaW50LAotCQkJCSBjaGFyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgbGlzdF9zeW1ib2xfdGFibGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcHJpbnRfc291cmNlIFBBUkFNUyAoKGZpbGVfaW5mb190eXBlICpjdXJyZW50X2ZpbGUsCi0JCQkJICBsaXN0X2luZm9fdHlwZSAqbGlzdCwKLQkJCQkgIGNoYXIgKmJ1ZmZlciwKLQkJCQkgIHVuc2lnbmVkIGludCB3aWR0aCkpOwotc3RhdGljIGludCBkZWJ1Z2dpbmdfcHNldWRvIFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgbGlzdGluZ19saXN0aW5nIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLQotCi1zdGF0aWMgdm9pZAotbGlzdGluZ19tZXNzYWdlIChuYW1lLCBtZXNzYWdlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICptZXNzYWdlOwotewotICB1bnNpZ25lZCBpbnQgbCA9IHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKG1lc3NhZ2UpICsgMTsKLSAgY2hhciAqbiA9IChjaGFyICopIHhtYWxsb2MgKGwpOwotICBzdHJjcHkgKG4sIG5hbWUpOwotICBzdHJjYXQgKG4sIG1lc3NhZ2UpOwotICBpZiAobGlzdGluZ190YWlsICE9IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpc3RpbmdfdGFpbC0+bWVzc2FnZSA9IG47Ci0gICAgfQotfQotCi12b2lkCi1saXN0aW5nX3dhcm5pbmcgKG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGxpc3RpbmdfbWVzc2FnZSAoXygiV2FybmluZzoiKSwgbWVzc2FnZSk7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfZXJyb3IgKG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGxpc3RpbmdfbWVzc2FnZSAoXygiRXJyb3I6IiksIG1lc3NhZ2UpOwotfQotCi1zdGF0aWMgZmlsZV9pbmZvX3R5cGUgKgotZmlsZV9pbmZvIChmaWxlX25hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZTsKLXsKLSAgLyogRmluZCBhbiBlbnRyeSB3aXRoIHRoaXMgZmlsZSBuYW1lICovCi0gIGZpbGVfaW5mb190eXBlICpwID0gZmlsZV9pbmZvX2hlYWQ7Ci0KLSAgd2hpbGUgKHAgIT0gKGZpbGVfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocC0+ZmlsZW5hbWUsIGZpbGVfbmFtZSkgPT0gMCkKLQlyZXR1cm4gcDsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLQotICAvKiBNYWtlIG5ldyBlbnRyeSAqLwotCi0gIHAgPSAoZmlsZV9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChmaWxlX2luZm9fdHlwZSkpOwotICBwLT5uZXh0ID0gZmlsZV9pbmZvX2hlYWQ7Ci0gIGZpbGVfaW5mb19oZWFkID0gcDsKLSAgcC0+ZmlsZW5hbWUgPSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgc3RybGVuIChmaWxlX25hbWUpICsgMSk7Ci0gIHN0cmNweSAocC0+ZmlsZW5hbWUsIGZpbGVfbmFtZSk7Ci0gIHAtPnBvcyA9IDA7Ci0gIHAtPmxpbmVudW0gPSAwOwotICBwLT5hdF9lbmQgPSAwOwotCi0gIHJldHVybiBwOwotfQotCi0KLXN0YXRpYyB2b2lkCi1uZXdfZnJhZyAoKQotewotCi0gIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICBmcmFnX25ldyAoMCk7Ci0KLX0KLQotdm9pZAotbGlzdGluZ19uZXdsaW5lIChwcykKLSAgICAgY2hhciAqcHM7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBzdGF0aWMgdW5zaWduZWQgaW50IGxhc3RfbGluZSA9IDB4ZmZmZjsKLSAgc3RhdGljIGNoYXIgKmxhc3RfZmlsZSA9IE5VTEw7Ci0gIGxpc3RfaW5mb190eXBlICpuZXcgPSBOVUxMOwotCi0gIGlmIChsaXN0aW5nID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBJbiBFTEYsIGFueXRoaW5nIGluIGEgc2VjdGlvbiBiZWdpbm5pbmcgd2l0aCAuZGVidWcgb3IgLmxpbmUgaXMKLSAgICAgY29uc2lkZXJlZCB0byBiZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGluY2x1ZGVzIHRoZQotICAgICBzdGF0ZW1lbnQgd2hpY2ggc3dpdGNoZXMgdXMgaW50byB0aGUgZGVidWdnaW5nIHNlY3Rpb24sIHdoaWNoIHdlCi0gICAgIGNhbiBvbmx5IHNldCBhZnRlciB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgZGVidWdnaW5nIHNlY3Rpb24uICAqLwotICBpZiAoKGxpc3RpbmcgJiBMSVNUSU5HX05PREVCVUcpICE9IDAKLSAgICAgICYmIGxpc3RpbmdfdGFpbCAhPSBOVUxMCi0gICAgICAmJiAhIGxpc3RpbmdfdGFpbC0+ZGVidWdnaW5nKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0KLSAgICAgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKG5vd19zZWcpOwotICAgICAgaWYgKHN0cm5jbXAgKHNlZ25hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChzZWduYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDApCi0JbGlzdGluZ190YWlsLT5kZWJ1Z2dpbmcgPSAxOwotICAgIH0KLSNlbmRpZgotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotICBpZiAocHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobGluZSA9PSBsYXN0X2xpbmUgJiYgIShsYXN0X2ZpbGUgJiYgZmlsZSAmJiBzdHJjbXAgKGZpbGUsIGxhc3RfZmlsZSkpKQotCXJldHVybjsKLQotICAgICAgbmV3ID0gKGxpc3RfaW5mb190eXBlICopIHhtYWxsb2MgKHNpemVvZiAobGlzdF9pbmZvX3R5cGUpKTsKLQotICAgICAgLyogRGV0ZWN0IGlmIHdlIGFyZSByZWFkaW5nIGZyb20gc3RkaW4gYnkgZXhhbWluaW5nIHRoZSBmaWxlCi0JIG5hbWUgcmV0dXJuZWQgYnkgYXNfd2hlcmUoKS4KLQotCSBbRklYTUU6IFdlIHJlbHkgdXBvbiB0aGUgbmFtZSBpbiB0aGUgc3RyY21wIGJlbG93IGJlaW5nIHRoZQotCSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBieSBpbnB1dF9zY3J1Yl9uZXdfZmlsZSgpLCBpZiB0aGF0IGlzCi0JIG5vdCB0cnVlLCB0aGVuIHRoaXMgY29kZSB3aWxsIGZhaWxdLgotCi0JIElmIHdlIGFyZSByZWFkaW5nIGZyb20gc3RkaW4sIHRoZW4gd2UgbmVlZCB0byBzYXZlIGVhY2ggaW5wdXQgbGluZQotCSBoZXJlIChhc3N1bWluZyBvZiBjb3Vyc2UgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgbGluZSBvZiBpbnB1dCB0byByZWFkKSwKLQkgc28gdGhhdCBpdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0aW5nIHRoYXQgaXMgcHJvZHVjZWQgYXQgdGhlIGVuZAotCSBvZiB0aGUgYXNzZW1ibHkuICAqLwotICAgICAgaWYgKHN0cmNtcCAoZmlsZSwgXygie3N0YW5kYXJkIGlucHV0fSIpKSA9PSAwCi0JICAmJiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICogY29weTsKLQkgIGludCBsZW47Ci0JICBpbnQgc2Vlbl9xdW90ZSA9IDA7Ci0KLQkgIGZvciAoY29weSA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7Ci0JICAgICAgICogY29weSAmJiAoc2Vlbl9xdW90ZQotCQkJICB8fCAoISBpc19lbmRfb2ZfbGluZSBbKHVuc2lnbmVkIGNoYXIpICogY29weV0pKTsKLQkgICAgICAgY29weSArKykKLQkgICAgaWYgKCogY29weSA9PSAnIicgJiYgY29weVstMV0gIT0gJ1xcJykKLQkgICAgICBzZWVuX3F1b3RlID0gISBzZWVuX3F1b3RlOwotCi0JICBsZW4gPSAoY29weSAtIGlucHV0X2xpbmVfcG9pbnRlcikgKyAyOwotCi0JICBjb3B5ID0geG1hbGxvYyAobGVuKTsKLQotCSAgaWYgKGNvcHkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNoYXIgKiBzcmMgPSBpbnB1dF9saW5lX3BvaW50ZXIgLSAxOwotCSAgICAgIGNoYXIgKiBkZXN0ID0gY29weTsKLQkgICAgICAKLQkgICAgICB3aGlsZSAoLS1sZW4pCi0JCXsKLQkJICB1bnNpZ25lZCBjaGFyIGMgPSAqIHNyYyArKzsKLQotCQkgIC8qIE9taXQgY29udHJvbCBjaGFyYWN0ZXJzIGluIHRoZSBsaXN0aW5nLiAgKi8KLQkJICBpZiAoaXNhc2NpaSAoYykgJiYgISBpc2NudHJsIChjKSkKLQkJICAgICogZGVzdCArKyA9IGM7Ci0JCX0KLQkgICAgICAKLQkgICAgICAqZGVzdCA9IDA7Ci0JICAgIH0KLQkgIAotCSAgbmV3LT5saW5lX2NvbnRlbnRzID0gY29weTsKLQl9Ci0gICAgICBlbHNlCi0JbmV3LT5saW5lX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXcgPSAobGlzdF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChsaXN0X2luZm9fdHlwZSkpOwotICAgICAgbmV3LT5saW5lX2NvbnRlbnRzID0gcHM7Ci0gICAgfQotCi0gIGxhc3RfbGluZSA9IGxpbmU7Ci0gIGxhc3RfZmlsZSA9IGZpbGU7Ci0gIAotICBuZXdfZnJhZyAoKTsKLQotICBpZiAobGlzdGluZ190YWlsKQotICAgIGxpc3RpbmdfdGFpbC0+bmV4dCA9IG5ldzsKLSAgZWxzZQotICAgIGhlYWQgPSBuZXc7Ci0gIAotICBsaXN0aW5nX3RhaWwgPSBuZXc7Ci0KLSAgbmV3LT5mcmFnID0gZnJhZ19ub3c7Ci0gIG5ldy0+bGluZSA9IGxpbmU7Ci0gIG5ldy0+ZmlsZSA9IGZpbGVfaW5mbyAoZmlsZSk7Ci0gIG5ldy0+bmV4dCA9IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMOwotICBuZXctPm1lc3NhZ2UgPSAoY2hhciAqKSBOVUxMOwotICBuZXctPmVkaWN0ID0gRURJQ1RfTk9ORTsKLSAgbmV3LT5obGxfZmlsZSA9IChmaWxlX2luZm9fdHlwZSAqKSBOVUxMOwotICBuZXctPmhsbF9saW5lID0gMDsKLSAgbmV3LT5kZWJ1Z2dpbmcgPSAwOwotICAKLSAgbmV3X2ZyYWcgKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEluIEVMRiwgYW55dGhpbmcgaW4gYSBzZWN0aW9uIGJlZ2lubmluZyB3aXRoIC5kZWJ1ZyBvciAubGluZSBpcwotICAgICBjb25zaWRlcmVkIHRvIGJlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmICgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotCi0gICAgICBzZWduYW1lID0gc2VnbWVudF9uYW1lIChub3dfc2VnKTsKLSAgICAgIGlmIChzdHJuY21wIChzZWduYW1lLCAiLmRlYnVnIiwgc2l6ZW9mICIuZGVidWciIC0gMSkgPT0gMAotCSAgfHwgc3RybmNtcCAoc2VnbmFtZSwgIi5saW5lIiwgc2l6ZW9mICIubGluZSIgLSAxKSA9PSAwKQotCW5ldy0+ZGVidWdnaW5nID0gMTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogQXR0YWNoIGFsbCBjdXJyZW50IGZyYWdzIHRvIHRoZSBwcmV2aW91cyBsaW5lIGluc3RlYWQgb2YgdGhlCi0gICBjdXJyZW50IGxpbmUuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgTUlQUyBiYWNrZW5kIHdoZW4gaXQgZGlzY292ZXJzCi0gICB0aGF0IGl0IG5lZWRzIHRvIGFkZCBzb21lIE5PUCBpbnN0cnVjdGlvbnM7IHRoZSBhZGRlZCBOT1AKLSAgIGluc3RydWN0aW9ucyBzaG91bGQgZ28gd2l0aCB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgdGhlIGRlbGF5LCBub3QKLSAgIHdpdGggdGhlIG5ldyBpbnN0cnVjdGlvbi4gICovCi0KLXZvaWQKLWxpc3RpbmdfcHJldl9saW5lICgpCi17Ci0gIGxpc3RfaW5mb190eXBlICpsOwotICBmcmFnUyAqZjsKLQotICBpZiAoaGVhZCA9PSAobGlzdF9pbmZvX3R5cGUgKikgTlVMTAotICAgICAgfHwgaGVhZCA9PSBsaXN0aW5nX3RhaWwpCi0gICAgcmV0dXJuOwotCi0gIG5ld19mcmFnICgpOwotCi0gIGZvciAobCA9IGhlYWQ7IGwtPm5leHQgIT0gbGlzdGluZ190YWlsOyBsID0gbC0+bmV4dCkKLSAgICA7Ci0KLSAgZm9yIChmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsgZiAhPSAoZnJhZ1MgKikgTlVMTDsgZiA9IGYtPmZyX25leHQpCi0gICAgaWYgKGYtPmxpbmUgPT0gbGlzdGluZ190YWlsKQotICAgICAgZi0+bGluZSA9IGw7Ci0KLSAgbGlzdGluZ190YWlsLT5mcmFnID0gZnJhZ19ub3c7Ci0gIG5ld19mcmFnICgpOwotfQotCi0vKgotIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV4dCBzb3VyY2UgbGluZSBmcm9tIHRoZSBmaWxlIHN1cHBsaWVkLAotIHRydW5jYXRlZCB0byBzaXplLiAgSXQgYXBwZW5kcyBhIGZha2UgbGluZSB0byB0aGUgZW5kIG9mIGVhY2ggaW5wdXQKLSBmaWxlIHRvIG1ha2UKLSovCi0KLXN0YXRpYyBjaGFyICoKLWJ1ZmZlcl9saW5lIChmaWxlLCBsaW5lLCBzaXplKQotICAgICBmaWxlX2luZm9fdHlwZSAqIGZpbGU7Ci0gICAgIGNoYXIgKmxpbmU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotICBpbnQgYzsKLQotICBjaGFyICpwID0gbGluZTsKLQotICAvKiBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSBmaWxlLCByZXR1cm4gYW4gZW1wdHkgbGluZSAqLwotICBpZiAoZmlsZS0+YXRfZW5kKQotICAgIHJldHVybiAiIjsKLQotICAvKiBDaGVjayB0aGUgY2FjaGUgYW5kIHNlZSBpZiB3ZSBsYXN0IHVzZWQgdGhpcyBmaWxlLiAgKi8KLSAgaWYgKCFsYXN0X29wZW5fZmlsZV9pbmZvIHx8IGZpbGUgIT0gbGFzdF9vcGVuX2ZpbGVfaW5mbykKLSAgICB7Ci0gICAgICBpZiAobGFzdF9vcGVuX2ZpbGUpCi0JewotCSAgbGFzdF9vcGVuX2ZpbGVfaW5mby0+cG9zID0gZnRlbGwgKGxhc3Rfb3Blbl9maWxlKTsKLQkgIGZjbG9zZSAobGFzdF9vcGVuX2ZpbGUpOwotCX0KLQotICAgICAgbGFzdF9vcGVuX2ZpbGVfaW5mbyA9IGZpbGU7Ci0gICAgICBsYXN0X29wZW5fZmlsZSA9IGZvcGVuIChmaWxlLT5maWxlbmFtZSwgInIiKTsKLSAgICAgIGlmIChsYXN0X29wZW5fZmlsZSA9PSBOVUxMKQotCXsKLQkgIGZpbGUtPmF0X2VuZCA9IDE7Ci0JICByZXR1cm4gIiI7Ci0JfQotICAgICAgCi0gICAgICAvKiBTZWVrIHRvIHdoZXJlIHdlIHdlcmUgbGFzdCB0aW1lIHRoaXMgZmlsZSB3YXMgb3Blbi4gICovCi0gICAgICBpZiAoZmlsZS0+cG9zKQotCWZzZWVrKGxhc3Rfb3Blbl9maWxlLCBmaWxlLT5wb3MsIFNFRUtfU0VUKTsKLSAgICB9Ci0KLSAgYyA9IGZnZXRjIChsYXN0X29wZW5fZmlsZSk7Ci0KLSAgc2l6ZSAtPSAxOwkJCS8qIGxlYXZlIHJvb20gZm9yIG51bGwgKi8KLQotICB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQotICAgIHsKLSAgICAgIGlmIChjb3VudCA8IHNpemUpCi0JKnArKyA9IGM7Ci0gICAgICBjb3VudCsrOwotCi0gICAgICBjID0gZmdldGMgKGxhc3Rfb3Blbl9maWxlKTsKLQotICAgIH0KLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGZpbGUtPmF0X2VuZCA9IDE7Ci0gICAgICAqcCsrID0gJy4nOwotICAgICAgKnArKyA9ICcuJzsKLSAgICAgICpwKysgPSAnLic7Ci0gICAgfQotICBmaWxlLT5saW5lbnVtKys7Ci0gICpwKysgPSAwOwotICByZXR1cm4gbGluZTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqZm47Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWplY3Q7CS8qIEVqZWN0IHBlbmRpbmcgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFnZTsJLyogQ3VycmVudCBwYWdlIG51bWJlciAqLwotc3RhdGljIGNoYXIgKnRpdGxlOwkJLyogY3VycmVudCB0aXRsZSAqLwotc3RhdGljIGNoYXIgKnN1YnRpdGxlOwkJLyogY3VycmVudCBzdWJ0aXRsZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBvbl9wYWdlOwkvKiBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBvbiBjdXJyZW50IHBhZ2UgKi8KLQotCi1zdGF0aWMgdm9pZAotbGlzdGluZ19wYWdlIChsaXN0KQotICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKLXsKLSAgLyogR3JvcGUgYXJvdW5kLCBzZWUgaWYgd2UgY2FuIHNlZSBhIHRpdGxlIG9yIHN1YnRpdGxlIGVkaWN0IGNvbWluZyB1cAotICAgICBzb29uICAod2UgbG9vayBkb3duIDEwIGxpbmVzIG9mIHRoZSBwYWdlIGFuZCBzZWUgaWYgaXQncyB0aGVyZSkqLwotICBpZiAoKGVqZWN0IHx8IChvbl9wYWdlID49ICh1bnNpZ25lZCBpbnQpIHBhcGVyX2hlaWdodCkpICYmIHBhcGVyX2hlaWdodCAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjID0gMTA7Ci0gICAgICBpbnQgaGFkX3RpdGxlID0gMDsKLSAgICAgIGludCBoYWRfc3VidGl0bGUgPSAwOwotCi0gICAgICBwYWdlKys7Ci0KLSAgICAgIHdoaWxlIChjICE9IDAgJiYgbGlzdCkKLQl7Ci0JICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfU0JUVEwgJiYgIWhhZF9zdWJ0aXRsZSkKLQkgICAgewotCSAgICAgIGhhZF9zdWJ0aXRsZSA9IDE7Ci0JICAgICAgc3VidGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICAgIH0KLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9USVRMRSAmJiAhaGFkX3RpdGxlKQotCSAgICB7Ci0JICAgICAgaGFkX3RpdGxlID0gMTsKLQkgICAgICB0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKLQkgICAgfQotCSAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0JICBjLS07Ci0JfQotCi0KLSAgICAgIGlmIChwYWdlID4gMSkKLQl7Ci0JICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcZiIpOwotCX0KLQotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXMgJXMgXHRcdFx0cGFnZSAlZFxuIiwgTElTVElOR19IRUFERVIsIGZuLCBwYWdlKTsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCB0aXRsZSk7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlc1xuIiwgc3VidGl0bGUpOwotICAgICAgb25fcGFnZSA9IDM7Ci0gICAgICBlamVjdCA9IDA7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNhbGNfaGV4IChsaXN0KQotICAgICBsaXN0X2luZm9fdHlwZSAqIGxpc3Q7Ci17Ci0gIGludCBkYXRhX2J1ZmZlcl9zaXplOwotICBsaXN0X2luZm9fdHlwZSAqZmlyc3QgPSBsaXN0OwotICB1bnNpZ25lZCBpbnQgYWRkcmVzcyA9IH4gKHVuc2lnbmVkIGludCkgMDsKLSAgZnJhZ1MgKmZyYWc7Ci0gIGZyYWdTICpmcmFnX3B0cjsKLSAgdW5zaWduZWQgaW50IGJ5dGVfaW5fZnJhZzsKLQotICAvKiBGaW5kIGZpcnN0IGZyYWcgd2hpY2ggc2F5cyBpdCBiZWxvbmdzIHRvIHRoaXMgbGluZSAqLwotICBmcmFnID0gbGlzdC0+ZnJhZzsKLSAgd2hpbGUgKGZyYWcgJiYgZnJhZy0+bGluZSAhPSBsaXN0KQotICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotCi0gIGZyYWdfcHRyID0gZnJhZzsKLQotICBkYXRhX2J1ZmZlcl9zaXplID0gMDsKLQotICAvKiBEdW1wIGFsbCB0aGUgZnJhZ3Mgd2hpY2ggYmVsb25nIHRvIHRoaXMgbGluZSAqLwotICB3aGlsZSAoZnJhZ19wdHIgIT0gKGZyYWdTICopIE5VTEwgJiYgZnJhZ19wdHItPmxpbmUgPT0gZmlyc3QpCi0gICAgewotICAgICAgLyogUHJpbnQgYXMgbWFueSBieXRlcyBmcm9tIHRoZSBmaXhlZCBwYXJ0IGFzIGlzIHNlbnNpYmxlICovCi0gICAgICBieXRlX2luX2ZyYWcgPSAwOwotICAgICAgd2hpbGUgKChvZmZzZXRUKSBieXRlX2luX2ZyYWcgPCBmcmFnX3B0ci0+ZnJfZml4Ci0JICAgICAmJiBkYXRhX2J1ZmZlcl9zaXplIDwgTUFYX0JZVEVTIC0gMykKLQl7Ci0JICBpZiAoYWRkcmVzcyA9PSB+ICh1bnNpZ25lZCBpbnQpIDApCi0JICAgIHsKLQkgICAgICBhZGRyZXNzID0gZnJhZ19wdHItPmZyX2FkZHJlc3M7Ci0JICAgIH0KLQotCSAgc3ByaW50ZiAoZGF0YV9idWZmZXIgKyBkYXRhX2J1ZmZlcl9zaXplLAotCQkgICAiJTAyWCIsCi0JCSAgIChmcmFnX3B0ci0+ZnJfbGl0ZXJhbFtieXRlX2luX2ZyYWddKSAmIDB4ZmYpOwotCSAgZGF0YV9idWZmZXJfc2l6ZSArPSAyOwotCSAgYnl0ZV9pbl9mcmFnKys7Ci0JfQotICAgICAgewotCXVuc2lnbmVkIGludCB2YXJfcmVwX21heCA9IGJ5dGVfaW5fZnJhZzsKLQl1bnNpZ25lZCBpbnQgdmFyX3JlcF9pZHggPSBieXRlX2luX2ZyYWc7Ci0KLQkvKiBQcmludCBhcyBtYW55IGJ5dGVzIGZyb20gdGhlIHZhcmlhYmxlIHBhcnQgYXMgaXMgc2Vuc2libGUgKi8KLQl3aGlsZSAoKChvZmZzZXRUKSBieXRlX2luX2ZyYWcKLQkJPCBmcmFnX3B0ci0+ZnJfZml4ICsgZnJhZ19wdHItPmZyX3ZhciAqIGZyYWdfcHRyLT5mcl9vZmZzZXQpCi0JICAgICAgICYmIGRhdGFfYnVmZmVyX3NpemUgPCBNQVhfQllURVMgLSAzKQotCSAgewotCSAgICBpZiAoYWRkcmVzcyA9PSB+ICh1bnNpZ25lZCBpbnQpIDApCi0JICAgICAgewotCQlhZGRyZXNzID0gZnJhZ19wdHItPmZyX2FkZHJlc3M7Ci0JICAgICAgfQotCSAgICBzcHJpbnRmIChkYXRhX2J1ZmZlciArIGRhdGFfYnVmZmVyX3NpemUsCi0JCSAgICAgIiUwMlgiLAotCQkgICAgIChmcmFnX3B0ci0+ZnJfbGl0ZXJhbFt2YXJfcmVwX2lkeF0pICYgMHhmZik7Ci0jaWYgMAotCSAgICBkYXRhX2J1ZmZlcltkYXRhX2J1ZmZlcl9zaXplKytdID0gJyonOwotCSAgICBkYXRhX2J1ZmZlcltkYXRhX2J1ZmZlcl9zaXplKytdID0gJyonOwotI2VuZGlmCi0JICAgIGRhdGFfYnVmZmVyX3NpemUgKz0gMjsKLQotCSAgICB2YXJfcmVwX2lkeCsrOwotCSAgICBieXRlX2luX2ZyYWcrKzsKLQotCSAgICBpZiAoKG9mZnNldFQpIHZhcl9yZXBfaWR4ID49IGZyYWdfcHRyLT5mcl9maXggKyBmcmFnX3B0ci0+ZnJfdmFyKQotCSAgICAgIHZhcl9yZXBfaWR4ID0gdmFyX3JlcF9tYXg7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIGZyYWdfcHRyID0gZnJhZ19wdHItPmZyX25leHQ7Ci0gICAgfQotICBkYXRhX2J1ZmZlcltkYXRhX2J1ZmZlcl9zaXplXSA9ICdcMCc7Ci0gIHJldHVybiBhZGRyZXNzOwotfQotCi0KLQotCi0KLQotc3RhdGljIHZvaWQKLXByaW50X2xpbmVzIChsaXN0LCBsaW5lbm8sIHN0cmluZywgYWRkcmVzcykKLSAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgdW5zaWduZWQgaW50IGFkZHJlc3M7Ci17Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIHVuc2lnbmVkIGludCBuY2hhcnM7Ci0gIHVuc2lnbmVkIGludCBsaW5lczsKLSAgdW5zaWduZWQgaW50IGJ5dGVfaW5fd29yZCA9IDA7Ci0gIGNoYXIgKnNyYyA9IGRhdGFfYnVmZmVyOwotCi0gIC8qIFByaW50IHRoZSBzdHVmZiBvbiB0aGUgZmlyc3QgbGluZSAqLwotICBsaXN0aW5nX3BhZ2UgKGxpc3QpOwotICBuY2hhcnMgPSAoTElTVElOR19XT1JEX1NJWkUgKiAyICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aDsKLSAgCi0gIC8qIFByaW50IHRoZSBoZXggZm9yIHRoZSBmaXJzdCBsaW5lICovCi0gIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlIDRkICAgICAiLCBsaW5lbm8pOwotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBuY2hhcnM7IGlkeCsrKQotCWZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLQotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiXHQlc1xuIiwgc3RyaW5nID8gc3RyaW5nIDogIiIpOwotICAgICAgCi0gICAgICBvbl9wYWdlICsrOwotICAgICAgCi0gICAgICBsaXN0aW5nX3BhZ2UgKDApOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChoYWRfZXJyb3JzICgpKQotICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgPz8/PyAiLCBsaW5lbm8pOwotICBlbHNlCi0gICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCAlMDR4ICIsIGxpbmVubywgYWRkcmVzcyk7Ci0KLSAgLyogQW5kIHRoZSBkYXRhIHRvIGdvIGFsb25nIHdpdGggaXQgKi8KLSAgaWR4ID0gMDsKLSAgCi0gIHdoaWxlICgqc3JjICYmIGlkeCA8IG5jaGFycykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlYyVjIiwgc3JjWzBdLCBzcmNbMV0pOwotICAgICAgc3JjICs9IDI7Ci0gICAgICBieXRlX2luX3dvcmQrKzsKLSAgICAgIAotICAgICAgaWYgKGJ5dGVfaW5fd29yZCA9PSBMSVNUSU5HX1dPUkRfU0laRSkKLQl7Ci0JICBmcHJpbnRmIChsaXN0X2ZpbGUsICIgIik7Ci0JICBpZHgrKzsKLQkgIGJ5dGVfaW5fd29yZCA9IDA7Ci0JfQotICAgICAgCi0gICAgICBpZHggKz0gMjsKLSAgICB9Ci0gIAotICBmb3IgKDsgaWR4IDwgbmNoYXJzOyBpZHgrKykKLSAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIgIik7Ci0gIAotICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcdCVzXG4iLCBzdHJpbmcgPyBzdHJpbmcgOiAiIik7Ci0gIG9uX3BhZ2UrKzsKLSAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgCi0gIGlmIChsaXN0LT5tZXNzYWdlKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIioqKiogICVzXG4iLCBsaXN0LT5tZXNzYWdlKTsKLSAgICAgIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gICAgICBvbl9wYWdlKys7Ci0gICAgfQotICAKLSAgZm9yIChsaW5lcyA9IDA7Ci0gICAgICAgbGluZXMgPCAodW5zaWduZWQgaW50KSBsaXN0aW5nX2xoc19jb250X2xpbmVzCi0JICYmICpzcmM7Ci0gICAgICAgbGluZXMgKyspCi0gICAgewotICAgICAgbmNoYXJzID0gKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkKLQkqIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCAtIDE7Ci0gICAgICBpZHggPSAwOwotICAgICAgCi0gICAgICAvKiBQcmludCBhbnkgbW9yZSBsaW5lcyBvZiBkYXRhLCBidXQgbW9yZSBjb21wYWN0bHkgKi8KLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgICAgICAiLCBsaW5lbm8pOwotICAgICAgCi0gICAgICB3aGlsZSAoKnNyYyAmJiBpZHggPCBuY2hhcnMpCi0JewotCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJWMlYyIsIHNyY1swXSwgc3JjWzFdKTsKLQkgIHNyYyArPSAyOwotCSAgaWR4ICs9IDI7Ci0JICBieXRlX2luX3dvcmQrKzsKLQkgIAotCSAgaWYgKGJ5dGVfaW5fd29yZCA9PSBMSVNUSU5HX1dPUkRfU0laRSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLQkgICAgICBpZHgrKzsKLQkgICAgICBieXRlX2luX3dvcmQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcbiIpOwotICAgICAgb25fcGFnZSArKzsKLSAgICAgIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1saXN0X3N5bWJvbF90YWJsZSAoKQotewotICBleHRlcm4gc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotICBpbnQgZ290X3NvbWUgPSAwOwotCi0gIHN5bWJvbFMgKnB0cjsKLSAgZWplY3QgPSAxOwotICBsaXN0aW5nX3BhZ2UgKDApOwotCi0gIGZvciAocHRyID0gc3ltYm9sX3Jvb3RQOyBwdHIgIT0gKHN5bWJvbFMgKikgTlVMTDsgcHRyID0gc3ltYm9sX25leHQgKHB0cikpCi0gICAgewotICAgICAgaWYgKFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKHB0cikpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChwdHIpID09IGFic29sdXRlX3NlY3Rpb24pCi0JewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIC8qIERvbid0IHJlcG9ydCBzZWN0aW9uIHN5bWJvbHMuICBUaGV5IGFyZSBub3QgaW50ZXJlc3RpbmcuICAqLwotCSAgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKHB0cikpCi0JICAgIGNvbnRpbnVlOwotI2VuZGlmCi0JICBpZiAoU19HRVRfTkFNRSAocHRyKSkKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzMwXSwgZm10WzhdOwotCSAgICAgIHZhbHVlVCB2YWwgPSBTX0dFVF9WQUxVRSAocHRyKTsKLQotCSAgICAgIC8qIEBAIE5vdGUgdGhhdCB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgY29tcGlsYXRpb24gb3B0aW9ucywKLQkJIG5vdCBzb2xlbHkgb24gdGhlIHRhcmdldCBjaGFyYWN0ZXJpc3RpY3MuICAqLwotCSAgICAgIGlmIChzaXplb2YgKHZhbCkgPT0gNCAmJiBzaXplb2YgKGludCkgPT0gNCkKLQkJc3ByaW50ZiAoYnVmLCAiJTA4bHgiLCAodW5zaWduZWQgbG9uZykgdmFsKTsKLQkgICAgICBlbHNlIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKLQkJewotCQkgIHNwcmludGYgKGZtdCwgIiUlMCVsdWx4IiwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSAoc2l6ZW9mICh2YWwpICogMikpOwotCQkgIHNwcmludGYgKGJ1ZiwgZm10LCAodW5zaWduZWQgbG9uZykgdmFsKTsKLQkJfQotI2lmIGRlZmluZWQgKEJGRDY0KQotCSAgICAgIGVsc2UgaWYgKHNpemVvZiAodmFsKSA+IDQpCi0JCXNwcmludGZfdm1hIChidWYsIHZhbCk7Ci0jZW5kaWYKLQkgICAgICBlbHNlCi0JCWFib3J0ICgpOwotCi0JICAgICAgaWYgKCFnb3Rfc29tZSkKLQkJewotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIkRFRklORUQgU1lNQk9MU1xuIik7Ci0JCSAgb25fcGFnZSsrOwotCQkgIGdvdF9zb21lID0gMTsKLQkJfQotCi0JICAgICAgaWYgKHN5bWJvbF9nZXRfZnJhZyAocHRyKSAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHB0ciktPmxpbmUpCi0JCXsKLQkJICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlMjBzOiUtNWQgICVzOiVzICVzXG4iLAotCQkJICAgc3ltYm9sX2dldF9mcmFnIChwdHIpLT5saW5lLT5maWxlLT5maWxlbmFtZSwKLQkJCSAgIHN5bWJvbF9nZXRfZnJhZyAocHRyKS0+bGluZS0+bGluZSwKLQkJCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocHRyKSksCi0JCQkgICBidWYsIFNfR0VUX05BTUUgKHB0cikpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJTMzczolcyAlc1xuIiwKLQkJCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocHRyKSksCi0JCQkgICBidWYsIFNfR0VUX05BTUUgKHB0cikpOwotCQl9Ci0KLQkgICAgICBvbl9wYWdlICsrOwotCSAgICAgIGxpc3RpbmdfcGFnZSAoMCk7Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGlmICghZ290X3NvbWUpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiTk8gREVGSU5FRCBTWU1CT0xTXG4iKTsKLSAgICAgIG9uX3BhZ2UrKzsKLSAgICB9Ci0gIGZwcmludGYgKGxpc3RfZmlsZSwgIlxuIik7Ci0gIG9uX3BhZ2UrKzsKLSAgbGlzdGluZ19wYWdlICgwKTsKLQotICBnb3Rfc29tZSA9IDA7Ci0KLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7IHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOyBwdHIgPSBzeW1ib2xfbmV4dCAocHRyKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfTkFNRSAocHRyKSAmJiBzdHJsZW4gKFNfR0VUX05BTUUgKHB0cikpICE9IDApCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHB0cikgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBpZiAoIWdvdF9zb21lKQotCQl7Ci0JCSAgZ290X3NvbWUgPSAxOwotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIlVOREVGSU5FRCBTWU1CT0xTXG4iKTsKLQkJICBvbl9wYWdlKys7Ci0JCSAgbGlzdGluZ19wYWdlICgwKTsKLQkJfQotCSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCBTX0dFVF9OQU1FIChwdHIpKTsKLQkgICAgICBvbl9wYWdlKys7Ci0JICAgICAgbGlzdGluZ19wYWdlICgwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmICghZ290X3NvbWUpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiTk8gVU5ERUZJTkVEIFNZTUJPTFNcbiIpOwotICAgICAgb25fcGFnZSsrOwotICAgICAgbGlzdGluZ19wYWdlICgwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zb3VyY2UgKGN1cnJlbnRfZmlsZSwgbGlzdCwgYnVmZmVyLCB3aWR0aCkKLSAgICAgZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfZmlsZTsKLSAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgdW5zaWduZWQgaW50IHdpZHRoOwotewotICBpZiAoIWN1cnJlbnRfZmlsZS0+YXRfZW5kKQotICAgIHsKLSAgICAgIHdoaWxlIChjdXJyZW50X2ZpbGUtPmxpbmVudW0gPCBsaXN0LT5obGxfbGluZQotCSAgICAgJiYgIWN1cnJlbnRfZmlsZS0+YXRfZW5kKQotCXsKLQkgIGNoYXIgKnAgPSBidWZmZXJfbGluZSAoY3VycmVudF9maWxlLCBidWZmZXIsIHdpZHRoKTsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiU0dTolLTEzcyAqKioqICVzXG4iLCBjdXJyZW50X2ZpbGUtPmxpbmVudW0sCi0JCSAgIGN1cnJlbnRfZmlsZS0+ZmlsZW5hbWUsIHApOwotCSAgb25fcGFnZSsrOwotCSAgbGlzdGluZ19wYWdlIChsaXN0KTsKLQl9Ci0gICAgfQotfQotCi0vKiBTb21ldGltZXMgdGhlIHVzZXIgZG9lc24ndCB3YW50IHRvIGJlIGJvdGhlcmVkIGJ5IHRoZSBkZWJ1Z2dpbmcKLSAgIHJlY29yZHMgaW5zZXJ0ZWQgYnkgdGhlIGNvbXBpbGVyLCBzZWUgaWYgdGhlIGxpbmUgaXMgc3VzcGljaW91cy4gICovCi0KLXN0YXRpYyBpbnQKLWRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIGxpbmUpCi0gICAgIGxpc3RfaW5mb190eXBlICpsaXN0OwotICAgICBjb25zdCBjaGFyICpsaW5lOwotewotICBzdGF0aWMgaW50IGluX2RlYnVnOwotICBpbnQgd2FzX2RlYnVnOwotCi0gIGlmIChsaXN0LT5kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgaW5fZGVidWcgPSAxOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHdhc19kZWJ1ZyA9IGluX2RlYnVnOwotICBpbl9kZWJ1ZyA9IDA7Ci0KLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqbGluZSkpCi0gICAgbGluZSsrOwotCi0gIGlmICgqbGluZSAhPSAnLicpCi0gICAgewotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIFRoZSBFTEYgY29tcGlsZXIgc29tZXRpbWVzIGVtaXRzIGJsYW5rIGxpbmVzIGFmdGVyIHN3aXRjaGluZwotICAgICAgICAgb3V0IG9mIGEgZGVidWdnaW5nIHNlY3Rpb24uICBJZiB0aGUgbmV4dCBsaW5lIGRyb3BzIHVzIGJhY2sKLSAgICAgICAgIGludG8gZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGVuIGRvbid0IHByaW50IHRoZSBibGFuayBsaW5lLgotICAgICAgICAgVGhpcyBpcyBhIGhhY2sgZm9yIGEgcGFydGljdWxhciBjb21waWxlciBiZWhhdmlvdXIsIG5vdCBhCi0gICAgICAgICBnZW5lcmFsIGNhc2UuICAqLwotICAgICAgaWYgKHdhc19kZWJ1ZwotCSAgJiYgKmxpbmUgPT0gJ1wwJwotCSAgJiYgbGlzdC0+bmV4dCAhPSBOVUxMCi0JICAmJiBsaXN0LT5uZXh0LT5kZWJ1Z2dpbmcpCi0JewotCSAgaW5fZGVidWcgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBsaW5lKys7Ci0KLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJkZWYiLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInZhbCIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAic2NsIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJsaW5lIiwgNCkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJlbmRlZiIsIDUpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAibG4iLCAyKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInR5cGUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInNpemUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImRpbSIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidGFnIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoc3RybmNtcCAobGluZSwgInN0YWJzIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJzdGFibiIsIDUpID09IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX2xpc3RpbmcgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGxpc3RfaW5mb190eXBlICpsaXN0ID0gaGVhZDsKLSAgZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfaGxsX2ZpbGUgPSAoZmlsZV9pbmZvX3R5cGUgKikgTlVMTDsKLSAgY2hhciAqbWVzc2FnZTsKLSAgY2hhciAqYnVmZmVyOwotICBjaGFyICpwOwotICBpbnQgc2hvd19saXN0aW5nID0gMTsKLSAgdW5zaWduZWQgaW50IHdpZHRoOwotCi0gIGJ1ZmZlciA9IHhtYWxsb2MgKGxpc3RpbmdfcmhzX3dpZHRoKTsKLSAgZGF0YV9idWZmZXIgPSB4bWFsbG9jIChNQVhfQllURVMpOwotICBlamVjdCA9IDE7Ci0gIGxpc3QgPSBoZWFkOwotCi0gIHdoaWxlIChsaXN0ICE9IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMICYmIDApCi0gICAgewotICAgICAgaWYgKGxpc3QtPm5leHQpCi0JbGlzdC0+ZnJhZyA9IGxpc3QtPm5leHQtPmZyYWc7Ci0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLQotICAgIH0KLQotICBsaXN0ID0gaGVhZC0+bmV4dDsKLQotCi0gIHdoaWxlIChsaXN0KQotICAgIHsKLSAgICAgIGludCBsaXN0X2xpbmU7Ci0KLSAgICAgIHdpZHRoID0gbGlzdGluZ19yaHNfd2lkdGggPiBwYXBlcl93aWR0aCA/IHBhcGVyX3dpZHRoIDoKLQlsaXN0aW5nX3Joc193aWR0aDsKLQotICAgICAgbGlzdF9saW5lID0gbGlzdC0+bGluZTsKLSAgICAgIHN3aXRjaCAobGlzdC0+ZWRpY3QpCi0JewotCWNhc2UgRURJQ1RfTElTVDoKLQkgIC8qIFNraXAgYWxsIGxpbmVzIHVwIHRvIHRoZSBjdXJyZW50LiAgKi8KLQkgIGxpc3RfbGluZS0tOwotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9OT0xJU1Q6Ci0JICBzaG93X2xpc3RpbmctLTsKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfTk9MSVNUX05FWFQ6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX0VKRUNUOgotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9OT05FOgotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9USVRMRToKLQkgIHRpdGxlID0gbGlzdC0+ZWRpY3RfYXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9TQlRUTDoKLQkgIHN1YnRpdGxlID0gbGlzdC0+ZWRpY3RfYXJnOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaWYgKHNob3dfbGlzdGluZyA8PSAwKQotCXsKLQkgIHdoaWxlIChsaXN0LT5maWxlLT5saW5lbnVtIDwgbGlzdF9saW5lCi0JCSAmJiAhbGlzdC0+ZmlsZS0+YXRfZW5kKQotCSAgICBwID0gYnVmZmVyX2xpbmUgKGxpc3QtPmZpbGUsIGJ1ZmZlciwgd2lkdGgpOwotCX0KLQotICAgICAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX0xJU1QpCi0JewotCSAgLyogRW5hYmxlIGxpc3RpbmcgZm9yIHRoZSBzaW5nbGUgbGluZSB0aGF0IGNhdXNlZCB0aGUgZW5hYmxlLiAgKi8KLQkgIGxpc3RfbGluZSsrOwotCSAgc2hvd19saXN0aW5nKys7Ci0JfQotCi0gICAgICBpZiAoc2hvd19saXN0aW5nID4gMCkKLQl7Ci0JICAvKiBTY2FuIGRvd24gdGhlIGxpc3QgYW5kIHByaW50IGFsbCB0aGUgc3R1ZmYgd2hpY2ggY2FuIGJlIGRvbmUKLQkgICAgIHdpdGggdGhpcyBsaW5lIChvciBsaW5lcykuICAqLwotCSAgbWVzc2FnZSA9IDA7Ci0KLQkgIGlmIChsaXN0LT5obGxfZmlsZSkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfaGxsX2ZpbGUgPSBsaXN0LT5obGxfZmlsZTsKLQkgICAgfQotCi0JICBpZiAoY3VycmVudF9obGxfZmlsZSAmJiBsaXN0LT5obGxfbGluZSAmJiAobGlzdGluZyAmIExJU1RJTkdfSExMKSkKLQkgICAgewotCSAgICAgIHByaW50X3NvdXJjZSAoY3VycmVudF9obGxfZmlsZSwgbGlzdCwgYnVmZmVyLCB3aWR0aCk7Ci0JICAgIH0KLQotCSAgaWYgKGxpc3QtPmxpbmVfY29udGVudHMpCi0JICAgIHsKLQkgICAgICBpZiAoISgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykKLQkJICAgICYmIGRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIGxpc3QtPmxpbmVfY29udGVudHMpKSkKLQkJewotIAkJICBwcmludF9saW5lcyAobGlzdCwKLQkJCSAgICAgICBsaXN0LT5maWxlLT5saW5lbnVtID09IDAgPyBsaXN0LT5saW5lIDogbGlzdC0+ZmlsZS0+bGluZW51bSwKLQkJCSAgICAgICBsaXN0LT5saW5lX2NvbnRlbnRzLCBjYWxjX2hleCAobGlzdCkpOwotCQl9Ci0JICAgICAgZnJlZSAobGlzdC0+bGluZV9jb250ZW50cyk7Ci0JICAgICAgbGlzdC0+bGluZV9jb250ZW50cyA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdoaWxlIChsaXN0LT5maWxlLT5saW5lbnVtIDwgbGlzdF9saW5lCi0JCSAgICAgJiYgIWxpc3QtPmZpbGUtPmF0X2VuZCkKLQkJewotCQkgIHVuc2lnbmVkIGludCBhZGRyZXNzOwotCi0JCSAgcCA9IGJ1ZmZlcl9saW5lIChsaXN0LT5maWxlLCBidWZmZXIsIHdpZHRoKTsKLQotCQkgIGlmIChsaXN0LT5maWxlLT5saW5lbnVtIDwgbGlzdF9saW5lKQotCQkgICAgYWRkcmVzcyA9IH4gKHVuc2lnbmVkIGludCkgMDsKLQkJICBlbHNlCi0JCSAgICBhZGRyZXNzID0gY2FsY19oZXggKGxpc3QpOwotCi0JCSAgaWYgKCEoKGxpc3RpbmcgJiBMSVNUSU5HX05PREVCVUcpCi0JCQkmJiBkZWJ1Z2dpbmdfcHNldWRvIChsaXN0LCBwKSkpCi0JCSAgICBwcmludF9saW5lcyAobGlzdCwgbGlzdC0+ZmlsZS0+bGluZW51bSwgcCwgYWRkcmVzcyk7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfRUpFQ1QpCi0JICAgIHsKLQkgICAgICBlamVjdCA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9OT0xJU1RfTkVYVCkKLQktLXNob3dfbGlzdGluZzsKLQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotCi0gIGZyZWUgKGJ1ZmZlcik7Ci0gIGZyZWUgKGRhdGFfYnVmZmVyKTsKLSAgZGF0YV9idWZmZXIgPSBOVUxMOwotfQotCi12b2lkCi1saXN0aW5nX3ByaW50IChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgdXNpbmdfc3Rkb3V0OwotICAKLSAgdGl0bGUgPSAiIjsKLSAgc3VidGl0bGUgPSAiIjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxpc3RfZmlsZSA9IHN0ZG91dDsKLSAgICAgIHVzaW5nX3N0ZG91dCA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGlzdF9maWxlID0gZm9wZW4gKG5hbWUsICJ3Iik7Ci0gICAgICBpZiAobGlzdF9maWxlICE9IE5VTEwpCi0JdXNpbmdfc3Rkb3V0ID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19wZXJyb3IgKF8oImNhbid0IG9wZW4gbGlzdCBmaWxlOiAlcyIpLCBuYW1lKTsKLQkgIGxpc3RfZmlsZSA9IHN0ZG91dDsKLQkgIHVzaW5nX3N0ZG91dCA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAobGlzdGluZyAmIExJU1RJTkdfTk9GT1JNKQotICAgIHsKLSAgICAgIHBhcGVyX2hlaWdodCA9IDA7Ci0gICAgfQotCi0gIGlmIChsaXN0aW5nICYgTElTVElOR19MSVNUSU5HKQotICAgIHsKLSAgICAgIGxpc3RpbmdfbGlzdGluZyAobmFtZSk7Ci0gICAgfQotCi0gIGlmIChsaXN0aW5nICYgTElTVElOR19TWU1CT0xTKQotICAgIHsKLSAgICAgIGxpc3Rfc3ltYm9sX3RhYmxlICgpOwotICAgIH0KLQotICBpZiAoISB1c2luZ19zdGRvdXQpCi0gICAgewotICAgICAgaWYgKGZjbG9zZSAobGlzdF9maWxlKSA9PSBFT0YpCi0JYXNfcGVycm9yIChfKCJlcnJvciBjbG9zaW5nIGxpc3QgZmlsZTogJXMiKSwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChsYXN0X29wZW5fZmlsZSkKLSAgICB7Ci0gICAgICBmY2xvc2UgKGxhc3Rfb3Blbl9maWxlKTsKLSAgICB9Ci19Ci0KLQotdm9pZAotbGlzdGluZ19maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBmbiA9IG5hbWU7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfZWplY3QgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX0VKRUNUOwotfQotCi12b2lkCi1saXN0aW5nX2ZsYWdzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHdoaWxlICgoKmlucHV0X2xpbmVfcG9pbnRlcisrKSAmJiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nKSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotfQotCi0vKiBUdXJuIGxpc3Rpbmcgb24gb3Igb2ZmLiAgQW4gYXJndW1lbnQgb2YgMCBtZWFucyB0byB0dXJuIG9mZgotICAgbGlzdGluZy4gIEFuIGFyZ3VtZW50IG9mIDEgbWVhbnMgdG8gdHVybiBvbiBsaXN0aW5nLiAgQW4gYXJndW1lbnQKLSAgIG9mIDIgbWVhbnMgdG8gdHVybiBvZmYgbGlzdGluZywgYnV0IGFzIG9mIHRoZSBuZXh0IGxpbmU7IHRoYXQgaXMsCi0gICB0aGUgY3VycmVudCBsaW5lIHNob3VsZCBiZSBsaXN0ZWQsIGJ1dCB0aGUgbmV4dCBsaW5lIHNob3VsZCBub3QuICAqLwotCi12b2lkCi1saXN0aW5nX2xpc3QgKG9uKQotICAgICBpbnQgb247Ci17Ci0gIGlmIChsaXN0aW5nKQotICAgIHsKLSAgICAgIHN3aXRjaCAob24pCi0JewotCWNhc2UgMDoKLQkgIGlmIChsaXN0aW5nX3RhaWwtPmVkaWN0ID09IEVESUNUX0xJU1QpCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9OT05FOwotCSAgZWxzZQotCSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9MSVNUOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaWYgKGxpc3RpbmdfdGFpbC0+ZWRpY3QgPT0gRURJQ1RfTk9MSVNUCi0JICAgICAgfHwgbGlzdGluZ190YWlsLT5lZGljdCA9PSBFRElDVF9OT0xJU1RfTkVYVCkKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTkU7Ci0JICBlbHNlCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9MSVNUOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTElTVF9ORVhUOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci19Ci0KLQotdm9pZAotbGlzdGluZ19wc2l6ZSAod2lkdGhfb25seSkKLSAgICAgaW50IHdpZHRoX29ubHk7Ci17Ci0gIGlmICghIHdpZHRoX29ubHkpCi0gICAgewotICAgICAgcGFwZXJfaGVpZ2h0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgICAgIGlmIChwYXBlcl9oZWlnaHQgPCAwIHx8IHBhcGVyX2hlaWdodCA+IDEwMDApCi0JewotCSAgcGFwZXJfaGVpZ2h0ID0gMDsKLQkgIGFzX3dhcm4gKF8oInN0cmFuZ2UgcGFwZXIgaGVpZ2h0LCBzZXQgdG8gbm8gZm9ybSIpKTsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIHBhcGVyX3dpZHRoID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotbGlzdGluZ19ub3BhZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcGFwZXJfaGVpZ2h0ID0gMDsKLX0KLQotdm9pZAotbGlzdGluZ190aXRsZSAoZGVwdGgpCi0gICAgIGludCBkZXB0aDsKLXsKLSAgaW50IHF1b3RlZDsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgKnR0bDsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcIicpCi0gICAgcXVvdGVkID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHF1b3RlZCA9IDE7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgewotICAgICAgaWYgKHF1b3RlZAotCSAgPyAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicKLQkgIDogaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCXsKLQkgIGlmIChsaXN0aW5nKQotCSAgICB7Ci0JICAgICAgbGVuZ3RoID0gaW5wdXRfbGluZV9wb2ludGVyIC0gc3RhcnQ7Ci0JICAgICAgdHRsID0geG1hbGxvYyAobGVuZ3RoICsgMSk7Ci0JICAgICAgbWVtY3B5ICh0dGwsIHN0YXJ0LCBsZW5ndGgpOwotCSAgICAgIHR0bFtsZW5ndGhdID0gMDsKLQkgICAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gZGVwdGggPyBFRElDVF9TQlRUTCA6IEVESUNUX1RJVExFOwotCSAgICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3RfYXJnID0gdHRsOwotCSAgICB9Ci0JICBpZiAocXVvdGVkKQotCSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCXsKLQkgIGFzX2JhZCAoXygiTmV3IGxpbmUgaW4gdGl0bGUiKSk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQl9Ci0gICAgfQotfQotCi0KLQotdm9pZAotbGlzdGluZ19zb3VyY2VfbGluZSAobGluZSkKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci17Ci0gIGlmIChsaXN0aW5nKQotICAgIHsKLSAgICAgIG5ld19mcmFnICgpOwotICAgICAgbGlzdGluZ190YWlsLT5obGxfbGluZSA9IGxpbmU7Ci0gICAgICBuZXdfZnJhZyAoKTsKLSAgICB9Ci19Ci0KLXZvaWQKLWxpc3Rpbmdfc291cmNlX2ZpbGUgKGZpbGUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIGlmIChsaXN0aW5nKQotICAgIGxpc3RpbmdfdGFpbC0+aGxsX2ZpbGUgPSBmaWxlX2luZm8gKGZpbGUpOwotfQotCi0KLQotI2Vsc2UKLQotCi0vKiBEdW1teSBmdW5jdGlvbnMgZm9yIHdoZW4gY29tcGlsZWQgd2l0aG91dCBsaXN0aW5nIGVuYWJsZWQgKi8KLQotdm9pZAotbGlzdGluZ19mbGFncyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQgCi1saXN0aW5nX2xpc3QgKG9uKQotICAgICBpbnQgb247Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZCAKLWxpc3RpbmdfZWplY3QgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ19wc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQKLWxpc3Rpbmdfbm9wYWdlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZCAKLWxpc3RpbmdfdGl0bGUgKGRlcHRoKQotICAgICBpbnQgZGVwdGg7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZAotbGlzdGluZ19maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotCi19Ci0KLXZvaWQgCi1saXN0aW5nX25ld2xpbmUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0KLX0KLQotdm9pZCAKLWxpc3Rpbmdfc291cmNlX2xpbmUgKG4pCi0gICAgIHVuc2lnbmVkIGludCBuOwotewotCi19Ci12b2lkIAotbGlzdGluZ19zb3VyY2VfZmlsZSAobikKLSAgICAgY29uc3QgY2hhciAqbjsKLXsKLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9saXN0aW5nLmggYi9nYXMvbGlzdGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGQ1YzM3Li4wMDAwMDAwCi0tLSBhL2dhcy9saXN0aW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgbGlzdGluZy5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX19saXN0aW5nX2hfXwotI2RlZmluZSBfX2xpc3RpbmdfaF9fCi0KLSNkZWZpbmUgTElTVElOR19MSVNUSU5HICAgIDEKLSNkZWZpbmUgTElTVElOR19TWU1CT0xTICAgIDIKLSNkZWZpbmUgTElTVElOR19OT0ZPUk0gICAgIDQKLSNkZWZpbmUgTElTVElOR19ITEwgICAgICAgIDgKLSNkZWZpbmUgTElTVElOR19OT0RFQlVHICAgMTYKLSNkZWZpbmUgTElTVElOR19OT0NPTkQJICAzMgotI2RlZmluZSBMSVNUSU5HX01BQ0VYUAkgIDY0Ci0KLSNkZWZpbmUgTElTVElOR19ERUZBVUxUICAgIChMSVNUSU5HX0xJU1RJTkcgfCBMSVNUSU5HX0hMTCB8IExJU1RJTkdfU1lNQk9MUykKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0jZGVmaW5lIExJU1RJTkdfTkVXTElORSgpIHsgaWYgKGxpc3RpbmcpIGxpc3RpbmdfbmV3bGluZShOVUxMKTsgfQotI2Vsc2UKLSNkZWZpbmUgTElTVElOR19ORVdMSU5FKCkgezt9Ci0jZW5kaWYKLSNkZWZpbmUgTElTVElOR19FT0YoKSAgICAgTElTVElOR19ORVdMSU5FKCkKLQotI2RlZmluZSBMSVNUSU5HX1NLSVBfQ09ORCgpICgobGlzdGluZyAmIExJU1RJTkdfTk9DT05EKSAhPSAwKQotCi12b2lkIGxpc3RpbmdfZWplY3QgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3RpbmdfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqbWVzc2FnZSkpOwotdm9pZCBsaXN0aW5nX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotdm9pZCBsaXN0aW5nX2ZsYWdzIFBBUkFNUyAoKGludCkpOwotdm9pZCBsaXN0aW5nX2xpc3QgUEFSQU1TICgoaW50IG9uKSk7Ci12b2lkIGxpc3RpbmdfbmV3bGluZSBQQVJBTVMgKChjaGFyICpwcykpOwotdm9pZCBsaXN0aW5nX3ByZXZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGxpc3RpbmdfcHJpbnQgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotdm9pZCBsaXN0aW5nX3BzaXplIFBBUkFNUyAoKGludCkpOwotdm9pZCBsaXN0aW5nX25vcGFnZSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgbGlzdGluZ19zb3VyY2VfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXZvaWQgbGlzdGluZ19zb3VyY2VfbGluZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXZvaWQgbGlzdGluZ190aXRsZSBQQVJBTVMgKChpbnQgZGVwdGgpKTsKLXZvaWQgbGlzdGluZ193YXJuaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1lc3NhZ2UpKTsKLXZvaWQgbGlzdGluZ193aWR0aCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgeCkpOwotCi1leHRlcm4gaW50IGxpc3RpbmdfbGhzX3dpZHRoOwotZXh0ZXJuIGludCBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQ7Ci1leHRlcm4gaW50IGxpc3RpbmdfbGhzX2NvbnRfbGluZXM7Ci1leHRlcm4gaW50IGxpc3RpbmdfcmhzX3dpZHRoOwotCi0jZW5kaWYgLyogX19saXN0aW5nX2hfXyAqLwotCi0vKiBlbmQgb2YgbGlzdGluZy5oICovCmRpZmYgLS1naXQgYS9nYXMvbGl0ZXJhbC5jIGIvZ2FzL2xpdGVyYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmOGZjNC4uMDAwMDAwMAotLS0gYS9nYXMvbGl0ZXJhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyogYXMuYyAtIEdBUyBsaXRlcmFsIHBvb2wgbWFuYWdlbWVudC4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgS2VuIFJhZWJ1cm4gKHJhZWJ1cm5AY3lnbnVzLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKiBUaGlzIGlzbid0IHF1aXRlIGEgImNvbnN0YW50IiBwb29sLiAgU29tZSBvZiB0aGUgdmFsdWVzIG1heSBnZXQKLSAgIGFkanVzdGVkIGF0IHJ1biB0aW1lLCBlLmcuLCBmb3Igc3ltYm9saWMgcmVsb2NhdGlvbnMgd2hlbiBzaGFyZWQKLSAgIGxpYnJhcmllcyBhcmUgaW4gdXNlLiAgSXQncyBtb3JlIG9mIGEgImxpdGVyYWwiIHBvb2wuCi0KLSAgIE9uIHRoZSBBbHBoYSwgdGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgLmxpdGEgYW5kIC5saXQ4LiAgKElzIHRoZXJlCi0gICBldmVyIGEgLmxpdDQ/KSAgT24gdGhlIE1JUFMsIGl0IGNvdWxkIGJlIHVzZWQgZm9yIC5saXQ0IGFzIHdlbGwuCi0KLSAgIFRoZSBleHByZXNzaW9ucyBwYXNzZWQgaGVyZSBzaG91bGQgY29udGFpbiBlaXRoZXIgY29uc3RhbnRzIG9yIHN5bWJvbHMsCi0gICBub3QgYSBjb21iaW5hdGlvbiBvZiBib3RoLiAgVHlwaWNhbGx5LCB0aGUgY29uc3RhbnQgcG9vbCBpcyBhY2Nlc3NlZAotICAgd2l0aCBzb21lIHNvcnQgb2YgR1AgcmVnaXN0ZXIsIHNvIHRoZSBzaXplIG9mIHRoZSBwb29sIG11c3QgYmUga2VwdCBkb3duCi0gICBpZiBwb3NzaWJsZS4gIFRoZSBleGNlcHRpb24gaXMgc2VjdGlvbiBvZmZzZXRzIC0tIGlmIHlvdSdyZSBzdG9yaW5nIGEKLSAgIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIC5kYXRhLCBmb3IgZXhhbXBsZSwgYW5kIHlvdXIgbWFjaGluZSBwcm92aWRlcwotICAgZm9yIDE2LWJpdCBzaWduZWQgYWRkZW5kcywgeW91IG1pZ2h0IHdhbnQgdG8gc3RvcmUgLmRhdGErMzJLLCBzbyB0aGF0Ci0gICB5b3UgY2FuIGFjY2VzcyBhbGwgb2YgdGhlIGZpcnN0IDY0SyBvZiAuZGF0YSB3aXRoIHRoZSBvbmUgcG9pbnRlci4KLQotICAgVGhpcyBpc24ndCBhIHJlcXVpcmVtZW50LCBqdXN0IGEgZ3VpZGVsaW5lIHRoYXQgY2FuIGhlbHAga2VlcCAubyBmaWxlCi0gICBzaXplIGRvd24uICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiBkZWZpbmVkIChORUVEX0xJVEVSQUxfUE9PTCkKLQotdmFsdWVUCi1hZGRfdG9fbGl0ZXJhbF9wb29sIChzeW0sIGFkZGVuZCwgc2VjLCBzaXplKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHZhbHVlVCBhZGRlbmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgc2VnVCBjdXJyZW50X3NlY3Rpb24gPSBub3dfc2VnOwotICBpbnQgY3VycmVudF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICB2YWx1ZVQgb2Zmc2V0OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKLSAgY2hhciAqcDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgZml4UyAqZml4cDsKLQotICBvZmZzZXQgPSAwOwotICAvKiBAQCBUaGlzIGFzc3VtZXMgYWxsIGVudHJpZXMgaW4gYSBnaXZlbiBzZWN0aW9uIHdpbGwgYmUgb2YgdGhlIHNhbWUKLSAgICAgc2l6ZS4uLiAgUHJvYmFibHkgY29ycmVjdCwgYnV0IHVud2lzZSB0byByZWx5IG9uLiAgKi8KLSAgLyogVGhpcyBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBzdWJzZWdtZW50LiAgKi8KLSAgaWYgKHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIGZvciAoZml4cCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5maXhfcm9vdDsKLQkgZml4cCAhPSAoZml4UyAqKSBOVUxMOwotCSBmaXhwID0gZml4cC0+ZnhfbmV4dCwgb2Zmc2V0ICs9IHNpemUpCi0gICAgICB7Ci0JaWYgKGZpeHAtPmZ4X2FkZHN5ID09IHN5bSAmJiBmaXhwLT5meF9vZmZzZXQgPT0gYWRkZW5kKQotCSAgcmV0dXJuIG9mZnNldDsKLSAgICAgIH0KLQotICBzdWJzZWdfc2V0IChzZWMsIDApOwotICBwID0gZnJhZ19tb3JlIChzaXplKTsKLSAgbWVtc2V0IChwLCAwLCBzaXplKTsKLQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICByZWxvY190eXBlID0gQkZEX1JFTE9DXzY0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwgc3ltLCBhZGRlbmQsIDAsCi0JICAgcmVsb2NfdHlwZSk7Ci0KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7Ci0gIG9mZnNldCA9IHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSBzaXplOwotICByZXR1cm4gb2Zmc2V0OwotfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KZGlmZiAtLWdpdCBhL2dhcy9tYWMtYXMuciBiL2dhcy9tYWMtYXMucgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2YzAzMy4uMDAwMDAwMAotLS0gYS9nYXMvbWFjLWFzLnIKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSZXNvdXJjZXMgZm9yIEdOVSBBUy4gKi8KLQotI2luY2x1ZGUgIlN5c1R5cGVzLnIiCi0KLS8qIFZlcnNpb24gcmVzb3VyY2VzLiAqLwotCi1yZXNvdXJjZSAndmVycycgKDEpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQlWRVJTSU9OX1NUUklORyAgIiAoQykgMTk4Ni05NSBGU0YsIEluYy4iCi19OwotCi1yZXNvdXJjZSAndmVycycgKDIsIHB1cmdlYWJsZSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCSJHQVMgIiBWRVJTSU9OX1NUUklORyAiIGZvciBNUFciCi19OwotCi0jaWZkZWYgV0FOVF9DRlJHCi0KLSNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgotCi1yZXNvdXJjZSAnY2ZyZycgKDApIHsKLQl7Ci0JCWtQb3dlclBDLAotCQlrRnVsbExpYiwKLQkJa05vVmVyc2lvbk51bSwga05vVmVyc2lvbk51bSwKLQkJMCwwLAotCQlrSXNBcHAsIGtPbkRpc2tGbGF0LCBrWmVyb09mZnNldCwga1dob2xlRm9yaywKLQkJUFJPR19OQU1FCi0JfQotfTsKLQotI2VuZGlmIC8qIFdBTlRfQ0ZSRyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL21hY3JvLmMgYi9nYXMvbWFjcm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlYjE1Ny4uMDAwMDAwMAotLS0gYS9nYXMvbWFjcm8uYworKysgL2Rldi9udWxsCkBAIC0xLDEyNjEgKzAsMCBAQAotLyogbWFjcm8uYyAtIG1hY3JvIHN1cHBvcnQgZm9yIGdhcyBhbmQgZ2FzcAotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKLSAgICAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jIGlmbmRlZiBhbGxvY2EKLSMgIGlmZGVmIF9fU1REQ19fCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgZWxzZQotZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZWxzZQotIyBpZiBIQVZFX0FMTE9DQV9ICi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLSMgICAgaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX19ocHV4KQotZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZWxzZQotZXh0ZXJuIHZvaWQgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYgLyogX19TVERDX18sIF9faHB1eCAqLwotIyAgIGVuZGlmIC8qIGFsbG9jYSAqLwotIyAgZW5kaWYgLyogX0FJWCAqLwotIyBlbmRpZiAvKiBIQVZFX0FMTE9DQV9IICovCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNiLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0KLSNpbmNsdWRlICJhc2ludGwuaCIKLQotLyogVGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSBoYW5kbGUgbWFjcm8gZGVmaW5pdGlvbiBhbmQgZXhwYW5zaW9uLgotICAgVGhleSBhcmUgY2FsbGVkIGJ5IGJvdGggZ2FzcCBhbmQgZ2FzLiAgKi8KLQotLyogU3RydWN0dXJlcyB1c2VkIHRvIHN0b3JlIG1hY3Jvcy4gCi0KLSAgIEVhY2ggbWFjcm8ga25vd3MgaXRzIG5hbWUgYW5kIGluY2x1ZGVkIHRleHQuICBJdCBnZXRzIGJ1aWx0IHdpdGggYQotICAgbGlzdCBvZiBmb3JtYWwgYXJndW1lbnRzLCBhbmQgYWxzbyBrZWVwcyBhIGhhc2ggdGFibGUgd2hpY2ggcG9pbnRzCi0gICBpbnRvIHRoZSBsaXN0IHRvIHNwZWVkIHVwIGZvcm1hbCBzZWFyY2guICBFYWNoIGZvcm1hbCBrbm93cyBpdHMKLSAgIG5hbWUgYW5kIGl0cyBkZWZhdWx0IHZhbHVlLiAgRWFjaCB0aW1lIHRoZSBtYWNybyBpcyBleHBhbmRlZCwgdGhlCi0gICBmb3JtYWxzIGdldCB0aGUgYWN0dWFsIHZhbHVlcyBhdHRhdGNoZWQgdG8gdGhlbS4gKi8KLQotLyogZGVzY3JpYmUgdGhlIGZvcm1hbCBhcmd1bWVudHMgdG8gYSBtYWNybyAqLwotCi10eXBlZGVmIHN0cnVjdCBmb3JtYWxfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgZm9ybWFsX3N0cnVjdCAqbmV4dDsJLyogbmV4dCBmb3JtYWwgaW4gbGlzdCAqLwotICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiB0aGUgZm9ybWFsICovCi0gICAgc2IgZGVmOwkJCS8qIHRoZSBkZWZhdWx0IHZhbHVlICovCi0gICAgc2IgYWN0dWFsOwkJCS8qIHRoZSBhY3R1YWwgYXJndW1lbnQgKGNoYW5nZWQgb24gZWFjaCBleHBhbnNpb24pICovCi0gICAgaW50IGluZGV4OwkJCS8qIHRoZSBpbmRleCBvZiB0aGUgZm9ybWFsIDAuLmZvcm1hbF9jb3VudC0xICovCi0gIH0KLWZvcm1hbF9lbnRyeTsKLQotLyogT3RoZXIgdmFsdWVzIGZvdW5kIGluIHRoZSBpbmRleCBmaWVsZCBvZiBhIGZvcm1hbF9lbnRyeS4gICovCi0jZGVmaW5lIFFVQUxfSU5ERVggKC0xKQotI2RlZmluZSBOQVJHX0lOREVYICgtMikKLSNkZWZpbmUgTE9DQUxfSU5ERVggKC0zKQotCi0vKiBkZXNjcmliZSB0aGUgbWFjcm8uICovCi0KLXR5cGVkZWYgc3RydWN0IG1hY3JvX3N0cnVjdAotICB7Ci0gICAgc2Igc3ViOwkJCS8qIHN1YnN0aXR1dGlvbiB0ZXh0LiAqLwotICAgIGludCBmb3JtYWxfY291bnQ7CQkvKiBudW1iZXIgb2YgZm9ybWFsIGFyZ3MuICovCi0gICAgZm9ybWFsX2VudHJ5ICpmb3JtYWxzOwkvKiBwb2ludGVyIHRvIGxpc3Qgb2YgZm9ybWFsX3N0cnVjdHMgKi8KLSAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpmb3JtYWxfaGFzaDsgLyogaGFzaCB0YWJsZSBvZiBmb3JtYWxzLiAqLwotICB9Ci1tYWNyb19lbnRyeTsKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGludCBnZXRfdG9rZW4gUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldHN0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0X2FueV9zdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBkb19mb3JtYWxzIFBBUkFNUyAoKG1hY3JvX2VudHJ5ICosIGludCwgc2IgKikpOwotc3RhdGljIGludCBnZXRfYXBvc3RfdG9rZW4gUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgc3ViX2FjdHVhbAotICBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICptYWNyb19leHBhbmRfYm9keQotICBQQVJBTVMgKChzYiAqLCBzYiAqLCBmb3JtYWxfZW50cnkgKiwgc3RydWN0IGhhc2hfY29udHJvbCAqLCBpbnQsIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKm1hY3JvX2V4cGFuZCBQQVJBTVMgKChpbnQsIHNiICosIG1hY3JvX2VudHJ5ICosIHNiICosIGludCkpOwotCi0jZGVmaW5lIElTV0hJVEUoeCkgKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcpCi0KLSNkZWZpbmUgSVNTRVAoeCkgXAotICgoeCkgPT0gJyAnIHx8ICh4KSA9PSAnXHQnIHx8ICh4KSA9PSAnLCcgfHwgKHgpID09ICciJyB8fCAoeCkgPT0gJzsnIFwKLSAgfHwgKHgpID09ICcpJyB8fCAoeCkgPT0gJygnIFwKLSAgfHwgKChtYWNyb19hbHRlcm5hdGUgfHwgbWFjcm9fbXJpKSAmJiAoKHgpID09ICc8JyB8fCAoeCkgPT0gJz4nKSkpCi0KLSNkZWZpbmUgSVNCQVNFKHgpIFwKLSAgKCh4KSA9PSAnYicgfHwgKHgpID09ICdCJyBcCi0gICB8fCAoeCkgPT0gJ3EnIHx8ICh4KSA9PSAnUScgXAotICAgfHwgKHgpID09ICdoJyB8fCAoeCkgPT0gJ0gnIFwKLSAgIHx8ICh4KSA9PSAnZCcgfHwgKHgpID09ICdEJykKLQotLyogVGhlIG1hY3JvIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbWFjcm9faGFzaDsKLQotLyogV2hldGhlciBhbnkgbWFjcm9zIGhhdmUgYmVlbiBkZWZpbmVkLiAgKi8KLQotaW50IG1hY3JvX2RlZmluZWQ7Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIGluIEdBU1AgYWx0ZXJuYXRlIG1vZGUuICAqLwotCi1zdGF0aWMgaW50IG1hY3JvX2FsdGVybmF0ZTsKLQotLyogV2hldGhlciB3ZSBhcmUgaW4gTVJJIG1vZGUuICAqLwotCi1zdGF0aWMgaW50IG1hY3JvX21yaTsKLQotLyogV2hldGhlciB3ZSBzaG91bGQgc3RyaXAgJ0AnIGNoYXJhY3RlcnMuICAqLwotCi1zdGF0aWMgaW50IG1hY3JvX3N0cmlwX2F0OwotCi0vKiBGdW5jdGlvbiB0byB1c2UgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyBpbnQgKCptYWNyb19leHByKSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLQotLyogTnVtYmVyIG9mIG1hY3JvIGV4cGFuc2lvbnMgdGhhdCBoYXZlIGJlZW4gZG9uZS4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fbnVtYmVyOwotCi0vKiBJbml0aWFsaXplIG1hY3JvIHByb2Nlc3NpbmcuICAqLwotCi12b2lkCi1tYWNyb19pbml0IChhbHRlcm5hdGUsIG1yaSwgc3RyaXBfYXQsIGV4cHIpCi0gICAgIGludCBhbHRlcm5hdGU7Ci0gICAgIGludCBtcmk7Ci0gICAgIGludCBzdHJpcF9hdDsKLSAgICAgaW50ICgqZXhwcikgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHNiICosIGludCAqKSk7Ci17Ci0gIG1hY3JvX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgbWFjcm9fZGVmaW5lZCA9IDA7Ci0gIG1hY3JvX2FsdGVybmF0ZSA9IGFsdGVybmF0ZTsKLSAgbWFjcm9fbXJpID0gbXJpOwotICBtYWNyb19zdHJpcF9hdCA9IHN0cmlwX2F0OwotICBtYWNyb19leHByID0gZXhwcjsKLX0KLQotLyogU3dpdGNoIGluIGFuZCBvdXQgb2YgTVJJIG1vZGUgb24gdGhlIGZseS4gICovCi0KLXZvaWQKLW1hY3JvX21yaV9tb2RlIChtcmkpCi0gICAgIGludCBtcmk7Ci17Ci0gIG1hY3JvX21yaSA9IG1yaTsKLX0KLQotLyogUmVhZCBpbnB1dCBsaW5lcyB0aWxsIHdlIGdldCB0byBhIFRPIHN0cmluZy4KLSAgIEluY3JlYXNlIG5lc3RpbmcgZGVwdGggaWYgd2UgZ2V0IGEgRlJPTSBzdHJpbmcuCi0gICBQdXQgdGhlIHJlc3VsdHMgaW50byBzYiBhdCBQVFIuCi0gICBBZGQgYSBuZXcgaW5wdXQgbGluZSB0byBhbiBzYiB1c2luZyBHRVRfTElORS4KLSAgIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gdW5leHBlY3RlZCBFT0YuICAqLwotCi1pbnQKLWJ1ZmZlcl9hbmRfbmVzdCAoZnJvbSwgdG8sIHB0ciwgZ2V0X2xpbmUpCi0gICAgIGNvbnN0IGNoYXIgKmZyb207Ci0gICAgIGNvbnN0IGNoYXIgKnRvOwotICAgICBzYiAqcHRyOwotICAgICBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpOwotewotICBpbnQgZnJvbV9sZW4gPSBzdHJsZW4gKGZyb20pOwotICBpbnQgdG9fbGVuID0gc3RybGVuICh0byk7Ci0gIGludCBkZXB0aCA9IDE7Ci0gIGludCBsaW5lX3N0YXJ0ID0gcHRyLT5sZW47Ci0KLSAgaW50IG1vcmUgPSBnZXRfbGluZSAocHRyKTsKLQotICB3aGlsZSAobW9yZSkKLSAgICB7Ci0gICAgICAvKiBUcnkgYW5kIGZpbmQgdGhlIGZpcnN0IHBzZXVkbyBvcCBvbiB0aGUgbGluZSAqLwotICAgICAgaW50IGkgPSBsaW5lX3N0YXJ0OwotCi0gICAgICBpZiAoISBtYWNyb19hbHRlcm5hdGUgJiYgISBtYWNyb19tcmkpCi0JewotCSAgLyogV2l0aCBub3JtYWwgc3ludGF4IHdlIGNhbiBzdWNrIHdoYXQgd2Ugd2FudCB0aWxsIHdlIGdldAotCSAgICAgdG8gdGhlIGRvdC4gIFdpdGggdGhlIGFsdGVybmF0ZSwgbGFiZWxzIGhhdmUgdG8gc3RhcnQgaW4KLQkgICAgIHRoZSBmaXJzdCBjb2x1bW4sIHNpbmNlIHdlIGNhbnQgdGVsbCB3aGF0J3MgYSBsYWJlbCBhbmQKLQkgICAgIHdoYXRzIGEgcHNldWRvb3AgKi8KLQotCSAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLQkgIHdoaWxlIChpIDwgcHRyLT5sZW4gJiYgSVNXSElURSAocHRyLT5wdHJbaV0pKQotCSAgICBpKys7Ci0KLQkgIC8qIFNraXAgb3ZlciBhIGxhYmVsICovCi0JICB3aGlsZSAoaSA8IHB0ci0+bGVuCi0JCSAmJiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHB0ci0+cHRyW2ldKQotCQkgICAgIHx8IHB0ci0+cHRyW2ldID09ICdfJwotCQkgICAgIHx8IHB0ci0+cHRyW2ldID09ICckJykpCi0JICAgIGkrKzsKLQotCSAgLyogQW5kIGEgY29sb24gKi8KLQkgIGlmIChpIDwgcHRyLT5sZW4KLQkgICAgICAmJiBwdHItPnB0cltpXSA9PSAnOicpCi0JICAgIGkrKzsKLQotCX0KLSAgICAgIC8qIFNraXAgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotICAgICAgd2hpbGUgKGkgPCBwdHItPmxlbiAmJiBJU1dISVRFIChwdHItPnB0cltpXSkpCi0JaSsrOwotCi0gICAgICBpZiAoaSA8IHB0ci0+bGVuICYmIChwdHItPnB0cltpXSA9PSAnLicKLQkJCSAgIHx8IG1hY3JvX2FsdGVybmF0ZQotCQkJICAgfHwgbWFjcm9fbXJpKSkKLQl7Ci0JICBpZiAocHRyLT5wdHJbaV0gPT0gJy4nKQotCSAgICAgIGkrKzsKLQkgIGlmIChzdHJuY2FzZWNtcCAocHRyLT5wdHIgKyBpLCBmcm9tLCBmcm9tX2xlbikgPT0gMCkKLQkgICAgZGVwdGgrKzsKLQkgIGlmIChzdHJuY2FzZWNtcCAocHRyLT5wdHIgKyBpLCB0bywgdG9fbGVuKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZGVwdGgtLTsKLQkgICAgICBpZiAoZGVwdGggPT0gMCkKLQkJewotCQkgIC8qIFJlc2V0IHRoZSBzdHJpbmcgdG8gbm90IGluY2x1ZGUgdGhlIGVuZGluZyBydW5lICovCi0JCSAgcHRyLT5sZW4gPSBsaW5lX3N0YXJ0OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFkZCBhIENSIHRvIHRoZSBlbmQgYW5kIGtlZXAgcnVubmluZyAqLwotICAgICAgc2JfYWRkX2NoYXIgKHB0ciwgJ1xuJyk7Ci0gICAgICBsaW5lX3N0YXJ0ID0gcHRyLT5sZW47Ci0gICAgICBtb3JlID0gZ2V0X2xpbmUgKHB0cik7Ci0gICAgfQotCi0gIC8qIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gdW5leHBlY3RlZCBFT0YuICAqLwotICByZXR1cm4gZGVwdGggPT0gMDsKLX0KLQotLyogUGljayB1cCBhIHRva2VuLiAgKi8KLQotc3RhdGljIGludAotZ2V0X3Rva2VuIChpZHgsIGluLCBuYW1lKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpuYW1lOwotewotICBpZiAoaWR4IDwgaW4tPmxlbgotICAgICAgJiYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pCi0JICB8fCBpbi0+cHRyW2lkeF0gPT0gJ18nCi0JICB8fCBpbi0+cHRyW2lkeF0gPT0gJyQnKSkKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAobmFtZSwgaW4tPnB0cltpZHgrK10pOwotICAgICAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkgICAgICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHhdKQotCQkgfHwgaW4tPnB0cltpZHhdID09ICdfJwotCQkgfHwgaW4tPnB0cltpZHhdID09ICckJykpCi0JewotCSAgc2JfYWRkX2NoYXIgKG5hbWUsIGluLT5wdHJbaWR4KytdKTsKLQl9Ci0gICAgfQotICAvKiBJZ25vcmUgdHJhaWxpbmcgJiAqLwotICBpZiAobWFjcm9fYWx0ZXJuYXRlICYmIGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICcmJykKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogUGljayB1cCBhIHN0cmluZy4gICovCi0KLXN0YXRpYyBpbnQKLWdldHN0cmluZyAoaWR4LCBpbiwgYWNjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICphY2M7Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JICYmIChpbi0+cHRyW2lkeF0gPT0gJyInIAotCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnPCcgJiYgKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpKQotCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnXCcnICYmIG1hY3JvX2FsdGVybmF0ZSkpKQotICAgIHsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCXsKLQkgIGludCBuZXN0ID0gMDsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKChpbi0+cHRyW2lkeF0gIT0gJz4nIHx8IG5lc3QpCi0JCSAmJiBpZHggPCBpbi0+bGVuKQotCSAgICB7Ci0JICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIScpCi0JCXsKLQkJICBpZHgrKyAgOwotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJz4nKQotCQkgICAgbmVzdC0tOwotCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCQkgICAgbmVzdCsrOwotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJfQotCSAgICB9Ci0JICBpZHgrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnKQotCXsKLQkgIGNoYXIgdGNoYXIgPSBpbi0+cHRyW2lkeF07Ci0JICBpZHgrKzsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuKQotCSAgICB7Ci0JICAgICAgaWYgKG1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW2lkeF0gPT0gJyEnKQotCQl7Ci0JCSAgaWR4KysgIDsKLQkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09IHRjaGFyKQotCQkgICAgewotCQkgICAgICBpZHgrKzsKLQkJICAgICAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4XSk7Ci0JCSAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gaWR4OwotfQotCi0vKiBGZXRjaCBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAotICAgcnVsZXM6Ci0gICAgJ0J4eXg8d2hpdGVzcGFjZT4gIAktPiByZXR1cm4gJ0J4eXphCi0gICAgJTxjaGFyPgkJLT4gcmV0dXJuIHN0cmluZyBvZiBkZWNpbWFsIHZhbHVlIG9mIHgKLSAgICAiPHN0cmluZz4iCQktPiByZXR1cm4gc3RyaW5nCi0gICAgeHl4PHdoaXRlc3BhY2U+ICAgICAtPiByZXR1cm4geHl6Ci0qLwotCi1zdGF0aWMgaW50Ci1nZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgb3V0LCBleHBhbmQsIHByZXRlbmRfcXVvdGVkKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCBleHBhbmQ7Ci0gICAgIGludCBwcmV0ZW5kX3F1b3RlZDsKLXsKLSAgc2JfcmVzZXQgKG91dCk7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIGlmIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGlmIChpbi0+bGVuID4gMiAmJiBpbi0+cHRyW2lkeCsxXSA9PSAnXCcnICYmIElTQkFTRSAoaW4tPnB0cltpZHhdKSkKLQl7Ci0JICB3aGlsZSAoIUlTU0VQIChpbi0+cHRyW2lkeF0pKQotCSAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICclJwotCSAgICAgICAmJiBtYWNyb19hbHRlcm5hdGUKLQkgICAgICAgJiYgZXhwYW5kKQotCXsKLQkgIGludCB2YWw7Ci0JICBjaGFyIGJ1ZlsyMF07Ci0JICAvKiBUdXJucyB0aGUgbmV4dCBleHByZXNzaW9uIGludG8gYSBzdHJpbmcgKi8KLQkgIGlkeCA9ICgqbWFjcm9fZXhwcikgKF8oIiUgb3BlcmF0b3IgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiIpLAotCQkJICAgICAgIGlkeCArIDEsCi0JCQkgICAgICAgaW4sCi0JCQkgICAgICAgJnZhbCk7Ci0JICBzcHJpbnRmKGJ1ZiwgIiVkIiwgdmFsKTsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInCi0JICAgICAgIHx8IChpbi0+cHRyW2lkeF0gPT0gJzwnICYmIChtYWNyb19hbHRlcm5hdGUgfHwgbWFjcm9fbXJpKSkKLQkgICAgICAgfHwgKG1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW2lkeF0gPT0gJ1wnJykpCi0JewotCSAgaWYgKG1hY3JvX2FsdGVybmF0ZQotCSAgICAgICYmICEgbWFjcm9fc3RyaXBfYXQKLQkgICAgICAmJiBleHBhbmQpCi0JICAgIHsKLQkgICAgICAvKiBLZWVwIHRoZSBxdW90ZXMgKi8KLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAgJ1wiJyk7Ci0KLQkgICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuIAotCQkgJiYgKGluLT5wdHJbaWR4XSA9PSAnIicKLQkJICAgICB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJwotCQkgICAgIHx8IHByZXRlbmRfcXVvdGVkIAotCQkgICAgIHx8IChpbi0+cHRyW2lkeF0gIT0gJyAnCi0JCQkgJiYgaW4tPnB0cltpZHhdICE9ICdcdCcKLQkJCSAmJiBpbi0+cHRyW2lkeF0gIT0gJywnCi0JCQkgJiYgKGluLT5wdHJbaWR4XSAhPSAnPCcKLQkJCSAgICAgfHwgKCEgbWFjcm9fYWx0ZXJuYXRlICYmICEgbWFjcm9fbXJpKSkpKSkKLQkgICAgewotCSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInIAotCQkgIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnKQotCQl7Ci0JCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkJCSAmJiBpbi0+cHRyW2lkeF0gIT0gdGNoYXIpCi0JCSAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7CQkgICAgCi0JCSAgaWYgKGlkeCA9PSBpbi0+bGVuKQotCQkgICAgcmV0dXJuIGlkeDsJICAgICAgCi0JCX0KLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIFBpY2sgdXAgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLWRvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKQotICAgICBtYWNyb19lbnRyeSAqbWFjcm87Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgZm9ybWFsX2VudHJ5ICoqcCA9ICZtYWNyby0+Zm9ybWFsczsKLQotICBtYWNyby0+Zm9ybWFsX2NvdW50ID0gMDsKLSAgbWFjcm8tPmZvcm1hbF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsOwotCi0gICAgICBmb3JtYWwgPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0KLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+bmFtZSk7Ci0gICAgICBzYl9uZXcgKCZmb3JtYWwtPmRlZik7Ci0gICAgICBzYl9uZXcgKCZmb3JtYWwtPmFjdHVhbCk7Ci0KLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgICAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmZm9ybWFsLT5uYW1lKTsKLSAgICAgIGlmIChmb3JtYWwtPm5hbWUubGVuID09IDApCi0JYnJlYWs7Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIGlmIChmb3JtYWwtPm5hbWUubGVuKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBmb3JtYWwgKi8KLQkgIGlmIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnPScpCi0JICAgIHsKLQkgICAgICAvKiBHb3QgYSBkZWZhdWx0ICovCi0JICAgICAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCArIDEsIGluLCAmZm9ybWFsLT5kZWYsIDEsIDApOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBZGQgdG8gbWFjcm8ncyBoYXNoIHRhYmxlICovCi0gICAgICBoYXNoX2phbSAobWFjcm8tPmZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZmb3JtYWwtPm5hbWUpLCBmb3JtYWwpOwotCi0gICAgICBmb3JtYWwtPmluZGV4ID0gbWFjcm8tPmZvcm1hbF9jb3VudDsKLSAgICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICAgICAgbWFjcm8tPmZvcm1hbF9jb3VudCsrOwotICAgICAgKnAgPSBmb3JtYWw7Ci0gICAgICBwID0gJmZvcm1hbC0+bmV4dDsKLSAgICAgICpwID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG1hY3JvX21yaSkKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKmZvcm1hbDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIEFkZCBhIHNwZWNpYWwgTkFSRyBmb3JtYWwsIHdoaWNoIG1hY3JvX2V4cGFuZCB3aWxsIHNldCB0byB0aGUKLSAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICAgICAgZm9ybWFsID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCi0gICAgICBzYl9uZXcgKCZmb3JtYWwtPm5hbWUpOwotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5kZWYpOwotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5hY3R1YWwpOwotCi0gICAgICAvKiBUaGUgc2FtZSBNUkkgYXNzZW1ibGVycyB3aGljaCB0cmVhdCAnQCcgY2hhcmFjdGVycyBhbHNvIHVzZQotICAgICAgICAgdGhlIG5hbWUgJE5BUkcuICBBdCBsZWFzdCB1bnRpbCB3ZSBmaW5kIGFuIGV4Y2VwdGlvbi4gICovCi0gICAgICBpZiAobWFjcm9fc3RyaXBfYXQpCi0JbmFtZSA9ICIkTkFSRyI7Ci0gICAgICBlbHNlCi0JbmFtZSA9ICJOQVJHIjsKLQotICAgICAgc2JfYWRkX3N0cmluZyAoJmZvcm1hbC0+bmFtZSwgbmFtZSk7Ci0KLSAgICAgIC8qIEFkZCB0byBtYWNybydzIGhhc2ggdGFibGUgKi8KLSAgICAgIGhhc2hfamFtIChtYWNyby0+Zm9ybWFsX2hhc2gsIG5hbWUsIGZvcm1hbCk7Ci0KLSAgICAgIGZvcm1hbC0+aW5kZXggPSBOQVJHX0lOREVYOwotICAgICAgKnAgPSBmb3JtYWw7Ci0gICAgICBmb3JtYWwtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBEZWZpbmUgYSBuZXcgbWFjcm8uICBSZXR1cm5zIE5VTEwgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIHJldHVybnMgYW4KLSAgIGVycm9yIG1lc3NhZ2UuICBJZiBOQU1FUCBpcyBub3QgTlVMTCwgKk5BTUVQIGlzIHNldCB0byB0aGUgbmFtZSBvZgotICAgdGhlIG1hY3JvIHdoaWNoIHdhcyBkZWZpbmVkLiAgKi8KLQotY29uc3QgY2hhciAqCi1kZWZpbmVfbWFjcm8gKGlkeCwgaW4sIGxhYmVsLCBnZXRfbGluZSwgbmFtZXApCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKmxhYmVsOwotICAgICBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci17Ci0gIG1hY3JvX2VudHJ5ICptYWNybzsKLSAgc2IgbmFtZTsKLSAgY29uc3QgY2hhciAqbmFtZXN0cjsKLQotICBtYWNybyA9IChtYWNyb19lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKG1hY3JvX2VudHJ5KSk7Ci0gIHNiX25ldyAoJm1hY3JvLT5zdWIpOwotICBzYl9uZXcgKCZuYW1lKTsKLQotICBtYWNyby0+Zm9ybWFsX2NvdW50ID0gMDsKLSAgbWFjcm8tPmZvcm1hbHMgPSAwOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBpZiAoISBidWZmZXJfYW5kX25lc3QgKCJNQUNSTyIsICJFTkRNIiwgJm1hY3JvLT5zdWIsIGdldF9saW5lKSkKLSAgICByZXR1cm4gXygidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBtYWNybyBkZWZpbml0aW9uIik7Ci0gIGlmIChsYWJlbCAhPSBOVUxMICYmIGxhYmVsLT5sZW4gIT0gMCkKLSAgICB7Ci0gICAgICBzYl9hZGRfc2IgKCZuYW1lLCBsYWJlbCk7Ci0gICAgICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJygnKQotCXsKLQkgIC8qIEl0J3MgdGhlIGxhYmVsOiBNQUNSTyAoZm9ybWFscywuLi4pICBzb3J0ICovCi0JICBpZHggPSBkb19mb3JtYWxzIChtYWNybywgaWR4ICsgMSwgaW4pOwotCSAgaWYgKGluLT5wdHJbaWR4XSAhPSAnKScpCi0JICAgIHJldHVybiBfKCJtaXNzaW5nICkgYWZ0ZXIgZm9ybWFscyIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJdCdzIHRoZSBsYWJlbDogTUFDUk8gZm9ybWFscywuLi4gIHNvcnQgKi8KLQkgIGlkeCA9IGRvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmbmFtZSk7Ci0gICAgICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgICAgIGlkeCA9IGRvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKTsKLSAgICB9Ci0KLSAgLyogYW5kIHN0aWNrIGl0IGluIHRoZSBtYWNybyBoYXNoIHRhYmxlICovCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgbmFtZS5sZW47IGlkeCsrKQotICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgbmFtZS5wdHJbaWR4XSkpCi0gICAgICBuYW1lLnB0cltpZHhdID0gdG9sb3dlciAobmFtZS5wdHJbaWR4XSk7Ci0gIG5hbWVzdHIgPSBzYl90ZXJtaW5hdGUgKCZuYW1lKTsKLSAgaGFzaF9qYW0gKG1hY3JvX2hhc2gsIG5hbWVzdHIsIChQVFIpIG1hY3JvKTsKLQotICBtYWNyb19kZWZpbmVkID0gMTsKLQotICBpZiAobmFtZXAgIT0gTlVMTCkKLSAgICAqbmFtZXAgPSBuYW1lc3RyOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTY2FuIGEgdG9rZW4sIGFuZCB0aGVuIHNraXAgS0lORC4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9hcG9zdF90b2tlbiAoaWR4LCBpbiwgbmFtZSwga2luZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqbmFtZTsKLSAgICAgaW50IGtpbmQ7Ci17Ci0gIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgbmFtZSk7Ci0gIGlmIChpZHggPCBpbi0+bGVuCi0gICAgICAmJiBpbi0+cHRyW2lkeF0gPT0ga2luZAotICAgICAgJiYgKCEgbWFjcm9fbXJpIHx8IG1hY3JvX3N0cmlwX2F0KQotICAgICAgJiYgKCEgbWFjcm9fc3RyaXBfYXQgfHwga2luZCA9PSAnQCcpKQotICAgIGlkeCsrOwotICByZXR1cm4gaWR4OwotfQotCi0vKiBTdWJzdGl0dXRlIHRoZSBhY3R1YWwgdmFsdWUgZm9yIGEgZm9ybWFsIHBhcmFtZXRlci4gICovCi0KLXN0YXRpYyBpbnQKLXN1Yl9hY3R1YWwgKHN0YXJ0LCBpbiwgdCwgZm9ybWFsX2hhc2gsIGtpbmQsIG91dCwgY29weWlmbm90dGhlcmUpCi0gICAgIGludCBzdGFydDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqdDsKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqZm9ybWFsX2hhc2g7Ci0gICAgIGludCBraW5kOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgY29weWlmbm90dGhlcmU7Ci17Ci0gIGludCBzcmM7Ci0gIGZvcm1hbF9lbnRyeSAqcHRyOwotCi0gIHNyYyA9IGdldF9hcG9zdF90b2tlbiAoc3RhcnQsIGluLCB0LCBraW5kKTsKLSAgLyogU2VlIGlmIGl0J3MgaW4gdGhlIG1hY3JvJ3MgaGFzaCB0YWJsZSwgdW5sZXNzIHRoaXMgaXMKLSAgICAgbWFjcm9fc3RyaXBfYXQgYW5kIGtpbmQgaXMgJ0AnIGFuZCB0aGUgdG9rZW4gZGlkIG5vdCBlbmQgaW4gJ0AnLiAgKi8KLSAgaWYgKG1hY3JvX3N0cmlwX2F0Ci0gICAgICAmJiBraW5kID09ICdAJwotICAgICAgJiYgKHNyYyA9PSBzdGFydCB8fCBpbi0+cHRyW3NyYyAtIDFdICE9ICdAJykpCi0gICAgcHRyID0gTlVMTDsKLSAgZWxzZQotICAgIHB0ciA9IChmb3JtYWxfZW50cnkgKikgaGFzaF9maW5kIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICh0KSk7Ci0gIGlmIChwdHIpCi0gICAgewotICAgICAgaWYgKHB0ci0+YWN0dWFsLmxlbikKLQl7Ci0JICBzYl9hZGRfc2IgKG91dCwgJnB0ci0+YWN0dWFsKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2JfYWRkX3NiIChvdXQsICZwdHItPmRlZik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoa2luZCA9PSAnJicpCi0gICAgewotICAgICAgLyogRG9pbmcgdGhpcyBwZXJtaXRzIHBlb3BsZSB0byB1c2UgJiBpbiBtYWNybyBib2RpZXMuICAqLwotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyYnKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGNvcHlpZm5vdHRoZXJlKQotICAgIHsKLSAgICAgIHNiX2FkZF9zYiAob3V0LCB0KTsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJ1xcJyk7Ci0gICAgICBzYl9hZGRfc2IgKG91dCwgdCk7Ci0gICAgfQotICByZXR1cm4gc3JjOwotfQotCi0vKiBFeHBhbmQgdGhlIGJvZHkgb2YgYSBtYWNyby4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1hY3JvX2V4cGFuZF9ib2R5IChpbiwgb3V0LCBmb3JtYWxzLCBmb3JtYWxfaGFzaCwgY29tbWVudF9jaGFyLCBsb2NhbHMpCi0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLSAgICAgZm9ybWFsX2VudHJ5ICpmb3JtYWxzOwotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpmb3JtYWxfaGFzaDsKLSAgICAgaW50IGNvbW1lbnRfY2hhcjsKLSAgICAgaW50IGxvY2FsczsKLXsKLSAgc2IgdDsKLSAgaW50IHNyYyA9IDA7Ci0gIGludCBpbnF1b3RlID0gMDsKLSAgZm9ybWFsX2VudHJ5ICpsb2NsaXN0ID0gTlVMTDsKLQotICBzYl9uZXcgKCZ0KTsKLQotICB3aGlsZSAoc3JjIDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPnB0cltzcmNdID09ICcmJykKLQl7Ci0JICBzYl9yZXNldCAoJnQpOwotCSAgaWYgKG1hY3JvX21yaSkKLQkgICAgewotCSAgICAgIGlmIChzcmMgKyAxIDwgaW4tPmxlbiAmJiBpbi0+cHRyW3NyYyArIDFdID09ICcmJykKLQkJc3JjID0gc3ViX2FjdHVhbCAoc3JjICsgMiwgaW4sICZ0LCBmb3JtYWxfaGFzaCwgJ1wnJywgb3V0LCAxKTsKLQkgICAgICBlbHNlCi0JCXNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdoeSBkbyB3ZSBkbyB0aGlzPyAgKi8KLQkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMgKyAxLCBpbiwgJnQsIGZvcm1hbF9oYXNoLCAnJicsIG91dCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJ1xcJykKLQl7Ci0JICBzcmMrKzsKLQkgIGlmIChpbi0+cHRyW3NyY10gPT0gY29tbWVudF9jaGFyICYmIGNvbW1lbnRfY2hhciAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGNvbW1lbnQsIGp1c3QgZHJvcCB0aGUgcmVzdCBvZiB0aGUgbGluZSAqLwotCSAgICAgIHdoaWxlIChzcmMgPCBpbi0+bGVuCi0JCSAgICAgJiYgaW4tPnB0cltzcmNdICE9ICdcbicpCi0JCXNyYysrOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJygnKQotCSAgICB7Ci0JICAgICAgLyogU3ViIGluIHRpbGwgdGhlIG5leHQgJyknIGxpdGVyYWxseSAqLwotCSAgICAgIHNyYysrOwotCSAgICAgIHdoaWxlIChzcmMgPCBpbi0+bGVuICYmIGluLT5wdHJbc3JjXSAhPSAnKScpCi0JCXsKLQkJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW3NyYysrXSk7Ci0JCX0KLQkgICAgICBpZiAoaW4tPnB0cltzcmNdID09ICcpJykKLQkJc3JjKys7Ci0JICAgICAgZWxzZQotCQlyZXR1cm4gXygibWlzc3BsYWNlZCApIik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnQCcpCi0JICAgIHsKLQkgICAgICAvKiBTdWIgaW4gdGhlIG1hY3JvIGludm9jYXRpb24gbnVtYmVyICovCi0KLQkgICAgICBjaGFyIGJ1ZmZlclsxMF07Ci0JICAgICAgc3JjKys7Ci0JICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJTA1ZCIsIG1hY3JvX251bWJlcik7Ci0JICAgICAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJyYnKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHByZXByb2Nlc3NvciB2YXJpYWJsZSBuYW1lLCB3ZSBkb24ndCBkbyB0aGVtCi0JCSBoZXJlICovCi0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJ1xcJyk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyYnKTsKLQkgICAgICBzcmMrKzsKLQkgICAgfQotCSAgZWxzZSBpZiAobWFjcm9fbXJpCi0JCSAgICYmIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pKQotCSAgICB7Ci0JICAgICAgaW50IGluZDsKLQkgICAgICBmb3JtYWxfZW50cnkgKmY7Ci0KLQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbc3JjXSkpCi0JCWluZCA9IGluLT5wdHJbc3JjXSAtICcwJzsKLQkgICAgICBlbHNlIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltzcmNdKSkKLQkJaW5kID0gaW4tPnB0cltzcmNdIC0gJ0EnICsgMTA7Ci0JICAgICAgZWxzZQotCQlpbmQgPSBpbi0+cHRyW3NyY10gLSAnYScgKyAxMDsKLQkgICAgICArK3NyYzsKLQkgICAgICBmb3IgKGYgPSBmb3JtYWxzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCQl7Ci0JCSAgaWYgKGYtPmluZGV4ID09IGluZCAtIDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChmLT5hY3R1YWwubGVuICE9IDApCi0JCQlzYl9hZGRfc2IgKG91dCwgJmYtPmFjdHVhbCk7Ci0JCSAgICAgIGVsc2UKLQkJCXNiX2FkZF9zYiAob3V0LCAmZi0+ZGVmKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2JfcmVzZXQgKCZ0KTsKLQkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMsIGluLCAmdCwgZm9ybWFsX2hhc2gsICdcJycsIG91dCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgobWFjcm9fYWx0ZXJuYXRlIHx8IG1hY3JvX21yaSkKLQkgICAgICAgJiYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pCi0JCSAgIHx8IGluLT5wdHJbc3JjXSA9PSAnXycKLQkJICAgfHwgaW4tPnB0cltzcmNdID09ICckJykKLQkgICAgICAgJiYgKCEgaW5xdW90ZQotCQkgICB8fCAhIG1hY3JvX3N0cmlwX2F0Ci0JCSAgIHx8IChzcmMgPiAwICYmIGluLT5wdHJbc3JjIC0gMV0gPT0gJ0AnKSkpCi0JewotCSAgaWYgKCEgbG9jYWxzCi0JICAgICAgfHwgc3JjICsgNSA+PSBpbi0+bGVuCi0JICAgICAgfHwgc3RybmNhc2VjbXAgKGluLT5wdHIgKyBzcmMsICJMT0NBTCIsIDUpICE9IDAKLQkgICAgICB8fCAhIElTV0hJVEUgKGluLT5wdHJbc3JjICsgNV0pKQotCSAgICB7Ci0JICAgICAgc2JfcmVzZXQgKCZ0KTsKLQkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMsIGluLCAmdCwgZm9ybWFsX2hhc2gsCi0JCQkJKG1hY3JvX3N0cmlwX2F0ICYmIGlucXVvdGUpID8gJ0AnIDogJ1wnJywKLQkJCQlvdXQsIDEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmb3JtYWxfZW50cnkgKmY7Ci0KLQkgICAgICBzcmMgPSBzYl9za2lwX3doaXRlIChzcmMgKyA1LCBpbik7Ci0JICAgICAgd2hpbGUgKGluLT5wdHJbc3JjXSAhPSAnXG4nICYmIGluLT5wdHJbc3JjXSAhPSBjb21tZW50X2NoYXIpCi0JCXsKLQkJICBzdGF0aWMgaW50IGxvY2NudDsKLQkJICBjaGFyIGJ1ZlsyMF07Ci0JCSAgY29uc3QgY2hhciAqZXJyOwotCi0JCSAgZiA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQkJICBzYl9uZXcgKCZmLT5uYW1lKTsKLQkJICBzYl9uZXcgKCZmLT5kZWYpOwotCQkgIHNiX25ldyAoJmYtPmFjdHVhbCk7Ci0JCSAgZi0+aW5kZXggPSBMT0NBTF9JTkRFWDsKLQkJICBmLT5uZXh0ID0gbG9jbGlzdDsKLQkJICBsb2NsaXN0ID0gZjsKLQotCQkgIHNyYyA9IGdldF90b2tlbiAoc3JjLCBpbiwgJmYtPm5hbWUpOwotCQkgICsrbG9jY250OwotCQkgIHNwcmludGYgKGJ1ZiwgIkxMJTA0eCIsIGxvY2NudCk7Ci0JCSAgc2JfYWRkX3N0cmluZyAoJmYtPmFjdHVhbCwgYnVmKTsKLQotCQkgIGVyciA9IGhhc2hfamFtIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmZi0+bmFtZSksIGYpOwotCQkgIGlmIChlcnIgIT0gTlVMTCkKLQkJICAgIHJldHVybiBlcnI7Ci0KLQkJICBzcmMgPSBzYl9za2lwX2NvbW1hIChzcmMsIGluKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoY29tbWVudF9jaGFyICE9ICdcMCcKLQkgICAgICAgJiYgaW4tPnB0cltzcmNdID09IGNvbW1lbnRfY2hhcgotCSAgICAgICAmJiBzcmMgKyAxIDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW3NyYyArIDFdID09IGNvbW1lbnRfY2hhcgotCSAgICAgICAmJiAhaW5xdW90ZSkKLQl7Ci0JICAvKiBUd28gY29tbWVudCBjaGFycyBpbiBhIHJvdyBjYXVzZSB0aGUgcmVzdCBvZiB0aGUgbGluZSB0bwotICAgICAgICAgICAgIGJlIGRyb3BwZWQuICAqLwotCSAgd2hpbGUgKHNyYyA8IGluLT5sZW4gJiYgaW4tPnB0cltzcmNdICE9ICdcbicpCi0JICAgIHNyYysrOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnIicKLQkgICAgICAgfHwgKG1hY3JvX21yaSAmJiBpbi0+cHRyW3NyY10gPT0gJ1wnJykpCi0JewotCSAgaW5xdW90ZSA9ICFpbnF1b3RlOwotCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltzcmMrK10pOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnQCcgJiYgbWFjcm9fc3RyaXBfYXQpCi0JewotCSAgKytzcmM7Ci0JICBpZiAoc3JjIDwgaW4tPmxlbgotCSAgICAgICYmIGluLT5wdHJbc3JjXSA9PSAnQCcpCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnQCcpOwotCSAgICAgICsrc3JjOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWFjcm9fbXJpCi0JICAgICAgICYmIGluLT5wdHJbc3JjXSA9PSAnPScKLQkgICAgICAgJiYgc3JjICsgMSA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltzcmMgKyAxXSA9PSAnPScpCi0JewotCSAgZm9ybWFsX2VudHJ5ICpwdHI7Ci0KLQkgIHNiX3Jlc2V0ICgmdCk7Ci0JICBzcmMgPSBnZXRfdG9rZW4gKHNyYyArIDIsIGluLCAmdCk7Ci0JICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJnQpKTsKLQkgIGlmIChwdHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IHJldHVybiBhIHdhcm5pbmcgc3RyaW5nIGhlcmUsCi0gICAgICAgICAgICAgICAgIGJ1dCB3ZSBjYW4ndCwgYmVjYXVzZSB0aGUgPT0gbWlnaHQgYmUgaW4gdGhlIE1SSQotICAgICAgICAgICAgICAgICBjb21tZW50IGZpZWxkLCBhbmQsIHNpbmNlIHRoZSBuYXR1cmUgb2YgdGhlIE1SSQotICAgICAgICAgICAgICAgICBjb21tZW50IGZpZWxkIGRlcGVuZHMgdXBvbiB0aGUgZXhhY3QgaW5zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgICAgYmVpbmcgdXNlZCwgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gaGVyZSB0bwotICAgICAgICAgICAgICAgICBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgaXMgb3Igbm90LiAgSW5zdGVhZCwgd2UgbGVhdmUKLSAgICAgICAgICAgICAgICAgdGhlID09IGluIHBsYWNlLCB3aGljaCBzaG91bGQgY2F1c2UgYSBzeW50YXggZXJyb3IgaWYKLSAgICAgICAgICAgICAgICAgaXQgaXMgbm90IGluIGEgY29tbWVudC4gICovCi0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJz0nKTsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnPScpOwotCSAgICAgIHNiX2FkZF9zYiAob3V0LCAmdCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwdHItPmFjdHVhbC5sZW4pCi0JCXsKLQkJICBzYl9hZGRfc3RyaW5nIChvdXQsICItMSIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2JfYWRkX2NoYXIgKG91dCwgJzAnKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKLQl9Ci0gICAgfQotCi0gIHNiX2tpbGwgKCZ0KTsKLQotICB3aGlsZSAobG9jbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvcm1hbF9lbnRyeSAqZjsKLQotICAgICAgZiA9IGxvY2xpc3QtPm5leHQ7Ci0gICAgICAvKiBTZXR0aW5nIHRoZSB2YWx1ZSB0byBOVUxMIGVmZmVjdGl2ZWx5IGRlbGV0ZXMgdGhlIGVudHJ5LiAgV2UKLSAgICAgICAgIGF2b2lkIGNhbGxpbmcgaGFzaF9kZWxldGUgYmVjYXVzZSBpdCBkb2Vzbid0IHJlY2xhaW0gbWVtb3J5LiAgKi8KLSAgICAgIGhhc2hfamFtIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmbG9jbGlzdC0+bmFtZSksIE5VTEwpOwotICAgICAgc2Jfa2lsbCAoJmxvY2xpc3QtPm5hbWUpOwotICAgICAgc2Jfa2lsbCAoJmxvY2xpc3QtPmRlZik7Ci0gICAgICBzYl9raWxsICgmbG9jbGlzdC0+YWN0dWFsKTsKLSAgICAgIGZyZWUgKGxvY2xpc3QpOwotICAgICAgbG9jbGlzdCA9IGY7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBBc3NpZ24gdmFsdWVzIHRvIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiBhIG1hY3JvLCBhbmQgZXhwYW5kIHRoZQotICAgYm9keS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1hY3JvX2V4cGFuZCAoaWR4LCBpbiwgbSwgb3V0LCBjb21tZW50X2NoYXIpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgbWFjcm9fZW50cnkgKm07Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci17Ci0gIHNiIHQ7Ci0gIGZvcm1hbF9lbnRyeSAqcHRyOwotICBmb3JtYWxfZW50cnkgKmY7Ci0gIGludCBpc19wb3NpdGlvbmFsID0gMDsKLSAgaW50IGlzX2tleXdvcmQgPSAwOwotICBpbnQgbmFyZyA9IDA7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLQotICBzYl9uZXcgKCZ0KTsKLSAgCi0gIC8qIFJlc2V0IGFueSBvbGQgdmFsdWUgdGhlIGFjdHVhbHMgbWF5IGhhdmUgKi8KLSAgZm9yIChmID0gbS0+Zm9ybWFsczsgZjsgZiA9IGYtPm5leHQpCi0gICAgICBzYl9yZXNldCAoJmYtPmFjdHVhbCk7Ci0gIGYgPSBtLT5mb3JtYWxzOwotICB3aGlsZSAoZiAhPSBOVUxMICYmIGYtPmluZGV4IDwgMCkKLSAgICBmID0gZi0+bmV4dDsKLQotICBpZiAobWFjcm9fbXJpKQotICAgIHsKLSAgICAgIC8qIFRoZSBtYWNybyBtYXkgYmUgY2FsbGVkIHdpdGggYW4gb3B0aW9uYWwgcXVhbGlmaWVyLCB3aGljaCBtYXkKLSAgICAgICAgIGJlIHJlZmVycmVkIHRvIGluIHRoZSBtYWNybyBib2R5IGFzIFwwLiAgKi8KLSAgICAgIGlmIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnLicpCi0JewotCSAgZm9ybWFsX2VudHJ5ICpuOwotCi0JICBuID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCSAgc2JfbmV3ICgmbi0+bmFtZSk7Ci0JICBzYl9uZXcgKCZuLT5kZWYpOwotCSAgc2JfbmV3ICgmbi0+YWN0dWFsKTsKLQkgIG4tPmluZGV4ID0gUVVBTF9JTkRFWDsKLQotCSAgbi0+bmV4dCA9IG0tPmZvcm1hbHM7Ci0JICBtLT5mb3JtYWxzID0gbjsKLQotCSAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCArIDEsIGluLCAmbi0+YWN0dWFsLCAxLCAwKTsKLQl9Ci0gICAgfQotCi0gIC8qIFBlZWwgb2ZmIHRoZSBhY3R1YWxzIGFuZCBzdG9yZSB0aGVtIGF3YXkgaW4gdGhlIGhhc2ggdGFibGVzJyBhY3R1YWxzICovCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gIT0gY29tbWVudF9jaGFyKQotICAgIHsKLSAgICAgIGludCBzY2FuOwotCi0gICAgICAvKiBMb29rIGFuZCBzZWUgaWYgaXQncyBhIHBvc2l0aW9uYWwgb3Iga2V5d29yZCBhcmcgKi8KLSAgICAgIHNjYW4gPSBpZHg7Ci0gICAgICB3aGlsZSAoc2NhbiA8IGluLT5sZW4KLQkgICAgICYmICFJU1NFUCAoaW4tPnB0cltzY2FuXSkKLQkgICAgICYmICEobWFjcm9fbXJpICYmIGluLT5wdHJbc2Nhbl0gPT0gJ1wnJykKLQkgICAgICYmICghbWFjcm9fYWx0ZXJuYXRlICYmIGluLT5wdHJbc2Nhbl0gIT0gJz0nKSkKLQlzY2FuKys7Ci0gICAgICBpZiAoc2NhbiA8IGluLT5sZW4gJiYgIW1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW3NjYW5dID09ICc9JykKLQl7Ci0JICBpc19rZXl3b3JkID0gMTsKLQotCSAgLyogSXQncyBPSyB0byBnbyBmcm9tIHBvc2l0aW9uYWwgdG8ga2V5d29yZC4gICovCi0KLQkgIC8qIFRoaXMgaXMgYSBrZXl3b3JkIGFyZywgZmV0Y2ggdGhlIGZvcm1hbCBuYW1lIGFuZAotCSAgICAgdGhlbiB0aGUgYWN0dWFsIHN0dWZmICovCi0JICBzYl9yZXNldCAoJnQpOwotCSAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmdCk7Ci0JICBpZiAoaW4tPnB0cltpZHhdICE9ICc9JykKLQkgICAgcmV0dXJuIF8oImNvbmZ1c2lvbiBpbiBmb3JtYWwgcGFyYW1ldGVycyIpOwotCi0JICAvKiBMb29rdXAgdGhlIGZvcm1hbCBpbiB0aGUgbWFjcm8ncyBsaXN0ICovCi0JICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAobS0+Zm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJnQpKTsKLQkgIGlmICghcHRyKQotCSAgICByZXR1cm4gXygibWFjcm8gZm9ybWFsIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0Iik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJbnNlcnQgdGhpcyB2YWx1ZSBpbnRvIHRoZSByaWdodCBwbGFjZSAqLwotCSAgICAgIHNiX3Jlc2V0ICgmcHRyLT5hY3R1YWwpOwotCSAgICAgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHggKyAxLCBpbiwgJnB0ci0+YWN0dWFsLCAwLCAwKTsKLQkgICAgICBpZiAocHRyLT5hY3R1YWwubGVuID4gMCkKLQkJKytuYXJnOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwb3NpdGlvbmFsIGFyZyAqLwotCSAgaXNfcG9zaXRpb25hbCA9IDE7Ci0JICBpZiAoaXNfa2V5d29yZCkKLQkgICAgcmV0dXJuIF8oImNhbid0IG1peCBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyIpOwotCi0JICBpZiAoIWYpCi0JICAgIHsKLQkgICAgICBmb3JtYWxfZW50cnkgKipwZjsKLQkgICAgICBpbnQgYzsKLQotCSAgICAgIGlmICghbWFjcm9fbXJpKQotCQlyZXR1cm4gXygidG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMiKTsKLQotCSAgICAgIGYgPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0JICAgICAgc2JfbmV3ICgmZi0+bmFtZSk7Ci0JICAgICAgc2JfbmV3ICgmZi0+ZGVmKTsKLQkgICAgICBzYl9uZXcgKCZmLT5hY3R1YWwpOwotCSAgICAgIGYtPm5leHQgPSBOVUxMOwotCi0JICAgICAgYyA9IC0xOwotCSAgICAgIGZvciAocGYgPSAmbS0+Zm9ybWFsczsgKnBmICE9IE5VTEw7IHBmID0gJigqcGYpLT5uZXh0KQotCQlpZiAoKCpwZiktPmluZGV4ID49IGMpCi0JCSAgYyA9ICgqcGYpLT5pbmRleCArIDE7Ci0JICAgICAgaWYgKGMgPT0gLTEpCi0JCWMgPSAwOwotCSAgICAgICpwZiA9IGY7Ci0JICAgICAgZi0+aW5kZXggPSBjOwotCSAgICB9Ci0KLQkgIHNiX3Jlc2V0ICgmZi0+YWN0dWFsKTsKLQkgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmZi0+YWN0dWFsLCAxLCAwKTsKLQkgIGlmIChmLT5hY3R1YWwubGVuID4gMCkKLQkgICAgKytuYXJnOwotCSAgZG8KLQkgICAgewotCSAgICAgIGYgPSBmLT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoZiAhPSBOVUxMICYmIGYtPmluZGV4IDwgMCk7Ci0JfQotCi0gICAgICBpZiAoISBtYWNyb19tcmkpCi0JaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGluLT5wdHJbaWR4XSA9PSAnLCcpCi0JICAgICsraWR4OwotCSAgaWYgKElTV0hJVEUgKGluLT5wdHJbaWR4XSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG1hY3JvX21yaSkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZmZlclsyMF07Ci0KLSAgICAgIHNiX3Jlc2V0ICgmdCk7Ci0gICAgICBzYl9hZGRfc3RyaW5nICgmdCwgbWFjcm9fc3RyaXBfYXQgPyAiJE5BUkciIDogIk5BUkciKTsKLSAgICAgIHB0ciA9IChmb3JtYWxfZW50cnkgKikgaGFzaF9maW5kIChtLT5mb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmdCkpOwotICAgICAgc2JfcmVzZXQgKCZwdHItPmFjdHVhbCk7Ci0gICAgICBzcHJpbnRmIChidWZmZXIsICIlZCIsIG5hcmcpOwotICAgICAgc2JfYWRkX3N0cmluZyAoJnB0ci0+YWN0dWFsLCBidWZmZXIpOwotICAgIH0KLQotICBlcnIgPSBtYWNyb19leHBhbmRfYm9keSAoJm0tPnN1Yiwgb3V0LCBtLT5mb3JtYWxzLCBtLT5mb3JtYWxfaGFzaCwKLQkJCSAgIGNvbW1lbnRfY2hhciwgMSk7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICByZXR1cm4gZXJyOwotCi0gIC8qIERpc2NhcmQgYW55IHVubmFtZWQgZm9ybWFsIGFyZ3VtZW50cy4gICovCi0gIGlmIChtYWNyb19tcmkpCi0gICAgewotICAgICAgZm9ybWFsX2VudHJ5ICoqcGY7Ci0KLSAgICAgIHBmID0gJm0tPmZvcm1hbHM7Ci0gICAgICB3aGlsZSAoKnBmICE9IE5VTEwpCi0JewotCSAgaWYgKCgqcGYpLT5uYW1lLmxlbiAhPSAwKQotCSAgICBwZiA9ICYoKnBmKS0+bmV4dDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNiX2tpbGwgKCYoKnBmKS0+bmFtZSk7Ci0JICAgICAgc2Jfa2lsbCAoJigqcGYpLT5kZWYpOwotCSAgICAgIHNiX2tpbGwgKCYoKnBmKS0+YWN0dWFsKTsKLQkgICAgICBmID0gKCpwZiktPm5leHQ7Ci0JICAgICAgZnJlZSAoKnBmKTsKLQkgICAgICAqcGYgPSBmOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBzYl9raWxsICgmdCk7Ci0gIG1hY3JvX251bWJlcisrOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBDaGVjayBmb3IgYSBtYWNyby4gIElmIG9uZSBpcyBmb3VuZCwgcHV0IHRoZSBleHBhbnNpb24gaW50bwotICAgKkVYUEFORC4gIENPTU1FTlRfQ0hBUiBpcyB0aGUgY29tbWVudCBjaGFyYWN0ZXItLXRoaXMgaXMgdXNlZCBieQotICAgZ2FzcC4gIFJldHVybiAxIGlmIGEgbWFjcm8gaXMgZm91bmQsIDAgb3RoZXJ3aXNlLiAgKi8KLQotaW50Ci1jaGVja19tYWNybyAobGluZSwgZXhwYW5kLCBjb21tZW50X2NoYXIsIGVycm9yKQotICAgICBjb25zdCBjaGFyICpsaW5lOwotICAgICBzYiAqZXhwYW5kOwotICAgICBpbnQgY29tbWVudF9jaGFyOwotICAgICBjb25zdCBjaGFyICoqZXJyb3I7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNoYXIgKmNvcHksICpjczsKLSAgbWFjcm9fZW50cnkgKm1hY3JvOwotICBzYiBsaW5lX3NiOwotCi0gIGlmICghIGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSAqbGluZSkKLSAgICAgICYmICpsaW5lICE9ICdfJwotICAgICAgJiYgKmxpbmUgIT0gJyQnCi0gICAgICAmJiAoISBtYWNyb19tcmkgfHwgKmxpbmUgIT0gJy4nKSkKLSAgICByZXR1cm4gMDsKLQotICBzID0gbGluZSArIDE7Ci0gIHdoaWxlIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnMpCi0JIHx8ICpzID09ICdfJwotCSB8fCAqcyA9PSAnJCcpCi0gICAgKytzOwotCi0gIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHMgLSBsaW5lICsgMSk7Ci0gIG1lbWNweSAoY29weSwgbGluZSwgcyAtIGxpbmUpOwotICBjb3B5W3MgLSBsaW5lXSA9ICdcMCc7Ci0gIGZvciAoY3MgPSBjb3B5OyAqY3MgIT0gJ1wwJzsgY3MrKykKLSAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpjcykpCi0gICAgICAqY3MgPSB0b2xvd2VyICgqY3MpOwotCi0gIG1hY3JvID0gKG1hY3JvX2VudHJ5ICopIGhhc2hfZmluZCAobWFjcm9faGFzaCwgY29weSk7Ci0KLSAgaWYgKG1hY3JvID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV3JhcCB0aGUgbGluZSB1cCBpbiBhbiBzYi4gICovCi0gIHNiX25ldyAoJmxpbmVfc2IpOwotICB3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnXG4nICYmICpzICE9ICdccicpCi0gICAgc2JfYWRkX2NoYXIgKCZsaW5lX3NiLCAqcysrKTsKLQotICBzYl9uZXcgKGV4cGFuZCk7Ci0gICplcnJvciA9IG1hY3JvX2V4cGFuZCAoMCwgJmxpbmVfc2IsIG1hY3JvLCBleHBhbmQsIGNvbW1lbnRfY2hhcik7Ci0KLSAgc2Jfa2lsbCAoJmxpbmVfc2IpOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWxldGUgYSBtYWNyby4gICovCi0KLXZvaWQKLWRlbGV0ZV9tYWNybyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaGFzaF9kZWxldGUgKG1hY3JvX2hhc2gsIG5hbWUpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBJUlAgYW5kIElSUEMgcHNldWRvLW9wcy4gIFRoZXNlIGFyZSBoYW5kbGVkIGFzIGEKLSAgIGNvbWJpbmVkIG1hY3JvIGRlZmluaXRpb24gYW5kIGV4ZWN1dGlvbi4gIFRoaXMgcmV0dXJucyBOVUxMIG9uCi0gICBzdWNjZXNzLCBvciBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4gICovCi0KLWNvbnN0IGNoYXIgKgotZXhwYW5kX2lycCAoaXJwYywgaWR4LCBpbiwgb3V0LCBnZXRfbGluZSwgY29tbWVudF9jaGFyKQotICAgICBpbnQgaXJwYzsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpOwotICAgICBpbnQgY29tbWVudF9jaGFyOwotewotICBjb25zdCBjaGFyICptbjsKLSAgc2Igc3ViOwotICBmb3JtYWxfZW50cnkgZjsKLSAgc3RydWN0IGhhc2hfY29udHJvbCAqaDsKLSAgY29uc3QgY2hhciAqZXJyOwotCi0gIGlmIChpcnBjKQotICAgIG1uID0gIklSUEMiOwotICBlbHNlCi0gICAgbW4gPSAiSVJQIjsKLQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBzYl9uZXcgKCZzdWIpOwotICBpZiAoISBidWZmZXJfYW5kX25lc3QgKG1uLCAiRU5EUiIsICZzdWIsIGdldF9saW5lKSkKLSAgICByZXR1cm4gXygidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBpcnAgb3IgaXJwYyIpOwotICAKLSAgc2JfbmV3ICgmZi5uYW1lKTsKLSAgc2JfbmV3ICgmZi5kZWYpOwotICBzYl9uZXcgKCZmLmFjdHVhbCk7Ci0KLSAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmZi5uYW1lKTsKLSAgaWYgKGYubmFtZS5sZW4gPT0gMCkKLSAgICByZXR1cm4gXygibWlzc2luZyBtb2RlbCBwYXJhbWV0ZXIiKTsKLQotICBoID0gaGFzaF9uZXcgKCk7Ci0gIGVyciA9IGhhc2hfamFtIChoLCBzYl90ZXJtaW5hdGUgKCZmLm5hbWUpLCAmZik7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICByZXR1cm4gZXJyOwotCi0gIGYuaW5kZXggPSAxOwotICBmLm5leHQgPSBOVUxMOwotCi0gIHNiX3Jlc2V0IChvdXQpOwotCi0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdID09IGNvbW1lbnRfY2hhcikKLSAgICB7Ci0gICAgICAvKiBFeHBhbmQgb25jZSB3aXRoIGEgbnVsbCBzdHJpbmcuICAqLwotICAgICAgZXJyID0gbWFjcm9fZXhwYW5kX2JvZHkgKCZzdWIsIG91dCwgJmYsIGgsIGNvbW1lbnRfY2hhciwgMCk7Ci0gICAgICBpZiAoZXJyICE9IE5VTEwpCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXJwYyAmJiBpbi0+cHRyW2lkeF0gPT0gJyInKQotCSsraWR4OwotICAgICAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdICE9IGNvbW1lbnRfY2hhcikKLQl7Ci0JICBpZiAoIWlycGMpCi0JICAgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmZi5hY3R1YWwsIDEsIDApOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicpCi0JCXsKLQkJICBpbnQgbnh0OwotCi0JCSAgbnh0ID0gc2Jfc2tpcF93aGl0ZSAoaWR4ICsgMSwgaW4pOwotCQkgIGlmIChueHQgPj0gaW4tPmxlbiB8fCBpbi0+cHRyW254dF0gPT0gY29tbWVudF9jaGFyKQotCQkgICAgewotCQkgICAgICBpZHggPSBueHQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgc2JfcmVzZXQgKCZmLmFjdHVhbCk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKCZmLmFjdHVhbCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICArK2lkeDsKLQkgICAgfQotCSAgZXJyID0gbWFjcm9fZXhwYW5kX2JvZHkgKCZzdWIsIG91dCwgJmYsIGgsIGNvbW1lbnRfY2hhciwgMCk7Ci0JICBpZiAoZXJyICE9IE5VTEwpCi0JICAgIHJldHVybiBlcnI7Ci0JICBpZiAoIWlycGMpCi0JICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotCSAgZWxzZQotCSAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQl9Ci0gICAgfQotCi0gIGhhc2hfZGllIChoKTsKLSAgc2Jfa2lsbCAoJnN1Yik7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9nYXMvbWFjcm8uaCBiL2dhcy9tYWNyby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGVlYTRhLi4wMDAwMDAwCi0tLSBhL2dhcy9tYWNyby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogbWFjcm8uaCAtIGhlYWRlciBmaWxlIGZvciBtYWNybyBzdXBwb3J0IGZvciBnYXMgYW5kIGdhc3AKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKLSAgICAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmbmRlZiBNQUNST19ICi0KLSNkZWZpbmUgTUFDUk9fSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzYi5oIgotCi0vKiBXaGV0aGVyIGFueSBtYWNyb3MgaGF2ZSBiZWVuIGRlZmluZWQuICAqLwotCi1leHRlcm4gaW50IG1hY3JvX2RlZmluZWQ7Ci0KLS8qIFRoZSBtYWNybyBuZXN0aW5nIGxldmVsLiAgKi8KLQotZXh0ZXJuIGludCBtYWNyb19uZXN0OwotCi1leHRlcm4gaW50IGJ1ZmZlcl9hbmRfbmVzdAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgc2IgKiwgaW50ICgqKSBQQVJBTVMgKChzYiAqKSkpKTsKLWV4dGVybiB2b2lkIG1hY3JvX2luaXQKLSAgUEFSQU1TICgoaW50IGFsdGVybmF0ZSwgaW50IG1yaSwgaW50IHN0cmlwX2F0LAotCSAgIGludCAoKikgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHNiICosIGludCAqKSkpKTsKLWV4dGVybiB2b2lkIG1hY3JvX21yaV9tb2RlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlZmluZV9tYWNybwotICBQQVJBTVMgKChpbnQgaWR4LCBzYiAqaW4sIHNiICpsYWJlbCwgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKSwKLQkgICBjb25zdCBjaGFyICoqbmFtZXApKTsKLWV4dGVybiBpbnQgY2hlY2tfbWFjcm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzYiAqLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLWV4dGVybiB2b2lkIGRlbGV0ZV9tYWNybyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpleHBhbmRfaXJwCi0gIFBBUkFNUyAoKGludCwgaW50LCBzYiAqLCBzYiAqLCBpbnQgKCopIFBBUkFNUyAoKHNiICopKSwgaW50KSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL21ha2VmaWxlLnZtcyBiL2dhcy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzMwZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jCi0jIG1ha2VmaWxlIGZvciBnYXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcHJvZ2lzLmRlCi0jCi1DQz1nY2MKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1pZmVxICgkKENDKSxnY2MpCi1ERUZTPQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5iZmRdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKQotTEZMQUdTPQotTElCUz0sR05VX0NDX0xJQlJBUlk6bGliZ2NjL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliLEdOVV9DQ19MSUJSQVJZOmNydDAub2JqCi1lbHNlCi1ERUZTPS9kZWZpbmU9KCJ0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuIj0idGFic2l6X2Zsb251bV9wb3dlcnNfb2ZfdGVuIixcCi0iX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyI9Il9iZmRfZ2VuZXJpY19nZXRfd2luX3NlY3Rpb25fY29udCIsXAotIl9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIj0iX2JmZF9lbGZfc2VjX2Zyb21fYmZkX3NlYyIsImNvbnN0PSIpCi1DRkxBR1M9L25vb3B0L25vZGVidWcvaW5jbHVkZT0oW10sWy0uYmZkXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUylcCi0vd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMscHRybWlzbWF0Y2gsdW5kZWZlc2NhcCxsb25nZXh0ZXJuLGR1cHR5cGVzcGVjKQotTEZMQUdTPQotTElCUz0sc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotZW5kaWYKLQotZWxzZQkjIEFSQ0ggbm90IEFMUEhBCi0KLWlmZXEgKCQoQ0MpLGdjYykKLURFRlM9Ci1DRkxBR1M9L2luY2x1ZGU9KFtdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKQotTEZMQUdTPQotTElCUz0sR05VX0NDX0xJQlJBUlk6bGliZ2NjL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliLEdOVV9DQ19MSUJSQVJZOmNydGJlZ2luLm9iaixHTlVfQ0NfTElCUkFSWTpjcnRlbmQub2JqCi0jTElCUz0sZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9saWIsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotZWxzZQotZXJyb3IgREVDQyBpcyBicm9rZW4gb24gVkFYCi1ERUZTPS9kZWZpbmU9KCJ0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuIj0idGFic2l6X2Zsb251bV9wb3dlcnNfb2ZfdGVuIiwiY29uc3Q9IikKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLHB0cm1pc21hdGNoLHVuZGVmZXNjYXAsbG9uZ2V4dGVybixkdXB0eXBlc3BlYykKLUxGTEFHUz0KLUxJQlM9LHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKLWVuZGlmCi1lbmRpZgotCi0KLU9CSlM9dGFyZy1jcHUub2JqLG9iai1mb3JtYXQub2JqLGF0b2YtdGFyZy5vYmosYXBwLm9iaixhcy5vYmosYXRvZi1nZW5lcmljLm9iaixcCi0gIGJpZ251bS1jb3B5Lm9iaixjb25kLm9iaixkZXBlbmQub2JqLGV4cHIub2JqLGZsb251bS1rb25zdC5vYmosZmxvbnVtLWNvcHkub2JqLFwKLSAgZmxvbnVtLW11bHQub2JqLGZyYWdzLm9iaixoYXNoLm9iaixpbnB1dC1maWxlLm9iaixpbnB1dC1zY3J1Yi5vYmosXAotICBsaXRlcmFsLm9iaixtZXNzYWdlcy5vYmosb3V0cHV0LWZpbGUub2JqLHJlYWQub2JqLHN1YnNlZ3Mub2JqLHN5bWJvbHMub2JqLFwKLSAgd3JpdGUub2JqLGxpc3Rpbmcub2JqLGVjb2ZmLm9iaixzdGFicy5vYmosc2Iub2JqLG1hY3JvLm9iaixlaG9wdC5vYmoKLQotR0FTUE9CSlMgPSBnYXNwLm9iaixtYWNyby5vYmosc2Iub2JqLGhhc2gub2JqCi0KLUxJQklCRVJUWSA9IFstLmxpYmliZXJ0eV1saWJpYmVydHkub2xiCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1MSUJCRkQgPSBbLS5iZmRdbGliYmZkLm9sYgotTElCT1BDT0RFUyA9IFstLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGIKLUJGRERFUCA9IFstLmJmZF1iZmQuaAotZWxzZQotTElCQkZEID0KLUxJQk9QQ09ERVMgPQotQkZEREVQID0KLWVuZGlmCi0KLWFsbDogY29uZmlnLnN0YXR1cyAkKEJGRERFUCkgYXMuZXhlIGdhc3AuZXhlCi0KLWFzLmV4ZTogJChPQkpTKSAkKExJQk9QQ09ERVMpICQoTElCQkZEKSAkKExJQklCRVJUWSkKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi0JbGluayQoTEZMQUdTKS9leGU9JEAgJChPQkpTKSwkKExJQk9QQ09ERVMpL2xpYiwkKExJQkJGRCkvbGliLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCi1lbHNlCi0JbGluayQoTEZMQUdTKS9leGU9JEAgJChPQkpTKSwkKExJQklCRVJUWSkvbGliJChMSUJTKQotZW5kaWYKLQotZ2FzcC5leGU6ICQoR0FTUE9CSlMpICQoTElCQkZEKSAkKExJQklCRVJUWSkKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi0JbGluayQoTEZMQUdTKS9leGU9JEAgJChHQVNQT0JKUyksJChMSUJCRkQpL2xpYiwkKExJQklCRVJUWSkvbGliJChMSUJTKQotZWxzZQotCWxpbmskKExGTEFHUykvZXhlPSRAICQoR0FTUE9CSlMpLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCi1lbmRpZgotCi1jb25maWcuc3RhdHVzOgotCSQkIEBjb25maWctZ2FzCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1DUFU9YWxwaGEKLU9CSkZPUk1BVD1ldmF4Ci1GTFRGT1JNQVQ9aWVlZQotZWxzZQotQ1BVPXZheAotT0JKRk9STUFUPXZtcwotRkxURk9STUFUPXZheAotZW5kaWYKLQotdGFyZy1jcHUuYzogWy5jb25maWdddGMtJChDUFUpLmMKLQljb3B5ICQ8ICRACi10YXJnLWNwdS5oOiBbLmNvbmZpZ110Yy0kKENQVSkuaAotCWNvcHkgJDwgJEAKLXRhcmctZW52Lmg6IFsuY29uZmlnXXRlLWdlbmVyaWMuaAotCWNvcHkgJDwgJEAKLW9iai1mb3JtYXQuaDogWy5jb25maWddb2JqLSQoT0JKRk9STUFUKS5oCi0JY29weSAkPCAkQAotb2JqLWZvcm1hdC5jOiBbLmNvbmZpZ11vYmotJChPQkpGT1JNQVQpLmMKLQljb3B5ICQ8ICRACi1hdG9mLXRhcmcuYzogWy5jb25maWddYXRvZi0kKEZMVEZPUk1BVCkuYwotCWNvcHkgJDwgJEAKLQotdGFyZy1jcHUub2JqOiB0YXJnLWNwdS5jIHRhcmctY3B1LmggWy5jb25maWddYXRvZi12YXguYwotCi1bLS5iZmRdYmZkLmg6Ci0JJChDRCkgWy0uYmZkXQotCWdtYWtlIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCi0JJChDRCkgWy0uZ2FzXQotCi1pbnN0YWxsOiBhcy5leGUgZ2FzcC5leGUKLQkkKENQKSAkXiBHTlVfUk9PVFw6W0JJTl0KLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSAqLmV4ZTsKLQkkKFJNKSBhdG9mLXRhcmcuYzsKLQkkKFJNKSBvYmotZm9ybWF0LmM7Ci0JJChSTSkgb2JqLWZvcm1hdC5oOwotCSQoUk0pIHRhcmctZW52Lmg7Ci0JJChSTSkgdGFyZy1jcHUuaDsKLQkkKFJNKSB0YXJnLWNwdS5jOwotCSQoUk0pIGNvbmZpZy5zdGF0dXM7CmRpZmYgLS1naXQgYS9nYXMvbWVzc2FnZXMuYyBiL2dhcy9tZXNzYWdlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGI3YWQwLi4wMDAwMDAwCi0tLSBhL2dhcy9tZXNzYWdlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qIG1lc3NhZ2VzLmMgLSBlcnJvciByZXBvcnRlciAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfRVJSTk9fSAotI2luY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9TVERBUkcKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX1ZBUkFSR1MKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChVU0VfU1REQVJHKSAmJiAhZGVmaW5lZCAoVVNFX1ZBUkFSR1MpCi0vKiBSb2xsIG91ciBvd24uICAqLwotI2RlZmluZSB2YV9hbGlzdCBSRVNUCi0jZGVmaW5lIHZhX2RjbAotdHlwZWRlZiBpbnQgKiB2YV9saXN0OwotI2RlZmluZSB2YV9zdGFydChBUkdTKQlBUkdTID0gJlJFU1QKLSNkZWZpbmUgdmFfZW5kKEFSR1MpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgaWRlbnRpZnkgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBhc19zaG93X3doZXJlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGFzX3dhcm5faW50ZXJuYWwgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgYXNfYmFkX2ludGVybmFsIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBjaGFyICopKTsKLQotLyoKLSAqIERlc3BpdGUgdGhlIHJlc3Qgb2YgdGhlIGNvbW1lbnRzIGluIHRoaXMgZmlsZSwgKEZJWE1FLVNPT04pLAotICogaGVyZSBpcyB0aGUgY3VycmVudCBzY2hlbWUgZm9yIGVycm9yIG1lc3NhZ2VzIGV0YzoKLSAqCi0gKiBhc19mYXRhbCgpIGlzIHVzZWQgd2hlbiBnYXMgaXMgcXVpdGUgY29uZnVzZWQgYW5kCi0gKiBjb250aW51aW5nIHRoZSBhc3NlbWJseSBpcyBwb2ludGxlc3MuICBJbiB0aGlzIGNhc2Ugd2UKLSAqIGV4aXQgaW1tZWRpYXRlbHkgd2l0aCBlcnJvciBzdGF0dXMuCi0gKgotICogYXNfYmFkKCkgaXMgdXNlZCB0byBtYXJrIGVycm9ycyB0aGF0IHJlc3VsdCBpbiB3aGF0IHdlCi0gKiBwcmVzdW1lIHRvIGJlIGEgdXNlbGVzcyBvYmplY3QgZmlsZS4gIFNheSwgd2UgaWdub3JlZAotICogc29tZXRoaW5nIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIHZpdGFsLiAgSWYgd2Ugc2VlIGFueSBvZgotICogdGhlc2UsIGFzc2VtYmx5IHdpbGwgY29udGludWUgdG8gdGhlIGVuZCBvZiB0aGUgc291cmNlLAotICogbm8gb2JqZWN0IGZpbGUgd2lsbCBiZSBwcm9kdWNlZCwgYW5kIHdlIHdpbGwgdGVybWluYXRlCi0gKiB3aXRoIGVycm9yIHN0YXR1cy4gIFRoZSBuZXcgb3B0aW9uLCAtWiwgdGVsbHMgdXMgdG8KLSAqIHByb2R1Y2UgYW4gb2JqZWN0IGZpbGUgYW55d2F5IGJ1dCB3ZSBzdGlsbCBleGl0IHdpdGgKLSAqIGVycm9yIHN0YXR1cy4gIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB5b3UgZG9uJ3Qgd2FudAotICogdGhpcyBvYmplY3QgZmlsZSBidXQgd2UgY291bGQgYmUgd3JvbmcuCi0gKgotICogYXNfd2FybigpIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIGFuIGVycm9yIGZyb20gd2hpY2ggd2UKLSAqIGhhdmUgYSBwbGF1c2libGUgZXJyb3IgcmVjb3ZlcnkuICBlZywgbWFza2luZyB0aGUgdG9wCi0gKiBiaXRzIG9mIGEgY29uc3RhbnQgdGhhdCBpcyBsb25nZXIgdGhhbiB3aWxsIGZpdCBpbiB0aGUKLSAqIGRlc3RpbmF0aW9uLiAgSW4gdGhpcyBjYXNlIHdlIHdpbGwgY29udGludWUgdG8gYXNzZW1ibGUKLSAqIHRoZSBzb3VyY2UsIGFsdGhvdWdoIHdlIG1heSBoYXZlIG1hZGUgYSBiYWQgYXNzdW1wdGlvbiwKLSAqIGFuZCB3ZSB3aWxsIHByb2R1Y2UgYW4gb2JqZWN0IGZpbGUgYW5kIHJldHVybiBub3JtYWwgZXhpdAotICogc3RhdHVzIChpZSwgbm8gZXJyb3IpLiAgVGhlIG5ldyBvcHRpb24gLVggdGVsbHMgdXMgdG8KLSAqIHRyZWF0IGFsbCBhc193YXJuKCkgZXJyb3JzIGFzIGFzX2JhZCgpIGVycm9ycy4gIFRoYXQgaXMsCi0gKiBubyBvYmplY3QgZmlsZSB3aWxsIGJlIHByb2R1Y2VkIGFuZCB3ZSB3aWxsIGV4aXQgd2l0aAotICogZXJyb3Igc3RhdHVzLiAgVGhlIGlkZWEgaGVyZSBpcyB0aGF0IHdlIGRvbid0IGtpbGwgYW4KLSAqIGVudGlyZSBtYWtlIGJlY2F1c2Ugb2YgYW4gZXJyb3IgdGhhdCB3ZSBrbmV3IGhvdyB0bwotICogY29ycmVjdC4gIE9uIHRoZSBvdGhlciBoYW5kLCBzb21ldGltZXMgeW91IG1pZ2h0IHdhbnQgdG8KLSAqIHN0b3AgdGhlIG1ha2UgYXQgdGhlc2UgcG9pbnRzLgotICoKLSAqIGFzX3Rza3RzaygpIGlzIHVzZWQgd2hlbiB3ZSBzZWUgYSBtaW5vciBlcnJvciBmb3Igd2hpY2gKLSAqIG91ciBlcnJvciByZWNvdmVyeSBhY3Rpb24gaXMgYWxtb3N0IGNlcnRhaW5seSBjb3JyZWN0LgotICogSW4gdGhpcyBjYXNlLCB3ZSBwcmludCBhIG1lc3NhZ2UgYW5kIHRoZW4gYXNzZW1ibHkKLSAqIGNvbnRpbnVlcyBhcyB0aG91Z2ggbm8gZXJyb3Igb2NjdXJyZWQuCi0gKi8KLQotc3RhdGljIHZvaWQKLWlkZW50aWZ5IChmaWxlKQotICAgICBjaGFyICpmaWxlOwotewotICBzdGF0aWMgaW50IGlkZW50aWZpZWQ7Ci0gIGlmIChpZGVudGlmaWVkKQotICAgIHJldHVybjsKLSAgaWRlbnRpZmllZCsrOwotCi0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgeDsKLSAgICAgIGFzX3doZXJlICgmZmlsZSwgJngpOwotICAgIH0KLQotICBpZiAoZmlsZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgZmlsZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiQXNzZW1ibGVyIG1lc3NhZ2VzOlxuIikpOwotfQotCi1zdGF0aWMgaW50IHdhcm5pbmdfY291bnQ7CS8qIENvdW50IG9mIG51bWJlciBvZiB3YXJuaW5ncyBpc3N1ZWQgKi8KLQotaW50IAotaGFkX3dhcm5pbmdzICgpCi17Ci0gIHJldHVybiAod2FybmluZ19jb3VudCk7Ci19Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgaGl0IGEgJ2JhZCBlcnJvcicsIGFuZCBzaG91bGQgbm90IHdyaXRlIGFuIG9iaiBmaWxlLAotICAgYW5kIGV4aXQgd2l0aCBhIG5vbnplcm8gZXJyb3IgY29kZSAqLwotCi1zdGF0aWMgaW50IGVycm9yX2NvdW50OwotCi1pbnQgCi1oYWRfZXJyb3JzICgpCi17Ci0gIHJldHVybiAoZXJyb3JfY291bnQpOwotfQotCi0KLS8qIFByaW50IHRoZSBjdXJyZW50IGxvY2F0aW9uIHRvIHN0ZGVyci4gICovCi0KLXN0YXRpYyB2b2lkCi1hc19zaG93X3doZXJlICgpCi17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotICBpZGVudGlmeSAoZmlsZSk7Ci0gIGlmIChmaWxlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiV1OiAiLCBmaWxlLCBsaW5lKTsKLX0KLQotLyoKLSAqCQkJYSBzIF8gcCBlIHIgciBvIHIKLSAqCi0gKiBMaWtlIHBlcnJvcigzKSwgYnV0IHdpdGggbW9yZSBpbmZvLgotICovCi0KLXZvaWQgCi1hc19wZXJyb3IgKGdyaXBlLCBmaWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZ3JpcGU7CQkvKiBVbnB1bmN0dWF0ZWQgZXJyb3IgdGhlbWUuICovCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBjb25zdCBjaGFyICplcnJ0eHQ7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBncmlwZSwgZmlsZW5hbWUpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZXJydHh0ID0gYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSk7Ci0jZWxzZQotICBlcnJ0eHQgPSB4c3RyZXJyb3IgKGVycm5vKTsKLSNlbmRpZgotICBmcHJpbnRmIChzdGRlcnIsICI6ICVzXG4iLCBlcnJ0eHQpOwotICBlcnJubyA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotI2VuZGlmCi19Ci0KLS8qCi0gKgkJCWEgcyBfIHQgcyBrIHQgcyBrICgpCi0gKgotICogU2VuZCB0byBzdGRlcnIgYSBzdHJpbmcgYXMgYSB3YXJuaW5nLCBhbmQgbG9jYXRlIHdhcm5pbmcKLSAqIGluIGlucHV0IGZpbGUocykuCi0gKiBQbGVhc2Ugb25seSB1c2UgdGhpcyBmb3Igd2hlbiB3ZSBoYXZlIHNvbWUgcmVjb3ZlcnkgYWN0aW9uLgotICogUGxlYXNlIGV4cGxhaW4gaW4gc3RyaW5nICh3aGljaCBtYXkgaGF2ZSAnXG4ncykgd2hhdCByZWNvdmVyeSB3YXMgZG9uZS4KLSAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX3Rza3RzayAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0JCQkJLyogYXNfdHNrdHNrKCkgKi8KLSNlbHNlCi12b2lkIAotYXNfdHNrdHNrIChmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0JCQkJLyogYXNfdHNrdHNrKCkgKi8KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qIFRoZSBjb21tb24gcG9ydGlvbiBvZiBhc193YXJuIGFuZCBhc193YXJuX3doZXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzX3dhcm5faW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcikKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgKyt3YXJuaW5nX2NvdW50OwotCi0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgaWRlbnRpZnkgKGZpbGUpOwotICBpZiAoZmlsZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczoldTogIiwgZmlsZSwgbGluZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiV2FybmluZzogIikpOwotICBmcHV0cyAoYnVmZmVyLCBzdGRlcnIpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSNpZm5kZWYgTk9fTElTVElORwotICBsaXN0aW5nX3dhcm5pbmcgKGJ1ZmZlcik7Ci0jZW5kaWYKLX0KLQotLyoKLSAqCQkJYSBzIF8gdyBhIHIgbiAoKQotICoKLSAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgd2FybmluZywgYW5kIGxvY2F0ZSB3YXJuaW5nCi0gKiBpbiBpbnB1dCBmaWxlKHMpLgotICogUGxlYXNlIG9ubHkgdXNlIHRoaXMgZm9yIHdoZW4gd2UgaGF2ZSBzb21lIHJlY292ZXJ5IGFjdGlvbi4KLSAqIFBsZWFzZSBleHBsYWluIGluIHN0cmluZyAod2hpY2ggbWF5IGhhdmUgJ1xuJ3MpIHdoYXQgcmVjb3Zlcnkgd2FzIGRvbmUuCi0gKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc193YXJuIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIGlmICghZmxhZ19ub193YXJuaW5ncykKLSAgICB7Ci0gICAgICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoKGNoYXIgKikgTlVMTCwgMCwgYnVmZmVyKTsKLSAgICB9Ci19CQkJCS8qIGFzX3dhcm4oKSAqLwotI2Vsc2UKLS8qVkFSQVJHUzEgKi8KLXZvaWQgCi1hc193YXJuIChmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIGlmICghZmxhZ19ub193YXJuaW5ncykKLSAgICB7Ci0gICAgICB2YV9zdGFydCAoYXJncyk7Ci0gICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIGFzX3dhcm5faW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Ci0gICAgfQotfQkJCQkvKiBhc193YXJuKCkgKi8KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qIGFzX3dhcm5fd2hlcmUsIGxpa2UgYXNfYmFkIGJ1dCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKLSAgIHBhc3NlZCBpbi4gIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgdG8gcmVwZWF0IHRoZSBmdW5jdGlvbiBpbiBvcmRlcgotICAgdG8gaGFuZGxlIHRoZSB2YXJhcmdzIGNvcnJlY3RseSBhbmQgcG9ydGFibHkuICAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX3dhcm5fd2hlcmUgKGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIGlmICghZmxhZ19ub193YXJuaW5ncykKLSAgICB7Ci0gICAgICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKLSAgICB9Ci19CQkJCS8qIGFzX3dhcm4oKSAqLwotI2Vsc2UKLS8qVkFSQVJHUzEgKi8KLXZvaWQgCi1hc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCi0gICAgewotICAgICAgdmFfc3RhcnQgKGFyZ3MpOwotICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICBhc193YXJuX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOwotICAgIH0KLX0JCQkJLyogYXNfd2FybigpICovCi0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKiBUaGUgY29tbW9uIHBvcnRpb24gb2YgYXNfYmFkIGFuZCBhc19iYWRfd2hlcmUuICAqLwotCi1zdGF0aWMgdm9pZAotYXNfYmFkX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gICsrZXJyb3JfY291bnQ7Ci0KLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICBhc193aGVyZSAoJmZpbGUsICZsaW5lKTsKLQotICBpZGVudGlmeSAoZmlsZSk7Ci0gIGlmIChmaWxlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiV1OiAiLCBmaWxlLCBsaW5lKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJFcnJvcjogIikpOwotICBmcHV0cyAoYnVmZmVyLCBzdGRlcnIpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSNpZm5kZWYgTk9fTElTVElORwotICBsaXN0aW5nX2Vycm9yIChidWZmZXIpOwotI2VuZGlmCi19Ci0KLS8qCi0gKgkJCWEgcyBfIGIgYSBkICgpCi0gKgotICogU2VuZCB0byBzdGRlcnIgYSBzdHJpbmcgYXMgYSB3YXJuaW5nLCBhbmQgbG9jYXRlIHdhcm5pbmcgaW4gaW5wdXQgZmlsZShzKS4KLSAqIFBsZWFzZSB1cyB3aGVuIHRoZXJlIGlzIG5vIHJlY292ZXJ5LCBidXQgd2Ugd2FudCB0byBjb250aW51ZSBwcm9jZXNzaW5nCi0gKiBidXQgbm90IHByb2R1Y2UgYW4gb2JqZWN0IGZpbGUuCi0gKiBQbGVhc2UgZXhwbGFpbiBpbiBzdHJpbmcgKHdoaWNoIG1heSBoYXZlICdcbidzKSB3aGF0IHJlY292ZXJ5IHdhcyBkb25lLgotICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfYmFkIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGFzX2JhZF9pbnRlcm5hbCAoKGNoYXIgKikgTlVMTCwgMCwgYnVmZmVyKTsKLX0KLQotI2Vsc2UKLS8qVkFSQVJHUzEgKi8KLXZvaWQgCi1hc19iYWQgKGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGFzX2JhZF9pbnRlcm5hbCAoKGNoYXIgKikgTlVMTCwgMCwgYnVmZmVyKTsKLX0KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qIGFzX2JhZF93aGVyZSwgbGlrZSBhc19iYWQgYnV0IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZQotICAgcGFzc2VkIGluLiAgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byByZXBlYXQgdGhlIGZ1bmN0aW9uIGluIG9yZGVyCi0gICB0byBoYW5kbGUgdGhlIHZhcmFyZ3MgY29ycmVjdGx5IGFuZCBwb3J0YWJseS4gICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfYmFkX3doZXJlIChjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICBhc19iYWRfaW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7Ci19Ci0KLSNlbHNlCi0vKlZBUkFSR1MxICovCi12b2lkIAotYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICB2YV9zdGFydCAoYXJncyk7Ci0gIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgYXNfYmFkX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOwotfQotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyoKLSAqCQkJYSBzIF8gZiBhIHQgYSBsICgpCi0gKgotICogU2VuZCB0byBzdGRlcnIgYSBzdHJpbmcgYXMgYSBmYXRhbCBtZXNzYWdlLCBhbmQgcHJpbnQgbG9jYXRpb24gb2YgZXJyb3IgaW4KLSAqIGlucHV0IGZpbGUocykuCi0gKiBQbGVhc2Ugb25seSB1c2UgdGhpcyBmb3Igd2hlbiB3ZSBET04nVCBoYXZlIHNvbWUgcmVjb3ZlcnkgYWN0aW9uLgotICogSXQgeGV4aXQoKXMgd2l0aCBhIHdhcm5pbmcgc3RhdHVzLgotICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfZmF0YWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBhc19zaG93X3doZXJlICgpOwotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJGYXRhbCBlcnJvcjogIikpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19CQkJCS8qIGFzX2ZhdGFsKCkgKi8KLSNlbHNlCi0vKlZBUkFSR1MxKi8KLXZvaWQgCi1hc19mYXRhbCAoZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJGYXRhbCBlcnJvcjogIikpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICAodm9pZCkgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19CQkJCS8qIGFzX2ZhdGFsKCkgKi8KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qCi0gKiBhc19hc3NlcnQ6IEluZGljYXRlIGFzc2VydGlvbiBmYWlsdXJlLgotICogQXJndW1lbnRzOiBGaWxlbmFtZSwgbGluZSBudW1iZXIsIG9wdGlvbmFsIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLQotdm9pZAotYXNfYXNzZXJ0IChmaWxlLCBsaW5lLCBmbikKLSAgICAgY29uc3QgY2hhciAqZmlsZSwgKmZuOwotICAgICBpbnQgbGluZTsKLXsKLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJJbnRlcm5hbCBlcnJvciFcbiIpKTsKLSAgaWYgKGZuKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiQXNzZXJ0aW9uIGZhaWx1cmUgaW4gJXMgYXQgJXMgbGluZSAlZC5cbiIpLAotCSAgICAgZm4sIGZpbGUsIGxpbmUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJBc3NlcnRpb24gZmFpbHVyZSBhdCAlcyBsaW5lICVkLlxuIiksIGZpbGUsIGxpbmUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIlBsZWFzZSByZXBvcnQgdGhpcyBidWcuXG4iKSk7Ci0gIHhleGl0IChFWElUX0ZBSUxVUkUpOwotfQotCi0vKiBhc19hYm9ydDogUHJpbnQgYSBmcmllbmRseSBtZXNzYWdlIHNheWluZyBob3cgdG90YWxseSBob3NlZCB3ZSBhcmUsCi0gICBhbmQgZXhpdCB3aXRob3V0IHByb2R1Y2luZyBhIGNvcmUgZmlsZS4gICovCi12b2lkCi1hc19hYm9ydCAoZmlsZSwgbGluZSwgZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKLSAgICAgaW50IGxpbmU7Ci17Ci0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIGlmIChmbikKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkIGluICVzXG4iKSwKLQkgICAgIGZpbGUsIGxpbmUsIGZuKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWRcbiIpLAotCSAgICAgZmlsZSwgbGluZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIpKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19Ci0KLS8qIFN1cHBvcnQgcm91dGluZXMuICAqLwotCi12b2lkCi1mcHJpbnRfdmFsdWUgKGZpbGUsIHZhbCkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgdmFsdWVUIHZhbDsKLXsKLSAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGxvbmcpKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICIlbGQiLCAobG9uZykgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAoYmZkX3ZtYSkpCi0gICAgewotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHZhbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gIGFib3J0ICgpOwotfQotCi12b2lkCi1zcHJpbnRfdmFsdWUgKGJ1ZiwgdmFsKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci17Ci0gIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChsb25nKSkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChidWYsICIlbGQiLCAobG9uZykgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAoYmZkX3ZtYSkpCi0gICAgewotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiwgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIGVuZCBvZiBtZXNzYWdlcy5jICovCmRpZmYgLS1naXQgYS9nYXMvbXB3LWNvbmZpZy5pbiBiL2dhcy9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI5YjFkLi4wMDAwMDAwCi0tLSBhL2dhcy9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgR0FTLgotCi1TZXQgdGFyZ2V0X2FyY2ggYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy0uKi0uKi8vJ2AKLQotSWYgInt0YXJnZXRfYXJjaH0iID1+IC9wb3dlcnBjLwotCVNldCBzaG9ydF9hcmNoX25hbWUgInBwYyIKLQlTZXQgdGFyZ2V0X2NwdSAicG93ZXJwYyIKLUVsc2UKLQlTZXQgc2hvcnRfYXJjaF9uYW1lICJ7dGFyZ2V0X2FyY2h9IgotRW5kIElmCi0KLSMgVGhlIGZvbGxvd2luZyB3b3JrcyBmb3IgbWFueSBjb25maWd1cmF0aW9ucywgdGhvdWdoIG5vdCBhbGwuCi0KLVNldCBvYmpfZm9ybWF0IGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8uKi0uKi0vLydgCi1TZXQgdGFyZ2V0X29zIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8uKi0uKi0vLydgCi0KLVNldCBiZmRfZ2FzIG5vCi0KLVNldCBUREVGSU5FUyAiIgotCi1TZXQgRVhUUkFfT0JKRUNUUyAiIgotCi0jIERlZmF1bHQgZW11bGF0aW9uLgotCi1TZXQgZW0gZ2VuZXJpYwotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KLQlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKLQlTZXQgVERFRklORVMgJy1kIE02OEtDT0ZGJwotCVNldCBFWFRSQV9PQkpFQ1RTICcie299Im02OGstcGFyc2UuYy5vJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLwotCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgotCVNldCBiZmRfZ2FzIHllcwotCVNldCBlbSBtYWNvcwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9pMzg2LVxPcHRpb24teC1nbzMyLwotCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgotCVNldCBUREVGSU5FUyAnLWQgSTM4NkNPRkYnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL202OGstXE9wdGlvbi14LWNvZmYvCi0JU2V0IFRERUZJTkVTICctZCBNNjhLQ09GRicKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1pZHQtZWNvZmYvCi0JU2V0IGJmZF9nYXMgeWVzCi0JU2V0IFRERUZJTkVTICctZCBUQVJHRVRfQllURVNfQklHX0VORElBTj0xJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCi0JIyBBc3N1bWUgb3RoZXIgT1NlcyBldGMgdXNlIEVMRgotCVNldCBvYmpfZm9ybWF0ICJlbGYiCi0JU2V0IGJmZF9nYXMgeWVzCi0JU2V0IFRERUZJTkVTICctZCBUQVJHRVRfQllURVNfQklHX0VORElBTj0xJwotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImJmZDplbGYtYmZkLmggJ2JmZC9lbGYtYmZkLmgnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3NoLVxPcHRpb24teC1obXMvCi0JU2V0IG9ial9mb3JtYXQgImNvZmYiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0ib3Bjb2RlczpzaC1vcGMuaCAnb3Bjb2Rlcy9zaC1vcGMuaCcKLUVuZCBJZgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzp0Yy17c2hvcnRfYXJjaF9uYW1lfS5jIHRhcmctY3B1LmMKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnRjLXtzaG9ydF9hcmNoX25hbWV9LmggdGFyZy1jcHUuaAotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzpvYmote29ial9mb3JtYXR9LmMgb2JqLWZvcm1hdC5jCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzpvYmote29ial9mb3JtYXR9Lmggb2JqLWZvcm1hdC5oCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnRlLXtlbX0uaCB0YXJnLWVudi5oCi0KLSMgU3BlY2lhbCBjYXNlcyBmb3IgZmxvYXQgaGFuZGxpbmcuCi0KLUlmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvbnMzMmsvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi1uczMyay5jIGF0b2YtdGFyZy5jCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvdGFob2UvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi10YWhvZS5jIGF0b2YtdGFyZy5jCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvdmF4LwotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtdmF4LmMgYXRvZi10YXJnLmMKLUVsc2UKLQkjIFVzZSBJRUVFIGJ5IGRlZmF1bHQuCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi1pZWVlLmMgYXRvZi10YXJnLmMKLUVuZCBJZgotCi1FY2hvICcjIEZyb20gbXB3LWNvbmZpZy5pbicgICAgIAkJID4gIntvfSJtay50bXAKLUVjaG8gIlRERUZJTkVTID0gIiB7VERFRklORVN9CQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkVYVFJBX09CSkVDVFMgPSAiIHtFWFRSQV9PQkpFQ1RTfQkJPj4gIntvfSJtay50bXAKLSMgKFdlIHVzZSB0aGUgLW4gb3B0aW9uIGhlcmUgc28gYXMgbm90IHRvIGdldCBleHRyYSBzcGFjZXMgaW5zZXJ0ZWQpCi1FY2hvIC1uICdUQVJHX0NQVV9ERVAgPSB7VEFSR19DUFVfREVQXycJCT4+ICJ7b30ibWsudG1wCi1FY2hvIC1uIHtzaG9ydF9hcmNoX25hbWV9CQkJPj4gIntvfSJtay50bXAKLUVjaG8gLW4gJ30nCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmYuICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJyA+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX0NQVSAgICAgICAiJyAgICAgICAJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAie3RhcmdldF9jcHV9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfT1MgICAgICAgIicgICAgICAgCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gInt0YXJnZXRfb3N9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfQUxJQVMgICAgICAgIicgICAgICAgCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gInt0YXJnZXRfYWxpYXN9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMICAgICAgICInICAgICAJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAie3RhcmdldF9jYW5vbmljYWx9IgkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQk+PiAie299ImNvbmYubmV3Ci1JZiAie2JmZF9nYXN9IiA9fiAveWVzLwotCUVjaG8gIiNkZWZpbmUgQkZEX0FTU0VNQkxFUiIJCT4+ICJ7b30iY29uZi5uZXcKLUVsc2UKLQlFY2hvICIjZGVmaW5lIE1BTllfU0VHTUVOVFMiCQk+PiAie299ImNvbmYubmV3Ci1FbmQgSWYKLUVjaG8gJyNkZWZpbmUgQ1JfRU9MJwkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICcjZGVmaW5lIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QJwkJPj4gIntvfSJjb25mLm5ldwotRWNobyAnI2RlZmluZSBMT1NJTkdfQ09NUElMRVInCQkJPj4gIntvfSJjb25mLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25mLm5ldyAie299ImNvbmYKLQotc2VkIC1lICJzL0BzcmNkaXJAL3tzcmNkaXJ9LyIgIntzcmNkaXJ9ImdkYmluaXQuaW4gPiAie299Il9nZGJpbml0CmRpZmYgLS1naXQgYS9nYXMvbXB3LW1ha2Uuc2VkIGIvZ2FzL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmMTJhNS4uMDAwMDAwMAotLS0gYS9nYXMvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRoYXQgZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBHQVMgVW5peCBNYWtlZmlsZSB0byBNUFcgc3ludGF4LgotCi0vXiMgQHRhcmdldF9mcmFnQC9hXAotXAotSERFRklORVMgPSBcCi1MT0NBTF9MT0FETElCRVMgPSBcCi0KLS9ec3Jjcm9vdCA9IC9zL14vIy8KLS9edGFyZ2V0X2FsaWFzID0gL3MvXi8jLwotCi0vSU5DTFVERVMvcy8taSAie3NyY2Rpcn0iOlwoW2Etel0qXCkvLWkgInt0b3BzcmNkaXJ9IlwxLwotL0lOQ0xVREVTL3MvLWkgIntzcmNkaXJ9IlwuXC4vLWkgInt0b3BzcmNkaXJ9Ii8KLQotL15JTkNMVURFUyA9IC4qJC9zLyQvIC1pICJ7dG9wc3JjZGlyfSJpbmNsdWRlOm1wdzogLWkgOjpleHRyYS1pbmNsdWRlOi8KLQotLyQoVEFSR19DUFVfREVQX0B0YXJnZXRfY3B1X3R5cGVAKS9zLyQoVEFSR19DUFVfREVQX0B0YXJnZXRfY3B1X3R5cGVAKS97VEFSR19DUFVfREVQfS8KLQotL0BPUENPREVTX0xJQkAvcy9AT1BDT0RFU19MSUJALzo6b3Bjb2RlczpsaWJvcGNvZGVzLm8vCi0vQEJGRExJQkAvcy9AQkZETElCQC86OmJmZDpsaWJiZmQuby8KLQotIyBQb2ludCBhdCB0aGUgbGlicmFyaWVzIGRpcmVjdGx5LgotL0BPUENPREVTX0RFUEAvcy9AT1BDT0RFU19ERVBALzo6b3Bjb2RlczpsaWJvcGNvZGVzLm8vCi0vQEJGRERFUEAvcy9AQkZEREVQQC86OmJmZDpsaWJiZmQuby8KLQotIyBEb24ndCBuZWVkIHRoaXMuCi0vQEhMREZMQUdTQC9zL0BITERGTEFHU0AvLwotCi0vZXh0cmFfb2JqZWN0c0Avcy9leHRyYV9vYmplY3RzQC97RVhUUkFfT0JKRUNUU30vCi0KLS9MT0FETElCRVMvcy97TE9BRExJQkVTfS97RVhUUkFMSUJTfS8KLQotL0BBTExfT0JKX0RFUFNAL3MvQEFMTF9PQkpfREVQU0AvOjpiZmQ6YmZkLmgvCi0KLSMgVGhpcyBjYXVzZXMgcHJvYmxlbXMgLSBub3Qgc3VyZSB3aHkuCi0vXnRhZ3MgVEFHUy8sL2V0YWdzIC9kCi0KLS9ebWFrZS1nYXMuY29tL3MvXi8jLwotCi0vdHJ1ZS9zLyA7IEB0cnVlJC8vCi0KLSMgUmVtb3ZlIHJlZmVyZW5jZXMgdG8gY29uZi5pbiwgd2UgZG9uJ3QgbmVlZCB0aGVtLgotL2NvbmZcLmluL3MvY29uZlwuaW4vL2cKLQotIyBVc2UgX2dkYmluaXQgZXZlcnl3aGVyZSBpbnN0ZWFkIG9mIC5nZGJpbml0LgotL2dkYmluaXQvcy9cLmdkYmluaXQvX2dkYmluaXQvZwotCi0vYXRvZi10YXJnL3MvIntzfSJhdG9mLXRhcmdcLmMvIntvfSJhdG9mLXRhcmcuYy9nCi0vY29uZmlnL3MvIntzfSJjb25maWdcLmgvIntvfSJjb25maWcuaC9nCi0vY29uZmlnL3MvXmNvbmZpZ1wuaC8ie299ImNvbmZpZy5oLwotL29iai1mb3JtYXQvcy8ie3N9Im9iai1mb3JtYXRcLmMvIntvfSJvYmotZm9ybWF0LmMvZwotL29iai1mb3JtYXQvcy8ie3N9Im9iai1mb3JtYXRcLmgvIntvfSJvYmotZm9ybWF0LmgvZwotL3RhcmctY3B1L3MvIntzfSJ0YXJnLWNwdVwuYy8ie299InRhcmctY3B1LmMvZwotL3RhcmctY3B1L3MvIntzfSJ0YXJnLWNwdVwuaC8ie299InRhcmctY3B1LmgvZwotL3RhcmctZW52L3MvIntzfSJ0YXJnLWVudlwuaC8ie299InRhcmctZW52LmgvZwotCi0vbTY4ay1wYXJzZS5jL3MvIntzfSJtNjhrLXBhcnNlXC5jLyJ7b30ibTY4ay1wYXJzZS5jL2cKLS9tNjhrLXBhcnNlLmMvcy9ebTY4ay1wYXJzZVwuYy8ie299Im02OGstcGFyc2UuYy8KLQotIyBXaGFjayBvdXQgdGhlIGNvbmZpZy5oIGRlcGVuZGVuY3ksIGl0IG9ubHkgY2F1c2VzIGV4Y2VzcyByZWJ1aWxkcy4KLS97T0JKU30vcy97T0JKU30gXFxPcHRpb24tZiAie299ImNvbmZpZy5oL3tPQkpTfSBcXE9wdGlvbi1mLwotL2dhc3AuYy9zL2dhc3BcLmMgIntvfSJjb25maWcuaC9nYXNwLmMvCi0KLSMgQUxMX0NGTEFHUyBpbmNsdWRlcyBUREVGSU5FUywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZSBhdCBsaW5rIHRpbWUuCi0vQ0NfTEQvcy9BTExfQ0ZMQUdTL0NGTEFHUy9nCi0KLSMgVGhlIHJlc291cmNlIGZpbGUgaXMgY2FsbGVkIG1hYy1hcy5yLgotL2FzLm5ldy5yL3MvYXNcLm5ld1wuci9tYWMtYXMuci8KLS9nYXNwLm5ldy5yL3MvZ2FzcFwubmV3XC5yL21hYy1hcy5yLwotCi0jIC4uLmFuZCB0aGUgUFJPR19OQU1FIGRvZXNuJ3QgaGF2ZSBhIC5uZXcgaW4gaXQuCi0vUFJPR19OQU1FL3MvUFJPR19OQU1FPSciJ2FzLm5ldyciJy9QUk9HX05BTUU9JyInYXMnIicvCi0vUFJPR19OQU1FL3MvUFJPR19OQU1FPSciJ2dhc3AubmV3JyInL1BST0dfTkFNRT0nIidnYXNwJyInLwotCi0jIFdoYWNrIG91dCByZWN1cnNpdmUgbWFrZXMsIHRoZXkgd29uJ3Qgd29yay4KLS9eWyAJXVsgCV0qc3Jjcm9vdD0vLC9eWyAJXVsgCV0qKGNkIC9kCi0KLSMgV29yayBhcm91bmQgcXVvdGluZyBwcm9ibGVtcyBieSB1c2luZyBtdWx0aXBsZSBlY2hvIGNvbW1hbmRzLgotLycjZGVmaW5lIEdBU19WRVJTSU9OICJ7VkVSU0lPTn0iJy9jXAotCUVjaG8gLW4gJyNkZWZpbmUgR0FTX1ZFUlNJT04gIicgPj4gIntvfSJjb25maWcubmV3XAotCUVjaG8gLW4gIntWRVJTSU9OfSIgPj4gIntvfSJjb25maWcubmV3XAotCUVjaG8gLW4gJyInID4+ICJ7b30iY29uZmlnLm5ldwotCi0jIEFkZCBhICJzdGFtcHMiIHRhcmdldC4KLSRhXAotc3RhbXBzIFxcT3B0aW9uLWYgY29uZmlnLXN0YW1wXAotCi0vXmluc3RhbGwgXFxPcHRpb24tZi8sL14kL2NcCi1pbnN0YWxsIFxcT3B0aW9uLWYgYWxsIGluc3RhbGwtb25seVwKLVwKLWluc3RhbGwtb25seSBcXE9wdGlvbi1mXAotCU5ld0ZvbGRlclJlY3Vyc2l2ZSAie2JpbmRpcn0iXAotCUR1cGxpY2F0ZSAteSA6YXMubmV3ICJ7YmluZGlyfSJhc1wKLQlEdXBsaWNhdGUgLXkgOmdhc3AubmV3ICJ7YmluZGlyfSJnYXNwXAotCi0KLSMgV2hhY2sgb3V0IGNvbmZpZy1yZWJ1aWxkaW5nIHRhcmdldHMsIHRoZXkgd29uJ3Qgd29yay4KLS9eTWFrZWZpbGUgXFxPcHRpb24tZi8sL14kL2QKLS9eY29uZmlnLnN0YXR1cyBcXE9wdGlvbi1mLywvXiQvZAotCi0vXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi9zL14vIy8KZGlmZiAtLWdpdCBhL2dhcy9vYmouaCBiL2dhcy9vYmouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZTc1Yy4uMDAwMDAwMAotLS0gYS9nYXMvb2JqLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBvYmouaCAtIGRlZmluZXMgdGhlIG9iamVjdCBkZXBlbmRlbnQgaG9va3MgZm9yIGFsbCBvYmplY3QKLSAgIGZvcm1hdCBiYWNrZW5kcy4KLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTUsIDk2LCA5NywgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWNoYXIgKm9ial9kZWZhdWx0X291dHB1dF9maWxlX25hbWUgUEFSQU1TICgodm9pZCkpOwotdm9pZCBvYmpfZW1pdF9yZWxvY2F0aW9ucyBQQVJBTVMgKChjaGFyICoqd2hlcmUsIGZpeFMgKiBmaXhQLAotCQkJCSAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKSk7Ci12b2lkIG9ial9lbWl0X3N0cmluZ3MgUEFSQU1TICgoY2hhciAqKndoZXJlKSk7Ci12b2lkIG9ial9lbWl0X3N5bWJvbHMgUEFSQU1TICgoY2hhciAqKndoZXJlLCBzeW1ib2xTICogc3ltYm9scykpOwotI2lmbmRlZiBvYmpfcmVhZF9iZWdpbl9ob29rCi12b2lkIG9ial9yZWFkX2JlZ2luX2hvb2sgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQgb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLXZvaWQgb2JqX2hlYWRlcl9hcHBlbmQgUEFSQU1TICgoY2hhciAqKndoZXJlLCBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNpZm5kZWYgb2JqX3ByZV93cml0ZV9ob29rCi12b2lkIG9ial9wcmVfd3JpdGVfaG9vayBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgb2JqX3N5bWJvbF9uZXdfaG9vawotdm9pZCBvYmpfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci0jZW5kaWYKLQotdm9pZCBvYmpfc3ltYm9sX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgc3ltYm9sUyAqIHN5bWJvbFApKTsKLQotZXh0ZXJuIGNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW107Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdHJ1Y3QgZm9ybWF0X29wcyB7Ci0gIGludCBmbGF2b3I7Ci0gIHVuc2lnbmVkIGRmbF9sZWFkaW5nX3VuZGVyc2NvcmUgOiAxOwotICB1bnNpZ25lZCBlbWl0X3NlY3Rpb25fc3ltYm9scyA6IDE7Ci0gIHZvaWQgKCpmcm9iX3N5bWJvbCkgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotICB2b2lkICgqZnJvYl9maWxlKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIHZvaWQgKCpmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIGJmZF92bWEgKCpzX2dldF9zaXplKSBQQVJBTVMgKChzeW1ib2xTICopKTsKLSAgdm9pZCAoKnNfc2V0X3NpemUpIFBBUkFNUyAoKHN5bWJvbFMgKiwgYmZkX3ZtYSkpOwotICBiZmRfdm1hICgqc19nZXRfYWxpZ24pIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotICB2b2lkICgqc19zZXRfYWxpZ24pIFBBUkFNUyAoKHN5bWJvbFMgKiwgYmZkX3ZtYSkpOwotICB2b2lkICgqY29weV9zeW1ib2xfYXR0cmlidXRlcykgUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLSAgdm9pZCAoKmdlbmVyYXRlX2FzbV9saW5lbm8pIFBBUkFNUyAoKHZvaWQpKTsKLSAgdm9pZCAoKnByb2Nlc3Nfc3RhYikgUEFSQU1TICgoc2VnVCwgaW50LCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpKTsKLSAgaW50ICgqc2VjX3N5bV9va19mb3JfcmVsb2MpIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLSAgdm9pZCAoKnBvcF9pbnNlcnQpIFBBUkFNUyAoKHZvaWQpKTsKLSAgLyogRm9yIGNvbmZpZ3VyYXRpb25zIHVzaW5nIEVDT0ZGX0RFQlVHR0lORywgdGhpcyBjYWxsYmFjayBpcyB1c2VkLiAgKi8KLSAgdm9pZCAoKmVjb2ZmX3NldF9leHQpIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3RydWN0IGVjb2ZmX2V4dHIgKikpOwotCi0gIHZvaWQgKCpyZWFkX2JlZ2luX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKLSAgdm9pZCAoKnN5bWJvbF9uZXdfaG9vaykgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWxmX2Zvcm1hdF9vcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWNvZmZfZm9ybWF0X29wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBjb2ZmX2Zvcm1hdF9vcHM7Ci0KLSNpZm5kZWYgdGhpc19mb3JtYXQKLUNPTU1PTiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyAqdGhpc19mb3JtYXQ7Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBlbmQgb2Ygb2JqLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9vdXRwdXQtZmlsZS5jIGIvZ2FzL291dHB1dC1maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWFmNDguLjAwMDAwMDAKLS0tIGEvZ2FzL291dHB1dC1maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyogb3V0cHV0LWZpbGUuYyAtICBEZWFsIHdpdGggdGhlIG91dHB1dCBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTMsIDkyLCA5NCwgOTUsIDk2LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgotCi0jaWZkZWYgQkZEX0hFQURFUlMKLSNkZWZpbmUgVVNFX0JGRAotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIFVTRV9CRkQKLSNpZm5kZWYgVEFSR0VUX01BQ0gKLSNkZWZpbmUgVEFSR0VUX01BQ0ggMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9CRkQKLSNpbmNsdWRlICJiZmQuaCIKLWJmZCAqc3Rkb3V0cHV0OwotCi12b2lkCi1vdXRwdXRfZmlsZV9jcmVhdGUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICctJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IG9wZW4gYSBiZmQgb24gc3Rkb3V0ICVzICIpLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEoc3Rkb3V0cHV0ID0gYmZkX29wZW53IChuYW1lLCBUQVJHRVRfRk9STUFUKSkpCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIiksIG5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIGJmZF9zZXRfZm9ybWF0IChzdGRvdXRwdXQsIGJmZF9vYmplY3QpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIFRBUkdFVF9NQUNIKTsKLSNlbmRpZgotICBpZiAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpCi0gICAgc3Rkb3V0cHV0LT5mbGFncyB8PSBCRkRfVFJBRElUSU9OQUxfRk9STUFUOwotfQotCi12b2lkCi1vdXRwdXRfZmlsZV9jbG9zZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogQ2xvc2UgdGhlIGJmZC4gICovCi0gIGlmIChiZmRfY2xvc2UgKHN0ZG91dHB1dCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjbG9zZSAlc1xuIiksIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotI2Vsc2UKLSAgLyogQ2xvc2UgdGhlIGJmZCB3aXRob3V0IGdldHRpbmcgYmZkIHRvIHdyaXRlIG91dCBhbnl0aGluZyBieSBpdHNlbGYgKi8KLSAgaWYgKGJmZF9jbG9zZV9hbGxfZG9uZSAoc3Rkb3V0cHV0KSA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNsb3NlICVzXG4iKSwgZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZW5kaWYKLSAgc3Rkb3V0cHV0ID0gTlVMTDsJCS8qIFRydXN0IG5vYm9keSEgKi8KLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkCi1vdXRwdXRfZmlsZV9hcHBlbmQgKHdoZXJlLCBsZW5ndGgsIGZpbGVuYW1lKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgbG9uZyBsZW5ndGg7Ci0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi0jZWxzZQotCi1zdGF0aWMgRklMRSAqc3Rkb3V0cHV0OwotCi12b2lkCi1vdXRwdXRfZmlsZV9jcmVhdGUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICctJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgc3Rkb3V0cHV0ID0gc3Rkb3V0OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdGRvdXRwdXQgPSBmb3BlbiAobmFtZSwgIndiIik7Ci0KLSAgLyogU29tZSBzeXN0ZW1zIGRvbid0IGdyb2sgImIiIGluIGZvcGVuIG1vZGVzLiAgKi8KLSAgaWYgKHN0ZG91dHB1dCA9PSBOVUxMKQotICAgIHN0ZG91dHB1dCA9IGZvcGVuIChuYW1lLCAidyIpOwotCi0gIGlmIChzdGRvdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLX0KLQotdm9pZAotb3V0cHV0X2ZpbGVfY2xvc2UgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKEVPRiA9PSBmY2xvc2UgKHN0ZG91dHB1dCkpCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY2xvc2UgJXMiKSwgZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIHN0ZG91dHB1dCA9IE5VTEw7CQkvKiBUcnVzdCBub2JvZHkhICovCi19Ci0KLXZvaWQKLW91dHB1dF9maWxlX2FwcGVuZCAod2hlcmUsIGxlbmd0aCwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBsb25nIGxlbmd0aDsKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGZvciAoOyBsZW5ndGg7IGxlbmd0aC0tLCB3aGVyZSsrKQotICAgIHsKLSAgICAgICh2b2lkKSBwdXRjICgqd2hlcmUsIHN0ZG91dHB1dCk7Ci0gICAgICBpZiAoZmVycm9yIChzdGRvdXRwdXQpKQotCS8qIGlmICggRU9GID09IChwdXRjKCAqd2hlcmUsIHN0ZG91dHB1dCApKSApICovCi0JewotCSAgYXNfcGVycm9yIChfKCJGYWlsZWQgdG8gZW1pdCBhbiBvYmplY3QgYnl0ZSIpLCBmaWxlbmFtZSk7Ci0JICBhc19mYXRhbCAoXygiQ2FuJ3QgY29udGludWUiKSk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIGVuZCBvZiBvdXRwdXQtZmlsZS5jICovCmRpZmYgLS1naXQgYS9nYXMvb3V0cHV0LWZpbGUuaCBiL2dhcy9vdXRwdXQtZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDJmMWVmLi4wMDAwMDAwCi0tLSBhL2dhcy9vdXRwdXQtZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG91dHB1dC1maWxlLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdm9pZCBvdXRwdXRfZmlsZV9hcHBlbmQgUEFSQU1TICgoY2hhciAqd2hlcmUsIGxvbmcgbGVuZ3RoLCBjaGFyICpmaWxlbmFtZSkpOwotdm9pZCBvdXRwdXRfZmlsZV9jbG9zZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotdm9pZCBvdXRwdXRfZmlsZV9jcmVhdGUgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotCi0vKiBlbmQgb2Ygb3V0cHV0LWZpbGUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3BvL01ha2UtaW4gYi9nYXMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9nYXMvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9nYXMvcG8vUE9URklMRVMuaW4gYi9nYXMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNjdmMjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLWFwcC5jCi1hcHAuYwotYXMuYwotYXMuYwotYXMuaAotYXNpbnRsLmgKLWF0b2YtZ2VuZXJpYy5jCi1hdG9mLWdlbmVyaWMuYwotYmlnbnVtLWNvcHkuYwotYmlnbnVtLWNvcHkuYwotYmlnbnVtLmgKLWJpdF9maXguaAotY2dlbi5oCi1jb25kLmMKLWNvbmQuYwotY29uZmlnL2UtaTM4NmNvZmYuYwotY29uZmlnL2UtaTM4NmVsZi5jCi1jb25maWcvZS1taXBzZWNvZmYuYwotY29uZmlnL2UtbWlwc2VsZi5jCi1jb25maWcvb2JqLWFvdXQuYwotY29uZmlnL29iai1hb3V0LmgKLWNvbmZpZy9vYmotYm91dC5jCi1jb25maWcvb2JqLWJvdXQuaAotY29uZmlnL29iai1jb2ZmLmMKLWNvbmZpZy9vYmotY29mZi5oCi1jb25maWcvb2JqLWVjb2ZmLmMKLWNvbmZpZy9vYmotZWNvZmYuaAotY29uZmlnL29iai1lbGYuYwotY29uZmlnL29iai1lbGYuaAotY29uZmlnL29iai1ldmF4LmMKLWNvbmZpZy9vYmotZXZheC5oCi1jb25maWcvb2JqLWhwMzAwLmMKLWNvbmZpZy9vYmotaHAzMDAuaAotY29uZmlnL29iai1pZWVlLmMKLWNvbmZpZy9vYmotaWVlZS5oCi1jb25maWcvb2JqLXNvbS5jCi1jb25maWcvb2JqLXNvbS5oCi1jb25maWcvb2JqLXZtcy5jCi1jb25maWcvb2JqLXZtcy5oCi1jb25maWcvdGMtYTI5ay5jCi1jb25maWcvdGMtYTI5ay5oCi1jb25maWcvdGMtYWxwaGEuYwotY29uZmlnL3RjLWFscGhhLmgKLWNvbmZpZy90Yy1hcmMuYwotY29uZmlnL3RjLWFyYy5oCi1jb25maWcvdGMtYXJtLmMKLWNvbmZpZy90Yy1hcm0uaAotY29uZmlnL3RjLWQxMHYuYwotY29uZmlnL3RjLWQxMHYuaAotY29uZmlnL3RjLWQzMHYuYwotY29uZmlnL3RjLWQzMHYuaAotY29uZmlnL3RjLWg4MzAwLmMKLWNvbmZpZy90Yy1oODMwMC5oCi1jb25maWcvdGMtaDg1MDAuYwotY29uZmlnL3RjLWg4NTAwLmgKLWNvbmZpZy90Yy1ocHBhLmMKLWNvbmZpZy90Yy1ocHBhLmgKLWNvbmZpZy90Yy1pMzg2LmMKLWNvbmZpZy90Yy1pMzg2LmgKLWNvbmZpZy90Yy1pODYwLmMKLWNvbmZpZy90Yy1pODYwLmgKLWNvbmZpZy90Yy1pOTYwLmMKLWNvbmZpZy90Yy1pOTYwLmgKLWNvbmZpZy90Yy1tMzJyLmMKLWNvbmZpZy90Yy1tMzJyLmgKLWNvbmZpZy90Yy1tNjhrLmMKLWNvbmZpZy90Yy1tNjhrLmgKLWNvbmZpZy90Yy1tODhrLmMKLWNvbmZpZy90Yy1tODhrLmgKLWNvbmZpZy90Yy1tY29yZS5jCi1jb25maWcvdGMtbWNvcmUuaAotY29uZmlnL3RjLW1pcHMuYwotY29uZmlnL3RjLW1pcHMuaAotY29uZmlnL3RjLW1uMTAyMDAuYwotY29uZmlnL3RjLW1uMTAyMDAuaAotY29uZmlnL3RjLW1uMTAzMDAuYwotY29uZmlnL3RjLW1uMTAzMDAuaAotY29uZmlnL3RjLW5zMzJrLmMKLWNvbmZpZy90Yy1uczMyay5oCi1jb25maWcvdGMtcHBjLmMKLWNvbmZpZy90Yy1wcGMuaAotY29uZmlnL3RjLXNoLmMKLWNvbmZpZy90Yy1zaC5oCi1jb25maWcvdGMtc3BhcmMuYwotY29uZmlnL3RjLXNwYXJjLmgKLWNvbmZpZy90Yy10YWhvZS5jCi1jb25maWcvdGMtdGFob2UuaAotY29uZmlnL3RjLXRpYzMwLmMKLWNvbmZpZy90Yy10aWMzMC5oCi1jb25maWcvdGMtdGljODAuYwotY29uZmlnL3RjLXRpYzgwLmgKLWNvbmZpZy90Yy12ODUwLmMKLWNvbmZpZy90Yy12ODUwLmgKLWNvbmZpZy90Yy12YXguYwotY29uZmlnL3RjLXZheC5oCi1jb25maWcvdGMtdzY1LmMKLWNvbmZpZy90Yy13NjUuaAotY29uZmlnL3RjLXo4ay5jCi1jb25maWcvdGMtejhrLmgKLWRlcGVuZC5jCi1kZXBlbmQuYwotZHdhcmYyZGJnLmMKLWR3YXJmMmRiZy5jCi1kd2FyZjJkYmcuaAotZWNvZmYuYwotZWNvZmYuYwotZWNvZmYuaAotZWhvcHQuYwotZWhvcHQuYwotZW11bC10YXJnZXQuaAotZW11bC5oCi1leHByLmMKLWV4cHIuYwotZXhwci5oCi1mbG9udW0tY29weS5jCi1mbG9udW0tY29weS5jCi1mbG9udW0ta29uc3QuYwotZmxvbnVtLWtvbnN0LmMKLWZsb251bS1tdWx0LmMKLWZsb251bS1tdWx0LmMKLWZsb251bS5oCi1mcmFncy5jCi1mcmFncy5jCi1mcmFncy5oCi1nYXNwLmMKLWhhc2guYwotaGFzaC5jCi1oYXNoLmgKLWlucHV0LWZpbGUuYwotaW5wdXQtZmlsZS5jCi1pbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLmMKLWlucHV0LXNjcnViLmMKLWl0Ymwtb3BzLmMKLWl0Ymwtb3BzLmgKLWxpc3RpbmcuYwotbGlzdGluZy5jCi1saXN0aW5nLmgKLWxpdGVyYWwuYwotbGl0ZXJhbC5jCi1tYWNyby5jCi1tYWNyby5jCi1tYWNyby5oCi1tZXNzYWdlcy5jCi1tZXNzYWdlcy5jCi1vYmouaAotb3V0cHV0LWZpbGUuYwotb3V0cHV0LWZpbGUuYwotb3V0cHV0LWZpbGUuaAotcmVhZC5jCi1yZWFkLmMKLXJlYWQuaAotc2IuYwotc2IuYwotc2IuaAotc3RhYnMuYwotc3RhYnMuYwotc3RydWMtc3ltYm9sLmgKLXN1YnNlZ3MuYwotc3Vic2Vncy5jCi1zdWJzZWdzLmgKLXN5bWJvbHMuYwotc3ltYm9scy5jCi1zeW1ib2xzLmgKLXRjLmgKLXdyaXRlLmMKLXdyaXRlLmMKLXdyaXRlLmgKZGlmZiAtLWdpdCBhL2dhcy9wby9nYXMucG90IGIvZ2FzL3BvL2dhcy5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDBlZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3BvL2dhcy5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSw3MTY2ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA2LTAzIDAzOjAwLTA3MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhcHAuYzo0NDggYXBwLmM6NDYyCi1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo1NDEKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBzdHJpbmc6IGluc2VydGVkICdcIiciCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZXNjYXBlICdcXCVjJyBpbiBzdHJpbmc6IElnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NjE2Ci1tc2dpZCAiRW5kIG9mIGZpbGUgaW4gc3RyaW5nOiAnXCInIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjczNgotbXNnaWQgImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjg4MgotbXNnaWQgImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjkzMQotbXNnaWQgImVuZCBvZiBmaWxlIGFmdGVyIGEgb25lLWNoYXJhY3RlciBxdW90ZTsgXFwwIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjkzOQotbXNnaWQgImVuZCBvZiBmaWxlIGluIGVzY2FwZSBjaGFyYWN0ZXIiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6OTUxCi1tc2dpZCAiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjEwMTAgYXBwLmM6MTA2NCBhcHAuYzoxMTMzCi1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzoxMDc0Ci1tc2dpZCAiRU9GIGluIENvbW1lbnQ6IE5ld2xpbmUgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGFzc2VtYmxlciB2ZXJzaW9uICVzICglcykgdXNpbmcgQkZEIHZlcnNpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGFzc2VtYmxlciB2ZXJzaW9uICVzICglcykiCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFtvcHRpb24uLi5dIFthc21maWxlLi4uXVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTM1Ci1tc2dpZCAiIgotIk9wdGlvbnM6XG4iCi0iICAtYVtzdWItb3B0aW9uLi4uXVx0dHVybiBvbiBsaXN0aW5nc1xuIgotIiAgICBTdWItb3B0aW9ucyBbZGVmYXVsdCBobHNdOlxuIgotIiAgICBjICAgb21pdCBmYWxzZSBjb25kaXRpb25hbHNcbiIKLSIgICAgZCAgIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXNcbiIKLSIgICAgaCAgIGluY2x1ZGUgaGlnaC1sZXZlbCBzb3VyY2VcbiIKLSIgICAgbCAgIGluY2x1ZGUgYXNzZW1ibHlcbiIKLSIgICAgbSAgIGluY2x1ZGUgbWFjcm8gZXhwYW5zaW9uc1xuIgotIiAgICBuICAgb21pdCBmb3JtcyBwcm9jZXNzaW5nXG4iCi0iICAgIHMgICBpbmNsdWRlIHN5bWJvbHNcbiIKLSIgICAgTCAgIGluY2x1ZGUgbGluZSBkZWJ1ZyBzdGF0aXN0aWNzIChpZiBhcHBsaWNhYmxlKVxuIgotIiAgICA9ZmlsZSBzZXQgbGlzdGluZyBmaWxlIG5hbWUgKG11c3QgYmUgbGFzdCBzdWItb3B0aW9uKVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTQ5Ci1tc2dpZCAiIgotIiAgLURcdFx0ICAgICAgICAgIHByb2R1Y2UgYXNzZW1ibGVyIGRlYnVnZ2luZyBtZXNzYWdlc1xuIgotIiAgLS1kZWZzeW0gU1lNPVZBTCAgICAgICAgZGVmaW5lIHN5bWJvbCBTWU0gdG8gZ2l2ZW4gdmFsdWVcbiIKLSIgIC1mXHRcdCAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuIgotIiAgLS1nc3RhYnNcdCAgICAgICAgICBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIKLSIgIC0taGVscFx0XHQgIHNob3cgdGhpcyBtZXNzYWdlIGFuZCBleGl0XG4iCi0iICAtSSBESVJcdFx0ICBhZGQgRElSIHRvIHNlYXJjaCBsaXN0IGZvciAuaW5jbHVkZSBkaXJlY3RpdmVzXG4iCi0iICAtSlx0XHQgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3dcbiIKLSIgIC1LXHRcdCAgICAgICAgICB3YXJuIHdoZW4gZGlmZmVyZW5jZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG4iCi0iICAtTCwtLWtlZXAtbG9jYWxzICAgICAgICBrZWVwIGxvY2FsIHN5bWJvbHMgKGUuZy4gc3RhcnRpbmcgd2l0aCBgTCcpXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxNjAKLW1zZ2lkICIiCi0iICAtTSwtLW1yaVx0ICAgICAgICAgIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcbiIKLSIgIC0tTUQgRklMRVx0ICAgICAgICAgIHdyaXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaW4gRklMRSAoZGVmYXVsdCBub25lKVxuIgotIiAgLW5vY3BwXHRcdCAgaWdub3JlZFxuIgotIiAgLW8gT0JKRklMRVx0ICAgICAgICAgIG5hbWUgdGhlIG9iamVjdC1maWxlIG91dHB1dCBPQkpGSUxFIChkZWZhdWx0IGEub3V0KVxuIgotIiAgLVJcdFx0ICAgICAgICAgIGZvbGQgZGF0YSBzZWN0aW9uIGludG8gdGV4dCBzZWN0aW9uXG4iCi0iICAtLXN0YXRpc3RpY3NcdCAgICAgICAgICBwcmludCB2YXJpb3VzIG1lYXN1cmVkIHN0YXRpc3RpY3MgZnJvbSBleGVjdXRpb25cbiIKLSIgIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUgIHN0cmlwIGxvY2FsIGFic29sdXRlIHN5bWJvbHNcbiIKLSIgIC0tdHJhZGl0aW9uYWwtZm9ybWF0XHQgIFVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyIHdoZW4gcG9zc2libGVcbiIKLSIgIC0tdmVyc2lvblx0XHQgIHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIgotIiAgLVdcdFx0XHQgIHN1cHByZXNzIHdhcm5pbmdzXG4iCi0iICAtLWl0YmwgSU5TVFRCTFx0ICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG4iCi0iXHRcdFx0ICBtYXRjaGluZyB0aGUgc3BlY2lmaWNhdGlvbnMgZGVmaW5lZCBpbiBmaWxlIElOU1RUQkxcbiIKLSIgIC13XHRcdFx0ICBpZ25vcmVkXG4iCi0iICAtWFx0XHRcdCAgaWdub3JlZFxuIgotIiAgLVpcdFx0XHQgIGdlbmVyYXRlIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxNzcKLW1zZ2lkICIiCi0iICAtLWxpc3RpbmctbGhzLXdpZHRoXHQgIHNldCB0aGUgd2lkdGggaW4gd29yZHMgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiAiCi0ib2ZcbiIKLSJcdFx0XHQgIHRoZSBsaXN0aW5nXG4iCi0iICAtLWxpc3RpbmctbGhzLXdpZHRoMlx0ICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBjb250aW51YXRpb24gbGluZXNcbiIKLSJcdFx0XHQgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG4iCi0iXHRcdFx0ICB0aGUgd2lkdGggb2YgdGhlIGZpcnN0IGxpbmVcbiIKLSIgIC0tbGlzdGluZy1yaHMtd2lkdGhcdCAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuIgotIlx0XHRcdCAgdGhlIHNvdXJjZSBmaWxlXG4iCi0iICAtLWxpc3RpbmctY29udC1saW5lc1x0ICBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB1c2VkXG4iCi0iXHRcdFx0ICBmb3IgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiBvZiB0aGUgbGlzdGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTkwIGdhc3AuYzozNTg4Ci1tc2dpZCAiIgotIlxuIgotIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjI3Ci1tc2dpZCAibWlzc2luZyBlbXVsYXRpb24gbW9kZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBlbXVsYXRpb24gbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KLSM6IGFzLmM6NDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBhc3NlbWJsZXIgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ2MwotbXNnaWQgIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDY0IGdhc3AuYzozNjgyCi1tc2dpZCAiIgotIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcbiIKLSJ0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhpcyBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQgZm9yIGEgdGFyZ2V0IG9mIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NzQKLW1zZ2lkICJtdWx0aXBsZSBlbXVsYXRpb24gbmFtZXMgc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDc2Ci1tc2dpZCAiZW11bGF0aW9ucyBub3QgaGFuZGxlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWxpYXMgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm9uaWNhbCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY3B1LXR5cGUgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZvcm1hdCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkLXRhcmdldCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo1MDEKLW1zZ2lkICJiYWQgZGVmc3ltOyBmb3JtYXQgaXMgLS1kZWZzeW0gbmFtZT12YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUyMQotbXNnaWQgIk5vIGZpbGUgbmFtZSBmb2xsb3dpbmcgLXQgb3B0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo1MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmFpbGVkIHRvIHJlYWQgaW5zdHJ1Y3Rpb24gdGFibGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGxpc3Rpbmcgb3B0aW9uIGAlYyciCi1tc2dzdHIgIiIKLQotIzogYXMuYzo4NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHRvdGFsIHRpbWUgaW4gYXNzZW1ibHk6ICVsZC4lMDZsZFxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6ODY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIy4KLSMuICogV2UgaGF2ZSBhIEdST1NTIGludGVybmFsIGVycm9yLgotIy4gKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0jLgotIzogYXRvZi1nZW5lcmljLmM6NDM4IGNvbmZpZy90Yy1hMjlrLmM6NTQ0IGNvbmZpZy90Yy1pODYwLmM6MzM1Ci0jOiBjb25maWcvdGMtaTg2MC5jOjcwOCBjb25maWcvdGMtbTY4ay5jOjMxMjQgY29uZmlnL3RjLW02OGsuYzozMTUzCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTU3Ci1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjay4iCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjc1Ci1tc2dpZCAiaW52YWxpZCBpZGVudGlmaWVyIGZvciBcIi5pZmRlZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoxMjgKLW1zZ2lkICJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5pZlwiIHN0YXRlbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6MjI0Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgaWZjIG9yIGlmbmMiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI1NwotbXNnaWQgIlwiLmVuZGlmXCIgd2l0aG91dCBcIi5pZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyODcKLW1zZ2lkICIuZWxzZSB3aXRob3V0IG1hdGNoaW5nIC5pZiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI5MgotbXNnaWQgImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI5NQotbXNnaWQgImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiZWxzZVwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyOTgKLW1zZ2lkICJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImlmXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjM0MwotbXNnaWQgIi5pZmVxcyBzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQzMAotbXNnaWQgImVuZCBvZiBtYWNybyBpbnNpZGUgY29uZGl0aW9uYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQzMgotbXNnaWQgImVuZCBvZiBmaWxlIGluc2lkZSBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NDM1Ci1tc2dpZCAiaGVyZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NDM5Ci1tc2dpZCAiaGVyZSBpcyB0aGUgXCJlbHNlXCIgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzoxNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBwdXQgYSBjb21tb24gc3ltYm9sIGludG8gc2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gc2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE5NiBjb25maWcvb2JqLWVsZi5jOjE1NDAgZWNvZmYuYzozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MjU0IGNvbmZpZy9vYmotY29mZi5jOjE3NzAKLW1zZ2lkICJ1bnJlc29sdmVkIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MjU2IGNvbmZpZy9vYmotY29mZi5jOjE3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgdHlwZSBmb3Igd2VhayBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6NDU3IGNvbmZpZy9vYmotY29mZi5jOjI3MDQgd3JpdGUuYzoxODAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzo1MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjYxMgotbXNnaWQgInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1ib3V0LmM6MzEyIGNvbmZpZy9vYmotdm1zLmM6NTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RydWN0dXJlIHRhYmxlIGZhaWxlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDUzIGNvbmZpZy9vYmotY29mZi5jOjIxMTcKLW1zZ2lkICIubG4gcHNldWRvLW9wIGluc2lkZSAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTEzIGNvbmZpZy9vYmotY29mZi5jOjIxNzQKLW1zZ2lkICIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTU5IGNvbmZpZy9vYmotY29mZi5jOjIyMjcKLW1zZ2lkICIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjYzNSBjb25maWcvb2JqLWNvZmYuYzoyMzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo3MzcgY29uZmlnL29iai1jb2ZmLmM6MjQwOQotbXNnaWQgIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NzU3IGNvbmZpZy9vYmotY29mZi5jOjI0MjkKLW1zZ2lkICJiYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4MDggY29uZmlnL29iai1jb2ZmLmM6MjQ5MgotbXNnaWQgIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODI0IGNvbmZpZy9vYmotY29mZi5jOjI1MDgKLW1zZ2lkICIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODQyIGNvbmZpZy9vYmotY29mZi5jOjI1MjYKLW1zZ2lkICIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODYxIGNvbmZpZy9vYmotY29mZi5jOjI1NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGFnIG5vdCBmb3VuZCBmb3IgLnRhZyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4NzYgY29uZmlnL29iai1jb2ZmLmM6MjU1OQotbXNnaWQgIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODk4IGNvbmZpZy9vYmotY29mZi5jOjI1ODEKLW1zZ2lkICIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTAyOSBjb25maWcvb2JqLWNvZmYuYzoyNzc3Ci1tc2dpZCAibWlzbWF0Y2hlZCAuZWIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTA0OCBjb25maWcvb2JqLWNvZmYuYzoyODE3Ci1tc2dpZCAiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiCi1tc2dzdHIgIiIKLQotIy4gU1RZUF9JTkZPCi0jLiBTVFlQX0xJQgotIy4gU1RZUF9PVkVSCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlICclYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTI2MiBjb25maWcvb2JqLWNvZmYuYzozNTIwIGNvbmZpZy90Yy1wcGMuYzozNzg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMjg0IGNvbmZpZy90Yy1wcGMuYzozODAyIHJlYWQuYzoyNDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTQwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIweCVseDogXCIlc1wiIHR5cGUgPSAlbGQsIGNsYXNzID0gJWQsIHNlZ21lbnQgPSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjE1OTcgY29uZmlnL29iai1pZWVlLmM6NjkKLW1zZ2lkICJPdXQgb2Ygc3RlcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjIwMzIKLW1zZ2lkICJiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjIyNTkKLW1zZ2lkICJgLmJmJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozMjIwIGNvbmZpZy9vYmotaWVlZS5jOjUyMiBvdXRwdXQtZmlsZS5jOjUyCi0jOiBvdXRwdXQtZmlsZS5jOjExOQotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjMzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgY2xvc2UgJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVG9vIG1hbnkgbmV3IHNlY3Rpb25zOyBjYW4ndCBhZGQgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM4MzggY29uZmlnL3RjLW04OGsuYzoxMjYwIGNvbmZpZy90Yy1zcGFyYy5jOjMwMTYKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM4NDQgcmVhZC5jOjE5NTUKLW1zZ2lkICJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozODUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImxjb21tIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6Mzg3OCByZWFkLmM6MjE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM5NzIgY29uZmlnL3RjLWk5NjAuYzozMjc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MDUxIHdyaXRlLmM6MjQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQwNzIgd3JpdGUuYzoyNTA5Ci1tc2dpZCAiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBlbWl0IHJlbG9jIHstICVzLXNlZyBzeW1ib2wgXCIlc1wifSBAIGZpbGUgYWRkcmVzcyAlbGQuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYSAxMy1iaXQKLSMuIGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZCBmb3IgbG9jYWwgYnJhbmNoZXM6Ci0jLiBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZSByZWxvY2F0aW9uLgotIzogY29uZmlnL29iai1jb2ZmLmM6NDIwOCBjb25maWcvdGMtaTk2MC5jOjMyOTQgd3JpdGUuYzoyNjUzCi1tc2dpZCAiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDI4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJWYWx1ZSBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MzAyIHdyaXRlLmM6Mjc2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJTaWduZWQgLndvcmQgb3ZlcmZsb3c7IHN3aXRjaCBtYXkgYmUgdG9vIGxhcmdlOyAlbGQgYXQgMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lY29mZi5jOjIzOQotbXNnaWQgIkNhbid0IHNldCBHUCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVjb2ZmLmM6MjQ2Ci1tc2dpZCAiQ2FuJ3Qgc2V0IHJlZ2lzdGVyIG1hc2tzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6Mjc2IGNvbmZpZy90Yy1zcGFyYy5jOjMxNTcgY29uZmlnL3RjLXY4NTAuYzoyNjMKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjI4MyBjb25maWcvdGMtYXJjLmM6Nzc4IGNvbmZpZy90Yy1zcGFyYy5jOjMxNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MjkzIGNvbmZpZy90Yy1hbHBoYS5jOjM0MzAgY29uZmlnL3RjLXNwYXJjLmM6MzE3NAotIzogY29uZmlnL3RjLXY4NTAuYzoyODUKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzozMDEgY29uZmlnL3RjLWFyYy5jOjc5NiBjb25maWcvdGMtc3BhcmMuYzozMTgyCi0jOiBjb25maWcvdGMtdjg1MC5jOjI5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzozMjQgY29uZmlnL3RjLWFyYy5jOjgxNSBjb25maWcvdGMtdjg1MC5jOjMyMgotbXNnaWQgIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjM0MyBjb25maWcvdGMtbTMyci5jOjY2NCBjb25maWcvdGMtcHBjLmM6MTM5NQotIzogY29uZmlnL3RjLXY4NTAuYzozODUKLW1zZ2lkICJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo0MDYgY29uZmlnL3RjLWFyYy5jOjg3NSBjb25maWcvdGMtc3BhcmMuYzozMzA2Ci0jOiBjb25maWcvdGMtdjg1MC5jOjU2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NTkxCi1tc2dpZCAiTWlzc2luZyBzZWN0aW9uIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo2NTYKLW1zZ2lkICJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlOiB3YW50IGEsdyx4IGluIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjcwNQotbXNnaWQgIlVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3MTkKLW1zZ2lkICJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlIC0gY2hhcmFjdGVyIGZvbGxvd2luZyBuYW1lIGlzIG5vdCAnIyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3NTEKLW1zZ2lkICJVbnJlY29nbml6ZWQgc2VjdGlvbiBhdHRyaWJ1dGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2V0dGluZyBpbmNvcnJlY3Qgc2VjdGlvbiB0eXBlIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjc4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIGF0dHJpYnV0ZXMgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6OTA3Ci1tc2dpZCAiLnByZXZpb3VzIHdpdGhvdXQgY29ycmVzcG9uZGluZyAuc2VjdGlvbjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjk1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJtdWx0aXBsZSAuc3ltdmVyIGRpcmVjdGl2ZXMgZm9yIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6OTY1Ci1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6OTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1pc3NpbmcgdmVyc2lvbiBuYW1lIGluIGAlcycgZm9yIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTE5MyBjb25maWcvb2JqLXNvbS5jOjE0OCBjb25maWcvb2JqLXNvbS5jOjE5MwotbXNnaWQgIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgYCVzJyBpbiAuc2l6ZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMjIzCi1tc2dpZCAibWlzc2luZyBleHByZXNzaW9uIGluIC5zaXplIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjEyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgdW5yZWNvZ25pemVkIHN5bWJvbCB0eXBlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE0NjQKLW1zZ2lkICIuc2l6ZSBleHByZXNzaW9uIHRvbyBjb21wbGljYXRlZCB0byBmaXggdXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJpbnZhbGlkIGF0dGVtcHQgdG8gZGVjbGFyZSBleHRlcm5hbCB2ZXJzaW9uIG5hbWUgYXMgZGVmYXVsdCBpbiBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE2MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmFpbGVkIHRvIHNldCB1cCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBzdGFydCB3cml0aW5nIC5tZGVidWcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNjQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvdWxkIG5vdCB3cml0ZSAubWRlYnVnIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotaWVlZS5jOjQ2MAotbXNnaWQgInRvbyBtYW55IHNlY3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotc29tLmM6MTMxCi1tc2dpZCAiT25seSBvbmUgLnZlcnNpb24gcHNldWRvLW9wIHBlciBmaWxlISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjE1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQXR0YWNoaW5nIHZlcnNpb24gaGVhZGVyICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotc29tLmM6MTc2Ci1tc2dpZCAiT25seSBvbmUgLmNvcHlyaWdodCBwc2V1ZG8tb3AgcGVyIGZpbGUhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotc29tLmM6MjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZBVEFMOiBBdHRhY2hpbmcgY29weXJpZ2h0IGhlYWRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjb21waWxlciBlbWl0dGVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvbXBpbGVyIHJlZGVmaW5lZCB6ZXJvLXNpemUgY29tbW9uIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvdWxkbid0IGNyZWF0ZSBWTVMgb2JqZWN0IGZpbGUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NjIzCi1tc2dpZCAiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIChsZW5ndGggcHJlZml4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjYzNwotbXNnaWQgIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjEyNDAKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIHNvdXJjZSBmaWxlIFwiJXNcIiwgc3RhdHVzPSUlWCV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MTc0OSBjb25maWcvb2JqLXZtcy5jOjI5MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgZm9yd2FyZCByZWZlcmVuY2UgZXJyb3IsIGRieCB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MTgyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJWYXJpYWJsZSBkZXNjcmlwdG9yICVkIHRvbyBjb21wbGljYXRlZC4gIERlZmluZWQgYXMgYHZvaWQgKicuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MjE0NAotbXNnaWQgIiIKLSIqKipXYXJuaW5nIC0gdGhlIGFzc2VtYmx5IGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBoYXMgcGxhY2VkIFxuIgotIiBnbG9iYWwgY29uc3RhbnQocykgaW4gdGhlIHRleHQgcHNlY3QuICBUaGVzZSB3aWxsIG5vdCBiZSBhdmFpbGFibGUgdG8gXG4iCi0iIG90aGVyIG1vZHVsZXMsIHNpbmNlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0IHdheSB0byBoYW5kbGUgdGhpcy4gWW91IFxuIgotIiBoYXZlIHR3byBvcHRpb25zOiAxKSBnZXQgYSBwYXRjaGVkIGNvbXBpbGVyIHRoYXQgZG9lcyBub3QgcHV0IGdsb2JhbCBcbiIKLSIgY29uc3RhbnRzIGluIHRoZSB0ZXh0IHBzZWN0LCBvciAyKSByZW1vdmUgdGhlICdjb25zdCcga2V5d29yZCBmcm9tIFxuIgotIiBkZWZpbml0aW9ucyBvZiBnbG9iYWwgdmFyaWFibGVzIGluIHlvdXIgc291cmNlIG1vZHVsZShzKS4gIERvbid0IHNheSBcbiIKLSIgSSBkaWRuJ3Qgd2FybiB5b3UhIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MjQ2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWJ1Z2dpbmVyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB1bnR5cGVkIHZhcmlhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI2ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgb3V0cHV0OiBzdHJ1Y3R1cmUgZWxlbWVudCBgJXMnIGhhcyB1bmRlZmluZWQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI3OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgb3V0cHV0OiAlZCBpcyBhbiB1bmtub3duIHR5cGUgb2YgdmFyaWFibGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MjkyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWJ1Z2dlciBvdXRwdXQ6IFVuYWJsZSB0byByZXNvbHZlICVkIGNpcmN1bGFyIHJlZmVyZW5jZXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MzEzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJNb2R1bGUgbmFtZSB0cnVuY2F0ZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzozNDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyByZXBsYWNlZCBieSAlc1xuIgotbXNnc3RyICIiCi0KLSMuIGltcG9zc2libGUKLSM6IGNvbmZpZy9vYmotdm1zLmM6MzY5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIFZNUyBwc2VjdCB0eXBlICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MzczNQotIywgYy1mb3JtYXQKLW1zZ2lkICJHbG9iYWxzeW1ib2wgYXR0cmlidXRlIGZvciBzeW1ib2wgJXMgd2FzIHVuZXhwZWN0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6Mzg4NQotbXNnaWQgIkludmFsaWQgZGF0YSB0eXBlIGZvciBnbG9iYWx2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM4OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBnbG9iYWx2YWx1ZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQyNDcKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIGZpeHVwIGZyYWdtZW50IHdoZW4gY2hlY2tpbmcgZm9yIGluZGlyZWN0IHJlZmVyZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ1OTEgY29uZmlnL29iai12bXMuYzo0NzMzCi1tc2dpZCAiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDU5NSBjb25maWcvb2JqLXZtcy5jOjQ3MzcKLW1zZ2lkICJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIGFuIGFwcHJvcHJpYXRlIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NTk4IGNvbmZpZy9vYmotdm1zLmM6NDc0MAotbXNnaWQgIkZpeHVwIGRhdGEgaXMgZXJyb25lb3VzbHkgXCJwY3JlbFwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDYxNCBjb25maWcvb2JqLXZtcy5jOjQ3NTkKLW1zZ2lkICJGaXh1cCBkYXR1bSBpcyBub3QgYSBsb25nd29yZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ2MTggY29uZmlnL29iai12bXMuYzo0NzYzCi1tc2dpZCAiRml4dXAgZGF0dW0gaXMgbm90IFwiZml4UC0+ZnhfYWRkc3lcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ4MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImcrKyB3cm90ZSBhbiBleHRlcm4gcmVmZXJlbmNlIHRvIGAlcycgYXMgYSByb3V0aW5lLlxuIgotIkkgd2lsbCBmaXggaXQsIGJ1dCBJIGhvcGUgdGhhdCBpdCB3YXMgbm90ZSByZWFsbHkgYSByb3V0aW5lLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ5NjYKLW1zZ2lkICJDYW4ndCBoYW5kbGUgZ2xvYmFsIHh0b3JzIHN5bWJvbHMgeWV0LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ5NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biAlcyIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKglFcnJvciBvdGhlcndpc2UuCi0jLgotIzogY29uZmlnL29iai12bXMuYzo1MDU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaGFuZGxlZCBzdGFiIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxNjAgY29uZmlnL3RjLXNwYXJjLmM6MzM1OAotbXNnaWQgIlVua25vd24gc2VnbWVudCB0eXBlIgotbXNnc3RyICIiCi0KLSMuIFByb2JhYmx5IGEgbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbT8gIEdpdmUgdXAgbm93LgotIzogY29uZmlnL3RjLWEyOWsuYzozMzAgY29uZmlnL3RjLWhwcGEuYzoxMzM2IGNvbmZpZy90Yy1pODYwLmM6MjAyCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMTYgY29uZmlnL3RjLW1pcHMuYzoxMDU4IGNvbmZpZy90Yy1zcGFyYy5jOjcxNQotbXNnaWQgIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6Mzc1IGNvbmZpZy90Yy1hcmMuYzo1MzQgY29uZmlnL3RjLWQxMHYuYzo0ODEKLSM6IGNvbmZpZy90Yy1kMzB2LmM6NTQwIGNvbmZpZy90Yy1oODMwMC5jOjMwNSBjb25maWcvdGMtaDg1MDAuYzoyOTcKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjUwOSBjb25maWcvdGMtbW4xMDIwMC5jOjkzNiBjb25maWcvdGMtbW4xMDMwMC5jOjk5MgotIzogY29uZmlnL3RjLXBwYy5jOjE4NTAgY29uZmlnL3RjLXNoLmM6NDc4IGNvbmZpZy90Yy10aWM4MC5jOjI5MQotIzogY29uZmlnL3RjLXY4NTAuYzoyMDMzIGNvbmZpZy90Yy13NjUuYzoyNTcgY29uZmlnL3RjLXo4ay5jOjM0MQotbXNnaWQgIm1pc3Npbmcgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQxNSBjb25maWcvdGMtaHBwYS5jOjE0NTAgY29uZmlnL3RjLWk4NjAuYzo0MDcKLSM6IGNvbmZpZy90Yy1pODYwLmM6NDIzIGNvbmZpZy90Yy1zcGFyYy5jOjExOTEgY29uZmlnL3RjLXNwYXJjLmM6MTE5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIG9wY29kZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIG9wY29kZSBgJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQ1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJUb28gbWFueSBvcGVyYW5kczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo0NzQgY29uZmlnL3RjLWEyOWsuYzo1MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW1tZWRpYXRlIHZhbHVlIG9mICVsZCBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo4OTIgY29uZmlnL3RjLWk4NjAuYzo5NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6OTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5lZWQgJW8zXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo5MzIKLW1zZ2lkICJhMjlrX2NvbnZlcnRfZnJhZ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6OTQxCi1tc2dpZCAiYTI5a19lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJsYWJlbCBcIiQlZFwiIHJlZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjExNjUKLW1zZ2lkICJJbnZhbGlkIGV4cHJlc3Npb24gYWZ0ZXIgJSUlJVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTE3NgotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgaW4gJiBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjcyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBvcGNvZGUgYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG1hY3JvIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjgzMiBjb25maWcvdGMtaTk2MC5jOjI3MzYKLW1zZ2lkICJzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6OTA1IGNvbmZpZy90Yy1hcm0uYzo0OTgyIGNvbmZpZy90Yy1oODMwMC5jOjE0MTMKLSM6IGNvbmZpZy90Yy1oODUwMC5jOjEyMjIgY29uZmlnL3RjLWhwcGEuYzoyNjg0IGNvbmZpZy90Yy1pODYwLmM6ODEzCi0jOiBjb25maWcvdGMtbTY4ay5jOjQxMjUgY29uZmlnL3RjLW04OGsuYzoxMTA2IGNvbmZpZy90Yy1uczMyay5jOjE1ODgKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI0MzMgY29uZmlnL3RjLXo4ay5jOjEzNTUKLW1zZ2lkICJCYWQgY2FsbCB0byBNRF9BVE9GKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6OTU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gQ1BVIGlkZW50aWZpZXIgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo5OTkKLW1zZ2lkICIiCi0iQWxwaGEgb3B0aW9uczpcbiIKLSItMzJhZGRyXHRcdFx0dHJlYXQgYWRkcmVzc2VzIGFzIDMyLWJpdCB2YWx1ZXNcbiIKLSItRlx0XHRcdGxhY2sgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRcbiIKLSItbWV2NCB8IC1tZXY0NSB8IC1tZXY1IHwgLW1ldjU2IHwgLW1wY2E1NiB8IC1tZXY2IHwgLW1hbGxcbiIKLSJcdFx0XHRzcGVjaWZ5IHZhcmlhbnQgb2YgQWxwaGEgYXJjaGl0ZWN0dXJlXG4iCi0iLW0yMTA2NCB8IC1tMjEwNjYgfCAtbTIxMTY0IHwgLW0yMTE2NGEgfCAtbTIxMTY0cGMgfCAtbTIxMjY0XG4iCi0iXHRcdFx0dGhlc2UgdmFyaWFudHMgaW5jbHVkZSBQQUxjb2RlIG9wY29kZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMDA5Ci1tc2dpZCAiIgotIlZNUyBvcHRpb25zOlxuIgotIi0rXHRcdFx0aGFzaCBlbmNvZGUgKGRvbid0IHRydW5jYXRlKSBuYW1lcyBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzXG4iCi0iLUhcdFx0XHRzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTE2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjExNzgKLW1zZ2lkICJub24tYWJzb2x1dGUgZXhwcmVzc2lvbiBpbiBjb25zdGFudCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgInR5cGUgJWQgcmVsb2MgZG9uZT9cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMjQzIGNvbmZpZy90Yy1hbHBoYS5jOjEyNTAgY29uZmlnL3RjLW1pcHMuYzo3MzI5Ci1tc2dpZCAiVXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlcHJlc2VudCBgJXMnIHJlbG9jYXRpb24gaW4gb2JqZWN0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTQxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcj8gY2Fubm90IGdlbmVyYXRlIGAlcycgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxNDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZyYW1lIHJlZyBleHBlY3RlZCwgdXNpbmcgJCVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxNzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlZCBhbmQgJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE4OTEgY29uZmlnL3RjLWFyYy5jOjU0NyBjb25maWcvdGMtZDEwdi5jOjU3MAotIzogY29uZmlnL3RjLWQzMHYuYzo2MjMgY29uZmlnL3RjLW1uMTAyMDAuYzo5OTEgY29uZmlnL3RjLW1uMTAzMDAuYzoxMDU4Ci0jOiBjb25maWcvdGMtcHBjLmM6MTgxNiBjb25maWcvdGMtcHBjLmM6MTkyMyBjb25maWcvdGMtcHBjLmM6MTkzNQotIzogY29uZmlnL3RjLXY4NTAuYzoxODE5IGNvbmZpZy90Yy12ODUwLmM6MTg0MiBjb25maWcvdGMtdjg1MC5jOjIwNTUKLW1zZ2lkICJ0b28gbWFueSBmaXh1cHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjAxNiBjb25maWcvdGMtYWxwaGEuYzoyMDc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImluYXBwcm9wcmlhdGUgYXJndW1lbnRzIGZvciBvcGNvZGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMDE4IGNvbmZpZy90Yy1hbHBoYS5jOjIwNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3Bjb2RlIGAlcycgbm90IHN1cHBvcnRlZCBmb3IgdGFyZ2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIwMjIgY29uZmlnL3RjLWFscGhhLmM6MjA3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wY29kZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIxMzEKLW1zZ2lkICJjYW4gbm90IHJlc29sdmUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMjY5IGNvbmZpZy90Yy1hbHBoYS5jOjI0NDYKLW1zZ2lkICJvdmVyZmxvdyBpbiBsaXRlcmFsICgubGl0YSkgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjI3NiBjb25maWcvdGMtYWxwaGEuYzoyMjk4IGNvbmZpZy90Yy1hbHBoYS5jOjI0NTkKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI2ODEgY29uZmlnL3RjLWFscGhhLmM6MjcyOCBjb25maWcvdGMtYWxwaGEuYzoyNzc2Ci0jOiBjb25maWcvdGMtYWxwaGEuYzoyODY1IGNvbmZpZy90Yy1hbHBoYS5jOjMwNjYgY29uZmlnL3RjLWFscGhhLmM6MzE2NwotbXNnaWQgIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMjc4IGNvbmZpZy90Yy1hbHBoYS5jOjIzMDAgY29uZmlnL3RjLWFscGhhLmM6MjQ2MQotbXNnaWQgIm1hY3JvIHJlcXVpcmVzICRhdCB3aGlsZSAkYXQgaW4gdXNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI0MDggZXhwci5jOjg2IHJlYWQuYzozMTI1Ci1tc2dpZCAiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyNDEwIGV4cHIuYzo4OCByZWFkLmM6MzEyNyByZWFkLmM6MzQ1NyByZWFkLmM6NDM1MwotbXNnaWQgImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjQxNQotbXNnaWQgImNhbid0IGhhbmRsZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI0NTIKLW1zZ2lkICJvdmVyZmxvdyBpbiBsaXRlcmFsICgubGl0OCkgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzQwMSBjb25maWcvdGMtcHBjLmM6MTM0NCBjb25maWcvdGMtcHBjLmM6MzU0OAotIzogcmVhZC5jOjEzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNDM5IGNvbmZpZy90Yy1hbHBoYS5jOjM0NDggY29uZmlnL3RjLXBwYy5jOjM1ODUKLSM6IHJlYWQuYzoxMzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzU1MCBlY29mZi5jOjMxMDgKLW1zZ2lkICIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNTU4Ci1tc2dpZCAibmVzdGVkIC5lbnQgZGlyZWN0aXZlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNTk0IGVjb2ZmLmM6MzA1NgotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM2MDMKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSBuYW1lcyBkaWZmZXJlbnQgc3ltYm9sIHRoYW4gLmVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNjc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgJWQgdG8gLnByb2xvZ3VlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNzA2Ci1tc2dpZCAiRUNPRkYgZGVidWdnaW5nIGlzIGRpc2FibGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNzI3Ci1tc2dpZCAiVW5rbm93biBzZWN0aW9uIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNzY0Ci1tc2dpZCAiLmVudCBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNzkyCi1tc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMS4vMi4gcGFyYW0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzgwNAotbXNnaWQgIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDMuLzQuIHBhcmFtIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4MjkKLW1zZ2lkICIucGRlc2MgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODM3Ci1tc2dpZCAiLnBkZXNjIGhhcyBubyBtYXRjaGluZyAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4NDcKLW1zZ2lkICIucGRlc2MgZGlyZWN0aXZlIGhhcyBubyBlbnRyeSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzg1OQotbXNnaWQgIk5vIGNvbW1hIGFmdGVyIC5wZGVzYyA8ZW50cnluYW1lPiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODgyCi1tc2dpZCAidW5rbm93biBwcm9jZWR1cmUga2luZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozOTc3Ci1tc2dpZCAiLm5hbWUgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozOTg1Ci1tc2dpZCAiLm5hbWUgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDAyMAotbXNnaWQgIk5vIHN5bWJvbCBhZnRlciAubGlua2FnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MDQ5Ci1tc2dpZCAiTm8gc3ltYm9sIGFmdGVyIC5jb2RlX2FkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDA4NCBlY29mZi5jOjMyNzMKLW1zZ2lkICJCYWQgLm1hc2sgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQxMDYgZWNvZmYuYzozMjA0Ci1tc2dpZCAiQmFkIC5mbWFzayBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDI3NyByZWFkLmM6MjE0NCByZWFkLmM6MjY5NiBzdGFicy5jOjQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jLiBzeW1ib2xQLT5zeV9vdGhlciA9IChzaWduZWQgY2hhcikgdGVtcDsKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQyODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5oYW5kbGVkOiAucHJvYyAlcywlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRyaWVkIHRvIC5zZXQgdW5yZWNvZ25pemVkIG1vZGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jLiBub3QgZmF0YWwsIGJ1dCBpdCBtaWdodCBub3Qgd29yayBpbiB0aGUgZW5kCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MzQwCi1tc2dpZCAiRmlsZSBvdmVycmlkZXMgbm8tYmFzZS1yZWdpc3RlciBvcHRpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIGJhc2UgcmVnaXN0ZXIsIHVzaW5nICQlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDM3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MzgzIGNvbmZpZy90Yy1kMzB2LmM6MjE2MwotbXNnaWQgIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2hvc2UgR1AgdmFsdWUgb2YgJWx4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEzNgotbXNnaWQgIiIKLSJBUkMgb3B0aW9uczpcbiIKLSItRUJcdFx0XHRnZW5lcmF0ZSBiaWcgZW5kaWFuIG91dHB1dFxuIgotIi1FTFx0XHRcdGdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjE1NCBjb25maWcvdGMtYXJjLmM6MTc3IGNvbmZpZy90Yy1hcmMuYzo5MjEKLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTI5OCBjb25maWcvdGMtaHBwYS5jOjUwNTQgY29uZmlnL3RjLWhwcGEuYzo1MDYwCi0jOiBjb25maWcvdGMtaHBwYS5jOjUwNjYgY29uZmlnL3RjLW1uMTAzMDAuYzo3MjEgY29uZmlnL3RjLW1uMTAzMDAuYzoxNjQ2Ci1tc2dpZCAiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjE3NAotbXNnaWQgInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MjUzIGNvbmZpZy90Yy1tbjEwMjAwLmM6MTM1NCBjb25maWcvdGMtbW4xMDMwMC5jOjE1NjUKLSM6IGNvbmZpZy90Yy1wcGMuYzoxMTAxIGNvbmZpZy90Yy12ODUwLmM6MTYxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzozODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBzeW50YXggZm9ybWF0IGNoYXJhY3RlciBgJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo0ODcKLW1zZ2lkICJ0b28gbWFueSBzdWZmaXhlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NTMyIGNvbmZpZy90Yy1kMTB2LmM6NDc5IGNvbmZpZy90Yy1kMzB2LmM6NTM4Ci0jOiBjb25maWcvdGMtbW4xMDIwMC5jOjkzMyBjb25maWcvdGMtbW4xMDMwMC5jOjk4OSBjb25maWcvdGMtcHBjLmM6MTg0OAotIzogY29uZmlnL3RjLXRpYzgwLmM6Mjg3IGNvbmZpZy90Yy12ODUwLmM6MjAzMAotbXNnaWQgImlsbGVnYWwgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NjE5IGNvbmZpZy90Yy1tbjEwMjAwLmM6MTAzMiBjb25maWcvdGMtbW4xMDMwMC5jOjExMjgKLSM6IGNvbmZpZy90Yy1wcGMuYzoxOTcyIGNvbmZpZy90Yy12ODUwLmM6MjEwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2NTkKLW1zZ2lkICI4IGJ5dGUgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NjYxCi1tc2dpZCAiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2NjkKLW1zZ2lkICJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjc0OCBjb25maWcvdGMtYXJtLmM6NjAzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NzcxCi1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjc4OAotbXNnaWQgImlnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6ODAzCi1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6ODk2Ci1tc2dpZCAiLmNwdSBjb21tYW5kIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5MTUKLW1zZ2lkICIuY3B1IGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5MjYKLW1zZ2lkICJiYWQgLmNwdSBvcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6OTUwIGNvbmZpZy90Yy1wcGMuYzoyNjIxCi1tc2dpZCAibWlzc2luZyByZW5hbWUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5NjIKLW1zZ2lkICJpbnZhbGlkIHN5bWJvbCB0byByZW5hbWUgdG8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEwMDkgY29uZmlnL3RjLWQxMHYuYzoyNzQgY29uZmlnL3RjLWQzMHYuYzozNTMKLSM6IGNvbmZpZy90Yy1taXBzLmM6ODczNiBjb25maWcvdGMtbW4xMDIwMC5jOjM1NiBjb25maWcvdGMtcHBjLmM6NDM2OQotIzogY29uZmlnL3RjLXNoLmM6MTE4NyBjb25maWcvdGMtdjg1MC5jOjEyNzYKLW1zZ2lkICJiYWQgY2FsbCB0byBtZF9hdG9mIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMDk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1pc3NpbmcgJyknIGluICUtb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjExMzAKLW1zZ2lkICJleHByZXNzaW9uIHRvbyBjb21wbGV4IGZvciAlJXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMzI0IGNvbmZpZy90Yy1hcm0uYzoyOTM3IGNvbmZpZy90Yy1kMTB2LmM6MTQ0OAotIzogY29uZmlnL3RjLWQzMHYuYzoxODEwIGNvbmZpZy90Yy1taXBzLmM6MzE5NiBjb25maWcvdGMtbWlwcy5jOjQxMjgKLSM6IGNvbmZpZy90Yy1taXBzLmM6NDkxMyBjb25maWcvdGMtbWlwcy5jOjU0NTkgY29uZmlnL3RjLXBwYy5jOjQ3MDQKLSM6IGNvbmZpZy90Yy12ODUwLmM6MjMzOQotbXNnaWQgImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEzOTAgY29uZmlnL3RjLXBwYy5jOjQ4MDcgY29uZmlnL3RjLXY4NTAuYzoyMzgzCi1tc2dpZCAidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTQ1NCBjb25maWcvdGMtc3BhcmMuYzoyODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjk4MwotbXNnaWQgIkxpdGVyYWwgUG9vbCBPdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTEwMwotbXNnaWQgIkludmFsaWQgc3ludGF4IGZvciAucmVxIGRpcmVjdGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExMzkKLW1zZ2lkICJOb3RoaW5nIHRvIHB1dCBpbiB0aGUgcG9vbFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMTUxCi1tc2dpZCAiSW5zZXJ0aW5nIGltcGxpY2l0IHBvb2wgYXQgY2hhbmdlIG9mIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExODMgY29uZmlnL3RjLW1pcHMuYzo5ODUxIHJlYWQuYzoyMDM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTE4NiByZWFkLmM6MjA0MwotbXNnaWQgIkFsaWdubWVudCBuZWdhdGl2ZS4gMCBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTI1MQotbXNnaWQgInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IFRIVU1CIG9wY29kZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEyNjMKLW1zZ2lkICJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBBUk0gb3Bjb2RlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTI3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGluc3RydWN0aW9uIHNpemUgc2VsZWN0ZWQgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTMwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgdG8gLmNvZGUgZGlyZWN0aXZlICglZCkgKGV4cGVjdGluZyAxNiBvciAzMikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEzMTkKLW1zZ2lkICJHYXJiYWdlIGZvbGxvd2luZyBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0jLiB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuCi0jOiBjb25maWcvdGMtYXJtLmM6MTM2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWdpc3RlciBleHBlY3RlZCwgbm90ICclLjEwMHMnIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMzkzCi1tc2dpZCAiPHBzcihmKT4gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE0MjQKLW1zZ2lkICJJbGxlZ2FsIGNvLXByb2Nlc3NvciBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE0MzEKLW1zZ2lkICJCYWQgb3IgbWlzc2luZyBjby1wcm9jZXNzb3IgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDU2Ci1tc2dpZCAiYmFkIG9yIG1pc3NpbmcgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTQ2MgotbXNnaWQgImltbWVkaWF0ZSBjby1wcm9jZXNzb3IgZXhwcmVzc2lvbiB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIy4gSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotIy4gdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbgotIzogY29uZmlnL3RjLWFybS5jOjE0ODcKLW1zZ2lkICJDby1wcm9jZXNzb3IgcmVnaXN0ZXIgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIy4gSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotIy4gdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbgotIzogY29uZmlnL3RjLWFybS5jOjE1MTEKLW1zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTUyOQotbXNnaWQgImltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNTQ0Ci1tc2dpZCAiY28tcHJvY2Vzc29yIGFkZHJlc3MgbXVzdCBiZSB3b3JkIGFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE1NTAKLW1zZ2lkICJvZmZzZXQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjAwCi1tc2dpZCAicGMgbWF5IG5vdCBiZSB1c2VkIGluIHBvc3QtaW5jcmVtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjE2IGNvbmZpZy90Yy1hcm0uYzoyNzI3Ci1tc2dpZCAicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTYzMCBjb25maWcvdGMtYXJtLmM6Mjc0MCBjb25maWcvdGMtYXJtLmM6MzA4OQotbXNnaWQgIm1pc3NpbmcgXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTY0MQotbXNnaWQgInBjIG1heSBub3QgYmUgdXNlZCB3aXRoIHdyaXRlLWJhY2siCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2OTYKLW1zZ2lkICI8cHNyPiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTc1OCBjb25maWcvdGMtYXJtLmM6MjM3OAotbXNnaWQgIlJlZ2lzdGVyIG9yIHNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE3NzIgY29uZmlnL3RjLWFybS5jOjIwOTAgY29uZmlnL3RjLWFybS5jOjIzNDUKLSM6IGNvbmZpZy90Yy1hcm0uYzoyMzY1Ci1tc2dpZCAiSW52YWxpZCBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTc4MwotbXNnaWQgIkVycm9yOiB1bnJlY29nbmlzZWQgc3ludGF4IGZvciBzZWNvbmQgYXJndW1lbnQgdG8gbXNyIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxODMzCi1tc2dpZCAicmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxODkwCi1tc2dpZCAicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbXVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxOTQ3Ci1tc2dpZCAicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbWxhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMDc0Ci1tc2dpZCAiYmFkX3NlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIxMjEgY29uZmlnL3RjLWFybS5jOjIxOTkKLW1zZ2lkICJTaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMTYzCi1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgc2hpZnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIxOTIKLW1zZ2lkICJzaGlmdCByZXF1aXJlcyByZWdpc3RlciBvciAjZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjE5MwotbXNnaWQgInNoaWZ0IHJlcXVpcmVzICNleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMzM2IGNvbmZpZy90Yy1hcm0uYzoyNzcwCi1tc2dpZCAiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjQzMgotbXNnaWQgIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI0MzUKLW1zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBvciBpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjU3NAotbXNnaWQgImFkZHJlc3Mgb2Zmc2V0IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjY0NQotbXNnaWQgIlByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGhhbGZ3b3JkcyBvciBzaWduZWQgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI2NjcKLW1zZ2lkICJBZGRyZXNzIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNjk4IGNvbmZpZy90Yy1hcm0uYzoyNzEyIGNvbmZpZy90Yy1hcm0uYzoyNzUwCi1tc2dpZCAiZGVzdGluYXRpb24gcmVnaXN0ZXIgc2FtZSBhcyB3cml0ZS1iYWNrIGJhc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjc5MAotbXNnaWQgImxpdGVyYWwgcG9vbCBpbnNlcnRpb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyODI2Ci1tc2dpZCAiUHJlLWluY3JlbWVudCBpbnN0cnVjdGlvbiB3aXRoIHRyYW5zbGF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjg2OAotbXNnaWQgIkJhZCByYW5nZSBpbiByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyODc2IGNvbmZpZy90Yy1hcm0uYzoyODg1IGNvbmZpZy90Yy1hcm0uYzoyOTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IER1cGxpY2F0ZWQgcmVnaXN0ZXIgKHIlZCkgaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjg4OAotbXNnaWQgIldhcm5pbmc6IFJlZ2lzdGVyIHJhbmdlIG5vdCBpbiBhc2NlbmRpbmcgb3JkZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI5MDAKLW1zZ2lkICJNaXNzaW5nIGB9JyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjkxNgotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbWFzayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjk3NwotbXNnaWQgInIxNSBub3QgYWxsb3dlZCBhcyBiYXNlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozMDQ3IGNvbmZpZy90Yy1hcm0uYzozMDYxCi1tc2dpZCAicjE1IG5vdCBhbGxvd2VkIGluIHN3YXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjMxNTgKLW1zZ2lkICJVc2Ugb2YgcjE1IGluIGJ4IGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNDE3IGNvbmZpZy90Yy12ODUwLmM6MTkyMSBjb25maWcvdGMtdjg1MC5jOjE5NDIKLW1zZ2lkICJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNDIzCi1tc2dpZCAiQ29uc3RhbnQgdmFsdWUgcmVxdWlyZWQgZm9yIG51bWJlciBvZiByZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM0MzEKLW1zZ2lkICJudW1iZXIgb2YgcmVnaXN0ZXJzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFsxOjRdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNDkzCi1tc2dpZCAiUjE1IG5vdCBhbGxvd2VkIGFzIGJhc2UgcmVnaXN0ZXIgd2l0aCB3cml0ZS1iYWNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNzQ1Ci1tc2dpZCAibG8gcmVnaXN0ZXIgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM3NTMKLW1zZ2lkICJoaSByZWdpc3RlciByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzgyMwotbXNnaWQgImRlc3QgYW5kIHNvdXJjZTEgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzgzMAotbXNnaWQgInN1YnRyYWN0IHZhbGlkIG9ubHkgb24gbG8gcmVncyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzg1NAotbXNnaWQgImludmFsaWQgSGkgcmVnaXN0ZXIgd2l0aCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4ODEgY29uZmlnL3RjLWFybS5jOjM5MTQgY29uZmlnL3RjLWFybS5jOjM5MjQKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozODkyCi1tc2dpZCAiaW52YWxpZCBpbW1lZGlhdGUgdmFsdWUgZm9yIHN0YWNrIGFkanVzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzkwMwotbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozOTkwCi1tc2dpZCAic291cmNlMSBhbmQgZGVzdCBtdXN0IGJlIHNhbWUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQwMjUKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc2hpZnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQxMDQKLW1zZ2lkICJvbmx5IGxvIHJlZ3MgYWxsb3dlZCB3aXRoIGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDEyMwotbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MTc4Ci1tc2dpZCAiZXhwZWN0ZWQgJ10nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MjQ1Ci1tc2dpZCAiYnl0ZSBvciBoYWxmd29yZCBub3QgdmFsaWQgZm9yIGJhc2UgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyNTAKLW1zZ2lkICJSMTUgYmFzZWQgc3RvcmUgbm90IGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyNTUKLW1zZ2lkICJJbnZhbGlkIGJhc2UgcmVnaXN0ZXIgZm9yIHJlZ2lzdGVyIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDI3MwotbXNnaWQgImludmFsaWQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0Mjg0Ci1tc2dpZCAiaW52YWxpZCBiYXNlIHJlZ2lzdGVyIGluIGxvYWQvc3RvcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQzMDggY29uZmlnL3RjLWFybS5jOjU0NjkgY29uZmlnL3RjLWFybS5jOjU0NzgKLSM6IGNvbmZpZy90Yy1hcm0uYzo1NDg1IGNvbmZpZy90Yy1hcm0uYzo1NDkyIGNvbmZpZy90Yy1hcm0uYzo1NDk5Ci1tc2dpZCAiSW52YWxpZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQzODYKLW1zZ2lkICJkZXN0IGFuZCBzb3VyY2UxIG9uZSBtdXN0IGJlIHRoZSBzYW1lIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0Mzk0Ci1tc2dpZCAiUnMgYW5kIFJkIG11c3QgYmUgZGlmZmVyZW50IGluIE1VTCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDUzOQotbXNnaWQgIiIKLSJJbnNlcnRlZCBtaXNzaW5nICchJzogbG9hZC9zdG9yZSBtdWx0aXBsZSBhbHdheXMgd3JpdGVzIGJhY2sgYmFzZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDU1NSBjb25maWcvdGMtYXJtLmM6NDY1NwotbXNnaWQgIkV4cHJlc3Npb24gdG9vIGNvbXBsZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ1NjEKLW1zZ2lkICJvbmx5IGxvLXJlZ3MgdmFsaWQgaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDYwOAotbXNnaWQgIlN5bnRheDogbGRyc1tiXSBSZCwgW1JiLCBSb10iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ2NzMKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QgdG8gcHVzaC9wb3AgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ4MTEKLW1zZ2lkICJWaXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjb25zdGFudCAoJXgpIGFmdGVyIGZpeHVwXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyMTUgY29uZmlnL3RjLWFybS5jOjUyMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGltbWVkaWF0ZSB2YWx1ZSBmb3Igb2Zmc2V0ICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyMzQgY29uZmlnL3RjLWFybS5jOjUyNTcKLW1zZ2lkICJpbnZhbGlkIGxpdGVyYWwgY29uc3RhbnQ6IHBvb2wgbmVlZHMgdG8gYmUgY2xvc2VyXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyNzQKLW1zZ2lkICJzaGlmdCBleHByZXNzaW9uIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTI5MiBjb25maWcvdGMtYXJtLmM6NTMwMQotbXNnaWQgIkludmFsaWQgc3dpIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUzMTEKLW1zZ2lkICJJbnZhbGlkIGV4cHJlc3Npb24gaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTMzOSBjb25maWcvdGMtYXJtLmM6NTM1NSBjb25maWcvdGMtbWlwcy5jOjk2NzgKLW1zZ2lkICJCcmFuY2ggb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1Mzc0Ci1tc2dpZCAiQnJhbmNoIHdpdGggbGluayBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU0NDEKLW1zZ2lkICJJbGxlZ2FsIHZhbHVlIGZvciBjby1wcm9jZXNzb3Igb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb2Zmc2V0LCB0YXJnZXQgbm90IHdvcmQgYWxpZ25lZCAoMHglMDhYKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTUzNQotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIGZvciBzdGFjayBhZGRyZXNzIGNhbGN1bGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uICh2YWx1ZSA9IDB4JTA4WCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1NTMKLW1zZ2lkICJJbnZhbGlkIDhiaXQgaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTYxCi1tc2dpZCAiSW52YWxpZCAzYml0IGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTU3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZTogJWQgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgVGh1bWIgc2hpZnQgdmFsdWU6ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NjA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCByZWxvY2F0aW9uIGZpeHVwIHR5cGUgKCVkKVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1Njc0Ci1tc2dpZCAiTGl0ZXJhbCByZWZlcmVuY2VkIGFjcm9zcyBzZWN0aW9uIGJvdW5kcnkgKEltcGxpY2l0IGR1bXA/KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTY5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKElNTUVESUFURSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU2OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChPRkZTRVRfSU1NKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTcyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0ICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU3NDAgY29uZmlnL3RjLW1pcHMuYzoxMTE2NiBjb25maWcvdGMtc2guYzoyMjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU3NTMKLW1zZ2lkICJtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1ODIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIG9wZXJhdG9yIC0tIHN0YXRlbWVudCBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU4NzMgY29uZmlnL3RjLWFybS5jOjU5MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3Bjb2RlIGAlcycgbXVzdCBoYXZlIHN1ZmZpeCBmcm9tIDwlcz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTg5OAotbXNnaWQgIldhcm5pbmc6IFVzZSBvZiB0aGUgJ252JyBjb25kaXRpb25hbCBpcyBkZXByZWNhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYwMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgJyVzJyBkb2VzIG5vdCBleGlzdFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyB0byBub24tZXhpc3RhbnQgcmVnaXN0ZXIgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjAzMgotbXNnaWQgImlnbm9yaW5nIGluY29tcGxldGUgLnJlcSBwc2V1c28gb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIEFQQ1Mgc3dpdGNoIC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYzMzQgY29uZmlnL3RjLWFybS5jOjYzNDUgY29uZmlnL3RjLWFybS5jOjYzNTYKLSM6IGNvbmZpZy90Yy1hcm0uYzo2MzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjM2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHByb2Nlc3NvciB2YXJpYW50IC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYzOTAKLW1zZ2lkICIiCi0iIEFSTSBTcGVjaWZpYyBBc3NlbWJsZXIgT3B0aW9uczpcbiIKLSIgIC1tW2FybV1bPHByb2Nlc3NvciBuYW1lPl0gc2VsZWN0IHByb2Nlc3NvciB2YXJpYW50XG4iCi0iICAtbVthcm1ddlsyfDJhfDN8M218NHw0dF0gIHNlbGVjdCBhcmNoaXRlY3R1cmUgdmFyaWFudFxuIgotIiAgLW10aHVtYiAgICAgICAgICAgICAgICAgICBvbmx5IGFsbG93IFRodW1iIGluc3RydWN0aW9uc1xuIgotIiAgLW10aHVtYi1pbnRlcndvcmsgICAgICAgICBtYXJrIHRoZSBhc3NlbWJsZWQgY29kZSBhcyBzdXBwb3J0aW5nICIKLSJpbnRlcndvcmtpbmdcbiIKLSIgIC1tYWxsICAgICAgICAgICAgICAgICAgICAgYWxsb3cgYW55IGluc3RydWN0aW9uXG4iCi0iICAtbWZwYTEwLCAtbWZwYTExICAgICAgICAgIHNlbGVjdCBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmVcbiIKLSIgIC1tZnBlLW9sZCAgICAgICAgICAgICAgICAgZG9uJ3QgYWxsb3cgZmxvYXRpbmctcG9pbnQgbXVsdGlwbGUgIgotImluc3RydWN0aW9uc1xuIgotIiAgLW1uby1mcHUgICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBhbnkgZmxvYXRpbmctcG9pbnQgaW5zdHJ1Y3Rpb25zLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDAxCi1tc2dpZCAiICAtayAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIFBJQyBjb2RlLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDA1Ci1tc2dpZCAiIgotIiAgLW1hcGNzLTMyLCAtbWFwY3MtMjYgICAgICBzcGVjaWZ5IHdoaWNoIEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZCB0byAiCi0idXNlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MDgKLW1zZ2lkICIgIC1tYXBjcy1mbG9hdCAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgYXJncyBhcmUgcGFzc2VkIGluIEZQIHJlZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQxMQotbXNnaWQgIiIKLSIgIC1tYXBjcy1yZWVudHJhbnQgICAgICAgICAgdGhlIGNvZGUgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQvcmVlbnRyYW50XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MTYKLW1zZ2lkICIgIC1tb2FiaSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgb2xkIEVMRiBBQklcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQyMQotbXNnaWQgIiIKLSIgIC1FQiAgICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIGNwdVxuIgotIiAgLUVMICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gY3B1XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY1OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgZnVuY3Rpb24gdHlwZTogJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoyMTgKLW1zZ2lkICIiCi0iRDEwViBvcHRpb25zOlxuIgotIi1PICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplLiAgV2lsbCBkbyBzb21lIG9wZXJhdGlvbnMgaW4gcGFyYWxsZWwuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo1MjEgY29uZmlnL3RjLWQxMHYuYzo2MDMgY29uZmlnL3RjLWQzMHYuYzo2MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NjY0Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gbXVzdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCB3aXRoIGFub3RoZXIgaW5zdHJ1Y3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzE2Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gbXVzdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjcxOQotbXNnaWQgIkxvbmcgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgY29tYmluZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzU5Ci1tc2dpZCAiT25lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc2NCBjb25maWcvdGMtZDMwdi5jOjg0MwotbXNnaWQgIlR3byBJVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc2NiBjb25maWcvdGMtZDEwdi5jOjc3NCBjb25maWcvdGMtZDEwdi5jOjc4OQotIzogY29uZmlnL3RjLWQxMHYuYzo4MDIgY29uZmlnL3RjLWQzMHYuYzo4NDQgY29uZmlnL3RjLWQzMHYuYzo4NTMKLW1zZ2lkICJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc3MiBjb25maWcvdGMtZDMwdi5jOjg1MAotbXNnaWQgIlR3byBNVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc5MyBjb25maWcvdGMtZDMwdi5jOjg2OQotbXNnaWQgIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6ODA2IGNvbmZpZy90Yy1kMzB2LmM6ODgyCi1tc2dpZCAiTVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgcmlnaHQgY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6ODEwIGNvbmZpZy90Yy1kMzB2LmM6ODkwCi1tc2dpZCAidW5rbm93biBleGVjdXRpb24gdHlwZSBwYXNzZWQgdG8gd3JpdGVfMl9zaG9ydCgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTAyMyBjb25maWcvdGMtZDEwdi5jOjEwMzcgY29uZmlnL3RjLWg4MzAwLmM6MTI3OQotIzogY29uZmlnL3RjLWg4NTAwLmM6MTEyMiBjb25maWcvdGMtbWNvcmUuYzo4NDIgY29uZmlnL3RjLXNoLmM6MTA0MAotIzogY29uZmlnL3RjLXo4ay5jOjEyMjMKLW1zZ2lkICJjYW4ndCBmaW5kIG9wY29kZSAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMDUwIGNvbmZpZy90Yy1kMTB2LmM6MTA2OCBjb25maWcvdGMtZDMwdi5jOjEzNjgKLW1zZ2lkICJVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMTE2IGNvbmZpZy90Yy1kMzB2LmM6MTUwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wY29kZTogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMTk3IGNvbmZpZy90Yy1kMTB2LmM6MTM0MyBjb25maWcvdGMtdGljODAuYzo1MzcKLW1zZ2lkICJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTI0NiBjb25maWcvdGMtbTY4ay5jOjQyMzIKLW1zZ2lkICJ2YWx1ZSBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMzE4Ci1tc2dpZCAiaWxsZWdhbCBvcGVyYW5kIC0gcmVnaXN0ZXIgbmFtZSBmb3VuZCB3aGVyZSBub25lIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTM1NCBjb25maWcvdGMtdGljODAuYzo1NDgKLW1zZ2lkICJSZWdpc3RlciBudW1iZXIgbXVzdCBiZSBFVkVOIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTM4NSBjb25maWcvdGMtZDMwdi5jOjE3NTQgY29uZmlnL3RjLW1uMTAyMDAuYzoxMjM0Ci0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjE0MjUgY29uZmlnL3RjLXBwYy5jOjUwMDQgY29uZmlnL3RjLXY4NTAuYzoyMjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiByZXAgb3IgcmVwaSBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgNCBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxNTE3IGNvbmZpZy90Yy1kMzB2LmM6MTkzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWdpc3RlciBuYW1lICVzIGNvbmZsaWN0cyB3aXRoIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6Mjc2Ci1tc2dpZCAiIgotIlxuIgotIkQzMFYgb3B0aW9uczpcbiIKLSItTyAgICAgICAgICAgICAgICAgICAgICBNYWtlIGFkamFjZW50IHNob3J0IGluc3RydWN0aW9ucyBwYXJhbGxlbCBpZiAiCi0icG9zc2libGUuXG4iCi0iLW4gICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBhbGwgTk9QcyBpbnNlcnRlZCBieSB0aGUgYXNzZW1ibGVyLlxuIgotIi1OXHRcdFx0V2FybiBhYm91dCBOT1BzIGluc2VydGVkIGFmdGVyIHdvcmQgbXVsdGlwbGllcy5cbiIKLSItYyAgICAgICAgICAgICAgICAgICAgICBXYXJuIGFib3V0IHN5bWJvbHMgd2hvZXMgbmFtZXMgbWF0Y2ggcmVnaXN0ZXIgIgotIm5hbWVzLlxuIgotIi1DICAgICAgICAgICAgICAgICAgICAgIE9wcG9zaXRlIG9mIC1DLiAgLWMgaXMgdGhlIGRlZmF1bHQuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo0NTAKLW1zZ2lkICJ1bmV4cGVjdGVkIDEyLWJpdCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NDU3Ci1tc2dpZCAidW5leHBlY3RlZCAxOC1iaXQgcmVsb2MgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBOT1AgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo3MDIKLW1zZ2lkICJzZXF1ZW50aWFsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NzAyCi1tc2dpZCAicGFyYWxsZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo4MzkKLW1zZ2lkICJJbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjg1MiBjb25maWcvdGMtZDMwdi5jOjg1OSBjb25maWcvdGMtZDMwdi5jOjg3NQotIzogY29uZmlnL3RjLWQzMHYuYzo4ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjg3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzcGVjaWFsIGxlZnQgaW5zdHJ1Y3Rpb24gYCVzJyBraWxscyBpbnN0cnVjdGlvbiBgJXMnIGluIHJpZ2h0IGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEyNTAgY29uZmlnL3RjLWQzMHYuYzoxMjY3Ci1tc2dpZCAiQ2Fubm90IGFzc2VtYmxlIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTI1MgotbXNnaWQgIkZpcnN0IG9wY29kZSBpcyBsb25nLiAgVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEzMjAKLW1zZ2lkICJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCBsb2FkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTMyMgotbXNnaWQgIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIDE2LWJpdCBtdWx0aXBseSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEzNTIKLW1zZ2lkICJJbnN0cnVjdGlvbiB1c2VzIGxvbmcgdmVyc2lvbiwgc28gaXQgY2Fubm90IGJlIG1peGVkIGFzIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE0MzYgY29uZmlnL3RjLWQzMHYuYzoxNDczCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gY29uZGl0aW9uIGNvZGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjbXB1IGRvZXNuJ3Qgc3VwcG9ydCBjb25kaXRpb24gY29kZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE1MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZHMgZm9yIG9wY29kZSBgJXMnIGRvIG5vdCBtYXRjaCBhbnkgdmFsaWQgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTcyNwotbXNnaWQgIk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIGJ5dGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIHNob3J0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTgzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIHNob3J0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTg0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgcXVhZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjIwMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidmFsdWUgdG9vIGxhcmdlIHRvIGZpdCBpbiAlZCBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjI1NCBjb25maWcvdGMtaDgzMDAuYzoyNjIKLW1zZ2lkICJSZWcgbm90IHZhbGlkIGZvciBIOC8zMDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6NDIzIGNvbmZpZy90Yy1oODMwMC5jOjQyNiBjb25maWcvdGMtaDgzMDAuYzo0MjkKLSM6IGNvbmZpZy90Yy1oODMwMC5jOjQzMwotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjQ5MCBjb25maWcvdGMtaDgzMDAuYzo1NTMgY29uZmlnL3RjLWg4MzAwLmM6NTYwCi1tc2dpZCAiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjUxOCBjb25maWcvdGMtaDgzMDAuYzo1MjcgY29uZmlnL3RjLWg4MzAwLmM6NTM3Ci1tc2dpZCAiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo2MTcKLW1zZ2lkICJleHBlY3QgOjggb3IgOjE2IGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6ODIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgJXMweCVseCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjkxMAotbXNnaWQgIkNhbid0IHdvcmsgb3V0IHNpemUgb2Ygb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo5NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3Bjb2RlIGAlcycgd2l0aCB0aGVzZSBvcGVyYW5kIHR5cGVzIG5vdCBhdmFpbGFibGUgaW4gSDgvMzAwIG1vZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTAxNiBjb25maWcvdGMtaDgzMDAuYzoxMDM2Ci1tc2dpZCAiTmVlZCAjMSBvciAjMiBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEwMzEKLW1zZ2lkICIjNCBub3QgdmFsaWQgb24gSDgvMzAwLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMTEyIGNvbmZpZy90Yy1oODMwMC5jOjExNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYnJhbmNoIG9wZXJhbmQgaGFzIG9kZCBvZmZzZXQgKCVseClcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMTkxCi1tc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjAxCi1tc2dpZCAic291cmNlIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjA5Ci1tc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTIxNgotbXNnaWQgImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjI1Ci1tc2dpZCAic291cmNlIG9wZXJhbmQgbXVzdCBiZSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMzMKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyOTAgY29uZmlnL3RjLWg4NTAwLmM6MTEyOSBjb25maWcvdGMtbWlwcy5jOjc5MzIKLSM6IGNvbmZpZy90Yy1zaC5jOjEwNDcgY29uZmlnL3RjLXc2NS5jOjc1OSBjb25maWcvdGMtejhrLmM6MTIzNQotbXNnaWQgInVua25vd24gb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEzMzYKLW1zZ2lkICJtaXNtYXRjaCBiZXR3ZWVuIG9wY29kZSBzaXplIGFuZCBvcGVyYW5kIHNpemUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTM0OCBjb25maWcvdGMtaDg1MDAuYzoxMTU3IGNvbmZpZy90Yy1zaC5jOjExNDQKLSM6IGNvbmZpZy90Yy13NjUuYzo3OTEgY29uZmlnL3RjLXo4ay5jOjEyOTAKLW1zZ2lkICJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMzYyIGNvbmZpZy90Yy1oODUwMC5jOjExNzEgY29uZmlnL3RjLXNoLmM6MTE1MQotIzogY29uZmlnL3RjLXc2NS5jOjgwNSBjb25maWcvdGMtejhrLmM6MTMwNAotbXNnaWQgImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjE0NTEgY29uZmlnL3RjLWg4NTAwLmM6MTI2MCBjb25maWcvdGMtejhrLmM6MTQxNQotbXNnaWQgImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTQ2MSBjb25maWcvdGMtejhrLmM6MTQyNQotbXNnaWQgImNhbGwgdG8gbWRfY29udmVydF9mcmFnIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjE1MDYgY29uZmlnL3RjLXo4ay5jOjE1MDAKLW1zZ2lkICJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6MzM3Ci1tc2dpZCAiOjI0IG5vdCB2YWxpZCBmb3IgdGhpcyBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6MzQ0Ci1tc2dpZCAiZXhwZWN0IDo4LDoxNiBvciA6MjQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NDAxCi1tc2dpZCAic3ludGF4IGVycm9yIGluIHJlZyBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjQxOQotbXNnaWQgIm1pc3NpbmcgZmluYWwgcmVnaXN0ZXIgaW4gcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NTA2IGNvbmZpZy90Yy1oODUwMC5jOjUxMyBjb25maWcvdGMtaDg1MDAuYzo1MTkKLW1zZ2lkICJleHBlY3RlZCBAKGV4cCwgUm4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjUzNQotbXNnaWQgIkBSbisgbmVlZHMgd29yZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo1NDUKLW1zZ2lkICJAUm4gbmVlZHMgd29yZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo4NDUgY29uZmlnL3RjLXNoLmM6ODQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaGFuZGxlZCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjg3MyBjb25maWcvdGMtc2guYzo4NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo5NjMgY29uZmlnL3RjLXNoLmM6OTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCBmb3IgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzoxMTQ1IGNvbmZpZy90Yy1zaC5jOjEwODIgY29uZmlnL3RjLXc2NS5jOjc3OQotbXNnaWQgImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEwOTYKLW1zZ2lkICJNaXNzaW5nIC5leGl0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMDk5Ci1tc2dpZCAiTWlzc2luZyAucHJvY2VuZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTEwOAotbXNnaWQgIk5vdCBpbiBhIHNwYWNlLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTExMQotbXNnaWQgIk5vdCBpbiBhIHN1YnNwYWNlLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTI3MwotbXNnaWQgIkludmFsaWQgZmllbGQgc2VsZWN0b3IuICBBc3N1bWluZyBGJSUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTMwNAotbXNnaWQgIi1SIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzMjYgY29uZmlnL3RjLWk4NjAuYzoxOTEgY29uZmlnL3RjLXNwYXJjLmM6NzA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBsb3Npbmcgb3Bjb2RlOiBgJXMnIFwiJXNcIlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTM4OCBjb25maWcvdGMtaHBwYS5jOjUxODMgY29uZmlnL3RjLWhwcGEuYzo1MjM1Ci1tc2dpZCAiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzOTEgY29uZmlnL3RjLWhwcGEuYzo1MjM4Ci1tc2dpZCAiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE0OTQgY29uZmlnL3RjLWhwcGEuYzozNDYzCi1tc2dpZCAiY291bGQgbm90IHVwZGF0ZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNjI1Ci1tc2dpZCAiSW52YWxpZCBJbmRleGVkIExvYWQgQ29tcGxldGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE2MzAKLW1zZ2lkICJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIgU3ludGF4LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE2NTQKLW1zZ2lkICJJbnZhbGlkIFNob3J0IExvYWQvU3RvcmUgQ29tcGxldGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE2ODEgY29uZmlnL3RjLWhwcGEuYzoxNjg2Ci1tc2dpZCAiSW52YWxpZCBTdG9yZSBCeXRlcyBTaG9ydCBDb21wbGV0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNjk2IGNvbmZpZy90Yy1ocHBhLmM6MTcyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uOiAlYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE3MTEKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE3NDMKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTgyMSBjb25maWcvdGMtaHBwYS5jOjE4OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE5NDggY29uZmlnL3RjLWhwcGEuYzoyMDI1Ci1tc2dpZCAiSW52YWxpZCBMb2dpY2FsIEluc3RydWN0aW9uIENvbmRpdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMDY3Ci1tc2dpZCAiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIwODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBCaXQgQnJhbmNoIENvbmRpdGlvbjogJWMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMjAyIGNvbmZpZy90Yy1ocHBhLmM6MjIzNSBjb25maWcvdGMtaHBwYS5jOjIyNzIKLW1zZ2lkICJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMzM1Ci1tc2dpZCAiSW52YWxpZCBTRlUgaWRlbnRpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIzNzUKLW1zZ2lkICJJbnZhbGlkIENPUFIgaWRlbnRpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjI1MDAgY29uZmlnL3RjLWhwcGEuYzoyNTIxIGNvbmZpZy90Yy1ocHBhLmM6MjU0MQotIzogY29uZmlnL3RjLWhwcGEuYzoyNTYxIGNvbmZpZy90Yy1ocHBhLmM6MjU4MQotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjYwNQotbXNnaWQgIkludmFsaWQgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjYyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG9wZXJhbmRzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzE2MwotbXNnaWQgIlVua25vd24gcmVsb2NhdGlvbiBlbmNvdW50ZXJlZCBpbiBtZF9hcHBseV9maXguIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzE3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBocHBhX2ZpeHVwIGVudHJ5IGZvciB0aGlzIGZpeHVwIChmaXhQID0gMHgleCwgdHlwZSA9IDB4JXgpXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozMzE1IGNvbmZpZy90Yy1ocHBhLmM6MzM0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmRlZmluZWQgcmVnaXN0ZXI6ICclcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzM3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJOb24tYWJzb2x1dGUgc3ltYm9sOiAnJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjMzOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5kZWZpbmVkIGFic29sdXRlIGNvbnN0YW50OiAnJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBGUCBDb21wYXJlIENvbmRpdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgRlAgT3BlcmFuZCBGb3JtYXQ6ICUzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM2MjQKLW1zZ2lkICJCYWQgc2VnbWVudCBpbiBleHByZXNzaW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM2NzUKLW1zZ2lkICJCYWQgc2VnbWVudCAoc2hvdWxkIGJlIGFic29sdXRlKS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgbG9jYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozODA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZGVzY3JpcHRpb246ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzgyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIE51bGxpZmljYXRpb246ICglYykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0MzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgLkNBTEwgYXJndW1lbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDQyMAotbXNnaWQgIi5jYWxsaW5mbyBpcyBub3Qgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NDQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZSQU1FIHBhcmFtZXRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgODogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0NTkKLW1zZ2lkICJWYWx1ZSBmb3IgRU5UUllfR1IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMy4uMThcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0NzEKLW1zZ2lkICJWYWx1ZSBmb3IgRU5UUllfRlIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMTIuLjIxXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NDgxCi1tc2dpZCAiVmFsdWUgZm9yIEVOVFJZX1NSIG11c3QgYmUgM1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDUzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIC5DQUxMSU5GTyBhcmd1bWVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NjI3Ci1tc2dpZCAiVGhlIC5FTlRFUiBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ2NDEKLW1zZ2lkICJNaXNwbGFjZWQgLmVudHJ5LiBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ2NDUKLW1zZ2lkICJNaXNzaW5nIC5jYWxsaW5mby4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NjkzCi1tc2dpZCAiLlJFRyBtdXN0IHVzZSBhIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDY5NQotbXNnaWQgIi5FUVUgbXVzdCB1c2UgYSBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ3NDYKLW1zZ2lkICIuRVhJVCBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NzUwCi1tc2dpZCAiTWlzc2luZyAuY2FsbGluZm8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NzU0Ci1tc2dpZCAiTm8gLkVOVFJZIGZvciB0aGlzIC5FWElUIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDc4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgZGVmaW5lIGV4cG9ydCBzeW1ib2w6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzaW5nIEVOVFJZIHJhdGhlciB0aGFuIENPREUgaW4gZXhwb3J0IGRpcmVjdGl2ZSBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0OTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCAuRVhQT1JULy5JTVBPUlQgYXJndW1lbnQgKGlnbm9yZWQpOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUwMTcKLW1zZ2lkICJNaXNzaW5nIGxhYmVsIG5hbWUgb24gLkxBQkVMIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTAyMgotbXNnaWQgImV4dHJhIC5MQUJFTCBhcmd1bWVudHMgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MDM3Ci1tc2dpZCAiVGhlIC5MRUFWRSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUwNzAKLW1zZ2lkICJVbnJlY29nbml6ZWQgLkxFVkVMIGFyZ3VtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBkZWZpbmUgc3RhdGljIHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUxMzcKLW1zZ2lkICJOZXN0ZWQgcHJvY2VkdXJlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUxNDcKLW1zZ2lkICJDYW5ub3QgYWxsb2NhdGUgdW53aW5kIGRlc2NyaXB0b3JcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUyNDIKLW1zZ2lkICJtaXNwbGFjZWQgLnByb2NlbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MjQ1Ci1tc2dpZCAiTWlzc2luZyAuY2FsbGluZm8gZm9yIHRoaXMgcHJvY2VkdXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTI0OAotbXNnaWQgIk1pc3NpbmcgLkVYSVQgZm9yIGEgLkVOVFJZIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTM0OAotbXNnaWQgIkludmFsaWQgLlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTM5NgotbXNnaWQgIkNhbid0IGNoYW5nZSBzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCBzcGFjZTogJyVzJyBBc3N1bWluZyBzcGFjZSBudW1iZXIgPSAwLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU1NjUKLW1zZ2lkICJNdXN0IGJlIGluIGEgc3BhY2UgYmVmb3JlIGNoYW5naW5nIG9yIGRlY2xhcmluZyBzdWJzcGFjZXMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NTY5Ci1tc2dpZCAiQ2FuJ3QgY2hhbmdlIHN1YnNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU2MDUKLW1zZ2lkICJQYXJhbWV0ZXJzIG9mIGFuIGV4aXN0aW5nIHN1YnNwYWNlIGNhbid0IGJlIG1vZGlmaWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTY1OAotbXNnaWQgIkFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU3MDAKLW1zZ2lkICJGSVJTVCBub3Qgc3VwcG9ydGVkIGFzIGEgLlNVQlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTcwMgotbXNnaWQgIkludmFsaWQgLlNVQlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTc0MgotbXNnaWQgIklnbm9yaW5nIHN1YnNwYWNlIGRlY2wgZHVlIHRvIEVMRiBCRkQgYnVncy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1OTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZmluZCBjb250YWluaW5nIHNwYWNlIGZvciAlcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1OTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3Vic3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2Njg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAnJXMnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY2OTIKLW1zZ2lkICJObyBtZW1vcnkgZm9yIHN5bWJvbCBuYW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjUwMgotbXNnaWQgInNhbWUgdHlwZSBvZiBwcmVmaXggdXNlZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjUzNgotbXNnaWQgIkJhZCBhcmd1bWVudCB0byBzeW50YXggZGlyZWN0aXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjYxOSBjb25maWcvdGMtbTY4ay5jOjM3NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjg1MQotbXNnaWQgIlVua25vd24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo4OTkgY29uZmlnL3RjLWkzODYuYzo0MzYwIGNvbmZpZy90Yy1tNjhrLmM6NzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6OTA5IGNvbmZpZy90Yy1pMzg2LmM6NDM3NCBjb25maWcvdGMtbTY4ay5jOjc3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMTAgY29uZmlnL3RjLWkzODYuYzoxMDk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIHN1Y2ggMzg2IGluc3RydWN0aW9uOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTAxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBtbmVtb25pYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMjYKLW1zZ2lkICJleHBlY3RpbmcgcHJlZml4OyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMjgKLW1zZ2lkICJleHBlY3RpbmcgbW5lbW9uaWM7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWR1bmRhbnQgJXMgcHJlZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTEwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3Rpbmcgc3RyaW5nIGluc3RydWN0aW9uIGFmdGVyIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSBvcGVyYW5kICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIGluIG9wZXJhbmQgJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmJhbGFuY2VkIGJyYWNrZXRzIGluIG9wZXJhbmQgJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGVyYW5kICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMjAyCi1tc2dpZCAiZXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEyMDcKLW1zZ2lkICJleHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jLiB3ZSBmb3VuZCBubyBtYXRjaAotIzogY29uZmlnL3RjLWkzODYuYzoxNDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN1ZmZpeCBvciBvcGVyYW5kcyBpbnZhbGlkIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSMuIFdhcm4gdGhlbSB0aGF0IGEgZGF0YSBvciBhZGRyZXNzIHNpemUgcHJlZml4IGRvZXNuJ3QgYWZmZWN0Ci0jLiBhc3NlbWJseSBvZiB0aGUgbmV4dCBsaW5lIG9mIGNvZGUuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE0NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNDY3IGNvbmZpZy90Yy1pMzg2LmM6MTQ4MgotbXNnaWQgImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE1NDggY29uZmlnL3RjLWkzODYuYzoxNTg5IGNvbmZpZy90Yy1pMzg2LmM6MTYxNgotbXNnaWQgInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNTYxIGNvbmZpZy90Yy1pMzg2LmM6MTU3OCBjb25maWcvdGMtaTM4Ni5jOjE2MDUKLW1zZ2lkICJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNjQ1IGNvbmZpZy90Yy1pMzg2LmM6MTY2NQotbXNnaWQgIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTY5MAotbXNnaWQgIiIKLSJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW4gYW5kIG5vIHJlZ2lzdGVyIG9wZXJhbmRzOyBjYW4ndCBzaXplICIKLSJpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiByZXZlcnNlZCBhcmd1bWVudHMgb24gZmFkZHAsIGZzdWJwLCBldGMuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE4MDMKLW1zZ2lkICJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcywlJSVzJyIKLW1zZ3N0ciAiIgotCi0jLiBleHRyYW5lb3VzIGBsJyBzdWZmaXggb24gZnAgaW5zbgotIzogY29uZmlnL3RjLWkzODYuYzoxODEwCi1tc2dpZCAidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjAyMgotbXNnaWQgInlvdSBjYW4ndCBgcG9wICUlY3MnIgotbXNnc3RyICIiCi0KLSMuIFVuaXhXYXJlIGZzdWIgbm8gYXJncyBpcyBhbGlhcyBmb3IgZnN1YnAsIGZhZGQgLT4gZmFkZHAsIGV0YwotIzogY29uZmlnL3RjLWkzODYuYzoyMDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInRyYW5zbGF0aW5nIHRvIGAlc3AnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjA4NCBjb25maWcvdGMtaTM4Ni5jOjIxODcgY29uZmlnL3RjLWkzODYuYzoyMjQ3Ci1tc2dpZCAic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIxMDQgY29uZmlnL3RjLWkzODYuYzoyMjExIGNvbmZpZy90Yy1pMzg2LmM6MjI2MAotbXNnaWQgIjE2LWJpdCBqdW1wIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYCVzJyBvbmx5IHRha2VzIGJ5dGUgZGlzcGxhY2VtZW50OyAlbGQgc2hvcnRlbmVkIHRvICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjI2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBoYW5kbGUgbm9uIGFic29sdXRlIHNlZ21lbnQgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1MjcKLW1zZ2lkICJPbmx5IDEgb3IgMiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNTU4IGNvbmZpZy90Yy1pMzg2LmM6Mjc4OAotbXNnaWQgIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjU3OSBjb25maWcvdGMtaTM4Ni5jOjI4MDkKLW1zZ2lkICJCYWQgcmVsb2Mgc3BlY2lmaWVyIGluIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNTk3IGNvbmZpZy90Yy1pMzg2LmM6Mjg0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBqdW5rIGAlcycgYWZ0ZXIgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jLiBtaXNzaW5nIG9yIGJhZCBleHByIGJlY29tZXMgYWJzb2x1dGUgMAotIzogY29uZmlnL3RjLWkzODYuYzoyNjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1pc3Npbmcgb3IgaW52YWxpZCBpbW1lZGlhdGUgZXhwcmVzc2lvbiBgJXMnIHRha2VuIGFzIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNjM5IGNvbmZpZy90Yy1pMzg2LmM6Mjg2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjY4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3Rpbmcgc2NhbGUgZmFjdG9yIG9mIDEsIDIsIDQsIG9yIDg6IGdvdCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzY2FsZSBmYWN0b3Igb2YgJWQgd2l0aG91dCBhbiBpbmRleCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMwMzcgY29uZmlnL3RjLWkzODYuYzozMDQzIGNvbmZpZy90Yy1pMzg2LmM6MzA1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgc2VnbWVudCBuYW1lIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozMjE4IGNvbmZpZy90Yy1pMzg2LmM6MzQ3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ0b28gbWFueSBtZW1vcnkgcmVmZXJlbmNlcyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMzMjkgY29uZmlnL3RjLWkzODYuYzozMzQyIGNvbmZpZy90Yy1pMzg2LmM6MzY1NAotIzogY29uZmlnL3RjLWkzODYuYzozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM0MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG1lbW9yeSBvcGVyYW5kIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkp1bmsgYCVzJyBhZnRlciByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM1ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgaW5kZXggcmVnaXN0ZXIgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM1OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGApJyBhZnRlciBzY2FsZSBmYWN0b3IgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM2MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGluZGV4IHJlZ2lzdGVyIG9yIHNjYWxlIGZhY3RvciBhZnRlciBgLCc7IGdvdCAnJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzYxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBiYXNlIHJlZ2lzdGVyIGluIGAlcyciCi1tc2dzdHIgIiIKLQotIy4gaXQncyBub3QgYSBtZW1vcnkgb3BlcmFuZDsgYXJnaCEKLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXIgJXMgYmVnaW5uaW5nIG9wZXJhbmQgJWQgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQwOTUKLW1zZ2lkICJCYWQgY2FsbCB0byBtZF9hdG9mICgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDE1NiBjb25maWcvdGMtaTM4Ni5jOjQxNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQyMjMKLW1zZ2lkICItbVx0XHRcdGRvIGxvbmcganVtcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDI2MwotbXNnaWQgIkdPVCBhbHJlYWR5IGluIHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQ0MDkgY29uZmlnL3RjLW1jb3JlLmM6MjEzMCBjb25maWcvdGMtc2guYzoyNDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTU3IGNvbmZpZy90Yy1pODYwLmM6MTYxCi1tc2dpZCAiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTgzIGNvbmZpZy90Yy1taXBzLmM6MTAxMyBjb25maWcvdGMtc3BhcmMuYzo2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjM0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBhbmRlZCBvcGNvZGUgYWZ0ZXIgZGVsYXllZCBicmFuY2g6IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzozNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhwYW5kZWQgb3Bjb2RlIGluIGR1YWwgbW9kZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjU4MAotbXNnaWQgIkZzcjEgZXF1YWxzIGZkZXN0IHdpdGggUGlwZWxpbmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjYzMQotbXNnaWQgIjUtYml0IGltbWVkaWF0ZSB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo3MjUKLW1zZ2lkICJJbGxlZ2FsIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6NzQ5IGNvbmZpZy90Yy1zcGFyYy5jOjIzMzgKLW1zZ2lkICJiYWQgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIyNi1iaXQgYnJhbmNoIHcvbyBwYyByZWxhdGl2ZSBzZXQ6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jLiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwKLSMuIGNoZWNrIGZvciBvdmVyZmxvdwotIzogY29uZmlnL3RjLWk4NjAuYzo4ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMjYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg5MSBjb25maWcvdGMtaTg2MC5jOjkyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDQtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg5NiBjb25maWcvdGMtaTg2MC5jOjkyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDItYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgMTYtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDgtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIG92ZXJmbG93OiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5NTEKLW1zZ2lkICJtZF9udW1iZXJfdG9fZGlzcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTYxCi1tc2dpZCAiaTg2MF9udW1iZXJfdG9fZmllbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjEwMDEKLW1zZ2lkICJpODYwX2NvbnZlcnRfZnJhZ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTAxMAotbXNnaWQgImk4NjBfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjU1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJIYXNoaW5nIHJldHVybmVkIFwiJXNcIi4iCi1tc2dzdHIgIiIKLQotIy4gT2Zmc2V0IG9mIGxhc3QgY2hhcmFjdGVyIGluIG9wY29kZSBtbmVtb25pYwotIzogY29uZmlnL3RjLWk5NjAuYzo1OTMKLW1zZ2lkICJicmFuY2ggcHJlZGljdGlvbiBpbnZhbGlkIG9uIHRoaXMgb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NjM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb3Bjb2RlLCBcIiVzXCIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgImltcHJvcGVyIG51bWJlciBvZiBvcGVyYW5kcy4gIGV4cGVjdGluZyAlZCwgZ290ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6Nzg2IGNvbmZpZy90Yy1tMzJyLmM6MTIzOQotbXNnaWQgIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjg3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJGaXh1cCBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCB3aWR0aCBvZiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjk5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjEwMTQKLW1zZ2lkICJJOTYwIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxMDE3Ci1tc2dpZCAiIgotIlxuIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiA5NjAgYXJjaGl0ZWN0dXJlXG4iCi0iLWJcdFx0XHRhZGQgY29kZSB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQgYnJhbmNoZXMgdGFrZW5cbiIKLSItbGluay1yZWxheFx0XHRwcmVzZXJ2ZSBpbmRpdmlkdWFsIGFsaWdubWVudCBkaXJlY3RpdmVzIHNvIGxpbmtlclxuIgotIlx0XHRcdGNhbiBkbyByZWxheGluZyAoYi5vdXQgZm9ybWF0IG9ubHkpXG4iCi0iLW5vLXJlbGF4XHRcdGRvbid0IGFsdGVyIGNvbXBhcmUtYW5kLWJyYW5jaCBpbnN0cnVjdGlvbnMgZm9yXG4iCi0iXHRcdFx0bG9uZyBkaXNwbGFjZW1lbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNDI1Ci1tc2dpZCAidG9vIG1hbnkgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNDg1IGNvbmZpZy90Yy1pOTYwLmM6MTcxNQotbXNnaWQgImV4cHJlc3Npb24gc3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTUyMwotbXNnaWQgImF0dGVtcHQgdG8gYnJhbmNoIGludG8gZGlmZmVyZW50IHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRhcmdldCBvZiAlcyBpbnN0cnVjdGlvbiBtdXN0IGJlIGEgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNTY3Ci1tc2dpZCAidW5tYXRjaGVkICdbJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE1NzgKLW1zZ2lkICJnYXJiYWdlIGFmdGVyIGluZGV4IHNwZWMgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jLiBXZSBuZXZlciBtb3ZlZDogdGhlcmUgd2FzIG5vIG9wY29kZSBlaXRoZXIhCi0jOiBjb25maWcvdGMtaTk2MC5jOjE2NDUKLW1zZ2lkICJtaXNzaW5nIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE5NTMKLW1zZ2lkICJpbnZhbGlkIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjA2NgotbXNnaWQgImludmFsaWQgaW5kZXggcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMDg5Ci1tc2dpZCAiaW52YWxpZCBzY2FsZSBmYWN0b3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMjcyCi1tc2dpZCAidW5hbGlnbmVkIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjI5NQotbXNnaWQgIm5vIHN1Y2ggc2ZyIGluIHRoaXMgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjMzMwotbXNnaWQgImlsbGVnYWwgbGl0ZXJhbCIKLW1zZ3N0ciAiIgotCi0jLiBTaG91bGQgbm90IGhhcHBlbjogc2VlIGJsb2NrIGNvbW1lbnQgYWJvdmUKLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjU2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJUcnlpbmcgdG8gJ2JhbCcgdG8gJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNTc3Ci1tc2dpZCAiTG9va3MgbGlrZSBhIHByb2MsIGJ1dCBjYW4ndCB0ZWxsIHdoYXQga2luZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2MDkKLW1zZ2lkICJzaG91bGQgaGF2ZSAxIG9yIDIgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjE4IGNvbmZpZy90Yy1pOTYwLmM6MjYzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWRlZmluaW5nIGxlYWZwcm9jICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjY2NwotbXNnaWQgInNob3VsZCBoYXZlIHR3byBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2NzcKLW1zZ2lkICInZW50cnlfbnVtJyBtdXN0IGJlIGFic29sdXRlIG51bWJlciBpbiBbMCwzMV0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlZGVmaW5pbmcgZW50cnludW0gZm9yIHN5c3Byb2MgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNzk3Ci1tc2dpZCAiYXJjaGl0ZWN0dXJlIG9mIG9wY29kZSBjb25mbGljdHMgd2l0aCB0aGF0IG9mIGVhcmxpZXIgaW5zdHJ1Y3Rpb24ocykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyODE4Ci1tc2dpZCAiYmlnIGVuZGlhbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyODIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIHVucmVjb2duaXplZCAuZW5kaWFuIHR5cGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjMxMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGVhZnByb2Mgc3ltYm9sICclcycgdW5kZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MzEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBtYWtpbmcgbGVhZnByb2MgZW50cmllcyAlcyBhbmQgJXMgYm90aCBnbG9iYWxcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjMyNDIKLW1zZ2lkICJvcHRpb24gLS1saW5rLXJlbGF4IGlzIG9ubHkgc3VwcG9ydGVkIGluIGIub3V0IGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjMyODUKLW1zZ2lkICJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTkxCi1tc2dpZCAiIE0zMlIgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoxOTQKLW1zZ2lkICIiCi0iICAtd2Fybi11bm1hdGNoZWQtaGlnaCAgICB3YXJuIHdoZW4gYW4gKHMpaGlnaCByZWxvYyBoYXMgbm8gbWF0Y2hpbmcgbG93ICIKLSJyZWxvY1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTk2Ci1tc2dpZCAiICAtbm8td2Fybi11bm1hdGNoZWQtaGlnaCBkbyBub3Qgd2FybiBhYm91dCBtaXNzaW5nIGxvdyByZWxvY3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjE5OAotbXNnaWQgIiAgLVd1aCAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjIwMAotbXNnaWQgIiAgLVdudWggICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjIwNAotbXNnaWQgIiAgLXJlbGF4ICAgICAgICAgICAgICAgICBjcmVhdGUgbGlua2VyIHJlbGF4YWJsZSBjb2RlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyMDYKLW1zZ2lkICIgIC1jcHUtZGVzYyAgICAgICAgICAgICAgcHJvdmlkZSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzozMzEgcmVhZC5jOjI3NTUgcmVhZC5jOjQ4MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6NjMwIGNvbmZpZy90Yy1wcGMuYzoxMzM2IGNvbmZpZy90Yy1wcGMuYzozNTQwIHJlYWQuYzoxMzY4Ci1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjYzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIuU0NPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjY1MyBjb25maWcvdGMtcHBjLmM6MTM1OCBjb25maWcvdGMtcHBjLmM6MjI2NwotIzogY29uZmlnL3RjLXBwYy5jOjM1NjQKLW1zZ2lkICJpZ25vcmluZyBiYWQgYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6Njc5IGNvbmZpZy90Yy1wcGMuYzoxMzY5IGNvbmZpZy90Yy1wcGMuYzozNTc2IHJlYWQuYzoxMzg4Ci0jOiByZWFkLmM6MjEwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5zY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo5MzIKLW1zZ2lkICJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTE2MQotbXNnaWQgIlVubWF0Y2hlZCBoaWdoL3NoaWdoIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjQ2Ci1tc2dpZCAiVW5rbm93biBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcGljIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo3ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHBpYyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6ODg1IGNvbmZpZy90Yy1taXBzLmM6MTExNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IG1ha2UgJXMgcmVsb2NhdGlvbiBQQyByZWxhdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjk5OCBjb25maWcvdGMtdGFob2UuYzoxNTA1IGNvbmZpZy90Yy12YXguYzoxNzc0Ci1tc2dpZCAiTm8gb3BlcmF0b3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxMDI4IGNvbmZpZy90Yy10YWhvZS5jOjE1MjIgY29uZmlnL3RjLXZheC5jOjE3OTEKLW1zZ2lkICJVbmtub3duIG9wZXJhdG9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgwMwotbXNnaWQgImludmFsaWQgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODA4Ci1tc2dpZCAiZnB1ICg2ODA0MCwgNjgwNjAgb3IgNjg4ODEvNjg4ODIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgxMQotbXNnaWQgIm1tdSAoNjgwMzAgb3IgNjg4NTEpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgxNAotbXNnaWQgIjY4MDIwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MTcKLW1zZ2lkICI2ODAwMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODIwCi1tc2dpZCAiNjgwMTAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTg0OAotbXNnaWQgIm9wZXJhbmRzIG1pc21hdGNoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTkwNSBjb25maWcvdGMtbTY4ay5jOjE5MTEgY29uZmlnL3RjLW02OGsuYzoxOTE3Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxOTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJpZ251bSB0b28gYmlnIGZvciAlYyBmb3JtYXQ7IHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIwNDIKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjE1MgotbXNnaWQgIiIKLSJzY2FsZSBmYWN0b3IgaW52YWxpZCBvbiB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgY3B1MzIgb3IgNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjE1NwotbXNnaWQgImludmFsaWQgaW5kZXggc2l6ZSBmb3IgY29sZGZpcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMjEwCi1tc2dpZCAiRm9yY2luZyBieXRlIGRpc3BsYWNlbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIyMTIKLW1zZ2lkICJieXRlIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMjU5IGNvbmZpZy90Yy1tNjhrLmM6MjI5NwotbXNnaWQgImludmFsaWQgb3BlcmFuZCBtb2RlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjI4MyBjb25maWcvdGMtbTY4ay5jOjIzMTcKLW1zZ2lkICI6YiBub3QgcGVybWl0dGVkOyBkZWZhdWx0aW5nIHRvIDp3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjM5OQotbXNnaWQgInVuc3VwcG9ydGVkIGJ5dGUgdmFsdWU7IHVzZSBhIGRpZmZlcmVudCBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNDEzCi1tc2dpZCAidW5rbm93bi9pbmNvcnJlY3Qgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI0NDYgY29uZmlnL3RjLW02OGsuYzoyNDU0IGNvbmZpZy90Yy1tNjhrLmM6MjQ2MQotIzogY29uZmlnL3RjLW02OGsuYzoyNDY4Ci1tc2dpZCAib3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjUxOAotbXNnaWQgIkNhbid0IHVzZSBsb25nIGJyYW5jaGVzIG9uIDY4MDAwLzY4MDEwLzUyMDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNjA2Ci1tc2dpZCAiRXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2UsIHVzaW5nIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNzE4IGNvbmZpZy90Yy1tNjhrLmM6MjczNAotbXNnaWQgIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNzI0Ci1tc2dpZCAiV3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3NDAKLW1zZ2lkICJpbmNvcnJlY3QgcmVnaXN0ZXIgaW4gcmVnbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3NDYKLW1zZ2lkICJ3cm9uZyByZWdpc3RlciBpbiBmbG9hdGluZy1wb2ludCByZWdsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjgyMgotbXNnaWQgImZhaWxlZCBzYW5pdHkgY2hlY2siCi1tc2dzdHIgIiIKLQotIy4gRVJST1IKLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzE4NwotbXNnaWQgIkV4dHJhICkiCi1tc2dzdHIgIiIKLQotIy4gRVJST1IKLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzE5OAotbXNnaWQgIk1pc3NpbmcgKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjMyMTUKLW1zZ2lkICJNaXNzaW5nIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozNTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIC0tIHN0YXRlbWVudCBgJXMnIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozNTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkRvbid0IGtub3cgaG93IHRvIGZpZ3VyZSB3aWR0aCBvZiAlYyBpbiBtZF9hc3NlbWJsZSgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mzc1OSBjb25maWcvdGMtbTY4ay5jOjM3OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgRXJyb3I6IENhbid0IGZpbmQgJXMgaW4gaGFzaCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM3NjIgY29uZmlnL3RjLW02OGsuYzozNzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIEVycm9yOiBDYW4ndCBoYXNoICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM5MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIGRlZmF1bHQgY3B1IGAlcycgPz8/IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzkzOAotbXNnaWQgIjY4MDQwIGFuZCA2ODg1MSBzcGVjaWZpZWQ7IG1tdSBpbnN0cnVjdGlvbnMgbWF5IGFzc2VtYmxlIGluY29ycmVjdGx5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mzk1OAotbXNnaWQgIm9wdGlvbnMgZm9yIDY4ODgxIGFuZCBuby02ODg4MSBib3RoIGdpdmVuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mzk2MAotbXNnaWQgIm9wdGlvbnMgZm9yIDY4ODUxIGFuZCBuby02ODg1MSBib3RoIGdpdmVuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDAzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJ0ZXh0IGxhYmVsIGAlcycgYWxpZ25lZCB0byBvZGQgYm91bmRhcnkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MjQ4Ci1tc2dpZCAiaW52YWxpZCBieXRlIGJyYW5jaCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MzA1Ci1tc2dpZCAic2hvcnQgYnJhbmNoIHdpdGggemVybyBvZmZzZXQ6IHVzZSA6dyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQzNTEKLW1zZ2lkICJMb25nIGJyYW5jaCBvZmZzZXQgbm90IHN1cHBvcnRlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0NDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yIChsb25nIFBDLXJlbGF0aXZlIG9wZXJhbmQpIGZvciBpbnNuIDB4JTA0eCBhdCAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ0NDMKLW1zZ2lkICJkaXNwbGFjZW1lbnQgZG9lc24ndCBmaXQgaW4gb25lIGJ5dGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0NTU2Ci1tc2dpZCAiTG9uZyBicmFuY2ggb2Zmc2V0IHRvIGV4dGVybiBzeW1ib2wgbm90IHN1cHBvcnRlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0OTA1IGNvbmZpZy90Yy1tNjhrLmM6NDkxNgotbXNnaWQgImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0OTQ4Ci1tc2dpZCAiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ5ODEgY29uZmlnL3RjLW02OGsuYzo0OTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGRlYWwgd2l0aCBleHByZXNzaW9uOyBkZWZhdWx0aW5nIHRvICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUwMDcKLW1zZ2lkICJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIEJZVEUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MDExCi1tc2dpZCAiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBXT1JEIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTEwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZWNvZ25pemVkIHByb2Nlc3NvciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTE2OQotbXNnaWQgImJhZCBjb3Byb2Nlc3NvciBpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUxNzUKLW1zZ2lkICJ1bnJlY29nbml6ZWQgZm9wdCBvcHRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wdGlvbiBgJXMnIG1heSBub3QgYmUgbmVnYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUzMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3B0aW9uIGAlcycgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MzUzCi1tc2dpZCAiYmFkIGZvcm1hdCBvZiBPUFQgTkVTVD1kZXB0aCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU0MTYKLW1zZ2lkICJtaXNzaW5nIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTQ0MCBjb25maWcvdGMtbTY4ay5jOjU0NjkKLW1zZ2lkICJiYWQgcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU0NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIGxpc3Q6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTU0MAotbXNnaWQgInJlc3RvcmUgd2l0aG91dCBzYXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTcxNyBjb25maWcvdGMtbTY4ay5jOjYwNjYKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU3NjgKLW1zZ2lkICJtaXNzaW5nIGNvbmRpdGlvbiBjb2RlIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MTAwCi1tc2dpZCAibWlzc2luZyB0aGVuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjE4MgotbXNnaWQgImVsc2Ugd2l0aG91dCBtYXRjaGluZyBpZiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYyMTYKLW1zZ2lkICJlbmRpIHdpdGhvdXQgbWF0Y2hpbmcgaWYiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MjU3Ci1tc2dpZCAiYnJlYWsgb3V0c2lkZSBvZiBzdHJ1Y3R1cmVkIGxvb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2Mjk2Ci1tc2dpZCAibmV4dCBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYzNDgKLW1zZ2lkICJtaXNzaW5nID0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2Mzg2Ci1tc2dpZCAibWlzc2luZyB0byBvciBkb3dudG8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NDIyIGNvbmZpZy90Yy1tNjhrLmM6NjQ1NiBjb25maWcvdGMtbTY4ay5jOjY2NjYKLW1zZ2lkICJtaXNzaW5nIGRvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjU1OQotbXNnaWQgImVuZGYgd2l0aG91dCBmb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NjE1Ci1tc2dpZCAidW50aWwgd2l0aG91dCByZXBlYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NzAyCi1tc2dpZCAiZW5kdyB3aXRob3V0IHdoaWxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjgxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgb3B0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2ODYzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjkzMwotbXNnaWQgIiIKLSI2ODBYMCBvcHRpb25zOlxuIgotIi1sXHRcdFx0dXNlIDEgd29yZCBmb3IgcmVmcyB0byB1bmRlZmluZWQgc3ltYm9scyBbZGVmYXVsdCAyXVxuIgotIi1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjBcbiIKLSIgfCAtbTY4MzAyIHwgLW02ODMzMSB8IC1tNjgzMzIgfCAtbTY4MzMzIHwgLW02ODM0MCB8IC1tNjgzNjBcbiIKLSIgfCAtbWNwdTMyIHwgLW01MjAwXG4iCi0iXHRcdFx0c3BlY2lmeSB2YXJpYW50IG9mIDY4MFgwIGFyY2hpdGVjdHVyZSBbZGVmYXVsdCA2ODAyMF1cbiIKLSItbTY4ODgxIHwgLW02ODg4MiB8IC1tbm8tNjg4ODEgfCAtbW5vLTY4ODgyXG4iCi0iXHRcdFx0dGFyZ2V0IGhhcy9sYWNrcyBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3NvclxuIgotIlx0XHRcdFtkZWZhdWx0IHllcyBmb3IgNjgwMjAsIDY4MDMwLCBhbmQgY3B1MzJdXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTQzCi1tc2dpZCAiIgotIi1tNjg4NTEgfCAtbW5vLTY4ODUxXG4iCi0iXHRcdFx0dGFyZ2V0IGhhcy9sYWNrcyBtZW1vcnktbWFuYWdlbWVudCB1bml0IGNvcHJvY2Vzc29yXG4iCi0iXHRcdFx0W2RlZmF1bHQgeWVzIGZvciA2ODAyMCBhbmQgdXBdXG4iCi0iLXBpYywgLWtcdFx0Z2VuZXJhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuIgotIi1TXHRcdFx0dHVybiBqYnNyIGludG8ganNyXG4iCi0iLS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWxcbiIKLSJcdFx0XHRyZWNvZ25pemUgcmVnaXN0ZXIgbmFtZXMgd2l0aG91dCBwcmVmaXggY2hhcmFjdGVyXG4iCi0iLS1iaXR3aXNlLW9yXHRcdGRvIG5vdCB0cmVhdCBgfCcgYXMgYSBjb21tZW50IGNoYXJhY3RlclxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njk1MgotbXNnaWQgIiIKLSItLWJhc2Utc2l6ZS1kZWZhdWx0LTE2XHRiYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMTYgYml0c1xuIgotIi0tYmFzZS1zaXplLWRlZmF1bHQtMzJcdGJhc2UgcmVnIHdpdGhvdXQgc2l6ZSBpcyAzMiBiaXRzIChkZWZhdWx0KVxuIgotIi0tZGlzcC1zaXplLWRlZmF1bHQtMTZcdGRpc3BsYWNlbWVudCB3aXRoIHVua25vd24gc2l6ZSBpcyAxNiBiaXRzXG4iCi0iLS1kaXNwLXNpemUtZGVmYXVsdC0zMlx0ZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9yICVzIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9wY29kZSglZC4lcyk6ICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjIwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBoYXNoIGluc3RydWN0aW9uICclcyc6JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoyNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBtbmVtb25pYyAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6Mjc4Ci1tc2dpZCAiUGFyYW1ldGVyIHN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjMzMwotbXNnaWQgIlVua25vd24gcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSMuIEhhdmluZyB0aGlzIGhlcmUgcmVwZWF0cyB0aGUgd2FybmluZyBzb210aW1lcy4KLSMuIEJ1dCBjYW4ndCB3ZSBzdGFuZCB0aGF0PwotIzogY29uZmlnL3RjLW04OGsuYzo0NDYKLW1zZ2lkICJVc2Ugb2Ygb2Jzb2xldGUgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzo1NjMKLW1zZ2lkICJFeHByZXNzaW9uIHRydW5jYXRlZCB0byAxNiBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6NjI5IGNvbmZpZy90Yy1tODhrLmM6NjUxCi1tc2dpZCAiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gNSBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6ODczCi1tc2dpZCAiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gOSBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6ODk1Ci1tc2dpZCAiUmVtb3ZlZCBsb3dlciAyIGJpdHMgb2YgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEwMzQKLW1zZ2lkICJCYWQgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTA0NwotbXNnaWQgIm1kX251bWJlcl90b19kaXNwIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTA1NwotbXNnaWQgIm1kX251bWJlcl90b19maWVsZCBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjExNzAKLW1zZ2lkICJSZWxheGF0aW9uIHNob3VsZCBuZXZlciBvY2N1ciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEyNjcgY29uZmlnL3RjLXNwYXJjLmM6MzAyNSByZWFkLmM6MTk2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEzMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo0MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgZXhwZWN0ZWQsIGJ1dCBzYXcgJyUuNnMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjQ4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjb250cm9sIHJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo2NDUKLW1zZ2lkICJtb3JlIHRoYW4gNjVLIGxpdGVyYWwgcG9vbHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6Njk5Ci1tc2dpZCAibWlzc2luZyAnXSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NzM5Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGEgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NzQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQsIG5vdCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo3NzkKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjc4NgotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6ODAwIGNvbmZpZy90Yy1tY29yZS5jOjEzMDEgY29uZmlnL3RjLW1jb3JlLmM6MTM1NQotbXNnaWQgImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6ODQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3Bjb2RlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo4OTIKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyOiByMTUgaWxsZWdhbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo5NTEgY29uZmlnL3RjLW1jb3JlLmM6OTkwIGNvbmZpZy90Yy1tY29yZS5jOjEwMDkKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEwMjggY29uZmlnL3RjLW1jb3JlLmM6MTA1NSBjb25maWcvdGMtbWNvcmUuYzoxMDg0Ci0jOiBjb25maWcvdGMtbWNvcmUuYzoxMTIxIGNvbmZpZy90Yy1tY29yZS5jOjExNTYgY29uZmlnL3RjLW1jb3JlLmM6MTE3NQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTE5NCBjb25maWcvdGMtbWNvcmUuYzoxMjI2IGNvbmZpZy90Yy1tY29yZS5jOjEyNDgKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzMDQgY29uZmlnL3RjLW1jb3JlLmM6MTM1OCBjb25maWcvdGMtbWNvcmUuYzoxMzkzCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDQ3IGNvbmZpZy90Yy1tY29yZS5jOjE0NjkgY29uZmlnL3RjLW1jb3JlLmM6MTQ5MgotbXNnaWQgInNlY29uZCBvcGVyYW5kIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6OTY2Ci1tc2dpZCAiZGVzdGluYXRpb24gcmVnaXN0ZXIgbXVzdCBiZSByMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo5ODcKLW1zZ2lkICJzb3VyY2UgcmVnaXN0ZXIgbXVzdCBiZSByMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMDUwIGNvbmZpZy90Yy1tY29yZS5jOjExMDcKLW1zZ2lkICJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEwNzgKLW1zZ2lkICJ0cmFuc2xhdGluZyBiZ2VuaSB0byBtb3ZpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExMTUKLW1zZ2lkICJ0cmFuc2xhdGluZyBtZ2VuaSB0byBtb3ZpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExNDcKLW1zZ2lkICJ0cmFuc2xhdGluZyBibWFza2kgdG8gbW92aSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjM1Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlcjogcjAgYW5kIHIxNSBpbGxlZ2FsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyNjIKLW1zZ2lkICJiYWQgc3RhcnRpbmcgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaW52YWxpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjc1Ci1tc2dpZCAiZW5kaW5nIHJlZ2lzdGVyIG11c3QgYmUgcjE1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyOTUKLW1zZ2lkICJiYWQgYmFzZSByZWdpc3RlcjogbXVzdCBiZSByMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzEzCi1tc2dpZCAiZmlyc3QgcmVnaXN0ZXIgbXVzdCBiZSByNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzI0Ci1tc2dpZCAibGFzdCByZWdpc3RlciBtdXN0IGJlIHI3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzNjEKLW1zZ2lkICJyZWctcmVnIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE0NjYKLW1zZ2lkICJzZWNvbmQgb3BlcmFuZCBtdXN0IGJlIDEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTQ4NwotbXNnaWQgInplcm8gdXNlZCBhcyBpbW1lZGlhdGUgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmltcGxlbWVudGVkIG9wY29kZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTU2OCBjb25maWcvdGMtdzY1LmM6ODU2Ci1tc2dpZCAiQmFkIGNhbGwgdG8gTURfTlRPRigpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE2MzEKLW1zZ2lkICIiCi0iTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcbiIKLSIgIC17bm8tfWpzcmkyYnNyXHQgIHtkaXN9YWJsZSBqc3JpIHRvIGJzciB0cmFuc2Zvcm1hdGlvbiAoZGVmOiBkaXMpXG4iCi0iICAte25vLX1zaWZpbHRlclx0ICB7ZGlzfWFibGUgc2lsaWNvbiBmaWx0ZXIgYmVoYXZpb3IgKGRlZjogZGlzKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNjQ3Ci1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjazogc2hvcnRfanVtcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNjU4Ci1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjazogbG9uZ19qdW1wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE2ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2RkIGRpc3BsYWNlbWVudCBhdCAleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODM5Ci1tc2dpZCAidW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODQ0IGNvbmZpZy90Yy1uczMyay5jOjIyODEKLW1zZ2lkICI8dW5rbm93bj4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJvZGQgZGlzdGFuY2UgYnJhbmNoICgweCV4IGJ5dGVzKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBjcmVsIGZvciBicmFuY2ggdG8gJXMgdG9vIGZhciAoMHgleCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJwY3JlbCBmb3IgbHJ3L2ptcGkvanNyaSB0byAlcyB0b28gZmFyICgweCV4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBjcmVsIGZvciBsb29wdCB0b28gZmFyICgweCV4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoyMTEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSAlc3JlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MjExNAotbXNnaWQgInBjLXJlbGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTYwCi1tc2dpZCAidHJhcCBleGNlcHRpb24gbm90IHN1cHBvcnRlZCBhdCBJU0EgMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMDAKLW1zZ2lkICJDb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWw6IGNhbid0IGhhc2ggYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBiYWQgbWlwczE2IG9wY29kZTogJXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEyMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmV0dXJuZWQgZnJvbSBtaXBzX2lwKCVzKSBpbnNuX29wY29kZSA9IDB4JXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjE3MzkgY29uZmlnL3RjLW1pcHMuYzoxMTI3OQotbXNnaWQgImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxNzYxIGNvbmZpZy90Yy1taXBzLmM6MTc2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJqdW1wIHRvIG1pc2FsaWduZWQgYWRkcmVzcyAoMHglbHgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MjQxOSBjb25maWcvdGMtbWlwcy5jOjI3ODIKLW1zZ2lkICJNYWNybyBpbnN0cnVjdGlvbiBleHBhbmRlZCBpbnRvIG11bHRpcGxlIGluc3RydWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjI4MzUKLW1zZ2lkICJ1bnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjI4MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gJXMgcmVxdWlyZXMgYWJzb2x1dGUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjI5ODMKLW1zZ2lkICJOdW1iZXIgbGFyZ2VyIHRoYW4gMzIgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjMwMDQKLW1zZ2lkICJOdW1iZXIgbGFyZ2VyIHRoYW4gNjQgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjMyNzAgY29uZmlnL3RjLW1pcHMuYzozMzQyIGNvbmZpZy90Yy1taXBzLmM6NTAyMQotIzogY29uZmlnL3RjLW1pcHMuYzo1MDcyIGNvbmZpZy90Yy1taXBzLmM6NTYwOCBjb25maWcvdGMtbWlwcy5jOjU2NzEKLW1zZ2lkICJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozNTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJyYW5jaCAlcyBpcyBhbHdheXMgZmFsc2UgKG5vcCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozNTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJyYW5jaCBsaWtlbHkgJXMgaXMgYWx3YXlzIGZhbHNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzU5MyBjb25maWcvdGMtbWlwcy5jOjM2NjcgY29uZmlnL3RjLW1pcHMuYzozNzcwCi0jOiBjb25maWcvdGMtbWlwcy5jOjM4MjUgY29uZmlnL3RjLW1pcHMuYzo2NzA3IGNvbmZpZy90Yy1taXBzLmM6NjcxNgotIzogY29uZmlnL3RjLW1pcHMuYzo2NzI0IGNvbmZpZy90Yy1taXBzLmM6NjgzMwotbXNnaWQgIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSMuIHJlc3VsdCBpcyBhbHdheXMgdHJ1ZQotIzogY29uZmlnL3RjLW1pcHMuYzozNjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJyYW5jaCAlcyBpcyBhbHdheXMgdHJ1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjM5MDEgY29uZmlnL3RjLW1pcHMuYzo0MDA4Ci1tc2dpZCAiRGl2aWRlIGJ5IHplcm8uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NDU5MgotbXNnaWQgIk1JUFMgUElDIGNhbGwgdG8gcmVnaXN0ZXIgb3RoZXIgdGhhbiAkMjUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo0NTk3IGNvbmZpZy90Yy1taXBzLmM6NDcwOQotbXNnaWQgIk5vIC5jcHJlc3RvcmUgcHNldWRvLW9wIHVzZWQgaW4gUElDIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo0NzgyIGNvbmZpZy90Yy1taXBzLmM6NDg3MSBjb25maWcvdGMtbWlwcy5jOjUzNTkKLSM6IGNvbmZpZy90Yy1taXBzLmM6NTQwMCBjb25maWcvdGMtbWlwcy5jOjU0MTggY29uZmlnL3RjLW1pcHMuYzo2MDQ2Ci0jOiBjb25maWcvdGMtbWlwcy5jOjcwNTQKLW1zZ2lkICJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjU4NzcgY29uZmlnL3RjLW1pcHMuYzo2NjAxCi1tc2dpZCAiTWFjcm8gdXNlZCAkYXQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjYwMTcgY29uZmlnL3RjLW1pcHMuYzo2MDM1Ci1tc2dpZCAicm90YXRlIGNvdW50IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjYwODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgZmFsc2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2MjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkluc3RydWN0aW9uICVzOiByZXN1bHQgaXMgYWx3YXlzIHRydWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2Mzk0IGNvbmZpZy90Yy1taXBzLmM6NjQyMSBjb25maWcvdGMtbWlwcy5jOjY0OTMKLSM6IGNvbmZpZy90Yy1taXBzLmM6NjUxOAotbXNnaWQgIm9wZXJhbmQgb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIHRoZSBpdGJsIG1hY3Jvcywgc2luY2UgdGhleQotIy4gYXJlIGFkZGVkIGR5bmFtaWNhbGx5LgotIzogY29uZmlnL3RjLW1pcHMuYzo2NTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1hY3JvICVzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2ODY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKG1hc2sgZXJyb3IpOiAlcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjY5MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAodW5rbm93biBvcGVyYW5kIHR5cGUgYCVjJyk6ICVzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjkyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlIChiaXRzIDB4JWx4IHVuZGVmaW5lZCk6ICVzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzA1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGNvZGUgcmVxdWlyZXMgLW1pcHMlZCBvciBncmVhdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbXByb3BlciBzaGlmdCBhbW91bnQgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MTU0IGNvbmZpZy90Yy1taXBzLmM6ODI3MiBjb25maWcvdGMtbWlwcy5jOjgzODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcxNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBicmVhayBjb2RlICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzE4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIGxvd2VyIGJyZWFrIGNvZGUgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgc3lzY2FsbCBjb2RlICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJDb3Byb2NjZXNvciBjb2RlID4gMjUgYml0cyAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZGF0ZSBwZXJmb3JtYW5jZSByZWdzdGVyICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzI2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGZsb2F0IHJlZ2lzdGVyIG51bWJlciAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzQzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJGbG9hdCByZWdpc3RlciBzaG91bGQgYmUgZXZlbiwgd2FzICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzQ4NCBjb25maWcvdGMtbWlwcy5jOjc3MTYgY29uZmlnL3RjLW1pcHMuYzo3NzU1Ci1tc2dpZCAiYWJzb2x1dGUgZXhwcmVzc2lvbiByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc1NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc2NjIKLW1zZ2lkICJDYW4ndCB1c2UgZmxvYXRpbmcgcG9pbnQgaW5zbiBpbiB0aGlzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NzE4Ci1tc2dpZCAiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIDAuLjY1NTM1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzc1NwotbXNnaWQgIjE2IGJpdCBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAtMzI3NjguLjMyNzY3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzgyOQotbXNnaWQgImx1aSBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAwLi42NTUzNSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc4NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjb25kaXRpb24gY29kZSByZWdpc3RlciAkZmNjJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3ODYxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBjaGFyID0gJyVjJ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzg3NCBjb25maWcvdGMtbWlwcy5jOjg0MTIKLW1zZ2lkICJpbGxlZ2FsIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzk0MQotbXNnaWQgInVucmVjb2duaXplZCBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4MDUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbnVtYmVyICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4MTMxCi1tc2dpZCAidXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODMwNgotbXNnaWQgImNhbid0IHBhcnNlIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4MzQwIGNvbmZpZy90Yy1taXBzLmM6ODM3MAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjg1MzcKLW1zZ2lkICJleHRlbmRlZCBvcGVyYW5kIHJlcXVlc3RlZCBidXQgbm90IHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODUzOQotbXNnaWQgImludmFsaWQgdW5leHRlbmRlZCBvcGVyYW5kIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODU2NwotbXNnaWQgIm9wZXJhbmQgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgaW52YWxpZCBsZWFkaW5nICd2JyBpbiAtbWNwdT0lcyBzd2l0Y2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIC1tY3B1PSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTA2NAotbXNnaWQgIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIGVtYmVkZGVkIFBJQyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTA3NgotbXNnaWQgIi1jYWxsX3NoYXJlZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgRUxGIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwODIgY29uZmlnL3RjLW1pcHMuYzoxMDA5MyBjb25maWcvdGMtbWlwcy5jOjEwMjYxCi1tc2dpZCAiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBQSUMgY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwOTEKLW1zZ2lkICItbm9uX3NoYXJlZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgRUxGIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkxMDcKLW1zZ2lkICItRyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTEyCi1tc2dpZCAiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBvciBlbWJlZGRlZCBQSUMgY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkxMzYKLW1zZ2lkICJObyBjb21waWxlZCBpbiBzdXBwb3J0IGZvciA2NCBiaXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTE5NwotbXNnaWQgIiIKLSJNSVBTIG9wdGlvbnM6XG4iCi0iLW1lbWJlZGRlZC1waWNcdFx0Z2VuZXJhdGUgZW1iZWRkZWQgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuIgotIi1FQlx0XHRcdGdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG4iCi0iLUVMXHRcdFx0Z2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcbiIKLSItZywgLWcyXHRcdFx0ZG8gbm90IHJlbW92ZSB1bmVlZGVkIE5PUHMgb3Igc3dhcCBicmFuY2hlc1xuIgotIi1HIE5VTVx0XHRcdGFsbG93IHJlZmVyZW5jaW5nIG9iamVjdHMgdXAgdG8gTlVNIGJ5dGVzXG4iCi0iXHRcdFx0aW1wbGljaXRseSB3aXRoIHRoZSBncCByZWdpc3RlciBbZGVmYXVsdCA4XVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTIwNQotbXNnaWQgIiIKLSItbWlwczFcdFx0XHRnZW5lcmF0ZSBNSVBTIElTQSBJIGluc3RydWN0aW9uc1xuIgotIi1taXBzMlx0XHRcdGdlbmVyYXRlIE1JUFMgSVNBIElJIGluc3RydWN0aW9uc1xuIgotIi1taXBzM1x0XHRcdGdlbmVyYXRlIE1JUFMgSVNBIElJSSBpbnN0cnVjdGlvbnNcbiIKLSItbWlwczRcdFx0XHRnZW5lcmF0ZSBNSVBTIElTQSBJViBpbnN0cnVjdGlvbnNcbiIKLSItbWNwdT1DUFVcdFx0Z2VuZXJhdGUgY29kZSBmb3IgQ1BVLCB3aGVyZSBDUFUgaXMgb25lIG9mOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTIzMQotbXNnaWQgIiIKLSItbUNQVVx0XHRcdGVxdWl2YWxlbnQgdG8gLW1jcHU9Q1BVLlxuIgotIi1uby1tQ1BVXHRcdGRvbid0IGdlbmVyYXRlIGNvZGUgc3BlY2lmaWMgdG8gQ1BVLlxuIgotIlx0XHRcdEZvciAtbUNQVSBhbmQgLW5vLW1DUFUsIENQVSBtdXN0IGJlIG9uZSBvZjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyNDQKLW1zZ2lkICIiCi0iLW1pcHMxNlx0XHRcdGdlbmVyYXRlIG1pcHMxNiBpbnN0cnVjdGlvbnNcbiIKLSItbm8tbWlwczE2XHRcdGRvIG5vdCBnZW5lcmF0ZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MjQ3Ci1tc2dpZCAiIgotIi1PMFx0XHRcdHJlbW92ZSB1bm5lZWRlZCBOT1BzLCBkbyBub3Qgc3dhcCBicmFuY2hlc1xuIgotIi1PXHRcdFx0cmVtb3ZlIHVubmVlZGVkIE5PUHMgYW5kIHN3YXAgYnJhbmNoZXNcbiIKLSItLXRyYXAsIC0tbm8tYnJlYWtcdHRyYXAgZXhjZXB0aW9uIG9uIGRpdiBieSAwIGFuZCBtdWx0IG92ZXJmbG93XG4iCi0iLS1icmVhaywgLS1uby10cmFwXHRicmVhayBleGNlcHRpb24gb24gZGl2IGJ5IDAgYW5kIG11bHQgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyNTMKLW1zZ2lkICIiCi0iLUtQSUMsIC1jYWxsX3NoYXJlZFx0Z2VuZXJhdGUgU1ZSNCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG4iCi0iLW5vbl9zaGFyZWRcdFx0ZG8gbm90IGdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcbiIKLSIteGdvdFx0XHRcdGFzc3VtZSBhIDMyIGJpdCBHT1RcbiIKLSItMzJcdFx0XHRjcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlIChkZWZhdWx0KVxuIgotIi02NFx0XHRcdGNyZWF0ZSA2NCBiaXQgb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkzMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgcmVsb2Mgc2l6ZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk0MTMKLW1zZ2lkICJVbm1hdGNoZWQgJSVoaSByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk1MTgKLW1zZ2lkICJJbnZhbGlkIFBDIHJlbGF0aXZlIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTYxNyBjb25maWcvdGMtc3BhcmMuYzoyNjE3IGNvbmZpZy90Yy1zcGFyYy5jOjI2MjQKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI2MzEgY29uZmlnL3RjLXNwYXJjLmM6MjYzOCBjb25maWcvdGMtc3BhcmMuYzoyNjQ1Ci0jOiBjb25maWcvdGMtc3BhcmMuYzoyNjU0IGNvbmZpZy90Yy1zcGFyYy5jOjI2NjUgY29uZmlnL3RjLXNwYXJjLmM6MjY5MQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjcxNCB3cml0ZS5jOjk3MiB3cml0ZS5jOjEwMzYKLW1zZ2lkICJyZWxvY2F0aW9uIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTYzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJCcmFuY2ggdG8gb2RkIGFkZHJlc3MgKCVseCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5Nzg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUwOGx4ICBVTkRFRklORURcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk4NTQKLW1zZ2lkICJBbGlnbm1lbnQgbmVnYXRpdmU6IDAgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5OTQyCi1tc2dpZCAiTm8gcmVhZCBvbmx5IGRhdGEgc2VjdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk5NjUKLW1zZ2lkICJHbG9iYWwgcG9pbnRlcnMgbm90IHN1cHBvcnRlZDsgcmVjb21waWxlIC1HIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDA1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gc3VjaCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLm9wdGlvbiBwaWMlZCBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIG9wdGlvbiBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDE2MgotbXNnaWQgImBub3Jlb3JkZXInIG11c3QgYmUgc2V0IGJlZm9yZSBgbm9tYWNybyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDE5NwotbXNnaWQgInVua25vd24gSVNBIGxldmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAyMjAKLW1zZ2lkICIuc2V0IHBvcCB3aXRoIG5vIC5zZXQgcHVzaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRyaWVkIHRvIHNldCB1bnJlY29nbml6ZWQgc3ltYm9sOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAyOTQKLW1zZ2lkICIuY3Bsb2FkIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMzc2Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgdXNlIG9mIC5ncHdvcmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDUxMwotbXNnaWQgImV4cGVjdGVkIGAkJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNTIxCi1tc2dpZCAiQmFkIHJlZ2lzdGVyIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNTM3Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHJlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDczNAotbXNnaWQgInVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSB0byBkaWZmZXJlbnQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwODQzCi1tc2dpZCAidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwOTI2Ci1tc2dpZCAiQVQgdXNlZCBhZnRlciBcIi5zZXQgbm9hdFwiIG9yIG1hY3JvIHVzZWQgYWZ0ZXIgXCIuc2V0IG5vbWFjcm9cIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwOTg5Ci1tc2dpZCAiRG91YmxlIGNoZWNrIGZ4X3JfdHlwZSBpbiB0Yy1taXBzLmM6dGNfZ2VuX3JlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE0NzAKLW1zZ2lkICJtaXNzaW5nIGAuZW5kJyBhdCBlbmQgb2YgYXNzZW1ibHkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTQ4NQotbXNnaWQgIkV4cGVjdGVkIHNpbXBsZSBudW1iZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE1MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyVjJyAweCUwMnhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTEzCi1tc2dpZCAiSW52YWxpZCBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTU2OAotbXNnaWQgIi5lbmQgbm90IGluIHRleHQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTcyCi1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTU4MQotbXNnaWQgIi5lbmQgc3ltYm9sIGRvZXMgbm90IG1hdGNoIC5lbnQgc3ltYm9sLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTg0Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgbWlzc2luZyBvciB1bmtub3duIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNjU5Ci1tc2dpZCAiLmVudCBvciAuYWVudCBub3QgaW4gdGV4dCBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNjYyCi1tc2dpZCAibWlzc2luZyBgLmVuZCciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTY5NSBlY29mZi5jOjMyMjYKLW1zZ2lkICIuZnJhbWUgb3V0c2lkZSBvZiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE3MDYgZWNvZmYuYzozMjM3Ci1tc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTczNgotbXNnaWQgIi5tYXNrLy5mbWFzayBvdXRzaWRlIG9mIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTc0MwotbXNnaWQgIkJhZCAubWFzay8uZm1hc2sgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6MzE0Ci1tc2dpZCAiIgotIk1OMTAyMDAgb3B0aW9uczpcbiIKLSJub25lIHlldFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6Nzg5IGNvbmZpZy90Yy1tbjEwMzAwLmM6NzUwIGNvbmZpZy90Yy1wcGMuYzoxNjEzCi0jOiBjb25maWcvdGMtdjg1MC5jOjE2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjMzMwotbXNnaWQgIiIKLSJNTjEwMzAwIG9wdGlvbnM6XG4iCi0ibm9uZSB5ZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjc2OAotbXNnaWQgIkludmFsaWQgb3Bjb2RlL29wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTA5OQotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NDQzCi1tc2dpZCAiSW52YWxpZCBzeW50YXggaW4gUEMtcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjQ2NwotbXNnaWQgIkludmFsaWQgc3ludGF4IGluIEV4dGVybmFsIGFkZHJlc3NpbmcgbW9kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo1MzYKLW1zZ2lkICJJbnZhbGlkIHN5bnRheCBpbiBNZW1vcnkgUmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjYwMwotbXNnaWQgIkludmFsaWQgc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIChiLHcsZCxxKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo2MDgKLW1zZ2lkICJTeW50YXggaW4gc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIFtSbjptXSB3aGVyZSBuPVswLi43XSBtPXtiLHcsZCxxfSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo2MTQKLW1zZ2lkICJTY2FsZWQtaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NjIzCi1tc2dpZCAiSW52YWxpZCBvciBpbGxlZ2FsIGFkZHJlc3NpbmcgbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZC1pbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo3MzAKLW1zZ2lkICJQcmVtYXR1cmUgZW5kIG9mIHN1ZmZpeCAtLSBEZWZhdWx0aW5nIHRvIGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NzQzCi1tc2dpZCAiQmFkIHN1ZmZpeCBhZnRlciAnOicgdXNlIHtifHd8ZH0gRGVmYXVsdGluZyB0byBkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjc4NAotbXNnaWQgIlZlcnkgc2hvcnQgaW5zdHIgdG8gb3B0aW9uLCBpZSB5b3UgY2FuJ3QgZG8gaXQgb24gYSBOVUxMc3RyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjgyOAotbXNnaWQgIk5vIHN1Y2ggZW50cnkgaW4gbGlzdC4gKGNwdS9tbXUgcmVnaXN0ZXIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjg2OQotbXNnaWQgIkludGVybmFsIGNvbnNpc3RlbmN5IGVycm9yLiAgY2hlY2sgbnMzMmstb3Bjb2RlLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6ODkwCi1tc2dpZCAiQWRkcmVzcyBvZiBpbW1lZGlhdGUgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo4OTEKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSB3cml0ZSBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMDE4Ci1tc2dpZCAiQmFkIG9wY29kZS10YWJsZS1vcHRpb24sIGNoZWNrIGluIGZpbGUgbnMzMmstb3Bjb2RlLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTA0NwotbXNnaWQgIk5vIHN1Y2ggb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjExMTUKLW1zZ2lkICJCYWQgc3VmZml4LCBkZWZhdWx0aW5nIHRvIGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTEzNwotbXNnaWQgIlRvbyBtYW55IG9wZXJhbmRzIHBhc3NlZCB0byBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiBjaGVjayBlcnJvciBpbiBkZWZhdWx0Ci0jOiBjb25maWcvdGMtbnMzMmsuYzoxMTQ4Ci1tc2dpZCAiV3JvbmcgbnVtYmVycyBvZiBvcGVyYW5kcyBpbiBkZWZhdWx0LCBjaGVjayBuczMyay1vcGNvZGVzLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTE1MwotbXNnaWQgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMjcyCi1tc2dpZCAiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvYmluYXJ5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjEyODgKLW1zZ2lkICJCaWdudW0gdG9vIGJpZyBmb3IgbG9uZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMzYzCi1tc2dpZCAiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMzY4Ci1tc2dpZCAiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbbl0udHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBXZSBjYW50IHJlbGF4IHRoaXMgY2FzZQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQwMgotbXNnaWQgIkNhbid0IHJlbGF4IGRpZmZlcmVuY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQ1MQotbXNnaWQgIkRpc3BsYWNlbWVudCB0byBsYXJnZSBmb3IgOmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQ2MgotbXNnaWQgIkludGVybmFsIGxvZ2ljIGVycm9yIGluIGlpZi5paWZQW10udHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBzdG9yYWdlIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTUyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiBmb3Igc3RvcmFnZSB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE1NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgaGFzaCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTYzNgotbXNnaWQgIkJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNjQ1Ci1tc2dpZCAiV29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlLiAgbGluZSBudW1iZXIgbm90IHZhbGlkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE2NTkKLW1zZ2lkICJEb3VibGUgd29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgbG9naWMgZXJyb3IuICBsaW5lICVzLCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNzI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGxvZ2ljIGVycm9yLiBsaW5lICVzLCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxODM4Ci1tc2dpZCAiQml0IGZpZWxkIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoyMDg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIG9wdGlvbiAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjIxMDMKLW1zZ2lkICIiCi0iTlMzMksgb3B0aW9uczpcbiIKLSItbTMyMDMyIHwgLW0zMjUzMlx0c2VsZWN0IHZhcmlhbnQgb2YgTlMzMksgYXJjaGl0ZWN0dXJlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MjI4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgZmluZCByZWxvY2F0aW9uIHR5cGUgZm9yIHN5bWJvbCAlcywgY29kZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc3dpdGNoIC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjg3MQotbXNnaWQgIiIKLSJQb3dlclBDIG9wdGlvbnM6XG4iCi0iLXVcdFx0XHRpZ25vcmVkXG4iCi0iLW1wd3J4LCAtbXB3cjJcdFx0Z2VuZXJhdGUgY29kZSBmb3IgSUJNIFBPV0VSLzIgKFJJT1MyKVxuIgotIi1tcHdyXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgSUJNIFBPV0VSIChSSU9TMSlcbiIKLSItbTYwMVx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAxXG4iCi0iLW1wcGMsIC1tcHBjMzIsIC1tNDAzLCAtbTYwMywgLW02MDRcbiIKLSJcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYwMy82MDRcbiIKLSItbXBwYzY0LCAtbTYyMFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYyMFxuIgotIi1tcHBjNjRicmlkZ2VcdFx0Z2VuZXJhdGUgY29kZSBmb3IgUG93ZXJQQyA2NCwgaW5jbHVkaW5nIGJyaWRnZSBpbnNuc1xuIgotIi1tY29tXHRcdFx0Z2VuZXJhdGUgY29kZSBQb3dlci9Qb3dlclBDIGNvbW1vbiBpbnN0cnVjdGlvbnNcbiIKLSItbWFueVx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKFBXUi9QV1JYL1BQQylcbiIKLSItbXJlZ25hbWVzXHRcdEFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcbiIKLSItbW5vLXJlZ25hbWVzXHRcdERvIG5vdCBhbGxvdyBzeW1ib2xpYyBuYW1lcyBmb3IgcmVnaXN0ZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjg4NgotbXNnaWQgIiIKLSItbXJlbG9jYXRhYmxlXHRcdHN1cHBvcnQgZm9yIEdDQydzIC1tcmVsb2NhdGJsZSBvcHRpb25cbiIKLSItbXJlbG9jYXRhYmxlLWxpYlx0c3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlLWxpYiBvcHRpb25cbiIKLSItbWVtYlx0XHRcdHNldCBQUENfRU1CIGJpdCBpbiBFTEYgZmxhZ3NcbiIKLSItbWxpdHRsZSwgLW1saXR0bGUtZW5kaWFuXG4iCi0iXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmVcbiIKLSItbWJpZywgLW1iaWctZW5kaWFuXHRnZW5lcmF0ZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZVxuIgotIi1tc29sYXJpc1x0XHRnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG4iCi0iLW1uby1zb2xhcmlzXHRcdGRvIG5vdCBnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG4iCi0iLVZcdFx0XHRwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcbiIKLSItUXksIC1Rblx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjkyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIGRlZmF1bHQgY3B1ID0gJXMsIG9zID0gJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjk0NgotbXNnaWQgIk5laXRoZXIgUG93ZXIgbm9yIFBvd2VyUEMgb3Bjb2RlcyB3ZXJlIHNlbGVjdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6OTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgaW5zdHJ1Y3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjEwMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBtYWNybyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTIyMwotbXNnaWQgImlkZW50aWZpZXIrY29uc3RhbnRAZ290IG1lYW5zIGlkZW50aWZpZXJAZ290K2NvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxMjc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIHJlbG9jYXRpb25zIGRvIG5vdCBmaXQgaW4gJWQgYnl0ZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTM3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggb2YgLmxjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTQ1OQotbXNnaWQgIlJlbG9jYXRpb24gY2Fubm90IGJlIGRvbmUgd2hlbiB1c2luZyAtbXJlbG9jYXRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInN5bnRheCBlcnJvcjogaW52YWxpZCB0b2Mgc3BlY2lmaWVyIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE1NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ludGF4IGVycm9yOiBleHBlY3RlZCBgXScsIGZvdW5kICBgJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNzg4Ci1tc2dpZCAiW3RvY3ZdIHN5bWJvbCBpcyBub3QgYSB0b2Mgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNzk5Ci1tc2dpZCAiVW5pbXBsZW1lbnRlZCB0b2MzMiBleHByZXNzaW9uIG1vZGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxODA0Ci1tc2dpZCAiVW5pbXBsZW1lbnRlZCB0b2M2NCBleHByZXNzaW9uIG1vZGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxODA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIFslZF0gZnJvbSBwYXJzZV90b2NfZW50cnkhXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE5NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ludGF4IGVycm9yOyBmb3VuZCBgJWMnIGJ1dCBleHBlY3RlZCBgJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMDY4Ci1tc2dpZCAid3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMTI0Ci1tc2dpZCAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZTogd2FudCBhLHcseCxlIGluIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjI0MgotbXNnaWQgIm1pc3Npbmcgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjI1MQotbXNnaWQgIm5lZ2F0aXZlIHNpemUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIyOTIKLW1zZ2lkICJtaXNzaW5nIHJlYWwgc3ltYm9sIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIzMTMKLW1zZ2lkICJhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjU0NAotbXNnaWQgIlRoZSBYQ09GRiBmaWxlIGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjY1MiBjb25maWcvdGMtcHBjLmM6MzE2NCByZWFkLmM6Mjk1MAotbXNnaWQgIm1pc3NpbmcgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI2NzAKLW1zZ2lkICJpbGxlZ2FsIC5zdGFieCBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI3MDIKLW1zZ2lkICJtaXNzaW5nIGNsYXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNzExCi1tc2dpZCAibWlzc2luZyB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNzcyCi1tc2dpZCAibWlzc2luZyBzeW1ib2wgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6Mjk0NAotbXNnaWQgIm5lc3RlZCAuYnMgYmxvY2tzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyOTc3Ci1tc2dpZCAiLmVzIHdpdGhvdXQgcHJlY2VkaW5nIC5icyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MzE1NgotbXNnaWQgIm5vbi1jb25zdGFudCBieXRlIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozMjAxCi1tc2dpZCAiLnRjIG5vdCBpbiAudG9jIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjMyMjAKLW1zZ2lkICIudGMgd2l0aCBubyBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MzI5NQotbXNnaWQgIk5vIHByZXZpb3VzIHNlY3Rpb24gdG8gcmV0dXJuIHRvLiBEaXJlY3RpdmUgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIy4gU2VjdGlvbiBDb250ZW50cwotIy4gdW5rbm93bgotIzogY29uZmlnL3RjLXBwYy5jOjM3MTQKLW1zZ2lkICJVbnN1cHBvcnRlZCBzZWN0aW9uIGF0dHJpYnV0ZSAtLSAnYSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjM5MDQKLW1zZ2lkICJiYWQgc3ltYm9sIHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6Mzk5NQotbXNnaWQgIlVucmVjb2duaXplZCBzeW1ib2wgc3VmZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0MDc3Ci1tc2dpZCAidHdvIC5mdW5jdGlvbiBwc2V1ZG8tb3BzIHdpdGggbm8gaW50ZXJ2ZW5pbmcgLmVmIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0MDg5Ci1tc2dpZCAiLmVmIHdpdGggbm8gcHJlY2VkaW5nIC5mdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDIxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3YXJuaW5nOiBzeW1ib2wgJXMgaGFzIG5vIGNzZWN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0NTEzCi1tc2dpZCAic3ltYm9sIGluIC50b2MgZG9lcyBub3QgbWF0Y2ggYW55IC50YyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDgxMAotbXNnaWQgInVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDg2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZW1pdCBQQyByZWxhdGl2ZSAlcyByZWxvY2F0aW9uIGFnYWluc3QgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ4NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDkzMQotbXNnaWQgIm11c3QgYnJhbmNoIHRvIGFuIGFkZHJlc3MgYSBtdWx0aXBsZSBvZiA0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0OTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkBsb2NhbCBvciBAcGx0IGJyYW5jaCBkZXN0aW5hdGlvbiBpcyB0b28gZmFyIGF3YXksICVsZCBieXRlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDk1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJHYXMgZmFpbHVyZSwgcmVsb2MgdmFsdWUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo1MjEKLW1zZ2lkICJpbGxlZ2FsIHJlZ2lzdGVyIGFmdGVyIEAtIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjUzNwotbXNnaWQgIm11c3QgYmUgQChyMCwuLi4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjU1MwotbXNnaWQgInN5bnRheCBlcnJvciBpbiBAKHIwLC4uLikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NTg1IGNvbmZpZy90Yy1zaC5jOjU5MAotbXNnaWQgInN5bnRheCBlcnJvciBpbiBAKGRpc3AsW1JuLCBnYnIsIHBjXSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NTk1Ci1tc2dpZCAiZXhwZWN0aW5nICkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NjA0Ci1tc2dpZCAiaWxsZWdhbCByZWdpc3RlciBhZnRlciBAIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjEyMjgKLW1zZ2lkICIudXNlcyBwc2V1ZG8tb3Agc2VlbiB3aGVuIG5vdCByZWxheGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMjM0Ci1tc2dpZCAiYmFkIC51c2VzIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMjg5Ci1tc2dpZCAiIgotIlNIIG9wdGlvbnM6XG4iCi0iLWxpdHRsZVx0XHRcdGdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gY29kZVxuIgotIi1yZWxheFx0XHRcdGFsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHNcbiIKLSItc21hbGxcdFx0XHRhbGlnbiBzZWN0aW9ucyB0byA0IGJ5dGUgYm91bmRhcmllcywgbm90IDE2XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTI5OSBjb25maWcvdGMtdzY1LmM6ODgzCi1tc2dpZCAiY2FsbCB0byB0Y19Ob3V0X2ZpeF90b19jaGFycyBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMzg1Ci1tc2dpZCAiLnVzZXMgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNDA0Ci1tc2dpZCAiY2FuJ3QgZmluZCBmaXh1cCBwb2ludGVkIHRvIGJ5IC51c2VzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE0MjcKLW1zZ2lkICIudXNlcyB0YXJnZXQgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE2NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCBvdmVyZmxvd3MgOC1iaXQgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTY1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTY1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIHVuZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDgtYml0IGZpZWxkICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm92ZXJmbG93IGluIGJyYW5jaCB0byAlczsgY29udmVydGVkIGludG8gbG9uZ2VyIGluc3RydWN0aW9uIHNlcXVlbmNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE3ODIgY29uZmlnL3RjLXNoLmM6MTgxMCBjb25maWcvdGMtc3BhcmMuYzozNDM2Ci0jOiBjb25maWcvdGMtc3BhcmMuYzozNDU1Ci1tc2dpZCAibWlzYWxpZ25lZCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE5ODggY29uZmlnL3RjLXNoLmM6MTk5NSBjb25maWcvdGMtc2guYzoyMDAyCi0jOiBjb25maWcvdGMtc2guYzoyMDA5Ci1tc2dpZCAicGNyZWwgdG9vIGZhciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoyMDczCi1tc2dpZCAibWlzYWxpZ25lZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MjA4MQotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjU3Ci1tc2dpZCAiSW52YWxpZCBkZWZhdWx0IGFyY2hpdGVjdHVyZSwgYnJva2VuIGFzc2VtYmxlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjYxIGNvbmZpZy90Yy1zcGFyYy5jOjQ0OAotbXNnaWQgIkJhZCBvcGNvZGUgdGFibGUsIGJyb2tlbiBhc3NlbWJsZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjQyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAteGFyY2g9JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NDQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIC1BJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yICVkIGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTQ2Ci1tc2dpZCAiVW5yZWNvZ25pemVkIG9wdGlvbiBmb2xsb3dpbmcgLUsiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTcwCi1tc2dpZCAiU1BBUkMgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1NzgKLW1zZ2lkICIiCi0iXG4iCi0iLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTc5Ci1tc2dpZCAiIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiBTUEFSQyBhcmNoaXRlY3R1cmVcbiIKLSItYnVtcFx0XHRcdHdhcm4gd2hlbiBhc3NlbWJsZXIgc3dpdGNoZXMgYXJjaGl0ZWN0dXJlc1xuIgotIi1zcGFyY1x0XHRcdGlnbm9yZWRcbiIKLSItLWVuZm9yY2UtYWxpZ25lZC1kYXRhXHRmb3JjZSAubG9uZywgZXRjLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHlcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1ODUKLW1zZ2lkICIta1x0XHRcdGdlbmVyYXRlIFBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU4OQotbXNnaWQgIiIKLSItMzJcdFx0XHRjcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlXG4iCi0iLTY0XHRcdFx0Y3JlYXRlIDY0IGJpdCBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFx0XHRbZGVmYXVsdCBpcyAlZF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1OTQKLW1zZ2lkICIiCi0iLVRTT1x0XHRcdHVzZSBUb3RhbCBTdG9yZSBPcmRlcmluZ1xuIgotIi1QU09cdFx0XHR1c2UgUGFydGlhbCBTdG9yZSBPcmRlcmluZ1xuIgotIi1STU9cdFx0XHR1c2UgUmVsYXhlZCBNZW1vcnkgT3JkZXJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHRcdFx0W2RlZmF1bHQgaXMgJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NjAwCi1tc2dpZCAiIgotIi1LUElDXHRcdFx0Z2VuZXJhdGUgUElDXG4iCi0iLVZcdFx0XHRwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcbiIKLSItcVx0XHRcdGlnbm9yZWRcbiIKLSItUXksIC1Rblx0XHRpZ25vcmVkXG4iCi0iLXNcdFx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NjA4Ci1tc2dpZCAiIgotIi1FTFx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lXG4iCi0iLUVCXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcbiIKLSItLWxpdHRsZS1lbmRpYW4tZGF0YVx0Z2VuZXJhdGUgY29kZSBmb3IgYSBtYWNoaW5lIGhhdmluZyBiaWcgZW5kaWFuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFuZCBsaXR0bGUgZW5kaWFuIGRhdGEuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjg1NgotbXNnaWQgIlN1cHBvcnQgZm9yIDY0LWJpdCBhcml0aG1ldGljIG5vdCBjb21waWxlZCBpbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6OTExCi1tc2dpZCAiRlAgYnJhbmNoIGluIGRlbGF5IHNsb3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6OTI3Ci1tc2dpZCAiRlAgYnJhbmNoIHByZWNlZGVkIGJ5IEZQIGluc3RydWN0aW9uOyBOT1AgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6OTQ3Ci1tc2dpZCAic2V0OiB1c2VkIHdpdGggbmVnYXRpdmUgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjk0OQotbXNnaWQgInNldDogbnVtYmVyIGxhcmdlciB0aGFuIDQyOTQ5NjcyOTUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTAwMAotbXNnaWQgInNldHg6IHRlbXBvcmFyeSByZWdpc3RlciBzYW1lIGFzIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjExNDUKLW1zZ2lkICJmYWlsZWQgc3BlY2lhbCBjYXNlIGluc24gc2FuaXR5IGNoZWNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyMzUKLW1zZ2lkICI6IGludmFsaWQgbWVtYmFyIG1hc2sgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjQ5Ci1tc2dpZCAiOiBpbnZhbGlkIG1lbWJhciBtYXNrIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTI1NAotbXNnaWQgIjogaW52YWxpZCBtZW1iYXIgbWFzayBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTI3MgotbXNnaWQgIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyODAKLW1zZ2lkICI6IGludmFsaWQgcHJlZmV0Y2ggZnVuY3Rpb24gZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjg1Ci1tc2dpZCAiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMzEzIGNvbmZpZy90Yy1zcGFyYy5jOjEzMjUKLW1zZ2lkICI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTM0OSBjb25maWcvdGMtc3BhcmMuYzoxMzY2Ci1tc2dpZCAiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEzNTQKLW1zZ2lkICI6IHJkIG9uIHdyaXRlIG9ubHkgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEzOTAKLW1zZ2lkICI6IGFzciBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDE2IGFuZCAzMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMzk4Ci1tc2dpZCAiOiBhc3IgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxNDA4Ci1tc2dpZCAiOiBleHBlY3RpbmcgJWFzck4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTc5OQotbXNnaWQgIjogVGhlcmUgYXJlIG9ubHkgNjQgZiByZWdpc3RlcnM7IFswLTYzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxODAxIGNvbmZpZy90Yy1zcGFyYy5jOjE4MTMKLW1zZ2lkICI6IFRoZXJlIGFyZSBvbmx5IDMyIGYgcmVnaXN0ZXJzOyBbMC0zMV0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTk4MgotbXNnaWQgIjogUEMtcmVsYXRpdmUgb3BlcmFuZCBjYW4ndCBiZSBhIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIwMTUKLW1zZ2lkICI6IGludmFsaWQgQVNJIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjAyMwotbXNnaWQgIjogaW52YWxpZCBBU0kgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMDI4Ci1tc2dpZCAiOiBpbnZhbGlkIEFTSSBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjEyNQotbXNnaWQgIk9QRiBpbW1lZGlhdGUgb3BlcmFuZCBvdXQgb2YgcmFuZ2UgKDAtMHgxZmYpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIxMzAKLW1zZ2lkICJub24taW1tZWRpYXRlIE9QRiBvcGVyYW5kLCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIxNDkKLW1zZ2lkICI6IGludmFsaWQgY3ByZWcgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgb3BlcmFuZHMlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdGVjdHVyZSBidW1wZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIG9uIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMjQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdGVjdHVyZSBtaXNtYXRjaCBvbiBcIiVzXCIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIyNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChSZXF1aXJlcyAlczsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyAlcy4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI3NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG9yIHVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMDM3Ci1tc2dpZCAiYmFkIC5yZXNlcnZlIHNlZ21lbnQgLS0gZXhwZWN0ZWQgQlNTIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzA1NAotbXNnaWQgIm1pc3NpbmcgYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMwNjUgY29uZmlnL3RjLXNwYXJjLmM6MzIxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJhbGlnbm1lbnQgdG9vIGxhcmdlOyBhc3N1bWluZyAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMDcxIGNvbmZpZy90Yy1zcGFyYy5jOjMyMTYKLW1zZ2lkICJuZWdhdGl2ZSBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzA4MSBjb25maWcvdGMtc3BhcmMuYzozMjM5Ci1tc2dpZCAiYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzE5NgotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIGNvbW1vbiBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6Mzg3Ci1tc2dpZCAiVGhlIC1hIG9wdGlvbiBkb2Vzbid0IGV4aXN0LiAoRGVzcGl0ZSB3aGF0IHRoZSBtYW4gcGFnZSBzYXlzISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzozOTEgY29uZmlnL3RjLXZheC5jOjMxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRGlzcGxhY2VtZW50IGxlbmd0aCAlcyBpZ25vcmVkISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzozOTUgY29uZmlnL3RjLXZheC5jOjMxMzMKLW1zZ2lkICJTWU1CT0wgVEFCTEUgbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjM5OSBjb25maWcvdGMtdmF4LmM6MzEzNwotbXNnaWQgIlRPS0VOIFRSQUNFIG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzo0MDMgY29uZmlnL3RjLXZheC5jOjMxNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSSBkb24ndCBuZWVkIG9yIHVzZSB0ZW1wLiBmaWxlIFwiJXNcIi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6NDA3IGNvbmZpZy90Yy12YXguYzozMTQ5Ci1tc2dpZCAiSSBkb24ndCB1c2UgYW4gaW50ZXJwYXNzIGZpbGUhIC1WIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6NDIxCi1tc2dpZCAiIgotIlRhaG9lIG9wdGlvbnM6XG4iCi0iLWFcdFx0XHRpZ25vcmVkXG4iCi0iLWQgTEVOR1RIXHRcdGlnbm9yZWRcbiIKLSItSlx0XHRcdGlnbm9yZWRcbiIKLSItU1x0XHRcdGlnbm9yZWRcbiIKLSItdCBGSUxFXHRcdFx0aWdub3JlZFxuIgotIi1UXHRcdFx0aWdub3JlZFxuIgotIi1WXHRcdFx0aWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEwNzUKLW1zZ2lkICJDYXN0aW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCBpcyBiYWQgZm9ybSwgYW5kIGlzIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjExMzEKLW1zZ2lkICJDb3VsZG4ndCBwYXJzZSB0aGUgW2luZGV4XSBpbiB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjExMzcKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIHRoZSBvcGVuaW5nICdbJyBmb3IgdGhlIGluZGV4IG9mIHRoaXMgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTE3NwotbXNnaWQgIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJygnIGZvciB0aGUgZGVyZWYgb2YgdGhpcyBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMTg3Ci1tc2dpZCAiT3BlcmFuZCBjYW4ndCBiZSBib3RoIHByZS1pbmMgYW5kIHBvc3QtZGVjLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMjE3Ci1tc2dpZCAiSSBwYXJzZWQgMiByZWdpc3RlcnMgaW4gdGhpcyBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMjY3Ci1tc2dpZCAiQ2FuJ3QgcmVsb2NhdGUgZXhwcmVzc2lvbiBlcnJvci4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBpcyBhbiBlcnJvci4gVGFob2UgZG9lc24ndCBhbGxvdyBhbnkgZXhwcmVzc2lvbnMKLSMuIGJpZ2dlciB0aGF0IGEgMzIgYml0IGxvbmcgd29yZC4gQW55IGJpZ2dlciBoYXMgdG8gYmUgcmVmZXJlbmNlZAotIy4gYnkgYWRkcmVzcy4KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEyNzQKLW1zZ2lkICJFeHByZXNzaW9uIGlzIHRvbyBsYXJnZSBmb3IgYSAzMiBiaXRzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMjc5Ci1tc2dpZCAiSnVuayBhdCBlbmQgb2YgZXhwcmVzc2lvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMxOQotbXNnaWQgIlN5bnRheCBlcnJvciBpbiBkaXJlY3QgcmVnaXN0ZXIgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMyMQotbXNnaWQgIllvdSBjYW4ndCBpbmRleCBhIHJlZ2lzdGVyIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzI0Ci1tc2dpZCAiU1AgY2FuJ3QgYmUgdGhlIHNvdXJjZSBvcGVyYW5kIHdpdGggZGlyZWN0IHJlZ2lzdGVyIGFkZHJlc3NpbmcuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMjYKLW1zZ2lkICJDYW4ndCB0YWtlIHRoZSBhZGRyZXNzIG9mIGEgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMjgKLW1zZ2lkICJEaXJlY3QgUmVnaXN0ZXIgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMzMAotbXNnaWQgIkZvciBxdWFkIGFjY2VzcywgdGhlIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBhbmQgPCAxNC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMzMgotbXNnaWQgIllvdSBjYW4ndCBjYXN0IGEgZGlyZWN0IHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzM4Ci1tc2dpZCAiVXNpbmcgcmVnIDE0IGZvciBxdWFkd29yZHMgY2FuIHRyb21wIHRoZSBGUCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM1MAotbXNnaWQgIlN5bnRheCBlcnJvciBpbiBhdXRvLWRlYyBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzUyCi1tc2dpZCAiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggYXV0byBkZWMgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM1NAotbXNnaWQgIkF1dG8gZGVjIG1vZGUgY2FudCBiZSB1c2VkIGZvciByZWFkaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzU2Ci1tc2dpZCAiQXV0byBkZWMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNTgKLW1zZ2lkICJBdXRvIGRlYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzYwCi1tc2dpZCAiQXV0byBkZWMgd29uJ3Qgd29yayB3aXRoIHF1YWR3b3Jkcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM2NwotbXNnaWQgIlN5bnRheCBlcnJvciBpbiBvbmUgb2YgdGhlIGF1dG8taW5jIG1vZGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzczCi1tc2dpZCAiQXV0byBpbmMgZGVmZXJyZWQgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNzUKLW1zZ2lkICJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGluYyBkZWZlcnJlZCBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzc3IGNvbmZpZy90Yy10YWhvZS5jOjEzODgKLW1zZ2lkICJBdXRvIGluYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzg0Ci1tc2dpZCAiWW91IGNhbid0IHdyaXRlIHRvIGFuIGF1dG8gaW5jIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzg2Ci1tc2dpZCAiQXV0byBpbmMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzOTAKLW1zZ2lkICJBdXRvIGluYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzkyCi1tc2dpZCAiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggaW4gYXV0byBpbmMgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQwMAotbXNnaWQgIllvdSBjYW4ndCBpbmRleCB0aGUgc3AgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE0MDYKLW1zZ2lkICJTeW50YXggZXJyb3IgaW4gcmVnaXN0ZXIgZGlzcGxhY2VkIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE0MjUKLW1zZ2lkICJBbiBvZmZlc3QgaXMgbmVlZGVkIGZvciB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE0MzcKLW1zZ2lkICJZb3UgY2FuJ3QgaW5kZXggYSByZWdpc3RlciBpbiBpbW1lZGlhdGUgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQzOQotbXNnaWQgIkltbWVkaWF0ZSBhY2Nlc3MgY2FuJ3QgYmUgdXNlZCBhcyBhbiBhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbXBpbGVyIGJ1ZzogT0REIG51bWJlciBvZiBieXRlcyBpbiBhcmcgc3RydWN0dXJlICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNTc3IGNvbmZpZy90Yy12YXguYzoxODQ3Ci1tc2dpZCAiTm90IGVub3VnaCBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNTg3IGNvbmZpZy90Yy12YXguYzoxODU0Ci1tc2dpZCAiVG9vIG1hbnkgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTYzOCBjb25maWcvdGMtdmF4LmM6MzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIHN0YXRlbWVudCBkdWUgdG8gXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE3MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29tcGxpbGVyIGJ1ZzogR290IGEgY2FzZSAoJWQpIEkgd2Fzbid0IGV4cGVjdGluZy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTgyNwotbXNnaWQgIlJlYWwgYnJhbmNoIGRpc3BsYWNlbWVudHMgbXVzdCBiZSBleHByZXNzaW9ucy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTgzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJDb21wbGllciBlcnJvcjogSSBnb3QgYW4gdW5rbm93biBzeW50aGV0aWMgYnJhbmNoIDolYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxOTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJhcmYsIGJhZCBtb2RlICV4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6OTAKLW1zZ2lkICJSZWxheGF0aW9uIGlzIGEgbHV4dXJ5IHdlIGNhbid0IGFmZm9yZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoxNDEKLW1zZ2lkICJiYWQgY2FsbCB0byBtZF9hdG9mICgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjI0NQotbXNnaWQgIic6JyBub3QgZm9sbG93ZWQgYnkgJ20nIG9yICdzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoyNTkKLW1zZ2lkICJwYXJlbiBuZXN0aW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjI3NAotbXNnaWQgIm1pc21hdGNoZWQgcGFyZW50aGVzaXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6NDY3Ci1tc2dpZCAidW5oYW5kbGVkIGV4cHJlc3Npb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo2ODIKLW1zZ2lkICJzeW1ib2wgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgb3IgMzIgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo3MDUKLW1zZ2lkICJ1bmhhbmRsZWQgb3BlcmFuZCBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo3NDYKLW1zZ2lkICJ1bmhhbmRsZWQgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo3OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBtbmVtb25pYzogJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvcGVyYW5kczogJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo4OTAKLW1zZ2lkICJ1bmhhbmRsZWQgcHJlZGVmaW5lZCBzeW1ib2wgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo5ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUEMgb2Zmc2V0IDB4JWx4IG91dHNpZGUgcmFuZ2UgMHglbHgtMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6MTAwMQotbXNnaWQgInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgaW4gZml4dXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6MTAzOAotbXNnaWQgIm1kX2NvbnZlcnRfZnJhZygpIG5vdCBpbXBsZW1lbnRlZCB5ZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoyNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLkNPTU1vbiBsZW5ndGggKCVkLikgPCAwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTAwMQotbXNnaWQgImludGVybmFsIGZhaWx1cmUgaW4gcGFyc2VfcmVnaXN0ZXJfbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwMTkKLW1zZ2lkICJjb25zdGFudCBleHByZXNzaW9uIG9yIHJlZ2lzdGVyIGxpc3QgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMDI0IGNvbmZpZy90Yy12ODUwLmM6MTAzNyBjb25maWcvdGMtdjg1MC5jOjEwNTYKLW1zZ2lkICJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwOTYgY29uZmlnL3RjLXY4NTAuYzoxMTYwCi1tc2dpZCAiaWxsZWdhbCByZWdpc3RlciBpbmNsdWRlZCBpbiBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTEwMwotbXNnaWQgInN5c3RlbSByZWdpc3RlcnMgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTA4Ci1tc2dpZCAiUFNXIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTExNQotbXNnaWQgIkhpZ2ggdmFsdWUgc3lzdGVtIHJlZ2lzdGVycyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExMzkKLW1zZ2lkICJzZWNvbmQgcmVnaXN0ZXIgc2hvdWxkIGZvbGxvdyBkYXNoIGluIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTg3Ci1tc2dpZCAiIFY4NTAgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExODgKLW1zZ2lkICIgIC1td2Fybi1zaWduZWQtb3ZlcmZsb3cgICAgV2FybiBpZiBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvd1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE4OQotbXNnaWQgIiIKLSIgIC1td2Fybi11bnNpZ25lZC1vdmVyZmxvdyAgV2FybiBpZiB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTkwCi1tc2dpZCAiICAtbXY4NTAgICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTkxCi1tc2dpZCAiICAtbXY4NTBlICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE5MgotbXNnaWQgIiAgLW12ODUwZWEgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MGVhXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTkzCi1tc2dpZCAiIgotIiAgLW12ODUwYW55ICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyBnZW5lcmljLCBkZXNwaXRlIGFueSBwcm9jZXNzb3IgIgotInNwZWNpZmljIGluc3RydWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTIwNCBjb25maWcvdGMtdjg1MC5jOjEyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBjb21tYW5kIGxpbmUgb3B0aW9uOiAtJWMlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTM5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gZGV0ZXJtaW5lIGRlZmF1bHQgdGFyZ2V0IHByb2Nlc3NvciBmcm9tIHN0cmluZzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxNDQyCi1tc2dpZCAiY3RvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE0NTkKLW1zZ2lkICJzZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE0NzYKLW1zZ2lkICJ6ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE0OTQKLW1zZ2lkICJ0ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE3MTIKLW1zZ2lkICJUYXJnZXQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpbnN0cnVjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODAyIGNvbmZpZy90Yy12ODUwLmM6MTgzMiBjb25maWcvdGMtdjg1MC5jOjIwMTgKLW1zZ2lkICJpbW1lZGlhdGUgb3BlcmFuZCBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODE0Ci1tc2dpZCAiQUFBUkcgLT4gdW5oYW5kbGVkIGNvbnN0YW50IHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTg1OAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4NjMKLW1zZ2lkICJyZWdpc3RlciByMCBjYW5ub3QgYmUgdXNlZCBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTg3NQotbXNnaWQgImludmFsaWQgc3lzdGVtIHJlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODg4Ci1tc2dpZCAiZXhwZWN0ZWQgRVAgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTA0Ci1tc2dpZCAiaW52YWxpZCBjb25kaXRpb24gY29kZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTkyNSBjb25maWcvdGMtdjg1MC5jOjE5MjkKLW1zZ2lkICJjb25zdGFudCB0b28gYmlnIHRvIGZpdCBpbnRvIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTk4MQotbXNnaWQgInN5bnRheCBlcnJvcjogdmFsdWUgaXMgbWlzc2luZyBiZWZvcmUgdGhlIHJlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTgzCi1tc2dpZCAic3ludGF4IGVycm9yOiByZWdpc3RlciBub3QgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTk3Ci1tc2dpZCAic3ludGF4IGVycm9yOiBzeXN0ZW0gcmVnaXN0ZXIgbm90IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MjAwMgotbXNnaWQgInN5bnRheCBlcnJvcjogY29uZGl0aW9uIGNvZGUgbm90IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MjAzOAotbXNnaWQgImludmFsaWQgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlZJUF9CRUdJTiBlcnJvcjolcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIHN0YXRlbWVudCBiZWNhdXNlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6NDM0Ci1tc2dpZCAiQ2FuJ3QgcmVsb2NhdGUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6NTM3Ci1tc2dpZCAiQmlnbnVtIG5vdCBwZXJtaXR0ZWQgaW4gc2hvcnQgbGl0ZXJhbC4gSW1tZWRpYXRlIG1vZGUgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjU0NgotbXNnaWQgIkNhbid0IGRvIGZsb251bSBzaG9ydCBsaXRlcmFsOiBpbW1lZGlhdGUgbW9kZSB1c2VkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6NTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkEgYmlnbnVtL2Zsb251bSBtYXkgbm90IGJlIGEgZGlzcGxhY2VtZW50OiAweCVseCB1c2VkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo5MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2hvcnQgbGl0ZXJhbCBvdmVyZmxvdyglbGQuKSwgaW1tZWRpYXRlIG1vZGUgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjkyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJGb3JjZWQgc2hvcnQgbGl0ZXJhbCB0byBpbW1lZGlhdGUgbW9kZS4gbm93X3NlZz0lcyB0b19zZWc9JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjk4MQotbXNnaWQgIkxlbmd0aCBzcGVjaWZpY2F0aW9uIGlnbm9yZWQuIEFkZHJlc3MgbW9kZSA5RiB1c2VkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoxMDMwCi1tc2dpZCAiSW52YWxpZCBvcGVyYW5kOiAgaW1tZWRpYXRlIHZhbHVlIHVzZWQgYXMgYmFzZSBhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MTAzMgotbXNnaWQgIkludmFsaWQgb3BlcmFuZDogIGltbWVkaWF0ZSB2YWx1ZSB1c2VkIGFzIGFkZHJlc3MuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoxODI2Ci1tc2dpZCAib2RkIG51bWJlciBvZiBieXRlcyBpbiBvcGVyYW5kIGRlc2NyaXB0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoxODQyCi1tc2dpZCAiQmFkIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjIzOTkKLW1zZ2lkICJubyAnWycgdG8gbWF0Y2ggJ10nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNDE3Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIGluIFtdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNDE5Ci1tc2dpZCAiW1BDXSBpbmRleCBiYW5uZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI0NTQKLW1zZ2lkICJubyAnKCcgdG8gbWF0Y2ggJyknIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNTg5Ci1tc2dpZCAiaW52YWxpZCBicmFuY2ggb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYxOAotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzIEAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MjAKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyAjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjI0Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgLSgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjI2Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgKCkrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjI5Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MzEKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyBbXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYzMwotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjM1Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgZGlzcGxhY2VtZW50IGxlbmd0aCBzcGVjaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2NjUKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgb2YgU14jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjgyCi1tc2dpZCAiU14jIG5lZWRzIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2ODkKLW1zZ2lkICJTXiMgbWF5IG9ubHkgcmVhZC1hY2Nlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3MTQKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgb2YgLSgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzIwCi1tc2dpZCAiLShQQykgdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjcyMgotbXNnaWQgIltdaW5kZXggc2FtZSBhcyAtKClyZWdpc3RlcjogdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjc1OAotbXNnaWQgImludmFsaWQgb3BlcmFuZCBvZiAoKSsiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3NjQKLW1zZ2lkICIoUEMpKyB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzY2Ci1tc2dpZCAiW11pbmRleCBzYW1lIGFzICgpK3JlZ2lzdGVyOiB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzkxCi1tc2dpZCAiIyBjb25mbGljdHMgbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzkzCi1tc2dpZCAiIyBiYXJzIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyODE1Ci1tc2dpZCAid3JpdGluZyBvciBtb2RpZnlpbmcgIyBpcyB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyODQ1Ci1tc2dpZCAibGVuZ3RoIG5vdCBuZWVkZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4NTIKLW1zZ2lkICJjYW4ndCBbXWluZGV4IGEgcmVnaXN0ZXIsIGJlY2F1c2UgaXQgaGFzIG5vIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4NTQKLW1zZ2lkICJhIHJlZ2lzdGVyIGhhcyBubyBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyODY1Ci1tc2dpZCAiUEMgcGFydCBvZiBvcGVyYW5kIHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjMxOTQKLW1zZ2lkICIiCi0iVkFYIG9wdGlvbnM6XG4iCi0iLWQgTEVOR1RIXHRcdGlnbm9yZWRcbiIKLSItSlx0XHRcdGlnbm9yZWRcbiIKLSItU1x0XHRcdGlnbm9yZWRcbiIKLSItdCBGSUxFXHRcdFx0aWdub3JlZFxuIgotIi1UXHRcdFx0aWdub3JlZFxuIgotIi1WXHRcdFx0aWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzozMjAzCi1tc2dpZCAiIgotIlZNUyBvcHRpb25zOlxuIgotIi0rXHRcdFx0aGFzaCBlbmNvZGUgbmFtZXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVyc1xuIgotIi0xXHRcdFx0YGNvbnN0JyBoYW5kbGluZyBjb21wYXRpYmxlIHdpdGggZ2NjIDEueFxuIgotIi1IXHRcdFx0c2hvdyBuZXcgc3ltYm9sIGFmdGVyIGhhc2ggdHJ1bmNhdGlvblxuIgotIi1oIE5VTVx0XHRcdGRvbid0IGhhc2ggbWl4ZWQtY2FzZSBuYW1lcywgYW5kIGFkanVzdCBjYXNlOlxuIgotIlx0XHRcdDAgPSB1cHBlciwgMiA9IGxvd2VyLCAzID0gcHJlc2VydmUgY2FzZVxuIgotIi12XCJWRVJTSU9OXCJcdFx0Y29kZSBiZWluZyBhc3NlbWJsZWQgd2FzIHByb2R1Y2VkIGJ5IGNvbXBpbGVyIFwiVkVSU0lPTlwiXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXc2NS5jOjEzNgotbXNnaWQgIm5lZWQgb24gb3Igb2ZmLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdzY1LmM6MzIxIGNvbmZpZy90Yy13NjUuYzozNjQKLW1zZ2lkICJzeW50YXggZXJyb3IgYWZ0ZXIgPGV4cCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHJyJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciByaCVkLCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzozMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgcmwlZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHJxJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjMyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciByJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjM3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RlZCAlYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MzkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGEgd29yZCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6NDA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGFkZHJlc3MgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjY4MAotbXNnaWQgIk1pc3NpbmcgKSBpbiByYShyYikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjk0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kICVzMHgleCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMDg2Ci1tc2dpZCAiaW1tZWRpYXRlIG11c3QgYmUgMSBvciAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMDkxCi1tc2dpZCAiaW1tZWRpYXRlIDEgb3IgMiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTExOQotbXNnaWQgImNhbid0IHVzZSBSMCBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMjc4Ci1tc2dpZCAiQ2FuJ3QgZmluZCBvcGNvZGUgdG8gbWF0Y2ggb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjEzOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXRlY3R1cmUgLXolcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTQwNgotbXNnaWQgIiIKLSJaOEsgb3B0aW9uczpcbiIKLSItejgwMDFcdFx0XHRnZW5lcmF0ZSBzZWdtZW50ZWQgY29kZVxuIgotIi16ODAwMlx0XHRcdGdlbmVyYXRlIHVuc2VnbWVudGVkIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBzdWJ0cmFjdCBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyAlcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkZXBlbmQuYzoxOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBgJXMnIGZvciB3cml0aW5nIgotbXNnc3RyICIiCi0KLSM6IGRlcGVuZC5jOjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBjbG9zZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJTdHJpbmcgdG9vIGJpZyAoJWx1IGJ5dGVzKSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cmluZyBoYXNoIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MzQgZWNvZmYuYzoxODI3IGVjb2ZmLmM6MTg1MyBlY29mZi5jOjE4ODUgZWNvZmYuYzoyMDQxCi0jOiBlY29mZi5jOjIxNTUKLW1zZ2lkICJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE3MjEKLW1zZ2lkICJ0b28gbWFueSBzdF9FbmQncyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjIwNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHRhZyBoYXNoIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjIyMzMKLW1zZ2lkICJmYWtlIC5maWxlIGFmdGVyIHJlYWwgb25lIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjMyMQotbXNnaWQgIkZpbGVuYW1lIGdvZXMgb3ZlciBvbmUgcGFnZSBib3VuZGFyeS4iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNDU2Ci1tc2dpZCAiLmJlZ2luIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI0NjMKLW1zZ2lkICIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNDk1Ci1tc2dpZCAiLmJlbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjUwMgotbXNnaWQgIi5iZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjUxNQotbXNnaWQgIi5iZW5kIGRpcmVjdGl2ZSBuYW1lcyB1bmtub3duIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI1NTkKLW1zZ2lkICIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI1NjEKLW1zZ2lkICJFbXB0eSBzeW1ib2wgbmFtZSBpbiAuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjU5OQotbXNnaWQgIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI2MTQKLW1zZ2lkICJCYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjI3Ci1tc2dpZCAiVG9vIG1hbnkgLmRpbSBlbnRyaWVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjY0OAotbXNnaWQgIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI2NzQKLW1zZ2lkICIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjY4OQotbXNnaWQgIkJhZGx5IGZvcm1lZCAuc2l6ZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNzAyCi1tc2dpZCAiVG9vIG1hbnkgLnNpemUgZW50cmllcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI3MjUKLW1zZ2lkICIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSMuIEZJWE1FOiBXZSBjb3VsZCBoYW5kbGUgdGhpcyBieSBzZXR0aW5nIHRoZSBjb250aW51ZWQgYml0LgotIy4gVGhlcmUgd291bGQgc3RpbGwgYmUgYSBsaW1pdDogdGhlIC50eXBlIGFyZ3VtZW50IGNhbiBub3QKLSMuIGJlIGluZmluaXRlLgotIzogZWNvZmYuYzoyNzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRoZSB0eXBlIG9mICVzIGlzIHRvbyBjb21wbGV4OyBpdCB3aWxsIGJlIHNpbXBsaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNzU0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIC50eXBlIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6Mjc5MwotbXNnaWQgIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI4MjAKLW1zZ2lkICIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyODI4Ci1tc2dpZCAiLnZhbCBleHByZXNzaW9uIGlzIHRvbyBjb3BtbGV4IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6Mjg1OQotbXNnaWQgIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBiZWZvcmUgLmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI4ODUKLW1zZ2lkICJCYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI5MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gdGFnIHNwZWNpZmllZCBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyOTY2Ci1tc2dpZCAiQmFkIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzAzOAotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzA0NQotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMDY4Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgbmFtZXMgdW5rbm93biBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMDk3Ci1tc2dpZCAic2Vjb25kIC5lbnQgZGlyZWN0aXZlIGZvdW5kIGJlZm9yZSAuZW5kIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMxNzIKLW1zZ2lkICJObyB3YXkgdG8gaGFuZGxlIC5maWxlIHdpdGhpbiAuZW50Ly5lbmQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMxOTcKLW1zZ2lkICIuZm1hc2sgb3V0c2lkZSBvZiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzI2NgotbXNnaWQgIi5tYXNrIG91dHNpZGUgb2YgLmVudCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMyOTYKLW1zZ2lkICIubG9jIGJlZm9yZSAuZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMzMDMKLW1zZ2lkICIubG9jIG91dHNpZGUgb2YgLnRleHQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIGAlcycuIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzQzNQotbXNnaWQgImJhZCAud2Vha2V4dCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5zdGFiJWMgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM1MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLnN0YWIlYzogaWdub3Jpbmcgbm9uLXplcm8gb3RoZXIgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNTQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJMaW5lIG51bWJlciAoJWQpIGZvciAuc3RhYiVjIGRpcmVjdGl2ZSBjYW5ub3QgZml0IGluIGluZGV4IGZpZWxkICgyMCBiaXRzKSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCAuc3RhYiVjIGRpcmVjdGl2ZSwgYmFkIGNoYXJhY3RlciIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjQwNDYgZWNvZmYuYzo0MjM1IGVjb2ZmLmM6NDI2MAotbXNnaWQgIi5iZWdpbi8uYmVuZCBpbiBkaWZmZXJlbnQgc2VnbWVudHMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzo0NzYxCi1tc2dpZCAiTWlzc2luZyAuZW5kIG9yIC5iZW5kIGF0IGVuZCBvZiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6NTI1MgotbXNnaWQgIkdQIHByb2xvZ3VlIHNpemUgZXhjZWVkcyBmaWVsZCBzaXplLCB1c2luZyAwIGluc3RlYWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjI1MAotbXNnaWQgIiIKLSJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IGV4cG9uZW50IG92ZXJmbG93LCBwcm9iYWJseSBhc3NlbWJsaW5nIGp1bmsiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjI1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IHVua25vd24gZXJyb3IgY29kZT0lZC4iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjQzNAotbXNnaWQgIiIKLSJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG1heSBub3QgaGF2ZSBtb3JlIHRoYW4gOCBoZXggZGlnaXRzIGluIGFueSB3b3JkLiIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6NDU0Ci1tc2dpZCAiQSBiaWdudW0gd2l0aCB1bmRlcnNjb3JlcyBtdXN0IGhhdmUgZXhhY3RseSA0IHdvcmRzLiIKLW1zZ3N0ciAiIgotCi0jLiBlaXRoZXIgbm90IHNlZW4gb3Igbm90IGRlZmluZWQuCi0jLiBAQCBTaG91bGQgcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCBzdHJpbmcgaW5zdGVhZCBvZgotIy4gdGhlIHBhcnNlZCBudW1iZXIuCi0jOiBleHByLmM6NTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhY2t3LiByZWYgdG8gdW5rbm93biBsYWJlbCBcIiVkOlwiLCAwIGFzc3VtZWQuIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzo3MDUKLW1zZ2lkICJDaGFyYWN0ZXIgY29uc3RhbnQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzo5NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwci5jKG9wZXJhbmQpOiBiYWQgYXRvZl9nZW5lcmljIHJldHVybiB2YWwgJWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjEwMDEKLW1zZ2lkICJNaXNzaW5nICcpJyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxMDExIHJlYWQuYzozODI0Ci1tc2dpZCAiRUJDRElDIGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTA3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFyeSBvcGVyYXRvciAlYyBpZ25vcmVkIGJlY2F1c2UgYmFkIG9wZXJhbmQgZm9sbG93cyIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTEyMiBleHByLmM6MTE0NwotbXNnaWQgInN5bnRheCBlcnJvciBpbiAuc3RhcnRvZi4gb3IgLnNpemVvZi4iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjEyOTYKLW1zZ2lkICJCYWQgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTY0NAotbXNnaWQgIm1pc3Npbmcgb3BlcmFuZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNjc3Ci1tc2dpZCAib3BlcmF0aW9uIGNvbWJpbmVzIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlZ21lbnRzIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNjkzCi1tc2dpZCAibGVmdCBvcGVyYW5kIGlzIGEgYmlnbnVtOyBpbnRlZ2VyIDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTY5NQotbXNnaWQgImxlZnQgb3BlcmFuZCBpcyBhIGZsb2F0OyBpbnRlZ2VyIDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTcwNAotbXNnaWQgInJpZ2h0IG9wZXJhbmQgaXMgYSBiaWdudW07IGludGVnZXIgMCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNzA2Ci1tc2dpZCAicmlnaHQgb3BlcmFuZCBpcyBhIGZsb2F0OyBpbnRlZ2VyIDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTc1NCBzeW1ib2xzLmM6MTA5MgotbXNnaWQgImRpdmlzaW9uIGJ5IHplcm8iCi1tc2dzdHIgIiIKLQotIzogZnJhZ3MuYzo4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBleHRlbmQgZnJhZyAlZC4gY2hhcnMiCi1tc2dzdHIgIiIKLQotIzogZnJhZ3MuYzoxNzAKLW1zZ2lkICJhdHRlbXB0IHRvIGFsbG9jYXRlIGRhdGEgaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBmcmFncy5jOjE3NgotbXNnaWQgImF0dGVtcHQgdG8gYWxsb2NhdGUgZGF0YSBpbiBjb21tb24gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NDg0Ci1tc2dpZCAicmVkZWZpbml0aW9uIG5vdCBhbGxvd2VkXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjU1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ0aGUgJWMgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NjM1Ci1tc2dpZCAic3RyaW5nIHdoZXJlIGV4cHJlc3Npb24gZXhwZWN0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjY0MQotbXNnaWQgImNhbid0IGZpbmQgcHJpbWFyeSBpbiBleHByZXNzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo2ODEKLW1zZ2lkICJtaXNwbGFjZWQgY2xvc2luZyBwYXJlbnMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjcxOAotbXNnaWQgImF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjc1MAotbXNnaWQgImNhbid0IGFkZCB0d28gcmVsb2NhdGFibGUgZXhwcmVzc2lvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6OTU1Ci1tc2dpZCAidW5yZWFzb25hYmxlIG5lc3RpbmcuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjEwMzMKLW1zZ2lkICJFbmQgb2YgZmlsZSBub3QgYXQgc3RhcnQgb2YgbGluZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIGJhc2UgY2hhcmFjdGVyICVjLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxMjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJhZGl4IGlzICVjIG11c3QgYmUgb25lIG9mIGIsIHEsIGQgb3IgaCIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTMwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzaXplIG11c3QgYmUgb25lIG9mIGIsIHcgb3IgbCwgaXMgJWMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0MTMKLW1zZ2lkICJkYXRhYiByZXBlYXQgbXVzdCBiZSBjb25zdGFudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQxNQotbXNnaWQgImRhdGFiIGRhdGEgbXVzdCBiZSBhYnNvbHV0ZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQyOQotbXNnaWQgImFsaWduIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0MzYKLW1zZ2lkICIuYWxpZ24gbmVlZHMgYWJzb2x1dGUgZmlsbCB2YWx1ZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQ0NAotbXNnaWQgImFsaWdubWVudCBtdXN0IGJlIG9uZSBvZiAxLCAyIG9yIDQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0NjkKLW1zZ2lkICJyZXMgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiBmb3IgZmlsbCBjb3VudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTU0OQotbXNnaWQgImZvcm0gTElOPSBuZWVkcyBhYnNvbHV0ZSBleHByZXNzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTU1MgotbXNnaWQgIkNPTD0iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE1NTUKLW1zZ2lkICJmb3JtIENPTD0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIy4gVHVybnMgdGhlIG5leHQgZXhwcmVzc2lvbiBpbnRvIGEgc3RyaW5nCi0jOiBnYXNwLmM6MTU5NyBtYWNyby5jOjQwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlIG9wZXJhdG9yIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE2NTkKLW1zZ2lkICJtaXNwbGFjZWQgKCAuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE2NzQKLW1zZ2lkICJtaXNwbGFjZWQgKS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTcyOAotbXNnaWQgIi5pbnN0ciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE3NjYKLW1zZ2lkICJuZWVkIGFic29sdXRlIHBvc2l0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNzY4Ci1tc2dpZCAibmVlZCBhYnNvbHV0ZSBsZW5ndGguXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIwMTcKLW1zZ2lkICJFTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMDQ3Ci1tc2dpZCAiLkFTU0lHTkEgbmVlZHMgY29uc3RhbnQgZXhwcmVzc2lvbiBhcmd1bWVudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjA1MQotbXNnaWQgIi5BU1NJR05BIHdpdGhvdXQgbGFiZWwuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIwNzYKLW1zZ2lkICIuQVNTSUdOUyB3aXRob3V0IGxhYmVsLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGZpbmQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMjA4Ci1tc2dpZCAiQ29tcGFyaXNvbiBvcGVyYXRvciBtdXN0IGJlIG9uZSBvZiBFUSwgTkUsIExULCBMRSwgR1Qgb3IgR0UuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIyNDIKLW1zZ2lkICJDb21wYXJpc29uIG9wZXJhdG9yIGZvciBzdHJpbmdzIG11c3QgYmUgRVEgb3IgTkVcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjI1NCBnYXNwLmM6MjI2NCBnYXNwLmM6MjM2NgotbXNnaWQgIkNvbmRpdGlvbmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjI1OQotbXNnaWQgIlN0cmluZyBjb21wYXJlZCBhZ2FpbnN0IGV4cHJlc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIzMDkKLW1zZ2lkICJBSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIzMjQKLW1zZ2lkICJNdWx0aXBsZSBBRUxTRXMgaW4gQUlGLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMzQwCi1tc2dpZCAiQUVOREkgd2l0aG91dCBBSUYuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIzNjMgZ2FzcC5jOjI0NDUKLW1zZ2lkICJJRiBuZXN0aW5nIHVucmVhc29uYWJsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjQ1NQotbXNnaWQgIkJhZCBmb3JtYXQgZm9yIElGIG9yIElGTkMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI0NzUKLW1zZ2lkICJBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjQ3NwotbXNnaWQgIkVORFIgd2l0aG91dCBhIFJFUFQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI1MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQVdISUxFIHdpdGhvdXQgYSBBRU5EVyBhdCAlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjUzOAotbXNnaWQgIkFFTkRXIHdpdGhvdXQgYSBBRU5EVy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjU4MwotbXNnaWQgIkFSRVBFQVQgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI1ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQVJFUEVBVCB3aXRob3V0IGEgQUVORFIgYXQgJWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI2MzEKLW1zZ2lkICIuRU5ETSB3aXRob3V0IGEgbWF0Y2hpbmcgLk1BQ1JPLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNjY1Ci1tc2dpZCAiTE9DQUwgb3V0c2lkZSBvZiBNQUNSTyIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjY3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJtYWNybyBhdCBsaW5lICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNzAxCi1tc2dpZCAibWFjcm8gZXhwYW5zaW9uIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNzUzCi1tc2dpZCAiQ2hhcmFjdGVyIGNvZGUgaW4gc3RyaW5nIG11c3QgYmUgYWJzb2x1dGUgZXhwcmVzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjc1OAotbXNnaWQgIk1pc3NpbmcgPiBmb3IgY2hhcmFjdGVyIGNvZGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RyaW5nIGZvciBTREFUQUMgbG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMgKCVkKS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjg0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbGxlZ2FsIGNoYXJhY3RlciBpbiBTREFUQSBsaW5lICgweCV4KS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjg2NgotbXNnaWQgIk11c3QgaGF2ZSBhYnNvbHV0ZSBTREFUQUIgcmVwZWF0IGNvdW50LlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyODY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk11c3QgaGF2ZSBwb3NpdGl2ZSBTREFUQUIgcmVwZWF0IGNvdW50ICglZCkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWFzb25hYmxlIGluY2x1ZGUgZGVwdGggKCVsZCkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBpbmNsdWRlIGZpbGUgYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzAyNQotbXNnaWQgIlVucmVhc29uYWJsZSBleHBhbnNpb24gKC11IHR1cm5zIG9mZiBjaGVjaykuXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvbmUgY2F1c2VzIGxvdHMgb2YgcGFpbiB3aGVuIHRyeWluZyB0byBwcmVwcm9jZXNzCi0jLiBvcmRpbmFyeSBjb2RlCi0jOiBnYXNwLmM6MzI0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbmlzZWQgcHNldWRvIG9wIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjMzMTMKLW1zZ2lkICJPUkcgY29tbWFuZCBub3QgYWxsb3dlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzUzMAotbXNnaWQgIkludmFsaWQgZXhwcmVzc2lvbiBvbiBjb21tYW5kIGxpbmUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM1NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBcbiIKLSIgIFstYV0gICAgICBbLS1hbHRlcm5hdGVdICAgICAgICAgZW50ZXIgYWx0ZXJuYXRlIG1hY3JvIG1vZGVcbiIKLSIgIFstYyBjaGFyXSBbLS1jb21tZW50Y2hhciBjaGFyXSAgY2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlciBmcm9tICFcbiIKLSIgIFstZF0gICAgICBbLS1kZWJ1Z10gICAgICAgICAgICAgcHJpbnQgc29tZSBkZWJ1Z2dpbmcgaW5mb1xuIgotIiAgWy1oXSAgICAgIFstLWhlbHBdICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2VcbiIKLSIgIFstTV0gICAgICBbLS1tcmldICAgICAgICAgICAgICAgZW50ZXIgTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuIgotIiAgWy1vIG91dF0gIFstLW91dHB1dCBvdXRdICAgICAgICBzZXQgdGhlIG91dHB1dCBmaWxlXG4iCi0iICBbLXBdICAgICAgWy0tcHJpbnRdICAgICAgICAgICAgIHByaW50IGxpbmUgbnVtYmVyc1xuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNTgwCi1tc2dpZCAiIgotIiAgWy1zXSAgICAgIFstLWNvcHlzb3VyY2VdICAgICAgICBjb3B5IHNvdXJjZSB0aHJvdWdoIGFzIGNvbW1lbnRzIFxuIgotIiAgWy11XSAgICAgIFstLXVucmVhc29uYWJsZV0gICAgICBhbGxvdyB1bnJlYXNvbmFibGUgbmVzdGluZ1xuIgotIiAgWy12XSAgICAgIFstLXZlcnNpb25dICAgICAgICAgICBwcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uXG4iCi0iICBbLURuYW1lPXZhbHVlXSAgICAgICAgICAgICAgICAgIGNyZWF0ZSBwcmVwcm9jZXNzb3IgdmFyaWFibGUgY2FsbGVkIG5hbWUsICIKLSJ3aXRoIHZhbHVlXG4iCi0iICBbLUlwYXRoXSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCB0byBpbmNsdWRlIHBhdGggbGlzdFxuIgotIiAgW2luLWZpbGVdXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM1OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEdudSBBc3NlbWJsZXIgTWFjcm8gUHJlcHJvY2Vzc29yXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LgotIzogZ2FzcC5jOjM2ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGFzc2VtYmxlciBwcmUtcHJvY2Vzc29yICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM2ODEKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIGlucHV0IGZpbGUgYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mzc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mzc0OAotbXNnaWQgIiIKLSJcbiIKLSJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIgotbXNnc3RyICIiCi0KLSMuIERldGVjdCBpZiB3ZSBhcmUgcmVhZGluZyBmcm9tIHN0ZGluIGJ5IGV4YW1pbmluZyB0aGUgZmlsZQotIy4gbmFtZSByZXR1cm5lZCBieSBhc193aGVyZSgpLgotIy4KLSMuIFtGSVhNRTogV2UgcmVseSB1cG9uIHRoZSBuYW1lIGluIHRoZSBzdHJjbXAgYmVsb3cgYmVpbmcgdGhlCi0jLiBzYW1lIGFzIHRoZSBvbmUgdXNlZCBieSBpbnB1dF9zY3J1Yl9uZXdfZmlsZSgpLCBpZiB0aGF0IGlzCi0jLiBub3QgdHJ1ZSwgdGhlbiB0aGlzIGNvZGUgd2lsbCBmYWlsXS4KLSMuCi0jLiBJZiB3ZSBhcmUgcmVhZGluZyBmcm9tIHN0ZGluLCB0aGVuIHdlIG5lZWQgdG8gc2F2ZSBlYWNoIGlucHV0IGxpbmUKLSMuIGhlcmUgKGFzc3VtaW5nIG9mIGNvdXJzZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBsaW5lIG9mIGlucHV0IHRvIHJlYWQpLAotIy4gc28gdGhhdCBpdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0aW5nIHRoYXQgaXMgcHJvZHVjZWQgYXQgdGhlIGVuZAotIy4gb2YgdGhlIGFzc2VtYmx5LgotIzogaW5wdXQtZmlsZS5jOjE1MCBpbnB1dC1zY3J1Yi5jOjIzMyBsaXN0aW5nLmM6MzUzCi1tc2dpZCAie3N0YW5kYXJkIGlucHV0fSIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1maWxlLmM6MTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gJXMgZm9yIHJlYWRpbmcuIgotbXNnc3RyICIiCi0KLSM6IGlucHV0LWZpbGUuYzoyMDUgaW5wdXQtZmlsZS5jOjIzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCByZWFkIGZyb20gJXMiCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtZmlsZS5jOjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBjbG9zZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1zY3J1Yi5jOjI2MwotbXNnaWQgIm1hY3JvcyBuZXN0ZWQgdG9vIGRlZXBseSIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1zY3J1Yi5jOjM0OQotbXNnaWQgInBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGlucHV0LXNjcnViLmM6MzcxCi1tc2dpZCAiUGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogaXRibC1vcHMuYzozNTkKLW1zZ2lkICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgaW5zdHJ1Y3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjI1MgotbXNnaWQgIldhcm5pbmc6IgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoyNTkKLW1zZ2lkICJFcnJvcjoiCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjExNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3Qgb3BlbiBsaXN0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoxMTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIGNsb3NpbmcgbGlzdCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MTI0NQotbXNnaWQgInN0cmFuZ2UgcGFwZXIgaGVpZ2h0LCBzZXQgdG8gbm8gZm9ybSIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MTMxMQotbXNnaWQgIk5ldyBsaW5lIGluIHRpdGxlIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6NTYzCi1tc2dpZCAidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBtYWNybyBkZWZpbml0aW9uIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6NTcyCi1tc2dpZCAibWlzc2luZyApIGFmdGVyIGZvcm1hbHMiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzo3MjkKLW1zZ2lkICJtaXNzcGxhY2VkICkiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzo5OTEKLW1zZ2lkICJjb25mdXNpb24gaW4gZm9ybWFsIHBhcmFtZXRlcnMiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzo5OTYKLW1zZ2lkICJtYWNybyBmb3JtYWwgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzoxMDExCi1tc2dpZCAiY2FuJ3QgbWl4IHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6MTAxOQotbXNnaWQgInRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6MTE5NAotbXNnaWQgInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gaXJwIG9yIGlycGMiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzoxMjAyCi1tc2dpZCAibWlzc2luZyBtb2RlbCBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzoxMDUKLW1zZ2lkICJBc3NlbWJsZXIgbWVzc2FnZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzoyMjIKLW1zZ2lkICJXYXJuaW5nOiAiCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzozMzEKLW1zZ2lkICJFcnJvcjogIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDM1IG1lc3NhZ2VzLmM6NDUyCi1tc2dpZCAiRmF0YWwgZXJyb3I6ICIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ3MQotbXNnaWQgIkludGVybmFsIGVycm9yIVxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDczCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFzc2VydGlvbiBmYWlsdXJlIGluICVzIGF0ICVzIGxpbmUgJWQuXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMgbGluZSAlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ3NyBtZXNzYWdlcy5jOjQ5NQotbXNnaWQgIlBsZWFzZSByZXBvcnQgdGhpcyBidWcuXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IG91dHB1dC1maWxlLmM6NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBhIGJmZCBvbiBzdGRvdXQgJXMgIgotbXNnc3RyICIiCi0KLSM6IG91dHB1dC1maWxlLmM6NzIgb3V0cHV0LWZpbGUuYzo3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQ2FuJ3QgY2xvc2UgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjEzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQ2FuJ3QgY2xvc2UgJXMiCi1tc2dzdHIgIiIKLQotIzogb3V0cHV0LWZpbGUuYzoxNDgKLW1zZ2lkICJGYWlsZWQgdG8gZW1pdCBhbiBvYmplY3QgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjE0OQotbXNnaWQgIkNhbid0IGNvbnRpbnVlIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3IgY29uc3RydWN0aW5nICVzIHBzZXVkby1vcCB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjgwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIHBzZXVkby1vcDogIGAlcyciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjkyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJsYWJlbCBcIiVkJFwiIHJlZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTE0NQotbXNnaWQgIi5hYm9ydCBkZXRlY3RlZC4gIEFiYW5kb25pbmcgc2hpcC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjEyNTAgcmVhZC5jOjIwMzEKLW1zZ2lkICJBbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTI1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAldSBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxMjkwCi1tc2dpZCAiZXhwZWN0ZWQgZmlsbCBwYXR0ZXJuIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE0ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIy4gU29tZSBvZiB0aGUgYmFjayBlbmRzIGNhbid0IGRlYWwgd2l0aCBub24tcG9zaXRpdmUgbGluZSBudW1iZXJzLgotIy4gQmVzaWRlcywgaXQncyBzaWxseS4KLSM6IHJlYWQuYzoxNjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpbmUgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlOyBsaW5lIG51bWJlciAlZCByZWplY3RlZC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE2MzgKLW1zZ2lkICJzdGFydCBhZGRyZXNzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE2NDgKLW1zZ2lkICIuZXJyIGVuY291bnRlcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNjY3IHJlYWQuYzoxNjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5mYWlsICVsZCBlbmNvdW50ZXJlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTcwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIuZmlsbCBzaXplIGNsYW1wZWQgdG8gJWQuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNzExCi1tc2dpZCAiU2l6ZSBuZWdhdGl2ZTogLmZpbGwgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE3MTcKLW1zZ2lkICJSZXBlYXQgPCAwLCAuZmlsbCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxODczCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCAubGlua29uY2UgdHlwZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxODg2IHJlYWQuYzoxOTEyCi1tc2dpZCAiLmxpbmtvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxOTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJmZF9zZXRfc2VjdGlvbl9mbGFnczogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE5NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIuc2Jzc1wiOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjAwOQotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHNpemUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIwMTcKLW1zZ2lkICJNaXNzaW5nIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjE1NAotbXNnaWQgImJhZCBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMjg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0dGVtcHQgdG8gcmVkZWZpbmUgcHNldWRvLW9wIGAlcycgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlZ21lbnQgXCIlc1wiOyBzZWdtZW50IFwiJXNcIiBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMzU5Ci1tc2dpZCAiaWdub3JpbmcgZmlsbCB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMzYyCi1tc2dpZCAib25seSBjb25zdGFudCBvZmZzZXRzIHN1cHBvcnRlZCBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMzk0Ci1tc2dpZCAiTVJJIHN0eWxlIE9SRyBwc2V1ZG8tb3Agbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjQ4MgotbXNnaWQgInVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNTY0Ci1tc2dpZCAiYWJzb2x1dGUgc2VjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI1NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIHNlY3Rpb24gY29tbWFuZCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNjU0Ci1tc2dpZCAicmVwdCB3aXRob3V0IGVuZHIiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI4NDEKLW1zZ2lkICJVbnN1cHBvcnRlZCB2YXJpYWJsZSBzaXplIG9yIGZpbGwgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI4NjYKLW1zZ2lkICIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIHplcm8sIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI4NjgKLW1zZ2lkICIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyODk3Ci1tc2dpZCAic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyOTAyCi1tc2dpZCAic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBjb21tb24gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mjk4OSByZWFkLmM6NDA3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgZmxvYXRpbmcgbGl0ZXJhbDogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMwNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIGlzIGAlYycuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc3Qgb2YgbGluZSBpZ25vcmVkLiBGaXJzdCBpZ25vcmVkIGNoYXJhY3RlciB2YWx1ZWQgMHgleC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMxMTkKLW1zZ2lkICJpbGxlZ2FsIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzEyMQotbXNnaWQgIm1pc3NpbmcgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMjg4Ci1tc2dpZCAicnZhIHdpdGhvdXQgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNDEzCi1tc2dpZCAiYXR0ZW1wdCB0byBzdG9yZSB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNDUxIHJlYWQuYzo0MzQ3Ci1tc2dpZCAiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM0NjMgcmVhZC5jOjQzNTkKLW1zZ2lkICJyZWdpc3RlciB2YWx1ZSB1c2VkIGFzIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIy4gTGVhZGluZyBiaXRzIGNvbnRhaW4gYm90aCAwcyAmIDFzLgotIzogcmVhZC5jOjM1NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFsdWUgMHglbHggdHJ1bmNhdGVkIHRvIDB4JWx4LiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJCaWdudW0gdHJ1bmNhdGVkIHRvICVkIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIEJGRCByZWxvY2F0aW9uIHNpemUgJXUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM3MzUKLW1zZ2lkICJ1c2luZyBhIGJpdCBmaWVsZCB3aWR0aCBvZiB6ZXJvIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImZpZWxkIHdpZHRoIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzc1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWVsZCB3aWR0aCAlbHUgdG9vIGJpZyB0byBmaXQgaW4gJWQgYnl0ZXM6IHRydW5jYXRlZCB0byAlZCBiaXRzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImZpZWxkIHZhbHVlIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzg5NAotbXNnaWQgIlVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM5NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBmbG9hdGluZyB0eXBlIHR5cGUgJyVjJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzk2NwotbXNnaWQgIkZsb2F0aW5nIHBvaW50IGNvbnN0YW50IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDA5MgotbXNnaWQgInVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ0OTYKLW1zZ2lkICJFeHBlY3RlZCA8bm4+IgotbXNnc3RyICIiCi0KLSMuIFRvIGJlIGNvbXBhdGlibGUgd2l0aCBCU0QgNC4yIGFzOiBnaXZlIHRoZSBsdXNlciBhIGxpbmVmZWVkISEKLSM6IHJlYWQuYzo0NTI5IHJlYWQuYzo0NjEyCi1tc2dpZCAiVW50ZXJtaW5hdGVkIHN0cmluZzogTmV3bGluZSBpbnNlcnRlZC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ2MjAKLW1zZ2lkICJCYWQgZXNjYXBlZCBjaGFyYWN0ZXIgaW4gc3RyaW5nLCAnPycgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDY0NgotbXNnaWQgImV4cGVjdGVkIGFkZHJlc3MgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN5bWJvbCBcIiVzXCIgdW5kZWZpbmVkOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ2NjkKLW1zZ2lkICJzb21lIHN5bWJvbCB1bmRlZmluZWQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDY4NwotbXNnaWQgImJhZCBvciBpcnJlZHVjaWJsZSBhYnNvbHV0ZSBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ3MjUKLW1zZ2lkICJUaGlzIHN0cmluZyBtYXkgbm90IGNvbnRhaW4gJ1xcMCciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ3NjQKLW1zZ2lkICJNaXNzaW5nIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDk5NQotbXNnaWQgIm1pc3NpbmcgLmZ1bmMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjUwMTIKLW1zZ2lkICIuZW5kZnVuYyBtaXNzaW5nIGZvciBwcmV2aW91cyAuZnVuYyIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIwOQotbXNnaWQgIi5zdGFiczogTWlzc2luZyBjb21tYSIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIxNyBzdGFicy5jOjIyNSBzdGFicy5jOjIzNgotIywgYy1mb3JtYXQKLW1zZ2lkICIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NDE1Ci1tc2dpZCAiY29tbWEgbWlzc2luZyBpbiAueHN0YWJzIgotbXNnc3RyICIiCi0KLSM6IHN1YnNlZ3MuYzozNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBzd2l0Y2ggdG8gbm9uZXhpc3RlbnQgc2VnbWVudCBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjM2NCBzeW1ib2xzLmM6NDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQuIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzo0MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQgYXMgXCIlc1wiLyVkLiVkLiVsZC4iCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6NTI4IHN5bWJvbHMuYzo1MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN5bWJvbCB0YWJsZSBmYWlsZWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzo4ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sIGRlZmluaXRpb24gbG9vcCBlbmNvdW50ZXJlZCBhdCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA1NCBzeW1ib2xzLmM6MTA1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA2MgotbXNnaWQgImludmFsaWQgc2VjdGlvbiBmb3Igb3BlcmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxMDY3IHN5bWJvbHMuYzoxMDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIHNldHRpbmcgJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjEwNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGZvciBvcGVyYXRpb24gc2V0dGluZyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJkaXZpc2lvbiBieSB6ZXJvIHdoZW4gc2V0dGluZyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTE2NiB3cml0ZS5jOjE4NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgcmVzb2x2ZSB2YWx1ZSBmb3Igc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTUzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJcIiVkXCIgKGluc3RhbmNlIG51bWJlciAlZCBvZiBhICVzIGxhYmVsKSIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIGdldCB2YWx1ZSBvZiB1bnJlc29sdmVkIHN5bWJvbCAlcyIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjE2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWVsZCBmeF9zaXplIHRvbyBzbWFsbCB0byBob2xkICVkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MzA2Ci1tc2dpZCAicnZhIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzo1MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byAub3JnLy5zcGFjZSBiYWNrd2FyZHM/ICglbGQpIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6OTc1Ci1tc2dpZCAicmVsb2NhdGlvbiBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzo5NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uOiAleCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjEwMjMKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZml4dXAgbm90IGNvbnRhaW5lZCB3aXRoaW4gZnJhZyIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjEwMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTEyMiB3cml0ZS5jOjExNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IENhbid0IHdyaXRlICVzIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTE3NwotbXNnaWQgIkNhbm5vdCB3cml0ZSB0byBvdXRwdXQgZmlsZS4iCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxNDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgZ2VuZXJhdGluZyBiYWQgb2JqZWN0IGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxNDE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgbm8gb2JqZWN0IGZpbGUgZ2VuZXJhdGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTgxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2NhbCBsYWJlbCAlcyBpcyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIxMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWxpZ25tZW50IHBhZGRpbmcgKCVsdSBieXRlcykgbm90IGEgbXVsdGlwbGUgb2YgJWxkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MjIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIud29yZCAlcy0lcyslcyBkaWRuJ3QgZml0IgotbXNnc3RyICIiCi0KLSMuIEdyb3d0aCBtYXkgYmUgbmVnYXRpdmUsIGJ1dCB2YXJpYWJsZSBwYXJ0IG9mIGZyYWcKLSMuIGNhbm5vdCBoYXZlIGZld2VyIHRoYW4gMCBjaGFycy4gIFRoYXQgaXMsIHdlIGNhbid0Ci0jLiAub3JnIGJhY2t3YXJkcy4KLSM6IHdyaXRlLmM6MjMwNAotbXNnaWQgImF0dGVtcHQgdG8gLm9yZyBiYWNrd2FyZHMgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIzMjAKLW1zZ2lkICIuc3BhY2Ugc3BlY2lmaWVzIG5vbi1hYnNvbHV0ZSB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIzMjQKLW1zZ2lkICIuc3BhY2Ugb3IgLmZpbGwgd2l0aCBuZWdhdGl2ZSB2YWx1ZSwgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjI1NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBcIiVzXCIgeyVzIHNlY3Rpb259IC0gIgotIlwiJXNcIiB7JXMgc2VjdGlvbn0gYXQgZmlsZSBhZGRyZXNzICVzLiIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjI3NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFsdWUgb2YgJXMgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAlcyIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvZ2FzL3JlYWQuYyBiL2dhcy9yZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDcxZmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3JlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNzQgKzAsMCBAQAotLyogcmVhZC5jIC0gcmVhZCBhIHNvdXJjZSBmaWxlIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NiwgODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZiAwCi0jZGVmaW5lIE1BU0tfQ0hBUiAoMHhGRikJLyogSWYgeW91ciBjaGFycyBhcmVuJ3QgOCBiaXRzLCB5b3Ugd2lsbAotCQkJCSAgIGNoYW5nZSB0aGlzIGEgYml0LiAgQnV0IHRoZW4sIEdOVSBpc24ndAotCQkJCSAgIHNwb3plZCB0byBydW4gb24geW91ciBtYWNoaW5lIGFueXdheS4KLQkJCQkgICAoUk1TIGlzIHNvIHNob3J0c2lnaHRlZCBzb21ldGltZXMuKQotCQkJCSAgICovCi0jZWxzZQotI2RlZmluZSBNQVNLX0NIQVIgKChpbnQpKHVuc2lnbmVkIGNoYXIpLTEpCi0jZW5kaWYKLQotCi0vKiBUaGlzIGlzIHRoZSBsYXJnZXN0IGtub3duIGZsb2F0aW5nIHBvaW50IGZvcm1hdCAoZm9yIG5vdykuIEl0IHdpbGwKLSAgIGdyb3cgd2hlbiB3ZSBkbyA0MzYxIHN0eWxlIGZsb251bXMuICovCi0KLSNkZWZpbmUgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUICgxNikKLQotLyogUm91dGluZXMgdGhhdCByZWFkIGFzc2VtYmxlciBzb3VyY2UgdGV4dCB0byBidWlsZCBzcGFnZXR0aSBpbiBtZW1vcnkuCi0gICBBbm90aGVyIGdyb3VwIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBpbiB0aGUgZXhwci5jIG1vZHVsZS4gICovCi0KLS8qIGZvciBpc2RpZ2l0KCkgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAic2IuaCIKLSNpbmNsdWRlICJtYWNyby5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJsaXN0aW5nLmgiCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotI2lmbmRlZiBUQ19TVEFSVF9MQUJFTAotI2RlZmluZSBUQ19TVEFSVF9MQUJFTCh4LHkpICh4PT0nOicpCi0jZW5kaWYKLQotLyogVGhlIE5PUF9PUENPREUgaXMgZm9yIHRoZSBhbGlnbm1lbnQgZmlsbCB2YWx1ZS4KLSAqIGZpbGwgaXQgYSBub3AgaW5zdHJ1Y3Rpb24gc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIGRvZXMgbm90IGNob2tlCi0gKiBvbiBpdAotICovCi0jaWZuZGVmIE5PUF9PUENPREUKLSNkZWZpbmUgTk9QX09QQ09ERSAweDAwCi0jZW5kaWYKLQotY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwkvKi0+bmV4dCBjaGFyIG9mIHNvdXJjZSBmaWxlIHRvIHBhcnNlLiAqLwotCi0jaWYgQklUU19QRVJfQ0hBUiAhPSA4Ci0vKiAgVGhlIGZvbGxvd2luZyB0YWJsZSBpcyBpbmRleGVkIGJ5WyhjaGFyKV0gYW5kIHdpbGwgYnJlYWsgaWYKLSAgICBhIGNoYXIgZG9lcyBub3QgaGF2ZSBleGFjdGx5IDI1NiBzdGF0ZXMgKGhvcGVmdWxseSAwOjI1NSEpISAgKi8KLWRpZSBob3JyaWJseTsKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9BVAotLyogVGhlIG04OGsgdW5mb3J0dW5hdGVseSB1c2VzIEAgYXMgYSBsYWJlbCBiZWdpbm5lci4gICovCi0jZGVmaW5lIExFWF9BVCAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfQlIKLS8qIFRoZSBSUy82MDAwIGFzc2VtYmxlciB1c2VzIHssfSxbLF0gYXMgcGFydHMgb2Ygc3ltYm9sIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX0JSIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9QQ1QKLS8qIFRoZSBEZWx0YSA2OGsgYXNzZW1ibGVyIHBlcm1pdHMgJSBpbnNpZGUgbGFiZWwgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfUENUIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9RTQotLyogVGhlIFBvd2VyUEMgV2luZG93cyBOVCBhc3NlbWJsZXJzIHBlcm1pdHMgPyBpbnNpZGUgbGFiZWwgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfUU0gMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX0hBU0gKLSNkZWZpbmUgTEVYX0hBU0ggMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX0RPTExBUgotLyogVGhlIGEyOWsgYXNzZW1ibGVyIGRvZXMgbm90IHBlcm1pdHMgbGFiZWxzIHRvIHN0YXJ0IHdpdGggJC4gICovCi0jZGVmaW5lIExFWF9ET0xMQVIgMwotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX1RJTERFCi0vKiBUaGUgRGVsdGEgNjhrIGFzc2VtYmxlciBwZXJtaXRzIH4gYXQgc3RhcnQgb2YgbGFiZWwgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfVElMREUgMAotI2VuZGlmCi0KLS8qIHVzZWQgYnkgaXNfLi4uIG1hY3Jvcy4gb3VyIGN0eXBlW10gKi8KLWNoYXIgbGV4X3R5cGVbMjU2XSA9Ci17Ci0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIEBBQkNERUZHSElKS0xNTk8gKi8KLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogUFFSU1RVVldYWVpbXF1eXyAqLwotICAwLCAwLCAwLCBMRVhfSEFTSCwgTEVYX0RPTExBUiwgTEVYX1BDVCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgLyogXyEiIyQlJicoKSorLC0uLyAqLwotICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCBMRVhfUU0sCS8qIDAxMjM0NTY3ODk6Ozw9Pj8gKi8KLSAgTEVYX0FULCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAkvKiBAQUJDREVGR0hJSktMTU5PICovCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIExFWF9CUiwgMCwgTEVYX0JSLCAwLCAzLCAvKiBQUVJTVFVWV1hZWltcXV5fICovCi0gIDAsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCS8qIGBhYmNkZWZnaGlqa2xtbm8gKi8KLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgTEVYX0JSLCAwLCBMRVhfQlIsIExFWF9USUxERSwgMCwgLyogcHFyc3R1dnd4eXp7fH1+LiAqLwotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzCi19OwotCi0KLS8qCi0gKiBJbjogYSBjaGFyYWN0ZXIuCi0gKiBPdXQ6IDEgaWYgdGhpcyBjaGFyYWN0ZXIgZW5kcyBhIGxpbmUuCi0gKi8KLSNkZWZpbmUgWl8gKDApCi1jaGFyIGlzX2VuZF9vZl9saW5lWzI1Nl0gPQotewotI2lmZGVmIENSX0VPTAotICA5OSwgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgOTksIFpfLCBaXywJLyogQGFiY2RlZmdoaWprbG1ubyAqLwotI2Vsc2UKLSAgOTksIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIDk5LCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIEBhYmNkZWZnaGlqa2xtbm8gKi8KLSNlbmRpZgotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSNpZmRlZiBUQ19IUFBBCi0gIFpfLDk5LCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIF8hIiMkJSYnKCkqKywtLi8gKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIDAxMjM0NTY3ODk6Ozw9Pj8gKi8KLSNlbHNlCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIDk5LCBaXywgWl8sIFpfLCBaXywJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLwotI2VuZGlmCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi19OwotI3VuZGVmIFpfCi0KLS8qIEZ1bmN0aW9ucyBwcml2YXRlIHRvIHRoaXMgZmlsZS4gKi8KLQotc3RhdGljIGNoYXIgKmJ1ZmZlcjsJLyogMXN0IGNoYXIgb2YgZWFjaCBidWZmZXIgb2YgbGluZXMgaXMgaGVyZS4gKi8KLXN0YXRpYyBjaGFyICpidWZmZXJfbGltaXQ7CS8qLT4xICsgbGFzdCBjaGFyIGluIGJ1ZmZlci4gKi8KLQotLyogVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gaXMgcmVxdWlyZWQgdG8gYmUgZGVmaW5lZCB0byBlaXRoZXIgMCBvciAxIGluIHRoZQotICAgdGMtPENQVT4uaCBmaWxlLiAgU2VlIHRoZSAiUG9ydGluZyBHQVMiIHNlY3Rpb24gb2YgdGhlIGludGVybmFscyBtYW51YWwuICovCi1pbnQgdGFyZ2V0X2JpZ19lbmRpYW4gPSBUQVJHRVRfQllURVNfQklHX0VORElBTjsKLQotc3RhdGljIGNoYXIgKm9sZF9idWZmZXI7CS8qIEpGIGEgaGFjayAqLwotc3RhdGljIGNoYXIgKm9sZF9pbnB1dDsKLXN0YXRpYyBjaGFyICpvbGRfbGltaXQ7Ci0KLS8qIFZhcmlhYmxlcyBmb3IgaGFuZGxpbmcgaW5jbHVkZSBmaWxlIGRpcmVjdG9yeSB0YWJsZS4gKi8KLQotY2hhciAqKmluY2x1ZGVfZGlyczsJLyogVGFibGUgb2YgcG9pbnRlcnMgdG8gZGlyZWN0b3JpZXMgdG8KLQkJCSAgIHNlYXJjaCBmb3IgLmluY2x1ZGUncyAqLwotaW50IGluY2x1ZGVfZGlyX2NvdW50OwkvKiBIb3cgbWFueSBhcmUgaW4gdGhlIHRhYmxlICovCi1pbnQgaW5jbHVkZV9kaXJfbWF4bGVuID0gMTsvKiBMZW5ndGggb2YgbG9uZ2VzdCBpbiB0YWJsZSAqLwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLXN0cnVjdCBicm9rZW5fd29yZCAqYnJva2VuX3dvcmRzOwotaW50IG5ld19icm9rZW5fd29yZHM7Ci0jZW5kaWYKLQotLyogVGhlIGN1cnJlbnQgb2Zmc2V0IGludG8gdGhlIGFic29sdXRlIHNlY3Rpb24uICBXZSBkb24ndCB0cnkgdG8KLSAgIGJ1aWxkIGZyYWdzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBzaW5jZSBubyBkYXRhIGNhbiBiZSBzdG9yZWQKLSAgIHRoZXJlLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IG9mZnNldC4gICovCi1hZGRyZXNzVCBhYnNfc2VjdGlvbl9vZmZzZXQ7Ci0KLS8qIElmIHRoaXMgbGluZSBoYWQgYW4gTVJJIHN0eWxlIGxhYmVsLCBpdCBpcyBzdG9yZWQgaW4gdGhpcyB2YXJpYWJsZS4KLSAgIFRoaXMgaXMgdXNlZCBieSBzb21lIG9mIHRoZSBNUkkgcHNldWRvLW9wcy4gICovCi1zeW1ib2xTICpsaW5lX2xhYmVsOwotCi0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIHRvIHN1cHBvcnQgTVJJIGNvbW1vbiBzZWN0aW9ucy4gIFdlCi0gICB0cmFuc2xhdGUgc3VjaCBzZWN0aW9ucyBpbnRvIGEgY29tbW9uIHN5bWJvbC4gIFRoaXMgdmFyaWFibGUgaXMKLSAgIG5vbi1OVUxMIHdoZW4gd2UgYXJlIGluIGFuIE1SSSBjb21tb24gc2VjdGlvbi4gICovCi1zeW1ib2xTICptcmlfY29tbW9uX3N5bWJvbDsKLQotLyogSW4gTVJJIG1vZGUsIGFmdGVyIGEgZGMuYiBwc2V1ZG8tb3Agd2l0aCBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZQotICAgbmVlZCB0byBhbGlnbiB0byBhbiBldmVuIGJ5dGUgYm91bmRhcnkgdW5sZXNzIHRoZSBuZXh0IHBzZXVkby1vcCBpcwotICAgZGMuYiwgZHMuYiwgb3IgZGNiLmIuICBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byAxIGlmIGFuIGFsaWdubWVudAotICAgbWF5IGJlIG5lZWRlZC4gICovCi1zdGF0aWMgaW50IG1yaV9wZW5kaW5nX2FsaWduOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNpZmRlZiBPQkpfRUxGCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byBiZSBub24temVybyBpZiB0aGUgbmV4dCBzdHJpbmcgd2Ugc2VlIG1pZ2h0Ci0gICBiZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgaW4gRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgU2VlCi0gICB0aGUgY29tbWVudCBpbiBlbWl0X2V4cHIgZm9yIHRoZSBmb3JtYXQgd2UgbG9vayBmb3IuICAqLwotc3RhdGljIGludCBkd2FyZl9maWxlX3N0cmluZzsKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNvbnNfd29ya2VyIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgaW50IHNjcnViX2Zyb21fc3RyaW5nIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19hbGlnbiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxpZ24gUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbGNvbW1faW50ZXJuYWwgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgaGV4X2Zsb2F0IFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci1zdGF0aWMgaW5saW5lIGludCBzaXplb2Zfc2xlYjEyOCBQQVJBTVMgKChvZmZzZXRUKSk7Ci1zdGF0aWMgaW5saW5lIGludCBzaXplb2ZfdWxlYjEyOCBQQVJBTVMgKCh2YWx1ZVQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IG91dHB1dF9zbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgb2Zmc2V0VCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X3VsZWIxMjggUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IG91dHB1dF9iaWdfc2xlYjEyOCBQQVJBTVMgKChjaGFyICosIExJVFRMRU5VTV9UWVBFICosIGludCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X2JpZ191bGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgTElUVExFTlVNX1RZUEUgKiwgaW50KSk7Ci1zdGF0aWMgaW50IG91dHB1dF9iaWdfbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgTElUVExFTlVNX1RZUEUgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX29yZyBQQVJBTVMgKChzZWdULCBleHByZXNzaW9uUyAqLCBpbnQpKTsKLWNoYXIgKmRlbWFuZF9jb3B5X3N0cmluZyBQQVJBTVMgKChpbnQgKmxlblApKTsKLXN0YXRpYyBzZWdUIGdldF9zZWdtZW50ZWRfZXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwUCkpOwotc3RhdGljIHNlZ1QgZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwUCkpOwotc3RhdGljIHZvaWQgcG9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldF9saW5lX3NiIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX2ZpbGVfZGVidWcgUEFSQU1TICgodm9pZCkpOwotDAotCi12b2lkCi1yZWFkX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0KLSAgcG9iZWdpbiAoKTsKLSAgb2JqX3JlYWRfYmVnaW5faG9vayAoKTsKLQotICAvKiBTb21ldGhpbmcgY2xvc2UgLS0gYnV0IG5vdCB0b28gY2xvc2UgLS0gdG8gYSBtdWx0aXBsZSBvZiAxMDI0LgotICAgICBUaGUgZGVidWdnaW5nIG1hbGxvYyBJJ20gdXNpbmcgaGFzIDI0IGJ5dGVzIG9mIG92ZXJoZWFkLiAgKi8KLSAgb2JzdGFja19iZWdpbiAoJm5vdGVzLCBjaHVua3NpemUpOwotICBvYnN0YWNrX2JlZ2luICgmY29uZF9vYnN0YWNrLCBjaHVua3NpemUpOwotCi0gIC8qIFVzZSBtYWNoaW5lIGRlcGVuZGVudCBzeW50YXggKi8KLSAgZm9yIChwID0gbGluZV9zZXBhcmF0b3JfY2hhcnM7ICpwOyBwKyspCi0gICAgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpwXSA9IDE7Ci0gIC8qIFVzZSBtb3JlLiAgRklYTUUtU09NRURBWS4gKi8KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbGV4X3R5cGVbJz8nXSA9IDM7Ci19Ci0MCi0vKiBzZXQgdXAgcHNldWRvLW9wIHRhYmxlcyAqLwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcG9faGFzaDsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBwb3RhYmxlW10gPQotewotICB7ImFib3J0Iiwgc19hYm9ydCwgMH0sCi0gIHsiYWxpZ24iLCBzX2FsaWduX3B0d28sIDB9LAotICB7ImFzY2lpIiwgc3RyaW5nZXIsIDB9LAotICB7ImFzY2l6Iiwgc3RyaW5nZXIsIDF9LAotICB7ImJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAotICB7ImJhbGlnbnciLCBzX2FsaWduX2J5dGVzLCAtMn0sCi0gIHsiYmFsaWdubCIsIHNfYWxpZ25fYnl0ZXMsIC00fSwKLS8qIGJsb2NrICovCi0gIHsiYnl0ZSIsIGNvbnMsIDF9LAotICB7ImNvbW0iLCBzX2NvbW0sIDB9LAotICB7ImNvbW1vbiIsIHNfbXJpX2NvbW1vbiwgMH0sCi0gIHsiY29tbW9uLnMiLCBzX21yaV9jb21tb24sIDF9LAotICB7ImRhdGEiLCBzX2RhdGEsIDB9LAotICB7ImRjIiwgY29ucywgMn0sCi0gIHsiZGMuYiIsIGNvbnMsIDF9LAotICB7ImRjLmQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImRjLmwiLCBjb25zLCA0fSwKLSAgeyJkYy5zIiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJkYy53IiwgY29ucywgMn0sCi0gIHsiZGMueCIsIGZsb2F0X2NvbnMsICd4J30sCi0gIHsiZGNiIiwgc19zcGFjZSwgMn0sCi0gIHsiZGNiLmIiLCBzX3NwYWNlLCAxfSwKLSAgeyJkY2IuZCIsIHNfZmxvYXRfc3BhY2UsICdkJ30sCi0gIHsiZGNiLmwiLCBzX3NwYWNlLCA0fSwKLSAgeyJkY2IucyIsIHNfZmxvYXRfc3BhY2UsICdmJ30sCi0gIHsiZGNiLnciLCBzX3NwYWNlLCAyfSwKLSAgeyJkY2IueCIsIHNfZmxvYXRfc3BhY2UsICd4J30sCi0gIHsiZHMiLCBzX3NwYWNlLCAyfSwKLSAgeyJkcy5iIiwgc19zcGFjZSwgMX0sCi0gIHsiZHMuZCIsIHNfc3BhY2UsIDh9LAotICB7ImRzLmwiLCBzX3NwYWNlLCA0fSwKLSAgeyJkcy5wIiwgc19zcGFjZSwgMTJ9LAotICB7ImRzLnMiLCBzX3NwYWNlLCA0fSwKLSAgeyJkcy53Iiwgc19zcGFjZSwgMn0sCi0gIHsiZHMueCIsIHNfc3BhY2UsIDEyfSwKLSAgeyJkZWJ1ZyIsIHNfaWdub3JlLCAwfSwKLSNpZmRlZiBTX1NFVF9ERVNDCi0gIHsiZGVzYyIsIHNfZGVzYywgMH0sCi0jZW5kaWYKLS8qIGRpbSAqLwotICB7ImRvdWJsZSIsIGZsb2F0X2NvbnMsICdkJ30sCi0vKiBkc2VjdCAqLwotICB7ImVqZWN0IiwgbGlzdGluZ19lamVjdCwgMH0sCS8qIEZvcm1mZWVkIGxpc3RpbmcgKi8KLSAgeyJlbHNlIiwgc19lbHNlLCAwfSwKLSAgeyJlbHNlYyIsIHNfZWxzZSwgMH0sCi0gIHsiZW5kIiwgc19lbmQsIDB9LAotICB7ImVuZGMiLCBzX2VuZGlmLCAwfSwKLSAgeyJlbmRmdW5jIiwgc19mdW5jLCAxfSwKLSAgeyJlbmRpZiIsIHNfZW5kaWYsIDB9LAotLyogZW5kZWYgKi8KLSAgeyJlcXUiLCBzX3NldCwgMH0sCi0gIHsiZXF1aXYiLCBzX3NldCwgMX0sCi0gIHsiZXJyIiwgc19lcnIsIDB9LAotICB7ImV4aXRtIiwgc19tZXhpdCwgMH0sCi0vKiBleHRlbmQgKi8KLSAgeyJleHRlcm4iLCBzX2lnbm9yZSwgMH0sCS8qIFdlIHRyZWF0IGFsbCB1bmRlZiBhcyBleHQgKi8KLSAgeyJhcHBmaWxlIiwgc19hcHBfZmlsZSwgMX0sCi0gIHsiYXBwbGluZSIsIHNfYXBwX2xpbmUsIDB9LAotICB7ImZhaWwiLCBzX2ZhaWwsIDB9LAotICB7ImZpbGUiLCBzX2FwcF9maWxlLCAwfSwKLSAgeyJmaWxsIiwgc19maWxsLCAwfSwKLSAgeyJmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZm9ybWF0Iiwgc19pZ25vcmUsIDB9LAotICB7ImZ1bmMiLCBzX2Z1bmMsIDB9LAotICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAotICB7Imdsb2JsIiwgc19nbG9ibCwgMH0sCi0gIHsiaHdvcmQiLCBjb25zLCAyfSwKLSAgeyJpZiIsIHNfaWYsIChpbnQpIE9fbmV9LAotICB7ImlmYyIsIHNfaWZjLCAwfSwKLSAgeyJpZmRlZiIsIHNfaWZkZWYsIDB9LAotICB7ImlmZXEiLCBzX2lmLCAoaW50KSBPX2VxfSwKLSAgeyJpZmVxcyIsIHNfaWZlcXMsIDB9LAotICB7ImlmZ2UiLCBzX2lmLCAoaW50KSBPX2dlfSwKLSAgeyJpZmd0Iiwgc19pZiwgKGludCkgT19ndH0sCi0gIHsiaWZsZSIsIHNfaWYsIChpbnQpIE9fbGV9LAotICB7ImlmbHQiLCBzX2lmLCAoaW50KSBPX2x0fSwKLSAgeyJpZm5jIiwgc19pZmMsIDF9LAotICB7ImlmbmRlZiIsIHNfaWZkZWYsIDF9LAotICB7ImlmbmUiLCBzX2lmLCAoaW50KSBPX25lfSwKLSAgeyJpZm5lcyIsIHNfaWZlcXMsIDF9LAotICB7Imlmbm90ZGVmIiwgc19pZmRlZiwgMX0sCi0gIHsiaW5jbHVkZSIsIHNfaW5jbHVkZSwgMH0sCi0gIHsiaW50IiwgY29ucywgNH0sCi0gIHsiaXJwIiwgc19pcnAsIDB9LAotICB7ImlyZXAiLCBzX2lycCwgMH0sCi0gIHsiaXJwYyIsIHNfaXJwLCAxfSwKLSAgeyJpcmVwYyIsIHNfaXJwLCAxfSwKLSAgeyJsY29tbSIsIHNfbGNvbW0sIDB9LAotICB7ImxmbGFncyIsIGxpc3RpbmdfZmxhZ3MsIDB9LAkvKiBMaXN0aW5nIGZsYWdzICovCi0gIHsibGlua29uY2UiLCBzX2xpbmtvbmNlLCAwfSwKLSAgeyJsaXN0IiwgbGlzdGluZ19saXN0LCAxfSwJLyogVHVybiBsaXN0aW5nIG9uICovCi0gIHsibGxlbiIsIGxpc3RpbmdfcHNpemUsIDF9LAotICB7ImxvbmciLCBjb25zLCA0fSwKLSAgeyJsc3ltIiwgc19sc3ltLCAwfSwKLSAgeyJtYWNybyIsIHNfbWFjcm8sIDB9LAotICB7Im1leGl0Iiwgc19tZXhpdCwgMH0sCi0gIHsibXJpIiwgc19tcmksIDB9LAotICB7Ii5tcmkiLCBzX21yaSwgMH0sCS8qIFNwZWNpYWwgY2FzZSBzbyAubXJpIHdvcmtzIGluIE1SSSBtb2RlLiAgKi8KLSAgeyJuYW1lIiwgc19pZ25vcmUsIDB9LAotICB7Im5vZm9ybWF0Iiwgc19pZ25vcmUsIDB9LAotICB7Im5vbGlzdCIsIGxpc3RpbmdfbGlzdCwgMH0sCS8qIFR1cm4gbGlzdGluZyBvZmYgKi8KLSAgeyJub3BhZ2UiLCBsaXN0aW5nX25vcGFnZSwgMH0sCi0gIHsib2N0YSIsIGNvbnMsIDE2fSwKLSAgeyJvZmZzZXQiLCBzX3N0cnVjdCwgMH0sCi0gIHsib3JnIiwgc19vcmcsIDB9LAotICB7InAyYWxpZ24iLCBzX2FsaWduX3B0d28sIDB9LAotICB7InAyYWxpZ253Iiwgc19hbGlnbl9wdHdvLCAtMn0sCi0gIHsicDJhbGlnbmwiLCBzX2FsaWduX3B0d28sIC00fSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicGxlbiIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7InByaW50Iiwgc19wcmludCwgMH0sCi0gIHsicHNpemUiLCBsaXN0aW5nX3BzaXplLCAwfSwJLyogc2V0IHBhcGVyIHNpemUgKi8KLSAgeyJwdXJnZW0iLCBzX3B1cmdlbSwgMH0sCi0gIHsicXVhZCIsIGNvbnMsIDh9LAotICB7InJlcCIsIHNfcmVwdCwgMH0sCi0gIHsicmVwdCIsIHNfcmVwdCwgMH0sCi0gIHsicnZhIiwgc19ydmEsIDR9LAotICB7InNidHRsIiwgbGlzdGluZ190aXRsZSwgMX0sCS8qIFN1YnRpdGxlIG9mIGxpc3RpbmcgKi8KLS8qIHNjbCAqLwotLyogc2VjdCAqLwotICB7InNldCIsIHNfc2V0LCAwfSwKLSAgeyJzaG9ydCIsIGNvbnMsIDJ9LAotICB7InNpbmdsZSIsIGZsb2F0X2NvbnMsICdmJ30sCi0vKiBzaXplICovCi0gIHsic3BhY2UiLCBzX3NwYWNlLCAwfSwKLSAgeyJza2lwIiwgc19zcGFjZSwgMH0sCi0gIHsic2xlYjEyOCIsIHNfbGViMTI4LCAxfSwKLSAgeyJzcGMiLCBzX2lnbm9yZSwgMH0sCi0gIHsic3RhYmQiLCBzX3N0YWIsICdkJ30sCi0gIHsic3RhYm4iLCBzX3N0YWIsICduJ30sCi0gIHsic3RhYnMiLCBzX3N0YWIsICdzJ30sCi0gIHsic3RyaW5nIiwgc3RyaW5nZXIsIDF9LAotICB7InN0cnVjdCIsIHNfc3RydWN0LCAwfSwKLS8qIHRhZyAqLwotICB7InRleHQiLCBzX3RleHQsIDB9LAotCi0gIC8qIFRoaXMgaXMgZm9yIGdjYyB0byB1c2UuICBJdCdzIG9ubHkganVzdCBiZWVuIGFkZGVkICgyLzk0KSwgc28gZ2NjCi0gICAgIHdvbid0IGJlIGFibGUgdG8gdXNlIGl0IGZvciBhIHdoaWxlIC0tIHByb2JhYmx5IGEgeWVhciBvciBtb3JlLgotICAgICBCdXQgb25jZSB0aGlzIGhhcyBiZWVuIHJlbGVhc2VkLCBjaGVjayB3aXRoIGdjYyBtYWludGFpbmVycwotICAgICBiZWZvcmUgZGVsZXRpbmcgaXQgb3IgZXZlbiBjaGFuZ2luZyB0aGUgc3BlbGxpbmcuICAqLwotICB7InRoaXNfR0NDX3JlcXVpcmVzX3RoZV9HTlVfYXNzZW1ibGVyIiwgc19pZ25vcmUsIDB9LAotICAvKiBJZiB3ZSdyZSBmb2xkaW5nIGNhc2UgLS0gZG9uZSBmb3Igc29tZSB0YXJnZXRzLCBub3QgbmVjZXNzYXJpbHkKLSAgICAgYWxsIC0tIHRoZSBhYm92ZSBzdHJpbmcgaW4gYW4gaW5wdXQgZmlsZSB3aWxsIGJlIGNvbnZlcnRlZCB0bwotICAgICB0aGlzIG9uZS4gIE1hdGNoIGl0IGVpdGhlciB3YXkuLi4gICovCi0gIHsidGhpc19nY2NfcmVxdWlyZXNfdGhlX2dudV9hc3NlbWJsZXIiLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJ0aXRsZSIsIGxpc3RpbmdfdGl0bGUsIDB9LAkvKiBMaXN0aW5nIHRpdGxlICovCi0gIHsidHRsIiwgbGlzdGluZ190aXRsZSwgMH0sCi0vKiB0eXBlICovCi0gIHsidWxlYjEyOCIsIHNfbGViMTI4LCAwfSwKLS8qIHVzZSAqLwotLyogdmFsICovCi0gIHsieGNvbSIsIHNfY29tbSwgMH0sCi0gIHsieGRlZiIsIHNfZ2xvYmwsIDB9LAotICB7InhyZWYiLCBzX2lnbm9yZSwgMH0sCi0gIHsieHN0YWJzIiwgc194c3RhYiwgJ3MnfSwKLSAgeyJ3b3JkIiwgY29ucywgMn0sCi0gIHsiemVybyIsIHNfc3BhY2UsIDB9LAotICB7TlVMTH0JCQkvKiBlbmQgc2VudGluZWwgKi8KLX07Ci0KLXN0YXRpYyBpbnQgcG9wX292ZXJyaWRlX29rID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpwb3BfdGFibGVfbmFtZTsKLQotdm9pZAotcG9wX2luc2VydCAodGFibGUpCi0gICAgIGNvbnN0IHBzZXVkb190eXBlUyAqdGFibGU7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycnR4dDsKLSAgY29uc3QgcHNldWRvX3R5cGVTICpwb3A7Ci0gIGZvciAocG9wID0gdGFibGU7IHBvcC0+cG9jX25hbWU7IHBvcCsrKQotICAgIHsKLSAgICAgIGVycnR4dCA9IGhhc2hfaW5zZXJ0IChwb19oYXNoLCBwb3AtPnBvY19uYW1lLCAoY2hhciAqKSBwb3ApOwotICAgICAgaWYgKGVycnR4dCAmJiAoIXBvcF9vdmVycmlkZV9vayB8fCBzdHJjbXAgKGVycnR4dCwgImV4aXN0cyIpKSkKLQlhc19mYXRhbCAoXygiZXJyb3IgY29uc3RydWN0aW5nICVzIHBzZXVkby1vcCB0YWJsZTogJXMiKSwgcG9wX3RhYmxlX25hbWUsCi0JCSAgZXJydHh0KTsKLSAgICB9Ci19Ci0KLSNpZm5kZWYgbWRfcG9wX2luc2VydAotI2RlZmluZSBtZF9wb3BfaW5zZXJ0KCkJCXBvcF9pbnNlcnQobWRfcHNldWRvX3RhYmxlKQotI2VuZGlmCi0KLSNpZm5kZWYgb2JqX3BvcF9pbnNlcnQKLSNkZWZpbmUgb2JqX3BvcF9pbnNlcnQoKQlwb3BfaW5zZXJ0KG9ial9wc2V1ZG9fdGFibGUpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgCi1wb2JlZ2luICgpCi17Ci0gIHBvX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAvKiBEbyB0aGUgdGFyZ2V0LXNwZWNpZmljIHBzZXVkbyBvcHMuICovCi0gIHBvcF90YWJsZV9uYW1lID0gIm1kIjsKLSAgbWRfcG9wX2luc2VydCAoKTsKLQotICAvKiBOb3cgb2JqZWN0IHNwZWNpZmljLiAgU2tpcCBhbnkgdGhhdCB3ZXJlIGluIHRoZSB0YXJnZXQgdGFibGUuICovCi0gIHBvcF90YWJsZV9uYW1lID0gIm9iaiI7Ci0gIHBvcF9vdmVycmlkZV9vayA9IDE7Ci0gIG9ial9wb3BfaW5zZXJ0ICgpOwotCi0gIC8qIE5vdyBwb3J0YWJsZSBvbmVzLiAgU2tpcCBhbnkgdGhhdCB3ZSd2ZSBzZWVuIGFscmVhZHkuICovCi0gIHBvcF90YWJsZV9uYW1lID0gInN0YW5kYXJkIjsKLSAgcG9wX2luc2VydCAocG90YWJsZSk7Ci19Ci0MCi0jZGVmaW5lIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSgpCQkJCQlcCi0gIGlmIChpZ25vcmVfaW5wdXQgKCkpCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIrK10pCVwKLQlpZiAoaW5wdXRfbGluZV9wb2ludGVyID09IGJ1ZmZlcl9saW1pdCkJCQkJXAotCSAgYnJlYWs7CQkJCQkJCVwKLSAgICAgIGNvbnRpbnVlOwkJCQkJCQkJXAotICAgIH0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBzY3J1YmJpbmcgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiAjQVBQCi0gICBhbmQgI05PX0FQUC4gICovCi0KLXN0YXRpYyBjaGFyICpzY3J1Yl9zdHJpbmc7Ci1zdGF0aWMgY2hhciAqc2NydWJfc3RyaW5nX2VuZDsKLQotc3RhdGljIGludAotc2NydWJfZnJvbV9zdHJpbmcgKGJ1ZiwgYnVmbGVuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIGludCBjb3B5OwotCi0gIGNvcHkgPSBzY3J1Yl9zdHJpbmdfZW5kIC0gc2NydWJfc3RyaW5nOwotICBpZiAoY29weSA+IGJ1ZmxlbikKLSAgICBjb3B5ID0gYnVmbGVuOwotICBtZW1jcHkgKGJ1Ziwgc2NydWJfc3RyaW5nLCBjb3B5KTsKLSAgc2NydWJfc3RyaW5nICs9IGNvcHk7Ci0gIHJldHVybiBjb3B5OwotfQotCi0vKglyZWFkX2Ffc291cmNlX2ZpbGUoKQotICoKLSAqIFdlIHJlYWQgdGhlIGZpbGUsIHB1dHRpbmcgdGhpbmdzIGludG8gYSB3ZWIgdGhhdAotICogcmVwcmVzZW50cyB3aGF0IHdlIGhhdmUgYmVlbiByZWFkaW5nLgotICovCi12b2lkIAotcmVhZF9hX3NvdXJjZV9maWxlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnM7CQkvKiBzdHJpbmcgb2Ygc3ltYm9sLCAnXDAnIGFwcGVuZGVkICovCi0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICBwc2V1ZG9fdHlwZVMgKnBvcDsKLQotICBidWZmZXIgPSBpbnB1dF9zY3J1Yl9uZXdfZmlsZSAobmFtZSk7Ci0KLSAgbGlzdGluZ19maWxlIChuYW1lKTsKLSAgbGlzdGluZ19uZXdsaW5lIChOVUxMKTsKLSAgcmVnaXN0ZXJfZGVwZW5kZW5jeSAobmFtZSk7Ci0KLSAgLyogR2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJlZm9yZSB3ZSd2ZSByZWFkIGFueXRoaW5nIGluIHRvIGRlbm90ZQotICAgICB0aGlzIGZpbGUgYXMgdGhlICJtYWluIiBzb3VyY2UgZmlsZSBhbmQgbm90IGEgc3Vib3JkaW5hdGUgb25lCi0gICAgIChlLmcuIE5fU08gdnMgTl9TT0wgaW4gc3RhYnMpLiAgKi8KLSAgZ2VuZXJhdGVfZmlsZV9kZWJ1ZyAoKTsKLQotICB3aGlsZSAoKGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKSkgIT0gMCkKLSAgICB7CQkJCS8qIFdlIGhhdmUgYW5vdGhlciBsaW5lIHRvIHBhcnNlLiAqLwotICAgICAga25vdyAoYnVmZmVyX2xpbWl0Wy0xXSA9PSAnXG4nKTsJLyogTXVzdCBoYXZlIGEgc2VudGluZWwuICovCi0gICAgY29udGluOgkJCS8qIEpGIHRoaXMgZ290byBpcyBteSBmYXVsdCBJIGFkbWl0IGl0LgotCQkJCSAgIFNvbWVvbmUgYnJhdmUgcGxlYXNlIHJlLXdyaXRlIHRoZSB3aG9sZQotCQkJCSAgIGlucHV0IHNlY3Rpb24gaGVyZT8gIFBsZWV6ZT8/PyAgKi8KLSAgICAgIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQpCi0JewotCSAgLyogV2UgaGF2ZSBtb3JlIG9mIHRoaXMgYnVmZmVyIHRvIHBhcnNlLiAqLwotCi0JICAvKgotCSAgICogV2Ugbm93IGhhdmUgaW5wdXRfbGluZV9wb2ludGVyLT4xc3QgY2hhciBvZiBuZXh0IGxpbmUuCi0JICAgKiBJZiBpbnB1dF9saW5lX3BvaW50ZXIgWy0xXSA9PSAnXG4nIHRoZW4gd2UganVzdAotCSAgICogc2Nhbm5lZCBhbm90aGVyIGxpbmU6IHNvIGJ1bXAgbGluZSBjb3VudGVycy4KLQkgICAqLwotCSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdXSkKLQkgICAgewotI2lmZGVmIG1kX3N0YXJ0X2xpbmVfaG9vawotCSAgICAgIG1kX3N0YXJ0X2xpbmVfaG9vayAoKTsKLSNlbmRpZgotCi0JICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1xuJykKLQkJYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCi0JICAgICAgbGluZV9sYWJlbCA9IE5VTEw7Ci0KLQkgICAgICBpZiAoZmxhZ19tNjhrX21yaQotI2lmZGVmIExBQkVMU19XSVRIT1VUX0NPTE9OUwotCQkgIHx8IDEKLSNlbmRpZgotCQkgICkKLQkJewotCQkgIC8qIFRleHQgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBtdXN0IGJlIGEgbGFiZWwsIHdlCi0JCSAgICAgcnVuIGRvd24gYW5kIHN0aWNrIGEgY29sb24gaW4uICAqLwotCQkgIGlmIChpc19uYW1lX2JlZ2lubmVyICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkJICAgIHsKLQkJICAgICAgY2hhciAqbGluZV9zdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICAgICAgY2hhciBjOwotCQkgICAgICBpbnQgbXJpX2xpbmVfbWFjcm87Ci0KLQkJICAgICAgTElTVElOR19ORVdMSU5FICgpOwotCQkgICAgICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7Ci0KLQkJICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JCSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgRVFVIGFuZCBNQUNSTyBwc2V1ZG9vcHMgbXVzdAotCQkJIGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgKi8KLQkJICAgICAgbXJpX2xpbmVfbWFjcm8gPSAwOwotCQkgICAgICBpZiAoZmxhZ19tNjhrX21yaSkKLQkJCXsKLQkJCSAgY2hhciAqcmVzdCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0KLQkJCSAgaWYgKCpyZXN0ID09ICc6JykKLQkJCSAgICArK3Jlc3Q7Ci0JCQkgIGlmICgqcmVzdCA9PSAnICcgfHwgKnJlc3QgPT0gJ1x0JykKLQkJCSAgICArK3Jlc3Q7Ci0JCQkgIGlmICgoc3RybmNhc2VjbXAgKHJlc3QsICJFUVUiLCAzKSA9PSAwCi0JCQkgICAgICAgfHwgc3RybmNhc2VjbXAgKHJlc3QsICJTRVQiLCAzKSA9PSAwKQotCQkJICAgICAgJiYgKHJlc3RbM10gPT0gJyAnIHx8IHJlc3RbM10gPT0gJ1x0JykpCi0JCQkgICAgewotCQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcmVzdCArIDM7Ci0JCQkgICAgICBlcXVhbHMgKGxpbmVfc3RhcnQsCi0JCQkJICAgICAgc3RybmNhc2VjbXAgKHJlc3QsICJTRVQiLCAzKSA9PSAwKTsKLQkJCSAgICAgIGNvbnRpbnVlOwotCQkJICAgIH0KLQkJCSAgaWYgKHN0cm5jYXNlY21wIChyZXN0LCAiTUFDUk8iLCA1KSA9PSAwCi0JCQkgICAgICAmJiAocmVzdFs1XSA9PSAnICcKLQkJCQkgIHx8IHJlc3RbNV0gPT0gJ1x0JwotCQkJCSAgfHwgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIHJlc3RbNV1dKSkKLQkJCSAgICBtcmlfbGluZV9tYWNybyA9IDE7Ci0JCQl9Ci0KLQkJICAgICAgLyogSW4gTVJJIG1vZGUsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBNQUNSTwotICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkby1vcCBzcGVjaWFsbHk6IHdlIGRvbid0IHdhbnQgdG8gcHV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQkJICAgICAgaWYgKCEgbXJpX2xpbmVfbWFjcm8pCi0JCQlsaW5lX2xhYmVsID0gY29sb24gKGxpbmVfc3RhcnQpOwotCQkgICAgICBlbHNlCi0JCQlsaW5lX2xhYmVsID0gc3ltYm9sX2NyZWF0ZSAobGluZV9zdGFydCwKLQkJCQkJCSAgICBhYnNvbHV0ZV9zZWN0aW9uLAotCQkJCQkJICAgICh2YWx1ZVQpIDAsCi0JCQkJCQkgICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgICAgaWYgKGMgPT0gJzonKQotCQkJaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKgotCSAgICogV2UgYXJlIGF0IHRoZSBiZWdpbmluZyBvZiBhIGxpbmUsIG9yIHNpbWlsYXIgcGxhY2UuCi0JICAgKiBXZSBleHBlY3QgYSB3ZWxsLWZvcm1lZCBhc3NlbWJsZXIgc3RhdGVtZW50LgotCSAgICogQSAic3ltYm9sLW5hbWU6IiBpcyBhIHN0YXRlbWVudC4KLQkgICAqCi0JICAgKiBEZXBlbmRpbmcgb24gd2hhdCBjb21waWxlciBpcyB1c2VkLCB0aGUgb3JkZXIgb2YgdGhlc2UgdGVzdHMKLQkgICAqIG1heSB2YXJ5IHRvIGNhdGNoIG1vc3QgY29tbW9uIGNhc2UgMXN0LgotCSAgICogRWFjaCB0ZXN0IGlzIGluZGVwZW5kZW50IG9mIGFsbCBvdGhlciB0ZXN0cyBhdCB0aGUgKHRvcCkgbGV2ZWwuCi0JICAgKiBQTEVBU0UgbWFrZSBhIGNvbXBpbGVyIHRoYXQgZG9lc24ndCB1c2UgdGhpcyBhc3NlbWJsZXIuCi0JICAgKiBJdCBpcyBjcnVmdHkgdG8gd2FzdGUgYSBjb21waWxlcidzIHRpbWUgZW5jb2RpbmcgdGhpbmdzIGZvciB0aGlzCi0JICAgKiBhc3NlbWJsZXIsIHdoaWNoIHRoZW4gd2FzdGVzIG1vcmUgdGltZSBkZWNvZGluZyBpdC4KLQkgICAqIChBbmQgY29tbXVuaWNhdGluZyB2aWEgKGxpbmVhcikgZmlsZXMgaXMgc2lsbHkhCi0JICAgKiBJZiB5b3UgbXVzdCBwYXNzIHN0dWZmLCBwbGVhc2UgcGFzcyBhIHRyZWUhKQotCSAgICovCi0JICBpZiAoKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspID09ICdcdCcKLQkgICAgICB8fCBjID09ICcgJwotCSAgICAgIHx8IGMgPT0gJ1xmJwotCSAgICAgIHx8IGMgPT0gMCkKLQkgICAgewotCSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgIH0KLQkgIGtub3cgKGMgIT0gJyAnKTsJLyogTm8gZnVydGhlciBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0KLSNpZm5kZWYgTk9fTElTVElORwotCSAgLyogSWYgbGlzdGluZyBpcyBvbiwgYW5kIHdlIGFyZSBleHBhbmRpbmcgYSBtYWNybywgdGhlbiBnaXZlCi0JICAgICB0aGUgbGlzdGluZyBjb2RlIHRoZSBjb250ZW50cyBvZiB0aGUgZXhwYW5kZWQgbGluZS4gICovCi0JICBpZiAobGlzdGluZykKLQkgICAgewotCSAgICAgIGlmICgobGlzdGluZyAmIExJU1RJTkdfTUFDRVhQKSAmJiBtYWNyb19uZXN0ID4gMCkKLQkJewotCQkgIGNoYXIgKmNvcHk7Ci0JCSAgaW50IGxlbjsKLQotCQkgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBleHBhbmRlZCBtYWNybyBsaW5lLiAgKi8KLQkJICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXItMTsgKnMgOyArK3MpCi0JCSAgICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXSkKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAvKiBDb3B5IGl0IGZvciBzYWZlIGtlZXBpbmcuICBBbHNvIGdpdmUgYW4gaW5kaWNhdGlvbiBvZgotCQkgICAgIGhvdyBtdWNoIG1hY3JvIG5lc3RpbmcgaXMgaW52b2x2ZWQgYXQgdGhpcyBwb2ludC4gICovCi0JCSAgbGVuID0gcyAtIChpbnB1dF9saW5lX3BvaW50ZXItMSk7Ci0JCSAgY29weSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIG1hY3JvX25lc3QgKyAyKTsKLQkJICBtZW1zZXQgKGNvcHksICc+JywgbWFjcm9fbmVzdCk7Ci0JCSAgY29weVttYWNyb19uZXN0XSA9ICcgJzsKLQkJICBtZW1jcHkgKGNvcHkgKyBtYWNyb19uZXN0ICsgMSwgaW5wdXRfbGluZV9wb2ludGVyLTEsIGxlbik7Ci0JCSAgY29weVttYWNyb19uZXN0KzErbGVuXSA9ICdcMCc7Ci0KLQkJICAvKiBJbnN0YWxsIHRoZSBsaW5lIHdpdGggdGhlIGxpc3RpbmcgZmFjaWxpdHkuICAqLwotCQkgIGxpc3RpbmdfbmV3bGluZSAoY29weSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxpc3RpbmdfbmV3bGluZSAoTlVMTCk7Ci0JICAgIH0KLSNlbmRpZgotCi0JICAvKgotCSAgICogQyBpcyB0aGUgMXN0IHNpZ25pZmljYW50IGNoYXJhY3Rlci4KLQkgICAqIElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgYWZ0ZXIgdGhhdCBjaGFyYWN0ZXIuCi0JICAgKi8KLQkgIGlmIChpc19uYW1lX2JlZ2lubmVyIChjKSkKLQkgICAgewotCSAgICAgIC8qIHdhbnQgdXNlci1kZWZpbmVkIGxhYmVsIG9yIHBzZXVkby9vcGNvZGUgKi8KLQkgICAgICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7Ci0KLQkgICAgICBzID0gLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwkvKiBuYW1lJ3MgZGVsaW1pdGVyICovCi0JICAgICAgLyoKLQkgICAgICAgKiBDIGlzIGNoYXJhY3RlciBhZnRlciBzeW1ib2wuCi0JICAgICAgICogVGhhdCBjaGFyYWN0ZXIncyBwbGFjZSBpbiB0aGUgaW5wdXQgbGluZSBpcyBub3cgJ1wwJy4KLQkgICAgICAgKiBTIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2wuCi0JICAgICAgICogICBbSW4gY2FzZSBvZiBwc2V1ZG8tb3AsIHMtPicuJy5dCi0JICAgICAgICogSW5wdXRfbGluZV9wb2ludGVyLT4nXDAnIHdoZXJlIGMgd2FzLgotCSAgICAgICAqLwotCSAgICAgIGlmIChUQ19TVEFSVF9MQUJFTChjLCBpbnB1dF9saW5lX3BvaW50ZXIpKQotCQl7Ci0JCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKnJlc3QgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotCi0JCSAgICAgIC8qIEluIE1SSSBtb2RlLCBcdHN5bTogc2V0IDAgaXMgcGVybWl0dGVkLiAgKi8KLQotCQkgICAgICBpZiAoKnJlc3QgPT0gJzonKQotCQkJKytyZXN0OwotCQkgICAgICBpZiAoKnJlc3QgPT0gJyAnIHx8ICpyZXN0ID09ICdcdCcpCi0JCQkrK3Jlc3Q7Ci0JCSAgICAgIGlmICgoc3RybmNhc2VjbXAgKHJlc3QsICJFUVUiLCAzKSA9PSAwCi0JCQkgICB8fCBzdHJuY2FzZWNtcCAocmVzdCwgIlNFVCIsIDMpID09IDApCi0JCQkgICYmIChyZXN0WzNdID09ICcgJyB8fCByZXN0WzNdID09ICdcdCcpKQotCQkJewotCQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSByZXN0ICsgMzsKLQkJCSAgZXF1YWxzIChzLCAxKTsKLQkJCSAgY29udGludWU7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBsaW5lX2xhYmVsID0gY29sb24gKHMpOwkvKiB1c2VyLWRlZmluZWQgbGFiZWwgKi8KLQkJICAqaW5wdXRfbGluZV9wb2ludGVyKysgPSAnOic7CS8qIFB1dCAnOicgYmFjayBmb3IgZXJyb3IgbWVzc2FnZXMnIHNha2UuICovCi0JCSAgLyogSW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciAnOicuICovCi0JCSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJz0nCi0JCSAgICAgICB8fCAoKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKLQkJCSAgICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnPScKLSNpZmRlZiBUQ19FUVVBTF9JTl9JTlNOCi0JCQkgICAmJiAhIFRDX0VRVUFMX0lOX0lOU04gKGMsIGlucHV0X2xpbmVfcG9pbnRlcikKLSNlbmRpZgotCQkJICAgKSkKLQkJewotCQkgIGVxdWFscyAocywgMSk7Ci0JCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogZXhwZWN0IHBzZXVkby1vcCBvciBtYWNoaW5lIGluc3RydWN0aW9uICovCi0JCSAgcG9wID0gTlVMTDsKLQotI2RlZmluZSBJR05PUkVfT1BDT0RFX0NBU0UKLSNpZmRlZiBJR05PUkVfT1BDT0RFX0NBU0UKLQkJICB7Ci0JCSAgICBjaGFyICpzMiA9IHM7Ci0JCSAgICB3aGlsZSAoKnMyKQotCQkgICAgICB7Ci0JCQlpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzMikpCi0JCQkgICpzMiA9IHRvbG93ZXIgKCpzMik7Ci0JCQlzMisrOwotCQkgICAgICB9Ci0JCSAgfQotI2VuZGlmCi0KLQkJICBpZiAoZmxhZ19tNjhrX21yaQotI2lmZGVmIE5PX1BTRVVET19ET1QKLQkJICAgICAgfHwgMQotI2VuZGlmCi0JCSAgICAgICkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgYW5kIHRoZSBtODhrIHVzZSBwc2V1ZG8tb3BzCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBhIHBlcmlvZC4gICovCi0JCSAgICAgIHBvcCA9IChwc2V1ZG9fdHlwZVMgKikgaGFzaF9maW5kIChwb19oYXNoLCBzKTsKLQkJICAgICAgaWYgKHBvcCAhPSBOVUxMICYmIHBvcC0+cG9jX2hhbmRsZXIgPT0gTlVMTCkKLQkJCXBvcCA9IE5VTEw7Ci0JCSAgICB9Ci0KLQkJICBpZiAocG9wICE9IE5VTEwKLQkJICAgICAgfHwgKCEgZmxhZ19tNjhrX21yaSAmJiAqcyA9PSAnLicpKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiBQU0VVRE8gLSBPUC4KLQkJICAgICAgICoKLQkJICAgICAgICogV0FSTklORzogYyBoYXMgbmV4dCBjaGFyLCB3aGljaCBtYXkgYmUgZW5kLW9mLWxpbmUuCi0JCSAgICAgICAqIFdlIGxvb2t1cCB0aGUgcHNldWRvLW9wIHRhYmxlIHdpdGggcysxIGJlY2F1c2Ugd2UKLQkJICAgICAgICogYWxyZWFkeSBrbm93IHRoYXQgdGhlIHBzZXVkby1vcCBiZWdpbnMgd2l0aCBhICcuJy4KLQkJICAgICAgICovCi0KLQkJICAgICAgaWYgKHBvcCA9PSBOVUxMKQotCQkJcG9wID0gKHBzZXVkb190eXBlUyAqKSBoYXNoX2ZpbmQgKHBvX2hhc2gsIHMgKyAxKTsKLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgd2UgbWF5IG5lZWQgdG8gaW5zZXJ0IGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGFsaWdubWVudCBkaXJlY3RpdmUuICBXaGF0IGEgaGFjawotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMuICAqLwotCQkgICAgICBpZiAobXJpX3BlbmRpbmdfYWxpZ24KLQkJCSAgJiYgKHBvcCA9PSBOVUxMCi0JCQkgICAgICB8fCAhICgocG9wLT5wb2NfaGFuZGxlciA9PSBjb25zCi0JCQkJICAgICAmJiBwb3AtPnBvY192YWwgPT0gMSkKLQkJCQkgICAgfHwgKHBvcC0+cG9jX2hhbmRsZXIgPT0gc19zcGFjZQotCQkJCQkmJiBwb3AtPnBvY192YWwgPT0gMSkKLSNpZmRlZiB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcAotCQkJCSAgICB8fCB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcCAocG9wKQotI2VuZGlmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZgotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZkZWYKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lmYwotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZlcXMKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2Vsc2UKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2VuZGlmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19nbG9ibAotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWdub3JlKSkpCi0JCQl7Ci0JCQkgIGRvX2FsaWduICgxLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkJCSAgbXJpX3BlbmRpbmdfYWxpZ24gPSAwOwotCQkJICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgZnJhZ19ub3cpOwotCQkJICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIC8qIFByaW50IHRoZSBlcnJvciBtc2cgbm93LCB3aGlsZSB3ZSBzdGlsbCBjYW4gKi8KLQkJICAgICAgaWYgKHBvcCA9PSBOVUxMKQotCQkJewotCQkJICBhc19iYWQgKF8oIlVua25vd24gcHNldWRvLW9wOiAgYCVzJyIpLCBzKTsKLQkJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCQkgIHNfaWdub3JlICgwKTsKLQkJCSAgY29udGludWU7Ci0JCQl9Ci0KLQkJICAgICAgLyogUHV0IGl0IGJhY2sgZm9yIGVycm9yIG1lc3NhZ2VzIGV0Yy4gKi8KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgc2tpcCBvZiB3aGl0ZXNwYWNlIGlzIGNvbXB1bHNvcnkuCi0JCQkgQSB3ZWxsIHNoYXBlZCBzcGFjZSBpcyBzb21ldGltZXMgYWxsIHRoYXQgc2VwYXJhdGVzCi0JCQkga2V5d29yZCBmcm9tIG9wZXJhbmRzLiAqLwotCQkgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQkJaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIElucHV0X2xpbmUgaXMgcmVzdG9yZWQuCi0JCSAgICAgICAqIElucHV0X2xpbmVfcG9pbnRlci0+MXN0IG5vbi1ibGFuayBjaGFyCi0JCSAgICAgICAqIGFmdGVyIHBzZXVkby1vcGVyYXRpb24uCi0JCSAgICAgICAqLwotCQkgICAgICAoKnBvcC0+cG9jX2hhbmRsZXIpIChwb3AtPnBvY192YWwpOwotCi0JCSAgICAgIC8qIElmIHRoYXQgd2FzIC5lbmQsIGp1c3QgZ2V0IG91dCBub3cuICAqLwotCQkgICAgICBpZiAocG9wLT5wb2NfaGFuZGxlciA9PSBzX2VuZCkKLQkJCWdvdG8gcXVpdDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbnF1b3RlID0gMDsKLSNpZmRlZiBRVU9URVNfSU5fSU5TTgotCQkgICAgICBpbnQgaW5lc2NhcGUgPSAwOwotI2VuZGlmCi0KLQkJICAgICAgLyogV0FSTklORzogYyBoYXMgY2hhciwgd2hpY2ggbWF5IGJlIGVuZC1vZi1saW5lLiAqLwotCQkgICAgICAvKiBBbHNvOiBpbnB1dF9saW5lX3BvaW50ZXItPmBcMGAgd2hlcmUgYyB3YXMuICovCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCQkJICAgICB8fCBpbnF1b3RlCi0jaWZkZWYgVENfRU9MX0lOX0lOU04KLQkJCSAgICAgfHwgVENfRU9MX0lOX0lOU04gKGlucHV0X2xpbmVfcG9pbnRlcikKLSNlbmRpZgotCQkJICAgICApCi0JCQl7Ci0JCQkgIGlmIChmbGFnX202OGtfbXJpICYmICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkJCSAgICBpbnF1b3RlID0gISBpbnF1b3RlOwotI2lmZGVmIFFVT1RFU19JTl9JTlNOCi0JCQkgIGlmIChpbmVzY2FwZSkKLQkJCSAgICBpbmVzY2FwZSA9IDA7Ci0JCQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCQkJICAgIGlucXVvdGUgPSAhIGlucXVvdGU7Ci0JCQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xcJykKLQkJCSAgICBpbmVzY2FwZSA9IDE7Ci0jZW5kaWYKLQkJCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCQl9Ci0KLQkJICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCi0JCSAgICAgIGdlbmVyYXRlX2xpbmVub19kZWJ1ZyAoKTsKLQotCQkgICAgICBpZiAobWFjcm9fZGVmaW5lZCkKLQkJCXsKLQkJCSAgc2Igb3V0OwotCQkJICBjb25zdCBjaGFyICplcnI7Ci0KLQkJCSAgaWYgKGNoZWNrX21hY3JvIChzLCAmb3V0LCAnXDAnLCAmZXJyKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoZXJyICE9IE5VTEwpCi0JCQkJYXNfYmFkIChlcnIpOwotCQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLQkJCSAgICAgIGlucHV0X3NjcnViX2luY2x1ZGVfc2IgKCZvdXQsCi0JCQkJCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIpOwotCQkJICAgICAgc2Jfa2lsbCAoJm91dCk7Ci0JCQkgICAgICBidWZmZXJfbGltaXQgPQotCQkJCWlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJCSAgICAgIGNvbnRpbnVlOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAobXJpX3BlbmRpbmdfYWxpZ24pCi0JCQl7Ci0JCQkgIGRvX2FsaWduICgxLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkJCSAgbXJpX3BlbmRpbmdfYWxpZ24gPSAwOwotCQkJICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgZnJhZ19ub3cpOwotCQkJICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIG1kX2Fzc2VtYmxlIChzKTsJLyogQXNzZW1ibGUgMSBpbnN0cnVjdGlvbi4gKi8KLQotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyKysgPSBjOwotCi0JCSAgICAgIC8qIFdlIHJlc3VtZSBsb29wIEFGVEVSIHRoZSBlbmQtb2YtbGluZSBmcm9tCi0JCQkgdGhpcyBpbnN0cnVjdGlvbi4gKi8KLQkJICAgIH0JCS8qIGlmICgqcz09Jy4nKSAqLwotCQl9CQkvKiBpZiBjPT0nOicgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQkJCS8qIGlmIChpc19uYW1lX2JlZ2lubmVyKGMpICovCi0KLQotCSAgLyogRW1wdHkgc3RhdGVtZW50PyAgKi8KLQkgIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgY10pCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoKExPQ0FMX0xBQkVMU19ET0xMQVIgfHwgTE9DQUxfTEFCRUxTX0ZCKQotCSAgICAgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgewotCSAgICAgIC8qIGxvY2FsIGxhYmVsICAoIjQ6IikgKi8KLQkgICAgICBjaGFyICpiYWNrdXAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgICAgICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7Ci0KLQkgICAgICB0ZW1wID0gYyAtICcwJzsKLQotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JCXsKLQkJICB0ZW1wID0gKHRlbXAgKiAxMCkgKyAqaW5wdXRfbGluZV9wb2ludGVyIC0gJzAnOwotCQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCQl9CQkvKiByZWFkIHRoZSB3aG9sZSBudW1iZXIgKi8KLQotCSAgICAgIGlmIChMT0NBTF9MQUJFTFNfRE9MTEFSCi0JCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcKLQkJICAmJiAqKGlucHV0X2xpbmVfcG9pbnRlciArIDEpID09ICc6JykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0JCSAgaWYgKGRvbGxhcl9sYWJlbF9kZWZpbmVkICh0ZW1wKSkKLQkJICAgIHsKLQkJICAgICAgYXNfZmF0YWwgKF8oImxhYmVsIFwiJWQkXCIgcmVkZWZpbmVkIiksIHRlbXApOwotCQkgICAgfQotCi0JCSAgZGVmaW5lX2RvbGxhcl9sYWJlbCAodGVtcCk7Ci0JCSAgY29sb24gKGRvbGxhcl9sYWJlbF9uYW1lICh0ZW1wLCAwKSk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGlmIChMT0NBTF9MQUJFTFNfRkIKLQkJICAmJiAqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJzonKQotCQl7Ci0JCSAgZmJfbGFiZWxfaW5zdGFuY2VfaW5jICh0ZW1wKTsKLQkJICBjb2xvbiAoZmJfbGFiZWxfbmFtZSAodGVtcCwgMCkpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBiYWNrdXA7Ci0JICAgIH0JCQkvKiBsb2NhbCBsYWJlbCAgKCI0OiIpICovCi0KLQkgIGlmIChjICYmIHN0cmNociAobGluZV9jb21tZW50X2NoYXJzLCBjKSkKLQkgICAgewkJCS8qIEl0cyBhIGNvbW1lbnQuICBCZXR0ZXIgc2F5IEFQUCBvciBOT19BUFAgKi8KLQkgICAgICBjaGFyICplbmRzOwotCSAgICAgIGNoYXIgKm5ld19idWY7Ci0JICAgICAgY2hhciAqbmV3X3RtcDsKLQkgICAgICB1bnNpZ25lZCBpbnQgbmV3X2xlbmd0aDsKLQkgICAgICBjaGFyICp0bXBfYnVmID0gMDsKLQotCSAgICAgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQkgICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiQVBQXG4iLCA0KSkKLQkJY29udGludWU7CS8qIFdlIGlnbm9yZSBpdCAqLwotCSAgICAgIHMgKz0gNDsKLQotCSAgICAgIGVuZHMgPSBzdHJzdHIgKHMsICIjTk9fQVBQXG4iKTsKLQotCSAgICAgIGlmICghZW5kcykKLQkJewotCQkgIHVuc2lnbmVkIGludCB0bXBfbGVuOwotCQkgIHVuc2lnbmVkIGludCBudW07Ci0KLQkJICAvKiBUaGUgZW5kIG9mIHRoZSAjQVBQIHdhc24ndCBpbiB0aGlzIGJ1ZmZlci4gIFdlCi0JCSAgICAga2VlcCByZWFkaW5nIGluIGJ1ZmZlcnMgdW50aWwgd2UgZmluZCB0aGUgI05PX0FQUAotCQkgICAgIHRoYXQgZ29lcyB3aXRoIHRoaXMgI0FQUCAgVGhlcmUgaXMgb25lLiAgVGhlIHNwZWNzCi0JCSAgICAgZ3VhcmVudGVlIGl0LiAuIC4gKi8KLQkJICB0bXBfbGVuID0gYnVmZmVyX2xpbWl0IC0gczsKLQkJICB0bXBfYnVmID0geG1hbGxvYyAodG1wX2xlbiArIDEpOwotCQkgIG1lbWNweSAodG1wX2J1ZiwgcywgdG1wX2xlbik7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgbmV3X3RtcCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmYnVmZmVyKTsKLQkJICAgICAgaWYgKCFuZXdfdG1wKQotCQkJYnJlYWs7Ci0JCSAgICAgIGVsc2UKLQkJCWJ1ZmZlcl9saW1pdCA9IG5ld190bXA7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZmZlcjsKLQkJICAgICAgZW5kcyA9IHN0cnN0ciAoYnVmZmVyLCAiI05PX0FQUFxuIik7Ci0JCSAgICAgIGlmIChlbmRzKQotCQkJbnVtID0gZW5kcyAtIGJ1ZmZlcjsKLQkJICAgICAgZWxzZQotCQkJbnVtID0gYnVmZmVyX2xpbWl0IC0gYnVmZmVyOwotCi0JCSAgICAgIHRtcF9idWYgPSB4cmVhbGxvYyAodG1wX2J1ZiwgdG1wX2xlbiArIG51bSk7Ci0JCSAgICAgIG1lbWNweSAodG1wX2J1ZiArIHRtcF9sZW4sIGJ1ZmZlciwgbnVtKTsKLQkJICAgICAgdG1wX2xlbiArPSBudW07Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKCFlbmRzKTsKLQotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGVuZHMgPyBlbmRzICsgOCA6IE5VTEw7Ci0KLQkJICBzID0gdG1wX2J1ZjsKLQkJICBlbmRzID0gcyArIHRtcF9sZW47Ci0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGVuZHMgKyA4OwotCQl9Ci0KLQkgICAgICBzY3J1Yl9zdHJpbmcgPSBzOwotCSAgICAgIHNjcnViX3N0cmluZ19lbmQgPSBlbmRzOwotCi0JICAgICAgbmV3X2xlbmd0aCA9IGVuZHMgLSBzOwotCSAgICAgIG5ld19idWYgPSAoY2hhciAqKSB4bWFsbG9jIChuZXdfbGVuZ3RoKTsKLQkgICAgICBuZXdfdG1wID0gbmV3X2J1ZjsKLQkgICAgICBmb3IgKDs7KQotCQl7Ci0JCSAgaW50IHNwYWNlOwotCQkgIGludCBzaXplOwotCi0JCSAgc3BhY2UgPSAobmV3X2J1ZiArIG5ld19sZW5ndGgpIC0gbmV3X3RtcDsKLQkJICBzaXplID0gZG9fc2NydWJfY2hhcnMgKHNjcnViX2Zyb21fc3RyaW5nLCBuZXdfdG1wLCBzcGFjZSk7Ci0KLQkJICBpZiAoc2l6ZSA8IHNwYWNlKQotCQkgICAgewotCQkgICAgICBuZXdfdG1wICs9IHNpemU7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgbmV3X2J1ZiA9IHhyZWFsbG9jIChuZXdfYnVmLCBuZXdfbGVuZ3RoICsgMTAwKTsKLQkJICBuZXdfdG1wID0gbmV3X2J1ZiArIG5ld19sZW5ndGg7Ci0JCSAgbmV3X2xlbmd0aCArPSAxMDA7Ci0JCX0KLQotCSAgICAgIGlmICh0bXBfYnVmKQotCQlmcmVlICh0bXBfYnVmKTsKLQkgICAgICBvbGRfYnVmZmVyID0gYnVmZmVyOwotCSAgICAgIG9sZF9pbnB1dCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBvbGRfbGltaXQgPSBidWZmZXJfbGltaXQ7Ci0JICAgICAgYnVmZmVyID0gbmV3X2J1ZjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBuZXdfYnVmOwotCSAgICAgIGJ1ZmZlcl9saW1pdCA9IG5ld190bXA7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZICgpOwotCi0jaWZkZWYgdGNfdW5yZWNvZ25pemVkX2xpbmUKLQkgIGlmICh0Y191bnJlY29nbml6ZWRfbGluZSAoYykpCi0JICAgIGNvbnRpbnVlOwotI2VuZGlmCi0KLQkgIC8qIGFzX3dhcm4oIkp1bmsgY2hhcmFjdGVyICVkLiIsYyk7ICBOb3cgZG9uZSBieSBpZ25vcmVfcmVzdCAqLwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07CS8qIFJlcG9ydCB1bmtub3duIGNoYXIgYXMgaWdub3JlZC4gKi8KLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JfQkJCS8qIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXI8YnVmZmVyX2xpbWl0KSAqLwotCi0jaWZkZWYgbWRfYWZ0ZXJfcGFzc19ob29rCi0gICAgICBtZF9hZnRlcl9wYXNzX2hvb2sgKCk7Ci0jZW5kaWYKLQotICAgICAgaWYgKG9sZF9idWZmZXIpCi0JewotCSAgZnJlZSAoYnVmZmVyKTsKLQkgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQkgIGlmIChvbGRfaW5wdXQgIT0gMCkKLQkgICAgewotCSAgICAgIGJ1ZmZlciA9IG9sZF9idWZmZXI7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkX2lucHV0OwotCSAgICAgIGJ1ZmZlcl9saW1pdCA9IG9sZF9saW1pdDsKLQkgICAgICBvbGRfYnVmZmVyID0gMDsKLQkgICAgICBnb3RvIGNvbnRpbjsKLQkgICAgfQotCX0KLSAgICB9CQkJCS8qIHdoaWxlIChtb3JlIGJ1ZmZlcnMgdG8gc2NhbikgKi8KLQotIHF1aXQ6Ci0KLSNpZmRlZiBtZF9jbGVhbnVwCi0gIG1kX2NsZWFudXAoKTsKLSNlbmRpZgotICBpbnB1dF9zY3J1Yl9jbG9zZSAoKTsJCS8qIENsb3NlIHRoZSBpbnB1dCBmaWxlICovCi19Ci0KLS8qIEZvciBtb3N0IE1SSSBwc2V1ZG8tb3BzLCB0aGUgbGluZSBhY3R1YWxseSBlbmRzIGF0IHRoZSBmaXJzdAotICAgbm9ucXVvdGVkIHNwYWNlLiAgVGhpcyBmdW5jdGlvbiBsb29rcyBmb3IgdGhhdCBwb2ludCwgc3R1ZmZzIGEgbnVsbAotICAgaW4sIGFuZCBzZXRzICpTVE9QQ1AgdG8gdGhlIGNoYXJhY3RlciB0aGF0IHVzZWQgdG8gYmUgdGhlcmUsIGFuZAotICAgcmV0dXJucyB0aGUgbG9jYXRpb24uCi0KLSAgIFVudGlsIEkgaGVhciBvdGhlcndpc2UsIEkgYW0gZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhpcyBpcyBvbmx5IHRydWUKLSAgIGZvciB0aGUgbTY4ayBNUkkgYXNzZW1ibGVyLiAgKi8KLQotY2hhciAqCi1tcmlfY29tbWVudF9maWVsZCAoc3RvcGNwKQotICAgICBjaGFyICpzdG9wY3A7Ci17Ci0jaWZkZWYgVENfTTY4SwotCi0gIGNoYXIgKnM7Ci0gIGludCBpbnF1b3RlID0gMDsKLQotICBrbm93IChmbGFnX202OGtfbXJpKTsKLQotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAgKCghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10gJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JfHwgaW5xdW90ZSk7Ci0gICAgICAgcysrKQotICAgIHsKLSAgICAgIGlmICgqcyA9PSAnXCcnKQotCWlucXVvdGUgPSAhIGlucXVvdGU7Ci0gICAgfQotICAqc3RvcGNwID0gKnM7Ci0gICpzID0gJ1wwJzsKLSAgcmV0dXJuIHM7Ci0KLSNlbHNlCi0KLSAgY2hhciAqczsKLQotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXTsgcysrKQotICAgIDsKLSAgKnN0b3BjcCA9ICpzOwotICAqcyA9ICdcMCc7Ci0gIHJldHVybiBzOwotCi0jZW5kaWYKLQotfQotCi0vKiBTa2lwIHRvIHRoZSBlbmQgb2YgYW4gTVJJIGNvbW1lbnQgZmllbGQuICAqLwotCi12b2lkCi1tcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKQotICAgICBjaGFyICpzdG9wOwotICAgICBpbnQgc3RvcGM7Ci17Ci0gIGtub3cgKGZsYWdfbXJpKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdG9wOwotICAqc3RvcCA9IHN0b3BjOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLXZvaWQgCi1zX2Fib3J0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGFzX2ZhdGFsIChfKCIuYWJvcnQgZGV0ZWN0ZWQuICBBYmFuZG9uaW5nIHNoaXAuIikpOwotfQotCi0vKiBHdXRzIG9mIC5hbGlnbiBkaXJlY3RpdmUuICBOIGlzIHRoZSBwb3dlciBvZiB0d28gdG8gd2hpY2ggdG8gYWxpZ24uCi0gICBGSUxMIG1heSBiZSBOVUxMLCBvciBpdCBtYXkgcG9pbnQgdG8gdGhlIGJ5dGVzIG9mIHRoZSBmaWxsIHBhdHRlcm4uCi0gICBMRU4gaXMgdGhlIGxlbmd0aCBvZiB3aGF0ZXZlciBGSUxMIHBvaW50cyB0bywgaWYgYW55dGhpbmcuICBNQVggaXMKLSAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAotICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotc3RhdGljIHZvaWQgCi1kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpCi0gICAgIGludCBuOwotICAgICBjaGFyICpmaWxsOwotICAgICBpbnQgbGVuOwotICAgICBpbnQgbWF4OwotewotICBjaGFyIGRlZmF1bHRfZmlsbDsKLQotI2lmZGVmIG1kX2RvX2FsaWduCi0gIG1kX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCwganVzdF9yZWNvcmRfYWxpZ25tZW50KTsKLSNlbmRpZgotCi0gIGlmIChmaWxsID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpKQotCWRlZmF1bHRfZmlsbCA9IE5PUF9PUENPREU7Ci0gICAgICBlbHNlCi0JZGVmYXVsdF9maWxsID0gMDsKLSAgICAgIGZpbGwgPSAmZGVmYXVsdF9maWxsOwotICAgICAgbGVuID0gMTsKLSAgICB9Ci0KLSAgLyogT25seSBtYWtlIGEgZnJhZyBpZiB3ZSBIQVZFIHRvLiAuIC4gKi8KLSAgaWYgKG4gIT0gMCAmJiAhbmVlZF9wYXNzXzIpCi0gICAgewotICAgICAgaWYgKGxlbiA8PSAxKQotCWZyYWdfYWxpZ24gKG4sICpmaWxsLCBtYXgpOwotICAgICAgZWxzZQotCWZyYWdfYWxpZ25fcGF0dGVybiAobiwgZmlsbCwgbGVuLCBtYXgpOwotICAgIH0KLQotI2lmZGVmIG1kX2RvX2FsaWduCi0ganVzdF9yZWNvcmRfYWxpZ25tZW50OgotI2VuZGlmCi0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbik7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFsaWduIHBzZXVkby1vcC4gIEEgcG9zaXRpdmUgQVJHIGlzIGEgZGVmYXVsdCBhbGlnbm1lbnQKLSAgIChpbiBieXRlcykuICBBIG5lZ2F0aXZlIEFSRyBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGxlbmd0aCBvZiB0aGUKLSAgIGZpbGwgcGF0dGVybi4gIEJZVEVTX1AgaXMgbm9uLXplcm8gaWYgdGhlIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUKLSAgIGludGVycHJldGVkIGFzIHRoZSBieXRlIGJvdW5kYXJ5LCByYXRoZXIgdGhhbiB0aGUgcG93ZXIgb2YgMi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FsaWduIChhcmcsIGJ5dGVzX3ApCi0gICAgIGludCBhcmc7Ci0gICAgIGludCBieXRlc19wOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYWxpZ247Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotICBvZmZzZXRUIGZpbGwgPSAwOwotICBpbnQgbWF4OwotICBpbnQgZmlsbF9wOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoYXJnIDwgMCkKLQlhbGlnbiA9IDA7Ci0gICAgICBlbHNlCi0JYWxpZ24gPSBhcmc7CS8qIERlZmF1bHQgdmFsdWUgZnJvbSBwc2V1ZG8tb3AgdGFibGUgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLQotICBpZiAoYnl0ZXNfcCkKLSAgICB7Ci0gICAgICAvKiBDb252ZXJ0IHRvIGEgcG93ZXIgb2YgMi4gICovCi0gICAgICBpZiAoYWxpZ24gIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgKGFsaWduICYgMSkgPT0gMDsgYWxpZ24gPj49IDEsICsraSkKLQkgICAgOwotCSAgaWYgKGFsaWduICE9IDEpCi0JICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICBhbGlnbiA9IGk7Ci0JfQotICAgIH0KLQotICBpZiAoYWxpZ24gPiAxNSkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDE1OwotICAgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAldSBhc3N1bWVkIiksIGFsaWduKTsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGZpbGxfcCA9IDA7Ci0gICAgICBtYXggPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCWZpbGxfcCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgZmlsbF9wID0gMTsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQltYXggPSAwOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgbWF4ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JfQotICAgIH0KLQotICBpZiAoISBmaWxsX3ApCi0gICAgewotICAgICAgaWYgKGFyZyA8IDApCi0JYXNfd2FybiAoXygiZXhwZWN0ZWQgZmlsbCBwYXR0ZXJuIG1pc3NpbmciKSk7Ci0gICAgICBkb19hbGlnbiAoYWxpZ24sIChjaGFyICopIE5VTEwsIDAsIG1heCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGZpbGxfbGVuOwotCi0gICAgICBpZiAoYXJnID49IDApCi0JZmlsbF9sZW4gPSAxOwotICAgICAgZWxzZQotCWZpbGxfbGVuID0gLSBhcmc7Ci0gICAgICBpZiAoZmlsbF9sZW4gPD0gMSkKLQl7Ci0JICBjaGFyIGZpbGxfY2hhcjsKLQotCSAgZmlsbF9jaGFyID0gZmlsbDsKLQkgIGRvX2FsaWduIChhbGlnbiwgJmZpbGxfY2hhciwgZmlsbF9sZW4sIG1heCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYWJbMTZdOwotCi0JICBpZiAoKHNpemVfdCkgZmlsbF9sZW4gPiBzaXplb2YgYWIpCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChhYiwgZmlsbCwgZmlsbF9sZW4pOwotCSAgZG9fYWxpZ24gKGFsaWduLCBhYiwgZmlsbF9sZW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wIG9uIG1hY2hpbmVzIHdoZXJlICIuYWxpZ24gNCIgbWVhbnMKLSAgIGFsaWduIHRvIGEgNCBieXRlIGJvdW5kYXJ5LiAgKi8KLQotdm9pZCAKLXNfYWxpZ25fYnl0ZXMgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgc19hbGlnbiAoYXJnLCAxKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wIG9uIG1hY2hpbmVzIHdoZXJlICIuYWxpZ24gNCIgbWVhbnMgYWxpZ24KLSAgIHRvIGEgMioqNCBib3VuZGFyeS4gICovCi0KLXZvaWQgCi1zX2FsaWduX3B0d28gKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgc19hbGlnbiAoYXJnLCAwKTsKLX0KLQotdm9pZCAKLXNfY29tbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgdGVtcDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKGZsYWdfbXJpKQotCW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKGZsYWdfbXJpKQotCW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHRlbXApCi0JYXNfYmFkIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHRlbXApOwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICAgIH0KLSNpZmRlZiBPQkpfVk1TCi0gIHsKLSAgICBleHRlcm4gaW50IGZsYWdfb25lOwotICAgIGlmICggKCF0ZW1wKSB8fCAhZmxhZ19vbmUpCi0gICAgICBTX0dFVF9PVEhFUihzeW1ib2xQKSA9IGNvbnN0X2ZsYWc7Ci0gIH0KLSNlbmRpZiAvKiBub3QgT0JKX1ZNUyAqLwotICBrbm93IChzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19CQkJCS8qIHNfY29tbSgpICovCi0KLS8qIFRoZSBNUkkgQ09NTU9OIHBzZXVkby1vcC4gIFdlIGhhbmRsZSB0aGlzIGJ5IGNyZWF0aW5nIGEgY29tbW9uCi0gICBzeW1ib2wgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbmFtZS4gIFdlIG1ha2Ugc19zcGFjZSBkbyB0aGUgcmlnaHQKLSAgIHRoaW5nIGJ5IGluY3JlYXNpbmcgdGhlIHNpemUuICAqLwotCi12b2lkCi1zX21yaV9jb21tb24gKHNtYWxsKQotICAgICBpbnQgc21hbGw7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqYWxjID0gTlVMTDsKLSAgc3ltYm9sUyAqc3ltOwotICBvZmZzZXRUIGFsaWduOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoISBmbGFnX21yaSkKLSAgICB7Ci0gICAgICBzX2NvbW0gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqbmFtZSkpCi0gICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbHNlCi0gICAgewotICAgICAgZG8KLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0KLSAgICAgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JewotCSAgYWxjID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChTX0dFVF9OQU1FIChsaW5lX2xhYmVsKSkKLQkJCQkgICsgKGlucHV0X2xpbmVfcG9pbnRlciAtIG5hbWUpCi0JCQkJICArIDEpOwotCSAgc3ByaW50ZiAoYWxjLCAiJXMlcyIsIG5hbWUsIFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKTsKLQkgIG5hbWUgPSBhbGM7Ci0JfQotICAgIH0KLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGlmIChhbGMgIT0gTlVMTCkKLSAgICBmcmVlIChhbGMpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhbGlnbiA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bSkgJiYgISBTX0lTX0NPTU1PTiAoc3ltKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnIiksIFNfR0VUX05BTUUgKHN5bSkpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTX1NFVF9FWFRFUk5BTCAoc3ltKTsKLSAgbXJpX2NvbW1vbl9zeW1ib2wgPSBzeW07Ci0KLSNpZmRlZiBTX1NFVF9BTElHTgotICBpZiAoYWxpZ24gIT0gMCkKLSAgICBTX1NFVF9BTElHTiAoc3ltLCBhbGlnbik7Ci0jZW5kaWYKLQotICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICAgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBleHAuWF9hZGRfc3ltYm9sID0gc3ltOwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKGxpbmVfbGFiZWwsICZleHApOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgU19TRVRfU0VHTUVOVCAobGluZV9sYWJlbCwgZXhwcl9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIGp1c3QgaWdub3JlIHRoZSBzbWFsbCBhcmd1bWVudCwgd2hpY2ggZGlzdGluZ3Vpc2hlcwotICAgICBDT01NT04gYW5kIENPTU1PTi5TLiAgSSBkb24ndCBrbm93IHdoYXQgd2UgY2FuIGRvIGFib3V0IGl0LiAgKi8KLQotICAvKiBJZ25vcmUgdGhlIHR5cGUgYW5kIGhwdHlwZS4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLXZvaWQKLXNfZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzZWdUIHNlY3Rpb247Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIHNlY3Rpb24gPSB0ZXh0X3NlY3Rpb247Ci0gICAgICB0ZW1wICs9IDEwMDA7Ci0gICAgfQotICBlbHNlCi0gICAgc2VjdGlvbiA9IGRhdGFfc2VjdGlvbjsKLQotICBzdWJzZWdfc2V0IChzZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0KLSNpZmRlZiBPQkpfVk1TCi0gIGNvbnN0X2ZsYWcgPSAwOwotI2VuZGlmCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFwcGZpbGUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQotICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuIHdpdGggYQotICAgZmlsZSBuYW1lLiAgVGhpcyBkZWZhdWx0IGRlZmluaXRpb24gbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG9iamVjdAotICAgb3IgQ1BVIHNwZWNpZmljIHBzZXVkby1vcHMuICBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdGhlIGRlZmF1bHQKLSAgIGRlZmluaXRpb24gZm9yIC5maWxlOyB0aGUgQVBQRklMRSBhcmd1bWVudCBpcyAxIGZvciAuYXBwZmlsZSwgMCBmb3IKLSAgIC5maWxlLiAgKi8KLQotdm9pZCAKLXNfYXBwX2ZpbGUgKGFwcGZpbGUpCi0gICAgIGludCBhcHBmaWxlOwotewotICByZWdpc3RlciBjaGFyICpzOwotICBpbnQgbGVuZ3RoOwotCi0gIC8qIFNvbWUgYXNzZW1ibGVycyB0b2xlcmF0ZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgJyInICovCi0gIGlmICgocyA9IGRlbWFuZF9jb3B5X3N0cmluZyAoJmxlbmd0aCkpICE9IDApCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIGZha2UgLmFwcGZpbGUsIGEgZmFrZSBuZXdsaW5lIHdhcyBpbnNlcnRlZCBpbnRvCi0JIHRoZSBidWZmZXIuICBQYXNzaW5nIC0yIHRvIG5ld19sb2dpY2FsX2xpbmUgdGVsbHMgaXQgdG8KLQkgYWNjb3VudCBmb3IgaXQuICAqLwotICAgICAgaW50IG1heV9vbWl0Ci0JPSAoISBuZXdfbG9naWNhbF9saW5lIChzLCBhcHBmaWxlID8gLTIgOiAtMSkgJiYgYXBwZmlsZSk7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgcHJlcHJvY2Vzc29yIG1heSBoYXZlIGluc2VydGVkIGFuIGV4dHJhbmVvdXMKLSAgICAgICAgIGJhY2txdW90ZS4gICovCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaQotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnCi0JICAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmICghIG1heV9vbWl0KQotCXsKLSNpZmRlZiBMSVNUSU5HCi0JICBpZiAobGlzdGluZykKLQkgICAgbGlzdGluZ19zb3VyY2VfZmlsZSAocyk7Ci0jZW5kaWYKLQkgIHJlZ2lzdGVyX2RlcGVuZGVuY3kgKHMpOwotI2lmZGVmIG9ial9hcHBfZmlsZQotCSAgb2JqX2FwcF9maWxlIChzKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFwcGxpbmUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQotICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuLiAgVGhpcwotICAgZGVmYXVsdCBkZWZpbml0aW9uIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBvYmplY3Qgb3IgQ1BVIHNwZWNpZmljCi0gICBwc2V1ZG8tb3BzLiAgKi8KLQotdm9pZAotc19hcHBfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgbDsKLQotICAvKiBUaGUgZ2l2ZW4gbnVtYmVyIGlzIHRoYXQgb2YgdGhlIG5leHQgbGluZS4gICovCi0gIGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSAtIDE7Ci0gIGlmIChsIDwgMCkKLSAgICAvKiBTb21lIG9mIHRoZSBiYWNrIGVuZHMgY2FuJ3QgZGVhbCB3aXRoIG5vbi1wb3NpdGl2ZSBsaW5lIG51bWJlcnMuCi0gICAgICAgQmVzaWRlcywgaXQncyBzaWxseS4gICovCi0gICAgYXNfd2FybiAoXygiTGluZSBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmU7IGxpbmUgbnVtYmVyICVkIHJlamVjdGVkLiIpLCBsKzEpOwotICBlbHNlCi0gICAgewotICAgICAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgbCk7Ci0jaWZkZWYgTElTVElORwotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAobCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVuZCBwc2V1ZG8tb3AuICBBY3R1YWxseSwgdGhlIHJlYWwgd29yayBpcyBkb25lIGluCi0gICByZWFkX2Ffc291cmNlX2ZpbGUuICAqLwotCi12b2lkCi1zX2VuZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgcGVybWl0cyB0aGUgc3RhcnQgc3ltYm9sIHRvIGZvbGxvdyAuZW5kLAotICAgICAgICAgYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhhdC4gICovCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KLQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyonCi0JICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICchJykKLQlhc193YXJuIChfKCJzdGFydCBhZGRyZXNzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgdGhlIC5lcnIgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19lcnIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgYXNfYmFkIChfKCIuZXJyIGVuY291bnRlcmVkIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBmYWlsIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfZmFpbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvZmZzZXRUIHRlbXA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAodGVtcCA+PSA1MDApCi0gICAgYXNfd2FybiAoXygiLmZhaWwgJWxkIGVuY291bnRlcmVkIiksIChsb25nKSB0ZW1wKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygiLmZhaWwgJWxkIGVuY291bnRlcmVkIiksIChsb25nKSB0ZW1wKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotdm9pZCAKLXNfZmlsbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyByZXBfZXhwOwotICBsb25nIHNpemUgPSAxOwotICByZWdpc3RlciBsb25nIGZpbGwgPSAwOwotICBjaGFyICpwOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZyZXBfZXhwKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggQlNEIDQuMiBBUywgbm90IGZvciBhbnkgcmF0aW9uYWwgcmVhc29uLiAgKi8KLSNkZWZpbmUgQlNEX0ZJTExfU0laRV9DUk9DS184ICg4KQotICBpZiAoc2l6ZSA+IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZmlsbCBzaXplIGNsYW1wZWQgdG8gJWQuIiksIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCk7Ci0gICAgICBzaXplID0gQlNEX0ZJTExfU0laRV9DUk9DS184OwotICAgIH0KLSAgaWYgKHNpemUgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlNpemUgbmVnYXRpdmU6IC5maWxsIGlnbm9yZWQuIikpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChyZXBfZXhwLlhfb3AgPT0gT19jb25zdGFudCAmJiByZXBfZXhwLlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGlmIChyZXBfZXhwLlhfYWRkX251bWJlciA8IDApCi0JYXNfd2FybiAoXygiUmVwZWF0IDwgMCwgLmZpbGwgaWdub3JlZCIpKTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLQotICBpZiAoc2l6ZSAmJiAhbmVlZF9wYXNzXzIpCi0gICAgewotICAgICAgaWYgKHJlcF9leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHAgPSBmcmFnX3ZhciAocnNfZmlsbCwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwKLQkJCShyZWxheF9zdWJzdGF0ZVQpIDAsIChzeW1ib2xTICopIDAsCi0JCQkob2Zmc2V0VCkgcmVwX2V4cC5YX2FkZF9udW1iZXIsCi0JCQkoY2hhciAqKSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IHJlcGVhdCBjb3VudCwgc28gd2UgY2FuJ3QgdXNlCi0JICAgICByc19maWxsLiAgV2UgY2FuIGdldCB0aGUgc2FtZSByZXN1bHRzIG91dCBvZiByc19zcGFjZSwKLQkgICAgIGJ1dCBpdHMgYXJndW1lbnQgaXMgaW4gYnl0ZXMsIHNvIHdlIG11c3QgbXVsdGlwbHkgdGhlCi0JICAgICByZXBlYXQgY291bnQgYnkgc2l6ZS4gICovCi0KLQkgIHN5bWJvbFMgKnJlcF9zeW07Ci0JICByZXBfc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJnJlcF9leHApOwotCSAgaWYgKHNpemUgIT0gMSkKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25TIHNpemVfZXhwOwotCSAgICAgIHNpemVfZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIHNpemVfZXhwLlhfYWRkX251bWJlciA9IHNpemU7Ci0KLQkgICAgICByZXBfZXhwLlhfb3AgPSBPX211bHRpcGx5OwotCSAgICAgIHJlcF9leHAuWF9hZGRfc3ltYm9sID0gcmVwX3N5bTsKLQkgICAgICByZXBfZXhwLlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnNpemVfZXhwKTsKLQkgICAgICByZXBfZXhwLlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgcmVwX3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyZXBfZXhwKTsKLQkgICAgfQotCi0JICBwID0gZnJhZ192YXIgKHJzX3NwYWNlLCAoaW50KSBzaXplLCAoaW50KSBzaXplLAotCQkJKHJlbGF4X3N1YnN0YXRlVCkgMCwgcmVwX3N5bSwgKG9mZnNldFQpIDAsIChjaGFyICopIDApOwotCX0KLSAgICAgIG1lbXNldCAocCwgMCwgKHVuc2lnbmVkIGludCkgc2l6ZSk7Ci0gICAgICAvKiBUaGUgbWFnaWMgbnVtYmVyIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNCBpcyBmcm9tIEJTRCA0LjIgVkFYCi0gICAgICAgKiBmbGF2b3VyZWQgQVMuICBUaGUgZm9sbG93aW5nIGJpenphcmUgYmVoYXZpb3VyIGlzIHRvIGJlCi0gICAgICAgKiBjb21wYXRpYmxlIHdpdGggYWJvdmUuICBJIGd1ZXNzIHRoZXkgdHJpZWQgdG8gdGFrZSB1cCB0byA4Ci0gICAgICAgKiBieXRlcyBmcm9tIGEgNC1ieXRlIGV4cHJlc3Npb24gYW5kIHRoZXkgZm9yZ290IHRvIHNpZ24KLSAgICAgICAqIGV4dGVuZC4gVW4qeCBTdXguICovCi0jZGVmaW5lIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNCAoNCkKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgZmlsbCwKLQkJCSAgKHNpemUgPiBCU0RfRklMTF9TSVpFX0NST0NLXzQKLQkJCSAgID8gQlNEX0ZJTExfU0laRV9DUk9DS180Ci0JCQkgICA6IChpbnQpIHNpemUpKTsKLSAgICAgIC8qIE5vdGU6IC5maWxsICgpLDAgZW1pdHMgbm8gZnJhZyAoc2luY2Ugd2UgYXJlIGFza2VkIHRvIC5maWxsIDAgYnl0ZXMpCi0gICAgICAgKiBidXQgZW1pdHMgbm8gZXJyb3IgbWVzc2FnZSBiZWNhdXNlIGl0IHNlZW1zIGEgbGVnYWwgdGhpbmcgdG8gZG8uCi0gICAgICAgKiBJdCBpcyBhIGRlZ2VuZXJhdGUgY2FzZSBvZiAuZmlsbCBidXQgY291bGQgYmUgZW1pdHRlZCBieSBhIGNvbXBpbGVyLgotICAgICAgICovCi0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkIAotc19nbG9ibCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBJUlAgYW5kIElSUEMgcHNldWRvLW9wcy4gICovCi0KLXZvaWQKLXNfaXJwIChpcnBjKQotICAgICBpbnQgaXJwYzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHNiIHM7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgc2Igb3V0OwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIHNiX25ldyAoJnMpOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgc2JfYWRkX2NoYXIgKCZzLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCi0gIHNiX25ldyAoJm91dCk7Ci0KLSAgZXJyID0gZXhwYW5kX2lycCAoaXJwYywgMCwgJnMsICZvdXQsIGdldF9saW5lX3NiLCAnXDAnKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgIiVzIiwgZXJyKTsKLQotICBzYl9raWxsICgmcyk7Ci0KLSAgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiAoJm91dCwgaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgc2Jfa2lsbCAoJm91dCk7Ci0gIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0KLQotLyogSGFuZGxlIHRoZSAubGlua29uY2UgcHNldWRvLW9wLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIG1hcmsKLSAgIHRoZSBzZWN0aW9uIHRvIG9ubHkgYmUgbGlua2VkIG9uY2UuICBIb3dldmVyLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQKLSAgIGJ5IG1vc3Qgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoaXMgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQsCi0gICB3aGljaCBpcyB3aGF0IHRvIGRvIGFib3V0IGR1cGxpY2F0ZXMuICAqLwotCi12b2lkCi1zX2xpbmtvbmNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGVudW0gbGlua29uY2VfdHlwZSB0eXBlOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICB0eXBlID0gTElOS09OQ0VfRElTQ0FSRDsKLQotICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgYzsKLQotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChzdHJjYXNlY21wIChzLCAiZGlzY2FyZCIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX0RJU0NBUkQ7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzLCAib25lX29ubHkiKSA9PSAwKQotCXR5cGUgPSBMSU5LT05DRV9PTkVfT05MWTsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzYW1lX3NpemUiKSA9PSAwKQotCXR5cGUgPSBMSU5LT05DRV9TQU1FX1NJWkU7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzLCAic2FtZV9jb250ZW50cyIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX1NBTUVfQ09OVEVOVFM7Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygidW5yZWNvZ25pemVkIC5saW5rb25jZSB0eXBlIGAlcyciKSwgcyk7Ci0KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotI2lmZGVmIG9ial9oYW5kbGVfbGlua19vbmNlCi0gIG9ial9oYW5kbGVfbGlua19vbmNlICh0eXBlKTsKLSNlbHNlIC8qICEgZGVmaW5lZCAob2JqX2hhbmRsZV9saW5rX29uY2UpICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICBpZiAoKGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCkgJiBTRUNfTElOS19PTkNFKSA9PSAwKQotICAgICAgYXNfd2FybiAoXygiLmxpbmtvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotCi0gICAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZyk7Ci0gICAgZmxhZ3MgfD0gU0VDX0xJTktfT05DRTsKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICB7Ci0gICAgICBkZWZhdWx0OgotCWFib3J0ICgpOwotICAgICAgY2FzZSBMSU5LT05DRV9ESVNDQVJEOgotCWZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLQlicmVhazsKLSAgICAgIGNhc2UgTElOS09OQ0VfT05FX09OTFk6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWTsKLQlicmVhazsKLSAgICAgIGNhc2UgTElOS09OQ0VfU0FNRV9TSVpFOgotCWZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9TQU1FX0NPTlRFTlRTOgotCWZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzsKLQlicmVhazsKLSAgICAgIH0KLSAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZywgZmxhZ3MpKQotICAgICAgYXNfYmFkIChfKCJiZmRfc2V0X3NlY3Rpb25fZmxhZ3M6ICVzIiksCi0JICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICB9Ci0jZWxzZSAvKiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICovCi0gIGFzX3dhcm4gKF8oIi5saW5rb25jZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpKTsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChvYmpfaGFuZGxlX2xpbmtfb25jZSkgKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZCAKLXNfbGNvbW1faW50ZXJuYWwgKG5lZWRzX2FsaWduLCBieXRlc19wKQotICAgICAvKiAxIGlmIHRoaXMgd2FzIGEgIi5ic3MiIGRpcmVjdGl2ZSwgd2hpY2ggbWF5IHJlcXVpcmUgYSAzcmQgYXJndW1lbnQKLQkoYWxpZ25tZW50KTsgMCBpZiBpdCB3YXMgYW4gIi5sY29tbSIgKDIgYXJncyBvbmx5KSAgKi8KLSAgICAgaW50IG5lZWRzX2FsaWduOwotICAgICAvKiAxIGlmIHRoZSBhbGlnbm1lbnQgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIHRoZSBieXRlIGJvdW5kYXJ5LAotCXJhdGhlciB0aGFuIHRoZSBwb3dlciBvZiAyLiAqLwotICAgICBpbnQgYnl0ZXNfcDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0gIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBjb25zdCBpbnQgbWF4X2FsaWdubWVudCA9IDE1OwotICBpbnQgYWxpZ24gPSAwOwotICBzZWdUIGJzc19zZWcgPSBic3Nfc2VjdGlvbjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIC8qIEFjY2VwdCBhbiBvcHRpb25hbCBjb21tYSBhZnRlciB0aGUgbmFtZS4gIFRoZSBjb21tYSB1c2VkIHRvIGJlCi0gICAgIHJlcXVpcmVkLCBidXQgSXJpeCA1IGNjIGRvZXMgbm90IGdlbmVyYXRlIGl0LiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTWlzc2luZyBzaXplIGV4cHJlc3Npb24iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmIGRlZmluZWQgKFRDX01JUFMpIHx8IGRlZmluZWQgKFRDX0FMUEhBKQotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICAvKiBGb3IgTUlQUyBhbmQgQWxwaGEgRUNPRkYgb3IgRUxGLCBzbWFsbCBvYmplY3RzIGFyZSBwdXQgaW4gLnNic3MuICAqLwotICAgICAgaWYgKHRlbXAgPD0gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKQotCXsKLQkgIGJzc19zZWcgPSBzdWJzZWdfbmV3ICgiLnNic3MiLCAxKTsKLQkgIHNlZ19pbmZvIChic3Nfc2VnKS0+YnNzID0gMTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgYnNzX3NlZywgU0VDX0FMTE9DKSkKLQkgICAgYXNfd2FybiAoXygiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIuc2Jzc1wiOiAlcyIpLAotCQkgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0jZW5kaWYKLSAgIGlmICghbmVlZHNfYWxpZ24pCi0gICAgIHsKLSAgICAgICAvKiBGSVhNRS4gVGhpcyBuZWVkcyB0byBiZSBtYWNoaW5lIGluZGVwZW5kZW50LiAqLwotICAgICAgIGlmICh0ZW1wID49IDgpCi0JIGFsaWduID0gMzsKLSAgICAgICBlbHNlIGlmICh0ZW1wID49IDQpCi0JIGFsaWduID0gMjsKLSAgICAgICBlbHNlIGlmICh0ZW1wID49IDIpCi0JIGFsaWduID0gMTsKLSAgICAgICBlbHNlCi0JIGFsaWduID0gMDsKLQotI2lmZGVmIE9CSl9FVkFYCi0gICAgICAgLyogRklYTUU6IFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiBhIG1vcmUgZ2VuZXJhbCBmYXNoaW9uLiAgKi8KLSAgICAgICBhbGlnbiA9IDM7Ci0jZW5kaWYKLQotICAgICAgIHJlY29yZF9hbGlnbm1lbnQoYnNzX3NlZywgYWxpZ24pOwotICAgICB9Ci0KLSAgaWYgKG5lZWRzX2FsaWduKQotICAgIHsKLSAgICAgIGFsaWduID0gMDsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHNpemUiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQl7Ci0JICBhc19iYWQgKF8oIk1pc3NpbmcgYWxpZ25tZW50IikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoYnl0ZXNfcCkKLQl7Ci0JICAvKiBDb252ZXJ0IHRvIGEgcG93ZXIgb2YgMi4gICovCi0JICBpZiAoYWxpZ24gIT0gMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0JICAgICAgZm9yIChpID0gMDsgKGFsaWduICYgMSkgPT0gMDsgYWxpZ24gPj49IDEsICsraSkKLQkJOwotCSAgICAgIGlmIChhbGlnbiAhPSAxKQotCQlhc19iYWQgKF8oIkFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgICAgIGFsaWduID0gaTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCi0JewotCSAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OwotCSAgYXNfd2FybiAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQuIiksIGFsaWduKTsKLQl9Ci0gICAgICBlbHNlIGlmIChhbGlnbiA8IDApCi0JewotCSAgYWxpZ24gPSAwOwotCSAgYXNfd2FybiAoXygiQWxpZ25tZW50IG5lZ2F0aXZlLiAwIGFzc3VtZWQuIikpOwotCX0KLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWcsIGFsaWduKTsKLSAgICB9CQkJCS8qIGlmIG5lZWRzIGFsaWduICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBc3N1bWUgc29tZSBvYmplY3RzIG1heSByZXF1aXJlIGFsaWdubWVudCBvbiBzb21lIHN5c3RlbXMuICAqLwotI2lmIGRlZmluZWQgKFRDX0FMUEhBKSAmJiAhIGRlZmluZWQgKFZNUykKLSAgICAgIGlmICh0ZW1wID4gMSkKLQl7Ci0JICBhbGlnbiA9IGZmcyAodGVtcCkgLSAxOwotCSAgaWYgKHRlbXAgJSAoMSA8PCBhbGlnbikpCi0JICAgIGFib3J0ICgpOwotCX0KLSNlbmRpZgotICAgIH0KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotCi0gIGlmICgKLSNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCi0gICAgICAgU19HRVRfT1RIRVIgKHN5bWJvbFApID09IDAgJiYKLSAgICAgICBTX0dFVF9ERVNDIChzeW1ib2xQKSA9PSAwICYmCi0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLSAgICAgICAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlZwotCXx8ICghU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkpKQotICAgIHsKLSAgICAgIGNoYXIgKnBmcmFnOwotCi0gICAgICBzdWJzZWdfc2V0IChic3Nfc2VnLCAxKTsKLQotICAgICAgaWYgKGFsaWduKQotCWZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQkJCQkJLyogZGV0YWNoIGZyb20gb2xkIGZyYWcJKi8KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VnKQotCXN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IE5VTEw7Ci0KLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotICAgICAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCQkob2Zmc2V0VCkgdGVtcCwgKGNoYXIgKikgMCk7Ci0gICAgICAqcGZyYWcgPSAwOwotCi0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VnKTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICAvKiBUaGUgc3ltYm9sIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBwcmVjZWRpbmcKLSAgICAgICAgICIuZ2xvYmwiIGRpcmVjdGl2ZSAtLSBiZSBjYXJlZnVsIG5vdCB0byBzdGVwIG9uIHN0b3JhZ2UgY2xhc3MKLSAgICAgICAgIGluIHRoYXQgY2FzZS4gIE90aGVyd2lzZSwgc2V0IGl0IHRvIHN0YXRpYy4gKi8KLSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSAhPSBDX0VYVCkKLQl7Ci0JICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1NUQVQpOwotCX0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0jaWZkZWYgU19TRVRfU0laRQotICAgICAgU19TRVRfU0laRSAoc3ltYm9sUCwgdGVtcCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2xjb21tX2ludGVybmFsKCkgKi8KLQotdm9pZAotc19sY29tbSAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIDApOwotfQotCi12b2lkIHNfbGNvbW1fYnl0ZXMgKG5lZWRzX2FsaWduKQotICAgICBpbnQgbmVlZHNfYWxpZ247Ci17Ci0gIHNfbGNvbW1faW50ZXJuYWwgKG5lZWRzX2FsaWduLCAxKTsKLX0KLQotdm9pZCAKLXNfbHN5bSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAvKiB3ZSBwZXJtaXQgQU5ZIGRlZmluZWQgZXhwcmVzc2lvbjogQlNENC4yIGRlbWFuZHMgY29uc3RhbnRzICovCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKnAgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgICYmIGV4cC5YX29wICE9IE9fcmVnaXN0ZXIpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAvKiBGSVhNRS1TT09OIEkgcHVsbGVkIGEgKCYmIHN5bWJvbFAtPnN5X290aGVyID09IDAgJiYKLSAgICAgc3ltYm9sUC0+c3lfZGVzYyA9PSAwKSBvdXQgb2YgdGhpcyB0ZXN0IGJlY2F1c2UgY29mZiBkb2Vzbid0IGhhdmUKLSAgICAgdGhvc2UgZmllbGRzLCBhbmQgSSBjYW4ndCBzZWUgd2hlbiB0aGV5J2QgZXZlciBiZSB0cmlwcGVkLiAgSQotICAgICBkb24ndCB0aGluayBJIHVuZGVyc3RhbmQgd2h5IHRoZXkgd2VyZSBoZXJlIHNvIEkgbWF5IGhhdmUKLSAgICAgaW50cm9kdWNlZCBhIGJ1Zy4gQXMgcmVjZW50bHkgYXMgMS4zNyBkaWRuJ3QgaGF2ZSB0aGlzIHRlc3QKLSAgICAgYW55d2F5LiAgeG94b3JpY2guICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgbmFtZSBtaWdodCBiZSBhbiB1bmRlZmluZWQgLmdsb2JhbCBzeW1ib2w7IGJlIHN1cmUgdG8KLQkga2VlcCB0aGUgImV4dGVybmFsIiBiaXQuICovCi0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLAotCQkgICAgIChleHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgID8gYWJzb2x1dGVfc2VjdGlvbgotCQkgICAgICA6IHJlZ19zZWN0aW9uKSk7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIiksIG5hbWUpOwotICAgIH0KLSAgKnAgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2xzeW0oKSAqLwotCi0vKiBSZWFkIGEgbGluZSBpbnRvIGFuIHNiLiAgKi8KLQotc3RhdGljIGludAotZ2V0X2xpbmVfc2IgKGxpbmUpCi0gICAgIHNiICpsaW5lOwotewotICBjaGFyIHF1b3RlMSwgcXVvdGUyLCBpbnF1b3RlOwotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcbicpCi0gICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgPj0gYnVmZmVyX2xpbWl0KQotICAgIHsKLSAgICAgIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGlmIChidWZmZXJfbGltaXQgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgYXBwLmMgc2V0cyBhbnkgb3RoZXIgY2hhcmFjdGVycyB0byBMRVhfSVNfU1RSSU5HUVVPVEUsIHRoaXMKLSAgICAgY29kZSBuZWVkcyB0byBiZSBjaGFuZ2VkLiAgKi8KLSAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLSAgICBxdW90ZTEgPSAnIic7Ci0gIGVsc2UKLSAgICBxdW90ZTEgPSAnXDAnOwotCi0gIHF1b3RlMiA9ICdcMCc7Ci0gIGlmIChmbGFnX202OGtfbXJpKQotICAgIHF1b3RlMiA9ICdcJyc7Ci0jaWZkZWYgTEVYX0lTX1NUUklOR1FVT1RFCi0gIHF1b3RlMiA9ICdcJyc7Ci0jZW5kaWYKLQotICBpbnF1b3RlID0gJ1wwJzsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JIHx8IChpbnF1b3RlICE9ICdcMCcgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nKSkKLSAgICB7Ci0gICAgICBpZiAoaW5xdW90ZSA9PSAqaW5wdXRfbGluZV9wb2ludGVyKQotCWlucXVvdGUgPSAnXDAnOwotICAgICAgZWxzZSBpZiAoaW5xdW90ZSA9PSAnXDAnKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09IHF1b3RlMSkKLQkgICAgaW5xdW90ZSA9IHF1b3RlMTsKLQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gcXVvdGUyKQotCSAgICBpbnF1b3RlID0gcXVvdGUyOwotCX0KLSAgICAgIHNiX2FkZF9jaGFyIChsaW5lLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotICAgIH0KLSAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAotCSAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1xuJykKLQlidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBEZWZpbmUgYSBtYWNyby4gIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRvIG1hY3JvLmMsIHdoaWNoIGlzIHNoYXJlZAotICAgYmV0d2VlbiBnYXMgYW5kIGdhc3AuICAqLwotCi12b2lkCi1zX21hY3JvIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBzYiBzOwotICBzYiBsYWJlbDsKLSAgY29uc3QgY2hhciAqZXJyOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIHNiX25ldyAoJnMpOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgc2JfYWRkX2NoYXIgKCZzLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLSAgICBzYl9hZGRfc3RyaW5nICgmbGFiZWwsIFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKTsKLQotICBlcnIgPSBkZWZpbmVfbWFjcm8gKDAsICZzLCAmbGFiZWwsIGdldF9saW5lX3NiLCAmbmFtZSk7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsICIlcyIsIGVycik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCXsKLQkgIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHVuZGVmaW5lZF9zZWN0aW9uKTsKLQkgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCAwKTsKLQkgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQl9Ci0KLSAgICAgIGlmICgoKGZsYWdfbTY4a19tcmkKLSNpZmRlZiBOT19QU0VVRE9fRE9UCi0JICAgIHx8IDEKLSNlbmRpZgotCSAgICApCi0JICAgJiYgaGFzaF9maW5kIChwb19oYXNoLCBuYW1lKSAhPSBOVUxMKQotCSAgfHwgKCEgZmxhZ19tNjhrX21yaQotCSAgICAgICYmICpuYW1lID09ICcuJwotCSAgICAgICYmIGhhc2hfZmluZCAocG9faGFzaCwgbmFtZSArIDEpICE9IE5VTEwpKQotCWFzX3dhcm4gKF8oImF0dGVtcHQgdG8gcmVkZWZpbmUgcHNldWRvLW9wIGAlcycgaWdub3JlZCIpLAotCQkgbmFtZSk7Ci0gICAgfQotCi0gIHNiX2tpbGwgKCZzKTsKLX0KLQotLyogSGFuZGxlIHRoZSAubWV4aXQgcHNldWRvLW9wLCB3aGljaCBpbW1lZGlhdGVseSBleGl0cyBhIG1hY3JvCi0gICBleHBhbnNpb24uICAqLwotCi12b2lkCi1zX21leGl0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNvbmRfZXhpdF9tYWNybyAobWFjcm9fbmVzdCk7Ci0gIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0KLQotLyogU3dpdGNoIGluIGFuZCBvdXQgb2YgTVJJIG1vZGUuICAqLwotCi12b2lkCi1zX21yaSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgb24sIG9sZF9mbGFnOwotCi0gIG9uID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIG9sZF9mbGFnID0gZmxhZ19tcmk7Ci0gIGlmIChvbiAhPSAwKQotICAgIHsKLSAgICAgIGZsYWdfbXJpID0gMTsKLSNpZmRlZiBUQ19NNjhLCi0gICAgICBmbGFnX202OGtfbXJpID0gMTsKLSNlbmRpZgotICAgICAgbWFjcm9fbXJpX21vZGUgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZsYWdfbXJpID0gMDsKLSAgICAgIGZsYWdfbTY4a19tcmkgPSAwOwotICAgICAgbWFjcm9fbXJpX21vZGUgKDApOwotICAgIH0KLQotICAvKiBPcGVyYXRvciBwcmVjZWRlbmNlIGNoYW5nZXMgaW4gbTY4ayBNUkkgbW9kZSwgc28gd2UgbmVlZCB0bwotICAgICB1cGRhdGUgdGhlIG9wZXJhdG9yIHJhbmtpbmdzLiAgKi8KLSAgZXhwcl9zZXRfcHJlY2VkZW5jZSAoKTsKLQotI2lmZGVmIE1SSV9NT0RFX0NIQU5HRQotICBpZiAob24gIT0gb2xkX2ZsYWcpCi0gICAgTVJJX01PREVfQ0hBTkdFIChvbik7Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgY2hhbmdpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZG9fb3JnIChzZWdtZW50LCBleHAsIGZpbGwpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IGZpbGw7Ci17Ci0gIGlmIChzZWdtZW50ICE9IG5vd19zZWcgJiYgc2VnbWVudCAhPSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIGFzX2JhZCAoXygiaW52YWxpZCBzZWdtZW50IFwiJXNcIjsgc2VnbWVudCBcIiVzXCIgYXNzdW1lZCIpLAotCSAgICBzZWdtZW50X25hbWUgKHNlZ21lbnQpLCBzZWdtZW50X25hbWUgKG5vd19zZWcpKTsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChmaWxsICE9IDApCi0JYXNfd2FybiAoXygiaWdub3JpbmcgZmlsbCB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotICAgICAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIGFzX2JhZCAoXygib25seSBjb25zdGFudCBvZmZzZXRzIHN1cHBvcnRlZCBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotCSAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotCX0KLSAgICAgIGFic19zZWN0aW9uX29mZnNldCA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBleHAtPlhfYWRkX3N5bWJvbCwKLQkJICAgIGV4cC0+WF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgICpwID0gZmlsbDsKLSAgICB9Ci19Ci0KLXZvaWQgCi1zX29yZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBzZWdUIHNlZ21lbnQ7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIC8qIFRoZSBtNjhrIE1SSSBhc3NlbWJsZXIgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yIC5vcmcuICBJdAotICAgICBtZWFucyB0byBjcmVhdGUgYW4gYWJzb2x1dGUgc2VjdGlvbiBhdCBhIGdpdmVuIGFkZHJlc3MuICBXZSBjYW4ndAotICAgICBzdXBwb3J0IHRoYXQtLXVzZSBhIGxpbmtlciBzY3JpcHQgaW5zdGVhZC4gICovCi0gIGlmIChmbGFnX202OGtfbXJpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTVJJIHN0eWxlIE9SRyBwc2V1ZG8tb3Agbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERvbid0IGJlbGlldmUgdGhlIGRvY3VtZW50YXRpb24gb2YgQlNEIDQuMiBBUy4gIFRoZXJlIGlzIG5vIHN1Y2gKLSAgICAgdGhpbmcgYXMgYSBzdWItc2VnbWVudC1yZWxhdGl2ZSBvcmlnaW4uICBBbnkgYWJzb2x1dGUgb3JpZ2luIGlzCi0gICAgIGdpdmVuIGEgd2FybmluZywgdGhlbiBhc3N1bWVkIHRvIGJlIHNlZ21lbnQtcmVsYXRpdmUuICBBbnkKLSAgICAgc2VnbWVudGVkIG9yaWdpbiBleHByZXNzaW9uICgiZm9vKzQyIikgaGFkIGJldHRlciBiZSBpbiB0aGUgcmlnaHQKLSAgICAgc2VnbWVudCBvciB0aGUgLm9yZyBpcyBpZ25vcmVkLgotCi0gICAgIEJTRCA0LjIgQVMgd2FybnMgaWYgeW91IHRyeSB0byAub3JnIGJhY2t3YXJkcy4gV2UgY2Fubm90IGJlY2F1c2UKLSAgICAgd2UgbmV2ZXIga25vdyBzdWItc2VnbWVudCBzaXplcyB3aGVuIHdlIGFyZSByZWFkaW5nIGNvZGUuICBCU0QKLSAgICAgd2lsbCBjcmFzaCB0cnlpbmcgdG8gZW1pdCBuZWdhdGl2ZSBudW1iZXJzIG9mIGZpbGxlciBieXRlcyBpbgotICAgICBjZXJ0YWluIC5vcmdzLiBXZSBkb24ndCBjcmFzaCwgYnV0IHNlZSBhcy13cml0ZSBmb3IgdGhhdCBjb2RlLgotCi0gICAgIERvbid0IG1ha2UgZnJhZyBpZiBuZWVkX3Bhc3NfMj09MS4gICovCi0gIHNlZ21lbnQgPSBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZleHApOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZW1wX2ZpbGwgPSAwOwotCi0gIGlmICghbmVlZF9wYXNzXzIpCi0gICAgZG9fb3JnIChzZWdtZW50LCAmZXhwLCB0ZW1wX2ZpbGwpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfb3JnKCkgKi8KLQotLyogSGFuZGxlIHBhcnNpbmcgZm9yIHRoZSBNUkkgU0VDVC9TRUNUSU9OIHBzZXVkby1vcC4gIFRoaXMgc2hvdWxkIGJlCi0gICBjYWxsZWQgYnkgdGhlIG9iai1mb3JtYXQgcm91dGluZSB3aGljaCBoYW5kbGVzIHNlY3Rpb24gY2hhbmdpbmcKLSAgIHdoZW4gaW4gTVJJIG1vZGUuICBJdCB3aWxsIGNyZWF0ZSBhIG5ldyBzZWN0aW9uLCBhbmQgcmV0dXJuIGl0LiAgSXQKLSAgIHdpbGwgc2V0ICpUWVBFIHRvIHRoZSBzZWN0aW9uIHR5cGU6IG9uZSBvZiAnQycgKGNvZGUpLCAnRCcgKGRhdGEpLAotICAgJ00nIChtaXhlZCksIG9yICdSJyAocm9tYWJsZSkuICBJZiBCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQsIHRoZQotICAgZmxhZ3Mgd2lsbCBiZSBzZXQgaW4gdGhlIHNlY3Rpb24uICAqLwotCi12b2lkCi1zX21yaV9zZWN0ICh0eXBlKQotICAgICBjaGFyICp0eXBlOwotewotI2lmZGVmIFRDX002OEsKLQotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIHNlZ1Qgc2VnOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqbmFtZSkpCi0gICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbHNlCi0gICAgewotICAgICAgZG8KLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0gICAgfQotCi0gIG5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBzZWcgPSBzdWJzZWdfbmV3IChuYW1lLCAwKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW50IGFsaWduOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICByZWNvcmRfYWxpZ25tZW50IChzZWcsIGFsaWduKTsKLSAgICB9Ci0KLSAgKnR5cGUgPSAnQyc7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBjID0gKisraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjKTsKLSAgICAgIGlmIChjID09ICdDJyB8fCBjID09ICdEJyB8fCBjID09ICdNJyB8fCBjID09ICdSJykKLQkqdHlwZSA9IGM7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgc2VjdGlvbiB0eXBlIikpOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICB7Ci0JZmxhZ3dvcmQgZmxhZ3M7Ci0KLQlmbGFncyA9IFNFQ19OT19GTEFHUzsKLQlpZiAoKnR5cGUgPT0gJ0MnKQotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFOwotCWVsc2UgaWYgKCp0eXBlID09ICdEJyB8fCAqdHlwZSA9PSAnTScpCi0JICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEE7Ci0JZWxzZSBpZiAoKnR5cGUgPT0gJ1InKQotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX1JFQURPTkxZIHwgU0VDX1JPTTsKLQlpZiAoZmxhZ3MgIT0gU0VDX05PX0ZMQUdTKQotCSAgewotCSAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLCBmbGFncykpCi0JICAgICAgYXNfd2FybiAoXygiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIlc1wiOiAlcyIpLAotCQkgICAgICAgYmZkX3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBzZWcpLAotCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgfQotICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gIC8qIElnbm9yZSB0aGUgSFAgdHlwZS4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jZWxzZSAvKiAhIFRDX002OEsgKi8KLSNpZmRlZiBUQ19JOTYwCi0KLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzZWdUIHNlZzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBzZWcgPSBzdWJzZWdfbmV3IChuYW1lLCAwKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgKnR5cGUgPSAnQyc7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpzZWN0eXBlOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIHNlY3R5cGUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBpZiAoKnNlY3R5cGUgPT0gJ1wwJykKLQkqdHlwZSA9ICdDJzsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHNlY3R5cGUsICJ0ZXh0IikgPT0gMCkKLQkqdHlwZSA9ICdDJzsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHNlY3R5cGUsICJkYXRhIikgPT0gMCkKLQkqdHlwZSA9ICdEJzsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHNlY3R5cGUsICJyb21kYXRhIikgPT0gMCkKLQkqdHlwZSA9ICdSJzsKLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgc2VjdGlvbiB0eXBlIGAlcyciKSwgc2VjdHlwZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGNoYXIgKnNlY2NtZDsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzZWNjbWQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAoc2VjY21kLCAiYWJzb2x1dGUiKSA9PSAwKQotCXsKLQkgIGFzX2JhZCAoXygiYWJzb2x1dGUgc2VjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiKSk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc2VjY21kLCAiYWxpZ24iKSA9PSAwKQotCXsKLQkgIGludCBhbGlnbjsKLQotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgcmVjb3JkX2FsaWdubWVudCAoc2VnLCBhbGlnbik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX3dhcm4gKF8oInVucmVjb2duaXplZCBzZWN0aW9uIGNvbW1hbmQgYCVzJyIpLCBzZWNjbWQpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwkgIAotCi0jZWxzZSAvKiAhIFRDX0k5NjAgKi8KLSAgLyogVGhlIE1SSSBhc3NlbWJsZXIgc2VlbXMgdG8gdXNlIGRpZmZlcmVudCBmb3JtcyBvZiAuc2VjdCBmb3IKLSAgICAgZGlmZmVyZW50IHRhcmdldHMuICAqLwotICBhc19iYWQgKCJNUkkgbW9kZSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHRhcmdldCIpOwotICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotI2VuZGlmIC8qICEgVENfSTk2MCAqLwotI2VuZGlmIC8qICEgVENfTTY4SyAqLwotfQotCi0vKiBIYW5kbGUgdGhlIC5wcmludCBwc2V1ZG8tb3AuICAqLwotCi12b2lkCi1zX3ByaW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBsZW47Ci0KLSAgcyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLSAgcHJpbnRmICgiJXNcbiIsIHMpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5wdXJnZW0gcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19wdXJnZW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgY2hhciBjOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgZGVsZXRlX21hY3JvIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIC0taW5wdXRfbGluZV9wb2ludGVyOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5yZXB0IHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfcmVwdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgY291bnQ7Ci0gIHNiIG9uZTsKLSAgc2IgbWFueTsKLQotICBjb3VudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIHNiX25ldyAoJm9uZSk7Ci0gIGlmICghIGJ1ZmZlcl9hbmRfbmVzdCAoIlJFUFQiLCAiRU5EUiIsICZvbmUsIGdldF9saW5lX3NiKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInJlcHQgd2l0aG91dCBlbmRyIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzYl9uZXcgKCZtYW55KTsKLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHNiX2FkZF9zYiAoJm1hbnksICZvbmUpOwotCi0gIHNiX2tpbGwgKCZvbmUpOwotCi0gIGlucHV0X3NjcnViX2luY2x1ZGVfc2IgKCZtYW55LCBpbnB1dF9saW5lX3BvaW50ZXIpOwotICBzYl9raWxsICgmbWFueSk7Ci0gIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZXF1LCAuZXF1aXYgYW5kIC5zZXQgZGlyZWN0aXZlcy4gIElmIEVRVUlWIGlzIDEsIHRoZW4KLSAgIHRoaXMgaXMgLmVxdWl2LCBhbmQgaXQgaXMgYW4gZXJyb3IgaWYgdGhlIHN5bWJvbCBpcyBhbHJlYWR5Ci0gICBkZWZpbmVkLiAgKi8KLQotdm9pZCAKLXNfc2V0IChlcXVpdikKLSAgICAgaW50IGVxdWl2OwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGRlbGltOwotICByZWdpc3RlciBjaGFyICplbmRfbmFtZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAvKgotICAgKiBFc3BlY2lhbCBhcG9sb2dpZXMgZm9yIHRoZSByYW5kb20gbG9naWM6Ci0gICAqIHRoaXMganVzdCBncmV3LCBhbmQgY291bGQgYmUgcGFyc2VkIG11Y2ggbW9yZSBzaW1wbHkhCi0gICAqIERlYW4gaW4gaGFzdGUuCi0gICAqLwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBkZWxpbSA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbmRfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmVuZF9uYW1lID0gZGVsaW07Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKmVuZF9uYW1lID0gMDsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAqZW5kX25hbWUgPSAwOwotCi0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgLyogVHVybiAnLiA9IG11bWJsZScgaW50byBhIC5vcmcgbXVtYmxlICovCi0gICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnQ7Ci0gICAgICBleHByZXNzaW9uUyBleHA7Ci0KLSAgICAgIHNlZ21lbnQgPSBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZleHApOwotCi0gICAgICBpZiAoIW5lZWRfcGFzc18yKQotCWRvX29yZyAoc2VnbWVudCwgJmV4cCwgMCk7Ci0KLSAgICAgICplbmRfbmFtZSA9IGRlbGltOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpID09IE5VTEwKLSAgICAgICYmIChzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkpID09IE5VTEwpCi0gICAgewotI2lmbmRlZiBOT19MSVNUSU5HCi0gICAgICAvKiBXaGVuIGRvaW5nIHN5bWJvbCBsaXN0aW5ncywgcGxheSBnYW1lcyB3aXRoIGR1bW15IGZyYWdtZW50cyBsaXZpbmcKLQkgb3V0c2lkZSB0aGUgbm9ybWFsIGZyYWdtZW50IGNoYWluIHRvIHJlY29yZCB0aGUgZmlsZSBhbmQgbGluZSBpbmZvCi0gICAgICAgICBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCi0JewotCSAgZXh0ZXJuIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICpsaXN0aW5nX3RhaWw7Ci0JICBmcmFnUyAqZHVtbXlfZnJhZyA9IChmcmFnUyAqKSB4bWFsbG9jIChzaXplb2YoZnJhZ1MpKTsKLQkgIG1lbXNldCAoZHVtbXlfZnJhZywgMCwgc2l6ZW9mKGZyYWdTKSk7Ci0JICBkdW1teV9mcmFnLT5mcl90eXBlID0gcnNfZmlsbDsKLQkgIGR1bW15X2ZyYWctPmxpbmUgPSBsaXN0aW5nX3RhaWw7Ci0JICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sIDAsIGR1bW15X2ZyYWcpOwotCSAgZHVtbXlfZnJhZy0+ZnJfc3ltYm9sID0gc3ltYm9sUDsKLQl9Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCQkJICAgIAotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICAvKiAic2V0IiBzeW1ib2xzIGFyZSBsb2NhbCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gKi8KLSAgICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotICAgIH0JCQkJLyogbWFrZSBhIG5ldyBzeW1ib2wgKi8KLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLQotICAqZW5kX25hbWUgPSBkZWxpbTsKLQotICBpZiAoZXF1aXYKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotICAgIGFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotICBwc2V1ZG9fc2V0IChzeW1ib2xQKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19zZXQoKSAqLwotCi12b2lkIAotc19zcGFjZSAobXVsdCkKLSAgICAgaW50IG11bHQ7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgZXhwcmVzc2lvblMgdmFsOwotICBjaGFyICpwID0gMDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0gIGludCBieXRlczsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICAvKiBJbiBtNjhrIE1SSSBtb2RlLCB3ZSBuZWVkIHRvIGFsaWduIHRvIGEgd29yZCBib3VuZGFyeSwgdW5sZXNzCi0gICAgIHRoaXMgaXMgZHMuYi4gICovCi0gIGlmIChmbGFnX202OGtfbXJpICYmIG11bHQgPiAxKQotICAgIHsKLSAgICAgIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0JewotCSAgYWJzX3NlY3Rpb25fb2Zmc2V0ICs9IGFic19zZWN0aW9uX29mZnNldCAmIDE7Ci0JICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCSAgICBTX1NFVF9WQUxVRSAobGluZV9sYWJlbCwgYWJzX3NlY3Rpb25fb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotCXsKLQkgIHZhbHVlVCB2YWw7Ci0KLQkgIHZhbCA9IFNfR0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCk7Ci0JICBpZiAoKHZhbCAmIDEpICE9IDApCi0JICAgIHsKLQkgICAgICBTX1NFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wsIHZhbCArIDEpOwotCSAgICAgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JCXsKLQkJICBleHByZXNzaW9uUyAqc3ltZXhwOwotCi0JCSAgc3ltZXhwID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChsaW5lX2xhYmVsKTsKLQkJICBrbm93IChzeW1leHAtPlhfb3AgPT0gT19zeW1ib2wpOwotCQkgIGtub3cgKHN5bWV4cC0+WF9hZGRfc3ltYm9sID09IG1yaV9jb21tb25fc3ltYm9sKTsKLQkJICBzeW1leHAtPlhfYWRkX251bWJlciArPSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZG9fYWxpZ24gKDEsIChjaGFyICopIE5VTEwsIDAsIDApOwotCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgZnJhZ19ub3cpOwotCSAgICAgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCBmcmFnX25vd19maXggKCkpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBieXRlcyA9IG11bHQ7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBleHByZXNzaW9uICgmdmFsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICB2YWwuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0KLSAgaWYgKHZhbC5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IHZhbC5YX2FkZF9udW1iZXIgPCAtIDB4ODAKLSAgICAgIHx8IHZhbC5YX2FkZF9udW1iZXIgPiAweGZmCi0gICAgICB8fCAobXVsdCAhPSAwICYmIG11bHQgIT0gMSAmJiB2YWwuWF9hZGRfbnVtYmVyICE9IDApKQotICAgIHsKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgdmFyaWFibGUgc2l6ZSBvciBmaWxsIHZhbHVlIikpOwotICAgICAgZWxzZQotCXsKLQkgIG9mZnNldFQgaTsKLQotCSAgaWYgKG11bHQgPT0gMCkKLQkgICAgbXVsdCA9IDE7Ci0JICBieXRlcyA9IG11bHQgKiBleHAuWF9hZGRfbnVtYmVyOwotCSAgZm9yIChpID0gMDsgaSA8IGV4cC5YX2FkZF9udW1iZXI7IGkrKykKLQkgICAgZW1pdF9leHByICgmdmFsLCBtdWx0KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgbG9uZyByZXBlYXQ7Ci0KLQkgIHJlcGVhdCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICBpZiAobXVsdCkKLQkgICAgcmVwZWF0ICo9IG11bHQ7Ci0JICBieXRlcyA9IHJlcGVhdDsKLQkgIGlmIChyZXBlYXQgPD0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGZsYWdfbXJpKQotCQlhc193YXJuIChfKCIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIHplcm8sIGlnbm9yZWQiKSk7Ci0JICAgICAgZWxzZSBpZiAocmVwZWF0IDwgMCkKLQkJYXNfd2FybiAoXygiLnNwYWNlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZSwgaWdub3JlZCIpKTsKLQkgICAgICBnb3RvIGdldG91dDsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIGp1c3QgYnVtcCB0aGUgb2Zmc2V0LiAgKi8KLQkgIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBhYnNfc2VjdGlvbl9vZmZzZXQgKz0gcmVwZWF0OwotCSAgICAgIGdvdG8gZ2V0b3V0OwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBzZWNyZXRseSBpbiBhbiBNUkkgY29tbW9uIHNlY3Rpb24sIHRoZW4KLQkgICAgIGNyZWF0aW5nIHNwYWNlIGp1c3QgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBjb21tb24KLQkgICAgIHN5bWJvbC4gICovCi0JICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIFNfU0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCwKLQkJCSAgIFNfR0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCkgKyByZXBlYXQpOwotCSAgICAgIGdvdG8gZ2V0b3V0OwotCSAgICB9Ci0KLQkgIGlmICghbmVlZF9wYXNzXzIpCi0JICAgIHAgPSBmcmFnX3ZhciAocnNfZmlsbCwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgKHN5bWJvbFMgKikgMCwKLQkJCSAgKG9mZnNldFQpIHJlcGVhdCwgKGNoYXIgKikgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInNwYWNlIGFsbG9jYXRpb24gdG9vIGNvbXBsZXggaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLQkgICAgICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotCSAgICB9Ci0JICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBjb21tb24gc2VjdGlvbiIpKTsKLQkgICAgICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci0JICAgIH0KLQkgIGlmICghbmVlZF9wYXNzXzIpCi0JICAgIHAgPSBmcmFnX3ZhciAocnNfc3BhY2UsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsCi0JCQkgIG1ha2VfZXhwcl9zeW1ib2wgKCZleHApLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgMCk7Ci0JfQotCi0gICAgICBpZiAocCkKLQkqcCA9IHZhbC5YX2FkZF9udW1iZXI7Ci0gICAgfQotCi0gZ2V0b3V0OgotCi0gIC8qIEluIE1SSSBtb2RlLCBhZnRlciBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZSBtdXN0IGFsaWduIHRvIGFuCi0gICAgIGV2ZW4gd29yZCBib3VuZGFyeSwgdW5sZXNzIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgZGMuYiwgZHMuYgotICAgICBvciBkY2IuYi4gICovCi0gIGlmIChmbGFnX21yaSAmJiAoYnl0ZXMgJiAxKSAhPSAwKQotICAgIG1yaV9wZW5kaW5nX2FsaWduID0gMTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotLyogVGhpcyBpcyBsaWtlIHNfc3BhY2UsIGJ1dCB0aGUgdmFsdWUgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2l0aAotICAgdGhlIGdpdmVuIHByZWNpc2lvbi4gIFRoaXMgaXMgZm9yIHRoZSBNUkkgZGNiLnMgcHNldWRvLW9wIGFuZAotICAgZnJpZW5kcy4gICovCi0KLXZvaWQKLXNfZmxvYXRfc3BhY2UgKGZsb2F0X3R5cGUpCi0gICAgIGludCBmbG9hdF90eXBlOwotewotICBvZmZzZXRUIGNvdW50OwotICBpbnQgZmxlbjsKLSAgY2hhciB0ZW1wW01BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVF07Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgY291bnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmFsdWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKGZsYWdfbXJpKQotCW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogU2tpcCBhbnkgMHtsZXR0ZXJ9IHRoYXQgbWF5IGJlIHByZXNlbnQuICBEb24ndCBldmVuIGNoZWNrIGlmIHRoZQotICAgKiBsZXR0ZXIgaXMgbGVnYWwuICAqLwotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotICAgICAgJiYgaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclsxXSkpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgLyogQWNjZXB0IDp4eHh4LCB3aGVyZSB0aGUgeCdzIGFyZSBoZXggZGlnaXRzLCBmb3IgYSBmbG9hdGluZyBwb2ludAotICAgICB3aXRoIHRoZSBleGFjdCBkaWdpdHMgc3BlY2lmaWVkLiAgKi8KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnOicpCi0gICAgewotICAgICAgZmxlbiA9IGhleF9mbG9hdCAoZmxvYXRfdHlwZSwgdGVtcCk7Ci0gICAgICBpZiAoZmxlbiA8IDApCi0JewotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIGlmIChmbGFnX21yaSkKLQkgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmVycjsKLQotICAgICAgZXJyID0gbWRfYXRvZiAoZmxvYXRfdHlwZSwgdGVtcCwgJmZsZW4pOwotICAgICAga25vdyAoZmxlbiA8PSBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQpOwotICAgICAga25vdyAoZmxlbiA+IDApOwotICAgICAgaWYgKGVycikKLQl7Ci0JICBhc19iYWQgKF8oIkJhZCBmbG9hdGluZyBsaXRlcmFsOiAlcyIpLCBlcnIpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIGlmIChmbGFnX21yaSkKLQkgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICB3aGlsZSAoLS1jb3VudCA+PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHAgPSBmcmFnX21vcmUgKGZsZW4pOwotICAgICAgbWVtY3B5IChwLCB0ZW1wLCAodW5zaWduZWQgaW50KSBmbGVuKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnN0cnVjdCBwc2V1ZG8tb3AsIGFzIGZvdW5kIGluIE1JUFMgYXNzZW1ibGVycy4gICovCi0KLXZvaWQKLXNfc3RydWN0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0gIGFic19zZWN0aW9uX29mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChhYnNvbHV0ZV9zZWN0aW9uLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi12b2lkCi1zX3RleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSNpZmRlZiBPQkpfVk1TCi0gIGNvbnN0X2ZsYWcgJj0gfklOX0RFRkFVTFRfU0VDVElPTjsKLSNlbmRpZgotfQkJCQkvKiBzX3RleHQoKSAqLwotDAotCi12b2lkIAotZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKQotewotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIC8qIFJldHVybiBoYXZpbmcgYWxyZWFkeSBzd2FsbG93ZWQgZW5kLW9mLWxpbmUuICovCi19CQkJCS8qIFJldHVybiBwb2ludGluZyBqdXN0IGFmdGVyIGVuZC1vZi1saW5lLiAqLwotCi12b2lkCi1pZ25vcmVfcmVzdF9vZl9saW5lICgpCQkvKiBGb3Igc3VzcGVjdCBsaW5lczogZ2l2ZXMgd2FybmluZy4gKi8KLXsKLSAgaWYgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQlhc19iYWQgKF8oIlJlc3Qgb2YgbGluZSBpZ25vcmVkLiBGaXJzdCBpZ25vcmVkIGNoYXJhY3RlciBpcyBgJWMnLiIpLAotCQkqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIlJlc3Qgb2YgbGluZSBpZ25vcmVkLiBGaXJzdCBpZ25vcmVkIGNoYXJhY3RlciB2YWx1ZWQgMHgleC4iKSwKLQkJKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICB3aGlsZSAoaW5wdXRfbGluZV9wb2ludGVyIDwgYnVmZmVyX2xpbWl0Ci0JICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCX0KLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogUmV0dXJuIHBvaW50aW5nIGp1c3QgYWZ0ZXIgZW5kLW9mLWxpbmUuICovCi0gIGtub3cgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdXSk7Ci19Ci0KLXZvaWQKLWRpc2NhcmRfcmVzdF9vZl9saW5lICgpCi17Ci0gIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQKLSAgICAgICAgICYmICFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsgICAgICAgICAvKiBSZXR1cm4gcG9pbnRpbmcganVzdCBhZnRlciBlbmQtb2YtbGluZS4gKi8KLSAga25vdyAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKTsKLX0KLQotLyoKLSAqCQkJcHNldWRvX3NldCgpCi0gKgotICogSW46CVBvaW50ZXIgdG8gYSBzeW1ib2wuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPmV4cHJlc3Npb24uCi0gKgotICogT3V0OglJbnB1dF9saW5lX3BvaW50ZXItPmp1c3QgYWZ0ZXIgYW55IHdoaXRlc3BhY2UgYWZ0ZXIgZXhwcmVzc2lvbi4KLSAqCVRyaWVkIHRvIHNldCBzeW1ib2wgdG8gdmFsdWUgb2YgZXhwcmVzc2lvbi4KLSAqCVdpbGwgY2hhbmdlIHN5bWJvbHMgdHlwZSwgdmFsdWUsIGFuZCBmcmFnOwotICovCi12b2lkCi1wc2V1ZG9fc2V0IChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBleHByZXNzaW9uUyBleHA7Ci0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgaW50IGV4dDsKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0gIGtub3cgKHN5bWJvbFApOwkJLyogTlVMTCBwb2ludGVyIGlzIGxvZ2ljIGVycm9yLiAqLwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGV4dCA9IFNfSVNfRVhURVJOQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSAgKHZvaWQpIGV4cHJlc3Npb24gKCZleHApOwotCi0gIGlmIChleHAuWF9vcCA9PSBPX2lsbGVnYWwpCi0gICAgYXNfYmFkIChfKCJpbGxlZ2FsIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIpKTsKLSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIpKTsKLSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgfQotICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX3N1YnRyYWN0Ci0JICAgJiYgKFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpCi0JICAgICAgID09IFNfR0VUX1NFR01FTlQgKGV4cC5YX29wX3N5bWJvbCkpCi0JICAgJiYgU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkpCi0JICAgJiYgKHN5bWJvbF9nZXRfZnJhZyAoZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgICAgPT0gc3ltYm9sX2dldF9mcmFnIChleHAuWF9vcF9zeW1ib2wpKSkKLSAgICB7Ci0gICAgICBleHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gKFNfR0VUX1ZBTFVFIChleHAuWF9hZGRfc3ltYm9sKQotCQkJICAtIFNfR0VUX1ZBTFVFIChleHAuWF9vcF9zeW1ib2wpKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChleHAuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICBjYXNlIE9fYmlnOgotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGFic29sdXRlX3NlY3Rpb24pOwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gICAgICBpZiAoZXh0KQotCVNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIGVsc2UKLQlTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3JlZ2lzdGVyOgotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgcmVnX3NlY3Rpb24pOwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uCi0JICB8fCBleHAuWF9hZGRfbnVtYmVyICE9IDApCi0Jc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQLCAmZXhwKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzID0gZXhwLlhfYWRkX3N5bWJvbDsKLQotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU19HRVRfU0VHTUVOVCAocykpOwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0JICBpZiAoZXh0KQotCSAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBlbHNlCi0JICAgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwKLQkJICAgICAgIGV4cC5YX2FkZF9udW1iZXIgKyBTX0dFVF9WQUxVRSAocykpOwotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBzeW1ib2xfZ2V0X2ZyYWcgKHMpKTsKLQkgIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgKHN5bWJvbFAsIHMpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBzb21lIGNvbXBsZXggZXhwcmVzc2lvbi4KLQkgRklYTUU6IFNob3VsZCB3ZSBzZXQgdGhlIHNlZ21lbnQgdG8gYW55dGhpbmc/ICAqLwotICAgICAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQLCAmZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qCi0gKgkJCWNvbnMoKQotICoKLSAqIENPTlN0cnVjdCBtb3JlIGZyYWcgb2YgLmJ5dGVzLCBvciAud29yZHMgZXRjLgotICogU2hvdWxkIG5lZWRfcGFzc18yIGJlIDEgdGhlbiBlbWl0IG5vIGZyYWcocykuCi0gKiBUaGlzIHVuZGVyc3RhbmRzIEVYUFJFU1NJT05TLgotICoKLSAqIEJ1ZyAoPykKLSAqCi0gKiBUaGlzIGhhcyBhIHNwbGl0IHBlcnNvbmFsaXR5LiBXZSB1c2UgZXhwcmVzc2lvbigpIHRvIHJlYWQgdGhlCi0gKiB2YWx1ZS4gV2UgY2FuIGRldGVjdCBpZiB0aGUgdmFsdWUgd29uJ3QgZml0IGluIGEgYnl0ZSBvciB3b3JkLgotICogQnV0IHdlIGNhbid0IGRldGVjdCBpZiBleHByZXNzaW9uKCkgZGlzY2FyZGVkIHNpZ25pZmljYW50IGRpZ2l0cwotICogaW4gdGhlIGNhc2Ugb2YgYSBsb25nLiBOb3Qgd29ydGggdGhlIGNyb2NrcyByZXF1aXJlZCB0byBmaXggaXQuCi0gKi8KLQotLyogU2VsZWN0IGEgcGFyc2VyIGZvciBjb25zIGV4cHJlc3Npb25zLiAgKi8KLQotLyogU29tZSB0YXJnZXRzIG5lZWQgdG8gcGFyc2UgdGhlIGV4cHJlc3Npb24gaW4gdmFyaW91cyBmYW5jeSB3YXlzLgotICAgWW91IGNhbiBkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OIHRvIGRvIHdoYXRldmVyIHlvdSBsaWtlCi0gICAoZm9yIGV4YW1wbGUsIHRoZSBIUFBBIGRvZXMgdGhpcykuICBPdGhlcndpc2UsIHlvdSBjYW4gZGVmaW5lCi0gICBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TIHRvIHBlcm1pdCBiaXRmaWVsZHMgdG8gYmUgc3BlY2lmaWVkLCBvcgotICAgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMgdG8gcGVybWl0IHJlcGVhdCBjb3VudHMuICBJZiBub25lIG9mIHRoZXNlCi0gICBhcmUgZGVmaW5lZCwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlLCB0aGVuIG9ubHkgc2ltcGxlIGV4cHJlc3Npb25zCi0gICBhcmUgcGVybWl0dGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX21yaV9jb25zIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHAsIHVuc2lnbmVkIGludCBuYnl0ZXMpKTsKLQotI2lmbmRlZiBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLSNpZmRlZiBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgcGFyc2VfYml0ZmllbGRfY29ucyAoRVhQLCBOQllURVMpCi1zdGF0aWMgdm9pZCAKLXBhcnNlX2JpdGZpZWxkX2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotI2VuZGlmCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBwYXJzZV9yZXBlYXRfY29ucyAoRVhQLCBOQllURVMpCi1zdGF0aWMgdm9pZAotcGFyc2VfcmVwZWF0X2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotI2VuZGlmCi0KLS8qIElmIHdlIGhhdmVuJ3QgZ290dGVuIG9uZSB5ZXQsIGp1c3QgY2FsbCBleHByZXNzaW9uLiAgKi8KLSNpZm5kZWYgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgZXhwcmVzc2lvbiAoRVhQKQotI2VuZGlmCi0jZW5kaWYKLQotLyogd29ya2VyIHRvIGRvIC5ieXRlIGV0YyBzdGF0ZW1lbnRzICovCi0vKiBjbG9iYmVycyBpbnB1dF9saW5lX3BvaW50ZXIsIGNoZWNrcyAqLwotLyogZW5kLW9mLWxpbmUuICovCi1zdGF0aWMgdm9pZCAKLWNvbnNfd29ya2VyIChuYnl0ZXMsIHJ2YSkKLSAgICAgcmVnaXN0ZXIgaW50IG5ieXRlczsJLyogMT0uYnl0ZSwgMj0ud29yZCwgND0ubG9uZyAqLwotICAgICBpbnQgcnZhOwotewotICBpbnQgYzsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKGZsYWdfbXJpKQotCW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2NvbnNfYWxpZ24KLSAgbWRfY29uc19hbGlnbiAobmJ5dGVzKTsKLSNlbmRpZgotCi0gIGMgPSAwOwotICBkbwotICAgIHsKLSAgICAgIGlmIChmbGFnX202OGtfbXJpKQotCXBhcnNlX21yaV9jb25zICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgICAgZWxzZQotCVRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiAoJmV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLQotICAgICAgaWYgKHJ2YSkKLQl7Ci0JICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wpCi0JICAgIGV4cC5YX29wID0gT19zeW1ib2xfcnZhOwotCSAgZWxzZQotCSAgICBhc19mYXRhbCAoXygicnZhIHdpdGhvdXQgc3ltYm9sIikpOwotCX0KLSAgICAgIGVtaXRfZXhwciAoJmV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLSAgICAgICsrYzsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAvKiBJbiBNUkkgbW9kZSwgYWZ0ZXIgYW4gb2RkIG51bWJlciBvZiBieXRlcywgd2UgbXVzdCBhbGlnbiB0byBhbgotICAgICBldmVuIHdvcmQgYm91bmRhcnksIHVubGVzcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhIGRjLmIsIGRzLmIKLSAgICAgb3IgZGNiLmIuICAqLwotICBpZiAoZmxhZ19tcmkgJiYgbmJ5dGVzID09IDEgJiYgKGMgJiAxKSAhPSAwKQotICAgIG1yaV9wZW5kaW5nX2FsaWduID0gMTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLQotdm9pZAotY29ucyAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNvbnNfd29ya2VyIChzaXplLCAwKTsKLX0KLQotdm9pZCAKLXNfcnZhIChzaXplKQotICAgICBpbnQgc2l6ZTsKLXsKLSAgY29uc193b3JrZXIgKHNpemUsIDEpOwotfQotCi0vKiBQdXQgdGhlIGNvbnRlbnRzIG9mIGV4cHJlc3Npb24gRVhQIGludG8gdGhlIG9iamVjdCBmaWxlIHVzaW5nCi0gICBOQllURVMgYnl0ZXMuICBJZiBuZWVkX3Bhc3NfMiBpcyAxLCB0aGlzIGRvZXMgbm90aGluZy4gICovCi0KLXZvaWQKLWVtaXRfZXhwciAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci17Ci0gIG9wZXJhdG9yVCBvcDsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgdmFsdWVUIGV4dHJhX2RpZ2l0ID0gMDsKLQotICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbm90aGVyIHBhc3MuICAqLwotICBpZiAobmVlZF9wYXNzXzIpCi0gICAgcmV0dXJuOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFdoZW4gZ2NjIGVtaXRzIERXQVJGIDEgZGVidWdnaW5nIHBzZXVkby1vcHMsIGEgbGluZSBudW1iZXIgd2lsbAotICAgICBhcHBlYXIgYXMgYSBmb3VyIGJ5dGUgcG9zaXRpdmUgY29uc3RhbnQgaW4gdGhlIC5saW5lIHNlY3Rpb24sCi0gICAgIGZvbGxvd2VkIGJ5IGEgMiBieXRlIDB4ZmZmZi4gIExvb2sgZm9yIHRoYXQgY2FzZSBoZXJlLiAgKi8KLSAgewotICAgIHN0YXRpYyBpbnQgZHdhcmZfbGluZSA9IC0xOwotCi0gICAgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5saW5lIikgIT0gMCkKLSAgICAgIGR3YXJmX2xpbmUgPSAtMTsKLSAgICBlbHNlIGlmIChkd2FyZl9saW5lID49IDAKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgKGV4cC0+WF9hZGRfbnVtYmVyID09IC0xIHx8IGV4cC0+WF9hZGRfbnVtYmVyID09IDB4ZmZmZikpCi0gICAgICBsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBkd2FyZl9saW5lKTsKLSAgICBlbHNlIGlmIChuYnl0ZXMgPT0gNAotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID49IDApCi0gICAgICBkd2FyZl9saW5lID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgZWxzZQotICAgICAgZHdhcmZfbGluZSA9IC0xOwotICB9Ci0KLSAgLyogV2hlbiBnY2MgZW1pdHMgRFdBUkYgMSBkZWJ1Z2dpbmcgcHNldWRvLW9wcywgYSBmaWxlIG5hbWUgd2lsbAotICAgICBhcHBlYXIgYXMgYSAyIGJ5dGUgVEFHX2NvbXBpbGVfdW5pdCAoMHgxMSkgZm9sbG93ZWQgYnkgYSAyIGJ5dGUKLSAgICAgQVRfc2libGluZyAoMHgxMikgZm9sbG93ZWQgYnkgYSBmb3VyIGJ5dGUgYWRkcmVzcyBvZiB0aGUgc2libGluZwotICAgICBmb2xsb3dlZCBieSBhIDIgYnl0ZSBBVF9uYW1lICgweDM4KSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUKLSAgICAgZmlsZS4gIFdlIGxvb2sgZm9yIHRoYXQgY2FzZSBoZXJlLiAgKi8KLSAgewotICAgIHN0YXRpYyBpbnQgZHdhcmZfZmlsZSA9IDA7Ci0KLSAgICBpZiAoc3RyY21wIChzZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmRlYnVnIikgIT0gMCkKLSAgICAgIGR3YXJmX2ZpbGUgPSAwOwotICAgIGVsc2UgaWYgKGR3YXJmX2ZpbGUgPT0gMAotCSAgICAgJiYgbmJ5dGVzID09IDIKLQkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAweDExKQotICAgICAgZHdhcmZfZmlsZSA9IDE7Ci0gICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAxCi0JICAgICAmJiBuYnl0ZXMgPT0gMgotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDB4MTIpCi0gICAgICBkd2FyZl9maWxlID0gMjsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDIKLQkgICAgICYmIG5ieXRlcyA9PSA0KQotICAgICAgZHdhcmZfZmlsZSA9IDM7Ci0gICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAzCi0JICAgICAmJiBuYnl0ZXMgPT0gMgotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDB4MzgpCi0gICAgICBkd2FyZl9maWxlID0gNDsKLSAgICBlbHNlCi0gICAgICBkd2FyZl9maWxlID0gMDsKLQotICAgIC8qIFRoZSB2YXJpYWJsZSBkd2FyZl9maWxlX3N0cmluZyB0ZWxscyBzdHJpbmdlciB0aGF0IHRoZSBzdHJpbmcKLSAgICAgICBtYXkgYmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLiAgKi8KLSAgICBpZiAoZHdhcmZfZmlsZSA9PSA0KQotICAgICAgZHdhcmZfZmlsZV9zdHJpbmcgPSAxOwotICAgIGVsc2UKLSAgICAgIGR3YXJmX2ZpbGVfc3RyaW5nID0gMDsKLSAgfQotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoY2hlY2tfZWhfZnJhbWUgKGV4cCwgJm5ieXRlcykpCi0gICAgcmV0dXJuOwotCi0gIG9wID0gZXhwLT5YX29wOwotCi0gIC8qIEFsbG93IGAud29yZCAwJyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKG9wICE9IE9fY29uc3RhbnQgfHwgZXhwLT5YX2FkZF9udW1iZXIgIT0gMCkKLQlhc19iYWQgKF8oImF0dGVtcHQgdG8gc3RvcmUgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLSAgICAgIGFic19zZWN0aW9uX29mZnNldCArPSBuYnl0ZXM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBhIG5lZ2F0aXZlIGJpZ251bS4gICovCi0gIGlmIChvcCA9PSBPX3VtaW51cwotICAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMAotICAgICAgJiYgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCktPlhfb3AgPT0gT19iaWcKLSAgICAgICYmIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZXhwLT5YX2FkZF9zeW1ib2wpLT5YX2FkZF9udW1iZXIgPiAwKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotICAgICAgZXhwID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCk7Ci0KLSAgICAgIC8qIE5lZ2F0ZSB0aGUgYmlnbnVtOiBvbmUncyBjb21wbGVtZW50IGVhY2ggZGlnaXQgYW5kIGFkZCAxLiAgKi8KLSAgICAgIGNhcnJ5ID0gMTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBleHAtPlhfYWRkX251bWJlcjsgaSsrKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgbmV4dDsKLQotCSAgbmV4dCA9ICgoKH4gKGdlbmVyaWNfYmlnbnVtW2ldICYgTElUVExFTlVNX01BU0spKQotCQkgICAmIExJVFRMRU5VTV9NQVNLKQotCQkgICsgY2FycnkpOwotCSAgZ2VuZXJpY19iaWdudW1baV0gPSBuZXh0ICYgTElUVExFTlVNX01BU0s7Ci0JICBjYXJyeSA9IG5leHQgPj4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCX0KLQotICAgICAgLyogV2UgY2FuIGlnbm9yZSBhbnkgY2Fycnkgb3V0LCBiZWNhdXNlIGl0IHdpbGwgYmUgaGFuZGxlZCBieQotCSBleHRyYV9kaWdpdCBpZiBpdCBpcyBuZWVkZWQuICAqLwotCi0gICAgICBleHRyYV9kaWdpdCA9ICh2YWx1ZVQpIC0xOwotICAgICAgb3AgPSBPX2JpZzsKLSAgICB9Ci0KLSAgaWYgKG9wID09IE9fYWJzZW50IHx8IG9wID09IE9faWxsZWdhbCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJ6ZXJvIGFzc3VtZWQgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnICYmIGV4cC0+WF9hZGRfbnVtYmVyIDw9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19yZWdpc3RlcikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJyZWdpc3RlciB2YWx1ZSB1c2VkIGFzIGV4cHJlc3Npb24iKSk7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotCi0gIHAgPSBmcmFnX21vcmUgKChpbnQpIG5ieXRlcyk7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICAvKiBJZiB3ZSBoYXZlIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIGEgd29yZCwgc2F2ZSBpdCBvbgotICAgICB0aGUgYnJva2VuX3dvcmRzIGxpc3QuICBTZWUgdGhlIGNvZGUgaW4gd3JpdGUuYy4gICovCi0gIGlmIChvcCA9PSBPX3N1YnRyYWN0ICYmIG5ieXRlcyA9PSAyKQotICAgIHsKLSAgICAgIHN0cnVjdCBicm9rZW5fd29yZCAqeDsKLQotICAgICAgeCA9IChzdHJ1Y3QgYnJva2VuX3dvcmQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYnJva2VuX3dvcmQpKTsKLSAgICAgIHgtPm5leHRfYnJva2VuX3dvcmQgPSBicm9rZW5fd29yZHM7Ci0gICAgICBicm9rZW5fd29yZHMgPSB4OwotICAgICAgeC0+c2VnID0gbm93X3NlZzsKLSAgICAgIHgtPnN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICB4LT5mcmFnID0gZnJhZ19ub3c7Ci0gICAgICB4LT53b3JkX2dvZXNfaGVyZSA9IHA7Ci0gICAgICB4LT5kaXNwZnJhZyA9IDA7Ci0gICAgICB4LT5hZGQgPSBleHAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIHgtPnN1YiA9IGV4cC0+WF9vcF9zeW1ib2w7Ci0gICAgICB4LT5hZGRudW0gPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIHgtPmFkZGVkID0gMDsKLSAgICAgIG5ld19icm9rZW5fd29yZHMrKzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJZiB3ZSBoYXZlIGFuIGludGVnZXIsIGJ1dCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGlzIHRvbyBsYXJnZSB0bwotICAgICBwYXNzIHRvIG1kX251bWJlcl90b19jaGFycywgaGFuZGxlIGl0IGFzIGEgYmlnbnVtLiAgKi8KLSAgaWYgKG9wID09IE9fY29uc3RhbnQgJiYgbmJ5dGVzID4gc2l6ZW9mICh2YWx1ZVQpKQotICAgIHsKLSAgICAgIHZhbHVlVCB2YWw7Ci0gICAgICBpbnQgZ2VuY250OwotCi0gICAgICBpZiAoISBleHAtPlhfdW5zaWduZWQgJiYgZXhwLT5YX2FkZF9udW1iZXIgPCAwKQotCWV4dHJhX2RpZ2l0ID0gKHZhbHVlVCkgLTE7Ci0gICAgICB2YWwgPSAodmFsdWVUKSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIGdlbmNudCA9IDA7Ci0gICAgICBkbwotCXsKLQkgIGdlbmVyaWNfYmlnbnVtW2dlbmNudF0gPSB2YWwgJiBMSVRUTEVOVU1fTUFTSzsKLQkgIHZhbCA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgKytnZW5jbnQ7Ci0JfQotICAgICAgd2hpbGUgKHZhbCAhPSAwKTsKLSAgICAgIG9wID0gZXhwLT5YX29wID0gT19iaWc7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IGdlbmNudDsKLSAgICB9Ci0KLSAgaWYgKG9wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgdmFsdWVUIGdldDsKLSAgICAgIHJlZ2lzdGVyIHZhbHVlVCB1c2U7Ci0gICAgICByZWdpc3RlciB2YWx1ZVQgbWFzazsKLSAgICAgIHZhbHVlVCBoaWJpdDsKLSAgICAgIHJlZ2lzdGVyIHZhbHVlVCB1bm1hc2s7Ci0KLSAgICAgIC8qIEpGIDw8IG9mID49IG51bWJlciBvZiBiaXRzIGluIHRoZSBvYmplY3QgaXMgdW5kZWZpbmVkLiAgSW4KLQkgcGFydGljdWxhciBTUEFSQyAoU3VuIDQpIGhhcyBwcm9ibGVtcyAqLwotICAgICAgaWYgKG5ieXRlcyA+PSBzaXplb2YgKHZhbHVlVCkpCi0JewotCSAgbWFzayA9IDA7Ci0JICBpZiAobmJ5dGVzID4gc2l6ZW9mICh2YWx1ZVQpKQotCSAgICBoaWJpdCA9IDA7Ci0JICBlbHNlCi0JICAgIGhpYml0ID0gKHZhbHVlVCkgMSA8PCAobmJ5dGVzICogQklUU19QRVJfQ0hBUiAtIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEb24ndCBzdG9yZSB0aGVzZSBiaXRzLiAqLwotCSAgbWFzayA9IH4odmFsdWVUKSAwIDw8IChCSVRTX1BFUl9DSEFSICogbmJ5dGVzKTsKLQkgIGhpYml0ID0gKHZhbHVlVCkgMSA8PCAobmJ5dGVzICogQklUU19QRVJfQ0hBUiAtIDEpOwotCX0KLQotICAgICAgdW5tYXNrID0gfm1hc2s7CQkvKiBEbyBzdG9yZSB0aGVzZSBiaXRzLiAqLwotCi0jaWZkZWYgTkVWRVIKLSAgICAgICJEbyB0aGlzIG1vZCBpZiB5b3Ugd2FudCBldmVyeSBvdmVyZmxvdyBjaGVjayB0byBhc3N1bWUgU0lHTkVEIDIncyBjb21wbGVtZW50IGRhdGEuIjsKLSAgICAgIG1hc2sgPSB+KHVubWFzayA+PiAxKTsJLyogSW5jbHVkZXMgc2lnbiBiaXQgbm93LiAqLwotI2VuZGlmCi0KLSAgICAgIGdldCA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgdXNlID0gZ2V0ICYgdW5tYXNrOwotICAgICAgaWYgKChnZXQgJiBtYXNrKSAhPSAwCi0JICAmJiAoKGdldCAmIG1hc2spICE9IG1hc2sKLQkgICAgICB8fCAoZ2V0ICYgaGliaXQpID09IDApKQotCXsJCS8qIExlYWRpbmcgYml0cyBjb250YWluIGJvdGggMHMgJiAxcy4gKi8KLQkgIGFzX3dhcm4gKF8oIlZhbHVlIDB4JWx4IHRydW5jYXRlZCB0byAweCVseC4iKSwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIGdldCwgKHVuc2lnbmVkIGxvbmcpIHVzZSk7Ci0JfQotICAgICAgLyogcHV0IGJ5dGVzIGluIHJpZ2h0IG9yZGVyLiAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB1c2UsIChpbnQpIG5ieXRlcyk7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgIExJVFRMRU5VTV9UWVBFICpudW1zOwotCi0gICAgICBrbm93IChuYnl0ZXMgJSBDSEFSU19QRVJfTElUVExFTlVNID09IDApOwotCi0gICAgICBzaXplID0gZXhwLT5YX2FkZF9udW1iZXIgKiBDSEFSU19QRVJfTElUVExFTlVNOwotICAgICAgaWYgKG5ieXRlcyA8IHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiQmlnbnVtIHRydW5jYXRlZCB0byAlZCBieXRlcyIpLCBuYnl0ZXMpOwotCSAgc2l6ZSA9IG5ieXRlczsKLQl9Ci0KLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQl7Ci0JICB3aGlsZSAobmJ5dGVzID4gc2l6ZSkKLQkgICAgewotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgZXh0cmFfZGlnaXQsIENIQVJTX1BFUl9MSVRUTEVOVU0pOwotCSAgICAgIG5ieXRlcyAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCi0JICBudW1zID0gZ2VuZXJpY19iaWdudW0gKyBzaXplIC8gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgIHdoaWxlIChzaXplID4gMCkKLQkgICAgewotCSAgICAgIC0tbnVtczsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpICpudW1zLCBDSEFSU19QRVJfTElUVExFTlVNKTsKLQkgICAgICBzaXplIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgcCArPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG51bXMgPSBnZW5lcmljX2JpZ251bTsKLQkgIHdoaWxlIChzaXplID4gMCkKLQkgICAgewotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgKm51bXMsIENIQVJTX1BFUl9MSVRUTEVOVU0pOwotCSAgICAgICsrbnVtczsKLQkgICAgICBzaXplIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgcCArPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIG5ieXRlcyAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICB9Ci0KLQkgIHdoaWxlIChuYnl0ZXMgPiAwKQotCSAgICB7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBleHRyYV9kaWdpdCwgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7Ci0JICAgICAgbmJ5dGVzIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgcCArPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1lbXNldCAocCwgMCwgbmJ5dGVzKTsKLQotICAgICAgLyogTm93IHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXhTIHRvIHJlY29yZCB0aGUgc3ltYm9sIHZhbHVlLgotCSBUaGlzIGlzIGVhc3kgZm9yIEJGRC4gIEZvciBvdGhlciB0YXJnZXRzIGl0IGNhbiBiZSBtb3JlCi0JIGNvbXBsZXguICBGb3IgdmVyeSBjb21wbGV4IGNhc2VzIChjdXJyZW50bHksIHRoZSBIUFBBIGFuZAotCSBOUzMySyksIHlvdSBjYW4gZGVmaW5lIFRDX0NPTlNfRklYX05FVyB0byBkbyB3aGF0ZXZlciB5b3UKLQkgd2FudC4gIEZvciBzaW1wbGVyIGNhc2VzLCB5b3UgY2FuIGRlZmluZSBUQ19DT05TX1JFTE9DIHRvIGJlCi0JIHRoZSBuYW1lIG9mIHRoZSByZWxvYyBjb2RlIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgZml4Uy4KLQkgSWYgbmVpdGhlciBpcyBkZWZpbmVkLCB0aGUgY29kZSB1c2VzIE5PX1JFTE9DIGlmIGl0IGlzCi0JIGRlZmluZWQsIGFuZCBvdGhlcndpc2UgdXNlcyAwLiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBUQ19DT05TX0ZJWF9ORVcKLSAgICAgIFRDX0NPTlNfRklYX05FVyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgbmJ5dGVzLCBleHApOwotI2Vsc2UKLSAgICAgIHsKLQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLQotCXN3aXRjaCAobmJ5dGVzKQotCSAgewotCSAgY2FzZSAxOgotCSAgICByID0gQkZEX1JFTE9DXzg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICByID0gQkZEX1JFTE9DXzE2OwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgciA9IEJGRF9SRUxPQ18zMjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDg6Ci0JICAgIHIgPSBCRkRfUkVMT0NfNjQ7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgYXNfYmFkIChfKCJ1bnN1cHBvcnRlZCBCRkQgcmVsb2NhdGlvbiBzaXplICV1IiksIG5ieXRlcyk7Ci0JICAgIHIgPSBCRkRfUkVMT0NfMzI7Ci0JICAgIGJyZWFrOwotCSAgfQotCWZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAoaW50KSBuYnl0ZXMsIGV4cCwKLQkJICAgICAwLCByKTsKLSAgICAgIH0KLSNlbmRpZgotI2Vsc2UKLSNpZmRlZiBUQ19DT05TX0ZJWF9ORVcKLSAgICAgIFRDX0NPTlNfRklYX05FVyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgbmJ5dGVzLCBleHApOwotI2Vsc2UKLSAgICAgIC8qIEZpZ3VyZSBvdXQgd2hpY2ggcmVsb2MgbnVtYmVyIHRvIHVzZS4gIFVzZSBUQ19DT05TX1JFTE9DIGlmCi0JIGl0IGlzIGRlZmluZWQsIG90aGVyd2lzZSB1c2UgTk9fUkVMT0MgaWYgaXQgaXMgZGVmaW5lZCwKLQkgb3RoZXJ3aXNlIHVzZSAwLiAgKi8KLSNpZm5kZWYgVENfQ09OU19SRUxPQwotI2lmZGVmIE5PX1JFTE9DCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgTk9fUkVMT0MKLSNlbHNlCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgMAotI2VuZGlmCi0jZW5kaWYKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAoaW50KSBuYnl0ZXMsIGV4cCwgMCwKLQkJICAgVENfQ09OU19SRUxPQyk7Ci0jZW5kaWYgLyogVENfQ09OU19GSVhfTkVXICovCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotICAgIH0KLX0KLQwKLSNpZmRlZiBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TCi0KLS8qIGk5NjAgYXNzZW1ibGVycywgKGVnLCBhc205NjApLCBhbGxvdyBiaXRmaWVsZHMgYWZ0ZXIgIi5ieXRlIiBhcwotICAgdzp4LHk6eiwgd2hlcmUgdyBhbmQgeSBhcmUgYml0d2lkdGhzIGFuZCB4IGFuZCB5IGFyZSB2YWx1ZXMuICBUaGV5Ci0gICB0aGVuIHBhY2sgdGhlbSBhbGwgdG9nZXRoZXIuIFdlIGRvIGEgbGl0dGxlIGJldHRlciBpbiB0aGF0IHdlIGFsbG93Ci0gICB0aGVtIGluIHdvcmRzLCBsb25ncywgZXRjLiBhbmQgd2UnbGwgcGFjayB0aGVtIGluIHRhcmdldCBieXRlIG9yZGVyCi0gICBmb3IgeW91LgotCi0gICBUaGUgcnVsZXMgYXJlOiBwYWNrIGxlYXN0IHNpZ25pZmljYXQgYml0IGZpcnN0LCBpZiBhIGZpZWxkIGRvZXNuJ3QKLSAgIGVudGlyZWx5IGZpdCwgcHV0IGl0IGluIHRoZSBuZXh0IHVuaXQuICBPdmVyZmxvd2luZyB0aGUgYml0ZmllbGQgaXMKLSAgIGV4cGxpY2l0bHkgKm5vdCogZXZlbiBhIHdhcm5pbmcuICBUaGUgYml0d2lkdGggc2hvdWxkIGJlIGNvbnNpZGVyZWQKLSAgIGEgIm1hc2siLgotCi0gICBUbyB1c2UgdGhpcyBmdW5jdGlvbiB0aGUgdGMtWFhYLmggZmlsZSBzaG91bGQgZGVmaW5lCi0gICBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TLiAgKi8KLQotc3RhdGljIHZvaWQgCi1wYXJzZV9iaXRmaWVsZF9jb25zIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgdW5zaWduZWQgaW50IGJpdHNfYXZhaWxhYmxlID0gQklUU19QRVJfQ0hBUiAqIG5ieXRlczsKLSAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnOicpCi0gICAgewkJCS8qIGJpdGZpZWxkcyAqLwotICAgICAgbG9uZyB2YWx1ZSA9IDA7Ci0KLSAgICAgIGZvciAoOzspCi0JewotCSAgdW5zaWduZWQgbG9uZyB3aWR0aDsKLQotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzonKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIG5leHQgcGllY2UgaXMgbm90IGEgYml0ZmllbGQgKi8KLQotCSAgLyogSW4gdGhlIGdlbmVyYWwgY2FzZSwgd2UgY2FuJ3QgYWxsb3cKLQkgICAgIGZ1bGwgZXhwcmVzc2lvbnMgd2l0aCBzeW1ib2wKLQkgICAgIGRpZmZlcmVuY2VzIGFuZCBzdWNoLiAgVGhlIHJlbG9jYXRpb24KLQkgICAgIGVudHJpZXMgZm9yIHN5bWJvbHMgbm90IGRlZmluZWQgaW4gdGhpcwotCSAgICAgYXNzZW1ibHkgd291bGQgcmVxdWlyZSBhcmJpdHJhcnkgZmllbGQKLQkgICAgIHdpZHRocywgcG9zaXRpb25zLCBhbmQgbWFza3Mgd2hpY2ggbW9zdAotCSAgICAgb2Ygb3VyIGN1cnJlbnQgb2JqZWN0IGZvcm1hdHMgZG9uJ3QKLQkgICAgIHN1cHBvcnQuCi0KLQkgICAgIEluIHRoZSBzcGVjaWZpYyBjYXNlIHdoZXJlIGEgc3ltYm9sCi0JICAgICAqaXMqIGRlZmluZWQgaW4gdGhpcyBhc3NlbWJseSwgd2UKLQkgICAgICpjb3VsZCogYnVpbGQgZml4dXBzIGFuZCB0cmFjayBpdCwgYnV0Ci0JICAgICB0aGlzIGNvdWxkIGxlYWQgdG8gY29uZnVzaW9uIGZvciB0aGUKLQkgICAgIGJhY2tlbmRzLiAgSSdtIGxhenkuIEknbGwgdGFrZSBhbnkKLQkgICAgIFNFR19BQlNPTFVURS4gSSB0aGluayB0aGF0IG1lYW5zIHRoYXQKLQkgICAgIHlvdSBjYW4gdXNlIGEgcHJldmlvdXMgLnNldCBvcgotCSAgICAgLmVxdSB0eXBlIHN5bWJvbC4gIHhveG9yaWNoLiAqLwotCi0JICBpZiAoZXhwLT5YX29wID09IE9fYWJzZW50KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygidXNpbmcgYSBiaXQgZmllbGQgd2lkdGggb2YgemVybyIpKTsKLQkgICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgfQkJCS8qIGltcGxpZWQgemVybyB3aWR0aCBiaXRmaWVsZCAqLwotCi0JICBpZiAoZXhwLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQkgICAgICBhc19iYWQgKF8oImZpZWxkIHdpZHRoIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIpLCBob2xkKTsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJzonOwotCSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9CQkJLyogdG9vIGNvbXBsZXggKi8KLQotCSAgaWYgKCh3aWR0aCA9IGV4cC0+WF9hZGRfbnVtYmVyKSA+IChCSVRTX1BFUl9DSEFSICogbmJ5dGVzKSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImZpZWxkIHdpZHRoICVsdSB0b28gYmlnIHRvIGZpdCBpbiAlZCBieXRlczogdHJ1bmNhdGVkIHRvICVkIGJpdHMiKSwKLQkJICAgICAgIHdpZHRoLCBuYnl0ZXMsIChCSVRTX1BFUl9DSEFSICogbmJ5dGVzKSk7Ci0JICAgICAgd2lkdGggPSBCSVRTX1BFUl9DSEFSICogbmJ5dGVzOwotCSAgICB9CQkJLyogdG9vIGJpZyAqLwotCi0JICBpZiAod2lkdGggPiBiaXRzX2F2YWlsYWJsZSkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FLVNPTUVEQVk6IGJhY2tpbmcgdXAgYW5kIHJlcGFyc2luZyBpcyB3YXN0ZWZ1bC4gICovCi0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBleHAtPlhfYWRkX251bWJlciA9IHZhbHVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9CQkJLyogd29uJ3QgZml0ICovCi0KLQkgIGhvbGQgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsgLyogc2tpcCAnOicgKi8KLQotCSAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cCk7Ci0JICBpZiAoZXhwLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBjaGFyIGNhY2hlID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCSAgICAgIGFzX2JhZCAoXygiZmllbGQgdmFsdWUgXCIlc1wiIHRvbyBjb21wbGV4IGZvciBhIGJpdGZpZWxkIiksIGhvbGQpOwotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjYWNoZTsKLQkgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQkJCS8qIHRvbyBjb21wbGV4ICovCi0KLQkgIHZhbHVlIHw9ICgofigtMSA8PCB3aWR0aCkgJiBleHAtPlhfYWRkX251bWJlcikKLQkJICAgIDw8ICgoQklUU19QRVJfQ0hBUiAqIG5ieXRlcykgLSBiaXRzX2F2YWlsYWJsZSkpOwotCi0JICBpZiAoKGJpdHNfYXZhaWxhYmxlIC09IHdpZHRoKSA9PSAwCi0JICAgICAgfHwgaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKQotCSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JCQkvKiBhbGwgdGhlIGJpdGZpZWxkcyB3ZSdyZSBnb25uYSBnZXQgKi8KLQotCSAgaG9sZCA9ICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cCk7Ci0JfQkJCS8qIGZvcmV2ZXIgbG9vcCAqLwotCi0gICAgICBleHAtPlhfYWRkX251bWJlciA9IHZhbHVlOwotICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC0+WF91bnNpZ25lZCA9IDE7Ci0gICAgfQkJCQkvKiBpZiBsb29rcyBsaWtlIGEgYml0ZmllbGQgKi8KLX0JCQkJLyogcGFyc2VfYml0ZmllbGRfY29ucygpICovCi0KLSNlbmRpZiAvKiBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TICovCi0MCi0vKiBIYW5kbGUgYW4gTVJJIHN0eWxlIHN0cmluZyBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX21yaV9jb25zIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wnJwotICAgICAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnCi0JICB8fCAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnQScKLQkgICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdFJykpKQotICAgIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiAoZXhwLCBuYnl0ZXMpOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNjYW47Ci0gICAgICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQotICAgICAgLyogQW4gTVJJIHN0eWxlIHN0cmluZy4gIEN1dCBpbnRvIGFzIG1hbnkgYnl0ZXMgYXMgd2lsbCBmaXQgaW50bwotCSBhIG5ieXRlIGNodW5rLCBsZWZ0IGp1c3RpZnkgaWYgbmVjZXNzYXJ5LCBhbmQgc2VwYXJhdGUgd2l0aAotCSBjb21tYXMgc28gd2UgY2FuIHRyeSBhZ2FpbiBsYXRlci4gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQScpCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdFJykKLQl7Ci0JICBhc19iYWQgKF8oIkVCQ0RJQyBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQiKSk7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZm9yIChzY2FuID0gMDsgc2NhbiA8IG5ieXRlczsgc2NhbisrKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCi0JICAgIHsKLQkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcJycpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLQl9Ci0KLSAgICAgIC8qIExlZnQganVzdGlmeSAqLwotICAgICAgd2hpbGUgKHNjYW4gPCBuYnl0ZXMpCi0JewotCSAgcmVzdWx0IDw8PSA4OwotCSAgc2NhbisrOwotCX0KLSAgICAgIC8qIENyZWF0ZSBjb3JyZWN0IGV4cHJlc3Npb24gKi8KLSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IHJlc3VsdDsKLSAgICAgIC8qIEZha2UgaXQgc28gdGhhdCB3ZSBjYW4gcmVhZCB0aGUgbmV4dCBjaGFyIHRvbyAqLwotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSAhPSAnXCcnIHx8Ci0JICAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICdcJycgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcJycpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciAtPSAyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyWzBdID0gJywnOwotCSAgaW5wdXRfbGluZV9wb2ludGVyWzFdID0gJ1wnJzsKLQl9Ci0gICAgICBlbHNlCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotfQotDAotI2lmZGVmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0KLS8qIFBhcnNlIGEgcmVwZWF0IGV4cHJlc3Npb24gZm9yIGNvbnMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIE1JUFMKLSAgIGFzc2VtYmxlci4gIFRoZSBmb3JtYXQgaXMgTlVNQkVSOkNPVU5UOyBOVU1CRVIgYXBwZWFycyBpbiB0aGUKLSAgIG9iamVjdCBmaWxlIENPVU5UIHRpbWVzLgotCi0gICBUbyB1c2UgdGhpcyBmb3IgYSB0YXJnZXQsIGRlZmluZSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYXJzZV9yZXBlYXRfY29ucyAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHJlc3Npb25TIGNvdW50OwotICByZWdpc3RlciBpbnQgaTsKLQotICBleHByZXNzaW9uIChleHApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc6JykKLSAgICB7Ci0gICAgICAvKiBObyByZXBlYXQgY291bnQuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgZXhwcmVzc2lvbiAoJmNvdW50KTsKLSAgaWYgKGNvdW50Llhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgY291bnQuWF9hZGRfbnVtYmVyIDw9IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiVW5yZXNvbHZhYmxlIG9yIG5vbnBvc2l0aXZlIHJlcGVhdCBjb3VudDsgdXNpbmcgMSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlIGNvbnMgZnVuY3Rpb24gaXMgZ29pbmcgdG8gb3V0cHV0IHRoaXMgZXhwcmVzc2lvbiBvbmNlLiAgU28gd2UKLSAgICAgb3V0cHV0IGl0IGNvdW50IC0gMSB0aW1lcy4gICovCi0gIGZvciAoaSA9IGNvdW50LlhfYWRkX251bWJlciAtIDE7IGkgPiAwOyBpLS0pCi0gICAgZW1pdF9leHByIChleHAsIG5ieXRlcyk7Ci19Ci0KLSNlbmRpZiAvKiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyAqLwotDAotLyogUGFyc2UgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYXMgYSBoZXggY29uc3RhbnQuICBUaGlzCi0gICBwZXJtaXRzIHVzZXJzIHRvIHNwZWNpZnkgdGhlIGV4YWN0IGJpdHMgdGhleSB3YW50IGluIHRoZSBmbG9hdGluZwotICAgcG9pbnQgbnVtYmVyLiAgKi8KLQotc3RhdGljIGludAotaGV4X2Zsb2F0IChmbG9hdF90eXBlLCBieXRlcykKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci0gICAgIGNoYXIgKmJ5dGVzOwotewotICBpbnQgbGVuZ3RoOwotICBpbnQgaTsKLQotICBzd2l0Y2ggKGZsb2F0X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgbGVuZ3RoID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBsZW5ndGggPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIGxlbmd0aCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIGxlbmd0aCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJVbmtub3duIGZsb2F0aW5nIHR5cGUgdHlwZSAnJWMnIiksIGZsb2F0X3R5cGUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGdvIHRocm91Z2ggZXhwcmVzc2lvbiB0byBwYXJzZSB0aGUKLSAgICAgaGV4IGNvbnN0YW50LCBidXQgaWYgd2UgZ2V0IGEgYmlnbnVtIGl0J3MgYSBwYWluIHRvIHNvcnQgaXQgaW50bwotICAgICB0aGUgYnVmZmVyIGNvcnJlY3RseS4gICovCi0gIGkgPSAwOwotICB3aGlsZSAoaGV4X3AgKCppbnB1dF9saW5lX3BvaW50ZXIpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ18nKQotICAgIHsKLSAgICAgIGludCBkOwotCi0gICAgICAvKiBUaGUgTVJJIGFzc2VtYmxlciBhY2NlcHRzIGFyYml0cmFyeSB1bmRlcnNjb3JlcyBzdHJld24gYWJvdXQKLQkgdGhyb3VnaCB0aGUgaGV4IGNvbnN0YW50LCBzbyB3ZSBpZ25vcmUgdGhlbSBhcyB3ZWxsLiAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ18nKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoaSA+PSBsZW5ndGgpCi0JewotCSAgYXNfd2FybiAoXygiRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgdG9vIGxhcmdlIikpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGQgPSBoZXhfdmFsdWUgKCppbnB1dF9saW5lX3BvaW50ZXIpIDw8IDQ7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdfJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmIChoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgZCArPSBoZXhfdmFsdWUgKCppbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJ5dGVzW2ldID0gZDsKLSAgICAgIGVsc2UKLQlieXRlc1tsZW5ndGggLSBpIC0gMV0gPSBkOwotICAgICAgKytpOwotICAgIH0KLQotICBpZiAoaSA8IGxlbmd0aCkKLSAgICB7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JbWVtc2V0IChieXRlcyArIGksIDAsIGxlbmd0aCAtIGkpOwotICAgICAgZWxzZQotCW1lbXNldCAoYnl0ZXMsIDAsIGxlbmd0aCAtIGkpOwotICAgIH0KLQotICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKgotICoJCQlmbG9hdF9jb25zKCkKLSAqCi0gKiBDT05TdHJ1Y3Qgc29tZSBtb3JlIGZyYWcgY2hhcnMgb2YgLmZsb2F0cyAuZmZsb2F0cyBldGMuCi0gKiBNYWtlcyAwIG9yIG1vcmUgbmV3IGZyYWdzLgotICogSWYgbmVlZF9wYXNzXzIgPT0gMSwgbm8gZnJhZ3MgYXJlIGVtaXR0ZWQuCi0gKiBUaGlzIHVuZGVyc3RhbmRzIG9ubHkgZmxvYXRpbmcgbGl0ZXJhbHMsIG5vdCBleHByZXNzaW9ucy4gU29ycnkuCi0gKgotICogQSBmbG9hdGluZyBjb25zdGFudCBpcyBkZWZpbmVkIGJ5IGF0b2ZfZ2VuZXJpYygpLCBleGNlcHQgaXQgaXMgcHJlY2VkZWQKLSAqIGJ5IDBkIDBmIDBnIG9yIDBoLiBBZnRlciBvYnNlcnZpbmcgdGhlIFNUUkFOR0Ugd2F5IG15IEJTRCBBUyBkb2VzIGl0cwotICogcmVhZGluZywgSSBkZWNpZGVkIHRvIGJlIGluY29tcGF0aWJsZS4gVGhpcyBhbHdheXMgdHJpZXMgdG8gZ2l2ZSB5b3UKLSAqIHJvdW5kZWQgYml0cyB0byB0aGUgcHJlY2lzaW9uIG9mIHRoZSBwc2V1ZG8tb3AuIEZvcm1lciBBUyBkaWQgcHJlbWF0dXJlCi0gKiB0cnVuY2F0YXRpb24sIHJlc3RvcmVkIG5vaXN5IGJpdHMgaW5zdGVhZCBvZiB0cmFpbGluZyAwcyBBTkQgZ2F2ZSB5b3UKLSAqIGEgY2hvaWNlIG9mIDIgZmxhdm91cnMgb2Ygbm9pc2UgYWNjb3JkaW5nIHRvIHdoaWNoIG9mIDIgZmxvYXRpbmctcG9pbnQKLSAqIHNjYW5uZXJzIHlvdSBkaXJlY3RlZCBBUyB0byB1c2UuCi0gKgotICogSW46CWlucHV0X2xpbmVfcG9pbnRlci0+d2hpdGVzcGFjZSBiZWZvcmUsIG9yICcwJyBvZiBmbG9udW0uCi0gKgotICovCi0KLXZvaWQKLWZsb2F0X2NvbnMgKGZsb2F0X3R5cGUpCi0gICAgIC8qIENsb2JiZXJzIGlucHV0X2xpbmUtcG9pbnRlciwgY2hlY2tzIGVuZC1vZi1saW5lLiAqLwotICAgICByZWdpc3RlciBpbnQgZmxvYXRfdHlwZTsJLyogJ2YnOi5mZmxvYXQgLi4uICdGJzouZmxvYXQgLi4uICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGludCBsZW5ndGg7CQkJLyogTnVtYmVyIG9mIGNoYXJzIGluIGFuIG9iamVjdC4gKi8KLSAgcmVnaXN0ZXIgY2hhciAqZXJyOwkJLyogRXJyb3IgZnJvbSBzY2FubmluZyBmbG9hdGluZyBsaXRlcmFsLiAqLwotICBjaGFyIHRlbXBbTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUXTsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZG8KLSAgICB7Ci0gICAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPjFzdCBjaGFyIG9mIGEgZmxvbnVtICh3ZSBob3BlISkuICovCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIC8qIFNraXAgYW55IDB7bGV0dGVyfSB0aGF0IG1heSBiZSBwcmVzZW50LiBEb24ndCBldmVuIGNoZWNrIGlmIHRoZQotICAgICAgICogbGV0dGVyIGlzIGxlZ2FsLiBTb21lb25lIG1heSBpbnZlbnQgYSAieiIgZm9ybWF0IGFuZCB0aGlzIHJvdXRpbmUKLSAgICAgICAqIGhhcyBubyB1c2UgZm9yIHN1Y2ggaW5mb3JtYXRpb24uIEx1c2VycyBiZXdhcmU6IHlvdSBnZXQKLSAgICAgICAqIGRpYWdub3N0aWNzIGlmIHlvdXIgaW5wdXQgaXMgaWxsLWNvbmRpdGlvbmVkLgotICAgICAgICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotCSAgJiYgaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclsxXSkpCi0JaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgICAgIC8qIEFjY2VwdCA6eHh4eCwgd2hlcmUgdGhlIHgncyBhcmUgaGV4IGRpZ2l0cywgZm9yIGEgZmxvYXRpbmcKLSAgICAgICAgIHBvaW50IHdpdGggdGhlIGV4YWN0IGRpZ2l0cyBzcGVjaWZpZWQuICAqLwotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnOicpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBsZW5ndGggPSBoZXhfZmxvYXQgKGZsb2F0X3R5cGUsIHRlbXApOwotCSAgaWYgKGxlbmd0aCA8IDApCi0JICAgIHsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlcnIgPSBtZF9hdG9mIChmbG9hdF90eXBlLCB0ZW1wLCAmbGVuZ3RoKTsKLQkgIGtub3cgKGxlbmd0aCA8PSBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQpOwotCSAga25vdyAobGVuZ3RoID4gMCk7Ci0JICBpZiAoZXJyKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJCYWQgZmxvYXRpbmcgbGl0ZXJhbDogJXMiKSwgZXJyKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCFuZWVkX3Bhc3NfMikKLQl7Ci0JICBpbnQgY291bnQ7Ci0KLQkgIGNvdW50ID0gMTsKLQotI2lmZGVmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnOicpCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUyBjb3VudF9leHA7Ci0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBleHByZXNzaW9uICgmY291bnRfZXhwKTsKLQkgICAgICBpZiAoY291bnRfZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkgIHx8IGNvdW50X2V4cC5YX2FkZF9udW1iZXIgPD0gMCkKLQkJewotCQkgIGFzX3dhcm4gKF8oInVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWNvdW50ID0gY291bnRfZXhwLlhfYWRkX251bWJlcjsKLQkgICAgfQotI2VuZGlmCi0KLQkgIHdoaWxlICgtLWNvdW50ID49IDApCi0JICAgIHsKLQkgICAgICBwID0gZnJhZ19tb3JlIChsZW5ndGgpOwotCSAgICAgIG1lbWNweSAocCwgdGVtcCwgKHVuc2lnbmVkIGludCkgbGVuZ3RoKTsKLQkgICAgfQotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAtLWlucHV0X2xpbmVfcG9pbnRlcjsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBmbG9hdF9jb25zKCkgKi8KLQwKLS8qIFJldHVybiB0aGUgc2l6ZSBvZiBhIExFQjEyOCB2YWx1ZSAqLwotCi1zdGF0aWMgaW5saW5lIGludAotc2l6ZW9mX3NsZWIxMjggKHZhbHVlKQotICAgICBvZmZzZXRUIHZhbHVlOwotewotICByZWdpc3RlciBpbnQgc2l6ZSA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0gICAgICAvKiBTYWRseSwgd2UgY2Fubm90IHJlbHkgb24gdHlwaWNhbCBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGJlaGF2aW91ci4KLQkgRm9ydHVuYXRlbHksIHdlIGNhbiBzdHJ1Y3R1cmUgdGhpbmdzIHNvIHRoYXQgdGhlIGV4dHJhIHdvcmsgcmVkdWNlcwotCSB0byBhIG5vb3Agb24gc3lzdGVtcyB0aGF0IGRvIHRoaW5ncyAicHJvcGVybHkiLiAgKi8KLSAgICAgIHZhbHVlID0gKHZhbHVlID4+IDcpIHwgfigtKG9mZnNldFQpMSA+PiA3KTsKLSAgICAgIHNpemUgKz0gMTsKLSAgICB9Ci0gIHdoaWxlICghKCgodmFsdWUgPT0gMCkgJiYgKChieXRlICYgMHg0MCkgPT0gMCkpCi0JICAgfHwgKCh2YWx1ZSA9PSAtMSkgJiYgKChieXRlICYgMHg0MCkgIT0gMCkpKSk7Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1zaXplb2ZfdWxlYjEyOCAodmFsdWUpCi0gICAgIHZhbHVlVCB2YWx1ZTsKLXsKLSAgcmVnaXN0ZXIgaW50IHNpemUgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOwotICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICBzaXplICs9IDE7Ci0gICAgfQotICB3aGlsZSAodmFsdWUgIT0gMCk7Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWludAotc2l6ZW9mX2xlYjEyOCAodmFsdWUsIHNpZ24pCi0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IHNpZ247Ci17Ci0gIGlmIChzaWduKQotICAgIHJldHVybiBzaXplb2Zfc2xlYjEyOCAoKG9mZnNldFQpIHZhbHVlKTsKLSAgZWxzZQotICAgIHJldHVybiBzaXplb2ZfdWxlYjEyOCAodmFsdWUpOwotfQotCi0vKiBPdXRwdXQgYSBMRUIxMjggdmFsdWUuICAqLwotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X3NsZWIxMjggKHAsIHZhbHVlKQotICAgICBjaGFyICpwOwotICAgICBvZmZzZXRUIHZhbHVlOwotewotICByZWdpc3RlciBjaGFyICpvcmlnID0gcDsKLSAgcmVnaXN0ZXIgaW50IG1vcmU7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0KLSAgICAgIC8qIFNhZGx5LCB3ZSBjYW5ub3QgcmVseSBvbiB0eXBpY2FsIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgYmVoYXZpb3VyLgotCSBGb3J0dW5hdGVseSwgd2UgY2FuIHN0cnVjdHVyZSB0aGluZ3Mgc28gdGhhdCB0aGUgZXh0cmEgd29yayByZWR1Y2VzCi0JIHRvIGEgbm9vcCBvbiBzeXN0ZW1zIHRoYXQgZG8gdGhpbmdzICJwcm9wZXJseSIuICAqLwotICAgICAgdmFsdWUgPSAodmFsdWUgPj4gNykgfCB+KC0ob2Zmc2V0VCkxID4+IDcpOwotCi0gICAgICBtb3JlID0gISgoKCh2YWx1ZSA9PSAwKSAmJiAoKGJ5dGUgJiAweDQwKSA9PSAwKSkKLQkJfHwgKCh2YWx1ZSA9PSAtMSkgJiYgKChieXRlICYgMHg0MCkgIT0gMCkpKSk7Ci0gICAgICBpZiAobW9yZSkKLQlieXRlIHw9IDB4ODA7Ci0KLSAgICAgICpwKysgPSBieXRlOwotICAgIH0KLSAgd2hpbGUgKG1vcmUpOwotCi0gIHJldHVybiBwIC0gb3JpZzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW91dHB1dF91bGViMTI4IChwLCB2YWx1ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgdmFsdWVUIHZhbHVlOwotewotICBjaGFyICpvcmlnID0gcDsKLQotICBkbwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgICAgaWYgKHZhbHVlICE9IDApCi0JLyogTW9yZSBieXRlcyB0byBmb2xsb3cuICAqLwotCWJ5dGUgfD0gMHg4MDsKLQotICAgICAgKnArKyA9IGJ5dGU7Ci0gICAgfQotICB3aGlsZSAodmFsdWUgIT0gMCk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1pbnQKLW91dHB1dF9sZWIxMjggKHAsIHZhbHVlLCBzaWduKQotICAgICBjaGFyICpwOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBzaWduOwotewotICBpZiAoc2lnbikKLSAgICByZXR1cm4gb3V0cHV0X3NsZWIxMjggKHAsIChvZmZzZXRUKSB2YWx1ZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gb3V0cHV0X3VsZWIxMjggKHAsIHZhbHVlKTsKLX0KLQotLyogRG8gdGhlIHNhbWUgZm9yIGJpZ251bXMuICBXZSBjb21iaW5lIHNpemVvZiB3aXRoIG91dHB1dCBoZXJlIGluIHRoYXQKLSAgIHdlIGRvbid0IG91dHB1dCBmb3IgTlVMTCB2YWx1ZXMgb2YgUC4gIEl0IGlzbid0IHJlYWxseSBhcyBjcml0aWNhbCBhcwotICAgZm9yICJub3JtYWwiIHZhbHVlcyB0aGF0IHRoaXMgYmUgc3RyZWFtbGluZWQuICAqLwotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X2JpZ19zbGViMTI4IChwLCBiaWdudW0sIHNpemUpCi0gICAgIGNoYXIgKnA7Ci0gICAgIExJVFRMRU5VTV9UWVBFICpiaWdudW07Ci0gICAgIGludCBzaXplOwotewotICBjaGFyICpvcmlnID0gcDsKLSAgdmFsdWVUIHZhbCA9IDA7Ci0gIGludCBsb2FkZWQgPSAwOwotICB1bnNpZ25lZCBieXRlOwotCi0gIC8qIFN0cmlwIGxlYWRpbmcgc2lnbiBleHRlbnNpb25zIG9mZiB0aGUgYmlnbnVtLiAgKi8KLSAgd2hpbGUgKHNpemUgPiAwICYmIGJpZ251bVtzaXplLTFdID09IChMSVRUTEVOVU1fVFlQRSktMSkKLSAgICBzaXplLS07Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG9hZGVkIDwgNyAmJiBzaXplID4gMCkKLQl7Ci0JICB2YWwgfD0gKCpiaWdudW0gPDwgbG9hZGVkKTsKLQkgIGxvYWRlZCArPSA4ICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgIHNpemUtLTsKLQkgIGJpZ251bSsrOwotCX0KLQotICAgICAgYnl0ZSA9IHZhbCAmIDB4N2Y7Ci0gICAgICBsb2FkZWQgLT0gNzsKLSAgICAgIHZhbCA+Pj0gNzsKLQotICAgICAgaWYgKHNpemUgPT0gMCkKLQl7Ci0JICBpZiAoKHZhbCA9PSAwICYmIChieXRlICYgMHg0MCkgPT0gMCkKLQkgICAgICB8fCAofih2YWwgfCB+KCgodmFsdWVUKTEgPDwgbG9hZGVkKSAtIDEpKSA9PSAwCi0JCSAgJiYgKGJ5dGUgJiAweDQwKSAhPSAwKSkKLQkgICAgYnl0ZSB8PSAweDgwOwotCX0KLQotICAgICAgaWYgKG9yaWcpCi0JKnAgPSBieXRlOwotICAgICAgcCsrOwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICByZXR1cm4gcCAtIG9yaWc7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdXRwdXRfYmlnX3VsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgTElUVExFTlVNX1RZUEUgKmJpZ251bTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNoYXIgKm9yaWcgPSBwOwotICB2YWx1ZVQgdmFsID0gMDsKLSAgaW50IGxvYWRlZCA9IDA7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgLyogU3RyaXAgbGVhZGluZyB6ZXJvcyBvZmYgdGhlIGJpZ251bS4gICovCi0gIC8qIFhYWDogSXMgdGhpcyBuZWVkZWQ/ICAqLwotICB3aGlsZSAoc2l6ZSA+IDAgJiYgYmlnbnVtW3NpemUtMV0gPT0gMCkKLSAgICBzaXplLS07Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG9hZGVkIDwgNyAmJiBzaXplID4gMCkKLQl7Ci0JICB2YWwgfD0gKCpiaWdudW0gPDwgbG9hZGVkKTsKLQkgIGxvYWRlZCArPSA4ICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgIHNpemUtLTsKLQkgIGJpZ251bSsrOwotCX0KLQotICAgICAgYnl0ZSA9IHZhbCAmIDB4N2Y7Ci0gICAgICBsb2FkZWQgLT0gNzsKLSAgICAgIHZhbCA+Pj0gNzsKLQotICAgICAgaWYgKHNpemUgPiAwIHx8IHZhbCkKLQlieXRlIHw9IDB4ODA7Ci0KLSAgICAgIGlmIChvcmlnKQotCSpwID0gYnl0ZTsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1zdGF0aWMgaW50Ci1vdXRwdXRfYmlnX2xlYjEyOCAocCwgYmlnbnVtLCBzaXplLCBzaWduKQotICAgICBjaGFyICpwOwotICAgICBMSVRUTEVOVU1fVFlQRSAqYmlnbnVtOwotICAgICBpbnQgc2l6ZSwgc2lnbjsKLXsKLSAgaWYgKHNpZ24pCi0gICAgcmV0dXJuIG91dHB1dF9iaWdfc2xlYjEyOCAocCwgYmlnbnVtLCBzaXplKTsKLSAgZWxzZQotICAgIHJldHVybiBvdXRwdXRfYmlnX3VsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSk7Ci19Ci0KLS8qIEdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBmcmFnbWVudHMgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbiB0byBlbWl0IGEKLSAgIGxlYjEyOCB2YWx1ZS4gICovCi0KLXZvaWQKLWVtaXRfbGViMTI4X2V4cHIoZXhwLCBzaWduKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgc2lnbjsKLXsKLSAgb3BlcmF0b3JUIG9wID0gZXhwLT5YX29wOwotCi0gIGlmIChvcCA9PSBPX2Fic2VudCB8fCBvcCA9PSBPX2lsbGVnYWwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iKSk7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX2JpZyAmJiBleHAtPlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fcmVnaXN0ZXIpCi0gICAgewotICAgICAgYXNfd2FybiAoXygicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIikpOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLQotICBpZiAob3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSd2ZSBnb3QgYSBjb25zdGFudCwgZW1pdCB0aGUgdGhpbmcgZGlyZWN0bHkgcmlnaHQgbm93LiAgKi8KLQotICAgICAgdmFsdWVUIHZhbHVlID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHNpemUgPSBzaXplb2ZfbGViMTI4ICh2YWx1ZSwgc2lnbik7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplKTsKLSAgICAgIG91dHB1dF9sZWIxMjggKHAsIHZhbHVlLCBzaWduKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnKQotICAgIHsKLSAgICAgIC8qIE9fYmlnIGlzIGEgZGlmZmVyZW50IHNvcnQgb2YgY29uc3RhbnQuICAqLwotCi0gICAgICBpbnQgc2l6ZTsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHNpemUgPSBvdXRwdXRfYmlnX2xlYjEyOCAoTlVMTCwgZ2VuZXJpY19iaWdudW0sIGV4cC0+WF9hZGRfbnVtYmVyLCBzaWduKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICAgICAgb3V0cHV0X2JpZ19sZWIxMjggKHAsIGdlbmVyaWNfYmlnbnVtLCBleHAtPlhfYWRkX251bWJlciwgc2lnbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGNyZWF0ZSBhIHZhcmlhYmxlIHNpemVkIGZyYWdtZW50IGFuZCAKLQkgcmVzb2x2ZSB0aGluZ3MgbGF0ZXIuICAqLwotCi0gICAgICBmcmFnX3ZhciAocnNfbGViMTI4LCBzaXplb2ZfdWxlYjEyOCAofih2YWx1ZVQpMCksIDAsIHNpZ24sCi0JCW1ha2VfZXhwcl9zeW1ib2wgKGV4cCksIDAsIChjaGFyICopIE5VTEwpOwotICAgIH0KLX0KLQotLyogUGFyc2UgdGhlIC5zbGViMTI4IGFuZCAudWxlYjEyOCBwc2V1ZG9zLiAgKi8KLQotdm9pZAotc19sZWIxMjggKHNpZ24pCi0gICAgIGludCBzaWduOwotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgZG8gewotICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgIGVtaXRfbGViMTI4X2V4cHIgKCZleHAsIHNpZ24pOwotICB9IHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qCi0gKgkJCXN0cmluZ2VyKCkKLSAqCi0gKiBXZSByZWFkIDAgb3IgbW9yZSAnLCcgc2VwYXJhdGVkLCBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi0gKgotICogQ2FsbGVyIHNob3VsZCBoYXZlIGNoZWNrZWQgbmVlZF9wYXNzXzIgaXMgRkFMU0UgYmVjYXVzZSB3ZSBkb24ndCBjaGVjayBpdC4KLSAqLwotCi0KLXZvaWQgCi1zdHJpbmdlciAoYXBwZW5kX3plcm8pCQkvKiBXb3JrZXIgdG8gZG8gLmFzY2lpIGV0YyBzdGF0ZW1lbnRzLiAqLwotICAgICAvKiBDaGVja3MgZW5kLW9mLWxpbmUuICovCi0gICAgIHJlZ2lzdGVyIGludCBhcHBlbmRfemVybzsJLyogMDogZG9uJ3QgYXBwZW5kICdcMCcsIGVsc2UgMSAqLwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLSAgY2hhciAqc3RhcnQ7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIC8qCi0gICAqIFRoZSBmb2xsb3dpbmcgYXdrd2FyZCBsb2dpYyBpcyB0byBwYXJzZSBaRVJPIG9yIG1vcmUgc3RyaW5ncywKLSAgICogY29tbWEgc2VwYXJhdGVkLiBSZWNhbGwgYSBzdHJpbmcgZXhwcmVzc2lvbiBpbmNsdWRlcyBzcGFjZXMKLSAgICogYmVmb3JlIHRoZSBvcGVuaW5nICdcIicgYW5kIHNwYWNlcyBhZnRlciB0aGUgY2xvc2luZyAnXCInLgotICAgKiBXZSBmYWtlIGEgbGVhZGluZyAnLCcgaWYgdGhlcmUgaXMgKHN1cHBvc2VkIHRvIGJlKQotICAgKiBhIDFzdCwgZXhwcmVzc2lvbi4gV2Uga2VlcCBkZW1hbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGVhY2gKLSAgICogJywnLgotICAgKi8KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgYyA9IDA7CQkJLyogU2tpcCBsb29wLiAqLwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CS8qIENvbXBlbnNhdGUgZm9yIGVuZCBvZiBsb29wLiAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAnLCc7CQkJLyogRG8gbG9vcC4gKi8KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyB8fCBjID09ICc8JyB8fCBjID09ICciJykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCWNhc2UgJ1wiJzoKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKi0+MXN0IGNoYXIgb2Ygc3RyaW5nLiAqLwotCSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JICAgIHsKLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotCSAgICB9Ci0JICBpZiAoYXBwZW5kX3plcm8pCi0JICAgIHsKLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKDApOwotCSAgICB9Ci0JICBrbm93IChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcIicpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBJbiBFTEYsIHdoZW4gZ2NjIGlzIGVtaXR0aW5nIERXQVJGIDEgZGVidWdnaW5nIG91dHB1dCwgaXQKLSAgICAgICAgICAgICB3aWxsIGVtaXQgLnN0cmluZyB3aXRoIGEgZmlsZW5hbWUgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uCi0gICAgICAgICAgICAgYWZ0ZXIgYSBzZXF1ZW5jZSBvZiBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnQgaW4KLSAgICAgICAgICAgICBlbWl0X2V4cHIgZm9yIHRoZSBzZXF1ZW5jZS4gIGVtaXRfZXhwciB3aWxsIHNldAotICAgICAgICAgICAgIGR3YXJmX2ZpbGVfc3RyaW5nIHRvIG5vbi16ZXJvIGlmIHRoaXMgc3RyaW5nIG1pZ2h0IGJlIGEKLSAgICAgICAgICAgICBzb3VyY2UgZmlsZSBuYW1lLiAgKi8KLQkgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZGVidWciKSAhPSAwKQotCSAgICBkd2FyZl9maWxlX3N0cmluZyA9IDA7Ci0JICBlbHNlIGlmIChkd2FyZl9maWxlX3N0cmluZykKLQkgICAgewotCSAgICAgIGMgPSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlclstMV0gPSAnXDAnOwotCSAgICAgIGxpc3Rpbmdfc291cmNlX2ZpbGUgKHN0YXJ0KTsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXJbLTFdID0gYzsKLQkgICAgfQotI2VuZGlmCi0jZW5kaWYKLQotCSAgYnJlYWs7Ci0JY2FzZSAnPCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGMgPSBnZXRfc2luZ2xlX251bWJlciAoKTsKLQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPicpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIDxubj4iKSk7Ci0JICAgIH0KLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzdHJpbmdlcigpICovCi0MCi0vKiBGSVhNRS1TT01FREFZOiBJIGhhZCB0cm91YmxlIGhlcmUgb24gY2hhcmFjdGVycyB3aXRoIHRoZQotICAgIGhpZ2ggYml0cyBzZXQuICBXZSdsbCBwcm9iYWJseSBhbHNvIGhhdmUgdHJvdWJsZSB3aXRoCi0gICAgbXVsdGlieXRlIGNoYXJzLCB3aWRlIGNoYXJzLCBldGMuICBBbHNvIGJlIGNhcmVmdWwgYWJvdXQKLSAgICByZXR1cm5pbmcgdmFsdWVzIGJpZ2dlciB0aGFuIDEgYnl0ZS4gIHhveG9yaWNoLiAqLwotCi11bnNpZ25lZCBpbnQgCi1uZXh0X2NoYXJfb2Zfc3RyaW5nICgpCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKysgJiBDSEFSX01BU0s7Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnXCInOgotICAgICAgYyA9IE5PVF9BX0NIQVI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1xuJzoKLSAgICAgIGFzX3dhcm4gKF8oIlVudGVybWluYXRlZCBzdHJpbmc6IE5ld2xpbmUgaW5zZXJ0ZWQuIikpOwotICAgICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotICAgICAgYnJlYWs7Ci0KLSNpZm5kZWYgTk9fU1RSSU5HX0VTQ0FQRVMKLSAgICBjYXNlICdcXCc6Ci0gICAgICBzd2l0Y2ggKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0JewotCWNhc2UgJ2InOgotCSAgYyA9ICdcYic7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgYyA9ICdcZic7Ci0JICBicmVhazsKLQotCWNhc2UgJ24nOgotCSAgYyA9ICdcbic7Ci0JICBicmVhazsKLQotCWNhc2UgJ3InOgotCSAgYyA9ICdccic7Ci0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgYyA9ICdcdCc7Ci0JICBicmVhazsKLQotCWNhc2UgJ3YnOgotCSAgYyA9ICdcMDEzJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXFwnOgotCWNhc2UgJyInOgotCSAgYnJlYWs7CQkvKiBBcyBpdHNlbGYuICovCi0KLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIHsKLQkgICAgbG9uZyBudW1iZXI7Ci0JICAgIGludCBpOwotCi0JICAgIGZvciAoaSA9IDAsIG51bWJlciA9IDA7IGlzZGlnaXQgKGMpICYmIGkgPCAzOyBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrLCBpKyspCi0JICAgICAgewotCQludW1iZXIgPSBudW1iZXIgKiA4ICsgYyAtICcwJzsKLQkgICAgICB9Ci0JICAgIGMgPSBudW1iZXIgJiAweGZmOwotCSAgfQotCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBicmVhazsKLQotCWNhc2UgJ3gnOgotCWNhc2UgJ1gnOgotCSAgewotCSAgICBsb25nIG51bWJlcjsKLQotCSAgICBudW1iZXIgPSAwOwotCSAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICB3aGlsZSAoaXN4ZGlnaXQgKGMpKQotCSAgICAgIHsKLQkJaWYgKGlzZGlnaXQgKGMpKQotCQkgIG51bWJlciA9IG51bWJlciAqIDE2ICsgYyAtICcwJzsKLQkJZWxzZSBpZiAoaXN1cHBlciAoYykpCi0JCSAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBjIC0gJ0EnICsgMTA7Ci0JCWVsc2UKLQkJICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGMgLSAnYScgKyAxMDsKLQkJYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICB9Ci0JICAgIGMgPSBudW1iZXIgJiAweGZmOwotCSAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnXG4nOgotCSAgLyogVG8gYmUgY29tcGF0aWJsZSB3aXRoIEJTRCA0LjIgYXM6IGdpdmUgdGhlIGx1c2VyIGEgbGluZWZlZWQhISAqLwotCSAgYXNfd2FybiAoXygiVW50ZXJtaW5hdGVkIHN0cmluZzogTmV3bGluZSBpbnNlcnRlZC4iKSk7Ci0JICBjID0gJ1xuJzsKLQkgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQotI2lmZGVmIE9OTFlfU1RBTkRBUkRfRVNDQVBFUwotCSAgYXNfYmFkIChfKCJCYWQgZXNjYXBlZCBjaGFyYWN0ZXIgaW4gc3RyaW5nLCAnPycgYXNzdW1lZCIpKTsKLQkgIGMgPSAnPyc7Ci0jZW5kaWYgLyogT05MWV9TVEFOREFSRF9FU0NBUEVTICovCi0KLQkgIGJyZWFrOwotCX0JCQkvKiBzd2l0Y2ggb24gZXNjYXBlZCBjaGFyICovCi0gICAgICBicmVhazsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKE5PX1NUUklOR19FU0NBUEVTKSAqLwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIGNoYXIgKi8KLSAgcmV0dXJuIChjKTsKLX0JCQkJLyogbmV4dF9jaGFyX29mX3N0cmluZygpICovCi0MCi1zdGF0aWMgc2VnVAotZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKQotICAgICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsKLXsKLSAgcmVnaXN0ZXIgc2VnVCByZXR2YWw7Ci0KLSAgcmV0dmFsID0gZXhwcmVzc2lvbiAoZXhwUCk7Ci0gIGlmIChleHBQLT5YX29wID09IE9faWxsZWdhbAotICAgICAgfHwgZXhwUC0+WF9vcCA9PSBPX2Fic2VudAotICAgICAgfHwgZXhwUC0+WF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGFkZHJlc3MgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgcmV0dmFsID0gYWJzb2x1dGVfc2VjdGlvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBzZWdUIAotZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKQotICAgICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsKLXsKLSAgcmVnaXN0ZXIgc2VnVCByZXR2YWw7Ci0KLSAgaWYgKChyZXR2YWwgPSBnZXRfc2VnbWVudGVkX2V4cHJlc3Npb24gKGV4cFApKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBleHRyYWN0IHRoZSB1bmRlZmluZWQgc3ltYm9sIGZyb20gdGhlCi0JIGV4cHJlc3Npb24uICAqLwotICAgICAgaWYgKGV4cFAtPlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0JICAmJiBTX0dFVF9TRUdNRU5UIChleHBQLT5YX2FkZF9zeW1ib2wpICE9IGV4cHJfc2VjdGlvbikKLQlhc193YXJuIChfKCJzeW1ib2wgXCIlc1wiIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIiksCi0JCSBTX0dFVF9OQU1FIChleHBQLT5YX2FkZF9zeW1ib2wpKTsKLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJzb21lIHN5bWJvbCB1bmRlZmluZWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIHJldHZhbCA9IGFic29sdXRlX3NlY3Rpb247Ci0gICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICBrbm93IChyZXR2YWwgPT0gYWJzb2x1dGVfc2VjdGlvbiB8fCBTRUdfTk9STUFMIChyZXR2YWwpKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQkJCQkvKiBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24oKSAqLwotCi1vZmZzZXRUCi1nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKQotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX2Fic2VudCkKLQlhc19iYWQgKF8oImJhZCBvciBpcnJlZHVjaWJsZSBhYnNvbHV0ZSBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gIHJldHVybiBleHAuWF9hZGRfbnVtYmVyOwotfQotCi1jaGFyCQkJCS8qIHJldHVybiB0ZXJtaW5hdG9yICovCi1nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAodmFsX3BvaW50ZXIpCi0gICAgIGxvbmcgKnZhbF9wb2ludGVyOwkJLyogcmV0dXJuIHZhbHVlIG9mIGV4cHJlc3Npb24gKi8KLXsKLSAgLyogRklYTUU6IHZhbF9wb2ludGVyIHNob3VsZCBwcm9iYWJseSBiZSBvZmZzZXRUICouICAqLwotICAqdmFsX3BvaW50ZXIgPSAobG9uZykgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHJldHVybiAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLX0KLQwKLS8qCi0gKgkJCWRlbWFuZF9jb3B5X0Nfc3RyaW5nKCkKLSAqCi0gKiBMaWtlIGRlbWFuZF9jb3B5X3N0cmluZywgYnV0IHJldHVybiBOVUxMIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYW55ICdcMCdzLgotICogR2l2ZSBhIHdhcm5pbmcgaWYgdGhhdCBoYXBwZW5zLgotICovCi1jaGFyICoKLWRlbWFuZF9jb3B5X0Nfc3RyaW5nIChsZW5fcG9pbnRlcikKLSAgICAgaW50ICpsZW5fcG9pbnRlcjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqczsKLQotICBpZiAoKHMgPSBkZW1hbmRfY29weV9zdHJpbmcgKGxlbl9wb2ludGVyKSkgIT0gMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgbGVuOwotCi0gICAgICBmb3IgKGxlbiA9ICpsZW5fcG9pbnRlcjsgbGVuID4gMDsgbGVuLS0pCi0JewotCSAgaWYgKCpzID09IDApCi0JICAgIHsKLQkgICAgICBzID0gMDsKLQkgICAgICBsZW4gPSAxOwotCSAgICAgICpsZW5fcG9pbnRlciA9IDA7Ci0JICAgICAgYXNfYmFkIChfKCJUaGlzIHN0cmluZyBtYXkgbm90IGNvbnRhaW4gXCdcXDBcJyIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBzOwotfQotDAotLyoKLSAqCQkJZGVtYW5kX2NvcHlfc3RyaW5nKCkKLSAqCi0gKiBEZW1hbmQgc3RyaW5nLCBidXQgcmV0dXJuIGEgc2FmZSAoPXByaXZhdGUpIGNvcHkgb2YgdGhlIHN0cmluZy4KLSAqIFJldHVybiBOVUxMIGlmIHdlIGNhbid0IHJlYWQgYSBzdHJpbmcgaGVyZS4KLSAqLwotY2hhciAqCi1kZW1hbmRfY29weV9zdHJpbmcgKGxlblApCi0gICAgIGludCAqbGVuUDsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHJlZ2lzdGVyIGludCBsZW47Ci0gIGNoYXIgKnJldHZhbDsKLQotICBsZW4gPSAwOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CS8qIFNraXAgb3BlbmluZyBxdW90ZS4gKi8KLQotICAgICAgd2hpbGUgKGlzX2FfY2hhciAoYyA9IG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgYyk7Ci0JICBsZW4rKzsKLQl9Ci0gICAgICAvKiBKRiB0aGlzIG5leHQgbGluZSBpcyBzbyBkZW1hbmRfY29weV9DX3N0cmluZyB3aWxsIHJldHVybiBhCi0JIG51bGwgdGVybWluYXRlZCBzdHJpbmcuICovCi0gICAgICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICdcMCcpOwotICAgICAgcmV0dmFsID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBzdHJpbmciKSk7Ci0gICAgICByZXR2YWwgPSBOVUxMOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gICpsZW5QID0gbGVuOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGRlbWFuZF9jb3B5X3N0cmluZygpICovCi0MCi0vKgotICoJCWlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQoKQotICoKLSAqIEluOglJbnB1dF9saW5lX3BvaW50ZXItPm5leHQgY2hhcmFjdGVyLgotICoKLSAqIERvOglTa2lwIGlucHV0X2xpbmVfcG9pbnRlciBvdmVyIGFsbCB3aGl0ZXNwYWNlLgotICoKLSAqIE91dDoJMSBpZiBpbnB1dF9saW5lX3BvaW50ZXItPmVuZC1vZi1saW5lLgotKi8KLWludCAKLWlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkKLXsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICByZXR1cm4gKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSk7Ci19CQkJCS8qIGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQoKSAqLwotCi12b2lkIAotZXF1YWxzIChzeW1fbmFtZSwgcmVhc3NpZ24pCi0gICAgIGNoYXIgKnN5bV9uYW1lOwotICAgICBpbnQgcmVhc3NpZ247Ci17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CS8qIHN5bWJvbCB3ZSBhcmUgd29ya2luZyB3aXRoICovCi0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPScpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGlmIChzeW1fbmFtZVswXSA9PSAnLicgJiYgc3ltX25hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBUdXJuICcuID0gbXVtYmxlJyBpbnRvIGEgLm9yZyBtdW1ibGUgKi8KLSAgICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotICAgICAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoIW5lZWRfcGFzc18yKQotCWRvX29yZyAoc2VnbWVudCwgJmV4cCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKHN5bV9uYW1lKTsKLSAgICAgIC8qIFBlcm1pdCByZWdpc3RlciBuYW1lcyB0byBiZSByZWRlZmluZWQuICAqLwotICAgICAgaWYgKCEgcmVhc3NpZ24KLQkgICYmIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLQkgICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotCWFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIHBzZXVkb19zZXQgKHN5bWJvbFApOwotICAgIH0KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgIHsKLSAgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOyAvKiBjaGVjayBnYXJiYWdlIGFmdGVyIHRoZSBleHByZXNzaW9uICovCi0gICAgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgIH0KLX0JCQkJLyogZXF1YWxzKCkgKi8KLQotLyogLmluY2x1ZGUgLS0gaW5jbHVkZSBhIGZpbGUgYXQgdGhpcyBwb2ludC4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQgCi1zX2luY2x1ZGUgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgY2hhciAqbmV3YnVmOwotICBjaGFyICpmaWxlbmFtZTsKLSAgaW50IGk7Ci0gIEZJTEUgKnRyeTsKLSAgY2hhciAqcGF0aDsKLQotICBpZiAoISBmbGFnX202OGtfbXJpKQotICAgIHsKLSAgICAgIGZpbGVuYW1lID0gZGVtYW5kX2NvcHlfc3RyaW5nICgmaSk7Ci0gICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBkZW1hbmRfY29weV9zdHJpbmcgaGFzIGFscmVhZHkgcHJpbnRlZCBhbiBlcnJvciBhbmQKLSAgICAgICAgICAgICBjYWxsZWQgaWdub3JlX3Jlc3Rfb2ZfbGluZS4gICovCi0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGkgPSAwOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJwotCSAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXHQnKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICsraTsKLQl9Ci0gICAgICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICdcMCcpOwotICAgICAgZmlsZW5hbWUgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHBhdGggPSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgaSArIGluY2x1ZGVfZGlyX21heGxlbiArIDUgLyogc2xvcCAqLyApOwotICBmb3IgKGkgPSAwOyBpIDwgaW5jbHVkZV9kaXJfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzdHJjcHkgKHBhdGgsIGluY2x1ZGVfZGlyc1tpXSk7Ci0gICAgICBzdHJjYXQgKHBhdGgsICIvIik7Ci0gICAgICBzdHJjYXQgKHBhdGgsIGZpbGVuYW1lKTsKLSAgICAgIGlmICgwICE9ICh0cnkgPSBmb3BlbiAocGF0aCwgInIiKSkpCi0JewotCSAgZmNsb3NlICh0cnkpOwotCSAgZ290byBnb3RpdDsKLQl9Ci0gICAgfQotICBmcmVlIChwYXRoKTsKLSAgcGF0aCA9IGZpbGVuYW1lOwotZ290aXQ6Ci0gIC8qIG1hbGxvYyBTdG9yYWdlIGxlYWsgd2hlbiBmaWxlIGlzIGZvdW5kIG9uIHBhdGguICBGSVhNRS1TT01FREFZLiAqLwotICByZWdpc3Rlcl9kZXBlbmRlbmN5IChwYXRoKTsKLSAgbmV3YnVmID0gaW5wdXRfc2NydWJfaW5jbHVkZV9maWxlIChwYXRoLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci19CQkJCS8qIHNfaW5jbHVkZSgpICovCi0KLXZvaWQgCi1hZGRfaW5jbHVkZV9kaXIgKHBhdGgpCi0gICAgIGNoYXIgKnBhdGg7Ci17Ci0gIGludCBpOwotCi0gIGlmIChpbmNsdWRlX2Rpcl9jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGluY2x1ZGVfZGlycyA9IChjaGFyICoqKSB4bWFsbG9jICgyICogc2l6ZW9mICgqaW5jbHVkZV9kaXJzKSk7Ci0gICAgICBpbmNsdWRlX2RpcnNbMF0gPSAiLiI7CS8qIEN1cnJlbnQgZGlyICovCi0gICAgICBpbmNsdWRlX2Rpcl9jb3VudCA9IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5jbHVkZV9kaXJfY291bnQrKzsKLSAgICAgIGluY2x1ZGVfZGlycyA9IChjaGFyICoqKSByZWFsbG9jIChpbmNsdWRlX2RpcnMsCi0JCQkJaW5jbHVkZV9kaXJfY291bnQgKiBzaXplb2YgKCppbmNsdWRlX2RpcnMpKTsKLSAgICB9Ci0KLSAgaW5jbHVkZV9kaXJzW2luY2x1ZGVfZGlyX2NvdW50IC0gMV0gPSBwYXRoOwkvKiBOZXcgb25lICovCi0KLSAgaSA9IHN0cmxlbiAocGF0aCk7Ci0gIGlmIChpID4gaW5jbHVkZV9kaXJfbWF4bGVuKQotICAgIGluY2x1ZGVfZGlyX21heGxlbiA9IGk7Ci19CQkJCS8qIGFkZF9pbmNsdWRlX2RpcigpICovCi0MCi0vKiBPdXRwdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSB0aGUgc291cmNlIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2VuZXJhdGVfZmlsZV9kZWJ1ZyAoKQotewotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19TVEFCUykKLSAgICBzdGFic19nZW5lcmF0ZV9hc21fZmlsZSAoKTsKLX0KLQotLyogT3V0cHV0IGxpbmUgbnVtYmVyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgc291cmNlIGxpbmUuICAqLwotCi12b2lkCi1nZW5lcmF0ZV9saW5lbm9fZGVidWcgKCkKLXsKLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLSAgLyogRUNPRkYgYXNzZW1ibGVycyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gCi0gICAgIEZJWE1FOiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBoYW5kbGVkIGVsc2V3aGVyZS4gICovCi0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1VOU1BFQ0lGSUVEKQotICAgIHsKLSAgICAgIGlmIChFQ09GRl9ERUJVR0dJTkcgJiYgZWNvZmZfbm9fY3VycmVudF9maWxlICgpKQotICAgICAgICBkZWJ1Z190eXBlID0gREVCVUdfRUNPRkY7Ci0gICAgICBlbHNlCi0JZGVidWdfdHlwZSA9IERFQlVHX05PTkU7Ci0gICAgfQotI2VuZGlmCi0KLSAgc3dpdGNoIChkZWJ1Z190eXBlKQotICAgIHsKLSAgICBjYXNlIERFQlVHX1VOU1BFQ0lGSUVEOgotICAgIGNhc2UgREVCVUdfTk9ORToKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfU1RBQlM6Ci0gICAgICBzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19FQ09GRjoKLSAgICAgIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0RXQVJGOgotICAgIGNhc2UgREVCVUdfRFdBUkYyOgotICAgICAgLyogRklYTUUuICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBPdXRwdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIG1hcmsgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCBvciBlbmQgcG9pbnQuCi0gICBFTkRfUCBpcyB6ZXJvIGZvciAuZnVuYywgYW5kIG5vbi16ZXJvIGZvciAuZW5kZnVuYy4gICovCi0KLXZvaWQKLXNfZnVuYyAoZW5kX3ApCi0gICAgIGludCBlbmRfcDsKLXsKLSAgZG9fc19mdW5jIChlbmRfcCwgTlVMTCk7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2Ygc19mdW5jIHNvIHRhcmdldHMgY2FuIGNob29zZSBhIGRpZmZlcmVudCBkZWZhdWx0IHByZWZpeC4KLSAgIElmIERFRkFVTFRfUFJFRklYIGlzIE5VTEwsIHVzZSB0aGUgdGFyZ2V0J3MgImxlYWRpbmcgY2hhciIuICAqLwotCi12b2lkCi1kb19zX2Z1bmMgKGVuZF9wLCBkZWZhdWx0X3ByZWZpeCkKLSAgICAgaW50IGVuZF9wOwotICAgICBjb25zdCBjaGFyICpkZWZhdWx0X3ByZWZpeDsKLXsKLSAgLyogUmVjb3JkIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHNvIHRoYXQgd2UgY2FuIGlzc3VlIGFuIGVycm9yIG1lc3NhZ2UgZm9yCi0gICAgIG1pc3BsYWNlZCAuZnVuYywuZW5kZnVuYywgYW5kIGFsc28gc28gdGhhdCAuZW5kZnVuYyBuZWVkcyBubwotICAgICBhcmd1bWVudHMuICAqLwotICBzdGF0aWMgY2hhciAqY3VycmVudF9uYW1lOwotICBzdGF0aWMgY2hhciAqY3VycmVudF9sYWJlbDsKLQotICBpZiAoZW5kX3ApCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfbmFtZSA9PSBOVUxMKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyAuZnVuYyIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19TVEFCUykKLQlzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyAoY3VycmVudF9uYW1lLCBjdXJyZW50X2xhYmVsKTsKLQotICAgICAgY3VycmVudF9uYW1lID0gY3VycmVudF9sYWJlbCA9IE5VTEw7Ci0gICAgfQotICBlbHNlIC8qICEgZW5kX3AgKi8KLSAgICB7Ci0gICAgICBjaGFyICpuYW1lLCpsYWJlbDsKLSAgICAgIGNoYXIgZGVsaW0xLGRlbGltMjsKLQotICAgICAgaWYgKGN1cnJlbnRfbmFtZSAhPSBOVUxMKQotCXsKLQkgIGFzX2JhZCAoXygiLmVuZGZ1bmMgbWlzc2luZyBmb3IgcHJldmlvdXMgLmZ1bmMiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbGltMSA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGRlbGltMTsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBpZiAoZGVmYXVsdF9wcmVmaXgpCi0JICAgIGFzcHJpbnRmICgmbGFiZWwsICIlcyVzIiwgZGVmYXVsdF9wcmVmaXgsIG5hbWUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciBsZWFkaW5nX2NoYXIgPSAwOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgICBsZWFkaW5nX2NoYXIgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKHN0ZG91dHB1dCk7Ci0jZW5kaWYKLQkgICAgICAvKiBNaXNzaW5nIGVudHJ5IHBvaW50LCB1c2UgZnVuY3Rpb24ncyBuYW1lIHdpdGggdGhlIGxlYWRpbmcKLQkJIGNoYXIgcHJlcGVuZGVkLiAgKi8KLQkgICAgICBpZiAobGVhZGluZ19jaGFyKQotCQlhc3ByaW50ZiAoJmxhYmVsLCAiJWMlcyIsIGxlYWRpbmdfY2hhciwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQlsYWJlbCA9IG5hbWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBsYWJlbCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGRlbGltMiA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgbGFiZWwgPSB4c3RyZHVwIChsYWJlbCk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gZGVsaW0yOwotCX0KLQotICAgICAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfU1RBQlMpCi0Jc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMgKG5hbWUsIGxhYmVsKTsKLQotICAgICAgY3VycmVudF9uYW1lID0gbmFtZTsKLSAgICAgIGN1cnJlbnRfbGFiZWwgPSBsYWJlbDsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLXZvaWQgCi1zX2lnbm9yZSAoYXJnKQotICAgICBpbnQgYXJnOwotewotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0KLXZvaWQKLXJlYWRfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAicHNldWRvLW9wIHRhYmxlIiwgcG9faGFzaCk7Ci19Ci0KLS8qIGVuZCBvZiByZWFkLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9yZWFkLmggYi9nYXMvcmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNiMTAzLi4wMDAwMDAwCi0tLSBhL2dhcy9yZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogcmVhZC5oIC0gb2YgcmVhZC5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDkwLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7LyogLT4gY2hhciB3ZSBhcmUgcGFyc2luZyBub3cuICovCi0KLSNkZWZpbmUgUEVSTUlUX1dISVRFU1BBQ0UJLyogRGVmaW5lIHRvIG1ha2Ugd2hpdGVzcGFjZSBiZSBhbGxvd2VkIGluICovCi0vKiBtYW55IHN5bnRhY3RpY2FsbHkgdW5uZWNlc3NhcnkgcGxhY2VzLiAqLwotLyogTm9ybWFsbHkgdW5kZWZpbmVkLiBGb3IgY29tcGF0aWJpbGl0eSAqLwotLyogd2l0aCBhbmNpZW50IEdOVSBjYy4gKi8KLS8qICN1bmRlZiBQRVJNSVRfV0hJVEVTUEFDRSAqLwotCi0jaWZkZWYgUEVSTUlUX1dISVRFU1BBQ0UKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFKCkge2lmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpICsrIGlucHV0X2xpbmVfcG9pbnRlcjt9Ci0jZWxzZQotI2RlZmluZSBTS0lQX1dISVRFU1BBQ0UoKSBrbm93KCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnICkKLSNlbmRpZgotCi0KLSNkZWZpbmUJTEVYX05BTUUJKDEpCS8qIG1heSBjb250aW51ZSBhIG5hbWUgKi8KLSNkZWZpbmUgTEVYX0JFR0lOX05BTUUJKDIpCS8qIG1heSBiZWdpbiBhIG5hbWUgKi8KLSNkZWZpbmUgTEVYX0VORF9OQU1FCSg0KQkvKiBlbmRzIGEgbmFtZSAqLwotCi0jZGVmaW5lIGlzX25hbWVfYmVnaW5uZXIoYykgXAotICAoIGxleF90eXBlWyh1bnNpZ25lZCBjaGFyKSAoYyldICYgTEVYX0JFR0lOX05BTUUgKQotI2RlZmluZSBpc19wYXJ0X29mX25hbWUoYykgXAotICAoIGxleF90eXBlWyh1bnNpZ25lZCBjaGFyKSAoYyldICYgTEVYX05BTUUgICAgICAgKQotI2RlZmluZSBpc19uYW1lX2VuZGVyKGMpIFwKLSAgKCBsZXhfdHlwZVsodW5zaWduZWQgY2hhcikgKGMpXSAmIExFWF9FTkRfTkFNRSAgICkKLQotI2lmbmRlZiBpc19hX2NoYXIKLSNkZWZpbmUgQ0hBUl9NQVNLCSgweGZmKQotI2RlZmluZSBOT1RfQV9DSEFSCShDSEFSX01BU0srMSkKLSNkZWZpbmUgaXNfYV9jaGFyKGMpCSgoKHVuc2lnbmVkKShjKSkgPD0gQ0hBUl9NQVNLKQotI2VuZGlmIC8qIGlzX2FfY2hhcigpICovCi0KLWV4dGVybiBjaGFyIGxleF90eXBlW107Ci1leHRlcm4gY2hhciBpc19lbmRfb2ZfbGluZVtdOwotCi1leHRlcm4gaW50IGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlIENQVSBzcGVjaWZpYyB0YXJnZXQgZmlsZXMgKHRjLSouYykuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdOwotZXh0ZXJuIGNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW107Ci1leHRlcm4gY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdOwotCi0vKiBUYWJsZSBvZiAtSSBkaXJlY3Rvcmllcy4gICovCi1leHRlcm4gY2hhciAqKmluY2x1ZGVfZGlyczsKLWV4dGVybiBpbnQgaW5jbHVkZV9kaXJfY291bnQ7Ci1leHRlcm4gaW50IGluY2x1ZGVfZGlyX21heGxlbjsKLQotLyogVGhlIG9mZnNldCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi1leHRlcm4gYWRkcmVzc1QgYWJzX3NlY3Rpb25fb2Zmc2V0OwotCi0vKiBUaGUgbGFiZWwgb24gYSBsaW5lLCB1c2VkIGJ5IHNvbWUgb2YgdGhlIHBzZXVkby1vcHMuICAqLwotZXh0ZXJuIHN5bWJvbFMgKmxpbmVfbGFiZWw7Ci0KLS8qIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IE1SSSBjb21tb24gc2VjdGlvbnMuICAqLwotZXh0ZXJuIHN5bWJvbFMgKm1yaV9jb21tb25fc3ltYm9sOwotCi0vKiBQb3NzaWJsZSBhcmd1bWVudHMgdG8gLmxpbmtvbmNlLiAgKi8KLWVudW0gbGlua29uY2VfdHlwZQotewotICBMSU5LT05DRV9VTlNFVCA9IDAsCi0gIExJTktPTkNFX0RJU0NBUkQsCi0gIExJTktPTkNFX09ORV9PTkxZLAotICBMSU5LT05DRV9TQU1FX1NJWkUsCi0gIExJTktPTkNFX1NBTUVfQ09OVEVOVFMKLX07Ci0KLWV4dGVybiB2b2lkIHBvcF9pbnNlcnQgUEFSQU1TICgoY29uc3QgcHNldWRvX3R5cGVTICopKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X3N0YWJfc3RyaW5nX29mZnNldAotICBQQVJBTVMgKChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnN0YWJzdHJfc2VjbmFtZSkpOwotZXh0ZXJuIGNoYXIgKmRlbWFuZF9jb3B5X0Nfc3RyaW5nIFBBUkFNUyAoKGludCAqbGVuX3BvaW50ZXIpKTsKLWV4dGVybiBjaGFyIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yCi0gIFBBUkFNUyAoKGxvbmcgKnZhbF9wb2ludGVyKSk7Ci1leHRlcm4gb2Zmc2V0VCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5leHRfY2hhcl9vZl9zdHJpbmcgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc19tcmlfc2VjdCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiBjaGFyICptcmlfY29tbWVudF9maWVsZCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIG1yaV9jb21tZW50X2VuZCBQQVJBTVMgKChjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgYWRkX2luY2x1ZGVfZGlyIFBBUkFNUyAoKGNoYXIgKnBhdGgpKTsKLWV4dGVybiB2b2lkIGNvbnMgUEFSQU1TICgoaW50IG5ieXRlcykpOwotZXh0ZXJuIHZvaWQgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBlbWl0X2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotZXh0ZXJuIHZvaWQgZW1pdF9sZWIxMjhfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGVxdWFscyBQQVJBTVMgKChjaGFyICpzeW1fbmFtZSwgaW50IHJlYXNzaWduKSk7Ci1leHRlcm4gdm9pZCBmbG9hdF9jb25zIFBBUkFNUyAoKGludCBmbG9hdF90eXBlKSk7Ci1leHRlcm4gdm9pZCBpZ25vcmVfcmVzdF9vZl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGRpc2NhcmRfcmVzdF9vZl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgb3V0cHV0X2xlYjEyOCBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50IHNpZ24pKTsKLWV4dGVybiB2b2lkIHBzZXVkb19zZXQgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKLWV4dGVybiB2b2lkIHJlYWRfYV9zb3VyY2VfZmlsZSBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCByZWFkX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJlYWRfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLWV4dGVybiBpbnQgc2l6ZW9mX2xlYjEyOCBQQVJBTVMgKCh2YWx1ZVQsIGludCBzaWduKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gdm9pZCBnZW5lcmF0ZV9saW5lbm9fZGVidWcgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBzX2Fib3J0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19hbGlnbl9ieXRlcyBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2FsaWduX3B0d28gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2FwcF9maWxlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19hcHBfbGluZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfY29tbSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZGF0YSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZGVzYyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZWxzZSBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2VuZCBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2VuZGlmIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfZXJyIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19mYWlsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19maWxsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19mbG9hdF9zcGFjZSBQQVJBTVMgKChpbnQgbXVsdCkpOwotZXh0ZXJuIHZvaWQgc19mdW5jIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZG9fc19mdW5jIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBzX2dsb2JsIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWYgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZmMgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZmRlZiBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lmZXFzIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWdub3JlIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaW5jbHVkZSBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lycCBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2xjb21tIFBBUkFNUyAoKGludCBuZWVkc19hbGlnbikpOwotZXh0ZXJuIHZvaWQgc19sY29tbV9ieXRlcyBQQVJBTVMgKChpbnQgbmVlZHNfYWxpZ24pKTsKLWV4dGVybiB2b2lkIHNfbGViMTI4IFBBUkFNUyAoKGludCBzaWduKSk7Ci1leHRlcm4gdm9pZCBzX2xpbmtvbmNlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19sc3ltIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19tYWNybyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbWV4aXQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX21yaSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbXJpX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfb3JnIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19wcmludCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfcHVyZ2VtIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19yZXB0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19zZXQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3NwYWNlIFBBUkFNUyAoKGludCBtdWx0KSk7Ci1leHRlcm4gdm9pZCBzX3N0YWIgUEFSQU1TICgoaW50IHdoYXQpKTsKLWV4dGVybiB2b2lkIHNfc3RydWN0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc190ZXh0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc3RyaW5nZXIgUEFSQU1TICgoaW50IGFwcGVuZF96ZXJvKSk7Ci1leHRlcm4gdm9pZCBzX3hzdGFiIFBBUkFNUyAoKGludCB3aGF0KSk7Ci1leHRlcm4gdm9pZCBzX3J2YSBQQVJBTVMgKChpbnQpKTsKLQotLyogZW5kIG9mIHJlYWQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3NiLmMgYi9nYXMvc2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjMjNmYy4uMDAwMDAwMAotLS0gYS9nYXMvc2IuYworKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKiBzYi5jIC0gc3RyaW5nIGJ1ZmZlciBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKLSAgICAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzYi5oIgotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgYWJvdXQgbWFuaXB1bGF0aW5nIHN0cmluZ3MuCi0KLSAgIFRoZXkgYXJlIG1hbmFnZWQgaW4gdGhpbmdzIGNhbGxlZCBgc2IncyB3aGljaCBpcyBhbiBhYmJyZXZpYXRpb24KLSAgIGZvciBzdHJpbmcgYnVmZmVycy4gIEFuIHNiIGhhcyB0byBiZSBjcmVhdGVkLCB0aGluZ3MgY2FuIGJlIGdsdWVkCi0gICBvbiB0byBpdCwgYW5kIGF0IHRoZSBlbmQgb2YgaXQncyBsaWZlIGl0IHNob3VsZCBiZSBmcmVlZC4gIFRoZQotICAgY29udGVudHMgc2hvdWxkIG5ldmVyIGJlIHBvaW50ZWQgYXQgd2hpbHN0IGl0IGlzIHN0aWxsIGdyb3dpbmcsCi0gICBzaW5jZSBpdCBjb3VsZCBiZSBtb3ZlZCBhdCBhbnkgdGltZQotCi0gICBlZzoKLSAgIHNiX25ldyAoJmZvbyk7Ci0gICBzYl9ncm93Li4uICgmZm9vLC4uLik7Ci0gICB1c2UgZm9vLT5wdHJbKl07Ci0gICBzYl9raWxsICgmZm9vKTsKLQotKi8KLQotI2RlZmluZSBkc2l6ZSA1Ci0KLXN0YXRpYyB2b2lkIHNiX2NoZWNrIFBBUkFNUyAoKHNiICosIGludCkpOwotCi0vKiBTdGF0aXN0aWNzIG9mIHNiIHN0cnVjdHVyZXMuICAqLwotCi1pbnQgc3RyaW5nX2NvdW50W3NiX21heF9wb3dlcl90d29dOwotCi0vKiBGcmVlIGxpc3Qgb2Ygc2Igc3RydWN0dXJlcy4gICovCi0KLXN0YXRpYyBzYl9saXN0X3ZlY3RvciBmcmVlX2xpc3Q7Ci0KLS8qIGluaXRpYWxpemVzIGFuIHNiLiAqLwotCi12b2lkCi1zYl9idWlsZCAocHRyLCBzaXplKQotICAgICBzYiAqcHRyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgLyogc2VlIGlmIHdlIGNhbiBmaW5kIG9uZSB0byBhbGxvY2F0ZSAqLwotICBzYl9lbGVtZW50ICplOwotCi0gIGlmIChzaXplID4gc2JfbWF4X3Bvd2VyX3R3bykKLSAgICBhYm9ydCAoKTsKLQotICBlID0gZnJlZV9saXN0LnNpemVbc2l6ZV07Ci0gIGlmICghZSkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIHRoZXJlLCBhbGxvY2F0ZSBvbmUgYW5kIHN0aWNrIGludG8gdGhlIGZyZWUgbGlzdCAqLwotICAgICAgZSA9IChzYl9lbGVtZW50ICopIHhtYWxsb2MgKHNpemVvZiAoc2JfZWxlbWVudCkgKyAoMSA8PCBzaXplKSk7Ci0gICAgICBlLT5uZXh0ID0gZnJlZV9saXN0LnNpemVbc2l6ZV07Ci0gICAgICBlLT5zaXplID0gMSA8PCBzaXplOwotICAgICAgZnJlZV9saXN0LnNpemVbc2l6ZV0gPSBlOwotICAgICAgc3RyaW5nX2NvdW50W3NpemVdKys7Ci0gICAgfQotCi0gIC8qIHJlbW92ZSBmcm9tIGZyZWUgbGlzdCAqLwotCi0gIGZyZWVfbGlzdC5zaXplW3NpemVdID0gZS0+bmV4dDsKLQotICAvKiBjb3B5IGludG8gY2FsbGVycyB3b3JsZCAqLwotICBwdHItPnB0ciA9IGUtPmRhdGE7Ci0gIHB0ci0+cG90ID0gc2l6ZTsKLSAgcHRyLT5sZW4gPSAwOwotICBwdHItPml0ZW0gPSBlOwotfQotCi0KLXZvaWQKLXNiX25ldyAocHRyKQotICAgICBzYiAqcHRyOwotewotICBzYl9idWlsZCAocHRyLCBkc2l6ZSk7Ci19Ci0KLS8qIGRlYWxsb2NhdGUgdGhlIHNiIGF0IHB0ciAqLwotCi12b2lkCi1zYl9raWxsIChwdHIpCi0gICAgIHNiICpwdHI7Ci17Ci0gIC8qIHJldHVybiBpdGVtIHRvIGZyZWUgbGlzdCAqLwotICBwdHItPml0ZW0tPm5leHQgPSBmcmVlX2xpc3Quc2l6ZVtwdHItPnBvdF07Ci0gIGZyZWVfbGlzdC5zaXplW3B0ci0+cG90XSA9IHB0ci0+aXRlbTsKLX0KLQotLyogYWRkIHRoZSBzYiBhdCBzIHRvIHRoZSBlbmQgb2YgdGhlIHNiIGF0IHB0ciAqLwotCi12b2lkCi1zYl9hZGRfc2IgKHB0ciwgcykKLSAgICAgc2IgKnB0cjsKLSAgICAgc2IgKnM7Ci17Ci0gIHNiX2NoZWNrIChwdHIsIHMtPmxlbik7Ci0gIG1lbWNweSAocHRyLT5wdHIgKyBwdHItPmxlbiwgcy0+cHRyLCBzLT5sZW4pOwotICBwdHItPmxlbiArPSBzLT5sZW47Ci19Ci0KLS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBzYiBhdCBwdHIgaGFzIHJvb20gZm9yIGFub3RoZXIgbGVuIGNoYXJhY3RlcnMsCi0gICBhbmQgZ3JvdyBpdCBpZiBpdCBkb2Vzbid0LiAqLwotCi1zdGF0aWMgdm9pZAotc2JfY2hlY2sgKHB0ciwgbGVuKQotICAgICBzYiAqcHRyOwotICAgICBpbnQgbGVuOwotewotICBpZiAocHRyLT5sZW4gKyBsZW4gPj0gMSA8PCBwdHItPnBvdCkKLSAgICB7Ci0gICAgICBzYiB0bXA7Ci0gICAgICBpbnQgcG90ID0gcHRyLT5wb3Q7Ci0gICAgICB3aGlsZSAocHRyLT5sZW4gKyBsZW4gPj0gMSA8PCBwb3QpCi0JcG90Kys7Ci0gICAgICBzYl9idWlsZCAoJnRtcCwgcG90KTsKLSAgICAgIHNiX2FkZF9zYiAoJnRtcCwgcHRyKTsKLSAgICAgIHNiX2tpbGwgKHB0cik7Ci0gICAgICAqcHRyID0gdG1wOwotICAgIH0KLX0KLQotLyogbWFrZSB0aGUgc2IgYXQgcHRyIHBvaW50IGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gICovCi0KLXZvaWQKLXNiX3Jlc2V0IChwdHIpCi0gICAgIHNiICpwdHI7Ci17Ci0gIHB0ci0+bGVuID0gMDsKLX0KLQotLyogYWRkIGNoYXJhY3RlciBjIHRvIHRoZSBlbmQgb2YgdGhlIHNiIGF0IHB0ci4gKi8KLQotdm9pZAotc2JfYWRkX2NoYXIgKHB0ciwgYykKLSAgICAgc2IgKnB0cjsKLSAgICAgaW50IGM7Ci17Ci0gIHNiX2NoZWNrIChwdHIsIDEpOwotICBwdHItPnB0cltwdHItPmxlbisrXSA9IGM7Ci19Ci0KLS8qIGFkZCBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHMgdG8gdGhlIGVuZCBvZiBzYiBhdCBwdHIuICovCi0KLXZvaWQKLXNiX2FkZF9zdHJpbmcgKHB0ciwgcykKLSAgICAgc2IgKnB0cjsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaW50IGxlbiA9IHN0cmxlbiAocyk7Ci0gIHNiX2NoZWNrIChwdHIsIGxlbik7Ci0gIG1lbWNweSAocHRyLT5wdHIgKyBwdHItPmxlbiwgcywgbGVuKTsKLSAgcHRyLT5sZW4gKz0gbGVuOwotfQotCi0vKiBhZGQgc3RyaW5nIGF0IHMgb2YgbGVuZ3RoIGxlbiB0byBzYiBhdCBwdHIgKi8KLQotdm9pZAotc2JfYWRkX2J1ZmZlciAocHRyLCBzLCBsZW4pCi0gICAgIHNiICpwdHI7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBsZW47Ci17Ci0gIHNiX2NoZWNrIChwdHIsIGxlbik7Ci0gIG1lbWNweSAocHRyLT5wdHIgKyBwdHItPmxlbiwgcywgbGVuKTsKLSAgcHRyLT5sZW4gKz0gbGVuOwotfQotCi0vKiBwcmludCB0aGUgc2IgYXQgcHRyIHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotCi12b2lkCi1zYl9wcmludCAob3V0ZmlsZSwgcHRyKQotICAgICBGSUxFICpvdXRmaWxlOwotICAgICBzYiAqcHRyOwotewotICBpbnQgaTsKLSAgaW50IG5jID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgcHRyLT5sZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmMpCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQl9Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiJWQiLCBwdHItPnB0cltpXSk7Ci0gICAgICBuYyA9IDE7Ci0gICAgfQotfQotCi12b2lkIAotc2JfcHJpbnRfYXQgKG91dGZpbGUsIGlkeCwgcHRyKQotICAgICBGSUxFICpvdXRmaWxlOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqcHRyOwotewotICBpbnQgaTsKLSAgZm9yIChpID0gaWR4OyBpIDwgcHRyLT5sZW47IGkrKykKLSAgICBwdXRjIChwdHItPnB0cltpXSwgb3V0ZmlsZSk7Ci19Ci0KLS8qIHB1dCBhIG51bGwgYXQgdGhlIGVuZCBvZiB0aGUgc2IgYXQgaW4gYW5kIHJldHVybiB0aGUgc3RhcnQgb2YgdGhlCi0gICBzdHJpbmcsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgYW4gYXJnIHRvIHByaW50ZiAlcy4gKi8KLQotY2hhciAqCi1zYl9uYW1lIChpbikKLSAgICAgc2IgKmluOwotewotICAvKiBzdGljayBhIG51bGwgb24gdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCi0gIHNiX2FkZF9jaGFyIChpbiwgMCk7Ci0gIHJldHVybiBpbi0+cHRyOwotfQotCi0vKiBsaWtlIHNiX25hbWUsIGJ1dCBkb24ndCBpbmNsdWRlIHRoZSBudWxsIGJ5dGUgaW4gdGhlIHN0cmluZy4gICovCi0KLWNoYXIgKgotc2JfdGVybWluYXRlIChpbikKLSAgICAgc2IgKmluOwotewotICBzYl9hZGRfY2hhciAoaW4sIDApOwotICAtLWluLT5sZW47Ci0gIHJldHVybiBpbi0+cHRyOwotfQotCi0vKiBzdGFydCBhdCB0aGUgaW5kZXggaWR4IGludG8gdGhlIHN0cmluZyBpbiBzYiBhdCBwdHIgYW5kIHNraXAKLSAgIHdoaXRlc3BhY2UuIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbiB3aGl0ZXNwYWNlIGNoYXJhY3RlciAqLwotCi1pbnQKLXNiX3NraXBfd2hpdGUgKGlkeCwgcHRyKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqcHRyOwotewotICB3aGlsZSAoaWR4IDwgcHRyLT5sZW4KLQkgJiYgKHB0ci0+cHRyW2lkeF0gPT0gJyAnCi0JICAgICB8fCBwdHItPnB0cltpZHhdID09ICdcdCcpKQotICAgIGlkeCsrOwotICByZXR1cm4gaWR4OwotfQotCi0vKiBzdGFydCBhdCB0aGUgaW5kZXggaWR4IGludG8gdGhlIHNiIGF0IHB0ci4gc2tpcHMgd2hpdGVzcGFjZSwKLSAgIGEgY29tbWEgYW5kIGFueSBmb2xsb3dpbmcgd2hpdGVzcGFjZS4gcmV0dXJuZXMgdGhlIGluZGV4IG9mIHRoZQotICAgbmV4dCBjaGFyYWN0ZXIuICovCi0KLWludAotc2Jfc2tpcF9jb21tYSAoaWR4LCBwdHIpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpwdHI7Ci17Ci0gIHdoaWxlIChpZHggPCBwdHItPmxlbgotCSAmJiAocHRyLT5wdHJbaWR4XSA9PSAnICcKLQkgICAgIHx8IHB0ci0+cHRyW2lkeF0gPT0gJ1x0JykpCi0gICAgaWR4Kys7Ci0KLSAgaWYgKGlkeCA8IHB0ci0+bGVuCi0gICAgICAmJiBwdHItPnB0cltpZHhdID09ICcsJykKLSAgICBpZHgrKzsKLQotICB3aGlsZSAoaWR4IDwgcHRyLT5sZW4KLQkgJiYgKHB0ci0+cHRyW2lkeF0gPT0gJyAnCi0JICAgICB8fCBwdHItPnB0cltpZHhdID09ICdcdCcpKQotICAgIGlkeCsrOwotCi0gIHJldHVybiBpZHg7Ci19CmRpZmYgLS1naXQgYS9nYXMvc2IuaCBiL2dhcy9zYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZkYWYxLi4wMDAwMDAwCi0tLSBhL2dhcy9zYi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyogc2IuaCAtIGhlYWRlciBmaWxlIGZvciBzdHJpbmcgYnVmZmVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcwotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZuZGVmIFNCX0gKLQotI2RlZmluZSBTQl9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIHN0cmluZyBibG9ja3MKLQotICAgSSBoYWQgYSBjb3VwbGUgb2YgY2hvaWNlcyB3aGVuIGRlY2lkaW5nIHVwb24gdGhpcyBkYXRhIHN0cnVjdHVyZS4KLSAgIGdhcyB1c2VzIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIGZvciBhbGwgaXRzIGludGVybmFsIHdvcmsuICBUaGlzCi0gICBvZnRlbiBtZWFucyB0aGF0IHBhcnRzIG9mIHRoZSBwcm9ncmFtIHRoYXQgd2FudCB0byBleGFtaW5lCi0gICBzdWJzdHJpbmdzIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgZGF0YSBpbiB0aGUgc3RyaW5nIHRvIGRvIHRoZQotICAgcmlnaHQgdGhpbmcgKGEgY29tbW9uIG9wZXJhdGlvbiBpcyB0byBzaW5nbGUgb3V0IGEgYml0IG9mIHRleHQgYnkKLSAgIHNhdmluZyBhd2F5IHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQsIG51bGxpbmcgaXQgb3V0LCBvcGVyYXRpbmcgb24KLSAgIHRoZSBzdWJzdHJpbmcgYW5kIHRoZW4gcmVwbGFjaW5nIHRoZSBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVuZGVyIHRoZQotICAgbnVsbCkuICBUaGlzIGlzIGEgcGFpbiBhbmQgSSByZW1lbWJlciBhIGxvYWQgb2YgcHJvYmxlbXMgdGhhdCBJIGhhZCB3aXRoCi0gICBjb2RlIGluIGdhcyB3aGljaCBhbG1vc3QgZ290IHRoaXMgcmlnaHQuICBBbHNvLCBpdCdzIGhhcmRlciB0byBncm93IGFuZAotICAgYWxsb2NhdGUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MgZWZmaWNpZW50bHkuCi0KLSAgIE9ic3RhY2tzIHByb3ZpZGUgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG5lZWRlZCwgYnV0IGFyZSB0b28KLSAgIGNvbXBsaWNhdGVkLCBoZW5jZSB0aGUgc2IuCi0KLSAgIEFuIHNiIGlzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLCBhbmQgaXMgaW5pdGlhbHplZCB0byBwb2ludCB0byBhbgotICAgc2JfZWxlbWVudC4gIHNiX2VsZW1lbnRzIGFyZSBrZXB0IG9uIGEgZnJlZSBsaXN0cywgYW5kIHVzZWQgd2hlbgotICAgbmVlZGVkLCByZXBsYWNlZCBvbnRvIHRoZSBmcmVlIGxpc3Qgd2hlbiB1bnVzZWQuCi0gKi8KLQotI2RlZmluZSBzYl9tYXhfcG93ZXJfdHdvICAgIDMwCS8qIGRvbid0IGFsbG93IHN0cmluZ3MgbW9yZSB0aGFuCi0JCQkgICAgICAgICAgIDJec2JfbWF4X3Bvd2VyX3R3byBsb25nICovCi0vKiBzdHJ1Y3R1cmUgb2YgYW4gc2IgKi8KLXR5cGVkZWYgc3RydWN0IHNiCi0gIHsKLSAgICBjaGFyICpwdHI7CQkJLyogcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAqLwotICAgIGludCBsZW47CQkJLyogaG93IG11Y2ggaXMgdXNlZC4gKi8KLSAgICBpbnQgcG90OwkJCS8qIHRoZSBtYXhpbXVtIGxlbmd0aCBpcyAxPDxwb3QgKi8KLSAgICBzdHJ1Y3QgbGUgKml0ZW07Ci0gIH0KLXNiOwotCi0vKiBTdHJ1Y3R1cmUgb2YgdGhlIGZyZWUgbGlzdCBvYmplY3Qgb2YgYW4gc2IgKi8KLXR5cGVkZWYgc3RydWN0IGxlCi0gIHsKLSAgICBzdHJ1Y3QgbGUgKm5leHQ7Ci0gICAgaW50IHNpemU7Ci0gICAgY2hhciBkYXRhWzFdOwotICB9Ci1zYl9lbGVtZW50OwotCi0vKiBUaGUgZnJlZSBsaXN0ICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc2JfZWxlbWVudCAqc2l6ZVtzYl9tYXhfcG93ZXJfdHdvXTsKLSAgfSBzYl9saXN0X3ZlY3RvcjsKLQotZXh0ZXJuIGludCBzdHJpbmdfY291bnRbc2JfbWF4X3Bvd2VyX3R3b107Ci0KLWV4dGVybiB2b2lkIHNiX2J1aWxkIFBBUkFNUyAoKHNiICosIGludCkpOwotZXh0ZXJuIHZvaWQgc2JfbmV3IFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiB2b2lkIHNiX2tpbGwgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIHZvaWQgc2JfYWRkX3NiIFBBUkFNUyAoKHNiICosIHNiICopKTsKLWV4dGVybiB2b2lkIHNiX3Jlc2V0IFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiB2b2lkIHNiX2FkZF9jaGFyIFBBUkFNUyAoKHNiICosIGludCkpOwotZXh0ZXJuIHZvaWQgc2JfYWRkX3N0cmluZyBQQVJBTVMgKChzYiAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHNiX2FkZF9idWZmZXIgUEFSQU1TICgoc2IgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIHNiX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgc2IgKikpOwotZXh0ZXJuIHZvaWQgc2JfcHJpbnRfYXQgUEFSQU1TICgoRklMRSAqLCBpbnQsIHNiICopKTsKLWV4dGVybiBjaGFyICpzYl9uYW1lIFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiBjaGFyICpzYl90ZXJtaW5hdGUgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIGludCBzYl9za2lwX3doaXRlIFBBUkFNUyAoKGludCwgc2IgKikpOwotZXh0ZXJuIGludCBzYl9za2lwX2NvbW1hIFBBUkFNUyAoKGludCwgc2IgKikpOwotCi0vKiBBY3R1YWxseSBpbiBpbnB1dC1zY3J1Yi5jLiAgKi8KLWV4dGVybiB2b2lkIGlucHV0X3NjcnViX2luY2x1ZGVfc2IgUEFSQU1TICgoc2IgKiwgY2hhciAqKSk7Ci0KLSNlbmRpZiAvKiBTQl9IICovCmRpZmYgLS1naXQgYS9nYXMvc3RhYnMuYyBiL2dhcy9zdGFicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ0NjU1Li4wMDAwMDAwCi0tLSBhL2dhcy9zdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLS8qIEdlbmVyaWMgc3RhYnMgcGFyc2luZyBmb3IgZ2FzLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi1vciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotLyogV2UgbmVlZCB0aGlzLCBkZXNwaXRlIHRoZSBhcHBhcmVudCBvYmplY3QgZm9ybWF0IGRlcGVuZGVuY3ksIHNpbmNlCi0gICBpdCBkZWZpbmVzIHN0YWIgdHlwZXMsIHdoaWNoIGFsbCBvYmplY3QgZm9ybWF0cyBjYW4gdXNlIG5vdy4gKi8KLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotc3RhdGljIHZvaWQgc19zdGFiX2dlbmVyaWMgUEFSQU1TICgoaW50LCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfYXNtX2ZpbGUgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLQotLyogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIG5hbWVzIHVzZWQgZm9yIHRoZSBzdGFiIHNlY3Rpb25zLiAgKi8KLSNpZm5kZWYgU1RBQl9TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TRUNUSU9OX05BTUUgIi5zdGFiIgotI2VuZGlmCi0KLSNpZm5kZWYgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSAiLnN0YWJzdHIiCi0jZW5kaWYKLQotLyogTm9uLXplcm8gaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIC5mdW5jIGZ1bmN0aW9uLCBpbiB3aGljaCBjYXNlCi0gICBzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vIGVtaXRzIGZ1bmN0aW9uIHJlbGF0aXZlIGxpbmUgbnVtYmVyIHN0YWJzLgotICAgT3RoZXJ3aXNlIGl0IGVtaXRzIGxpbmUgbnVtYmVyIHN0YWJzIHdpdGggYWJzb2x1dGUgYWRkcmVzc2VzLiAgTm90ZSB0aGF0Ci0gICBib3RoIGNhc2VzIG9ubHkgYXBwbHkgdG8gYXNzZW1ibGVyIGNvZGUgYXNzZW1ibGVkIHdpdGggLWdzdGFicy4gICovCi1zdGF0aWMgaW50IGluX2RvdF9mdW5jX3A7Ci0KLS8qIExhYmVsIGF0IHN0YXJ0IG9mIGN1cnJlbnQgZnVuY3Rpb24gaWYgaW5fZG90X2Z1bmNfcCAhPSAwLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjdXJyZW50X2Z1bmN0aW9uX2xhYmVsOwotCi0vKgotICogSGFuZGxlIC5zdGFiWCBkaXJlY3RpdmVzLCB3aGljaCB1c2VkIHRvIGJlIG9wZW4tY29kZWQuCi0gKiBTbyBtdWNoIGNyZWVwaW5nIGZlYXR1cmlzbSBvdmVybG9hZGVkIHRoZSBzZW1hbnRpY3MgdGhhdCB3ZSBkZWNpZGVkCi0gKiB0byBwdXQgYWxsIC5zdGFiWCB0aGlua2luZyBpbiBvbmUgcGxhY2UuIEhlcmUuCi0gKgotICogV2UgdHJ5IHRvIG1ha2UgYW55IC5zdGFiWCBkaXJlY3RpdmUgbGVnYWwuIE90aGVyIHBlb3BsZSdzIEFTIHdpbGwgb2Z0ZW4KLSAqIGRvIGFzc2VtYmx5LXRpbWUgY29uc2lzdGVuY3kgY2hlY2tzOiBlZyBhc3NpZ25pbmcgbWVhbmluZyB0byBuX3R5cGUgYml0cwotICogYW5kICJwcm90ZWN0aW5nIiB5b3UgZnJvbSBzZXR0aW5nIHRoZW0gdG8gY2VydGFpbiB2YWx1ZXMuIChUaGV5IGFsc28gemVybwotICogY2VydGFpbiBiaXRzIGJlZm9yZSBlbWl0dGluZyBzeW1ib2xzLiBUdXQgdHV0LikKLSAqCi0gKiBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBhYnNvbHV0ZSB3ZSBlaXRoZXIgZ3JpcGUgb3IgdXNlIHRoZSByZWxvY2F0aW9uCi0gKiBpbmZvcm1hdGlvbi4gT3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycyBzaWxlbnRseSBmb3JnZXQgaW5mb3JtYXRpb24gdGhleQotICogZG9uJ3QgbmVlZCBhbmQgaW52ZW50IGluZm9ybWF0aW9uIHRoZXkgbmVlZCB0aGF0IHlvdSBkaWRuJ3Qgc3VwcGx5LgotICovCi0KLS8qCi0gKiBCdWlsZCBhIHN0cmluZyBkaWN0aW9uYXJ5IGVudHJ5IGZvciBhIC5zdGFiWCBzeW1ib2wuCi0gKiBUaGUgc3ltYm9sIGlzIGFkZGVkIHRvIHRoZSAuPHNlY25hbWU+c3RyIHNlY3Rpb24uCi0gKi8KLQotI2lmbmRlZiBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMAotI2VuZGlmCi0KLXVuc2lnbmVkIGludAotZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoc3RyaW5nLCBzdGFic3RyX3NlY25hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgY29uc3QgY2hhciAqc3RhYnN0cl9zZWNuYW1lOwotewotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgcmV0dmFsOwotICBzZWdUIHNhdmVfc2VnOwotICBzdWJzZWdUIHNhdmVfc3Vic2VnOwotICBzZWdUIHNlZzsKLSAgY2hhciAqcDsKLQotICBpZiAoISBTRVBBUkFURV9TVEFCX1NFQ1RJT05TKQotICAgIGFib3J0ICgpOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoc3RyaW5nKTsKLQotICBzYXZlX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICAvKiBDcmVhdGUgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24uICAqLwotICBzZWcgPSBzdWJzZWdfbmV3IChzdGFic3RyX3NlY25hbWUsIDApOwotCi0gIHJldHZhbCA9IHNlZ19pbmZvIChzZWcpLT5zdGFidS5zdGFiX3N0cmluZ19zaXplOwotICBpZiAocmV0dmFsIDw9IDApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaXJzdCBzdHJpbmcgaXMgZW1wdHkuICAqLwotICAgICAgcCA9IGZyYWdfbW9yZSAoMSk7Ci0gICAgICAqcCA9IDA7Ci0gICAgICByZXR2YWwgPSBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZSA9IDE7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywgU0VDX1JFQURPTkxZIHwgU0VDX0RFQlVHR0lORyk7Ci0gICAgICBpZiAoc2VnLT5uYW1lID09IHN0YWJzdHJfc2VjbmFtZSkKLQlzZWctPm5hbWUgPSB4c3RyZHVwIChzdGFic3RyX3NlY25hbWUpOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChsZW5ndGggPiAwKQotICAgIHsJCQkJLyogT3JkaW5hcnkgY2FzZS4gKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOwotICAgICAgc3RyY3B5IChwLCBzdHJpbmcpOwotCi0gICAgICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZSArPSBsZW5ndGggKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHJldHZhbCA9IDA7Ci0KLSAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0jaWZkZWYgQU9VVF9TVEFCUwotI2lmbmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0jZGVmaW5lIE9CSl9QUk9DRVNTX1NUQUIoU0VHLFcsUyxULE8sRCkJYW91dF9wcm9jZXNzX3N0YWIoVyxTLFQsTyxEKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGFvdXRfcHJvY2Vzc19zdGFiIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1hb3V0X3Byb2Nlc3Nfc3RhYiAod2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykKLSAgICAgaW50IHdoYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHR5cGUsIG90aGVyLCBkZXNjOwotewotICAvKiBQdXQgdGhlIHN0YWIgaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICAvKiBDcmVhdGUgdGhlIHN5bWJvbCBub3csIGJ1dCBvbmx5IGluc2VydCBpdCBpbnRvIHRoZSBzeW1ib2wgY2hhaW4KLSAgICAgYWZ0ZXIgYW55IHN5bWJvbHMgbWVudGlvbmVkIGluIHRoZSB2YWx1ZSBleHByZXNzaW9uIGdldCBpbnRvIHRoZQotICAgICBzeW1ib2wgY2hhaW4uICBUaGlzIGlzIHRvIGF2b2lkICJjb250aW51YXRpb24gc3ltYm9scyIgKHdoZXJlIG9uZQotICAgICBlbmRzIGluICJcIiBhbmQgdGhlIGRlYnVnIGluZm8gaXMgY29udGludWVkIGluIHRoZSBuZXh0IC5zdGFicwotICAgICBkaXJlY3RpdmUpIGZyb20gYmVpbmcgc2VwYXJhdGVkIGJ5IG90aGVyIHJhbmRvbSBzeW1ib2xzLiAgKi8KLSAgc3ltYm9sID0gc3ltYm9sX2NyZWF0ZSAoc3RyaW5nLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwKLQkJCSAgKHN0cnVjdCBmcmFnICopIE5VTEwpOwotICBpZiAod2hhdCA9PSAncycgfHwgd2hhdCA9PSAnbicpCi0gICAgewotICAgICAgLyogUGljayB1cCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbGluZS4gICovCi0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHBzZXVkb19zZXQgKHN5bWJvbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogLnN0YWJkIHNldHMgdGhlIG5hbWUgdG8gTlVMTC4gIFdoeT8gICovCi0gICAgICBTX1NFVF9OQU1FIChzeW1ib2wsIE5VTEwpOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2wsIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2wsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgfQotCi0gIHN5bWJvbF9hcHBlbmQgKHN5bWJvbCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotICBTX1NFVF9UWVBFIChzeW1ib2wsIHR5cGUpOwotICBTX1NFVF9PVEhFUiAoc3ltYm9sLCBvdGhlcik7Ci0gIFNfU0VUX0RFU0MgKHN5bWJvbCwgZGVzYyk7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBjYW4gaGFuZGxlIGRpZmZlcmVudCBraW5kcyBvZiBzdGFicyAocyxuLGQpIGFuZCBkaWZmZXJlbnQKLSAgIGtpbmRzIG9mIHN0YWIgc2VjdGlvbnMuICovCi0KLXN0YXRpYyB2b2lkIAotc19zdGFiX2dlbmVyaWMgKHdoYXQsIHN0YWJfc2VjbmFtZSwgc3RhYnN0cl9zZWNuYW1lKQotICAgICBpbnQgd2hhdDsKLSAgICAgY2hhciAqc3RhYl9zZWNuYW1lOwotICAgICBjaGFyICpzdGFic3RyX3NlY25hbWU7Ci17Ci0gIGxvbmcgbG9uZ2ludDsKLSAgY2hhciAqc3RyaW5nOwotICBpbnQgdHlwZTsKLSAgaW50IG90aGVyOwotICBpbnQgZGVzYzsKLQotICAvKiBUaGUgZ2VuZXJhbCBmb3JtYXQgaXM6Ci0gICAgIC5zdGFicyAiU1RSSU5HIixUWVBFLE9USEVSLERFU0MsVkFMVUUKLSAgICAgLnN0YWJuIFRZUEUsT1RIRVIsREVTQyxWQUxVRQotICAgICAuc3RhYmQgVFlQRSxPVEhFUixERVNDCi0gICAgIEF0IHRoaXMgcG9pbnQgaW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyBhZnRlciB0aGUgcHNldWRvLW9wIGFuZAotICAgICBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZS4gIFRoZSBhcmd1bWVudCB3aGF0IGlzIG9uZSBvZiAncycsICduJyBvcgotICAgICAnZCcgaW5kaWNhdGluZyB3aGljaCB0eXBlIG9mIC5zdGFiIHRoaXMgaXMuICAqLwotCi0gIGlmICh3aGF0ICE9ICdzJykKLSAgICBzdHJpbmcgPSAiIjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSAgICAgIHN0cmluZyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuZ3RoKTsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc193YXJuIChfKCIuc3RhYnM6IE1pc3NpbmcgY29tbWEiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmbG9uZ2ludCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiKSwgd2hhdCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgdHlwZSA9IGxvbmdpbnQ7Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmbG9uZ2ludCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiKSwgd2hhdCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgb3RoZXIgPSBsb25naW50OwotCi0gIGRlc2MgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQotICAgIHsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBhc193YXJuIChfKCIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIiksIHdoYXQpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0KLSNpZmRlZiBUQ19QUEMKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFNvbGFyaXMgb24gUG93ZXJQQyBoYXMgZGVjaWRlZCB0aGF0IC5zdGFiZCBjYW4gdGFrZSA0IGFyZ3VtZW50cywgc28gaWYgd2Ugd2VyZQotICAgICBnaXZlbiA0IGFyZ3VtZW50cywgbWFrZSBpdCBhIC5zdGFibiAqLwotICBlbHNlIGlmICh3aGF0ID09ICdkJykKLSAgICB7Ci0gICAgICBjaGFyICpzYXZlX2xvY2F0aW9uID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB3aGF0ID0gJ24nOwotCX0KLSAgICAgIGVsc2UKLQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2xvY2F0aW9uOwotICAgIH0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0jZW5kaWYgLyogVENfUFBDICovCi0KLSNpZm5kZWYgTk9fTElTVElORwotICBpZiAobGlzdGluZykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgTl9TTElORToKLQkgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGRlc2MpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NPOgotCWNhc2UgTl9TT0w6Ci0JICBsaXN0aW5nX3NvdXJjZV9maWxlIChzdHJpbmcpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiAhIE5PX0xJU1RJTkcgKi8KLQotICAvKiBXZSBoYXZlIG5vdyBnYXRoZXJlZCB0aGUgdHlwZSwgb3RoZXIsIGFuZCBkZXNjIGluZm9ybWF0aW9uLiAgRm9yCi0gICAgIC5zdGFicyBvciAuc3RhYm4sIGlucHV0X2xpbmVfcG9pbnRlciBpcyBub3cgcG9pbnRpbmcgYXQgdGhlCi0gICAgIHZhbHVlLiAgKi8KLQotICBpZiAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUykKLSAgICAvKiBPdXRwdXQgdGhlIHN0YWIgaW5mb3JtYXRpb24gaW4gYSBzZXBhcmF0ZSBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkCi0gICAgICAgYXQgbGVhc3QgZm9yIENPRkYgYW5kIEVMRi4gICovCi0gICAgewotICAgICAgc2VnVCBzYXZlZF9zZWcgPSBub3dfc2VnOwotICAgICAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgZnJhZ1MgKnNhdmVkX2ZyYWcgPSBmcmFnX25vdzsKLSAgICAgIHZhbHVlVCBkb3Q7Ci0gICAgICBzZWdUIHNlZzsKLSAgICAgIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICBzdGF0aWMgc2VnVCBjYWNoZWRfc2VjOwotICAgICAgc3RhdGljIGNoYXIgKmNhY2hlZF9zZWNuYW1lOwotCi0gICAgICBkb3QgPSBmcmFnX25vd19maXggKCk7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICAgICAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGNhY2hlZF9zZWNuYW1lICYmICFzdHJjbXAgKGNhY2hlZF9zZWNuYW1lLCBzdGFiX3NlY25hbWUpKQotCXsKLQkgIHNlZyA9IGNhY2hlZF9zZWM7Ci0JICBzdWJzZWdfc2V0IChzZWcsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzZWcgPSBzdWJzZWdfbmV3IChzdGFiX3NlY25hbWUsIDApOwotCSAgaWYgKGNhY2hlZF9zZWNuYW1lKQotCSAgICBmcmVlIChjYWNoZWRfc2VjbmFtZSk7Ci0JICBjYWNoZWRfc2VjbmFtZSA9IHhzdHJkdXAgKHN0YWJfc2VjbmFtZSk7Ci0JICBjYWNoZWRfc2VjID0gc2VnOwotCX0KLQotICAgICAgaWYgKCEgc2VnX2luZm8gKHNlZyktPmhhZG9uZSkKLQl7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCQkgU0VDX1JFQURPTkxZIHwgU0VDX1JFTE9DIHwgU0VDX0RFQlVHR0lORyk7Ci0jZW5kaWYKLSNpZmRlZiBJTklUX1NUQUJfU0VDVElPTgotCSAgSU5JVF9TVEFCX1NFQ1RJT04gKHNlZyk7Ci0jZW5kaWYKLQkgIHNlZ19pbmZvIChzZWcpLT5oYWRvbmUgPSAxOwotCX0KLQotICAgICAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoc3RyaW5nLCBzdGFic3RyX3NlY25hbWUpOwotICAgICAgaWYgKHdoYXQgPT0gJ3MnKQotCXsKLQkgIC8qIHJlbGVhc2UgdGhlIHN0cmluZyAqLwotCSAgb2JzdGFja19mcmVlICgmbm90ZXMsIHN0cmluZyk7Ci0JfQotCi0gICAgICAvKiBBdCBsZWFzdCBmb3Igbm93LCBzdGFicyBpbiBhIHNwZWNpYWwgc3RhYiBzZWN0aW9uIGFyZSBhbHdheXMKLQkgb3V0cHV0IGFzIDEyIGJ5dGUgYmxvY2tzIG9mIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKDgpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBzdHJvZmYsIDQpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNCwgKHZhbHVlVCkgdHlwZSwgMSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyA1LCAodmFsdWVUKSBvdGhlciwgMSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyA2LCAodmFsdWVUKSBkZXNjLCAyKTsKLQotICAgICAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQotCXsKLQkgIC8qIFBpY2sgdXAgdGhlIHZhbHVlIGZyb20gdGhlIGlucHV0IGxpbmUuICAqLwotCSAgY29ucyAoNCk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqZmFrZTsKLQkgIHN5bWJvbFMgKnN5bWJvbDsKLQkgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgLyogQXJyYW5nZSBmb3IgYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbG9jYXRpb24uICAqLwotCSAgZmFrZSA9IEZBS0VfTEFCRUxfTkFNRTsKLQkgIHN5bWJvbCA9IHN5bWJvbF9uZXcgKGZha2UsIHNhdmVkX3NlZywgZG90LCBzYXZlZF9mcmFnKTsKLQotCSAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cC5YX2FkZF9zeW1ib2wgPSBzeW1ib2w7Ci0JICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLQotCSAgZW1pdF9leHByICgmZXhwLCA0KTsKLQl9Ci0KLSNpZmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0gICAgICBPQkpfUFJPQ0VTU19TVEFCIChzZWcsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpOwotI2VuZGlmCi0KLSAgICAgIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgT0JKX1BST0NFU1NfU1RBQgotICAgICAgT0JKX1BST0NFU1NfU1RBQiAoMCwgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYyk7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUmVndWxhciBzdGFiIGRpcmVjdGl2ZS4gKi8KLQotdm9pZAotc19zdGFiICh3aGF0KQotICAgICBpbnQgd2hhdDsKLXsKLSAgc19zdGFiX2dlbmVyaWMgKHdoYXQsIFNUQUJfU0VDVElPTl9OQU1FLCBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUpOwotfQotCi0vKiAiRXh0ZW5kZWQgc3RhYnMiLCB1c2VkIGluIFNvbGFyaXMgb25seSBub3cuICovCi0KLXZvaWQKLXNfeHN0YWIgKHdoYXQpCi0gICAgIGludCB3aGF0OwotewotICBpbnQgbGVuZ3RoOwotICBjaGFyICpzdGFiX3NlY25hbWUsICpzdGFic3RyX3NlY25hbWU7Ci0gIHN0YXRpYyBjaGFyICpzYXZlZF9zZWNuYW1lLCAqc2F2ZWRfc3Ryc2VjbmFtZTsKLQotICAvKiBAQCBNRU1PUlkgTEVBSzogVGhpcyBhbGxvY2F0ZXMgYSBjb3B5IG9mIHRoZSBzdHJpbmcsIGJ1dCBpbiBtb3N0Ci0gICAgIGNhc2VzIGl0IHdpbGwgYmUgdGhlIHNhbWUgc3RyaW5nLCBzbyB3ZSBjb3VsZCByZWxlYXNlIHRoZSBzdG9yYWdlCi0gICAgIGJhY2sgdG8gdGhlIG9ic3RhY2sgaXQgY2FtZSBmcm9tLiAgKi8KLSAgc3RhYl9zZWNuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW5ndGgpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY29tbWEgbWlzc2luZyBpbiAueHN0YWJzIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVG8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uLCBzaW1wbHkgYWRkICJzdHIiIHRvCi0gICAgIHRoZSBzdGFiIHNlY3Rpb24gbmFtZS4gICovCi0gIGlmIChzYXZlZF9zZWNuYW1lID09IDAgfHwgc3RyY21wIChzYXZlZF9zZWNuYW1lLCBzdGFiX3NlY25hbWUpKQotICAgIHsKLSAgICAgIHN0YWJzdHJfc2VjbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RhYl9zZWNuYW1lKSArIDQpOwotICAgICAgc3RyY3B5IChzdGFic3RyX3NlY25hbWUsIHN0YWJfc2VjbmFtZSk7Ci0gICAgICBzdHJjYXQgKHN0YWJzdHJfc2VjbmFtZSwgInN0ciIpOwotICAgICAgaWYgKHNhdmVkX3NlY25hbWUpCi0JewotCSAgZnJlZSAoc2F2ZWRfc2VjbmFtZSk7Ci0JICBmcmVlIChzYXZlZF9zdHJzZWNuYW1lKTsKLQl9Ci0gICAgICBzYXZlZF9zZWNuYW1lID0gc3RhYl9zZWNuYW1lOwotICAgICAgc2F2ZWRfc3Ryc2VjbmFtZSA9IHN0YWJzdHJfc2VjbmFtZTsKLSAgICB9Ci0gIHNfc3RhYl9nZW5lcmljICh3aGF0LCBzYXZlZF9zZWNuYW1lLCBzYXZlZF9zdHJzZWNuYW1lKTsKLX0KLQotI2lmZGVmIFNfU0VUX0RFU0MKLQotLyogRnJvYiBpbnZlbnRlZCBhdCBSTVMnIHJlcXVlc3QuIFNldCB0aGUgbl9kZXNjIG9mIGEgc3ltYm9sLiAgKi8KLQotdm9pZCAKLXNfZGVzYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCB0ZW1wOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKnAgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgICpwID0gMDsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIHRlbXApOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19kZXNjKCkgKi8KLQotI2VuZGlmIC8qIGRlZmluZWQgKFNfU0VUX0RFU0MpICovCi0KLS8qIEdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgdGhlIG1haW4gc291cmNlIGZpbGUuICAqLwotCi12b2lkCi1zdGFic19nZW5lcmF0ZV9hc21fZmlsZSAoKQotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmVubyk7Ci0gIGdlbmVyYXRlX2FzbV9maWxlIChOX1NPLCBmaWxlKTsKLX0KLQotLyogR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSB0aGUgc291cmNlIGZpbGUuCi0gICBUWVBFIGlzIG9uZSBvZiBOX1NPLCBOX1NPTC4gICovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9hc21fZmlsZSAodHlwZSwgZmlsZSkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmZpbGU7Ci17Ci0gIHN0YXRpYyBjaGFyICpsYXN0X2ZpbGU7Ci0gIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7Ci0gIGNoYXIgKmhvbGQ7Ci0gIGNoYXIgYnVmWzEwMF07Ci0gIGNoYXIgc3ltWzMwXTsKLQotICAvKiBSYXRoZXIgdGhhbiB0cnkgdG8gZG8gdGhpcyBpbiBzb21lIGVmZmljaWVudCBmYXNoaW9uLCB3ZSBqdXN0Ci0gICAgIGdlbmVyYXRlIGEgc3RyaW5nIGFuZCB0aGVuIHBhcnNlIGl0IGFnYWluLiAgVGhhdCBsZXRzIHVzIHVzZSB0aGUKLSAgICAgZXhpc3Rpbmcgc3RhYnMgaG9vaywgd2hpY2ggZXhwZWN0IHRvIHNlZSBhIHN0cmluZywgcmF0aGVyIHRoYW4KLSAgICAgaW52ZW50aW5nIG5ldyBvbmVzLiAgKi8KLQotICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChsYXN0X2ZpbGUgPT0gTlVMTAotICAgICAgfHwgc3RyY21wIChsYXN0X2ZpbGUsIGZpbGUpICE9IDApCi0gICAgewotICAgICAgc3ByaW50ZiAoc3ltLCAiJXNGJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KTsKLSAgICAgICsrbGFiZWxfY291bnQ7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlwiJXNcIiwlZCwwLDAsJXNcbiIsIGZpbGUsIHR5cGUsIHN5bSk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gICAgICBzX3N0YWIgKCdzJyk7Ci0gICAgICBjb2xvbiAoc3ltKTsKLQotICAgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQotCWZyZWUgKGxhc3RfZmlsZSk7Ci0gICAgICBsYXN0X2ZpbGUgPSB4c3RyZHVwIChmaWxlKTsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLX0KLQotLyogR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBsaW5lLiAgVGhpcyBpcwotICAgdXNlZCB0byBwcm9kdWNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibGVyIGZpbGUuICAqLwotCi12b2lkCi1zdGFic19nZW5lcmF0ZV9hc21fbGluZW5vICgpCi17Ci0gIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7Ci0gIGNoYXIgKmhvbGQ7Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBzeW1bMzBdOwotCi0gIC8qIFJhdGhlciB0aGFuIHRyeSB0byBkbyB0aGlzIGluIHNvbWUgZWZmaWNpZW50IGZhc2hpb24sIHdlIGp1c3QKLSAgICAgZ2VuZXJhdGUgYSBzdHJpbmcgYW5kIHRoZW4gcGFyc2UgaXQgYWdhaW4uICBUaGF0IGxldHMgdXMgdXNlIHRoZQotICAgICBleGlzdGluZyBzdGFicyBob29rLCB3aGljaCBleHBlY3QgdG8gc2VlIGEgc3RyaW5nLCByYXRoZXIgdGhhbgotICAgICBpbnZlbnRpbmcgbmV3IG9uZXMuICAqLwotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZW5vKTsKLQotICBnZW5lcmF0ZV9hc21fZmlsZSAoTl9TT0wsIGZpbGUpOwotCi0gIHNwcmludGYgKHN5bSwgIiVzTCVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCk7Ci0gICsrbGFiZWxfY291bnQ7Ci0KLSAgaWYgKGluX2RvdF9mdW5jX3ApCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgYWxsb2NhICgxMDAgKyBzdHJsZW4gKGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwpKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVkLDAsJWQsJXMtJXNcbiIsIE5fU0xJTkUsIGxpbmVubywKLQkgICAgICAgc3ltLCBjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKDEwMCk7Ci0gICAgICBzcHJpbnRmIChidWYsICIlZCwwLCVkLCVzXG4iLCBOX1NMSU5FLCBsaW5lbm8sIHN5bSk7Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gIHNfc3RhYiAoJ24nKTsKLSAgY29sb24gKHN5bSk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLX0KLQotLyogRW1pdCBhIGZ1bmN0aW9uIHN0YWIuCi0gICBBbGwgYXNzZW1ibGVyIGZ1bmN0aW9ucyBhcmUgYXNzdW1lZCB0byBoYXZlIHJldHVybiB0eXBlIGB2b2lkJy4gICovCi0KLXZvaWQKLXN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jIChmdW5jbmFtZSwgc3RhcnRsYWJuYW1lKQotICAgICBjb25zdCBjaGFyICpmdW5jbmFtZTsKLSAgICAgY29uc3QgY2hhciAqc3RhcnRsYWJuYW1lOwotewotICBzdGF0aWMgaW50IHZvaWRfZW1pdHRlZF9wOwotICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0KLSAgaWYgKCEgdm9pZF9lbWl0dGVkX3ApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gIlwidm9pZDp0MT0xXCIsMTI4LDAsMCwwIjsKLSAgICAgIHNfc3RhYiAoJ3MnKTsKLSAgICAgIHZvaWRfZW1pdHRlZF9wID0gMTsKLSAgICB9Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZW5vKTsKLSAgYXNwcmludGYgKCZidWYsICJcIiVzOkYxXCIsJWQsMCwlZCwlcyIsCi0JICAgIGZ1bmNuYW1lLCBOX0ZVTiwgbGluZW5vICsgMSwgc3RhcnRsYWJuYW1lKTsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmOwotICBzX3N0YWIgKCdzJyk7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLSAgY3VycmVudF9mdW5jdGlvbl9sYWJlbCA9IHhzdHJkdXAgKHN0YXJ0bGFibmFtZSk7Ci0gIGluX2RvdF9mdW5jX3AgPSAxOwotfQotCi0vKiBFbWl0IGEgc3RhYiB0byByZWNvcmQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLiAgKi8KLQotdm9pZAotc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgKGZ1bmNuYW1lLCBzdGFydGxhYm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lOwotICAgICBjb25zdCBjaGFyICpzdGFydGxhYm5hbWU7Ci17Ci0gIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7Ci0gIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBzeW1bMzBdOwotCi0gIHNwcmludGYgKHN5bSwgIiVzZW5kZnVuYyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCk7Ci0gICsrbGFiZWxfY291bnQ7Ci0gIGNvbG9uIChzeW0pOwotCi0gIGFzcHJpbnRmICgmYnVmLCAiXCJcIiwlZCwwLDAsJXMtJXMiLCBOX0ZVTiwgc3ltLCBzdGFydGxhYm5hbWUpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gIHNfc3RhYiAoJ3MnKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotICBpbl9kb3RfZnVuY19wID0gMDsKLSAgY3VycmVudF9mdW5jdGlvbl9sYWJlbCA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9nYXMvc3RhbXAtaC5pbiBiL2dhcy9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2dhcy9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9nYXMvc3RydWMtc3ltYm9sLmggYi9nYXMvc3RydWMtc3ltYm9sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzM1NjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3N0cnVjLXN5bWJvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qIHN0cnVjdF9zeW1ib2wuaCAtIEludGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9fc3RydWNfc3ltYm9sX2hfXwotI2RlZmluZSBfX3N0cnVjX3N5bWJvbF9oX18KLQotLyogVGhlIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgc3ltYm9sLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2wgdGFibGUKLSAgIGhvbGRzIHBvaW50ZXJzIGJvdGggdG8gdGhpcyBhbmQgdG8gbG9jYWxfc3ltYm9sIHN0cnVjdHVyZXMuICBTZWUKLSAgIGJlbG93LiAgKi8KLQotc3RydWN0IHN5bWJvbAotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogQkZEIHN5bWJvbCAqLwotICBhc3ltYm9sICpic3ltOwotI2Vsc2UKLSAgLyogVGhlICg0LW9yaWdpbikgcG9zaXRpb24gb2Ygc3lfbmFtZSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFRoaXMgd2lsbCBiZSAwIGZvciAobmFtZWxlc3MpIC5zdGFiZCBzeW1ib2xzLgotCi0gICAgIE5vdCB1c2VkIHVudGlsIHdyaXRlX29iamVjdF9maWxlKCkgdGltZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBzeV9uYW1lX29mZnNldDsKLQotICAvKiBXaGF0IHdlIHdyaXRlIGluIC5vIGZpbGUgKGlmIHBlcm1pdHRlZCkuICAqLwotICBvYmpfc3ltYm9sX3R5cGUgc3lfc3ltYm9sOwotCi0gIC8qIFRoZSAyNCBiaXQgc3ltYm9sIG51bWJlci4gIFN5bWJvbCBudW1iZXJzIHN0YXJ0IGF0IDAgYW5kIGFyZSB1bnNpZ25lZC4gKi8KLSAgbG9uZyBzeV9udW1iZXI7Ci0jZW5kaWYKLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gIGV4cHJlc3Npb25TIHN5X3ZhbHVlOwotCi0gIC8qIEZvcndhcmRzIGFuZCAob3B0aW9uYWxseSkgYmFja3dhcmRzIGNoYWluIHBvaW50ZXJzLiAgKi8KLSAgc3RydWN0IHN5bWJvbCAqc3lfbmV4dDsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gIHN0cnVjdCBzeW1ib2wgKnN5X3ByZXZpb3VzOwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotICAvKiBQb2ludGVyIHRvIHRoZSBmcmFnIHRoaXMgc3ltYm9sIGlzIGF0dGFjaGVkIHRvLCBpZiBhbnkuCi0gICAgIE90aGVyd2lzZSwgTlVMTC4gICovCi0gIHN0cnVjdCBmcmFnICpzeV9mcmFnOwotCi0gIHVuc2lnbmVkIGludCB3cml0dGVuIDogMTsKLSAgLyogV2hldGhlciBzeW1ib2wgdmFsdWUgaGFzIGJlZW4gY29tcGxldGVseSByZXNvbHZlZCAodXNlZCBkdXJpbmcKLSAgICAgZmluYWwgcGFzcyBvdmVyIHN5bWJvbCB0YWJsZSkuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfcmVzb2x2ZWQgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgdmFsdWUgaXMgY3VycmVudGx5IGJlaW5nIHJlc29sdmVkICh1c2VkIHRvCi0gICAgIGRldGVjdCBsb29wcyBpbiBzeW1ib2wgZGVwZW5kZW5jaWVzKS4gICovCi0gIHVuc2lnbmVkIGludCBzeV9yZXNvbHZpbmcgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgdmFsdWUgaXMgdXNlZCBpbiBhIHJlbG9jLiAgVGhpcyBpcyB1c2VkIHRvCi0gICAgIGVuc3VyZSB0aGF0IHN5bWJvbHMgdXNlZCBpbiByZWxvY3MgYXJlIHdyaXR0ZW4gb3V0LCBldmVuIGlmIHRoZXkKLSAgICAgYXJlIGxvY2FsIGFuZCB3b3VsZCBvdGhlcndpc2Ugbm90IGJlLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3VzZWRfaW5fcmVsb2MgOiAxOwotCi0gIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCBpcyB1c2VkIGFzIGFuIG9wZXJhbmQgb3IgaW4gYW4gZXhwcmVzc2lvbi4gIAotICAgICBOT1RFOiAgTm90IGFsbCB0aGUgYmFja2VuZHMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGFjY3VyYXRlOwotICAgICBiYWNrZW5kcyB3aGljaCB1c2UgdGhpcyBiaXQgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGl0IHdoZW4KLSAgICAgYSBzeW1ib2wgaXMgdXNlZCBpbiBiYWNrZW5kIHJvdXRpbmVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3VzZWQgOiAxOwotCi0gIC8qIFRoaXMgaXMgc2V0IGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhbiBNUkkgY29tbW9uIHNlY3Rpb24uCi0gICAgIFdlIGhhbmRsZSBzdWNoIHNlY3Rpb25zIGFzIHNpbmdsZSBjb21tb24gc3ltYm9scywgc28gc3ltYm9scwotICAgICBkZWZpbmVkIHdpdGhpbiB0aGVtIG11c3QgYmUgdHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlIHJlbG9jYXRpb24KLSAgICAgcm91dGluZXMuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfbXJpX2NvbW1vbiA6IDE7Ci0KLSNpZmRlZiBPQkpfU1lNRklFTERfVFlQRQotICBPQkpfU1lNRklFTERfVFlQRSBzeV9vYmo7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NZTUZJRUxEX1RZUEUKLSAgVENfU1lNRklFTERfVFlQRSBzeV90YzsKLSNlbmRpZgotfTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogQSBwb2ludGVyIGluIHRoZSBzeW1ib2wgbWF5IHBvaW50IHRvIGVpdGhlciBhIGNvbXBsZXRlIHN5bWJvbAotICAgKHN0cnVjdCBzeW1ib2wgYWJvdmUpIG9yIHRvIGEgbG9jYWwgc3ltYm9sIChzdHJ1Y3QgbG9jYWxfc3ltYm9sCi0gICBkZWZpbmVkIGhlcmUpLiAgVGhlIHN5bWJvbCBjb2RlIGNhbiBkZXRlY3QgdGhlIGNhc2UgYnkgZXhhbWluaW5nCi0gICB0aGUgZmlyc3QgZmllbGQuICBJdCBpcyBhbHdheXMgTlVMTCBmb3IgYSBsb2NhbCBzeW1ib2wuCi0KLSAgIFdlIGRvIHRoaXMgYmVjYXVzZSB3ZSBvcmRpbmFyaWx5IG9ubHkgbmVlZCBhIHNtYWxsIGFtb3VudCBvZgotICAgaW5mb3JtYXRpb24gZm9yIGEgbG9jYWwgc3ltYm9sLiAgVGhlIHN5bWJvbCB0YWJsZSB0YWtlcyB1cCBhIGxvdCBvZgotICAgc3BhY2UsIGFuZCBzdG9yaW5nIGxlc3MgaW5mb3JtYXRpb24gZm9yIGEgbG9jYWwgc3ltYm9sIGNhbiBtYWtlIGEKLSAgIGJpZyBkaWZmZXJlbmNlIGluIGFzc2VtYmxlciBtZW1vcnkgdXNhZ2Ugd2hlbiBhc3NlbWJsaW5nIGEgbGFyZ2UKLSAgIGZpbGUuICAqLwotCi1zdHJ1Y3QgbG9jYWxfc3ltYm9sCi17Ci0gIC8qIFRoaXMgcG9pbnRlciBpcyBhbHdheXMgTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBsb2NhbAotICAgICBzeW1ib2wuICAqLwotICBhc3ltYm9sICpsc3lfbWFya2VyOwotCi0gIC8qIFRoZSBzeW1ib2wgc2VjdGlvbi4gIFRoaXMgYWxzbyBzZXJ2ZXMgYXMgYSBmbGFnLiAgSWYgdGhpcyBpcwotICAgICByZWdfc2VjdGlvbiwgdGhlbiB0aGlzIHN5bWJvbCBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIHJlZ3VsYXIKLSAgICAgc3ltYm9sLCBhbmQgc3lfc3ltIHBvaW50cyB0byBpdC4gICovCi0gIHNlZ1QgbHN5X3NlY3Rpb247Ci0KLSAgLyogVGhlIHN5bWJvbCBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbHN5X25hbWU7Ci0KLSAgLyogVGhlIHN5bWJvbCBmcmFnIG9yIHRoZSByZWFsIHN5bWJvbCwgZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIGluCi0gICAgIHN5X3NlY3Rpb24uICBJZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGZ1bGx5IHJlc29sdmVkLCBsc3lfZnJhZyBpcwotICAgICBzZXQgdG8gTlVMTC4gICovCi0gIHVuaW9uCi0gIHsKLSAgICBmcmFnUyAqbHN5X2ZyYWc7Ci0gICAgc3ltYm9sUyAqbHN5X3N5bTsKLSAgfSB1OwotCi0gIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBmcmFnLiAgKi8KLSAgdmFsdWVUIGxzeV9vZmZzZXQ7Ci19OwotCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcChsKSAoKGwpLT5sc3lfc2VjdGlvbiA9PSByZWdfc2VjdGlvbikKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX21hcmtfY29udmVydGVkKGwpICgobCktPmxzeV9zZWN0aW9uID0gcmVnX3NlY3Rpb24pCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wKGwpICgobCktPnUubHN5X2ZyYWcgPT0gTlVMTCkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQobCkgKChsKS0+dS5sc3lfZnJhZyA9IE5VTEwpCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyhsKSAoKGwpLT51LmxzeV9mcmFnKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcobCwgZikgKChsKS0+dS5sc3lfZnJhZyA9IChmKSkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX2dldF9yZWFsX3N5bWJvbChsKSAoKGwpLT51LmxzeV9zeW0pCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9zZXRfcmVhbF9zeW1ib2wobCwgcykgKChsKS0+dS5sc3lfc3ltID0gKHMpKQotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jZW5kaWYgLyogX19zdHJ1Y19zeW1ib2xfaF9fICovCi0KLS8qIGVuZCBvZiBzdHJ1Yy1zeW1ib2wuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N1YnNlZ3MuYyBiL2dhcy9zdWJzZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYmY3MGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3N1YnNlZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi0vKiBzdWJzZWdzLmMgLSBzdWJzZWdtZW50cyAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogU2VnbWVudHMgJiBzdWItc2VnbWVudHMuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi1mcmNoYWluUyAqZnJjaGFpbl9yb290LCAqZnJjaGFpbl9ub3c7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBmcmNoYWluczsKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotc2VnbWVudF9pbmZvX3R5cGUgc2VnbWVudF9pbmZvW1NFR19NQVhJTVVNX09SRElOQUxdOwotCi0jZWxzZQotLyogQ29tbWVudGVkIGluICJzdWJzZWdzLmgiLiAqLwotZnJjaGFpblMgKmRhdGEwX2ZyY2hhaW5QLCAqYnNzMF9mcmNoYWluUDsKLQotI2VuZGlmIC8qIE1BTllfU0VHTUVOVFMgKi8KLWNoYXIgY29uc3QgKmNvbnN0IHNlZ19uYW1lW10gPQotewotICAiYWJzb2x1dGUiLAotI2lmZGVmIE1BTllfU0VHTUVOVFMKLSAgImUwIiwgImUxIiwgImUyIiwgImUzIiwgImU0IiwgImU1IiwgImU2IiwgImU3IiwgImU4IiwgImU5IiwKLSAgImUxMCIsICJlMTEiLCAiZTEyIiwgImUxMyIsICJlMTQiLCAiZTE1IiwgImUxNiIsICJlMTciLCAiZTE4IiwgImUxOSIsCi0gICJlMjAiLCAiZTIxIiwgImUyMiIsICJlMjMiLCAiZTI0IiwgImUyNSIsICJlMjYiLCAiZTI3IiwgImUyOCIsICJlMjkiLAotICAiZTMwIiwgImUzMSIsICJlMzIiLCAiZTMzIiwgImUzNCIsICJlMzUiLCAiZTM2IiwgImUzNyIsICJlMzgiLCAiZTM5IiwKLSNlbHNlCi0gICJ0ZXh0IiwKLSAgImRhdGEiLAotICAiYnNzIiwKLSNlbmRpZiAvKiBNQU5ZX1NFR01FTlRTICovCi0gICJ1bmtub3duIiwKLSAgIkFTU0VNQkxFUi1JTlRFUk5BTC1MT0dJQy1FUlJPUiEiLAotICAiZXhwciIsCi0gICJkZWJ1ZyIsCi0gICJ0cmFuc2ZlcnQgdmVjdG9yIHByZWxvYWQiLAotICAidHJhbnNmZXJ0IHZlY3RvciBwb3N0bG9hZCIsCi0gICJyZWdpc3RlciIsCi0gICIiLAotfTsJCQkJLyogVXNlZCBieSBlcnJvciByZXBvcnRlcnMsIGR1bXBlcnMgZXRjLiAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBHYXMgc2VnbWVudCBpbmZvcm1hdGlvbiBmb3IgYmZkX2Fic19zZWN0aW9uX3B0ciBhbmQKLSAgIGJmZF91bmRfc2VjdGlvbl9wdHIuICAqLwotc3RhdGljIHNlZ21lbnRfaW5mb190eXBlICphYnNfc2VnX2luZm87Ci1zdGF0aWMgc2VnbWVudF9pbmZvX3R5cGUgKnVuZF9zZWdfaW5mbzsKLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotc3RhdGljIHZvaWQgc3Vic2VnX3NldF9yZXN0IFBBUkFNUyAoKHNlZ1QsIHN1YnNlZ1QpKTsKLQotc3RhdGljIGZyYWdTIGR1bW15X2ZyYWc7Ci0KLXN0YXRpYyBmcmNoYWluUyBhYnNvbHV0ZV9mcmNoYWluOwotDAotdm9pZAotc3Vic2Vnc19iZWdpbiAoKQotewotICAvKiBDaGVjayB0YWJsZShzKSBzZWdfbmFtZVtdLCBzZWdfTl9UWVBFW10gaXMgaW4gY29ycmVjdCBvcmRlciAqLwotI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAga25vdyAoU0VHX0FCU09MVVRFID09IDApOwotICBrbm93IChTRUdfVEVYVCA9PSAxKTsKLSAga25vdyAoU0VHX0RBVEEgPT0gMik7Ci0gIGtub3cgKFNFR19CU1MgPT0gMyk7Ci0gIGtub3cgKFNFR19VTktOT1dOID09IDQpOwotICBrbm93IChTRUdfR09PRiA9PSA1KTsKLSAga25vdyAoU0VHX0VYUFIgPT0gNik7Ci0gIGtub3cgKFNFR19ERUJVRyA9PSA3KTsKLSAga25vdyAoU0VHX05UViA9PSA4KTsKLSAga25vdyAoU0VHX1BUViA9PSA5KTsKLSAga25vdyAoU0VHX1JFR0lTVEVSID09IDEwKTsKLSAga25vdyAoU0VHX01BWElNVU1fT1JESU5BTCA9PSBTRUdfUkVHSVNURVIpOwotI2VuZGlmCi0KLSAgb2JzdGFja19iZWdpbiAoJmZyY2hhaW5zLCBjaHVua3NpemUpOwotI2lmIF9fR05VQ19fID49IDIKLSAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoJmZyY2hhaW5zKSA9IF9fYWxpZ25vZl9fIChmcmNoYWluUykgLSAxOwotI2VuZGlmCi0KLSAgZnJjaGFpbl9yb290ID0gTlVMTDsKLSAgZnJjaGFpbl9ub3cgPSBOVUxMOwkJLyogV2FybiBuZXdfc3Vic2VnKCkgdGhhdCB3ZSBhcmUgYm9vdGluZy4gKi8KLQotICBmcmFnX25vdyA9ICZkdW1teV9mcmFnOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgbm93X3N1YnNlZyA9IDQyOwkJLyogTGllIGZvciAxc3QgY2FsbCB0byBzdWJzZWdfbmV3LiAqLwotI2lmZGVmIE1BTllfU0VHTUVOVFMKLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgICB7Ci0Jc3Vic2VnX3NldCAoaSwgMCk7Ci0Jc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gICAgICB9Ci0gIH0KLSNlbHNlCi0gIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAwKTsJLyogLmRhdGEgMCAqLwotICBkYXRhMF9mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotCi0gIHN1YnNlZ19zZXQgKFNFR19CU1MsIDApOwotICBic3MwX2ZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0KLSNlbmRpZiAvKiAhIE1BTllfU0VHTUVOVFMgKi8KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLSAgYWJzb2x1dGVfZnJjaGFpbi5mcmNoX3N1YnNlZyA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBhYnNvbHV0ZV9mcmNoYWluLmZpeF9yb290ID0gYWJzb2x1dGVfZnJjaGFpbi5maXhfdGFpbCA9IDA7Ci0jZW5kaWYKLSAgYWJzb2x1dGVfZnJjaGFpbi5mcmNoX2ZyYWdfbm93ID0gJnplcm9fYWRkcmVzc19mcmFnOwotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfcm9vdCA9IGFic29sdXRlX2ZyY2hhaW4uZnJjaF9sYXN0ID0gJnplcm9fYWRkcmVzc19mcmFnOwotfQotDAotLyoKLSAqCQkJc3Vic2VnX2NoYW5nZSgpCi0gKgotICogQ2hhbmdlIHRoZSBzdWJzZWdtZW50IHdlIGFyZSBpbiwgQlVUIERPIE5PVCBNQUtFIEEgTkVXIEZSQUcgZm9yIHRoZQotICogc3Vic2VnbWVudC4gSWYgd2UgYXJlIGFscmVhZHkgaW4gdGhlIGNvcnJlY3Qgc3Vic2VnbWVudCwgY2hhbmdlIG5vdGhpbmcuCi0gKiBUaGlzIGlzIHVzZWQgZWcgYXMgYSB3b3JrZXIgZm9yIHN1YnNlZ19zZXQgW3doaWNoIGRvZXMgbWFrZSBhIG5ldyBmcmFnX25vd10KLSAqIGFuZCBmb3IgY2hhbmdpbmcgc2VnbWVudHMgYWZ0ZXIgd2UgaGF2ZSByZWFkIHRoZSBzb3VyY2UuIFdlIGNvbnN0cnVjdCBlZwotICogZml4U3MgZXZlbiBhZnRlciB0aGUgc291cmNlIGZpbGUgaXMgcmVhZCwgc28gd2UgZG8gaGF2ZSB0byBrZWVwIHRoZQotICogc2VnbWVudCBjb250ZXh0IGNvcnJlY3QuCi0gKi8KLXZvaWQKLXN1YnNlZ19jaGFuZ2UgKHNlZywgc3Vic2VnKQotICAgICByZWdpc3RlciBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgaW50IHN1YnNlZzsKLXsKLSAgbm93X3NlZyA9IHNlZzsKLSAgbm93X3N1YnNlZyA9IHN1YnNlZzsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybjsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgewotICAgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICAgIHNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhIChzdGRvdXRwdXQsIHNlZyk7Ci0gICAgaWYgKCEgc2VnaW5mbykKLSAgICAgIHsKLQlzZWdpbmZvID0gKHNlZ21lbnRfaW5mb190eXBlICopIHhtYWxsb2MgKHNpemVvZiAoKnNlZ2luZm8pKTsKLQltZW1zZXQgKChQVFIpIHNlZ2luZm8sIDAsIHNpemVvZiAoKnNlZ2luZm8pKTsKLQlzZWdpbmZvLT5maXhfcm9vdCA9IE5VTEw7Ci0Jc2VnaW5mby0+Zml4X3RhaWwgPSBOVUxMOwotCXNlZ2luZm8tPmJmZF9zZWN0aW9uID0gc2VnOwotCXNlZ2luZm8tPnN5bSA9IDA7Ci0JaWYgKHNlZyA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCSAgYWJzX3NlZ19pbmZvID0gc2VnaW5mbzsKLQllbHNlIGlmIChzZWcgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLQkgIHVuZF9zZWdfaW5mbyA9IHNlZ2luZm87Ci0JZWxzZQotCSAgYmZkX3NldF9zZWN0aW9uX3VzZXJkYXRhIChzdGRvdXRwdXQsIHNlZywgKFBUUikgc2VnaW5mbyk7Ci0gICAgICB9Ci0gIH0KLSNlbHNlCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICBzZWdfZml4X3Jvb3RQID0gJnNlZ21lbnRfaW5mb1tzZWddLmZpeF9yb290OwotICBzZWdfZml4X3RhaWxQID0gJnNlZ21lbnRfaW5mb1tzZWddLmZpeF90YWlsOwotI2Vsc2UKLSAgaWYgKHNlZyA9PSBTRUdfREFUQSkKLSAgICB7Ci0gICAgICBzZWdfZml4X3Jvb3RQID0gJmRhdGFfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJmRhdGFfZml4X3RhaWw7Ci0gICAgfQotICBlbHNlIGlmIChzZWcgPT0gU0VHX1RFWFQpCi0gICAgewotICAgICAgc2VnX2ZpeF9yb290UCA9ICZ0ZXh0X2ZpeF9yb290OwotICAgICAgc2VnX2ZpeF90YWlsUCA9ICZ0ZXh0X2ZpeF90YWlsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKHNlZyA9PSBTRUdfQlNTKTsKLSAgICAgIHNlZ19maXhfcm9vdFAgPSAmYnNzX2ZpeF9yb290OwotICAgICAgc2VnX2ZpeF90YWlsUCA9ICZic3NfZml4X3RhaWw7Ci0gICAgfQotCi0jZW5kaWYKLSNlbmRpZgotfQotDAotc3RhdGljIHZvaWQKLXN1YnNlZ19zZXRfcmVzdCAoc2VnLCBzdWJzZWcpCi0gICAgIHNlZ1Qgc2VnOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgcmVnaXN0ZXIgZnJjaGFpblMgKmZyY1A7CS8qIGNyYXdsIGZyY2hhaW4gY2hhaW4gKi8KLSAgcmVnaXN0ZXIgZnJjaGFpblMgKipsYXN0UFA7CS8qIGFkZHJlc3Mgb2YgbGFzdCBwb2ludGVyICovCi0gIGZyY2hhaW5TICpuZXdQOwkJLyogYWRkcmVzcyBvZiBuZXcgZnJjaGFpbiAqLwotCi0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLQotICBpZiAoZnJhZ19ub3cgJiYgZnJjaGFpbl9ub3cpCi0gICAgZnJjaGFpbl9ub3ctPmZyY2hfZnJhZ19ub3cgPSBmcmFnX25vdzsKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93ID09IDAKLQkgIHx8IG5vd19zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgIHx8IG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbgotCSAgfHwgZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgc3Vic2VnX2NoYW5nZSAoc2VnLCAoaW50KSBzdWJzZWcpOwotCi0gIGlmIChzZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBmcmNoYWluX25vdyA9ICZhYnNvbHV0ZV9mcmNoYWluOwotICAgICAgZnJhZ19ub3cgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3cgPT0gMAotCSAgfHwgbm93X3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbgotCSAgfHwgZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgLyoKLSAgICogQXR0ZW1wdCB0byBmaW5kIG9yIG1ha2UgYSBmcmNoYWluIGZvciB0aGF0IHN1YiBzZWcuCi0gICAqIENyYXdsIGFsb25nIGNoYWluIG9mIGZyY2hhaW5TcywgYmVnaW5zIEAgZnJjaGFpbl9yb290LgotICAgKiBJZiB3ZSBuZWVkIHRvIG1ha2UgYSBmcmNoYWluUywgbGluayBpdCBpbnRvIGNvcnJlY3QKLSAgICogcG9zaXRpb24gb2YgY2hhaW4gcm9vdGVkIGluIGZyY2hhaW5fcm9vdC4KLSAgICovCi0gIGZvciAoZnJjUCA9ICoobGFzdFBQID0gJmZyY2hhaW5fcm9vdCk7Ci0gICAgICAgZnJjUCAmJiBmcmNQLT5mcmNoX3NlZyA8PSBzZWc7Ci0gICAgICAgZnJjUCA9ICoobGFzdFBQID0gJmZyY1AtPmZyY2hfbmV4dCkpCi0gICAgewotICAgICAgaWYgKGZyY1AtPmZyY2hfc2VnID09IHNlZwotCSAgJiYgZnJjUC0+ZnJjaF9zdWJzZWcgPj0gc3Vic2VnKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIGZyY1A6CQlBZGRyZXNzIG9mIHRoZSAxc3QgZnJjaGFpblMgaW4gY29ycmVjdCBzZWdtZW50IHdpdGgKLSAgICoJCWZyY2hfc3Vic2VnID49IHN1YnNlZy4KLSAgICoJCVdlIHdhbnQgdG8gZWl0aGVyIHVzZSB0aGlzIGZyY2hhaW5TLCBvciB3ZSB3YW50Ci0gICAqCQl0byBpbnNlcnQgYSBuZXcgZnJjaGFpblMganVzdCBiZWZvcmUgaXQuCi0gICAqCi0gICAqCQlJZiBmcmNQPT1OVUxMLCB0aGVuIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbgotICAgKgkJb2YgZnJjaGFpblMtcy4gQSBOVUxMIGZyY1AgbWVhbnMgd2UgZmVsbCBvZmYgdGhlIGVuZAotICAgKgkJb2YgdGhlIGNoYWluIGxvb2tpbmcgZm9yIGEKLSAgICoJCWZyY2hfc3Vic2VnID49IHN1YnNlZywgc28gd2UKLSAgICoJCW11c3QgbWFrZSBhIG5ldyBmcmNoYWluUy4KLSAgICoKLSAgICoJCUlmIHdlIGV2ZXIgbWFpbnRhaW4gYSBwb2ludGVyIHRvCi0gICAqCQl0aGUgbGFzdCBmcmNoYWluUyBpbiB0aGUgY2hhaW4sIHdlIGNoYW5nZSB0aGF0IHBvaW50ZXIKLSAgICoJCU9OTFkgd2hlbiBmcmNQPT1OVUxMLgotICAgKgotICAgKiBsYXN0UFA6CUFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgd2l0aCB2YWx1ZSBmcmNQOwotICAgKgkJTmV2ZXIgTlVMTC4KLSAgICoJCU1heSBwb2ludCB0byBmcmNoYWluX3Jvb3QuCi0gICAqCi0gICAqLwotICBpZiAoIWZyY1AKLSAgICAgIHx8IChmcmNQLT5mcmNoX3NlZyA+IHNlZwotCSAgfHwgZnJjUC0+ZnJjaF9zdWJzZWcgPiBzdWJzZWcpKQkvKiBLaW5reSBsb2dpYyBvbmx5IHdvcmtzIHdpdGggMiBzZWdtZW50cy4gKi8KLSAgICB7Ci0gICAgICAvKgotICAgICAgICogVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgY29kZSB0aGF0IGNyZWF0ZXMgYSBmcmNoYWluUy4KLSAgICAgICAqLwotICAgICAgbmV3UCA9IChmcmNoYWluUyAqKSBvYnN0YWNrX2FsbG9jICgmZnJjaGFpbnMsIHNpemVvZiAoZnJjaGFpblMpKTsKLSAgICAgIG5ld1AtPmZyY2hfc3Vic2VnID0gc3Vic2VnOwotICAgICAgbmV3UC0+ZnJjaF9zZWcgPSBzZWc7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbmV3UC0+Zml4X3Jvb3QgPSBOVUxMOwotICAgICAgbmV3UC0+Zml4X3RhaWwgPSBOVUxMOwotI2VuZGlmCi0gICAgICBvYnN0YWNrX2JlZ2luICgmbmV3UC0+ZnJjaF9vYnN0YWNrLCBjaHVua3NpemUpOwotI2lmIF9fR05VQ19fID49IDIKLSAgICAgIG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKCZuZXdQLT5mcmNoX29ic3RhY2spID0gX19hbGlnbm9mX18gKGZyYWdTKSAtIDE7Ci0jZW5kaWYKLSAgICAgIG5ld1AtPmZyY2hfZnJhZ19ub3cgPSBmcmFnX2FsbG9jICgmbmV3UC0+ZnJjaF9vYnN0YWNrKTsKLSAgICAgIG5ld1AtPmZyY2hfZnJhZ19ub3ctPmZyX3R5cGUgPSByc19maWxsOwotCi0gICAgICBuZXdQLT5mcmNoX3Jvb3QgPSBuZXdQLT5mcmNoX2xhc3QgPSBuZXdQLT5mcmNoX2ZyYWdfbm93OwotCi0gICAgICAqbGFzdFBQID0gbmV3UDsKLSAgICAgIG5ld1AtPmZyY2hfbmV4dCA9IGZyY1A7CS8qIHBlcmhhcHMgTlVMTCAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgewotCXNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCXNlZ2luZm8gPSBzZWdfaW5mbyAoc2VnKTsKLQlpZiAoc2VnaW5mbyAmJiBzZWdpbmZvLT5mcmNoYWluUCA9PSBmcmNQKQotCSAgc2VnaW5mby0+ZnJjaGFpblAgPSBuZXdQOwotICAgICAgfQotI2VuZGlmCi0gICAgICAKLSAgICAgIGZyY1AgPSBuZXdQOwotICAgIH0KLSAgLyoKLSAgICogSGVyZSB3aXRoIGZyY1AgcG9pbnRpbmcgdG8gdGhlIGZyY2hhaW5TIGZvciBzdWJzZWcuCi0gICAqLwotICBmcmNoYWluX25vdyA9IGZyY1A7Ci0gIGZyYWdfbm93ID0gZnJjUC0+ZnJjaF9mcmFnX25vdzsKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93LT5mcmNoX2xhc3QgPT0gZnJhZ19ub3cpOwotfQotCi0vKgotICoJCQlzdWJzZWdfc2V0KHNlZ1QsIHN1YnNlZ1QpCi0gKgotICogSWYgeW91IGF0dGVtcHQgdG8gY2hhbmdlIHRvIHRoZSBjdXJyZW50IHN1YnNlZ21lbnQsIG5vdGhpbmcgaGFwcGVucy4KLSAqCi0gKiBJbjoJc2VnVCwgc3Vic2VnVCBjb2RlIGZvciBuZXcgc3Vic2VnbWVudC4KLSAqCWZyYWdfbm93IC0+IGluY29tcGxldGUgZnJhZyBmb3IgY3VycmVudCBzdWJzZWdtZW50LgotICoJSWYgZnJhZ19ub3c9PU5VTEwsIHRoZW4gdGhlcmUgaXMgbm8gb2xkLCBpbmNvbXBsZXRlIGZyYWcsIHNvCi0gKgl0aGUgb2xkIGZyYWcgaXMgbm90IGNsb3NlZCBvZmYuCi0gKgotICogT3V0Oglub3dfc3Vic2VnLCBub3dfc2VnIHVwZGF0ZWQuCi0gKglGcmNoYWluX25vdyBwb2ludHMgdG8gdGhlIChwb3NzaWJseSBuZXcpIHN0cnVjdCBmcmNoYWluIGZvciB0aGlzCi0gKglzdWItc2VnbWVudC4KLSAqCUZyY2hhaW5fcm9vdCB1cGRhdGVkIGlmIG5lZWRlZC4KLSAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotc2VnVAotc3Vic2VnX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IChpbnQpIFNFR19NQVhJTVVNX09SRElOQUw7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzOwotCi0gICAgICBzID0gc2VnbWVudF9uYW1lICgoc2VnVCkgaSk7Ci0gICAgICBpZiAoc3RyY21wIChzZWduYW1lLCBzKSA9PSAwCi0JICB8fCAoc2VnbmFtZVswXSA9PSAnLicKLQkgICAgICAmJiBzdHJjbXAgKHNlZ25hbWUgKyAxLCBzKSA9PSAwKSkKLQl7Ci0JICBzdWJzZWdfc2V0ICgoc2VnVCkgaSwgc3Vic2VnKTsKLQkgIHJldHVybiAoc2VnVCkgaTsKLQl9Ci0jaWZkZWYgb2JqX3NlZ21lbnRfbmFtZQotICAgICAgcyA9IG9ial9zZWdtZW50X25hbWUgKChzZWdUKSBpKTsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ25hbWUsIHMpID09IDAKLQkgIHx8IChzZWduYW1lWzBdID09ICcuJwotCSAgICAgICYmIHN0cmNtcCAoc2VnbmFtZSArIDEsIHMpID09IDApKQotCXsKLQkgIHN1YnNlZ19zZXQgKChzZWdUKSBpLCBzdWJzZWcpOwotCSAgcmV0dXJuIChzZWdUKSBpOwotCX0KLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIG9ial9hZGRfc2VnbWVudAotICB7Ci0gICAgc2VnVCBuZXdfc2VnOwotICAgIG5ld19zZWcgPSBvYmpfYWRkX3NlZ21lbnQgKHNlZ25hbWUpOwotICAgIHN1YnNlZ19zZXQgKG5ld19zZWcsIHN1YnNlZyk7Ci0gICAgcmV0dXJuIG5ld19zZWc7Ci0gIH0KLSNlbHNlCi0gIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBzd2l0Y2ggdG8gbm9uZXhpc3RlbnQgc2VnbWVudCBcIiVzXCIiKSwgc2VnbmFtZSk7Ci0gIHJldHVybiBub3dfc2VnOwotI2VuZGlmCi19Ci0KLXZvaWQKLXN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKQkvKiBiZWdpbiBhc3NlbWJseSBmb3IgYSBuZXcgc3ViLXNlZ21lbnQgKi8KLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWc7CQkvKiBTRUdfREFUQSBvciBTRUdfVEVYVCAqLwotICAgICByZWdpc3RlciBzdWJzZWdUIHN1YnNlZzsKLXsKLSNpZm5kZWYgTUFOWV9TRUdNRU5UUwotICBrbm93IChzZWcgPT0gU0VHX0RBVEEKLQl8fCBzZWcgPT0gU0VHX1RFWFQKLQl8fCBzZWcgPT0gU0VHX0JTUwotCXx8IHNlZyA9PSBTRUdfQUJTT0xVVEUpOwotI2VuZGlmCi0KLSAgaWYgKHNlZyAhPSBub3dfc2VnIHx8IHN1YnNlZyAhPSBub3dfc3Vic2VnKQotICAgIHsJCQkJLyogd2UganVzdCBjaGFuZ2VkIHN1Yi1zZWdtZW50cyAqLwotICAgICAgc3Vic2VnX3NldF9yZXN0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci19Ci0KLSNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotc2VnVAotc3Vic2VnX2dldCAoc2VnbmFtZSwgZm9yY2VfbmV3KQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBpbnQgZm9yY2VfbmV3OwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gIGNvbnN0IGNoYXIgKm5vd19zZWdfbmFtZSA9IChub3dfc2VnCi0JCQkgICAgICA/IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIG5vd19zZWcpCi0JCQkgICAgICA6IDApOwotCi0gIGlmICghZm9yY2VfbmV3Ci0gICAgICAmJiBub3dfc2VnX25hbWUKLSAgICAgICYmIChub3dfc2VnX25hbWUgPT0gc2VnbmFtZQotCSAgfHwgIXN0cmNtcCAobm93X3NlZ19uYW1lLCBzZWduYW1lKSkpCi0gICAgcmV0dXJuIG5vd19zZWc7Ci0KLSAgaWYgKCFmb3JjZV9uZXcpCi0gICAgc2VjcHRyID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIHNlZ25hbWUpOwotICBlbHNlCi0gICAgc2VjcHRyID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKHN0ZG91dHB1dCwgc2VnbmFtZSk7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvKQotICAgIHsKLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3V0cHV0X3NlY3Rpb24gaXMgc2V0IGZpcnN0IGJlY2F1c2Ugc2VjcHRyIG1heQotICAgICAgICAgYmUgYmZkX2Fic19zZWN0aW9uX3B0ci4gICovCi0gICAgICBpZiAoc2VjcHRyLT5vdXRwdXRfc2VjdGlvbiAhPSBzZWNwdHIpCi0Jc2VjcHRyLT5vdXRwdXRfc2VjdGlvbiA9IHNlY3B0cjsKLSAgICAgIHNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2VnaW5mbykpOwotICAgICAgbWVtc2V0ICgoUFRSKSBzZWdpbmZvLCAwLCBzaXplb2YgKCpzZWdpbmZvKSk7Ci0gICAgICBzZWdpbmZvLT5maXhfcm9vdCA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5maXhfdGFpbCA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5iZmRfc2VjdGlvbiA9IHNlY3B0cjsKLSAgICAgIGlmIChzZWNwdHIgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLQlhYnNfc2VnX2luZm8gPSBzZWdpbmZvOwotICAgICAgZWxzZSBpZiAoc2VjcHRyID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0JdW5kX3NlZ19pbmZvID0gc2VnaW5mbzsKLSAgICAgIGVsc2UKLQliZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VjcHRyLCAoUFRSKSBzZWdpbmZvKTsKLSAgICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmxpbmVub19saXN0X2hlYWQgPSBzZWdpbmZvLT5saW5lbm9fbGlzdF90YWlsID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPnN5bSA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5kb3QgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHNlY3B0cjsKLX0KLQotc2VnVAotc3Vic2VnX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgc2VnVCBzZWNwdHI7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCi0gIHNlY3B0ciA9IHN1YnNlZ19nZXQgKHNlZ25hbWUsIDApOwotICBzdWJzZWdfc2V0X3Jlc3QgKHNlY3B0ciwgc3Vic2VnKTsKLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBzZWdpbmZvLT5mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotICByZXR1cm4gc2VjcHRyOwotfQotCi0vKiBMaWtlIHN1YnNlZ19uZXcsIGV4Y2VwdCBhIG5ldyBzZWN0aW9uIGlzIGFsd2F5cyBjcmVhdGVkLCBldmVuIGlmCi0gICBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMuICAqLwotc2VnVAotc3Vic2VnX2ZvcmNlX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgc2VnVCBzZWNwdHI7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCi0gIHNlY3B0ciA9IHN1YnNlZ19nZXQgKHNlZ25hbWUsIDEpOwotICBzdWJzZWdfc2V0X3Jlc3QgKHNlY3B0ciwgc3Vic2VnKTsKLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBzZWdpbmZvLT5mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotICByZXR1cm4gc2VjcHRyOwotfQotCi12b2lkCi1zdWJzZWdfc2V0IChzZWNwdHIsIHN1YnNlZykKLSAgICAgc2VnVCBzZWNwdHI7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBpZiAoISAoc2VjcHRyID09IG5vd19zZWcgJiYgc3Vic2VnID09IG5vd19zdWJzZWcpKQotICAgIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci19Ci0KLSNpZm5kZWYgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCi0jZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyhTRUMpCTAKLSNlbmRpZgotCi0vKiBHZXQgdGhlIGdhcyBpbmZvcm1hdGlvbiB3ZSBhcmUgc3RvcmluZyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc2VnbWVudF9pbmZvX3R5cGUgKgotc2VnX2luZm8gKHNlYykKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIGlmIChzZWMgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLSAgICByZXR1cm4gYWJzX3NlZ19pbmZvOwotICBlbHNlIGlmIChzZWMgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLSAgICByZXR1cm4gdW5kX3NlZ19pbmZvOwotICBlbHNlCi0gICAgcmV0dXJuIChzZWdtZW50X2luZm9fdHlwZSAqKSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VjKTsKLX0KLQotc3ltYm9sUyAqCi1zZWN0aW9uX3N5bWJvbCAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgc3ltYm9sUyAqczsKLQotICBpZiAoc2VnaW5mbyA9PSAwKQotICAgIGFib3J0ICgpOwotICBpZiAoc2VnaW5mby0+c3ltKQotICAgIHJldHVybiBzZWdpbmZvLT5zeW07Ci0KLSNpZm5kZWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLSNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMgMQotI2VuZGlmCi0KLSAgaWYgKCEgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICB8fCBzeW1ib2xfdGFibGVfZnJvemVuCi0jZW5kaWYKLSAgICAgICkKLSAgICB7Ci0gICAgICAvKiBIZXJlIHdlIGtub3cgaXQgd29uJ3QgYmUgZ29pbmcgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIHMgPSBzeW1ib2xfY3JlYXRlIChzZWMtPm5hbWUsIHNlYywgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzID0gc3ltYm9sX2ZpbmRfYmFzZSAoc2VjLT5uYW1lLCAwKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHN5bWJvbF9uZXcgKHNlYy0+bmFtZSwgc2VjLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgewotCSAgICAgIFNfU0VUX1NFR01FTlQgKHMsIHNlYyk7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChzLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBTX0NMRUFSX0VYVEVSTkFMIChzKTsKLQotICAvKiBVc2UgdGhlIEJGRCBzZWN0aW9uIHN5bWJvbCwgaWYgcG9zc2libGUuICAqLwotICBpZiAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpKQotICAgIHN5bWJvbF9zZXRfYmZkc3ltIChzLCBzZWMtPnN5bWJvbCk7Ci0KLSAgc2VnaW5mby0+c3ltID0gczsKLSAgcmV0dXJuIHM7Ci19Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBpcyB0aG91Z2h0IHRvIGhvbGQgdGV4dC4gICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotY29uc3QgY2hhciAqIGNvbnN0IG5vbnRleHRfc2VjdGlvbl9uYW1lc1tdID0KLXsKLSAgIi5laF9mcmFtZSIsCi0gICIuZ2NjX2V4Y2VwdF90YWJsZSIsCi0jaWZkZWYgT0JKX0NPRkYKLSNpZm5kZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgIi5laF9mcmFtIiwKLSAgIi5nY2NfZXhjIiwKLSNlbmRpZgotI2VuZGlmCi0gIE5VTEwKLX07Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLWludAotc3Vic2VnX3RleHRfcCAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYykgJiBTRUNfQ09ERSkgIT0gMDsKLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotICBjb25zdCBjaGFyICogY29uc3QgKnA7Ci0KLSAgaWYgKHNlYyA9PSBkYXRhX3NlY3Rpb24gfHwgc2VjID09IGJzc19zZWN0aW9uKQotICAgIHJldHVybiAwOwotCi0gIGZvciAocCA9IG5vbnRleHRfc2VjdGlvbl9uYW1lczsgKnAgIT0gTlVMTDsgKytwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VjKSwgKnApID09IDApCi0JcmV0dXJuIDA7Ci0KLSNpZmRlZiBvYmpfc2VnbWVudF9uYW1lCi0gICAgICBpZiAoc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChzZWMpLCAqcCkgPT0gMCkKLQlyZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gMTsKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotfQotCi12b2lkCi1zdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGZyY2hhaW5TICpmcmNocDsKLSAgZnByaW50ZiAoZmlsZSwgImZyYWcgY2hhaW5zOlxuIik7Ci0gIGZvciAoZnJjaHAgPSBmcmNoYWluX3Jvb3Q7IGZyY2hwOyBmcmNocCA9IGZyY2hwLT5mcmNoX25leHQpCi0gICAgewotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIGZyYWdTICpmcmFncDsKLQotICAgICAgLyogSWYgZnJjaF9zdWJzZWcgaXMgbm9uLXplcm8sIGl0J3MgcHJvYmFibHkgYmVlbiBjaGFpbmVkIG9udG8KLQkgdGhlIGVuZCBvZiBhIHByZXZpb3VzIHN1YnNlY3Rpb24uICBEb24ndCBjb3VudCBpdCBhZ2Fpbi4gICovCi0gICAgICBpZiAoZnJjaHAtPmZyY2hfc3Vic2VnICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNraXAgZ2FzLWludGVybmFsIHNlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChzZWdtZW50X25hbWUgKGZyY2hwLT5mcmNoX3NlZylbMF0gPT0gJyonKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKGZyYWdwID0gZnJjaHAtPmZyY2hfcm9vdDsgZnJhZ3A7IGZyYWdwID0gZnJhZ3AtPmZyX25leHQpCi0JewotI2lmIDAKLQkgIHN3aXRjaCAoZnJhZ3AtPmZyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSByc19maWxsOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJmIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX2FsaWduOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJhIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX2FsaWduX2NvZGU6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgImMiKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfb3JnOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJvIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgICAgIGZwcmludGYgKGZpbGUsICJtIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX3NwYWNlOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJzIik7IGJyZWFrOwotCSAgICBjYXNlIDA6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIjAiKTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIj8iKTsgYnJlYWs7Ci0JICAgIH0KLSNlbmRpZgotCSAgY291bnQrKzsKLQl9Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcdCVwICUtMTBzXHQlMTBkIGZyYWdzXG4iLCBmcmNocCwKLQkgICAgICAgc2VnbWVudF9uYW1lIChmcmNocC0+ZnJjaF9zZWcpLCBjb3VudCk7Ci0gICAgfQotfQotCi0vKiBlbmQgb2Ygc3Vic2Vncy5jICovCmRpZmYgLS1naXQgYS9nYXMvc3Vic2Vncy5oIGIvZ2FzL3N1YnNlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0MGQ1Yi4uMDAwMDAwMAotLS0gYS9nYXMvc3Vic2Vncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qIHN1YnNlZ3MuaCAtPiBzdWJzZWdzLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogRm9yIGV2ZXJ5IHN1Yi1zZWdtZW50IHRoZSB1c2VyIG1lbnRpb25zIGluIHRoZSBBU3NlbWJsZXIgcHJvZ3JhbSwKLSAqIHdlIG1ha2Ugb25lIHN0cnVjdCBmcmNoYWluLiBFYWNoIHN1Yi1zZWdtZW50IGhhcyBleGFjdGx5IG9uZSBzdHJ1Y3QgZnJjaGFpbgotICogYW5kIHZpY2UgdmVyc2EuCi0gKgotICogU3RydWN0IGZyY2hhaW4ncyBhcmUgZm9yd2FyZCBjaGFpbmVkIChpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc3ViLXNlZ21lbnQKLSAqIGNvZGUgbnVtYmVyKS4gVGhlIGNoYWluIHJ1bnMgdGhyb3VnaCBmcmNoX25leHQgb2YgZWFjaCBzdWJzZWdtZW50LgotICogVGhpcyBtYWtlcyBpdCBoYXJkIHRvIGZpbmQgYSBzdWJzZWdtZW50J3MgZnJhZ3MKLSAqIGlmIHByb2dyYW1tZXIgdXNlcyBhIGxvdCBvZiB0aGVtLiBNb3N0IHByb2dyYW1zIG9ubHkgdXNlIHRleHQwIGFuZAotICogZGF0YTAsIHNvIHRoZXkgZG9uJ3Qgc3VmZmVyLiBBdCBsZWFzdCB0aGlzIHdheToKLSAqICgxKQlUaGVyZSBhcmUgbm8gImFyYml0cmFyeSIgcmVzdHJpY3Rpb25zIG9uIGhvdyBtYW55IHN1YnNlZ21lbnRzCi0gKgljYW4gYmUgcHJvZ3JhbW1lZDsKLSAqICgyKQlTdWJzZWdtZW50cycgZnJjaGFpbi1zIGFyZSAobGF0ZXIpIGNoYWluZWQgdG9nZXRoZXIgaW4gdGhlIG9yZGVyIGluCi0gKgl3aGljaCB0aGV5IGFyZSBlbWl0dGVkIGZvciBvYmplY3QgZmlsZSB2aXogdGV4dCB0aGVuIGRhdGEuCi0gKgotICogRnJvbSBlYWNoIHN0cnVjdCBmcmNoYWluIGRhbmdsZXMgYSBjaGFpbiBvZiBzdHJ1Y3QgZnJhZ3MuIFRoZSBmcmFncwotICogcmVwcmVzZW50IGNvZGUgZnJhZ21lbnRzLCBmb3IgdGhhdCBzdWItc2VnbWVudCwgZm9yd2FyZCBjaGFpbmVkLgotICovCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLXN0cnVjdCBmcmNoYWluCQkJLyogY29udHJvbCBidWlsZGluZyBvZiBhIGZyYWcgY2hhaW4gKi8KLXsJCQkJLyogRlJDSCA9IEZSYWdtZW50IENIYWluIGNvbnRyb2wgKi8KLSAgc3RydWN0IGZyYWcgKmZyY2hfcm9vdDsJLyogMXN0IHN0cnVjdCBmcmFnIGluIGNoYWluLCBvciBOVUxMICovCi0gIHN0cnVjdCBmcmFnICpmcmNoX2xhc3Q7CS8qIGxhc3Qgc3RydWN0IGZyYWcgaW4gY2hhaW4sIG9yIE5VTEwgKi8KLSAgc3RydWN0IGZyY2hhaW4gKmZyY2hfbmV4dDsJLyogbmV4dCBpbiBjaGFpbiBvZiBzdHJ1Y3QgZnJjaGFpbi1zICovCi0gIHNlZ1QgZnJjaF9zZWc7CQkvKiBTRUdfVEVYVCBvciBTRUdfREFUQS4gKi8KLSAgc3Vic2VnVCBmcmNoX3N1YnNlZzsJCS8qIHN1YnNlZ21lbnQgbnVtYmVyIG9mIHRoaXMgY2hhaW4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGZpeFMgKmZpeF9yb290OwkJLyogUm9vdCBvZiBmaXh1cHMgZm9yIHRoaXMgc3Vic2VnbWVudC4gICovCi0gIGZpeFMgKmZpeF90YWlsOwkJLyogTGFzdCBmaXh1cCBmb3IgdGhpcyBzdWJzZWdtZW50LiAgKi8KLSNlbmRpZgotICBzdHJ1Y3Qgb2JzdGFjayBmcmNoX29ic3RhY2s7CS8qIGZvciBvYmplY3RzIGluIHRoaXMgZnJhZyBjaGFpbiAqLwotICBmcmFnUyAqZnJjaF9mcmFnX25vdzsJCS8qIGZyYWdfbm93IGZvciB0aGlzIHN1YnNlZ21lbnQgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGZyY2hhaW4gZnJjaGFpblM7Ci0KLS8qIEFsbCBzdWJzZWdtZW50cycgY2hhaW5zIGhhbmcgb2ZmIGhlcmUuICBOVUxMIG1lYW5zIG5vIGZyY2hhaW5zIHlldC4gICovCi1leHRlcm4gZnJjaGFpblMgKmZyY2hhaW5fcm9vdDsKLQotLyogRnJjaGFpbiB3ZSBhcmUgYXNzZW1ibGluZyBpbnRvIG5vdy4gIFRoYXQgaXMsIHRoZSBjdXJyZW50IHNlZ21lbnQncwotICAgZnJhZyBjaGFpbiwgZXZlbiBpZiBpdCBjb250YWlucyBubyAoY29tcGxldGUpIGZyYWdzLiAqLwotZXh0ZXJuIGZyY2hhaW5TICpmcmNoYWluX25vdzsKLQotCi10eXBlZGVmIHN0cnVjdCBzZWdtZW50X2luZm9fc3RydWN0Ci17Ci0gIGZyY2hhaW5TICpmcmNoYWluUDsKLSAgdW5zaWduZWQgaW50IGhhZG9uZSA6IDE7Ci0KLSAgLyogVGhpcyBmaWVsZCBpcyBzZXQgaWYgdGhpcyBpcyBhIC5ic3Mgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCByZWFsbHkKLSAgICAgaGF2ZSBhbnkgY29udGVudHMuICBPbmNlIHVwb24gYSB0aW1lIGEgLmJzcyBzZWN0aW9uIGRpZCBub3QgaGF2ZQotICAgICBhbnkgZnJhZ3MsIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciB0cnVlLiAgVGhpcyBmaWVsZCBwcmV2ZW50IHRoZQotICAgICBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgZnJvbSBiZWluZyBzZXQgZm9yIHRoZSBzZWN0aW9uIGV2ZW4gaWYKLSAgICAgdGhlcmUgYXJlIGZyYWdzLiAgKi8KLSAgdW5zaWduZWQgaW50IGJzcyA6IDE7Ci0KLSAgaW50IHVzZXJfc3R1ZmY7Ci0KLSAgLyogRml4dXBzIGZvciB0aGlzIHNlZ21lbnQuICBJZiBCRkRfQVNTRU1CTEVSLCB0aGlzIGlzIG9ubHkgdmFsaWQKLSAgICAgYWZ0ZXIgdGhlIGZyY2hhaW5zIGFyZSBydW4gdG9nZXRoZXIuICAqLwotICBmaXhTICpmaXhfcm9vdDsKLSAgZml4UyAqZml4X3RhaWw7Ci0KLSNpZiBkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciBzY25oZHI7Ci0gIGVudW0gbGlua29uY2VfdHlwZSBsaW5rb25jZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSNlbmRpZgotCi0gIHN5bWJvbFMgKmRvdDsKLQotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKmxpbmVub19saXN0X2hlYWQ7Ci0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZW5vX2xpc3RfdGFpbDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogV2hpY2ggQkZEIHNlY3Rpb24gZG9lcyB0aGlzIGdhcyBzZWdtZW50IGNvcnJlc3BvbmQgdG8/ICAqLwotICBhc2VjdGlvbiAqYmZkX3NlY3Rpb247Ci0KLSAgLyogTlVMTCwgb3IgcG9pbnRlciB0byB0aGUgZ2FzIHN5bWJvbCB0aGF0IGlzIHRoZSBzZWN0aW9uIHN5bWJvbCBmb3IKLSAgICAgdGhpcyBzZWN0aW9uLiAgc3ltLT5ic3ltIGFuZCBiZmRfc2VjdGlvbi0+c3ltYm9sIHNob3VsZCBiZSB0aGUgc2FtZS4gICovCi0gIHN5bWJvbFMgKnN5bTsKLSNlbmRpZgotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogQ3VycmVudCBzaXplIG9mIHNlY3Rpb24gaG9sZGluZyBzdGFicyBzdHJpbmdzLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhYl9zdHJpbmdfc2l6ZTsKLSAgICAgIC8qIEluaXRpYWwgZnJhZyBmb3IgRUxGLiAgKi8KLSAgICAgIGNoYXIgKnA7Ci0gICAgfQotICBzdGFidTsKLQotI2lmZGVmIE5FRURfTElURVJBTF9QT09MCi0gIHVuc2lnbmVkIGxvbmcgbGl0ZXJhbF9wb29sX3NpemU7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NFR01FTlRfSU5GT19UWVBFCi0gIFRDX1NFR01FTlRfSU5GT19UWVBFIHRjX3NlZ21lbnRfaW5mb19kYXRhOwotI2VuZGlmCi19IHNlZ21lbnRfaW5mb190eXBlOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1leHRlcm4gc2VnbWVudF9pbmZvX3R5cGUgKnNlZ19pbmZvIFBBUkFNUyAoKHNlZ1QpKTsKLWV4dGVybiBzeW1ib2xTICpzZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChzZWdUKSk7Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotCi1leHRlcm4gc2VnbWVudF9pbmZvX3R5cGUgc2VnbWVudF9pbmZvW107Ci0KLSNkZWZpbmUgc2VnX2luZm8oU0VDKQkoJnNlZ21lbnRfaW5mb1tTRUNdKQotCi0jZWxzZQotCi0vKiBTZW50aW5lbCBmb3IgZnJjaGFpbiBjcmF3bGluZy4gIFBvaW50cyB0byB0aGUgMXN0IGRhdGEtc2VnbWVudAotICAgZnJjaGFpbi4gIChXaGljaCBpcyBwb2ludGVkIHRvIGJ5IHRoZSBsYXN0IHRleHQtc2VnbWVudCBmcmNoYWluLikgKi8KLWV4dGVybiBmcmNoYWluUyAqZGF0YTBfZnJjaGFpblA7Ci1leHRlcm4gZnJjaGFpblMgKmJzczBfZnJjaGFpblA7Ci0KLS8qIER1bW15IHNvIHN0dWZmIGNhbiBjb21waWxlLiAgU2hvdWxkIG5ldmVyIGJlIHVzZWQuICAqLwotc3RydWN0IHNlZ19pbmZvX3RyYXNoIHsKLSAgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBzdGFiX3N0cmluZ19zaXplIDogMTsKLSAgfSBzdGFidTsKLSAgdW5zaWduZWQgaGFkb25lIDogMTsKLX07Ci0jZGVmaW5lIHNlZ19pbmZvKFMpCShhYm9ydCAoKSwgKHN0cnVjdCBzZWdfaW5mb190cmFzaCAqKSAwKQotCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi1leHRlcm4gdm9pZCBzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci0KLS8qIGVuZCBvZiBzdWJzZWdzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9zeW1ib2xzLmMgYi9nYXMvc3ltYm9scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWUyMDJmLi4wMDAwMDAwCi0tLSBhL2dhcy9zeW1ib2xzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAxICswLDAgQEAKLS8qIHN5bWJvbHMuYyAtc3ltYm9sIHRhYmxlLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogI2RlZmluZSBERUJVR19TWU1TIC8gKiB0byBkZWJ1ZyBzeW1ib2wgbGlzdCBtYWludGVuYW5jZSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCQkvKiBGb3IgInN5bWJvbHMuaCIgKi8KLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJzdHJ1Yy1zeW1ib2wuaCIKLQotLyogVGhpcyBpcyBub24temVybyBpZiBzeW1ib2xzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgd2hpY2ggaXMgdGhlCi0gICBkZWZhdWx0LiAgKi8KLWludCBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlID0gMTsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1leHRlcm4gaW50IG5ld19icm9rZW5fd29yZHM7Ci0jZW5kaWYKLQotLyogc3ltYm9sLW5hbWUgPT4gc3RydWN0IHN5bWJvbCBwb2ludGVyICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqc3lfaGFzaDsKLQotLyogVGFibGUgb2YgbG9jYWwgc3ltYm9scy4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbG9jYWxfaGFzaDsKLQotLyogQmVsb3cgYXJlIGNvbW1lbnRlZCBpbiAic3ltYm9scy5oIi4gKi8KLXN5bWJvbFMgKnN5bWJvbF9yb290UDsKLXN5bWJvbFMgKnN5bWJvbF9sYXN0UDsKLXN5bWJvbFMgYWJzX3N5bWJvbDsKLQotI2lmZGVmIERFQlVHX1NZTVMKLSNkZWZpbmUgZGVidWdfdmVyaWZ5X3N5bWNoYWluIHZlcmlmeV9zeW1ib2xfY2hhaW4KLSNlbHNlCi0jZGVmaW5lIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbihyb290LCBsYXN0KSAoKHZvaWQpIDApCi0jZW5kaWYKLQotc3RydWN0IG9ic3RhY2sgbm90ZXM7Ci0KLXN0YXRpYyB2b2lkIGZiX2xhYmVsX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGxvbmcgZG9sbGFyX2xhYmVsX2luc3RhbmNlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBsb25nIGZiX2xhYmVsX2luc3RhbmNlIFBBUkFNUyAoKGxvbmcpKTsKLQotc3RhdGljIHZvaWQgcHJpbnRfYmluYXJ5IFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCBleHByZXNzaW9uUyAqKSk7Ci0KLS8qIHN5bWJvbF9uZXcoKQotICAKLSAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBuZXcgc3ltYm9sLiAgRGllIGlmIHdlIGNhbid0IG1ha2UgYSBuZXcKLSAgIHN5bWJvbC4gIEZpbGwgaW4gdGhlIHN5bWJvbCdzIHZhbHVlcy4gIEFkZCBzeW1ib2wgdG8gZW5kIG9mIHN5bWJvbAotICAgY2hhaW4uCi0gCi0gICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIGdlbmVyYWwgY2FzZSBvZiBjcmVhdGluZyBhCi0gICBzeW1ib2wuICBIb3dldmVyLCBpZiB0aGUgb3V0cHV0IGZpbGUgc3ltYm9sIHRhYmxlIGhhcyBhbHJlYWR5IGJlZW4KLSAgIHNldCwgYW5kIHlvdSBhcmUgY2VydGFpbiB0aGF0IHRoaXMgc3ltYm9sIHdvbid0IGJlIHdhbnRlZCBpbiB0aGUKLSAgIG91dHB1dCBmaWxlLCB5b3UgY2FuIGNhbGwgc3ltYm9sX2NyZWF0ZS4gICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX25ldyAobmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgdmFsdTsKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFAgPSBzeW1ib2xfY3JlYXRlIChuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKTsKLQotICAvKgotICAgKiBMaW5rIHRvIGVuZCBvZiBzeW1ib2wgY2hhaW4uCi0gICAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgewotICAgIGV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLSAgICBpZiAoc3ltYm9sX3RhYmxlX2Zyb3plbikKLSAgICAgIGFib3J0ICgpOwotICB9Ci0jZW5kaWYKLSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQotLyogU2F2ZSBhIHN5bWJvbCBuYW1lIG9uIGEgcGVybWFuZW50IG9ic3RhY2ssIGFuZCBjb252ZXJ0IGl0IGFjY29yZGluZwotICAgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCi0KLXN0YXRpYyBjaGFyICoKLXNhdmVfc3ltYm9sX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKLSAgY2hhciAqcmV0OwotCi0gIG5hbWVfbGVuZ3RoID0gc3RybGVuIChuYW1lKSArIDE7CS8qICsxIGZvciBcMCAqLwotICBvYnN0YWNrX2dyb3cgKCZub3RlcywgbmFtZSwgbmFtZV9sZW5ndGgpOwotICByZXQgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLQotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgaWYgKHJldFswXSA9PSAnXycpCi0gICAgKytyZXQ7Ci0jZW5kaWYKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICByZXQgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHJldCk7Ci0jZW5kaWYKLQotICBpZiAoISBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9ICh1bnNpZ25lZCBjaGFyICopIHJldDsgKnMgIT0gJ1wwJzsgcysrKQotCWlmIChpc2xvd2VyICgqcykpCi0JICAqcyA9IHRvdXBwZXIgKCpzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3ltYm9sUyAqCi1zeW1ib2xfY3JlYXRlIChuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKQotICAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogSXQgaXMgY29waWVkLCB0aGUgY2FsbGVyIGNhbiBkZXN0cm95L21vZGlmeSAqLwotICAgICBzZWdUIHNlZ21lbnQ7CQkvKiBTZWdtZW50IGlkZW50aWZpZXIgKFNFR188c29tZXRoaW5nPikgKi8KLSAgICAgdmFsdWVUIHZhbHU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBBc3NvY2lhdGVkIGZyYWdtZW50ICovCi17Ci0gIGNoYXIgKnByZXNlcnZlZF9jb3B5X29mX25hbWU7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSA9IHNhdmVfc3ltYm9sX25hbWUgKG5hbWUpOwotCi0gIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoc3ltYm9sUykpOwotCi0gIC8qIHN5bWJvbCBtdXN0IGJlIGJvcm4gaW4gc29tZSBmaXhlZCBzdGF0ZS4gIFRoaXMgc2VlbXMgYXMgZ29vZCBhcyBhbnkuICovCi0gIG1lbXNldCAoc3ltYm9sUCwgMCwgc2l6ZW9mIChzeW1ib2xTKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHN5bWJvbFAtPmJzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKHN0ZG91dHB1dCk7Ci0gIGlmIChzeW1ib2xQLT5ic3ltID09IE5VTEwpCi0gICAgYXNfcGVycm9yICgiJXMiLCAiYmZkX21ha2VfZW1wdHlfc3ltYm9sIik7Ci0gIHN5bWJvbFAtPmJzeW0tPnVkYXRhLnAgPSAoUFRSKSBzeW1ib2xQOwotI2VuZGlmCi0gIFNfU0VUX05BTUUgKHN5bWJvbFAsIHByZXNlcnZlZF9jb3B5X29mX25hbWUpOwotCi0gIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNlZ21lbnQpOwotICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgdmFsdSk7Ci0gIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKLQotICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZzsKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBzeW1ib2xQLT5zeV9udW1iZXIgPSB+MDsKLSAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSB+MDsKLSNlbmRpZgotCi0gIG9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotCi0jaWZkZWYgdGNfc3ltYm9sX25ld19ob29rCi0gIHRjX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0jZW5kaWYKLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIExvY2FsIHN5bWJvbCBzdXBwb3J0LiAgSWYgd2UgY2FuIGdldCBhd2F5IHdpdGggaXQsIHdlIGtlZXAgb25seSBhCi0gICBzbWFsbCBhbW91bnQgb2YgaW5mb3JtYXRpb24gZm9yIGxvY2FsIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jYWxfc3ltYm9sX21ha2UgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWdULAotCQkJCQkJICAgICAgIHZhbHVlVCwgZnJhZ1MgKikpOwotc3RhdGljIHN5bWJvbFMgKmxvY2FsX3N5bWJvbF9jb252ZXJ0IFBBUkFNUyAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikpOwotCi0vKiBVc2VkIGZvciBzdGF0aXN0aWNzLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9jYWxfc3ltYm9sX2NvdW50Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9jYWxfc3ltYm9sX2NvbnZlcnNpb25fY291bnQ7Ci0KLS8qIFRoaXMgbWFjcm8gaXMgY2FsbGVkIHdpdGggYSBzeW1ib2wgYXJndW1lbnQgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KLSAgIEl0IHJldHVybnMgd2hldGhlciB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgSWYgbmVjZXNzYXJ5LCBpdAotICAgY2hhbmdlcyBpdHMgYXJndW1lbnQgdG8gdGhlIHJlYWwgc3ltYm9sLiAgKi8KLQotI2RlZmluZSBMT0NBTF9TWU1CT0xfQ0hFQ0socykJCQkJCQlcCi0gIChzLT5ic3ltID09IE5VTEwJCQkJCQkJXAotICAgPyAobG9jYWxfc3ltYm9sX2NvbnZlcnRlZF9wICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKQkJXAotICAgICAgPyAocyA9IGxvY2FsX3N5bWJvbF9nZXRfcmVhbF9zeW1ib2wgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLAlcCi0JIDApCQkJCQkJCQlcCi0gICAgICA6IDEpCQkJCQkJCQlcCi0gICA6IDApCi0KLS8qIENyZWF0ZSBhIGxvY2FsIHN5bWJvbCBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGxvY2FsIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGxvY2FsX3N5bWJvbCAqCi1sb2NhbF9zeW1ib2xfbWFrZSAobmFtZSwgc2VjdGlvbiwgb2Zmc2V0LCBmcmFnKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzZWdUIHNlY3Rpb247Ci0gICAgIHZhbHVlVCBvZmZzZXQ7Ci0gICAgIGZyYWdTICpmcmFnOwotewotICBjaGFyICpuYW1lX2NvcHk7Ci0gIHN0cnVjdCBsb2NhbF9zeW1ib2wgKnJldDsKLQotICArK2xvY2FsX3N5bWJvbF9jb3VudDsKLQotICBuYW1lX2NvcHkgPSBzYXZlX3N5bWJvbF9uYW1lIChuYW1lKTsKLQotICByZXQgPSAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAqcmV0KTsKLSAgcmV0LT5sc3lfbWFya2VyID0gTlVMTDsKLSAgcmV0LT5sc3lfbmFtZSA9IG5hbWVfY29weTsKLSAgcmV0LT5sc3lfc2VjdGlvbiA9IHNlY3Rpb247Ci0gIGxvY2FsX3N5bWJvbF9zZXRfZnJhZyAocmV0LCBmcmFnKTsKLSAgcmV0LT5sc3lfb2Zmc2V0ID0gb2Zmc2V0OwotCi0gIGhhc2hfamFtIChsb2NhbF9oYXNoLCBuYW1lX2NvcHksIChQVFIpIHJldCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQ29udmVydCBhIGxvY2FsIHN5bWJvbCBpbnRvIGEgcmVhbCBzeW1ib2wuICBOb3RlIHRoYXQgd2UgZG8gbm90Ci0gICByZWNsYWltIHRoZSBzcGFjZSB1c2VkIGJ5IHRoZSBsb2NhbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgc3ltYm9sUyAqCi1sb2NhbF9zeW1ib2xfY29udmVydCAobG9jc3ltKQotICAgICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NzeW07Ci17Ci0gIHN5bWJvbFMgKnJldDsKLQotICBhc3NlcnQgKGxvY3N5bS0+bHN5X21hcmtlciA9PSBOVUxMKTsKLSAgaWYgKGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcCAobG9jc3ltKSkKLSAgICByZXR1cm4gbG9jYWxfc3ltYm9sX2dldF9yZWFsX3N5bWJvbCAobG9jc3ltKTsKLQotICArK2xvY2FsX3N5bWJvbF9jb252ZXJzaW9uX2NvdW50OwotCi0gIHJldCA9IHN5bWJvbF9uZXcgKGxvY3N5bS0+bHN5X25hbWUsIGxvY3N5bS0+bHN5X3NlY3Rpb24sIGxvY3N5bS0+bHN5X29mZnNldCwKLQkJICAgIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKSk7Ci0KLSAgaWYgKGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wIChsb2NzeW0pKQotICAgIHJldC0+c3lfcmVzb2x2ZWQgPSAxOwotCi0gIC8qIExvY2FsIHN5bWJvbHMgYXJlIGFsd2F5cyBlaXRoZXIgZGVmaW5lZCBvciB1c2VkLiAgKi8KLSAgcmV0LT5zeV91c2VkID0gMTsKLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChyZXQpOwotCi0gIGxvY2FsX3N5bWJvbF9tYXJrX2NvbnZlcnRlZCAobG9jc3ltKTsKLSAgbG9jYWxfc3ltYm9sX3NldF9yZWFsX3N5bWJvbCAobG9jc3ltLCByZXQpOwotCi0gIGhhc2hfamFtIChsb2NhbF9oYXNoLCBsb2NzeW0tPmxzeV9uYW1lLCBOVUxMKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2RlZmluZSBMT0NBTF9TWU1CT0xfQ0hFQ0socykgMAotI2RlZmluZSBsb2NhbF9zeW1ib2xfY29udmVydChzKSAoKHN5bWJvbFMgKikgcykKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotDAotCi0vKgotICoJCQljb2xvbigpCi0gKgotICogV2UgaGF2ZSBqdXN0IHNlZW4gIjxuYW1lPjoiLgotICogQ3JlYXRlcyBhIHN0cnVjdCBzeW1ib2wgdW5sZXNzIGl0IGFscmVhZHkgZXhpc3RzLgotICoKLSAqIEdyaXBlcyBpZiB3ZSBhcmUgcmVkZWZpbmluZyBhIHN5bWJvbCBpbmNvbXBhdGlibHkgKGFuZCBpZ25vcmVzIGl0KS4KLSAqCi0gKi8KLXN5bWJvbFMgKgotY29sb24gKHN5bV9uYW1lKQkJLyoganVzdCBzZWVuICJ4OiIgLSByYXR0bGUgc3ltYm9scyAmIGZyYWdzICovCi0gICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwkvKiBzeW1ib2wgbmFtZSwgYXMgYSBjYW5ub25pY2FsIHN0cmluZyAqLwotICAgICAvKiBXZSBjb3B5IHRoaXMgc3RyaW5nOiBPSyB0byBhbHRlciBsYXRlci4gKi8KLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsJLyogc3ltYm9sIHdlIGFyZSB3b3JraW5nIHdpdGggKi8KLQotICAvKiBTdW4gbG9jYWwgbGFiZWxzIGdvIG91dCBvZiBzY29wZSB3aGVuZXZlciBhIG5vbi1sb2NhbCBzeW1ib2wgaXMKLSAgICAgZGVmaW5lZC4gICovCi0gIGlmIChMT0NBTF9MQUJFTFNfRE9MTEFSKQotICAgIHsKLSAgICAgIGludCBsb2NhbDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGxvY2FsID0gYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKHN0ZG91dHB1dCwgc3ltX25hbWUpOwotI2Vsc2UKLSAgICAgIGxvY2FsID0gTE9DQUxfTEFCRUwgKHN5bV9uYW1lKTsKLSNlbmRpZgotCi0gICAgICBpZiAoISBsb2NhbCkKLQlkb2xsYXJfbGFiZWxfY2xlYXIgKCk7Ci0gICAgfQotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgaWYgKG5ld19icm9rZW5fd29yZHMpCi0gICAgewotICAgICAgc3RydWN0IGJyb2tlbl93b3JkICphOwotICAgICAgaW50IHBvc3NpYmxlX2J5dGVzOwotICAgICAgZnJhZ1MgKmZyYWdfdG1wOwotICAgICAgY2hhciAqZnJhZ19vcGNvZGU7Ci0KLSAgICAgIGV4dGVybiBjb25zdCBpbnQgbWRfc2hvcnRfanVtcF9zaXplOwotICAgICAgZXh0ZXJuIGNvbnN0IGludCBtZF9sb25nX2p1bXBfc2l6ZTsKLSAgICAgIHBvc3NpYmxlX2J5dGVzID0gKG1kX3Nob3J0X2p1bXBfc2l6ZQotCQkJKyBuZXdfYnJva2VuX3dvcmRzICogbWRfbG9uZ19qdW1wX3NpemUpOwotCi0gICAgICBmcmFnX3RtcCA9IGZyYWdfbm93OwotICAgICAgZnJhZ19vcGNvZGUgPSBmcmFnX3ZhciAocnNfYnJva2VuX3dvcmQsCi0JCQkgICAgICBwb3NzaWJsZV9ieXRlcywKLQkJCSAgICAgIHBvc3NpYmxlX2J5dGVzLAotCQkJICAgICAgKHJlbGF4X3N1YnN0YXRlVCkgMCwKLQkJCSAgICAgIChzeW1ib2xTICopIGJyb2tlbl93b3JkcywKLQkJCSAgICAgIChvZmZzZXRUKSAwLAotCQkJICAgICAgTlVMTCk7Ci0KLSAgICAgIC8qIFdlIHdhbnQgdG8gc3RvcmUgdGhlIHBvaW50ZXIgdG8gd2hlcmUgdG8gaW5zZXJ0IHRoZSBqdW1wIHRhYmxlIGluIHRoZQotCSBmcl9vcGNvZGUgb2YgdGhlIHJzX2Jyb2tlbl93b3JkIGZyYWcuICBUaGlzIHJlcXVpcmVzIGEgbGl0dGxlCi0JIGhhY2tlcnkuICAqLwotICAgICAgd2hpbGUgKGZyYWdfdG1wCi0JICAgICAmJiAoZnJhZ190bXAtPmZyX3R5cGUgIT0gcnNfYnJva2VuX3dvcmQKLQkJIHx8IGZyYWdfdG1wLT5mcl9vcGNvZGUpKQotCWZyYWdfdG1wID0gZnJhZ190bXAtPmZyX25leHQ7Ci0gICAgICBrbm93IChmcmFnX3RtcCk7Ci0gICAgICBmcmFnX3RtcC0+ZnJfb3Bjb2RlID0gZnJhZ19vcGNvZGU7Ci0gICAgICBuZXdfYnJva2VuX3dvcmRzID0gMDsKLQotICAgICAgZm9yIChhID0gYnJva2VuX3dvcmRzOyBhICYmIGEtPmRpc3BmcmFnID09IDA7IGEgPSBhLT5uZXh0X2Jyb2tlbl93b3JkKQotCWEtPmRpc3BmcmFnID0gZnJhZ190bXA7Ci0gICAgfQotI2VuZGlmIC8qIFdPUktJTkdfRE9UX1dPUkQgKi8KLQotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAoc3ltX25hbWUpKSAhPSAwKQotICAgIHsKLSNpZmRlZiBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04KLSAgICAgIGlmIChSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04gKHN5bWJvbFApKQotCXJldHVybiBzeW1ib2xQOwotI2VuZGlmCi0gICAgICAvKgotICAgICAgICoJTm93IGNoZWNrIGZvciB1bmRlZmluZWQgc3ltYm9scwotICAgICAgICovCi0gICAgICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLQl7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jc3ltID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgc3ltYm9sUDsKLQotCSAgaWYgKGxvY3N5bS0+bHN5X3NlY3Rpb24gIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgICAgICAmJiAobG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pICE9IGZyYWdfbm93Ci0JCSAgfHwgbG9jc3ltLT5sc3lfc2VjdGlvbiAhPSBub3dfc2VnCi0JCSAgfHwgbG9jc3ltLT5sc3lfb2Zmc2V0ICE9IGZyYWdfbm93X2ZpeCAoKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQuIiksIHN5bV9uYW1lKTsKLQkgICAgICByZXR1cm4gc3ltYm9sUDsKLQkgICAgfQotCi0JICBsb2NzeW0tPmxzeV9zZWN0aW9uID0gbm93X3NlZzsKLQkgIGxvY2FsX3N5bWJvbF9zZXRfZnJhZyAobG9jc3ltLCBmcmFnX25vdyk7Ci0JICBsb2NzeW0tPmxzeV9vZmZzZXQgPSBmcmFnX25vd19maXggKCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0JewotCSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotI2lmZGVmIE9CSl9WTVMKLQkgICAgICBTX1NFVF9PVEhFUihzeW1ib2xQLCBjb25zdF9mbGFnKTsKLSNlbmRpZgotCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIG5vd19zZWcpOwotI2lmZGVmIE5fVU5ERgotCSAgICAgIGtub3cgKE5fVU5ERiA9PSAwKTsKLSNlbmRpZiAvKiBpZiB3ZSBoYXZlIG9uZSwgaXQgYmV0dGVyIGJlIHplcm8uICovCi0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKglUaGVyZSBhcmUgc3RpbGwgc2V2ZXJhbCBjYXNlcyB0byBjaGVjazoKLQkgICAgICAgKgkJQSAuY29tbS8ubGNvbW0gc3ltYm9sIGJlaW5nIHJlZGVmaW5lZCBhcwotCSAgICAgICAqCQkJaW5pdGlhbGl6ZWQgZGF0YSBpcyBPSwotCSAgICAgICAqCQlBIC5jb21tLy5sY29tbSBzeW1ib2wgYmVpbmcgcmVkZWZpbmVkIHdpdGgKLQkgICAgICAgKgkJCWEgbGFyZ2VyIHNpemUgaXMgYWxzbyBPSwotCSAgICAgICAqCi0JICAgICAgICogVGhpcyBvbmx5IHVzZWQgdG8gYmUgYWxsb3dlZCBvbiBWTVMgZ2FzLCBidXQgU3VuIGNjCi0JICAgICAgICogb24gdGhlIHNwYXJjIGFsc28gZGVwZW5kcyBvbiBpdC4KLQkgICAgICAgKi8KLQotCSAgICAgIGlmICgoKCFTX0lTX0RFQlVHIChzeW1ib2xQKQotCQkgICAgJiYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLQkJICAgICYmIFNfSVNfRVhURVJOQUwgKHN5bWJvbFApKQotCQkgICB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkJICAmJiAobm93X3NlZyA9PSBkYXRhX3NlY3Rpb24KLQkJICAgICAgfHwgbm93X3NlZyA9PSBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSkpCi0JCXsKLQkJICAvKgotCQkgICAqCVNlbGVjdCB3aGljaCBvZiB0aGUgMiBjYXNlcyB0aGlzIGlzCi0JCSAgICovCi0JCSAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgIE5ldyAuY29tbSBmb3IgcHJldiAuY29tbSBzeW1ib2wuCi0JCSAgICAgICAqCUlmIHRoZSBuZXcgc2l6ZSBpcyBsYXJnZXIgd2UganVzdAotCQkgICAgICAgKgljaGFuZ2UgaXRzIHZhbHVlLiAgSWYgdGhlIG5ldyBzaXplCi0JCSAgICAgICAqCWlzIHNtYWxsZXIsIHdlIGlnbm9yZSB0aGlzIHN5bWJvbAotCQkgICAgICAgKi8KLQkJICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKQotCQkJICA8ICgodW5zaWduZWQpIGZyYWdfbm93X2ZpeCAoKSkpCi0JCQl7Ci0JCQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogSXQgaXMgYSAuY29tbS8ubGNvbW0gYmVpbmcgY29udmVydGVkIHRvIGluaXRpYWxpemVkCi0JCQkgZGF0YS4gICovCi0JCSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLSNpZmRlZiBPQkpfVk1TCi0JCSAgICAgIFNfU0VUX09USEVSKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOwotI2VuZGlmCi0JCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBub3dfc2VnKTsJLyoga2VlcCBOX0VYVCBiaXQgKi8KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotI2lmIGRlZmluZWQgKFNfR0VUX09USEVSKSAmJiBkZWZpbmVkIChTX0dFVF9ERVNDKQotCQkgIGFzX2ZhdGFsIChfKCJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWQuJWQuJWxkLiIpLAotCQkJICAgIHN5bV9uYW1lLAotCQkJICAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpLAotCQkJICAgIFNfR0VUX09USEVSIChzeW1ib2xQKSwgU19HRVRfREVTQyAoc3ltYm9sUCksCi0JCQkgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSk7Ci0jZWxzZQotCQkgIGFzX2ZhdGFsIChfKCJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWxkLiIpLAotCQkJICAgIHN5bV9uYW1lLAotCQkJICAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpLAotCQkJICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCkpOwotI2VuZGlmCi0JCX0KLQkgICAgfQkJCS8qIGlmIHRoZSB1bmRlZmluZWQgc3ltYm9sIGhhcyBubyB2YWx1ZSAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEb24ndCBibG93IHVwIGlmIHRoZSBkZWZpbml0aW9uIGlzIHRoZSBzYW1lICovCi0JICBpZiAoIShmcmFnX25vdyA9PSBzeW1ib2xQLT5zeV9mcmFnCi0JCSYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSBmcmFnX25vd19maXggKCkKLQkJJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gbm93X3NlZykpCi0JICAgIGFzX2ZhdGFsIChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkLiIpLCBzeW1fbmFtZSk7Ci0JfQkJCS8qIGlmIHRoaXMgc3ltYm9sIGlzIG5vdCB5ZXQgZGVmaW5lZCAqLwotCi0gICAgfQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZWxzZSBpZiAoISBmbGFnX2tlZXBfbG9jYWxzICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChzdGRvdXRwdXQsIHN5bV9uYW1lKSkKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gKHN5bWJvbFMgKikgbG9jYWxfc3ltYm9sX21ha2UgKHN5bV9uYW1lLCBub3dfc2VnLAotCQkJCQkgICAgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgICAgICAgZnJhZ19ub3cpOwotICAgIH0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAoc3ltX25hbWUsIG5vd19zZWcsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJCSAgICBmcmFnX25vdyk7Ci0jaWZkZWYgT0JKX1ZNUwotICAgICAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOwotI2VuZGlmIC8qIE9CSl9WTVMgKi8KLQotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0gICAgfQkJCQkvKiBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBzeW1ib2wgYmVmb3JlICovCi0KLSAgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBzeW1ib2wgaXMgYWN0dWFsbHkgYmVpbmcgZGVmaW5lZCB3aXRoaW4gYW4gTVJJIGNvbW1vbgotICAgICAgICAgc2VjdGlvbi4gIFRoaXMgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4gICovCi0gICAgICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLQlzeW1ib2xQID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bWJvbFApOwotICAgICAgc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID0gbXJpX2NvbW1vbl9zeW1ib2w7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSBTX0dFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wpOwotICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGV4cHJfc2VjdGlvbik7Ci0gICAgICBzeW1ib2xQLT5zeV9tcmlfY29tbW9uID0gMTsKLSAgICB9Ci0KLSNpZmRlZiB0Y19mcm9iX2xhYmVsCi0gIHRjX2Zyb2JfbGFiZWwgKHN5bWJvbFApOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfbGFiZWwKLSAgb2JqX2Zyb2JfbGFiZWwgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0MCi0KLS8qCi0gKgkJCXN5bWJvbF90YWJsZV9pbnNlcnQoKQotICoKLSAqIERpZSBpZiB3ZSBjYW4ndCBpbnNlcnQgdGhlIHN5bWJvbC4KLSAqCi0gKi8KLQotdm9pZCAKLXN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVycm9yX3N0cmluZzsKLQotICBrbm93IChzeW1ib2xQKTsKLSAga25vdyAoU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGVycm9yX3N0cmluZyA9IGhhc2hfamFtIChsb2NhbF9oYXNoLCBTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkJCSAgICAgICAoUFRSKSBzeW1ib2xQKTsKLSAgICAgIGlmIChlcnJvcl9zdHJpbmcgIT0gTlVMTCkKLQlhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN5bWJvbCB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCSAgU19HRVRfTkFNRSAoc3ltYm9sUCksIGVycm9yX3N0cmluZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgoZXJyb3Jfc3RyaW5nID0gaGFzaF9qYW0gKHN5X2hhc2gsIFNfR0VUX05BTUUgKHN5bWJvbFApLCAoUFRSKSBzeW1ib2xQKSkpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIkluc2VydGluZyBcIiVzXCIgaW50byBzeW1ib2wgdGFibGUgZmFpbGVkOiAlcyIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwgZXJyb3Jfc3RyaW5nKTsKLSAgICB9CQkJCS8qIG9uIGVycm9yICovCi19CQkJCS8qIHN5bWJvbF90YWJsZV9pbnNlcnQoKSAqLwotDAotLyoKLSAqCQkJc3ltYm9sX2ZpbmRfb3JfbWFrZSgpCi0gKgotICogSWYgYSBzeW1ib2wgbmFtZSBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGl0IGFzIHVuZGVmaW5lZCwgYW5kIGluc2VydAotICogaXQgaW50byB0aGUgc3ltYm9sIHRhYmxlLiBSZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotICovCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQotICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBpZiAoISBmbGFnX2tlZXBfbG9jYWxzICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChzdGRvdXRwdXQsIG5hbWUpKQotCXsKLQkgIHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sICgoY2hhciAqKSBuYW1lKTsKLQkgIGlmIChzeW1ib2xQICE9IE5VTEwpCi0JICAgIHJldHVybiBzeW1ib2xQOwotCi0JICBzeW1ib2xQID0gKHN5bWJvbFMgKikgbG9jYWxfc3ltYm9sX21ha2UgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLAotCQkJCQkJICAgKHZhbHVlVCkgMCwKLQkJCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JICByZXR1cm4gc3ltYm9sUDsKLQl9Ci0jZW5kaWYKLQotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChuYW1lKTsKLQotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0gICAgfQkJCQkvKiBpZiBzeW1ib2wgd2Fzbid0IGZvdW5kICovCi0KLSAgcmV0dXJuIChzeW1ib2xQKTsKLX0JCQkJLyogc3ltYm9sX2ZpbmRfb3JfbWFrZSgpICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX21ha2UgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogTGV0IHRoZSBtYWNoaW5lIGRlc2NyaXB0aW9uIGRlZmF1bHQgaXQsIGUuZy4gZm9yIHJlZ2lzdGVyIG5hbWVzLiAqLwotICBzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAoKGNoYXIgKikgbmFtZSk7Ci0KLSAgaWYgKCFzeW1ib2xQKQotICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgKHZhbHVlVCkgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICByZXR1cm4gKHN5bWJvbFApOwotfQkJCQkvKiBzeW1ib2xfbWFrZSgpICovCi0KLS8qCi0gKgkJCXN5bWJvbF9maW5kKCkKLSAqCi0gKiBJbXBsZW1lbnQgc3ltYm9sIHRhYmxlIGxvb2t1cC4KLSAqIEluOglBIHN5bWJvbCdzIG5hbWUgYXMgYSBzdHJpbmc6ICdcMCcgY2FuJ3QgYmUgcGFydCBvZiBhIHN5bWJvbCBuYW1lLgotICogT3V0OglOVUxMIGlmIHRoZSBuYW1lIHdhcyBub3QgaW4gdGhlIHN5bWJvbCB0YWJsZSwgZWxzZSB0aGUgYWRkcmVzcwotICoJb2YgYSBzdHJ1Y3Qgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUuCi0gKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfZmluZCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIHJldHVybiAoc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgMSkpOwotI2Vsc2UgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICByZXR1cm4gKHN5bWJvbF9maW5kX2Jhc2UgKG5hbWUsIDApKTsKLSNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi19CQkJCS8qIHN5bWJvbF9maW5kKCkgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfZmluZF9iYXNlIChuYW1lLCBzdHJpcF91bmRlcnNjb3JlKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBpbnQgc3RyaXBfdW5kZXJzY29yZTsKLXsKLSAgaWYgKHN0cmlwX3VuZGVyc2NvcmUgJiYgKm5hbWUgPT0gJ18nKQotICAgIG5hbWUrKzsKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICB7Ci0gICAgY2hhciAqY29weTsKLSAgICBzaXplX3QgbGVuID0gc3RybGVuIChuYW1lKSArIDE7Ci0KLSAgICBjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChsZW4pOwotICAgIG1lbWNweSAoY29weSwgbmFtZSwgbGVuKTsKLSAgICBuYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChjb3B5KTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKCEgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSkKLSAgICB7Ci0gICAgICBjaGFyICpjb3B5OwotICAgICAgY29uc3QgY2hhciAqb3JpZzsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYzsKLQotICAgICAgb3JpZyA9IG5hbWU7Ci0gICAgICBuYW1lID0gY29weSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICB3aGlsZSAoKGMgPSAqb3JpZysrKSAhPSAnXDAnKQotCXsKLQkgIGlmIChpc2xvd2VyIChjKSkKLQkgICAgYyA9IHRvdXBwZXIgKGMpOwotCSAgKmNvcHkrKyA9IGM7Ci0JfQotICAgICAgKmNvcHkgPSAnXDAnOwotICAgIH0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgewotICAgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bTsKLQotICAgIGxvY3N5bSA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIGhhc2hfZmluZCAobG9jYWxfaGFzaCwgbmFtZSk7Ci0gICAgaWYgKGxvY3N5bSAhPSBOVUxMKQotICAgICAgcmV0dXJuIChzeW1ib2xTICopIGxvY3N5bTsKLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuICgoc3ltYm9sUyAqKSBoYXNoX2ZpbmQgKHN5X2hhc2gsIG5hbWUpKTsKLX0KLQotLyoKLSAqIE9uY2UgdXBvbiBhIHRpbWUsIHN5bWJvbHMgd2VyZSBrZXB0IGluIGEgc2luZ2x5IGxpbmtlZCBsaXN0LiAgQXQKLSAqIGxlYXN0IGNvZmYgbmVlZHMgdG8gYmUgYWJsZSB0byByZWFycmFuZ2UgdGhlbSBmcm9tIHRpbWUgdG8gdGltZSwgZm9yCi0gKiB3aGljaCBhIGRvdWJseSBsaW5rZWQgbGlzdCBpcyBtdWNoIG1vcmUgY29udmVuaWVudC4gIExvaWMgZGlkIHRoZXNlCi0gKiBhcyBtYWNyb3Mgd2hpY2ggc2VlbWVkIGRhbmdlcm91cyB0byBtZSBzbyB0aGV5J3JlIG5vdyBmdW5jdGlvbnMuCi0gKiB4b3hvcmljaC4KLSAqLwotCi0vKiBMaW5rIHN5bWJvbCBBRERNRSBhZnRlciBzeW1ib2wgVEFSR0VUIGluIHRoZSBjaGFpbi4gKi8KLXZvaWQgCi1zeW1ib2xfYXBwZW5kIChhZGRtZSwgdGFyZ2V0LCByb290UFAsIGxhc3RQUCkKLSAgICAgc3ltYm9sUyAqYWRkbWU7Ci0gICAgIHN5bWJvbFMgKnRhcmdldDsKLSAgICAgc3ltYm9sUyAqKnJvb3RQUDsKLSAgICAgc3ltYm9sUyAqKmxhc3RQUDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoYWRkbWUpKQotICAgIGFib3J0ICgpOwotICBpZiAodGFyZ2V0ICE9IE5VTEwgJiYgTE9DQUxfU1lNQk9MX0NIRUNLICh0YXJnZXQpKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh0YXJnZXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBrbm93ICgqcm9vdFBQID09IE5VTEwpOwotICAgICAga25vdyAoKmxhc3RQUCA9PSBOVUxMKTsKLSAgICAgIGFkZG1lLT5zeV9uZXh0ID0gTlVMTDsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gICAgICBhZGRtZS0+c3lfcHJldmlvdXMgPSBOVUxMOwotI2VuZGlmCi0gICAgICAqcm9vdFBQID0gYWRkbWU7Ci0gICAgICAqbGFzdFBQID0gYWRkbWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiB0aGUgbGlzdCBpcyBlbXB0eSAqLwotCi0gIGlmICh0YXJnZXQtPnN5X25leHQgIT0gTlVMTCkKLSAgICB7Ci0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICAgICAgdGFyZ2V0LT5zeV9uZXh0LT5zeV9wcmV2aW91cyA9IGFkZG1lOwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBrbm93ICgqbGFzdFBQID09IHRhcmdldCk7Ci0gICAgICAqbGFzdFBQID0gYWRkbWU7Ci0gICAgfQkJCQkvKiBpZiB3ZSBoYXZlIGEgbmV4dCAqLwotCi0gIGFkZG1lLT5zeV9uZXh0ID0gdGFyZ2V0LT5zeV9uZXh0OwotICB0YXJnZXQtPnN5X25leHQgPSBhZGRtZTsKLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgYWRkbWUtPnN5X3ByZXZpb3VzID0gdGFyZ2V0OwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotICBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKLX0KLQotLyogU2V0IHRoZSBjaGFpbiBwb2ludGVycyBvZiBTWU1CT0wgdG8gbnVsbC4gKi8KLXZvaWQgCi1zeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltYm9sUCkpCi0gICAgYWJvcnQgKCk7Ci0gIHN5bWJvbFAtPnN5X25leHQgPSBOVUxMOwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgc3ltYm9sUC0+c3lfcHJldmlvdXMgPSBOVUxMOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0vKiBSZW1vdmUgU1lNQk9MUCBmcm9tIHRoZSBsaXN0LiAqLwotdm9pZCAKLXN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsIHJvb3RQUCwgbGFzdFBQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotICAgICBzeW1ib2xTICoqcm9vdFBQOwotICAgICBzeW1ib2xTICoqbGFzdFBQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoc3ltYm9sUCA9PSAqcm9vdFBQKQotICAgIHsKLSAgICAgICpyb290UFAgPSBzeW1ib2xQLT5zeV9uZXh0OwotICAgIH0JCQkJLyogaWYgaXQgd2FzIHRoZSByb290ICovCi0KLSAgaWYgKHN5bWJvbFAgPT0gKmxhc3RQUCkKLSAgICB7Ci0gICAgICAqbGFzdFBQID0gc3ltYm9sUC0+c3lfcHJldmlvdXM7Ci0gICAgfQkJCQkvKiBpZiBpdCB3YXMgdGhlIHRhaWwgKi8KLQotICBpZiAoc3ltYm9sUC0+c3lfbmV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAtPnN5X25leHQtPnN5X3ByZXZpb3VzID0gc3ltYm9sUC0+c3lfcHJldmlvdXM7Ci0gICAgfQkJCQkvKiBpZiBub3QgbGFzdCAqLwotCi0gIGlmIChzeW1ib2xQLT5zeV9wcmV2aW91cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAtPnN5X3ByZXZpb3VzLT5zeV9uZXh0ID0gc3ltYm9sUC0+c3lfbmV4dDsKLSAgICB9CQkJCS8qIGlmIG5vdCBmaXJzdCAqLwotCi0gIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoKnJvb3RQUCwgKmxhc3RQUCk7Ci19Ci0KLS8qIExpbmsgc3ltYm9sIEFERE1FIGJlZm9yZSBzeW1ib2wgVEFSR0VUIGluIHRoZSBjaGFpbi4gKi8KLXZvaWQgCi1zeW1ib2xfaW5zZXJ0IChhZGRtZSwgdGFyZ2V0LCByb290UFAsIGxhc3RQUCkKLSAgICAgc3ltYm9sUyAqYWRkbWU7Ci0gICAgIHN5bWJvbFMgKnRhcmdldDsKLSAgICAgc3ltYm9sUyAqKnJvb3RQUDsKLSAgICAgc3ltYm9sUyAqKmxhc3RQUDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoYWRkbWUpKQotICAgIGFib3J0ICgpOwotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLICh0YXJnZXQpKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh0YXJnZXQtPnN5X3ByZXZpb3VzICE9IE5VTEwpCi0gICAgewotICAgICAgdGFyZ2V0LT5zeV9wcmV2aW91cy0+c3lfbmV4dCA9IGFkZG1lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKCpyb290UFAgPT0gdGFyZ2V0KTsKLSAgICAgICpyb290UFAgPSBhZGRtZTsKLSAgICB9CQkJCS8qIGlmIG5vdCBmaXJzdCAqLwotCi0gIGFkZG1lLT5zeV9wcmV2aW91cyA9IHRhcmdldC0+c3lfcHJldmlvdXM7Ci0gIHRhcmdldC0+c3lfcHJldmlvdXMgPSBhZGRtZTsKLSAgYWRkbWUtPnN5X25leHQgPSB0YXJnZXQ7Ci0KLSAgZGVidWdfdmVyaWZ5X3N5bWNoYWluICgqcm9vdFBQLCAqbGFzdFBQKTsKLX0KLQotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotdm9pZCAKLXZlcmlmeV9zeW1ib2xfY2hhaW4gKHJvb3RQLCBsYXN0UCkKLSAgICAgc3ltYm9sUyAqcm9vdFA7Ci0gICAgIHN5bWJvbFMgKmxhc3RQOwotewotICBzeW1ib2xTICpzeW1ib2xQID0gcm9vdFA7Ci0KLSAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yICg7IHN5bWJvbF9uZXh0IChzeW1ib2xQKSAhPSBOVUxMOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBhc3NlcnQgKHN5bWJvbFAtPmJzeW0gIT0gTlVMTCk7Ci0jZW5kaWYKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gICAgICBhc3NlcnQgKHN5bWJvbFAtPnN5X25leHQtPnN5X3ByZXZpb3VzID09IHN5bWJvbFApOwotI2Vsc2UKLSAgICAgIC8qIFdhbGsgdGhlIGxpc3QgYW55d2F5cywgdG8gbWFrZSBzdXJlIHBvaW50ZXJzIGFyZSBzdGlsbCBnb29kLiAgKi8KLSAgICAgIDsKLSNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCi0gICAgfQotCi0gIGFzc2VydCAobGFzdFAgPT0gc3ltYm9sUCk7Ci19Ci0KLXZvaWQKLXZlcmlmeV9zeW1ib2xfY2hhaW5fMiAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN5bWJvbFMgKnAgPSBzeW0sICpuID0gc3ltOwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgd2hpbGUgKHN5bWJvbF9wcmV2aW91cyAocCkpCi0gICAgcCA9IHN5bWJvbF9wcmV2aW91cyAocCk7Ci0jZW5kaWYKLSAgd2hpbGUgKHN5bWJvbF9uZXh0IChuKSkKLSAgICBuID0gc3ltYm9sX25leHQgKG4pOwotICB2ZXJpZnlfc3ltYm9sX2NoYWluIChwLCBuKTsKLX0KLQotLyogUmVzb2x2ZSB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpbmFsCi0gICBwYXNzIG92ZXIgdGhlIHN5bWJvbCB0YWJsZSB0byByZXNvbHZlIGFueSBzeW1ib2xzIHdpdGggY29tcGxleAotICAgdmFsdWVzLiAgKi8KLQotdmFsdWVUCi1yZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltcCwgZmluYWxpemUpCi0gICAgIHN5bWJvbFMgKnN5bXA7Ci0gICAgIGludCBmaW5hbGl6ZTsKLXsKLSAgaW50IHJlc29sdmVkOwotICB2YWx1ZVQgZmluYWxfdmFsOwotICBzZWdUIGZpbmFsX3NlZzsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltcCkpCi0gICAgewotICAgICAgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jc3ltID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgc3ltcDsKLQotICAgICAgaWYgKGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wIChsb2NzeW0pKQotCXJldHVybiBsb2NzeW0tPmxzeV9vZmZzZXQ7Ci0KLSAgICAgIGZpbmFsX3ZhbCA9IChsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSktPmZyX2FkZHJlc3MKLQkJICAgKyBsb2NzeW0tPmxzeV9vZmZzZXQpOwotCi0gICAgICBpZiAoZmluYWxpemUpCi0JewotCSAgbG9jc3ltLT5sc3lfb2Zmc2V0ID0gZmluYWxfdmFsOwotCSAgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQgKGxvY3N5bSk7Ci0JfQotCi0gICAgICByZXR1cm4gZmluYWxfdmFsOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChzeW1wLT5zeV9yZXNvbHZlZCkKLSAgICB7Ci0gICAgICBpZiAoc3ltcC0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50KQotCXJldHVybiAodmFsdWVUKSBzeW1wLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJlc29sdmVkID0gMDsKLSAgZmluYWxfc2VnID0gU19HRVRfU0VHTUVOVCAoc3ltcCk7Ci0KLSAgaWYgKHN5bXAtPnN5X3Jlc29sdmluZykKLSAgICB7Ci0gICAgICBpZiAoZmluYWxpemUpCi0JYXNfYmFkIChfKCJTeW1ib2wgZGVmaW5pdGlvbiBsb29wIGVuY291bnRlcmVkIGF0ICVzIiksIFNfR0VUX05BTUUgKHN5bXApKTsKLSAgICAgIGZpbmFsX3ZhbCA9IDA7Ci0gICAgICByZXNvbHZlZCA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbCwgKm9wX3N5bWJvbDsKLSAgICAgIG9mZnNldFQgbGVmdCwgcmlnaHQ7Ci0gICAgICBzZWdUIHNlZ19sZWZ0LCBzZWdfcmlnaHQ7Ci0gICAgICBvcGVyYXRvclQgb3A7Ci0KLSAgICAgIHN5bXAtPnN5X3Jlc29sdmluZyA9IDE7Ci0KLSAgICAgIC8qIEhlbHAgb3V0IHdpdGggQ1NFLiAgKi8KLSAgICAgIGFkZF9zeW1ib2wgPSBzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0gICAgICBvcF9zeW1ib2wgPSBzeW1wLT5zeV92YWx1ZS5YX29wX3N5bWJvbDsKLSAgICAgIGZpbmFsX3ZhbCA9IHN5bXAtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLSAgICAgIG9wID0gc3ltcC0+c3lfdmFsdWUuWF9vcDsKLQotICAgICAgc3dpdGNoIChvcCkKLQl7Ci0JZGVmYXVsdDoKLQkgIEJBRF9DQVNFIChvcCk7Ci0JICBicmVhazsKLQotCWNhc2UgT19hYnNlbnQ6Ci0JICBmaW5hbF92YWwgPSAwOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQotCWNhc2UgT19jb25zdGFudDoKLQkgIGZpbmFsX3ZhbCArPSBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotCSAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24pCi0JICAgIGZpbmFsX3NlZyA9IGFic29sdXRlX3NlY3Rpb247Ci0JICByZXNvbHZlZCA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT19zeW1ib2w6Ci0JY2FzZSBPX3N5bWJvbF9ydmE6Ci0JICBsZWZ0ID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2wsIGZpbmFsaXplKTsKLQlkb19zeW1ib2w6Ci0KLQkgIGlmIChzeW1wLT5zeV9tcmlfY29tbW9uKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHN5bWJvbCBpbnNpZGUgYW4gTVJJIGNvbW1vbiBzZWN0aW9uLiAgVGhlCi0gICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gcm91dGluZXMgYXJlIGdvaW5nIHRvIGhhbmRsZSBpdCBzcGVjaWFsbHkuCi0gICAgICAgICAgICAgICAgIERvbid0IGNoYW5nZSB0aGUgdmFsdWUuICAqLwotCSAgICAgIHJlc29sdmVkID0gc3ltYm9sX3Jlc29sdmVkX3AgKGFkZF9zeW1ib2wpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChmaW5hbGl6ZSAmJiBmaW5hbF92YWwgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKGFkZF9zeW1ib2wpKQotCQlhZGRfc3ltYm9sID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopCi0JCQkJCQkgICBhZGRfc3ltYm9sKTsKLQkgICAgICBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChzeW1wLCBhZGRfc3ltYm9sKTsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBoYXZlIGVxdWF0ZWQgdGhpcyBzeW1ib2wgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCwgd2UKLSAgICAgICAgICAgICBrZWVwIFhfb3Agc2V0IHRvIE9fc3ltYm9sLCBhbmQgd2UgZG9uJ3QgY2hhbmdlCi0gICAgICAgICAgICAgWF9hZGRfbnVtYmVyLiAgVGhpcyBwZXJtaXRzIHRoZSByb3V0aW5lIHdoaWNoIHdyaXRlcyBvdXQKLSAgICAgICAgICAgICByZWxvY2F0aW9uIHRvIGRldGVjdCB0aGlzIGNhc2UsIGFuZCBjb252ZXJ0IHRoZQotICAgICAgICAgICAgIHJlbG9jYXRpb24gdG8gYmUgYWdhaW5zdCB0aGUgc3ltYm9sIHRvIHdoaWNoIHRoaXMgc3ltYm9sCi0gICAgICAgICAgICAgaXMgZXF1YXRlZC4gICovCi0JICBpZiAoISBTX0lTX0RFRklORUQgKGFkZF9zeW1ib2wpIHx8IFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sKSkKLQkgICAgewotCSAgICAgIGlmIChmaW5hbGl6ZSkKLQkJewotCQkgIFNfU0VUX1NFR01FTlQgKHN5bXAsIFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2wpKTsKLQkJICBzeW1wLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7Ci0JCSAgc3ltcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID0gYWRkX3N5bWJvbDsKLQkJICBzeW1wLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSBmaW5hbF92YWw7Ci0JCX0KLQkgICAgICBmaW5hbF92YWwgPSAwOwotCSAgICAgIHJlc29sdmVkID0gc3ltYm9sX3Jlc29sdmVkX3AgKGFkZF9zeW1ib2wpOwotCSAgICAgIGdvdG8gZXhpdF9kb250X3NldF92YWx1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZmluYWxfdmFsICs9IHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3MgKyBsZWZ0OwotCSAgICAgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uIHx8IGZpbmFsX3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJZmluYWxfc2VnID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbCk7Ci0JICAgIH0KLQotCSAgcmVzb2x2ZWQgPSBzeW1ib2xfcmVzb2x2ZWRfcCAoYWRkX3N5bWJvbCk7Ci0JICBicmVhazsKLQotCWNhc2UgT191bWludXM6Ci0JY2FzZSBPX2JpdF9ub3Q6Ci0JY2FzZSBPX2xvZ2ljYWxfbm90OgotCSAgbGVmdCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0KLQkgIGlmIChvcCA9PSBPX3VtaW51cykKLQkgICAgbGVmdCA9IC1sZWZ0OwotCSAgZWxzZSBpZiAob3AgPT0gT19sb2dpY2FsX25vdCkKLQkgICAgbGVmdCA9ICFsZWZ0OwotCSAgZWxzZQotCSAgICBsZWZ0ID0gfmxlZnQ7Ci0KLQkgIGZpbmFsX3ZhbCArPSBsZWZ0ICsgc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKLQkgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uIHx8IGZpbmFsX3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgZmluYWxfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLQotCSAgcmVzb2x2ZWQgPSBzeW1ib2xfcmVzb2x2ZWRfcCAoYWRkX3N5bWJvbCk7Ci0JICBicmVhazsKLQotCWNhc2UgT19tdWx0aXBseToKLQljYXNlIE9fZGl2aWRlOgotCWNhc2UgT19tb2R1bHVzOgotCWNhc2UgT19sZWZ0X3NoaWZ0OgotCWNhc2UgT19yaWdodF9zaGlmdDoKLQljYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoKLQljYXNlIE9fYml0X29yX25vdDoKLQljYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoKLQljYXNlIE9fYml0X2FuZDoKLQljYXNlIE9fYWRkOgotCWNhc2UgT19zdWJ0cmFjdDoKLQljYXNlIE9fZXE6Ci0JY2FzZSBPX25lOgotCWNhc2UgT19sdDoKLQljYXNlIE9fbGU6Ci0JY2FzZSBPX2dlOgotCWNhc2UgT19ndDoKLQljYXNlIE9fbG9naWNhbF9hbmQ6Ci0JY2FzZSBPX2xvZ2ljYWxfb3I6Ci0JICBsZWZ0ID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2wsIGZpbmFsaXplKTsKLQkgIHJpZ2h0ID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKG9wX3N5bWJvbCwgZmluYWxpemUpOwotCSAgc2VnX2xlZnQgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sKTsKLQkgIHNlZ19yaWdodCA9IFNfR0VUX1NFR01FTlQgKG9wX3N5bWJvbCk7Ci0KLQkgIC8qIFNpbXBsaWZ5IGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIG9mIGEgY29uc3RhbnQgYnkgZm9sZGluZyB0aGUKLQkgICAgIGNvbnN0YW50IGludG8gWF9hZGRfbnVtYmVyLiAgKi8KLQkgIGlmIChvcCA9PSBPX2FkZCB8fCBvcCA9PSBPX3N1YnRyYWN0KQotCSAgICB7Ci0JICAgICAgaWYgKHNlZ19yaWdodCA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCQl7Ci0JCSAgaWYgKG9wID09IE9fYWRkKQotCQkgICAgZmluYWxfdmFsICs9IHJpZ2h0OwotCQkgIGVsc2UKLQkJICAgIGZpbmFsX3ZhbCAtPSByaWdodDsKLQkJICBvcCA9IE9fc3ltYm9sOwotCQkgIG9wX3N5bWJvbCA9IE5VTEw7Ci0JCSAgZ290byBkb19zeW1ib2w7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzZWdfbGVmdCA9PSBhYnNvbHV0ZV9zZWN0aW9uICYmIG9wID09IE9fYWRkKQotCQl7Ci0JCSAgb3AgPSBPX3N5bWJvbDsKLQkJICBmaW5hbF92YWwgKz0gbGVmdDsKLQkJICBhZGRfc3ltYm9sID0gb3Bfc3ltYm9sOwotCQkgIGxlZnQgPSByaWdodDsKLQkJICBvcF9zeW1ib2wgPSBOVUxMOwotCQkgIGdvdG8gZG9fc3ltYm9sOwotCQl9Ci0JICAgIH0KLQotCSAgLyogU3VidHJhY3Rpb24gaXMgcGVybWl0dGVkIGlmIGJvdGggb3BlcmFuZHMgYXJlIGluIHRoZSBzYW1lCi0JICAgICBzZWN0aW9uLiAgT3RoZXJ3aXNlLCBib3RoIG9wZXJhbmRzIG11c3QgYmUgYWJzb2x1dGUuICBXZQotCSAgICAgYWxyZWFkeSBoYW5kbGVkIHRoZSBjYXNlIG9mIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIG9mIGEKLQkgICAgIGNvbnN0YW50IGFib3ZlLiAgVGhpcyB3aWxsIHByb2JhYmx5IG5lZWQgdG8gYmUgY2hhbmdlZAotCSAgICAgZm9yIGFuIG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBzdXBwb3J0cyBhcmJpdHJhcnkKLQkgICAgIGV4cHJlc3Npb25zLCBzdWNoIGFzIElFRUUtNjk1LiAgKi8KLQkgIC8qIERvbid0IGVtaXQgbWVzc2FnZXMgdW5sZXNzIHdlJ3JlIGZpbmFsaXppbmcgdGhlIHN5bWJvbCB2YWx1ZSwKLQkgICAgIG90aGVyd2lzZSB3ZSBtYXkgZ2V0IHRoZSBzYW1lIG1lc3NhZ2UgbXVsdGlwbGUgdGltZXMuICAqLwotCSAgaWYgKChzZWdfbGVmdCAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0JICAgICAgIHx8IHNlZ19yaWdodCAhPSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICAgICYmIChvcCAhPSBPX3N1YnRyYWN0Ci0JCSAgfHwgc2VnX2xlZnQgIT0gc2VnX3JpZ2h0Ci0JCSAgfHwgc2VnX2xlZnQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JICAgICAgJiYgZmluYWxpemUpCi0JICAgIHsKLQkgICAgICBjaGFyICpmaWxlOwotCSAgICAgIHVuc2lnbmVkIGludCBsaW5lOwotCi0JICAgICAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChzeW1wLCAmZmlsZSwgJmxpbmUpKQotCQl7Ci0JCSAgaWYgKHNlZ19sZWZ0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAotCQkJCSAgXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24iKSwKLQkJCQkgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCkpOwotCQkgIGlmIChzZWdfcmlnaHQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsCi0JCQkJICBfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiIpLAotCQkJCSAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2wpKTsKLQkJICBpZiAoc2VnX2xlZnQgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkJICAgICAgJiYgc2VnX3JpZ2h0ICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJpbnZhbGlkIHNlY3Rpb24gZm9yIG9wZXJhdGlvbiIpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChzZWdfbGVmdCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZCAoXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24gc2V0dGluZyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCQkgIGlmIChzZWdfcmlnaHQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWQgKF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIHNldHRpbmcgJXMiKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX29wX3N5bWJvbCksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCQkgIGlmIChzZWdfbGVmdCAhPSB1bmRlZmluZWRfc2VjdGlvbgotCQkgICAgICAmJiBzZWdfcmlnaHQgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWQgKF8oImludmFsaWQgc2VjdGlvbiBmb3Igb3BlcmF0aW9uIHNldHRpbmcgJXMiKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDaGVjayBmb3IgZGl2aXNpb24gYnkgemVyby4gICovCi0JICBpZiAoKG9wID09IE9fZGl2aWRlIHx8IG9wID09IE9fbW9kdWx1cykgJiYgcmlnaHQgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHNlZ19yaWdodCBpcyBub3QgYWJzb2x1dGVfc2VjdGlvbiwgdGhlbiB3ZSd2ZQotICAgICAgICAgICAgICAgICBhbHJlYWR5IGlzc3VlZCBhIHdhcm5pbmcgYWJvdXQgdXNpbmcgYSBiYWQgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoc2VnX3JpZ2h0ID09IGFic29sdXRlX3NlY3Rpb24gJiYgZmluYWxpemUpCi0JCXsKLQkJICBjaGFyICpmaWxlOwotCQkgIHVuc2lnbmVkIGludCBsaW5lOwotCi0JCSAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChzeW1wLCAmZmlsZSwgJmxpbmUpKQotCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJkaXZpc2lvbiBieSB6ZXJvIikpOwotCQkgIGVsc2UKLQkJICAgIGFzX2JhZCAoXygiZGl2aXNpb24gYnkgemVybyB3aGVuIHNldHRpbmcgJXMiKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JCX0KLQotCSAgICAgIHJpZ2h0ID0gMTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHN5bXAtPnN5X3ZhbHVlLlhfb3ApCi0JICAgIHsKLQkgICAgY2FzZSBPX211bHRpcGx5OgkJbGVmdCAqPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19kaXZpZGU6CQlsZWZ0IC89IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX21vZHVsdXM6CQlsZWZ0ICU9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2xlZnRfc2hpZnQ6CQlsZWZ0IDw8PSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19yaWdodF9zaGlmdDoJCWxlZnQgPj49IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6CWxlZnQgfD0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X29yX25vdDoJCWxlZnQgfD0gfnJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6CWxlZnQgXj0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2FuZDoJCWxlZnQgJj0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fYWRkOgkJCWxlZnQgKz0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fc3VidHJhY3Q6CQlsZWZ0IC09IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2VxOglsZWZ0ID0gbGVmdCA9PSByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKLQkgICAgY2FzZSBPX25lOglsZWZ0ID0gbGVmdCAhPSByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKLQkgICAgY2FzZSBPX2x0OglsZWZ0ID0gbGVmdCA8ICByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKLQkgICAgY2FzZSBPX2xlOglsZWZ0ID0gbGVmdCA8PSByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKLQkgICAgY2FzZSBPX2dlOglsZWZ0ID0gbGVmdCA+PSByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKLQkgICAgY2FzZSBPX2d0OglsZWZ0ID0gbGVmdCA+ICByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKLQkgICAgY2FzZSBPX2xvZ2ljYWxfYW5kOglsZWZ0ID0gbGVmdCAmJiByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sb2dpY2FsX29yOglsZWZ0ID0gbGVmdCB8fCByaWdodDsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CQlhYm9ydCAoKTsKLQkgICAgfQotCi0JICBmaW5hbF92YWwgKz0gc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyArIGxlZnQ7Ci0JICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbiB8fCBmaW5hbF9zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JICAgIGZpbmFsX3NlZyA9IGFic29sdXRlX3NlY3Rpb247Ci0JICByZXNvbHZlZCA9IChzeW1ib2xfcmVzb2x2ZWRfcCAoYWRkX3N5bWJvbCkKLQkJICAgICAgJiYgc3ltYm9sX3Jlc29sdmVkX3AgKG9wX3N5bWJvbCkpOwotICAgCSAgYnJlYWs7Ci0KLQljYXNlIE9fcmVnaXN0ZXI6Ci0JY2FzZSBPX2JpZzoKLQljYXNlIE9faWxsZWdhbDoKLQkgIC8qIEdpdmUgYW4gZXJyb3IgKGJlbG93KSBpZiBub3QgaW4gZXhwcl9zZWN0aW9uLiAgV2UgZG9uJ3QKLQkgICAgIHdhbnQgdG8gd29ycnkgYWJvdXQgZXhwcl9zZWN0aW9uIHN5bWJvbHMsIGJlY2F1c2UgdGhleQotCSAgICAgYXJlIGZpY3Rpb25hbCAodGhleSBhcmUgY3JlYXRlZCBhcyBwYXJ0IG9mIGV4cHJlc3Npb24KLQkgICAgIHJlc29sdXRpb24pLCBhbmQgYW55IHByb2JsZW1zIG1heSBub3QgYWN0dWFsbHkgbWVhbgotCSAgICAgYW55dGhpbmcuICAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzeW1wLT5zeV9yZXNvbHZpbmcgPSAwOwotICAgIH0KLQotICBpZiAoZmluYWxpemUpCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKHN5bXAsIGZpbmFsX3ZhbCk7Ci0KLSNpZiBkZWZpbmVkIChPQkpfQU9VVCkgJiYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICAgICAgLyogVGhlIG9sZCBhLm91dCBiYWNrZW5kIGRvZXMgbm90IGhhbmRsZSBTX1NFVF9TRUdNRU5UIGNvcnJlY3RseQotICAgICAgICAgZm9yIGEgc3RhYiBzeW1ib2wsIHNvIHdlIHVzZSB0aGlzIGJhZCBoYWNrLiAgKi8KLSAgICAgIGlmIChmaW5hbF9zZWcgIT0gU19HRVRfU0VHTUVOVCAoc3ltcCkpCi0jZW5kaWYKLQlTX1NFVF9TRUdNRU5UIChzeW1wLCBmaW5hbF9zZWcpOwotICAgIH0KLQotZXhpdF9kb250X3NldF92YWx1ZToKLSAgLyogRG9uJ3Qgd29ycnkgaWYgd2UgY2FuJ3QgcmVzb2x2ZSBhbiBleHByX3NlY3Rpb24gc3ltYm9sLiAgKi8KLSAgaWYgKGZpbmFsaXplKQotICAgIHsKLSAgICAgIGlmIChyZXNvbHZlZCkKLQlzeW1wLT5zeV9yZXNvbHZlZCA9IDE7Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW1wKSAhPSBleHByX3NlY3Rpb24pCi0JewotCSAgYXNfYmFkIChfKCJjYW4ndCByZXNvbHZlIHZhbHVlIGZvciBzeW1ib2wgXCIlc1wiIiksIFNfR0VUX05BTUUgKHN5bXApKTsKLQkgIHN5bXAtPnN5X3Jlc29sdmVkID0gMTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBmaW5hbF92YWw7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXN0YXRpYyB2b2lkIHJlc29sdmVfbG9jYWxfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgUFRSKSk7Ci0KLS8qIEEgc3RhdGljIGZ1bmN0aW9uIHBhc3NlZCB0byBoYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlc29sdmVfbG9jYWxfc3ltYm9sIChrZXksIHZhbHVlKQotICAgICBjb25zdCBjaGFyICprZXk7Ci0gICAgIFBUUiB2YWx1ZTsKLXsKLSAgaWYgKHZhbHVlICE9IE5VTEwpCi0gICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHZhbHVlLCAxKTsKLX0KLQotI2VuZGlmCi0KLS8qIFJlc29sdmUgYWxsIGxvY2FsIHN5bWJvbHMuICAqLwotCi12b2lkCi1yZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMgKCkKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGhhc2hfdHJhdmVyc2UgKGxvY2FsX2hhc2gsIHJlc29sdmVfbG9jYWxfc3ltYm9sKTsKLSNlbmRpZgotfQotCi0vKiBEb2xsYXIgbGFiZWxzIGxvb2sgbGlrZSBhIG51bWJlciBmb2xsb3dlZCBieSBhIGRvbGxhciBzaWduLiAgRWcsICI0MiQiLgotICAgVGhleSBhcmUgKnJlYWxseSogbG9jYWwuICBUaGF0IGlzLCB0aGV5IGdvIG91dCBvZiBzY29wZSB3aGVuZXZlciB3ZSBzZWUgYQotICAgbGFiZWwgdGhhdCBpc24ndCBsb2NhbC4gIEFsc28sIGxpa2UgZmIgbGFiZWxzLCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUKLSAgIGluc3RhbmNlcyBvZiBhIGRvbGxhciBsYWJlbC4gIFRoZXJlZm9yLCB3ZSBuYW1lIGVuY29kZSBlYWNoIGluc3RhbmNlIHdpdGgKLSAgIHRoZSBpbnN0YW5jZSBudW1iZXIsIGtlZXAgYSBsaXN0IG9mIGRlZmluZWQgc3ltYm9scyBzZXBhcmF0ZSBmcm9tIHRoZSByZWFsCi0gICBzeW1ib2wgdGFibGUsIGFuZCB3ZSB0cmVhdCB0aGVzZSBidWdnZXJzIGFzIGEgc3BhcnNlIGFycmF5LiAgKi8KLQotc3RhdGljIGxvbmcgKmRvbGxhcl9sYWJlbHM7Ci1zdGF0aWMgbG9uZyAqZG9sbGFyX2xhYmVsX2luc3RhbmNlczsKLXN0YXRpYyBjaGFyICpkb2xsYXJfbGFiZWxfZGVmaW5lczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvbGxhcl9sYWJlbF9jb3VudDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvbGxhcl9sYWJlbF9tYXg7Ci0KLWludCAKLWRvbGxhcl9sYWJlbF9kZWZpbmVkIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBrbm93ICgoZG9sbGFyX2xhYmVscyAhPSBOVUxMKSB8fCAoZG9sbGFyX2xhYmVsX2NvdW50ID09IDApKTsKLQotICBmb3IgKGkgPSBkb2xsYXJfbGFiZWxzOyBpIDwgZG9sbGFyX2xhYmVscyArIGRvbGxhcl9sYWJlbF9jb3VudDsgKytpKQotICAgIGlmICgqaSA9PSBsYWJlbCkKLSAgICAgIHJldHVybiBkb2xsYXJfbGFiZWxfZGVmaW5lc1tpIC0gZG9sbGFyX2xhYmVsc107Ci0KLSAgLyogaWYgd2UgZ2V0IGhlcmUsIGxhYmVsIGlzbid0IGRlZmluZWQgKi8KLSAgcmV0dXJuIDA7Ci19CQkJCS8qIGRvbGxhcl9sYWJlbF9kZWZpbmVkKCkgKi8KLQotc3RhdGljIGxvbmcKLWRvbGxhcl9sYWJlbF9pbnN0YW5jZSAobGFiZWwpCi0gICAgIGxvbmcgbGFiZWw7Ci17Ci0gIGxvbmcgKmk7Ci0KLSAga25vdyAoKGRvbGxhcl9sYWJlbHMgIT0gTlVMTCkgfHwgKGRvbGxhcl9sYWJlbF9jb3VudCA9PSAwKSk7Ci0KLSAgZm9yIChpID0gZG9sbGFyX2xhYmVsczsgaSA8IGRvbGxhcl9sYWJlbHMgKyBkb2xsYXJfbGFiZWxfY291bnQ7ICsraSkKLSAgICBpZiAoKmkgPT0gbGFiZWwpCi0gICAgICByZXR1cm4gKGRvbGxhcl9sYWJlbF9pbnN0YW5jZXNbaSAtIGRvbGxhcl9sYWJlbHNdKTsKLQotICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZW4ndCBzZWVuIHRoZSBsYWJlbCBiZWZvcmUsIHRoZXJlZm9yZSBpdHMgaW5zdGFuY2UKLSAgICAgY291bnQgaXMgemVyby4gICovCi0gIHJldHVybiAwOwotfQotCi12b2lkIAotZG9sbGFyX2xhYmVsX2NsZWFyICgpCi17Ci0gIG1lbXNldCAoZG9sbGFyX2xhYmVsX2RlZmluZXMsICdcMCcsICh1bnNpZ25lZCBpbnQpIGRvbGxhcl9sYWJlbF9jb3VudCk7Ci19Ci0KLSNkZWZpbmUgRE9MTEFSX0xBQkVMX0JVTVBfQlkgMTAKLQotdm9pZCAKLWRlZmluZV9kb2xsYXJfbGFiZWwgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGZvciAoaSA9IGRvbGxhcl9sYWJlbHM7IGkgPCBkb2xsYXJfbGFiZWxzICsgZG9sbGFyX2xhYmVsX2NvdW50OyArK2kpCi0gICAgaWYgKCppID09IGxhYmVsKQotICAgICAgewotCSsrZG9sbGFyX2xhYmVsX2luc3RhbmNlc1tpIC0gZG9sbGFyX2xhYmVsc107Ci0JZG9sbGFyX2xhYmVsX2RlZmluZXNbaSAtIGRvbGxhcl9sYWJlbHNdID0gMTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgLyogaWYgd2UgZ2V0IHRvIGhlcmUsIHdlIGRvbid0IGhhdmUgbGFiZWwgbGlzdGVkIHlldC4gKi8KLQotICBpZiAoZG9sbGFyX2xhYmVscyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRvbGxhcl9sYWJlbHMgPSAobG9uZyAqKSB4bWFsbG9jIChET0xMQVJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfZGVmaW5lcyA9IHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9tYXggPSBET0xMQVJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGRvbGxhcl9sYWJlbF9jb3VudCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChkb2xsYXJfbGFiZWxfY291bnQgPT0gZG9sbGFyX2xhYmVsX21heCkKLSAgICB7Ci0gICAgICBkb2xsYXJfbGFiZWxfbWF4ICs9IERPTExBUl9MQUJFTF9CVU1QX0JZOwotICAgICAgZG9sbGFyX2xhYmVscyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBkb2xsYXJfbGFiZWxzLAotCQkJCQkgZG9sbGFyX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBkb2xsYXJfbGFiZWxfaW5zdGFuY2VzLAotCQkJCQkgIGRvbGxhcl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9kZWZpbmVzID0geHJlYWxsb2MgKGRvbGxhcl9sYWJlbF9kZWZpbmVzLCBkb2xsYXJfbGFiZWxfbWF4KTsKLSAgICB9CQkJCS8qIGlmIHdlIG5lZWRlZCB0byBncm93ICovCi0KLSAgZG9sbGFyX2xhYmVsc1tkb2xsYXJfbGFiZWxfY291bnRdID0gbGFiZWw7Ci0gIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXNbZG9sbGFyX2xhYmVsX2NvdW50XSA9IDE7Ci0gIGRvbGxhcl9sYWJlbF9kZWZpbmVzW2RvbGxhcl9sYWJlbF9jb3VudF0gPSAxOwotICArK2RvbGxhcl9sYWJlbF9jb3VudDsKLX0KLQotLyoKLSAqCQkJZG9sbGFyX2xhYmVsX25hbWUoKQotICoKLSAqIENhbGxlciBtdXN0IGNvcHkgcmV0dXJuZWQgbmFtZTogd2UgcmUtdXNlIHRoZSBhcmVhIGZvciB0aGUgbmV4dCBuYW1lLgotICoKLSAqIFRoZSBtdGggb2NjdXJlbmNlIG9mIGxhYmVsIG46IGlzIHR1cm5lZCBpbnRvIHRoZSBzeW1ib2wgIkxuXkFtIgotICogd2hlcmUgbiBpcyB0aGUgbGFiZWwgbnVtYmVyIGFuZCBtIGlzIHRoZSBpbnN0YW5jZSBudW1iZXIuICJMIiBtYWtlcwotICogaXQgYSBsYWJlbCBkaXNjYXJkZWQgdW5sZXNzIGRlYnVnZ2luZyBhbmQgIl5BIignXDEnKSBlbnN1cmVzIG5vCi0gKiBvcmRpbmFyeSBzeW1ib2wgU0hPVUxEIGdldCB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwgbGFiZWwKLSAqIHN5bWJvbC4gVGhlIGZpcnN0ICI0OiIgaXMgIkw0XkExIiAtIHRoZSBtIG51bWJlcnMgYmVnaW4gYXQgMS4KLSAqCi0gKiBmYiBsYWJlbHMgZ2V0IHRoZSBzYW1lIHRyZWF0bWVudCwgZXhjZXB0IHRoYXQgXkIgaXMgdXNlZCBpbiBwbGFjZSBvZiBeQS4KLSAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIGxvY2FsIGxhYmVsIG5hbWUuICovCi1kb2xsYXJfbGFiZWxfbmFtZSAobiwgYXVnZW5kKQotICAgICByZWdpc3RlciBsb25nIG47CQkvKiB3ZSBqdXN0IHNhdyAibiQ6IiA6IG4gYSBudW1iZXIgKi8KLSAgICAgcmVnaXN0ZXIgaW50IGF1Z2VuZDsJLyogMCBmb3IgY3VycmVudCBpbnN0YW5jZSwgMSBmb3IgbmV3IGluc3RhbmNlICovCi17Ci0gIGxvbmcgaTsKLSAgLyogUmV0dXJuZWQgdG8gY2FsbGVyLCB0aGVuIGNvcGllZC4gIHVzZWQgZm9yIGNyZWF0ZWQgbmFtZXMgKCI0ZiIpICovCi0gIHN0YXRpYyBjaGFyIHN5bWJvbF9uYW1lX2J1aWxkWzI0XTsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgY2hhciAqcTsKLSAgY2hhciBzeW1ib2xfbmFtZV90ZW1wb3JhcnlbMjBdOwkvKiBidWlsZCB1cCBhIG51bWJlciwgQkFDS1dBUkRTICovCi0KLSAga25vdyAobiA+PSAwKTsKLSAga25vdyAoYXVnZW5kID09IDAgfHwgYXVnZW5kID09IDEpOwotICBwID0gc3ltYm9sX25hbWVfYnVpbGQ7Ci0gICpwKysgPSAnTCc7Ci0KLSAgLyogTmV4dCBjb2RlIGp1c3QgZG9lcyBzcHJpbnRmKCB7fSwgIiVkIiwgbik7ICovCi0gIC8qIGxhYmVsIG51bWJlciAqLwotICBxID0gc3ltYm9sX25hbWVfdGVtcG9yYXJ5OwotICBmb3IgKCpxKysgPSAwLCBpID0gbjsgaTsgKytxKQotICAgIHsKLSAgICAgICpxID0gaSAlIDEwICsgJzAnOwotICAgICAgaSAvPSAxMDsKLSAgICB9Ci0gIHdoaWxlICgoKnAgPSAqLS1xKSAhPSAnXDAnKQotICAgICsrcDsKLQotICAqcCsrID0gMTsJCQkvKiBeQSAqLwotCi0gIC8qIGluc3RhbmNlIG51bWJlciAqLwotICBxID0gc3ltYm9sX25hbWVfdGVtcG9yYXJ5OwotICBmb3IgKCpxKysgPSAwLCBpID0gZG9sbGFyX2xhYmVsX2luc3RhbmNlIChuKSArIGF1Z2VuZDsgaTsgKytxKQotICAgIHsKLSAgICAgICpxID0gaSAlIDEwICsgJzAnOwotICAgICAgaSAvPSAxMDsKLSAgICB9Ci0gIHdoaWxlICgoKnArKyA9ICotLXEpICE9ICdcMCcpOzsKLQotICAvKiBUaGUgbGFiZWwsIGFzIGEgJ1wwJyBlbmRlZCBzdHJpbmcsIHN0YXJ0cyBhdCBzeW1ib2xfbmFtZV9idWlsZC4gKi8KLSAgcmV0dXJuIHN5bWJvbF9uYW1lX2J1aWxkOwotfQotCi0vKgotICogU29tYm9keSBlbHNlJ3MgaWRlYSBvZiBsb2NhbCBsYWJlbHMuIFRoZXkgYXJlIG1hZGUgYnkgIm46IiB3aGVyZSBuCi0gKiBpcyBhbnkgZGVjaW1hbCBkaWdpdC4gUmVmZXIgdG8gdGhlbSB3aXRoCi0gKiAgIm5iIiBmb3IgcHJldmlvdXMgKGJhY2t3YXJkKSBuOgotICogIG9yICJuZiIgZm9yIG5leHQgKGZvcndhcmQpIG46LgotICoKLSAqIFdlIGRvIGEgbGl0dGxlIGJldHRlciBhbmQgbGV0IG4gYmUgYW55IG51bWJlciwgbm90IGp1c3QgYSBzaW5nbGUgZGlnaXQsIGJ1dAotICogc2luY2UgdGhlIG90aGVyIGd1eSdzIGFzc2VtYmxlciBvbmx5IGRvZXMgdGVuLCB3ZSB0cmVhdCB0aGUgZmlyc3QgdGVuCi0gKiBzcGVjaWFsbHkuCi0gKgotICogTGlrZSBzb21lb25lIGVsc2UncyBhc3NlbWJsZXIsIHdlIGhhdmUgb25lIHNldCBvZiBsb2NhbCBsYWJlbCBjb3VudGVycyBmb3IKLSAqIGVudGlyZSBhc3NlbWJseSwgbm90IG9uZSBzZXQgcGVyIChzdWIpc2VnbWVudCBsaWtlIGluIG1vc3QgYXNzZW1ibGVycy4gVGhpcwotICogaW1wbGllcyB0aGF0IG9uZSBjYW4gcmVmZXIgdG8gYSBsYWJlbCBpbiBhbm90aGVyIHNlZ21lbnQsIGFuZCBpbmRlZWQgc29tZQotICogY3J1ZnR5IGNvbXBpbGVycyBoYXZlIGRvbmUganVzdCB0aGF0LgotICoKLSAqIFNpbmNlIHRoZXJlIGNvdWxkIGJlIGEgTE9UIG9mIHRoZXNlIHRoaW5ncywgdHJlYXQgdGhlbSBhcyBhIHNwYXJzZSBhcnJheS4KLSAqLwotCi0jZGVmaW5lIEZCX0xBQkVMX1NQRUNJQUwgKDEwKQotCi1zdGF0aWMgbG9uZyBmYl9sb3dfY291bnRlcltGQl9MQUJFTF9TUEVDSUFMXTsKLXN0YXRpYyBsb25nICpmYl9sYWJlbHM7Ci1zdGF0aWMgbG9uZyAqZmJfbGFiZWxfaW5zdGFuY2VzOwotc3RhdGljIGxvbmcgZmJfbGFiZWxfY291bnQ7Ci1zdGF0aWMgbG9uZyBmYl9sYWJlbF9tYXg7Ci0KLS8qIHRoaXMgbXVzdCBiZSBtb3JlIHRoYW4gRkJfTEFCRUxfU1BFQ0lBTCAqLwotI2RlZmluZSBGQl9MQUJFTF9CVU1QX0JZIChGQl9MQUJFTF9TUEVDSUFMICsgNikKLQotc3RhdGljIHZvaWQgCi1mYl9sYWJlbF9pbml0ICgpCi17Ci0gIG1lbXNldCAoKHZvaWQgKikgZmJfbG93X2NvdW50ZXIsICdcMCcsIHNpemVvZiAoZmJfbG93X2NvdW50ZXIpKTsKLX0JCQkJLyogZmJfbGFiZWxfaW5pdCgpICovCi0KLS8qIGFkZCBvbmUgdG8gdGhlIGluc3RhbmNlIG51bWJlciBvZiB0aGlzIGZiIGxhYmVsICovCi12b2lkIAotZmJfbGFiZWxfaW5zdGFuY2VfaW5jIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBpZiAobGFiZWwgPCBGQl9MQUJFTF9TUEVDSUFMKQotICAgIHsKLSAgICAgICsrZmJfbG93X2NvdW50ZXJbbGFiZWxdOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmJfbGFiZWxzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gZmJfbGFiZWxzICsgRkJfTEFCRUxfU1BFQ0lBTDsKLQkgICBpIDwgZmJfbGFiZWxzICsgZmJfbGFiZWxfY291bnQ7ICsraSkKLQl7Ci0JICBpZiAoKmkgPT0gbGFiZWwpCi0JICAgIHsKLQkgICAgICArK2ZiX2xhYmVsX2luc3RhbmNlc1tpIC0gZmJfbGFiZWxzXTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0JCQkvKiBpZiB3ZSBmaW5kIGl0ICovCi0JfQkJCS8qIGZvciBlYWNoIGV4aXN0aW5nIGxhYmVsICovCi0gICAgfQotCi0gIC8qIGlmIHdlIGdldCB0byBoZXJlLCB3ZSBkb24ndCBoYXZlIGxhYmVsIGxpc3RlZCB5ZXQuICovCi0KLSAgaWYgKGZiX2xhYmVscyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZiX2xhYmVscyA9IChsb25nICopIHhtYWxsb2MgKEZCX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGZiX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhtYWxsb2MgKEZCX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGZiX2xhYmVsX21heCA9IEZCX0xBQkVMX0JVTVBfQlk7Ci0gICAgICBmYl9sYWJlbF9jb3VudCA9IEZCX0xBQkVMX1NQRUNJQUw7Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKGZiX2xhYmVsX2NvdW50ID09IGZiX2xhYmVsX21heCkKLSAgICB7Ci0gICAgICBmYl9sYWJlbF9tYXggKz0gRkJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGZiX2xhYmVscyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBmYl9sYWJlbHMsCi0JCQkJICAgICBmYl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGZiX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBmYl9sYWJlbF9pbnN0YW5jZXMsCi0JCQkJCSAgICAgIGZiX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgIH0JCQkJLyogaWYgd2UgbmVlZGVkIHRvIGdyb3cgKi8KLQotICBmYl9sYWJlbHNbZmJfbGFiZWxfY291bnRdID0gbGFiZWw7Ci0gIGZiX2xhYmVsX2luc3RhbmNlc1tmYl9sYWJlbF9jb3VudF0gPSAxOwotICArK2ZiX2xhYmVsX2NvdW50OwotfQotCi1zdGF0aWMgbG9uZyAKLWZiX2xhYmVsX2luc3RhbmNlIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBpZiAobGFiZWwgPCBGQl9MQUJFTF9TUEVDSUFMKQotICAgIHsKLSAgICAgIHJldHVybiAoZmJfbG93X2NvdW50ZXJbbGFiZWxdKTsKLSAgICB9Ci0KLSAgaWYgKGZiX2xhYmVscyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IGZiX2xhYmVscyArIEZCX0xBQkVMX1NQRUNJQUw7Ci0JICAgaSA8IGZiX2xhYmVscyArIGZiX2xhYmVsX2NvdW50OyArK2kpCi0JewotCSAgaWYgKCppID09IGxhYmVsKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIChmYl9sYWJlbF9pbnN0YW5jZXNbaSAtIGZiX2xhYmVsc10pOwotCSAgICB9CQkJLyogaWYgd2UgZmluZCBpdCAqLwotCX0JCQkvKiBmb3IgZWFjaCBleGlzdGluZyBsYWJlbCAqLwotICAgIH0KLQotICAvKiBXZSBkaWRuJ3QgZmluZCB0aGUgbGFiZWwsIHNvIHRoaXMgbXVzdCBiZSBhIHJlZmVyZW5jZSB0byB0aGUKLSAgICAgZmlyc3QgaW5zdGFuY2UuICAqLwotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqCQkJZmJfbGFiZWxfbmFtZSgpCi0gKgotICogQ2FsbGVyIG11c3QgY29weSByZXR1cm5lZCBuYW1lOiB3ZSByZS11c2UgdGhlIGFyZWEgZm9yIHRoZSBuZXh0IG5hbWUuCi0gKgotICogVGhlIG10aCBvY2N1cmVuY2Ugb2YgbGFiZWwgbjogaXMgdHVybmVkIGludG8gdGhlIHN5bWJvbCAiTG5eQm0iCi0gKiB3aGVyZSBuIGlzIHRoZSBsYWJlbCBudW1iZXIgYW5kIG0gaXMgdGhlIGluc3RhbmNlIG51bWJlci4gIkwiIG1ha2VzCi0gKiBpdCBhIGxhYmVsIGRpc2NhcmRlZCB1bmxlc3MgZGVidWdnaW5nIGFuZCAiXkIiKCdcMicpIGVuc3VyZXMgbm8KLSAqIG9yZGluYXJ5IHN5bWJvbCBTSE9VTEQgZ2V0IHRoZSBzYW1lIG5hbWUgYXMgYSBsb2NhbCBsYWJlbAotICogc3ltYm9sLiBUaGUgZmlyc3QgIjQ6IiBpcyAiTDReQjEiIC0gdGhlIG0gbnVtYmVycyBiZWdpbiBhdCAxLgotICoKLSAqIGRvbGxhciBsYWJlbHMgZ2V0IHRoZSBzYW1lIHRyZWF0bWVudCwgZXhjZXB0IHRoYXQgXkEgaXMgdXNlZCBpbiBwbGFjZSBvZiBeQi4gKi8KLQotY2hhciAqCQkJCS8qIFJldHVybiBsb2NhbCBsYWJlbCBuYW1lLiAqLwotZmJfbGFiZWxfbmFtZSAobiwgYXVnZW5kKQotICAgICBsb25nIG47CQkJLyogd2UganVzdCBzYXcgIm46IiwgIm5mIiBvciAibmIiIDogbiBhIG51bWJlciAqLwotICAgICBsb25nIGF1Z2VuZDsJCS8qIDAgZm9yIG5iLCAxIGZvciBuOiwgbmYgKi8KLXsKLSAgbG9uZyBpOwotICAvKiBSZXR1cm5lZCB0byBjYWxsZXIsIHRoZW4gY29waWVkLiAgdXNlZCBmb3IgY3JlYXRlZCBuYW1lcyAoIjRmIikgKi8KLSAgc3RhdGljIGNoYXIgc3ltYm9sX25hbWVfYnVpbGRbMjRdOwotICByZWdpc3RlciBjaGFyICpwOwotICByZWdpc3RlciBjaGFyICpxOwotICBjaGFyIHN5bWJvbF9uYW1lX3RlbXBvcmFyeVsyMF07CS8qIGJ1aWxkIHVwIGEgbnVtYmVyLCBCQUNLV0FSRFMgKi8KLQotICBrbm93IChuID49IDApOwotICBrbm93IChhdWdlbmQgPT0gMCB8fCBhdWdlbmQgPT0gMSk7Ci0gIHAgPSBzeW1ib2xfbmFtZV9idWlsZDsKLSAgKnArKyA9ICdMJzsKLQotICAvKiBOZXh0IGNvZGUganVzdCBkb2VzIHNwcmludGYoIHt9LCAiJWQiLCBuKTsgKi8KLSAgLyogbGFiZWwgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBuOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCA9ICotLXEpICE9ICdcMCcpCi0gICAgKytwOwotCi0gICpwKysgPSAyOwkJCS8qIF5CICovCi0KLSAgLyogaW5zdGFuY2UgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBmYl9sYWJlbF9pbnN0YW5jZSAobikgKyBhdWdlbmQ7IGk7ICsrcSkKLSAgICB7Ci0gICAgICAqcSA9IGkgJSAxMCArICcwJzsKLSAgICAgIGkgLz0gMTA7Ci0gICAgfQotICB3aGlsZSAoKCpwKysgPSAqLS1xKSAhPSAnXDAnKTs7Ci0KLSAgLyogVGhlIGxhYmVsLCBhcyBhICdcMCcgZW5kZWQgc3RyaW5nLCBzdGFydHMgYXQgc3ltYm9sX25hbWVfYnVpbGQuICovCi0gIHJldHVybiAoc3ltYm9sX25hbWVfYnVpbGQpOwotfQkJCQkvKiBmYl9sYWJlbF9uYW1lKCkgKi8KLQotLyoKLSAqIGRlY29kZSBuYW1lIHRoYXQgbWF5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgZm9vX2xhYmVsX25hbWUoKSBhYm92ZS4gIElmCi0gKiB0aGUgbmFtZSB3YXNuJ3QgZ2VuZXJhdGVkIGJ5IGZvb19sYWJlbF9uYW1lKCksIHRoZW4gcmV0dXJuIGl0IHVuYWx0ZXJlZC4KLSAqIFRoaXMgaXMgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCi0gKi8KLQotY2hhciAqCi1kZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAocykKLSAgICAgY2hhciAqczsKLXsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3ltYm9sX2RlY29kZTsKLSAgaW50IGxhYmVsX251bWJlcjsKLSAgaW50IGluc3RhbmNlX251bWJlcjsKLSAgY2hhciAqdHlwZTsKLSAgY29uc3QgY2hhciAqbWVzc2FnZV9mb3JtYXQgPSBfKCJcIiVkXCIgKGluc3RhbmNlIG51bWJlciAlZCBvZiBhICVzIGxhYmVsKSIpOwotCi0gIGlmIChzWzBdICE9ICdMJykKLSAgICByZXR1cm4gczsKLQotICBmb3IgKGxhYmVsX251bWJlciA9IDAsIHAgPSBzICsgMTsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKTsgKytwKQotICAgIGxhYmVsX251bWJlciA9ICgxMCAqIGxhYmVsX251bWJlcikgKyAqcCAtICcwJzsKLQotICBpZiAoKnAgPT0gMSkKLSAgICB0eXBlID0gImRvbGxhciI7Ci0gIGVsc2UgaWYgKCpwID09IDIpCi0gICAgdHlwZSA9ICJmYiI7Ci0gIGVsc2UKLSAgICByZXR1cm4gczsKLQotICBmb3IgKGluc3RhbmNlX251bWJlciA9IDAsIHArKzsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKTsgKytwKQotICAgIGluc3RhbmNlX251bWJlciA9ICgxMCAqIGluc3RhbmNlX251bWJlcikgKyAqcCAtICcwJzsKLQotICBzeW1ib2xfZGVjb2RlID0gb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzdHJsZW4gKG1lc3NhZ2VfZm9ybWF0KSArIDMwKTsKLSAgc3ByaW50ZiAoc3ltYm9sX2RlY29kZSwgbWVzc2FnZV9mb3JtYXQsIGxhYmVsX251bWJlciwgaW5zdGFuY2VfbnVtYmVyLCB0eXBlKTsKLQotICByZXR1cm4gc3ltYm9sX2RlY29kZTsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gICovCi0KLXZhbHVlVAotU19HRVRfVkFMVUUgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfb2Zmc2V0OwotI2VuZGlmCi0KLSAgaWYgKCFzLT5zeV9yZXNvbHZlZCAmJiBzLT5zeV92YWx1ZS5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHMsIDEpOwotICBpZiAocy0+c3lfdmFsdWUuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHN0YXRpYyBzeW1ib2xTICpyZWN1cjsKLQotICAgICAgLyogRklYTUU6IEluIG5vbiBCRkQgYXNzZW1ibGVycywgU19JU19ERUZJTkVEIGFuZCBTX0lTX0NPTU1PTgotICAgICAgICAgbWF5IGNhbGwgU19HRVRfVkFMVUUuICBXZSB1c2UgYSBzdGF0aWMgc3ltYm9sIHRvIGF2b2lkIHRoZQotICAgICAgICAgaW1tZWRpYXRlIHJlY3Vyc2lvbi4gICovCi0gICAgICBpZiAocmVjdXIgPT0gcykKLQlyZXR1cm4gKHZhbHVlVCkgcy0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotICAgICAgcmVjdXIgPSBzOwotICAgICAgaWYgKCEgcy0+c3lfcmVzb2x2ZWQKLQkgIHx8IHMtPnN5X3ZhbHVlLlhfb3AgIT0gT19zeW1ib2wKLQkgIHx8IChTX0lTX0RFRklORUQgKHMpICYmICEgU19JU19DT01NT04gKHMpKSkKLQlhc19iYWQgKF8oIkF0dGVtcHQgdG8gZ2V0IHZhbHVlIG9mIHVucmVzb2x2ZWQgc3ltYm9sICVzIiksCi0JCVNfR0VUX05BTUUgKHMpKTsKLSAgICAgIHJlY3VyID0gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAodmFsdWVUKSBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci19Ci0KLS8qIFNldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuICAqLwotCi12b2lkCi1TX1NFVF9WQUxVRSAocywgdmFsKQotICAgICBzeW1ib2xTICpzOwotICAgICB2YWx1ZVQgdmFsOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfb2Zmc2V0ID0gdmFsOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gIHMtPnN5X3ZhbHVlLlhfb3AgPSBPX2NvbnN0YW50OwotICBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSAob2Zmc2V0VCkgdmFsOwotICBzLT5zeV92YWx1ZS5YX3Vuc2lnbmVkID0gMDsKLX0KLQotdm9pZAotY29weV9zeW1ib2xfYXR0cmlidXRlcyAoZGVzdCwgc3JjKQotICAgICBzeW1ib2xTICpkZXN0LCAqc3JjOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChkZXN0KSkKLSAgICBkZXN0ID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIGRlc3QpOwotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzcmMpKQotICAgIHNyYyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzcmMpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBJbiBhbiBleHByZXNzaW9uLCB0cmFuc2ZlciB0aGUgc2V0dGluZ3Mgb2YgdGhlc2UgZmxhZ3MuCi0gICAgIFRoZSB1c2VyIGNhbiBvdmVycmlkZSBsYXRlciwgb2YgY291cnNlLiAgKi8KLSNkZWZpbmUgQ09QSUVEX1NZTUZMQUdTCShCU0ZfRlVOQ1RJT04gfCBCU0ZfT0JKRUNUKQotICBkZXN0LT5ic3ltLT5mbGFncyB8PSBzcmMtPmJzeW0tPmZsYWdzICYgQ09QSUVEX1NZTUZMQUdTOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotICBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyAoZGVzdCwgc3JjKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1pbnQKLVNfSVNfRlVOQ1RJT04gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotCi0gIGZsYWdzID0gcy0+YnN5bS0+ZmxhZ3M7Ci0KLSAgcmV0dXJuIChmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMDsKLX0KLQotaW50Ci1TX0lTX0VYVEVSTkFMIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLQotICBmbGFncyA9IHMtPmJzeW0tPmZsYWdzOwotCi0gIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoKGZsYWdzICYgQlNGX0xPQ0FMKSAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKLSAgICBhYm9ydCAoKTsKLQotICByZXR1cm4gKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMDsKLX0KLQotaW50Ci1TX0lTX1dFQUsgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gKHMtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDA7Ci19Ci0KLWludAotU19JU19DT01NT04gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gYmZkX2lzX2NvbV9zZWN0aW9uIChzLT5ic3ltLT5zZWN0aW9uKTsKLX0KLQotaW50Ci1TX0lTX0RFRklORUQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9zZWN0aW9uICE9IHVuZGVmaW5lZF9zZWN0aW9uOwotICByZXR1cm4gcy0+YnN5bS0+c2VjdGlvbiAhPSB1bmRlZmluZWRfc2VjdGlvbjsKLX0KLQotaW50Ci1TX0lTX0RFQlVHIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHMtPmJzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotU19JU19MT0NBTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDE7Ci0KLSAgZmxhZ3MgPSBzLT5ic3ltLT5mbGFnczsKLQotICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgaWYgKChmbGFncyAmIEJTRl9MT0NBTCkgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbiAocy0+YnN5bSkgPT0gcmVnX3NlY3Rpb24pCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUKLSAgICAgICYmIChmbGFncyAmIEJTRl9HTE9CQUwpID09IDAKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbiAocy0+YnN5bSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm4gMTsKLQotICBuYW1lID0gU19HRVRfTkFNRSAocyk7Ci0gIHJldHVybiAobmFtZSAhPSBOVUxMCi0JICAmJiAhIFNfSVNfREVCVUcgKHMpCi0JICAmJiAoc3RyY2hyIChuYW1lLCAnXDAwMScpCi0JICAgICAgfHwgc3RyY2hyIChuYW1lLCAnXDAwMicpCi0JICAgICAgfHwgKCEgZmxhZ19rZWVwX2xvY2FscwotCQkgICYmIChiZmRfaXNfbG9jYWxfbGFiZWwgKHN0ZG91dHB1dCwgcy0+YnN5bSkKLQkJICAgICAgfHwgKGZsYWdfbXJpCi0JCQkgICYmIG5hbWVbMF0gPT0gJz8nCi0JCQkgICYmIG5hbWVbMV0gPT0gJz8nKSkpKSk7Ci19Ci0KLWludAotU19JU19FWFRFUk4gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHJldHVybiBTX0lTX0VYVEVSTkFMIChzKTsKLX0KLQotaW50Ci1TX0lTX1NUQUJEIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gU19HRVRfTkFNRSAocykgPT0gMDsKLX0KLQotQ09OU1QgY2hhciAqCi1TX0dFVF9OQU1FIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfbmFtZTsKLSAgcmV0dXJuIHMtPmJzeW0tPm5hbWU7Ci19Ci0KLXNlZ1QKLVNfR0VUX1NFR01FTlQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9zZWN0aW9uOwotICByZXR1cm4gcy0+YnN5bS0+c2VjdGlvbjsKLX0KLQotdm9pZAotU19TRVRfU0VHTUVOVCAocywgc2VnKQotICAgICBzeW1ib2xTICpzOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLyogRG9uJ3QgcmVhc3NpZ24gc2VjdGlvbiBzeW1ib2xzLiAgVGhlIGRpcmVjdCByZWFzb24gaXMgdG8gcHJldmVudCBzZWcKLSAgICAgZmF1bHRzIGFzc2lnbmluZyBiYWNrIHRvIGNvbnN0IGdsb2JhbCBzeW1ib2xzIHN1Y2ggYXMgKkFCUyosIGJ1dCBpdAotICAgICBzaG91bGRuJ3QgaGFwcGVuIGFueXdheS4gICovCi0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgaWYgKHNlZyA9PSByZWdfc2VjdGlvbikKLQlzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICAgICAgZWxzZQotCXsKLQkgICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKS0+bHN5X3NlY3Rpb24gPSBzZWc7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgewotICAgICAgaWYgKHMtPmJzeW0tPnNlY3Rpb24gIT0gc2VnKQotCWFib3J0KCk7Ci0gICAgfQotICBlbHNlCi0gICAgcy0+YnN5bS0+c2VjdGlvbiA9IHNlZzsKLX0KLQotdm9pZAotU19TRVRfRVhURVJOQUwgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIGlmICgocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBMZXQgLndlYWsgb3ZlcnJpZGUgLmdsb2JhbC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotICBzLT5ic3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotICBzLT5ic3ltLT5mbGFncyAmPSB+KEJTRl9MT0NBTHxCU0ZfV0VBSyk7Ci19Ci0KLXZvaWQKLVNfQ0xFQVJfRVhURVJOQUwgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgaWYgKChzLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIExldCAud2VhayBvdmVycmlkZS4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotICBzLT5ic3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTHxCU0ZfV0VBSyk7Ci19Ci0KLXZvaWQKLVNfU0VUX1dFQUsgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotICBzLT5ic3ltLT5mbGFncyAmPSB+KEJTRl9HTE9CQUx8QlNGX0xPQ0FMKTsKLX0KLQotdm9pZAotU19TRVRfTkFNRSAocywgbmFtZSkKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfbmFtZSA9IG5hbWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzLT5ic3ltLT5uYW1lID0gbmFtZTsKLX0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0KLS8qIFJldHVybiB0aGUgcHJldmlvdXMgc3ltYm9sIGluIGEgY2hhaW4uICAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9wcmV2aW91cyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiBzLT5zeV9wcmV2aW91czsKLX0KLQotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotLyogUmV0dXJuIHRoZSBuZXh0IHN5bWJvbCBpbiBhIGNoYWluLiAgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfbmV4dCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiBzLT5zeV9uZXh0OwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBhcyBhbiBleHByZXNzaW9uLiAgKi8KLQotZXhwcmVzc2lvblMgKgotc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICByZXR1cm4gJnMtPnN5X3ZhbHVlOwotfQotCi0vKiBTZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIHRvIGFuIGV4cHJlc3Npb24uICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHMsIGV4cCkKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+c3lfdmFsdWUgPSAqZXhwOwotfQotCi0vKiBTZXQgdGhlIGZyYWcgb2YgYSBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X2ZyYWcgKHMsIGYpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIGZyYWdTICpmOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgbG9jYWxfc3ltYm9sX3NldF9mcmFnICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzLCBmKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgcy0+c3lfZnJhZyA9IGY7Ci19Ci0KLS8qIFJldHVybiB0aGUgZnJhZyBvZiBhIHN5bWJvbC4gICovCi0KLWZyYWdTICoKLXN5bWJvbF9nZXRfZnJhZyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiBsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotI2VuZGlmCi0gIHJldHVybiBzLT5zeV9mcmFnOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHVzZWQuICAqLwotCi12b2lkCi1zeW1ib2xfbWFya191c2VkIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPnN5X3VzZWQgPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHVzZWQuICAqLwotCi12b2lkCi1zeW1ib2xfY2xlYXJfdXNlZCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+c3lfdXNlZCA9IDA7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHVzZWQuICAqLwotCi1pbnQKLXN5bWJvbF91c2VkX3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAxOwotICByZXR1cm4gcy0+c3lfdXNlZDsKLX0KLQotLyogTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB1c2VkIGluIGEgcmVsb2MuICAqLwotCi12b2lkCi1zeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV91c2VkX2luX3JlbG9jID0gMTsKLX0KLQotLyogQ2xlYXIgdGhlIG1hcmsgb2Ygd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiB1c2VkIGluIGEgcmVsb2MuICAqLwotCi12b2lkCi1zeW1ib2xfY2xlYXJfdXNlZF9pbl9yZWxvYyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuOwotICBzLT5zeV91c2VkX2luX3JlbG9jID0gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gdXNlZCBpbiBhIHJlbG9jLiAgKi8KLQotaW50Ci1zeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPnN5X3VzZWRfaW5fcmVsb2M7Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgYXMgYW4gTVJJIGNvbW1vbiBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfbWFya19tcmlfY29tbW9uIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV9tcmlfY29tbW9uID0gMTsKLX0KLQotLyogQ2xlYXIgdGhlIG1hcmsgb2Ygd2hldGhlciBhIHN5bWJvbCBpcyBhbiBNUkkgY29tbW9uIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl9tcmlfY29tbW9uIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPnN5X21yaV9jb21tb24gPSAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBpcyBhbiBNUkkgY29tbW9uIHN5bWJvbC4gICovCi0KLWludAotc3ltYm9sX21yaV9jb21tb25fcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBzLT5zeV9tcmlfY29tbW9uOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHdyaXR0ZW4uICAqLwotCi12b2lkCi1zeW1ib2xfbWFya193cml0dGVuIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPndyaXR0ZW4gPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4uICAqLwotCi12b2lkCi1zeW1ib2xfY2xlYXJfd3JpdHRlbiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuOwotICBzLT53cml0dGVuID0gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbi4gICovCi0KLWludAotc3ltYm9sX3dyaXR0ZW5fcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBzLT53cml0dGVuOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGhhcyBoYXZpbmcgYmVlbiByZXNvbHZlZC4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3Jlc29sdmVkIChzKQotICAgICBzeW1ib2xTICpzOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBzLT5zeV9yZXNvbHZlZCA9IDE7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHJlc29sdmVkLiAgKi8KLQotaW50Ci1zeW1ib2xfcmVzb2x2ZWRfcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiBsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHMtPnN5X3Jlc29sdmVkOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQotaW50Ci1zeW1ib2xfc2VjdGlvbl9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDA7Ci0jZWxzZQotICAvKiBGSVhNRSAqLwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBpcyBlcXVhdGVkIHRvIGFub3RoZXIgc3ltYm9sLiAgKi8KLQotaW50Ci1zeW1ib2xfZXF1YXRlZF9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2w7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBhIGNvbnN0YW50IHZhbHVlLiAgKi8KLQotaW50Ci1zeW1ib2xfY29uc3RhbnRfcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiBzLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQ7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFJldHVybiB0aGUgQkZEIHN5bWJvbCBmb3IgYSBzeW1ib2wuICAqLwotCi1hc3ltYm9sICoKLXN5bWJvbF9nZXRfYmZkc3ltIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICByZXR1cm4gcy0+YnN5bTsKLX0KLQotLyogU2V0IHRoZSBCRkQgc3ltYm9sIGZvciBhIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfYmZkc3ltIChzLCBic3ltKQotICAgICBzeW1ib2xTICpzOwotICAgICBhc3ltYm9sICpic3ltOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5ic3ltID0gYnN5bTsKLX0KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIE9CSl9TWU1GSUVMRF9UWVBFCi0KLS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCBmb3JtYXQgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotT0JKX1NZTUZJRUxEX1RZUEUgKgotc3ltYm9sX2dldF9vYmogKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHJldHVybiAmcy0+c3lfb2JqOwotfQotCi0vKiBTZXQgdGhlIG9iamVjdCBmb3JtYXQgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotc3ltYm9sX3NldF9vYmogKHMsIG8pCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIE9CSl9TWU1GSUVMRF9UWVBFICpvOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV9vYmogPSAqbzsKLX0KLQotI2VuZGlmIC8qIE9CSl9TWU1GSUVMRF9UWVBFICovCi0KLSNpZmRlZiBUQ19TWU1GSUVMRF9UWVBFCi0KLS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIHByb2Nlc3NvciBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi1UQ19TWU1GSUVMRF9UWVBFICoKLXN5bWJvbF9nZXRfdGMgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHJldHVybiAmcy0+c3lfdGM7Ci19Ci0KLS8qIFNldCB0aGUgcHJvY2Vzc29yIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfdGMgKHMsIG8pCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIFRDX1NZTUZJRUxEX1RZUEUgKm87Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X3RjID0gKm87Ci19Ci0KLSNlbmRpZiAvKiBUQ19TWU1GSUVMRF9UWVBFICovCi0KLXZvaWQKLXN5bWJvbF9iZWdpbiAoKQotewotICBzeW1ib2xfbGFzdFAgPSBOVUxMOwotICBzeW1ib2xfcm9vdFAgPSBOVUxMOwkJLyogSW4gY2FzZSB3ZSBoYXZlIDAgc3ltYm9scyAoISEpICovCi0gIHN5X2hhc2ggPSBoYXNoX25ldyAoKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGxvY2FsX2hhc2ggPSBoYXNoX25ldyAoKTsKLSNlbmRpZgotCi0gIG1lbXNldCAoKGNoYXIgKikgKCZhYnNfc3ltYm9sKSwgJ1wwJywgc2l6ZW9mIChhYnNfc3ltYm9sKSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmIGRlZmluZWQgKEVNSVRfU0VDVElPTl9TWU1CT0xTKSB8fCAhZGVmaW5lZCAoUkVMT0NfUkVRVUlSRVNfU1lNQk9MKQotICBhYnNfc3ltYm9sLmJzeW0gPSBiZmRfYWJzX3NlY3Rpb24uc3ltYm9sOwotI2VuZGlmCi0jZWxzZQotICAvKiBDYW4ndCBpbml0aWFsaXNlIGEgdW5pb24uIFNpZ2guICovCi0gIFNfU0VUX1NFR01FTlQgKCZhYnNfc3ltYm9sLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSNlbmRpZgotICBhYnNfc3ltYm9sLnN5X3ZhbHVlLlhfb3AgPSBPX2NvbnN0YW50OwotICBhYnNfc3ltYm9sLnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0KLSAgaWYgKExPQ0FMX0xBQkVMU19GQikKLSAgICBmYl9sYWJlbF9pbml0ICgpOwotfQotCi0KLQwKLWludCBpbmRlbnRfbGV2ZWw7Ci0KLS8qIE1heGltdW0gaW5kZW50IGxldmVsLgotICAgQXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb24gaW5zaWRlIGEgZ2RiIHNlc3Npb24uICAqLwotaW50IG1heF9pbmRlbnRfbGV2ZWwgPSA4OwotCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotaW5kZW50ICgpCi17Ci0gIHByaW50ZiAoIiUqcyIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLX0KLQotI2VuZGlmCi0KLXZvaWQKLXByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBzeW0pCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IFNfR0VUX05BTUUgKHN5bSk7Ci0gIGlmICghbmFtZSB8fCAhbmFtZVswXSkKLSAgICBuYW1lID0gIih1bm5hbWVkKSI7Ci0gIGZwcmludGYgKGZpbGUsICJzeW0gJWx4ICVzIiwgKHVuc2lnbmVkIGxvbmcpIHN5bSwgbmFtZSk7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltKSkKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jc3ltID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgc3ltOwotICAgICAgaWYgKGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKSAhPSAmemVyb19hZGRyZXNzX2ZyYWcKLQkgICYmIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKSAhPSBOVUxMKQotCWZwcmludGYgKGZpbGUsICIgZnJhZyAlbHgiLCAobG9uZykgbG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pKTsKLSAgICAgIGlmIChsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCAobG9jc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiIHJlc29sdmVkIik7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiIGxvY2FsIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3ltLT5zeV9mcmFnICE9ICZ6ZXJvX2FkZHJlc3NfZnJhZykKLQlmcHJpbnRmIChmaWxlLCAiIGZyYWcgJWx4IiwgKGxvbmcpIHN5bS0+c3lfZnJhZyk7Ci0gICAgICBpZiAoc3ltLT53cml0dGVuKQotCWZwcmludGYgKGZpbGUsICIgd3JpdHRlbiIpOwotICAgICAgaWYgKHN5bS0+c3lfcmVzb2x2ZWQpCi0JZnByaW50ZiAoZmlsZSwgIiByZXNvbHZlZCIpOwotICAgICAgZWxzZSBpZiAoc3ltLT5zeV9yZXNvbHZpbmcpCi0JZnByaW50ZiAoZmlsZSwgIiByZXNvbHZpbmciKTsKLSAgICAgIGlmIChzeW0tPnN5X3VzZWRfaW5fcmVsb2MpCi0JZnByaW50ZiAoZmlsZSwgIiB1c2VkLWluLXJlbG9jIik7Ci0gICAgICBpZiAoc3ltLT5zeV91c2VkKQotCWZwcmludGYgKGZpbGUsICIgdXNlZCIpOwotICAgICAgaWYgKFNfSVNfTE9DQUwgKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiBsb2NhbCIpOwotICAgICAgaWYgKFNfSVNfRVhURVJOIChzeW0pKQotCWZwcmludGYgKGZpbGUsICIgZXh0ZXJuIik7Ci0gICAgICBpZiAoU19JU19ERUJVRyAoc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiIGRlYnVnIik7Ci0gICAgICBpZiAoU19JU19ERUZJTkVEIChzeW0pKQotCWZwcmludGYgKGZpbGUsICIgZGVmaW5lZCIpOwotICAgIH0KLSAgZnByaW50ZiAoZmlsZSwgIiAlcyIsIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSkpOwotICBpZiAoc3ltYm9sX3Jlc29sdmVkX3AgKHN5bSkpCi0gICAgewotICAgICAgc2VnVCBzID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotICAgICAgaWYgKHMgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLSAgICAgICAgICAmJiBzICE9IGV4cHJfc2VjdGlvbikKLQlmcHJpbnRmIChmaWxlLCAiICVseCIsIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0gICAgfQotICBlbHNlIGlmIChpbmRlbnRfbGV2ZWwgPCBtYXhfaW5kZW50X2xldmVsCi0JICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltKSAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiY29uc3RhbnQgJWx4IiwKLQkJIChsb25nKSAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgc3ltKS0+bHN5X29mZnNldCk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlwcmludF9leHByXzEgKGZpbGUsICZzeW0tPnN5X3ZhbHVlKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgICBpbmRlbnRfbGV2ZWwtLTsKLSAgICB9Ci0gIGZmbHVzaCAoZmlsZSk7Ci19Ci0KLXZvaWQKLXByaW50X3N5bWJvbF92YWx1ZSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGluZGVudF9sZXZlbCA9IDA7Ci0gIHByaW50X3N5bWJvbF92YWx1ZV8xIChzdGRlcnIsIHN5bSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9iaW5hcnkgKGZpbGUsIG5hbWUsIGV4cCkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGluZGVudF9sZXZlbCsrOwotICBmcHJpbnRmIChmaWxlLCAiJXNcbiUqczwiLCBuYW1lLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gIGZwcmludGYgKGZpbGUsICI+XG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX29wX3N5bWJvbCk7Ci0gIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gIGluZGVudF9sZXZlbC0tOwotfQotCi12b2lkCi1wcmludF9leHByXzEgKGZpbGUsIGV4cCkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgZnByaW50ZiAoZmlsZSwgImV4cHIgJWx4ICIsIChsb25nKSBleHApOwotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiaWxsZWdhbCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJhYnNlbnQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJjb25zdGFudCAlbHgiLCAobG9uZykgZXhwLT5YX2FkZF9udW1iZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgZnByaW50ZiAoZmlsZSwgInN5bWJvbFxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgIG1heWJlX3ByaW50X2FkZG51bToKLSAgICAgIGlmIChleHAtPlhfYWRkX251bWJlcikKLQlmcHJpbnRmIChmaWxlLCAiXG4lKnMlbHgiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIiwKLQkJIChsb25nKSBleHAtPlhfYWRkX251bWJlcik7Ci0gICAgICBpbmRlbnRfbGV2ZWwtLTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIGZwcmludGYgKGZpbGUsICJyZWdpc3RlciAjJWQiLCAoaW50KSBleHAtPlhfYWRkX251bWJlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYmlnOgotICAgICAgZnByaW50ZiAoZmlsZSwgImJpZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3VtaW51czoKLSAgICAgIGZwcmludGYgKGZpbGUsICJ1bWludXMgLTwiKTsKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgICBnb3RvIG1heWJlX3ByaW50X2FkZG51bTsKLSAgICBjYXNlIE9fYml0X25vdDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJiaXRfbm90Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbXVsdGlwbHk6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJtdWx0aXBseSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fZGl2aWRlOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiZGl2aWRlIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19tb2R1bHVzOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibW9kdWx1cyIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbGVmdF9zaGlmdDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxzaGlmdCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJyc2hpZnQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJiaXRfaW9yIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiYml0X3hvciIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYml0X2FuZDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImJpdF9hbmQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2VxOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiZXEiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX25lOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibmUiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2x0OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibHQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2xlOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibGUiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2dlOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiZ2UiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2d0OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiZ3QiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2xvZ2ljYWxfYW5kOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibG9naWNhbF9hbmQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2xvZ2ljYWxfb3I6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsb2dpY2FsX29yIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19hZGQ6Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIGZwcmludGYgKGZpbGUsICJhZGRcbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj5cbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX29wX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgICAgZ290byBtYXliZV9wcmludF9hZGRudW07Ci0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAic3VidHJhY3RcbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj5cbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX29wX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgICAgZ290byBtYXliZV9wcmludF9hZGRudW07Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJ7dW5rbm93biBvcGNvZGUgJWR9IiwgKGludCkgZXhwLT5YX29wKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZmZsdXNoIChzdGRvdXQpOwotfQotCi12b2lkCi1wcmludF9leHByIChleHApCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIHByaW50X2V4cHJfMSAoc3RkZXJyLCBleHApOwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi12b2lkCi1zeW1ib2xfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAic3ltYm9sIHRhYmxlIiwgc3lfaGFzaCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJtaW5pIGxvY2FsIHN5bWJvbCB0YWJsZSIsIGxvY2FsX2hhc2gpOwotICBmcHJpbnRmIChmaWxlLCAiJWx1IG1pbmkgbG9jYWwgc3ltYm9scyBjcmVhdGVkLCAlbHUgY29udmVydGVkXG4iLAotCSAgIGxvY2FsX3N5bWJvbF9jb3VudCwgbG9jYWxfc3ltYm9sX2NvbnZlcnNpb25fY291bnQpOwotI2VuZGlmCi19Ci0KLS8qIGVuZCBvZiBzeW1ib2xzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9zeW1ib2xzLmggYi9nYXMvc3ltYm9scy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2I3M2FmLi4wMDAwMDAwCi0tLSBhL2dhcy9zeW1ib2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyogc3ltYm9scy5oIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBUaGUgQkZEIGNvZGUgd2FudHMgdG8gd2FsayB0aGUgbGlzdCBpbiBib3RoIGRpcmVjdGlvbnMuICAqLwotI3VuZGVmICBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0jZGVmaW5lIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLS8qIFRoZSBub24tQkZEIGNvZGUgZXhwZWN0cyB0byBiZSBhYmxlIHRvIG1hbmlwdWxhdGUgdGhlIHN5bWJvbCBmaWVsZHMKLSAgIGRpcmVjdGx5LiAgKi8KLSNpbmNsdWRlICJzdHJ1Yy1zeW1ib2wuaCIKLSNlbmRpZgotCi1leHRlcm4gc3RydWN0IG9ic3RhY2sgbm90ZXM7CS8qIGVnIEZpeFMgbGl2ZSBoZXJlLiAqLwotCi1leHRlcm4gc3RydWN0IG9ic3RhY2sgY29uZF9vYnN0YWNrOwkvKiB0aGlzIGlzIHdoZXJlIHdlIHRyYWNrIC5pZmRlZi8uZW5kaWYKLQkJCQkgICAgICAgKGlmIHdlIGRvIHRoYXQgYXQgYWxsKS4gICovCi0KLWV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7CS8qIGFsbCB0aGUgc3ltYm9sIG5vZGVzICovCi1leHRlcm4gc3ltYm9sUyAqc3ltYm9sX2xhc3RQOwkvKiBsYXN0IHN0cnVjdCBzeW1ib2wgd2UgbWFkZSwgb3IgTlVMTCAqLwotCi1leHRlcm4gc3ltYm9sUyBhYnNfc3ltYm9sOwotCi1leHRlcm4gaW50IHN5bWJvbF90YWJsZV9mcm96ZW47Ci0KLS8qIFRoaXMgaXMgbm9uLXplcm8gaWYgc3ltYm9scyBhcmUgY2FzZSBzZW5zaXRpdmUsIHdoaWNoIGlzIHRoZQotICAgZGVmYXVsdC4gICovCi1leHRlcm4gaW50IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7Ci0KLWNoYXIgKmRlY29kZV9sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGNoYXIgKnMpKTsKLXN5bWJvbFMgKnN5bWJvbF9maW5kIFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUpKTsKLXN5bWJvbFMgKnN5bWJvbF9maW5kX2Jhc2UgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSwgaW50IHN0cmlwX3VuZGVyc2NvcmUpKTsKLXN5bWJvbFMgKnN5bWJvbF9maW5kX29yX21ha2UgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotc3ltYm9sUyAqc3ltYm9sX21ha2UgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSkpOwotc3ltYm9sUyAqc3ltYm9sX25ldyBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lLCBzZWdUIHNlZ21lbnQsIHZhbHVlVCB2YWx1ZSwKLQkJCSAgICAgZnJhZ1MgKiBmcmFnKSk7Ci1zeW1ib2xTICpzeW1ib2xfY3JlYXRlIFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUsIHNlZ1Qgc2VnbWVudCwgdmFsdWVUIHZhbHVlLAotCQkJCWZyYWdTICogZnJhZykpOwotc3ltYm9sUyAqY29sb24gUEFSQU1TICgoY29uc3QgY2hhciAqc3ltX25hbWUpKTsKLXZvaWQgbG9jYWxfY29sb24gUEFSQU1TICgoaW50IG4pKTsKLXZvaWQgc3ltYm9sX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci12b2lkIHN5bWJvbF90YWJsZV9pbnNlcnQgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKLXZhbHVlVCByZXNvbHZlX3N5bWJvbF92YWx1ZSBQQVJBTVMgKChzeW1ib2xTICosIGludCkpOwotdm9pZCByZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIHByaW50X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChzeW1ib2xTICopKTsKLXZvaWQgcHJpbnRfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci12b2lkIHByaW50X2V4cHJfMSBQQVJBTVMgKChGSUxFICosIGV4cHJlc3Npb25TICopKTsKLXZvaWQgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgUEFSQU1TICgoRklMRSAqLCBzeW1ib2xTICopKTsKLQotaW50IGRvbGxhcl9sYWJlbF9kZWZpbmVkIFBBUkFNUyAoKGxvbmcgbCkpOwotdm9pZCBkb2xsYXJfbGFiZWxfY2xlYXIgUEFSQU1TICgodm9pZCkpOwotdm9pZCBkZWZpbmVfZG9sbGFyX2xhYmVsIFBBUkFNUyAoKGxvbmcgbCkpOwotY2hhciAqZG9sbGFyX2xhYmVsX25hbWUgUEFSQU1TICgobG9uZyBsLCBpbnQgYXVnZW5kKSk7Ci0KLXZvaWQgZmJfbGFiZWxfaW5zdGFuY2VfaW5jIFBBUkFNUyAoKGxvbmcgbGFiZWwpKTsKLWNoYXIgKmZiX2xhYmVsX25hbWUgUEFSQU1TICgobG9uZyBuLCBsb25nIGF1Z2VuZCkpOwotCi1leHRlcm4gdm9pZCBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci0KLS8qIEdldCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2Ygc3ltYm9scy4gIFRoZXNlIHVzZWQgdG8gYmUgbWFjcm9zLiAgKi8KLWV4dGVybiB2YWx1ZVQgU19HRVRfVkFMVUUgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9WQUxVRSBQQVJBTVMgKChzeW1ib2xTICosIHZhbHVlVCkpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGludCBTX0lTX0ZVTkNUSU9OIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0VYVEVSTkFMIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX1dFQUsgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfQ09NTU9OIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0RFRklORUQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfREVCVUcgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfTE9DQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfRVhURVJOIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX1NUQUJEIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIENPTlNUIGNoYXIgKlNfR0VUX05BTUUgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gc2VnVCBTX0dFVF9TRUdNRU5UIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgU19TRVRfU0VHTUVOVCBQQVJBTVMgKChzeW1ib2xTICosIHNlZ1QpKTsKLWV4dGVybiB2b2lkIFNfU0VUX0VYVEVSTkFMIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgU19TRVRfTkFNRSBQQVJBTVMgKChzeW1ib2xTICosIGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgU19DTEVBUl9FWFRFUk5BTCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNfU0VUX1dFQUsgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1zdHJ1Y3QgYnJva2VuX3dvcmQKLSAgewotICAgIC8qIExpbmtlZCBsaXN0IC0tIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIHBlciAiLndvcmQgeC15K0MiCi0gICAgICAgZXhwcmVzc2lvbi4gICovCi0gICAgc3RydWN0IGJyb2tlbl93b3JkICpuZXh0X2Jyb2tlbl93b3JkOwotICAgIC8qIFNlZ21lbnQgYW5kIHN1YnNlZ21lbnQgZm9yIGJyb2tlbiB3b3JkLiAgKi8KLSAgICBzZWdUIHNlZzsKLSAgICBzdWJzZWdUIHN1YnNlZzsKLSAgICAvKiBXaGljaCBmcmFnIGlzIHRoaXMgYnJva2VuIHdvcmQgaW4/ICAqLwotICAgIGZyYWdTICpmcmFnOwotICAgIC8qIFdoZXJlIGluIHRoZSBmcmFnIGlzIGl0PyAgKi8KLSAgICBjaGFyICp3b3JkX2dvZXNfaGVyZTsKLSAgICAvKiBXaGVyZSB0byBhZGQgdGhlIGJyZWFrLiAgKi8KLSAgICBmcmFnUyAqZGlzcGZyYWc7CQkvKiB3aGVyZSB0byBhZGQgdGhlIGJyZWFrICovCi0gICAgLyogT3BlcmFuZHMgb2YgZXhwcmVzc2lvbi4gICovCi0gICAgc3ltYm9sUyAqYWRkOwotICAgIHN5bWJvbFMgKnN1YjsKLSAgICBvZmZzZXRUIGFkZG51bTsKLQotICAgIGludCBhZGRlZDsJCQkvKiBuYXN0eSB0aGluZyBoYXBwZW5kIHlldD8gKi8KLSAgICAvKiAxOiBhZGRlZCBhbmQgaGFzIGEgbG9uZy1qdW1wICovCi0gICAgLyogMjogYWRkZWQgYnV0IHVzZXMgc29tZW9uZSBlbHNlcyBsb25nLWp1bXAgKi8KLQotICAgIC8qIFBvaW50ZXIgdG8gYnJva2VuX3dvcmQgd2l0aCBhIHNpbWlsYXIgbG9uZy1qdW1wLiAgKi8KLSAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKnVzZV9qdW1wOwotICB9OwotZXh0ZXJuIHN0cnVjdCBicm9rZW5fd29yZCAqYnJva2VuX3dvcmRzOwotI2VuZGlmIC8qIG5kZWYgV09SS0lOR19ET1RfV09SRCAqLwotCi0vKgotICogQ3VycmVudCBtZWFucyBmb3IgZ2V0dGluZyBmcm9tIHN5bWJvbHMgdG8gc2VnbWVudHMgYW5kIHZpY2UgdmVyc2UuCi0gKiBUaGlzIHdpbGwgY2hhbmdlIGZvciBpbmZpbml0ZS1zZWdtZW50cyBzdXBwb3J0IChlLmcuIENPRkYpLgotICovCi1leHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107CS8qIHN1YnNlZy5jICovCi0KLSNkZWZpbmUJU0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpICAoIHNlZ19OX1RZUEUgWyhpbnQpIChzZWcpXSApCi1leHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOy8qIHN1YnNlZy5jICovCi0KLSNkZWZpbmUJTl9SRUdJU1RFUgkzMAkvKiBGYWtlIE5fVFlQRSB2YWx1ZSBmb3IgU0VHX1JFR0lTVEVSICovCi0KLXZvaWQgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLQotdm9pZCBzeW1ib2xfaW5zZXJ0IFBBUkFNUyAoKHN5bWJvbFMgKiBhZGRtZSwgc3ltYm9sUyAqIHRhcmdldCwKLQkJCSAgICBzeW1ib2xTICoqIHJvb3RQLCBzeW1ib2xTICoqIGxhc3RQKSk7Ci12b2lkIHN5bWJvbF9yZW1vdmUgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFAsIHN5bWJvbFMgKiogcm9vdFAsCi0JCQkgICAgc3ltYm9sUyAqKiBsYXN0UCkpOwotCi1leHRlcm4gc3ltYm9sUyAqc3ltYm9sX3ByZXZpb3VzIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi12b2lkIHZlcmlmeV9zeW1ib2xfY2hhaW4gUEFSQU1TICgoc3ltYm9sUyAqIHJvb3RQLCBzeW1ib2xTICogbGFzdFApKTsKLXZvaWQgdmVyaWZ5X3N5bWJvbF9jaGFpbl8yIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1QKSk7Ci0KLXZvaWQgc3ltYm9sX2FwcGVuZCBQQVJBTVMgKChzeW1ib2xTICogYWRkbWUsIHN5bWJvbFMgKiB0YXJnZXQsCi0JCQkgICAgc3ltYm9sUyAqKiByb290UCwgc3ltYm9sUyAqKiBsYXN0UCkpOwotCi1leHRlcm4gc3ltYm9sUyAqc3ltYm9sX25leHQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLWV4dGVybiBleHByZXNzaW9uUyAqc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIFBBUkFNUyAoKHN5bWJvbFMgKiwKLQkJCQkJCSBjb25zdCBleHByZXNzaW9uUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfc2V0X2ZyYWcgUEFSQU1TICgoc3ltYm9sUyAqLCBmcmFnUyAqKSk7Ci1leHRlcm4gZnJhZ1MgKnN5bWJvbF9nZXRfZnJhZyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9tYXJrX3VzZWQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfY2xlYXJfdXNlZCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX3VzZWRfcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfY2xlYXJfdXNlZF9pbl9yZWxvYyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9tYXJrX21yaV9jb21tb24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfY2xlYXJfbXJpX2NvbW1vbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX21yaV9jb21tb25fcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9tYXJrX3dyaXR0ZW4gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfY2xlYXJfd3JpdHRlbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX3dyaXR0ZW5fcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9tYXJrX3Jlc29sdmVkIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfcmVzb2x2ZWRfcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX3NlY3Rpb25fcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX2VxdWF0ZWRfcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX2NvbnN0YW50X3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gYXN5bWJvbCAqc3ltYm9sX2dldF9iZmRzeW0gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfc2V0X2JmZHN5bSBQQVJBTVMgKChzeW1ib2xTICosIGFzeW1ib2wgKikpOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfU1lNRklFTERfVFlQRQotT0JKX1NZTUZJRUxEX1RZUEUgKnN5bWJvbF9nZXRfb2JqIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotdm9pZCBzeW1ib2xfc2V0X29iaiBQQVJBTVMgKChzeW1ib2xTICosIE9CSl9TWU1GSUVMRF9UWVBFICopKTsKLSNlbmRpZgotCi0jaWZkZWYgVENfU1lNRklFTERfVFlQRQotVENfU1lNRklFTERfVFlQRSAqc3ltYm9sX2dldF90YyBQQVJBTVMgKChzeW1ib2xTICopKTsKLXZvaWQgc3ltYm9sX3NldF90YyBQQVJBTVMgKChzeW1ib2xTICosIFRDX1NZTUZJRUxEX1RZUEUgKikpOwotI2VuZGlmCi0KLS8qIGVuZCBvZiBzeW1ib2xzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy90Yy5oIGIvZ2FzL3RjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDA0NmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3RjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyogdGMuaCAtIHRhcmdldCBjcHUgZGVwZW5kZW50Ci0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBJbiB0aGVvcnkgKG1pbmUsIGF0IGxlYXN0ISkgdGhlIG1hY2hpbmUgZGVwZW5kZW50IHBhcnQgb2YgdGhlIGFzc2VtYmxlcgotICAgc2hvdWxkIG9ubHkgaGF2ZSB0byBpbmNsdWRlIG9uZSBmaWxlLiAgVGhpcyBvbmUuICAtLSBKRiAqLwotCi1leHRlcm4gY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdOwotCi0vKiBKRiBtb3ZlZCB0aGlzIGhlcmUgZnJvbSBhcy5oIHVuZGVyIHRoZSB0aGVvcnkgdGhhdCBub2JvZHkgZXhjZXB0IE1BQ0hJTkUuYwotICAgYW5kIHdyaXRlLmMgY2FyZSBhYm91dCBpdCBhbnl3YXkuICovCi0KLXN0cnVjdCByZWxheF90eXBlCi17Ci0gIC8qIEZvcndhcmQgcmVhY2guIFNpZ25lZCBudW1iZXIuID4gMC4gKi8KLSAgbG9uZyBybHhfZm9yd2FyZDsKLSAgLyogQmFja3dhcmQgcmVhY2guIFNpZ25lZCBudW1iZXIuIDwgMC4gKi8KLSAgbG9uZyBybHhfYmFja3dhcmQ7Ci0KLSAgLyogQnl0ZXMgbGVuZ3RoIG9mIHRoaXMgYWRkcmVzcy4gKi8KLSAgdW5zaWduZWQgY2hhciBybHhfbGVuZ3RoOwotCi0gIC8qIE5leHQgbG9uZ2VyIHJlbGF4LXN0YXRlLiAgMCBtZWFucyB0aGVyZSBpcyBubyAnbmV4dCcgcmVsYXgtc3RhdGUuICovCi0gIHJlbGF4X3N1YnN0YXRlVCBybHhfbW9yZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHJlbGF4X3R5cGUgcmVsYXhfdHlwZVM7Ci0KLWV4dGVybiBjb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZTsJLyogU2l6ZSBvZiBhIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLWNoYXIgKm1kX2F0b2YgUEFSQU1TICgoaW50IHdoYXRfc3RhdGVtZW50X3R5cGUsIGNoYXIgKmxpdGVyYWxQLCBpbnQgKnNpemVQKSk7Ci0jaWZuZGVmIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1pbnQgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggUEFSQU1TICgoZnJhZ1MgKiBmcmFnUCwgc2VnVCBzZWdtZW50KSk7Ci0jZW5kaWYKLWludCBtZF9wYXJzZV9vcHRpb24gUEFSQU1TICgoaW50IGMsIGNoYXIgKmFyZykpOwotdm9pZCBtZF9zaG93X3VzYWdlIFBBUkFNUyAoKEZJTEUgKikpOwotbG9uZyBtZF9wY3JlbF9mcm9tIFBBUkFNUyAoKGZpeFMgKiBmaXhQKSk7Ci1zaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSBQQVJBTVMgKChmaXhTICogZml4UCkpOwotdm9pZCBtZF9hc3NlbWJsZSBQQVJBTVMgKChjaGFyICpzdHIpKTsKLXZvaWQgbWRfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotI2lmbmRlZiBtZF9jcmVhdGVfbG9uZ19qdW1wCi12b2lkIG1kX2NyZWF0ZV9sb25nX2p1bXAgUEFSQU1TICgoY2hhciAqcHRyLCBhZGRyZXNzVCBmcm9tX2FkZHIsCi0JCQkJICBhZGRyZXNzVCB0b19hZGRyLCBmcmFnUyAqIGZyYWcsCi0JCQkJICBzeW1ib2xTICogdG9fc3ltYm9sKSk7Ci0jZW5kaWYKLSNpZm5kZWYgbWRfY3JlYXRlX3Nob3J0X2p1bXAKLXZvaWQgbWRfY3JlYXRlX3Nob3J0X2p1bXAgUEFSQU1TICgoY2hhciAqcHRyLCBhZGRyZXNzVCBmcm9tX2FkZHIsCi0JCQkJICAgYWRkcmVzc1QgdG9fYWRkciwgZnJhZ1MgKiBmcmFnLAotCQkJCSAgIHN5bWJvbFMgKiB0b19zeW1ib2wpKTsKLSNlbmRpZgotdm9pZCBtZF9udW1iZXJfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqYnVmLCB2YWx1ZVQgdmFsLCBpbnQgbikpOwotCi0jaWZuZGVmIG1kX29wZXJhbmQKLXZvaWQgbWRfb3BlcmFuZCBQQVJBTVMgKChleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE1EX0FQUExZX0ZJWDMKLWludCBtZF9hcHBseV9maXgzIFBBUkFNUyAoKGZpeFMgKiBmaXhQLCB2YWx1ZVQgKnZhbCwgc2VnVCBzZWcpKTsKLSNlbmRpZgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWludCBtZF9hcHBseV9maXggUEFSQU1TICgoZml4UyAqIGZpeFAsIHZhbHVlVCAqdmFsKSk7Ci0jaWZuZGVmIG1kX2NvbnZlcnRfZnJhZwotdm9pZCBtZF9jb252ZXJ0X2ZyYWcgUEFSQU1TICgoYmZkICogaGVhZGVycywgc2VnVCBzZWMsIGZyYWdTICogZnJhZ1ApKTsKLSNlbmRpZgotI2lmbmRlZiB0Y19oZWFkZXJzX2hvb2sKLXZvaWQgdGNfaGVhZGVyc19ob29rIFBBUkFNUyAoKHNlZ1QgKiwgZml4UyAqKSk7Ci0jZW5kaWYKLSNpZm5kZWYgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi1leHRlcm4gYXJlbGVudCAqdGNfZ2VuX3JlbG9jIFBBUkFNUyAoKGFzZWN0aW9uICosIGZpeFMgKikpOwotI2Vsc2UKLWV4dGVybiBhcmVsZW50ICoqdGNfZ2VuX3JlbG9jIFBBUkFNUyAoKGFzZWN0aW9uICosIGZpeFMgKikpOwotI2VuZGlmCi0jZWxzZSAvKiBub3QgQkZEX0FTU0VNQkxFUiAqLwotdm9pZCBtZF9hcHBseV9maXggUEFSQU1TICgoZml4UyAqIGZpeFAsIGxvbmcgdmFsKSk7Ci0jaWZuZGVmIG1kX2NvbnZlcnRfZnJhZwotdm9pZCBtZF9jb252ZXJ0X2ZyYWcgUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzLCBzZWdULCBmcmFnUyAqIGZyYWdQKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiB0Y19jcmF3bF9zeW1ib2xfY2hhaW4KLXZvaWQgdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2VuZGlmIC8qIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiAqLwotCi0jaWZuZGVmIHRjX2hlYWRlcnNfaG9vawotdm9pZCB0Y19oZWFkZXJzX2hvb2sgUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7Ci0jZW5kaWYgLyogdGNfaGVhZGVyc19ob29rICovCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIG1kX3NlY3Rpb25fYWxpZ24KLXZhbHVlVCBtZF9zZWN0aW9uX2FsaWduIFBBUkFNUyAoKHNlZ1Qgc2VnLCB2YWx1ZVQgc2l6ZSkpOwotI2VuZGlmCi0KLSNpZm5kZWYgbWRfdW5kZWZpbmVkX3N5bWJvbAotc3ltYm9sUyAqbWRfdW5kZWZpbmVkX3N5bWJvbCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci0jZW5kaWYKLQotLyogZW5kIG9mIHRjLmggKi8KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvZ2FzL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOGM3ODcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIxICswLDAgQEAKLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvaTM4Ni9rYXRtYWkuZDogVHdlYWsgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGdhcy9lbGYvZWxmLmV4cDogRG9uJ3QgcnVuIHRlc3RzIG9uICIqLSotbGludXgqYW91dCoiIG9yCi0JIiotKi1saW51eCpvbGRsZCoiLgotCSogZ2FzL3Z0YWJsZS92dGFibGUuZXhwOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L3JlbG9jLmQ6IE1vZGlmeSBleHBlY3RlZCByZWxvYyBuYW1lcyB0byBhY2NlcHQgYS5vdXQKLQluYW1lcy4KLQotCSogZ2FzL2kzODYvYW1kLnM6IEFkZCBhIHN5bWJvbCBzbyBhLm91dCB0ZXN0cyB3aWxsIHdvcmsuCi0JKiBnYXMvaTM4Ni9rYXRtYWkuczogTGlrZXdpc2UuCi0JKiBnYXMvaTM4Ni9hbWQuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0JKiBnYXMvaTM4Ni9rYXRtYWkuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLTE5OTktMDYtMTAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvbWlwcy9zeW5jLmQ6IFBhc3MgLW1pcHMyIHRvIHRoZSBhc3NlbWJsZXIuCi0KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzLnM6IFR3ZWFrIGNvZGUgc28gdGhhdCB0aGUgdGVzdHMgcGFzcyBmb3IKLQltaXBzLWVsZiB0YXJnZXQgYXMgd2VsbCBhcyBtaXBzNjQtZWxmIHRhcmdldC4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzMS5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczIuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczQuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9lbGYvZWxmLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBtaXBzKi0qLSouCi0KLQkqIGdhcy9hbGwvaXRibC10ZXN0LmMgKG1haW4pOiBVcGRhdGUgaXRibF9nZXRfcmVnX3ZhbCBjYWxsIGZvciBuZXcKLQlwYXJhbWV0ZXIuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZ2FzL3NwYXJjL3N5bnRoNjQuczogQWRkIGNoZWNrcyBmb3Igc2luZ2xlIHJlZ2lzdGVyIHNpZ254L2NscnV3LgotCSogZ2FzL3NwYXJjL3NldDY0LnM6IEFkZCB0ZXN0cyBmb3Igc2V0dXcgYW5kIHNldHN3IHN5bnRoZXRpYyBpbnNucy4KLQkqIGdhcy9zcGFyYy9wcmVmZXRjaC5kOiBBZGQgLTY0IGFzIHN3aXRjaC4KLQkqIGdhcy9zcGFyYy9yZHByLmQ6IERpdHRvLgotCSogZ2FzL3NwYXJjL3dycHIuZDogRGl0dG8uCi0JKiBnYXMvc3BhcmMvc3ludGg2NC5kOiBEaXR0bywgcmVmbGVjdCBzeW50aDY0LnMgY2hhbmdlcy4KLQkqIGdhcy9zcGFyYy9yZWxvYzY0LmQ6IEFkZCAtNjQgYXMgc3dpdGNoLCBiZSBtb3JlIHRvbGVyYW50LCBhcwotCWN1cnJlbnQgZ2FzIG91dHB1dHMgJWhpKDApIGFuZCBub3QgJWhpKDB4MCkuCi0JKiBnYXMvc3BhcmMvc2V0NjQuZDogQWRkIC02NCBhcyBzd2l0Y2gsIHJlZmxlY3Qgc2V0NjQucyBjaGFuZ2VzIGFuZAotCW9wdGltaXphdGlvbnMgZm9yIHNldHggaW5zdHJ1Y3Rpb24uCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBEbyBzcGFyYzY0Ki0qLSogY2hlY2tzIGlmIGl0IGlzIGFueSBvZiB0aGUKLQljb21waWxlZC1pbiB0YXJnZXRzLgotCi0xOTk5LTA2LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvbWFjcm9zL2lycC5zOiBVc2UgYGZvbycgYW5kIGBiYXInIGluc3RlYWQgb2YgYHInIGFuZCBgcycuCi0JKiBnYXMvbWFjcm9zL3JlcHQucywgZ2FzL21hY3Jvcy90ZXN0Mi5zLCBnYXMvbWFjcm9zL3Rlc3QzLnM6IExpa2V3aXNlLgotCSogZ2FzL21hY3Jvcy97aXJwLHJlcHQsdGVzdDIsdGVzdDN9LmQ6IFVwZGF0ZS4KLQotMTk5OS0wNi0wNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2VsZi9lbGYuZXhwOiBOZXcgZGlyZWN0b3J5LgotCSogZ2FzL2VsZi9zZWN0aW9uMC5bc2RdOiBOZXcgdGVzdC4KLQkqIGdhcy9lbGYvc2VjdGlvbjEuW3NkXTogTmV3IHRlc3QuCi0KLTE5OTktMDYtMDMgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZCwgZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZSB0byBtYXRjaCBjdXJyZW50IGdhcywKLSAJYmZkIGFuZCBvcGNvZGVzLgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ2FzL3Z0YWJsZS92dGFibGUuZXhwOiBEb24ndCBydW4gdGVzdCBmb3IgaTk2MCB5ZXQuCi0KLTE5OTktMDUtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tY29yZS9hbGxpbnNuLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IG9iamR1bXAgb3V0cHV0LgotCi0xOTk5LTA1LTEyICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L29wY29kZS5kOiBNb2RpZnkgY2FsbHcgdG8gc3VpdCBkaXNhc20gZml4LgotCi0JKiBnYXMvaTM4Ni9hbWQuZDogTW9kaWZ5IGEgJyhiYWQpJyB0byBTSU1EIGluc3RydWN0aW9uLgotCi0JKiBnYXMvaTM4Ni9hbWQuczogUGFkIHRvIG11bHRpcGxlIG9mIDgKLQkqIGdhcy9pMzg2L2FtZC5kOiBIZXJlIHRvby4KLQotCSogZ2FzL2kzODYvcHJlZml4LltzZF06IEFsaWduIHdpdGggbm9wcwotCSogZ2FzL2kzODYvcmVsb2MuW3NkXTogSGVyZSB0b28uCi0KLQkqIGdhcy9pMzg2L2thdG1haS5bc2RdOiBOZXcgZm9yIFBJSUkgU0lNRAotCSogZ2FzL2kzODYvaTM4Ni5leHA6IENhbGwgaXQuCi0KLTE5OTktMDUtMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tY29yZS9hbGxpbnNuLmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyCi0Jb3BlcmF0aW9ucy4gCi0KLTE5OTktMDQtMTYgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBnYXMvaTM4Ni9hbWQuczogQWRkIE5PUHMgdG8gYWxpZ24gZm9yIGNvZmYgdGFyZ2V0cwotCSogZ2FzL2kzODYvYW1kLmQ6IGFuZCBjaGVjayBmb3IgdGhlbS4KLQotVGh1IEFwciAxNSAxNTowMzo0MyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9fY29wcm1lbSk6IE5vIGxvbmdlciBleHBlY3RlZCB0byBmaWxlLgotCi1XZWQgQXByIDE0IDEzOjQzOjA2IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnM6IERvIG5vdCB1c2UgaW1tZWRpYXRlIHZhbHVlIHdoZXJlIHdlCi0JcmVhbGx5IHdhbnQgYSByZWdpc3Rlci4KLQkqIGdhcy9ocHBhL2Jhc2ljL2NvcHJtZW0uczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9iYXNpYy9jb3BybWVtLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvc3BvcC5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL2Jhc2ljL2ltZW0uczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9lbnRyeWJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2V4cHJidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9maXh1cDdidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTMuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2xhc2JlbGRpZmZzLnM6IExpa2V3aXNlLgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2ltZW0pOiBIYW5kbGUgbXVsdGlwbGUgZW5jb2RpbmdzCi0JZm9yIGxvYWRzIGFuZCBzdG9yZXMgdXNpbmcgcmVnICsgc21hbGwgZCBhZGRyZXNzZXMuCi0JTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlIGZvciBtaXMtcGFyc2Ugb2YgaW1tICVyZWcuCi0KLTE5OTktMDQtMTMgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvbTMycnguZCAoY21wdV9fcmFjaCk6IEZpeCBleHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbTMyci9tMzJyeC5zIChiY19fYWRkLGFkZF9fYmMpOiBFeHBsaWNpdGx5IHNwZWNpZnkgc2hvcnQgYnJhbmNoCi0Jc28gYnJhbmNoIHJlbGF4YXRpb24gcmVzdHJpY3Rpb25zIHdvbid0IGludGVyZmVyZSB3aXRoIHBhcmFsbGVsaXphdGlvbgotCWF0dGVtcHRzLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbWNvcmU6IE5ldyBEaXJlY3RvcnkuCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5leHA6IE5ldyBGaWxlOiBFeHBlY3QgZmlsZSBmb3IgTUNvcmUgYXNzZW1ibHkKLQl0ZXN0cy4KLQkqIGdhcy9tY29yZS9hbGxpbnNuLnM6IE5ldyBGaWxlOiBTb3VyY2UgZmlsZSBmb3IgTUNvcmUgYXNzZW1ibHkKLQl0ZXN0cy4KLQkqIGdhcy9tY29yZS9hbGxpbnNuLmQ6IE5ldyBGaWxlOiBFeHBlY3RlZCBvdXRwdXQgZmlsZSBmb3IgTUNvcmUKLQlhc3NlbWJseSB0ZXN0cy4KLQotMTk5OS0wMy0yMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9tMzJyeC5bc2RdOiBGaXggYSBmZXcgbW9yZSB0ZXN0Y2FzZXMuCi0KLTE5OTktMDMtMTYgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9kMzAuZXhwIChydW5fbGlzdF90ZXN0KTogQWRkIG5ldyB0ZXN0cywKLSAgICAgICAgbGFiZWwsIGd1YXJkLWRlYnVnLCBzZXJpYWwsIHdhcm5fb2RkcmVnLCBiaXR0ZXN0LCBhbmQgbXVsLgotCi0JKiBnYXMvZDMwdi9vcHQuczogRml4IHNvbWUgd2FybmluZ3MgYW5kIGFkZCBhIGZldyBsYWJlbHMKLSAgICAgICAgdG8ga2VlcCB0aGluZ3MgZnJvbSBwYXJhbGxlbGl6aW5nIHdoZXJlIHdlIGRvbid0IHdhbnQgdGhlbSB0by4KLQotCSogZ2FzL2QzMHYvcmVsb2MuczogRml4IHdhcm5pbmcuCi0gICAgICAgIAotCSogZ2FzL2QzMHYvb3B0LmQsIHJlbG9jLmQsIGluc3QuZDogUmVidWlsZC4KLQotCSogZ2FzL2QzMHYvbGFiZWwuczogTmV3IHRlc3QuIENoZWNrIHRoYXQgbGFiZWxzIGFyZSBhbGlnbmVkIAotICAgICAgICBvbiA4LWJ5dGUgYm91bmRhcmllcy4KLQotCSogZ2FzL2QzMHYvZ3VhcmQtZGVidWcuczogTmV3IHRlc3QuIFRlc3Qgb3V0cHV0IHdpdGggIi1nIi4KLQotCSogZ2FzL2QzMHYvc2VyaWFsLnM6IE5ldyB0ZXN0LiBDaGVjayBmb3Igd2FybmluZ3Mgd2l0aCAKLSAgICAgICAgaWxsZWdhbCBzZXJpYWwgaW5zdHJ1Y3Rpb25zLgotCi0JKiBnYXMvZDMwdi93YXJuX29kZHJlZy5zOiBOZXcgdGVzdC4gQ0hlY2sgZm9yIHdhcm5pbmdzIHdoZW4KLSAgICAgICAgb2RkLW51bWJlcmVkIHJlZ2lzdGVycyBhcmUgdXNlZCBmb3Igc29tZSBpbnN0cnVjdGlvbnMuCi0KLQkqIGdhcy9kMzB2L2JpdHRlc3QuczogTmV3IHRlc3QuIENoZWNrIGZvciBiaXQgb3BlcmF0aW9uIAotICAgICAgICBpbnN0cnVjdGlvbnMgKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1QpIGluIHRoZSBJVS4KLQotCSogZ2FzL2QzMHYvbXVsLnM6IE5ldyB0ZXN0LiBDaGVjayBmb3IgcmVzdHJpY3RlZCBzZXF1ZW5jZXMKLSAgICAgICAgaW4gYSBidW5jaCBvZiBkaWZmZXJlbnQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zLgotCQotCSogZ2FzL3Z0YWJsZS92dGFibGUuZXhwIChydW5fbGlzdF90ZXN0KTogRG9uJ3QKLQlydW4gdGVzdCBvbiBEMzBWLgotCi0xOTk5LTAzLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IEV4cGVjdCBzdHJvbmdhcm0tY29mZiB0YXJnZXQgdG8gZmFpbCBjb2ZmdGFnCi0JdGVzdC4gCi0KLTE5OTktMDItMTMgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biB0aGUgbmV3IHRlc3RzLCBiZWxvdy4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzMS5kLCBnYXMvbWlwcy9lbGZfZV9mbGFnczIuZCwKLQlnYXMvbWlwcy9lbGZfZV9mbGFnczMuZCwgZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQ6IE5ldyBmaWxlcy4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzLmMsIGdhcy9taXBzL2VsZl9lX2ZsYWdzLnM6IE5ldyBmaWxlcy4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IERvY3VtZW50LiAgSXQncyBub3QKLSAJcmVhbGx5IHRyaXZpYWwuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBDbGVhbiB1cCBsb2dpYyBmb3IgZ3Vlc3NpbmcKLQkkcHJvZ3JhbSAodGhlIGR1bXAgdG9vbCkuCi0KLTE5OTktMDItMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBQcmVmaXggYWxsIHwgd2l0aCBcLgotCShwdXNoLHBvcCk6IEZpeCBleHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbTMyci9yZWxheC0xLmQ6IEVtaXR0ZWQgbm9wcyBhcmUgc2VyaWFsLCBub3QgcGFyYWxsZWwuCi0JKiBnYXMvbTMyci9mc2xvdC5kOiBQcmVmaXggYWxsIHwgd2l0aCBcLgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvdnRhYmxlL2luaGVyaXQwLnM6IERvIG5vdCB1c2UgJ0AnIHByZWZpeCB0byAudHlwZSBvcGVyYXRvci4KLQlTb21lIHBvcnRzIHVzZSBpdCBhcyBhIGNvbW1lbnQgaW5pdGlhdG9yLgotCi0JKiBnYXMvdnRhYmxlL2VudHJ5MS5kOiBEbyBub3QgbG9vayBmb3IgYW4gYWRkZW5kLiAgU29tZSBwb3J0cyB1c2UKLQlSRUwgcmVsb2NhdGlvbnMgYW5kIHNvIGRvIG5vdCBoYXZlIG9uZS4KLQotMTk5OC0xMi0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXggdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBzeW50YXguCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IEZpeCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dAotCi0xOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLTE5OTgtMTItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogUmVwbGFjZSBpbGxlZ2FsIGluc25zIHdpdGggbGVnYWwgdmVyc2lvbnMuCi0KLQkqIGdhcy9mcjMwL2FsbGluc24uZDogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCi1UaHUgTm92IDE5IDE1OjU5OjUxIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBSZW9yZGVyIGluc25zIGZvciBiZXR0ZXIgc2ltdWxhdGlvbi4KLQotVGh1IE5vdiAxOSAwNzo1MDo0NCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvc3luYy5bc2RdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIGl0LgotCi1XZWQgTm92IDE4IDExOjI3OjU2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zIChkbW92KTogQ29ycmVjdCBoZXggbGl0ZXJhbHMuCi0KLVR1ZSBOb3YgMTcgMTU6MjQ6MjAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBNb3ZlZCBjdXJyZW50bHkgdW4tYXNzZW1ibGlhYmxlIGluc3RydWN0aW9ucwotCXRvIGVuZCBvZiBmaWxlLgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IEFkZGVkIGRpc2Fzc2VtYmx5IG9mIGN1cnJlbnRseSBhc3NlbWJsaWFibGUKLQlvcGNvZGVzLgotCi1Nb24gTm92IDE2IDE2OjUwOjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogRml4IHN5bnRheCBlcnJvcnMuCi0KLU1vbiBOb3YgMTYgMTk6Mjc6NTIgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IEZpeGVkIG1vcmUgdHlwb3MuCi0KLUZyaSBOb3YgMTMgMTM6MTU6MDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXhlZCB0eXBvcyBhbmQgYWRkZWQgc29tZSB0ZXN0cyBvZiB1cHBlcgotCWNhc2UgdnMgbG93ZXIgY2FzZS4KLQotVHVlIE5vdiAxMCAxNDo1NDo0NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IE5ldyBmaWxlLgotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBOZXcgZmlsZS4KLQkqIGdhcy9mcjMwL2FsbGluc24uZXhwOiBOZXcgZmlsZS4KLQkqIGdhcy9mcjMwL2ZyMzAuZXhwOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgMiAyMDoxNjo1MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9mc2xvdC5bc2RdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbTMyci9tMzJyLmV4cDogUnVuIGl0LgotCi1UdWUgT2N0IDIwIDExOjM1OjA2IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvaTM4Ni5leHA6IFJ1biBBTUQgaW5zbiB0ZXN0LgotCSogZ2FzL2kzODYvYW1kLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2kzODYvYW1kLmQ6IE5ldyB0ZXN0IHJlc3VsdHMuCi0KLVN1biBTZXAgMjAgMDE6MDA6MDEgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGdhcy92dGFibGUvaW5oZXJpdDEubDogUmVxdWlyZSBvbmx5IHRoZSB3b3JkIEdBUyBzb21ld2VyZSBpbiB0aGUKLQlmaXJzdCBsaW5lIG9mIHRoZSBsaXN0aW5nLgotCi1UdWUgU2VwICAxIDEwOjIwOjAzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9wcGMvYXN0ZXN0LmQ6IEFkanVzdCByZWdleHBzIHRvIG1hdGNoIGEgNjQtYml0IGhvc3QuCi0JKiBnYXMvcHBjL2FzdGVzdDIuZDogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMzEgMTM6MjU6MDcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3Z0YWJsZS97ZW50cnkwLmQsZW50cnkxLmQsaW5oZXJpdDAuZH06IEZpeCBwYXR0ZXJuIG1hdGNoaW5nCi0Jb2Ygd2hpdGVzcGFjZSBmb3IgNjQtYml0IGhvc3RzLgotCi1Nb24gQXVnIDMxIDEyOjQ1OjQ5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cDogTmV3LgotCSogZ2FzL3Z0YWJsZS97ZW50cnkwLnMsZW50cnkwLmR9OiBOZXcuCi0JKiBnYXMvdnRhYmxlL3tlbnRyeTEucyxlbnRyeTEuZH06IE5ldy4KLQkqIGdhcy92dGFibGUve2luaGVyaXQwLnMsaW5oZXJpdDAuZH06IE5ldy4KLQkqIGdhcy92dGFibGUve2luaGVyaXQxLnMsaW5oZXJpdDEubH06IE5ldy4KLQotVGh1IEF1ZyAyMCAyMzoxODowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9pMzg2L3doaXRlLmw6IFJldmVydCBwYXRjaCBvZiBBdWd1c3QgMTIuCi0KLVdlZCBBdWcgMTIgMTE6NTQ6MzcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC91ZGYuczogTmV3IHRlc3QuCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFJ1biBpdC4KLQotV2VkIEF1ZyAxMiAxMzoyNTozOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L2dlbmVyYWwubDogVGVzdCBhbmRiICR+MHg4MCxmb28uCi0JKiBnYXMvaTM4Ni9nZW5lcmFsLnM6IFVwZGF0ZS4KLQotCSogZ2FzL2kzODYvd2hpdGUubDogRXhwZWN0IHdhcm5pbmcgZm9yIHN0YW5kLWFsb25lIHNzIHByZWZpeC4KLQotVHVlIEp1bCAyMSAxMjo0Njo1OSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L3doaXRlLnM6IEFkZCBzb21lIG1vcmUgd2hpdGVzcGFjZSB0ZXN0cy4KLQkqIGdhcy9pMzg2L3doaXRlLmw6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotTW9uIEp1bCAxMyAxODoxNToxMSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2Lyo6IEFsbCBuZXcgaTM4NiB0ZXN0c3VpdGUuCi0KLTE5OTgtMDctMDIgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfaW5pdCk6IENvbXBsYWluIGlmIHRhcmdldCBuYW1lIGlzbid0IGluCi0JY2Fub25pY2FsIGZvcm0uCi0KLVdlZCBKdWwgIDEgMTU6MzU6MDkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBFeHBlY3QgQVJNIGFuZCBUaHVtYiBjb2ZmdGFnIHRlc3QgdG8gZmFpbC4KLQotV2VkIEp1bCAgMSAxNzozMTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9wcGMvc2ltcHNoZnQuczogQWRkIGFsaWdubWVudCBzbyB0aGF0IGl0IHdvcmtzIG9uIEFJWC4KLQkqIGdhcy9wcGMvc2ltcHNoZnQuZDogQ2hhbmdlIGFjY29yZGluZ2x5LiAgT25seSBkdW1wIHRoZSAudGV4dAotCXNlY3Rpb24uCi0KLVR1ZSBKdW4gMjMgMTU6MTQ6NDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3Y4NTAvaGlsbzIuczogVXNlIHIxIGFzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgbW92ZWEKLQlpbnN0cnVjdGlvbiwgc2luY2UgcjAgaXMgcmVhZCBvbmx5LgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHA6IEZpeCBuYW1lcyBvZiBzcGVjaWFsIGFyZWEgcmVsb2NhdGlvbnMuCi0JU2V0IC1td2Fybi1zaWduZWQtb3ZlcmZsb3cgZmxhZyB3aGVuIHJ1bm5pbmcgcmFuZ2UucyB0ZXN0LgotCi1TdW4gSnVuIDIxIDEyOjQ0OjQzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L3JlbG9jLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLVdlZCBKdW4gMTcgMTQ6MDI6MTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvZGVsYXkuZDogQWRkIC1tY3B1PU5OTk4gdG8gZ2FzIGZsYWdzIHRvIGxldCB0ZXN0IGNhc2UKLSAJcnVuIG9uIGRpZmZlcmVudGx5IHRhcmdldGVkIGFzc2VtYmxlci4KLQkqIGdhcy9taXBzL3tsZC1pbG9ja3MtYWRkcjMyLGxkLXN2cjRwaWMuZH06IERpdHRvLgotCSogZ2FzL21pcHMve2xkLXhnb3QuZCxsaWYtc3ZyNHBpYy5kLGxpZi14Z290LmR9OiBTYW1lLgotCSogZ2FzL21pcHMve21pcHMxNi5kLG1pcHM0LmQsbm9kZWxheS5kfTogQWdhaW4uCi0JKiBnYXMvbWlwcy97dHJ1bmMuZCx1bGQuZCx1bGgteGdvdC5kLHVzZC5kfTogQW5kIHRoZW4gc29tZS4KLQkKLQkqIGdhcy9taXBzL2xkLWlsb2Nrcy5kOiBSZW1vdmVkIGRpc2Fzc2VtYmxlciBmbGFncyB0byBsZXQgdGFyZ2V0Ci0gCWRlZmF1bHRzIGdvIHVubW9kaWZpZWQuICBSZXBsYWNlZCAkZjQvJGY1IHdpdGggJGZwWzQ1XSwgYXMgdGhlCi0Jb3JpZ2luYWwgYGxkLmQnIGhhZC4gIEZpbmQgYGxkLnMnLgotCSogZ2FzL21pcHMvbXVsLWlsb2Nrcy5kOiBOZWFybHkgZGl0dG8uCi0JCi1UaHUgSnVuIDExIDE2OjUwOjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2luc3QuZDogRXhwZWN0IHJlcGVhdGkgaW5zdHJ1Y2l0b25zIHRvIGJlIGNvbWJpbmVkLgotCi0JKiBnYXMvZDMwdi9pbnN0LnM6IEFkZCBub3AgdG8ga2VlcCBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb25zIGF0Ci0JZXhwZWN0ZWQgYWRkcmVzc2VzLgotCi1Nb24gSnVuICA4IDE4OjQ3OjExIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2FycmF5LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciByZXN1bHRzLgotCSogZ2FzL2QzMHYvcmVsb2MuZDogUGFydGlhbGx5IHVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlcgotCXJlc3VsdHMuIAotCi1GcmkgSnVuICA1IDE5OjE1OjU5IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5zOiBGb3IgYWxsIHBjIHJlbGF0aXZlIGFkZHJlc3NlcyBjaGFuZ2UgdHN0bAotCXRvIHBlYSBzaW5jZSB0aGUgZm9ybWVyIGRvZXMgbm90IGFsbG93IHBjcmVsIG9uIG02ODAwMC4gIERvIG5vdAotCW1ha2UgbGFiZWwgZm9vIGdsb2JhbCwgc28gdGhhdCByZWZlcmVuY2VzIHRvIGl0IGNhbiBiZSByZWxheGVkIG9uCi0JRUxGIHRhcmdldHMuCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5kLCBnYXMvbTY4ay9vcDY4MDAwLmQ6IFVwZGF0ZWQuCi0KLVR1ZSBKdW4gIDIgMTU6MDg6MzYgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZ2FzL3BwYy9wcGMuZXhwOiBSdW4gc2ltcHNoZnQgdGVzdC4KLQkqIGdhcy9wcGMvc2ltcHNoZnQuZDogTmV3IGZpbGUuCi0JKiBnYXMvcHBjL3NpbXBzaGZ0LnM6IE5ldyBmaWxlLgotCi1Nb24gSnVuICAxIDE3OjAwOjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvZGl2LWlsb2Nrcy5kOiBIYW5kbGUgYm90aCAiYnJlYWsiIGluc3RydWN0aW9uIHZhcmlhbnRzLgotCSogZ2FzL21pcHMve2Rpdi5kLCBtdWwtaWxvY2tzLmQsIG11bC5kfTogTGlrZXdpc2UuCi0JCi1GcmkgTWF5IDI5IDEyOjA3OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkanVzdCBpbG9ja3MgaW5pdGlhbGl6YXRpb24gdG8gbWF0Y2ggY3VycmVudAotCWFzc2VtYmxlciBkZWZhdWx0cyBtb3JlIGNsb3NlbHkuCi0KLQkqIGdhcy9zaC9mcC5zOiBSZW1vdmUgZnRzdC9uYW4uICBUaGUgYXNzZW1ibGVyIG5vIGxvbmdlciBzdXBwb3J0cwotCXRoZSBpbnN0cnVjdGlvbi4KLQkqIGdhcy9zaC9iYXNpYy5leHA6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotV2VkIE1heSAyNyAxNToyNjo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9hbGlnbi5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCSogZ2FzL2QzMHYvaW5zdC5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCSogZ2FzL2QzMHYvaW5zdC5zOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgcnVsZXMuCi0JKiBnYXMvZDMwdi9vcHQuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQotRnJpIE1heSAyMiAxNTo1Njo1MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLmQ6IEhhbmRsZSA2NCBiaXQgYmZkX3ZtYS4KLQkqIGdhcy9tMzJyL3VwcGVyY2FzZS5kOiBMaWtld2lzZS4KLQotVGh1IE1heSAyMSAxNTowMzowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL3RodW1iLnM6IEFkZCBwZXJpb2QgdG8gc3RhcnQgb2YgbGFiZWxzIHRvIHByZXZlbnQKLQlhc3NlbWJsZXIgdGhpbmtpbmcgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbiBlbnRyeSBwb2ludHMuCi0KLVR1ZSBNYXkgMTkgMTg6MTc6MTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzMTYuZDogQ29ycmVjdCB0byByZWZsZWN0IGJ1ZyBmaXggdG8gZGlzYXNzZW1ibGVyLgotCi1Nb24gTWF5IDE4IDEzOjExOjQ1IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3tkaXYsbGQsbXVsfS5kOiBBZGQgYXNzZW1ibGVyIC1tY3B1PSBmbGFnIHRvIG1hdGNoCi0gCWRpc2Fzc2VtYmxlci4KLQkKLUZyaSBNYXkgMTUgMTQ6NTE6MDEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBEaXN0aW5ndWlzaCBjaGFpbnMgd2l0aCAzMi1iaXQgYWRkcmVzc2VzLgotCSogZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kIDogTmV3LgotCi1XZWQgTWF5IDEzIDE1OjA2OjMxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL3VwcGVyY2FzZS5bc2RdOiBUZXN0IGZvciBISUdILFNISUdILExPVyxTREEuCi0KLVRodSBNYXkgIDcgMTM6MDU6MjUgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvYnJlYWsyMC5bc2RdOiBOZXcgdGVzdHMgZm9yIDIwLWJpdCBvcGVyYW5kIGJyZWFrIGFuZAotIAlzZGRicCBpbnN0cnVjdGlvbnMuIAotCSogZ2FzL21pcHMvdHJhcDIwLltzZF06IE5ldyB0ZXN0cyBmb3IgMjAtYml0IG9wZXJhbmQgdHJhcAotIAlpbnN0cnVjdGlvbnMuIAotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biB0aGVtLgotCi1UaHUgQXByIDMwIDExOjU1OjAxIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L3tpbnN0LGFycmF5LG9wdCxyZWxvY30uZDogQWNjZXB0IDxzeW1ib2wrb2Zmc2V0PiBsYWJlbHMKLSAJaW4gZGlzYXNzZW1ibHksIHdoZXJlIHRoZSBvZmZzZXQgaXMgaW4gaGV4IGFuZCBoYXMgYSAiMHgiIHByZWZpeC4KLQkKLVR1ZSBBcHIgMjggMTY6Mzg6MzQgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGluZW5vLltzZF06IEFzc2VtYmx5IHNvdXJjZSBsaW5lIG51bWJlciB0ZXN0LgotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZGVkIGxpbmVubyB0ZXN0LgotCi1XZWQgQXByICA4IDE4OjQ1OjE3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Rlc3RzdWl0ZS9hbGwvZ2FzLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlcyBmb3IKLQlkaWZmZXJlbmNlIG9mIHVuZGVmaW5lZCBzeW1ib2xzIG9uIG1uMTB4MDAgdGFyZ2V0cy4KLQotTW9uIE1hciAyMyAxMDo0NzozMyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2FsaWduLnM6IEJhY2sgb3V0ICIuc2VjdGlvbiB0ZXh0IiBjaGFuZ2UgYmVsb3c7Ci0JdXNlICIudGV4dCIgYWdhaW4uCi0JKiBnYXMvbWFjcm9zL3NlbWkuczogRGl0dG8uCi0JCi1GcmkgTWFyIDIwIDE4OjUxOjQ5IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvYWxpZ24uczogSWRlbnRpZnkgIi50ZXh0IiBzZWN0aW9uIGV4cGxpY2l0bHkuCi0JKiBnYXMvbWFjcm9zL3NlbWkuczogRGl0dG8uCi0JCi0JCi0JCi1Nb24gTWFyICAyIDEzOjMwOjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLltzZF0gKGxkaThhLGxkaTE2YSk6IERlbGV0ZS4KLQkobGRpMTYpOiBJbXByb3ZlIHRlc3QuCi0JKG5vcCk6IEZpeCB0ZXN0LgotCi1UaHUgRmViIDEyIDIwOjEyOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC9tYWNyby5vdXQ6IEFkanVzdCB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQga2V5d29yZAotCWFyZ3VtZW50cyBhcmUgbm93IHBlcm1pdHRlZCBhZnRlciBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KLQotV2VkIEZlYiAgNCAxNToyNzo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2FybTd0LmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQotV2VkIEZlYiAgNCAxNTo0MDowMCAxOTk4ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBnYXMvcHBjL3BwYy5leHA6IE5ldyBmaWxlLgotCSogZ2FzL3BwYy9hc3Rlc3QucywgZ2FzL3BwYy9hc3Rlc3QuZDogTmV3IHRlc3QuCi0JKiBnYXMvcHBjL2FzdGVzdDIucywgZ2FzL3BwYy9hc3Rlc3QyLmQ6IE5ldyB0ZXN0LgotCi1TdW4gRmViICAxIDIxOjQzOjU0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvNDAxMC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KLQkqIGdhcy9taXBzLzQwMTAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogZ2FzL21pcHMvNDEwMC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KLQkqIGdhcy9taXBzLzQxMDAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogZ2FzL21pcHMvNDY1MC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KLQkqIGdhcy9taXBzLzQ2NTAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1GcmkgSmFuIDMwIDE0OjA5OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tb3ZlbWwuZDogQWRkIHRlc3QgY29tbWVudHMsIGZpeCByZWdleHBzLgotCi1UaHUgSmFuIDI5IDEzOjM0OjQ5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL3thbGxpbnNuLGhpZ2gtMX0uZDogQWxsb3cgIyBjb25zdGFudCBwcmVmaXggdG8gYmUgbWlzc2luZy4KLQotVGh1IEphbiAyOSAwOTo0Mzo1MCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9tcmlfbW92ZW1sLltzZF06IE1vdmVkIHRvIC4uLgotCSogZ2FzL21yaS9tb3ZlbWwuW3NkXTogLi4uIGhlcmUuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KLQotVHVlIEphbiAyNyAyMTo1NTo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzLzQwMTAuczogQWRkIDQwMTAgdGVzdHMuCi0JKiBnYXMvbWlwcy80MDEwLmQ6IEV4cGVjdGVkIG91dHB1dC4KLQkqIGdhcy9taXBzLzQxMDAuczogQWRkIDQwMTAgdGVzdHMuCi0JKiBnYXMvbWlwcy80MTAwLmQ6IEV4cGVjdGVkIG91dHB1dC4KLQkqIGdhcy9taXBzLzQ2NTAuczogQWRkIDQwMTAgdGVzdHMuCi0JKiBnYXMvbWlwcy80NjUwLmQ6IEV4cGVjdGVkIG91dHB1dC4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gdGhlIG5ldyB0ZXN0cy4KLQkqIGdhcy9taXBzLyouZDogUGFzcyB0aGUgcmlnaHQgcHJvY2Vzc29yIG1vZGVsIHRvIG9iamR1bXAuCi0JRml4IG1pbm9yIGNhc2VzIHdoZXJlIGV4cGVjdGVkIG91dHB1dCB3YXMgd3JvbmcgZHVlIHRvIG9wY29kZQotCWNvbmZsaWN0cy4KLQotVHVlIEphbiAyNyAwNTozNTowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9tcmlfbW92ZW1sLltzZF06IE5ldyB0ZXN0Y2FzZS4KLQotVGh1IEphbiAyMiAxNzoyOTowNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9oaWdoLTEuZDogQWRkIGhhc2ggcHJlZml4IHRvIGNvbnN0YW50cy4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5zOiBBZGQgaGFzaCBwcmVmaXggdG8gc29tZSBjb25zdGFudHMuCi0JKiBnYXMvbTMyci9hbGxpbnNuLmQ6IEFkZCBoYXNoIHByZWZpeCB0byBjb25zdGFudHMuCi0KLVdlZCBKYW4gMjEgMjE6MjQ6MDggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBnYXMvbTg4ay9pbml0LmQ6IEZpeCBoZXhhZGVjaW1hbCBvZmZzZXRzLgotCi1XZWQgSmFuIDE0IDE3OjQ5OjIyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL3VwcGVyY2FzZS5kOiBGaXggd2hpdGUgc3BhY2UgbWF0Y2hpbmcuCi0JKiBnYXMvbTMyci9yZWxheC0xLmQ6IEZpeCB3aGl0ZSBzcGFjZSBtYXRjaGluZy4KLQotV2VkIEphbiAxNCAxNTo0NDozMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzL2Rpdi5kOiBVcGRhdGUgZm9yIHJlY2VudCBhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9taXBzL2Rpdi1pbG9ja3MuZDogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTQgMTE6MTM6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24uZCAoY21wdWkpOiBVcGRhdGUgb3V0cHV0IHRvIG5ldyBmb3JtYXQuCi0KLVRodSBEZWMgMTggMTE6MTA6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi0JKiBnYXMvYXJtL2FybTd0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi1UdWUgRGVjIDE2IDIyOjE5OjI1IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sYi14Z290LmQsIGdhcy9taXBzL3JvbC5kLCBnYXMvbWlwcy9qYWwtc3ZyNHBpYy5kLAotCWdhcy9taXBzL2phbC14Z290LmQ6IEFkZCBhc3NlbWJsZXIgb3B0aW9uIHRvIHNlbGVjdCBhIHNwZWNpZmljCi0JdGFyZ2V0IGNoaXAsIHRoZSBSMzAwMC4KLQkqIGdhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQ6IE5ldyB0ZXN0LCBzcGVjaWZpY2FsbHkgc2VsZWN0aW5nCi0JUjM5MDAuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5leHA6IERvbid0IHJ1biBJRUVFIEZQIHRlc3RzIGZvciBWYXgKLQl0YXJnZXRzLgotCi1XZWQgT2N0IDE1IDEwOjQwOjE0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuczogVHdlYWsgc2xpZ2h0bHkgdG8gd29yayBvbiB0aGUgUEEuCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyCi0JY2hhbmdlcy4KLQotVGh1IE9jdCAgOSAxODoxMDo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc2V0NjQuW3NkXTogYHNldCcgZG9lc24ndCB0YWtlIG5lZ2F0aXZlIGFyZ3VtZW50cy4KLQotVGh1IE9jdCAgOSAxMjo1OTo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZDogTGlrZXdpc2UuCi0KLVdlZCBPY3QgIDggMTY6MjI6NTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3JlbG9jNjQuW3NkXTogQWRkIHRlc3RjYXNlcyBmb3IgJWhpeCwlbG94LgotCi1XZWQgT2N0ICA4IDE1OjEyOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3N5bnRoLmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL3NwYXJjL3N5bnRoNjQuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9taXBzL2JlcS5zOiBBZGQgLnRleHQgdG8gLmdsb2JsIHRvIG1hcmsgdGhlIHN5bWJvbCB0byBhcyBhCi0JZnVuY3Rpb24gc3ltYm9sLgotCSogZ2FzL21pcHMvamFsLnM6IExpa2V3aXNlLgotCi1UdWUgT2N0ICA3IDEzOjMwOjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9yZWxvYzY0LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IFJ1biBpdC4KLQotU2F0IE9jdCAgNCAxOToxNDoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cDogQWNjZXB0IG02OGsgbGlzdGluZyBmb3JtYXQuCi0KLUZyaSBPY3QgIDMgMTU6NDY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5leHA6IFJlbW92ZSBzZXR1cF94ZmFpbDsgaXQgc2hvdWxkIG5vdwotCXdvcmsuICBDb3JyZWN0IGZvciBiaWcgZW5kaWFuIGFuZCBmb3IgdGFicyBpbiBpbnB1dCBmaWxlLgotCi0JKiBnYXMvYWxwaGEvZnAuZXhwOiBDaGVjayBmb3IgYWxwaGEtKi1vc2YqLCBub3QgYWxwaGEtKi1vc2YxKi4KLQkqIGdhcy9hbHBoYS9mcC5zOiBDaGFuZ2UgY29tbWVudCBjaGFyYWN0ZXJzIGZyb20gISB0byAjLgotCi1UaHUgU2VwIDE4IDExOjE3OjUzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGxldC5kOiBVcGRhdGUgdG8gbmV3IG9iamR1bXAgb3V0cHV0IGZvcm1hdC4KLQkqIGdhcy9zcGFyYy97YXNpLmQsbWVtYmFyLmQscHJlZmV0Y2guZCxyZHByLmQsd3Jwci5kfTogTGlrZXdpc2UuCi0JKiBnYXMvc3BhcmMvc2V0NjQuW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL3NwYXJjL3NwbGV0LTIuW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIHRoZW0uCi0KLVR1ZSBTZXAgMTYgMTU6Mjc6MDggMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGdhcy9kMzB2L2luc3QuczogQWRkIHNvbWUgbmV3IHRlc3RzLiAKLQotIAkqIGdhcy9kMzB2L3tpbnN0LCBvcHQsIHJlbG9jfS5kOiBVcGRhdGUgcmVzdWx0cyB3aXRoCi0gCW5ldyBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotCSogZ2FzL2QzMHYvaW5zdC5bc2RdOiBVcGRhdGUgZXhhbXBsZXMgZm9yIGQqaSBpbnN0cnVjdGlvbnMuIAotCi0JKiBnYXMvZDMwdi8qLmQ6IFVwZGF0ZSBhbGwgdGVzdCByZXN1bHRzIGJlY2F1c2UKLSAJb2YgbmV3ICIucyIgYW5kICIubCIgZXh0ZW5zaW9ucy4KLQotCSogZ2FzL2QzMHYvaW5zdC5bc2RdOiBDb3JyZWN0IGVudHJ5IGZvciBtdWx4MmguCi0JKiBnYXMvZDMwdi9vcHQuW3NkXTogQ29ycmVjdCBzdDJ3IGluc3RydWN0aW9uLiAKLQotCSogZ2FzL2QzMHYvYWxpZ24uZDogQ2hhbmdlIGV4cGVjdGVkIG91dHB1dC4KLQotCSogZ2FzL2QzMHYvcmVsb2MuW3NkXTogQWRkIHRlc3QgY2FzZS4gCi0KLQkqIGdhcy9kMzB2L2FycmF5LltzZF06IE5ldyB0ZXN0IGNhc2UuCi0KLQkqIGdhcy9kMzB2L29wdC5bc2RdOiBBZGRlZCBtb3JlIHRlc3QgY2FzZXMuIAotCi0JKiBnYXMvZDMwdi9vcHQuczogQWRkIHRlc3QgY2FzZXMuCi0JKiBnYXMvZDMwdi9yZWxvYy5zOiBGaXggYSB0ZXN0IGNhc2UuCQotCSogZ2FzL2QzMHYve29wdCxyZWxvY30uZDogUmVnZW5lcmF0ZS4KLQotTW9uIFNlcCAgOCAxNDoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9oaWdoLTEuW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvbTMyci5leHA6IFJ1biBpdC4KLQotTW9uIEF1ZyAyNSAxMTowNDoyNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9yZWxheC0xLltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnIuZXhwOiBSdW4gaXQuCi0KLVRodSBBdWcgMTQgMjM6NDk6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FyYzogTmV3IGRpcmVjdG9yeQotCSogZ2FzL2FyYy97YXJjLmV4cCxhbGlhcy5bc2RdLGJyYW5jaC5bc2RdLGZsYWcuW3NkXSxpbnNuMy5bc2RdLGouW3NkXSwKLQlsZC5bc2RdLG1hdGguW3NkXSxzc2hpZnQuW3NkXSxzdC5bc2RdLHdhcm4ue2V4cCxzfX06IE5ldyBmaWxlcy4KLQotV2VkIEF1ZyAgNiAwMDozMzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IEFTIGFuZCBHQVNQIHRvIGFzLW5ldywgbm90IGFzLm5ldy4KLQotVHVlIEF1ZyAgNSAxMjozMzoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IE5NIHRvIG5tLW5ldywgbm90IG5tLm5ldywgdG8gbWF0Y2gKLQlyZWNlbnQgY2hhbmdlIGluIGJpbnV0aWxzIGJ1aWxkIGRpcmVjdG9yeS4KLQotVGh1IEp1bCAzMSAxNToyMTo1MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL3JhbmdlLnM6IE5ldyB0ZXN0LgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gaXQuCi0KLVR1ZSBKdWwgMjkgMTQ6MzU6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9oaWxvMi5zOiBOZXcgdGVzdC4KLQkqIGdhcy92ODUwL2ZlcHN3LnM6IE5ldyB0ZXN0LgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotVHVlIEp1bCAxNSAxMzowMzoxNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci91cHBlcmNhc2UuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvbTMyci5leHA6IE5ldyBmaWxlLgotCi1Nb24gSnVuIDE2IDE0OjMyOjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvcGNyZWwuZDogVXBkYXRlIGZvciBtNjhrIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL202OGsvb3BlcmFuZHMuZDogTGlrZXdpc2UuCi0KLU1vbiBKdW4gIDIgMTY6NTA6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9hcm0uZXhwOiBBZGRlZCBjaGFuZ2VzIGZyb20gYXJtVC05NzAzMjgtYnJhbmNoLgotCi1Nb24gSnVuICAyIDEyOjA5OjAyIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogVGhlIHIzOTAwIGhhcyBpbnRlcmxvY2tzIGZvciBtdWwsIGJ1dAotCW5vdCBkaXYuCi0KLU1vbiBKdW4gIDIgMTI6MDM6MzIgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQC5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9tdWwue2Qsc306IEVuZCB0aGUgdGVzdHMgd2l0aCBuby1vcHMuIAotCi1Nb24gSnVuICAyIDExOjQ4OjU4IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IEltcHJvdmUgbWVzc2FnZXMgd2hlbiBvbmUKLQlmaWxlIGlzIHNob3J0ZXIgdGhhbiB0aGUgb3RoZXIuCi0KLVdlZCBNYXkgIDcgMTY6MTg6MzAgMTk5NyAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBnYXMvbTg4ay9pbml0LntzLGR9OiBOZXcgY2hlY2tzIGZvciBwcm9wZXIgcGFkZGluZyBvZgotCS5pbml0IHNlY3Rpb25zLgotCSogZ2FzL204OGsvbTg4LmV4cDogUnVuIHRoZW0uCi0KLQkqIGdhcy9tNjhrL3QyLmQ6IE5ldyBmaWxlIGZvciBjaGVjayBvZiBwcmVzZW5jZSBvZiBzZWN0aW9uCi0Jc3ltYm9scyBvbiB0aGUgbTY4ay1tb3Rvcm9sYS1zeXN2LgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIHQyIGlmIFtpc3RhcmdldCBtNjgqLW1vdG9yb2xhLXN5c3ZdLgotCi1XZWQgTWF5ICA3IDE2OjEyOjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBEb24ndCBydW4gY29mZnRhZyB0ZXN0IGZvciBtODhrLWNvZmYuCi0KLQkqIGdhcy9taXBzL2xpZmxvYXQuczogVXBkYXRlIGZvciByZWNlbnQgY2hhbmdlcyB0byBmbG9hdGluZyBwb2ludAotCWhhbmRsaW5nLgotCSogZ2FzL21pcHMvbGlmLWVtcGljLmQsIGdhcy9taXBzL2xpZi1zdnI0cGljLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvbGlmLXhnb3QuZCwgZ2FzL21pcHMvbGlmbG9hdC5kOiBMaWtld2lzZS4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEhhbmRsZSBJcml4IDYgbGlrZSBJcml4IDUuCi0KLVNhdCBBcHIgMTkgMjM6MTY6MzUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BwZXRyYS5hcHBsaS5zZT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEhhbmRsZSBPcGVuQlNEIGxpa2UgTmV0QlNELgotCi1XZWQgQXByIDE2IDEyOjIwOjI0IDE5OTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9kMzAuZXhwOiBBZGQgb3B0aW1pemVyIHRlc3QgY2FzZS4KLQkqIGdhcy9kMzB2L29wdC5zOiBBZGQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdGVzdHMuCi0JKiBnYXMvZDMwdi9vcHQuZDogUmVidWlsZC4KLQotVHVlIEFwciAxNSAxODoxMDowMSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMve2RlbGF5LmQsbm9kZWxheS5kfTogYWRkZWQuCi0KLU1vbiBBcHIgIDcgMTI6NTc6NDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBVcGRhdGUgdG8gbmV3IG9iamR1bXAgb3V0cHV0IHN0eWxlLgotCi1GcmkgQXByICA0IDEzOjE5OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9mbG9hdC5zOiBQdXQgYSB0YWIgYmVmb3JlIC50ZXh0LCB0byBrZWVwIHRoZSBQQSBoYXBweS4KLQotCSogZ2FzL2FybS9hcm0uZXhwOiBPbmx5IHJ1biBpbnN0IGFuZCBhcm03dCBvbiB0YXJnZXRzIHdoaWNoIGNhbgotCWhhbmRsZSAtRUwuICBBZGQgc2V0dXBfeGZhaWwgZm9yIHRodW1iLgotCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZDogRG9uJ3QgZmFpbCBpZiBCRkQgaXMgNjQgYml0cy4KLQotVGh1IEFwciAgMyAxODoyNjo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLntleHAscy5kfTogTmV3IHRlc3RjYXNlcy4KLQotVGh1IE1hciAyNyAwMDo0MjoyOCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvZDMwLmV4cDogQWRkIHRlc3QgY2FzZSByZWxvYy4KLQkqIGdhcy9kMzB2L3JlbG9jLltzZF06IE5ldyBmaWxlcyB0byB0ZXN0IHJlbG9jYXRpb25zLgotCi1TYXQgTWFyIDE1IDE3OjIxOjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvYXJtL2FybTd0LmQ6IExpa2V3aXNlLgotCi1UdWUgTWFyIDExIDEzOjMxOjU2IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBnYXMvbTY4ay9vcDY4MDAwLmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGFzc2VtYmxlciBidWcgZml4LgotCi1XZWQgTWFyICA1IDEzOjAxOjI0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiB4ZmFpbCBhIGNvdXBsZSB0ZXN0cyBmb3IgdGhlIG1uMTAzMDAuCi0KLU1vbiBNYXIgIDMgMTE6NDE6MDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWRkLmQsIGZsb2F0LmQsIHJlZ29wczIuZCwgcmVsb2NzMS5kLCByZWxvY3MxYi5kLAotCXJlbG9jczIuZCwgcmVsb2NzMmIuZH06IEFkanVzdCB0byBvYmpkdW1wIGZvcm1hdCB0d2Vha3MuCi0KLVRodSBGZWIgMjcgMTU6MjE6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWxpZ24uZCwgYWxpZ24ubHN0LCBhbGlnbi5zfSBOZXcgdGVzdCBmb3IgdGhlCi0JIi5hbGlnbiIgcHNldWRvcC4KLQkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgYWxpZ24gdGVzdC4KLQkKLVdlZCBGZWIgMjYgMjA6MzY6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97ZmxvYXQuZCwgZmxvYXQubHN0LCBmbG9hdC5zfTogTmV3IHRlc3RzIGZvcgotCXNpbXBsZSBmbG9hdGluZyBwb2ludCBvcGVyYW5kcy4KLQkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgZmxvYXQgdGVzdC4KLQotV2VkIEZlYiAyNiAxNToxNjowNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3tyZWdvcHMyLmQsIHJlZ29wczIubHN0LCByZWdvcHMyLnMsIHJlZ29wczMuZCwKLSAJcmVnb3BzMy5sc3QsIHJlZ29wczMucywgcmVnb3BzNC5kLCByZWdvcHM0LmxzdCwgcmVnb3BzNC5zfToKLQlOZXcgdGVzdHMgZm9yIDptIGFuZCA6cyBvcGVyYW5kIG1vZGlmaWVycy4KLQkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgcmVnb3BzMiwgcmVnb3BzMywgYW5kIHJlZ29wczQgdGVzdHMuCi0KLVR1ZSBGZWIgMjUgMTM6NDU6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWFjcm9zL3NlbWkuczogRm9yY2UgdGhlIGZpbmFsIGFsaWdubWVudCB0byB1c2UgYSBmaWxsIHZhbHVlCi0Jb2YgMC4KLQotCSogZ2FzL2FsbC9jb25kLnMsIGdhcy9hbGwvY29uZC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9hbGwvZ2FzLmV4cDogUnVuIGl0LgotCi1Nb24gRmViIDI0IDEwOjUyOjEyIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwKGdhc19pbml0KTogQWRkZWQgbmV3IHBhcmFtZXRlciBmb3Igc2NyaXB0Ci0JbmFtZS4KLQotTW9uIEZlYiAyNCAxMDo0MDoyOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3thZGQuZCwgYml0bnVtLmQsIGNjb2RlLmQsIGNyZWdvcHMuZCwgZW5kbWFzay5kLAotCXJlZ29wcy5kLCByZWxvY3MxLmQsIAotCShyZWxvY3MxLmMpOiBBZGQgZmlsZSBmb3IgcmVmZXJlbmNlLgotCShyZWxvY3MxYi5kKTogU3BsaXQgcmVsb2MgdGFibGUgY29udGVudHMgdGVzdCB0byBkaWZmZXJlbnQgdGVzdCBmaWxlLgotCShyZWxvY3MyLmMpOiBBZGQgdGVzdCB0aGF0IHVzZXMgdmFyaW91cyB0eXBlcyAoY2hhciwgc2hvcnQsIGludCwgLi4uKSBvZgotCXN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyB3aXRoIGRhdGEgc2h1ZmZsaW5nIHRvIGdlbmVyYXRlIGxvdHMgb2YgbGQvc3QKLQlpbnN0cnVjdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMuCi0JKHJlbG9jczIuZCk6IE5ldyBmaWxlLCBleHBlY3RlZCBjb2RlIGZvciByZWxvY3MyIHRlc3QuCi0JKHJlbG9jczIubHN0KTogTmV3IGZpbGUsIFRJIGFzc2VtYmxlciBsaXN0aW5nIGZvciByZWZlcmVuY2UuCi0JKHJlbG9jczIucyk6IE5ldyBmaWxlLCBhc3NlbWJseSBzb3VyY2UgZm9yIHJlbG9jczIgdGVzdC4KLQkocmVsb2NzMmIuZCk6IE5ldyBmaWxlLCBleHBlY3RlZCByZWxvYyB0YWJsZSBjb250ZW50cyBmb3IgcmVsb2NzMiB0ZXN0LgotCSh0aWM4MC5leHApOiBSdW4gdGhlIHJlbG9jczFiLCByZWxvY3MyLCBhbmQgcmVsb2NzMmIgdGVzdHMuCi0KLVN1biBGZWIgMjMgMTc6NTQ6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2l0YmwtdGVzdC5jKG1haW4pOiBVcGRhdGUgZnVuY3Rpb24gY2FsbHMuCi0JUmVtb3ZlIHBhcmFtZXRlcnMgZnJvbSBpdGJsX2dldF9yZWdfdmFsIGFuZAotCWNoYW5nZSBpdGJsX2dldF9pbnNuX25hbWUgdG8gaXRibF9nZXRfZmllbGQuCi0KLVN1biBGZWIgMjMgMTc6MjI6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9pdGJsOiBBZGQgY29tbWVudHMuCi0JKiBnYXMvbWlwcy9pdGJsLnM6IEFkZCBjb21tZW50cy4gIFByZWZpeCByZWdpc3RlciBuYW1lcyB3aXRoICQuCi0JKiBnYXMvYWxsL2l0Ymw6IEdlbmVyaWMgdGFibGUgZm9yIHRlc3RpbmcgZm9yIGl0Ymwgc3VwcG9ydC4KLQkqIGdhcy9hbGwvaXRibC5zOiBHZW5lcmljIGFzc2VtYmx5IGZvciB0ZXN0aW5nIGZvciBpdGJsIHN1cHBvcnQuCi0JKiBnYXMvbWlwcy9pdGJsLXRlc3QuYzogTW92ZWQgdG8gZ2FzL2FsbC4KLQkqIGdhcy9hbGwvaXRibC10ZXN0LmM6IE1vdmVkIGZyb20gZ2FzL21pcHMuCi0KLVNhdCBGZWIgMjIgMjA6MjQ6MjMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWRkLmxzdCwgYml0bnVtLmxzdCwgY2NvZGUubHN0LCBjcmVnb3BzLmxzdCwKLSAJZW5kbWFzay5sc3QsIHJlZ29wcy5sc3R9OiBSZW1vdmUgXk0ncyBmcm9tIGVuZCBvZiBsaW5lcy4KLQkqIGdhcy90aWM4MC9iaXRudW0uczogQWRkIGNvbW1lbnQgdG8gZWFjaCBsaW5lIHNob3dpbmcgdmFsdWUKLQl0aGF0IHN5bWJvbGljIEJJVE5VTSBhc3NlbWJsZXMgdG8uICBBZGQgY292ZXJhZ2UgZm9yIHJhdwotCW51bWVyaWMgdmFsdWVzIGZvciB0aGUgQklUTlVNIG9wZXJhbmQuCi0JKiBnYXMvdGljODAvYml0bnVtLmQ6IFVwZGF0ZSBkdWUgdG8gYml0bnVtLnMgY2hhbmdlcy4KLQkqIGdhcy90aWM4MC9yZWdvcHMuZDogVXBkYXRlIGR1ZSB0byBvcGNvZGUgbGlicmFyeSBhZGRpdGlvbnMKLQlvZiBmbG9hdGluZyBwb2ludCB0ZXN0IEJJVE5VTSB2YWx1ZXMgdGhhdCBhcmUgYW1iaWd1b3VzIHdpdGgKLQl0aGUgaW50ZWdyYWwgb25lcy4KLQkqIGdhcy90aWM4MC9yZWxvY3MxLnM6IE5ldyB0ZXN0IGNhc2UgdGhhdCB0ZXN0cyBzaW1wbGUgcmVsb2NzLgotCSogZ2FzL3RpYzgwL3JlbG9jczEuZDogRXhwZWN0ZWQgb3V0cHV0IGZvciBhYm92ZS4KLQkqIGdhcy90aWM4MC9yZWxvY3MxLmxzdDogVEkgYXNzZW1ibGVyIGxpc3RpbmcgZm9yIGFib3ZlLgotCSogZ2FzL3RpYzgwL3RpYzgwLmV4cDogQWRkIHJlbG9jczEgdGVzdC4KLQotRnJpIEZlYiAyMSAxNDoyMzoxNCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYve2FsaWduLmQsIGFsaWduLnMsIGQzMC5leHAsIGd1YXJkLmQsIGd1YXJkLnMsCi0JaW5zdC5kLCBpbnN0LnMsIG9wdC5kLCBvcHQuc306IFRlc3QgZmlsZXMgZm9yIEQzMFYuCi0KLVdlZCBGZWIgMTkgMDA6NTU6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWFjcm9zL3NlbWkucywgZ2FzL21hY3Jvcy9zZW1pLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21hY3Jvcy9tYWNyb3MuZXhwOiBSdW4gaXQuCi0JKiBnYXMvbXJpL3NlbWkucywgZ2FzL21yaS9zZW1pLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0KLVR1ZSBGZWIgMTggMTM6Mzc6MDYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKGFsaWduNCB0ZXN0cyk6IFR3ZWFrIGV4cGVjdGVkCi0Jb3V0cHV0LgotCQotRnJpIEZlYiAxNCAxNzo1NjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvYWxpZ24uZCwgZ2FzL2FsbC9hbGlnbi5zOiBOZXcgdGVzdC4KLQkqIGdhcy9hbGwvZ2FzLmV4cDogUnVuIGl0LgotCi1UaHUgRmViIDEzIDE0OjQ0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IENvcnJlY3QgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi0KLVdlZCBGZWIgMTIgMTI6MzM6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9saWYtc3ZyNHBpYy5kOiBQYXNzIC1FQiB3aGVuIHJ1bm5pbmcgdGhlIGFzc2VtYmxlci4KLQkqIGdhcy9taXBzL2xpZi14Z290LmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdWxoLXN2cjRwaWMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91bGgteGdvdC5kOiBMaWtld2lzZS4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IFVwZGF0ZSBmb3IgeWV0IGFub3RoZXIgY2hhbmdlIGluIGRpc2Fzc2VtYmx5Ci0Jb3V0cHV0ICh0aGlzIG9uZSBpcyBzcGFjaW5nIG9ubHkpLgotCi1UdWUgRmViIDExIDE0OjQ1OjM5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FkZC5kLCBhZGQubHN0LCBhZGQucywgYml0bnVtLmQsIGJpdG51bS5sc3QsIGJpdG51bS5zLAotIAljY29kZS5kLCBjY29kZS5sc3QsIGNjb2RlLnMsIGNyZWdvcHMuZCwgY3JlZ29wcy5sc3QsIGNyZWdvcHMucywKLQllbmRtYXNrLmQsIGVuZG1hc2subHN0LCBlbmRtYXNrLnMsIHJlZ29wcy5kLCByZWdvcHMubHN0LCByZWdvcHMucywKLQl0aWM4MC5leHB9OiBOZXcgZmlsZXMgZm9yIFRJYzgwIHRlc3QgY2FzZXMuCi0KLVR1ZSBGZWIgMTEgMTU6NDY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzMTYuZDogVXBkYXRlIGZvciBjaGFuZ2UgaW4gZGlzYXNzZW1ibHkgb3V0cHV0LgotCi1Nb24gRmViIDEwIDIyOjI0OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGdhcy9taXBzL2l0YmwtdGVzdC5jOiBBZGQgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIGZpeCBpbmRlbnRhdGlvbi4gICAKLQotTW9uIEZlYiAxMCAxNzo1NDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2l0YmwtdGVzdC5jOiBOZXcgZmlsZS4gIFN0YW5kLWFsb25lIGFzc2VtYmxlciBhbmQgCi0JZGlzc2Fzc2VtYmxlciBmb3IgaXRibCBzdXBwb3J0LgotCi1Nb24gRmViIDEwIDE3OjIwOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvaXRibDogTmV3IGZpbGUuICBJbnN0cnVjdGlvbiBTcGVjIGZvciB0ZXN0aW5nIC0taXRibAotCW9wdGlvbi4KLQkqIGdhcy9taXBzL2l0YmwuczogTmV3IGZpbGUuICBBc3NlbWJseSB3aXRoIG5lMncgaW5zdHJ1Y3Rpb25zCi0Jc3BlY2lmaWVkIGluIGl0YmwuCi0KLUZyaSBGZWIgIDcgMTY6NDI6NTMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGdhc3AvZ2FzcC5leHA6IFVzZSBwcnVuZV93YXJuaW5ncyBpbnN0ZWFkIG9mIHBydW5lX3N5c3RlbV9jcnVkLgotCSogbGliL2dhcy1kZWZzLmV4cDogRGl0dG8uCi0KLU1vbiBGZWIgIDMgMTU6NDY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2luc3QuZCwgZ2FzL2FybS9hcm03dC5kOiBQYXNzIC0tcHJlZml4LWFkZHJlc3NlcyB0bwotCW9iamR1bXAuICBVcGRhdGUgZm9yIGN1cnJlbnQgcmVsb2NhdGlvbiBwcmludGluZyBzdHlsZS4KLQotVGh1IEphbiAzMCAxMTo1NzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMxNi5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi1UaHUgSmFuIDIzIDAzOjE1OjA2IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogc2V0IGlsb2NrcyBmb3IgYWxsIDQxMDAvNDMwMAotCi1UaHUgSmFuICAyIDE2OjQ5OjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LnMsIGdhcy9taXBzL21pcHMxNi5kOiBOZXcgdGVzdC4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gbWlwczE2IHRlc3QuCi0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gZGxpIHRlc3QgdW5jb25kaXRpb25hbGx5LgotCSogZ2FzL21pcHMvZGxpLnM6IEFkZCB0ZXh0IHN5bWJvbC4gIEFkZCBub3BzIHRvIHJvdW5kIHRvIDE2IGJ5dGUKLQlib3VuZGFyeS4KLQkqIGdhcy9taXBzL2RsaS5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBEZWMgMzEgMTM6MDM6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3ludGguZDogVXNlIC0tcHJlZml4LWFkZHJlc3NlcyBmb3Igb2JqZHVtcC4KLQkqIGdhcy9zcGFyYy9zeW50aDY0LmQ6IExpa2V3aXNlLgotCi1UdWUgRGVjIDI0IDE2OjMwOjU4IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy8qLWlsb2Nrcy5kOiBGaXggcmVnZXhwcyB0byByZXNlbWJsZSBkaXNhc3NlbWJsZWQgb3V0cHV0LgotCi1GcmkgRGVjIDEzIDEzOjA1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvKi5bc2RdOiBBZGQgZXhwbGljaXQgbm9wcywgc29tZXRpbWVzIGNvbnRyb2xsZWQgYnkKLQkuaWZkZWYsIHRvIGFjY29tb2RhdGUgY2hhbmdlIHRvIGF2b2lkIGRlZmF1bHQgYWxpZ25tZW50IG9uCi0JZW1iZWRkZWQgc3lzdGVtcy4KLQotV2VkIERlYyAxMSAwOToyNjowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMjAwL2Jhc2ljLmV4cCAoZG9fbW92Yik6IEZpeCBiaXQgcGF0dGVybiBmb3IKLQkibW92YiBkbSwoYW4pIi4KLQotVHVlIERlYyAxMCAxMzowMTowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVXBkYXRlIGFmdGVyIGVuZGlhbm5lc3MgY2hhbmdlcyB0bwotCXRoZSBhc3NlbWJsZXIuCi0KLQkqIGdhcy9tbjEwMjAwL3ttb3YxLnMsbW92Mi5zLG1vdjMucyxtb3Y0LnMsbW92eC5zfTogTmV3IHRlc3RzLgotCSogZ2FzL21uMTAyMDAve21vdmIucywgbW92YnUuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAyMDAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotTW9uIERlYyAgOSAxNzowODozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMjAwLyouczogTmV3IHRlc3RzIGZvciB0aGUgbW4xMDIwMCBhc3NlbWJsZXIuCi0JKiBnYXMvbW4xMDIwMC9iYXNpYy5leHA6IFJ1biB0aGVtLgotCi1GcmkgRGVjICA2IDE1OjM1OjA0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvKi5zOiBSZW1vdmUgJyQnIHJlZ2lzdGVyIHByZWZpeGluZy4KLQotTW9uIE5vdiAyNSAxNjozNTozMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwOiBGaXggcGF0dGVybnMsIHlvdSBjYW4ndCBhc3N1bWUKLQlcciB3aWxsIGJlIHByZXNlbnQuCi0KLU1vbiBOb3YgMjUgMTM6NDU6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay8qLmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvbXJpLyouZDogTGlrZXdpc2UuCi0KLU1vbiBOb3YgMjUgMTE6Mzg6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC8qLnM6IFVzZSAnJCcgYXMgcmVnaXN0ZXIgcHJlZml4IGZvcgotCWFsbCByZWdpc3RlciBvcGVyYW5kcy4KLQotVGh1IE5vdiAyMSAxMTo1Mjo1NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogeGZhaWwgYSBjb3VwbGUgdGVzdHMgZm9yIHRoZSBtbjEwMzAwLgotCi1XZWQgTm92IDIwIDExOjMxOjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvb3RoZXIuczogVXBkYXRlIGZvciBjb3JyZWN0IHN5bnRheCBvbiBhCi0JZmV3IGluc3RydWN0aW9ucyAodGhvc2Ugd2l0aCByZWdpc3RlciBsaXN0cykuCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIE5vdiAxOSAxMzozNjo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL21vdm0uczogVXBkYXRlIGZvciBjb3JyZWN0IHN5bnRheC4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVXBkYXRlIGV4cGVjdGVkIG1vdm0gYml0IHBhdHRlcm5zLgotCi1GcmkgTm92IDE1IDEzOjU3OjQyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvb3RoZXIuczogUHV0IHBhcmVucyBhcm91bmQgcmVnaXN0ZXIKLQlhcmd1bWVudCBpbiBjYWxscyBhbmQgam1wIGluc3RydWN0aW9ucy4KLQotV2VkIE5vdiAxMyAxMzoxNjowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9mZnh4MS5kOiBVcGRhdGUgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotTW9uIE5vdiAxMSAxNjowMzoyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUGFzcyAiLS1wcmVmaXgtYWRkcmVzc2VzIiB0byBvYmpkdW1wCi0JYXMgbmVlZGVkLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBMaWtld2lzZS4KLQotVGh1IE5vdiAgNyAwMDoyNzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgb3Bjb2RlIGluc2VydGlvbiBmb3IKLQlleHRlbmRlZCBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvbW4xMDMwMC9leHRlbmQuczogVHdlYWsgY29uc3RhbnRzIGZvciBiZXR0ZXIKLQl0ZXN0c3VpdGUgY292ZXJhZ2UuCi0KLVdlZCBOb3YgIDYgMTM6NTA6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFRlc3QgaW5zZXJ0aW9uIG9mIG9wZXJhbmRzCi0JaW50byBjYWxsIGFuZCBqbXAgaW5zdHJ1Y3Rpb25zIHdpdGggMzJiaXQgb2Zmc2V0cy4KLQlGaXggdHlwbyBpbiBiaXQgdGVzdCBwYXR0ZXJucy4KLQkqIGdhcy9tbjEwMzAwL290aGVyLnM6IFR3ZWFrIGNvbnN0YW50cyB0byBpbXByb3ZlCi0JdGVzdHN1aXRlIGNvdmVyYWdlLgotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFRlc3QgaW5zZXJ0aW9uIG9mIDMyYml0IG9wZXJhbmQKLQlpbiBjYWxscywgYnRzdCwgYmNsciAmIGJzZXQgaW5zdHJ1Y3Rpb25zLgotCi0JKiBnYXMvbW4xMDMwMC8qLnM6IFR3ZWFrIGNvbnN0YW50cyBpbiAzMmJpdCBpbnNucyBmb3IKLQliZXR0ZXIgdGVzdGluZyBjb3ZlcmFnZS4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVGVzdCBpbnNlcnRpb24gb2YgbW9zdCAzMmJpdAotCW9wZXJhbmRzLgotCi1UdWUgTm92ICA1IDEzOjMzOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIGluZGV4ZWQgbW92LAotCW1vdmJ1LCBtb3ZodSBpbnN0cnVjdGlvbnMuICBDaGVjayBiaXQgcGF0dGVybnMgZm9yIG1vcmUgYml0Ci0Jb3BlcmF0aW9ucy4gIENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgdmFyaW91cyAxNmJpdCBjYWxsLCByZXRmCi0JYW5kIHJldCBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvbW4xMDMwMC9vdGhlci5zOiBVcGRhdGUgb3BlcmFuZHMgZm9yIGJldHRlciB0ZXN0IGNvdmVyYWdlLgotCi1Nb24gTm92ICA0IDEyOjU1OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIGEgY291cGxlIG1vcmUKLQltb3YgYW5kIGNtcCBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBPY3QgMjkgMTc6MDU6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy8qLmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLVdlZCBPY3QgMTYgMjI6Mzk6NTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9yZWxvYy5zOiBOZXcgdGVzdHMuCi0JKiBnYXMvdjg1MC9iYXNpYy5leHA6IFJ1biB0aGVtLgotCi1Nb24gT2N0IDE0IDEzOjUyOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHM6IEFkZCBzeW1ib2xzIHRvIHNldmVyYWwgdGVzdHN1aXRlcywgc2luY2UgdGhlIEVMRgotCWFzc2VtYmxlciBub3cgYWx3YXlzIGJ1aWxkcyBhIHN5bWJvbCB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdAotCW9iamR1bXAgd2lsbCBubyBsb25nZXIgcmVwb3J0IGBObyBzeW1ib2xzIGluIEZJTEUnLiAgQ2hhbmdlIHRoZQotCWV4cGVjdGVkIG91dHB1dCBhY2NvcmRpbmdseS4KLQotVGh1IE9jdCAxMCAxMzoxMTo0OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBpbnN0cnVjdGlvbnMKLQl3aXRoIGEgc2luZ2xlIDhiaXQgb3IgMTZiaXQgaW1tZWRpYXRlIG9wZXJhbmQuCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBtYW55Ci0JaW5zdHJ1Y3Rpb25zLiAgQWRkIG1pc3NpbmcgdGVzdCBpbiBkb19tb3YxLgotCSogZ2FzL21uMTAzMDAvbW92MS5zOiBBZGQgbWlzc2luZyB0ZXN0LgotCi1XZWQgT2N0ICA5IDE0OjE1OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAve2FkZC5zLCBiY2MucywgYml0LnMsIGNtcC5zLCBleHQuc306IE5ldyB0ZXN0cy4KLQkqIGdhcy9tbjEwMzAwL3tleHRlbmQucyBsb2dpY2FsLnMsIGxvb3AucywgbW92MS5zfTogTGlrZXdpc2UuCi0JKiBnYXMvbW4xMDMwMC97bW92Mi5zLCBtb3YzLnMsIG1vdjQucywgbW92YnUuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAve21vdmh1LnMsIG1vdm0ucywgbXVsZGl2LnMsIG90aGVyLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL3tzaGlmdC5zLCBzdWIuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotVGh1IE9jdCAgMyAwOTo1NzowMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMjAwLCBnYXMvbW4xMDMwMDogTmV3IGRpcmVjdG9yaWVzIGZvciBNYXRzdXNoaXRhCi0JbW4xMDIwMCBhbmQgbW4xMDMwMCB0ZXN0cy4KLQotVHVlIE9jdCAgMSAxNTozODoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc192ZXJzaW9uKTogRml4IGZvciBjdXJyZW50IHZlcnNpb24KLQlwcmludGluZy4KLQotU3VuIFNlcCAyOSAwNzo1NTo1OCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BsZXQuZDogRml4IHR5cG8gaW4gY3B1c2hhIHJlc3VsdC4KLQotTW9uIFNlcCAyMyAxMjozMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2Ztb3ZlbWwucywgZ2FzL202OGsvZm1vdmVtbC5kOiBBZGQgdGVzdHMgZm9yIGZtb3ZlbXguCi0KLVdlZCBTZXAgMTggMTI6MTQ6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2NvZmZ0YWcuczogVXNlIC5wMmFsaWduIHJhdGhlciB0aGFuIC5hbGlnbi4KLQotRnJpIFNlcCAxMyAxNToyODowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9tYWNzLnM6IEFkZCAic3RtYWMiIGluc3RydWN0aW9ucy4KLQkqIGdhcy9oODMwMC9iYXNpYy5leHA6IFRlc3QgdGhlbS4KLQotVGh1IFNlcCAxMiAxMDoyODo0NCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vdGh1bWIucyAoYmFjayk6IENoZWNrIGFzc2VtYmx5IG9mIFRodW1iIEJMLgotCi1Nb24gU2VwICA5IDE0OjM3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczQucywgZ2FzL21pcHMvbWlwczQuZDogVXNlICRmY2NOIGZvciBjb25kaXRpb24gY29kZQotCXJlZ2lzdGVycy4KLQotRnJpIFNlcCAgNiAxODoyMzo1NCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9taXBzL2RsaS57cyxkfTogTW9yZSB0ZXN0IGNhc2VzIGFkZGVkLgotCi1XZWQgU2VwICA0IDExOjQ3OjI5IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZCBjaGVjayBmb3IgZGxpIG1hY3JvIGluc3RydWN0aW9uLgotCSogZ2FzL21pcHMvZGxpLntzLGR9OiBBZGRlZC4KLQotU2F0IEF1ZyAzMSAwMToyNTowMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWVtKTogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBzaG9ydAotCWxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLiAgUmVtb3ZlIHhmYWlscyBmb3Igc2hvcnQgbG9hZC9zdG9yZQotCWluc3RydWN0aW9ucy4KLQkqIGdhcy92ODUwL21lbS5zOiBPZmZzZXRzIGZvciBzaG9ydCBsb2FkL3N0b3JlIG9wZXJhbmRzCi0JYXJlIHVuc2lnbmVkLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2JyYW5jaCk6IENoZWNrIG9mZnNldHMgaW4gYnJhbmNoIGluc25zLgotCShkb19qdW1wcyk6IExpa2V3aXNlLgotCQotRnJpIEF1ZyAzMCAwMDozNzo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL21pc2MuczogVHdlYWsgcmVnaXN0ZXIgbnVtYmVycyBmb3IgYmV0dGVyIHRlc3RpbmcuCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21pc2MpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLQkqIGdhcy92ODUwL2hpbG8uczogTmV3IHRlc3RmaWxlLgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gaGlsbyB0ZXN0cy4KLQotVGh1IEF1ZyAyOSAxMTozMjoyMyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZDogRXhwbGljaXRseSBmb3JjZSBsaXR0bGUtZW5kaWFuIGFzc2VtYmx5LgotCi1GcmkgQXVnIDIzIDExOjAyOjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19tb3ZlKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0JKiBnYXMvdjg1MC9tb3ZlLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWVtKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0JeGZhaWwgc3N0IGFuZCBzbGQgdGVzdHMuCi0JKGRvX21vdik6IFJlbW92ZSBib2d1cyB4ZmFpbC4KLQkqIGdhcy92ODUwL21lbS5zOiBzc3QgYW5kIHNsZCBpbnN0cnVjdGlvbnMgY2FuIG9ubHkgaW5kZXggZnJvbQotCSJlcCIgcmVnaXN0ZXIuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbG9naWNhbCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCVVwZGF0ZSBhZGRyZXNzZXMuCi0JKiBnYXMvdjg1MC9sb2dpY2FsLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fanVtcCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLAotCWJ1dCBub3QgZGlzcGxhY2VtZW50cyAoeWV0KS4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19jb21wYXJlKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fYnJhbmNoKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMsCi0JYnV0IG5vdCBkaXNwbGFjZW1lbnRzICh5ZXQpLgotCQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19iaXQpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19hcml0aCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgkKLQkqIGdhcy92ODUwL2FyaXRoLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWlzYyk6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMKLQlhc3NlbWJsaW5nICJsZHNyIiBhbmQgInN0c3IiIG9wY29kZXMuCi0JKiBnYXMvdjg1MC9taXNjLnM6IFJlLWVuYWJsZSBhc3NlbWJsaW5nIG9mICJsZHNyIiBhbmQgInN0c3IiCi0Jb3Bjb2Rlcy4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19taXNjKTogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlcwotCWFzc2VtYmxpbmcgInRyYXAiIG9wY29kZXMuCi0JKiBnYXMvdjg1MC9taXNjLnM6IFJlLWVuYWJsZSBhc3NlbWJsaW5nIG9mICJ0cmFwIiBvcGNvZGVzLgotCi0JKiBnYXMvdjg1MDogTmV3IGRpcmVjdG9yeSB3aXRoIHY4NTAgdGVzdHMuCi0KLUZyaSBBdWcgMTYgMDA6MTk6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9iYXNpYy9wdXJnZS5zOiBVc2UgIiVzcjQiIG9uIHBpdGxiLCBwaXRsYmUKLQlmaWMgYW5kIGZpY2UgaW5zdHJ1Y3Rpb25zIHRvIHRlc3QgM2JpdCBzcGFjZSBpZGVudGlmaWVycy4KLQkqIGdhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zOiBTaW1pbGFybHkgZm9yIGlpdGxiYSBhbmQKLQlpaXRsYnAuCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVGh1IEF1ZyAxNSAxNjoyNTowNSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vYXJtLmV4cDogQ2hhbmdlIGluc3QucyB0ZXN0IHRvIGNoZWNrIG9iamR1bXAuCi0JKiBnYXMvYXJtL2luc3QuZDogQWRkZWQuCi0JCi1UaHUgQXVnIDE1IDE2OjA2OjAyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL2FybS90aHVtYi5zOiBBZGRlZC4KLQkqIGdhcy9hcm0vaW1tZWQuczogQWRkZWQuCi0JKiBnYXMvYXJtL2FyY2g0dC5zOiBBZGRlZC4KLQkqIGdhcy9hcm0vYXJtLmV4cDogVXBkYXRlZCB0byBydW4gdGhlIG5ldyB0ZXN0cy4KLQotVHVlIEF1ZyAgNiAxMTowNjoyOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9taXNjaC5zOiBSZWVuYWJsZSAiZWVwbW92LnciIHRlc3QuCi0JKiBnYXMvaDgzMDAvbWlzY3MuczogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBDaGVjayBmb3IgY29ycmVjdCBhc3NlbWJseSBvZiAiZWVwbW92LnciCi0Jb24gdGhlIEg4LzMwMEggYW5kIEg4L1MuICBEb24ndCBleHBlY3QgaXQgdG8gZmFpbC4KLQotV2VkIEp1bCAzMSAxMDo1Nzo0NCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvYXNpLnM6IFVwZGF0ZSBBU0lfQVNfSUZfVVNFUl97UFJJTUFSWSxTRUNPTkRBUll9X0xJVFRMRS4KLQotV2VkIEp1bCAzMSAxNTo1NToxMiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuczogQWRkZWQuCi0JKiBnYXMvYXJtL2FybTd0LmQ6IEFkZGVkLgotCSogZ2FzL2FybS9hcm0uZXhwOiBVcGRhdGVkIHRvIHJ1biB0aGUgbmV3IHRlc3QuCi0KLU1vbiBKdWwgIDggMTQ6Mjc6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9wY3JlbC5kOiBSZW5hbWUgZnJvbSBzY2h3YWIuZC4KLQkqIGdhcy9tNjhrL3BjcmVsLnM6IFJlbmFtZSBmcm9tIHNjaHdhYi5zLgotCi1Nb24gSnVsICA4IDE0OjIzOjI2IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBnYXMvbTY4ay9zY2h3YWIuZDogQ29ycmVjdCBmb3IgRUxGIGZvcm1hdC4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biAic2Nod2FiIiB0ZXN0IGZvciBhbGwgdGFyZ2V0cy4KLQotVGh1IEp1bCAgNCAxNDoyMzozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBdm9pZCBET1MgZmlsZSBuYW1pbmcgcHJvYmxlbXM6Ci0JKiBnYXMvaDgzMDAvYnJhbmNoLnM6IFJlbmFtZSBmcm9tIGJyYW5jaGVzLnMuCi0JKiBnYXMvaDgzMDAvYnJhbmNoaC5zOiBSZW5hbWUgZnJvbSBicmFuY2hlc2gucy4KLQkqIGdhcy9oODMwMC9icmFuY2hzLnM6IFJlbmFtZSBmcm9tIGJyYW5jaGVzcy5zLgotCSogZ2FzL2g4MzAwL3JvdHNoLnM6IFJlbmFtZSBmcm9tIHJvdHNoaWZ0LnMuCi0JKiBnYXMvaDgzMDAvcm90c2hoLnM6IFJlbmFtZSBmcm9tIHJvdHNoaWZ0aC5zLgotCSogZ2FzL2g4MzAwL3JvdHNocy5zOiBSZW5hbWUgZnJvbSByb3RzaGlmdHMucy4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVGh1IEp1bCAgNCAxNDowMTo0NiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGQgbmV3IHRlc3RzIGZvciBwcm9jZXNzb3JzIHdpdGggaW50ZXJsb2NrcwotIAlvbiBkaXYgYW5kIG11bC4KLQkqIGdhcy9taXBzL2Rpdi1pbG9ja3MuZDogQWRkZWQuCi0JKiBnYXMvbWlwcy9tdWwtaWxvY2tzLmQ6IEFkZGVkLgotCQotV2VkIEp1bCAgMyAxNDoyMDowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogUmVtb3ZlIHNldHVwX3hmYWlsIGZvciBoODMwMCotKi0qIGZvciB0d28gdGVzdHMKLQl3aGljaCBub3cgcGFzcy4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IEZpeCByZWdleHAgb2YgbW92MzJidWcgdGVzdCB0byB3b3JrIG9uIGEgNjQKLQliaXQgaG9zdC4KLQotU2F0IEp1biAyOSAxODoyMTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciB2YXgqLSotdm1zKiBmb3IgOTMwNTA5YQotCXRlc3QuCi0JKiBnYXMvdmF4L3F1YWQuZXhwOiBFeHBlY3QgYSBub3AgYWZ0ZXIgdGhlIG1vdnEuCi0KLVR1ZSBKdW4gMTggMTI6Mzk6NDkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9oODMwMC9jYnJhbmNoaC5zOiBTd2l0Y2ggaW50byBoODMwMGggbW9kZS4KLQkqIGdhcy9oODMwMC9oODMwMC5leHAgKEg4LzMwMEggbWlzYyB0ZXN0cyk6IEZpeCB0ZXN0IG5hbWVzLgotCi0JKiBnYXMvaDgzMDAve2FkZHN1YnMucyxiaXRvcHMxcy5zLGJpdG9wczJzLnN9OiBOZXcgdGVzdHMgZm9yIHRoZQotCUg4L1MuCi0JKiBnYXMvaDgzMDAve2JpdG9wczMucyxiaXRvcHM0LnMsY2JyYW5jaHMucyxsb2dpY2Fscy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAve2JyYW5jaGVzcy5zLGNvbXBhcmVzLnMsbWFjcy5zLGRlY2ltYWxzLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9oODMwMC97aW5jZGVjcy5zLGRpdm11bHMucyxtaXNjcy5zLG11bHRpcGxlcy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAve21vdmJzLnMsbW92d3Mucyxtb3Zscy5zLHB1c2hwb3BzLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9oODMwMC97cm90c2hpZnRzLnMsZXh0ZW5kcy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBSdW4gdGhlbS4KLQotTW9uIEp1biAxMCAxNDoxNDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvY29mZnRhZy5zLCBnYXMvYWxsL2NvZmZ0YWcuZDogTmV3IHRlc3QgZm9yIENPRkYgZW51bSB0YWcKLQl3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBnbG9iYWwgdmFyaWFibGUuCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBjb2ZmdGFnIHRlc3QgZm9yIGFueSBDT0ZGIHRhcmdldC4KLQotVGh1IEp1biAgNiAxMjozMDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFBhc3MgLW02ODAyMCB3aGVuIGFzc2VtYmxpbmcgdGhlIGRpc3BlcnIucwotCXRlc3QuCi0KLUZyaSBNYXkgMzEgMTA6MTE6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBGaXggYWRkLmwgdGVzdCBmb3IgSDgvMzAwSC4KLQotV2VkIE1heSAyOSAxNjozNTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2phbC14Z290LmQ6IENvcnJlY3QgZm9yIDY0IGJpdCBvdXRwdXQuCi0KLVRodSBBcHIgMjUgMTk6MzE6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogT25seSBydW4gc3BhcmNsZXQgdGVzdHMgaWYgc3BhcmNsZXQuCi0KLVdlZCBBcHIgMjQgMTc6MDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9vcDY4MDAwLmQ6IEFkZCBzdGF0ZW1lbnRzIG5vdyBjYXVnaHQgYnkgZ2FzLgotCi1Nb24gQXByIDIyIDE2OjQ1OjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGxldC5bZHNdOiBOZXcgdGVzdHMgZm9yIHNwYXJjbGV0IGV4dGVuc2lvbnMuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gdGhlbS4KLQotTW9uIEFwciAxNSAxNzoyNToxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xhLmQ6IFVwZGF0ZWQgZm9yIEFwcmlsIDUgTUlQUyBhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9taXBzL2xiLmQsIGdhcy9taXBzL2xkLmQsIGdhcy9taXBzL3NiLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdWxkLmQsIGdhcy9taXBzL3VsaC5kLCBnYXMvbWlwcy91bHcuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91c2QuZCwgZ2FzL21pcHMvdXNoLmQsIGdhcy9taXBzL3Vzdy5kOiBMaWtld2lzZS4KLQotV2VkIEFwciAxMCAxNDoyNzo1MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9tb3YzMmJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biBpdC4KLQotRnJpIEFwciAgNSAxMDoxMzoyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC97YWRkc3ViaC5zLGJpdG9wczFoLnMsYml0b3BzMmguc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve2JpdG9wczNoLnMsYml0b3BzNGgucyxicmFuY2hlc2guc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve2NicmFuY2hoLnMsY29tcGFyZWgucyxkZWNpbWFsaC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97ZGl2bXVsaC5zLGluY2RlY2gucyxsb2dpY2FsaC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97bWlzY2gucyxtb3ZiaC5zLG1vdndoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL3twdXNocG9waC5zLHJvdHNoaWZ0aC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biB0aGVtLgotCi0JKiBnYXMvaDgzMDAve21vdmIucyxtb3Z3LnN9OiBDb3JyZWN0IHByZWRlY3JlbWVudCBzeW50YXguCi0KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IEZpeCB0eXBvcyBpbiBiaXRvcHM0IGFuZCBtb3ZiIHRlc3RzLgotCi0JKiBnYXMvaDgzMDAve2FkZHN1Yi5zLGJpdG9wczEucyxiaXRvcHMyLnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve2JpdG9wczMucyxiaXRvcHM0LnMsYnJhbmNoZXMuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97Y2JyYW5jaC5zLGNvbXBhcmUucyxkZWNpbWFsLnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve2Rpdm11bC5zLGluY2RlYy5zLGxvZ2ljYWwuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97bWlzYy5zLG1vdmIucyxtb3Z3LnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve3B1c2hwb3Aucyxyb3RzaGlmdC5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogUnVuIHRoZW0uCi0KLUZyaSBNYXIgMTUgMTc6MTY6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3ludGguZDogRG9uJ3QgcmVxdWlyZSBzcGFyYyBpbiB0aGUgZmlsZSBmb3JtYXQsIHNpbmNlCi0JaXQgd29uJ3QgYmUgdGhlcmUgb24gU3VuT1MuCi0KLVRodSBNYXIgIDcgMTQ6NTE6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zeW50aC5bZHNdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gaXQuCi0KLUZyaSBNYXIgIDEgMTI6MDE6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IHhmYWlsIGRpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZCBzeW1ib2xzCi0JYW5kIGRpZmZlcmVuY2Ugb2YgZm9yd2FyZCByZWZlcmVuY2VzIGZvciB0aGUgaDgzMDAuCi0KLVRodSBGZWIgMjIgMTY6NDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sYi14Z290LmQ6IENvcnJlY3QuCi0KLU1vbiBGZWIgMTkgMDI6NDM6MzYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy97YXNpLG1lbWJhcixwcmVmZXRjaCxyZHByLHN5bnRoNjQsd3Jwcn0uZDogUGFzcyAtQXY5Ci0JdG8gZ2FzLgotCSogZ2FzL3NwYXJjL2FkZGVuZC5leHA6IEV4ZWN1dGUgZm9yIGFueSBzcGFyYyBjcHUuCi0JKiBnYXMvc3BhcmMve21pc21hdGNoLmV4cCxtaXNtLTEuc306IE5ldyB0ZXN0LgotCi1XZWQgRmViIDE0IDEzOjQ5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvamFsLXhnb3QuZCwgZ2FzL21pcHMvbGEteGdvdC5kOiBOZXcgdGVzdHMuCi0JKiBnYXMvbWlwcy9sYi14Z290LmQsIGdhcy9taXBzL2xkLXhnb3QuZDogTmV3IHRlc3RzLgotCSogZ2FzL21pcHMvbGlmLXhnb3QuZCwgZ2FzL21pcHMvdWxoLXhnb3QuZDogTmV3IHRlc3RzLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBuZXcgdGVzdHMgaWYgc3ZyNHBpYy4KLQotU2F0IEphbiAyNyAxMzoyNzo0NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZy5leHAgKGdhcy1kZy10ZXN0KTogRGVsZXRlIGRlZmF1bHRfZmxhZ3MgYW5kIGxpYnMgYXJncy4KLQotRnJpIEphbiAyNiAxNDoyNDowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogVXBkYXRlIGZvciBvYmpkdW1wIGNoYW5nZXMuCi0KLVdlZCBKYW4gMTAgMTI6NDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy8qLmQ6IFVwZGF0ZSBmb3IgY2hhbmdlcyB0byBkaXNhc3NlbWJsZXIuCi0KLVdlZCBKYW4gIDMgMjI6NTk6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy91bGgtc3ZyNHBpYy5kOiBVcGRhdGUgZm9yIHRjLW1pcHMuYyBsb2FkX2FkZHJlc3MKLSAJY2hhbmdlLgotCi1GcmkgTm92IDE3IDEwOjMyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9pbW1jb25zdC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgotCSogZ2FzL21yaS9jb25zdGFudHMuczogVGVzdCBpbW1lZGlhdGUgY29uc3RhbnRzLgotCSogZ2FzL21yaS9jb25zdGFudHMuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGdhcy9tNjhrL2xpbmsuczogQWRkIG5vcCB0byBwYWQgdG8gZWlnaHQgYnl0ZSBib3VuZGFyeS4KLQkqIGdhcy9tNjhrL2xpbmsuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVN1biBOb3YgMTIgMjE6Mjg6MTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1TdW4gTm92ICA1IDEyOjQ5OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvYmVxLnM6IERlY2xhcmUgdGV4dF9sYWJlbCBnbG9iYWwuCi0JKiBnYXMvbWlwcy9qYWwuczogTGlrZXdpc2UuCi0KLUZyaSBOb3YgIDMgMTI6MzU6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9saW5rLnM6IFVzZSAiJiIgaW5zdGVhZCBvZiAiIyIgZm9yIGltbWVkaWF0ZSB2YWx1ZXMuCi0KLQkqIGdhcy9tNjhrL2Ztb3ZlbWwucywgZ2FzL202OGsvZm1vdmVtbC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KLQotVGh1IE5vdiAgMiAyMzoxMTowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2xpbmsucywgZ2FzL202OGsvbGluay5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KLQotVHVlIE9jdCAyNCAxMDo1NzoyMCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogVGVzdCBsY2kgYW5kIHN5bmNkbWEgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotRnJpIE9jdCAgNiAxNzoxMzozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvb3BlcmFuZHMuZDogRG9uJ3QgcmVxdWlyZSBhIGZpeGVkIG51bWJlciBvZiBsZWFkaW5nCi0JemVyb3MgaW4gYW55IG51bWJlci4KLQotCSogZ2FzL202OGsvb3BlcmFuZHMucywgZ2FzL202OGsvYml0ZmllbGQuczogVXNlICImIiBpbnN0ZWFkIG9mICIjIgotCWZvciBpbW1lZGlhdGUgdmFsdWVzLgotCi1GcmkgT2N0ICA2IDEwOjU0OjEzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtLmV4cDogUmVuYW1lZCBmcm9tIGdhcy5leHAuCi0JKiBnYXMvYXJtL2xlLWZwY29uc3QuW3NkXTogTmV3IHRlc3RjYXNlLgotCi1GcmkgU2VwIDI5IDE1OjEyOjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBPbmx5IHJ1biB0ZXN0cyBmb3IgbTY4ayB0YXJnZXQuCi0KLU1vbiBTZXAgMjUgMTI6MzE6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgYXJtKi0qLSogZm9yIGNvbnN0YW50cwotCXRlc3QuCi0KLVRodSBTZXAgMjEgMDE6MjY6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9zaC9mcC5zIChmbWFjKTogVXBkYXRlIGZvciBuZXcgYXNzZW1ibHkgc3ludGF4LgotCi1Nb24gU2VwIDE4IDE0OjA0OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX3J1bik6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQuCi0JKHJ1bl9kdW1wX3Rlc3QsIG9iamR1bXApOiBMaWtld2lzZS4KLQotVGh1IFNlcCAxNCAxMzoxMDoxMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMve3dyZHIuW2RzXSxyZHByLltkc119OiBOZXcgdGVzdHMuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gdGhlbS4KLQotV2VkIFNlcCAxMyAxNjozNTo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFJlbW92ZTsgdGhlIHRlc3RzdWl0ZSBpcyBub3cgcnVuCi0JZGlyZWN0bHkgZnJvbSB0aGUgZ2FzIE1ha2VmaWxlLgotCi1Nb24gU2VwIDExIDExOjQ0OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9lbXB0eS5zOiBOZXcgZmlsZS4KLQkqIGdhcy9tcmkvbXJpLmV4cDogVGVzdCBhc3NlbWJsaW5nIGVtcHR5LnMuCi0JKiBnYXMvbXJpL2NvbW1lbnQuczogQWRkIGEgY291cGxlIG1vcmUgY29tbWVudCB2YXJpYW50cy4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgeGZhaWwgZm9yIHRoZSBleHByIHRlc3QgZm9yIGFsbCBocHBhCi0JdGFyZ2V0cy4KLQotV2VkIFNlcCAgNiAyMTozOToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvY29tbWVudC5zLCBnYXMvbXJpL2NvbW1lbnQuZDogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KLQkqIGdhcy9tcmkvZXhwci5zOiBSZW1vdmUgd2hpdGVzcGFjZSBpbiBvcGVyYW5kIGZpZWxkLgotCSogZ2FzL21yaS9mb3IuczogQWRkIGNvbW1lbnRzIGZvciBmdXJ0aGVyIHRlc3RpbmcuCi0JKiBnYXMvbWFjcm9zL3Rlc3QyLnM6IFB1dCBpbiBhbiB1cHBlciBjYXNlIEVMU0UgdG8gdGVzdCBjYXNlCi0JaW5zZW5zaXRpdml0eS4KLQotV2VkIEF1ZyAzMCAxNjoxMjowMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMve3ByZWZldGNoLltkc10sc3ludGg2NC5bZHNdfTogTmV3IHRlc3RzLgotCi1UdWUgQXVnIDI5IDE4OjU5OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IE5ldyBmaWxlLgotCSogZ2FzL3NwYXJjL3thc2kuW2RzXSxtZW1iYXIuW2RzXX06IE5ldyB0ZXN0cy4KLQotTW9uIEF1ZyAyMSAxNDozOToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tYWNyb3MvKjogTmV3IHRlc3RzIGZvciBtYWNyb3MuCi0KLQkqIGdhcy9tcmkvY29tbW9uLnM6IFVzZSBkYXRhLCBub3QgLmRhdGEuCi0KLQkqIGdhc3AvcGwzLm91dDogVXBkYXRlIGZvciBjaGFuZ2VzIGluIGNvbW1lbnRlZCBzb3VyY2Ugb3V0cHV0IHdoZW4KLQlMT0NBTCBpcyB1c2VkLgotCi1TYXQgQXVnIDE5IDE3OjM2OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC9nYXNwLmV4cCAoZ2FzcF90ZXN0KTogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiB0aGUgb3V0cHV0Ci0Jb2YgZGlmZi4KLQkqIGxpYi9nYXMtZGVmcy5leHA6IERlZmluZSBwcnVuZV9zeXN0ZW1fY3J1ZCBpZiBpdCBpcyBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0KLUZyaSBBdWcgMTggMTE6MDk6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwL21yaS8qLm91dDogVXNlIDssIG5vdCAhLCBmb3IgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1XZWQgQXVnIDE2IDEyOjI0OjEyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBDaGFuZ2UgaHBwYSotKi0qIGV4cGVjdGVkIGZhaWx1cmVzIHRvIG9ubHkKLQlleHBlY3QgZmFpbHVyZSBmb3IgdGFyZ2V0cyB3aGljaCB1c2UgU09NLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogSWYgdGhlIHByb2dyYW0gdG8gcnVuIGRvZXMgbm90Ci0gICAgICAgIGV4aXN0LCBtYXJrIHRoZSB0ZXN0IGFzIHVudGVzdGVkLgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgaTk2MCBiLm91dCB0YXJnZXRzIGZvcgotCWNvbW1vbiB0ZXN0LgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogTmFtZSB0aGUgb3V0cHV0IGZpbGUgZHVtcC5vLAotCXJhdGhlciB0aGFuIHVzaW5nIGFuIGltcGxpY2l0IGEub3V0LgotCi0JKiBnYXMvbXJpL2Zvci5zOiBBZGQgbm9wIHRvIHJvdW5kIG91dCB0byBmb3VyIGJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbXJpL3JlcGVhdC5zOiBMaWtld2lzZS4KLQkqIGdhcy9tcmkvd2hpbGUuczogTGlrZXdpc2UuCi0JKiBnYXMvbXJpL2Zvci5kOiBFeHBlY3RlZCBhZGRlZCBub3AuCi0JKiBnYXMvbXJpL3JlcGVhdC5kOiBMaWtld2lzZS4KLQkqIGdhcy9tcmkvd2hpbGUuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9taXBzLyouZDogQ2hhbmdlIGFsbCB0ZXN0IG5hbWVzIHRvIHNheSBNSVBTLgotCi1UdWUgQXVnIDE1IDE1OjQyOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9mb3IuZCwgZ2FzL21yaS9mb3IuczogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL2lmLmQsIGdhcy9tcmkvaWYuczogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL3JlcGVhdC5kLCBnYXMvbXJpL3JlcGVhdC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvd2hpbGUuZCwgZ2FzL21yaS93aGlsZS5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIHRoZSBuZXcgdGVzdHMuCi0KLU1vbiBBdWcgMTQgMTY6MDM6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2V4cHIuZDogUGVybWl0IGxlYWRpbmcgemVyb2VzLCBpbiBjYXNlIHdlJ3JlIHVzaW5nIGEKLSAgICAgICAgNjQtYml0IEJGRC4KLQotCSogZ2FzcC9tcmkvKjogTmV3IHRlc3RzLgotCSogZ2FzcC9nYXNwLmV4cDogUnVuIHRoZW0uICBBbHNvLCBjbGVhbiB1cCB0aGUgdGVzdCBuYW1lcyB1c2VkIGluCi0JcGFzcyBhbmQgZmFpbC4KLQotU3VuIEF1ZyAxMyAwMDozOToyNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL3NoL2Jhc2ljLmV4cDogVXBkYXRlIG5vdyB0aGF0IHdlIGtub3cgdGhlIHJpZ2h0Ci0JYml0IHBhdHRlcnMgZm9yIHRoZSBuZXcgc3RzIGluc3RydWN0aW9ucy4KLQotVGh1IEF1ZyAxMCAwMDo0NjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvY2hhci5kOiBGaXggZm9yIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMuCi0JKiBnYXMvbXJpL2Zsb2F0LmQ6IExpa2V3aXNlLgotCi1XZWQgQXVnICA5IDE1OjM0OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9zdHJ1Y3QucywgZ2FzL2FsbC9zdHJ1Y3QuZDogTmV3IHRlc3QuCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBpdC4KLQotVHVlIEF1ZyAgOCAxNzoxMTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvY29tbW9uLnMsIGdhcy9tcmkvY29tbW9uLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0KLU1vbiBBdWcgIDcgMjI6Mzk6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgYTI5ayotKi0qIGZvciBjb25zdGFudHMKLQl0ZXN0LgotCi0JKiBnYXNwL2NyYXNoMS5vdXQsIGdhc3AvbWFjcm8ub3V0LCBnYXNwL3NmdW5jLm91dDogQ29tcGxldGUKLQl0cnVuY2F0ZWQgZmlsZXMsIHNvIHRoYXQgdGhlIHRlc3RzIHBhc3MuCi0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBocHBhKi0qLSogZm9yIGVxdSwKLQljb25zdGFudHMsIGFuZCBleHByLgotCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gc2Nod2FiIHRlc3Qgb24gaHB1eCosIG5vdCBqdXN0IGhwdXguICBSdW4KLQlvbiB2eHdvcmtzKiwgbm90IGp1c3Qgdnh3b3JrczUuMS4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZmFpbF9waGFzZSwgcGFzc19waGFzZSk6IFJlbW92ZS4KLQkocnVuX2R1bXBfdGVzdCk6IEp1c3QgY2FsbCBwYXNzIG9yIGZhaWwuCi0KLQkqIGdhcy9tNjhrL29wZXJhbmRzLnMsIGdhcy9tNjhrL29wZXJhbmRzLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvb3A2ODAwMC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2Nhcy5zLCBnYXMvbTY4ay9jYXMuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9iaXRmaWVsZC5zLCBnYXMvbTY4ay9iaXRmaWVsZC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL3NjaHdhYi5kOiBSdW4gb2JqZHVtcCB3aXRoIC1qIC50ZXh0LiAgQWRqdXN0IGZvcgotCWNoYW5nZXMgdG8gZGlzYXNzZW1ibGVyLgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIG5ldyB0ZXN0cy4gIFJ1biBzY2h3YWIgdGVzdCBmb3IKLQltNjhrLSotY29mZiouCi0KLU1vbiBBdWcgIDcgMDM6MDE6MzIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9zaC8qOiBOZXcgdGVzdHMgZm9yIHRoZSBoaXRhY2hpLXNoLgotCi1UdWUgQXVnICAxIDE4OjAyOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS8qOiBOZXcgdGVzdHMgZm9yIE1SSSBtb2RlLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogU3VwcG9ydCB1c2luZyBvYmpjb3B5LiAgRHVtcAotCXByb2dyYW0gZXhlY3V0aW9ucyB0byB0aGUgbG9nIGZpbGUgYmVmb3JlIHJ1bm5pbmcgdGhlbS4gIFVzZSB0aGUKLQlzaW1wbGUgcHJvZ3JhbSBuYW1lLCByYXRoZXIgdGhhbiB0aGUgcGF0aCB0byB0aGUgYmluYXJ5IGJlaW5nIHJ1biwKLQlpbiBwYXNzL2ZhaWwgbWVzc2FnZXMuCi0JKHJlZ2V4cF9kaWZmKTogSWYgdGhlIHJlZ2V4cCBmaWxlIGhhcyB0aGUgc3BlY2lhbCBjb21tZW50ICNwYXNzLAotCXN0b3AgY2hlY2tpbmcgYXQgdGhhdCBwb2ludC4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IE5NLCBOTUZMQUdTLCBPQkpDT1BZLCBhbmQgT0JKQ09QWUZMQUdTLAotCWlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHNldC4KLQotVHVlIEF1ZyAgMSAxMTo0MTozMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHN1cGVyZmx1b3VzIHJ1bnRlc3QgZ2FzcC4KLQotTW9uIEp1bCAzMSAxODoxOToyNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0gCSogZ2FzcC8qOiBOZXcuCi0JKiBNYWtlZmlsZS5pbjogVXNlIGdhc3AgdGVzdHMuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IEFkZCBnYXNwIHN0dWZmLgotCi1UaHUgSnVsIDIwIDE4OjU2OjQ4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IERpc2FibGUgdGVzdHMgdGhhdCBhcmUgbm90IGFwcHJvcHJpYXRlIGZvcgotCXRoZSBQQS4KLQotVGh1IEp1bCAxMyAxODoyMjo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIHNjaHdhYiB0ZXN0IGZvciBtNjhrIHZ4d29ya3M1LjEuCi0KLVdlZCBKdW4gMjEgMjE6Mjg6NTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvc2Nod2FiLio6IE5ldyB0ZXN0IGJhc2VkIG9uIGEgdGVzdCBjYXNlIGZyb20gQW5kcmVhcwotCVNjaHdhYi4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdCBmb3Igc29tZSBhb3V0IGNvbmZpZ3VyYXRpb25zLgotCi1Nb24gSnVuIDEyIDIyOjI3OjE4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLVN1biBNYXkgMjEgMjA6MjY6MTggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogRGlzYWJsZSBhbGlnbjQgdGVzdHMgZm9yCi0JRUxGIHRhcmdldHMuCi0KLVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCQotCi0JKiBhcm0vYXJtN2RtLnM6IE5ldyBmaWxlIC0tIHRlc3RzIGZvciBBUk03RE0gaW5zdHJ1Y3Rpb25zLgotCSogYXJtL2FybTYuczogQ29ycmVjdCBib2d1cyB0ZXN0cy4KLQkqIGFybS9nYXMuZXhwIChhcm02LnMpOiBJcyBub3cgYSB2YWxpZCB0ZXN0LgotCShhcm03ZG0ucyk6IE5ldyB0ZXN0LgotCSogYXJtL2Zsb2F0LnM6IEFkZCBsb2FkL3N0b3JlIG11bHRpcGxlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIAotCXRlc3RzLgotCi1XZWQgTWF5ICAzIDEzOjE0OjQ0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1UdWUgTWF5ICAyIDE2OjM3OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xkLmQ6IE1vZGlmaWVkIGZvciBnYXMgZGVsYXktc2xvdCBmaXhlcy4KLQotU2F0IEFwciAyOSAyMzozNToxOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGcuZXhwOiBOZXcgZmlsZS4KLQotVHVlIEFwciAxMSAxMzo1Nzo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzNC5kOiBBbGxvdyBtb3JlIHRoYW4gZXhhY3RseSA4IHplcm9zIGluIGJjMSoKLQl0YXJnZXRzLgotCi1Nb24gQXByIDEwIDE1OjM2OjM5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHBhc3NfcGhhc2UpOiBOZXcgcHJvYy4KLQkocnVuX2R1bXBfdGVzdCk6IE5vdGUgcGFzc2luZyBvciBmYWlsaW5nIG9mIGVhY2ggcGhhc2Ugb2YgdGhpcwotCXRlc3QsIGluc3RlYWQgb2YgZmFpbHVyZSBvZiBwaGFzZXMgb3IgcGFzc2luZyBvZiBjb21wbGV0ZSB0ZXN0LgotCUVuc3VyZSB0ZXN0IGZpbGUgbmFtZSBpcyBpbiByZXBvcnRlZCBtZXNzYWdlLgotCi1TYXQgQXByICA4IDEyOjQ2OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IEhhbmRsZSBhcmd1bWVudHMgd2l0aCBwYXRocy4KLQlBbHdheXMgcmVzb2x2ZSB0ZXN0Y2FzZSBzdGF0dXMgYmVmb3JlIHJldHVybmluZy4KLQlJZiBgc2x1cnBfb3B0aW9ucycgZmFpbHMsIHJldHVybiBhbmQgZG9uJ3QgZG8gdGVzdC4KLQkoc2x1cnBfb3B0aW9ucyk6IEZpeCAiY2FuJ3Qgb3BlbiIgZXJyb3IgbWVzc2FnZS4KLQlSZXR1cm4gLTEgdG8gaW5kaWNhdGUgZXJyb3IuCi0KLU1vbiBNYXIgMjAgMjI6NDU6MzAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2NvbW1vbi5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1GcmkgTWFyIDEwIDE5OjA3OjA5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9oODMwMC9mZnh4MS5zOiBBZGQgLndvcmQgMCBhdCB0aGUgZW5kIHRvIGVsaW1pbmF0ZQotCXVuY2VydGFpbnR5IGFzIHRvIHdoZXRoZXIgdGhlcmUgc2hvdWxkIGJlIHRyYWlsaW5nIGJ5dGVzIGluIHRoZQotCW91dHB1dCBmaWxlLgotCSogZ2FzL2g4MzAwL2ZmeHgxLmQ6IEFkanVzdCByZWxvYyB2YWx1ZXMgdG8gcGVybWl0IGFuIGFkZGVuZCB2YWx1ZQotCW9mIDB4MDAwMDAwMDBmZmZmZmZmZiBvbiA2NC1iaXQgaG9zdHMuICAoSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMKLQljb3JyZWN0LikgIEVuZCB3aXRoICIuLi4iIHRvIG1hdGNoIHRyYWlsaW5nIHplcm8gYnl0ZXMuCi0KLVdlZCBNYXIgIDggMTU6NTA6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzNC5kLCBnYXMvbWlwcy9taXBzNC5zOiBOZXcgZmlsZXMuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG5ldyB0ZXN0LgotCi1UaHUgRmViIDIzIDE3OjU4OjUwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogQWRkIGluZGV4aW5nIHZhcmlhbnRzLgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBUZXN0IHRoZW0uCi0KLVdlZCBGZWIgMTUgMTU6NDM6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy91bGQuZDogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy91bGQuczogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy91c2QuZDogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy91c2QuczogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG5ldyB0ZXN0cy4KLQotVGh1IEZlYiAgOSAxMDo1NzozOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX2FwcGx5YnVnX3Rlc3QpOiBSdW4gaXQuCi0KLVRodSBGZWIgIDIgMDA6MzQ6NTUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAgICAgICAgKiBnYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAoZG9fcGljX3JlbG9jYXRpb25fdGVzdCk6IFJ1biBpdC4KLQotRnJpIEphbiAyNyAxNDowMjowMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZCwgZ2FzL2g4MzAwL2ZmeHgxLnMsIGdhcy9oODMwMC9jbXBzaTIucywKLQlnYXMvaDgzMDAvaDgzMDAuZXhwOiBOZXcgdGVzdHMuCi0KLU1vbiBKYW4gMjMgMjE6NDQ6MjYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9fc3lzdGVtKTogVXBkYXRlLgotCi1XZWQgSmFuIDExIDE3OjIwOjI1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBEb24ndCBydW4gdGhlIG1lbW9yeS1hY2Nlc3MgdGVzdHMgaWYgdGhlCi0JZm9ybWF0IGlzIGEub3V0LCBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0Ci0JaXMgdXNlZCB3aXRoIG90aGVyIGZvcm1hdHMuCi0KLVR1ZSBKYW4gMTAgMTE6NDI6MTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCAoYWxpZ240LnMpOiBGaXggZ2xpdGNoIGluCi0JcmVnZXhwIHRvIGF2b2lkIGxvc2luZyB3aXRob3V0IGEgY29udHJvbGxpbmcgdHR5LgotCi1GcmkgRGVjIDMwIDE4OjA4OjIwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9pMzg2L3B1c2h3Lmw6IEZpeGVkIHdoaXRlc3BhY2UgdG8gbWF0Y2ggY3VycmVudCBsaXN0aW5nCi0Jc3R5bGUuCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogTWFyayB0ZXN0IHAxNDgwLnMgZXhwZWN0ZWQgdG8gcGFzcywgZXZlbiB3aXRoCi0JbGlzdGluZ3MgZW5hYmxlZC4KLQotVGh1IERlYyAxNSAxODoxNDoyNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQVNfRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VUKTogRG9uJ3Qgc2V0LgotCSh1bmluc3RhbGwpOiBEb24ndCBzZXQgT0JKRFVNUCBhbmQgT0JKRFVNUEZMQUdTIGluIHNpdGUuZXhwLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBEZWZhdWx0IE9CSkRVTVAgYW5kIE9CSkRVTVBGTEFHUy4gIFVzZQotCWZpbmRmaWxlIGFuZCB0cmFuc2Zvcm0gcHJvY2VkdXJlcyB0byBkZXRlcm1pbmUgb2JqZHVtcCBwcm9ncmFtCi0JbmFtZS4KLQotCSogZ2FzL21pcHMvYWJzLnMsIGdhcy9taXBzL2Rpdi5zOiBGb3JjZSBzb21lIHBhZGRpbmcgYXQgdGhlIGVuZCwKLQlpbiBjYXNlIHRoZSBmb3JtYXQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IHJlcXVpcmUgaXQuCi0JKiBnYXMvbWlwcy9iZXEuZCwgZ2FzL21pcHMvamFsLmQ6IEhhbmRsZSBNSVBTX0pNUCBhcyBhbiBhbHRlcm5hdGUKLQluYW1lIGZvciB0aGUgcmVsb2MgdHlwZS4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZmlsZV9jb250ZW50cywgdmVyYm9zZV9ldmFsKTogTmV3IHByb2NzLgotCShydW5fZHVtcF90ZXN0KTogSWYgdmVyYm9zaXR5IGxldmVsIGlzIG92ZXIgMywgcHJpbnQgb3V0IGR1bXAKLQljb21tYW5kIGFuZCBpdHMgb3V0cHV0LgotCi1UdWUgRGVjIDEzIDE4OjIxOjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvamFsLXN2cjRwaWMuZDogRml4IDAtc3RyaW5ncyB0byB3b3JrIHdpdGggNjQtYml0IGhvc3RlZAotCWRpc2Fzc2VtYmx5LgotCi1GcmkgRGVjICA5IDE5OjU0OjA0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cCAoY29tbWVudC5zIHRlc3QpOiBNYWtlIHRoZSAiXHIiIG9wdGlvbmFsLCBzaW5jZQotCWl0IGRlcGVuZHMgb24gdHR5IG1vZGVzLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfc3RhcnQpOiBUcnkgdXNpbmcgLW5vdHR5Y29weSBpbnN0ZWFkIG9mCi0JLW5vdHR5aW5pdC4KLQotCSogZ2FzL2FybS9nYXMuZXhwOiBUaGUgYXJtNiB0ZXN0IHNob3VsZCByZXBvcnQgZXJyb3JzLCBmb3Igbm93LgotCi1UaHUgRGVjICA4IDIwOjE5OjA5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHA6IFVzZSAtaSBpbiBleHBlY3RfYWZ0ZXIgY29tbWFuZC4KLQotV2VkIERlYyAgNyAxNjo0OToxNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9tdWwuZCxqYWwuZDogRml4IDAtc3RyaW5ncyB0byB3b3JrIHdpdGggNjQtYml0IGhvc3RlZAotCWRpc2Fzc2VtYmx5LgotCi0JKiBnYXMvaWVlZS1mcDogUmVuYW1lZCBmcm9tIGllZWUuZnAuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHA6IE1ha2Ugc3VyZSB0aW1lb3V0IGlzIGF0IGxlYXN0IDIgbWludXRlcy4KLQotV2VkIE5vdiAzMCAxMDo0ODowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcGFyc2U6IFJlbmFtZWQgZnJvbSBnYXMvaHBwYS9tb3JlLnBhcnNlLgotCi1Nb24gTm92IDI4IDAwOjQwOjI2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cCAobm9zdWJzcGFjZS5zKTogTm8gbG9uZ2VyIGV4cGVjdGVkCi0JdG8gZmFpbC4gIEZpeCBjb21tZW50cyBmb3IgdGhlIHRlc3QuICBUd2VhayB0ZXN0IG5hbWUuCi0KLVR1ZSBOb3YgMjIgMjM6Mzg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTWlub3IgdHdlYWtzIHRvIG1hdGNoIGN1cnJlbnQgUEEgRUxGCi0Jb3V0cHV0LiAKLQotRnJpIE5vdiAxOCAxNzo1Njo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xkLmQ6IEFkanVzdCB0byB3b3JrIGZvciBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbgotCWNvZGUuCi0JKiBnYXMvbWlwcy9sZC5zLCBnYXMvbWlwcy9saWYtZW1waWMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy9saWZsb2F0LmQsIGdhcy9taXBzL3VsaC1lbXBpYy5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3VsaC5kLCBnYXMvbWlwcy91bHcuZCwgZ2FzL21pcHMvdXNoLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdXN3LmQ6IExpa2V3aXNlLgotCi1UdWUgTm92IDE1IDExOjA5OjU3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIChpbXBvcnRidWcpOiBUd2VhayB0byBtYXRjaAotCWN1cnJlbnQgZXhwZWN0ZWQgUEEgRUxGIG91dHB1dC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAoZG9fcl9ub19yZWxvYyk6IExpa2V3aXNlLgotCShkb19wbGFiZWxfcmVsb2NhdGlvbl90ZXN0KTogTGlrZXdpc2UuCi0KLVRodSBOb3YgIDMgMTg6MTQ6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9wMTQ4MC5zOiBVc2UgbGFyZ2VyIGNvbnN0YW50LCBzbyBleHByZXNzaW9uIGNhbiBoYXZlIGEKLQlwb3NpdGl2ZSB2YWx1ZS4KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRXhwZWN0IHAxNDgwLnMgd2l0aG91dCBsaXN0aW5ncyB0byBwYXNzLgotCi1UaHUgTm92ICAzIDE1OjQzOjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvdWxoLmQsIGdhcy9taXBzL3Vsdy5kLCBnYXMvbWlwcy91c2guZCwgZ2FzL21pcHMvdXN3LmQ6Ci0JQ29ycmVjdCB0ZXN0IGNhc2VzLgotCi1UaHUgT2N0IDIwIDAwOjU1OjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9ibGVidWczLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLU1vbiBPY3QgMTcgMDI6MzM6NTMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTMuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotU3VuIE9jdCAxNiAyMjoyNTo1NiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChyX25vX3JlbG9jKTogVHdlYWsgb3V0cHV0IHRvIG1hdGNoCi0JY3VycmVudCByZWFsaXR5LgotCi1XZWQgU2VwIDI4IDIxOjIxOjM0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UuczogUmVuYW1lZCBmcm9tIHJlbG9jcmVkdWNlLnMKLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTIuczogUmVuYW1lZCBmcm9tIHJlbG9jcmVkdWNlMi5zCi0JKiBnYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnM6IFJlbmFtZWQgZnJvbSByX25vX3JlbG9jYnVnLnMKLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQotV2VkIFNlcCAyOCAxMzoyNToxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzL2JlcS5kLCBnYXMvbWlwcy9iZXEuczogVGVzdCB0aGF0IHVuY29uZGl0aW9uYWwgYnJhbmNoCi0Jb3ZlcmZsb3dzIGFyZSBjb3JyZWN0bHkgY29udmVydGVkIHRvIGp1bXBzLgotCi1Nb24gU2VwIDI2IDE3OjQxOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHM6IEFkZCB0ZXN0IGNhc2VzIGZvciBQSUMgY29kZSwgYm90aCBTVlI0IHN0eWxlIGFuZAotCS1tZW1iZWRkZWQtcGljIHN0eWxlLgotCi1GcmkgU2VwIDIzIDE0OjQ1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHM6IE5ldyBkaXJlY3Rvcnkgd2l0aCBNSVBTIHNwZWNpZmljIHRlc3QgY2FzZXMuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBQZXJtaXQgdGhlIC5kIGZpbGUgdG8gc3BlY2lmeQotCXRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhc3NlbWJsZS4KLQkocmVnZXhwX2RpZmYpOiBQdXQgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSBpbiB0aGUgbG9nIGZpbGUuCi0KLVdlZCBTZXAgMjEgMTM6NDQ6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBEb24ndCB0cnkgdG8gdXNlIHNoZWxsIHJlZGlyZWN0aW9uLCBzaW5jZSBUQ0wKLQlkb2Vzbid0IHN1cHBvcnQgaXQuICBSZWRpcmVjdCBzdGRvdXQgdXNpbmcgPiBpbnN0ZWFkIG9mIDE+LCBhbmQKLQlkb24ndCBib3RoZXIgdG8gcmVkaXJlY3Qgc3RkZXJyIHNpbmNlIFRDTCByZWRpcmVjdHMgaXQgYW55aG93LgotCShydW5fZHVtcF90ZXN0KTogUGFzcyBhcHByb3ByaWF0ZSBhcmd1bWVudHMgdG8gcHJvZ3JhbSwgZGVmYXVsdGluZwotCXRvIC1yLgotCi1TYXQgU2VwIDE3IDAxOjA0OjU2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhcy92YXg6IE5ldyBkaXJlY3RvcnkuCi0JKiBnYXMvdmF4L3txdWFkLnMscXVhZC5leHB9OiBOZXcgdGVzdCwgZm9yIGltbWVkaWF0ZSBxdWFkd29yZAotCXZhbHVlcy4KLQotTW9uIFNlcCAxMiAyMjoxOToxMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvY2J1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX2Z1bmN0aW9uX3JlbG9jX2J1Zyk6IFVwZGF0ZQotCWV4cGVjdGVkIG91dHB1dC4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBnYXMvYXJtLyo6IE5ldyBzdWJ0cmVlLiAgQWRkIEFSTSB0ZXN0cy4KLQotTW9uIEF1ZyAgOCAxMjoxMzozMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBBY2NlcHQgYW55IGNoYXJhY3RlcgotCWJldHdlZW4gZm9vJ3MgdHlwZSBhbmQgZm9vIGl0c2VsZi4KLQotRnJpIEp1bCAxNSAxOTowOToyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogTmV3IHJvdXRpbmUgZm9yIHJ1bm5pbmcgdGhlCi0JYXNzZW1ibGVyLCBydW5uaW5nIG9iamR1bXAgb3Igbm0gKG5vdCBmdWxseSBzdXBwb3J0ZWQpIG9uIHRoZQotCXJlc3VsdGluZyBvYmplY3QgZmlsZSwgYW5kIGNvbXBhcmluZyB0aGUgcmVzdWx0cyBhZ2FpbnN0IGEgZmlsZSBvZgotCXJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gdGhlIHRlc3Qgc3VpdGUsIGFsbCBpbiBvbmUgY29tbWFuZC4KLQlPcHRpb25zIGZvciB0aGUgYXNzZW1ibGVyIGFuZCBvYmpkdW1wIGFyZSByZWFkIGZyb20gY29tbWVudHMgYXQKLQl0aGUgc3RhcnQgb2YgdGhlIC5kIGZpbGUuCi0JKGZhaWxfcGhhc2UsIHNsdXJwX29wdGlvbnMpOiBOZXcgYXV4aWxpYXJ5IHJvdXRpbmVzLgotCShyZWdleHBfZGlmZik6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4gIEZpeCBidWdzIGluIGFjdHVhbGx5IGRvaW5nCi0JdGhlIHJlZ2V4cCB0ZXN0LgotCi0JKiBnYXMvc3VuNC9hZGRlbmQuZXhwOiBVc2UgcnVuX2R1bXBfdGVzdC4KLQkqIGdhcy9zdW40L2FkZGVuZC5kOiBGaXggcmVndWxhciBleHByZXNzaW9ucyBzbyB0aGF0IHRoZXkgd29yay4KLQotVGh1IEp1bCAgNyAxMTo1NTozMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2NyZWR1Y2UyLnM6IE1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb24gdGVzdHMuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biB0aGVtLgotCi1UaHUgSnVuIDMwIDE4OjQ5OjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogTG9vayBmb3IgImFzLm5ldyIgaW4gIiRiYXNlX2Rpci8uLiIsIHdoZXJlCi0JaXQgZ290IGNvbXBpbGVkLCBub3QgaW4gIiRiYXNlX2RpciIuCi0JKiBjb25maWcvdW5rbm93bi5leHA6IERlbGV0ZWQuCi0KLVN1biBKdW4gMjYgMTM6MjM6NTQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9saWIvZ2FzLWRlZnMuZXhwIChnYXNfZmluaXNoKTogQ2FsbCAiY2xvc2UiIGFuZCAid2FpdCIKLQliZWZvcmUgZXhpdGluZy4gIEVuY2xvc2UgYm90aCBjYWxscyBpbnNpZGUgYSAiY2F0Y2giLgotCShvYmpkdW1wX2ZpbmlzaCk6IExpa2V3aXNlLgotCi1GcmkgSnVuIDEwIDEwOjIzOjM1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKHJvdW5kbW9kZSB0ZXN0KTogVHdlYWsgZXhwZWN0ZWQgb3V0cHV0Ci0JZm9yIFNPTSB0byBtYXRjaCBjdXJyZW50IHRlc3RjYXNlLgotCi1UaHUgSnVuICAyIDE5OjQ2OjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhcy9pMzg2L3twdXNody5zLHB1c2h3Lmx9OiBOZXcgdGVzdC4KLQkqIGdhcy9pMzg2L2FsbC5leHA6IFJ1biBpdC4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlIGNvbmZpZyBmaWxlcyBhbmQgZ2FzLnN1bS4KLQotRnJpIE1heSAyNyAxMjoyNDoxOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvbTY4ay9kaXNwZXJyLnM6IFVzZSAlIGZvciByZWdpc3RlcnMuCi0KLQkqIGdhcy9tNjhrLWNvZmYvZ2FzLmV4cDogRXhwZWN0IGZhaWx1cmUgZm9yIHAyMzg5YS5zLgotCi1UdWUgTWF5IDE3IDE0OjUzOjA4IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cDogUmVwbGFjZSBlcnJvciBwcm9jIGNhbGxzIHdpdGggcGVycm9yIGNhbGxzLgotCi1Nb24gTWF5IDE2IDEzOjE5OjE2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFR3ZWFrIGV4cGVjdGVkIG91dHB1dCB0byBtYXRjaCBuZXcKLQlFTEYgY29kZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zOiBBdm9pZCAiUyIgYW5kICJEIiBtb2RlcywgRUxGIGRvZXMKLQlub3Qgc3VwcG9ydCB0aGVtLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBUd2VhayBleHBlY3RlZCBvdXRwdXQgdG8gbWF0Y2gKLQluZXcgRUxGIGNvZGUuCi0KLVRodSBNYXkgIDUgMTc6Mjc6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW5hbWVkIGZyb20gdW5peC1nYXMuZXhwLgotCi1Nb24gQXByIDExIDEwOjMxOjAwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogU2V0IFRDTF9MSUJSQVJZIGZvciBydW50ZXN0LgotCi1Nb24gQXByIDExIDA3OjU0OjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2NhbGxpbmZvYnVnLnM6IEFkZCBtaXNzaW5nIG5hbWUgZm9yCi0JcHJvY2VkdXJlLgotCi0JKiBnYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcuczogUGxhY2UgdGhlIHRyYW1wb2xpbmUgaW4gdGhlCi0JJERBVEEkIHJhdGhlciB0aGFuICRMSVQkIHN1YnNwYWNlLgotCi1TdW4gTWFyIDI3IDE0OjA1OjMzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotVGh1IE1hciAxNyAxMzozODowNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLVdlZCBNYXIgMTYgMTE6NTc6MDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcmVncG9wYnVnLnM6IEFkZCB0cml2aWFsIC5lcXUgdGVzdC4KLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnM6IE5ldyB0ZXN0IChleHBlY3RlZCB0byBmYWlsKS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2NhbGxpbmZvYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvb21yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9yZWdwb3BidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi1Nb24gRmViIDI4IDE0OjEwOjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKG9iamR1bXApOiBOZXcgcHJvYy4KLQkob2JqZHVtcF9zdGFydCk6IERlbGV0ZWQgdW51c2VkIHByb2MuCi0JKG9iamR1bXBfc3RhcnRfY29tbW9uKTogTWVyZ2VkIGludG8gb2JqZHVtcF9zdGFydF9ub19zdWJkaXIuCi0KLQkqIGdhcy9hbHBoYS9mcC5leHA6IFVzZSBvYmpkdW1wIGluc3RlYWQgb2YKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciwgc2luY2UgdGhlIGZvcm1lciBhY3R1YWxseSB3YWl0cyBmb3IKLQlvYmpkdW1wIHRvIGZpbmlzaC4gIFNwZWNpZnkgLnJkYXRhIHNlY3Rpb24gb25seS4gIE1ha2UgY29tbWVudAotCWluZGljYXRlIEFscGhhIGFyY2hpdGVjdHVyZSByYXRoZXIgdGhhbiBTUEFSQy4KLQkqIGdhcy9hbHBoYS9mcC5kOiBPbWl0IC5yZWdpbmZvIHBhdHRlcm5zLiAgSnVzdCB1c2UgIi4iIHRvIG1hdGNoCi0JYWdhaW5zdCBBU0NJSSBjb2RlIDB4MmEgKCIqIiwgc3BlY2lhbCBpbiByZWdleHApLgotCSogZ2FzL3N1bjQvYWRkZW5kLmV4cDogVXNlIG9iamR1bXAgaW5zdGVhZCBvZgotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyLgotCi1UaHUgRmViIDI0IDA3OjExOjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHAgKG5vIHN1YnNwYWNlIHRlc3QpOiBPbmx5IGV4cGVjdAotCWEgZmFpbHVyZSBpZiBnYXMgaXMgbm90IHByb2R1Y2luZyBhbiBFTEYgb2JqZWN0LgotCi1Nb24gRmViIDE0IDA5OjI0OjAzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFJ1biBpdC4KLQotVGh1IEZlYiAxMCAwMDozNDoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvYWxwaGEvZnAuKjogTmV3IGZpbGVzLgotCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBSZXBvcnQgbm90ZWQgbWlzbWF0Y2ggYXQKLQl2ZXJib3NpdHkgbGV2ZWwgMyBvciBhYm92ZSBvbmx5LgotCi1Nb24gRmViICA3IDE1OjUzOjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS8qLyouZXhwOiBDaGFuZ2UgeGZhaWxzIHRvIGNoZWNrIGZvciBQQSBFTEYgcmF0aGVyIHRoYW4KLQlQQSBPU0YxLgotCi1GcmkgRmViICA0IDIzOjQyOjE0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3htcHl1YnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotRnJpIEZlYiAgNCAxNzoxMzoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IE5ldyBwcm9jZWR1cmUsIHZhZ3VlbHkgYmFzZWQgb24KLQkic2ltcGxlX2RpZmYiIGZyb20gbGlua2VyIHRlc3Qgc3VpdGUuCi0JKiBnYXMvc3VuNC9hZGRlbmQuZXhwOiBVc2UgaXQuCi0JKiBnYXMvc3VuNC9hZGRlbmQuZDogTmV3IGZpbGUuCi0KLVN1biBKYW4gMzAgMjM6MzQ6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBBZGp1c3QgcmVnZXhwIGZvciB4OTMwNTA5LnMgZm9yIGN1cnJlbnQgbGlzdGluZwotCWZvcm1hdC4KLQotVGh1IEphbiAyMCAxNjo0NDo1MSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cCwgbGliL2dhcy1kZWZzLmV4cCwgc3VuNC9hZGRlbmQuZXhwLAotCXNwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cDogVHdlYWtlZCB0byBmaXggYSBmZXcgYnVncyBhbmQgdG8gcnVuCi0Jd2VsbCB1bmRlciBlaXRoZXIgdmVyc2lvbiBvZiBleHBlY3QuCi0KLU1vbiBKYW4gMTcgMDA6MjU6MDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZwX21pc2MuczogRGVsZXRlIGNvcHIgaW5zdHJ1Y3Rpb24uICBJdCdzIHRlc3RlZAotCWVsc2V3aGVyZSBub3cuCi0JKiBnYXMvaHBwYS9iYXNpYy97Y29wciwgY29wcm1lbSwgc3BvcH0uczogTmV3IHRlc3RzLgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotVGh1IEphbiAxMyAxMTo1OToyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBObyBsb25nZXIgZXhwZWN0IGRpZmZlcmVuY2Ugb2YgZm9yd2FyZAotCXJlZmVyZW5jZXMgdG8gZmFpbC4KLQkqIGdhcy9hbGwveDkzMDUwOS5zOiBGaXggdGVzdGNhc2UgdG8gbWF0Y2ggaG93IHRoZSBleHBlY3QgY29kZSB3YXMKLQl3cml0dGVuLgotCi1XZWQgSmFuIDEyIDEzOjQxOjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLiAgTGF0ZXN0IHRlc3QKLQlmb3IgY3Jvc3Mtc3Vic3BhY2UgY2FsbCBidWdzIGlzIG5vIGxvbmdlciBleHBlY3RlZCB0byBmYWlsLgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3Byb2NidWcuczogQWRkIHRlc3QgZm9yIGFub3RoZXIgYnVnIHJlbGF0aW5nCi0JdG8gaGF2aW5nIGEgZnVuY3Rpb24ncyBsYWJlbCBmb2xsb3cgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotVHVlIEphbiAxMSAyMTo0Nzo0OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBBZGQgdGVzdCBmb3IgY3Jvc3Mtc3Vic3BhY2UgY2FsbCBidWcKLQlmb3VuZCB3aGlsZSB3b3JraW5nIG9uIG11bHRpcGxlICRDT0RFJCBzdWJzcGFjZSBzdXBwb3J0LgotCi1Nb24gSmFuIDEwIDA5OjU0OjE1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogcHJvY2J1Zy5zIGlzIG5vIGxvbmdlciBleHBlY3RlZAotCXRvIGZhaWwuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3Byb2NidWcuczogQWRkIG1pc3NpbmcgLnByb2NlbmQuCi0KLU1vbiBKYW4gIDMgMTA6MDc6NDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvbGFiZWxidWcuczogQWRkIHRlc3RjYXNlIGZvciBidWcgaW4gbGFzdAotCWFwcC5jIGNoYW5nZS4KLQotV2VkIERlYyAyOSAxMTozMjozOSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9sYWJlbGJ1Zy5zOiBBZGQgbW9yZSBjb2xvbmxlc3MgbGFiZWwgdGVzdHMuCi0KLVdlZCBEZWMgMTUgMDg6MjQ6MzEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc2l0ZS5leHApOiBEb24ndCBzZXQgQVNGTEFHUy4gIFF1b3RlIHZhbHVlIG9mCi0JT0JKRFVNUEZMQUdTIGluIGNhc2UgaXQncyBlbXB0eS4gIFVzZSB0ZW1wb3JhcnkgbmFtZXMgdW50aWwgdGhlCi0JZW5kOyBtYWtlIGNyZWF0aW5nIHNpdGUuZXhwIHRoZSBmaW5hbCBzdGVwLgotCShjaGVjayk6IFBhc3MgaW4gQVNGTEFHUy4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBVc2UgYWxsX29uZXMgcHJvYy4gIENoYW5nZSByZWdleHAgZm9yIG1hdGNoaW5nCi0JQyBjb21tZW50cyB0byBhdm9pZCBidWdzIGluIGxhdGVzdCBleHBlY3QgY29kZS4KLQotV2VkIERlYyAgOCAxNDozMDoxNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL202OGsvZGlzcGVyci5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KLQotU3VuIERlYyAgNSAxOToyNDo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuICBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KLQotV2VkIERlYyAgMSAxMDo0NDoxOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gdGhlIGZpcnN0IGhhbGYgb2YgYm9ndXMgUl9FWElUCi0JdGVzdCBmb3IgRUxGLiAgCi0KLVR1ZSBOb3YgMzAgMTM6NDM6MjEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBUZXN0IGZvciBlcnJvciBvbiBmb3Igc3Vic3BhY2UKLQlkaXJlY3RpdmUgaXMgYW4gWEZBSUwgZm9yIFNPTSBhc3NtZWJsZXJzLgotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJlbW92ZSBYRkFJTCBmb3IgcmVsb2NhdGlvbiBvbgotCWNyb3NzLXN1YnNwYWNlIGNhbGwgdGVzdC4KLQotU3VuIE5vdiAyOCAxMjoxMjo1MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9hcHBidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotU2F0IE5vdiAyNyAyMjo1MDowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2FsbC9wMjQyNS5zOiBJbnNlcnQgYSB0YWIgYmVmb3JlIGFzc2VtYmxlciBkaXJlY3RpdmVzIHNvCi0JdGhhdCB0aGUgZGlyZWN0aXZlcyBhcmUgbm90IGludGVycHJldGVkIGFzIGxhYmVscy4KLQotCSogZ2FzL2hwcGEvYmFzaWMvd2VpcmQuczogU3luYyB3aXRoIEdEQiB2ZXJzaW9uLgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2xhYmVsYnVnLnM6IE5ldyB0ZXN0LgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi1XZWQgTm92IDI0IDAxOjI1OjAzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS9yZWxvYy9leGl0YnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVN1biBOb3YgMjEgMjI6MTE6MTAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTWlub3IgZml4ZXMgc28gdGhhdCBTT00gJiBFTEYgY2FuCi0Jc2hhcmUgdGhlIHNhbWUgdGVzdCBjb2RlLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2NyZWR1Y2UuczogTGlrZXdpc2UuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZtZW0uczogQWRkIHF1YWR3b3JkIEZQIHN0b3JlIGluc3RydWN0aW9ucy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogVGVzdCBxdWFkd29yZCBGUCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0KLVN1biBOb3YgIDcgMDA6MzE6NDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlIGZvcgotCWZpZWxkIHNlbGVjdG9yIG9uIGJsZSBpbnN0cnVjdGlvbiB0ZXN0LgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMgZm9yCi0Jc3lzdGVtIGluc3RydWN0aW9uIHRlc3RzIG5vdyB0aGF0IHByb2JlaSBpcyBmaXhlZC4KLQotU2F0IE5vdiAgNiAyMjo0NTowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotVGh1IE5vdiAgNCAxNzowMTozMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1UaHUgTm92IDA0IDA5OjA5OjQ5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVR1ZSBOb3YgIDIgMjI6MTI6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2Uve2RlZmJ1Zy5zLCBzdGRyZWcuc306IE5ldyB0ZXN0cy4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gdGhlbS4KLQotTW9uIE5vdiAgMSAyMzozNzo1OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChyZWxvY19yZWR1Y2UpOiBDb3JyZWN0IG9mZnNldHMgYXQKLQl3aGljaCBzcGVjaWZpYyByZWxvY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgZm91bmQuCi0JCi1TYXQgT2N0IDMwIDE0OjEyOjMxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKHNzX2FsaWduKTogUmVtb3ZlIE9TRiB4ZmFpbC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IEFkZCBuZXcgdGVzdC4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2Uvc3NidWcuczogTmV3IHRlc3QgdG8gbWFrZSBzdXJlIG5vbi1kZWZhdWx0Ci0Jc2VjdGlvbnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IERpc2FibGUgKGFuZCBmYWlsKSBwMTQ4MC5zIGZvciBhbGwgUEEgdGFyZ2V0cy4KLQotRnJpIE9jdCAyOSAxNjoyOTowNiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9jYWxsZGF0YWJ1Zy5zOiBDb2xvbml6ZS4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBGaXggdHlwb3MuCi0KLVRodSBPY3QgMjggMjE6NDA6MDYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3tiYXNpYywgbW9yZS5wYXJzZSwgcmVsb2MsIHVuc29ydGVkfTogTmV3IGRpcmVjdG9yaWVzLgotCSogZ2FzL2hwcGEvKi8qLmV4cDogTmV3IHRlc3QgZHJpdmVycy4KLQkqIGdhcy9ocHBhLyovKi5zOiBOZXcgdGVzdCBmaWxlcy4KLQotTW9uIE9jdCAyNSAwOTo0MDo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZ2FzL3N1bjQ6IE5ldyBkaXJlY3RvcnkuCi0JKiBnYXMvc3VuNC9hZGRlbmQucyxhZGRlbmQuZXhwOiBOZXcgdGVzdCBjYXNlLgotCSogZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMsYWRkZW5kLmV4cDogU29sYXJpcyB2ZXJzaW9uIG9mIHNhbWUKLQl0ZXN0IGNhc2UuCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogQ2hlY2sgYConIGluIEMgY29tbWVudHMuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGFsbF9vbmVzKTogTmV3IHByb2NlZHVyZSwgZm9yIGEgcHJlZGljYXRlIHRvCi0Jc2ltcGxpZnkgc29tZSB0ZXN0cy4KLQkod2FudF9ub19vdXRwdXQpOiBSZXR1cm4gemVybyBvciBub256ZXJvLCBkZXBlbmRpbmcgb24gc3VjY2VzcyBvcgotCWZhaWx1cmUuCi0JKGdhc190ZXN0X29sZCk6IFJldHVybiB2YWx1ZSBmcm9tIHdhbnRfbm9fb3V0cHV0LgotCShvYmpkdW1wX3N0YXJ0X2NvbW1vbik6IFNwbGl0IG9mZiBmcm9tIG9iamR1bXBfc3RhcnQuCi0JKG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyKTogTmV3IHByb2NlZHVyZS4KLQotV2VkIE9jdCAyMCAwNzoyNTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9kaWZmMS5zLCBnYXMvbTY4ay9waWMxLnM6IE5ldyB0ZXN0cy4KLQkqIGdhcy9hbGwvZ2FzLmV4cCwgZ2FzL202OGsvYWxsLmV4cDogUnVuIHRoZW0uCi0KLQkqIE1ha2VmaWxlLmluIChPQkpEVU1QX0ZPUl9UQVJHRVQpOiBEZWZpbmUgc2ltaWxhciB0bwotCUFTX0ZPUl9UQVJHRVQuCi0JKGNoZWNrKTogRG9uJ3QgcGFzcyBBU0ZMQUdTIHZhcmlhYmxlLgotCShzaXRlLmV4cCk6IFB1dCBBU0ZMQUdTLCBPQkpEVU1QLCBPQkpEVU1QRkxBR1MgaW50byBzaXRlLmV4cC4KLQotCUZyb20gSmVmZiBMYXc6Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKG9iamR1bXBfc3RhcnQsIG9iamR1bXBfZmluaXNoKTogTmV3IGZ1bmN0aW9ucwotCXNvIHRoYXQgdGVzdHMgY2FuIHBhcnNlIHRoZSBvdXRwdXQgb2Ygb2JqZHVtcCBsb29raW5nIGZvciBlcnJvcnMKLQlpbiByZWxvY2F0aW9uIGVudGlyZXMsIGZpbGUgaGVhZGVycyBhbmQgdGhlIGxpa2UuCi0KLVRodSBTZXAgMjMgMTY6MjA6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBnYXMvaWVlZS5mcC94OTMwNTA5YS5leHA6IEN1cnJlbnRseSBleHBlY3RlZCB0byBmYWlsIGFsd2F5cy4KLQkqIGdhcy9hbGwvZ2FzLmV4cCAocDE0ODAucywgeDkzMDUwOS5zKTogRGl0dG8uICBCcmVhayB1cCBnYXNfdGVzdAotCWNhbGwgc28gaXQgbm8gbG9uZ2VyIHBlcmZvcm1zIG11bHRpcGxlIHRlc3RzLgotCSogZ2FzL202OGsvYWxsLmV4cCAodDIucyk6IERvbid0IGJvdGhlciB3aXRoIGxpc3RpbmdzLgotCShwMjQxMC5zKTogRG9uJ3QgcGFzcyB1bndhbnRlZCBhcmd1bWVudHMgdG8gZ2FzX3Rlc3RfZXJyb3IuCi0KLVdlZCBBdWcgMjUgMTY6NTA6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWIvZG8qOiBSZW1vdmUgUkNTIGlkIHN0cmluZ3MuCi0KLU1vbiBNYXkgMTcgMTU6MDk6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZmxvYXQucywgZ2FzL2FsbC9wMTQ4MC5zLCBnYXMvbTY4ay9wMjQxMC5zOiBOZXcgdGVzdHMuCi0JKiBnYXMvYWxsL2dhcy5leHAsIGdhcy9tNjhrL2FsbC5leHA6IFJ1biB0aGVtLgotCSogZ2FzL2kzODY6IE5ldyBkaXJlY3RvcnkuCi0KLU1vbiBNYXkgMTAgMTQ6NTA6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIEFkZGVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIHRvIGNhdGVnb3JpemUgdGVzdHMgYnkgdGFyZ2V0cy4KLQkqIEFkZGVkIG5ldyB0ZXN0cyBhbGwveDkzMDUwOS5zLCBpZWVlLmZwL3g5MzA1MDlhLnMsIG02OGsvcDI2NjMucywKLQlhbmQgcmVmaW5lZCBzb21lIHRvIGV4YW1pbmUgdGhlIGFzc2VtYmxlciBsaXN0aW5nIG91dHB1dC4KLQkqIGxpYi9nYXMtZGVmcy5leHA6IFJlbmFtZWQgZ2FzX3N0YXJ0IHRvIGdhc19ydW4uICBBZGRlZCBzb21lCi0JZXhwZWN0X2FmdGVyIHBhdHRlcm5zLgotCShnYXNfc3RhcnQsIGdhc19maW5pc2gpOiBOZXcgcHJvY3MsIGZvciB0ZXN0cyB0aGF0IGV4YW1pbmUgcHJvY2VzcwotCW91dHB1dC4KLQkqIGNvbmZpZy91bml4LWdhcy5leHA6IEludm9rZSBnYXNfaW5pdCBkaXJlY3RseSwgaW5zdGVhZCBvZgotCXJlcXVpcmluZyB0ZXN0IC5leHAgZmlsZXMgZG8gaXQuCi0KLVdlZCBBcHIgMjEgMDE6MjQ6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBnYXMvZ2FzLmV4cDogSGFuZGxlIG5ldyB0ZXN0cywgYW5kIGNoYW5nZXMgdG8gdGVzdGluZyBwcm9jcy4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAod2FudF9ub19vdXRwdXQpOiBOZXcgcHJvYzsgc3VjY2VzcyBpZmYgb3V0cHV0Ci0JaXMgZW1wdHkuCi0JKGdhc190ZXN0X29sZCk6IEZ1bmN0aW9uYWxseSBzYW1lIGFzIG9sZCBnYXNfdGVzdC4KLQkoZ2FzX3Rlc3RfaWdub3JlX3N0ZG91dCk6IFJld3JpdHRlbiB0byB1c2Ugd2FudF9ub19vdXRwdXQuCi0JKGdhc190ZXN0KTogTmV3IGFyZ3VtZW50IGxpc3RzIHNldCBvZiBvcHRpb25zIHRvIGJlIHRyaWVkIGluCi0JY29tYmluYXRpb25zLiAgT3B0aW9uIHdpdGggdHJhaWxpbmcgIj4iIGluZGljYXRlcyBzdGFuZGFyZCBvdXRwdXQKLQlzaG91bGQgYmUgaWdub3JlZC4KLQotCSogZ2FzL3AyNDI1YS5zOiBVc2UgJS1mb3JtIGZvciByZWdpc3RlcnMsIHNvIHRoaXMgdGVzdCBjYW4gYmUgcnVuCi0Jb24gbTY4ay1jb2ZmIHRhcmdldHMgdG9vLgotCi0JKiBnYXMvcDI0MzBhLnM6IE5ldyB0ZXN0IGNhc2UsIHdoaXRlc3BhY2UgJmMgbWF0Y2hlcyBjdXN0b21lcgotCXJlcG9ydCBtb3JlIGNsb3NlbHkuICBHZXRzIGRpZmZlcmVudCByZXN1bHRzIGZyb20gcDI0MzAuczsgdGhpcyBpcwotCWJhZCwgYW5kIG5vdCB5ZXQgdGVzdGVkIGZvci4KLQotTW9uIEFwciAgNSAxMjoyNzoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZ2FzL3AyMzg5YS5zLCBnYXMvcDI0MTEucywgZ2FzL3QyLnM6IE5ldyB0ZXN0IGNhc2VzLgotCSogbGliL3J1bjogTmV3IHNjcmlwdC4KLQkqIGdhcy9nYXMtZGVmcy5leHAgKGdhc19zdGFydCk6IFRha2VzIG5ldyBhcmdzLCBhc3NlbWJsZXIgb3B0aW9ucwotCWFuZCByZWRpcmVjdGlvbiBvcHRpb25zLiAgVXNlICJydW4iIHNjcmlwdCBzbyByZWRpcmVjdGlvbiB3b3Jrcy4KLQkoZ2FzX3Rlc3QpOiBOb3cgdGFrZXMgYXNzZW1ibGVyIG9wdGlvbnMgYXMgc2VwYXJhdGUgYXJnIGZyb20gaW5wdXQKLQlmaWxlIG5hbWUuCi0JKGdhc190ZXN0X2lnbm9yZV9zdGRvdXQpOiBOZXcgcHJvYy4gIERpc2NhcmRzIG91dHB1dC4KLQkoZ2FzX3Rlc3RfZXJyb3IpOiBOZXcgcHJvYy4gIEV4cGVjdHMgYXNzZW1ibGVyIHRvIGdlbmVyYXRlIG91dHB1dC4KLQkodGFyZ2V0X2NwdV9mYW1pbHkgc2V0dGluZyk6IEhhbmRsZSBpNDg2LT5pMzg2IGFsc28uCi0KLQkqIGxpYi9kbyo6IFNjcmlwdHMgbW92ZWQgaGVyZSBmcm9tIGdhcy90ZXN0c2NyaXB0cy4gIE1heSBiZSB1c2VmdWwKLQlzb21lZGF5IGZvciB3cml0aW5nIG1vcmUgdGVzdCBjYXNlczsgbm90IGN1cnJlbnRseSB1c2VkLgotCi1UdWUgTWFyIDMwIDExOjQ1OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZ2FzL3NvbC1nY2MucywgZ2FzL3NvbC1jYy5zLCBnYXMvcDI0MjVhLnMsIGdhcy9wMjM4OS5zOiBOZXcgdGVzdAotCWNhc2VzLgotCSogZ2FzL2dhcy5leHA6IEVuYWJsZSB0aGVtIGZvciBhcHByb3ByaWF0ZSB0YXJnZXRzLiAgUmVtb3ZlZCBzb21lCi0JdXNlbGVzcyBjb21tZW50cyAmYy4gIENoYW5nZWQgbTY4ayB0YXJnZXQgdGVzdCB0byBiZSBtb3JlIGdlbmVyYWwuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc19leGl0LCBnYXNfaW5pdCk6IE5ldyBwcm9jcy4KLQkqIGdhcy9nYXMuZXhwOiBDYWxsIGdhc19pbml0LgotCi1Nb24gTWFyIDI5IDAwOjAwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBUZXN0IHN1aXRlIGNyZWF0ZWQuCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzRhMDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1sb2FkX2xpYiBnYXMtZGVmcy5leHAKLQotZ2xvYmFsIEFTCi1pZiAhW2luZm8gZXhpc3RzIEFTXSB0aGVuIHsKLSAgICBzZXQgQVMgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9hcy1uZXcgIi4uL2FzLW5ldyIgW3RyYW5zZm9ybSBhc11dCi19Ci0KLWdsb2JhbCBHQVNQCi1pZiAhW2luZm8gZXhpc3RzIEdBU1BdIHRoZW4gewotICAgIHNldCBHQVNQIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vZ2FzcC1uZXcgIi4uL2dhc3AtbmV3IiBbdHJhbnNmb3JtIGdhc3BdXQotfQotCi1nbG9iYWwgQVNGTEFHUwotaWYgIVtpbmZvIGV4aXN0cyBBU0ZMQUdTXSB0aGVuIHsKLSAgICBzZXQgQVNGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkRVTVBdIHRoZW4gewotICAgIHNldCBPQkpEVU1QIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvb2JqZHVtcCBcCi0JCQkgICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9vYmpkdW1wIFwKLQkJCSAgW3RyYW5zZm9ybSBvYmpkdW1wXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpEVU1QRkxBR1Mge30KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBOTV0gdGhlbiB7Ci0gICAgc2V0IE5NIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvbm0tbmV3IFwKLQkJICAgICAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvbm0tbmV3IFwKLQkJICAgICBbdHJhbnNmb3JtIG5tXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgTk1GTEFHUyB7fQotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkNPUFldIHRoZW4gewotICAgIHNldCBPQkpDT1BZIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvb2JqY29weV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpDT1BZRkxBR1Mge30KLX0KLQotZ2FzX2luaXQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZWRlNjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNuYW1lOiBhbGlnbgotCi0jIFRlc3QgdGhlIGFsaWdubWVudCBwc2V1ZG8tb3AuCi0KLS4qOiAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgZmYwMGZmMDEgZmYwMjAyMDIgZmZmZjAzMDMgMDQwNDA0MDQgIC4uLi4uLi4uLi4uLi4uLi4KLSAwMDEwIGZmZmZmZmZmIDA1MDUwNTA1IGZmMDkwYTBhIDBhMGEwYTBhICAuLi4uLi4uLi4uLi4uLi4uCi0gMDAyMCBmZjAwZmYwMSBmZjAyMDIwMiBmZmZmMDMwMyAwNDA0MDQwNCAgLi4uLi4uLi4uLi4uLi4uLgotIDAwMzAgZmZmZmZmZmYgMDUwNTA1MDUgZmYwOTBhMGEgMGEwYTBhMGEgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljY2NhMTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKiBUZXN0IHRoZSBhbGlnbm1lbnQgcHNldWRvLW9wcy4gICovCi0JLnRleHQKLQotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbiAxLDAKLQotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbiAxLDEKLQotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbiAyLDIKLQotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ253IDIsMHgwMzAzCi0KLQkucDJhbGlnbiAzLDQKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ25sIDMsMHgwNTA1MDUwNQotCi0JLnAyYWxpZ24gMSw2Ci0JLnAyYWxpZ24gMSw3Ci0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMyw4LDUKLQkuYnl0ZQk5Ci0JLnAyYWxpZ24gMywweGEKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTIsMAotCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ24JMiwxCi0KLQkuYnl0ZQkweGZmCi0JLmJhbGlnbgk0LDIKLQotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJhbGlnbncgNCwweDAzMDMKLQotCS5iYWxpZ24JOCw0Ci0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ25sIDgsMHgwNTA1MDUwNQotCi0JLmJhbGlnbiAyLDYKLQkuYmFsaWduIDIsNwotCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ24JOCw4LDUKLQkuYnl0ZQk5Ci0JLmJhbGlnbgk4LDB4YQotCi0JLnAyYWxpZ24gNQotCS5iYWxpZ24gMzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg5OGI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jb2JqZHVtcDogLXQKLSNuYW1lOiBjb2ZmdGFnCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotU1lNQk9MIFRBQkxFOgotXFsgIDBcXVwoc2VjIC0yXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAxMDNcKSBcKG54IDFcKSAweDArMDAwMCBmb28uYwotRmlsZSAKLVxbICAyXF1cKHNlYyAgMVwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICA2XCkgXChueCAwXCkgMHgwKzAwMDAgZ2NjMl9jb21waWxlZC4KLVxbICAzXF1cKHNlYyAgMVwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICA2XCkgXChueCAwXCkgMHgwKzAwMDAgX19fZ251X2NvbXBpbGVkX2MKLVxbICA0XF1cKHNlYyAtMlwpXChmbCAweDAwXClcKHR5ICAgYVwpXChzY2wgIDE1XCkgXChueCAxXCkgMHgwKzAwMDAgX3Rva2VuCi1BVVggbG5ubyAwIHNpemUgMHg0IHRhZ25keCAwIGVuZG5keCAxMAotXFsgIDZcXVwoc2VjIC0xXClcKGZsIDB4MDBcKVwodHkgICBiXClcKHNjbCAgMTZcKSBcKG54IDBcKSAweDArMDAwMCBfb3BlcmF0b3IKLVxbICA3XF1cKHNlYyAtMVwpXChmbCAweDAwXClcKHR5ICAgYlwpXChzY2wgIDE2XCkgXChueCAwXCkgMHgwKzAwMDEgX2ZsYWdzCi1cWyAgOFxdXChzZWMgLTFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsIDEwMlwpIFwobnggMVwpIDB4MCswMDA0IC5lb3MKLUFVWCBsbm5vIDAgc2l6ZSAweDQgdGFnbmR4IDQKLVxbIDEwXF1cKHNlYyAgMVwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICAzXCkgXChueCAxXCkgMHhbMC05YS1mXSsgLnRleHQKLUFVWCBzY25sZW4gMHhbMC05YS1mXSsgbnJlbG9jIDAgbmxubm8gMAotXFsgMTJcXVwoc2VjICAyXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDNcKSBcKG54IDFcKSAweFswLTlhLWZdKyAuZGF0YQotQVVYIHNjbmxlbiAweFswLTlhLWZdKyBucmVsb2MgMCBubG5ubyAwCi1cWyAxNFxdXChzZWMgIDNcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgM1wpIFwobnggMVwpIDB4WzAtOWEtZl0rIC5ic3MKLUFVWCBzY25sZW4gMHhbMC05YS1mXSsgbnJlbG9jIDAgbmxubm8gMAotXFsgMTZcXVwoc2VjICAyXClcKGZsIDB4MDBcKVwodHkgICAyXClcKHNjbCAgIDJcKSBcKG54IDBcKSAweDArMDAwMCBfdG9rZW4KLVxbIDE3XF1cKHNlYyAgMlwpXChmbCAweDAwXClcKHR5ICAgYVwpXChzY2wgICAyXCkgXChueCAxXCkgMHhbMC05YS1mXSsgX3doYXQKLUFVWCBsbm5vIDAgc2l6ZSAweDQgdGFnbmR4IDQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU2NTk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBUaGlzIGZpbGUgd2FzIGNvbXBpbGVkIGZyb20gdGhpcyBDIHNvdXJjZToKLQljaGFyIHRva2VuID0wOwotCWVudW0gdG9rZW4gewotCSAgICAgICAgb3BlcmF0b3IsCi0JICAgICAgICBmbGFncwotCX07Ci0JIAotCWVudW0gdG9rZW4gd2hhdD0gb3BlcmF0b3I7Ci0gKi8KLQotCS5maWxlCSJmb28uYyIKLWdjYzJfY29tcGlsZWQuOgotX19fZ251X2NvbXBpbGVkX2M6Ci0uZ2xvYmwgX3Rva2VuCi0uZGF0YQotX3Rva2VuOgotCS5ieXRlIDAKLS50ZXh0Ci0JLmRlZglfdG9rZW4KLQkuc2NsCTE1Ci0JLnR5cGUJMDEyCi0JLnNpemUJNAotCS5lbmRlZgotCS5kZWYJX29wZXJhdG9yCi0JLnZhbAkwCi0JLnNjbAkxNgotCS50eXBlCTAxMwotCS5lbmRlZgotCS5kZWYJX2ZsYWdzCi0JLnZhbAkxCi0JLnNjbAkxNgotCS50eXBlCTAxMwotCS5lbmRlZgotCS5kZWYJLmVvcwotCS52YWwJNAotCS5zY2wJMTAyCi0JLnRhZwlfdG9rZW4KLQkuc2l6ZQk0Ci0JLmVuZGVmCi0uZ2xvYmwgX3doYXQKLS5kYXRhCi0JLnAyYWxpZ24gMgotX3doYXQ6Ci0JLmxvbmcgMAotLnRleHQKLQkuZGVmCV90b2tlbgotCS52YWwJX3Rva2VuCi0JLnNjbAkyCi0JLnR5cGUJMDIKLQkuZW5kZWYKLQkuZGVmCV93aGF0Ci0JLnZhbAlfd2hhdAotCS5zY2wJMgotCS50YWcJX3Rva2VuCi0JLnNpemUJNAotCS50eXBlCTAxMgotCS5lbmRlZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbW1lbnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmM2NDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbW1lbnQucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBUaGlzIHRlc3QgZmlsZSBpcyB0byBzZWUgd2hldGhlciBjb21tZW50cyBnZXQgd3JpdHRlbiBpbnRvIGxpc3RpbmdzCi0jIGNvcnJlY3RseS4gIFRoZSBmaWxlIGhhcyBubyByZWFsIGNvbnRlbnRzLgotLyogQyBjb21tZW50cyB0b28hICovCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlMzk0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgb3V0cHV0IG9mIGdhcyAtYWxjIGNvbmQucy4KLQotLipjb25kLnMuKgotCi0KLSAgIDFbIAldKy5pZgkwCi0gICA4WyAJXSsuZWxzZQotICAgOVsgCV0rLmlmCTEKLSAgMTBbIAldKy5lbmRjCi0gIDExIDAwMDAgMFswMl0wMCA/MDAwWzAyXVsgCV0rLmxvbmdbIAldKzIKLSAgMTJbIAldKy5pZgkwCi0gIDE0WyAJXSsuZWxzZQotICAxNSAwMDA0IDBbMDRdMDAgPzAwMFswNF1bIAldKy5sb25nWyAJXSs0Ci0gIDE2WyAJXSsuZW5kYwotICAxN1sgCV0rLmVuZGMKLSAgMTggMDAwOCAwMDAwID8wMDAwWyAJXSsucDJhbGlnbiA1LDAKLSAgMThbIAldKzAwMDAgPzAwMDAgCi0gIDE4WyAJXSswMDAwID8wMDAwIAotICAxOFsgCV0rMDAwMCA/MDAwMCAKLSAgMThbIAldKzAwMDAgPzAwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ODMyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5pZgkwCi0JLmlmCTEKLQkuZW5kYwotCS5sb25nCTAKLQkuaWYJMAotCS5sb25nCTEKLQkuZW5kYwotCS5lbHNlCi0JLmlmCTEKLQkuZW5kYwotCS5sb25nCTIKLQkuaWYJMAotCS5sb25nCTMKLQkuZWxzZQotCS5sb25nCTQKLQkuZW5kYwotCS5lbmRjCi0JLnAyYWxpZ24gNSwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZGlmZjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9kaWZmMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGE4OWZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9kaWZmMS5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIERpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZCBzeW1ib2xzLgotIyBUaGUgYXNzZW1ibGVyIHNob3VsZCByZWplY3QgdGhpcy4KLQkudGV4dAotCS5nbG9ibCBfZm9vCi1fZm9vOgkubG9uZyBfYSAtIF9iCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk4Y2FkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLnRleHQKLWZvbzoJLnNpbmdsZQkwcjEuMjM0NWUrMDYKLQkuc2luZ2xlIDBmMy4xNDE1OQotCS5kb3VibGUgMHIyLjcxODI4MgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZ2FzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0NDU1MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZ2FzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jCi0jIFRoZXNlIHRlc3RzIHNob3VsZCBiZSB2YWxpZCBvbiBhbGwgdGFyZ2V0cy4KLSMKLQotIyBJIHRoaW5rIGN1cnJlbnRseSBhbGwgdGFyZ2V0cyBmYWlsIHRoaXMgb25lIHdoZW4gbGlzdGluZ3MgYXJlIGVuYWJsZWQuCi1nYXNfdGVzdCAicDI0MjUucyIgIiIgICAiIiAicGNyZWwgdmFsdWVzIGluIGFzc2lnbm1lbnQiCi0KLSMgcDE0ODAucyB1c2VzIGEgIi5zcGFjZSIgZGlyZWN0aXZlIHdoaWNoIGZvciBtb3N0IGFzc2VtYmxlcnMgbWVhbnMKLSMgImFsbG9jYXRlIHNvbWUgc3BhY2UiLiAgT24gdGhlIFBBIGl0IG1lYW5zICJzd2l0Y2ggaW50byB0aGlzIHNwYWNlIi4KLSMKLSMgVGhlcmVmb3JlIHRoaXMgdGVzdCAoYXMgaXQgaXMgY3VycmVudGx5IHdyaXR0ZW4pIGlzIGNvbXBsZXRlbHkgYm9ndXMKLSMgZm9yIGFueSBQQSB0YXJnZXQuICBEbyBub3QgYm90aGVyIHRyeWluZyB0byBydW4gaXQgYW5kIGp1c3QgY2xhaW0KLSMgaXQgZmFpbHMuCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICBzZXR1cF94ZmFpbCAqLSotKgotICAgIGZhaWwgInNpbXBsaWZpYWJsZSBkb3VibGUgc3VidHJhY3Rpb24iCi19IGVsc2UgewotICAgIGdhc190ZXN0ICJwMTQ4MC5zIiAiIiAiLWE+IiAic2ltcGxpZmlhYmxlIGRvdWJsZSBzdWJ0cmFjdGlvbiIKLX0KLQotZ2FzX3Rlc3QgImZsb2F0LnMiICIiICAgIiIgInNpbXBsZSBGUCBjb25zdGFudHMiCi0KLSMgVGhpcyB0ZXN0IGlzIG1lYW5pbmdsZXNzIGZvciB0aGUgUEE7IHRoZSBkaWZmZXJlbmNlIG9mIHR3byB1bmRlZmluZWQKLSMgc3ltYm9scyBpcyBzb21ldGhpbmcgdGhhdCBpcyAoYW5kIG11c3QgYmUpIHN1cHBvcnRlZCBvbiB0aGUgUEEuCi1pZiAhW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3RfZXJyb3IgImRpZmYxLnMiICIiICJkaWZmZXJlbmNlIG9mIHR3byB1bmRlZmluZWQgc3ltYm9scyIKLX0KLQotcHJvYyBkb19jb21tZW50IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbW1lbnQuczogY29tbWVudHMgaW4gbGlzdGluZ3MiCi0gICAgc2V0IHgxIDAKLSAgICBzZXQgeDIgMAotICAgIHNldCB4MyAwCi0gICAgc2V0IHdoaXRlIHtbIFx0XSp9Ci0gICAgZ2FzX3N0YXJ0ICJjb21tZW50LnMiICItYWwiCi0gICAgd2hpbGUgMSB7Ci0jIEFwcGFyZW50bHkgQ1JMRiBpcyByZWNlaXZlZCB3aGVuIHVzaW5nIHB0eXMgZm9yIHN1YnByb2Nlc3NlczsgaGVuY2UgdGhlCi0jIFxyXG4gZm9yIGxpbmUgMy4KLQlleHBlY3QgewotCSAgICAtcmUgIl4gKzFcWyBcdFxdKyMgVGhpc1xbXlxuXF0qXG4iCQl7IHNldCB4MSAxIH0KLQkgICAgLXJlICJeICsyXFsgXHRcXSsjIGNvcnJlY3RseVxbXlxuXF0qXG4iCXsgc2V0IHgyIDEgfQotCSAgICAtcmUgIl4gKzNcWyBcdFxdKy8uIEMgY29tbWVudHMgdG9vLiAuL1xyP1xuIiB7IHNldCB4MyAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmIFthbGxfb25lcyAkeDEgJHgyICR4M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotZG9fY29tbWVudAotCi0jCi0jIFRlc3QgeDkzMDUwOWEgLS0gY29ycmVjdCBhc3NlbWJseSBvZiBkaWZmZXJlbmNlcyBpbnZvbHZpbmcgZm9yd2FyZAotIyByZWZlcmVuY2VzLgotIwotCi1wcm9jIGRvXzkzMDUwOWEge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGlmZmVyZW5jZSBiZXR3ZWVuIGZvcndhcmQgcmVmZXJlbmNlcyIKLSAgICBzZXQgeCAwCi0gICAgZ2FzX3N0YXJ0ICJ4OTMwNTA5LnMiICItYWwiCi0gICAgd2hpbGUgMSB7Ci0jIFdlIG5lZWQgdG8gYWNjb21vZGF0ZSBib3RoIGJ5dGUgb3JkZXJzIGhlcmUuCi0jIElmICIubG9uZyIgbWVhbnMgYW4gOC1ieXRlIHZhbHVlIG9uIHNvbWUgdGFyZ2V0IHNvbWVkYXksIHRoaXMgdGVzdCB3aWxsIGhhdmUKLSMgdG8gYmUgZml4ZWQuCi0JZXhwZWN0IHsKLQkgICAgLXJlICJeICsxIC4uLi4gMDAwMCAqMDAwMCIgeyBmYWlsICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXiArMSAuLi4uIDA0MDAgKjAwMDAiIHsgcGFzcyAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIl4gKzEgLi4uLiAwMDAwICowMDA0IiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIiB7IH0KLQkgICAgdGltZW91dCB7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YgeyBicmVhayB9Ci0JfQotICAgIH0KLSAgICBnYXNfZmluaXNoCi0gICAgaWYgISR4IHRoZW4geyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLSMgVGhpcyB0ZXN0IGlzIG1lYW5pbmdsZXNzIGZvciB0aGUgUEE7IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzCi0jIG11c3Qgbm90IGJlIHJlc29sdmVkIGJ5IHRoZSBhc3NlbWJsZXIuCi1pZiAhW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyB0aGUgdmF4IGZhaWxzIGJlY2F1c2UgVk1TIGNhbiBhcHBhcmVudGx5IGFjdHVhbGx5IGhhbmRsZSB0aGlzCi0gICAgIyBjYXNlIGluIHJlbG9jcywgc28gZ2FzIGRvZXNuJ3QgaGFuZGxlIGl0IGl0c2VsZi4KLSAgICBzZXR1cF94ZmFpbCAidmF4Ki0qLXZtcyoiCi0gICAgc2V0dXBfeGZhaWwgIm1uMTAzMDAqLSotKiIKLSAgICBzZXR1cF94ZmFpbCAibW4xMDIwMCotKi0qIgotICAgIGRvXzkzMDUwOWEKLX0KLQotY2FzZSAkdGFyZ2V0X3RyaXBsZXQgaW4gewotICAgIHsgaHBwYSotKi0qIH0geyB9Ci0gICAgZGVmYXVsdCB7Ci0JcnVuX2R1bXBfdGVzdCBzdHJ1Y3QKLQlydW5fZHVtcF90ZXN0IGFsaWduCi0gICAgfQotfQotCi0jIFRoaXMgdGVzdCBpcyBmb3IgYW55IENPRkYgdGFyZ2V0LgotIyBXZSBvbWl0IG04OGsgQ09GRiBiZWNhdXNlIGl0IHVzZXMgd2VpcmQgcHNldWRvLW9wIG5hbWVzLgotIyBXZSBvbWl0IHRoZSBBUk0gdG9vbGNoYWlucyBiZWNhdXNlIHRoZXkgZGVmaW5lIGxvY2FscyB0bwotIyAgc3RhcnQgd2l0aCAnLicsIHdoaWNoIGVsaW1pbmF0ZXMgLmVvcywgLnRleHQgZXRjIGZyb20gdGhlIG91dHB1dC4KLWlmIHsgICAoW2lzdGFyZ2V0ICotKi1jb2ZmKl0gJiYgIVtpc3RhcmdldCBtODgqLSotKl0gJiYgIVtpc3RhcmdldCAqYXJtKi0qLWNvZmZdICYmICFbaXN0YXJnZXQgdGh1bWIqLSotY29mZl0pIFwKLSAgICAgfHwoW2lzdGFyZ2V0ICotKi1wZSpdICYmICFbaXN0YXJnZXQgYXJtKi0qLXBlKl0gJiYgIVtpc3RhcmdldCB0aHVtYiotKi1wZSpdKSBcCi0gICAgIHx8IFtpc3RhcmdldCBhMjlrLSotdWRpKl0gXAotICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLWVibW9uKl0gXAotICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLXN5bSpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi12eHdvcmtzKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWFpeCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1zY28qXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotaXNjKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWdvMzIqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotY3lnd2luKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLSpudF0gXAotICAgICB8fCAoW2lzdGFyZ2V0IGk5NjAtKi12eHdvcmtzNS4qXSAmJiAhW2lzdGFyZ2V0IGk5NjAtKi12eHdvcmtzNS4wKl0pIH0gewotICAgIHJ1bl9kdW1wX3Rlc3QgY29mZnRhZwotfQotCi0jIFRlc3Qgb21pdHRpbmcgY29uZGl0aW9uYWxzIGZyb20gbGlzdGluZ3MuCi1wcm9jIHRlc3RfY29uZCB7fSB7Ci0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLQotICAgIHNldCB0ZXN0bmFtZSAiY29uZGl0aW9uYWwgbGlzdGluZ3MiCi0gICAgZ2FzX3J1biBjb25kLnMgLWFsYyAiPmR1bXAub3V0IgotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JaWYgeyBbcmVnZXhwX2RpZmYgZHVtcC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NvbmQuZF0gfSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgcGFzcyAkdGVzdG5hbWUKLQl9Ci0gICAgfQotfQotCi10ZXN0X2NvbmQKLQotIyBGSVhNRTogdGhpcyBpcyBoZXJlIGNhdXNlIG9mIGEgYnVnIGluIERlamFHbnUgMS4xLjEuIFdoZW4gaXQgaXMgbm8gbG9uZ2VyCi0jICAgICAgICBpbiB1c2UsIHRoZW4gdGhpcyBjYW4gYmUgcmVtb3ZlZC4KLWlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgIHVuc2V0IGVycm9ySW5mbwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2NmRmYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0gICAgOyBUaGUgInA8bj4iIHJlcHJlc2VudCBwcm9jZXNzb3JzIG9mIGEgbXVsdGktcHJvY2Vzc29yIHN5c3RlbS4KLQotICAgIHAxIGRyZWcgZDEgMSAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMSIgZm9yIENPUDEgaGFzIHZhbHVlIDEKLSAgICBwMSBjcmVnIGMzIDMgICAgICAgIDsgY3RybCByZWdpc3RlciAiYzMiIGZvciBDT1AxIGhhcyB2YWx1ZSAzCi0gICAgcDMgaW5zbiBmaWUgMHgxZToyNC0yMCAgICAgIDsgZnVuY3Rpb24gImZpbGwiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZmVlIDB4MWU6MjQtMjAsZHJlZzoxNy0xMyxjcmVnOjEyLTgsaW1tZWQ6Ny0wCi0KLSAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0gICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLSAgICBwMyBpbnNuIGZ1bSAweDAxZTAwMDAxIGRyZWc6MTctMTMgY3JlZzoxMi04Ci0gICAgcDMgaW5zbiBmb2ggMHhmOjI0LTIxIGRyZWc6MjAtMTYgaW1tZWQ6MTUtMAotCi0gICAgcDMgaW5zbiBwaWcgMHgxOjI0LTIxKlsweDEwMHwweDJdLCBkcmVnOjIwLTE2LCBpbW1lZDoxNS0wKjB4MTAwMDAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTc0NTRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0KLQotLyogaXRibC10ZXN0LmMKLQotICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFN0YW5kLWFsb25lIHRlc3QgZm9yIGluc3RydWN0aW9uIHNwZWNpZmljYXRpb24gdGFibGUgc3VwcG9ydC4KLSAgIFJ1biB1c2luZyAiaXRibC10ZXN0IDxpdGJsPiA8YXNtLnM+IgotICAgd2hlcmUgPGl0Ymw+IGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbiB0YWJsZSwKLSAgIGFuZCA8YXNtLnM+IGlzIHRoZSBuYW1lIG9mIHRoZSBhc3NlbWJsZXIgZmllLiAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0KLXN0YXRpYyBpbnQgdGVzdF9yZWcgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JCSAgICAgdW5zaWduZWQgbG9uZyB2YWwpOwotCi1pbnQgCi1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHVuc2lnbmVkIGludCBpbnNuOwotICBGSUxFICpmYXM7Ci0gIGludCBhbGluZSA9IDA7Ci0gIGNoYXIgc1s4MV0sICpuYW1lOwotCi0gIGlmIChhcmdjIDwgMykKLSAgICB7Ci0gICAgICBwcmludGYgKCJ1c2FnZTogJXMgaXRibCBhc20uc1xuIiwgYXJndlswXSk7Ci0gICAgICBleGl0ICgwKTsKLSAgICB9Ci0gIGlmIChpdGJsX3BhcnNlIChhcmd2WzFdKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZCB0byBwYXJzZSBpdGJsXG4iKTsKLSAgICAgIGV4aXQgKDApOwotICAgIH0KLQotICBmYXMgPSBmb3BlbiAoYXJndlsyXSwgInIiKTsKLSAgaWYgKGZhcyA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZCB0byBvcGVuIGFzbSBmaWxlICVzXG4iLCBhcmd2WzJdKTsKLSAgICAgIGV4aXQgKDApOwotICAgIH0KLSAgd2hpbGUgKGZnZXRzIChzLCA4MCwgZmFzKSkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgYWxpbmUrKzsKLQotICAgICAgaWYgKHAgPSBzdHJjaHIgKHMsICc7JyksIHApCS8qIHN0cmlwIGNvbW1lbnRzICovCi0JKnAgPSAwOwotICAgICAgaWYgKHAgPSBzdHJjaHIgKHMsICcjJyksIHApCS8qIHN0cmlwIGNvbW1lbnRzICovCi0JKnAgPSAwOwotICAgICAgcCA9IHMgKyBzdHJsZW4gKHMpIC0gMTsKLSAgICAgIHdoaWxlIChwID49IHMgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcbicpKQkvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKi8KLQlwLS07Ci0gICAgICAqKHAgKyAxKSA9IDA7Ci0gICAgICBwID0gczsKLSAgICAgIHdoaWxlICgqcCAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJykpCS8qIHN0cmlwIGxlYWRpbmcgc3BhY2VzICovCi0JcCsrOwotICAgICAgaWYgKCEqcCkKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IGl0YmxfZ2V0X2ZpZWxkICgmcCk7Ci0gICAgICBpbnNuID0gaXRibF9hc3NlbWJsZSAobmFtZSwgcCk7Ci0gICAgICBpZiAoaW5zbiA9PSAwKQotCXByaW50ZiAoImxpbmUgJWQ6IEludmFsaWQgaW5zdHJ1Y3Rpb24gKCVzKVxuIiwgYWxpbmUsIHMpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYnVmWzEyOF07Ci0JICBwcmludGYgKCJsaW5lICVkOiBpbnNuKCVzKSA9IDB4JXgpXG4iLCBhbGluZSwgcywgaW5zbik7Ci0JICBpZiAoIWl0YmxfZGlzYXNzZW1ibGUgKGJ1ZiwgaW5zbikpCi0JICAgIHByaW50ZiAoImxpbmUgJWQ6IENhbid0IGRpc2Fzc2VtYmxlIGluc3RydWN0aW9uICIKLQkJICAgICIoMHgleClcbiIsIGFsaW5lLCBpbnNuKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgibGluZSAlZDogZGlzYXNtKDB4JXgpID0gJXMpXG4iLCBhbGluZSwgaW5zbiwgYnVmKTsKLQl9Ci0gICAgfQotCi0gIHRlc3RfcmVnICgxLCBlX2RyZWcsICJkMSIsIDEpOwotICB0ZXN0X3JlZyAoMywgZV9jcmVnLCAiYzIiLCAyMik7Ci0gIHRlc3RfcmVnICgzLCBlX2RyZWcsICJkMyIsIDMpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IAotdGVzdF9yZWcgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JICB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLSAgY2hhciAqbjsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIG4gPSBpdGJsX2dldF9uYW1lIChwcm9jZXNzb3IsIHR5cGUsIHZhbCk7Ci0gIGlmICghbiB8fCBzdHJjbXAgKG4sIG5hbWUpKQotICAgIHByaW50ZiAoIkVycm9yIC0gcmVnIG5hbWUgbm90IGZvdW5kIGZvciBwcm9lc3Nvcj0lZCwgdHlwZT0lZCwgdmFsPSVkXG4iLAotCSAgICBwcm9jZXNzb3IsIHR5cGUsIHZhbCk7Ci0gIGVsc2UKLSAgICBwcmludGYgKCJuYW1lPSVzIGZvdW5kIGZvciBwcm9jZXNzb3I9JWQsIHR5cGU9JWQsIHZhbD0lZFxuIiwKLQkgICAgbiwgcHJvY2Vzc29yLCB0eXBlLCB2YWwpOwotCi0gIC8qIFdlIHJlcXVpcmUgdGhhdCBuYW1lcyBiZSB1bmlxdWUgYW1vdW5nIHByb2Nlc3NvcnMgYW5kIHR5cGVzLiAqLwotICBpZiAoISBpdGJsX2dldF9yZWdfdmFsIChuYW1lLCAmdikKLSAgICAgIHx8IHYgIT0gdmFsKQotICAgIHByaW50ZiAoIkVycm9yIC0gcmVnIHZhbCBub3QgZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgbmFtZT0lc1xuIiwKLQkgICAgcHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgZWxzZQotICAgIHByaW50ZiAoInZhbD0weCV4IGZvdW5kIGZvciBwcm9jZXNzb3I9JWQsIHR5cGU9JWQsIG5hbWU9JXNcbiIsCi0JICAgIHYsIHByb2Nlc3NvciwgdHlwZSwgbmFtZSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTFhYTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0KLSAgICA7IEFzc2VtYmxlIHByb2Nlc3NvciBpbnN0cnVjdGlvbnMgYXMgZGVmaW5lZCBpbiAiaXRibCIuCi0KLSAgICBmZWUgJGQzLCRjMiwweDEgCTsgIDB4NGZmMDc2MDEKLSAgICBmaWUgCSAgCTsgIDB4NGZmMDAwMDAKLSAgICBmb2ggJDIsMHgxMDAKLSAgICBmdW0gJGQzLCRjMiAgICAgCTsgIDB4NGZmMDc2MDEKLSAgICBwaWcgJDIsMHgxMDAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AxNDgwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwYmE4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc3RhcnQ6CS5sb25nIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcKLQkuc3BhY2UgMHg4MCAtICguIC0gc3RhcnQpCi1mb286CS5sb25nIDQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDI0MjUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzlkYzk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgX2Zyb2JuaXR6Ci1fZnJvYm5pdHo6Ci0JLmxvbmcgMSwgMiwgMywgNCwgNSwgNiwgNywgR1JVTVAsIDQyCi0JR1JVTVA9Li1fZnJvYm5pdHoKLQlIQUxGR1JVTVA9R1JVTVAvMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM1ZGQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogc3RydWN0Ci0KLSMgVGVzdCB0aGUgLnN0cnVjdCBwc2V1ZG8tb3AuCi0KLTArMDAgQSB3MQotMCswMiBBIHcyCi0wKzA0IEEgdzMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZmQwYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmdsb2JsCXcxCi0JLmdsb2JsCXcyCi0JLmdsb2JsCXczCi0JLmxvbmcJMAotCS5zdHJ1Y3QJMAotdzE6CS5zaG9ydAkwCi13MjoJLnNob3J0CTAKLXczOgkuc2hvcnQJMAotCS50ZXh0Ci0JLmxvbmcJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC94OTMwNTA5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTk5OTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCS5sb25nIEwyLUwxCi1MMToJLmxvbmcgMHgxMjM0Ci1MMjoJLmxvbmcgMHg1Njc4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2ZjdlOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgZWNvZmYtbGl0dGxlYWxwaGEKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAucmRhdGE6Ci0gMDAwMCA3MWEzNzkwOSA0ZjkzMGE0MCA1NDQxNzg5YSBjZDRiODgxYiAgcS55Lk8uLkBUQXguLksuLgotIDAwMTAgMmE0MDRmOTMgNzkwOTcxYTMgNzg5YTU0NDAgNTQ0MTc4OWEgIC5ATy55LnEueC5UQFRBeC4KLSAwMDIwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWM4ODEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIwotIyBBbHBoYSBPU0YvMSB0ZXN0cwotIwotCi1pZiBbaXN0YXJnZXQgYWxwaGEtKi1vc2YqXSB0aGVuIHsKLSAgICBzZXQgdGVzdG5hbWUgImZwIGNvbnN0YW50cyAocGFydCAyKSIKLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmcC5zIiAiIiAiZnAgY29uc3RhbnRzIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcCAiLXMgLWogLnJkYXRhID4gYS5kdW1wIgotCWlmIHsgW3JlZ2V4cF9kaWZmICJhLmR1bXAiICIkc3JjZGlyLyRzdWJkaXIvZnAuZCJdID09IDAgfSB0aGVuIHsKLQkgICAgcGFzcyAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBmYWlsICR0ZXN0bmFtZQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYmJiZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5yZGF0YQotIyBUaGVzZSB0aHJlZSBmb3JtYXRzIGFyZSA4IGJ5dGVzIGVhY2guCi0JLnRfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NzEsIDB4YTMsIDB4NzksIDB4MDksIDB4NGYsIDB4OTMsIDB4MGEsIDB4NDAKLQkuZF9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg1NCwgMHg0MSwgMHg3OCwgMHg5YSwgMHhjZCwgMHg0YiwgMHg4OCwgMHgxYgotCS5nX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDJhLCAweDQwLCAweDRmLCAweDkzLCAweDc5LCAweDA5LCAweDcxLCAweGEzCi0jIFRoZSBuZXh0IHR3byBhcmUgZm91ciBieXRlcyBlYWNoLgotCS5zX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDc4LCAweDlhLCAweDU0LCAweDQwLCAwLCAwLCAwLCAwCi0JLmZfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NTQsIDB4NDEsIDB4NzgsIDB4OWEsIDAsIDAsIDAsIDAKLQkubG9uZyAwLCAwLCAwLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhY2Y2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIEBJQyswQDAwODIwMAlAT0NAIHIwLHIxCi0wMDAwMDAwNCBASUMrM0A2ZTM4MDAJQE9DQCBmcCxzcAotMDAwMDAwMDggQElDKzBAMWZmZTAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgQElDKzBAM2ZmZmZmCUBPQ0AgcjEsLTEKLTAwMDAwMDEwIEBJQys3QGUxMDQwMAlAT0NAIDAscjIKLTAwMDAwMDE0IEBJQys3QGUxODdmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCBASUMrMEA5ZmZlZmYJQE9DQCByNCwyNTUKLTAwMDAwMDFjIEBJQys3QGUyOGFmZglAT0NAIDI1NSxyNQotMDAwMDAwMjAgQElDKzBAZGZmZjAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgQElDKzdAZTM4ZjAwCUBPQ0AgLTI1NixyNwotMDAwMDAwMjggQElDKzFAMWY3YzAwCUBPQ0AgcjgsMjU2Ci0wMDAwMDAzMCBASUMrMUAzZjdjMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCBASUMrN0BjNTE0MDAJQE9DQCA1MTEscjEwCi0wMDAwMDA0MCBASUMrMUA3ZjdjMDAJQE9DQCByMTEsMTExMTYzODU5NAotMDAwMDAwNDggQElDKzdAYzYxODAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgQElDKzdAZmY3Y2ZmCUBPQ0AgMjU1LDI1NgotMDAwMDAwNTggQElDKzdAZGZmZWZmCUBPQ0AgMjU2LDI1NQotMDAwMDAwNjAgQElDKzBAMWY3YzAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCBASUMrMEAwMDgyMDAJQE9DQCByMCxyMQotMDAwMDAwNmMgQElDKzBANjIwODAwCUBPQ0AgcjMscjQKLTAwMDAwMDcwIEBJQyswQGMzOGUwMQlAT0NALmVxIHI2LHI3Ci0wMDAwMDA3NCBASUMrMUAyNTE0MDEJQE9DQC5lcSByOSxyMTAKLTAwMDAwMDc4IEBJQysxQDg2OWEwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDdjIEBJQysxQGU4MjAwMglAT0NALm5lIHIxNSxyMTYKLTAwMDAwMDgwIEBJQysyQDQ5YTYwMwlAT0NALnAgcjE4LHIxOQotMDAwMDAwODQgQElDKzJAYWIyYzAzCUBPQ0AucCByMjEscjIyCi0wMDAwMDA4OCBASUMrM0AwY2IyMDQJQE9DQC5uIHIyNCxyMjUKLTAwMDAwMDhjIEBJQyszQDZlMzgwNAlAT0NALm4gZnAsc3AKLTAwMDAwMDkwIEBJQyszQGNmYmUwNQlAT0NALmMgaWxpbmsyLGJsaW5rCi0wMDAwMDA5NCBASUMrNEAzMTQ0MDUJQE9DQC5jIHIzMyxyMzQKLTAwMDAwMDk4IEBJQys0QDkyY2EwNQlAT0NALmMgcjM2LHIzNwotMDAwMDAwOWMgQElDKzRAZjQ1MDA2CUBPQ0AubmMgcjM5LHI0MAotMDAwMDAwYTAgQElDKzVANTVkNjA2CUBPQ0AubmMgcjQyLHI0MwotMDAwMDAwYTQgQElDKzVAYjc1YzA2CUBPQ0AubmMgcjQ1LHI0NgotMDAwMDAwYTggQElDKzZAMThlMjA3CUBPQ0AudiByNDgscjQ5Ci0wMDAwMDBhYyBASUMrNkA3YTY4MDcJQE9DQC52IHI1MSxyNTIKLTAwMDAwMGIwIEBJQys2QGRiZWUwOAlAT0NALm52IHI1NCxyNTUKLTAwMDAwMGI0IEBJQys3QDNkNzQwOAlAT0NALm52IHI1NyxyNTgKLTAwMDAwMGI4IEBJQys3QDllNzgwOQlAT0NALmd0IGxwX2NvdW50LGxwX2NvdW50Ci0wMDAwMDBiYyBASUMrMEAxZjdjMGEJQE9DQC5nZSByMCwwCi0wMDAwMDBjNCBASUMrN0BjMDgyMGIJQE9DQC5sdCAxLHIxCi0wMDAwMDBjYyBASUMrN0BkZjdjMGMJQE9DQC5sZSAyLDIKLTAwMDAwMGQ0IEBJQyswQDYxODYwZAlAT0NALmhpIHIzLHIzCi0wMDAwMDBkOCBASUMrMEA4MjA4MGUJQE9DQC5scyByNCxyNAotMDAwMDAwZGMgQElDKzBAYTI4YTBmCUBPQ0AucG56IHI1LHI1Ci0wMDAwMDBlMCBASUMrMEAwMDgzMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDBlNCBASUMrMEA1ZWZhMDEJQE9DQC5mIHIyLDEKLTAwMDAwMGU4IEBJQys3QGExODYwMQlAT0NALmYgMSxyMwotMDAwMDAwZWMgQElDKzdAYTIwODAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDBmMCBASUMrMEBiZjdkMDAJQE9DQC5mIHI1LDUxMgotMDAwMDAwZjggQElDKzdAYzMwZDAwCUBPQ0AuZiA1MTIscjYKLTAwMDAwMTAwIEBJQys3QGRmN2QwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAxMDggQElDKzBAMDA4MzAxCUBPQ0AuZXEuZiByMCxyMQotMDAwMDAxMGMgQElDKzBAM2Y3ZDAyCUBPQ0AubmUuZiByMSwwCi0wMDAwMDExNCBASUMrN0BjMTA1MGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMTFjIEBJQys3QGMxMDUwOQlAT0NALmd0LmYgMSxyMgotMDAwMDAxMjQgQElDKzBAMWY3ZDBjCUBPQ0AubGUuZiByMCw1MTIKLTAwMDAwMTJjIEBJQys3QGMxMDUwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDEzNCBASUMrN0BkZjdkMDQJQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNDQ0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMgQE9DQCB0ZXN0Ci0KLSMgcmVnLHJlZwotCUBPQ0AgcjAscjEKLQlAT0NAIGZwLHNwCi0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCwwCi0JQE9DQCByMSwtMQotCUBPQ0AgMCxyMgotCUBPQ0AgLTEscjMKLQlAT0NAIHI0LDI1NQotCUBPQ0AgMjU1LHI1Ci0JQE9DQCByNiwtMjU2Ci0JQE9DQCAtMjU2LHI3Ci0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHI4LDI1NgotCUBPQ0AgcjksLTI1NwotCUBPQ0AgNTExLHIxMAotCUBPQ0AgcjExLDB4NDI0MjQyNDIKLQlAT0NAIDB4MTIzNDU2NzgscjEyCi0KLSMgc2hpbW0gYW5kIGxpbW0KLQlAT0NAIDI1NSwyNTYKLQlAT0NAIDI1NiwyNTUKLQotIyBzeW1ib2xzCi0JQE9DQCByMCxmb28KLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24KLQlAT0NALmFsIHIwLHIxCi0JQE9DQC5yYSByMyxyNAotCUBPQ0AuZXEgcjYscjcKLQlAT0NALnogcjkscjEwCi0JQE9DQC5uZSByMTIscjEzCi0JQE9DQC5ueiByMTUscjE2Ci0JQE9DQC5wbCByMTgscjE5Ci0JQE9DQC5wIHIyMSxyMjIKLQlAT0NALm1pIHIyNCxyMjUKLQlAT0NALm4gcjI3LHIyOAotCUBPQ0AuY3MgcjMwLHIzMQotCUBPQ0AuYyByMzMscjM0Ci0JQE9DQC5sbyByMzYscjM3Ci0JQE9DQC5jYyByMzkscjQwCi0JQE9DQC5uYyByNDIscjQzCi0JQE9DQC5ocyByNDUscjQ2Ci0JQE9DQC52cyByNDgscjQ5Ci0JQE9DQC52IHI1MSxyNTIKLQlAT0NALnZjIHI1NCxyNTUKLQlAT0NALm52IHI1NyxyNTgKLQlAT0NALmd0IHI2MCxyNjAKLQlAT0NALmdlIHIwLDAKLQlAT0NALmx0IDEscjEKLQlAT0NALmxlIDIsMgotCUBPQ0AuaGkgcjMscjMKLQlAT0NALmxzIHI0LHI0Ci0JQE9DQC5wbnogcjUscjUKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAxLHIzCi0JQE9DQC5mIDAscjQKLQlAT0NALmYgcjUsNTEyCi0JQE9DQC5mIDUxMixyNgotCUBPQ0AuZiA1MTIsNTEyCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uICsgZmxhZyBzZXR0aW5nCi0JQE9DQC5lcS5mIHIwLHIxCi0JQE9DQC5uZS5mIHIxLDAKLQlAT0NALmx0LmYgMCxyMgotCUBPQ0AuZ3QuZiAxLHIyCi0JQE9DQC5sZS5mIHIwLDUxMgotCUBPQ0AuZ2UuZiA1MTIscjIKLQlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYXJjLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk4NDUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgQVJDIGdhcyB0ZXN0c3VpdGUKLQotIyBUZXN0IGFuIGluc24gZnJvbSBhIHRlbXBsYXRlIC5zLy5kLgotIyBUaGUgYmVzdCB3YXkgdG8gY3JlYXRlIHRoZSAuZCBmaWxlIGlzIHRvIHJ1biB0aGUgdGVzdHMgd2l0aG91dCBpdCwgbGV0Ci0jIGRlamFnbnUgY3Jhc2gsIHJ1biBhcy5uZXcgb24gdGhlIGp1c3QgYnVpbHQgLnMgZmlsZSwgcnVuIG9iamR1bXAgLWRyIG9uCi0jIHRoZSByZXN1bHQgb2YgdGhhdCwgY29weSB0aGUgcmVzdWx0IGludG8gdGhlIC5kIGZpbGUsIGFuZCBlZGl0IGluIHRoZQotIyBuZWNlc3NhcnkgcGF0dGVybnMgKEBPQ0AsIGV0Yy4pLiAgU291bmRzIGNvbXBsaWNhdGVkIGJ1dCBpdCdzIGVhc3kuICBUaGUKLSMgY2F0Y2ggaXMgdGhhdCB3ZSBhc3N1bWUgYSB3b3JraW5nIGFzc2VtYmxlciBpcyB1c2VkIHRvIGJ1aWxkIGl0LiAgVGhhdCdzCi0jIG9idmlvdXNseSBub3QgZW50aXJlbHkga29zaGVyLCBidXQgb25jZSB0aGUgLmQgZmlsZSBpcyBjcmVhdGVkIG9uZSBjYW4KLSMgdmVyaWZ5IGl0J3MgY29udGVudHMgb3ZlciB0aW1lLgotIwotIyBUZW1wbGF0ZSBwYXR0ZXJuczoKLSMgQE9DQCAtIHBsYWNlaG9sZGVyIGZvciB0aGUgb3Bjb2RlCi0jIEBJQys/QCAtIHBsYWNlIGhvbGRlciBmb3IgdGhlIGluc24gY29kZQotIyBASTMrPz9AIC0gcGxhY2UgaG9sZGVyIGZvciB0aGUgb3BlcmF0aW9uIGNvZGUgb2YgY29kZSAzIGluc25zLgotCi1wcm9jIHRlc3RfdGVtcGxhdGVfaW5zbiB7IGNwdSB0bXBsIG9wY29kZSBpY29kZSB9IHsKLSAgICBnbG9iYWwgc3JjZGlyIHN1YmRpciBvYmpkaXIKLQotICAgICMgQ2hhbmdlIEBPQ0AgaW4gdGhlIHRlbXBsYXRlIGZpbGUgdG8gJG9wY29kZQotCi0gICAgc2V0IGluX2ZkIFtvcGVuICRzcmNkaXIvJHN1YmRpci8kdG1wbC5zIHJdCi0gICAgc2V0IG91dF9mZCBbb3BlbiAkb2JqZGlyLyRvcGNvZGUucyB3XQotICAgICMgRklYTUU6IGNoZWNrIHJldHVybiBjb2RlcwotCi0gICAgcHV0cyAkb3V0X2ZkICJcdC5jcHUgJGNwdVxuIgotICAgIHdoaWxlIHsgW2dldHMgJGluX2ZkIGxpbmVdID49IDAgfSB7Ci0JcmVnc3ViICJAT0NAIiAkbGluZSAkb3Bjb2RlIGxpbmUKLQlwdXRzICRvdXRfZmQgJGxpbmUKLSAgICB9Ci0KLSAgICBjbG9zZSAkaW5fZmQKLSAgICBjbG9zZSAkb3V0X2ZkCi0KLSAgICAjIENyZWF0ZSBvdXRwdXQgdGVtcGxhdGUuCi0KLSAgICBzZXQgaW5fZmQgW29wZW4gJHNyY2Rpci8kc3ViZGlyLyR0bXBsLmQgcl0KLSAgICBzZXQgb3V0X2ZkIFtvcGVuICRvYmpkaXIvJG9wY29kZS5kIHddCi0gICAgIyBGSVhNRTogY2hlY2sgcmV0dXJuIGNvZGVzCi0KLSAgICB3aGlsZSB7IFtnZXRzICRpbl9mZCBsaW5lXSA+PSAwIH0gewotCXJlZ3N1YiAiQE9DQCIgJGxpbmUgJG9wY29kZSBsaW5lCi0JI3NlbmRfdXNlciAiJGxpbmVcbiIKLQlpZiBbc3RyaW5nIG1hdGNoICIqQElDKz9AKiIgJGxpbmVdIHsKLQkgICAgIyBJbnNlcnQgdGhlIG9wY29kZS4gIEl0IG9jY3VwaWVzIHRoZSB0b3AgNSBiaXRzLgotCSAgICByZWdleHAgIl4oLiopQElDXFwrKC4pQCguKikkIiAkbGluZSBqdW5rIGxlZnRwYXJ0IG4gcmlnaHRwYXJ0Ci0JICAgIHNldCBuIFtleHByICgkaWNvZGUgPDwgMykgKyAkbl0KLQkgICAgc2V0IG4gW2Zvcm1hdCAiJTAyeCIgJG5dCi0JICAgIHB1dHMgJG91dF9mZCAiJGxlZnRwYXJ0JG4kcmlnaHRwYXJ0IgotCX0gZWxzZWlmIFtzdHJpbmcgbWF0Y2ggIipASTMrPz9AKiIgJGxpbmVdIHsKLQkgICAgIyBJbnNlcnQgaW5zbiAzIGNvZGUgKHJlZ2lzdGVyIEMgZmllbGQpCi0JICAgICMgYjE1PTgvMCwgYjg9MS8wICh0aGVpciByZXNwZWN0aXZlIGhleCB2YWx1ZXMgaW4gdGhlIG9iamR1bXApCi0JICAgIHJlZ2V4cCAiXiguKilASTNcXCsoLikoLilAKC4qKSQiICRsaW5lIGp1bmsgbGVmdHBhcnQgYjE1IGI4IHJpZ2h0cGFydAotCSAgICBzZXQgbiBbZXhwciAoJGljb2RlIDw8IDEpICsgKCRiMTUgPDwgNCkgKyAoJGI4IDw8IDApXQotCSAgICBzZXQgbiBbZm9ybWF0ICIlMDJ4IiAkbl0KLQkgICAgcHV0cyAkb3V0X2ZkICIkbGVmdHBhcnQkbiRyaWdodHBhcnQiCi0JfSBlbHNlIHsKLQkgICAgcHV0cyAkb3V0X2ZkICRsaW5lCi0JfQotICAgIH0KLQotICAgIGNsb3NlICRpbl9mZAotICAgIGNsb3NlICRvdXRfZmQKLQotICAgICMgRmluYWxseSwgcnVuIHRoZSB0ZXN0LgotCi0gICAgcnVuX2R1bXBfdGVzdCAkb2JqZGlyLyRvcGNvZGUKLQotICAgICMgIm1ha2UgY2xlYW4iIHdvbid0IGRlbGV0ZSB0aGVzZSwgc28gZm9yIG5vdyB3ZSBtdXN0LgotICAgIGNhdGNoICJleGVjIHJtIC1mICRvYmpkaXIvJG9wY29kZS5zICRvYmpkaXIvJG9wY29kZS5kIgotfQotCi0jIFJ1biB0aGUgdGVzdHMuCi0KLWlmIFtpc3RhcmdldCBhcmMqLSotKl0gdGhlbiB7Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGFkYyA5Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBhZGQgOAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggYW5kIDEyCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBiaWMgMTQKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIG9yIDEzCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBzYmMgMTEKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIHN1YiAxMAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggeG9yIDE1Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBhbGlhcyBtb3YgMTIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBhbGlhcyBybGMgOQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIGFzbCA4Ci0jIGBsc2wnIGdldHMgZHVtcGVkIGFzIGBhc2wnIHNvIHRoaXMgbXVzdCBiZSB0ZXN0ZWQgZWxzZXdoZXJlLgotIyAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIGxzbCA4Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgYXNyIDEKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgbHNyIDIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgcm9yIDMKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgcnJjIDQKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBiIDQKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBicmFuY2ggYmwgNQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBscCA2Ci0KLSAgICBydW5fZHVtcF90ZXN0ICJqIgotCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgc2V4YiA1Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgc2V4dyA2Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgZXh0YiA3Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgZXh0dyA4Ci0KLSAgICBydW5fZHVtcF90ZXN0ICJmbGFnIgotIyAgICBydW5fZHVtcF90ZXN0ICJub3AiCi0KLSAgICBydW5fZHVtcF90ZXN0ICJsZCIKLSAgICBydW5fZHVtcF90ZXN0ICJzdCIKLQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzliMDE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2guZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBAT0NACi0KLSMgVGVzdCB0aGUgQE9DQCBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8dGV4dF9sYWJlbD4gQElDKzdAZmZmZjgwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwNCA8dGV4dF9sYWJlbFwrND4gQElDKzdAZmZmZjAwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwOCA8dGV4dF9sYWJlbFwrOD4gQElDKzdAZmZmZTgwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwYyA8dGV4dF9sYWJlbFwrYz4gQElDKzdAZmZmZTAxCUBPQ0BlcSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDEwIDx0ZXh0X2xhYmVsXCsxMD4gQElDKzdAZmZmZDgxCUBPQ0BlcSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDE0IDx0ZXh0X2xhYmVsXCsxND4gQElDKzdAZmZmZDAyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDE4IDx0ZXh0X2xhYmVsXCsxOD4gQElDKzdAZmZmYzgyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDFjIDx0ZXh0X2xhYmVsXCsxYz4gQElDKzdAZmZmYzAzCUBPQ0BwIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMjAgPHRleHRfbGFiZWxcKzIwPiBASUMrN0BmZmZiODMJQE9DQHAgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyNCA8dGV4dF9sYWJlbFwrMjQ+IEBJQys3QGZmZmIwNAlAT0NAbiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDI4IDx0ZXh0X2xhYmVsXCsyOD4gQElDKzdAZmZmYTg0CUBPQ0BuIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMmMgPHRleHRfbGFiZWxcKzJjPiBASUMrN0BmZmZhMDUJQE9DQGMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzMCA8dGV4dF9sYWJlbFwrMzA+IEBJQys3QGZmZjk4NQlAT0NAYyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDM0IDx0ZXh0X2xhYmVsXCszND4gQElDKzdAZmZmOTA1CUBPQ0BjIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMzggPHRleHRfbGFiZWxcKzM4PiBASUMrN0BmZmY4ODYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwM2MgPHRleHRfbGFiZWxcKzNjPiBASUMrN0BmZmY4MDYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNDAgPHRleHRfbGFiZWxcKzQwPiBASUMrN0BmZmY3ODYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNDQgPHRleHRfbGFiZWxcKzQ0PiBASUMrN0BmZmY3MDcJQE9DQHYgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0OCA8dGV4dF9sYWJlbFwrNDg+IEBJQys3QGZmZjY4NwlAT0NAdiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDRjIDx0ZXh0X2xhYmVsXCs0Yz4gQElDKzdAZmZmNjA4CUBPQ0BudiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDUwIDx0ZXh0X2xhYmVsXCs1MD4gQElDKzdAZmZmNTg4CUBPQ0BudiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDU0IDx0ZXh0X2xhYmVsXCs1ND4gQElDKzdAZmZmNTA5CUBPQ0BndCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDU4IDx0ZXh0X2xhYmVsXCs1OD4gQElDKzdAZmZmNDhhCUBPQ0BnZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDVjIDx0ZXh0X2xhYmVsXCs1Yz4gQElDKzdAZmZmNDBiCUBPQ0BsdCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDYwIDx0ZXh0X2xhYmVsXCs2MD4gQElDKzdAZmZmMzhjCUBPQ0BsZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDY0IDx0ZXh0X2xhYmVsXCs2ND4gQElDKzdAZmZmMzBkCUBPQ0BoaSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDY4IDx0ZXh0X2xhYmVsXCs2OD4gQElDKzdAZmZmMjhlCUBPQ0BscyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDZjIDx0ZXh0X2xhYmVsXCs2Yz4gQElDKzdAZmZmMjBmCUBPQ0BwbnogMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA3MCA8dGV4dF9sYWJlbFwrNzA+IEBJQys3QGZmZmY4MAlAT0NAIDAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4KLQkJUkVMT0M6IDAwMDAwMDcwIFJfQVJDX0IyMl9QQ1JFTCBleHRlcm5hbF90ZXh0X2xhYmVsCi0wMDAwMDA3NCA8dGV4dF9sYWJlbFwrNzQ+IEBJQyswQDAwMDAwMAlAT0NAIDAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4KLTAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4gQElDKzdAZmZmMGEwCUBPQ0AuZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDdjIDx0ZXh0X2xhYmVsXCs3Yz4gQElDKzdAZmZmMDAwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4MCA8dGV4dF9sYWJlbFwrODA+IEBJQys3QGZmZWZjMAlAT0NALmpkIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwODQgPHRleHRfbGFiZWxcKzg0PiBASUMrN0BmZmVmMjEJQE9DQGVxLmQgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4OCA8dGV4dF9sYWJlbFwrODg+IEBJQys3QGZmZWU4MglAT0NAbmUgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4YyA8dGV4dF9sYWJlbFwrOGM+IEBJQys3QGZmZWU0NglAT0NAbmMuamQgMDAwMDAwMDAgPHRleHRfbGFiZWw+CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjE2MTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyBAT0NAIHRlc3QKLQkKLXRleHRfbGFiZWw6Ci0KLSMgQ29uZGl0aW9uIHRlc3RzCi0JQE9DQAl0ZXh0X2xhYmVsCi0JQE9DQGFsCXRleHRfbGFiZWwKLQlAT0NAcmEJdGV4dF9sYWJlbAotCUBPQ0BlcQl0ZXh0X2xhYmVsCi0JQE9DQHoJdGV4dF9sYWJlbAotCUBPQ0BuZQl0ZXh0X2xhYmVsCi0JQE9DQG56CXRleHRfbGFiZWwKLQlAT0NAcGwJdGV4dF9sYWJlbAotCUBPQ0BwCXRleHRfbGFiZWwKLQlAT0NAbWkJdGV4dF9sYWJlbAotCUBPQ0BuCXRleHRfbGFiZWwKLQlAT0NAY3MJdGV4dF9sYWJlbAotCUBPQ0BjCXRleHRfbGFiZWwKLQlAT0NAbG8JdGV4dF9sYWJlbAotCUBPQ0BjYwl0ZXh0X2xhYmVsCi0JQE9DQG5jCXRleHRfbGFiZWwKLQlAT0NAaHMJdGV4dF9sYWJlbAotCUBPQ0B2cwl0ZXh0X2xhYmVsCi0JQE9DQHYJdGV4dF9sYWJlbAotCUBPQ0B2Ywl0ZXh0X2xhYmVsCi0JQE9DQG52CXRleHRfbGFiZWwKLQlAT0NAZ3QJdGV4dF9sYWJlbAotCUBPQ0BnZQl0ZXh0X2xhYmVsCi0JQE9DQGx0CXRleHRfbGFiZWwKLQlAT0NAbGUJdGV4dF9sYWJlbAotCUBPQ0BoaQl0ZXh0X2xhYmVsCi0JQE9DQGxzCXRleHRfbGFiZWwKLQlAT0NAcG56CXRleHRfbGFiZWwKLQotCUBPQ0AJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCi0JQE9DQAkwCi0KLSMgRGVsYXkgc2xvdHMKLQlAT0NALmQJdGV4dF9sYWJlbAotCUBPQ0AubmQJdGV4dF9sYWJlbAotCUBPQ0AuamQJdGV4dF9sYWJlbAotCi0jIENvbmRpdGlvbiB0ZXN0cyBhbmQgZGVsYXkgc2xvdHMKLQlAT0NAZXEuZAl0ZXh0X2xhYmVsCi0JQE9DQG5lLm5kCXRleHRfbGFiZWwKLQlAT0NAY2MuamQJdGV4dF9sYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjM2ZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBmbGFnCi0KLSMgVGVzdCB0aGUgZmxhZyBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1ObyBzeW1ib2xzIGluICJhLm91dCIuCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMWZhMDAwMDAJZmxhZyByMAotMDAwMDAwMDQgMWZiZjgwMDEJZmxhZyAxCi0wMDAwMDAwOCAxZmJmODAwMglmbGFnIDIKLTAwMDAwMDBjIDFmYmY4MDA0CWZsYWcgNAotMDAwMDAwMTAgMWZiZjgwMDgJZmxhZyA4Ci0wMDAwMDAxNCAxZmJmODAxMAlmbGFnIDE2Ci0wMDAwMDAxOCAxZmJmODAyMAlmbGFnIDMyCi0wMDAwMDAxYyAxZmJmODA0MAlmbGFnIDY0Ci0wMDAwMDAyMCAxZmJmODA4MAlmbGFnIDEyOAotMDAwMDAwMjQgMWZiZjAwMDAJZmxhZyAtMjE0NzQ4MzY0NwotMDAwMDAwMmMgMWZhMDAwMGIJZmxhZy5sdCByMAotMDAwMDAwMzAgMWZiZjAwMDkJZmxhZy5ndCAxCi0wMDAwMDAzOCAxZmJmMDAwOQlmbGFnLmd0IDIKLTAwMDAwMDQwIDFmYmYwMDA5CWZsYWcuZ3QgNAotMDAwMDAwNDggMWZiZjAwMDkJZmxhZy5ndCA4Ci0wMDAwMDA1MCAxZmJmMDAwOQlmbGFnLmd0IDE2Ci0wMDAwMDA1OCAxZmJmMDAwOQlmbGFnLmd0IDMyCi0wMDAwMDA2MCAxZmJmMDAwOQlmbGFnLmd0IDY0Ci0wMDAwMDA2OCAxZmJmMDAwOQlmbGFnLmd0IDEyOAotMDAwMDAwNzAgMWZiZjAwMGEJZmxhZy5nZSAtMjE0NzQ4MzY0NwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjdhYTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgZmxhZyB0ZXN0Ci0KLQlmbGFnCXIwCi0KLQlmbGFnCTEKLQlmbGFnCTIKLQlmbGFnCTQKLQlmbGFnCTgKLQlmbGFnCTE2Ci0JZmxhZwkzMgotCWZsYWcJNjQKLQlmbGFnCTEyOAotCi0JZmxhZwkweDgwMDAwMDAxCi0KLQlmbGFnLmx0CXIwCi0KLQlmbGFnLmd0CTEKLQlmbGFnLmd0CTIKLQlmbGFnLmd0CTQKLQlmbGFnLmd0CTgKLQlmbGFnLmd0CTE2Ci0JZmxhZy5ndAkzMgotCWZsYWcuZ3QJNjQKLQlmbGFnLmd0CTEyOAotCi0JZmxhZy5nZQkweDgwMDAwMDAxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIwN2E3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDE4MDBASTMrODBAMDAJQE9DQCByMCxyMQotMDAwMDAwMDQgMWI2ZUBJMyswMEAwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCAxODFmQEkzKzgwQDAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgMTgzZkBJMys4MUBmZglAT0NAIHIxLC0xCi0wMDAwMDAxMCAxZmUxQEkzKzAwQDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgMWZlMUBJMys4MUBmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCAxODlmQEkzKzgwQGZmCUBPQ0AgcjQsMjU1Ci0wMDAwMDAxYyAxZmUyQEkzKzgwQGZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCAxOGRmQEkzKzgxQDAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgMWZlM0BJMys4MUAwMAlAT0NAIC0yNTYscjcKLTAwMDAwMDI4IDE5MWZASTMrMDBAMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIDE5M2ZASTMrMDBAMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCAxZmM1QEkzKzAwQDAwCUBPQ0AgNTExLHIxMAotMDAwMDAwNDAgMTk3ZkBJMyswMEAwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCAxZmM2QEkzKzAwQDAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgMWZmZkBJMyswMEBmZglAT0NAIDI1NSwyNTYKLTAwMDAwMDU4IDFmZGZASTMrODBAZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCAxODFmQEkzKzAwQDAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCAxOTQ1QEkzKzgwQDAxCUBPQ0AuZXEgcjEwLHIxMQotMDAwMDAwNmMgMTk4NkBJMys4MEAwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDcwIDE5ZGZASTMrMDBAMGIJQE9DQC5sdCByMTQsMAotMDAwMDAwNzggMTlmZkBJMyswMEAwOQlAT0NALmd0IHIxNSw1MTIKLTAwMDAwMDgwIDE4MDBASTMrODFAMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDA4NCAxODVlQEkzKzgwQDAxCUBPQ0AuZiByMiwxCi0wMDAwMDA4OCAxZmEyQEkzKzAwQDAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDA4YyAxOGJmQEkzKzAxQDAwCUBPQ0AuZiByNSw1MTIKLTAwMDAwMDk0IDFmYzNASTMrMDFAMDAJQE9DQC5mIDUxMixyNgotMDAwMDAwOWMgMWZkZkBJMyswMUAwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAwYTQgMTgwMEBJMys4MUAwMQlAT0NALmVxLmYgcjAscjEKLTAwMDAwMGE4IDE4M2ZASTMrMDFAMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMGIwIDFmYzFASTMrMDFAMGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMGI4IDFmYzFASTMrMDFAMDkJQE9DQC5ndC5mIDEscjIKLTAwMDAwMGMwIDE4MWZASTMrMDFAMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAwYzggMWZjMUBJMyswMUAwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDBkMCAxZmRmQEkzKzAxQDA0CUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMmZiODguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIEluc24gMyBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuZXEgcjEwLHIxMQotCUBPQ0AubmUgcjEyLHIxMwotCUBPQ0AubHQgcjE0LDAKLQlAT0NALmd0IHIxNSw1MTIKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAwLHI0Ci0JQE9DQC5mIHI1LDUxMgotCUBPQ0AuZiA1MTIscjYKLQlAT0NALmYgNTEyLDUxMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMQotCUBPQ0AubmUuZiByMSwwCi0JQE9DQC5sdC5mIDAscjIKLQlAT0NALmd0LmYgMSxyMgotCUBPQ0AubGUuZiByMCw1MTIKLQlAT0NALmdlLmYgNTEyLHIyCi0JQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9qLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTAzZjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBqCi0KLSMgVGVzdCB0aGUgaiBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8dGV4dF9sYWJlbD4gMzgwMDAwMDAJaiByMAotMDAwMDAwMDQgPHRleHRfbGFiZWxcKzQ+IDM4MDAwMDIwCWouZCByMAotMDAwMDAwMDggPHRleHRfbGFiZWxcKzg+IDM4MDAwMDQwCWouamQgcjAKLTAwMDAwMDBjIDx0ZXh0X2xhYmVsXCtjPiAzODAwMDAwMAlqIHIwCi0wMDAwMDAxMCA8dGV4dF9sYWJlbFwrMTA+IDM4MDA4MDAwCWogcjEKLTAwMDAwMDE0IDx0ZXh0X2xhYmVsXCsxND4gMzgwMDgwMjAJai5kIHIxCi0wMDAwMDAxOCA8dGV4dF9sYWJlbFwrMTg+IDM4MDA4MDQwCWouamQgcjEKLTAwMDAwMDFjIDx0ZXh0X2xhYmVsXCsxYz4gMzgwMDgwMDAJaiByMQotMDAwMDAwMjAgPHRleHRfbGFiZWxcKzIwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMDI0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDAyOCA8dGV4dF9sYWJlbFwrMjg+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAwMmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDMwIDx0ZXh0X2xhYmVsXCszMD4gMzgxZjAwMDAJaiAwCi0JCVJFTE9DOiAwMDAwMDAzNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwMzggPHRleHRfbGFiZWxcKzM4PiAzODFmMDAwMQlqZXEgMAotCQlSRUxPQzogMDAwMDAwM2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDQwIDx0ZXh0X2xhYmVsXCs0MD4gMzgxZjAwMDEJamVxIDAKLQkJUkVMT0M6IDAwMDAwMDQ0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA0OCA8dGV4dF9sYWJlbFwrNDg+IDM4MWYwMDAyCWpuZSAwCi0JCVJFTE9DOiAwMDAwMDA0YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNTAgPHRleHRfbGFiZWxcKzUwPiAzODFmMDAwMglqbmUgMAotCQlSRUxPQzogMDAwMDAwNTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDU4IDx0ZXh0X2xhYmVsXCs1OD4gMzgxZjAwMDMJanAgMAotCQlSRUxPQzogMDAwMDAwNWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDYwIDx0ZXh0X2xhYmVsXCs2MD4gMzgxZjAwMDMJanAgMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDY4IDx0ZXh0X2xhYmVsXCs2OD4gMzgxZjAwMDQJam4gMAotCQlSRUxPQzogMDAwMDAwNmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4gMzgxZjAwMDQJam4gMAotCQlSRUxPQzogMDAwMDAwNzQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwN2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDgwIDx0ZXh0X2xhYmVsXCs4MD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwODQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDg4IDx0ZXh0X2xhYmVsXCs4OD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwOGMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDkwIDx0ZXh0X2xhYmVsXCs5MD4gMzgxZjAwMDYJam5jIDAKLQkJUkVMT0M6IDAwMDAwMDk0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA5OCA8dGV4dF9sYWJlbFwrOTg+IDM4MWYwMDA2CWpuYyAwCi0JCVJFTE9DOiAwMDAwMDA5YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwYTAgPHRleHRfbGFiZWxcK2EwPiAzODFmMDAwNglqbmMgMAotCQlSRUxPQzogMDAwMDAwYTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGE4IDx0ZXh0X2xhYmVsXCthOD4gMzgxZjAwMDcJanYgMAotCQlSRUxPQzogMDAwMDAwYWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGIwIDx0ZXh0X2xhYmVsXCtiMD4gMzgxZjAwMDcJanYgMAotCQlSRUxPQzogMDAwMDAwYjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGI4IDx0ZXh0X2xhYmVsXCtiOD4gMzgxZjAwMDgJam52IDAKLQkJUkVMT0M6IDAwMDAwMGJjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBjMCA8dGV4dF9sYWJlbFwrYzA+IDM4MWYwMDA4CWpudiAwCi0JCVJFTE9DOiAwMDAwMDBjNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYzggPHRleHRfbGFiZWxcK2M4PiAzODFmMDAwOQlqZ3QgMAotCQlSRUxPQzogMDAwMDAwY2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGQwIDx0ZXh0X2xhYmVsXCtkMD4gMzgxZjAwMGEJamdlIDAKLQkJUkVMT0M6IDAwMDAwMGQ0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBkOCA8dGV4dF9sYWJlbFwrZDg+IDM4MWYwMDBiCWpsdCAwCi0JCVJFTE9DOiAwMDAwMDBkYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwZTAgPHRleHRfbGFiZWxcK2UwPiAzODFmMDAwYwlqbGUgMAotCQlSRUxPQzogMDAwMDAwZTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGU4IDx0ZXh0X2xhYmVsXCtlOD4gMzgxZjAwMGQJamhpIDAKLQkJUkVMT0M6IDAwMDAwMGVjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBmMCA8dGV4dF9sYWJlbFwrZjA+IDM4MWYwMDBlCWpscyAwCi0JCVJFTE9DOiAwMDAwMDBmNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwZjggPHRleHRfbGFiZWxcK2Y4PiAzODFmMDAwZglqcG56IDAKLQkJUkVMT0M6IDAwMDAwMGZjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDEwMCA8dGV4dF9sYWJlbFwrMTAwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMTA0IFJfQVJDXzMyIGV4dGVybmFsX3RleHRfbGFiZWwKLTAwMDAwMTA4IDx0ZXh0X2xhYmVsXCsxMDg+IDM4MWYwMDAwCWogMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9qLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjFhZjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMgaiB0ZXN0Ci0JCi10ZXh0X2xhYmVsOgkKLQlqCXIwCi0Jai5kCXIwCi0Jai5qZAlyMAotCWoubmQJcjAKLQotCWouZglbcjFdCi0Jai5kLmYJW3IxXQotCWouamQuZglbcjFdCi0Jai5uZC5mCVtyMV0KLQotCWoJdGV4dF9sYWJlbAotCWphbAl0ZXh0X2xhYmVsCi0JanJhCXRleHRfbGFiZWwKLQlqZXEJdGV4dF9sYWJlbAotCWp6CXRleHRfbGFiZWwKLQlqbmUJdGV4dF9sYWJlbAotCWpuegl0ZXh0X2xhYmVsCi0JanBsCXRleHRfbGFiZWwKLQlqcAl0ZXh0X2xhYmVsCi0Jam1pCXRleHRfbGFiZWwKLQlqbgl0ZXh0X2xhYmVsCi0JamNzCXRleHRfbGFiZWwKLQlqYwl0ZXh0X2xhYmVsCi0JamxvCXRleHRfbGFiZWwKLQlqY2MJdGV4dF9sYWJlbAotCWpuYwl0ZXh0X2xhYmVsCi0JamhzCXRleHRfbGFiZWwKLQlqdnMJdGV4dF9sYWJlbAotCWp2CXRleHRfbGFiZWwKLQlqdmMJdGV4dF9sYWJlbAotCWpudgl0ZXh0X2xhYmVsCi0Jamd0CXRleHRfbGFiZWwKLQlqZ2UJdGV4dF9sYWJlbAotCWpsdAl0ZXh0X2xhYmVsCi0JamxlCXRleHRfbGFiZWwKLQlqaGkJdGV4dF9sYWJlbAotCWpscwl0ZXh0X2xhYmVsCi0JanBuegl0ZXh0X2xhYmVsCi0KLQlqCWV4dGVybmFsX3RleHRfbGFiZWwKLQotCWoJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkZDBhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBsZC9scgotCi0jIFRlc3QgdGhlIGxkL2xyIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDA4MDA4MDAwCWxkIHIwLFxbcjFcXQotMDAwMDAwMDQgMDA0MTg4MDAJbGQgcjIsXFtyMyxyNFxdCi0wMDAwMDAwOCAwOGEzMDAwMQlsZCByNSxcW3I2LDFcXQotMDAwMDAwMGMgMDhlNDAxZmYJbGQgcjcsXFtyOCwtMVxdCi0wMDAwMDAxMCAwOTI1MDBmZglsZCByOSxcW3IxMCwyNTVcXQotMDAwMDAwMTQgMDk2NjAxMDAJbGQgcjExLFxbcjEyLC0yNTZcXQotMDAwMDAwMTggMDFhNzdjMDAJbGQgcjEzLFxbcjE0LDI1NlxdCi0wMDAwMDAyMCAwMWU4N2MwMAlsZCByMTUsXFtyMTYsLTI1N1xdCi0wMDAwMDAyOCAwMjNmMzgwMAlsZCByMTcsXFszMDU0MTk4OTYsc3BcXQotMDAwMDAwMzAgMGE3ZjAwMDAJbGQgcjE5LFxbMFxdCi0JCVJFTE9DOiAwMDAwMDAzNCBSX0FSQ18zMiBmb28KLTAwMDAwMDM4IDBhOWYwMDAwCWxkIHIyMCxcWzRcXQotCQlSRUxPQzogMDAwMDAwM2MgUl9BUkNfMzIgZm9vCi0wMDAwMDA0MCAwODFmODQwMAlsZGIgcjAsXFswXF0KLTAwMDAwMDQ0IDA4MWY4ODAwCWxkdyByMCxcWzBcXQotMDAwMDAwNDggMDgxZjgyMDAJbGQueCByMCxcWzBcXQotMDAwMDAwNGMgMDgxZjkwMDAJbGQuYSByMCxcWzBcXQotMDAwMDAwNTAgMDgxZmMwMDAJbGQuZGkgcjAsXFswXF0KLTAwMDAwMDU0IDA4MDA1NjAwCWxkYi54LmEuZGkgcjAsXFtyMFxdCi0wMDAwMDA1OCAwODAwYTAwMAlsciByMCxcW3IxXF0KLTAwMDAwMDVjIDA4NWZhMDAwCWxyIHIyLFxbc3RhdHVzXF0KLTAwMDAwMDYwIDA4N2YyMDAwCWxyIHIzLFxbMzA1NDE5ODk2XF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjY3MTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIGxkL2xyIHRlc3QKLQkKLQlsZAlyMCxbcjFdCi0JbGQJcjIsW3IzLHI0XQotCWxkCXI1LFtyNiwxXQotCWxkCXI3LFtyOCwtMV0KLQlsZAlyOSxbcjEwLDI1NV0KLQlsZAlyMTEsW3IxMiwtMjU2XQotCWxkCXIxMyxbcjE0LDI1Nl0KLQlsZAlyMTUsW3IxNiwtMjU3XQotCWxkCXIxNyxbMHgxMjM0NTY3OCxyMjhdCi0JbGQJcjE5LFtmb29dCi0JbGQJcjIwLFtmb28rNF0KLQotCWxkYglyMCxbMF0KLQlsZHcJcjAsWzBdCi0JbGQueAlyMCxbMF0KLQlsZC5hCXIwLFswXQotCWxkLmRpCXIwLFswXQotCWxkYi54LmEuZGkgcjAsW3IwXQotCi0JbHIJcjAsW3IxXQotCWxyCXIyLFtzdGF0dXNdCi0JbHIJcjMsWzB4MTIzNDU2NzhdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiNzljNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIEBJQyswQDAwODQwMAlAT0NAIHIwLHIxLHIyCi0wMDAwMDAwNCBASUMrM0A0ZGI4MDAJQE9DQCByMjYsZnAsc3AKLTAwMDAwMDA4IEBJQyszQGFmM2UwMAlAT0NAIGlsaW5rMSxpbGluazIsYmxpbmsKLTAwMDAwMDBjIEBJQys3QDVkZjgwMAlAT0NAIHI1OCxyNTksbHBfY291bnQKLTAwMDAwMDEwIEBJQyswQDAwZmUwMAlAT0NAIHIwLHIxLDAKLTAwMDAwMDE0IEBJQyswQDFmODQwMAlAT0NAIHIwLDAscjIKLTAwMDAwMDE4IEBJQys3QGUwODQwMAlAT0NAIDAscjEscjIKLTAwMDAwMDFjIEBJQyswQDAwZmZmZglAT0NAIHIwLHIxLC0xCi0wMDAwMDAyMCBASUMrMEAxZjg1ZmYJQE9DQCByMCwtMSxyMgotMDAwMDAwMjQgQElDKzdAZTA4NWZmCUBPQ0AgLTEscjEscjIKLTAwMDAwMDI4IEBJQyswQDAwZmVmZglAT0NAIHIwLHIxLDI1NQotMDAwMDAwMmMgQElDKzBAMWY4NGZmCUBPQ0AgcjAsMjU1LHIyCi0wMDAwMDAzMCBASUMrN0BlMDg0ZmYJQE9DQCAyNTUscjEscjIKLTAwMDAwMDM0IEBJQyswQDAwZmYwMAlAT0NAIHIwLHIxLC0yNTYKLTAwMDAwMDM4IEBJQyswQDFmODUwMAlAT0NAIHIwLC0yNTYscjIKLTAwMDAwMDNjIEBJQys3QGUwODUwMAlAT0NAIC0yNTYscjEscjIKLTAwMDAwMDQwIEBJQyswQDAwZmMwMAlAT0NAIHIwLHIxLDI1NgotMDAwMDAwNDggQElDKzBAMWYwNDAwCUBPQ0AgcjAsLTI1NyxyMgotMDAwMDAwNTAgQElDKzdAYzA4NDAwCUBPQ0AgNTExLHIxLHIyCi0wMDAwMDA1OCBASUMrMEAxZjA0MDAJQE9DQCByMCwxMTExNjM4NTk0LHIyCi0wMDAwMDA2MCBASUMrN0BjMGZjMDAJQE9DQCAzMDU0MTk4OTYscjEsMzA1NDE5ODk2Ci0wMDAwMDA2OCBASUMrMEAxZmZjZmYJQE9DQCByMCwyNTUsMjU2Ci0wMDAwMDA3MCBASUMrMEAxZjdlZmYJQE9DQCByMCwyNTYsMjU1Ci0wMDAwMDA3OCBASUMrN0BlMGZjZmYJQE9DQCAyNTUscjEsMjU2Ci0wMDAwMDA4MCBASUMrN0BmZjA0ZmYJQE9DQCAyNTUsMjU2LHIyCi0wMDAwMDA4OCBASUMrN0BjMGZlZmYJQE9DQCAyNTYscjEsMjU1Ci0wMDAwMDA5MCBASUMrN0BkZjg0ZmYJQE9DQCAyNTYsMjU1LHIyCi0wMDAwMDA5OCBASUMrMEAwMGZjMDAJQE9DQCByMCxyMSwwCi0JCVJFTE9DOiAwMDAwMDA5YyBSX0FSQ18zMiBmb28KLTAwMDAwMGEwIEBJQyswQDAwODQwMAlAT0NAIHIwLHIxLHIyCi0wMDAwMDBhNCBASUMrMEA2MjBhMDAJQE9DQCByMyxyNCxyNQotMDAwMDAwYTggQElDKzBAYzM5MDAxCUBPQ0AuZXEgcjYscjcscjgKLTAwMDAwMGFjIEBJQysxQDI1MTYwMQlAT0NALmVxIHI5LHIxMCxyMTEKLTAwMDAwMGIwIEBJQysxQDg2OWMwMglAT0NALm5lIHIxMixyMTMscjE0Ci0wMDAwMDBiNCBASUMrMUBlODIyMDIJQE9DQC5uZSByMTUscjE2LHIxNwotMDAwMDAwYjggQElDKzJANDlhODAzCUBPQ0AucCByMTgscjE5LHIyMAotMDAwMDAwYmMgQElDKzJAYWIyZTAzCUBPQ0AucCByMjEscjIyLHIyMwotMDAwMDAwYzAgQElDKzNAMGNiNDA0CUBPQ0AubiByMjQscjI1LHIyNgotMDAwMDAwYzQgQElDKzNANmUzYTA0CUBPQ0AubiBmcCxzcCxpbGluazEKLTAwMDAwMGM4IEBJQyszQGNmYzAwNQlAT0NALmMgaWxpbmsyLGJsaW5rLHIzMgotMDAwMDAwY2MgQElDKzRAMzE0NjA1CUBPQ0AuYyByMzMscjM0LHIzNQotMDAwMDAwZDAgQElDKzRAOTJjYzA1CUBPQ0AuYyByMzYscjM3LHIzOAotMDAwMDAwZDQgQElDKzRAZjQ1MjA2CUBPQ0AubmMgcjM5LHI0MCxyNDEKLTAwMDAwMGQ4IEBJQys1QDU1ZDgwNglAT0NALm5jIHI0MixyNDMscjQ0Ci0wMDAwMDBkYyBASUMrNUBiNzVlMDYJQE9DQC5uYyByNDUscjQ2LHI0NwotMDAwMDAwZTAgQElDKzZAMThlNDA3CUBPQ0AudiByNDgscjQ5LHI1MAotMDAwMDAwZTQgQElDKzZAN2E2YTA3CUBPQ0AudiByNTEscjUyLHI1MwotMDAwMDAwZTggQElDKzZAZGJmMDA4CUBPQ0AubnYgcjU0LHI1NSxyNTYKLTAwMDAwMGVjIEBJQys3QDNkNzYwOAlAT0NALm52IHI1NyxyNTgscjU5Ci0wMDAwMDBmMCBASUMrN0A5ZTAwMDkJQE9DQC5ndCBscF9jb3VudCxscF9jb3VudCxyMAotMDAwMDAwZjQgQElDKzBAMDA3YzBhCUBPQ0AuZ2UgcjAscjAsMAotMDAwMDAwZmMgQElDKzBAM2YwMjBiCUBPQ0AubHQgcjEsMSxyMQotMDAwMDAxMDQgQElDKzdAYzA4NDBjCUBPQ0AubGUgMixyMSxyMgotMDAwMDAxMGMgQElDKzBAN2YwNjBkCUBPQ0AuaGkgcjMsMyxyMwotMDAwMDAxMTQgQElDKzdAZGYwODBlCUBPQ0AubHMgNCw0LHI0Ci0wMDAwMDExYyBASUMrN0BjMmZjMGYJQE9DQC5wbnogNSxyNSw1Ci0wMDAwMDEyNCBASUMrMEAwMDg1MDAJQE9DQC5mIHIwLHIxLHIyCi0wMDAwMDEyOCBASUMrMEAwMGZhMDEJQE9DQC5mIHIwLHIxLDEKLTAwMDAwMTJjIEBJQyswQDFlODQwMQlAT0NALmYgcjAsMSxyMgotMDAwMDAxMzAgQElDKzdAYTA4NDAwCUBPQ0AuZiAwLHIxLHIyCi0wMDAwMDEzNCBASUMrMEAwMGZkMDAJQE9DQC5mIHIwLHIxLDUxMgotMDAwMDAxM2MgQElDKzBAMWYwNTAwCUBPQ0AuZiByMCw1MTIscjIKLTAwMDAwMTQ0IEBJQys3QGMwODUwMAlAT0NALmYgNTEyLHIxLHIyCi0wMDAwMDE0YyBASUMrMEAwMDg1MDEJQE9DQC5lcS5mIHIwLHIxLHIyCi0wMDAwMDE1MCBASUMrMEAwMGZkMDIJQE9DQC5uZS5mIHIwLHIxLDAKLTAwMDAwMTU4IEBJQyswQDFmMDUwYglAT0NALmx0LmYgcjAsMCxyMgotMDAwMDAxNjAgQElDKzdAYzA4NTA5CUBPQ0AuZ3QuZiAwLHIxLHIyCi0wMDAwMDE2OCBASUMrMEAwMGZkMGMJQE9DQC5sZS5mIHIwLHIxLDUxMgotMDAwMDAxNzAgQElDKzBAMWYwNTBhCUBPQ0AuZ2UuZiByMCw1MTIscjIKLTAwMDAwMTc4IEBJQys3QGMwODUwNAlAT0NALm4uZiA1MTIscjEscjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUxNjlhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIEBPQ0AgdGVzdAotCi0jIFN0YXkgYXdheSBmcm9tIG9wZXJhbmRzIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50cyAoZWc6CWFkZCByMCxyMSxyMSkuCi0jIFRoZXkgd2lsbCBiZSBkaXNhc3NlbWJsZWQgYXMgdGhleSdyZSBtYWNybyBjb3VudGVycGFydHMgKGVnOiBhc2wgcjAscjEpLgotCi0jIHJlZyxyZWcscmVnCi0JQE9DQCByMCxyMSxyMgotCUBPQ0AgcjI2LGZwLHNwCi0JQE9DQCBpbGluazEsaWxpbmsyLGJsaW5rCi0JQE9DQCByNTgscjU5LGxwX2NvdW50Ci0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCxyMSwwCi0JQE9DQCByMCwwLHIyCi0JQE9DQCAwLHIxLHIyCi0JQE9DQCByMCxyMSwtMQotCUBPQ0AgcjAsLTEscjIKLQlAT0NAIC0xLHIxLHIyCi0JQE9DQCByMCxyMSwyNTUKLQlAT0NAIHIwLDI1NSxyMgotCUBPQ0AgMjU1LHIxLHIyCi0JQE9DQCByMCxyMSwtMjU2Ci0JQE9DQCByMCwtMjU2LHIyCi0JQE9DQCAtMjU2LHIxLHIyCi0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHIwLHIxLDI1NgotCUBPQ0AgcjAsLTI1NyxyMgotCUBPQ0AgNTExLHIxLHIyCi0JQE9DQCByMCwweDQyNDI0MjQyLHIyCi0JQE9DQCAweDEyMzQ1Njc4LHIxLDB4MTIzNDU2NzgKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgcjAsMjU1LDI1NgotCUBPQ0AgcjAsMjU2LDI1NQotCUBPQ0AgMjU1LHIxLDI1NgotCUBPQ0AgMjU1LDI1NixyMgotCUBPQ0AgMjU2LHIxLDI1NQotCUBPQ0AgMjU2LDI1NSxyMgotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLHIxLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuYWwgcjAscjEscjIKLQlAT0NALnJhIHIzLHI0LHI1Ci0JQE9DQC5lcSByNixyNyxyOAotCUBPQ0AueiByOSxyMTAscjExCi0JQE9DQC5uZSByMTIscjEzLHIxNAotCUBPQ0AubnogcjE1LHIxNixyMTcKLQlAT0NALnBsIHIxOCxyMTkscjIwCi0JQE9DQC5wIHIyMSxyMjIscjIzCi0JQE9DQC5taSByMjQscjI1LHIyNgotCUBPQ0AubiByMjcscjI4LHIyOQotCUBPQ0AuY3MgcjMwLHIzMSxyMzIKLQlAT0NALmMgcjMzLHIzNCxyMzUKLQlAT0NALmxvIHIzNixyMzcscjM4Ci0JQE9DQC5jYyByMzkscjQwLHI0MQotCUBPQ0AubmMgcjQyLHI0MyxyNDQKLQlAT0NALmhzIHI0NSxyNDYscjQ3Ci0JQE9DQC52cyByNDgscjQ5LHI1MAotCUBPQ0AudiByNTEscjUyLHI1MwotCUBPQ0AudmMgcjU0LHI1NSxyNTYKLQlAT0NALm52IHI1NyxyNTgscjU5Ci0JQE9DQC5ndCByNjAscjYwLHIwCi0JQE9DQC5nZSByMCxyMCwwCi0JQE9DQC5sdCByMSwxLHIxCi0JQE9DQC5sZSAyLHIxLHIyCi0JQE9DQC5oaSByMywzLHIzCi0JQE9DQC5scyA0LDQscjQKLQlAT0NALnBueiA1LHI1LDUKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEscjIKLQlAT0NALmYgcjAscjEsMQotCUBPQ0AuZiByMCwxLHIyCi0JQE9DQC5mIDAscjEscjIKLQlAT0NALmYgcjAscjEsNTEyCi0JQE9DQC5mIHIwLDUxMixyMgotCUBPQ0AuZiA1MTIscjEscjIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEscjIKLQlAT0NALm5lLmYgcjAscjEsMAotCUBPQ0AubHQuZiByMCwwLHIyCi0JQE9DQC5ndC5mIDAscjEscjIKLQlAT0NALmxlLmYgcjAscjEsNTEyCi0JQE9DQC5nZS5mIHIwLDUxMixyMgotCUBPQ0Aubi5mIDUxMixyMSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIwN2E3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBAT0NACi0KLSMgVGVzdCB0aGUgQE9DQCBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxODAwQEkzKzgwQDAwCUBPQ0AgcjAscjEKLTAwMDAwMDA0IDFiNmVASTMrMDBAMDAJQE9DQCBmcCxzcAotMDAwMDAwMDggMTgxZkBJMys4MEAwMAlAT0NAIHIwLDAKLTAwMDAwMDBjIDE4M2ZASTMrODFAZmYJQE9DQCByMSwtMQotMDAwMDAwMTAgMWZlMUBJMyswMEAwMAlAT0NAIDAscjIKLTAwMDAwMDE0IDFmZTFASTMrODFAZmYJQE9DQCAtMSxyMwotMDAwMDAwMTggMTg5ZkBJMys4MEBmZglAT0NAIHI0LDI1NQotMDAwMDAwMWMgMWZlMkBJMys4MEBmZglAT0NAIDI1NSxyNQotMDAwMDAwMjAgMThkZkBJMys4MUAwMAlAT0NAIHI2LC0yNTYKLTAwMDAwMDI0IDFmZTNASTMrODFAMDAJQE9DQCAtMjU2LHI3Ci0wMDAwMDAyOCAxOTFmQEkzKzAwQDAwCUBPQ0AgcjgsMjU2Ci0wMDAwMDAzMCAxOTNmQEkzKzAwQDAwCUBPQ0AgcjksLTI1NwotMDAwMDAwMzggMWZjNUBJMyswMEAwMAlAT0NAIDUxMSxyMTAKLTAwMDAwMDQwIDE5N2ZASTMrMDBAMDAJQE9DQCByMTEsMTExMTYzODU5NAotMDAwMDAwNDggMWZjNkBJMyswMEAwMAlAT0NAIDMwNTQxOTg5NixyMTIKLTAwMDAwMDUwIDFmZmZASTMrMDBAZmYJQE9DQCAyNTUsMjU2Ci0wMDAwMDA1OCAxZmRmQEkzKzgwQGZmCUBPQ0AgMjU2LDI1NQotMDAwMDAwNjAgMTgxZkBJMyswMEAwMAlAT0NAIHIwLDAKLQkJUkVMT0M6IDAwMDAwMDY0IFJfQVJDXzMyIGZvbwotMDAwMDAwNjggMTk0NUBJMys4MEAwMQlAT0NALmVxIHIxMCxyMTEKLTAwMDAwMDZjIDE5ODZASTMrODBAMDIJQE9DQC5uZSByMTIscjEzCi0wMDAwMDA3MCAxOWRmQEkzKzAwQDBiCUBPQ0AubHQgcjE0LDAKLTAwMDAwMDc4IDE5ZmZASTMrMDBAMDkJQE9DQC5ndCByMTUsNTEyCi0wMDAwMDA4MCAxODAwQEkzKzgxQDAwCUBPQ0AuZiByMCxyMQotMDAwMDAwODQgMTg1ZUBJMys4MEAwMQlAT0NALmYgcjIsMQotMDAwMDAwODggMWZhMkBJMyswMEAwMAlAT0NALmYgMCxyNAotMDAwMDAwOGMgMThiZkBJMyswMUAwMAlAT0NALmYgcjUsNTEyCi0wMDAwMDA5NCAxZmMzQEkzKzAxQDAwCUBPQ0AuZiA1MTIscjYKLTAwMDAwMDljIDFmZGZASTMrMDFAMDAJQE9DQC5mIDUxMiw1MTIKLTAwMDAwMGE0IDE4MDBASTMrODFAMDEJQE9DQC5lcS5mIHIwLHIxCi0wMDAwMDBhOCAxODNmQEkzKzAxQDAyCUBPQ0AubmUuZiByMSwwCi0wMDAwMDBiMCAxZmMxQEkzKzAxQDBiCUBPQ0AubHQuZiAwLHIyCi0wMDAwMDBiOCAxZmMxQEkzKzAxQDA5CUBPQ0AuZ3QuZiAxLHIyCi0wMDAwMDBjMCAxODFmQEkzKzAxQDBjCUBPQ0AubGUuZiByMCw1MTIKLTAwMDAwMGM4IDFmYzFASTMrMDFAMGEJQE9DQC5nZS5mIDUxMixyMgotMDAwMDAwZDAgMWZkZkBJMyswMUAwNAlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmE2NjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBTaW5nbGUgc2hpZnQgQE9DQCB0ZXN0Ci0KLSMgcmVnLHJlZwotCUBPQ0AgcjAscjEKLQlAT0NAIGZwLHNwCi0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCwwCi0JQE9DQCByMSwtMQotCUBPQ0AgMCxyMgotCUBPQ0AgLTEscjMKLQlAT0NAIHI0LDI1NQotCUBPQ0AgMjU1LHI1Ci0JQE9DQCByNiwtMjU2Ci0JQE9DQCAtMjU2LHI3Ci0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHI4LDI1NgotCUBPQ0AgcjksLTI1NwotCUBPQ0AgNTExLHIxMAotCUBPQ0AgcjExLDB4NDI0MjQyNDIKLQlAT0NAIDB4MTIzNDU2NzgscjEyCi0KLSMgc2hpbW0gYW5kIGxpbW0KLQlAT0NAIDI1NSwyNTYKLQlAT0NAIDI1NiwyNTUKLQotIyBzeW1ib2xzCi0JQE9DQCByMCxmb28KLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24KLQlAT0NALmVxIHIxMCxyMTEKLQlAT0NALm5lIHIxMixyMTMKLQlAT0NALmx0IHIxNCwwCi0JQE9DQC5ndCByMTUsNTEyCi0KLSMgZmxhZyBzZXR0aW5nCi0JQE9DQC5mIHIwLHIxCi0JQE9DQC5mIHIyLDEKLQlAT0NALmYgMCxyNAotCUBPQ0AuZiByNSw1MTIKLQlAT0NALmYgNTEyLHI2Ci0JQE9DQC5mIDUxMiw1MTIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEKLQlAT0NALm5lLmYgcjEsMAotCUBPQ0AubHQuZiAwLHIyCi0JQE9DQC5ndC5mIDEscjIKLQlAT0NALmxlLmYgcjAsNTEyCi0JQE9DQC5nZS5mIDUxMixyMgotCUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTk5YTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3Qvc3IKLQotIyBUZXN0IHRoZSBzdC9zciBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxMDAwODAwMAlzdCByMCxcW3IxXF0KLTAwMDAwMDA0IDEwMDMwYTAxCXN0IHI1LFxbcjYsMVxdCi0wMDAwMDAwOCAxMDA0MGZmZglzdCByNyxcW3I4LC0xXF0KLTAwMDAwMDBjIDEwMDUxMmZmCXN0IHI5LFxbcjEwLDI1NVxdCi0wMDAwMDAxMCAxMDA2MTcwMAlzdCByMTEsXFtyMTIsLTI1NlxdCi0wMDAwMDAxNCAxMDFmMjYwMAlzdCByMTksXFswXF0KLQkJUkVMT0M6IDAwMDAwMDE4IFJfQVJDXzMyIGZvbwotMDAwMDAwMWMgMTAxZjI4MDAJc3QgcjIwLFxbNFxdCi0JCVJFTE9DOiAwMDAwMDAyMCBSX0FSQ18zMiBmb28KLTAwMDAwMDI0IDEwNWYwMDAwCXN0YiByMCxcWzBcXQotMDAwMDAwMmMgMTA5ZjAwMDAJc3R3IHIwLFxbMFxdCi0wMDAwMDAzNCAxMTFmMDAwMAlzdC5hIHIwLFxbMFxdCi0wMDAwMDAzYyAxNDFmMDAwMAlzdC5kaSByMCxcWzBcXQotMDAwMDAwNDQgMTU0MDAwMDAJc3RiLmEuZGkgcjAsXFtyMFxdCi0wMDAwMDA0OCAxMjAwODAwMAlzciByMCxcW3IxXF0KLTAwMDAwMDRjIDEyMWY4NDAwCXNyIHIyLFxbc3RhdHVzXF0KLTAwMDAwMDUwIDEyMWYwNjAwCXNyIHIzLFxbMzA1NDE5ODk2XF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWYxOTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIHN0L3NyIHRlc3QKLQkKLQlzdAlyMCxbcjFdCi0Jc3QJcjUsW3I2LDFdCi0Jc3QJcjcsW3I4LC0xXQotCXN0CXI5LFtyMTAsMjU1XQotCXN0CXIxMSxbcjEyLC0yNTZdCi0Jc3QJcjE5LFtmb29dCi0Jc3QJcjIwLFtmb28rNF0KLQotCXN0YglyMCxbMF0KLQlzdHcJcjAsWzBdCi0Jc3QuYQlyMCxbMF0KLQlzdC5kaQlyMCxbMF0KLQlzdGIuYS5kaSByMCxbcjBdCi0KLQlzcglyMCxbcjFdCi0Jc3IJcjIsW3N0YXR1c10KLQlzcglyMyxbMHgxMjM0NTY3OF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmZjEyNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIFRlc3QgYXNzZW1ibGVyIHdhcm5pbmdzLgotCi1pZiBbaXN0YXJnZXQgYXJjKi0qLSpdIHsKLQotICAgIGxvYWRfbGliIGdhcy1kZy5leHAKLQotICAgIGRnLWluaXQKLQotICAgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci93YXJuKi5zXV0gIiIgIiIKLQotICAgIGRnLWZpbmlzaAotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjYjQzNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IEFSQyBzcGVjaWZpYyBhc3NlbWJsZXIgd2FybmluZ3MKLTsKLTsgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBhcmMtKi0qIH0gfQotCi0JYi5kIGZvbwotCW1vdiByMCwyNTYJOyB7IGRnLXdhcm5pbmcgIjggYnl0ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IiAiOCBieXRlIGluc24gaW4gZGVsYXkgc2xvdCIgfQotCi0Jai5kIGZvbwkJOyB7IGRnLXdhcm5pbmcgIjggYnl0ZSBqdW1wIGluc3RydWN0aW9uIHdpdGggZGVsYXkgc2xvdCIgIjggYnl0ZSBqdW1wIHdpdGggZGVsYXkgc2xvdCIgfQotCW1vdiByMCxyMQotCi0Jc3ViLmYgMCxyMCxyMgotCWJlcSBmb28JCTsgeyBkZy13YXJuaW5nICJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiICJjYyBzZXQvYnJhbmNoIG5vcCB0ZXN0IiB9Ci0KLWZvbzoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyOGY3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJjaDR0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0udGV4dAotLmFsaWduIDAKLQkKLQlieAlyMAotCWJ4ZXEJcjEKLQotZm9vOgkKLQlsZHJoCXIzLCBmb28KLQlsZHJzaAlyNCwgW3I1XQotCWxkcnNiCXI0LCBbcjEsIHIzXQotCWxkcnNoCXIxLCBbcjQsIHI0XSEKLQlsZHJlcXNiCXIxLCBbcjUsIC1yM10KLQlsZHJuZWgJcjIsIFtyNl0sIHI3Ci0JbGRyY2NzaCByMiwgW3I3XSwgK3I4Ci0JbGRyc2IJcjIsIFtyMywgIzI1NV0KLQlsZHJzaAlyMSwgW3I0LCAjLTI1MF0KLQlsZHJzYglyMSwgW3I1LCAjKzI0MF0KLQotCXN0cmgJcjIsIGJhcgotCXN0cm5laAlyMywgW3IzXQotYmFyOgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxYzU0ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgU29tZSBBUk0gdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBhcm0tKi0qXSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJpbnN0IgotCi0gICAgZ2FzX3Rlc3QgImFybTMucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSAzIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcm02LnMiICIiICRzdGRvcHRsaXN0ICJBcm0gNiBpbnN0cnVjdGlvbnMiCi0KLSAgICBnYXNfdGVzdCAiYXJtN2RtLnMiICIiICRzdGRvcHRsaXN0ICJBcm0gN0RNIGluc3RydWN0aW9ucyIKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImFybTd0IgotCi0gICAgZ2FzX3Rlc3QgInRodW1iLnMiICIiICRzdGRvcHRsaXN0ICJUaHVtYiBpbnN0cnVjdGlvbnMiCi0KLSAgICBnYXNfdGVzdCAiYXJjaDR0LnMiICIiICRzdGRvcHRsaXN0ICJBcm0gYXJjaGl0ZWN0dXJlIDR0IGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJjb3Byby5zIiAiIiAkc3Rkb3B0bGlzdCAiQ28gcHJvY2Vzc29yIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJpbW1lZC5zIiAiIiAkc3Rkb3B0bGlzdCAiaW1tZWRpYXRlIGV4cHJlc3Npb25zIgotCi0gICAgZ2FzX3Rlc3QgImZsb2F0LnMiICIiICRzdGRvcHRsaXN0ICJDb3JlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyIKLX0KLQotIyBOb3QgYWxsIGFybSB0YXJnZXRzIGFyZSBiaS1lbmRpYW4sIHNvIG9ubHkgcnVuIHRoaXMgdGVzdCBvbiBvbmVzCi0jIHdlIGtub3cgdGhhdCBhcmUuICBGSVhNRTogV2Ugc2hvdWxkIHByb2JhYmx5IGFsc28ga2V5IG9mZiBhcm1lYi9hcm1lbC4KLQotaWYgW2lzdGFyZ2V0IGFybS0qLXBlXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAibGUtZnBjb25zdCIKLQotICAgICMgU2luY2UgYmlnLWVuZGlhbiBudW1iZXJzIGhhdmUgdGhlIG5vcm1hbCBmb3JtYXQsIHRoaXMgZG9lc24ndCBleGlzdC4KLSAgICAjcnVuX2R1bXBfdGVzdCAiYmUtZnBjb25zdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNmOTE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCXN3cAlyMCwgcjEsIFtyOF0KLQlzd3BiCXIyLCByMywgW3IzXQotCXN3cGdlYglyNCwgcjEsIFtyNF0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm02LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTE3MTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCW1ycwlyOCwgY3BzcgotCW1yc2VxCXI5LCBjcHNyX2FsbAotCW1ycwlyMiwgc3BzcgotCi0JbXNyCWNwc3IsIHIxCi0JbXNybmUJY3Bzcl9mbGcsICMweGYwMDAwMDAwCi0JbXNyCXNwc3JfZmxnLCByOAotCW1zcglzcHNyX2FsbCwgcjkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk2YzcwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03ZG0ucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCXNtdWxsCXIwLCByMSwgcjIsIHIzCi0JdW11bGwJcjAsIHIxLCByMiwgcjMKLQlzbWxhbAlyMCwgcjEsIHIyLCByMwotCXVtbGFsCXIwLCByMSwgcjQsIHIzCi0KLQlzbXVsbG5lCXIwLCByMSwgcjMsIHI0Ci0Jc211bGxzCXIxLCByMCwgcjksIHIxMQotCXVtbGFsZXFzIHIyLCByOSwgcjQsIHI5Ci0Jc21sYWxnZSByMTQsIHIxMCwgcjgsIHIxNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0YzgzYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IEFSTSBhcm03dAotI2FzOiAtbWFybTd0IC1FTAotCi0jIFRlc3QgdGhlIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5kIG1lbW9yeSB0cmFuc2ZlcnM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgPFtePl0qPiBlMWQxMDBiMCA/CWxkcmgJcjAsIFxbcjFcXQotMDAwMDAwMDQgPFtePl0qPiBlMWYxMDBiMCA/CWxkcmgJcjAsIFxbcjFcXSEKLTAwMDAwMDA4IDxbXj5dKj4gZTE5MTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDAwYyA8W14+XSo+IGUxYjEwMGIyID8JbGRyaAlyMCwgXFtyMSwgcjJcXSEKLTAwMDAwMDEwIDxbXj5dKj4gZTFkMTAwYmMgPwlsZHJoCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwMTQgPFtePl0qPiBlMWYxMDBiYyA/CWxkcmgJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwMTggPFtePl0qPiBlMTUxMDBiYyA/CWxkcmgJcjAsIFxbcjEsIC0jMTJcXQotMDAwMDAwMWMgPFtePl0qPiBlMDkxMDBiMiA/CWxkcmgJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDIwIDxbXj5dKj4gZTNhMDBjZmYgPwltb3YJcjAsICM2NTI4MAotMDAwMDAwMjQgPFtePl0qPiBlMWRmMGJiNCA/CWxkcmgJcjAsIFxbcGMsICNiNFxdCTsgMDAwMDAwZTAgPFtePl0qPgotMDAwMDAwMjggPFtePl0qPiBlMWRmMGFiYyA/CWxkcmgJcjAsIFxbcGMsICNhY1xdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwMmMgPFtePl0qPiBlMWMxMDBiMCA/CXN0cmgJcjAsIFxbcjFcXQotMDAwMDAwMzAgPFtePl0qPiBlMWUxMDBiMCA/CXN0cmgJcjAsIFxbcjFcXSEKLTAwMDAwMDM0IDxbXj5dKj4gZTE4MTAwYjIgPwlzdHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDAzOCA8W14+XSo+IGUxYTEwMGIyID8Jc3RyaAlyMCwgXFtyMSwgcjJcXSEKLTAwMDAwMDNjIDxbXj5dKj4gZTFjMTAwYmMgPwlzdHJoCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwNDAgPFtePl0qPiBlMWUxMDBiYyA/CXN0cmgJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwNDQgPFtePl0qPiBlMTQxMDBiYyA/CXN0cmgJcjAsIFxbcjEsIC0jMTJcXQotMDAwMDAwNDggPFtePl0qPiBlMDgxMDBiMiA/CXN0cmgJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDRjIDxbXj5dKj4gZTFjZjA4YjggPwlzdHJoCXIwLCBcW3BjLCAjODhcXQk7IDAwMDAwMGRjIDxbXj5dKj4KLTAwMDAwMDUwIDxbXj5dKj4gZTFkMTAwZDAgPwlsZHJzYglyMCwgXFtyMVxdCi0wMDAwMDA1NCA8W14+XSo+IGUxZjEwMGQwID8JbGRyc2IJcjAsIFxbcjFcXSEKLTAwMDAwMDU4IDxbXj5dKj4gZTE5MTAwZDIgPwlsZHJzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwNWMgPFtePl0qPiBlMWIxMDBkMiA/CWxkcnNiCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwNjAgPFtePl0qPiBlMWQxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwNjQgPFtePl0qPiBlMWYxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAjMTJcXSEKLTAwMDAwMDY4IDxbXj5dKj4gZTE1MTAwZGMgPwlsZHJzYglyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDA2YyA8W14+XSo+IGUwOTEwMGQyID8JbGRyc2IJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDcwIDxbXj5dKj4gZTNhMDAwZGUgPwltb3YJcjAsICMyMjIKLTAwMDAwMDc0IDxbXj5dKj4gZTFkZjA2ZDAgPwlsZHJzYglyMCwgXFtwYywgIzYwXF0JOyAwMDAwMDBkYyA8W14+XSo+Ci0wMDAwMDA3OCA8W14+XSo+IGUxZDEwMGYwID8JbGRyc2gJcjAsIFxbcjFcXQotMDAwMDAwN2MgPFtePl0qPiBlMWYxMDBmMCA/CWxkcnNoCXIwLCBcW3IxXF0hCi0wMDAwMDA4MCA8W14+XSo+IGUxOTEwMGYyID8JbGRyc2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMDg0IDxbXj5dKj4gZTFiMTAwZjIgPwlsZHJzaAlyMCwgXFtyMSwgcjJcXSEKLTAwMDAwMDg4IDxbXj5dKj4gZTFkMTAwZmMgPwlsZHJzaAlyMCwgXFtyMSwgIzEyXF0KLTAwMDAwMDhjIDxbXj5dKj4gZTFmMTAwZmMgPwlsZHJzaAlyMCwgXFtyMSwgIzEyXF0hCi0wMDAwMDA5MCA8W14+XSo+IGUxNTEwMGZjID8JbGRyc2gJcjAsIFxbcjEsIC0jMTJcXQotMDAwMDAwOTQgPFtePl0qPiBlMDkxMDBmMiA/CWxkcnNoCXIwLCBcW3IxXF0sIHIyCi0wMDAwMDA5OCA8W14+XSo+IGUzYTAwY2ZmID8JbW92CXIwLCAjNjUyODAKLTAwMDAwMDljIDxbXj5dKj4gZTFkZjAzZmMgPwlsZHJzaAlyMCwgXFtwYywgIzNjXF0JOyAwMDAwMDBlMCA8W14+XSo+Ci0wMDAwMDBhMCA8W14+XSo+IGUxZGYwM2Y0ID8JbGRyc2gJcjAsIFxbcGMsICMzNFxdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwYTQgPFtePl0qPiBlMTkxMDBiMiA/CWxkcmgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGE4IDxbXj5dKj4gMTE5MTAwYjIgPwlsZHJuZWgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGFjIDxbXj5dKj4gODE5MTAwYjIgPwlsZHJoaWgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGIwIDxbXj5dKj4gYjE5MTAwYjIgPwlsZHJsdGgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGI0IDxbXj5dKj4gZTE5MTAwZjIgPwlsZHJzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYjggPFtePl0qPiAxMTkxMDBmMiA/CWxkcm5lc2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGJjIDxbXj5dKj4gODE5MTAwZjIgPwlsZHJoaXNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBjMCA8W14+XSo+IGIxOTEwMGYyID8JbGRybHRzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYzQgPFtePl0qPiBlMTkxMDBkMiA/CWxkcnNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBjOCA8W14+XSo+IDExOTEwMGQyID8JbGRybmVzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwY2MgPFtePl0qPiA4MTkxMDBkMiA/CWxkcmhpc2IJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGQwIDxbXj5dKj4gYjE5MTAwZDIgPwlsZHJsdHNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBkNCA8W14+XSo+IGUxZGYwMGY0ID8JbGRyc2gJcjAsIFxbcGMsICM0XF0JOyAwMDAwMDBlMCA8W14+XSo+Ci0wMDAwMDBkOCA8W14+XSo+IGUxZGYwMGY0ID8JbGRyc2gJcjAsIFxbcGMsICM0XF0JOyAwMDAwMDBlNCA8W14+XSo+Ci0wMDAwMDBkYyA8W14+XSo+IDAwMDAwMDAwID8JYW5kZXEJcjAsIHIwLCByMAotWwkJXSpkYzouKi5yZGF0YQotMDAwMDAwZTAgPFtePl0qPiAwMDAwYzBkZSA/CS4qCi0wMDAwMDBlNCA8W14+XSo+IDAwMDBkZWFkID8JLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NmU5MGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0JLnNlY3Rpb24JLnJkYXRhCi0JLmFsaWduCTAKLS5MQzA6Ci0JLmFzY2lpCSJzb21lIGRhdGFcMDAwIgotCi0JLnRleHQKLQkuYWxpZ24JMAotCi1sb2FkaGFsZndvcmRzOgotCWxkcmgJcjAsIFtyMV0KLQlsZHJoCXIwLCBbcjFdIQotCWxkcmgJcjAsIFtyMSwgcjJdCi0JbGRyaAlyMCwgW3IxLCByMl0hCi0JbGRyaAlyMCwgW3IxLCMweDBDXQotCWxkcmgJcjAsIFtyMSwjMHgwQ10hCi0JbGRyaAlyMCwgW3IxLCMtMHgwQ10KLQlsZHJoCXIwLCBbcjFdLCByMgotCWxkcmgJcjAsID0weEZGMDAKLQlsZHJoCXIwLCA9MHhDMERFCi0JbGRyaAlyMCwgLkwyCi0KLXN0b3JlaGFsZndvcmRzOgotCXN0cmgJcjAsIFtyMV0KLQlzdHJoCXIwLCBbcjFdIQotCXN0cmgJcjAsIFtyMSwgcjJdCi0Jc3RyaAlyMCwgW3IxLCByMl0hCi0Jc3RyaAlyMCwgW3IxLCMweDBDXQotCXN0cmgJcjAsIFtyMSwjMHgwQ10hCi0Jc3RyaAlyMCwgW3IxLCMtMHgwQ10KLQlzdHJoCXIwLCBbcjFdLCByMgotCXN0cmgJcjAsIC5MMgotCi1sb2Fkc2lnbmVkYnl0ZXM6Ci0JbGRyc2IJcjAsIFtyMV0KLQlsZHJzYglyMCwgW3IxXSEKLQlsZHJzYglyMCwgW3IxLCByMl0KLQlsZHJzYglyMCwgW3IxLCByMl0hCi0JbGRyc2IJcjAsIFtyMSwjMHgwQ10KLQlsZHJzYglyMCwgW3IxLCMweDBDXSEKLQlsZHJzYglyMCwgW3IxLCMtMHgwQ10KLQlsZHJzYglyMCwgW3IxXSwgcjIKLQlsZHJzYglyMCwgPTB4REUKLQlsZHJzYglyMCwgLkwyCi0KLWxvYWRzaWduZWRoYWxmd29yZHM6Ci0JbGRyc2gJcjAsIFtyMV0KLQlsZHJzaAlyMCwgW3IxXSEKLQlsZHJzaAlyMCwgW3IxLCByMl0KLQlsZHJzaAlyMCwgW3IxLCByMl0hCi0JbGRyc2gJcjAsIFtyMSwgIzB4MENdCi0JbGRyc2gJcjAsIFtyMSwgIzB4MENdIQotCWxkcnNoCXIwLCBbcjEsICMtMHgwQ10KLQlsZHJzaAlyMCwgW3IxXSwgcjIKLQlsZHJzaAlyMCwgPTB4RkYwMAotCWxkcnNoCXIwLCA9MHhDMERFCi0JbGRyc2gJcjAsIC5MMgotCQotbWlzYzoKLQlsZHJhbGgJcjAsIFtyMSwgcjJdCi0JbGRybmVoCXIwLCBbcjEsIHIyXQotCWxkcmhpaAlyMCwgW3IxLCByMl0KLQlsZHJsdGgJcjAsIFtyMSwgcjJdCi0KLQlsZHJhbHNoCXIwLCBbcjEsIHIyXQotCWxkcm5lc2gJcjAsIFtyMSwgcjJdCi0JbGRyaGlzaAlyMCwgW3IxLCByMl0KLQlsZHJsdHNoCXIwLCBbcjEsIHIyXQotCi0JbGRyYWxzYglyMCwgW3IxLCByMl0KLQlsZHJuZXNiCXIwLCBbcjEsIHIyXQotCWxkcmhpc2IJcjAsIFtyMSwgcjJdCi0JbGRybHRzYglyMCwgW3IxLCByMl0KLQotCWxkcnNoCXIwLCA9MHhDMERFCi0JbGRyc2gJcjAsID0weERFQUQKLQotCS5hbGlnbgotLkwyOgotCS53b3JkCS5MQzAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9jb3Byby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2NvcHJvLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzliOTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2NvcHJvLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0udGV4dAotLmFsaWduIDAKLQljZHAJcDEsIDQsIGNyMSwgY3IyLCBjcjMKLQljZHBlcQk0LCAzLCBjMSwgYzQsIGNyNSwgNQotCi0JbGRjCTUsIGNyOSwgW3IzXQotCWxkY2wJMSwgY3IxNCwgW3IxLCAjMzJdCi0JbGRjbWkJMCwgY3IwLCBbcjIsICMxMDIwXSEKLQlsZGNwbGwJcDcsIGMxLCBbcjNdLCAjNjQKLQlsZGMJcDAsIGM4LCBmb28KLWZvbzoKLQotCXN0Ywk1LCBjcjAsIFtyM10KLQlzdGNsCTMsIGNyMTUsIFtyMCwgIzhdCi0Jc3RjZXEJcDQsIGNyMTIsIFtyMiwgIzEwMF0hCi0Jc3RjY2MJcDYsIGM4LCBbcjRdLCAjNDgKLQlzdGMJcDEsIGM3LCBiYXIKLWJhcjoKLQotCW1yYwkyLCAzLCByNSwgYzEsIGMyCi0JbXJjZ2UJcDQsIDUsIHIxNSwgY3IxLCBjcjIsIDcKLQotCW1jcglwNywgMSwgcjE1LCBjcjEsIGNyMQotCW1jcmx0CTUsIDEsIHI4LCBjcjIsIGNyOSwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhZWU5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0udGV4dAotLmFsaWduIDAKLQltdmZlCWYwLCBmMQotCW12ZmVxZQlmMywgZjUKLQltdmZlcWQJZjQsICMxLjAKLQltdmZzCWY0LCBmNwotCW12ZnNwCWYwLCBmMQotCW12ZmRtCWYzLCBmNAotCW12ZmV6CWY3LCBmNwotCi0JYWRmZQlmMCwgZjEsICMyLjAKLQlhZGZlcWUJZjEsIGYyLCAjMC41Ci0JYWRmc20JZjMsIGY0LCBmNQotCQotCXN1ZmQJZjAsIGYwLCAjMi4wCi0Jc3VmcwlmMSwgZjIsICMxMC4wCi0Jc3VmbmVleiBmMywgZjQsIGY1Ci0KLQlyc2ZzCWYxLCBmMSwgIzAuMAotCXJzZmRwCWYzLCBmMCwgIzUuMAotCXJzZmxlZAlmNywgZjYsIGYwCi0KLQltdWZkCWYwLCBmMCwgZjAKLQltdWZleglmMSwgZjIsICMzLjAKLQltdWZhbHMJZjAsIGYwLCAjNC4wCi0KLQlkdmZkCWYwLCBmMCwgIzEuMDAwMAotCWR2ZmV6CWYwLCBmMSwgIzEwZTAKLQlkdmZtaXNtIGYzLCBmNCwgZjUKLQotCXJkZmUJZjAsIGYxLCAjMS4wZTEKLQlyZGZzCWYzLCBmNywgIzBmMQotCXJkZmNjZHAJZjQsIGY0LCBmMwotCi0JcG93ZAlmMCwgZjIsIGYzCi0JcG93cwlmMSwgZjMsICMwZTFlMQotCXBvd2NzZXoJZjQsIGY3LCAjMQotCi0JcnB3cwlmNywgZjYsIGY3Ci0JcnB3ZXFkCWYwLCBmMSwgZjIKLQlycHdlbQlmMiwgZjIsIGYzCi0KLQlybWZkCWYxLCBmMiwgIzMKLQlybWZ2c3MJZjMsIGY0LCBmNAotCXJtZmVwCWY0LCBmNywgZjAKLQotCWZtbHMJZjAsIGYxLCBmMgotCWZtbGVxcwlmMSwgZjMsIGY1Ci0JZm1scGxzeglmNCwgZjYsIGYwCi0KLQlmZHZzCWYxLCBmMywgIzEwCi0JZmR2c3AJZjAsIGYxLCBmMgotCWZkdmhzc20JZjQsIGY0LCBmNAotCi0JZnJkcwlmMSwgZjEsICMxLjAKLQlmcmRndHMJZjIsIGYxLCBmMAotCWZyZGd0c3oJZjQsIGY0LCBmNQotCi0JcG9sZAlmMCwgZjEsIGYyCi0JcG9sc3oJZjQsIGY2LCAjMy4wCi0JcG9sZXFlCWY1LCBmNiwgZjcKLQotCW1uZnMJZjAsIGYxCi0JbW5mZAlmMCwgIzMuMAotCW1uZmV6CWYwLCAjNC4wCi0JbW5mZXFleiBmMCwgZjUKLQltbmZzcAlmMCwgZjQKLQltbmZkbQlmMSwgZjcKLQotCWFic2QJZjAsIGYxCi0JYWJzc3AJZjEsICMzLjAKLQlhYnNlcWUJZjQsIGY1Ci0KLQlybmRzCWYxLCBmMgotCXJuZGQJZjMsIGY0Ci0Jcm5kZXFleglmNiwgIzQuMAotCi0Jc3F0cwlmNSwgZjUKLQlzcXRkcAlmNiwgZjYKLQlzcXRwbGV6IGY3LCBmNgotCi0JbG9ncwlmMCwgIzEwCi0JbG9nZQlmMCwgIzBmMTAKLQlsb2duZWR6CWYwLCBmMQotCi0JbGduZQlmMSwgZjIKLQlsZ25keglmMSwgZjMKLQlsZ252Y3MJZjMsIGY0Ci0KLQlleHBzCWYxLCBmMwotCWV4cGVtCWYzLCAjMTAuMAotCWV4cHBsZAlmNiwgZjcKLQotCXNpbmQJZjAsIGYxCi0Jc2luc20JZjEsIGYyCi0Jc2luZ3RlCWY0LCAjNQotCi0JY29zZAlmMSwgZjMKLQljb3NlbQlmNCwgZjUKLQljb3NuZWRwCWY2LCBmMQotCi0JdGFuZQlmMSwgZjUKLQl0YW5zeglmNCwgZjcKLQl0YW5nZWR6CWYxLCAjNC4wCi0KLQlhc25lCWY0LCBmNQotCWFzbnNwCWY2LCAjNWUtMQotCWFzbm1pZHoJZjUsIGY1Ci0KLQlhY3NzCWY1LCBmNgotCWFjc2QJZjYsIGYwCi0JYWNzaHNlbQlmMSwgIzAuMDVlMQotCi0JYXRuZQlmMCwgZjUKLQlhdG5zeglmMSwgIzUKLQlhdG5sdGQJZjMsIGYyCi0KLQl1cmRlCWY1LCBmNAotCW5ybWUJZjYsIGY1Ci0JbnJtcGxkeglmNywgZjUKLQotCWZsdHNwCWYwLCByOAotCWZsdGUJZjEsIHIwCi0JZmx0ZXFkeglmNSwgcjcKLQotCWZpeAlyMCwgZjEKLQlmaXh6CXIxLCBmNwotCWZpeGNzbQlyNSwgZjUKLQotCXdmYwlyMAotCXdmcwlyMQotCXJmc2VxCXIyCi0JcmZjCXI0Ci0KLQljbWYJZjAsICMxCi0JY21mCWYxLCBmMgotCWNtZmVxCWYwLCBmMQotCi0JY25mCWYwLCAjMwotCWNuZglmMSwgIzAuNQotCWNuZnZzCWYzLCBmNAotCi0JY21mZQlmMCwgZjEKLQljbWZlZXEJZjEsIGYyCi0JY21mZXFlCWYzLCAjNS4wCi0KLQljbmZlCWYxLCBmMwotCWNuZmVlcQlmMywgZjQKLQljbmZlcWUJZjQsIGY3Ci0JY25mYWxlCWY0LCAjNS4wCi0KLQlsZm0JZjAsIDQsIFtyMF0KLQlsZm0JZjAsIDQsIFtyMCwgIzBdCi0JbGZtCWYxLCA0LCBbcjEsICM2NF0KLQlzZm0JZjIsIDQsIFtyMTQsICMxMDIwXSEKLQlzZm1lcQlmNywgMywgW3I4XSwgIy0xMDIwCi0KLQlsZm1mZAlmNiwgMiwgW3IxNV0KLQlzZm1lYQlmNywgMSwgW3I4XSEKLQlsZm1lcWVhCWY1LCA0LCBbcjZdCi0Jc2ZtbmVmZAlmNCwgMywgW3IyXQotCXNmbW5lZmQJZjQsIDMsIFtyMl0hCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW1tZWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbW1lZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDIwOTJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbW1lZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotQAlUZXN0cyBmb3IgY29tcGxleCBpbW1lZGlhdGUgZXhwcmVzc2lvbnMgLSBub25lIG9mIHRoZXNlIG5lZWQgCi1ACXJlbG9jYXRpb25zCi0JLnRleHQKLWJhcjoKLQltb3YJcjAsICMwCi0JbW92CXIwLCAjKC4gLSBiYXIgLSA4KQotCWxkcglyMCwgYmFyCi0JbGRyCXIwLCBbcGMsICMgKGJhciAtIC4gLTgpXQotCS5zcGFjZSA0MDk2Ci0JbW92CXIwLCAjKC4gLSBiYXIgLSA4KSAmIDB4ZmYKLQlsZHIJcjAsIFtwYywgIyAoYmFyIC0gLiAtOCkgJiAweGZmXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2ZhZjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtLXNob3ctcmF3LWluc24KLSNuYW1lOiBBUk0gYmFzaWMgaW5zdHJ1Y3Rpb25zCi0jYXM6IC1tYXJtMiAtRUwKLQotIyBUZXN0IHRoZSBzdGFuZGFyZCBBUk0gaW5zdHJ1Y3Rpb25zOgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qYXJtLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDxbXj5dKj4gZTNhMDAwMDAgPwltb3YJcjAsICMwCi0wMDAwMDAwNCA8W14+XSo+IGUxYTAxMDAyID8JbW92CXIxLCByMgotMDAwMDAwMDggPFtePl0qPiBlMWEwMzE4NCA/CW1vdglyMywgcjQsIGxzbCAjMwotMDAwMDAwMGMgPFtePl0qPiBlMWEwNTczNiA/CW1vdglyNSwgcjYsIGxzciByNwotMDAwMDAwMTAgPFtePl0qPiBlMWEwOGE1OSA/CW1vdglyOCwgcjksIGFzciBzbAotMDAwMDAwMTQgPFtePl0qPiBlMWEwYmQxYyA/CW1vdglmcCwgaXAsIGxzbCBzcAotMDAwMDAwMTggPFtePl0qPiBlMWEwZTA2ZiA/CW1vdglsciwgcGMsIHJyeAotMDAwMDAwMWMgPFtePl0qPiBlMWEwMTAwMiA/CW1vdglyMSwgcjIKLTAwMDAwMDIwIDxbXj5dKj4gMDFhMDIwMDMgPwltb3ZlcQlyMiwgcjMKLTAwMDAwMDI0IDxbXj5dKj4gMTFhMDQwMDUgPwltb3ZuZQlyNCwgcjUKLTAwMDAwMDI4IDxbXj5dKj4gYjFhMDYwMDcgPwltb3ZsdAlyNiwgcjcKLTAwMDAwMDJjIDxbXj5dKj4gYTFhMDgwMDkgPwltb3ZnZQlyOCwgcjkKLTAwMDAwMDMwIDxbXj5dKj4gZDFhMGEwMGIgPwltb3ZsZQlzbCwgZnAKLTAwMDAwMDM0IDxbXj5dKj4gYzFhMGMwMGQgPwltb3ZndAlpcCwgc3AKLTAwMDAwMDM4IDxbXj5dKj4gMzFhMDEwMDIgPwltb3ZjYwlyMSwgcjIKLTAwMDAwMDNjIDxbXj5dKj4gMjFhMDEwMDMgPwltb3ZjcwlyMSwgcjMKLTAwMDAwMDQwIDxbXj5dKj4gNDFhMDMwMDYgPwltb3ZtaQlyMywgcjYKLTAwMDAwMDQ0IDxbXj5dKj4gNTFhMDcwMDkgPwltb3ZwbAlyNywgcjkKLTAwMDAwMDQ4IDxbXj5dKj4gNjFhMDEwMDggPwltb3Z2cwlyMSwgcjgKLTAwMDAwMDRjIDxbXj5dKj4gNzFhMDlmYTEgPwltb3Z2YwlyOSwgcjEsIGxzciAjMzEKLTAwMDAwMDUwIDxbXj5dKj4gODFhMDgwMGYgPwltb3ZoaQlyOCwgcGMKLTAwMDAwMDU0IDxbXj5dKj4gOTFhMGYwMGUgPwltb3ZscwlwYywgbHIKLTAwMDAwMDU4IDxbXj5dKj4gMjFhMDkwMDggPwltb3ZjcwlyOSwgcjgKLTAwMDAwMDVjIDxbXj5dKj4gMzFhMDEwMDMgPwltb3ZjYwlyMSwgcjMKLTAwMDAwMDYwIDxbXj5dKj4gZTFiMDAwMDggPwltb3ZzCXIwLCByOAotMDAwMDAwNjQgPFtePl0qPiAzMWIwMDAwNyA/CW1vdmNjcwlyMCwgcjcKLTAwMDAwMDY4IDxbXj5dKj4gZTI4MTAwMGEgPwlhZGQJcjAsIHIxLCAjMTAKLTAwMDAwMDZjIDxbXj5dKj4gZTA4MzIwMDQgPwlhZGQJcjIsIHIzLCByNAotMDAwMDAwNzAgPFtePl0qPiBlMDg2NTI4NyA/CWFkZAlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMDc0IDxbXj5dKj4gZTA4MjExMTMgPwlhZGQJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDA3OCA8W14+XSo+IGUyMDEwMDBhID8JYW5kCXIwLCByMSwgIzEwCi0wMDAwMDA3YyA8W14+XSo+IGUwMDMyMDA0ID8JYW5kCXIyLCByMywgcjQKLTAwMDAwMDgwIDxbXj5dKj4gZTAwNjUyODcgPwlhbmQJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDA4NCA8W14+XSo+IGUwMDIxMTEzID8JYW5kCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwODggPFtePl0qPiBlMjIxMDAwYSA/CWVvcglyMCwgcjEsICMxMAotMDAwMDAwOGMgPFtePl0qPiBlMDIzMjAwNCA/CWVvcglyMiwgcjMsIHI0Ci0wMDAwMDA5MCA8W14+XSo+IGUwMjY1Mjg3ID8JZW9yCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwOTQgPFtePl0qPiBlMDIyMTExMyA/CWVvcglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMDk4IDxbXj5dKj4gZTI0MTAwMGEgPwlzdWIJcjAsIHIxLCAjMTAKLTAwMDAwMDljIDxbXj5dKj4gZTA0MzIwMDQgPwlzdWIJcjIsIHIzLCByNAotMDAwMDAwYTAgPFtePl0qPiBlMDQ2NTI4NyA/CXN1YglyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGE0IDxbXj5dKj4gZTA0MjExMTMgPwlzdWIJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBhOCA8W14+XSo+IGUyYTEwMDBhID8JYWRjCXIwLCByMSwgIzEwCi0wMDAwMDBhYyA8W14+XSo+IGUwYTMyMDA0ID8JYWRjCXIyLCByMywgcjQKLTAwMDAwMGIwIDxbXj5dKj4gZTBhNjUyODcgPwlhZGMJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBiNCA8W14+XSo+IGUwYTIxMTEzID8JYWRjCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwYjggPFtePl0qPiBlMmMxMDAwYSA/CXNiYwlyMCwgcjEsICMxMAotMDAwMDAwYmMgPFtePl0qPiBlMGMzMjAwNCA/CXNiYwlyMiwgcjMsIHI0Ci0wMDAwMDBjMCA8W14+XSo+IGUwYzY1Mjg3ID8Jc2JjCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwYzQgPFtePl0qPiBlMGMyMTExMyA/CXNiYwlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGM4IDxbXj5dKj4gZTI2MTAwMGEgPwlyc2IJcjAsIHIxLCAjMTAKLTAwMDAwMGNjIDxbXj5dKj4gZTA2MzIwMDQgPwlyc2IJcjIsIHIzLCByNAotMDAwMDAwZDAgPFtePl0qPiBlMDY2NTI4NyA/CXJzYglyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGQ0IDxbXj5dKj4gZTA2MjExMTMgPwlyc2IJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBkOCA8W14+XSo+IGUyZTEwMDBhID8JcnNjCXIwLCByMSwgIzEwCi0wMDAwMDBkYyA8W14+XSo+IGUwZTMyMDA0ID8JcnNjCXIyLCByMywgcjQKLTAwMDAwMGUwIDxbXj5dKj4gZTBlNjUyODcgPwlyc2MJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBlNCA8W14+XSo+IGUwZTIxMTEzID8JcnNjCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwZTggPFtePl0qPiBlMzgxMDAwYSA/CW9ycglyMCwgcjEsICMxMAotMDAwMDAwZWMgPFtePl0qPiBlMTgzMjAwNCA/CW9ycglyMiwgcjMsIHI0Ci0wMDAwMDBmMCA8W14+XSo+IGUxODY1Mjg3ID8Jb3JyCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwZjQgPFtePl0qPiBlMTgyMTExMyA/CW9ycglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGY4IDxbXj5dKj4gZTNjMTAwMGEgPwliaWMJcjAsIHIxLCAjMTAKLTAwMDAwMGZjIDxbXj5dKj4gZTFjMzIwMDQgPwliaWMJcjIsIHIzLCByNAotMDAwMDAxMDAgPFtePl0qPiBlMWM2NTI4NyA/CWJpYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMTA0IDxbXj5dKj4gZTFjMjExMTMgPwliaWMJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDEwOCA8W14+XSo+IGUzZTAwMDBhID8JbXZuCXIwLCAjMTAKLTAwMDAwMTBjIDxbXj5dKj4gZTFlMDIwMDQgPwltdm4JcjIsIHI0Ci0wMDAwMDExMCA8W14+XSo+IGUxZTA1Mjg3ID8JbXZuCXI1LCByNywgbHNsICM1Ci0wMDAwMDExNCA8W14+XSo+IGUxZTAxMTEzID8JbXZuCXIxLCByMywgbHNsIHIxCi0wMDAwMDExOCA8W14+XSo+IGUzMTAwMDBhID8JdHN0CXIwLCAjMTAKLTAwMDAwMTFjIDxbXj5dKj4gZTExMjAwMDQgPwl0c3QJcjIsIHI0Ci0wMDAwMDEyMCA8W14+XSo+IGUxMTUwMjg3ID8JdHN0CXI1LCByNywgbHNsICM1Ci0wMDAwMDEyNCA8W14+XSo+IGUxMTEwMTEzID8JdHN0CXIxLCByMywgbHNsIHIxCi0wMDAwMDEyOCA8W14+XSo+IGUzMzAwMDBhID8JdGVxCXIwLCAjMTAKLTAwMDAwMTJjIDxbXj5dKj4gZTEzMjAwMDQgPwl0ZXEJcjIsIHI0Ci0wMDAwMDEzMCA8W14+XSo+IGUxMzUwMjg3ID8JdGVxCXI1LCByNywgbHNsICM1Ci0wMDAwMDEzNCA8W14+XSo+IGUxMzEwMTEzID8JdGVxCXIxLCByMywgbHNsIHIxCi0wMDAwMDEzOCA8W14+XSo+IGUzNTAwMDBhID8JY21wCXIwLCAjMTAKLTAwMDAwMTNjIDxbXj5dKj4gZTE1MjAwMDQgPwljbXAJcjIsIHI0Ci0wMDAwMDE0MCA8W14+XSo+IGUxNTUwMjg3ID8JY21wCXI1LCByNywgbHNsICM1Ci0wMDAwMDE0NCA8W14+XSo+IGUxNTEwMTEzID8JY21wCXIxLCByMywgbHNsIHIxCi0wMDAwMDE0OCA8W14+XSo+IGUzNzAwMDBhID8JY21uCXIwLCAjMTAKLTAwMDAwMTRjIDxbXj5dKj4gZTE3MjAwMDQgPwljbW4JcjIsIHI0Ci0wMDAwMDE1MCA8W14+XSo+IGUxNzUwMjg3ID8JY21uCXI1LCByNywgbHNsICM1Ci0wMDAwMDE1NCA8W14+XSo+IGUxNzEwMTEzID8JY21uCXIxLCByMywgbHNsIHIxCi0wMDAwMDE1OCA8W14+XSo+IGUzMzBmMDBhID8JdGVxcAlyMCwgIzEwCi0wMDAwMDE1YyA8W14+XSo+IGUxMzJmMDA0ID8JdGVxcAlyMiwgcjQKLTAwMDAwMTYwIDxbXj5dKj4gZTEzNWYyODcgPwl0ZXFwCXI1LCByNywgbHNsICM1Ci0wMDAwMDE2NCA8W14+XSo+IGUxMzFmMTEzID8JdGVxcAlyMSwgcjMsIGxzbCByMQotMDAwMDAxNjggPFtePl0qPiBlMzcwZjAwYSA/CWNtbnAJcjAsICMxMAotMDAwMDAxNmMgPFtePl0qPiBlMTcyZjAwNCA/CWNtbnAJcjIsIHI0Ci0wMDAwMDE3MCA8W14+XSo+IGUxNzVmMjg3ID8JY21ucAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxNzQgPFtePl0qPiBlMTcxZjExMyA/CWNtbnAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTc4IDxbXj5dKj4gZTM1MGYwMGEgPwljbXBwCXIwLCAjMTAKLTAwMDAwMTdjIDxbXj5dKj4gZTE1MmYwMDQgPwljbXBwCXIyLCByNAotMDAwMDAxODAgPFtePl0qPiBlMTU1ZjI4NyA/CWNtcHAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTg0IDxbXj5dKj4gZTE1MWYxMTMgPwljbXBwCXIxLCByMywgbHNsIHIxCi0wMDAwMDE4OCA8W14+XSo+IGUzMTBmMDBhID8JdHN0cAlyMCwgIzEwCi0wMDAwMDE4YyA8W14+XSo+IGUxMTJmMDA0ID8JdHN0cAlyMiwgcjQKLTAwMDAwMTkwIDxbXj5dKj4gZTExNWYyODcgPwl0c3RwCXI1LCByNywgbHNsICM1Ci0wMDAwMDE5NCA8W14+XSo+IGUxMTFmMTEzID8JdHN0cAlyMSwgcjMsIGxzbCByMQotMDAwMDAxOTggPFtePl0qPiBlMDAwMDI5MSA/CW11bAlyMCwgcjEsIHIyCi0wMDAwMDE5YyA8W14+XSo+IGUwMTEwMzkyID8JbXVscwlyMSwgcjIsIHIzCi0wMDAwMDFhMCA8W14+XSo+IDEwMDAwMDkxID8JbXVsbmUJcjAsIHIxLCByMAotMDAwMDAxYTQgPFtePl0qPiA5MDE5MDc5OCA/CW11bGxzcwlyOSwgcjgsIHI3Ci0wMDAwMDFhOCA8W14+XSo+IGUwMjFiYTk5ID8JbWxhCXIxLCByOSwgc2wsIGZwCi0wMDAwMDFhYyA8W14+XSo+IGUwMzNjOTk0ID8JbWxhcwlyMywgcjQsIHI5LCBpcAotMDAwMDAxYjAgPFtePl0qPiBiMDI5ZDc5OCA/CW1sYWx0CXI5LCByOCwgcjcsIHNwCi0wMDAwMDFiNCA8W14+XSo+IGEwMzRlMzkxID8JbWxhZ2VzCXI0LCByMSwgcjMsIGxyCi0wMDAwMDFiOCA8W14+XSo+IGU1OTEwMDAwID8JbGRyCXIwLCBcW3IxXF0KLTAwMDAwMWJjIDxbXj5dKj4gZTc5MTEwMDIgPwlsZHIJcjEsIFxbcjEsIHIyXF0KLTAwMDAwMWMwIDxbXj5dKj4gZTdiMzIwMDQgPwlsZHIJcjIsIFxbcjMsIHI0XF0hCi0wMDAwMDFjNCA8W14+XSo+IGU1OTIyMDIwID8JbGRyCXIyLCBcW3IyLCAjMzJcXQotMDAwMDAxYzggPFtePl0qPiBlNzkzMjQyNCA/CWxkcglyMiwgXFtyMywgcjQsIGxzciAjOFxdCi0wMDAwMDFjYyA8W14+XSo+IDA3YjU0NDg0ID8JbGRyZXEJcjQsIFxbcjUsIHI0LCBsc2wgIzlcXSEKLTAwMDAwMWQwIDxbXj5dKj4gMTQ5NTQwMDYgPwlsZHJuZQlyNCwgXFtyNVxdLCAjNgotMDAwMDAxZDQgPFtePl0qPiBlNmIyMTAwMyA/CWxkcnQJcjEsIFxbcjJcXSwgcjMKLTAwMDAwMWQ4IDxbXj5dKj4gZTY5NDI0MjUgPwlsZHIJcjIsIFxbcjRcXSwgcjUsIGxzciAjOAotMDAwMDAxZGMgPFtePl0qPiBlNTFmMDAwOCA/CWxkcglyMCwgXFtwYywgI2ZmZmZmZmY4XF0JOyAwMDAwMDFkYyA8W14+XSo+Ci0wMDAwMDFlMCA8W14+XSo+IGU1ZDQzMDAwID8JbGRyYglyMywgXFtyNFxdCi0wMDAwMDFlNCA8W14+XSo+IDE0Zjg1MDAwID8JbGRybmVidAlyNSwgXFtyOFxdCi0wMDAwMDFlOCA8W14+XSo+IGU1ODEwMDAwID8Jc3RyCXIwLCBcW3IxXF0KLTAwMDAwMWVjIDxbXj5dKj4gZTc4MTEwMDIgPwlzdHIJcjEsIFxbcjEsIHIyXF0KLTAwMDAwMWYwIDxbXj5dKj4gZTdhMzMwMDQgPwlzdHIJcjMsIFxbcjMsIHI0XF0hCi0wMDAwMDFmNCA8W14+XSo+IGU1ODIyMDIwID8Jc3RyCXIyLCBcW3IyLCAjMzJcXQotMDAwMDAxZjggPFtePl0qPiBlNzgzMjQyNCA/CXN0cglyMiwgXFtyMywgcjQsIGxzciAjOFxdCi0wMDAwMDFmYyA8W14+XSo+IDA3YTU0NDg0ID8Jc3RyZXEJcjQsIFxbcjUsIHI0LCBsc2wgIzlcXSEKLTAwMDAwMjAwIDxbXj5dKj4gMTQ4NTQwMDYgPwlzdHJuZQlyNCwgXFtyNVxdLCAjNgotMDAwMDAyMDQgPFtePl0qPiBlNjgyMTAwMyA/CXN0cglyMSwgXFtyMlxdLCByMwotMDAwMDAyMDggPFtePl0qPiBlNmE0MjQyNSA/CXN0cnQJcjIsIFxbcjRcXSwgcjUsIGxzciAjOAotMDAwMDAyMGMgPFtePl0qPiBlNTBmMTAwNCA/CXN0cglyMSwgXFtwYywgI2ZmZmZmZmZjXF0JOyAwMDAwMDIxMCA8W14+XSo+Ci0wMDAwMDIxMCA8W14+XSo+IGU1YzcxMDAwID8Jc3RyYglyMSwgXFtyN1xdCi0wMDAwMDIxNCA8W14+XSo+IGU0ZTAyMDAwID8Jc3RyYnQJcjIsIFxbcjBcXQotMDAwMDAyMTggPFtePl0qPiBlODkwMDAwMiA/CWxkbWlhCXIwLCB7cjF9Ci0wMDAwMDIxYyA8W14+XSo+IDA5OTIwMDM4ID8JbGRtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0wMDAwMDIyMCA8W14+XSo+IGU4NTNmZmZmID8JbGRtZGEJcjMsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOSwgc2wsIGZwLCBpcCwgc3AsIGxyLCBwY31cXgotMDAwMDAyMjQgPFtePl0qPiBlOTNiMDVmZiA/CWxkbWRiCWZwISwge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHNsfQotMDAwMDAyMjggPFtePl0qPiBlOTkxMDBmNyA/CWxkbWliCXIxLCB7cjAsIHIxLCByMiwgcjQsIHI1LCByNiwgcjd9Ci0wMDAwMDIyYyA8W14+XSo+IGU4OTIwMWY4ID8JbGRtaWEJcjIsIHtyMywgcjQsIHI1LCByNiwgcjcsIHI4fQotMDAwMDAyMzAgPFtePl0qPiBlOTEzMDAwMyA/CWxkbWRiCXIzLCB7cjAsIHIxfQotMDAwMDAyMzQgPFtePl0qPiBlODc0MDMwMCA/CWxkbWRhCXI0ISwge3I4LCByOX1cXgotMDAwMDAyMzggPFtePl0qPiBlODgwMDAwMiA/CXN0bWlhCXIwLCB7cjF9Ci0wMDAwMDIzYyA8W14+XSo+IDA5ODIwMDM4ID8Jc3RtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0wMDAwMDI0MCA8W14+XSo+IGU4NDNmZmZmID8Jc3RtZGEJcjMsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOSwgc2wsIGZwLCBpcCwgc3AsIGxyLCBwY31cXgotMDAwMDAyNDQgPFtePl0qPiBlOTJhMDVmZiA/CXN0bWRiCXNsISwge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHNsfQotMDAwMDAyNDggPFtePl0qPiBlODAxMDAwNyA/CXN0bWRhCXIxLCB7cjAsIHIxLCByMn0KLTAwMDAwMjRjIDxbXj5dKj4gZTkwMjAwMTggPwlzdG1kYglyMiwge3IzLCByNH0KLTAwMDAwMjUwIDxbXj5dKj4gZTg4MzAwMDMgPwlzdG1pYQlyMywge3IwLCByMX0KLTAwMDAwMjU0IDxbXj5dKj4gZTllNDAzMDAgPwlzdG1pYglyNCEsIHtyOCwgcjl9XF4KLTAwMDAwMjU4IDxbXj5dKj4gZWYxMjM0NTYgPwlzd2kJMHgwMDEyMzQ1NgotMDAwMDAyNWMgPFtePl0qPiAyZjAwMDAzMyA/CXN3aWNzCTB4MDAwMDAwMzMKLTAwMDAwMjYwIDxbXj5dKj4gZWJmZmZmZmUgPwlibAkwMDAwMDI2MCA8W14+XSo+Ci1bCQldKjI2MDouKl93b21iYXQuKgotMDAwMDAyNjQgPFtePl0qPiA1YjAwMDA4MiA/CWJscGwJMDAwMDA0NzQgPFtePl0qPgotCQkJMjY0OiBSX0FSTV9QQzI0CVwudGV4dAotMDAwMDAyNjggPFtePl0qPiBlYWZmZmZmZSA/CWIJMDAwMDAyNjggPFtePl0qPgotWwkJXSoyNjg6Lipfd2liYmxlLioKLTAwMDAwMjZjIDxbXj5dKj4gZGFmZmZmZmUgPwlibGUJMDAwMDAyNmMgPFtePl0qPgotWwkJXSoyNmM6Lip0ZXN0ZXJmdW5jLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjA5MmM5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotQAlUZXN0IGZpbGUgZm9yIEFSTS9HQVMgLS0gYmFzaWMgaW5zdHJ1Y3Rpb25zCi0KLS50ZXh0Ci0uYWxpZ24KLQltb3YJcjAsICMwCi0JbW92CXIxLCByMgotCW1vdglyMywgcjQsIGxzbCAjMwotCW1vdglyNSwgcjYsIGxzciByNwotCW1vdglyOCwgcjksIGFzciByMTAKLQltb3YJcjExLCByMTIsIGFzbCByMTMKLQltb3YJcjE0LCByMTUsIHJyeAotCW1vdmFsCXIxLCByMgotCW1vdmVxCXIyLCByMwotCW1vdm5lCXI0LCByNQotCW1vdmx0CXI2LCByNwotCW1vdmdlCXI4LCByOQotCW1vdmxlCXIxMCwgcjExCi0JbW92Z3QJcjEyLCByMTMKLQltb3ZjYwlyMSwgcjIKLQltb3ZjcwlyMSwgcjMKLQltb3ZtaQlyMywgcjYKLQltb3ZwbAlyNywgcjkKLQltb3Z2cwlyMSwgcjgKLQltb3Z2YwlyOSwgcjEsIGxzciAjMzEKLQltb3ZoaQlyOCwgcjE1Ci0JbW92bHMJcjE1LCByMTQKLQltb3ZocwlyOSwgcjgKLQltb3Z1bAlyMSwgcjMKLQltb3ZzCXIwLCByOAotCW1vdnVscwlyMCwgcjcKLQkKLQlhZGQJcjAsIHIxLCAjMTAKLQlhZGQJcjIsIHIzLCByNAotCWFkZAlyNSwgcjYsIHI3LCBhc2wgIzUKLQlhZGQJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlhbmQJcjAsIHIxLCAjMTAKLQlhbmQJcjIsIHIzLCByNAotCWFuZAlyNSwgcjYsIHI3LCBhc2wgIzUKLQlhbmQJcjEsIHIyLCByMywgbHNsIHIxCi0KLQllb3IJcjAsIHIxLCAjMTAKLQllb3IJcjIsIHIzLCByNAotCWVvcglyNSwgcjYsIHI3LCBhc2wgIzUKLQllb3IJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlzdWIJcjAsIHIxLCAjMTAKLQlzdWIJcjIsIHIzLCByNAotCXN1YglyNSwgcjYsIHI3LCBhc2wgIzUKLQlzdWIJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlhZGMJcjAsIHIxLCAjMTAKLQlhZGMJcjIsIHIzLCByNAotCWFkYwlyNSwgcjYsIHI3LCBhc2wgIzUKLQlhZGMJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlzYmMJcjAsIHIxLCAjMTAKLQlzYmMJcjIsIHIzLCByNAotCXNiYwlyNSwgcjYsIHI3LCBhc2wgIzUKLQlzYmMJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlyc2IJcjAsIHIxLCAjMTAKLQlyc2IJcjIsIHIzLCByNAotCXJzYglyNSwgcjYsIHI3LCBhc2wgIzUKLQlyc2IJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlyc2MJcjAsIHIxLCAjMTAKLQlyc2MJcjIsIHIzLCByNAotCXJzYwlyNSwgcjYsIHI3LCBhc2wgIzUKLQlyc2MJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlvcnIJcjAsIHIxLCAjMTAKLQlvcnIJcjIsIHIzLCByNAotCW9ycglyNSwgcjYsIHI3LCBhc2wgIzUKLQlvcnIJcjEsIHIyLCByMywgbHNsIHIxCi0KLQliaWMJcjAsIHIxLCAjMTAKLQliaWMJcjIsIHIzLCByNAotCWJpYwlyNSwgcjYsIHI3LCBhc2wgIzUKLQliaWMJcjEsIHIyLCByMywgbHNsIHIxCi0KLQltdm4JcjAsICMxMAotCW12bglyMiwgcjQKLQltdm4JcjUsIHI3LCBhc2wgIzUKLQltdm4JcjEsIHIzLCBsc2wgcjEKLQotCXRzdAlyMCwgIzEwCi0JdHN0CXIyLCByNAotCXRzdAlyNSwgcjcsIGFzbCAjNQotCXRzdAlyMSwgcjMsIGxzbCByMQotCi0JdGVxCXIwLCAjMTAKLQl0ZXEJcjIsIHI0Ci0JdGVxCXI1LCByNywgYXNsICM1Ci0JdGVxCXIxLCByMywgbHNsIHIxCi0KLQljbXAJcjAsICMxMAotCWNtcAlyMiwgcjQKLQljbXAJcjUsIHI3LCBhc2wgIzUKLQljbXAJcjEsIHIzLCBsc2wgcjEKLQotCWNtbglyMCwgIzEwCi0JY21uCXIyLCByNAotCWNtbglyNSwgcjcsIGFzbCAjNQotCWNtbglyMSwgcjMsIGxzbCByMQotCi0JdGVxcAlyMCwgIzEwCi0JdGVxcAlyMiwgcjQKLQl0ZXFwCXI1LCByNywgYXNsICM1Ci0JdGVxcAlyMSwgcjMsIGxzbCByMQotCi0JY21ucAlyMCwgIzEwCi0JY21ucAlyMiwgcjQKLQljbW5wCXI1LCByNywgYXNsICM1Ci0JY21ucAlyMSwgcjMsIGxzbCByMQotCi0JY21wcAlyMCwgIzEwCi0JY21wcAlyMiwgcjQKLQljbXBwCXI1LCByNywgYXNsICM1Ci0JY21wcAlyMSwgcjMsIGxzbCByMQotCi0JdHN0cAlyMCwgIzEwCi0JdHN0cAlyMiwgcjQKLQl0c3RwCXI1LCByNywgYXNsICM1Ci0JdHN0cAlyMSwgcjMsIGxzbCByMQotCi0JbXVsCXIwLCByMSwgcjIKLQltdWxzCXIxLCByMiwgcjMKLQltdWxuZQlyMCwgcjEsIHIwCi0JbXVsbHNzCXI5LCByOCwgcjcKLQotCW1sYQlyMSwgcjksIHIxMCwgcjExCi0JbWxhcwlyMywgcjQsIHI5LCByMTIKLQltbGFsdAlyOSwgcjgsIHI3LCByMTMKLQltbGFnZXMJcjQsIHIxLCByMywgcjE0Ci0KLQlsZHIJcjAsIFtyMV0KLQlsZHIJcjEsIFtyMSwgcjJdCi0JbGRyCXIyLCBbcjMsIHI0XSEKLQlsZHIJcjIsIFtyMiwgIzMyXQotCWxkcglyMiwgW3IzLCByNCwgbHNyICM4XQotCWxkcmVxCXI0LCBbcjUsIHI0LCBhc2wgIzldIQotCWxkcm5lCXI0LCBbcjVdLCAjNgotCWxkcnQJcjEsIFtyMl0sIHIzCi0JbGRyCXIyLCBbcjRdLCByNSwgbHNyICM4Ci1mb286Ci0JbGRyCXIwLCBmb28KLQlsZHJiCXIzLCBbcjRdCi0JbGRybmVidAlyNSwgW3I4XQotCQotCXN0cglyMCwgW3IxXQotCXN0cglyMSwgW3IxLCByMl0KLQlzdHIJcjMsIFtyMywgcjRdIQotCXN0cglyMiwgW3IyLCAjMzJdCi0Jc3RyCXIyLCBbcjMsIHI0LCBsc3IgIzhdCi0Jc3RyZXEJcjQsIFtyNSwgcjQsIGFzbCAjOV0hCi0Jc3RybmUJcjQsIFtyNV0sICM2Ci0Jc3RyCXIxLCBbcjJdLCByMwotCXN0cnQJcjIsIFtyNF0sIHI1LCBsc3IgIzgKLQlzdHIJcjEsIGJhcgotYmFyOgotCXN0cmFsYglyMSwgW3I3XQotCXN0cmJ0CXIyLCBbcjBdCi0KLQlsZG1pYQlyMCwge3IxfQotCWxkbWVxaWIJcjIsIHtyMywgcjQsIHI1fQotCWxkbWFsZGEJcjMsIHtyMC1yMTV9XgotCWxkbWRiCXIxMSEsIHtyMC1yOCwgcjEwfQotCWxkbWVkCXIxLCB7cjAsIHIxLCByMn18MHhmMAotCWxkbWZkCXIyLCB7cjMsIHI0fSt7cjUsIHI2LCByNywgcjh9Ci0JbGRtZWEJcjMsIDMKLQlsZG1mYQlyNCEsIHtyOCwgcjl9XgotCQotCXN0bWlhCXIwLCB7cjF9Ci0Jc3RtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0Jc3RtYWxkYQlyMywge3IwLXIxNX1eCi0Jc3RtZGIJcjEwISwge3IwLXI4LCByMTB9Ci0Jc3RtZWQJcjEsIHtyMCwgcjEsIHIyfQotCXN0bWZkCXIyLCB7cjMsIHI0fQotCXN0bWVhCXIzLCAzCi0Jc3RtZmEJcjQhLCB7cjgsIHI5fV4KLQotCXN3aQkweDEyMzQ1NgotCXN3aWhzCTB4MzMKLQotCWJsCV93b21iYXQKLQlibHBsCWJhcgotCWIJX3dpYmJsZQotCWJsZQl0ZXN0ZXJmdW5jCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0ZTBlMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jb2JqZHVtcDogLXMKLSNhczogLUVMCi0jbmFtZTogYXJtIGxpdHRsZS1lbmRpYW4gZnBjb25zdAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qYXJtLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIGNkY2M4YzNmIDAwMDAwMDAwIDk5OTlmMTNmIDlhOTk5OTk5IC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzYzNkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIFRlc3QgZnAgY29uc3RhbnRzLgotIyBUaGVzZSBuZWVkIEFSTSBzcGVjaWZpYyBzdXBwb3J0IGJlY2F1c2UgOCBieXRlIGZwIGNvbnN0YW50cyBpbiBsaXR0bGUKLSMgZW5kaWFuIG1vZGUgYXJlIHJlcHJlc2VudGVkIGFibm9ybWFsbHkuCi0JCi0JLnRleHQKLQkuZmxvYXQgMS4xCi0JLmZsb2F0IDAKLQkuZG91YmxlIDEuMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL3RodW1iLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0YjgyZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0JLnRleHQKLQkuY29kZSAxNgotLmZvbzoJCi0JbHNsCXIyLCByMSwgIzMKLQlsc3IJcjMsIHI0LCAjMzEKLXdpYmJsZS9kYXRhOgkKLQlhc3IJcjcsIHIwLCAjNQotCi0JbHNsCXIxLCByMiwgIzAKLQlsc3IJcjMsIHI0LCAjMAotCWFzcglyNCwgcjUsICMwCi0KLQlsc3IJcjYsIHI3LCAjMzIKLQlhc3IJcjAsIHIxLCAjMzIKLQotCWFkZAlyMSwgcjIsIHIzCi0JYWRkCXIyLCByNCwgIzIKLQlzdWIJcjMsIHI1LCByNwotCXN1YglyMiwgcjQsICM3Ci0KLQltb3YJcjQsICMyNTUKLQljbXAJcjMsICMyNTAKLQlhZGQJcjYsICMxMjMKLQlzdWIJcjUsICMxMjgKLQotCWFuZAlyMywgcjUKLQllb3IJcjQsIHI2Ci0JbHNsCXIxLCByMAotCWxzcglyMiwgcjMKLQlhc3IJcjQsIHI2Ci0JYWRjCXI1LCByNwotCXNiYwlyMCwgcjQKLQlyb3IJcjEsIHI0Ci0JdHN0CXIyLCByNQotCW5lZwlyMSwgcjEKLQljbXAJcjIsIHIzCi0JY21uCXIxLCByNAotCW9ycglyMCwgcjMKLQltdWwJcjQsIHI1Ci0JYmljCXI1LCByNwotCW12bglyNSwgcjUKLQotCWFkZAlyMSwgcjEzCi0JYWRkCXIxMiwgcjIKLQlhZGQJcjksIHI5Ci0JY21wCXIxLCByMTQKLQljbXAJcjgsIHIwCi0JY21wCXIxMiwgcjE0Ci0JbW92CXIwLCByOQotCW1vdglyOSwgcjQKLQltb3YJcjgsIHI4Ci0JYngJcjcKLQlieAlyOAotCS5hbGlnbiAwCi0JYngJcGMKLQotCWxkcglyMywgW3BjLCAjMTI4XQotCWxkcglyNCwgYmFyCi0KLQlzdHIJcjAsIFtyMSwgcjJdCi0Jc3RyYglyMSwgW3IyLCByNF0KLQlsZHIJcjUsIFtyNiwgcjddCi0JbGRyYglyMiwgW3I0LCByNV0KLQkKLQkuYWxpZ24gMAotYmFyOgkKLQlzdHJoCXIxLCBbcjIsIHIzXQotCWxkcmgJcjMsIFtyNCwgcjBdCi0JbGRzYglyMSwgW3I2LCByN10KLQlsZHNoCXIyLCBbcjAsIHI1XQotCi0Jc3RyCXIzLCBbcjMsICMxMjRdCi0JbGRyCXIxLCBbcjQsICMxMjRdCi0JbGRyCXI1LCBbcjVdCi0Jc3RyYglyMSwgW3I1LCAjMzFdCi0Jc3RyYglyMSwgW3I0LCAjNV0KLQlzdHJiCXIyLCBbcjZdCi0KLQlzdHJoCXI0LCBbcjUsICM2Ml0KLQlsZHJoCXI1LCBbcjAsICM0XQotCWxkcmgJcjMsIFtyMl0KLQotCXN0cglyMywgW3IxMywgIzEwMjBdCi0JbGRyCXIxLCBbcjEzLCAjNDRdCi0JbGRyCXIyLCBbcjEzXQotCi0JYWRkCXI3LCByMTUsICMxMDIwCi0JYWRkCXI0LCByMTMsICM1MTIKLQotCWFkZAlyMTMsICMyNjgKLQlhZGQJcjEzLCAjLTEwNAotCXN1YglyMTMsICMyNjgKLQlzdWIJcjEzLCAjLTEwOAotCi0JcHVzaAl7cjAsIHIxLCByMiwgcjR9Ci0JcHVzaAl7cjAsIHIzLXI3LCBscn0KLQlwb3AJe3IzLCByNCwgcjd9Ci0JcG9wCXtyMC1yNywgcjE1fQotCi0Jc3RtaWEJcjMhLCB7cjAsIHIxLCByNC1yN30KLQlsZG1pYQlyMCEsIHtyMS1yN30KLQotCWJlcQliYXIKLQlibmUJYmFyCi0JYmNzCWJhcgotCWJjYwliYXIKLQlibWkJYmFyCi0JYnBsCWJhcgotCWJ2cwliYXIKLQlidmMJYmFyCi0JYmhpCWJhcgotCWJscwliYXIKLQliZ2UJYmFyCi0JYmd0CWJhcgotCWJsdAliYXIKLQliZ3QJYmFyCi0JYmxlCWJhcgotCWJoaQliYXIKLQlibG8JYmFyCi0JYnVsCWJhcgotCi1jbG9zZToKLQlsc2wJcjQsIHI1LCAjbmVhciAtIGNsb3NlCi1uZWFyOgotCWFkZAlyMiwgcjMsICNuZWFyIC0gY2xvc2UKLQotCWFkZAlzcCwgc3AsICMxMjcgPDwgMgotCXN1YglzcCwgc3AsICMxMjcgPDwgMgotCWFkZAlyMCwgc3AsICMyNTUgPDwgMgotCWFkZAlyMCwgcGMsICMyNTUgPDwgMgotCi0JYWRkCXNwLCBzcCwgI2JhciAtIC5mb28KLQlzdWIJc3AsIHNwLCAjYmFyIC0gLmZvbwotCWFkZAlyMCwgc3AsICNiYXIgLSAuZm9vCi0JYWRkCXIwLCBwYywgI2JhciAtIC5mb28KLQotCWFkZAlyMSwgI2JhciAtIC5mb28KLQltb3YJcjYsICNiYXIgLSAuZm9vCi0JY21wCXI3LCAjYmFyIC0gLmZvbwotCi0Jbm9wCi0Jbm9wCi0KLQkuYXJtCi0ubG9jYWxiYXI6Ci0JYgkubG9jYWxiYXIKLQliCS53b21iYXQKLQlibAkubG9jYWxiYXIKLQlibAkud29tYmF0Ci0KLQlieAlyMAotCXN3aQkweDEyMzQ1NgotCi0JLnRodW1iCi0JQCBUaGUgZm9sbG93aW5nIHdpbGwgYmUgZGlzYXNzZW1ibGVkIGluY29ycmVjdGx5IGlmIHdlIGRvIG5vdAotCUAgaGF2ZSBhIFRodW1iIHN5bWJvbCBkZWZpbmVkIGJlZm9yZSB0aGUgZmlyc3QgVGh1bWIgaW5zdHJ1Y3Rpb246Ci1tb3JldGh1bWI6Ci0JYWRyCXIwLCBmb3J3YXJkb25seQotCi0JYgkuZm9vCi0JYgkud29tYmF0Ci0JYmwJLmZvbwotCWJsCS53b21iYXQKLQotCWJ4CXIwCi0KLQlzd2kJMHhmZgotCS5hbGlnbgkwCi1mb3J3YXJkb25seToKLQliZXEJLndvbWJhdAotCWJuZQkud29tYmF0Ci0JYmNzCS53b21iYXQKLQliY2MJLndvbWJhdAotCWJtaQkud29tYmF0Ci0JYnBsCS53b21iYXQKLQlidnMJLndvbWJhdAotCWJ2Ywkud29tYmF0Ci0JYmhpCS53b21iYXQKLQlibHMJLndvbWJhdAotCWJnZQkud29tYmF0Ci0JYmd0CS53b21iYXQKLQlibHQJLndvbWJhdAotCWJndAkud29tYmF0Ci0JYmxlCS53b21iYXQKLQliaGkJLndvbWJhdAotCWJsbwkud29tYmF0Ci0JYnVsCS53b21iYXQKLQotLmJhY2s6Ci0JYmwJLmxvY2FsCi0JLnNwYWNlCSgxIDw8IDExKQlAIGxlYXZlIHNwYWNlIHRvIGZvcmNlIGxvbmcgb2Zmc2V0cwotLmxvY2FsOgotCWJsCS5iYWNrCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Njc2OGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYWxpZ25tZW50IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8c3RhcnQ+OgotICAgMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gICA4OgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMTA6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAxODoJMDBmMDAwMDAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDIwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMjg6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAzMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDAzOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hbGlnbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyB0ZXN0cyBwcm9wZXIgaGFuZGxpbmcgb2YgYWxpZ25zIG9uIEQzMFYKLQotCS50ZXh0Ci0JLmFsaWduIDMKLXN0YXJ0OgotCWFicwlyMjEscjQyCi0JLmFsaWduIDMKLQlhYnMJcjIxLHI0MgotCS5hbGlnbiA0Ci0JYWJzCXIyMSxyNDIKLQkuYWxpZ24gNAotCWFicwlyMjEscjQyCi0JCi0JLmRhdGEKLQkubG9uZwkweGRlYWRiZWVmCi0JCi0JLnRleHQKLQlhYnMJcjIxLHI0MgotCi0JLmRhdGEKLQkuYWxpZ24gNAotCS5sb25nCTB4ZGVhZGJlZWYKLQkKLQkudGV4dAotCS5hbGlnbiAzCi0JYWJzCXIyMSxyNDIKLQkuZW5kCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxYmMzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBhcnJheSB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPF9fZm9vLTB4NDg+OgotICAgMDoJODgwODIwYzAgODAwMDAwNDggCWFkZC5sCXIyLCByMywgMHg0OAotCQkJMDogUl9EMzBWXzMyCS50ZXh0Ci0gICA4Ogk4ODA4MjBjMCA4MDAwMDA0OSAJYWRkLmwJcjIsIHIzLCAweDQ5Ci0JCQk4OiBSX0QzMFZfMzIJLnRleHQKLSAgMTA6CTg4MDgyMGMwIDgwMDAwMDRhIAlhZGQubAlyMiwgcjMsIDB4NGEKLQkJCTEwOiBSX0QzMFZfMzIJLnRleHQKLSAgMTg6CTg4MDgyMGMwIDgwMDAwMDRiIAlhZGQubAlyMiwgcjMsIDB4NGIKLQkJCTE4OiBSX0QzMFZfMzIJLnRleHQKLSAgMjA6CTg4MDgyMGMwIDgwMDAwMDRjIAlhZGQubAlyMiwgcjMsIDB4NGMKLQkJCTIwOiBSX0QzMFZfMzIJLnRleHQKLSAgMjg6CTg4MDgyMGMwIDgwMDAwMDRkIAlhZGQubAlyMiwgcjMsIDB4NGQKLQkJCTI4OiBSX0QzMFZfMzIJLnRleHQKLSAgMzA6CTg4MDgyMGMwIDgwMDAwMDRlIAlhZGQubAlyMiwgcjMsIDB4NGUKLQkJCTMwOiBSX0QzMFZfMzIJLnRleHQKLSAgMzg6CTg4MDgyMGMwIDgwMDAwMDRmIAlhZGQubAlyMiwgcjMsIDB4NGYKLQkJCTM4OiBSX0QzMFZfMzIJLnRleHQKLSAgNDA6CTg4MDgyMGMwIDgwMDAwMDUwIAlhZGQubAlyMiwgcjMsIDB4NTAKLQkJCTQwOiBSX0QzMFZfMzIJLnRleHQKLQotMCswMDQ4IDxfX2Zvbz46Ci0gIDQ4OgkxMjM0NTY3OCAxMjM0NTY3OCAJLmxvbmcJMHgxMjM0NTY3OAl8fAkubG9uZwkweDEyMzQ1Njc4Ci0gIDUwOgkxMjM0NTY3OCAwMDAwMDAwMCAgICAgIAkubG9uZwkweDEyMzQ1Njc4CXx8CWJyYS5zCXIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTg3ZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBEMzBWIGFycmF5IHRlc3QKLQkudGV4dAotCWFkZCByMiwgcjMgLCBfX2ZvbwotCWFkZCByMiwgcjMgLCBfX2ZvbysxCi0JYWRkIHIyLCByMyAsIF9fZm9vKzIKLQlhZGQgcjIsIHIzICwgX19mb28rMwotCWFkZCByMiwgcjMgLCBfX2Zvbys0Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzUKLQlhZGQgcjIsIHIzICwgX19mb28rNgotCWFkZCByMiwgcjMgLCBfX2Zvbys3Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzgKLV9fZm9vOgotCS5pbnQgMHgxMjM0NTY3OAotICAgICAgICAuaW50IDB4MTIzNDU2NzgKLSAgICAgICAgLmludCAweDEyMzQ1Njc4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTZhYjQ2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYml0dGVzdCBvcHQKLSNhczogLVdPCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDBmMDAwMDAgODQ0MDEwODMgCW5vcAkJLT4JbGR3LnMJcjEsIEBcKHIyLCByM1wpCi0gICA4OgkwNDQwNjE0NCAwMGYwMDAwMCAJbGR3LnMJcjYsIEBcKHI1LCByNFwpCXx8CW5vcAkKLSAgMTA6CTAwZjAwMDAwIDgyMjAxMDgzIAlub3AJCS0+CWJzZXQJcjEsIHIyLCByMwotICAxODoJODBmMDAwMDAgMDIwMDEwODMgCW5vcAkJPC0JYnRzdAlmMSwgcjIsIHIzCi0gIDIwOgkwMGYwMDAwMCAwMjMwMTA4MyAJbm9wCQl8fAliY2xyCXIxLCByMiwgcjMKLSAgMjg6CTAwZjAwMDAwIDgyMTAxMDgzIAlub3AJCS0+CWJub3QJcjEsIHIyLCByMwotICAzMDoJMDIxMDEwODMgODBmMDAwMDAgCWJub3QJcjEsIHIyLCByMwktPglub3AJCi0gIDM4OgkwNDdjMDEwNSAwMjIwMTA4MyAJbW9kZGVjCXI0LCAweDUJfHwJYnNldAlyMSwgcjIsIHIzCi0gIDQwOgkwMjIwMTA4MyA4NDdjMDEwNSAJYnNldAlyMSwgcjIsIHIzCS0+CW1vZGRlYwlyNCwgMHg1Ci0gIDQ4OgkwMjIwMTA4MyAwOGMwNDE0NiAJYnNldAlyMSwgcjIsIHIzCXx8CWpvaW5sbC5zCXI0LCByNSwgcjYKLSAgNTA6CTAyMjAxMDgzIDA4YzA0MTQ2IAlic2V0CXIxLCByMiwgcjMJfHwJam9pbmxsLnMJcjQsIHI1LCByNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDFiN2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6IFdhcm5pbmc6IFN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJ0c3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJjbHIgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJub3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgYml0dGVzdC5zCi0gICAyICAgICAgICAgICAgICAJIwotICAgMyAgICAgICAgICAgICAgCSMgQml0IG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgXChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUXCkgc2hvdWxkIG5vdCBiZSBwbGFjZWQgaW4gSVUuCi0gICA0ICAgICAgICAgICAgICAJIyBJZiB0aGUgdXNlciBzcGVjaWZpY2FsbHkgaW5kaWNhdGVzIHRoZXkgc2hvdWxkIGJlIGluIHRoZSBJVSwgR0FTIHdpbGwKLSAgIDUgICAgICAgICAgICAgIAkjIGdlbmVyYXRlIHdhcm5pbmdzLiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIG5vdCBhbiBlcnJvciBpcyB0aGF0IHRob3NlIGluc3RydWN0aW9ucyAKLSAgIDYgICAgICAgICAgICAgIAkjIHdpbGwgZmFpbCBpbiBJVSBvbmx5IG9jY2FzaW9uYWxseS4gVGh1cyBHQVMgc2hvdWxkIHBhY2sgdGhlbSBpbiBNVSBmb3IKLSAgIDcgICAgICAgICAgICAgIAkjIHNhZmV0eSwgYW5kIGl0IGp1c3QgbmVlZHMgdG8gZHJhdyBhdHRlbnRpb24gd2hlbiBhIHZpb2xhdGlvbiBpcyBnaXZlbi4gCi0gICA4ICAgICAgICAgICAgICAJCi0gICA5ICAgICAgICAgICAgICAJCQotICAxMCAwMDAwIDAwRjAwMDAwIAkJbm9wIC0+IGxkdyBSMSwgQFwoUjIsUjNcKQotICAxMCAgICAgIDg0NDAxMDgzIAotICAxMSAwMDA4IDA0NDA2MTQ0IAkgICAgICAgIG5vcCB8fCBsZHcgUjYsIEBcKFI1LFI0XCkKLS4qICBXYXJuaW5nOlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDEyICAgICAgICAgICAgICAJICAgICAgICAKLSAgMTMgMDAxMCAwMEYwMDAwMCAJICAgICAgICBub3AgLT4gQlNFVCBSMSwgUjIsIFIzIAotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDEzICAgICAgODIyMDEwODMgCi0gIDE0IDAwMTggODBGMDAwMDAgCSAgICAgICAgbm9wIDwtIEJUU1QgRjEsIFIyLCBSMyAKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBidHN0IGluIElVIG1heSBub3Qgd29yawotICAxNCAgICAgIDAyMDAxMDgzIAotICAxNSAwMDIwIDAwRjAwMDAwIAkgICAgICAgIG5vcCB8fCBCQ0xSIFIxLCBSMiwgUjMKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBiY2xyIGluIElVIG1heSBub3Qgd29yawotICAxNSAgICAgIDAyMzAxMDgzIAotICAxNiAwMDI4IDAwRjAwMDAwIAkgICAgICAgIG5vcCAtPiBCTk9UIFIxLCBSMiwgUjMKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBibm90IGluIElVIG1heSBub3Qgd29yawotICAxNiAgICAgIDgyMTAxMDgzIAotICAxNyAwMDMwIDAyMTAxMDgzIAkgICAgICAgIEJOT1QgcjEsIHIyLCByMyAtPiBub3AKLSAgMTcgICAgICA4MEYwMDAwMCAKLSAgMTggICAgICAgICAgICAgIAkgICAgICAgIAotICAxOSAwMDM4IDA0N0MwMTA1IAkgICAgICAgIGJzZXQgcjEsIHIyLCByMyB8fCBtb2RkZWMgcjQsIDUKLS4qICBXYXJuaW5nOlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0gIDE5ICAgICAgMDIyMDEwODMgCi0gIDIwICAgICAgICAgICAgICAJCi0gIDIxICAgICAgICAgICAgICAJICAgICAgICBic2V0IHIxLCByMiwgcjMKLSAgMjIgMDA0MCAwMjIwMTA4MyAJICAgICAgICBtb2RkZWMgcjQsIDUKLSAgMjIgICAgICA4NDdDMDEwNSAKLSAgMjMgICAgICAgICAgICAgIAkKLSAgMjQgICAgICAgICAgICAgIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyNSAwMDQ4IDAyMjAxMDgzIAkgICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gIDI1ICAgICAgODhDMDQxNDYgCi0gIDI2ICAgICAgICAgICAgICAJCi0gIDI3ICAgICAgICAgICAgICAJICAgICAgICBqb2lubGwgcjQsIHI1LCByNgotICAyOCAwMDUwIDgyMjAxMDgzIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyOCAgICAgIDA4QzA0MTQ2IApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5YTU2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgYml0dGVzdC5zCi0jCi0jIEJpdCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zIChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUKSBzaG91bGQgbm90IGJlIHBsYWNlZCBpbiBJVS4KLSMgSWYgdGhlIHVzZXIgc3BlY2lmaWNhbGx5IGluZGljYXRlcyB0aGV5IHNob3VsZCBiZSBpbiB0aGUgSVUsIEdBUyB3aWxsCi0jIGdlbmVyYXRlIHdhcm5pbmdzLiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIG5vdCBhbiBlcnJvciBpcyB0aGF0IHRob3NlIGluc3RydWN0aW9ucyAKLSMgd2lsbCBmYWlsIGluIElVIG9ubHkgb2NjYXNpb25hbGx5LiBUaHVzIEdBUyBzaG91bGQgcGFjayB0aGVtIGluIE1VIGZvcgotIyBzYWZldHksIGFuZCBpdCBqdXN0IG5lZWRzIHRvIGRyYXcgYXR0ZW50aW9uIHdoZW4gYSB2aW9sYXRpb24gaXMgZ2l2ZW4uIAotCi0JCi0Jbm9wIC0+IGxkdyBSMSwgQChSMixSMykKLSAgICAgICAgbm9wIHx8IGxkdyBSNiwgQChSNSxSNCkKLSAgICAgICAgCi0gICAgICAgIG5vcCAtPiBCU0VUIFIxLCBSMiwgUjMgCi0gICAgICAgIG5vcCA8LSBCVFNUIEYxLCBSMiwgUjMgCi0gICAgICAgIG5vcCB8fCBCQ0xSIFIxLCBSMiwgUjMKLSAgICAgICAgbm9wIC0+IEJOT1QgUjEsIFIyLCBSMwotICAgICAgICBCTk9UIHIxLCByMiwgcjMgLT4gbm9wCi0gICAgICAgIAotICAgICAgICBic2V0IHIxLCByMiwgcjMgfHwgbW9kZGVjIHI0LCA1Ci0KLSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gICAgICAgIG1vZGRlYyByNCwgNQotCi0gICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAgICAgICBqb2lubGwgcjQsIHI1LCByNgotCi0gICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gICAgICAgIGJzZXQgcjEsIHIyLCByMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMGUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZDMwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMKLSMgRDMwViBhc3NlbWJsZXIgdGVzdHMKLSMKLQotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICBnbG9iYWwgc3JjZGlyIHN1YmRpcgotICBzZXQgdGVzdG5hbWUgIkQzMFYgJG5hbWUiCi0gIHNldCBmaWxlICRzcmNkaXIvJHN1YmRpci8kbmFtZQotICBnYXNfcnVuICR7bmFtZX0ucyAkb3B0cyAiPiZkdW1wLm91dCIKLSAgaWYge1tyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmwiXSB9IHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotICAgIHJldHVybgotICB9Ci0gIHBhc3MgJHRlc3RuYW1lCi19Ci0KLWlmIHtbaXN0YXJnZXQgZDMwdi0qLSpdfSB7Ci0gIHJ1bl9kdW1wX3Rlc3QgImluc3QiCi0gIHJ1bl9kdW1wX3Rlc3QgImFsaWduIgotICBydW5fZHVtcF90ZXN0ICJndWFyZCIKLSAgcnVuX2R1bXBfdGVzdCAiZ3VhcmQtZGVidWciCi0gIHJ1bl9kdW1wX3Rlc3QgInJlbG9jIgotICBydW5fZHVtcF90ZXN0ICJvcHQiCi0gIHJ1bl9kdW1wX3Rlc3QgImFycmF5IgotICBydW5fZHVtcF90ZXN0ICJsYWJlbCIKLSAgcnVuX2xpc3RfdGVzdCAid2Fybl9vZGRyZWciICItYWwiCi0gIHJ1bl9saXN0X3Rlc3QgImJpdHRlc3QiICItYWwiCi0gIHJ1bl9kdW1wX3Rlc3QgImJpdHRlc3QiCi0gIHJ1bl9saXN0X3Rlc3QgInNlcmlhbCIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsMiIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsMk8iICItYWwgLU8iCi0gIHJ1bl9kdW1wX3Rlc3QgIm11bCIKLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWExNTRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNvYmpkdW1wOiAtbGRyCi0jbmFtZTogRDMwViBkZWJ1ZyAoLWcpIHRlc3QKLSNhczogLWcKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0uKjpbMC05XSsKLSAgIDA6CTA4MDAxMDgzIDAwZjAwMDAwIAlhZGQucwlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAgODoJMDgwMDEwODMgMDBmMDAwMDAgCWFkZC5zCXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDEwOgkxODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMvdHgJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMTg6CTI4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy9meAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAyMDoJMzgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3h0CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDI4Ogk0ODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMveGYJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMzA6CTU4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy90dAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAzODoJNjgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3RmCXIxLCByMiwgcjMJfHwJbm9wCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjIwZjdiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgU2FtZSBhcyBndWFyZC5zIGJ1dCBoZXJlIHdlIGFyZSB0ZXN0aW5nIGRlYnVnICgtZykgYXNzZW1ibHkKLSMgT24gdGhlIEQzMFYsIGFzc2VtYmxpbmcgd2l0aCAtZyBzaG91bGQgZGlzYWJsZSB0aGUgVkxJVyBwYWNraW5nCi0jIGFuZCBwdXQgb25seSBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUuCQotCi0JLnRleHQKLQotCWFkZAlyMSxyMixyMwotCWFkZC9hbAlyMSxyMixyMwotCWFkZC90eAlyMSxyMixyMwotCWFkZC9meAlyMSxyMixyMwotCWFkZC94dAlyMSxyMixyMwotCWFkZC94ZglyMSxyMixyMwotCWFkZC90dAlyMSxyMixyMwotCWFkZC90ZglyMSxyMixyMwotCi0JCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmYTJkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBndWFyZGVkIGV4ZWN1dGlvbiB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPC50ZXh0PjoKLSAgIDA6CTA4MDAxMDgzIDg4MDAxMDgzIAlhZGQucwlyMSwgcjIsIHIzCS0+CWFkZC5zCXIxLCByMiwgcjMKLSAgIDg6CTE4MDAxMDgzIGE4MDAxMDgzIAlhZGQucy90eAlyMSwgcjIsIHIzCS0+CWFkZC5zL2Z4CXIxLCByMiwgcjMKLSAgMTA6CTM4MDAxMDgzIGM4MDAxMDgzIAlhZGQucy94dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3hmCXIxLCByMiwgcjMKLSAgMTg6CTU4MDAxMDgzIGU4MDAxMDgzIAlhZGQucy90dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3RmCXIxLCByMiwgcjMKLSAgMjA6CTA4MDAxMDgzIDg4MDAxMDgzIAlhZGQucwlyMSwgcjIsIHIzCS0+CWFkZC5zCXIxLCByMiwgcjMKLSAgMjg6CTE4MDAxMDgzIGE4MDAxMDgzIAlhZGQucy90eAlyMSwgcjIsIHIzCS0+CWFkZC5zL2Z4CXIxLCByMiwgcjMKLSAgMzA6CTM4MDAxMDgzIGM4MDAxMDgzIAlhZGQucy94dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3hmCXIxLCByMiwgcjMKLSAgMzg6CTU4MDAxMDgzIGU4MDAxMDgzIAlhZGQucy90dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3RmCXIxLCByMiwgcjMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5Y2QzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIEQzMFYgZ3VhcmRlZCBleGVjdXRpb24gYXNzZW1ibHkgdGVzdAotCi0JLnRleHQKLQotCWFkZAlyMSxyMixyMwotCWFkZC9hbAlyMSxyMixyMwotCWFkZC90eAlyMSxyMixyMwotCWFkZC9meAlyMSxyMixyMwotCWFkZC94dAlyMSxyMixyMwotCWFkZC94ZglyMSxyMixyMwotCWFkZC90dAlyMSxyMixyMwotCWFkZC90ZglyMSxyMixyMwotCi0jIGNoZWNrIGNhc2Ugc2Vuc2l0aXZpdHkgdG9vCi0JQURECXIxLHIyLHIzCi0JQUREL0FMCXIxLHIyLHIzCi0JQUREL3R4CXIxLHIyLHIzCi0JYWRkL0ZYCXIxLHIyLHIzCi0JQUREL1hUCXIxLHIyLHIzCi0JQUREL1hGCXIxLHIyLHIzCi0JYWRkL1RUCXIxLHIyLHIzCi0JQUREL3RmCXIxLHIyLHIzCi0JCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjFjYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYmFzaWMgaW5zdHJ1Y3Rpb24gdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgIDA6CTA4ODE1YTgwIDg4MDAxMDgzIAlhYnMJcjIxLCByNDIJLT4JYWRkLnMJcjEsIHIyLCByMwotICAgODoJMDgwYjJjZGEgMDBmMDAwMDAgCWFkZC5zCXI1MCwgcjUxLCAweDFhCXx8CW5vcAkKLSAgMTA6CTg4MGIyY2Y3IDhhYjFiZWVmIAlhZGQubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAxODoJMDgxMDEwODMgODgxYjJjZGEgCWFkZDJoLnMJcjEsIHIyLCByMwktPglhZGQyaC5zCXI1MCwgcjUxLCAweDFhCi0gIDIwOgk4ODFiMmNmNyA4YWIxYmVlZiAJYWRkMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAyODoJMDg0MDEwODMgODg0YjJjZGEgCWFkZGMucwlyMSwgcjIsIHIzCS0+CWFkZGMucwlyNTAsIHI1MSwgMHgxYQotICAzMDoJODg0YjJjZjcgOGFiMWJlZWYgCWFkZGMubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAzODoJMDkwMDEwODMgODkwYjJjZGEgCWFkZGhsbGwucwlyMSwgcjIsIHIzCS0+CWFkZGhsbGwucwlyNTAsIHI1MSwgMHgxYQotICA0MDoJODkwYjJjZjcgOGFiMWJlZWYgCWFkZGhsbGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA0ODoJMDkxMDEwODMgODkxYjJjZGEgCWFkZGhsbGgucwlyMSwgcjIsIHIzCS0+CWFkZGhsbGgucwlyNTAsIHI1MSwgMHgxYQotICA1MDoJODkxYjJjZjcgOGFiMWJlZWYgCWFkZGhsbGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA1ODoJMDkyMDEwODMgODkyYjJjZGEgCWFkZGhsaGwucwlyMSwgcjIsIHIzCS0+CWFkZGhsaGwucwlyNTAsIHI1MSwgMHgxYQotICA2MDoJODkyYjJjZjcgOGFiMWJlZWYgCWFkZGhsaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA2ODoJMDkzMDEwODMgODkzYjJjZGEgCWFkZGhsaGgucwlyMSwgcjIsIHIzCS0+CWFkZGhsaGgucwlyNTAsIHI1MSwgMHgxYQotICA3MDoJODkzYjJjZjcgOGFiMWJlZWYgCWFkZGhsaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA3ODoJMDk0MDEwODMgODk0YjJjZGEgCWFkZGhobGwucwlyMSwgcjIsIHIzCS0+CWFkZGhobGwucwlyNTAsIHI1MSwgMHgxYQotICA4MDoJODk0YjJjZjcgOGFiMWJlZWYgCWFkZGhobGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA4ODoJMDk1MDEwODMgODk1YjJjZGEgCWFkZGhobGgucwlyMSwgcjIsIHIzCS0+CWFkZGhobGgucwlyNTAsIHI1MSwgMHgxYQotICA5MDoJODk1YjJjZjcgOGFiMWJlZWYgCWFkZGhobGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA5ODoJMDk2MDEwODMgODk2YjJjZGEgCWFkZGhoaGwucwlyMSwgcjIsIHIzCS0+CWFkZGhoaGwucwlyNTAsIHI1MSwgMHgxYQotICBhMDoJODk2YjJjZjcgOGFiMWJlZWYgCWFkZGhoaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBhODoJMDk3MDEwODMgODk3YjJjZGEgCWFkZGhoaGgucwlyMSwgcjIsIHIzCS0+CWFkZGhoaGgucwlyNTAsIHI1MSwgMHgxYQotICBiMDoJODk3YjJjZjcgOGFiMWJlZWYgCWFkZGhoaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBiODoJMDg2MDEwODMgODg2YjJjZGEgCWFkZHMucwlyMSwgcjIsIHIzCS0+CWFkZHMucwlyNTAsIHI1MSwgMHgxYQotICBjMDoJODg2YjJjZjcgOGFiMWJlZWYgCWFkZHMubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBjODoJMDg3MDEwODMgODg3YjJjZGEgCWFkZHMyaC5zCXIxLCByMiwgcjMJLT4JYWRkczJoLnMJcjUwLCByNTEsIDB4MWEKLSAgZDA6CTg4N2IyY2Y3IDhhYjFiZWVmIAlhZGRzMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBkODoJMDM4MDEwODMgODM4YjJjZGEgCWFuZC5zCXIxLCByMiwgcjMJLT4JYW5kLnMJcjUwLCByNTEsIDB4MWEKLSAgZTA6CTgzOGIyY2Y3IDhhYjFiZWVmIAlhbmQubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBlODoJMDI4MDAwNDIgODI4ODMxMDUgCWFuZGZnCWYwLCBmMSwgZjIJLT4JYW5kZmcJZjMsIHMsIDB4NQotICBmMDoJMDhhMDEwODMgODhhODQxNDYgCWF2Zy5zCXIxLCByMiwgcjMJLT4JYXZnLnMJcjQsIHI1LCAweDYKLSAgZjg6CTg4YWIyY2Y3IDhhYjFiZWVmIAlhdmcubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDEwMDoJMDhiMDEwODMgODhiODQxNDYgCWF2ZzJoLnMJcjEsIHIyLCByMwktPglhdmcyaC5zCXI0LCByNSwgMHg2Ci0gMTA4Ogk4OGJiMmNmNyA4YWIxYmVlZiAJYXZnMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDExMDoJMDIzMDEwODMgODIzODQxNDYgCWJjbHIJcjEsIHIyLCByMwktPgliY2xyCXI0LCByNSwgMHg2Ci0gMTE4OgkwMjEwMTA4MyA4MjE4NWNjNiAJYm5vdAlyMSwgcjIsIHIzCS0+CWJub3QJcjUsIHI1MSwgMHg2Ci0gMTIwOgkwMDAwMDAyOSAwMGYwMDAwMCAJYnJhLnMJcjQxCXx8CW5vcAkKLSAxMjg6CTAwMDgwMDA4IDAwZjAwMDAwIAlicmEucwk0MAlcKDE2OCA8c3RhcnRcKzB4MTY4PlwpCXx8CW5vcAkKLSAxMzA6CTAwMDgxZTAxIDAwZjAwMDAwIAlicmEucwlmMDA4CVwoZjEzOCA8c3RhcnRcKzB4ZjEzOD5cKQl8fAlub3AJCi0gMTM4OgkwMDQ2OTAyYSAwMGYwMDAwMCAJYnJhdG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDE0MDoJODA0YzEwMDAgODAwMGYwMGQgCWJyYXRuei5sCXIxLCBmMDBkCVwoZjE0ZCA8c3RhcnRcKzB4ZjE0ZD5cKQotIDE0ODoJODA0YzEwMzcgOGFiMWYwMGQgCWJyYXRuei5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjE1NSA8c3RhcnRcKzB4ZGVhZGYxNTU+XCkKLSAxNTA6CTAwNDI5MDJhIDAwZjAwMDAwIAlicmF0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMTU4Ogk4MDQ4MTAwMCA4MDAwZjAwZCAJYnJhdHpyLmwJcjEsIGYwMGQJXChmMTY1IDxzdGFydFwrMHhmMTY1PlwpCi0gMTYwOgk4MDQ4MTAzNyA4YWIxZjAwZCAJYnJhdHpyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMTZkIDxzdGFydFwrMHhkZWFkZjE2ZD5cKQotIDE2ODoJMDIyMDEwODMgODIyODVjYzYgCWJzZXQJcjEsIHIyLCByMwktPglic2V0CXI1LCByNTEsIDB4NgotIDE3MDoJMDAyMDAwMjkgMDBmMDAwMDAgCWJzci5zCXI0MQl8fAlub3AJCi0gMTc4OgkwMDI4MWUwMSAwMGYwMDAwMCAJYnNyLnMJZjAwOAlcKGYxODAgPHN0YXJ0XCsweGYxODA+XCkJfHwJbm9wCQotIDE4MDoJODAyODAwMzcgOGFiMWYwMGQgCWJzci5sCS0yMTUyMGZmMwlcKGRlYWRmMThkIDxzdGFydFwrMHhkZWFkZjE4ZD5cKQotIDE4ODoJMDA2NjkwMmEgMDBmMDAwMDAgCWJzcnRuei5zCXI0MSwgcjQyCXx8CW5vcAkKLSAxOTA6CTgwNmMxMDAwIDgwMDBmMDBkIAlic3J0bnoubAlyMSwgZjAwZAlcKGYxOWQgPHN0YXJ0XCsweGYxOWQ+XCkKLSAxOTg6CTgwNmMxMDM3IDhhYjFmMDBkIAlic3J0bnoubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYxYTUgPHN0YXJ0XCsweGRlYWRmMWE1PlwpCi0gMWEwOgkwMDYyOTAyYSAwMGYwMDAwMCAJYnNydHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDFhODoJODA2ODEwMDAgODAwMGYwMGQgCWJzcnR6ci5sCXIxLCBmMDBkCVwoZjFiNSA8c3RhcnRcKzB4ZjFiNT5cKQotIDFiMDoJODA2ODEwMzcgOGFiMWYwMGQgCWJzcnR6ci5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjFiZCA8c3RhcnRcKzB4ZGVhZGYxYmQ+XCkKLSAxYjg6CTAyMDAxMDgzIDgyMDg1Y2M2IAlidHN0CWYxLCByMiwgcjMJLT4JYnRzdAl2LCByNTEsIDB4NgotIDFjMDoJMDJjMDAwYzEgODJjMDk1MTUgCWNtcGVxLnMJZjAsIHIzLCByMQktPgljbXBuZS5zCWYxLCByMjAsIHIyMQotIDFjODoJMDJjMTI3ZTAgODJjMWIwYzQgCWNtcGd0LnMJZjIsIHIzMSwgcjMyCS0+CWNtcGdlLnMJZjMsIHIzLCByNAotIDFkMDoJMDJjMjQwYzQgODJjMmQwYzQgCWNtcGx0LnMJcywgcjMsIHI0CS0+CWNtcGxlLnMJdiwgcjMsIHI0Ci0gMWQ4OgkwMmMzNjBjNCA4MmMzZjBjNCAJY21wcHMucwl2YSwgcjMsIHI0CS0+CWNtcG5nLnMJYywgcjMsIHI0Ci0gMWUwOgkwMmQxMjdlMCA4MmQxYjBjNCAJY21wdWd0LnMJZjIsIHIzMSwgcjMyCS0+CWNtcHVnZS5zCWYzLCByMywgcjQKLSAxZTg6CTAyZDI0MGM0IDgyZDJkMGM0IAljbXB1bHQucwlzLCByMywgcjQJLT4JY21wdWxlLnMJdiwgcjMsIHI0Ci0gMWYwOgkwMTAwMTAwOCA4MTA4MTAyMCAJZGJyYS5zCXIxLCByOAktPglkYnJhLnMJcjEsIDEwMAlcKDJmMCA8c3RhcnRcKzB4MmYwPlwpCi0gMWY4Ogk4MTA4MTAzNyA4YWIxZjAwZCAJZGJyYS5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjIwNSA8c3RhcnRcKzB4ZGVhZGYyMDU+XCkKLSAyMDA6CTAxNDAyMDFmIDgxNDgyMDIwIAlkYnJhaS5zCTEwLCByMzEJLT4JZGJyYWkucwkxMCwgMTAwCVwoMzAwIDxzdGFydFwrMHgzMDA+XCkKLSAyMDg6CTgxNDgyMDM3IDhhYjFmMDBkIAlkYnJhaS5sCTEwLCAtMjE1MjBmZjMJXChkZWFkZjIxNSA8c3RhcnRcKzB4ZGVhZGYyMTU+XCkKLSAyMTA6CTAxMjAxMDA4IDAwZjAwMDAwIAlkYnNyLnMJcjEsIHI4CXx8CW5vcAkKLSAyMTg6CTAxMjgxMDIwIDAwZjAwMDAwIAlkYnNyLnMJcjEsIDEwMAlcKDMxOCA8c3RhcnRcKzB4MzE4PlwpCXx8CW5vcAkKLSAyMjA6CTgxMjgxMDM3IDhhYjFmMDBkIAlkYnNyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMjJkIDxzdGFydFwrMHhkZWFkZjIyZD5cKQotIDIyODoJMDE2MDQwMWYgMDBmMDAwMDAgCWRic3JpLnMJMjAsIHIzMQl8fAlub3AJCi0gMjMwOgkwMTY4NDAyMCAwMGYwMDAwMCAJZGJzcmkucwkyMCwgMTAwCVwoMzMwIDxzdGFydFwrMHgzMzA+XCkJfHwJbm9wCQotIDIzODoJODE2ODQwMzcgOGFiMWYwMGQgCWRic3JpLmwJMjAsIC0yMTUyMGZmMwlcKGRlYWRmMjQ1IDxzdGFydFwrMHhkZWFkZjI0NT5cKQotIDI0MDoJMDExMDEwMjAgMDBmMDAwMDAgCWRqbXAucwlyMSwgcjMyCXx8CW5vcAkKLSAyNDg6CTgxMTgxMDAwIDgwMDBmMDBkIAlkam1wLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjUwOgk4MTE4MTAzNyA4YWIxZjAwZCAJZGptcC5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMjU4OgkwMTUwNjAyMCAwMGYwMDAwMCAJZGptcGkucwkzMCwgcjMyCXx8CW5vcAkKLSAyNjA6CTgxNTg2MDAwIDgwMDBmMDBkIAlkam1waS5sCTMwLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI2ODoJODE1ODYwMzcgOGFiMWYwMGQgCWRqbXBpLmwJMzAsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyNzA6CTAxMzAxMDIwIDAwZjAwMDAwIAlkanNyLnMJcjEsIHIzMgl8fAlub3AJCi0gMjc4Ogk4MTM4MTAwMCA4MDAwZjAwZCAJZGpzci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI4MDoJODEzODEwMzcgOGFiMWYwMGQgCWRqc3IubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDI4ODoJMDE3MDIwMjAgMDBmMDAwMDAgCWRqc3JpLnMJMTAsIHIzMgl8fAlub3AJCi0gMjkwOgk4MTc4NDAwMCA4MDAwZjAwZCAJZGpzcmkubAkyMCwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyOTg6CTgxNzg4MDM3IDhhYjFmMDBkIAlkanNyaS5sCTQwLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmEwOgkwMDEwMDAyOSAwMGYwMDAwMCAJam1wLnMJcjQxCXx8CW5vcAkKLSAyYTg6CTAwMTgxZTAxIDAwZjAwMDAwIAlqbXAucwlmMDA4IDxzdGFydFwrMHhmMDA4Pgl8fAlub3AJCi0gMmIwOgk4MDE4MDAzNyA4YWIxZjAwZCAJam1wLmwJZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJiODoJMDA1NjkwMmEgMDBmMDAwMDAgCWptcHRuei5zCXI0MSwgcjQyCXx8CW5vcAkKLSAyYzA6CTgwNWMxMDAwIDgwMDBmMDBkIAlqbXB0bnoubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyYzg6CTgwNWMxMDM3IDhhYjFmMDBkIAlqbXB0bnoubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJkMDoJMDA1MjkwMmEgMDBmMDAwMDAgCWptcHR6ci5zCXI0MSwgcjQyCXx8CW5vcAkKLSAyZDg6CTgwNTgxMDAwIDgwMDBmMDBkIAlqbXB0enIubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyZTA6CTgwNTgxMDM3IDhhYjFmMDBkIAlqbXB0enIubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJlODoJMDhjMDEwODQgODhjODEwOGYgCWpvaW5sbC5zCXIxLCByMiwgcjQJLT4Jam9pbmxsLnMJcjEsIHIyLCAweGYKLSAyZjA6CTg4YzgxMGI3IDhhYjFmMDBkIAlqb2lubGwubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAyZjg6CTA4ZDAxMDg0IDg4ZDgxMDhmIAlqb2lubGgucwlyMSwgcjIsIHI0CS0+CWpvaW5saC5zCXIxLCByMiwgMHhmCi0gMzAwOgk4OGQ4MTBiNyA4YWIxZjAwZCAJam9pbmxoLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gMzA4OgkwOGUwMTA4NCA4OGU4MTA4ZiAJam9pbmhsLnMJcjEsIHIyLCByNAktPglqb2luaGwucwlyMSwgcjIsIDB4ZgotIDMxMDoJODhlODEwYjcgOGFiMWYwMGQgCWpvaW5obC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDMxODoJMDhmMDEwODQgODhmODEwOGYgCWpvaW5oaC5zCXIxLCByMiwgcjQJLT4Jam9pbmhoLnMJcjEsIHIyLCAweGYKLSAzMjA6CTg4ZjgxMGI3IDhhYjFmMDBkIAlqb2luaGgubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAzMjg6CTAwMzAwMDI5IDAwZjAwMDAwIAlqc3IucwlyNDEJfHwJbm9wCQotIDMzMDoJMDAzODFlMDEgMDBmMDAwMDAgCWpzci5zCWYwMDggPHN0YXJ0XCsweGYwMDg+CXx8CW5vcAkKLSAzMzg6CTgwMzgwMDM3IDhhYjFmMDBkIAlqc3IubAlkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzQwOgkwMDc2OTAyYSAwMGYwMDAwMCAJanNydG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDM0ODoJODA3YzEwMDAgODAwMGYwMGQgCWpzcnRuei5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDM1MDoJODA3YzEwMzcgOGFiMWYwMGQgCWpzcnRuei5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzU4OgkwMDcyOTAyYSAwMGYwMDAwMCAJanNydHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDM2MDoJODA3ODEwMDAgODAwMGYwMGQgCWpzcnR6ci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDM2ODoJODA3ODEwMzcgOGFiMWYwMGQgCWpzcnR6ci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzcwOgkwNDMwNjFjOCA4NDM0NjFjOCAJbGQyaC5zCXI2LCBAXChyNywgcjhcKQktPglsZDJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzNzg6CTA0M2M2MWM4IDg0Mzg2MWRhIAlsZDJoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZDJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzODA6CTg0Mzg2MWMwIDgwMDAxMjM0IAlsZDJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDM4ODoJMDQ2MDYxYzggODQ2NDYxYzggCWxkMncucwlyNiwgQFwocjcsIHI4XCkJLT4JbGQydy5zCXI2LCBAXChyN1wrLCByOFwpCi0gMzkwOgkwNDZjNjFjOCA4NDY4NjFkYSAJbGQydy5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQydy5zCXI2LCBAXChyNywgMHgxYVwpCi0gMzk4Ogk4NDY4NjFjMCA4MDAwMTIzNCAJbGQydy5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzYTA6CTA0NTA2MWM4IDg0NTQ2MWM4IAlsZDRiaC5zCXI2LCBAXChyNywgcjhcKQktPglsZDRiaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gM2E4OgkwNDVjNjFjOCA4NDU4NjFkYSAJbGQ0YmgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkNGJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzYjA6CTg0NTg2MWMwIDgwMDAxMjM0IAlsZDRiaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzYjg6CTA0ZDA2MWM4IDg0ZDQ2MWM4IAlsZDRiaHUucwlyNiwgQFwocjcsIHI4XCkJLT4JbGQ0Ymh1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzYzA6CTA0ZGM2MWM4IDg0ZDg2MWRhIAlsZDRiaHUucwlyNiwgQFwocjctLCByOFwpCS0+CWxkNGJodS5zCXI2LCBAXChyNywgMHgxYVwpCi0gM2M4Ogk4NGQ4NjFjMCA4MDAwMTIzNCAJbGQ0Ymh1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNkMDoJMDQwMDYxYzggODQwNDYxYzggCWxkYi5zCXI2LCBAXChyNywgcjhcKQktPglsZGIucwlyNiwgQFwocjdcKywgcjhcKQotIDNkODoJMDQwYzYxYzggODQwODYxZGEgCWxkYi5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRiLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzZTA6CTg0MDg2MWMwIDgwMDAxMjM0IAlsZGIubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gM2U4OgkwNDkwNjFjOCA4NDk0NjFjOCAJbGRidS5zCXI2LCBAXChyNywgcjhcKQktPglsZGJ1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzZjA6CTA0OWM2MWM4IDg0OTg2MWRhIAlsZGJ1LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGJ1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzZjg6CTg0OTg2MWMwIDgwMDAxMjM0IAlsZGJ1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQwMDoJMDQyMDYxYzggODQyNDYxYzggCWxkaC5zCXI2LCBAXChyNywgcjhcKQktPglsZGgucwlyNiwgQFwocjdcKywgcjhcKQotIDQwODoJMDQyYzYxYzggODQyODYxZGEgCWxkaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0MTA6CTg0Mjg2MWMwIDgwMDAxMjM0IAlsZGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDE4OgkwNDEwNjFjOCA4NDE0NjFjOCAJbGRoaC5zCXI2LCBAXChyNywgcjhcKQktPglsZGhoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0MjA6CTA0MWM2MWM4IDg0MTg2MWRhIAlsZGhoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGhoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0Mjg6CTg0MTg2MWMwIDgwMDAxMjM0IAlsZGhoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQzMDoJMDRhMDYxYzggODRhNDYxYzggCWxkaHUucwlyNiwgQFwocjcsIHI4XCkJLT4JbGRodS5zCXI2LCBAXChyN1wrLCByOFwpCi0gNDM4OgkwNGFjNjFjOCA4NGE4NjFkYSAJbGRodS5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRodS5zCXI2LCBAXChyNywgMHgxYVwpCi0gNDQwOgk4NGE4NjFjMCA4MDAwMTIzNCAJbGRodS5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA0NDg6CTA0NDA2MWM4IDg0NDQ2MWM4IAlsZHcucwlyNiwgQFwocjcsIHI4XCkJLT4JbGR3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0NTA6CTA0NGM2MWM4IDg0NDg2MWRhIAlsZHcucwlyNiwgQFwocjctLCByOFwpCS0+CWxkdy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNDU4Ogk4NDQ4NjFjMCA4MDAwMTIzNCAJbGR3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQ2MDoJOGI0ODEwOWYgMGI0MDEwODQgCW1hYzAJcjEsIHIyLCAweDFmCTwtCW1hYzAJcjEsIHIyLCByNAotIDQ2ODoJOGI0YzEwOWYgMGI0NDEwODQgCW1hYzEJcjEsIHIyLCAweDFmCTwtCW1hYzEJcjEsIHIyLCByNAotIDQ3MDoJOGI1ODEwOWYgMGI1MDEwODQgCW1hY3MwCXIxLCByMiwgMHgxZgk8LQltYWNzMAlyMSwgcjIsIHI0Ci0gNDc4Ogk4YjVjMTA5ZiAwYjU0MTA4NCAJbWFjczEJcjEsIHIyLCAweDFmCTwtCW1hY3MxCXIxLCByMiwgcjQKLSA0ODA6CTA0N2MwMDRhIDg0NzQwMDRhIAltb2RkZWMJcjEsIDB4YQktPgltb2RpbmMJcjEsIDB4YQotIDQ4ODoJOGI2ODEwOWYgMGI2MDEwODQgCW1zdWIwCXIxLCByMiwgMHgxZgk8LQltc3ViMAlyMSwgcjIsIHI0Ci0gNDkwOgk4YjZjMTA5ZiAwYjY0MTA4NCAJbXN1YjEJcjEsIHIyLCAweDFmCTwtCW1zdWIxCXIxLCByMiwgcjQKLSA0OTg6CThiMDgxMDhhIDBiMDAxMDg0IAltdWwJcjEsIHIyLCAweGEJPC0JbXVsCXIxLCByMiwgcjQKLSA0YTA6CThiNzgxMDlmIDBiNzAxMDg0IAltc3ViczAJcjEsIHIyLCAweDFmCTwtCW1zdWJzMAlyMSwgcjIsIHI0Ci0gNGE4Ogk4YjdjMTA5ZiAwYjc0MTA4NCAJbXN1YnMxCXIxLCByMiwgMHgxZgk8LQltc3ViczEJcjEsIHIyLCByNAotIDRiMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDRiODoJOGEwODEwOGEgMGEwMDEwODQgCW11bDJoCXIxLCByMiwgMHhhCTwtCW11bDJoCXIxLCByMiwgcjQKLSA0YzA6CThhNDgxMDhhIDBhNDAxMDg0IAltdWxoeGxsCXIxLCByMiwgMHhhCTwtCW11bGh4bGwJcjEsIHIyLCByNAotIDRjODoJOGE1ODEwOGEgMGE1MDEwODQgCW11bGh4bGgJcjEsIHIyLCAweGEJPC0JbXVsaHhsaAlyMSwgcjIsIHI0Ci0gNGQwOgk4YTY4MTA4YSAwYTYwMTA4NCAJbXVsaHhobAlyMSwgcjIsIDB4YQk8LQltdWxoeGhsCXIxLCByMiwgcjQKLSA0ZDg6CThhNzgxMDhhIDBhNzAxMDg0IAltdWxoeGhoCXIxLCByMiwgMHhhCTwtCW11bGh4aGgJcjEsIHIyLCByNAotIDRlMDoJOGI5MDAwNDQgMGExMDgwODQgCW11bHhzCWEwLCByMSwgcjQJPC0JbXVseDJoCXI4LCByMiwgcjQKLSA0ZTg6CThiODgxMDhhIDBiODAwMDQ0IAltdWx4CWExLCByMiwgMHhhCTwtCW11bHgJYTAsIHIxLCByNAotIDRmMDoJOGJmODIwNGEgMGJmMDEwMDQgCW12ZmFjYwlyMiwgYTEsIDB4YQk8LQltdmZhY2MJcjEsIGEwLCByNAotIDRmODoJOGI5ODEwOGEgMGExODgwOGEgCW11bHhzCWExLCByMiwgMHhhCTwtCW11bHgyaAlyOCwgcjIsIDB4YQotIDUwMDoJMDFlMGEwODAgODFlMGExYzAgCW12ZnN5cwlyMTAsIHBjCS0+CW12ZnN5cwlyMTAsIHJwdF9jCi0gNTA4OgkwMWUwYTAwMCA4MWUwYTAwMiAJbXZmc3lzCXIxMCwgcHN3CS0+CW12ZnN5cwlyMTAsIHBzd2gKLSA1MTA6CTAxZTBhMDAxIDgxZTBhMDAzIAltdmZzeXMJcjEwLCBwc3dsCS0+CW12ZnN5cwlyMTAsIGYwCi0gNTE4OgkwMWUwYTEwMyA4YWYwMTA4NCAJbXZmc3lzCXIxMCwgcwktPgltdnRhY2MJYTEsIHIyLCByNAotIDUyMDoJMDBlMDcyODAgODBlMDAyODAgCW12dHN5cwlycHRfYywgcjEwCS0+CW12dHN5cwlwc3csIHIxMAotIDUyODoJMDBlMDAyODIgODBlMDAyODEgCW12dHN5cwlwc3doLCByMTAJLT4JbXZ0c3lzCXBzd2wsIHIxMAotIDUzMDoJMDBlMDAyODMgODBlMDMyODMgCW12dHN5cwlmMCwgcjEwCS0+CW12dHN5cwlmMywgcjEwCi0gNTM4OgkwMGUwNDI4MyA4MGUwNTI4MyAJbXZ0c3lzCXMsIHIxMAktPgltdnRzeXMJdiwgcjEwCi0gNTQwOgkwMGUwNjI4MyA4MGUwNzI4MyAJbXZ0c3lzCXZhLCByMTAJLT4JbXZ0c3lzCWMsIHIxMAotIDU0ODoJMDBmMDAwMDAgODM5MDEwODAgCW5vcAkJLT4Jbm90CXIxLCByMgotIDU1MDoJMDI5MDEwODAgODNhMDEwODQgCW5vdGZnCWYxLCBmMgktPglvci5zCXIxLCByMiwgcjQKLSA1NTg6CTAzYTgxMDlhIDAwZjAwMDAwIAlvci5zCXIxLCByMiwgMHgxYQl8fAlub3AJCi0gNTYwOgk4M2E4MTBiNyA4YWIxZjAwZCAJb3IubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSA1Njg6CTAyYTAxMDg0IDgyYTg0MDgxIAlvcmZnCWYxLCBmMiwgcwktPglvcmZnCXMsIGYyLCAweDEKLSA1NzA6CTAwODAwMDAwIDAwZjAwMDAwIAlyZWl0CQl8fAlub3AJCi0gNTc4OgkwMTgwMTAwMiAwMGYwMDAwMCAJcmVwZWF0LnMJcjEsIHIyCXx8CW5vcAkKLSA1ODA6CTgxODg0MDAwIDgwMDBkZWFkIAlyZXBlYXQubAlyNCwgZGVhZAlcKGU0MmQgPHN0YXJ0XCsweGU0MmQ+XCkKLSA1ODg6CTgxODg0MDM3IDhhYjFmMDBkIAlyZXBlYXQubAlyNCwgLTIxNTIwZmYzCVwoZGVhZGY1OTUgPHN0YXJ0XCsweGRlYWRmNTk1PlwpCi0gNTkwOgkwMWEwYTAwMSA4MWE4YTIwMCAJcmVwZWF0aS5zCWEJXCg1OWEgPHN0YXJ0XCsweDU5YT5cKSwgcjEJLT4JcmVwZWF0aS5zCWEJXCg1OWEgPHN0YXJ0XCsweDU5YT5cKSwgMTAwMAlcKDE1OTAgPHN0YXJ0XCsweDE1OTA+XCkKLSA1OTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSA1YTA6CTAzNDAxMDg0IDgzNDgxMDhhIAlyb3QJcjEsIHIyLCByNAktPglyb3QJcjEsIHIyLCAweGEKLSA1YTg6CTAzNTAxMDg0IDgzNTgxMDhhIAlyb3QyaAlyMSwgcjIsIHI0CS0+CXJvdDJoCXIxLCByMiwgMHhhCi0gNWIwOgk4YTg4MTA4YSAwYTgwMTA4NCAJc2F0CXIxLCByMiwgMHhhCTwtCXNhdAlyMSwgcjIsIHI0Ci0gNWI4Ogk4YTk4MTA4YSAwYTkwMTA4NCAJc2F0MmgJcjEsIHIyLCAweGEJPC0Jc2F0MmgJcjEsIHIyLCByNAotIDVjMDoJOGJjODEwOGEgMGJjMDEwODQgCXNhdGhsCXIxLCByMiwgMHhhCTwtCXNhdGhsCXIxLCByMiwgcjQKLSA1Yzg6CThiZDgxMDhhIDBiZDAxMDg0IAlzYXRoaAlyMSwgcjIsIDB4YQk8LQlzYXRoaAlyMSwgcjIsIHI0Ci0gNWQwOgk4YWE4MTA4YSAwYWEwMTA4NCAJc2F0eglyMSwgcjIsIDB4YQk8LQlzYXR6CXIxLCByMiwgcjQKLSA1ZDg6CThhYjgxMDhhIDBhYjAxMDg0IAlzYXR6MmgJcjEsIHIyLCAweGEJPC0Jc2F0ejJoCXIxLCByMiwgcjQKLSA1ZTA6CTAzMDAxMDg0IDgzMDgxMDhhIAlzcmEJcjEsIHIyLCByNAktPglzcmEJcjEsIHIyLCAweGEKLSA1ZTg6CTAzMTAxMDg0IDgzMTgxMDhhIAlzcmEyaAlyMSwgcjIsIHI0CS0+CXNyYTJoCXIxLCByMiwgMHhhCi0gNWYwOgkwMzYwMTA4NCA4MzY4MTA4YSAJc3JjCXIxLCByMiwgcjQJLT4Jc3JjCXIxLCByMiwgMHhhCi0gNWY4OgkwMzIwMTA4NCA4MzI4MTA4YSAJc3JsCXIxLCByMiwgcjQJLT4Jc3JsCXIxLCByMiwgMHhhCi0gNjAwOgkwMzMwMTA4NCA4MzM4MTA4YSAJc3JsMmgJcjEsIHIyLCByNAktPglzcmwyaAlyMSwgcjIsIDB4YQotIDYwODoJMDUzMDYxYzggODUzNDYxYzggCXN0MmgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3QyaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjEwOgkwNTNjNjFjOCA4NTM4NjFkYSAJc3QyaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3QyaC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjE4Ogk4NTM4NjFjMCA4MDAwMTIzNCAJc3QyaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2MjA6CTA1NjA2MWM4IDg1NjQ2MWM4IAlzdDJ3LnMJcjYsIEBcKHI3LCByOFwpCS0+CXN0MncucwlyNiwgQFwocjdcKywgcjhcKQotIDYyODoJMDU2YzYxYzggODU2ODYxZGEgCXN0MncucwlyNiwgQFwocjctLCByOFwpCS0+CXN0MncucwlyNiwgQFwocjcsIDB4MWFcKQotIDYzMDoJODU2ODYxYzAgODAwMDEyMzQgCXN0MncubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjM4OgkwNTUwNjFjOCA4NTU0NjFjOCAJc3Q0aGIucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3Q0aGIucwlyNiwgQFwocjdcKywgcjhcKQotIDY0MDoJMDU1YzYxYzggODU1ODYxZGEgCXN0NGhiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdDRoYi5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjQ4Ogk4NTU4NjFjMCA4MDAwMTIzNCAJc3Q0aGIubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjUwOgkwNTAwNjFjOCA4NTA0NjFjOCAJc3RiLnMJcjYsIEBcKHI3LCByOFwpCS0+CXN0Yi5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjU4OgkwNTBjNjFjOCA4NTA4NjFkYSAJc3RiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdGIucwlyNiwgQFwocjcsIDB4MWFcKQotIDY2MDoJODUwODYxYzAgODAwMDEyMzQgCXN0Yi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2Njg6CTA1MjA2MWM4IDg1MjQ2MWM4IAlzdGgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2NzA6CTA1MmM2MWM4IDg1Mjg2MWRhIAlzdGgucwlyNiwgQFwocjctLCByOFwpCS0+CXN0aC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjc4Ogk4NTI4NjFjMCA4MDAwMTIzNCAJc3RoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY4MDoJMDUxMDYxYzggODUxNDYxYzggCXN0aGgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RoaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjg4OgkwNTFjNjFjOCA4NTE4NjFkYSAJc3RoaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3RoaC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjkwOgk4NTE4NjFjMCA4MDAwMTIzNCAJc3RoaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2OTg6CTA1NDA2MWM4IDg1NDQ2MWM4IAlzdHcucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3R3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2YTA6CTA1NGM2MWM4IDg1NDg2MWRhIAlzdHcucwlyNiwgQFwocjctLCByOFwpCS0+CXN0dy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNmE4Ogk4NTQ4NjFjMCA4MDAwMTIzNCAJc3R3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDZiMDoJMDgyMDEwODMgODgyYjJjZGEgCXN1Yi5zCXIxLCByMiwgcjMJLT4Jc3ViLnMJcjUwLCByNTEsIDB4MWEKLSA2Yjg6CTg4MmIyY2Y3IDhhYjFiZWVmIAlzdWIubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZjMDoJMDgzMDEwODMgODgzYjJjZGEgCXN1YjJoLnMJcjEsIHIyLCByMwktPglzdWIyaC5zCXI1MCwgcjUxLCAweDFhCi0gNmM4Ogk4ODNiMmNmNyA4YWIxYmVlZiAJc3ViMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZkMDoJMDg1MDEwODMgODg1YjJjZGEgCXN1YmIucwlyMSwgcjIsIHIzCS0+CXN1YmIucwlyNTAsIHI1MSwgMHgxYQotIDZkODoJODg1YjJjZjcgOGFiMWJlZWYgCXN1YmIubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZlMDoJMDk4MDEwODMgODk4YjJjZGEgCXN1YmhsbGwucwlyMSwgcjIsIHIzCS0+CXN1YmhsbGwucwlyNTAsIHI1MSwgMHgxYQotIDZlODoJODk4YjJjZjcgOGFiMWJlZWYgCXN1YmhsbGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZmMDoJMDk5MDEwODMgODk5YjJjZGEgCXN1YmhsbGgucwlyMSwgcjIsIHIzCS0+CXN1YmhsbGgucwlyNTAsIHI1MSwgMHgxYQotIDZmODoJODk5YjJjZjcgOGFiMWJlZWYgCXN1YmhsbGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcwMDoJMDlhMDEwODMgODlhYjJjZGEgCXN1YmhsaGwucwlyMSwgcjIsIHIzCS0+CXN1YmhsaGwucwlyNTAsIHI1MSwgMHgxYQotIDcwODoJODlhYjJjZjcgOGFiMWJlZWYgCXN1YmhsaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcxMDoJMDliMDEwODMgODliYjJjZGEgCXN1YmhsaGgucwlyMSwgcjIsIHIzCS0+CXN1YmhsaGgucwlyNTAsIHI1MSwgMHgxYQotIDcxODoJODliYjJjZjcgOGFiMWJlZWYgCXN1YmhsaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcyMDoJMDljMDEwODMgODljYjJjZGEgCXN1YmhobGwucwlyMSwgcjIsIHIzCS0+CXN1YmhobGwucwlyNTAsIHI1MSwgMHgxYQotIDcyODoJODljYjJjZjcgOGFiMWJlZWYgCXN1YmhobGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDczMDoJMDlkMDEwODMgODlkYjJjZGEgCXN1YmhobGgucwlyMSwgcjIsIHIzCS0+CXN1YmhobGgucwlyNTAsIHI1MSwgMHgxYQotIDczODoJODlkYjJjZjcgOGFiMWJlZWYgCXN1YmhobGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc0MDoJMDllMDEwODMgODllYjJjZGEgCXN1YmhoaGwucwlyMSwgcjIsIHIzCS0+CXN1YmhoaGwucwlyNTAsIHI1MSwgMHgxYQotIDc0ODoJODllYjJjZjcgOGFiMWJlZWYgCXN1YmhoaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc1MDoJMDlmMDEwODMgODlmYjJjZGEgCXN1YmhoaGgucwlyMSwgcjIsIHIzCS0+CXN1YmhoaGgucwlyNTAsIHI1MSwgMHgxYQotIDc1ODoJODlmYjJjZjcgOGFiMWJlZWYgCXN1YmhoaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc2MDoJMDA5MDAwMDEgMDBmMDAwMDAgCXRyYXAucwlyMQl8fAlub3AJCi0gNzY4OgkwMDk4MDAwYSAwMGYwMDAwMCAJdHJhcC5zCTB4YQl8fAlub3AJCi0gNzcwOgkwM2IwMTA4NCA4M2I4MTA4YSAJeG9yLnMJcjEsIHIyLCByNAktPgl4b3IucwlyMSwgcjIsIDB4YQotIDc3ODoJODNiODEwYjcgOGFiMWYwMGQgCXhvci5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDc4MDoJMDJiMDEwODQgODJiODExMGEgCXhvcmZnCWYxLCBmMiwgcwktPgl4b3JmZwlmMSwgcywgMHhhCi0gNzg4OgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gNzkwOgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gNzk4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gN2EwOgk4MGYwMDAwMCAwMGYwMDAwMCAJbm9wCQk8LQlub3AJCi0gN2E4OgkwMzkwMTA4MCAwMGYwMDAwMCAJbm90CXIxLCByMgl8fAlub3AJCi0gN2IwOgkwMzkwMjBjMCA4MGYwMDAwMCAJbm90CXIyLCByMwktPglub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY2MTFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLSMgdGVzdCBhbGwgaW5zdHJ1Y3Rpb25zCi0KLXN0YXJ0OgotCWFicwlyMjEscjQyCi0KLQlhZGQJcjEscjIscjMKLQlhZGQJcjUwLHI1MSwweDFhCi0JYWRkCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkMmgJcjEscjIscjMKLQlhZGQyaAlyNTAscjUxLDB4MWEKLQlhZGQyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGMJcjEscjIscjMKLQlhZGRjCXI1MCxyNTEsMHgxYQotCWFkZGMJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGxsCXIxLHIyLHIzCi0JYWRkaGxsbAlyNTAscjUxLDB4MWEKLQlhZGRobGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGxsaAlyMSxyMixyMwotCWFkZGhsbGgJcjUwLHI1MSwweDFhCi0JYWRkaGxsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsaGwJcjEscjIscjMKLQlhZGRobGhsCXI1MCxyNTEsMHgxYQotCWFkZGhsaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGhoCXIxLHIyLHIzCi0JYWRkaGxoaAlyNTAscjUxLDB4MWEKLQlhZGRobGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQkKLQlhZGRoaGxsCXIxLHIyLHIzCi0JYWRkaGhsbAlyNTAscjUxLDB4MWEKLQlhZGRoaGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGhsaAlyMSxyMixyMwotCWFkZGhobGgJcjUwLHI1MSwweDFhCi0JYWRkaGhsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhoaGwJcjEscjIscjMKLQlhZGRoaGhsCXI1MCxyNTEsMHgxYQotCWFkZGhoaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRoaGhoCXIxLHIyLHIzCi0JYWRkaGhoaAlyNTAscjUxLDB4MWEKLQlhZGRoaGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQotCWFkZHMJcjEscjIscjMKLQlhZGRzCXI1MCxyNTEsMHgxYQotCWFkZHMJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFkZHMyaAlyMSxyMixyMwotCWFkZHMyaAlyNTAscjUxLDB4MWEKLQlhZGRzMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFuZAlyMSxyMixyMwotCWFuZAlyNTAscjUxLDB4MWEKLQlhbmQJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhbmRmZwlmMCxmMSxmMgotCWFuZGZnCWYzLGY0LDUKLQkKLQlhdmcJcjEscjIscjMKLQlhdmcJcjQscjUsNgotCWF2ZwlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWF2ZzJoCXIxLHIyLHIzCi0JYXZnMmgJcjQscjUsNgotCWF2ZzJoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYmNscglyMSxyMixyMwotCWJjbHIJcjQscjUsNgotCQotCWJub3QJcjEscjIscjMKLQlibm90CXI1LHI1MSw2Ci0JCQkKLQlicmEJcjQxCi0JYnJhCTB4NDAKLQlicmEJMHhmMDBkCi0KLQlicmF0bnoJcjQxLHI0MgotCWJyYXRueglyMSwweGYwMGQKLQlicmF0bnoJcjEsMHhkZWFkZjAwZAotCi0JYnJhdHpyCXI0MSxyNDIKLQlicmF0enIJcjEsMHhmMDBkCi0JYnJhdHpyCXIxLDB4ZGVhZGYwMGQKLQotCWJzZXQJcjEscjIscjMKLQlic2V0CXI1LHI1MSw2Ci0KLQlic3IJcjQxCi0JYnNyCTB4ZjAwZAotCWJzcgkweGRlYWRmMDBkCi0KLQlic3J0bnoJcjQxLHI0MgotCWJzcnRueglyMSwweGYwMGQKLQlic3J0bnoJcjEsMHhkZWFkZjAwZAotCi0JYnNydHpyCXI0MSxyNDIKLQlic3J0enIJcjEsMHhmMDBkCi0JYnNydHpyCXIxLDB4ZGVhZGYwMGQKLQotCWJ0c3QJZjEscjIscjMKLQlidHN0CWY1LHI1MSw2Ci0JCQkJCQkKLQljbXBlcQlmMCxyMyxyMQotCWNtcG5lCWYxLHIyMCxyMjEKLQljbXBndAlmMixyMzEscjMyCi0JY21wZ2UJZjMscjMscjQKLQljbXBsdAlmNCxyMyxyNAotCWNtcGxlCWY1LHIzLHI0Ci0JY21wcHMJZjYscjMscjQKLQljbXBuZwlmNyxyMyxyNAkJCQkKLQotCWNtcHVndAlmMixyMzEscjMyCi0JY21wdWdlCWYzLHIzLHI0Ci0JY21wdWx0CWY0LHIzLHI0Ci0JY21wdWxlCWY1LHIzLHI0Ci0JCQotCWRicmEJcjEscjggCi0JZGJyYQlyMSwweDEwMAotCWRicmEJcjEsMHhkZWFkZjAwZAotCi0JZGJyYWkJMHgxMCxyMzEKLQlkYnJhaQkweDEwLDB4MTAwCi0JZGJyYWkJMHgxMCwweGRlYWRmMDBkCi0KLQlkYnNyCXIxLHI4IHx8IG5vcAotCWRic3IJcjEsMHgxMDAgfHwgbm9wCi0JZGJzcglyMSwweGRlYWRmMDBkCi0KLQlkYnNyaQkweDIwLHIzMSB8fCBub3AKLQlkYnNyaQkweDIwLDB4MTAwIHx8IG5vcAotCWRic3JpCTB4MjAsMHhkZWFkZjAwZAotCi0JZGptcAlyMSxyMzIKLQlkam1wCXIxLDB4ZjAwZAotCWRqbXAJcjEsMHhkZWFkZjAwZAotCi0JZGptcGkJMHgzMCxyMzIKLQlkam1waQkweDMwLDB4ZjAwZAotCWRqbXBpCTB4MzAsMHhkZWFkZjAwZAotCi0JZGpzcglyMSxyMzIKLQlkanNyCXIxLDB4ZjAwZAotCWRqc3IJcjEsMHhkZWFkZjAwZAotCi0JZGpzcmkJMHgxMCxyMzIKLQlkanNyaQkweDIwLDB4ZjAwZAotCWRqc3JpCTB4NDAsMHhkZWFkZjAwZAotCQotCWptcAlyNDEKLQlqbXAJMHhmMDBkCi0Jam1wCTB4ZGVhZGYwMGQKLQotCWptcHRueglyNDEscjQyCi0Jam1wdG56CXIxLDB4ZjAwZAotCWptcHRueglyMSwweGRlYWRmMDBkCi0KLQlqbXB0enIJcjQxLHI0MgotCWptcHR6cglyMSwweGYwMGQKLQlqbXB0enIJcjEsMHhkZWFkZjAwZAotCi0Jam9pbmxsCXIxLHIyLHI0Ci0Jam9pbmxsCXIxLHIyLDB4ZgotCWpvaW5sbAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmxoCXIxLHIyLHI0Ci0Jam9pbmxoCXIxLHIyLDB4ZgotCWpvaW5saAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmhsCXIxLHIyLHI0Ci0Jam9pbmhsCXIxLHIyLDB4ZgotCWpvaW5obAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmhoCXIxLHIyLHI0Ci0Jam9pbmhoCXIxLHIyLDB4ZgotCWpvaW5oaAlyMSxyMiwweGRlYWRmMDBkCQotCi0JanNyCXI0MQotCWpzcgkweGYwMGQKLQlqc3IJMHhkZWFkZjAwZAotCi0JanNydG56CXI0MSxyNDIKLQlqc3J0bnoJcjEsMHhmMDBkCi0JanNydG56CXIxLDB4ZGVhZGYwMGQKLQotCWpzcnR6cglyNDEscjQyCi0JanNydHpyCXIxLDB4ZjAwZAotCWpzcnR6cglyMSwweGRlYWRmMDBkCi0JCQkJCQotCWxkMmgJcjYsQChyNyxyOCkKLQlsZDJoCXI2LEAocjcrLHI4KQotCWxkMmgJcjYsQChyNy0scjgpCi0JbGQyaAlyNixAKHI3LDB4MWEpCi0JbGQyaAlyNixAKHI3LDB4MTIzNCkKLQkKLQlsZDJ3CXI2LEAocjcscjgpCi0JbGQydwlyNixAKHI3KyxyOCkKLQlsZDJ3CXI2LEAocjctLHI4KQotCWxkMncJcjYsQChyNywweDFhKQotCWxkMncJcjYsQChyNywweDEyMzQpCi0JCi0JbGQ0YmgJcjYsQChyNyxyOCkKLQlsZDRiaAlyNixAKHI3KyxyOCkKLQlsZDRiaAlyNixAKHI3LSxyOCkKLQlsZDRiaAlyNixAKHI3LDB4MWEpCi0JbGQ0YmgJcjYsQChyNywweDEyMzQpCi0KLQlsZDRiaHUJcjYsQChyNyxyOCkKLQlsZDRiaHUJcjYsQChyNysscjgpCi0JbGQ0Ymh1CXI2LEAocjctLHI4KQotCWxkNGJodQlyNixAKHI3LDB4MWEpCi0JbGQ0Ymh1CXI2LEAocjcsMHgxMjM0KQotCi0JbGRiCXI2LEAocjcscjgpCi0JbGRiCXI2LEAocjcrLHI4KQotCWxkYglyNixAKHI3LSxyOCkKLQlsZGIJcjYsQChyNywweDFhKQotCWxkYglyNixAKHI3LDB4MTIzNCkKLQotCWxkYnUJcjYsQChyNyxyOCkKLQlsZGJ1CXI2LEAocjcrLHI4KQotCWxkYnUJcjYsQChyNy0scjgpCi0JbGRidQlyNixAKHI3LDB4MWEpCi0JbGRidQlyNixAKHI3LDB4MTIzNCkKLQotCWxkaAlyNixAKHI3LHI4KQotCWxkaAlyNixAKHI3KyxyOCkKLQlsZGgJcjYsQChyNy0scjgpCi0JbGRoCXI2LEAocjcsMHgxYSkKLQlsZGgJcjYsQChyNywweDEyMzQpCi0KLQlsZGhoCXI2LEAocjcscjgpCi0JbGRoaAlyNixAKHI3KyxyOCkKLQlsZGhoCXI2LEAocjctLHI4KQotCWxkaGgJcjYsQChyNywweDFhKQotCWxkaGgJcjYsQChyNywweDEyMzQpCi0KLQlsZGh1CXI2LEAocjcscjgpCi0JbGRodQlyNixAKHI3KyxyOCkKLQlsZGh1CXI2LEAocjctLHI4KQotCWxkaHUJcjYsQChyNywweDFhKQotCWxkaHUJcjYsQChyNywweDEyMzQpCi0KLQlsZHcJcjYsQChyNyxyOCkKLQlsZHcJcjYsQChyNysscjgpCi0JbGR3CXI2LEAocjctLHI4KQotCWxkdwlyNixAKHI3LDB4MWEpCi0JbGR3CXI2LEAocjcsMHgxMjM0KQotCQkJCQkJCQotCW1hYzAJcjEscjIscjQKLQltYWMwCXIxLHIyLDB4MWYKLQltYWMxCXIxLHIyLHI0Ci0JbWFjMQlyMSxyMiwweDFmCi0KLQltYWNzMAlyMSxyMixyNAotCW1hY3MwCXIxLHIyLDB4MWYKLQltYWNzMQlyMSxyMixyNAotCW1hY3MxCXIxLHIyLDB4MWYKLQotCW1vZGRlYwlyMSwweGEKLQotCW1vZGluYwlyMSwweGEKLQotCW1zdWIwCXIxLHIyLHI0Ci0JbXN1YjAJcjEscjIsMHgxZgotCW1zdWIxCXIxLHIyLHI0Ci0JbXN1YjEJcjEscjIsMHgxZgotCi0JbXVsCXIxLHIyLHI0Ci0JbXVsCXIxLHIyLDB4YQotCi0JbXN1YnMwCXIxLHIyLHI0Ci0JbXN1YnMwCXIxLHIyLDB4MWYKLQltc3ViczEJcjEscjIscjQKLQltc3ViczEJcjEscjIsMHgxZgotCi0JbXVsMmgJcjEscjIscjQKLQltdWwyaAlyMSxyMiwweGEKLQkKLQltdWxoeGxsCXIxLHIyLHI0Ci0JbXVsaHhsbAlyMSxyMiwweGEKLQotCW11bGh4bGgJcjEscjIscjQKLQltdWxoeGxoCXIxLHIyLDB4YQotCi0JbXVsaHhobAlyMSxyMixyNAotCW11bGh4aGwJcjEscjIsMHhhCi0KLQltdWxoeGhoCXIxLHIyLHI0Ci0JbXVsaHhoaAlyMSxyMiwweGEKLQotCW11bHgyaAlyOCxyMixyNAotCW11bHhzCWEwLHIxLHI0Ci0JCi0JbXVseAlhMCxyMSxyNAotCW11bHgJYTEscjIsMHhhCi0KLQltdmZhY2MJcjEsYTAscjQKLQltdmZhY2MJcjIsYTEsMHhhCi0KLQltdWx4MmgJcjgscjIsMHhhCi0JbXVseHMJYTEscjIsMHhhCi0JCQotCW12ZnN5cwlyMTAscGMKLQltdmZzeXMJcjEwLHJwdF9jCi0JbXZmc3lzCXIxMCxwc3cKLQltdmZzeXMJcjEwLHBzd2gKLQltdmZzeXMJcjEwLHBzd2wKLQltdmZzeXMJcjEwLGYwCi0JbXZmc3lzCXIxMCxTCi0KLQltdnRhY2MJYTEscjIscjQKLQotCW12dHN5cwlycHRfYywgcjEwCi0JbXZ0c3lzCXBzdywgcjEwCi0JbXZ0c3lzCXBzd2gsIHIxMAotCW12dHN5cwlwc3dsLCByMTAKLQltdnRzeXMJZjAsIHIxMAotCW12dHN5cwlmMywgcjEwCi0JbXZ0c3lzCVMsIHIxMAotCW12dHN5cwlWLCByMTAKLQltdnRzeXMJVkEsIHIxMAotCW12dHN5cwlDLCByMTAKLQotCW5vcAotCi0Jbm90CXIxLHIyCi0KLQlub3RmZwlmMSxmMgotCi0Jb3IJcjEscjIscjQKLQlvcglyMSxyMiwweDFhCi0Jb3IJcjEscjIsMHhkZWFkZjAwZAotCi0Jb3JmZwlmMSxmMixmNAotCW9yZmcJZjQsZjIsMHgxCi0JCi0JcmVpdAotCi0JcmVwZWF0CXIxLHIyCi0JcmVwZWF0CXI0LDB4ZGVhZAotCXJlcGVhdAlyNCwweGRlYWRmMDBkCi0KLQlyZXBlYXRpCTB4YSxyMQotCXJlcGVhdGkJMHhhLDB4MTAwMQotCi0Jbm9wIHx8IG5vcAotCQotCXJvdAlyMSxyMixyNAotCXJvdAlyMSxyMiwweGEKLQotCXJvdDJoCXIxLHIyLHI0Ci0Jcm90MmgJcjEscjIsMHhhCi0KLQlzYXQJcjEscjIscjQKLQlzYXQJcjEscjIsMHhhCi0KLQlzYXQyaAlyMSxyMixyNAotCXNhdDJoCXIxLHIyLDB4YQotCi0Jc2F0aGwJcjEscjIscjQKLQlzYXRobAlyMSxyMiwweGEKLQotCXNhdGhoCXIxLHIyLHI0Ci0Jc2F0aGgJcjEscjIsMHhhCi0JCQotCXNhdHoJcjEscjIscjQKLQlzYXR6CXIxLHIyLDB4YQotCi0Jc2F0ejJoCXIxLHIyLHI0Ci0Jc2F0ejJoCXIxLHIyLDB4YQotCQkJCi0Jc3JhCXIxLHIyLHI0Ci0Jc3JhCXIxLHIyLDB4YQotCi0Jc3JhMmgJcjEscjIscjQKLQlzcmEyaAlyMSxyMiwweGEKLQotCXNyYwlyMSxyMixyNAotCXNyYwlyMSxyMiwweGEKLQkKLQlzcmwJcjEscjIscjQKLQlzcmwJcjEscjIsMHhhCi0KLQlzcmwyaAlyMSxyMixyNAotCXNybDJoCXIxLHIyLDB4YQotCi0JCi0Jc3QyaAlyNixAKHI3LHI4KQotCXN0MmgJcjYsQChyNysscjgpCi0Jc3QyaAlyNixAKHI3LSxyOCkKLQlzdDJoCXI2LEAocjcsMHgxYSkKLQlzdDJoCXI2LEAocjcsMHgxMjM0KQotCQkKLQlzdDJ3CXI2LEAocjcscjgpCi0Jc3QydwlyNixAKHI3KyxyOCkKLQlzdDJ3CXI2LEAocjctLHI4KQotCXN0MncJcjYsQChyNywweDFhKQotCXN0MncJcjYsQChyNywweDEyMzQpCi0KLQlzdDRoYglyNixAKHI3LHI4KQotCXN0NGhiCXI2LEAocjcrLHI4KQotCXN0NGhiCXI2LEAocjctLHI4KQotCXN0NGhiCXI2LEAocjcsMHgxYSkKLQlzdDRoYglyNixAKHI3LDB4MTIzNCkKLQotCXN0YglyNixAKHI3LHI4KQotCXN0YglyNixAKHI3KyxyOCkKLQlzdGIJcjYsQChyNy0scjgpCi0Jc3RiCXI2LEAocjcsMHgxYSkKLQlzdGIJcjYsQChyNywweDEyMzQpCi0KLQlzdGgJcjYsQChyNyxyOCkKLQlzdGgJcjYsQChyNysscjgpCi0Jc3RoCXI2LEAocjctLHI4KQotCXN0aAlyNixAKHI3LDB4MWEpCi0Jc3RoCXI2LEAocjcsMHgxMjM0KQotCi0Jc3RoaAlyNixAKHI3LHI4KQotCXN0aGgJcjYsQChyNysscjgpCi0Jc3RoaAlyNixAKHI3LSxyOCkKLQlzdGhoCXI2LEAocjcsMHgxYSkKLQlzdGhoCXI2LEAocjcsMHgxMjM0KQotCi0Jc3R3CXI2LEAocjcscjgpCi0Jc3R3CXI2LEAocjcrLHI4KQotCXN0dwlyNixAKHI3LSxyOCkKLQlzdHcJcjYsQChyNywweDFhKQotCXN0dwlyNixAKHI3LDB4MTIzNCkKLQkJCQkJCQkJCi0Jc3ViCXIxLHIyLHIzCi0Jc3ViCXI1MCxyNTEsMHgxYQotCXN1YglyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YjJoCXIxLHIyLHIzCi0Jc3ViMmgJcjUwLHI1MSwweDFhCi0Jc3ViMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJiCXIxLHIyLHIzCi0Jc3ViYglyNTAscjUxLDB4MWEKLQlzdWJiCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxsbAlyMSxyMixyMwotCXN1YmhsbGwJcjUwLHI1MSwweDFhCi0Jc3ViaGxsbAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhsbGgJcjEscjIscjMKLQlzdWJobGxoCXI1MCxyNTEsMHgxYQotCXN1YmhsbGgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGhsCXIxLHIyLHIzCi0Jc3ViaGxobAlyNTAscjUxLDB4MWEKLQlzdWJobGhsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxoaAlyMSxyMixyMwotCXN1YmhsaGgJcjUwLHI1MSwweDFhCi0Jc3ViaGxoaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0Jc3ViaGhsbAlyMSxyMixyMwotCXN1YmhobGwJcjUwLHI1MSwweDFhCi0Jc3ViaGhsbAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhobGgJcjEscjIscjMKLQlzdWJoaGxoCXI1MCxyNTEsMHgxYQotCXN1YmhobGgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJoaGhsCXIxLHIyLHIzCi0Jc3ViaGhobAlyNTAscjUxLDB4MWEKLQlzdWJoaGhsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGhoaAlyMSxyMixyMwotCXN1YmhoaGgJcjUwLHI1MSwweDFhCi0Jc3ViaGhoaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkKLQl0cmFwCXIxCi0JdHJhcAkweGEKLQotCXhvcglyMSxyMixyNAotCXhvcglyMSxyMiwweGEKLQl4b3IJcjEscjIsMHhkZWFkZjAwZAotCi0JeG9yZmcJZjEsZjIsZjQKLQl4b3JmZwlmMSxmNCwweGEKLQotIyBWTElXIHN5bnRheCB0ZXN0Ci0Jbm9wCi0Jbm9wCi0Jbm9wCS0+CW5vcAotCW5vcAl8fAlub3AKLQlub3AJPC0Jbm9wCi0KLSMgdHJ5IGNoYW5naW5nIHNlY3Rpb25zCi0Jbm90CXIxLHIyCi0JLnNlY3Rpb24gLmZvbwotCWFkZAlyMTAscjEyLDYKLQkudGV4dAotCW5vdAlyMixyMwotCW5vcAotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyOWY4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jb2JqZHVtcDogLWxkcgotI25hbWU6IEQzMFYgZGVidWcgKC1nKSB0ZXN0Ci0jYXM6IC1nCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8X2FiYy0weDE4PjoKLS4qbGFiZWwtZGVidWcuczo0Ci0gICAwOgkxMDA4MDAwMyAwMGYwMDAwMCAJYnJhLnNcL3R4CTE4CVwoMTggPF9hYmM+XCkJXHxcfAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6NQotICAgODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotICAxMDoJMGUwMDAwMDQgMDBmMDAwMDAgCS5sb25nCTB4ZTAwMDAwNAl8fAlub3AJCi0KLTAwMDAwMDE4IDxfYWJjPjoKLS4qbGFiZWwtZGVidWcuczo4Ci0gIDE4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6OQotICAyMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotLipsYWJlbC1kZWJ1Zy5zOjEwCi0gIDI4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6MTEKLSAgMzA6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0MGFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRyaWVzCi0JCi0JLnRleHQKLQlicmEucy90eCBfYWJjICAgfHwgbm9wIAotCW5vcCAgICAgfHwgbm9wIAotCS53b3JkIDB4MGUwMDAwMDQKLV9hYmM6Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2ZjZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgbGFiZWwgYWxpZ25tZW50IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxfYWJjLTB4MTg+OgotICAgMDoJMTAwODAwMDMgMDBmMDAwMDAgCWJyYS5zL3R4CTE4CSgxOCA8X2FiYz4pCXx8CW5vcAkKLSAgIDg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSAgMTA6CTBlMDAwMDA0IDAwZjAwMDAwIAkubG9uZwkweGUwMDAwMDQJfHwJbm9wCQotCi0wMDAwMDAxOCA8X2FiYz46Ci0gIDE4OgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gIDIwOgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDBhYTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBsYWJlbHMgc2hvdWxkIGJlIGFsaWduZWQgb24gOC1ieXRlIGJvdW5kcmllcwotCQotCS50ZXh0Ci0JYnJhLnMvdHggX2FiYyAgIHx8IG5vcCAKLQlub3AgICAgIHx8IG5vcCAKLQkud29yZCAweDBlMDAwMDA0Ci1fYWJjOgotCW5vcAotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTBhNTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGFsaWdubWVudCB0ZXN0Ci0jYXM6IC1XTwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CThhMTA1MTg3IDBhMTAyMGM0IAltdWx4MmgJcjUsIHI2LCByNwk8LQltdWx4MmgJcjIsIHIzLCByNAotICAgODoJMDBmMDAwMDAgMGExMDgyNGEgCW5vcAkJfHwJbXVseDJoCXI4LCByOSwgcjEwCi0gIDEwOgkwMGYwMDAwMCAwYTEwYjMwZCAJbm9wCQl8fAltdWx4MmgJcjExLCByMTIsIHIxMwotICAxODoJOGExMTE0OTMgMGExMGUzZDAgCW11bHgyaAlyMTcsIHIxOCwgcjE5CTwtCW11bHgyaAlyMTQsIHIxNSwgcjE2Ci0gIDIwOgk4YTExNzYxOSAwYTExNDU1NiAJbXVseDJoCXIyMywgcjI0LCByMjUJPC0JbXVseDJoCXIyMCwgcjIxLCByMjIKLSAgMjg6CThiMDFkNzlmIDBhMTFhNmRjIAltdWwJcjI5LCByMzAsIHIzMQk8LQltdWx4MmgJcjI2LCByMjcsIHIyOAotICAzMDoJOGIwMDUxODcgMGIwMDIwYzQgCW11bAlyNSwgcjYsIHI3CTwtCW11bAlyMiwgcjMsIHI0Ci0gIDM4Ogk4YTEwYjMwZCAwYTEwODI0YSAJbXVseDJoCXIxMSwgcjEyLCByMTMJPC0JbXVseDJoCXI4LCByOSwgcjEwCi0gIDQwOgk4MGYwMDAwMCAwYjAwZTNkMCAJbm9wCQk8LQltdWwJcjE0LCByMTUsIHIxNgotICA0ODoJMDBmMDAwMDAgMGExMTE0OTMgCW5vcAkJfHwJbXVseDJoCXIxNywgcjE4LCByMTkKLSAgNTA6CThiMDE3NjE5IDBhMTE0NTU2IAltdWwJcjIzLCByMjQsIHIyNQk8LQltdWx4MmgJcjIwLCByMjEsIHIyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjc4NTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgIE9uZSBvZiB0aGUgcnVsZSBvbiByZXN0cmljdGVkIHNlcXVlbmNlIGlzIGNvbnNlY3V0aXZlIElVIGluc3RydWN0aW9uIAotIyAgICAgICBJVTogTVVMLCBNQUMsIE1BQ1MsIE1TVUIsIE1TVUJTICAoYSkgICAgCi0jICAgICAgIElVOiBNVUxIWHBwLCBNVUxYMkgsIE1VTDJIICAgICAgKGIpCi0jIFRoaXMgbWVhbnMgdGhhdCBpbnN0cnVjdGlvbnMgaW4gZ3JvdXAgKGEpIGFuZCBpbiAoYikgc2hvdWxkIG5vdCBiZSBleGVjdXRlZAotIyBpbiBJVSBpbiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gdGhlIG9yZGVyIChhKS0+KGIpLiBJdCBkb2VzIG5laXRoZXIgcHJvaGliaXQKLSMgZXhlY3V0aW9ucyBpbiB0aGUgcmV2ZXJzZSBvcmRlciAoYiktPiAoYSkgbm9yIGNvbnNlY3V0aXZlIGV4ZWN1dGlvbiBvZgotIyBncm91cCAoYSktPihhKSBvciAoYiktPihiKQotCi0JbXVseDJoIHI1LHI2LHI3CQk8LQltdWx4MmggcjIscjMscjQKLQlub3AJfHwJbXVseDJoIHI4LHI5LHIxMAotCW5vcAl8fAltdWx4MmggcjExLHIxMixyMTMgICAgICAgCi0JbXVseDJoIHIxNCxyMTUscjE2Ci0JbXVseDJoIHIxNyxyMTgscjE5ICAgICAgCi0JbXVseDJoIHIyMyxyMjQscjI1ICAgICA8LQltdWx4MmggcjIwLHIyMSxyMjIKLQltdWwgICAgcjI5LHIzMCxyMzEgICAgIDwtCW11bHgyaCByMjYscjI3LHIyOAotCW11bCAgICByNSwgcjYsIHI3ICAgICAgPC0JbXVsIHIyLCByMywgcjQKLQltdWx4MmggcjExLCByMTIsIHIxMyAgIDwtCW11bHgyaCByOCwgcjksIHIxMAotCW11bHgyaCByMTcsIHIxOCwgcjE5ICAgPC0JbXVsIHIxNCwgcjE1LCByMTYKLQltdWwgICAgcjIzLCByMjQsIHIyNSAgIDwtCW11bHgyaCByMjAsIHIyMSwgcjIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiZmE5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgb3B0aW1pemF0aW9uIHRlc3QKLSNhczogLU8KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxzdGFydD46Ci0gICAwOgkwODgwMTA4MCAwODgwMzEwMCAJYWJzCXIxLCByMgl8fAlhYnMJcjMsIHI0Ci0gICA4OgkwMjkwMDEwMCAwMjkwMTA4MCAJbm90ZmcJZjAsIHMJfHwJbm90ZmcJZjEsIGYyCi0gIDEwOgkwODgwMTA4MCAwMjkwMTA4MCAJYWJzCXIxLCByMgl8fAlub3RmZwlmMSwgZjIKLSAgMTg6CTA4MDAxMDgzIDgyOTA3MDAwIAlhZGQucwlyMSwgcjIsIHIzCS0+CW5vdGZnCWMsIGYwCi0gIDIwOgkwODAwMTA4MyA4MjkwMDFjMCAJYWRkLnMJcjEsIHIyLCByMwktPglub3RmZwlmMCwgYwotICAyODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgyOCA8c3RhcnRcKzB4Mjg+XCkJfHwJbm9wCQotICAzMDoJMDg4MDEwODAgODg4MDEwODAgCWFicwlyMSwgcjIJLT4JYWJzCXIxLCByMgotICAzODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgzOCA8c3RhcnRcKzB4Mzg+XCkJfHwJbm9wCQotICA0MDoJMDAyYmZmZmYgMDBmMDAwMDAgCWJzci5zCS04CVwoMzggPHN0YXJ0XCsweDM4PlwpCXx8CW5vcAkKLSAgNDg6CTA4ODAxMDgwIDg4ODAxMDgwIAlhYnMJcjEsIHIyCS0+CWFicwlyMSwgcjIKLSAgNTA6CTAwMjgwMDAwIDA4ODAxMDgwIAlic3IucwkwCVwoNTAgPHN0YXJ0XCsweDUwPlwpCXx8CWFicwlyMSwgcjIKLSAgNTg6CTA0MDAxMDgzIDg1MDA3MjA5IAlsZGIucwlyMSwgQFwocjIsIHIzXCkJLT4Jc3RiLnMJcjcsIEBcKHI4LCByOVwpCi0gIDYwOgkwNTAwNzIwOSA4NDAwMTA4MyAJc3RiLnMJcjcsIEBcKHI4LCByOVwpCS0+CWxkYi5zCXIxLCBAXChyMiwgcjNcKQotICA2ODoJMDQwMDcyMDkgODQwMDEwODMgCWxkYi5zCXI3LCBAXChyOCwgcjlcKQktPglsZGIucwlyMSwgQFwocjIsIHIzXCkKLSAgNzA6CTA1MDA3MjA5IDg1MDAxMDgzIAlzdGIucwlyNywgQFwocjgsIHI5XCkJLT4Jc3RiLnMJcjEsIEBcKHIyLCByM1wpCi0gIDc4OgkwODAwMzBjNiA4NTQ4MjBjMCAJYWRkLnMJcjMsIHIzLCByNgktPglzdHcucwlyMiwgQFwocjMsIDB4MFwpCi0gIDgwOgkwMmMyODEwNSA5MDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL3R4CTAgPHN0YXJ0PgotICA4ODoJMDJjMjgxMDUgYTAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy9meAkwIDxzdGFydD4KLSAgOTA6CTMwMTgwMDAwIDAyYzI4MTA1IAlqbXAucy94dAkwIDxzdGFydD4JfHwJY21wbGUucwlmMCwgcjQsIHI1Ci0gIDk4Ogk0MDE4MDAwMCAwMmMyODEwNSAJam1wLnMveGYJMCA8c3RhcnQ+CXx8CWNtcGxlLnMJZjAsIHI0LCByNQotICBhMDoJMDJjMjgxMDUgZDAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy90dAkwIDxzdGFydD4KLSAgYTg6CTAyYzI4MTA1IGUwMTgwMDAwIAljbXBsZS5zCWYwLCByNCwgcjUJLT4Jam1wLnMvdGYJMCA8c3RhcnQ+Ci0gIGIwOgkxMDE4MDAwMCAwMmMyOTEwNSAJam1wLnMvdHgJMCA8c3RhcnQ+CXx8CWNtcGxlLnMJZjEsIHI0LCByNQotICBiODoJMDJjMjkxMDUgYjAxODAwMDAgCWNtcGxlLnMJZjEsIHI0LCByNQktPglqbXAucy94dAkwIDxzdGFydD4KLSAgYzA6CTA4MDg0MDAxIDgyYzI4MTA1IAlhZGQucwlyNCwgcjAsIDB4MQktPgljbXBsZS5zCWYwLCByNCwgcjUKLSAgYzg6CTA4MDg0MDAxIDAyYzI4MGM1IAlhZGQucwlyNCwgcjAsIDB4MQl8fAljbXBsZS5zCWYwLCByMywgcjUKLSAgZDA6CTA0NjA0MDA2IDg4NjA1NGQ0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCS0+CWFkZHMucwlyNSwgcjE5LCByMjAKLSAgZDg6CTA0NjA0MDA2IDg4NjAzMTU0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCS0+CWFkZHMucwlyMywgcjUsIHIyMAotICBlMDoJMDQ2MDQwMDYgMDg2MDY0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI2LCByMTksIHIyMAotICBlODoJMDQ2MDQwMDYgMDg2MDc0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMTksIHIyMAotICBmMDoJMDQ2MDQwMDYgMDg2MDcwMTQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMCwgcjIwCi0gIGY4OgkwNTYwNDAwNiAwODYwNTRkNCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjUsIHIxOSwgcjIwCi0gMTAwOgkwNTYwNDAwNiAwODYwMzE1NCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjMsIHI1LCByMjAKLSAxMDg6CTA1NjA0MDA2IDA4NjA2NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNiwgcjE5LCByMjAKLSAxMTA6CTA1NjA0MDA2IDA4NjA3NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNywgcjE5LCByMjAKLSAxMTg6CTA1NjA0MDA2IDA4NjA3MDE0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNywgcjAsIHIyMAotIDEyMDoJMDU2MGEwYzQgODU2MjhhZWMgCXN0MncucwlyMTAsIEBcKHIzLCByNFwpCS0+CXN0MncucwlyNDAsIEBcKHI0MywgcjQ0XCkKLSAxMjg6CTA1NDAxMDgzIDg0NDI5YWFiIAlzdHcucwlyMSwgQFwocjIsIHIzXCkJLT4JbGR3LnMJcjQxLCBAXChyNDIsIHI0M1wpCi0gMTMwOgkwNDQwMTA4MyA4NDAyOWFhYiAJbGR3LnMJcjEsIEBcKHIyLCByM1wpCS0+CWxkYi5zCXI0MSwgQFwocjQyLCByNDNcKQotIDEzODoJMDQ0NDQxOGIgODg2ODkxODIgCWxkdy5zCXI0LCBAXChyNlwrLCByMTFcKQktPglhZGRzLnMJcjksIHI2LCAweDIKLSAxNDA6CTA0NGM0MThiIDA4Njg5MTgyIAlsZHcucwlyNCwgQFwocjYtLCByMTFcKQl8fAlhZGRzLnMJcjksIHI2LCAweDIKLSAxNDg6CTA1NGM0MThiIDg4Njg5MTgyIAlzdHcucwlyNCwgQFwocjYtLCByMTFcKQktPglhZGRzLnMJcjksIHI2LCAweDIKLSAxNTA6CTA0NDA0MThiIDA4Njg5MTgyIAlsZHcucwlyNCwgQFwocjYsIHIxMVwpCXx8CWFkZHMucwlyOSwgcjYsIDB4MgotIDE1ODoJMDQ0MDQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNiwgcjExXCkJfHwJYWRkcy5zCXI5LCByNiwgMHgyCi0gMTYwOgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLSAxNjg6CTAwMzgwMDAwIDA4ODAxMDgwIAlqc3IucwkwIDxzdGFydD4JfHwJYWJzCXIxLCByMgotIDE3MDoJMDg4MDEwODAgMDBmMDAwMDAgCWFicwlyMSwgcjIJfHwJbm9wCQotIDE3ODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgxNzggPHN0YXJ0XCsweDE3OD5cKQl8fAlub3AJCi0gMTgwOgkwMDI4MDAwMCAwODgwMTA4MCAJYnNyLnMJMAlcKDE4MCA8c3RhcnRcKzB4MTgwPlwpCXx8CWFicwlyMSwgcjIKLSAxODg6CTA4ODAxMDgwIDAwZjAwMDAwIAlhYnMJcjEsIHIyCXx8CW5vcAkKLQotMDAwMDAxOTAgPGxhYmVsMT46Ci0gMTkwOgkwNTYwMjA4MyA4OTAwNDE0NiAJc3Qydy5zCXIyLCBAXChyMiwgcjNcKQktPglhZGRobGxsLnMJcjQsIHI1LCByNgotCi0wMDAwMDE5OCA8bGFiZWwyPjoKLSAxOTg6CTA1NTA4MjA5IDg5OTBhMmNjIAlzdDRoYi5zCXI4LCBAXChyOCwgcjlcKQktPglzdWJobGxoLnMJcjEwLCByMTEsIHIxMgotCi0wMDAwMDFhMCA8bGFiZWwzPjoKLSAxYTA6CTA0NjBlMzhmIDhhNjEwNDUyIAlsZDJ3LnMJcjE0LCBAXChyMTQsIHIxNVwpCS0+CW11bGh4aGwJcjE2LCByMTcsIHIxOAotCi0wMDAwMDFhOCA8bGFiZWw0PjoKLSAxYTg6CTA0NDEzNTE1IDhhMTE2NWQ4IAlsZHcucwlyMTksIEBcKHIyMCwgcjIxXCkJLT4JbXVseDJoCXIyMiwgcjIzLCByMjQKLQotMDAwMDAxYjAgPGxhYmVsNT46Ci0gMWIwOgkwNDIxOTY5YiA4YTAxYzc1ZSAJbGRoLnMJcjI1LCBAXChyMjYsIHIyN1wpCS0+CW11bDJoCXIyOCwgcjI5LCByMzAKLQotMDAwMDAxYjggPGxhYmVsNj46Ci0gMWI4Ogk4MGYwMDAwMCAwYjAwMTA4MyAJbm9wCQk8LQltdWwJcjEsIHIyLCByMwotIDFjMDoJMDgwMDcyMDkgMGE0MDQxNDYgCWFkZC5zCXI3LCByOCwgcjkJfHwJbXVsaHhsbAlyNCwgcjUsIHI2Ci0KLTAwMDAwMWM4IDxsYWJlbDc+OgotIDFjODoJMDQ0MDUxODAgMGIwMDIwYzQgCWxkdy5zCXI1LCBAXChyNiwgcjBcKQl8fAltdWwJcjIsIHIzLCByNAotIDFkMDoJODBmMDAwMDAgMGIwMDcyMDkgCW5vcAkJPC0JbXVsCXI3LCByOCwgcjkKLSAxZDg6CTA0NDBhMmMwIDAwZjAwMDAwIAlsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQl8fAlub3AJCi0gMWUwOgk4MGYwMDAwMCAwYjAwYzM0ZSAJbm9wCQk8LQltdWwJcjEyLCByMTMsIHIxNAotIDFlODoJMDQ0MGY0MDAgMGI0NDIwYzQgCWxkdy5zCXIxNSwgQFwocjE2LCByMFwpCXx8CW1hYzEJcjIsIHIzLCByNAotIDFmMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDFmODoJMDQ0MDUxODAgMDBmMDAwMDAgCWxkdy5zCXI1LCBAXChyNiwgcjBcKQl8fAlub3AJCi0gMjAwOgk4MGYwMDAwMCAwYjQwNzIwOSAJbm9wCQk8LQltYWMwCXI3LCByOCwgcjkKLSAyMDg6CTA0NDBhMmMwIDg0NDBhMmMwIAlsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQktPglsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzMzMDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0jIEQzMFYgcGFyYWxsZWwgb3B0aW1pemF0aW9uIHRlc3QKLSMgYXNzZW1ibGUgd2l0aCAiLU8iCi0JCi0JLnRleHQKLXN0YXJ0OgkKLQlhYnMJcjEscjIKLQlhYnMJcjMscjQKLQotCW5vdGZnCWYwLGY0Ci0Jbm90ZmcJZjEsZjIKLQkJCi0JYWJzCXIxLHIyCi0Jbm90ZmcJZjEsZjIKLQotIyBib3RoIGNoYW5nZSBDIGZsYWcKLQlhZGQJcjEscjIscjMKLQlub3RmZwlDLGYwCi0KLSMgb25lIHVzZXMgYW5kIG9uZSBjaGFuZ2VzIEMgZmxhZwkKLQlhZGQJcjEscjIscjMKLQlub3RmZwlmMCxDCi0KLQlicmEJLgotCWFicwlyMSxyMgotCi0JYWJzCXIxLHIyCQotCWJyYQkuCi0KLQlic3IJLgotCWFicwlyMSxyMgotCQotCWFicwlyMSxyMgkKLQlhYnMJcjEscjIJCi0JYnNyCS4KLQkKLQlsZGIJcjEsQChyMixyMykKLQlzdGIJcjcsQChyOCxyOSkKLQotCXN0YglyNyxAKHI4LHI5KQkKLQlsZGIJcjEsQChyMixyMykKLQotCWxkYglyNyxAKHI4LHI5KQkKLQlsZGIJcjEsQChyMixyMykKLQotCXN0YglyNyxAKHI4LHI5KQkKLQlzdGIJcjEsQChyMixyMykKLQotCWFkZCAgICAgcjMsIHIzLCByNgotCXN0dyAgICAgcjIsIEAocjMsIDApCi0JCQkKLSMgc2hvdWxkIGJlIHNlcmlhbCBiZWNhdXNlIG9mIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC90eCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvZnggIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3h0ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC94ZiAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvdHQgIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3RmICAweDAKLQkJCQkJCi0gICAgICAgIGNtcGxlICAgZjEscjQscjUKLSAgICAgICAgam1wL3R4ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYxLHI0LHI1Ci0gICAgICAgIGptcC94dCAgMHgwCi0KLQkjIHNlcmlhbCBiZWNhdXNlIG9mIHRoZSByNCBkZXBlbmRlbmN5Ci0JYWRkCXI0LCByMCwgMQotCWNtcGxlCWYwLCByNCwgcjUKLQotCSMgcGFyYWxsZWwKLQlhZGQJcjQsIHIwLCAxCi0JY21wbGUJZjAsIHIzLCByNQotCi0JIyBzZXJpYWwgYmVjYXVzZSBsZDJ3IGxvYWRzIHI1Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjUscjE5LHIyMAotCi0JIyBzZXJpYWwgYmVjYXVzZSBsZDJ3IGxvYWRzIHI1Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjMscjUscjIwCi0KLQkjIHBhcmFsbGVsIGV2ZW4gdGhvdWdoIGxkMncgdXNlcyByNiBhbmQgYWRkcyBjaGFuZ2VzIGl0Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjYscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCWxkMncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMCxyMjAKLQotCSMgcGFyYWxsZWwgZXZlbiB0aG91Z2ggc3QydyB1c2VzIHI1IGFuZCBhZGRzIG1vZGlmaWVzIGl0Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjUscjE5LHIyMAotCi0JIyBwYXJhbGxlbCwgYm90aCB1c2UgYnV0IGRvbid0IG1vZGlmeSByNQotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXIzLHI1LHIyMAotCi0JIyBwYXJhbGxlbCBldmVuIHRob3VnaCBzdDJ3IHVzZXMgcjYgYW5kIGFkZHMgY2hhbmdlcyBpdAotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXI2LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMTkscjIwCi0KLQkjIHBhcmFsbGVsCi0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjcscjAscjIwCi0JCQkJCQkKLSMgdGVzdCBtZW1vcnkgZGVwZW5kZW5jaWVzCi0KLQkjIGFsd2F5cyBzZXJpYWwgYmVjYXVzZSBvbmUgY291bGQgb3ZlcndyaXRlIHRoZSBvdGhlcgotCXN0MncJcjEwLEAocjMscjQpCi0Jc3QydwlyNDAsQChyNDMscjQ0KQotCi0JIyBhbHdheXMgc2VyaWFsCi0Jc3R3CXIxLEAocjIscjMpCi0JbGR3CXI0MSxAKHI0MixyNDMpCQkJCi0KLQkjIHJlYWRzIGNhbiBoYXBwZW4gaW4gcGFyYWxsZWwgYnV0IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSAKLQkjIGRvZXNuJ3Qgc3VwcG9ydCBpdAotCWxkdwlyMSxAKHIyLHIzKQotCWxkYglyNDEsQChyNDIscjQzKQkJCQotCi0jIHRlc3QgcG9zdCBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBkZXBlbmRlbmNpZXMKLQotCSMgc2VyaWFsCi0JbGR3CXI0LEAocjYrLHIxMSkKLQlhZGRzCXI5LHI2LDIKLQotCSMgcGFyYWxsZWwsIG1vZGlmaWNhdGlvbiB0byByNiBoYXBwZW5zIGxhc3QKLQlhZGRzCXI5LHI2LDIJCi0JbGR3CXI0LEAocjYtLHIxMSkKLQotCSMgc2VyaWFsCi0Jc3R3CXI0LEAocjYtLHIxMSkKLQlhZGRzCXI5LHI2LDIKLQkKLQkjIHBhcmFsbGVsCi0JbGR3CXI0LEAocjYscjExKQotCWFkZHMJcjkscjYsMgotCi0JIyBwYXJhbGxlbAotCWFkZHMJcjkscjYsMgkKLQlsZHcJcjQsQChyNixyMTEpCi0JCi0jIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyBhIGptcCwgZG9uJ3QgcGFyYWxsZWxpemUKLQlqbXAJMAotCWFicwlyMSxyMgkKLQotCWpzcgkwCi0JYWJzCXIxLHIyCQotCi0JLmFsaWduCTMKLQkKLQlicmEJMAotCWFicwlyMSxyMgkKLQkKLQlic3IJMAotCWFicwlyMSxyMgkKLQotIyBFeHBsaWNpdGx5IHByb2hpYml0ZWQgZnJvbSBwYXJhbGxlbCBleGVjdXRpb24uCi0jIFRoZSBsYWJlbHMgYXJlIGhlcmUgdG8gcHJldmVudCBpbnN0cnVjdGlvbiBwYWlycwotIyAgZnJvbSBiZWluZyBtZXJnZWQgd2l0aCBmb2xsb3dpbmcgcGFpcnMuCi0JCi1sYWJlbDE6CQotCXN0MncgICAgIHIyLCBAKHIyLCByMykKLQlhZGRobGxsICByNCwgcjUsIHI2Ci1sYWJlbDI6Ci0Jc3Q0aGIgICAgcjgsIEAocjgsIHI5KQotCXN1YmhsbGggIHIxMCwgcjExLCByMTIKLWxhYmVsMzoKLQlsZDJ3ICAgICByMTQsIEAocjE0LCByMTUpCi0JbXVsaHhobCAgcjE2LCByMTcsIHIxOAotbGFiZWw0OgotCWxkdyAgICAgIHIxOSwgQChyMjAsIHIyMSkKLQltdWx4MmggICByMjIsIHIyMywgcjI0Ci1sYWJlbDU6Ci0JbGRoICAgICAgcjI1LCBAKHIyNiwgcjI3KQotCW11bDJoICAgIHIyOCwgcjI5LCByMzAKLQotIyBJbnNlcnRpb24gb2YgTk9QcyByZXF1aXJlZCB0byBwcmV2ZW50IHBpcGVsaW5lIGNsYXNoZXMuCi0KLWxhYmVsNjoKLQltdWwgcjEscjIscjMKLQltdWxoeGxsIHI0LHI1LHI2Ci0gICAgICAgIGFkZCByNywgcjgsIHI5Ci1sYWJlbDc6Ci0JCi0gICAgICAgIG11bCAgcjIscjMscjQKLSAgICAgICAgbGR3ICByNSwgQChyNixyMCkKLSAKLSAgICAgICAgbGR3ICByMTAsIEAocjExLCByMCkgPC0gbXVsIHI3LHI4LHI5Ci0JCi0gICAgICAgIG11bCAgcjEyLHIxMyxyMTQgLT4gbGR3IHIxNSwgQChyMTYsIHIwKQotCi0gICAgICAgIG1hYzEgcjIscjMscjQKLSAgICAgICAgbGR3ICByNSwgQChyNixyMCkKLSAKLSAgICAgICAgbGR3ICByMTAsIEAocjExLCByMCkgPC0gbWFjMCByNyxyOCxyOQotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSAKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlMjc4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViByZWxvY2F0aW9uIHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxzdGFydD46Ci0gICAgICAgMDoJODgwODIwMDAgODAwMDAwMjggCWFkZC5sCXIyLCByMCwgMHgyOAotCQkJMDogUl9EMzBWXzMyCS50ZXh0Ci0gICAgICAgODoJODgwODQwMDAgODAwMDAwMDAgCWFkZC5sCXI0LCByMCwgMHgwCi0JCQk4OiBSX0QzMFZfMzIJLmRhdGEKLSAgICAgIDEwOgk4ODA4NDAwMCA4MDAwMDAwNiAJYWRkLmwJcjQsIHIwLCAweDYKLQkJCTEwOiBSX0QzMFZfMzIJLmRhdGEKLSAgICAgIDE4Ogk4ODA4NDAwMCA4MDAwMDAwMCAJYWRkLmwJcjQsIHIwLCAweDAKLQkJCTE4OiBSX0QzMFZfMzIJdW5rCi0gICAgICAyMDoJODAwODAwMDAgODAwMDAwMTggCWJyYS5sCTE4CVwoMzggPGNvbnQ+XCkKLQotMDAwMDAwMjggPGhlbGxvPjoKLSAgICAgIDI4Ogk0ODY1NmM2YyA2ZjIwNTc2ZiAJLmxvbmcJMHg0ODY1NmM2Ywl8fAkubG9uZwkweDZmMjA1NzZmCi0gICAgICAzMDoJNzI2YzY0MGEgMDBmMDAwMDAgCS5sb25nCTB4NzI2YzY0MGEJfHwJbm9wCQotCi0wMDAwMDAzOCA8Y29udD46Ci0gICAgICAzODoJODAxODAwMDAgODAwMDAwNDggCWptcC5sCTQ4IDxjb250Mj4KLQkJCTM4OiBSX0QzMFZfMzIJLnRleHQKLSAgICAgIDQwOgkwODgwMjBjMCAwMGYwMDAwMCAJYWJzCXIyLCByMwl8fAlub3AJCi0KLTAwMDAwMDQ4IDxjb250Mj46Ci0gICAgICA0ODoJMDAwYmZmZjcgMDBmMDAwMDAgCWJyYS5zCS00OAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIDUwOgkwMDA4MDIwNSAwMGYwMDAwMCAJYnJhLnMJMTAyOAlcKDEwNzggPGV4aXQ+XCkJfHwJbm9wCQotICAgICAgNTg6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotICAgICAgNjA6CTAwNmMxZmZiIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgLTI4CVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNjg6CTAwNmMxZmZhIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgLTMwCVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNzA6CTAwNGMxZmY5IDAwZjAwMDAwIAlicmF0bnoucwlyMSwgLTM4CVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNzg6CTAwNGMxZmY4IDAwZjAwMDAwIAlicmF0bnoucwlyMSwgLTQwCVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgODA6CTAwNWMxMDA3IDAwZjAwMDAwIAlqbXB0bnoucwlyMSwgMzggPGNvbnQ+CXx8CW5vcAkKLQkJCTgwOiBSX0QzMFZfMTUJLnRleHQKLSAgICAgIDg4OgkwMDZjMTFmMSAwMGYwMDAwMCAJYnNydG56LnMJcjEsIGY4OAlcKDEwMTAgPGZvbz5cKQl8fAlub3AJCi0gICAgICA5MDoJMDA1YzEwMDAgMDBmMDAwMDAgCWptcHRuei5zCXIxLCAwIDxzdGFydD4JfHwJbm9wCQotCQkJOTA6IFJfRDMwVl8xNQl1bmsKLSAgICAgIDk4OgkwMDZjMTAwMCAwMGYwMDAwMCAJYnNydG56LnMJcjEsIDAJXCg5OCA8Y29udDJcKzB4NTA+XCkJfHwJbm9wCQotCQkJOTg6IFJfRDMwVl8xNV9QQ1JFTAl1bmsKLSAgICAgIGEwOgk4MDVjMTAwMCA4MDAwMDAwMCAJam1wdG56LmwJcjEsIDAgPHN0YXJ0PgotCQkJYTA6IFJfRDMwVl8zMgl1bmsKLSAgICAgIGE4Ogk4MDZjMTAwMCA4MDAwMDAwMCAJYnNydG56LmwJcjEsIDAJXChhOCA8Y29udDJcKzB4NjA+XCkKLQkJCWE4OiBSX0QzMFZfMzJfUENSRUwJdW5rCi0gICAgICBiMDoJMDAwODAxZWMgMDBmMDAwMDAgCWJyYS5zCWY2MAlcKDEwMTAgPGZvbz5cKQl8fAlub3AJCi0gICAgICBiODoJODAwODAwMDAgODAwMDBmNTggCWJyYS5sCWY1OAlcKDEwMTAgPGZvbz5cKQotICAgICAgYzA6CTAwMGJmZmU4IDAwZjAwMDAwIAlicmEucwktYzAJXCgwIDxzdGFydD5cKQl8fAlub3AJCi0gICAgICBjODoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJYzg6IFJfRDMwVl8zMgkudGV4dAotICAgICAgZDA6CTgwMTgwMDAwIDgwMDAwMDAwIAlqbXAubAkwIDxzdGFydD4KLQkJCWQwOiBSX0QzMFZfMzIJLnRleHQKLSAgICAgIGQ4OgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLQkJCWQ4OiBSX0QzMFZfMjEJLnRleHQKLSAgICAgIGUwOgkwMDE4MDIwMiAwMGYwMDAwMCAJam1wLnMJMTAxMCA8Zm9vPgl8fAlub3AJCi0JCQllMDogUl9EMzBWXzIxCS50ZXh0Ci0gICAgICBlODoJMDAwYmZmZTMgMDBmMDAwMDAgCWJyYS5zCS1lOAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIGYwOgk4MDA4MDAwMCA4MDAwMDAwMCAJYnJhLmwJMAlcKGYwIDxjb250MlwrMHhhOD5cKQotCQkJZjA6IFJfRDMwVl8zMl9QQ1JFTAl1bmtub3duCi0gICAgICBmODoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJZjg6IFJfRDMwVl8zMgl1bmtub3duCi0gICAgIDEwMDoJMDAxODAwMDAgMDBmMDAwMDAgCWptcC5zCTAgPHN0YXJ0Pgl8fAlub3AJCi0JCQkxMDA6IFJfRDMwVl8yMQl1bmtub3duCi0gICAgIDEwODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgxMDggPGNvbnQyXCsweGMwPlwpCXx8CW5vcAkKLQkJCTEwODogUl9EMzBWXzIxX1BDUkVMCXVua25vd24KLQkuLi4KLQotMDAwMDEwMTAgPGZvbz46Ci0gICAgMTAxMDoJMDgwMDEwMDAgMDBmMDAwMDAgCWFkZC5zCXIxLCByMCwgcjAJfHwJbm9wCQotICAgIDEwMTg6CTg0NmJjMDAwIDgwMDAxMDcwIAlsZDJ3LmwJcjYwLCBAXChyMCwgMHgxMDcwXCkKLQkJCTEwMTg6IFJfRDMwVl8zMgkudGV4dAotICAgIDEwMjA6CTA4MDNlMDAwIDgwMjgwMDBiIAlhZGQucwlyNjIsIHIwLCByMAktPglic3Iucwk1OAlcKDEwNzggPGV4aXQ+XCkKLSAgICAxMDI4OgkwMDJiZmZmZCAwMGYwMDAwMCAJYnNyLnMJLTE4CVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAxMDMwOgkwMDBiZmUwMyAwMGYwMDAwMCAJYnJhLnMJLWZlOAlcKDQ4IDxjb250Mj5cKQl8fAlub3AJCi0gICAgMTAzODoJMDAwYmZlMDIgMDBmMDAwMDAgCWJyYS5zCS1mZjAJXCg0OCA8Y29udDI+XCkJfHwJbm9wCQotICAgIDEwNDA6CTAwMjgwMDA3IDAwZjAwMDAwIAlic3IucwkzOAlcKDEwNzggPGV4aXQ+XCkJfHwJbm9wCQotICAgIDEwNDg6CTAwMTgwMjBmIDAwZjAwMDAwIAlqbXAucwkxMDc4IDxleGl0Pgl8fAlub3AJCi0JCQkxMDQ4OiBSX0QzMFZfMjEJLnRleHQKLSAgICAxMDUwOgkwMDE4MDIwZiAwMGYwMDAwMCAJam1wLnMJMTA3OCA8ZXhpdD4JfHwJbm9wCQotCQkJMTA1MDogUl9EMzBWXzIxCS50ZXh0Ci0gICAgMTA1ODoJMDAxODAyMGYgMDBmMDAwMDAgCWptcC5zCTEwNzggPGV4aXQ+CXx8CW5vcAkKLQkJCTEwNTg6IFJfRDMwVl8yMQkudGV4dAotICAgIDEwNjA6CTgwMjgwMDAwIDgwMDAwMDE4IAlic3IubAkxOAlcKDEwNzggPGV4aXQ+XCkKLSAgICAxMDY4Ogk4MDE4MDAwMCA4MDAwMTA3OCAJam1wLmwJMTA3OCA8ZXhpdD4KLQkJCTEwNjg6IFJfRDMwVl8zMgkudGV4dAotCi0wMDAwMTA3MCA8bG9uZ3plcm8+OgotCS4uLgotCi0wMDAwMTA3OCA8ZXhpdD46Ci0gICAgMTA3ODoJMDAxMDAwM2UgMDBmMDAwMDAgCWptcC5zCXI2Mgl8fAlub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTliZjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIyBEMzBWIHJlbG9jYXRpb24gdGVzdAotCQotCS50ZXh0Ci1zdGFydDoKLQlhZGQJcjIsIHIwLCBoZWxsbwotCWFkZAlyNCwgcjAsIGJhcgotCWFkZAlyNCwgcjAsIGJhcjIKLQlhZGQJcjQsIHIwLCB1bmsJCi0JYnJhCWNvbnQKLWhlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkXG4iCi0JLmFsaWduIDMKLWNvbnQ6CWptcAljb250MgotCWFicwlyMixyMwotY29udDI6Ci0JYnJhCXN0YXJ0CXx8CW5vcAotCWJyYS5zCWV4aXQKLQlqbXAJMAl8fAlub3AKLQlic3J0bnoucwlyMSxjb250Ci0JYnNydG56CXIxLGNvbnQJCi0JYnJhdG56LnMJcjEsY29udAotCWJyYXRueglyMSxjb250Ci0Jam1wdG56LnMJcjEsY29udAkJCi0JYnNydG56LnMJcjEsIGZvbwotCWptcHRuei5zCXIxLCB1bmsJCi0JYnNydG56LnMJcjEsIHVuawotCWptcHRueglyMSwgdW5rCQotCWJzcnRueglyMSwgdW5rCi0JYnJhLnMJZm9vCi0JYnJhCWZvbwkKLQlicmEJc3RhcnQKLQlqbXAJc3RhcnQKLQlqbXAJc3RhcnQKLQlqbXAucwlzdGFydAotCWptcC5zCWZvbwotCWJyYQlzdGFydAotCWJyYQl1bmtub3duCi0Jam1wCXVua25vd24KLQlqbXAucwl1bmtub3duCQotCWJyYS5zCXVua25vd24KLQkKLQkuZGF0YQotYmFyOgkuYXNjaXoJIlhZWlpZIgotYmFyMjoJLmxvbmcJMHhkZWFkYmVlZgotCQotCS50ZXh0Ci0JLnNwYWNlIDB4RjAwLDAKLQotZm9vOgotCWFkZAlyMSxyMCxyMAotCWxkMncJcjYwLCBAKHIwLGxvbmd6ZXJvKQotCWFkZAlyNjIscjAscjAKLQlic3IucwlleGl0Ci0JYnNyLnMJZm9vCi0JYnJhLnMJY29udDIKLQlicmEucwljb250MgkJCQkKLQlic3IucwlleGl0CQotCWptcC5zCWV4aXQKLQlqbXAucwlleGl0Ci0Jam1wLnMJZXhpdAkJCi0JYnNyCWV4aXQKLQlqbXAJZXhpdAotCi1sb25nemVybzoKLQkucXVhZAkwCi0KLQkudGV4dAotZXhpdDoJCi0Jam1wCXI2MgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YTVhNjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIHNlcmlhbC5zCi0gICAyICAgICAgICAgICAgICAJIwotICAgMyAgICAgICAgICAgICAgCSMgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcywgdGhlIHJpZ2h0LXN1Ymluc3RydWN0aW9ucwotICAgNCAgICAgICAgICAgICAgCSMgd2lsbCBuZXZlciBiZSBleGVjdXRlZC4gIEdBUyBzaG91bGQgZGV0ZWN0IHRoaXMuCi0gICA1ICAgICAgICAgICAgICAJCQotICAgNiBcP1w/XD9cPyAwMDAwMDBGMCAJCXRyYXAgcjIxIC0+IGFkZCByMiwgcjAsIHIwIDsgcmlnaHQgaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBleGVjdXRlZC4KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDYgICAgICAwMDAwMDBGMCAKLSAgIDYgICAgICAwMDAwMDBGMCAKLSAgIDYgICAgICAwMDAwMDA5MCAKLSAgIDYgICAgICAwMDE1MDBGMCAKLSAgIDcgXD9cP1w/XD8gMDgwMDIwMDAgCQlkYnQgICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNyAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgIDAwQjAwMDAwIAotICAgNyAgICAgIDAwRjAwMDAwIAotICAgOCBcP1w/XD9cPyAwODAwMjAwMCAJCXJ0ZCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMDBBMDAwMDAgCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IFw/XD9cP1w/IDA4MDAyMDAwIAkJcmVpdCAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgIDkgICAgICAwMDgwMDAwMCAKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgXD9cP1w/XD8gMDgwMDIwMDAgCQltdnRzeXMgcHN3LCAgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotICAxMCAgICAgIDAwRjAwMDAwIAotICAxMCAgICAgIDAwRTAwMDQwIAotICAxMCAgICAgIDg4MDAyMDAwIAotICAxMSBcP1w/XD9cPyAwMEUwMDA0MiAJCW12dHN5cyBwc3doLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0gIDExICAgICAgODgwMDIwMDAgCi0gIDEyIFw/XD9cP1w/IDAwRTAwMDQxIAkJbXZ0c3lzIHBzd2wsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLSAgMTIgICAgICA4ODAwMjAwMCAKLSAgMTMgXD9cP1w/XD8gMDBFMDAwNDMgCQltdnRzeXMgZjAsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgOyBPSwotICAxMyAgICAgIDg4MDAyMDAwIAotICAxNCBcP1w/XD9cPyAwMEUwQTA0MCAJCW12dHN5cyBtb2RfcywgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICA7IE9LCi0gIDE0ICAgICAgODgwMDIwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5NWQ2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBzZXJpYWwucwotIwotIyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCB0aGUgcmlnaHQtc3ViaW5zdHJ1Y3Rpb25zCi0jIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQuICBHQVMgc2hvdWxkIGRldGVjdCB0aGlzLgotCQotCXRyYXAgcjIxIC0+IGFkZCByMiwgcjAsIHIwIDsgcmlnaHQgaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBleGVjdXRlZC4KLQlkYnQgICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotCXJ0ZCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi0JcmVpdCAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLQltdnRzeXMgcHN3LCAgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotCW12dHN5cyBwc3doLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0JbXZ0c3lzIHBzd2wsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLQltdnRzeXMgZjAsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgOyBPSwotCW12dHN5cyBtb2RfcywgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICA7IE9LCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGUwNGRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTI6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjEzOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNDogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxODogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIxOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjM6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI0OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyOTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBEMzBWIHNlcmlhbCBleGVjdXRpb24gdGVzdAotICAgMiAgICAgICAgICAgICAgCQkKLSAgIDMgICAgICAgICAgICAgIAkJLnRleHQKLSAgIDQgICAgICAgICAgICAgIAkJCi0gICA1IFw/XD9cP1w/IDAwMDAwMEYwIAkJYnJhIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNSAgICAgIDAwMDAwMEYwIAotICAgNSAgICAgIDAwMDAwMEYwIAotICAgNSAgICAgIDAwMDAwMDBCIAotICAgNSAgICAgIEZGRkYwMEYwIAotICAgNiBcP1w/XD9cPyAwODA4MzAwMCAJCWJzciAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDYgICAgICAwMDJCRkZGRiAKLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDcgICAgICAgICAgICAgIAkKLSAgIDggXD9cP1w/XD8gMDgwODMwMDAgCQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOCAgICAgIDEwMEJGRkZGIAotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOSBcP1w/XD9cPyAwODA4MzAwMCAJCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA5ICAgICAgMDBGMDAwMDAgCi0gICA5ICAgICAgMTAyQkZGRkYgCi0gICA5ICAgICAgMDBGMDAwMDAgCi0gIDEwICAgICAgICAgICAgICAJCi0gIDExIFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGJzciAtMTAJOyAgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDExICAgICAgMDAyQkZGRkYgCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDEyIFw/XD9cP1w/IDAwMkJGRkZFIAkJYnNyIC0zIC0+IGJzci94dCAtMTAgICAgOyAgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDEyICAgICAgMDBGMDAwMDAgCi0gIDEyICAgICAgMDAyQkZGRkYgCi0gIDEyICAgICAgMDBGMDAwMDAgCi0gIDEzIFw/XD9cP1w/IDMwMkJGRkZFIAkJYnNyL3R4IC0zIC0+IGJzciAtMTAgICAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMyAgICAgIDAwRjAwMDAwIAotICAxMyAgICAgIDEwMkJGRkZGIAotICAxMyAgICAgIDAwRjAwMDAwIAotICAxNCBcP1w/XD9cPyAwMDJCRkZGRSAJCWJzci90eCAtMyAtPiBic3IvZnggLTEwIDsgICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTQgICAgICAwMEYwMDAwMCAKLSAgMTQgICAgICAxMDJCRkZGRiAKLSAgMTQgICAgICAwMEYwMDAwMCAKLSAgMTUgICAgICAgICAgICAgIAkKLSAgMTYgXD9cP1w/XD8gMjAyQkZGRkUgCQlicmEgLTMgLT4gYnJhICAxMCAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNiAgICAgIDAwRjAwMDAwIAotICAxNiAgICAgIDAwMEJGRkZGIAotICAxNiAgICAgIDAwRjAwMDAwIAotICAxNyBcP1w/XD9cPyAwMDA4MDAwMSAJCWJyYSAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE3ICAgICAgMDBGMDAwMDAgCi0gIDE3ICAgICAgMDAwQkZGRkYgCi0MR0FTIExJU1RJTkcgLioKLQotCi0gIDE3ICAgICAgMDBGMDAwMDAgCi0gIDE4IFw/XD9cP1w/IDEwMDgwMDAxIAkJYnJhL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE4ICAgICAgMDBGMDAwMDAgCi0gIDE4ICAgICAgMTAwQkZGRkYgCi0gIDE4ICAgICAgMDBGMDAwMDAgCi0gIDE5IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE5ICAgICAgMDBGMDAwMDAgCi0gIDE5ICAgICAgMTAwQkZGRkYgCi0gIDE5ICAgICAgMDBGMDAwMDAgCi0gIDIwICAgICAgICAgICAgICAJCi0gIDIxIFw/XD9cP1w/IDIwMDgwMDAxIAkJYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjEgICAgICAwMEYwMDAwMCAKLSAgMjEgICAgICAwMDJCRkZGRiAKLSAgMjEgICAgICAwMEYwMDAwMCAKLSAgMjIgXD9cP1w/XD8gMDAwODAwMDEgCQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMiAgICAgIDAwRjAwMDAwIAotICAyMiAgICAgIDAwMkJGRkZGIAotICAyMiAgICAgIDAwRjAwMDAwIAotICAyMyBcP1w/XD9cPyAxMDA4MDAwMSAJCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMyAgICAgIDAwRjAwMDAwIAotICAyMyAgICAgIDEwMkJGRkZGIAotICAyMyAgICAgIDAwRjAwMDAwIAotICAyNCBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNCAgICAgIDAwRjAwMDAwIAotICAyNCAgICAgIDEwMkJGRkZGIAotICAyNCAgICAgIDAwRjAwMDAwIAotICAyNSAgICAgICAgICAgICAgCQotICAyNiBcP1w/XD9cPyAyMDA4MDAwMSAJCWJyYSAtMyAtPiBic3IgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI2ICAgICAgMDBGMDAwMDAgCi0gIDI2ICAgICAgMDAwQkZGRkYgCi0gIDI2ICAgICAgMDBGMDAwMDAgCi0gIDI3IFw/XD9cP1w/IDAwMjgwMDAxIAkJYnJhIC0zIC0+IGJzci90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjcgICAgICAwMEYwMDAwMCAKLSAgMjcgICAgICAwMDBCRkZGRiAKLSAgMjcgICAgICAwMEYwMDAwMCAKLSAgMjggXD9cP1w/XD8gMTAyODAwMDEgCQlicmEvdHggLTMgLT4gYnNyIDEwICAgICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjggICAgICAwMEYwMDAwMCAKLSAgMjggICAgICAxMDBCRkZGRiAKLSAgMjggICAgICAwMEYwMDAwMCAKLSAgMjkgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEvdHggLTMgLT4gYnNyL2Z4IDEwICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjkgICAgICAwMEYwMDAwMCAKLSAgMjkgICAgICAxMDBCRkZGRiAKLSAgMjkgICAgICAwMEYwMDAwMCAKLSAgMjkgICAgICAyMDI4MDAwMSAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTMxNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0JCi0JLnRleHQKLQkKLQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0JYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotCi0JYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJzciAtMTAJOyAgICAgICBJbnZhbGlkCi0JYnNyIC0zIC0+IGJzci94dCAtMTAgICAgOyAgICAgICBJbnZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzciAtMTAgICAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBic3IvZnggLTEwIDsgICAgICAgVmFsaWQKLQotCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLQotCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLQotCWJyYSAtMyAtPiBic3IgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhIC0zIC0+IGJzci90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlicmEvdHggLTMgLT4gYnNyIDEwICAgICA7ICAgICAgVmFsaWQKLQlicmEvdHggLTMgLT4gYnNyL2Z4IDEwICA7ICAgICAgVmFsaWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllYjA1Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLmwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6NTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6NjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjEyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIxOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0gICAyICAgICAgICAgICAgICAJCQotICAgMyAgICAgICAgICAgICAgCQkudGV4dAotICAgNCAgICAgICAgICAgICAgCQkKLSAgIDUgXD9cP1w/XD8gMDAwMDAwRjAgCQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwMEIgCi0gICA1ICAgICAgRkZGRjAwRjAgCi0gICA2IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNiAgICAgIDAwMkJGRkZGIAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgICAgICAgICAgCQotICAgOCBcP1w/XD9cPyAwODA4MzAwMCAJCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMTAwQkZGRkYgCi0gICA4ICAgICAgODgwODMwMDAgCi0gICA5IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLSAgIDkgICAgICA4ODA4MzAwMCAKLSAgMTAgICAgICAgICAgICAgIAkKLSAgMTEgXD9cP1w/XD8gMDAyQkZGRkYgCQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgXD9cP1w/XD8gMDAyQkZGRkUgCQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAwMDJCRkZGRiAKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTMgXD9cP1w/XD8gMzAyQkZGRkUgCQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDEzICAgICAgMTAyQkZGRkYgCi0gIDEzICAgICAgODAyQkZGRkUgCi0gIDE0IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotICAxNCAgICAgIEEwMkJGRkZFIAotICAxNSAgICAgICAgICAgICAgCQotICAxNiBcP1w/XD9cPyAwMDBCRkZGRiAJCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE3IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTcgICAgICAwMDBCRkZGRiAKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTggXD9cP1w/XD8gMTAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTggICAgICAxMDBCRkZGRiAKLSAgMTggICAgICA4MDA4MDAwMSAKLSAgMTkgXD9cP1w/XD8gMTAwQkZGRkYgCQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLSAgMTkgICAgICBBMDA4MDAwMSAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgXD9cP1w/XD8gMDAyQkZGRkYgCQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMiBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0MR0FTIExJU1RJTkcgLioKLQotCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIyICAgICAgMDAyQkZGRkYgCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIzIFw/XD9cP1w/IDEwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDIzICAgICAgMTAyQkZGRkYgCi0gIDIzICAgICAgODAwODAwMDEgCi0gIDI0IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0gIDI0ICAgICAgQTAwODAwMDEgCi0gIDI1ICAgICAgICAgICAgICAJCi0gIDI2IFw/XD9cP1w/IDAwMEJGRkZGIAkJYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjcgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyNyAgICAgIDAwMEJGRkZGIAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyOCBcP1w/XD9cPyAxMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOCAgICAgIDEwMEJGRkZGIAotICAyOCAgICAgIDgwMjgwMDAxIAotICAyOSBcP1w/XD9cPyAxMDBCRkZGRiAJCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZAotICAyOSAgICAgIEEwMjgwMDAxIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUzMTU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLQkKLQkudGV4dAotCQotCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0KLQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZiNDNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcubAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjY6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6NzogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjo4OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjk6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTA6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTE6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTI6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBHQVMgc2hvdWxkIHByaW50IGEgd2FybmluZyAgd2hlbiBhbiBvZGQgcmVnaXN0ZXIgaXMgdXNlZCBhcyBhIHRhcmdldCAKLSAgIDIgICAgICAgICAgICAgIAkjIG9mIG11bHRpLXdvcmQgaW5zdHJ1Y3Rpb25zOiBsZDJ3LCBsZDRiaCwgbGQ0Ymh1LCBsZDJoLCBzdDJ3LCBzdDRoYiwgc3QyaCwgCi0gICAzICAgICAgICAgICAgICAJIyBhbmQgbXVseDJoCi0gICA0ICAgICAgICAgICAgICAJCi0gICA1IDAwMDAgMDU2ODEwMDAgCXN0MncgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNSAgICAgIDAwRjAwMDAwIAotICAgNiAwMDA4IDA0NjgxMDAwIAlsZDJ3IHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDcgMDAxMCAwNDU4MTAwMCAJbGQ0YmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNyAgICAgIDAwRjAwMDAwIAotICAgOCAwMDE4IDA0RDgxMDAwIAlsZDRiaHUgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOSAwMDIwIDA0MzgxMDAwIAlsZDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgMDAyOCAwNTU4MTAwMCAJc3Q0aGIgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMCAgICAgIDAwRjAwMDAwIAotICAxMSAwMDMwIDA1MzgxMDAwIAlzdDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgMDAzOCAwMEYwMDAwMCAJbm9wCXx8CW11bHgyaCByMSwgcjUsIHI2ICAgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgMTIgICAgICAwQTEwMTE0NiAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5Zjc1MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIEdBUyBzaG91bGQgcHJpbnQgYSB3YXJuaW5nICB3aGVuIGFuIG9kZCByZWdpc3RlciBpcyB1c2VkIGFzIGEgdGFyZ2V0IAotIyBvZiBtdWx0aS13b3JkIGluc3RydWN0aW9uczogbGQydywgbGQ0YmgsIGxkNGJodSwgbGQyaCwgc3Qydywgc3Q0aGIsIHN0MmgsIAotIyBhbmQgbXVseDJoCi0KLXN0MncgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkMncgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkNGJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1sZDRiaHUgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkMmggcjEsIEAocjAsIDApCXx8CW5vcCAKLXN0NGhiIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1zdDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1ub3AJfHwJbXVseDJoIHIxLCByNSwgcjYgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9lbGYuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL2VsZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Njg0ZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL2VsZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIGVsZiB0ZXN0cwotIwotCi0jIFdlJ3JlIHRlc3RpbmcgYml0cyBpbiBvYmotZWxmIC0tIGRvbid0IHJ1biBvbiBhbnl0aGluZyBlbHNlLgotaWYgeyAoW2lzdGFyZ2V0ICIqLSotZWxmKiJdCQkKLSAgICAgIHx8IFtpc3RhcmdldCAiKi0qLWxpbnV4KiJdCi0gICAgICB8fCBbaXN0YXJnZXQgInNwYXJjKi0qLXNvbGFyaXMqIl0KLSAgICAgIHx8IFtpc3RhcmdldCAibWlwcyotKi1pcml4NioiXSkKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqYW91dCpdCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0KLX0gdGhlbiB7Ci0KLSAgICAjIEZJWE1FOiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgTUlQUyB0YXJnZXRzIGJlY2F1c2Ugb2YgdGhlIC5yZWdpbmZvCi0gICAgIyBhbmQgLm1kZWJ1ZyBzZWN0aW9ucy4KLSAgICBzZXR1cF94ZmFpbCBtaXBzKi0qLSoKLSAgICBydW5fZHVtcF90ZXN0ICJzZWN0aW9uMCIgCi0KLSAgICBzZXR1cF94ZmFpbCBtaXBzKi0qLSoKLSAgICBydW5fZHVtcF90ZXN0ICJzZWN0aW9uMSIgCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU0N2MyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI29iamR1bXA6IC1zCi0jbmFtZTogZWxmIHNlY3Rpb24wCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLUNvbnRlbnRzIG9mIHNlY3Rpb24gLmRhdGE6Ci0gMDAwMCAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4gICAgICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBBOgotIDAwMDAgMDEwMTAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAKLUNvbnRlbnRzIG9mIHNlY3Rpb24gQjoKLSAwMDAwIDAyMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLiAgICAgICAgICAgICAgCi1Db250ZW50cyBvZiBzZWN0aW9uIEM6Ci0gMDAwMCAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjOGYwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS5kYXRhCi0JLmJ5dGUgMAotLnNlY3Rpb24gQQotCS5ieXRlIDEKLS5wdXNoc2VjdGlvbiBCCi0JLmJ5dGUgMgotLnB1c2hzZWN0aW9uIEMKLQkuYnl0ZSAzCi0ucG9wc2VjdGlvbgotCS5ieXRlIDIKLS5wb3BzZWN0aW9uCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMAotLnByZXZpb3VzCi0JLmJ5dGUgMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhMTZhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEuZAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNvYmpkdW1wOiAtcwotI25hbWU6IGVsZiBzZWN0aW9uMQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci1Db250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOgotIDAwMDAgMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAKLUNvbnRlbnRzIG9mIHNlY3Rpb24gQToKLSAwMDAwIDAxMDEwMTAxIDAxMDEgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLi4gICAgICAgICAgCi1Db250ZW50cyBvZiBzZWN0aW9uIEI6Ci0gMDAwMCAwMjAyMDIwMiAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLi4gICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBDOgotIDAwMDAgMDMwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OTJhZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0uZGF0YQotCS5ieXRlIDAKLS5zZWN0aW9uIEEKLQkuYnl0ZSAxCi0ucHJldmlvdXMKLQkuYnl0ZSAwCi0ucHJldmlvdXMKLQkuYnl0ZSAxCi0ucHVzaHNlY3Rpb24gQgotCS5ieXRlIDIKLS5wcmV2aW91cwotCS5ieXRlIDEKLS5wcmV2aW91cwotCS5ieXRlIDIKLS5wdXNoc2VjdGlvbiBDCi0JLmJ5dGUgMwotLnByZXZpb3VzCi0JLmJ5dGUgMgotLnByZXZpb3VzCi0JLmJ5dGUgMwotLnBvcHNlY3Rpb24KLQkuYnl0ZSAyCi0ucHJldmlvdXMKLQkuYnl0ZSAxCi0ucHJldmlvdXMKLQkuYnl0ZSAyCi0ucG9wc2VjdGlvbgotCS5ieXRlIDEKLS5wcmV2aW91cwotCS5ieXRlIDAKLS5wcmV2aW91cwotCS5ieXRlIDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYWM3NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGFsbGluc24KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPGFkZD46Ci0gICAwOglhNiAwMSAgICAgICAJYWRkIHIwLHIxCi0gICAyOglhNCAwMiAgICAgICAJYWRkIDB4MCxyMgotCi0wKzAwMDQgPGFkZDI+OgotICAgNDoJYTUgZjMgICAgICAgCWFkZDIgLTEscjMKLQotMCswMDA2IDxhZGRjPjoKLSAgIDY6CWE3IDQ1ICAgICAgIAlhZGRjIHI0LHI1Ci0KLTArMDAwOCA8YWRkbj46Ci0gICA4OglhMiA2NyAgICAgICAJYWRkbiByNixyNwotICAgYToJYTAgZjggICAgICAgCWFkZG4gMHhmLHI4Ci0KLTArMDAwYyA8YWRkbjI+OgotICAgYzoJYTEgMDkgICAgICAgCWFkZG4yIC0xNixyOQotCi0wKzAwMGUgPHN1Yj46Ci0gICBlOglhYyBhYiAgICAgICAJc3ViIHIxMCxyMTEKLQotMCswMDEwIDxzdWJjPjoKLSAgMTA6CWFkIGNkICAgICAgIAlzdWJjIHIxMixyMTMKLQotMCswMDEyIDxzdWJuPjoKLSAgMTI6CWFlIGVmICAgICAgIAlzdWJuIHIxNCxyMTUKLQotMCswMDE0IDxjbXA+OgotICAxNDoJYWEgZGUgICAgICAgCWNtcCByMTMscjE0Ci0gIDE2OglhOCAxZiAgICAgICAJY21wIDB4MSxyMTUKLQotMCswMDE4IDxjbXAyPjoKLSAgMTg6CWE5IDEwICAgICAgIAljbXAyIC0xNSxyMAotCi0wKzAwMWEgPGFuZD46Ci0gIDFhOgk4MiAxMiAgICAgICAJYW5kIHIxLHIyCi0gIDFjOgk4NCAzNCAgICAgICAJYW5kIHIzLEByNAotCi0wKzAwMWUgPGFuZGg+OgotICAxZToJODUgNTYgICAgICAgCWFuZGggcjUsQHI2Ci0KLTArMDAyMCA8YW5kYj46Ci0gIDIwOgk4NiA3OCAgICAgICAJYW5kYiByNyxAcjgKLQotMCswMDIyIDxvcj46Ci0gIDIyOgk5MiA5YSAgICAgICAJb3IgcjkscjEwCi0gIDI0Ogk5NCBiYyAgICAgICAJb3IgcjExLEByMTIKLQotMCswMDI2IDxvcmg+OgotICAyNjoJOTUgZGUgICAgICAgCW9yaCByMTMsQHIxNAotCi0wKzAwMjggPG9yYj46Ci0gIDI4Ogk5NiBmZCAgICAgICAJb3JiIHIxNSxAcjEzCi0KLTArMDAyYSA8ZW9yPjoKLSAgMmE6CTlhIGVmICAgICAgIAllb3IgcjE0LHIxNQotICAyYzoJOWMgMDEgICAgICAgCWVvciByMCxAcjEKLQotMCswMDJlIDxlb3JoPjoKLSAgMmU6CTlkIDIzICAgICAgIAllb3JoIHIyLEByMwotCi0wKzAwMzAgPGVvcmI+OgotICAzMDoJOWUgNDUgICAgICAgCWVvcmIgcjQsQHI1Ci0KLTArMDAzMiA8YmFuZGw+OgotICAzMjoJODAgZjYgICAgICAgCWJhbmRsIDB4ZixAcjYKLQotMCswMDM0IDxuYWRoPjoKLSAgMzQ6CTgxIDc3ICAgICAgIAliYW5kaCAweDcsQHI3Ci0KLTArMDAzNiA8Ym9ybD46Ci0gIDM2Ogk5MCAzOCAgICAgICAJYm9ybCAweDMsQHI4Ci0KLTArMDAzOCA8Ym9yaD46Ci0gIDM4Ogk5MSBkOSAgICAgICAJYm9yaCAweGQsQHI5Ci0KLTArMDAzYSA8YmVvcmw+OgotICAzYToJOTggZmEgICAgICAgCWJlb3JsIDB4ZixAcjEwCi0KLTArMDAzYyA8YmVvcmg+OgotICAzYzoJOTkgMWIgICAgICAgCWJlb3JoIDB4MSxAcjExCi0KLTArMDAzZSA8YnRzdGw+OgotICAzZToJODggMGMgICAgICAgCWJ0c3RsIDB4MCxAcjEyCi0KLTArMDA0MCA8YnRzdGg+OgotICA0MDoJODkgOGQgICAgICAgCWJ0c3RoIDB4OCxAcjEzCi0KLTArMDA0MiA8bXVsPjoKLSAgNDI6CWFmIGVmICAgICAgIAltdWwgcjE0LHIxNQotCi0wKzAwNDQgPG11bHU+OgotICA0NDoJYWIgZGUgICAgICAgCW11bHUgcjEzLHIxNAotCi0wKzAwNDYgPG11bHVoPjoKLSAgNDY6CWJiIGYwICAgICAgIAltdWx1aCByMTUscjAKLQotMCswMDQ4IDxtdWxoPjoKLSAgNDg6CWJmIDEyICAgICAgIAltdWxoIHIxLHIyCi0KLTArMDA0YSA8ZGl2MHM+OgotICA0YToJOTcgNDMgICAgICAgCWRpdjBzIHIzCi0KLTArMDA0YyA8ZGl2MHU+OgotICA0YzoJOTcgNTQgICAgICAgCWRpdjB1IHI0Ci0KLTArMDA0ZSA8ZGl2MT46Ci0gIDRlOgk5NyA2NSAgICAgICAJZGl2MSByNQotCi0wKzAwNTAgPGRpdjI+OgotICA1MDoJOTcgNzYgICAgICAgCWRpdjIgcjYKLQotMCswMDUyIDxkaXYzPjoKLSAgNTI6CTlmIDYwICAgICAgIAlkaXYzCi0KLTArMDA1NCA8ZGl2NHM+OgotICA1NDoJOWYgNzAgICAgICAgCWRpdjRzCi0KLTArMDA1NiA8bHNsPjoKLSAgNTY6CWI2IDc4ICAgICAgIAlsc2wgcjcscjgKLSAgNTg6CWI0IDM5ICAgICAgIAlsc2wgMHgzLHI5Ci0KLTArMDA1YSA8bHNsMj46Ci0gIDVhOgliNSAwYSAgICAgICAJbHNsMiAweDAscjEwCi0KLTArMDA1YyA8bHNyPjoKLSAgNWM6CWIyIGJjICAgICAgIAlsc3IgcjExLHIxMgotICA1ZToJYjAgZmQgICAgICAgCWxzciAweGYscjEzCi0KLTArMDA2MCA8bHNyMj46Ci0gIDYwOgliMSBmZSAgICAgICAJbHNyMiAweGYscjE0Ci0KLTArMDA2MiA8YXNyPjoKLSAgNjI6CWJhIGZkICAgICAgIAlhc3IgcjE1LHIxMwotICA2NDoJYjggNmUgICAgICAgCWFzciAweDYscjE0Ci0KLTArMDA2NiA8YXNyMj46Ci0gIDY2OgliOSA3ZiAgICAgICAJYXNyMiAweDcscjE1Ci0KLTArMDA2OCA8bGRpXzg+OgotICA2ODoJY2YgZjIgICAgICAgCWxkaTo4IDB4ZmYscjIKLQotMCswMDZhIDxsZD46Ci0gIDZhOgkwNCAzNCAgICAgICAJbGQgQHIzLHI0Ci0gIDZjOgkwMCA1NiAgICAgICAJbGQgQFwocjEzLHI1XCkscjYKLSAgNmU6CTI3IGY3ICAgICAgIAlsZCBAXChyMTQsNTA4XCkscjcKLSAgNzA6CTAzIGY4ICAgICAgIAlsZCBAXChyMTUsMHgzY1wpLHI4Ci0gIDcyOgkwNyAwOSAgICAgICAJbGQgQHIxNVwrLHI5Ci0gIDc0OgkwNyA5MCAgICAgICAJbGQgQHIxNVwrLHBzCi0gIDc2OgkwNyA4MCAgICAgICAJbGQgQHIxNVwrLHRicgotICA3ODoJMDcgODEgICAgICAgCWxkIEByMTVcKyxycAotICA3YToJMDcgODIgICAgICAgCWxkIEByMTVcKyxzc3AKLQotMCswMDdjIDxsZHVoPjoKLSAgN2M6CTA1IGFiICAgICAgIAlsZHVoIEByMTAscjExCi0gIDdlOgkwMSBjZCAgICAgICAJbGR1aCBAXChyMTMscjEyXCkscjEzCi0gIDgwOgk0OCAwZiAgICAgICAJbGR1aCBAXChyMTQsLTI1NlwpLHIxNQotCi0wKzAwODIgPGxkdWI+OgotICA4MjoJMDYgZGUgICAgICAgCWxkdWIgQHIxMyxyMTQKLSAgODQ6CTAyIGYwICAgICAgIAlsZHViIEBcKHIxMyxyMTVcKSxyMAotICA4NjoJNjggMDEgICAgICAgCWxkdWIgQFwocjE0LC0xMjhcKSxyMQotCi0wKzAwODggPHN0PjoKLSAgODg6CTE0IDMyICAgICAgIAlzdCByMixAcjMKLSAgOGE6CTEwIDU0ICAgICAgIAlzdCByNCxAXChyMTMscjVcKQotICA4YzoJMzggMDYgICAgICAgCXN0IHI2LEBcKHIxNCwtNTEyXCkKLSAgOGU6CTEzIGY3ICAgICAgIAlzdCByNyxAXChyMTUsMHgzY1wpCi0gIDkwOgkxNyAwOCAgICAgICAJc3QgcjgsQC1yMTUKLSAgOTI6CTE3IDg0ICAgICAgIAlzdCBtZGgsQC1yMTUKLSAgOTQ6CTE3IDkwICAgICAgIAlzdCBwcyxALXIxNQotCi0wKzAwOTYgPHN0aD46Ci0gIDk2OgkxNSBhOSAgICAgICAJc3RoIHI5LEByMTAKLSAgOTg6CTExIGNiICAgICAgIAlzdGggcjExLEBcKHIxMyxyMTJcKQotICA5YToJNTQgMGQgICAgICAgCXN0aCByMTMsQFwocjE0LDEyOFwpCi0KLTArMDA5YyA8c3RiPjoKLSAgOWM6CTE2IGZlICAgICAgIAlzdGIgcjE0LEByMTUKLSAgOWU6CTEyIDEwICAgICAgIAlzdGIgcjAsQFwocjEzLHIxXCkKLSAgYTA6CTc4IDAyICAgICAgIAlzdGIgcjIsQFwocjE0LC0xMjhcKQotCi0wKzAwYTIgPG1vdj46Ci0gIGEyOgk4YiAzNCAgICAgICAJbW92IHIzLHI0Ci0gIGE0OgliNyA1NSAgICAgICAJbW92IG1kbCxyNQotICBhNjoJMTcgMTYgICAgICAgCW1vdiBwcyxyNgotICBhODoJYjMgMzcgICAgICAgCW1vdiByNyx1c3AKLSAgYWE6CTA3IDE4ICAgICAgIAltb3YgcjgscHMKLQotMCswMGFjIDxqbXA+OgotICBhYzoJOTcgMDkgICAgICAgCWptcCBAcjkKLQotMCswMGFlIDxyZXQ+OgotICBhZToJOTcgMjAgICAgICAgCXJldAotCi0wKzAwYjAgPGJyYT46Ci0gIGIwOgllMCBhNyAgICAgICAJYnJhIDAgXDxhZGRcPgotCi0wKzAwYjIgPGJubz46Ci0gIGIyOgllMSBhNiAgICAgICAJYm5vIDAgXDxhZGRcPgotCi0wKzAwYjQgPGJlcT46Ci0gIGI0OgllMiBhNSAgICAgICAJYmVxIDAgXDxhZGRcPgotCi0wKzAwYjYgPGJuZT46Ci0gIGI2OgllMyBhNCAgICAgICAJYm5lIDAgXDxhZGRcPgotCi0wKzAwYjggPGJjPjoKLSAgYjg6CWU0IGEzICAgICAgIAliYyAwIFw8YWRkXD4KLQotMCswMGJhIDxibmM+OgotICBiYToJZTUgYTIgICAgICAgCWJuYyAwIFw8YWRkXD4KLQotMCswMGJjIDxibj46Ci0gIGJjOgllNiBhMSAgICAgICAJYm4gMCBcPGFkZFw+Ci0KLTArMDBiZSA8YnA+OgotICBiZToJZTcgYTAgICAgICAgCWJwIDAgXDxhZGRcPgotCi0wKzAwYzAgPGJ2PjoKLSAgYzA6CWU4IDlmICAgICAgIAlidiAwIFw8YWRkXD4KLQotMCswMGMyIDxibnY+OgotICBjMjoJZTkgOWUgICAgICAgCWJudiAwIFw8YWRkXD4KLQotMCswMGM0IDxibHQ+OgotICBjNDoJZWEgOWQgICAgICAgCWJsdCAwIFw8YWRkXD4KLQotMCswMGM2IDxiZ2U+OgotICBjNjoJZWIgOWMgICAgICAgCWJnZSAwIFw8YWRkXD4KLQotMCswMGM4IDxibGU+OgotICBjODoJZWMgOWIgICAgICAgCWJsZSAwIFw8YWRkXD4KLQotMCswMGNhIDxiZ3Q+OgotICBjYToJZWQgOWEgICAgICAgCWJndCAwIFw8YWRkXD4KLQotMCswMGNjIDxibHM+OgotICBjYzoJZWUgOTkgICAgICAgCWJscyAwIFw8YWRkXD4KLQotMCswMGNlIDxiaGk+OgotICBjZToJZWYgOTggICAgICAgCWJoaSAwIFw8YWRkXD4KLQotMCswMGQwIDxqbXBfZD46Ci0gIGQwOgk5ZiAwYiAgICAgICAJam1wOmQgQHIxMQotICBkMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZDQgPHJldF9kPjoKLSAgZDQ6CTlmIDIwICAgICAgIAlyZXQ6ZAotICBkNjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZDggPGJyYV9kPjoKLSAgZDg6CWYwIGZiICAgICAgIAlicmE6ZCBkMCBcPGptcF9kXD4KLSAgZGE6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGRjIDxibm9fZD46Ci0gIGRjOglmMSBmOSAgICAgICAJYm5vOmQgZDAgXDxqbXBfZFw+Ci0gIGRlOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBlMCA8YmVxX2Q+OgotICBlMDoJZjIgZjcgICAgICAgCWJlcTpkIGQwIFw8am1wX2RcPgotICBlMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZTQgPGJuZV9kPjoKLSAgZTQ6CWYzIGY1ICAgICAgIAlibmU6ZCBkMCBcPGptcF9kXD4KLSAgZTY6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGU4IDxiY19kPjoKLSAgZTg6CWY0IGYzICAgICAgIAliYzpkIGQwIFw8am1wX2RcPgotICBlYToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZWMgPGJuY19kPjoKLSAgZWM6CWY1IGYxICAgICAgIAlibmM6ZCBkMCBcPGptcF9kXD4KLSAgZWU6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGYwIDxibl9kPjoKLSAgZjA6CWY2IGVmICAgICAgIAlibjpkIGQwIFw8am1wX2RcPgotICBmMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZjQgPGJwX2Q+OgotICBmNDoJZjcgZWQgICAgICAgCWJwOmQgZDAgXDxqbXBfZFw+Ci0gIGY2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBmOCA8YnZfZD46Ci0gIGY4OglmOCBlYiAgICAgICAJYnY6ZCBkMCBcPGptcF9kXD4KLSAgZmE6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGZjIDxibnZfZD46Ci0gIGZjOglmOSBlOSAgICAgICAJYm52OmQgZDAgXDxqbXBfZFw+Ci0gIGZlOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDEwMCA8Ymx0X2Q+OgotIDEwMDoJZmEgZTcgICAgICAgCWJsdDpkIGQwIFw8am1wX2RcPgotIDEwMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMDQgPGJnZV9kPjoKLSAxMDQ6CWZiIGU1ICAgICAgIAliZ2U6ZCBkMCBcPGptcF9kXD4KLSAxMDY6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTA4IDxibGVfZD46Ci0gMTA4OglmYyBlMyAgICAgICAJYmxlOmQgZDAgXDxqbXBfZFw+Ci0gMTBhOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDEwYyA8Ymd0X2Q+OgotIDEwYzoJZmQgZTEgICAgICAgCWJndDpkIGQwIFw8am1wX2RcPgotIDEwZToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMTAgPGJsc19kPjoKLSAxMTA6CWZlIGRmICAgICAgIAlibHM6ZCBkMCBcPGptcF9kXD4KLSAxMTI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTE0IDxiaGlfZD46Ci0gMTE0OglmZiBkZCAgICAgICAJYmhpOmQgZDAgXDxqbXBfZFw+Ci0gMTE2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDExOCA8bGRyZXM+OgotIDExODoJYmMgODIgICAgICAgCWxkcmVzIEByMlwrLDB4OAotCi0wKzAxMWEgPHN0cmVzPjoKLSAxMWE6CWJkIGYzICAgICAgIAlzdHJlcyAweGYsQHIzXCsKLQotMCswMTFjIDxub3A+OgotIDExYzoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMWUgPGFuZGNjcj46Ci0gMTFlOgk4MyBmZiAgICAgICAJYW5kY2NyIDB4ZmYKLQotMCswMTIwIDxvcmNjcj46Ci0gMTIwOgk5MyA3ZCAgICAgICAJb3JjY3IgMHg3ZAotCi0wKzAxMjIgPHN0aWxtPjoKLSAxMjI6CTg3IDYxICAgICAgIAlzdGlsbSAweDYxCi0KLTArMDEyNCA8YWRkc3A+OgotIDEyNDoJYTMgODAgICAgICAgCWFkZHNwIC01MTIKLQotMCswMTI2IDxleHRzYj46Ci0gMTI2Ogk5NyA4OSAgICAgICAJZXh0c2IgcjkKLQotMCswMTI4IDxleHR1Yj46Ci0gMTI4Ogk5NyA5YSAgICAgICAJZXh0dWIgcjEwCi0KLTArMDEyYSA8ZXh0c2g+OgotIDEyYToJOTcgYWIgICAgICAgCWV4dHNoIHIxMQotCi0wKzAxMmMgPGV4dHVoPjoKLSAxMmM6CTk3IGJjICAgICAgIAlleHR1aCByMTIKLQotMCswMTJlIDxlbnRlcj46Ci0gMTJlOgkwZiBmZiAgICAgICAJZW50ZXIgMHgzZmMKLQotMCswMTMwIDxsZWF2ZT46Ci0gMTMwOgk5ZiA5MCAgICAgICAJbGVhdmUKLQotMCswMTMyIDx4Y2hiPjoKLSAxMzI6CThhIGVmICAgICAgIAl4Y2hiIEByMTQscjE1Ci0KLTArMDEzNCA8bGRpXzMyPjoKLSAxMzQ6CTlmIDgwIDEyIDM0IAlsZGk6MzIgMHgxMjM0NTY3OCxyMAotIDEzODoJNTYgNzggCi0KLTArMDEzYSA8Y29wb3A+OgotIDEzYToJOWYgY2YgMDEgMzQgCWNvcG9wIDB4ZiwweDEsY3IzLGNyNAotIDEzZToJOWYgY2YgMDQgNTYgCWNvcG9wIDB4ZiwweDQsY3I1LGNyNgotIDE0MjoJOWYgY2YgZmYgNzAgCWNvcG9wIDB4ZiwweGZmLGNyNyxjcjAKLQotMCswMTQ2IDxjb3BsZD46Ci0gMTQ2Ogk5ZiBkMCAwMCA0MCAJY29wbGQgMHgwLDB4MCxyNCxjcjAKLQotMCswMTRhIDxjb3BzdD46Ci0gMTRhOgk5ZiBlNyAwMiAxNSAJY29wc3QgMHg3LDB4MixjcjEscjUKLQotMCswMTRlIDxjb3Bzdj46Ci0gMTRlOgk5ZiBmOCAwMyAyNiAJY29wc3YgMHg4LDB4MyxjcjIscjYKLQotMCswMTUyIDxsZG0wPjoKLSAxNTI6CThjIDhkICAgICAgIAlsZG0wIFwocjAscjIscjMscjdcKQotCi0wKzAxNTQgPGxkbTE+OgotIDE1NDoJOGQgODkgICAgICAgCWxkbTEgXChyOCxyMTEscjE1XCkKLQotMCswMTU2IDxzdG0wPjoKLSAxNTY6CThlIDMwICAgICAgIAlzdG0wIFwocjIscjNcKQotCi0wKzAxNTggPHN0bTE+OgotIDE1ODoJOGYgMDYgICAgICAgCXN0bTEgXChyMTMscjE0XCkKLQotMCswMTVhIDxjYWxsPjoKLSAxNWE6CWQ3IDUyICAgICAgIAljYWxsIDAgXDxhZGRcPgotIDE1YzoJOTcgMWEgICAgICAgCWNhbGwgQHIxMAotCi0wKzAxNWUgPGNhbGxfZD46Ci0gMTVlOglkZiA1MCAgICAgICAJY2FsbDpkIDAgXDxhZGRcPgotIDE2MDoJOWYgYTAgICAgICAgCW5vcAotIDE2MjoJOWYgMWMgICAgICAgCWNhbGw6ZCBAcjEyCi0gMTY0Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDE2NiA8ZG1vdj46Ci0gMTY2OgkwOCAyMiAgICAgICAJZG1vdiBAMHg4OCxyMTMKLSAxNjg6CTE4IDE1ICAgICAgIAlkbW92IHIxMyxAMHg1NAotIDE2YToJMGMgMTEgICAgICAgCWRtb3YgQDB4NDQsQHIxM1wrCi0gMTZjOgkxYyAwMCAgICAgICAJZG1vdiBAcjEzXCssQDB4MAotIDE2ZToJMGIgMGIgICAgICAgCWRtb3YgQDB4MmMsQC1yMTUKLSAxNzA6CTFiIDA5ICAgICAgIAlkbW92IEByMTVcKyxAMHgyNAotCi0wKzAxNzIgPGRtb3ZoPjoKLSAxNzI6CTA5IDQ0ICAgICAgIAlkbW92aCBAMHg4OCxyMTMKLSAxNzQ6CTE5IDI5ICAgICAgIAlkbW92aCByMTMsQDB4NTIKLSAxNzY6CTBkIDFhICAgICAgIAlkbW92aCBAMHgzNCxAcjEzXCsKLSAxNzg6CTFkIDI5ICAgICAgIAlkbW92aCBAcjEzXCssQDB4NTIKLQotMCswMTdhIDxkbW92Yj46Ci0gMTdhOgkwYSA5MSAgICAgICAJZG1vdmIgQDB4OTEscjEzCi0gMTdjOgkxYSA1MyAgICAgICAJZG1vdmIgcjEzLEAweDUzCi0gMTdlOgkwZSA0NyAgICAgICAJZG1vdmIgQDB4NDcsQHIxM1wrCi0gMTgwOgkxZSAwMCAgICAgICAJZG1vdmIgQHIxM1wrLEAweDAKLQotMCswMTgyIDxsZGlfMjA+OgotIDE4MjoJOWIgZjEgZmYgZmYgCWxkaToyMCAweGZmZmZmLHIxCi0KLTArMDE4NiA8ZmluaXNoPjoKLSAxODY6CTlmIDgwIDAwIDAwIAlsZGk6MzIgMHg4MDAwLHIwCi0gMThhOgk4MCAwMCAKLSAxOGM6CWIzIDIwICAgICAgIAltb3YgcjAsc3NwCi0gMThlOgk5ZiA4MCAwMCAwMCAJbGRpOjMyIDB4MSxyMAotIDE5MjoJMDAgMDEgCi0gMTk0OgkxZiAwYSAgICAgICAJaW50IDB4YQotCi0wKzAxOTYgPGludGU+OgotIDE5NjoJOWYgMzAgICAgICAgCWludGUKLQotMCswMTk4IDxyZXRpPjoKLSAxOTg6CTk3IDMwICAgICAgIAlyZXRpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjZmUxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIEZSMzAgYXNzZW1ibGVyIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IGZyMzAqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFsbGluc24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODNkMjRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5zCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLSAuZGF0YQotZm9vZGF0YTogLndvcmQgNDIKLQkgLnRleHQKLWZvb3RleHQ6Ci0JLmdsb2JhbCBhZGQKLWFkZDoKLQlhZGQgcjAsIHIxCi0JYWRkICMwLCByMgotCS5nbG9iYWwgYWRkMgotYWRkMjoKLQlhZGQyICMtMSwgcjMKLQkuZ2xvYmFsIGFkZGMKLWFkZGM6Ci0JYWRkYyByNCwgcjUKLQkuZ2xvYmFsIGFkZG4KLWFkZG46Ci0JYWRkbiByNiwgcjcKLQlhZGRuICMxNSwgcjgKLQkuZ2xvYmFsIGFkZG4yCi1hZGRuMjoKLQlhZGRuMiAjLTE2LCByOQotCS5nbG9iYWwgc3ViCi1zdWI6Ci0Jc3ViIHIxMCwgcjExCi0JLmdsb2JhbCBzdWJjCi1zdWJjOgotCXN1YmMgcjEyLCByMTMKLQkuZ2xvYmFsIHN1Ym4KLXN1Ym46Ci0Jc3VibiByMTQsIHIxNQotCS5nbG9iYWwgY21wCi1jbXA6Ci0JY21wIGFjLCBmcAotCWNtcCAjMSwgc3AKLQkuZ2xvYmFsIGNtcDIKLWNtcDI6Ci0JY21wMiAjLTE1LCByMAotCS5nbG9iYWwgYW5kCi1hbmQ6Ci0JYW5kIHIxLCByMgotCWFuZCByMywgQHI0Ci0JLmdsb2JhbCBhbmRoCi1hbmRoOgotCWFuZGggcjUsIEByNgotCS5nbG9iYWwgYW5kYgotYW5kYjoKLQlhbmRiIHI3LCBAcjgKLQkuZ2xvYmFsIG9yCi1vcjoKLQlvciByOSwgcjEwCi0Jb3IgcjExLCBAcjEyCi0JLmdsb2JhbCBvcmgKLW9yaDoKLQlvcmggcjEzLCBAcjE0Ci0JLmdsb2JhbCBvcmIKLW9yYjoKLQlvcmIgcjE1LCBAYWMKLQkuZ2xvYmFsIGVvcgotZW9yOgotCWVvciBmcCwgc3AKLQllb3IgcjAsIEByMQotCS5nbG9iYWwgZW9yaAotZW9yaDoKLQllb3JoIHIyLCBAcjMKLQkuZ2xvYmFsIGVvcmIKLWVvcmI6Ci0JZW9yYiByNCwgQHI1Ci0JLmdsb2JhbCBiYW5kbAotYmFuZGw6Ci0JYmFuZGwgIzE1LCBAcjYKLQkuZ2xvYmFsIGJhbmRoCi1uYWRoOgotCWJhbmRoICM3LCBAcjcKLQkuZ2xvYmFsIGJvcmwKLWJvcmw6Ci0JYm9ybCAjMywgQHI4Ci0JLmdsb2JhbCBib3JoCi1ib3JoOgotCWJvcmggIzEzLCBAcjkKLQkuZ2xvYmFsIGJlb3JsCi1iZW9ybDoKLQliZW9ybCAjMTUsIEByMTAKLQkuZ2xvYmFsIGJlb3JoCi1iZW9yaDoKLQliZW9yaCAjMSwgQHIxMQotCS5nbG9iYWwgYnRzdGwKLWJ0c3RsOgotCWJ0c3RsICMwLCBAcjEyCi0JLmdsb2JhbCBidHN0aAotYnRzdGg6Ci0JYnRzdGggIzgsIEByMTMKLQkuZ2xvYmFsIG11bAotbXVsOgotCW11bCByMTQsIHIxNQotCS5nbG9iYWwgbXVsdQotbXVsdToKLQltdWx1IGFjLCBmcAotCS5nbG9iYWwgbXVsdWgKLW11bHVoOgkKLQltdWx1aCBzcCwgcjAKLQkuZ2xvYmFsIG11bGgKLW11bGg6CQotCW11bGggcjEsIHIyCi0JLmdsb2JhbCBkaXYwcwotZGl2MHM6Ci0JZGl2MHMgcjMKLQkuZ2xvYmFsIGRpdjB1Ci1kaXYwdToKLQlkaXYwdSByNAotCS5nbG9iYWwgZGl2MQotZGl2MToKLQlkaXYxIHI1Ci0JLmdsb2JhbCBkaXYyCi1kaXYyOgotCWRpdjIgcjYKLQkuZ2xvYmFsIGRpdjMKLWRpdjM6Ci0JZGl2MwotCS5nbG9iYWwgZGl2NHMKLWRpdjRzOgotCWRpdjRzCi0JLmdsb2JhbCBsc2wKLWxzbDoKLQlsc2wgcjcsIHI4Ci0JbHNsICMzLCByOQotCS5nbG9iYWwgbHNsMgotbHNsMjoKLQlsc2wyICMwLCByMTAKLQkuZ2xvYmFsIGxzcgotbHNyOgotCWxzciByMTEsIHIxMgotCWxzciAjMTUsIHIxMwotCS5nbG9iYWwgbHNyMgotbHNyMjoKLQlsc3IyICMxNSwgcjE0Ci0JLmdsb2JhbCBhc3IKLWFzcjoKLQlhc3IgcjE1LCBhYwotCWFzciAjNiwgZnAKLQkuZ2xvYmFsIGFzcjIKLWFzcjI6Ci0JYXNyMiAjNywgc3AKLQkuZ2xvYmFsIGxkaV84Ci1sZGlfODoKLQlsZGk6OCAjMHhmZiwgcjIKLQkuZ2xvYmFsIGxkCi1sZDoKLQlsZCBAcjMsIHI0Ci0JbGQgQChSMTMsIHI1KSwgcjYKLQlsZCBAKFIxNCwgMHgxZmMpLCByNwotCWxkIEAoUjE1LCAweDNjKSwgcjgKLQlsZCBAcjE1KywgcjkKLQlsZCBAcjE1KywgcHMKLQlsZCBAUjE1KywgdGJyCi0JbGQgQHIxNSssIHJwCi0JbGQgQFIxNSssIHNzcAotCS5nbG9iYWwgbGR1aAotbGR1aDoKLQlsZHVoIEByMTAsIHIxMQotCWxkdWggQChyMTMsIHIxMiksIHIxMwotCWxkdWggQChyMTQsICMtMjU2KSwgcjE1Ci0JLmdsb2JhbCBsZHViCi1sZHViOgotCWxkdWIgQGFjLCBmcAotCWxkdWIgQChyMTMsIHNwKSwgcjAKLQlsZHViIEAocjE0LCAtMTI4KSwgcjEKLQkuZ2xvYmFsIHN0Ci1zdDoKLQlzdCByMiwgQHIzCi0Jc3QgcjQsIEAocjEzLCByNSkKLQlzdCByNiwgQChyMTQsIC01MTIpCi0Jc3QgcjcsIEAocjE1LCAweDNjKQotCXN0IHI4LCBAIC0gcjE1Ci0Jc3QgTURILCBALXIxNQotCXN0IFBTLCBAIC0gcjE1Ci0JLmdsb2JhbCBsc3RoCi1zdGg6Ci0Jc3RoIHI5LCBAcjEwCi0Jc3RoIHIxMSwgQChyMTMsIHIxMikKLQlzdGggcjEzLCBAKHIxNCwgMTI4KQotCS5nbG9iYWwgc3RiCi1zdGI6Ci0JU1RCIHIxNCwgQHIxNQotCXN0YiByMCwgQChyMTMsIHIxKQotCVNUQiByMiwgQChyMTQsIC0xMjgpCi0JLmdsb2JhbCBtb3YKLW1vdjoKLQltb3YgcjMsIHI0Ci0JTU9WIG1kbCwgcjUKLQltb3YgcHMsIHI2Ci0JbW92IHI3LCB1c3AKLQltb3YgcjgsIHBzCi0JLmdsb2JhbCBqbXAKLWptcDoKLQlqbXAgQHI5Ci0JLmdsb2JhbCByZXQKLXJldDoKLQlyZXQKLQkuZ2xvYmFsIGJyYQotYnJhOgotCWJyYSBmb290ZXh0Ci0JLmdsb2JhbCBibm8KLWJubzoKLQlibm8gZm9vdGV4dAotCS5nbG9iYWwgYmVxCi1iZXE6Ci0JYmVxIGZvb3RleHQKLQkuZ2xvYmFsIGJuZQotYm5lOgotCWJuZSBmb290ZXh0Ci0JLmdsb2JhbCBiYwotYmM6Ci0JYmMgZm9vdGV4dAotCS5nbG9iYWwgYm5jCi1ibmM6Ci0JYm5jIGZvb3RleHQKLQkuZ2xvYmFsIGJuCi1ibjoKLQlibiBmb290ZXh0Ci0JLmdsb2JhbCBicAotYnA6Ci0JYnAgZm9vdGV4dAotCS5nbG9iYWwgYnYKLWJ2OgotCWJ2IGZvb3RleHQKLQkuZ2xvYmFsIGJudgotYm52OgotCWJudiBmb290ZXh0Ci0JLmdsb2JhbCBibHQKLWJsdDoKLQlibHQgZm9vdGV4dAotCS5nbG9iYWwgYmdlCi1iZ2U6Ci0JYmdlIGZvb3RleHQKLQkuZ2xvYmFsIGJsZQotYmxlOgotCWJsZSBmb290ZXh0Ci0JLmdsb2JhbCBiZ3QKLWJndDoKLQliZ3QgZm9vdGV4dAotCS5nbG9iYWwgYmxzCi1ibHM6Ci0JYmxzIGZvb3RleHQKLQkuZ2xvYmFsIGJoaQotYmhpOgotCWJoaSBmb290ZXh0Ci1kZWxheV9mb290ZXh0OgkJCi0JLmdsb2JhbCBqbXBfZAotam1wX2Q6Ci0Jam1wOmQgQHIxMQotCW5vcAotCS5nbG9iYWwgcmV0X2QKLXJldF9kOgotCXJldDpkCi0Jbm9wCi0JLmdsb2JhbCBicmFfZAotYnJhX2Q6Ci0JYnJhOkQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm5vX2QKLWJub19kOgotCWJubzpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJlcV9kCi1iZXFfZDoKLQliZXE6RCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibmVfZAotYm5lX2Q6Ci0JYm5lOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmNfZAotYmNfZDoKLQliYzpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJuY19kCi1ibmNfZDoKLQlibmM6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibl9kCi1ibl9kOgotCWJuOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYnBfZAotYnBfZDoKLQlicDpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJ2X2QKLWJ2X2Q6Ci0JYnY6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibnZfZAotYm52X2Q6Ci0JYm52OmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmx0X2QKLWJsdF9kOgotCWJsdDpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJnZV9kCi1iZ2VfZDoKLQliZ2U6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibGVfZAotYmxlX2Q6Ci0JYmxlOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmd0X2QKLWJndF9kOgotCWJndDpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJsc19kCi1ibHNfZDoKLQlibHM6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBiaGlfZAotYmhpX2Q6Ci0JYmhpOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgbGRyZXMKLWxkcmVzOgotCWxkcmVzIEByMissICM4Ci0JLmdsb2JhbCBzdHJlcwotc3RyZXM6Ci0Jc3RyZXMgIzE1LCBAcjMrCi0JLmdsb2JhbCBub3AKLW5vcDoKLQlub3AKLQkuZ2xvYmFsIGFuZGNjcgotYW5kY2NyOgotCWFuZGNjciAjMjU1Ci0JLmdsb2JhbCBvcmNjcgotb3JjY3I6Ci0Jb3JjY3IgIzEyNQotCS5nbG9iYWwgc3RpbG0KLXN0aWxtOgotCXN0aWxtICM5NwotCS5nbG9iYWwgYWRkc3AKLWFkZHNwOgotCWFkZHNwICMtNTEyCi0JLmdsb2JhbCBleHRzYgotZXh0c2I6Ci0JZXh0c2IgcjkKLQkuZ2xvYmFsIGV4dHViCi1leHR1YjoKLQlleHR1YiByMTAKLQkuZ2xvYmFsIGV4dHNoCi1leHRzaDoKLQlleHRzaCByMTEKLQkuZ2xvYmFsIGV4dHVoCi1leHR1aDoKLQlleHR1aCByMTIKLQkuZ2xvYmFsIGVudGVyCi1lbnRlcjoKLQllbnRlciAjMTAyMAotCS5nbG9iYWwgbGVhdmUKLWxlYXZlOgotCWxlYXZlIAotCS5nbG9iYWwgeGNoYgoteGNoYjoKLQl4Y2hiIEByMTQsIHIxNQotCS5nbG9iYWwgbGRpXzMyCi1sZGlfMzI6Ci0JbGRpOjMyICMweDEyMzQ1Njc4LCByMAotCS5nbG9iYWwgY29wb3AKLWNvcG9wOgotCWNvcG9wICMxNSwgIzEsIGNyMywgY3I0Ci0JY29wb3AgIzE1LCAjNCwgY3I1LCBjcjYKLQljb3BvcCAjMTUsICMyNTUsIGNyNywgY3IwCi0JLmdsb2JhbCBjb3BsZAotY29wbGQ6Ci0JY29wbGQgIzAsICMwLCByNCwgY3IwCi0JLmdsb2JhbCBjb3BzdAotY29wc3Q6Ci0JY29wc3QgIzcsICMyLCBjcjEsIHI1Ci0JLmdsb2JhbCBjb3BzdgotY29wc3Y6Ci0JY29wc3YgIzgsICMzLCBjcjIsIHI2Ci0JLmdsb2JhbCBsZG0wCi1sZG0wOgotCWxkbTAgKHIwLCByMiwgcjMsIHI3KQotCS5nbG9iYWwgbGRtMQotbGRtMToKLQlsZG0xIChyOCwgcjExLCByMTUpCi0JLmdsb2JhbCBzdG0wCi1zdG0wOgotCXN0bTAgKHIyLCByMykKLQkuZ2xvYmFsIHN0bTEKLXN0bTE6Ci0Jc3RtMSAocjEzLCByMTQpCi0JLmdsb2JhbCBjYWxsCi1jYWxsOgotCWNhbGwgZm9vdGV4dAotCWNhbGwgQHIxMAotCS5nbG9iYWwgY2FsbF9kCi1jYWxsX2Q6Ci0JY2FsbDpEIGZvb3RleHQKLQlub3AKLQljYWxsOmQgQHIxMgotCW5vcAotCS5nbG9iYWwgZG1vdgotZG1vdjoKLQlkbW92IEAweDg4LCByMTMKLQlkbW92IHIxMywgQDB4NTQKLQlkbW92IEAweDQ0LCBAcjEzKwotCWRtb3YgQFIxMyssIEAweDIKLQlkbW92IEAweDJjLCBALXIxNQotCWRtb3YgQHIxNSssIEAzOAotCS5nbG9iYWwgZG1vdmgKLWRtb3ZoOgotCWRtb3ZoIEAweDg4LCByMTMKLQlkbW92aCByMTMsIEAweDUyCi0JZG1vdmggQDB4MzQsIEByMTMgKwotCWRtb3ZoIEByMTMrLCBAMHg1MgotCS5nbG9iYWwgZG1vdmIKLWRtb3ZiOgotCWRtb3ZiIEAweDkxLCByMTMKLQlkbW92YiByMTMsIEAweDUzCi0JZG1vdmIgQDcxLCBAcjEzKwotCWRtb3ZiIEByMTMrLCBAMHgwCi0JLmdsb2JhbCBsZGlfMjAKLWxkaV8yMDoKLSAJbGRpOjIwICMweDAwMGZmZmZmLCByMQotZmluaXNoOgkKLSAgICAgICAgbGRpOjMyICMweDgwMDAscjAKLQltb3YgICAgcjAsc3NwCi0gICAgICAgIGxkaTozMiAjMSxyMAotCWludCAgICAjMTAKLQkuZ2xvYmFsIGludGUKLWludGU6Ci0JaW50ZQotCS5nbG9iYWwgcmV0aQotcmV0aToKLQlyZXRpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2ZyMzAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9mcjMwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyODZiMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2ZyMzAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIEZSMzAgdGVzdGNhc2VzCi0KLWlmIFtpc3RhcmdldCBmcjMwKi0qLSpdIHsKLSMgICAgcnVuX2R1bXBfdGVzdCAiaGlnaC0xIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyYjBkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWIucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYWRkX3N1YjoKLQlhZGQuYiAjMTYscjFsCi0JYWRkLmIgcjFoLHIxbAotCWFkZC53IHIxLHIyCi0JYWRkcyAjMSxyNAotCWFkZHMgIzIscjUKLQlhZGR4IHIwbCxyMWwKLQlhZGR4ICMxNixyMmgKLQlzdWIuYiByMGwscjFsCi0Jc3ViLncgcjAscjEKLQlzdWJzICMxLHI0Ci0Jc3VicyAjMixyNQotCXN1YnggcjBsLHIxbAotCXN1YnggIzE2LHIyaAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODg1ZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2FkZF9zdWI6Ci0JYWRkLmIgIzE2LHIxbAotCWFkZC5iIHIxaCxyMWwKLQlhZGQudyAjMzIscjEKLQlhZGQudyByMSxyMgotCWFkZC5sICM2NCxlcjEKLQlhZGQubCBlcjEsZXIyCi0JYWRkcyAjMSxlcjQKLQlhZGRzICMyLGVyNQotCWFkZHMgIzQsZXI2Ci0JYWRkeCByMGwscjFsCi0JYWRkeCAjMTYscjJoCi0Jc3ViLmIgcjBsLHIxbAotCXN1Yi53ICMxNixyMQotCXN1Yi53IHIwLHIxCi0Jc3ViLmwgIzY0LGVyMQotCXN1Yi5sIGVyMSxlcjIKLQlzdWJzICMxLGVyNAotCXN1YnMgIzIsZXI1Ci0Jc3VicyAjNCxlcjYKLQlzdWJ4IHIwbCxyMWwKLQlzdWJ4ICMxNixyMmgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3Vicy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3Vicy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGIzNjk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YnMucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19hZGRfc3ViOgotCWFkZC5iICMxNixyMWwKLQlhZGQuYiByMWgscjFsCi0JYWRkLncgIzMyLHIxCi0JYWRkLncgcjEscjIKLQlhZGQubCAjNjQsZXIxCi0JYWRkLmwgZXIxLGVyMgotCWFkZHMgIzEsZXI0Ci0JYWRkcyAjMixlcjUKLQlhZGRzICM0LGVyNgotCWFkZHggcjBsLHIxbAotCWFkZHggIzE2LHIyaAotCXN1Yi5iIHIwbCxyMWwKLQlzdWIudyAjMTYscjEKLQlzdWIudyByMCxyMQotCXN1Yi5sICM2NCxlcjEKLQlzdWIubCBlcjEsZXIyCi0Jc3VicyAjMSxlcjQKLQlzdWJzICMyLGVyNQotCXN1YnMgIzQsZXI2Ci0Jc3VieCByMGwscjFsCi0Jc3VieCAjMTYscjJoCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxMDdhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLnRleHQKLWg4MzAwX2JpdF9vcHNfMToKLQliYW5kICMwLHIwbAotCWJhbmQgIzAsQHIwCi0JYmFuZCAjMCxANjQ6OAotCWJjbHIgIzAscjBsCi0JYmNsciAjMCxAcjAKLQliY2xyICMwLEA2NDo4Ci0JYmNsciByMWwscjBsCi0JYmNsciByMWwsQHIwCi0JYmNsciByMWwsQDY0OjgKLQliaWFuZCAjMCxyMGwKLQliaWFuZCAjMCxAcjAKLQliaWFuZCAjMCxANjQ6OAotCWJpbGQgIzAscjBsCi0JYmlsZCAjMCxAcjAKLQliaWxkICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM5YTU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYml0X29wc18xOgotCWJhbmQgIzAscjBsCi0JYmFuZCAjMCxAZXIwCi0JYmFuZCAjMCxANjQ6OAotCWJjbHIgIzAscjBsCi0JYmNsciAjMCxAZXIwCi0JYmNsciAjMCxANjQ6OAotCWJjbHIgcjFsLHIwbAotCWJjbHIgcjFsLEBlcjAKLQliY2xyIHIxbCxANjQ6OAotCWJpYW5kICMwLHIwbAotCWJpYW5kICMwLEBlcjAKLQliaWFuZCAjMCxANjQ6OAotCWJpbGQgIzAscjBsCi0JYmlsZCAjMCxAZXIwCi0JYmlsZCAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1OTlkNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JpdF9vcHNfMToKLQliYW5kICMwLHIwbAotCWJhbmQgIzAsQGVyMAotCWJhbmQgIzAsQDY0OjgKLQliYW5kICMwLEAxMjg6MTYKLQliYW5kICMwLEA2NTUzNjozMgotCWJjbHIgIzAscjBsCi0JYmNsciAjMCxAZXIwCi0JYmNsciAjMCxANjQ6OAotCWJjbHIgIzAsQDEyODoxNgotCWJjbHIgIzAsQDY1NTM2OjMyCi0JYmNsciByMWwscjBsCi0JYmNsciByMWwsQGVyMAotCWJjbHIgcjFsLEA2NDo4Ci0JYmNsciByMWwsQDEyODoxNgotCWJjbHIgcjFsLEA2NTUzNjozMgotCWJpYW5kICMwLHIwbAotCWJpYW5kICMwLEBlcjAKLQliaWFuZCAjMCxANjQ6OAotCWJpYW5kICMwLEAxMjg6MTYKLQliaWFuZCAjMCxANjU1MzY6MzIKLQliaWxkICMwLHIwbAotCWJpbGQgIzAsQGVyMAotCWJpbGQgIzAsQDY0OjgKLQliaWxkICMwLEAxMjg6MTYKLQliaWxkICMwLEA2NTUzNjozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OTZlNWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9iaXRfb3BzXzI6Ci0JYmlvciAjMCxyMGwKLQliaW9yICMwLEByMAotCWJpb3IgIzAsQDY0OjgKLQliaXN0ICMwLHIwbAotCWJpc3QgIzAsQHIwCi0JYmlzdCAjMCxANjQ6OAotCWJpeG9yICMwLHIwbAotCWJpeG9yICMwLEByMAotCWJpeG9yICMwLEA2NDo4Ci0JYmxkICMwLHIwbAotCWJsZCAjMCxAcjAKLQlibGQgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMmgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYmU3NGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMmgucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9iaXRfb3BzXzI6Ci0JYmlvciAjMCxyMGwKLQliaW9yICMwLEBlcjAKLQliaW9yICMwLEA2NDo4Ci0JYmlzdCAjMCxyMGwKLQliaXN0ICMwLEBlcjAKLQliaXN0ICMwLEA2NDo4Ci0JYml4b3IgIzAscjBsCi0JYml4b3IgIzAsQGVyMAotCWJpeG9yICMwLEA2NDo4Ci0JYmxkICMwLHIwbAotCWJsZCAjMCxAZXIwCi0JYmxkICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMycy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDcwNTIwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYml0X29wc18yOgotCWJpb3IgIzAscjBsCi0JYmlvciAjMCxAZXIwCi0JYmlvciAjMCxANjQ6OAotCWJpb3IgIzAsQDEyODoxNgotCWJpb3IgIzAsQDY1NTM2OjMyCi0JYmlzdCAjMCxyMGwKLQliaXN0ICMwLEBlcjAKLQliaXN0ICMwLEA2NDo4Ci0JYmlzdCAjMCxAMTI4OjE2Ci0JYmlzdCAjMCxANjU1MzY6MzIKLQliaXhvciAjMCxyMGwKLQliaXhvciAjMCxAZXIwCi0JYml4b3IgIzAsQDY0OjgKLQliaXhvciAjMCxAMTI4OjE2Ci0JYml4b3IgIzAsQDY1NTM2OjMyCi0JYmxkICMwLHIwbAotCWJsZCAjMCxAZXIwCi0JYmxkICMwLEA2NDo4Ci0JYmxkICMwLEAxMjg6MTYKLQlibGQgIzAsQDY1NTM2OjMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzliZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9iaXRfb3BzXzM6Ci0JYm5vdCAjMCxyMGwKLQlibm90ICMwLEByMAotCWJub3QgIzAsQDY0OjgKLQlibm90IHIxbCxyMGwKLQlibm90IHIxbCxAcjAKLQlibm90IHIxbCxANjQ6OAotCWJzZXQgIzAscjBsCi0JYnNldCAjMCxAcjAKLQlic2V0ICMwLEA2NDo4Ci0JYnNldCByMWwscjBsCi0JYnNldCByMWwsQHIwCi0JYnNldCByMWwsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZWRhNjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM2gucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9iaXRfb3BzXzM6Ci0JYm5vdCAjMCxyMGwKLQlibm90ICMwLEBlcjAKLQlibm90ICMwLEA2NDo4Ci0JYm5vdCByMWwscjBsCi0JYm5vdCByMWwsQGVyMAotCWJub3QgcjFsLEA2NDo4Ci0JYnNldCAjMCxyMGwKLQlic2V0ICMwLEBlcjAKLQlic2V0ICMwLEA2NDo4Ci0JYnNldCByMWwscjBsCi0JYnNldCByMWwsQGVyMAotCWJzZXQgcjFsLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzY0ZTA2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYml0X29wc18zOgotCWJub3QgIzAscjBsCi0JYm5vdCAjMCxAZXIwCi0JYm5vdCAjMCxANjQ6OAotCWJub3QgIzAsQDEyODoxNgotCWJub3QgIzAsQDY1NTM2OjMyCi0JYm5vdCByMWwscjBsCi0JYm5vdCByMWwsQGVyMAotCWJub3QgcjFsLEA2NDo4Ci0JYm5vdCByMWwsQDEyODoxNgotCWJub3QgcjFsLEA2NTUzNjozMgotCWJzZXQgIzAscjBsCi0JYnNldCAjMCxAZXIwCi0JYnNldCAjMCxANjQ6OAotCWJzZXQgIzAsQDEyODoxNgotCWJzZXQgIzAsQDY1NTM2OjMyCi0JYnNldCByMWwscjBsCi0JYnNldCByMWwsQGVyMAotCWJzZXQgcjFsLEA2NDo4Ci0JYnNldCByMWwsQDEyODoxNgotCWJzZXQgcjFsLEA2NTUzNjozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTY2ZDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9iaXRfb3BzXzQ6Ci0JYm9yICMwLHIwbAotCWJvciAjMCxAcjAKLQlib3IgIzAsQDY0OjgKLQlic3QgIzAscjBsCi0JYnN0ICMwLEByMAotCWJzdCAjMCxANjQ6OAotCWJ0c3QgIzAscjBsCi0JYnRzdCAjMCxAcjAKLQlidHN0ICMwLEA2NDo4Ci0JYnRzdCByMWwscjBsCi0JYnRzdCByMWwsQHIwCi0JYnRzdCByMWwsQDY0OjgKLQlieG9yICMwLHIwbAotCWJ4b3IgIzAsQHIwCi0JYnhvciAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzNWUxNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0aC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2JpdF9vcHNfNDoKLQlib3IgIzAscjBsCi0JYm9yICMwLEBlcjAKLQlib3IgIzAsQDY0OjgKLQlic3QgIzAscjBsCi0JYnN0ICMwLEBlcjAKLQlic3QgIzAsQDY0OjgKLQlidHN0ICMwLHIwbAotCWJ0c3QgIzAsQGVyMAotCWJ0c3QgIzAsQDY0OjgKLQlidHN0IHIxbCxyMGwKLQlidHN0IHIxbCxAZXIwCi0JYnRzdCByMWwsQDY0OjgKLQlieG9yICMwLHIwbAotCWJ4b3IgIzAsQGVyMAotCWJ4b3IgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjQ3YjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNHMucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19iaXRfb3BzXzQ6Ci0JYm9yICMwLHIwbAotCWJvciAjMCxAZXIwCi0JYm9yICMwLEA2NDo4Ci0JYm9yICMwLEAxMjg6MTYKLQlib3IgIzAsQDY1NTM2OjMyCi0JYnN0ICMwLHIwbAotCWJzdCAjMCxAZXIwCi0JYnN0ICMwLEA2NDo4Ci0JYnN0ICMwLEAxMjg6MTYKLQlic3QgIzAsQDY1NTM2OjMyCi0JYnRzdCAjMCxyMGwKLQlidHN0ICMwLEBlcjAKLQlidHN0ICMwLEA2NDo4Ci0JYnRzdCAjMCxAMTI4OjE2Ci0JYnRzdCAjMCxANjU1MzY6MzIKLQlidHN0IHIxbCxyMGwKLQlidHN0IHIxbCxAZXIwCi0JYnRzdCByMWwsQDY0OjgKLQlidHN0IHIxbCxAMTI4OjE2Ci0JYnRzdCByMWwsQDY1NTM2OjMyCi0JYnhvciAjMCxyMGwKLQlieG9yICMwLEBlcjAKLQlieG9yICMwLEA2NDo4Ci0JYnhvciAjMCxAMTI4OjE2Ci0JYnhvciAjMCxANjU1MzY6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MDYxNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2gucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotaDgzMDBfYnJhbmNoZXM6Ci0JYnNyIGg4MzAwX2JyYW5jaGVzCi0Jam1wIGg4MzAwX2JyYW5jaGVzCi0Jam1wIEByMAotCWptcCBAQDE2OjgKLQlqc3IgaDgzMDBfYnJhbmNoZXMKLQlqc3IgQHIwCi0JanNyIEBAMTY6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYmM2MmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2JyYW5jaGVzOgotCWJzciBoODMwMGhfYnJhbmNoZXM6OAotCWJzciBoODMwMGhfYnJhbmNoZXM6MTYKLQlqbXAgaDgzMDBoX2JyYW5jaGVzCi0Jam1wIEBlcjAKLQlqbXAgQEAxNjo4Ci0JanNyIGg4MzAwaF9icmFuY2hlcwotCWpzciBAZXIwCi0JanNyIEBAMTY6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzNlMTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNocy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JyYW5jaGVzOgotCWJzciBoODMwMHNfYnJhbmNoZXM6OAotCWJzciBoODMwMHNfYnJhbmNoZXM6MTYKLQlqbXAgaDgzMDBzX2JyYW5jaGVzCi0Jam1wIEBlcjAKLQlqbXAgQEAxNjo4Ci0JanNyIGg4MzAwc19icmFuY2hlcwotCWpzciBAZXIwCi0JanNyIEBAMTY6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlM2Q1M2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9jYnJhbmNoOgotCWJyYSBoODMwMF9jYnJhbmNoCi0JYnQgaDgzMDBfY2JyYW5jaAotCWJybiBoODMwMF9jYnJhbmNoCi0JYmYgaDgzMDBfY2JyYW5jaAotCWJoaSBoODMwMF9jYnJhbmNoCi0JYmxzIGg4MzAwX2NicmFuY2gKLQliY2MgaDgzMDBfY2JyYW5jaAotCWJocyBoODMwMF9jYnJhbmNoCi0JYmNzIGg4MzAwX2NicmFuY2gKLQlibG8gaDgzMDBfY2JyYW5jaAotCWJuZSBoODMwMF9jYnJhbmNoCi0JYmVxIGg4MzAwX2NicmFuY2gKLQlidmMgaDgzMDBfY2JyYW5jaAotCWJ2cyBoODMwMF9jYnJhbmNoCi0JYnBsIGg4MzAwX2NicmFuY2gKLQlibWkgaDgzMDBfY2JyYW5jaAotCWJnZSBoODMwMF9jYnJhbmNoCi0JYmx0IGg4MzAwX2NicmFuY2gKLQliZ3QgaDgzMDBfY2JyYW5jaAotCWJsZSBoODMwMF9jYnJhbmNoCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjRlMWEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0JLnRleHQKLQkuaDgzMDBoCi1oODMwMGhfY2JyYW5jaDoKLQlicmEgaDgzMDBoX2NicmFuY2g6OAotCWJ0IGg4MzAwaF9jYnJhbmNoOjgKLQlicm4gaDgzMDBoX2NicmFuY2g6OAotCWJmIGg4MzAwaF9jYnJhbmNoOjgKLQliaGkgaDgzMDBoX2NicmFuY2g6OAotCWJscyBoODMwMGhfY2JyYW5jaDo4Ci0JYmNjIGg4MzAwaF9jYnJhbmNoOjgKLQliaHMgaDgzMDBoX2NicmFuY2g6OAotCWJjcyBoODMwMGhfY2JyYW5jaDo4Ci0JYmxvIGg4MzAwaF9jYnJhbmNoOjgKLQlibmUgaDgzMDBoX2NicmFuY2g6OAotCWJlcSBoODMwMGhfY2JyYW5jaDo4Ci0JYnZjIGg4MzAwaF9jYnJhbmNoOjgKLQlidnMgaDgzMDBoX2NicmFuY2g6OAotCWJwbCBoODMwMGhfY2JyYW5jaDo4Ci0JYm1pIGg4MzAwaF9jYnJhbmNoOjgKLQliZ2UgaDgzMDBoX2NicmFuY2g6OAotCWJsdCBoODMwMGhfY2JyYW5jaDo4Ci0JYmd0IGg4MzAwaF9jYnJhbmNoOjgKLQlibGUgaDgzMDBoX2NicmFuY2g6OAotCWJyYSBoODMwMGhfY2JyYW5jaDoxNgotCWJ0IGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnJuIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmYgaDgzMDBoX2NicmFuY2g6MTYKLQliaGkgaDgzMDBoX2NicmFuY2g6MTYKLQlibHMgaDgzMDBoX2NicmFuY2g6MTYKLQliY2MgaDgzMDBoX2NicmFuY2g6MTYKLQliaHMgaDgzMDBoX2NicmFuY2g6MTYKLQliY3MgaDgzMDBoX2NicmFuY2g6MTYKLQlibG8gaDgzMDBoX2NicmFuY2g6MTYKLQlibmUgaDgzMDBoX2NicmFuY2g6MTYKLQliZXEgaDgzMDBoX2NicmFuY2g6MTYKLQlidmMgaDgzMDBoX2NicmFuY2g6MTYKLQlidnMgaDgzMDBoX2NicmFuY2g6MTYKLQlicGwgaDgzMDBoX2NicmFuY2g6MTYKLQlibWkgaDgzMDBoX2NicmFuY2g6MTYKLQliZ2UgaDgzMDBoX2NicmFuY2g6MTYKLQlibHQgaDgzMDBoX2NicmFuY2g6MTYKLQliZ3QgaDgzMDBoX2NicmFuY2g6MTYKLQlibGUgaDgzMDBoX2NicmFuY2g6MTYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjIyZWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaHMucworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQkudGV4dAotCS5oODMwMHMKLWg4MzAwc19jYnJhbmNoOgotCWJyYSBoODMwMHNfY2JyYW5jaDo4Ci0JYnQgaDgzMDBzX2NicmFuY2g6OAotCWJybiBoODMwMHNfY2JyYW5jaDo4Ci0JYmYgaDgzMDBzX2NicmFuY2g6OAotCWJoaSBoODMwMHNfY2JyYW5jaDo4Ci0JYmxzIGg4MzAwc19jYnJhbmNoOjgKLQliY2MgaDgzMDBzX2NicmFuY2g6OAotCWJocyBoODMwMHNfY2JyYW5jaDo4Ci0JYmNzIGg4MzAwc19jYnJhbmNoOjgKLQlibG8gaDgzMDBzX2NicmFuY2g6OAotCWJuZSBoODMwMHNfY2JyYW5jaDo4Ci0JYmVxIGg4MzAwc19jYnJhbmNoOjgKLQlidmMgaDgzMDBzX2NicmFuY2g6OAotCWJ2cyBoODMwMHNfY2JyYW5jaDo4Ci0JYnBsIGg4MzAwc19jYnJhbmNoOjgKLQlibWkgaDgzMDBzX2NicmFuY2g6OAotCWJnZSBoODMwMHNfY2JyYW5jaDo4Ci0JYmx0IGg4MzAwc19jYnJhbmNoOjgKLQliZ3QgaDgzMDBzX2NicmFuY2g6OAotCWJsZSBoODMwMHNfY2JyYW5jaDo4Ci0JYnJhIGg4MzAwc19jYnJhbmNoOjE2Ci0JYnQgaDgzMDBzX2NicmFuY2g6MTYKLQlicm4gaDgzMDBzX2NicmFuY2g6MTYKLQliZiBoODMwMHNfY2JyYW5jaDoxNgotCWJoaSBoODMwMHNfY2JyYW5jaDoxNgotCWJscyBoODMwMHNfY2JyYW5jaDoxNgotCWJjYyBoODMwMHNfY2JyYW5jaDoxNgotCWJocyBoODMwMHNfY2JyYW5jaDoxNgotCWJjcyBoODMwMHNfY2JyYW5jaDoxNgotCWJsbyBoODMwMHNfY2JyYW5jaDoxNgotCWJuZSBoODMwMHNfY2JyYW5jaDoxNgotCWJlcSBoODMwMHNfY2JyYW5jaDoxNgotCWJ2YyBoODMwMHNfY2JyYW5jaDoxNgotCWJ2cyBoODMwMHNfY2JyYW5jaDoxNgotCWJwbCBoODMwMHNfY2JyYW5jaDoxNgotCWJtaSBoODMwMHNfY2JyYW5jaDoxNgotCWJnZSBoODMwMHNfY2JyYW5jaDoxNgotCWJsdCBoODMwMHNfY2JyYW5jaDoxNgotCWJndCBoODMwMHNfY2JyYW5jaDoxNgotCWJsZSBoODMwMHNfY2JyYW5jaDoxNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jbXBzaTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NtcHNpMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdmMDNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NtcHNpMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyAxICJsaWJnY2MxLlMiCi07OyBsaWJnY2MxIHJvdXRpbmVzIGZvciB0aGUgSGl0YWNoaSBoOC8zMDAgY3B1LgotOzsgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4uCi07OyBzYWNAY3lnbnVzLmNvbQotCS5zZWN0aW9uIC50ZXh0Ci0JLmFsaWduIDIKLQkuZ2xvYmFsIF9fX2NtcHNpMgotX19fY21wc2kyOgotCWNtcC53CXIyICxyMCAKLQlibmUJLkwyCi0JY21wLncJcjMgLHIxIAotCWJuZQkuTDIKLQltb3YudwkjMSxyMCAKLQlydHMKLS5MMjoKLQljbXAudwlyMCAscjIgCi0JYmd0CS5MNAotCWJuZQkuTDMKLQljbXAudwlyMSAscjMgCi0JYmxzCS5MMwotLkw0OgotCXN1Yi53CXIwICxyMCAKLQlydHMKLS5MMzoKLQltb3YudwkjMixyMCAKLS5MNToKLQlydHMKLQkuZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzFhNDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZS5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLnRleHQKLWg4MzAwX2NtcDoKLQljbXAuYiAjMCxyMGwKLQljbXAuYiByMGgscjBsCi0JY21wLncgcjAscjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZWgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MWU4OGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZWgucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9jbXA6Ci0JY21wLmIgIzAscjBsCi0JY21wLmIgcjBoLHIwbAotCWNtcC53ICMzMixyMAotCWNtcC53IHIwLHIxCi0JY21wLmwgIzY0LGVyMAotCWNtcC5sIGVyMCxlcjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2YzZmUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZXMucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19jbXA6Ci0JY21wLmIgIzAscjBsCi0JY21wLmIgcjBoLHIwbAotCWNtcC53ICMzMixyMAotCWNtcC53IHIwLHIxCi0JY21wLmwgIzY0LGVyMAotCWNtcC5sIGVyMCxlcjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDRjMGEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWwucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9kZWNpbWFsOgotCWRhYSByMGwKLQlkYXMgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzkyNDA1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9kZWNpbWFsOgotCWRhYSByMGwKLQlkYXMgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFscy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzgwMmZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19kZWNpbWFsOgotCWRhYSByMGwKLQlkYXMgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzcyY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfZGl2X211bDoKLQlkaXZ4dSByMGwscjEKLQltdWx4dSByMGwscjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjYwZjhmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bGgucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9kaXZfbXVsOgotCWRpdnh1LmIgcjBsLHIxCi0JZGl2eHUudyByMCxlcjEKLQlkaXZ4cy5iIHIwbCxyMQotCWRpdnhzLncgcjAsZXIxCi0JbXVseHUuYiByMGwscjEKLQltdWx4dS53IHIwLGVyMQotCW11bHhzLmIgcjBsLHIxCi0JbXVseHMudyByMCxlcjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVscy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjYwZjhmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bHMucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9kaXZfbXVsOgotCWRpdnh1LmIgcjBsLHIxCi0JZGl2eHUudyByMCxlcjEKLQlkaXZ4cy5iIHIwbCxyMQotCWRpdnhzLncgcjAsZXIxCi0JbXVseHUuYiByMGwscjEKLQltdWx4dS53IHIwLGVyMQotCW11bHhzLmIgcjBsLHIxCi0JbXVseHMudyByMCxlcjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDM0YzgzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZGgucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2V4dGVuZDoKLQlleHRzLncgcjAKLQlleHRzLmwgZXIwCi0JZXh0dS53IHIwCi0JZXh0dS5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmU5YmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfZXh0ZW5kOgotCWV4dHMudyByMAotCWV4dHMubCBlcjAKLQlleHR1LncgcjAKLQlleHR1LmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQ1NWQ1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jb2JqZHVtcDogLS1wcmVmaXgtYWRkcmVzc2VzIC1kcgotI25hbWU6IEZGeHgxCi0KLSMgVGVzdCBmb3IgRkZ4eDo4IGFkZHJlc3NpbmcuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLipoODMwMC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0JLi4uCi0JCQkwOiAxNgltYWluCi0wKzA0MDAgPG1haW4+IGY4IDdmICAgICAgICAgICAgIG1vdi5iCSMweDdmLHIwbAotMCswNDAyIDxtYWluWytdKDB4fCkyPiAyOCBiYiAgICAgICAgICAgICBtb3YuYglAMHhiYjo4LHIwbAotMCswNDA0IDxtYWluWytdKDB4fCk0PiA2YSA4OCBmZiBiOSAgICAgICBtb3YuYglyMGwsQDB4ZmZiOToxNgotMCswNDA4IDxtYWluWytdKDB4fCk4PiBmOCAwMSAgICAgICAgICAgICBtb3YuYgkjMHgxLHIwbAotMCswNDBhIDxsb29wPiA2YSA4OCBmZiBiYiAgICAgICBtb3YuYglyMGwsQDB4ZmZiYjoxNgotMCswNDBlIDxkZWxheT4gNzkgMDEgMDAgMDAgICAgICAgbW92LncJIzB4MCxyMQotMCswNDEyIDxkZWxvb3A+IDBiIDAxICAgICAgICAgICAgIGFkZHMJIzB4MSxlcjEKLTArMDQxNCA8ZGVsb29wWytdKDB4fCkyPiA0NiAwMCAgICAgICAgICAgICBibmUJLjAgXCg0MTZcKQotCQkJNDE1OiBESVNQOAlkZWxvb3BbK10weGZmZmZmZmZmCi0wKzA0MTYgPGRlbG9vcFsrXSgweHwpND4gMTIgODggICAgICAgICAgICAgcm90bAlyMGwKLTArMDQxOCA8ZGVsb29wWytdKDB4fCk2PiA0MCAwMCAgICAgICAgICAgICBicmEJLjAgXCg0MWFcKQotCQkJNDE5OiBESVNQOAlsb29wWytdMHhmZmZmZmZmZgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZmM4NDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuZXF1ICAgIHA2ZGRyLCAgMHhmZmI5ICAgICAgICAgIDsweDdmIGZvciBvdXRwdXQgCi0JLmVxdSAgICBwNmRyLCAgICAweGZmYmIKLQkuZXF1ICAgIHNlZWQsICAgIDB4MDEKLQkudGV4dAotCS5vcmcgICAgMAotcmVzZXQ6ICAud29yZCAgIG1haW4gICAgICAgICAgICA7cmVzZXQgdmVjdG9yIAotOwotCS5vcmcgICAgMHg0MDAKLW1haW46ICAgbW92LmIgICAjMHg3ZixyMGwgICAgICAgO3BvcnQgNiBkZHIgPSA3RiAKLQltb3YuYiAgIEAweGZmYmI6OCxyMGwgICA7KioqdGVzdCoqKgotCW1vdi5iICAgcjBsLEBwNmRkcjoxNgotOwotCW1vdi5iICAgI3NlZWQscjBsICAgICAgIDtzdGFydCB3aXRoIDAwMDAwMDEKLWxvb3A6ICAgbW92LmIgICByMGwsQHA2ZHI6MTYgICAgO291dHB1dCB0byBwb3J0IDYgCi1kZWxheTogIG1vdi53ICAgIzB4MDAwMCxyMQotZGVsb29wOiBhZGRzLncgICMxLHIxCi0JYm5lICAgICBkZWxvb3A6OCAgICAgICAgO25vdCA9IDAKLQlyb3RsICAgIHIwbAotICAgICAgICBicmEgICAgIGxvb3A6OAotCS53b3JkCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2g4MzAwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2g4MzAwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ZDQxZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9oODMwMC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTgzICswLDAgQEAKLSMKLSMgU29tZSBIOC8zMDAgdGVzdHMKLSMKLXByb2MgZG9faDgzMDBfYWRkX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGRzdWIuczogaDgzMDAgYWRkL3N1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZHN1Yi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgODkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDA4MTlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwOTEyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMEIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDBCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgOTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDE4ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAxOTAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMUIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDFCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAxRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggQjIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBoODMwMCBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgRTkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE2OTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwNjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgQzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDE0OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwNDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgRDgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDE1ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwNTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMTc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDE3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9jYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNicmFuY2guczogaDgzMDAgY29uZGl0aW9uYWwgYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY2JyYW5jaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDQyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA0MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDQ2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA0NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNDgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDQ5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyA0QTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNEIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDRDMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA0RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgNEUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDRGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9iaXRvcHMxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczEuczogaDgzMDAgYml0b3BzIHRlc3RzICMxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3MjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDYyOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzY4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JpdG9wczIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMi5zOiBoODMwMCBiaXRvcHMgdGVzdHMgIzIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzU4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JpdG9wczMge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMy5zOiBoODMwMCBiaXRvcHMgdGVzdHMgIzMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3MTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0QwMDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RjQwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDYxOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzAwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdEMDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0Y0MDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2MDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0QwMDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RjQwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JpdG9wczQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzNC5zOiBoODMwMCBiaXRvcHMgdGVzdHMgIzQiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHM0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2Mzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDc1MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSA3QzAwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDdFNDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJyYW5jaC5zOiBoODMwMCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDU1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1QTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDU5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA1QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNUUwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNUYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlLnM6IGg4MzAwIGNvbXBhcmUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21wYXJlLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBBODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDFEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2RlY2ltYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVjaW1hbC5zOiBoODMwMCBkZWNpbWFsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGVjaW1hbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9pbmNkZWMge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW5jZGVjLnM6IGg4MzAwIGluY2RlYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImluY2RlYy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMUEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDBBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9kaXZtdWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGl2bXVsLnM6IGg4MzAwIGRpdm11bCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRpdm11bC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNTE4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1pc2MuczogaDgzMDAgbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1pc2MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDdCNUM1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDAzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNTY3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDU0NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAwMTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgc2V0dXBfeGZhaWwgImg4MzAwKi0qLSoiCi0gICAgZmFpbCAiaDgzMDAgbW92ZnBlL21vdnRwZSB0ZXN0cyIKLX0KLQotcHJvYyBkb19oODMwMF9tb3ZiIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmIuczogaDgzMDAgbW92YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBDODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiBGODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNjgxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZFMTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkMxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDI4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA2QTA4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDY4OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2RTk4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDZDOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSAzODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNkE4ODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfbW92dyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Z3LnM6IGg4MzAwIG1vdncgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Z3LnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNzkwMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNkYxMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNkIwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2OTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkY5MDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkI4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfcHVzaHBvcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXNocG9wLnM6IGg4MzAwIHB1c2hwb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJwdXNocG9wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA2RDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX3JvdGF0ZV9zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyb3RzaC5zOiBoODMwMCByb3RhdGUgYW5kIHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicm90c2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDEyODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxMzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDEzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxMDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMTE4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDEwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxMTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2FkZF9zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkc3ViaC5zOiBoODMwMGggYWRkL3N1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZHN1YmgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDg5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwODE5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzkxMTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwOTEyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0ExMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDBBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMEI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDBCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAwRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgOTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDE4ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3OTMxMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDE5MDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3QTMxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMUE5MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDFCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMUI5NlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDFFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCBCMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbGguczogaDgzMDBoIGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgRTkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE2OTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTYxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTYxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFGMDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwNjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgQzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDE0OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3OTQxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDY0MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QTQxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDFGMDY0MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwNDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgRDgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDE1ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA3OTUxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3QTUxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgMDFGMDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCAwNTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDIgMTc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDE3OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NiAxN0IwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggMTcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDE3MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyAxNzMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2NicmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiY2JyYW5jaGguczogaDgzMDBoIGNvbmRpdGlvbmFsIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNicmFuY2hoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNDIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDQzMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNDYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDQ3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA0ODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNDkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDRBMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA0QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNEMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDREMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA0RTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNEYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDU4MDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgNTgwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA1ODEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDU4MTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggNTgyMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyA1ODMwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDU4NDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgNTg0MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA1ODUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDU4NTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgNTg2MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCA1ODcwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDU4ODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWMgNTg5MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MCA1OEEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY0IDU4QjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjggNThDMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YyA1OEQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDcwIDU4RTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzQgNThGMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLXByb2MgZG9faDgzMDBoX2JpdG9wczEge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMWguczogaDgzMDBoIGJpdG9wcyB0ZXN0cyAjMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczFoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDcyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNjI5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdEMDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0Y0MDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3Njg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDc3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSA3QzAwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDdFNDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2JpdG9wczIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMmguczogaDgzMDBoIGJpdG9wcyB0ZXN0cyAjMiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczJoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzU4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9iaXRvcHMzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczNoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMzaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdEMDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0Y0MDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2MTk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDcwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjA5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdEMDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0Y0MDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfYml0b3BzNCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHM0aC5zOiBoODMwMGggYml0b3BzIHRlc3RzICM0IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzNGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc0MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3MzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0MwMDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RTQwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDYzOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNzUwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDdDMDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgN0U0MDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJyYW5jaGguczogaDgzMDBoIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJyYW5jaGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDU1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1QzAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDVBMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNTkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDVCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1RTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDVEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA1RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlaC5zOiBoODMwMGggY29tcGFyZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbXBhcmVoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBBODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5MjAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMUQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAxRjgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfZGVjaW1hbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZWNpbWFsaC5zOiBoODMwMGggZGVjaW1hbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRlY2ltYWxoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9pbmNkZWMge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW5jZGVjaC5zOiBoODMwMGggaW5jZGVjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaW5jZGVjaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMUEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMUI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMEI1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDBCRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwQjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMEJGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfZGl2bXVsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRpdm11bGguczogaDgzMDBoIGRpdm11bCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRpdm11bGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1MzAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDFEMDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMUQwNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1MjAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFDMDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwMUMwNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1pc2NoLnM6IGg4MzAwaCBtaXNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWlzY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDdCNUM1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgN0JENDU5OEZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwNzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxNDA2OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDE0MDZGMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAwMTQwNkQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDAxNDA2QjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwMTQwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA1NjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgNTQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDAxODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSAwMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgMDE0MDY5ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCAwMTQwNkY4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMDE0MDc4MDBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDAxNDA2RDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgMDE0MDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVhIDAxNDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgc2V0dXBfeGZhaWwgImg4MzAwKi0qLSoiCi0gICAgZmFpbCAiaDgzMDBoIG1vdmZwZS9tb3Z0cGUgdGVzdHMiCi19Ci0KLXByb2MgZG9faDgzMDBoX21vdmIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92YmguczogaDgzMDBoIG1vdmIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZiaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEM4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIEY4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA2ODE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNkUxODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3ODEwNkEyOFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDZDMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAyODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNkEwODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QTI4MDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNjg5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZFOTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNzgxMDZBQThcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA2Qzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDZBODgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgNkFBODAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfbW92dyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Z3aC5zOiBoODMwMGggbW92dyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdndoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNzkwMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNkYxMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3ODEwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDZEMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA2QjAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA2OTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkY5MDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA3ODEwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDZEOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA2QjgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX21vdmwge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92bGguczogaDgzMDBoIG1vdmwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZsaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdBMDAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxMDA2RjEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwMTAwNzgxMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMDEwMDZEMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAwMTAwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDEwMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAwMTAwNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDAxMDA2RjkwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTAwNzg5MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDIgMDEwMDZEOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NiAwMTAwNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMDEwMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX3B1c2hwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAicHVzaHBvcGguczogaDgzMDBoIHB1c2hwb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJwdXNocG9waC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDAxMDA2RDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxMDA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX3JvdGF0ZV9zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyb3RzaGguczogaDgzMDBoIHJvdGF0ZSBhbmQgc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJyb3RzaGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDEyODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxMjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTJCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDEzODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxMzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMTNCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDEyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMTIzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDEzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxMzEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMTMzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDEwODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSAxMDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTBCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDExODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAxMTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgMTFCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDEwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAxMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggMTAzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDExMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyAxMTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMTEzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfZXh0ZW5kIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dGVuZGguczogaDgzMDBoIGV4dGVuZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dGVuZGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDE3RDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxN0YwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTc1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDE3NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfYWRkX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGRzdWJzLnM6IGg4MzAwcyBhZGQvc3ViIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkc3Vicy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgODkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDA4MTlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTExMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDA5MTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTExMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEE5MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMEI5NlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDBFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA5MjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTg4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc5MzEwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgMTkwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdBMzEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxQTkyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMUIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDFCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAxQjk2XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMUU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IEIyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2Fscy5zOiBoODMwMHMgbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWxzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBFOTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTY5MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5NjEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNjYxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBNjEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMUYwNjYxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDA2MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwMTQxMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIEM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAxNDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzk0MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0E0MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDAxRjA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDAxNDEwNDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCBEODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgMTU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDc5NTEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgNjUxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNlIDdBNTEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCAwMUYwNjUxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDA1MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSAwMTQxMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDE3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAxNzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgMTdCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDE3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NiAxNzEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggMTczMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDMwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19jYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNicmFuY2hzLnM6IGg4MzAwcyBjb25kaXRpb25hbCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjYnJhbmNocy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDQyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA0MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDQ2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA0NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNDgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDQ5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyA0QTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNEIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDRDMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA0RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgNEUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDRGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDU4MDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA1ODEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDU4MjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgNTgzMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDU4NDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyA1ODUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDU4NjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgNTg3MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA1ODgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVjIDU4OTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNThBMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NCA1OEIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY4IDU4QzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmMgNThEMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA1OEUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDc0IDU4RjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNDBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci1wcm9jIGRvX2g4MzAwc19iaXRvcHMxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczFzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzEiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMxcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NjAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzYwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNzIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MjAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzIwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNjI5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDdEMDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0Y0MDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MjkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjI5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNzY4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDdDMDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgN0U0MDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NjgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzY4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNzc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYyIDdDMDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjYgN0U0MDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NzgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2JpdG9wczIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMnMuczogaDgzMDBzIGJpdG9wcyB0ZXN0cyAjMiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczJzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc0ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NDgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0QwMDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3RjQwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzY3ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2NzgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCi0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDc1ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3QzAwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdFNDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzU4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc1ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDc3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3QzAwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdFNDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzcwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc3MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19iaXRvcHMzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczNzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMzcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdEMDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0Y0MDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MTAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzEwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNjE5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MTkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjE5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzAwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDdEMDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0Y0MDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MDAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzAwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNjA5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDdEMDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgN0Y0MDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MDkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjA5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2JpdG9wczQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzNHMuczogaDgzMDBzIGJpdG9wcyB0ZXN0cyAjNCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczRzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc0MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NDAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0QwMDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3RjQwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzY3MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA3MzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgN0MwMDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3RTQwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzczMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3MzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA2Mzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgN0MwMDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSA3RTQwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzYzOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2MzkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MCA3NTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjIgN0MwMDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NiA3RTQwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc1MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDcwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NTAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJyYW5jaHMuczogaDgzMDBzIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJyYW5jaHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDU1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1QzAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDVBMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNTkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDVCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1RTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDVEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA1RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlcy5zOiBoODMwMHMgY29tcGFyZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbXBhcmVzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBBODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5MjAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMUQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAxRjgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfZGVjaW1hbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZWNpbWFscy5zOiBoODMwMHMgZGVjaW1hbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRlY2ltYWxzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19pbmNkZWMge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW5jZGVjcy5zOiBoODMwMHMgaW5jZGVjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaW5jZGVjcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMUEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMUI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMEI1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDBCRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwQjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMEJGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfZGl2bXVsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRpdm11bHMuczogaDgzMDBzIGRpdm11bCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRpdm11bHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1MzAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDFEMDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMUQwNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1MjAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFDMDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwMUMwNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1pc2NzLnM6IGg4MzAwcyBtaXNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWlzY3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDdCNUM1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgN0JENDU5OEZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwNzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxNDEwNzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDMxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDAxNDA2OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMDE0MDZGMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAwMTQwNkQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDAxNDA2QjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAwMTQwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDAxNDE2OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgMDE0MTZGMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDAxNDE3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyAwMTQxNkQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDAxNDE2QjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NiAwMTQxNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVlIDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MCA1NjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjIgNTQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY0IDAxODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NiAwMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjggMDIxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZhIDAxNDA2OTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmUgMDE0MDZGODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDc0IDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3ZSAwMTQwNkQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDgyIDAxNDA2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA4OCAwMTQwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDkwIDAxNDE2OTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwOTQgMDE0MTZGODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDlhIDAxNDE3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDBhNCAwMTQxNkQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMGE4IDAxNDE2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDBhZSAwMTQxNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAzNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldHVwX3hmYWlsICJoODMwMCotKi0qIgotICAgIGZhaWwgImg4MzAwcyBtb3ZmcGUvbW92dHBlIHRlc3RzIgotfQotCi1wcm9jIGRvX2g4MzAwc19tb3ZiIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmJzLnM6IGg4MzAwcyBtb3ZiIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92YnMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBDODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiBGODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNjgxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZFMTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzgxMDZBMjhcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2QzE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZBMDgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkEyODAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY4OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RTk4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QUE4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA2QTg4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDZBQTgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX21vdncge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92d3MuczogaDgzMDBzIG1vdncgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Z3cy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDc5MDAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDZGMTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNzgxMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNkIwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZGOTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNzgxMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNkI4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0KLXByb2MgZG9faDgzMDBzX21vdmwge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92bHMuczogaDgzMDBzIG1vdmwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Zscy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdBMDAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxMDA2RjEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwMTAwNzgxMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMDEwMDZEMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAwMTAwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDEwMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAwMTAwNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDAxMDA2RjkwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTAwNzg5MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDIgMDEwMDZEOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NiAwMTAwNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMDEwMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX3B1c2hwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAicHVzaHBvcHMuczogaDgzMDBzIHB1c2hwb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJwdXNocG9wcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDAxMDA2RDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxMDA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX3JvdGF0ZV9zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyb3RzaHMuczogaDgzMDBzIHJvdGF0ZSBhbmQgc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJyb3RzaHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDEyODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxMkM4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDEyRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxMkIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMTJGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDEzODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxM0M4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMTM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDEzRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxM0IwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMTNGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDEyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSAxMjQ4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDEyNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAxMjMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgMTI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDEzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAxMzQ4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggMTMxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDEzNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyAxMzMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMTM3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDEwODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAxMEM4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgMTA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDEwRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAxMEIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgMTBGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDExODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzZSAxMUM4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgMTE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDExRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCAxMUIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMTFGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDEwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSAxMDQ4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMTAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDEwNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAxMDMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgMTA3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDExMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NiAxMTQ4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggMTExMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVhIDExNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YyAxMTMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWUgMTE3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfZXh0ZW5kIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dGVuZHMuczogaDgzMDBzIGV4dGVuZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dGVuZHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDE3RDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxN0YwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTc1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDE3NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbWFjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1hY3MuczogaDgzMDBzIG1hYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1hY3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDAxQTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwMzIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDMzMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDAxNjA2RDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDIyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAyMzFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbXVsdGlwbGUge30gewotICAgIHNldCB0ZXN0bmFtZSAibXVsdGlwbGVzLnM6IGg4MzAwcyBtdWx0aXBsZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm11bHRpcGxlcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMDExMDZENzFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwMTIwNkQ3MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxMzA2RDczXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMDExMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMTIwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDAxMzA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX21vdjMyYnVnIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjMyYnVnLnM6IGg4MzAwaCBtb3YzMmJ1ZyB0ZXN0IgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgIm1vdjMyYnVnLnMiICIiICJQcm9wZXIgcmVsb2NhdGlvbiBmb3IgbW92LmwgKHBhcnQgMSkiXSB0aGVuIHsKLSAgICAgICAgb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICIwMDAwMDAwMlxbXlxuXF0qMzJcW15cblxdKl9hLjB4MCo4OGNhNmMwMFxbXlxuXF0qXG4iCi0JCQkJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJdGltZW91dCAJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCBoODMwMCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGg4MzAwIGluc3RydWN0aW9uIHBhcnNlcgotICAgIGRvX2g4MzAwX2FkZF9zdWIKLSAgICBkb19oODMwMF9sb2dpY2FsCi0gICAgZG9faDgzMDBfY2JyYW5jaAotICAgIGRvX2g4MzAwX2JpdG9wczEKLSAgICBkb19oODMwMF9iaXRvcHMyCi0gICAgZG9faDgzMDBfYml0b3BzMwotICAgIGRvX2g4MzAwX2JpdG9wczQKLSAgICBkb19oODMwMF9icmFuY2gKLSAgICBkb19oODMwMF9jb21wYXJlCi0gICAgZG9faDgzMDBfZGVjaW1hbAotICAgIGRvX2g4MzAwX2luY2RlYwotICAgIGRvX2g4MzAwX2Rpdm11bAotICAgIGRvX2g4MzAwX21pc2MKLSAgICBkb19oODMwMF9tb3ZiCi0gICAgZG9faDgzMDBfbW92dwotICAgIGRvX2g4MzAwX3B1c2hwb3AKLSAgICBkb19oODMwMF9yb3RhdGVfc2hpZnQKLQotICAgICMgTm93IHRlc3QgdGhlIGg4MzAwaCBpbnN0cnVjdGlvbiBwYXJzZXIKLSAgICBkb19oODMwMGhfYWRkX3N1YgotICAgIGRvX2g4MzAwaF9sb2dpY2FsCi0gICAgZG9faDgzMDBoX2NicmFuY2gKLSAgICBkb19oODMwMGhfYml0b3BzMQotICAgIGRvX2g4MzAwaF9iaXRvcHMyCi0gICAgZG9faDgzMDBoX2JpdG9wczMKLSAgICBkb19oODMwMGhfYml0b3BzNAotICAgIGRvX2g4MzAwaF9icmFuY2gKLSAgICBkb19oODMwMGhfY29tcGFyZQotICAgIGRvX2g4MzAwaF9kZWNpbWFsCi0gICAgZG9faDgzMDBoX2luY2RlYwotICAgIGRvX2g4MzAwaF9kaXZtdWwKLSAgICBkb19oODMwMGhfbWlzYwotICAgIGRvX2g4MzAwaF9tb3ZiCi0gICAgZG9faDgzMDBoX21vdncKLSAgICBkb19oODMwMGhfbW92bAotICAgIGRvX2g4MzAwX3B1c2hwb3AKLSAgICBkb19oODMwMGhfcm90YXRlX3NoaWZ0Ci0gICAgZG9faDgzMDBoX2V4dGVuZAotCi0gICAgIyBOb3cgdGVzdCB0aGUgaDgzMDBzIGluc3RydWN0aW9uIHBhcnNlcgotICAgIGRvX2g4MzAwc19hZGRfc3ViCi0gICAgZG9faDgzMDBzX2xvZ2ljYWwKLSAgICBkb19oODMwMHNfY2JyYW5jaAotICAgIGRvX2g4MzAwc19iaXRvcHMxCi0gICAgZG9faDgzMDBzX2JpdG9wczIKLSAgICBkb19oODMwMHNfYml0b3BzMwotICAgIGRvX2g4MzAwc19iaXRvcHM0Ci0gICAgZG9faDgzMDBzX2JyYW5jaAotICAgIGRvX2g4MzAwc19jb21wYXJlCi0gICAgZG9faDgzMDBzX2RlY2ltYWwKLSAgICBkb19oODMwMHNfaW5jZGVjCi0gICAgZG9faDgzMDBzX2Rpdm11bAotICAgIGRvX2g4MzAwc19taXNjCi0gICAgZG9faDgzMDBzX21vdmIKLSAgICBkb19oODMwMHNfbW92dwotICAgIGRvX2g4MzAwc19tb3ZsCi0gICAgZG9faDgzMDBfcHVzaHBvcAotICAgIGRvX2g4MzAwc19yb3RhdGVfc2hpZnQKLSAgICBkb19oODMwMHNfZXh0ZW5kCi0gICAgZG9faDgzMDBzX21hYwotICAgIGRvX2g4MzAwc19tdWx0aXBsZQotCi0gICAgZG9faDgzMDBoX21vdjMyYnVnCi0KLSAgICAjIE5vdyBzb21lIHJhbmRvbSB0ZXN0cwotICAgIHNldCBzdnI0cGljIFtleHByIFtpc3RhcmdldCAqLSotZWxmKl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4NSpdIF0KLSAgICBzZXQgZW1waWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lY29mZipdIHx8IFtpc3RhcmdldCAqLSotdWx0cml4Kl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4XFsxLTRcXSpdIF0KLSAgICBzZXQgYW91dCBbZXhwciBbaXN0YXJnZXQgKi0qLWJzZCpdIHx8IFtpc3RhcmdldCAqLSotbmV0YnNkKl1dCi0KLSAgICBydW5fZHVtcF90ZXN0ICJmZnh4MSIKLSAgICBnYXNfdGVzdCAiY21wc2kyLnMiICIiICIiICJjbXBzaTIucyIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTg4MjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfaW5jZGVjOgotCWRlYyByMGwKLQlpbmMgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5M2ZjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfaW5jZGVjOgotCWRlYy5iIHIwbAotCWRlYy53ICMxLHIwCi0JZGVjLncgIzIscjAKLQlkZWMubCAjMSxlcjAKLQlkZWMubCAjMixlcjAKLQlpbmMuYiByMGwKLQlpbmMudyAjMSxyMAotCWluYy53ICMyLHIwCi0JaW5jLmwgIzEsZXIwCi0JaW5jLmwgIzIsZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NTcwOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfaW5jZGVjOgotCWRlYy5iIHIwbAotCWRlYy53ICMxLHIwCi0JZGVjLncgIzIscjAKLQlkZWMubCAjMSxlcjAKLQlkZWMubCAjMixlcjAKLQlpbmMuYiByMGwKLQlpbmMudyAjMSxyMAotCWluYy53ICMyLHIwCi0JaW5jLmwgIzEsZXIwCi0JaW5jLmwgIzIsZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3ZTNiNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLnRleHQKLWg4MzAwX2xvZ2ljYWw6Ci0JYW5kICMxNixyMWwKLQlhbmQgcjFsLHIxaAotCWFuZGMgIzE2LGNjcgotCW9yICMxNixyMGwKLQlvciByMWwscjBsCi0Jb3JjICMxNixjY3IKLQl4b3IgIzE2LHIwbAotCXhvciByMGwscjFsCi0JeG9yYyAjMTYsY2NyCi0JbmVnIHIwbAotCW5vdCByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTVmMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbGgucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9sb2dpY2FsOgotCWFuZC5iICMxNixyMWwKLQlhbmQuYiByMWwscjFoCi0JYW5kLncgIzMyLHIxCi0JYW5kLncgcjEscjEKLQlhbmQubCAjNjQsZXIxCi0JYW5kLmwgZXIxLGVyMQotCWFuZGMgIzE2LGNjcgotCW9yLmIgIzE2LHIwbAotCW9yLmIgcjFsLHIwbAotCW9yLncgIzMyLHIxCi0Jb3IudyByMSxyMQotCW9yLmwgIzY0LGVyMQotCW9yLmwgZXIxLGVyMQotCW9yYyAjMTYsY2NyCi0JeG9yLmIgIzE2LHIwbAotCXhvci5iIHIwbCxyMWwKLQl4b3IudyAjMzIscjEKLQl4b3IudyByMSxyMQotCXhvci5sICM2NCxlcjEKLQl4b3IubCBlcjEsZXIxCi0JeG9yYyAjMTYsY2NyCi0JbmVnLmIgcjBsCi0JbmVnLncgcjAKLQluZWcubCBlcjAKLQlub3QuYiByMGwKLQlub3QudyByMAotCW5vdC5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2Fscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjNGNiYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2Fscy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2xvZ2ljYWw6Ci0JYW5kLmIgIzE2LHIxbAotCWFuZC5iIHIxbCxyMWgKLQlhbmQudyAjMzIscjEKLQlhbmQudyByMSxyMQotCWFuZC5sICM2NCxlcjEKLQlhbmQubCBlcjEsZXIxCi0JYW5kYyAjMTYsY2NyCi0JYW5kYyAjMTYsZXhyCi0Jb3IuYiAjMTYscjBsCi0Jb3IuYiByMWwscjBsCi0Jb3IudyAjMzIscjEKLQlvci53IHIxLHIxCi0Jb3IubCAjNjQsZXIxCi0Jb3IubCBlcjEsZXIxCi0Jb3JjICMxNixjY3IKLQlvcmMgIzE2LGV4cgotCXhvci5iICMxNixyMGwKLQl4b3IuYiByMGwscjFsCi0JeG9yLncgIzMyLHIxCi0JeG9yLncgcjEscjEKLQl4b3IubCAjNjQsZXIxCi0JeG9yLmwgZXIxLGVyMQotCXhvcmMgIzE2LGNjcgotCXhvcmMgIzE2LGV4cgotCW5lZy5iIHIwbAotCW5lZy53IHIwCi0JbmVnLmwgZXIwCi0Jbm90LmIgcjBsCi0Jbm90LncgcjAKLQlub3QubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWFjcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWFjcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmRmNmRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21hY3MucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tYWM6Ci0JY2xybWFjCi0JbGRtYWMgZXIwLG1hY2gKLQlsZG1hYyBlcjEsbWFjbAotCW1hYyBAZXIwKyxAZXIxKwotCXN0bWFjIG1hY2gsZXIwCi0Jc3RtYWMgbWFjbCxlcjEKLQkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjZmODA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2MucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotaDgzMDBfbWlzYzoKLQllZXBtb3YKLQlsZGMgIzAsY2NyCi0JbGRjIHIwbCxjY3IKLTsJbW92ZnBlIDE2OjE2LHIwbAotOwltb3Z0cGUgcjBsLDE2OjE2Ci0Jbm9wCi0JcnRlCi0JcnRzCi0Jc2xlZXAKLQlzdGMgY2NyLHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlY2IzZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX21pc2M6Ci0JZWVwbW92LmIKLSAJZWVwbW92LncKLQlsZGMuYiAjMCxjY3IKLQlsZGMuYiByMGwsY2NyCi0JbGRjLncgQGVyMCxjY3IKLQlsZGMudyBAKDE2OjE2LGVyMCksY2NyCi0JbGRjLncgQCgzMjoyNCxlcjApLGNjcgotCWxkYy53IEBlcjArLGNjcgotCWxkYy53IEBoODMwMGhfbWlzYzoxNixjY3IKLQlsZGMudyBAaDgzMDBoX21pc2M6MjQsY2NyCi07CW1vdmZwZSAxNjoxNixyMGwKLTsJbW92dHBlIHIwbCwxNjoxNgotCW5vcAotCXJ0ZQotCXJ0cwotCXNsZWVwCi0Jc3RjLmIgY2NyLHIwbAotCXN0Yy53IGNjcixAZXIwCi0Jc3RjLncgY2NyLEAoMTY6MTYsZXIwKQotCXN0Yy53IGNjcixAKDMyOjI0LGVyMCkKLQlzdGMudyBjY3IsQC1lcjAKLQlzdGMudyBjY3IsQGg4MzAwaF9taXNjOjE2Ci0Jc3RjLncgY2NyLEBoODMwMGhfbWlzYzoyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3YTE3Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21pc2M6Ci0JZWVwbW92LmIKLSAJZWVwbW92LncKLQlsZGMuYiAjMCxjY3IKLQlsZGMuYiByMGwsY2NyCi0JbGRjLmIgIzAsZXhyCi0JbGRjLmIgcjBsLGV4cgotCWxkYy53IEBlcjAsY2NyCi0JbGRjLncgQCgxNjoxNixlcjApLGNjcgotCWxkYy53IEAoMzI6MzIsZXIwKSxjY3IKLQlsZGMudyBAZXIwKyxjY3IKLQlsZGMudyBAaDgzMDBzX21pc2M6MTYsY2NyCi0JbGRjLncgQGg4MzAwc19taXNjOjMyLGNjcgotCWxkYy53IEBlcjAsZXhyCi0JbGRjLncgQCgxNjoxNixlcjApLGV4cgotCWxkYy53IEAoMzI6MzIsZXIwKSxleHIKLQlsZGMudyBAZXIwKyxleHIKLQlsZGMudyBAaDgzMDBzX21pc2M6MTYsZXhyCi0JbGRjLncgQGg4MzAwc19taXNjOjMyLGV4cgotOwltb3ZmcGUgMTY6MTYscjBsCi07CW1vdnRwZSByMGwsMTY6MTYKLQlub3AKLQlydGUKLQlydHMKLQlzbGVlcAotCXN0Yy5iIGNjcixyMGwKLQlzdGMuYiBleHIscjBsCi0Jc3RjLncgY2NyLEBlcjAKLQlzdGMudyBjY3IsQCgxNjoxNixlcjApCi0Jc3RjLncgY2NyLEAoMzI6MzIsZXIwKQotCXN0Yy53IGNjcixALWVyMAotCXN0Yy53IGNjcixAaDgzMDBzX21pc2M6MTYKLQlzdGMudyBjY3IsQGg4MzAwc19taXNjOjMyCi0Jc3RjLncgZXhyLEBlcjAKLQlzdGMudyBleHIsQCgxNjoxNixlcjApCi0Jc3RjLncgZXhyLEAoMzI6MzIsZXIwKQotCXN0Yy53IGV4cixALWVyMAotCXN0Yy53IGV4cixAaDgzMDBzX21pc2M6MTYKLQlzdGMudyBleHIsQGg4MzAwc19taXNjOjMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3YzMmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92MzJidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzOTNlMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3YzMmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLmg4MzAwaAotCS5nbG9iYWwgX2EKLWJsYWg6Ci0JbW92LmwgICAjX2EtMjAwMDAwMDAwMCxlcjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwNDBjMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX21vdmI6Ci0JbW92LmIgcjBsLHIxbAotCW1vdi5iICMxNixyMGwKLQltb3YuYiBAcjEscjBsCi0JbW92LmIgQCgxNjoxNixyMSkscjBsCi0JbW92LmIgQHIxKyxyMGwKLQltb3YuYiBAMTY6OCxyMGwKLQltb3YuYiBAaDgzMDBfbW92YjoxNixyMGwKLQltb3YuYiByMGwsQHIxCi0JbW92LmIgcjBsLEAoMTY6MTYscjEpCi0JbW92LmIgcjBsLEAtcjEKLQltb3YuYiByMGwsQDE2OjgKLQltb3YuYiByMGwsQGg4MzAwX21vdmI6MTYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YmgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNzExZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YmgucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9tb3ZiOgotCW1vdi5iIHIwbCxyMWwKLQltb3YuYiAjMTYscjBsCi0JbW92LmIgQGVyMSxyMGwKLQltb3YuYiBAKDE2OjE2LGVyMSkscjBsCi0JbW92LmIgQCgzMjoyNCxlcjEpLHIwbAotCW1vdi5iIEBlcjErLHIwbAotCW1vdi5iIEAxNjo4LHIwbAotCW1vdi5iIEBoODMwMGhfbW92YjoxNixyMGwKLQltb3YuYiBAaDgzMDBoX21vdmI6MjQscjBsCi0JbW92LmIgcjBsLEBlcjEKLQltb3YuYiByMGwsQCgxNjoxNixlcjEpCi0JbW92LmIgcjBsLEAoMzI6MjQsZXIxKQotCW1vdi5iIHIwbCxALWVyMQotCW1vdi5iIHIwbCxAMTY6OAotCW1vdi5iIHIwbCxAaDgzMDBoX21vdmI6MTYKLQltb3YuYiByMGwsQGg4MzAwaF9tb3ZiOjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zicy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjUwMDJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbW92YjoKLQltb3YuYiByMGwscjFsCi0JbW92LmIgIzE2LHIwbAotCW1vdi5iIEBlcjEscjBsCi0JbW92LmIgQCgxNjoxNixlcjEpLHIwbAotCW1vdi5iIEAoMzI6MzIsZXIxKSxyMGwKLQltb3YuYiBAZXIxKyxyMGwKLQltb3YuYiBAMTY6OCxyMGwKLQltb3YuYiBAaDgzMDBzX21vdmI6MTYscjBsCi0JbW92LmIgQGg4MzAwc19tb3ZiOjMyLHIwbAotCW1vdi5iIHIwbCxAZXIxCi0JbW92LmIgcjBsLEAoMTY6MTYsZXIxKQotCW1vdi5iIHIwbCxAKDMyOjMyLGVyMSkKLQltb3YuYiByMGwsQC1lcjEKLQltb3YuYiByMGwsQDE2OjgKLQltb3YuYiByMGwsQGg4MzAwc19tb3ZiOjE2Ci0JbW92LmIgcjBsLEBoODMwMHNfbW92YjozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjNzhlOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZsaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX21vdmw6Ci0JbW92LmwgZXIwLGVyMQotCW1vdi5sICM2NCxlcjAKLQltb3YubCBAZXIxLGVyMAotCW1vdi5sIEAoMTY6MTYsZXIxKSxlcjAKLQltb3YubCBAKDMyOjI0LGVyMSksZXIwCi0JbW92LmwgQGVyMSssZXIwCi0JbW92LmwgQGg4MzAwaF9tb3ZsOjE2LGVyMAotCW1vdi5sIEBoODMwMGhfbW92bDoyNCxlcjAKLQltb3YubCBlcjAsQGVyMQotCW1vdi5sIGVyMCxAKDE2OjE2LGVyMSkKLQltb3YubCBlcjAsQCgzMjoyNCxlcjEpCi0JbW92LmwgZXIwLEAtZXIxCi0JbW92LmwgZXIwLEBoODMwMGhfbW92bDoxNgotCW1vdi5sIGVyMCxAaDgzMDBoX21vdmw6MjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDM3NjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bHMucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tb3ZsOgotCW1vdi5sIGVyMCxlcjEKLQltb3YubCAjNjQsZXIwCi0JbW92LmwgQGVyMSxlcjAKLQltb3YubCBAKDE2OjE2LGVyMSksZXIwCi0JbW92LmwgQCgzMjozMixlcjEpLGVyMAotCW1vdi5sIEBlcjErLGVyMAotCW1vdi5sIEBoODMwMHNfbW92bDoxNixlcjAKLQltb3YubCBAaDgzMDBzX21vdmw6MzIsZXIwCi0JbW92LmwgZXIwLEBlcjEKLQltb3YubCBlcjAsQCgxNjoxNixlcjEpCi0JbW92LmwgZXIwLEAoMzI6MzIsZXIxKQotCW1vdi5sIGVyMCxALWVyMQotCW1vdi5sIGVyMCxAaDgzMDBzX21vdmw6MTYKLQltb3YubCBlcjAsQGg4MzAwc19tb3ZsOjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdncucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdncucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjNjRmOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLWg4MzAwX21vdnc6Ci0JbW92LncgcjAscjEKLQltb3YudyAjMTYscjAKLQltb3YudyBAcjEscjAKLQltb3YudyBAKDE2OjE2LHIxKSxyMAotCW1vdi53IEByMSsscjAKLQltb3YudyBAaDgzMDBfbW92dzoxNixyMAotCW1vdi53IHIwLEByMQotCW1vdi53IHIwLEAoMTY6MTYscjEpCi0JbW92LncgcjAsQC1yMQotCW1vdi53IHIwLEBoODMwMF9tb3Z3OjE2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3aC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTUwNTdjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbW92dzoKLQltb3YudyByMCxyMQotCW1vdi53ICMxNixyMAotCW1vdi53IEBlcjEscjAKLQltb3YudyBAKDE2OjE2LGVyMSkscjAKLQltb3YudyBAKDMyOjI0LGVyMSkscjAKLQltb3YudyBAZXIxKyxyMAotCW1vdi53IEBoODMwMGhfbW92dzoxNixyMAotCW1vdi53IEBoODMwMGhfbW92dzoyNCxyMAotCW1vdi53IHIwLEBlcjEKLQltb3YudyByMCxAKDE2OjE2LGVyMSkKLQltb3YudyByMCxAKDMyOjI0LGVyMSkKLQltb3YudyByMCxALWVyMQotCW1vdi53IHIwLEBoODMwMGhfbW92dzoxNgotCW1vdi53IHIwLEBoODMwMGhfbW92dzoyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3cy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjFkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3cy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21vdnc6Ci0JbW92LncgcjAscjEKLQltb3YudyAjMTYscjAKLQltb3YudyBAZXIxLHIwCi0JbW92LncgQCgxNjoxNixlcjEpLHIwCi0JbW92LncgQCgzMjozMixlcjEpLHIwCi0JbW92LncgQGVyMSsscjAKLQltb3YudyBAaDgzMDBzX21vdnc6MTYscjAKLQltb3YudyBAaDgzMDBzX21vdnc6MzIscjAKLQltb3YudyByMCxAZXIxCi0JbW92LncgcjAsQCgxNjoxNixlcjEpCi0JbW92LncgcjAsQCgzMjozMixlcjEpCi0JbW92LncgcjAsQC1lcjEKLQltb3YudyByMCxAaDgzMDBzX21vdnc6MTYKLQltb3YudyByMCxAaDgzMDBzX21vdnc6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbXVsdGlwbGVzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tdWx0aXBsZXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNzliNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tdWx0aXBsZXMucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tdWx0aXBsZToKLQlsZG0ubCBAc3ArLGVyMC1lcjEKLQlsZG0ubCBAc3ArLGVyMC1lcjIKLQlsZG0ubCBAc3ArLGVyMC1lcjMKLQlzdG0ubCBlcjAtZXIxLEAtc3AKLQlzdG0ubCBlcjAtZXIyLEAtc3AKLQlzdG0ubCBlcjAtZXIzLEAtc3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFiNzM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3AucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9wdXNoX3BvcDoKLQlwb3AgcjAKLQlwdXNoIHIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9waC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ5NjM5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9wdXNoX3BvcDoKLQlwb3AudyByMAotCXBvcC5sIGVyMAotCXB1c2gudyByMAotCXB1c2gubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWRmMDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcHMucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX3B1c2hfcG9wOgotCXBvcC53IHIwCi0JcG9wLmwgZXIwCi0JcHVzaC53IHIwCi0JcHVzaC5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhYTg3ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9yb3RhdGVfc2hpZnQ6Ci0Jcm90bCByMGwKLQlyb3RyIHIwbAotCXJvdHhsIHIwbAotCXJvdHhyIHIwbAotCXNoYWwgcjBsCi0Jc2hhciByMGwKLQlzaGxsIHIwbAotCXNobHIgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YWJlNDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfcm90YXRlX3NoaWZ0OgotCXJvdGwuYiByMGwKLQlyb3RsLncgcjAKLQlyb3RsLmwgZXIwCi0Jcm90ci5iIHIwbAotCXJvdHIudyByMAotCXJvdHIubCBlcjAKLQlyb3R4bC5iIHIwbAotCXJvdHhsLncgcjAKLQlyb3R4bC5sIGVyMAotCXJvdHhyLmIgcjBsCi0Jcm90eHIudyByMAotCXJvdHhyLmwgZXIwCi0Jc2hhbC5iIHIwbAotCXNoYWwudyByMAotCXNoYWwubCBlcjAKLQlzaGFyLmIgcjBsCi0Jc2hhci53IHIwCi0Jc2hhci5sIGVyMAotCXNobGwuYiByMGwKLQlzaGxsLncgcjAKLQlzaGxsLmwgZXIwCi0Jc2hsci5iIHIwbAotCXNobHIudyByMAotCXNobHIubCBlcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNocy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzQxY2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfcm90YXRlX3NoaWZ0OgotCXJvdGwuYiByMGwKLQlyb3RsLmIgIzIscjBsCi0Jcm90bC53IHIwCi0Jcm90bC53ICMyLHIwCi0Jcm90bC5sIGVyMAotCXJvdGwubCAjMixlcjAKLQlyb3RyLmIgcjBsCi0Jcm90ci5iICMyLHIwbAotCXJvdHIudyByMAotCXJvdHIudyAjMixyMAotCXJvdHIubCBlcjAKLQlyb3RyLmwgIzIsZXIwCi0Jcm90eGwuYiByMGwKLQlyb3R4bC5iICMyLHIwbAotCXJvdHhsLncgcjAKLQlyb3R4bC53ICMyLHIwCi0Jcm90eGwubCBlcjAKLQlyb3R4bC5sICMyLGVyMAotCXJvdHhyLmIgcjBsCi0Jcm90eHIuYiAjMixyMGwKLQlyb3R4ci53IHIwCi0Jcm90eHIudyAjMixyMAotCXJvdHhyLmwgZXIwCi0Jcm90eHIubCAjMixlcjAKLQlzaGFsLmIgcjBsCi0Jc2hhbC5iICMyLHIwbAotCXNoYWwudyByMAotCXNoYWwudyAjMixyMAotCXNoYWwubCBlcjAKLQlzaGFsLmwgIzIsZXIwCi0Jc2hhci5iIHIwbAotCXNoYXIuYiAjMixyMGwKLQlzaGFyLncgcjAKLQlzaGFyLncgIzIscjAKLQlzaGFyLmwgZXIwCi0Jc2hhci5sICMyLGVyMAotCXNobGwuYiByMGwKLQlzaGxsLmIgIzIscjBsCi0Jc2hsbC53IHIwCi0Jc2hsbC53ICMyLHIwCi0Jc2hsbC5sIGVyMAotCXNobGwubCAjMixlcjAKLQlzaGxyLmIgcjBsCi0Jc2hsci5iICMyLHIwbAotCXNobHIudyByMAotCXNobHIudyAjMixyMAotCXNobHIubCBlcjAKLQlzaGxyLmwgIzIsZXIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL1JFQURNRSBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmIxNzRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTm90ZXMgb24gaG93IHRoZSBIUFBBIHRlc3RzdWl0ZSBpcyBvcmdhbml6ZWQ6Ci0KLWJhc2ljLnBhcnNlIC0tIHRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzaW5nCi10ZXN0cyBhbmQgYSBzaW1wbGUgLnN0YWIgcGFyc2luZyB0ZXN0LiAgVGhpcyB3b3VsZCBiZSB3aGVyZSB5b3UnZAotYWRkIGNvZGUgdG8gbWFrZSBzdXJlIG5ldyBpbnN0cnVjdGlvbnMgYXJlIHBhcnNlZCBjb3JyZWN0bHksIG5ldwotY29tcGxldGVycyAoc3VjaCBhcyBjYWNoZSBoaXRzKSBhcmUgcGFyc2VkIGNvcnJlY3RseSwgZXRjLgotCi1JdCdzIGFsc28gYSByZWFzb25hYmxlIHBsYWNlIHRvIG1ha2Ugc3VyZSBwYXJzaW5nIG9mIHRoZSB2YXJpb3VzCi1hc3NlbWJsZXIgZGlyZWN0aXZlcyBpcyBoYW5kbGVkIGNvcnJlY3RseS4gIElmIHlvdSdyZSBnb2luZyB0byBhZGQKLXN1Y2ggY29kZSwgdHJ5IHRvIGJlIHJlYXNvbmFibHkgY29tcGxldGUuICBBZGQgdGVzdCBjb2RlIGZvciBlYWNoCi1iYXNpYyBkaXJlY3RpdmUgYW5kIHRlc3QgYWxsIChvciBhIG5vdGV3b3J0aHkpIHN1YnNldCBvZiBhcmd1bWVudHMuCi0KLUl0IHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSB0byBoYXZlIGFuIGFzc2VtYmxlciB0byBydW4gdGhlc2UgdGVzdHM7Ci1jYWxsaW5nIG9iamR1bXBfc3RhcnQgb3Igc29tZXRoaW5nIHNpbWlsYXIgc2hvdWxkIG5vdCBiZSBkb25lIGZyb20KLXRoaXMgZGlyZWN0b3J5LgotCi0KLW1vcmUucGFyc2UgLS0gdGhpcyBpcyB3aGVyZSB5b3Ugc2hvdWxkIHB1dCBhZGRpdGlvbmFsIHBhcnNpbmcgdGVzdHMsIHN1Y2gKLWFzIHRlc3RzIHRvIGNoZWNrIG1vZGUgc2VsZWN0b3IgcGFyc2luZywgc3RyaW5nIHBhcnNpbmcsIGV4cHJlc3Npb24gcGFyc2luZywKLWV0Yy4gIEl0J3MgYWxzbyBhIHJlYXNvbmFibGUgcGxhY2UgdG8gcHV0IHBhcnNpbmcgdGVzdHMgd2hpY2ggYXJlIG5vdCBjb21wbGV0ZQotZW5vdWdoICh3aGF0ZXZlciB0aGF0IG1lYW5zKSBmb3IgYmFzaWMucGFyc2UuICAKLQotSXQgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IHRvIGhhdmUgYW4gYXNzZW1ibGVyIHRvIHJ1biB0aGVzZSB0ZXN0czsKLWNhbGxpbmcgb2JqZHVtcF9zdGFydCBvciBzb21ldGhpbmcgc2ltaWxhciBzaG91bGQgbm90IGJlIGRvbmUgZnJvbQotdGhpcyBkaXJlY3RvcnkuCi0KLQotcmVsb2MgLS0gdGhpcyBpcyB3aGVyZSB5b3UgdGVzdHMgd2hpY2ggZXhhbWluZSByZWxvY2F0aW9ucyBwcm9kdWNlZAotYnkgR0FTIGJlbG9uZy4gIFRvIHJ1biB0aGVzZSB0ZXN0cyB5b3UgbXVzdCBoYXZlIGEgZnVuY3Rpb25pbmcgb2JqZHVtcC4KLQotCi11bnNvcnRlZCAtLSB0aGlzIGlzIHdoZXJlIGV2ZXJ5dGhpbmcgZWxzZSBnb2VzLiAgQXMgZ3JvdXBzIG9mIHJlbGF0ZWQgdGVzdHMKLWVuZCB1cCBpbiB0aGlzIGRpcmVjdG9yeSwgdGhleSBzaG91bGQgYmUgYnJva2VuIG91dCBpbnRvIGEgbmV3IGNsYXNzIG9mCi10ZXN0cy4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFkNGNkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGFkZC9zaD9hZGQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWFkZCAgJXI0LCVyNSwlcjYKLQlhZGQsPSAgJXI0LCVyNSwlcjYKLQlhZGQsPCAgJXI0LCVyNSwlcjYKLQlhZGQsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLG51diAgJXI0LCVyNSwlcjYKLQlhZGQsem52ICAlcjQsJXI1LCVyNgotCWFkZCxzdiAgJXI0LCVyNSwlcjYKLQlhZGQsb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRyICAlcjQsJXI1LCVyNgotCWFkZCw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLD4gICVyNCwlcjUsJXI2Ci0JYWRkLHV2ICAlcjQsJXI1LCVyNgotCWFkZCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRsICAlcjQsJXI1LCVyNgotCWFkZGwsPSAgJXI0LCVyNSwlcjYKLQlhZGRsLDwgICVyNCwlcjUsJXI2Ci0JYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRsLHN2ICAlcjQsJXI1LCVyNgotCWFkZGwsb2QgICVyNCwlcjUsJXI2Ci0JYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlhZGRsLDw+ICAlcjQsJXI1LCVyNgotCWFkZGwsPj0gICVyNCwlcjUsJXI2Ci0JYWRkbCw+ICAlcjQsJXI1LCVyNgotCWFkZGwsdXYgICVyNCwlcjUsJXI2Ci0JYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCWFkZG8gICVyNCwlcjUsJXI2Ci0JYWRkbyw9ICAlcjQsJXI1LCVyNgotCWFkZG8sPCAgJXI0LCVyNSwlcjYKLQlhZGRvLDw9ICAlcjQsJXI1LCVyNgotCWFkZG8sbnV2ICAlcjQsJXI1LCVyNgotCWFkZG8sem52ICAlcjQsJXI1LCVyNgotCWFkZG8sc3YgICVyNCwlcjUsJXI2Ci0JYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRvLHRyICAlcjQsJXI1LCVyNgotCWFkZG8sPD4gICVyNCwlcjUsJXI2Ci0JYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRvLD4gICVyNCwlcjUsJXI2Ci0JYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGRvLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkYyAgJXI0LCVyNSwlcjYKLQlhZGRjLD0gICVyNCwlcjUsJXI2Ci0JYWRkYyw8ICAlcjQsJXI1LCVyNgotCWFkZGMsPD0gICVyNCwlcjUsJXI2Ci0JYWRkYyxudXYgICVyNCwlcjUsJXI2Ci0JYWRkYyx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkYyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRjLG9kICAlcjQsJXI1LCVyNgotCWFkZGMsdHIgICVyNCwlcjUsJXI2Ci0JYWRkYyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRjLD49ICAlcjQsJXI1LCVyNgotCWFkZGMsPiAgJXI0LCVyNSwlcjYKLQlhZGRjLHV2ICAlcjQsJXI1LCVyNgotCWFkZGMsdm56ICAlcjQsJXI1LCVyNgotCWFkZGMsbnN2ICAlcjQsJXI1LCVyNgotCWFkZGMsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRjbyAgJXI0LCVyNSwlcjYKLQlhZGRjbyw9ICAlcjQsJXI1LCVyNgotCWFkZGNvLDwgICVyNCwlcjUsJXI2Ci0JYWRkY28sPD0gICVyNCwlcjUsJXI2Ci0JYWRkY28sbnV2ICAlcjQsJXI1LCVyNgotCWFkZGNvLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRjbyx0ciAgJXI0LCVyNSwlcjYKLQlhZGRjbyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRjbyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRjbyw+ICAlcjQsJXI1LCVyNgotCWFkZGNvLHV2ICAlcjQsJXI1LCVyNgotCWFkZGNvLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkY28sZXYgICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDM2YjgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JYWRkaSAgMTIzLCVyNSwlcjYKLQlhZGRpLD0gIDEyMywlcjUsJXI2Ci0JYWRkaSw8ICAxMjMsJXI1LCVyNgotCWFkZGksPD0gIDEyMywlcjUsJXI2Ci0JYWRkaSxudXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaSxzdiAgMTIzLCVyNSwlcjYKLQlhZGRpLG9kICAxMjMsJXI1LCVyNgotCWFkZGksdHIgIDEyMywlcjUsJXI2Ci0JYWRkaSw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpLD49ICAxMjMsJXI1LCVyNgotCWFkZGksPiAgMTIzLCVyNSwlcjYKLQlhZGRpLHV2ICAxMjMsJXI1LCVyNgotCWFkZGksdm56ICAxMjMsJXI1LCVyNgotCWFkZGksbnN2ICAxMjMsJXI1LCVyNgotCWFkZGksZXYgIDEyMywlcjUsJXI2Ci0KLQlhZGRpbyAgMTIzLCVyNSwlcjYKLQlhZGRpbyw9ICAxMjMsJXI1LCVyNgotCWFkZGlvLDwgIDEyMywlcjUsJXI2Ci0JYWRkaW8sPD0gIDEyMywlcjUsJXI2Ci0JYWRkaW8sbnV2ICAxMjMsJXI1LCVyNgotCWFkZGlvLHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpbyxzdiAgMTIzLCVyNSwlcjYKLQlhZGRpbyxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpbyx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpbyw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpbyw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpbyw+ICAxMjMsJXI1LCVyNgotCWFkZGlvLHV2ICAxMjMsJXI1LCVyNgotCWFkZGlvLHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpbyxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaW8sZXYgIDEyMywlcjUsJXI2Ci0KLQlhZGRpdCAgMTIzLCVyNSwlcjYKLQlhZGRpdCw9ICAxMjMsJXI1LCVyNgotCWFkZGl0LDwgIDEyMywlcjUsJXI2Ci0JYWRkaXQsPD0gIDEyMywlcjUsJXI2Ci0JYWRkaXQsbnV2ICAxMjMsJXI1LCVyNgotCWFkZGl0LHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpdCxzdiAgMTIzLCVyNSwlcjYKLQlhZGRpdCxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpdCx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpdCw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpdCw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpdCw+ICAxMjMsJXI1LCVyNgotCWFkZGl0LHV2ICAxMjMsJXI1LCVyNgotCWFkZGl0LHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpdCxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaXQsZXYgIDEyMywlcjUsJXI2Ci0KLQlhZGRpdG8gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLD0gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLDwgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLDw9ICAxMjMsJXI1LCVyNgotCWFkZGl0byxudXYgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sc3YgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLG9kICAxMjMsJXI1LCVyNgotCWFkZGl0byx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPD4gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLD49ICAxMjMsJXI1LCVyNgotCWFkZGl0byw+ICAxMjMsJXI1LCVyNgotCWFkZGl0byx1diAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sdm56ICAxMjMsJXI1LCVyNgotCWFkZGl0byxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLGV2ICAxMjMsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliYTVlYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIyNjIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyaXN0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19pbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImltZW0uczogaW50ZWdlciBtZW1vcnkgbG9hZHMgYW5kIHN0b3JlcyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImltZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA0ODlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMEM4MDEwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDQ0OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwQzgwMTA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDA5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDBDODAxMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyA2ODlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMEM5QTEyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDY0OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwQzlBMTI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgNjA5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDBDOUExMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCA0QzlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgNkM5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDBDODUwMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwQzg1MjA5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMEM4NTAwQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDBDODUyMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwQzg1MDA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMEM4NTIwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDBDODUwMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwQzg1MjA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMEM4NTAwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDBDODUyMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwQzg1MDAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMEM4NTIwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDBDODUwMTlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwQzg1MjE5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMEM4NTAxQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDBDODUyMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwQzg1MDFEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMEM4NTIxREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDBDODUwMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwQzg1MjFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMEM4MDEwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDBDODAzMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwQzgwMTBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMEM4MDEwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDBDODAzMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwQzgwMTA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMEM4MDEwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDBDODAzMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwQzgwMTAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMEM4MDExOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDBDODAzMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwQzgwMTFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMEM4MDExREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDBDODAzMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwQzgwMTFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMEM5QTEyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDBDOUEzMkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwQzlBMTJBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMEM5QTEyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDBDOUEzMjYwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwQzlBMTI2MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMEM5QTEyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDBDOUEzMjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwQzlBMTIyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMEM5QTEzODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDBDOUEzM0EwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwQzlBMTNBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMEM5QTEzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDBDOUExMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwQzlBMzMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMEM5QTEzMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDBDOUEzMzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19pbW1lZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbW1lZC5zOiBpbW1lZGlhdGUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbW1lZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDM3NUEwMDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyMzRERkJENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjhBREZCRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQgCi0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTg1RjFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEU4NUYxRkVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFODFGMUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRTgxRjFGREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEU4NUYzRkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBFODVGM0ZDRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRTg0NDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEU4NDQ0MDAyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBFODA0NDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTgwNDQwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEU4NDBDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBFODQwQzAwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRTA0MDQ0NkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEUwNDA0NDZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBFNDQwNDQ2Q1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRTQ0MDQ0NkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIENCNDQxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBDQjQ0M0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggQ0I0NDVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIENCNDQ3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBDQjQ0OUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgQ0I0NEJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IENCNDRERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBDQjQ0RkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgQ0I0NDFGQjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IENCNDQzRkFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBDQjQ0NUZBN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgQ0I0NDdGOUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIENCNDQ5Rjk3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBDQjQ0QkY4RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggQ0I0NERGODdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIENCNDRGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBDRjRBMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgQ0Y0QTNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IENGNEE1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBDRjRBN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgQ0Y0QTlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IENGNEFCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBDRjRBREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgQ0Y0QUZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIENGNEExRkI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBDRjRBM0ZBRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggQ0Y0QTVGQTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIENGNEE3RjlGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBDRjRBOUY5N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgQ0Y0QUJGOEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IENGNEFERjg3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBDRjRBRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgODA4MDFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDgwODAzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCA4MDgwNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgODA4MDdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDgwODA5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCA4MDgwQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggODA4MERGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDgwODBGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCA4ODgwMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgODg4MDNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDg4ODA1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyA4ODgwN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgODg4MDlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDg4ODBCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCA4ODgwREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgODg4MEZGN0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDgwODAxRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCA4MDgwM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggODA4MDVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDgwODA3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCA4MDgwOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgODA4MEJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDgwODBERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyA4MDgwRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgODg4MDFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDg4ODAzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCA4ODgwNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgODg4MDdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDg4ODA5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCA4ODgwQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggODg4MERGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDg4ODBGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCA4NDgwMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgODQ4MDVGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IDg0ODA3RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyA4NDgwOUZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgODQ4MEJGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IDg0ODBERkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCA4NDgwRkZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgOEM4MDFGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIDhDODAzRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCA4QzgwNUZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggOEM4MDdGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIDhDODA5RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCA4QzgwQkY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgOEM4MERGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IDhDODBGRTg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyA4NDgwMUY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODAgODQ4MDNGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg0IDg0ODA1RjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4OCA4NDgwN0Y2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgODQ4MDlGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTkwIDg0ODBCRjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5NCA4NDgwREY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTggODQ4MEZGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTljIDhDODAxRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhMCA4QzgwM0YzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTQgOEM4MDVGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE4IDhDODA3RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYyA4QzgwOUYxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgOEM4MEJGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI0IDhDODBERjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiOCA4QzgwRkYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYmMgQTA4MTFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWMwIEEwODEzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjNCBBMDgxNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzggQTA4MTdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNjIEEwODE5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkMCBBMDgxQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgQTA4MURGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ4IEEwODFGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYyBBODgxMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTAgQTg4MTNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU0IEE4ODE1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlOCBBODgxN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZWMgQTg4MTlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWYwIEE4ODFCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmNCBBODgxREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjggQTg4MUZGN0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWZjIEEwODExRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwMCBBMDgxM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDQgQTA4MTVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA4IEEwODE3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwYyBBMDgxOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTAgQTA4MUJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE0IEEwODFERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxOCBBMDgxRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMWMgQTg4MTFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjIwIEE4ODEzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyNCBBODgxNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjggQTg4MTdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjJjIEE4ODE5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzMCBBODgxQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzQgQTg4MURGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM4IEE4ODFGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzYyBBNDlGMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDAgQTQ5RjNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQ0IEE0OUY1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0OCBBNDlGN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNGMgQTQ5RjlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjUwIEE0OUZCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1NCBBNDlGREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTggQTQ5RkZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjVjIEFDOUYxRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2MCBBQzlGM0ZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjQgQUM5RjVGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjY4IEFDOUY3RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2YyBBQzlGOUY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzAgQUM5RkJGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjc0IEFDOUZERjg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3OCBBQzlGRkM4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyN2MgQTQ5RjFGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjgwIEE0OUYzRjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4NCBBNDlGNUY2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODggQTQ5RjdGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjhjIEE0OUY5RjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5MCBBNDlGQkY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTQgQTQ5RkRGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjk4IEE0OUZGRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5YyBBQzlGMUYzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTAgQUM5RjNGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmE0IEFDOUY1RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhOCBBQzlGN0YxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYWMgQUM5RjlGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmIwIEFDOUZCRjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiNCBBQzlGREYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjggQUM5RkZFRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmJjIEMwMDQ1RkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjMCBDMDA0REZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYzQgQzAwNDVGRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmM4IEMwMDRERkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjYyBDNEE0NUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyZDAgQzRBNERGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmQ0IEM0QTQ1RkM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJkOCBDNEE0REZCRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTgzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGQuczogYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMDhBNDA3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4QTQyNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAwOEE0NDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMDhBNDY3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDA4QTQ4NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAwOEE0QTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMDhBNEM3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDA4QTRFNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAwOEE0MTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMDhBNDM3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDA4QTQ1NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAwOEE0NzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMDhBNDk3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDA4QTRCNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAwOEE0RDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMDhBNEY3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDA4QTQwRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAwOEE0MkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMDhBNDRGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDA4QTQ2RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAwOEE0OEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMDhBNEFGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDA4QTRDRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAwOEE0RUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgMDhBNDFGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDA4QTQzRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAwOEE0NUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgMDhBNDdGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDA4QTQ5RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAwOEE0QkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggMDhBNERGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDA4QTRGRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT04MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaDFhZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2gxYWRkLnM6IHNoMWFkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoMWFkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoMmFkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaDJhZGQuczogc2gyYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2gyYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2gzYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoM2FkZC5zOiBzaDNhZGQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaDNhZGQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDA1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNEM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0NzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDk1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0RDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0OEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDdEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDg0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0QzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0MzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRENEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0RENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTk2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRzLnM6IGRzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29tY2xyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbWNsci5zOiBjb21jbHIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21jbHIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0Njg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0Qzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0Mzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTREODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0Rjg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgOTBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDkwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCA5MEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgOTBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDkwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCA5MEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggOTBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDkwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCA5MEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgOTBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDkwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyA5MEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgOTBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDkwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCA5MEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgOTBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0RTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTQzMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0NTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDcyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTRGMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0MDI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDIyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ0Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0NjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEUyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTQxMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MzI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDUyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ3Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0RjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0NDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNDYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTRFMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0MTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDMyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ1MjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0NzIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTQwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0MjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDQwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQ2MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0RTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQzMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0NTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNDcwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRGMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb191bml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInVuaXQuczogdW5pdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInVuaXQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0NDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NjM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0ODM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0QzM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0RTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0MTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0NTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0NzM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0OTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0RDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0RjM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0MDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0NDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0Njk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0ODk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0Qzk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0RTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0MTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0Nzk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0OTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0RDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0Rjk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0NDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0ODlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0QzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0RTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0MTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0NTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0NzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0OTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0RDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0RjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19kY29yIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRjb3IuczogZGNvciB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRjb3IucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwODgwMEI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwODgwNEI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwODgwNkI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwODgwOEI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwODgwQ0I4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwODgwRUI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwODgwMUI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwODgwNUI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwODgwN0I4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwODgwOUI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwODgwREI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwODgwRkI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwODgwMEJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwODgwNEJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwODgwNkJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwODgwOEJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwODgwQ0JDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwODgwRUJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwODgwMUJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwODgwNUJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwODgwN0JDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwODgwOUJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwODgwREJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwODgwRkJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hZGRpIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZGkuczogYWRkaSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZGkucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBCNEE2MDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQjRBNjIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEI0QTY0MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBCNEE2NjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQjRBNjgwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEI0QTZBMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBCNEE2QzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQjRBNkUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEI0QTYxMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBCNEE2MzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggQjRBNjUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEI0QTY3MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBCNEE2OTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgQjRBNkIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEI0QTZEMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBCNEE2RjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgQjRBNjA4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEI0QTYyOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBCNEE2NDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgQjRBNjY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEI0QTY4OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBCNEE2QThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggQjRBNkM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEI0QTZFOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBCNEE2MThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgQjRBNjM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEI0QTY1OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBCNEE2NzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgQjRBNjk4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEI0QTZCOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBCNEE2RDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgQjRBNkY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEIwQTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBCMEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggQjBBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEIwQTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBCMEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgQjBBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEIwQTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBCMEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgQjBBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEIwQTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBCMEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgQjBBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEIwQTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBCMEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggQjBBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEIwQTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBCMEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgQjBBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEIwQTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyBCMEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgQjBBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEIwQTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCBCMEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgQjBBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEIwQTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBCMEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggQjBBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEIwQTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCBCMEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgQjBBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEIwQTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBCMEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViaSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdWJpLnM6IHN1YmkgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWJpLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOTRBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDk0QTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA5NEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgOTRBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDk0QTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCA5NEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggOTRBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDk0QTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCA5NEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgOTRBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDk0QTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyA5NEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgOTRBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDk0QTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCA5NEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgOTRBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDk0QTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCA5NEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggOTRBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDk0QTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCA5NEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgOTRBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDk0QTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyA5NEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgOTRBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDk0QTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCA5NEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgOTRBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDk0QTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCA5NEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggOTRBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDk0QTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGlmdC5zOiBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoaWZ0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDBBNDAwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDBBNDIwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDBBNDQwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDBBNDYwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDBBNDgwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDBBNEEwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDBBNEMwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDBBNEUwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDBBNDBCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDBBNDJCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDBBNDRCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDBBNDZCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDBBNDhCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDBBNEFCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDBBNENCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDBBNEVCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0cmFjdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRyYWN0LnM6IGV4dHJhY3QgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRyYWN0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDA4NjE4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDA4NjM4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDA4NjU4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDA4Njc4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDA4Njk4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDA4NkI4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDA4NkQ4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDA4NkY4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDA4NjFDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDA4NjNDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDA4NjVDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDA4NjdDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDA4NjlDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDA4NkJDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDA4NkRDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDA4NkZDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDA4NjEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDA4NjMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDA4NjUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDA4NjcwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDA4NjkwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDA4NkIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDA4NkQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDA4NkYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDA4NjE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDA4NjM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDA4NjU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDA4Njc0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDA4Njk0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDA4NkI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDA4NkQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDA4NkY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGVwb3NpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZXBvc2l0LnM6IGRlcG9zaXQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZXBvc2l0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDRDNDBCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDRDNDJCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDRDNDRCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDRDNDZCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDRDNDhCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDRDNEFCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDRDNENCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDRDNEVCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDRDNDBGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDRDNDJGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDRDNDRGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDRDNDZGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDRDNDhGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDRDNEFGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDRDNENGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDRDNEVGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDRDNDAwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDRDNDIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDRDNDQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDRDNDYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDRDNDgwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDRDNEEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDRDNEMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDRDNEUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDRDNDA0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDRDNDI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDRDNDQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDRDNDY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDRDNDg0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDRDNEE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDRDNEM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDRDNEU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRDRERjE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRDRERjM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggRDRERjU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRDRERjc0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRDRERjk0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgRDRERkI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRDRERkQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRDRERkY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgRDRERjEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRDRERjMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRDRERjUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgRDRERjcwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRDRERjkwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRDRERkIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggRDRERkQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRDRERkYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRDRERjFGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgRDRERjNGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRDRERjVGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRDRERjdGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgRDRERjlGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRDRERkJGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRDRERkRGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgRDRERkZGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRDRERjFCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgRDRERjNCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggRDRERjVCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRDRERjdCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRDRERjlCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgRDRERkJCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRDRERkRCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRDRERkZCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3lzdGVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN5c3RlbS5zOiBzeXN0ZW0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzeXN0ZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAxODAwNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMEMwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwMDAwMENBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwMDA1MEQ2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwMDA1MEU2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwMDA0MTg2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwMEEwMTBBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwMDA0MTgyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwMTQ0MTg0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwMDAwMDRBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwMTQwMDhBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwMDAwMDQwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwMDEwMDQwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAxNDAwMDREMlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwNEE2MTE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwNEExMzE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwNEE2MTFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwNEExMzFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwNEE0MTM0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwNEE0MTM2NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwNEE0MTMwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwNEE0MTMyNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwNEE0MTMwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwNEE0MTA0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwNEE0MjA0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwNEE0MTAwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwNEE0MjAwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19wdXJnZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXJnZS5zOiBwdXJnZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInB1cmdlLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDRBNDEyMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDRBNDEyMjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDRBNDIyMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDRBNDIyMjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDRBNDEyNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDRBNDEyNjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDRBNDIyNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDRBNDIyNjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDRBNDEzODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDRBNDEzQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDRBNDEyODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDRBNDEyQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDRBNDIyODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDRBNDIyQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDRBNDEyQzBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDRBNDEyRTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDRBNDIyQzBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDRBNDIyRTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCi0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX21pc2MuczogZnBfbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX21pc2MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDAwMjQyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZtZW0uczogZm1lbSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZtZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNEE0MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjRBNDIwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI0QTQwMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyNEE0MjAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkNBNDAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJDQTQyMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyQ0E0MDAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMkNBNDIwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI0QTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyNEE0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMjRBNDAyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDI0QTQyMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyQ0E0MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMkNBNDIyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDJDQTQwMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyQ0E0MjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgM0NBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDNDQTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzQ0E0MDIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgM0NBNDIyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDI0QTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyNEEwMzAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMjRBMDEwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDJDQTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyQ0EwMzAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMkNBMDEwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDI0QTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyNEEwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMjRBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDJDQTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAyQ0EwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMkNBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDNDQTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzQ0EwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggM0NBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTM1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX2NvbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnBfY29tcC5zOiBmcF9jb21wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfY29tcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwQTA0MDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMEEwNDgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzBBMDU4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDMyODA0MDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAzMjgwNDgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMzBBMDYwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDMwQTA2ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAzMEEwNzgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMzI4MDYwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDMyODA2ODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAzMEEwODAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMzBBMDg4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDMwQTA5ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAzMjgwODAxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMzI4MDg4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDMwQTBBMDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzMEEwQTgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMzBBMEI4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDMyODBBMDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzMjgwQTgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMzA4ODA2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDMwODgwRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAzMDg4MUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMzI5ODA2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDMyOTgwRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAzMjk4MUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMzA4ODI2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDMwODgyRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAzMDg4M0UwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMzI5ODI2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDMyOTgyRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAzMjk4M0UxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMzA4ODQ2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDMwODg0RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzMDg4NUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMzI5ODQ2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDMyOTg0RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAzMjk4NUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMzA4ODY2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDMwODg2RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAzMDg4N0UwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMzI5ODY2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDMyOTg2RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAzMjk4N0UxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMzA4ODg2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDMwODg4RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAzMDg4OUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMzI5ODg2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDMyOTg4RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAzMjk4OUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMTgwMTIwRTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDFBMTFBNEQyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCA5ODAxMjBFMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgOUExMUE0RDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDM4ODU0NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01NV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9jb252IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2NvbnYuczogZnBfY29udiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2NvbnYucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMEEwMDIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzBBMDIyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwQTA2MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMEEwMEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMzBBMDJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDMwQTA2QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMEEwMUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMzBBMDNBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDMwQTA3QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMjgwMDIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzI4MDIyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDMyODA2MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMjgwMEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzI4MDJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDMyODA2QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMjgwMUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMzI4MDNBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDMyODA3QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMEEwODIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMzBBMEEyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDMwQTBFMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMEEwOEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMzBBMEFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDMwQTBFQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMEEwOUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMzBBMEJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDMwQTBGQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMjgwODIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMzI4MEEyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDMyODBFMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMjgwOEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMzI4MEFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDMyODBFQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMjgwOUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMzI4MEJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDMyODBGQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMEExMDIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMzBBMTIyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDMwQTE2MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMEExMEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMzBBMTJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDMwQTE2QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMEExMUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMzBBMTNBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDMwQTE3QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMjgxMDIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMzI4MTIyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDMyODE2MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMjgxMEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMzI4MTJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDMyODE2QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAzMjgxMUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMzI4MTNBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDMyODE3QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzMEExODIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMzBBMUEyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDMwQTFFMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAzMEExOEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMzBBMUFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDMwQTFFQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAzMEExOUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMzBBMUJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDMwQTFGQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAzMjgxODIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMzI4MUEyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDMyODFFMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAzMjgxOEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMzI4MUFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDMyODFFQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAzMjgxOUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMzI4MUJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDMyODFGQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT03Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9mY21wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2ZjbXAuczogZnBfZmNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2ZjbXAucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDg1MDQwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMDg1MDQwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMDg1MDQwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMDg1MDQwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAzMDg1MDQwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMDg1MDQwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMDg1MDQwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAzMDg1MDQwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMDg1MDQwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMDg1MDQwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAzMDg1MDQwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMDg1MDQwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMDg1MDQwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAzMDg1MDQwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMDg1MDQwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMDg1MDQwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzMDg1MDQxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMDg1MDQxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMDg1MDQxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzMDg1MDQxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMDg1MDQxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMDg1MDQxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAzMDg1MDQxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMDg1MDQxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMDg1MDQxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAzMDg1MDQxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMDg1MDQxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMDg1MDQxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAzMDg1MDQxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMDg1MDQxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMDg1MDQxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAzMDg1MDQxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMDg1MEMwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMDg1MEMwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzMDg1MEMwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMDg1MEMwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMDg1MEMwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAzMDg1MEMwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMDg1MEMwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMDg1MEMwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAzMDg1MEMwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMDg1MEMwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMDg1MEMwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAzMDg1MEMwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMDg1MEMwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMDg1MEMwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAzMDg1MEMwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMDg1MEMwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMDg1MEMxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAzMDg1MEMxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAzMDg1MEMxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAzMDg1MEMxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAzMDg1MEMxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAzMDg1MEMxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzMDg1MEMxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAzMDg1MEMxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAzMDg1MEMxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAzMDg1MEMxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAzMDg1MEMxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAzMDg1MEMxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAzMDg1MEMxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAzMDg1MEMxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAzMDg1MEMxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAzMDg1MEMxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAzMDg1MUMwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAzMDg1MUMwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAzMDg1MUMwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAzMDg1MUMwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAzMDg1MUMwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAzMDg1MUMwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAzMDg1MUMwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAzMDg1MUMwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAzMDg1MUMwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAzMDg1MUMwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAzMDg1MUMwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAzMDg1MUMwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAzMDg1MUMwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAzMDg1MUMwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAzMDg1MUMwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAzMDg1MUMwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCAzMDg1MUMxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAzMDg1MUMxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAzMDg1MUMxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyAzMDg1MUMxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAzMDg1MUMxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAzMDg1MUMxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCAzMDg1MUMxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAzMDg1MUMxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAzMDg1MUMxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCAzMDg1MUMxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAzMDg1MUMxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAzMDg1MUMxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCAzMDg1MUMxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAzMDg1MUMxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAzMDg1MUMxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyAzMDg1MUMxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05Nl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zcGVjaWFsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNwZWNpYWwuczogc3BlY2lhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNwZWNpYWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwNEE0MTY4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDRBNDE2QTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA0QTQxQTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwNEE0MUFBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zcG9wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNwb3Auczogc3BvcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICAjIFRoaXMgdGlja2xlcyBhIGJ1ZyBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzZXIuCi0gICAgZ2FzX3N0YXJ0ICJzcG9wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMTAwMDAxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDEwMDAxOTEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAxMDAwMDEyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMTAwMDE5MzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDEwMDAyQjA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAxMDAzOUIwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMTAwMDJCMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDEwMDM5QjI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAxMEEwMDUwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMTBBMDFEMTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDEwQTAwNTI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAxMEEwMUQzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMTBDNTA3MDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDEwQzUxRjEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAxMEM1MDcyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMTBDNTFGMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2NvcHIge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29wci5zOiBjb3ByIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29wci5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwMDAwMTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMDAwMDcxM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzAwMDAxMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDMwMDAwNzMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2NvcHJtZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29wcm1lbS5zOiBjb3ByIG1lbW9yeSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvcHJtZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNDg1MDExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjQ4NTIxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI0ODUwMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyNDg1MjEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkM4NTAxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJDODUyMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyQzg1MDEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMkM4NTIxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI0ODUwMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyNDg1MjMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMjQ4NTAzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDI0ODUyMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyQzg1MDMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMkM4NTIzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDJDODUwMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyQzg1MjMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMjQ4MDExMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDI0ODAzMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAyNDgwMTEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMkM4MDExMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDJDODAzMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyQzgwMTEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMjQ4MDEzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDI0ODAzMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyNDgwMTMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMkM4MDEzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDJDODAzMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyQzgwMTMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZm1lbV9MUl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmbWVtTFJidWcuczogTFIgcmVnaXN0ZXIgc2VsZWN0aW9uIG9uIGZwIG1lbSBpbnN0cnVjdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmbWVtTFJidWcucyIgIi1hbCIKLQotICAgICMgTWFrZSBzdXJlIHdlIGNvcnJlY3RseSBoYW5kbGUgZmllbGQgc2VsZWN0b3JzLiAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjc0MDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDI3NDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyNzUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMkY0MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDJGNDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAyRjUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMjc0MDEwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDI3NDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAyNzUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMkY0MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDJGNDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAyRjUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMjc0MDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDI3NDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAyNzUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMkY0MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDJGNDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAyRjUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMjc0MDEwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDI3NDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAyNzUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMkY0MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDJGNDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAyRjUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMjc1OTAyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAyNzU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMjc1OTAwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAyNzU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMjc1OTAyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAyNzU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMjc1OTAwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAyNzU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRTg0MEMwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzZXIuCi0gICAgZG9faW1lbQotICAgIGRvX2ltbWVkCi0gICAgZG9fYnJhbmNoCi0gICAgZG9fYWRkCi0gICAgZG9fc2gxYWRkCi0gICAgZG9fc2gyYWRkCi0gICAgZG9fc2gzYWRkCi0gICAgZG9fc3ViCi0gICAgZG9fZHMKLSAgICBkb19jb21jbHIKLSAgICBkb19sb2dpY2FsCi0gICAgZG9fdW5pdAotICAgIGRvX2Rjb3IKLSAgICBkb19hZGRpCi0gICAgZG9fc3ViaQotICAgIGRvX3NoaWZ0Ci0gICAgZG9fZXh0cmFjdAotICAgIGRvX2RlcG9zaXQKLSAgICBkb19zeXN0ZW0KLSAgICBkb19wdXJnZQotICAgIGRvX2ZwX21pc2MKLSAgICBkb19mbWVtCi0gICAgZG9fZnBfY29tcAotICAgIGRvX2ZwX2NvbnYKLSAgICBkb19mcF9mY21wCi0gICAgZG9fc3BlY2lhbAotICAgIGRvX3Nwb3AKLSAgICBkb19jb3ByCi0gICAgZG9fY29wcm1lbQotCi0gICAgIyBUaGUgIndlaXJkLnMiIGZpbGUgZnJvbSB0aGUgZ2RiIHRlc3RzdWl0ZS4gIFNpbXBseSB2ZXJpZnkgaXQKLSAgICAjIGFzc2VtYmxlcy4KLSAgICBnYXNfdGVzdCAid2VpcmQucyIgIiIgIiIgInN0YWJzIHBhcnNpbmciCi0KLSAgICAjIFRlc3QgdGhhdCB3ZSBjb3JyZWN0bHkgYXNzZW1ibGUgc29tZSBGUCBtZW1vcnkgdGVzdHMgd2hpY2gKLSAgICAjIEwvUiByZWdpc3RlciBzZWxlY3RzLiAgKFJlZ3Jlc3Npb24gdGVzdCBmb3IgYSBidWcgVGVnZSBmb3VuZCkuCi0gICAgZG9fZm1lbV9MUl90ZXN0cwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjgzOWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucworKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgTW9yZSBicmFuY2hpbmcgaW5zdHJ1Y3Rpb25zIHRoYW4geW91IGV2ZXIga25ldyB3aGF0IHRvIGRvIHdpdGguCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWJyYW5jaF90ZXN0czogCi0JYmwgYnJhbmNoX3Rlc3RzLCVyMgotCWJsLG4gYnJhbmNoX3Rlc3RzLCVyMgotCWIgYnJhbmNoX3Rlc3RzCi0JYixuIGJyYW5jaF90ZXN0cwotCWdhdGUgYnJhbmNoX3Rlc3RzLCVyMgotCWdhdGUsbiBicmFuY2hfdGVzdHMsJXIyCi0JYmxyICVyNCwlcjIKLQlibHIsbiAlcjQsJXIyCi0JYmxyICVyNCwlcjAKLQlibHIsbiAlcjQsJXIwCi0JYnYgJXIwKCVyMikKLQlidixuICVyMCglcjIpCi0JYmUgMHgxMjM0KCVzcjEsJXIyKQotCWJlLG4gMHgxMjM0KCVzcjEsJXIyKQotCWJsZSAweDEyMzQoJXNyMSwlcjIpCi0JYmxlLG4gMHgxMjM0KCVzcjEsJXIyKQotCi1tb3ZiX3Rlc3RzOiAKLQltb3ZiICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD0gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPCAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixvZCAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yix0ciAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8PiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw+PSAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixldiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi1tb3ZiX251bGxpZmllZF90ZXN0czogCi0JbW92YixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD0sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsb2QsbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yix0cixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDw+LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPj0sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixldixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQotbW92aWJfdGVzdHM6IAotCW1vdmliIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD0gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPCA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixvZCA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYix0ciA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8PiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw+PSA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixldiA1LCVyMjYsbW92aWJfdGVzdHMKLW1vdmliX251bGxpZmllZF90ZXN0czogCi0JbW92aWIsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw9LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPCxuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLG9kLG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsdHIsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8PixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD49LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsZXYsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQotY29tYl90ZXN0czogCi0JY29tYiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PCAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHN2ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsb2QgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYix0ciAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw+ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj49ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixuc3YgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixldiAlcjAsJXI0LGNvbWJfdGVzdHMKLWNvbWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQljb21iLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDwsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG9kLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYix0cixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD49LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+Pj0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4+LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixuc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLGV2LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0KLWNvbWliX3Rlc3RzOiAKLQljb21pYiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDwgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDw9IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsc3YgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixvZCAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLHRyIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+Pj0gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG5zdiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLGV2IDAsJXI0LGNvbWJfdGVzdHMKLQotY29taWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQljb21pYixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPCxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PD0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLHN2LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixvZCxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsdHIsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPj49LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsbnN2LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixldixuIDAsJXI0LGNvbWliX3Rlc3RzCi0KLQotCi1hZGRiX3Rlc3RzOiAKLQlhZGRiICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDwgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8PSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG51diAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHpudiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHN2ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsb2QgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix0ciAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw+ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPj0gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdXYgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix2bnogJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixuc3YgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixldiAlcjEsJXI0LGFkZGJfdGVzdHMKLWFkZGJfbnVsbGlmaWVkX3Rlc3RzOiAKLQlhZGRiLG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw9LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8PSxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnV2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix6bnYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHN2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixvZCxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdHIsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw+LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+PSxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdXYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHZueixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnN2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixldixuICVyMSwlcjQsYWRkYl90ZXN0cwotCi1hZGRpYl90ZXN0czogCi0JYWRkaWIgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPSAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDw9IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG51diAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix6bnYgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsc3YgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsb2QgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdHIgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPj0gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix1diAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix2bnogLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnN2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLGV2IC0xLCVyNCxjb21iX3Rlc3RzCi0KLWFkZGliX251bGxpZmllZF90ZXN0czogCi0JYWRkaWIsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPCxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsem52LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsc3YsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixvZCxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHRyLG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD4sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+PSxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD4sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix1dixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHZueixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG5zdixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLGV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0KLQotOyBOZWVkcyB0byBjaGVjayBsb3RzIG9mIHN0dWZmIChsaWtlIGNvcm5lciBiaXQgY2FzZXMpCi1iYl90ZXN0czogCi0JYnZiLDwgJXI0LGJiX3Rlc3RzCi0JYnZiLD49ICVyNCxiYl90ZXN0cwotCWJ2Yiw8LG4gJXI0LGJiX3Rlc3RzCi0JYnZiLD49LG4gJXI0LGJiX3Rlc3RzCi0JYmIsPCAlcjQsNSxiYl90ZXN0cwotCWJiLD49ICVyNCw1LGJiX3Rlc3RzCi0JYmIsPCxuICVyNCw1LGJiX3Rlc3RzCi0JYmIsPj0sbiAlcjQsNSxiYl90ZXN0cwotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29tY2xyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTVhYTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWNvbWNsciAlcjQsJXI1LCVyNgotCWNvbWNsciw9ICVyNCwlcjUsJXI2Ci0JY29tY2xyLDwgJXI0LCVyNSwlcjYKLQljb21jbHIsPD0gJXI0LCVyNSwlcjYKLQljb21jbHIsPDwgJXI0LCVyNSwlcjYKLQljb21jbHIsPDw9ICVyNCwlcjUsJXI2Ci0JY29tY2xyLHN2ICVyNCwlcjUsJXI2Ci0JY29tY2xyLG9kICVyNCwlcjUsJXI2Ci0JY29tY2xyLHRyICVyNCwlcjUsJXI2Ci0JY29tY2xyLDw+ICVyNCwlcjUsJXI2Ci0JY29tY2xyLD49ICVyNCwlcjUsJXI2Ci0JY29tY2xyLD4gJXI0LCVyNSwlcjYKLQljb21jbHIsPj49ICVyNCwlcjUsJXI2Ci0JY29tY2xyLD4+ICVyNCwlcjUsJXI2Ci0JY29tY2xyLG5zdiAlcjQsJXI1LCVyNgotCWNvbWNscixldiAlcjQsJXI1LCVyNgotCi0JY29taWNsciAxMjMsJXI1LCVyNgotCWNvbWljbHIsPSAxMjMsJXI1LCVyNgotCWNvbWljbHIsPCAxMjMsJXI1LCVyNgotCWNvbWljbHIsPD0gMTIzLCVyNSwlcjYKLQljb21pY2xyLDw8IDEyMywlcjUsJXI2Ci0JY29taWNsciw8PD0gMTIzLCVyNSwlcjYKLQljb21pY2xyLHN2IDEyMywlcjUsJXI2Ci0JY29taWNscixvZCAxMjMsJXI1LCVyNgotCWNvbWljbHIsdHIgMTIzLCVyNSwlcjYKLQljb21pY2xyLDw+IDEyMywlcjUsJXI2Ci0JY29taWNsciw+PSAxMjMsJXI1LCVyNgotCWNvbWljbHIsPiAxMjMsJXI1LCVyNgotCWNvbWljbHIsPj49IDEyMywlcjUsJXI2Ci0JY29taWNsciw+PiAxMjMsJXI1LCVyNgotCWNvbWljbHIsbnN2IDEyMywlcjUsJXI2Ci0JY29taWNscixldiAxMjMsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2NiNmEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWNvcHJfdGVzdHM6IAotCWNvcHIsNCw1Ci0JY29wciw0LDExNQotCWNvcHIsNCw1LG4KLQljb3ByLDQsMTE1LG4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmYxNTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgY29wciBtZW1vcnkgdGVzdHMgd2hpY2ggYWxzbyB0ZXN0IHRoZSB2YXJpb3VzIAotOyBhZGRyZXNzaW5nIG1vZGVzIGFuZCBjb21wbGV0ZXJzLgotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi07IAotY29wcl9pbmRleGluZ19sb2FkIAotCi0JY2xkd3gsNCAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGR3eCw0LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3gsNCxtICVyNSglc3IwLCVyNCksJXIyNgotCWNsZHd4LDQsc20gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCxtICVyNSglc3IwLCVyNCksJXIyNgotCWNsZGR4LDQsc20gJXI1KCVzcjAsJXI0KSwlcjI2Ci0KLWNvcHJfaW5kZXhpbmdfc3RvcmUgCi0JY3N0d3gsNCAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3R3eCw0LHMgJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0d3gsNCxtICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdHd4LDQsc20gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0LHMgJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCxtICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdGR4LDQsc20gJXIyNiwlcjUoJXNyMCwlcjQpCi0KLWNvcHJfc2hvcnRfbWVtb3J5IAotCWNsZHdzLDQgMCglc3IwLCVyNCksJXIyNgotCWNsZHdzLDQsbWIgMCglc3IwLCVyNCksJXIyNgotCWNsZHdzLDQsbWEgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQsbWIgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQsbWEgMCglc3IwLCVyNCksJXIyNgotCWNzdHdzLDQgJXIyNiwwKCVzcjAsJXI0KQotCWNzdHdzLDQsbWIgJXIyNiwwKCVzcjAsJXI0KQotCWNzdHdzLDQsbWEgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQsbWIgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQsbWEgJXIyNiwwKCVzcjAsJXI0KQotCi07IGdhcyBmdWNrcyB0aGlzIHVwIHRoaW5rcyBpdCBnZXRzIHRoZSBleHByZXNzaW9uIDQgbW9kdWxvIDUKLTsJY2xkd3gsNCAlcjUoMCwlcjQpLCVyJXIyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kY29yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3NDU1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWRjb3IgJXI0LCVyNQotCWRjb3Isc2J6ICVyNCwlcjUKLQlkY29yLHNoeiAlcjQsJXI1Ci0JZGNvcixzZGMgJXI0LCVyNQotCWRjb3Isc2JjICVyNCwlcjUKLQlkY29yLHNoYyAlcjQsJXI1Ci0JZGNvcix0ciAlcjQsJXI1Ci0JZGNvcixuYnogJXI0LCVyNQotCWRjb3Isbmh6ICVyNCwlcjUKLQlkY29yLG5kYyAlcjQsJXI1Ci0JZGNvcixuYmMgJXI0LCVyNQotCWRjb3IsbmhjICVyNCwlcjUKLQotCWlkY29yICVyNCwlcjUKLQlpZGNvcixzYnogJXI0LCVyNQotCWlkY29yLHNoeiAlcjQsJXI1Ci0JaWRjb3Isc2RjICVyNCwlcjUKLQlpZGNvcixzYmMgJXI0LCVyNQotCWlkY29yLHNoYyAlcjQsJXI1Ci0JaWRjb3IsdHIgJXI0LCVyNQotCWlkY29yLG5ieiAlcjQsJXI1Ci0JaWRjb3Isbmh6ICVyNCwlcjUKLQlpZGNvcixuZGMgJXI0LCVyNQotCWlkY29yLG5iYyAlcjQsJXI1Ci0JaWRjb3IsbmhjICVyNCwlcjUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODUzYjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQl6ZGVwICVyNCw1LDEwLCVyNgotCXpkZXAsPSAlcjQsNSwxMCwlcjYKLQl6ZGVwLDwgJXI0LDUsMTAsJXI2Ci0JemRlcCxvZCAlcjQsNSwxMCwlcjYKLQl6ZGVwLHRyICVyNCw1LDEwLCVyNgotCXpkZXAsPD4gJXI0LDUsMTAsJXI2Ci0JemRlcCw+PSAlcjQsNSwxMCwlcjYKLQl6ZGVwLGV2ICVyNCw1LDEwLCVyNgotCi0JZGVwICVyNCw1LDEwLCVyNgotCWRlcCw9ICVyNCw1LDEwLCVyNgotCWRlcCw8ICVyNCw1LDEwLCVyNgotCWRlcCxvZCAlcjQsNSwxMCwlcjYKLQlkZXAsdHIgJXI0LDUsMTAsJXI2Ci0JZGVwLDw+ICVyNCw1LDEwLCVyNgotCWRlcCw+PSAlcjQsNSwxMCwlcjYKLQlkZXAsZXYgJXI0LDUsMTAsJXI2Ci0KLQl6dmRlcCAlcjQsNSwlcjYKLQl6dmRlcCw9ICVyNCw1LCVyNgotCXp2ZGVwLDwgJXI0LDUsJXI2Ci0JenZkZXAsb2QgJXI0LDUsJXI2Ci0JenZkZXAsdHIgJXI0LDUsJXI2Ci0JenZkZXAsPD4gJXI0LDUsJXI2Ci0JenZkZXAsPj0gJXI0LDUsJXI2Ci0JenZkZXAsZXYgJXI0LDUsJXI2Ci0KLQl2ZGVwICVyNCw1LCVyNgotCXZkZXAsPSAlcjQsNSwlcjYKLQl2ZGVwLDwgJXI0LDUsJXI2Ci0JdmRlcCxvZCAlcjQsNSwlcjYKLQl2ZGVwLHRyICVyNCw1LCVyNgotCXZkZXAsPD4gJXI0LDUsJXI2Ci0JdmRlcCw+PSAlcjQsNSwlcjYKLQl2ZGVwLGV2ICVyNCw1LCVyNgotCi0JdmRlcGkgLTEsNSwlcjYKLQl2ZGVwaSw9IC0xLDUsJXI2Ci0JdmRlcGksPCAtMSw1LCVyNgotCXZkZXBpLG9kIC0xLDUsJXI2Ci0JdmRlcGksdHIgLTEsNSwlcjYKLQl2ZGVwaSw8PiAtMSw1LCVyNgotCXZkZXBpLD49IC0xLDUsJXI2Ci0JdmRlcGksZXYgLTEsNSwlcjYKLQotCXp2ZGVwaSAtMSw1LCVyNgotCXp2ZGVwaSw9IC0xLDUsJXI2Ci0JenZkZXBpLDwgLTEsNSwlcjYKLQl6dmRlcGksb2QgLTEsNSwlcjYKLQl6dmRlcGksdHIgLTEsNSwlcjYKLQl6dmRlcGksPD4gLTEsNSwlcjYKLQl6dmRlcGksPj0gLTEsNSwlcjYKLQl6dmRlcGksZXYgLTEsNSwlcjYKLQotCWRlcGkgLTEsNCwxMCwlcjYKLQlkZXBpLD0gLTEsNCwxMCwlcjYKLQlkZXBpLDwgLTEsNCwxMCwlcjYKLQlkZXBpLG9kIC0xLDQsMTAsJXI2Ci0JZGVwaSx0ciAtMSw0LDEwLCVyNgotCWRlcGksPD4gLTEsNCwxMCwlcjYKLQlkZXBpLD49IC0xLDQsMTAsJXI2Ci0JZGVwaSxldiAtMSw0LDEwLCVyNgotCi0JemRlcGkgLTEsNCwxMCwlcjYKLQl6ZGVwaSw9IC0xLDQsMTAsJXI2Ci0JemRlcGksPCAtMSw0LDEwLCVyNgotCXpkZXBpLG9kIC0xLDQsMTAsJXI2Ci0JemRlcGksdHIgLTEsNCwxMCwlcjYKLQl6ZGVwaSw8PiAtMSw0LDEwLCVyNgotCXpkZXBpLD49IC0xLDQsMTAsJXI2Ci0JemRlcGksZXYgLTEsNCwxMCwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODMxZTI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZHMucworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWRzICVyNCwlcjUsJXI2Ci0JZHMsPSAlcjQsJXI1LCVyNgotCWRzLDwgJXI0LCVyNSwlcjYKLQlkcyw8PSAlcjQsJXI1LCVyNgotCWRzLDw8ICVyNCwlcjUsJXI2Ci0JZHMsPDw9ICVyNCwlcjUsJXI2Ci0JZHMsc3YgJXI0LCVyNSwlcjYKLQlkcyxvZCAlcjQsJXI1LCVyNgotCWRzLHRyICVyNCwlcjUsJXI2Ci0JZHMsPD4gJXI0LCVyNSwlcjYKLQlkcyw+PSAlcjQsJXI1LCVyNgotCWRzLD4gJXI0LCVyNSwlcjYKLQlkcyw+Pj0gJXI0LCVyNSwlcjYKLQlkcyw+PiAlcjQsJXI1LCVyNgotCWRzLG5zdiAlcjQsJXI1LCVyNgotCWRzLGV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTAzMGY0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZXh0cnUgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPSAlcjQsNSwxMCwlcjYKLQlleHRydSw8ICVyNCw1LDEwLCVyNgotCWV4dHJ1LG9kICVyNCw1LDEwLCVyNgotCWV4dHJ1LHRyICVyNCw1LDEwLCVyNgotCWV4dHJ1LDw+ICVyNCw1LDEwLCVyNgotCWV4dHJ1LD49ICVyNCw1LDEwLCVyNgotCWV4dHJ1LGV2ICVyNCw1LDEwLCVyNgotCi0JZXh0cnMgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPSAlcjQsNSwxMCwlcjYKLQlleHRycyw8ICVyNCw1LDEwLCVyNgotCWV4dHJzLG9kICVyNCw1LDEwLCVyNgotCWV4dHJzLHRyICVyNCw1LDEwLCVyNgotCWV4dHJzLDw+ICVyNCw1LDEwLCVyNgotCWV4dHJzLD49ICVyNCw1LDEwLCVyNgotCWV4dHJzLGV2ICVyNCw1LDEwLCVyNgotCi0JdmV4dHJ1ICVyNCw1LCVyNgotCXZleHRydSw9ICVyNCw1LCVyNgotCXZleHRydSw8ICVyNCw1LCVyNgotCXZleHRydSxvZCAlcjQsNSwlcjYKLQl2ZXh0cnUsdHIgJXI0LDUsJXI2Ci0JdmV4dHJ1LDw+ICVyNCw1LCVyNgotCXZleHRydSw+PSAlcjQsNSwlcjYKLQl2ZXh0cnUsZXYgJXI0LDUsJXI2Ci0KLQl2ZXh0cnMgJXI0LDUsJXI2Ci0JdmV4dHJzLD0gJXI0LDUsJXI2Ci0JdmV4dHJzLDwgJXI0LDUsJXI2Ci0JdmV4dHJzLG9kICVyNCw1LCVyNgotCXZleHRycyx0ciAlcjQsNSwlcjYKLQl2ZXh0cnMsPD4gJXI0LDUsJXI2Ci0JdmV4dHJzLD49ICVyNCw1LCVyNgotCXZleHRycyxldiAlcjQsNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MzBiNDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmbGR3eCAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGR3eCxzICVyNCglc3IwLCVyNSksJWZyNgotCWZsZHd4LG0gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3gsc20gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHggJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHgscyAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCxtICVyNCglc3IwLCVyNSksJWZyNgotCWZsZGR4LHNtICVyNCglc3IwLCVyNSksJWZyNgotCWZzdHd4ICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHd4LHMgJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0d3gsbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3R3eCxzbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCxzICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4LG0gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0ZHgsc20gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXggJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXgscyAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCxtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHF4LHNtICVmcjYsJXI0KCVzcjAsJXI1KQotCi0JZmxkd3MgMCglc3IwLCVyNSksJWZyNgotCWZsZHdzLG1iIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGR3cyxtYSAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHMgMCglc3IwLCVyNSksJWZyNgotCWZsZGRzLG1iIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGRkcyxtYSAwKCVzcjAsJXI1KSwlZnI2Ci0JZnN0d3MgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHdzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3R3cyxtYSAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0ZHMgJWZyNiwwKCVzcjAsJXI1KQotCWZzdGRzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3RkcyxtYSAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0cXMgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHFzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3RxcyxtYSAlZnI2LDAoJXNyMCwlcjUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzMzBiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotCS5jb2RlCi0JLmV4cG9ydAkJZgotZgotCS5wcm9jCi0JLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKLQkuZW50cnkKLQotCWZzdHdzCQklZnI2UiwwKCVyMjYpCi0JZnN0d3MJCSVmcjZMLDQoJXIyNikKLQlmc3R3cwkJJWZyNiw4KCVyMjYpCi0KLQlmc3RkcwkJJWZyNlIsMCglcjI2KQotCWZzdGRzCQklZnI2TCw0KCVyMjYpCi0JZnN0ZHMJCSVmcjYsOCglcjI2KQotCi0JZmxkd3MJCTAoJXIyNiksJWZyNlIKLQlmbGR3cwkJNCglcjI2KSwlZnI2TAotCWZsZHdzCQk4KCVyMjYpLCVmcjYKLQotCWZsZGRzCQkwKCVyMjYpLCVmcjZSCi0JZmxkZHMJCTQoJXIyNiksJWZyNkwKLQlmbGRkcwkJOCglcjI2KSwlZnI2Ci0KLQlmc3R3cwkJJWZyNlIsMCglc3IwLCVyMjYpCi0JZnN0d3MJCSVmcjZMLDQoJXNyMCwlcjI2KQotCWZzdHdzCQklZnI2LDgoJXNyMCwlcjI2KQotCi0JZnN0ZHMJCSVmcjZSLDAoJXNyMCwlcjI2KQotCWZzdGRzCQklZnI2TCw0KCVzcjAsJXIyNikKLQlmc3RkcwkJJWZyNiw4KCVzcjAsJXIyNikKLQotCWZsZHdzCQkwKCVzcjAsJXIyNiksJWZyNlIKLQlmbGR3cwkJNCglc3IwLCVyMjYpLCVmcjZMCi0JZmxkd3MJCTgoJXNyMCwlcjI2KSwlZnI2Ci0KLQlmbGRkcwkJMCglc3IwLCVyMjYpLCVmcjZSCi0JZmxkZHMJCTQoJXNyMCwlcjI2KSwlZnI2TAotCWZsZGRzCQk4KCVzcjAsJXIyNiksJWZyNgotCi0JZnN0d3gJCSVmcjZSLCVyMjUoJXIyNikKLQlmc3R3eAkJJWZyNkwsJXIyNSglcjI2KQotCWZzdHd4CQklZnI2LCVyMjUoJXIyNikKLQotCWZzdGR4CQklZnI2UiwlcjI1KCVyMjYpCi0JZnN0ZHgJCSVmcjZMLCVyMjUoJXIyNikKLQlmc3RkeAkJJWZyNiwlcjI1KCVyMjYpCi0KLQlmbGR3eAkJJXIyNSglcjI2KSwlZnI2UgotCWZsZHd4CQklcjI1KCVyMjYpLCVmcjZMCi0JZmxkd3gJCSVyMjUoJXIyNiksJWZyNgotCi0JZmxkZHgJCSVyMjUoJXIyNiksJWZyNlIKLQlmbGRkeAkJJXIyNSglcjI2KSwlZnI2TAotCWZsZGR4CQklcjI1KCVyMjYpLCVmcjYKLQotCWZzdHd4CQklZnI2UiwlcjI1KCVzcjAsJXIyNikKLQlmc3R3eAkJJWZyNkwsJXIyNSglc3IwLCVyMjYpCi0JZnN0d3gJCSVmcjYsJXIyNSglc3IwLCVyMjYpCi0KLQlmc3RkeAkJJWZyNlIsJXIyNSglc3IwLCVyMjYpCi0JZnN0ZHgJCSVmcjZMLCVyMjUoJXNyMCwlcjI2KQotCWZzdGR4CQklZnI2LCVyMjUoJXNyMCwlcjI2KQotCi0JZmxkd3gJCSVyMjUoJXNyMCwlcjI2KSwlZnI2UgotCWZsZHd4CQklcjI1KCVzcjAsJXIyNiksJWZyNkwKLQlmbGR3eAkJJXIyNSglc3IwLCVyMjYpLCVmcjYKLQotCWZsZGR4CQklcjI1KCVzcjAsJXIyNiksJWZyNlIKLQlmbGRkeAkJJXIyNSglc3IwLCVyMjYpLCVmcjZMCi0JZmxkZHgJCSVyMjUoJXNyMCwlcjI2KSwlZnI2Ci0KLQlidgkJJXIwKCVyMikKLQlub3AKLQotCS5leGl0Ci0JLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29tcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDE3ZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY3B5LHNnbCAlZnI1LCVmcjEwCi0JZmNweSxkYmwgJWZyNSwlZnIxMAotCWZjcHkscXVhZCAlZnI1LCVmcjEwCi0JZmNweSxzZ2wgJWZyMjAsJWZyMjQKLQlmY3B5LGRibCAlZnIyMCwlZnIyNAotCi0JZmFicyxzZ2wgJWZyNSwlZnIxMAotCWZhYnMsZGJsICVmcjUsJWZyMTAKLQlmYWJzLHF1YWQgJWZyNSwlZnIxMAotCWZhYnMsc2dsICVmcjIwLCVmcjI0Ci0JZmFicyxkYmwgJWZyMjAsJWZyMjQKLQotCWZzcXJ0LHNnbCAlZnI1LCVmcjEwCi0JZnNxcnQsZGJsICVmcjUsJWZyMTAKLQlmc3FydCxxdWFkICVmcjUsJWZyMTAKLQlmc3FydCxzZ2wgJWZyMjAsJWZyMjQKLQlmc3FydCxkYmwgJWZyMjAsJWZyMjQKLQotCWZybmQsc2dsICVmcjUsJWZyMTAKLQlmcm5kLGRibCAlZnI1LCVmcjEwCi0JZnJuZCxxdWFkICVmcjUsJWZyMTAKLQlmcm5kLHNnbCAlZnIyMCwlZnIyNAotCWZybmQsZGJsICVmcjIwLCVmcjI0Ci0JCi0JZmFkZCxzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZmFkZCxkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZmFkZCxxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZhZGQsc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZmFkZCxkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmYWRkLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZzdWIsc2dsICVmcjQsJWZyOCwlZnIxMgotCWZzdWIsZGJsICVmcjQsJWZyOCwlZnIxMgotCWZzdWIscXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmc3ViLHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZzdWIsZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZnN1YixxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmbXB5LHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmbXB5LGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmbXB5LHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZm1weSxzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmbXB5LGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZtcHkscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZmRpdixzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZmRpdixkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZmRpdixxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZkaXYsc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZmRpdixkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmZGl2LHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZyZW0sc2dsICVmcjQsJWZyOCwlZnIxMgotCWZyZW0sZGJsICVmcjQsJWZyOCwlZnIxMgotCWZyZW0scXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmcmVtLHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZyZW0sZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZnJlbSxxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmbXB5YWRkLHNnbCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAotCWZtcHlhZGQsZGJsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCi0JZm1weXN1YixzZ2wgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKLQlmbXB5c3ViLGRibCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAotCi0JeG1weXUgJWZyNCwlZnI1LCVmcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29udi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb252LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNDRjYjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb252LnMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY252ZmYsc2dsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLHNnbCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmZixzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZmLGRibCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmZixkYmwsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmZixxdWFkLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLHF1YWQsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZmYsc2dsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixzZ2wsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZmLHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZmLGRibCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZmYsZGJsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQotCWZjbnZ4ZixzZ2wsc2dsICVmcjUsJWZyMTAKLQlmY252eGYsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudnhmLHNnbCxxdWFkICVmcjUsJWZyMTAKLQlmY252eGYsZGJsLHNnbCAlZnI1LCVmcjEwCi0JZmNudnhmLGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixkYmwscXVhZCAlZnI1LCVmcjEwCi0JZmNudnhmLHF1YWQsc2dsICVmcjUsJWZyMTAKLQlmY252eGYscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixxdWFkLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZ4ZixzZ2wsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252eGYsc2dsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252eGYsZGJsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLGRibCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQscXVhZCAlZnIyMCwlZnIyNAotCi0JZmNudmZ4LHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxzZ2wsZGJsICVmcjUsJWZyMTAKLQlmY252Zngsc2dsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeCxkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252ZngsZGJsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LGRibCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZngscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxxdWFkLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LHF1YWQscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4LHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Zngsc2dsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeCxzZ2wscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeCxkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LGRibCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZngsZGJsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxxdWFkICVmcjIwLCVmcjI0Ci0KLQlmY252Znh0LHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252Znh0LGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252Znh0LHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252Znh0LHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeHQscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9mY21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkMDkyYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY21wLHNnbCxmYWxzZT8gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsZmFsc2UgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPyAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD0+ICVmcjQsJWZyNQotCWZjbXAsc2dsLD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPVQgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPz0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITw+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPCAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT8+ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLD88PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPiAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPzw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPz4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/PCAlZnI0LCVmcjUKLQlmY21wLHNnbCw+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCw/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITwgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT89ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE9VCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPyAlZnI0LCVmcjUKLQlmY21wLHNnbCw8PT4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsdHJ1ZT8gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsdHJ1ZSAlZnI0LCVmcjUKLQotCWZjbXAsZGJsLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLGRibCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLGRibCw/ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPSAlZnI0LCVmcjUKLQlmY21wLGRibCw9VCAlZnI0LCVmcjUKLQlmY21wLGRibCw/PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT8+PSAlZnI0LCVmcjUKLQlmY21wLGRibCw8ICVmcjQsJWZyNQotCWZjbXAsZGJsLD88ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE+PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPzw9ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE+ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPiAlZnI0LCVmcjUKLQlmY21wLGRibCw/PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT88ICVmcjQsJWZyNQotCWZjbXAsZGJsLD49ICVmcjQsJWZyNQotCWZjbXAsZGJsLD8+PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPCAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT1UICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/ICVmcjQsJWZyNQotCWZjbXAsZGJsLDw9PiAlZnI0LCVmcjUKLQlmY21wLGRibCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLGRibCx0cnVlICVmcjQsJWZyNQotCi0JZmNtcCxxdWFkLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsZmFsc2UgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD1UICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz49ICVmcjQsJWZyNQotCWZjbXAscXVhZCw8ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PCAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT49ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPzw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPzwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD49ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE8ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT1UICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD0+ICVmcjQsJWZyNQotCWZjbXAscXVhZCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsdHJ1ZSAlZnI0LCVmcjUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmFjMDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWZwdV9taXNjX3Rlc3RzOiAKLQlmdGVzdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0OWMxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgaW50ZWdlcl9tZW1vcnlfdGVzdHMsQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9pbmRleGluZ19sb2FkLENPREUKLQkuRVhQT1JUIGludGVnZXJfbG9hZF9zaG9ydF9tZW1vcnksQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnksQ09ERQotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi07IEJhc2ljIGludGVnZXIgbWVtb3J5IHRlc3RzIHdoaWNoIGFsc28gdGVzdCB0aGUgdmFyaW91cyAKLTsgYWRkcmVzc2luZyBtb2RlcyBhbmQgY29tcGxldGVycy4KLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotOyAKLWludGVnZXJfbWVtb3J5X3Rlc3RzOiAKLQlsZHcgMCglc3IwLCVyNCksJXIyNgotCWxkaCAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRiIDAoJXNyMCwlcjQpLCVyMjYKLQlzdHcgJXIyNiwwKCVzcjAsJXI0KQotCXN0aCAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RiICVyMjYsMCglc3IwLCVyNCkKLQotOyBTaG91bGQgbWFrZSBzdXJlIHByZS9wb3N0IG1vZGVzIGFyZSByZWNvZ25pemVkIGNvcnJlY3RseS4KLQlsZHdtIDAoJXNyMCwlcjQpLCVyMjYKLQlzdHdtICVyMjYsMCglc3IwLCVyNCkKLQotaW50ZWdlcl9pbmRleGluZ19sb2FkOiAKLQlsZHd4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkd3gscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHd4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGR3eCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHgscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRoeCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkYngscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRieCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHdheCAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgscyAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgsbSAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgsc20gJXI1KCVyNCksJXIyNgotCWxkY3d4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkY3d4LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3gsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGN3eCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQotaW50ZWdlcl9sb2FkX3Nob3J0X21lbW9yeTogCi0JbGR3cyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3cyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3cyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3YXMgMCglcjQpLCVyMjYKLQlsZHdhcyxtYiAwKCVyNCksJXIyNgotCWxkd2FzLG1hIDAoJXI0KSwlcjI2Ci0JbGRjd3MgMCglc3IwLCVyNCksJXIyNgotCWxkY3dzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGN3cyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0KLWludGVnZXJfc3RvcmVfc2hvcnRfbWVtb3J5OiAKLQlzdHdzICVyMjYsMCglc3IwLCVyNCkKLQlzdHdzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdHdzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdHdhcyAlcjI2LDAoJXI0KQotCXN0d2FzLG1iICVyMjYsMCglcjQpCi0Jc3R3YXMsbWEgJXIyNiwwKCVyNCkKLQlzdGJ5cyAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsYiAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsZSAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsYixtICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxlLG0gJXIyNiwwKCVzcjAsJXI0KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI3ZDJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1tZWQucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotaW1tZWRpYXRlX3Rlc3RzOiAKLQlsZG8gNSglcjI2KSwlcjI2Ci0JbGRpbCBMJTB4ZGVhZGJlZWYsJXIyNgotCWFkZGlsIEwlMHhkZWFkYmVlZiwlcjUKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2xvZ2ljYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxMDU5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2xvZ2ljYWwucworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCW9yICVyNCwlcjUsJXI2Ci0Jb3IsPSAlcjQsJXI1LCVyNgotCW9yLDwgJXI0LCVyNSwlcjYKLQlvciw8PSAlcjQsJXI1LCVyNgotCW9yLG9kICVyNCwlcjUsJXI2Ci0Jb3IsdHIgJXI0LCVyNSwlcjYKLQlvciw8PiAlcjQsJXI1LCVyNgotCW9yLD49ICVyNCwlcjUsJXI2Ci0Jb3IsPiAlcjQsJXI1LCVyNgotCW9yLGV2ICVyNCwlcjUsJXI2Ci0KLQl4b3IgJXI0LCVyNSwlcjYKLQl4b3IsPSAlcjQsJXI1LCVyNgotCXhvciw8ICVyNCwlcjUsJXI2Ci0JeG9yLDw9ICVyNCwlcjUsJXI2Ci0JeG9yLG9kICVyNCwlcjUsJXI2Ci0JeG9yLHRyICVyNCwlcjUsJXI2Ci0JeG9yLDw+ICVyNCwlcjUsJXI2Ci0JeG9yLD49ICVyNCwlcjUsJXI2Ci0JeG9yLD4gJXI0LCVyNSwlcjYKLQl4b3IsZXYgJXI0LCVyNSwlcjYKLQotCWFuZCAlcjQsJXI1LCVyNgotCWFuZCw9ICVyNCwlcjUsJXI2Ci0JYW5kLDwgJXI0LCVyNSwlcjYKLQlhbmQsPD0gJXI0LCVyNSwlcjYKLQlhbmQsb2QgJXI0LCVyNSwlcjYKLQlhbmQsdHIgJXI0LCVyNSwlcjYKLQlhbmQsPD4gJXI0LCVyNSwlcjYKLQlhbmQsPj0gJXI0LCVyNSwlcjYKLQlhbmQsPiAlcjQsJXI1LCVyNgotCWFuZCxldiAlcjQsJXI1LCVyNgotCi0JYW5kY20gJXI0LCVyNSwlcjYKLQlhbmRjbSw9ICVyNCwlcjUsJXI2Ci0JYW5kY20sPCAlcjQsJXI1LCVyNgotCWFuZGNtLDw9ICVyNCwlcjUsJXI2Ci0JYW5kY20sb2QgJXI0LCVyNSwlcjYKLQlhbmRjbSx0ciAlcjQsJXI1LCVyNgotCWFuZGNtLDw+ICVyNCwlcjUsJXI2Ci0JYW5kY20sPj0gJXI0LCVyNSwlcjYKLQlhbmRjbSw+ICVyNCwlcjUsJXI2Ci0JYW5kY20sZXYgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE5ZjkwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcHVyZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXBkdGxiICVyNCglc3IwLCVyNSkKLQlwZHRsYixtICVyNCglc3IwLCVyNSkKLQlwaXRsYiAlcjQoJXNyNCwlcjUpCi0JcGl0bGIsbSAlcjQoJXNyNCwlcjUpCi0JcGR0bGJlICVyNCglc3IwLCVyNSkKLQlwZHRsYmUsbSAlcjQoJXNyMCwlcjUpCi0JcGl0bGJlICVyNCglc3I0LCVyNSkKLQlwaXRsYmUsbSAlcjQoJXNyNCwlcjUpCi0JcGRjICVyNCglc3IwLCVyNSkKLQlwZGMsbSAlcjQoJXNyMCwlcjUpCi0JZmRjICVyNCglc3IwLCVyNSkKLQlmZGMsbSAlcjQoJXNyMCwlcjUpCi0JZmljICVyNCglc3I0LCVyNSkKLQlmaWMsbSAlcjQoJXNyNCwlcjUpCi0JZmRjZSAlcjQoJXNyMCwlcjUpCi0JZmRjZSxtICVyNCglc3IwLCVyNSkKLQlmaWNlICVyNCglc3I0LCVyNSkKLQlmaWNlLG0gJXI0KCVzcjQsJXI1KQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMWFkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDFhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1ZDZjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMWFkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2gxYWRkICAlcjQsJXI1LCVyNgotCXNoMWFkZCw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLDw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxldiAgJXI0LCVyNSwlcjYKLQotCXNoMWFkZGwgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLDw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsem52ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHRyICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCx1diAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gxYWRkbyAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxudXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxzdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLG9kICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8PiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD49ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLHV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdm56ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sZXYgICVyNCwlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMmFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTljOTliLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzaDJhZGQgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLDw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG9kICAlcjQsJXI1LCVyNgotCXNoMmFkZCx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD49ICAlcjQsJXI1LCVyNgotCXNoMmFkZCw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZCx1diAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsdm56ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gyYWRkbCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxzdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLG9kICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdHIgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8PiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLD49ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdm56ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsbnN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDJhZGRvICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw8PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sdXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxldiAgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gzYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWU2ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNoM2FkZCAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPSAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPCAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLG51diAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsem52ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxzdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsb2QgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHRyICAlcjQsJXI1LCVyNgotCXNoM2FkZCw8PiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPj0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDNhZGRsICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLDwgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsb2QgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLDw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPj0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsdXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCXNoM2FkZG8gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLDw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sbnV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sem52ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHRyICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLGV2ICAlcjQsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzYyMWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JdnNoZCAlcjQsJXI1LCVyNgotCXZzaGQsPSAlcjQsJXI1LCVyNgotCXZzaGQsPCAlcjQsJXI1LCVyNgotCXZzaGQsb2QgJXI0LCVyNSwlcjYKLQl2c2hkLHRyICVyNCwlcjUsJXI2Ci0JdnNoZCw8PiAlcjQsJXI1LCVyNgotCXZzaGQsPj0gJXI0LCVyNSwlcjYKLQl2c2hkLGV2ICVyNCwlcjUsJXI2Ci0KLQlzaGQgJXI0LCVyNSw1LCVyNgotCXNoZCw9ICVyNCwlcjUsNSwlcjYKLQlzaGQsPCAlcjQsJXI1LDUsJXI2Ci0Jc2hkLG9kICVyNCwlcjUsNSwlcjYKLQlzaGQsdHIgJXI0LCVyNSw1LCVyNgotCXNoZCw8PiAlcjQsJXI1LDUsJXI2Ci0Jc2hkLD49ICVyNCwlcjUsNSwlcjYKLQlzaGQsZXYgJXI0LCVyNSw1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NwZWNpYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQxNjY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JZ2Z3ICVyNCglc3IwLCVyNSkKLQlnZncsbSAlcjQoJXNyMCwlcjUpCi0JZ2ZyICVyNCglc3IwLCVyNSkKLQlnZnIsbSAlcjQoJXNyMCwlcjUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3Nwb3AucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BvcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc2YTk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BvcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLXNwb3BfdGVzdHM6IAotCXNwb3AwLDQsNQotCXNwb3AwLDQsMTE1Ci0Jc3BvcDAsNCw1LG4KLQlzcG9wMCw0LDExNSxuCi0Jc3BvcDEsNCw1ICVyNQotCXNwb3AxLDQsMTE1ICVyNQotCXNwb3AxLDQsNSxuICVyNQotCXNwb3AxLDQsMTE1LG4gJXI1Ci0Jc3BvcDIsNCw1ICVyNQotCXNwb3AyLDQsMTE1ICVyNQotCXNwb3AyLDQsNSxuICVyNQotCXNwb3AyLDQsMTE1LG4gJXI1Ci0Jc3BvcDMsNCw1ICVyNSwlcjYKLQlzcG9wMyw0LDExNSAlcjUsJXI2Ci0Jc3BvcDMsNCw1LG4gJXI1LCVyNgotCXNwb3AzLDQsMTE1LG4gJXI1LCVyNgotCi07IEdhcyBmdWNrcyB0aGlzIHVwLi4uICBUaGlua3MgaXQgaGFzIHRoZSBleHByZXNzaW9uIDUgbW9kIHI1LgotOwlzcG9wMSw0LDUgJXI1CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmZjBkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXN1YiAlcjQsJXI1LCVyNgotCXN1Yiw9ICVyNCwlcjUsJXI2Ci0Jc3ViLDwgJXI0LCVyNSwlcjYKLQlzdWIsPD0gJXI0LCVyNSwlcjYKLQlzdWIsPDwgJXI0LCVyNSwlcjYKLQlzdWIsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLG9kICVyNCwlcjUsJXI2Ci0Jc3ViLHRyICVyNCwlcjUsJXI2Ci0Jc3ViLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViLD49ICVyNCwlcjUsJXI2Ci0Jc3ViLD4gJXI0LCVyNSwlcjYKLQlzdWIsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViLG5zdiAlcjQsJXI1LCVyNgotCXN1YixldiAlcjQsJXI1LCVyNgotCi0Jc3VibyAlcjQsJXI1LCVyNgotCXN1Ym8sPSAlcjQsJXI1LCVyNgotCXN1Ym8sPCAlcjQsJXI1LCVyNgotCXN1Ym8sPD0gJXI0LCVyNSwlcjYKLQlzdWJvLDw8ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8PD0gJXI0LCVyNSwlcjYKLQlzdWJvLHN2ICVyNCwlcjUsJXI2Ci0Jc3VibyxvZCAlcjQsJXI1LCVyNgotCXN1Ym8sdHIgJXI0LCVyNSwlcjYKLQlzdWJvLDw+ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+PSAlcjQsJXI1LCVyNgotCXN1Ym8sPiAlcjQsJXI1LCVyNgotCXN1Ym8sPj49ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+PiAlcjQsJXI1LCVyNgotCXN1Ym8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3VibyxldiAlcjQsJXI1LCVyNgotCi0Jc3ViYiAlcjQsJXI1LCVyNgotCXN1YmIsPSAlcjQsJXI1LCVyNgotCXN1YmIsPCAlcjQsJXI1LCVyNgotCXN1YmIsPD0gJXI0LCVyNSwlcjYKLQlzdWJiLDw8ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8PD0gJXI0LCVyNSwlcjYKLQlzdWJiLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViYixvZCAlcjQsJXI1LCVyNgotCXN1YmIsdHIgJXI0LCVyNSwlcjYKLQlzdWJiLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+PSAlcjQsJXI1LCVyNgotCXN1YmIsPiAlcjQsJXI1LCVyNgotCXN1YmIsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+PiAlcjQsJXI1LCVyNgotCXN1YmIsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViYixldiAlcjQsJXI1LCVyNgotCi0Jc3ViYm8gJXI0LCVyNSwlcjYKLQlzdWJibyw9ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPCAlcjQsJXI1LCVyNgotCXN1YmJvLDw9ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPDwgJXI0LCVyNSwlcjYKLQlzdWJibyw8PD0gJXI0LCVyNSwlcjYKLQlzdWJibyxzdiAlcjQsJXI1LCVyNgotCXN1YmJvLG9kICVyNCwlcjUsJXI2Ci0Jc3ViYm8sdHIgJXI0LCVyNSwlcjYKLQlzdWJibyw8PiAlcjQsJXI1LCVyNgotCXN1YmJvLD49ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPiAlcjQsJXI1LCVyNgotCXN1YmJvLD4+PSAlcjQsJXI1LCVyNgotCXN1YmJvLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sZXYgJXI0LCVyNSwlcjYKLQotCXN1YnQgJXI0LCVyNSwlcjYKLQlzdWJ0LD0gJXI0LCVyNSwlcjYKLQlzdWJ0LDwgJXI0LCVyNSwlcjYKLQlzdWJ0LDw9ICVyNCwlcjUsJXI2Ci0Jc3VidCw8PCAlcjQsJXI1LCVyNgotCXN1YnQsPDw9ICVyNCwlcjUsJXI2Ci0Jc3VidCxzdiAlcjQsJXI1LCVyNgotCXN1YnQsb2QgJXI0LCVyNSwlcjYKLQlzdWJ0LHRyICVyNCwlcjUsJXI2Ci0Jc3VidCw8PiAlcjQsJXI1LCVyNgotCXN1YnQsPj0gJXI0LCVyNSwlcjYKLQlzdWJ0LD4gJXI0LCVyNSwlcjYKLQlzdWJ0LD4+PSAlcjQsJXI1LCVyNgotCXN1YnQsPj4gJXI0LCVyNSwlcjYKLQlzdWJ0LG5zdiAlcjQsJXI1LCVyNgotCXN1YnQsZXYgJXI0LCVyNSwlcjYKLQotCXN1YnRvICVyNCwlcjUsJXI2Ci0Jc3VidG8sPSAlcjQsJXI1LCVyNgotCXN1YnRvLDwgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PSAlcjQsJXI1LCVyNgotCXN1YnRvLDw8ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPDw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sc3YgJXI0LCVyNSwlcjYKLQlzdWJ0byxvZCAlcjQsJXI1LCVyNgotCXN1YnRvLHRyICVyNCwlcjUsJXI2Ci0Jc3VidG8sPD4gJXI0LCVyNSwlcjYKLQlzdWJ0byw+PSAlcjQsJXI1LCVyNgotCXN1YnRvLD4gJXI0LCVyNSwlcjYKLQlzdWJ0byw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJ0byw+PiAlcjQsJXI1LCVyNgotCXN1YnRvLG5zdiAlcjQsJXI1LCVyNgotCXN1YnRvLGV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YmkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjMyNjdjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc3ViaSAxMjMsJXI1LCVyNgotCXN1YmksPSAxMjMsJXI1LCVyNgotCXN1YmksPCAxMjMsJXI1LCVyNgotCXN1YmksPD0gMTIzLCVyNSwlcjYKLQlzdWJpLDw8IDEyMywlcjUsJXI2Ci0Jc3ViaSw8PD0gMTIzLCVyNSwlcjYKLQlzdWJpLHN2IDEyMywlcjUsJXI2Ci0Jc3ViaSxvZCAxMjMsJXI1LCVyNgotCXN1YmksdHIgMTIzLCVyNSwlcjYKLQlzdWJpLDw+IDEyMywlcjUsJXI2Ci0Jc3ViaSw+PSAxMjMsJXI1LCVyNgotCXN1YmksPiAxMjMsJXI1LCVyNgotCXN1YmksPj49IDEyMywlcjUsJXI2Ci0Jc3ViaSw+PiAxMjMsJXI1LCVyNgotCXN1YmksbnN2IDEyMywlcjUsJXI2Ci0Jc3ViaSxldiAxMjMsJXI1LCVyNgotCi0Jc3ViaW8gMTIzLCVyNSwlcjYKLQlzdWJpbyw9IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPCAxMjMsJXI1LCVyNgotCXN1YmlvLDw9IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPDwgMTIzLCVyNSwlcjYKLQlzdWJpbyw8PD0gMTIzLCVyNSwlcjYKLQlzdWJpbyxzdiAxMjMsJXI1LCVyNgotCXN1YmlvLG9kIDEyMywlcjUsJXI2Ci0Jc3ViaW8sdHIgMTIzLCVyNSwlcjYKLQlzdWJpbyw8PiAxMjMsJXI1LCVyNgotCXN1YmlvLD49IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPiAxMjMsJXI1LCVyNgotCXN1YmlvLD4+PSAxMjMsJXI1LCVyNgotCXN1YmlvLD4+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sbnN2IDEyMywlcjUsJXI2Ci0Jc3ViaW8sZXYgMTIzLCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjJlN2JmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlicmVhayA1LDEyCi0JcmZpCi0JcmZpcgotCXNzbSA1LCVyNAotCXJzbSA1LCVyNAotCW10c20gJXI0Ci0JbGRzaWQgKCVzcjAsJXI1KSwlcjQKLQltdHNwICVyNCwlc3IwCi0JbXRjdGwgJXI0LCVjcjEwCi0JbWZzcCAlc3IwLCVyNAotCW1mY3RsICVjcjEwLCVyNAotCXN5bmMKLQlzeW5jZG1hCi0JZGlhZyAxMjM0Ci0KLQlwcm9iZXIgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmVyaSAoJXNyMCwlcjUpLDEsJXI3Ci0JcHJvYmV3ICglc3IwLCVyNSksJXI2LCVyNwotCXByb2Jld2kgKCVzcjAsJXI1KSwxLCVyNwotCQotCWxwYSAlcjQoJXNyMCwlcjUpLCVyNgotCWxwYSxtICVyNCglc3IwLCVyNSksJXI2Ci0JbGhhICVyNCglc3IwLCVyNSksJXI2Ci0JbGhhLG0gJXI0KCVzcjAsJXI1KSwlcjYKLQlsY2kgJXI0KCVzcjAsJXI1KSwlcjYKLQotCWlkdGxiYSAlcjQsKCVzcjAsJXI1KQotCWlpdGxiYSAlcjQsKCVzcjQsJXI1KQotCWlkdGxicCAlcjQsKCVzcjAsJXI1KQotCWlpdGxicCAlcjQsKCVzcjQsJXI1KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5YjEwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0JdXhvciAlcjQsJXI1LCVyNgotCXV4b3Isc2J6ICVyNCwlcjUsJXI2Ci0JdXhvcixzaHogJXI0LCVyNSwlcjYKLQl1eG9yLHNkYyAlcjQsJXI1LCVyNgotCXV4b3Isc2JjICVyNCwlcjUsJXI2Ci0JdXhvcixzaGMgJXI0LCVyNSwlcjYKLQl1eG9yLHRyICVyNCwlcjUsJXI2Ci0JdXhvcixuYnogJXI0LCVyNSwlcjYKLQl1eG9yLG5oeiAlcjQsJXI1LCVyNgotCXV4b3IsbmRjICVyNCwlcjUsJXI2Ci0JdXhvcixuYmMgJXI0LCVyNSwlcjYKLQl1eG9yLG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sc2RjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdHIgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbSxuZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtdCAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2J6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY210LHNkYyAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2JjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY210LHRyICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuYnogJXI0LCVyNSwlcjYKLQl1YWRkY210LG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbXQsbmRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuYmMgJXI0LCVyNSwlcjYKLQl1YWRkY210LG5oYyAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy93ZWlyZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy93ZWlyZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGY0ZWExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvd2VpcmQucworKysgL2Rldi9udWxsCkBAIC0xLDg3MCArMCwwIEBACi0JLnN0YWJzICJ3ZWlyZC5jIiwweDY0LDAsMCxMYWJlbDAKLUxhYmVsMDoKLQkuc3RhYnMgImludHR5cGU6dDE9YnU0OzA7MzI7IiwweDgwLDAsMCwwCi0KLQotCS5zdGFicyAic3ltMzI6ICAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJ0eXBlMzI6dDMyPSAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCi0JLnN0YWJzICJhdHRyMTA0Okc0MDQ9QGggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwNTpHNDA1PUBpICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAidmFyMDpHMzAwPUBhODsxIiwweDIwLDAsMCwgMAotCS5leHBvcnQgdmFyMAotCS5kYXRhCi0JLmFsaWduIDQKLXZhcjA6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAic3ltMzM6ISAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzU6IyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzY6JCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzc6JSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzg6JiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzk6JyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDA6KCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDE6KSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDI6KiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDM6KyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDQ6LCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDU6LSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLmV4cG9ydCBhdHRyMTIyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyMjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyMwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTI0OgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInN5bTQ2Oi4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ3Oi8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ4OjAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ5OjEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTUwOjIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAiYXR0cjk2OkczOTY9QGAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjk3OkczOTc9QGEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjk4OkczOTg9QGIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjk5OkczOTk9QGMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJzeW01MTozICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01Mjo0ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01Mzo1ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01NDo2ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01NTo3ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01Njo4ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01Nzo5ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01ODo6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01OTo7ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02MDo8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02MTo9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02Mjo+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02Mzo/ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02NDpAICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02NTpBICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02NjpCICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02NzpDICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02ODpEICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02OTpFICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03MDpGICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03MTpHICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03MjpIICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03MzpJICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03NDpKICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03NTpLICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03NjpMICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03NzpNICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03ODpOICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03OTpPICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04MDpQICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04MTpRICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04MjpSICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04MzpTICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04NDpUICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04NTpVICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04NjpWICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04NzpXICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04ODpYICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04OTpZICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05MDpaICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05MTpbICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgInN5bTkzOl0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk0Ol4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk1Ol8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk2OmAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk3OmEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk4OmIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk5OmMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwMDpkICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDE6ZSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTAyOmYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwMzpnICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDQ6aCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA1OmkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwNjpqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDc6ayAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA4OmwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwOTptICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTA6biAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTExOm8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExMjpwICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTM6cSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE0OnIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExNTpzICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTY6dCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE3OnUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExODp2ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTk6dyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTIwOnggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyMTp5ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjI6eiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTIzOnsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyNDp8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjU6fSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTI2On4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAidHlwZTMzOnQzMz0hICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzU6dDM1PSMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUzNjp0MzY9JCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTM3OnQzNz0lICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzg6dDM4PSYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUzOTp0Mzk9JyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQwOnQ0MD0oICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDE6dDQxPSkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0Mjp0NDI9KiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQzOnQ0Mz0rICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDQ6dDQ0PSwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0NTp0NDU9LSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ2OnQ0Nj0uICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDc6dDQ3PS8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0ODp0NDg9MCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ5OnQ0OT0xICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTA6dDUwPTIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1MTp0NTE9MyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTUyOnQ1Mj00ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTM6dDUzPTUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1NDp0NTQ9NiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU1OnQ1NT03ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTY6dDU2PTggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1Nzp0NTc9OSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU4OnQ1OD06ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTk6dDU5PTsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2MDp0NjA9PCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTYxOnQ2MT09ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjI6dDYyPT4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2Mzp0NjM9PyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTY0OnQ2ND1AICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjU6dDY1PUEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2Njp0NjY9QiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTY3OnQ2Nz1DICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuZXhwb3J0IGF0dHI2NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjY3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2OToKLQkubG9uZyA0MgotCi0JLnN0YWJzICJ0eXBlNjg6dDY4PUQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2OTp0Njk9RSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTcwOnQ3MD1GICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzE6dDcxPUcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3Mjp0NzI9SCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTczOnQ3Mz1JICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzQ6dDc0PUogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3NTp0NzU9SyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc2OnQ3Nj1MICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzc6dDc3PU0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3ODp0Nzg9TiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc5OnQ3OT1PICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODA6dDgwPVAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4MTp0ODE9USAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTgyOnQ4Mj1SICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODM6dDgzPVMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4NDp0ODQ9VCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTg1OnQ4NT1VICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODY6dDg2PVYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4Nzp0ODc9VyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJhdHRyNjk6RzM2OT1ARSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzA6RzM3MD1ARiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzE6RzM3MT1ARyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgInR5cGU4ODp0ODg9WCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTg5OnQ4OT1ZICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTA6dDkwPVogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5MTp0OTE9WyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJ0eXBlOTM6dDkzPV0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5NDp0OTQ9XiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk1OnQ5NT1fICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTY6dDk2PWAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5Nzp0OTc9YSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk4OnQ5OD1iICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTk6dDk5PWMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDA6dDEwMD1kICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTAxOnQxMDE9ZSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwMjp0MTAyPWYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDM6dDEwMz1nICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA0OnQxMDQ9aCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwNTp0MTA1PWkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDY6dDEwNj1qICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA3OnQxMDc9ayAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwODp0MTA4PWwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDk6dDEwOT1tICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTEwOnQxMTA9biAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExMTp0MTExPW8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTI6dDExMj1wICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTEzOnQxMTM9cSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExNDp0MTE0PXIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTU6dDExNT1zICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE2OnQxMTY9dCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExNzp0MTE3PXUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTg6dDExOD12ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE5OnQxMTk9dyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyMDp0MTIwPXggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjE6dDEyMT15ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTIyOnQxMjI9eiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyMzp0MTIzPXsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjQ6dDEyND18ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTI1OnQxMjU9fSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyNjp0MTI2PX4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAiYXR0cjMyOkczMzI9QCAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjMzOkczMzM9QCEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjM1OkczMzQ9QCMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJwcmltYXJ5OkcyMDA9ZXJlZDowLGdyZWVuOjEsYmx1ZToyLDsiLCAweDIwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyMzY6RzMzNT1AJCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuZXhwb3J0IHByaW1hcnkKLQkuZGF0YQotCS5hbGlnbiA0Ci1wcmltYXJ5OgotCS5sb25nIDQyCi0KLQkuc3RhYnMgImF0dHIzNzpHMzM3PUAlICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiY29uc3Q2OTpjPWUxLDY5IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiY29uc3Q3MDpjPWUxOTA9YnMyOzA7MTY7LDcwIiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjM4OkczMzg9QCYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJiYWRfbmVnMHR5cGU6dDIwMT1zOGZpZWxkMDoxLDAsMzI7ZmllbGQyOi01MzQsMzIsNjQ7ZmllbGQzOi0xLDk2LDMyOzsiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJiYWRfbmVnMDpHMjAxIiwgMHgyMCwwLDAsIDAKLQotCS5leHBvcnQgYmFkX25lZzAKLQkuZGF0YQotCS5hbGlnbiA0Ci1iYWRfbmVnMDoKLQkubG9uZyA0MgotCS5sb25nIDQzLCA0NCwgNDUKLQotCS5zdGFicyAiYXR0cjM5OkczMzk9QCcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQxOkczNDE9QCkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQyOkczNDI9QCogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQzOkczNDM9QCsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQ0OkczNDQ9QCwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQ2OkczNDY9QC4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQ3OkczNDc9QC8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjU4OkczNTg9QDogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyNTk6RzM1OT1AO0AgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyNjA6RzM2MD1APCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjE6RzM2MT1APSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjI6RzM2Mj1APiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjM6RzM2Mz1APyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjQ6RzM2ND1AQCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjU6RzM2NT1AQSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjY6RzM2Nj1AQiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjc6RzM2Nz1AQyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjg6RzM2OD1ARCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzI6RzM3Mj1ASCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzM6RzM3Mz1ASSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzQ6RzM3ND1ASiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzU6RzM3NT1ASyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzY6RzM3Nj1ATCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzc6RzM3Nz1ATSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzg6RzM3OD1ATiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzk6RzM3OT1ATyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODA6RzM4MD1AUCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODE6RzM4MT1AUSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODI6RzM4Mj1AUiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODM6RzM4Mz1AUyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODQ6RzM4ND1AVCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODU6RzM4NT1AVSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODY6RzM4Nj1AViAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODc6RzM4Nz1AVyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODg6RzM4OD1AWCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODk6RzM4OT1AWSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyOTA6RzM5MD1AWiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyOTE6RzM5MT1AWyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgImF0dHI5MzpHMzkzPUBdICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCi0JLmV4cG9ydCBfY29tbW9uMAotCS5kYXRhCi0JLmFsaWduIDQKLV9jb21tb24wOgotCS5sb25nIDQyCi0JLmxvbmcgMjQKLQkubG9uZyAyMgotCS5leHBvcnQgY29tbW9uMAotCS5kYXRhCi0JLmFsaWduIDQKLWNvbW1vbjA6Ci0JLmxvbmcgNDIKLQkubG9uZyAyNAotCS5sb25nIDIyCi0JLnN0YWJzICAiY29tbW9uMCIsMHhlMiwwLDAsMAotCS5zdGFicyAiY29tbW9uMHZhcjA6UzEiLCAweDIwLDAsMCwgMAotCS5zdGFicyAiY29tbW9uMHZhcjE6UzEiLCAweDIwLDAsMCwgNAotCS5zdGFicyAiY29tbW9uMHZhcjI6UzEiLCAweDIwLDAsMCwgOAotCS5zdGFicyAgImNvbW1vbjAiLDB4ZTQsMCwwLDAKLQotCS5zdGFicyAiYXR0cjk0OkczOTQ9QF4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjk1OkczOTU9QF8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwMDpHNDAwPUBkICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDE6RzQwMT1AZSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTAyOkc0MDI9QGYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwMzpHNDAzPUBnICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDY6RzQwNj1AaiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTA3Okc0MDc9QGsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwODpHNDA4PUBsICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDk6RzQwOT1AbSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTEwOkc0MTA9QG4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExMTpHNDExPUBvICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTI6RzQxMj1AcCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTEzOkc0MTM9QHEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExNDpHNDE0PUByICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTU6RzQxNT1AcyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE2Okc0MTY9QHQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExNzpHNDE3PUB1ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTg6RzQxOD1AdiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE5Okc0MTk9QHcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyMDpHNDIwPUB4ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjE6RzQyMT1AeSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTIyOkc0MjI9QHogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyMzpHNDIzPUB7ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjQ6RzQyND1AfCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTI1Okc0MjU9QH0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyNjpHNDI2PUB+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5leHBvcnQgYXR0cjMyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjMyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzNQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzNToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjM2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjM2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzOAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjM5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjM5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQ3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQ3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNTgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNTg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI1OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI1OToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjYwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjYwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjYzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjYzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2NQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2NToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjcwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjcwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjczCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjczOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3NQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3NToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3OAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3ODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4MQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4MToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjgyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjgyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4NAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4NDoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJmbG9hdDcydHlwZTp0MjAyPVI4Nzs5OyIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImludDI1NnZhcjpHMjAzPWJ1MzI7MDsyNTY7IiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IGludDI1NnZhcgotCS5kYXRhCi0JLmFsaWduIDQKLWludDI1NnZhcjoKLQkubG9uZyA0MgotCS5sb25nIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmQsIDB4MmMsIDB4MmIsIDB4MmEKLQotCi0JLnN0YWJzICJjb25zdGg6Yz1lMSw0Mjk0OTY3Mjk2IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiY29uc3RoMjpjPWUxLC03MzQ3MjM5ODU3MzI2NDI3NTg5Mjg0NzU2Nzg5ODcyMzQ1NjMyODQ5Mzc0NTYiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJiYWRfbmVnMGNvbnN0OmM9UzIwMSwxMjgsMTI4LDExMjIyMjExMzQzNDM0MzQ1NjU2NTY1Njc3ODg4ODc3IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYmFkX3R5cGUwOnQoLTMsNykiLCAweDgwLDAsMCwgMAotCS5zdGFicyAiYmFkX3R5cGUxOnQoNDIsNikiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJhcnJheV9pbmRleDA6dDIwNT1yMTswOzU7IiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImFycmF5MDpHMjA2PWEyMDU7MSIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBhcnJheTAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hcnJheTA6Ci0JLmxvbmcgNDIKLQkubG9uZyA0MywgNDQsIDQ1LCA0NiwgNDcKLQotCS5zdGFicyAiYXJyYXlfaW5kZXgxOnQyMDc9IiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImFycmF5MTpHMjA4PWFlYWkxX3JlZDowLGFpMV9ncmVlbjoxLGFpMV9ibHVlOjIsOzsxIiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IGFycmF5MQotCS5kYXRhCi0JLmFsaWduIDQKLWFycmF5MToKLQkubG9uZyA0MgotCS5sb25nIDQzLCA0NAotCi0JLnN0YWJzICJpbnR0eXBlX29uZTp0MjA5PTEiLCAweDgwLDAsMCwgMAotCS5zdGFicyAiaW50dHlwZV90d286dDIxMD0xIiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgIm9uZV92YXI6RzIwOSIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBvbmVfdmFyCi0JLmRhdGEKLQkuYWxpZ24gNAotb25lX3ZhcjoKLQkubG9uZyA0MgotCS5zdGFicyAidHdvX3ZhcjpHMjEwIiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHR3b192YXIKLQkuZGF0YQotCS5hbGlnbiA0Ci10d29fdmFyOgotCS5sb25nIDQyCi0KLQkuc3RhYnMgImludHA6dDIxMT0qMSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJwb2ludGVyX3RvX2ludF92YXI6RzIxMj0qMSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJpbnRwX3ZhcjpHMjExIiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IGludHBfdmFyCi0JLmRhdGEKLQkuYWxpZ24gNAotaW50cF92YXI6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAidW5yZWNvZ19jb25zdDpjPXhqa3NkZmxza2QzMyw0OzQ3MzsiLCAweDgwLDAsMCwgMAotCi0JLmV4cG9ydCBhdHRyODUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjg3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4OToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjkwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjkwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjkzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjkzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5NQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5NToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5OAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5ODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTAwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwMDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwMQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTAyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTAzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwMzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwNAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwNjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwNwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwOToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExMAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTExOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTEyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExMjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExMwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExNToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExNgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExOQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTIwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTIxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyMToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyNQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTI2OgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInZhcjE6RzMwMT1AczMyOzEiLDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB2YXIxCi0JLmRhdGEKLQkuYWxpZ24gNAotdmFyMToKLQkubG9uZyA0MgotCS5zdGFicyAidmFyMjpHMzAyPUBwNDI7MSIsMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHZhcjIKLQkuZGF0YQotCS5hbGlnbiA0Ci12YXIyOgotCS5sb25nIDQyCi0JLnN0YWJzICJ2YXIzOkczMDM9QFA7MSIsMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHZhcjMKLQkuZGF0YQotCS5hbGlnbiA0Ci12YXIzOgotCS5sb25nIDQyCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0JLnN0YWJzICJ2X2NvbWI6RzQ0OD1zMjQhMiwwMjAsNDQ1PXMxMiExLDEyMCw0NDQ9czR4OjEsMCwzMjs7OyR2YjQ0NDo0NDY9KjQ0NCwwO2E6LzAxLDMyLDMyOzs7MDI2NCw0NDc9czEyITEsMTIwLDQ0NDskdmI0NDQ6NDQ2LDA7YjovMDEsMzIsMzI7Oztjb21iOi8wMSwxMjgsMzI7OyIsIDB4MjAsMCwwLCAwCi0KLQkuZXhwb3J0IHZfY29tYgotCS5hbGlnbiAxCi12X2NvbWI6Ci0JLmxvbmcgdl9jb21iX3NoYXJlZCAKLQkubG9uZyA0MyAKLQkubG9uZyB2X2NvbWJfc2hhcmVkIAotCS5sb25nIDQ0IAotCS5sb25nIDQ1IAotdl9jb21iX3NoYXJlZDoKLQkubG9uZyA0MiAKLQotCS5zdGFicyAic3ltOTI6XFwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5Mjp0OTI9XFwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgImF0dHI5MjpHMzkyPUBcXCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4MWU5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMS5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiAxCi0JLmFsaWduIDgKLQlub3AKLTsgIjgiIGFzc3VtZWQgaWYgbm8gYWxpZ25tZW50IGdpdmVuLgotCS5hbGlnbgotCW5vcAotCS5hbGlnbiA0MDk2Ci0Jbm9wCi0KLQotICAgICAgICAuU1BBQ0UgICRQUklWQVRFJAotICAgICAgICAuU1VCU1BBICRCU1MkCi0KLSAgICAgICAgLkFMSUdOICA4Ci0kTDAwQlNTOgotaG9tZV9idWZmOgotICAgICAgICAuQkxPQ0sgIDEwMjQKLSAgICAgICAgLkFMSUdOICA4Ci1jdXJyZW50X2J1ZmY6Ci0gICAgICAgIC5CTE9DSyAgMTAyNAotICAgICAgICAuQUxJR04gIDQKLWxvY2tfZmlsZToKLSAgICAgICAgLkJMT0NLICA0Ci0gICAgICAgIC5BTElHTiAgOAotTDMzMi5uYW1lOgotICAgICAgICAuQkxPQ0sgIDMwCi0gICAgICAgIC5BTElHTiAgNAotTDM1Mi5sYXN0X2Nhc2Vfd2E6Ci0gICAgICAgIC5CTE9DSyAgNAotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjczNGM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDMKLQotCQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYXBwYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FwcGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM3ZjllLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYXBwYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIDEgImNydDAucyIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMWMxZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb29iYXIsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1GUixBUkdXMT1GVSxBUkdXMj1GUixBUkdXMz1GVSxSVE5WQUw9RlIKLWZvb2JhcgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlsZG8gLTY0KCVyMzApLCVyMjAKLQlhZGRpbCBMUid4LSRnbG9iYWwkLCVyMjcKLQlmbGRkcyA4KCVyMjApLCVmcjQKLQlmbGRkcyAwKCVyMjApLCVmcjIyCi0JbGRvIFJSJ3gtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JZm1weXN1YixzZ2wgJWZyNUwsJWZyN0wsJWZyNUwsJWZyMjJMLCVmcjRMCi0JYnYgJXIwKCVyMikKLQlmc3RkcyAlZnI1LDAoJXIxOSkKLQkuRVhJVAotCS5QUk9DRU5ECi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJEJTUyQKLQoteAkuY29tbSA4Ci15CS5jb21tIDgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2sxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTc2OTlmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2sxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICREQVRBJAotCi1mb286Ci0JLmJsb2NrCi1iYXI6Ci0JLmJsb2NrIDB4N2ZmZmZmZmYKLWNvbToKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2syLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNiNWYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2syLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICREQVRBJAotCi1mb286Ci0JLmJsb2NrIC0xCi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODBjZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsZGF0YWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgcHJpbnRmLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS5TVFJJTkcgIiVkICVsZiAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBlcnJvcl9fM0FBQWlpZGkKLQkuRVhQT1JUIGVycm9yX18zQUFBaWlkaSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUZSLEFSR1c0PUZVLFJUTlZBTD1HUgotZXJyb3JfXzNBQUFpaWRpOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQljb3B5ICVyMjYsJXI1Ci0JbGRvIC04KCVyMCksJXI2Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjYsJXI3Ci0Jc3R3ICVyMjUsMCglcjcpCi0JbGRvIC0xMiglcjApLCVyOAotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI4LCVyOQotCXN0dyAlcjI0LDAoJXI5KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtMjQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTI4KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JZmxkZHMgMCglcjIwKSwlZnI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUKLQlibCBwcmludGYsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMDIsJXIwCi0JYmwsbiBMJDAwMDEsJXIwCi1MJDAwMDI6Ci1MJDAwMDE6Ci0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG9rX18zQUFBaWRpCi0JLkVYUE9SVCBva19fM0FBQWlkaSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVLFJUTlZBTD1HUgotb2tfXzNBQUFpZGk6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZG8gLTgoJXIwKSwlcjYKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNiwlcjcKLQlzdHcgJXIyNSwwKCVyNykKLQlsZG8gLTE2KCVyMCksJXI4Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjgsJXI5Ci0JZnN0ZHMgJWZyNywwKCVyOSkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTE2KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC0yMCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQlsZGlsIEwnTEMkMDAwMCwlcjI2Ci0JbGRvIFInTEMkMDAwMCglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCWZsZGRzIDAoJXIyMCksJWZyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVCi0JYmwgcHJpbnRmLCVyMgotCW5vcAotCWJsLG4gTCQwMDA0LCVyMAotCWJsLG4gTCQwMDAzLCVyMAotTCQwMDA0OgotTCQwMDAzOgotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgX19tYWluLENPREUKLQkuYWxpZ24gOAotTEMkMDAwMToKLQk7IC5kb3VibGUgNS41MDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAKLQkud29yZCAxMDc1MTgzNjE2IDsgPSAweDQwMTYwMDAwCi0JLndvcmQgMCA7ID0gMHgwCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4KLQkuRVhQT1JUIG1haW4sUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW46Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JbGRvIC0yNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyMzApLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwMSwlcjIwCi0JbGRvIFInTEMkMDAwMSglcjIwKSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0KCVyMjEpLCVyMjMKLQlzdHcgJXIyMiwwKCVyMTkpCi0Jc3R3ICVyMjMsNCglcjE5KQotCWxkbyAzKCVyMCksJXIxOQotCXN0dyAlcjE5LC02MCglcjMwKQotCWxkbyA4KCVyNCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkbyA0KCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgZXJyb3JfXzNBQUFpaWRpLCVyMgotCW5vcAotCWxkbyAzKCVyMCksJXIxOQotCXN0dyAlcjE5LC01MiglcjMwKQotCWxkbyA4KCVyNCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkaWwgTCdMQyQwMDAxLCVyMTkKLQlsZG8gUidMQyQwMDAxKCVyMTkpLCVyMjAKLQlmbGRkcyAwKCVyMjApLCVmcjcKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1GUixBUkdXMz1GVQotCWJsIG9rX18zQUFBaWRpLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMjgKLQlibCxuIEwkMDAwNSwlcjAKLQlibCxuIEwkMDAwNSwlcjAKLUwkMDAwNToKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4Yzc3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxpbmZvYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuc3BhY2UgJFRFWFQkCi0JLnN1YnNwYSAkQ09ERSQKLQkuYWxpZ24gNAotCS5leHBvcnQgZGl2dSxtaWxsaWNvZGUKLQkucHJvYwotCS5jYWxsaW5mbyBtaWxsaWNvZGUKLWRpdnUKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9kZWZidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZGVmYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NGNhZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9kZWZidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5pbXBvcnQJX3NldGVycm5vCi0gCS5leHBvcnQgICB2Zm9yayAgIQkubGFiZWwgICB2Zm9yayAgIQkucHJvYyEJLmNhbGxpbmZvIG5vX2NhbGxzIQkuZW50cnkgIQkgCS5sYWJlbAlfX3Zmb3JrICAhCW10c3AJJXIwLCVzcjAhCWxkaWwJTCUweGMwMDAwMDA0LCVyMSEJYmxlCVIlMHhjMDAwMDAwNCglc3IwLCVyMSkhCWxkaQk2NiAgICwlcjIyICEJYixuCXl5eSEJYixuCV9fdmZvcmsgIQliCV9zZXRlcnJubyEJY29weQklcjI4LCVyMjYhCS5sYWJlbAl5eXkgCi0JYWRkLD0JJXIwLCVyMjksJXIwCQkgCi0JY29weQklcjAsJXIyOAkJIAotCWJ2LG4JKCVyMikKLQkuZXhpdAotIAkucHJvY2VuZCAJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmU3YTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9lbnRyeWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5QQVJBTSBmb28sUlROVkFMPUdSCi1mb286Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LE5PX0NBTExTLEVOVFJZX0dSPTEsRU5UUllfRlI9MTEKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cG9ydGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTY2NDE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLSAgICAgICAgLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHByYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cHJidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiYWQ0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cHJidWcucworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSAgICAgICAgLnNwYWNlCSRURVhUJAotICAgICAgICAuc3Vic3BhCSRDT0RFJAotCi0JLmFsaWduCTgKLQkuZXhwb3J0CWljb2RlLGRhdGEKLWljb2RlOgotCS5wcm9jCi0JLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKLQkuZW50cnkKLQlidixuCSVyMCglcjIpCi0JLmV4aXQKLQlub3AKLQkucHJvY2VuZAotCi0JOwotCTsgRklSU1QsIGFyZ3YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYXJncywgMXN0IGlzIHNhbWUgYXMgcGF0aC4KLQk7Ci0JLmFsaWduCTgKLWljX2FyZ3Y6Ci0JLndvcmQJaWNfYXJndjEtaWNvZGUJOyBzZWNvbmQsIHBvaW50ZXIgdG8gMXN0IGFyZ3VtZW50Ci0JLndvcmQJaWNfcGF0aC1pY29kZQkJOyBmaXJzdCwgIHBvaW50ZXIgdG8gaW5pdCBwYXRoCi0JLndvcmQJMAkJCTsgZm91cnRoLCBOVUxMIGFyZ3YgdGVybWluYXRvciAocGFkKQotCS53b3JkCTAJCQk7IHRoaXJkLCAgTlVMTCBhcmd2IHRlcm1pbmF0b3IKLQotaWNfcGF0aDoKLQkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcwotCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAotCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKLQotaWNfYXJndjE6Ci0JLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKLQkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKLQkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCi0KLQkuZXhwb3J0CXN6aWNvZGUsZGF0YQotc3ppY29kZToKLQkud29yZAlzemljb2RlLWljb2RlCi0JLndvcmQJMAkJCTsgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBmaWxsZXIgYXQgZW5kCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2ZpeHVwN2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M4NzQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgeG1hbGxvYyxDT0RFCi0JLklNUE9SVCBfb2JzdGFja19uZXdjaHVuayxDT0RFCi0JLklNUE9SVCBtZW1zZXQsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGFsbG9jX3R5cGUsQ09ERQotCS5FWFBPUlQgYWxsb2NfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotYWxsb2NfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI3LDMyKCVyNCkKLQlzdHcgJXI2LDM2KCVyNCkKLQlzdHcgJXI1LDQwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMDIsJXIwCi0Jbm9wCi0JbGRvIDUyKCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI3Ci0JYmwsbiBMJDAwMDMsJXIwCi1MJDAwMDI6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTIwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjQpCi0JbGRvIDUyKCVyMCksJXIxOQotCXN0dyAlcjE5LDE2KCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDAwNCwlcjAKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDE2KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDA1LCVyMAotTCQwMDA0OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwMDU6IAotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDIwKCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDAwNiwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDA2OiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwMDcsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDAwOCwlcjAKLUwkMDAwNzogCi0JY29weSAlcjAsJXIxOQotTCQwMDA4OiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyAyNCglcjQpLCVyNwotTCQwMDAzOiAKLQljb3B5ICVyNywlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlzdHcgJXIwLDAoJXI3KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjcpCi0JbGRvIC0xKCVyMCksJXIxOQotCXN0dyAlcjE5LDQ0KCVyNykKLQljb3B5ICVyNywlcjI4Ci0JYmwsbiBMJDAwMDEsJXIwCi1MJDAwMDE6IAotCWxkdyAzMiglcjQpLCVyNwotCWxkdyAzNiglcjQpLCVyNgotCWxkdyA0MCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFrZV9wb2ludGVyX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9wb2ludGVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLW1ha2VfcG9pbnRlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjksMTYoJXI0KQotCXN0dyAlcjgsMjAoJXI0KQotCXN0dyAlcjcsMjQoJXI0KQotCXN0dyAlcjYsMjgoJXI0KQotCXN0dyAlcjUsMzIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjAoJXIxOSksJXI5Ci0JY29taWNsciw8PiAwLCVyOSwlcjAKLQlibCBMJDAwMTAsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDExLCVyMAotCW5vcAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAwOSwlcjAKLQlibCxuIEwkMDAxMiwlcjAKLUwkMDAxMTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxMywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotTCQwMDEzOiAKLUwkMDAxMjogCi1MJDAwMTA6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMTUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxNCwlcjAKLQlub3AKLQlibCxuIEwkMDAxNSwlcjAKLUwkMDAxNTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDE2LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLUwkMDAxNjogCi0JYmwsbiBMJDAwMTcsJXIwCi1MJDAwMTQ6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjkKLQlsZHcgMTIoJXI5KSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JY29weSAlcjksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI5KQotTCQwMDE3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDIwKCVyMTkpCi0JbGRvIDQoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjkpCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMCglcjkpCi0JbGRoIDMyKCVyOSksJXIxOQotCWNvcHkgJXIxOSwlcjIwCi0JZGVwaSAtMSwzMSwxLCVyMjAKLQlzdGggJXIyMCwzMiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjAoJXIxOSkKLUwkMDAxODogCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotTCQwMDA5OiAKLQlsZHcgMTYoJXI0KSwlcjkKLQlsZHcgMjAoJXI0KSwlcjgKLQlsZHcgMjQoJXI0KSwlcjcKLQlsZHcgMjgoJXI0KSwlcjYKLQlsZHcgMzIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9wb2ludGVyX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3BvaW50ZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3BvaW50ZXJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDgoJXI0KQotCXN0dyAlcjUsMTIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBtYWtlX3BvaW50ZXJfdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDAxOSwlcjAKLUwkMDAxOTogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG1ha2VfcmVmZXJlbmNlX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9yZWZlcmVuY2VfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbWFrZV9yZWZlcmVuY2VfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI5LDE2KCVyNCkKLQlzdHcgJXI4LDIwKCVyNCkKLQlzdHcgJXI3LDI0KCVyNCkKLQlzdHcgJXI2LDI4KCVyNCkKLQlzdHcgJXI1LDMyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI0KCVyMTkpLCVyOQotCWNvbWljbHIsPD4gMCwlcjksJXIwCi0JYmwgTCQwMDIxLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyMiwlcjAKLQlub3AKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMjAsJXIwCi0JYmwsbiBMJDAwMjMsJXIwCi1MJDAwMjI6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMjQsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLUwkMDAyNDogCi1MJDAwMjM6IAotTCQwMDIxOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDI2LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMjUsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwMjYsJXIwCi1MJDAwMjY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAyNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi1MJDAwMjc6IAotCWJsLG4gTCQwMDI4LCVyMAotTCQwMDI1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXI5Ci0JbGR3IDEyKCVyOSksJXIxOQotCXN0dyAlcjE5LDgoJXI0KQotCWNvcHkgJXI5LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyOSkKLUwkMDAyODogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDE2KCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyNCglcjE5KQotCWxkbyA0KCVyMCksJXIxOQotCXN0dyAlcjE5LDgoJXI5KQotCWxkbyAxNiglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI0KCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyOSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyNCglcjE5KQotTCQwMDI5OiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMjAsJXIwCi1MJDAwMjA6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3JlZmVyZW5jZV90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9yZWZlcmVuY2VfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3JlZmVyZW5jZV90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfcmVmZXJlbmNlX3R5cGUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMzAsJXIwCi1MJDAwMzA6IAotCWxkdyA4KCVyNCksJXI2Ci0JbGR3IDEyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWtlX2Z1bmN0aW9uX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9mdW5jdGlvbl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1tYWtlX2Z1bmN0aW9uX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOSwxNiglcjQpCi0Jc3R3ICVyOCwyMCglcjQpCi0Jc3R3ICVyNywyNCglcjQpCi0Jc3R3ICVyNiwyOCglcjQpCi0Jc3R3ICVyNSwzMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyOCglcjE5KSwlcjkKLQljb21pY2xyLDw+IDAsJXI5LCVyMAotCWJsIEwkMDAzMiwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzMsJXIwCi0Jbm9wCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDMxLCVyMAotCWJsLG4gTCQwMDM0LCVyMAotTCQwMDMzOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDM1LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi1MJDAwMzU6IAotTCQwMDM0OiAKLUwkMDAzMjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAzNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDM2LCVyMAotCW5vcAotCWJsLG4gTCQwMDM3LCVyMAotTCQwMDM3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMzgsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotTCQwMDM4OiAKLQlibCxuIEwkMDAzOSwlcjAKLUwkMDAzNjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyOQotCWxkdyAxMiglcjkpLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLQljb3B5ICVyOSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjkpCi1MJDAwMzk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjgoJXIxOSkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyOSkKLQlsZG8gNiglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI4KCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDA0MCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyOCglcjE5KQotTCQwMDQwOiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi1MJDAwMzE6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2Z1bmN0aW9uX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX2Z1bmN0aW9uX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF9mdW5jdGlvbl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfZnVuY3Rpb25fdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDA0MSwlcjAKLUwkMDA0MTogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzbWFzaF90b19tZW1iZXJfdHlwZSxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9tZW1iZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfbWVtYmVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9tZW1iZXJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDgoJXI0KQotCXN0dyAlcjcsMTIoJXI0KQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAyNCglcjQpLCVyMQotCWZzdGRzLG1hICVmcjEyLDgoJXIxKQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyMTIKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlmc3R3cyAlZnIxMiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JbGR3IDAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgc21hc2hfdG9fbWVtYmVyX3R5cGUsJXIyCi0Jbm9wCi0JZnN0d3MgJWZyMTIsLTE2KCVyMzApCi0JbGR3IC0xNiglcjMwKSwlcjI4Ci0JYmwsbiBMJDAwNDIsJXIwCi1MJDAwNDI6IAotCWxkdyA4KCVyNCksJXI4Ci0JbGR3IDEyKCVyNCksJXI3Ci0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDI0KCVyNCksJXIxCi0JZmxkZHMsbWEgOCglcjEpLCVmcjEyCi0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBhbGxvY2F0ZV9zdHViX21ldGhvZCxDT0RFCi0JLkVYUE9SVCBhbGxvY2F0ZV9zdHViX21ldGhvZCxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotYWxsb2NhdGVfc3R1Yl9tZXRob2Q6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyA0KCVyMCksJXIyMAotCXN0aCAlcjIwLDMyKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDE1KCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdHcgJXIyMCw4KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwNDMsJXIwCi1MJDAwNDM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGJ1aWx0aW5fdHlwZV9pbnQsREFUQQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBjcmVhdGVfYXJyYXlfdHlwZSxDT0RFCi0JLkVYUE9SVCBjcmVhdGVfYXJyYXlfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotY3JlYXRlX2FycmF5X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTAsNTYoJXI0KQotCXN0dyAlcjksNjAoJXI0KQotCXN0dyAlcjgsNjQoJXI0KQotCXN0dyAlcjcsNjgoJXI0KQotCXN0dyAlcjYsNzIoJXI0KQotCXN0dyAlcjUsNzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMiglcjApLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyAwKCVyMjApLCVyMjAKLQlsZHcgOCglcjIxKSwlcjIxCi0Jc3R3ICVyMjAsLTE2KCVyMzApCi0JZmxkd3MgLTE2KCVyMzApLCVmcjUKLQlzdHcgJXIyMSwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyNVIKLQl4bXB5dSAlZnI1LCVmcjVSLCVmcjQKLQlmc3R3cyAlZnI0UiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjQKLQlzdHcgJXIyNCw4KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzQoJXIxOSkKLQlsZHcgOCglcjQpLCVyOQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDUwLCVyMAotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksMTYoJXI0KQotCWxkdyAxNiglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGRvIDE2KCVyMCksJXIxOQotCXN0dyAlcjE5LDI0KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjQoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDA0NSwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjI2Ci0JbGR3IDI0KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDQ2LCVyMAotTCQwMDQ1OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwNDY6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgMjQoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAxNiglcjQpLCVyMTkKLQlzdHcgJXIxOSwyOCglcjQpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwzMiglcjQpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDMyKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAwNDcsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDA0NzogCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMjgoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyOCglcjQpLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDQ4LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAwNDksJXIwCi1MJDAwNDg6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA0OTogCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMzIoJXI0KSwlcjEwCi0JYmwsbiBMJDAwNTEsJXIwCi1MJDAwNTA6IAotCWxkbyAxNiglcjApLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHhtYWxsb2MsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTAKLUwkMDA1MTogCi0Jc3R3ICVyMTAsMzYoJXI5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDExKCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDE2KCVyMTkpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyA0KCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDIoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzQoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNTcsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksMzYoJXI0KQotCWxkdyAzNiglcjQpLCVyMTkKLQlzdHcgJXIxOSw0MCglcjQpCi0JbGRvIDMyKCVyMCksJXIxOQotCXN0dyAlcjE5LDQ0KCVyNCkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNDQoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDA1MiwlcjAKLQlub3AKLQlsZHcgNDAoJXI0KSwlcjI2Ci0JbGR3IDQ0KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDUzLCVyMAotTCQwMDUyOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwNTM6IAotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgNDQoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAzNiglcjQpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjQpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw1MiglcjQpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDUyKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAwNTQsJXIwCi0Jbm9wCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDA1NDogCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgNDgoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDU1LCVyMAotCW5vcAotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAwNTYsJXIwCi1MJDAwNTU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA1NjogCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgNTIoJXI0KSwlcjEwCi0JYmwsbiBMJDAwNTgsJXIwCi1MJDAwNTc6IAotCWxkbyAzMiglcjApLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHhtYWxsb2MsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTAKLUwkMDA1ODogCi0Jc3R3ICVyMTAsMzYoJXI5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMzYoJXIxOSksJXIyMAotCXN0dyAlcjAsMCglcjIwKQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTYoJXIwKSwlcjIwCi0JbGR3IDM2KCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRvIC0xKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAzNiglcjIwKSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDE2KCVyMCksJXIyMAotCWxkdyAzNiglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMzYoJXIxOSksJXIyMAotCWxkdyAxMiglcjQpLCVyMTkKLQlzdHcgJXIxOSw4KCVyMjApCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMCksJXIyMAotCXN0dyAlcjIwLDQ0KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwNDQsJXIwCi1MJDAwNDQ6IAotCWxkdyA1NiglcjQpLCVyMTAKLQlsZHcgNjAoJXI0KSwlcjkKLQlsZHcgNjQoJXI0KSwlcjgKLQlsZHcgNjgoJXI0KSwlcjcKLQlsZHcgNzIoJXI0KSwlcjYKLQlsZHcgNzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLENPREUKLQkuRVhQT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLXNtYXNoX3RvX21lbWJlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEwLDE2KCVyNCkKLQlzdHcgJXI5LDIwKCVyNCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC0xMiglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTQoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotTCQwMDU5OiAKLQlsZHcgMTYoJXI0KSwlcjEwCi0JbGR3IDIwKCVyNCksJXI5Ci0JbGR3IDI0KCVyNCksJXI4Ci0JbGR3IDI4KCVyNCksJXI3Ci0JbGR3IDMyKCVyNCksJXI2Ci0JbGR3IDM2KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBzbWFzaF90b19tZXRob2RfdHlwZSxDT0RFCi0JLkVYUE9SVCBzbWFzaF90b19tZXRob2RfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi1zbWFzaF90b19tZXRob2RfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMiwxNiglcjQpCi0Jc3R3ICVyMTEsMjAoJXI0KQotCXN0dyAlcjEwLDI0KCVyNCkKLQlzdHcgJXI5LDI4KCVyNCkKLQlzdHcgJXI4LDMyKCVyNCkKLQlzdHcgJXI3LDM2KCVyNCkKLQlzdHcgJXI2LDQwKCVyNCkKLQlzdHcgJXI1LDQ0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTE2KCVyMCksJXIxMQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXIxMSwlcjEyCi0Jc3R3ICVyMjMsMCglcjEyKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTEyKCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTE2KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQ4KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxKCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDE1KCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLUwkMDA2MDogCi0JbGR3IDE2KCVyNCksJXIxMgotCWxkdyAyMCglcjQpLCVyMTEKLQlsZHcgMjQoJXI0KSwlcjEwCi0JbGR3IDI4KCVyNCksJXI5Ci0JbGR3IDMyKCVyNCksJXI4Ci0JbGR3IDM2KCVyNCksJXI3Ci0JbGR3IDQwKCVyNCksJXI2Ci0JbGR3IDQ0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgc3RybmNtcCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMDA6IAotCS5TVFJJTkcgInN0cnVjdCBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDAxOiAKLQkuU1RSSU5HICJ1bmlvbiBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDAyOiAKLQkuU1RSSU5HICJlbnVtIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIHR5cGVfbmFtZV9ub190YWcsQ09ERQotCS5FWFBPUlQgdHlwZV9uYW1lX25vX3RhZyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotdHlwZV9uYW1lX25vX3RhZzogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDgoJXI0KQotCXN0dyAlcjUsMTIoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZHcgNCglcjUpLCVyNgotCWNvbWljbHIsPD4gMCwlcjYsJXIwCi0JYmwgTCQwMDYyLCVyMAotCW5vcAotCWxkdyAwKCVyNSksJXIxOQotCWNvbWljbHIsPD4gNCwlcjE5LCVyMAotCWJsIEwkMDA2NiwlcjAKLQlub3AKLQljb21pY2xyLD49IDQsJXIxOSwlcjAKLQlibCBMJDAwNzIsJXIwCi0Jbm9wCi0JY29taWNsciw8PiAzLCVyMTksJXIwCi0JYmwgTCQwMDY0LCVyMAotCW5vcAotCWJsLG4gTCQwMDcwLCVyMAotTCQwMDcyOiAKLQljb21pY2xyLDw+IDUsJXIxOSwlcjAKLQlibCBMJDAwNjgsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzAsJXIwCi1MJDAwNjQ6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMCwlcjI1Ci0JbGRvIFInTEMkMDAwMCglcjI1KSwlcjI1Ci0JbGRvIDcoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjUsJXIwCi0Jbm9wCi0JbGRvIDcoJXI2KSwlcjYKLUwkMDA2NTogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjY6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMSwlcjI1Ci0JbGRvIFInTEMkMDAwMSglcjI1KSwlcjI1Ci0JbGRvIDYoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjcsJXIwCi0Jbm9wCi0JbGRvIDYoJXI2KSwlcjYKLUwkMDA2NzogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjg6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMiwlcjI1Ci0JbGRvIFInTEMkMDAwMiglcjI1KSwlcjI1Ci0JbGRvIDUoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjksJXIwCi0Jbm9wCi0JbGRvIDUoJXI2KSwlcjYKLUwkMDA2OTogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNzA6IAotCWJsLG4gTCQwMDYzLCVyMAotTCQwMDYzOiAKLUwkMDA2MjogCi0JY29weSAlcjYsJXIyOAotCWJsLG4gTCQwMDYxLCVyMAotTCQwMDYxOiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGN1cnJlbnRfbGFuZ3VhZ2UsREFUQQotCS5JTVBPUlQgc3RyY21wLENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWFkZGlsIEwnY3VycmVudF9sYW5ndWFnZS0kZ2xvYmFsJCwlcjI3Ci0JbGR3IFInY3VycmVudF9sYW5ndWFnZS0kZ2xvYmFsJCglcjEpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAwNzQ6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNzUsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgNCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNzcsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMjgKLQlibCxuIEwkMDA3MywlcjAKLUwkMDA3NzogCi1MJDAwNzY6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyA0KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDA3NCwlcjAKLUwkMDA3NTogCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDczLCVyMAotTCQwMDczOiAKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBsb29rdXBfc3ltYm9sLENPREUKLQkuSU1QT1JUIGVycm9yLENPREUKLQkuYWxpZ24gNAotTEMkMDAwMzogCi0JLlNUUklORyAiTm8gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdHlwZW5hbWUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCi1sb29rdXBfdHlwZW5hbWU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTIsOCglcjQpCi0Jc3R3ICVyMTEsMTIoJXI0KQotCXN0dyAlcjEwLDE2KCVyNCkKLQlzdHcgJXI5LDIwKCVyNCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotCWNvbWljbHIsPD4gMCwlcjExLCVyMAotCWJsIEwkMDA4MCwlcjAKLQlub3AKLQlsZHcgOCglcjExKSwlcjE5Ci0JY29taWNsciw9IDgsJXIxOSwlcjAKLQlibCBMJDAwODAsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzksJXIwCi1MJDAwODA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTIKLQljb21pY2xyLDw+IDAsJXIxMiwlcjAKLQlibCBMJDAwODEsJXIwCi0Jbm9wCi0JY29weSAlcjEyLCVyMjgKLQlibCxuIEwkMDA3OCwlcjAKLQlibCxuIEwkMDA4MiwlcjAKLUwkMDA4MTogCi0JY29taWNsciw9IDAsJXIxMiwlcjAKLQlibCBMJDAwODMsJXIwCi0Jbm9wCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwODMsJXIwCi0Jbm9wCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotCWJsLG4gTCQwMDg0LCVyMAotTCQwMDgzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwMywlcjI2Ci0JbGRvIFInTEMkMDAwMyglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwODQ6IAotTCQwMDgyOiAKLUwkMDA3OTogCi0JbGR3IDEyKCVyMTEpLCVyMjgKLQlibCxuIEwkMDA3OCwlcjAKLUwkMDA3ODogCi0JbGR3IDgoJXI0KSwlcjEyCi0JbGR3IDEyKCVyNCksJXIxMQotCWxkdyAxNiglcjQpLCVyMTAKLQlsZHcgMjAoJXI0KSwlcjkKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBhbGxvY2EsQ09ERQotCS5JTVBPUlQgc3RybGVuLENPREUKLQkuSU1QT1JUIHN0cmNweSxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMDQ6IAotCS5TVFJJTkcgInVuc2lnbmVkIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF91bnNpZ25lZF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdW5zaWduZWRfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF91bnNpZ25lZF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gMTAoJXIxOSksJXIyMAotCWxkbyA3KCVyMjApLCVyMjEKLQljb3B5ICVyMjEsJXIxOQotCWxkbyA2MyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyNSwyNiwlcjE5Ci0JemRlcCAlcjE5LDI1LDI2LCVyMjAKLQlsZG8gLTk2KCVyMzApLCVyMTkKLQlhZGQgJXIzMCwlcjIwLCVyMzAKLQlsZG8gNyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyOCwyOSwlcjE5Ci0JemRlcCAlcjE5LDI4LDI5LCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAwNCwlcjI1Ci0JbGRvIFInTEMkMDAwNCglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjIwCi0JbGRvIDkoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwODUsJXIwCi1MJDAwODU6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwNTogCi0JLlNUUklORyAic2lnbmVkIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zaWduZWRfdHlwZW5hbWUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3NpZ25lZF90eXBlbmFtZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3NpZ25lZF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gOCglcjE5KSwlcjIwCi0JbGRvIDcoJXIyMCksJXIyMQotCWNvcHkgJXIyMSwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMDUsJXIyNQotCWxkbyBSJ0xDJDAwMDUoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjAKLQlsZG8gNyglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGxvb2t1cF90eXBlbmFtZSwlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAwODcsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwODYsJXIwCi1MJDAwODc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JY29weSAlcjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3R5cGVuYW1lLCVyMgotCW5vcAotCWJsLG4gTCQwMDg2LCVyMAotTCQwMDg2OiAKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwMDY6IAotCS5TVFJJTkcgIk5vIHN0cnVjdCB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDc6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHVuaW9uIG9yIGVudW0gJXMsIG5vdCBhIHN0cnVjdC5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfc3RydWN0LENPREUKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3QsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9zdHJ1Y3Q6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDA4OSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwNiwlcjI2Ci0JbGRvIFInTEMkMDAwNiglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwODk6IAotCWxkdyAxMiglcjkpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAzLCVyMjAsJXIwCi0JYmwgTCQwMDkwLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA3LCVyMjYKLQlsZG8gUidMQyQwMDA3KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5MDogCi0JbGR3IDEyKCVyOSksJXIyOAotCWJsLG4gTCQwMDg4LCVyMAotTCQwMDg4OiAKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwODogCi0JLlNUUklORyAiTm8gdW5pb24gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDA5OiAKLQkuU1RSSU5HICJUaGlzIGNvbnRleHQgaGFzIGNsYXNzLCBzdHJ1Y3Qgb3IgZW51bSAlcywgbm90IGEgdW5pb24uXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3VuaW9uLENPREUKLQkuRVhQT1JUIGxvb2t1cF91bmlvbixFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX3VuaW9uOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWNvbWljbHIsPSAwLCVyOSwlcjAKLQlibCBMJDAwOTIsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDgsJXIyNgotCWxkbyBSJ0xDJDAwMDgoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDkyOiAKLQlsZHcgMTIoJXI5KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNCwlcjIwLCVyMAotCWJsIEwkMDA5MywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwOSwlcjI2Ci0JbGRvIFInTEMkMDAwOSglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTM6IAotCWxkdyAxMiglcjkpLCVyMjgKLQlibCxuIEwkMDA5MSwlcjAKLUwkMDA5MTogCi0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwMTA6IAotCS5TVFJJTkcgIk5vIGVudW0gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDExOiAKLQkuU1RSSU5HICJUaGlzIGNvbnRleHQgaGFzIGNsYXNzLCBzdHJ1Y3Qgb3IgdW5pb24gJXMsIG5vdCBhbiBlbnVtLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9lbnVtLENPREUKLQkuRVhQT1JUIGxvb2t1cF9lbnVtLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1sb29rdXBfZW51bTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQljb21pY2xyLD0gMCwlcjksJXIwCi0JYmwgTCQwMDk1LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDEwLCVyMjYKLQlsZG8gUidMQyQwMDEwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5NTogCi0JbGR3IDEyKCVyOSksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDUsJXIyMCwlcjAKLQlibCBMJDAwOTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTEsJXIyNgotCWxkbyBSJ0xDJDAwMTEoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk2OiAKLQlsZHcgMTIoJXI5KSwlcjI4Ci0JYmwsbiBMJDAwOTQsJXIwCi1MJDAwOTQ6IAotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgc3RyY2F0LENPREUKLQkuYWxpZ24gNAotTEMkMDAxMjogCi0JLlNUUklORyAiPFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTM6IAotCS5TVFJJTkcgIiA+XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAxNDogCi0JLlNUUklORyAiTm8gdGVtcGxhdGUgdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdGVtcGxhdGVfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdGVtcGxhdGVfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgotbG9va3VwX3RlbXBsYXRlX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTEsMTYoJXI0KQotCXN0dyAlcjEwLDIwKCVyNCkKLQlzdHcgJXI5LDI0KCVyNCkKLQlzdHcgJXI4LDI4KCVyNCkKLQlzdHcgJXI3LDMyKCVyNCkKLQlzdHcgJXI2LDM2KCVyNCkKLQlzdHcgJXI1LDQwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTEKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgc3RybGVuLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JYWRkICVyMTEsJXIxOSwlcjIwCi0JbGRvIDQoJXIyMCksJXIxOQotCWxkbyA3KCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIxOQotCWxkbyA2MyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyNSwyNiwlcjE5Ci0JemRlcCAlcjE5LDI1LDI2LCVyMjAKLQlsZG8gLTk2KCVyMzApLCVyMTkKLQlhZGQgJXIzMCwlcjIwLCVyMzAKLQlsZG8gNyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyOCwyOSwlcjE5Ci0JemRlcCAlcjE5LDI4LDI5LCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTIsJXIyNQotCWxkbyBSJ0xDJDAwMTIoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY2F0LCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDQoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY2F0LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAxMywlcjI1Ci0JbGRvIFInTEMkMDAxMyglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMDk4LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDE0LCVyMjYKLQlsZG8gUidMQyQwMDE0KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5ODogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JY29taWNsciw8PiAzLCVyMTksJXIwCi0JYmwgTCQwMDk5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA3LCVyMjYKLQlsZG8gUidMQyQwMDA3KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5OTogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjgKLQlibCxuIEwkMDA5NywlcjAKLUwkMDA5NzogCi0JbGR3IDE2KCVyNCksJXIxMQotCWxkdyAyMCglcjQpLCVyMTAKLQlsZHcgMjQoJXI0KSwlcjkKLQlsZHcgMjgoJXI0KSwlcjgKLQlsZHcgMzIoJXI0KSwlcjcKLQlsZHcgMzYoJXI0KSwlcjYKLQlsZHcgNDAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBjdXJyZW50X3RhcmdldCxEQVRBCi0JLklNUE9SVCBmZmx1c2gsQ09ERQotCS5JTVBPUlQgX19pb2IsREFUQQotCS5JTVBPUlQgZnByaW50ZixDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTU6IAotCS5TVFJJTkcgIlR5cGUgXHgwMCIKLQkuSU1QT1JUIHR5cGVfcHJpbnQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDE2OiAKLQkuU1RSSU5HICJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDE3OiAKLQkuU1RSSU5HICIgaXMgbm90IGEgc3RydWN0dXJlIG9yIHVuaW9uIHR5cGUuXHgwMCIKLQkuSU1QT1JUIGNoZWNrX3N0dWJfdHlwZSxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTg6IAotCS5TVFJJTkcgIiBoYXMgbm8gY29tcG9uZW50IG5hbWVkIFx4MDAiCi0JLklNUE9SVCBmcHV0c19maWx0ZXJlZCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTk6IAotCS5TVFJJTkcgIi5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfc3RydWN0X2VsdF90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKLWxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTEsMjQoJXI0KQotCXN0dyAlcjEwLDI4KCVyNCkKLQlzdHcgJXI5LDMyKCVyNCkKLQlzdHcgJXI4LDM2KCVyNCkKLQlzdHcgJXI3LDQwKCVyNCkKLQlzdHcgJXI2LDQ0KCVyNCkKLQlzdHcgJXI1LDQ4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMSwlcjIwLCVyMAotCWJsIEwkMDEwMiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAxNiglcjApLCVyMTkKLQljb21jbHIsPD4gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDEwMiwlcjAKLQlub3AKLQlibCxuIEwkMDEwMSwlcjAKLUwkMDEwMjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMCglcjE5KQotTCQwMTAxOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMywlcjIwLCVyMAotCWJsIEwkMDEwMywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNCwlcjIwLCVyMAotCWJsIEwkMDEwMywlcjAKLQlub3AKLQlhZGRpbCBMJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkLCVyMjcKLQlsZHcgUidjdXJyZW50X3RhcmdldC0kZ2xvYmFsJCglcjEpLCVyMTkKLQlsZHcgNzYoJXIxOSksJXIxMQotCWNvcHkgJXIxMSwlcjIyCi0JLkNBTEwJQVJHVzA9R1IKLQlibCAkJGR5bmNhbGwsJXIzMQotCWNvcHkgJXIzMSwlcjIKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzE2LCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCsxNiglcjEpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZmbHVzaCwlcjIKLQlub3AKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjYKLQlsZGlsIEwnTEMkMDAxNSwlcjI1Ci0JbGRvIFInTEMkMDAxNSglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBmcHJpbnRmLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDAxNiwlcjI1Ci0JbGRvIFInTEMkMDAxNiglcjI1KSwlcjI1Ci0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI0Ci0JbGRvIC0xKCVyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgdHlwZV9wcmludCwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDAxNywlcjI2Ci0JbGRvIFInTEMkMDAxNyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDEwMzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgY2hlY2tfc3R1Yl90eXBlLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzQoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsMTYsJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAxMDQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAwKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPj0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDEwNSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxMDcsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTA3LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyOAotCWJsLG4gTCQwMTAwLCVyMAotTCQwMTA3OiAKLUwkMDEwNjogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDEwNCwlcjAKLUwkMDEwNTogCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAxMDg6IAotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPD0gMCwlcjE5LCVyMAotCWJsIEwkMDEwOSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyA4KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3N0cnVjdF9lbHRfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwxNiglcjQpCi0JbGR3IDE2KCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDExMSwlcjAKLQlub3AKLQlsZHcgMTYoJXI0KSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMTE6IAotTCQwMTEwOiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTA4LCVyMAotTCQwMTA5OiAKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDExMiwlcjAKLQlub3AKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMTI6IAotCWFkZGlsIEwnY3VycmVudF90YXJnZXQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA3NiglcjE5KSwlcjExCi0JY29weSAlcjExLCVyMjIKLQkuQ0FMTAlBUkdXMD1HUgotCWJsICQkZHluY2FsbCwlcjMxCi0JY29weSAlcjMxLCVyMgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMTYsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzE2KCVyMSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmZsdXNoLCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE1LCVyMjUKLQlsZG8gUidMQyQwMDE1KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDE2LCVyMjUKLQlsZG8gUidMQyQwMDE2KCVyMjUpLCVyMjUKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjQKLQlsZG8gLTEoJXIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCB0eXBlX3ByaW50LCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE4LCVyMjUKLQlsZG8gUidMQyQwMDE4KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwMTksJXIyNgotCWxkbyBSJ0xDJDAwMTkoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi0JbGRvIC0xKCVyMCksJXIyOAotCWJsLG4gTCQwMTAwLCVyMAotTCQwMTAwOiAKLQlsZHcgMjQoJXI0KSwlcjExCi0JbGR3IDI4KCVyNCksJXIxMAotCWxkdyAzMiglcjQpLCVyOQotCWxkdyAzNiglcjQpLCVyOAotCWxkdyA0MCglcjQpLCVyNwotCWxkdyA0NCglcjQpLCVyNgotCWxkdyA0OCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgZmlsbF9pbl92cHRyX2ZpZWxkbm8sQ09ERQotCS5FWFBPUlQgZmlsbF9pbl92cHRyX2ZpZWxkbm8sRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUgotZmlsbF9pbl92cHRyX2ZpZWxkbm86IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0NCglcjE5KSwlcjIwCi0JY29taWNsciw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMTQsJXIwCi0Jbm9wCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi1MJDAxMTU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAwKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTE2LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmlsbF9pbl92cHRyX2ZpZWxkbm8sJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0JbGR3IDQ0KCVyMjApLCVyMTkKLQljb21pY2xyLDw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgOCglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjcsMjgsJXIyMgotCWxkdyAzNiglcjIwKSwlcjIxCi0JYWRkICVyMjIsJXIyMSwlcjIwCi0JbGR3IDgoJXIyMCksJXIyMQotCWxkdyA0NCglcjIxKSwlcjIwCi0Jc3R3ICVyMjAsNDQoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwyNywyOCwlcjIyCi0JbGR3IDM2KCVyMjApLCVyMjEKLQlhZGQgJXIyMiwlcjIxLCVyMjAKLQlsZHcgOCglcjIwKSwlcjIxCi0JbGR3IDQwKCVyMjEpLCVyMjAKLQlzdHcgJXIyMCw0MCglcjE5KQotCWJsLG4gTCQwMTE2LCVyMAotTCQwMTE4OiAKLUwkMDExNzogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTE1LCVyMAotTCQwMTE2OiAKLUwkMDExNDogCi1MJDAxMTM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuRVhQT1JUIHN0dWJfbm9uYW1lX2NvbXBsYWludCxEQVRBCi0JLmFsaWduIDQKLUxDJDAwMjA6IAotCS5TVFJJTkcgInN0dWIgdHlwZSBoYXMgTlVMTCBuYW1lXHgwMCIKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1zdHViX25vbmFtZV9jb21wbGFpbnQ6IAotCS53b3JkIExDJDAwMjAKLQkud29yZCAwCi0JLndvcmQgMAotCS5JTVBPUlQgY29tcGxhaW4sQ09ERQotCS5JTVBPUlQgbWVtY3B5LENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBjaGVja19zdHViX3R5cGUsQ09ERQotCS5FWFBPUlQgY2hlY2tfc3R1Yl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IKLWNoZWNrX3N0dWJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gNCglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMjAsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgdHlwZV9uYW1lX25vX3RhZywlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEyMSwlcjAKLQlub3AKLQlhZGRpbCBMJ3N0dWJfbm9uYW1lX2NvbXBsYWludC0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInc3R1Yl9ub25hbWVfY29tcGxhaW50LSRnbG9iYWwkKCVyMSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGNvbXBsYWluLCVyMgotCW5vcAotCWJsLG4gTCQwMTE5LCVyMAotTCQwMTIxOiAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyA4KCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTIyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDEyKCVyMjApLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1jcHksJXIyCi0Jbm9wCi1MJDAxMjI6IAotTCQwMTIwOiAKLUwkMDExOTogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgZ2RiX21hbmdsZV9uYW1lLENPREUKLQkuSU1QT1JUIGNwbHVzX2RlbWFuZ2xlLENPREUKLQkuYWxpZ24gNAotTEMkMDAyMTogCi0JLlNUUklORyAiSW50ZXJuYWw6IENhbm5vdCBkZW1hbmdsZSBtYW5nbGVkIG5hbWUgYCVzJy5ceDAwIgotCS5JTVBPUlQgc3RyY2hyLENPREUKLQkuSU1QT1JUIHBhcnNlX2FuZF9ldmFsX3R5cGUsQ09ERQotCS5JTVBPUlQgYnVpbHRpbl90eXBlX3ZvaWQsREFUQQotCS5JTVBPUlQgZnJlZSxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGNoZWNrX3N0dWJfbWV0aG9kLENPREUKLQkuRVhQT1JUIGNoZWNrX3N0dWJfbWV0aG9kLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLWNoZWNrX3N0dWJfbWV0aG9kOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjExLDY0KCVyNCkKLQlzdHcgJXIxMCw2OCglcjQpCi0Jc3R3ICVyOSw3MiglcjQpCi0Jc3R3ICVyOCw3NiglcjQpCi0Jc3R3ICVyNyw4MCglcjQpCi0Jc3R3ICVyNiw4NCglcjQpCi0Jc3R3ICVyNSw4OCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC0xMiglcjApLCVyOQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI5LCVyMTAKLQlzdHcgJXIyNCwwKCVyMTApCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC0xMiglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGR3IDAoJXIyMSksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgZ2RiX21hbmdsZV9uYW1lLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRvIDMoJXIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBjcGx1c19kZW1hbmdsZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwxNiglcjQpCi0Jc3R3ICVyMCwyOCglcjQpCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMzIoJXI0KQotCWxkdyAxNiglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEyNCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDAyMSwlcjI2Ci0JbGRvIFInTEMkMDAyMSglcjI2KSwlcjI2Ci0JbGR3IDEyKCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAxMjQ6IAotCWxkdyAxNiglcjQpLCVyMjYKLQlsZG8gNDAoJXIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjaHIsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyNCglcjQpCi1MJDAxMjU6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxMjYsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MCglcjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTI3LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTI4LCVyMAotTCQwMTI3OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQxKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMjksJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTMwLCVyMAotTCQwMTI5OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ0KCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMzEsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTMxLCVyMAotCW5vcAotCWxkdyAzMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMzIoJXI0KQotTCQwMTMxOiAKLUwkMDEzMDogCi1MJDAxMjg6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWJsLG4gTCQwMTI1LCVyMAotTCQwMTI2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMzcsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI0KQotCWxkdyA0NCglcjQpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjQpCi0JbGR3IDMyKCVyNCksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCXN0dyAlcjIwLDUyKCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNTIoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzMiwlcjAKLQlub3AKLQlsZHcgNDgoJXI0KSwlcjI2Ci0JbGR3IDUyKCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMTMzLCVyMAotTCQwMTMyOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxMzM6IAotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgNTIoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA0NCglcjQpLCVyMTkKLQlzdHcgJXIxOSw1NiglcjQpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw2MCglcjQpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDYwKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxMzQsJXIwCi0Jbm9wCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDEzNDogCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgNTYoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDU2KCVyNCksJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTM1LCVyMAotCW5vcAotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxMzYsJXIwCi1MJDAxMzU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDEzNjogCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgNjAoJXI0KSwlcjExCi0JYmwsbiBMJDAxMzgsJXIwCi1MJDAxMzc6IAotCWxkdyAzMiglcjQpLCVyMjAKLQlsZG8gMiglcjIwKSwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMjAKLQljb3B5ICVyMjAsJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotTCQwMTM4OiAKLQlzdHcgJXIxMSwzNiglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCXN0dyAlcjE5LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBsb29rdXBfcG9pbnRlcl90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGR3IDM2KCVyNCksJXIyMAotCXN0dyAlcjE5LDAoJXIyMCkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSwzMiglcjQpCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzOSwlcjAKLQlub3AKLQlzdHcgJXIwLDI4KCVyNCkKLUwkMDE0MDogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDE0MSwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JY29taWNsciw+PSAwLCVyMTksJXIwCi0JYmwgTCQwMTQyLCVyMAotCW5vcAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDQoJXIwKSwlcjIwCi0JY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDMsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0MywlcjAKLQlub3AKLQlibCxuIEwkMDE0MiwlcjAKLUwkMDE0MzogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjI2Ci0JY29weSAlcjE5LCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHBhcnNlX2FuZF9ldmFsX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZHcgMzIoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjEKLQlsZHcgMzYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0Jc3R3ICVyMTksMCglcjIwKQotCWxkdyAzMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMzIoJXI0KQotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjAoJXI0KQotTCQwMTQyOiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQwKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDQsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi0JYmwsbiBMJDAxNDUsJXIwCi1MJDAxNDQ6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDEoJXIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0NiwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi1MJDAxNDY6IAotTCQwMTQ1OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlibCxuIEwkMDE0MCwlcjAKLUwkMDE0MTogCi1MJDAxMzk6IAotCWxkbyAtMiglcjApLCVyMTkKLQlsZHcgMjQoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ2KCVyMCksJXIyMAotCWNvbWNsciw8PiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTQ3LCVyMAotCW5vcAotCWxkdyAzMiglcjQpLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWxkdyAzNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV92b2lkLSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfdm9pZC0kZ2xvYmFsJCglcjEpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JYmwsbiBMJDAxNDgsJXIwCi1MJDAxNDc6IAotCWxkdyAzMiglcjQpLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWxkdyAzNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlzdHcgJXIwLDAoJXIxOSkKLUwkMDE0ODogCi0JbGR3IDE2KCVyNCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JemRlcCAlcjIxLDMwLDMxLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAyMCglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGR3IDQoJXIxOSksJXIyMAotCXN0dyAlcjIwLDQwKCVyNCkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkdyAzNiglcjQpLCVyMjAKLQlzdHcgJXIyMCw0OCglcjE5KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGRoIDMyKCVyMjApLCVyMjEKLQljb3B5ICVyMjEsJXIyMAotCWRlcGkgMCwyOSwxLCVyMjAKLQlzdGggJXIyMCwzMiglcjE5KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIDAsNCwxLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotTCQwMTIzOiAKLQlsZHcgNjQoJXI0KSwlcjExCi0JbGR3IDY4KCVyNCksJXIxMAotCWxkdyA3MiglcjQpLCVyOQotCWxkdyA3NiglcjQpLCVyOAotCWxkdyA4MCglcjQpLCVyNwotCWxkdyA4NCglcjQpLCVyNgotCWxkdyA4OCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUsQ09ERQotCS5FWFBPUlQgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUgotYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOCwzMiglcjQpCi0Jc3R3ICVyNywzNiglcjQpCi0Jc3R3ICVyNiw0MCglcjQpCi0Jc3R3ICVyNSw0NCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JbGRpbCBMJ2NwbHVzX3N0cnVjdF9kZWZhdWx0LCVyMjAKLQlsZG8gUidjcGx1c19zdHJ1Y3RfZGVmYXVsdCglcjIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE1MCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjcKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxNTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI0KQotCWxkbyAyNCglcjApLCVyMTkKLQlzdHcgJXIxOSwxNiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNTEsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAxNiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDE1MiwlcjAKLUwkMDE1MTogCi0JY29weSAlcjAsJXIxOQotTCQwMTUyOiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDI0KCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNTMsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDE1MzogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTU0LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxNTUsJXIwCi1MJDAxNTQ6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE1NTogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMjQoJXI0KSwlcjgKLQlibCxuIEwkMDE1NywlcjAKLUwkMDE1NjogCi0JbGRvIDI0KCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI4Ci1MJDAxNTc6IAotCXN0dyAlcjgsNDgoJXI3KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaWwgTCdjcGx1c19zdHJ1Y3RfZGVmYXVsdCwlcjE5Ci0JY29weSAlcjIwLCVyMjEKLQlsZG8gUidjcGx1c19zdHJ1Y3RfZGVmYXVsdCglcjE5KSwlcjIyCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlsZHdzLG1hIDQoJXIyMiksJXIyMAotCXN0d3MsbWEgJXIxOSw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlzdHdzLG1hICVyMjAsNCglcjIxKQotCWxkd3MsbWEgNCglcjIyKSwlcjIwCi0Jc3R3cyxtYSAlcjE5LDQoJXIyMSkKLQlsZHdzLG1hIDQoJXIyMiksJXIxOQotCXN0d3MsbWEgJXIyMCw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMjAKLQlzdHdzLG1hICVyMTksNCglcjIxKQotCXN0dyAlcjIwLDAoJXIyMSkKLUwkMDE1MDogCi1MJDAxNDk6IAotCWxkdyAzMiglcjQpLCVyOAotCWxkdyAzNiglcjQpLCVyNwotCWxkdyA0MCglcjQpLCVyNgotCWxkdyA0NCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIG9ic2F2ZXN0cmluZyxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGluaXRfdHlwZSxDT0RFCi0JLkVYUE9SVCBpbml0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUixSVE5WQUw9R1IKLWluaXRfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxNCw4KCVyNCkKLQlzdHcgJXIxMywxMiglcjQpCi0Jc3R3ICVyMTIsMTYoJXI0KQotCXN0dyAlcjExLDIwKCVyNCkKLQlzdHcgJXIxMCwyNCglcjQpCi0Jc3R3ICVyOSwyOCglcjQpCi0Jc3R3ICVyOCwzMiglcjQpCi0Jc3R3ICVyNywzNiglcjQpCi0Jc3R3ICVyNiw0MCglcjQpCi0Jc3R3ICVyNSw0NCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC0xMiglcjApLCVyOQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI5LCVyMTAKLQlzdHcgJXIyNCwwKCVyMTApCi0JbGRvIC0xNiglcjApLCVyMTEKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyMTEsJXIxMgotCXN0dyAlcjIzLDAoJXIxMikKLQlsZG8gLTIwKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMwotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTMpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXIxMykKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRoIDMyKCVyMTMpLCVyMjAKLQlsZGggMiglcjE5KSwlcjE5Ci0Jb3IgJXIyMCwlcjE5LCVyMjAKLQlzdGggJXIyMCwzMiglcjEzKQotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU5LCVyMAotCW5vcAotCWxkbyAtMjAoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU5LCVyMAotCW5vcAotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTQKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgc3RybGVuLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGRvIC0yMCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gMTIwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE0KSwlcjI2Ci0JY29weSAlcjE5LCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgb2JzYXZlc3RyaW5nLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0Jc3R3ICVyMTksNCglcjEzKQotCWJsLG4gTCQwMTYwLCVyMAotTCQwMTU5OiAKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDQoJXIxMykKLUwkMDE2MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMywlcjIwLCVyMAotCWJsIEwkMDE2MiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMTYyLCVyMAotCW5vcAotCWJsLG4gTCQwMTYxLCVyMAotTCQwMTYyOiAKLQlsZGlsIEwnY3BsdXNfc3RydWN0X2RlZmF1bHQsJXIxOQotCWxkbyBSJ2NwbHVzX3N0cnVjdF9kZWZhdWx0KCVyMTkpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjEzKQotTCQwMTYxOiAKLQljb3B5ICVyMTMsJXIyOAotCWJsLG4gTCQwMTU4LCVyMAotTCQwMTU4OiAKLQlsZHcgOCglcjQpLCVyMTQKLQlsZHcgMTIoJXI0KSwlcjEzCi0JbGR3IDE2KCVyNCksJXIxMgotCWxkdyAyMCglcjQpLCVyMTEKLQlsZHcgMjQoJXI0KSwlcjEwCi0JbGR3IDI4KCVyNCksJXI5Ci0JbGR3IDMyKCVyNCksJXI4Ci0JbGR3IDM2KCVyNCksJXI3Ci0JbGR3IDQwKCVyNCksJXI2Ci0JbGR3IDQ0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDIyOiAKLQkuU1RSSU5HICJpbnRlcm5hbCBlcnJvciAtIGludmFsaWQgZnVuZGFtZW50YWwgdHlwZSBpZCAlZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjM6IAotCS5TVFJJTkcgImludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgdHlwZSBpZCAlZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjQ6IAotCS5TVFJJTkcgInZvaWRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI1OiAKLQkuU1RSSU5HICJib29sZWFuXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNjogCi0JLlNUUklORyAic3RyaW5nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNzogCi0JLlNUUklORyAiY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjg6IAotCS5TVFJJTkcgInNpZ25lZCBjaGFyXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyOTogCi0JLlNUUklORyAidW5zaWduZWQgY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzA6IAotCS5TVFJJTkcgInNob3J0XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzMTogCi0JLlNUUklORyAidW5zaWduZWQgc2hvcnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMyOiAKLQkuU1RSSU5HICJpbnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMzOiAKLQkuU1RSSU5HICJ1bnNpZ25lZCBpbnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM0OiAKLQkuU1RSSU5HICJmaXhlZCBkZWNpbWFsXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzNTogCi0JLlNUUklORyAibG9uZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzY6IAotCS5TVFJJTkcgInVuc2lnbmVkIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM3OiAKLQkuU1RSSU5HICJsb25nIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM4OiAKLQkuU1RSSU5HICJzaWduZWQgbG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzOTogCi0JLlNUUklORyAidW5zaWduZWQgbG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MDogCi0JLlNUUklORyAiZmxvYXRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQxOiAKLQkuU1RSSU5HICJkb3VibGVceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQyOiAKLQkuU1RSSU5HICJmbG9hdGluZyBkZWNpbWFsXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MzogCi0JLlNUUklORyAibG9uZyBkb3VibGVceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ0OiAKLQkuU1RSSU5HICJjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0NTogCi0JLlNUUklORyAiZG91YmxlIGNvbXBsZXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ2OiAKLQkuU1RSSU5HICJsb25nIGRvdWJsZSBjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9mdW5kYW1lbnRhbF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEyLDMyKCVyNCkKLQlzdHcgJXIxMSwzNiglcjQpCi0Jc3R3ICVyMTAsNDAoJXI0KQotCXN0dyAlcjksNDQoJXI0KQotCXN0dyAlcjgsNDgoJXI0KQotCXN0dyAlcjcsNTIoJXI0KQotCXN0dyAlcjYsNTYoJXI0KQotCXN0dyAlcjUsNjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWNvcHkgJXIwLCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw9IDAsJXIyMCwlcjAKLQlibCBMJDAxNjUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyNSglcjApLCVyMTkKLQljb21jbHIsPD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDE2NSwlcjAKLQlub3AKLQlibCxuIEwkMDE2NCwlcjAKLUwkMDE2NTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMjIsJXIyNgotCWxkbyBSJ0xDJDAwMjIoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotCWJsLG4gTCQwMTY2LCVyMAotTCQwMTY0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDE5NiglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAxNjcsJXIwCi0Jbm9wCi0JbGRvIDEwNCglcjApLCVyMTEKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjEyCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxMjAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyNCkKLQlzdHcgJXIxMSwxNiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNjgsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAxNiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDE2OSwlcjAKLUwkMDE2ODogCi0JY29weSAlcjAsJXIxOQotTCQwMTY5OiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDI0KCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNzAsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDE3MDogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTcxLCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxNzIsJXIwCi1MJDAxNzE6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE3MjogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMjQoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTk2KCVyMTIpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxOTYoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMTEsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotTCQwMTY3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JbGR3IDE5NiglcjE5KSwlcjE5Ci0JYWRkICVyMjAsJXIxOSwlcjEwCi0JbGR3IDAoJXIxMCksJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDE3MywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JYWRkaSx1diAtMjYsJXIyMCwlcjAKLQlibHIsbiAlcjIwLCVyMAotCWIsbiBMJDAxNzUKLUwkMDIwMjogCi0JYiBMJDAxNzYKLQlub3AKLQliIEwkMDE3NwotCW5vcAotCWIgTCQwMTc5Ci0Jbm9wCi0JYiBMJDAxODAKLQlub3AKLQliIEwkMDE4MQotCW5vcAotCWIgTCQwMTgyCi0Jbm9wCi0JYiBMJDAxODMKLQlub3AKLQliIEwkMDE4NAotCW5vcAotCWIgTCQwMTg1Ci0Jbm9wCi0JYiBMJDAxODYKLQlub3AKLQliIEwkMDE4NwotCW5vcAotCWIgTCQwMTg5Ci0Jbm9wCi0JYiBMJDAxOTAKLQlub3AKLQliIEwkMDE5MQotCW5vcAotCWIgTCQwMTkyCi0Jbm9wCi0JYiBMJDAxOTMKLQlub3AKLQliIEwkMDE5NAotCW5vcAotCWIgTCQwMTk1Ci0Jbm9wCi0JYiBMJDAxOTYKLQlub3AKLQliIEwkMDE5OAotCW5vcAotCWIgTCQwMTk5Ci0Jbm9wCi0JYiBMJDAyMDAKLQlub3AKLQliIEwkMDIwMQotCW5vcAotCWIgTCQwMTc4Ci0Jbm9wCi0JYiBMJDAxODgKLQlub3AKLQliIEwkMDE5NwotCW5vcAotTCQwMTc1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAyMywlcjI2Ci0JbGRvIFInTEMkMDAyMyglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOSglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjQsJXIyMwotCWxkbyBSJ0xDJDAwMjQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE3NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI1LCVyMjMKLQlsZG8gUidMQyQwMDI1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gMTIoJXIwKSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDI2LCVyMjMKLQlsZG8gUidMQyQwMDI2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjcsJXIyMwotCWxkbyBSJ0xDJDAwMjcoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI4LCVyMjMKLQlsZG8gUidMQyQwMDI4KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAyOSwlcjIzCi0JbGRvIFInTEMkMDAyOSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTgyOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDMwLCVyMjMKLQlsZG8gUidMQyQwMDMwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMiglcjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzMCwlcjIzCi0JbGRvIFInTEMkMDAzMCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzEsJXIyMwotCWxkbyBSJ0xDJDAwMzEoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzMiwlcjIzCi0JbGRvIFInTEMkMDAzMiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzIsJXIyMwotCWxkbyBSJ0xDJDAwMzIoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDMzLCVyMjMKLQlsZG8gUidMQyQwMDMzKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzQsJXIyMwotCWxkbyBSJ0xDJDAwMzQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4OTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzNSwlcjIzCi0JbGRvIFInTEMkMDAzNSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTkwOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzUsJXIyMwotCWxkbyBSJ0xDJDAwMzUoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM2LCVyMjMKLQlsZG8gUidMQyQwMDM2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTI6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzcsJXIyMwotCWxkbyBSJ0xDJDAwMzcoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM4LCVyMjMKLQlsZG8gUidMQyQwMDM4KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzOSwlcjIzCi0JbGRvIFInTEMkMDAzOSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQwLCVyMjMKLQlsZG8gUidMQyQwMDQwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDEsJXIyMwotCWxkbyBSJ0xDJDAwNDEoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MiwlcjIzCi0JbGRvIFInTEMkMDA0MiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDE2KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MywlcjIzCi0JbGRvIFInTEMkMDA0MyglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk5OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ0LCVyMjMKLQlsZG8gUidMQyQwMDQ0KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAyMDA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ1LCVyMjMKLQlsZG8gUidMQyQwMDQ1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAyMDE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ2LCVyMjMKLQlsZG8gUidMQyQwMDQ2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzQ6IAotCXN0dyAlcjksMCglcjEwKQotTCQwMTczOiAKLUwkMDE2NjogCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMTYzLCVyMAotTCQwMTYzOiAKLQlsZHcgMzIoJXI0KSwlcjEyCi0JbGR3IDM2KCVyNCksJXIxMQotCWxkdyA0MCglcjQpLCVyMTAKLQlsZHcgNDQoJXI0KSwlcjkKLQlsZHcgNDgoJXI0KSwlcjgKLQlsZHcgNTIoJXI0KSwlcjcKLQlsZHcgNTYoJXI0KSwlcjYKLQlsZHcgNjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBwdXRzX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA0NzogCi0JLlNUUklORyAiIFx4MDAiCi0JLklNUE9SVCBwcmludGZfZmlsdGVyZWQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDQ4OiAKLQkuU1RSSU5HICIxXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0OTogCi0JLlNUUklORyAiMFx4MDAiCi0JLmFsaWduIDQKLXByaW50X2JpdF92ZWN0b3I6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCwxNiglcjQpCi0Jc3R3ICVyNywyMCglcjQpCi0Jc3R3ICVyNiwyNCglcjQpCi0Jc3R3ICVyNSwyOCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0Jc3R3ICVyMCw4KCVyNCkKLUwkMDIwNDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JbGR3IDAoJXIxOSksJXIxOQotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyMDUsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JY29taWNsciw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMDgsJXIwCi0Jbm9wCi0JbGRvIDcoJXIxOSksJXIxOQotTCQwMjA4OiAKLQlleHRycyAlcjE5LDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMjA3LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDQ3LCVyMjYKLQlsZG8gUidMQyQwMDQ3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMDc6IAotCWxkdyA4KCVyNCksJXIyMAotCWV4dHJzICVyMjAsMjgsMjksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlhZGQgJXIxOSwlcjIxLCVyMjAKLQlsZGIgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JZXh0cnUgJXIyMCwzMSwzLCVyMjEKLQlzdWJpLD4+PSAzMSwlcjIxLCVyMjAKLQljb3B5ICVyMCwlcjIwCi0JbXRzYXIgJXIyMAotCXZleHRycyAlcjE5LDMyLCVyMTkKLQlleHRydSAlcjE5LDMxLDEsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIwOSwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA0OCwlcjI2Ci0JbGRvIFInTEMkMDA0OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMTAsJXIwCi1MJDAyMDk6IAotCWxkaWwgTCdMQyQwMDQ5LCVyMjYKLQlsZG8gUidMQyQwMDQ5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIxMDogCi1MJDAyMDY6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDIwNCwlcjAKLUwkMDIwNTogCi1MJDAyMDM6IAotCWxkdyAxNiglcjQpLCVyOAotCWxkdyAyMCglcjQpLCVyNwotCWxkdyAyNCglcjQpLCVyNgotCWxkdyAyOCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsQ09ERQotCS5hbGlnbiA0Ci1wcmludF9hcmdfdHlwZXM6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCw4KCVyNCkKLQlzdHcgJXI3LDEyKCVyNCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjEyLCVyMAotCW5vcAotTCQwMjEzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIxNCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA0KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gOSwlcjIwLCVyMAotCWJsIEwkMDIxNSwlcjAKLQlub3AKLQlibCxuIEwkMDIxNCwlcjAKLUwkMDIxNTogCi0JYmwsbiBMJDAyMTMsJXIwCi1MJDAyMTQ6IAotTCQwMjEyOiAKLUwkMDIxMTogCi0JbGR3IDgoJXI0KSwlcjgKLQlsZHcgMTIoJXI0KSwlcjcKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBwcmludGZpX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA1MDogCi0JLlNUUklORyAiZm5fZmllbGRsaXN0cyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTE6IAotCS5TVFJJTkcgIlslZF0gbmFtZSAnJXMnICgweCV4KSBsZW5ndGggJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1MjogCi0JLlNUUklORyAiWyVkXSBwaHlzbmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDUzOiAKLQkuU1RSSU5HICJ0eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NDogCi0JLlNUUklORyAiYXJncyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTU6IAotCS5TVFJJTkcgImZjb250ZXh0IDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NjogCi0JLlNUUklORyAiaXNfY29uc3QgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NzogCi0JLlNUUklORyAiaXNfdm9sYXRpbGUgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1ODogCi0JLlNUUklORyAiaXNfcHJpdmF0ZSAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU5OiAKLQkuU1RSSU5HICJpc19wcm90ZWN0ZWQgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MDogCi0JLlNUUklORyAiaXNfc3R1YiAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDYxOiAKLQkuU1RSSU5HICJ2b2Zmc2V0ICV1XHgwYVx4MDAiCi0JLmFsaWduIDQKLWR1bXBfZm5fZmllbGRsaXN0czogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTAsJXIyNQotCWxkbyBSJ0xDJDAwNTAoJXIyNSksJXIyNQotCWxkdyAyMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsOCglcjQpCi1MJDAyMTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMjE4LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjQpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMzAsMzEsJXIyMQotCWFkZCAlcjIxLCVyMjIsJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIxCi0JbGR3IDIwKCVyMjApLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQ4KCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjMKLQl6ZGVwICVyMjMsMzAsMzEsJXIyMgotCWFkZCAlcjIyLCVyMjMsJXIyMgotCXpkZXAgJXIyMiwyOSwzMCwlcjIyCi0JbGR3IDIwKCVyMjEpLCVyMjMKLQlhZGQgJXIyMiwlcjIzLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIzCi0JemRlcCAlcjIzLDMwLDMxLCVyMjIKLQlhZGQgJXIyMiwlcjIzLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMgotCWxkdyAyMCglcjIxKSwlcjIzCi0JYWRkICVyMjIsJXIyMywlcjIxCi0JbGR3IDQoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01NiglcjMwKQotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTEsJXIyNQotCWxkbyBSJ0xDJDAwNTEoJXIyNSksJXIyNQotCWxkdyA4KCVyNCksJXIyNAotCWxkdyAwKCVyMjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0Jc3R3ICVyMCwxMiglcjQpCi1MJDAyMjA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgNCglcjE5KSwlcjE5Ci0JY29tY2xyLDwgJXIyMCwlcjE5LCVyMAotCWJsIEwkMDIyMSwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDQoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxMiglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMQotCWFkZCAlcjIxLCVyMjIsJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDUyLCVyMjUKLQlsZG8gUidMQyQwMDUyKCVyMjUpLCVyMjUKLQlsZHcgMTIoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTMsJXIyNQotCWxkbyBSJ0xDJDAwNTMoJXIyNSksJXIyNQotCWxkdyA0KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjE5Ci0JYWRkICVyMTksJXIyMCwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAxMCglcjIxKSwlcjIwCi0JbGR3IDQoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjAsJXIyMiwlcjIxCi0JbGR3IDQoJXIyMSksJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTQsJXIyNQotCWxkbyBSJ0xDJDAwNTQoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjE5LCVyMjEsJXIyMAotCWxkdyA0KCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgNDgoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2FyZ190eXBlcywlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTUsJXIyNQotCWxkbyBSJ0xDJDAwNTUoJXIyNSksJXIyNQotCWxkdyAxMiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDArMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTYsJXIyNQotCWxkbyBSJ0xDJDAwNTYoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDErMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTcsJXIyNQotCWxkbyBSJ0xDJDAwNTcoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDIrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTgsJXIyNQotCWxkbyBSJ0xDJDAwNTgoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDMrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTksJXIyNQotCWxkbyBSJ0xDJDAwNTkoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDQrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjAsJXIyNQotCWxkbyBSJ0xDJDAwNjAoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDgrMjQtMSwyNCwlcjIyCi0JbGRvIC0yKCVyMjIpLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDYxLCVyMjUKLQlsZG8gUidMQyQwMDYxKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyMjogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JYmwsbiBMJDAyMjAsJXIwCi1MJDAyMjE6IAotTCQwMjE5OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAyMTcsJXIwCi1MJDAyMTg6IAotTCQwMjE2OiAKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwNjI6IAotCS5TVFJJTkcgIm5fYmFzZWNsYXNzZXMgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MzogCi0JLlNUUklORyAibmZuX2ZpZWxkcyAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY0OiAKLQkuU1RSSU5HICJuZm5fZmllbGRzX3RvdGFsICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjU6IAotCS5TVFJJTkcgInZpcnR1YWxfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqMHgleClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY2OiAKLQkuU1RSSU5HICJceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2NzogCi0JLlNUUklORyAicHJpdmF0ZV9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjg6IAotCS5TVFJJTkcgInByb3RlY3RlZF9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLXByaW50X2NwbHVzX3N0dWZmOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsMTYoJXI0KQotCXN0dyAlcjcsMjAoJXI0KQotCXN0dyAlcjYsMjQoJXI0KQotCXN0dyAlcjUsMjgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjIsJXIyNQotCWxkbyBSJ0xDJDAwNjIoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAyKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjMsJXIyNQotCWxkbyBSJ0xDJDAwNjMoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZHcgNDgoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NCwlcjI1Ci0JbGRvIFInTEMkMDA2NCglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjQsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjIxCi0JbGRoIDAoJXIyMSksJXIyMgotCWV4dHJzICVyMjIsMzEsMTYsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNDgoJXIyMiksJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NSwlcjI1Ci0JbGRvIFInTEMkMDA2NSglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQlsZHcgOCglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgOCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzNCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjUsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMjYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY3LCVyMjUKLQlsZG8gUidMQyQwMDY3KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAxMiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAxMiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMjcsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY4LCVyMjUKLQlsZG8gUidMQyQwMDY4KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAxNiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAxNiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNzogCi1MJDAyMjU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQljb21pY2xyLDwgMCwlcjE5LCVyMAotCWJsIEwkMDIyOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZHVtcF9mbl9maWVsZGxpc3RzLCVyMgotCW5vcAotTCQwMjI4OiAKLUwkMDIyMzogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDY5OiAKLQkuU1RSSU5HICJ0eXBlIG5vZGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDcwOiAKLQkuU1RSSU5HICJuYW1lICclcycgKDB4JXgpXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzE6IAotCS5TVFJJTkcgIjxOVUxMPlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzI6IAotCS5TVFJJTkcgImNvZGUgMHgleCBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDczOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1VOREVGKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzQ6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUFRSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzU6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQVJSQVkpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NjogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9TVFJVQ1QpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9VTklPTilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc4OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0VOVU0pXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3OTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9GVU5DKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODA6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfSU5UKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODE6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRkxUKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODI6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfVk9JRClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDgzOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1NFVClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg0OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1JBTkdFKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODU6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUEFTQ0FMX0FSUkFZKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODY6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRVJST1IpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4NzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9NRU1CRVIpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4ODogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9NRVRIT0QpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4OTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9SRUYpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MDogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9DSEFSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTE6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQk9PTClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDkyOiAKLQkuU1RSSU5HICIoVU5LTk9XTiBUWVBFIENPREUpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MzogCi0JLlNUUklORyAibGVuZ3RoICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTQ6IAotCS5TVFJJTkcgIm9iamZpbGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk1OiAKLQkuU1RSSU5HICJ0YXJnZXRfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTY6IAotCS5TVFJJTkcgInBvaW50ZXJfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTc6IAotCS5TVFJJTkcgInJlZmVyZW5jZV90eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5ODogCi0JLlNUUklORyAiZnVuY3Rpb25fdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTk6IAotCS5TVFJJTkcgImZsYWdzIDB4JXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAwOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1VOU0lHTkVEXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwMTogCi0JLlNUUklORyAiIFRZUEVfRkxBR19TSUdORURceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAyOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1NUVUJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAzOiAKLQkuU1RSSU5HICJuZmllbGRzICVkIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNDogCi0JLlNUUklORyAiWyVkXSBiaXRwb3MgJWQgYml0c2l6ZSAlZCB0eXBlIDB4JXggbmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA1OiAKLQkuU1RSSU5HICJ2cHRyX2Jhc2V0eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNjogCi0JLlNUUklORyAidnB0cl9maWVsZG5vICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDc6IAotCS5TVFJJTkcgImFyZ190eXBlcyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDg6IAotCS5TVFJJTkcgImNwbHVzX3N0dWZmIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwOTogCi0JLlNUUklORyAidHlwZV9zcGVjaWZpYyAweCV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDExMDogCi0JLlNUUklORyAiICh1bmtub3duIGRhdGEgZm9ybSlceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCByZWN1cnNpdmVfZHVtcF90eXBlLENPREUKLQkuRVhQT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUgotcmVjdXJzaXZlX2R1bXBfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDE2KCVyNCkKLQlzdHcgJXI3LDIwKCVyNCkKLQlzdHcgJXI2LDI0KCVyNCkKLQlzdHcgJXI1LDI4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjksJXIyNQotCWxkbyBSJ0xDJDAwNjkoJXIyNSksJXIyNQotCWxkdyAwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNCglcjIyKSwlcjIxCi0JbGRvIC00KCVyMCksJXIyMgotCWxkbyAtMzIoJXI0KSwlcjI0Ci0JYWRkICVyMjQsJXIyMiwlcjIzCi0JbGR3IDAoJXIyMyksJXIyMgotCWxkdyA0KCVyMjIpLCVyMjMKLQljb21pY2xyLD0gMCwlcjIzLCVyMAotCWJsIEwkMDIzMCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA3MSwlcjIxCi0JbGRvIFInTEMkMDA3MSglcjIxKSwlcjIxCi1MJDAyMzA6IAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA3MCwlcjI1Ci0JbGRvIFInTEMkMDA3MCglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCWNvcHkgJXIyMSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNzIsJXIyNQotCWxkbyBSJ0xDJDAwNzIoJXIyNSksJXIyNQotCWxkdyAwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlhZGRpLHV2IC0xOSwlcjIwLCVyMAotCWJscixuICVyMjAsJXIwCi0JYixuIEwkMDI1MQotTCQwMjUyOiAKLQliIEwkMDIzMgotCW5vcAotCWIgTCQwMjMzCi0Jbm9wCi0JYiBMJDAyMzQKLQlub3AKLQliIEwkMDIzNQotCW5vcAotCWIgTCQwMjM2Ci0Jbm9wCi0JYiBMJDAyMzcKLQlub3AKLQliIEwkMDIzOAotCW5vcAotCWIgTCQwMjM5Ci0Jbm9wCi0JYiBMJDAyNDAKLQlub3AKLQliIEwkMDI0MQotCW5vcAotCWIgTCQwMjQyCi0Jbm9wCi0JYiBMJDAyNDMKLQlub3AKLQliIEwkMDI0NAotCW5vcAotCWIgTCQwMjQ1Ci0Jbm9wCi0JYiBMJDAyNDYKLQlub3AKLQliIEwkMDI0NwotCW5vcAotCWIgTCQwMjQ4Ci0Jbm9wCi0JYiBMJDAyNDkKLQlub3AKLQliIEwkMDI1MAotCW5vcAotTCQwMjMyOiAKLQlsZGlsIEwnTEMkMDA3MywlcjI2Ci0JbGRvIFInTEMkMDA3MyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzM6IAotCWxkaWwgTCdMQyQwMDc0LCVyMjYKLQlsZG8gUidMQyQwMDc0KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNDogCi0JbGRpbCBMJ0xDJDAwNzUsJXIyNgotCWxkbyBSJ0xDJDAwNzUoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM1OiAKLQlsZGlsIEwnTEMkMDA3NiwlcjI2Ci0JbGRvIFInTEMkMDA3NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzY6IAotCWxkaWwgTCdMQyQwMDc3LCVyMjYKLQlsZG8gUidMQyQwMDc3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNzogCi0JbGRpbCBMJ0xDJDAwNzgsJXIyNgotCWxkbyBSJ0xDJDAwNzgoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM4OiAKLQlsZGlsIEwnTEMkMDA3OSwlcjI2Ci0JbGRvIFInTEMkMDA3OSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzk6IAotCWxkaWwgTCdMQyQwMDgwLCVyMjYKLQlsZG8gUidMQyQwMDgwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MDogCi0JbGRpbCBMJ0xDJDAwODEsJXIyNgotCWxkbyBSJ0xDJDAwODEoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQxOiAKLQlsZGlsIEwnTEMkMDA4MiwlcjI2Ci0JbGRvIFInTEMkMDA4MiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDI6IAotCWxkaWwgTCdMQyQwMDgzLCVyMjYKLQlsZG8gUidMQyQwMDgzKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MzogCi0JbGRpbCBMJ0xDJDAwODQsJXIyNgotCWxkbyBSJ0xDJDAwODQoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ0OiAKLQlsZGlsIEwnTEMkMDA4NSwlcjI2Ci0JbGRvIFInTEMkMDA4NSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDU6IAotCWxkaWwgTCdMQyQwMDg2LCVyMjYKLQlsZG8gUidMQyQwMDg2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0NjogCi0JbGRpbCBMJ0xDJDAwODcsJXIyNgotCWxkbyBSJ0xDJDAwODcoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ3OiAKLQlsZGlsIEwnTEMkMDA4OCwlcjI2Ci0JbGRvIFInTEMkMDA4OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDg6IAotCWxkaWwgTCdMQyQwMDg5LCVyMjYKLQlsZG8gUidMQyQwMDg5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0OTogCi0JbGRpbCBMJ0xDJDAwOTAsJXIyNgotCWxkbyBSJ0xDJDAwOTAoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjUwOiAKLQlsZGlsIEwnTEMkMDA5MSwlcjI2Ci0JbGRvIFInTEMkMDA5MSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNTE6IAotCWxkaWwgTCdMQyQwMDkyLCVyMjYKLQlsZG8gUidMQyQwMDkyKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzMTogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDkzLCVyMjUKLQlsZG8gUidMQyQwMDkzKCVyMjUpLCVyMjUKLQlsZHcgOCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTQsJXIyNQotCWxkbyBSJ0xDJDAwOTQoJXIyNSksJXIyNQotCWxkdyAxMiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTUsJXIyNQotCWxkbyBSJ0xDJDAwOTUoJXIyNSksJXIyNQotCWxkdyAxNiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTYoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1MywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotTCQwMjUzOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk2LCVyMjUKLQlsZG8gUidMQyQwMDk2KCVyMjUpLCVyMjUKLQlsZHcgMjAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk3LCVyMjUKLQlsZG8gUidMQyQwMDk3KCVyMjUpLCVyMjUKLQlsZHcgMjQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk4LCVyMjUKLQlsZG8gUidMQyQwMDk4KCVyMjUpLCVyMjUKLQlsZHcgMjgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDMyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTksJXIyNQotCWxkbyBSJ0xDJDAwOTkoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMzEsMSwlcjE5Ci0JZXh0cnMgJXIxOSwzMSwxNiwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjU0LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTAwLCVyMjYKLQlsZG8gUidMQyQwMTAwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyNTQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWxkbyAyKCVyMCksJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIxOQotCWV4dHJzICVyMTksMzEsMTYsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1NSwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDEwMSwlcjI2Ci0JbGRvIFInTEMkMDEwMSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjU1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gNCglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNTYsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAxMDIsJXIyNgotCWxkbyBSJ0xDJDAxMDIoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI1NjogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDM0KCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTAzLCVyMjUKLQlsZG8gUidMQyQwMTAzKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAzNiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsOCglcjQpCi1MJDAyNTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzQoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyNTgsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI3LDI4LCVyMjIKLQlsZHcgMzYoJXIyMCksJXIyMQotCWFkZCAlcjIyLCVyMjEsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDQoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDgoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01NiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDEyKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNjAoJXIzMCkKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI3LDI4LCVyMjMKLQlsZHcgMzYoJXIyMSksJXIyMgotCWFkZCAlcjIzLCVyMjIsJXIyMQotCWxkdyAxMiglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTY0KCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwyNywyOCwlcjIzCi0JbGR3IDM2KCVyMjEpLCVyMjIKLQlhZGQgJXIyMywlcjIyLCVyMjEKLQlsZHcgMTIoJXIyMSksJXIyMgotCWNvbWljbHIsPSAwLCVyMjIsJXIwCi0JYmwgTCQwMjYwLCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDcxLCVyMjEKLQlsZG8gUidMQyQwMDcxKCVyMjEpLCVyMjEKLQlzdHcgJXIyMSwtNjQoJXIzMCkKLUwkMDI2MDogCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDEwNCwlcjI1Ci0JbGRvIFInTEMkMDEwNCglcjI1KSwlcjI1Ci0JbGR3IDgoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNjEsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDQoJXIyMSksJXIyMAotCWxkdyA4KCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKLQlub3AKLUwkMDI2MTogCi1MJDAyNTk6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDI1NywlcjAKLUwkMDI1ODogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwNSwlcjI1Ci0JbGRvIFInTEMkMDEwNSglcjI1KSwlcjI1Ci0JbGR3IDQwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjYyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDIoJXIyMSksJXIyMAotCWxkdyA0MCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi1MJDAyNjI6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDYsJXIyNQotCWxkbyBSJ0xDJDAxMDYoJXIyNSksJXIyNQotCWxkdyA0NCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JY29taWNsciw8PiA2LCVyMTksJXIwCi0JYmwgTCQwMjY1LCVyMAotCW5vcAotCWNvbWljbHIsPj0gNiwlcjE5LCVyMAotCWJsIEwkMDI3MCwlcjAKLQlub3AKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAyNjYsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyNjcsJXIwCi1MJDAyNzA6IAotCWNvbWljbHIsPD4gMTUsJXIxOSwlcjAKLQlibCBMJDAyNjQsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyNjcsJXIwCi1MJDAyNjQ6IAotTCQwMjY1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTA3LCVyMjUKLQlsZG8gUidMQyQwMTA3KCVyMjUpLCVyMjUKLQlsZHcgNDgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDQ4KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9hcmdfdHlwZXMsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyNjMsJXIwCi1MJDAyNjY6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDgsJXIyNQotCWxkbyBSJ0xDJDAxMDgoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9jcGx1c19zdHVmZiwlcjIKLQlub3AKLQlibCxuIEwkMDI2MywlcjAKLUwkMDI2NzogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwOSwlcjI1Ci0JbGRvIFInTEMkMDEwOSglcjI1KSwlcjI1Ci0JbGR3IDQ4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjY4LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTEwLCVyMjYKLQlsZG8gUidMQyQwMTEwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI2ODogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjYzLCVyMAotTCQwMjYzOiAKLUwkMDIyOTogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICRCU1MkCi0KLWNwbHVzX3N0cnVjdF9kZWZhdWx0OiAuY29tbSAyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2dsb2JhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9nbG9iYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwYzRhNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2dsb2JhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQkuSU1QT1JUIGZvbyxkYXRhCi0KLQkuYWxpZ24gNAotOyBPZmZpY2lhbCBnYXMgY29kZSB3aWxsIG5vdCBhY2NlcHQgc3ltLSRnbG9iYWwkLgotCWFkZGlsIEwlZm9vLSRnbG9iYWwkLCVyMjcKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjM2YTcxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFCSRURVhUJCwgU09SVD04Ci0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEEgY29tbWVudC4gIFRoaXMgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIGxhYmVsLCBidXQgYm90aCBvZiB0aGUKLTsgZm9sbG93aW5nIHN0YXRlbWVudHMgc2hvdWxkLgotbGFiZWxfd2l0aG91dF9jb2xvbgotbGFiZWxfd2l0aF9jb2xvbjoKLQotOyBBIHByb2JsZW0gdGVnZSBmb3VuZC4uLgotOyBJbnB1dCBzY3J1YmJpbmcgaW4gZ2FzIG1ha2VzIGxpZmUgYSByZWFsIG5pZ2h0bWFyZSBmb3IgYXNzZW1ibGVycwotOyBpbiB3aGljaCB0aGUgKnBvc2l0aW9uKiB3aXRoaW4gYSBsaW5lIGRldGVybWluZXMgaG93IHRvIGludGVycHJldAotOyBhIHN0cmVhbSBhIGNoYXJhY3RlcnMuICBUaGVzZSB0ZXN0IG9uZSBwYXJ0aWN1bGFyIGNhc2Ugd2hlcmUgZ2FzCi07IGhhZCB0aGUgdGVuZGVuY3kgdG8gZGVsZXRlIHRoZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIG9wY29kZSBhbmQKLTsgb3BlcmFuZHMgaWYgYSBsYWJlbCB3aXRob3V0IGEgY29sb24gYmVnYW4gYSBsaW5lLCBhbmQgdGhlIG9wZXJhbmRzCi07IHN0YXJ0ZWQgd2l0aCBhIG5vbi1udW1lcmljIGNoYXJhY3Rlci4KLUwkMQlhZGQgJXIyLCVyMiwlcjIKLUwkMjoJYWRkICVyMiwlcjIsJXIyCi1MJDMKLQlhZGQgJXIyLCVyMiwlcjIKLQotTCQ0CWFkZCAlcjIsJXIyLCVyMgotTCQ1OglhZGQgJXIyLCVyMiwlcjIKLUwkNgotCWFkZCAlcjIsJXIyLCVyMgotCi07IEFuIGluc3RydWN0aW9uIG9yIHBzZXVkby1vcCBtYXkgYmVnaW4gYW55d2hlcmUgYWZ0ZXIgY29sdW1uIDAuCi0gYixuIGxhYmVsX3dpdGhvdXRfY29sb24KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGluZXNlcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTljMTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotZm9vOgotCS5XT1JEIDAgIS5JTVBPUlQgJGJhciQsREFUQQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xzZWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbHNlbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNkOTk3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbHNlbGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEluIGdhcy0xLjM2IHRoZSBsZGlsIGluc3RydWN0aW9uIHVzaW5nIHBhcmVudGhlc2lzIGdlbmVyYXRlZAotOyBnYXJiYWdlIGJpdHMgd2hpbGUgdGhlIG9uZSB3aXRob3V0IHBhcmVucyB3b3JrZWQgZmluZS4KLQlsZGlsIEwlKDB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMiksJXIyMQotCWxkbyBMJSgweDAwMDQwMDAwIHwgMHgwMDAwMDAwOCB8IDB4MDAwMDAwMDIpICglcjIxKSwlcjIxCi0JbGRpbCBMJTB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMiwlcjIxCi0JbGRvIEwlMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyICglcjIxKSwlcjIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvbm9zdWJzcGFjZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDQ2MDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLlNQQUNFICRURVhUJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1wbl9hZGRfbgotCS5FWFBPUlQgbXBuX2FkZF9uLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IsUlROVkFMPUdSCi1tcG5fYWRkX246Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCi0JYWRkCSVyMCwlcjAsJXIwCQk7IHJlc2V0IGN5Ci1Mb29wOgotCWxkd3MsbWEJIDQoMCwlcjI1KSwlcjIwCi0JbGR3cyxtYQkgNCgwLCVyMjQpLCVyMTkKLQotCWFkZGMJICVyMTksJXIyMCwlcjE5Ci0JYWRkaWIsPD4gLTEsJXIyMyxMb29wCi0Jc3R3cyxtYQkgJXIxOSw0KDAsJXIyNikKLQotCWJ2CTAoMikKLQkgYWRkYwklcjAsJXIwLCVyMjgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcGFyc2UuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGMyYTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19zdHJpbmdfdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAic3RyaW5nZXIuczogVGVzdCBlbWJlZGRlZCBxdW90ZXMgYW5kIG9jdGFsIGVzY2FwZXMgaW4gc3RyaW5ncyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN0cmluZ2VyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjM2OTZFNjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDZDNzU2NDY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICA2QjJFNjQ2NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rICAgICAgNjYyMjBBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA5MzA3ODMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICAzMjMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xzZWxfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsc2VsYnVncy5zOiBsc2VsYnVnIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibHNlbGJ1Zy5zIiAiLWFsIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgY29ycmVjdGx5IGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuIAotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMkEwNDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzZCNTAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDIyQTA0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzNkI1MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb192YWxpZF9hbGlnbl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbGlnbjEuczogdmFsaWQgYWxpZ25tZW50IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWxpZ24xLnMiICItYWwiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4gCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwODAwMDI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDEwMDAgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwXFteXG5cXSpCTE9DS1xbXlxuXF0qMTAyNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA0MDBcW15cblxdKkJMT0NLXFteXG5cXSoxMDI0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgwMFxbXlxuXF0qQkxPQ0tcW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODA0XFteXG5cXSpBTElHTlxbXlxuXF0qOFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MDhcW15cblxdKkJMT0NLXFteXG5cXSozMFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MjZcW15cblxdKkFMSUdOXFteXG5cXSo0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgyOFxbXlxuXF0qQkxPQ0tcW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIEdBUy0yLjAgZG9lcyBub3QgYWx3YXlzIHBhcnNlICEgYXMgYSBsaW5lIHNlcGFyYXRvciB3aGVuIGl0IHNob3VsZC4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdCAibGluZXNlcGJ1Zy5zIiAiIiAiIiAibGluZSBzZXBhcmF0b3IgYnVnIgotCi0gICAgIyBNYWtlIHN1cmUgR0FTIGFjY2VwdHMgc3ludGF4IGZvciBhY2Nlc3Npbmcgc3RhdGljIGRhdGEuCi0gICAgZ2FzX3Rlc3QgImdsb2JhbC5zIiAiIiAiIiAiY2hlY2sgZm9yIHN5bS1cJGdsb2JhbFwkIGFjY2VwdGFuY2UiCi0KLSAgICAjIEdBUy0yLjAgKGFuZCAxLjM2IGZvciB0aGF0IG1hdHRlcikgY2FuIG5vdCBoYW5kbGUgYSAucHJvYyB3aGljaAotICAgICMgaGFzIG5vIGxhYmVsIGJlZm9yZSBpdC4KLSAgICBnYXNfdGVzdCAicHJvY2J1Zy5zIiAiIiAiIiAiTGFiZWwgZm9sbG93aW5nIC5wcm9jIgotCi0gICAgIyBPbmUgaXMgcmVxdWlyZWQgdG8gZXhwbGljaXRseSBJTVBPUlQgYW55IG5vbi1sb2NhbCBzeW1ib2wgdXNlZAotICAgICMgaW4gYW4gYXNzZW1ibHkgZmlsZS4gIE1ha2Ugc3VyZSB3ZSBnaXZlIGFuIGVycm9yIGlmIHdlIHVzZQotICAgICMgYW4gdW5kZWZpbmVkIHN5bWJvbC4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdF9lcnJvciAidW5kZWZidWcucyIgIiIgIkNoZWNrIGZvciBlcnJvciB3aGVuIHVzaW5nIHVuZGVmaW5lZCBzeW1ib2wiCi0KLSAgICAjIFRoaXMgZmlsZSBoYXMgY29kZSBhbmQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgYmVmb3JlIHN3aXRjaGluZyBpbnRvIGFueQotICAgICMgc3BhY2Uvc3Vic3BhY2UgcGFpci4gIFRoaXMgc2hvdWxkIHJlcG9ydCBhbiBlcnJvciBmb3IgU09NIChpdCBpcyBub3QKLSAgICAjIGFuIGVycm9yIGZvciBFTEYuICBUaGUgZmlsZSBhbHNvIGhhcyBtaXNtYXRjaGVkIGVudHJ5L2V4aXQgYW5kCi0gICAgIyBwcm9jL3Byb2NlbmQgcGFpcnMgd2hpY2ggYXJlIGVycm9ycyBmb3IgYm90aCBTT00gYW5kIEVMRi4KLSAgICBnYXNfdGVzdF9lcnJvciAibm9zdWJzcGFjZS5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yKHMpIGluIGlucHV0IGZpbGUgIgotCi0gICAgIyBUaGlzIGZpbGUgc2hvdWxkIHJldHVybiBlcnJvcnMgZm9yIGJvdGggdGhlIEVOVFJZX0dSIGFuZCBFTlRSWV9GUgotICAgICMgZGlyZWN0aXZlcyAodGhleSBhcmUgb3V0LW9mLXJhbmdlKQotICAgIGdhc190ZXN0X2Vycm9yICJlbnRyeWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGVudHJ5X2dyIGFuZCBlbnRyeV9mciIKLQotICAgICMgTWFrZSBzdXJlIGVtYmVkZGVkIHF1b3RlcyBhbmQgb2N0YWwgZXNjYXBlcyBpbiBzdHJpbmdzIHdvcmsKLSAgICBkb19zdHJpbmdfdGVzdHMKLQotICAgICMgTWFrZSBzdXJlIHdlIGRvIG5vdCBkaWUgb24gYSAudmVyc2lvbiBkaXJlY3RpdmUKLSAgICBnYXNfdGVzdCAidmVyc2lvbmJ1Zy5zIiAiIiAiIiAiLnZlcnNpb24gZGlyZWN0aXZlIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgZ2l2ZSBhbiBlcnJvciBvbiBhIGJvZ3VzIC5zcGFjZSBkaXJlY3RpdmUuCi0gICAgIyByZWNlbnQgdmVyc2lvbiBvZiBnYXMyIHdlbnQgaW50byBpbmZpbml0ZSBsb29wcyBwcmludGluZwotICAgICMgZXJyb3JzIG9uIHRoaXMgdGVzdC4KLSAgICBnYXNfdGVzdF9lcnJvciAic3BhY2VidWcucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyAuc3BhY2UgZGlyZWN0aXZlIgotCi0gICAgIyBHQVMgc2hvdWxkIGdpdmUgYW4gZXJyb3IgZm9yIHRoaXMgdGVzdC4KLSAgICBnYXNfdGVzdF9lcnJvciAiY2FsbGRhdGFidWcucyIgIiIgIkNoZWNrIGZvciBpbnZhbGlkIGFndW1lbnRzIG9uIC5jYWxsIgotCi0gICAgIyBPbGQgdmVyc2lvbnMgb2YgZ2FzIGluY29ycmVjdGx5IGdhdmUgZXJyb3JzIG9uIHNvbWUgdmFsaWQgLkVYUE9SVCBsaW5lcwotICAgIGdhc190ZXN0ICJleHBvcnRidWcucyIgIiIgIiIgInN5bnRheCBjaGVjayBmb3IgYW4gb2xkIC5FWFBPUlQgYnVnIgotCi0gICAgIyBPbGQgdmVyc2lvbnMgb2YgZ2FzIGNob2tlZCBvbiB0aGlzIGZpbGUgZm9yIHNvbWUgcmVhc29uCi0gICAgZ2FzX3Rlc3QgImZpeHVwN2J1Zy5zIiAiIiAiIiAiY2hlY2sgZm9yIG9sZCBcImZpeHVwN1wiIGdhcyBidWciCi0KLSAgICAjIFRlc3QgYW4gTCUgc2VsZWN0b3IgcGFyc2luZyBidWcgd2hpY2ggZXhpc3RlZCBpbiBnYXMtMS4zNiAgIAotICAgIGRvX2xzZWxfdGVzdAotCi0gICAgIyBGaXJzdCBjaGVjayBob3cgc29tZSB2YWxpZCBhbGlnbm1lbnRzIGFyZSBoYW5kbGVkLgotICAgIGRvX3ZhbGlkX2FsaWduX3Rlc3RzCi0KLSAgICAjIE5vdyBjaGVjayB0byBtYWtlIHN1cmUgYW4gaW52YWxpZCBhcmd1bWVudCBpcyBmbGFnZ2VkIGFzIGFuIGVycm9yLgotICAgIGdhc190ZXN0X2Vycm9yICJhbGlnbjIucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyBhcmd1bWVudCB0byAuYWxpZ24iCi0KLSAgICAjIEdBUyBjYW4ndCBoYW5kbGUgdXBwZXIgYm91bmQgZm9yIGEgUEEgLmJsb2NrW3pdIGRpcmVjdGl2ZQotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0ICJibG9jazEucyIgIiIgIiIgIkNoZWNrIG1pbi9tYXggdmFsdWVzIGZvciAuYmxvY2siCi0KLSAgICAjIE5vdyBjaGVjayBmb3IgYW4gaW52YWxpZCBhcmd1bWVudAotICAgIGdhc190ZXN0X2Vycm9yICJibG9jazIucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyBhcmd1bWVudCB0byAuYmxvY2siCi0KLSAgICAjIEdBUy0xLjM2IGNob2tlZCBvbiB0aGlzIGZpbGUuCi0gICAgIyBGSVhNRS4gIFNob3VsZCBjaGVjayByZWxvY2F0aW9ucyBtYWRlIGZvciB0aGlzIHRlc3QhCi0gICAgZ2FzX3Rlc3QgImV4cHJidWcucyIgIiIgIiIgIkNoZWNrIGZvciBzeW0xLXN5bTIgYWNjZXB0YW5jZSIKLQotICAgICMgQmFkIHRoaW5ncyBoYXBwZW4gaW4gdGhlIFBBIEVMRiBiYWNrZW5kIChvdGhlcnMgdG9vPykgaWYgYSBub24tZGVmYXVsdAotICAgICMgc2VjdGlvbiBpcyBjcmVhdGVkLi4uCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qZWxmKgotICAgIGdhc190ZXN0ICJzc2J1Zy5zIiAiIiAiIiAiQ2hlY2sgZm9yIGFjY2VwdGFuY2Ugb2Ygbm9uLWRlZmF1bHQgc3Vic3BhY2VzIgotCi0gICAgIyBUbyBiZSBjb21wYXRhYmxlIHdpdGggY2VydGFpbiAiZmVhdHVyZXMiIG9mIHRoZSBIUCBjb21waWxlcgotICAgICMgbm9uLWV4aXN0YW50IHJlZ2lzdGVycyBzaG91bGQgZGVmYXVsdCB0byAlcjAuCi0gICAgZ2FzX3Rlc3QgImRlZmJ1Zy5zIiAiIiAiIiAiTWlzc2luZyByZWdpc3RlciBzaG91bGQgZGVmYXVsdCB0byAlJXIwIgotCi0gICAgIyBNYWtlIHN1cmUgR0FTIHVuZGVyc3RhbmRzIGEgcmVhc29uYWJsZSBzZXQgb2Ygc3RhbmRhcmQgcHJlZGVmaW5lZAotICAgICMgcmVnaXN0ZXJzLiAgZWcgJXJwLCAlZHAsICVzcCwgZXRjLgotICAgIGdhc190ZXN0ICJzdGRyZWcucyIgIiIgIiIgIlRlc3Qgc3RhbmRhcmQgcHJlZGVmaW5lZCByZWdpc3RlcnMiCi0KLSAgICAjIE1ha2Ugc3VyZSBHQVMgd2lsbCBhY2NlcHQgYSBsYWJlbCB3aXRob3V0IGEgY29sb24uCi0gICAgZ2FzX3Rlc3QgImxhYmVsYnVnLnMiICIiICIiICJUZXN0IGxhYmVsIHdpdGhvdXQgY29sb24iCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBncm9rICMgbGluZSBkaXJlY3RpdmVzLgotICAgIGdhc190ZXN0ICJhcHBidWcucyIgIiIgIiIgIlRlc3QgYWNjZXB0YW5jZSBvZiAjbGluZSBkaXJlY3RpdmVzIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgZ2l2ZSBlcnJvcnMgaWYgYSBmbG9hdGluZyBwb2ludCBmb3JtYXQgaXMgc3BlY2lmaWVkCi0gICAgIyBmb3IgYW4geG1weXUgaW5zdHJ1Y3Rpb24gKGludGVnZXIgbXVsdGlwbGUpCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInhtcHl1YnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gYm9ndXMgYXJndW1lbnQgdG8geG1weXUiCi0KLSAgICAjIE1ha2Ugc3VyZSBnYXMgaGFuZGxlcyB2YXJpb3VzIGtpbmRzIG9mIC5yZWcgcHNldWRvLW9wcwotICAgIGdhc190ZXN0ICJyZWdwb3BidWcucyIgIiIgIiIgIlRlc3QgZm9yIGJ1Z3MgaW4gLnJlZyBwc2V1ZG8tb3AiCi0KLSAgICAjIENoZWNrIHNvbWUgYnVncyB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gcGFyc2luZyAuY2FsbGluZm8gZGlyZWN0aXZlcwotICAgIGdhc190ZXN0ICJjYWxsaW5mb2J1Zy5zIiAiIiAiIiAiVGVzdCBmb3IgYnVncyBpbiAuY2FsbGluZm8gZGlyZWN0aXZlIgotCi0gICAgIyBDaGVjayBmb3IgYm9ndXMgcmVnaXN0ZXJzIGluIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZC9mbXB5c3ViCi0gICAgIyBpbnN0cnVjdGlvbnMKLSAgICBnYXNfdGVzdF9lcnJvciAiYmFkZm1weWFkZC5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJhZCBmbXB5YWRkIGluc24iCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcHJvY2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTUwNTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLnNwYWNlICRURVhUJAotCS5zdWJzcGEgJENPREUkCi0JLmFsaWduIDQKLQkuZXhwb3J0IGRpdnUsZW50cnkKLQkucHJvYwotCS5jYWxsaW5mbwotZGl2dToJc3R3cyxtYQkJJXI0LDQoJXI1KQkJOyBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawotCS5wcm9jZW5kCi0KLQkuZXhwb3J0IGRpdnUyLGVudHJ5Ci0JLnByb2MKLQkuY2FsbGluZm8KLQkuZW50cnkKLWRpdnUyOglzdHdzLG1hCQklcjQsNCglcjUpCQk7IHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JLmV4aXQKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcmVncG9wYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZGIyNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLXIwCS5yZWcJJXIwCi1zaGlmdAkucmVnCSVzYXIKLWZwcmVnMTAJLnJlZwklZnIxMAotc2hpZnQyCS5yZWcJc2hpZnQKLQotOyBNYWtlIHN1cmUgd2UgZGlkbid0IGJvdGNoIC5lcXUuLi4KLXlhYmJhCS5lcXUJcjAgKyBzaGlmdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNiNDAxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3BhY2VidWcucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc3RhcnQ6CS5sb25nIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcKLQkuc3BhY2UgMHgyMCAtICguIC0gc3RhcnQpCi1mb286CS5sb25nIDQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NjBlMGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zc2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1VCU1BBICRTSE9SVEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0ZHJlZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI5NzhlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuZXhwb3J0IGZvbwotZm9vOgotCS5wcm9jCi0JLmNhbGxpbmZvIG5vX2NhbGxzCi0JLmVudHJ5Ci0JbGRpIDE1LCVzcAotCWxkaSAxNSwlcnAKLQlsZGkgMTUsJWRwCi0JbGRpIDE1LCVyZXQwCi0JbGRpIDE1LCVyZXQxCi0JbGRpIDE1LCVhcmcwCi0JbGRpIDE1LCVhcmcxCi0JbGRpIDE1LCVhcmcyCi0JbGRpIDE1LCVhcmczCi0JLmV4aXQKLSAJLnByb2NlbmQgCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmM1ZTZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RyaW5nZXIucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQotOyBHQVMgdXNlZCB0byBtaXMtcGFyc2UgdGhlIGVtYmVkZGVkIHF1b3RlcwotCS5TVFJJTkcgIiNpbmNsdWRlIFwiYXdrLmRlZlwiXHgwYVx4MDAiCi0KLTsgT2N0YWwgZXNjYXBlcyB1c2VkIHRvIGNvbnN1bWUgPiAzIGNoYXJzIHdoaWNoIGxlZCB0byB0aGlzCi07IHN0cmluZyBiZWluZyBzY3Jld2VkIGluIGEgYmlnIHdheS4KLQkuU1RSSU5HICJcMDExMHgxMjMiCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWVkYTkyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdW5kZWZidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCWJsIHNvbWV3aGVyZSwlcjIKLQlub3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS92ZXJzaW9uYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlZjFiNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuVkVSU0lPTiAiYWJjMTIzIgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZTcyNzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS94bXB5dWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IE5vIGZvcm1hdCBzZWxlY3RvciBmb3IgeG1weXUhCi0JeG1weXUsc2dsICVmcjQsJWZyNSwlZnI2Ci0JeG1weXUsZGJsICVmcjQsJWZyNSwlZnI2Ci0JeG1weXUscXVhZCAlZnI0LCVmcjUsJWZyNgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlZDZlOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuYWxpZ24gNAotdGFiX19fMgotCS53b3JkIEwkMDAwMgotCS53b3JkIEwkMDAwMwotCS53b3JkIEwkMDAwNAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGV4ZWN1dGUsQ09ERQotCS5FWFBPUlQgZXhlY3V0ZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotZXhlY3V0ZQotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlhZGRpbCBMJ2J1Zi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInYnVmLSRnbG9iYWwkKCVyMSksJXIyMAotCWxkaWwgTCdMJDAwMDIsJXIxOQotCW1vdmIsPD4gJXIyNiwlcjI2LEwkMDAwMgotCWxkbyBSJ0wkMDAwMiglcjE5KSwlcjIyCi0JY29weSAlcjAsJXIyMQotCWFkZGlsIEwndGFiX19fMi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFIndGFiX19fMi0kZ2xvYmFsJCglcjEpLCVyMjMKLQlhZGRpbCBMJ29wdGFiLSRnbG9iYWwkLCVyMjcKLQlsZG8gUidvcHRhYi0kZ2xvYmFsJCglcjEpLCVyMjAKLUwkMDAwOQotCXNoMmFkZCAlcjIxLCVyMjMsJXIxOQotCWxkaCAyKCVyMTkpLCVyMTkKLQlsZG8gMSglcjIxKSwlcjIxCi0Jc3ViICVyMTksJXIyMiwlcjE5Ci0JY29taWIsPj0gMiwlcjIxLEwkMDAwOQotCXN0aHMsbWEgJXIxOSwyKCVyMjApCi0JYnYsbiAlcjAoJXIyKQotTCQwMDAyCi0JbGRpIDEyMCwlcjE5Ci0Jc3RicyxtYSAlcjE5LDEoJXIyMCkKLQlsZGhzLG1hIDIoJXIyNiksJXIxOQotCWFkZCAlcjIyLCVyMTksJXIxOQotCWJ2LG4gJXIwKCVyMTkpCi1MJDAwMDMKLQlsZGkgMTIxLCVyMTkKLQlzdGJzLG1hICVyMTksMSglcjIwKQotCWxkaHMsbWEgMiglcjI2KSwlcjE5Ci0JYWRkICVyMjIsJXIxOSwlcjE5Ci0JYnYsbiAlcjAoJXIxOSkKLUwkMDAwNAotCWxkaSAxMjIsJXIxOQotCXN0YiAlcjE5LDAoJXIyMCkKLQlidiAlcjAoJXIyKQotCXN0YnMsbWIgJXIwLDEoJXIyMCkKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgc3RyY21wLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJAotCi0JLmFsaWduIDQKLUwkQzAwMDAKLQkuU1RSSU5HICJ4eXh5elx4MDAiCi0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLklNUE9SVCBleGl0LENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW4KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCWxkbyAxMjgoJXIzMCksJXIzMAotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhlY3V0ZSwlcjIKLQljb3B5ICVyMCwlcjI2Ci0JYWRkaWwgTCdvcHRhYi0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIxOQotCWxkbyBSJ29wdGFiLSRnbG9iYWwkKCVyMTkpLCVyMjEKLQlsZGggMiglcjIxKSwlcjIwCi0JbGRoIFInb3B0YWItJGdsb2JhbCQoJXIxOSksJXIxOQotCWFkZGlsIEwncC0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIyMgotCXN0aCAlcjIwLFIncC0kZ2xvYmFsJCglcjIyKQotCWxkbyBSJ3AtJGdsb2JhbCQoJXIyMiksJXIyNgotCXN0aCAlcjIwLDQoJXIyNikKLQlzdGggJXIxOSwyKCVyMjYpCi0JbGRoIDQoJXIyMSksJXIxOQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhlY3V0ZSwlcjIKLQlzdGggJXIxOSw2KCVyMjYpCi0JYWRkaWwgTCdidWYtJGdsb2JhbCQsJXIyNwotCWNvcHkgJXIxLCVyMTkKLQlsZG8gUididWYtJGdsb2JhbCQoJXIxOSksJXIyNgotCWxkaWwgTCdMJEMwMDAwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIKLQlsZG8gUidMJEMwMDAwKCVyMjUpLCVyMjUKLQljb21pYiw9LG4gMCwlcjI4LEwkMDAxMQotCS5DQUxMIAotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDExCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGl0LCVyMgotCWNvcHkgJXIwLCVyMjYKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJEJTUyQKLQotb3B0YWIJLmNvbW0gMTAKLWJ1ZgkuY29tbSAxMAotcAkuY29tbSAxMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzA3NzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5JTVBPUlQJJCRkeW5jYWxsLE1JTExJQ09ERSA7IENvZGUgZm9yIGR5bmFtaWMgZnVuY3Rpb24gY2FsbHMuCi0KLV9zaWd0cmFtcDoKLQlsZGlsCUwlJCRkeW5jYWxsLCVyMgk7ICAgd2hvc2UgYWRkcmVzcyBpcyBpbiByMjIuCi0JYmxlCVIlJCRkeW5jYWxsKCVzcjQsJXIyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3N2I1My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzIucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCi0gIAlsZGlsCUwlMHhjMDAwMTAwNCwlcjEKLSAgCWJsZQlSJTB4YzAwMDEwMDQoJXNyNywlcjEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWU5YjNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLmltcG9ydCB5YWJiYSxjb2RlCi0KLSAgCWJsZQlSJXlhYmJhKCVzcjQsJXIwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9leGl0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5OGUzNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvbyxDT0RFCi0JLkVYUE9SVCBmb28sRU5UUlksUFJJVl9MRVY9MwotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU4ZDAyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5TVUJTUEEgJE1JTExJQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LFNPUlQ9OAotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQliLG4JJCRmb28KLQlub3AKLQlub3AKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRNSUxMSUNPREUkCi0kJGZvbzoKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmE0M2JjNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGcsQ09ERQotCS5FWFBPUlQgZyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgotZwotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjI2LC0zNiglcjMpCi0Jc3R3ICVyMjUsLTQwKCVyMykKLQlzdHcgJXIyNCwtNDQoJXIzKQotCWxkdyAtMzYoJXIzKSwlcjI2Ci0JbGR3IC00MCglcjMpLCVyMjUKLQlsZHcgLTQ0KCVyMyksJXIxOQotCWNvcHkgJXIxOSwlcjIyCi0JLkNBTEwJQVJHVzA9R1IKLQlibCAkJGR5bmNhbGwsJXIzMQotCWNvcHkgJXIzMSwlcjIKLQljb3B5ICVyMjgsJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsLG4gTCQwMDAyLCVyMAotCWxkdyAtMzYoJXIzKSwlcjI4Ci0JYmwsbiBMJDAwMDEsJXIwCi0JYmwsbiBMJDAwMDMsJXIwCi1MJDAwMDIKLQlsZHcgLTQwKCVyMyksJXIyOAotCWJsLG4gTCQwMDAxLCVyMAotTCQwMDAzCi1MJDAwMDEKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLWYyX19fNAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSw2NCglcjMwKQotCXN0dyAlcjI5LDgoJXIzKQotCXN0dyAlcjI2LC0zNiglcjMpCi0Jc3R3ICVyMjUsLTQwKCVyMykKLQlsZHcgLTM2KCVyMyksJXIxOQotCWxkdyAtNDAoJXIzKSwlcjIwCi0JY29tY2xyLD49ICVyMjAsJXIxOSwlcjE5Ci0JbGRpIDEsJXIxOQotCWNvcHkgJXIxOSwlcjI4Ci0JYmwsbiBMJDAwMDUsJXIwCi1MJDAwMDUKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGFib3J0LENPREUKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1MJFRSQU1QMDAwMAotCWxkdwkzNiglcjIyKSwlcjIxCi0JYmIsPj0sbgklcjIxLDMwLC4rMTYKLQlkZXBpCTAsMzEsMiwlcjIxCi0JbGR3CTQoJXIyMSksJXIxOQotCWxkdwkwKCVyMjEpLCVyMjEKLQlsZHNpZAkoJXIyMSksJXIxCi0JbXRzcAklcjEsJXNyMAotCWJlCTAoJXNyMCwlcjIxKQotCWxkdwk0MCglcjIyKSwlcjI5Ci0JLndvcmQJMAotCS53b3JkCTAKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmLENPREUKLQkuRVhQT1JUIGYsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWYKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JYWRkaWwgTCdMJFRSQU1QMDAwMC0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInTCRUUkFNUDAwMDAtJGdsb2JhbCQoJXIxKSwlcjIyCi0JbGRvIDQwKCVyMCksJXIyMAotCWxkd3MsbWEgNCglcjIyKSwlcjIxCi0JYWRkaWIsPj0gLTQsJXIyMCwuLTQKLQlzdHdzLG1hICVyMjEsNCglcjE5KQotCWxkaWwgTCdmMl9fXzQsJXIyMAotCWxkbyBSJ2YyX19fNCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksNTIoJXIzKQotCWxkbyA4KCVyMyksJXIxOQotCXN0dyAlcjE5LDU2KCVyMykKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JbGRvIDQ4KCVyMyksJXIyMAotCWZkYyAlcjAoJXIxOSkKLQlmZGMgJXIwKCVyMjApCi0Jc3luYwotCWxkbyAzMiglcjE5KSwlcjIyCi0JbWZzcCAlc3IwLCVyMjEKLQlsZHNpZCAoJXIxOSksJXIyMAotCW10c3AgJXIyMCwlc3IwCi0JZmljICVyMCglc3IwLCVyMTkpCi0JZmljICVyMCglc3IwLCVyMjIpCi0Jc3luYwotCW10c3AgJXIyMSwlc3IwCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0JbGRvIDE2KCVyMyksJXIxOQotCWxkaSAxLCVyMjYKLQlsZGkgMiwlcjI1Ci0JY29weSAlcjE5LCVyMjQKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGcsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLDw+IDIsJXIxOSwlcjAKLQlibCxuIEwkMDAwNiwlcjAKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDA2Ci1MJDAwMDQKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgZXhpdCxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDEyOCglcjMwKQotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgX19tYWluLCVyMgotCW5vcAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgZiwlcjIKLQlub3AKLQljb3B5ICVyMCwlcjI2Ci0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBleGl0LCVyMgotCW5vcAotTCQwMDA3Ci0JbGR3IC0yMCglcjMpLCVyMgotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sYWJlbG9wYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkYzQyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLXM6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXIzMCwxMiglcjQpCi0JbGRpbCBMJ0wkMDAwNywlcjE5Ci0JbGRvIFInTCQwMDA3KCVyMTkpLCVyMTkKLQljb21pYiw+PSAwLCVyMjYsTCQwMDAyCi0Jc3R3ICVyMTksOCglcjQpCi1MJDAwMDM6Ci1MJDAwMDI6Ci0JYiBMJDAwMDEKLQlsZG8gMSglcjApLCVyMjgKLUwkMDAwNzoKLQlsZGlsIEwnTCQwMDAyLCVyMTkKLQlsZG8gUidMJDAwMDIoJXIxOSksJXIxOQotCWNvbWIsPSAlcjI5LCVyMTksTCQwMDAyCi0JbGRvIC04KCVyNCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM5OTZmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwucworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgYmFyLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb28sQ09ERQotCS5FWFBPUlQgZm9vLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1mb28KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQkuQ0FMTCAKLQlibCBiYXIsJXIyCi0JbGRvIDY0KCVyMzApLCVyMzAKLQkuYmxvY2t6IDI2MjE0NAotCWxkdyAtODQoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZG8gLTY0KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGJhcixDT0RFCi0JLkVYUE9SVCBiYXIsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWJhcgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzlhNDRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotCS5TUEFDRQkkVEVYVCQsU09SVD04Ci0JLlNVQlNQQQkkQ09ERSQsUVVBRD0wLEFMSUdOPTQsQUNDRVNTPTB4MmMsQ09ERV9PTkxZLFNPUlQ9MjQKLQkuU1BBQ0UJJFBSSVZBVEUkLFNPUlQ9MTYKLQkuU1VCU1BBCSREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MHgxZixTT1JUPTE2Ci1ib2dvCi0JLkFMSUdOCTgKLQkuV09SRCAgYm9nbys0CTsgPSAweDQKLQkuU1RSSU5HCSJceDAwXHgwMFx4MDB7XHgwMFx4MDBceDAxXHhDOFx4MDBceDAwXHgwM1x4MTUiCi0JLlNQQUNFCSRQUklWQVRFJAotCS5TVUJTUEEJJERBVEEkCi0JLkVYUE9SVAlib2dvCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9wbGFiZWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDViMzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9wbGFiZWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgYWJvcnQsQ09ERQotCS5FWFBPUlQgZixEQVRBCi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuYWxpZ24gNAotZjoKLQkud29yZCBQJWFib3J0Ci0JLndvcmQgUCVhYm9ydAotCS5JTVBPUlQgX19tYWluLENPREUKLQkuSU1QT1JUIHByaW50ZixDT0RFCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotTEMkMDAwMDoKLQkuU1RSSU5HICJmcm9iXHgwYVx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50ZiwlcjIKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgLTE0OCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkbyAtMTI4KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3Jfbm9fcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZmMmQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotCS5DT1BZUklHSFQgIk1ldGFXYXJlIEluY29ycG9yYXRlZCwgMTk5MiIKLQkuVkVSU0lPTgkiaGMyLjZhIC1PMSB0My5jXG4iCi0KLQkuU1BBQ0UJJFBSSVZBVEUkLFNPUlQ9MTYKLQkuU1VCU1BBCSRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0weDFGLFNPUlQ9ODAsWkVSTwotCS5TVUJTUEEJJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0weDFGLFNPUlQ9MTYKLQotCS5TUEFDRQkkVEVYVCQsU09SVD04Ci0JLlNVQlNQQQkkQ09ERSQsUVVBRD0wLEFMSUdOPTQsQUNDRVNTPTQ0LENPREVfT05MWSxTT1JUPTI0Ci0KLQkuU1BBQ0UJJFBSSVZBVEUkCi0JLlNVQlNQQQkkREFUQSQKLQkuQUxJR04JOAotJEwwMERBVEEKLQkuQUxJR04JOAotCS5FWFBPUlQJcwotcwotCS5XT1JECTB4MAotCS5CTE9DS1oJNzg2NDI1Ci0JLkJMT0NLWgk3Ci0KLQkuU1BBQ0UJJFRFWFQkCi0JLlNVQlNQQQkkQ09ERSQKLUwkMDAxLjMKLWcJLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCTtsZG8JMTIwKCVyMCksJXIyOCAtLT4gdG8gZGVsYXkgc2xvdAotCWJ2CSVyMCglcjIpCi0JLkVYSVQKLQlsZG8JMTIwKCVyMCksJXIyOAotCS5QUk9DRU5ECi0KLQotCS5TUEFDRQkkUFJJVkFURSQKLQkuU1VCU1BBCSREQVRBJAotCS5BTElHTgk0Ci0JLkVYUE9SVAlsCi1sCi0JLldPUkQJUCdnCi0JLklNUE9SVAljb21tb24sREFUQQk7IGNvbW1vbiBzZWN0aW9uLCBzaXplPTAKLQkuSU1QT1JUCSRnbG9iYWwkLERBVEEKLQkuRVhQT1JUCWcsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLQkuRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzc3NTJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLlBBUkFNIGZvbyxSVE5WQUw9R1IKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS53b3JkIFAlZm9vCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgYmFyLENPREUKLQkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotYmFyOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0JbGRpbCBMJ0xDJDAwMDAsJXIxOQotCWxkdyBSJ0xDJDAwMDAoJXIxOSksJXIyNgotCXN0dyAlcjIsLTIwKCVyMzApCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmb28sJXIyCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0JbGR3IC0xNDgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZG8gLTEyOCglcjMwKSwlcjMwCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzZmEzNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KLQkuYWxpZ24gOAotTCRQMDAwMAotCS53b3JkIDB4MTIzNDU2NzgKLQkud29yZCAweDAKLQotCS5hbGlnbiA4Ci1MJEMwMDAwCi0JLndvcmQgMHgzZmYwMDAwMAotCS53b3JkIDB4MAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGcsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9RlIKLWcKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0Jc3R3ICVyMTksLTMyKCVyMzApCi0JbGR3IFQnTCRDMDAwMCglcjE5KSwlcjIwCi0JYnYgJXIwKCVyMikKLQlmbGRkcyAwKCVyMjApLCVmcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLklNUE9SVCBleGl0LENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJAotCi0JLmFsaWduIDgKLUwkQzAwMDEKLQkud29yZCAweDNmZjAwMDAwCi0JLndvcmQgMHgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWxkbyAxMjgoJXIzMCksJXIzMAotCXN0dyAlcjE5LC0zMiglcjMwKQotCXN0dyAlcjQsLTEyOCglcjMwKQotCi0JY29weSAlcjE5LCVyNAotCS5DQUxMIAotCWJsIGcsJXIyCi0JY29weSAlcjQsJXIxOQotCWNvcHkgJXI0LCVyMTkKLQlsZHcgVCdMJEMwMDAxKCVyMTkpLCVyMjAKLQlmbGRkcyAwKCVyMjApLCVmcjgKLQlmY21wLGRibCw9ICVmcjQsJWZyOAotCWZ0ZXN0Ci0JYWRkLHRyICVyMCwlcjAsJXIwCi0JYixuIEwkMDAwMwotCS5DQUxMIAotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDAzCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGl0LCVyMgotCWxkaSAwLCVyMjYKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjcxZTc4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLkVYUE9SVCBibGFoLERBVEEKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA4Ci1ibGFoCi0JOyAuZG91YmxlIDBlKzAwCi0JLndvcmQgMCA7ID0gMHgwCi0JLndvcmQgMCA7ID0gMHgwCi0JLkVYUE9SVCBmb28sREFUQQotCS5hbGlnbiA4Ci1mb28KLQk7IC5kb3VibGUgMGUrMDAKLQkud29yZCAwIDsgPSAweDAKLQkud29yZCAwIDsgPSAweDAKLQkuRVhQT1JUIHlhYmJhLERBVEEKLQkuYWxpZ24gNAoteWFiYmEKLQkud29yZCAxCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgYmFyLENPREUKLQkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotYmFyCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsTk9fQ0FMTFMsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDY0KCVyMzApCi0JYWRkaWwgTCd5YWJiYS0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFIneWFiYmEtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JbGRpIDIsJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLUwkMDAwMQotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiMjM2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnLnM6IFRlc3QgZm9yIHByb3BlciByZWxvY2F0aW9uIGZvciBCTEUgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYmxlYnVnLnMiICIiICJQcm9wZXIgcmVsb2NhdGlvbiBmb3IgQkxFIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLSAgICAgICAgaWYgIVtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgIyBBdCBvbmUgdGltZSBib3RoIHZlcnNpb25zIG9mIHRoZSBhc3NlbWJsZXIgd291bGQgaW5jb3JyZWN0bHkgdXNlIAotCSAgICAjIGEgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSBCTEUgaW5zdHJ1Y3Rpb24uCi0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCQkgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKkFCU19DQUxMXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgIyBBdCBvbmUgdGltZSBib3RoIHZlcnNpb25zIG9mIHRoZSBhc3NlbWJsZXIgd291bGQgaW5jb3JyZWN0bHkgdXNlIAotCSAgICAjIGEgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSBCTEUgaW5zdHJ1Y3Rpb24uCi0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCQkgICAgLXJlICJeMDAwMDAwMDBcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIl4wMDAwMDAwNFxbXlxuXF0qRElSMTdSXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcmVsb2NhdGlvbl9yZWR1Y3Rpb25fdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlLnM6IFRlc3QgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZS5zIiAiIiAiUmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0MSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHJlbG9jYXRpb25zIGludm9sdmluZyBwcm9jZWR1cmUgbGFiZWxzIAotCSMgYXJlIG5vdCByZWR1Y2VkIHRvIGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgc29tZSBvdGhlciBzeW1ib2wuCi0JIyBEb2luZyBzbyBtYWtlcyBnZW5lcmF0aW5nIHBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWJzIGltcG9zc2libGUuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjAwMDAwMDA0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMTRcW15cblxdKlBDUkVMXFteXG5cXSpmb29cW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlMi5zOiBNb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9uIHRlc3RzIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZTIucyIgIiIgIk1vcmUgcmVsb2NhdG9pbiAgcmVkdWN0aW9ucyAocGFydDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRvIG1ha2Ugc3VyZSBETFQgcmVsYXRpdmUgcmVsb2NzIGFyZSBub3QgcmVkdWNlZCB0byBzeW0rYWRkZW5kCi0JIyBEb2luZyBzbyBkb2Vzbid0IHdvcmsgYXMgb25lIG1pZ2h0IGV4cGVjdAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wMDAwMDAwNFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAwXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAxY1xbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAwXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAzMFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAxXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDA0OFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAxXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLSAgICBzZXQgdGVzdG5hbWUgInJlZHVjZTMuczogVGVzdCBldmVuIG1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZTMucyIgIiIgIkV2ZW4gbW9yZSByZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHByb2NlZHVyZSBsYWJlbHMgCi0JIyBhcmUgbm90IHJlZHVjZWQgdG8gYSByZWxvY2F0aW9uIGludm9sdmluZyBzb21lIG90aGVyIHN5bWJvbC4KLQkjIERvaW5nIHNvIG1ha2VzIGdlbmVyYXRpbmcgcGFyYW1ldGVyIHJlbG9jYXRpb24gc3R1YnMgaW1wb3NzaWJsZS4KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMGNcW15cblxdKnlhYmJhXFteXG5cK1xdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDBjXFteXG5cXSp5YWJiYVwrXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggMDsgYnJlYWsgfQotCQktcmUgIl4wMDAwMDAxMFxbXlxuXF0qeWFiYmFcW15cblwrXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMTBcW15cblxdKnlhYmJhXCtcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCAwOyBicmVhayB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19ibGVfbW9kZV9zZWxlY3Rvcl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJsZWJ1ZzIuczogYmxlYnVnMiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJsZWJ1ZzIucyIgIi1hbCIKLQotICAgICMgR0FTIHVzZXMgdG9vIG1hbnkgYml0cyBvbiB0aGUgQkxFIGluc3RydWN0aW9uLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMDIwMjgwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTQyMEUwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmxlX3JlbG9jYXRpb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJibGVidWczLnM6IGJsZWJ1ZzMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJibGVidWczLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTQwMDIwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcGxhYmVsX3JlbG9jYXRpb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwbGFiZWxidWcuczogT2xkIGdhcy0xLjM2IHBsYWJlbCBidWcgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicGxhYmVsYnVnLnMiICIiICJPbGQgZ2FzLTEuMzYgcGxhYmVsIGJ1ZyAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdGhhdCB3ZSBtYWtlIFBMQUJFTCByZWxvY2F0aW9uIGVudHJpZXMgd2hlbiB0aGV5J3JlIG5lZWRlZC4KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDBcW15cblxdKlBMQUJFTFxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMDRcW15cblxdKlBMQUJFTFxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAJICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19zZWxlY3Rvcl9zY29wZV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNlbGVjdG9yYnVnLnM6IFRlc3Qgc2NvcGUgb2YgZmllbGQgc2VsZWN0b3IiIAotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInNlbGVjdG9yYnVnLnMiICIiICJUZXN0IHNjb3BlIG9mIGZpZWxkIHNlbGVjdG9yIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHJlbG9jYXRpb24gZW50cnkgYWZ0ZXIgdGhlIHBsYWJlbCBpcyBjb3JyZWN0LgotCSMgSWYgYW4gb2xkIGZpZWxkIHNlbGVjdG9yIHdhcyBpbmNvcnJlY3RseSAiY2FycmllZCIgb3ZlciwgdGhlbiAKLQkjIHRoaXMgdGVzdCB3aWxsIGZhaWwuCi0gICAgICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMTRcW15cblxdKkRJUjMyXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIl4wMDAwMDAxNFxbXlxuXF0qUExBQkVMXFteXG5cXSpmb29cW15cblxdKlxuIgotCQkJeyBzZXQgeCAwIH0KLQkgICAgICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgICAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLSAgICAgICAgICAgIH0KLQl9IGVsc2UgewotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxNFxbXlxuXF0qREFUQV9PTkVcW15cblxdKlxuIgotCQkJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjAwMDAwMDE0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IDAgfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2xvY2FsX2xhYmVsX2FzX29wZXJhbmRfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsYWJlbG9wYnVnLnM6IFRlc3QgbG9jYWwgbGFiZWwgYXMgb3BlcmFuZCAobm9uLWJyYW5jaGluZykiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibGFiZWxvcGJ1Zy5zIiAiIiAiTG9jYWwgbGFiZWwgYXMgb3BlcmFuZCAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhbmRsZSBkaWZmZXJlbmNlIG9mIGxvY2FsIGxhYmxlcyBhcyBhbiBvcGVyYW5kCi0JIyB0byBhIG5vbi1icmFuY2hpbmcgaW5zdHJ1Y3Rpb24gY29ycmVjdGx5LgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMDAwMDAwMmNcW15cblxdKjB4MDAwMDAwMjRcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMDAwMDAwMzBcW15cblxdKjB4MDAwMDAwMjRcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fZXhpdF9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXhpdGJ1Zy5zOiBUZXN0IGZvciBib2d1cyBSX0VYSVQgcmVsb2NhdGlvbiAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICAjIEVsZiAob3NmKSBkb2VzIG5vdCB1c2UgRU5UUlkvRVhJVCByZWxvY2F0aW9ucy4KLSAgICAjIEkgZ3Vlc3Mgd2UgY291bGQgbG9vayBhdCB0aGUgdW53aW5kIHN1YnNwYWNlcyBpdCBidWlsZHMuLi4KLSAgICAjIFVudGlsIHRoZW4sIG1ha2Ugc3VyZSBpdCBzdGlsbCBhc3NlbWJsZXMuCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCWdhc190ZXN0X29sZCAiZXhpdGJ1Zy5zIiAiIiAiVGVzdCBmb3IgYm9ndXMgUl9FWElUIHJlbG9jYXRpb24gKHBhcnQgMSkiCi0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImV4aXRidWcucyIgIiIgIlRlc3QgZm9yIGJvZ3VzIFJfRVhJVCByZWxvY2F0aW9uIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBOb3RlIHRoYXQgYSBtYXRjaCBoZXJlIGlzIHJlYWxseSBhIEZBSUxVUkUhCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wMDAwMDAwMFxbXlxuXF0qUl9FWElUXFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmaXh1cGJ1Zy5zOiBUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmaXh1cGJ1Zy5zIiAiIiAiVGVzdCBjcm9zcyBzcGFjZSBqdW1wL2NhbGwgZml4dXAgYnVnIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGZpeHVwL3JlbG9jYXRpb24gZm9yIHRoZSBjcm9zcy1zcGFjZQotCSMgYnJhbmNoL2NhbGwKLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkgICAgICAgIC1yZSAiXjAwMDAwMDAwXFteXG5cXSpQQ1JFTF9DQUxMXFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmaXh1cGJ1Zy5zOiBUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMykiCi0gICAgc2V0IHggMAotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnYXNfc3RhcnQgImZpeHVwYnVnLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTgwMDAwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcm91bmRfbW9kZV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJvdW5kbW9kZS5zOiBUZXN0IHN3aXRjaGluZyBvZiByb3VuZGluZyBtb2RlcyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyb3VuZG1vZGUucyIgIiIgIlRlc3Qgc3dpdGNoIG9mIHJvdW5kaW5nIG1vZGVzKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGNvcnJlY3QgcmVsb2NhdGlvbnMgdG8gc3dpdGNoIHJvdW5kaW5nIG1vZGVzLgotCSMgQWxzbyBtYWtlIHN1cmUgKGZvciBTT00pIHRoYXQgcmVkdW5kYW50IHJvdW5kaW5nIG1vZGUgcmVsb2NhdGlvbnMKLQkjIHdlcmUgZWxpbWluYXRlZC4KLQlpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDAwXFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMDhcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwY1xbXlxuXF0qRElSMTRSXFteXG5cXSpcbiIgCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxMFxbXlxuXF0qRElSMjFMXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDE0XFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDE4XFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMWNcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLSAgICAgICAgICAgIH0KLQl9IGVsc2UgewotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwMFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwOFxbXlxuXF0qUl9OX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMGNcW15cblxdKlJfTl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxMFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMTRcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxY1xbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgaWYgW2V4cHIgJHg9PThdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0JfSBlbHNlIHsKLQkgICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0JfQotICAgIH0KLX0KLQotcHJvYyBkb19mdW5jdGlvbl9yZWxvY19idWcge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnVuY3JlbG9jYnVnLnM6IFRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmdW5jcmVsb2NidWcucyIgIiIgIlRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgTWFrZSBzdXJlIEdBUyBnZW5lcmF0ZWQgYSBjb3JyZWN0IHJlbG9jYXRpb24gZm9yIHRoZSByZWZlcmVuY2UuCi0JIyBicmFuY2gvY2FsbAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMDAwMDAwY2NcW15cblxdKmYyX19fNFxbXlxuK1xdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMDAwMDAwZDBcW15cblxdKmYyX19fNFxbXlxuK1xdKlxuIiAgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLQlzZXQgdGVzdG5hbWUgImZ1bmNyZWxvY2J1Zy5zOiBUZXN0IGZvciByZWxvYyBidWcgaW4gbm9uLXBsYWJlbCBmdW5jdGlvbiByZWZlcmVuY2UgKHBhcnQzKSIKLQlzZXQgeCAwCi0KLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCi0JIyBNYWtlIHN1cmUgd2UgZGlkbid0IHB1dCBhbnl0aGluZyBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmIQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMDAwMDAwY2NcW15cblxdKmxkaWwgMCxyMjBcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMDAwMDAwZDBcW15cblxdKmxkbyAwXFtcKFxdK3IyMFxbXClcXSsscjE5XFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci0KLX0KLQotcHJvYyBkb19yX25vX3JlbG9jIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJfbm9fcmVsb2MuczogVGVzdCBmb3IgcmVsb2MgYnVnIGluIDQtYnl0ZSBSX05PX1JFTENPQVRJT04gZml4dXBzIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJfbm9fcmVsb2MucyIgIiIgIlRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiA0LWJ5dGUgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgTWFrZSBzdXJlIEdBUyBnZW5lcmF0ZWQgYSBjb3JyZWN0IHJlbG9jYXRpb24gZm9yIHRoZSByZWZlcmVuY2UuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wMDBjMDAwNFxbXlxuXF0qUExBQkVMXFteXG5dKmdcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIH0KLX0KLQotcHJvYyBkb19waWNfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInBpY3JlbG9jLnM6IFRlc3QgZm9yIHByb3BlciBQSUMgcmVsb2NhdGlvbiAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGdhc19zdGFydCAicGljcmVsb2MucyIgIi1hbCIKLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMDAwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hcHBseV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFwcGx5YnVnLnM6IFRlc3QgZm9yIHByb3BlciBmaXh1cCBhcHBsaWF0aW9uIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgICMgRUxGIChvc2YpIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSBleHRyYSBzZWN0aW9ucyB0b28gd2VsbC4uLgotICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgZ2FzX3N0YXJ0ICJhcHBseWJ1Zy5zIiAiLWFsIgotCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDAwMDAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDAwMDAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIE1ha2Ugc3VyZSB3ZSBwdXQgdGhlIHJpZ2h0IHJlbG9jYXRpb24gZW50cnkgb24gYSBCTEUgaW5zdHJ1Y3Rpb24uCi0gICAgZG9fYmxlX3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIGFyZSBub3QgdG9vIGFncmVzc2l2ZSBhYm91dAotICAgICMgYWRqdXN0aW5nIHJlbG9jYXRpb25zIGFnYWluc3Qgc29tZSBzeW1ib2xzLgotICAgIGRvX3JlbG9jYXRpb25fcmVkdWN0aW9uX3Rlc3RzCi0KLSAgICAjIENoZWNrIHRoYXQgbW9kZSBzZWxlY3RvcnMgb24gYSBibGUgaW5zdHJ1Y3Rpb24gYWN0dWFsbHkgd29yay4KLSAgICBkb19ibGVfbW9kZV9zZWxlY3Rvcl90ZXN0Ci0KLSAgICAjIENoZWNrIHRoYXQgd2UgdGFrZSB0aGUgLTggYWRqdXN0bWVudCBpbnRvIGFjY291bnQgd2hlbiB6ZXJvaW5nCi0gICAgIyBvdXQgdGhlIGRpc3BsYWNlbWVudCBmaWVsZCBpbiBhIGJsZSBpbnN0cnVjdGlvbiB3aXRoIGEgcmVsb2MKLSAgICBkb19ibGVfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIDEuMzYgc2ltcGx5IGRpZG4ndCBnZW5lcmF0ZSBhbGwgdGhlIHBsYWJlbHMgaXQgc2hvdWxkIGhhdmUuICBNYWtlCi0gICAgIyBzdXJlIGdhcy0yIGRvZXMuCi0gICAgZG9fcGxhYmVsX3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgYSBmaWVsZCBzZWxlY3RvciBvbmx5IGVmZmVjdHMgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KLSAgICAjIG9yIGFzc2VtYmxlciBkaXJlY3RpdmUuCi0gICAgZG9fc2VsZWN0b3Jfc2NvcGVfdGVzdAotCi0gICAgIyBUaGlzIHNob3VsZCByZWFsbHkgZ2VuZXJhdGUgYSByZWxvY2F0aW9uLiAgSXQgd291bGQgbWFrZSBsaWZlIG11Y2gKLSAgICAjIGVhc2llciBvbiB0aGUgb3B0aW1pemluZyBsaW5rZXIuICBVbnRpbCB0aGVuIGp1c3QgbWFrZSBzdXJlIHRoZSAKLSAgICAjIGRpZmZlcmVuY2UgaXMgY29tcHV0ZWQgY29ycmVjdGx5LgotICAgIGRvX2xvY2FsX2xhYmVsX2FzX29wZXJhbmRfdGVzdAotCi0gICAgIyBHQVMyIGluY29ycmVjdGx5IGdlbmVyYXRlZCBSX0VYSVQgcmVsb2NhdGlvbnMgd2hlbiAuZXhpdCBkaXJlY3RpdmVzCi0gICAgIyB3ZXJlIG5vdCBpbiB0aGUgc291cmNlIGNvZGUuCi0gICAgZG9fZXhpdF9yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgR0FTMiBpbmNvcnJlY3RseSB0aG91Z2h0IGl0IGNvdWxkIGFwcGx5IGEgZml4dXAgZm9yIGEgcGMtcmVsYXRpdmUKLSAgICAjIGJyYW5jaC9jYWxsIHdoaWNoIGNyb3NzZWQgZGlmZmVyZW50IHN1YnNwYWNlcy4KLSAgICAjIEFsc28gY2hlY2sgdGhhdCB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGlzIGNvcnJlY3QKLSAgICBkb19jcm9zc19zcGFjZV9maXh1cF90ZXN0XzEKLSAgICBkb19jcm9zc19zcGFjZV9maXh1cF90ZXN0XzIKLQotICAgICMgTWFrZSBzdXJlIHdlIHN3aXRjaCByb3VuZGluZyBtb2RlcyBjb3JyZWN0bHkKLSAgICBkb19yb3VuZF9tb2RlX3Rlc3QKLQotICAgICMgVGVzdCBmb3IgYSBidWcgZm91bmQgd2hlbiBhIGZ1bmN0aW9uIHdhcyB1c2VkIGluIGEgbm9uLWJyYW5jaGluZwotICAgICMgaW5zdHJ1Y3Rpb24gKndpdGhvdXQqIGEgcGxhYmVsIChmb3IgcG9ydGFibGUgcnVudGltZSBtb2RlbCkKLSAgICBkb19mdW5jdGlvbl9yZWxvY19idWcKLQotICAgICMgVGVzdCBmb3IgYW4gb2ZmLWJ5LW9uZSBidWcgaW4gdGhlIGhhbmRsaW5nIG9mIDQtYnl0ZSBSX05PX1JFTE9DQVRJT04KLSAgICAjIGZpeHVwcy4KLSAgICBkb19yX25vX3JlbG9jCi0KLSAgICAjIFRlc3QgYSByZWxvY2F0aW9uIHByb2JsZW0gd2hpY2ggc2hvd3MgdXAgd2hlbiBidWlsZGluZyBzaGFyZWQKLSAgICAjIGxpYnJhcmllcyBpbiBTT00KLSAgICBkb19waWNfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIFRlc3QgYSBwcm9ibGVtIHdpdGggbWRfYXBwbHlfZml4IHRoYXQgd2FzIGludHJvZHVjZWQgd2hlbiBmaXhpbmcKLSAgICAjIHRoZSBwaWMgcmVsb2NhdGlvbiB0ZXN0LgotICAgIGRvX2FwcGx5X3Rlc3QKLQotICAgICMgTWFrZSBzdXJlIGdhcyBkb2Vzbid0IHJlc29sdmUgbG9uZy1jYWxscyB3aGljaCBhcmUgdG8gYmUgZml4ZWQKLSAgICAjIGJ5IHRoZSBsaW5rZXIKLSAgICBnYXNfdGVzdCAibG9uZ2NhbGwucyIgIiIgIiIgIkF2b2lkIHJlc29sdmluZyBsb25nLWNhbGxzIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODdlNjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5JTVBPUlQgZm9vLGRhdGEKLQotOyBTd2l0Y2ggaW4vb3V0IG9mIGRpZmZlcmVudCByb3VuZGluZyBtb2Rlcy4KLTsgQWxzbyBtYWtlIHN1cmUgd2UgIm9wdGltaXplIiBhd2F5IHVzZWxlc3Mgcm91bmRpbmcgbW9kZSByZWxvY2F0aW9ucwotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTCdmb28tMHgxMjM0NSwlcjI3Ci0JbGRvCVInZm9vLTB4MTIzNDUoJXIxKSwlcjEKLQlhZGRpbCAgIExSJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUlInZm9vLTB4MTIzNDUoJXIxKSwlcjEKLQlhZGRpbCAgIExSJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUlInZm9vLTB4MTIzNDUoJXIxKSwlcjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyNWQzOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3NlbGVjdG9yYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGludFZlY19lcnJvcl9oYW5kbGVyLERBVEEKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotaW50VmVjX2Vycm9yX2hhbmRsZXI6Ci0JLndvcmQgUCVkZWZhdWx0X2ludFZlY19lcnJvcl9oYW5kbGVyX19GUENjCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgZm9vLENPREUKLQkuRVhQT1JUIGZvbyxFTlRSWSxQUklWX0xFVj0zCi1mb286Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MAotCS5FTlRSWQotCS5zdGFiZCA2OCwwLDQxCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDI0MDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5ibG9ja3ogNAotCi1tYWluOgotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wCi0JLkVOVFJZCi0Jbm9wCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMmY5OWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS5zcGFjZSAkVEVYVCQKLQkuc3Vic3BhICRZQUJCQSQKLQkuc3Vic3BhICRNSUxMSUNPREUkCi0JLmFsaWduIDY0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2JybGVuYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2JybGVuYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTVjN2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzUwMiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1kb25lX19fMgotCS53b3JkIDAKLQkuSU1QT1JUIG1lbXNldCxDT0RFCi0JLkVYUE9SVCByZV9zeW50YXhfb3B0aW9ucyxEQVRBCi0JLmFsaWduIDQKLXJlX3N5bnRheF9vcHRpb25zCi0JLndvcmQgMAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLmFsaWduIDQKLXJlX2Vycm9yX21zZwotCS53b3JkIDAKLQkud29yZCBMJEMwMDAwCi0JLndvcmQgTCRDMDAwMQotCS53b3JkIEwkQzAwMDIKLQkud29yZCBMJEMwMDAzCi0JLndvcmQgTCRDMDAwNAotCS53b3JkIEwkQzAwMDUKLQkud29yZCBMJEMwMDA2Ci0JLndvcmQgTCRDMDAwNwotCS53b3JkIEwkQzAwMDgKLQkud29yZCBMJEMwMDA5Ci0JLndvcmQgTCRDMDAxMAotCS53b3JkIEwkQzAwMTEKLQkud29yZCBMJEMwMDEyCi0JLndvcmQgTCRDMDAxMwotCS53b3JkIEwkQzAwMTQKLQkud29yZCBMJEMwMDE1Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQKLQotCS5hbGlnbiA0Ci1MJEMwMDE1Ci0JLlNUUklORyAiVW5tYXRjaGVkICkgb3IgXFwpXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxNAotCS5TVFJJTkcgIlJlZ3VsYXIgZXhwcmVzc2lvbiB0b28gYmlnXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxMwotCS5TVFJJTkcgIlByZW1hdHVyZSBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxMgotCS5TVFJJTkcgIkludmFsaWQgcHJlY2VkaW5nIHJlZ3VsYXIgZXhwcmVzc2lvblx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTEKLQkuU1RSSU5HICJNZW1vcnkgZXhoYXVzdGVkXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxMAotCS5TVFJJTkcgIkludmFsaWQgcmFuZ2UgZW5kXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwOQotCS5TVFJJTkcgIkludmFsaWQgY29udGVudCBvZiBcXHtcXH1ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA4Ci0JLlNUUklORyAiVW5tYXRjaGVkIFxce1x4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDcKLQkuU1RSSU5HICJVbm1hdGNoZWQgKCBvciBcXChceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA2Ci0JLlNUUklORyAiVW5tYXRjaGVkIFsgb3IgW15ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA1Ci0JLlNUUklORyAiSW52YWxpZCBiYWNrIHJlZmVyZW5jZVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDQKLQkuU1RSSU5HICJUcmFpbGluZyBiYWNrc2xhc2hceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDAzCi0JLlNUUklORyAiSW52YWxpZCBjaGFyYWN0ZXIgY2xhc3MgbmFtZVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDIKLQkuU1RSSU5HICJJbnZhbGlkIGNvbGxhdGlvbiBjaGFyYWN0ZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDAxCi0JLlNUUklORyAiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDAwCi0JLlNUUklORyAiTm8gbWF0Y2hceDAwIgotCS5FWFBPUlQgcmVfbWF4X2ZhaWx1cmVzLERBVEEKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1yZV9tYXhfZmFpbHVyZXMKLQkud29yZCAyMDAwCi0JLklNUE9SVCBtYWxsb2MsQ09ERQotCS5JTVBPUlQgcmVhbGxvYyxDT0RFCi0JLklNUE9SVCBmcmVlLENPREUKLQkuSU1QT1JUIHN0cmNtcCxDT0RFCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQKLQotCS5hbGlnbiA0Ci1MJEMwMDE2Ci0JLlNUUklORyAiYWxudW1ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE3Ci0JLlNUUklORyAiYWxwaGFceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE4Ci0JLlNUUklORyAiYmxhbmtceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE5Ci0JLlNUUklORyAiY250cmxceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIwCi0JLlNUUklORyAiZGlnaXRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIxCi0JLlNUUklORyAiZ3JhcGhceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIyCi0JLlNUUklORyAibG93ZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIzCi0JLlNUUklORyAicHJpbnRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI0Ci0JLlNUUklORyAicHVuY3RceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI1Ci0JLlNUUklORyAic3BhY2VceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI2Ci0JLlNUUklORyAidXBwZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI3Ci0JLlNUUklORyAieGRpZ2l0XHgwMCIKLQkuSU1QT1JUIF9fYWxudW0sREFUQQotCS5JTVBPUlQgX19jdHlwZTIsREFUQQotCS5JTVBPUlQgX19jdHlwZSxEQVRBCi0JLklNUE9SVCBhdF9iZWdsaW5lX2xvY19wLENPREUKLQkuSU1QT1JUIGF0X2VuZGxpbmVfbG9jX3AsQ09ERQotCS5JTVBPUlQgc3RvcmVfb3AxLENPREUKLQkuSU1QT1JUIGluc2VydF9vcDEsQ09ERQotCS5JTVBPUlQgc3RvcmVfb3AyLENPREUKLQkuSU1QT1JUIGluc2VydF9vcDIsQ09ERQotCS5JTVBPUlQgY29tcGlsZV9yYW5nZSxDT0RFCi0JLklNUE9SVCBncm91cF9pbl9jb21waWxlX3N0YWNrLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci1yZWdleF9jb21waWxlCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MzIwLENBTExTLFNBVkVfUlAsRU5UUllfR1I9MTgKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKSA7IyA4OTg5IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gMzIwKCVyMzApLCVyMzAgOyMgODk5MSBhZGRzaTMvMgotCXN0dyAlcjE4LC0xNjgoJXIzMCkgOyMgODk5MyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTcsLTE2NCglcjMwKSA7IyA4OTk1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNiwtMTYwKCVyMzApIDsjIDg5OTcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjE1LC0xNTYoJXIzMCkgOyMgODk5OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTQsLTE1MiglcjMwKSA7IyA5MDAxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMywtMTQ4KCVyMzApIDsjIDkwMDMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEyLC0xNDQoJXIzMCkgOyMgOTAwNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTEsLTE0MCglcjMwKSA7IyA5MDA3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMCwtMTM2KCVyMzApIDsjIDkwMDkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjksLTEzMiglcjMwKSA7IyA5MDExIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI4LC0xMjgoJXIzMCkgOyMgOTAxMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNywtMTI0KCVyMzApIDsjIDkwMTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjYsLTEyMCglcjMwKSA7IyA5MDE3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI1LC0xMTYoJXIzMCkgOyMgOTAxOSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCwtMTEyKCVyMzApIDsjIDkwMjEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsLTEwOCglcjMwKSA7IyA5MDIzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIyNiwtMjc2KCVyMzApIDsjIDQgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyOSA7IyAyNSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXI4IDsjIDI4IHJlbG9hZF9vdXRzaSsyLzIKLQlzdHcgJXIwLC0yNjAoJXIzMCkgOyMgMzQgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyMTAgOyMgMzEgcmVsb2FkX291dHNpKzIvMgotCWxkaSA2NDAsJXIyNiA7IyAzNyByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg3NzQgcmVsb2FkX291dHNpKzIvNQotCWNvcHkgJXIyNCwlcjE1IDsjIDggcmVsb2FkX291dHNpKzIvMQotCXN0dyAlcjEsLTI5NiglcjMwKSA7IyAyMzI1IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMjMsJXI1IDsjIDEwIHJlbG9hZF9vdXRzaSsyLzEKLQlhZGRsICVyMSwlcjI1LCVyMTYgOyMgMTkgYWRkc2kzLzEKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIG1hbGxvYywlcjIgOyMgMzkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgMjAoJXI1KSwlcjE0IDsjIDIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw8PiAwLCVyMjgsTCQwMDIxIDsjIDQ4IGJsZXUrMQotCXN0dyAlcjI4LC0zMTIoJXIzMCkgOyMgNDMgcmVsb2FkX291dHNpKzIvNgotTCQwOTUzCi0JYmwgTCQwODY3LCVyMCA7IyA1MyBqdW1wCi0JbGRpIDEyLCVyMjggOyMgNTEgcmVsb2FkX291dHNpKzIvMgotTCQwMDIxCi0JbGRpIDMyLCVyMTkgOyMgNTggcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjE5LC0zMDgoJXIzMCkgOyMgNTkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjAsLTMwNCglcjMwKSA7IyA2MiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTUsMTIoJXI1KSA7IyA2NSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCw4KCVyNSkgOyMgODUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjAsMjQoJXI1KSA7IyA4OCByZWxvYWRfb3V0c2krMi82Ci0JYWRkaWwgTFInZG9uZV9fXzItJGdsb2JhbCQsJXIyNyA7IyA5MiBwaWMyX2xvX3N1bSsxCi0JbGR3IDI4KCVyNSksJXIxOSA7IyA2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IFJSJ2RvbmVfX18yLSRnbG9iYWwkKCVyMSksJXIyMCA7IyA5NCByZWxvYWRfb3V0c2krMi81Ci0JZGVwaSAwLDMsMSwlcjE5IDsjIDY5IGFuZHNpMy8yCi0JZGVwaSAwLDYsMiwlcjE5IDsjIDgwIGFuZHNpMy8yCi0JY29taWIsPD4gMCwlcjIwLEwkMDAyMiA7IyA5NSBibGV1KzEKLQlzdHcgJXIxOSwyOCglcjUpIDsjIDgyIHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQsJXIyNyA7IyA5OSBwaWMyX2xvX3N1bSsxCi0JbGRvIFJSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCglcjEpLCVyNCA7IyAxMDAgbW92aGktMgotCWNvcHkgJXI0LCVyMjYgOyMgMTAxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjI1IDsjIDEwMiByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyIDsjIDEwNCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkaSAyNTYsJXIyNCA7IyAxMDMgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxLCVyMjAgOyMgODczMiBtb3ZxaSsxLzIKLQlsZG8gOTcoJXI0KSwlcjE5IDsjIDg3MzYgYWRkc2kzLzIKLQlsZG8gMTIyKCVyNCksJXI0IDsjIDg3MzggYWRkc2kzLzIKLQlzdGJzLG1hICVyMjAsMSglcjE5KSA7IyAxMTUgbW92cWkrMS82Ci1MJDExNTUKLQljb21iLD49LG4gJXI0LCVyMTksTCQxMTU1IDsjIDEyMSBibGV1KzEKLQlzdGJzLG1hICVyMjAsMSglcjE5KSA7IyAxMTUgbW92cWkrMS82Ci0JbGRpIDEsJXIyMSA7IyA4NzE3IG1vdnFpKzEvMgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCwlcjI3IDsjIDg3MTIgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQoJXIxKSwlcjE5IDsjIDg3MTUgbW92aGktMgotCWxkbyA2NSglcjE5KSwlcjIwIDsjIDg3MjEgYWRkc2kzLzIKLQlsZG8gOTAoJXIxOSksJXIxOSA7IyA4NzIzIGFkZHNpMy8yCi0Jc3RicyxtYSAlcjIxLDEoJXIyMCkgOyMgMTM4IG1vdnFpKzEvNgotTCQxMTU2Ci0JY29tYiw+PSxuICVyMTksJXIyMCxMJDExNTYgOyMgMTQ0IGJsZXUrMQotCXN0YnMsbWEgJXIyMSwxKCVyMjApIDsjIDEzOCBtb3ZxaSsxLzYKLQlsZGkgNDgsJXIyMCA7IyAxNTEgcmVsb2FkX291dHNpKzIvMgotCWxkaSA1NywlcjIyIDsjIDc5NzYgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxLCVyMjEgOyMgODcwNyBtb3ZxaSsxLzIKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQrNDgsJXIyNyA7IyA4NzA1IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKzQ4KCVyMSksJXIxOSA7IyA4NzExIG1vdmhpLTIKLUwkMDAzNwotCWxkbyAxKCVyMjApLCVyMjAgOyMgMTY0IGFkZHNpMy8yCi0JY29tYiw+PSAlcjIyLCVyMjAsTCQwMDM3IDsjIDE2NyBibGV1KzEKLQlzdGJzLG1hICVyMjEsMSglcjE5KSA7IyAxNjEgbW92cWkrMS82Ci0JYWRkaWwgTFIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkLCVyMjcgOyMgMTc0IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKCVyMSksJXIxOSA7IyAxNzUgbW92aGktMgotCWxkaSAxLCVyMjAgOyMgMTc2IG1vdnFpKzEvMgotCXN0YiAlcjIwLDk1KCVyMTkpIDsjIDE3NyBtb3ZxaSsxLzYKLQlhZGRpbCBMUidkb25lX19fMi0kZ2xvYmFsJCwlcjI3IDsjIDE3OCBwaWMyX2xvX3N1bSsxCi0JbGRpIDEsJXIxOSA7IyAxODAgcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjE5LFJSJ2RvbmVfX18yLSRnbG9iYWwkKCVyMSkgOyMgMTgxIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDAyMgotCWxkdyA0KCVyNSksJXIxOSA7IyAxODcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDAzOSA7IyAxODkgYmxldSsxCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDE5MyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIyNixMJDAwNDAgOyMgMTk1IGJsZXUrMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMjA1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjUgOyMgMjAzIHJlbG9hZF9vdXRzaSsyLzIKLQlibCBMJDExNTcsJXIwIDsjIDIxMSBqdW1wCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDIyMyByZWxvYWRfb3V0c2krMi82Ci1MJDAwNDAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIG1hbGxvYywlcjIgOyMgMjE5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjYgOyMgMjE3IHJlbG9hZF9vdXRzaSsyLzIKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMjIzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMTE1NwotCWxkdyAwKCVyNSksJXIxOSA7IyAyMjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+IDAsJXIxOSxMJDAwNDIgOyMgMjMwIGJsZXUrMQotCWxkaSAzMiwlcjE5IDsjIDI0MyByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAyMzQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDIzMiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAyMzgganVtcAotCWxkaSAxMiwlcjI4IDsjIDUxIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDA0MgotCXN0dyAlcjE5LDQoJXI1KSA7IyAyNDQgcmVsb2FkX291dHNpKzIvNgotTCQwMDM5Ci0JbGR3IDAoJXI1KSwlcjYgOyMgMjQ5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDc5ODEgcmVsb2FkX291dHNpKzIvNQotCWNvbWNsciw8PiAlcjE2LCVyMTksJXIwIDsjIDc5ODIgYmxldSsxCi0JYmwgTCQwMDQ0LCVyMAotCWNvcHkgJXI2LCVyMTIgOyMgMjUzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMzQgcmVsb2FkX291dHNpKzIvNQotTCQxMTc4Ci0JbGRicyxtYSAxKCVyMTkpLCVyNyA7IyAyNzcgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMDQ3IDsjIDI4MiBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzMzcgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyAyODMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjg2IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMDQ3Ci0JbGRvIC0xMCglcjcpLCVyMTkgOyMgNzg5NSBhZGRzaTMvMgotCWFkZGksdXYgLTExNSwlcjE5LCVyMCA7IyA3ODk2IGNhc2VzaTAKLQlibHIsbiAlcjE5LCVyMAotCWIsbiBMJDAwNzYKLUwkMDg2MwotCWJsIEwkMDM3NiwlcjAKLQlub3AgOyMgOTA5MiBzd2l0Y2hfanVtcAotTCQwOTU0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MDk1IHN3aXRjaF9qdW1wCi1MJDA5NTUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkwOTggc3dpdGNoX2p1bXAKLUwkMDk1NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEwMSBzd2l0Y2hfanVtcAotTCQwOTU3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTA0IHN3aXRjaF9qdW1wCi1MJDA5NTgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMDcgc3dpdGNoX2p1bXAKLUwkMDk1OQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExMCBzd2l0Y2hfanVtcAotTCQwOTYwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTEzIHN3aXRjaF9qdW1wCi1MJDA5NjEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMTYgc3dpdGNoX2p1bXAKLUwkMDk2MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExOSBzd2l0Y2hfanVtcAotTCQwOTYzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTIyIHN3aXRjaF9qdW1wCi1MJDA5NjQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMjUgc3dpdGNoX2p1bXAKLUwkMDk2NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEyOCBzd2l0Y2hfanVtcAotTCQwOTY2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTMxIHN3aXRjaF9qdW1wCi1MJDA5NjcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMzQgc3dpdGNoX2p1bXAKLUwkMDk2OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEzNyBzd2l0Y2hfanVtcAotTCQwOTY5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQwIHN3aXRjaF9qdW1wCi1MJDA5NzAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDMgc3dpdGNoX2p1bXAKLUwkMDk3MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE0NiBzd2l0Y2hfanVtcAotTCQwOTcyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQ5IHN3aXRjaF9qdW1wCi1MJDA5NzMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNTIgc3dpdGNoX2p1bXAKLUwkMDk3NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE1NSBzd2l0Y2hfanVtcAotTCQwOTc1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTU4IHN3aXRjaF9qdW1wCi1MJDA5NzYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNjEgc3dpdGNoX2p1bXAKLUwkMDk3NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE2NCBzd2l0Y2hfanVtcAotTCQwOTc4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTY3IHN3aXRjaF9qdW1wCi1MJDA5NzkKLQlibCBMJDAwNzcsJXIwIDsjIDkxNzAgc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjI2IDsjIDIzNDkgcmVsb2FkX291dHNpKzIvNQotTCQwOTgwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTczIHN3aXRjaF9qdW1wCi1MJDA5ODEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNzYgc3dpdGNoX2p1bXAKLUwkMDk4MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE3OSBzd2l0Y2hfanVtcAotTCQwOTgzCi0JYmwgTCQwMzY4LCVyMAotCW5vcCA7IyA5MTgyIHN3aXRjaF9qdW1wCi1MJDA5ODQKLQlibCBMJDAzNzIsJXIwCi0Jbm9wIDsjIDkxODUgc3dpdGNoX2p1bXAKLUwkMDk4NQotCWJsIEwkMDEwNCwlcjAKLQlub3AgOyMgOTE4OCBzd2l0Y2hfanVtcAotTCQwOTg2Ci0JYmwgTCQxMTU4LCVyMCA7IyA5MTkxIHN3aXRjaF9qdW1wCi0JbGRpIDEwMjYsJXIxOSA7IyA2NjIgcmVsb2FkX291dHNpKzIvMgotTCQwOTg3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTk0IHN3aXRjaF9qdW1wCi1MJDA5ODgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxOTcgc3dpdGNoX2p1bXAKLUwkMDk4OQotCWJsIEwkMDE5NiwlcjAgOyMgOTIwMCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgwMjcgcmVsb2FkX291dHNpKzIvNQotTCQwOTkwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjAzIHN3aXRjaF9qdW1wCi1MJDA5OTEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMDYgc3dpdGNoX2p1bXAKLUwkMDk5MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIwOSBzd2l0Y2hfanVtcAotTCQwOTkzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjEyIHN3aXRjaF9qdW1wCi1MJDA5OTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMTUgc3dpdGNoX2p1bXAKLUwkMDk5NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIxOCBzd2l0Y2hfanVtcAotTCQwOTk2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjIxIHN3aXRjaF9qdW1wCi1MJDA5OTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMjQgc3dpdGNoX2p1bXAKLUwkMDk5OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIyNyBzd2l0Y2hfanVtcAotTCQwOTk5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjMwIHN3aXRjaF9qdW1wCi1MJDEwMDAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzMgc3dpdGNoX2p1bXAKLUwkMTAwMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIzNiBzd2l0Y2hfanVtcAotTCQxMDAyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjM5IHN3aXRjaF9qdW1wCi1MJDEwMDMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNDIgc3dpdGNoX2p1bXAKLUwkMTAwNAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI0NSBzd2l0Y2hfanVtcAotTCQxMDA1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjQ4IHN3aXRjaF9qdW1wCi1MJDEwMDYKLQlibCBMJDAxMDEsJXIwIDsjIDkyNTEgc3dpdGNoX2p1bXAKLQlsZGkgMTAyNiwlcjE5IDsjIDY2MiByZWxvYWRfb3V0c2krMi8yCi1MJDEwMDcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNTQgc3dpdGNoX2p1bXAKLUwkMTAwOAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI1NyBzd2l0Y2hfanVtcAotTCQxMDA5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjYwIHN3aXRjaF9qdW1wCi1MJDEwMTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjMgc3dpdGNoX2p1bXAKLUwkMTAxMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI2NiBzd2l0Y2hfanVtcAotTCQxMDEyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjY5IHN3aXRjaF9qdW1wCi1MJDEwMTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNzIgc3dpdGNoX2p1bXAKLUwkMTAxNAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI3NSBzd2l0Y2hfanVtcAotTCQxMDE1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjc4IHN3aXRjaF9qdW1wCi1MJDEwMTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyODEgc3dpdGNoX2p1bXAKLUwkMTAxNwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI4NCBzd2l0Y2hfanVtcAotTCQxMDE4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjg3IHN3aXRjaF9qdW1wCi1MJDEwMTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTAgc3dpdGNoX2p1bXAKLUwkMTAyMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5MyBzd2l0Y2hfanVtcAotTCQxMDIxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjk2IHN3aXRjaF9qdW1wCi1MJDEwMjIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTkgc3dpdGNoX2p1bXAKLUwkMTAyMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMwMiBzd2l0Y2hfanVtcAotTCQxMDI0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzA1IHN3aXRjaF9qdW1wCi1MJDEwMjUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMDggc3dpdGNoX2p1bXAKLUwkMTAyNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMxMSBzd2l0Y2hfanVtcAotTCQxMDI3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzE0IHN3aXRjaF9qdW1wCi1MJDEwMjgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMTcgc3dpdGNoX2p1bXAKLUwkMTAyOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyMCBzd2l0Y2hfanVtcAotTCQxMDMwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzIzIHN3aXRjaF9qdW1wCi1MJDEwMzEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMjYgc3dpdGNoX2p1bXAKLUwkMTAzMgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyOSBzd2l0Y2hfanVtcAotTCQxMDMzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzMyIHN3aXRjaF9qdW1wCi1MJDEwMzQKLQlibCBMJDAyMTYsJXIwIDsjIDkzMzUgc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MTggcmVsb2FkX291dHNpKzIvNQotTCQxMDM1Ci0JYmwgTCQwMzg3LCVyMCA7IyA5MzM4IHN3aXRjaF9qdW1wCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzNzk3IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTAzNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM0MSBzd2l0Y2hfanVtcAotTCQxMDM3Ci0JYmwgTCQwMDUzLCVyMCA7IyA5MzQ0IHN3aXRjaF9qdW1wCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg3NzcgcmVsb2FkX291dHNpKzIvNQotTCQxMDM4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzQ3IHN3aXRjaF9qdW1wCi1MJDEwMzkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTAgc3dpdGNoX2p1bXAKLUwkMTA0MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1MyBzd2l0Y2hfanVtcAotTCQxMDQxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzU2IHN3aXRjaF9qdW1wCi1MJDEwNDIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTkgc3dpdGNoX2p1bXAKLUwkMTA0MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM2MiBzd2l0Y2hfanVtcAotTCQxMDQ0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzY1IHN3aXRjaF9qdW1wCi1MJDEwNDUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNjggc3dpdGNoX2p1bXAKLUwkMTA0NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM3MSBzd2l0Y2hfanVtcAotTCQxMDQ3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzc0IHN3aXRjaF9qdW1wCi1MJDEwNDgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNzcgc3dpdGNoX2p1bXAKLUwkMTA0OQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4MCBzd2l0Y2hfanVtcAotTCQxMDUwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzgzIHN3aXRjaF9qdW1wCi1MJDEwNTEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzODYgc3dpdGNoX2p1bXAKLUwkMTA1MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4OSBzd2l0Y2hfanVtcAotTCQxMDUzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzkyIHN3aXRjaF9qdW1wCi1MJDEwNTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzOTUgc3dpdGNoX2p1bXAKLUwkMTA1NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM5OCBzd2l0Y2hfanVtcAotTCQxMDU2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDAxIHN3aXRjaF9qdW1wCi1MJDEwNTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MDQgc3dpdGNoX2p1bXAKLUwkMTA1OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQwNyBzd2l0Y2hfanVtcAotTCQxMDU5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDEwIHN3aXRjaF9qdW1wCi1MJDEwNjAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTMgc3dpdGNoX2p1bXAKLUwkMTA2MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQxNiBzd2l0Y2hfanVtcAotTCQxMDYyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDE5IHN3aXRjaF9qdW1wCi1MJDEwNjMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MjIgc3dpdGNoX2p1bXAKLUwkMTA2NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQyNSBzd2l0Y2hfanVtcAotTCQxMDY1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDI4IHN3aXRjaF9qdW1wCi1MJDEwNjYKLQlibCBMJDAzODMsJXIwIDsjIDk0MzEgc3dpdGNoX2p1bXAKLQlsZGkgNDYwOCwlcjIwIDsjIDM3NzggcmVsb2FkX291dHNpKzIvMgotTCQxMDY3Ci0JYmwgTCQwMzgwLCVyMAotCW5vcCA7IyA5NDM0IHN3aXRjaF9qdW1wCi1MJDEwNjgKLQlibCxuIEwkMDA3NiwlcjAgOyMgNzg5OSBqdW1wCi1MJDAwNTMKLQlsZHcgLTI5NiglcjMwKSwlcjI1IDsjIDIzNDMgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxOSA7IyAzMDYgYWRkc2kzLzIKLQljb21iLD0sbiAlcjE5LCVyMjUsTCQwMDU1IDsjIDMwOCBibGV1KzEKLQliYiw8ICVyMTUsMjgsTCQwMDU1IDsjIDMxMyBibGV1KzMKLQlsZHcgLTI3NiglcjMwKSwlcjI2IDsjIDMxNSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBhdF9iZWdsaW5lX2xvY19wLCVyMiA7IyAzMjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyNCA7IyAzMTkgcmVsb2FkX291dHNpKzIvMQotCWV4dHJzICVyMjgsMzEsOCwlcjI4IDsjIDMyNCBleHRlbmRxaXNpMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyAzMjYgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAwNTUKLQlsZHcgMCglcjUpLCVyNCA7IyA3OTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzk4OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3OTg3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3OTg4IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMDYwIDsjIDc5OTAgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NzAxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDA2MQotCWNvbWNsciw8PiAlcjMsJXIyMCwlcjAgOyMgMzU3IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAzNjcgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMDY2IDsjIDM3NSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMzY5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyAzNzggcmVsb2FkX291dHNpKzIvNgotTCQwMDY2Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDM4NSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAzODkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMzg3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMzk3IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAzOTMgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAwNTkgOyMgNDA3IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDA5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQxMiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDQxMyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDA2OSA7IyA0MTggYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0MTYgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA0MTkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQyMiBhZGRzaTMvMQotTCQwMDY5Ci0JY29taWIsPSAwLCVyOCxMJDAwNzAgOyMgNDI1IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNDI2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQyOSBhZGRzaTMvMQotTCQwMDcwCi0JY29taWIsPSAwLCVyOSxMJDAwNTkgOyMgNDMyIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNDMzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQzNiBhZGRzaTMvMQotTCQwMDU5Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMzM3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMzQxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDMzOCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzM5IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMDYxCi0Jbm9wIDsjIDM0MyBibGV1KzEKLUwkMDA2MAotCWxkaSA4LCVyMTkgOyMgNDU4IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNDc5IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ1OSBtb3ZxaSsxLzYKLUwkMDA3NwotCWNvbWIsPSxuICVyMTYsJXIyNixMJDAwNzkgOyMgNDg1IGJsZXUrMQotCWJiLDwgJXIxNSwyOCxMJDAwNzkgOyMgNDkwIGJsZXUrMwotCWNvcHkgJXIxNiwlcjI1IDsjIDQ5NCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBhdF9lbmRsaW5lX2xvY19wLCVyMiA7IyA0OTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyNCA7IyA0OTYgcmVsb2FkX291dHNpKzIvMQotCWV4dHJzICVyMjgsMzEsOCwlcjI4IDsjIDUwMSBleHRlbmRxaXNpMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA1MDMgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAwNzkKLQlsZHcgMCglcjUpLCVyNCA7IyA3OTk0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzk5NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3OTk1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3OTk2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMDg0IDsjIDc5OTggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4Njk5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDA4NQotCWNvbWNsciw8PiAlcjMsJXIyMCwlcjAgOyMgNTM0IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1NDQgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMDkwIDsjIDU1MiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNTQ2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA1NTUgcmVsb2FkX291dHNpKzIvNgotTCQwMDkwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDU2MiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA1NjYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTY0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNTc0IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA1NzAgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAwODMgOyMgNTg0IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNTg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDU4OSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDU5MCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDA5MyA7IyA1OTUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA1OTMgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA1OTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDU5OSBhZGRzaTMvMQotTCQwMDkzCi0JY29taWIsPSAwLCVyOCxMJDAwOTQgOyMgNjAyIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjAzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDYwNiBhZGRzaTMvMQotTCQwMDk0Ci0JY29taWIsPSAwLCVyOSxMJDAwODMgOyMgNjA5IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjEwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDYxMyBhZGRzaTMvMQotTCQwMDgzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNTE0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTE4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDUxNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNTE2IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMDg1Ci0Jbm9wIDsjIDUyMCBibGV1KzEKLUwkMDA4NAotCWxkaSA5LCVyMTkgOyMgNjM1IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjU2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDYzNiBtb3ZxaSsxLzYKLUwkMDg3NwotCWJsIEwkMDExMCwlcjAgOyMgODk3IGp1bXAKLQlzdHcgJXIyMSwtMjk2KCVyMzApIDsjIDIzOTEgcmVsb2FkX291dHNpKzIvNgotTCQwMTAxCi1MJDExNTgKLQlhbmQgJXIxNSwlcjE5LCVyMTkgOyMgNjYzIGFuZHNpMy8xCi0JY29taWNsciw9IDAsJXIxOSwlcjAgOyMgNjY1IGJsZXUrMQotCWJsLG4gTCQwMDc2LCVyMAotTCQwMTA0Ci0JY29taWIsPD4gMCwlcjgsTCQwMTA1IDsjIDY3NCBibGV1KzEKLQlsZGkgMCwlcjEzIDsjIDcxMSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMsPj0gJXIxNSwyNiwxLCVyMCA7IyA2ODEgYmxldSszCi0JZXh0cnMsPCAlcjE1LDI3LDEsJXIwIDsjIDcwMCBtb3ZzaS00Ci0Jbm9wCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAxMDUKLQlsZGkgMCwlcjExIDsjIDcxNCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXIyMiA7IyA3MTYgcmVsb2FkX291dHNpKzIvMgotCWxkaSA0MywlcjI0IDsjIDg2ODggcmVsb2FkX291dHNpKzIvMgotCWxkaSA2MywlcjIzIDsjIDg2OTAgcmVsb2FkX291dHNpKzIvMgotCWxkaSA0MiwlcjI4IDsjIDg2OTIgcmVsb2FkX291dHNpKzIvMgotCWxkaSAyLCVyMTkgOyMgODY5NCByZWxvYWRfb3V0c2krMi8yCi0JYW5kICVyMTUsJXIxOSwlcjI1IDsjIDg2OTUgYW5kc2kzLzEKLQlsZGkgOTIsJXIyNiA7IyA4Njk3IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDEwOQotCWNvbWIsPSAlcjI0LCVyNyxMJDAxMTIgOyMgNzI3IGJsZXUrMQotCWNvcHkgJXIxMSwlcjE5IDsjIDg3ODAgcmVsb2FkX291dHNpKzIvMQotCWRlcGkgLTEsMzEsMSwlcjE5IDsjIDcyOSBpb3JzaTMrMS8yCi0JYmwgTCQwMTEzLCVyMCA7IyA3MzEganVtcAotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDczMCBleHRlbmRxaXNpMgotTCQwMTEyCi0JZXh0cnMgJXIxMSwzMSw4LCVyMTkgOyMgNzM0IGV4dGVuZHFpc2kyCi1MJDAxMTMKLUwkMTE1OQotCWNvbWIsPSAlcjIzLCVyNyxMJDAxMTQgOyMgNzQ0IGJsZXUrMQotCWNvcHkgJXIxOSwlcjExIDsjIDczNyByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjIyLCVyMTkgOyMgODc4MyByZWxvYWRfb3V0c2krMi8xCi0JZGVwaSAtMSwzMSwxLCVyMTkgOyMgNzQ2IGlvcnNpMysxLzIKLQlibCBMJDAxMTUsJXIwIDsjIDc0OCBqdW1wCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzQ3IGV4dGVuZHFpc2kyCi1MJDAxMTQKLQlleHRycyAlcjIyLDMxLDgsJXIxOSA7IyA3NTEgZXh0ZW5kcWlzaTIKLUwkMDExNQotCWxkdyAtMjk2KCVyMzApLCVyMjEgOyMgMjM1NSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMSxMJDAxMTAgOyMgNzU3IGJsZXUrMQotCWNvcHkgJXIxOSwlcjIyIDsjIDc1NCByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjIxLCVyMjAgOyMgODc0MyByZWxvYWRfb3V0c2krMi8xCi0JbGRicyxtYSAxKCVyMjApLCVyNyA7IyA3NzYgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMTE4IDsjIDc4MSBibGV1KzEKLQlzdHcgJXIyMCwtMjk2KCVyMzApIDsjIDIzNjQgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA3ODIgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNzg1IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMTE4Ci0JY29tYiw9ICVyMjgsJXI3LEwkMDEwOQotCW5vcCA7IyA4MDIgYmxldSsxCi0JY29taWIsPD4sbiAwLCVyMjUsTCQwODY5IDsjIDgwNyBibGV1KzEKLQljb21iLD0gJXIyNCwlcjcsTCQxMTU5IDsjIDgxMSBibGV1KzEKLQlleHRycyAlcjExLDMxLDgsJXIxOSA7IyA3MzQgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIyMywlcjcsTCQwMTA5IDsjIDgxNSBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MDAgcmVsb2FkX291dHNpKzIvNQotCWJsLG4gTCQxMTYwLCVyMCA7IyA4MjcganVtcAotTCQwODY5Ci0JY29tYiw8PiAlcjI2LCVyNyxMJDAxMjYgOyMgODMxIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMCByZWxvYWRfb3V0c2krMi81Ci0JY29tY2xyLDw+ICVyMTYsJXIyMCwlcjAgOyMgODM1IGJsZXUrMQotCWJsIEwkMDkwMywlcjAKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDg2MyBhZGRzaTMvMgotCWxkYiAxKCVyMjEpLCVyMyA7IyA4NjAgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMTI5IDsjIDg2NSBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzNzkgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjMsJXIxOSA7IyA4NjYgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjMgOyMgODY5IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMTI5Ci0JY29tYiw9ICVyMjQsJXIzLEwkMDEwOSA7IyA4ODYgYmxldSsxCi0JY29weSAlcjMsJXI3IDsjIDkwMyByZWxvYWRfb3V0c2krMi8xCi0JY29tYiw8PiAlcjIzLCVyMyxMJDA4NzcKLQlub3AgOyMgODkwIGJsZXUrMQotCWJsLG4gTCQwMTA5LCVyMCA7IyA5MDUganVtcAotTCQwMTI2Ci1MJDExNjAKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyA5MTAgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzOTcgcmVsb2FkX291dHNpKzIvNgotTCQwMTEwCi0JY29taWNsciw8PiAwLCVyOCwlcjAgOyMgOTI3IGJsZXUrMQotCWJsIEwkMTE2MSwlcjAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0sbiAwLCVyMjIsTCQwMTM3IDsjIDkzNCBibGV1KzEKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDAyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAwNSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDAzIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDA0IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTM5IDsjIDgwMDYgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4Njg2IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE0MAotCWNvbWNsciw8PiAlcjQsJXIyMCwlcjAgOyMgOTYxIGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA5NzEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwMTQ1IDsjIDk3OSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgOTczIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA5ODIgcmVsb2FkX291dHNpKzIvNgotTCQwMTQ1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDk4OSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA5OTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgOTkxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTAwMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgOTk3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTM4IDsjIDEwMTEgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMDEzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDEwMTYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxMDE3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTQ4IDsjIDEwMjIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxMDIwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTAyMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTAyNiBhZGRzaTMvMQotTCQwMTQ4Ci0JY29taWIsPSAwLCVyOCxMJDAxNDkgOyMgMTAyOSBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDEwMzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTAzMyBhZGRzaTMvMQotTCQwMTQ5Ci0JY29taWIsPSAwLCVyOSxMJDAxMzggOyMgMTAzNiBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDEwMzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTA0MCBhZGRzaTMvMQotTCQwMTM4Ci0JbGR3IDAoJXI1KSwlcjMgOyMgOTQxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgOTQ1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDk0MiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgOTQzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTQwCi0Jbm9wIDsjIDk0NyBibGV1KzEKLUwkMDEzOQotCWNvbWliLD0gMCwlcjE0LEwkMDE1NCA7IyAxMDYzIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMyByZWxvYWRfb3V0c2krMi81Ci0JbGRiIC0yKCVyMTkpLCVyMTkgOyMgMTA2NiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXIxOSwlcjE5IDsjIDEwNjcgYWRkc2kzLzEKLQlibCBMJDA5NDcsJXIwIDsjIDEwNzEganVtcAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMTA2OSBtb3ZxaSsxLzUKLUwkMDE1NAotCWxkYiAtMiglcjE5KSwlcjE5IDsjIDEwNzUgbW92cWkrMS81Ci1MJDA5NDcKLQljb21pYiw9IDAsJXIxNCxMJDAxNTYgOyMgMTA3OSBibGV1KzEKLQlleHRycyAlcjE5LDMxLDgsJXIyMCA7IyAxMDc2IGV4dGVuZHFpc2kyCi0JbGRiIDQ2KCVyMTQpLCVyMTkgOyMgMTA4MSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAxMDgyIGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMTksJXIyMCxMJDAxNTcgOyMgMTA4NCBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLQlibCxuIEwkMTE2MiwlcjAgOyMgMTA4NSBqdW1wCi1MJDAxNTYKLQlsZGkgNDYsJXIxOSA7IyAxMDg5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXIyMCxMJDExNjIgOyMgMTA5MSBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE1NwotCWNvbWliLD0gMCwlcjExLEwkMDE1MyA7IyAxMDk2IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwOSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw8PD0gJXIxNiwlcjE5LEwkMTE2MiA7IyAxMDk4IGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLD0sbiAwLCVyMTQsTCQwMTU4IDsjIDExMDAgYmxldSsxCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMTAzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjE5LCVyMTkgOyMgMTEwNCBhZGRzaTMvMQotTCQwMTU4Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMTEyIG1vdnFpKzEvNQotCWNvbWliLD0gMCwlcjE0LEwkMDE2MCA7IyAxMTE2IGJsZXUrMQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDExMTMgZXh0ZW5kcWlzaTIKLQlsZGIgMTAoJXIxNCksJXIxOSA7IyAxMTE4IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDExMTkgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxOSwlcjIwLEwkMDE2MSA7IyAxMTIxIGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQxMTYyLCVyMCA7IyAxMTIyIGp1bXAKLUwkMDE2MAotCWNvbWliLDw+IDEwLCVyMjAsTCQxMTYyIDsjIDExMjYgYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi1MJDAxNjEKLQliYiw8ICVyMTUsMjUsTCQxMTYyIDsjIDExMzQgYmxldSszCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEyLCVyMjYgOyMgMTE0MCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjYsJXIyNSA7IyAxMTQyIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDExMzcgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgMTE0NiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDExNDQgYWRkc2kzLzIKLQlibCBMJDAxNjIsJXIwIDsjIDExNTEganVtcAotCWxkaSAxLCVyMTMgOyMgMTE0OSByZWxvYWRfb3V0c2krMi8yCi1MJDAxNTMKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2MgotCWNvcHkgJXI2LCVyMjUgOyMgMTE2MSByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyOCwlcjYsJXIyNCA7IyAxMTU2IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDExNjUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTYoJXIyNCksJXIyNCA7IyAxMTYzIGFkZHNpMy8yCi1MJDAxNjIKLQlsZG8gMyglcjYpLCVyNiA7IyAxMTY4IGFkZHNpMy8yCi1MJDAxMzcKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDEwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAxMyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDExIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDEyIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTY0IDsjIDgwMTQgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4Njg0IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE2NQotCWNvbWNsciw8PiAlcjQsJXIyMCwlcjAgOyMgMTE5NSBibGV1KzEKLQlibCBMJDA5NDQsJXIwCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTIwNSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxNzAgOyMgMTIxMyBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTIwNyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTIxNiByZWxvYWRfb3V0c2krMi82Ci1MJDAxNzAKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTIyMyByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxMjI3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDEyMjUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMjM1IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxMjMxIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTYzIDsjIDEyNDUgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMjQ3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDEyNTAgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxMjUxIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTczIDsjIDEyNTYgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxMjU0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTI1NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTI2MCBhZGRzaTMvMQotTCQwMTczCi0JY29taWIsPSAwLCVyOCxMJDAxNzQgOyMgMTI2MyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDEyNjQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTI2NyBhZGRzaTMvMQotTCQwMTc0Ci0JY29taWIsPSAwLCVyOSxMJDAxNjMgOyMgMTI3MCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDEyNzEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTI3NCBhZGRzaTMvMQotTCQwMTYzCi0JbGR3IDAoJXI1KSwlcjMgOyMgMTE3NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDExNzkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTE3NiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgMTE3NyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDE2NQotCW5vcCA7IyAxMTgxIGJsZXUrMQotTCQwMTY0Ci0JbGRpIDE0LCVyMjYgOyMgODc4NiByZWxvYWRfb3V0c2krMi8yCi0JY29taWNsciw9IDAsJXIxMywlcjAgOyMgMTMxMCBiZXEtMS8yCi0JbGRpIDE1LCVyMjYKLQljb3B5ICVyOCwlcjI1IDsjIDEzMTIgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXI4LCVyMjQgOyMgMTMxNCBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgMTMxOCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgMTMxNiByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDAsJXI5IDsjIDEzMjEgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLDw+IDAsJXIxMSxMJDAwNDMgOyMgMTMyNiBibGV1KzEKLQlsZG8gMyglcjYpLCVyNiA7IyAxMzIzIGFkZHNpMy8yCi0JbGR3IDAoJXI1KSwlcjMgOyMgODAxOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgwMjIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODAyMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODAyMSBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDE4MiA7IyA4MDIzIGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODY4MiByZWxvYWRfb3V0c2krMi8zCi1MJDAxODMKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDEzNTIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTM2MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxODggOyMgMTM3MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTM2NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTM3MyByZWxvYWRfb3V0c2krMi82Ci1MJDAxODgKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTM4MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxMzg0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDEzODIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMzkyIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxMzg4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTgxIDsjIDE0MDIgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxNDA0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE0MDcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxNDA4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTkxIDsjIDE0MTMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNDExIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTQxNCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTQxNyBhZGRzaTMvMQotTCQwMTkxCi0JY29taWIsPSAwLCVyOCxMJDAxOTIgOyMgMTQyMCBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDE0MjEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTQyNCBhZGRzaTMvMQotTCQwMTkyCi0JY29taWIsPSAwLCVyOSxMJDAxODEgOyMgMTQyNyBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDE0Mjggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTQzMSBhZGRzaTMvMQotTCQwMTgxCi0JbGR3IDAoJXI1KSwlcjMgOyMgMTMzMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDEzMzYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTMzMyBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgMTMzNCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDE4MwotCW5vcCA7IyAxMzM4IGJsZXUrMQotTCQwMTgyCi0JbGRpIDE4LCVyMjYgOyMgMTQ1NCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjgsJXIyNSA7IyAxNDU2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMywlcjI0IDsjIDE0NTggcmVsb2FkX291dHNpKzIvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgMTQ2MiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgMTQ2MCByZWxvYWRfb3V0c2krMi8xCi0JYmwgTCQwMDQzLCVyMCA7IyAxNDcwIGp1bXAKLQlsZG8gMyglcjYpLCVyNiA7IyAxNDY0IGFkZHNpMy8yCi1MJDAxOTYKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAzMCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDI4IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDI5IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIwMSA7IyA4MDMxIGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyAxNDc1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2ODAgcmVsb2FkX291dHNpKzIvMwotTCQwMjAyCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyAxNTAzIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE1MTMgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMjA3IDsjIDE1MjEgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE1MTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDE1MjQgcmVsb2FkX291dHNpKzIvNgotTCQwMjA3Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDE1MzEgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTUzNSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxNTMzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTU0MyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTUzOSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDIwMCA7IyAxNTUzIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTU1NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxNTU4IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgMTU1OSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDIxMCA7IyAxNTY0IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTU2MiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDE1NjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE1NjggYWRkc2kzLzEKLUwkMDIxMAotCWNvbWliLD0gMCwlcjgsTCQwMjExIDsjIDE1NzEgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyAxNTcyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE1NzUgYWRkc2kzLzEKLUwkMDIxMQotCWNvbWliLD0gMCwlcjksTCQwMjAwIDsjIDE1NzggYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyAxNTc5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE1ODIgYWRkc2kzLzEKLUwkMDIwMAotCWxkdyAwKCVyNSksJXI0IDsjIDE0ODMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDE0ODQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDE0ODUgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMDIKLQlub3AgOyMgMTQ4OSBibGV1KzEKLUwkMDIwMQotCWxkaSAyLCVyMTkgOyMgMTYwNCBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDE2MTcganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgMTYwNSBtb3ZxaSsxLzYKLUwkMDIxNgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDE2MjYgYmxldSsxCi0JbGRpIDAsJXIxMyA7IyAxNjIzIHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDM1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAzOCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDM2IHN1YnNpMy8xCi0JbGRvIDM0KCVyMTkpLCVyMTkgOyMgODAzNyBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDAyMTkgOyMgODAzOSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2NzggcmVsb2FkX291dHNpKzIvMwotTCQwMjIwCi0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyAxNjYxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE2NzEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwMjI1IDsjIDE2NzkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE2NzMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDE2ODIgcmVsb2FkX291dHNpKzIvNgotTCQwMjI1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDE2ODkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTY5MyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxNjkxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTcwMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTY5NyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDIxOCA7IyAxNzExIGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTcxMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxNzE2IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXIzLCVyMTkgOyMgMTcxNyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDIyOCA7IyAxNzIyIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTcyMCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDE3MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE3MjYgYWRkc2kzLzEKLUwkMDIyOAotCWNvbWliLD0gMCwlcjgsTCQwMjI5IDsjIDE3MjkgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyAxNzMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE3MzMgYWRkc2kzLzEKLUwkMDIyOQotCWNvbWliLD0gMCwlcjksTCQwMjE4IDsjIDE3MzYgYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyAxNzM3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE3NDAgYWRkc2kzLzEKLUwkMDIxOAotCWxkdyAwKCVyNSksJXIzIDsjIDE2NDEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNjQ1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDE2NDIgc3Vic2kzLzEKLQlsZG8gMzQoJXIxOSksJXIxOSA7IyAxNjQzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMjIwCi0Jbm9wIDsjIDE2NDcgYmxldSsxCi1MJDAyMTkKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDQzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA0NiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDQ0IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDQ1IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIzNyA7IyA4MDQ3IGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyAxNzYzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2NzYgcmVsb2FkX291dHNpKzIvMwotTCQwMjM4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyAxNzkxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE4MDEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMjQzIDsjIDE4MDkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE4MDMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDE4MTIgcmVsb2FkX291dHNpKzIvNgotTCQwMjQzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDE4MTkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTgyMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxODIxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTgzMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTgyNyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDIzNiA7IyAxODQxIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTg0MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxODQ2IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgMTg0NyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDI0NiA7IyAxODUyIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTg1MCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDE4NTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE4NTYgYWRkc2kzLzEKLUwkMDI0NgotCWNvbWliLD0gMCwlcjgsTCQwMjQ3IDsjIDE4NTkgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyAxODYwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE4NjMgYWRkc2kzLzEKLUwkMDI0NwotCWNvbWliLD0gMCwlcjksTCQwMjM2IDsjIDE4NjYgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyAxODY3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE4NzAgYWRkc2kzLzEKLUwkMDIzNgotCWxkdyAwKCVyNSksJXI0IDsjIDE3NzEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNzc1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDE3NzIgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDE3NzMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMzgKLQlub3AgOyMgMTc3NyBibGV1KzEKLUwkMDIzNwotCWNvcHkgJXI2LCVyMjIgOyMgMTkwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRvIDEoJXI2KSwlcjYgOyMgMTg5MSBhZGRzaTMvMgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQyMSByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAxODkzIG1vdnFpKzEvNQotCWxkaSA5NCwlcjIxIDsjIDE4OTYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDE4OTQgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMjEsJXIxOSxMJDAyNTEgOyMgMTg5OCBibGV1KzEKLQlsZGkgMywlcjIwIDsjIDgwNTEgbW92cWkrMS8yCi0JbGRpIDQsJXIyMCA7IyAxOTAwIG1vdnFpKzEvMgotTCQwMjUxCi0Jc3RiICVyMjAsMCglcjIyKSA7IyAxOTExIG1vdnFpKzEvNgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjQyNCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIyMCksJXIxOSA7IyAxOTIzIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDE5MjQgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMjEsJXIxOSxMJDAyNTQgOyMgMTkyOCBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDE5MzAgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI0MjcgcmVsb2FkX291dHNpKzIvNgotTCQwMjU0Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODA1MiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgwNTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMSA7IyAyNDMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwNTMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwNTQgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjU5IDsjIDgwNTYgYmxldSsxCi0Jc3R3ICVyMSwtMjY4KCVyMzApIDsjIDg3ODkgcmVsb2FkX291dHNpKzIvNgotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY3NCByZWxvYWRfb3V0c2krMi8zCi1MJDAyNjAKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE5NjIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTk3MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyNjUgOyMgMTk4MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTk3NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTk4MyByZWxvYWRfb3V0c2krMi82Ci1MJDAyNjUKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTk5MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxOTk0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE5OTIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAyMDAyIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxOTk4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjU4IDsjIDIwMTIgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAyMDE0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDIwMTcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAyMDE4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjY4IDsjIDIwMjMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAyMDIxIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMjAyNCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMjAyNyBhZGRzaTMvMQotTCQwMjY4Ci0JY29taWIsPSAwLCVyOCxMJDAyNjkgOyMgMjAzMCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDIwMzEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMjAzNCBhZGRzaTMvMQotTCQwMjY5Ci0JY29taWIsPSAwLCVyOSxMJDAyNTggOyMgMjAzNyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDIwMzggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMjA0MSBhZGRzaTMvMQotTCQwMjU4Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMTk0MiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE5NDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTk0MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTk0NCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDI2MAotCW5vcCA7IyAxOTQ4IGJsZXUrMQotTCQwMjU5Ci0JbGRpIDMyLCVyMTkgOyMgMjA2MyBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDIwNjQgbW92cWkrMS82Ci0JY29weSAlcjYsJXIyNiA7IyAyMDc3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjI1IDsjIDIwNzkgcmVsb2FkX291dHNpKzIvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMiA7IyAyMDgzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjQgOyMgMjA4MSByZWxvYWRfb3V0c2krMi8yCi0JbGRiIC0yKCVyNiksJXIxOSA7IyAyMDg3IHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLDw+IDQsJXIxOSxMJDAyNzQgOyMgMjA4OSBibGV1KzEKLQlsZGkgOTMsJXIxNyA7IyA4NjIyIHJlbG9hZF9vdXRzaSsyLzIKLQliYiw+PSxuICVyMTUsMjMsTCQwMjc0IDsjIDIwOTQgbW92c2ktNAotCWxkYiAxKCVyNiksJXIxOSA7IyAyMDk3IG1vdnFpKzEvNQotCWRlcGkgLTEsMjksMSwlcjE5IDsjIDIwOTkgaW9yc2kzKzEvMgotCXN0YiAlcjE5LDEoJXI2KSA7IyAyMTAxIG1vdnFpKzEvNgotTCQwMjc0Ci0JbGRpIDQsJXIxOCA7IyA4NjI4IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjE4LCVyMSA7IyA4NjI5IGFuZHNpMy8xCi0Jc3R3ICVyMSwtMjUyKCVyMzApIDsjIDg3OTIgcmVsb2FkX291dHNpKzIvNgotCWxkbyAtMjg4KCVyMzApLCVyMTEgOyMgODYzMiBhZGRzaTMvMgotTCQwMjc1Ci0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDM2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2NQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTAyIDsjIDIxMDkgYmxldSsxCi0JY29weSAlcjIwLCVyMjEgOyMgODc0NSByZWxvYWRfb3V0c2krMi8xCi0JbGRicyxtYSAxKCVyMjEpLCVyNyA7IyAyMTM0IHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0gMCwlcjE0LEwkMDI4MCA7IyAyMTM5IGJsZXUrMQotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgMjQ0NSByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDIxNDAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjE0MyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDI4MAotCWJiLD49ICVyMTUsMzEsTCQwMjg1IDsjIDIxNTkgbW92c2ktNAotCWxkaSA5MiwlcjE5IDsjIDIxNjEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4sbiAlcjE5LCVyNyxMJDAyODUgOyMgMjE2MyBibGV1KzEKLQljb21iLD0gJXIxNiwlcjIxLEwkMDkwMyA7IyAyMTY3IGJsZXUrMQotCWxkbyAxKCVyMjEpLCVyMTkgOyMgMjE5NSBhZGRzaTMvMgotCWxkYiAxKCVyMjApLCVyMyA7IyAyMTkyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0gMCwlcjE0LEwkMDI4OCA7IyAyMTk3IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjQ2MCByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyMywlcjE5IDsjIDIxOTggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjMgOyMgMjIwMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDI4OAotCWV4dHJ1ICVyMywyOCwyOSwlcjE5IDsjIDIyMTYgbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIxOSwlcjE5IDsjIDIyMTkgYWRkc2kzLzEKLQlibCBMJDA5NDgsJXIwIDsjIDIyMzUganVtcAotCWV4dHJ1ICVyMywzMSwzLCVyMjAgOyMgMjIyMiBhbmRzaTMvMQotTCQwMjg1Ci0JY29tYiw8PixuICVyMTcsJXI3LEwkMDI5MyA7IyAyMjQzIGJsZXUrMQotCWxkdyAtMjY4KCVyMzApLCVyMSA7IyA4Nzk4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0NjYgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxOSA7IyAyMjQ0IGFkZHNpMy8yCi0JY29tYiw8PixuICVyMTksJXIyMCxMJDAyNzYgOyMgMjI0NiBibGV1KzEKLUwkMDI5MwotCWNvbWliLD0gMCwlcjEzLEwkMDI5NCA7IyAyMjUzIGJsZXUrMQotCWxkaSA0NSwlcjEgOyMgODgwMSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2MyA7IyAyMjU3IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDY5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDIyNTkgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjI2MCBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjE3LCVyMTksTCQwODk1IDsjIDIyNjQgYmxldSsxCi1MJDAyOTQKLQlsZGkgNDUsJXIxIDsjIDg4MDQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxLCVyNyxMJDExNjMgOyMgMjI4MCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4ODA3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gLTIoJXIyMCksJXIxOSA7IyAyMjgxIGFkZHNpMy8yCi0JY29tYiw+PixuICVyMSwlcjE5LEwkMTE3OSA7IyAyMjgzIGJsZXUrMQotCWxkYiAtMiglcjIwKSwlcjE5IDsjIDIyODUgbW92cWkrMS81Ci0JbGRpIDkxLCVyMSA7IyA4ODEwIHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMjg2IGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMSwlcjE5LEwkMTE2MyA7IyAyMjkwIGJsZXUrMQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4ODEzIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE3OQotCWxkbyAtMyglcjIwKSwlcjE5IDsjIDIyOTQgYWRkc2kzLzIKLQljb21iLD4+LG4gJXIxLCVyMTksTCQwMjk3IDsjIDIyOTYgYmxldSsxCi0JbGRiIC0zKCVyMjApLCVyMTkgOyMgMjI5OCBtb3ZxaSsxLzUKLQlsZGkgOTEsJXIxIDsjIDg4MTYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIyOTkgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMSwlcjE5LEwkMTE2NCA7IyAyMzAzIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQ4NyByZWxvYWRfb3V0c2krMi81Ci0JbGRiIC0yKCVyMjApLCVyMTkgOyMgMjMwNSBtb3ZxaSsxLzUKLQlsZGkgOTQsJXIyMCA7IyAyMzA4IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMzA2IGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMjAsJXIxOSxMJDExNjMgOyMgMjMxMCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotTCQwMjk3Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDg3IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2NAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjMxNSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMzE2IGV4dGVuZHFpc2kyCi0JY29tYiw8PiAlcjE3LCVyMTksTCQwMzAyIDsjIDIzMjAgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNTI0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2MwotCWxkYiAwKCVyMjApLCVyMTkgOyMgMjUyNiBtb3ZxaSsxLzUKLQlsZGkgNDUsJXIxIDsjIDg4MTkgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI1MjcgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIxLCVyMTksTCQwMzAwIDsjIDI1MzEgYmxldSsxCi0JbGRiIDEoJXIyMCksJXIxOSA7IyAyNTM1IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI1MzYgZXh0ZW5kcWlzaTIKLQljb21iLD0sbiAlcjE3LCVyMTksTCQwMzAwIDsjIDI1NDAgYmxldSsxCi0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgMjU1MCBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI1NTkgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI1NjEgcmVsb2FkX291dHNpKzIvNgotTCQwMzAyCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgMjU4OCByZWxvYWRfb3V0c2krMi82Ci0JbGRvIC0yOTYoJXIzMCksJXIyNiA7IyAyNTkwIGFkZHNpMy8yCi0JY29weSAlcjE2LCVyMjUgOyMgMjU5MiByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjE0LCVyMjQgOyMgMjU5NCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBjb21waWxlX3JhbmdlLCVyMiA7IyAyNTk4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjE1LCVyMjMgOyMgMjU5NiByZWxvYWRfb3V0c2krMi8xCi0JbW92Yiw9ICVyMjgsJXI0LEwkMTE2NSA7IyAyNjAzIGRlY3JlbWVudF9hbmRfYnJhbmNoX3VudGlsX3plcm8rMi8xCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDM2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDI2MDcgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDI2MDUgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMjYxMSBqdW1wCi0JY29weSAlcjQsJXIyOCA7IyAyNjA5IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDMwMAotCWxkdyAtMjUyKCVyMzApLCVyMSA7IyA4ODIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDMwOSA7IyAyNjI0IGJsZXUrMQotCWxkaSA5MSwlcjEgOyMgODgyNSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2NiA7IyAyNjI4IGJsZXUrMQotCWxkaSAwLCVyMTMgOyMgMzYyNCByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNjMwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIwKSwlcjE5IDsjIDI2MzIgbW92cWkrMS81Ci0JbGRpIDU4LCVyMSA7IyA4ODI4IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyNjMzIGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMSwlcjE5LEwkMTE2NiA7IyAyNjM3IGJsZXUrMQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTIyIDsjIDI2NDcgYmxldSsxCi0JbGRvIDEoJXIyMCksJXIxOSA7IyAyNjU2IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyNjU4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkwMiA7IyAyNjg5IGJsZXUrMQotCWxkaSAwLCVyMyA7IyAyNjg0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDMxNwotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjcwOSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MjIgOyMgMjcxMSBibGV1KzEKLQlsZG8gMSglcjE5KSwlcjIwIDsjIDI3MjAgYWRkc2kzLzIKLQlzdHcgJXIyMCwtMjk2KCVyMzApIDsjIDI3MjIgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDMyMSA7IyAyNzI5IGJsZXUrMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyNzI1IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyAyNzMwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDI3MzMgemVyb19leHRlbmRxaXNpMi8yCi1MJDAzMjEKLQlsZGkgNTgsJXIxIDsjIDg4MzEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjEsJXI3LEwkMTE2NyA7IyAyNzUwIGJsZXUrMQotCWFkZGwgJXIxMSwlcjMsJXIxOSA7IyAyNzg5IGFkZHNpMy8xCi0JY29tYiw9LG4gJXIxNywlcjcsTCQxMTY3IDsjIDI3NTQgYmxldSsxCi0JY29tYiw9LG4gJXIxNiwlcjIwLEwkMTE2NyA7IyAyNzU4IGJsZXUrMQotCWNvbWliLD0gNiwlcjMsTCQxMTY3IDsjIDI3NjAgYmxldSsxCi0JY29weSAlcjMsJXIyMCA7IyAyNzcwIHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI3NzEgYWRkc2kzLzIKLQlleHRydSAlcjE5LDMxLDgsJXIzIDsjIDI3NzIgemVyb19leHRlbmRxaXNpMi8xCi0JYWRkbCAlcjExLCVyMjAsJXIyMCA7IyAyNzc2IGFkZHNpMy8xCi0JYmwgTCQwMzE3LCVyMCA7IyAyNzgzIGp1bXAKLQlzdGIgJXI3LDAoJXIyMCkgOyMgMjc3OCBtb3ZxaSsxLzYKLUwkMTE2NwotCWNvbWIsPD4gJXIxLCVyNyxMJDAzMjggOyMgMjc5NiBibGV1KzEKLQlzdGIgJXIwLDAoJXIxOSkgOyMgMjc5MSBtb3ZxaSsxLzYKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI3OTggcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjgwMCBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyODAxIGV4dGVuZHFpc2kyCi0JY29tYiw8PiAlcjE3LCVyMTksTCQxMTY4IDsjIDI4MDUgYmxldSsxCi0JbGRpIDI1NSwlcjE5IDsjIDgwNjkgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4MTMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNiwlcjEgOyMgODgzNSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTYoJXIxKSwlcjEgOyMgODgzNiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4MTcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDI4MTUgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjI2IDsjIDI4MjkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNywlcjEgOyMgODgzNyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTcoJXIxKSwlcjEgOyMgODgzOCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODMxIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4MjEgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODMzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTI0NCglcjMwKSA7IyA4ODQxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODQ1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTgsJXIxIDsjIDg4NDIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE4KCVyMSksJXIxIDsjIDg4NDMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg0NyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODM3IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg0OSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMzYoJXIzMCkgOyMgODg0NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjg2MSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE5LCVyMSA7IyA4ODQ3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOSglcjEpLCVyMSA7IyA4ODQ4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4NjMgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjg1MyBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4NjUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjI4KCVyMzApIDsjIDg4NTEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4NzcgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMCwlcjEgOyMgODg1MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjAoJXIxKSwlcjEgOyMgODg1MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODc5IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4Njkgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODgxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIyMCglcjMwKSA7IyA4ODU2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODkzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjEsJXIxIDsjIDg4NTcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIxKCVyMSksJXIxIDsjIDg4NTggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg5NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODg1IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg5NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMTIoJXIzMCkgOyMgODg2MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjkwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIyLCVyMSA7IyA4ODYyIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMiglcjEpLCVyMSA7IyA4ODYzIG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5MTEgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjkwMSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5MTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjA0KCVyMzApIDsjIDg4NjYgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5MjUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMywlcjEgOyMgODg2NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjMoJXIxKSwlcjEgOyMgODg2OCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyOTI3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5MTcgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTI5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTE5NiglcjMwKSA7IyA4ODcxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTQxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjQsJXIxIDsjIDg4NzIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI0KCVyMSksJXIxIDsjIDg4NzMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjk0MyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTMzIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk0NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xODgoJXIzMCkgOyMgODg3NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk1NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI1LCVyMSA7IyA4ODc3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNSglcjEpLCVyMSA7IyA4ODc4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5NTkgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjk0OSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5NjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTgwKCVyMzApIDsjIDg4ODEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5NzMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNiwlcjE5IDsjIDI5NzAgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI2KCVyMTkpLCVyMyA7IyAyOTcxIG1vdmhpLTIKLQljb3B5ICVyMywlcjI1IDsjIDI5NzUgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjk2NSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5NzcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTcyKCVyMzApIDsjIDg4ODQgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5ODkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNywlcjE5IDsjIDI5ODYgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI3KCVyMTkpLCVyNCA7IyAyOTg3IG1vdmhpLTIKLQljb21pY2xyLDw+IDAsJXIyOCwlcjEzIDsjIDI5ODEgc2NjCi0JbGRpIDEsJXIxMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTkzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyNSA7IyAyOTkxIHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDA1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTcsJXIxIDsjIDg4ODUgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE3KCVyMSksJXIxIDsjIDg4ODYgbW92aGktMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyNyA7IyAyOTk3IHNjYwotCWxkaSAxLCVyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDA5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDA3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAxMyBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDE4IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzAyMiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIzLCVyMjUgOyMgMzAyMCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwMjYgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzAzMSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIyLCVyMSA7IyA4ODg3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMiglcjEpLCVyMSA7IyA4ODg4IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzAzNSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzAzMyByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwMzkgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA0NCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIwLCVyMSA7IyA4ODg5IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMCglcjEpLCVyMSA7IyA4ODkwIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA0OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA0NiByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNTIgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA1NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE2LCVyMSA7IyA4ODkxIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNiglcjEpLCVyMSA7IyA4ODkyIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA1OSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNjUgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA3MCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwNzQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjI1IDsjIDMwNzIgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDc4IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwODMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNSwlcjEgOyMgODg5MyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjUoJXIxKSwlcjEgOyMgODg5NCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwODcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwODUgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDkxIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwOTYgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMywlcjEgOyMgODg5NSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjMoJXIxKSwlcjEgOyMgODg5NiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMDAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwOTggcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTA0IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMDkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNCwlcjEgOyMgODg5NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjQoJXIxKSwlcjEgOyMgODg5OCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMTEgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTE3IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMjIgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMSwlcjEgOyMgODg5OSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjEoJXIxKSwlcjEgOyMgODkwMCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMjYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMjQgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTMwIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMzUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOSwlcjEgOyMgODkwMSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTkoJXIxKSwlcjEgOyMgODkwMiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMzkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMzcgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTQzIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxNDggcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOCwlcjEgOyMgODkwMyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTgoJXIxKSwlcjEgOyMgODkwNCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxNTIgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxNTAgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLDw+LG4gMCwlcjI4LEwkMDkwMCA7IyAzMTU2IGJsZXUrMQotTCQwMzI5Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzMTczIHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkyMiA7IyAzMTc1IGJsZXUrMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzE4NCBhZGRzaTMvMgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDMyMTQgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzMTg2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZGkgMCwlcjIyIDsjIDMyMjcgcmVsb2FkX291dHNpKzIvMgotCWFkZGlsIExSJ19fYWxudW0tJGdsb2JhbCQsJXIyNyA7IyA4NTk2IHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjIgOyMgODkwNyByZWxvYWRfb3V0c2krMi8xCi0JYWRkaWwgTFInX19jdHlwZTItJGdsb2JhbCQsJXIyNyA7IyA4NTk4IHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjIzIDsjIDg5MTAgcmVsb2FkX291dHNpKzIvMQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4NjAwIHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjQgOyMgODkxMyByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDMyLCVyMjUgOyMgODYwNSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDIsJXIyNCA7IyA4NjA3IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMTYsJXIzMSA7IyA4NjA5IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgOCwlcjI5IDsjIDg2MTEgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxMjgsJXIyOCA7IyA4NjEzIHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMjU1LCVyMjYgOyMgODYxNSByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yNDQoJXIzMCksJXIxIDsjIDg5MTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTczCi0JY29taWIsPSxuIDAsJXIxLEwkMDM0MyA7IyAzMjQwIGJsZXUrMQotCXN0dyAlcjIyLFJSJ19fYWxudW0tJGdsb2JhbCQoJXIyKSA7IyAzMjQ0IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMjQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMjEgOyMgMzI2MCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMjUzIGFkZHNpMy8xCi0JYWRkbCAlcjIxLCVyMjIsJXIyMSA7IyAzMjY1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIyMCA7IyAzMjU1IG1vdnFpKzEvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgMzI2NyBtb3ZxaSsxLzUKLQlleHRydSAlcjIwLDMxLDEsJXIyMCA7IyAzMjU2IGFuZHNpMy8xCi0JYW5kICVyMTksJXIxOCwlcjE5IDsjIDMyNzAgYW5kc2kzLzEKLQlvciAlcjIwLCVyMTksJXIyMCA7IyAzMjc4IHhvcmRpMy0xCi0JY29taWIsPD4gMCwlcjIwLEwkMTE2OSA7IyAzMjgwIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDMKLQlsZHcgLTIzNiglcjMwKSwlcjEgOyMgODkxOSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDQgOyMgMzI4NSBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMjg5IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMyOTAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMyOTIgbW92cWkrMS81Ci0JYmIsPCAlcjE5LDMxLEwkMTE2OSA7IyAzMjk2IGJsZXUrMwotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDQKLQlsZHcgLTIyOCglcjMwKSwlcjEgOyMgODkyMiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIxLEwkMDM0NSA7IyAzMzAxIGJsZXUrMQotCWNvbWIsPSAlcjI1LCVyMjIsTCQxMTY5IDsjIDMzMDUgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21pYiw9IDksJXIyMixMJDExNzAgOyMgMzMwNyBibGV1KzEKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzMzMiBsc2hyc2kzLzIKLUwkMDM0NQotCWxkdyAtMjIwKCVyMzApLCVyMSA7IyA4OTI1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0MSA7IyAzMzEyIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzMzE2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzMTcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzMTkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNSwlcjE5IDsjIDMzMjIgYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNDEgOyMgMzMyNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzMzMwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTY5Ci0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDMzMzIgbHNocnNpMy8yCi1MJDExNzAKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzMzNSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDMzMzkgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzMzQwIHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzMzQzIG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODkyOCByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDMzNDggdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzMzUwIG1vdnFpKzEvNgotTCQwMzQxCi0JbGR3IC0yMTIoJXIzMCksJXIxIDsjIDg5MzEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQ4IDsjIDMzNTQgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDMzNTggcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzM1OSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzM2MSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzM2NCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzEgOyMgMzM2NyBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNDI2IHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzQ4Ci0JbGR3IC0yMDQoJXIzMCksJXIxIDsjIDg5MzQgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQ5IDsjIDMzNzIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUyLSRnbG9iYWwkKCVyMjMpLCVyMTkgOyMgMzM3NiByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzc3IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzc5IG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjQsJXIxOSA7IyAzMzgyIGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzMzg1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDkKLQlsZHcgLTE5NiglcjMwKSwlcjEgOyMgODkzNyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNTAgOyMgMzM5MCBibGV1KzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzM5NCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzk1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzk3IG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjQsJXIxOSA7IyAzNDAwIGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzNDAzIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNTAKLQlsZHcgLTE4OCglcjMwKSwlcjEgOyMgODk0MCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDYgOyMgMzQwOCBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzNDEyIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0MTMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0MTUgbW92cWkrMS81Ci0JYW5kICVyMTksJXIxOCwlcjE5IDsjIDM0MTggYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNDYgOyMgMzQyMSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNDI2IHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTcxCi0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDM0MjggbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIyMSwlcjIxIDsjIDM0MzEgYWRkc2kzLzEKLQlleHRydSAlcjE5LDMxLDMsJXIxOSA7IyAzNDM1IGFuZHNpMy8xCi0Jc3ViaSAzMSwlcjE5LCVyMTkgOyMgMzQzNiBzdWJzaTMvMgotCWxkYiAwKCVyMjEpLCVyMjAgOyMgMzQzOSBtb3ZxaSsxLzUKLQltdHNhciAlcjE5IDsjIDg5NDMgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMCA7IyAzNDQ0IHZkZXBpX2lvcgotCXN0YiAlcjIwLDAoJXIyMSkgOyMgMzQ0NiBtb3ZxaSsxLzYKLUwkMDM0NgotCWxkdyAtMTgwKCVyMzApLCVyMSA7IyA4OTQ2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1MyA7IyAzNDUwIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDU0IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0NTUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0NTcgbW92cWkrMS81Ci0JYW5kICVyMTksJXIzMSwlcjE5IDsjIDM0NjAgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcyIDsjIDM0NjMgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1MwotCWxkdyAtMTcyKCVyMzApLCVyMSA7IyA4OTQ5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1NCA7IyAzNDY4IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDcyIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0NzMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0NzUgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyOSwlcjE5IDsjIDM0NzggYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcyIDsjIDM0ODEgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1NAotCWNvbWliLD0gMCwlcjEzLEwkMDM1NSA7IyAzNDg2IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0OTEgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0OTMgbW92cWkrMS81Ci0JYmIsPCAlcjE5LDMxLEwkMTE3MiA7IyAzNDk3IGJsZXUrMwotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM1MjAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNTUKLQljb21pYiw9IDAsJXI3LEwkMDMzOSA7IyAzNTAyIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNTA2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM1MDcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM1MDkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyOCwlcjE5IDsjIDM1MTIgYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzMzkgOyMgMzUxNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTcyCi0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDM1MjIgbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIyMSwlcjIxIDsjIDM1MjUgYWRkc2kzLzEKLQlleHRydSAlcjE5LDMxLDMsJXIxOSA7IyAzNTI5IGFuZHNpMy8xCi0Jc3ViaSAzMSwlcjE5LCVyMTkgOyMgMzUzMCBzdWJzaTMvMgotCWxkYiAwKCVyMjEpLCVyMjAgOyMgMzUzMyBtb3ZxaSsxLzUKLQltdHNhciAlcjE5IDsjIDg5NTIgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMCA7IyAzNTM4IHZkZXBpX2lvcgotCXN0YiAlcjIwLDAoJXIyMSkgOyMgMzU0MCBtb3ZxaSsxLzYKLUwkMDMzOQotCWxkbyAxKCVyMjIpLCVyMjIgOyMgMzU0NiBhZGRzaTMvMgotCWNvbWIsPj0sbiAlcjI2LCVyMjIsTCQxMTczIDsjIDMyMzMgYmxldSsxCi0JbGR3IC0yNDQoJXIzMCksJXIxIDsjIDg5MTYgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDI3NSwlcjAgOyMgMzU1OSBqdW1wCi0JbGRpIDEsJXIxMyA7IyAzNTU2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDMyOAotCWxkaSAyNTUsJXIxOSA7IyA4MDY5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2OAotCWNvbWIsPSAlcjE5LCVyMyxMJDAzNTkgOyMgODA3MCBibGV1KzEKLQljb3B5ICVyMTksJXIyMSA7IyA4NTk1IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDM2MAotCWxkbyAtMSglcjMpLCVyMjAgOyMgMzU3MSBhZGRzaTMvMgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMzU4MyByZWxvYWRfb3V0c2krMi81Ci0JZXh0cnUgJXIyMCwzMSw4LCVyMyA7IyAzNTcyIHplcm9fZXh0ZW5kcWlzaTIvMQotCWxkbyAtMSglcjE5KSwlcjE5IDsjIDM1ODQgYWRkc2kzLzIKLQljb21iLDw+ICVyMjEsJXIzLEwkMDM2MCA7IyAzNTc3IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMzU4OCByZWxvYWRfb3V0c2krMi82Ci1MJDAzNTkKLQlsZGIgMTEoJXI2KSwlcjE5IDsjIDM1OTkgbW92cWkrMS81Ci0JZGVwaSAtMSwyOCwxLCVyMTkgOyMgMzYwMSBpb3JzaTMrMS8yCi0Jc3RiICVyMTksMTEoJXI2KSA7IyAzNjAzIG1vdnFpKzEvNgotCWxkYiA3KCVyNiksJXIxOSA7IyAzNjA2IG1vdnFpKzEvNQotCWxkaSAwLCVyMTMgOyMgMzYxMyByZWxvYWRfb3V0c2krMi8yCi0JZGVwaSAtMSwyOSwxLCVyMTkgOyMgMzYwOCBpb3JzaTMrMS8yCi0JYmwgTCQwMjc1LCVyMCA7IyAzNjE4IGp1bXAKLQlzdGIgJXIxOSw3KCVyNikgOyMgMzYxMCBtb3ZxaSsxLzYKLUwkMDMwOQotCWxkaSAwLCVyMTMgOyMgMzYyNCByZWxvYWRfb3V0c2krMi8yCi1MJDExNjYKLQlleHRydSAlcjcsMjErOC0xLDgsJXIxOSA7IyAzNjI3IGV4dHp2Ci0JYWRkbCAlcjYsJXIxOSwlcjE5IDsjIDM2MzAgYWRkc2kzLzEKLQlleHRydSAlcjcsMzEsMywlcjIwIDsjIDM2MzMgYW5kc2kzLzEKLUwkMDk0OAotCXN1YmkgMzEsJXIyMCwlcjIwIDsjIDM2MzQgc3Vic2kzLzIKLQlsZGIgMCglcjE5KSwlcjIxIDsjIDM2MzcgbW92cWkrMS81Ci0JbXRzYXIgJXIyMCA7IyA4OTU1IHJlbG9hZF9vdXRzaSsyLzcKLQl2ZGVwaSAtMSwxLCVyMjEgOyMgMzY0MiB2ZGVwaV9pb3IKLQlibCBMJDAyNzUsJXIwIDsjIDM2NTMganVtcAotCXN0YiAlcjIxLDAoJXIxOSkgOyMgMzY0NCBtb3ZxaSsxLzYKLUwkMDI3NgotCWxkYiAtMSglcjYpLCVyMjAgOyMgODA3NCBtb3ZxaSsxLzUKLQlleHRydSAlcjIwLDMxLDgsJXIxOSA7IyA4MDc1IHplcm9fZXh0ZW5kcWlzaTIvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM2NCA7IyA4MDc2IGJsZXUrMQotCWFkZGwgJXIxOSwlcjYsJXIxOSA7IyA4MDc5IGFkZHNpMy8xCi0JbGRiIC0xKCVyMTkpLCVyMTkgOyMgODA4MiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw8PiAwLCVyMTksTCQwMzY0IDsjIDgwODMgYmxldSsxCi0JbGRvIC0xKCVyMjApLCVyMTkgOyMgODI0MiBhZGRzaTMvMgotCWJsIEwkMTE4MywlcjAgOyMgODI1MyBqdW1wCi0Jc3RiICVyMTksLTEoJXI2KSA7IyAzNjg4IG1vdnFpKzEvNgotTCQwMzY1Ci0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgMzY4NiBhZGRzaTMvMgotCXN0YiAlcjE5LC0xKCVyNikgOyMgMzY4OCBtb3ZxaSsxLzYKLUwkMTE4MwotCWV4dHJ1ICVyMTksMzEsOCwlcjE5IDsjIDM2NjIgemVyb19leHRlbmRxaXNpMi8xCi0JY29taWIsPSAwLCVyMTksTCQwMzY0IDsjIDM2NjQgYmxldSsxCi0JYWRkbCAlcjE5LCVyNiwlcjE5IDsjIDM2NjggYWRkc2kzLzEKLQlsZGIgLTEoJXIxOSksJXIxOSA7IyAzNjcyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0sbiAwLCVyMTksTCQwMzY1IDsjIDM2NzQgYmxldSsxCi0JbGRiIC0xKCVyNiksJXIxOSA7IyAzNjgzIG1vdnFpKzEvNQotTCQwMzY0Ci0JbGRiIC0xKCVyNiksJXIxOSA7IyAzNzAwIHplcm9fZXh0ZW5kcWlzaTIvMgotCWJsIEwkMDA0MywlcjAgOyMgMzcwNSBqdW1wCi0JYWRkbCAlcjYsJXIxOSwlcjYgOyMgMzcwMSBhZGRzaTMvMQotTCQwMzY4Ci0JYmIsPj0sbiAlcjE1LDE4LEwkMDA3NiA7IyAzNzEzIG1vdnNpLTQKLQlibCBMJDExODEsJXIwIDsjIDM3MjEganVtcAotCWxkdyAyNCglcjUpLCVyMTkgOyMgMzg2MSByZWxvYWRfb3V0c2krMi81Ci1MJDAzNzIKLQliYiw+PSxuICVyMTUsMTgsTCQwMDc2IDsjIDM3MzAgbW92c2ktNAotCWJsLG4gTCQwMzc0LCVyMCA7IyAzNzM4IGp1bXAKLUwkMDM3NgotCWJiLD49LG4gJXIxNSwyMCxMJDAwNzYgOyMgMzc0NyBtb3ZzaS00Ci0JYmwsbiBMJDAzNzgsJXIwIDsjIDM3NTUganVtcAotTCQwMzgwCi0JYmIsPj0sbiAlcjE1LDE2LEwkMDA3NiA7IyAzNzY0IG1vdnNpLTQKLQlibCxuIEwkMDM3OCwlcjAgOyMgMzc3MiBqdW1wCi1MJDAzODMKLQlhbmQgJXIxNSwlcjIwLCVyMTkgOyMgMzc3OSBhbmRzaTMvMQotCWNvbWIsPSAlcjIwLCVyMTksTCQxMTc0IDsjIDM3ODMgYmxldSsxCi0JbGRpIC0xLCVyNCA7IyA1MDc0IHJlbG9hZF9vdXRzaSsyLzIKLQlibCxuIEwkMDA3NiwlcjAgOyMgMzc5MSBqdW1wCi1MJDAzODcKLQljb21iLD0sbiAlcjE2LCVyMTksTCQwOTAzIDsjIDM3OTkgYmxldSsxCi0JbGRiIDAoJXIxOSksJXI3IDsjIDM4MzEgemVyb19leHRlbmRxaXNpMi8yCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzODI2IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzODI4IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gLTM5KCVyNyksJXIxOSA7IyA3NDQ2IGFkZHNpMy8yCi0JYWRkaSx1diAtODYsJXIxOSwlcjAgOyMgNzQ0NyBjYXNlc2kwCi0JYmxyLG4gJXIxOSwlcjAKLQliLG4gTCQwMzk3Ci1MJDA4MTcKLQlibCBMJDA3NTksJXIwIDsjIDk0Mzcgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjA0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA2OQotCWJsIEwkMDM5NSwlcjAKLQlub3AgOyMgOTQ0MCBzd2l0Y2hfanVtcAotTCQxMDcwCi0JYmwgTCQwNDIyLCVyMAotCW5vcCA7IyA5NDQzIHN3aXRjaF9qdW1wCi1MJDEwNzEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NDYgc3dpdGNoX2p1bXAKLUwkMTA3MgotCWJsIEwkMDgxMSwlcjAKLQlub3AgOyMgOTQ0OSBzd2l0Y2hfanVtcAotTCQxMDczCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDUyIHN3aXRjaF9qdW1wCi1MJDEwNzQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NTUgc3dpdGNoX2p1bXAKLUwkMTA3NQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ1OCBzd2l0Y2hfanVtcAotTCQxMDc2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDYxIHN3aXRjaF9qdW1wCi1MJDEwNzcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NjQgc3dpdGNoX2p1bXAKLUwkMTA3OAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ2NyBzd2l0Y2hfanVtcAotTCQxMDc5Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDcwIHN3aXRjaF9qdW1wCi1MJDEwODAKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0NzMgc3dpdGNoX2p1bXAKLUwkMTA4MQotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ3NiBzd2l0Y2hfanVtcAotTCQxMDgyCi0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDc5IHN3aXRjaF9qdW1wCi1MJDEwODMKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0ODIgc3dpdGNoX2p1bXAKLUwkMTA4NAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ4NSBzd2l0Y2hfanVtcAotTCQxMDg1Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDg4IHN3aXRjaF9qdW1wCi1MJDEwODYKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0OTEgc3dpdGNoX2p1bXAKLUwkMTA4NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ5NCBzd2l0Y2hfanVtcAotTCQxMDg4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDk3IHN3aXRjaF9qdW1wCi1MJDEwODkKLQlibCBMJDA2NTksJXIwIDsjIDk1MDAgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTY0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUwMyBzd2l0Y2hfanVtcAotTCQxMDkxCi0JYmwgTCQwNjc5LCVyMCA7IyA5NTA2IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE3MiByZWxvYWRfb3V0c2krMi81Ci1MJDEwOTIKLQlibCBMJDA4MTEsJXIwCi0Jbm9wIDsjIDk1MDkgc3dpdGNoX2p1bXAKLUwkMTA5MwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUxMiBzd2l0Y2hfanVtcAotTCQxMDk0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTE1IHN3aXRjaF9qdW1wCi1MJDEwOTUKLQlibCBMJDA3MTksJXIwIDsjIDk1MTggc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTg4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5NgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUyMSBzd2l0Y2hfanVtcAotTCQxMDk3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTI0IHN3aXRjaF9qdW1wCi1MJDEwOTgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Mjcgc3dpdGNoX2p1bXAKLUwkMTA5OQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzMCBzd2l0Y2hfanVtcAotTCQxMTAwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTMzIHN3aXRjaF9qdW1wCi1MJDExMDEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MzYgc3dpdGNoX2p1bXAKLUwkMTEwMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzOSBzd2l0Y2hfanVtcAotTCQxMTAzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTQyIHN3aXRjaF9qdW1wCi1MJDExMDQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NDUgc3dpdGNoX2p1bXAKLUwkMTEwNQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU0OCBzd2l0Y2hfanVtcAotTCQxMTA2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTUxIHN3aXRjaF9qdW1wCi1MJDExMDcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NTQgc3dpdGNoX2p1bXAKLUwkMTEwOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU1NyBzd2l0Y2hfanVtcAotTCQxMTA5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTYwIHN3aXRjaF9qdW1wCi1MJDExMTAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NjMgc3dpdGNoX2p1bXAKLUwkMTExMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU2NiBzd2l0Y2hfanVtcAotTCQxMTEyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTY5IHN3aXRjaF9qdW1wCi1MJDExMTMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NzIgc3dpdGNoX2p1bXAKLUwkMTExNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU3NSBzd2l0Y2hfanVtcAotTCQxMTE1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTc4IHN3aXRjaF9qdW1wCi1MJDExMTYKLQlibCBMJDA2MzksJXIwIDsjIDk1ODEgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTU2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTExNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU4NCBzd2l0Y2hfanVtcAotTCQxMTE4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTg3IHN3aXRjaF9qdW1wCi1MJDExMTkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTAgc3dpdGNoX2p1bXAKLUwkMTEyMAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5MyBzd2l0Y2hfanVtcAotTCQxMTIxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTk2IHN3aXRjaF9qdW1wCi1MJDExMjIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTkgc3dpdGNoX2p1bXAKLUwkMTEyMwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYwMiBzd2l0Y2hfanVtcAotTCQxMTI0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjA1IHN3aXRjaF9qdW1wCi1MJDExMjUKLQlibCBMJDA3MzksJXIwIDsjIDk2MDggc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTk2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTEyNgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYxMSBzd2l0Y2hfanVtcAotTCQxMTI3Ci0JYmwgTCQwNjk5LCVyMCA7IyA5NjE0IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE4MCByZWxvYWRfb3V0c2krMi81Ci1MJDExMjgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MTcgc3dpdGNoX2p1bXAKLUwkMTEyOQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyMCBzd2l0Y2hfanVtcAotTCQxMTMwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjIzIHN3aXRjaF9qdW1wCi1MJDExMzEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MjYgc3dpdGNoX2p1bXAKLUwkMTEzMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyOSBzd2l0Y2hfanVtcAotTCQxMTMzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjMyIHN3aXRjaF9qdW1wCi1MJDExMzQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MzUgc3dpdGNoX2p1bXAKLUwkMTEzNQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYzOCBzd2l0Y2hfanVtcAotTCQxMTM2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjQxIHN3aXRjaF9qdW1wCi1MJDExMzcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NDQgc3dpdGNoX2p1bXAKLUwkMTEzOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY0NyBzd2l0Y2hfanVtcAotTCQxMTM5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjUwIHN3aXRjaF9qdW1wCi1MJDExNDAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTMgc3dpdGNoX2p1bXAKLUwkMTE0MQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY1NiBzd2l0Y2hfanVtcAotTCQxMTQyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjU5IHN3aXRjaF9qdW1wCi1MJDExNDMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NjIgc3dpdGNoX2p1bXAKLUwkMTE0NAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY2NSBzd2l0Y2hfanVtcAotTCQxMTQ1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjY4IHN3aXRjaF9qdW1wCi1MJDExNDYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NzEgc3dpdGNoX2p1bXAKLUwkMTE0NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY3NCBzd2l0Y2hfanVtcAotTCQxMTQ4Ci0JYmwgTCQwNjE5LCVyMCA7IyA5Njc3IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE0OCByZWxvYWRfb3V0c2krMi81Ci1MJDExNDkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2ODAgc3dpdGNoX2p1bXAKLUwkMTE1MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY4MyBzd2l0Y2hfanVtcAotTCQxMTUxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5Njg2IHN3aXRjaF9qdW1wCi1MJDExNTIKLQlibCBMJDA1MDYsJXIwCi0Jbm9wIDsjIDk2ODkgc3dpdGNoX2p1bXAKLUwkMTE1MwotCWJsIEwkMDQ3MiwlcjAgOyMgOTY5MiBzd2l0Y2hfanVtcAotCWxkaWwgTCczMzc5MiwlcjE5IDsjIDQ3MjQgYWRkX2hpZ2hfY29uc3QrMwotTCQxMTU0Ci0JYmwsbiBMJDAzOTcsJXIwIDsjIDc0NTAganVtcAotTCQwMzk1Ci0JYmIsPCxuICVyMTUsMTgsTCQwMzk3IDsjIDM4NTMgYmxldSszCi0JbGR3IDI0KCVyNSksJXIxOSA7IyAzODYxIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE4MQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzg2MiBhZGRzaTMvMgotCXN0dyAlcjE5LDI0KCVyNSkgOyMgMzg2NiByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyAzODcxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk1OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMDgoJXIzMCksJXIxOSA7IyAzODczIHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gMSglcjEpLCVyMSA7IyAzODY4IGFkZHNpMy8yCi0JY29tYiw8PiAlcjE5LCVyMjAsTCQwMzk4IDsjIDM4NzUgYmxldSsxCi0Jc3R3ICVyMSwtMjYwKCVyMzApIDsjIDg5NjEgcmVsb2FkX291dHNpKzIvNgotCXpkZXAgJXIyMCwyOCwyOSwlcjI1IDsjIDM4ODUgYXNobHNpMysxCi0Jc2gxYWRkbCAlcjIwLCVyMjUsJXIyNSA7IyAzODg2IGFzaGxzaTMtMgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzg5MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAzODk0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JemRlcCAlcjI1LDI5LDMwLCVyMjUgOyMgMzg5MiBhc2hsc2kzKzEKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMzkwMyBibGV1KzEKLQlzdHcgJXIyOCwtMzEyKCVyMzApIDsjIDM4OTggcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA4KCVyMzApLCVyMTkgOyMgMzkxMiByZWxvYWRfb3V0c2krMi81Ci0JemRlcCAlcjE5LDMwLDMxLCVyMTkgOyMgMzkxNCBhc2hsc2kzKzEKLQlzdHcgJXIxOSwtMzA4KCVyMzApIDsjIDM5MTYgcmVsb2FkX291dHNpKzIvNgotTCQwMzk4Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyAzOTIxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIxIDsjIDM5MjMgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIxOSA7IyAzOTMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMjAsJXIyMCwlcjIwIDsjIDM5MjggYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjIwLCVyMjEsJXIyMSA7IyAzOTMxIGFzaGxzaTMtMgotCXN1YiAlcjEyLCVyMTksJXIxOSA7IyAzOTM0IHN1YnNpMy8xCi0Jc3R3ICVyMTksMCglcjIxKSA7IyAzOTM2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDM5MzkgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjAgOyMgMzk0MSByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjE5LCVyMTksJXIxOSA7IyAzOTQ2IGFzaGxzaTMtMgotCWNvbWliLD0gMCwlcjEwLEwkMDQwMCA7IyAzOTUxIGJsZXUrMQotCXNoMmFkZGwgJXIxOSwlcjIwLCVyMjAgOyMgMzk0OSBhc2hsc2kzLTIKLQlsZHcgMCglcjUpLCVyMTkgOyMgMzk1MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyMTAsJXIxOSwlcjE5IDsjIDM5NTQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDM5NTUgYWRkc2kzLzIKLQlibCBMJDA0MDEsJXIwIDsjIDM5NTgganVtcAotCXN0dyAlcjE5LDQoJXIyMCkgOyMgMzk1NyByZWxvYWRfb3V0c2krMi82Ci1MJDA0MDAKLQlzdHcgJXIwLDQoJXIyMCkgOyMgMzk2MiByZWxvYWRfb3V0c2krMi82Ci1MJDA0MDEKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM5NjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjEgOyMgMzk2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDM5NzggcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIyMCwlcjIwLCVyMjAgOyMgMzk3MyBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMjAsJXIyMSwlcjIxIDsjIDM5NzYgYXNobHNpMy0yCi0Jc3ViICVyNiwlcjE5LCVyMTkgOyMgMzk3OSBzdWJzaTMvMQotCXN0dyAlcjE5LDEyKCVyMjEpIDsjIDM5ODEgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgMzk4NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyAzOTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk2NCByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjE5LCVyMTksJXIxOSA7IyAzOTkxIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIxOSwlcjIwLCVyMjAgOyMgMzk5NCBhc2hsc2kzLTIKLQlsZGkgMjU1LCVyMTkgOyMgMzk5OSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PCAlcjE5LCVyMSxMJDA0MDIgOyMgNDAwMSBibGV1KzEKLQlzdHcgJXIxLDE2KCVyMjApIDsjIDM5OTYgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMjAgOyMgNDAwNSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMSA7IyA0MDA3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgNDAxNyByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjIwLCVyMjAsJXIyMCA7IyA0MDEyIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIyMCwlcjIxLCVyMjEgOyMgNDAxNSBhc2hsc2kzLTIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyA0MDE4IHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA0MDE5IGFkZHNpMy8yCi0Jc3R3ICVyMTksOCglcjIxKSA7IyA0MDIxIHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA5MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDg4IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDg5IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDA3IDsjIDgwOTEgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTkzIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQwOAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNDA0OSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0MDU5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDQxMyA7IyA0MDY3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0MDYxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA0MDcwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQxMwotCWxkdyAwKCVyNSksJXIyNiA7IyA0MDc3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQwODEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDA3OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQwODkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQwODUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA0MDYgOyMgNDA5OSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQxMDEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0MTYgOyMgNDExMCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDEwNCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQxMTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQxMTQgYWRkc2kzLzEKLUwkMDQxNgotCWNvbWliLD0gMCwlcjgsTCQwNDE3IDsjIDQxMTcgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MTE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQxMjEgYWRkc2kzLzEKLUwkMDQxNwotCWNvbWliLD0gMCwlcjksTCQwNDA2IDsjIDQxMjQgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MTI1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQxMjggYWRkc2kzLzEKLUwkMDQwNgotCWxkdyAwKCVyNSksJXI0IDsjIDQwMjkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0MDMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQwMzAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQwMzEgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0MDgKLQlub3AgOyMgNDAzNSBibGV1KzEKLUwkMDQwNwotCWxkaSA1LCVyMTkgOyMgNDE1MCBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQxNTEgbW92cWkrMS82Ci0JbGRiIC0yNTcoJXIzMCksJXIxIDsjIDQxNTYgbW92cWkrMS81Ci0Jc3RicyxtYSAlcjEsMSglcjYpIDsjIDg5NjggbW92cWkrMS82Ci0Jc3RicyxtYSAlcjAsMSglcjYpIDsjIDQxNTkgbW92cWkrMS82Ci1MJDA0MDIKLQlsZGkgMCwlcjEwIDsjIDQxODIgcmVsb2FkX291dHNpKzIvMgotCWxkaSAwLCVyOCA7IyA0MTg1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyNiwlcjEyIDsjIDQxODggcmVsb2FkX291dHNpKzIvMQotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDE3NCByZWxvYWRfb3V0c2krMi81Ci0JbGRpIDAsJXI5IDsjIDQxOTEgcmVsb2FkX291dHNpKzIvMgotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNDE3NSBhZGRzaTMvMgotCWJsIEwkMDA0MywlcjAgOyMgNDE5MyBqdW1wCi0Jc3R3ICVyMTksLTMwNCglcjMwKSA7IyA0MTc5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQyMgotCWJiLDwgJXIxNSwxOCxMJDAzOTcgOyMgNDIwMSBibGV1KzMKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQyMDcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDM3NCA7IyA0MjA5IGJsZXUrMQotCWJiLD49LG4gJXIxNSwxNCxMJDA5NTAgOyMgNDIxNSBtb3ZzaS00Ci0JYmwsbiBMJDAzOTcsJXIwIDsjIDQyMzAganVtcAotTCQwMzc0Ci0JY29taWIsPSxuIDAsJXIxMCxMJDA0MjcgOyMgNDIzNyBibGV1KzEKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDk1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA5OCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDk2IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDk3IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDMyIDsjIDgwOTkgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTkxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQzMwotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNDI2NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0Mjc2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDQzOCA7IyA0Mjg0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0Mjc4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA0Mjg3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQzOAotCWxkdyAwKCVyNSksJXIyNiA7IyA0Mjk0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQyOTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDI5NiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQzMDYgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQzMDIgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA0MzEgOyMgNDMxNiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQzMTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDMyMSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDQzMjIgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0NDEgOyMgNDMyNyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQzMjUgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA0MzI4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0MzMxIGFkZHNpMy8xCi1MJDA0NDEKLQljb21pYiw9IDAsJXI4LEwkMDQ0MiA7IyA0MzM0IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNDMzNSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0MzM4IGFkZHNpMy8xCi1MJDA0NDIKLQljb21pYiw9IDAsJXI5LEwkMDQzMSA7IyA0MzQxIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNDM0MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0MzQ1IGFkZHNpMy8xCi1MJDA0MzEKLQlsZHcgMCglcjUpLCVyNCA7IyA0MjQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNDI1MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0MjQ3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA0MjQ4IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNDMzCi0Jbm9wIDsjIDQyNTIgYmxldSsxCi1MJDA0MzIKLQlsZGkgMTksJXIxOSA7IyA0MzY3IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDM2OCBtb3ZxaSsxLzYKLQl1YWRkY20gJXI2LCVyMTAsJXIyNCA7IyA0MzgxIGFkZGRpMysxCi0JbGRpIDEzLCVyMjYgOyMgNDM4NCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjEwLCVyMjUgOyMgNDM4NiByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDQzOTAgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA0Mzg4IGFkZHNpMy8yCi1MJDA0MjcKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQzOTUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDQ0NyA7IyA0Mzk3IGJsZXUrMQotCWJiLDwsbiAlcjE1LDE0LEwkMDA3NiA7IyA0NDAzIGJsZXUrMwotTCQwOTUwCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA0NDE0IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA0NDEyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDQ0MTgganVtcAotCWxkaSAxNiwlcjI4IDsjIDQ0MTYgcmVsb2FkX291dHNpKzIvMgotTCQwNDQ3Ci0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgNDQyNyBhZGRzaTMvMgotCXN0dyAlcjE5LC0zMDQoJXIzMCkgOyMgNDQzMSByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyA0NDM2IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDQ0NDEgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyA0NDQ0IGFzaGxzaTMtMgotCWxkdyAwKCVyNSksJXIyMSA7IyA0NDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjIwKSwlcjE5IDsjIDQ0NDggcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyMjApLCVyMjAgOyMgNDQ2NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjAsTCQwNDUwIDsjIDQ0NjYgYmxldSsxCi0JYWRkbCAlcjIxLCVyMTksJXIxMiA7IyA0NDQ5IGFkZHNpMy8xCi0JYWRkbCAlcjIxLCVyMjAsJXIxOSA7IyA0NDgzIGFkZHNpMy8xCi0JYmwgTCQwNDUxLCVyMCA7IyA0NDg1IGp1bXAKLQlsZG8gLTEoJXIxOSksJXIxMCA7IyA0NDg0IGFkZHNpMy8yCi1MJDA0NTAKLQlsZGkgMCwlcjEwIDsjIDQ0ODkgcmVsb2FkX291dHNpKzIvMgotTCQwNDUxCi0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA0NDkzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDQ0OTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIyMSA7IyA0NTA1IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDQ1MDAgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyA0NTAzIGFzaGxzaTMtMgotCWxkdyAxMiglcjIwKSwlcjE5IDsjIDQ1MDcgcmVsb2FkX291dHNpKzIvNQotCWxkdyAxNiglcjIwKSwlcjcgOyMgNDUyMyByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyMTksJXI4IDsjIDQ1MDggYWRkc2kzLzEKLQlsZGkgMjU1LCVyMTkgOyMgNDUyOSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PCAlcjE5LCVyNyxMJDAwNDMgOyMgNDUzMSBibGV1KzEKLQlsZGkgMCwlcjkgOyMgNDUyNiByZWxvYWRfb3V0c2krMi8yCi0JbGR3IDgoJXIyMCksJXIxOSA7IyA0NTUwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk3MSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyMTksJXIxOSA7IyA0NTUxIGFkZHNpMy8xCi0Jc3ViICVyMSwlcjcsJXIyMCA7IyA0NTU3IHN1YnNpMy8xCi0Jc3RiICVyMjAsMCglcjE5KSA7IyA0NTU5IG1vdnFpKzEvNgotCWxkdyAwKCVyNSksJXI0IDsjIDgxMDMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTA2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxMDQgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxMDUgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0NTcgOyMgODEwNyBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1ODkgcmVsb2FkX291dHNpKzIvMwotTCQwNDU4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0NTg3IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQ1OTcgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDYzIDsjIDQ2MDUgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQ1OTkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQ2MDggcmVsb2FkX291dHNpKzIvNgotTCQwNDYzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDQ2MTUgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDYxOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0NjE3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDYyNyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDYyMyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQ1NiA7IyA0NjM3IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDYzOSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0NjQyIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDY0MyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQ2NiA7IyA0NjQ4IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNDY0NiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQ2NDkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQ2NTIgYWRkc2kzLzEKLUwkMDQ2NgotCWNvbWliLD0gMCwlcjgsTCQwNDY3IDsjIDQ2NTUgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0NjU2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQ2NTkgYWRkc2kzLzEKLUwkMDQ2NwotCWNvbWliLD0gMCwlcjksTCQwNDU2IDsjIDQ2NjIgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0NjYzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQ2NjYgYWRkc2kzLzEKLUwkMDQ1NgotCWxkdyAwKCVyNSksJXI0IDsjIDQ1NjcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0NTcxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQ1Njggc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQ1NjkgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0NTgKLQlub3AgOyMgNDU3MyBibGV1KzEKLUwkMDQ1NwotCWxkaSA2LCVyMTkgOyMgNDY4OCBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ2ODkgbW92cWkrMS82Ci0Jc3RicyxtYSAlcjcsMSglcjYpIDsjIDQ2OTQgbW92cWkrMS82Ci0JbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5NzQgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjEsJXI3LCVyMTkgOyMgNDcwMCBzdWJzaTMvMQotCWJsIEwkMDA0MywlcjAgOyMgNDcyMCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0NzAyIG1vdnFpKzEvNgotTCQwNDcyCi0JbGRvIFInMzM3OTIoJXIxOSksJXIxOSA7IyA0NzI1IG1vdmhpLTIKLQlhbmQgJXIxNSwlcjE5LCVyMTkgOyMgNDcyNiBhbmRzaTMvMQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDM5NyA7IyA0NzI4IGJsZXUrMQotTCQwMzc4Ci0JYmIsPCxuICVyMTUsMjEsTCQwMDc2IDsjIDQ3MzkgYmxldSszCi0JbGR3IDAoJXI1KSwlcjMgOyMgODExMSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxMTQgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODExMiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODExMyBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDQ3NiA7IyA4MTE1IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODU4NyByZWxvYWRfb3V0c2krMi8zCi1MJDA0NzcKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDQ3NjggYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDc3OCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDA0ODIgOyMgNDc4NiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNDc4MCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgNDc4OSByZWxvYWRfb3V0c2krMi82Ci1MJDA0ODIKLQlsZHcgMCglcjUpLCVyMjYgOyMgNDc5NiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA0ODAwIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDQ3OTggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0ODA4IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA0ODA0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwNDc1IDsjIDQ4MTggYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyA0ODIwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQ4MjMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyA0ODI0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNDg1IDsjIDQ4MjkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0ODI3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNDgzMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDgzMyBhZGRzaTMvMQotTCQwNDg1Ci0JY29taWIsPSAwLCVyOCxMJDA0ODYgOyMgNDgzNiBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDQ4Mzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDg0MCBhZGRzaTMvMQotTCQwNDg2Ci0JY29taWIsPSAwLCVyOSxMJDA0NzUgOyMgNDg0MyBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDQ4NDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDg0NyBhZGRzaTMvMQotTCQwNDc1Ci0JbGR3IDAoJXI1KSwlcjMgOyMgNDc0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ3NTIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDc0OSBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDc1MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ3NwotCW5vcCA7IyA0NzU0IGJsZXUrMQotTCQwNDc2Ci0JbGRpIDE0LCVyMjYgOyMgNDg3MyByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjEyLCVyMjUgOyMgNDg3NSByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjI1LCVyMjQgOyMgNDg3MCBzdWJzaTMvMQotCWxkbyAzKCVyMjQpLCVyMjQgOyMgNDg3NyBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgNDg4MSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgNDg3OSByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDAsJXI5IDsjIDQ4ODQgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLD0gMCwlcjEwLEwkMDQ5MCA7IyA0ODg5IGJsZXUrMQotCWxkbyAzKCVyNiksJXI2IDsjIDQ4ODYgYWRkc2kzLzIKLQlsZGkgMTMsJXIyNiA7IyA0ODk0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA0ODk2IHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA0ODkxIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDQ5MDAgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA0ODk4IGFkZHNpMy8yCi1MJDA0OTAKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTE5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODEyMiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTIwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTIxIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDQ5MiA7IyA4MTIzIGJsZXUrMQotCWNvcHkgJXI2LCVyMTAgOyMgNDkwNCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTg1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQ5MwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNDkyOSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0OTM5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDQ5OCA7IyA0OTQ3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0OTQxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA0OTUwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQ5OAotCWxkdyAwKCVyNSksJXIyNiA7IyA0OTU3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQ5NjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDk1OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQ5NjkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQ5NjUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA0OTEgOyMgNDk3OSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ5ODEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA1MDEgOyMgNDk5MCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDk4NCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDQ5OTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQ5OTQgYWRkc2kzLzEKLUwkMDUwMQotCWNvbWliLD0gMCwlcjgsTCQwNTAyIDsjIDQ5OTcgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyA0OTk4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDUwMDEgYWRkc2kzLzEKLUwkMDUwMgotCWNvbWliLD0gMCwlcjksTCQwNDkxIDsjIDUwMDQgYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyA1MDA1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDUwMDggYWRkc2kzLzEKLUwkMDQ5MQotCWxkdyAwKCVyNSksJXIzIDsjIDQ5MDkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0OTEzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ5MTAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQ5MTEgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0OTMKLQlub3AgOyMgNDkxNSBibGV1KzEKLUwkMDQ5MgotCWxkbyAzKCVyNiksJXI2IDsjIDUwMzAgYWRkc2kzLzIKLQlsZGkgMCwlcjggOyMgNTAzMyByZWxvYWRfb3V0c2krMi8yCi0JYmwgTCQwMDQzLCVyMCA7IyA1MDM4IGp1bXAKLQljb3B5ICVyNiwlcjEyIDsjIDUwMzYgcmVsb2FkX291dHNpKzIvMQotTCQwNTA2Ci0JYmIsPj0gJXIxNSwyMixMJDAzOTcgOyMgNTA0NiBtb3ZzaS00Ci0JbGRpIDQ2MDgsJXIyMCA7IyA1MDQ4IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjIwLCVyMTkgOyMgNTA0OSBhbmRzaTMvMQotCWNvbWIsPSAlcjIwLCVyMTksTCQwMzk3IDsjIDUwNTMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MDU1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODk3NyByZWxvYWRfb3V0c2krMi81Ci0JbGRvIC0yKCVyMjApLCVyMTkgOyMgNTA1NiBhZGRzaTMvMgotCWNvbWIsPD4gJXIxLCVyMTksTCQxMTc1IDsjIDUwNTggYmxldSsxCi0JbGRpIC0xLCVyNCA7IyA1MDc0IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE2LCVyMjAsTCQwMzk3IDsjIDUwNjIgYmxldSsxCi1MJDExNzQKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUwNzkgcmVsb2FkX291dHNpKzIvNQotTCQxMTc1Ci0JY29weSAlcjQsJXIxMSA7IyA1MDc2IHJlbG9hZF9vdXRzaSsyLzEKLQljb21iLDw+ICVyMTYsJXIyMCxMJDA1MTcgOyMgNTA4NSBibGV1KzEKLQlsZG8gLTEoJXIyMCksJXIyMyA7IyA1MDgwIGFkZHNpMy8yCi0JYmIsPj0sbiAlcjE1LDE5LEwkMDkxNSA7IyA1MDkyIG1vdnNpLTQKLQlibCBMJDExODIsJXIwIDsjIDUxMDcganVtcAotCXN0dyAlcjIzLC0yOTYoJXIzMCkgOyMgNTk2OCByZWxvYWRfb3V0c2krMi82Ci1MJDA1MTcKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUxMzQgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUxMzYgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUxNSA7IyA1MTQzIGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MTM5IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1MTQ0IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUxNDcgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MTUKLQlhZGRpbCBMUidfX2N0eXBlLSRnbG9iYWwkLCVyMjcgOyMgODI1NyBwaWMyX2xvX3N1bSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXIxKSwlcjIxIDsjIDgyNTkgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA4MjYwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA4MjYxIG1vdnFpKzEvNQotCWJiLD49ICVyMTksMjksTCQwNTEzIDsjIDgyNjUgbW92c2ktNAotCWxkaSA0LCVyMjAgOyMgODI2MyByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjIwLCVyMjIgOyMgODU4MyByZWxvYWRfb3V0c2krMi8xCi1MJDA1MjIKLQljb21pY2xyLDwgLTEsJXIxMSwlcjAgOyMgODEyOCBtb3ZzaWNjKzEvMQotCWxkaSAwLCVyMTEKLQlzaDJhZGRsICVyMTEsJXIxMSwlcjE5IDsjIDUxODggYXNobHNpMy0yCi0Jc2gxYWRkbCAlcjE5LCVyNywlcjE5IDsjIDUxOTEgYXNobHNpMy0yCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MTk0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDUxMyA7IyA1MTk2IGJsZXUrMQotCWxkbyAtNDgoJXIxOSksJXIxMSA7IyA1MTkyIGFkZHNpMy8yCi0JbGRvIDEoJXIyMCksJXIxOSA7IyA1MjE1IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1MjE3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA1MjAgOyMgNTIyNCBibGV1KzEKLQlsZGIgMCglcjIwKSwlcjcgOyMgNTIyMCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTIyNSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA1MjI4IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwNTIwCi0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDUxNjYgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDUxNjggbW92cWkrMS81Ci0JYW5kICVyMTksJXIyMiwlcjE5IDsjIDUxNzIgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQwNTIyCi0Jbm9wIDsjIDUxNzQgYmxldSsxCi1MJDA1MTMKLQlsZGkgNDQsJXIxOSA7IyA1MjUyIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXI3LEwkMDUzMiA7IyA1MjU0IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTI1OSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA1MzMgOyMgNTI2MSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUyNzggYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUyODAgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUzNSA7IyA1Mjg3IGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MjgzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1Mjg4IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUyOTEgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MzUKLQlhZGRpbCBMUidfX2N0eXBlLSRnbG9iYWwkLCVyMjcgOyMgODI2OSBwaWMyX2xvX3N1bSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXIxKSwlcjIxIDsjIDgyNzEgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA4MjcyIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA4MjczIG1vdnFpKzEvNQotCWJiLD49ICVyMTksMjksTCQwNTMzIDsjIDgyNzcgbW92c2ktNAotCWxkaSA0LCVyMjAgOyMgODI3NSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjIwLCVyMjIgOyMgODU3OCByZWxvYWRfb3V0c2krMi8xCi1MJDA1NDIKLQljb21pY2xyLDwgLTEsJXI0LCVyMCA7IyA4MTMyIG1vdnNpY2MrMS8xCi0JbGRpIDAsJXI0Ci0Jc2gyYWRkbCAlcjQsJXI0LCVyMTkgOyMgNTMzMiBhc2hsc2kzLTIKLQlzaDFhZGRsICVyMTksJXI3LCVyMTkgOyMgNTMzNSBhc2hsc2kzLTIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUzMzggcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwNTMzIDsjIDUzNDAgYmxldSsxCi0JbGRvIC00OCglcjE5KSwlcjQgOyMgNTMzNiBhZGRzaTMvMgotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTM1OSBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTM2MSByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTQwIDsjIDUzNjggYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUzNjQgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUzNjkgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTM3MiB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDU0MAotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA1MzEwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA1MzEyIG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjIsJXIxOSA7IyA1MzE2IGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMDU0MgotCW5vcCA7IyA1MzE4IGJsZXUrMQotTCQwNTMzCi0JY29taWNsciw8IC0xLCVyNCwlcjAgOyMgODEzNiBiZXEtMS80Ci0JemRlcGkgLTEsMzEsMTUsJXI0Ci0JYmwsbiBMJDA1NTMsJXIwIDsjIDU0MDEganVtcAotTCQwNTMyCi0JY29weSAlcjExLCVyNCA7IyA1NDA2IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU1MwotCWNvbWliLD4gMCwlcjExLEwkMDk1MSA7IyA1NDEwIGJsZXUrMQotCXpkZXBpIC0xLDMxLDE1LCVyMTkgOyMgNTQxMiByZWxvYWRfb3V0c2krMi80Ci0JY29tYiw8LG4gJXIxOSwlcjQsTCQwOTUxIDsjIDU0MTQgYmxldSsxCi0JY29tYiw8LG4gJXI0LCVyMTEsTCQwOTUxIDsjIDU0MTYgYmxldSsxCi0JYmIsPCAlcjE1LDE5LEwkMTE3NiA7IyA1NDUxIGJsZXUrMwotCWxkaSAxMjUsJXIxOSA7IyA1NTE0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgOTIsJXIxOSA7IyA1NDU1IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXI3LEwkMDkxNSA7IyA1NDU3IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTQ3MyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgNTQ3NSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDU0ODQgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDU0ODYgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDU1OCA7IyA1NDkzIGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1NDg5IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1NDk0IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDU0OTcgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1NTgKLQlsZGkgMTI1LCVyMTkgOyMgNTUxNCByZWxvYWRfb3V0c2krMi8yCi1MJDExNzYKLQljb21iLD0sbiAlcjE5LCVyNyxMJDA1NjYgOyMgNTUxNiBibGV1KzEKLUwkMDk1MQotCWJiLDwsbiAlcjE1LDE5LEwkMDUxMSA7IyA1NTIzIGJsZXUrMwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNTUzNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNTUzMiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyA1NTM4IGp1bXAKLQlsZGkgMTAsJXIyOCA7IyA1NTM2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDU2NgotCWNvbWliLDw+LG4gMCwlcjgsTCQwNTY5IDsjIDU1NDUgYmxldSsxCi0JYmIsPCxuICVyMTUsMjYsTCQwOTE3IDsjIDU1NTIgYmxldSszCi0JYmIsPj0sbiAlcjE1LDI3LEwkMDUxMSA7IyA1NTcxIG1vdnNpLTQKLQljb3B5ICVyNiwlcjggOyMgNTU3NCByZWxvYWRfb3V0c2krMi8xCi1MJDA1NjkKLQljb21pYiw8PiAwLCVyNCxMJDA1NzQgOyMgNTU4NyBibGV1KzEKLQlsZGkgMTAsJXIxMyA7IyA4OTgwIHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTM5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE0MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTQwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTQxIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNTc2IDsjIDgxNDMgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTczIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDU3NwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNTYxMyBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1NjIzIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDU4MiA7IyA1NjMxIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NjI1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA1NjM0IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDU4MgotCWxkdyAwKCVyNSksJXIyNiA7IyA1NjQxIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU2NDUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTY0MyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDU2NTMgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU2NDkgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA1NzUgOyMgNTY2MyBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU2NjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTY2OCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDU2Njkgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA1ODUgOyMgNTY3NCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU2NzIgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA1Njc1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA1Njc4IGFkZHNpMy8xCi1MJDA1ODUKLQljb21pYiw9IDAsJXI4LEwkMDU4NiA7IyA1NjgxIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNTY4MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA1Njg1IGFkZHNpMy8xCi1MJDA1ODYKLQljb21pYiw9IDAsJXI5LEwkMDU3NSA7IyA1Njg4IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNTY4OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA1NjkyIGFkZHNpMy8xCi1MJDA1NzUKLQlsZHcgMCglcjUpLCVyMyA7IyA1NTkzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTU5NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1NTk0IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA1NTk1IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNTc3Ci0Jbm9wIDsjIDU1OTkgYmxldSsxCi1MJDA1NzYKLQlsZGkgMTIsJXIyNiA7IyA1NzE4IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU3MjAgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXI4LCVyMjQgOyMgNTcyMiBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgNTcyNiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgNTcyNCByZWxvYWRfb3V0c2krMi8xCi0JYmwgTCQwNTkwLCVyMCA7IyA1NzMwIGp1bXAKLQlsZG8gMyglcjYpLCVyNiA7IyA1NzI4IGFkZHNpMy8yCi1MJDA1NzQKLQljb21pY2xyLD4gMiwlcjQsJXIwIDsjIDgyODIgYmVxLTEvMgotCWxkaSAyMCwlcjEzCi0JbGR3IDAoJXI1KSwlcjMgOyMgODI4NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyODggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODI4NiBzdWJzaTMvMQotCWFkZGwgJXIxOSwlcjEzLCVyMTkgOyMgODI4NyBhZGRzaTMvMQotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDg2OCA7IyA4Mjg5IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjcgOyMgODU3MSByZWxvYWRfb3V0c2krMi8zCi1MJDA1OTUKLQljb21iLD0gJXI3LCVyMjAsTCQwOTQ0IDsjIDU3NjkgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNTc3OSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjcsJXIxOSxMJDA2MDAgOyMgNTc4NyBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNTc4MSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNyw0KCVyNSkgOyMgNTc5MCByZWxvYWRfb3V0c2krMi82Ci1MJDA2MDAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNTc5NyByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA1ODAxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDU3OTkgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA1ODA5IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA1ODA1IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwNTkzIDsjIDU4MTkgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1ODIxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDU4MjQgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyA1ODI1IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjAzIDsjIDU4MzAgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA1ODI4IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNTgzMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNTgzNCBhZGRzaTMvMQotTCQwNjAzCi0JY29taWIsPSAwLCVyOCxMJDA2MDQgOyMgNTgzNyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDU4Mzggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNTg0MSBhZGRzaTMvMQotTCQwNjA0Ci0JY29taWIsPSAwLCVyOSxMJDA1OTMgOyMgNTg0NCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDU4NDUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNTg0OCBhZGRzaTMvMQotTCQwNTkzCi0JbGR3IDAoJXI1KSwlcjMgOyMgNTc0OSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDU3NTMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNTc1MCBzdWJzaTMvMQotCWFkZGwgJXIxOSwlcjEzLCVyMTkgOyMgNTc1MSBhZGRzaTMvMQotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDU5NQotCW5vcCA7IyA1NzU1IGJsZXUrMQotTCQwODY4Ci0JY29taWIsPj0gMSwlcjQsTCQwNjA4IDsjIDU4NzIgYmxldSsxCi0JbGRvIDUoJXI2KSwlcjE5IDsjIDU4NzAgYWRkc2kzLzIKLQlzdWIgJXIxOSwlcjgsJXIxOSA7IyA1ODc0IHN1YnNpMy8xCi0JYmwgTCQwNjA5LCVyMCA7IyA1ODc2IGp1bXAKLQlsZG8gMiglcjE5KSwlcjI0IDsjIDU4NzUgYWRkc2kzLzIKLUwkMDYwOAotCXN1YiAlcjE5LCVyOCwlcjE5IDsjIDU4Nzkgc3Vic2kzLzEKLQlsZG8gLTMoJXIxOSksJXIyNCA7IyA1ODgwIGFkZHNpMy8yCi1MJDA2MDkKLQlsZGkgMjAsJXIyNiA7IyA1ODg1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU4ODcgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjIzIDsjIDU4OTEgcmVsb2FkX291dHNpKzIvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMiwlcjIgOyMgNTg5MyBjYWxsX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjYsLTUyKCVyMzApIDsjIDU4ODMgcmVsb2FkX291dHNpKzIvNgotCWxkbyA1KCVyNiksJXI2IDsjIDU4OTUgYWRkc2kzLzIKLQlsZGkgMjIsJXIyNiA7IyA1OTAwIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU5MDIgcmVsb2FkX291dHNpKzIvMQotCWxkaSA1LCVyMjQgOyMgNTkwNCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjExLCVyMjMgOyMgNTkwNiByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1OTA4IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTg5OCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPj0gMSwlcjQsTCQwNTkwIDsjIDU5MTMgYmxldSsxCi0JbGRvIDUoJXI2KSwlcjYgOyMgNTkxMCBhZGRzaTMvMgotCWxkaSAyMSwlcjI2IDsjIDU5MjEgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI2LCVyMjUgOyMgNTkyMyByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyOCwlcjYsJXIyNCA7IyA1OTE3IHN1YnNpMy8xCi0JbGRvIDIoJXIyNCksJXIyNCA7IyA1OTI1IGFkZHNpMy8yCi0JbGRvIC0xKCVyNCksJXI0IDsjIDU5MTkgYWRkc2kzLzIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHN0b3JlX29wMiwlcjIgOyMgNTkyOSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI0LCVyMjMgOyMgNTkyNyByZWxvYWRfb3V0c2krMi8xCi0JbGRvIDUoJXI2KSwlcjYgOyMgNTkzMSBhZGRzaTMvMgotCXN0dyAlcjYsLTUyKCVyMzApIDsjIDU5MzYgcmVsb2FkX291dHNpKzIvNgotCWxkaSAyMiwlcjI2IDsjIDU5MzggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTk0MCByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyA1OTQyIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1OTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyMyA7IyA1OTQ0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTQ4IGFkZHNpMy8yCi1MJDA1OTAKLQlibCBMJDAwNDMsJXIwIDsjIDU5NjMganVtcAotCWxkaSAwLCVyOSA7IyA1OTU2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDUxMQotCXN0dyAlcjIzLC0yOTYoJXIzMCkgOyMgNTk2OCByZWxvYWRfb3V0c2krMi82Ci1MJDExODIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDU5NzcgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTIyIDsjIDU5NzkgYmxldSsxCi0JbGRvIDEoJXIyMCksJXIyMSA7IyA1OTg4IGFkZHNpMy8yCi0JbGRiIDAoJXIyMCksJXIyMCA7IyA1OTkyIG1vdnFpKzEvNQotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgNTk5MCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNjEyIDsjIDU5OTcgYmxldSsxCi0JZXh0cnUgJXIyMCwzMSw4LCVyNyA7IyA1OTkzIHplcm9fZXh0ZW5kcWlzaTIvMQotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1OTk4IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDYwMDEgemVyb19leHRlbmRxaXNpMi8yCi1MJDA2MTIKLQliYiw8ICVyMTUsMTksTCQwMDc2IDsjIDYwMTkgYmxldSszCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg5ODMgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPj49ICVyMSwlcjIxLEwkMDA3NiA7IyA2MDI1IGJsZXUrMQotCWV4dHJzICVyMjAsMzEsOCwlcjIwIDsjIDYwMzAgZXh0ZW5kcWlzaTIKLQlsZGkgOTIsJXIxOSA7IyA2MDMyIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwMzk3IDsjIDYwMzQgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwIDsjIDYwNDIganVtcAotTCQwNjE5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNTEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE0OSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE1MCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA2MjQgOyMgODE1MiBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNjA0NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDYyNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjA3NSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2MDg1IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDYzMCA7IyA2MDkzIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2MDg3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2MDk2IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDYzMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2MTAzIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYxMDcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjEwNSByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDYxMTUgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2MTExIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjIzIDsjIDYxMjUgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MTI3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDYxMzAgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2MTMxIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjMzIDsjIDYxMzYgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2MTM0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjEzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjE0MCBhZGRzaTMvMQotTCQwNjMzCi0JY29taWIsPSAwLCVyOCxMJDA2MzQgOyMgNjE0MyBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDYxNDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjE0NyBhZGRzaTMvMQotTCQwNjM0Ci0JY29taWIsPSAwLCVyOSxMJDA2MjMgOyMgNjE1MCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDYxNTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjE1NCBhZGRzaTMvMQotTCQwNjIzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjA1NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYwNTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjA1NiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjA1NyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDYyNQotCW5vcCA7IyA2MDYxIGJsZXUrMQotTCQwNjI0Ci0JbGRpIDIzLCVyMTkgOyMgNjE3NiBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDYxODkganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjE3NyBtb3ZxaSsxLzYKLUwkMDYzOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTU5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNTcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNTggYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNjQ0IDsjIDgxNjAgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDYxOTQgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2NyByZWxvYWRfb3V0c2krMi8zCi1MJDA2NDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDYyMjIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjIzMiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA2NTAgOyMgNjI0MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjIzNCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjI0MyByZWxvYWRfb3V0c2krMi82Ci1MJDA2NTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjI1MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2MjU0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDYyNTIgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2MjYyIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjI1OCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDY0MyA7IyA2MjcyIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjI3NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2Mjc3IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjI3OCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDY1MyA7IyA2MjgzIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjI4MSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDYyODQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDYyODcgYWRkc2kzLzEKLUwkMDY1MwotCWNvbWliLD0gMCwlcjgsTCQwNjU0IDsjIDYyOTAgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2MjkxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDYyOTQgYWRkc2kzLzEKLUwkMDY1NAotCWNvbWliLD0gMCwlcjksTCQwNjQzIDsjIDYyOTcgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2Mjk4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDYzMDEgYWRkc2kzLzEKLUwkMDY0MwotCWxkdyAwKCVyNSksJXI0IDsjIDYyMDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2MjA2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDYyMDMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDYyMDQgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA2NDUKLQlub3AgOyMgNjIwOCBibGV1KzEKLUwkMDY0NAotCWxkaSAyNCwlcjE5IDsjIDYzMjMgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2MzM2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDYzMjQgbW92cWkrMS82Ci1MJDA2NTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE2NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTY1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTY2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNjY0IDsjIDgxNjggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDY2NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjM2NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2Mzc2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDY3MCA7IyA2Mzg0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2Mzc4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2Mzg3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDY3MAotCWxkdyAwKCVyNSksJXIyNiA7IyA2Mzk0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYzOTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjM5NiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY0MDYgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2NDAyIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjYzIDsjIDY0MTYgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NDE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY0MjEgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2NDIyIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjczIDsjIDY0MjcgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2NDI1IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjQyOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjQzMSBhZGRzaTMvMQotTCQwNjczCi0JY29taWIsPSAwLCVyOCxMJDA2NzQgOyMgNjQzNCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY0MzUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjQzOCBhZGRzaTMvMQotTCQwNjc0Ci0JY29taWIsPSAwLCVyOSxMJDA2NjMgOyMgNjQ0MSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY0NDIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjQ0NSBhZGRzaTMvMQotTCQwNjYzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjM0NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYzNTAgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjM0NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjM0OCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDY2NQotCW5vcCA7IyA2MzUyIGJsZXUrMQotTCQwNjY0Ci0JbGRpIDI1LCVyMTkgOyMgNjQ2NyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY0ODAganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjQ2OCBtb3ZxaSsxLzYKLUwkMDY3OQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTc1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNzMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNzQgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA2ODQgOyMgODE3NiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjMgcmVsb2FkX291dHNpKzIvMwotTCQwNjg1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2NTEwIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY1MjAgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjkwIDsjIDY1MjggYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY1MjIgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY1MzEgcmVsb2FkX291dHNpKzIvNgotTCQwNjkwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY1MzggcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjU0MiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2NTQwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjU1MCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY1NDYgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2ODMgOyMgNjU2MCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY1NjIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjU2NSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY1NjYgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2OTMgOyMgNjU3MSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY1NjkgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2NTcyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2NTc1IGFkZHNpMy8xCi1MJDA2OTMKLQljb21pYiw9IDAsJXI4LEwkMDY5NCA7IyA2NTc4IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjU3OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2NTgyIGFkZHNpMy8xCi1MJDA2OTQKLQljb21pYiw9IDAsJXI5LEwkMDY4MyA7IyA2NTg1IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjU4NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2NTg5IGFkZHNpMy8xCi1MJDA2ODMKLQlsZHcgMCglcjUpLCVyNCA7IyA2NDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjQ5NCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NDkxIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2NDkyIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjg1Ci0Jbm9wIDsjIDY0OTYgYmxldSsxCi1MJDA2ODQKLQlsZGkgMjYsJXIxOSA7IyA2NjExIG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjYyNCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2NjEyIG1vdnFpKzEvNgotTCQwNjk5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxODMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE4MSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE4MiBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDcwNCA7IyA4MTg0IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2MSByZWxvYWRfb3V0c2krMi8zCi1MJDA3MDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY2NTQgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjY2NCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3MTAgOyMgNjY3MiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjY2NiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjY3NSByZWxvYWRfb3V0c2krMi82Ci1MJDA3MTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjY4MiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2Njg2IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY2ODQgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2Njk0IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjY5MCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDcwMyA7IyA2NzA0IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjcwNiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2NzA5IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjcxMCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDcxMyA7IyA2NzE1IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjcxMyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDY3MTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDY3MTkgYWRkc2kzLzEKLUwkMDcxMwotCWNvbWliLD0gMCwlcjgsTCQwNzE0IDsjIDY3MjIgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2NzIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDY3MjYgYWRkc2kzLzEKLUwkMDcxNAotCWNvbWliLD0gMCwlcjksTCQwNzAzIDsjIDY3MjkgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2NzMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDY3MzMgYWRkc2kzLzEKLUwkMDcwMwotCWxkdyAwKCVyNSksJXI0IDsjIDY2MzQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2NjM4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY2MzUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY2MzYgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3MDUKLQlub3AgOyMgNjY0MCBibGV1KzEKLUwkMDcwNAotCWxkaSAyNywlcjE5IDsjIDY3NTUgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NzY4IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDY3NTYgbW92cWkrMS82Ci1MJDA3MTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE5MSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTg5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTkwIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzI0IDsjIDgxOTIgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTU5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDcyNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjc5OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2ODA4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDczMCA7IyA2ODE2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2ODEwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2ODE5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDczMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2ODI2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDY4MzAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjgyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY4MzggYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2ODM0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzIzIDsjIDY4NDggYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2ODUwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY4NTMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2ODU0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzMzIDsjIDY4NTkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2ODU3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjg2MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjg2MyBhZGRzaTMvMQotTCQwNzMzCi0JY29taWIsPSAwLCVyOCxMJDA3MzQgOyMgNjg2NiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY4Njcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjg3MCBhZGRzaTMvMQotTCQwNzM0Ci0JY29taWIsPSAwLCVyOSxMJDA3MjMgOyMgNjg3MyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY4NzQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjg3NyBhZGRzaTMvMQotTCQwNzIzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjc3OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDY3ODIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjc3OSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjc4MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDcyNQotCW5vcCA7IyA2Nzg0IGJsZXUrMQotTCQwNzI0Ci0JbGRpIDI4LCVyMTkgOyMgNjg5OSBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY5MTIganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjkwMCBtb3ZxaSsxLzYKLUwkMDczOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTk5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxOTcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxOTggYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA3NDQgOyMgODIwMCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTcgcmVsb2FkX291dHNpKzIvMwotTCQwNzQ1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2OTQyIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY5NTIgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNzUwIDsjIDY5NjAgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY5NTQgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY5NjMgcmVsb2FkX291dHNpKzIvNgotTCQwNzUwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY5NzAgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjk3NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2OTcyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjk4MiBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY5NzggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA3NDMgOyMgNjk5MiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY5OTQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjk5NyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY5OTggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA3NTMgOyMgNzAwMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDcwMDEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3MDA0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3MDA3IGFkZHNpMy8xCi1MJDA3NTMKLQljb21pYiw9IDAsJXI4LEwkMDc1NCA7IyA3MDEwIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzAxMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3MDE0IGFkZHNpMy8xCi1MJDA3NTQKLQljb21pYiw9IDAsJXI5LEwkMDc0MyA7IyA3MDE3IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzAxOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3MDIxIGFkZHNpMy8xCi1MJDA3NDMKLQlsZHcgMCglcjUpLCVyNCA7IyA2OTIyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjkyNiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2OTIzIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2OTI0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNzQ1Ci0Jbm9wIDsjIDY5MjggYmxldSsxCi1MJDA3NDQKLQlsZGkgMTAsJXIxOSA7IyA3MDQzIG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNzA1NiBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA3MDQ0IG1vdnFpKzEvNgotTCQwNzU5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMDcgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIwNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODIwNiBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDc2NCA7IyA4MjA4IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU1NSByZWxvYWRfb3V0c2krMi8zCi1MJDA3NjUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDcwODYgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNzA5NiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3NzAgOyMgNzEwNCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNzA5OCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNzEwNyByZWxvYWRfb3V0c2krMi82Ci1MJDA3NzAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNzExNCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA3MTE4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDcxMTYgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA3MTI2IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNzEyMiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc2MyA7IyA3MTM2IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzEzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA3MTQxIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNzE0MiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDc3MyA7IyA3MTQ3IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzE0NSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDcxNDggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDcxNTEgYWRkc2kzLzEKLUwkMDc3MwotCWNvbWliLD0gMCwlcjgsTCQwNzc0IDsjIDcxNTQgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MTU1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDcxNTggYWRkc2kzLzEKLUwkMDc3NAotCWNvbWliLD0gMCwlcjksTCQwNzYzIDsjIDcxNjEgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MTYyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDcxNjUgYWRkc2kzLzEKLUwkMDc2MwotCWxkdyAwKCVyNSksJXI0IDsjIDcwNjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3MDcwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDcwNjcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDcwNjggYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3NjUKLQlub3AgOyMgNzA3MiBibGV1KzEKLUwkMDc2NAotCWxkaSAxMSwlcjE5IDsjIDcxODcgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA3MjAwIGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDcxODggbW92cWkrMS82Ci1MJDA3ODcKLQliYiw8ICVyMTUsMTcsTCQwMDc2IDsjIDcyMTYgYmxldSszCi0JbGRvIC00OCglcjcpLCVyMTkgOyMgNzIyNCBhZGRzaTMvMgotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlleHRydSAlcjE5LDMxLDgsJXIzIDsjIDcyMjUgemVyb19leHRlbmRxaXNpMi8xCi0JY29tYiw8PCAlcjEsJXIzLEwkMDkzOSA7IyA3MjMwIGJsZXUrMQotCWxkbyAtMzEyKCVyMzApLCVyMjYgOyMgNzI0NCBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZ3JvdXBfaW5fY29tcGlsZV9zdGFjaywlcjIgOyMgNzI0OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIzLCVyMjUgOyMgNzI0NiByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgNzI1MSBleHRlbmRxaXNpMgotCWNvbWliLDw+LG4gMCwlcjI4LEwkMDA3NiA7IyA3MjUzIGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgyMTIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MjE1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgyMTMgc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDgyMTQgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNzk1IDsjIDgyMTYgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDcyNjAgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjcgOyMgODU1MyByZWxvYWRfb3V0c2krMi8zCi1MJDA3OTYKLQljb21iLD0gJXI3LCVyMjAsTCQwOTQ0IDsjIDcyODggYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNzI5OCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjcsJXIxOSxMJDA4MDEgOyMgNzMwNiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNzMwMCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNyw0KCVyNSkgOyMgNzMwOSByZWxvYWRfb3V0c2krMi82Ci1MJDA4MDEKLQlsZHcgMCglcjUpLCVyMjYgOyMgNzMxNiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA3MzIwIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDczMTggcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA3MzI4IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNzMyNCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc5NCA7IyA3MzM4IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzM0MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA3MzQzIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNzM0NCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDgwNCA7IyA3MzQ5IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzM0NyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDczNTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDczNTMgYWRkc2kzLzEKLUwkMDgwNAotCWNvbWliLD0gMCwlcjgsTCQwODA1IDsjIDczNTYgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MzU3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDczNjAgYWRkc2kzLzEKLUwkMDgwNQotCWNvbWliLD0gMCwlcjksTCQwNzk0IDsjIDczNjMgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MzY0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDczNjcgYWRkc2kzLzEKLUwkMDc5NAotCWxkdyAwKCVyNSksJXI0IDsjIDcyNjggcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3MjcyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDcyNjkgc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDcyNzAgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3OTYKLQlub3AgOyMgNzI3NCBibGV1KzEKLUwkMDc5NQotCWxkaSA3LCVyMTkgOyMgNzM4OSBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDczOTAgbW92cWkrMS82Ci0JYmwgTCQwMDQzLCVyMCA7IyA3NDA1IGp1bXAKLQlzdGJzLG1hICVyMywxKCVyNikgOyMgNzM5MyBtb3ZxaSsxLzYKLUwkMDgxMQotCWJiLDwgJXIxNSwzMCxMJDAxMDQKLQlub3AgOyMgNzQxNCBibGV1KzMKLUwkMDM5NwotCWNvbWliLD0gMCwlcjE0LEwkMDgxNSA7IyA3NDI5IGJsZXUrMQotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA3NDMwIGFkZHNpMy8xCi0JYmwgTCQwODE2LCVyMCA7IyA3NDM0IGp1bXAKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDc0MzMgemVyb19leHRlbmRxaXNpMi8yCi1MJDA4MTUKLQljb3B5ICVyNywlcjE5IDsjIDc0MzggcmVsb2FkX291dHNpKzIvMQotTCQwODE2Ci0JY29weSAlcjE5LCVyNyA7IyA3NDQxIHJlbG9hZF9vdXRzaSsyLzEKLUwkMDA3NgotCWNvbWliLD0sbiAwLCVyOSxMJDA4MjAgOyMgNzQ2MCBibGV1KzEKLQlsZGIgMCglcjkpLCVyMjAgOyMgNzQ2MyB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyOSwlcjIwLCVyMTkgOyMgNzQ2NCBhZGRzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzQ2NSBhZGRzaTMvMgotCWNvbWIsPD4gJXI2LCVyMTksTCQwODIwIDsjIDc0NjcgYmxldSsxCi0JbGRpIDI1NSwlcjE5IDsjIDc0NzIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc0NzQgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMSA7IyA3NDc2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIxKSwlcjE5IDsjIDc0NzggbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgNzQ3OSBleHRlbmRxaXNpMgotCWxkaSA0MiwlcjE5IDsjIDc0ODEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc0ODMgYmxldSsxCi0JbGRpIDk0LCVyMTkgOyMgNzQ5MCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9LG4gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NDkyIGJsZXUrMQotCWJiLD49ICVyMTUsMzAsTCQwODIxIDsjIDc0OTcgbW92c2ktNAotCWxkaSA5MiwlcjE5IDsjIDc1MDQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4sbiAlcjE5LCVyMjAsTCQwODIyIDsjIDc1MDYgYmxldSsxCi0JbGRiIDEoJXIyMSksJXIxOSA7IyA3NTEwIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDc1MTEgZXh0ZW5kcWlzaTIKLUwkMDgyMQotCWxkaSA0MywlcjE5IDsjIDc1MzQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc1MzYgYmxldSsxCi0JbGRpIDYzLCVyMTkgOyMgNzU0MyByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9LG4gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NTQ1IGJsZXUrMQotTCQwODIyCi0JYmIsPj0sbiAlcjE1LDIyLEwkMDgxOSA7IyA3NTUzIG1vdnNpLTQKLQliYiw+PSAlcjE1LDE5LEwkMDgyMyA7IyA3NTU4IG1vdnNpLTQKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDc1NjAgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNzU2MiBtb3ZxaSsxLzUKLQlsZGkgMTIzLCVyMjAgOyMgNzU2NSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzU2MyBleHRlbmRxaXNpMgotCWNvbWIsPSxuICVyMjAsJXIxOSxMJDA4MjAgOyMgNzU2NyBibGV1KzEKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjI4IHJlbG9hZF9vdXRzaSsyLzUKLQlibCxuIEwkMTE3NywlcjAgOyMgNzU2OCBqdW1wCi1MJDA4MjMKLQlsZHcgLTI5NiglcjMwKSwlcjIxIDsjIDc1NzIgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgNzU3NCBtb3ZxaSsxLzUKLQlsZGkgOTIsJXIyMCA7IyA3NTc3IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NTc1IGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMjAsJXIxOSxMJDA4MTkgOyMgNzU3OSBibGV1KzEKLQlsZGIgMSglcjIxKSwlcjE5IDsjIDc1ODMgbW92cWkrMS81Ci0JbGRpIDEyMywlcjIwIDsjIDc1ODYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDc1ODQgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIyMCwlcjE5LEwkMDgxOSA7IyA3NTg4IGJsZXUrMQotTCQwODIwCi0JbGR3IDAoJXI1KSwlcjQgOyMgODIyMCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMjMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIyMSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgODIyMiBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA4MjkgOyMgODIyNCBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNzU5NiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTUxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDgzMAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzYyNCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3NjM0IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDgzNSA7IyA3NjQyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3NjM2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3NjQ1IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDgzNQotCWxkdyAwKCVyNSksJXIyNiA7IyA3NjUyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDc2NTYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzY1NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDc2NjQgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3NjYwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwODI4IDsjIDc2NzQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3Njc2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDc2NzkgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3NjgwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODM4IDsjIDc2ODUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3NjgzIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzY4NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzY4OSBhZGRzaTMvMQotTCQwODM4Ci0JY29taWIsPSAwLCVyOCxMJDA4MzkgOyMgNzY5MiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDc2OTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzY5NiBhZGRzaTMvMQotTCQwODM5Ci0JY29taWIsPSAwLCVyOSxMJDA4MjggOyMgNzY5OSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDc3MDAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzcwMyBhZGRzaTMvMQotTCQwODI4Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzYwNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDc2MDggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzYwNSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgNzYwNiBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDgzMAotCW5vcCA7IyA3NjEwIGJsZXUrMQotTCQwODI5Ci0JbGRpIDEsJXIxOSA7IyA3NzI1IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzcyNiBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyMCwxKCVyNikgOyMgNzcyOSBtb3ZxaSsxLzYKLQlsZG8gLTEoJXI2KSwlcjkgOyMgNzc0MSBhZGRzaTMvMgotTCQwODE5Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODIyOCByZWxvYWRfb3V0c2krMi81Ci1MJDExNzcKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIzMSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjI5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MjMwIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwODQ4IDsjIDgyMzIgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTQ5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDg0OQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzc3MSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3NzgxIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDg1NCA7IyA3Nzg5IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3NzgzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3NzkyIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDg1NAotCWxkdyAwKCVyNSksJXIyNiA7IyA3Nzk5IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDc4MDMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzgwMSByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDc4MTEgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3ODA3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwODQ3IDsjIDc4MjEgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3ODIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDc4MjYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3ODI3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODU3IDsjIDc4MzIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3ODMwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzgzMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzgzNiBhZGRzaTMvMQotTCQwODU3Ci0JY29taWIsPSAwLCVyOCxMJDA4NTggOyMgNzgzOSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDc4NDAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzg0MyBhZGRzaTMvMQotTCQwODU4Ci0JY29taWIsPSAwLCVyOSxMJDA4NDcgOyMgNzg0NiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDc4NDcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzg1MCBhZGRzaTMvMQotTCQwODQ3Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzc1MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDc3NTUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzc1MiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzc1MyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDg0OQotCW5vcCA7IyA3NzU3IGJsZXUrMQotTCQwODQ4Ci0Jc3RicyxtYSAlcjcsMSglcjYpIDsjIDc4NzIgbW92cWkrMS82Ci0JbGRiIDAoJXI5KSwlcjE5IDsjIDc4ODUgbW92cWkrMS81Ci0JbGRvIDEoJXIxOSksJXIxOSA7IyA3ODg4IGFkZHNpMy8yCi0Jc3RiICVyMTksMCglcjkpIDsjIDc4OTAgbW92cWkrMS82Ci1MJDAwNDMKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMjggcmVsb2FkX291dHNpKzIvNQotTCQxMTYxCi0JY29tY2xyLD0gJXIxNiwlcjE5LCVyMCA7IyAyNTggYmxldSsxCi0JYmwgTCQxMTc4LCVyMAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMzNCByZWxvYWRfb3V0c2krMi81Ci1MJDAwNDQKLQljb21pYiw9IDAsJXIxMCxMJDA4NjUgOyMgNzkxMyBibGV1KzEKLQlsZGkgMTMsJXIyNiA7IyA3OTE4IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA3OTIwIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA3OTE1IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDc5MjQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA3OTIyIGFkZHNpMy8yCi1MJDA4NjUKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDc5MjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDg2NiA7IyA3OTMwIGJsZXUrMQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNzk0NiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNzk0NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDc5NDkgcmVsb2FkX291dHNpKzIvNQotCWxkaSAwLCVyMjggOyMgNzk1NSByZWxvYWRfb3V0c2krMi8yCi0Jc3ViICVyNiwlcjE5LCVyMTkgOyMgNzk1MCBzdWJzaTMvMQotCWJsIEwkMDg2NywlcjAgOyMgNzk1NyBqdW1wCi0Jc3R3ICVyMTksOCglcjUpIDsjIDc5NTIgcmVsb2FkX291dHNpKzIvNgotTCQwODk1Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAyMjY5IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAyMjY3IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDIyNzMganVtcAotCWxkaSAxMSwlcjI4IDsjIDIyNzEgcmVsb2FkX291dHNpKzIvMgotTCQwOTAwCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAzMTYxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzMTU5IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDMxNjUganVtcAotCWxkaSA0LCVyMjggOyMgMzE2MyByZWxvYWRfb3V0c2krMi8yCi1MJDA5MDIKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDMyMTggY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDMyMTYgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMzIyMiBqdW1wCi0JbGRpIDcsJXIyOCA7IyAzMjIwIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkwMwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMzgwMyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzgwMSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAzODA3IGp1bXAKLQlsZGkgNSwlcjI4IDsjIDM4MDUgcmVsb2FkX291dHNpKzIvMgotTCQwOTE1Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA1NDYxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA1NDU5IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDU0NjUganVtcAotCWxkaSA5LCVyMjggOyMgNTQ2MyByZWxvYWRfb3V0c2krMi8yCi1MJDA5MTcKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDU1NTcgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDU1NTUgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNTU2MSBqdW1wCi0JbGRpIDEzLCVyMjggOyMgNTU1OSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MjIKLQlibCBMJDA4NjcsJXIwIDsjIDU5ODMganVtcAotCWxkaSAxNCwlcjI4IDsjIDU5ODEgcmVsb2FkX291dHNpKzIvMgotTCQwOTM5Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3MjM1IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3MjMzIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDcyMzkganVtcAotCWxkaSA2LCVyMjggOyMgNzIzNyByZWxvYWRfb3V0c2krMi8yCi1MJDA5NDQKLQlibCBMJDA4NjcsJXIwIDsjIDc3NzUganVtcAotCWxkaSAxNSwlcjI4IDsjIDc3NzMgcmVsb2FkX291dHNpKzIvMgotTCQwODY2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3OTM1IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3OTMzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGkgOCwlcjI4IDsjIDc5MzcgcmVsb2FkX291dHNpKzIvMgotTCQwODY3Ci0JbGR3IC0zNDAoJXIzMCksJXIyIDsjIDkwMjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTY4KCVyMzApLCVyMTggOyMgOTAyOCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNjQoJXIzMCksJXIxNyA7IyA5MDMwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE2MCglcjMwKSwlcjE2IDsjIDkwMzIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTU2KCVyMzApLCVyMTUgOyMgOTAzNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNTIoJXIzMCksJXIxNCA7IyA5MDM2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE0OCglcjMwKSwlcjEzIDsjIDkwMzggcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTQ0KCVyMzApLCVyMTIgOyMgOTA0MCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNDAoJXIzMCksJXIxMSA7IyA5MDQyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEzNiglcjMwKSwlcjEwIDsjIDkwNDQgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTMyKCVyMzApLCVyOSA7IyA5MDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEyOCglcjMwKSwlcjggOyMgOTA0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMjQoJXIzMCksJXI3IDsjIDkwNTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTIwKCVyMzApLCVyNiA7IyA5MDUyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTExNiglcjMwKSwlcjUgOyMgOTA1NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMTIoJXIzMCksJXI0IDsjIDkwNTYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTA4KCVyMzApLCVyMyA7IyA5MDU4IHJlbG9hZF9vdXRzaSsyLzUKLQlidiAlcjAoJXIyKSA7IyA5MDYxIHJldHVybl9pbnRlcm5hbAotCWxkbyAtMzIwKCVyMzApLCVyMzAgOyMgOTA2MCBhZGRzaTMvMgotCS5FWElUCi0JLlBST0NFTkQKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkQlNTJAotCi0JLmFsaWduIDEKLXJlX3N5bnRheF90YWJsZQotCS5ibG9jayAyNTYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2NvbW1vbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTJiMGNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotdGV4dF9zeW1ib2w6CQotCS5sb25nCTEKLQkubG9uZwlleHRlcm5hbF9zeW1ib2wKLQkuZGF0YQotZGF0YV9zeW1ib2w6Ci0JLmxvbmcJMgotY29tbW9uX3N5bWJvbAkuY29tbQk0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ZyYWdidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM0MTkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JLlNQQUNFICRURVhUJAkKLQkuU1VCU1BBICRDT0RFJAkKLQlub3AJCQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2dsb2JhbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGYwNWY2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0KLQkuc3BhY2UgJFBSSVZBVEUkCi0JLnN1YnNwYSAkR0xPQkFMJAotCS5leHBvcnQgJGdsb2JhbCQKLSRnbG9iYWwkCi0JLnNwYWNlICRURVhUJAotCS5zdWJzcGEgJENPREUkCi0KLQkucHJvYwotCS5jYWxsaW5mbwotaXZhYWRkcgotCW5vcAotCW5vcAotCWFkZGlsIEwlaXZhYWRkci0kZ2xvYmFsJCwlZHAKLQlsZG8gICBSJWl2YWFkZHItJGdsb2JhbCQoJXIxKSwlcjE5Ci0JLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRhZmI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGZvbyxEQVRBCi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuYWxpZ24gNAotZm9vOgotCS53b3JkIDAKLQkuSU1QT1JUIF9fbWFpbixDT0RFCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JLmltcG9ydCBmb28KLQlzdHcgJXIyLC0yMCgwLCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDY0KCVyMzApCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCW5vcAotTCQwMDAxOgotCWxkdyAtMjAoJXIzKSwlcjIKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbGFiZWxkaWZmcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sYWJlbGRpZmZzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTY2ZjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sYWJlbGRpZmZzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi07IFNob3VsZCBjaGVjayB0byBtYWtlIHN1cmUgc29tZXRoaW5nIHVzZWZ1bCBnZXRzIHB1dCBvbiB0aG9zZSAud29yZAotOyBzdGF0ZW1lbnRzLgotICAgICAgICAuc3BhY2UJJFRFWFQkCi0gICAgICAgIC5zdWJzcGEJJENPREUkCi0KLQkuYWxpZ24JOAotCS5leHBvcnQJaWNvZGUsZGF0YQotaWNvZGU6Ci0JLnByb2MKLQkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscwotCS5lbnRyeQotCWJ2LG4JJXIwKCVyMikKLQkuZXhpdAotCW5vcAotCS5wcm9jZW5kCi0KLQk7Ci0JOyBGSVJTVCwgYXJndiBhcnJheSBvZiBwb2ludGVycyB0byBhcmdzLCAxc3QgaXMgc2FtZSBhcyBwYXRoLgotCTsKLQkuYWxpZ24JOAotaWNfYXJndjoKLQkud29yZAlpY19hcmd2MS1pY29kZQk7IHNlY29uZCwgcG9pbnRlciB0byAxc3QgYXJndW1lbnQKLQkud29yZAlpY19wYXRoLWljb2RlCQk7IGZpcnN0LCAgcG9pbnRlciB0byBpbml0IHBhdGgKLQkud29yZAkwCQkJOyBmb3VydGgsIE5VTEwgYXJndiB0ZXJtaW5hdG9yIChwYWQpCi0JLndvcmQJMAkJCTsgdGhpcmQsICBOVUxMIGFyZ3YgdGVybWluYXRvcgotCi1pY19wYXRoOgotCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCi0JLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCi0JLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgotCi1pY19hcmd2MToKLQkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcwotCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAotCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKLQotCS5leHBvcnQJc3ppY29kZSxkYXRhCi1zemljb2RlOgotCS53b3JkCXN6aWNvZGUtaWNvZGUKLQkud29yZAkwCQkJOyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpbGxlciBhdCBlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbG9jYWxsYWJlbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sb2NhbGxhYmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNTcyMWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sb2NhbGxhYmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQotTGFiZWw6Ci1MJDAxMjM0OgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3NzX2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3NzX2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOThlYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9zc19hbGlnbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049NjQsQUNDRVNTPTMxCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotc3ltMToJLldPUkQgMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMwMGM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotIyBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fc3Vic3BhY2VfYWxpZ25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzc19hbGlnbi5zOiBUZXN0IHN1YnNwYWNlIGFsaWdubWVudCAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJzc19hbGlnbi5zIiAiIiAic3Vic3BhY2UgYWxpZ25tZW50IChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLWgiCi0KLSAgICAjIENoZWNrIHRoZSBoZWFkZXJzIGZvciB0aGUgY29ycmVjdCBhbGlnbm1lbnQgdmFsdWUgZm9yIHRoZQotICAgICMgLmRhdGEgc2VjdGlvbiAoZWxmKSBvciB0aGUgJERBVEEkIHN1YnNwYWNlIChzb20pLgotCWlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JCSAgICAtcmUgImRhdGFcW15cblxdKiAyLi42XFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCAgewotCQkgICAgLXJlICJEQVRBXFteXG5cXSogMi4uNlxbXlxuXF0qXG4iCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQkgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCSAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2xvY2FsX2xhYmVsX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9jYWxsYWJlbC5zOiBFbGltaW5hdGlvbiBvZiBsb2NhbCBsYWJlbHMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibG9jYWxsYWJlbC5zIiAiIiAiRWxpbWluYXRpb24gb2YgbG9jYWwgbGFiZWxzIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXQiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDBcW15cblxdKkxhYmVsXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXjAwMDAwMDAwXFteXG5cXSpMXCQwMTIzNFxbXlxuXF0qXG4iCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fZnJjaGFpbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZyYWdidWcuczogVGVzdCBidWcgaW4gZnJhZyBjaGFpbmluZyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmcmFnYnVnLnMiICIiICJUZXN0IGJ1ZyBpbiBmcmFnIGNoYWluaW5nIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjB4MDAwMDAwMDBcW15cblxdKm5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIl4weDAwMDAwMDA0XFteXG5cXSpub3BcW15cblxdKlxuIgkJeyBzZXQgeCAwIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19hbGlnbjNfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbGlnbjMuczogVGVzdCBmb3IgYWxpZ25tZW50IGJ1ZyB3aGVuIHN3aXRjaGluZyBzdWJzcGFjZXMgKHBhcnQyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJhbGlnbjMucyIgIiIgIlRlc3QgZm9yIGFsaWdubWVudCBidWcgd2hlbiBzd2l0Y2hpbmcgc3Vic3BhY2VzIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSogPG1haW4+IG5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIlxbXlxuXF0qIDwuKmVuZF9tYWluPiBub3BcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKiA8bWFpbisuKj4gbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fYWxpZ240X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWxpZ240LnM6IE1vcmUgc3Vic3BhY2UgYWxpZ25tZW50IHRlc3RzIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImFsaWduNC5zIiAiIiAiTW9yZSBzdWJzcGFjZSBhbGlnbm1lbnQgdGVzdHMgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItaCIKLQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIlxbXlxuXF0qTUlMTElDT0RFXFteXG5cXSoyLi42XFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qWUFCQkFcW15cblxdKjIuLjNcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9faW1wb3J0X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW1wb3J0YnVnLnM6IFRlc3QgZm9yIGJ1ZyBpbiAuaW1wb3J0IGRpcmVjdGl2ZSAocGFydDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImltcG9ydGJ1Zy5zIiAiIiAiVGVzdCBmb3IgYnVnIGluIC5pbXBvcnQgZGlyZWN0aXZlIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1zeW1zIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSouREFUQS4uZm9vXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSouZGF0YS4qZm9vXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fY29tbW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tbW9uLnM6IFRlc3QgZm9yIGJ1ZyBpbiAuY29tbSBoYW5kbGluZyAocGFydDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImNvbW1vbi5zIiAiIiAiVGVzdCBmb3IgYnVnIGluIC5jb21tIGhhbmRsaW5nIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1zeW1zIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSouQ09NLipjb21tb25fc3ltYm9sXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyBNYWtlIHN1cmUgc3Vic3BhY2UgYWxpZ25tZW50IHJlcXVlc3RzIGZyb20gdGhlIHN1YnNwYWNlIGRpcmVjdGl2ZXMKLSAgICAjIGFyZSBob25vcmVkCi0gICAgZG9fc3Vic3BhY2VfYWxpZ25fdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgbGFiZWxzIGVuZCB1cCBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gICAgZG9fbG9jYWxfbGFiZWxfdGVzdAotCi0gICAgIyBHQVMtMS4zNiBjaG9rZWQgb24gdGhpcyBmaWxlLgotICAgIGdhc190ZXN0ICJsYWJlbGRpZmZzLnMiICIiICIiICJEaWZmZXJlbmNlIG9mIGxhYmVscyIKLQotICAgICMgVGVzdCBhIHJlY2VudCBidWcgd2hlcmUgZnJhZyBjaGFpbmluZyB3YXNuJ3Qgd29ya2luZyBjb3JyZWN0bHkuCi0gICAgZG9fZnJjaGFpbl90ZXN0Ci0KLSAgICAjIFRlc3QgYnVnIHdoZXJlIHN3aXRjaGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBjcmVhdGVzIGJvZ3VzIGFsaWdubWVudHMKLSAgICBkb19hbGlnbjNfdGVzdAotCi0gICAgIyBUZXN0IGJ1ZyB3aGVyZSBzd2l0Y2hpbmcgYmV0d2VlbiBzdWJzcGFjZXMgY3JlYXRlcyBib2d1cyBhbGlnbm1lbnRzCi0gICAgZG9fYWxpZ240X3Rlc3QKLQotICAgICMgVGVzdCBhIHByb2JsZW0gd2hlcmUgJGdsb2JhbCQgaXMgZGVmaW5lZCwgdGhlbiB1c2VkIHdpdGhpbiB0aGUKLSAgICAjIHNhbWUgc291cmNlIGZpbGUuCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qCi0gICAgZ2FzX3Rlc3QgImdsb2JhbGJ1Zy5zIiAiIiAiIiAiVXNlIFwkZ2xvYmFsXCQgaW4gZmlsZSB3aGljaCBkZWZpbmVzIGl0IgotCi0gICAgIyBUZXN0IHRoYXQgaW1wb3J0aW5nIGEgZGVmaW5lZCBzeW1ib2wgZG9lc24ndCBzY3JldyB1cCB0aGUgc3ltYm9sJ3MKLSAgICAjIHNwYWNlL3N1YnNwYWNlLgotICAgIGRvX2ltcG9ydF90ZXN0Ci0KLSAgICAjIFRlc3QgZm9yIGEgYnVnbGV0IGluIHRoZSBoYW5kbGluZyBvZiBjb21tb24gc3ltYm9scwotICAgIGRvX2NvbW1vbl90ZXN0Ci0KLSAgICAjIFRlc3QgZm9yIGFuIG9mZi1ieS0yIGJ1ZyBpbiByYW5nZSBjaGVjayBmb3IgY29uZGl0aW9uYWwgYnJhbmNoZXMKLSAgICBnYXNfdGVzdF9lcnJvciAiYnJsZW5idWcucyIgIiIgIkNoZWNrIGZvciBlcnJvcihzKSBpbiBicmFuY2ggbGVuZ3RoIgotCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmYxNjc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBhbWQKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTBmIDBkIDAzIFsgCV0qcHJlZmV0Y2ggXCglZWJ4XCkKLSAgIDM6CTBmIDBkIDBjIDc1IDAwIDEwIDAwIDAwIFsgCV0qcHJlZmV0Y2h3IDB4MTAwMFwoLCVlc2ksMlwpCi0gICBiOgkwZiAwZSBbIAldKmZlbW1zICAKLSAgIGQ6CTBmIDBmIDAwIGJmIFsgCV0qcGF2Z3VzYiBcKCVlYXhcKSwlbW0wCi0gIDExOgkwZiAwZiA0OCAwMiAxZCBbIAldKnBmMmlkICAweDJcKCVlYXhcKSwlbW0xCi0gIDE2OgkwZiAwZiA5MCAwMCAwMSAwMCAwMCBhZSBbIAldKnBmYWNjICAweDEwMFwoJWVheFwpLCVtbTIKLSAgMWU6CTBmIDBmIDFlIDllIFsgCV0qcGZhZGQgIFwoJWVzaVwpLCVtbTMKLSAgMjI6CTBmIDBmIDY2IDAyIGIwIFsgCV0qcGZjbXBlcSAweDJcKCVlc2lcKSwlbW00Ci0gIDI3OgkwZiAwZiBhZSA5MCA5MCAwMCAwMCA5MCBbIAldKnBmY21wZ2UgMHg5MDkwXCglZXNpXCksJW1tNQotICAyZjoJMGYgMGYgNzQgNzUgMDAgYTAgWyAJXSpwZmNtcGd0IDB4MFwoJWVicCwlZXNpLDJcKSwlbW02Ci0gIDM1OgkwZiAwZiA3YyA3NSAwMiBhNCBbIAldKnBmbWF4ICAweDJcKCVlYnAsJWVzaSwyXCksJW1tNwotICAzYjoJMGYgMGYgODQgNzUgOTAgOTAgOTAgOTAgOTQgWyAJXSpwZm1pbiAgMHg5MDkwOTA5MFwoJWVicCwlZXNpLDJcKSwlbW0wCi0gIDQ0OgkwZiAwZiAwZCAwNCAwMCAwMCAwMCBiNCBbIAldKnBmbXVsICAweDQsJW1tMQotICA0YzoJMmUgMGYgMGYgNTQgYzMgMDcgOTYgWyAJXSpwZnJjcCAgJWNzOjB4N1woJWVieCwlZWF4LDhcKSwlbW0yCi0gIDUzOgkwZiAwZiBkOCBhNiBbIAldKnBmcmNwaXQxICVtbTAsJW1tMwotICA1NzoJMGYgMGYgZTEgYjYgWyAJXSpwZnJjcGl0MiAlbW0xLCVtbTQKLSAgNWI6CTBmIDBmIGVhIGE3IFsgCV0qcGZyc3FpdDEgJW1tMiwlbW01Ci0gIDVmOgkwZiAwZiBmMyA5NyBbIAldKnBmcnNxcnQgJW1tMywlbW02Ci0gIDYzOgkwZiAwZiBmYyA5YSBbIAldKnBmc3ViICAlbW00LCVtbTcKLSAgNjc6CTBmIDBmIGM1IGFhIFsgCV0qcGZzdWJyICVtbTUsJW1tMAotICA2YjoJMGYgMGYgY2UgMGQgWyAJXSpwaTJmZCAgJW1tNiwlbW0xCi0gIDZmOgkwZiAwZiBkNyBiNyBbIAldKnBmbXVsaHJ3ICVtbTcsJW1tMgotICA3MzoJMmUgMGYgWyAJXSpcKGJhZFwpICAKLSAgNzU6CTBmIDU0IGMzIFsgCV0qYW5kcHMgICV4bW0zLCV4bW0wCi0gIDc4OgkwNyBbIAldKnBvcCAgICAlZXMKLSAgNzk6CWMzIFsgCV0qcmV0ICAgIAotICA3YToJOTAgWyAJXSpub3AgICAgCi0gIDdiOgk5MCBbIAldKm5vcCAgICAKLSAgN2M6CTkwIFsgCV0qbm9wICAgIAotICA3ZDoJOTAgWyAJXSpub3AgICAgCi0gIDdlOgk5MCBbIAldKm5vcCAgICAKLSAgN2Y6CTkwIFsgCV0qbm9wICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDljNjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSNBTUQgM0ROb3chIGluc3RydWN0aW9ucwotCi0udGV4dAotZm9vOgotIHByZWZldGNoCSglZWJ4KQotIHByZWZldGNodwkweDEwMDAoLCVlc2ksMikKLSBmZW1tcwotIHBhdmd1c2IJKCVlYXgpLCVtbTAKLSBwZjJpZAkJMiglZWF4KSwlbW0xCi0gcGZhY2MJCTB4MTAwKCVlYXgpLCVtbTIKLSBwZmFkZAkJKCVlc2kpLCVtbTMKLSBwZmNtcGVxCTIoJWVzaSksJW1tNAotIHBmY21wZ2UJMHg5MDkwKCVlc2kpLCVtbTUKLSBwZmNtcGd0CSglZWJwLCVlc2ksMiksJW1tNgotIHBmbWF4CQkyKCVlYnAsJWVzaSwyKSwlbW03Ci0gcGZtaW4JCTB4OTA5MDkwOTAoJWVicCwlZXNpLDIpLCVtbTAKLSBwZm11bAkJNCwlbW0xCi0gcGZyY3AJCSVjczo3KCVlYngsJWVheCw4KSwlbW0yCi0gcGZyY3BpdDEJJW1tMCwlbW0zCi0gcGZyY3BpdDIJJW1tMSwlbW00Ci0gcGZyc3FpdDEJJW1tMiwlbW01Ci0gcGZyc3FydAklbW0zLCVtbTYKLSBwZnN1YgkJJW1tNCwlbW03Ci0gcGZzdWJyCQklbW01LCVtbTAKLSBwaTJmZAkJJW1tNiwlbW0xCi0gcG11bGhydwklbW03LCVtbTIKLQotIyBUaGlzIGlzIGEgM0ROb3chIGluc3RydWN0aW9uLCB3aXRoIGEgcHJlZml4LCB0aGF0IGlzbid0IHF1aXRlIHJpZ2h0Ci0jIEV2ZXJ5dGhpbmcncyBnb29kIGJhciB0aGUgb3Bjb2RlIHN1ZmZpeAotLmJ5dGUgMHgyZSwgMHgwZiwgMHgwZiwgMHg1NCwgMHhjMywgMHgwNywgMHhjMwotCi0jIFBhZCBvdXQgdG8gYSBnb29kIGFsaWdubWVudAotIC5ieXRlIDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmNhZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjM6IFdhcm5pbmc6LipmYWRkcC4qCi0uKjoxNDogV2FybmluZzouKmZzdWJwLioKLS4qOjI1OiBXYXJuaW5nOi4qZnN1YnJwLioKLS4qOjM2OiBXYXJuaW5nOi4qZm11bHAuKgotLio6NDc6IFdhcm5pbmc6LipmZGl2cC4qCi0uKjo1ODogV2FybmluZzouKmZkaXZycC4qCi0gICAxIFsgCV0qLnBzaXplIDAKLSAgIDIgWyAJXSoudGV4dAotICAgMyAwMDAwIERFQzEgWyAJXSpmYWRkCi0uKldhcm5pbmc6LipmYWRkcC4qCi0gICA0IDAwMDIgRDhDMyBbIAldKmZhZGQJJXN0XCgzXCkKLSAgIDUgMDAwNCBEOEMzIFsgCV0qZmFkZAklc3RcKDNcKSwlc3QKLSAgIDYgMDAwNiBEQ0MzIFsgCV0qZmFkZAklc3QsJXN0XCgzXCkKLSAgIDcgMDAwOCBEODAzIFsgCV0qZmFkZHMJXCglZWJ4XCkKLSAgIDggMDAwYSBEQzAzIFsgCV0qZmFkZGwJXCglZWJ4XCkKLSAgIDkgMDAwYyBERTAzIFsgCV0qZmlhZGRzCVwoJWVieFwpCi0gIDEwIDAwMGUgREEwMyBbIAldKmZpYWRkbAlcKCVlYnhcKQotICAxMSAwMDEwIERFQzEgWyAJXSpmYWRkcAotICAxMiAwMDEyIERFQzMgWyAJXSpmYWRkcAklc3RcKDNcKQotICAxMyAwMDE0IERFQzMgWyAJXSpmYWRkcAklc3QsJXN0XCgzXCkKLSAgMTQgMDAxNiBERUUxIFsgCV0qZnN1YgotLipXYXJuaW5nOi4qZnN1YnAuKgotICAxNSAwMDE4IEQ4RTMgWyAJXSpmc3ViCSVzdFwoM1wpCi0gIDE2IDAwMWEgRDhFMyBbIAldKmZzdWIJJXN0XCgzXCksJXN0Ci0gIDE3IDAwMWMgRENFMyBbIAldKmZzdWIJJXN0LCVzdFwoM1wpCi0gIDE4IDAwMWUgRDgyMyBbIAldKmZzdWJzCVwoJWVieFwpCi0gIDE5IDAwMjAgREMyMyBbIAldKmZzdWJsCVwoJWVieFwpCi0gIDIwIDAwMjIgREUyMyBbIAldKmZpc3VicwlcKCVlYnhcKQotICAyMSAwMDI0IERBMjMgWyAJXSpmaXN1YmwJXCglZWJ4XCkKLSAgMjIgMDAyNiBERUUxIFsgCV0qZnN1YnAKLSAgMjMgMDAyOCBERUUzIFsgCV0qZnN1YnAJJXN0XCgzXCkKLSAgMjQgMDAyYSBERUUzIFsgCV0qZnN1YnAJJXN0LCVzdFwoM1wpCi0gIDI1IDAwMmMgREVFOSBbIAldKmZzdWJyCi0uKldhcm5pbmc6Lipmc3VicnAuKgotICAyNiAwMDJlIEQ4RUIgWyAJXSpmc3Vicgklc3RcKDNcKQotICAyNyAwMDMwIEQ4RUIgWyAJXSpmc3Vicgklc3RcKDNcKSwlc3QKLSAgMjggMDAzMiBEQ0VCIFsgCV0qZnN1YnIJJXN0LCVzdFwoM1wpCi0gIDI5IDAwMzQgRDgyQiBbIAldKmZzdWJycwlcKCVlYnhcKQotICAzMCAwMDM2IERDMkIgWyAJXSpmc3VicmwJXCglZWJ4XCkKLSAgMzEgMDAzOCBERTJCIFsgCV0qZmlzdWJycwlcKCVlYnhcKQotICAzMiAwMDNhIERBMkIgWyAJXSpmaXN1YnJsCVwoJWVieFwpCi0gIDMzIDAwM2MgREVFOSBbIAldKmZzdWJycAotICAzNCAwMDNlIERFRUIgWyAJXSpmc3VicnAJJXN0XCgzXCkKLSAgMzUgMDA0MCBERUVCIFsgCV0qZnN1YnJwCSVzdCwlc3RcKDNcKQotICAzNiAwMDQyIERFQzkgWyAJXSpmbXVsCi0uKldhcm5pbmc6LipmbXVscC4qCi0gIDM3IDAwNDQgRDhDQiBbIAldKmZtdWwJJXN0XCgzXCkKLSAgMzggMDA0NiBEOENCIFsgCV0qZm11bAklc3RcKDNcKSwlc3QKLSAgMzkgMDA0OCBEQ0NCIFsgCV0qZm11bAklc3QsJXN0XCgzXCkKLSAgNDAgMDA0YSBEODBCIFsgCV0qZm11bHMJXCglZWJ4XCkKLSAgNDEgMDA0YyBEQzBCIFsgCV0qZm11bGwJXCglZWJ4XCkKLSAgNDIgMDA0ZSBERTBCIFsgCV0qZmltdWxzCVwoJWVieFwpCi0gIDQzIDAwNTAgREEwQiBbIAldKmZpbXVsbAlcKCVlYnhcKQotICA0NCAwMDUyIERFQzkgWyAJXSpmbXVscAotICA0NSAwMDU0IERFQ0IgWyAJXSpmbXVscAklc3RcKDNcKQotICA0NiAwMDU2IERFQ0IgWyAJXSpmbXVscAklc3QsJXN0XCgzXCkKLSAgNDcgMDA1OCBERUYxIFsgCV0qZmRpdgotLipXYXJuaW5nOi4qZmRpdnAuKgotICA0OCAwMDVhIEQ4RjMgWyAJXSpmZGl2CSVzdFwoM1wpCi0gIDQ5IDAwNWMgRDhGMyBbIAldKmZkaXYJJXN0XCgzXCksJXN0Ci0gIDUwIDAwNWUgRENGMyBbIAldKmZkaXYJJXN0LCVzdFwoM1wpCi0gIDUxIDAwNjAgRDgzMyBbIAldKmZkaXZzCVwoJWVieFwpCi0gIDUyIDAwNjIgREMzMyBbIAldKmZkaXZsCVwoJWVieFwpCi0gIDUzIDAwNjQgREUzMyBbIAldKmZpZGl2cwlcKCVlYnhcKQotICA1NCAwMDY2IERBMzMgWyAJXSpmaWRpdmwJXCglZWJ4XCkKLSAgNTUgMDA2OCBERUYxIFsgCV0qZmRpdnAKLSAgNTYgMDA2YSBERUYzIFsgCV0qZmRpdnAJJXN0XCgzXCkKLSAgNTcgMDA2YyBERUYzIFsgCV0qZmRpdnAJJXN0LCVzdFwoM1wpCi0gIDU4IDAwNmUgREVGOSBbIAldKmZkaXZyCi0uKldhcm5pbmc6LipmZGl2cnAuKgotICA1OSAwMDcwIEQ4RkIgWyAJXSpmZGl2cgklc3RcKDNcKQotICA2MCAwMDcyIEQ4RkIgWyAJXSpmZGl2cgklc3RcKDNcKSwlc3QKLSAgNjEgMDA3NCBEQ0ZCIFsgCV0qZmRpdnIJJXN0LCVzdFwoM1wpCi0gIDYyIDAwNzYgRDgzQiBbIAldKmZkaXZycwlcKCVlYnhcKQotICA2MyAwMDc4IERDM0IgWyAJXSpmZGl2cmwJXCglZWJ4XCkKLSAgNjQgMDA3YSBERTNCIFsgCV0qZmlkaXZycwlcKCVlYnhcKQotICA2NSAwMDdjIERBM0IgWyAJXSpmaWRpdnJsCVwoJWVieFwpCi0gIDY2IDAwN2UgREVGOSBbIAldKmZkaXZycAotICA2NyAwMDgwIERFRkIgWyAJXSpmZGl2cnAJJXN0XCgzXCkKLSAgNjggMDA4MiBERUZCIFsgCV0qZmRpdnJwCSVzdCwlc3RcKDNcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmIwOWY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS5wc2l6ZSAwCi0udGV4dAotCWZhZGQKLQlmYWRkCSVzdCgzKQotCWZhZGQJJXN0KDMpLCVzdAotCWZhZGQJJXN0LCVzdCgzKQotCWZhZGRzCSglZWJ4KQotCWZhZGRsCSglZWJ4KQotCWZpYWRkcwkoJWVieCkKLQlmaWFkZGwJKCVlYngpCi0JZmFkZHAKLQlmYWRkcAklc3QoMykKLQlmYWRkcAklc3QsJXN0KDMpCi0JZnN1YgotCWZzdWIJJXN0KDMpCi0JZnN1Ygklc3QoMyksJXN0Ci0JZnN1Ygklc3QsJXN0KDMpCi0JZnN1YnMJKCVlYngpCi0JZnN1YmwJKCVlYngpCi0JZmlzdWJzCSglZWJ4KQotCWZpc3VibAkoJWVieCkKLQlmc3VicAotCWZzdWJwCSVzdCgzKQotCWZzdWJwCSVzdCwlc3QoMykKLQlmc3VicgotCWZzdWJyCSVzdCgzKQotCWZzdWJyCSVzdCgzKSwlc3QKLQlmc3Vicgklc3QsJXN0KDMpCi0JZnN1YnJzCSglZWJ4KQotCWZzdWJybAkoJWVieCkKLQlmaXN1YnJzCSglZWJ4KQotCWZpc3VicmwJKCVlYngpCi0JZnN1YnJwCi0JZnN1YnJwCSVzdCgzKQotCWZzdWJycAklc3QsJXN0KDMpCi0JZm11bAotCWZtdWwJJXN0KDMpCi0JZm11bAklc3QoMyksJXN0Ci0JZm11bAklc3QsJXN0KDMpCi0JZm11bHMJKCVlYngpCi0JZm11bGwJKCVlYngpCi0JZmltdWxzCSglZWJ4KQotCWZpbXVsbAkoJWVieCkKLQlmbXVscAotCWZtdWxwCSVzdCgzKQotCWZtdWxwCSVzdCwlc3QoMykKLQlmZGl2Ci0JZmRpdgklc3QoMykKLQlmZGl2CSVzdCgzKSwlc3QKLQlmZGl2CSVzdCwlc3QoMykKLQlmZGl2cwkoJWVieCkKLQlmZGl2bAkoJWVieCkKLQlmaWRpdnMJKCVlYngpCi0JZmlkaXZsCSglZWJ4KQotCWZkaXZwCi0JZmRpdnAJJXN0KDMpCi0JZmRpdnAJJXN0LCVzdCgzKQotCWZkaXZyCi0JZmRpdnIJJXN0KDMpCi0JZmRpdnIJJXN0KDMpLCVzdAotCWZkaXZyCSVzdCwlc3QoMykKLQlmZGl2cnMJKCVlYngpCi0JZmRpdnJsCSglZWJ4KQotCWZpZGl2cnMJKCVlYngpCi0JZmlkaXZybAkoJWVieCkKLQlmZGl2cnAKLQlmZGl2cnAJJXN0KDMpCi0JZmRpdnJwCSVzdCwlc3QoMykKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDM0NDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjEwOiBXYXJuaW5nOi4qCi0uKjoxMjogV2FybmluZzouKgotLio6MTk6IFdhcm5pbmc6LioKLS4qOjIyOiBXYXJuaW5nOi4qCi0uKjo4MTogV2FybmluZzouKgotLio6ODI6IFdhcm5pbmc6LioKLS4qOjgzOiBXYXJuaW5nOi4qCi0uKjo4NDogV2FybmluZzouKgotLio6ODU6IFdhcm5pbmc6LioKLS4qOjg2OiBXYXJuaW5nOi4qCi0uKjo4NzogV2FybmluZzouKgotLio6ODg6IFdhcm5pbmc6LioKLS4qOjg5OiBXYXJuaW5nOi4qCi0uKjo5MDogV2FybmluZzouKgotLio6OTE6IFdhcm5pbmc6LioKLS4qOjkyOiBXYXJuaW5nOi4qCi0uKjo5MzogV2FybmluZzouKgotLio6OTQ6IFdhcm5pbmc6LioKLS4qOjk1OiBXYXJuaW5nOi4qCi0uKjo5NjogV2FybmluZzouKgotLio6OTc6IFdhcm5pbmc6LioKLS4qOjk4OiBXYXJuaW5nOi4qCi0uKjo5OTogV2FybmluZzouKgotLio6MTAwOiBXYXJuaW5nOi4qCi0uKjoxMDE6IFdhcm5pbmc6LioKLS4qOjEzNTogV2FybmluZzouKgotICAgMSAgICAgICAgICAgICAgICAgICAgICAgCS5wc2l6ZSAwCi0gICAyICAgICAgICAgICAgICAgICAgICAgICAJLnRleHQKLSAgIDMgICAgICAgICAgICAgICAgICAgICAgIAkjIHRlc3QgdmFyaW91cyBzZWdtZW50IHJlZyBpbnNucwotICAgNCAwMDAwIDFFICAgICAgICAgICAgICAgIAkJcHVzaAklZHMKLSAgIDUgMDAwMSAxRSAgICAgICAgICAgICAgICAJCXB1c2hsCSVkcwotICAgNiAwMDAyIDFGICAgICAgICAgICAgICAgIAkJcG9wCSVkcwotICAgNyAwMDAzIDFGICAgICAgICAgICAgICAgIAkJcG9wbAklZHMKLSAgIDggMDAwNCA4Q0Q4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVheAotICAgOSAwMDA2IDhDRDggICAgICAgICAgICAgIAkJbW92bAklZHMsJWVheAotICAxMCAwMDA4IDhDRDggICAgICAgICAgICAgIAkJbW92bAklZHMsJWF4Ci0uKldhcm5pbmc6LioKLSAgMTEgMDAwYSA4RUQ4ICAgICAgICAgICAgICAJCW1vdgklZWF4LCVkcwotICAxMiAwMDBjIDhFRDggICAgICAgICAgICAgIAkJbW92bAklYXgsJWRzCi0uKldhcm5pbmc6LioKLSAgMTMgMDAwZSA4RUQ4ICAgICAgICAgICAgICAJCW1vdmwJJWVheCwlZHMKLSAgMTQgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgMTUgMDAxMCA2NjFFICAgICAgICAgICAgICAJCXB1c2h3CSVkcwotICAxNiAwMDEyIDY2MUYgICAgICAgICAgICAgIAkJcG9wdwklZHMKLSAgMTcgMDAxNCA2NjhDRDggICAgICAgICAgICAJCW1vdgklZHMsJWF4Ci0gIDE4IDAwMTcgNjY4Q0Q4ICAgICAgICAgICAgCQltb3Z3CSVkcywlYXgKLSAgMTkgMDAxYSA2NjhDRDggICAgICAgICAgICAJCW1vdncJJWRzLCVlYXgKLS4qV2FybmluZzouKgotICAyMCAwMDFkIDhFRDggICAgICAgICAgICAgIAkJbW92CSVheCwlZHMKLSAgMjEgMDAxZiA4RUQ4ICAgICAgICAgICAgICAJCW1vdncJJWF4LCVkcwotICAyMiAwMDIxIDhFRDggICAgICAgICAgICAgIAkJbW92dwklZWF4LCVkcwotLipXYXJuaW5nOi4qCi0gIDIzICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDI0ICAgICAgICAgICAgICAgICAgICAgICAJIyB0ZXN0IHZhcmlvdXMgcHVzaGVzCi0gIDI1IDAwMjMgNkEwQSAgICAgICAgICAgICAgCQlwdXNobAlcJDEwCi0gIDI2IDAwMjUgNjY2QTBBICAgICAgICAgICAgCQlwdXNodwlcJDEwCi0gIDI3IDAwMjggNkEwQSAgICAgICAgICAgICAgCQlwdXNoCVwkMTAKLSAgMjggMDAyYSA2OEU4MDMwMCAwMCAgICAgICAJCXB1c2hsCVwkMTAwMAotICAyOSAwMDJmIDY2NjhFODAzICAgICAgICAgIAkJcHVzaHcJXCQxMDAwCi0gIDMwIDAwMzMgNjhFODAzMDAgMDAgICAgICAgCQlwdXNoCVwkMTAwMAotICAzMSAwMDM4IEZGMzU1NzAwIDAwMDAgICAgIAkJcHVzaGwJMWYKLSAgMzIgMDAzZSA2NkZGMzU1NyAwMDAwMDAgICAJCXB1c2h3CTFmCi0gIDMzIDAwNDUgRkYzNTU3MDAgMDAwMCAgICAgCQlwdXNoCTFmCi0gIDM0IDAwNGIgRkZCMzBDMDAgMDAwMCAgICAgCQlwdXNoCVwoMWYtLlwpXCglZWJ4XCkKLSAgMzUgMDA1MSBGRjM1MDYwMCAwMDAwICAgICAJCXB1c2gJMWYtLgotICAzNiAgICAgICAgICAgICAgICAgICAgICAgCSMgdGhlc2UsIGFuZCBvdGhlcnMgbGlrZSB0aGVtIHNob3VsZCBoYXZlIG5vIG9wZXJhbmQgc2l6ZSBwcmVmaXgKLSAgMzcgMDA1NyAwRjAwRDEgICAgICAgICAgICAJMToJbGxkdAklY3gKLSAgMzggMDA1YSAwRjAxRjAgICAgICAgICAgICAJCWxtc3cJJWF4Ci0gIDM5ICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDQwICAgICAgICAgICAgICAgICAgICAgICAJIyBKdXN0IHRvIG1ha2Ugc3VyZSB0aGVzZSBkb24ndCBiZWNvbWUgaWxsZWdhbCBkdWUgdG8gb3Zlci1lbnRodXNpYXN0aWMKLSAgNDEgICAgICAgICAgICAgICAgICAgICAgIAkjIHJlZ2lzdGVyIGNoZWNraW5nCi0gIDQyIDAwNWQgNjYwRkJFRjggICAgICAgICAgCQltb3ZzYncJJWFsLCVkaQotICA0MyAwMDYxIDBGQkVDOCAgICAgICAgICAgIAkJbW92c2JsCSVhbCwlZWN4Ci0gIDQ0IDAwNjQgMEZCRkM4ICAgICAgICAgICAgCQltb3Zzd2wJJWF4LCVlY3gKLSAgNDUgMDA2NyA2NjBGQjZGOCAgICAgICAgICAJCW1vdnpidwklYWwsJWRpCi0gIDQ2IDAwNmIgMEZCNkM4ICAgICAgICAgICAgCQltb3Z6YmwJJWFsLCVlY3gKLSAgNDcgMDA2ZSAwRkI3QzggICAgICAgICAgICAJCW1vdnp3bAklYXgsJWVjeAotICA0OCAgICAgICAgICAgICAgICAgICAgICAgCQotICA0OSAwMDcxIEVDICAgICAgICAgICAgICAgIAkJaW4JJWR4LCVhbAotICA1MCAwMDcyIDY2RUQgICAgICAgICAgICAgIAkJaW4JJWR4LCVheAotICA1MSAwMDc0IEVEICAgICAgICAgICAgICAgIAkJaW4JJWR4LCVlYXgKLSAgNTIgMDA3NSBFQyAgICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWFsCi0gIDUzIDAwNzYgNjZFRCAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVheAotICA1NCAwMDc4IEVEICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlZWF4Ci0gIDU1IDAwNzkgRUMgICAgICAgICAgICAgICAgCQlpbmIJJWR4LCVhbAotICA1NiAwMDdhIDY2RUQgICAgICAgICAgICAgIAkJaW53CSVkeCwlYXgKLSAgNTcgMDA3YyBFRCAgICAgICAgICAgICAgICAJCWlubAklZHgsJWVheAotICA1OCAwMDdkIEVDICAgICAgICAgICAgICAgIAkJaW5iCSVkeAotICA1OSAwMDdlIDY2RUQgICAgICAgICAgICAgIAkJaW53CSVkeAotICA2MCAwMDgwIEVEICAgICAgICAgICAgICAgIAkJaW5sCSVkeAotICA2MSAwMDgxIEU0RkYgICAgICAgICAgICAgIAkJaW5iCVwkMjU1Ci0gIDYyIDAwODMgNjZFNTAyICAgICAgICAgICAgCQlpbncJXCQyCi0gIDYzIDAwODYgRTUwNCAgICAgICAgICAgICAgCQlpbmwJXCQ0Ci0gIDY0IDAwODggRUYgICAgICAgICAgICAgICAgCQlvdXRsCSVlYXgsJWR4Ci0gIDY1IDAwODkgRTYyQSAgICAgICAgICAgICAgCQlvdXQJJWFsLCBcJDQyCi0gIDY2IDAwOGIgNjZFNTBEICAgICAgICAgICAgCQlpbglcJDEzLCAlYXgKLSAgNjcgICAgICAgICAgICAgICAgICAgICAgIAkjIFRoZXNlIGFyZSB1c2VkIGluIEFJWC4KLSAgNjggMDA4ZSA2NkVEICAgICAgICAgICAgICAJCWludwlcKCVkeFwpCi0gIDY5IDAwOTAgNjZFRiAgICAgICAgICAgICAgCQlvdXR3CVwoJWR4XCkKLSAgNzAgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgNzEgMDA5MiBBNCAgICAgICAgICAgICAgICAJCW1vdnNiCi0gIDcyIDAwOTMgNjZBNyAgICAgICAgICAgICAgCQljbXBzdwotICA3MyAwMDk1IEFGICAgICAgICAgICAgICAgIAkJc2Nhc2wKLSAgNzQgMDA5NiBENyAgICAgICAgICAgICAgICAJCXhsYXRiCi0gIDc1IDAwOTcgMkVBNSAgICAgICAgICAgICAgCQltb3ZzbAklY3M6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gIDc2IDAwOTkgMEY5MzAzICAgICAgICAgICAgCQlzZXRhZQlcKCVlYnhcKQotICA3NyAwMDljIDBGOTMwMyAgICAgICAgICAgIAkJc2V0YWViCVwoJWVieFwpCi0gIDc4IDAwOWYgMEY5M0MwICAgICAgICAgICAgCQlzZXRhZQklYWwKLSAgNzkgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgODAgICAgICAgICAgICAgICAgICAgICAgIAkjdGhlc2Ugc2hvdWxkIGdpdmUgd2FybmluZ3MKLSAgODEgMDBhMiAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWF4Ci0uKldhcm5pbmc6LioKLSAgODIgMDBhNCAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWVheAotLipXYXJuaW5nOi4qCi0gIDgzIDAwYTYgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVieAotLipXYXJuaW5nOi4qCi0gIDg0IDAwYTkgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVlYngKLS4qV2FybmluZzouKgotICA4NSAwMGFjIEQ5QzEgICAgICAgICAgICAgIAkJZmxkbAklc3RcKDFcKQotLipXYXJuaW5nOi4qCi0gIDg2IDAwYWUgREREMiAgICAgICAgICAgICAgCQlmc3RsCSVzdFwoMlwpCi0uKldhcm5pbmc6LioKLSAgODcgMDBiMCBERERCICAgICAgICAgICAgICAJCWZzdHBsCSVzdFwoM1wpCi0uKldhcm5pbmc6LioKLSAgODggMDBiMiBEOEQ0ICAgICAgICAgICAgICAJCWZjb21sCSVzdFwoNFwpCi0uKldhcm5pbmc6LioKLSAgODkgMDBiNCBEOEREICAgICAgICAgICAgICAJCWZjb21wbAklc3RcKDVcKQotLipXYXJuaW5nOi4qCi0gIDkwIDAwYjYgREVDMSAgICAgICAgICAgICAgCQlmYWRkcAklc3RcKDFcKSwlc3QKLS4qV2FybmluZzouKgotICA5MSAwMGI4IERFQ0EgICAgICAgICAgICAgIAkJZm11bHAJJXN0XCgyXCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTIgMDBiYSBERUUzICAgICAgICAgICAgICAJCWZzdWJwCSVzdFwoM1wpLCVzdAotLipXYXJuaW5nOi4qCi0gIDkzIDAwYmMgREVFQyAgICAgICAgICAgICAgCQlmc3VicnAJJXN0XCg0XCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTQgMDBiZSBERUY1ICAgICAgICAgICAgICAJCWZkaXZwCSVzdFwoNVwpLCVzdAotLipXYXJuaW5nOi4qCi0gIDk1IDAwYzAgREVGRSAgICAgICAgICAgICAgCQlmZGl2cnAJJXN0XCg2XCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTYgMDBjMiBERUMxICAgICAgICAgICAgICAJCWZhZGQKLS4qV2FybmluZzouKgotICA5NyAwMGM0IERFRTEgICAgICAgICAgICAgIAkJZnN1YgotLipXYXJuaW5nOi4qCi0gIDk4IDAwYzYgREVDOSAgICAgICAgICAgICAgCQlmbXVsCi0uKldhcm5pbmc6LioKLSAgOTkgMDBjOCBERUYxICAgICAgICAgICAgICAJCWZkaXYKLS4qV2FybmluZzouKgotIDEwMCAwMGNhIERFRTkgICAgICAgICAgICAgIAkJZnN1YnIKLS4qV2FybmluZzouKgotIDEwMSAwMGNjIERFRjkgICAgICAgICAgICAgIAkJZmRpdnIKLS4qV2FybmluZzouKgotIDEwMiAgICAgICAgICAgICAgICAgICAgICAgCSN0aGVzZSBzaG91bGQgYWxsIGJlIGxlZ2FsCi0gMTAzIDAwY2UgMEZBMzE1NTYgMzQxMjAwICAgCQlidGwJJWVkeCwgMHgxMjM0NTYKLSAxMDQgMDBkNSAwRkEzRDAgICAgICAgICAgICAJCWJ0bAklZWR4LCAlZWF4Ci0gMTA1IDAwZDggMEMwMSAgICAgICAgICAgICAgCQlvcmIJXCQxLCVhbAotIDEwNiAwMGRhIDgwQ0IwMSAgICAgICAgICAgIAkJb3JiCVwkMSwlYmwKLSAxMDcgMDBkZCBBMTExMDAwMCAwMCAgICAgICAJCW1vdmwJMTcsJWVheAotIDEwOCAwMGUyIEExMTEwMDAwIDAwICAgICAgIAkJbW92CTE3LCVlYXgKLSAxMDkgMDBlNyA2NkVEICAgICAgICAgICAgICAJCWludwklZHgsJWF4Ci0gMTEwIDAwZTkgRUQgICAgICAgICAgICAgICAgCQlpbmwJJWR4LCVlYXgKLSAxMTEgMDBlYSA2NkVEICAgICAgICAgICAgICAJCWludwlcKCVkeFwpLCVheAotIDExMiAwMGVjIEVEICAgICAgICAgICAgICAgIAkJaW5sCVwoJWR4XCksJWVheAotIDExMyAwMGVkIEVDICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYWwKLSAxMTQgMDBlZSA2NkVEICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWF4Ci0gMTE1IDAwZjAgRUQgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVlYXgKLSAxMTYgMDBmMSAwRkI2MTQzNyAgICAgICAgICAJCW1vdnpibAlcKCVlZGksJWVzaVwpLCVlZHgKLSAxMTcgMDBmNSAwRkI2NDUxQyAgICAgICAgICAJCW1vdnpibAkyOFwoJWVicFwpLCVlYXgKLSAxMTggMDBmOSAwRkI2QzAgICAgICAgICAgICAJCW1vdnpibAklYWwsJWVheAotIDExOSAwMGZjIDBGQjZGMSAgICAgICAgICAgIAkJbW92emJsCSVjbCwlZXNpCi0gMTIwIDAwZmYgMjZENyAgICAgICAgICAgICAgCQl4bGF0CSVlczpcKCVlYnhcKQotIDEyMSAwMTAxIEQ3ICAgICAgICAgICAgICAgIAkJeGxhdAotIDEyMiAwMTAyIEQ3ICAgICAgICAgICAgICAgIAkJeGxhdGIKLSAxMjMgMDEwMyBEREQ4ICAgICAgICAgICAgICAJMToJZnN0cAklc3RcKDBcKQotIDEyNCAwMTA1IEUyRkMgICAgICAgICAgICAgIAkJbG9vcAkxYgotIDEyNSAwMTA3IEY2RjEgICAgICAgICAgICAgIAkJZGl2YiAgICAlY2wgCi0gMTI2IDAxMDkgNjZGN0YxICAgICAgICAgICAgCQlkaXZ3ICAgICVjeCAKLSAxMjcgMDEwYyBGN0YxICAgICAgICAgICAgICAJCWRpdmwgICAgJWVjeAotIDEyOCAwMTBlIEY2RjEgICAgICAgICAgICAgIAkJZGl2CSVjbAotIDEyOSAwMTEwIDY2RjdGMSAgICAgICAgICAgIAkJZGl2CSVjeAotIDEzMCAwMTEzIEY3RjEgICAgICAgICAgICAgIAkJZGl2CSVlY3gKLSAxMzEgMDExNSBGNkYxICAgICAgICAgICAgICAJCWRpdgklY2wsJWFsCi0gMTMyIDAxMTcgNjZGN0YxICAgICAgICAgICAgCQlkaXYJJWN4LCVheAotIDEzMyAwMTFhIEY3RjEgICAgICAgICAgICAgIAkJZGl2CSVlY3gsJWVheAotIDEzNCAwMTFjIDhFREUgICAgICAgICAgICAgIAkJbW92CSVzaSwlZHMKLSAxMzUgMDExZSA4RURFICAgICAgICAgICAgICAJCW1vdmwJJXNpLCVkcwkJIyB3YXJuaW5nIGhlcmUKLS4qV2FybmluZzouKgotIDEzNiAwMTIwIDFFICAgICAgICAgICAgICAgIAkJcHVzaGwJJWRzCi0gMTM3IDAxMjEgMUUgICAgICAgICAgICAgICAgCQlwdXNoCSVkcwotIDEzOCAwMTIyIEEwMDAwMDAwIDAwICAgICAgIAkJbW92CTAsJWFsCi0gMTM5IDAxMjcgNjZBMTAwMDAgMDEwMCAgICAgCQltb3YJMHgxMDAwMCwlYXgKLSAxNDAgMDEyZCA4OUMzICAgICAgICAgICAgICAJCW1vdgklZWF4LCVlYngKLSAxNDEgMDEyZiA5QyAgICAgICAgICAgICAgICAJCXB1c2hmCi0gMTQyIDAxMzAgOUMgICAgICAgICAgICAgICAgCQlwdXNoZmwKLSAxNDMgMDEzMSA2NjlDICAgICAgICAgICAgICAJCXB1c2hmdwotIDE0NCAwMTMzIDlEICAgICAgICAgICAgICAgIAkJcG9wZgotIDE0NSAwMTM0IDlEICAgICAgICAgICAgICAgIAkJcG9wZmwKLSAxNDYgMDEzNSA2NjlEICAgICAgICAgICAgICAJCXBvcGZ3Ci0gMTQ3IDAxMzcgODkzNDFEMDAgMDAwMDAwICAgCQltb3YJJWVzaSxcKCwlZWJ4LDFcKQotIDE0OCAwMTNlIDgwMjUwMDAwIDAwMDA3RiAgIAkJYW5kYglcJH4weDgwLGZvbwotIDE0OSAgICAgICAgICAgICAgICAgICAgICAgCQotIDE1MCAgICAgICAgICAgICAgICAgICAgICAgCQkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCi0gMTUxIDAxNDUgMDAwMCAgICAgICAgICAgICAgCQkud29yZAkwCi0gMTUyIDAxNDcgMDAgICAgICAgICAgICAgICAgCQkuYnl0ZQkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzNmNDg5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS5wc2l6ZSAwCi0udGV4dAotIyB0ZXN0IHZhcmlvdXMgc2VnbWVudCByZWcgaW5zbnMKLQlwdXNoCSVkcwotCXB1c2hsCSVkcwotCXBvcAklZHMKLQlwb3BsCSVkcwotCW1vdgklZHMsJWVheAotCW1vdmwJJWRzLCVlYXgKLQltb3ZsCSVkcywlYXgKLQltb3YJJWVheCwlZHMKLQltb3ZsCSVheCwlZHMKLQltb3ZsCSVlYXgsJWRzCi0KLQlwdXNodwklZHMKLQlwb3B3CSVkcwotCW1vdgklZHMsJWF4Ci0JbW92dwklZHMsJWF4Ci0JbW92dwklZHMsJWVheAotCW1vdgklYXgsJWRzCi0JbW92dwklYXgsJWRzCi0JbW92dwklZWF4LCVkcwotCi0jIHRlc3QgdmFyaW91cyBwdXNoZXMKLQlwdXNobAkkMTAKLQlwdXNodwkkMTAKLQlwdXNoCSQxMAotCXB1c2hsCSQxMDAwCi0JcHVzaHcJJDEwMDAKLQlwdXNoCSQxMDAwCi0JcHVzaGwJMWYKLQlwdXNodwkxZgotCXB1c2gJMWYKLQlwdXNoCSgxZi0uKSglZWJ4KQotCXB1c2gJMWYtLgotIyB0aGVzZSwgYW5kIG90aGVycyBsaWtlIHRoZW0gc2hvdWxkIGhhdmUgbm8gb3BlcmFuZCBzaXplIHByZWZpeAotMToJbGxkdAklY3gKLQlsbXN3CSVheAotCi0jIEp1c3QgdG8gbWFrZSBzdXJlIHRoZXNlIGRvbid0IGJlY29tZSBpbGxlZ2FsIGR1ZSB0byBvdmVyLWVudGh1c2lhc3RpYwotIyByZWdpc3RlciBjaGVja2luZwotCW1vdnNidwklYWwsJWRpCi0JbW92c2JsCSVhbCwlZWN4Ci0JbW92c3dsCSVheCwlZWN4Ci0JbW92emJ3CSVhbCwlZGkKLQltb3Z6YmwJJWFsLCVlY3gKLQltb3Z6d2wJJWF4LCVlY3gKLQotCWluCSVkeCwlYWwKLQlpbgklZHgsJWF4Ci0JaW4JJWR4LCVlYXgKLQlpbgkoJWR4KSwlYWwKLQlpbgkoJWR4KSwlYXgKLQlpbgkoJWR4KSwlZWF4Ci0JaW5iCSVkeCwlYWwKLQlpbncJJWR4LCVheAotCWlubAklZHgsJWVheAotCWluYgklZHgKLQlpbncJJWR4Ci0JaW5sCSVkeAotCWluYgkkMjU1Ci0JaW53CSQyCi0JaW5sCSQ0Ci0Jb3V0bAklZWF4LCVkeAotCW91dAklYWwsICQ0MgotCWluCSQxMywgJWF4Ci0jIFRoZXNlIGFyZSB1c2VkIGluIEFJWC4KLQlpbncJKCVkeCkKLQlvdXR3CSglZHgpCi0KLQltb3ZzYgotCWNtcHN3Ci0Jc2Nhc2wKLQl4bGF0YgotCW1vdnNsCSVjczooJWVzaSksJWVzOiglZWRpKQotCXNldGFlCSglZWJ4KQotCXNldGFlYgkoJWVieCkKLQlzZXRhZQklYWwKLQotI3RoZXNlIHNob3VsZCBnaXZlIHdhcm5pbmdzCi0Jb3JiCSQxLCVheAotCW9yYgkkMSwlZWF4Ci0Jb3JiCSQxLCVieAotCW9yYgkkMSwlZWJ4Ci0JZmxkbAklc3QoMSkKLQlmc3RsCSVzdCgyKQotCWZzdHBsCSVzdCgzKQotCWZjb21sCSVzdCg0KQotCWZjb21wbAklc3QoNSkKLQlmYWRkcAklc3QoMSksJXN0Ci0JZm11bHAJJXN0KDIpLCVzdAotCWZzdWJwCSVzdCgzKSwlc3QKLQlmc3VicnAJJXN0KDQpLCVzdAotCWZkaXZwCSVzdCg1KSwlc3QKLQlmZGl2cnAJJXN0KDYpLCVzdAotCWZhZGQKLQlmc3ViCi0JZm11bAotCWZkaXYKLQlmc3VicgotCWZkaXZyCi0jdGhlc2Ugc2hvdWxkIGFsbCBiZSBsZWdhbAotCWJ0bAklZWR4LCAweDEyMzQ1NgotCWJ0bAklZWR4LCAlZWF4Ci0Jb3JiCSQxLCVhbAotCW9yYgkkMSwlYmwKLQltb3ZsCTE3LCVlYXgKLQltb3YJMTcsJWVheAotCWludwklZHgsJWF4Ci0JaW5sCSVkeCwlZWF4Ci0JaW53CSglZHgpLCVheAotCWlubAkoJWR4KSwlZWF4Ci0JaW4JKCVkeCksJWFsCi0JaW4JKCVkeCksJWF4Ci0JaW4JKCVkeCksJWVheAotCW1vdnpibAkoJWVkaSwlZXNpKSwlZWR4Ci0JbW92emJsCTI4KCVlYnApLCVlYXgKLQltb3Z6YmwJJWFsLCVlYXgKLQltb3Z6YmwJJWNsLCVlc2kKLQl4bGF0CSVlczooJWVieCkKLQl4bGF0Ci0JeGxhdGIKLTE6CWZzdHAJJXN0KDApCi0JbG9vcAkxYgotCWRpdmIgICAgJWNsIAotCWRpdncgICAgJWN4IAotCWRpdmwgICAgJWVjeAotCWRpdgklY2wKLQlkaXYJJWN4Ci0JZGl2CSVlY3gKLQlkaXYJJWNsLCVhbAotCWRpdgklY3gsJWF4Ci0JZGl2CSVlY3gsJWVheAotCW1vdgklc2ksJWRzCi0JbW92bAklc2ksJWRzCQkjIHdhcm5pbmcgaGVyZQotCXB1c2hsCSVkcwotCXB1c2gJJWRzCi0JbW92CTAsJWFsCi0JbW92CTB4MTAwMDAsJWF4Ci0JbW92CSVlYXgsJWVieAotCXB1c2hmCi0JcHVzaGZsCi0JcHVzaGZ3Ci0JcG9wZgotCXBvcGZsCi0JcG9wZncKLQltb3YJJWVzaSwoLCVlYngsMSkKLQlhbmRiCSR+MHg4MCxmb28KLQotCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLQkud29yZAkwCi0JLmJ5dGUJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pMzg2LmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaTM4Ni5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDQ5ZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pMzg2LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMKLSMgaTM4NiB0ZXN0cwotIwotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gICAgc2V0IHRlc3RuYW1lICJpMzg2ICRuYW1lIgotICAgIHNldCBmaWxlICRzcmNkaXIvJHN1YmRpci8kbmFtZQotICAgIGdhc19ydW4gJHtuYW1lfS5zICRvcHRzICI+JmR1bXAub3V0IgotICAgIGlmIHsgW3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0ubCJdIH0gdGhlbiB7Ci0JZmFpbCAkdGVzdG5hbWUKLQl2ZXJib3NlICJvdXRwdXQgaXMgW2ZpbGVfY29udGVudHMgImR1bXAub3V0Il0iIDIKLQlyZXR1cm4KLSAgICB9Ci0gICAgcGFzcyAkdGVzdG5hbWUKLX0KLQotCi1pZiBbaXN0YXJnZXQgImkqODYtKi0qIl0gdGhlbiB7Ci0KLSAgICBydW5fbGlzdF90ZXN0ICJmbG9hdCIgIi1hbCIKLSAgICBydW5fbGlzdF90ZXN0ICJnZW5lcmFsIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MiIKLSAgICBydW5fbGlzdF90ZXN0ICJpbnZhbCIgIi1hbCIKLSAgICBydW5fbGlzdF90ZXN0ICJtb2RybSIgIi1hbCAtLWxpc3RpbmctbGhzLXdpZHRoPTIiCi0gICAgcnVuX2R1bXBfdGVzdCAib3Bjb2RlIgotICAgIHJ1bl9kdW1wX3Rlc3QgInByZWZpeCIKLSAgICBydW5fZHVtcF90ZXN0ICJhbWQiCi0gICAgcnVuX2R1bXBfdGVzdCAia2F0bWFpIgotCi0gICAgIyBUaGUgcmVsb2MgYW5kIHdoaXRlIHRlc3RzIHJlcXVpcmUgc3VwcG9ydCBmb3IgOCBhbmQgMTYgYml0Ci0gICAgIyByZWxvY3MsIHNvIHdlIG9ubHkgcnVuIHRoZW0gZm9yIEVMRiB0YXJnZXRzLgotICAgIGlmIHtbaXN0YXJnZXQgIiotKi1lbGYqIl0gfHwgW2lzdGFyZ2V0ICIqLSotbGludXgqIl19IHRoZW4gewotCXJ1bl9kdW1wX3Rlc3QgInJlbG9jIgotCXJ1bl9saXN0X3Rlc3QgIndoaXRlIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MyIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODk0OTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjM6IEVycm9yOiAuKgotLio6NDogRXJyb3I6IC4qCi0uKjo1OiBFcnJvcjogLioKLS4qOjY6IEVycm9yOiAuKgotLio6NzogRXJyb3I6IC4qCi0uKjo4OiBFcnJvcjogLioKLS4qOjk6IEVycm9yOiAuKgotLio6MTA6IEVycm9yOiAuKgotLio6MTE6IEVycm9yOiAuKgotLio6MTI6IEVycm9yOiAuKgotLio6MTM6IEVycm9yOiAuKgotLio6MTQ6IEVycm9yOiAuKgotLio6MTU6IEVycm9yOiAuKgotLio6MTY6IEVycm9yOiAuKgotLio6MTc6IEVycm9yOiAuKgotLio6MTg6IEVycm9yOiAuKgotLio6MTk6IEVycm9yOiAuKgotLio6MjA6IEVycm9yOiAuKgotLio6MjE6IEVycm9yOiAuKgotLio6MjI6IEVycm9yOiAuKgotLio6MjM6IEVycm9yOiAuKgotLio6MjQ6IEVycm9yOiAuKgotLio6MjU6IEVycm9yOiAuKgotLio6MjY6IEVycm9yOiAuKgotLio6Mjc6IEVycm9yOiAuKgotLio6Mjg6IEVycm9yOiAuKgotLio6Mjk6IEVycm9yOiAuKgotLio6MzA6IEVycm9yOiAuKgotLio6MzE6IEVycm9yOiAuKgotLio6MzI6IEVycm9yOiAuKgotLio6MzM6IEVycm9yOiAuKgotLio6MzQ6IEVycm9yOiAuKgotLio6MzU6IEVycm9yOiAuKgotLio6MzY6IEVycm9yOiAuKgotLio6Mzc6IEVycm9yOiAuKgotLio6Mzg6IEVycm9yOiAuKgotLio6Mzk6IEVycm9yOiAuKgotLio6NDA6IEVycm9yOiAuKgotLio6NDE6IEVycm9yOiAuKgotLio6NDI6IEVycm9yOiAuKgotLio6NDM6IEVycm9yOiAuKgotLio6NDQ6IEVycm9yOiAuKgotLio6NDU6IEVycm9yOiAuKgotLio6NDY6IEVycm9yOiAuKgotLio6NDc6IEVycm9yOiAuKgotLio6NDg6IEVycm9yOiAuKgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxIFsgCV0qCS50ZXh0Ci0gICAyIFsgCV0qIyBBbGwgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgaWxsZWdhbAotICAgMyBbIAldKgltb3YJXCglZHhcKSwlYWwKLSAgIDQgWyAJXSoJbW92CVwoJWVheCwlZXNwLDJcKSwlYWwKLSAgIDUgWyAJXSoJc2V0YWUJJWVheAotICAgNiBbIAldKglwdXNoYgklZHMKLSAgIDcgWyAJXSoJcG9wYgklZHMKLSAgIDggWyAJXSoJcHVzaGIJJWFsCi0gICA5IFsgCV0qCXBvcGIJJWFsCi0gIDEwIFsgCV0qCXB1c2hiCSVhaAotICAxMSBbIAldKglwb3BiCSVhaAotICAxMiBbIAldKglwdXNoYgklYXgKLSAgMTMgWyAJXSoJcG9wYgklYXgKLSAgMTQgWyAJXSoJcHVzaGIJJWVheAotICAxNSBbIAldKglwb3BiCSVlYXgKLSAgMTYgWyAJXSoJbW92YgklZHMsJWF4Ci0gIDE3IFsgCV0qCW1vdmIJJWRzLCVlYXgKLSAgMTggWyAJXSoJbW92YgklYXgsJWRzCi0gIDE5IFsgCV0qCW1vdmIJJWVheCwlZHMKLSAgMjAgWyAJXSoJbW92ZGIJJWVheCwlbW0wCi0gIDIxIFsgCV0qCW1vdnFiCTAsJW1tMAotICAyMiBbIAldKglsZHNiCTAsJWVheAotICAyMyBbIAldKglzZXRuZXcJMAotICAyNCBbIAldKgltb3ZkdwklZWF4LCVtbTAKLSAgMjUgWyAJXSoJbW92cXcJMCwlbW0wCi0gIDI2IFsgCV0qCWRpdgklY3gsJWFsCi0gIDI3IFsgCV0qCWRpdgklY2wsJWF4Ci0gIDI4IFsgCV0qCWRpdgklZWN4LCVhbAotICAyOSBbIAldKglpbXVsCTEwLCVieCwlZWN4Ci0gIDMwIFsgCV0qCWltdWwJMTAsJWJ4LCVhbAotICAzMSBbIAldKglwb3BhYgotICAzMiBbIAldKglzdGlsCi0gIDMzIFsgCV0qCWFhYWIKLSAgMzQgWyAJXSoJY3dkZWwKLSAgMzUgWyAJXSoJY3dkdwotICAzNiBbIAldKgljYWxsd3cJMAotICAzNyBbIAldKmZvbzoJamF3CWZvbwotICAzOCBbIAldKglqY3h6dwlmb28KLSAgMzkgWyAJXSoJamVjeHpsCWZvbwotICA0MCBbIAldKglsb29wYglmb28KLSAgNDEgWyAJXSoJeGxhdHcJJWVzOiVieAotICA0MiBbIAldKgl4bGF0bAklZXM6JWJ4Ci0gIDQzIFsgCV0qCWludGwJMgotICA0NCBbIAldKglpbnQzYgotICA0NSBbIAldKglobHRiCi0gIDQ2IFsgCV0qCWZzdGIJJXN0XCgwXCkKLSAgNDcgWyAJXSoJZmNvbXBsbAkyOFwoJWVicFwpCi0gIDQ4IFsgCV0qCWZsZGx3CVwoJWVheFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzN2ExOGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotCS50ZXh0Ci0jIEFsbCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBpbGxlZ2FsCi0JbW92CSglZHgpLCVhbAotCW1vdgkoJWVheCwlZXNwLDIpLCVhbAotCXNldGFlCSVlYXgKLQlwdXNoYgklZHMKLQlwb3BiCSVkcwotCXB1c2hiCSVhbAotCXBvcGIJJWFsCi0JcHVzaGIJJWFoCi0JcG9wYgklYWgKLQlwdXNoYgklYXgKLQlwb3BiCSVheAotCXB1c2hiCSVlYXgKLQlwb3BiCSVlYXgKLQltb3ZiCSVkcywlYXgKLQltb3ZiCSVkcywlZWF4Ci0JbW92YgklYXgsJWRzCi0JbW92YgklZWF4LCVkcwotCW1vdmRiCSVlYXgsJW1tMAotCW1vdnFiCTAsJW1tMAotCWxkc2IJMCwlZWF4Ci0Jc2V0bmV3CTAKLQltb3ZkdwklZWF4LCVtbTAKLQltb3ZxdwkwLCVtbTAKLQlkaXYJJWN4LCVhbAotCWRpdgklY2wsJWF4Ci0JZGl2CSVlY3gsJWFsCi0JaW11bAkxMCwlYngsJWVjeAotCWltdWwJMTAsJWJ4LCVhbAotCXBvcGFiCi0Jc3RpbAotCWFhYWIKLQljd2RlbAotCWN3ZHcKLQljYWxsd3cJMAotZm9vOglqYXcJZm9vCi0JamN4encJZm9vCi0JamVjeHpsCWZvbwotCWxvb3BiCWZvbwotCXhsYXR3CSVlczolYngKLQl4bGF0bAklZXM6JWJ4Ci0JaW50bAkyCi0JaW50M2IKLQlobHRiCi0JZnN0Ygklc3QoMCkKLQlmY29tcGxsCTI4KCVlYnApCi0JZmxkbHcJKCVlYXgpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxNTQ5OGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkuZAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBrYXRtYWkKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTBmIDU4IDAxIFsgCV0qYWRkcHMgIFwoJWVjeFwpLCV4bW0wCi0gICAzOgkwZiA1OCBjYSBbIAldKmFkZHBzICAleG1tMiwleG1tMQotICAgNjoJZjMgMGYgNTggMTMgWyAJXSphZGRzcyAgXCglZWJ4XCksJXhtbTIKLSAgIGE6CWYzIDBmIDU4IGRjIFsgCV0qYWRkc3MgICV4bW00LCV4bW0zCi0gICBlOgkwZiA1NSA2NSAwMCBbIAldKmFuZG5wcyAweDBcKCVlYnBcKSwleG1tNAotICAxMjoJMGYgNTUgZWUgWyAJXSphbmRucHMgJXhtbTYsJXhtbTUKLSAgMTU6CTBmIDU0IDM3IFsgCV0qYW5kcHMgIFwoJWVkaVwpLCV4bW02Ci0gIDE4OgkwZiA1NCBmOCBbIAldKmFuZHBzICAleG1tMCwleG1tNwotICAxYjoJMGYgYzIgYzEgMDIgWyAJXSpjbXBsZXBzICV4bW0xLCV4bW0wCi0gIDFmOgkwZiBjMiAwYSAwMyBbIAldKmNtcHVub3JkcHMgXCglZWR4XCksJXhtbTEKLSAgMjM6CWYzIDBmIGMyIGQyIDA0IFsgCV0qY21wbmVxc3MgJXhtbTIsJXhtbTIKLSAgMjg6CWYzIDBmIGMyIDFjIDI0IDA1IFsgCV0qY21wbmx0c3MgXCglZXNwLDFcKSwleG1tMwotICAyZToJMGYgYzIgZTUgMDYgWyAJXSpjbXBubGVwcyAleG1tNSwleG1tNAotICAzMjoJMGYgYzIgMmUgMDcgWyAJXSpjbXBvcmRwcyBcKCVlc2lcKSwleG1tNQotICAzNjoJZjMgMGYgYzIgZjcgMDAgWyAJXSpjbXBlcXNzICV4bW03LCV4bW02Ci0gIDNiOglmMyAwZiBjMiAzOCAwMSBbIAldKmNtcGx0c3MgXCglZWF4XCksJXhtbTcKLSAgNDA6CTBmIGMyIGMxIDAwIFsgCV0qY21wZXFwcyAleG1tMSwleG1tMAotICA0NDoJMGYgYzIgMGEgMDAgWyAJXSpjbXBlcXBzIFwoJWVkeFwpLCV4bW0xCi0gIDQ4OglmMyAwZiBjMiBkMiAwMCBbIAldKmNtcGVxc3MgJXhtbTIsJXhtbTIKLSAgNGQ6CWYzIDBmIGMyIDFjIDI0IDAwIFsgCV0qY21wZXFzcyBcKCVlc3AsMVwpLCV4bW0zCi0gIDUzOgkwZiBjMiBlNSAwMSBbIAldKmNtcGx0cHMgJXhtbTUsJXhtbTQKLSAgNTc6CTBmIGMyIDJlIDAxIFsgCV0qY21wbHRwcyBcKCVlc2lcKSwleG1tNQotICA1YjoJZjMgMGYgYzIgZjcgMDEgWyAJXSpjbXBsdHNzICV4bW03LCV4bW02Ci0gIDYwOglmMyAwZiBjMiAzOCAwMSBbIAldKmNtcGx0c3MgXCglZWF4XCksJXhtbTcKLSAgNjU6CTBmIGMyIDAxIDAyIFsgCV0qY21wbGVwcyBcKCVlY3hcKSwleG1tMAotICA2OToJMGYgYzIgY2EgMDIgWyAJXSpjbXBsZXBzICV4bW0yLCV4bW0xCi0gIDZkOglmMyAwZiBjMiAxMyAwMiBbIAldKmNtcGxlc3MgXCglZWJ4XCksJXhtbTIKLSAgNzI6CWYzIDBmIGMyIGRjIDAyIFsgCV0qY21wbGVzcyAleG1tNCwleG1tMwotICA3NzoJMGYgYzIgNjUgMDAgMDMgWyAJXSpjbXB1bm9yZHBzIDB4MFwoJWVicFwpLCV4bW00Ci0gIDdjOgkwZiBjMiBlZSAwMyBbIAldKmNtcHVub3JkcHMgJXhtbTYsJXhtbTUKLSAgODA6CWYzIDBmIGMyIDM3IDAzIFsgCV0qY21wdW5vcmRzcyBcKCVlZGlcKSwleG1tNgotICA4NToJZjMgMGYgYzIgZjggMDMgWyAJXSpjbXB1bm9yZHNzICV4bW0wLCV4bW03Ci0gIDhhOgkwZiBjMiBjMSAwNCBbIAldKmNtcG5lcXBzICV4bW0xLCV4bW0wCi0gIDhlOgkwZiBjMiAwYSAwNCBbIAldKmNtcG5lcXBzIFwoJWVkeFwpLCV4bW0xCi0gIDkyOglmMyAwZiBjMiBkMiAwNCBbIAldKmNtcG5lcXNzICV4bW0yLCV4bW0yCi0gIDk3OglmMyAwZiBjMiAxYyAyNCAwNCBbIAldKmNtcG5lcXNzIFwoJWVzcCwxXCksJXhtbTMKLSAgOWQ6CTBmIGMyIGU1IDA1IFsgCV0qY21wbmx0cHMgJXhtbTUsJXhtbTQKLSAgYTE6CTBmIGMyIDJlIDA1IFsgCV0qY21wbmx0cHMgXCglZXNpXCksJXhtbTUKLSAgYTU6CWYzIDBmIGMyIGY3IDA1IFsgCV0qY21wbmx0c3MgJXhtbTcsJXhtbTYKLSAgYWE6CWYzIDBmIGMyIDM4IDA1IFsgCV0qY21wbmx0c3MgXCglZWF4XCksJXhtbTcKLSAgYWY6CTBmIGMyIDAxIDA2IFsgCV0qY21wbmxlcHMgXCglZWN4XCksJXhtbTAKLSAgYjM6CTBmIGMyIGNhIDA2IFsgCV0qY21wbmxlcHMgJXhtbTIsJXhtbTEKLSAgYjc6CWYzIDBmIGMyIDEzIDA2IFsgCV0qY21wbmxlc3MgXCglZWJ4XCksJXhtbTIKLSAgYmM6CWYzIDBmIGMyIGRjIDA2IFsgCV0qY21wbmxlc3MgJXhtbTQsJXhtbTMKLSAgYzE6CTBmIGMyIDY1IDAwIDA3IFsgCV0qY21wb3JkcHMgMHgwXCglZWJwXCksJXhtbTQKLSAgYzY6CTBmIGMyIGVlIDA3IFsgCV0qY21wb3JkcHMgJXhtbTYsJXhtbTUKLSAgY2E6CWYzIDBmIGMyIDM3IDA3IFsgCV0qY21wb3Jkc3MgXCglZWRpXCksJXhtbTYKLSAgY2Y6CWYzIDBmIGMyIGY4IDA3IFsgCV0qY21wb3Jkc3MgJXhtbTAsJXhtbTcKLSAgZDQ6CTBmIDJmIGMxIFsgCV0qY29taXNzICV4bW0xLCV4bW0wCi0gIGQ3OgkwZiAyZiAwYSBbIAldKmNvbWlzcyBcKCVlZHhcKSwleG1tMQotICBkYToJMGYgMmEgZDMgWyAJXSpjdnRwaTJwcyAlbW0zLCV4bW0yCi0gIGRkOgkwZiAyYSAxYyAyNCBbIAldKmN2dHBpMnBzIFwoJWVzcCwxXCksJXhtbTMKLSAgZTE6CWYzIDBmIDJhIGU1IFsgCV0qY3Z0c2kyc3MgJWVicCwleG1tNAotICBlNToJZjMgMGYgMmEgMmUgWyAJXSpjdnRzaTJzcyBcKCVlc2lcKSwleG1tNQotICBlOToJMGYgMmQgZjcgWyAJXSpjdnRwczJwaSAleG1tNywlbW02Ci0gIGVjOgkwZiAyZCAzOCBbIAldKmN2dHBzMnBpIFwoJWVheFwpLCVtbTcKLSAgZWY6CWYzIDBmIDJkIDAxIFsgCV0qY3Z0c3Myc2kgXCglZWN4XCksJWVheAotICBmMzoJZjMgMGYgMmQgY2EgWyAJXSpjdnRzczJzaSAleG1tMiwlZWN4Ci0gIGY3OgkwZiAyYyAxMyBbIAldKmN2dHRwczJwaSBcKCVlYnhcKSwlbW0yCi0gIGZhOgkwZiAyYyBkYyBbIAldKmN2dHRwczJwaSAleG1tNCwlbW0zCi0gIGZkOglmMyAwZiAyYyA2NSAwMCBbIAldKmN2dHRzczJzaSAweDBcKCVlYnBcKSwlZXNwCi0gMTAyOglmMyAwZiAyYyBlZSBbIAldKmN2dHRzczJzaSAleG1tNiwlZWJwCi0gMTA2OgkwZiA1ZSBjMSBbIAldKmRpdnBzICAleG1tMSwleG1tMAotIDEwOToJMGYgNWUgMGEgWyAJXSpkaXZwcyAgXCglZWR4XCksJXhtbTEKLSAxMGM6CWYzIDBmIDVlIGQzIFsgCV0qZGl2c3MgICV4bW0zLCV4bW0yCi0gMTEwOglmMyAwZiA1ZSAxYyAyNCBbIAldKmRpdnNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTE1OgkwZiBhZSA1NSAwMCBbIAldKmxkbXhjc3IgMHgwXCglZWJwXCkKLSAxMTk6CTBmIGFlIDFlIFsgCV0qc3RteGNzciBcKCVlc2lcKQotIDExYzoJMGYgYWUgZjggWyAJXSpzZmVuY2UgCi0gMTFmOgkwZiA1ZiBjMSBbIAldKm1heHBzICAleG1tMSwleG1tMAotIDEyMjoJMGYgNWYgMGEgWyAJXSptYXhwcyAgXCglZWR4XCksJXhtbTEKLSAxMjU6CWYzIDBmIDVmIGQzIFsgCV0qbWF4c3MgICV4bW0zLCV4bW0yCi0gMTI5OglmMyAwZiA1ZiAxYyAyNCBbIAldKm1heHNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTJlOgkwZiA1ZCBlNSBbIAldKm1pbnBzICAleG1tNSwleG1tNAotIDEzMToJMGYgNWQgMmUgWyAJXSptaW5wcyAgXCglZXNpXCksJXhtbTUKLSAxMzQ6CWYzIDBmIDVkIGY3IFsgCV0qbWluc3MgICV4bW03LCV4bW02Ci0gMTM4OglmMyAwZiA1ZCAzOCBbIAldKm1pbnNzICBcKCVlYXhcKSwleG1tNwotIDEzYzoJMGYgMjggYzEgWyAJXSptb3ZhcHMgJXhtbTEsJXhtbTAKLSAxM2Y6CTBmIDI5IDExIFsgCV0qbW92YXBzICV4bW0yLFwoJWVjeFwpCi0gMTQyOgkwZiAyOCAxMiBbIAldKm1vdmFwcyBcKCVlZHhcKSwleG1tMgotIDE0NToJMGYgMTYgZGMgWyAJXSptb3ZsaHBzICV4bW00LCV4bW0zCi0gMTQ4OgkwZiAxNyAyYyAyNCBbIAldKm1vdmhwcyAleG1tNSxcKCVlc3AsMVwpCi0gMTRjOgkwZiAxNiAyZSBbIAldKm1vdmhwcyBcKCVlc2lcKSwleG1tNQotIDE0ZjoJMGYgMTIgZjcgWyAJXSptb3ZobHBzICV4bW03LCV4bW02Ci0gMTUyOgkwZiAxMyAwNyBbIAldKm1vdmxwcyAleG1tMCxcKCVlZGlcKQotIDE1NToJMGYgMTIgMDAgWyAJXSptb3ZscHMgXCglZWF4XCksJXhtbTAKLSAxNTg6CTBmIDUwIGNhIFsgCV0qbW92bXNrcHMgJXhtbTIsJWVjeAotIDE1YjoJMGYgMTAgZDMgWyAJXSptb3Z1cHMgJXhtbTMsJXhtbTIKLSAxNWU6CTBmIDExIDIyIFsgCV0qbW92dXBzICV4bW00LFwoJWVkeFwpCi0gMTYxOgkwZiAxMCA2NSAwMCBbIAldKm1vdnVwcyAweDBcKCVlYnBcKSwleG1tNAotIDE2NToJZjMgMGYgMTAgZWUgWyAJXSptb3ZzcyAgJXhtbTYsJXhtbTUKLSAxNjk6CWYzIDBmIDExIDNlIFsgCV0qbW92c3MgICV4bW03LFwoJWVzaVwpCi0gMTZkOglmMyAwZiAxMCAzOCBbIAldKm1vdnNzICBcKCVlYXhcKSwleG1tNwotIDE3MToJMGYgNTkgYzEgWyAJXSptdWxwcyAgJXhtbTEsJXhtbTAKLSAxNzQ6CTBmIDU5IDBhIFsgCV0qbXVscHMgIFwoJWVkeFwpLCV4bW0xCi0gMTc3OglmMyAwZiA1OSBkMiBbIAldKm11bHNzICAleG1tMiwleG1tMgotIDE3YjoJZjMgMGYgNTkgMWMgMjQgWyAJXSptdWxzcyAgXCglZXNwLDFcKSwleG1tMwotIDE4MDoJMGYgNTYgZTUgWyAJXSpvcnBzICAgJXhtbTUsJXhtbTQKLSAxODM6CTBmIDU2IDJlIFsgCV0qb3JwcyAgIFwoJWVzaVwpLCV4bW01Ci0gMTg2OgkwZiA1MyBmNyBbIAldKnJjcHBzICAleG1tNywleG1tNgotIDE4OToJMGYgNTMgMzggWyAJXSpyY3BwcyAgXCglZWF4XCksJXhtbTcKLSAxOGM6CWYzIDBmIDUzIDAxIFsgCV0qcmNwc3MgIFwoJWVjeFwpLCV4bW0wCi0gMTkwOglmMyAwZiA1MyBjYSBbIAldKnJjcHNzICAleG1tMiwleG1tMQotIDE5NDoJMGYgNTIgMTMgWyAJXSpyc3FydHBzIFwoJWVieFwpLCV4bW0yCi0gMTk3OgkwZiA1MiBkYyBbIAldKnJzcXJ0cHMgJXhtbTQsJXhtbTMKLSAxOWE6CWYzIDBmIDUyIDY1IDAwIFsgCV0qcnNxcnRzcyAweDBcKCVlYnBcKSwleG1tNAotIDE5ZjoJZjMgMGYgNTIgZWUgWyAJXSpyc3FydHNzICV4bW02LCV4bW01Ci0gMWEzOgkwZiBjNiAzNyAwMiBbIAldKnNodWZwcyBcJDB4MixcKCVlZGlcKSwleG1tNgotIDFhNzoJMGYgYzYgZjggMDMgWyAJXSpzaHVmcHMgXCQweDMsJXhtbTAsJXhtbTcKLSAxYWI6CTBmIDUxIGMxIFsgCV0qc3FydHBzICV4bW0xLCV4bW0wCi0gMWFlOgkwZiA1MSAwYSBbIAldKnNxcnRwcyBcKCVlZHhcKSwleG1tMQotIDFiMToJZjMgMGYgNTEgZDIgWyAJXSpzcXJ0c3MgJXhtbTIsJXhtbTIKLSAxYjU6CWYzIDBmIDUxIDFjIDI0IFsgCV0qc3FydHNzIFwoJWVzcCwxXCksJXhtbTMKLSAxYmE6CTBmIDVjIGU1IFsgCV0qc3VicHMgICV4bW01LCV4bW00Ci0gMWJkOgkwZiA1YyAyZSBbIAldKnN1YnBzICBcKCVlc2lcKSwleG1tNQotIDFjMDoJZjMgMGYgNWMgZjcgWyAJXSpzdWJzcyAgJXhtbTcsJXhtbTYKLSAxYzQ6CWYzIDBmIDVjIDM4IFsgCV0qc3Vic3MgIFwoJWVheFwpLCV4bW03Ci0gMWM4OgkwZiAyZSAwMSBbIAldKnVjb21pc3MgXCglZWN4XCksJXhtbTAKLSAxY2I6CTBmIDJlIGNhIFsgCV0qdWNvbWlzcyAleG1tMiwleG1tMQotIDFjZToJMGYgMTUgMTMgWyAJXSp1bnBja2hwcyBcKCVlYnhcKSwleG1tMgotIDFkMToJMGYgMTUgZGMgWyAJXSp1bnBja2hwcyAleG1tNCwleG1tMwotIDFkNDoJMGYgMTQgNjUgMDAgWyAJXSp1bnBja2xwcyAweDBcKCVlYnBcKSwleG1tNAotIDFkODoJMGYgMTQgZWUgWyAJXSp1bnBja2xwcyAleG1tNiwleG1tNQotIDFkYjoJMGYgNTcgMzcgWyAJXSp4b3JwcyAgXCglZWRpXCksJXhtbTYKLSAxZGU6CTBmIDU3IGY4IFsgCV0qeG9ycHMgICV4bW0wLCV4bW03Ci0gMWUxOgkwZiBlMCBjMSBbIAldKnBhdmdiICAlbW0xLCVtbTAKLSAxZTQ6CTBmIGUwIDBhIFsgCV0qcGF2Z2IgIFwoJWVkeFwpLCVtbTEKLSAxZTc6CTBmIGUzIGQzIFsgCV0qcGF2Z3cgICVtbTMsJW1tMgotIDFlYToJMGYgZTMgMWMgMjQgWyAJXSpwYXZndyAgXCglZXNwLDFcKSwlbW0zCi0gMWVlOgkwZiBjNSBjOCAwMCBbIAldKnBleHRydyBcJDB4MCwlbW0xLCVlYXgKLSAxZjI6CTBmIGM0IDA5IDAxIFsgCV0qcGluc3J3IFwkMHgxLFwoJWVjeFwpLCVtbTEKLSAxZjY6CTBmIGM0IGQyIDAyIFsgCV0qcGluc3J3IFwkMHgyLCVlZHgsJW1tMgotIDFmYToJMGYgZWUgYzEgWyAJXSpwbWF4c3cgJW1tMSwlbW0wCi0gMWZkOgkwZiBlZSAwYSBbIAldKnBtYXhzdyBcKCVlZHhcKSwlbW0xCi0gMjAwOgkwZiBkZSBkMiBbIAldKnBtYXh1YiAlbW0yLCVtbTIKLSAyMDM6CTBmIGRlIDFjIDI0IFsgCV0qcG1heHViIFwoJWVzcCwxXCksJW1tMwotIDIwNzoJMGYgZWEgZTUgWyAJXSpwbWluc3cgJW1tNSwlbW00Ci0gMjBhOgkwZiBlYSAyZSBbIAldKnBtaW5zdyBcKCVlc2lcKSwlbW01Ci0gMjBkOgkwZiBkYSBmNyBbIAldKnBtaW51YiAlbW03LCVtbTYKLSAyMTA6CTBmIGRhIDM4IFsgCV0qcG1pbnViIFwoJWVheFwpLCVtbTcKLSAyMTM6CTBmIGQ3IGU4IFsgCV0qcG1vdm1za2IgJW1tNSwlZWF4Ci0gMjE2OgkwZiBlNCBlNSBbIAldKnBtdWxodXcgJW1tNSwlbW00Ci0gMjE5OgkwZiBlNCAyZSBbIAldKnBtdWxodXcgXCglZXNpXCksJW1tNQotIDIxYzoJMGYgZjYgZjcgWyAJXSpwc2FkYncgJW1tNywlbW02Ci0gMjFmOgkwZiBmNiAzOCBbIAldKnBzYWRidyBcKCVlYXhcKSwlbW03Ci0gMjIyOgkwZiA3MCBkYSAwMSBbIAldKnBzaHVmdyBcJDB4MSwlbW0yLCVtbTMKLSAyMjY6CTBmIDcwIDc1IDAwIDA0IFsgCV0qcHNodWZ3IFwkMHg0LDB4MFwoJWVicFwpLCVtbTYKLSAyMmI6CTBmIGY3IGM3IFsgCV0qbWFza21vdnEgJW1tNywlbW0wCi0gMjJlOgkwZiAyYiAzMyBbIAldKm1vdm50cHMgJXhtbTYsXCglZWJ4XCkKLSAyMzE6CTBmIGU3IDEwIFsgCV0qbW92bnRxICVtbTIsXCglZWF4XCkKLSAyMzQ6CTBmIDE4IDA2IFsgCV0qcHJlZmV0Y2hudGEgXCglZXNpXCkKLSAyMzc6CTBmIDE4IDBjIDk4IFsgCV0qcHJlZmV0Y2h0MCBcKCVlYXgsJWVieCw0XCkKLSAyM2I6CTBmIDE4IDEyIFsgCV0qcHJlZmV0Y2h0MSBcKCVlZHhcKQotIDIzZToJMGYgMTggMTkgWyAJXSpwcmVmZXRjaHQyIFwoJWVjeFwpCi0gMjQxOgkyZSAwZiBbIAldKlwoYmFkXCkgIAotIDI0MzoJYzIgMGEgMDggWyAJXSpyZXQgICAgXCQweDgwYQotIDI0NjoJOTAgWyAJXSpub3AgICAgCi0gMjQ3Ogk5MCBbIAldKm5vcCAgICAKLSAyNDg6CTY1IFsgCV0qZ3MKLSAyNDk6CTBmIFsgCV0qc2ZlbmNlLipcKGJhZFwpLioKLSAyNGE6CWFlIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlYWwKLSAyNGI6CWZmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY2FsbCAgIFwqMHg5MDkwOTA5MFwoJWVheFwpCi0gMjUxOgk5MCBbIAldKm5vcCAgICAKLSAyNTI6CTkwIFsgCV0qbm9wICAgIAotIDI1MzoJOTAgWyAJXSpub3AgICAgCi0gMjU0Ogk5MCBbIAldKm5vcCAgICAKLSAyNTU6CTkwIFsgCV0qbm9wICAgIAotIDI1NjoJOTAgWyAJXSpub3AgICAgCi0gMjU3Ogk5MCBbIAldKm5vcCAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJhNzRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotI1BJSUkgU0lNRCBpbnN0cnVjdGlvbnMKLQotLnRleHQKLWZvbzoKLSBhZGRwcwkJKCVlY3gpLCV4bW0wCi0gYWRkcHMJCSV4bW0yLCV4bW0xCi0gYWRkc3MJCSglZWJ4KSwleG1tMgotIGFkZHNzCQkleG1tNCwleG1tMwotIGFuZG5wcwkJMHgwKCVlYnApLCV4bW00Ci0gYW5kbnBzCQkleG1tNiwleG1tNQotIGFuZHBzCQkoJWVkaSksJXhtbTYKLSBhbmRwcwkJJXhtbTAsJXhtbTcKLSBjbXBwcwkJJDB4MiwleG1tMSwleG1tMAotIGNtcHBzCQkkMHgzLCglZWR4KSwleG1tMQotIGNtcHNzCQkkMHg0LCV4bW0yLCV4bW0yCi0gY21wc3MJCSQweDUsKCVlc3AsMSksJXhtbTMKLSBjbXBwcwkJJDB4NiwleG1tNSwleG1tNAotIGNtcHBzCQkkMHg3LCglZXNpKSwleG1tNQotIGNtcHNzCQkkMHgwLCV4bW03LCV4bW02Ci0gY21wc3MJCSQweDEsKCVlYXgpLCV4bW03Ci0gY21wZXFwcwkleG1tMSwleG1tMAotIGNtcGVxcHMJKCVlZHgpLCV4bW0xCi0gY21wZXFzcwkleG1tMiwleG1tMgotIGNtcGVxc3MJKCVlc3AsMSksJXhtbTMKLSBjbXBsdHBzCSV4bW01LCV4bW00Ci0gY21wbHRwcwkoJWVzaSksJXhtbTUKLSBjbXBsdHNzCSV4bW03LCV4bW02Ci0gY21wbHRzcwkoJWVheCksJXhtbTcKLSBjbXBsZXBzCSglZWN4KSwleG1tMAotIGNtcGxlcHMJJXhtbTIsJXhtbTEKLSBjbXBsZXNzCSglZWJ4KSwleG1tMgotIGNtcGxlc3MJJXhtbTQsJXhtbTMKLSBjbXB1bm9yZHBzCTB4MCglZWJwKSwleG1tNAotIGNtcHVub3JkcHMJJXhtbTYsJXhtbTUKLSBjbXB1bm9yZHNzCSglZWRpKSwleG1tNgotIGNtcHVub3Jkc3MJJXhtbTAsJXhtbTcKLSBjbXBuZXFwcwkleG1tMSwleG1tMAotIGNtcG5lcXBzCSglZWR4KSwleG1tMQotIGNtcG5lcXNzCSV4bW0yLCV4bW0yCi0gY21wbmVxc3MJKCVlc3AsMSksJXhtbTMKLSBjbXBubHRwcwkleG1tNSwleG1tNAotIGNtcG5sdHBzCSglZXNpKSwleG1tNQotIGNtcG5sdHNzCSV4bW03LCV4bW02Ci0gY21wbmx0c3MJKCVlYXgpLCV4bW03Ci0gY21wbmxlcHMJKCVlY3gpLCV4bW0wCi0gY21wbmxlcHMJJXhtbTIsJXhtbTEKLSBjbXBubGVzcwkoJWVieCksJXhtbTIKLSBjbXBubGVzcwkleG1tNCwleG1tMwotIGNtcG9yZHBzCTB4MCglZWJwKSwleG1tNAotIGNtcG9yZHBzCSV4bW02LCV4bW01Ci0gY21wb3Jkc3MJKCVlZGkpLCV4bW02Ci0gY21wb3Jkc3MJJXhtbTAsJXhtbTcKLSBjb21pc3MJCSV4bW0xLCV4bW0wCi0gY29taXNzCQkoJWVkeCksJXhtbTEKLSBjdnRwaTJwcwklbW0zLCV4bW0yCi0gY3Z0cGkycHMJKCVlc3AsMSksJXhtbTMKLSBjdnRzaTJzcwklZWJwLCV4bW00Ci0gY3Z0c2kyc3MJKCVlc2kpLCV4bW01Ci0gY3Z0cHMycGkJJXhtbTcsJW1tNgotIGN2dHBzMnBpCSglZWF4KSwlbW03Ci0gY3Z0c3Myc2kJKCVlY3gpLCVlYXgKLSBjdnRzczJzaQkleG1tMiwlZWN4Ci0gY3Z0dHBzMnBpCSglZWJ4KSwlbW0yCi0gY3Z0dHBzMnBpCSV4bW00LCVtbTMKLSBjdnR0c3Myc2kJMHgwKCVlYnApLCVlc3AKLSBjdnR0c3Myc2kJJXhtbTYsJWVicAotIGRpdnBzCQkleG1tMSwleG1tMAotIGRpdnBzCQkoJWVkeCksJXhtbTEKLSBkaXZzcwkJJXhtbTMsJXhtbTIKLSBkaXZzcwkJKCVlc3AsMSksJXhtbTMKLSBsZG14Y3NyCTB4MCglZWJwKQotIHN0bXhjc3IJKCVlc2kpCi0gc2ZlbmNlCi0gbWF4cHMJCSV4bW0xLCV4bW0wCi0gbWF4cHMJCSglZWR4KSwleG1tMQotIG1heHNzCQkleG1tMywleG1tMgotIG1heHNzCQkoJWVzcCwxKSwleG1tMwotIG1pbnBzCQkleG1tNSwleG1tNAotIG1pbnBzCQkoJWVzaSksJXhtbTUKLSBtaW5zcwkJJXhtbTcsJXhtbTYKLSBtaW5zcwkJKCVlYXgpLCV4bW03Ci0gbW92YXBzCQkleG1tMSwleG1tMAotIG1vdmFwcwkJJXhtbTIsKCVlY3gpCi0gbW92YXBzCQkoJWVkeCksJXhtbTIKLSBtb3ZsaHBzCSV4bW00LCV4bW0zCi0gbW92aHBzCQkleG1tNSwoJWVzcCwxKQotIG1vdmhwcwkJKCVlc2kpLCV4bW01Ci0gbW92aGxwcwkleG1tNywleG1tNgotIG1vdmxwcwkJJXhtbTAsKCVlZGkpCi0gbW92bHBzCQkoJWVheCksJXhtbTAKLSBtb3Ztc2twcwkleG1tMiwlZWN4Ci0gbW92dXBzCQkleG1tMywleG1tMgotIG1vdnVwcwkJJXhtbTQsKCVlZHgpCi0gbW92dXBzCQkweDAoJWVicCksJXhtbTQKLSBtb3ZzcwkJJXhtbTYsJXhtbTUKLSBtb3ZzcwkJJXhtbTcsKCVlc2kpCi0gbW92c3MJCSglZWF4KSwleG1tNwotIG11bHBzCQkleG1tMSwleG1tMAotIG11bHBzCQkoJWVkeCksJXhtbTEKLSBtdWxzcwkJJXhtbTIsJXhtbTIKLSBtdWxzcwkJKCVlc3AsMSksJXhtbTMKLSBvcnBzCQkleG1tNSwleG1tNAotIG9ycHMJCSglZXNpKSwleG1tNQotIHJjcHBzCQkleG1tNywleG1tNgotIHJjcHBzCQkoJWVheCksJXhtbTcKLSByY3BzcwkJKCVlY3gpLCV4bW0wCi0gcmNwc3MJCSV4bW0yLCV4bW0xCi0gcnNxcnRwcwkoJWVieCksJXhtbTIKLSByc3FydHBzCSV4bW00LCV4bW0zCi0gcnNxcnRzcwkweDAoJWVicCksJXhtbTQKLSByc3FydHNzCSV4bW02LCV4bW01Ci0gc2h1ZnBzCQkkMHgyLCglZWRpKSwleG1tNgotIHNodWZwcwkJJDB4MywleG1tMCwleG1tNwotIHNxcnRwcwkJJXhtbTEsJXhtbTAKLSBzcXJ0cHMJCSglZWR4KSwleG1tMQotIHNxcnRzcwkJJXhtbTIsJXhtbTIKLSBzcXJ0c3MJCSglZXNwLDEpLCV4bW0zCi0gc3VicHMJCSV4bW01LCV4bW00Ci0gc3VicHMJCSglZXNpKSwleG1tNQotIHN1YnNzCQkleG1tNywleG1tNgotIHN1YnNzCQkoJWVheCksJXhtbTcKLSB1Y29taXNzCSglZWN4KSwleG1tMAotIHVjb21pc3MJJXhtbTIsJXhtbTEKLSB1bnBja2hwcwkoJWVieCksJXhtbTIKLSB1bnBja2hwcwkleG1tNCwleG1tMwotIHVucGNrbHBzCTB4MCglZWJwKSwleG1tNAotIHVucGNrbHBzCSV4bW02LCV4bW01Ci0geG9ycHMJCSglZWRpKSwleG1tNgotIHhvcnBzCQkleG1tMCwleG1tNwotIHBhdmdiCQklbW0xLCVtbTAKLSBwYXZnYgkJKCVlZHgpLCVtbTEKLSBwYXZndwkJJW1tMywlbW0yCi0gcGF2Z3cJCSglZXNwLDEpLCVtbTMKLSBwZXh0cncJCSQweDAsJW1tMSwlZWF4Ci0gcGluc3J3CQkkMHgxLCglZWN4KSwlbW0xCi0gcGluc3J3CQkkMHgyLCVlZHgsJW1tMgotIHBtYXhzdwkJJW1tMSwlbW0wCi0gcG1heHN3CQkoJWVkeCksJW1tMQotIHBtYXh1YgkJJW1tMiwlbW0yCi0gcG1heHViCQkoJWVzcCwxKSwlbW0zCi0gcG1pbnN3CQklbW01LCVtbTQKLSBwbWluc3cJCSglZXNpKSwlbW01Ci0gcG1pbnViCQklbW03LCVtbTYKLSBwbWludWIJCSglZWF4KSwlbW03Ci0gcG1vdm1za2IJJW1tNSwlZWF4Ci0gcG11bGh1dwklbW01LCVtbTQKLSBwbXVsaHV3CSglZXNpKSwlbW01Ci0gcHNhZGJ3CQklbW03LCVtbTYKLSBwc2FkYncJCSglZWF4KSwlbW03Ci0gcHNodWZ3CQkkMHgxLCVtbTIsJW1tMwotIHBzaHVmdwkJJDB4NCwweDAoJWVicCksJW1tNgotIG1hc2ttb3ZxCSVtbTcsJW1tMAotIG1vdm50cHMJJXhtbTYsKCVlYngpCi0gbW92bnRxCQklbW0yLCglZWF4KQotIHByZWZldGNobnRhCSglZXNpKQotIHByZWZldGNodDAJKCVlYXgsJWVieCw0KQotIHByZWZldGNodDEJKCVlZHgpCi0gcHJlZmV0Y2h0MgkoJWVjeCkKLQotIyBBIFNJTUQgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhZCBleHRlbnNpb24gYnl0ZQotLmJ5dGUgMHgyRSwweDBGLDB4QzIsMHgwQSwweDA4Ci0gbm9wCi0gbm9wCi0jIEEgYmFkIHNmZW5jZSBtb2RybSBieXRlCi0uYnl0ZSAweDY1LDB4MEYsMHhBRSwweGZmCi0jIFBhZCBvdXQgdG8gZ29vIGFsaWdubWVudAotLmJ5dGUgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExYmM3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLmwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTg0ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjoxMjg6IFdhcm5pbmc6LioKLS4qOjEyOTogV2FybmluZzouKgotLio6MTMwOiBXYXJuaW5nOi4qCi0uKjoxMzE6IFdhcm5pbmc6LioKLS4qOjEzMjogV2FybmluZzouKgotLio6MTMzOiBXYXJuaW5nOi4qCi0uKjoxMzQ6IFdhcm5pbmc6LioKLS4qOjEzNTogV2FybmluZzouKgotLio6MTkyOiBXYXJuaW5nOi4qCi0uKjoxOTM6IFdhcm5pbmc6LioKLS4qOjE5NDogV2FybmluZzouKgotLio6MTk1OiBXYXJuaW5nOi4qCi0uKjoxOTY6IFdhcm5pbmc6LioKLS4qOjE5NzogV2FybmluZzouKgotLio6MTk4OiBXYXJuaW5nOi4qCi0uKjoxOTk6IFdhcm5pbmc6LioKLS4qOjI1NjogV2FybmluZzouKgotLio6MjU3OiBXYXJuaW5nOi4qCi0uKjoyNTg6IFdhcm5pbmc6LioKLS4qOjI1OTogV2FybmluZzouKgotLio6MjYwOiBXYXJuaW5nOi4qCi0uKjoyNjE6IFdhcm5pbmc6LioKLS4qOjI2MjogV2FybmluZzouKgotLio6MjYzOiBXYXJuaW5nOi4qCi0uKjozODQ6IFdhcm5pbmc6LioKLS4qOjM4NTogV2FybmluZzouKgotLio6Mzg2OiBXYXJuaW5nOi4qCi0uKjozODc6IFdhcm5pbmc6LioKLS4qOjM4ODogV2FybmluZzouKgotLio6Mzg5OiBXYXJuaW5nOi4qCi0uKjozOTA6IFdhcm5pbmc6LioKLS4qOjM5MTogV2FybmluZzouKgotLio6NDQ4OiBXYXJuaW5nOi4qCi0uKjo0NDk6IFdhcm5pbmc6LioKLS4qOjQ1MDogV2FybmluZzouKgotLio6NDUxOiBXYXJuaW5nOi4qCi0uKjo0NTI6IFdhcm5pbmc6LioKLS4qOjQ1MzogV2FybmluZzouKgotLio6NDU0OiBXYXJuaW5nOi4qCi0uKjo0NTU6IFdhcm5pbmc6LioKLS4qOjUxMjogV2FybmluZzouKgotLio6NTEzOiBXYXJuaW5nOi4qCi0uKjo1MTQ6IFdhcm5pbmc6LioKLS4qOjUxNTogV2FybmluZzouKgotLio6NTE2OiBXYXJuaW5nOi4qCi0uKjo1MTc6IFdhcm5pbmc6LioKLS4qOjUxODogV2FybmluZzouKgotLio6NTE5OiBXYXJuaW5nOi4qCi0uKjo2NDA6IFdhcm5pbmc6LioKLS4qOjY0MTogV2FybmluZzouKgotLio6NjQyOiBXYXJuaW5nOi4qCi0uKjo2NDM6IFdhcm5pbmc6LioKLS4qOjY0NDogV2FybmluZzouKgotLio6NjQ1OiBXYXJuaW5nOi4qCi0uKjo2NDY6IFdhcm5pbmc6LioKLS4qOjY0NzogV2FybmluZzouKgotLio6NzA0OiBXYXJuaW5nOi4qCi0uKjo3MDU6IFdhcm5pbmc6LioKLS4qOjcwNjogV2FybmluZzouKgotLio6NzA3OiBXYXJuaW5nOi4qCi0uKjo3MDg6IFdhcm5pbmc6LioKLS4qOjcwOTogV2FybmluZzouKgotLio6NzEwOiBXYXJuaW5nOi4qCi0uKjo3MTE6IFdhcm5pbmc6LioKLS4qOjc2ODogV2FybmluZzouKgotLio6NzY5OiBXYXJuaW5nOi4qCi0uKjo3NzA6IFdhcm5pbmc6LioKLS4qOjc3MTogV2FybmluZzouKgotLio6NzcyOiBXYXJuaW5nOi4qCi0uKjo3NzM6IFdhcm5pbmc6LioKLS4qOjc3NDogV2FybmluZzouKgotLio6Nzc1OiBXYXJuaW5nOi4qCi0uKjo4MTI6IFdhcm5pbmc6LioKLS4qOjgyMDogV2FybmluZzouKgotLio6ODI4OiBXYXJuaW5nOi4qCi0uKjo4MzM6IFdhcm5pbmc6LioKLS4qOjgzNDogV2FybmluZzouKgotLio6ODM1OiBXYXJuaW5nOi4qCi0uKjo5NjE6IFdhcm5pbmc6LioKLS4qOjk2MjogV2FybmluZzouKgotLio6OTYzOiBXYXJuaW5nOi4qCi0uKjo5NjQ6IFdhcm5pbmc6LioKLS4qOjk2NTogV2FybmluZzouKgotLio6OTY2OiBXYXJuaW5nOi4qCi0uKjo5Njc6IFdhcm5pbmc6LioKLS4qOjk2ODogV2FybmluZzouKgotLio6MTAyNTogV2FybmluZzouKgotLio6MTAyNjogV2FybmluZzouKgotLio6MTAyNzogV2FybmluZzouKgotLio6MTAyODogV2FybmluZzouKgotLio6MTAyOTogV2FybmluZzouKgotLio6MTAzMDogV2FybmluZzouKgotLio6MTAzMTogV2FybmluZzouKgotLio6MTAzMjogV2FybmluZzouKgotLio6MTA4OTogV2FybmluZzouKgotLio6MTA5MDogV2FybmluZzouKgotLio6MTA5MTogV2FybmluZzouKgotLio6MTA5MjogV2FybmluZzouKgotLio6MTA5MzogV2FybmluZzouKgotLio6MTA5NDogV2FybmluZzouKgotLio6MTA5NTogV2FybmluZzouKgotLio6MTA5NjogV2FybmluZzouKgotLio6MTIxNzogV2FybmluZzouKgotLio6MTIxODogV2FybmluZzouKgotLio6MTIxOTogV2FybmluZzouKgotLio6MTIyMDogV2FybmluZzouKgotLio6MTIyMTogV2FybmluZzouKgotLio6MTIyMjogV2FybmluZzouKgotLio6MTIyMzogV2FybmluZzouKgotLio6MTIyNDogV2FybmluZzouKgotLio6MTI4MTogV2FybmluZzouKgotLio6MTI4MjogV2FybmluZzouKgotLio6MTI4MzogV2FybmluZzouKgotLio6MTI4NDogV2FybmluZzouKgotLio6MTI4NTogV2FybmluZzouKgotLio6MTI4NjogV2FybmluZzouKgotLio6MTI4NzogV2FybmluZzouKgotLio6MTI4ODogV2FybmluZzouKgotLio6MTM0NTogV2FybmluZzouKgotLio6MTM0NjogV2FybmluZzouKgotLio6MTM0NzogV2FybmluZzouKgotLio6MTM0ODogV2FybmluZzouKgotLio6MTM0OTogV2FybmluZzouKgotLio6MTM1MDogV2FybmluZzouKgotLio6MTM1MTogV2FybmluZzouKgotLio6MTM1MjogV2FybmluZzouKgotLio6MTQ3MzogV2FybmluZzouKgotLio6MTQ3NDogV2FybmluZzouKgotLio6MTQ3NTogV2FybmluZzouKgotLio6MTQ3NjogV2FybmluZzouKgotLio6MTQ3NzogV2FybmluZzouKgotLio6MTQ3ODogV2FybmluZzouKgotLio6MTQ3OTogV2FybmluZzouKgotLio6MTQ4MDogV2FybmluZzouKgotLio6MTUzNzogV2FybmluZzouKgotLio6MTUzODogV2FybmluZzouKgotLio6MTUzOTogV2FybmluZzouKgotLio6MTU0MDogV2FybmluZzouKgotLio6MTU0MTogV2FybmluZzouKgotLio6MTU0MjogV2FybmluZzouKgotLio6MTU0MzogV2FybmluZzouKgotLio6MTU0NDogV2FybmluZzouKgotLio6MTYwMTogV2FybmluZzouKgotLio6MTYwMjogV2FybmluZzouKgotLio6MTYwMzogV2FybmluZzouKgotLio6MTYwNDogV2FybmluZzouKgotLio6MTYwNTogV2FybmluZzouKgotLio6MTYwNjogV2FybmluZzouKgotLio6MTYwNzogV2FybmluZzouKgotLio6MTYwODogV2FybmluZzouKgotLio6MTY0NTogV2FybmluZzouKgotLio6MTY1MzogV2FybmluZzouKgotLio6MTY2MTogV2FybmluZzouKgotLio6MTY2NjogV2FybmluZzouKgotLio6MTY2NzogV2FybmluZzouKgotLio6MTY2ODogV2FybmluZzouKgotICAgMSAgICAgICAgICAgICAgICAgICAgICAgCS5wc2l6ZSAwCi0gICAyICAgICAgICAgICAgICAgICAgICAgICAJLnRleHQKLSAgIDMgMDAwMCAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheFwpCi0gICA0IDAwMDMgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3hcKQotICAgNSAwMDA2IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4XCkKLSAgIDYgMDAwOSAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieFwpCi0gICA3IDAwMGMgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczowCi0gICA4IDAwMTMgMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2lcKQotICAgOSAwMDE2IDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpXCkKLSAgMTAgMDAxOSAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXhcKQotICAxMSAwMDFkIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeFwpCi0gIDEyIDAwMjEgMzY4QzVBMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4XCkKLSAgMTMgMDAyNSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnhcKQotICAxNCAwMDI5IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicFwpCi0gIDE1IDAwMmMgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpXCkKLSAgMTYgMDAzMCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGlcKQotICAxNyAwMDM0IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheFwpCi0gIDE4IDAwM2IgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4XCkKLSAgMTkgMDA0MiAzNjhDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHhcKQotICAyMCAwMDQ5IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieFwpCi0gIDIxIDAwNTAgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwXCkKLSAgMjIgMDA1NiAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2lcKQotICAyMyAwMDVkIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaVwpCi0gIDI0IDAwNjQgOENEOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYXgKLSAgMjUgMDA2NiA4Q0Q5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVjeAotICAyNiAwMDY4IDhDREEgICAgICAgICAgICAgIAkJbW92CSVkcywlZWR4Ci0gIDI3IDAwNmEgOENEQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYngKLSAgMjggMDA2YyA4Q0RDICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzcAotICAyOSAwMDZlIDhDREQgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJwCi0gIDMwIDAwNzAgOENERSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc2kKLSAgMzEgMDA3MiA4Q0RGICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkaQotICAzMiAwMDc0IDM2OEMxQzAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYXgsMVwpCi0gIDMzIDAwNzggMzY4QzFDMDEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVheCwxXCkKLSAgMzQgMDA3YyAzNjhDMUMwMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWF4LDFcKQotICAzNSAwMDgwIDM2OEMxQzAzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYXgsMVwpCi0gIDM2IDAwODQgOEMxQzA0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVheCwxXCkKLSAgMzcgMDA4NyAzNjhDMUMwNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYXgsMVwpCi0gIDM4IDAwOGYgMzY4QzFDMDYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVheCwxXCkKLSAgMzkgMDA5MyAzNjhDMUMwNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWF4LDFcKQotICA0MCAwMDk3IDM2OEMxQzA4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlY3gsMVwpCi0gIDQxIDAwOWIgMzY4QzFDMDkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVjeCwxXCkKLSAgNDIgMDA5ZiAzNjhDMUMwQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWN4LDFcKQotICA0MyAwMGEzIDM2OEMxQzBCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlY3gsMVwpCi0gIDQ0IDAwYTcgOEMxQzBDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVjeCwxXCkKLSAgNDUgMDBhYSAzNjhDMUMwRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlY3gsMVwpCi0gIDQ2IDAwYjIgMzY4QzFDMEUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVjeCwxXCkKLSAgNDcgMDBiNiAzNjhDMUMwRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWN4LDFcKQotICA0OCAwMGJhIDM2OEMxQzEwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZHgsMVwpCi0gIDQ5IDAwYmUgMzY4QzFDMTEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkeCwxXCkKLSAgNTAgMDBjMiAzNjhDMUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWR4LDFcKQotICA1MSAwMGM2IDM2OEMxQzEzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZHgsMVwpCi0gIDUyIDAwY2EgOEMxQzE0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkeCwxXCkKLSAgNTMgMDBjZCAzNjhDMUMxNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZHgsMVwpCi0gIDU0IDAwZDUgMzY4QzFDMTYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkeCwxXCkKLSAgNTUgMDBkOSAzNjhDMUMxNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWR4LDFcKQotICA1NiAwMGRkIDM2OEMxQzE4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYngsMVwpCi0gIDU3IDAwZTEgMzY4QzFDMTkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVieCwxXCkKLSAgNTggMDBlNSAzNjhDMUMxQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJ4LDFcKQotICA1OSAwMGU5IDM2OEMxQzFCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYngsMVwpCi0gIDYwIDAwZWQgOEMxQzFDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVieCwxXCkKLSAgNjEgMDBmMCAzNjhDMUMxRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYngsMVwpCi0gIDYyIDAwZjggMzY4QzFDMUUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVieCwxXCkKLSAgNjMgMDBmYyAzNjhDMUMxRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJ4LDFcKQotICA2NCAwMTAwIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LDFcKQotICA2NSAwMTAzIDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDFcKQotICA2NiAwMTA2IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDFcKQotICA2NyAwMTA5IDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LDFcKQotICA2OCAwMTBjIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDFcKQotICA2OSAwMTBmIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsMVwpCi0gIDcwIDAxMTYgMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksMVwpCi0gIDcxIDAxMTkgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksMVwpCi0gIDcyIDAxMWMgMzY4QzFDMjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCwxXCkKLSAgNzMgMDEyMCAzNjhDMUMyOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDFcKQotICA3NCAwMTI0IDM2OEMxQzJBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsMVwpCi0gIDc1IDAxMjggMzY4QzFDMkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCwxXCkKLSAgNzYgMDEyYyA4QzFDMkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDFcKQotICA3NyAwMTJmIDM2OEMxQzJEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCwxXCkKLSAgNzggMDEzNyAzNjhDMUMyRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDFcKQotICA3OSAwMTNiIDM2OEMxQzJGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsMVwpCi0gIDgwIDAxM2YgMzY4QzFDMzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSwxXCkKLSAgODEgMDE0MyAzNjhDMUMzMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDFcKQotICA4MiAwMTQ3IDM2OEMxQzMyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksMVwpCi0gIDgzIDAxNGIgMzY4QzFDMzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSwxXCkKLSAgODQgMDE0ZiA4QzFDMzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDFcKQotICA4NSAwMTUyIDM2OEMxQzM1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSwxXCkKLSAgODYgMDE1YSAzNjhDMUMzNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDFcKQotICA4NyAwMTVlIDM2OEMxQzM3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksMVwpCi0gIDg4IDAxNjIgMzY4QzFDMzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSwxXCkKLSAgODkgMDE2NiAzNjhDMUMzOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDFcKQotICA5MCAwMTZhIDM2OEMxQzNBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksMVwpCi0gIDkxIDAxNmUgMzY4QzFDM0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSwxXCkKLSAgOTIgMDE3MiA4QzFDM0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDFcKQotICA5MyAwMTc1IDM2OEMxQzNEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSwxXCkKLSAgOTQgMDE3ZCAzNjhDMUMzRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDFcKQotICA5NSAwMTgxIDM2OEMxQzNGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksMVwpCi0gIDk2IDAxODUgMzY4QzFDNDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCwyXCkKLSAgOTcgMDE4OSAzNjhDMUM0MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDJcKQotICA5OCAwMThkIDM2OEMxQzQyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsMlwpCi0gIDk5IDAxOTEgMzY4QzFDNDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCwyXCkKLSAxMDAgMDE5NSA4QzFDNDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDJcKQotIDEwMSAwMTk4IDM2OEMxQzQ1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCwyXCkKLSAxMDIgMDFhMCAzNjhDMUM0NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDJcKQotIDEwMyAwMWE0IDM2OEMxQzQ3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsMlwpCi0gMTA0IDAxYTggMzY4QzFDNDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCwyXCkKLSAxMDUgMDFhYyAzNjhDMUM0OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDJcKQotIDEwNiAwMWIwIDM2OEMxQzRBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsMlwpCi0gMTA3IDAxYjQgMzY4QzFDNEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCwyXCkKLSAxMDggMDFiOCA4QzFDNEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDJcKQotIDEwOSAwMWJiIDM2OEMxQzREIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCwyXCkKLSAxMTAgMDFjMyAzNjhDMUM0RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDJcKQotIDExMSAwMWM3IDM2OEMxQzRGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsMlwpCi0gMTEyIDAxY2IgMzY4QzFDNTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCwyXCkKLSAxMTMgMDFjZiAzNjhDMUM1MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDJcKQotIDExNCAwMWQzIDM2OEMxQzUyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsMlwpCi0gMTE1IDAxZDcgMzY4QzFDNTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCwyXCkKLSAxMTYgMDFkYiA4QzFDNTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDJcKQotIDExNyAwMWRlIDM2OEMxQzU1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCwyXCkKLSAxMTggMDFlNiAzNjhDMUM1NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDJcKQotIDExOSAwMWVhIDM2OEMxQzU3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsMlwpCi0gMTIwIDAxZWUgMzY4QzFDNTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCwyXCkKLSAxMjEgMDFmMiAzNjhDMUM1OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDJcKQotIDEyMiAwMWY2IDM2OEMxQzVBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsMlwpCi0gMTIzIDAxZmEgMzY4QzFDNUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCwyXCkKLSAxMjQgMDFmZSA4QzFDNUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDJcKQotIDEyNSAwMjAxIDM2OEMxQzVEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCwyXCkKLSAxMjYgMDIwOSAzNjhDMUM1RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDJcKQotIDEyNyAwMjBkIDM2OEMxQzVGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsMlwpCi0gMTI4IDAyMTEgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSAxMjkgMDIxNCAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDEzMCAwMjE3IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMTMxIDAyMWEgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSAxMzIgMDIxZCA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDEzMyAwMjIwIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsMlwpCi0uKldhcm5pbmc6LioKLSAxMzQgMDIyNyAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDEzNSAwMjJhIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gMTM2IDAyMmQgMzY4QzFDNjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCwyXCkKLSAxMzcgMDIzMSAzNjhDMUM2OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDJcKQotIDEzOCAwMjM1IDM2OEMxQzZBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsMlwpCi0gMTM5IDAyMzkgMzY4QzFDNkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCwyXCkKLSAxNDAgMDIzZCA4QzFDNkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDJcKQotIDE0MSAwMjQwIDM2OEMxQzZEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCwyXCkKLSAxNDIgMDI0OCAzNjhDMUM2RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDJcKQotIDE0MyAwMjRjIDM2OEMxQzZGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsMlwpCi0gMTQ0IDAyNTAgMzY4QzFDNzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSwyXCkKLSAxNDUgMDI1NCAzNjhDMUM3MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDJcKQotIDE0NiAwMjU4IDM2OEMxQzcyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksMlwpCi0gMTQ3IDAyNWMgMzY4QzFDNzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSwyXCkKLSAxNDggMDI2MCA4QzFDNzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDJcKQotIDE0OSAwMjYzIDM2OEMxQzc1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSwyXCkKLSAxNTAgMDI2YiAzNjhDMUM3NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDJcKQotIDE1MSAwMjZmIDM2OEMxQzc3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksMlwpCi0gMTUyIDAyNzMgMzY4QzFDNzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSwyXCkKLSAxNTMgMDI3NyAzNjhDMUM3OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDJcKQotIDE1NCAwMjdiIDM2OEMxQzdBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksMlwpCi0gMTU1IDAyN2YgMzY4QzFDN0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSwyXCkKLSAxNTYgMDI4MyA4QzFDN0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDJcKQotIDE1NyAwMjg2IDM2OEMxQzdEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSwyXCkKLSAxNTggMDI4ZSAzNjhDMUM3RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDJcKQotIDE1OSAwMjkyIDM2OEMxQzdGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksMlwpCi0gMTYwIDAyOTYgMzY4QzFDODAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCw0XCkKLSAxNjEgMDI5YSAzNjhDMUM4MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDRcKQotIDE2MiAwMjllIDM2OEMxQzgyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsNFwpCi0gMTYzIDAyYTIgMzY4QzFDODMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCw0XCkKLSAxNjQgMDJhNiA4QzFDODQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDRcKQotIDE2NSAwMmE5IDM2OEMxQzg1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCw0XCkKLSAxNjYgMDJiMSAzNjhDMUM4NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDRcKQotIDE2NyAwMmI1IDM2OEMxQzg3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsNFwpCi0gMTY4IDAyYjkgMzY4QzFDODggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCw0XCkKLSAxNjkgMDJiZCAzNjhDMUM4OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDRcKQotIDE3MCAwMmMxIDM2OEMxQzhBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsNFwpCi0gMTcxIDAyYzUgMzY4QzFDOEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCw0XCkKLSAxNzIgMDJjOSA4QzFDOEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDRcKQotIDE3MyAwMmNjIDM2OEMxQzhEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCw0XCkKLSAxNzQgMDJkNCAzNjhDMUM4RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDRcKQotIDE3NSAwMmQ4IDM2OEMxQzhGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsNFwpCi0gMTc2IDAyZGMgMzY4QzFDOTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCw0XCkKLSAxNzcgMDJlMCAzNjhDMUM5MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDRcKQotIDE3OCAwMmU0IDM2OEMxQzkyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsNFwpCi0gMTc5IDAyZTggMzY4QzFDOTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCw0XCkKLSAxODAgMDJlYyA4QzFDOTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDRcKQotIDE4MSAwMmVmIDM2OEMxQzk1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCw0XCkKLSAxODIgMDJmNyAzNjhDMUM5NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDRcKQotIDE4MyAwMmZiIDM2OEMxQzk3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsNFwpCi0gMTg0IDAyZmYgMzY4QzFDOTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCw0XCkKLSAxODUgMDMwMyAzNjhDMUM5OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDRcKQotIDE4NiAwMzA3IDM2OEMxQzlBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsNFwpCi0gMTg3IDAzMGIgMzY4QzFDOUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCw0XCkKLSAxODggMDMwZiA4QzFDOUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDRcKQotIDE4OSAwMzEyIDM2OEMxQzlEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCw0XCkKLSAxOTAgMDMxYSAzNjhDMUM5RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDRcKQotIDE5MSAwMzFlIDM2OEMxQzlGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsNFwpCi0gMTkyIDAzMjIgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxOTMgMDMyNSAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDE5NCAwMzI4IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gMTk1IDAzMmIgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxOTYgMDMyZSA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDE5NyAwMzMxIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsNFwpCi0uKldhcm5pbmc6LioKLSAxOTggMDMzOCAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDE5OSAwMzNiIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMjAwIDAzM2UgMzY4QzFDQTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCw0XCkKLSAyMDEgMDM0MiAzNjhDMUNBOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDRcKQotIDIwMiAwMzQ2IDM2OEMxQ0FBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsNFwpCi0gMjAzIDAzNGEgMzY4QzFDQUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCw0XCkKLSAyMDQgMDM0ZSA4QzFDQUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDRcKQotIDIwNSAwMzUxIDM2OEMxQ0FEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCw0XCkKLSAyMDYgMDM1OSAzNjhDMUNBRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDRcKQotIDIwNyAwMzVkIDM2OEMxQ0FGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsNFwpCi0gMjA4IDAzNjEgMzY4QzFDQjAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSw0XCkKLSAyMDkgMDM2NSAzNjhDMUNCMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDRcKQotIDIxMCAwMzY5IDM2OEMxQ0IyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksNFwpCi0gMjExIDAzNmQgMzY4QzFDQjMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSw0XCkKLSAyMTIgMDM3MSA4QzFDQjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDRcKQotIDIxMyAwMzc0IDM2OEMxQ0I1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSw0XCkKLSAyMTQgMDM3YyAzNjhDMUNCNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDRcKQotIDIxNSAwMzgwIDM2OEMxQ0I3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksNFwpCi0gMjE2IDAzODQgMzY4QzFDQjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSw0XCkKLSAyMTcgMDM4OCAzNjhDMUNCOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDRcKQotIDIxOCAwMzhjIDM2OEMxQ0JBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksNFwpCi0gMjE5IDAzOTAgMzY4QzFDQkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSw0XCkKLSAyMjAgMDM5NCA4QzFDQkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDRcKQotIDIyMSAwMzk3IDM2OEMxQ0JEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSw0XCkKLSAyMjIgMDM5ZiAzNjhDMUNCRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDRcKQotIDIyMyAwM2EzIDM2OEMxQ0JGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksNFwpCi0gMjI0IDAzYTcgMzY4QzFDQzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCw4XCkKLSAyMjUgMDNhYiAzNjhDMUNDMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDhcKQotIDIyNiAwM2FmIDM2OEMxQ0MyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsOFwpCi0gMjI3IDAzYjMgMzY4QzFDQzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCw4XCkKLSAyMjggMDNiNyA4QzFDQzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDhcKQotIDIyOSAwM2JhIDM2OEMxQ0M1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCw4XCkKLSAyMzAgMDNjMiAzNjhDMUNDNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDhcKQotIDIzMSAwM2M2IDM2OEMxQ0M3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsOFwpCi0gMjMyIDAzY2EgMzY4QzFDQzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCw4XCkKLSAyMzMgMDNjZSAzNjhDMUNDOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDhcKQotIDIzNCAwM2QyIDM2OEMxQ0NBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsOFwpCi0gMjM1IDAzZDYgMzY4QzFDQ0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCw4XCkKLSAyMzYgMDNkYSA4QzFDQ0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDhcKQotIDIzNyAwM2RkIDM2OEMxQ0NEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCw4XCkKLSAyMzggMDNlNSAzNjhDMUNDRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDhcKQotIDIzOSAwM2U5IDM2OEMxQ0NGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsOFwpCi0gMjQwIDAzZWQgMzY4QzFDRDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCw4XCkKLSAyNDEgMDNmMSAzNjhDMUNEMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDhcKQotIDI0MiAwM2Y1IDM2OEMxQ0QyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsOFwpCi0gMjQzIDAzZjkgMzY4QzFDRDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCw4XCkKLSAyNDQgMDNmZCA4QzFDRDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDhcKQotIDI0NSAwNDAwIDM2OEMxQ0Q1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCw4XCkKLSAyNDYgMDQwOCAzNjhDMUNENiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDhcKQotIDI0NyAwNDBjIDM2OEMxQ0Q3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsOFwpCi0gMjQ4IDA0MTAgMzY4QzFDRDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCw4XCkKLSAyNDkgMDQxNCAzNjhDMUNEOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDhcKQotIDI1MCAwNDE4IDM2OEMxQ0RBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsOFwpCi0gMjUxIDA0MWMgMzY4QzFDREIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCw4XCkKLSAyNTIgMDQyMCA4QzFDREMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDhcKQotIDI1MyAwNDIzIDM2OEMxQ0REIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCw4XCkKLSAyNTQgMDQyYiAzNjhDMUNERSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDhcKQotIDI1NSAwNDJmIDM2OEMxQ0RGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsOFwpCi0gMjU2IDA0MzMgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSAyNTcgMDQzNiAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDI1OCAwNDM5IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gMjU5IDA0M2MgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSAyNjAgMDQzZiA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDI2MSAwNDQyIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsOFwpCi0uKldhcm5pbmc6LioKLSAyNjIgMDQ0OSAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDI2MyAwNDRjIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gMjY0IDA0NGYgMzY4QzFDRTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCw4XCkKLSAyNjUgMDQ1MyAzNjhDMUNFOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDhcKQotIDI2NiAwNDU3IDM2OEMxQ0VBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsOFwpCi0gMjY3IDA0NWIgMzY4QzFDRUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCw4XCkKLSAyNjggMDQ1ZiA4QzFDRUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDhcKQotIDI2OSAwNDYyIDM2OEMxQ0VEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCw4XCkKLSAyNzAgMDQ2YSAzNjhDMUNFRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDhcKQotIDI3MSAwNDZlIDM2OEMxQ0VGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsOFwpCi0gMjcyIDA0NzIgMzY4QzFDRjAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSw4XCkKLSAyNzMgMDQ3NiAzNjhDMUNGMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDhcKQotIDI3NCAwNDdhIDM2OEMxQ0YyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksOFwpCi0gMjc1IDA0N2UgMzY4QzFDRjMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSw4XCkKLSAyNzYgMDQ4MiA4QzFDRjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDhcKQotIDI3NyAwNDg1IDM2OEMxQ0Y1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSw4XCkKLSAyNzggMDQ4ZCAzNjhDMUNGNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDhcKQotIDI3OSAwNDkxIDM2OEMxQ0Y3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksOFwpCi0gMjgwIDA0OTUgMzY4QzFDRjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSw4XCkKLSAyODEgMDQ5OSAzNjhDMUNGQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWRpLDhcKQotIDI4MiAwNDlkIDM2OEMxQ0Y5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksOFwpCi0gMjgzIDA0YTEgMzY4QzFDRkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSw4XCkKLSAyODQgMDRhNSA4QzFDRkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDhcKQotIDI4NSAwNGE4IDM2OEMxQ0ZEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSw4XCkKLSAyODYgMDRiMCAzNjhDMUNGRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDhcKQotIDI4NyAwNGI0IDM2OEMxQ0ZGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksOFwpCi0gMjg4IDA0YjggMzY4QzVDMDAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYXgsMVwpCi0gMjg5IDA0YmQgMzY4QzVDMDEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYXgsMVwpCi0gMjkwIDA0YzIgMzY4QzVDMDIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYXgsMVwpCi0gMjkxIDA0YzcgMzY4QzVDMDMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYXgsMVwpCi0gMjkyIDA0Y2MgOEM1QzA0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYXgsMVwpCi0gMjkzIDA0ZDAgOEM1QzA1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYXgsMVwpCi0gMjk0IDA0ZDQgMzY4QzVDMDYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYXgsMVwpCi0gMjk1IDA0ZDkgMzY4QzVDMDcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYXgsMVwpCi0gMjk2IDA0ZGUgMzY4QzVDMDggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlY3gsMVwpCi0gMjk3IDA0ZTMgMzY4QzVDMDkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlY3gsMVwpCi0gMjk4IDA0ZTggMzY4QzVDMEEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlY3gsMVwpCi0gMjk5IDA0ZWQgMzY4QzVDMEIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlY3gsMVwpCi0gMzAwIDA0ZjIgOEM1QzBDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlY3gsMVwpCi0gMzAxIDA0ZjYgOEM1QzBEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlY3gsMVwpCi0gMzAyIDA0ZmEgMzY4QzVDMEUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlY3gsMVwpCi0gMzAzIDA0ZmYgMzY4QzVDMEYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlY3gsMVwpCi0gMzA0IDA1MDQgMzY4QzVDMTAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZHgsMVwpCi0gMzA1IDA1MDkgMzY4QzVDMTEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZHgsMVwpCi0gMzA2IDA1MGUgMzY4QzVDMTIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZHgsMVwpCi0gMzA3IDA1MTMgMzY4QzVDMTMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZHgsMVwpCi0gMzA4IDA1MTggOEM1QzE0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZHgsMVwpCi0gMzA5IDA1MWMgOEM1QzE1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZHgsMVwpCi0gMzEwIDA1MjAgMzY4QzVDMTYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZHgsMVwpCi0gMzExIDA1MjUgMzY4QzVDMTcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZHgsMVwpCi0gMzEyIDA1MmEgMzY4QzVDMTggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYngsMVwpCi0gMzEzIDA1MmYgMzY4QzVDMTkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYngsMVwpCi0gMzE0IDA1MzQgMzY4QzVDMUEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYngsMVwpCi0gMzE1IDA1MzkgMzY4QzVDMUIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYngsMVwpCi0gMzE2IDA1M2UgOEM1QzFDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYngsMVwpCi0gMzE3IDA1NDIgOEM1QzFEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYngsMVwpCi0gMzE4IDA1NDYgMzY4QzVDMUUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYngsMVwpCi0gMzE5IDA1NGIgMzY4QzVDMUYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYngsMVwpCi0gMzIwIDA1NTAgMzY4QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LDFcKQotIDMyMSAwNTU0IDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwxXCkKLSAzMjIgMDU1OCAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsMVwpCi0gMzIzIDA1NWMgMzY4QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LDFcKQotIDMyNCAwNTYwIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwxXCkKLSAzMjUgMDU2NCA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsMVwpCi0gMzI2IDA1NjcgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLDFcKQotIDMyNyAwNTZiIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwxXCkKLSAzMjggMDU2ZiAzNjhDNUMyOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCwxXCkKLSAzMjkgMDU3NCAzNjhDNUMyOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCwxXCkKLSAzMzAgMDU3OSAzNjhDNUMyQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCwxXCkKLSAzMzEgMDU3ZSAzNjhDNUMyQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCwxXCkKLSAzMzIgMDU4MyA4QzVDMkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCwxXCkKLSAzMzMgMDU4NyA4QzVDMkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCwxXCkKLSAzMzQgMDU4YiAzNjhDNUMyRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCwxXCkKLSAzMzUgMDU5MCAzNjhDNUMyRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCwxXCkKLSAzMzYgMDU5NSAzNjhDNUMzMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSwxXCkKLSAzMzcgMDU5YSAzNjhDNUMzMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSwxXCkKLSAzMzggMDU5ZiAzNjhDNUMzMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSwxXCkKLSAzMzkgMDVhNCAzNjhDNUMzMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSwxXCkKLSAzNDAgMDVhOSA4QzVDMzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSwxXCkKLSAzNDEgMDVhZCA4QzVDMzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSwxXCkKLSAzNDIgMDViMSAzNjhDNUMzNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSwxXCkKLSAzNDMgMDViNiAzNjhDNUMzNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSwxXCkKLSAzNDQgMDViYiAzNjhDNUMzOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSwxXCkKLSAzNDUgMDVjMCAzNjhDNUMzOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSwxXCkKLSAzNDYgMDVjNSAzNjhDNUMzQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSwxXCkKLSAzNDcgMDVjYSAzNjhDNUMzQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSwxXCkKLSAzNDggMDVjZiA4QzVDM0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSwxXCkKLSAzNDkgMDVkMyA4QzVDM0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSwxXCkKLSAzNTAgMDVkNyAzNjhDNUMzRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSwxXCkKLSAzNTEgMDVkYyAzNjhDNUMzRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSwxXCkKLSAzNTIgMDVlMSAzNjhDNUM0MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCwyXCkKLSAzNTMgMDVlNiAzNjhDNUM0MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCwyXCkKLSAzNTQgMDVlYiAzNjhDNUM0MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCwyXCkKLSAzNTUgMDVmMCAzNjhDNUM0MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCwyXCkKLSAzNTYgMDVmNSA4QzVDNDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCwyXCkKLSAzNTcgMDVmOSA4QzVDNDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCwyXCkKLSAzNTggMDVmZCAzNjhDNUM0NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCwyXCkKLSAzNTkgMDYwMiAzNjhDNUM0NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCwyXCkKLSAzNjAgMDYwNyAzNjhDNUM0OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCwyXCkKLSAzNjEgMDYwYyAzNjhDNUM0OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCwyXCkKLSAzNjIgMDYxMSAzNjhDNUM0QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCwyXCkKLSAzNjMgMDYxNiAzNjhDNUM0QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCwyXCkKLSAzNjQgMDYxYiA4QzVDNEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCwyXCkKLSAzNjUgMDYxZiA4QzVDNEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCwyXCkKLSAzNjYgMDYyMyAzNjhDNUM0RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCwyXCkKLSAzNjcgMDYyOCAzNjhDNUM0RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCwyXCkKLSAzNjggMDYyZCAzNjhDNUM1MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCwyXCkKLSAzNjkgMDYzMiAzNjhDNUM1MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCwyXCkKLSAzNzAgMDYzNyAzNjhDNUM1MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCwyXCkKLSAzNzEgMDYzYyAzNjhDNUM1MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCwyXCkKLSAzNzIgMDY0MSA4QzVDNTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCwyXCkKLSAzNzMgMDY0NSA4QzVDNTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCwyXCkKLSAzNzQgMDY0OSAzNjhDNUM1NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCwyXCkKLSAzNzUgMDY0ZSAzNjhDNUM1NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCwyXCkKLSAzNzYgMDY1MyAzNjhDNUM1OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCwyXCkKLSAzNzcgMDY1OCAzNjhDNUM1OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCwyXCkKLSAzNzggMDY1ZCAzNjhDNUM1QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCwyXCkKLSAzNzkgMDY2MiAzNjhDNUM1QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCwyXCkKLSAzODAgMDY2NyA4QzVDNUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCwyXCkKLSAzODEgMDY2YiA4QzVDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCwyXCkKLSAzODIgMDY2ZiAzNjhDNUM1RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCwyXCkKLSAzODMgMDY3NCAzNjhDNUM1RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCwyXCkKLSAzODQgMDY3OSAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSAzODUgMDY3ZCAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAzODYgMDY4MSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSAzODcgMDY4NSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSAzODggMDY4OSA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAzODkgMDY4ZCA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSAzOTAgMDY5MCAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSAzOTEgMDY5NCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAzOTIgMDY5OCAzNjhDNUM2OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCwyXCkKLSAzOTMgMDY5ZCAzNjhDNUM2OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCwyXCkKLSAzOTQgMDZhMiAzNjhDNUM2QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCwyXCkKLSAzOTUgMDZhNyAzNjhDNUM2QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCwyXCkKLSAzOTYgMDZhYyA4QzVDNkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCwyXCkKLSAzOTcgMDZiMCA4QzVDNkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCwyXCkKLSAzOTggMDZiNCAzNjhDNUM2RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCwyXCkKLSAzOTkgMDZiOSAzNjhDNUM2RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCwyXCkKLSA0MDAgMDZiZSAzNjhDNUM3MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSwyXCkKLSA0MDEgMDZjMyAzNjhDNUM3MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSwyXCkKLSA0MDIgMDZjOCAzNjhDNUM3MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSwyXCkKLSA0MDMgMDZjZCAzNjhDNUM3MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSwyXCkKLSA0MDQgMDZkMiA4QzVDNzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSwyXCkKLSA0MDUgMDZkNiA4QzVDNzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSwyXCkKLSA0MDYgMDZkYSAzNjhDNUM3NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSwyXCkKLSA0MDcgMDZkZiAzNjhDNUM3NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSwyXCkKLSA0MDggMDZlNCAzNjhDNUM3OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSwyXCkKLSA0MDkgMDZlOSAzNjhDNUM3OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSwyXCkKLSA0MTAgMDZlZSAzNjhDNUM3QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSwyXCkKLSA0MTEgMDZmMyAzNjhDNUM3QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSwyXCkKLSA0MTIgMDZmOCA4QzVDN0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSwyXCkKLSA0MTMgMDZmYyA4QzVDN0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSwyXCkKLSA0MTQgMDcwMCAzNjhDNUM3RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSwyXCkKLSA0MTUgMDcwNSAzNjhDNUM3RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSwyXCkKLSA0MTYgMDcwYSAzNjhDNUM4MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCw0XCkKLSA0MTcgMDcwZiAzNjhDNUM4MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCw0XCkKLSA0MTggMDcxNCAzNjhDNUM4MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCw0XCkKLSA0MTkgMDcxOSAzNjhDNUM4MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCw0XCkKLSA0MjAgMDcxZSA4QzVDODQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCw0XCkKLSA0MjEgMDcyMiA4QzVDODUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCw0XCkKLSA0MjIgMDcyNiAzNjhDNUM4NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCw0XCkKLSA0MjMgMDcyYiAzNjhDNUM4NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCw0XCkKLSA0MjQgMDczMCAzNjhDNUM4OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCw0XCkKLSA0MjUgMDczNSAzNjhDNUM4OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCw0XCkKLSA0MjYgMDczYSAzNjhDNUM4QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCw0XCkKLSA0MjcgMDczZiAzNjhDNUM4QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCw0XCkKLSA0MjggMDc0NCA4QzVDOEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCw0XCkKLSA0MjkgMDc0OCA4QzVDOEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCw0XCkKLSA0MzAgMDc0YyAzNjhDNUM4RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCw0XCkKLSA0MzEgMDc1MSAzNjhDNUM4RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCw0XCkKLSA0MzIgMDc1NiAzNjhDNUM5MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCw0XCkKLSA0MzMgMDc1YiAzNjhDNUM5MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCw0XCkKLSA0MzQgMDc2MCAzNjhDNUM5MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCw0XCkKLSA0MzUgMDc2NSAzNjhDNUM5MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCw0XCkKLSA0MzYgMDc2YSA4QzVDOTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCw0XCkKLSA0MzcgMDc2ZSA4QzVDOTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCw0XCkKLSA0MzggMDc3MiAzNjhDNUM5NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCw0XCkKLSA0MzkgMDc3NyAzNjhDNUM5NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCw0XCkKLSA0NDAgMDc3YyAzNjhDNUM5OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCw0XCkKLSA0NDEgMDc4MSAzNjhDNUM5OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCw0XCkKLSA0NDIgMDc4NiAzNjhDNUM5QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCw0XCkKLSA0NDMgMDc4YiAzNjhDNUM5QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCw0XCkKLSA0NDQgMDc5MCA4QzVDOUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCw0XCkKLSA0NDUgMDc5NCA4QzVDOUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCw0XCkKLSA0NDYgMDc5OCAzNjhDNUM5RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCw0XCkKLSA0NDcgMDc5ZCAzNjhDNUM5RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCw0XCkKLSA0NDggMDdhMiAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSA0NDkgMDdhNiAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsNFwpCi0uKldhcm5pbmc6LioKLSA0NTAgMDdhYSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSA0NTEgMDdhZSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSA0NTIgMDdiMiA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsNFwpCi0uKldhcm5pbmc6LioKLSA0NTMgMDdiNiA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSA0NTQgMDdiOSAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSA0NTUgMDdiZCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSA0NTYgMDdjMSAzNjhDNUNBOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCw0XCkKLSA0NTcgMDdjNiAzNjhDNUNBOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCw0XCkKLSA0NTggMDdjYiAzNjhDNUNBQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCw0XCkKLSA0NTkgMDdkMCAzNjhDNUNBQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCw0XCkKLSA0NjAgMDdkNSA4QzVDQUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCw0XCkKLSA0NjEgMDdkOSA4QzVDQUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCw0XCkKLSA0NjIgMDdkZCAzNjhDNUNBRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCw0XCkKLSA0NjMgMDdlMiAzNjhDNUNBRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCw0XCkKLSA0NjQgMDdlNyAzNjhDNUNCMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSw0XCkKLSA0NjUgMDdlYyAzNjhDNUNCMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSw0XCkKLSA0NjYgMDdmMSAzNjhDNUNCMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSw0XCkKLSA0NjcgMDdmNiAzNjhDNUNCMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSw0XCkKLSA0NjggMDdmYiA4QzVDQjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSw0XCkKLSA0NjkgMDdmZiA4QzVDQjUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSw0XCkKLSA0NzAgMDgwMyAzNjhDNUNCNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSw0XCkKLSA0NzEgMDgwOCAzNjhDNUNCNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSw0XCkKLSA0NzIgMDgwZCAzNjhDNUNCOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSw0XCkKLSA0NzMgMDgxMiAzNjhDNUNCOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSw0XCkKLSA0NzQgMDgxNyAzNjhDNUNCQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSw0XCkKLSA0NzUgMDgxYyAzNjhDNUNCQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSw0XCkKLSA0NzYgMDgyMSA4QzVDQkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSw0XCkKLSA0NzcgMDgyNSA4QzVDQkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSw0XCkKLSA0NzggMDgyOSAzNjhDNUNCRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSw0XCkKLSA0NzkgMDgyZSAzNjhDNUNCRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSw0XCkKLSA0ODAgMDgzMyAzNjhDNUNDMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCw4XCkKLSA0ODEgMDgzOCAzNjhDNUNDMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCw4XCkKLSA0ODIgMDgzZCAzNjhDNUNDMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCw4XCkKLSA0ODMgMDg0MiAzNjhDNUNDMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCw4XCkKLSA0ODQgMDg0NyA4QzVDQzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCw4XCkKLSA0ODUgMDg0YiA4QzVDQzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCw4XCkKLSA0ODYgMDg0ZiAzNjhDNUNDNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCw4XCkKLSA0ODcgMDg1NCAzNjhDNUNDNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCw4XCkKLSA0ODggMDg1OSAzNjhDNUNDOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCw4XCkKLSA0ODkgMDg1ZSAzNjhDNUNDOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCw4XCkKLSA0OTAgMDg2MyAzNjhDNUNDQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCw4XCkKLSA0OTEgMDg2OCAzNjhDNUNDQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCw4XCkKLSA0OTIgMDg2ZCA4QzVDQ0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCw4XCkKLSA0OTMgMDg3MSA4QzVDQ0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCw4XCkKLSA0OTQgMDg3NSAzNjhDNUNDRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCw4XCkKLSA0OTUgMDg3YSAzNjhDNUNDRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCw4XCkKLSA0OTYgMDg3ZiAzNjhDNUNEMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCw4XCkKLSA0OTcgMDg4NCAzNjhDNUNEMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCw4XCkKLSA0OTggMDg4OSAzNjhDNUNEMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCw4XCkKLSA0OTkgMDg4ZSAzNjhDNUNEMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCw4XCkKLSA1MDAgMDg5MyA4QzVDRDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCw4XCkKLSA1MDEgMDg5NyA4QzVDRDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCw4XCkKLSA1MDIgMDg5YiAzNjhDNUNENiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCw4XCkKLSA1MDMgMDhhMCAzNjhDNUNENyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCw4XCkKLSA1MDQgMDhhNSAzNjhDNUNEOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCw4XCkKLSA1MDUgMDhhYSAzNjhDNUNEOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCw4XCkKLSA1MDYgMDhhZiAzNjhDNUNEQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCw4XCkKLSA1MDcgMDhiNCAzNjhDNUNEQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCw4XCkKLSA1MDggMDhiOSA4QzVDREMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCw4XCkKLSA1MDkgMDhiZCA4QzVDREQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCw4XCkKLSA1MTAgMDhjMSAzNjhDNUNERSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCw4XCkKLSA1MTEgMDhjNiAzNjhDNUNERiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCw4XCkKLSA1MTIgMDhjYiAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSA1MTMgMDhjZiAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSA1MTQgMDhkMyAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSA1MTUgMDhkNyAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSA1MTYgMDhkYiA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSA1MTcgMDhkZiA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSA1MTggMDhlMiAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksOFwpCi0uKldhcm5pbmc6LioKLSA1MTkgMDhlNiAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSA1MjAgMDhlYSAzNjhDNUNFOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCw4XCkKLSA1MjEgMDhlZiAzNjhDNUNFOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCw4XCkKLSA1MjIgMDhmNCAzNjhDNUNFQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCw4XCkKLSA1MjMgMDhmOSAzNjhDNUNFQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCw4XCkKLSA1MjQgMDhmZSA4QzVDRUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCw4XCkKLSA1MjUgMDkwMiA4QzVDRUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCw4XCkKLSA1MjYgMDkwNiAzNjhDNUNFRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCw4XCkKLSA1MjcgMDkwYiAzNjhDNUNFRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCw4XCkKLSA1MjggMDkxMCAzNjhDNUNGMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSw4XCkKLSA1MjkgMDkxNSAzNjhDNUNGMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSw4XCkKLSA1MzAgMDkxYSAzNjhDNUNGMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSw4XCkKLSA1MzEgMDkxZiAzNjhDNUNGMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSw4XCkKLSA1MzIgMDkyNCA4QzVDRjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSw4XCkKLSA1MzMgMDkyOCA4QzVDRjUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSw4XCkKLSA1MzQgMDkyYyAzNjhDNUNGNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSw4XCkKLSA1MzUgMDkzMSAzNjhDNUNGNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSw4XCkKLSA1MzYgMDkzNiAzNjhDNUNGOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSw4XCkKLSA1MzcgMDkzYiAzNjhDNUNGQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSw4XCkKLSA1MzggMDk0MCAzNjhDNUNGOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSw4XCkKLSA1MzkgMDk0NSAzNjhDNUNGQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSw4XCkKLSA1NDAgMDk0YSA4QzVDRkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSw4XCkKLSA1NDEgMDk0ZSA4QzVDRkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSw4XCkKLSA1NDIgMDk1MiAzNjhDNUNGRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSw4XCkKLSA1NDMgMDk1NyAzNjhDNUNGRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSw4XCkKLSA1NDQgMDk1YyAzNjhDOUMwMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwxXCkKLSA1NDUgMDk2NCAzNjhDOUMwMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCwxXCkKLSA1NDYgMDk2YyAzNjhDOUMwMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwxXCkKLSA1NDcgMDk3NCAzNjhDOUMwMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwxXCkKLSA1NDggMDk3YyA4QzlDMDQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCwxXCkKLSA1NDkgMDk4MyA4QzlDMDU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwxXCkKLSA1NTAgMDk4YSAzNjhDOUMwNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwxXCkKLSA1NTEgMDk5MiAzNjhDOUMwNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVheCwxXCkKLSA1NTIgMDk5YSAzNjhDOUMwOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwxXCkKLSA1NTMgMDlhMiAzNjhDOUMwOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwxXCkKLSA1NTQgMDlhYSAzNjhDOUMwQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCwxXCkKLSA1NTUgMDliMiAzNjhDOUMwQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwxXCkKLSA1NTYgMDliYSA4QzlDMEM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwxXCkKLSA1NTcgMDljMSA4QzlDMEQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCwxXCkKLSA1NTggMDljOCAzNjhDOUMwRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwxXCkKLSA1NTkgMDlkMCAzNjhDOUMwRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwxXCkKLSA1NjAgMDlkOCAzNjhDOUMxMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCwxXCkKLSA1NjEgMDllMCAzNjhDOUMxMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwxXCkKLSA1NjIgMDllOCAzNjhDOUMxMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwxXCkKLSA1NjMgMDlmMCAzNjhDOUMxMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCwxXCkKLSA1NjQgMDlmOCA4QzlDMTQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwxXCkKLSA1NjUgMDlmZiA4QzlDMTU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwxXCkKLSA1NjYgMGEwNiAzNjhDOUMxNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCwxXCkKLSA1NjcgMGEwZSAzNjhDOUMxNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwxXCkKLSA1NjggMGExNiAzNjhDOUMxOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwxXCkKLSA1NjkgMGExZSAzNjhDOUMxOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCwxXCkKLSA1NzAgMGEyNiAzNjhDOUMxQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwxXCkKLSA1NzEgMGEyZSAzNjhDOUMxQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwxXCkKLSA1NzIgMGEzNiA4QzlDMUM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCwxXCkKLSA1NzMgMGEzZCA4QzlDMUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwxXCkKLSA1NzQgMGE0NCAzNjhDOUMxRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwxXCkKLSA1NzUgMGE0YyAzNjhDOUMxRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVieCwxXCkKLSA1NzYgMGE1NCAzNjhDOTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsMVwpCi0gNTc3IDBhNWIgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDFcKQotIDU3OCAwYTYyIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwxXCkKLSA1NzkgMGE2OSAzNjhDOUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsMVwpCi0gNTgwIDBhNzAgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDFcKQotIDU4MSAwYTc3IDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwxXCkKLSA1ODIgMGE3ZCAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksMVwpCi0gNTgzIDBhODQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDFcKQotIDU4NCAwYThiIDM2OEM5QzI4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDFcKQotIDU4NSAwYTkzIDM2OEM5QzI5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDFcKQotIDU4NiAwYTliIDM2OEM5QzJBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDFcKQotIDU4NyAwYWEzIDM2OEM5QzJCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDFcKQotIDU4OCAwYWFiIDhDOUMyQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDFcKQotIDU4OSAwYWIyIDhDOUMyRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDFcKQotIDU5MCAwYWI5IDM2OEM5QzJFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDFcKQotIDU5MSAwYWMxIDM2OEM5QzJGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDFcKQotIDU5MiAwYWM5IDM2OEM5QzMwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDFcKQotIDU5MyAwYWQxIDM2OEM5QzMxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDFcKQotIDU5NCAwYWQ5IDM2OEM5QzMyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDFcKQotIDU5NSAwYWUxIDM2OEM5QzMzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDFcKQotIDU5NiAwYWU5IDhDOUMzNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDFcKQotIDU5NyAwYWYwIDhDOUMzNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDFcKQotIDU5OCAwYWY3IDM2OEM5QzM2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDFcKQotIDU5OSAwYWZmIDM2OEM5QzM3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDFcKQotIDYwMCAwYjA3IDM2OEM5QzM4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDFcKQotIDYwMSAwYjBmIDM2OEM5QzM5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDFcKQotIDYwMiAwYjE3IDM2OEM5QzNBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDFcKQotIDYwMyAwYjFmIDM2OEM5QzNCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDFcKQotIDYwNCAwYjI3IDhDOUMzQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDFcKQotIDYwNSAwYjJlIDhDOUMzRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDFcKQotIDYwNiAwYjM1IDM2OEM5QzNFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDFcKQotIDYwNyAwYjNkIDM2OEM5QzNGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDFcKQotIDYwOCAwYjQ1IDM2OEM5QzQwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDJcKQotIDYwOSAwYjRkIDM2OEM5QzQxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDJcKQotIDYxMCAwYjU1IDM2OEM5QzQyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDJcKQotIDYxMSAwYjVkIDM2OEM5QzQzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDJcKQotIDYxMiAwYjY1IDhDOUM0NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDJcKQotIDYxMyAwYjZjIDhDOUM0NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDJcKQotIDYxNCAwYjczIDM2OEM5QzQ2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDJcKQotIDYxNSAwYjdiIDM2OEM5QzQ3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDJcKQotIDYxNiAwYjgzIDM2OEM5QzQ4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDJcKQotIDYxNyAwYjhiIDM2OEM5QzQ5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDJcKQotIDYxOCAwYjkzIDM2OEM5QzRBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDJcKQotIDYxOSAwYjliIDM2OEM5QzRCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDJcKQotIDYyMCAwYmEzIDhDOUM0Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDJcKQotIDYyMSAwYmFhIDhDOUM0RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDJcKQotIDYyMiAwYmIxIDM2OEM5QzRFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDJcKQotIDYyMyAwYmI5IDM2OEM5QzRGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDJcKQotIDYyNCAwYmMxIDM2OEM5QzUwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDJcKQotIDYyNSAwYmM5IDM2OEM5QzUxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDJcKQotIDYyNiAwYmQxIDM2OEM5QzUyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDJcKQotIDYyNyAwYmQ5IDM2OEM5QzUzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDJcKQotIDYyOCAwYmUxIDhDOUM1NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDJcKQotIDYyOSAwYmU4IDhDOUM1NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDJcKQotIDYzMCAwYmVmIDM2OEM5QzU2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDJcKQotIDYzMSAwYmY3IDM2OEM5QzU3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDJcKQotIDYzMiAwYmZmIDM2OEM5QzU4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDJcKQotIDYzMyAwYzA3IDM2OEM5QzU5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDJcKQotIDYzNCAwYzBmIDM2OEM5QzVBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDJcKQotIDYzNSAwYzE3IDM2OEM5QzVCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDJcKQotIDYzNiAwYzFmIDhDOUM1Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDJcKQotIDYzNyAwYzI2IDhDOUM1RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDJcKQotIDYzOCAwYzJkIDM2OEM5QzVFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDJcKQotIDYzOSAwYzM1IDM2OEM5QzVGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDJcKQotIDY0MCAwYzNkIDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDY0MSAwYzQ0IDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDY0MiAwYzRiIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDY0MyAwYzUyIDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDY0NCAwYzU5IDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDY0NSAwYzYwIDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDY0NiAwYzY2IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDY0NyAwYzZkIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDY0OCAwYzc0IDM2OEM5QzY4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDJcKQotIDY0OSAwYzdjIDM2OEM5QzY5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDJcKQotIDY1MCAwYzg0IDM2OEM5QzZBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDJcKQotIDY1MSAwYzhjIDM2OEM5QzZCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDJcKQotIDY1MiAwYzk0IDhDOUM2Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDJcKQotIDY1MyAwYzliIDhDOUM2RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDJcKQotIDY1NCAwY2EyIDM2OEM5QzZFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDJcKQotIDY1NSAwY2FhIDM2OEM5QzZGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDJcKQotIDY1NiAwY2IyIDM2OEM5QzcwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDJcKQotIDY1NyAwY2JhIDM2OEM5QzcxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDJcKQotIDY1OCAwY2MyIDM2OEM5QzcyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDJcKQotIDY1OSAwY2NhIDM2OEM5QzczIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDJcKQotIDY2MCAwY2QyIDhDOUM3NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDJcKQotIDY2MSAwY2Q5IDhDOUM3NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDJcKQotIDY2MiAwY2UwIDM2OEM5Qzc2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDJcKQotIDY2MyAwY2U4IDM2OEM5Qzc3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDJcKQotIDY2NCAwY2YwIDM2OEM5Qzc4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDJcKQotIDY2NSAwY2Y4IDM2OEM5Qzc5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDJcKQotIDY2NiAwZDAwIDM2OEM5QzdBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDJcKQotIDY2NyAwZDA4IDM2OEM5QzdCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDJcKQotIDY2OCAwZDEwIDhDOUM3Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDJcKQotIDY2OSAwZDE3IDhDOUM3RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDJcKQotIDY3MCAwZDFlIDM2OEM5QzdFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDJcKQotIDY3MSAwZDI2IDM2OEM5QzdGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDJcKQotIDY3MiAwZDJlIDM2OEM5QzgwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDRcKQotIDY3MyAwZDM2IDM2OEM5QzgxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDRcKQotIDY3NCAwZDNlIDM2OEM5QzgyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDRcKQotIDY3NSAwZDQ2IDM2OEM5QzgzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDRcKQotIDY3NiAwZDRlIDhDOUM4NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDRcKQotIDY3NyAwZDU1IDhDOUM4NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDRcKQotIDY3OCAwZDVjIDM2OEM5Qzg2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDRcKQotIDY3OSAwZDY0IDM2OEM5Qzg3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDRcKQotIDY4MCAwZDZjIDM2OEM5Qzg4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDRcKQotIDY4MSAwZDc0IDM2OEM5Qzg5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDRcKQotIDY4MiAwZDdjIDM2OEM5QzhBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDRcKQotIDY4MyAwZDg0IDM2OEM5QzhCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDRcKQotIDY4NCAwZDhjIDhDOUM4Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDRcKQotIDY4NSAwZDkzIDhDOUM4RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDRcKQotIDY4NiAwZDlhIDM2OEM5QzhFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDRcKQotIDY4NyAwZGEyIDM2OEM5QzhGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDRcKQotIDY4OCAwZGFhIDM2OEM5QzkwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDRcKQotIDY4OSAwZGIyIDM2OEM5QzkxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDRcKQotIDY5MCAwZGJhIDM2OEM5QzkyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDRcKQotIDY5MSAwZGMyIDM2OEM5QzkzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDRcKQotIDY5MiAwZGNhIDhDOUM5NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDRcKQotIDY5MyAwZGQxIDhDOUM5NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDRcKQotIDY5NCAwZGQ4IDM2OEM5Qzk2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDRcKQotIDY5NSAwZGUwIDM2OEM5Qzk3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDRcKQotIDY5NiAwZGU4IDM2OEM5Qzk4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDRcKQotIDY5NyAwZGYwIDM2OEM5Qzk5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDRcKQotIDY5OCAwZGY4IDM2OEM5QzlBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDRcKQotIDY5OSAwZTAwIDM2OEM5QzlCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDRcKQotIDcwMCAwZTA4IDhDOUM5Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDRcKQotIDcwMSAwZTBmIDhDOUM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDRcKQotIDcwMiAwZTE2IDM2OEM5QzlFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDRcKQotIDcwMyAwZTFlIDM2OEM5QzlGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDRcKQotIDcwNCAwZTI2IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDcwNSAwZTJkIDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDcwNiAwZTM0IDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDcwNyAwZTNiIDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDcwOCAwZTQyIDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDcwOSAwZTQ5IDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDcxMCAwZTRmIDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDcxMSAwZTU2IDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDcxMiAwZTVkIDM2OEM5Q0E4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDRcKQotIDcxMyAwZTY1IDM2OEM5Q0E5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDRcKQotIDcxNCAwZTZkIDM2OEM5Q0FBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDRcKQotIDcxNSAwZTc1IDM2OEM5Q0FCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDRcKQotIDcxNiAwZTdkIDhDOUNBQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDRcKQotIDcxNyAwZTg0IDhDOUNBRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDRcKQotIDcxOCAwZThiIDM2OEM5Q0FFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDRcKQotIDcxOSAwZTkzIDM2OEM5Q0FGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDRcKQotIDcyMCAwZTliIDM2OEM5Q0IwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDRcKQotIDcyMSAwZWEzIDM2OEM5Q0IxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDRcKQotIDcyMiAwZWFiIDM2OEM5Q0IyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDRcKQotIDcyMyAwZWIzIDM2OEM5Q0IzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDRcKQotIDcyNCAwZWJiIDhDOUNCNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDRcKQotIDcyNSAwZWMyIDhDOUNCNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDRcKQotIDcyNiAwZWM5IDM2OEM5Q0I2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDRcKQotIDcyNyAwZWQxIDM2OEM5Q0I3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDRcKQotIDcyOCAwZWQ5IDM2OEM5Q0I4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDRcKQotIDcyOSAwZWUxIDM2OEM5Q0I5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDRcKQotIDczMCAwZWU5IDM2OEM5Q0JBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDRcKQotIDczMSAwZWYxIDM2OEM5Q0JCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDRcKQotIDczMiAwZWY5IDhDOUNCQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDRcKQotIDczMyAwZjAwIDhDOUNCRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDRcKQotIDczNCAwZjA3IDM2OEM5Q0JFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDRcKQotIDczNSAwZjBmIDM2OEM5Q0JGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDRcKQotIDczNiAwZjE3IDM2OEM5Q0MwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDhcKQotIDczNyAwZjFmIDM2OEM5Q0MxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDhcKQotIDczOCAwZjI3IDM2OEM5Q0MyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDhcKQotIDczOSAwZjJmIDM2OEM5Q0MzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDhcKQotIDc0MCAwZjM3IDhDOUNDNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDhcKQotIDc0MSAwZjNlIDhDOUNDNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDhcKQotIDc0MiAwZjQ1IDM2OEM5Q0M2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDhcKQotIDc0MyAwZjRkIDM2OEM5Q0M3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDhcKQotIDc0NCAwZjU1IDM2OEM5Q0M4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDhcKQotIDc0NSAwZjVkIDM2OEM5Q0M5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDhcKQotIDc0NiAwZjY1IDM2OEM5Q0NBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDhcKQotIDc0NyAwZjZkIDM2OEM5Q0NCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDhcKQotIDc0OCAwZjc1IDhDOUNDQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDhcKQotIDc0OSAwZjdjIDhDOUNDRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDhcKQotIDc1MCAwZjgzIDM2OEM5Q0NFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDhcKQotIDc1MSAwZjhiIDM2OEM5Q0NGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDhcKQotIDc1MiAwZjkzIDM2OEM5Q0QwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDhcKQotIDc1MyAwZjliIDM2OEM5Q0QxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDhcKQotIDc1NCAwZmEzIDM2OEM5Q0QyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDhcKQotIDc1NSAwZmFiIDM2OEM5Q0QzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDhcKQotIDc1NiAwZmIzIDhDOUNENDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDhcKQotIDc1NyAwZmJhIDhDOUNENTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDhcKQotIDc1OCAwZmMxIDM2OEM5Q0Q2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDhcKQotIDc1OSAwZmM5IDM2OEM5Q0Q3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDhcKQotIDc2MCAwZmQxIDM2OEM5Q0Q4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDhcKQotIDc2MSAwZmQ5IDM2OEM5Q0Q5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDhcKQotIDc2MiAwZmUxIDM2OEM5Q0RBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDhcKQotIDc2MyAwZmU5IDM2OEM5Q0RCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDhcKQotIDc2NCAwZmYxIDhDOUNEQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDhcKQotIDc2NSAwZmY4IDhDOUNERDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDhcKQotIDc2NiAwZmZmIDM2OEM5Q0RFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDhcKQotIDc2NyAxMDA3IDM2OEM5Q0RGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDhcKQotIDc2OCAxMDBmIDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDc2OSAxMDE2IDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDc3MCAxMDFkIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDc3MSAxMDI0IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDc3MiAxMDJiIDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDc3MyAxMDMyIDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDc3NCAxMDM4IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDc3NSAxMDNmIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDc3NiAxMDQ2IDM2OEM5Q0U4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDhcKQotIDc3NyAxMDRlIDM2OEM5Q0U5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDhcKQotIDc3OCAxMDU2IDM2OEM5Q0VBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDhcKQotIDc3OSAxMDVlIDM2OEM5Q0VCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDhcKQotIDc4MCAxMDY2IDhDOUNFQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDhcKQotIDc4MSAxMDZkIDhDOUNFRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDhcKQotIDc4MiAxMDc0IDM2OEM5Q0VFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDhcKQotIDc4MyAxMDdjIDM2OEM5Q0VGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDhcKQotIDc4NCAxMDg0IDM2OEM5Q0YwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDhcKQotIDc4NSAxMDhjIDM2OEM5Q0YxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDhcKQotIDc4NiAxMDk0IDM2OEM5Q0YyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDhcKQotIDc4NyAxMDljIDM2OEM5Q0YzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDhcKQotIDc4OCAxMGE0IDhDOUNGNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDhcKQotIDc4OSAxMGFiIDhDOUNGNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDhcKQotIDc5MCAxMGIyIDM2OEM5Q0Y2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDhcKQotIDc5MSAxMGJhIDM2OEM5Q0Y3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDhcKQotIDc5MiAxMGMyIDM2OEM5Q0Y4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDhcKQotIDc5MyAxMGNhIDM2OEM5Q0ZBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDhcKQotIDc5NCAxMGQyIDM2OEM5Q0Y5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDhcKQotIDc5NSAxMGRhIDM2OEM5Q0ZCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDhcKQotIDc5NiAxMGUyIDhDOUNGQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDhcKQotIDc5NyAxMGU5IDhDOUNGRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDhcKQotIDc5OCAxMGYwIDM2OEM5Q0ZFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDhcKQotIDc5OSAxMGY4IDM2OEM5Q0ZGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDhcKQotIDgwMCAxMTAwIDhDNUMwNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsMVwpCi0gODAxIDExMDQgOEM1QzBEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCwxXCkKLSA4MDIgMTEwOCA4QzVDMTUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDFcKQotIDgwMyAxMTBjIDhDNUMxRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsMVwpCi0gODA0IDExMTAgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsMVwpCi0gODA1IDExMTMgOEM1QzJEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCwxXCkKLSA4MDYgMTExNyA4QzVDMzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDFcKQotIDgwNyAxMTFiIDhDNUMzRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksMVwpCi0gODA4IDExMWYgOEM1QzQ1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCwyXCkKLSA4MDkgMTEyMyA4QzVDNEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDJcKQotIDgxMCAxMTI3IDhDNUM1NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsMlwpCi0gODExIDExMmIgOEM1QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCwyXCkKLSA4MTIgMTEyZiA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDgxMyAxMTMyIDhDNUM2RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYnAsMlwpCi0gODE0IDExMzYgOEM1Qzc1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVzaSwyXCkKLSA4MTUgMTEzYSA4QzVDN0QwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWRpLDJcKQotIDgxNiAxMTNlIDhDNUM4NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsNFwpCi0gODE3IDExNDIgOEM1QzhEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCw0XCkKLSA4MTggMTE0NiA4QzVDOTUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDRcKQotIDgxOSAxMTRhIDhDNUM5RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsNFwpCi0gODIwIDExNGUgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSA4MjEgMTE1MSA4QzVDQUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDRcKQotIDgyMiAxMTU1IDhDNUNCNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksNFwpCi0gODIzIDExNTkgOEM1Q0JEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSw0XCkKLSA4MjQgMTE1ZCA4QzVDQzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWF4LDhcKQotIDgyNSAxMTYxIDhDNUNDRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlY3gsOFwpCi0gODI2IDExNjUgOEM1Q0Q1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkeCw4XCkKLSA4MjcgMTE2OSA4QzVDREQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJ4LDhcKQotIDgyOCAxMTZkIDhDNUQwMCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gODI5IDExNzAgOEM1Q0VEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCw4XCkKLSA4MzAgMTE3NCA4QzVDRjUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDhcKQotIDgzMSAxMTc4IDhDNUNGRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksOFwpCi0gODMyIDExN2MgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsMVwpCi0gODMzIDExODMgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsMlwpCi0uKldhcm5pbmc6LioKLSA4MzQgMTE4YSAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCw0XCkKLS4qV2FybmluZzouKgotIDgzNSAxMTkxIDM2OEMxRDEyIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MHgxMlwoLDhcKQotLipXYXJuaW5nOi4qCi0gODM2IDExOTggOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXhcKQotIDgzNyAxMTlhIDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4XCkKLSA4MzggMTE5YyA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeFwpCi0gODM5IDExOWUgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnhcKQotIDg0MCAxMWEwIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MAotIDg0MSAxMWE2IDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpXCkKLSA4NDIgMTFhOCA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaVwpCi0gODQzIDExYWEgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4XCkKLSA4NDQgMTFhZCA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3hcKQotIDg0NSAxMWIwIDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeFwpCi0gODQ2IDExYjMgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4XCkKLSA4NDcgMTFiNiAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnBcKQotIDg0OCAxMWJhIDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaVwpCi0gODQ5IDExYmQgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpXCkKLSA4NTAgMTFjMCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXhcKQotIDg1MSAxMWM2IDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeFwpCi0gODUyIDExY2MgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4XCkKLSA4NTMgMTFkMiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnhcKQotIDg1NCAxMWQ4IDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicFwpCi0gODU1IDExZGYgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpXCkKLSA4NTYgMTFlNSA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGlcKQotIDg1NyAxMWViIDhDRDggICAgICAgICAgICAgIAkJbW92CSVkcywlZWF4Ci0gODU4IDExZWQgOENEOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlY3gKLSA4NTkgMTFlZiA4Q0RBICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkeAotIDg2MCAxMWYxIDhDREIgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJ4Ci0gODYxIDExZjMgOENEQyAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc3AKLSA4NjIgMTFmNSA4Q0REICAgICAgICAgICAgICAJCW1vdgklZHMsJWVicAotIDg2MyAxMWY3IDhDREUgICAgICAgICAgICAgIAkJbW92CSVkcywlZXNpCi0gODY0IDExZjkgOENERiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlZGkKLSA4NjUgMTFmYiA4QzFDMDAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWF4LDFcKQotIDg2NiAxMWZlIDhDMUMwMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYXgsMVwpCi0gODY3IDEyMDEgOEMxQzAyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVheCwxXCkKLSA4NjggMTIwNCA4QzFDMDMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWF4LDFcKQotIDg2OSAxMjA3IDNFOEMxQzA0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYXgsMVwpCi0gODcwIDEyMGIgOEMxQzA1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWF4LDFcKQotIDg3MSAxMjEyIDhDMUMwNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYXgsMVwpCi0gODcyIDEyMTUgOEMxQzA3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCwxXCkKLSA4NzMgMTIxOCA4QzFDMDggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWN4LDFcKQotIDg3NCAxMjFiIDhDMUMwOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlY3gsMVwpCi0gODc1IDEyMWUgOEMxQzBBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCwxXCkKLSA4NzYgMTIyMSA4QzFDMEIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWN4LDFcKQotIDg3NyAxMjI0IDNFOEMxQzBDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlY3gsMVwpCi0gODc4IDEyMjggOEMxQzBEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDFcKQotIDg3OSAxMjJmIDhDMUMwRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlY3gsMVwpCi0gODgwIDEyMzIgOEMxQzBGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVjeCwxXCkKLSA4ODEgMTIzNSA4QzFDMTAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDFcKQotIDg4MiAxMjM4IDhDMUMxMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZHgsMVwpCi0gODgzIDEyM2IgOEMxQzEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkeCwxXCkKLSA4ODQgMTIzZSA4QzFDMTMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDFcKQotIDg4NSAxMjQxIDNFOEMxQzE0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZHgsMVwpCi0gODg2IDEyNDUgOEMxQzE1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWR4LDFcKQotIDg4NyAxMjRjIDhDMUMxNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsMVwpCi0gODg4IDEyNGYgOEMxQzE3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkeCwxXCkKLSA4ODkgMTI1MiA4QzFDMTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJ4LDFcKQotIDg5MCAxMjU1IDhDMUMxOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsMVwpCi0gODkxIDEyNTggOEMxQzFBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVieCwxXCkKLSA4OTIgMTI1YiA4QzFDMUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJ4LDFcKQotIDg5MyAxMjVlIDNFOEMxQzFDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsMVwpCi0gODk0IDEyNjIgOEMxQzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJ4LDFcKQotIDg5NSAxMjY5IDhDMUMxRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYngsMVwpCi0gODk2IDEyNmMgOEMxQzFGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCwxXCkKLSA4OTcgMTI2ZiA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwxXCkKLSA4OTggMTI3MSA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwxXCkKLSA4OTkgMTI3MyA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwxXCkKLSA5MDAgMTI3NSA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwxXCkKLSA5MDEgMTI3NyAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwxXCkKLSA5MDIgMTI3YiA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDFcKQotIDkwMyAxMjgxIDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLDFcKQotIDkwNCAxMjgzIDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDFcKQotIDkwNSAxMjg1IDhDMUMyOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsMVwpCi0gOTA2IDEyODggOEMxQzI5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCwxXCkKLSA5MDcgMTI4YiA4QzFDMkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDFcKQotIDkwOCAxMjhlIDhDMUMyQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsMVwpCi0gOTA5IDEyOTEgM0U4QzFDMkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCwxXCkKLSA5MTAgMTI5NSA4QzFDMkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsMVwpCi0gOTExIDEyOWMgOEMxQzJFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCwxXCkKLSA5MTIgMTI5ZiA4QzFDMkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDFcKQotIDkxMyAxMmEyIDhDMUMzMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksMVwpCi0gOTE0IDEyYTUgOEMxQzMxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSwxXCkKLSA5MTUgMTJhOCA4QzFDMzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDFcKQotIDkxNiAxMmFiIDhDMUMzMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksMVwpCi0gOTE3IDEyYWUgM0U4QzFDMzQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSwxXCkKLSA5MTggMTJiMiA4QzFDMzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksMVwpCi0gOTE5IDEyYjkgOEMxQzM2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSwxXCkKLSA5MjAgMTJiYyA4QzFDMzcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDFcKQotIDkyMSAxMmJmIDhDMUMzOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksMVwpCi0gOTIyIDEyYzIgOEMxQzM5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSwxXCkKLSA5MjMgMTJjNSA4QzFDM0EgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDFcKQotIDkyNCAxMmM4IDhDMUMzQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksMVwpCi0gOTI1IDEyY2IgM0U4QzFDM0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSwxXCkKLSA5MjYgMTJjZiA4QzFDM0QwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksMVwpCi0gOTI3IDEyZDYgOEMxQzNFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSwxXCkKLSA5MjggMTJkOSA4QzFDM0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDFcKQotIDkyOSAxMmRjIDhDMUM0MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsMlwpCi0gOTMwIDEyZGYgOEMxQzQxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCwyXCkKLSA5MzEgMTJlMiA4QzFDNDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDJcKQotIDkzMiAxMmU1IDhDMUM0MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsMlwpCi0gOTMzIDEyZTggM0U4QzFDNDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCwyXCkKLSA5MzQgMTJlYyA4QzFDNDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsMlwpCi0gOTM1IDEyZjMgOEMxQzQ2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCwyXCkKLSA5MzYgMTJmNiA4QzFDNDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDJcKQotIDkzNyAxMmY5IDhDMUM0OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsMlwpCi0gOTM4IDEyZmMgOEMxQzQ5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCwyXCkKLSA5MzkgMTJmZiA4QzFDNEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDJcKQotIDk0MCAxMzAyIDhDMUM0QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsMlwpCi0gOTQxIDEzMDUgM0U4QzFDNEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCwyXCkKLSA5NDIgMTMwOSA4QzFDNEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsMlwpCi0gOTQzIDEzMTAgOEMxQzRFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCwyXCkKLSA5NDQgMTMxMyA4QzFDNEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDJcKQotIDk0NSAxMzE2IDhDMUM1MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsMlwpCi0gOTQ2IDEzMTkgOEMxQzUxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCwyXCkKLSA5NDcgMTMxYyA4QzFDNTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDJcKQotIDk0OCAxMzFmIDhDMUM1MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsMlwpCi0gOTQ5IDEzMjIgM0U4QzFDNTQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCwyXCkKLSA5NTAgMTMyNiA4QzFDNTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsMlwpCi0gOTUxIDEzMmQgOEMxQzU2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCwyXCkKLSA5NTIgMTMzMCA4QzFDNTcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDJcKQotIDk1MyAxMzMzIDhDMUM1OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsMlwpCi0gOTU0IDEzMzYgOEMxQzU5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCwyXCkKLSA5NTUgMTMzOSA4QzFDNUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDJcKQotIDk1NiAxMzNjIDhDMUM1QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsMlwpCi0gOTU3IDEzM2YgM0U4QzFDNUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCwyXCkKLSA5NTggMTM0MyA4QzFDNUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsMlwpCi0gOTU5IDEzNGEgOEMxQzVFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCwyXCkKLSA5NjAgMTM0ZCA4QzFDNUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDJcKQotIDk2MSAxMzUwIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gOTYyIDEzNTIgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSA5NjMgMTM1NCA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDk2NCAxMzU2IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gOTY1IDEzNTggM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSA5NjYgMTM1YyA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDJcKQotLipXYXJuaW5nOi4qCi0gOTY3IDEzNjIgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSA5NjggMTM2NCA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDk2OSAxMzY2IDhDMUM2OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsMlwpCi0gOTcwIDEzNjkgOEMxQzY5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCwyXCkKLSA5NzEgMTM2YyA4QzFDNkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDJcKQotIDk3MiAxMzZmIDhDMUM2QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsMlwpCi0gOTczIDEzNzIgM0U4QzFDNkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCwyXCkKLSA5NzQgMTM3NiA4QzFDNkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsMlwpCi0gOTc1IDEzN2QgOEMxQzZFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCwyXCkKLSA5NzYgMTM4MCA4QzFDNkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDJcKQotIDk3NyAxMzgzIDhDMUM3MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksMlwpCi0gOTc4IDEzODYgOEMxQzcxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSwyXCkKLSA5NzkgMTM4OSA4QzFDNzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDJcKQotIDk4MCAxMzhjIDhDMUM3MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksMlwpCi0gOTgxIDEzOGYgM0U4QzFDNzQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSwyXCkKLSA5ODIgMTM5MyA4QzFDNzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksMlwpCi0gOTgzIDEzOWEgOEMxQzc2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSwyXCkKLSA5ODQgMTM5ZCA4QzFDNzcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDJcKQotIDk4NSAxM2EwIDhDMUM3OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksMlwpCi0gOTg2IDEzYTMgOEMxQzc5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSwyXCkKLSA5ODcgMTNhNiA4QzFDN0EgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDJcKQotIDk4OCAxM2E5IDhDMUM3QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksMlwpCi0gOTg5IDEzYWMgM0U4QzFDN0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSwyXCkKLSA5OTAgMTNiMCA4QzFDN0QwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksMlwpCi0gOTkxIDEzYjcgOEMxQzdFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSwyXCkKLSA5OTIgMTNiYSA4QzFDN0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDJcKQotIDk5MyAxM2JkIDhDMUM4MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsNFwpCi0gOTk0IDEzYzAgOEMxQzgxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCw0XCkKLSA5OTUgMTNjMyA4QzFDODIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDRcKQotIDk5NiAxM2M2IDhDMUM4MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsNFwpCi0gOTk3IDEzYzkgM0U4QzFDODQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCw0XCkKLSA5OTggMTNjZCA4QzFDODUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsNFwpCi0gOTk5IDEzZDQgOEMxQzg2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCw0XCkKLSAxMDAwIDEzZDcgOEMxQzg3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCw0XCkKLSAxMDAxIDEzZGEgOEMxQzg4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCw0XCkKLSAxMDAyIDEzZGQgOEMxQzg5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCw0XCkKLSAxMDAzIDEzZTAgOEMxQzhBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCw0XCkKLSAxMDA0IDEzZTMgOEMxQzhCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCw0XCkKLSAxMDA1IDEzZTYgM0U4QzFDOEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCw0XCkKLSAxMDA2IDEzZWEgOEMxQzhEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDRcKQotIDEwMDcgMTNmMSA4QzFDOEUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDRcKQotIDEwMDggMTNmNCA4QzFDOEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDRcKQotIDEwMDkgMTNmNyA4QzFDOTAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDRcKQotIDEwMTAgMTNmYSA4QzFDOTEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDRcKQotIDEwMTEgMTNmZCA4QzFDOTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDRcKQotIDEwMTIgMTQwMCA4QzFDOTMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDRcKQotIDEwMTMgMTQwMyAzRThDMUM5NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDRcKQotIDEwMTQgMTQwNyA4QzFDOTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsNFwpCi0gMTAxNSAxNDBlIDhDMUM5NiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsNFwpCi0gMTAxNiAxNDExIDhDMUM5NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsNFwpCi0gMTAxNyAxNDE0IDhDMUM5OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsNFwpCi0gMTAxOCAxNDE3IDhDMUM5OSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsNFwpCi0gMTAxOSAxNDFhIDhDMUM5QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsNFwpCi0gMTAyMCAxNDFkIDhDMUM5QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsNFwpCi0gMTAyMSAxNDIwIDNFOEMxQzlDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsNFwpCi0gMTAyMiAxNDI0IDhDMUM5RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCw0XCkKLSAxMDIzIDE0MmIgOEMxQzlFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCw0XCkKLSAxMDI0IDE0MmUgOEMxQzlGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCw0XCkKLSAxMDI1IDE0MzEgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxMDI2IDE0MzMgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsNFwpCi0uKldhcm5pbmc6LioKLSAxMDI3IDE0MzUgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxMDI4IDE0MzcgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxMDI5IDE0MzkgM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsNFwpCi0uKldhcm5pbmc6LioKLSAxMDMwIDE0M2QgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczpcKCw0XCkKLS4qV2FybmluZzouKgotIDEwMzEgMTQ0MyA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDEwMzIgMTQ0NSA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDEwMzMgMTQ0NyA4QzFDQTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJwLDRcKQotIDEwMzQgMTQ0YSA4QzFDQTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDRcKQotIDEwMzUgMTQ0ZCA4QzFDQUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDRcKQotIDEwMzYgMTQ1MCA4QzFDQUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJwLDRcKQotIDEwMzcgMTQ1MyAzRThDMUNBQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDRcKQotIDEwMzggMTQ1NyA4QzFDQUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsNFwpCi0gMTAzOSAxNDVlIDhDMUNBRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYnAsNFwpCi0gMTA0MCAxNDYxIDhDMUNBRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsNFwpCi0gMTA0MSAxNDY0IDhDMUNCMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksNFwpCi0gMTA0MiAxNDY3IDhDMUNCMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlc2ksNFwpCi0gMTA0MyAxNDZhIDhDMUNCMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksNFwpCi0gMTA0NCAxNDZkIDhDMUNCMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksNFwpCi0gMTA0NSAxNDcwIDNFOEMxQ0I0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlc2ksNFwpCi0gMTA0NiAxNDc0IDhDMUNCNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSw0XCkKLSAxMDQ3IDE0N2IgOEMxQ0I2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSw0XCkKLSAxMDQ4IDE0N2UgOEMxQ0I3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVzaSw0XCkKLSAxMDQ5IDE0ODEgOEMxQ0I4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSw0XCkKLSAxMDUwIDE0ODQgOEMxQ0I5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSw0XCkKLSAxMDUxIDE0ODcgOEMxQ0JBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkaSw0XCkKLSAxMDUyIDE0OGEgOEMxQ0JCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSw0XCkKLSAxMDUzIDE0OGQgM0U4QzFDQkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSw0XCkKLSAxMDU0IDE0OTEgOEMxQ0JEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWRpLDRcKQotIDEwNTUgMTQ5OCA4QzFDQkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDRcKQotIDEwNTYgMTQ5YiA4QzFDQkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDRcKQotIDEwNTcgMTQ5ZSA4QzFDQzAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWF4LDhcKQotIDEwNTggMTRhMSA4QzFDQzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDhcKQotIDEwNTkgMTRhNCA4QzFDQzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDhcKQotIDEwNjAgMTRhNyA4QzFDQzMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWF4LDhcKQotIDEwNjEgMTRhYSAzRThDMUNDNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDhcKQotIDEwNjIgMTRhZSA4QzFDQzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsOFwpCi0gMTA2MyAxNGI1IDhDMUNDNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYXgsOFwpCi0gMTA2NCAxNGI4IDhDMUNDNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYXgsOFwpCi0gMTA2NSAxNGJiIDhDMUNDOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsOFwpCi0gMTA2NiAxNGJlIDhDMUNDOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlY3gsOFwpCi0gMTA2NyAxNGMxIDhDMUNDQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlY3gsOFwpCi0gMTA2OCAxNGM0IDhDMUNDQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsOFwpCi0gMTA2OSAxNGM3IDNFOEMxQ0NDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlY3gsOFwpCi0gMTA3MCAxNGNiIDhDMUNDRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVjeCw4XCkKLSAxMDcxIDE0ZDIgOEMxQ0NFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCw4XCkKLSAxMDcyIDE0ZDUgOEMxQ0NGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVjeCw4XCkKLSAxMDczIDE0ZDggOEMxQ0QwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkeCw4XCkKLSAxMDc0IDE0ZGIgOEMxQ0QxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCw4XCkKLSAxMDc1IDE0ZGUgOEMxQ0QyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkeCw4XCkKLSAxMDc2IDE0ZTEgOEMxQ0QzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkeCw4XCkKLSAxMDc3IDE0ZTQgM0U4QzFDRDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCw4XCkKLSAxMDc4IDE0ZTggOEMxQ0Q1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWR4LDhcKQotIDEwNzkgMTRlZiA4QzFDRDYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWR4LDhcKQotIDEwODAgMTRmMiA4QzFDRDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDhcKQotIDEwODEgMTRmNSA4QzFDRDggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJ4LDhcKQotIDEwODIgMTRmOCA4QzFDRDkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJ4LDhcKQotIDEwODMgMTRmYiA4QzFDREEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDhcKQotIDEwODQgMTRmZSA4QzFDREIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJ4LDhcKQotIDEwODUgMTUwMSAzRThDMUNEQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJ4LDhcKQotIDEwODYgMTUwNSA4QzFDREQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsOFwpCi0gMTA4NyAxNTBjIDhDMUNERSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYngsOFwpCi0gMTA4OCAxNTBmIDhDMUNERiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYngsOFwpCi0gMTA4OSAxNTEyIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMTA5MCAxNTE0IDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gMTA5MSAxNTE2IDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gMTA5MiAxNTE4IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMTA5MyAxNTFhIDNFOEMxQzI0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gMTA5NCAxNTFlIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsOFwpCi0uKldhcm5pbmc6LioKLSAxMDk1IDE1MjQgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksOFwpCi0uKldhcm5pbmc6LioKLSAxMDk2IDE1MjYgOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAxMDk3IDE1MjggOEMxQ0U4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCw4XCkKLSAxMDk4IDE1MmIgOEMxQ0U5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCw4XCkKLSAxMDk5IDE1MmUgOEMxQ0VBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVicCw4XCkKLSAxMTAwIDE1MzEgOEMxQ0VCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCw4XCkKLSAxMTAxIDE1MzQgM0U4QzFDRUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCw4XCkKLSAxMTAyIDE1MzggOEMxQ0VEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJwLDhcKQotIDExMDMgMTUzZiA4QzFDRUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDhcKQotIDExMDQgMTU0MiA4QzFDRUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDhcKQotIDExMDUgMTU0NSA4QzFDRjAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZXNpLDhcKQotIDExMDYgMTU0OCA4QzFDRjEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDhcKQotIDExMDcgMTU0YiA4QzFDRjIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDhcKQotIDExMDggMTU0ZSA4QzFDRjMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZXNpLDhcKQotIDExMDkgMTU1MSAzRThDMUNGNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDhcKQotIDExMTAgMTU1NSA4QzFDRjUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksOFwpCi0gMTExMSAxNTVjIDhDMUNGNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlc2ksOFwpCi0gMTExMiAxNTVmIDhDMUNGNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksOFwpCi0gMTExMyAxNTYyIDhDMUNGOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksOFwpCi0gMTExNCAxNTY1IDhDMUNGQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksOFwpCi0gMTExNSAxNTY4IDhDMUNGOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZGksOFwpCi0gMTExNiAxNTZiIDhDMUNGQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksOFwpCi0gMTExNyAxNTZlIDNFOEMxQ0ZDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZGksOFwpCi0gMTExOCAxNTcyIDhDMUNGRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSw4XCkKLSAxMTE5IDE1NzkgOEMxQ0ZFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSw4XCkKLSAxMTIwIDE1N2MgOEMxQ0ZGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkaSw4XCkKLSAxMTIxIDE1N2YgOEM1QzAwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsMVwpCi0gMTEyMiAxNTgzIDhDNUMwMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDFcKQotIDExMjMgMTU4NyA4QzVDMDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCwxXCkKLSAxMTI0IDE1OGIgOEM1QzAzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsMVwpCi0gMTEyNSAxNThmIDNFOEM1QzA0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDFcKQotIDExMjYgMTU5NCAzRThDNUMwNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCwxXCkKLSAxMTI3IDE1OTkgOEM1QzA2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsMVwpCi0gMTEyOCAxNTlkIDhDNUMwNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDFcKQotIDExMjkgMTVhMSA4QzVDMDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCwxXCkKLSAxMTMwIDE1YTUgOEM1QzA5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsMVwpCi0gMTEzMSAxNWE5IDhDNUMwQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDFcKQotIDExMzIgMTVhZCA4QzVDMEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCwxXCkKLSAxMTMzIDE1YjEgM0U4QzVDMEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsMVwpCi0gMTEzNCAxNWI2IDNFOEM1QzBEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDFcKQotIDExMzUgMTViYiA4QzVDMEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCwxXCkKLSAxMTM2IDE1YmYgOEM1QzBGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsMVwpCi0gMTEzNyAxNWMzIDhDNUMxMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDFcKQotIDExMzggMTVjNyA4QzVDMTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCwxXCkKLSAxMTM5IDE1Y2IgOEM1QzEyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsMVwpCi0gMTE0MCAxNWNmIDhDNUMxMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDFcKQotIDExNDEgMTVkMyAzRThDNUMxNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCwxXCkKLSAxMTQyIDE1ZDggM0U4QzVDMTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsMVwpCi0gMTE0MyAxNWRkIDhDNUMxNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDFcKQotIDExNDQgMTVlMSA4QzVDMTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCwxXCkKLSAxMTQ1IDE1ZTUgOEM1QzE4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsMVwpCi0gMTE0NiAxNWU5IDhDNUMxOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDFcKQotIDExNDcgMTVlZCA4QzVDMUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCwxXCkKLSAxMTQ4IDE1ZjEgOEM1QzFCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsMVwpCi0gMTE0OSAxNWY1IDNFOEM1QzFDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDFcKQotIDExNTAgMTVmYSAzRThDNUMxRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCwxXCkKLSAxMTUxIDE1ZmYgOEM1QzFFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsMVwpCi0gMTE1MiAxNjAzIDhDNUMxRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDFcKQotIDExNTMgMTYwNyA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsMVwpCi0gMTE1NCAxNjBhIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwxXCkKLSAxMTU1IDE2MGQgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDFcKQotIDExNTYgMTYxMCA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsMVwpCi0gMTE1NyAxNjEzIDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwxXCkKLSAxMTU4IDE2MTggM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDFcKQotIDExNTkgMTYxYyA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksMVwpCi0gMTE2MCAxNjFmIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwxXCkKLSAxMTYxIDE2MjIgOEM1QzI4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsMVwpCi0gMTE2MiAxNjI2IDhDNUMyOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDFcKQotIDExNjMgMTYyYSA4QzVDMkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCwxXCkKLSAxMTY0IDE2MmUgOEM1QzJCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsMVwpCi0gMTE2NSAxNjMyIDNFOEM1QzJDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDFcKQotIDExNjYgMTYzNyAzRThDNUMyRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCwxXCkKLSAxMTY3IDE2M2MgOEM1QzJFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsMVwpCi0gMTE2OCAxNjQwIDhDNUMyRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDFcKQotIDExNjkgMTY0NCA4QzVDMzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSwxXCkKLSAxMTcwIDE2NDggOEM1QzMxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksMVwpCi0gMTE3MSAxNjRjIDhDNUMzMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDFcKQotIDExNzIgMTY1MCA4QzVDMzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSwxXCkKLSAxMTczIDE2NTQgM0U4QzVDMzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksMVwpCi0gMTE3NCAxNjU5IDNFOEM1QzM1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDFcKQotIDExNzUgMTY1ZSA4QzVDMzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSwxXCkKLSAxMTc2IDE2NjIgOEM1QzM3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksMVwpCi0gMTE3NyAxNjY2IDhDNUMzODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDFcKQotIDExNzggMTY2YSA4QzVDMzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSwxXCkKLSAxMTc5IDE2NmUgOEM1QzNBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZGksMVwpCi0gMTE4MCAxNjcyIDhDNUMzQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDFcKQotIDExODEgMTY3NiAzRThDNUMzQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSwxXCkKLSAxMTgyIDE2N2IgM0U4QzVDM0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksMVwpCi0gMTE4MyAxNjgwIDhDNUMzRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDFcKQotIDExODQgMTY4NCA4QzVDM0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSwxXCkKLSAxMTg1IDE2ODggOEM1QzQwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsMlwpCi0gMTE4NiAxNjhjIDhDNUM0MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDJcKQotIDExODcgMTY5MCA4QzVDNDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCwyXCkKLSAxMTg4IDE2OTQgOEM1QzQzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsMlwpCi0gMTE4OSAxNjk4IDNFOEM1QzQ0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDJcKQotIDExOTAgMTY5ZCAzRThDNUM0NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCwyXCkKLSAxMTkxIDE2YTIgOEM1QzQ2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsMlwpCi0gMTE5MiAxNmE2IDhDNUM0NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDJcKQotIDExOTMgMTZhYSA4QzVDNDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCwyXCkKLSAxMTk0IDE2YWUgOEM1QzQ5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsMlwpCi0gMTE5NSAxNmIyIDhDNUM0QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDJcKQotIDExOTYgMTZiNiA4QzVDNEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCwyXCkKLSAxMTk3IDE2YmEgM0U4QzVDNEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsMlwpCi0gMTE5OCAxNmJmIDNFOEM1QzREIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDJcKQotIDExOTkgMTZjNCA4QzVDNEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCwyXCkKLSAxMjAwIDE2YzggOEM1QzRGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsMlwpCi0gMTIwMSAxNmNjIDhDNUM1MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDJcKQotIDEyMDIgMTZkMCA4QzVDNTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCwyXCkKLSAxMjAzIDE2ZDQgOEM1QzUyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsMlwpCi0gMTIwNCAxNmQ4IDhDNUM1MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDJcKQotIDEyMDUgMTZkYyAzRThDNUM1NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCwyXCkKLSAxMjA2IDE2ZTEgM0U4QzVDNTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsMlwpCi0gMTIwNyAxNmU2IDhDNUM1NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDJcKQotIDEyMDggMTZlYSA4QzVDNTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCwyXCkKLSAxMjA5IDE2ZWUgOEM1QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsMlwpCi0gMTIxMCAxNmYyIDhDNUM1OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDJcKQotIDEyMTEgMTZmNiA4QzVDNUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCwyXCkKLSAxMjEyIDE2ZmEgOEM1QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsMlwpCi0gMTIxMyAxNmZlIDNFOEM1QzVDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDJcKQotIDEyMTQgMTcwMyAzRThDNUM1RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCwyXCkKLSAxMjE1IDE3MDggOEM1QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsMlwpCi0gMTIxNiAxNzBjIDhDNUM1RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDJcKQotIDEyMTcgMTcxMCA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSAxMjE4IDE3MTMgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gMTIxOSAxNzE2IDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDEyMjAgMTcxOSA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSAxMjIxIDE3MWMgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMiAxNzIxIDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDEyMjMgMTcyNSA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSAxMjI0IDE3MjggOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gMTIyNSAxNzJiIDhDNUM2ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJwLDJcKQotIDEyMjYgMTcyZiA4QzVDNjkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVicCwyXCkKLSAxMjI3IDE3MzMgOEM1QzZBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYnAsMlwpCi0gMTIyOCAxNzM3IDhDNUM2QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJwLDJcKQotIDEyMjkgMTczYiAzRThDNUM2QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVicCwyXCkKLSAxMjMwIDE3NDAgM0U4QzVDNkQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYnAsMlwpCi0gMTIzMSAxNzQ1IDhDNUM2RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJwLDJcKQotIDEyMzIgMTc0OSA4QzVDNkYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVicCwyXCkKLSAxMjMzIDE3NGQgOEM1QzcwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlc2ksMlwpCi0gMTIzNCAxNzUxIDhDNUM3MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZXNpLDJcKQotIDEyMzUgMTc1NSA4QzVDNzIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVzaSwyXCkKLSAxMjM2IDE3NTkgOEM1QzczMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlc2ksMlwpCi0gMTIzNyAxNzVkIDNFOEM1Qzc0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZXNpLDJcKQotIDEyMzggMTc2MiAzRThDNUM3NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVzaSwyXCkKLSAxMjM5IDE3NjcgOEM1Qzc2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlc2ksMlwpCi0gMTI0MCAxNzZiIDhDNUM3NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZXNpLDJcKQotIDEyNDEgMTc2ZiA4QzVDNzgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkaSwyXCkKLSAxMjQyIDE3NzMgOEM1Qzc5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksMlwpCi0gMTI0MyAxNzc3IDhDNUM3QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDJcKQotIDEyNDQgMTc3YiA4QzVDN0IxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkaSwyXCkKLSAxMjQ1IDE3N2YgM0U4QzVDN0MgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZGksMlwpCi0gMTI0NiAxNzg0IDNFOEM1QzdEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWRpLDJcKQotIDEyNDcgMTc4OSA4QzVDN0UxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkaSwyXCkKLSAxMjQ4IDE3OGQgOEM1QzdGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZGksMlwpCi0gMTI0OSAxNzkxIDhDNUM4MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWF4LDRcKQotIDEyNTAgMTc5NSA4QzVDODExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVheCw0XCkKLSAxMjUxIDE3OTkgOEM1QzgyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYXgsNFwpCi0gMTI1MiAxNzlkIDhDNUM4MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWF4LDRcKQotIDEyNTMgMTdhMSAzRThDNUM4NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVheCw0XCkKLSAxMjU0IDE3YTYgM0U4QzVDODUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYXgsNFwpCi0gMTI1NSAxN2FiIDhDNUM4NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWF4LDRcKQotIDEyNTYgMTdhZiA4QzVDODcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVheCw0XCkKLSAxMjU3IDE3YjMgOEM1Qzg4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlY3gsNFwpCi0gMTI1OCAxN2I3IDhDNUM4OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWN4LDRcKQotIDEyNTkgMTdiYiA4QzVDOEExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVjeCw0XCkKLSAxMjYwIDE3YmYgOEM1QzhCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlY3gsNFwpCi0gMTI2MSAxN2MzIDNFOEM1QzhDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWN4LDRcKQotIDEyNjIgMTdjOCAzRThDNUM4RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVjeCw0XCkKLSAxMjYzIDE3Y2QgOEM1QzhFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlY3gsNFwpCi0gMTI2NCAxN2QxIDhDNUM4RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWN4LDRcKQotIDEyNjUgMTdkNSA4QzVDOTAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkeCw0XCkKLSAxMjY2IDE3ZDkgOEM1QzkxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZHgsNFwpCi0gMTI2NyAxN2RkIDhDNUM5MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWR4LDRcKQotIDEyNjggMTdlMSA4QzVDOTMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkeCw0XCkKLSAxMjY5IDE3ZTUgM0U4QzVDOTQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZHgsNFwpCi0gMTI3MCAxN2VhIDNFOEM1Qzk1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWR4LDRcKQotIDEyNzEgMTdlZiA4QzVDOTYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkeCw0XCkKLSAxMjcyIDE3ZjMgOEM1Qzk3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZHgsNFwpCi0gMTI3MyAxN2Y3IDhDNUM5ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJ4LDRcKQotIDEyNzQgMTdmYiA4QzVDOTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVieCw0XCkKLSAxMjc1IDE3ZmYgOEM1QzlBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYngsNFwpCi0gMTI3NiAxODAzIDhDNUM5QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJ4LDRcKQotIDEyNzcgMTgwNyAzRThDNUM5QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVieCw0XCkKLSAxMjc4IDE4MGMgM0U4QzVDOUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYngsNFwpCi0gMTI3OSAxODExIDhDNUM5RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJ4LDRcKQotIDEyODAgMTgxNSA4QzVDOUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVieCw0XCkKLSAxMjgxIDE4MTkgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gMTI4MiAxODFjIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDEyODMgMTgxZiA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxMjg0IDE4MjIgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gMTI4NSAxODI1IDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDEyODYgMTgyYSAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSAxMjg3IDE4MmUgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4OCAxODMxIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDEyODkgMTgzNCA4QzVDQTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCw0XCkKLSAxMjkwIDE4MzggOEM1Q0E5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsNFwpCi0gMTI5MSAxODNjIDhDNUNBQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDRcKQotIDEyOTIgMTg0MCA4QzVDQUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCw0XCkKLSAxMjkzIDE4NDQgM0U4QzVDQUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsNFwpCi0gMTI5NCAxODQ5IDNFOEM1Q0FEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDRcKQotIDEyOTUgMTg0ZSA4QzVDQUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCw0XCkKLSAxMjk2IDE4NTIgOEM1Q0FGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsNFwpCi0gMTI5NyAxODU2IDhDNUNCMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDRcKQotIDEyOTggMTg1YSA4QzVDQjExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSw0XCkKLSAxMjk5IDE4NWUgOEM1Q0IyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksNFwpCi0gMTMwMCAxODYyIDhDNUNCMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDRcKQotIDEzMDEgMTg2NiAzRThDNUNCNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSw0XCkKLSAxMzAyIDE4NmIgM0U4QzVDQjUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksNFwpCi0gMTMwMyAxODcwIDhDNUNCNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDRcKQotIDEzMDQgMTg3NCA4QzVDQjcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSw0XCkKLSAxMzA1IDE4NzggOEM1Q0I4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksNFwpCi0gMTMwNiAxODdjIDhDNUNCOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWRpLDRcKQotIDEzMDcgMTg4MCA4QzVDQkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSw0XCkKLSAxMzA4IDE4ODQgOEM1Q0JCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksNFwpCi0gMTMwOSAxODg4IDNFOEM1Q0JDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDRcKQotIDEzMTAgMTg4ZCAzRThDNUNCRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSw0XCkKLSAxMzExIDE4OTIgOEM1Q0JFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksNFwpCi0gMTMxMiAxODk2IDhDNUNCRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDRcKQotIDEzMTMgMTg5YSA4QzVDQzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCw4XCkKLSAxMzE0IDE4OWUgOEM1Q0MxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsOFwpCi0gMTMxNSAxOGEyIDhDNUNDMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDhcKQotIDEzMTYgMThhNiA4QzVDQzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCw4XCkKLSAxMzE3IDE4YWEgM0U4QzVDQzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsOFwpCi0gMTMxOCAxOGFmIDNFOEM1Q0M1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDhcKQotIDEzMTkgMThiNCA4QzVDQzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCw4XCkKLSAxMzIwIDE4YjggOEM1Q0M3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsOFwpCi0gMTMyMSAxOGJjIDhDNUNDODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDhcKQotIDEzMjIgMThjMCA4QzVDQzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCw4XCkKLSAxMzIzIDE4YzQgOEM1Q0NBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsOFwpCi0gMTMyNCAxOGM4IDhDNUNDQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDhcKQotIDEzMjUgMThjYyAzRThDNUNDQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCw4XCkKLSAxMzI2IDE4ZDEgM0U4QzVDQ0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsOFwpCi0gMTMyNyAxOGQ2IDhDNUNDRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDhcKQotIDEzMjggMThkYSA4QzVDQ0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCw4XCkKLSAxMzI5IDE4ZGUgOEM1Q0QwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsOFwpCi0gMTMzMCAxOGUyIDhDNUNEMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDhcKQotIDEzMzEgMThlNiA4QzVDRDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCw4XCkKLSAxMzMyIDE4ZWEgOEM1Q0QzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsOFwpCi0gMTMzMyAxOGVlIDNFOEM1Q0Q0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDhcKQotIDEzMzQgMThmMyAzRThDNUNENSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCw4XCkKLSAxMzM1IDE4ZjggOEM1Q0Q2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsOFwpCi0gMTMzNiAxOGZjIDhDNUNENzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDhcKQotIDEzMzcgMTkwMCA4QzVDRDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCw4XCkKLSAxMzM4IDE5MDQgOEM1Q0Q5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsOFwpCi0gMTMzOSAxOTA4IDhDNUNEQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDhcKQotIDEzNDAgMTkwYyA4QzVDREIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCw4XCkKLSAxMzQxIDE5MTAgM0U4QzVDREMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsOFwpCi0gMTM0MiAxOTE1IDNFOEM1Q0REIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDhcKQotIDEzNDMgMTkxYSA4QzVDREUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCw4XCkKLSAxMzQ0IDE5MWUgOEM1Q0RGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsOFwpCi0gMTM0NSAxOTIyIDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDEzNDYgMTkyNSA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSAxMzQ3IDE5MjggOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0OCAxOTJiIDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDEzNDkgMTkyZSAzRThDNUMyNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSAxMzUwIDE5MzMgM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gMTM1MSAxOTM3IDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDEzNTIgMTkzYSA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAxMzUzIDE5M2QgOEM1Q0U4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsOFwpCi0gMTM1NCAxOTQxIDhDNUNFOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDhcKQotIDEzNTUgMTk0NSA4QzVDRUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCw4XCkKLSAxMzU2IDE5NDkgOEM1Q0VCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsOFwpCi0gMTM1NyAxOTRkIDNFOEM1Q0VDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDhcKQotIDEzNTggMTk1MiAzRThDNUNFRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCw4XCkKLSAxMzU5IDE5NTcgOEM1Q0VFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsOFwpCi0gMTM2MCAxOTViIDhDNUNFRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDhcKQotIDEzNjEgMTk1ZiA4QzVDRjAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSw4XCkKLSAxMzYyIDE5NjMgOEM1Q0YxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksOFwpCi0gMTM2MyAxOTY3IDhDNUNGMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDhcKQotIDEzNjQgMTk2YiA4QzVDRjMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSw4XCkKLSAxMzY1IDE5NmYgM0U4QzVDRjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksOFwpCi0gMTM2NiAxOTc0IDNFOEM1Q0Y1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDhcKQotIDEzNjcgMTk3OSA4QzVDRjYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSw4XCkKLSAxMzY4IDE5N2QgOEM1Q0Y3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksOFwpCi0gMTM2OSAxOTgxIDhDNUNGODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDhcKQotIDEzNzAgMTk4NSA4QzVDRkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSw4XCkKLSAxMzcxIDE5ODkgOEM1Q0Y5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksOFwpCi0gMTM3MiAxOThkIDhDNUNGQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDhcKQotIDEzNzMgMTk5MSAzRThDNUNGQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSw4XCkKLSAxMzc0IDE5OTYgM0U4QzVDRkQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksOFwpCi0gMTM3NSAxOTliIDhDNUNGRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDhcKQotIDEzNzYgMTk5ZiA4QzVDRkYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSw4XCkKLSAxMzc3IDE5YTMgOEM5QzAwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMVwpCi0gMTM3OCAxOWFhIDhDOUMwMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDFcKQotIDEzNzkgMTliMSA4QzlDMDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwxXCkKLSAxMzgwIDE5YjggOEM5QzAzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMVwpCi0gMTM4MSAxOWJmIDNFOEM5QzA0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDFcKQotIDEzODIgMTljNyAzRThDOUMwNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwxXCkKLSAxMzgzIDE5Y2YgOEM5QzA2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMVwpCi0gMTM4NCAxOWQ2IDhDOUMwNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDFcKQotIDEzODUgMTlkZCA4QzlDMDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwxXCkKLSAxMzg2IDE5ZTQgOEM5QzA5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMVwpCi0gMTM4NyAxOWViIDhDOUMwQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDFcKQotIDEzODggMTlmMiA4QzlDMEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwxXCkKLSAxMzg5IDE5ZjkgM0U4QzlDMEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMVwpCi0gMTM5MCAxYTAxIDNFOEM5QzBEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDFcKQotIDEzOTEgMWEwOSA4QzlDMEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwxXCkKLSAxMzkyIDFhMTAgOEM5QzBGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMVwpCi0gMTM5MyAxYTE3IDhDOUMxMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDFcKQotIDEzOTQgMWExZSA4QzlDMTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwxXCkKLSAxMzk1IDFhMjUgOEM5QzEyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMVwpCi0gMTM5NiAxYTJjIDhDOUMxMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDFcKQotIDEzOTcgMWEzMyAzRThDOUMxNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwxXCkKLSAxMzk4IDFhM2IgM0U4QzlDMTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMVwpCi0gMTM5OSAxYTQzIDhDOUMxNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDFcKQotIDE0MDAgMWE0YSA4QzlDMTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwxXCkKLSAxNDAxIDFhNTEgOEM5QzE4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMVwpCi0gMTQwMiAxYTU4IDhDOUMxOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDFcKQotIDE0MDMgMWE1ZiA4QzlDMUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwxXCkKLSAxNDA0IDFhNjYgOEM5QzFCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMVwpCi0gMTQwNSAxYTZkIDNFOEM5QzFDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDFcKQotIDE0MDYgMWE3NSAzRThDOUMxRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwxXCkKLSAxNDA3IDFhN2QgOEM5QzFFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMVwpCi0gMTQwOCAxYTg0IDhDOUMxRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDFcKQotIDE0MDkgMWE4YiA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsMVwpCi0gMTQxMCAxYTkxIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwxXCkKLSAxNDExIDFhOTcgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDFcKQotIDE0MTIgMWE5ZCA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsMVwpCi0gMTQxMyAxYWEzIDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwxXCkKLSAxNDE0IDFhYWIgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDFcKQotIDE0MTUgMWFiMiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksMVwpCi0gMTQxNiAxYWI4IDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwxXCkKLSAxNDE3IDFhYmUgOEM5QzI4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMVwpCi0gMTQxOCAxYWM1IDhDOUMyOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDFcKQotIDE0MTkgMWFjYyA4QzlDMkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCwxXCkKLSAxNDIwIDFhZDMgOEM5QzJCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMVwpCi0gMTQyMSAxYWRhIDNFOEM5QzJDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDFcKQotIDE0MjIgMWFlMiAzRThDOUMyRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCwxXCkKLSAxNDIzIDFhZWEgOEM5QzJFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMVwpCi0gMTQyNCAxYWYxIDhDOUMyRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDFcKQotIDE0MjUgMWFmOCA4QzlDMzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSwxXCkKLSAxNDI2IDFhZmYgOEM5QzMxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMVwpCi0gMTQyNyAxYjA2IDhDOUMzMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDFcKQotIDE0MjggMWIwZCA4QzlDMzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSwxXCkKLSAxNDI5IDFiMTQgM0U4QzlDMzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMVwpCi0gMTQzMCAxYjFjIDNFOEM5QzM1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDFcKQotIDE0MzEgMWIyNCA4QzlDMzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSwxXCkKLSAxNDMyIDFiMmIgOEM5QzM3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMVwpCi0gMTQzMyAxYjMyIDhDOUMzODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDFcKQotIDE0MzQgMWIzOSA4QzlDMzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSwxXCkKLSAxNDM1IDFiNDAgOEM5QzNBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMVwpCi0gMTQzNiAxYjQ3IDhDOUMzQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDFcKQotIDE0MzcgMWI0ZSAzRThDOUMzQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSwxXCkKLSAxNDM4IDFiNTYgM0U4QzlDM0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMVwpCi0gMTQzOSAxYjVlIDhDOUMzRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDFcKQotIDE0NDAgMWI2NSA4QzlDM0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSwxXCkKLSAxNDQxIDFiNmMgOEM5QzQwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMlwpCi0gMTQ0MiAxYjczIDhDOUM0MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDJcKQotIDE0NDMgMWI3YSA4QzlDNDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwyXCkKLSAxNDQ0IDFiODEgOEM5QzQzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMlwpCi0gMTQ0NSAxYjg4IDNFOEM5QzQ0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDJcKQotIDE0NDYgMWI5MCAzRThDOUM0NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwyXCkKLSAxNDQ3IDFiOTggOEM5QzQ2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMlwpCi0gMTQ0OCAxYjlmIDhDOUM0Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDJcKQotIDE0NDkgMWJhNiA4QzlDNDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwyXCkKLSAxNDUwIDFiYWQgOEM5QzQ5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMlwpCi0gMTQ1MSAxYmI0IDhDOUM0QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDJcKQotIDE0NTIgMWJiYiA4QzlDNEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwyXCkKLSAxNDUzIDFiYzIgM0U4QzlDNEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMlwpCi0gMTQ1NCAxYmNhIDNFOEM5QzREIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDJcKQotIDE0NTUgMWJkMiA4QzlDNEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwyXCkKLSAxNDU2IDFiZDkgOEM5QzRGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMlwpCi0gMTQ1NyAxYmUwIDhDOUM1MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDJcKQotIDE0NTggMWJlNyA4QzlDNTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwyXCkKLSAxNDU5IDFiZWUgOEM5QzUyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMlwpCi0gMTQ2MCAxYmY1IDhDOUM1Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDJcKQotIDE0NjEgMWJmYyAzRThDOUM1NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwyXCkKLSAxNDYyIDFjMDQgM0U4QzlDNTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMlwpCi0gMTQ2MyAxYzBjIDhDOUM1Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDJcKQotIDE0NjQgMWMxMyA4QzlDNTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwyXCkKLSAxNDY1IDFjMWEgOEM5QzU4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMlwpCi0gMTQ2NiAxYzIxIDhDOUM1OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDJcKQotIDE0NjcgMWMyOCA4QzlDNUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwyXCkKLSAxNDY4IDFjMmYgOEM5QzVCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMlwpCi0gMTQ2OSAxYzM2IDNFOEM5QzVDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDJcKQotIDE0NzAgMWMzZSAzRThDOUM1RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwyXCkKLSAxNDcxIDFjNDYgOEM5QzVFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMlwpCi0gMTQ3MiAxYzRkIDhDOUM1Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDJcKQotIDE0NzMgMWM1NCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc0IDFjNWEgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3NSAxYzYwIDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDE0NzYgMWM2NiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc3IDFjNmMgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3OCAxYzc0IDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDE0NzkgMWM3YiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSAxNDgwIDFjODEgOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gMTQ4MSAxYzg3IDhDOUM2ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDJcKQotIDE0ODIgMWM4ZSA4QzlDNjk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCwyXCkKLSAxNDgzIDFjOTUgOEM5QzZBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMlwpCi0gMTQ4NCAxYzljIDhDOUM2Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDJcKQotIDE0ODUgMWNhMyAzRThDOUM2QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCwyXCkKLSAxNDg2IDFjYWIgM0U4QzlDNkQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMlwpCi0gMTQ4NyAxY2IzIDhDOUM2RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDJcKQotIDE0ODggMWNiYSA4QzlDNkY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVicCwyXCkKLSAxNDg5IDFjYzEgOEM5QzcwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMlwpCi0gMTQ5MCAxY2M4IDhDOUM3MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDJcKQotIDE0OTEgMWNjZiA4QzlDNzI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSwyXCkKLSAxNDkyIDFjZDYgOEM5QzczNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMlwpCi0gMTQ5MyAxY2RkIDNFOEM5Qzc0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDJcKQotIDE0OTQgMWNlNSAzRThDOUM3NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSwyXCkKLSAxNDk1IDFjZWQgOEM5Qzc2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMlwpCi0gMTQ5NiAxY2Y0IDhDOUM3Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDJcKQotIDE0OTcgMWNmYiA4QzlDNzg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSwyXCkKLSAxNDk4IDFkMDIgOEM5Qzc5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMlwpCi0gMTQ5OSAxZDA5IDhDOUM3QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDJcKQotIDE1MDAgMWQxMCA4QzlDN0I3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSwyXCkKLSAxNTAxIDFkMTcgM0U4QzlDN0MgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMlwpCi0gMTUwMiAxZDFmIDNFOEM5QzdEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDJcKQotIDE1MDMgMWQyNyA4QzlDN0U3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSwyXCkKLSAxNTA0IDFkMmUgOEM5QzdGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMlwpCi0gMTUwNSAxZDM1IDhDOUM4MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDRcKQotIDE1MDYgMWQzYyA4QzlDODE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCw0XCkKLSAxNTA3IDFkNDMgOEM5QzgyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsNFwpCi0gMTUwOCAxZDRhIDhDOUM4Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDRcKQotIDE1MDkgMWQ1MSAzRThDOUM4NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCw0XCkKLSAxNTEwIDFkNTkgM0U4QzlDODUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsNFwpCi0gMTUxMSAxZDYxIDhDOUM4Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDRcKQotIDE1MTIgMWQ2OCA4QzlDODc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVheCw0XCkKLSAxNTEzIDFkNmYgOEM5Qzg4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsNFwpCi0gMTUxNCAxZDc2IDhDOUM4OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDRcKQotIDE1MTUgMWQ3ZCA4QzlDOEE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCw0XCkKLSAxNTE2IDFkODQgOEM5QzhCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsNFwpCi0gMTUxNyAxZDhiIDNFOEM5QzhDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDRcKQotIDE1MTggMWQ5MyAzRThDOUM4RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCw0XCkKLSAxNTE5IDFkOWIgOEM5QzhFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsNFwpCi0gMTUyMCAxZGEyIDhDOUM4Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDRcKQotIDE1MjEgMWRhOSA4QzlDOTA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCw0XCkKLSAxNTIyIDFkYjAgOEM5QzkxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsNFwpCi0gMTUyMyAxZGI3IDhDOUM5Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDRcKQotIDE1MjQgMWRiZSA4QzlDOTM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCw0XCkKLSAxNTI1IDFkYzUgM0U4QzlDOTQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsNFwpCi0gMTUyNiAxZGNkIDNFOEM5Qzk1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDRcKQotIDE1MjcgMWRkNSA4QzlDOTY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCw0XCkKLSAxNTI4IDFkZGMgOEM5Qzk3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsNFwpCi0gMTUyOSAxZGUzIDhDOUM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDRcKQotIDE1MzAgMWRlYSA4QzlDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCw0XCkKLSAxNTMxIDFkZjEgOEM5QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYngsNFwpCi0gMTUzMiAxZGY4IDhDOUM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDRcKQotIDE1MzMgMWRmZiAzRThDOUM5QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCw0XCkKLSAxNTM0IDFlMDcgM0U4QzlDOUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYngsNFwpCi0gMTUzNSAxZTBmIDhDOUM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDRcKQotIDE1MzYgMWUxNiA4QzlDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVieCw0XCkKLSAxNTM3IDFlMWQgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gMTUzOCAxZTIzIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDE1MzkgMWUyOSA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxNTQwIDFlMmYgOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gMTU0MSAxZTM1IDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDE1NDIgMWUzZCAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSAxNTQzIDFlNDQgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0NCAxZTRhIDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDE1NDUgMWU1MCA4QzlDQTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCw0XCkKLSAxNTQ2IDFlNTcgOEM5Q0E5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsNFwpCi0gMTU0NyAxZTVlIDhDOUNBQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDRcKQotIDE1NDggMWU2NSA4QzlDQUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCw0XCkKLSAxNTQ5IDFlNmMgM0U4QzlDQUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsNFwpCi0gMTU1MCAxZTc0IDNFOEM5Q0FEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDRcKQotIDE1NTEgMWU3YyA4QzlDQUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCw0XCkKLSAxNTUyIDFlODMgOEM5Q0FGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsNFwpCi0gMTU1MyAxZThhIDhDOUNCMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDRcKQotIDE1NTQgMWU5MSA4QzlDQjE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSw0XCkKLSAxNTU1IDFlOTggOEM5Q0IyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksNFwpCi0gMTU1NiAxZTlmIDhDOUNCMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDRcKQotIDE1NTcgMWVhNiAzRThDOUNCNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSw0XCkKLSAxNTU4IDFlYWUgM0U4QzlDQjUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksNFwpCi0gMTU1OSAxZWI2IDhDOUNCNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDRcKQotIDE1NjAgMWViZCA4QzlDQjc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSw0XCkKLSAxNTYxIDFlYzQgOEM5Q0I4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksNFwpCi0gMTU2MiAxZWNiIDhDOUNCOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDRcKQotIDE1NjMgMWVkMiA4QzlDQkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSw0XCkKLSAxNTY0IDFlZDkgOEM5Q0JCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksNFwpCi0gMTU2NSAxZWUwIDNFOEM5Q0JDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDRcKQotIDE1NjYgMWVlOCAzRThDOUNCRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSw0XCkKLSAxNTY3IDFlZjAgOEM5Q0JFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksNFwpCi0gMTU2OCAxZWY3IDhDOUNCRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDRcKQotIDE1NjkgMWVmZSA4QzlDQzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCw4XCkKLSAxNTcwIDFmMDUgOEM5Q0MxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsOFwpCi0gMTU3MSAxZjBjIDhDOUNDMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDhcKQotIDE1NzIgMWYxMyA4QzlDQzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCw4XCkKLSAxNTczIDFmMWEgM0U4QzlDQzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsOFwpCi0gMTU3NCAxZjIyIDNFOEM5Q0M1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDhcKQotIDE1NzUgMWYyYSA4QzlDQzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCw4XCkKLSAxNTc2IDFmMzEgOEM5Q0M3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsOFwpCi0gMTU3NyAxZjM4IDhDOUNDODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDhcKQotIDE1NzggMWYzZiA4QzlDQzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCw4XCkKLSAxNTc5IDFmNDYgOEM5Q0NBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsOFwpCi0gMTU4MCAxZjRkIDhDOUNDQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDhcKQotIDE1ODEgMWY1NCAzRThDOUNDQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCw4XCkKLSAxNTgyIDFmNWMgM0U4QzlDQ0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsOFwpCi0gMTU4MyAxZjY0IDhDOUNDRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDhcKQotIDE1ODQgMWY2YiA4QzlDQ0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCw4XCkKLSAxNTg1IDFmNzIgOEM5Q0QwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsOFwpCi0gMTU4NiAxZjc5IDhDOUNEMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDhcKQotIDE1ODcgMWY4MCA4QzlDRDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCw4XCkKLSAxNTg4IDFmODcgOEM5Q0QzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsOFwpCi0gMTU4OSAxZjhlIDNFOEM5Q0Q0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDhcKQotIDE1OTAgMWY5NiAzRThDOUNENSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCw4XCkKLSAxNTkxIDFmOWUgOEM5Q0Q2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsOFwpCi0gMTU5MiAxZmE1IDhDOUNENzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDhcKQotIDE1OTMgMWZhYyA4QzlDRDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCw4XCkKLSAxNTk0IDFmYjMgOEM5Q0Q5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsOFwpCi0gMTU5NSAxZmJhIDhDOUNEQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDhcKQotIDE1OTYgMWZjMSA4QzlDREI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCw4XCkKLSAxNTk3IDFmYzggM0U4QzlDREMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsOFwpCi0gMTU5OCAxZmQwIDNFOEM5Q0REIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDhcKQotIDE1OTkgMWZkOCA4QzlDREU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCw4XCkKLSAxNjAwIDFmZGYgOEM5Q0RGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsOFwpCi0gMTYwMSAxZmU2IDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDE2MDIgMWZlYyA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSAxNjAzIDFmZjIgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwNCAxZmY4IDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDE2MDUgMWZmZSAzRThDOUMyNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA2IDIwMDYgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gMTYwNyAyMDBkIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDE2MDggMjAxMyA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAxNjA5IDIwMTkgOEM5Q0U4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsOFwpCi0gMTYxMCAyMDIwIDhDOUNFOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDhcKQotIDE2MTEgMjAyNyA4QzlDRUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCw4XCkKLSAxNjEyIDIwMmUgOEM5Q0VCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsOFwpCi0gMTYxMyAyMDM1IDNFOEM5Q0VDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDhcKQotIDE2MTQgMjAzZCAzRThDOUNFRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCw4XCkKLSAxNjE1IDIwNDUgOEM5Q0VFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsOFwpCi0gMTYxNiAyMDRjIDhDOUNFRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDhcKQotIDE2MTcgMjA1MyA4QzlDRjA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSw4XCkKLSAxNjE4IDIwNWEgOEM5Q0YxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksOFwpCi0gMTYxOSAyMDYxIDhDOUNGMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDhcKQotIDE2MjAgMjA2OCA4QzlDRjM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSw4XCkKLSAxNjIxIDIwNmYgM0U4QzlDRjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksOFwpCi0gMTYyMiAyMDc3IDNFOEM5Q0Y1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDhcKQotIDE2MjMgMjA3ZiA4QzlDRjY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSw4XCkKLSAxNjI0IDIwODYgOEM5Q0Y3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksOFwpCi0gMTYyNSAyMDhkIDhDOUNGODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDhcKQotIDE2MjYgMjA5NCA4QzlDRkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSw4XCkKLSAxNjI3IDIwOWIgOEM5Q0Y5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksOFwpCi0gMTYyOCAyMGEyIDhDOUNGQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDhcKQotIDE2MjkgMjBhOSAzRThDOUNGQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSw4XCkKLSAxNjMwIDIwYjEgM0U4QzlDRkQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksOFwpCi0gMTYzMSAyMGI5IDhDOUNGRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDhcKQotIDE2MzIgMjBjMCA4QzlDRkY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSw4XCkKLSAxNjMzIDIwYzcgM0U4QzVDMDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCwxXCkKLSAxNjM0IDIwY2MgM0U4QzVDMEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCwxXCkKLSAxNjM1IDIwZDEgM0U4QzVDMTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCwxXCkKLSAxNjM2IDIwZDYgM0U4QzVDMUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCwxXCkKLSAxNjM3IDIwZGIgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsMVwpCi0gMTYzOCAyMGRmIDNFOEM1QzJEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsMVwpCi0gMTYzOSAyMGU0IDNFOEM1QzM1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksMVwpCi0gMTY0MCAyMGU5IDNFOEM1QzNEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksMVwpCi0gMTY0MSAyMGVlIDNFOEM1QzQ1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsMlwpCi0gMTY0MiAyMGYzIDNFOEM1QzREIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsMlwpCi0gMTY0MyAyMGY4IDNFOEM1QzU1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsMlwpCi0gMTY0NCAyMGZkIDNFOEM1QzVEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsMlwpCi0gMTY0NSAyMTAyIDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMTY0NiAyMTA2IDNFOEM1QzZEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsMlwpCi0gMTY0NyAyMTBiIDNFOEM1Qzc1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksMlwpCi0gMTY0OCAyMTEwIDNFOEM1QzdEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksMlwpCi0gMTY0OSAyMTE1IDNFOEM1Qzg1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsNFwpCi0gMTY1MCAyMTFhIDNFOEM1QzhEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsNFwpCi0gMTY1MSAyMTFmIDNFOEM1Qzk1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsNFwpCi0gMTY1MiAyMTI0IDNFOEM1QzlEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsNFwpCi0gMTY1MyAyMTI5IDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gMTY1NCAyMTJkIDNFOEM1Q0FEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsNFwpCi0gMTY1NSAyMTMyIDNFOEM1Q0I1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksNFwpCi0gMTY1NiAyMTM3IDNFOEM1Q0JEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksNFwpCi0gMTY1NyAyMTNjIDNFOEM1Q0M1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsOFwpCi0gMTY1OCAyMTQxIDNFOEM1Q0NEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsOFwpCi0gMTY1OSAyMTQ2IDNFOEM1Q0Q1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsOFwpCi0gMTY2MCAyMTRiIDNFOEM1Q0REIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsOFwpCi0gMTY2MSAyMTUwIDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gMTY2MiAyMTU0IDNFOEM1Q0VEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsOFwpCi0gMTY2MyAyMTU5IDNFOEM1Q0Y1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksOFwpCi0gMTY2NCAyMTVlIDNFOEM1Q0ZEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksOFwpCi0gMTY2NSAyMTYzIDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDFcKQotIDE2NjYgMjE2OSA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCwyXCkKLS4qV2FybmluZzouKgotIDE2NjcgMjE2ZiA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCw0XCkKLS4qV2FybmluZzouKgotIDE2NjggMjE3NSA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCw4XCkKLS4qV2FybmluZzouKgotIDE2NjkgWyAJXSoKLSAxNjcwIFsgCV0qICAgICAJCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLSAxNjcxIDIxN2IgMDAgWyAJXSoJLmJ5dGUJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmZjNjg5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ucworKysgL2Rldi9udWxsCkBAIC0xLDE2NzEgKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0JbW92CSVkcywlc3M6KCVlYXgpCi0JbW92CSVkcywlc3M6KCVlY3gpCi0JbW92CSVkcywlc3M6KCVlZHgpCi0JbW92CSVkcywlc3M6KCVlYngpCi0JbW92CSVkcywlc3M6MAotCW1vdgklZHMsJXNzOiglZXNpKQotCW1vdgklZHMsJXNzOiglZWRpKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnApCi0JbW92CSVkcywlc3M6MHgxMiglZXNpKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGkpCi0JbW92CSVkcywlZWF4Ci0JbW92CSVkcywlZWN4Ci0JbW92CSVkcywlZWR4Ci0JbW92CSVkcywlZWJ4Ci0JbW92CSVkcywlZXNwCi0JbW92CSVkcywlZWJwCi0JbW92CSVkcywlZXNpCi0JbW92CSVkcywlZWRpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVzczooLCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJXNzOigsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVzczooLCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsMSkKLQltb3YJJWRzLCVzczooLDEpCi0JbW92CSVkcywlc3M6KCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVheCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVieCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJXNzOigsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVzczooLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVheCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJXNzOigsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVzczooLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYngsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYngsMikKLQltb3YJJWRzLCVzczooJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVieCwyKQotCW1vdgklZHMsJXNzOiglZXNwLDIpCi0JbW92CSVkcywlc3M6KCwyKQotCW1vdgklZHMsJXNzOiglZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlZGksMikKLQltb3YJJWRzLCVzczooJWVheCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVicCwyKQotCW1vdgklZHMsJXNzOigsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVzczooLCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlZGksMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCw0KQotCW1vdgklZHMsJXNzOigsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVzczooLCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCw0KQotCW1vdgklZHMsJXNzOigsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVzcCw0KQotCW1vdgklZHMsJXNzOigsNCkKLQltb3YJJWRzLCVzczooJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVzczooLCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJXNzOigsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVzczooLCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJXNzOigsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVzczooLCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsOCkKLQltb3YJJWRzLCVzczooLDgpCi0JbW92CSVkcywlc3M6KCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVheCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVieCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJXNzOigsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVzczooLCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVicCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMigsMSkKLQltb3YJJWRzLCVzczoweDEyKCwyKQotCW1vdgklZHMsJXNzOjB4MTIoLDQpCi0JbW92CSVkcywlc3M6MHgxMigsOCkKLQltb3YJJWRzLCVkczooJWVheCkKLQltb3YJJWRzLCVkczooJWVjeCkKLQltb3YJJWRzLCVkczooJWVkeCkKLQltb3YJJWRzLCVkczooJWVieCkKLQltb3YJJWRzLCVkczowCi0JbW92CSVkcywlZHM6KCVlc2kpCi0JbW92CSVkcywlZHM6KCVlZGkpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2kpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnApCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSkKLQltb3YJJWRzLCVlYXgKLQltb3YJJWRzLCVlY3gKLQltb3YJJWRzLCVlZHgKLQltb3YJJWRzLCVlYngKLQltb3YJJWRzLCVlc3AKLQltb3YJJWRzLCVlYnAKLQltb3YJJWRzLCVlc2kKLQltb3YJJWRzLCVlZGkKLQltb3YJJWRzLCVkczooJWVheCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJWRzOigsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVkczooLCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJWRzOigsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVzcCwxKQotCW1vdgklZHMsJWRzOigsMSkKLQltb3YJJWRzLCVkczooJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVkczooLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJWRzOigsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVkczooLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVheCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJWRzOigsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVkczooLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsMikKLQltb3YJJWRzLCVkczooLDIpCi0JbW92CSVkcywlZHM6KCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVheCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVieCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJWRzOigsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVkczooLCVlZGksMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJWRzOigsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVkczooLCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVieCw0KQotCW1vdgklZHMsJWRzOiglZXNwLDQpCi0JbW92CSVkcywlZHM6KCw0KQotCW1vdgklZHMsJWRzOiglZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJWRzOigsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVkczooLCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJWRzOigsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVkczooLCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJWRzOigsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVzcCw4KQotCW1vdgklZHMsJWRzOigsOCkKLQltb3YJJWRzLCVkczooJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVkczooLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJWRzOigsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVicCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlZGksMikKLQltb3YJJWRzLCVkczooJWVicCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCwxKQotCW1vdgklZHMsJWRzOjB4MTIoLDIpCi0JbW92CSVkcywlZHM6MHgxMigsNCkKLQltb3YJJWRzLCVkczoweDEyKCw4KQotCi0JIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotCS5ieXRlCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGY0OWQ3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLmQKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotI2FzOiAtSgotI29iamR1bXA6IC1kdwotI25hbWU6IGkzODYgb3Bjb2RlCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPGZvbz46Ci0gICAwOgkwMCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gICA2OgkwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICAgYzoJMDIgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICAxMjoJMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgMTg6CTA0IDkwIFsgCV0qYWRkICAgIFwkMHg5MCwlYWwKLSAgMWE6CTA1IDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIDFmOgkwNiBbIAldKnB1c2ggICAlZXMKLSAgMjA6CTA3IFsgCV0qcG9wICAgICVlcwotICAyMToJMDggOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICAyNzoJMDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgMmQ6CTBhIDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgMzM6CTBiIDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDM5OgkwYyA5MCBbIAldKm9yICAgICBcJDB4OTAsJWFsCi0gIDNiOgkwZCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICBcJDB4OTA5MDkwOTAsJWVheAotICA0MDoJMGUgWyAJXSpwdXNoICAgJWNzCi0gIDQxOgkxMCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDQ3OgkxMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICA0ZDoJMTIgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICA1MzoJMTMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgNTk6CTE0IDkwIFsgCV0qYWRjICAgIFwkMHg5MCwlYWwKLSAgNWI6CTE1IDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIDYwOgkxNiBbIAldKnB1c2ggICAlc3MKLSAgNjE6CTE3IFsgCV0qcG9wICAgICVzcwotICA2MjoJMTggOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICA2ODoJMTkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNmU6CTFhIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgNzQ6CTFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDdhOgkxYyA5MCBbIAldKnNiYiAgICBcJDB4OTAsJWFsCi0gIDdjOgkxZCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICBcJDB4OTA5MDkwOTAsJWVheAotICA4MToJMWUgWyAJXSpwdXNoICAgJWRzCi0gIDgyOgkxZiBbIAldKnBvcCAgICAlZHMKLSAgODM6CTIwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgODk6CTIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDhmOgkyMiA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDk1OgkyMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICA5YjoJMjQgOTAgWyAJXSphbmQgICAgXCQweDkwLCVhbAotICA5ZDoJMjUgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgYTI6CTI3IFsgCV0qZGFhICAgIAotICBhMzoJMjggOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICBhOToJMjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgYWY6CTJhIDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgYjU6CTJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIGJiOgkyYyA5MCBbIAldKnN1YiAgICBcJDB4OTAsJWFsCi0gIGJkOgkyZCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICBcJDB4OTA5MDkwOTAsJWVheAotICBjMjoJMmYgWyAJXSpkYXMgICAgCi0gIGMzOgkzMCA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGM5OgkzMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICBjZjoJMzIgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICBkNToJMzMgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgZGI6CTM0IDkwIFsgCV0qeG9yICAgIFwkMHg5MCwlYWwKLSAgZGQ6CTM1IDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIGUyOgkzNyBbIAldKmFhYSAgICAKLSAgZTM6CTM4IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgZTk6CTM5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGVmOgkzYSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIGY1OgkzYiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICBmYjoJM2MgOTAgWyAJXSpjbXAgICAgXCQweDkwLCVhbAotICBmZDoJM2QgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAxMDI6CTNmIFsgCV0qYWFzICAgIAotIDEwMzoJNDAgWyAJXSppbmMgICAgJWVheAotIDEwNDoJNDEgWyAJXSppbmMgICAgJWVjeAotIDEwNToJNDIgWyAJXSppbmMgICAgJWVkeAotIDEwNjoJNDMgWyAJXSppbmMgICAgJWVieAotIDEwNzoJNDQgWyAJXSppbmMgICAgJWVzcAotIDEwODoJNDUgWyAJXSppbmMgICAgJWVicAotIDEwOToJNDYgWyAJXSppbmMgICAgJWVzaQotIDEwYToJNDcgWyAJXSppbmMgICAgJWVkaQotIDEwYjoJNDggWyAJXSpkZWMgICAgJWVheAotIDEwYzoJNDkgWyAJXSpkZWMgICAgJWVjeAotIDEwZDoJNGEgWyAJXSpkZWMgICAgJWVkeAotIDEwZToJNGIgWyAJXSpkZWMgICAgJWVieAotIDEwZjoJNGMgWyAJXSpkZWMgICAgJWVzcAotIDExMDoJNGQgWyAJXSpkZWMgICAgJWVicAotIDExMToJNGUgWyAJXSpkZWMgICAgJWVzaQotIDExMjoJNGYgWyAJXSpkZWMgICAgJWVkaQotIDExMzoJNTAgWyAJXSpwdXNoICAgJWVheAotIDExNDoJNTEgWyAJXSpwdXNoICAgJWVjeAotIDExNToJNTIgWyAJXSpwdXNoICAgJWVkeAotIDExNjoJNTMgWyAJXSpwdXNoICAgJWVieAotIDExNzoJNTQgWyAJXSpwdXNoICAgJWVzcAotIDExODoJNTUgWyAJXSpwdXNoICAgJWVicAotIDExOToJNTYgWyAJXSpwdXNoICAgJWVzaQotIDExYToJNTcgWyAJXSpwdXNoICAgJWVkaQotIDExYjoJNTggWyAJXSpwb3AgICAgJWVheAotIDExYzoJNTkgWyAJXSpwb3AgICAgJWVjeAotIDExZDoJNWEgWyAJXSpwb3AgICAgJWVkeAotIDExZToJNWIgWyAJXSpwb3AgICAgJWVieAotIDExZjoJNWMgWyAJXSpwb3AgICAgJWVzcAotIDEyMDoJNWQgWyAJXSpwb3AgICAgJWVicAotIDEyMToJNWUgWyAJXSpwb3AgICAgJWVzaQotIDEyMjoJNWYgWyAJXSpwb3AgICAgJWVkaQotIDEyMzoJNjAgWyAJXSpwdXNoYSAgCi0gMTI0Ogk2MSBbIAldKnBvcGEgICAKLSAxMjU6CTYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYm91bmQgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTJiOgk2MyA5MCA5MCA5MCA5MCA5MCBbIAldKmFycGwgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTMxOgk2OCA5MCA5MCA5MCA5MCBbIAldKnB1c2ggICBcJDB4OTA5MDkwOTAKLSAxMzY6CTY5IDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHg5MDkwOTA5MCwweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDE0MDoJNmEgOTAgWyAJXSpwdXNoICAgXCQweGZmZmZmZjkwCi0gMTQyOgk2YiA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxNDk6CTZjIFsgCV0qaW5zYiAgIFwoJWR4XCksJWVzOlwoJWVkaVwpCi0gMTRhOgk2ZCBbIAldKmluc2wgICBcKCVkeFwpLCVlczpcKCVlZGlcKQotIDE0YjoJNmUgWyAJXSpvdXRzYiAgJWRzOlwoJWVzaVwpLFwoJWR4XCkKLSAxNGM6CTZmIFsgCV0qb3V0c2wgICVkczpcKCVlc2lcKSxcKCVkeFwpCi0gMTRkOgk3MCA5MCBbIAldKmpvICAgICAoMHgpP2RmLioKLSAxNGY6CTcxIDkwIFsgCV0qam5vICAgICgweCk/ZTEuKgotIDE1MToJNzIgOTAgWyAJXSpqYiAgICAgKDB4KT9lMy4qCi0gMTUzOgk3MyA5MCBbIAldKmphZSAgICAoMHgpP2U1LioKLSAxNTU6CTc0IDkwIFsgCV0qamUgICAgICgweCk/ZTcuKgotIDE1NzoJNzUgOTAgWyAJXSpqbmUgICAgKDB4KT9lOS4qCi0gMTU5Ogk3NiA5MCBbIAldKmpiZSAgICAoMHgpP2ViLioKLSAxNWI6CTc3IDkwIFsgCV0qamEgICAgICgweCk/ZWQuKgotIDE1ZDoJNzggOTAgWyAJXSpqcyAgICAgKDB4KT9lZi4qCi0gMTVmOgk3OSA5MCBbIAldKmpucyAgICAoMHgpP2YxLioKLSAxNjE6CTdhIDkwIFsgCV0qanAgICAgICgweCk/ZjMuKgotIDE2MzoJN2IgOTAgWyAJXSpqbnAgICAgKDB4KT9mNS4qCi0gMTY1Ogk3YyA5MCBbIAldKmpsICAgICAoMHgpP2Y3LioKLSAxNjc6CTdkIDkwIFsgCV0qamdlICAgICgweCk/ZjkuKgotIDE2OToJN2UgOTAgWyAJXSpqbGUgICAgKDB4KT9mYi4qCi0gMTZiOgk3ZiA5MCBbIAldKmpnICAgICAoMHgpP2ZkLioKLSAxNmQ6CTgwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjYiAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAxNzQ6CTgxIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjbCAgIFwkMHg5MDkwOTA5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAxN2U6CTgzIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjbCAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAxODU6CTg0IDkwIDkwIDkwIDkwIDkwIFsgCV0qdGVzdCAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOGI6CTg1IDkwIDkwIDkwIDkwIDkwIFsgCV0qdGVzdCAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTkxOgk4NiA5MCA5MCA5MCA5MCA5MCBbIAldKnhjaGcgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTk3Ogk4NyA5MCA5MCA5MCA5MCA5MCBbIAldKnhjaGcgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDE5ZDoJODggOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDFhMzoJODkgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxYTk6CThhIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAxYWY6CThiIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMWI1Ogk4YyA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmwgICAlc3MsMHg5MDkwOTA5MFwoJWVheFwpCi0gMWJiOgk4ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmxlYSAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDFjMToJOGUgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZsICAgMHg5MDkwOTA5MFwoJWVheFwpLCVzcwotIDFjNzoJOGYgODAgOTAgOTAgOTAgOTAgWyAJXSpwb3BsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMWNkOgk5MCBbIAldKm5vcCAgICAKLSAxY2U6CTkxIFsgCV0qeGNoZyAgICVlYXgsJWVjeAotIDFjZjoJOTIgWyAJXSp4Y2hnICAgJWVheCwlZWR4Ci0gMWQwOgk5MyBbIAldKnhjaGcgICAlZWF4LCVlYngKLSAxZDE6CTk0IFsgCV0qeGNoZyAgICVlYXgsJWVzcAotIDFkMjoJOTUgWyAJXSp4Y2hnICAgJWVheCwlZWJwCi0gMWQzOgk5NiBbIAldKnhjaGcgICAlZWF4LCVlc2kKLSAxZDQ6CTk3IFsgCV0qeGNoZyAgICVlYXgsJWVkaQotIDFkNToJOTggWyAJXSpjd3RsICAgCi0gMWQ2Ogk5OSBbIAldKmNsdGQgICAKLSAxZDc6CTlhIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGNhbGwgIFwkMHg5MDkwLFwkMHg5MDkwOTA5MAotIDFkZToJOWIgWyAJXSpmd2FpdAotIDFkZjoJOWMgWyAJXSpwdXNoZiAgCi0gMWUwOgk5ZCBbIAldKnBvcGYgICAKLSAxZTE6CTllIFsgCV0qc2FoZiAgIAotIDFlMjoJOWYgWyAJXSpsYWhmICAgCi0gMWUzOglhMCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwLCVhbAotIDFlODoJYTEgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MCwlZWF4Ci0gMWVkOglhMiA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlYWwsMHg5MDkwOTA5MAotIDFmMjoJYTMgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWVheCwweDkwOTA5MDkwCi0gMWY3OglhNCBbIAldKm1vdnNiICAlZHM6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gMWY4OglhNSBbIAldKm1vdnNsICAlZHM6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gMWY5OglhNiBbIAldKmNtcHNiICAlZXM6XCglZWRpXCksJWRzOlwoJWVzaVwpCi0gMWZhOglhNyBbIAldKmNtcHNsICAlZXM6XCglZWRpXCksJWRzOlwoJWVzaVwpCi0gMWZiOglhOCA5MCBbIAldKnRlc3QgICBcJDB4OTAsJWFsCi0gMWZkOglhOSA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICBcJDB4OTA5MDkwOTAsJWVheAotIDIwMjoJYWEgWyAJXSpzdG9zICAgJWFsLCVlczpcKCVlZGlcKQotIDIwMzoJYWIgWyAJXSpzdG9zICAgJWVheCwlZXM6XCglZWRpXCkKLSAyMDQ6CWFjIFsgCV0qbG9kcyAgICVkczpcKCVlc2lcKSwlYWwKLSAyMDU6CWFkIFsgCV0qbG9kcyAgICVkczpcKCVlc2lcKSwlZWF4Ci0gMjA2OglhZSBbIAldKnNjYXMgICAlZXM6XCglZWRpXCksJWFsCi0gMjA3OglhZiBbIAldKnNjYXMgICAlZXM6XCglZWRpXCksJWVheAotIDIwODoJYjAgOTAgWyAJXSptb3YgICAgXCQweDkwLCVhbAotIDIwYToJYjEgOTAgWyAJXSptb3YgICAgXCQweDkwLCVjbAotIDIwYzoJYjIgOTAgWyAJXSptb3YgICAgXCQweDkwLCVkbAotIDIwZToJYjMgOTAgWyAJXSptb3YgICAgXCQweDkwLCVibAotIDIxMDoJYjQgOTAgWyAJXSptb3YgICAgXCQweDkwLCVhaAotIDIxMjoJYjUgOTAgWyAJXSptb3YgICAgXCQweDkwLCVjaAotIDIxNDoJYjYgOTAgWyAJXSptb3YgICAgXCQweDkwLCVkaAotIDIxNjoJYjcgOTAgWyAJXSptb3YgICAgXCQweDkwLCViaAotIDIxODoJYjggOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAyMWQ6CWI5IDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWN4Ci0gMjIyOgliYSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVkeAotIDIyNzoJYmIgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlYngKLSAyMmM6CWJjIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZXNwCi0gMjMxOgliZCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVicAotIDIzNjoJYmUgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlc2kKLSAyM2I6CWJmIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWRpCi0gMjQwOgljMCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGIgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjQ3OgljMSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGwgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjRlOgljMiA5MCA5MCBbIAldKnJldCAgICBcJDB4OTA5MAotIDI1MToJYzMgWyAJXSpyZXQgICAgCi0gMjUyOgljNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxlcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDI1ODoJYzUgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZHMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAyNWU6CWM2IDgwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92YiAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAyNjU6CWM3IDgwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92bCAgIFwkMHg5MDkwOTA5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAyNmY6CWM4IDkwIDkwIDkwIFsgCV0qZW50ZXIgIFwkMHg5MDkwLFwkMHg5MAotIDI3MzoJYzkgWyAJXSpsZWF2ZSAgCi0gMjc0OgljYSA5MCA5MCBbIAldKmxyZXQgICBcJDB4OTA5MAotIDI3NzoJY2IgWyAJXSpscmV0ICAgCi0gMjc4OgljYyBbIAldKmludDMgICAKLSAyNzk6CWNkIDkwIFsgCV0qaW50ICAgIFwkMHg5MAotIDI3YjoJY2UgWyAJXSppbnRvICAgCi0gMjdjOgljZiBbIAldKmlyZXQgICAKLSAyN2Q6CWQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsYiAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDI4MzoJZDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMjg5OglkMiA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGIgICAlY2wsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjhmOglkMyA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGwgICAlY2wsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjk1OglkNCA5MCBbIAldKmFhbSAgICBcJDB4ZmZmZmZmOTAKLSAyOTc6CWQ1IDkwIFsgCV0qYWFkICAgIFwkMHhmZmZmZmY5MAotIDI5OToJZDcgWyAJXSp4bGF0ICAgJWRzOlwoJWVieFwpCi0gMjlhOglkOCA5MCA5MCA5MCA5MCA5MCBbIAldKmZjb21zICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYTA6CWQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qZnN0cyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJhNjoJZGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaWNvbWwgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmFjOglkYiA5MCA5MCA5MCA5MCA5MCBbIAldKmZpc3RsICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYjI6CWRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmNvbWwgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJiODoJZGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpmc3RsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmJlOglkZSA5MCA5MCA5MCA5MCA5MCBbIAldKmZpY29tICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYzQ6CWRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmlzdCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJjYToJZTAgOTAgWyAJXSpsb29wbmUgKDB4KT8yNWMuKgotIDJjYzoJZTEgOTAgWyAJXSpsb29wZSAgKDB4KT8yNWUuKgotIDJjZToJZTIgOTAgWyAJXSpsb29wICAgKDB4KT8yNjAuKgotIDJkMDoJZTMgOTAgWyAJXSpqZWN4eiAgKDB4KT8yNjIuKgotIDJkMjoJZTQgOTAgWyAJXSppbiAgICAgXCQweDkwLCVhbAotIDJkNDoJZTUgOTAgWyAJXSppbiAgICAgXCQweDkwLCVlYXgKLSAyZDY6CWU2IDkwIFsgCV0qb3V0ICAgICVhbCxcJDB4OTAKLSAyZDg6CWU3IDkwIFsgCV0qb3V0ICAgICVlYXgsXCQweDkwCi0gMmRhOgllOCA5MCA5MCA5MCA5MCBbIAldKmNhbGwgICAoMHgpPzkwOTA5MzZmLioKLSAyZGY6CWU5IDkwIDkwIDkwIDkwIFsgCV0qam1wICAgICgweCk/OTA5MDkzNzQuKgotIDJlNDoJZWEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpsam1wICAgXCQweDkwOTAsXCQweDkwOTA5MDkwCi0gMmViOgllYiA5MCBbIAldKmptcCAgICAoMHgpPzI3ZC4qCi0gMmVkOgllYyBbIAldKmluICAgICBcKCVkeFwpLCVhbAotIDJlZToJZWQgWyAJXSppbiAgICAgXCglZHhcKSwlZWF4Ci0gMmVmOgllZSBbIAldKm91dCAgICAlYWwsXCglZHhcKQotIDJmMDoJZWYgWyAJXSpvdXQgICAgJWVheCxcKCVkeFwpCi0gMmYxOglmNCBbIAldKmhsdCAgICAKLSAyZjI6CWY1IFsgCV0qY21jICAgIAotIDJmMzoJZjYgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3RiICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmY5OglmNyA5MCA5MCA5MCA5MCA5MCBbIAldKm5vdGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyZmY6CWY4IFsgCV0qY2xjICAgIAotIDMwMDoJZjkgWyAJXSpzdGMgICAgCi0gMzAxOglmYSBbIAldKmNsaSAgICAKLSAzMDI6CWZiIFsgCV0qc3RpICAgIAotIDMwMzoJZmMgWyAJXSpjbGQgICAgCi0gMzA0OglmZCBbIAldKnN0ZCAgICAKLSAzMDU6CWZmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY2FsbCAgIFwqMHg5MDkwOTA5MFwoJWVheFwpCi0gMzBiOgkwZiAwMCA5MCA5MCA5MCA5MCA5MCBbIAldKmxsZHQgICAweDkwOTA5MDkwXCglZWF4XCkKLSAzMTI6CTBmIDAxIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGdkdCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDMxOToJMGYgMDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsYXIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzMjA6CTBmIDAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNsICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzI3OgkwZiAwNiBbIAldKmNsdHMgICAKLSAzMjk6CTBmIDA4IFsgCV0qaW52ZCAgIAotIDMyYjoJMGYgMDkgWyAJXSp3YmludmQgCi0gMzJkOgkwZiAwYiBbIAldKnVkMmEgICAKLSAzMmY6CTBmIDIwIGQwIFsgCV0qbW92ICAgICVjcjIsJWVheAotIDMzMjoJMGYgMjEgZDAgWyAJXSptb3YgICAgJWRiMiwlZWF4Ci0gMzM1OgkwZiAyMiBkMCBbIAldKm1vdiAgICAlZWF4LCVjcjIKLSAzMzg6CTBmIDIzIGQwIFsgCV0qbW92ICAgICVlYXgsJWRiMgotIDMzYjoJMGYgMjQgZDAgWyAJXSptb3YgICAgJXRyMiwlZWF4Ci0gMzNlOgkwZiAyNiBkMCBbIAldKm1vdiAgICAlZWF4LCV0cjIKLSAzNDE6CTBmIDMwIFsgCV0qd3Jtc3IgIAotIDM0MzoJMGYgMzEgWyAJXSpyZHRzYyAgCi0gMzQ1OgkwZiAzMiBbIAldKnJkbXNyICAKLSAzNDc6CTBmIDMzIFsgCV0qcmRwbWMgIAotIDM0OToJMGYgNDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92byAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNTA6CTBmIDQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5vIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzU3OgkwZiA0MiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZiICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM1ZToJMGYgNDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YWUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNjU6CTBmIDQ0IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmUgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzZjOgkwZiA0NSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZuZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM3MzoJMGYgNDYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YmUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzN2E6CTBmIDQ3IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzgxOgkwZiA0OCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZzICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM4ODoJMGYgNDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnMgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzOGY6CTBmIDRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzk2OgkwZiA0YiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZucCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM5ZDoJMGYgNGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bCAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYTQ6CTBmIDRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmdlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2FiOgkwZiA0ZSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZsZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNiMjoJMGYgNGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZyAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYjk6CTBmIDYwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNrbGJ3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2MwOgkwZiA2MSA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2x3ZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNjNzoJMGYgNjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tsZHEgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzY2U6CTBmIDYzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFja3Nzd2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZDU6CTBmIDY0IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGd0YiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNkYzoJMGYgNjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZ3R3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2UzOgkwZiA2NiA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBndGQgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZWE6CTBmIDY3IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFja3Vzd2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZjE6CTBmIDY4IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNraGJ3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2Y4OgkwZiA2OSA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2h3ZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNmZjoJMGYgNmEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2toZHEgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MDY6CTBmIDZiIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFja3NzZHcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MGQ6CTBmIDZlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ZCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDE0OgkwZiA2ZiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnEgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQxYjoJMGYgNzEgZDAgOTAgWyAJXSpwc3JsdyAgXCQweDkwLCVtbTAKLSA0MWY6CTBmIDcyIGQwIDkwIFsgCV0qcHNybGQgIFwkMHg5MCwlbW0wCi0gNDIzOgkwZiA3MyBkMCA5MCBbIAldKnBzcmxxICBcJDB4OTAsJW1tMAotIDQyNzoJMGYgNzQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZXFiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDJlOgkwZiA3NSA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBlcXcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MzU6CTBmIDc2IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGVxZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQzYzoJMGYgNzcgWyAJXSplbW1zICAgCi0gNDNlOgkwZiA3ZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmQgICAlbW0yLDB4OTA5MDkwOTBcKCVlYXhcKQotIDQ0NToJMGYgN2YgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZxICAgJW1tMiwweDkwOTA5MDkwXCglZWF4XCkKLSA0NGM6CTBmIDgwIDkwIDkwIDkwIDkwIFsgCV0qam8gICAgICgweCk/OTA5MDk0ZTIuKgotIDQ1MjoJMGYgODEgOTAgOTAgOTAgOTAgWyAJXSpqbm8gICAgKDB4KT85MDkwOTRlOC4qCi0gNDU4OgkwZiA4MiA5MCA5MCA5MCA5MCBbIAldKmpiICAgICAoMHgpPzkwOTA5NGVlLioKLSA0NWU6CTBmIDgzIDkwIDkwIDkwIDkwIFsgCV0qamFlICAgICgweCk/OTA5MDk0ZjQuKgotIDQ2NDoJMGYgODQgOTAgOTAgOTAgOTAgWyAJXSpqZSAgICAgKDB4KT85MDkwOTRmYS4qCi0gNDZhOgkwZiA4NSA5MCA5MCA5MCA5MCBbIAldKmpuZSAgICAoMHgpPzkwOTA5NTAwLioKLSA0NzA6CTBmIDg2IDkwIDkwIDkwIDkwIFsgCV0qamJlICAgICgweCk/OTA5MDk1MDYuKgotIDQ3NjoJMGYgODcgOTAgOTAgOTAgOTAgWyAJXSpqYSAgICAgKDB4KT85MDkwOTUwYy4qCi0gNDdjOgkwZiA4OCA5MCA5MCA5MCA5MCBbIAldKmpzICAgICAoMHgpPzkwOTA5NTEyLioKLSA0ODI6CTBmIDg5IDkwIDkwIDkwIDkwIFsgCV0qam5zICAgICgweCk/OTA5MDk1MTguKgotIDQ4ODoJMGYgOGEgOTAgOTAgOTAgOTAgWyAJXSpqcCAgICAgKDB4KT85MDkwOTUxZS4qCi0gNDhlOgkwZiA4YiA5MCA5MCA5MCA5MCBbIAldKmpucCAgICAoMHgpPzkwOTA5NTI0LioKLSA0OTQ6CTBmIDhjIDkwIDkwIDkwIDkwIFsgCV0qamwgICAgICgweCk/OTA5MDk1MmEuKgotIDQ5YToJMGYgOGQgOTAgOTAgOTAgOTAgWyAJXSpqZ2UgICAgKDB4KT85MDkwOTUzMC4qCi0gNGEwOgkwZiA4ZSA5MCA5MCA5MCA5MCBbIAldKmpsZSAgICAoMHgpPzkwOTA5NTM2LioKLSA0YTY6CTBmIDhmIDkwIDkwIDkwIDkwIFsgCV0qamcgICAgICgweCk/OTA5MDk1M2MuKgotIDRhYzoJMGYgOTAgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRvICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGIzOgkwZiA5MSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5vICAweDkwOTA5MDkwXCglZWF4XCkKLSA0YmE6CTBmIDkyIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YiAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRjMToJMGYgOTMgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRhZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGM4OgkwZiA5NCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGUgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0Y2Y6CTBmIDk1IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bmUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRkNjoJMGYgOTYgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRiZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGRkOgkwZiA5NyA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGEgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZTQ6CTBmIDk4IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0cyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRlYjoJMGYgOTkgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRucyAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGYyOgkwZiA5YSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldHAgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0Zjk6CTBmIDliIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bnAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUwMDoJMGYgOWMgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTA3OgkwZiA5ZCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGdlICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MGU6CTBmIDllIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bGUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUxNToJMGYgOWYgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRnICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTFjOgkwZiBhMCBbIAldKnB1c2ggICAlZnMKLSA1MWU6CTBmIGExIFsgCV0qcG9wICAgICVmcwotIDUyMDoJMGYgYTIgWyAJXSpjcHVpZCAgCi0gNTIyOgkwZiBhMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ICAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDUyOToJMGYgYTQgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgXCQweDkwLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTMxOgkwZiBhNSA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICAlY2wsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Mzg6CTBmIGE4IFsgCV0qcHVzaCAgICVncwotIDUzYToJMGYgYTkgWyAJXSpwb3AgICAgJWdzCi0gNTNjOgkwZiBhYSBbIAldKnJzbSAgICAKLSA1M2U6CTBmIGFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRzICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTQ1OgkwZiBhYyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICBcJDB4OTAsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NGQ6CTBmIGFkIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgICVjbCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU1NDoJMGYgYWYgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1NWI6CTBmIGIwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21weGNoZyAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTYyOgkwZiBiMSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcHhjaGcgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Njk6CTBmIGIyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTcwOgkwZiBiMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ciAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU3NzoJMGYgYjQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZnMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1N2U6CTBmIGI1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGdzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTg1OgkwZiBiNiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnpibCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU4YzoJMGYgYjcgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z6d2wgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1OTM6CTBmIGI5IFsgCV0qdWQyYiAgIAotIDU5NToJMGYgYmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpidGMgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1OWM6CTBmIGJjIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNmICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWEzOgkwZiBiZCA5MCA5MCA5MCA5MCA5MCBbIAldKmJzciAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDVhYToJMGYgYmUgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZzYmwgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1YjE6CTBmIGJmIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c3dsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWI4OgkwZiBjMCA5MCA5MCA5MCA5MCA5MCBbIAldKnhhZGQgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gNWJmOgkwZiBjMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhhZGQgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDVjNjoJMGYgYzggWyAJXSpic3dhcCAgJWVheAotIDVjODoJMGYgYzkgWyAJXSpic3dhcCAgJWVjeAotIDVjYToJMGYgY2EgWyAJXSpic3dhcCAgJWVkeAotIDVjYzoJMGYgY2IgWyAJXSpic3dhcCAgJWVieAotIDVjZToJMGYgY2MgWyAJXSpic3dhcCAgJWVzcAotIDVkMDoJMGYgY2QgWyAJXSpic3dhcCAgJWVicAotIDVkMjoJMGYgY2UgWyAJXSpic3dhcCAgJWVzaQotIDVkNDoJMGYgY2YgWyAJXSpic3dhcCAgJWVkaQotIDVkNjoJMGYgZDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JsdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZGQ6CTBmIGQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNybGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWU0OgkwZiBkMyA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmxxICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVlYjoJMGYgZDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwbXVsbHcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZjI6CTBmIGQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnVzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVmOToJMGYgZDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3VidXN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjAwOgkwZiBkYiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhbmQgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYwNzoJMGYgZGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdXNiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjBlOgkwZiBkZCA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGR1c3cgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MTU6CTBmIGRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFuZG4gIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjFjOgkwZiBlMSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmF3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYyMzoJMGYgZTIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JhZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MmE6CTBmIGU1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcG11bGh3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjMxOgkwZiBlOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYzODoJMGYgZTkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3Vic3cgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2M2Y6CTBmIGViIDkwIDkwIDkwIDkwIDkwIFsgCV0qcG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjQ2OgkwZiBlYyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY0ZDoJMGYgZWQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkc3cgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NTQ6CTBmIGVmIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHhvciAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjViOgkwZiBmMSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzbGx3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY2MjoJMGYgZjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc2xsZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2Njk6CTBmIGYzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNsbHEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjcwOgkwZiBmNSA5MCA5MCA5MCA5MCA5MCBbIAldKnBtYWRkd2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2Nzc6CTBmIGY4IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YmIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjdlOgkwZiBmOSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJ3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY4NToJMGYgZmEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3ViZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2OGM6CTBmIGZjIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZGIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjkzOgkwZiBmZCA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGR3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY5YToJMGYgZmUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2YTE6CTY2IDAxIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2YTg6CTY2IDAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA2YWY6CTY2IDA1IDkwIDkwIFsgCV0qYWRkICAgIFwkMHg5MDkwLCVheAotIDZiMzoJNjYgMDYgWyAJXSpwdXNodyAgJWVzCi0gNmI1Ogk2NiAwNyBbIAldKnBvcHcgICAlZXMKLSA2Yjc6CTY2IDA5IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2YmU6CTY2IDBiIDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA2YzU6CTY2IDBkIDkwIDkwIFsgCV0qb3IgICAgIFwkMHg5MDkwLCVheAotIDZjOToJNjYgMGUgWyAJXSpwdXNodyAgJWNzCi0gNmNiOgk2NiAxMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmQyOgk2NiAxMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmQ5Ogk2NiAxNSA5MCA5MCBbIAldKmFkYyAgICBcJDB4OTA5MCwlYXgKLSA2ZGQ6CTY2IDE2IFsgCV0qcHVzaHcgICVzcwotIDZkZjoJNjYgMTcgWyAJXSpwb3B3ICAgJXNzCi0gNmUxOgk2NiAxOSA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmU4Ogk2NiAxYiA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmVmOgk2NiAxZCA5MCA5MCBbIAldKnNiYiAgICBcJDB4OTA5MCwlYXgKLSA2ZjM6CTY2IDFlIFsgCV0qcHVzaHcgICVkcwotIDZmNToJNjYgMWYgWyAJXSpwb3B3ICAgJWRzCi0gNmY3Ogk2NiAyMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmZlOgk2NiAyMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzA1Ogk2NiAyNSA5MCA5MCBbIAldKmFuZCAgICBcJDB4OTA5MCwlYXgKLSA3MDk6CTY2IDI5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3MTA6CTY2IDJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3MTc6CTY2IDJkIDkwIDkwIFsgCV0qc3ViICAgIFwkMHg5MDkwLCVheAotIDcxYjoJNjYgMzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDcyMjoJNjYgMzMgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDcyOToJNjYgMzUgOTAgOTAgWyAJXSp4b3IgICAgXCQweDkwOTAsJWF4Ci0gNzJkOgk2NiAzOSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzM0Ogk2NiAzYiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzNiOgk2NiAzZCA5MCA5MCBbIAldKmNtcCAgICBcJDB4OTA5MCwlYXgKLSA3M2Y6CTY2IDQwIFsgCV0qaW5jICAgICVheAotIDc0MToJNjYgNDEgWyAJXSppbmMgICAgJWN4Ci0gNzQzOgk2NiA0MiBbIAldKmluYyAgICAlZHgKLSA3NDU6CTY2IDQzIFsgCV0qaW5jICAgICVieAotIDc0NzoJNjYgNDQgWyAJXSppbmMgICAgJXNwCi0gNzQ5Ogk2NiA0NSBbIAldKmluYyAgICAlYnAKLSA3NGI6CTY2IDQ2IFsgCV0qaW5jICAgICVzaQotIDc0ZDoJNjYgNDcgWyAJXSppbmMgICAgJWRpCi0gNzRmOgk2NiA0OCBbIAldKmRlYyAgICAlYXgKLSA3NTE6CTY2IDQ5IFsgCV0qZGVjICAgICVjeAotIDc1MzoJNjYgNGEgWyAJXSpkZWMgICAgJWR4Ci0gNzU1Ogk2NiA0YiBbIAldKmRlYyAgICAlYngKLSA3NTc6CTY2IDRjIFsgCV0qZGVjICAgICVzcAotIDc1OToJNjYgNGQgWyAJXSpkZWMgICAgJWJwCi0gNzViOgk2NiA0ZSBbIAldKmRlYyAgICAlc2kKLSA3NWQ6CTY2IDRmIFsgCV0qZGVjICAgICVkaQotIDc1ZjoJNjYgNTAgWyAJXSpwdXNoICAgJWF4Ci0gNzYxOgk2NiA1MSBbIAldKnB1c2ggICAlY3gKLSA3NjM6CTY2IDUyIFsgCV0qcHVzaCAgICVkeAotIDc2NToJNjYgNTMgWyAJXSpwdXNoICAgJWJ4Ci0gNzY3Ogk2NiA1NCBbIAldKnB1c2ggICAlc3AKLSA3Njk6CTY2IDU1IFsgCV0qcHVzaCAgICVicAotIDc2YjoJNjYgNTYgWyAJXSpwdXNoICAgJXNpCi0gNzZkOgk2NiA1NyBbIAldKnB1c2ggICAlZGkKLSA3NmY6CTY2IDU4IFsgCV0qcG9wICAgICVheAotIDc3MToJNjYgNTkgWyAJXSpwb3AgICAgJWN4Ci0gNzczOgk2NiA1YSBbIAldKnBvcCAgICAlZHgKLSA3NzU6CTY2IDViIFsgCV0qcG9wICAgICVieAotIDc3NzoJNjYgNWMgWyAJXSpwb3AgICAgJXNwCi0gNzc5Ogk2NiA1ZCBbIAldKnBvcCAgICAlYnAKLSA3N2I6CTY2IDVlIFsgCV0qcG9wICAgICVzaQotIDc3ZDoJNjYgNWYgWyAJXSpwb3AgICAgJWRpCi0gNzdmOgk2NiA2MCBbIAldKnB1c2hhdyAKLSA3ODE6CTY2IDYxIFsgCV0qcG9wYXcgIAotIDc4MzoJNjYgNjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpib3VuZCAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDc4YToJNjYgNjggOTAgOTAgWyAJXSpwdXNodyAgXCQweDkwOTAKLSA3OGU6CTY2IDY5IDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3OTc6CTY2IDZhIDkwIFsgCV0qcHVzaHcgIFwkMHhmZmZmZmY5MAotIDc5YToJNjYgNmIgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3YTI6CTY2IDZkIFsgCV0qaW5zdyAgIFwoJWR4XCksJWVzOlwoJWVkaVwpCi0gN2E0Ogk2NiA2ZiBbIAldKm91dHN3ICAlZHM6XCglZXNpXCksXCglZHhcKQotIDdhNjoJNjYgODEgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGN3ICAgXCQweDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2FmOgk2NiA4MyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY3cgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2I3Ogk2NiA4NSA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2JlOgk2NiA4NyA5MCA5MCA5MCA5MCA5MCBbIAldKnhjaGcgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2M1Ogk2NiA4OSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2NjOgk2NiA4YiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gN2QzOgk2NiA4YyA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdncgICAlc3MsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2RhOgk2NiA4ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmxlYSAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gN2UxOgk2NiA4ZiA4MCA5MCA5MCA5MCA5MCBbIAldKnBvcHcgICAweDkwOTA5MDkwXCglZWF4XCkKLSA3ZTg6CTY2IDkxIFsgCV0qeGNoZyAgICVheCwlY3gKLSA3ZWE6CTY2IDkyIFsgCV0qeGNoZyAgICVheCwlZHgKLSA3ZWM6CTY2IDkzIFsgCV0qeGNoZyAgICVheCwlYngKLSA3ZWU6CTY2IDk0IFsgCV0qeGNoZyAgICVheCwlc3AKLSA3ZjA6CTY2IDk1IFsgCV0qeGNoZyAgICVheCwlYnAKLSA3ZjI6CTY2IDk2IFsgCV0qeGNoZyAgICVheCwlc2kKLSA3ZjQ6CTY2IDk3IFsgCV0qeGNoZyAgICVheCwlZGkKLSA3ZjY6CTY2IDk4IFsgCV0qY2J0dyAgIAotIDdmODoJNjYgOTkgWyAJXSpjd3RkICAgCi0gN2ZhOgk2NiA5YSA5MCA5MCA5MCA5MCBbIAldKmxjYWxsdyBcJDB4OTA5MCxcJDB4OTA5MAotIDgwMDoJNjYgOWMgWyAJXSpwdXNoZncgCi0gODAyOgk2NiA5ZCBbIAldKnBvcGZ3ICAKLSA4MDQ6CTY2IGExIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTAsJWF4Ci0gODBhOgk2NiBhMyA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlYXgsMHg5MDkwOTA5MAotIDgxMDoJNjYgYTUgWyAJXSptb3ZzdyAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotIDgxMjoJNjYgYTcgWyAJXSpjbXBzdyAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQotIDgxNDoJNjYgYTkgOTAgOTAgWyAJXSp0ZXN0ICAgXCQweDkwOTAsJWF4Ci0gODE4Ogk2NiBhYiBbIAldKnN0b3MgICAlYXgsJWVzOlwoJWVkaVwpCi0gODFhOgk2NiBhZCBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWF4Ci0gODFjOgk2NiBhZiBbIAldKnNjYXMgICAlZXM6XCglZWRpXCksJWF4Ci0gODFlOgk2NiBiOCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlYXgKLSA4MjI6CTY2IGI5IDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVjeAotIDgyNjoJNjYgYmEgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWR4Ci0gODJhOgk2NiBiYiA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlYngKLSA4MmU6CTY2IGJjIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVzcAotIDgzMjoJNjYgYmQgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWJwCi0gODM2Ogk2NiBiZSA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlc2kKLSA4M2E6CTY2IGJmIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVkaQotIDgzZToJNjYgYzEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2x3ICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDg0NjoJNjYgYzIgOTAgOTAgWyAJXSpyZXR3ICAgXCQweDkwOTAKLSA4NGE6CTY2IGMzIFsgCV0qcmV0dyAgIAotIDg0YzoJNjYgYzQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZXMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDg1MzoJNjYgYzUgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZHMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDg1YToJNjYgYzcgODAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z3ICAgXCQweDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gODYzOgk2NiBjOCA5MCA5MCA5MCBbIAldKmVudGVydyBcJDB4OTA5MCxcJDB4OTAKLSA4Njg6CTY2IGM5IFsgCV0qbGVhdmV3IAotIDg2YToJNjYgY2EgOTAgOTAgWyAJXSpscmV0dyAgXCQweDkwOTAKLSA4NmU6CTY2IGNiIFsgCV0qbHJldHcgIAotIDg3MDoJNjYgY2YgWyAJXSppcmV0dyAgCi0gODcyOgk2NiBkMSA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbHcgICAweDkwOTA5MDkwXCglZWF4XCkKLSA4Nzk6CTY2IGQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsdyAgICVjbCwweDkwOTA5MDkwXCglZWF4XCkKLSA4ODA6CTY2IGU1IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlYXgKLSA4ODM6CTY2IGU3IDkwIFsgCV0qb3V0ICAgICVheCxcJDB4OTAKLSA4ODY6CTY2IGU4IDhmIDkwIFsgCV0qY2FsbHcgICgweCk/OTkxOS4qCi0gODhhOgk2NiBlYSA5MCA5MCA5MCA5MCBbIAldKmxqbXB3ICBcJDB4OTA5MCxcJDB4OTA5MAotIDg5MDoJNjYgZWQgWyAJXSppbiAgICAgXCglZHhcKSwlYXgKLSA4OTI6CTY2IGVmIFsgCV0qb3V0ICAgICVheCxcKCVkeFwpCi0gODk0Ogk2NiBmNyA5MCA5MCA5MCA5MCA5MCBbIAldKm5vdHcgICAweDkwOTA5MDkwXCglZWF4XCkKLSA4OWI6CTY2IGZmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY2FsbHcgIFwqMHg5MDkwOTA5MFwoJWVheFwpCi0gOGEyOgk2NiAwZiAwMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxhciAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGFhOgk2NiAwZiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmxzbCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGIyOgk2NiAwZiA0MCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZvICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGJhOgk2NiAwZiA0MSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZubyAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGMyOgk2NiAwZiA0MiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZiICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGNhOgk2NiAwZiA0MyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGQyOgk2NiAwZiA0NCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZlICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGRhOgk2NiAwZiA0NSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZuZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGUyOgk2NiAwZiA0NiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZiZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGVhOgk2NiAwZiA0NyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGYyOgk2NiAwZiA0OCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZzICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGZhOgk2NiAwZiA0OSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZucyAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTAyOgk2NiAwZiA0YSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZwICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTBhOgk2NiAwZiA0YiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZucCAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTEyOgk2NiAwZiA0YyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZsICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTFhOgk2NiAwZiA0ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTIyOgk2NiAwZiA0ZSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZsZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTJhOgk2NiAwZiA0ZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTMyOgk2NiAwZiBhMCBbIAldKnB1c2h3ICAlZnMKLSA5MzU6CTY2IDBmIGExIFsgCV0qcG9wdyAgICVmcwotIDkzODoJNjYgMGYgYTMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidCAgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk0MDoJNjYgMGYgYTQgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgXCQweDkwLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NDk6CTY2IDBmIGE1IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgICVjbCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTUxOgk2NiAwZiBhOCBbIAldKnB1c2h3ICAlZ3MKLSA5NTQ6CTY2IDBmIGE5IFsgCV0qcG9wdyAgICVncwotIDk1NzoJNjYgMGYgYWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHMgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk1ZjoJNjYgMGYgYWMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgXCQweDkwLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5Njg6CTY2IDBmIGFkIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgICVjbCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTcwOgk2NiAwZiBhZiA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTc4Ogk2NiAwZiBiMSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcHhjaGcgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk4MDoJNjYgMGYgYjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc3MgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDk4ODoJNjYgMGYgYjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHIgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk5MDoJNjYgMGYgYjQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZnMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDk5ODoJNjYgMGYgYjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZ3MgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDlhMDoJNjYgMGYgYjYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z6YncgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDlhODoJNjYgMGYgYmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpidGMgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDliMDoJNjYgMGYgYmMgOTAgOTAgOTAgOTAgOTAgWyAJXSpic2YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDliODoJNjYgMGYgYmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpic3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDljMDoJNjYgMGYgYmUgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZzYncgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDljODoJNjYgMGYgYzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzU5NjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUucworKysgL2Rldi9udWxsCkBAIC0xLDU2NyArMCwwIEBACi0udGV4dAotZm9vOgotIGFkZCAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIGFkZCAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhZGQgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBhZGQgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gYWRkICAgICQweDkwLCVhbAotIGFkZCAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gcHVzaCAgICVlcwotIHBvcCAgICAlZXMKLSBvciAgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBvciAgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gb3IgICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gb3IgICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG9yICAgICAkMHg5MCwlYWwKLSBvciAgICAgJDB4OTA5MDkwOTAsJWVheAotIHB1c2ggICAlY3MKLSBhZGMgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBhZGMgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gYWRjICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGFkYyAgICAkMHg5MCwlYWwKLSBhZGMgICAgJDB4OTA5MDkwOTAsJWVheAotIHB1c2ggICAlc3MKLSBwb3AgICAgJXNzCi0gc2JiICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gc2JiICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNiYiAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIHNiYiAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBzYmIgICAgJDB4OTAsJWFsCi0gc2JiICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJWRzCi0gcG9wICAgICVkcwotIGFuZCAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIGFuZCAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhbmQgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBhbmQgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gYW5kICAgICQweDkwLCVhbAotIGFuZCAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gZGFhCi0gc3ViICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gc3ViICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHN1YiAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIHN1YiAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBzdWIgICAgJDB4OTAsJWFsCi0gc3ViICAgICQweDkwOTA5MDkwLCVlYXgKLSBkYXMKLSB4b3IgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSB4b3IgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0geG9yICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0geG9yICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHhvciAgICAkMHg5MCwlYWwKLSB4b3IgICAgJDB4OTA5MDkwOTAsJWVheAotIGFhYQotIGNtcCAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIGNtcCAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBjbXAgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBjbXAgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21wICAgICQweDkwLCVhbAotIGNtcCAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gYWFzCi0gaW5jICAgICVlYXgKLSBpbmMgICAgJWVjeAotIGluYyAgICAlZWR4Ci0gaW5jICAgICVlYngKLSBpbmMgICAgJWVzcAotIGluYyAgICAlZWJwCi0gaW5jICAgICVlc2kKLSBpbmMgICAgJWVkaQotIGRlYyAgICAlZWF4Ci0gZGVjICAgICVlY3gKLSBkZWMgICAgJWVkeAotIGRlYyAgICAlZWJ4Ci0gZGVjICAgICVlc3AKLSBkZWMgICAgJWVicAotIGRlYyAgICAlZXNpCi0gZGVjICAgICVlZGkKLSBwdXNoICAgJWVheAotIHB1c2ggICAlZWN4Ci0gcHVzaCAgICVlZHgKLSBwdXNoICAgJWVieAotIHB1c2ggICAlZXNwCi0gcHVzaCAgICVlYnAKLSBwdXNoICAgJWVzaQotIHB1c2ggICAlZWRpCi0gcG9wICAgICVlYXgKLSBwb3AgICAgJWVjeAotIHBvcCAgICAlZWR4Ci0gcG9wICAgICVlYngKLSBwb3AgICAgJWVzcAotIHBvcCAgICAlZWJwCi0gcG9wICAgICVlc2kKLSBwb3AgICAgJWVkaQotIHB1c2hhCi0gcG9wYQotIGJvdW5kICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhcnBsICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNoICAgJDB4OTA5MDkwOTAKLSBpbXVsICAgJDB4OTA5MDkwOTAsMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gcHVzaCAgICQweGZmZmZmZjkwCi0gaW11bCAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGluc2IgICAoJWR4KSwlZXM6KCVlZGkpCi0gaW5zbCAgICglZHgpLCVlczooJWVkaSkKLSBvdXRzYiAgJWRzOiglZXNpKSwoJWR4KQotIG91dHNsICAlZHM6KCVlc2kpLCglZHgpCi0gam8gICAgIC4rMi0weDcwCi0gam5vICAgIC4rMi0weDcwCi0gamIgICAgIC4rMi0weDcwCi0gamFlICAgIC4rMi0weDcwCi0gamUgICAgIC4rMi0weDcwCi0gam5lICAgIC4rMi0weDcwCi0gamJlICAgIC4rMi0weDcwCi0gamEgICAgIC4rMi0weDcwCi0ganMgICAgIC4rMi0weDcwCi0gam5zICAgIC4rMi0weDcwCi0ganAgICAgIC4rMi0weDcwCi0gam5wICAgIC4rMi0weDcwCi0gamwgICAgIC4rMi0weDcwCi0gamdlICAgIC4rMi0weDcwCi0gamxlICAgIC4rMi0weDcwCi0gamcgICAgIC4rMi0weDcwCi0gYWRjYiAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSBhZGNsICAgJDB4OTA5MDkwOTAsMHg5MDkwOTA5MCglZWF4KQotIGFkY2wgICAkMHhmZmZmZmY5MCwweDkwOTA5MDkwKCVlYXgpCi0gdGVzdCAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gdGVzdCAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhjaGcgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHhjaGcgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBtb3YgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBtb3YgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gbW92ICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdmwgICAlc3MsMHg5MDkwOTA5MCglZWF4KQotIGxlYSAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZsICAgMHg5MDkwOTA5MCglZWF4KSwlc3MKLSBwb3BsICAgMHg5MDkwOTA5MCglZWF4KQotIHhjaGcgICAlZWF4LCVlYXgKLSB4Y2hnICAgJWVheCwlZWN4Ci0geGNoZyAgICVlYXgsJWVkeAotIHhjaGcgICAlZWF4LCVlYngKLSB4Y2hnICAgJWVheCwlZXNwCi0geGNoZyAgICVlYXgsJWVicAotIHhjaGcgICAlZWF4LCVlc2kKLSB4Y2hnICAgJWVheCwlZWRpCi0gY3d0bAotIGNsdGQKLSBsY2FsbCAgJDB4OTA5MCwkMHg5MDkwOTA5MAotIGZ3YWl0Ci0gcHVzaGYKLSBwb3BmCi0gc2FoZgotIGxhaGYKLSBtb3YgICAgMHg5MDkwOTA5MCwlYWwKLSBtb3YgICAgMHg5MDkwOTA5MCwlZWF4Ci0gbW92ICAgICVhbCwweDkwOTA5MDkwCi0gbW92ICAgICVlYXgsMHg5MDkwOTA5MAotIG1vdnNiICAlZHM6KCVlc2kpLCVlczooJWVkaSkKLSBtb3ZzbCAgJWRzOiglZXNpKSwlZXM6KCVlZGkpCi0gY21wc2IgICVlczooJWVkaSksJWRzOiglZXNpKQotIGNtcHNsICAlZXM6KCVlZGkpLCVkczooJWVzaSkKLSB0ZXN0ICAgJDB4OTAsJWFsCi0gdGVzdCAgICQweDkwOTA5MDkwLCVlYXgKLSBzdG9zICAgJWFsLCVlczooJWVkaSkKLSBzdG9zICAgJWVheCwlZXM6KCVlZGkpCi0gbG9kcyAgICVkczooJWVzaSksJWFsCi0gbG9kcyAgICVkczooJWVzaSksJWVheAotIHNjYXMgICAlZXM6KCVlZGkpLCVhbAotIHNjYXMgICAlZXM6KCVlZGkpLCVlYXgKLSBtb3YgICAgJDB4OTAsJWFsCi0gbW92ICAgICQweDkwLCVjbAotIG1vdiAgICAkMHg5MCwlZGwKLSBtb3YgICAgJDB4OTAsJWJsCi0gbW92ICAgICQweDkwLCVhaAotIG1vdiAgICAkMHg5MCwlY2gKLSBtb3YgICAgJDB4OTAsJWRoCi0gbW92ICAgICQweDkwLCViaAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gbW92ICAgICQweDkwOTA5MDkwLCVlY3gKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVkeAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWJ4Ci0gbW92ICAgICQweDkwOTA5MDkwLCVlc3AKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVicAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZXNpCi0gbW92ICAgICQweDkwOTA5MDkwLCVlZGkKLSByY2xiICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIHJjbGwgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gcmV0ICAgICQweDkwOTAKLSByZXQKLSBsZXMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbGRzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdmIgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gbW92bCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCkKLSBlbnRlciAgJDB4OTA5MCwkMHg5MAotIGxlYXZlCi0gbHJldCAgICQweDkwOTAKLSBscmV0Ci0gaW50MwotIGludCAgICAkMHg5MAotIGludG8KLSBpcmV0Ci0gcmNsYiAgIDB4OTA5MDkwOTAoJWVheCkKLSByY2xsICAgMHg5MDkwOTA5MCglZWF4KQotIHJjbGIgICAlY2wsMHg5MDkwOTA5MCglZWF4KQotIHJjbGwgICAlY2wsMHg5MDkwOTA5MCglZWF4KQotIGFhbSAgICAkMHhmZmZmZmY5MAotIGFhZCAgICAkMHhmZmZmZmY5MAotIHhsYXQgICAlZHM6KCVlYngpCi0gZmNvbXMgIDB4OTA5MDkwOTAoJWVheCkKLSBmc3RzICAgMHg5MDkwOTA5MCglZWF4KQotIGZpY29tbCAweDkwOTA5MDkwKCVlYXgpCi0gZmlzdGwgIDB4OTA5MDkwOTAoJWVheCkKLSBmY29tbCAgMHg5MDkwOTA5MCglZWF4KQotIGZzdGwgICAweDkwOTA5MDkwKCVlYXgpCi0gZmljb20gIDB4OTA5MDkwOTAoJWVheCkKLSBmaXN0ICAgMHg5MDkwOTA5MCglZWF4KQotIGxvb3BuZSAuKzItMHg3MAotIGxvb3BlICAuKzItMHg3MAotIGxvb3AgICAuKzItMHg3MAotIGplY3h6ICAuKzItMHg3MAotIGluICAgICAkMHg5MCwlYWwKLSBpbiAgICAgJDB4OTAsJWVheAotIG91dCAgICAlYWwsJDB4OTAKLSBvdXQgICAgJWVheCwkMHg5MAotIGNhbGwgICAuKzUrMHg5MDkwOTA5MAotIGptcCAgICAuKzUrMHg5MDkwOTA5MAotIGxqbXAgICAkMHg5MDkwLCQweDkwOTA5MDkwCi0gam1wICAgIC4rMi0weDcwCi0gaW4gICAgICglZHgpLCVhbAotIGluICAgICAoJWR4KSwlZWF4Ci0gb3V0ICAgICVhbCwoJWR4KQotIG91dCAgICAlZWF4LCglZHgpCi0gaGx0Ci0gY21jCi0gbm90YiAgIDB4OTA5MDkwOTAoJWVheCkKLSBub3RsICAgMHg5MDkwOTA5MCglZWF4KQotIGNsYwotIHN0YwotIGNsaQotIHN0aQotIGNsZAotIHN0ZAotIGNhbGwgICAqMHg5MDkwOTA5MCglZWF4KQotIGxsZHQgICAweDkwOTA5MDkwKCVlYXgpCi0gbGdkdCAgIDB4OTA5MDkwOTAoJWVheCkKLSBsYXIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbHNsICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNsdHMKLSBpbnZkCi0gd2JpbnZkCi0gdWQyYQotIG1vdiAgICAlY3IyLCVlYXgKLSBtb3YgICAgJWRiMiwlZWF4Ci0gbW92ICAgICVlYXgsJWNyMgotIG1vdiAgICAlZWF4LCVkYjIKLSBtb3YgICAgJXRyMiwlZWF4Ci0gbW92ICAgICVlYXgsJXRyMgotIHdybXNyCi0gcmR0c2MKLSByZG1zcgotIHJkcG1jCi0gY21vdm8gIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZubyAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92YiAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmFlIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZlICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bmUgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmJlIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZhICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92cyAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5zIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZwICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bnAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmwgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZnZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bGUgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmcgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHB1bnBja2xidyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2tsd2QgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNrbGRxIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhY2tzc3diIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBndGIgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGd0dyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZ3RkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhY2t1c3diIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2hidyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2tod2QgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNraGRxIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhY2tzc2R3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIG1vdmQgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBtb3ZxICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNybHcgICQweDkwLCVtbTAKLSBwc3JsZCAgJDB4OTAsJW1tMAotIHBzcmxxICAkMHg5MCwlbW0wCi0gcGNtcGVxYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZXF3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBlcWQgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gZW1tcwotIG1vdmQgICAlbW0yLDB4OTA5MDkwOTAoJWVheCkKLSBtb3ZxICAgJW1tMiwweDkwOTA5MDkwKCVlYXgpCi0gam8gICAgIC4rNisweDkwOTA5MDkwCi0gam5vICAgIC4rNisweDkwOTA5MDkwCi0gamIgICAgIC4rNisweDkwOTA5MDkwCi0gamFlICAgIC4rNisweDkwOTA5MDkwCi0gamUgICAgIC4rNisweDkwOTA5MDkwCi0gam5lICAgIC4rNisweDkwOTA5MDkwCi0gamJlICAgIC4rNisweDkwOTA5MDkwCi0gamEgICAgIC4rNisweDkwOTA5MDkwCi0ganMgICAgIC4rNisweDkwOTA5MDkwCi0gam5zICAgIC4rNisweDkwOTA5MDkwCi0ganAgICAgIC4rNisweDkwOTA5MDkwCi0gam5wICAgIC4rNisweDkwOTA5MDkwCi0gamwgICAgIC4rNisweDkwOTA5MDkwCi0gamdlICAgIC4rNisweDkwOTA5MDkwCi0gamxlICAgIC4rNisweDkwOTA5MDkwCi0gamcgICAgIC4rNisweDkwOTA5MDkwCi0gc2V0byAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRubyAgMHg5MDkwOTA5MCglZWF4KQotIHNldGIgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0YWUgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRlICAgMHg5MDkwOTA5MCglZWF4KQotIHNldG5lICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0YmUgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRhICAgMHg5MDkwOTA5MCglZWF4KQotIHNldHMgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bnMgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRwICAgMHg5MDkwOTA5MCglZWF4KQotIHNldG5wICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bCAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRnZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGxlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0ZyAgIDB4OTA5MDkwOTAoJWVheCkKLSBwdXNoICAgJWZzCi0gcG9wICAgICVmcwotIGNwdWlkCi0gYnQgICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNobGQgICAkMHg5MCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaGxkICAgJWNsLCVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHB1c2ggICAlZ3MKLSBwb3AgICAgJWdzCi0gcnNtCi0gYnRzICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNocmQgICAkMHg5MCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaHJkICAgJWNsLCVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGltdWwgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbXB4Y2hnICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gY21weGNoZyAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsc3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gYnRyICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGxmcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBsZ3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92emJsIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdnp3bCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSB1ZDJiCi0gYnRjICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGJzZiAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBic3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92c2JsIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdnN3bCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSB4YWRkICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSB4YWRkICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYnN3YXAgICVlYXgKLSBic3dhcCAgJWVjeAotIGJzd2FwICAlZWR4Ci0gYnN3YXAgICVlYngKLSBic3dhcCAgJWVzcAotIGJzd2FwICAlZWJwCi0gYnN3YXAgICVlc2kKLSBic3dhcCAgJWVkaQotIHBzcmx3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JsZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNybHEgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBtdWxsdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3VidXNiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJ1c3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFuZCAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGR1c2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZHVzdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYW5kbiAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNyYXcgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmFkICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwbXVsaHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YnNiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJzdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwb3IgICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZHNiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGRzdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBweG9yICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNsbHcgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzbGxkICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc2xscSAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG1hZGR3ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3ViYiAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YncgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJkICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkYiAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZHcgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGRkICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBhZGQgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhZGQgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBhZGQgICAgJDB4OTA5MCwlYXgKLSBwdXNodyAgJWVzCi0gcG9wdyAgICVlcwotIG9yICAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIG9yICAgICAkMHg5MDkwLCVheAotIHB1c2h3ICAlY3MKLSBhZGMgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhZGMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBhZGMgICAgJDB4OTA5MCwlYXgKLSBwdXNodyAgJXNzCi0gcG9wdyAgICVzcwotIHNiYiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNiYiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHNiYiAgICAkMHg5MDkwLCVheAotIHB1c2h3ICAlZHMKLSBwb3B3ICAgJWRzCi0gYW5kICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYW5kICAgICQweDkwOTAsJWF4Ci0gc3ViICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc3ViICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gc3ViICAgICQweDkwOTAsJWF4Ci0geG9yICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0geG9yICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0geG9yICAgICQweDkwOTAsJWF4Ci0gY21wICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21wICAgICQweDkwOTAsJWF4Ci0gaW5jICAgICVheAotIGluYyAgICAlY3gKLSBpbmMgICAgJWR4Ci0gaW5jICAgICVieAotIGluYyAgICAlc3AKLSBpbmMgICAgJWJwCi0gaW5jICAgICVzaQotIGluYyAgICAlZGkKLSBkZWMgICAgJWF4Ci0gZGVjICAgICVjeAotIGRlYyAgICAlZHgKLSBkZWMgICAgJWJ4Ci0gZGVjICAgICVzcAotIGRlYyAgICAlYnAKLSBkZWMgICAgJXNpCi0gZGVjICAgICVkaQotIHB1c2ggICAlYXgKLSBwdXNoICAgJWN4Ci0gcHVzaCAgICVkeAotIHB1c2ggICAlYngKLSBwdXNoICAgJXNwCi0gcHVzaCAgICVicAotIHB1c2ggICAlc2kKLSBwdXNoICAgJWRpCi0gcG9wICAgICVheAotIHBvcCAgICAlY3gKLSBwb3AgICAgJWR4Ci0gcG9wICAgICVieAotIHBvcCAgICAlc3AKLSBwb3AgICAgJWJwCi0gcG9wICAgICVzaQotIHBvcCAgICAlZGkKLSBwdXNoYXcKLSBwb3BhdwotIGJvdW5kICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHB1c2h3ICAkMHg5MDkwCi0gaW11bCAgICQweDkwOTAsMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBwdXNodyAgJDB4ZmZmZmZmOTAKLSBpbXVsICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBpbnN3ICAgKCVkeCksJWVzOiglZWRpKQotIG91dHN3ICAlZHM6KCVlc2kpLCglZHgpCi0gYWRjdyAgICQweDkwOTAsMHg5MDkwOTA5MCglZWF4KQotIGFkY3cgICAkMHhmZmZmZmY5MCwweDkwOTA5MDkwKCVlYXgpCi0gdGVzdCAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbW92dyAgICVzcywweDkwOTA5MDkwKCVlYXgpCi0gbGVhICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gcG9wdyAgIDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWF4LCVjeAotIHhjaGcgICAlYXgsJWR4Ci0geGNoZyAgICVheCwlYngKLSB4Y2hnICAgJWF4LCVzcAotIHhjaGcgICAlYXgsJWJwCi0geGNoZyAgICVheCwlc2kKLSB4Y2hnICAgJWF4LCVkaQotIGNidHcKLSBjd3RkCi0gbGNhbGx3ICQweDkwOTAsJDB4OTA5MAotIHB1c2hmdwotIHBvcGZ3Ci0gbW92ICAgIDB4OTA5MDkwOTAsJWF4Ci0gbW92ICAgICVheCwweDkwOTA5MDkwCi0gbW92c3cgICVkczooJWVzaSksJWVzOiglZWRpKQotIGNtcHN3ICAlZXM6KCVlZGkpLCVkczooJWVzaSkKLSB0ZXN0ICAgJDB4OTA5MCwlYXgKLSBzdG9zICAgJWF4LCVlczooJWVkaSkKLSBsb2RzICAgJWRzOiglZXNpKSwlYXgKLSBzY2FzICAgJWVzOiglZWRpKSwlYXgKLSBtb3YgICAgJDB4OTA5MCwlYXgKLSBtb3YgICAgJDB4OTA5MCwlY3gKLSBtb3YgICAgJDB4OTA5MCwlZHgKLSBtb3YgICAgJDB4OTA5MCwlYngKLSBtb3YgICAgJDB4OTA5MCwlc3AKLSBtb3YgICAgJDB4OTA5MCwlYnAKLSBtb3YgICAgJDB4OTA5MCwlc2kKLSBtb3YgICAgJDB4OTA5MCwlZGkKLSByY2x3ICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIHJldHcgICAkMHg5MDkwCi0gcmV0dwotIGxlcyAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGxkcyAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIG1vdncgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCkKLSBlbnRlcncgJDB4OTA5MCwkMHg5MAotIGxlYXZldwotIGxyZXR3ICAkMHg5MDkwCi0gbHJldHcKLSBpcmV0dwotIHJjbHcgICAweDkwOTA5MDkwKCVlYXgpCi0gcmNsdyAgICVjbCwweDkwOTA5MDkwKCVlYXgpCi0gaW4gICAgICQweDkwLCVheAotIG91dCAgICAlYXgsJDB4OTAKLSBjYWxsdyAgLiszKzB4OTA5MAotIGxqbXB3ICAkMHg5MDkwLCQweDkwOTAKLSBpbiAgICAgKCVkeCksJWF4Ci0gb3V0ICAgICVheCwoJWR4KQotIG5vdHcgICAweDkwOTA5MDkwKCVlYXgpCi0gY2FsbHcgICoweDkwOTA5MDkwKCVlYXgpCi0gbGFyICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbHNsICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdm8gIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdm5vIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmIgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmFlIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmUgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdm5lIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmJlIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmEgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdnMgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdm5zIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdnAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdm5wIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmwgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmdlIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmxlIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21vdmcgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gcHVzaHcgICVmcwotIHBvcHcgICAlZnMKLSBidCAgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaGxkICAgJDB4OTAsJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaGxkICAgJWNsLCVkeCwweDkwOTA5MDkwKCVlYXgpCi0gcHVzaHcgICVncwotIHBvcHcgICAlZ3MKLSBidHMgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaHJkICAgJDB4OTAsJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaHJkICAgJWNsLCVkeCwweDkwOTA5MDkwKCVlYXgpCi0gaW11bCAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gY21weGNoZyAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGxzcyAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGJ0ciAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGxmcyAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGxncyAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIG1vdnpidyAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGJ0YyAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGJzZiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGJzciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIG1vdnNidyAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHhhZGQgICAlZHgsMHg5MDkwOTA5MCglZWF4KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXguZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZWJhODEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXguZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IHByZWZpeAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJOWIgNjcgMjYgZDkgM2MgWyAJXSphZGRyMTYgZnN0Y3cgJWVzOlwoJXNpXCkKLSAgIDU6CTliIGRmIGUwIFsgCV0qZnN0c3cgICVheAotICAgODoJOWIgZGYgZTAgWyAJXSpmc3RzdyAgJWF4Ci0gICBiOgk5YiBkZiBlMCBbIAldKmZzdHN3ICAlYXgKLSAgIGU6CTliIDY3IGRmIGUwIFsgCV0qYWRkcjE2IGZzdHN3ICVheAotICAxMjoJZjMgNjcgNjYgMzYgYTcgWyAJXSpyZXB6IGFkZHIxNiBjbXBzdyAlZXM6XCglZGlcKSwlc3M6XCglc2lcKQotICAxNzoJOTAgWyAJXSpub3AgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5OGI0MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLnRleHQKLWZvbzoKLSBhZGRyMTYgZnN0Y3cgJWVzOiglc2kpCi0gZnN0c3cKLSBmc3RzdyAlYXgKLSBmc3RzdyAlZWF4Ci0gYWRkcjE2IGZzdHN3ICVheAotIGFkZHIxNiByZXAgY21wc3cgJWVzOiglZGkpLCVzczooJXNpKQotCi0jIEdldCBhIGdvb2QgYWxpZ25tZW50LgotIG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjk2OGM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHJ3Ci0jbmFtZTogaTM4NiByZWxvYwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qaTM4Ni4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxmb28+OgotICAgMDoJYjMgMDAgWyAJXSptb3YgICAgXCQweDAsJWJsCTE6IChSXzM4Nl8pPzgJLnRleHQKLSAgIDI6CTY4IDAwIDAwIDAwIDAwIFsgCV0qcHVzaCAgIFwkMHgwCTM6IChSXzM4Nl8pPzMyCS50ZXh0Ci0gICA3OgkwNSAwMCAwMCAwMCAwMCBbIAldKmFkZCAgICBcJDB4MCwlZWF4CTg6IChSXzM4Nl8pPzMyCS50ZXh0Ci0gICBjOgk4MSBjMyAwMCAwMCAwMCAwMCBbIAldKmFkZCAgICBcJDB4MCwlZWJ4CWU6IChSXzM4Nl8pPzMyCS50ZXh0Ci0gIDEyOgk2OSBkMiAwMCAwMCAwMCAwMCBbIAldKmltdWwgICBcJDB4MCwlZWR4LCVlZHgJMTQ6IChSXzM4Nl8pPzMyCS50ZXh0Ci0gIDE4Ogk5YSAwMCAwMCAwMCAwMCAwMCAwMCBbIAldKmxjYWxsICBcJDB4MCxcJDB4MAkxOTogKFJfMzg2Xyk/MzIJLnRleHQKLSAgMWY6CTY2IDY4IDAwIDAwIFsgCV0qcHVzaHcgIFwkMHgwCTIxOiAoUl8zODZfKT8xNgkudGV4dAotICAyMzoJOTAgWyAJXSpub3AgICAgCi0gIDI0Ogk5MCBbIAldKm5vcCAgICAKLSAgMjU6CTkwIFsgCV0qbm9wICAgIAotICAyNjoJOTAgWyAJXSpub3AgICAgCi0gIDI3Ogk5MCBbIAldKm5vcCAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmOTViNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0udGV4dAotZm9vOgltb3YJJGZvbywgJWJsCi0JcHVzaAkkZm9vCi0JYWRkCSRmb28sICVlYXgKLQlhZGQJJGZvbywgJWVieAotCWltdWwJJGZvbywgJWVkeAotCWxjYWxsCSQwLCAkZm9vCi0JcHVzaHcJJGZvbwotCi0jIFBhZCBvdXQgdG8gYSBnb29kIGFsaWdubWVudAotIC5ieXRlIDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2U2MTYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUubAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSMgdGVzdCBoYW5kbGluZyBvZiB3aGl0ZXNwYWNlLCBhbmQgdXBwZXItY2FzZQotICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS5UZVh0IAotICAgMyAwMDAwIDM2ICAgICAgICAgICAgICAgICAgICAgICAgIAkJc3MgCi0gICA0IDAwMDEgODgwMyAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgJSBhbCAsIFwoICUgZWJ4IFwpIAotICAgNSAwMDAzIEM3MDVENzExIDAwMDA3QjAwIDAwMDAgICAgIAkgICAgICAgIG1PdmwgXCQgMTIzICwgNDU2NyAKLSAgIDYgMDAwZCA2NzhBNzg3QiAgICAgICAgICAgICAgICAgICAJIEFERHIxNgltb3YgMTIzIFwoICUgYnggLCAlIHNpICwgMSBcKSAsICUgYmggCi0gICA3IDAwMTEgRkZFMCAgICAgICAgICAgICAgICAgICAgICAgCQlqbXAgXCogJSBlYXggCi0gICA4IDAwMTMgNjYyNkZGMjMgICAgICAgICAgICAgICAgICAgCWZvbzoJam1wdyAlIGVzIDogXCogXCggJSBlYnggXCkJCi0gICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJIAotICAxMCAwMDE3IEEwNTAwMDAwIDAwICAgICAgICAgICAgICAgIAkJbW92IFwoIDB4OCBcKiAwWGEgXCkgLCAlIGFsIAotICAxMSAwMDFjIEIwMjAgICAgICAgICAgICAgICAgICAgICAgIAkJbW92IFwkIFwoIDggXCogNCBcKSAsICUgYWwgCi0gIDEyIDAwMWUgQjcxMyAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgZm9vICwgJSBiSCAKLSAgMTMgMDAyMCBCNzEzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdmIgXCQgZm9vICwgJSBCSCAKLSAgMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCi0gIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLkNPREUxNgkKLSAgMTYgMDAyMiA2NkI4MTMwMCAwMDAwICAgICAgICAgICAgICAJCU1vdiBcJCBmb28gLCAlZUF4CQotICAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS5Db2RlMzIgCi0gIDE4IDAwMjggNjZCODEzMDAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgZm9vICwgJWF4CQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmY1MDcwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgdGVzdCBoYW5kbGluZyBvZiB3aGl0ZXNwYWNlLCBhbmQgdXBwZXItY2FzZQotLlRlWHQgCi0Jc3MgCi0JbW92ICUgYWwgLCAoICUgZWJ4ICkgCi0gICAgICAgIG1PdmwgJCAxMjMgLCA0NTY3IAotIEFERHIxNgltb3YgMTIzICggJSBieCAsICUgc2kgLCAxICkgLCAlIGJoIAotCWptcCAqICUgZWF4IAotZm9vOglqbXB3ICUgZXMgOiAqICggJSBlYnggKQkKLSAKLQltb3YgKCAweDggKiAwWGEgKSAsICUgYWwgCi0JbW92ICQgKCA4ICogNCApICwgJSBhbCAKLQltb3YgJCBmb28gLCAlIGJIIAotCW1vdmIgJCBmb28gLCAlIEJIIAotCQotLkNPREUxNgkKLQlNb3YgJCBmb28gLCAlZUF4CQotLkNvZGUzMiAKLQltb3YgJCBmb28gLCAlYXgJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzg4ZDJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBSZXBvcnRlZCA5My8wNS8wOSBieSBKaW0gV2lsc29uOiBJRUVFIHNpbmdsZS1wcmVjaXNpb24gRkxUX01JTiB2YWx1ZSBnZXRzCi0jIGFzc2VtYmxlZCBpbmNvcnJlY3RseS4gIChPZmYgYnkgb25lIHVscC4pCi0KLXByb2MgZG90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIklFRUUgRkxUX01JTiwgc2luZ2xlLXByZWNpc2lvbiIKLSAgICBzZXQgeCAwCi0gICAgZ2FzX3N0YXJ0ICJ4OTMwNTA5YS5zIiAiLWFsIgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiIDAwMDA4MDAwXFsgCVxdKy5zaW5nbGUiIHsgcGFzcyAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIiAwMDgwMDAwMFxbIAlcXSsuc2luZ2xlIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICIgMDA4MCAwMDAwXFsgCVxdKy5zaW5nbGUiIHsgcGFzcyAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIiAuLi4uLi4uLiArLnNpbmdsZSIgeyBmYWlsICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIgeyB9Ci0JICAgIHRpbWVvdXQgeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mIHsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmICEkeCB0aGVuIHsgZmFpbCAiJHRlc3RuYW1lIChsaXN0aW5nIGRpZG4ndCBtYXRjaCkiIH0KLX0KLQotaWYgIVtpc3RhcmdldCB2YXgqLSotKl0gdGhlbiB7Ci0gICAgZG90ZXN0Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MWIzMzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0gICAgICAgIC5nbG9iYWwgX2ZsdF9taW4KLQkuZGF0YQotICAgICAgICAuYWxpZ24gNAotX2ZsdF9taW46Ci0gICAgICAgIC5zaW5nbGUgMHIxLjE3NTQ5NDM1ZS0zOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5NjVlNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogYWxsaW5zbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8YWRkPjoKLSAgIDA6CTBkIGFkIGYwIDAwIAlhZGQgZnAsZnAgXHxcfCBub3AKLQotMCswMDA0IDxhZGQzPjoKLSAgIDQ6CThkIGFkIDAwIDAwIAlhZGQzIGZwLGZwLFsjXSowCi0KLTArMDAwOCA8YW5kPjoKLSAgIDg6CTBkIGNkIGYwIDAwIAlhbmQgZnAsZnAgXHxcfCBub3AKLQotMCswMDBjIDxhbmQzPjoKLSAgIGM6CThkIGNkIDAwIDAwIAlhbmQzIGZwLGZwLFsjXSoweDAKLQotMCswMDEwIDxvcj46Ci0gIDEwOgkwZCBlZCBmMCAwMCAJb3IgZnAsZnAgXHxcfCBub3AKLQotMCswMDE0IDxvcjM+OgotICAxNDoJOGQgZWQgMDAgMDAgCW9yMyBmcCxmcCxbI10qMHgwCi0KLTArMDAxOCA8eG9yPjoKLSAgMTg6CTBkIGRkIGYwIDAwIAl4b3IgZnAsZnAgXHxcfCBub3AKLQotMCswMDFjIDx4b3IzPjoKLSAgMWM6CThkIGRkIDAwIDAwIAl4b3IzIGZwLGZwLFsjXSoweDAKLQotMCswMDIwIDxhZGRpPjoKLSAgMjA6CTRkIDAwIGYwIDAwIAlhZGRpIGZwLFsjXSowIFx8XHwgbm9wCi0KLTArMDAyNCA8YWRkdj46Ci0gIDI0OgkwZCA4ZCBmMCAwMCAJYWRkdiBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMjggPGFkZHYzPjoKLSAgMjg6CThkIDhkIDAwIDAwIAlhZGR2MyBmcCxmcCxbI10qMAotCi0wKzAwMmMgPGFkZHg+OgotICAyYzoJMGQgOWQgZjAgMDAgCWFkZHggZnAsZnAgXHxcfCBub3AKLQotMCswMDMwIDxiYzg+OgotICAzMDoJN2MgZjQgZjAgMDAgCWJjIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDM0IDxiYzhfcz46Ci0gIDM0Ogk3YyBmMyBmMCAwMCAJYmMgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwMzggPGJjMjQ+OgotICAzODoJN2MgZjIgZjAgMDAgCWJjIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDNjIDxiYzI0X2w+OgotICAzYzoJZmMgZmYgZmYgZjEgCWJjIDAgPGFkZD4KLQotMCswMDQwIDxiZXE+OgotICA0MDoJYmQgMGQgZmYgZjAgCWJlcSBmcCxmcCwwIDxhZGQ+Ci0KLTArMDA0NCA8YmVxej46Ci0gIDQ0OgliMCA4ZCBmZiBlZiAJYmVxeiBmcCwwIDxhZGQ+Ci0KLTArMDA0OCA8Ymdlej46Ci0gIDQ4OgliMCBiZCBmZiBlZSAJYmdleiBmcCwwIDxhZGQ+Ci0KLTArMDA0YyA8Ymd0ej46Ci0gIDRjOgliMCBkZCBmZiBlZCAJYmd0eiBmcCwwIDxhZGQ+Ci0KLTArMDA1MCA8Ymxlej46Ci0gIDUwOgliMCBjZCBmZiBlYyAJYmxleiBmcCwwIDxhZGQ+Ci0KLTArMDA1NCA8Ymx0ej46Ci0gIDU0OgliMCBhZCBmZiBlYiAJYmx0eiBmcCwwIDxhZGQ+Ci0KLTArMDA1OCA8Ym5lej46Ci0gIDU4OgliMCA5ZCBmZiBlYSAJYm5leiBmcCwwIDxhZGQ+Ci0KLTArMDA1YyA8Ymw4PjoKLSAgNWM6CTdlIGU5IGYwIDAwIAlibCAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA2MCA8Ymw4X3M+OgotICA2MDoJN2UgZTggZjAgMDAgCWJsIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDY0IDxibDI0PjoKLSAgNjQ6CTdlIGU3IGYwIDAwIAlibCAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA2OCA8YmwyNF9sPjoKLSAgNjg6CWZlIGZmIGZmIGU2IAlibCAwIDxhZGQ+Ci0KLTArMDA2YyA8Ym5jOD46Ci0gIDZjOgk3ZCBlNSBmMCAwMCAJYm5jIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDcwIDxibmM4X3M+OgotICA3MDoJN2QgZTQgZjAgMDAgCWJuYyAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA3NCA8Ym5jMjQ+OgotICA3NDoJN2QgZTMgZjAgMDAgCWJuYyAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA3OCA8Ym5jMjRfbD46Ci0gIDc4OglmZCBmZiBmZiBlMiAJYm5jIDAgPGFkZD4KLQotMCswMDdjIDxibmU+OgotICA3YzoJYmQgMWQgZmYgZTEgCWJuZSBmcCxmcCwwIDxhZGQ+Ci0KLTArMDA4MCA8YnJhOD46Ci0gIDgwOgk3ZiBlMCBmMCAwMCAJYnJhIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDg0IDxicmE4X3M+OgotICA4NDoJN2YgZGYgZjAgMDAgCWJyYSAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA4OCA8YnJhMjQ+OgotICA4ODoJN2YgZGUgZjAgMDAgCWJyYSAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA4YyA8YnJhMjRfbD46Ci0gIDhjOglmZiBmZiBmZiBkZCAJYnJhIDAgPGFkZD4KLQotMCswMDkwIDxjbXA+OgotICA5MDoJMGQgNGQgZjAgMDAgCWNtcCBmcCxmcCBcfFx8IG5vcAotCi0wKzAwOTQgPGNtcGk+OgotICA5NDoJODAgNGQgMDAgMDAgCWNtcGkgZnAsWyNdKjAKLQotMCswMDk4IDxjbXB1PjoKLSAgOTg6CTBkIDVkIGYwIDAwIAljbXB1IGZwLGZwIFx8XHwgbm9wCi0KLTArMDA5YyA8Y21wdWk+OgotICA5YzoJODAgNWQgMDAgMDAgCWNtcHVpIGZwLFsjXSowCi0KLTArMDBhMCA8ZGl2PjoKLSAgYTA6CTlkIDBkIDAwIDAwIAlkaXYgZnAsZnAKLQotMCswMGE0IDxkaXZ1PjoKLSAgYTQ6CTlkIDFkIDAwIDAwIAlkaXZ1IGZwLGZwCi0KLTArMDBhOCA8cmVtPjoKLSAgYTg6CTlkIDJkIDAwIDAwIAlyZW0gZnAsZnAKLQotMCswMGFjIDxyZW11PjoKLSAgYWM6CTlkIDNkIDAwIDAwIAlyZW11IGZwLGZwCi0KLTArMDBiMCA8amw+OgotICBiMDoJMWUgY2QgZjAgMDAgCWpsIGZwIFx8XHwgbm9wCi0KLTArMDBiNCA8am1wPjoKLSAgYjQ6CTFmIGNkIGYwIDAwIAlqbXAgZnAgXHxcfCBub3AKLQotMCswMGI4IDxsZD46Ci0gIGI4OgkyZCBjZCBmMCAwMCAJbGQgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBiYyA8bGRfMj46Ci0gIGJjOgkyZCBjZCBmMCAwMCAJbGQgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBjMCA8bGRfZD46Ci0gIGMwOglhZCBjZCAwMCAwMCAJbGQgZnAsQFwoMCxmcFwpCi0KLTArMDBjNCA8bGRfZDI+OgotICBjNDoJYWQgY2QgMDAgMDAgCWxkIGZwLEBcKDAsZnBcKQotCi0wKzAwYzggPGxkYj46Ci0gIGM4OgkyZCA4ZCBmMCAwMCAJbGRiIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwY2MgPGxkYl8yPjoKLSAgY2M6CTJkIDhkIGYwIDAwIAlsZGIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBkMCA8bGRiX2Q+OgotICBkMDoJYWQgOGQgMDAgMDAgCWxkYiBmcCxAXCgwLGZwXCkKLQotMCswMGQ0IDxsZGJfZDI+OgotICBkNDoJYWQgOGQgMDAgMDAgCWxkYiBmcCxAXCgwLGZwXCkKLQotMCswMGQ4IDxsZGg+OgotICBkODoJMmQgYWQgZjAgMDAgCWxkaCBmcCxAZnAgXHxcfCBub3AKLQotMCswMGRjIDxsZGhfMj46Ci0gIGRjOgkyZCBhZCBmMCAwMCAJbGRoIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwZTAgPGxkaF9kPjoKLSAgZTA6CWFkIGFkIDAwIDAwIAlsZGggZnAsQFwoMCxmcFwpCi0KLTArMDBlNCA8bGRoX2QyPjoKLSAgZTQ6CWFkIGFkIDAwIDAwIAlsZGggZnAsQFwoMCxmcFwpCi0KLTArMDBlOCA8bGR1Yj46Ci0gIGU4OgkyZCA5ZCBmMCAwMCAJbGR1YiBmcCxAZnAgXHxcfCBub3AKLQotMCswMGVjIDxsZHViXzI+OgotICBlYzoJMmQgOWQgZjAgMDAgCWxkdWIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBmMCA8bGR1Yl9kPjoKLSAgZjA6CWFkIDlkIDAwIDAwIAlsZHViIGZwLEBcKDAsZnBcKQotCi0wKzAwZjQgPGxkdWJfZDI+OgotICBmNDoJYWQgOWQgMDAgMDAgCWxkdWIgZnAsQFwoMCxmcFwpCi0KLTArMDBmOCA8bGR1aD46Ci0gIGY4OgkyZCBiZCBmMCAwMCAJbGR1aCBmcCxAZnAgXHxcfCBub3AKLQotMCswMGZjIDxsZHVoXzI+OgotICBmYzoJMmQgYmQgZjAgMDAgCWxkdWggZnAsQGZwIFx8XHwgbm9wCi0KLTArMDEwMCA8bGR1aF9kPjoKLSAxMDA6CWFkIGJkIDAwIDAwIAlsZHVoIGZwLEBcKDAsZnBcKQotCi0wKzAxMDQgPGxkdWhfZDI+OgotIDEwNDoJYWQgYmQgMDAgMDAgCWxkdWggZnAsQFwoMCxmcFwpCi0KLTArMDEwOCA8bGRfcGx1cz46Ci0gMTA4OgkyZCBlZCBmMCAwMCAJbGQgZnAsQGZwXCsgXHxcfCBub3AKLQotMCswMTBjIDxsZDI0PjoKLSAxMGM6CWVkIDAwIDAwIDAwIAlsZDI0IGZwLFsjXSowIDxhZGQ+Ci0JCQkxMGM6IFJfTTMyUl8yNAkuZGF0YQotCi0wKzAxMTAgPGxkaTg+OgotIDExMDoJNmQgMDAgZjAgMDAgCWxkaSBmcCxbI10qMCBcfFx8IG5vcAotCi0wKzAxMTQgPGxkaTE2PjoKLSAxMTQ6CTlkIGYwIDAxIDAwIAlsZGkgZnAsWyNdKjI1NgotCi0wKzAxMTggPGxvY2s+OgotIDExODoJMmQgZGQgZjAgMDAgCWxvY2sgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDExYyA8bWFjaGk+OgotIDExYzoJM2QgNGQgZjAgMDAgCW1hY2hpIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEyMCA8bWFjbG8+OgotIDEyMDoJM2QgNWQgZjAgMDAgCW1hY2xvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEyNCA8bWFjd2hpPjoKLSAxMjQ6CTNkIDZkIGYwIDAwIAltYWN3aGkgZnAsZnAgXHxcfCBub3AKLQotMCswMTI4IDxtYWN3bG8+OgotIDEyODoJM2QgN2QgZjAgMDAgCW1hY3dsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAxMmMgPG11bD46Ci0gMTJjOgkxZCA2ZCBmMCAwMCAJbXVsIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEzMCA8bXVsaGk+OgotIDEzMDoJM2QgMGQgZjAgMDAgCW11bGhpIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEzNCA8bXVsbG8+OgotIDEzNDoJM2QgMWQgZjAgMDAgCW11bGxvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEzOCA8bXVsd2hpPjoKLSAxMzg6CTNkIDJkIGYwIDAwIAltdWx3aGkgZnAsZnAgXHxcfCBub3AKLQotMCswMTNjIDxtdWx3bG8+OgotIDEzYzoJM2QgM2QgZjAgMDAgCW11bHdsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAxNDAgPG12PjoKLSAxNDA6CTFkIDhkIGYwIDAwIAltdiBmcCxmcCBcfFx8IG5vcAotCi0wKzAxNDQgPG12ZmFjaGk+OgotIDE0NDoJNWQgZjAgZjAgMDAgCW12ZmFjaGkgZnAgXHxcfCBub3AKLQotMCswMTQ4IDxtdmZhY2xvPjoKLSAxNDg6CTVkIGYxIGYwIDAwIAltdmZhY2xvIGZwIFx8XHwgbm9wCi0KLTArMDE0YyA8bXZmYWNtaT46Ci0gMTRjOgk1ZCBmMiBmMCAwMCAJbXZmYWNtaSBmcCBcfFx8IG5vcAotCi0wKzAxNTAgPG12ZmM+OgotIDE1MDoJMWQgOTAgZjAgMDAgCW12ZmMgZnAscHN3IFx8XHwgbm9wCi0KLTArMDE1NCA8bXZ0YWNoaT46Ci0gMTU0Ogk1ZCA3MCBmMCAwMCAJbXZ0YWNoaSBmcCBcfFx8IG5vcAotCi0wKzAxNTggPG12dGFjbG8+OgotIDE1ODoJNWQgNzEgZjAgMDAgCW12dGFjbG8gZnAgXHxcfCBub3AKLQotMCswMTVjIDxtdnRjPjoKLSAxNWM6CTEwIGFkIGYwIDAwIAltdnRjIGZwLHBzdyBcfFx8IG5vcAotCi0wKzAxNjAgPG5lZz46Ci0gMTYwOgkwZCAzZCBmMCAwMCAJbmVnIGZwLGZwIFx8XHwgbm9wCi0KLTArMDE2NCA8bm9wPjoKLSAxNjQ6CTcwIDAwIGYwIDAwIAlub3AgXHxcfCBub3AKLQotMCswMTY4IDxub3Q+OgotIDE2ODoJMGQgYmQgZjAgMDAgCW5vdCBmcCxmcCBcfFx8IG5vcAotCi0wKzAxNmMgPHJhYz46Ci0gMTZjOglkZCBjMCAwMCAwMCAJc2V0aCBmcCxbI10qMHgwCi0KLTArMDE3MCA8c2xsPjoKLSAxNzA6CTFkIDRkIGYwIDAwIAlzbGwgZnAsZnAgXHxcfCBub3AKLQotMCswMTc0IDxzbGwzPjoKLSAxNzQ6CTlkIGNkIDAwIDAwIAlzbGwzIGZwLGZwLFsjXSowCi0KLTArMDE3OCA8c2xsaT46Ci0gMTc4Ogk1ZCA0MCBmMCAwMCAJc2xsaSBmcCxbI10qMHgwIFx8XHwgbm9wCi0KLTArMDE3YyA8c3JhPjoKLSAxN2M6CTFkIDJkIGYwIDAwIAlzcmEgZnAsZnAgXHxcfCBub3AKLQotMCswMTgwIDxzcmEzPjoKLSAxODA6CTlkIGFkIDAwIDAwIAlzcmEzIGZwLGZwLFsjXSowCi0KLTArMDE4NCA8c3JhaT46Ci0gMTg0Ogk1ZCAyMCBmMCAwMCAJc3JhaSBmcCxbI10qMHgwIFx8XHwgbm9wCi0KLTArMDE4OCA8c3JsPjoKLSAxODg6CTFkIDBkIGYwIDAwIAlzcmwgZnAsZnAgXHxcfCBub3AKLQotMCswMThjIDxzcmwzPjoKLSAxOGM6CTlkIDhkIDAwIDAwIAlzcmwzIGZwLGZwLFsjXSowCi0KLTArMDE5MCA8c3JsaT46Ci0gMTkwOgk1ZCAwMCBmMCAwMCAJc3JsaSBmcCxbI10qMHgwIFx8XHwgbm9wCi0KLTArMDE5NCA8c3Q+OgotIDE5NDoJMmQgNGQgZjAgMDAgCXN0IGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxOTggPHN0XzI+OgotIDE5ODoJMmQgNGQgZjAgMDAgCXN0IGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxOWMgPHN0X2Q+OgotIDE5YzoJYWQgNGQgMDAgMDAgCXN0IGZwLEBcKDAsZnBcKQotCi0wKzAxYTAgPHN0X2QyPjoKLSAxYTA6CWFkIDRkIDAwIDAwIAlzdCBmcCxAXCgwLGZwXCkKLQotMCswMWE0IDxzdGI+OgotIDFhNDoJMmQgMGQgZjAgMDAgCXN0YiBmcCxAZnAgXHxcfCBub3AKLQotMCswMWE4IDxzdGJfMj46Ci0gMWE4OgkyZCAwZCBmMCAwMCAJc3RiIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxYWMgPHN0Yl9kPjoKLSAxYWM6CWFkIDBkIDAwIDAwIAlzdGIgZnAsQFwoMCxmcFwpCi0KLTArMDFiMCA8c3RiX2QyPjoKLSAxYjA6CWFkIDBkIDAwIDAwIAlzdGIgZnAsQFwoMCxmcFwpCi0KLTArMDFiNCA8c3RoPjoKLSAxYjQ6CTJkIDJkIGYwIDAwIAlzdGggZnAsQGZwIFx8XHwgbm9wCi0KLTArMDFiOCA8c3RoXzI+OgotIDFiODoJMmQgMmQgZjAgMDAgCXN0aCBmcCxAZnAgXHxcfCBub3AKLQotMCswMWJjIDxzdGhfZD46Ci0gMWJjOglhZCAyZCAwMCAwMCAJc3RoIGZwLEBcKDAsZnBcKQotCi0wKzAxYzAgPHN0aF9kMj46Ci0gMWMwOglhZCAyZCAwMCAwMCAJc3RoIGZwLEBcKDAsZnBcKQotCi0wKzAxYzQgPHN0X3BsdXM+OgotIDFjNDoJMmQgNmQgZjAgMDAgCXN0IGZwLEBcK2ZwIFx8XHwgbm9wCi0KLTArMDFjOCA8c3RfbWludXM+OgotIDFjODoJMmQgN2QgZjAgMDAgCXN0IGZwLEAtZnAgXHxcfCBub3AKLQotMCswMWNjIDxzdWI+OgotIDFjYzoJMGQgMmQgZjAgMDAgCXN1YiBmcCxmcCBcfFx8IG5vcAotCi0wKzAxZDAgPHN1YnY+OgotIDFkMDoJMGQgMGQgZjAgMDAgCXN1YnYgZnAsZnAgXHxcfCBub3AKLQotMCswMWQ0IDxzdWJ4PjoKLSAxZDQ6CTBkIDFkIGYwIDAwIAlzdWJ4IGZwLGZwIFx8XHwgbm9wCi0KLTArMDFkOCA8dHJhcD46Ci0gMWQ4OgkxMCBmMCBmMCAwMCAJdHJhcCBbI10qMHgwIFx8XHwgbm9wCi0KLTArMDFkYyA8dW5sb2NrPjoKLSAxZGM6CTJkIDVkIGYwIDAwIAl1bmxvY2sgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDFlMCA8cHVzaD46Ci0gMWUwOgkyZCA3ZiBmMCAwMCAJcHVzaCBmcCBcfFx8IG5vcAotCi0wKzAxZTQgPHBvcD46Ci0gMWU0OgkyZCBlZiBmMCAwMCAJcG9wIGZwIFx8XHwgbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkZGQwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIE0zMlIgYXNzZW1ibGVyIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IG0zMnIqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFsbGluc24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI0NTY5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5zCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLSAuZGF0YQotZm9vZGF0YTogLndvcmQgNDIKLSAudGV4dAotZm9vdGV4dDoKLQkudGV4dAotCS5nbG9iYWwgYWRkCi1hZGQ6Ci0JYWRkIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZDMKLWFkZDM6Ci0JYWRkMyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBhbmQKLWFuZDoKLQlhbmQgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgYW5kMwotYW5kMzoKLQlhbmQzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIG9yCi1vcjoKLQlvciBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBvcjMKLW9yMzoKLQlvcjMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgeG9yCi14b3I6Ci0JeG9yIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHhvcjMKLXhvcjM6Ci0JeG9yMyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBhZGRpCi1hZGRpOgotCWFkZGkgZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgYWRkdgotYWRkdjoKLQlhZGR2IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHYzCi1hZGR2MzoKLQlhZGR2MyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBhZGR4Ci1hZGR4OgotCWFkZHggZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgYmM4Ci1iYzg6Ci0JYmMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiYzhfcwotYmM4X3M6Ci0JYmMucyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJjMjQKLWJjMjQ6Ci0JYmMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiYzI0X2wKLWJjMjRfbDoKLQliYy5sIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmVxCi1iZXE6Ci0JYmVxIGZwLGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmVxegotYmVxejoKLQliZXF6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmdlegotYmdlejoKLQliZ2V6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmd0egotYmd0ejoKLQliZ3R6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmxlegotYmxlejoKLQlibGV6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmx0egotYmx0ejoKLQlibHR6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5legotYm5lejoKLQlibmV6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmw4Ci1ibDg6Ci0JYmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibDhfcwotYmw4X3M6Ci0JYmwucyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsMjQKLWJsMjQ6Ci0JYmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibDI0X2wKLWJsMjRfbDoKLQlibC5sIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5jOAotYm5jODoKLQlibmMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmM4X3MKLWJuYzhfczoKLQlibmMucyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuYzI0Ci1ibmMyNDoKLQlibmMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmMyNF9sCi1ibmMyNF9sOgotCWJuYy5sIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5lCi1ibmU6Ci0JYm5lIGZwLGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYnJhOAotYnJhODoKLQlicmEgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBicmE4X3MKLWJyYThfczoKLQlicmEucyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJyYTI0Ci1icmEyNDoKLQlicmEgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBicmEyNF9sCi1icmEyNF9sOgotCWJyYS5sIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgY21wCi1jbXA6Ci0JY21wIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGNtcGkKLWNtcGk6Ci0JY21waSBmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBjbXB1Ci1jbXB1OgotCWNtcHUgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgY21wdWkKLWNtcHVpOgotCWNtcHVpIGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGRpdgotZGl2OgotCWRpdiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBkaXZ1Ci1kaXZ1OgotCWRpdnUgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgcmVtCi1yZW06Ci0JcmVtIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHJlbXUKLXJlbXU6Ci0JcmVtdSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBqbAotamw6Ci0JamwgZnAKLQkudGV4dAotCS5nbG9iYWwgam1wCi1qbXA6Ci0Jam1wIGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkCi1sZDoKLQlsZCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGRfMgotbGRfMjoKLQlsZCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZF9kCi1sZF9kOgotCWxkIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRfZDIKLWxkX2QyOgotCWxkIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGRiCi1sZGI6Ci0JbGRiIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZGJfMgotbGRiXzI6Ci0JbGRiIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkYl9kCi1sZGJfZDoKLQlsZGIgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGJfZDIKLWxkYl9kMjoKLQlsZGIgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGgKLWxkaDoKLQlsZGggZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkaF8yCi1sZGhfMjoKLQlsZGggZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRoX2QKLWxkaF9kOgotCWxkaCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkaF9kMgotbGRoX2QyOgotCWxkaCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWIKLWxkdWI6Ci0JbGR1YiBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGR1Yl8yCi1sZHViXzI6Ci0JbGR1YiBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHViX2QKLWxkdWJfZDoKLQlsZHViIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGR1Yl9kMgotbGR1Yl9kMjoKLQlsZHViIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGR1aAotbGR1aDoKLQlsZHVoIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoXzIKLWxkdWhfMjoKLQlsZHVoIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWhfZAotbGR1aF9kOgotCWxkdWggZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoX2QyCi1sZHVoX2QyOgotCWxkdWggZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZF9wbHVzCi1sZF9wbHVzOgotCWxkIGZwLEBmcCsKLQkudGV4dAotCS5nbG9iYWwgbGQyNAotbGQyNDoKLQlsZDI0IGZwLGZvb2RhdGEKLQkudGV4dAotCS5nbG9iYWwgbGRpOAotbGRpODoKLQlsZGkgZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBsZGkxNgotbGRpMTY6Ci0JbGRpIGZwLDI1NgotCS50ZXh0Ci0JLmdsb2JhbCBsb2NrCi1sb2NrOgotCWxvY2sgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIG1hY2hpCi1tYWNoaToKLQltYWNoaSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtYWNsbwotbWFjbG86Ci0JbWFjbG8gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbWFjd2hpCi1tYWN3aGk6Ci0JbWFjd2hpIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG1hY3dsbwotbWFjd2xvOgotCW1hY3dsbyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWwKLW11bDoKLQltdWwgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsaGkKLW11bGhpOgotCW11bGhpIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bGxvCi1tdWxsbzoKLQltdWxsbyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWx3aGkKLW11bHdoaToKLQltdWx3aGkgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsd2xvCi1tdWx3bG86Ci0JbXVsd2xvIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12Ci1tdjoKLQltdiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY2hpCi1tdmZhY2hpOgotCW12ZmFjaGkgZnAKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNsbwotbXZmYWNsbzoKLQltdmZhY2xvIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjbWkKLW12ZmFjbWk6Ci0JbXZmYWNtaSBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdmZjCi1tdmZjOgotCW12ZmMgZnAscHN3Ci0JLnRleHQKLQkuZ2xvYmFsIG12dGFjaGkKLW12dGFjaGk6Ci0JbXZ0YWNoaSBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdnRhY2xvCi1tdnRhY2xvOgotCW12dGFjbG8gZnAKLQkudGV4dAotCS5nbG9iYWwgbXZ0YwotbXZ0YzoKLQltdnRjIGZwLHBzdwotCS50ZXh0Ci0JLmdsb2JhbCBuZWcKLW5lZzoKLQluZWcgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbm9wCi1ub3A6Ci0Jbm9wCi0JLnRleHQKLQkuZ2xvYmFsIG5vdAotbm90OgotCW5vdCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCByYWMKLXJhYzoKLQkudGV4dAotCS5nbG9iYWwgcmFjaAotcmFjaDoKLQkudGV4dAotCS5nbG9iYWwgcnRlCi1ydGU6Ci0JLnRleHQKLQkuZ2xvYmFsIHNldGgKLXNldGg6Ci0Jc2V0aCBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNsbAotc2xsOgotCXNsbCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzbGwzCi1zbGwzOgotCXNsbDMgZnAsZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzbGxpCi1zbGxpOgotCXNsbGkgZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzcmEKLXNyYToKLQlzcmEgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc3JhMwotc3JhMzoKLQlzcmEzIGZwLGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3JhaQotc3JhaToKLQlzcmFpIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3JsCi1zcmw6Ci0Jc3JsIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHNybDMKLXNybDM6Ci0Jc3JsMyBmcCxmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNybGkKLXNybGk6Ci0Jc3JsaSBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHN0Ci1zdDoKLQlzdCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgc3RfMgotc3RfMjoKLQlzdCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9kCi1zdF9kOgotCXN0IGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RfZDIKLXN0X2QyOgotCXN0IGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgc3RiCi1zdGI6Ci0Jc3RiIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdGJfMgotc3RiXzI6Ci0Jc3RiIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0Yl9kCi1zdGJfZDoKLQlzdGIgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGJfZDIKLXN0Yl9kMjoKLQlzdGIgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGgKLXN0aDoKLQlzdGggZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN0aF8yCi1zdGhfMjoKLQlzdGggZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RoX2QKLXN0aF9kOgotCXN0aCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0aF9kMgotc3RoX2QyOgotCXN0aCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIHN0X3BsdXMKLXN0X3BsdXM6Ci0Jc3QgZnAsQCtmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdF9taW51cwotc3RfbWludXM6Ci0Jc3QgZnAsQC1mcAotCS50ZXh0Ci0JLmdsb2JhbCBzdWIKLXN1YjoKLQlzdWIgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc3Vidgotc3VidjoKLQlzdWJ2IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN1YngKLXN1Yng6Ci0Jc3VieCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCB0cmFwCi10cmFwOgotCXRyYXAgMAotCS50ZXh0Ci0JLmdsb2JhbCB1bmxvY2sKLXVubG9jazoKLQl1bmxvY2sgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIHB1c2gKLXB1c2g6Ci0JcHVzaCBmcAotCS50ZXh0Ci0JLmdsb2JhbCBwb3AKLXBvcDoKLQlwb3AgZnAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljZjAyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogZnNsb3QKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAgPGJsPjoKLSAqMDoJN2UgMDAgZjAgMDAgCWJsIDAgPGJsPiBcfFx8IG5vcAotICo0Ogk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArOCA8Ymxfcz46Ci0gKjg6CTdlIDAwIGYwIDAwIAlibCA4IDxibF9zPiBcfFx8IG5vcAotICpjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMTAgPGJyYT46Ci0gKjEwOgk3ZiAwMCBmMCAwMCAJYnJhIDEwIDxicmE+IFx8XHwgbm9wCi0gKjE0Ogk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMTggPGJyYV9zPjoKLSAqMTg6CTdmIDAwIGYwIDAwIAlicmEgMTggPGJyYV9zPiBcfFx8IG5vcAotICoxYzoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzIwIDxqbD46Ci0gKjIwOgkxZSBjMCBmMCAwMCAJamwgcjAgXHxcfCBub3AKLSAqMjQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsyOCA8dHJhcD46Ci0gKjI4OgkxMCBmNCBmMCAwMCAJdHJhcCBbI10qMHg0IFx8XHwgbm9wCi0gKjJjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmI2NjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBUZXN0IHRoZSBGSUxMLVNMT1QgYXR0cmlidXRlLgotIyBUaGUgRklMTC1TTE9UIGF0dHJpYnV0ZSBlbnN1cmVzIHRoZSBuZXh0IGluc24gYmVnaW5zIG9uIGEgMzIgYnl0ZSBib3VuZGFyeS4KLSMgVGhpcyBpcyBuZWVkZWQgZm9yIGV4YW1wbGUgd2l0aCBibCBiZWNhdXNlIHRoZSBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuCi0jIHRvIGEgMzIgYml0IGJvdW5kYXJ5LgotCi0JLnRleHQKLWJsOgotCWJsIGJsCi0JbGRpIHIwLCM4Ci1ibF9zOgotCWJsLnMgYmxfcwotCWxkaSByMCwjOAotCi1icmE6Ci0JYnJhIGJyYQotCWxkaSByMCwjOAotYnJhX3M6Ci0JYnJhLnMgYnJhX3MKLQlsZGkgcjAsIzgKLQotamw6Ci0JamwgcjAKLQlsZGkgcjAsIzgKLQotdHJhcDoKLQl0cmFwICM0Ci0JbGRpIHIwLCM4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjY2I4Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGhpZ2gtMQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAqIDxmb28+OgotICowOglkNCBjMCAwMCAwMSAJc2V0aCByNCxbI10qMHgxCi1bIAldKjA6IFJfTTMyUl9ISTE2X1VMTwkudGV4dAotICo0Ogk4NCBlNCAwMCAwMCAJb3IzIHI0LHI0LFsjXSoweDAKLVsgCV0qNDogUl9NMzJSX0xPMTYJLnRleHQKLSAqODoJZDQgYzAgMTIgMzQgCXNldGggcjQsWyNdKjB4MTIzNAotICpjOgk4NCBlNCA4NyA2NSAJb3IzIHI0LHI0LFsjXSoweDg3NjUKLSAqMTA6CWQ0IGMwIDEyIDM1IAlzZXRoIHI0LFsjXSoweDEyMzUKLSAqMTQ6CTg0IGU0IDg3IDY1IAlvcjMgcjQscjQsWyNdKjB4ODc2NQotICoxODoJZDQgYzAgODcgNjUgCXNldGggcjQsWyNdKjB4ODc2NQotICoxYzoJODQgZTQgNDMgMjEgCW9yMyByNCxyNCxbI10qMHg0MzIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1ZDFkMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IGhpZ2gvc2hpZ2ggaGFuZGxpbmcuCi0KLWZvbzoKLQlzZXRoIHI0LCNoaWdoKGZvbysweDEwMDAwKQotCW9yMyAgcjQscjQsI2xvdyhmb28rMHgxMDAwMCkKLQotCXNldGggcjQsI2hpZ2goMHgxMjM0ODc2NSkKLQlvcjMgIHI0LHI0LCNsb3coMHgxMjM0ODc2NSkKLQotCXNldGggcjQsI3NoaWdoKDB4MTIzNDg3NjUpCi0Jb3IzICByNCxyNCwjbG93KDB4MTIzNDg3NjUpCi0KLQlzZXRoIHI0LCNzaGlnaCgweDg3NjU0MzIxKQotCW9yMyAgcjQscjQsI2xvdygweDg3NjU0MzIxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMyci5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzIzNjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBNMzJSIHRlc3RjYXNlcwotCi1pZiBbaXN0YXJnZXQgbTMyciotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiaGlnaC0xIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbGF4LTEiCi0gICAgcnVuX2R1bXBfdGVzdCAidXBwZXJjYXNlIgotICAgIHJ1bl9kdW1wX3Rlc3QgImZzbG90IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9vdXRvZnJhbmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL291dG9mcmFuZ2UucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwZDMxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL291dG9mcmFuZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi07IFRlc3QgZXJyb3IgbWVzc2FnZXMgd2hlcmUgYnJhbmNoZXMgYXJlIG91dCBvZiByYW5nZS4KLQotOyB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IG0zMnItKi0qIH0gfQotCi0JLnRleHQKLQkuZ2xvYmFsIGZvbwotZm9vOgotCWJsLnMgbGFiZWwKLQkJOyB7IGRnLWVycm9yICJvdXQgb2YgcmFuZ2UiICJvdXQgb2YgcmFuZ2UgYmwucyIgeyB0YXJnZXQgKi0qLSogfSB7IDggfSB9Ci0JYm5jLnMgbGFiZWwKLQkJOyB7IGRnLWVycm9yICJvdXQgb2YgcmFuZ2UiICJvdXQgb2YgcmFuZ2UgYm5jLnMiIHsgdGFyZ2V0ICotKi0qIH0geyAxMCB9IH0KLQlicmEucyBsYWJlbAotCQk7IHsgZGctZXJyb3IgIm91dCBvZiByYW5nZSIgIm91dCBvZiByYW5nZSBicmEucyIgeyB0YXJnZXQgKi0qLSogfSB7IDEyIH0gfQotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLWxhYmVsOgotCWptcCByMTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNGZjYjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogcmVsYXgtMQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAqIDxEb2VzTm90V29yaz46Ci0gKjA6CTcwIDAwIDcwIDAwICoJbm9wIC0+IG5vcAotCi0wKjQgPFdvcms+OgotICo0Ogk3MCAwMCA3MCAwMCAqCW5vcCAtPiBub3AKLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLmJyYW5jaDoKLQotMCogPGJyYW5jaD46Ci0gKjA6CWZmIDAwIDAwIDAxIAlicmEgNCA8V29yaz4KLVsgCV0qMDogUl9NMzJSXzI2X1BDUkVMCS50ZXh0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGUxMmMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotOyBUZXN0IHJlbGF4YXRpb24gaW50byBub24temVybyBvZmZzZXQgdG8gZGlmZmVyZW50IHNlZ21lbnQuCi0KLQkuc2VjdGlvbiAuYnJhbmNoLCAiYXgiLEBwcm9nYml0cwotCS5iYWxpZ24gNAotYnJhbmNoOgotICAgICAgICBicmEgV29yawotCi0KLQkuc2VjdGlvbiAudGV4dAotICAgICAgICAuYmFsaWduIDQKLURvZXNOb3RXb3JrOgotCW5vcAotCW5vcAotCi1Xb3JrOgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjEzNDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UuZAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiB1cHBlcmNhc2UKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPGZvbz46Ci0gICAwOgkxMCA4MSAxMCA5MSAqCW12IHIwLHIxIC0+IG12ZmMgcjAsY2JyCi0KLTArMDAwNCA8aGlnaD46Ci0gICA0OglkMCBjMCAwMCAwMCAJc2V0aCByMCwjMHgwCi1bIAldKjQ6IFJfTTMyUl9ISTE2X1VMTwlbLl10ZXh0Ci0KLTArMDAwOCA8c2hpZ2g+OgotICAgODoJZDAgYzAgMDAgMDAgCXNldGggcjAsIzB4MAotWyAJXSo4OiBSX00zMlJfSEkxNl9TTE8JWy5ddGV4dAotCi0wKzAwMGMgPGxvdz46Ci0gICBjOgk4MCBlMCAwMCAwYyAJb3IzIHIwLHIwLCMweGMKLVsgCV0qYzogUl9NMzJSX0xPMTYJWy5ddGV4dAotCi0wKzAwMTAgPHNkYT46Ci0gIDEwOgk4MCBhMCAwMCAwMCAJYWRkMyByMCxyMCwjMAotWyAJXSoxMDogUl9NMzJSX1NEQTE2CXNkYXZhcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWVhZmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkudGV4dAotCS5nbG9iYWwgZm9vCi1mb286Ci0JbXYgUjAsUjEKLQltdmZjIFIwLENCUgotCi1oaWdoOgotCXNldGggcjAsI0hJR0goaGlnaCkKLXNoaWdoOgotCXNldGggcjAsI1NISUdIKHNoaWdoKQotbG93OgotCW9yMyByMCxyMCwjTE9XKGxvdykKLXNkYToKLQlhZGQzIHIwLHIwLCNTREEoc2RhdmFyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvZ2FzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3ZWVmYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvZ2FzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMKLSMgU29tZSBtNjhrLWNvZmYgdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBtNjgqLSotY29mZl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3QgInAyNDMwLnMiICIiICRzdGRvcHRsaXN0ICJsb2NhbCBicmFuY2ggbm90IGluIHRleHQgc2VjdGlvbiIKLQotICAgIGdhc190ZXN0ICJwMjQzMGEucyIgIiIgJHN0ZG9wdGxpc3QgImxvY2FsIGJyYW5jaCBub3QgaW4gdGV4dCBzZWN0aW9uIgotCi0gICAgZ2FzX3Rlc3QgInQxLnMiICIiICRzdGRvcHRsaXN0ICJtdWx0aXBsZSAuZmlsZSBkaXJlY3RpdmVzIgotCi0gICAgZ2FzX3Rlc3QgInAyMzg5LnMiICIiICRzdGRvcHRsaXN0ICJic3MgZmlsbCIKLQotICAgIHNldHVwX3hmYWlsIG02OCotKi1jb2ZmCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInAyMzg5YS5zIiAiIiAiZGV0ZWN0IGJzcyBmaWxsIHdpdGggbm9uLXplcm8gZGF0YSIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTkzZTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jICBJIHJlYWNoZWQgYSBwb2ludCB3aGVyZSB0aGUgZmlsZSBsb29rcwotIyBjbGVhbiBhbmQgY29tcGxpZXMgd2l0aCBnYXMgc3ludGF4LCBidXQgaXQgY29yZSBkdW1wcyBnYXMuIEhlcmUncyBhCi0jIGxpdHRsZSBnZGIgaW5mbzoKLSMKLSMgUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsIDExLCBTZWdtZW50YXRpb24gZmF1bHQuCi0jICMwICAweDYzMjNjIGluIG1lbWNweSAoKQotIyAoZ2RiKSBidAotIyAjMCAgMHg2MzIzYyBpbiBtZW1jcHkgKCkKLSMgIzEgIDB4ZjJiMCBpbiBmaWxsX3NlY3Rpb24gKGFiZmQ9MHhlYWVlOCwgZmlsZWhkcj0weDhhN2Y0LCAKLSMgICAgIGZpbGVfY3Vyc29yPTB4ZjdmZmY2NTQpIGF0IG9iai1mb3JtYXQuYzo1MzQKLSMgIzIgIDB4MTEyYTggaW4gd3JpdGVfb2JqZWN0X2ZpbGUgKCkgYXQgb2JqLWZvcm1hdC5jOjE3ODYKLSMgIzMgIDB4MTNlZjggaW4gbWFpbiAoYXJnYz01LCBhcmd2PTB4ZjdmZmY3YmMpIGF0IC4uLy4uL3AzL2dhcy9hcy5jOjMxMAotIyAoZ2RiKSAKLSMKLSMgZ2FzIGRpZCBtYW5hZ2UgdG8gY3JlYXRlIHRoZSAubyBmaWxlIGF0IHRoaXMgcG9pbnQuCi0KLQkuYnNzCi0KLV9BU0lDX0lOVF9UQkw6ICAgLnNwYWNlIDMyLDAJfCBrZWVwIGludGVycnVwdCByb3V0aW5lcyBoZXJlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODlhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODlhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjI3NjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5YS5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JLmJzcwotCi1fQVNJQ19JTlRfVEJMOiAgIC5zcGFjZSAzMiwxCXwga2VlcCBpbnRlcnJ1cHQgcm91dGluZXMgaGVyZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3MjNkOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzAucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBUaGlzIGRpZmZlcnMgZnJvbSBwMjQzMGEucyAodGhlIGN1c3RvbWVyJ3MgYWN0dWFsIHNvdXJjZSBmaWxlKSBvbmx5Ci0jIGluIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLiAgU3RyYW5nZWx5LCB0aGlzIGZpbGUgZ2F2ZSBubyBwcm9ibGVtcy4uLgotCi0JLnNlY3QgZm9vCi10YWc6Ci0JYnJhIHRhZwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwYS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwYS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDFmYjExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMGEucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotICAgIC5zZWN0IGZvbwotCi10YWc6Ci0JYnJhIHRhZwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3QxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvdDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwMTVmMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvdDEucworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgMSAibGliZ2NjMS5TIgotIyA0MiAibGlieHl6MS5TIgotIyAyNTkgImxpYmdjYzEuUyIKLQkudGV4dAotCS5wcm9jCi18I1BST0MjIDA0Ci0JLmdsb2JsCSBfX211bHNpMyAgICAgIAotIF9fbXVsc2kzICAgICAgOgotfCNQUk9MT0dVRSMgMAotCWxpbmsJICAlYTYgICAgICAgLCMwCi0JYWRkbAkjLUxGMTQsICAlc3AgICAgICAgCi0JbW92ZW1sCSNMUzE0LCAgJXNwICAgICAgIEAKLXwjUFJPTE9HVUUjIDEKLQltb3ZldwkgICVhNiAgICAgICBAKDB4OCksICAgJWQwICAgICAgIAkgCi0JbXVsdXcJICAlYTYgICAgICAgQCgweGUpLCAgICVkMCAgICAgICAJIAotCW1vdmV3CSAgJWE2ICAgICAgIEAoMHhhKSwgICAlZDEgICAgICAgCSAKLQltdWx1dwkgICVhNiAgICAgICBAKDB4YyksICAgJWQxICAgICAgIAkgCi0JYWRkdwkgICVkMSAgICAgICAsICAgJWQwICAgICAgIAotCWxzbGwJIzgsICAgJWQwICAgICAgIAotCWxzbGwJIzgsICAgJWQwICAgICAgIAotCW1vdmV3CSAgJWE2ICAgICAgIEAoMHhhKSwgICAlZDEgICAgICAgCSAKLQltdWx1dwkgICVhNiAgICAgICBAKDB4ZSksICAgJWQxICAgICAgIAkgCi0JYWRkbAkgICVkMSAgICAgICAsICAgJWQwICAgICAgIAotCWpyYQlMRTE0Ci1MRTE0OgotfCNQUk9MT0dVRSMgMgotCW1vdmVtbAkgICVzcCAgICAgICBALCAjTFMxNAotCXVubGsJICAlYTYgICAgICAgCi18I1BST0xPR1VFIyAzCi0JcnRzCi0JTEYxNCA9IDQKLQlMUzE0ID0gMHgwMDAyCQkgCi0JTEZGMTQgPSAwCi0jIDM1NCAibGliZ2NjMS5TIgotCUxTUzE0ID0gMHgwCi0JTFYxNCA9IDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYWxsLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYWxsLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhYjJhMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2FsbC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jCi0jIFNvbWUgZ2VuZXJpYyBtNjhrIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgbTY4Ki0qLSpdIHRoZW4gewotICAgIGdhc190ZXN0ICJ0Mi5zIiAiIiAiIiAiY3Jvc3Mtc2VjdGlvbiBicmFuY2giCi0gICAgaWYgW2lzdGFyZ2V0IG02OCotbW90b3JvbGEtc3lzdl0gdGhlbiB7Ci0JcnVuX2R1bXBfdGVzdCB0MgotICAgIH0KLQotICAgIGdhc190ZXN0ICJwaWMxLnMiICIiICIiICJQSUMgZ2VuZXJhdGlvbiIKLQotICAgIGdhc190ZXN0ICJkaXNwZXJyLnMiICItbTY4MDIwIiAiIiAiSW5jb3JyZWN0IERpc3BsYWNlbWVudCB0b28gbG9uZyBlcnJvciIKLQotICAgIGdhc190ZXN0X2Vycm9yICJwMjQxMC5zIiAiIiAib3V0LW9mLXJhbmdlICdicmFzJyIKLQotICAgIHJ1bl9kdW1wX3Rlc3QgcGNyZWwKLSAgICBydW5fZHVtcF90ZXN0IG9wZXJhbmRzCi0gICAgcnVuX2R1bXBfdGVzdCBjYXMKLSAgICBydW5fZHVtcF90ZXN0IGJpdGZpZWxkCi0gICAgcnVuX2R1bXBfdGVzdCBsaW5rCi0gICAgcnVuX2R1bXBfdGVzdCBmbW92ZW1sCi0KLSAgICBzZXQgdGVzdG5hbWUgIjY4MDAwIG9wZXJhbmRzIgotICAgIGdhc19ydW4gIm9wZXJhbmRzLnMiICItbTY4MDAwIiAiMj5lcnIub3V0IgotICAgIGlmICFbc3RyaW5nIG1hdGNoICJjaGlsZCBwcm9jZXNzIGV4aXRlZCBhYm5vcm1hbGx5IiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JaWYgW3JlZ2V4cF9kaWZmICJlcnIub3V0IiAiJHNyY2Rpci8kc3ViZGlyL29wNjgwMDAuZCJdIHRoZW4gewotCSAgICBmYWlsICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIHBhc3MgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KLWlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgIHVuc2V0IGVycm9ySW5mbwotICAgIH0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiMWJkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogYml0ZmllbGQKLQotIyBUZXN0IGhhbmRsaW5nIG9mIGJpdGZpZWxkIGluc3RydWN0aW9uIG9wZXJhbmRzLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBiZmV4dHMgJWEwQCwxLDIsJWQwCi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGJmZXh0cyAlYTBALDEsNiwlZDAKLTArMDA4IDxmb29cKygweHwpOD4gYmZleHRzICVhMEAsMywyLCVkMAotMCswMGMgPGZvb1wrKDB4fCljPiBiZmV4dHMgJWEwQCwzLDYsJWQwCi0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBiZmV4dHMgJWEwQCwxLDIsJWQwCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBiZmV4dHMgJWEwQCwxLDYsJWQwCi0wKzAxOCA8Zm9vXCsoMHh8KTE4PiBiZmV4dHMgJWEwQCwzLDIsJWQwCi0wKzAxYyA8Zm9vXCsoMHh8KTFjPiBiZmV4dHMgJWEwQCwzLDYsJWQwCi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiBiZnNldCAlYTBALDEsMgotMCswMjQgPGZvb1wrKDB4fCkyND4gYmZzZXQgJWEwQCwxLDYKLTArMDI4IDxmb29cKygweHwpMjg+IGJmc2V0ICVhMEAsMywyCi0wKzAyYyA8Zm9vXCsoMHh8KTJjPiBiZnNldCAlYTBALDMsNgotMCswMzAgPGZvb1wrKDB4fCkzMD4gYmZzZXQgJWEwQCwxLDIKLTArMDM0IDxmb29cKygweHwpMzQ+IGJmc2V0ICVhMEAsMSw2Ci0wKzAzOCA8Zm9vXCsoMHh8KTM4PiBiZnNldCAlYTBALDMsMgotMCswM2MgPGZvb1wrKDB4fCkzYz4gYmZzZXQgJWEwQCwzLDYKLTArMDQwIDxmb29cKygweHwpNDA+IGJmZXh0cyAlYTBALCVkMSwlZDIsJWQwCi0wKzA0NCA8Zm9vXCsoMHh8KTQ0PiBiZmV4dHMgJWEwQCwlZDEsJWQyLCVkMAotMCswNDggPGZvb1wrKDB4fCk0OD4gYmZzZXQgJWEwQCwlZDEsJWQyCi0wKzA0YyA8Zm9vXCsoMHh8KTRjPiBiZnNldCAlYTBALCVkMSwlZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyZjc1OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIFRlc3QgaGFuZGxpbmcgb2YgYml0ZmllbGQgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCi0JLnRleHQKLQkuZ2xvYmwJZm9vCi1mb286CQotCWJmZXh0cwkoJWEwKXsmMTomMn0sJWQwCi0JYmZleHRzCSglYTApeyYxOiYoMis0KX0sJWQwCi0JYmZleHRzCSglYTApeyYoMSsyKTomMn0sJWQwCi0JYmZleHRzCSglYTApeyYoMSsyKTomKDIrNCl9LCVkMAotCWJmZXh0cwklYTBALCYxLCYyLCVkMAotCWJmZXh0cwklYTBALCYxLCYoMis0KSwlZDAKLQliZmV4dHMJJWEwQCwmMSsyLCYyLCVkMAotCWJmZXh0cwklYTBALCYoMSsyKSwmKDIrNCksJWQwCi0JYmZzZXQJKCVhMCl7JjE6JjJ9Ci0JYmZzZXQJKCVhMCl7JjE6JigyKzQpfQotCWJmc2V0CSglYTApeyYoMSsyKTomMn0KLQliZnNldAkoJWEwKXsmKDErMik6JigyKzQpfQotCWJmc2V0CSVhMEAsJjEsJjIKLQliZnNldAklYTBALCYxLCYoMis0KQotCWJmc2V0CSVhMEAsJjErMiwmMgotCWJmc2V0CSVhMEAsJigxKzIpLCYoMis0KQotCWJmZXh0cwkoJWEwKXslZDE6JWQyfSwlZDAKLQliZmV4dHMJJWEwQCwlZDEsJWQyLCVkMAotCWJmc2V0CSglYTApeyVkMTolZDJ9Ci0JYmZzZXQJJWEwQCwlZDEsJWQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwOTczMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IGNhcwotCi0jIFRlc3QgcGFyc2luZyBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGNhcyBpbnN0cnVjdGlvbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBjYXN3ICVkMCwlZDEsJWEwQAotMCswMDQgPGZvb1wrKDB4fCk0PiBjYXN3ICVkMCwlZDEsJWEwQAotMCswMDggPGZvb1wrKDB4fCk4PiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAwZSA8Zm9vXCsoMHh8KWU+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCxAXCglZDBcKSxAXCglZDFcKQotMCswMTQgPGZvb1wrKDB4fCkxND4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswMWEgPGZvb1wrKDB4fCkxYT4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswMjAgPGZvb1wrKDB4fCkyMD4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LEBcKCVkMFwpLEBcKCVkMVwpCi0wKzAyNiA8Zm9vXCsoMHh8KTI2PiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAyYyA8Zm9vXCsoMHh8KTJjPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsQFwoJWQwXCksQFwoJWQxXCkKLTArMDMyIDxmb29cKygweHwpMzI+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDM4IDxmb29cKygweHwpMzg+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDNlIDxmb29cKygweHwpM2U+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCxAXCglZDBcKSxAXCglZDFcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NGU3ZjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgVGVzdCBwYXJzaW5nIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgY2FzIGluc3RydWN0aW9uCi0JLnRleHQKLQkuZ2xvYmwJZm9vCi1mb286CQotCWNhcwklZDAsJWQxLCglYTApCi0JY2FzCSVkMCwlZDEsJWEwQAotCWNhczIJJWQwOiVkMiwlZDM6JWQ0LCglYTApOiglYTEpCi0JY2FzMgklZDA6JWQyLCVkMzolZDQsKCVkMCk6KCVkMSkKLQljYXMyCSVkMDolZDIsJWQzOiVkNCwlYTBAOiVhMUAKLQljYXMyCSVkMDolZDIsJWQzOiVkNCxAKCVhMCk6QCglYTEpCi0JY2FzMgklZDA6JWQyLCVkMzolZDQsQCglZDApOkAoJWQxKQotCWNhczIJJWQwLCVkMiwlZDMsJWQ0LCglYTApLCglYTEpCi0JY2FzMgklZDAsJWQyLCVkMywlZDQsKCVkMCksKCVkMSkKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCxAKCVhMCksQCglYTEpCi0JY2FzMgklZDAsJWQyLCVkMywlZDQsQCglZDApLEAoJWQxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9kaXNwZXJyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Rpc3BlcnIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkM2I3Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Rpc3BlcnIucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNOT19BUFAKLWdjYzJfY29tcGlsZWQuOgotX19fZ251X2NvbXBpbGVkX2M6Ci0udGV4dAotCS5ldmVuCi0uZ2xvYmwgX2ZvbwotX2ZvbzoKLQlsaW5rICVhNiwjLTEyCi0JZm1vdmV4ICVhNkAoLTEyKSwlZnAwCi0JZm1vdmV4ICVmcDAsJXNwQC0KLQlqYnNyIF9iYXIKLQlhZGRxdyAjOCwlc3AKLQlhZGRxdyAjNCwlc3AKLUwxOgotCXVubGsgJWE2Ci0JcnRzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGUyNzkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IGZtb3ZlbWwKLQotIyBUZXN0IGhhbmRsaW5nIG9mIGZtb3ZlbWwgYW5kIGZtb3ZlbXggaW5zdHJ1Y3Rpb25zLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBmbW92ZWwgJWZwY3IsJWEwQAotMCswMDQgPGZvb1wrKDB4fCk0PiBmbW92ZWwgJWZwc3IsJWEwQAotMCswMDggPGZvb1wrKDB4fCk4PiBmbW92ZWwgJWZwaWFyLCVhMEAKLTArMDBjIDxmb29cKygweHwpYz4gZm1vdmVtbCAlZnBzci8lZnBjciwlYTBACi0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBmbW92ZW1sICVmcGlhci8lZnBjciwlYTBACi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBmbW92ZW1sICVmcGlhci8lZnBzciwlYTBACi0wKzAxOCA8Zm9vXCsoMHh8KTE4PiBmbW92ZW1sICVmcGlhci8lZnBzci8lZnBjciwlYTBACi0wKzAxYyA8Zm9vXCsoMHh8KTFjPiBmbW92ZWwgJWZwY3IsJWQwCi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiBmbW92ZWwgJWZwc3IsJWQwCi0wKzAyNCA8Zm9vXCsoMHh8KTI0PiBmbW92ZWwgJWZwaWFyLCVkMAotMCswMjggPGZvb1wrKDB4fCkyOD4gZm1vdmVsICVmcGlhciwlYTAKLTArMDJjIDxmb29cKygweHwpMmM+IGZtb3ZlbCAlYTBALCVmcGNyCi0wKzAzMCA8Zm9vXCsoMHh8KTMwPiBmbW92ZWwgJWEwQCwlZnBzcgotMCswMzQgPGZvb1wrKDB4fCkzND4gZm1vdmVsICVhMEAsJWZwaWFyCi0wKzAzOCA8Zm9vXCsoMHh8KTM4PiBmbW92ZW1sICVhMEAsJWZwc3IvJWZwY3IKLTArMDNjIDxmb29cKygweHwpM2M+IGZtb3ZlbWwgJWEwQCwlZnBpYXIvJWZwY3IKLTArMDQwIDxmb29cKygweHwpNDA+IGZtb3ZlbWwgJWEwQCwlZnBpYXIvJWZwc3IKLTArMDQ0IDxmb29cKygweHwpNDQ+IGZtb3ZlbWwgJWEwQCwlZnBpYXIvJWZwc3IvJWZwY3IKLTArMDQ4IDxmb29cKygweHwpNDg+IGZtb3ZlbCAlZDAsJWZwY3IKLTArMDRjIDxmb29cKygweHwpNGM+IGZtb3ZlbCAlZDAsJWZwc3IKLTArMDUwIDxmb29cKygweHwpNTA+IGZtb3ZlbCAlZDAsJWZwaWFyCi0wKzA1NCA8Zm9vXCsoMHh8KTU0PiBmbW92ZWwgJWEwLCVmcGlhcgotMCswNTggPGZvb1wrKDB4fCk1OD4gZm1vdmVsICMxLCVmcGNyCi0wKzA2MCA8Zm9vXCsoMHh8KTYwPiBmbW92ZWwgIzEsJWZwc3IKLTArMDY4IDxmb29cKygweHwpNjg+IGZtb3ZlbCAjMSwlZnBpYXIKLTArMDcwIDxmb29cKygweHwpNzA+IGZtb3ZlbWwgIzEsJWZwc3IvJWZwY3IKLTArMDc4IDxmb29cKygweHwpNzg+IGZtb3ZlbWwgIzEsJWZwaWFyLyVmcGNyCi0wKzA4MCA8Zm9vXCsoMHh8KTgwPiBmbW92ZW1sICMxLCVmcGlhci8lZnBzcgotMCswODggPGZvb1wrKDB4fCk4OD4gZm1vdmVtbCAjMSwlZnBpYXIvJWZwc3IvJWZwY3IKLTArMDkwIDxmb29cKygweHwpOTA+IGZtb3ZlbXggJWZwMSwlYTBACi0wKzA5NCA8Zm9vXCsoMHh8KTk0PiBmbW92ZW14ICVmcDQsJWEwQAotMCswOTggPGZvb1wrKDB4fCk5OD4gZm1vdmVteCAlZnA3LCVhMEAKLTArMDljIDxmb29cKygweHwpOWM+IGZtb3ZlbXggJWZwMS8lZnAzLCVhMEAKLTArMGEwIDxmb29cKygweHwpYTA+IGZtb3ZlbXggJWZwMS0lZnA0LCVhMEAKLTArMGE0IDxmb29cKygweHwpYTQ+IGZtb3ZlbXggJWZwMC8lZnA3LCVhMEAKLTArMGE4IDxmb29cKygweHwpYTg+IGZtb3ZlbXggJWZwMC0lZnA3LCVhMEAKLTArMGFjIDxmb29cKygweHwpYWM+IGZtb3ZlbXggJWEwQCwlZnAwCi0wKzBiMCA8Zm9vXCsoMHh8KWIwPiBmbW92ZW14ICVhMEAsJWZwMQotMCswYjQgPGZvb1wrKDB4fCliND4gZm1vdmVteCAlYTBALCVmcDcKLTArMGI4IDxmb29cKygweHwpYjg+IGZtb3ZlbXggJWEwQCwlZnAwLyVmcDMKLTArMGJjIDxmb29cKygweHwpYmM+IGZtb3ZlbXggJWEwQCwlZnAwLyVmcDQKLTArMGMwIDxmb29cKygweHwpYzA+IGZtb3ZlbXggJWEwQCwlZnAyLSVmcDQKLTArMGM0IDxmb29cKygweHwpYzQ+IGZtb3ZlbXggJWEwQCwlZnAxLSVmcDcKLTArMGM4IDxmb29cKygweHwpYzg+IGZtb3ZlbXggJWZwMCwlYTBALQotMCswY2MgPGZvb1wrKDB4fCljYz4gZm1vdmVteCAlZnAwLSVmcDcsJWEwQC0KLTArMGQwIDxmb29cKygweHwpZDA+IGZtb3ZlbXggJWZwMC8lZnA0LCVhMEAtCi0wKzBkNCA8Zm9vXCsoMHh8KWQ0PiBmbW92ZW14ICVhMEBcKywlZnA3Ci0wKzBkOCA8Zm9vXCsoMHh8KWQ4PiBmbW92ZW14ICVhMEBcKywlZnAwLSVmcDcKLTArMGRjIDxmb29cKygweHwpZGM+IGZtb3ZlbXggJWEwQFwrLCVmcDMvJWZwNwotMCswZTAgPGZvb1wrKDB4fCllMD4gZm1vdmVteCAlZDAsJWEwQC0KLTArMGU0IDxmb29cKygweHwpZTQ+IGZtb3ZlbXggJWEwQFwrLCVkMAotMCswZTggPGZvb1wrKDB4fCllOD4gZm1vdmVteCAlZnAxLyVmcDUsJWEwQC0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDIyNGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jIFRlc3QgaGFuZGxpbmcgb2YgdGhlIGZtb3ZlbWwgYW5kIGZtb3ZlbXggaW5zdHJ1Y3Rpb25zLgotCS50ZXh0Ci0JLmdsb2JsCWZvbwotZm9vOgotCWZtb3ZlbWwgJWZwY3IsJWEwQAotCWZtb3ZlbWwgJWZwc3IsJWEwQAotCWZtb3ZlbWwgJWZwaWFyLCVhMEAKLQlmbW92ZW1sICVmcGNyLyVmcHNyLCVhMEAKLQlmbW92ZW1sCSVmcGNyLyVmcGlhciwlYTBACi0JZm1vdmVtbAklZnBzci8lZnBpYXIsJWEwQAotCWZtb3ZlbWwJJWZwY3IvJWZwc3IvJWZwaWFyLCVhMEAKLQlmbW92ZW1sCSVmcGNyLCVkMAotCWZtb3ZlbWwJJWZwc3IsJWQwCi0JZm1vdmVtbAklZnBpYXIsJWQwCi0JZm1vdmVtbAklZnBpYXIsJWEwCi0JZm1vdmVtbCAlYTBALCVmcGNyCi0JZm1vdmVtbCAlYTBALCVmcHNyCi0JZm1vdmVtbCAlYTBALCVmcGlhcgotCWZtb3ZlbWwgJWEwQCwlZnBzci8lZnBjcgotCWZtb3ZlbWwJJWEwQCwlZnBpYXIvJWZwY3IKLQlmbW92ZW1sCSVhMEAsJWZwaWFyLyVmcHNyCi0JZm1vdmVtbAklYTBALCVmcHNyLyVmcGlhci8lZnBjcgotCWZtb3ZlbWwJJWQwLCVmcGNyCi0JZm1vdmVtbAklZDAsJWZwc3IKLQlmbW92ZW1sCSVkMCwlZnBpYXIKLQlmbW92ZW1sCSVhMCwlZnBpYXIKLQlmbW92ZW1sCSYxLCVmcGNyCi0JZm1vdmVtbAkmMSwlZnBzcgotCWZtb3ZlbWwJJjEsJWZwaWFyCi0JZm1vdmVtbAkmMSwlZnBjci8lZnBzcgotCWZtb3ZlbWwJJjEsJWZwY3IvJWZwaWFyCi0JZm1vdmVtbAkmMSwlZnBzci8lZnBpYXIKLQlmbW92ZW1sCSYxLCVmcGlhci8lZnBzci8lZnBjcgotCi0JZm1vdmVteCAlZnAxLCVhMEAKLQlmbW92ZW14ICVmcDQsJWEwQAotCWZtb3ZlbXggJWZwNywlYTBACi0JZm1vdmVteCAlZnAxLyVmcDMsJWEwQAotCWZtb3ZlbXgJJWZwMS0lZnA0LCVhMEAKLQlmbW92ZW14CSVmcDAvJWZwNywlYTBACi0JZm1vdmVteAklZnAwLSVmcDcsJWEwQAotCWZtb3ZlbXggJWEwQCwlZnAwCi0JZm1vdmVteCAlYTBALCVmcDEKLQlmbW92ZW14ICVhMEAsJWZwNwotCWZtb3ZlbXggJWEwQCwlZnAwLyVmcDMKLQlmbW92ZW14CSVhMEAsJWZwMC8lZnA0Ci0JZm1vdmVteAklYTBALCVmcDItJWZwNAotCWZtb3ZlbXgJJWEwQCwlZnAxLSVmcDcKLQlmbW92ZW14CSYxLCVhMEAtCi0JZm1vdmVteAkmMHhmZiwlYTBALQotCWZtb3ZlbXgJJjB4MTEsJWEwQC0KLQlmbW92ZW14CSVhMEArLCYxCi0JZm1vdmVteAklYTBAKywmMHhmZgotCWZtb3ZlbXgJJWEwQCssJjB4MTEKLQlmbW92ZW14CSVkMCwlYTBALQotCWZtb3ZlbXgJJWEwQCssJWQwCi0JZm1vdmVteAkmc3ltLCVhMEAtCi0Jc3ltCT0JMHgyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MjYzZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsuZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBsaW5rCi0KLSMgVGVzdCBoYW5kbGluZyBvZiBsaW5rIGluc3RydWN0aW9uLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBsaW5rdyAlZnAsIzAKLTArMDA0IDxmb29cKygweHwpND4gbGlua3cgJWZwLCMtNAotMCswMDggPGZvb1wrKDB4fCk4PiBsaW5rdyAlZnAsIy0zMjc2NwotMCswMGMgPGZvb1wrKDB4fCljPiBsaW5rdyAlZnAsIy0zMjc2OAotMCswMTAgPGZvb1wrKDB4fCkxMD4gbGlua2wgJWZwLCMtMzI3NjkKLTArMDE2IDxmb29cKygweHwpMTY+IGxpbmt3ICVmcCwjMzI3NjcKLTArMDFhIDxmb29cKygweHwpMWE+IGxpbmtsICVmcCwjMzI3NjgKLTArMDIwIDxmb29cKygweHwpMjA+IGxpbmtsICVmcCwjMzI3NjkKLTArMDI2IDxmb29cKygweHwpMjY+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzMjFkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgVGVzdCBoYW5kbGluZyBvZiBsaW5rIGluc3RydWN0aW9uLgotCS50ZXh0Ci0JLmdsb2JsCWZvbwotZm9vOgotCWxpbmsJJWE2LCYwCi0JbGluawklYTYsJi00Ci0JbGluawklYTYsJi0weDdmZmYKLQlsaW5rCSVhNiwmLTB4ODAwMAotCWxpbmsJJWE2LCYtMHg4MDAxCi0JbGluawklYTYsJjB4N2ZmZgotCWxpbmsJJWE2LCYweDgwMDAKLQlsaW5rCSVhNiwmMHg4MDAxCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wNjgwMDAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3A2ODAwMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhkNWEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3A2ODAwMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMgVGhpcyBzaG91bGQgbWF0Y2ggdGhlIHN0ZGVyciBvdXRwdXQgb2YgZ2FzIC1tNjgwMDAgb24gb3BlcmFuZHMucy4KLSMgV2UgZG9uJ3QgYm90aGVyIHRvIG1hdGNoIHRoZSBleGFjdCBlcnJvciBtZXNzYWdlLCBidXQgaW5zdGVhZCBqdXN0Ci0jIGxvb2sgZm9yIHRoZSBzdGF0ZW1lbnRzIHdoaWNoIHNob3VsZCBmYWlsLgotCi0uKm9wZXJhbmRzLnM6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qc3RhdGVtZW50IGB0c3RsICVhMCcgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOnc6NFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDp3OjhcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6bDoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOmw6NFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDpsOjhcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqNFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqOFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLndcKjRcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAud1wqOFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC5sXCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLmxcKjRcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAubFwqOFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWExLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDhcKCVhMCwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCA4XCglZDAud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgOFwoJWExLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoJWQwLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlZDAsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlYTEud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVkMCwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwMDAsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDAwMFwoJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICV6YTFAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJXphMUBcKDEwMDAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJXphMSwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWQwLCV6YTFcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMS53XCoyLCV6YTFcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJXphMSwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglZDAsJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAwMCwlemExXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDAwMFwoJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwLCV6ZDE6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJXpkMTp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoJXpkMTp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMCwlemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6ZDEsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlemExLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVhMCwlemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJXpkMSwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCglemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTBcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVhMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMFxdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwLCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCglZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCglZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMCwlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDA6dzoyLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWExLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWExOnc6MiwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMCwlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwLCVhMFxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDAsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWQwLCVhMFxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoOCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoOCwlcGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSA4XCglcGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlcGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWQwLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlYTEud1wqMiwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVkMCwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglYTEsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwMDAsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMDAwXCglcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlenBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVkMCwlenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVhMS53XCoyLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglenBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJWQwLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglYTEsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMDAwLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwMDBcKCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwY1xdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwY1xdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGNcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGMsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDA6dzoyLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMSwlcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjLCVhMVxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTE6dzoyLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCVwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCVwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGMsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVkMCwlcGNcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwLCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGMsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDA6dzoyLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwYywlYTFcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExOnc6MiwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCV6cGNcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMSwlenBjXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwYywlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJWQwLCV6cGNcXVwpJyBpZ25vcmVkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzgzYzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBvcGVyYW5kcwotCi0jIFRlc3QgaGFuZGxpbmcgb2YgTUlUIGFuZCBNb3Rvcm9sYSBzeW50YXggb3BlcmFuZHMKLSMgSWYgeW91IGNoYW5nZSB0aGlzIGZpbGUsIHNlZSBhbHNvIG9wNjgwMDAuZC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gdHN0bCAlZDAKLTArMDAyIDxmb29cKygweHwpMj4gdHN0bCAlYTAKLTArMDA0IDxmb29cKygweHwpND4gdHN0bCAlYTBACi0wKzAwNiA8Zm9vXCsoMHh8KTY+IHRzdGwgJWEwQAotMCswMDggPGZvb1wrKDB4fCk4PiB0c3RsICVhMEBcKwotMCswMGEgPGZvb1wrKDB4fClhPiB0c3RsICVhMEBcKwotMCswMGMgPGZvb1wrKDB4fCljPiB0c3RsICVhMEAtCi0wKzAwZSA8Zm9vXCsoMHh8KWU+IHRzdGwgJWEwQC0KLTArMDEwIDxmb29cKygweHwpMTA+IHRzdGwgJWEwQFwoOFwpCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiB0c3RsICVhMEBcKDhcKQotMCswMTggPGZvb1wrKDB4fCkxOD4gdHN0bCAlYTBAXCg4XCkKLTArMDFjIDxmb29cKygweHwpMWM+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswMjAgPGZvb1wrKDB4fCkyMD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6d1wpCi0wKzAyNCA8Zm9vXCsoMHh8KTI0PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKLTArMDI4IDxmb29cKygweHwpMjg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCi0wKzAyYyA8Zm9vXCsoMHh8KTJjPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjRcKQotMCswMzAgPGZvb1wrKDB4fCkzMD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzo4XCkKLTArMDM0IDxmb29cKygweHwpMzQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswMzggPGZvb1wrKDB4fCkzOD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzAzYyA8Zm9vXCsoMHh8KTNjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjJcKQotMCswNDAgPGZvb1wrKDB4fCk0MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo0XCkKLTArMDQ0IDxmb29cKygweHwpNDQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6OFwpCi0wKzA0OCA8Zm9vXCsoMHh8KTQ4PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKQotMCswNGMgPGZvb1wrKDB4fCk0Yz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzA1MCA8Zm9vXCsoMHh8KTUwPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDU0IDxmb29cKygweHwpNTQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6MlwpCi0wKzA1OCA8Zm9vXCsoMHh8KTU4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjRcKQotMCswNWMgPGZvb1wrKDB4fCk1Yz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo4XCkKLTArMDYwIDxmb29cKygweHwpNjA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOndcKQotMCswNjQgPGZvb1wrKDB4fCk2ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6d1wpCi0wKzA2OCA8Zm9vXCsoMHh8KTY4PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjJcKQotMCswNmMgPGZvb1wrKDB4fCk2Yz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzo0XCkKLTArMDcwIDxmb29cKygweHwpNzA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6OFwpCi0wKzA3NCA8Zm9vXCsoMHh8KTc0PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDc4IDxmb29cKygweHwpNzg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswN2MgPGZvb1wrKDB4fCk3Yz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDoyXCkKLTArMDgwIDxmb29cKygweHwpODA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6NFwpCi0wKzA4NCA8Zm9vXCsoMHh8KTg0PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjhcKQotMCswODggPGZvb1wrKDB4fCk4OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzA4YyA8Zm9vXCsoMHh8KThjPiB0c3RsICVhMEBcKDArMDA4LCVhMTp3OjJcKQotMCswOTAgPGZvb1wrKDB4fCk5MD4gdHN0bCAlYTFAXCgwKzAwOCwlYTA6bFwpCi0wKzA5NCA8Zm9vXCsoMHh8KTk0PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjJcKQotMCswOTggPGZvb1wrKDB4fCk5OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzoyXCkKLTArMDljIDxmb29cKygweHwpOWM+IHRzdGwgJWEwQFwoMCswMDgsJWExOnc6MlwpCi0wKzBhMCA8Zm9vXCsoMHh8KWEwPiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKQotMCswYTQgPGZvb1wrKDB4fClhND4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXCkKLTArMGE4IDxmb29cKygweHwpYTg+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBhZSA8Zm9vXCsoMHh8KWFlPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCswYjQgPGZvb1wrKDB4fCliND4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXCkKLTArMGI4IDxmb29cKygweHwpYjg+IHRzdGwgQFwoMCszZThcKQotMCswYmUgPGZvb1wrKDB4fCliZT4gdHN0bCAlYTBAXCgwKzE4NmEwXCkKLTArMGM2IDxmb29cKygweHwpYzY+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBjYyA8Zm9vXCsoMHh8KWNjPiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXCkKLTArMGQyIDxmb29cKygweHwpZDI+IHRzdGwgJWEwQFwoMCszZTgsJWExOnc6MlwpCi0wKzBkOCA8Zm9vXCsoMHh8KWQ4PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKQotMCswZGUgPGZvb1wrKDB4fClkZT4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6bFwpCi0wKzBlNCA8Zm9vXCsoMHh8KWU0PiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCswZWEgPGZvb1wrKDB4fCllYT4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGYwIDxmb29cKygweHwpZjA+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpCi0wKzBmNCA8Zm9vXCsoMHh8KWY0PiB0c3RsICVhMEBcKDArMTg2YTBcKQotMCswZmMgPGZvb1wrKDB4fClmYz4gdHN0bCAlYTBAXCgwKzE4NmEwXCkKLTArMTA0IDxmb29cKygweHwpMTA0PiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCsxMGEgPGZvb1wrKDB4fCkxMGE+IHRzdGwgQFwoMCsxODZhMFwpCi0wKzExMiA8Zm9vXCsoMHh8KTExMj4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMTE4IDxmb29cKygweHwpMTE4PiB0c3RsIEBcKDArM2U4LCVkMDpsXCkKLTArMTFlIDxmb29cKygweHwpMTFlPiB0c3RsIEBcKDArM2U4LCVhMTp3OjJcKQotMCsxMjQgPGZvb1wrKDB4fCkxMjQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzEyYSA8Zm9vXCsoMHh8KTEyYT4gdHN0bCBAXCgwKzNlOCwlZDA6bFwpCi0wKzEzMCA8Zm9vXCsoMHh8KTEzMD4gdHN0bCBAXCgwKzE4NmEwXCkKLTArMTM4IDxmb29cKygweHwpMTM4PiB0c3RsIEBcKDArMTg2YTBcKQotMCsxNDAgPGZvb1wrKDB4fCkxNDA+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNDYgPGZvb1wrKDB4fCkxNDY+IHRzdGwgQFwoMCszZThcKQotMCsxNGMgPGZvb1wrKDB4fCkxNGM+IHRzdGwgQFwoMCswMDBcKQotMCsxNTAgPGZvb1wrKDB4fCkxNTA+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNTYgPGZvb1wrKDB4fCkxNTY+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNWMgPGZvb1wrKDB4fCkxNWM+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNjIgPGZvb1wrKDB4fCkxNjI+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNjggPGZvb1wrKDB4fCkxNjg+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNmUgPGZvb1wrKDB4fCkxNmU+IHRzdGwgQFwoMCszZThcKQotMCsxNzQgPGZvb1wrKDB4fCkxNzQ+IHRzdGwgQFwoMCszZThcKQotMCsxN2EgPGZvb1wrKDB4fCkxN2E+IHRzdGwgQFwoMCswMDBcKQotMCsxN2UgPGZvb1wrKDB4fCkxN2U+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxODYgPGZvb1wrKDB4fCkxODY+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxOGMgPGZvb1wrKDB4fCkxOGM+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwXCkKLTArMTk0IDxmb29cKygweHwpMTk0PiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMTljIDxmb29cKygweHwpMTljPiB0c3RsIEBcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWEyIDxmb29cKygweHwpMWEyPiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMFwpCi0wKzFhYSA8Zm9vXCsoMHh8KTFhYT4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFiMCA8Zm9vXCsoMHh8KTFiMD4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzFiNCA8Zm9vXCsoMHh8KTFiND4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCsxYmEgPGZvb1wrKDB4fCkxYmE+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxYzAgPGZvb1wrKDB4fCkxYzA+IHRzdGwgQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxYzQgPGZvb1wrKDB4fCkxYzQ+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwXCkKLTArMWNhIDxmb29cKygweHwpMWNhPiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMWQyIDxmb29cKygweHwpMWQyPiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWQ4IDxmb29cKygweHwpMWQ4PiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzdkMFwpCi0wKzFlMCA8Zm9vXCsoMHh8KTFlMD4gdHN0bCBAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFlOCA8Zm9vXCsoMHh8KTFlOD4gdHN0bCBAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzFlZSA8Zm9vXCsoMHh8KTFlZT4gdHN0bCBAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCsxZjYgPGZvb1wrKDB4fCkxZjY+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxZmMgPGZvb1wrKDB4fCkxZmM+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsyMDAgPGZvb1wrKDB4fCkyMDA+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArN2QwXCkKLTArMjA2IDxmb29cKygweHwpMjA2PiB0c3RsIEBcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMjBjIDxmb29cKygweHwpMjBjPiB0c3RsIEBcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMjEwIDxmb29cKygweHwpMjEwPiB0c3RsIEBcKDArMDAwXClAXCgwKzdkMFwpCi0wKzIxNiA8Zm9vXCsoMHh8KTIxNj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzIxZSA8Zm9vXCsoMHh8KTIxZT4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzIyNCA8Zm9vXCsoMHh8KTIyND4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzIyYyA8Zm9vXCsoMHh8KTIyYz4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzIzMiA8Zm9vXCsoMHh8KTIzMj4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzIzOCA8Zm9vXCsoMHh8KTIzOD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzIzYyA8Zm9vXCsoMHh8KTIzYz4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI0MiA8Zm9vXCsoMHh8KTI0Mj4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzI0NiA8Zm9vXCsoMHh8KTI0Nj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI0ZSA8Zm9vXCsoMHh8KTI0ZT4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI1NiA8Zm9vXCsoMHh8KTI1Nj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6bFwpQFwoMCs3ZDBcKQotMCsyNWUgPGZvb1wrKDB4fCkyNWU+IHRzdGwgJWExQFwoMCszZTgsJWEwOmxcKUBcKDArN2QwXCkKLTArMjY2IDxmb29cKygweHwpMjY2PiB0c3RsICVhMEBcKDArM2U4LCVhMTp3OjJcKUBcKDArN2QwXCkKLTArMjZlIDxmb29cKygweHwpMjZlPiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjc0IDxmb29cKygweHwpMjc0PiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXClAXCgwKzAwMFwpCi0wKzI3YSA8Zm9vXCsoMHh8KTI3YT4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI4MiA8Zm9vXCsoMHh8KTI4Mj4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzI4OCA8Zm9vXCsoMHh8KTI4OD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI4ZSA8Zm9vXCsoMHh8KTI4ZT4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6bFwpQFwoMCs3ZDBcKQotMCsyOTQgPGZvb1wrKDB4fCkyOTQ+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyOTggPGZvb1wrKDB4fCkyOTg+IHRzdGwgJWEwQFwoMCswMDAsJWQwOmxcKUBcKDArMDAwXCkKLTArMjljIDxmb29cKygweHwpMjljPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMmEyIDxmb29cKygweHwpMmEyPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMmE2IDxmb29cKygweHwpMmE2PiBwZWEgJXBjQFwoMCsyYjAgPGZvb1wrKDB4fCkyYjA+XCkKLTArMmFhIDxmb29cKygweHwpMmFhPiBwZWEgJXBjQFwoMCsyYjQgPGZvb1wrKDB4fCkyYjQ+XCkKLTArMmFlIDxmb29cKygweHwpMmFlPiBwZWEgJXBjQFwoMCsyYjggPGZvb1wrKDB4fCkyYjg+XCkKLTArMmIyIDxmb29cKygweHwpMmIyPiBwZWEgJXBjQFwoMCswMDAgPGZvbz5cKQotMCsyYjYgPGZvb1wrKDB4fCkyYjY+IHBlYSAlcGNAXCgwKzJjMCA8Zm9vXCsoMHh8KTJjMD4sJWQwOnc6MlwpCi0wKzJiYSA8Zm9vXCsoMHh8KTJiYT4gcGVhICVwY0BcKDArMmJjIDxmb29cKygweHwpMmJjPiwlZDA6dzoyXCkKLTArMmJlIDxmb29cKygweHwpMmJlPiBwZWEgJXBjQFwoMCsyYzggPGZvb1wrKDB4fCkyYzg+LCVkMDp3OjJcKQotMCsyYzIgPGZvb1wrKDB4fCkyYzI+IHBlYSAlcGNAXCgwKzJjYyA8Zm9vXCsoMHh8KTJjYz4sJWQwOmxcKQotMCsyYzYgPGZvb1wrKDB4fCkyYzY+IHBlYSAlcGNAXCgwKzJkMCA8Zm9vXCsoMHh8KTJkMD4sJWEwOmxcKQotMCsyY2EgPGZvb1wrKDB4fCkyY2E+IHBlYSAlcGNAXCgwKzJkNCA8Zm9vXCsoMHh8KTJkND4sJWQwOnc6MlwpCi0wKzJjZSA8Zm9vXCsoMHh8KTJjZT4gcGVhICVwY0BcKDArMmQ4IDxmb29cKygweHwpMmQ4PiwlZDA6bFwpCi0wKzJkMiA8Zm9vXCsoMHh8KTJkMj4gcGVhICVwY0BcKDArMmRjIDxmb29cKygweHwpMmRjPiwlYTA6bFwpCi0wKzJkNiA8Zm9vXCsoMHh8KTJkNj4gcGVhICVwY0BcKDArMmQ4IDxmb29cKygweHwpMmQ4PiwlZDA6dzoyXCkKLTArMmRhIDxmb29cKygweHwpMmRhPiBwZWEgJXBjQFwoMCsyZGMgPGZvb1wrKDB4fCkyZGM+LCVkMDpsXCkKLTArMmRlIDxmb29cKygweHwpMmRlPiBwZWEgJXBjQFwoMCsyZTAgPGZvb1wrKDB4fCkyZTA+LCVhMDpsXCkKLTArMmUyIDxmb29cKygweHwpMmUyPiBwZWEgJXBjQFwoMCs2Y2MgPC4qPiwlZDA6dzoyXCkKLTArMmU4IDxmb29cKygweHwpMmU4PiBwZWEgJXBjQFwoMCsxODk4YSA8Lio+XCkKLTArMmYwIDxmb29cKygweHwpMmYwPiBwZWEgJXBjQFwoMCs2ZGEgPC4qPiwlZDA6dzoyXCkKLTArMmY2IDxmb29cKygweHwpMmY2PiBwZWEgJXBjQFwoMCs2ZTAgPC4qPiwlZDA6bFwpCi0wKzJmYyA8Zm9vXCsoMHh8KTJmYz4gcGVhICVwY0BcKDArNmU2IDwuKj4sJWExOnc6MlwpCi0wKzMwMiA8Zm9vXCsoMHh8KTMwMj4gcGVhICVwY0BcKDArNmVjIDwuKj4sJWExOmxcKQotMCszMDggPGZvb1wrKDB4fCkzMDg+IHBlYSAlcGNAXCgwKzZmMiA8Lio+LCVkMDp3OjJcKQotMCszMGUgPGZvb1wrKDB4fCkzMGU+IHBlYSAlcGNAXCgwKzZmOCA8Lio+LCVkMDpsXCkKLTArMzE0IDxmb29cKygweHwpMzE0PiBwZWEgJXBjQFwoMCs2ZmUgPC4qPiwlYTE6bFwpCi0wKzMxYSA8Zm9vXCsoMHh8KTMxYT4gcGVhICVwY0BcKDArMTg5YmMgPC4qPlwpCi0wKzMyMiA8Zm9vXCsoMHh8KTMyMj4gcGVhICVwY0BcKDArMTg5YzQgPC4qPlwpCi0wKzMyYSA8Zm9vXCsoMHh8KTMyYT4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXCkKLTArMzMwIDxmb29cKygweHwpMzMwPiBwZWEgJXpwY0BcKDArMTg2YTBcKQotMCszMzggPGZvb1wrKDB4fCkzMzg+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpCi0wKzMzZSA8Zm9vXCsoMHh8KTMzZT4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpCi0wKzM0NCA8Zm9vXCsoMHh8KTM0ND4gcGVhICV6cGNAXCgwKzNlOCwlYTE6dzoyXCkKLTArMzRhIDxmb29cKygweHwpMzRhPiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXCkKLTArMzUwIDxmb29cKygweHwpMzUwPiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKQotMCszNTYgPGZvb1wrKDB4fCkzNTY+IHBlYSAlenBjQFwoMCszZTgsJWQwOmxcKQotMCszNWMgPGZvb1wrKDB4fCkzNWM+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKQotMCszNjIgPGZvb1wrKDB4fCkzNjI+IHBlYSAlenBjQFwoMCsxODZhMFwpCi0wKzM2YSA8Zm9vXCsoMHh8KTM2YT4gcGVhICV6cGNAXCgwKzE4NmEwXCkKLTArMzcyIDxmb29cKygweHwpMzcyPiBwZWEgJXBjQFwoMCs3NWMgPC4qPlwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzM3YSA8Zm9vXCsoMHh8KTM3YT4gcGVhICVwY0BcKDArNzY0IDwuKj5cKUBcKDArMDAwLCVkMDp3OjJcKQotMCszODAgPGZvb1wrKDB4fCkzODA+IHBlYSAlcGNAXCgwKzc2YSA8Lio+XClAXCgwKzdkMFwpCi0wKzM4OCA8Zm9vXCsoMHh8KTM4OD4gcGVhICVwY0BcKDArMzhhIDxmb29cKygweHwpMzhhPlwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzM4ZSA8Zm9vXCsoMHh8KTM4ZT4gcGVhICVwY0BcKDArMzkwIDxmb29cKygweHwpMzkwPlwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzM5MiA8Zm9vXCsoMHh8KTM5Mj4gcGVhICVwY0BcKDArMzk0IDxmb29cKygweHwpMzk0PlwpQFwoMCs3ZDBcKQotMCszOTggPGZvb1wrKDB4fCkzOTg+IHBlYSAlcGNAXCgwKzc4MiA8Lio+XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2EwIDxmb29cKygweHwpM2EwPiBwZWEgJXBjQFwoMCs3OGEgPC4qPlwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzNhNiA8Zm9vXCsoMHh8KTNhNj4gcGVhICVwY0BcKDArNzkwIDwuKj5cKUBcKDArN2QwXCkKLTArM2FlIDxmb29cKygweHwpM2FlPiBwZWEgJXBjQFwoMCszYjAgPGZvb1wrKDB4fCkzYjA+XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2I0IDxmb29cKygweHwpM2I0PiBwZWEgJXBjQFwoMCszYjYgPGZvb1wrKDB4fCkzYjY+XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2I4IDxmb29cKygweHwpM2I4PiBwZWEgJXBjQFwoMCszYmEgPGZvb1wrKDB4fCkzYmE+XClAXCgwKzdkMFwpCi0wKzNiZSA8Zm9vXCsoMHh8KTNiZT4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzNjNiA8Zm9vXCsoMHh8KTNjNj4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzNjYyA8Zm9vXCsoMHh8KTNjYz4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCszZDQgPGZvb1wrKDB4fCkzZDQ+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCszZGEgPGZvb1wrKDB4fCkzZGE+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCszZGUgPGZvb1wrKDB4fCkzZGU+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArN2QwXCkKLTArM2U0IDxmb29cKygweHwpM2U0PiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2VjIDxmb29cKygweHwpM2VjPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2YyIDxmb29cKygweHwpM2YyPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMFwpCi0wKzNmYSA8Zm9vXCsoMHh8KTNmYT4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzQwMCA8Zm9vXCsoMHh8KTQwMD4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzQwNCA8Zm9vXCsoMHh8KTQwND4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCs0MGEgPGZvb1wrKDB4fCk0MGE+IHBlYSAlcGNAXCgwKzdmNCA8Lio+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDEyIDxmb29cKygweHwpNDEyPiBwZWEgJXBjQFwoMCs3ZmMgPC4qPiwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQxOCA8Zm9vXCsoMHh8KTQxOD4gcGVhICVwY0BcKDArNDFhIDxmb29cKygweHwpNDFhPiwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQxZSA8Zm9vXCsoMHh8KTQxZT4gcGVhICVwY0BcKDArNDIwIDxmb29cKygweHwpNDIwPiwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQyMiA8Zm9vXCsoMHh8KTQyMj4gcGVhICVwY0BcKDArODBjIDwuKj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0MmEgPGZvb1wrKDB4fCk0MmE+IHBlYSAlcGNAXCgwKzgxNCA8Lio+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDMyIDxmb29cKygweHwpNDMyPiBwZWEgJXBjQFwoMCs4MWMgPC4qPiwlZDA6bFwpQFwoMCs3ZDBcKQotMCs0M2EgPGZvb1wrKDB4fCk0M2E+IHBlYSAlcGNAXCgwKzgyNCA8Lio+LCVhMTpsXClAXCgwKzdkMFwpCi0wKzQ0MiA8Zm9vXCsoMHh8KTQ0Mj4gcGVhICVwY0BcKDArODJjIDwuKj4sJWExOmxcKUBcKDArN2QwXCkKLTArNDRhIDxmb29cKygweHwpNDRhPiBwZWEgJXBjQFwoMCs4MzQgPC4qPiwlYTE6dzoyXClAXCgwKzdkMFwpCi0wKzQ1MiA8Zm9vXCsoMHh8KTQ1Mj4gcGVhICVwY0BcKDArODNjIDwuKj4sJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0NTggPGZvb1wrKDB4fCk0NTg+IHBlYSAlcGNAXCgwKzg0MiA8Lio+LCVkMDpsXClAXCgwKzAwMFwpCi0wKzQ1ZSA8Zm9vXCsoMHh8KTQ1ZT4gcGVhICVwY0BcKDArODQ4IDwuKj4sJWExOmxcKUBcKDArMDAwXCkKLTArNDY0IDxmb29cKygweHwpNDY0PiBwZWEgJXBjQFwoMCs0NjYgPGZvb1wrKDB4fCk0NjY+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDZhIDxmb29cKygweHwpNDZhPiBwZWEgJXBjQFwoMCs0NmMgPGZvb1wrKDB4fCk0NmM+LCVhMDpsXClAXCgwKzdkMFwpCi0wKzQ3MCA8Zm9vXCsoMHh8KTQ3MD4gcGVhICVwY0BcKDArNDcyIDxmb29cKygweHwpNDcyPiwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQ3NCA8Zm9vXCsoMHh8KTQ3ND4gcGVhICVwY0BcKDArNDc2IDxmb29cKygweHwpNDc2PiwlZDA6bFwpQFwoMCswMDBcKQotMCs0NzggPGZvb1wrKDB4fCk0Nzg+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0ODAgPGZvb1wrKDB4fCk0ODA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0ODYgPGZvb1wrKDB4fCk0ODY+IHBlYSAlenBjQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0OGMgPGZvb1wrKDB4fCk0OGM+IHBlYSAlenBjQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0OTAgPGZvb1wrKDB4fCk0OTA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0OTggPGZvb1wrKDB4fCk0OTg+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0YTAgPGZvb1wrKDB4fCk0YTA+IHBlYSAlenBjQFwoMCszZTgsJWQwOmxcKUBcKDArN2QwXCkKLTArNGE4IDxmb29cKygweHwpNGE4PiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXClAXCgwKzdkMFwpCi0wKzRiMCA8Zm9vXCsoMHh8KTRiMD4gcGVhICV6cGNAXCgwKzNlOCwlYTE6bFwpQFwoMCs3ZDBcKQotMCs0YjggPGZvb1wrKDB4fCk0Yjg+IHBlYSAlenBjQFwoMCszZTgsJWExOnc6MlwpQFwoMCs3ZDBcKQotMCs0YzAgPGZvb1wrKDB4fCk0YzA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0YzYgPGZvb1wrKDB4fCk0YzY+IHBlYSAlenBjQFwoMCszZTgsJWQwOmxcKUBcKDArMDAwXCkKLTArNGNjIDxmb29cKygweHwpNGNjPiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXClAXCgwKzAwMFwpCi0wKzRkMiA8Zm9vXCsoMHh8KTRkMj4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzRkOCA8Zm9vXCsoMHh8KTRkOD4gcGVhICV6cGNAXCgwKzAwMCwlYTA6bFwpQFwoMCs3ZDBcKQotMCs0ZGUgPGZvb1wrKDB4fCk0ZGU+IHBlYSAlenBjQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0ZTIgPGZvb1wrKDB4fCk0ZTI+IHBlYSAlenBjQFwoMCswMDAsJWQwOmxcKUBcKDArMDAwXCkKLTArNGU2IDxmb29cKygweHwpNGU2PiB0c3RsIDArMDA0IDxmb29cKygweHwpND4KLTArNGVhIDxmb29cKygweHwpNGVhPiB0c3RsIDArMDA0IDxmb29cKygweHwpND4KLTArNGVlIDxmb29cKygweHwpNGVlPiB0c3RsIDArMDA0IDxmb29cKygweHwpND4KLTArNGYyIDxmb29cKygweHwpNGYyPiB0c3RsIDArMTg2YTAgPC4qPgotMCs0ZjggPGZvb1wrKDB4fCk0Zjg+IHRzdGwgMCswMDggPGZvb1wrKDB4fCk4PgotMCs0ZmUgPGZvb1wrKDB4fCk0ZmU+IHRzdGwgMCswMDggPGZvb1wrKDB4fCk4PgotMCs1MDQgPGZvb1wrKDB4fCk1MDQ+IGFkZGliICMxLCVkMAotMCs1MDggPGZvb1wrKDB4fCk1MDg+IGFkZGl3ICMxLCVkMAotMCs1MGMgPGZvb1wrKDB4fCk1MGM+IGFkZGlsICMxLCVkMAotMCs1MTIgPGZvb1wrKDB4fCk1MTI+IGFkZHFiICMxLCVkMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDlmNTZmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMucworKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0jIFRlc3QgaGFuZGxpbmcgb2YgTUlUIGFuZCBNb3Rvcm9sYSBzeW50YXggb3BlcmFuZHMKLSMgSWYgeW91IGNoYW5nZSB0aGlzIGZpbGUsIHNlZSBhbHNvIG9wNjgwMDAuZC4KLQkudGV4dAotZm9vOgkKLQl8IERhdGEgcmVnaXN0ZXIgZGlyZWN0Ci0JdHN0bAklZDAKLQotCXwgQWRkcmVzcyByZWdpc3RlciBkaXJlY3QKLQl0c3RsCSVhMAotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0Ci0JdHN0bAklYTBACi0JdHN0bAkoJWEwKQotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdGluY3JlbWVudAotCXRzdGwJJWEwQCsKLQl0c3RsCSglYTApKwotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlZGVjcmVtZW50Ci0JdHN0bAklYTBALQotCXRzdGwJLSglYTApCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLQl0c3RsCSVhMEAoOCkKLQl0c3RsCSg4LCVhMCkKLQl0c3RsCTgoJWEwKQotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggaW5kZXggKDgtYml0IGRpc3BsYWNlbWVudCkKLQl0c3RsCSVhMEAoOCwlZDApCi0JdHN0bAklYTBAKDgsJWQwOncpCi0JdHN0bAklYTBAKDgsJWQwOnc6MSkKLQl0c3RsCSVhMEAoOCwlZDA6dzoyKQotCXRzdGwJJWEwQCg4LCVkMDp3OjQpCi0JdHN0bAklYTBAKDgsJWQwOnc6OCkKLQl0c3RsCSVhMEAoOCwlZDA6bCkKLQl0c3RsCSVhMEAoOCwlZDA6bDoxKQotCXRzdGwJJWEwQCg4LCVkMDpsOjIpCi0JdHN0bAklYTBAKDgsJWQwOmw6NCkKLQl0c3RsCSVhMEAoOCwlZDA6bDo4KQotCXRzdGwJJWEwQCglZDA6dzoyKQotCXRzdGwJKDgsJWEwLCVkMCkKLQl0c3RsCSg4LCVhMCwlZDAqMSkKLQl0c3RsCSg4LCVhMCwlZDAqMikKLQl0c3RsCSg4LCVhMCwlZDAqNCkKLQl0c3RsCSg4LCVhMCwlZDAqOCkKLQl0c3RsCSg4LCVhMCwlZDAudykKLQl0c3RsCSg4LCVhMCwlZDAudyoxKQotCXRzdGwJKDgsJWEwLCVkMC53KjIpCi0JdHN0bAkoOCwlYTAsJWQwLncqNCkKLQl0c3RsCSg4LCVhMCwlZDAudyo4KQotCXRzdGwJKDgsJWEwLCVkMC5sKQotCXRzdGwJKDgsJWEwLCVkMC5sKjEpCi0JdHN0bAkoOCwlYTAsJWQwLmwqMikKLQl0c3RsCSg4LCVhMCwlZDAubCo0KQotCXRzdGwJKDgsJWEwLCVkMC5sKjgpCi0JdHN0bAkoOCwlZDAsJWEwKQotCXRzdGwJKDgsJWExLncqMiwlYTApCi0JdHN0bAkoOCwlYTEsJWEwKQotCXRzdGwJOCglYTAsJWQwLncqMikKLQl0c3RsCTgoJWQwLncqMiwlYTApCi0JdHN0bAk4KCVhMS53KjIsJWEwKQotCXRzdGwJKCVhMCwlZDAudyoyKQotCXRzdGwJKCVkMC53KjIsJWEwKQotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggaW5kZXggKGJhc2UgZGlzcGxhY2VtZW50KQotCXRzdGwJJWEwQCgxMDAwLCVkMDp3OjIpCi0JdHN0bAlAKDEwMDAsJWQwOnc6MikKLQl0c3RsCUAoJWQwOnc6MikKLQl0c3RsCUAoMTAwMCkKLQl0c3RsCSVhMEAoMTAwMDAwKQotCXRzdGwJKDEwMDAsJWEwLCVkMC53KjIpCi0JdHN0bAkoMTAwMCwlZDAsJWEwKQotCXRzdGwJKDEwMDAsJWExLncqMiwlYTApCi0JdHN0bAkxMDAwKCVhMCwlZDAudyoyKQotCXRzdGwJMTAwMCglZDAsJWEwKQotCXRzdGwJKDEwMDAsJWQwLncqMikKLQl0c3RsCTEwMDAoJWQwLncqMikKLQl0c3RsCSglZDAudyoyKQotCXRzdGwJKDEwMDAwMCwlYTApCi0JdHN0bAkxMDAwMDAoJWEwKQotCXRzdGwJJXphMUAoMTAwMCwlZDA6dzoyKQotCXRzdGwJJXphMUAoMTAwMDAwKQotCXRzdGwJKDEwMDAsJXphMSwlZDAudyoyKQotCXRzdGwJKDEwMDAsJWQwLCV6YTEpCi0JdHN0bAkoMTAwMCwlYTEudyoyLCV6YTEpCi0JdHN0bAkxMDAwKCV6YTEsJWQwLncqMikKLQl0c3RsCTEwMDAoJWQwLCV6YTEpCi0JdHN0bAkoMTAwMDAwLCV6YTEpCi0JdHN0bAkxMDAwMDAoJXphMSkKLQl0c3RsCSVhMEAoMTAwMCwlemQxOnc6MikKLQl0c3RsCUAoMTAwMCwlemQxOnc6MikKLQl0c3RsCUAoJXpkMTp3OjIpCi0JdHN0bAkoMTAwMCwlYTAsJXpkMS53KjIpCi0JdHN0bAkoMTAwMCwlemQxLCVhMCkKLQl0c3RsCSgxMDAwLCV6YTEudyoyLCVhMCkKLQl0c3RsCTEwMDAoJWEwLCV6ZDEudyoyKQotCXRzdGwJMTAwMCglemQxLCVhMCkKLQl0c3RsCSgxMDAwLCV6ZDEudyoyKQotCXRzdGwJMTAwMCglemQxLncqMikKLQl0c3RsCSglemQxLncqMikKLQotCXwgTWVtb3J5IGluZGlyZWN0IHBvc3RpbmRleGVkCi0JdHN0bAklYTBAKDEwMDApQCgyMDAwLCVkMDp3OjIpCi0JdHN0bAklYTBAKDEwMDApQCglZDA6dzoyKQotCXRzdGwJJWEwQCgxMDAwKUAoMjAwMCkKLQl0c3RsCUAoMTAwMClAKDIwMDAsJWQwOnc6MikKLQl0c3RsCUAoMTAwMClAKCVkMDp3OjIpCi0JdHN0bAlAKDEwMDApQCgyMDAwKQotCXRzdGwJJWEwQCgwKUAoMjAwMCwlZDA6dzoyKQotCXRzdGwJJWEwQCgwKUAoJWQwOnc6MikKLQl0c3RsCSVhMEAoMClAKDIwMDApCi0JdHN0bAlAKDApQCgyMDAwLCVkMDp3OjIpCi0JdHN0bAlAKDApQCglZDA6dzoyKQotCXRzdGwJQCgwKUAoMjAwMCkKLQl0c3RsCShbMTAwMCwlYTBdLCVkMDp3OjIsMjAwMCkKLQl0c3RsCShbMTAwMCwlYTBdLCVkMDp3OjIpCi0JdHN0bAkoWzEwMDAsJWEwXSwyMDAwKQotCXRzdGwJKFsxMDAwXSwlZDA6dzoyLDIwMDApCi0JdHN0bAkoWzEwMDBdLCVkMDp3OjIpCi0JdHN0bAkoWzEwMDBdLDIwMDApCi0JdHN0bAkoWyVhMF0sJWQwOnc6MiwyMDAwKQotCXRzdGwJKFslYTBdLCVkMDp3OjIpCi0JdHN0bAkoWyVhMF0sMjAwMCkKLQl0c3RsCShbMF0sJWQwOnc6MiwyMDAwKQotCXRzdGwJKFswXSwlZDA6dzoyKQotCXRzdGwJKFswXSwyMDAwKQotCi0JfCBNZW1vcnkgaW5kaXJlY3QgcHJlaW5kZXhlZAotCXRzdGwJJWEwQCgxMDAwLCVkMDp3OjIpQCgyMDAwKQotCXRzdGwJJWEwQCgxMDAwLCVkMDp3OjIpQCgwKQotCXRzdGwJQCgxMDAwLCVkMDp3OjIpQCgyMDAwKQotCXRzdGwJQCgxMDAwLCVkMDp3OjIpQCgwKQotCXRzdGwJJWEwQCglZDA6dzoyKUAoMjAwMCkKLQl0c3RsCSVhMEAoJWQwOnc6MilAKDApCi0JdHN0bAlAKCVkMDp3OjIpQCgyMDAwKQotCXRzdGwJQCglZDA6dzoyKUAoMCkKLQl0c3RsCShbMTAwMCwlYTAsJWQwOnc6Ml0sMjAwMCkKLQl0c3RsCShbMTAwMCwlZDA6dzoyLCVhMF0sMjAwMCkKLQl0c3RsCShbMTAwMCwlZDAsJWEwXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVhMSwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWExOnc6MiwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWEwLCVkMDp3OjJdKQotCXRzdGwJKFsxMDAwLCVkMCwlYTBdKQotCXRzdGwJKFsxMDAwLCVkMDp3OjJdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWQwOnc6Ml0pCi0JdHN0bAkoWyVhMCwlZDA6dzoyXSwyMDAwKQotCXRzdGwJKFslZDAsJWEwXSwyMDAwKQotCXRzdGwJKFslYTAsJWQwOnc6Ml0pCi0JdHN0bAkoWyVkMCwlYTBdKQotCXRzdGwJKFslZDA6dzoyXSwyMDAwKQotCXRzdGwJKFslZDA6dzoyXSkKLQotCXwgUHJvZ3JhbSBjb3VudGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0JcGVhCSVwY0AoOCkKLQlwZWEJKDgsJXBjKQotCXBlYQk4KCVwYykKLQlwZWEJZm9vCi0KLQl8IFByb2dyYW0gY291bnRlciBpbmRpcmVjdCB3aXRoIGluZGV4ICg4LWJpdCBkaXNwbGFjZW1lbnQpCi0JcGVhCSVwY0AoOCwlZDA6dzoyKQotCXBlYQklcGNAKCVkMDp3OjIpCi0JcGVhCSg4LCVwYywlZDAudyoyKQotCXBlYQkoOCwlZDAsJXBjKQotCXBlYQkoOCwlYTAsJXBjKQotCXBlYQk4KCVwYywlZDAudyoyKQotCXBlYQk4KCVkMCwlcGMpCi0JcGVhCTgoJWEwLCVwYykKLQlwZWEJKCVwYywlZDAudyoyKQotCXBlYQkoJWQwLCVwYykKLQlwZWEJKCVhMCwlcGMpCi0KLQl8IFByb2dyYW0gY291bnRlciBpbmRpcmVjdCB3aXRoIGluZGV4IChiYXNlIGRpc3BsYWNlbWVudCkKLQlwZWEJJXBjQCgxMDAwLCVkMDp3OjIpCi0JcGVhCSVwY0AoMTAwMDAwKQotCXBlYQkoMTAwMCwlcGMsJWQwLncqMikKLQlwZWEJKDEwMDAsJWQwLCVwYykKLQlwZWEJKDEwMDAsJWExLncqMiwlcGMpCi0JcGVhCSgxMDAwLCVhMSwlcGMpCi0JcGVhCTEwMDAoJXBjLCVkMC53KjIpCi0JcGVhCTEwMDAoJWQwLCVwYykKLQlwZWEJMTAwMCglYTEsJXBjKQotCXBlYQkoMTAwMDAwLCVwYykKLQlwZWEJMTAwMDAwKCVwYykKLQlwZWEJJXpwY0AoMTAwMCwlZDA6dzoyKQotCXBlYQklenBjQCgxMDAwMDApCi0JcGVhCSgxMDAwLCV6cGMsJWQwLncqMikKLQlwZWEJKDEwMDAsJWQwLCV6cGMpCi0JcGVhCSgxMDAwLCVhMS53KjIsJXpwYykKLQlwZWEJKDEwMDAsJWExLCV6cGMpCi0JcGVhCTEwMDAoJXpwYywlZDAudyoyKQotCXBlYQkxMDAwKCVkMCwlenBjKQotCXBlYQkxMDAwKCVhMSwlenBjKQotCXBlYQkoMTAwMDAwLCV6cGMpCi0JcGVhCTEwMDAwMCglenBjKQotCi0JfCBQcm9ncmFtIGNvdW50ZXIgbWVtb3J5IGluZGlyZWN0IHBvc3RpbmRleGVkCi0JcGVhCSVwY0AoMTAwMClAKDIwMDAsJWQwOnc6MikKLQlwZWEJJXBjQCgxMDAwKUAoJWQwOnc6MikKLQlwZWEJJXBjQCgxMDAwKUAoMjAwMCkKLQlwZWEJJXBjQCgwKUAoMjAwMCwlZDA6dzoyKQotCXBlYQklcGNAKDApQCglZDA6dzoyKQotCXBlYQklcGNAKDApQCgyMDAwKQotCXBlYQkoWzEwMDAsJXBjXSwlZDA6dzoyLDIwMDApCi0JcGVhCShbMTAwMCwlcGNdLCVkMDp3OjIpCi0JcGVhCShbMTAwMCwlcGNdLDIwMDApCi0JcGVhCShbJXBjXSwlZDA6dzoyLDIwMDApCi0JcGVhCShbJXBjXSwlZDA6dzoyKQotCXBlYQkoWyVwY10sMjAwMCkKLQlwZWEJJXpwY0AoMTAwMClAKDIwMDAsJWQwOnc6MikKLQlwZWEJJXpwY0AoMTAwMClAKCVkMDp3OjIpCi0JcGVhCSV6cGNAKDEwMDApQCgyMDAwKQotCXBlYQklenBjQCgwKUAoMjAwMCwlZDA6dzoyKQotCXBlYQklenBjQCgwKUAoJWQwOnc6MikKLQlwZWEJJXpwY0AoMClAKDIwMDApCi0JcGVhCShbMTAwMCwlenBjXSwlZDA6dzoyLDIwMDApCi0JcGVhCShbMTAwMCwlenBjXSwlZDA6dzoyKQotCXBlYQkoWzEwMDAsJXpwY10sMjAwMCkKLQlwZWEJKFslenBjXSwlZDA6dzoyLDIwMDApCi0JcGVhCShbJXpwY10sJWQwOnc6MikKLQlwZWEJKFslenBjXSwyMDAwKQotCi0JfCBQcm9ncmFtIGNvdW50ZXIgbWVtb3J5IGluZGlyZWN0IHByZWluZGV4ZWQKLQlwZWEJJXBjQCgxMDAwLCVkMDp3OjIpQCgyMDAwKQotCXBlYQklcGNAKDEwMDAsJWQwOnc6MilAKDApCi0JcGVhCSVwY0AoJWQwOnc6MilAKDIwMDApCi0JcGVhCSVwY0AoJWQwOnc6MilAKDApCi0JcGVhCShbMTAwMCwlcGMsJWQwOnc6Ml0sMjAwMCkKLQlwZWEJKFsxMDAwLCVkMDp3OjIsJXBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJWQwLCVwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVhMSwlcGNdLDIwMDApCi0JcGVhCShbMTAwMCwlcGMsJWExXSwyMDAwKQotCXBlYQkoWzEwMDAsJWExOnc6MiwlcGNdLDIwMDApCi0JcGVhCShbMTAwMCwlcGMsJWQwOnc6Ml0pCi0JcGVhCShbMTAwMCwlZDAsJXBjXSkKLQlwZWEJKFsxMDAwLCVhMSwlcGNdKQotCXBlYQkoWyVwYywlZDA6dzoyXSwyMDAwKQotCXBlYQkoWyVwYywlYTBdLDIwMDApCi0JcGVhCShbJXBjLCVkMDp3OjJdKQotCXBlYQkoWyVkMCwlcGNdKQotCXBlYQklenBjQCgxMDAwLCVkMDp3OjIpQCgyMDAwKQotCXBlYQklenBjQCgxMDAwLCVkMDp3OjIpQCgwKQotCXBlYQklenBjQCglZDA6dzoyKUAoMjAwMCkKLQlwZWEJJXpwY0AoJWQwOnc6MilAKDApCi0JcGVhCShbMTAwMCwlenBjLCVkMDp3OjJdLDIwMDApCi0JcGVhCShbMTAwMCwlZDA6dzoyLCV6cGNdLDIwMDApCi0JcGVhCShbMTAwMCwlZDAsJXpwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVhMSwlenBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJXpwYywlYTFdLDIwMDApCi0JcGVhCShbMTAwMCwlYTE6dzoyLCV6cGNdLDIwMDApCi0JcGVhCShbMTAwMCwlenBjLCVkMDp3OjJdKQotCXBlYQkoWzEwMDAsJWQwLCV6cGNdKQotCXBlYQkoWzEwMDAsJWExLCV6cGNdKQotCXBlYQkoWyV6cGMsJWQwOnc6Ml0sMjAwMCkKLQlwZWEJKFslenBjLCVhMF0sMjAwMCkKLQlwZWEJKFslenBjLCVkMDp3OjJdKQotCXBlYQkoWyVkMCwlenBjXSkKLQotCXwgQWJzb2x1dGUgc2hvcnQKLQl0c3RsCTQKLQl0c3RsCTQudwotCXRzdGwJKDQpLncKLQotCXwgQWJzb2x1dGUgbG9uZwotCXRzdGwJMTAwMDAwCi0JdHN0bAk4LmwKLQl0c3RsCSg4KS5sCi0KLQl8IEltbWVkaWF0ZQotCWFkZGliCSYxLCVkMAotCWFkZGl3CSYxLCVkMAotCWFkZGlsCSYxLCVkMAotCWFkZHFiCSYxLCVkMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjQxMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjQxMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjAzMzdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI0MTAucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS50ZXh0Ci1zdGFydDoJbm9wCi0Jbm9wCi0Jbm9wCi0JYnJhcyBsYWJlbDEKLQlicmFzIGxhYmVsMgotLmdsb2JsIGxhYmVsMQotbGFiZWwxOglub3AKLQkuc3BhY2UgMHhhMAotCW5vcAotCW5vcAotLmdsb2JsIGxhYmVsMgotbGFiZWwyOglicmFzIGxhYmVsMQotCWJyYXMgbGFiZWwyCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNjYzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNjYzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMzY1MGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjY2My5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotfAotfCBUaGlzIGNvZGUgZ2VuZXJhdGVzIGFuIGluY29ycmVjdCBwYyByZWxhdGl2ZSBvZmZzZXQgCi18Ci1idWc6ICAgICAgIG1vdmVsICAjNCwlZDcKLSAgICAgICAgICAganNyICAgIHRhYmxlKCVwYywlZDcudykgICAgICAgICAgICB8IHdyb25nCi0gICAgICAgICAgIGpzciAgICAlcGNAKHRhYmxlLS4tMjpiLCVkNzp3KSAgICAgfCBjb3JyZWN0IGJ1dCBjcnlwdGljCi0gICAgICAgICAgIG5vcAotICAgICAgICAgICBub3AKLXRhYmxlOgotICAgICAgICAgICBicmEgICAganVuawotICAgICAgICAgICBicmEgICAganVuawotICAgICAgICAgICBicmEgICAganVuawotCi1qdW5rOgotICAgIG5vcAotICAgIHJ0cwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDk4MzU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSNuYW1lOiBwY3JlbAotI29iamR1bXA6IC1kcnMgLWogLnRleHQgLS1wcmVmaXgtYWRkcmVzc2VzCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIDRlNzE0ZTcxIDRjZmEwMzAwIGZmZmE0Y2ZhIDAzMDBmZmY0ICBOcU5xTC4uLi4uTC4uLi4uCi0gMDAxMCA0Y2ZiMDMwMCAwOGVlNDFmYSBmZmVhNDFmYSBmZmU2NDFmYSAgTC4uLi4uQS4uLkEuLi5BLgotIDAwMjAgZmY2MjQxZmIgMDhkZTQxZmIgMDhkYTQxZmIgMDhkNjQxZmIgIC5iQS4uLkEuLi5BLi4uQS4KLSAwMDMwIDA5MjBmZmQyIDQxZmIwOTIwIGZmY2M0MWZiIDA5MzBmZmZmICAuIC4uQS4uIC4uQS4uMC4uCi0gMDA0MCBmZmM2NDFmYiAwOTMwZmZmZiBmZmJlNGU3MSA2MWZmMDAwMCAgLi5BLi4wLi4uLk5xYS4uLgotIDAwNTAgMDA1ODYxMDAgMDA1MjYxNGUgNjE0YzRlNzEgNDFmOTAwMDAgIC5YYS4uUmFOYUxOcUEuLi4KLSAwMDYwIDAwKGE2fDAwKTQxZmEgMDA0MjQxZmEgMDBiZTQxZmIgMDgzYTQxZmIgIC4uQS4uQkEuLi5BLi46QS4KLSAwMDcwIDA4MzY0MWZiIDA4MzI0MWZiIDA5MjAwMDJlIDQxZmIwOTIwICAuNkEuLjJBLi4gLi5BLi4gCi0gMDA4MCAwMDI4NDFmYiAwOTMwMDAwMCAwMDIyNDFmYiAwOTMwMDAwMCAgLlwoQS4uMC4uLiJBLi4wLi4KLSAwMDkwIDAwMWE0MWZiIDA5MzAwMDAwIDAwMTI0MWZiIDA5MjAwMDBhICAuLkEuLjAuLi4uQS4uIC4uCi0gMDBhMCA0MWZiMDgwNCA0ZTcxNGU3MSA0ZTcxNDFmYiAwODgwNDFmYiAgQS4uLk5xTnFOcUEuLi5BLgotIDAwYjAgMDkyMGZmN2YgNDFmYjA5MjAgODAwMDQxZmIgMDkzMGZmZmYgIC4gLi5BLi4gLi5BLi4wLi4KLSAwMGMwIDdmZmY0ZTcxIDQxZmIwODdmIDQxZmIwOTIwIDAwODA0MWZiICAuLk5xQS4uLkEuLiAuLkEuCi0gMDBkMCAwOTIwN2ZmZiA0MWZiMDkzMCAwMDAwODAwMCA0ZTcxNDFmYSAgLiAuLkEuLjAuLi4uTnFBLgotIDAwZTAgODAwMDQxZmIgMDE3MGZmZmYgN2ZmZjRlNzEgNDFmYTdmZmYgIC4uQS4ucC4uLi5OcUEuLi4KLSAwMGYwIDQxZmIwMTcwIDAwMDA4MDAwIDRlNzE0MWZiIDAxNzAoZmZmZnwwMDAwKSAgQS4ucC4uLi5OcUEuLnAuLgotIDAxMDAgKGZmMDR8MDAwMCk0MWZiIDA5MzAoZmZmZnwwMDAwKSAoZmVmY3wwMDAwKTRlNzEgNDFmOTAwMDAgIC4uQS4uMC4uLi5OcUEuLi4KLSAwMTEwIDAwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAuLi4uLi4uLi4uLi4uLi4uCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8Lio+IG5vcAotMCswMDAyIDxsYmxfYj4gbm9wCi0wKzAwMDQgPGxibF9iXCsoMHh8KTI+IG1vdmVtbCAlcGNAXCgwKzAwMDIgPGxibF9iPlwpLCVhMC0lYTEKLTArMDAwYSA8bGJsX2JcKygweHwpOD4gbW92ZW1sICVwY0BcKDArMDAwMiA8bGJsX2I+XCksJWEwLSVhMQotMCswMDEwIDxsYmxfYlwrKDB4fCllPiBtb3ZlbWwgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwLSVhMQotMCswMDE2IDxsYmxfYlwrKDB4fCkxND4gbGVhICVwY0BcKDArMDAwMiA8bGJsX2I+XCksJWEwCi0wKzAwMWEgPGxibF9iXCsoMHh8KTE4PiBsZWEgJXBjQFwoMCswMDAyIDxsYmxfYj5cKSwlYTAKLTArMDAxZSA8bGJsX2JcKygweHwpMWM+IGxlYSAlcGNAXChmK2ZmODIgPC4qPlwpLCVhMAotMCswMDIyIDxsYmxfYlwrKDB4fCkyMD4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDI2IDxsYmxfYlwrKDB4fCkyND4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDJhIDxsYmxfYlwrKDB4fCkyOD4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDJlIDxsYmxfYlwrKDB4fCkyYz4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDM0IDxsYmxfYlwrKDB4fCkzMj4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDNhIDxsYmxfYlwrKDB4fCkzOD4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDQyIDxsYmxfYlwrKDB4fCk0MD4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDRhIDxsYmxfYlwrKDB4fCk0OD4gbm9wCi0wKzAwNGMgPGxibF9iXCsoMHh8KTRhPiBic3JsIDArMDBhNiA8bGJsX2E+Ci0wKzAwNTIgPGxibF9iXCsoMHh8KTUwPiBic3J3IDArMDBhNiA8bGJsX2E+Ci0wKzAwNTYgPGxibF9iXCsoMHh8KTU0PiBic3JzIDArMDBhNiA8bGJsX2E+Ci0wKzAwNTggPGxibF9iXCsoMHh8KTU2PiBic3JzIDArMDBhNiA8bGJsX2E+Ci0wKzAwNWEgPGxibF9iXCsoMHh8KTU4PiBub3AKLTArMDA1YyA8bGJsX2JcKygweHwpNWE+IGxlYSAoMCswMGE2IDxsYmxfYT58MCswIDwuKj4pLCVhMAotCQkJNWU6ICgzMglcLnRleHR8Ul82OEtfMzIJXC50ZXh0XCsweGE2KQotMCswMDYyIDxsYmxfYlwrKDB4fCk2MD4gbGVhICVwY0BcKDArMDBhNiA8bGJsX2E+XCksJWEwCi0wKzAwNjYgPGxibF9iXCsoMHh8KTY0PiBsZWEgJXBjQFwoMCswMTI2IDwuKj5cKSwlYTAKLTArMDA2YSA8bGJsX2JcKygweHwpNjg+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA2ZSA8bGJsX2JcKygweHwpNmM+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA3MiA8bGJsX2JcKygweHwpNzA+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA3NiA8bGJsX2JcKygweHwpNzQ+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA3YyA8bGJsX2JcKygweHwpN2E+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA4MiA8bGJsX2JcKygweHwpODA+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA4YSA8bGJsX2JcKygweHwpODg+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA5MiA8bGJsX2JcKygweHwpOTA+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA5YSA8bGJsX2JcKygweHwpOTg+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDBhMCA8bGJsX2JcKygweHwpOWU+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDBhNCA8bGJsX2JcKygweHwpYTI+IG5vcAotMCswMGE2IDxsYmxfYT4gbm9wCi0wKzAwYTggPGxibF9hXCsoMHh8KTI+IG5vcAotMCswMGFhIDxsYmxfYVwrKDB4fCk0PiBsZWEgJXBjQFwoMCsyYyA8bGJsX2JcKygweHwpMmE+LCVkMDpsXCksJWEwCi0wKzAwYWUgPGxibF9hXCsoMHh8KTg+IGxlYSAlcGNAXCgwKzJmIDxsYmxfYlwrKDB4fCkyZD4sJWQwOmxcKSwlYTAKLTArMDBiNCA8bGJsX2FcKygweHwpZT4gbGVhICVwY0BcKGYrODBiNiA8Lio+LCVkMDpsXCksJWEwCi0wKzAwYmEgPGxibF9hXCsoMHh8KTE0PiBsZWEgJXBjQFwoZis4MGJiIDwuKj4sJWQwOmxcKSwlYTAKLTArMDBjMiA8bGJsX2FcKygweHwpMWM+IG5vcAotMCswMGM0IDxsYmxfYVwrKDB4fCkxZT4gbGVhICVwY0BcKDArMTQ1IDwuKj4sJWQwOmxcKSwlYTAKLTArMDBjOCA8bGJsX2FcKygweHwpMjI+IGxlYSAlcGNAXCgwKzE0YSA8Lio+LCVkMDpsXCksJWEwCi0wKzAwY2UgPGxibF9hXCsoMHh8KTI4PiBsZWEgJXBjQFwoMCs4MGNmIDwuKj4sJWQwOmxcKSwlYTAKLTArMDBkNCA8bGJsX2FcKygweHwpMmU+IGxlYSAlcGNAXCgwKzgwZDYgPC4qPiwlZDA6bFwpLCVhMAotMCswMGRjIDxsYmxfYVwrKDB4fCkzNj4gbm9wCi0wKzAwZGUgPGxibF9hXCsoMHh8KTM4PiBsZWEgJXBjQFwoZis4MGUwIDwuKj5cKSwlYTAKLTArMDBlMiA8bGJsX2FcKygweHwpM2M+IGxlYSAlcGNAXChmKzgwZTMgPC4qPlwpLCVhMAotMCswMGVhIDxsYmxfYVwrKDB4fCk0ND4gbm9wCi0wKzAwZWMgPGxibF9hXCsoMHh8KTQ2PiBsZWEgJXBjQFwoMCs4MGVkIDwuKj5cKSwlYTAKLTArMDBmMCA8bGJsX2FcKygweHwpNGE+IGxlYSAlcGNAXCgwKzgwZjIgPC4qPlwpLCVhMAotMCswMGY4IDxsYmxfYVwrKDB4fCk1Mj4gbm9wCi0wKzAwZmEgPGxibF9hXCsoMHh8KTU0PiBsZWEgJXBjQFwoKDArMCA8Lio+fDArMGZjIDxsYmxfYVwrKDB4fCk1Nj4pXCksJWEwCi0JCQlmZTogKERJU1AzMgl1bmRlZnxSXzY4S19QQzMyCXVuZGVmXCsweDIpCi0wKzAxMDIgPGxibF9hXCsoMHh8KTVjPiBsZWEgJXBjQFwoKDArMCA8Lio+fDArMDEwNCA8bGJsX2FcKygweHwpNWU+KSwlZDA6bFwpLCVhMAotCQkJMTA2OiAoRElTUDMyCXVuZGVmfFJfNjhLX1BDMzIJdW5kZWZcKzB4MikKLTArMDEwYSA8bGJsX2FcKygweHwpNjQ+IG5vcAotMCswMTBjIDxsYmxfYVwrKDB4fCk2Nj4gbGVhIDArMCA8Lio+LCVhMAotCQkJMTBlOiAoUl82OEtfKT8zMgl1bmRlZgotMCswMTEyIDxsYmxfYVwrKDB4fCk2Yz4gbm9wCi0wKzAxMTQgPGxibF9hXCsoMHh8KTZlPiBvcmliICMwLCVkMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzVjMjJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwucworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLQlub3AKLWxibF9iOglub3AKLQltb3ZlbWwJbGJsX2IsJWEwLSVhMQotCW1vdmVtbAklcGNAKGxibF9iKSwlYTAtJWExCi0JbW92ZW1sCSVwY0AobGJsX2IsJWQwKSwlYTAtJWExCi0JbGVhCWxibF9iLCVhMAotCWxlYQklcGNAKGxibF9iKSwlYTAKLQlsZWEJJXBjQChsYmxfYi0xMjgpLCVhMAotCWxlYQklcGNAKGxibF9iLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2I6YiwlZDApLCVhMAotCWxlYQklcGNAKGxibF9iLS4tMjpiLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2I6dywlZDApLCVhMAotCWxlYQklcGNAKGxibF9iLS4tMjp3LCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2I6bCwlZDApLCVhMAotCWxlYQklcGNAKGxibF9iLS4tMjpsLCVkMCksJWEwCi0Jbm9wCi0JYnNybAlsYmxfYQotCWJzcglsYmxfYQotCWJzcnMJbGJsX2EKLQlqYnNyCWxibF9hCi0Jbm9wCi0JbGVhCWxibF9hLCVhMAotCWxlYQklcGNAKGxibF9hKSwlYTAKLQlsZWEJJXBjQChsYmxfYSsxMjgpLCVhMAotCWxlYQklcGNAKGxibF9hLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2E6YiwlZDApLCVhMAotCWxlYQklcGNAKGxibF9hLS4tMjpiLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2E6dywlZDApLCVhMAotCWxlYQklcGNAKGxibF9hLS4tMjp3LCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2E6bCwlZDApLCVhMAotCWxlYQklcGNAKGxibF9hLS4tMjpsLCVkMCksJWEwCi0JbGVhCSVwY0AoMTg6bCwlZDApLCVhMAotCWxlYQklcGNAKDEwOncsJWQwKSwlYTAKLQlsZWEJJXBjQCg0OmIsJWQwKSwlYTAKLQlub3AKLWxibF9hOglub3AKLQlub3AKLQlsZWEJJXBjQCguLTEyNiwlZDApLCVhMAotCWxlYQklcGNAKC4tMTI3LCVkMCksJWEwCi0JbGVhCSVwY0AoLi0zMjc2NiwlZDApLCVhMAotCWxlYQklcGNAKC4tMzI3NjcsJWQwKSwlYTAKLQlub3AKLQlsZWEJJXBjQCguKzEyOSwlZDApLCVhMAotCWxlYQklcGNAKC4rMTMwLCVkMCksJWEwCi0JbGVhCSVwY0AoLiszMjc2OSwlZDApLCVhMAotCWxlYQklcGNAKC4rMzI3NzAsJWQwKSwlYTAKLQlub3AKLQlsZWEJJXBjQCguLTMyNzY2KSwlYTAKLQlsZWEJJXBjQCguLTMyNzY3KSwlYTAKLQlub3AKLQlsZWEJJXBjQCguKzMyNzY5KSwlYTAKLQlsZWEJJXBjQCguKzMyNzcwKSwlYTAKLQlub3AKLQlsZWEJJXBjQCh1bmRlZiksJWEwCi0JbGVhCSVwY0AodW5kZWYsJWQwKSwlYTAKLQlub3AKLQlsZWEJdW5kZWYsJWEwCi0Jbm9wCi0JLmxvbmcgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9waWMxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BpYzEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ODc3NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BpYzEucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JsIF9mb28KLV9mb286Ci0JbGVhbCAlcGNAKF9pKSwgJWEwCi0JbGVhbCAlcGNAKF9pLS4pLCAlYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxMDljOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNQUk9HOiBubQotI25hbWU6IHByZXNlbmNlIG9mIHNlY3Rpb24gc3ltYm9scwotCi0wMDAwMDAxMiBiIC5ic3MKLTAwMDAwMDBlIGQgLmRhdGEKLTAwMDAwMDAwIHQgLnRleHQKLTAwMDAwMDBlIGQgbG9vcDEKLTAwMDAwMDAwIHQgbG9vcDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3MWU4Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkudGV4dAotbG9vcDI6CQotCW1vdmUubAklZDEsJWEwQCsKLQlkYmYJJWQwLGxvb3AxCi0JLmRhdGEKLWxvb3AxOglicmEJbG9vcDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDkyNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogcGFkZGluZyBvZiAuaW5pdCBzZWN0aW9uCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLmluaXQ6Ci0wMDAwMDAwMCA8LmluaXQ+IHN1YnUgICAgICAgIHIzMSxyMzEsMHgxMAotMDAwMDAwMDQgPC5pbml0XCsweDQ+IHN0ICAgICAgICAgIHIxMyxyMzEsMHgyMAotMDAwMDAwMDggPC5pbml0XCsweDg+IG9yICAgICAgICAgIHIwLHIwLHIwCi0wMDAwMDAwYyA8LmluaXRcKzB4Yz4gb3IgICAgICAgICAgcjAscjAscjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NjgxY2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTsgVGVzdCBwcm9wZXIgcGFkZGluZyBvZiB0aGUgLmluaXQgc2VjdGlvbgotCXNlY3Rpb24JIC5pbml0LCJ4IgotCWFsaWduCSA0Ci0Jc3VidQkgcjMxLHIzMSwxNgotCXN0CSByMTMscjMxLDMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL204OGsuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9tODhrLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwN2MxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL204OGsuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBUZXN0cyBmb3IgbTg4ayBzdnIzIHRhcmdldHMKLSMKLWlmIHsgW2lzdGFyZ2V0IG04OCotKi1zeXN2M10gfHwgW2lzdGFyZ2V0IG04OCotKi1jb2ZmKiBdIH0gdGhlbiB7Ci0gICAgc2V0IHRlc3RuYW1lICJQcm9wZXIgcGFkZGluZyBvZiAuaW5pdCBzZWN0aW9uIgotICAgIHJ1bl9kdW1wX3Rlc3QgaW5pdAotfQotaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgdW5zZXQgZXJyb3JJbmZvCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvZXJyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvZXJyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTc2MzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2Vyci5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLm1hY3JvCW0KLQltCi0JLmVuZG0KLQotCW0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkN2JjZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiBtYWNybyBpcnAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKLTArMDRbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzIKLTArMDhbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzMKLTArMGNbIAldK1thLXpBLVowLTlfXStbIAldK2JhcjEKLTArMTBbIAldK1thLXpBLVowLTlfXStbIAldK2JhcjIKLTArMTRbIAldK1thLXpBLVowLTlfXStbIAldK2JhcjMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM3ZGQ1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaXJwCXBhcmFtLDEsMiwzCi0JLmxvbmcJZm9vXHBhcmFtCi0JLmVuZHIKLQotCS5pcnBjCXBhcmFtLDEyMwotCS5sb25nCWJhclxwYXJhbQotCS5lbmRyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9tYWNyb3MuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWU0ODUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIFJ1biBzb21lIHRlc3RzIG9mIGdhcyBtYWNyb3MuCi0KLWlmICFbaXN0YXJnZXQgaHBwYSotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCB0ZXN0MQotfQotCi1ydW5fZHVtcF90ZXN0IHRlc3QyCi0KLXJ1bl9kdW1wX3Rlc3QgdGVzdDMKLQotcnVuX2R1bXBfdGVzdCBpcnAKLQotcnVuX2R1bXBfdGVzdCByZXB0Ci0KLWdhc190ZXN0X2Vycm9yICJlcnIucyIgIiIgIm1hY3JvIGluZmluaXRlIHJlY3Vyc2lvbiIKLQotY2FzZSAkdGFyZ2V0X3RyaXBsZXQgaW4gewotICAgIHsgaHBwYSotKi0qIH0geyB9Ci0gICAgZGVmYXVsdCB7Ci0JcnVuX2R1bXBfdGVzdCBzZW1pCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjJkNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIHJlcHQKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKLTArMDRbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKLTArMDhbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFiNmY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQkucmVwdAkzCi0JLmxvbmcJZm9vMQotCS5lbmRyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4OWU3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNuYW1lOiBzZW1pCi0KLS4qOiAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgM2IyMDNiMjAgM2EyMDNhMjAgMDAwMDAwMDAgMDAwMDAwMDAgIDsgOyA6IDogLi4uLi4uLi4KLSAwMDEwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlMDk2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotICAgICAgICAubWFjcm8gc2VtaWNvbG9uCi0gICAgICAgIC5hc2NpaSAiOyAiCi0gICAgICAgIC5lbmRtCi0KLSAgICAgICAgLm1hY3JvIGNvbG9uCi0gICAgICAgIC5hc2NpaSAiOiAiCi0gICAgICAgIC5lbmRtCi0KLSAgICAgICAgc2VtaWNvbG9uCi0gICAgICAgIC5hc2NpaSAiOyAiCi0gICAgICAgIGNvbG9uCi0gICAgICAgIC5hc2NpaSAiOiAiCi0KLQkucDJhbGlnbiA1LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NGIzZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLmQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IG1hY3JvIHRlc3QgMQotCi0wKzAxIEEgczEKLTArMDIgQSBzMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4YjdjZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5tYWNybwltIGFyZzEgYXJnMgotCS5nbG9ibAlcYXJnMQotCVxhcmcxID0gXGFyZzIKLQkuZW5kbQotCi0JbSBzMSwxCi0JbSBzMiwyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTdkNDE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogbWFjcm8gdGVzdCAyCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAuKgotT0ZGU0VUWyAJXStUWVBFWyAJXStWQUxVRS4qCi0wKzAwWyAJXStbYS16QS1aMC05X10rWyAJXStmb28xCi0wKzA0WyAJXStbYS16QS1aMC05X10rWyAJXStmb28yCi0wKzA4WyAJXStbYS16QS1aMC05X10rWyAJXStmb28zCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFiMDExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0JLm1hY3JvCW0gYXJnMSBhcmcyIGFyZzMKLQkubG9uZwlcYXJnMQotCS5pZmMJLFxhcmcyXGFyZzMKLQkuRUxTRQotCW0JXGFyZzIsXGFyZzMKLQkuZW5kaWYKLQkuZW5kbQotCi0JbQlmb28xLGZvbzIsZm9vMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MGFkNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogbWFjcm8gdGVzdCAzCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAuKgotT0ZGU0VUWyAJXStUWVBFWyAJXStWQUxVRS4qCi0wKzAwWyAJXStbYS16QS1aMC05X10rWyAJXStmb28xCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODBhYTIwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLm1hY3JvCW0gYXJnMSBhcmcyCi0JXGFyZzEKLQkuZXhpdG0KLQlcYXJnMgotCS5lbmRtCi0KLQltCSIubG9uZyBmb28xIiwuZ2FyYmFnZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRjZWRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZAorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogYWxsaW5zbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxhYnM+OgotICAgMDoJMDFlMCAgICAgIAlhYnMJcjAKLQotMCswMDIgPGFkZGM+OgotICAgMjoJMDYyMSAgICAgIAlhZGRjCXIxLCByMgotCi0wKzAwNCA8YWRkaT46Ci0gICA0OgkyMDAzICAgICAgCWFkZGkJcjMsIDEKLQotMCswMDYgPGFkZHU+OgotICAgNjoJMWM1NCAgICAgIAlhZGR1CXI0LCByNQotCi0wKzAwOCA8YW5kPjoKLSAgIDg6CTE2NzYgICAgICAJYW5kCXI2LCByNwotCi0wKzAwYSA8YW5kaT46Ci0gICBhOgkyZTI4ICAgICAgCWFuZGkJcjgsIDIKLQotMCswMGMgPGFuZG4+OgotICAgYzoJMWZhOSAgICAgIAlhbmRuCXI5LCByMTAKLQotMCswMGUgPGFzcj46Ci0gICBlOgkxYWNiICAgICAgCWFzcglyMTEsIHIxMgotCi0wKzAxMCA8YXNyYz46Ci0gIDEwOgkzYTBkICAgICAgCWFzcmMJcjEzCi0KLTArMDEyIDxhc3JpPjoKLSAgMTI6CTNiZmUgICAgICAJYXNyaQlyMTQsIDMxCi0KLTArMDE0IDxiY2xyaT46Ci0gIDE0OgkzMDBmICAgICAgCWJjbHJpCXIxNSwgMAotCi0wKzAxNiA8YmY+OgotICAxNjoJZWZmNCAgICAgIAliZgkweDAKLQotMCswMTggPGJnZW5pPjoKLSAgMTg6CTMyNzAgICAgICAJYmdlbmkJcjAsIDcKLQotMCswMWEgPEJHRU5JPjoKLSAgMWE6CTMyODAgICAgICAJYmdlbmkJcjAsIDgKLQotMCswMWMgPEJHRU5pPjoKLSAgMWM6CTMzZjAgICAgICAJYmdlbmkJcjAsIDMxCi0KLTArMDFlIDxiZ2Vucj46Ci0gIDFlOgkxMzIxICAgICAgCWJnZW5yCXIxLCByMgotCi0wKzAyMCA8YmtwdD46Ci0JLi4uCi0KLTArMDIyIDxibWFza2k+OgotICAyMjoJMmM4MyAgICAgIAlibWFza2kJcjMsIDgKLQotMCswMjQgPEJNQVNLST46Ci0gIDI0OgkyZGYzICAgICAgCWJtYXNraQlyMywgMzEKLQotMCswMjYgPGJyPjoKLSAgMjY6CWY3ZmYgICAgICAJYnIJMHgyNgotCi0wKzAyOCA8YnJldj46Ci0gIDI4OgkwMGY0ICAgICAgCWJyZXYJcjQKLQotMCswMmEgPGJzZXRpPjoKLSAgMmE6CTM1ZTUgICAgICAJYnNldGkJcjUsIDMwCi0KLTArMDJjIDxic3I+OgotICAyYzoJZmZlOSAgICAgIAlic3IJMHgwCi0KLTArMDJlIDxidD46Ci0gIDJlOgllN2U4ICAgICAgCWJ0CTB4MAotCi0wKzAzMCA8YnRzdGk+OgotICAzMDoJMzdiNiAgICAgIAlidHN0aQlyNiwgMjcKLQotMCswMzIgPGNscmM+OgotICAzMjoJMGYwMCAgICAgIAljbXBuZQlyMCwgcjAKLQotMCswMzQgPGNscmY+OgotICAzNDoJMDFkNyAgICAgIAljbHJmCXI3Ci0KLTArMDM2IDxjbHJ0PjoKLSAgMzY6CTAxYzggICAgICAJY2xydAlyOAotCi0wKzAzOCA8Y21waHM+OgotICAzODoJMGNhOSAgICAgIAljbXBocwlyOSwgcjEwCi0KLTArMDNhIDxjbXBsdD46Ci0gIDNhOgkwZGNiICAgICAgCWNtcGx0CXIxMSwgcjEyCi0KLTArMDNjIDxjbXBsZWk+OgotICAzYzoJMjJlYiAgICAgIAljbXBsdGkJcjExLCAxNQotCi0wKzAzZSA8Y21wbHRpPjoKLSAgM2U6CTIzZmQgICAgICAJY21wbHRpCXIxMywgMzIKLQotMCswNDAgPGNtcG5lPjoKLSAgNDA6CTBmZmUgICAgICAJY21wbmUJcjE0LCByMTUKLQotMCswNDIgPGNtcG5laT46Ci0gIDQyOgkyYTAwICAgICAgCWNtcG5laQlyMCwgMAotCi0wKzA0NCA8ZGVjZj46Ci0gIDQ0OgkwMDkxICAgICAgCWRlY2YJcjEKLQotMCswNDYgPGRlY2d0PjoKLSAgNDY6CTAxYTIgICAgICAJZGVjZ3QJcjIKLQotMCswNDggPGRlY2x0PjoKLSAgNDg6CTAxODMgICAgICAJZGVjbHQJcjMKLQotMCswNGEgPGRlY25lPjoKLSAgNGE6CTAxYjQgICAgICAJZGVjbmUJcjQKLQotMCswNGMgPGRlY3Q+OgotICA0YzoJMDA4NSAgICAgIAlkZWN0CXI1Ci0KLTArMDRlIDxkaXZzPjoKLSAgNGU6CTMyMTYgICAgICAJZGl2cwlyNiwgcjEKLQotMCswNTAgPGRpdnU+OgotICA1MDoJMmMxOCAgICAgIAlkaXZ1CXI4LCByMQotCi0wKzA1MiA8ZG96ZT46Ci0gIDUyOgkwMDA2ICAgICAgCWRvemUKLQotMCswNTQgPGZmMT46Ci0gIDU0OgkwMGVhICAgICAgCWZmMQlyMTAKLQotMCswNTYgPGluY2Y+OgotICA1NjoJMDBiYiAgICAgIAlpbmNmCXIxMQotCi0wKzA1OCA8aW5jdD46Ci0gIDU4OgkwMGFjICAgICAgCWluY3QJcjEyCi0KLTArMDVhIDxpeGg+OgotICA1YToJMWRlZCAgICAgIAlpeGgJcjEzLCByMTQKLQotMCswNWMgPGl4dz46Ci0gIDVjOgkxNTBmICAgICAgCWl4dwlyMTUsIHIwCi0KLTArMDVlIDxqYmY+OgotICA1ZToJZWZkMCAgICAgIAliZgkweDAKLQotMCswNjAgPGpicj46Ci0gIDYwOglmMDBlICAgICAgCWJyCTB4N2UKLQotMCswNjIgPGpic3I+OgotICA2MjoJN2YwYSAgICAgIAlqc3JpCTB4LioKLQotMCswNjQgPGpidD46Ci0gIDY0OgllMDBjICAgICAgCWJ0CTB4N2UKLQotMCswNjYgPGptcD46Ci0gIDY2OgkwMGMxICAgICAgCWptcAlyMQotCi0wKzA2OCA8am1waT46Ci0gIDY4Ogk3MDA5ICAgICAgCWptcGkJMHguKgotCi0wKzA2YSA8anNyPjoKLSAgNmE6CTAwZDIgICAgICAJanNyCXIyCi0KLTArMDZjIDxqc3JpPjoKLSAgNmM6CTdmMDggICAgICAJanNyaQkweC4qCi0KLTArMDZlIDxsZC5iPjoKLSAgNmU6CWEzMDQgICAgICAJbGRiCXIzLCBcKHI0LCAwXCkKLQotMCswNzAgPGxkLmg+OgotICA3MDoJYzUxNiAgICAgIAlsZGgJcjUsIFwocjYsIDJcKQotCi0wKzA3MiA8bGQudz46Ci0gIDcyOgk4NzE4ICAgICAgCWxkCXI3LCBcKHI4LCA0XCkKLQotMCswNzQgPGxkYj46Ci0gIDc0OglhOWZhICAgICAgCWxkYglyOSwgXChyMTAsIDE1XCkKLQotMCswNzYgPGxkaD46Ci0gIDc2OgljYmZjICAgICAgCWxkaAlyMTEsIFwocjEyLCAzMFwpCi0KLTArMDc4IDxsZD46Ci0gIDc4Ogk4ZDVlICAgICAgCWxkCXIxMywgXChyMTQsIDIwXCkKLQotMCswN2EgPGxkdz46Ci0gIDdhOgk4ZGZlICAgICAgCWxkCXIxMywgXChyMTQsIDYwXCkKLQotMCswN2MgPGxkbT46Ci0gIDdjOgkwMDYyICAgICAgCWxkbQlyMi1yMTUsIFwocjBcKQotCi0wKzA3ZSA8Zm9vbG9vcD46Ci0gIDdlOgkwMDQxICAgICAgCWxkcQlyNC1yNywgXChyMVwpCi0KLTArMDgwIDxsb29wdD46Ci0gIDgwOgkwNDhlICAgICAgCWxvb3B0CXI4LCAweDY0Ci0KLTArMDgyIDxMUlc+OgotICA4MjoJNzkwMyAgICAgIAlscncJcjksIDB4LioKLQotMCswODQgPGxydz46Ci0gIDg0Ogk3OTA0ICAgICAgCWxydwlyOSwgMHg0MzIxCi0KLTArMDg2IDxmb29saXQ+OgotICA4NjoJMTIzNCAgICAgIAltb3YJcjQsIHIzCi0KLTArMDg4IDxsc2w+OgotICA4ODoJMWJiYSAgICAgIAlsc2wJcjEwLCByMTEKLQotMCswOGEgPGxzbGM+OgotICA4YToJM2MwYyAgICAgIAlsc2xjCXIxMgotCi0JLi4uCi0JCQk4YzogQUREUjMyCS50ZXh0Ci0JCQk5MDogQUREUjMyCS50ZXh0LioKLSAgOTQ6CTAwMDAgICAgICAJYmtwdAotICA5NjoJNDMyMSAgICAgIAkuc2hvcnQgMHg0MzIxCi0KLTArMDk4IDxsc2xpPjoKLSAgOTg6CTNkZmQgICAgICAJbHNsaQlyMTMsIDMxCi0KLTArMDlhIDxsc3I+OgotICA5YToJMGJmZSAgICAgIAlsc3IJcjE0LCByMTUKLQotMCswOWMgPGxzcmM+OgotICA5YzoJM2UwMCAgICAgIAlsc3JjCXIwCi0KLTArMDllIDxsc3JpPjoKLSAgOWU6CTNlMTEgICAgICAJbHNyaQlyMSwgMQotCi0wKzBhMCA8bWNscmk+OgotICBhMDoJMzA2NCAgICAgIAliY2xyaQlyNCwgNgotCi0wKzBhMiA8bWZjcj46Ci0gIGEyOgkxMDAyICAgICAgCW1mY3IJcjIsIHBzcgotCi0wKzBhNCA8bW92PjoKLSAgYTQ6CTEyNDMgICAgICAJbW92CXIzLCByNAotCi0wKzBhNiA8bW92Zj46Ci0gIGE2OgkwYTY1ICAgICAgCW1vdmYJcjUsIHI2Ci0KLTArMGE4IDxtb3ZpPjoKLSAgYTg6CTY3ZjcgICAgICAJbW92aQlyNywgMTI3Ci0KLTArMGFhIDxtb3Z0PjoKLSAgYWE6CTAyOTggICAgICAJbW92dAlyOCwgcjkKLQotMCswYWMgPG10Y3I+OgotICBhYzoJMTgwYSAgICAgIAltdGNyCXIxMCwgcHNyCi0KLTArMGFlIDxtdWx0PjoKLSAgYWU6CTAzY2IgICAgICAJbXVsdAlyMTEsIHIxMgotCi0wKzBiMCA8bXZjPjoKLSAgYjA6CTAwMmQgICAgICAJbXZjCXIxMwotCi0wKzBiMiA8bXZjdj46Ci0gIGIyOgkwMDNlICAgICAgCW12Y3YJcjE0Ci0KLTArMGI0IDxuZWc+OgotICBiNDoJMjgwMiAgICAgIAlyc3ViaQlyMiwgMAotCi0wKzBiNiA8bm90PjoKLSAgYjY6CTAxZmYgICAgICAJbm90CXIxNQotCi0wKzBiOCA8b3I+OgotICBiODoJMWUxMCAgICAgIAlvcglyMCwgcjEKLQotMCswYmEgPHJmaT46Ci0gIGJhOgkwMDAzICAgICAgCXJmaQotCi0wKzBiYyA8cm9sYz46Ci0gIGJjOgkwNjY2ICAgICAgCWFkZGMJcjYsIHI2Ci0KLTArMGJlIDxyb3JpPjoKLSAgYmU6CTM5YTkgICAgICAJcm90bGkJcjksIDI2Ci0KLTArMGMwIDxyb3RsYz46Ci0gIGMwOgkwNjY2ICAgICAgCWFkZGMJcjYsIHI2Ci0KLTArMGMyIDxyb3RsaT46Ci0gIGMyOgkzOGEyICAgICAgCXJvdGxpCXIyLCAxMAotCi0wKzBjNCA8cm90cmk+OgotICBjNDoJMzlhOSAgICAgIAlyb3RsaQlyOSwgMjYKLQotMCswYzYgPHJzdWI+OgotICBjNjoJMTQ0MyAgICAgIAlyc3ViCXIzLCByNAotCi0wKzBjOCA8cnN1Ymk+OgotICBjODoJMjgwNSAgICAgIAlyc3ViaQlyNSwgMAotCi0wKzBjYSA8cnRlPjoKLSAgY2E6CTAwMDIgICAgICAJcnRlCi0KLTArMGNjIDxydHM+OgotICBjYzoJMDBjZiAgICAgIAlqbXAJcjE1Ci0KLTArMGNlIDxzZXRjPjoKLSAgY2U6CTBjMDAgICAgICAJY21waHMJcjAsIHIwCi0KLTArMGQwIDxzZXh0Yj46Ci0gIGQwOgkwMTU2ICAgICAgCXNleHRiCXI2Ci0KLTArMGQyIDxzZXh0aD46Ci0gIGQyOgkwMTc3ICAgICAgCXNleHRoCXI3Ci0KLTArMGQ0IDxzdC5iPjoKLSAgZDQ6CWI4MDkgICAgICAJc3RiCXI4LCBcKHI5LCAwXCkKLQotMCswZDYgPHN0Lmg+OgotICBkNjoJZGExYiAgICAgIAlzdGgJcjEwLCBcKHIxMSwgMlwpCi0KLTArMGQ4IDxzdC53PjoKLSAgZDg6CTljMWQgICAgICAJc3QJcjEyLCBcKHIxMywgNFwpCi0KLTArMGRhIDxzdGI+OgotICBkYToJYmVmZiAgICAgIAlzdGIJcjE0LCBcKHIxNSwgMTVcKQotCi0wKzBkYyA8c3RoPjoKLSAgZGM6CWQwZjEgICAgICAJc3RoCXIwLCBcKHIxLCAzMFwpCi0KLTArMGRlIDxzdHc+OgotICBkZToJOTJmMyAgICAgIAlzdAlyMiwgXChyMywgNjBcKQotCi0wKzBlMCA8c3Q+OgotICBlMDoJOTQwNSAgICAgIAlzdAlyNCwgXChyNSwgMFwpCi0KLTArMGUyIDxzdG0+OgotICBlMjoJMDA3ZSAgICAgIAlzdG0JcjE0LXIxNSwgXChyMFwpCi0KLTArMGU0IDxzdG9wPjoKLSAgZTQ6CTAwMDQgICAgICAJc3RvcAotCi0wKzBlNiA8c3RxPjoKLSAgZTY6CTAwNTEgICAgICAJc3RxCXI0LXI3LCBcKHIxXCkKLQotMCswZTggPHN1YmM+OgotICBlODoJMDdkNyAgICAgIAlzdWJjCXI3LCByMTMKLQotMCswZWEgPHN1Ymk+OgotICBlYToJMjVmZSAgICAgIAlzdWJpCXIxNCwgMzIKLQotMCswZWMgPHN1YnU+OgotICBlYzoJMDUzOSAgICAgIAlzdWJ1CXI5LCByMwotCi0wKzBlZSA8c3luYz46Ci0gIGVlOgkwMDAxICAgICAgCXN5bmMKLQotMCswZjAgPHRzdGx0PjoKLSAgZjA6CTM3ZjUgICAgICAJYnRzdGkJcjUsIDMxCi0KLTArMGYyIDx0c3RuZT46Ci0gIGYyOgkyYTA3ICAgICAgCWNtcG5laQlyNywgMAotCi0wKzBmNCA8dHJhcD46Ci0gIGY0OgkwMDBhICAgICAgCXRyYXAJMgotCi0wKzBmNiA8dHN0PjoKLSAgZjY6CTBlZWUgICAgICAJdHN0CXIxNCwgcjE0Ci0KLTArMGY4IDx0c3RuYno+OgotICBmODoJMDE5MiAgICAgIAl0c3RuYnoJcjIKLQotMCswZmEgPHdhaXQ+OgotICBmYToJMDAwNSAgICAgIAl3YWl0Ci0KLTArMGZjIDx4b3I+OgotICBmYzoJMTcwZiAgICAgIAl4b3IJcjE1LCByMAotCi0wKzBmZSA8eHNyPjoKLSAgZmU6CTM4MGIgICAgICAJeHNyCXIxMQotCi0wKzAxMDAgPHh0cmIwPjoKLSAxMDA6CTAxMzEgICAgICAJeHRyYjAJcjEsIHIxCi0KLTArMDEwMiA8eHRyYjE+OgotIDEwMjoJMDEyMiAgICAgIAl4dHJiMQlyMSwgcjIKLQotMCswMTA0IDx4dHJiMj46Ci0gMTA0OgkwMTEwICAgICAgCXh0cmIyCXIxLCByMAotCi0wKzAxMDYgPHh0cmIzPjoKLSAxMDY6CTAxMGQgICAgICAJeHRyYjMJcjEsIHIxMwotCi0wKzAxMDggPHpleHRiPjoKLSAxMDg6CTAxNDggICAgICAJemV4dGIJcjgKLQotMCswMTBhIDx6ZXh0aD46Ci0gMTBhOgkwMTY0ICAgICAgCXpleHRoCXI0Ci0gMTBjOgkwZjAwICAgICAgCWNtcG5lCXIwLCByMAotIDEwZToJMGYwMCAgICAgIAljbXBuZQlyMCwgcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTc4NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgTSpDb3JlIGFzc2VtYmxlciB0ZXN0c3VpdGUuCi0KLWlmIFtpc3RhcmdldCBtY29yZS0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhbGxpbnNuIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA2ODQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24ucworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0gLmRhdGEKLWZvb2RhdGE6IC53b3JkIDQyCi0JIC50ZXh0Ci1mb290ZXh0OgotCi0ubWFjcm8gdGVzdCBpbnNuIHRleHQ9IiIKLQkuZXhwb3J0IFxpbnNuCi1caW5zbjoKLQlcaW5zbiBcdGV4dAotLmVuZG0KLQotCXRlc3QgYWJzICAgcjAJCQotCXRlc3QgYWRkYyAgInIxLHIyIgkvLyBBIGRvdWJsZSBmb3J3YXJkIHNsYXNoIHN0YXJ0cyBhIGxpbmUgY29tbWVudAotCXRlc3QgYWRkaSAgInIzLCAxIgkjIFNvIGRvZXMgYSBoYXNoCi0JdGVzdCBhZGR1ICAicjQsIHI1IgkvLyBXaGl0ZSBzcGFjZSBiZXR3ZWVuIG9wZXJhbmRzIHNob3VsZCBiZSBpZ25vcmVkCi0JdGVzdCBhbmQgICAicjYscjciICAgOwl0ZXN0IGFuZGkgICJyOCwjMiIgLy8gQSBzZW1pY29sb24gc2VwZXJhdGVzIHN0YXRlbWVudHMKLQl0ZXN0IGFuZG4gICJyOSwgcjEwIgotCXRlc3QgYXNyICAgInIxMSwgUjEyIgkvLyBVcHBlcmNhc2UgUiBpcyBhbGxvd2VkIGFzIGEgcmVnaXN0ZXIgcHJlZml4Ci0JdGVzdCBhc3JjICAicjEzIgotCXRlc3QgYXNyaSAgInIxNCwjMHgxZiIKLQl0ZXN0IGJjbHJpICJyMTUsMCIKLQl0ZXN0IGJmICAgIGZvb3RleHQKLQl0ZXN0IGJnZW5pICJzcCwgNyIJLy8gcjAgY2FuIGFsc28gYmUgcmVmZXJlZCB0byBhcyAnc3AnCi0JdGVzdCBCR0VOSSAicjAsIDgiCS8vIE9mZmljaWFsbHkgdXBwZXIgY2FzZSBvciBtaXhlZCBjYXNlCi0JdGVzdCBCR0VOaSAicjAsIDMxIgkvLyBtbmVtb25pY3Mgc2hvdWxkIG5vdCBiZSBhbGxvd2VkLCBidXQgd2UgcmVsYXggdGhpcy4uLgotCXRlc3QgYmdlbnIgInIxLCByMiIKLQl0ZXN0IGJrcHQKLQl0ZXN0IGJtYXNraSAicjMsIzgiCi0JdGVzdCBCTUFTS0kgInIzLDB4MWYiCi0JdGVzdCBiciAgICAgLiAgLy8gRG90IG1lYW5zIHRoZSBjdXJyZW50IGFkZHJlc3MKLQl0ZXN0IGJyZXYgICByNAotCXRlc3QgYnNldGkgICJyNSwzMCIKLQl0ZXN0IGJzciAgICBmb290ZXh0Ci0JdGVzdCBidCAgICAgZm9vdGV4dAotCXRlc3QgYnRzdGkgICJyNiwgMjciCi0JdGVzdCBjbHJjICAgCi0JdGVzdCBjbHJmICAgcjcKLQl0ZXN0IGNscnQgICByOAotCXRlc3QgY21waHMgICJyOSxyMTAiCi0JdGVzdCBjbXBsdCAgInIxMSxyMTIiIAotCXRlc3QgY21wbGVpICJyMTEsIDE0IiAKLQl0ZXN0IGNtcGx0aSAicjEzLDMyIgotCXRlc3QgY21wbmUgICJyMTQsIHIxNSIKLQl0ZXN0IGNtcG5laSAicjAsMCIKLQl0ZXN0IGRlY2YgICByMQotCXRlc3QgZGVjZ3QgIHIyCi0JdGVzdCBkZWNsdCAgcjMKLQl0ZXN0IGRlY25lICByNAotCXRlc3QgZGVjdCAgIHI1Ci0JdGVzdCBkaXZzICAgInI2LHIxIgotCXRlc3QgZGl2dSAgICJyOCwgcjEiCi0JdGVzdCBkb3plCi0JdGVzdCBmZjEgICAgcjEwCi0JdGVzdCBpbmNmICAgcjExCi0JdGVzdCBpbmN0ICAgcjEyCi0JdGVzdCBpeGggICAgInIxMyxyMTQiCi0JdGVzdCBpeHcgICAgInIxNSxyMCIKLQl0ZXN0IGpiZiAgICBmb290ZXh0Ci0JdGVzdCBqYnIgICAgZm9vbG9vcAotCXRlc3QgamJzciAgIGZvb3RleHQKLQl0ZXN0IGpidCAgICBmb29sb29wCi0JdGVzdCBqbXAgICAgcjEKLQl0ZXN0IGptcGkgICBmb290ZXh0IAotCXRlc3QganNyICAgIHIyCi0JdGVzdCBqc3JpICAgZm9vdGV4dAotCXRlc3QgbGQuYiAgICJyMywocjQsMCkiCi0JdGVzdCBsZC5oICAgInI1ICwgKCByNiwgIzIpIgotCXRlc3QgbGQudyAgICJyNywgKHI4LCAweDQpIgotCXRlc3QgbGRiICAgICJyOSwocjEwLCMweGYpIgotCXRlc3QgbGRoICAgICJyMTEsIChyMTIsIDMwKSIKLQl0ZXN0IGxkICAgICAicjEzLCAocjE0LCAyMCkiCi0JdGVzdCBsZHcgICAgInIxMywgKHIxNCwgNjApIgotCXRlc3QgbGRtICAgICJyMi1yMTUsKHIwKSIKLQkuZXhwb3J0IGZvb2xvb3AKLWZvb2xvb3A6CQkKLQl0ZXN0IGxkcSAgICAicjQtcjcsKHIxKSIKLQl0ZXN0IGxvb3B0ICAicjgsIGZvb2xvb3AiCi0JdGVzdCBMUlcgICAgInI5LCBbZm9vbGl0XSIKLQl0ZXN0IGxydyAgICAicjksIDB4NDMyMSIgICAJLy8gUEMgcmVsIGluZGlyZWN0Ci0JLmdsb2JhbCBmb29saXQKLWZvb2xpdDoKLQkud29yZCAweDEyMzQKLQl0ZXN0IGxzbCAgICAicjEwLHIxMSIKLQl0ZXN0IGxzbGMgICByMTIKLQkubGl0ZXJhbHMJCQkvLyBEdW1wIGxpdGVyYWxzIHRhYmxlCQotCXRlc3QgbHNsaSAgICJyMTMsMzEiCi0JdGVzdCBsc3IgICAgInIxNCxyMTUiCi0JdGVzdCBsc3JjICAgcjAKLQl0ZXN0IGxzcmkgICAicjEsMSIKLQl0ZXN0IG1jbHJpICAicjQsIDY0IgotCXRlc3QgbWZjciAgICJyMiwgY3IwIgotCXRlc3QgbW92ICAgICJyMyxyNCIKLQl0ZXN0IG1vdmYgICAicjUsIHI2IgotCXRlc3QgbW92aSAgICJyNywgMTI3IgotCXRlc3QgbW92dCAgICJyOCwgcjkiCi0JdGVzdCBtdGNyICAgInIxMCwgcHNyIgotCXRlc3QgbXVsdCAgICJyMTEsIHIxMiIKLQl0ZXN0IG12YyAgICByMTMKLQl0ZXN0IG12Y3YgICByMTQKLQl0ZXN0IG5lZyAgICByMgotCXRlc3Qgbm90ICAgIHIxNQotCXRlc3Qgb3IgICAgICJyMCxyMSIKLQl0ZXN0IHJmaQotCXRlc3Qgcm9sYyAgICJyNiwgMSIKLQl0ZXN0IHJvcmkgICAicjksIDYiCi0JdGVzdCByb3RsYyAgInI2LCAxIgotCXRlc3Qgcm90bGkgICJyMiwgIzEwIgotCXRlc3Qgcm90cmkgICJyOSwgNiIKLQl0ZXN0IHJzdWIgICAicjMsIHI0IgotCXRlc3QgcnN1YmkgICJyNSwgMHgwIgotCXRlc3QgcnRlCi0JdGVzdCBydHMKLQl0ZXN0IHNldGMKLQl0ZXN0IHNleHRiICByNgotCXRlc3Qgc2V4dGggIHI3Ci0JdGVzdCBzdC5iICAgInI4LCAocjksIDApIgotCXRlc3Qgc3QuaCAgICJyMTAsIChyMTEsIDIpIgotCXRlc3Qgc3QudyAgICJyMTIsIChyMTMsIDQpIgotCXRlc3Qgc3RiICAgICJyMTQsIChyMTUsIDE1KSIJCi0JdGVzdCBzdGggICAgInIwLCAocjEsIDMwKSIKLQl0ZXN0IHN0dyAgICAicjIsIChyMywgMHgzYykiCi0JdGVzdCBzdCAgICAgInI0LCAocjUsIDApIgotCXRlc3Qgc3RtICAgICJyMTQgLSByMTUgLCAocjApIgotCXRlc3Qgc3RvcAotCXRlc3Qgc3RxICAgICJyNCAtIHI3ICwgKHIxKSIKLQl0ZXN0IHN1YmMgICAicjcsIHIxMyIKLQl0ZXN0IHN1YmkgICAicjE0LCAzMiIKLQl0ZXN0IHN1YnUgICAicjksIHIzIgotCXRlc3Qgc3luYwotCXRlc3QgdHN0bHQgIHI1Ci0JdGVzdCB0c3RuZSAgcjcKLQl0ZXN0IHRyYXAgICAyCi0JdGVzdCB0c3QgICAgInIxNCwgcjE0IgotCXRlc3QgdHN0bmJ6IHIyCi0JdGVzdCB3YWl0Ci0JdGVzdCB4b3IgICAgInIxNSxyMCIKLQl0ZXN0IHhzciAgICByMTEKLQl0ZXN0IHh0cmIwICAicjEsIHIxIgotCXRlc3QgeHRyYjEgICJyMSwgcjIiCi0JdGVzdCB4dHJiMiAgInIxLCByMCIKLQl0ZXN0IHh0cmIzICAicjEsIHIxMyIKLQl0ZXN0IHpleHRiICByOAotCXRlc3QgemV4dGggIHI0Ci0JY2xyYwkJCS8vIFRoZXNlIHR3byBpbnN0cnVjdGlvbnMgcGFkIHRoZSBvYmplY3QgZmlsZQotCWNscmMJCQkvLyBvdXQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LgotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZkNWMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYWJzCi0KLSMgVGVzdCB0aGUgYWJzIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDBjIDxmb29cKygweHwpYz4KLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gbmVnCVwkYTAsXCRhMAotMCswMDBjIDxbXj5dKj4gYmdleglcJGExLDArMDAxOCA8Zm9vXCsoMHh8KTE4PgotMCswMDEwIDxbXj5dKj4gbW92ZQlcJGEwLFwkYTEKLTArMDAxNCA8W14+XSo+IG5lZwlcJGEwLFwkYTEKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIxNzJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhYnMgbWFjcm8uCi1mb286Ci0JYWJzCSQ0Ci0JYWJzCSQ0LCQ1Ci0JLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzIxZDFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYWRkCi0KLSMgVGVzdCB0aGUgYWRkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDBjIDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTAgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwtMzI3NjgKLTArMDAxNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE4IDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMjQgPFtePl0qPiBhZGQJXCRhMCxcJGEwLFwkYXQKLTArMDAyOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGU5NjRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYWRkIG1hY3JvLgotCQotZm9vOgotCWFkZAkkNCwkNCwwCi0JYWRkCSQ0LCQ0LDEKLQlhZGQJJDQsJDQsMHg4MDAwCi0JYWRkCSQ0LCQ0LC0weDgwMDAKLQlhZGQJJDQsJDQsMHgxMDAwMAotCWFkZAkkNCwkNCwweDFhNWE1Ci0JCi0jIGFkZHUgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYWRkIGlzOyBqdXN0IGNvbmZpcm0gdGhhdCBpdCBpc24ndAotIyB0b3RhbGx5IGJyb2tlbi4KLQlhZGR1CSQ0LCQ0LDEKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDYxNzE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYW5kCi0KLSMgVGVzdCB0aGUgYW5kIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhbmRpCVwkYTAsXCRhMCwweDAKLTArMDAwNCA8W14+XSo+IGFuZGkJXCRhMCxcJGEwLDB4MQotMCswMDA4IDxbXj5dKj4gYW5kaQlcJGEwLFwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDEwIDxbXj5dKj4gYW5kCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxOCA8W14+XSo+IGFuZAlcJGEwLFwkYTAsXCRhdAotMCswMDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDI0IDxbXj5dKj4gYW5kCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjggPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4MAotMCswMDJjIDxbXj5dKj4gbm9yCVwkYTAsXCRhMCxcJHplcm8KLTArMDAzMCA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHgxCi0wKzAwMzQgPFtePl0qPiBub3IJXCRhMCxcJGEwLFwkemVybwotMCswMDM4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDgwMDAKLTArMDAzYyA8W14+XSo+IG5vcglcJGEwLFwkYTAsXCR6ZXJvCi0wKzAwNDAgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDQ0IDxbXj5dKj4gbm9yCVwkYTAsXCRhMSxcJGF0Ci0wKzAwNDggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0YyA8W14+XSo+IG5vcglcJGEwLFwkYTEsXCRhdAotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDU4IDxbXj5dKj4gbm9yCVwkYTAsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4MAotMCswMDYwIDxbXj5dKj4geG9yaQlcJGEwLFwkYTEsMHgwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmYzU3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFuZCBtYWNyby4KLQkKLWZvbzoKLQlhbmQJJDQsJDQsMAotCWFuZAkkNCwkNCwxCi0JYW5kCSQ0LCQ0LDB4ODAwMAotCWFuZAkkNCwkNCwtMHg4MDAwCi0JYW5kCSQ0LCQ0LDB4MTAwMDAKLQlhbmQJJDQsJDQsMHgxYTVhNQotCi0jIG5vciwgb3IsIGFuZCB4b3IgYXJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZS4gIFRoZXJlIGlzIGEgc3BlY2lhbAotIyBjYXNlIGZvciBub3IsIHNvIHdlIHRlc3QgYWxsIHZhcmlhbnRzLgotCQotCW5vcgkkNCwkNSwwCi0Jbm9yCSQ0LCQ1LDEKLQlub3IJJDQsJDUsMHg4MDAwCi0Jbm9yCSQ0LCQ1LC0weDgwMDAKLQlub3IJJDQsJDUsMHgxMDAwMAotCW5vcgkkNCwkNSwweDFhNWE1Ci0JCi0Jb3IJJDQsJDUsMAotCi0JeG9yCSQ0LCQ1LDAKLQotCSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzMjkzNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJlcQotCi0jIFRlc3QgdGhlIGJlcSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYmVxCVwkYTAsXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGJlcXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMQotMCswMDE0IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMjAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDAyYyA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDMwIDxbXj5dKj4gbm9wCi0wKzAwMzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzOCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0NCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNDggPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1NCA8W14+XSo+IG5vcAotMCswMDU4IDxbXj5dKj4gYmVxemwJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNWMgPFtePl0qPiBub3AKLTArMDA2MCA8W14+XSo+IGJuZXpsCVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgotMCsyMDA2OCA8W14+XSo+IGoJMCswMDAwIDx0ZXh0X2xhYmVsPgotWyAJXSoyMDA2ODogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQkudGV4dAotMCsyMDA2YyA8W14+XSo+IG5vcAotMCsyMDA3MCA8W14+XSo+IGphbAkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjIwMDcwOiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMmVlYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJlcSBtYWNyby4KLQkuZ2xvYmwJdGV4dF9sYWJlbAkudGV4dAotdGV4dF9sYWJlbDoJCi0JYmVxCSQ0LCQ1LHRleHRfbGFiZWwKLQliZXEJJDQsMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDEsdGV4dF9sYWJlbAotCWJlcQkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJlcQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQliZXEJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJuZSBpcyBoYW5kbGVkIGJ5IHRoZSBzYW1lIGNvZGUgYXMgYmVxLiAgSnVzdCBzYW5pdHkgY2hlY2suCi0JYm5lCSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSBjaGVjayBiZXFsIGFuZCBibmVsCi0JLnNldAltaXBzMgotCWJlcWwJJDQsMCx0ZXh0X2xhYmVsCi0JYm5lbAkkNCwwLHRleHRfbGFiZWwKLQotIyBUZXN0IHRoYXQgYnJhbmNoZXMgd2hpY2ggb3ZlcmZsb3cgYXJlIGNvbnZlcnRlZCB0byBqdW1wcy4KLQkuc3BhY2UJMHgyMDAwMAotCWIJdGV4dF9sYWJlbAotCWJhbAl0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzZTI3Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5kCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJnZQotCi0jIFRlc3QgdGhlIGJnZSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBibGV6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBiZ3R6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwyCi0wKzAwMzAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDM0IDxbXj5dKj4gbm9wCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDNjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDQ0IDxbXj5dKj4gbm9wCi0wKzAwNDggPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwtMzI3NjgKLTArMDA0YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNWMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDYwIDxbXj5dKj4gbm9wCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNmMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMDdjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gYmx0eglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5MCA8W14+XSo+IG5vcAotMCswMDk0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwYTAgPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCi0wKzAwYWMgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDVmZDgyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmdlIG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmdlCSQ0LCQ1LHRleHRfbGFiZWwKLQliZ2UJJDQsJDAsdGV4dF9sYWJlbAotCWJnZQkkMCwkNSx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDAsdGV4dF9sYWJlbAotCWJnZQkkNCwxLHRleHRfbGFiZWwKLQliZ2UJJDQsMix0ZXh0X2xhYmVsCi0JYmdlCSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdlCSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJnZQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQliZ2UJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmd0IGlzIGhhbmRsZWQgbGlrZSBiZ2UsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQliZ3QJJDQsJDUsdGV4dF9sYWJlbAotCWJndAkkNCwkMCx0ZXh0X2xhYmVsCi0JYmd0CSQwLCQ1LHRleHRfbGFiZWwKLQliZ3QJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmdlbCBhbmQgYmd0bAotCS5zZXQJbWlwczIKLQliZ2VsCSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3RsCSQ0LCQ1LHRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTYwNDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmdldQotCi0jIFRlc3QgdGhlIGJnZXUgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IGJlcQlcJHplcm8sXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGJuZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwyCi0wKzAwMjAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDJjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDMwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gc2x0aXUJXCRhdCxcJGEwLC0zMjc2OAotMCswMDNjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0MCA8W14+XSo+IG5vcAotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDggPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNGMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNWMgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNjAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBzbHR1CVwkYXQsXCRhMSxcJGEwCi0wKzAwNmMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDcwIDxbXj5dKj4gbm9wCi0wKzAwNzQgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc4IDxbXj5dKj4gbm9wCi0wKzAwN2MgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwODggPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4YyA8W14+XSo+IG5vcAotMCswMDkwIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDk0IDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM3Zjk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJnZXUgbWFjcm8uCi0JCi10ZXh0X2xhYmVsOgkKLQliZ2V1CSQ0LCQ1LHRleHRfbGFiZWwKLQliZ2V1CSQwLCQ1LHRleHRfbGFiZWwKLQkjIEEgc2Vjb25kIGFyZ3VtZW50IG9mIDAgb3IgJDAgaXMgYWx3YXlzIHRydWUKLQliZ2V1CSQ0LDEsdGV4dF9sYWJlbAotCWJnZXUJJDQsMix0ZXh0X2xhYmVsCi0JYmdldQkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJnZXUJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdldQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQliZ2V1CSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJndHUgaXMgaGFuZGxlZCBsaWtlIGJnZXUsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQliZ3R1CSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3R1CSQ0LCQwLHRleHRfbGFiZWwKLQliZ3R1CSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSB0ZXN0IGJnZXVsIGFuZCBiZ3R1bAotCS5zZXQJbWlwczIKLQliZ2V1bAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmd0dWwJJDQsJDUsdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTBlMjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBibHQKLQotIyBUZXN0IHRoZSBibHQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gYmx0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxMCA8W14+XSo+IG5vcAotMCswMDE0IDxbXj5dKj4gYmd0eglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gYmx0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyOCA8W14+XSo+IG5vcAotMCswMDJjIDxbXj5dKj4gc2x0aQlcJGF0LFwkYTAsMgotMCswMDMwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAzYyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDQwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0NCA8W14+XSo+IG5vcAotMCswMDQ4IDxbXj5dKj4gc2x0aQlcJGF0LFwkYTAsLTMyNzY4Ci0wKzAwNGMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDVjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA2MCA8W14+XSo+IG5vcAotMCswMDY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNjggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDZjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNzAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc0IDxbXj5dKj4gbm9wCi0wKzAwNzggPFtePl0qPiBzbHQJXCRhdCxcJGExLFwkYTAKLTArMDA3YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODAgPFtePl0qPiBub3AKLTArMDA4NCA8W14+XSo+IGJsZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGJnZXoJXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOTAgPFtePl0qPiBub3AKLTArMDA5NCA8W14+XSo+IGJsZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOTggPFtePl0qPiBub3AKLTArMDA5YyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhMQotMCswMGEwIDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMGFjIDxbXj5dKj4gYmVxemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMzA1Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJsdCBtYWNyby4KLQkKLXRleHRfbGFiZWw6CQotCWJsdAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmx0CSQ0LCQwLHRleHRfbGFiZWwKLQlibHQJJDAsJDUsdGV4dF9sYWJlbAotCWJsdAkkNCwwLHRleHRfbGFiZWwKLQlibHQJJDQsMSx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDIsdGV4dF9sYWJlbAotCWJsdAkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJsdAkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQlibHQJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJsZSBpcyBoYW5kbGVkIGxpa2UgYmx0LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JYmxlCSQ0LCQ1LHRleHRfbGFiZWwKLQlibGUJJDQsJDAsdGV4dF9sYWJlbAotCWJsZQkkMCwkNSx0ZXh0X2xhYmVsCi0JYmxlCSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSB0ZXN0IGJsdGwgYW5kIGJsZWwKLQkuc2V0CW1pcHMyCi0JYmx0bAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmxlbAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzI2MWM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5kCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJsdHUKLQotIyBUZXN0IHRoZSBibHR1IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBibmUJXCR6ZXJvLFwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsMgotMCswMDIwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyYyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDAzMCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzQgPFtePl0qPiBub3AKLTArMDAzOCA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwtMzI3NjgKLTArMDAzYyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNDAgPFtePl0qPiBub3AKLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDRjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1MCA8W14+XSo+IG5vcAotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDVjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDYwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDZjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3MCA8W14+XSo+IG5vcAotMCswMDc0IDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3OCA8W14+XSo+IG5vcAotMCswMDdjIDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQotMCswMDg4IDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKLTArMDA5NCA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiMWFlNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBibHR1IG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmx0dQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmx0dQkkMCwkNSx0ZXh0X2xhYmVsCi0JIyBBIHNlY29uZCBhcmd1bWVudCBvZiAwIG9yICQwIGlzIGFsd2F5cyBmYWxzZQotCWJsdHUJJDQsMSx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwyLHRleHRfbGFiZWwKLQlibHR1CSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQlibHR1CSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJsdHUJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmxldSBpcyBoYW5kbGVkIGxpa2UgYmx0dSwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWJsZXUJJDQsJDUsdGV4dF9sYWJlbAotCWJsZXUJJDQsJDAsdGV4dF9sYWJlbAotCWJsZXUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmx0dWwgYW5kIGJsZXVsCi0JLnNldAltaXBzMgotCWJsdHVsCSQ0LCQ1LHRleHRfbGFiZWwKLQlibGV1bAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk4YTRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2FzOiAtbWNwdT1yMzkwMAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjM5MDAKLSNuYW1lOiBNSVBTIDIwLWJpdCBicmVhawotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBicmVhawotMCswMDA0IDxbXj5dKj4gYnJlYWsKLTArMDAwOCA8W14+XSo+IGJyZWFrCTB4MTQKLTArMDAwYyA8W14+XSo+IGJyZWFrCTB4MTQsMHgyOAotMCswMDEwIDxbXj5dKj4gYnJlYWsJMHgzZmYsMHgzZmYKLTArMDAxNCA8W14+XSo+IHNkYmJwCi0wKzAwMTggPFtePl0qPiBzZGJicAotMCswMDFjIDxbXj5dKj4gc2RiYnAJMHgxNAotMCswMDIwIDxbXj5dKj4gc2RiYnAJMHgxNCwweDI4Ci0wKzAwMjQgPFtePl0qPiBzZGJicAkweDNmZiwweDNmZgotCS4uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzViMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgMjAtYml0IGJyZWFrIGluc3RydWN0aW9ucwotZm9vOgkKLQlicmVhawotCWJyZWFrCTAKLQlicmVhawkyMAotCWJyZWFrCTIwLDQwCi0JYnJlYWsJMTAyMywxMDIzCi0JCi0Jc2RiYnAKLQlzZGJicAkwCi0Jc2RiYnAJMjAKLQlzZGJicAkyMCw0MAotCXNkYmJwCTEwMjMsMTAyMwotCQotIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCi0jIGhlcmUuLi4KLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2RjMGVjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBkZWxheQotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLQotIyAKLSMgR2FzIHNob3VsZCBwcm9kdWNlIG5vcCdzIGFmdGVyIG10YzEgYW5kIHJlbGF0ZWQgCi0jIGluc24ncyBpZiB0aGUgdGFyZ2V0IGZwciBpcyB1c2VkIGluIHRoZSAKLSMgaW1tZWRpYXRseSBmb2xsb3dpbmcgaW5zbi4gIFNlZSBhbHNvIG5vZGVsYXkuZC4KLSMKLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbXRjMQlcJHplcm8sXCRmMAotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBjdnQuZC53CVwkZjAsXCRmMAotMCswMDBjIDxbXj5dKj4gbXRjMQlcJHplcm8sXCRmMQotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBjdnQuZC53CVwkZjEsXCRmMQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUyZjAwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFicyBtYWNyby4KLWZvbzoKLQltdGMxCSQwLCRmMAotCWN2dC5kLncJJGYwLCRmMAotICAgICAgICBtdGMxICAgICQwLCRmMQotICAgICAgICBjdnQuZC53ICRmMSwkZjEKLSAgICAgICAgLnNwYWNlCTgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi1pbG9ja3MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NTZkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi1pbG9ja3MuZAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgZGl2Ci0jc291cmNlOiBkaXYucwotCi0jIFRlc3QgdGhlIGRpdiBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJuZXoJXCRhMSwwKzAwMTAgPGZvb1wrMHgxMD4KLTArMDAwOCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCi0wKzAwMGMgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwMTQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgotMCswMDE4IDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwMWMgPFtePl0qPiBibmUJXCRhMCxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwMjggPFtePl0qPiBtZmxvCVwkYTAKLTArMDAyYyA8W14+XSo+IGJuZXoJXCRhMiwwKzAwMzggPGZvb1wrMHgzOD4KLTArMDAzMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAwMzQgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwM2MgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDA1MCA8Zm9vXCsweDUwPgotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwNDQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDA1MCA8Zm9vXCsweDUwPgotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwNTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA1NCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAwNTggPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQotMCswMDVjIDxbXj5dKj4gbmVnCVwkYTAsXCRhMAotMCswMDYwIDxbXj5dKj4gbmVnCVwkYTAsXCRhMQotMCswMDY0IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNjggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDZjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNzAgPFtePl0qPiBsaQlcJGF0LDIKLTArMDA3NCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwNzggPFtePl0qPiBtZmxvCVwkYTAKLTArMDA3YyA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwODAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDg0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwODggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDhjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDA5MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDk0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDA5OCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwOWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhMCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYTQgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGE4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBiMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwYjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGJjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBjMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwYzggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGNjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBkMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZDggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGRjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBlMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGU0IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAwZTggPFtePl0qPiBibmV6CVwkYTEsMCswZjQgPGZvb1wrMHhmND4KLTArMDBlYyA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTAsXCRhMQotMCswMGYwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMGY0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZjggPFtePl0qPiBibmV6CVwkYTIsMCswMTA0IDxmb29cKzB4MTA0PgotMCswMGZjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGEyCi0wKzAxMDAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMDQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEwOCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAxMGMgPFtePl0qPiBibmV6CVwkYTIsMCswMTE4IDxmb29cKzB4MTE4PgotMCswMTEwIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDExNCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDExOCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDExYyA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTMwIDxmb29cKzB4MTMwPgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAxMjQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDEzMCA8Zm9vXCsweDEzMD4KLTArMDEyOCA8W14+XSo+IG5vcAotMCswMTJjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTMwIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxMzQgPFtePl0qPiBsaQlcJGF0LDIKLTArMDEzOCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTNjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxNDAgPFtePl0qPiBibmV6CVwkYTIsMCswMTRjIDxmb29cKzB4MTRjPgotMCswMTQ0IDxbXj5dKj4gZGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAxNDggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sLTEKLTArMDE1MCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTY4IDxmb29cKzB4MTY4PgotMCswMTU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLDEKLTArMDE1OCA8W14+XSo+IGRzbGwzMglcJGF0LFwkYXQsMHgxZgotMCswMTVjIDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxNjggPGZvb1wrMHgxNjg+Ci0wKzAxNjAgPFtePl0qPiBub3AKLTArMDE2NCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDE2OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTZjIDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAxNzAgPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxNzQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDE3OCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAxN2MgPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDE4MCA8W14+XSo+IG1maGkJXCRhMAotMCswMTg0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDE4OCA8W14+XSo+IGRkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDE4YyA8W14+XSo+IG1maGkJXCRhMAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzViYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI2FzOiAtbWNwdT1yNDAwMAotI25hbWU6IE1JUFMgZGl2Ci0KLSMgVGVzdCB0aGUgZGl2IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGExLDArMDAxMCA8Zm9vXCsweDEwPgotMCswMDA4IDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwYyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDAxNCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMTggPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDAxYyA8W14+XSo+IGJuZQlcJGEwLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDAyOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDJjIDxbXj5dKj4gbm9wCi0wKzAwMzAgPFtePl0qPiBibmV6CVwkYTIsMCswMDNjIDxmb29cKzB4M2M+Ci0wKzAwMzQgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMDM4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMDNjIDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMDQwIDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAwNTQgPGZvb1wrMHg1ND4KLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMDQ4IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAwNTQgPGZvb1wrMHg1ND4KLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDU0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNTggPFtePl0qPiBtb3ZlCVwkYTAsXCRhMAotMCswMDVjIDxbXj5dKj4gbW92ZQlcJGEwLFwkYTEKLTArMDA2MCA8W14+XSo+IG5lZwlcJGEwLFwkYTAKLTArMDA2NCA8W14+XSo+IG5lZwlcJGEwLFwkYTEKLTArMDA2OCA8W14+XSo+IGxpCVwkYXQsMgotMCswMDZjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDc0IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNzggPFtePl0qPiBub3AKLTArMDA3YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwODAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA4NCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwOTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA5NCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwOTggPFtePl0qPiBub3AKLTArMDA5YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhNCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYTggPFtePl0qPiBub3AKLTArMDBhYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwYjAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBiNCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYjggPFtePl0qPiBub3AKLTArMDBiYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYzAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGM4IDxbXj5dKj4gbm9wCi0wKzAwY2MgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGQwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBkOCA8W14+XSo+IG5vcAotMCswMGRjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBlMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGVjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBmMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZjggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGZjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDEwMCA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMTBjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAxMTAgPFtePl0qPiBibmV6CVwkYTEsMCswMTFjIDxmb29cKzB4MTFjPgotMCswMTE0IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAxMTggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEyMCA8W14+XSo+IG5vcAotMCswMTI0IDxbXj5dKj4gYm5leglcJGEyLDArMDEzMCA8Zm9vXCsweDEzMD4KLTArMDEyOCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTJjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTMwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMzQgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMAotMCswMTM4IDxbXj5dKj4gYm5leglcJGEyLDArMDE0NCA8Zm9vXCsweDE0ND4KLTArMDEzYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAxNDAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxNDQgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAxNDggPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDE1YyA8Zm9vXCsweDE1Yz4KLTArMDE0YyA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMTUwIDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxNWMgPGZvb1wrMHgxNWM+Ci0wKzAxNTQgPFtePl0qPiBub3AKLTArMDE1OCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDE1YyA8W14+XSo+IG1maGkJXCRhMAotMCswMTYwIDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTZjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxNzAgPFtePl0qPiBub3AKLTArMDE3NCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxODAgPGZvb1wrMHgxODA+Ci0wKzAxNzggPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDE3YyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDE4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywtMQotMCswMTg0IDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAxOWMgPGZvb1wrMHgxOWM+Ci0wKzAxODggPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sMQotMCswMThjIDxbXj5dKj4gZHNsbDMyCVwkYXQsXCRhdCwweDFmCi0wKzAxOTAgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDE5YyA8Zm9vXCsweDE5Yz4KLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTljIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxYTAgPFtePl0qPiBsaQlcJGF0LDIKLTArMDFhNCA8W14+XSo+IG5vcAotMCswMWE4IDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMWFjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxYjAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMWI0IDxbXj5dKj4gbm9wCi0wKzAxYjggPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDFiYyA8W14+XSo+IG1maGkJXCRhMAotMCswMWMwIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDFjNCA8W14+XSo+IG5vcAotMCswMWM4IDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMWNjIDxbXj5dKj4gbWZoaQlcJGEwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5OTkwNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGRpdiBtYWNyby4KLWZvbzoKLQlkaXYJJDAsJDQsJDUKLQlkaXYJJDQsJDUKLQlkaXYJJDQsJDUsJDYKLQlkaXYJJDQsMQotCWRpdgkkNCwkNSwxCi0JZGl2CSQ0LC0xCi0JZGl2CSQ0LCQ1LC0xCi0JZGl2CSQ0LDIKLQlkaXYJJDQsJDUsMgotCWRpdgkkNCwweDgwMDAKLQlkaXYJJDQsJDUsMHg4MDAwCi0JZGl2CSQ0LC0weDgwMDAKLQlkaXYJJDQsJDUsLTB4ODAwMAotCWRpdgkkNCwweDEwMDAwCi0JZGl2CSQ0LCQ1LDB4MTAwMDAKLQlkaXYJJDQsMHgxYTVhNQotCWRpdgkkNCwkNSwweDFhNWE1Ci0KLSMgZGl2dSBpcyBsaWtlIGRpdiwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWRpdnUJJDAsJDQsJDUKLQlkaXZ1CSQ0LCQ1Ci0JZGl2dQkkNCwkNSwkNgotCWRpdnUJJDQsMQotCi0jIHJlbSBpcyBsaWtlIGRpdiwgcmVtdSBpcyBsaWtlIGRpdnUKLQlyZW0JJDQsJDUsJDYKLQlyZW11CSQ0LCQ1LDIKLQotIyBTYW5pdHkgY2hlY2sgdGhlIDY0IGJpdCB2ZXJzaW9ucy4KLQkuc2V0CW1pcHMzCi0JZGRpdgkkNCwkNSwkNgotCWRkaXZ1CSQ0LCQ1LDIKLQlkcmVtCSQ0LCQ1LDB4ODAwMAotCWRyZW11CSQ0LCQ1LC0weDgwMDAKLQotIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCi0jIGhlcmUuLi4KLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjQ0NWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkuZAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgZGxpCi0jYXM6IC1taXBzMwotCi0jIFRlc3QgdGhlIGRsaSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMTAgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxYyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMjAgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDI0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDI4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDEyMzQKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDMwIDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKLTArMDAzNCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDM4IDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKLTArMDAzYyA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDA0MCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDA0NCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YwotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHg4MDAwCi0wKzAwNGMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDUwIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDA1NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA1OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0Ci0wKzAwNWMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwNjAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4NTY3OAotMCswMDY0IDxbXj5dKj4gbHVpCVwkYTAsMHg4MDAwCi0wKzAwNjggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDZjIDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDcwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDU2NzgKLTArMDA3NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA3OCA8W14+XSo+IGxpCVwkYTAsLTMwODc1Ci0wKzAwN2MgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDA4MCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHg0MzIxCi0wKzAwODQgPFtePl0qPiBsaQlcJGEwLC0xNgotMCswMDg4IDxbXj5dKj4gbGkJXCRhMCwtMjU2Ci0wKzAwOGMgPFtePl0qPiBsaQlcJGEwLC00MDk2Ci0wKzAwOTAgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDA5NCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmMAotMCswMDk4IDxbXj5dKj4gbHVpCVwkYTAsMHhmZjAwCi0wKzAwOWMgPFtePl0qPiBsdWkJXCRhMCwweGYwMDAKLTArMDBhMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBhNCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAwYTggPFtePl0qPiBsaQlcJGEwLC0xNgotMCswMGFjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBiMCA8W14+XSo+IGxpCVwkYTAsLTI1NgotMCswMGI0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBiOCA8W14+XSo+IGxpCVwkYTAsLTQwOTYKLTArMDBiYyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAwYzAgPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMGM0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwYzggPFtePl0qPiBsaQlcJGEwLDB4ZmZmMAotMCswMGNjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZDAgPFtePl0qPiBsaQlcJGEwLDB4ZmYwMAotMCswMGQ0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZDggPFtePl0qPiBsaQlcJGEwLDB4ZjAwMAotMCswMGRjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZTAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZTQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDQKLTArMDBlOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBlYyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4OAotMCswMGYwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGY0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhjCi0wKzAwZjggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZmMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDEwCi0wKzAxMDAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMDQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDE0Ci0wKzAxMDggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMGMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDE4Ci0wKzAxMTAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMTQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDFjCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDExYyA8W14+XSo+IGRzcmwzMglcJGEwLFwkYTAsMHgwCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhMCwweGZmZgotMCswMTI0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDEyOCA8W14+XSo+IGx1aQlcJGEwLDB4ZmYKLTArMDEyYyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxMzAgPFtePl0qPiBsdWkJXCRhMCwweGYKLTArMDEzNCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxMzggPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMTNjIDxbXj5dKj4gbGkJXCRhMCw0MDk1Ci0wKzAxNDAgPFtePl0qPiBsaQlcJGEwLDI1NQotMCswMTQ0IDxbXj5dKj4gbGkJXCRhMCwxNQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgzCi0wKzAxNGMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmYwotMCswMTUwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDE1NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MWUKLTArMDE1OCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAxNWMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MgotMCswMTYwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDE2NCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHg2Ci0wKzAxNjggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxNmMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMTcwIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhhCi0wKzAxNzQgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxNzggPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDFjCi0wKzAxN2MgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGEKLTArMDE4MCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDE4NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTgKLTArMDE4OCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YQotMCswMThjIDxbXj5dKj4gbHVpCVwkYTAsMHgzZgotMCswMTkwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZjMDMKLTArMDE5NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDE5OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxOWMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAxYTAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YzAwMAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Nzk1MjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBkbGkgbWFjcm8uCi0JCi1mb286CQotCWRsaQkkNCwwCi0JZGxpCSQ0LDEKLQlkbGkJJDQsLTEKLQlkbGkJJDQsMHg4MDAwCi0JZGxpCSQ0LC0weDgwMDAKLQlkbGkJJDQsMHgxMDAwMAotCWRsaQkkNCwweDFhNWE1Ci0JZGxpCSQ0LDB4ODAwMDEyMzQKLQlkbGkJJDQsMHhmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwZmZmZmZmZmYKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweGZmZmZmZmZmODAwMDEyMzQKLQlkbGkJJDQsMHhmZmZmODAwMDEyMzQ1Njc4Ci0JZGxpCSQ0LDB4ODAwMDEyMzQ1Njc4MDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZjg3NjUKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmY0MzIxCi0KLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZmYwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmZmYwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZmYwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmYwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmYwMDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmYwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmYwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmYwMDAwMDAwMAotCWRsaQkkNCwweGZmZmZmZmYwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmYwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmYwMDAwMDAwMDAwMAotCWRsaQkkNCwweGZmZmYwMDAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmYwMDAwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmYwMDAwMDAwMDAwMDAwMAotCWRsaQkkNCwweGYwMDAwMDAwMDAwMDAwMDAKLQotCWRsaQkkNCwweDBmZmZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMGZmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDBmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMGZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDBmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMGZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDBmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMGZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwMDBmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDAwMGZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwMDAwZgotCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAzZmZmYwotCWRsaQkkNCwweDAwMDAzZmZmYzAwMDAwMDAKLQlkbGkJJDQsMHgwMDAzZmZmYzAwMDAwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmYzAwMDAwMDAwMAotCWRsaQkkNCwweDAwM2ZmZmZmZmZjMDAwMDAKLQlkbGkJJDQsMHgwMDNmZmZmZmZmZmMwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmZmZmZmZmYzAwMAotCi0JZGxpCSQ0LDB4MDAzZmZjMDNmZmZmYzAwMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE1ZjljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpc24ndCBkaXJlY3RseSB1c2VkIGJ5IHRoZSB0ZXN0IHN1aXRlOyBpdCB1c2VzCi0gICBlbGZfZV9mbGFncy5zLiAgSG93ZXZlciwgSSBmaWd1cmVkIGl0IHdvdWxkIGJlIG5pY2UgdG8gcHJvdmlkZSB0aGUKLSAgIHNvdXJjZSBjb2RlIGZyb20gd2hpY2ggdGhlIC5zIGZpbGUgd2FzIGdlbmVyYXRlZC4KLQotICAgSXQgd2FzIGNvbXBpbGVkIGFzIGZvbGxvd3M6Ci0KLSAgIG1pcHM2NC1lbGYtZ2NjIC1tNDY1MCAtUyAtTyBlbGZfZV9mbGFncy5jCi0KLSAgIFdlIHVzZSB0aGUgLW00NjUwIGZsYWcgdG8gZ2V0IHRoZSA0NjUwLXNwZWNpZmljICdtdWwnIGluc3RydWN0aW9uCi0gICBpbiB0aGVyZTsgdGhlIHRlc3Qgc3VpdGUgd2FudHMgdG8gYmUgc3VyZSB0aGF0IEdBUydzIC1tNDY1MCBmbGFnCi0gICB3aWxsIGluZGVlZCBjYXVzZSBpdCB0byBnZW5lcmF0ZSB0aGUgNDY1MCBtdWwgaW5zdHJ1Y3Rpb24sIGFuZCBub3QKLSAgIGV4cGFuZCBpdCBhcyBhIG1hY3JvLgotCi0gICBJYW4gMTAgSnVuZSAxOTk5OiBJIHR3ZWFrZWQgdGhlIHJlc3VsdGluZyBhc3NlbWJsZXIgZmlsZSBzbyB0aGF0IGl0Ci0gICB3b3VsZCBnZW5lcmF0ZSB0aGUgc2FtZSBjb2RlIHdoZW4gZ2FzIHdhcyBjb25maWd1cmVkIGZvciBtaXBzLWVsZgotICAgYW5kIGZvciBtaXBzNjQtZWxmLiAgKi8KLQotaW50Ci1mb28gKGludCBhLCBpbnQgYikKLXsKLSAgcmV0dXJuIChhICogYikgKyAxOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2E4YzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotCS5maWxlCTEgImVsZl9lX2ZsYWdzLmMiCi1nY2MyX2NvbXBpbGVkLjoKLV9fZ251X2NvbXBpbGVkX2M6Ci0JLnRleHQKLQkuYWxpZ24JMgotCS5nbG9ibAlmb28KLQkudGV4dAotCS5lbnQJZm9vCi1mb286Ci0JLmZyYW1lCSRzcCwwLCQzMQkJIyB2YXJzPSAwLCByZWdzPSAwLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCi0JLm1hc2sJMHgwMDAwMDAwMCwwCi0JLmZtYXNrCTB4MDAwMDAwMDAsMAotCW11bAkkMiwkNCwkNQotCS5zZXQJbm9yZW9yZGVyCi0JLnNldAlub21hY3JvCi0JagkkMzEKLQlhZGR1CSQyLCQyLDEKLQkuc2V0CW1hY3JvCi0JLnNldAlyZW9yZGVyCi0KLQkuZW5kCWZvbwotCS5hbGlnbgkyCi0JLmdsb2JsCW1haW4KLQkudGV4dAotCS5lbnQJbWFpbgotbWFpbjoKLQkuZnJhbWUJJHNwLDQwLCQzMQkJIyB2YXJzPSAwLCByZWdzPSAxLzAsIGFyZ3M9IDMyLCBleHRyYT0gMAotCS5tYXNrCTB4ODAwMDAwMDAsLTgKLQkuZm1hc2sJMHgwMDAwMDAwMCwwCi0Jc3VidQkkc3AsJHNwLDQwCi0Jc3cJJDMxLDMyKCRzcCkKLQlqYWwJX19nY2NtYWluCi0JbW92ZQkkMiwkMAotCWx3CSQzMSwzMigkc3ApCi0Jbm9wCi0JLnNldAlub3Jlb3JkZXIKLQkuc2V0CW5vbWFjcm8KLQlqCSQzMQotCWFkZHUJJHNwLCRzcCw0MAotCS5zZXQJbWFjcm8KLQkuc2V0CXJlb3JkZXIKLQotCS5lbmQJbWFpbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGU2N2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczEuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgbmFtZTogRUxGIGVfZmxhZ3M6IG5vdGhpbmcgc3BlY2lhbAotIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKLSMgb2JqZHVtcDogLWZkCi0KLS4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgotYXJjaGl0ZWN0dXJlOiBtaXBzOlszNF0wMDAsIGZsYWdzIDB4MDAwMDAwMTE6Ci1IQVNfUkVMT0MsIEhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMDAwMDAwMDAwIDxmb28+OgotICAgMDoJMDA4NTAwMTkgCW11bHR1CVwkYTAsXCRhMQotICAgNDoJMDAwMDEwMTIgCW1mbG8JXCR2MAotICAgODoJMDNlMDAwMDggCWpyCVwkcmEKLSAgIGM6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQotCi0wMDAwMDAwMDAwMDAwMDEwIDxtYWluPjoKLSAgMTA6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCi0gIDE0OglhZmJmMDAyMCAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gIDE4OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KLSAgMWM6CTAwMDAwMDAwIAlub3AKLSAgMjA6CTAwMDAxMDJbMWRdIAltb3ZlCVwkdjAsXCR6ZXJvCi0gIDI0Ogk4ZmJmMDAyMCAJbHcJXCRyYSwzMlwoXCRzcFwpCi0gIDI4OgkwMDAwMDAwMCAJbm9wCi0gIDJjOgkwM2UwMDAwOCAJanIJXCRyYQotICAzMDoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTNiZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczIuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgbmFtZTogRUxGIGVfZmxhZ3M6IC1tNDY1MAotIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKLSMgYXM6IC1tNDY1MAotIyBvYmpkdW1wOiAtZmQKLQotLio6LipmaWxlIGZvcm1hdC4qbWlwcy4qCi1hcmNoaXRlY3R1cmU6IG1pcHM6NDY1MCwgZmxhZ3MgMHgwMDAwMDAxMToKLUhBU19SRUxPQywgSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMDAwMDAwMDAwCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwMDAwMDAwMDAgPGZvbz46Ci0gICAwOgk3MDg1MTAwMiAJbXVsCVwkdjAsXCRhMCxcJGExCi0gICA0OgkwM2UwMDAwOCAJanIJXCRyYQotICAgODoJMjQ0MjAwMDEgCWFkZGl1CVwkdjAsXCR2MCwxCi0KLTAwMDAwMDAwMDAwMDAwMGMgPG1haW4+OgotICAgYzoJMjdiZGZmZDggCWFkZGl1CVwkc3AsXCRzcCwtNDAKLSAgMTA6CWFmYmYwMDIwIAlzdwlcJHJhLDMyXChcJHNwXCkKLSAgMTQ6CTBjMDAwMDAwIAlqYWwJMCA8Zm9vPgotICAxODoJMDAwMDAwMDAgCW5vcAotICAxYzoJMDAwMDEwMmQgCW1vdmUJXCR2MCxcJHplcm8KLSAgMjA6CThmYmYwMDIwIAlsdwlcJHJhLDMyXChcJHNwXCkKLSAgMjQ6CTAwMDAwMDAwIAlub3AKLSAgMjg6CTAzZTAwMDA4IAlqcglcJHJhCi0gIDJjOgkyN2JkMDAyOCAJYWRkaXUJXCRzcCxcJHNwLDQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxMzQ5MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBuYW1lOiBFTEYgZV9mbGFnczogLW1jcHU9NDY1MAotIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKLSMgYXM6IC1tY3B1PTQ2NTAKLSMgb2JqZHVtcDogLWZkCi0KLS4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgotYXJjaGl0ZWN0dXJlOiBtaXBzOjQ2NTAsIGZsYWdzIDB4MDAwMDAwMTE6Ci1IQVNfUkVMT0MsIEhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMDAwMDAwMDAwIDxmb28+OgotICAgMDoJNzA4NTEwMDIgCW11bAlcJHYwLFwkYTAsXCRhMQotICAgNDoJMDNlMDAwMDggCWpyCVwkcmEKLSAgIDg6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQotCi0wMDAwMDAwMDAwMDAwMDBjIDxtYWluPjoKLSAgIGM6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCi0gIDEwOglhZmJmMDAyMCAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gIDE0OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KLSAgMTg6CTAwMDAwMDAwIAlub3AKLSAgMWM6CTAwMDAxMDJkIAltb3ZlCVwkdjAsXCR6ZXJvCi0gIDIwOgk4ZmJmMDAyMCAJbHcJXCRyYSwzMlwoXCRzcFwpCi0gIDI0OgkwMDAwMDAwMCAJbm9wCi0gIDI4OgkwM2UwMDAwOCAJanIJXCRyYQotICAyYzoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2ViYTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgbmFtZTogRUxGIGVfZmxhZ3M6IC1tNDY1MCAtbWNwdT00NjUwCi0jIHNvdXJjZTogZWxmX2VfZmxhZ3MucwotIyBhczogLW00NjUwIC1tY3B1PTQ2NTAKLSMgb2JqZHVtcDogLWZkCi0KLS4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgotYXJjaGl0ZWN0dXJlOiBtaXBzOjQ2NTAsIGZsYWdzIDB4MDAwMDAwMTE6Ci1IQVNfUkVMT0MsIEhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMDAwMDAwMDAwIDxmb28+OgotICAgMDoJNzA4NTEwMDIgCW11bAlcJHYwLFwkYTAsXCRhMQotICAgNDoJMDNlMDAwMDggCWpyCVwkcmEKLSAgIDg6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQotCi0wMDAwMDAwMDAwMDAwMDBjIDxtYWluPjoKLSAgIGM6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCi0gIDEwOglhZmJmMDAyMCAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gIDE0OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KLSAgMTg6CTAwMDAwMDAwIAlub3AKLSAgMWM6CTAwMDAxMDJkIAltb3ZlCVwkdjAsXCR6ZXJvCi0gIDIwOgk4ZmJmMDAyMCAJbHcJXCRyYSwzMlwoXCRzcFwpCi0gIDI0OgkwMDAwMDAwMCAJbm9wCi0gIDI4OgkwM2UwMDAwOCAJanIJXCRyYQotICAyYzoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY4YTc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0gICAgOyBIZXJlLCB0aGUgcHJvY2Vzc29ycyByZXByZXNlbnQgbWlwcyBjb3Byb2Nlc3NvcnMuCi0KLSAgICBwMSBkcmVnIGQxIDEgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDEiIGZvciBDT1AxIGhhcyB2YWx1ZSAxCi0gICAgcDEgY3JlZyBjMyAzICAgICAgICA7IGN0cmwgcmVnaXN0ZXIgImMzIiBmb3IgQ09QMSBoYXMgdmFsdWUgMwotICAgIHAzIGluc24gZmllIDB4MWU6MjQtMjAgICAgICA7IGZ1bmN0aW9uICJmaWxsIiBmb3IgQ09QMyBoYXMgdmFsdWUgMzEKLSAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0gICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLSAgICBwMyBpbnNuIGZlZSAweDFlOjI0LTIwLGRyZWc6MTctMTMsY3JlZzoxMi04LGltbWVkOjctMAotCi0gICAgcDMgZHJlZyBkMyAzICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotICAgIHAzIGNyZWcgYzIgMjIgICAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0gICAgcDMgaW5zbiBmdW0gMHgwMWUwMDAwMSBkcmVnOjE3LTEzIGNyZWc6MTItOAotICAgIHAzIGluc24gZm9oIDB4ZjoyNC0yMSBkcmVnOjIwLTE2IGltbWVkOjE1LTAKLQotICAgIHAzIGluc24gcGlnIDB4MToyNC0yMSpbMHgxMDB8MHgyXSwgZHJlZzoyMC0xNiwgaW1tZWQ6MTUtMCoweDEwMDAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODU1NDViLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCi0gICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgotICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCi0gICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KLQotICAgIDsgQ2FsbCBtaXBzIGNvcHJvY2Vzc29yICJjb2Z1biJzIGFzIGRlZmluZWQgaW4gIml0YmwiLgotCi0gICAgZmVlICRkMywkYzIsMHgxIAk7ICAweDRmZjA3NjAxCi0gICAgZmllIAkgIAk7ICAweDRmZjAwMDAwCi0gICAgZm9oICQyLDB4MTAwCi0gICAgZnVtICRkMywkYzIgICAgIAk7ICAweDRmZjA3NjAxCi0gICAgcGlnICQyLDB4MTAwCi0KLSAgICA7IENhbGwgYSBtaXBzIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIHdpdGggcmVnaXN0ZXIgImQxIiAKLSAgICA7IGRlZmluZWQgaW4gIml0YmwiLgotCi0gICAgTFdDMSAkZDEsMHgxMDAoJDIpCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDZjY2ZhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgamFsLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotI3NvdXJjZTogamFsLnMKLQotIyBUZXN0IHRoZSBqYWwgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGphbHIJXCRhMCxcJHQ5Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGJhbAkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjEwOiBQQ1JFTDE2CS50ZXh0Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGJhbAkwKzAwMTggPHRleHRfbGFiZWxcKygweHwpMTg+Ci1bIAldKjE4OiBQQ1JFTDE2CWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDAxYyA8W14+XSo+IG5vcAotMCswMDIwIDxbXj5dKj4gYgkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjIwOiBQQ1JFTDE2CS50ZXh0Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGIJMCswMDI4IDx0ZXh0X2xhYmVsXCsoMHh8KTI4PgotWyAJXSoyODogUENSRUwxNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1YmU3Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgUjMwMDAgamFsLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDIC1tY3B1PXIzMDAwCi0KLSMgVGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx1aQlcJGdwLDB4MAotWyAJXSowOiBSX01JUFNfSEkxNglfZ3BfZGlzcAotMCswMDA0IDxbXj5dKj4gYWRkaXUJXCRncCxcJGdwLDAKLVsgCV0qNDogUl9NSVBTX0xPMTYJX2dwX2Rpc3AKLTArMDAwOCA8W14+XSo+IGFkZHUJXCRncCxcJGdwLFwkdDkKLTArMDAwYyA8W14+XSo+IHN3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMTAgPFtePl0qPiBqYWxyCVwkdDkKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDAxYyA8W14+XSo+IGphbHIJXCRhMCxcJHQ5Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMjggPFtePl0qPiBub3AKLTArMDAyYyA8W14+XSo+IGx3CVwkdDksMFwoXCRncFwpCi1bIAldKjJjOiBSX01JUFNfR09UMTYJLnRleHQKLTArMDAzMCA8W14+XSo+IG5vcAotMCswMDM0IDxbXj5dKj4gYWRkaXUJXCR0OSxcJHQ5LDAKLVsgCV0qMzQ6IFJfTUlQU19MTzE2CS50ZXh0Ci0wKzAwMzggPFtePl0qPiBqYWxyCVwkdDkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDA0NCA8W14+XSo+IG5vcAotMCswMDQ4IDxbXj5dKj4gbHcJXCR0OSwwXChcJGdwXCkKLVsgCV0qNDg6IFJfTUlQU19DQUxMMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBqYWxyCVwkdDkKLTArMDA1NCA8W14+XSo+IG5vcAotMCswMDU4IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDA1YyA8W14+XSo+IGIJMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg5ZGZhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBqYWwgbWFjcm8gd2l0aCAtS1BJQyBjb2RlLgotCQotdGV4dF9sYWJlbDoJCi0JLnNldAlub3Jlb3JkZXIKLQkuY3Bsb2FkCSQyNQotCS5zZXQJcmVvcmRlcgotCS5jcHJlc3RvcmUJMAotCWphbAkkMjUKLQlqYWwJJDQsJDI1Ci0JamFsCXRleHRfbGFiZWwKLQlqYWwJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCQotIyBUZXN0IGogYXMgd2VsbAkKLQlqCXRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2ZGNhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgUjMwMDAgamFsLXhnb3QKLSNhczogLW1pcHMxIC1LUElDIC14Z290IC1tY3B1PXIzMDAwCi0jc291cmNlOiBqYWwtc3ZyNHBpYy5zCi0KLSMgVGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx1aQlcJGdwLDB4MAotWyAJXSowOiBSX01JUFNfSEkxNglfZ3BfZGlzcAotMCswMDA0IDxbXj5dKj4gYWRkaXUJXCRncCxcJGdwLDAKLVsgCV0qNDogUl9NSVBTX0xPMTYJX2dwX2Rpc3AKLTArMDAwOCA8W14+XSo+IGFkZHUJXCRncCxcJGdwLFwkdDkKLTArMDAwYyA8W14+XSo+IHN3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMTAgPFtePl0qPiBqYWxyCVwkdDkKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDAxYyA8W14+XSo+IGphbHIJXCRhMCxcJHQ5Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMjggPFtePl0qPiBub3AKLTArMDAyYyA8W14+XSo+IGx3CVwkdDksMFwoXCRncFwpCi1bIAldKjJjOiBSX01JUFNfR09UMTYJLnRleHQKLTArMDAzMCA8W14+XSo+IG5vcAotMCswMDM0IDxbXj5dKj4gYWRkaXUJXCR0OSxcJHQ5LDAKLVsgCV0qMzQ6IFJfTUlQU19MTzE2CS50ZXh0Ci0wKzAwMzggPFtePl0qPiBqYWxyCVwkdDkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDA0NCA8W14+XSo+IGx1aQlcJHQ5LDB4MAotWyAJXSo0NDogUl9NSVBTX0NBTExfSEkxNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwNDggPFtePl0qPiBhZGR1CVwkdDksXCR0OSxcJGdwCi0wKzAwNGMgPFtePl0qPiBsdwlcJHQ5LDBcKFwkdDlcKQotWyAJXSo0YzogUl9NSVBTX0NBTExfTE8xNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGphbHIJXCR0OQotMCswMDU4IDxbXj5dKj4gbm9wCi0wKzAwNWMgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDYwIDxbXj5dKj4gYgkwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiNTg2Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGphbAotCi0jIFRlc3QgdGhlIGphbCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGphbHIJXCRhMCxcJHQ5Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGphbAkwKyA8dGV4dF9sYWJlbD4KLVsgCV0qMTA6IChNSVBTX0pNUHxNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJLnRleHQKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gamFsCTArIDx0ZXh0X2xhYmVsPgotWyAJXSoxODogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQlleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwMWMgPFtePl0qPiBub3AKLTArMDAyMCA8W14+XSo+IGoJMCsgPHRleHRfbGFiZWw+Ci1bIAldKjIwOiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGoJMCsgPHRleHRfbGFiZWw+Ci1bIAldKjI4OiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDAyYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWJlOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBqYWwgbWFjcm8uCi0JLmdsb2JsCXRleHRfbGFiZWwJLnRleHQKLXRleHRfbGFiZWw6CQotCWphbAkkMjUKLQlqYWwJJDQsJDI1Ci0JamFsCXRleHRfbGFiZWwKLQlqYWwJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCQotIyBUZXN0IGogYXMgd2VsbAkKLQlqCXRleHRfbGFiZWwKLQlqCWV4dGVybmFsX3RleHRfbGFiZWwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyOTU3MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxhLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotCi0jIFRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAotMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDFjIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMjQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0Ci1bIAldKjUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo1NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0Ci1bIAldKjY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODQKLVsgCV0qNjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MwotWyAJXSo2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKjc0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKjc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA3YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MwotWyAJXSo4MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE1MzgzCi1bIAldKjg0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODQKLVsgCV0qODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA5MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBiMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODQKLVsgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNTM4NAotWyAJXSpiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2MzgzCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYzggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGQwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGQ4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGUwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2MzgzCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBmMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODMKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmY4OiBSRUxISQlleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMjUyCi1bIAldKmZjOiBSRUxMTwlleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAxMDAgPFtePl0qPiBsaQlcJGEwLDI0OAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRmNWUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMucworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotdGV4dF9sYWJlbDoJCi0JbGEJJDQsMAotCWxhCSQ0LDEKLQlsYQkkNCwweDgwMDAKLQlsYQkkNCwtMHg4MDAwCi0JbGEJJDQsMHgxMDAwMAotCWxhCSQ0LDB4MWE1YTUKLQlsYQkkNCwwKCQ1KQotCWxhCSQ0LDEoJDUpCi0JbGEJJDQsMHg4MDAwKCQ1KQotCWxhCSQ0LC0weDgwMDAoJDUpCi0JbGEJJDQsMHgxMDAwMCgkNSkKLQlsYQkkNCwweDFhNWE1KCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxhCSQ0LGRhdGFfbGFiZWwrMQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGEJJDQsZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCi1zZWNvbmRfdGV4dF9sYWJlbDoJCi0JbGEJJDQsZXh0ZXJuYWxfdGV4dF9sYWJlbCAtIHRleHRfbGFiZWwKLQlsYQkkNCxzZWNvbmRfdGV4dF9sYWJlbCAtIHRleHRfbGFiZWwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOGEzZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxhLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDIC0tZGVmc3ltIEtQSUM9MQotI3NvdXJjZTogbGEucwotCi0jIFRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAotMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDFjIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMjQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwNTQgPFtePl0qPiBub3AKLTArMDA1OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjU4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjY4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA3MCA8W14+XSo+IG5vcAotMCswMDc0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNzQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjc4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMDdjIDxbXj5dKj4gbm9wCi0wKzAwODAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSo4MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMDg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qODQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDg4IDxbXj5dKj4gbm9wCi0wKzAwOGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSo4YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDA5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjkwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IG5vcAotMCswMDk4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDA5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjljOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGEwIDxbXj5dKj4gbm9wCi0wKzAwYTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBub3AKLTArMDBiMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbm9wCi0wKzAwYmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMGMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYzA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKmM4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpjYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBkMCA8W14+XSo+IG5vcAotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKLVsgCV0qZDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmQ4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBkYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSplMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDBlOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmU4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZjg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDEwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDEwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDEwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEwODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMTE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTE4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDEyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDEyNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDEyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEyODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSoxMzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEzODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDEzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSoxNDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE0ODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxNGMgPFtePl0qPiBub3AKLTArMDE1MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qMTUwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTU0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE1OCA8W14+XSo+IG5vcAotMCswMTVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTYwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY0IDxbXj5dKj4gbm9wCi0wKzAxNjggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNmM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzAgPFtePl0qPiBub3AKLTArMDE3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE3ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gbm9wCi0wKzAxODAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAxODQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxODQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxODggPFtePl0qPiBub3AKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qMThjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxOTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxOTQgPFtePl0qPiBub3AKLTArMDE5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKLVsgCV0qMTk4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxOWM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMWEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxYTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoxYTQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxYTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxYWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxYjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMWJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWJjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxYzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswMWM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWNjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswMWQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMWRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWRjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDFlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzAxZTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxZWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZWM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDFmNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjFmNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMWY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWZjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjAwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAyMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSoyMDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDIwOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDIwYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIwYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDIxNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qMjE0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjFjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMjI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswMjI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjJjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyMzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzAyMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyM2M6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDI0NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDI0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI0YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI0YzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyNTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzAyNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyNWM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNjAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDI2NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qMjY0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyNmM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDI3NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qMjc0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyN2M6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjgwIDxbXj5dKj4gbm9wCi0wKzAyODQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyODQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyODggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyOGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyOGM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbm9wCi0wKzAyOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyOTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOWMgPFtePl0qPiBub3AKLTArMDJhMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJhNDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhOCA8W14+XSo+IG5vcAotMCswMmFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmIwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjQgPFtePl0qPiBub3AKLTArMDJiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJiYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJjMCA8W14+XSo+IG5vcAotMCswMmM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMmM0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyYzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyY2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyZDAgPFtePl0qPiBub3AKLTArMDJkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjJkNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMmQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmRjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDJlMCA8W14+XSo+IG5vcAotMCswMmU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qMmU0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMmU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmVjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmVjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmMCA8W14+XSo+IG5vcAotMCswMmY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDJmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJmYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMwMCA8W14+XSo+IG5vcAotMCswMzA0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDMwOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMwYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjMwYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMxMCA8W14+XSo+IG5vcAotMCswMzE0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDMxOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMxYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjMxYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzIwIDxbXj5dKj4gbm9wCi0wKzAzMjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMzI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzJjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMzMwIDxbXj5dKj4gbm9wCi0wKzAzMzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSozMzQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDMzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMzYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjMzYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDM0MCA8W14+XSo+IG5vcAotMCswMzQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKLVsgCV0qMzQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozNGM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMzUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAzNTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKjM1NDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDM1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDM1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM2MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjM2MDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDM2OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDM2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDM3MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM3NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjM3NDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM3OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMzdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMzgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMzg0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzg4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzhjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAzOTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAzOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozOWM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNhMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswM2E0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswM2E4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswM2FjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2IwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qM2IwOiBSX01JUFNfR09UMTYJLmJzcwotMCswM2I0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAzYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKjNiODogUl9NSVBTX0xPMTYJLmJzcwotMCswM2JjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswM2MwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2M0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qM2M0OiBSX01JUFNfR09UMTYJLmJzcwotMCswM2M4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAzY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMxNzY4Ci1bIAldKjNjYzogUl9NSVBTX0xPMTYJLmJzcwotMCswM2QwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswM2Q0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2Q4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qM2Q4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDNkYyA8W14+XSo+IG5vcAotMCswM2UwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSozZTA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAzZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozZTg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2VjIDxbXj5dKj4gbm9wCi0wKzAzZjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAzZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozZjg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZmMgPFtePl0qPiBub3AKLTArMDQwMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDQwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQwODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQwYyA8W14+XSo+IG5vcAotMCswNDEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswNDE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDE4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MWMgPFtePl0qPiBub3AKLTArMDQyMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDQyNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQyODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDQyYyA8W14+XSo+IG5vcAotMCswNDMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSo0MzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDQzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQzODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDQzYyA8W14+XSo+IG5vcAotMCswNDQwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMTc2OAotWyAJXSo0NDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDQ0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQ0ODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzA0NGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDQ1MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjQ1MDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDQ1NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDQ1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ1YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQ1YzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDQ2NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzA0NjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0NmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0NzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0NzA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDQ3OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzA0N2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0ODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0ODQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0ODQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ODggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDQ4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzA0OTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0OTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0OTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0OTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ5YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNGEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDRhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRhYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjRhYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDRiMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNGI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNGI0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA0YjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0YmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0YzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0YzA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA0YzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDRjOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjRjODogUl9NSVBTX0xPMTYJLmJzcwotMCswNGNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNGQ0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDRkOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNGRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSo0ZGM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzA0ZTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0ZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0ZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0ZTg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA0ZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzA0ZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0ZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0ZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0ZmM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDUwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDUwOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDUwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDUxMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjUxMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDUxNCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNTE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswNTFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNTIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTI0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1MjggPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDUyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDUzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDUzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDUzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjUzODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDUzYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNTQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSo1NDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDU0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDU0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDU0YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU0YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDU1MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNTU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMjEzMQotWyAJXSo1NTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDU1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDU1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNWNkMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxhLXhnb3QKLSNhczogLW1pcHMxIC1LUElDIC14Z290IC0tZGVmc3ltIEtQSUM9MQotI3NvdXJjZTogbGEucwotCi0jIFRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAotMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDFjIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMjQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwNTQgPFtePl0qPiBub3AKLTArMDA1OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjU4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjVjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjY0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA3MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjcwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjc0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qN2M6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qODA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjg4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo4YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5MCA8W14+XSo+IG5vcAotMCswMDk0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qOTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjk4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMDljIDxbXj5dKj4gbm9wCi0wKzAwYTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSphMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGE4IDxbXj5dKj4gbm9wCi0wKzAwYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSphYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBiMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpiMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpiODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBub3AKLTArMDBjMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qYzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpjYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkMCA8W14+XSo+IG5vcAotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDBkOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpkODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBlMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmUwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gbm9wCi0wKzAwZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMGVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmVjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpmNDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY4IDxbXj5dKj4gbm9wCi0wKzAwZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMTAwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTAwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTA0IDxbXj5dKj4gbm9wCi0wKzAxMDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSoxMDg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEwYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEwYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDExMCA8W14+XSo+IG5vcAotMCswMTE0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKLVsgCV0qMTE0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMTg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxMjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKjEyMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEyNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDEyOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMjg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTMwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMTNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTQwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE0MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjE0ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMTU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTU4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE1ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE2MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjE2MDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTY4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMTZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTcwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE3MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTc4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxN2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDE4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDE4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDE4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE4ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSoxOTA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDE5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE5ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE5YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMWEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSoxYTA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFhODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxYWMgPFtePl0qPiBub3AKLTArMDFiMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qMWIwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMWI0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFiNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxYmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWMwIDxbXj5dKj4gbm9wCi0wKzAxYzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAxYzggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWM4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWQwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ0IDxbXj5dKj4gbm9wCi0wKzAxZDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAxZGMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWRjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWU0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWU4IDxbXj5dKj4gbm9wCi0wKzAxZWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAxZjAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWYwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxZjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmYyA8W14+XSo+IG5vcAotMCswMjAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswMjA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjA0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMjA4IDxbXj5dKj4gbm9wCi0wKzAyMGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKjIwYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMjEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjEwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjE0IDxbXj5dKj4gbm9wCi0wKzAyMTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKjIxODogUl9NSVBTX0xPMTYJLmJzcwotMCswMjFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjFjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDIyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMjI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjI0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjJjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjIyYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyMzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyMzQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAyM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswMjQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI0NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI0YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI0YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMjU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDI1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI1YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNWM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyNjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyNjQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNjggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDI2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzAyNzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyNzQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjc0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyN2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI4MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMjg0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDI4OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI4YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI4YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI5MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMjk0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjk0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyOWM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDJhNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjJhNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMmE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMmFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmFjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDJiMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMmI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSoyYjQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyYmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmJjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJjMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDJjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjJjNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDJjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDJkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDJkNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyZDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyZGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyZGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDJlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDJlYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyZWM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyZjQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDJmYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDMwMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDMwNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSozMDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDMwYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjMwYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAzMTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzAzMTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzMWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozMWM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAzMjAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDMyNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qMzI0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzMmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozMmM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAzMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDMzNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qMzM0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozM2M6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMzQwIDxbXj5dKj4gbm9wCi0wKzAzNDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSozNDQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAzNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNGMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMzRjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDM1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjM1NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTggPFtePl0qPiBub3AKLTArMDM1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM2MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSozNjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAzNjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSozNjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNmMgPFtePl0qPiBub3AKLTArMDM3MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSozNzQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAzN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSozN2M6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODAgPFtePl0qPiBub3AKLTArMDM4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM4OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSozODg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDM5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjM5MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzk0IDxbXj5dKj4gbm9wCi0wKzAzOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozOWM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAzYTAgPFtePl0qPiBub3AKLTArMDNhNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjNhNDogUl9NSVBTX0xPMTYJLmJzcwotMCswM2E4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2FjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qM2FjOiBSX01JUFNfR09UMTYJLmJzcwotMCswM2IwIDxbXj5dKj4gbm9wCi0wKzAzYjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSozYjQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDNiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjNiYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAzYzAgPFtePl0qPiBub3AKLTArMDNjNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKjNjNDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDNjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNjYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSozY2M6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2QwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qM2Q0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkOCA8W14+XSo+IG5vcAotMCswM2RjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDNlMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNlNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSozZTQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAzZWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSozZWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZjAgPFtePl0qPiBub3AKLTArMDNmNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAzZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzZmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qM2ZjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDAwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNDA0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDA4IDxbXj5dKj4gbm9wCi0wKzA0MGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswNDEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjQxNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNDFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNDFjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MjAgPFtePl0qPiBub3AKLTArMDQyNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzA0MjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0MmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0MmM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA0MzAgPFtePl0qPiBub3AKLTArMDQzNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKjQzNDogUl9NSVBTX0xPMTYJLmJzcwotMCswNDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDNjOiBSX01JUFNfR09UMTYJLmJzcwotMCswNDQwIDxbXj5dKj4gbm9wCi0wKzA0NDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMQotWyAJXSo0NDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDQ0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ0YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQ0YzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzA0NTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDQ1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qNDU0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswNDU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNDVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDYwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjQ2MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA0NjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo0Njg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0NzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzA0NzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0NzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0N2MgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNDdjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNDg0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDg4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0OGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzA0OTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0OTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0OTggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNDk4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNGEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNGEwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0YTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzA0YWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0YjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0YjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNGI0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA0YmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo0YmM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNGM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswNGM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNGQwOiBSX01JUFNfR09UMTYJLmJzcwotMCswNGQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0ZDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKjRkODogUl9NSVBTX0xPMTYJLmJzcwotMCswNGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNGU0OiBSX01JUFNfR09UMTYJLmJzcwotMCswNGU4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0ZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMxNzY4Ci1bIAldKjRlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswNGYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNGY4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDRmYyA8W14+XSo+IG5vcAotMCswNTAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSo1MDA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzA1MDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1MDggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTA4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDUxMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjUxMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MTQgPFtePl0qPiBub3AKLTArMDUxOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDUxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDUyMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1MjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA1MjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo1Mjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MmMgPFtePl0qPiBub3AKLTArMDUzMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDUzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDUzOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1Mzg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1M2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA1NDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo1NDA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDQgPFtePl0qPiBub3AKLTArMDU0OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDU0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDU1MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1NTA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU1NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDU1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjU1ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTVjIDxbXj5dKj4gbm9wCi0wKzA1NjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzA1NjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1NjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1Njg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA1NmMgPFtePl0qPiBub3AKLTArMDU3MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qNTcwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzA1NzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1NzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1Nzg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA1N2MgPFtePl0qPiBub3AKLTArMDU4MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKLVsgCV0qNTgwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzA1ODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1ODggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1ODg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswNThjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1OTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo1OTA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzA1OTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1OTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1OWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTljOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDVhMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDVhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjVhNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1YTggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDVhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzA1YjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1YjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1YjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNWI4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNWJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNWMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNWMwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNWM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1YzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswNWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNWQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNWQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjVkNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDVkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjVkYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVlMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNWU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDVlOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDVlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDVmMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1ZjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDVmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDVmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjVmODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNWZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA2MDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswNjA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNjA4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNjBjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjBjOiBSX01JUFNfR09UMTYJLmJzcwotMCswNjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA2MTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo2MTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDYxOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDYxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDYyMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjYyMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDYyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNjI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qNjI4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA2MmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2MzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2MzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2MzQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswNjM4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA2M2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKjYzYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDY0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDY0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDY0OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2NDg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNjRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNjUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNjUwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDY1NCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNjU4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswNjVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNjYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNjY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY2NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDY2OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDY2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjY2YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDY3MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNjc0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswNjc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNjdjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNjgwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY4MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDY4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDY4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjY4ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDY4YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNjkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswNjk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNjk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNjljIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY5YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNmEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNmE0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA2YTggPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDZhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDZiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDZiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDZiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjZiODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDZiYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNmMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSo2YzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDZjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDZjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDZjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjZjYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDZkMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNmQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMjEzMQotWyAJXSo2ZDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDZkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDZkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlYWExZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxhCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIGxhIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAxYyA8W14+XSo+IGxpCVwkYTAsMAotMCswMDIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDI0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMmMgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA3MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMDc4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qNzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDdjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA4MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA4NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDg4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSo5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGE0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qYTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGE4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGIwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBjYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDBkYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDBlMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSplNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTBjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTEwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjExMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTE4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjEyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjEyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE0NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE0OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTUwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE1NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE3YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE4MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTg4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTk0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE5NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTk4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSoxYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWE4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qMWI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWJjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFjOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKjFjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZDAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjFkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZGMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKjFlODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZjAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjA4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qMjEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDIxNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIxOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIzMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI2YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI3OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjg0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjkwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjljIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjJhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJhOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJiOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjJiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYzAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMmM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJjYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmQwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJlNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJlNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmYwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmZjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzA4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDMwYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjMwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzE4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMyMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMzOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzM2MgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzQ4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzUwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzVjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM2MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OGM4MTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsYSBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGEJJDQsMAotCWxhCSQ0LDEKLQlsYQkkNCwweDgwMDAKLQlsYQkkNCwtMHg4MDAwCi0JbGEJJDQsMHgxMDAwMAotCWxhCSQ0LDB4MWE1YTUKLQlsYQkkNCwwKCQ1KQotCWxhCSQ0LDEoJDUpCi0JbGEJJDQsMHg4MDAwKCQ1KQotCWxhCSQ0LC0weDgwMDAoJDUpCi0JbGEJJDQsMHgxMDAwMCgkNSkKLQlsYQkkNCwweDFhNWE1KCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxhCSQ0LGRhdGFfbGFiZWwrMQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGEJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxhCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGEJJDQsZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQotCS5pZm5kZWYJS1BJQwotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQkuZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNGEzMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo1ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDVjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjggPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2YyA8W14+XSo+IGxiCVwkYTAsLTE1Mzg0XChcJGdwXCkKLVsgCV0qNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDcwIDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDc0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qNzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjgwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSo4NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODggPFtePl0qPiBsYglcJGEwLC0xNTM4M1woXCRncFwpCi1bIAldKjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDA5MCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGEwXCkKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDA5OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBiOCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGEwXCkKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGMwIDxbXj5dKj4gbGIJXCRhMCwtMTUzODRcKFwkYTBcKQotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYzggPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRhMFwpCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSpkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGQ4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGUwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGU4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRhMFwpCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBmOCA8W14+XSo+IGxiCVwkYTAsLTE1MzgzXChcJGEwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGZjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjZmRmOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxiIG1hY3JvIHdpdGggUElDIGNvZGUuCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxiCSQ0LDAKLQlsYgkkNCwxCi0JbGIJJDQsMHg4MDAwCi0JbGIJJDQsLTB4ODAwMAotCWxiCSQ0LDB4MTAwMDAKLQlsYgkkNCwweDFhNWE1Ci0JbGIJJDQsMCgkNSkKLQlsYgkkNCwxKCQ1KQotCWxiCSQ0LDB4ODAwMCgkNSkKLQlsYgkkNCwtMHg4MDAwKCQ1KQotCWxiCSQ0LDB4MTAwMDAoJDUpCi0JbGIJJDQsMHgxYTVhNSgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYgkkNCxkYXRhX2xhYmVsKzEKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxiCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODg0ZDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDCi0jc291cmNlOiBsYi1waWMucwotCi0jIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA1OCA8W14+XSo+IG5vcAotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwNjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbm9wCi0wKzAwNmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo3YzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjg4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSphNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBhOCA8W14+XSo+IG5vcAotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qYWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBiMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwYjggPFtePl0qPiBub3AKLTArMDBiYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmJjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGMwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmM0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IG5vcAotMCswMGNjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmQwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gbm9wCi0wKzAwZDggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZGM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTAgPFtePl0qPiBub3AKLTArMDBlNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSplODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGVjIDxbXj5dKj4gbm9wCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZjQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwZjggPFtePl0qPiBub3AKLTArMDBmYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTA0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTA4IDxbXj5dKj4gbm9wCi0wKzAxMGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoxMGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDExMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTE4IDxbXj5dKj4gbm9wCi0wKzAxMWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxMWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTI4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IG5vcAotMCswMTMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTM0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEzODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IG5vcAotMCswMTQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE0ODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IG5vcAotMCswMTUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTU0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE1ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gbm9wCi0wKzAxNjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTY4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTZjIDxbXj5dKj4gbm9wCi0wKzAxNzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE3OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxN2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxODAgPFtePl0qPiBub3AKLTArMDE4NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjE4NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMThjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxOTQgPFtePl0qPiBub3AKLTArMDE5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE5ODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDE5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYTQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE4IDxbXj5dKj4gbm9wCi0wKzAxYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWI0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWI4IDxbXj5dKj4gbm9wCi0wKzAxYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWM0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWM4IDxbXj5dKj4gbm9wCi0wKzAxY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWQ0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDggPFtePl0qPiBub3AKLTArMDFkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZTggPFtePl0qPiBub3AKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjFlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWY0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFmODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFmYyA8W14+XSo+IG5vcAotMCswMjAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMjAwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMDggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjBjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGJkMjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYi14Z290LWlsb2NrcwotI2FzOiAtbWlwczEgLUtQSUMgLXhnb3QgLW1jcHU9cjM5MDAKLSNzb3VyY2U6IGxiLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8gd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8Lio+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8Lio+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8Lio+IGx1aQlcJGEwLDB4MQotMCswMDBjIDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPC4qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPC4qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8Lio+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8Lio+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPC4qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDwuKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPC4qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPC4qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8Lio+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQk1NDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMDU4IDwuKj4gbm9wCi0wKzAwNWMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJNWM6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMDYwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA2NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJNjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDZjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNzQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTc0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDdjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTdjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDgwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA4NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJODQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwOGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJOGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDk0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQk5NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDljIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTljOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGE0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCWE0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDBhOCA8Lio+IG5vcAotMCswMGFjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCWFjOiBSX01JUFNfTE8xNglcLmJzcwotMCswMGIwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBiNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQliNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAwYjggPC4qPiBub3AKLTArMDBiYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQliYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDBjMCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYzQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJYzQ6IFJfTUlQU19HT1QxNglcLmRhdGEKLTArMDBjOCA8Lio+IG5vcAotMCswMGNjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCWNjOiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDBkMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZDQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCWQ0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBkYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQlkYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGU0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQllNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBlYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQllYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZjQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCWY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGZjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCWZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEwNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTA0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxMGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTBjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMTAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTE0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTExNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxMTggPC4qPiBub3AKLTArMDExYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxMWM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxMjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTEyNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxMjggPC4qPiBub3AKLTArMDEyYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkxMmM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxMzAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTM0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTEzNDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMTM4IDwuKj4gbm9wCi0wKzAxM2MgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMTNjOiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDE0MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE0NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNDggPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE0ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNGMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNTAgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTUwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE1NCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE1OCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNWMgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE1YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE2NCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxNjQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNmMgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTcwIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxNzA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNzggPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTc4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTgwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE4NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTg0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxODggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxOGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMThjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxOTQgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTk4IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTE5ODogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxOWMgPC4qPiBub3AKLTArMDFhMCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxYTA6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxYTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYTggPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWFjIDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTFhYzogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxYjAgPC4qPiBub3AKLTArMDFiNCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkxYjQ6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxYjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYmMgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWMwIDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTFjMDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMWM0IDwuKj4gbm9wCi0wKzAxYzggPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMWM4OiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDFjYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZDQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTFkNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxZGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMWRjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlNCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZTggPC4qPiBsdWkJXCRhMCwweDAKLQkJCTFlODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFmMCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxZjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZjQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZjggPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWZjIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyMDQgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMjA0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjA4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjBjIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDIxMCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMjEwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyMTggPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMjE4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMWMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTIyNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAyMjggPC4qPiBub3AKLTArMDIyYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkyMmM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAyMzAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMzQgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjM4IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTIzODogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAyM2MgPC4qPiBub3AKLTArMDI0MCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkyNDA6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAyNDQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNDggPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjRjIDwuKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMThjNjdlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYi14Z290Ci0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtbWNwdT1yMzAwMAotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1NDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwNTggPFtePl0qPiBub3AKLTArMDA1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjVjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDYwIDxbXj5dKj4gbm9wCi0wKzAwNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA3MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjcwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IG5vcAotMCswMDc4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo3YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA4NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjg0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDg4IDxbXj5dKj4gbm9wCi0wKzAwOGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDkwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjkwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qOTg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOWMgPFtePl0qPiBub3AKLTArMDBhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qYTQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBhYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmFjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBub3AKLTArMDBiNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBiYyA8W14+XSo+IG5vcAotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qYzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmNjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGQwIDxbXj5dKj4gbm9wCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSpkNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGQ4IDxbXj5dKj4gbm9wCi0wKzAwZGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZTA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGU0IDxbXj5dKj4gbm9wCi0wKzAwZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSplODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBlYyA8W14+XSo+IG5vcAotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBmNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpmYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMDAgPFtePl0qPiBub3AKLTArMDEwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMDggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTA4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTEwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTE0IDxbXj5dKj4gbm9wCi0wKzAxMTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTFjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjExYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjEyNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEyOCA8W14+XSo+IG5vcAotMCswMTJjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEzMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMzA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjEzODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbm9wCi0wKzAxNDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTQ0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTQ4IDxbXj5dKj4gbm9wCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE1MCA8W14+XSo+IG5vcAotMCswMTU0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE1ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE1YyA8W14+XSo+IG5vcAotMCswMTYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMTYwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNmM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTcwIDxbXj5dKj4gbm9wCi0wKzAxNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNzQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxNzggPFtePl0qPiBub3AKLTArMDE3YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE4MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxODQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTg0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE4YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjE4YzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTAgPFtePl0qPiBub3AKLTArMDE5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxOWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTljOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWE0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE4IDxbXj5dKj4gbm9wCi0wKzAxYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWI0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFiNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFiYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IG5vcAotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFjYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxY2M6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFkNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFkNDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQ4IDxbXj5dKj4gbm9wCi0wKzAxZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWU0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWU4IDxbXj5dKj4gbm9wCi0wKzAxZWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxZWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmMCA8W14+XSo+IG5vcAotMCswMWY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWY4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFmYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDIwMCA8W14+XSo+IG5vcAotMCswMjA0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMjA0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMDggPFtePl0qPiBub3AKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIxMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjE4IDxbXj5dKj4gbm9wCi0wKzAyMWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyMWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyMjAgPFtePl0qPiBub3AKLTArMDIyNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjJjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDIzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjIzNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBub3AKLTArMDIzYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI0MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyNDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjQ0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjRjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjUwIDxbXj5dKj4gbm9wCi0wKzAyNTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI1YzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI2NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI2OCA8W14+XSo+IG5vcAotMCswMjZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjcwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDI3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI3YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjgwIDxbXj5dKj4gbm9wCi0wKzAyODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyODggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjhjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjhjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjkwIDxbXj5dKj4gbm9wCi0wKzAyOTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyOTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI5OCA8W14+XSo+IG5vcAotMCswMjljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmEwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJhNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJhOCA8W14+XSo+IG5vcAotMCswMmFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMmFjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyYjAgPFtePl0qPiBub3AKLTArMDJiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJiOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyYmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1YzRjNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIGxiIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSo1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDZjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDcwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwNzggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMDdjIDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSo3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSo4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTAgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDljIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTQgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKmE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGIwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qYjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwZDggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDBlMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDBlNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSplNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSplODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGZjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTA4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTBjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDExMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjExMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDExYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjExYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjEyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE0OCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE1MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTU4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTc4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTgwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTg0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE4OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5NCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDFiYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjFiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjFjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDFkMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkYyA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFlMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWYwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qMWYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWZjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDIwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKjIwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMTAgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjIxMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIxNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDIxOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjI0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIyOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjMwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjNjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI0MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNDggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjU0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjYwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI2YyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI3OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyN2MgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyODQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjkwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjljIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmI0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmI4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJjYyA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmQ4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmU0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmY0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmZjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzA4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSozMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzE0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDMxOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMmMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM0NCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNWMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzNjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM2YyA8W14+XSo+IGxidQlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzAgPFtePl0qPiBsaAlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzQgPFtePl0qPiBsaHUJXCRhMCwwXChcJHplcm9cKQotMCswMzc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMzdjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM4MCA8W14+XSo+IGx3cglcJGEwLDBcKFwkemVyb1wpCi0wKzAzODQgPFtePl0qPiBsd2MwCVwkNCwwXChcJHplcm9cKQotMCswMzg4IDxbXj5dKj4gbHdjMQlcJGY0LDBcKFwkemVyb1wpCi0wKzAzOGMgPFtePl0qPiBsd2MyCVwkNCwwXChcJHplcm9cKQotMCswMzkwIDxbXj5dKj4gbHdjMwlcJDQsMFwoXCR6ZXJvXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzY2NhZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxiIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsYgkkNCwwCi0JbGIJJDQsMQotCWxiCSQ0LDB4ODAwMAotCWxiCSQ0LC0weDgwMDAKLQlsYgkkNCwweDEwMDAwCi0JbGIJJDQsMHgxYTVhNQotCWxiCSQ0LDAoJDUpCi0JbGIJJDQsMSgkNSkKLQlsYgkkNCwweDgwMDAoJDUpCi0JbGIJJDQsLTB4ODAwMCgkNSkKLQlsYgkkNCwweDEwMDAwKCQ1KQotCWxiCSQ0LDB4MWE1YTUoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGIJJDQsZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JbGIJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGIJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsYgkkNCxkYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIFNldmVyYWwgbWFjcm9zIGFyZSBoYW5kbGVkIGxpa2UgbGIuICBTYW5pdHkgY2hlY2sgdGhlbS4KLQlsYnUJJDQsMAotCWxoCSQ0LDAKLQlsaHUJJDQsMAotCWx3CSQ0LDAKLQlsd2wJJDQsMAotCWx3cgkkNCwwCi0JbHdjMAkkNCwwCi0JbHdjMQkkNCwwCi0JbHdjMgkkNCwwCi0JbHdjMwkkNCwwCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTYxZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMgLS1kZWZzeW0gRU1QSUM9MQotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOTQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRncFwpCi1bIAldKjk0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBiYyA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKLVsgCV0qYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGMwIDxbXj5dKj4gbHcJXCRhMCwtMTUzODRcKFwkZ3BcKQotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzQgPFtePl0qPiBsdwlcJGExLC0xNTM4MFwoXCRncFwpCi1bIAldKmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBjYyA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qY2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGRjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSplYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGY0IDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSpmNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLC0xNTM4M1woXCRncFwpCi1bIAldKmY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsLTE1Mzc5XChcJGdwXCkKLVsgCV0qZmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTAwIDxbXj5dKj4gbm9wCi0wKzAxMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxMDggPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTBjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDExMCA8W14+XSo+IG5vcAotMCswMTE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyMCA8W14+XSo+IG5vcAotMCswMTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjEyYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBub3AKLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjEzODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbm9wCi0wKzAxNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBub3AKLTArMDE1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGF0XCkKLVsgCV0qMTVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE2MCA8W14+XSo+IG5vcAotMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTY4IDxbXj5dKj4gbHcJXCRhMCwtMTUzODRcKFwkYXRcKQotWyAJXSoxNjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTZjIDxbXj5dKj4gbHcJXCRhMSwtMTUzODBcKFwkYXRcKQotWyAJXSoxNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTcwIDxbXj5dKj4gbm9wCi0wKzAxNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDE4MCA8W14+XSo+IG5vcAotMCswMTg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5MCA8W14+XSo+IG5vcAotMCswMTk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTk4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBub3AKLTArMDFhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gbm9wCi0wKzAxYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxYjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBub3AKLTArMDFjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFjOCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMWM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFjYyA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFkMCA8W14+XSo+IG5vcAotMCswMWQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwtMTUzODNcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSwtMTUzNzlcKFwkYXRcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MtYWRkcjMyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0NmQ2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZAorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLSNuYW1lOiBNSVBTIGxkLWlsb2NrcwotI3NvdXJjZTogbGQucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPC50ZXh0PiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwODQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwYyA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qMTEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTljIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1NCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJhNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYzAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjJjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjQgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjMyNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMjggPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMzNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM0NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM2NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2EwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2E0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2E4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2FjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2IwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2I0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2I4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNjNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2M0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2QwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Q4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2RjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNlNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2U0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2U4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2VjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2YwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSo0MDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDA4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDBjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDc4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDg4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDhjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0OTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRhNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0YWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGI0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGI4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRjNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0Y2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0ZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNGUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGU4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGVjIDxbXj5dKj4gbHdjMQlcJGY1LDBcKFwkemVyb1wpCi0wKzA0ZjAgPFtePl0qPiBsd2MxCVwkZjQsNFwoXCR6ZXJvXCkKLTArMDRmNCA8W14+XSo+IGx3YzEJXCRmNSwxXChcJHplcm9cKQotMCswNGY4IDxbXj5dKj4gbHdjMQlcJGY0LDVcKFwkemVyb1wpCi0wKzA0ZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUwMCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNTA0IDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1MDggPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJHplcm9cKQotMCswNTBjIDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCR6ZXJvXCkKLTArMDUxMCA8W14+XSo+IGx3YzEJXCRmNSwwXChcJGExXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmNCw0XChcJGExXCkKLTArMDUxOCA8W14+XSo+IGx3YzEJXCRmNSwxXChcJGExXCkKLTArMDUxYyA8W14+XSo+IGx3YzEJXCRmNCw1XChcJGExXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTI4IDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCRhdFwpCi0wKzA1MmMgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKLTArMDUzMCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkYTFcKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCRhMVwpCi0wKzA1MzggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGY1LC0yMzEzMVwoXCRhdFwpCi1bIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IGx3YzEJXCRmNCwtMjMxMjdcKFwkYXRcKQotWyAJXSo1NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDggPFtePl0qPiBub3AKLTArMDU0YyA8W14+XSo+IHN3YzEJXCRmNSwwXChcJHplcm9cKQotMCswNTUwIDxbXj5dKj4gc3djMQlcJGY0LDRcKFwkemVyb1wpCi0wKzA1NTQgPFtePl0qPiBzd2MxCVwkZjUsMVwoXCR6ZXJvXCkKLTArMDU1OCA8W14+XSo+IHN3YzEJXCRmNCw1XChcJHplcm9cKQotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NjAgPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKLTArMDU2NCA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQotMCswNTY4IDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU2YyA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkemVyb1wpCi0wKzA1NzAgPFtePl0qPiBzd2MxCVwkZjUsMFwoXCRhMVwpCi0wKzA1NzQgPFtePl0qPiBzd2MxCVwkZjQsNFwoXCRhMVwpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZjUsMVwoXCRhMVwpCi0wKzA1N2MgPFtePl0qPiBzd2MxCVwkZjQsNVwoXCRhMVwpCi0wKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1OTAgPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJGExXCkKLTArMDU5NCA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkYTFcKQotMCswNTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjU5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1OWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZjUsLTIzMTMxXChcJGF0XCkKLVsgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVhNCA8W14+XSo+IHN3YzEJXCRmNCwtMjMxMjdcKFwkYXRcKQotWyAJXSo1YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE4IDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswNWFjIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswNWIwIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi1bIAldKjViMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDViNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDViOCA8W14+XSo+IGxkCVwkYTAsLTIzMTMxXChcJGEwXCkKLVsgCV0qNWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjViYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzA1YzQgPFtePl0qPiBzZAlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjVjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzggPFtePl0qPiBub3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjJiZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MuZAorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1JUFMgbGQtaWxvY2tzCi0jc291cmNlOiBsZC5zCi0jYXM6Ci0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPC50ZXh0PiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwODQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwYyA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qMTEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTljIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1NCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJhNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYzAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjJjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjQgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjMyNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMjggPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMzNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM0NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM2NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2EwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2E0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2E4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2FjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2IwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2I0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2I4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNjNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2M0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2QwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Q4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2RjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNlNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2U0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2U4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2VjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2YwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSo0MDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDA4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDBjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDc4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDg4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDhjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0OTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRhNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0YWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGI0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGI4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRjNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0Y2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0ZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNGUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGU4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGVjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkemVyb1wpCi0wKzA0ZjAgPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKLTArMDRmNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQotMCswNGY4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkemVyb1wpCi0wKzA0ZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUwMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTA0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1MDggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQotMCswNTBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDUxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJGExXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJGExXCkKLTArMDUxOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJGExXCkKLTArMDUxYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJGExXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTI4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1MmMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDUzMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCi0wKzA1MzggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0yMzEzMVwoXCRhdFwpCi1bIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMjMxMjdcKFwkYXRcKQotWyAJXSo1NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDggPFtePl0qPiBub3AKLTArMDU0YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNTUwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA1NTQgPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDU1OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NjAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU2NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTY4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU2YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1NzAgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1NzQgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1N2MgPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1OTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDU5NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjU5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1OWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTIzMTMxXChcJGF0XCkKLVsgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVhNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMjMxMjdcKFwkYXRcKQotWyAJXSo1YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE4IDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswNWFjIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswNWIwIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi1bIAldKjViMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDViNCA8W14+XSo+IChkfClhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1YjggPFtePl0qPiBsZAlcJGEwLC0yMzEzMVwoXCRhMFwpCi1bIAldKjViODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDViYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWMwIDxbXj5dKj4gKGR8KWFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDVjNCA8W14+XSo+IHNkCVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVjOCA8W14+XSo+IG5vcAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmNTJkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxkIG1hY3JvIHdpdGggUElDIGNvZGUuCi0JCi0JLnNldAltaXBzMQotCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxkCSQ0LDAKLQlsZAkkNCwxCi0JbGQJJDQsMHg4MDAwCi0JbGQJJDQsLTB4ODAwMAotCWxkCSQ0LDB4MTAwMDAKLQlsZAkkNCwweDFhNWE1Ci0JbGQJJDQsMCgkNSkKLQlsZAkkNCwxKCQ1KQotCWxkCSQ0LDB4ODAwMCgkNSkKLQlsZAkkNCwtMHg4MDAwKCQ1KQotCWxkCSQ0LDB4MTAwMDAoJDUpCi0JbGQJJDQsMHgxYTVhNSgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsZAkkNCxkYXRhX2xhYmVsKzEKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxkCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQkuaWZuZGVmCUVNUElDCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDQzZDc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC1zdnI0cGljCi0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQwotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSphMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYjA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjQgPFtePl0qPiBub3AKLTArMDBiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwYmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYzA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZDA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IG5vcAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSplMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBlNCA8W14+XSo+IG5vcAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qZTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBlYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwZjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpmMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBmNCA8W14+XSo+IG5vcAotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qZjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKmZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTA0IDxbXj5dKj4gbm9wCi0wKzAxMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxMDg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxMGM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTE0IDxbXj5dKj4gbm9wCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDEyMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEyMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyNCA8W14+XSo+IG5vcAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDEyYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxMzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMzA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzQgPFtePl0qPiBub3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxM2MgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTQwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTQwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBub3AKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTUwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTUwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTU0IDxbXj5dKj4gbm9wCi0wKzAxNTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxNTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE1YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTYwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTY0IDxbXj5dKj4gbm9wCi0wKzAxNjggPFtePl0qPiBsdwlcJGEwLDEwMDFcKFwkYXRcKQotWyAJXSoxNjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE2YyA8W14+XSo+IGx3CVwkYTEsMTAwNVwoXCRhdFwpCi1bIAldKjE2YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTcwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTcwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDE3NCA8W14+XSo+IG5vcAotMCswMTc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTdjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTgwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTgwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTg0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTg0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IG5vcAotMCswMThjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxOTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBub3AKLTArMDFhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWFjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWFjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gbm9wCi0wKzAxYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFjMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWM0IDxbXj5dKj4gbm9wCi0wKzAxYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFkNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFkNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFkOCA8W14+XSo+IG5vcAotMCswMWRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWUwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFlOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFlODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFlYyA8W14+XSo+IG5vcAotMCswMWYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWY0IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qMWY0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZjggPFtePl0qPiBsdwlcJGExLDEwMDRcKFwkYXRcKQotWyAJXSoxZjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFmYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyMDAgPFtePl0qPiBub3AKLTArMDIwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjIwODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjIwYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjIxMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTQgPFtePl0qPiBub3AKLTArMDIxOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIxYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyMjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjI0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI4IDxbXj5dKj4gbm9wCi0wKzAyMmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyMzAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjIzODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IG5vcAotMCswMjQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyNGMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNGM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IG5vcAotMCswMjU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDI1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyNjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNjA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNjQgPFtePl0qPiBub3AKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjI2YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMjcwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMjcwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNzggPFtePl0qPiBub3AKLTArMDI3YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI4MCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjI4MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjg0IDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMjg0OiBSX01JUFNfTE8xNgkuYnNzCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDI2MmNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC14Z290Ci0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdAotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYTA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGE4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qYTg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGFjIDxbXj5dKj4gbm9wCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmMwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBkMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBkOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmQ4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGRjIDxbXj5dKj4gbm9wCi0wKzAwZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGU0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qZjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IG5vcAotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMDQgPFtePl0qPiBub3AKLTArMDEwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjEwODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTBjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMTQgPFtePl0qPiBub3AKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCi1bIAldKjExODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKLVsgCV0qMTFjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMjA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTI0IDxbXj5dKj4gbm9wCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxMjg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxMmM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTMwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjEzODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBub3AKLTArMDE0MCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE0ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE1MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE1MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE1NCA8W14+XSo+IG5vcAotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTYwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTY4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTY4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTZjIDxbXj5dKj4gbm9wCi0wKzAxNzAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE4MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE4MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTg0IDxbXj5dKj4gbm9wCi0wKzAxODggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMThjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE5MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTk4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxOWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxOWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFhMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFhMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFhNCA8W14+XSo+IG5vcAotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKLVsgCV0qMWE4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQotWyAJXSoxYWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFiMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxYjQgPFtePl0qPiBub3AKLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFiYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDFjMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFjMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDFjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMWNjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMWNjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkMCA8W14+XSo+IG5vcAotMCswMWQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWUwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMWU4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMWU4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gbm9wCi0wKzAxZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyMDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyMDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDggPFtePl0qPiBub3AKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIxMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjIxODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjFjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMjIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMjIwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMjQgPFtePl0qPiBub3AKLTArMDIyOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAyMzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjM0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMjM4IDxbXj5dKj4gbm9wCi0wKzAyM2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyNDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI0NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjQ4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMjRjIDxbXj5dKj4gbm9wCi0wKzAyNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNTQgPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQotWyAJXSoyNTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI1OCA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKjI1ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMjVjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjVjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDI2MCA8W14+XSo+IG5vcAotMCswMjY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjY4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMjY4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjZjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMjZjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyNzggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyNzg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gbm9wCi0wKzAyODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyODQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDI4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyOGM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyOTQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyOTQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTggPFtePl0qPiBub3AKLTArMDI5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJhMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDJiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjJiMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJiNCA8W14+XSo+IG5vcAotMCswMmI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmJjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDJjMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyY2MgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyY2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJkMCA8W14+XSo+IG5vcAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDJkYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyZTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyZTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyZTQgPFtePl0qPiBub3AKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMmYwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmYwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyZjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyZjQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyZjggPFtePl0qPiBub3AKLTArMDJmYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMwMCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjMwMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMzA0IDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMzA0OiBSX01JUFNfTE8xNgkuYnNzCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODljZjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jYXM6IC1tY3B1PXI0MDAwCi0jbmFtZTogTUlQUyBsZAotCi0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDk0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjljOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSpiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBjMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSpjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBkNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSplYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSoxMDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTEwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qMTE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTZjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE3MCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5YyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjA0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIyMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjVjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjYwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI2OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjdjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBub3AKLTArMDI5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IG5vcAotMCswMmI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmMwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJjOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJkMCA8W14+XSo+IG5vcAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMwMCA8W14+XSo+IG5vcAotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMxOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzIwIDxbXj5dKj4gbm9wCi0wKzAzMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzQwIDxbXj5dKj4gbm9wCi0wKzAzNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzNDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDM1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzNTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDM2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM3MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzdjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM4MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzODggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzhjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNhMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDNhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNhOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNiMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswM2JjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2JjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDNjMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2M0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2M4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzZDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2QwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2UwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2VjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2VjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNmMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Y0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2Y4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNDAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjQxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDQxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQxOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQxYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQyMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo0MjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQyYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0MzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQzYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0NDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ1YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0Nzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0N2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0N2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ODAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ODggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0OGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0OGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0OTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0OTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0YTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNGE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDRhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0YjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRiOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0ZDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Zjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1MDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNTA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDUwYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjUwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1MTAgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCR6ZXJvXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJHplcm9cKQotMCswNTE4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkemVyb1wpCi0wKzA1MWMgPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCR6ZXJvXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1MjggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDUyYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1MzAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJHplcm9cKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkYTFcKQotMCswNTM4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkYTFcKQotMCswNTNjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkYTFcKQotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkYTFcKQotMCswNTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NDggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1NGMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU1MCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTU0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhMVwpCi0wKzA1NTggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGExXCkKLTArMDU1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjU1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU2NCA8W14+XSo+IGx3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTY4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NmMgPFtePl0qPiBub3AKLTArMDU3MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNTc0IDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDU3YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1ODQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU5MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1OTQgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1OTggPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1OWMgPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1YTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDVhOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVhYyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNWIwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1YjQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDViOCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNWJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVjNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjOCA8W14+XSo+IHN3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjYyA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDVkMCA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDVkNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjVkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDVkOCA8W14+XSo+IGRhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1ZGMgPFtePl0qPiBsZAlcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSo1ZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1ZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1ZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWU0IDxbXj5dKj4gZGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDVlOCA8W14+XSo+IHNkCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjVlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1ZWMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlZTNjMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxkIG1hY3JvLgotCQotCS5zZXQJbWlwczEKLQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsZAkkNCwwCi0JbGQJJDQsMQotCWxkCSQ0LDB4ODAwMAotCWxkCSQ0LC0weDgwMDAKLQlsZAkkNCwweDEwMDAwCi0JbGQJJDQsMHgxYTVhNQotCWxkCSQ0LDAoJDUpCi0JbGQJJDQsMSgkNSkKLQlsZAkkNCwweDgwMDAoJDUpCi0JbGQJJDQsLTB4ODAwMCgkNSkKLQlsZAkkNCwweDEwMDAwKCQ1KQotCWxkCSQ0LDB4MWE1YTUoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGQJJDQsZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JbGQJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGQJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsZAkkNCxkYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIGwuZCBhbmQgcy5kIGFyZSBzb3J0IG9mIGxpa2UgbGQuCi0JbC5kCSRmNCwwCi0JbC5kCSRmNCwxCi0JbC5kCSRmNCwweDgwMDAKLQlsLmQJJGY0LC0weDgwMDAKLQlsLmQJJGY0LDAoJDUpCi0JbC5kCSRmNCwxKCQ1KQotCWwuZAkkZjQsMHg4MDAwKCQ1KQotCWwuZAkkZjQsLTB4ODAwMCgkNSkKLQlsLmQJJGY0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCSMgTGl0dGxlIGVuZGlhbiB3aWxsIGluc2VydCBhIG5vcCBoZXJlLgotCSMgV2UgcHV0IGl0IGluIGV4cGxpY2l0bHkgc28gdGhhdCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gYXJlIHNpbWlsYXIuCi0Jbm9wCi0Jcy5kCSRmNCwwCi0Jcy5kCSRmNCwxCi0Jcy5kCSRmNCwweDgwMDAKLQlzLmQJJGY0LC0weDgwMDAKLQlzLmQJJGY0LDAoJDUpCi0Jcy5kCSRmNCwxKCQ1KQotCXMuZAkkZjQsMHg4MDAwKCQ1KQotCXMuZAkkZjQsLTB4ODAwMCgkNSkKLQlzLmQJJGY0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQotIyBzZCBpcyBoYW5kbGVkIGxpa2UgbGQuICBTYW5pdHkgY2hlY2sgaXQuCi0Jc2QJJDQsMAotCi0jIFNhbml0eSBjaGVjayB0aGUgLW1pcHMzIHZlcnNpb25zCi0JLnNldAltaXBzMwotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlMmIyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgbGkKLQotIyBUZXN0IHRoZSBsaSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDEwIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMWMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzYTYwMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGkgbWFjcm8uCi0KLWZvbzoKLQlsaQkkNCwwCi0JbGkJJDQsMQotCWxpCSQ0LDB4ODAwMAotCWxpCSQ0LC0weDgwMDAKLQlsaQkkNCwweDEwMDAwCi0JbGkJJDQsMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MGRjYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0LWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYyAtLWRlZnN5bSBFTVBJQz0xCi0jc291cmNlOiBsaWZsb2F0LnMKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3JvcyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2Mzg0Ci1bIAldKjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnJkYXRhLioKLTArMDAwNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMDggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0xNjM2OFwoXCRncFwpCi1bIAldKmM6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTE2MzY0XChcJGdwXCkKLVsgCV0qMTA6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDNmOGYKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjZDM2Ci0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDNmOGYKLTArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhjZDM2Ci0wKzAwMjQgPFtePl0qPiBtdGMxCVwkYXQsXCRmNAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA5YTdmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0LXN2cjRwaWMKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC1FQiAtLWRlZnN5bSBTVlI0PTEKLSNzb3VyY2U6IGxpZmxvYXQucwotCi0jIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkucm9kYXRhCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjg6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBsd2MxCVwkZjUsOFwoXCRhdFwpCi1bIAldKjE4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsMTJcKFwkYXRcKQotWyAJXSoxYzogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDIwIDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDI4IDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCi0wKzAwMmMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgotMCswMDMwIDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NmUyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGlmbG9hdC14Z290Ci0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdCAtRUIgLS1kZWZzeW0gWEdPVD0xCi0jc291cmNlOiBsaWZsb2F0LnMKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3JvcyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSowOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjOiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDogUl9NSVBTX0dPVDE2CS5yb2RhdGEKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gbHdjMQlcJGY1LDhcKFwkYXRcKQotWyAJXSoxODogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDFjIDxbXj5dKj4gbHdjMQlcJGY0LDEyXChcJGF0XCkKLVsgCV0qMWM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAyMCA8W14+XSo+IGx1aQlcJGEwLDB4M2Y4ZgotMCswMDI0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGNkMzYKLTArMDAyOCA8W14+XSo+IGx1aQlcJGF0LDB4M2Y4ZgotMCswMDJjIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGNkMzYKLTArMDAzMCA8W14+XSo+IG10YzEJXCRhdCxcJGY0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFiNTU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxpZmxvYXQKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSowOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ybz9kYXRhLioKLTArMDAwNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnJvP2RhdGEuKgotMCswMDA4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkucm8/ZGF0YS4qCi0wKzAwMGMgPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRncFwpCi1bIAldKmM6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTAgPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRncFwpCi1bIAldKjEwOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDFjIDxbXj5dKj4gbHdjMQlcJGY0LFstMC05XStcKFwkZ3BcKQotWyAJXSoxYzogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ0LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NzdmMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3MuCi0JCi1mb286CQotCWxpLmQJJDQsMS4xMjM0NQotCWxpLmQJJGY0LDEuMTIzNDUKLQkKLQlsaS5zCSQ0LDEuMTIzNDUKLQlsaS5zCSRmNCwxLjEyMzQ1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0JLmlmZGVmCVNWUjQKLQlub3AKLQlub3AKLQlub3AKLQkuZW5kaWYKLQkuaWZkZWYJWEdPVAotCW5vcAotCW5vcAotCW5vcAotCS5lbmRpZgotCS5pZmRlZglFTVBJQwotCW5vcAotCW5vcAotCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTQwZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtbCAtbW1pcHM6NDAwMAotI25hbWU6IGFzc2VtYmx5IGxpbmUgbnVtYmVycwotI2FzOiAtZyAtbWNwdT1yNDAwMAotCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPG1haW4tMHgxMD46Ci0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLS4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgotLipbMC05YS1mXSs6LipkZWFkYmVlZi4qCi0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLQotMCswMDEwIDxtYWluPjoKLW1haW5cKFwpOgotLipsaW5lbm8uczoxNgotLioxMDouKmFkZGl1LioKLS4qbGluZW5vLnM6MTcKLS4qMTQ6LipzZC4qCi0uKmxpbmVuby5zOjE4Ci0uKjE4Oi4qc2QuKgotLipsaW5lbm8uczoxOQotLioxYzouKm1vdmUuKgotLipsaW5lbm8uczoyMAotLioyMDouKmphbC4qCi0uKjI0Oi4qbm9wCi0uKmxpbmVuby5zOjIxCi0uKjI4Oi4qbGkuKgotLipsaW5lbm8uczoyMgotLioyYzouKnN3LioKLS4qbGluZW5vLnM6MjMKLS4qMzA6Lipsdy4qCi0uKmxpbmVuby5zOjI0Ci0uKjM0Oi4qbW92ZS4qCi0uKmxpbmVuby5zOjI1Ci0uKjM4Oi4qc2xsLioKLS4qbGluZW5vLnM6MjYKLS4qM2M6LiphZGR1LioKLS4qbGluZW5vLnM6MjcKLS4qNDA6Lipzdy4qCi0uKmxpbmVuby5zOjI4Ci0uKjQ0Oi4qbHcuKgotLipsaW5lbm8uczoyOQotLio0ODouKmphbC4qCi0uKjRjOi4qbm9wCi0uKmxpbmVuby5zOjMwCi0uKjUwOi4qbHcuKgotLipsaW5lbm8uczozMQotLio1NDouKm1vdmUuKgotLipsaW5lbm8uczozMgotLio1ODouKmIuKgotLio1YzouKm5vcAotCi0wMDAwMDAwMDAwMDAwMDYwIDxcJEwxPjoKLS4qbGluZW5vLnM6MzQKLS4qNjA6Liptb3ZlLioKLS4qbGluZW5vLnM6MzUKLS4qNjQ6LipsZC4qCi0uKmxpbmVuby5zOjM2Ci0uKjY4Oi4qbGQuKgotLipsaW5lbm8uczozNwotLio2YzouKmFkZGl1LioKLS4qbGluZW5vLnM6MzgKLS4qNzA6Lipqci4qCi0uKjc0Oi4qbm9wCi0KLTAwMDAwMDAwMDAwMDAwNzggPGc+OgotZ1woXCk6Ci0uKmxpbmVuby5zOjQ3Ci0uKjc4Oi4qYWRkaXUuKgotLipsaW5lbm8uczo0OAotLio3YzouKnNkLioKLS4qbGluZW5vLnM6NDkKLS4qODA6Liptb3ZlLioKLS4qbGluZW5vLnM6NTAKLS4qODQ6Lipzdy4qCi0uKmxpbmVuby5zOjUxCi0uKjg4Oi4qbHcuKgotLipsaW5lbm8uczo1MgotLio4YzouKmFkZGl1LioKLS4qbGluZW5vLnM6NTMKLS4qOTA6Liptb3ZlLioKLS4qbGluZW5vLnM6NTQKLS4qOTQ6LipiLioKLS4qOTg6Lipub3AKLQotMDAwMDAwMDAwMDAwMDA5YyA8XCRMMj46Ci0uKmxpbmVuby5zOjU2Ci0uKjljOi4qbW92ZS4qCi0uKmxpbmVuby5zOjU3Ci0uKmEwOi4qbGQuKgotLipsaW5lbm8uczo1OAotLiphNDouKmFkZGl1LioKLS4qbGluZW5vLnM6NTkKLS4qYTg6Lipqci4qCi0uKmFjOi4qbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxZjMzMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotCS50ZXh0Ci0KLSMgc29tZSBkYXRhCi0JLndvcmQJMHhkZWFkYmVlZgotCS53b3JkCTB4ZGVhZGJlZWYKLQkud29yZAkweGRlYWRiZWVmCi0JLndvcmQJMHhkZWFkYmVlZgotCi0jIHNvbWUgcmVhbCBjb2RlLCBjb21waWxlZCBmcm9tIGEgdG95IEMgcHJvZ3JhbQotCSAgICAgICAgLmdsb2JsICBtYWluCi0gICAgICAgIC5lbnQgICAgbWFpbgotbWFpbjoKLSAgICAgICAgLmZyYW1lICAkZnAsMzIsJDMxICAgICAgICAgICAgICAjIHZhcnM9IDE2LCByZWdzPSAyLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCi0gICAgICAgIC5tYXNrICAgMHhjMDAwMDAwMCwtOAotICAgICAgICAuZm1hc2sgIDB4MDAwMDAwMDAsMAotICAgICAgICBzdWJ1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgc2QgICAgICAkMzEsMjQoJHNwKQotICAgICAgICBzZCAgICAgICRmcCwxNigkc3ApCi0gICAgICAgIG1vdmUgICAgJGZwLCRzcAotICAgICAgICBqYWwgICAgIF9fbWFpbgotICAgICAgICBsaSAgICAgICQyLDIgICAgICAgICAgICAgICAgICAgICMgMHgyCi0gICAgICAgIHN3ICAgICAgJDIsMCgkZnApCi0gICAgICAgIGx3ICAgICAgJDIsMCgkZnApCi0gICAgICAgIG1vdmUgICAgJDMsJDIKLSAgICAgICAgc2xsICAgICAkNCwkMywxCi0gICAgICAgIGFkZHUgICAgJDIsJDQsJDIKLSAgICAgICAgc3cgICAgICAkMiw0KCRmcCkKLSAgICAgICAgbHcgICAgICAkNCw0KCRmcCkKLSAgICAgICAgamFsICAgICBnCi0gICAgICAgIGx3ICAgICAgJDMsMCgkZnApCi0gICAgICAgIG1vdmUgICAgJDIsJDMKLSAgICAgICAgYiAgICAgICAkTDEKLSRMMToKLSAgICAgICAgbW92ZSAgICAkc3AsJGZwCi0gICAgICAgIGxkICAgICAgJDMxLDI0KCRzcCkKLSAgICAgICAgbGQgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBhZGR1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgaiAgICAgICAkMzEKLSAgICAgICAgLmVuZCAgICBtYWluCi0gICAgICAgIC5hbGlnbiAgMgotICAgICAgICAuZ2xvYmwgIGcKLSAgICAgICAgLmVudCAgICBnCi1nOgotICAgICAgICAuZnJhbWUgICRmcCwzMiwkMzEgICAgICAgICAgICAgICMgdmFycz0gMTYsIHJlZ3M9IDEvMCwgYXJncz0gMCwgZXh0cmE9IDAKLSAgICAgICAgLm1hc2sgICAweDQwMDAwMDAwLC0xNgotICAgICAgICAuZm1hc2sgIDB4MDAwMDAwMDAsMAotICAgICAgICBzdWJ1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgc2QgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBtb3ZlICAgICRmcCwkc3AKLSAgICAgICAgc3cgICAgICAkNCwwKCRmcCkKLSAgICAgICAgbHcgICAgICAkMiwwKCRmcCkKLSAgICAgICAgYWRkdSAgICAkMywkMiwxCi0gICAgICAgIG1vdmUgICAgJDIsJDMKLSAgICAgICAgYiAgICAgICAkTDIKLSRMMjoKLSAgICAgICAgbW92ZSAgICAkc3AsJGZwCi0gICAgICAgIGxkICAgICAgJGZwLDE2KCRzcCkKLSAgICAgICAgYWRkdSAgICAkc3AsJHNwLDMyCi0gICAgICAgIGogICAgICAgJDMxCi0gICAgICAgIC5lbmQgICAgZwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTI2OWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jCi0jIFNvbWUgZ2VuZXJpYyBNSVBTIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgbWlwcyotKi0qXSB0aGVuIHsKLSAgICBzZXQgbm9fbWlwczE2IDAKLSAgICBzZXQgc3ZyNHBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVsZipdIHx8IFtpc3RhcmdldCAqLSotaXJpeDUqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXg2KiBdIF0KLSAgICBzZXQgZW1waWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lY29mZipdIHx8IFtpc3RhcmdldCAqLSotdWx0cml4Kl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4XFsxLTRcXSpdIF0KLSAgICBzZXQgYW91dCBbZXhwciBbaXN0YXJnZXQgKi0qLWJzZCpdIHx8IFtpc3RhcmdldCAqLSotbmV0YnNkKl0gfHwgW2lzdGFyZ2V0ICotKi1vcGVuYnNkKl1dCi0gICAgc2V0IGlsb2NrcyBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl0KLSAgICBzZXQgZ3ByX2lsb2NrcyBbZXhwciBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl1dCi0gICAgc2V0IGFkZHIzMiBbZXhwciBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl1dCi0KLQotCi0KLQotICAgIHJ1bl9kdW1wX3Rlc3QgImFicyIKLSAgICBydW5fZHVtcF90ZXN0ICJhZGQiCi0gICAgcnVuX2R1bXBfdGVzdCAiYW5kIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJyZWFrMjAiCi0gICAgcnVuX2R1bXBfdGVzdCAidHJhcDIwIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJlcSIKLSAgICBydW5fZHVtcF90ZXN0ICJiZ2UiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmdldSIKLSAgICBydW5fZHVtcF90ZXN0ICJibHQiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmx0dSIKLSAgICBpZiAhJGlsb2NrcyB7IHJ1bl9kdW1wX3Rlc3QgImRpdiIgfSBlbHNlIHsgcnVuX2R1bXBfdGVzdCAiZGl2LWlsb2NrcyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImRsaSIKLSAgICBydW5fZHVtcF90ZXN0ICJqYWwiCi0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJqYWwtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAiamFsLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJqYWwtZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJsYSIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGEtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGEteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxhLWVtcGljIiB9Ci0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAibGIiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxiLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7Ci0JIyBCb3RoIHZlcnNpb25zIHNwZWNpZnkgdGhlIGNwdSwgc28gd2UgY2FuIHJ1biBib3RoIHJlZ2FyZGxlc3Mgb2YKLQkjIHRoZSBpbnRlcmxvY2tpbmcgaW4gdGhlIGNvbmZpZ3VyZWQgZGVmYXVsdCBjcHUuCi0JcnVuX2R1bXBfdGVzdCAibGIteGdvdCIKLQlydW5fZHVtcF90ZXN0ICJsYi14Z290LWlsb2NrcyIKLSAgICB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGItZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgeyAKLSAgICAgICAgaWYgISRncHJfaWxvY2tzIHsgCi0gICAgICAgICAgICBydW5fZHVtcF90ZXN0ICJsZCIgCi0gICAgICAgIH0gZWxzZSB7IAotICAgICAgICAgICAgaWYgISRhZGRyMzIgewotICAgICAgICAgICAgICAgIHJ1bl9kdW1wX3Rlc3QgImxkLWlsb2NrcyIKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnVuX2R1bXBfdGVzdCAibGQtaWxvY2tzLWFkZHIzMiIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJsZC1lbXBpYyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImxpIgotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgImxpZmxvYXQiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsaWYteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi1lbXBpYyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgIm1pcHM0IgotICAgIGlmICEkaWxvY2tzIHsgcnVuX2R1bXBfdGVzdCAibXVsIiB9IGVsc2UgeyBydW5fZHVtcF90ZXN0ICJtdWwtaWxvY2tzIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAicm9sIgotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgInNiIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAidHJ1bmMiCi0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAidWxoIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAidWxoLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgtZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgewotCXJ1bl9kdW1wX3Rlc3QgInVsdyIKLQlydW5fZHVtcF90ZXN0ICJ1bGQiCi0JcnVuX2R1bXBfdGVzdCAidXNoIgotCXJ1bl9kdW1wX3Rlc3QgInVzdyIKLQlydW5fZHVtcF90ZXN0ICJ1c2QiCi0gICAgfQotICAgICMgVGhlIG1pcHMxNiB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiBFTEYsIGJlY2F1c2Ugb25seSBFTEYKLSAgICAjIHN1cHBvcnRzIHRoZSBuZWNlc3NhcnkgbWlwczE2IHJlbG9jLgotICAgIGlmIHsgJHN2cjRwaWMgJiYgISRub19taXBzMTYgfSB7IHJ1bl9kdW1wX3Rlc3QgIm1pcHMxNiIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImRlbGF5IgotICAgIHJ1bl9kdW1wX3Rlc3QgIm5vZGVsYXkiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQwMTAiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQ2NTAiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQxMDAiCi0gICAgcnVuX2R1bXBfdGVzdCAibGluZW5vIgotICAgIHJ1bl9kdW1wX3Rlc3QgInN5bmMiCi0KLSAgICAjIE1ha2Ugc3VyZSB0aGF0IC1tY3B1PUZPTyBhbmQgLW1GT08gYXJlIGVxdWl2YWxlbnQuICBBc3NlbWJsZSBhIGZpbGUKLSAgICAjIGNvbnRhaW5pbmcgNDY1MC1zcGVjaWZpYyBpbnN0cnVjdGlvbnMgd2l0aCAtbTQ2NTAgYW5kIC1tY3B1PTQ2NTAsCi0gICAgIyBhbmQgdmVyaWZ5IHRoYXQgdGhleSdyZSB0aGUgc2FtZS4gIFNwZWNpZmljYWxseSwgd2UncmUgY2hlY2tpbmcKLSAgICAjIHRoYXQgdGhlIEVGX01JUFNfTUFDSCBmaWVsZCBpcyBzZXQsIGFuZCB0aGF0IHRoZSA0NjUwICdtdWwnCi0gICAgIyBpbnN0cnVjdGlvbiBkb2VzIGdldCB1c2VkLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgR0FTLCAKLSAgICAjIG9ubHkgLW1jcHU9NDY1MCB3b3VsZCBzZXQgdGhlIEVGX01JUFNfTUFDSCBmaWVsZDsgLW00NjUwIHdvdWxkbid0LgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzMSIKLSAgICBydW5fZHVtcF90ZXN0ICJlbGZfZV9mbGFnczIiCi0gICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3MzIgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzNCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGMxYTBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LmQKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtbW1pcHM6NDAwMAotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLSNuYW1lOiBtaXBzMTYKLQotIyBUZXN0IHRoZSBtaXBzMTYgaW5zdHJ1Y3Rpb24gc2V0LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMDAwIDxkYXRhMT46Ci0gICAwOgkwMDAwMDAwMCAJbm9wCi0KLTArMDAwMDA0IDxpbnNuczE+OgotICAgNDoJM2I0MCAgICAgIAlsZAlcJHYwLDBcKFwkdjFcKQotICAgNjoJZjAwMCAzYjQxIAlsZAlcJHYwLDFcKFwkdjFcKQotICAgYToJZjAwMCAzYjQyIAlsZAlcJHYwLDJcKFwkdjFcKQotICAgZToJZjAwMCAzYjQzIAlsZAlcJHYwLDNcKFwkdjFcKQotICAxMjoJZjAwMCAzYjQ0IAlsZAlcJHYwLDRcKFwkdjFcKQotICAxNjoJM2I0MSAgICAgIAlsZAlcJHYwLDhcKFwkdjFcKQotICAxODoJM2I0MiAgICAgIAlsZAlcJHYwLDE2XChcJHYxXCkKLSAgMWE6CTNiNDQgICAgICAJbGQJXCR2MCwzMlwoXCR2MVwpCi0gIDFjOgkzYjQ4ICAgICAgCWxkCVwkdjAsNjRcKFwkdjFcKQotICAxZToJM2I1MCAgICAgIAlsZAlcJHYwLDEyOFwoXCR2MVwpCi0gIDIwOglmMTAwIDNiNDAgCWxkCVwkdjAsMjU2XChcJHYxXCkKLSAgMjQ6CWYyMDAgM2I0MCAJbGQJXCR2MCw1MTJcKFwkdjFcKQotICAyODoJZjQwMCAzYjQwIAlsZAlcJHYwLDEwMjRcKFwkdjFcKQotICAyYzoJZjAwMSAzYjQwIAlsZAlcJHYwLDIwNDhcKFwkdjFcKQotICAzMDoJZjdmZiAzYjVmIAlsZAlcJHYwLC0xXChcJHYxXCkKLSAgMzQ6CWY3ZmYgM2I1ZSAJbGQJXCR2MCwtMlwoXCR2MVwpCi0gIDM4OglmN2ZmIDNiNWQgCWxkCVwkdjAsLTNcKFwkdjFcKQotICAzYzoJZjdmZiAzYjVjIAlsZAlcJHYwLC00XChcJHYxXCkKLSAgNDA6CWY3ZmYgM2I1OCAJbGQJXCR2MCwtOFwoXCR2MVwpCi0gIDQ0OglmN2ZmIDNiNTAgCWxkCVwkdjAsLTE2XChcJHYxXCkKLSAgNDg6CWY3ZmYgM2I0MCAJbGQJXCR2MCwtMzJcKFwkdjFcKQotICA0YzoJZjdkZiAzYjQwIAlsZAlcJHYwLC02NFwoXCR2MVwpCi0gIDUwOglmNzlmIDNiNDAgCWxkCVwkdjAsLTEyOFwoXCR2MVwpCi0gIDU0OglmNzFmIDNiNDAgCWxkCVwkdjAsLTI1NlwoXCR2MVwpCi0gIDU4OglmNjFmIDNiNDAgCWxkCVwkdjAsLTUxMlwoXCR2MVwpCi0gIDVjOglmNDFmIDNiNDAgCWxkCVwkdjAsLTEwMjRcKFwkdjFcKQotICA2MDoJZjAxZiAzYjQwIAlsZAlcJHYwLC0yMDQ4XChcJHYxXCkKLSAgNjQ6CWY3YmYgZmM0MCAJbGQJXCR2MCwwIDxkYXRhMT4KLSAgNjg6CWY2YTAgZmM1NCAJbGQJXCR2MCw3MWMgPGRhdGEyPgotICA2YzoJZjAwMSBmYzQwIAlsZAlcJHYwLDg2OCA8YmFyPgotICA3MDoJZjBjMSBmYzQwIAlsZAlcJHYwLDkzMCA8cXV1eD4KLSAgNzQ6CWY4NDAgICAgICAJbGQJXCR2MCwwXChcJHNwXCkKLSAgNzY6CWYwMDAgZjg0MSAJbGQJXCR2MCwxXChcJHNwXCkKLSAgN2E6CWYwMDAgZjg0MiAJbGQJXCR2MCwyXChcJHNwXCkKLSAgN2U6CWYwMDAgZjg0MyAJbGQJXCR2MCwzXChcJHNwXCkKLSAgODI6CWYwMDAgZjg0NCAJbGQJXCR2MCw0XChcJHNwXCkKLSAgODY6CWY4NDEgICAgICAJbGQJXCR2MCw4XChcJHNwXCkKLSAgODg6CWY4NDIgICAgICAJbGQJXCR2MCwxNlwoXCRzcFwpCi0gIDhhOglmODQ0ICAgICAgCWxkCVwkdjAsMzJcKFwkc3BcKQotICA4YzoJZjg0OCAgICAgIAlsZAlcJHYwLDY0XChcJHNwXCkKLSAgOGU6CWY4NTAgICAgICAJbGQJXCR2MCwxMjhcKFwkc3BcKQotICA5MDoJZjEwMCBmODQwIAlsZAlcJHYwLDI1NlwoXCRzcFwpCi0gIDk0OglmMjAwIGY4NDAgCWxkCVwkdjAsNTEyXChcJHNwXCkKLSAgOTg6CWY0MDAgZjg0MCAJbGQJXCR2MCwxMDI0XChcJHNwXCkKLSAgOWM6CWYwMDEgZjg0MCAJbGQJXCR2MCwyMDQ4XChcJHNwXCkKLSAgYTA6CWY3ZmYgZjg1ZiAJbGQJXCR2MCwtMVwoXCRzcFwpCi0gIGE0OglmN2ZmIGY4NWUgCWxkCVwkdjAsLTJcKFwkc3BcKQotICBhODoJZjdmZiBmODVkIAlsZAlcJHYwLC0zXChcJHNwXCkKLSAgYWM6CWY3ZmYgZjg1YyAJbGQJXCR2MCwtNFwoXCRzcFwpCi0gIGIwOglmN2ZmIGY4NTggCWxkCVwkdjAsLThcKFwkc3BcKQotICBiNDoJZjdmZiBmODUwIAlsZAlcJHYwLC0xNlwoXCRzcFwpCi0gIGI4OglmN2ZmIGY4NDAgCWxkCVwkdjAsLTMyXChcJHNwXCkKLSAgYmM6CWY3ZGYgZjg0MCAJbGQJXCR2MCwtNjRcKFwkc3BcKQotICBjMDoJZjc5ZiBmODQwIAlsZAlcJHYwLC0xMjhcKFwkc3BcKQotICBjNDoJZjcxZiBmODQwIAlsZAlcJHYwLC0yNTZcKFwkc3BcKQotICBjODoJZjYxZiBmODQwIAlsZAlcJHYwLC01MTJcKFwkc3BcKQotICBjYzoJZjQxZiBmODQwIAlsZAlcJHYwLC0xMDI0XChcJHNwXCkKLSAgZDA6CWYwMWYgZjg0MCAJbGQJXCR2MCwtMjA0OFwoXCRzcFwpCi0gIGQ0OgliYjQwICAgICAgCWx3dQlcJHYwLDBcKFwkdjFcKQotICBkNjoJZjAwMCBiYjQxIAlsd3UJXCR2MCwxXChcJHYxXCkKLSAgZGE6CWYwMDAgYmI0MiAJbHd1CVwkdjAsMlwoXCR2MVwpCi0gIGRlOglmMDAwIGJiNDMgCWx3dQlcJHYwLDNcKFwkdjFcKQotICBlMjoJYmI0MSAgICAgIAlsd3UJXCR2MCw0XChcJHYxXCkKLSAgZTQ6CWJiNDIgICAgICAJbHd1CVwkdjAsOFwoXCR2MVwpCi0gIGU2OgliYjQ0ICAgICAgCWx3dQlcJHYwLDE2XChcJHYxXCkKLSAgZTg6CWJiNDggICAgICAJbHd1CVwkdjAsMzJcKFwkdjFcKQotICBlYToJYmI1MCAgICAgIAlsd3UJXCR2MCw2NFwoXCR2MVwpCi0gIGVjOglmMDgwIGJiNDAgCWx3dQlcJHYwLDEyOFwoXCR2MVwpCi0gIGYwOglmMTAwIGJiNDAgCWx3dQlcJHYwLDI1NlwoXCR2MVwpCi0gIGY0OglmMjAwIGJiNDAgCWx3dQlcJHYwLDUxMlwoXCR2MVwpCi0gIGY4OglmNDAwIGJiNDAgCWx3dQlcJHYwLDEwMjRcKFwkdjFcKQotICBmYzoJZjAwMSBiYjQwIAlsd3UJXCR2MCwyMDQ4XChcJHYxXCkKLSAxMDA6CWY3ZmYgYmI1ZiAJbHd1CVwkdjAsLTFcKFwkdjFcKQotIDEwNDoJZjdmZiBiYjVlIAlsd3UJXCR2MCwtMlwoXCR2MVwpCi0gMTA4OglmN2ZmIGJiNWQgCWx3dQlcJHYwLC0zXChcJHYxXCkKLSAxMGM6CWY3ZmYgYmI1YyAJbHd1CVwkdjAsLTRcKFwkdjFcKQotIDExMDoJZjdmZiBiYjU4IAlsd3UJXCR2MCwtOFwoXCR2MVwpCi0gMTE0OglmN2ZmIGJiNTAgCWx3dQlcJHYwLC0xNlwoXCR2MVwpCi0gMTE4OglmN2ZmIGJiNDAgCWx3dQlcJHYwLC0zMlwoXCR2MVwpCi0gMTFjOglmN2RmIGJiNDAgCWx3dQlcJHYwLC02NFwoXCR2MVwpCi0gMTIwOglmNzlmIGJiNDAgCWx3dQlcJHYwLC0xMjhcKFwkdjFcKQotIDEyNDoJZjcxZiBiYjQwIAlsd3UJXCR2MCwtMjU2XChcJHYxXCkKLSAxMjg6CWY2MWYgYmI0MCAJbHd1CVwkdjAsLTUxMlwoXCR2MVwpCi0gMTJjOglmNDFmIGJiNDAgCWx3dQlcJHYwLC0xMDI0XChcJHYxXCkKLSAxMzA6CWYwMWYgYmI0MCAJbHd1CVwkdjAsLTIwNDhcKFwkdjFcKQotIDEzNDoJOWI0MCAgICAgIAlsdwlcJHYwLDBcKFwkdjFcKQotIDEzNjoJZjAwMCA5YjQxIAlsdwlcJHYwLDFcKFwkdjFcKQotIDEzYToJZjAwMCA5YjQyIAlsdwlcJHYwLDJcKFwkdjFcKQotIDEzZToJZjAwMCA5YjQzIAlsdwlcJHYwLDNcKFwkdjFcKQotIDE0MjoJOWI0MSAgICAgIAlsdwlcJHYwLDRcKFwkdjFcKQotIDE0NDoJOWI0MiAgICAgIAlsdwlcJHYwLDhcKFwkdjFcKQotIDE0NjoJOWI0NCAgICAgIAlsdwlcJHYwLDE2XChcJHYxXCkKLSAxNDg6CTliNDggICAgICAJbHcJXCR2MCwzMlwoXCR2MVwpCi0gMTRhOgk5YjUwICAgICAgCWx3CVwkdjAsNjRcKFwkdjFcKQotIDE0YzoJZjA4MCA5YjQwIAlsdwlcJHYwLDEyOFwoXCR2MVwpCi0gMTUwOglmMTAwIDliNDAgCWx3CVwkdjAsMjU2XChcJHYxXCkKLSAxNTQ6CWYyMDAgOWI0MCAJbHcJXCR2MCw1MTJcKFwkdjFcKQotIDE1ODoJZjQwMCA5YjQwIAlsdwlcJHYwLDEwMjRcKFwkdjFcKQotIDE1YzoJZjAwMSA5YjQwIAlsdwlcJHYwLDIwNDhcKFwkdjFcKQotIDE2MDoJZjdmZiA5YjVmIAlsdwlcJHYwLC0xXChcJHYxXCkKLSAxNjQ6CWY3ZmYgOWI1ZSAJbHcJXCR2MCwtMlwoXCR2MVwpCi0gMTY4OglmN2ZmIDliNWQgCWx3CVwkdjAsLTNcKFwkdjFcKQotIDE2YzoJZjdmZiA5YjVjIAlsdwlcJHYwLC00XChcJHYxXCkKLSAxNzA6CWY3ZmYgOWI1OCAJbHcJXCR2MCwtOFwoXCR2MVwpCi0gMTc0OglmN2ZmIDliNTAgCWx3CVwkdjAsLTE2XChcJHYxXCkKLSAxNzg6CWY3ZmYgOWI0MCAJbHcJXCR2MCwtMzJcKFwkdjFcKQotIDE3YzoJZjdkZiA5YjQwIAlsdwlcJHYwLC02NFwoXCR2MVwpCi0gMTgwOglmNzlmIDliNDAgCWx3CVwkdjAsLTEyOFwoXCR2MVwpCi0gMTg0OglmNzFmIDliNDAgCWx3CVwkdjAsLTI1NlwoXCR2MVwpCi0gMTg4OglmNjFmIDliNDAgCWx3CVwkdjAsLTUxMlwoXCR2MVwpCi0gMThjOglmNDFmIDliNDAgCWx3CVwkdjAsLTEwMjRcKFwkdjFcKQotIDE5MDoJZjAxZiA5YjQwIAlsdwlcJHYwLC0yMDQ4XChcJHYxXCkKLSAxOTQ6CWY2N2YgYjIwYyAJbHcJXCR2MCwwIDxkYXRhMT4KLSAxOTg6CWY1ODAgYjIwNCAJbHcJXCR2MCw3MWMgPGRhdGEyPgotIDE5YzoJZjZjMCBiMjBjIAlsdwlcJHYwLDg2OCA8YmFyPgotIDFhMDoJZjc4MCBiMjEwIAlsdwlcJHYwLDkzMCA8cXV1eD4KLSAxYTQ6CTkyMDAgICAgICAJbHcJXCR2MCwwXChcJHNwXCkKLSAxYTY6CWYwMDAgOTIwMSAJbHcJXCR2MCwxXChcJHNwXCkKLSAxYWE6CWYwMDAgOTIwMiAJbHcJXCR2MCwyXChcJHNwXCkKLSAxYWU6CWYwMDAgOTIwMyAJbHcJXCR2MCwzXChcJHNwXCkKLSAxYjI6CTkyMDEgICAgICAJbHcJXCR2MCw0XChcJHNwXCkKLSAxYjQ6CTkyMDIgICAgICAJbHcJXCR2MCw4XChcJHNwXCkKLSAxYjY6CTkyMDQgICAgICAJbHcJXCR2MCwxNlwoXCRzcFwpCi0gMWI4Ogk5MjA4ICAgICAgCWx3CVwkdjAsMzJcKFwkc3BcKQotIDFiYToJOTIxMCAgICAgIAlsdwlcJHYwLDY0XChcJHNwXCkKLSAxYmM6CTkyMjAgICAgICAJbHcJXCR2MCwxMjhcKFwkc3BcKQotIDFiZToJOTI0MCAgICAgIAlsdwlcJHYwLDI1NlwoXCRzcFwpCi0gMWMwOgk5MjgwICAgICAgCWx3CVwkdjAsNTEyXChcJHNwXCkKLSAxYzI6CWY0MDAgOTIwMCAJbHcJXCR2MCwxMDI0XChcJHNwXCkKLSAxYzY6CWYwMDEgOTIwMCAJbHcJXCR2MCwyMDQ4XChcJHNwXCkKLSAxY2E6CWY3ZmYgOTIxZiAJbHcJXCR2MCwtMVwoXCRzcFwpCi0gMWNlOglmN2ZmIDkyMWUgCWx3CVwkdjAsLTJcKFwkc3BcKQotIDFkMjoJZjdmZiA5MjFkIAlsdwlcJHYwLC0zXChcJHNwXCkKLSAxZDY6CWY3ZmYgOTIxYyAJbHcJXCR2MCwtNFwoXCRzcFwpCi0gMWRhOglmN2ZmIDkyMTggCWx3CVwkdjAsLThcKFwkc3BcKQotIDFkZToJZjdmZiA5MjEwIAlsdwlcJHYwLC0xNlwoXCRzcFwpCi0gMWUyOglmN2ZmIDkyMDAgCWx3CVwkdjAsLTMyXChcJHNwXCkKLSAxZTY6CWY3ZGYgOTIwMCAJbHcJXCR2MCwtNjRcKFwkc3BcKQotIDFlYToJZjc5ZiA5MjAwIAlsdwlcJHYwLC0xMjhcKFwkc3BcKQotIDFlZToJZjcxZiA5MjAwIAlsdwlcJHYwLC0yNTZcKFwkc3BcKQotIDFmMjoJZjYxZiA5MjAwIAlsdwlcJHYwLC01MTJcKFwkc3BcKQotIDFmNjoJZjQxZiA5MjAwIAlsdwlcJHYwLC0xMDI0XChcJHNwXCkKLSAxZmE6CWYwMWYgOTIwMCAJbHcJXCR2MCwtMjA0OFwoXCRzcFwpCi0gMWZlOgk4YjQwICAgICAgCWxoCVwkdjAsMFwoXCR2MVwpCi0gMjAwOglmMDAwIDhiNDEgCWxoCVwkdjAsMVwoXCR2MVwpCi0gMjA0Ogk4YjQxICAgICAgCWxoCVwkdjAsMlwoXCR2MVwpCi0gMjA2OglmMDAwIDhiNDMgCWxoCVwkdjAsM1woXCR2MVwpCi0gMjBhOgk4YjQyICAgICAgCWxoCVwkdjAsNFwoXCR2MVwpCi0gMjBjOgk4YjQ0ICAgICAgCWxoCVwkdjAsOFwoXCR2MVwpCi0gMjBlOgk4YjQ4ICAgICAgCWxoCVwkdjAsMTZcKFwkdjFcKQotIDIxMDoJOGI1MCAgICAgIAlsaAlcJHYwLDMyXChcJHYxXCkKLSAyMTI6CWYwNDAgOGI0MCAJbGgJXCR2MCw2NFwoXCR2MVwpCi0gMjE2OglmMDgwIDhiNDAgCWxoCVwkdjAsMTI4XChcJHYxXCkKLSAyMWE6CWYxMDAgOGI0MCAJbGgJXCR2MCwyNTZcKFwkdjFcKQotIDIxZToJZjIwMCA4YjQwIAlsaAlcJHYwLDUxMlwoXCR2MVwpCi0gMjIyOglmNDAwIDhiNDAgCWxoCVwkdjAsMTAyNFwoXCR2MVwpCi0gMjI2OglmMDAxIDhiNDAgCWxoCVwkdjAsMjA0OFwoXCR2MVwpCi0gMjJhOglmN2ZmIDhiNWYgCWxoCVwkdjAsLTFcKFwkdjFcKQotIDIyZToJZjdmZiA4YjVlIAlsaAlcJHYwLC0yXChcJHYxXCkKLSAyMzI6CWY3ZmYgOGI1ZCAJbGgJXCR2MCwtM1woXCR2MVwpCi0gMjM2OglmN2ZmIDhiNWMgCWxoCVwkdjAsLTRcKFwkdjFcKQotIDIzYToJZjdmZiA4YjU4IAlsaAlcJHYwLC04XChcJHYxXCkKLSAyM2U6CWY3ZmYgOGI1MCAJbGgJXCR2MCwtMTZcKFwkdjFcKQotIDI0MjoJZjdmZiA4YjQwIAlsaAlcJHYwLC0zMlwoXCR2MVwpCi0gMjQ2OglmN2RmIDhiNDAgCWxoCVwkdjAsLTY0XChcJHYxXCkKLSAyNGE6CWY3OWYgOGI0MCAJbGgJXCR2MCwtMTI4XChcJHYxXCkKLSAyNGU6CWY3MWYgOGI0MCAJbGgJXCR2MCwtMjU2XChcJHYxXCkKLSAyNTI6CWY2MWYgOGI0MCAJbGgJXCR2MCwtNTEyXChcJHYxXCkKLSAyNTY6CWY0MWYgOGI0MCAJbGgJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMjVhOglmMDFmIDhiNDAgCWxoCVwkdjAsLTIwNDhcKFwkdjFcKQotIDI1ZToJYWI0MCAgICAgIAlsaHUJXCR2MCwwXChcJHYxXCkKLSAyNjA6CWYwMDAgYWI0MSAJbGh1CVwkdjAsMVwoXCR2MVwpCi0gMjY0OglhYjQxICAgICAgCWxodQlcJHYwLDJcKFwkdjFcKQotIDI2NjoJZjAwMCBhYjQzIAlsaHUJXCR2MCwzXChcJHYxXCkKLSAyNmE6CWFiNDIgICAgICAJbGh1CVwkdjAsNFwoXCR2MVwpCi0gMjZjOglhYjQ0ICAgICAgCWxodQlcJHYwLDhcKFwkdjFcKQotIDI2ZToJYWI0OCAgICAgIAlsaHUJXCR2MCwxNlwoXCR2MVwpCi0gMjcwOglhYjUwICAgICAgCWxodQlcJHYwLDMyXChcJHYxXCkKLSAyNzI6CWYwNDAgYWI0MCAJbGh1CVwkdjAsNjRcKFwkdjFcKQotIDI3NjoJZjA4MCBhYjQwIAlsaHUJXCR2MCwxMjhcKFwkdjFcKQotIDI3YToJZjEwMCBhYjQwIAlsaHUJXCR2MCwyNTZcKFwkdjFcKQotIDI3ZToJZjIwMCBhYjQwIAlsaHUJXCR2MCw1MTJcKFwkdjFcKQotIDI4MjoJZjQwMCBhYjQwIAlsaHUJXCR2MCwxMDI0XChcJHYxXCkKLSAyODY6CWYwMDEgYWI0MCAJbGh1CVwkdjAsMjA0OFwoXCR2MVwpCi0gMjhhOglmN2ZmIGFiNWYgCWxodQlcJHYwLC0xXChcJHYxXCkKLSAyOGU6CWY3ZmYgYWI1ZSAJbGh1CVwkdjAsLTJcKFwkdjFcKQotIDI5MjoJZjdmZiBhYjVkIAlsaHUJXCR2MCwtM1woXCR2MVwpCi0gMjk2OglmN2ZmIGFiNWMgCWxodQlcJHYwLC00XChcJHYxXCkKLSAyOWE6CWY3ZmYgYWI1OCAJbGh1CVwkdjAsLThcKFwkdjFcKQotIDI5ZToJZjdmZiBhYjUwIAlsaHUJXCR2MCwtMTZcKFwkdjFcKQotIDJhMjoJZjdmZiBhYjQwIAlsaHUJXCR2MCwtMzJcKFwkdjFcKQotIDJhNjoJZjdkZiBhYjQwIAlsaHUJXCR2MCwtNjRcKFwkdjFcKQotIDJhYToJZjc5ZiBhYjQwIAlsaHUJXCR2MCwtMTI4XChcJHYxXCkKLSAyYWU6CWY3MWYgYWI0MCAJbGh1CVwkdjAsLTI1NlwoXCR2MVwpCi0gMmIyOglmNjFmIGFiNDAgCWxodQlcJHYwLC01MTJcKFwkdjFcKQotIDJiNjoJZjQxZiBhYjQwIAlsaHUJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMmJhOglmMDFmIGFiNDAgCWxodQlcJHYwLC0yMDQ4XChcJHYxXCkKLSAyYmU6CTgzNDAgICAgICAJbGIJXCR2MCwwXChcJHYxXCkKLSAyYzA6CTgzNDEgICAgICAJbGIJXCR2MCwxXChcJHYxXCkKLSAyYzI6CTgzNDIgICAgICAJbGIJXCR2MCwyXChcJHYxXCkKLSAyYzQ6CTgzNDMgICAgICAJbGIJXCR2MCwzXChcJHYxXCkKLSAyYzY6CTgzNDQgICAgICAJbGIJXCR2MCw0XChcJHYxXCkKLSAyYzg6CTgzNDggICAgICAJbGIJXCR2MCw4XChcJHYxXCkKLSAyY2E6CTgzNTAgICAgICAJbGIJXCR2MCwxNlwoXCR2MVwpCi0gMmNjOglmMDIwIDgzNDAgCWxiCVwkdjAsMzJcKFwkdjFcKQotIDJkMDoJZjA0MCA4MzQwIAlsYglcJHYwLDY0XChcJHYxXCkKLSAyZDQ6CWYwODAgODM0MCAJbGIJXCR2MCwxMjhcKFwkdjFcKQotIDJkODoJZjEwMCA4MzQwIAlsYglcJHYwLDI1NlwoXCR2MVwpCi0gMmRjOglmMjAwIDgzNDAgCWxiCVwkdjAsNTEyXChcJHYxXCkKLSAyZTA6CWY0MDAgODM0MCAJbGIJXCR2MCwxMDI0XChcJHYxXCkKLSAyZTQ6CWYwMDEgODM0MCAJbGIJXCR2MCwyMDQ4XChcJHYxXCkKLSAyZTg6CWY3ZmYgODM1ZiAJbGIJXCR2MCwtMVwoXCR2MVwpCi0gMmVjOglmN2ZmIDgzNWUgCWxiCVwkdjAsLTJcKFwkdjFcKQotIDJmMDoJZjdmZiA4MzVkIAlsYglcJHYwLC0zXChcJHYxXCkKLSAyZjQ6CWY3ZmYgODM1YyAJbGIJXCR2MCwtNFwoXCR2MVwpCi0gMmY4OglmN2ZmIDgzNTggCWxiCVwkdjAsLThcKFwkdjFcKQotIDJmYzoJZjdmZiA4MzUwIAlsYglcJHYwLC0xNlwoXCR2MVwpCi0gMzAwOglmN2ZmIDgzNDAgCWxiCVwkdjAsLTMyXChcJHYxXCkKLSAzMDQ6CWY3ZGYgODM0MCAJbGIJXCR2MCwtNjRcKFwkdjFcKQotIDMwODoJZjc5ZiA4MzQwIAlsYglcJHYwLC0xMjhcKFwkdjFcKQotIDMwYzoJZjcxZiA4MzQwIAlsYglcJHYwLC0yNTZcKFwkdjFcKQotIDMxMDoJZjYxZiA4MzQwIAlsYglcJHYwLC01MTJcKFwkdjFcKQotIDMxNDoJZjQxZiA4MzQwIAlsYglcJHYwLC0xMDI0XChcJHYxXCkKLSAzMTg6CWYwMWYgODM0MCAJbGIJXCR2MCwtMjA0OFwoXCR2MVwpCi0gMzFjOglhMzQwICAgICAgCWxidQlcJHYwLDBcKFwkdjFcKQotIDMxZToJYTM0MSAgICAgIAlsYnUJXCR2MCwxXChcJHYxXCkKLSAzMjA6CWEzNDIgICAgICAJbGJ1CVwkdjAsMlwoXCR2MVwpCi0gMzIyOglhMzQzICAgICAgCWxidQlcJHYwLDNcKFwkdjFcKQotIDMyNDoJYTM0NCAgICAgIAlsYnUJXCR2MCw0XChcJHYxXCkKLSAzMjY6CWEzNDggICAgICAJbGJ1CVwkdjAsOFwoXCR2MVwpCi0gMzI4OglhMzUwICAgICAgCWxidQlcJHYwLDE2XChcJHYxXCkKLSAzMmE6CWYwMjAgYTM0MCAJbGJ1CVwkdjAsMzJcKFwkdjFcKQotIDMyZToJZjA0MCBhMzQwIAlsYnUJXCR2MCw2NFwoXCR2MVwpCi0gMzMyOglmMDgwIGEzNDAgCWxidQlcJHYwLDEyOFwoXCR2MVwpCi0gMzM2OglmMTAwIGEzNDAgCWxidQlcJHYwLDI1NlwoXCR2MVwpCi0gMzNhOglmMjAwIGEzNDAgCWxidQlcJHYwLDUxMlwoXCR2MVwpCi0gMzNlOglmNDAwIGEzNDAgCWxidQlcJHYwLDEwMjRcKFwkdjFcKQotIDM0MjoJZjAwMSBhMzQwIAlsYnUJXCR2MCwyMDQ4XChcJHYxXCkKLSAzNDY6CWY3ZmYgYTM1ZiAJbGJ1CVwkdjAsLTFcKFwkdjFcKQotIDM0YToJZjdmZiBhMzVlIAlsYnUJXCR2MCwtMlwoXCR2MVwpCi0gMzRlOglmN2ZmIGEzNWQgCWxidQlcJHYwLC0zXChcJHYxXCkKLSAzNTI6CWY3ZmYgYTM1YyAJbGJ1CVwkdjAsLTRcKFwkdjFcKQotIDM1NjoJZjdmZiBhMzU4IAlsYnUJXCR2MCwtOFwoXCR2MVwpCi0gMzVhOglmN2ZmIGEzNTAgCWxidQlcJHYwLC0xNlwoXCR2MVwpCi0gMzVlOglmN2ZmIGEzNDAgCWxidQlcJHYwLC0zMlwoXCR2MVwpCi0gMzYyOglmN2RmIGEzNDAgCWxidQlcJHYwLC02NFwoXCR2MVwpCi0gMzY2OglmNzlmIGEzNDAgCWxidQlcJHYwLC0xMjhcKFwkdjFcKQotIDM2YToJZjcxZiBhMzQwIAlsYnUJXCR2MCwtMjU2XChcJHYxXCkKLSAzNmU6CWY2MWYgYTM0MCAJbGJ1CVwkdjAsLTUxMlwoXCR2MVwpCi0gMzcyOglmNDFmIGEzNDAgCWxidQlcJHYwLC0xMDI0XChcJHYxXCkKLSAzNzY6CWYwMWYgYTM0MCAJbGJ1CVwkdjAsLTIwNDhcKFwkdjFcKQotIDM3YToJN2I0MCAgICAgIAlzZAlcJHYwLDBcKFwkdjFcKQotIDM3YzoJZjAwMCA3YjQxIAlzZAlcJHYwLDFcKFwkdjFcKQotIDM4MDoJZjAwMCA3YjQyIAlzZAlcJHYwLDJcKFwkdjFcKQotIDM4NDoJZjAwMCA3YjQzIAlzZAlcJHYwLDNcKFwkdjFcKQotIDM4ODoJZjAwMCA3YjQ0IAlzZAlcJHYwLDRcKFwkdjFcKQotIDM4YzoJN2I0MSAgICAgIAlzZAlcJHYwLDhcKFwkdjFcKQotIDM4ZToJN2I0MiAgICAgIAlzZAlcJHYwLDE2XChcJHYxXCkKLSAzOTA6CTdiNDQgICAgICAJc2QJXCR2MCwzMlwoXCR2MVwpCi0gMzkyOgk3YjQ4ICAgICAgCXNkCVwkdjAsNjRcKFwkdjFcKQotIDM5NDoJN2I1MCAgICAgIAlzZAlcJHYwLDEyOFwoXCR2MVwpCi0gMzk2OglmMTAwIDdiNDAgCXNkCVwkdjAsMjU2XChcJHYxXCkKLSAzOWE6CWYyMDAgN2I0MCAJc2QJXCR2MCw1MTJcKFwkdjFcKQotIDM5ZToJZjQwMCA3YjQwIAlzZAlcJHYwLDEwMjRcKFwkdjFcKQotIDNhMjoJZjAwMSA3YjQwIAlzZAlcJHYwLDIwNDhcKFwkdjFcKQotIDNhNjoJZjdmZiA3YjVmIAlzZAlcJHYwLC0xXChcJHYxXCkKLSAzYWE6CWY3ZmYgN2I1ZSAJc2QJXCR2MCwtMlwoXCR2MVwpCi0gM2FlOglmN2ZmIDdiNWQgCXNkCVwkdjAsLTNcKFwkdjFcKQotIDNiMjoJZjdmZiA3YjVjIAlzZAlcJHYwLC00XChcJHYxXCkKLSAzYjY6CWY3ZmYgN2I1OCAJc2QJXCR2MCwtOFwoXCR2MVwpCi0gM2JhOglmN2ZmIDdiNTAgCXNkCVwkdjAsLTE2XChcJHYxXCkKLSAzYmU6CWY3ZmYgN2I0MCAJc2QJXCR2MCwtMzJcKFwkdjFcKQotIDNjMjoJZjdkZiA3YjQwIAlzZAlcJHYwLC02NFwoXCR2MVwpCi0gM2M2OglmNzlmIDdiNDAgCXNkCVwkdjAsLTEyOFwoXCR2MVwpCi0gM2NhOglmNzFmIDdiNDAgCXNkCVwkdjAsLTI1NlwoXCR2MVwpCi0gM2NlOglmNjFmIDdiNDAgCXNkCVwkdjAsLTUxMlwoXCR2MVwpCi0gM2QyOglmNDFmIDdiNDAgCXNkCVwkdjAsLTEwMjRcKFwkdjFcKQotIDNkNjoJZjAxZiA3YjQwIAlzZAlcJHYwLC0yMDQ4XChcJHYxXCkKLSAzZGE6CWY5NDAgICAgICAJc2QJXCR2MCwwXChcJHNwXCkKLSAzZGM6CWYwMDAgZjk0MSAJc2QJXCR2MCwxXChcJHNwXCkKLSAzZTA6CWYwMDAgZjk0MiAJc2QJXCR2MCwyXChcJHNwXCkKLSAzZTQ6CWYwMDAgZjk0MyAJc2QJXCR2MCwzXChcJHNwXCkKLSAzZTg6CWYwMDAgZjk0NCAJc2QJXCR2MCw0XChcJHNwXCkKLSAzZWM6CWY5NDEgICAgICAJc2QJXCR2MCw4XChcJHNwXCkKLSAzZWU6CWY5NDIgICAgICAJc2QJXCR2MCwxNlwoXCRzcFwpCi0gM2YwOglmOTQ0ICAgICAgCXNkCVwkdjAsMzJcKFwkc3BcKQotIDNmMjoJZjk0OCAgICAgIAlzZAlcJHYwLDY0XChcJHNwXCkKLSAzZjQ6CWY5NTAgICAgICAJc2QJXCR2MCwxMjhcKFwkc3BcKQotIDNmNjoJZjEwMCBmOTQwIAlzZAlcJHYwLDI1NlwoXCRzcFwpCi0gM2ZhOglmMjAwIGY5NDAgCXNkCVwkdjAsNTEyXChcJHNwXCkKLSAzZmU6CWY0MDAgZjk0MCAJc2QJXCR2MCwxMDI0XChcJHNwXCkKLSA0MDI6CWYwMDEgZjk0MCAJc2QJXCR2MCwyMDQ4XChcJHNwXCkKLSA0MDY6CWY3ZmYgZjk1ZiAJc2QJXCR2MCwtMVwoXCRzcFwpCi0gNDBhOglmN2ZmIGY5NWUgCXNkCVwkdjAsLTJcKFwkc3BcKQotIDQwZToJZjdmZiBmOTVkIAlzZAlcJHYwLC0zXChcJHNwXCkKLSA0MTI6CWY3ZmYgZjk1YyAJc2QJXCR2MCwtNFwoXCRzcFwpCi0gNDE2OglmN2ZmIGY5NTggCXNkCVwkdjAsLThcKFwkc3BcKQotIDQxYToJZjdmZiBmOTUwIAlzZAlcJHYwLC0xNlwoXCRzcFwpCi0gNDFlOglmN2ZmIGY5NDAgCXNkCVwkdjAsLTMyXChcJHNwXCkKLSA0MjI6CWY3ZGYgZjk0MCAJc2QJXCR2MCwtNjRcKFwkc3BcKQotIDQyNjoJZjc5ZiBmOTQwIAlzZAlcJHYwLC0xMjhcKFwkc3BcKQotIDQyYToJZjcxZiBmOTQwIAlzZAlcJHYwLC0yNTZcKFwkc3BcKQotIDQyZToJZjYxZiBmOTQwIAlzZAlcJHYwLC01MTJcKFwkc3BcKQotIDQzMjoJZjQxZiBmOTQwIAlzZAlcJHYwLC0xMDI0XChcJHNwXCkKLSA0MzY6CWYwMWYgZjk0MCAJc2QJXCR2MCwtMjA0OFwoXCRzcFwpCi0gNDNhOglmYTAwICAgICAgCXNkCVwkcmEsMFwoXCRzcFwpCi0gNDNjOglmMDAwIGZhMDEgCXNkCVwkcmEsMVwoXCRzcFwpCi0gNDQwOglmMDAwIGZhMDIgCXNkCVwkcmEsMlwoXCRzcFwpCi0gNDQ0OglmMDAwIGZhMDMgCXNkCVwkcmEsM1woXCRzcFwpCi0gNDQ4OglmMDAwIGZhMDQgCXNkCVwkcmEsNFwoXCRzcFwpCi0gNDRjOglmYTAxICAgICAgCXNkCVwkcmEsOFwoXCRzcFwpCi0gNDRlOglmYTAyICAgICAgCXNkCVwkcmEsMTZcKFwkc3BcKQotIDQ1MDoJZmEwNCAgICAgIAlzZAlcJHJhLDMyXChcJHNwXCkKLSA0NTI6CWZhMDggICAgICAJc2QJXCRyYSw2NFwoXCRzcFwpCi0gNDU0OglmYTEwICAgICAgCXNkCVwkcmEsMTI4XChcJHNwXCkKLSA0NTY6CWZhMjAgICAgICAJc2QJXCRyYSwyNTZcKFwkc3BcKQotIDQ1ODoJZmE0MCAgICAgIAlzZAlcJHJhLDUxMlwoXCRzcFwpCi0gNDVhOglmYTgwICAgICAgCXNkCVwkcmEsMTAyNFwoXCRzcFwpCi0gNDVjOglmMDAxIGZhMDAgCXNkCVwkcmEsMjA0OFwoXCRzcFwpCi0gNDYwOglmN2ZmIGZhMWYgCXNkCVwkcmEsLTFcKFwkc3BcKQotIDQ2NDoJZjdmZiBmYTFlIAlzZAlcJHJhLC0yXChcJHNwXCkKLSA0Njg6CWY3ZmYgZmExZCAJc2QJXCRyYSwtM1woXCRzcFwpCi0gNDZjOglmN2ZmIGZhMWMgCXNkCVwkcmEsLTRcKFwkc3BcKQotIDQ3MDoJZjdmZiBmYTE4IAlzZAlcJHJhLC04XChcJHNwXCkKLSA0NzQ6CWY3ZmYgZmExMCAJc2QJXCRyYSwtMTZcKFwkc3BcKQotIDQ3ODoJZjdmZiBmYTAwIAlzZAlcJHJhLC0zMlwoXCRzcFwpCi0gNDdjOglmN2RmIGZhMDAgCXNkCVwkcmEsLTY0XChcJHNwXCkKLSA0ODA6CWY3OWYgZmEwMCAJc2QJXCRyYSwtMTI4XChcJHNwXCkKLSA0ODQ6CWY3MWYgZmEwMCAJc2QJXCRyYSwtMjU2XChcJHNwXCkKLSA0ODg6CWY2MWYgZmEwMCAJc2QJXCRyYSwtNTEyXChcJHNwXCkKLSA0OGM6CWY0MWYgZmEwMCAJc2QJXCRyYSwtMTAyNFwoXCRzcFwpCi0gNDkwOglmMDFmIGZhMDAgCXNkCVwkcmEsLTIwNDhcKFwkc3BcKQotIDQ5NDoJZGI0MCAgICAgIAlzdwlcJHYwLDBcKFwkdjFcKQotIDQ5NjoJZjAwMCBkYjQxIAlzdwlcJHYwLDFcKFwkdjFcKQotIDQ5YToJZjAwMCBkYjQyIAlzdwlcJHYwLDJcKFwkdjFcKQotIDQ5ZToJZjAwMCBkYjQzIAlzdwlcJHYwLDNcKFwkdjFcKQotIDRhMjoJZGI0MSAgICAgIAlzdwlcJHYwLDRcKFwkdjFcKQotIDRhNDoJZGI0MiAgICAgIAlzdwlcJHYwLDhcKFwkdjFcKQotIDRhNjoJZGI0NCAgICAgIAlzdwlcJHYwLDE2XChcJHYxXCkKLSA0YTg6CWRiNDggICAgICAJc3cJXCR2MCwzMlwoXCR2MVwpCi0gNGFhOglkYjUwICAgICAgCXN3CVwkdjAsNjRcKFwkdjFcKQotIDRhYzoJZjA4MCBkYjQwIAlzdwlcJHYwLDEyOFwoXCR2MVwpCi0gNGIwOglmMTAwIGRiNDAgCXN3CVwkdjAsMjU2XChcJHYxXCkKLSA0YjQ6CWYyMDAgZGI0MCAJc3cJXCR2MCw1MTJcKFwkdjFcKQotIDRiODoJZjQwMCBkYjQwIAlzdwlcJHYwLDEwMjRcKFwkdjFcKQotIDRiYzoJZjAwMSBkYjQwIAlzdwlcJHYwLDIwNDhcKFwkdjFcKQotIDRjMDoJZjdmZiBkYjVmIAlzdwlcJHYwLC0xXChcJHYxXCkKLSA0YzQ6CWY3ZmYgZGI1ZSAJc3cJXCR2MCwtMlwoXCR2MVwpCi0gNGM4OglmN2ZmIGRiNWQgCXN3CVwkdjAsLTNcKFwkdjFcKQotIDRjYzoJZjdmZiBkYjVjIAlzdwlcJHYwLC00XChcJHYxXCkKLSA0ZDA6CWY3ZmYgZGI1OCAJc3cJXCR2MCwtOFwoXCR2MVwpCi0gNGQ0OglmN2ZmIGRiNTAgCXN3CVwkdjAsLTE2XChcJHYxXCkKLSA0ZDg6CWY3ZmYgZGI0MCAJc3cJXCR2MCwtMzJcKFwkdjFcKQotIDRkYzoJZjdkZiBkYjQwIAlzdwlcJHYwLC02NFwoXCR2MVwpCi0gNGUwOglmNzlmIGRiNDAgCXN3CVwkdjAsLTEyOFwoXCR2MVwpCi0gNGU0OglmNzFmIGRiNDAgCXN3CVwkdjAsLTI1NlwoXCR2MVwpCi0gNGU4OglmNjFmIGRiNDAgCXN3CVwkdjAsLTUxMlwoXCR2MVwpCi0gNGVjOglmNDFmIGRiNDAgCXN3CVwkdjAsLTEwMjRcKFwkdjFcKQotIDRmMDoJZjAxZiBkYjQwIAlzdwlcJHYwLC0yMDQ4XChcJHYxXCkKLSA0ZjQ6CWQyMDAgICAgICAJc3cJXCR2MCwwXChcJHNwXCkKLSA0ZjY6CWYwMDAgZDIwMSAJc3cJXCR2MCwxXChcJHNwXCkKLSA0ZmE6CWYwMDAgZDIwMiAJc3cJXCR2MCwyXChcJHNwXCkKLSA0ZmU6CWYwMDAgZDIwMyAJc3cJXCR2MCwzXChcJHNwXCkKLSA1MDI6CWQyMDEgICAgICAJc3cJXCR2MCw0XChcJHNwXCkKLSA1MDQ6CWQyMDIgICAgICAJc3cJXCR2MCw4XChcJHNwXCkKLSA1MDY6CWQyMDQgICAgICAJc3cJXCR2MCwxNlwoXCRzcFwpCi0gNTA4OglkMjA4ICAgICAgCXN3CVwkdjAsMzJcKFwkc3BcKQotIDUwYToJZDIxMCAgICAgIAlzdwlcJHYwLDY0XChcJHNwXCkKLSA1MGM6CWQyMjAgICAgICAJc3cJXCR2MCwxMjhcKFwkc3BcKQotIDUwZToJZDI0MCAgICAgIAlzdwlcJHYwLDI1NlwoXCRzcFwpCi0gNTEwOglkMjgwICAgICAgCXN3CVwkdjAsNTEyXChcJHNwXCkKLSA1MTI6CWY0MDAgZDIwMCAJc3cJXCR2MCwxMDI0XChcJHNwXCkKLSA1MTY6CWYwMDEgZDIwMCAJc3cJXCR2MCwyMDQ4XChcJHNwXCkKLSA1MWE6CWY3ZmYgZDIxZiAJc3cJXCR2MCwtMVwoXCRzcFwpCi0gNTFlOglmN2ZmIGQyMWUgCXN3CVwkdjAsLTJcKFwkc3BcKQotIDUyMjoJZjdmZiBkMjFkIAlzdwlcJHYwLC0zXChcJHNwXCkKLSA1MjY6CWY3ZmYgZDIxYyAJc3cJXCR2MCwtNFwoXCRzcFwpCi0gNTJhOglmN2ZmIGQyMTggCXN3CVwkdjAsLThcKFwkc3BcKQotIDUyZToJZjdmZiBkMjEwIAlzdwlcJHYwLC0xNlwoXCRzcFwpCi0gNTMyOglmN2ZmIGQyMDAgCXN3CVwkdjAsLTMyXChcJHNwXCkKLSA1MzY6CWY3ZGYgZDIwMCAJc3cJXCR2MCwtNjRcKFwkc3BcKQotIDUzYToJZjc5ZiBkMjAwIAlzdwlcJHYwLC0xMjhcKFwkc3BcKQotIDUzZToJZjcxZiBkMjAwIAlzdwlcJHYwLC0yNTZcKFwkc3BcKQotIDU0MjoJZjYxZiBkMjAwIAlzdwlcJHYwLC01MTJcKFwkc3BcKQotIDU0NjoJZjQxZiBkMjAwIAlzdwlcJHYwLC0xMDI0XChcJHNwXCkKLSA1NGE6CWYwMWYgZDIwMCAJc3cJXCR2MCwtMjA0OFwoXCRzcFwpCi0gNTRlOgk2MjAwICAgICAgCXN3CVwkcmEsMFwoXCRzcFwpCi0gNTUwOglmMDAwIDYyMDEgCXN3CVwkcmEsMVwoXCRzcFwpCi0gNTU0OglmMDAwIDYyMDIgCXN3CVwkcmEsMlwoXCRzcFwpCi0gNTU4OglmMDAwIDYyMDMgCXN3CVwkcmEsM1woXCRzcFwpCi0gNTVjOgk2MjAxICAgICAgCXN3CVwkcmEsNFwoXCRzcFwpCi0gNTVlOgk2MjAyICAgICAgCXN3CVwkcmEsOFwoXCRzcFwpCi0gNTYwOgk2MjA0ICAgICAgCXN3CVwkcmEsMTZcKFwkc3BcKQotIDU2MjoJNjIwOCAgICAgIAlzdwlcJHJhLDMyXChcJHNwXCkKLSA1NjQ6CTYyMTAgICAgICAJc3cJXCRyYSw2NFwoXCRzcFwpCi0gNTY2Ogk2MjIwICAgICAgCXN3CVwkcmEsMTI4XChcJHNwXCkKLSA1Njg6CTYyNDAgICAgICAJc3cJXCRyYSwyNTZcKFwkc3BcKQotIDU2YToJNjI4MCAgICAgIAlzdwlcJHJhLDUxMlwoXCRzcFwpCi0gNTZjOglmNDAwIDYyMDAgCXN3CVwkcmEsMTAyNFwoXCRzcFwpCi0gNTcwOglmMDAxIDYyMDAgCXN3CVwkcmEsMjA0OFwoXCRzcFwpCi0gNTc0OglmN2ZmIDYyMWYgCXN3CVwkcmEsLTFcKFwkc3BcKQotIDU3ODoJZjdmZiA2MjFlIAlzdwlcJHJhLC0yXChcJHNwXCkKLSA1N2M6CWY3ZmYgNjIxZCAJc3cJXCRyYSwtM1woXCRzcFwpCi0gNTgwOglmN2ZmIDYyMWMgCXN3CVwkcmEsLTRcKFwkc3BcKQotIDU4NDoJZjdmZiA2MjE4IAlzdwlcJHJhLC04XChcJHNwXCkKLSA1ODg6CWY3ZmYgNjIxMCAJc3cJXCRyYSwtMTZcKFwkc3BcKQotIDU4YzoJZjdmZiA2MjAwIAlzdwlcJHJhLC0zMlwoXCRzcFwpCi0gNTkwOglmN2RmIDYyMDAgCXN3CVwkcmEsLTY0XChcJHNwXCkKLSA1OTQ6CWY3OWYgNjIwMCAJc3cJXCRyYSwtMTI4XChcJHNwXCkKLSA1OTg6CWY3MWYgNjIwMCAJc3cJXCRyYSwtMjU2XChcJHNwXCkKLSA1OWM6CWY2MWYgNjIwMCAJc3cJXCRyYSwtNTEyXChcJHNwXCkKLSA1YTA6CWY0MWYgNjIwMCAJc3cJXCRyYSwtMTAyNFwoXCRzcFwpCi0gNWE0OglmMDFmIDYyMDAgCXN3CVwkcmEsLTIwNDhcKFwkc3BcKQotIDVhODoJY2I0MCAgICAgIAlzaAlcJHYwLDBcKFwkdjFcKQotIDVhYToJZjAwMCBjYjQxIAlzaAlcJHYwLDFcKFwkdjFcKQotIDVhZToJY2I0MSAgICAgIAlzaAlcJHYwLDJcKFwkdjFcKQotIDViMDoJZjAwMCBjYjQzIAlzaAlcJHYwLDNcKFwkdjFcKQotIDViNDoJY2I0MiAgICAgIAlzaAlcJHYwLDRcKFwkdjFcKQotIDViNjoJY2I0NCAgICAgIAlzaAlcJHYwLDhcKFwkdjFcKQotIDViODoJY2I0OCAgICAgIAlzaAlcJHYwLDE2XChcJHYxXCkKLSA1YmE6CWNiNTAgICAgICAJc2gJXCR2MCwzMlwoXCR2MVwpCi0gNWJjOglmMDQwIGNiNDAgCXNoCVwkdjAsNjRcKFwkdjFcKQotIDVjMDoJZjA4MCBjYjQwIAlzaAlcJHYwLDEyOFwoXCR2MVwpCi0gNWM0OglmMTAwIGNiNDAgCXNoCVwkdjAsMjU2XChcJHYxXCkKLSA1Yzg6CWYyMDAgY2I0MCAJc2gJXCR2MCw1MTJcKFwkdjFcKQotIDVjYzoJZjQwMCBjYjQwIAlzaAlcJHYwLDEwMjRcKFwkdjFcKQotIDVkMDoJZjAwMSBjYjQwIAlzaAlcJHYwLDIwNDhcKFwkdjFcKQotIDVkNDoJZjdmZiBjYjVmIAlzaAlcJHYwLC0xXChcJHYxXCkKLSA1ZDg6CWY3ZmYgY2I1ZSAJc2gJXCR2MCwtMlwoXCR2MVwpCi0gNWRjOglmN2ZmIGNiNWQgCXNoCVwkdjAsLTNcKFwkdjFcKQotIDVlMDoJZjdmZiBjYjVjIAlzaAlcJHYwLC00XChcJHYxXCkKLSA1ZTQ6CWY3ZmYgY2I1OCAJc2gJXCR2MCwtOFwoXCR2MVwpCi0gNWU4OglmN2ZmIGNiNTAgCXNoCVwkdjAsLTE2XChcJHYxXCkKLSA1ZWM6CWY3ZmYgY2I0MCAJc2gJXCR2MCwtMzJcKFwkdjFcKQotIDVmMDoJZjdkZiBjYjQwIAlzaAlcJHYwLC02NFwoXCR2MVwpCi0gNWY0OglmNzlmIGNiNDAgCXNoCVwkdjAsLTEyOFwoXCR2MVwpCi0gNWY4OglmNzFmIGNiNDAgCXNoCVwkdjAsLTI1NlwoXCR2MVwpCi0gNWZjOglmNjFmIGNiNDAgCXNoCVwkdjAsLTUxMlwoXCR2MVwpCi0gNjAwOglmNDFmIGNiNDAgCXNoCVwkdjAsLTEwMjRcKFwkdjFcKQotIDYwNDoJZjAxZiBjYjQwIAlzaAlcJHYwLC0yMDQ4XChcJHYxXCkKLSA2MDg6CWMzNDAgICAgICAJc2IJXCR2MCwwXChcJHYxXCkKLSA2MGE6CWMzNDEgICAgICAJc2IJXCR2MCwxXChcJHYxXCkKLSA2MGM6CWMzNDIgICAgICAJc2IJXCR2MCwyXChcJHYxXCkKLSA2MGU6CWMzNDMgICAgICAJc2IJXCR2MCwzXChcJHYxXCkKLSA2MTA6CWMzNDQgICAgICAJc2IJXCR2MCw0XChcJHYxXCkKLSA2MTI6CWMzNDggICAgICAJc2IJXCR2MCw4XChcJHYxXCkKLSA2MTQ6CWMzNTAgICAgICAJc2IJXCR2MCwxNlwoXCR2MVwpCi0gNjE2OglmMDIwIGMzNDAgCXNiCVwkdjAsMzJcKFwkdjFcKQotIDYxYToJZjA0MCBjMzQwIAlzYglcJHYwLDY0XChcJHYxXCkKLSA2MWU6CWYwODAgYzM0MCAJc2IJXCR2MCwxMjhcKFwkdjFcKQotIDYyMjoJZjEwMCBjMzQwIAlzYglcJHYwLDI1NlwoXCR2MVwpCi0gNjI2OglmMjAwIGMzNDAgCXNiCVwkdjAsNTEyXChcJHYxXCkKLSA2MmE6CWY0MDAgYzM0MCAJc2IJXCR2MCwxMDI0XChcJHYxXCkKLSA2MmU6CWYwMDEgYzM0MCAJc2IJXCR2MCwyMDQ4XChcJHYxXCkKLSA2MzI6CWY3ZmYgYzM1ZiAJc2IJXCR2MCwtMVwoXCR2MVwpCi0gNjM2OglmN2ZmIGMzNWUgCXNiCVwkdjAsLTJcKFwkdjFcKQotIDYzYToJZjdmZiBjMzVkIAlzYglcJHYwLC0zXChcJHYxXCkKLSA2M2U6CWY3ZmYgYzM1YyAJc2IJXCR2MCwtNFwoXCR2MVwpCi0gNjQyOglmN2ZmIGMzNTggCXNiCVwkdjAsLThcKFwkdjFcKQotIDY0NjoJZjdmZiBjMzUwIAlzYglcJHYwLC0xNlwoXCR2MVwpCi0gNjRhOglmN2ZmIGMzNDAgCXNiCVwkdjAsLTMyXChcJHYxXCkKLSA2NGU6CWY3ZGYgYzM0MCAJc2IJXCR2MCwtNjRcKFwkdjFcKQotIDY1MjoJZjc5ZiBjMzQwIAlzYglcJHYwLC0xMjhcKFwkdjFcKQotIDY1NjoJZjcxZiBjMzQwIAlzYglcJHYwLC0yNTZcKFwkdjFcKQotIDY1YToJZjYxZiBjMzQwIAlzYglcJHYwLC01MTJcKFwkdjFcKQotIDY1ZToJZjQxZiBjMzQwIAlzYglcJHYwLC0xMDI0XChcJHYxXCkKLSA2NjI6CWYwMWYgYzM0MCAJc2IJXCR2MCwtMjA0OFwoXCR2MVwpCi0gNjY2Ogk2YTAwICAgICAgCWxpCVwkdjAsMAotIDY2ODoJNmEwMSAgICAgIAlsaQlcJHYwLDEKLSA2NmE6CWYxMDAgNmEwMCAJbGkJXCR2MCwyNTYKLSA2NmU6CTY3NWUgICAgICAJbW92ZQlcJHYwLFwkczgKLSA2NzA6CTY1OTIgICAgICAJbW92ZQlcJHM0LFwkdjAKLSA2NzI6CTQzNTAgICAgICAJZGFkZGl1CVwkdjAsXCR2MSwwCi0gNjc0Ogk0MzUxICAgICAgCWRhZGRpdQlcJHYwLFwkdjEsMQotIDY3NjoJNDM1ZiAgICAgIAlkYWRkaXUJXCR2MCxcJHYxLC0xCi0gNjc4OglmMDEwIDQzNTAgCWRhZGRpdQlcJHYwLFwkdjEsMTYKLSA2N2M6CWY3ZmYgNDM1MCAJZGFkZGl1CVwkdjAsXCR2MSwtMTYKLSA2ODA6CWUzODggICAgICAJZGFkZHUJXCR2MCxcJHYxLFwkYTAKLSA2ODI6CWZkNDAgICAgICAJZGFkZGl1CVwkdjAsMAotIDY4NDoJZmQ0MSAgICAgIAlkYWRkaXUJXCR2MCwxCi0gNjg2OglmZDVmICAgICAgCWRhZGRpdQlcJHYwLC0xCi0gNjg4OglmMDIwIGZkNDAgCWRhZGRpdQlcJHYwLDMyCi0gNjhjOglmN2ZmIGZkNDAgCWRhZGRpdQlcJHYwLC0zMgotIDY5MDoJZjA4MCBmZDQwIAlkYWRkaXUJXCR2MCwxMjgKLSA2OTQ6CWY3OWYgZmQ0MCAJZGFkZGl1CVwkdjAsLTEyOAotIDY5ODoJZjE3ZiBmZTQ4IAlkbGEJXCR2MCwwIDxkYXRhMT4KLSA2OWM6CWYwODAgZmU0MCAJZGxhCVwkdjAsNzFjIDxkYXRhMj4KLSA2YTA6CWYxYzAgZmU0OCAJZGxhCVwkdjAsODY4IDxiYXI+Ci0gNmE0OglmMjgwIGZlNGMgCWRsYQlcJHYwLDkzMCA8cXV1eD4KLSA2YTg6CWZiMDAgICAgICAJZGFkZGl1CVwkc3AsMAotIDZhYToJZjAwMCBmYjAxIAlkYWRkaXUJXCRzcCwxCi0gNmFlOglmN2ZmIGZiMWYgCWRhZGRpdQlcJHNwLC0xCi0gNmIyOglmYjIwICAgICAgCWRhZGRpdQlcJHNwLDI1NgotIDZiNDoJZmJlMCAgICAgIAlkYWRkaXUJXCRzcCwtMjU2Ci0gNmI2OglmZjQwICAgICAgCWRhZGRpdQlcJHYwLFwkc3AsMAotIDZiODoJZjAwMCBmZjQxIAlkYWRkaXUJXCR2MCxcJHNwLDEKLSA2YmM6CWY3ZmYgZmY1ZiAJZGFkZGl1CVwkdjAsXCRzcCwtMQotIDZjMDoJZmY0OCAgICAgIAlkYWRkaXUJXCR2MCxcJHNwLDMyCi0gNmMyOglmN2ZmIGZmNDAgCWRhZGRpdQlcJHYwLFwkc3AsLTMyCi0gNmM2OglmMDgwIGZmNDAgCWRhZGRpdQlcJHYwLFwkc3AsMTI4Ci0gNmNhOglmNzlmIGZmNDAgCWRhZGRpdQlcJHYwLFwkc3AsLTEyOAotIDZjZToJNDM0MCAgICAgIAlhZGRpdQlcJHYwLFwkdjEsMAotIDZkMDoJNDM0MSAgICAgIAlhZGRpdQlcJHYwLFwkdjEsMQotIDZkMjoJNDM0ZiAgICAgIAlhZGRpdQlcJHYwLFwkdjEsLTEKLSA2ZDQ6CWYwMTAgNDM0MCAJYWRkaXUJXCR2MCxcJHYxLDE2Ci0gNmQ4OglmN2ZmIDQzNDAgCWFkZGl1CVwkdjAsXCR2MSwtMTYKLSA2ZGM6CWUzODkgICAgICAJYWRkdQlcJHYwLFwkdjEsXCRhMAotIDZkZToJNGEwMCAgICAgIAlhZGRpdQlcJHYwLDAKLSA2ZTA6CTRhMDEgICAgICAJYWRkaXUJXCR2MCwxCi0gNmUyOgk0YWZmICAgICAgCWFkZGl1CVwkdjAsLTEKLSA2ZTQ6CTRhMjAgICAgICAJYWRkaXUJXCR2MCwzMgotIDZlNjoJNGFlMCAgICAgIAlhZGRpdQlcJHYwLC0zMgotIDZlODoJZjA4MCA0YTAwIAlhZGRpdQlcJHYwLDEyOAotIDZlYzoJNGE4MCAgICAgIAlhZGRpdQlcJHYwLC0xMjgKLSA2ZWU6CWYxMWYgMGExNCAJbGEJXCR2MCwwIDxkYXRhMT4KLSA2ZjI6CTBhMGIgICAgICAJbGEJXCR2MCw3MWMgPGRhdGEyPgotIDZmNDoJMGE1ZCAgICAgIAlsYQlcJHYwLDg2OCA8YmFyPgotIDZmNjoJMGE4ZiAgICAgIAlsYQlcJHYwLDkzMCA8cXV1eD4KLSA2Zjg6CTYzMDAgICAgICAJYWRkaXUJXCRzcCwwCi0gNmZhOglmMDAwIDYzMDEgCWFkZGl1CVwkc3AsMQotIDZmZToJZjdmZiA2MzFmIAlhZGRpdQlcJHNwLC0xCi0gNzAyOgk2MzIwICAgICAgCWFkZGl1CVwkc3AsMjU2Ci0gNzA0Ogk2M2UwICAgICAgCWFkZGl1CVwkc3AsLTI1NgotIDcwNjoJMDIwMCAgICAgIAlhZGRpdQlcJHYwLFwkc3AsMAotIDcwODoJZjAwMCAwMjAxIAlhZGRpdQlcJHYwLFwkc3AsMQotIDcwYzoJZjdmZiAwMjFmIAlhZGRpdQlcJHYwLFwkc3AsLTEKLSA3MTA6CTAyMDggICAgICAJYWRkaXUJXCR2MCxcJHNwLDMyCi0gNzEyOglmN2ZmIDAyMDAgCWFkZGl1CVwkdjAsXCRzcCwtMzIKLSA3MTY6CTAyMjAgICAgICAJYWRkaXUJXCR2MCxcJHNwLDEyOAotIDcxODoJZjc5ZiAwMjAwIAlhZGRpdQlcJHYwLFwkc3AsLTEyOAotCi0wKzAwMDcxYyA8ZGF0YTI+OgotIDcxYzoJMDAwMDAwMDAgCW5vcAotCi0wKzAwMDcyMCA8aW5zbnMyPjoKLSA3MjA6CWUzOGEgICAgICAJZHN1YnUJXCR2MCxcJHYxLFwkYTAKLSA3MjI6CWUzOGIgICAgICAJc3VidQlcJHYwLFwkdjEsXCRhMAotIDcyNDoJZWE2YiAgICAgIAluZWcJXCR2MCxcJHYxCi0gNzI2OgllYTZjICAgICAgCWFuZAlcJHYwLFwkdjEKLSA3Mjg6CWVhNmQgICAgICAJb3IJXCR2MCxcJHYxCi0gNzJhOgllYTZlICAgICAgCXhvcglcJHYwLFwkdjEKLSA3MmM6CWVhNmYgICAgICAJbm90CVwkdjAsXCR2MQotIDcyZToJNTIwMCAgICAgIAlzbHRpCVwkdjAsMAotIDczMDoJNTIwMSAgICAgIAlzbHRpCVwkdjAsMQotIDczMjoJZjdmZiA1MjFmIAlzbHRpCVwkdjAsLTEKLSA3MzY6CTUyZmYgICAgICAJc2x0aQlcJHYwLDI1NQotIDczODoJZjEwMCA1MjAwIAlzbHRpCVwkdjAsMjU2Ci0gNzNjOgllYTYyICAgICAgCXNsdAlcJHYwLFwkdjEKLSA3M2U6CTVhMDAgICAgICAJc2x0aXUJXCR2MCwwCi0gNzQwOgk1YTAxICAgICAgCXNsdGl1CVwkdjAsMQotIDc0MjoJZjdmZiA1YTFmIAlzbHRpdQlcJHYwLC0xCi0gNzQ2Ogk1YWZmICAgICAgCXNsdGl1CVwkdjAsMjU1Ci0gNzQ4OglmMTAwIDVhMDAgCXNsdGl1CVwkdjAsMjU2Ci0gNzRjOgllYTYzICAgICAgCXNsdHUJXCR2MCxcJHYxCi0gNzRlOgk3MjAwICAgICAgCWNtcGkJXCR2MCwwCi0gNzUwOgk3MjAxICAgICAgCWNtcGkJXCR2MCwxCi0gNzUyOgk3MmZmICAgICAgCWNtcGkJXCR2MCwyNTUKLSA3NTQ6CWYxMDAgNzIwMCAJY21waQlcJHYwLDI1NgotIDc1ODoJZWE2YSAgICAgIAljbXAJXCR2MCxcJHYxCi0gNzVhOglmMDAwIDMyNjEgCWRzbGwJXCR2MCxcJHYxLDAKLSA3NWU6CTMyNjUgICAgICAJZHNsbAlcJHYwLFwkdjEsMQotIDc2MDoJMzI2MSAgICAgIAlkc2xsCVwkdjAsXCR2MSw4Ci0gNzYyOglmMjQwIDMyNjEgCWRzbGwJXCR2MCxcJHYxLDkKLSA3NjY6CWY3ZTAgMzI2MSAJZHNsbAlcJHYwLFwkdjEsNjMKLSA3NmE6CWViNTQgICAgICAJZHNsbHYJXCR2MCxcJHYxCi0gNzZjOglmMDAwIGU4NDggCWRzcmwJXCR2MCwwCi0gNzcwOgllOTQ4ICAgICAgCWRzcmwJXCR2MCwxCi0gNzcyOgllODQ4ICAgICAgCWRzcmwJXCR2MCw4Ci0gNzc0OglmMjQwIGU4NDggCWRzcmwJXCR2MCw5Ci0gNzc4OglmN2UwIGU4NDggCWRzcmwJXCR2MCw2MwotIDc3YzoJZWI1NiAgICAgIAlkc3JsdglcJHYwLFwkdjEKLSA3N2U6CWYwMDAgZTg1MyAJZHNyYQlcJHYwLDAKLSA3ODI6CWU5NTMgICAgICAJZHNyYQlcJHYwLDEKLSA3ODQ6CWU4NTMgICAgICAJZHNyYQlcJHYwLDgKLSA3ODY6CWYyNDAgZTg1MyAJZHNyYQlcJHYwLDkKLSA3OGE6CWY3ZTAgZTg1MyAJZHNyYQlcJHYwLDYzCi0gNzhlOgllYjU3ICAgICAgCWRzcmF2CVwkdjAsXCR2MQotIDc5MDoJZWExMiAgICAgIAltZmxvCVwkdjAKLSA3OTI6CWViMTAgICAgICAJbWZoaQlcJHYxCi0gNzk0OglmMDAwIDMyNjAgCXNsbAlcJHYwLFwkdjEsMAotIDc5ODoJMzI2NCAgICAgIAlzbGwJXCR2MCxcJHYxLDEKLSA3OWE6CTMyNjAgICAgICAJc2xsCVwkdjAsXCR2MSw4Ci0gNzljOglmMjQwIDMyNjAgCXNsbAlcJHYwLFwkdjEsOQotIDdhMDoJZjdjMCAzMjYwIAlzbGwJXCR2MCxcJHYxLDMxCi0gN2E0OgllYjQ0ICAgICAgCXNsbHYJXCR2MCxcJHYxCi0gN2E2OglmMDAwIDMyNjIgCXNybAlcJHYwLFwkdjEsMAotIDdhYToJMzI2NiAgICAgIAlzcmwJXCR2MCxcJHYxLDEKLSA3YWM6CTMyNjIgICAgICAJc3JsCVwkdjAsXCR2MSw4Ci0gN2FlOglmMjQwIDMyNjIgCXNybAlcJHYwLFwkdjEsOQotIDdiMjoJZjdjMCAzMjYyIAlzcmwJXCR2MCxcJHYxLDMxCi0gN2I2OgllYjQ2ICAgICAgCXNybHYJXCR2MCxcJHYxCi0gN2I4OglmMDAwIDMyNjMgCXNyYQlcJHYwLFwkdjEsMAotIDdiYzoJMzI2NyAgICAgIAlzcmEJXCR2MCxcJHYxLDEKLSA3YmU6CTMyNjMgICAgICAJc3JhCVwkdjAsXCR2MSw4Ci0gN2MwOglmMjQwIDMyNjMgCXNyYQlcJHYwLFwkdjEsOQotIDdjNDoJZjdjMCAzMjYzIAlzcmEJXCR2MCxcJHYxLDMxCi0gN2M4OgllYjQ3ICAgICAgCXNyYXYJXCR2MCxcJHYxCi0gN2NhOgllYTdjICAgICAgCWRtdWx0CVwkdjAsXCR2MQotIDdjYzoJZWE3ZCAgICAgIAlkbXVsdHUJXCR2MCxcJHYxCi0gN2NlOgllYTdlICAgICAgCWRkaXYJXCR6ZXJvLFwkdjAsXCR2MQotIDdkMDoJMmIwMSAgICAgIAlibmV6CVwkdjEsN2Q0IDxpbnNuczJcKygweHwpYjQ+Ci0gN2QyOgllOGU1ICAgICAgCWJyZWFrCTcKLSA3ZDQ6CWVhMTIgICAgICAJbWZsbwlcJHYwCi0gN2Q2Ogk2NTAwICAgICAgCW5vcAotIDdkODoJNjUwMCAgICAgIAlub3AKLSA3ZGE6CWVhN2YgICAgICAJZGRpdnUJXCR6ZXJvLFwkdjAsXCR2MQotIDdkYzoJMmIwMSAgICAgIAlibmV6CVwkdjEsN2UwIDxpbnNuczJcKygweHwpYzA+Ci0gN2RlOgllOGU1ICAgICAgCWJyZWFrCTcKLSA3ZTA6CWVhMTIgICAgICAJbWZsbwlcJHYwCi0gN2UyOgk2NTAwICAgICAgCW5vcAotIDdlNDoJNjUwMCAgICAgIAlub3AKLSA3ZTY6CWVhNzggICAgICAJbXVsdAlcJHYwLFwkdjEKLSA3ZTg6CWVhNzkgICAgICAJbXVsdHUJXCR2MCxcJHYxCi0gN2VhOgllYTdhICAgICAgCWRpdglcJHplcm8sXCR2MCxcJHYxCi0gN2VjOgkyYjAxICAgICAgCWJuZXoJXCR2MSw3ZjAgPGluc25zMlwrKDB4fClkMD4KLSA3ZWU6CWU4ZTUgICAgICAJYnJlYWsJNwotIDdmMDoJZWExMiAgICAgIAltZmxvCVwkdjAKLSA3ZjI6CTY1MDAgICAgICAJbm9wCi0gN2Y0Ogk2NTAwICAgICAgCW5vcAotIDdmNjoJZWE3YiAgICAgIAlkaXZ1CVwkemVybyxcJHYwLFwkdjEKLSA3Zjg6CTJiMDEgICAgICAJYm5leglcJHYxLDdmYyA8aW5zbnMyXCsoMHh8KWRjPgotIDdmYToJZThlNSAgICAgIAlicmVhawk3Ci0gN2ZjOgllYTEyICAgICAgCW1mbG8JXCR2MAotIDdmZToJZWEwMCAgICAgIAlqcglcJHYwCi0gODAwOgk2NTAwICAgICAgCW5vcAotIDgwMjoJZTgyMCAgICAgIAlqcglcJHJhCi0gODA0Ogk2NTAwICAgICAgCW5vcAotIDgwNjoJZWE0MCAgICAgIAlqYWxyCVwkdjAKLSA4MDg6CTY1MDAgICAgICAJbm9wCi0gODBhOglmM2ZmIDIyMWIgCWJlcXoJXCR2MCw0IDxpbnNuczE+Ci0gODBlOgkyMjg4ICAgICAgCWJlcXoJXCR2MCw3MjAgPGluc25zMj4KLSA4MTA6CTIyMmIgICAgICAJYmVxeglcJHYwLDg2OCA8YmFyPgotIDgxMjoJZjA4MCAyMjBkIAliZXF6CVwkdjAsOTMwIDxxdXV4PgotIDgxNjoJZjNmZiAyYTE1IAlibmV6CVwkdjAsNCA8aW5zbnMxPgotIDgxYToJMmE4MiAgICAgIAlibmV6CVwkdjAsNzIwIDxpbnNuczI+Ci0gODFjOgkyYTI1ICAgICAgCWJuZXoJXCR2MCw4NjggPGJhcj4KLSA4MWU6CWYwODAgMmEwNyAJYm5leglcJHYwLDkzMCA8cXV1eD4KLSA4MjI6CWYzZmYgNjAwZiAJYnRlcXoJNCA8aW5zbnMxPgotIDgyNjoJZjc3ZiA2MDFiIAlidGVxegk3MjAgPGluc25zMj4KLSA4MmE6CTYwMWUgICAgICAJYnRlcXoJODY4IDxiYXI+Ci0gODJjOglmMDgwIDYwMDAgCWJ0ZXF6CTkzMCA8cXV1eD4KLSA4MzA6CWYzZmYgNjEwOCAJYnRuZXoJNCA8aW5zbnMxPgotIDgzNDoJZjc3ZiA2MTE0IAlidG5legk3MjAgPGluc25zMj4KLSA4Mzg6CTYxMTcgICAgICAJYnRuZXoJODY4IDxiYXI+Ci0gODNhOgk2MTdhICAgICAgCWJ0bmV6CTkzMCA8cXV1eD4KLSA4M2M6CWYzZmYgMTAwMiAJYgk0IDxpbnNuczE+Ci0gODQwOgkxNzZmICAgICAgCWIJNzIwIDxpbnNuczI+Ci0gODQyOgkxMDEyICAgICAgCWIJODY4IDxiYXI+Ci0gODQ0OgkxMDc1ICAgICAgCWIJOTMwIDxxdXV4PgotIDg0NjoJZTgwNSAgICAgIAlicmVhawkwCi0gODQ4OgllODI1ICAgICAgCWJyZWFrCTEKLSA4NGE6CWVmZTUgICAgICAJYnJlYWsJNjMKLSA4NGM6CTE4MDAgMDAwMCAJamFsCTAgPGRhdGExPgotCQkJODRjOiBSX01JUFMxNl8yNglleHRlcm4KLSA4NTA6CTY1MDAgICAgICAJbm9wCi0gODUyOgllODA5ICAgICAgCWVudHJ5CQotIDg1NDoJZTkwOSAgICAgIAllbnRyeQlcJGEwCi0gODU2OgllYjQ5ICAgICAgCWVudHJ5CVwkYTAtXCRhMixcJHMwCi0gODU4OgllOGE5ICAgICAgCWVudHJ5CVwkczAtXCRzMSxcJHJhCi0gODVhOgllODI5ICAgICAgCWVudHJ5CVwkcmEKLSA4NWM6CWVmMDkgICAgICAJZXhpdAkKLSA4NWU6CWVmNDkgICAgICAJZXhpdAlcJHMwCi0gODYwOgllZmE5ICAgICAgCWV4aXQJXCRzMC1cJHMxLFwkcmEKLSA4NjI6CWVmMjkgICAgICAJZXhpdAlcJHJhCi0gODY0OgkwMDAwICAgICAgCWFkZGl1CVwkczAsXCRzcCwwCi0JLi4uCi0KLTArMDAwODY4IDxiYXI+OgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNjhmYjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYucworKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0jIFRlc3QgdGhlIG1pcHMxNiBpbnN0cnVjdGlvbiBzZXQuCi0KLQkuc2V0CW1pcHMxNgotCi0JLm1hY3JvCWxkc3Qgb3AsIHJlZywgYmFzZQotCVxvcAlccmVnLDAoXGJhc2UpCi0JXG9wCVxyZWcsMShcYmFzZSkKLQlcb3AJXHJlZywyKFxiYXNlKQotCVxvcAlccmVnLDMoXGJhc2UpCi0JXG9wCVxyZWcsNChcYmFzZSkKLQlcb3AJXHJlZyw4KFxiYXNlKQotCVxvcAlccmVnLDE2KFxiYXNlKQotCVxvcAlccmVnLDMyKFxiYXNlKQotCVxvcAlccmVnLDY0KFxiYXNlKQotCVxvcAlccmVnLDEyOChcYmFzZSkKLQlcb3AJXHJlZywyNTYoXGJhc2UpCi0JXG9wCVxyZWcsNTEyKFxiYXNlKQotCVxvcAlccmVnLDEwMjQoXGJhc2UpCi0JXG9wCVxyZWcsMjA0OChcYmFzZSkKLQlcb3AJXHJlZywtMShcYmFzZSkKLQlcb3AJXHJlZywtMihcYmFzZSkKLQlcb3AJXHJlZywtMyhcYmFzZSkKLQlcb3AJXHJlZywtNChcYmFzZSkKLQlcb3AJXHJlZywtOChcYmFzZSkKLQlcb3AJXHJlZywtMTYoXGJhc2UpCi0JXG9wCVxyZWcsLTMyKFxiYXNlKQotCVxvcAlccmVnLC02NChcYmFzZSkKLQlcb3AJXHJlZywtMTI4KFxiYXNlKQotCVxvcAlccmVnLC0yNTYoXGJhc2UpCi0JXG9wCVxyZWcsLTUxMihcYmFzZSkKLQlcb3AJXHJlZywtMTAyNChcYmFzZSkKLQlcb3AJXHJlZywtMjA0OChcYmFzZSkKLQkuZW5kbQotCi0JLnAyYWxpZ24gMwotZGF0YTE6Ci0JLndvcmQJMAotaW5zbnMxOgotCWxkc3QJbGQsICQyLCAkMwotCWxkCSQyLGRhdGExCi0JbGQJJDIsZGF0YTIKLQlsZAkkMixiYXIKLQlsZAkkMixxdXV4Ci0JbGRzdAlsZCwgJDIsICRzcAotCWxkc3QJbHd1LCAkMiwgJDMKLQlsZHN0CWx3LCAkMiwgJDMKLQlsdwkkMixkYXRhMQotCWx3CSQyLGRhdGEyCi0JbHcJJDIsYmFyCi0JbHcJJDIscXV1eAotCWxkc3QJbHcsICQyLCAkc3AKLQlsZHN0CWxoLCAkMiwgJDMKLQlsZHN0CWxodSwgJDIsICQzCi0JbGRzdAlsYiwgJDIsICQzCi0JbGRzdAlsYnUsICQyLCAkMwotCWxkc3QJc2QsICQyLCAkMwotCWxkc3QJc2QsICQyLCAkc3AKLQlsZHN0CXNkLCAkMzEsICRzcAotCWxkc3QJc3csICQyLCAkMwotCWxkc3QJc3csICQyLCAkc3AKLQlsZHN0CXN3LCAkMzEsICRzcAotCWxkc3QJc2gsICQyLCAkMwotCWxkc3QJc2IsICQyLCAkMwotCi0JbGkJJDIsMAotCWxpCSQyLDEKLQlsaQkkMiwyNTYKLQotCW1vdmUJJDIsJDMwCi0JbW92ZQkkMjAsJDIKLQotCWRhZGR1CSQyLCQzLDAKLQlkYWRkdQkkMiwkMywxCi0JZGFkZHUJJDIsJDMsLTEKLQlkYWRkdQkkMiwkMywxNgotCWRhZGR1CSQyLCQzLC0xNgotCWRhZGR1CSQyLCQzLCQ0Ci0JZGFkZHUJJDIsMAotCWRhZGR1CSQyLDEKLQlkYWRkdQkkMiwtMQotCWRhZGR1CSQyLDMyCi0JZGFkZHUJJDIsLTMyCi0JZGFkZHUJJDIsMTI4Ci0JZGFkZHUJJDIsLTEyOAotCWRsYQkkMixkYXRhMQotCWRsYQkkMixkYXRhMgotCWRsYQkkMixiYXIKLQlkbGEJJDIscXV1eAotCWRhZGR1CSRzcCwwCi0JZGFkZHUJJHNwLDEKLQlkYWRkdQkkc3AsLTEKLQlkYWRkdQkkc3AsMjU2Ci0JZGFkZHUJJHNwLC0yNTYKLQlkYWRkdQkkMiwkc3AsMAotCWRhZGR1CSQyLCRzcCwxCi0JZGFkZHUJJDIsJHNwLC0xCi0JZGFkZHUJJDIsJHNwLDMyCi0JZGFkZHUJJDIsJHNwLC0zMgotCWRhZGR1CSQyLCRzcCwxMjgKLQlkYWRkdQkkMiwkc3AsLTEyOAotCi0JYWRkdQkkMiwkMywwCi0JYWRkdQkkMiwkMywxCi0JYWRkdQkkMiwkMywtMQotCWFkZHUJJDIsJDMsMTYKLQlhZGR1CSQyLCQzLC0xNgotCWFkZHUJJDIsJDMsJDQKLQlhZGR1CSQyLDAKLQlhZGR1CSQyLDEKLQlhZGR1CSQyLC0xCi0JYWRkdQkkMiwzMgotCWFkZHUJJDIsLTMyCi0JYWRkdQkkMiwxMjgKLQlhZGR1CSQyLC0xMjgKLQlsYQkkMixkYXRhMQotCWxhCSQyLGRhdGEyCi0JbGEJJDIsYmFyCi0JbGEJJDIscXV1eAotCWFkZHUJJHNwLDAKLQlhZGR1CSRzcCwxCi0JYWRkdQkkc3AsLTEKLQlhZGR1CSRzcCwyNTYKLQlhZGR1CSRzcCwtMjU2Ci0JYWRkdQkkMiwkc3AsMAotCWFkZHUJJDIsJHNwLDEKLQlhZGR1CSQyLCRzcCwtMQotCWFkZHUJJDIsJHNwLDMyCi0JYWRkdQkkMiwkc3AsLTMyCi0JYWRkdQkkMiwkc3AsMTI4Ci0JYWRkdQkkMiwkc3AsLTEyOAotCi1kYXRhMjoKLQkud29yZAkwCi1pbnNuczI6CQotCWRzdWJ1CSQyLCQzLCQ0Ci0Jc3VidQkkMiwkMywkNAotCW5lZwkkMiwkMwotCi0JYW5kCSQyLCQzCi0Jb3IJJDIsJDMKLQl4b3IJJDIsJDMKLQlub3QJJDIsJDMKLQotCXNsdAkkMiwwCi0Jc2x0CSQyLDEKLQlzbHQJJDIsLTEKLQlzbHQJJDIsMjU1Ci0Jc2x0CSQyLDI1NgotCXNsdAkkMiwkMwotCXNsdHUJJDIsMAotCXNsdHUJJDIsMQotCXNsdHUJJDIsLTEKLQlzbHR1CSQyLDI1NQotCXNsdHUJJDIsMjU2Ci0Jc2x0dQkkMiwkMwotCWNtcAkkMiwwCi0JY21wCSQyLDEKLQljbXAJJDIsMjU1Ci0JY21wCSQyLDI1NgotCWNtcAkkMiwkMwotCi0JZHNsbAkkMiwkMywwCi0JZHNsbAkkMiwkMywxCi0JZHNsbAkkMiwkMyw4Ci0JZHNsbAkkMiwkMyw5Ci0JZHNsbAkkMiwkMyw2MwotCWRzbGwJJDIsJDMKLQlkc3JsCSQyLDAKLQlkc3JsCSQyLDEKLQlkc3JsCSQyLDgKLQlkc3JsCSQyLDkKLQlkc3JsCSQyLDYzCi0JZHNybAkkMiwkMwotCWRzcmEJJDIsMAotCWRzcmEJJDIsMQotCWRzcmEJJDIsOAotCWRzcmEJJDIsOQotCWRzcmEJJDIsNjMKLQlkc3JhCSQyLCQzCi0KLQltZmxvCSQyCi0JbWZoaQkkMwotCi0Jc2xsCSQyLCQzLDAKLQlzbGwJJDIsJDMsMQotCXNsbAkkMiwkMyw4Ci0Jc2xsCSQyLCQzLDkKLQlzbGwJJDIsJDMsMzEKLQlzbGwJJDIsJDMKLQlzcmwJJDIsJDMsMAotCXNybAkkMiwkMywxCi0Jc3JsCSQyLCQzLDgKLQlzcmwJJDIsJDMsOQotCXNybAkkMiwkMywzMQotCXNybAkkMiwkMwotCXNyYQkkMiwkMywwCi0Jc3JhCSQyLCQzLDEKLQlzcmEJJDIsJDMsOAotCXNyYQkkMiwkMyw5Ci0Jc3JhCSQyLCQzLDMxCi0Jc3JhCSQyLCQzCi0KLQlkbXVsdAkkMiwkMwotCWRtdWx0dQkkMiwkMwotCWRkaXYJJDIsJDMKLQlkZGl2dQkkMiwkMwotCi0JbXVsdAkkMiwkMwotCW11bHR1CSQyLCQzCi0JZGl2CSQyLCQzCi0JZGl2dQkkMiwkMwotCi0JanIJJDIKLQlqcgkkMzEKLQlqYWxyCSQzMSwkMgotCi0JYmVxegkkMixpbnNuczEKLQliZXF6CSQyLGluc25zMgotCWJlcXoJJDIsYmFyCi0JYmVxegkkMixxdXV4Ci0JYm5legkkMixpbnNuczEKLQlibmV6CSQyLGluc25zMgotCWJuZXoJJDIsYmFyCi0JYm5legkkMixxdXV4Ci0JYnRlcXoJaW5zbnMxCi0JYnRlcXoJaW5zbnMyCi0JYnRlcXoJYmFyCi0JYnRlcXoJcXV1eAotCWJ0bmV6CWluc25zMQotCWJ0bmV6CWluc25zMgotCWJ0bmV6CWJhcgotCWJ0bmV6CXF1dXgKLQliCWluc25zMQotCWIJaW5zbnMyCi0JYgliYXIKLQliCXF1dXgKLQotCWJyZWFrCTAKLQlicmVhawkxCi0JYnJlYWsJNjMKLQotCWphbAlleHRlcm4KLQotCWVudHJ5Ci0JZW50cnkJJDQKLQllbnRyeQkkNC0kNiwkMTYKLQllbnRyeQkkMTYtJDE3LCQzMQotCWVudHJ5CSQzMQotCWV4aXQKLQlleGl0CSQxNgotCWV4aXQJJDE2LSQxNywkMzEKLQlleGl0CSQzMQotCi0JLnAyYWxpZ24gMwotYmFyOgkKLQotCS5za2lwCTIwMAotcXV1eDoJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NmRlOTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5kCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjUwMDAKLSNuYW1lOiBNSVBTIG1pcHM0Ci0jYXM6IC1taXBzNCAtbWNwdT1yNTAwMAotCi0jIFRlc3QgdGhlIG1pcHM0IG1hY3Jvcy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYmMxZgkwMDAwMDAwMCsgPHRleHRfbGFiZWw+Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGJjMWYJXCRmY2MxLDAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KLTArMDAwYyA8W14+XSo+IG5vcAotMCswMDEwIDxbXj5dKj4gYmMxZmwJXCRmY2MxLDAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gYmMxdAlcJGZjYzEsMDAwMDAwMDArIDx0ZXh0X2xhYmVsPgotMCswMDFjIDxbXj5dKj4gbm9wCi0wKzAwMjAgPFtePl0qPiBiYzF0bAlcJGZjYzIsMDAwMDAwMDArIDx0ZXh0X2xhYmVsPgotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBjLmYuZAlcJGY0LFwkZjYKLTArMDAyYyA8W14+XSo+IGMuZi5kCVwkZmNjMSxcJGY0LFwkZjYKLTArMDAzMCA8W14+XSo+IGxkeGMxCVwkZjIsXCRhMFwoXCRhMVwpCi0wKzAwMzQgPFtePl0qPiBsd3hjMQlcJGYyLFwkYTBcKFwkYTFcKQotMCswMDM4IDxbXj5dKj4gbWFkZC5kCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDAzYyA8W14+XSo+IG1hZGQucwlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwNDAgPFtePl0qPiBtb3ZmCVwkYTAsXCRhMSxcJGZjYzQKLTArMDA0NCA8W14+XSo+IG1vdmYuZAlcJGY0LFwkZjYsXCRmY2MwCi0wKzAwNDggPFtePl0qPiBtb3ZmLnMJXCRmNCxcJGY2LFwkZmNjMAotMCswMDRjIDxbXj5dKj4gbW92bglcJGEwLFwkYTIsXCRhMgotMCswMDUwIDxbXj5dKj4gbW92bi5kCVwkZjQsXCRmNSxcJGEyCi0wKzAwNTQgPFtePl0qPiBtb3ZuLnMJXCRmNCxcJGY1LFwkYTIKLTArMDA1OCA8W14+XSo+IG1vdnQJXCRhMCxcJGExLFwkZmNjNAotMCswMDVjIDxbXj5dKj4gbW92dC5kCVwkZjQsXCRmNixcJGZjYzAKLTArMDA2MCA8W14+XSo+IG1vdnQucwlcJGY0LFwkZjYsXCRmY2MwCi0wKzAwNjQgPFtePl0qPiBtb3Z6CVwkYTAsXCRhMixcJGEyCi0wKzAwNjggPFtePl0qPiBtb3Z6LmQJXCRmNCxcJGY1LFwkYTIKLTArMDA2YyA8W14+XSo+IG1vdnoucwlcJGY0LFwkZjUsXCRhMgotMCswMDcwIDxbXj5dKj4gbXN1Yi5kCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDA3NCA8W14+XSo+IG1zdWIucwlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwNzggPFtePl0qPiBubWFkZC5kCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDA3YyA8W14+XSo+IG5tYWRkLnMJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDgwIDxbXj5dKj4gbm1zdWIuZAlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwODQgPFtePl0qPiBubXN1Yi5zCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDA4OCA8W14+XSo+IHByZWZ4CTB4NCxcJGEwXChcJGExXCkKLTArMDA4YyA8W14+XSo+IHJlY2lwLmQJXCRmNCxcJGY2Ci0wKzAwOTAgPFtePl0qPiByZWNpcC5zCVwkZjQsXCRmNgotMCswMDk0IDxbXj5dKj4gcnNxcnQuZAlcJGY0LFwkZjYKLTArMDA5OCA8W14+XSo+IHJzcXJ0LnMJXCRmNCxcJGY2Ci0wKzAwOWMgPFtePl0qPiBzZHhjMQlcJGY0LFwkYTBcKFwkYTFcKQotMCswMGEwIDxbXj5dKj4gc3d4YzEJXCRmNCxcJGEwXChcJGExXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4Yjk0My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCAtbWlwczQgaW5zdHJ1Y3Rpb25zLgotCi10ZXh0X2xhYmVsOgkKLQliYzFmCXRleHRfbGFiZWwKLQliYzFmCSRmY2MxLHRleHRfbGFiZWwKLQliYzFmbAkkZmNjMSx0ZXh0X2xhYmVsCi0JYmMxdAkkZmNjMSx0ZXh0X2xhYmVsCi0JYmMxdGwJJGZjYzIsdGV4dF9sYWJlbAotCWMuZi5kCSRmNCwkZjYKLQljLmYuZAkkZmNjMSwkZjQsJGY2Ci0JbGR4YzEJJGYyLCQ0KCQ1KQotCWx3eGMxCSRmMiwkNCgkNSkKLQltYWRkLmQJJGYwLCRmMiwkZjQsJGY2Ci0JbWFkZC5zCSRmMCwkZjIsJGY0LCRmNgotCW1vdmYJJDQsJDUsJGZjYzQKLQltb3ZmLmQJJGY0LCRmNiwkZmNjMAotCW1vdmYucwkkZjQsJGY2LCRmY2MwCi0JbW92bgkkNCwkNiwkNgotCW1vdm4uZAkkZjQsJGY1LCQ2Ci0JbW92bi5zCSRmNCwkZjUsJDYKLQltb3Z0CSQ0LCQ1LCRmY2M0Ci0JbW92dC5kCSRmNCwkZjYsJGZjYzAKLQltb3Z0LnMJJGY0LCRmNiwkZmNjMAotCW1vdnoJJDQsJDYsJDYKLQltb3Z6LmQJJGY0LCRmNSwkNgotCW1vdnoucwkkZjQsJGY1LCQ2Ci0JbXN1Yi5kCSRmMCwkZjIsJGY0LCRmNgotCW1zdWIucwkkZjAsJGYyLCRmNCwkZjYKLQlubWFkZC5kCSRmMCwkZjIsJGY0LCRmNgotCW5tYWRkLnMJJGYwLCRmMiwkZjQsJGY2Ci0Jbm1zdWIuZAkkZjAsJGYyLCRmNCwkZjYKLQlubXN1Yi5zCSRmMCwkZjIsJGY0LCRmNgotCi0JIyBXZSBkb24ndCB0ZXN0IHByZWYgYmVjYXVzZSBjdXJyZW50bHkgdGhlIGRpc2Fzc2VtYmxlciB3aWxsCi0JIyBkaXNhc3NlbWJsZSBpdCBhcyBsd2MzLiAgbHdjMyBpcyBjb3JyZWN0IGZvciBtaXBzMSB0byBtaXBzMywKLQkjIHdoaWxlIHByZWYgaXMgY29ycmVjdCBmb3IgbWlwczQuICBVbmZvcnR1bmF0ZWx5LCB0aGUKLQkjIGRpc2Fzc2VtYmxlciBkb2VzIG5vdCBrbm93IHdoaWNoIGFyY2hpdGVjdHVyZSBpdCBpcwotCSMgZGlzYXNzZW1ibGluZyBmb3IuCi0JIyBwcmVmCTQsMCgkNCkKLQotCXByZWZ4CTQsJDQoJDUpCi0JcmVjaXAuZAkkZjQsJGY2Ci0JcmVjaXAucwkkZjQsJGY2Ci0JcnNxcnQuZAkkZjQsJGY2Ci0JcnNxcnQucwkkZjQsJGY2Ci0Jc2R4YzEJJGY0LCQ0KCQ1KQotCXN3eGMxCSRmNCwkNCgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQwMTAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQwMTAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkZTE5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAxMAotI25hbWU6IE1JUFMgNDAxMAotI2FzOiAtbWNwdT00MDEwCi0KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8c3R1ZmY+IGZsdXNoaQotMCswMDA0IDxzdHVmZlwrMHg0PiBmbHVzaGQKLTArMDAwOCA8c3R1ZmZcKzB4OD4gZmx1c2hpZAotMCswMDBjIDxzdHVmZlwrMHhjPiBtYWRkCVwkYTAsXCRhMQotMCswMDEwIDxzdHVmZlwrMHgxMD4gbWFkZHUJXCRhMSxcJGEyCi0wKzAwMTQgPHN0dWZmXCsweDE0PiBmZmMJXCRhMixcJGEzCi0wKzAwMTggPHN0dWZmXCsweDE4PiBmZnMJXCRhMyxcJHQwCi0wKzAwMWMgPHN0dWZmXCsweDFjPiBtc3ViCVwkdDAsXCR0MQotMCswMDIwIDxzdHVmZlwrMHgyMD4gbXN1YnUJXCR0MSxcJHQyCi0wKzAwMjQgPHN0dWZmXCsweDI0PiBzZWxzbAlcJHQyLFwkdDMsXCR0NAotMCswMDI4IDxzdHVmZlwrMHgyOD4gc2Vsc3IJXCR0MyxcJHQ0LFwkdDUKLTArMDAyYyA8c3R1ZmZcKzB4MmM+IHdhaXRpCi0wKzAwMzAgPHN0dWZmXCsweDMwPiB3YgkxNlwoXCR0NlwpCi0wKzAwMzQgPHN0dWZmXCsweDM0PiBhZGRjaXUJXCR0NixcJHQ3LDE2Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDZlMjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS50ZXh0Ci0KLXN0dWZmOgotCS5lbnQgc3R1ZmYKLQlmbHVzaGkKLQlmbHVzaGQKLQlmbHVzaGlkCi0JbWFkZCAkNCwkNQotCW1hZGR1ICQ1LCQ2Ci0JZmZjICQ2LCQ3Ci0JZmZzICQ3LCQ4Ci0JbXN1YiAkOCwkOQotCW1zdWJ1ICQ5LCQxMAotCXNlbHNsICQxMCwkMTEsJDEyCi0Jc2Vsc3IgJDExLCQxMiwkMTMKLQl3YWl0aQotCXdiIDE2KCQxNCkKLQlhZGRjaXUgJDE0LCQxNSwxNgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg0ZjEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQxMDAuZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MTAwCi0jbmFtZTogTUlQUyA0MTAwCi0jYXM6IC1tY3B1PTQxMDAKLQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDxzdHVmZj4gZG1hZGQxNglcJGEwLFwkYTEKLQkuLi4KLTArMDAwYyA8c3R1ZmZcKzB4Yz4gbWFkZDE2CVwkYTEsXCRhMgotMCswMDEwIDxzdHVmZlwrMHgxMD4gaGliZXJuYXRlCi0wKzAwMTQgPHN0dWZmXCsweDE0PiBzdGFuZGJ5Ci0wKzAwMTggPHN0dWZmXCsweDE4PiBzdXNwZW5kCi0wKzAwMWMgPHN0dWZmXCsweDFjPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQxMDAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQxMDAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMGUwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQotc3R1ZmY6Ci0JLmVudCBzdHVmZgotCWRtYWRkMTYgJDQsJDUKLQltYWRkMTYgJDUsJDYKLQloaWJlcm5hdGUKLQlzdGFuZGJ5Ci0Jc3VzcGVuZAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTY0MmE2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAuZAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0NjUwCi0jbmFtZTogTUlQUyA0NjUwCi0jYXM6IC1tY3B1PTQ2NTAKLQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDxzdHVmZj4gbWFkCVwkYTAsXCRhMQotCS4uLgotMCswMDBjIDxzdHVmZlwrMHhjPiBtYWR1CVwkYTEsXCRhMgotCS4uLgotMCswMDE4IDxzdHVmZlwrMHgxOD4gbXVsCVwkYTIsXCRhMyxcJHQwCi0wKzAwMWMgPHN0dWZmXCsweDFjPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjMjJhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotCi1zdHVmZjoKLQkuZW50IHN0dWZmCi0JbWFkICQ0LCQ1Ci0JbWFkdSAkNSwkNgotCW11bCAkNiwkNywkOAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC1pbG9ja3MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxZWQyZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC1pbG9ja3MuZAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTUlQUyBtdWwtaWxvY2tzCi0jYXM6Ci0jc291cmNlOiBtdWwucwotCi0jIFRlc3QgdGhlIG11bCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbXVsdHUJXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAwOCA8W14+XSo+IG11bHR1CVwkYTEsXCRhMgotMCswMDBjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LDAKLTArMDAxNCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwMTggPFtePl0qPiBtZmxvCVwkYTAKLTArMDAxYyA8W14+XSo+IGxpCVwkYXQsMQotMCswMDIwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDAyNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyYyA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwMzAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAzNCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwMzggPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDNjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0NCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwNDggPFtePl0qPiBtZmxvCVwkYTAKLTArMDA0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDUwIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA1NCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwNTggPFtePl0qPiBtZmxvCVwkYTAKLTArMDA1YyA8W14+XSo+IG11bHQJXCRhMCxcJGExCi0wKzAwNjAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA2NCA8W14+XSo+IHNyYQlcJGEwLFwkYTAsMHgxZgotMCswMDY4IDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwNmMgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArNzggPGZvb1wrKDB4fCk3OD4KLTArMDA3MCA8W14+XSo+IG5vcAotMCswMDc0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDc4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwN2MgPFtePl0qPiBtdWx0CVwkYTEsXCRhMgotMCswMDgwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwODQgPFtePl0qPiBzcmEJXCRhMCxcJGEwLDB4MWYKLTArMDA4OCA8W14+XSo+IG1maGkJXCRhdAotMCswMDhjIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzk4IDxmb29cKygweHwpOTg+Ci0wKzAwOTAgPFtePl0qPiBub3AKLTArMDA5NCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDA5OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDljIDxbXj5dKj4gbXVsdHUJXCRhMCxcJGExCi0wKzAwYTAgPFtePl0qPiBtZmhpCVwkYXQKLTArMDBhNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGE4IDxbXj5dKj4gYmVxeglcJGF0LDArYjQgPGZvb1wrKDB4fCliND4KLTArMDBhYyA8W14+XSo+IG5vcAotMCswMGIwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMGI0IDxbXj5dKj4gbXVsdHUJXCRhMSxcJGEyCi0wKzAwYjggPFtePl0qPiBtZmhpCVwkYXQKLTArMDBiYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMGMwIDxbXj5dKj4gYmVxeglcJGF0LDArY2MgPGZvb1wrKDB4fCljYz4KLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMGNjIDxbXj5dKj4gZG11bHR1CVwkYTEsXCRhMgotMCswMGQwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZDQgPFtePl0qPiBsaQlcJGF0LDEKLTArMDBkOCA8W14+XSo+IGRtdWx0CVwkYTEsXCRhdAotMCswMGRjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZTAgPFtePl0qPiBkbXVsdAlcJGExLFwkYTIKLTArMDBlNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGU4IDxbXj5dKj4gZHNyYTMyCVwkYTAsXCRhMCwweDFmCi0wKzAwZWMgPFtePl0qPiBtZmhpCVwkYXQKLTArMDBmMCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCtmYyA8Zm9vXCsoMHh8KWZjPgotMCswMGY0IDxbXj5dKj4gbm9wCi0wKzAwZjggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwZmMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEwMCA8W14+XSo+IGRtdWx0dQlcJGExLFwkYTIKLTArMDEwNCA8W14+XSo+IG1maGkJXCRhdAotMCswMTA4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMGMgPFtePl0qPiBiZXF6CVwkYXQsMCsxMTggPGZvb1wrKDB4fCkxMTg+Ci0wKzAxMTAgPFtePl0qPiBub3AKLTArMDExNCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmI2MjY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI2FzOiAtbWNwdT1yNDAwMAotI25hbWU6IE1JUFMgbXVsCi0KLSMgVGVzdCB0aGUgbXVsIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBtdWx0dQlcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMDEwIDxbXj5dKj4gbXVsdHUJXCRhMSxcJGEyCi0wKzAwMTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAxOCA8W14+XSo+IGxpCVwkYXQsMAotMCswMDFjIDxbXj5dKj4gbm9wCi0wKzAwMjAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDI0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LDEKLTArMDAyYyA8W14+XSo+IG5vcAotMCswMDMwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDAzNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDM4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDA0NCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDQ4IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDA1NCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDU4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNWMgPFtePl0qPiBub3AKLTArMDA2MCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwNjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA2OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDZjIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA3MCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwNzQgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDA4MCA8W14+XSo+IG11bHQJXCRhMCxcJGExCi0wKzAwODQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA4OCA8W14+XSo+IHNyYQlcJGEwLFwkYTAsMHgxZgotMCswMDhjIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwOTAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArOWMgPGZvb1wrKDB4fCk5Yz4KLTArMDA5NCA8W14+XSo+IG5vcAotMCswMDk4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDljIDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAwYTggPFtePl0qPiBtdWx0CVwkYTEsXCRhMgotMCswMGFjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYjAgPFtePl0qPiBzcmEJXCRhMCxcJGEwLDB4MWYKLTArMDBiNCA8W14+XSo+IG1maGkJXCRhdAotMCswMGI4IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwK2M0IDxmb29cKygweHwpYzQ+Ci0wKzAwYmMgPFtePl0qPiBub3AKLTArMDBjMCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDBjNCA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMGQwIDxbXj5dKj4gbXVsdHUJXCRhMCxcJGExCi0wKzAwZDQgPFtePl0qPiBtZmhpCVwkYXQKLTArMDBkOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGRjIDxbXj5dKj4gYmVxeglcJGF0LDArZTggPGZvb1wrKDB4fCllOD4KLTArMDBlMCA8W14+XSo+IG5vcAotMCswMGU0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMGU4IDxbXj5dKj4gbXVsdHUJXCRhMSxcJGEyCi0wKzAwZWMgPFtePl0qPiBtZmhpCVwkYXQKLTArMDBmMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGY0IDxbXj5dKj4gYmVxeglcJGF0LDArMTAwIDxmb29cKygweHwpMTAwPgotMCswMGY4IDxbXj5dKj4gbm9wCi0wKzAwZmMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAxMDAgPFtePl0qPiBkbXVsdHUJXCRhMSxcJGEyCi0wKzAxMDQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEwOCA8W14+XSo+IGxpCVwkYXQsMQotMCswMTBjIDxbXj5dKj4gbm9wCi0wKzAxMTAgPFtePl0qPiBkbXVsdAlcJGExLFwkYXQKLTArMDExNCA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMTIwIDxbXj5dKj4gZG11bHQJXCRhMSxcJGEyCi0wKzAxMjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEyOCA8W14+XSo+IGRzcmEzMglcJGEwLFwkYTAsMHgxZgotMCswMTJjIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAxMzAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMTNjIDxmb29cKygweHwpMTNjPgotMCswMTM0IDxbXj5dKj4gbm9wCi0wKzAxMzggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAxM2MgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDE0OCA8W14+XSo+IGRtdWx0dQlcJGExLFwkYTIKLTArMDE0YyA8W14+XSo+IG1maGkJXCRhdAotMCswMTUwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxNTQgPFtePl0qPiBiZXF6CVwkYXQsMCsxNjAgPGZvb1wrKDB4fCkxNjA+Ci0wKzAxNTggPFtePl0qPiBub3AKLTArMDE1YyA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjllMzY5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbXVsIG1hY3JvLgotCQotZm9vOgotCW11bAkkNCwkNQotCW11bAkkNCwkNSwkNgotCW11bAkkNCwkNSwwCi0JbXVsCSQ0LCQ1LDEKLQltdWwJJDQsJDUsMHg4MDAwCi0JbXVsCSQ0LCQ1LC0weDgwMDAKLQltdWwJJDQsJDUsMHgxMDAwMAotCW11bAkkNCwkNSwweDFhNWE1Ci0KLSMgbXVsbyBhbmQgbXVsb3UgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciByZWdpc3RlciBhcmd1bWVudHMJCi0JbXVsbwkkNCwkNQotCW11bG8JJDQsJDUsJDYKLQotCW11bG91CSQ0LCQ1Ci0JbXVsb3UJJDQsJDUsJDYKLQotIyBTYW5pdHkgY2hlY2sgdGhlIDY0IGJpdCB2ZXJzaW9ucy4KLQkuc2V0CW1pcHMzCi0JZG11bAkkNCwkNSwkNgotCWRtdWwJJDQsJDUsMQotCWRtdWxvCSQ0LCQ1LCQ2Ci0JZG11bG91CSQ0LCQ1LCQ2Ci0KLSAgICAgICAgLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbm9kZWxheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ub2RlbGF5LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOTMwNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ub2RlbGF5LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NTAwMAotI25hbWU6IE1JUFMgbm9kZWxheQotI2FzOiAtbWlwczQgLW1jcHU9cjgwMDAKLSNzb3VyY2U6IGRlbGF5LnMKLQotIyBGb3IgLW1pcHM0IAotIyBHYXMgc2hvdWxkICpub3QqIHByb2R1Y2Ugbm9wJ3MgYWZ0ZXIgbXRjMSBhbmQgcmVsYXRlZCAKLSMgaW5zbidzIGlmIHRoZSB0YXJnZXQgZnByIGlzIHVzZWQgaW4gdGhlIGltbWVkaWF0bHkgCi0jIGZvbGxvd2luZyBpbnNuLiAgU2VlIGFsc28gZGVsYXkuZC4KLSMKLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbXRjMQlcJHplcm8sXCRmMAotMCswMDA0IDxbXj5dKj4gY3Z0LmQudwlcJGYwLFwkZjAKLTArMDAwOCA8W14+XSo+IG10YzEJXCR6ZXJvLFwkZjEKLTArMDAwYyA8W14+XSo+IGN2dC5kLncJXCRmMSxcJGYxCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3JvbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjZTE0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3JvbC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNhczogLW1jcHU9cjMwMDAKLSNuYW1lOiBNSVBTIFIzMDAwIHJvbAotCi0jIFRlc3QgdGhlIHJvbCBhbmQgcm9yIG1hY3Jvcy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbmVndQlcJGF0LFwkYTEKLTArMDAwNCA8W14+XSo+IHNybHYJXCRhdCxcJGEwLFwkYXQKLTArMDAwOCA8W14+XSo+IHNsbHYJXCRhMCxcJGEwLFwkYTEKLTArMDAwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTAgPFtePl0qPiBuZWd1CVwkYXQsXCRhMgotMCswMDE0IDxbXj5dKj4gc3JsdglcJGF0LFwkYTEsXCRhdAotMCswMDE4IDxbXj5dKj4gc2xsdglcJGEwLFwkYTEsXCRhMgotMCswMDFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAyMCA8W14+XSo+IHNsbAlcJGF0LFwkYTAsMHgxCi0wKzAwMjQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4MWYKLTArMDAyOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMmMgPFtePl0qPiBzbGwJXCRhdCxcJGExLDB4MQotMCswMDMwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMSwweDFmCi0wKzAwMzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDM4IDxbXj5dKj4gbmVndQlcJGF0LFwkYTEKLTArMDAzYyA8W14+XSo+IHNsbHYJXCRhdCxcJGEwLFwkYXQKLTArMDA0MCA8W14+XSo+IHNybHYJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNDggPFtePl0qPiBuZWd1CVwkYXQsXCRhMgotMCswMDRjIDxbXj5dKj4gc2xsdglcJGF0LFwkYTEsXCRhdAotMCswMDUwIDxbXj5dKj4gc3JsdglcJGEwLFwkYTEsXCRhMgotMCswMDU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA1OCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHgxCi0wKzAwNWMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4MWYKLTArMDA2MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNjQgPFtePl0qPiBzcmwJXCRhdCxcJGExLDB4MQotMCswMDY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMSwweDFmCi0wKzAwNmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OWE5NTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSByb2wgYW5kIHJvciBtYWNyb3MuCi0KLWZvbzoKLQlyb2wJJDQsJDUKLQlyb2wJJDQsJDUsJDYKLQlyb2wJJDQsMQotCXJvbAkkNCwkNSwxCi0KLQlyb3IJJDQsJDUKLQlyb3IJJDQsJDUsJDYKLQlyb3IJJDQsMQotCXJvcgkkNCwkNSwxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3NiLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3NiLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjRiYzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBzYgotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSBzYiBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2IJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gc2IJXCRhMCwxXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMGMgPFtePl0qPiBzYglcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMTAgPFtePl0qPiBzYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAxNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDIwIDxbXj5dKj4gc2IJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDI0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGExXCkKLTArMDAyOCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhMVwpCi0wKzAwMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDAzNCA8W14+XSo+IHNiCVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAzOCA8W14+XSo+IHNiCVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDAzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMDQ0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDA0OCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMDUwIDxbXj5dKj4gc2IJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IHNiCVwkYTAsMFwoXCRncFwpCi1bIAldKjY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSo2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzAgPFtePl0qPiBzYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA3OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMDdjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA4NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDhjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5MCA8W14+XSo+IHNiCVwkYTAsMVwoXCRncFwpCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo5NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOWMgPFtePl0qPiBzYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhNCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGE4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGIwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSpiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSpjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwZDggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDBlMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDBlNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSplODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTA4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTBjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDExMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjExMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTE4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDExYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjExYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTI0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjEzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNDggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTUwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE1NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTZjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxN2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxODAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxODQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTg4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMTk0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDFhMCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWE4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWI0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFiYyA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjFiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAxYzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxY2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxZDAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAxZGMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWU4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxZjAgPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotWyAJXSoxZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAxZmMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMjA0IDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLVsgCV0qMjA0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjA4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDIxMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIxMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDIxOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjI0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjMwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjNjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyNDggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjU0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjYwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI2YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI3OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyODQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjkwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjk4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjljIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyYTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmI0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyYzAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJjYyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJkOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjJkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJlNCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjJlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmYwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJmNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJmOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJmYyA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDMwOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMwYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMTQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMxYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDMyMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMyOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDMyYyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzMwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDMzOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzM2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzQ0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM0YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDM1MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM1NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM1OCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDM1YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzNjggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzZjIDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswMzcwIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswMzc0IDxbXj5dKj4gc2gJXCRhMCwwXChcJHplcm9cKQotMCswMzc4IDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswMzdjIDxbXj5dKj4gc3djMAlcJDQsMFwoXCR6ZXJvXCkKLTArMDM4MCA8W14+XSo+IHN3YzEJXCRmNCwwXChcJHplcm9cKQotMCswMzg0IDxbXj5dKj4gc3djMglcJDQsMFwoXCR6ZXJvXCkKLTArMDM4OCA8W14+XSo+IHN3YzMJXCQ0LDBcKFwkemVyb1wpCi0wKzAzOGMgPFtePl0qPiBzd2MxCVwkZjQsMFwoXCR6ZXJvXCkKLTArMDM5MCA8W14+XSo+IHN3bAlcJGEwLDBcKFwkemVyb1wpCi0wKzAzOTQgPFtePl0qPiBzd3IJXCRhMCwwXChcJHplcm9cKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGM3MzU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgc2IgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXNiCSQ0LDAKLQlzYgkkNCwxCi0Jc2IJJDQsMHg4MDAwCi0Jc2IJJDQsLTB4ODAwMAotCXNiCSQ0LDB4MTAwMDAKLQlzYgkkNCwweDFhNWE1Ci0Jc2IJJDQsMCgkNSkKLQlzYgkkNCwxKCQ1KQotCXNiCSQ0LDB4ODAwMCgkNSkKLQlzYgkkNCwtMHg4MDAwKCQ1KQotCXNiCSQ0LDB4MTAwMDAoJDUpCi0Jc2IJJDQsMHgxYTVhNSgkNSkKLQlzYgkkNCxkYXRhX2xhYmVsCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlzYgkkNCxkYXRhX2xhYmVsKzEKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXNiCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQlzYgkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlzYgkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCXNiCSQ0LGRhdGFfbGFiZWwoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlzYgkkNCxkYXRhX2xhYmVsKzEoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQlzYgkkNCxkYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JCi0jIFNldmVyYWwgbWFjcm9zIGFyZSBoYW5kbGVkIGxpa2Ugc2IuICBTYW5pdHkgY2hlY2sgdGhlbS4KLQlzZAkkNCwwCi0Jc2gJJDQsMAotCXN3CSQ0LDAKLQlzd2MwCSQ0LDAKLQlzd2MxCSQ0LDAKLQlzd2MyCSQ0LDAKLQlzd2MzCSQ0LDAKLQlzLnMJJGY0LDAKLQlzd2wJJDQsMAotCXN3cgkkNCwwCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjlhMTg3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLS1zaG93LXJhdy1pbnNuCi0jbmFtZTogc3luYyBpbnN0cnVjdGlvbnMKLSNhczogLW1pcHMyCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPGZvbz4gMDAwMDAwMGZbIAldKnN5bmMKLTArMDAwNCA8Zm9vXCsweDQ+IDAwMDAwNDBmWyAJXSpzeW5jLnAKLTArMDAwOCA8Zm9vXCsweDg+IDAwMDAwMDBmWyAJXSpzeW5jCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWMwZWQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWZvbzoKLQlzeW5jCi0Jc3luYy5wCi0Jc3luYy5sCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3YWRiMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2FzOiAtbWNwdT1yNDAwMAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIDIwLWJpdCB0cmFwCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHRlcQlcJHplcm8sXCR2MQotMCswMDA0IDxbXj5dKj4gdGVxCVwkemVybyxcJHYxLDB4MQotMCswMDA4IDxbXj5dKj4gdGdlCVwkemVybyxcJHYxCi0wKzAwMGMgPFtePl0qPiB0Z2UJXCR6ZXJvLFwkdjEsMHgzCi0wKzAwMTAgPFtePl0qPiB0Z2V1CVwkemVybyxcJHYxCi0wKzAwMTQgPFtePl0qPiB0Z2V1CVwkemVybyxcJHYxLDB4NwotMCswMDE4IDxbXj5dKj4gdGx0CVwkemVybyxcJHYxCi0wKzAwMWMgPFtePl0qPiB0bHQJXCR6ZXJvLFwkdjEsMHgxZgotMCswMDIwIDxbXj5dKj4gdGx0dQlcJHplcm8sXCR2MQotMCswMDI0IDxbXj5dKj4gdGx0dQlcJHplcm8sXCR2MSwweGZmCi0wKzAwMjggPFtePl0qPiB0bmUJXCR6ZXJvLFwkdjEKLTArMDAyYyA8W14+XSo+IHRuZQlcJHplcm8sXCR2MSwweDNmZgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmQ2NTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSAyMC1iaXQgdHJhcCBpbnN0cnVjdGlvbnMKLWZvbzoJCi0JdGVxCSQwLCQzCi0JdGVxCSQwLCQzLDEKLQl0Z2UJJDAsJDMKLQl0Z2UJJDAsJDMsMwotCXRnZXUJJDAsJDMKLQl0Z2V1CSQwLCQzLDcKLQl0bHQJJDAsJDMKLQl0bHQJJDAsJDMsMzEKLQl0bHR1CSQwLCQzCi0JdGx0dQkkMCwkMywyNTUKLQl0bmUJJDAsJDMKLQl0bmUJJDAsJDMsMTAyMwotCQotIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCi0jIGhlcmUuLi4KLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzM4YWUxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB0cnVuYwotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAKLQotIyBUZXN0IHRoZSB0cnVuYyBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCi0wKzAwMDQgPFtePl0qPiBjZmMxCVwkYTAsXCQzMQotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBvcmkJXCRhdCxcJGEwLDB4MwotMCswMDEwIDxbXj5dKj4geG9yaQlcJGF0LFwkYXQsMHgyCi0wKzAwMTQgPFtePl0qPiBjdGMxCVwkYXQsXCQzMQotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBjdnQudy5kCVwkZjQsXCRmNgotMCswMDIwIDxbXj5dKj4gY3RjMQlcJGEwLFwkMzEKLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gY2ZjMQlcJGEwLFwkMzEKLTArMDAyYyA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCi0wKzAwMzAgPFtePl0qPiBub3AKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYTAsMHgzCi0wKzAwMzggPFtePl0qPiB4b3JpCVwkYXQsXCRhdCwweDIKLTArMDAzYyA8W14+XSo+IGN0YzEJXCRhdCxcJDMxCi0wKzAwNDAgPFtePl0qPiBub3AKLTArMDA0NCA8W14+XSo+IGN2dC53LnMJXCRmNCxcJGY2Ci0wKzAwNDggPFtePl0qPiBjdGMxCVwkYTAsXCQzMQotMCswMDRjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZTkwZjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdHJ1bmMgbWFjcm9zLgotCi1mb286Ci0JdHJ1bmMudy5kCSRmNCwkZjYsJDQKLQotCXRydW5jLncucwkkZjQsJGY2LCQ0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZTI5ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyB1bGQKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0KLSMgVGVzdCB0aGUgdWxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGxkbAlcJGEwLFsxOF1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsZHIJXCRhMCxbMThdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxNCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsZGwJXCRhMCwtMzI3NlsxOF1cKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsZHIJXCRhMCwtMzI3NlsxOF1cKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMzggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGExXCkKLTArMDA0OCA8W14+XSo+IGxkbAlcJGEwLFsxOF1cKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbGRyCVwkYTAsWy0wLTldK1woXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA2YyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA5NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGE4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGI4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiYyA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGNjIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSplNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBlYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGYwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEwOCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDExNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTcwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTg0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWE0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFkNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFkYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxZTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFlNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFmMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIwNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjc0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjg0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJhOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJiNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmM0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJkNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYWZmYmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1bGQgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVsZAkkNCwwCi0JdWxkCSQ0LDEKLQl1bGQJJDQsMHg4MDAwCi0JdWxkCSQ0LC0weDgwMDAKLQl1bGQJJDQsMHgxMDAwMAotCXVsZAkkNCwweDFhNWE1Ci0JdWxkCSQ0LDAoJDUpCi0JdWxkCSQ0LDEoJDUpCi0JdWxkCSQ0LGRhdGFfbGFiZWwKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVsZAkkNCxkYXRhX2xhYmVsKzEKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVsZAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdWxkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bGQJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bGQJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDVmMDZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWxoLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotI3NvdXJjZTogdWxoLXBpYy5zCi0KLSMgVGVzdCB0aGUgdWxoIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODQKLVsgCV0qMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDA0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAwOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDBjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAxMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSoxNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDE4IDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDAyMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDJjIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDAzOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDQwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA0NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDQ4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA0YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo1MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA1NCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDU4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2Mzg0Ci1bIAldKjVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA2OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNTM4NAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNzQgPFtePl0qPiBsYnUJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA4MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwODQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2MzgzCi1bIAldKjg0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwODggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDljIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBhMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBhOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSphYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGJjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBjOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpjYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkMCA8W14+XSo+IGxidQlcJGEwLFswMV1cKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwZDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODMKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGU0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZTggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTUzODMKLVsgCV0qZWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGYwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBmNCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwZjggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMDAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTA0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtcGljLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2IyOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIFRlc3QgdW5hbGlnbmVkIGxvYWQgYW5kIHN0b3JlIG1hY3JvcyB3aXRoIFBJQyBjb2RlLiAgV2UgZG9uJ3QgYm90aGVyCi0jIHRvIHRlc3QgbW9zdCBjYXNlcy4gIFRoZSBhY3R1YWwgbG9hZHMgYW5kIHN0b3JlcyBhcmUgdGVzdGVkIGJ5IHRoZQotIyBub24tUElDIHRlc3QgY2FzZS4gIFdlIGp1c3Qgd2FudCB0byBjaGVjayB0aGF0IHRoZSBpbml0aWFsIGFkZHJlc3MKLSMgaXMgbG9hZGVkIGNvcnJlY3RseS4KLQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1bGgJJDQsZGF0YV9sYWJlbAotCXVsaHUJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdWxodQkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1bHcJJDQsZGF0YV9sYWJlbCsxCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVsaHUJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0JLmlmbmRlZglYR09UCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTMzYmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bGgtc3ZyNHBpYwotI2FzOiAtbWlwczEgLUtQSUMgLUVCCi0jc291cmNlOiB1bGgtcGljLnMKLQotIyBUZXN0IHRoZSB1bmFsaWduZWQgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDAxMCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAxOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMWMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMDI4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAzNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjM0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDM4IDxbXj5dKj4gbm9wCi0wKzAwM2MgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDA0MCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qNDQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAwNTAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDU0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDA1OCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA2MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo2NDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDY4IDxbXj5dKj4gbm9wCi0wKzAwNmMgPFtePl0qPiBzd2wJXCRhMCwwXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IHN3cglcJGEwLDNcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qNzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwNzggPFtePl0qPiBub3AKLTArMDA3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjdjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwODAgPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMDg0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwODggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDhjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjkwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMDk0IDxbXj5dKj4gbm9wCi0wKzAwOTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSo5ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMDljIDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAwYTAgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGFjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYWM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGIwIDxbXj5dKj4gbm9wCi0wKzAwYjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpiNDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAwYmMgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYzQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gbm9wCi0wKzAwY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMGQwIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwZDggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBlOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmU4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gbm9wCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMGY0IDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmZjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbm9wCi0wKzAxMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTA4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDExNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDExYyA8W14+XSo+IG5vcAotMCswMTIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDEyNCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMTI4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDEzNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEzNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDEzOCA8W14+XSo+IG5vcAotMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMTNjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTQ0IDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDE0YyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE0YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE1MCA8W14+XSo+IG5vcAotMCswMTU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qMTU0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTVjIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDE2MCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxNjQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxNmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTcwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyZjljZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVsaC14Z290Ci0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdCAtRUIgLS1kZWZzeW0gWEdPVD0xCi0jc291cmNlOiB1bGgtcGljLnMKLQotIyBUZXN0IHRoZSB1bmFsaWduZWQgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDBjIDxbXj5dKj4gbm9wCi0wKzAwMTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMDE0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAyMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwMjggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMmMgPFtePl0qPiBub3AKLTArMDAzMCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMDM0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDNjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA0MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo0MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDA0OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjQ4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDA1NCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMDU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjU4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMDYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qNjA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDcwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDA3NCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA3YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDA4OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjg4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IHN3bAlcJGEwLDBcKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gc3dyCVwkYTAsM1woXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5YyA8W14+XSo+IG5vcAotMCswMGEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qYTA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDBhYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBiNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYjggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpiODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBiYyA8W14+XSo+IG5vcAotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qYzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDBkMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZDg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGRjIDxbXj5dKj4gbm9wCi0wKzAwZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSplMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBlNCA8W14+XSo+IG5vcAotMCswMGU4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDBlYyA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMGYwIDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGZjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qZmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTAwIDxbXj5dKj4gbm9wCi0wKzAxMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTA4IDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxMTAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDEyMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxMjggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxMjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBub3AKLTArMDEzMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxMzQgPFtePl0qPiBzd2wJXCRhMCwwXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IHN3cglcJGEwLDNcKFwkYXRcKQotMCswMTNjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEzYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE0NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE0NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IG5vcAotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE1MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTY4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTY4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNmMgPFtePl0qPiBub3AKLTArMDE3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxNzQgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTdjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE4MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxODQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxODQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxODggPFtePl0qPiBub3AKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjE4YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTkwIDxbXj5dKj4gbm9wCi0wKzAxOTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTk4IDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAxOWMgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDFhMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFhMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFhNCA8W14+XSo+IG5vcAotMCswMWE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qMWE4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxYWMgPFtePl0qPiBub3AKLTArMDFiMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxYjQgPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDFiYyA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAxYzAgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWNjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2ZDRiNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bGgKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgdWxoIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTAgPFtePl0qPiBsYglcJGEwLFsxMl1cKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsYnUJXCRhdCxbMTJdXChcJHplcm9cKQotMCswMDE4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAxYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDI0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAyOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAzMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2Wzc4XVwoXCR6ZXJvXCkKLTArMDAzOCA8W14+XSo+IGxidQlcJGF0LC0zMjc2Wzc4XVwoXCR6ZXJvXCkKLTArMDAzYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNDAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDRjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA1OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDVjIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA2OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGExXCkKLTArMDA3NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYTFcKQotMCswMDc4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA3YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwODAgPFtePl0qPiBsYglcJGEwLFsxMl1cKFwkYTFcKQotMCswMDg0IDxbXj5dKj4gbGJ1CVwkYXQsWzEyXVwoXCRhMVwpCi0wKzAwODggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDhjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA5NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA5OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwOWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBhMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGIwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGI4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBiYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGM4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBkNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZGMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwZTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBmNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBmYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDExOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjExODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMWMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEzNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDEzYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNDAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQ4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNGMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjE1YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE3MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxN2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE4MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxODQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTg4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qMTg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMThjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWE0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWFjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFiMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxYjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWI4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFiYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWMwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFjNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFkMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxZGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFmMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxZjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjBjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDIxMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjE4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIxYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjIwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIyNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjNjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNGMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI1MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyNTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI3MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyN2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI4MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyODQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjljIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJhMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJhOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJiMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyYjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmMwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJjYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyZDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmQ4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJkYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmUwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJlNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJmNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJmYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDMwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjMwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzBjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzMTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDMxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzIwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMyNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzI4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDMyYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzMzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjMzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzM4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMzYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzQwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM0NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMzRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM1OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzNWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjM2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNjggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzZjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzNzAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzc0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjM3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM4MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzODQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM4OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzOGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzkwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzk0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzk4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM5YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2EwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNhNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswM2FjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2FjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDNiMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzYjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNiOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzYmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2MwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2MwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDNjNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2NjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzZDAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2Q0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNkOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2RjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2RjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2U0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzZTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2VjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNmMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2Y4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNmYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDAwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQwNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0MDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0MDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQxMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDIwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDI4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQyYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDMwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQzNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0MzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0Mzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0M2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0M2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0NDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQ1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDU4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ1YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDYwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ2NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0NjggPFtePl0qPiBsYnUJXCRhMCxbMDFdXChcJHplcm9cKQotMCswNDZjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCR6ZXJvXCkKLTArMDQ3MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0NzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZWNiYjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgucworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1bGggbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVsaAkkNCwwCi0JdWxoCSQ0LDEKLQl1bGgJJDQsMHg4MDAwCi0JdWxoCSQ0LC0weDgwMDAKLQl1bGgJJDQsMHgxMDAwMAotCXVsaAkkNCwweDFhNWE1Ci0JdWxoCSQ0LDAoJDUpCi0JdWxoCSQ0LDEoJDUpCi0JdWxoCSQ0LGRhdGFfbGFiZWwKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVsaAkkNCxkYXRhX2xhYmVsKzEKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVsaAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdWxoCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bGgJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bGgJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyB1bGh1IGlzIGhhbmRsZWQgbGlrZSB1bGguICBTYW5pdHkgY2hlY2sgaXQuCi0JdWxodQkkNCwwCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiZGM5NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bHcKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgdWx3IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3bAlcJGEwLFsxNF1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsd3IJXCRhMCxbMTRdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxNCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsd2wJXCRhMCwtMzI3Nls1OF1cKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsd3IJXCRhMCwtMzI3Nls1OF1cKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMzggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGExXCkKLTArMDA0OCA8W14+XSo+IGx3bAlcJGEwLFsxNF1cKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbHdyCVwkYTAsWy0wLTldK1woXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwODggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDkwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYmMgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGNjIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTA4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEzNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTYwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE3MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTg0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFhNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWIwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWM0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxZTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFlNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWYwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjAwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIyNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjU0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjc0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyODQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJhOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmI0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJkNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzZmMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1bHcgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVsdwkkNCwwCi0JdWx3CSQ0LDEKLQl1bHcJJDQsMHg4MDAwCi0JdWx3CSQ0LC0weDgwMDAKLQl1bHcJJDQsMHgxMDAwMAotCXVsdwkkNCwweDFhNWE1Ci0JdWx3CSQ0LDAoJDUpCi0JdWx3CSQ0LDEoJDUpCi0JdWx3CSQ0LGRhdGFfbGFiZWwKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVsdwkkNCxkYXRhX2xhYmVsKzEKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVsdwkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdWx3CSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bHcJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bHcJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2MwYjczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIHVzZAotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLQotIyBUZXN0IHRoZSB1c2QgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gc2RsCVwkYTAsWzE4XVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IHNkcglcJGEwLFsxOF1cKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDE0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDAxYyA8W14+XSo+IHNkbAlcJGEwLC0zMjc2WzE4XVwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IHNkcglcJGEwLC0zMjc2WzE4XVwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAzOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGExXCkKLTArMDA0NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gc2RsCVwkYTAsWzE4XVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBzZHIJXCRhMCxbLTAtOV0rXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA4OCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDkwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYmMgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTM0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE3MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE4NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFhNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFmYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjAwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI4NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDM2NzM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdXNkIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1c2QJJDQsMAotCXVzZAkkNCwxCi0JdXNkCSQ0LDB4ODAwMAotCXVzZAkkNCwtMHg4MDAwCi0JdXNkCSQ0LDB4MTAwMDAKLQl1c2QJJDQsMHgxYTVhNQotCXVzZAkkNCwwKCQ1KQotCXVzZAkkNCwxKCQ1KQotCXVzZAkkNCxkYXRhX2xhYmVsCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1c2QJJDQsZGF0YV9sYWJlbCsxCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1c2QJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzZAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdXNkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXNkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2guZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmMGExMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1c2gKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgdXNoIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDA4IDxbXj5dKj4gc2IJXCRhdCxbMDFdXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gc2IJXCRhMCxbMTJdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKLTArMDAxNCA8W14+XSo+IHNiCVwkYXQsWzEyXVwoXCR6ZXJvXCkKLTArMDAxOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDIwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDAyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMjggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDM0IDxbXj5dKj4gc2IJXCRhMCwtMzI3Nls3OF1cKFwkemVyb1wpCi0wKzAwMzggPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDNjIDxbXj5dKj4gc2IJXCRhdCwtMzI3Nls3OF1cKFwkemVyb1wpCi0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2MCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDdjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGExXCkKLTArMDA4MCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4Ci0wKzAwODQgPFtePl0qPiBzYglcJGF0LFswMV1cKFwkYTFcKQotMCswMDg4IDxbXj5dKj4gc2IJXCRhMCxbMTJdXChcJGExXCkKLTArMDA4YyA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4Ci0wKzAwOTAgPFtePl0qPiBzYglcJGF0LFsxMl1cKFwkYTFcKQotMCswMDk0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDk4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDljIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBhMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwYTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGE4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwYWMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGIwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBjOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBkMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDBlMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBlOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxMDAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTA0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTBjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDExMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjExMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDExNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEyMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEyOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDEzYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNDAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNDggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE1MCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTU4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE1YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTYwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE2NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDE3OCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxN2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE4MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxODQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDE5OCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxOWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFhMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxYjAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMWI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFjMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWQwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDFkNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFkYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxZTAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qMWU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWU4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFlYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxZjAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDIwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjBjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDIxMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMjIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDIyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyM2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyNWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI2MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyNmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyNzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI3YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyOGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI5YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJhOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyYWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJiYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMmNjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJkMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmQ0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJkOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyZGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyZTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmU4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDJlYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJmNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyZjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmZjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDMwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjMwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzA4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDMwYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDMxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzMTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMyOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzMmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzMwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzMzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjM0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQ0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM0OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzNGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzNTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM1YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMzZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjM4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzg4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDM4YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzOTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzOTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzYTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswM2FjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNiMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2I0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNiOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2MwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2MwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2M0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNjOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzY2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2QwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzZDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2Q4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNkYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswM2UwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2UwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDNlNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzZTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswM2VjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNmMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2Y0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNmOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzZmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQwNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDBjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQxMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQxOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0MWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjQyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQyOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0MmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDMwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0MzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQzYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0NDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDQ0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ0OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0NGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0NTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQ1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0NjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0NmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0NzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjQ4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0ODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDhjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0YTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0YTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0YTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGE4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDRhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0YjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDRiNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0YjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDRjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjRjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0YzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGM4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDRjYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0ZDAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDRkNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0ZDggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNGRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDRlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjRlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ZTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGU4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDRlYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0ZjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDRmNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0ZjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNGZjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1MDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUwNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1MDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNTBjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDUxMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDUxOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1MWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1MjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNTJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDUzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDUzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1M2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1M2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNTQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1NDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNTRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDU1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1NWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDU2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1NzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDU3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1NzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTdjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNTgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNTg0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU4OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1OGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1OTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNTk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDU5YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjU5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1YTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNWE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDVhOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1YWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNWIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1YjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNWI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDViYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTU4MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2gucworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1c2ggbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVzaAkkNCwwCi0JdXNoCSQ0LDEKLQl1c2gJJDQsMHg4MDAwCi0JdXNoCSQ0LC0weDgwMDAKLQl1c2gJJDQsMHgxMDAwMAotCXVzaAkkNCwweDFhNWE1Ci0JdXNoCSQ0LDAoJDUpCi0JdXNoCSQ0LDEoJDUpCi0JdXNoCSQ0LGRhdGFfbGFiZWwKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVzaAkkNCxkYXRhX2xhYmVsKzEKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVzaAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdXNoCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c2gJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1c2gJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQyOGNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVzdwotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSB1c3cgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gc3dsCVwkYTAsWzE0XVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IHN3cglcJGEwLFsxNF1cKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDE0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAxYyA8W14+XSo+IHN3bAlcJGEwLC0zMjc2WzU4XVwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IHN3cglcJGEwLC0zMjc2WzU4XVwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAzOCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGExXCkKLTArMDA0NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gc3dsCVwkYTAsWzE0XVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBzd3IJXCRhMCxbLTAtOV0rXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGJjIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlOCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGVjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEwOCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE4NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWUwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFmMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIwMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjg0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJiNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmMwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjFjNjBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdXN3IG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1c3cJJDQsMAotCXVzdwkkNCwxCi0JdXN3CSQ0LDB4ODAwMAotCXVzdwkkNCwtMHg4MDAwCi0JdXN3CSQ0LDB4MTAwMDAKLQl1c3cJJDQsMHgxYTVhNQotCXVzdwkkNCwwKCQ1KQotCXVzdwkkNCwxKCQ1KQotCXVzdwkkNCxkYXRhX2xhYmVsCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1c3cJJDQsZGF0YV9sYWJlbCsxCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVzdwkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1c3cJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzdwkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzdwkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdXN3CSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXN3CSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9hZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyNTFiYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JYWRkIGQxLGQyCi0JYWRkIGQyLGEzCi0JYWRkIGEyLGQxCi0JYWRkIGEzLGEyCi0JYWRkIDE2LGQxCi0JYWRkIDI1NixkMgotCWFkZCAxMzEwNzEsZDMKLQlhZGQgMTYsYTEKLQlhZGQgMjU2LGEyCi0JYWRkIDEzMTA3MSxhMwotCWFkZGMgZDEsZDIKLQlhZGRuZiAxNixhMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5M2ViMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDgzNiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2FkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGQuczogQWRkIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjIwQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjJDOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjI0RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRDUxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjcxQTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEY0NjNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRDExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjcwQTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY0NjdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFkIEYyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEY1MEUxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJjYy5zOiBCY2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiY2MucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBFOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBFMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBFMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBFNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBFNjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBFNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBFNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNUZDMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY1RkQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjVGRTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCBGNUZGMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEVBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JjY3gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmNjeC5zOiBCY2N4IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmNjeC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1RTgwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjVFOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGNUUxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEY1RTIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjVFMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGNUUwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY1RTUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjVFNjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGNUU3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIEY1RTQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRjVFQzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGNUVEMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY1RUUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjVFRjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19iaXQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0LnM6IGJpdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1MDU0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjcwNjAwMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEYwMjlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEYwMzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArRkZGRjQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1wcm9jIGRvX2NtcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjbXAuczogY21wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY21wLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjM5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjIyQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjJFRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjI2RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggREIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjc0QTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEY0NzlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRUUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNDdERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0LnM6IGV4dCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEIyXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgQjdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBCQVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEJEXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRlbmQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0ZW5kLnM6IGV4dGVuZGVkIGluc3RydWN0aW9uIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0ZW5kLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjUwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjZGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjkwMjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQjAzMDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkQwMzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEY2MTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY5MTYxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkIxNzAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZEMTcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjY0QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjY1RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjY3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2FsLnM6IGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjUwMjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGNzAzRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjcxMEZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEYzMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY1MEE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjc0M0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY3MTRGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGMzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNzRGRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjNFN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl5cW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAibG9vcC5zOiBsb29wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9vcC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ4XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBEMVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEQyXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDNcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBEMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEQ1XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRDZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEQ0XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgREFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBEQlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjEge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92MS5zOiBtb3YxIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92MS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyMzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYyRjlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDg2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjI3OVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjNGM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjNEOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgRjNFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjNDOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgMjlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCA2OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGN0M5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjQ4OUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YyLnM6IG1vdjIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjE1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQzkwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGNEMxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIDc5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY3QjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNEY5RkZGRiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGMTE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGNzMxMDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgRjREMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YzLnM6IG1vdjMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YzLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIDQ5MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY3ODkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGNDA5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYxRTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEMxODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTEgRjQ0MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiA1OTIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGN0E5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjQxOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92NCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Y0LnM6IG1vdjQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Y0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjFBOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjcyMTgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY0NTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgODUwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNDcxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEREMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjQ3NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3Z4IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdnguczogbW92eCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdngucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTc5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY3NzkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGNEI5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY1NTkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjc2OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEY0MzlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZiIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmIuczogbW92YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTI5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY3RDkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGNEE5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYwNkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEY0QzZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgMTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY1MTkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRjc5OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIEY0MjlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwRTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEM1MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjUgRjQ0NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92YnUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92YnUuczogbW92YnUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZidS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDM5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGNTM5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY3NTkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGNDk5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEYwOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIENEMDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjRDOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmh1IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmh1LnM6IG1vdmh1IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92aHUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMDY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGODY2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBNjYwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQzY2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjhCRDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGQUJEMDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRkNCRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY0QTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDM5ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRkNBRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGMDc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBGODc2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEZBNzYwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGQzc2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY4OTcyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzkgRkE5NzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNkIEZDOTcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTggK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjREQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDUgMDcwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGQzg3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIxICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdm0ge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92bS5zOiBtb3ZtIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92bS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIENFMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIENFRjhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IENGMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IENGRjhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbXVsZGl2IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm11bGRpdi5zOiBtdWxkaXYgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtdWxkaXYucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMzQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMzVCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMzZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX290aGVyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm90aGVyLnM6IG90aGVyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAib3RoZXIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGQzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY0RTBGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjAwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGNEUxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYwMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBFQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoaWZ0LnM6IHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hpZnQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMzNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMzM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMzMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdWIuczogc3ViIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3ViLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYyREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYyNUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY3MUVGRjdGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgRjQ2QUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNzBFRkY3RiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY0NkVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTkgRjI5NiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgbW4xMDIwMCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hZGQKLSAgICBkb19iY2MKLSAgICBkb19iY2N4Ci0gICAgZG9fYml0Ci0gICAgZG9fY21wCi0gICAgZG9fZXh0Ci0gICAgZG9fbG9naWNhbAotICAgIGRvX21vdjEKLSAgICBkb19tb3YyCi0gICAgZG9fbW92MwotICAgIGRvX21vdjQKLSAgICBkb19tb3ZiCi0gICAgZG9fbW92eAotICAgIGRvX21vdmJ1Ci0gICAgZG9fbXVsZGl2Ci0gICAgZG9fb3RoZXIKLSAgICBkb19zaGlmdAotICAgIGRvX3N1YgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTJkY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2MucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQkudGV4dAotZm9vOgotCWJlcSBmb28KLQlibmUgZm9vCi0JYmd0IGZvbwotCWJnZSBmb28KLQlibGUgZm9vCi0JYmx0IGZvbwotCWJoaSBmb28KLQliY2MgZm9vCi0JYmxzIGZvbwkKLQliY3MgZm9vCi0JYnZjIGZvbwotCWJ2cyBmb28KLQlibmMgZm9vCi0JYm5zIGZvbwotCWJyYSBmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjeC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2N4LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTdlZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2N4LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLnRleHQKLWZvbzoKLQliZXF4IGZvbwotCWJuZXggZm9vCi0JYmd0eCBmb28KLQliZ2V4IGZvbwotCWJsZXggZm9vCi0JYmx0eCBmb28KLQliaGl4IGZvbwotCWJjY3ggZm9vCi0JYmxzeCBmb28JCi0JYmNzeCBmb28KLQlidmN4IGZvbwotCWJ2c3ggZm9vCi0JYm5jeCBmb28KLQlibnN4IGZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjYwZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iaXQucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JYnRzdCA2NCxkMQotCWJ0c3QgODE5MixkMgotCWJzZXQgZDEsKGEyKQotCWJjbHIgZDEsKGEyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9jbXAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvY21wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzkyNWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9jbXAucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCWNtcCBkMSxkMgotCWNtcCBkMixhMwotCWNtcCBhMyxkMwotCWNtcCBhMyxhMgotCWNtcCAxNixkMwotCWNtcCAyNTYsZDIKLQljbXAgMTMxMDcxLGQxCi0JY21wIDI1NixhMgotCWNtcCAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvZXh0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2V4dC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmUwMWJhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvZXh0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkudGV4dAotCWV4dCBkMQotCWV4dHggZDIKLQlleHR4dSBkMwotCWV4dHhiIGQyCi0JZXh0eGJ1IGQxCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODA5ZDdmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS50ZXh0Ci0JYW5kIGQxLGQyCi0JYW5kIDEyNyxkMgotCWFuZCAzMjc2NyxkMwotCWFuZCAzMjc2Nyxwc3cKLQlvciBkMSxkMgotCW9yIDEyNyxkMgotCW9yIDMyNzY3LGQzCi0Jb3IgMzI3NjcscHN3Ci0JeG9yIGQxLGQyCi0JeG9yIDMyNzY3LGQzCi0Jbm90IGQzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODI4ZTMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGQxLGEyCi0JbW92IGEyLGQxCi0JbW92IGQxLGQyCi0JbW92IGEyLGExCi0JbW92IHBzdyxkMwotCW1vdiBkMixwc3cKLQltb3YgbWRyLGQxCi0JbW92IGQyLG1kcgotCW1vdiAoYTIpLGQxCi0JbW92ICg4LGEyKSxkMQotCW1vdiAoMjU2LGEyKSxkMQotCW1vdiAoMTMxMDcxLGEyKSxkMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmNmUyNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjIucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCW1vdiAoZDEsYTEpLGQyCi0JbW92ICgzMjc2OCksZDEKLQltb3YgKDEzMTA3MSksZDEKLQltb3YgKDgsYTIpLGExCi0JbW92ICgyNTYsYTIpLGExCi0JbW92ICgxMzEwNzEsYTIpLGExCi0JbW92IChkMSxhMSksYTIKLSAgICAgICAgbW92ICgzMjc2OCksYTEKLSAgICAgICAgbW92ICgxMzEwNzEpLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDc0OTBhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92My5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci0gICAgICAgIG1vdiBkMSwoYTIpCi0gICAgICAgIG1vdiBkMSwoMzIsYTIpCi0JbW92IGQxLCgyNTYsYTIpCi0JbW92IGQxLCgxMzEwNzEsYTIpCi0JbW92IGQxLChkMixhMikKLQltb3YgZDEsKDEyOCkKLQltb3YgZDEsKDEzMTA3MSkKLQltb3YgYTEsKDMyLGEyKQotCW1vdiBhMSwoMjU2LGEyKQotCW1vdiBhMSwoMTMxMDcxLGEyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Y0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExODdlMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjQucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGExLChkMixhMikKLQltb3YgYTEsKDEyOCkKLQltb3YgYTEsKDEzMTA3MSkKLQltb3YgOCxkMQotCW1vdiAyNTYsZDEKLQltb3YgMTMxMDcxLGQxCi0JbW92IDI1NixhMQotCW1vdiAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZiLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTY2MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLQltb3ZiICg4LGEyKSxkMQotCW1vdmIgKDI1NixhMiksZDEKLQltb3ZiICgxMzEwNzEsYTIpLGQxCi0JbW92YiAoZDIsYTIpLGQzCi0JbW92YiAoMTMxMDcxKSxkMgotCW1vdmIgZDEsKGEyKQotCW1vdmIgZDEsKDgsYTIpCi0JbW92YiBkMSwoMjU2LGEyKQotCW1vdmIgZDEsKDEzMTA3MSxhMikKLQltb3ZiIGQxLChkMixhMikKLQltb3ZiIGQxLCgyNTYpCi0JbW92YiBkMSwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZidS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZidS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQ5NzNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92YnUucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0JbW92YnUgKGEyKSxkMQotCW1vdmJ1ICg4LGEyKSxkMQotCW1vdmJ1ICgyNTYsYTIpLGQxCi0JbW92YnUgKDEzMTA3MSxhMiksZDEKLQltb3ZidSAoZDEsYTEpLGQyCi0JbW92YnUgKDMyNzY4KSxkMQotCW1vdmJ1ICgxMzEwNzEpLGQxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdngucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92eC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGUxZDcxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92eC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQltb3Z4ICg4LGEyKSxkMQotCW1vdnggKDI1NixhMiksZDEKLQltb3Z4ICgxMzEwNzEsYTIpLGQxCi0JbW92eCBkMSwoOCxhMikKLQltb3Z4IGQxLCgyNTYsYTIpCi0JbW92eCBkMSwoMTMxMDcxLGEyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tdWxkaXYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbXVsZGl2LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTcwMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tdWxkaXYucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS50ZXh0Ci0JbXVsIGQxLGQyCi0JbXVsdSBkMixkMwotCWRpdnUgZDMsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvb3RoZXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvb3RoZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmOTRiZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL290aGVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQlqbXAgMjU2Ci0Jam1wIDEzMTA3MQotCWptcCAoYTIpCi0JanNyIDI1NgotCWpzciAxMzEwNzEKLQlqc3IgKGEyKQotCXJ0cwotCXJ0aQotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zaGlmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zaGlmdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhlNzY5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc2hpZnQucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JYXNyIGQyCi0JbHNyIGQzCi0Jcm9yIGQxCi0Jcm9sIGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3N1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1MTY1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3N1Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0Jc3ViIGQxLGQyCi0Jc3ViIGQyLGEzCi0Jc3ViIGEzLGQzCi0Jc3ViIGEzLGEyCi0Jc3ViIDMyNzY3LGQyCi0Jc3ViIDEzMTA3MSxkMgotCXN1YiAzMjc2NyxhMgotCXN1YiAxMzEwNzEsYTIKLQlzdWJjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNTU4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci0JYWRkIGQxLGQyCi0JYWRkIGQyLGEzCi0JYWRkIGEzLGEyCi0JYWRkIGEyLGQxCi0JYWRkIDE2LGQxCi0JYWRkIDI1NixkMgotCWFkZCAxMzEwNzEsZDMKLQlhZGQgMTYsYTEKLQlhZGQgMjU2LGEyCi0JYWRkIDEzMTA3MSxhMwotCWFkZCAxNixzcAotCWFkZCAyNTYsc3AKLQlhZGQgMTMxMDcxLHNwCi0JYWRkYyBkMSxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNTdiOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDk4NiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2FkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGQuczogQWRkIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjE2QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjE3RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjE1OVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgMjkxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkFDMjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZDQzNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyAyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGQUQyMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTkgRkNEM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZiBGOEZFMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEZBRkUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGQ0ZFRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYxNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JjYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiY2MuczogQmNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmNjLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQzgwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQzkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQzEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQzIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQzMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgQzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQzUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgQzYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQzcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgQzQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjhFODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGOEU5MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEY4RUEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgRjhFQjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBDQTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19iaXQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0LnM6IGJpdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY4RUQ0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRkFFRTAwMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEZDRUZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGQUY5MDg0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTEgRkUwMkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICswMTAwNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGMDg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGQUYxMDg0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRkUwMEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMTAwNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNSBGMDk2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGQUY1MDg0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmIgRkUwMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArMDEwMDQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY21wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNtcC5zOiBjbXAgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjbXAucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBBNlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYxQUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYxOUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEJFXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQUYxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRkFDQTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEZDQzlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBCRjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGQURBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkNEOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0LnM6IGV4dCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyRDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDEyXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgMTdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAxQVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IDFEXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRlbmQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0ZW5kLnM6IGV4dGVuZGVkIGluc3RydWN0aW9uIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0ZW5kLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjUwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjZGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjkwMjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQjAzMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkQwM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEY2MTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY5MTYxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkIxNzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZEMTdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjY0QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjY1RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjY3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2FsLnM6IGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjhFMjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGQUUzRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkNFM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEZBRkNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGMjE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGOEU2N0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZBRTdGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGQ0U3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEZBRkRGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGQUVCRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkNFQkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBGMjMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbG9vcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb29wLnM6IGxvb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb29wLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDhcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBEOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEQxXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRDJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEM1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRDVcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBENlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ3XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRDRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBEQVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIERCXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YxLnM6IG1vdjEgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YxLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgODZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMUQ5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSA5OVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IDNFXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjJGNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjJGQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgRjJFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjJGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgNzZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGODA2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEZBMDYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGQzA2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFkIDU5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEZBQjUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMyBGMkU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjIuczogbW92MiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGQ0I1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjMyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzEwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGQ0E1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTEgRjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjgyNjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQTI2MDAwMSBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEZDMjZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCA1RDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGQUIxMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRkNCMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGM0E1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGQUExMDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgRkNBMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGOEYxMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjMge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92My5zOiBtb3YzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92My5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGODE2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEZBMTYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGQzE2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgNDYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRkE5NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEZDOTVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGMzVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwNTgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEZDODVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjUgRjAxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjgzNjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYSBGQTM2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRkMzNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCA0NzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xOV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3Y0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjQuczogbW92NCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGQTk0MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRkM5NEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYzREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEZBODQ4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGQzg0RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjhGNTIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOSA4NTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiAyRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEZDQ0RGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgOTUwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgMjUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBGQ0RERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEzICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmJ1IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmJ1LnM6IG1vdmJ1IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92YnUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGODQ2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBNDYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQzQ2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjhCOTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGQUI5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRkNCOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY0MjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDM1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRkNBOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGMDU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBGODU2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEZBNTYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGQzU2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY4OTYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzkgRkE5NjAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNkIEZDOTZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjQ1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDUgMDY4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGQzg2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIxICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmh1IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmh1LnM6IG1vdmh1IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92aHUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMDY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGODY2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBNjYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQzY2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjhCRDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGQUJEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRkNCREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY0QTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDM5MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRkNBREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGMDc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBGODc2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEZBNzYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGQzc2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY4OTcyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzkgRkE5NzAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNkIEZDOTdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjREQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDUgMDc4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGQzg3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIxICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdm0ge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92bS5zOiBtb3ZtIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92bS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIENFMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIENFRjhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IENGMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IENGRjhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbXVsZGl2IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm11bGRpdi5zOiBtdWxkaXYgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtdWxkaXYucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMjVCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMjdFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX290aGVyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm90aGVyLnM6IG90aGVyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAib3RoZXIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIDQ0XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgNDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyA1M1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IENDMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRENGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBDRDAwMDEzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzA5XFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIERERkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAwMzAyMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYwRjJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZBRkYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGQ0ZGRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEzICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IERGMzAwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgREUzMDA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGMEZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGMEZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGMEZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBDQlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMzIEYwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoaWZ0LnM6IHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hpZnQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMkI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGOENBMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYyQUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY4QzcwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjI5RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjhDMjA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiA1NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEYyODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYyODJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN1Yi5zOiBzdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMTJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMTFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMTNFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGQ0M2RkZGRiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEZDRDVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGMTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3VkZiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJ1ZGYuczogdWRmIHRlc3RzIHBhcnQgMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInVkZi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY2MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY2MTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY2MjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY2MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEY2NDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEY2NTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY2NjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEY2NzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY2ODFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY2OTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY2QTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY2QjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY2QzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEY2RDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY2RTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEY2RjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEY1MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEY1MTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY1MjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEY1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEY1NDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEY1NTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEY1NjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEY1NzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY1ODFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIEY1OTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEY1QTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY1QjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEY1QzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIEY1RDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEY1RTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNlIEY1RjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEY5MDE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjkxMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NiBGOTIxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ5IEY5MzE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRjk0MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0ZiBGOTUxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUyIEY5NjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTUgRjk3MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGOTgxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDViIEY5OTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWUgRjlBMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MSBGOUIxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEY5QzE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjcgRjlEMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YSBGOUUxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZkIEY5RjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRkIwMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEZCMTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBGQjIxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRkIzMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEZCNDFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBGQjUxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggRkI2MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEZCNzFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBGQjgxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgRkI5MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEZCQTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBGQkIxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgRkJDMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEZCRDFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBGQkUxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgRkJGMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEZEMDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNjYgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjYgRkQxMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2NyArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBGRDIxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY4ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMyIEZEMzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNjkgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRkQ0MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3MCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjZSBGRDUxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcxICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEZENjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzIgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGEgRkQ3MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3MyArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBGRDgxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc0ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU2IEZEOTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzUgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRkRBMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3NiArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMiBGREIxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc3ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEZEQzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzggKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmUgRkREMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3OSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCBGREUxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzgwICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBhIEZERjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArODEgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgRjkwNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMyBGOTE1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE2IEY5MjU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTkgRjkzNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyBGOTQ1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFmIEY5NTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjIgRjk2NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNSBGOTc1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IEY5ODU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmIgRjk5NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyZSBGOUE1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMxIEY5QjU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgRjlDNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNyBGOUQ1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNhIEY5RTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2QgRjlGNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCBGQjA1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgRkIxNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IEZCMjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyBGQjM1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgRkI0NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IEZCNTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCBGQjY1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgRkI3NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIEZCODUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCBGQjk1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggRkJBNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIEZCQjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCBGQkM1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgRkJENTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IEZCRTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyBGQkY1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODAgRkQwNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTQgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NiBGRDE1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIEZEMjUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE2ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTIgRkQzNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTcgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5OCBGRDQ1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExOCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTllIEZENTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE5ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTQgRkQ2NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjAgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYSBGRDc1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIEZEODUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIyICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjYgRkQ5NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjMgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiYyBGREE1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyNCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWMyIEZEQjUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI1ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzggRkRDNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjYgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjZSBGREQ1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyNyArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IEZERTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI4ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGEgRkRGNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjkgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotaWYgW2lzdGFyZ2V0IG1uMTAzMDAqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzZXIuCi0gICAgZG9fYWRkCi0gICAgZG9fYmNjCi0gICAgZG9fYml0Ci0gICAgZG9fY21wCi0gICAgZG9fZXh0Ci0gICAgZG9fZXh0ZW5kCi0gICAgZG9fbG9naWNhbAotICAgIGRvX2xvb3AKLSAgICBkb19tb3YxCi0gICAgZG9fbW92MgotICAgIGRvX21vdjMKLSAgICBkb19tb3Y0Ci0gICAgZG9fbW92YnUKLSAgICBkb19tb3ZodQotICAgIGRvX21vdm0KLSAgICBkb19tdWxkaXYKLSAgICBkb19vdGhlcgotICAgIGRvX3NoaWZ0Ci0gICAgZG9fc3ViCi0gICAgZG9fdWRmCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JjYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5MmRjZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JjYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0JYmVxIGZvbwotCWJuZSBmb28KLQliZ3QgZm9vCi0JYmdlIGZvbwotCWJsZSBmb28KLQlibHQgZm9vCi0JYmhpIGZvbwotCWJjYyBmb28KLQlibHMgZm9vCQotCWJjcyBmb28KLQlidmMgZm9vCi0JYnZzIGZvbwotCWJuYyBmb28KLQlibnMgZm9vCi0JYnJhIGZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzU1MTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iaXQucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkudGV4dAotCWJ0c3QgNjQsZDEKLQlidHN0IDgxOTIsZDIKLQlidHN0IDEzMTA3MSxkMwotCWJ0c3QgNjQsKDgsYTEpCi0JYnRzdCA2NCwoMTMxMDcxKQotCWJzZXQgZDEsKGEyKQotCWJzZXQgNjQsKDgsYTEpCi0JYnNldCA2NCwoMTMxMDcxKQotCWJjbHIgZDEsKGEyKQotCWJjbHIgNjQsKDgsYTEpCi0JYmNsciA2NCwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvY21wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOGE3MWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotCWNtcCBkMSxkMgotCWNtcCBkMixhMwotCWNtcCBhMyxkMwotCWNtcCBhMyxhMgotCWNtcCAxNixkMwotCWNtcCAyNTYsZDIKLQljbXAgMTMxMDcxLGQxCi0JY21wIDE2LGEzCi0JY21wIDI1NixhMgotCWNtcCAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGUyZTc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkudGV4dAotCWV4dCBkMQotCWV4dGIgZDIKLQlleHRidSBkMwotCWV4dGggZDIKLQlleHRodSBkMQotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0ZW5kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDA1YjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHRlbmQucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotCXB1dHggZDEKLQlnZXR4IGQyCi0JbXVscSBkMSxkMgotCW11bHEgMTYsZDIKLQltdWxxIDI1NixkMwotCW11bHEgMTMxMDcxLGQzCi0JbXVscXUgZDEsZDIKLQltdWxxdSAxNixkMgotCW11bHF1IDI1NixkMwotCW11bHF1IDEzMTA3MSxkMwotCXNhdDE2IGQyLGQzCi0Jc2F0MjQgZDMsZDIKLQlic2NoIGQxLGQyCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk3NmRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci0JYW5kIGQxLGQyCi0JYW5kIDEyNyxkMgotCWFuZCAzMjc2NyxkMwotCWFuZCAxMzEwNzEsZDMKLQlhbmQgMzI3NjcscHN3Ci0Jb3IgZDEsZDIKLQlvciAxMjcsZDIKLQlvciAzMjc2NyxkMwotCW9yIDEzMTA3MSxkMwotCW9yIDMyNzY3LHBzdwotCXhvciBkMSxkMgotCXhvciAzMjc2NyxkMwotCXhvciAxMzEwNzEsZDMKLQlub3QgZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9vcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb29wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTgyMDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb29wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLWZvbzoKLQlsZXEKLQlsbmUKLQlsZ3QKLQlsZ2UKLQlsbGUKLQlsbHQKLQlsaGkKLQlsY2MKLQlsbHMJCi0JbGNzCi0JbHJhCi0Jc2V0bGIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0Y2M1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjEucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQkudGV4dAotCW1vdiBkMSxkMgotCW1vdiBkMSxhMgotCW1vdiBhMixkMQotCW1vdiBhMixhMQotCW1vdiBzcCxhMgotCW1vdiBhMSxzcAotCW1vdiBkMixwc3cKLQltb3YgbWRyLGQxCi0JbW92IGQyLG1kcgotCW1vdiAoYTIpLGQxCi0JbW92ICg4LGEyKSxkMQotCW1vdiAoMjU2LGEyKSxkMQotCW1vdiAoMTMxMDcxLGEyKSxkMQotCW1vdiAoOCxzcCksZDEKLQltb3YgKDI1NixzcCksZDEKLQltb3YgcHN3LGQzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQxZWRjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjIucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkudGV4dAotICAgICAgICBtb3YgKDEzMTA3MSxzcCksZDEKLQltb3YgKGQxLGExKSxkMgotCW1vdiAoMzI3NjgpLGQxCi0JbW92ICgxMzEwNzEpLGQxCi0JbW92IChhMiksYTEKLQltb3YgKDgsYTIpLGExCi0JbW92ICgyNTYsYTIpLGExCi0JbW92ICgxMzEwNzEsYTIpLGExCi0JbW92ICg4LHNwKSxhMQotCW1vdiAoMjU2LHNwKSxhMQotCW1vdiAoMTMxMDcxLHNwKSxhMQotCW1vdiAoZDEsYTEpLGEyCi0gICAgICAgIG1vdiAoMzI3NjgpLGExCi0gICAgICAgIG1vdiAoMTMxMDcxKSxhMQotICAgICAgICBtb3YgKDMyLGExKSxzcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlYzBiOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjMucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkudGV4dAotICAgICAgICBtb3YgZDEsKGEyKQotICAgICAgICBtb3YgZDEsKDMyLGEyKQotCW1vdiBkMSwoMjU2LGEyKQotCW1vdiBkMSwoMTMxMDcxLGEyKQotCW1vdiBkMSwoMzIsc3ApCi0JbW92IGQxLCgzMjc2OCxzcCkKLQltb3YgZDEsKDEzMTA3MSxzcCkKLQltb3YgZDEsKGQyLGEyKQotCW1vdiBkMSwoMTI4KQotCW1vdiBkMSwoMTMxMDcxKQotCW1vdiBhMSwoYTIpCi0JbW92IGExLCgzMixhMikKLQltb3YgYTEsKDI1NixhMikKLQltb3YgYTEsKDEzMTA3MSxhMikKLQltb3YgYTEsKDMyLHNwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3Y0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkNjljMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjQucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotCW1vdiBhMSwoMzI3Njgsc3ApCi0JbW92IGExLCgxMzEwNzEsc3ApCi0JbW92IGExLChkMixhMikKLQltb3YgYTEsKDEyOCkKLQltb3YgYTEsKDEzMTA3MSkKLQltb3Ygc3AsKDMyLGExKQotCW1vdiA4LGQxCi0JbW92IDI1NixkMQotCW1vdiAxMzEwNzEsZDEKLQltb3YgOCxhMQotCW1vdiAyNTYsYTEKLQltb3YgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmJ1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmJ1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZGI3YmUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZidS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS50ZXh0Ci0JbW92YnUgKGEyKSxkMQotCW1vdmJ1ICg4LGEyKSxkMQotCW1vdmJ1ICgyNTYsYTIpLGQxCi0JbW92YnUgKDEzMTA3MSxhMiksZDEKLQltb3ZidSAoOCxzcCksZDEKLQltb3ZidSAoMjU2LHNwKSxkMQotCW1vdmJ1ICgxMzEwNzEsc3ApLGQxCi0JbW92YnUgKGQxLGExKSxkMgotCW1vdmJ1ICgzMjc2OCksZDEKLQltb3ZidSAoMTMxMDcxKSxkMQotCW1vdmJ1IGQxLChhMikKLQltb3ZidSBkMSwoMzIsYTIpCi0JbW92YnUgZDEsKDI1NixhMikKLQltb3ZidSBkMSwoMTMxMDcxLGEyKQotCW1vdmJ1IGQxLCgzMixzcCkKLQltb3ZidSBkMSwoMzI3Njgsc3ApCi0JbW92YnUgZDEsKDEzMTA3MSxzcCkKLQltb3ZidSBkMSwoZDIsYTIpCi0JbW92YnUgZDEsKDEyOCkKLQltb3ZidSBkMSwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZodS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZodS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjM3ZTgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92aHUucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkudGV4dAotCW1vdmh1IChhMiksZDEKLQltb3ZodSAoOCxhMiksZDEKLQltb3ZodSAoMjU2LGEyKSxkMQotCW1vdmh1ICgxMzEwNzEsYTIpLGQxCi0JbW92aHUgKDgsc3ApLGQxCi0JbW92aHUgKDI1NixzcCksZDEKLQltb3ZodSAoMTMxMDcxLHNwKSxkMQotCW1vdmh1IChkMSxhMSksZDIKLQltb3ZodSAoMzI3NjgpLGQxCi0JbW92aHUgKDEzMTA3MSksZDEKLQltb3ZodSBkMSwoYTIpCi0JbW92aHUgZDEsKDMyLGEyKQotCW1vdmh1IGQxLCgyNTYsYTIpCi0JbW92aHUgZDEsKDEzMTA3MSxhMikKLQltb3ZodSBkMSwoMzIsc3ApCi0JbW92aHUgZDEsKDMyNzY4LHNwKQotCW1vdmh1IGQxLCgxMzEwNzEsc3ApCi0JbW92aHUgZDEsKGQyLGEyKQotCW1vdmh1IGQxLCgxMjgpCi0JbW92aHUgZDEsKDEzMTA3MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92bS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmM2ODMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCW1vdm0gKHNwKSxbYTIsYTNdCi0JbW92bSAoc3ApLFtkMixkMyxhMixhMyxvdGhlcl0KLQltb3ZtIFthMixhM10sKHNwKQotCW1vdm0gW2QyLGQzLGEyLGEzLG90aGVyXSwoc3ApCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tdWxkaXYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxMWU1ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQltdWwgZDEsZDIKLQltdWx1IGQyLGQzCi0JZGl2IGQzLGQzCi0JZGl2dSBkMyxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9vdGhlci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9vdGhlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWFmNzRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvb3RoZXIucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkudGV4dAotCWNsciBkMgotCWluYyBkMQotCWluYyBhMgotCWluYzQgYTMKLQlqbXAgKGEyKQotCWptcCAyNTYKLQlqbXAgMTMxMDcxCi0JY2FsbCAyNTYsW2EyLGEzXSw5Ci0JY2FsbCAxMzEwNzEsW2EyLGEzXSwzMgotCWNhbGxzIChhMikKLQljYWxscyAyNTYKLQljYWxscyAxMzEwNzEKLQlyZXQgW2EyLGEzXSw3Ci0JcmV0ZiBbYTIsYTNdLDUKLQlyZXRzCi0JcnRpCi0JdHJhcAotCW5vcAotCXJ0bQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhjOWNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc2hpZnQucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCWFzciBkMSxkMgotCWFzciA0LGQyCi0JbHNyIGQyLGQzCi0JbHNyIDQsZDMKLQlhc2wgZDMsZDIKLQlhc2wgNCxkMgotCWFzbDIgZDIKLQlyb3IgZDEKLQlyb2wgZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3N1Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RjNjYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotCXN1YiBkMSxkMgotCXN1YiBkMixhMwotCXN1YiBhMyxkMwotCXN1YiBhMyxhMgotCXN1YiAxMzEwNzEsZDIKLQlzdWIgMTMxMDcxLGExCi0Jc3ViYyBkMSxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC91ZGYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvdWRmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2JkMTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC91ZGYucworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0JLnRleHQKLQl1ZGYwMCBkMCxkMQotCXVkZjAxIGQwLGQxCi0JdWRmMDIgZDAsZDEKLQl1ZGYwMyBkMCxkMQotCXVkZjA0IGQwLGQxCi0JdWRmMDUgZDAsZDEKLQl1ZGYwNiBkMCxkMQotCXVkZjA3IGQwLGQxCi0JdWRmMDggZDAsZDEKLQl1ZGYwOSBkMCxkMQotCXVkZjEwIGQwLGQxCi0JdWRmMTEgZDAsZDEKLQl1ZGYxMiBkMCxkMQotCXVkZjEzIGQwLGQxCi0JdWRmMTQgZDAsZDEKLQl1ZGYxNSBkMCxkMQotCXVkZjIwIGQwLGQxCi0JdWRmMjEgZDAsZDEKLQl1ZGYyMiBkMCxkMQotCXVkZjIzIGQwLGQxCi0JdWRmMjQgZDAsZDEKLQl1ZGYyNSBkMCxkMQotCXVkZjI2IGQwLGQxCi0JdWRmMjcgZDAsZDEKLQl1ZGYyOCBkMCxkMQotCXVkZjI5IGQwLGQxCi0JdWRmMzAgZDAsZDEKLQl1ZGYzMSBkMCxkMQotCXVkZjMyIGQwLGQxCi0JdWRmMzMgZDAsZDEKLQl1ZGYzNCBkMCxkMQotCXVkZjM1IGQwLGQxCi0JdWRmMDAgMTI3LGQxCi0JdWRmMDEgMTI3LGQxCi0JdWRmMDIgMTI3LGQxCi0JdWRmMDMgMTI3LGQxCi0JdWRmMDQgMTI3LGQxCi0JdWRmMDUgMTI3LGQxCi0JdWRmMDYgMTI3LGQxCi0JdWRmMDcgMTI3LGQxCi0JdWRmMDggMTI3LGQxCi0JdWRmMDkgMTI3LGQxCi0JdWRmMTAgMTI3LGQxCi0JdWRmMTEgMTI3LGQxCi0JdWRmMTIgMTI3LGQxCi0JdWRmMTMgMTI3LGQxCi0JdWRmMTQgMTI3LGQxCi0JdWRmMTUgMTI3LGQxCi0JdWRmMDAgMzI3NjcsZDEKLQl1ZGYwMSAzMjc2NyxkMQotCXVkZjAyIDMyNzY3LGQxCi0JdWRmMDMgMzI3NjcsZDEKLQl1ZGYwNCAzMjc2NyxkMQotCXVkZjA1IDMyNzY3LGQxCi0JdWRmMDYgMzI3NjcsZDEKLQl1ZGYwNyAzMjc2NyxkMQotCXVkZjA4IDMyNzY3LGQxCi0JdWRmMDkgMzI3NjcsZDEKLQl1ZGYxMCAzMjc2NyxkMQotCXVkZjExIDMyNzY3LGQxCi0JdWRmMTIgMzI3NjcsZDEKLQl1ZGYxMyAzMjc2NyxkMQotCXVkZjE0IDMyNzY3LGQxCi0JdWRmMTUgMzI3NjcsZDEKLQl1ZGYwMCA2NTUzNSxkMQotCXVkZjAxIDY1NTM1LGQxCi0JdWRmMDIgNjU1MzUsZDEKLQl1ZGYwMyA2NTUzNSxkMQotCXVkZjA0IDY1NTM1LGQxCi0JdWRmMDUgNjU1MzUsZDEKLQl1ZGYwNiA2NTUzNSxkMQotCXVkZjA3IDY1NTM1LGQxCi0JdWRmMDggNjU1MzUsZDEKLQl1ZGYwOSA2NTUzNSxkMQotCXVkZjEwIDY1NTM1LGQxCi0JdWRmMTEgNjU1MzUsZDEKLQl1ZGYxMiA2NTUzNSxkMQotCXVkZjEzIDY1NTM1LGQxCi0JdWRmMTQgNjU1MzUsZDEKLQl1ZGYxNSA2NTUzNSxkMQotCXVkZnUwMCAxMjgsZDEKLQl1ZGZ1MDEgMTI4LGQxCi0JdWRmdTAyIDEyOCxkMQotCXVkZnUwMyAxMjgsZDEKLQl1ZGZ1MDQgMTI4LGQxCi0JdWRmdTA1IDEyOCxkMQotCXVkZnUwNiAxMjgsZDEKLQl1ZGZ1MDcgMTI4LGQxCi0JdWRmdTA4IDEyOCxkMQotCXVkZnUwOSAxMjgsZDEKLQl1ZGZ1MTAgMTI4LGQxCi0JdWRmdTExIDEyOCxkMQotCXVkZnUxMiAxMjgsZDEKLQl1ZGZ1MTMgMTI4LGQxCi0JdWRmdTE0IDEyOCxkMQotCXVkZnUxNSAxMjgsZDEKLQl1ZGZ1MDAgMzI3NjgsZDEKLQl1ZGZ1MDEgMzI3NjgsZDEKLQl1ZGZ1MDIgMzI3NjgsZDEKLQl1ZGZ1MDMgMzI3NjgsZDEKLQl1ZGZ1MDQgMzI3NjgsZDEKLQl1ZGZ1MDUgMzI3NjgsZDEKLQl1ZGZ1MDYgMzI3NjgsZDEKLQl1ZGZ1MDcgMzI3NjgsZDEKLQl1ZGZ1MDggMzI3NjgsZDEKLQl1ZGZ1MDkgMzI3NjgsZDEKLQl1ZGZ1MTAgMzI3NjgsZDEKLQl1ZGZ1MTEgMzI3NjgsZDEKLQl1ZGZ1MTIgMzI3NjgsZDEKLQl1ZGZ1MTMgMzI3NjgsZDEKLQl1ZGZ1MTQgMzI3NjgsZDEKLQl1ZGZ1MTUgMzI3NjgsZDEKLQl1ZGZ1MDAgNjU1MzYsZDEKLQl1ZGZ1MDEgNjU1MzYsZDEKLQl1ZGZ1MDIgNjU1MzYsZDEKLQl1ZGZ1MDMgNjU1MzYsZDEKLQl1ZGZ1MDQgNjU1MzYsZDEKLQl1ZGZ1MDUgNjU1MzYsZDEKLQl1ZGZ1MDYgNjU1MzYsZDEKLQl1ZGZ1MDcgNjU1MzYsZDEKLQl1ZGZ1MDggNjU1MzYsZDEKLQl1ZGZ1MDkgNjU1MzYsZDEKLQl1ZGZ1MTAgNjU1MzYsZDEKLQl1ZGZ1MTEgNjU1MzYsZDEKLQl1ZGZ1MTIgNjU1MzYsZDEKLQl1ZGZ1MTMgNjU1MzYsZDEKLQl1ZGZ1MTQgNjU1MzYsZDEKLQl1ZGZ1MTUgNjU1MzYsZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjVmNGI1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNvYmpjb3B5OiAtTyBzcmVjCi0jbmFtZTogTVJJIGNoYXJhY3RlciBjb25zdGFudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBjaGFyYWN0ZXIgY29uc3RhbnRzCi0KLVMwLioKLVMxMTMuLi4uKDYxNjE2MjYzNjE2MjYzNjQ2NTAwMDAwMDYxMjc2MjAwKXwoNjE2MTYyNjM2NDYzNjI2MTAwMDAwMDY1MDA2MjI3NjEpLioKLSNwYXNzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwYTgzYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi07IFRlc3QgTVJJIHN0eWxlIGNoYXJhY3RlciBjb25zdGFudHMuCi0KLQlkYy5iCSdhJwotCWRjLmIJJ2FiYycKLQlkYy5sCSdhYmNkZScKLQlkYy5sCSdhJydiJwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDM0ZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQuZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIGNvbW1lbnRzCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgY29tbWVudHMKLQotMCswMiBBIFJBTQotMCswMSBBIFJPTQotICogVSBsYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzMxOGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQl4cmVmIGxhYmVsCi0JeGRlZglST00sUkFNCi0JKiB0aGlzIGlzIGEgY29tbWVudAotCi0JZGMubAlsYWJlbAlsb29wIGlmIHdlIGhhdmVuJ3QgcmVhY2ggZW5kIHlldAotCQotUk9NCQkJCUVRVQkkMDAwMDAwMDEJKiB3b3JkIHdpZGUKLVJBTQkJCQlFUVUJJDAwMDAwMDAyCXdvcmQgd2lkZQotCWRjLmwJUkFNCi0JZGMubAkwCSxyZWFsbHksYSxjb21tZW50Ci07IGEgY29tbWVudAotIDsgYW5vdGhlciBjb21tZW50Ci0gIDsgYW5vdGhlciBjb21tZW50CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYzE1MzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgY29tbW9uIHNlY3Rpb25zCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgY29tbW9uIHNlY3Rpb25zCi0KLTArMDggQyAwMGNvbTIKLTArMDggQyBjb20xCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzVjNmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotOyBUZXN0IE1SSSBjb21tb24gc2VjdGlvbnMKLQljb21tb24JY29tMQotCWRzLmwJMQotY29tMgljb21tb24gMDAKLQlkcy5sCTEKLWluY29tCWRzLmwJMQotCWNvbW1vbgljb20xCi0JZHMubAkxCi0JZGF0YQotCWRjLmwJY29tMQotCWRjLmwJaW5jb20KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxMDAyMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgY29uc3RhbnRzCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3R5bGUgY29uc3RhbnRzCi0KLTAqMCBUIGZvbwotMCphIEEgczAxCi0wKmEgQSBzMDIKLTAqYSBBIHMwMwotMCphIEEgczA0Ci0wKmEgQSBzMDUKLTAqYSBBIHMwNgotMCphIEEgczA3Ci0wKmEgQSBzMDgKLTAqYSBBIHMwOQotMCo2MSBBIHMxMAotMCo2MSBBIHMxMQotMCo2MTYyNjM2NCBBIHMxMgotMCo2MTI3NjIwMCBBIHMxMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM0ZTY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLQl4ZGVmCXMwMSxzMDIsczAzLHMwNCxzMDUsczA2LHMwNyxzMDgsczA5LHMxMCxzMTEsczEyLHMxMwotczAxCWVxdQklMTAxMAotczAyCWVxdQkxMDEwYgotczAzCWVxdQlAMTIKLXMwNAllcXUJMTJvCi1zMDUJZXF1CTEycQotczA2CWVxdQkxMAotczA3CWVxdQkxMGQKLXMwOAllcXUJJGEKLXMwOQllcXUJMGFoCi1zMTAJZXF1CSdhJwotczExCWVxdQlBJ2EnCi1zMTIJZXF1CSdhYmNkJwotczEzCWVxdQknYScnYicKLQotCXhkZWYJZm9vCi1mb28KLQltb3ZlcS5sCSMlMTAxMCxkMAotCW1vdmVxLmwJIzEwMTBiLGQwCi0JbW92ZXEubAkjQDEyLGQwCi0JbW92ZXEubAkjMTJvLGQwCi0JbW92ZXEubAkjMTJxLGQwCi0JbW92ZXEubAkjMTAsZDAKLQltb3ZlcS5sCSMxMGQsZDAKLQltb3ZlcS5sCSMkYSxkMAotCW1vdmVxLmwJIzBhaCxkMAotCW1vdmVxLmwJIydhJyxkMAotCW1vdmVxLmwJI0EnYScsZDAKLQlub3AKLQotCWVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VtcHR5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZW1wdHkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjMmNkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZW1wdHkucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0JUCU1BQ1JPCQk7IGVtcHR5IG1hY3JvCi0JRU5ETQotCi0JU0JUCWFyZzEgCi0gICAgICAgIFNCVCAgICAgYXJnMiAtIG9uZSB0d3cKLSAgICAgICAgU0JUICAgICBhcmczIC0gb25lIHR3byB0aHJlZQotICAgICAgICBTQlQgICAgIGFyZzQgLSBvbmUgdHdvIHRocmVlIGZvdXIKLSAgICAgICAgU0JUICAgICBhcmc1IC0gb25lIHR3byB0aHJlZSBmb3VyIGZpdmUKLSAgICAgICAgU0JUICAgICBhcmc2IC0gb25lIHR3byAodGhyZWUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjlhODYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5kCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgRVFVCi0jYXM6IC1NCi0KLSMgVGVzdCB0aGUgTVJJIEVRVSBkaXJlY3RpdmUKLQotMCo0IEEgU1lNQk9MCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTEyYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFRlc3QgdGhlIE1SSSBFUVUgZGlyZWN0aXZlCi0JWERFRglTWU1CT0wKLVNZTUJPTAlFUVUJNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGVlNGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIuZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBleHByZXNzaW9ucwotI2FzOiAtTQotCi0jIFRlc3QgZXhwcmVzc2lvbnMgaW4gTVJJIG1vZGUKLQotMDAqIEEgczEKLTAwKjEyIEEgczIKLTAwKjYgQSBzMwotKDAwMDAwMDAwKT9mZiogQSBzNAotMDAqIEEgczUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY3N2MxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTsgVGVzdCBleHByZXNzaW9ucyBpbiBNUkkgbW9kZQotCXhkZWYJczEsczIsczMsczQsczUKLXMxCWVxdQkxPjIKLXMyCWVxdQkzPDwxKjMKLXMzCWVxdQk1ISEzCi1zNAllcXUJIjAKLXM1CWVxdQkoMT49MikhKDE8PjEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWE2MjdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamNvcHk6IC1PIHNyZWMKLSNuYW1lOiBNUkkgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzCi0KLVMwLioKLVMxMTguLi4uKDEyMzQ1Njc4OUFCQ0RFRjAzRjgwMDAwMDQxMjAwMDAwNDEyMDAwMDA0Mil8KEYwREVCQzlBNzg1NjM0MTIwMDAwODAzRjAwMDAyMDQxMDAwMDIwNDEwMCkuKgotUzEwLi4uLi4oQzgwMDAwKXwoMDBDODQyKS4qCi0jcGFzcwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3ZjljNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotOyBUZXN0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBpbiBNUkkgbW9kZS4KLQotCWRjLmQJOjEyMzRfNTY3OF85YWJjX2RlZjAKLQlkYy5zCTEuMAotCWRjLnMJMWUxCi0JZGMucwkxX2VfMQotCWRjLnMJMUUyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWZiOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIGZvcgotI2FzOiAtTQotCi0jIFRlc3QgTVJJIHN0cnVjdHVyZWQgZm9yIHBzZXVkby1vcC4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gY2xydyAlZDEKLTArMDAyIDxmb29cKygweHwpMj4gbW92ZXcgIzEsJWQwCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IGNtcGl3ICMxMCwlZDAKLTArMDBhIDxmb29cKygweHwpYT4gYmx0cyAwKzAxNiA8Zm9vXCsoMHh8KTE2PgotMCswMGMgPGZvb1wrKDB4fCljPiBhZGR3ICVkMCwlZDEKLTArMDBlIDxmb29cKygweHwpZT4gYnZjcyAwKzAxMiA8Zm9vXCsoMHh8KTEyPgotMCswMTAgPGZvb1wrKDB4fCkxMD4gYnJhcyAwKzAxNiA8Zm9vXCsoMHh8KTE2PgotMCswMTIgPGZvb1wrKDB4fCkxMj4gYWRkcXcgIzIsJWQwCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBicmFzIDArMDA2IDxmb29cKygweHwpNj4KLTArMDE2IDxmb29cKygweHwpMTY+IGNscncgJWQxCi0wKzAxOCA8Zm9vXCsoMHh8KTE4PiBtb3ZldyAjMTAsJWQwCi0wKzAxYyA8Zm9vXCsoMHh8KTFjPiBjbXBpdyAjMSwlZDAKLTArMDIwIDxmb29cKygweHwpMjA+IGJndHMgMCswMzAgPGZvb1wrKDB4fCkzMD4KLTArMDIyIDxmb29cKygweHwpMjI+IGNtcGl3ICMxMDAsJWQxCi0wKzAyNiA8Zm9vXCsoMHh8KTI2PiBiZ3RzIDArMDJhIDxmb29cKygweHwpMmE+Ci0wKzAyOCA8Zm9vXCsoMHh8KTI4PiBicmFzIDArMDJjIDxmb29cKygweHwpMmM+Ci0wKzAyYSA8Zm9vXCsoMHh8KTJhPiBhZGR3ICVkMCwlZDEKLTArMDJjIDxmb29cKygweHwpMmM+IHN1YnF3ICMxLCVkMAotMCswMmUgPGZvb1wrKDB4fCkyZT4gYnJhcyAwKzAxYyA8Zm9vXCsoMHh8KTFjPgotMCswMzAgPGZvb1wrKDB4fCkzMD4gbm9wCi0wKzAzMiA8Zm9vXCsoMHh8KTMyPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyNDcyNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi07IFRlc3QgTVJJIHN0cnVjdHVyZWQgZm9yIHBzZXVkby1vcC4KLQotCXhkZWYJZm9vCi1mb28KLQljbHIgZDEKLQlmb3IgZDAgPSAjMSB0byAjMTAgYnkgIzIgZG8KLQkgIGFkZCBkMCxkMSBhcmJpdHJhcnkgdGV4dCAnaW4gY29tbWVudCBmaWVsZAotCSAgaWYgPHZzPiB0aGVuCi0JICAgIGJyZWFrCi0JICBlbmRpCi0JZW5kZgotCi0JY2xyIGQxCi0JZm9yIGQwID0gIzEwIGRvd250byAjMSBkbwotCSAgaWYgZDEgPGdlPiAjMTAwIHRoZW4KLQkgICAgbmV4dAotCSAgZW5kaQotCSAgYWRkIGQwLGQxCi0JZW5kZgotCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzI5NzJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIGlmCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3RydWN0dXJlZCBpZiBwc2V1ZG8tb3AuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGNtcHcgJWQxLCVkMAotMCswMDIgPGZvb1wrKDB4fCkyPiBibGVzIDArMDE0IDxmb29cKygweHwpMTQ+Ci0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGNtcHcgJWQyLCVkMAotMCswMDYgPGZvb1wrKDB4fCk2PiBibGVzIDArMDE0IDxmb29cKygweHwpMTQ+Ci0wKzAwOCA8Zm9vXCsoMHh8KTg+IGNtcHcgJWQxLCVkMgotMCswMGEgPGZvb1wrKDB4fClhPiBibGVzIDArMDEwIDxmb29cKygweHwpMTA+Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IG1vdmV3ICVkMSwlZDMKLTArMDBlIDxmb29cKygweHwpZT4gYnJhcyAwKzAxMiA8Zm9vXCsoMHh8KTEyPgotMCswMTAgPGZvb1wrKDB4fCkxMD4gbW92ZXcgJWQyLCVkMwotMCswMTIgPGZvb1wrKDB4fCkxMj4gYnJhcyAwKzAxZSA8Zm9vXCsoMHh8KTFlPgotMCswMTQgPGZvb1wrKDB4fCkxND4gY21wdyAlZDAsJWQxCi0wKzAxNiA8Zm9vXCsoMHh8KTE2PiBiZ3RzIDArMDFjIDxmb29cKygweHwpMWM+Ci0wKzAxOCA8Zm9vXCsoMHh8KTE4PiBjbXB3ICVkMCwlZDIKLTArMDFhIDxmb29cKygweHwpMWE+IGJsZXMgMCswMWUgPGZvb1wrKDB4fCkxZT4KLTArMDFjIDxmb29cKygweHwpMWM+IG1vdmV3ICVkMCwlZDMKLTArMDFlIDxmb29cKygweHwpMWU+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NmJlOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTsgVGVzdCBNUkkgc3RydWN0dXJlZCBpZiBwc2V1ZG8tb3AuCi0KLQl4ZGVmCWZvbwotZm9vCi0JaWYgZDEgPGd0PiBkMCBhbmQgZDIgPGd0PiBkMCB0aGVuCi0JICBpZiBkMSA8Z3Q+IGQyIHRoZW4KLQkgICAgbW92ZSBkMSxkMwotCSAgZWxzZQotCSAgICBtb3ZlIGQyLGQzCi0JICBlbmRpCi0JZWxzZQotCSAgaWYgZDAgPGd0PiBkMSBvciBkMCA8Z3Q+IGQyIHRoZW4KLQkgICAgbW92ZSBkMCxkMwotCSAgZW5kaQotCWVuZGkKLQotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2ltbWNvbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaW1tY29uc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyZGExMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaW1tY29uc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNUkkgaW1tZWRpYXRlIGNvbnN0YW50cwotI2FzOiAtTQotI3NvdXJjZTogY29uc3RhbnRzLnMKLQotIyBUZXN0IE1SSSBpbW1lZGlhdGUgY29uc3RhbnRzCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IG1vdmVxICMxMCwlZDAKLTArMDAyIDxmb29cKygweHwpMj4gbW92ZXEgIzEwLCVkMAotMCswMDQgPGZvb1wrKDB4fCk0PiBtb3ZlcSAjMTAsJWQwCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IG1vdmVxICMxMCwlZDAKLTArMDA4IDxmb29cKygweHwpOD4gbW92ZXEgIzEwLCVkMAotMCswMGEgPGZvb1wrKDB4fClhPiBtb3ZlcSAjMTAsJWQwCi0wKzAwYyA8Zm9vXCsoMHh8KWM+IG1vdmVxICMxMCwlZDAKLTArMDBlIDxmb29cKygweHwpZT4gbW92ZXEgIzEwLCVkMAotMCswMTAgPGZvb1wrKDB4fCkxMD4gbW92ZXEgIzEwLCVkMAotMCswMTIgPGZvb1wrKDB4fCkxMj4gbW92ZXEgIzk3LCVkMAotMCswMTQgPGZvb1wrKDB4fCkxND4gbW92ZXEgIzk3LCVkMAotMCswMTYgPGZvb1wrKDB4fCkxNj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2U1ODU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgbGFiZWwKLSNhczogLU0KLQotIyBUZXN0IHVzaW5nIGFuIE1SSSBzdHlsZSBsYWJlbAotCi0wMDAwKiBUIExBQkVMCi1bIAldKlUgU1lNQk9MCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVlYzJhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi07IFRlc3QgdXNpbmcgYW4gTVJJIHN0eWxlIGxhYmVsCi0qIEFsc28gdGVzdCBNUkkgc3R5bGUgY29tbWVudHMKLSEgQW5kIGFub3RoZXIgY29tbWVudAotCVhERUYJTEFCRUwKLUxBQkVMCURDLkwJU1lNQk9MCQk7IEFuZCB5ZXQgYW5vdGhlciBjb21tZW50CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzZmYTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogTVJJIG1vdmVtbAotI2FzOiAtTQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDwudGV4dD46Ci0gICAwOgk0Y2RmIDA3ZmMgICAgICAJbW92ZW1sICVzcEBcKywlZDItJWEyCi0gICA0Ogk0Y2RmIDA3ZmMgICAgICAJbW92ZW1sICVzcEBcKywlZDItJWEyCi0gICA4Ogk0OGY5IDA3ZmMgMDAwMCAJbW92ZW1sICVkMi0lYTIsMCA8LnRleHQ+Ci0gICBlOgkwMDAwIAotICAxMDoJNDhmOSAwN2ZjIDAwMDAgCW1vdmVtbCAlZDItJWEyLDAgPC50ZXh0PgotICAxNjoJMDAwMCAKLSAgMTg6CTRjZjkgMDdmYyAwMDAwIAltb3ZlbWwgMCA8LnRleHQ+LCVkMi0lYTIKLSAgMWU6CTAwMDAgCi0gIDIwOgk0Y2Y5IDA3ZmMgMDAwMCAJbW92ZW1sIDAgPC50ZXh0PiwlZDItJWEyCi0gIDI2OgkwMDAwIAotICAyODoJNGNmOSAwN2ZjIDAwMDEgCW1vdmVtbCAxNjAwMCA8ZmRzYT4sJWQyLSVhMgotICAyZToJNjAwMCAKLSAgMzA6CTRjZjkgMDdmYyAwMDAxIAltb3ZlbWwgMTYwMDAgPGZkc2E+LCVkMi0lYTIKLSAgMzY6CTYwMDAgCi0gIDM4Ogk0OGY5IDA3ZmMgMDAwMSAJbW92ZW1sICVkMi0lYTIsMTYwMDAgPGZkc2E+Ci0gIDNlOgk2MDAwIAotICA0MDoJNDhmOSAwN2ZjIDAwMDEgCW1vdmVtbCAlZDItJWEyLDE2MDAwIDxmZHNhPgotICA0NjoJNjAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmYzcyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1hc2RmCXJlZwlhMC1hMi9kMi1kNwotZmRzYQllcXUJJDE2MDAwCi0KLQltb3ZlbS5sCShzcCkrLGEwLWEyL2QyLWQ3Ci0JbW92ZW0ubAkoc3ApKyxhc2RmCi0JCi0JbW92ZW0ubCBhMC1hMi9kMi1kNyxzeW1ib2wKLQltb3ZlbS5sCWFzZGYsc3ltYm9sCi0KLQltb3ZlbS5sIHN5bWJvbCxhMC1hMi9kMi1kNwotCW1vdmVtLmwJc3ltYm9sLGFzZGYKLQotCW1vdmVtLmwgZmRzYSxhMC1hMi9kMi1kNwotCW1vdmVtLmwJZmRzYSxhc2RmCi0KLQltb3ZlbS5sIGEwLWEyL2QyLWQ3LGZkc2EKLQltb3ZlbS5sCWFzZGYsZmRzYQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21yaS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbXJpLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmY2RlZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbXJpLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMKLSMgVGVzdCB0aGUgbTY4ayBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotIwotIyBJIG9yaWdpbmFsbHkgdGhvdWdodCB0aGF0IG1vc3Qgb2YgdGVzdHMgYXBwbGllZCB0byBhbnkgTVJJCi0jIGFzc2VtYmxlciwgYnV0IGl0IHR1cm5zIG91dCB0aGF0IGRpZmZlcmVudCBNUkkgYXNzZW1ibGVycyB1c2UKLSMgZGlmZmVyZW50IHN5bnRheGVzLgotIwotCi1pZiAhW2lzdGFyZ2V0ICJtNjgqLSotKiJdIHsKLSAgICByZXR1cm4KLX0KLQotcnVuX2R1bXBfdGVzdCBsYWJlbAotcnVuX2R1bXBfdGVzdCBlcXUKLXJ1bl9kdW1wX3Rlc3QgY29uc3RhbnRzCi1ydW5fZHVtcF90ZXN0IGltbWNvbnN0Ci1ydW5fZHVtcF90ZXN0IGZsb2F0Ci1ydW5fZHVtcF90ZXN0IGNoYXIKLXJ1bl9kdW1wX3Rlc3QgZXhwcgotcnVuX2R1bXBfdGVzdCBjb21tb24KLXJ1bl9kdW1wX3Rlc3QgY29tbWVudAotZ2FzX3Rlc3QgImVtcHR5LnMiICItTSIgIiIgIk1SSSBlbXB0eSBtYWNybyIKLXJ1bl9kdW1wX3Rlc3QgZm9yCi1ydW5fZHVtcF90ZXN0IGlmCi1ydW5fZHVtcF90ZXN0IHJlcGVhdAotcnVuX2R1bXBfdGVzdCB3aGlsZQotcnVuX2R1bXBfdGVzdCBzZW1pCi1ydW5fZHVtcF90ZXN0IG1vdmVtbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2M1ZjYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNUkkgc3RydWN0dXJlZCByZXBlYXQKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIHJlcGVhdCBwc2V1ZG8tb3AuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGJjY3MgMCswMDAgPGZvbz4KLTArMDAyIDxmb29cKygweHwpMj4gY2xydyAlZDEKLTArMDA0IDxmb29cKygweHwpND4gYWRkcXcgIzEsJWQxCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IGNtcGl3ICMxMCwlZDEKLTArMDBhIDxmb29cKygweHwpYT4gYmd0cyAwKzAwNCA8Zm9vXCsoMHh8KTQ+Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IG5vcAotMCswMGUgPGZvb1wrKDB4fCllPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0ZWEyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgTVJJIHN0cnVjdHVyZWQgcmVwZWF0IHBzZXVkby1vcC4KLQotCXhkZWYJZm9vCi1mb28KLQlyZXBlYXQKLQl1bnRpbAk8Y3M+Ci0KLQljbHIgZDEKLQlyZXBlYXQKLQkgIGFkZCAjMSxkMQotCXVudGlsIGQxIDxnZT4gIzEwCi0KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGVjY2UxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNvYmpkdW1wOiAtcyAtaiAudGV4dAotI25hbWU6IE1SSSBzZW1pCi0jYXM6IC1NCi0KLS4qOiAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgM2IyMDNiMjAgM2EyMDNhMjAgMDAwMDAwMDAgMDAwMDAwMDAgIDsgOyA6IDogLi4uLi4uLi4KLSAwMDEwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMDY3Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc2VtaWNvbG9uICBtYWNybwotCWRjLmIgICAgJzsgJwotCWVuZG0KLQotY29sb24JICAgIG1hY3JvCi0JZGMuYiAgICAnOiAnCi0JZW5kbQotCi0Jc2VtaWNvbG9uCi0JZGMuYgknOyAnCi0JY29sb24KLQlkYy5iCSc6ICcKLQotCXAyYWxpZ24JNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkZDM3YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNUkkgc3RydWN0dXJlZCB3aGlsZQotI2FzOiAtTQotCi0jIFRlc3QgTVJJIHN0cnVjdHVyZSB3aGlsZSBwc2V1ZG8tb3AuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGJjY3MgMCswMDQgPGZvb1wrKDB4fCk0PgotMCswMDIgPGZvb1wrKDB4fCkyPiBicmFzIDArMDAwIDxmb28+Ci0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGNscncgJWQxCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IGNtcGl3ICMxMCwlZDEKLTArMDBhIDxmb29cKygweHwpYT4gYmx0cyAwKzAxMCA8Zm9vXCsoMHh8KTEwPgotMCswMGMgPGZvb1wrKDB4fCljPiBhZGRxdyAjMSwlZDEKLTArMDBlIDxmb29cKygweHwpZT4gYnJhcyAwKzAwNiA8Zm9vXCsoMHh8KTY+Ci0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBub3AKLTArMDEyIDxmb29cKygweHwpMTI+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjYmRiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTsgVGVzdCBNUkkgc3RydWN0dXJlZCB3aGlsZSBwc2V1ZG8tb3AuCi0KLQl4ZGVmCWZvbwotZm9vCi0Jd2hpbGUgPGNzPiBkbwotCWVuZHcKLQotCWNsciBkMQotCXdoaWxlIGQxIDxsZT4gIzEwIGRvCi0JICBhZGQgIzEsZDEKLQllbmR3Ci0KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhYWI1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jb2JqZHVtcDogLURyCi0jbmFtZTogUG93ZXJQQyB0ZXN0IDEKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1wb3dlcnBjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotCi0wKzAwMDAwMDAgPGZvbz46Ci0gICAwOgk2MCAwMCAwMCAwMCAJbm9wCi0gICA0Ogk2MCAwMCAwMCAwMCAJbm9wCi0gICA4Ogk2MCAwMCAwMCAwMCAJbm9wCi0KLTArMDAwMDAwYyA8YT46Ci0gICBjOgk0OCAwMCAwMCAwNCAJYgkxMCA8YXBmb3VyPgotCi0wKzAwMDAwMTAgPGFwZm91cj46Ci0gIDEwOgk0OCAwMCAwMCAwOCAJYgkxOCA8YXBmb3VyXCsweDg+Ci0gIDE0Ogk0OCAwMCAwMCAwMCAJYgkxNCA8YXBmb3VyXCsweDQ+Ci0JCQkxNDogUl9QUENfUkVMMjQJeAotICAxODoJNDggMDAgMDAgMDQgCWIJMWMgPGFwZm91clwrMHhjPgotCQkJMTg6IFJfUFBDX1JFTDI0CVwuZGF0YVwrMHg0Ci0gIDFjOgk0OCAwMCAwMCAwMCAJYgkxYyA8YXBmb3VyXCsweGM+Ci0JCQkxYzogUl9QUENfUkVMMjQJegotICAyMDoJNDggMDAgMDAgMTQgCWIJMzQgPGFwZm91clwrMHgyND4KLQkJCTIwOiBSX1BQQ19SRUwyNAl6XCsweDE0Ci0gIDI0Ogk0OCAwMCAwMCAwNCAJYgkyOCA8YXBmb3VyXCsweDE4PgotICAyODoJNDggMDAgMDAgMDAgCWIJMjggPGFwZm91clwrMHgxOD4KLQkJCTI4OiBSX1BQQ19SRUwyNAlhCi0gIDJjOgk0YiBmZiBmZiBlNCAJYgkxMCA8YXBmb3VyPgotICAzMDoJNDggMDAgMDAgMDQgCWIJMzQgPGFwZm91clwrMHgyND4KLQkJCTMwOiBSX1BQQ19SRUwyNAlhXCsweDQKLSAgMzQ6CTRiIGZmIGZmIGUwIAliCTE0IDxhcGZvdXJcKzB4ND4KLSAgMzg6CTQ4IDAwIDAwIDAwIAliCTM4IDxhcGZvdXJcKzB4Mjg+Ci0JCQkzODogUl9QUENfTE9DQUwyNFBDCWEKLSAgM2M6CTRiIGZmIGZmIGQ0IAliCTEwIDxhcGZvdXI+Ci0KLSAgNDA6CTAwIDAwIDAwIDQwIAlcLmxvbmcgMHg0MAotCQkJNDA6IFJfUFBDX0FERFIzMglcLnRleHRcKzB4NDAKLQotICA0NDoJMDAgMDAgMDAgNGMgCVwubG9uZyAweDRjCi0JCQk0NDogUl9QUENfQUREUjMyCVwudGV4dFwrMHg0YwotICA0ODoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKLQkJCTQ4OiBSX1BQQ19SRUwzMgl4Ci0gIDRjOgkwMCAwMCAwMCAwNCAJXC5sb25nIDB4NAotCQkJNGM6IFJfUFBDX1JFTDMyCXhcKzB4NAotCVwuXC5cLgotCQkJNTA6IFJfUFBDX1JFTDMyCXoKLQkJCTU0OiBSX1BQQ19SRUwzMgl5Ci0JCQk1ODogUl9QUENfQUREUjMyCXgKLQkJCTVjOiBSX1BQQ19BRERSMzIJeQotCQkJNjA6IFJfUFBDX0FERFIzMgl6Ci0gIDY0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjQ6IFJfUFBDX0FERFIzMgl4XCsweGYrZmZmZmZmYwotICA2ODoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTY4OiBSX1BQQ19BRERSMzIJeVwrMHhmK2ZmZmZmZmMKLSAgNmM6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2YzogUl9QUENfQUREUjMyCXpcKzB4ZitmZmZmZmZjCi0gIDcwOglmZiBmZiBmZiA5YyAJXC5sb25nIDB4ZmZmZmZmOWMKLSAgNzQ6CWZmIGZmIGZmIDljIAlcLmxvbmcgMHhmZmZmZmY5YwotCVwuXC5cLgotCQkJNzg6IFJfUFBDX0FERFIzMglhCi0JCQk3YzogUl9QUENfQUREUjMyCWIKLQkJCTgwOiBSX1BQQ19BRERSMzIJYXBmb3VyCi0gIDg0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotICA4ODoJMDAgMDAgMDAgMDIgCVwubG9uZyAweDIKLQkJCTg4OiBSX1BQQ19BRERSMzIJYXBmb3VyXCsweDIKLSAgOGM6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwuZGF0YToKLQotMCswMDAwMDAwIDx4PjoKLSAgIDA6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCi0KLTArMDAwMDAwNCA8eT46Ci0gICA0OgkwMCAwMCAwMCAwMCAJXC5sb25nIDB4MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFmMjE2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQkuc2VjdGlvbiAiLmRhdGEiCi0JLmdsb2JsIHgKLQkuZ2xvYmwgegoteDoJLmxvbmcgMAotegk9IC4gKyA0Ci1mb3VyCT0geiAtIHggLSA0Ci15OgkubG9uZyAwCi0JCi0JLnNlY3Rpb24gIi50ZXh0IgotZm9vOgkKLQlub3AgOyBub3AgOyBub3AKLQkuZ2xvYmwgYQotYToJYiAuKzQKLWI6CWIgLis4Ci0JYiB4Ci0JYiB5Ci0JYiB6Ci0JYiB6KzIwCi0JYiAuK2ZvdXIKLQliIGEKLQliIGIKLQliIGErNAotCWIgYis0Ci0JYiBhQGxvY2FsCi0JYiBiQGxvY2FsCi0JLmxvbmcgLgotCS5sb25nIC4rOAotCS5sb25nIHgtLgotCS5sb25nIHgrNC0uCi0JLmxvbmcgei0uCi0JLmxvbmcgeS0uCi0JLmxvbmcgeAotCS5sb25nIHkKLQkubG9uZyB6Ci0JLmxvbmcgeC1mb3VyCi0JLmxvbmcgeS1mb3VyCi0JLmxvbmcgei1mb3VyCi0JLmxvbmcgYS0uCi0JLmxvbmcgYi0uCi0JLmxvbmcgYQotCS5sb25nIGIKLQotYXBmb3VyCT0gYSArIGZvdXIKLQkubG9uZyBhcGZvdXIKLQkubG9uZyBhLWFwZm91cgotCS5sb25nIGFwZm91cisyCi0JLmxvbmcgYXBmb3VyLWIKLQotCS50eXBlCWZvbyxAZnVuY3Rpb24KLQkudHlwZQlhLEBmdW5jdGlvbgotCS50eXBlCWIsQGZ1bmN0aW9uCi0JLnR5cGUJYXBmb3VyLEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGUzYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNvYmpkdW1wOiAtRHIKLSNuYW1lOiBQb3dlclBDIHRlc3QgMgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLXBvd2VycGMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwMDAwIDxmb28+OgotICAgMDoJNjAgMDAgMDAgMDAgCW5vcAotICAgNDoJNjAgMDAgMDAgMDAgCW5vcAotICAgODoJNjAgMDAgMDAgMDAgCW5vcAotICAgYzoJNDggMDAgMDAgMDQgCWIJMTAgPGZvb1wrMHgxMD4KLSAgMTA6CTQ4IDAwIDAwIDA4IAliCTE4IDxmb29cKzB4MTg+Ci0gIDE0Ogk0OCAwMCAwMCAwMCAJYgkxNCA8Zm9vXCsweDE0PgotCQkJMTQ6IFJfUFBDX1JFTDI0CXgKLSAgMTg6CTQ4IDAwIDAwIDA0IAliCTFjIDxmb29cKzB4MWM+Ci0JCQkxODogUl9QUENfUkVMMjQJLmRhdGFcKzB4NAotICAxYzoJNDggMDAgMDAgMDAgCWIJMWMgPGZvb1wrMHgxYz4KLQkJCTFjOiBSX1BQQ19SRUwyNAl6Ci0gIDIwOgk0OCAwMCAwMCAxNCAJYgkzNCA8Zm9vXCsweDM0PgotCQkJMjA6IFJfUFBDX1JFTDI0CXpcKzB4MTQKLSAgMjQ6CTQ4IDAwIDAwIDA0IAliCTI4IDxmb29cKzB4Mjg+Ci0gIDI4Ogk0OCAwMCAwMCAwMCAJYgkyOCA8Zm9vXCsweDI4PgotCQkJMjg6IFJfUFBDX1JFTDI0CWEKLSAgMmM6CTQ4IDAwIDAwIDUwIAliCTdjIDxhcGZvdXI+Ci0gIDMwOgk0OCAwMCAwMCAwNCAJYgkzNCA8Zm9vXCsweDM0PgotCQkJMzA6IFJfUFBDX1JFTDI0CWFcKzB4NAotICAzNDoJNDggMDAgMDAgNGMgCWIJODAgPGFwZm91clwrMHg0PgotICAzODoJNDggMDAgMDAgMDAgCWIJMzggPGZvb1wrMHgzOD4KLQkJCTM4OiBSX1BQQ19MT0NBTDI0UEMJYQotICAzYzoJNDggMDAgMDAgNDAgCWIJN2MgPGFwZm91cj4KLQotICA0MDoJMDAgMDAgMDAgNDAgCS5sb25nIDB4NDAKLQkJCTQwOiBSX1BQQ19BRERSMzIJLnRleHRcKzB4NDAKLQotICA0NDoJMDAgMDAgMDAgNGMgCS5sb25nIDB4NGMKLQkJCTQ0OiBSX1BQQ19BRERSMzIJLnRleHRcKzB4NGMKLSAgNDg6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQkJCTQ4OiBSX1BQQ19SRUwzMgl4Ci0gIDRjOgkwMCAwMCAwMCAwNCAJLmxvbmcgMHg0Ci0JCQk0YzogUl9QUENfUkVMMzIJeFwrMHg0Ci0JLi4uCi0JCQk1MDogUl9QUENfUkVMMzIJegotCQkJNTQ6IFJfUFBDX1JFTDMyCXkKLQkJCTU4OiBSX1BQQ19BRERSMzIJeAotCQkJNWM6IFJfUFBDX0FERFIzMgl5Ci0JCQk2MDogUl9QUENfQUREUjMyCXoKLSAgNjQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2NDogUl9QUENfQUREUjMyCXhcKzB4ZitmZmZmZmZjCi0gIDY4OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjg6IFJfUFBDX0FERFIzMgl5XCsweGYrZmZmZmZmYwotICA2YzoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTZjOiBSX1BQQ19BRERSMzIJelwrMHhmK2ZmZmZmZmMKLSAgNzA6CTAwIDAwIDAwIDA4IAkubG9uZyAweDgKLSAgNzQ6CTAwIDAwIDAwIDA4IAkubG9uZyAweDgKLQotMCswMDAwMDc4IDxhPjoKLSAgNzg6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQkJCTc4OiBSX1BQQ19BRERSMzIJYQotCi0wKzAwMDAwN2MgPGFwZm91cj46Ci0JLi4uCi0JCQk3YzogUl9QUENfQUREUjMyCWIKLQkJCTgwOiBSX1BQQ19BRERSMzIJYXBmb3VyCi0gIDg0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotICA4ODoJMDAgMDAgMDAgMDIgCS5sb25nIDB4MgotCQkJODg6IFJfUFBDX0FERFIzMglhcGZvdXJcKzB4MgotICA4YzoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuZGF0YToKLQotMCswMDAwMDAwIDx4PjoKLSAgIDA6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQotMCswMDAwMDA0IDx5PjoKLSAgIDQ6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWYyMjMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1mb3VyCT0gNAotCS5zZWN0aW9uICIudGV4dCIKLWZvbzoJCi0Jbm9wIDsgbm9wIDsgbm9wCi0JLmdsb2JsIGEKLQliIC4rNAotCWIgLis4Ci0JYiB4Ci0JYiB5Ci0JYiB6Ci0JYiB6KzIwCi0JYiAuK2ZvdXIKLQliIGEKLQliIGIKLQliIGErNAotCWIgYis0Ci0JYiBhQGxvY2FsCi0JYiBiQGxvY2FsCi0JLmxvbmcgLgotCS5sb25nIC4rOAotCS5sb25nIHgtLgotCS5sb25nIHgrNC0uCi0JLmxvbmcgei0uCi0JLmxvbmcgeS0uCi0JLmxvbmcgeAotCS5sb25nIHkKLQkubG9uZyB6Ci0JLmxvbmcgeC1mb3VyCi0JLmxvbmcgeS1mb3VyCi0JLmxvbmcgei1mb3VyCi0JLmxvbmcgYS0uCi0JLmxvbmcgYi0uCi1hOgkubG9uZyBhCi1iOgkubG9uZyBiCi0KLWFwZm91cgk9IGEgKyBmb3VyCi0JLmxvbmcgYXBmb3VyCi0JLmxvbmcgYS1hcGZvdXIKLQkubG9uZyBhcGZvdXIrMgotCS5sb25nIGFwZm91ci1iCi0KLQkuc2VjdGlvbiAiLmRhdGEiCi0JLmdsb2JsIHgKLQkuZ2xvYmwgegoteDoJLmxvbmcgMAotegk9IC4gKyA0Ci15OgkubG9uZyAwCi0KLQkudHlwZQlmb28sQGZ1bmN0aW9uCi0JLnR5cGUJYSxAZnVuY3Rpb24KLQkudHlwZQliLEBmdW5jdGlvbgotCS50eXBlCWFwZm91cixAZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9wcGMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmZiYzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIFNvbWUgUG93ZXJQQyB0ZXN0cwotIwotCi0jIFRoZXNlIHRlc3RzIGFyZSBjdXJyZW50bHkgRUxGIHNwZWNpZmljLCBvbmx5IGJlY2F1c2Ugbm9ib2R5IGhhcwotIyBjb252ZXJ0ZWQgdGhlbSB0byBsb29rIGZvciBYQ09GRiByZWxvY2F0aW9ucy4KLQotaWYgeyBbaXN0YXJnZXQgcG93ZXJwYyotKi0qYnNkKl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1lbGYqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLXN5c3Y0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1saW51eCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotc29sYXJpcypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotcnRlbXMqXSB9IHRoZW4gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFzdGVzdCIKLSAgICBydW5fZHVtcF90ZXN0ICJhc3Rlc3QyIgotfQotCi1pZiB7IFtpc3RhcmdldCBwb3dlcnBjKi0qLSpdIH0gdGhlbiB7Ci0gICBydW5fZHVtcF90ZXN0ICJzaW1wc2hmdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODkzZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNhczogLW1wcGM2NAotI25hbWU6IFBvd2VyUEMgdGVzdCAzLCBzaW1wbGlmaWVkIHNoaWZ0cwotCi0uKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIFwudGV4dDoKLSAwMDAwIDc4NjQwZmUwIDc4ODNmODBlIDc4YTU0NWU0IDc4NjQwMDIwICB4ZC4ueC4uLnguRS54ZC4gCi0gMDAxMCA1NDY0MGZmZSA1MDgzZjgwMCA1NGE1NDAyZSA1NDY0MDQzZSAgVGQuLlAuLi5ULkAuVGQuPgotIDAwMjAgNzg2NDAwMDQgNzg2NDA3ZTQgNzg2NGY4MDYgNzg2NGZmZTYgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDMwIDc4NjRmODQyIDc4NjRmZmUyIDc4NjQwMDBjIDc4NjQwODBjICB4ZC5CeGQuLnhkLi54ZC4uCi0gMDA0MCA3ODY0MGZhYyA3ODY0MDdlYyA3ODY0MDAwMCA3ODY0MDgwMCAgeGQuLnhkLi54ZC4ueGQuLgotIDAwNTAgNzg2NGY4MDIgNzg2NDAwMDAgNzg2NGY4MDIgNzg2NDA4MDAgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDYwIDc4NjUyMDEwIDc4NjQwN2U0IDc4NjRmODA2IDc4NjQwMDAwICB4ZSAueGQuLnhkLi54ZC4uCi0gMDA3MCA3ODY0Zjg0MiA3ODY0MGZlMCA3ODY0MDAwMCA3ODY0MDA0MCAgeGQuQnhkLi54ZC4ueGQuQAotIDAwODAgNzg2NDA3ZTAgNzg2NDA3ZTQgNzg2NDA3YTQgNzg2NDAwMDQgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDkwIDc4NjQwMDA4IDc4NjQwMDQ4IDc4NjQwN2U4IDc4NjQwZmE4ICB4ZC4ueGQuSHhkLi54ZC4uCi0gMDBhMCA3ODY0ZjgwYSA1NDY0MDAwMCA1NDY0MDAzZSA1NDY0ZjgwMCAgeGQuLlRkLi5UZC4+VGQuLgotIDAwYjAgNTQ2NGY4M2UgNTQ2NGY4N2UgNTQ2NGZmZmUgNTA2NDAwMDAgIFRkLj5UZC5+VGQuLlBkLi4KLSAwMGMwIDUwNjQwMDNlIDUwNjQwZmZlIDUwNjRmODAwIDUwNjQwMDNlICBQZC4+UGQuLlBkLi5QZC4+Ci0gMDBkMCA1MDY0MDdmZSA1NDY0MDAzZSA1NDY0MDgzZSA1NDY0ZjgzZSAgUGQuLlRkLj5UZC4+VGQuPgotIDAwZTAgNTQ2NDAwM2UgNTQ2NGY4M2UgNTQ2NDA4M2UgNWM2NTIwM2UgIFRkLj5UZC4+VGQuPlxcZSA+Ci0gMDBmMCA1NDY0MDAzZSA1NDY0MDgzYyA1NDY0ZjgwMCA1NDY0MDAzZSAgVGQuPlRkLjxUZC4uVGQuPgotIDAxMDAgNTQ2NGY4N2UgNTQ2NDBmZmUgNTQ2NDAwM2UgNTQ2NDAwN2UgIFRkLn5UZC4uVGQuPlRkLn4KLSAwMTEwIDU0NjQwN2ZlIDU0NjQwMDNlIDU0NjQwMDNjIDU0NjQwMDAwICBUZC4uVGQuPlRkLjxUZC4uCi0gMDEyMCA1NDY0MDAzZSA1NDY0MDA3ZSA1NDY0MDdmZSA1NDY0MGZiYyAgVGQuPlRkLn5UZC4uVGQuLgotIDAxMzAgNTQ2NGY4MDAgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIFRkLi4uLi4uICAgICAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmY5OGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIyBUaGVzZSBhcmUgYWxsIHRoZSBleGFtcGxlcyBmcm9tIHNlY3Rpb24gRi40IG9mCi0jICJQb3dlclBDIE1pY3JvcHJvY2Vzc29yIEZhbWlseTogVGhlIFByb2dyYW1taW5nIEVudmlyb25tZW50cyIuCi0jIDY0LWJpdCBleGFtcGxlcwotCWV4dHJkaQklcjQsJXIzLDEsMAotCWluc3JkaQklcjMsJXI0LDEsMAotCXNsZGkJJXI1LCVyNSw4Ci0JY2xybGRpCSVyNCwlcjMsMzIKLSMgMzItYml0IGV4YW1wbGVzCi0JZXh0cndpCSVyNCwlcjMsMSwwCi0JaW5zcndpCSVyMywlcjQsMSwwCi0Jc2x3aQklcjUsJXI1LDgKLQljbHJsd2kJJXI0LCVyMywxNgotCi0KLSMgVGhlc2UgdGVzdCB0aGUgcmVtYWluaW5nIGNvcm5lciBjYXNlcyBmb3IgNjQtYml0IG9wZXJhdGlvbnMuCi0JZXh0bGRpCSVyNCwlcjMsMSwwCi0JZXh0bGRpCSVyNCwlcjMsNjQsMAotCWV4dGxkaQklcjQsJXIzLDEsNjMKLQlleHRsZGkJJXI0LCVyMyw2NCw2MyAgICAjIGJpdCB3ZWlyZCwgdGhhdCBvbmUuCi0JCi0JZXh0cmRpCSVyNCwlcjMsNjMsMAotCWV4dHJkaQklcjQsJXIzLDEsNjIKLQotCWluc3JkaQklcjQsJXIzLDY0LDAKLQlpbnNyZGkJJXI0LCVyMyw2MywwCi0JaW5zcmRpCSVyNCwlcjMsMSw2MgotCWluc3JkaQklcjQsJXIzLDEsNjMKLQotCXJvdGxkaQklcjQsJXIzLDAKLQlyb3RsZGkJJXI0LCVyMywxCi0Jcm90bGRpCSVyNCwlcjMsNjMKLQotCXJvdHJkaQklcjQsJXIzLDAKLQlyb3RyZGkJJXI0LCVyMywxCi0Jcm90cmRpCSVyNCwlcjMsNjMKLQotCXJvdGxkCSVyNSwlcjMsJXI0Ci0KLQlzbGRpCSVyNCwlcjMsMAotCXNsZGkJJXI0LCVyMyw2MwotCi0Jc3JkaQklcjQsJXIzLDAKLQlzcmRpCSVyNCwlcjMsMQotCXNyZGkJJXI0LCVyMyw2MwotCi0JY2xybGRpCSVyNCwlcjMsMAotCWNscmxkaQklcjQsJXIzLDEKLQljbHJsZGkJJXI0LCVyMyw2MwotCi0JY2xycmRpCSVyNCwlcjMsMAotCWNscnJkaQklcjQsJXIzLDEKLQljbHJyZGkJJXI0LCVyMyw2MwotCQotCWNscmxzbGRpCSVyNCwlcjMsMCwwCi0JY2xybHNsZGkJJXI0LCVyMywxLDAKLQljbHJsc2xkaQklcjQsJXIzLDYzLDAKLQljbHJsc2xkaQklcjQsJXIzLDYzLDEKLQljbHJsc2xkaQklcjQsJXIzLDYzLDYzCi0JCi0jIFRoZXNlIHRlc3QgdGhlIHJlbWFpbmluZyBjb3JuZXIgY2FzZXMgZm9yIDMyLWJpdCBvcGVyYXRpb25zLgotCWV4dGx3aQklcjQsJXIzLDEsMAotCWV4dGx3aQklcjQsJXIzLDMyLDAKLQlleHRsd2kJJXI0LCVyMywxLDMxCi0JZXh0bHdpCSVyNCwlcjMsMzIsMzEgICAgIyBiaXQgd2VpcmQsIHRoYXQgb25lLgotCQotCWV4dHJ3aQklcjQsJXIzLDMxLDAKLQlleHRyd2kJJXI0LCVyMywxLDMwCi0JCi0JaW5zbHdpCSVyNCwlcjMsMSwwCi0JaW5zbHdpCSVyNCwlcjMsMzIsMAotCWluc2x3aQklcjQsJXIzLDEsMzEKLQkKLQlpbnNyd2kJJXI0LCVyMywxLDAKLQlpbnNyd2kJJXI0LCVyMywzMiwwCi0JaW5zcndpCSVyNCwlcjMsMSwzMQotCQotCXJvdGx3aQklcjQsJXIzLDAKLQlyb3Rsd2kJJXI0LCVyMywxCi0Jcm90bHdpCSVyNCwlcjMsMzEKLQotCXJvdHJ3aQklcjQsJXIzLDAKLQlyb3Ryd2kJJXI0LCVyMywxCi0Jcm90cndpCSVyNCwlcjMsMzEKLQotCXJvdGx3CSVyNSwlcjMsJXI0Ci0KLQlzbHdpCSVyNCwlcjMsMAotCXNsd2kJJXI0LCVyMywxCi0Jc2x3aQklcjQsJXIzLDMxCi0KLQlzcndpCSVyNCwlcjMsMAotCXNyd2kJJXI0LCVyMywxCi0Jc3J3aQklcjQsJXIzLDMxCi0KLQljbHJsd2kJJXI0LCVyMywwCi0JY2xybHdpCSVyNCwlcjMsMQotCWNscmx3aQklcjQsJXIzLDMxCi0KLQljbHJyd2kJJXI0LCVyMywwCi0JY2xycndpCSVyNCwlcjMsMQotCWNscnJ3aQklcjQsJXIzLDMxCi0JCi0JY2xybHNsd2kJJXI0LCVyMywwLDAKLQljbHJsc2x3aQklcjQsJXIzLDEsMAotCWNscmxzbHdpCSVyNCwlcjMsMzEsMAotCWNscmxzbHdpCSVyNCwlcjMsMzEsMQotCWNscmxzbHdpCSVyNCwlcjMsMzEsMzEKLQotIyBGb3JjZSBhbGlnbm1lbnQgc28gdGhhdCB3ZSBwYXNzIHRoZSB0ZXN0IG9uIEFJWAotCS5wMmFsaWduCTMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkYmIwYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19mcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcC5zOiBmbG9hdGluZyBwb2ludCB0ZXN0cyAoc2gzZSkiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYwMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYwMEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYwMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYxMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEYwOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEYwOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYxMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEYxMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEYxMDNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYxMEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEYxMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEYxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwNERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEYwNURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEYwNkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEYwMkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEYwM0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEYwMERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwMURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDQzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDQzNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDQzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDQzNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IDAzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDQzNTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIDAzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDQzNjJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0KLWlmIFtpc3RhcmdldCBzaCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19mcAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2ZwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmQ4NjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQkuZmlsZQkidGVzdC5jIgotCS5kYXRhCi0KLSEgSGl0YWNoaSBTSCBjYzEgKGN5Z251cy0yLjcuMS05NTA3MjgpIGFyZ3VtZW50czogLU8gLWZwZWVwaG9sZQotISAtZmZ1bmN0aW9uLWNzZSAtZnJlZy1zdHJ1Y3QtcmV0dXJuIC1mZGVsYXllZC1icmFuY2ggLWZjb21tb24gLWZnbnUtbGlua2VyCi0KLWdjYzJfY29tcGlsZWQuOgotX19fZ251X2NvbXBpbGVkX2M6Ci0JLnRleHQKLQkuYWxpZ24gMgotCS5nbG9iYWwJX2ZvbwotX2ZvbzoKLQlmbW92LnMJQHIwLGZyMAotCWZtb3YucwlmcjAsQHIwCi0JZm1vdi5zCUByMCssZnIwCi0JZm1vdi5zCWZyMCxALXIwCi0JZm1vdi5zCUAocjAscjApLGZyMAotCWZtb3YucwlmcjAsQChyMCxyMCkKLQlmbW92CWZyMCxmcjEKLQlmbGRpMAlmcjAKLQlmbGRpMQlmcjAKLQlmYWRkCWZyMCxmcjEKLQlmc3ViCWZyMCxmcjEKLQlmbXVsCWZyMCxmcjEKLQlmZGl2CWZyMCxmcjEKLQlmbWFjCWZyMCxmcjAsZnIxCi0JZmNtcC9lcQlmcjAsZnIxCi0JZmNtcC9ndAlmcjAsZnIxCi0JZm5lZwlmcjAKLQlmYWJzCWZyMAotCWZzcXJ0CWZyMAotCWZsb2F0CWZwdWwsZnIwCi0JZnRyYwlmcjAsZnB1bAotCWZzdHMJZnB1bCxmcjAKLQlmbGRzCWZyMCxmcHVsCi0JbGRzCXIzLGZwdWwKLQlsZHMubAlAcjMrLGZwdWwKLQlsZHMJcjMsZnBzY3IKLQlsZHMubAlAcjMrLGZwc2NyCi0Jc3RzCWZwdWwscjMKLQlzdHMubAlmcHVsLEAtcjMKLQlzdHMJZnBzY3IscjMKLQlzdHMubAlmcHNjcixALXIzCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4MzhjNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jCi0jIFNvbGFyaXMgb24gU1BBUkMgdGVzdHMKLSMKLQotaWYgW2lzdGFyZ2V0IHNwYXJjKi0qLXNvbGFyaXMyKl0gdGhlbiB7Ci0gICAgc2V0IHgxIDAKLSAgICBzZXQgeDIgMAotICAgIHNldCB4MyAwCi0gICAgc2V0IHg0IDAKLSAgICBzZXQgeDUgMAotICAgIHNldCB4NiAwCi0gICAgc2V0IHRlc3RuYW1lICJhZGRlbmRzIChwYXJ0IDIpIgotICAgIGlmIFtnYXNfdGVzdF9vbGQgImFkZGVuZC5zIiAiIiAiYWRkZW5kcyAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCXdoaWxlIDEgewotCSAgICAjIFRoZXNlIGFyZSB3aGF0IHdlIGdldCB1c2luZyB0aGUgU29sYXJpcyBhc3NlbWJsZXIuCi0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiMDggUl9TUEFSQ19XRElTUDIyICtmb28xXFsrXF0rMHgwKzA0XFteXG5cXSpcbiIJeyBpbmNyIHgxIH0KLQkJLXJlICIwYyBSX1NQQVJDX1dESVNQMjIgK2ZvbzFcWytcXSsweDArMDRcW15cblxdKlxuIgl7IGluY3IgeDIgfQotCQktcmUgIjEwIFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbXlxuXF0qXG4iCQl7IGluY3IgeDMgfQotCQktcmUgIjE0IFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbXlxuXF0qXG4iCQl7IGluY3IgeDQgfQotCQktcmUgIjFjIFJfU1BBUkNfMzIgK2ZvbzFcW15cblxdKlxuIgkJCXsgaW5jciB4NSB9Ci0JCS1yZSAiMjAgUl9TUEFSQ18zMiArZm9vMVxbK1xdKzB4MCswNFxbXlxuXF0qXG4iCQl7IGluY3IgeDYgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0Jb2JqZHVtcF9maW5pc2gKLQlpZiBbYWxsX29uZXMgJHgxICR4MiAkeDMgJHg0ICR4NSAkeDZdIHRoZW4gewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGViMTA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLmdsb2JhbCBmb28KLWZvbzoKLQlub3AKLQlub3AKLQliYSBmb28xKzB4NAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMQotCWJhIGZvbzEKLQlub3AKLQkud29yZCBmb28xCi0JLndvcmQgZm9vMSs0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWY2OTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9nYXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBTb2xhcmlzLTIgb24gU1BBUkMgdGVzdHMKLSMKLSMgVGhlIHR3byBjb21waWxlcnMsIGNjIGFuZCBnY2MsIGdlbmVyYXRlIHF1aXRlIGRpZmZlcmVudCBkZWJ1Z2dpbmcKLSMgcmVjb3Jkcy4gIFZlcmlmeSB0aGF0IHdlIGNhbiBhY2NlcHQgYm90aC4KLSMKLWlmIFtpc3RhcmdldCBzcGFyYy0qLXNvbGFyaXMyKl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3QgInNvbC1jYy5zIiAgIiIgJHN0ZG9wdGxpc3QgIlNQQVJDIFNvbGFyaXMgY2MgLWciCi0gICAgZ2FzX3Rlc3QgInNvbC1nY2MucyIgIiIgJHN0ZG9wdGxpc3QgIlNQQVJDIFNvbGFyaXMgZ2NjIC1nIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjUwZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQkuc2VjdGlvbiAiLnRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnByb2MJNAotCS5nbG9iYWwJbWFpbgotCS5hbGlnbgk0Ci0JLmdsb2JhbAltYWluCi1tYWluOgotISNQUk9MT0dVRSMgMAotISNQUk9MT0dVRSMgMQotCXNhdmUJJXNwLC05Niwlc3AKLQlzZXRoaQklaGkoLkwxOCksJW8wCi0Jc2V0aGkJJWhpKG1zZyksJW8xCi0Jb3IJJW8xLCVsbyhtc2cpLCVvMQkhIFtpbnRlcm5hbF0KLQljYWxsCXByaW50ZiwyCi0Jb3IJJW8wLCVsbyguTDE4KSwlbzAJISBbaW50ZXJuYWxdCi0JcmV0Ci0JcmVzdG9yZQklZzAsMCwlbzAKLQkudHlwZQltYWluLCNmdW5jdGlvbgotCS5zaXplCW1haW4sKC4tbWFpbikKLQkuc2VjdGlvbiAiLmRhdGEiCQkJISBbaW50ZXJuYWxdCi0JLmFsaWduCTQKLURkYXRhLmRhdGE6Ci0JLnNlY3Rpb24gIi5ic3MiCQkJISBbaW50ZXJuYWxdCi1CYnNzLmJzczoKLQkuc2VjdGlvbiAiLnJvZGF0YSIJCSEgW2ludGVybmFsXQotRHJvZGF0YS5yb2RhdGE6Ci0JLmZpbGUJImhpLXNvbC5jIgotCS5nbG9iYWwJbXNnCi0JLmdsb2JhbAltc2cKLW1zZzoKLQkuYXNjaWkJImhlbGxvLCB3b3JsZCFcMCIKLQkudHlwZQltc2csI29iamVjdAotCS5zaXplCW1zZywxNAotCS5zZWN0aW9uICIuZGF0YTEiLCAjd3JpdGUsICNhbGxvYyAhIFtpbnRlcm5hbF0KLQkuYWxpZ24JNAotLkwxODoKLQkuYXNjaWkJIiVzXG5cMCIKLQkuaWRlbnQJImFjb21wOiAoQ0RTKSBTUEFSQ29tcGlsZXJzIDIuMC4xIDAzIFNlcCAxOTkyIgotCS5zZWN0aW9uICJ0ZXh0IgkJCSEgW2ludGVybmFsXQotCS5zdGFicwkiL2N5Z2ludC9zMS91c2Vycy9yYWVidXJuLyIsMTAwLDAsMCwwCi0JLnN0YWJzCSJoaS1zb2wuYyIsMTAwLDAsMywwCi0JLnN0YWJzCSIiLDU2LDAsMCwwCi0JLnN0YWJzCSIiLDU2LDAsMCwwCi0JLnN0YWJzCSJYdCA7IGcgOyBPIDsgVj0yLjAiLDYwLDAsMCwweDJiYjc3M2JhCi0JLnN0YWJzCSJjaGFyOnQoMCwxKT1ic2MxOzA7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkic2hvcnQ6dCgwLDIpPWJzMjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJpbnQ6dCgwLDMpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJsb25nOnQoMCw0KT1iczQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkibG9uZyBsb25nOnQoMCw1KT1iczg7MDs2NDsiLDEyOCwwLDAsMAotCS5zdGFicwkic2lnbmVkIGNoYXI6dCgwLDYpPWJzYzE7MDs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgc2hvcnQ6dCgwLDcpPWJzMjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgaW50OnQoMCw4KT1iczQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkic2lnbmVkIGxvbmc6dCgwLDkpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgbG9uZyBsb25nOnQoMCwxMCk9YnM4OzA7NjQ7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInVuc2lnbmVkIGNoYXI6dCgwLDExKT1idWMxOzA7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgc2hvcnQ6dCgwLDEyKT1idTI7MDsxNjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgaW50OnQoMCwxMyk9YnU0OzA7MzI7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInVuc2lnbmVkIGxvbmc6dCgwLDE0KT1idTQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgbG9uZyBsb25nOnQoMCwxNSk9YnU4OzA7NjQ7IiwxMjgsMCwwLDAKLQkuc3RhYnMJImZsb2F0OnQoMCwxNik9UjE7NDsiLDEyOCwwLDAsMAotCS5zdGFicwkiZG91YmxlOnQoMCwxNyk9UjI7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkibG9uZyBkb3VibGU6dCgwLDE4KT1SNjsxNjsiLDEyOCwwLDAsMAotCS5zdGFicwkidm9pZDp0KDAsMTkpPWJzMDswOzAiLDEyOCwwLDAsMAotCS5zdGFicwkibXNnOkcoMCwyMCk9YXIoMCwzKTswOzEzOygwLDEpIiwzMiwwLDE0LDAKLQkuc3RhYnMJIm1haW46RigwLDMpOygwLDMpOygwLDIxKT0qKDAsMjIpPSooMCwxKSIsMzYsMCwwLG1haW4KLQkuc3RhYnMJIm1haW4iLDQyLDAsMCwwCi0JLnN0YWJuCTE5MiwwLDEsMAotCS5zdGFibgk2OCwwLDQsMAotCS5zdGFicwkiYXJnYzpwKDAsMykiLDE2MCwwLDQsNjgKLQkuc3RhYnMJImFyZ3Y6cCgwLDIxKSIsMTYwLDAsNCw3MgotCS5zdGFicwkicHJpbnRmOlAoMCwzKSIsMzYsMCwwLDAKLQkuc3RhYm4JMjI0LDAsMSwwCi0JLnN0YWJzCSIiLDk4LDAsMCwwCi0JLnNlY3Rpb24gInRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnhzdGFicwkiLnN0YWIuaW5kZXgiLCIvY3lnaW50L3MxL3VzZXJzL3JhZWJ1cm4vIiwxMDAsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsImhpLXNvbC5jIiwxMDAsMCwzLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIiIsNTYsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIiIsNTYsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIlh0IDsgZyA7IE8gOyBWPTIuMCIsNjAsMCwwLDB4MmJiNzczYmEKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1zZyIsMzIsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1haW4iLDQyLDAsMCwwCi0JLnhzdGFicwkiLnN0YWIuaW5kZXgiLCJtYWluIiwzNiwwLDAsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtZ2NjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1ZmRjZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLQkuZmlsZQkiaGktc29sLmMiCi0uc3RhYnMgIi8xaC9kZXZvL3NyYy9nYXMvdGVzdHN1aXRlL2dhcy8iLDEwMCwwLDAsLkxMdGV4dDAKLS5zdGFicyAiaGktc29sLmMiLDEwMCwwLDAsLkxMdGV4dDAKLS5zZWN0aW9uCSIudGV4dCIKLS5MTHRleHQwOgotCS5zdGFicwkiZ2NjMl9jb21waWxlZC4iLCAweDNjLCAwLCAwLCAwCi0uc3RhYnMgImludDp0MT1yMTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyIsMTI4LDAsMCwwCi0uc3RhYnMgImNoYXI6dDI9cjI7MDsxMjc7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBpbnQ6dDM9cjE7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiLDEyOCwwLDAsMAotLnN0YWJzICJ1bnNpZ25lZCBpbnQ6dDQ9cjE7MDstMTsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIHVuc2lnbmVkIGludDp0NT1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNob3J0IGludDp0Nj1yMTstMzI3Njg7MzI3Njc7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBsb25nIGludDp0Nz1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNob3J0IHVuc2lnbmVkIGludDp0OD1yMTswOzY1NTM1OyIsMTI4LDAsMCwwCi0uc3RhYnMgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQ6dDk9cjE7MDstMTsiLDEyOCwwLDAsMAotLnN0YWJzICJzaWduZWQgY2hhcjp0MTA9cjE7LTEyODsxMjc7IiwxMjgsMCwwLDAKLS5zdGFicyAidW5zaWduZWQgY2hhcjp0MTE9cjE7MDsyNTU7IiwxMjgsMCwwLDAKLS5zdGFicyAiZmxvYXQ6dDEyPXIxOzQ7MDsiLDEyOCwwLDAsMAotLnN0YWJzICJkb3VibGU6dDEzPXIxOzg7MDsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIGRvdWJsZTp0MTQ9cjE7ODswOyIsMTI4LDAsMCwwCi0uc3RhYnMgInZvaWQ6dDE1PTE1IiwxMjgsMCwwLDAKLS5zdGFicyAibXNnOkcxNj1hcjE7MDsxMzsyIiwzMiwwLDAsMAotCS5nbG9iYWwgbXNnCi0uc2VjdGlvbgkiLnJvZGF0YSIKLQkuYWxpZ24gOAotCS50eXBlCSBtc2csI29iamVjdAotCS5zaXplCSBtc2csMTQKLW1zZzoKLQkuYXNjaXoJImhlbGxvLCB3b3JsZCEiCi0JLmFsaWduIDgKLS5MTEMwOgotCS5hc2NpegkiJXNcbiIKLS5zZWN0aW9uCSIudGV4dCIKLQkuYWxpZ24gNAotLnN0YWJzICJtYWluOkYxIiwzNiwwLDAsbWFpbgotLnN0YWJzICJhcmdjOlAxIiw2NCwwLDAsMjQKLS5zdGFicyAiYXJndjpQMTc9KjE4PSoyIiw2NCwwLDAsMjUKLQkuZ2xvYmFsIG1haW4KLQkudHlwZQkgbWFpbiwjZnVuY3Rpb24KLQkucHJvYwkwNAotbWFpbjoKLS5zdGFibiA2OCwwLDQsLkxNMS1tYWluCi0uTE0xOgotCSEjUFJPTE9HVUUjIDAKLQlzYXZlICVzcCwtMTEyLCVzcAotCSEjUFJPTE9HVUUjIDEKLS5zdGFibiA2OCwwLDUsLkxNMi1tYWluCi0uTE0yOgotLkxMQkIyOgotCXNldGhpICVoaSguTExDMCksJW8wCi0Jb3IgJW8wLCVsbyguTExDMCksJW8wCi0Jc2V0aGkgJWhpKG1zZyksJW8xCi0JY2FsbCBwcmludGYsMAotCW9yICVvMSwlbG8obXNnKSwlbzEKLS5zdGFibiA2OCwwLDYsLkxNMy1tYWluCi0uTE0zOgotLnN0YWJuIDY4LDAsNywuTE00LW1haW4KLS5MTTQ6Ci0uTExCRTI6Ci0JcmV0Ci0JcmVzdG9yZSAlZzAsMCwlbzAKLS5MTGZlMToKLQkuc2l6ZQkgbWFpbiwuTExmZTEtbWFpbgotLnN0YWJuIDE5MiwwLDAsLkxMQkIyLW1haW4KLS5zdGFibiAyMjQsMCwwLC5MTEJFMi1tYWluCi0JLmlkZW50CSJHQ0M6IChHTlUpIGN5Z251cy0yLjMuMyIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWVhMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jYXM6IC1BdjkKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzcGFyYzY0IGFzaQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJYzQgODAgNDAgMDAgCWxkYSAgXFsgJWcxIFxdIFwoMFwpLCAlZzIKLSAgIDQ6CWM0IDgwIDVmIGUwIAlsZGEgIFxbICVnMSBcXSBcKDI1NVwpLCAlZzIKLSAgIDg6CWM0IDgwIDQyIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVAsICVnMgotICAgYzoJYzQgODAgNDIgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUywgJWcyCi0gIDEwOgljNCA4MCA0MyAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVQX0wsICVnMgotICAxNDoJYzQgODAgNDMgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVU19MLCAlZzIKLSAgMTg6CWM0IDgwIDUwIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1AsICVnMgotICAxYzoJYzQgODAgNTAgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUywgJWcyCi0gIDIwOgljNCA4MCA1MCA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkYsICVnMgotICAyNDoJYzQgODAgNTAgNjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU05GLCAlZzIKLSAgMjg6CWM0IDgwIDUxIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BfTCwgJWcyCi0gIDJjOgljNCA4MCA1MSAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TX0wsICVnMgotICAzMDoJYzQgODAgNTEgNDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUE5GX0wsICVnMgotICAzNDoJYzQgODAgNTEgNjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU05GX0wsICVnMgotICAzODoJYzQgODAgNDIgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUCwgJWcyCi0gIDNjOgljNCA4MCA0MiAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAlZzIKLSAgNDA6CWM0IDgwIDQzIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVBfTCwgJWcyCi0gIDQ0OgljNCA4MCA0MyAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTX0wsICVnMgotICA0ODoJYzQgODAgNTAgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUCwgJWcyCi0gIDRjOgljNCA4MCA1MCAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TLCAlZzIKLSAgNTA6CWM0IDgwIDUwIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORiwgJWcyCi0gIDU0OgljNCA4MCA1MCA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkYsICVnMgotICA1ODoJYzQgODAgNTEgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUF9MLCAlZzIKLSAgNWM6CWM0IDgwIDUxIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NfTCwgJWcyCi0gIDYwOgljNCA4MCA1MSA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkZfTCwgJWcyCi0gIDY0OgljNCA4MCA1MSA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkZfTCwgJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9hc2kucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZmZTljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBUZXN0IGFzaSdzLgotCS50ZXh0Ci0JbGR1d2EgWyVnMV0wLCVnMgotCWxkdXdhIFslZzFdMjU1LCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVQLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVTLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVQX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVNfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUywlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUE5GLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TTkYsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU19MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QTkZfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU05GX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfUFJJTUFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUlksJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfUFJJTUFSWV9MSVRUTEUsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX05PRkFVTFQsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1NFQ09OREFSWV9OT0ZBVUxULCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWV9OT0ZBVUxUX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX05PRkFVTFRfTElUVExFLCVnMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiNmIyZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNhczogLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgbWVtYmFyCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgk4MSA0MyBlMCAwMCAJbWVtYmFyICAwCi0gICA0Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0gICA4Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0gICBjOgk4MSA0MyBlMCA0MCAJbWVtYmFyICAjU3luYwotICAxMDoJODEgNDMgZTAgMjAgCW1lbWJhciAgI01lbUlzc3VlCi0gIDE0Ogk4MSA0MyBlMCAxMCAJbWVtYmFyICAjTG9va2FzaWRlCi0gIDE4Ogk4MSA0MyBlMCAwOCAJbWVtYmFyICAjU3RvcmVTdG9yZQotICAxYzoJODEgNDMgZTAgMDQgCW1lbWJhciAgI0xvYWRTdG9yZQotICAyMDoJODEgNDMgZTAgMDIgCW1lbWJhciAgI1N0b3JlTG9hZAotICAyNDoJODEgNDMgZTAgMDEgCW1lbWJhciAgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODA1ZTA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBUZXN0IG1lbWJhciBhcmdzCi0JLnRleHQKLQltZW1iYXIgMAotCW1lbWJhciAxMjcKLQltZW1iYXIgI1N5bmN8I01lbUlzc3VlfCNMb29rYXNpZGV8I1N0b3JlU3RvcmV8I0xvYWRTdG9yZXwjU3RvcmVMb2FkfCNMb2FkTG9hZAotCW1lbWJhciAjU3luYwotCW1lbWJhciAjTWVtSXNzdWUKLQltZW1iYXIgI0xvb2thc2lkZQotCW1lbWJhciAjU3RvcmVTdG9yZQotCW1lbWJhciAjTG9hZFN0b3JlCi0JbWVtYmFyICNTdG9yZUxvYWQKLQltZW1iYXIgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtLTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM1ZTQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotISBUZXN0IGFyY2hpdGVjdHVyZSBtaXNtYXRjaCB3YXJuaW5ncy4KLSEgV2UgZG9uJ3QgdGVzdCBldmVyeSBwb3NzaWJsZSBtaXNtYXRjaCwgd2UganVzdCB3YW50IHRvIGJlIHJlYXNvbmFibGUgc3VyZQotISB0aGUgbWlzbWF0Y2ggY2hlY2tpbmcgY29kZSB3b3Jrcy4KLSEKLSEgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBzcGFyYyotKi0qIH0gfQotISB7IGRnLW9wdGlvbnMgLUF2NiB9Ci0KLSEgc3BhcmNsaXRlCi0KLQlkaXZzY2MgJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHxzcGFyY2xpdGUiICJzcGFyY2xpdGUgZGl2c2NjIG1pc21hdGNoIiB9Ci0KLQlzY2FuICVnMSwlZzIsJWczCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8c3BhcmNsaXRlIiAic3BhcmNsaXRlIHNjYW4gbWlzbWF0Y2giIH0KLQotISB2OQotCi0JbW92cnogJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHx2OSIgInY5IGZwIHJlZyBtaXNtYXRjaCIgfQotCi0hIHY5YQotCi0Jc2h1dGRvd24JCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8djlhIiAidjlhIHNodXRkb3duIG1pc21hdGNoIiB9Ci0KLWZvbzoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4OWRlMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtYXRjaC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIFRlc3QgYXJjaGl0ZWN0dXJlIG1pc21hdGNoIGVycm9ycy4KLSMKLSMgR0FTIGlzc3VlcyB0d28gbGluZXMgb2YgZXJyb3IgdGV4dCBmb3IgZWFjaCBtaXNtYXRjaDoKLSMKLSMgbW0tbGl0ZS5zOjc6IEVycm9yOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggb24gImRpdnNjYyIuCi0jIG1tLWxpdGUuczo3OiAgKFJlcXVpcmVzIHNwYXJjbGl0ZTsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyB2OC4pCi0jCi0jIFRoZSBzdWdnZXN0ZWQgcmVnZXhwIGFyZ3VtZW50IHRvIGRnLWVycm9yIGlzICJtaXNtYXRjaHw8YXJjaD4iLgotCi1pZiBbaXN0YXJnZXQgc3BhcmMqLSotKl0gewotCi0gICAgbG9hZF9saWIgZ2FzLWRnLmV4cAotCi0gICAgZGctaW5pdAotCi0gICAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyL21pc20tKi5zXV0gIiIgIiIKLQotICAgIGRnLWZpbmlzaAotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2guZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNDIxNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgcHJlZmV0Y2gKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPC50ZXh0PjoKLSAgIDA6CWMxIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl9yZWFkcwotICAgNDoJZmYgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sIDMxCi0gICA4OgljMSA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgI25fcmVhZHMKLSAgIGM6CWMzIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjb25lX3JlYWQKLSAgMTA6CWM1IDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl93cml0ZXMKLSAgMTQ6CWM3IDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjb25lX3dyaXRlCi0gIDE4OgljMSBlOCA0MiAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gI0FTSV9BSVVQLCAjbl9yZWFkcwotICAxYzoJZmYgZTggNjAgMDAgCXByZWZldGNoYSAgXFsgJWcxIFxdICVhc2ksIDMxCi0gIDIwOgljMSBlOCA0MiAyMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAjbl9yZWFkcwotICAyNDoJYzMgZTggNjAgMDAgCXByZWZldGNoYSAgXFsgJWcxIFxdICVhc2ksICNvbmVfcmVhZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3ByZWZldGNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzY4YmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotCXByZWZldGNoIFslZzFdLDAKLQlwcmVmZXRjaCBbJWcxXSwzMQotCXByZWZldGNoIFslZzFdLCNuX3JlYWRzCi0JcHJlZmV0Y2ggWyVnMV0sI29uZV9yZWFkCi0JcHJlZmV0Y2ggWyVnMV0sI25fd3JpdGVzCi0JcHJlZmV0Y2ggWyVnMV0sI29uZV93cml0ZQotCXByZWZldGNoYSBbJWcxXSNBU0lfQUlVUCwwCi0JcHJlZmV0Y2hhIFslZzFdJWFzaSwzMQotCXByZWZldGNoYSBbJWcxXSNBU0lfQUlVUywjbl9yZWFkcwotCXByZWZldGNoYSBbJWcxXSVhc2ksI29uZV9yZWFkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNmVhOWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgcmRwcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJODMgNTAgMDAgMDAgCXJkcHIgICV0cGMsICVnMQotICAgNDoJODUgNTAgNDAgMDAgCXJkcHIgICV0bnBjLCAlZzIKLSAgIDg6CTg3IDUwIDgwIDAwIAlyZHByICAldHN0YXRlLCAlZzMKLSAgIGM6CTg5IDUwIGMwIDAwIAlyZHByICAldHQsICVnNAotICAxMDoJOGIgNTEgMDAgMDAgCXJkcHIgICV0aWNrLCAlZzUKLSAgMTQ6CThkIDUxIDQwIDAwIAlyZHByICAldGJhLCAlZzYKLSAgMTg6CThmIDUxIDgwIDAwIAlyZHByICAlcHN0YXRlLCAlZzcKLSAgMWM6CTkxIDUxIGMwIDAwIAlyZHByICAldGwsICVvMAotICAyMDoJOTMgNTIgMDAgMDAgCXJkcHIgICVwaWwsICVvMQotICAyNDoJOTUgNTIgNDAgMDAgCXJkcHIgICVjd3AsICVvMgotICAyODoJOTcgNTIgODAgMDAgCXJkcHIgICVjYW5zYXZlLCAlbzMKLSAgMmM6CTk5IDUyIGMwIDAwIAlyZHByICAlY2FucmVzdG9yZSwgJW80Ci0gIDMwOgk5YiA1MyAwMCAwMCAJcmRwciAgJWNsZWFud2luLCAlbzUKLSAgMzQ6CTlkIDUzIDQwIDAwIAlyZHByICAlb3RoZXJ3aW4sICVzcAotICAzODoJOWYgNTMgODAgMDAgCXJkcHIgICV3c3RhdGUsICVvNwotICAzYzoJYTEgNTMgYzAgMDAgCXJkcHIgICVmcSwgJWwwCi0gIDQwOglhMyA1NyBjMCAwMCAJcmRwciAgJXZlciwgJWwxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDYxOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBUZXN0IHJkcHIKLQkudGV4dAotCXJkcHIgJXRwYywlZzEKLQlyZHByICV0bnBjLCVnMgotCXJkcHIgJXRzdGF0ZSwlZzMKLQlyZHByICV0dCwlZzQKLQlyZHByICV0aWNrLCVnNQotCXJkcHIgJXRiYSwlZzYKLQlyZHByICVwc3RhdGUsJWc3Ci0JcmRwciAldGwsJW8wCi0JcmRwciAlcGlsLCVvMQotCXJkcHIgJWN3cCwlbzIKLQlyZHByICVjYW5zYXZlLCVvMwotCXJkcHIgJWNhbnJlc3RvcmUsJW80Ci0JcmRwciAlY2xlYW53aW4sJW81Ci0JcmRwciAlb3RoZXJ3aW4sJW82Ci0JcmRwciAld3N0YXRlLCVvNwotCXJkcHIgJWZxLCVsMAotCXJkcHIgJXZlciwlbDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0MGQwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCByZWxvYzY0Ci0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxmb28+OgotICAgMDoJMDMgMDQgOGQgMTUgCXNldGhpICAlaGlcKDB4MTIzNDU0MDBcKSwgJWcxCi0gICA0Ogk4MiAxMCA2MiA3OCAJb3IgICVnMSwgMHgyNzgsICVnMS4qCi0gICA4OgkwMSAwMCAwMCAwMCAJbm9wIAotICAgYzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCWM6IFJfU1BBUkNfSEgyMgkudGV4dAotICAxMDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkxMDogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDE0OgkwMSAwMCAwMCAwMCAJbm9wIAotICAxODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTE4OiBSX1NQQVJDX0hIMjIJLnRleHRcKzB4MTIzNDU2NzgwMDAwMDAwMAotICAxYzoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkxYzogUl9TUEFSQ19ITTEwCS50ZXh0XCsweDEyMzQ1Njc4MDAwMDAwMDAKLSAgMjA6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDI0OgkwMyAzZiBiNyAyZSAJc2V0aGkgICVoaVwoMHhmZWRjYjgwMFwpLCAlZzEKLSAgMjg6CTgyIDEwIDYyIDk4IAlvciAgJWcxLCAweDI5OCwgJWcxLioKLSAgMmM6CTA1IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMgotICAzMDoJODQgMTAgNjIgMTAgCW9yICAlZzEsIDB4MjEwLCAlZzIKLSAgMzQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDM4OgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJMzg6IFJfU1BBUkNfSEgyMgkudGV4dAotICAzYzoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkzYzogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDQwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJNDA6IFJfU1BBUkNfTE0yMgkudGV4dAotICA0NDoJODQgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzIKLQkJCTQ0OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAgNDg6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDRjOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJNGM6IFJfU1BBUkNfSEgyMgkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDUwOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTUwOiBSX1NQQVJDX0hNMTAJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1NDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzIKLQkJCTU0OiBSX1NQQVJDX0xNMjIJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1ODoJODQgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzIKLQkJCTU4OiBSX1NQQVJDX0xPMTAJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgNjA6CTAzIDJhIDYxIGQ5IAlzZXRoaSAgJWhpXCgweGE5ODc2NDAwXCksICVnMQotICA2NDoJODIgMTAgNjEgNDMgCW9yICAlZzEsIDB4MTQzLCAlZzEuKgotICA2ODoJODIgMTAgNjIgMTAgCW9yICAlZzEsIDB4MjEwLCAlZzEKLSAgNmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDcwOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJNzA6IFJfU1BBUkNfSDQ0CS50ZXh0Ci0gIDc0Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTc0OiBSX1NQQVJDX000NAkudGV4dAotICA3ODoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEKLQkJCTc4OiBSX1NQQVJDX0w0NAkudGV4dAotICA3YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgODA6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk4MDogUl9TUEFSQ19INDQJLnRleHRcKzB4YTk4NzY1NDMyMTAKLSAgODQ6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgotCQkJODQ6IFJfU1BBUkNfTTQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCi0gIDg4Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQotCQkJODg6IFJfU1BBUkNfTDQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCi0gIDhjOgkwMSAwMCAwMCAwMCAJbm9wIAotICA5MDoJMDMgMjIgNmEgZjMgCXNldGhpICAlaGlcKDB4ODlhYmNjMDBcKSwgJWcxCi0gIDk0Ogk4MiAxOCA3ZSAxMCAJeG9yICAlZzEsIC00OTYsICVnMQotICA5ODoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgOWM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk5YzogUl9TUEFSQ19ISVgyMgkudGV4dAotICBhMDoJODIgMTggNjAgMDAgCXhvciAgJWcxLCAwLCAlZzEKLQkJCWEwOiBSX1NQQVJDX0xPWDEwCS50ZXh0Ci0gIGE0OgkwMSAwMCAwMCAwMCAJbm9wIAotICBhODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCWE4OiBSX1NQQVJDX0hJWDIyCS50ZXh0XCsweGZmZmZmZmZmNzY1NDMyMTAKLSAgYWM6CTgyIDE4IDYwIDAwIAl4b3IgICVnMSwgMCwgJWcxCi0JCQlhYzogUl9TUEFSQ19MT1gxMAkudGV4dFwrMHhmZmZmZmZmZjc2NTQzMjEwCi0gIGIwOgkwMSAwMCAwMCAwMCAJbm9wIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFkNmFmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQucworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgc3BhcmM2NCBzcGVjaWFsIHJlbG9jcwotCi1mb286Ci0Jc2V0aGkgJXVoaSgweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQotCW9yICVnMSwldWxvKDB4MTIzNDU2NzgwMDAwMDAwMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJXVoaShmb28pLCVnMQotCW9yICVnMSwldWxvKGZvbyksJWcxCi0Jbm9wCi0Jc2V0aGkgJXVoaShmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlvciAlZzEsJXVsbyhmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlub3AKLQlzZXRoaSAlaGgoMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWhtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jc2V0aGkgJWxtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jb3IgJWcxLCVsbygweGZlZGNiYTk4NzY1NDMyMTApLCVnMgotCW5vcAotCXNldGhpICVoaChmb28pLCVnMQotCW9yICVnMSwlaG0oZm9vKSwlZzEKLQlzZXRoaSAlbG0oZm9vKSwlZzIKLQlvciAlZzEsJWxvKGZvbyksJWcyCi0Jbm9wCi0Jc2V0aGkgJWhoKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlaG0oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jc2V0aGkgJWxtKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMgotCW9yICVnMSwlbG8oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jbm9wCi0Jc2V0aGkgJWg0NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJW00NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWw0NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlub3AKLQlzZXRoaSAlaDQ0KGZvbyksJWcxCi0Jb3IgJWcxLCVtNDQoZm9vKSwlZzEKLQlvciAlZzEsJWw0NChmb28pLCVnMQotCW5vcAotCXNldGhpICVoNDQoZm9vKzB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbTQ0KGZvbysweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWw0NChmb28rMHhhOTg3NjU0MzIxMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJWhpeCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCXhvciAlZzEsJWxveCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCW5vcAotCXNldGhpICVoaXgoZm9vKSwlZzEKLQl4b3IgJWcxLCVsb3goZm9vKSwlZzEKLQlub3AKLQlzZXRoaSAlaGl4KGZvbysweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCXhvciAlZzEsJWxveChmb28rMHhmZmZmZmZmZjc2NTQzMjEwKSwlZzEKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTYwMjNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgc2V0NjQKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPGZvbz46Ci0gICAwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJMDogUl9TUEFSQ19ISTIyCS50ZXh0Ci0gICA0Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KLQkJCTQ6IFJfU1BBUkNfTE8xMAkudGV4dAotICAgODoJMDcgMWQgOTUgMGMgCXNldGhpICAlaGlcKDB4NzY1NDMwMDBcKSwgJWczCi0gICBjOgk4NiAxMCBlMiAxMCAJb3IgICVnMywgMHgyMTAsICVnMwkhIDc2NTQzMjEwIDwoXCpBQlNcKnxmb28pXCsoMHh8KTB4NzY1NDMyMTA+Ci0gIDEwOgk4OCAxMCAyMCAwMCAJY2xyICAlZzQKLSAgMTQ6CTBiIDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWc1Ci0gIDE4Ogk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQkhIGZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpZmZmZj4KLSAgMWM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQkxYzogUl9TUEFSQ19ISDIyCS50ZXh0Ci0gIDIwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJMjA6IFJfU1BBUkNfTE0yMgkudGV4dAotICAyNDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEKLQkJCTI0OiBSX1NQQVJDX0hNMTAJLnRleHQKLSAgMjg6CTg0IDEwIGEwIDAwIAltb3YgICVnMiwgJWcyCi0JCQkyODogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gIDJjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgMzA6CTg0IDEwIDgwIDAxIAlvciAgJWcyLCAlZzEsICVnMgotICAzNDoJODYgMTAgM2YgZmYgCW1vdiAgLTEsICVnMwotICAzODoJODYgMTAgMjAgMDAgCWNsciAgJWczCi0gIDNjOgk4NiAxMCAyMCAwMSAJbW92ICAxLCAlZzMKLSAgNDA6CTg2IDEwIDJmIGZmIAltb3YgIDB4ZmZmLCAlZzMKLSAgNDQ6CTA3IDAwIDAwIDA0IAlzZXRoaSAgJWhpXCgweDEwMDBcKSwgJWczCi0gIDQ4Ogk4NiAxMCAzMCAwMCAJbW92ICAtNDA5NiwgJWczCi0gIDRjOgkwNyAwMCAwMCAwNCAJc2V0aGkgICVoaVwoMHgxMDAwXCksICVnMwotICA1MDoJODYgMTggZmYgZmYgCXhvciAgJWczLCAtMSwgJWczCi0gIDU0OgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMwotICA1ODoJODYgMTAgZTMgZmYgCW9yICAlZzMsIDB4M2ZmLCAlZzMJISBmZmZmIDwoXCpBQlNcKnxmb28pXCsoMHh8KWZmZmY+Ci0gIDVjOgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMwotICA2MDoJODYgMTggZmMgMDAgCXhvciAgJWczLCAtMTAyNCwgJWczCi0gIDY0OgkwOSAxZiBmZiBmZiAJc2V0aGkgICVoaVwoMHg3ZmZmZmMwMFwpLCAlZzQKLSAgNjg6CTg4IDExIDIzIGZmIAlvciAgJWc0LCAweDNmZiwgJWc0CSEgN2ZmZmZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpN2ZmZmZmZmY+Ci0gIDZjOgkwOSAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzQKLSAgNzA6CTA5IDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNAotICA3NDoJODggMTkgM2MgMDAgCXhvciAgJWc0LCAtMTAyNCwgJWc0Ci0gIDc4OgkwOSAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzQKLSAgN2M6CTg4IDE5IDNmIGZmIAl4b3IgICVnNCwgLTEsICVnNAotICA4MDoJMDkgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc0Ci0gIDg0Ogk4OCAxMSAyMyBmZiAJb3IgICVnNCwgMHgzZmYsICVnNAkhIGZmZmZmZmZmIDwoXCpBQlNcKnxmb28pXCsoMHh8KWZmZmZmZmZmPgotICA4ODoJODggMTAgMjAgMDEgCW1vdiAgMSwgJWc0Ci0gIDhjOgk4OSAyOSAzMCAyMCAJc2xseCAgJWc0LCAweDIwLCAlZzQKLSAgOTA6CTAzIDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnMQotICA5NDoJMGIgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc1Ci0gIDk4Ogk4MiAxMCA2MyBmZiAJb3IgICVnMSwgMHgzZmYsICVnMQotICA5YzoJOGEgMTEgNjMgZmYgCW9yICAlZzUsIDB4M2ZmLCAlZzUKLSAgYTA6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBhNDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGE4OgkwYiAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzUKLSAgYWM6CThiIDI5IDcwIDIwIAlzbGx4ICAlZzUsIDB4MjAsICVnNQotICBiMDoJMGIgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc1Ci0gIGI0Ogk4YSAxOSA3YyAwMCAJeG9yICAlZzUsIC0xMDI0LCAlZzUKLSAgYjg6CTBiIDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNQotICBiYzoJOGEgMTkgN2MgMDAgCXhvciAgJWc1LCAtMTAyNCwgJWc1Ci0gIGMwOgkwMyAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzEKLSAgYzQ6CTBiIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnNQotICBjODoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gIGNjOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAgZDA6CTAzIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnMQotICBkNDoJOGEgMTAgMjAgMDEgCW1vdiAgMSwgJWc1Ci0gIGQ4Ogk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgZGM6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotICBlMDoJMGIgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWc1Ci0gIGU0Ogk4MiAxMCAyMCAwMSAJbW92ICAxLCAlZzEKLSAgZTg6CThhIDExIDYwIDAxIAlvciAgJWc1LCAxLCAlZzUKLSAgZWM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBmMDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGY0OgkwYiAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzUKLSAgZjg6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotICBmYzoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gMTAwOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAxMDQ6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotIDEwODoJOGEgMTAgMjAgMDEgCW1vdiAgMSwgJWc1Ci0gMTBjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAxMTA6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotIDExNDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzIKLQkJCTExNDogUl9TUEFSQ19ISTIyCS50ZXh0Ci0gMTE4Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KLQkJCTExODogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gMTFjOgkwNyAxZCA5NSAwYyAJc2V0aGkgICVoaVwoMHg3NjU0MzAwMFwpLCAlZzMKLSAxMjA6CTg2IDEwIGUyIDEwIAlvciAgJWczLCAweDIxMCwgJWczCSEgNzY1NDMyMTAgPChcKkFCU1wqfGZvbylcKzB4NzY1NDMyMTA+Ci0gMTI0Ogk4OCAxMCAyMCAwMCAJY2xyICAlZzQKLSAxMjg6CTBiIDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWc1Ci0gMTJjOgk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQkhIGZmZmYgPChcKkFCU1wqfGZvbylcKzB4ZmZmZj4KLSAxMzA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQkxMzA6IFJfU1BBUkNfSEkyMgkudGV4dAotIDEzNDoJODQgMTAgYTAgMDAgCW1vdiAgJWcyLCAlZzIJISAwIDxmb28+Ci0JCQkxMzQ6IFJfU1BBUkNfTE8xMAkudGV4dAotIDEzODoJODUgMzggODAgMDAgCXNpZ254ICAlZzIKLSAxM2M6CTA3IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMwotIDE0MDoJODYgMTAgZTIgMTAgCW9yICAlZzMsIDB4MjEwLCAlZzMJISA3NjU0MzIxMCA8KFwqQUJTXCp8Zm9vKVwrMHg3NjU0MzIxMD4KLSAxNDQ6CTg4IDEwIDIwIDAwIAljbHIgICVnNAotIDE0ODoJMGIgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzUKLSAxNGM6CThhIDExIDYzIGZmIAlvciAgJWc1LCAweDNmZiwgJWc1CSEgZmZmZiA8KFwqQUJTXCp8Zm9vKVwrMHhmZmZmPgotIDE1MDoJODIgMTAgM2YgZmYgCW1vdiAgLTEsICVnMQotIDE1NDoJMDUgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWcyCi0gMTU4Ogk4NCAxMCBhMyBmZiAJb3IgICVnMiwgMHgzZmYsICVnMgkhIDdmZmZmZmZmIDwoXCpBQlNcKnxmb28pXCsweDdmZmZmZmZmPgotIDE1YzoJMDcgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzMKLSAxNjA6CTg2IDE4IGZjIDAwIAl4b3IgICVnMywgLTEwMjQsICVnMwotIDE2NDoJODggMTAgM2YgZmYgCW1vdiAgLTEsICVnNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTAzNmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgc3BhcmM2NCBzZXQgaW5zbiBoYW5kbGluZyAoaW5jbHVkZXMgc2V0LCBzZXR1dywgc2V0c3csIHNldHgpCi0KLWZvbzoKLQlzZXQgZm9vLCVnMgotCXNldCAweDc2NTQzMjEwLCVnMwotCXNldCAwLCVnNAotCXNldCA2NTUzNSwlZzUKLQotCXNldHggZm9vLCVnMSwlZzIKLQotCXNldHggLTEsJWcxLCVnMwotCXNldHggMCwlZzEsJWczCi0Jc2V0eCAxLCVnMSwlZzMKLQlzZXR4IDQwOTUsJWcxLCVnMwotCXNldHggNDA5NiwlZzEsJWczCi0Jc2V0eCAtNDA5NiwlZzEsJWczCi0Jc2V0eCAtNDA5NywlZzEsJWczCi0Jc2V0eCA2NTUzNSwlZzEsJWczCi0Jc2V0eCAtNjU1MzYsJWcxLCVnMwotCi0Jc2V0eCAyMTQ3NDgzNjQ3LCVnMSwlZzQKLQlzZXR4IDIxNDc0ODM2NDgsJWcxLCVnNAotCXNldHggLTIxNDc0ODM2NDgsJWcxLCVnNAotCXNldHggLTIxNDc0ODM2NDksJWcxLCVnNAotCXNldHggNDI5NDk2NzI5NSwlZzEsJWc0Ci0Jc2V0eCA0Mjk0OTY3Mjk2LCVnMSwlZzQKLQotISBHQVMgZG9lc24ndCBoYW5kbGUgbGFyZ2UgYmFzZTEwIG51bWJlcnMgeWV0LgotIQlzZXR4IDkyMjMzNzIwMzY4NTQ3NzU4MDcsJWcxLCVnNQotIQlzZXR4IDkyMjMzNzIwMzY4NTQ3NzU4MDgsJWcxLCVnNQotIQlzZXR4IC05MjIzMzcyMDM2ODU0Nzc1ODA4LCVnMSwlZzUKLSEJc2V0eCAtOTIyMzM3MjAzNjg1NDc3NTgwOSwlZzEsJWc1Ci0KLQlzZXR4IDB4N2ZmZmZmZmZmZmZmZmZmZiwlZzEsJWc1Ci0Jc2V0eCAweDgwMDAwMDAwMDAwMDAwMDAsJWcxLCVnNQkJISB0ZXN0IG9ubHkgaGgyMiBuZWVkZWQKLQlzZXR4IDB4ZmZmZmZmZmYwMDAwMDAwMCwlZzEsJWc1CQkhIHRlc3Qgb25seSBobTEwIG5lZWRlZAotCXNldHggMHhmZmZmZmZmZjgwMDAwMDAwLCVnMSwlZzUJCSEgdGVzdCBzaWduLWV4dCBvZiBsb3dlciAzMgotCXNldHggMHhmZmZmMDAwMGZmZmYwMDAwLCVnMSwlZzUJCSEgdGVzdCBoaDIyLGhpMjIKLQlzZXR4IDB4ZmZmZjAwMDAwMDAwMDAwMSwlZzEsJWc1CQkhIHRlc3QgaGgyMixsbzEwCi0Jc2V0eCAweDAwMDAwMDAxZmZmZjAwMDEsJWcxLCVnNQkJISB0ZXN0IGhtMTAsaGkyMixsbzEwCi0Jc2V0eCAweDAwMDAwMDAxZmZmZjAwMDAsJWcxLCVnNQkJISB0ZXN0IGhtMTAsaGkyMgotCXNldHggMHgwMDAwMDAwMTAwMDAwMDAxLCVnMSwlZzUJCSEgdGVzdCBobTEwLGxvMTAKLQotCXNldHV3IGZvbywlZzIKLQlzZXR1dyAweDc2NTQzMjEwLCVnMwotCXNldHV3IDAsJWc0Ci0Jc2V0dXcgNjU1MzUsJWc1Ci0KLQlzZXRzdyBmb28sJWcyCi0Jc2V0c3cgMHg3NjU0MzIxMCwlZzMKLQlzZXRzdyAwLCVnNAotCXNldHN3IDY1NTM1LCVnNQotCXNldHN3IDB4ZmZmZmZmZmYsJWcxCi0Jc2V0c3cgMHg3ZmZmZmZmZiwlZzIKLQlzZXRzdyAweGZmZmYwMDAwLCVnMwotCXNldHN3IC0xLCVnNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BhcmMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BhcmMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2RjYWFhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwYXJjLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgU29tZSBnZW5lcmljIFNQQVJDIGFuZCBTUEFSQzY0IHRlc3RzCi0KLSMgRklYTUU6IFRoZSB0ZXN0cyBoZXJlIGFyZW4ndCByZWFsbHkgYnVsbGV0IHByb29mLiAgQSBtaXN0YWtlIGluIHRoZSBvcGNvZGUKLSMgdGFibGUgY2FuIHNsaXAgdGhyb3VnaCBzaW5jZSB3ZSB1c2UgdGhlIHNhbWUgdGFibGUgZm9yIGFzc2VtYmx5IGFuZAotIyBkaXNhc3NlbWJseS4gIFRoZSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gaW5jbHVkZSBhIGhleCBkdW1wIG9mIHRoZSBpbnNucwotIyBhbmQgdGVzdCB0aGF0IGFzIHdlbGwuICBMYXRlci4KLQotIyBGaW5kIG91dCBpZiB0aGVzZSBiaW51dGlscyBhcmUgZWl0aGVyIHNwYXJjNjQqLSotKiBvcgotIyBzcGFyYyotKi0qIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1zcGFyYzY0LSotKgotcHJvYyBnYXNfNjRfY2hlY2sgeyB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLQotICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkTk0gJE5NRkxBR1MgLS1oZWxwIiBubV9oZWxwCi0gICAgcmV0dXJuIFtyZWdleHAgImVsZjY0XFtfLVxdc3BhcmMiICRubV9oZWxwXTsKLX0KLQotaWYgW2lzdGFyZ2V0IHNwYXJjKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzeW50aCIKLSAgICBpZiBbZ2FzXzY0X2NoZWNrXSB7Ci0JcnVuX2R1bXBfdGVzdCAiYXNpIgotCXJ1bl9kdW1wX3Rlc3QgIm1lbWJhciIKLQlydW5fZHVtcF90ZXN0ICJwcmVmZXRjaCIKLQlydW5fZHVtcF90ZXN0ICJzZXQ2NCIKLQlydW5fZHVtcF90ZXN0ICJzeW50aDY0IgotCXJ1bl9kdW1wX3Rlc3QgInJkcHIiCi0JcnVuX2R1bXBfdGVzdCAid3JwciIKLQlydW5fZHVtcF90ZXN0ICJyZWxvYzY0IgotICAgIH0KLX0KLQotaWYgW2lzdGFyZ2V0IHNwYXJjbGV0Ki0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzcGxldCIKLSAgICBydW5fZHVtcF90ZXN0ICJzcGxldC0yIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU1NTM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIuZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNhczogLUFzcGFyY2xldAotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxzdGFydD46Ci0gICAwOgk4MSBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY3NyCi0gICA0Ogk4MyBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2ZyCi0gICA4Ogk4NSBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2NyY3IKLSAgIGM6CTg3IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjcHIKLSAgMTA6CTg5IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjc3IyCi0gIDE0Ogk4YiBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2NycgotICAxODoJOGQgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2Nyc3RyCi0gIDFjOgk4MyBiMCAwMSAwMCAJY3JkY3h0ICAlY2NzciwgJWcxCi0gIDIwOgk4MyBiMCA0MSAwMCAJY3JkY3h0ICAlY2NmciwgJWcxCi0gIDI0Ogk4MyBiMCA4MSAwMCAJY3JkY3h0ICAlY2NjcmNyLCAlZzEKLSAgMjg6CTgzIGIwIGMxIDAwIAljcmRjeHQgICVjY3ByLCAlZzEKLSAgMmM6CTgzIGIxIDAxIDAwIAljcmRjeHQgICVjY3NyMiwgJWcxCi0gIDMwOgk4MyBiMSA0MSAwMCAJY3JkY3h0ICAlY2NjcnIsICVnMQotICAzNDoJODMgYjEgODEgMDAgCWNyZGN4dCAgJWNjcnN0ciwgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzQ0OTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotISBUZXN0IHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4KLQotCS50ZXh0Ci0JLmdsb2JhbCBzdGFydAotc3RhcnQ6Ci0KLQljd3JjeHQgICAgJWcxLCVjY3NyCi0JY3dyY3h0ICAgICVnMSwlY2NmcgotCWN3cmN4dCAgICAlZzEsJWNjY3JjcgotCWN3cmN4dCAgICAlZzEsJWNjcHIKLQljd3JjeHQgICAgJWcxLCVjY3NyMgotCWN3cmN4dCAgICAlZzEsJWNjY3JyCi0JY3dyY3h0ICAgICVnMSwlY2Nyc3RyCi0KLQljcmRjeHQgICAgJWNjc3IsJWcxCi0JY3JkY3h0ICAgICVjY2ZyLCVnMQotCWNyZGN4dCAgICAlY2NjcmNyLCVnMQotCWNyZGN4dCAgICAlY2NwciwlZzEKLQljcmRjeHQgICAgJWNjc3IyLCVnMQotCWNyZGN4dCAgICAlY2NjcnIsJWcxCi0JY3JkY3h0ICAgICVjY3JzdHIsJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjMGEyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSNhczogLUFzcGFyY2xldAotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjbGV0IGV4dGVuc2lvbnMKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8c3RhcnQ+OgotICAgMDoJYTEgNDAgMDAgMDAgCXJkICAleSwgJWwwCi0gICA0OglhMSA0MCA0MCAwMCAJcmQgICVhc3IxLCAlbDAKLSAgIDg6CWExIDQzIGMwIDAwIAlyZCAgJWFzcjE1LCAlbDAKLSAgIGM6CWExIDQ0IDQwIDAwIAlyZCAgJWFzcjE3LCAlbDAKLSAgMTA6CWExIDQ0IDgwIDAwIAlyZCAgJWFzcjE4LCAlbDAKLSAgMTQ6CWExIDQ0IGMwIDAwIAlyZCAgJWFzcjE5LCAlbDAKLSAgMTg6CWExIDQ1IDAwIDAwIAlyZCAgJWFzcjIwLCAlbDAKLSAgMWM6CWExIDQ1IDQwIDAwIAlyZCAgJWFzcjIxLCAlbDAKLSAgMjA6CWExIDQ1IDgwIDAwIAlyZCAgJWFzcjIyLCAlbDAKLSAgMjQ6CTgxIDg0IDIwIDAwIAltb3YgICVsMCwgJXkKLSAgMjg6CTgzIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjEKLSAgMmM6CTlmIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE1Ci0gIDMwOglhMyA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IxNwotICAzNDoJYTUgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTgKLSAgMzg6CWE3IDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE5Ci0gIDNjOglhOSA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IyMAotICA0MDoJYWIgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMjEKLSAgNDQ6CWFkIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjIyCi0KLTArNDggPHRlc3RfdW11bD46Ci0gIDQ4Ogk4NiA1MCA0MCAwMiAJdW11bCAgJWcxLCAlZzIsICVnMwotICA0YzoJODYgNTAgNDAgMDIgCXVtdWwgICVnMSwgJWcyLCAlZzMKLQotMCs1MCA8dGVzdF9zbXVsPjoKLSAgNTA6CTg2IDU4IDQwIDAyIAlzbXVsICAlZzEsICVnMiwgJWczCi0gIDU0Ogk4NiA1OCA0MCAwMiAJc211bCAgJWcxLCAlZzIsICVnMwotCi0wKzU4IDx0ZXN0X3N0YmFyPjoKLSAgNTg6CTgxIDQzIGMwIDAwIAlzdGJhciAKLSAgNWM6CTgxIDQzIGMwIDAwIAlzdGJhciAKLSAgNjA6CTAwIDAwIDAwIDAxIAl1bmltcCAgMHgxCi0gIDY0Ogk4MSBkYyA0MCAwMCAJZmx1c2ggICVsMQotCi0wKzY4IDx0ZXN0X3NjYW4+OgotICA2ODoJYTcgNjQgN2YgZmYgCXNjYW4gICVsMSwgLTEsICVsMwotICA2YzoJYTcgNjQgNjAgMDAgCXNjYW4gICVsMSwgMCwgJWwzCi0gIDcwOglhNyA2NCA0MCAxMSAJc2NhbiAgJWwxLCAlbDEsICVsMwotCi0wKzc0IDx0ZXN0X3NodWZmbGU+OgotICA3NDoJYTMgNmMgMjAgMDEgCXNodWZmbGUgICVsMCwgMSwgJWwxCi0gIDc4OglhMyA2YyAyMCAwMiAJc2h1ZmZsZSAgJWwwLCAyLCAlbDEKLSAgN2M6CWEzIDZjIDIwIDA0IAlzaHVmZmxlICAlbDAsIDQsICVsMQotICA4MDoJYTMgNmMgMjAgMDggCXNodWZmbGUgICVsMCwgOCwgJWwxCi0gIDg0OglhMyA2YyAyMCAxMCAJc2h1ZmZsZSAgJWwwLCAweDEwLCAlbDEKLSAgODg6CWEzIDZjIDIwIDE4IAlzaHVmZmxlICAlbDAsIDB4MTgsICVsMQotCi0wKzhjIDx0ZXN0X3VtYWM+OgotICA4YzoJYTEgZjQgNDAgMTIgCXVtYWMgICVsMSwgJWwyLCAlbDAKLSAgOTA6CWExIGY0IDYwIDAyIAl1bWFjICAlbDEsIDIsICVsMAotICA5NDoJYTEgZjQgNjAgMDIgCXVtYWMgICVsMSwgMiwgJWwwCi0KLTArOTggPHRlc3RfdW1hY2Q+OgotICA5ODoJYTEgNzQgODAgMTQgCXVtYWNkICAlbDIsICVsNCwgJWwwCi0gIDljOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCi0gIGEwOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCi0KLTArYTQgPHRlc3Rfc21hYz46Ci0gIGE0OglhMSBmYyA0MCAxMiAJc21hYyAgJWwxLCAlbDIsICVsMAotICBhODoJYTEgZmMgN2YgZDYgCXNtYWMgICVsMSwgLTQyLCAlbDAKLSAgYWM6CWExIGZjIDdmIGQ2IAlzbWFjICAlbDEsIC00MiwgJWwwCi0KLTArYjAgPHRlc3Rfc21hY2Q+OgotICBiMDoJYTEgN2MgODAgMTQgCXNtYWNkICAlbDIsICVsNCwgJWwwCi0gIGI0OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCi0gIGI4OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCi0KLTArYmMgPHRlc3RfdW11bGQ+OgotICBiYzoJOTAgNGEgODAgMGMgCXVtdWxkICAlbzIsICVvNCwgJW8wCi0gIGMwOgk5MCA0YSBhMiAzNCAJdW11bGQgICVvMiwgMHgyMzQsICVvMAotICBjNDoJOTAgNGEgYTUgNjcgCXVtdWxkICAlbzIsIDB4NTY3LCAlbzAKLQotMCtjOCA8dGVzdF9zbXVsZD46Ci0gIGM4OgliMCA2ZSA4MCAxYyAJc211bGQgICVpMiwgJWk0LCAlaTAKLSAgY2M6CWIwIDZlIGIwIDAwIAlzbXVsZCAgJWkyLCAtNDA5NiwgJWkwCi0gIGQwOgliMCA2ZiAyZiBmZiAJc211bGQgICVpNCwgMHhmZmYsICVpMAotCi0wK2Q0IDx0ZXN0X2NvcHJvY2Vzc29yPjoKLSAgZDQ6CTgxIGI0IDAwIDExIAljcHVzaCAgJWwwLCAlbDEKLSAgZDg6CTgxIGI0IDIwIDAxIAljcHVzaCAgJWwwLCAxCi0gIGRjOgk4MSBiNCAwMCA1MSAJY3B1c2hhICAlbDAsICVsMQotICBlMDoJODEgYjQgMjAgNDEgCWNwdXNoYSAgJWwwLCAxCi0gIGU0OglhMSBiMCAwMCA4MCAJY3B1bGwgICVsMAotICBlODoJYTEgYjAgMDEgMDAgCWNyZGN4dCAgJWNjc3IsICVsMAotICBlYzoJYTEgYjAgNDEgMDAgCWNyZGN4dCAgJWNjZnIsICVsMAotICBmMDoJYTEgYjAgYzEgMDAgCWNyZGN4dCAgJWNjcHIsICVsMAotICBmNDoJYTEgYjAgODEgMDAgCWNyZGN4dCAgJWNjY3JjciwgJWwwCi0gIGY4Ogk4MSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3NyCi0gIGZjOgk4MyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2ZyCi0gMTAwOgk4NyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3ByCi0gMTA0Ogk4NSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2NyY3IKLSAxMDg6CTAxIGMwIDAwIDAxIAljYm4gIDEwYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkzOD4KLQkJCTEwODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWY4Ci0gMTBjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDExMDoJMjEgYzAgMDAgMDEgCWNibixhICAgMTE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTQwPgotCQkJMTEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZjAKLSAxMTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTE4OgkwMyBjMCAwMCAwMSAJY2JlICAxMWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNDg+Ci0JCQkxMTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVlOAotIDExYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMjA6CTIzIGMwIDAwIDAxIAljYmUsYSAgIDEyNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk1MD4KLQkJCTEyMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWUwCi0gMTI0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDEyODoJMDUgYzAgMDAgMDEgCWNiZiAgMTJjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTU4PgotCQkJMTI4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZDgKLSAxMmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTMwOgkyNSBjMCAwMCAwMSAJY2JmLGEgICAxMzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjA+Ci0JCQkxMzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVkMAotIDEzNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMzg6CTA3IGMwIDAwIDAxIAljYmVmICAxM2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjg+Ci0JCQkxMzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjOAotIDEzYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNDA6CTI3IGMwIDAwIDAxIAljYmVmLGEgICAxNDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNzA+Ci0JCQkxNDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjMAotIDE0NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNDg6CTA5IGMwIDAwIDAxIAljYnIgIDE0YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk3OD4KLQkJCTE0ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWI4Ci0gMTRjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE1MDoJMjkgYzAgMDAgMDEgCWNicixhICAgMTU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTgwPgotCQkJMTUwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYjAKLSAxNTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTU4OgkwYiBjMCAwMCAwMSAJY2JlciAgMTVjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTg4PgotCQkJMTU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTgKLSAxNWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTYwOgkyYiBjMCAwMCAwMSAJY2JlcixhICAgMTY0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTkwPgotCQkJMTYwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTAKLSAxNjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTY4OgkwZCBjMCAwMCAwMSAJY2JmciAgMTZjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTk4PgotCQkJMTY4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTgKLSAxNmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTcwOgkyZCBjMCAwMCAwMSAJY2JmcixhICAgMTc0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWEwPgotCQkJMTcwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTAKLSAxNzQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTc4OgkwZiBjMCAwMCAwMSAJY2JlZnIgIDE3YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClhOD4KLQkJCTE3ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTg4Ci0gMTdjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE4MDoJMmYgYzAgMDAgMDEgCWNiZWZyLGEgICAxODQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYjA+Ci0JCQkxODA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU4MAotIDE4NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxODg6CTExIGMwIDAwIDAxIAljYmEgIDE4YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCliOD4KLQkJCTE4ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTc4Ci0gMThjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE5MDoJMzEgYzAgMDAgMDEgCWNiYSxhICAgMTk0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWMwPgotCQkJMTkwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNzAKLSAxOTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTk4OgkxMyBjMCAwMCAwMSAJY2JuZSAgMTljIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWM4PgotCQkJMTk4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjgKLSAxOWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWEwOgkzMyBjMCAwMCAwMSAJY2JuZSxhICAgMWE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQwPgotCQkJMWEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjAKLSAxYTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWE4OgkxNSBjMCAwMCAwMSAJY2JuZiAgMWFjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQ4PgotCQkJMWE4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTgKLSAxYWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWIwOgkzNSBjMCAwMCAwMSAJY2JuZixhICAgMWI0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWUwPgotCQkJMWIwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTAKLSAxYjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWI4OgkxNyBjMCAwMCAwMSAJY2JuZWYgIDFiYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCllOD4KLQkJCTFiODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTQ4Ci0gMWJjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDFjMDoJMzcgYzAgMDAgMDEgCWNibmVmLGEgICAxYzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjA+Ci0JCQkxYzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU0MAotIDFjNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYzg6CTE5IGMwIDAwIDAxIAljYm5yICAxY2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjg+Ci0JCQkxYzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUzOAotIDFjYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZDA6CTM5IGMwIDAwIDAxIAljYm5yLGEgICAxZDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTAwPgotCQkJMWQwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMzAKLSAxZDQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWQ4OgkxYiBjMCAwMCAwMSAJY2JuZXIgIDFkYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMDg+Ci0JCQkxZDg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUyOAotIDFkYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZTA6CTNiIGMwIDAwIDAxIAljYm5lcixhICAgMWU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTExMD4KLQkJCTFlMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTIwCi0gMWU0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDFlODoJMWQgYzAgMDAgMDEgCWNibmZyICAxZWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTE4PgotCQkJMWU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMTgKLSAxZWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWYwOgkzZCBjMCAwMCAwMSAJY2JuZnIsYSAgIDFmNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjA+Ci0JCQkxZjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUxMAotIDFmNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZjg6CTFmIGMwIDAwIDAxIAljYm5lZnIgIDFmYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjg+Ci0JCQkxZjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwOAotIDFmYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAyMDA6CTNmIGMwIDAwIDAxIAljYm5lZnIsYSAgIDIwNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMzA+Ci0JCQkyMDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwMAotIDIwNDoJMDEgMDAgMDAgMDAgCW5vcCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZkNTA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JhbCBzdGFydAotCi0hCVN0YXJ0aW5nIHBvaW50Ci1zdGFydDoKLQotIQl0ZXN0IGFsbCBBU1JzCi0KLQlyZAklYXNyMCwgJWwwCi0JcmQJJWFzcjEsICVsMAotCXJkCSVhc3IxNSwgJWwwCi0JcmQJJWFzcjE3LCAlbDAKLQlyZAklYXNyMTgsICVsMAotCXJkCSVhc3IxOSwgJWwwCSEgc2hvdWxkIHN0b3AgdGhlIHByb2Nlc3NvcgotCXJkCSVhc3IyMCwgJWwwCi0JcmQJJWFzcjIxLCAlbDAKLQlyZAklYXNyMjIsICVsMAotCi0Jd3IJJWwwLCAwLCAlYXNyMAotCXdyCSVsMCwgMCwgJWFzcjEKLQl3cgklbDAsIDAsICVhc3IxNQotCXdyCSVsMCwgMCwgJWFzcjE3Ci0Jd3IJJWwwLCAwLCAlYXNyMTgKLQl3cgklbDAsIDAsICVhc3IxOQotCXdyCSVsMCwgMCwgJWFzcjIwCi0Jd3IJJWwwLCAwLCAlYXNyMjEKLQl3cgklbDAsIDAsICVhc3IyMgotCi0hCXRlc3QgVU1VTCB3aXRoIG5vIG92ZXJmbG93IGluc2lkZSBZCi10ZXN0X3VtdWw6Ci0JdW11bAklZzEsICVnMiwgJWczCi0KLSEJdGVzdCBVTVVMIHdpdGggYW4gb3ZlcmZsb3cgaW5zaWRlIFkKLQotCXVtdWwJJWcxLCAlZzIsICVnMwkhICVnMyBtdXN0IGJlIGVxdWFsIHRvIDAKLQotIQl0ZXN0IFNNVUwgd2l0aCBuZWdhdGl2ZSByZXN1bHQKLXRlc3Rfc211bDoKLQlzbXVsCSVnMSwgJWcyLCAlZzMKLQotIQl0ZXN0IFNNVUwgd2l0aCBwb3NpdGl2ZSByZXN1bHQKLQotCXNtdWwJJWcxLCAlZzIsICVnMwotCi0hCXRlc3QgU1RCQVI6IHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3ludGF4ZXMKLXRlc3Rfc3RiYXI6Ci0Jc3RiYXIJCQkhIGlzIGEgdmFsaWQgVjggc3ludGF4LCBhdCBsZWFzdCBhIHN5bnRoZXRpYwotCQkJCSEgaW5zdHJ1Y3Rpb24KLQlyZAklYXNyMTUsICVnMAkhIG90aGVyIHNvbHV0aW9uCi0KLSEJdGVzdCBVTklNUAotCXVuaW1wCTEKLQotIQl0ZXN0IEZMVVNICi0JZmx1c2gJJWwxCQkhIGlzIHRoZSBvZmZpY2lhbCBWOCBzeW50YXgKLQotIQl0ZXN0IFNDQU46IGZpbmQgZmlyc3QgMAotdGVzdF9zY2FuOgotCXNjYW4JJWwxLCAweGZmZmZmZmZmLCAlbDMKLQotIQl0ZXN0IHNjYW46IGZpbmQgZmlyc3QgMQotCi0Jc2NhbgklbDEsIDAsICVsMwotCi0hCXRlc3Qgc2NhbjogZmluZCBmaXJzdCBiaXQgIT0gYml0LTAKLQotCXNjYW4JJWwxLCAlbDEsICVsMwotCi0hCXRlc3QgU0hVRkZMRQotdGVzdF9zaHVmZmxlOgotCXNodWZmbGUJJWwwLCAweDEsICVsMQotCXNodWZmbGUJJWwwLCAweDIsICVsMQotCXNodWZmbGUJJWwwLCAweDQsICVsMQotCXNodWZmbGUJJWwwLCAweDgsICVsMQotCXNodWZmbGUJJWwwLCAweDEwLCAlbDEKLQlzaHVmZmxlCSVsMCwgMHgxOCwgJWwxCi0KLSEJdGVzdCBVTUFDCi10ZXN0X3VtYWM6Ci0JdW1hYwklbDEsICVsMiwgJWwwCi0JdW1hYwklbDEsIDIsICVsMAotCXVtYWMJMiwgJWwxLCAlbDAKLQotIQl0ZXN0IFVNQUNECi10ZXN0X3VtYWNkOgotCXVtYWNkCSVsMiwgJWw0LCAlbDAKLQl1bWFjZAklbDIsIDMsICVsMAotCXVtYWNkCTMsICVsMiwgJWwwCi0KLSEJdGVzdCBTTUFDCi10ZXN0X3NtYWM6Ci0Jc21hYwklbDEsICVsMiwgJWwwCi0Jc21hYwklbDEsIC00MiwgJWwwCi0Jc21hYwktNDIsICVsMSwgJWwwCi0KLSEJdGVzdCBTTUFDRAotdGVzdF9zbWFjZDoKLQlzbWFjZAklbDIsICVsNCwgJWwwCi0Jc21hY2QJJWwyLCAxMjMsICVsMAotCXNtYWNkCTEyMywgJWwyLCAlbDAKLQotIQl0ZXN0IFVNVUxECi10ZXN0X3VtdWxkOgotCXVtdWxkCSVvMiwgJW80LCAlbzAKLQl1bXVsZAklbzIsIDB4MjM0LCAlbzAKLQl1bXVsZAkweDU2NywgJW8yLCAlbzAKLQotIQl0ZXN0IFNNVUxECi10ZXN0X3NtdWxkOgotCXNtdWxkCSVpMiwgJWk0LCAlaTAKLQlzbXVsZAklaTIsIC00MDk2LCAlaTAKLQlzbXVsZAk0MDk1LCAlaTQsICVpMAotCi0hCUNvcHJvY2Vzc29yIGluc3RydWN0aW9ucwotdGVzdF9jb3Byb2Nlc3NvcjoKLSEJJWNjc3IJaXMgcmVnaXN0ZXIgIyAwCi0hCSVjY2ZyCWlzIHJlZ2lzdGVyICMgMQotIQklY2NwcglpcyByZWdpc3RlciAjIDMKLSEJJWNjY3JjciBpcyByZWdpc3RlciAjIDIKLQotIQl0ZXN0IENQVVNIOiBqdXN0IHN5bnRheAotCi0JY3B1c2gJJWwwLCAlbDEKLQljcHVzaAklbDAsIDEKLQljcHVzaGEJJWwwLCAlbDEKLQljcHVzaGEJJWwwLCAxCi0KLSEJdGVzdCBDUFVMTDoganVzdCBzeW50YXgKLQotCWNwdWxsCSVsMAotCi0hCXRlc3QgQ1BSRENYVDoganVzdCBzeW50YXgKLQotCWNyZGN4dAklY2NzciwgJWwwCi0JY3JkY3h0CSVjY2ZyLCAlbDAKLQljcmRjeHQJJWNjcHIsICVsMAotCWNyZGN4dAklY2NjcmNyLCAlbDAKLQotIQl0ZXN0IENQV1JDWFQ6IGp1c3Qgc3ludGF4Ci0KLQljd3JjeHQJJWwwLCAlY2NzcgotCWN3cmN4dAklbDAsICVjY2ZyCi0JY3dyY3h0CSVsMCwgJWNjcHIKLQljd3JjeHQJJWwwLCAlY2NjcmNyCi0KLSEJdGVzdCBDQmNjYzoganVzdCBzeW50YXgKLQotCWNibglzdG9wCi0Jbm9wCi0JY2JuLGEJc3RvcAotCW5vcAotCWNiZQlzdG9wCi0Jbm9wCi0JY2JlLGEJc3RvcAotCW5vcAotCWNiZglzdG9wCi0Jbm9wCi0JY2JmLGEJc3RvcAotCW5vcAotCWNiZWYJc3RvcAotCW5vcAotCWNiZWYsYQlzdG9wCi0Jbm9wCi0JY2JyCXN0b3AKLQlub3AKLQljYnIsYQlzdG9wCi0Jbm9wCi0JY2JlcglzdG9wCi0Jbm9wCi0JY2JlcixhCXN0b3AKLQlub3AKLQljYmZyCXN0b3AKLQlub3AKLQljYmZyLGEJc3RvcAotCW5vcAotCWNiZWZyCXN0b3AKLQlub3AKLQljYmVmcixhCXN0b3AKLQlub3AKLQljYmEJc3RvcAotCW5vcAotCWNiYSxhCXN0b3AKLQlub3AKLQljYm5lCXN0b3AKLQlub3AKLQljYm5lLGEJc3RvcAotCW5vcAotCWNibmYJc3RvcAotCW5vcAotCWNibmYsYQlzdG9wCi0Jbm9wCi0JY2JuZWYJc3RvcAotCW5vcAotCWNibmVmLGEJc3RvcAotCW5vcAotCWNibnIJc3RvcAotCW5vcAotCWNibnIsYQlzdG9wCi0Jbm9wCi0JY2JuZXIJc3RvcAotCW5vcAotCWNibmVyLGEJc3RvcAotCW5vcAotCWNibmZyCXN0b3AKLQlub3AKLQljYm5mcixhCXN0b3AKLQlub3AKLQljYm5lZnIJc3RvcAotCW5vcAotCWNibmVmcixhCXN0b3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDIyMmM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jYXM6IC1BdjcKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogc3BhcmMgc3ludGgKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxmb28+IHhub3IgICVnMSwgJWcwLCAlZzIKLTArMDAwNCA8Zm9vXCsoMHh8KTQ+IHhub3IgICVnMSwgJWcwLCAlZzEKLTArMDAwOCA8Zm9vXCsoMHh8KTg+IG5lZyAgJWcxLCAlZzIKLTArMDAwYyA8Zm9vXCsoMHh8KWM+IG5lZyAgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwNjYyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIGNvbW1vbiAodjggb3IgdjkpIHN5bnRoZXRpYyBpbnNucwotCS50ZXh0Ci1mb286Ci0Jbm90ICVnMSwlZzIKLQlub3QgJWcxCi0JbmVnICVnMSwlZzIKLQluZWcgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNmM4YzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBzcGFyYzY0IHN5bnRoNjQKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8Zm9vLSgweHwpND4gaXByZWZldGNoICAwKzAwMDQgPGZvbz4KLTArMDAwNCA8Zm9vPiBzaWdueCAgJWcxLCAlZzIKLTArMDAwOCA8Zm9vXCsoMHh8KTQ+IGNscnV3ICAlZzEsICVnMgotMCswMDBjIDxmb29cKygweHwpOD4gY2FzICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTAgPGZvb1wrKDB4fCljPiBjYXNsICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTQgPGZvb1wrKDB4fCkxMD4gY2FzeCAgXFsgJWcxIFxdLCAlZzIsICVnMwotMCswMDE4IDxmb29cKygweHwpMTQ+IGNhc3hsICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMWMgPGZvb1wrKDB4fCkxOD4gY2xyeCAgXFsgJWcxIFwrICVnMiBcXQotMCswMDIwIDxmb29cKygweHwpMWM+IGNscnggIFxbICVnMSBcXQotMCswMDI0IDxmb29cKygweHwpMjA+IGNscnggIFxbICVnMSBcKyAxIFxdCi0wKzAwMjggPGZvb1wrKDB4fCkyND4gY2xyeCAgXFsgJWcxIFwrIDB4MmEgXF0KLTArMDAyYyA8Zm9vXCsoMHh8KTI4PiBjbHJ4ICBcWyAweDQyIFxdCi0wKzAwMzAgPGZvb1wrKDB4fCkyYz4gc2lnbnggICVnMQotMCswMDM0IDxmb29cKygweHwpMzA+IGNscnV3ICAlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhYjg3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIHNwYXJjNjQgc3ludGhldGljIGluc25zCi0JLnRleHQKLQlpcHJlZmV0Y2ggZm9vCi1mb286Ci0Jc2lnbnggJWcxLCVnMgotCWNscnV3ICVnMSwlZzIKLQljYXMgWyVnMV0sJWcyLCVnMwotCWNhc2wgWyVnMV0sJWcyLCVnMwotCWNhc3ggWyVnMV0sJWcyLCVnMwotCWNhc3hsIFslZzFdLCVnMiwlZzMKLQotCWNscnggWyVnMSslZzJdCi0JY2xyeCBbJWcxXQotCWNscnggWyVnMSsxXQotCWNscnggWzQyKyVnMV0KLQljbHJ4IFsweDQyXQotCi0Jc2lnbnggJWcxCi0JY2xydXcgJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2M4MGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgd3JwcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJODEgOTAgNDAgMDAgCXdycHIgICVnMSwgJXRwYwotICAgNDoJODMgOTAgODAgMDAgCXdycHIgICVnMiwgJXRucGMKLSAgIDg6CTg1IDkwIGMwIDAwIAl3cnByICAlZzMsICV0c3RhdGUKLSAgIGM6CTg3IDkxIDAwIDAwIAl3cnByICAlZzQsICV0dAotICAxMDoJODkgOTEgNDAgMDAgCXdycHIgICVnNSwgJXRpY2sKLSAgMTQ6CThiIDkxIDgwIDAwIAl3cnByICAlZzYsICV0YmEKLSAgMTg6CThkIDkxIGMwIDAwIAl3cnByICAlZzcsICVwc3RhdGUKLSAgMWM6CThmIDkyIDAwIDAwIAl3cnByICAlbzAsICV0bAotICAyMDoJOTEgOTIgNDAgMDAgCXdycHIgICVvMSwgJXBpbAotICAyNDoJOTMgOTIgODAgMDAgCXdycHIgICVvMiwgJWN3cAotICAyODoJOTUgOTIgYzAgMDAgCXdycHIgICVvMywgJWNhbnNhdmUKLSAgMmM6CTk3IDkzIDAwIDAwIAl3cnByICAlbzQsICVjYW5yZXN0b3JlCi0gIDMwOgk5OSA5MyA0MCAwMCAJd3JwciAgJW81LCAlY2xlYW53aW4KLSAgMzQ6CTliIDkzIDgwIDAwIAl3cnByICAlc3AsICVvdGhlcndpbgotICAzODoJOWQgOTMgYzAgMDAgCXdycHIgICVvNywgJXdzdGF0ZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZkNDUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgVGVzdCB3cnByCi0JLnRleHQKLQl3cnByICVnMSwldHBjCi0Jd3JwciAlZzIsJXRucGMKLQl3cnByICVnMywldHN0YXRlCi0Jd3JwciAlZzQsJXR0Ci0Jd3JwciAlZzUsJXRpY2sKLQl3cnByICVnNiwldGJhCi0Jd3JwciAlZzcsJXBzdGF0ZQotCXdycHIgJW8wLCV0bAotCXdycHIgJW8xLCVwaWwKLQl3cnByICVvMiwlY3dwCi0Jd3JwciAlbzMsJWNhbnNhdmUKLQl3cnByICVvNCwlY2FucmVzdG9yZQotCXdycHIgJW81LCVjbGVhbndpbgotCXdycHIgJW82LCVvdGhlcndpbgotCXdycHIgJW83LCV3c3RhdGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZmNDU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jb2JqZHVtcDogLXIKLSMgbmFtZSA6IGFkZGVuZHMKLS4qOiArZmlsZSBmb3JtYXQgYS5vdXQtc3Vub3MtYmlnCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICAgVFlQRSArVkFMVUUgCi0wKzA4IFdESVNQMjIgK2ZvbzFcKzB4ZitmYwotMCswYyBXRElTUDIyICtmb28xXCsweGYrZjgKLTArMTAgV0RJU1AyMiArZm9vMVwrMHhmK2YwCi0wKzE0IFdESVNQMjIgK2ZvbzFcKzB4ZitlYwotMCsxYyAzMiArZm9vMQotMCsyMCAzMiArZm9vMVwrMHgwKzQKLSMwKzIwIDMyICtmb28xXCsweDArNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdiNDZlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIwotIyBTdW5PUzQgb24gU1BBUkMgdGVzdHMKLSMKLQotaWYgW2lzdGFyZ2V0IHNwYXJjLSotc3Vub3M0Kl0gdGhlbiB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYWRkZW5kIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWIxMDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuZ2xvYmFsIGZvbwotZm9vOgotCW5vcAotCW5vcAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMSsweDQKLQliYSBmb28xCi0JYmEgZm9vMQotCW5vcAotCS53b3JkIGZvbzEKLQkud29yZCBmb28xKzQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RlbXBsYXRlIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGQ3OWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0jCi0jIFRoaXMgaXMgc29ydCBvZiBhIHByb3RvdHlwZSB0ZXN0IGNhc2UsIHdoaWNoIHBhcnNlcyB0aGUgbGlzdGluZyBvdXRwdXQKLSMgZnJvbSB0aGUgYXNzZW1ibGVyLiAgTGF0ZXIsIG1vcmUgcHJvdG90eXBlcyBzaG91bGQgYmUgYWRkZWQgZm9yIGNhc2VzCi0jIHdoZXJlIG9iamR1bXAgZ2V0cyBydW4gb3ZlciB0aGUgLm8gZmlsZSwgYW5kIGFueXRoaW5nIGVsc2UgbGlrZSB0aGF0Li4uCi0jCi0jIFdoZW4geW91IHdyaXRlIGEgdGVzdCBjYXNlIHRoYXQgdXNlcyB0aGUgbGlzdGluZyBvdXRwdXQsIGp1c3QgY29weSB0aGlzCi0jIGZpbGUgKHRyaW1taW5nIGRvd24gdGhlIG92ZXJseS12ZXJib3NlIGNvbW1lbnRzIGEgbGl0dGxlKSwgYW5kCi0jIGFkanVzdCBpdCB0byBkbyB3aGF0IHlvdSBuZWVkLgotIwotIyBSZW1lbWJlciB0aGF0IGFueSAiLmV4cCIgZmlsZSBmb3VuZCBpbiB0aGUgdHJlZSB3aWxsIGJlIHByb2Nlc3NlZCBieQotIyBkZWphZ251LgotCi0jCi0jIEZJUlNUIFNBTVBMRSBURVNUIENBU0UKLSMKLQotcHJvYyBkb19mb28ge30gewotIyBUaGlzIHN0cmluZyBpcyB1c2VkIGJlbG93IHdoZW4gcHJpbnRpbmcgb3V0IGEgc3VjY2VzcyBvciBmYWlsdXJlIG1lc3NhZ2UuCi0jIElmIG1vcmUgdGhhbiBvbmUgdGVzdCBpcyBydW4gYnkgYSBnaXZlbiAuZXhwIGZpbGUsIGl0J2QgYmUgbmljZSB0byBpbmNsdWRlCi0jIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlLgotICAgIHNldCB0ZXN0bmFtZSAiZm9vLnM6IG11bHRpLXJlZ2lzdGVyIHR3ZWFraW5nIGFuZCBmcm9ibmljYXRpb24iCi0KLSMgSSB1c2UgdGhpcyBhcyBhIGZsYWcgdG8gcmVjb3JkIHdoZXRoZXIgdGhlIHRlc3QgY2FzZSBwYXNzZWQuICBJZiB0aGlzCi0jIGZsYWcgaXMgc3RpbGwgY2xlYXIgd2hlbiBFT0YgaXMgcmVhY2hlZCwgdGhpcyB0ZXN0IGZhaWxzLiAgSWYgdGhlcmUgYXJlCi0jIHR3byBvciBtb3JlIHBhdHRlcm5zLCBhbmQgSSBuZWVkIHRvIHNlZSBhbGwgb2YgdGhlbSwgSSdsbCBjcmVhdGUgTiB2YXJpYWJsZXMKLSMgYW5kIGNoZWNrIGlmIHRoZSBzdW0gaXMgTi4KLSAgICBzZXQgeCAwCi0KLSMgQ2FsbCBnYXNfc3RhcnQgd2l0aCB0d28gYXJndW1lbnRzOiBUaGUgaW5wdXQgZmlsZSBuYW1lICh3aGljaCBpdCdsbCBzZWFyY2gKLSMgZm9yIGluICRzcmNkaXIvJHN1YmRpciwgdGhhdCBpcywgdGhlIHNvdXJjZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIC5leHAgZmlsZQotIyBpcyksIGFuZCBhIChwb3NzaWJseSBlbXB0eSkgc3RyaW5nIG9mIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgYXNzZW1ibGVyLgotICAgIGdhc19zdGFydCAiZm9vLnMiICItYWwiCi0KLSMgTm93IEkganVzdCBpdGVyYXRlIG92ZXIgYWxsIHRoZSBvdXRwdXQgbGluZXMsIGxvb2tpbmcgZm9yIHdoYXQgSSB3YW50Ci0jIHRvIHNlZS4gIFNpbmNlIGVhY2ggcGF0dGVybiBleHBsaWNpdGx5IHdpbGwgbm90IHNwYW4gbGluZSBicmVha3MsIHRoZXJlJ3MKLSMgYWxzbyBhIHBhdHRlcm4gZm9yIGxpbmVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55dGhpbmcgZWxzZS4gICAoSXMgaXQgc2FmZSB0bwotIyB1c2UgIi4qIiBmb3IgcGF0dGVybnMgbm90IGNyb3NzaW5nIGxpbmUgYnJlYWtzPyBJIGRvbid0IHRoaW5rICIkIiBkb2VzIHRoZQotIyByaWdodCB0aGluZyBmb3IgdGhhdCwgaW4gYW55IGNhc2UuICBJIHNob3VsZCBjaGVjayBpbnRvIHdoZXRoZXIgdGhlIGV4dHJhCi0jIHBhdHRlcm4gaXMgZXZlbiBuZWVkZWQuCi0KLSMgQXBwYXJlbnRseSBDUkxGIGlzIHJlY2VpdmVkIHdoZW4gdXNpbmcgcHR5cyBmb3Igc3VicHJvY2Vzc2VzOyBoZW5jZSB0aGUKLSMgXHJcbiBmb3IgbWF0Y2hpbmcgbGluZSBudW1iZXIgMy4KLQotIyBOb3RlIHRoYXQgaWYgeW91IHVzZSAieyAuLi4gfSIgZm9yIHRoZSBleHBlY3QgY2xhdXNlLCB5b3UgY2FuJ3QgaGF2ZQotIyBjb21tZW50cyBpbnNpZGUgaXQuCi0KLSMgVGhpcyB0ZXN0IGNhc2UgaXMga2luZGEgYm9ndXMgaW4gdGhhdCBzZWVpbmcgZWl0aGVyIGEgd29yZCBvZiBhbGwgemVyb3MKLSMgYXQgYWRkcmVzcyB6ZXJvIG9yIGEgQy1zdHlsZSBjb21tZW50IG9uIGxpbmUgdGhyZWUgdGhhdCBzYXlzICJMb29raW5nIGZvcgotIyBDIGNvbW1lbnRzIiAod2l0aCB2ZXJ5IHNwZWNpZmljIHB1bmN0dWF0aW9uIGFuZCB3aGl0ZXNwYWNlKSB3aWxsIGNhdXNlCi0jIGl0IHRvIHBhc3MgdGhpcyB0ZXN0LiAgVXN1YWxseSAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMDAwMDBcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkgICAgLXJlICJeICszXFsgXHRcXSsvLiBMb29raW5nIGZvciBDIGNvbW1lbnRzLiAuL1xyXG4iCXsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0IGlzbid0Ci0jIG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiAkeCB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0jIE5vdyBhY3R1YWxseSBydW4gdGhlIHRlc3QuICBJdCBjYW4gYmUgY29uZGl0aW9uYWxpemVkIGlmIHRoZSB0ZXN0IGlzCi0jIG5vdCBhcHByb3ByaWF0ZSBmb3IgYWxsIHRhcmdldHMuICBUaGUgcHJvYyAiaXN0YXJnZXQiIGNoZWNrcyBhIGdlbmVyYWxpemVkCi0jIGZvcm0gb2YgdGhlIHRhcmdldCBuYW1lLCBzbyB0aGF0IChlLmcuKSAibTY4MzMyLXVua25vd24tYW91dCIgd291bGQgbWF0Y2gKLSMgaGVyZS4gIFNvIGZhciwgSSB0aGluayBvbmx5IHRoZSBDUFUgbmFtZSBpcyBhY3R1YWxseSBldmVyIGFsdGVyZWQuCi1pZiBbaXN0YXJnZXQgbTY4ay0qXSB0aGVuIHsKLSAgICBkb19mb28KLX0KLQotCi0KLQotIwotIyBTRUNPTkQgU0FNUExFIFRFU1QgQ0FTRQotIwotCi0jIFRoaXMgaXMgYSB0aW55IGJpdCBsaWtlIHRoZSBDIGNvbXBpbGVyIHRvcnR1cmUgdGVzdHMsIGluIHRoYXQgaXQnbGwgcnVuCi0jIHRoZSBhc3NlbWJsZXIgd2l0aCB0aGUgcG93ZXIgc2V0IG9mIHRoZSBsaXN0IG9mIG9wdGlvbnMgc3VwcGxpZWQuCi0jCi0jIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgdGVzdCBmaWxlIG5hbWU7IHRoZSBzZWNvbmQgaXMgYXJndW1lbnRzIHRoYXQKLSMgYXJlIGFsd2F5cyB0byBiZSBwcm92aWRlZDsgdGhlIHRoaXJkIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9ucwotIyB3aGljaCBhcmUgb3B0aW9uYWwgKGVuZGluZyBpbiAiPiIgaWYgb3V0cHV0IHNob3VsZCBiZSBpZ25vcmVkLCBsaWtlICItYT4iKTsKLSMgdGhlIGZvdXJ0aCBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdC4gIFNvIGZhciwgb25seSBiaW5hcnkgb3B0aW9ucyBhcmUgaGFuZGxlZAotIyB0aGlzIHdheTsgTi13YXkgb3B0aW9ucyAobGlrZSBDUFUgdHlwZSBmb3IgbTY4aykgYXJlbid0IGhhbmRsZWQgeWV0LgotIwotIyBUaGUgdmFyaWFibGUgJHN0ZG9wdGxpc3QgdXN1YWxseSBoYXMgYSByZWFzb25hYmxlIHNldCBvZiBvcHRpb25hbCBvcHRpb25zCi0jIGZvciB0aGlzIHRhcmdldC4KLQotIyBObywgUElDIGlzbid0IHN1cHBvcnRlZCB5ZXQuICBUaGlzIGlzIG9ubHkgYW4gZXhhbXBsZS4KLWdhc190ZXN0ICJxdXV4LnMiICItSyIgJHN0ZG9wdGxpc3QgInVzZSBvZiBxdXV4ZXMgaW4gUElDIG1vZGUiCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGVjNzA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgc2lnbmVkIGFuZCB1bnNpZ25lZCBhZGQgaW5zdHJ1Y3Rpb25zCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwYSAwMCBmYiA2Mi4qCi0gICA0OglmZiAzZiBhYyAyMC4qCi0gICA4OgkwMCA0MCAyYyAyMS4qCi0gICBjOgkwMCAxMCA3YiAzMSAwMCA0MCAwMCAwMC4qCi0gIDE0OgkwMCAxMCBmYiA0MSBmZiBiZiBmZiBmZi4qCi0gIDFjOgkwMCAxMCBiYiA1YSBmZiBmZiBmZiA3Zi4qCi0gIDI0OgkwMCAxMCAzYiA2YiAwMCAwMCAwMCA4MC4qCi0gIDJjOgkwYSAyMCBmYiA2Mi4qCi0gIDMwOglmZiBiZiBhYyAyMC4qCi0gIDM0OgkwMCBjMCAyYyAyMS4qCi0gIDM4OgkwMCAzMCA3YiAzMSAwMCA0MCAwMCAwMC4qCi0gIDQwOgkwMCAzMCBmYiA0MSBmZiBiZiBmZiBmZi4qCi0gIDQ4OgkwMCAzMCBiYiA1YSBmZiBmZiBmZiA3Zi4qCi0gIDUwOgkwMCAzMCAzYiA2YiAwMCAwMCAwMCA4MC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyYjM2OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDIwOjEzOjMzIDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYWRkLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDsgVGVzdCBzaWduZWQgYW5kIHVuc2lnbmVkIGFkZGl0aW9uIGluc3RydWN0aW9uLgotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOyBUZXN0IGJvdW5kYXJ5IGNvbmRpdGlvbnMgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZy4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDsgTm90ZSB0aGF0IHVuc2lnbmVkIGFkZGl0aW9uIHN0aWxsIHVzZXMgc2lnbmVkIGltbWVkaWF0ZXMuCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNSAwMDAwMDAwMCAgIDYyRkIwMDBBICAgICAgICAgYWRkICAgICByMTAscjExLHIxMiAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNiAwMDAwMDAwNCAgIDIwQUMzRkZGICAgICAgICAgYWRkICAgICAxNjM4MyxyMixyNCAgICAgICAgICAgICA7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICA3IDAwMDAwMDA4ICAgMjEyQzQwMDAgICAgICAgICBhZGQgICAgIC0xNjM4NCxyNCxyNCAgICAgICAgICAgIDsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgIDggMDAwMDAwMEMgICAzMTdCMTAwMCAgICAgICAgIGFkZCAgICAgMTYzODQscjUscjYgICAgICAgICAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDEwICAgMDAwMDQwMDAgCi0gICAgICAgIDkgMDAwMDAwMTQgICA0MUZCMTAwMCAgICAgICAgIGFkZCAgICAgLTE2Mzg1LHI3LHI4ICAgICAgICAgICAgOyBNYXhpbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAxOCAgIEZGRkZCRkZGIAotICAgICAgIDEwIDAwMDAwMDFDICAgNUFCQjEwMDAgICAgICAgICBhZGQgICAgIDIxNDc0ODM2NDcscjEwLHIxMSAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAyMCAgIDdGRkZGRkZGIAotICAgICAgIDExIDAwMDAwMDI0ICAgNkIzQjEwMDAgICAgICAgICBhZGQgICAgIC0yMTQ3NDgzNjQ4LHIxMixyMTMgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAyOCAgIDgwMDAwMDAwIAotICAgICAgIDEyICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTMgMDAwMDAwMkMgICA2MkZCMjAwQSAgICAgICAgIGFkZHUgICAgcjEwLHIxMSxyMTIgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTQgMDAwMDAwMzAgICAyMEFDQkZGRiAgICAgICAgIGFkZHUgICAgMTYzODMscjIscjQgICAgICAgICAgICAgOyBNYXhpbXVtIHBvc2l0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAxNSAwMDAwMDAzNCAgIDIxMkNDMDAwICAgICAgICAgYWRkdSAgICAtMTYzODQscjQscjQgICAgICAgICAgICA7IE1pbmltdW0gbmVnYXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgIDE2IDAwMDAwMDM4ICAgMzE3QjMwMDAgICAgICAgICBhZGR1ICAgIDE2Mzg0LHI1LHI2ICAgICAgICAgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAzQyAgIDAwMDA0MDAwIAotICAgICAgIDE3IDAwMDAwMDQwICAgNDFGQjMwMDAgICAgICAgICBhZGR1ICAgIC0xNjM4NSxyNyxyOCAgICAgICAgICAgIDsgTWF4aW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNDQgICBGRkZGQkZGRiAKLSAgICAgICAxOCAwMDAwMDA0OCAgIDVBQkIzMDAwICAgICAgICAgYWRkdSAgICAyMTQ3NDgzNjQ3LHIxMCxyMTEgICAgICA7IE1heGltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNEMgICA3RkZGRkZGRiAKLSAgICAgICAxOSAwMDAwMDA1MCAgIDZCM0IzMDAwICAgICAgICAgYWRkdSAgICAtMjE0NzQ4MzY0OCxyMTIscjEzICAgICA7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNTQgICA4MDAwMDAwMCAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzIyOWVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotOyBUZXN0IHNpZ25lZCBhbmQgdW5zaWduZWQgYWRkaXRpb24gaW5zdHJ1Y3Rpb24uCi07IFRlc3QgYm91bmRhcnkgY29uZGl0aW9ucyB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nLgotOyBOb3RlIHRoYXQgdW5zaWduZWQgYWRkaXRpb24gc3RpbGwgdXNlcyBzaWduZWQgaW1tZWRpYXRlcy4KLQotCWFkZAlyMTAscjExLHIxMgkJOyBSZWdpc3RlciBmb3JtCi0JYWRkCTE2MzgzLHIyLHI0CQk7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAktMTYzODQscjQscjQJCTsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCTE2Mzg0LHI1LHI2CQk7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCS0xNjM4NSxyNyxyOAkJOyBNYXhpbXVtIG5lZ2F0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAkyMTQ3NDgzNjQ3LHIxMCxyMTEJOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAktMjE0NzQ4MzY0OCxyMTIscjEzCTsgTWluaW11bSBuZWdhdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLQotCWFkZHUJcjEwLHIxMSxyMTIJCTsgUmVnaXN0ZXIgZm9ybQotCWFkZHUJMTYzODMscjIscjQJCTsgTWF4aW11bSBwb3NpdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQktMTYzODQscjQscjQJCTsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQkxNjM4NCxyNSxyNgkJOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZHUJLTE2Mzg1LHI3LHI4CQk7IE1heGltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQkyMTQ3NDgzNjQ3LHIxMCxyMTEJOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZHUJLTIxNDc0ODM2NDgscjEyLHIxMwk7IE1pbmltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmOTYxMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgLmFsaWduIHBzZXVkbyBvcAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJYWIgMDAgMDAgMDAuKgotICAgNDoJY2QgMDAgZWYgMDAuKgotICAgODoJZjEgMDAgMDAgMDAuKgotICAgYzoJZWUgMDAgMDAgMDAuKgotICAxMDoJYWMgMDAgMDAgMDAuKgotICAxNDoJMDAgMDAgMDAgMDAuKgotICAxODoJYWIgMDAgMDAgMDAuKgotICAxYzoJMDAgMDAgMDAgMDAuKgotICAyMDoJZmUgMDAgMDAgMDAuKgotCVwuXC5cLgotICAzMDoJZGUgYWQgYmUgZWYuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTU0MTVhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgVGh1IEZlYiAyNyAxNzowMjoyMyAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWFsaWduLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyAgICAgIFRlc3QgdGhlIC5hbGlnbiBkaXJlY3RpdmUuCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgMyAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgLnRleHQKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAKLSAgICAgICAgNiAwMDAwMDAwMCAgIEFCICAgICAgICAgICAgICAgLmJ5dGUgICAweEFCCi0gICAgICAgIDcgMDAwMDAwMDEgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgICAgICAgICAgICAgICAgIDsgU2hvdWxkIGRlZmF1bHQgdG8gNCBieXRlIGFsaWdubWVudAotICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4Q0QwMEVGMDAKLSAgICAgICAxMCAwMDAwMDAwNCAgIENEICAgICAgICAgICAgICAgLmJ5dGUgICAweENECi0gICAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMiAgICAgICAgICAgICAgIDsgIFNob3VsZCBhbGlnbiB0byB0aGUgbmV4dCAyLWJ5dGUgYm91bmRhcnkgKHBhZCB3aXRoIG9uZSBudWxsIGJ5dAotICAgICAgIDEyIDAwMDAwMDA2ICAgRUYgICAgICAgICAgICAgICAuYnl0ZSAgIDB4RUYKLSAgICAgICAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduICAxCi0gICAgICAgMTQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhGMTAwMDAwMAotICAgICAgIDE2IDAwMDAwMDA3ICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDQgICAgICAgICAgICAgICA7ICBTaG91bGQgbm90IGFmZmVjdCBhbGlnbm1lbnQgKGFscmVhZHkgb24gNCkKLSAgICAgICAxNyAwMDAwMDAwOCAgIEYxICAgICAgICAgICAgICAgLmJ5dGUgICAweEYxCi0gICAgICAgMTggMDAwMDAwMDkgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgNCAgICAgICAgICAgICAgIDsgIFNob3VsZCBhbGlnbiB0byBuZXh0IDQgYnl0ZSBib3VuZGFyeQotICAgICAgIDE5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RUUwMDAwMDAgc2luY2Ugd2UgYXJlIGFscmVhZHkgb24gNCBieXRlIGFsaWdubWVudAotICAgICAgIDIxIDAwMDAwMDBDICAgRUUgICAgICAgICAgICAgICAuYnl0ZSAweEVFCi0gICAgICAgMjIgMDAwMDAwMEQgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgOAotICAgICAgIDIzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUMwMDAwMDAgMHgwMDAwMDAwMAotICAgICAgIDI1IDAwMDAwMDEwICAgQUMgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUMKLSAgICAgICAyNiAwMDAwMDAxMSAgICAgICAgICAgICAgICAgICAgLmFsaWduICA4Ci0gICAgICAgMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFCMDAwMDAwIDB4MDAwMDAwMDAgc2luY2Ugd2UgYXJlIGF0IDggYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAyOSAwMDAwMDAxOCAgIEFCICAgICAgICAgICAgICAgLmJ5dGUgICAweEFCCi0gICAgICAgMzAgMDAwMDAwMTkgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMTYKLSAgICAgICAzMSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEZFMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwCi0gICAgICAgMzMgMDAwMDAwMjAgICBGRSAgICAgICAgICAgICAgIC5ieXRlICAgMHhGRQotICAgICAgIDM0IDAwMDAwMDIxICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDE2Ci0gICAgICAgMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIGp1c3QgZm9yY2VzIHRoZSBkaXNhc3NlbWJsZXIgdG8gbm90IHByaW50IC4uLiBmb3IgdHJhaWxpbmcgbnVsbHMKLSAgICAgICAzNyAwMDAwMDAzMCAgIERFICAgICAgICAgICAgICAgLmJ5dGUgMHhERSwgMHhBRCwgMHhCRSwgMHhFRgotICAgICAgICAgIDAwMDAwMDMxICAgQUQgICAgICAgCi0gICAgICAgICAgMDAwMDAwMzIgICBCRSAgICAgICAKLSAgICAgICAgICAwMDAwMDAzMyAgIEVGICAgICAgIAotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMxMjU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi07OwlUZXN0IHRoZSAuYWxpZ24gZGlyZWN0aXZlLgotCi0JLnRleHQKLQkKLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFCMDAwMDAwCi0JLmJ5dGUJMHhBQgotCS5hbGlnbgkJCTsgU2hvdWxkIGRlZmF1bHQgdG8gNCBieXRlIGFsaWdubWVudAotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhDRDAwRUYwMAotCS5ieXRlCTB4Q0QKLQkuYWxpZ24JMgkJOyAgU2hvdWxkIGFsaWduIHRvIHRoZSBuZXh0IDItYnl0ZSBib3VuZGFyeSAocGFkIHdpdGggb25lIG51bGwgYnl0ZSkKLQkuYnl0ZQkweEVGCi0JLmFsaWduCTEKLQotCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RjEwMDAwMDAKLQkuYWxpZ24JNAkJOyAgU2hvdWxkIG5vdCBhZmZlY3QgYWxpZ25tZW50IChhbHJlYWR5IG9uIDQpCi0JLmJ5dGUJMHhGMQotCS5hbGlnbgk0CQk7ICBTaG91bGQgYWxpZ24gdG8gbmV4dCA0IGJ5dGUgYm91bmRhcnkKLQotCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RUUwMDAwMDAgc2luY2Ugd2UgYXJlIGFscmVhZHkgb24gNCBieXRlIGFsaWdubWVudAotCS5ieXRlIDB4RUUKLQkuYWxpZ24JOAotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQzAwMDAwMCAweDAwMDAwMDAwCi0JLmJ5dGUJMHhBQwotCS5hbGlnbgk4Ci0JCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQjAwMDAwMCAweDAwMDAwMDAwIHNpbmNlIHdlIGFyZSBhdCA4IGJ5dGUgYWxpZ25tZW50Ci0JLmJ5dGUJMHhBQgotCS5hbGlnbgkxNgotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhGRTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMAotCS5ieXRlCTB4RkUKLQkuYWxpZ24JMTYKLQkKLQk7OyBUaGlzIGp1c3QgZm9yY2VzIHRoZSBkaXNhc3NlbWJsZXIgdG8gbm90IHByaW50IC4uLiBmb3IgdHJhaWxpbmcgbnVsbHMKLQkuYnl0ZSAweERFLCAweEFELCAweEJFLCAweEVGCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2FlZThiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5kCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgY292ZXJhZ2Ugb2Ygc3ltYm9saWMgQklUTlVNIHZhbHVlcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMGEgNDAgMzkgZmEuKgotICAgNDoJMGEgNDAgMzkgZjIuKgotICAgODoJMGEgNDAgMzkgZWEuKgotICAgYzoJMGEgNDAgMzkgZTIuKgotICAxMDoJMGEgNDAgMzkgZGEuKgotICAxNDoJMGEgNDAgMzkgZDIuKgotICAxODoJMGEgNDAgMzkgY2EuKgotICAxYzoJMGEgNDAgMzkgYzIuKgotICAyMDoJMGEgNDAgMzkgYmEuKgotICAyNDoJMGEgNDAgMzkgYjIuKgotICAyODoJMGEgNDAgMzkgYWEuKgotICAyYzoJMGEgNDAgMzkgYTIuKgotICAzMDoJMGEgNDAgMzkgOWEuKgotICAzNDoJMGEgNDAgMzkgOTIuKgotICAzODoJMGEgNDAgMzkgOGEuKgotICAzYzoJMGEgNDAgMzkgODIuKgotICA0MDoJMGEgNDAgMzkgN2EuKgotICA0NDoJMGEgNDAgMzkgNzIuKgotICA0ODoJMGEgNDAgMzkgNmEuKgotICA0YzoJMGEgNDAgMzkgNjIuKgotICA1MDoJMGEgNDAgMzkgNWEuKgotICA1NDoJMGEgNDAgMzkgNTIuKgotICA1ODoJMGEgNDAgMzkgNGEuKgotICA1YzoJMGEgNDAgMzkgNDIuKgotICA2MDoJMGEgNDAgMzkgM2EuKgotICA2NDoJMGEgNDAgMzkgMzIuKgotICA2ODoJMGEgNDAgMzkgMmEuKgotICA2YzoJMGEgNDAgMzkgMjIuKgotICA3MDoJMGEgNDAgMzkgMWEuKgotICA3NDoJMGEgNDAgMzkgMTIuKgotICA3ODoJMGEgNDAgMzkgNWEuKgotICA3YzoJMGEgNDAgMzkgNTIuKgotICA4MDoJMGEgNDAgMzkgNGEuKgotICA4NDoJMGEgNDAgMzkgNDIuKgotICA4ODoJMGEgNDAgMzkgM2EuKgotICA4YzoJMGEgNDAgMzkgMzIuKgotICA5MDoJMGEgNDAgMzkgMmEuKgotICA5NDoJMGEgNDAgMzkgMjIuKgotICA5ODoJMGEgNDAgMzkgMWEuKgotICA5YzoJMGEgNDAgMzkgMTIuKgotICBhMDoJMGEgNDAgMzkgMGEuKgotICBhNDoJMGEgNDAgMzkgMDIuKgotICBhODoJMGEgNDAgMzkgZmEuKgotICBhYzoJMGEgNDAgMzkgZjIuKgotICBiMDoJMGEgNDAgMzkgZWEuKgotICBiNDoJMGEgNDAgMzkgZTIuKgotICBiODoJMGEgNDAgMzkgZGEuKgotICBiYzoJMGEgNDAgMzkgZDIuKgotICBjMDoJMGEgNDAgMzkgY2EuKgotICBjNDoJMGEgNDAgMzkgYzIuKgotICBjODoJMGEgNDAgMzkgYmEuKgotICBjYzoJMGEgNDAgMzkgYjIuKgotICBkMDoJMGEgNDAgMzkgYWEuKgotICBkNDoJMGEgNDAgMzkgYTIuKgotICBkODoJMGEgNDAgMzkgOWEuKgotICBkYzoJMGEgNDAgMzkgOTIuKgotICBlMDoJMGEgNDAgMzkgOGEuKgotICBlNDoJMGEgNDAgMzkgODIuKgotICBlODoJMGEgNDAgMzkgN2EuKgotICBlYzoJMGEgNDAgMzkgNzIuKgotICBmMDoJMGEgNDAgMzkgNmEuKgotICBmNDoJMGEgNDAgMzkgNjIuKgotICBmODoJMGEgNDAgMzkgNWEuKgotICBmYzoJMGEgNDAgMzkgNTIuKgotIDEwMDoJMGEgNDAgMzkgNGEuKgotIDEwNDoJMGEgNDAgMzkgNDIuKgotIDEwODoJMGEgNDAgMzkgM2EuKgotIDEwYzoJMGEgNDAgMzkgMzIuKgotIDExMDoJMGEgNDAgMzkgMmEuKgotIDExNDoJMGEgNDAgMzkgMjIuKgotIDExODoJMGEgNDAgMzkgMWEuKgotIDExYzoJMGEgNDAgMzkgMTIuKgotIDEyMDoJMGEgNDAgMzkgMGEuKgotIDEyNDoJMGEgNDAgMzkgMDIuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzI2OGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU2F0IEZlYiAyMiAyMTozNzoxNSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWJpdG51bS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgdGhlIEJJVE5VTSBmaWVsZAotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbwotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaXNhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcywgYW5kCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICA7OyB0aGF0IHRoZSByYXcgbnVtZXJpYyB2YWx1ZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5IChzdG9yZWQgYXMKLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgIDs7IHRoZSBvbmUncyBjb21wbGVtZW50IG9mIHRoZSBvcGVyYW5kIG51bWVyaWMgdmFsdWUuCi0gICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNyAwMDAwMDAwMCAgIEZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEuYiAgICAgOyAofjAgJiAweDFGKQotICAgICAgICA4IDAwMDAwMDA0ICAgRjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS5iICAgICA7ICh+MSAmIDB4MUYpCi0gICAgICAgIDkgMDAwMDAwMDggICBFQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmIgICAgIDsgKH4yICYgMHgxRikKLSAgICAgICAxMCAwMDAwMDAwQyAgIEUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUuYiAgICAgOyAofjMgJiAweDFGKQotICAgICAgIDExIDAwMDAwMDEwICAgREEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC5iICAgICA7ICh+NCAmIDB4MUYpCi0gICAgICAgMTIgMDAwMDAwMTQgICBEMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmIgICAgIDsgKH41ICYgMHgxRikKLSAgICAgICAxMyAwMDAwMDAxOCAgIENBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkuYiAgICAgOyAofjYgJiAweDFGKQotICAgICAgIDE0IDAwMDAwMDFDICAgQzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxscy5iICAgICA7ICh+NyAmIDB4MUYpCi0gICAgICAgMTUgMDAwMDAwMjAgICBCQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxvLmIgICAgIDsgKH44ICYgMHgxRikKLSAgICAgICAxNiAwMDAwMDAyNCAgIEIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMuYiAgICAgOyAofjkgJiAweDFGKQotICAgICAgIDE3ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTggMDAwMDAwMjggICBBQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGVxLmggICAgIDsgKH4xMCAmIDB4MUYpCi0gICAgICAgMTkgMDAwMDAwMkMgICBBMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmggICAgIDsgKH4xMSAmIDB4MUYpCi0gICAgICAgMjAgMDAwMDAwMzAgICA5QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmggICAgIDsgKH4xMiAmIDB4MUYpCi0gICAgICAgMjEgMDAwMDAwMzQgICA5MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxlLmggICAgIDsgKH4xMyAmIDB4MUYpCi0gICAgICAgMjIgMDAwMDAwMzggICA4QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmggICAgIDsgKH4xNCAmIDB4MUYpCi0gICAgICAgMjMgMDAwMDAwM0MgICA4MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmggICAgIDsgKH4xNSAmIDB4MUYpCi0gICAgICAgMjQgMDAwMDAwNDAgICA3QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGhpLmggICAgIDsgKH4xNiAmIDB4MUYpCi0gICAgICAgMjUgMDAwMDAwNDQgICA3MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxzLmggICAgIDsgKH4xNyAmIDB4MUYpCi0gICAgICAgMjYgMDAwMDAwNDggICA2QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxvLmggICAgIDsgKH4xOCAmIDB4MUYpCi0gICAgICAgMjcgMDAwMDAwNEMgICA2MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGhzLmggICAgIDsgKH4xOSAmIDB4MUYpCi0gICAgICAgMjggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyOSAwMDAwMDA1MCAgIDVBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEudyAgICAgOyAofjIwICYgMHgxRikKLSAgICAgICAzMCAwMDAwMDA1NCAgIDUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbmUudyAgICAgOyAofjIxICYgMHgxRikKLSAgICAgICAzMSAwMDAwMDA1OCAgIDRBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QudyAgICAgOyAofjIyICYgMHgxRikKLSAgICAgICAzMiAwMDAwMDA1QyAgIDQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUudyAgICAgOyAofjIzICYgMHgxRikKLSAgICAgICAzMyAwMDAwMDA2MCAgIDNBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHQudyAgICAgOyAofjI0ICYgMHgxRikKLSAgICAgICAzNCAwMDAwMDA2NCAgIDMyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UudyAgICAgOyAofjI1ICYgMHgxRikKLSAgICAgICAzNSAwMDAwMDA2OCAgIDJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkudyAgICAgOyAofjI2ICYgMHgxRikKLSAgICAgICAzNiAwMDAwMDA2QyAgIDIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHMudyAgICAgOyAofjI3ICYgMHgxRikKLSAgICAgICAzNyAwMDAwMDA3MCAgIDFBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8udyAgICAgOyAofjI4ICYgMHgxRikKLSAgICAgICAzOCAwMDAwMDA3NCAgIDEyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMudyAgICAgOyAofjI5ICYgMHgxRikKLSAgICAgICAzOSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDQwIDAwMDAwMDc4ICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS5mICAgICA7ICh+MjAgJiAweDFGKQotICAgICAgIDQxIDAwMDAwMDdDICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS5mICAgICA7ICh+MjEgJiAweDFGKQotICAgICAgIDQyIDAwMDAwMDgwICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxndC5mICAgICA7ICh+MjIgJiAweDFGKQotICAgICAgIDQzIDAwMDAwMDg0ICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS5mICAgICA7ICh+MjMgJiAweDFGKQotICAgICAgIDQ0IDAwMDAwMDg4ICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC5mICAgICA7ICh+MjQgJiAweDFGKQotICAgICAgIDQ1IDAwMDAwMDhDICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxnZS5mICAgICA7ICh+MjUgJiAweDFGKQotICAgICAgIDQ2IDAwMDAwMDkwICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvdS5mICAgICA7ICh+MjYgJiAweDFGKQotICAgICAgIDQ3IDAwMDAwMDk0ICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxpbi5mICAgICA7ICh+MjcgJiAweDFGKQotICAgICAgIDQ4IDAwMDAwMDk4ICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxpYi5mICAgICA7ICh+MjggJiAweDFGKQotICAgICAgIDQ5IDAwMDAwMDlDICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvYi5mICAgICA7ICh+MjkgJiAweDFGKQotICAgICAgIDUwIDAwMDAwMEEwICAgMEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCx1by5mICAgICA7ICh+MzAgJiAweDFGKQotICAgICAgIDUxIDAwMDAwMEE0ICAgMDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvci5mICAgICA7ICh+MzEgJiAweDFGKQotICAgICAgIDUyICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgNTMgMDAwMDAwQTggICBGQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDAKLSAgICAgICA1NCAwMDAwMDBBQyAgIEYyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMQotICAgICAgIDU1IDAwMDAwMEIwICAgRUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTYXQgRmViIDIyIDIxOjM3OjE1IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYml0bnVtLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICA1NiAwMDAwMDBCNCAgIEUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMwotICAgICAgIDU3IDAwMDAwMEI4ICAgREEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw0Ci0gICAgICAgNTggMDAwMDAwQkMgICBEMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDUKLSAgICAgICA1OSAwMDAwMDBDMCAgIENBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsNgotICAgICAgIDYwIDAwMDAwMEM0ICAgQzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw3Ci0gICAgICAgNjEgMDAwMDAwQzggICBCQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDgKLSAgICAgICA2MiAwMDAwMDBDQyAgIEIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsOQotICAgICAgIDYzIDAwMDAwMEQwICAgQUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMAotICAgICAgIDY0IDAwMDAwMEQ0ICAgQTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMQotICAgICAgIDY1IDAwMDAwMEQ4ICAgOUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMgotICAgICAgIDY2IDAwMDAwMERDICAgOTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMwotICAgICAgIDY3IDAwMDAwMEUwICAgOEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNAotICAgICAgIDY4IDAwMDAwMEU0ICAgODIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNQotICAgICAgIDY5IDAwMDAwMEU4ICAgN0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNgotICAgICAgIDcwIDAwMDAwMEVDICAgNzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNwotICAgICAgIDcxIDAwMDAwMEYwICAgNkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxOAotICAgICAgIDcyIDAwMDAwMEY0ICAgNjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxOQotICAgICAgIDczIDAwMDAwMEY4ICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMAotICAgICAgIDc0IDAwMDAwMEZDICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMQotICAgICAgIDc1IDAwMDAwMTAwICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMgotICAgICAgIDc2IDAwMDAwMTA0ICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMwotICAgICAgIDc3IDAwMDAwMTA4ICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNAotICAgICAgIDc4IDAwMDAwMTBDICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNQotICAgICAgIDc5IDAwMDAwMTEwICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNgotICAgICAgIDgwIDAwMDAwMTE0ICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNwotICAgICAgIDgxIDAwMDAwMTE4ICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyOAotICAgICAgIDgyIDAwMDAwMTFDICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyOQotICAgICAgIDgzIDAwMDAwMTIwICAgMEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzMAotICAgICAgIDg0IDAwMDAwMTI0ICAgMDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzMQotICAgICAgIDg1ICAgICAgICAgICAgICAgICAgICAgCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyNmUwNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgQklUTlVNIGZpZWxkCi07OyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuICBBbHNvCi07OyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLCBhbmQKLTs7IHRoYXQgdGhlIHJhdyBudW1lcmljIHZhbHVlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgKHN0b3JlZCBhcwotOzsgdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIG9wZXJhbmQgbnVtZXJpYyB2YWx1ZS4KLQotCWJibwlyMTAscjgsZXEuYgk7ICh+MCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxuZS5iCTsgKH4xICYgMHgxRikKLQliYm8JcjEwLHI4LGd0LmIJOyAofjIgJiAweDFGKQotCWJibwlyMTAscjgsbGUuYgk7ICh+MyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsdC5iCTsgKH40ICYgMHgxRikKLQliYm8JcjEwLHI4LGdlLmIJOyAofjUgJiAweDFGKQotCWJibwlyMTAscjgsaGkuYgk7ICh+NiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxscy5iCTsgKH43ICYgMHgxRikKLQliYm8JcjEwLHI4LGxvLmIJOyAofjggJiAweDFGKQotCWJibwlyMTAscjgsaHMuYgk7ICh+OSAmIDB4MUYpCi0KLQliYm8JcjEwLHI4LGVxLmgJOyAofjEwICYgMHgxRikKLQliYm8JcjEwLHI4LG5lLmgJOyAofjExICYgMHgxRikKLQliYm8JcjEwLHI4LGd0LmgJOyAofjEyICYgMHgxRikKLQliYm8JcjEwLHI4LGxlLmgJOyAofjEzICYgMHgxRikKLQliYm8JcjEwLHI4LGx0LmgJOyAofjE0ICYgMHgxRikKLQliYm8JcjEwLHI4LGdlLmgJOyAofjE1ICYgMHgxRikKLQliYm8JcjEwLHI4LGhpLmgJOyAofjE2ICYgMHgxRikKLQliYm8JcjEwLHI4LGxzLmgJOyAofjE3ICYgMHgxRikKLQliYm8JcjEwLHI4LGxvLmgJOyAofjE4ICYgMHgxRikKLQliYm8JcjEwLHI4LGhzLmgJOyAofjE5ICYgMHgxRikKLQotCWJibwlyMTAscjgsZXEudwk7ICh+MjAgJiAweDFGKQotCWJibwlyMTAscjgsbmUudwk7ICh+MjEgJiAweDFGKQotCWJibwlyMTAscjgsZ3Qudwk7ICh+MjIgJiAweDFGKQotCWJibwlyMTAscjgsbGUudwk7ICh+MjMgJiAweDFGKQotCWJibwlyMTAscjgsbHQudwk7ICh+MjQgJiAweDFGKQotCWJibwlyMTAscjgsZ2Uudwk7ICh+MjUgJiAweDFGKQotCWJibwlyMTAscjgsaGkudwk7ICh+MjYgJiAweDFGKQotCWJibwlyMTAscjgsbHMudwk7ICh+MjcgJiAweDFGKQotCWJibwlyMTAscjgsbG8udwk7ICh+MjggJiAweDFGKQotCWJibwlyMTAscjgsaHMudwk7ICh+MjkgJiAweDFGKQotCi0JYmJvCXIxMCxyOCxlcS5mCTsgKH4yMCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxuZS5mCTsgKH4yMSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxndC5mCTsgKH4yMiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsZS5mCTsgKH4yMyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsdC5mCTsgKH4yNCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxnZS5mCTsgKH4yNSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvdS5mCTsgKH4yNiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxpbi5mCTsgKH4yNyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxpYi5mCTsgKH4yOCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvYi5mCTsgKH4yOSAmIDB4MUYpCi0JYmJvCXIxMCxyOCx1by5mCTsgKH4zMCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvci5mCTsgKH4zMSAmIDB4MUYpCi0KLQliYm8JcjEwLHI4LDAKLQliYm8JcjEwLHI4LDEKLQliYm8JcjEwLHI4LDIKLQliYm8JcjEwLHI4LDMKLQliYm8JcjEwLHI4LDQKLQliYm8JcjEwLHI4LDUKLQliYm8JcjEwLHI4LDYKLQliYm8JcjEwLHI4LDcKLQliYm8JcjEwLHI4LDgKLQliYm8JcjEwLHI4LDkKLQliYm8JcjEwLHI4LDEwCi0JYmJvCXIxMCxyOCwxMQotCWJibwlyMTAscjgsMTIKLQliYm8JcjEwLHI4LDEzCi0JYmJvCXIxMCxyOCwxNAotCWJibwlyMTAscjgsMTUKLQliYm8JcjEwLHI4LDE2Ci0JYmJvCXIxMCxyOCwxNwotCWJibwlyMTAscjgsMTgKLQliYm8JcjEwLHI4LDE5Ci0JYmJvCXIxMCxyOCwyMAotCWJibwlyMTAscjgsMjEKLQliYm8JcjEwLHI4LDIyCi0JYmJvCXIxMCxyOCwyMwotCWJibwlyMTAscjgsMjQKLQliYm8JcjEwLHI4LDI1Ci0JYmJvCXIxMCxyOCwyNgotCWJibwlyMTAscjgsMjcKLQliYm8JcjEwLHI4LDI4Ci0JYmJvCXIxMCxyOCwyOQotCWJibwlyMTAscjgsMzAKLQliYm8JcjEwLHI4LDMxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEzOGFhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBjb3ZlcmFnZSBvZiBzeW1ib2xpYyBjb25kaXRpb24gY29kZSB2YWx1ZXMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTA3IGEwIDc5IDAxLioKLSAgIDQ6CTA3IGEwIDc5IDA5LioKLSAgIDg6CTA3IGEwIDc5IDExLioKLSAgIGM6CTA3IGEwIDc5IDE5LioKLSAgMTA6CTA3IGEwIDc5IDIxLioKLSAgMTQ6CTA3IGEwIDc5IDI5LioKLSAgMTg6CTA3IGEwIDc5IDMxLioKLSAgMWM6CTA3IGEwIDc5IDM5LioKLSAgMjA6CTA3IGEwIDc5IDQxLioKLSAgMjQ6CTA3IGEwIDc5IDQ5LioKLSAgMjg6CTA3IGEwIDc5IDUxLioKLSAgMmM6CTA3IGEwIDc5IDU5LioKLSAgMzA6CTA3IGEwIDc5IDYxLioKLSAgMzQ6CTA3IGEwIDc5IDY5LioKLSAgMzg6CTA3IGEwIDc5IDcxLioKLSAgM2M6CTA3IGEwIDc5IDc5LioKLSAgNDA6CTA3IGEwIDc5IDgxLioKLSAgNDQ6CTA3IGEwIDc5IDg5LioKLSAgNDg6CTA3IGEwIDc5IDkxLioKLSAgNGM6CTA3IGEwIDc5IDk5LioKLSAgNTA6CTA3IGEwIDc5IGExLioKLSAgNTQ6CTA3IGEwIDc5IGE5LioKLSAgNTg6CTA3IGEwIDc5IGIxLioKLSAgNWM6CTA3IGEwIDc5IGI5LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMzUxYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6NDkgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1jY29kZS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGVzdCB0aGF0IGFsbCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMgZm9yIHRoZSBjb25kaXRpb24KLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IGNvZGVzIGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7ICBBbHNvIHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlzYXNzZW1ibGVkIGNvcnJlY3RseSBhcyBzeW1ib2xpY3MuCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNSAwMDAwMDAwMCAgIDAxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZXYuYiAgICAgICAgICAgICA7IDAwMDAwCi0gICAgICAgIDYgMDAwMDAwMDQgICAwOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ3QwLmIgICAgICAgICAgICAgOyAwMDAwMQotICAgICAgICA3IDAwMDAwMDA4ICAgMTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGVxMC5iICAgICAgICAgICAgIDsgMDAwMTAKLSAgICAgICAgOCAwMDAwMDAwQyAgIDE5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxnZTAuYiAgICAgICAgICAgICA7IDAwMDExCi0gICAgICAgIDkgMDAwMDAwMTAgICAyMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbHQwLmIgICAgICAgICAgICAgOyAwMDEwMAotICAgICAgIDEwIDAwMDAwMDE0ICAgMjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5lMC5iICAgICAgICAgICAgIDsgMDAxMDEKLSAgICAgICAxMSAwMDAwMDAxOCAgIDMxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsZTAuYiAgICAgICAgICAgICA7IDAwMTEwCi0gICAgICAgMTIgMDAwMDAwMUMgICAzOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsYWx3LmIgICAgICAgICAgICAgOyAwMDExMQotICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTQgMDAwMDAwMjAgICA0MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmV2LmggICAgICAgICAgICAgOyAwMTAwMAotICAgICAgIDE1IDAwMDAwMDI0ICAgNDk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGd0MC5oICAgICAgICAgICAgIDsgMDEwMDEKLSAgICAgICAxNiAwMDAwMDAyOCAgIDUxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxlcTAuaCAgICAgICAgICAgICA7IDAxMDEwCi0gICAgICAgMTcgMDAwMDAwMkMgICA1OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ2UwLmggICAgICAgICAgICAgOyAwMTAxMQotICAgICAgIDE4IDAwMDAwMDMwICAgNjE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGx0MC5oICAgICAgICAgICAgIDsgMDExMDAKLSAgICAgICAxOSAwMDAwMDAzNCAgIDY5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZTAuaCAgICAgICAgICAgICA7IDAxMTAxCi0gICAgICAgMjAgMDAwMDAwMzggICA3MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbGUwLmggICAgICAgICAgICAgOyAwMTExMAotICAgICAgIDIxIDAwMDAwMDNDICAgNzk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGFsdy5oICAgICAgICAgICAgIDsgMDExMTEKLSAgICAgICAyMiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDIzIDAwMDAwMDQwICAgODE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5ldi53ICAgICAgICAgICAgIDsgMTAwMDAKLSAgICAgICAyNCAwMDAwMDA0NCAgIDg5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxndDAudyAgICAgICAgICAgICA7IDEwMDAxCi0gICAgICAgMjUgMDAwMDAwNDggICA5MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZXEwLncgICAgICAgICAgICAgOyAxMDAxMAotICAgICAgIDI2IDAwMDAwMDRDICAgOTk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGdlMC53ICAgICAgICAgICAgIDsgMTAwMTEKLSAgICAgICAyNyAwMDAwMDA1MCAgIEExNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsdDAudyAgICAgICAgICAgICA7IDEwMTAwCi0gICAgICAgMjggMDAwMDAwNTQgICBBOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmUwLncgICAgICAgICAgICAgOyAxMDEwMQotICAgICAgIDI5IDAwMDAwMDU4ICAgQjE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGxlMC53ICAgICAgICAgICAgIDsgMTAxMTAKLSAgICAgICAzMCAwMDAwMDA1QyAgIEI5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxhbHcudyAgICAgICAgICAgICA7IDEwMTExCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGFhYzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgY29uZGl0aW9uCi07OyBjb2RlcyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuCi07OyAgQWxzbyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLgotCi0JYmNuZC5hCXI3LHI1LG5ldi5iCQk7IDAwMDAwCi0JYmNuZC5hCXI3LHI1LGd0MC5iCQk7IDAwMDAxCi0JYmNuZC5hCXI3LHI1LGVxMC5iCQk7IDAwMDEwCi0JYmNuZC5hCXI3LHI1LGdlMC5iCQk7IDAwMDExCi0JYmNuZC5hCXI3LHI1LGx0MC5iCQk7IDAwMTAwCi0JYmNuZC5hCXI3LHI1LG5lMC5iCQk7IDAwMTAxCi0JYmNuZC5hCXI3LHI1LGxlMC5iCQk7IDAwMTEwCi0JYmNuZC5hCXI3LHI1LGFsdy5iCQk7IDAwMTExCi0KLQliY25kLmEJcjcscjUsbmV2LmgJCTsgMDEwMDAKLQliY25kLmEJcjcscjUsZ3QwLmgJCTsgMDEwMDEKLQliY25kLmEJcjcscjUsZXEwLmgJCTsgMDEwMTAKLQliY25kLmEJcjcscjUsZ2UwLmgJCTsgMDEwMTEKLQliY25kLmEJcjcscjUsbHQwLmgJCTsgMDExMDAKLQliY25kLmEJcjcscjUsbmUwLmgJCTsgMDExMDEKLQliY25kLmEJcjcscjUsbGUwLmgJCTsgMDExMTAKLQliY25kLmEJcjcscjUsYWx3LmgJCTsgMDExMTEKLQotCWJjbmQuYQlyNyxyNSxuZXYudwkJOyAxMDAwMAotCWJjbmQuYQlyNyxyNSxndDAudwkJOyAxMDAwMQotCWJjbmQuYQlyNyxyNSxlcTAudwkJOyAxMDAxMAotCWJjbmQuYQlyNyxyNSxnZTAudwkJOyAxMDAxMQotCWJjbmQuYQlyNyxyNSxsdDAudwkJOyAxMDEwMAotCWJjbmQuYQlyNyxyNSxuZTAudwkJOyAxMDEwMQotCWJjbmQuYQlyNyxyNSxsZTAudwkJOyAxMDExMAotCWJjbmQuYQlyNyxyNSxhbHcudwkJOyAxMDExMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI2MWU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIGNvbnRyb2wgcmVnaXN0ZXIgb3BlcmFuZHMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTM0IDAwIDAyIDEwLioKLSAgIDQ6CTM5IDAwIDAyIDEwLioKLSAgIDg6CTNhIDAwIDAyIDEwLioKLSAgIGM6CTAyIDAwIDAyIDEwLioKLSAgMTA6CTAwIDA1IDAyIDEwLioKLSAgMTQ6CTAwIDA0IDAyIDEwLioKLSAgMTg6CTAxIDA0IDAyIDEwLioKLSAgMWM6CTBhIDA0IDAyIDEwLioKLSAgMjA6CTBiIDA0IDAyIDEwLioKLSAgMjQ6CTBjIDA0IDAyIDEwLioKLSAgMjg6CTBkIDA0IDAyIDEwLioKLSAgMmM6CTBlIDA0IDAyIDEwLioKLSAgMzA6CTBmIDA0IDAyIDEwLioKLSAgMzQ6CTAyIDA0IDAyIDEwLioKLSAgMzg6CTAzIDA0IDAyIDEwLioKLSAgM2M6CTA0IDA0IDAyIDEwLioKLSAgNDA6CTA1IDA0IDAyIDEwLioKLSAgNDQ6CTA2IDA0IDAyIDEwLioKLSAgNDg6CTA3IDA0IDAyIDEwLioKLSAgNGM6CTA4IDA0IDAyIDEwLioKLSAgNTA6CTA5IDA0IDAyIDEwLioKLSAgNTQ6CTMzIDAwIDAyIDEwLioKLSAgNTg6CTAxIDAwIDAyIDEwLioKLSAgNWM6CTAwIDAwIDAyIDEwLioKLSAgNjA6CTExIDAwIDAyIDEwLioKLSAgNjQ6CTE0IDAwIDAyIDEwLioKLSAgNjg6CTEzIDAwIDAyIDEwLioKLSAgNmM6CTEwIDAwIDAyIDEwLioKLSAgNzA6CTEyIDAwIDAyIDEwLioKLSAgNzQ6CTA4IDAwIDAyIDEwLioKLSAgNzg6CTA2IDAwIDAyIDEwLioKLSAgN2M6CTAwIDAzIDAyIDEwLioKLSAgODA6CTAwIDQwIDAyIDEwLioKLSAgODQ6CTAxIDQwIDAyIDEwLioKLSAgODg6CTA0IDAwIDAyIDEwLioKLSAgOGM6CTAwIDAyIDAyIDEwLioKLSAgOTA6CTAxIDAyIDAyIDEwLioKLSAgOTQ6CTBhIDAyIDAyIDEwLioKLSAgOTg6CTBiIDAyIDAyIDEwLioKLSAgOWM6CTBjIDAyIDAyIDEwLioKLSAgYTA6CTBkIDAyIDAyIDEwLioKLSAgYTQ6CTBlIDAyIDAyIDEwLioKLSAgYTg6CTBmIDAyIDAyIDEwLioKLSAgYWM6CTAyIDAyIDAyIDEwLioKLSAgYjA6CTAzIDAyIDAyIDEwLioKLSAgYjQ6CTA0IDAyIDAyIDEwLioKLSAgYjg6CTA1IDAyIDAyIDEwLioKLSAgYmM6CTA2IDAyIDAyIDEwLioKLSAgYzA6CTA3IDAyIDAyIDEwLioKLSAgYzQ6CTA4IDAyIDAyIDEwLioKLSAgYzg6CTA5IDAyIDAyIDEwLioKLSAgY2M6CTMxIDAwIDAyIDEwLioKLSAgZDA6CTMwIDAwIDAyIDEwLioKLSAgZDQ6CTAyIDQwIDAyIDEwLioKLSAgZDg6CTBkIDAwIDAyIDEwLioKLSAgZGM6CTBhIDAwIDAyIDEwLioKLSAgZTA6CTIwIDAwIDAyIDEwLioKLSAgZTQ6CTIxIDAwIDAyIDEwLioKLSAgZTg6CTBlIDAwIDAyIDEwLioKLSAgZWM6CTBmIDAwIDAyIDEwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWE1N2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6NTYgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1jcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGVzdCB0aGF0IGFsbCBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgY29udHJvbCByZWdpc3RlcnMKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4gIEFsc28KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7IHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1IDAwMDAwMDAwICAgMTAwMjAwMzQgICAgICAgICByZGNyICAgIEFOQVNUQVQscjIKLSAgICAgICAgNiAwMDAwMDAwNCAgIDEwMDIwMDM5ICAgICAgICAgcmRjciAgICBCUksxLHIyCi0gICAgICAgIDcgMDAwMDAwMDggICAxMDAyMDAzQSAgICAgICAgIHJkY3IgICAgQlJLMixyMgotICAgICAgICA4IDAwMDAwMDBDICAgMTAwMjAwMDIgICAgICAgICByZGNyICAgIENPTkZJRyxyMgotICAgICAgICA5IDAwMDAwMDEwICAgMTAwMjA1MDAgICAgICAgICByZGNyICAgIERMUlUscjIKLSAgICAgICAxMCAwMDAwMDAxNCAgIDEwMDIwNDAwICAgICAgICAgcmRjciAgICBEVEFHMCxyMgotICAgICAgIDExIDAwMDAwMDE4ICAgMTAwMjA0MDEgICAgICAgICByZGNyICAgIERUQUcxLHIyCi0gICAgICAgMTIgMDAwMDAwMUMgICAxMDAyMDQwQSAgICAgICAgIHJkY3IgICAgRFRBRzEwLHIyCi0gICAgICAgMTMgMDAwMDAwMjAgICAxMDAyMDQwQiAgICAgICAgIHJkY3IgICAgRFRBRzExLHIyCi0gICAgICAgMTQgMDAwMDAwMjQgICAxMDAyMDQwQyAgICAgICAgIHJkY3IgICAgRFRBRzEyLHIyCi0gICAgICAgMTUgMDAwMDAwMjggICAxMDAyMDQwRCAgICAgICAgIHJkY3IgICAgRFRBRzEzLHIyCi0gICAgICAgMTYgMDAwMDAwMkMgICAxMDAyMDQwRSAgICAgICAgIHJkY3IgICAgRFRBRzE0LHIyCi0gICAgICAgMTcgMDAwMDAwMzAgICAxMDAyMDQwRiAgICAgICAgIHJkY3IgICAgRFRBRzE1LHIyCi0gICAgICAgMTggMDAwMDAwMzQgICAxMDAyMDQwMiAgICAgICAgIHJkY3IgICAgRFRBRzIscjIKLSAgICAgICAxOSAwMDAwMDAzOCAgIDEwMDIwNDAzICAgICAgICAgcmRjciAgICBEVEFHMyxyMgotICAgICAgIDIwIDAwMDAwMDNDICAgMTAwMjA0MDQgICAgICAgICByZGNyICAgIERUQUc0LHIyCi0gICAgICAgMjEgMDAwMDAwNDAgICAxMDAyMDQwNSAgICAgICAgIHJkY3IgICAgRFRBRzUscjIKLSAgICAgICAyMiAwMDAwMDA0NCAgIDEwMDIwNDA2ICAgICAgICAgcmRjciAgICBEVEFHNixyMgotICAgICAgIDIzIDAwMDAwMDQ4ICAgMTAwMjA0MDcgICAgICAgICByZGNyICAgIERUQUc3LHIyCi0gICAgICAgMjQgMDAwMDAwNEMgICAxMDAyMDQwOCAgICAgICAgIHJkY3IgICAgRFRBRzgscjIKLSAgICAgICAyNSAwMDAwMDA1MCAgIDEwMDIwNDA5ICAgICAgICAgcmRjciAgICBEVEFHOSxyMgotICAgICAgIDI2IDAwMDAwMDU0ICAgMTAwMjAwMzMgICAgICAgICByZGNyICAgIEVDT01DTlRMLHIyCi0gICAgICAgMjcgMDAwMDAwNTggICAxMDAyMDAwMSAgICAgICAgIHJkY3IgICAgRUlQLHIyCi0gICAgICAgMjggMDAwMDAwNUMgICAxMDAyMDAwMCAgICAgICAgIHJkY3IgICAgRVBDLHIyCi0gICAgICAgMjkgMDAwMDAwNjAgICAxMDAyMDAxMSAgICAgICAgIHJkY3IgICAgRkxUQURSLHIyCi0gICAgICAgMzAgMDAwMDAwNjQgICAxMDAyMDAxNCAgICAgICAgIHJkY3IgICAgRkxURFRILHIyCi0gICAgICAgMzEgMDAwMDAwNjggICAxMDAyMDAxMyAgICAgICAgIHJkY3IgICAgRkxURFRMLHIyCi0gICAgICAgMzIgMDAwMDAwNkMgICAxMDAyMDAxMCAgICAgICAgIHJkY3IgICAgRkxUT1AscjIKLSAgICAgICAzMyAwMDAwMDA3MCAgIDEwMDIwMDEyICAgICAgICAgcmRjciAgICBGTFRUQUcscjIKLSAgICAgICAzNCAwMDAwMDA3NCAgIDEwMDIwMDA4ICAgICAgICAgcmRjciAgICBGUFNULHIyCi0gICAgICAgMzUgMDAwMDAwNzggICAxMDAyMDAwNiAgICAgICAgIHJkY3IgICAgSUUscjIKLSAgICAgICAzNiAwMDAwMDA3QyAgIDEwMDIwMzAwICAgICAgICAgcmRjciAgICBJTFJVLHIyCi0gICAgICAgMzcgMDAwMDAwODAgICAxMDAyNDAwMCAgICAgICAgIHJkY3IgICAgSU4wUCxyMgotICAgICAgIDM4IDAwMDAwMDg0ICAgMTAwMjQwMDEgICAgICAgICByZGNyICAgIElOMVAscjIKLSAgICAgICAzOSAwMDAwMDA4OCAgIDEwMDIwMDA0ICAgICAgICAgcmRjciAgICBJTlRQRU4scjIKLSAgICAgICA0MCAwMDAwMDA4QyAgIDEwMDIwMjAwICAgICAgICAgcmRjciAgICBJVEFHMCxyMgotICAgICAgIDQxIDAwMDAwMDkwICAgMTAwMjAyMDEgICAgICAgICByZGNyICAgIElUQUcxLHIyCi0gICAgICAgNDIgMDAwMDAwOTQgICAxMDAyMDIwQSAgICAgICAgIHJkY3IgICAgSVRBRzEwLHIyCi0gICAgICAgNDMgMDAwMDAwOTggICAxMDAyMDIwQiAgICAgICAgIHJkY3IgICAgSVRBRzExLHIyCi0gICAgICAgNDQgMDAwMDAwOUMgICAxMDAyMDIwQyAgICAgICAgIHJkY3IgICAgSVRBRzEyLHIyCi0gICAgICAgNDUgMDAwMDAwQTAgICAxMDAyMDIwRCAgICAgICAgIHJkY3IgICAgSVRBRzEzLHIyCi0gICAgICAgNDYgMDAwMDAwQTQgICAxMDAyMDIwRSAgICAgICAgIHJkY3IgICAgSVRBRzE0LHIyCi0gICAgICAgNDcgMDAwMDAwQTggICAxMDAyMDIwRiAgICAgICAgIHJkY3IgICAgSVRBRzE1LHIyCi0gICAgICAgNDggMDAwMDAwQUMgICAxMDAyMDIwMiAgICAgICAgIHJkY3IgICAgSVRBRzIscjIKLSAgICAgICA0OSAwMDAwMDBCMCAgIDEwMDIwMjAzICAgICAgICAgcmRjciAgICBJVEFHMyxyMgotICAgICAgIDUwIDAwMDAwMEI0ICAgMTAwMjAyMDQgICAgICAgICByZGNyICAgIElUQUc0LHIyCi0gICAgICAgNTEgMDAwMDAwQjggICAxMDAyMDIwNSAgICAgICAgIHJkY3IgICAgSVRBRzUscjIKLSAgICAgICA1MiAwMDAwMDBCQyAgIDEwMDIwMjA2ICAgICAgICAgcmRjciAgICBJVEFHNixyMgotICAgICAgIDUzIDAwMDAwMEMwICAgMTAwMjAyMDcgICAgICAgICByZGNyICAgIElUQUc3LHIyCi0gICAgICAgNTQgMDAwMDAwQzQgICAxMDAyMDIwOCAgICAgICAgIHJkY3IgICAgSVRBRzgscjIKLSAgICAgICA1NSAwMDAwMDBDOCAgIDEwMDIwMjA5ICAgICAgICAgcmRjciAgICBJVEFHOSxyMgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo1NiAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWNyZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgNTYgMDAwMDAwQ0MgICAxMDAyMDAzMSAgICAgICAgIHJkY3IgICAgTUlQLHIyCi0gICAgICAgNTcgMDAwMDAwRDAgICAxMDAyMDAzMCAgICAgICAgIHJkY3IgICAgTVBDLHIyCi0gICAgICAgNTggMDAwMDAwRDQgICAxMDAyNDAwMiAgICAgICAgIHJkY3IgICAgT1VUUCxyMgotICAgICAgIDU5IDAwMDAwMEQ4ICAgMTAwMjAwMEQgICAgICAgICByZGNyICAgIFBLVFJFUSxyMgotICAgICAgIDYwIDAwMDAwMERDICAgMTAwMjAwMEEgICAgICAgICByZGNyICAgIFBQRVJST1IscjIKLSAgICAgICA2MSAwMDAwMDBFMCAgIDEwMDIwMDIwICAgICAgICAgcmRjciAgICBTWVNTVEsscjIKLSAgICAgICA2MiAwMDAwMDBFNCAgIDEwMDIwMDIxICAgICAgICAgcmRjciAgICBTWVNUTVAscjIKLSAgICAgICA2MyAwMDAwMDBFOCAgIDEwMDIwMDBFICAgICAgICAgcmRjciAgICBUQ09VTlQscjIKLSAgICAgICA2NCAwMDAwMDBFQyAgIDEwMDIwMDBGICAgICAgICAgcmRjciAgICBUU0NBTEUscjIKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGFkY2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotOzsgVGVzdCB0aGF0IGFsbCBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgY29udHJvbCByZWdpc3RlcnMKLTs7IGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4gIEFsc28KLTs7IHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KLQotCXJkY3IJQU5BU1RBVCxyMgotCXJkY3IJQlJLMSxyMgotCXJkY3IJQlJLMixyMgotCXJkY3IJQ09ORklHLHIyCi0JcmRjcglETFJVLHIyCi0JcmRjcglEVEFHMCxyMgotCXJkY3IJRFRBRzEscjIKLQlyZGNyCURUQUcxMCxyMgotCXJkY3IJRFRBRzExLHIyCi0JcmRjcglEVEFHMTIscjIKLQlyZGNyCURUQUcxMyxyMgotCXJkY3IJRFRBRzE0LHIyCi0JcmRjcglEVEFHMTUscjIKLQlyZGNyCURUQUcyLHIyCi0JcmRjcglEVEFHMyxyMgotCXJkY3IJRFRBRzQscjIKLQlyZGNyCURUQUc1LHIyCi0JcmRjcglEVEFHNixyMgotCXJkY3IJRFRBRzcscjIKLQlyZGNyCURUQUc4LHIyCi0JcmRjcglEVEFHOSxyMgotCXJkY3IJRUNPTUNOVEwscjIKLQlyZGNyCUVJUCxyMgotCXJkY3IJRVBDLHIyCi0JcmRjcglGTFRBRFIscjIKLQlyZGNyCUZMVERUSCxyMgotCXJkY3IJRkxURFRMLHIyCi0JcmRjcglGTFRPUCxyMgotCXJkY3IJRkxUVEFHLHIyCi0JcmRjcglGUFNULHIyCi0JcmRjcglJRSxyMgotCXJkY3IJSUxSVSxyMgotCXJkY3IJSU4wUCxyMgotCXJkY3IJSU4xUCxyMgotCXJkY3IJSU5UUEVOLHIyCi0JcmRjcglJVEFHMCxyMgotCXJkY3IJSVRBRzEscjIKLQlyZGNyCUlUQUcxMCxyMgotCXJkY3IJSVRBRzExLHIyCi0JcmRjcglJVEFHMTIscjIKLQlyZGNyCUlUQUcxMyxyMgotCXJkY3IJSVRBRzE0LHIyCi0JcmRjcglJVEFHMTUscjIKLQlyZGNyCUlUQUcyLHIyCi0JcmRjcglJVEFHMyxyMgotCXJkY3IJSVRBRzQscjIKLQlyZGNyCUlUQUc1LHIyCi0JcmRjcglJVEFHNixyMgotCXJkY3IJSVRBRzcscjIKLQlyZGNyCUlUQUc4LHIyCi0JcmRjcglJVEFHOSxyMgotCXJkY3IJTUlQLHIyCi0JcmRjcglNUEMscjIKLQlyZGNyCU9VVFAscjIKLQlyZGNyCVBLVFJFUSxyMgotCXJkY3IJUFBFUlJPUixyMgotCXJkY3IJU1lTU1RLLHIyCi0JcmRjcglTWVNUTVAscjIKLQlyZGNyCVRDT1VOVCxyMgotCXJkY3IJVFNDQUxFLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDA4NDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5kCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgY292ZXJhZ2Ugb2Ygc2hpZnQgaW5zdHJ1Y3Rpb24gRU5ETUFTSyBmaWVsZAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDUgMDAgYzcgNDkuKgotICAgNDoJMjUgMDAgYzcgNDkuKgotICAgODoJNDUgMDAgYzcgNDkuKgotICAgYzoJNjUgMDAgYzcgNDkuKgotICAxMDoJODUgMDAgYzcgNDkuKgotICAxNDoJYTUgMDAgYzcgNDkuKgotICAxODoJYzUgMDAgYzcgNDkuKgotICAxYzoJZTUgMDAgYzcgNDkuKgotICAyMDoJMDUgMDEgYzcgNDkuKgotICAyNDoJMjUgMDEgYzcgNDkuKgotICAyODoJNDUgMDEgYzcgNDkuKgotICAyYzoJNjUgMDEgYzcgNDkuKgotICAzMDoJODUgMDEgYzcgNDkuKgotICAzNDoJYTUgMDEgYzcgNDkuKgotICAzODoJYzUgMDEgYzcgNDkuKgotICAzYzoJZTUgMDEgYzcgNDkuKgotICA0MDoJMDUgMDIgYzcgNDkuKgotICA0NDoJMjUgMDIgYzcgNDkuKgotICA0ODoJNDUgMDIgYzcgNDkuKgotICA0YzoJNjUgMDIgYzcgNDkuKgotICA1MDoJODUgMDIgYzcgNDkuKgotICA1NDoJYTUgMDIgYzcgNDkuKgotICA1ODoJYzUgMDIgYzcgNDkuKgotICA1YzoJZTUgMDIgYzcgNDkuKgotICA2MDoJMDUgMDMgYzcgNDkuKgotICA2NDoJMjUgMDMgYzcgNDkuKgotICA2ODoJNDUgMDMgYzcgNDkuKgotICA2YzoJNjUgMDMgYzcgNDkuKgotICA3MDoJODUgMDMgYzcgNDkuKgotICA3NDoJYTUgMDMgYzcgNDkuKgotICA3ODoJYzUgMDMgYzcgNDkuKgotICA3YzoJZTUgMDMgYzcgNDkuKgotICA4MDoJMDUgMDAgYzcgNDkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwM2IzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWVuZG1hc2sucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlIGVuZG1hc2sgaW4gYml0cyA1LTkuCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7OyBUaGUgbWFzayB0aGF0IGlzIHVzZWQgaXMgY29tcHV0ZWQgYXMgMioqYml0cy0xIHdoZXJlIGJpdHMKLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSB0aGUgYml0cyA1LTkgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgMCBhbmQgMzIKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5LCBhbmQgZGlzYXNzZW1ibGVkIGFzIDAuCi0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNiAwMDAwMDAwMCAgIDQ5QzcwMDA1ICAgICAgICAgc2wuaXogICA1LDAscjcscjkKLSAgICAgICAgNyAwMDAwMDAwNCAgIDQ5QzcwMDI1ICAgICAgICAgc2wuaXogICA1LDEscjcscjkKLSAgICAgICAgOCAwMDAwMDAwOCAgIDQ5QzcwMDQ1ICAgICAgICAgc2wuaXogICA1LDIscjcscjkKLSAgICAgICAgOSAwMDAwMDAwQyAgIDQ5QzcwMDY1ICAgICAgICAgc2wuaXogICA1LDMscjcscjkKLSAgICAgICAxMCAwMDAwMDAxMCAgIDQ5QzcwMDg1ICAgICAgICAgc2wuaXogICA1LDQscjcscjkKLSAgICAgICAxMSAwMDAwMDAxNCAgIDQ5QzcwMEE1ICAgICAgICAgc2wuaXogICA1LDUscjcscjkKLSAgICAgICAxMiAwMDAwMDAxOCAgIDQ5QzcwMEM1ICAgICAgICAgc2wuaXogICA1LDYscjcscjkKLSAgICAgICAxMyAwMDAwMDAxQyAgIDQ5QzcwMEU1ICAgICAgICAgc2wuaXogICA1LDcscjcscjkKLSAgICAgICAxNCAwMDAwMDAyMCAgIDQ5QzcwMTA1ICAgICAgICAgc2wuaXogICA1LDgscjcscjkKLSAgICAgICAxNSAwMDAwMDAyNCAgIDQ5QzcwMTI1ICAgICAgICAgc2wuaXogICA1LDkscjcscjkKLSAgICAgICAxNiAwMDAwMDAyOCAgIDQ5QzcwMTQ1ICAgICAgICAgc2wuaXogICA1LDEwLHI3LHI5Ci0gICAgICAgMTcgMDAwMDAwMkMgICA0OUM3MDE2NSAgICAgICAgIHNsLml6ICAgNSwxMSxyNyxyOQotICAgICAgIDE4IDAwMDAwMDMwICAgNDlDNzAxODUgICAgICAgICBzbC5peiAgIDUsMTIscjcscjkKLSAgICAgICAxOSAwMDAwMDAzNCAgIDQ5QzcwMUE1ICAgICAgICAgc2wuaXogICA1LDEzLHI3LHI5Ci0gICAgICAgMjAgMDAwMDAwMzggICA0OUM3MDFDNSAgICAgICAgIHNsLml6ICAgNSwxNCxyNyxyOQotICAgICAgIDIxIDAwMDAwMDNDICAgNDlDNzAxRTUgICAgICAgICBzbC5peiAgIDUsMTUscjcscjkKLSAgICAgICAyMiAwMDAwMDA0MCAgIDQ5QzcwMjA1ICAgICAgICAgc2wuaXogICA1LDE2LHI3LHI5Ci0gICAgICAgMjMgMDAwMDAwNDQgICA0OUM3MDIyNSAgICAgICAgIHNsLml6ICAgNSwxNyxyNyxyOQotICAgICAgIDI0IDAwMDAwMDQ4ICAgNDlDNzAyNDUgICAgICAgICBzbC5peiAgIDUsMTgscjcscjkKLSAgICAgICAyNSAwMDAwMDA0QyAgIDQ5QzcwMjY1ICAgICAgICAgc2wuaXogICA1LDE5LHI3LHI5Ci0gICAgICAgMjYgMDAwMDAwNTAgICA0OUM3MDI4NSAgICAgICAgIHNsLml6ICAgNSwyMCxyNyxyOQotICAgICAgIDI3IDAwMDAwMDU0ICAgNDlDNzAyQTUgICAgICAgICBzbC5peiAgIDUsMjEscjcscjkKLSAgICAgICAyOCAwMDAwMDA1OCAgIDQ5QzcwMkM1ICAgICAgICAgc2wuaXogICA1LDIyLHI3LHI5Ci0gICAgICAgMjkgMDAwMDAwNUMgICA0OUM3MDJFNSAgICAgICAgIHNsLml6ICAgNSwyMyxyNyxyOQotICAgICAgIDMwIDAwMDAwMDYwICAgNDlDNzAzMDUgICAgICAgICBzbC5peiAgIDUsMjQscjcscjkKLSAgICAgICAzMSAwMDAwMDA2NCAgIDQ5QzcwMzI1ICAgICAgICAgc2wuaXogICA1LDI1LHI3LHI5Ci0gICAgICAgMzIgMDAwMDAwNjggICA0OUM3MDM0NSAgICAgICAgIHNsLml6ICAgNSwyNixyNyxyOQotICAgICAgIDMzIDAwMDAwMDZDICAgNDlDNzAzNjUgICAgICAgICBzbC5peiAgIDUsMjcscjcscjkKLSAgICAgICAzNCAwMDAwMDA3MCAgIDQ5QzcwMzg1ICAgICAgICAgc2wuaXogICA1LDI4LHI3LHI5Ci0gICAgICAgMzUgMDAwMDAwNzQgICA0OUM3MDNBNSAgICAgICAgIHNsLml6ICAgNSwyOSxyNyxyOQotICAgICAgIDM2IDAwMDAwMDc4ICAgNDlDNzAzQzUgICAgICAgICBzbC5peiAgIDUsMzAscjcscjkKLSAgICAgICAzNyAwMDAwMDA3QyAgIDQ5QzcwM0U1ICAgICAgICAgc2wuaXogICA1LDMxLHI3LHI5Ci0gICAgICAgMzggMDAwMDAwODAgICA0OUM3MDAwNSAgICAgICAgIHNsLml6ICAgNSwzMixyNyxyOQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2sucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2sucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YWVkZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi07OyBUZXN0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlIGVuZG1hc2sgaW4gYml0cyA1LTkuCi07OyBUaGUgbWFzayB0aGF0IGlzIHVzZWQgaXMgY29tcHV0ZWQgYXMgMioqYml0cy0xIHdoZXJlIGJpdHMKLTs7IGFyZSB0aGUgYml0cyA1LTkgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgMCBhbmQgMzIKLTs7IGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5LCBhbmQgZGlzYXNzZW1ibGVkIGFzIDAuCi0KLQlzbC5pegk1LDAscjcscjkKLQlzbC5pegk1LDEscjcscjkKLQlzbC5pegk1LDIscjcscjkKLQlzbC5pegk1LDMscjcscjkKLQlzbC5pegk1LDQscjcscjkKLQlzbC5pegk1LDUscjcscjkKLQlzbC5pegk1LDYscjcscjkKLQlzbC5pegk1LDcscjcscjkKLQlzbC5pegk1LDgscjcscjkKLQlzbC5pegk1LDkscjcscjkKLQlzbC5pegk1LDEwLHI3LHI5Ci0Jc2wuaXoJNSwxMSxyNyxyOQotCXNsLml6CTUsMTIscjcscjkKLQlzbC5pegk1LDEzLHI3LHI5Ci0Jc2wuaXoJNSwxNCxyNyxyOQotCXNsLml6CTUsMTUscjcscjkKLQlzbC5pegk1LDE2LHI3LHI5Ci0Jc2wuaXoJNSwxNyxyNyxyOQotCXNsLml6CTUsMTgscjcscjkKLQlzbC5pegk1LDE5LHI3LHI5Ci0Jc2wuaXoJNSwyMCxyNyxyOQotCXNsLml6CTUsMjEscjcscjkKLQlzbC5pegk1LDIyLHI3LHI5Ci0Jc2wuaXoJNSwyMyxyNyxyOQotCXNsLml6CTUsMjQscjcscjkKLQlzbC5pegk1LDI1LHI3LHI5Ci0Jc2wuaXoJNSwyNixyNyxyOQotCXNsLml6CTUsMjcscjcscjkKLQlzbC5pegk1LDI4LHI3LHI5Ci0Jc2wuaXoJNSwyOSxyNyxyOQotCXNsLml6CTUsMzAscjcscjkKLQlzbC5pegk1LDMxLHI3LHI5Ci0Jc2wuaXoJNSwzMixyNyxyOQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZWI4NWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHNpbXBsZSBmbG9hdGluZyBwb2ludCBvcGVyYW5kcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJODAgMTIgYmUgNTEgMTYgNjggYTkgNjUuKgotICAgODoJMDAgMTIgYmUgNTEgMTYgNjggYTkgZTUuKgotICAxMDoJMDAgMTAgYmUgNTEgOWEgNmQgNDEgMTkuKgotICAxODoJODAgYjAgM2UgNTIgOWEgNmQgNDEgOTkuKgotICAyMDoJMDAgYjAgM2UgNTIgMDAgMDAgMDAgMDAuKgotICAyODoJODAgNzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICAzMDoJMDAgNzIgYmUgNTEgMDAgMDAgMDAgM2YuKgotICAzODoJMDAgNzAgYmUgNTEgMDAgMDAgODAgNDUuKgotICA0MDoJODAgNTIgYmUgNTEgMDAgMDAgODAgYzUuKgotICA0ODoJMDAgNTIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICA1MDoJMDAgNTAgYmUgNTEgMDAgMDAgMDAgNDAuKgotICA1ODoJODAgOTMgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA2MDoJODAgOTUgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA2ODoJODAgOTEgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA3MDoJODAgOTcgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA3ODoJMDAgOTIgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA4MDoJMDAgOTQgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA4ODoJMDAgOTAgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA5MDoJMDAgOTYgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA5ODoJMDAgOTMgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBhMDoJMDAgOTUgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBhODoJMDAgOTEgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBiMDoJMDAgOTcgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBiODoJODAgOTIgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBjMDoJODAgOTQgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBjODoJODAgOTAgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBkMDoJODAgOTYgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBkODoJMDAgZjIgM2UgNTAgMDAgMDAgMDAgNDAuKgotICBlMDoJMDAgZjAgM2UgNTAgMDAgMDAgMDAgNDAuKgotICBlODoJODAgMzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICBmMDoJMDAgMzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICBmODoJMDAgMzAgYmUgNTEgMDAgMDAgMDAgNDAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTM0NTkwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAyMjowOTowOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWZsb2F0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgMDAwMDAwMDAgICA1MUJFMTI4MCAgICAgICAgIGZhZGQuc2RkICAgICAgICAxLjBFMjMscjYscjEwICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDA0ICAgNjVBOTY4MTYgCi0gICAgICAgIDIgMDAwMDAwMDggICA1MUJFMTIwMCAgICAgICAgIGZhZGQuc3NkICAgICAgICAtMS4wRTIzLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDBDICAgRTVBOTY4MTYgCi0gICAgICAgIDMgMDAwMDAwMTAgICA1MUJFMTAwMCAgICAgICAgIGZhZGQuc3NzICAgICAgICAxLjBFLTIzLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDE0ICAgMTk0MTZEOUEgCi0gICAgICAgIDQgMDAwMDAwMTggICA1MjNFQjA4MCAgICAgICAgIGZjbXAuc2QgICAgICAgICAtMS4wRS0yMyxyOCxyMTAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDFDICAgOTk0MTZEOUEgCi0gICAgICAgIDUgMDAwMDAwMjAgICA1MjNFQjAwMCAgICAgICAgIGZjbXAuc3MgICAgICAgICAwLjAscjgscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDI0ICAgMDAwMDAwMDAgCi0gICAgICAgIDYgMDAwMDAwMjggICA1MUJFNzI4MCAgICAgICAgIGZkaXYuc2RkICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDJDICAgNDAwMDAwMDAgCi0gICAgICAgIDcgMDAwMDAwMzAgICA1MUJFNzIwMCAgICAgICAgIGZkaXYuc3NkICAgICAgICAwLjUscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDM0ICAgM0YwMDAwMDAgCi0gICAgICAgIDggMDAwMDAwMzggICA1MUJFNzAwMCAgICAgICAgIGZkaXYuc3NzICAgICAgICA0MDk2LjAscjYscjEwICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDNDICAgNDU4MDAwMDAgCi0gICAgICAgIDkgMDAwMDAwNDAgICA1MUJFNTI4MCAgICAgICAgIGZtcHkuc2RkICAgICAgICAtNDA5Ni4wLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDQ0ICAgQzU4MDAwMDAgCi0gICAgICAgMTAgMDAwMDAwNDggICA1MUJFNTIwMCAgICAgICAgIGZtcHkuc3NkICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDRDICAgNDAwMDAwMDAgCi0gICAgICAgMTEgMDAwMDAwNTAgICA1MUJFNTAwMCAgICAgICAgIGZtcHkuc3NzICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDU0ICAgNDAwMDAwMDAgCi0gICAgICAgMTIgMDAwMDAwNTggICA0MDNFOTM4MCAgICAgICAgIGZybmRtLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDVDICAgNDAwMDAwMDAgCi0gICAgICAgMTMgMDAwMDAwNjAgICA0MDNFOTU4MCAgICAgICAgIGZybmRtLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDY0ICAgNDAwMDAwMDAgCi0gICAgICAgMTQgMDAwMDAwNjggICA0MDNFOTE4MCAgICAgICAgIGZybmRtLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDZDICAgNDAwMDAwMDAgCi0gICAgICAgMTUgMDAwMDAwNzAgICA0MDNFOTc4MCAgICAgICAgIGZybmRtLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDc0ICAgNDAwMDAwMDAgCi0gICAgICAgMTYgMDAwMDAwNzggICA0MDNFOTIwMCAgICAgICAgIGZybmRuLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDdDICAgNDAwMDAwMDAgCi0gICAgICAgMTcgMDAwMDAwODAgICA0MDNFOTQwMCAgICAgICAgIGZybmRuLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDg0ICAgNDAwMDAwMDAgCi0gICAgICAgMTggMDAwMDAwODggICA0MDNFOTAwMCAgICAgICAgIGZybmRuLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDhDICAgNDAwMDAwMDAgCi0gICAgICAgMTkgMDAwMDAwOTAgICA0MDNFOTYwMCAgICAgICAgIGZybmRuLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDk0ICAgNDAwMDAwMDAgCi0gICAgICAgMjAgMDAwMDAwOTggICA0MDNFOTMwMCAgICAgICAgIGZybmRwLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDlDICAgNDAwMDAwMDAgCi0gICAgICAgMjEgMDAwMDAwQTAgICA0MDNFOTUwMCAgICAgICAgIGZybmRwLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEE0ICAgNDAwMDAwMDAgCi0gICAgICAgMjIgMDAwMDAwQTggICA0MDNFOTEwMCAgICAgICAgIGZybmRwLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEFDICAgNDAwMDAwMDAgCi0gICAgICAgMjMgMDAwMDAwQjAgICA0MDNFOTcwMCAgICAgICAgIGZybmRwLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEI0ICAgNDAwMDAwMDAgCi0gICAgICAgMjQgMDAwMDAwQjggICA0MDNFOTI4MCAgICAgICAgIGZybmR6LnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEJDICAgNDAwMDAwMDAgCi0gICAgICAgMjUgMDAwMDAwQzAgICA0MDNFOTQ4MCAgICAgICAgIGZybmR6LnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEM0ICAgNDAwMDAwMDAgCi0gICAgICAgMjYgMDAwMDAwQzggICA0MDNFOTA4MCAgICAgICAgIGZybmR6LnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMENDICAgNDAwMDAwMDAgCi0gICAgICAgMjcgMDAwMDAwRDAgICA0MDNFOTY4MCAgICAgICAgIGZybmR6LnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEQ0ICAgNDAwMDAwMDAgCi0gICAgICAgMjggMDAwMDAwRDggICA1MDNFRjIwMCAgICAgICAgIGZzcXJ0LnNkICAgICAgICAyLjAscjEwICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAyMjowOTowOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWZsb2F0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgICAgMDAwMDAwREMgICA0MDAwMDAwMCAKLSAgICAgICAyOSAwMDAwMDBFMCAgIDUwM0VGMDAwICAgICAgICAgZnNxcnQuc3MgICAgICAgIDIuMCxyMTAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRTQgICA0MDAwMDAwMCAKLSAgICAgICAzMCAwMDAwMDBFOCAgIDUxQkUzMjgwICAgICAgICAgZnN1Yi5zZGQgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRUMgICA0MDAwMDAwMCAKLSAgICAgICAzMSAwMDAwMDBGMCAgIDUxQkUzMjAwICAgICAgICAgZnN1Yi5zc2QgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRjQgICA0MDAwMDAwMCAKLSAgICAgICAzMiAwMDAwMDBGOCAgIDUxQkUzMDAwICAgICAgICAgZnN1Yi5zc3MgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRkMgICA0MDAwMDAwMCAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhMmI3YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCWZhZGQuc2RkCTBmMS4wRTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmFkZC5zc2QJMGYtMS4wRTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmFkZC5zc3MJMGYxLjBFLTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmNtcC5zZAkJMGYtMS4wRS0yMyxyOCxyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZjbXAuc3MJCTBmMC4wLHI4LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmRpdi5zZGQJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmZGl2LnNzZAkwZjAuNSxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZkaXYuc3NzCTBmNDA5Ni4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZm1weS5zZGQJMGYtNDA5Ni4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZm1weS5zc2QJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmbXB5LnNzcwkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRtLnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG0uc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbS5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRtLnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG4uc2QJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbi5zaQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRuLnNzCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG4uc3UJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kcC5zZAkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRwLnNpCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHAuc3MJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kcC5zdQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmR6LnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHouc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kei5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmR6LnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnNxcnQuc2QJMGYyLjAscjEwCQk7IEltbWVkaWF0ZSBmb3JtCi0JZnNxcnQuc3MJMGYyLjAscjEwCQk7IEltbWVkaWF0ZSBmb3JtCi0JZnN1Yi5zZGQJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3ViLnNzZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZzdWIuc3NzCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDBmYTg1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwMyAwMCAzYiAyOS4qCi0gICA0OgkwMyAyMCAzYiAyOS4qCi0gICA4OgkwNSAyMCAzMiAxMS4qCi0gICBjOgkwNSAyMCAzMiAxMS4qCi0gIDEwOgkwYSAwMCAzMyA3My4qCi0gIDE0OgkwYSA4MCAzMiA3My4qCi0gIDE4OgkwYSA0MCAzMiA3My4qCi0gIDFjOgkwYSA0MCAzOSAxYS4qCi0gIDIwOgkwYSA2MCAzOSBmYS4qCi0gIDI0OgkwYSAwMCAzOSAyMi4qCi0gIDI4OgkwYSAyMCAzOSAyYS4qCi0gIDJjOgkwNCA4MCBiOSAyMS4qCi0gIDMwOgkwNCBhMCBiOSAyMS4qCi0gIDM0OgkwNiAwMCAzOSAwMC4qCi0gIDM4OgkwNiAyMCAzOSAwMC4qCi0gIDNjOgkwYSAwMCAwMyAwMC4qCi0gIDQwOgkwNiAwMCAzOCBmOC4qCi0gIDQ0OgkwNiAyMCAzOCBmOC4qCi0gIDQ4OgkwNyA0MCAzMCAwMC4qCi0gIDRjOgkwMyAwMCAzYSAyOS4qCi0gIDUwOgkwOCAwMCBiNyAwMi4qCi0gIDU0OgkwOCAwMCBiNyAwYS4qCi0gIDU4OgkwNCAwNCBiNCA0MS4qCi0gIDVjOgkwNCAyNCBiNCA0MS4qCi0gIDYwOgkwNCA0NCBiNCA0MS4qCi0gIDY0OgkwNCA2NCBiNCA0MS4qCi0gIDY4OgkwNCAwNCBiNSA0MS4qCi0gIDZjOgkwNCAyNCBiNSA0MS4qCi0gIDcwOgkwNCAwNCBiNiA0MS4qCi0gIDc0OgkwNCAyNCBiNiA0MS4qCi0gIDc4OgkwNCA0NCBiNiA0MS4qCi0gIDdjOgkwNCA2NCBiNiA0MS4qCi0gIDgwOgkwNSAyMCAzMCAwOC4qCi0gIDg0OgllMyA0NyA3MSAzMS4qCi0gIDg4OgljMiAwNyA3MSA0OS4qCi0gIDhjOgkwMiAwMCAzZSAzMS4qCi0gIDkwOgkwMiAwMiAzZSAzMS4qCi0gIDk0Ogk4MiAwMiAzZSAzMS4qCi0gIDk4OgkyMiAwMiAzZSAzMS4qCi0gIDljOglhMiAwMiAzZSAzMS4qCi0gIGEwOgkwNCBhMCBiZSA0MS4qCi0gIGE0Ogk4NCBhMCBiZSA0MS4qCi0gIGE4OgkyNCBhMCBiZSA0MS4qCi0gIGFjOglhNCBhMCBiZSA0MS4qCi0gIGIwOgkwMiA2MCAzZSAzMS4qCi0gIGI0OgkwMiA2MiAzZSAzMS4qCi0gIGI4Ogk4MiA2MiAzZSAzMS4qCi0gIGJjOgkyMiA2MiAzZSAzMS4qCi0gIGMwOglhMiA2MiAzZSAzMS4qCi0gIGM0OgkwMiA0MCAzZSAzMS4qCi0gIGM4OgkwMiA0MiAzZSAzMS4qCi0gIGNjOgk4MiA0MiAzZSAzMS4qCi0gIGQwOgkyMiA0MiAzZSAzMS4qCi0gIGQ0OglhMiA0MiAzZSAzMS4qCi0gIGQ4Ogk0MiA0NSAzZSAzMS4qCi0gIGRjOgllMiA0NyAzZSAzMS4qCi0gIGUwOgk4NCA4MSAzZSAzMC4qCi0gIGU0Ogk4NCA4MyAzZSAzMC4qCi0gIGU4Ogk4NCA4NSAzZSAzMC4qCi0gIGVjOgk4NCA4NyAzZSAzMC4qCi0gIGYwOglhMiA4MSAzZSA0MC4qCi0gIGY0OglhMiA4MyAzZSA0MC4qCi0gIGY4OglhMiA4NSAzZSA0MC4qCi0gIGZjOglhMiA4NyAzZSA0MC4qCi0gMTAwOgljNCA4MSAzZSAzMC4qCi0gMTA0OgljNCA4MyAzZSAzMC4qCi0gMTA4OgllMiA4MSAzZSA0MC4qCi0gMTBjOgllMiA4MyAzZSA0MC4qCi0gMTEwOgkwNCA4MCAzZSAzMC4qCi0gMTE0OgkwNCA4MiAzZSAzMC4qCi0gMTE4OgkwNCA4NCAzZSAzMC4qCi0gMTFjOgkwNCA4NiAzZSAzMC4qCi0gMTIwOgkyMiA4MCAzZSA0MC4qCi0gMTI0OgkyMiA4MiAzZSA0MC4qCi0gMTI4OgkyMiA4NCAzZSA0MC4qCi0gMTJjOgkyMiA4NiAzZSA0MC4qCi0gMTMwOgk0NCA4MCAzZSAzMC4qCi0gMTM0Ogk0NCA4MiAzZSAzMC4qCi0gMTM4Ogk2MiA4MCAzZSA0MC4qCi0gMTNjOgk2MiA4MiAzZSA0MC4qCi0gMTQwOgkwNCA4MSAzZSAzMC4qCi0gMTQ0OgkwNCA4MyAzZSAzMC4qCi0gMTQ4OgkwNCA4NSAzZSAzMC4qCi0gMTRjOgkwNCA4NyAzZSAzMC4qCi0gMTUwOgkyMiA4MSAzZSA0MC4qCi0gMTU0OgkyMiA4MyAzZSA0MC4qCi0gMTU4OgkyMiA4NSAzZSA0MC4qCi0gMTVjOgkyMiA4NyAzZSA0MC4qCi0gMTYwOgk0NCA4MSAzZSAzMC4qCi0gMTY0Ogk0NCA4MyAzZSAzMC4qCi0gMTY4Ogk2MiA4MSAzZSA0MC4qCi0gMTZjOgk2MiA4MyAzZSA0MC4qCi0gMTcwOgk4NCA4MCAzZSAzMC4qCi0gMTc0Ogk4NCA4MiAzZSAzMC4qCi0gMTc4Ogk4NCA4NCAzZSAzMC4qCi0gMTdjOgk4NCA4NiAzZSAzMC4qCi0gMTgwOglhMiA4MCAzZSA0MC4qCi0gMTg0OglhMiA4MiAzZSA0MC4qCi0gMTg4OglhMiA4NCAzZSA0MC4qCi0gMThjOglhMiA4NiAzZSA0MC4qCi0gMTkwOgljNCA4MCAzZSAzMC4qCi0gMTk0OgljNCA4MiAzZSAzMC4qCi0gMTk4OgllMiA4MCAzZSA0MC4qCi0gMTljOgllMiA4MiAzZSA0MC4qCi0gMWEwOgkwNiBlMCAzZSA0MC4qCi0gMWE0OgkwNiBlMiAzZSA0MC4qCi0gMWE4OgkyNiBlMiAzZSA0MC4qCi0gMWFjOgkwMiAyMCAzZSAzMS4qCi0gMWIwOgkwMiAyMiAzZSAzMS4qCi0gMWI0Ogk4MiAyMiAzZSAzMS4qCi0gMWI4OgkyMiAyMiAzZSAzMS4qCi0gMWJjOglhMiAyMiAzZSAzMS4qCi0gMWMwOgllNCBlMyAzMSA1Mi4qCi0gMWM0OgkwNCA4MCBiOCA0MS4qCi0gMWM4OgkwNCBhMCBiOCA0MS4qCi0gMWNjOgkwNCAwMCBiNCA0MS4qCi0gMWQwOgkwNCAyMCBiNCA0MS4qCi0gMWQ0OgkwNCA0MCBiNCA0MS4qCi0gMWQ4OgkwNCA2MCBiNCA0MS4qCi0gMWRjOgkwNCAwMCBiNSA0MS4qCi0gMWUwOgkwNCAyMCBiNSA0MS4qCi0gMWU0OgkwMCAwMCBmZiA0MS4qCi0gMWU4OgkwMSBlMCBiMiAxOC4qCi0gMWVjOgkwMSBlMCBiMiAxOC4qCi0gMWYwOgkwMSBjMCBiMyAxOC4qCi0gMWY0OgkwMSBhMCBiMyAxOC4qCi0gMWY4OgkwMSA2MCBiMyAxOC4qCi0gMWZjOgkwNiA4MCAzMCAyMC4qCi0gMjAwOgkwMCAyMCAzZiAyOS4qCi0gMjA0OgllMiAwMyAzMSA1Mi4qCi0gMjA4OgllOCAwNyBiMSAzMC4qCi0gMjBjOgllNCBjMyBiMSAzMC4qCi0gMjEwOgk4NCAwMSA3MSAzMS4qCi0gMjE0Ogk4NCAyMSA3MSAzMS4qCi0gMjE4Ogk4NCA0MSA3MSAzMS4qCi0gMjFjOgk4NCA2MSA3MSAzMS4qCi0gMjIwOgk4NCA4MSA3MSAzMS4qCi0gMjI0Ogk4NCBhMSA3MSAzMS4qCi0gMjI4Ogk4NCBjMSA3MSAzMS4qCi0gMjJjOgk4NCBlMSA3MSAzMS4qCi0gMjMwOgk4NCAwOSA3MSAzMS4qCi0gMjM0Ogk4NCAyOSA3MSAzMS4qCi0gMjM4Ogk4NCA0OSA3MSAzMS4qCi0gMjNjOgk4NCA2OSA3MSAzMS4qCi0gMjQwOgk4NCA4OSA3MSAzMS4qCi0gMjQ0Ogk4NCBhOSA3MSAzMS4qCi0gMjQ4Ogk4NCBjOSA3MSAzMS4qCi0gMjRjOgk4NCBlOSA3MSAzMS4qCi0gMjUwOgk4NCAwNSA3MSAzMS4qCi0gMjU0Ogk4NCAyNSA3MSAzMS4qCi0gMjU4Ogk4NCA0NSA3MSAzMS4qCi0gMjVjOgk4NCA2NSA3MSAzMS4qCi0gMjYwOgk4NCA4NSA3MSAzMS4qCi0gMjY0Ogk4NCBhNSA3MSAzMS4qCi0gMjY4Ogk4NCBjNSA3MSAzMS4qCi0gMjZjOgk4NCBlNSA3MSAzMS4qCi0gMjcwOgkwNCBhNCBiMSA0MS4qCi0gMjc0Ogk4NCAwZCA3MSAzMS4qCi0gMjc4Ogk4NCAyZCA3MSAzMS4qCi0gMjdjOgk4NCA0ZCA3MSAzMS4qCi0gMjgwOgk4NCA2ZCA3MSAzMS4qCi0gMjg0Ogk4NCA4ZCA3MSAzMS4qCi0gMjg4Ogk4NCBhZCA3MSAzMS4qCi0gMjhjOgk4NCBjZCA3MSAzMS4qCi0gMjkwOgk4NCBlZCA3MSAzMS4qCi0gMjk0OgkwNCA2NCBiMSA0MS4qCi0gMjk4OgkwNCAwMCBiNiA0MS4qCi0gMjljOgkwNCAyMCBiNiA0MS4qCi0gMmEwOgkwNCA0MCBiNiA0MS4qCi0gMmE0OgkwNCA2MCBiNiA0MS4qCi0gMmE4OgkwNyA0MCAzYiA0YS4qCi0gMmFjOgkwNyA2MCAzYiA0YS4qCi0gMmIwOgkwOCBhMCBiMCAyMS4qCi0gMmI0OgkwYSAyMCAzMCAwMC4qCi0gMmI4OgkwMiAwMCAzYyAwMS4qCi0gMmJjOgk4MiAwMCBiYyAwMS4qCi0gMmMwOglhMiAwMCBiYyAwMi4qCi0gMmM0OgkwNiBhMCA3MCAwMS4qCi0gMmM4OgkwNSAyMCBiMyAzOS4qCi0gMmNjOgkwNyBjMCAzMiA0YS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4OWRkMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBTaW1wbGUgcmVnaXN0ZXIgZm9ybXMKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IFRob3NlIGluc3RydWN0aW9ucyB3aGljaCBhbHNvIHVzZSBhbiBpbW1lZGlhdGUganVzdCB1c2UgYSBjb25zdGFudC4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA0IDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAudGV4dAotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDYgMDAwMDAwMDAgICAyOTNCMDAwMyAgICAgICAgIGFkZCAgICAgICAgICAgICByMyxyNCxyNQotICAgICAgICA3IDAwMDAwMDA0ICAgMjkzQjIwMDMgICAgICAgICBhZGR1ICAgICAgICAgICAgcjMscjQscjUKLSAgICAgICAgOCAwMDAwMDAwOCAgIDExMzIyMDA1ICAgICAgICAgYW5kICAgICAgICAgICAgIHI1LHI0LHIyCi0gICAgICAgIDkgMDAwMDAwMEMgICAxMTMyMjAwNSAgICAgICAgIGFuZC50dCAgICAgICAgICByNSxyNCxyMgotICAgICAgIDEwIDAwMDAwMDEwICAgNzMzMzAwMEEgICAgICAgICBhbmQuZmYgICAgICAgICAgcjEwLHIxMixyMTQKLSAgICAgICAxMSAwMDAwMDAxNCAgIDczMzI4MDBBICAgICAgICAgYW5kLmZ0ICAgICAgICAgIHIxMCxyMTIscjE0Ci0gICAgICAgMTIgMDAwMDAwMTggICA3MzMyNDAwQSAgICAgICAgIGFuZC50ZiAgICAgICAgICByMTAscjEyLHIxNAotICAgICAgIDEzIDAwMDAwMDFDICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgICAgICAgICAgcjEwLHI4LGxvLncKLSAgICAgICAxNCAwMDAwMDAyMCAgIEZBMzk2MDBBICAgICAgICAgYmJvLmEgICAgICAgICAgIHIxMCxyOCxlcS5iCi0gICAgICAgMTUgMDAwMDAwMjQgICAyMjM5MDAwQSAgICAgICAgIGJieiAgICAgICAgICAgICByMTAscjgsbHMudwotICAgICAgIDE2IDAwMDAwMDI4ICAgMkEzOTIwMEEgICAgICAgICBiYnouYSAgICAgICAgICAgcjEwLHI4LGhpLncKLSAgICAgICAxNyAwMDAwMDAyQyAgIDIxQjk4MDA0ICAgICAgICAgYmNuZCAgICAgICAgICAgIHI0LHI2LGx0MC5iCi0gICAgICAgMTggMDAwMDAwMzAgICAyMUI5QTAwNCAgICAgICAgIGJjbmQuYSAgICAgICAgICByNCxyNixsdDAuYgotICAgICAgIDE5IDAwMDAwMDM0ICAgMDAzOTAwMDYgICAgICAgICBiciAgICAgICAgICAgICAgcjYKLSAgICAgICAyMCAwMDAwMDAzOCAgIDAwMzkyMDA2ICAgICAgICAgYnIuYSAgICAgICAgICAgIHI2Ci0gICAgICAgMjEgMDAwMDAwM0MgICAwMDAzMDAwQSAgICAgICAgIGJyY3IgICAgICAgICAgICAxMAotICAgICAgIDIyIDAwMDAwMDQwICAgRjgzODAwMDYgICAgICAgICBic3IgICAgICAgICAgICAgcjYscjMxCi0gICAgICAgMjMgMDAwMDAwNDQgICBGODM4MjAwNiAgICAgICAgIGJzci5hICAgICAgICAgICByNixyMzEKLSAgICAgICAyNCAwMDAwMDA0OCAgIDAwMzA0MDA3ICAgICAgICAgY21uZCAgICAgICAgICAgIHI3Ci0gICAgICAgMjUgMDAwMDAwNEMgICAyOTNBMDAwMyAgICAgICAgIGNtcCAgICAgICAgICAgICByMyxyNCxyNQotICAgICAgIDI2IDAwMDAwMDUwICAgMDJCNzAwMDggICAgICAgICBkY2FjaGVjICAgICAgICAgcjgocjEwKQotICAgICAgIDI3IDAwMDAwMDU0ICAgMEFCNzAwMDggICAgICAgICBkY2FjaGVmICAgICAgICAgcjgocjEwKQotICAgICAgIDI4IDAwMDAwMDU4ICAgNDFCNDA0MDQgICAgICAgICBkbGQuYiAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMjkgMDAwMDAwNUMgICA0MUI0MjQwNCAgICAgICAgIGRsZC5oICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzMCAwMDAwMDA2MCAgIDQxQjQ0NDA0ICAgICAgICAgZGxkICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDMxIDAwMDAwMDY0ICAgNDFCNDY0MDQgICAgICAgICBkbGQuZCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzIgMDAwMDAwNjggICA0MUI1MDQwNCAgICAgICAgIGRsZC51YiAgICAgICAgICByNChyNikscjgKLSAgICAgICAzMyAwMDAwMDA2QyAgIDQxQjUyNDA0ICAgICAgICAgZGxkLnVoICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDM0IDAwMDAwMDcwICAgNDFCNjA0MDQgICAgICAgICBkc3QuYiAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzUgMDAwMDAwNzQgICA0MUI2MjQwNCAgICAgICAgIGRzdC5oICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzNiAwMDAwMDA3OCAgIDQxQjY0NDA0ICAgICAgICAgZHN0ICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDM3IDAwMDAwMDdDICAgNDFCNjY0MDQgICAgICAgICBkc3QuZCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzggMDAwMDAwODAgICAwODMwMjAwNSAgICAgICAgIGV0cmFwICAgICAgICAgICByNQotICAgICAgIDM5IDAwMDAwMDg0ICAgMzE3MTQ3RTMgICAgICAgICBleHRzICAgICAgICAgICAgcjMsMzEscjUscjYKLSAgICAgICA0MCAwMDAwMDA4OCAgIDQ5NzEwN0MyICAgICAgICAgZXh0dSAgICAgICAgICAgIHIyLDMwLHI1LHI5Ci0gICAgICAgNDEgMDAwMDAwOEMgICAzMTNFMDAwMiAgICAgICAgIGZhZGQuc3NzICAgICAgICByMixyNCxyNgotICAgICAgIDQyIDAwMDAwMDkwICAgMzEzRTAyMDIgICAgICAgICBmYWRkLnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA0MyAwMDAwMDA5NCAgIDMxM0UwMjgyICAgICAgICAgZmFkZC5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNDQgMDAwMDAwOTggICAzMTNFMDIyMiAgICAgICAgIGZhZGQuZHNkICAgICAgICByMixyNCxyNgotICAgICAgIDQ1IDAwMDAwMDlDICAgMzEzRTAyQTIgICAgICAgICBmYWRkLmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA0NiAwMDAwMDBBMCAgIDQxQkVBMDA0ICAgICAgICAgZmNtcC5zcyAgICAgICAgIHI0LHI2LHI4Ci0gICAgICAgNDcgMDAwMDAwQTQgICA0MUJFQTA4NCAgICAgICAgIGZjbXAuc2QgICAgICAgICByNCxyNixyOAotICAgICAgIDQ4IDAwMDAwMEE4ICAgNDFCRUEwMjQgICAgICAgICBmY21wLmRzICAgICAgICAgcjQscjYscjgKLSAgICAgICA0OSAwMDAwMDBBQyAgIDQxQkVBMEE0ICAgICAgICAgZmNtcC5kZCAgICAgICAgIHI0LHI2LHI4Ci0gICAgICAgNTAgMDAwMDAwQjAgICAzMTNFNjAwMiAgICAgICAgIGZkaXYuc3NzICAgICAgICByMixyNCxyNgotICAgICAgIDUxIDAwMDAwMEI0ICAgMzEzRTYyMDIgICAgICAgICBmZGl2LnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1MiAwMDAwMDBCOCAgIDMxM0U2MjgyICAgICAgICAgZmRpdi5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTMgMDAwMDAwQkMgICAzMTNFNjIyMiAgICAgICAgIGZkaXYuZHNkICAgICAgICByMixyNCxyNgotICAgICAgIDU0IDAwMDAwMEMwICAgMzEzRTYyQTIgICAgICAgICBmZGl2LmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1NSAwMDAwMDBDNCAgIDMxM0U0MDAyICAgICAgICAgZm1weS5zc3MgICAgICAgIHIyLHI0LHI2Ci0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICA1NiAwMDAwMDBDOCAgIDMxM0U0MjAyICAgICAgICAgZm1weS5zc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTcgMDAwMDAwQ0MgICAzMTNFNDI4MiAgICAgICAgIGZtcHkuc2RkICAgICAgICByMixyNCxyNgotICAgICAgIDU4IDAwMDAwMEQwICAgMzEzRTQyMjIgICAgICAgICBmbXB5LmRzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1OSAwMDAwMDBENCAgIDMxM0U0MkEyICAgICAgICAgZm1weS5kZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNjAgMDAwMDAwRDggICAzMTNFNDU0MiAgICAgICAgIGZtcHkuaWlpICAgICAgICByMixyNCxyNgotICAgICAgIDYxIDAwMDAwMERDICAgMzEzRTQ3RTIgICAgICAgICBmbXB5LnV1dSAgICAgICAgcjIscjQscjYKLSAgICAgICA2MiAwMDAwMDBFMCAgIDMwM0U4MTg0ICAgICAgICAgZnJuZG0uc3MgICAgICAgIHI0LHI2Ci0gICAgICAgNjMgMDAwMDAwRTQgICAzMDNFODM4NCAgICAgICAgIGZybmRtLnNkICAgICAgICByNCxyNgotICAgICAgIDY0IDAwMDAwMEU4ICAgMzAzRTg1ODQgICAgICAgICBmcm5kbS5zaSAgICAgICAgcjQscjYKLSAgICAgICA2NSAwMDAwMDBFQyAgIDMwM0U4Nzg0ICAgICAgICAgZnJuZG0uc3UgICAgICAgIHI0LHI2Ci0gICAgICAgNjYgMDAwMDAwRjAgICA0MDNFODFBMiAgICAgICAgIGZybmRtLmRzICAgICAgICByMixyOAotICAgICAgIDY3IDAwMDAwMEY0ICAgNDAzRTgzQTIgICAgICAgICBmcm5kbS5kZCAgICAgICAgcjIscjgKLSAgICAgICA2OCAwMDAwMDBGOCAgIDQwM0U4NUEyICAgICAgICAgZnJuZG0uZGkgICAgICAgIHIyLHI4Ci0gICAgICAgNjkgMDAwMDAwRkMgICA0MDNFODdBMiAgICAgICAgIGZybmRtLmR1ICAgICAgICByMixyOAotICAgICAgIDcwIDAwMDAwMTAwICAgMzAzRTgxQzQgICAgICAgICBmcm5kbS5pcyAgICAgICAgcjQscjYKLSAgICAgICA3MSAwMDAwMDEwNCAgIDMwM0U4M0M0ICAgICAgICAgZnJuZG0uaWQgICAgICAgIHI0LHI2Ci0gICAgICAgNzIgMDAwMDAxMDggICA0MDNFODFFMiAgICAgICAgIGZybmRtLnVzICAgICAgICByMixyOAotICAgICAgIDczIDAwMDAwMTBDICAgNDAzRTgzRTIgICAgICAgICBmcm5kbS51ZCAgICAgICAgcjIscjgKLSAgICAgICA3NCAwMDAwMDExMCAgIDMwM0U4MDA0ICAgICAgICAgZnJuZG4uc3MgICAgICAgIHI0LHI2Ci0gICAgICAgNzUgMDAwMDAxMTQgICAzMDNFODIwNCAgICAgICAgIGZybmRuLnNkICAgICAgICByNCxyNgotICAgICAgIDc2IDAwMDAwMTE4ICAgMzAzRTg0MDQgICAgICAgICBmcm5kbi5zaSAgICAgICAgcjQscjYKLSAgICAgICA3NyAwMDAwMDExQyAgIDMwM0U4NjA0ICAgICAgICAgZnJuZG4uc3UgICAgICAgIHI0LHI2Ci0gICAgICAgNzggMDAwMDAxMjAgICA0MDNFODAyMiAgICAgICAgIGZybmRuLmRzICAgICAgICByMixyOAotICAgICAgIDc5IDAwMDAwMTI0ICAgNDAzRTgyMjIgICAgICAgICBmcm5kbi5kZCAgICAgICAgcjIscjgKLSAgICAgICA4MCAwMDAwMDEyOCAgIDQwM0U4NDIyICAgICAgICAgZnJuZG4uZGkgICAgICAgIHIyLHI4Ci0gICAgICAgODEgMDAwMDAxMkMgICA0MDNFODYyMiAgICAgICAgIGZybmRuLmR1ICAgICAgICByMixyOAotICAgICAgIDgyIDAwMDAwMTMwICAgMzAzRTgwNDQgICAgICAgICBmcm5kbi5pcyAgICAgICAgcjQscjYKLSAgICAgICA4MyAwMDAwMDEzNCAgIDMwM0U4MjQ0ICAgICAgICAgZnJuZG4uaWQgICAgICAgIHI0LHI2Ci0gICAgICAgODQgMDAwMDAxMzggICA0MDNFODA2MiAgICAgICAgIGZybmRuLnVzICAgICAgICByMixyOAotICAgICAgIDg1IDAwMDAwMTNDICAgNDAzRTgyNjIgICAgICAgICBmcm5kbi51ZCAgICAgICAgcjIscjgKLSAgICAgICA4NiAwMDAwMDE0MCAgIDMwM0U4MTA0ICAgICAgICAgZnJuZHAuc3MgICAgICAgIHI0LHI2Ci0gICAgICAgODcgMDAwMDAxNDQgICAzMDNFODMwNCAgICAgICAgIGZybmRwLnNkICAgICAgICByNCxyNgotICAgICAgIDg4IDAwMDAwMTQ4ICAgMzAzRTg1MDQgICAgICAgICBmcm5kcC5zaSAgICAgICAgcjQscjYKLSAgICAgICA4OSAwMDAwMDE0QyAgIDMwM0U4NzA0ICAgICAgICAgZnJuZHAuc3UgICAgICAgIHI0LHI2Ci0gICAgICAgOTAgMDAwMDAxNTAgICA0MDNFODEyMiAgICAgICAgIGZybmRwLmRzICAgICAgICByMixyOAotICAgICAgIDkxIDAwMDAwMTU0ICAgNDAzRTgzMjIgICAgICAgICBmcm5kcC5kZCAgICAgICAgcjIscjgKLSAgICAgICA5MiAwMDAwMDE1OCAgIDQwM0U4NTIyICAgICAgICAgZnJuZHAuZGkgICAgICAgIHIyLHI4Ci0gICAgICAgOTMgMDAwMDAxNUMgICA0MDNFODcyMiAgICAgICAgIGZybmRwLmR1ICAgICAgICByMixyOAotICAgICAgIDk0IDAwMDAwMTYwICAgMzAzRTgxNDQgICAgICAgICBmcm5kcC5pcyAgICAgICAgcjQscjYKLSAgICAgICA5NSAwMDAwMDE2NCAgIDMwM0U4MzQ0ICAgICAgICAgZnJuZHAuaWQgICAgICAgIHI0LHI2Ci0gICAgICAgOTYgMDAwMDAxNjggICA0MDNFODE2MiAgICAgICAgIGZybmRwLnVzICAgICAgICByMixyOAotICAgICAgIDk3IDAwMDAwMTZDICAgNDAzRTgzNjIgICAgICAgICBmcm5kcC51ZCAgICAgICAgcjIscjgKLSAgICAgICA5OCAwMDAwMDE3MCAgIDMwM0U4MDg0ICAgICAgICAgZnJuZHouc3MgICAgICAgIHI0LHI2Ci0gICAgICAgOTkgMDAwMDAxNzQgICAzMDNFODI4NCAgICAgICAgIGZybmR6LnNkICAgICAgICByNCxyNgotICAgICAgMTAwIDAwMDAwMTc4ICAgMzAzRTg0ODQgICAgICAgICBmcm5kei5zaSAgICAgICAgcjQscjYKLSAgICAgIDEwMSAwMDAwMDE3QyAgIDMwM0U4Njg0ICAgICAgICAgZnJuZHouc3UgICAgICAgIHI0LHI2Ci0gICAgICAxMDIgMDAwMDAxODAgICA0MDNFODBBMiAgICAgICAgIGZybmR6LmRzICAgICAgICByMixyOAotICAgICAgMTAzIDAwMDAwMTg0ICAgNDAzRTgyQTIgICAgICAgICBmcm5kei5kZCAgICAgICAgcjIscjgKLSAgICAgIDEwNCAwMDAwMDE4OCAgIDQwM0U4NEEyICAgICAgICAgZnJuZHouZGkgICAgICAgIHIyLHI4Ci0gICAgICAxMDUgMDAwMDAxOEMgICA0MDNFODZBMiAgICAgICAgIGZybmR6LmR1ICAgICAgICByMixyOAotICAgICAgMTA2IDAwMDAwMTkwICAgMzAzRTgwQzQgICAgICAgICBmcm5kei5pcyAgICAgICAgcjQscjYKLSAgICAgIDEwNyAwMDAwMDE5NCAgIDMwM0U4MkM0ICAgICAgICAgZnJuZHouaWQgICAgICAgIHI0LHI2Ci0gICAgICAxMDggMDAwMDAxOTggICA0MDNFODBFMiAgICAgICAgIGZybmR6LnVzICAgICAgICByMixyOAotICAgICAgMTA5IDAwMDAwMTlDICAgNDAzRTgyRTIgICAgICAgICBmcm5kei51ZCAgICAgICAgcjIscjgKLSAgICAgIDExMCAwMDAwMDFBMCAgIDQwM0VFMDA2ICAgICAgICAgZnNxcnQuc3MgICAgICAgIHI2LHI4Ci0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAzCi0KLSAgICAgIDExMSAwMDAwMDFBNCAgIDQwM0VFMjA2ICAgICAgICAgZnNxcnQuc2QgICAgICAgIHI2LHI4Ci0gICAgICAxMTIgMDAwMDAxQTggICA0MDNFRTIyNiAgICAgICAgIGZzcXJ0LmRkICAgICAgICByNixyOAotICAgICAgMTEzIDAwMDAwMUFDICAgMzEzRTIwMDIgICAgICAgICBmc3ViLnNzcyAgICAgICAgcjIscjQscjYKLSAgICAgIDExNCAwMDAwMDFCMCAgIDMxM0UyMjAyICAgICAgICAgZnN1Yi5zc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAxMTUgMDAwMDAxQjQgICAzMTNFMjI4MiAgICAgICAgIGZzdWIuc2RkICAgICAgICByMixyNCxyNgotICAgICAgMTE2IDAwMDAwMUI4ICAgMzEzRTIyMjIgICAgICAgICBmc3ViLmRzZCAgICAgICAgcjIscjQscjYKLSAgICAgIDExNyAwMDAwMDFCQyAgIDMxM0UyMkEyICAgICAgICAgZnN1Yi5kZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAxMTggMDAwMDAxQzAgICA1MjMxRTNFNCAgICAgICAgIGlucyAgICAgICAgICAgICByNCwzMSxyOCxyMTAKLSAgICAgIDExOSAwMDAwMDFDNCAgIDQxQjg4MDA0ICAgICAgICAganNyICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTIwIDAwMDAwMUM4ICAgNDFCOEEwMDQgICAgICAgICBqc3IuYSAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjEgMDAwMDAxQ0MgICA0MUI0MDAwNCAgICAgICAgIGxkLmIgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyMiAwMDAwMDFEMCAgIDQxQjQyMDA0ICAgICAgICAgbGQuaCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTIzIDAwMDAwMUQ0ICAgNDFCNDQwMDQgICAgICAgICBsZCAgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjQgMDAwMDAxRDggICA0MUI0NjAwNCAgICAgICAgIGxkLmQgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyNSAwMDAwMDFEQyAgIDQxQjUwMDA0ICAgICAgICAgbGQudWIgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTI2IDAwMDAwMUUwICAgNDFCNTIwMDQgICAgICAgICBsZC51aCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjcgMDAwMDAxRTQgICA0MUZGMDAwNyAgICAgICAgIGxtbyAgICAgICAgICAgICByNyxyOAotICAgICAgMTI4IDAwMDAwMUU4ICAgMThCMkUwMDEgICAgICAgICBvciAgICAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEyOSAwMDAwMDFFQyAgIDE4QjJFMDAxICAgICAgICAgb3IudHQgICAgICAgICAgIHIxLHIyLHIzCi0gICAgICAxMzAgMDAwMDAxRjAgICAxOEIzQzAwMSAgICAgICAgIG9yLmZmICAgICAgICAgICByMSxyMixyMwotICAgICAgMTMxIDAwMDAwMUY0ICAgMThCM0EwMDEgICAgICAgICBvci5mdCAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEzMiAwMDAwMDFGOCAgIDE4QjM2MDAxICAgICAgICAgb3IudGYgICAgICAgICAgIHIxLHIyLHIzCi0gICAgICAxMzMgMDAwMDAxRkMgICAyMDMwODAwNiAgICAgICAgIHJkY3IgICAgICAgICAgICByNixyNAotICAgICAgMTM0IDAwMDAwMjAwICAgMjkzRjIwMDQgICAgICAgICBybW8gICAgICAgICAgICAgcjQscjUKLSAgICAgIDEzNSAwMDAwMDIwNCAgIDUyMzEwM0UyICAgICAgICAgcm90bCAgICAgICAgICAgIHIyLDMxLHI4LHIxMAotICAgICAgMTM2IDAwMDAwMjA4ICAgMzBCMTA3RTggICAgICAgICByb3RyICAgICAgICAgICAgcjgsMzEscjIscjYKLSAgICAgIDEzNyAwMDAwMDIwQyAgIDMwQjFDM0U0ICAgICAgICAgc2hsICAgICAgICAgICAgIHI0LDMxLHIyLHI2Ci0gICAgICAxMzggMDAwMDAyMTAgICAzMTcxMDE4NCAgICAgICAgIHNsLmR6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTM5IDAwMDAwMjE0ICAgMzE3MTIxODQgICAgICAgICBzbC5kbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0MCAwMDAwMDIxOCAgIDMxNzE0MTg0ICAgICAgICAgc2wuZHMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDEgMDAwMDAyMUMgICAzMTcxNjE4NCAgICAgICAgIHNsLmV6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQyIDAwMDAwMjIwICAgMzE3MTgxODQgICAgICAgICBzbC5lbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0MyAwMDAwMDIyNCAgIDMxNzFBMTg0ICAgICAgICAgc2wuZXMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDQgMDAwMDAyMjggICAzMTcxQzE4NCAgICAgICAgIHNsLml6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ1IDAwMDAwMjJDICAgMzE3MUUxODQgICAgICAgICBzbC5pbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0NiAwMDAwMDIzMCAgIDMxNzEwOTg0ICAgICAgICAgc2xpLmR6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDcgMDAwMDAyMzQgICAzMTcxMjk4NCAgICAgICAgIHNsaS5kbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ4IDAwMDAwMjM4ICAgMzE3MTQ5ODQgICAgICAgICBzbGkuZHMgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0OSAwMDAwMDIzQyAgIDMxNzE2OTg0ICAgICAgICAgc2xpLmV6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTAgMDAwMDAyNDAgICAzMTcxODk4NCAgICAgICAgIHNsaS5lbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTUxIDAwMDAwMjQ0ICAgMzE3MUE5ODQgICAgICAgICBzbGkuZXMgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1MiAwMDAwMDI0OCAgIDMxNzFDOTg0ICAgICAgICAgc2xpLml6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTMgMDAwMDAyNEMgICAzMTcxRTk4NCAgICAgICAgIHNsaS5pbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU0IDAwMDAwMjUwICAgMzE3MTA1ODQgICAgICAgICBzci5keiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1NSAwMDAwMDI1NCAgIDMxNzEyNTg0ICAgICAgICAgc3IuZG0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTYgMDAwMDAyNTggICAzMTcxNDU4NCAgICAgICAgIHNyLmRzICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU3IDAwMDAwMjVDICAgMzE3MTY1ODQgICAgICAgICBzci5leiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1OCAwMDAwMDI2MCAgIDMxNzE4NTg0ICAgICAgICAgc3IuZW0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTkgMDAwMDAyNjQgICAzMTcxQTU4NCAgICAgICAgIHNyLmVzICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTYwIDAwMDAwMjY4ICAgMzE3MUM1ODQgICAgICAgICBzci5peiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2MSAwMDAwMDI2QyAgIDMxNzFFNTg0ICAgICAgICAgc3IuaW0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjIgMDAwMDAyNzAgICA0MUIxQTQwNCAgICAgICAgIHNyYSAgICAgICAgICAgICByNCwzMixyNixyOAotICAgICAgMTYzIDAwMDAwMjc0ICAgMzE3MTBEODQgICAgICAgICBzcmkuZHogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2NCAwMDAwMDI3OCAgIDMxNzEyRDg0ICAgICAgICAgc3JpLmRtICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjUgMDAwMDAyN0MgICAzMTcxNEQ4NCAgICAgICAgIHNyaS5kcyAgICAgICAgICByNCwxMixyNSxyNgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgNAotCi0gICAgICAxNjYgMDAwMDAyODAgICAzMTcxNkQ4NCAgICAgICAgIHNyaS5leiAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTY3IDAwMDAwMjg0ICAgMzE3MThEODQgICAgICAgICBzcmkuZW0gICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2OCAwMDAwMDI4OCAgIDMxNzFBRDg0ICAgICAgICAgc3JpLmVzICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjkgMDAwMDAyOEMgICAzMTcxQ0Q4NCAgICAgICAgIHNyaS5peiAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTcwIDAwMDAwMjkwICAgMzE3MUVEODQgICAgICAgICBzcmkuaW0gICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE3MSAwMDAwMDI5NCAgIDQxQjE2NDA0ICAgICAgICAgc3JsICAgICAgICAgICAgIHI0LDMyLHI2LHI4Ci0gICAgICAxNzIgMDAwMDAyOTggICA0MUI2MDAwNCAgICAgICAgIHN0LmIgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDE3MyAwMDAwMDI5QyAgIDQxQjYyMDA0ICAgICAgICAgc3QuaCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTc0IDAwMDAwMkEwICAgNDFCNjQwMDQgICAgICAgICBzdCAgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxNzUgMDAwMDAyQTQgICA0MUI2NjAwNCAgICAgICAgIHN0LmQgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDE3NiAwMDAwMDJBOCAgIDRBM0I0MDA3ICAgICAgICAgc3ViICAgICAgICAgICAgIHI3LHI4LHI5Ci0gICAgICAxNzcgMDAwMDAyQUMgICA0QTNCNjAwNyAgICAgICAgIHN1YnUgICAgICAgICAgICByNyxyOCxyOQotICAgICAgMTc4IDAwMDAwMkIwICAgMjFCMEEwMDggICAgICAgICBzd2NyICAgICAgICAgICAgcjgscjYscjQKLSAgICAgIDE3OSAwMDAwMDJCNCAgIDAwMzAyMDBBICAgICAgICAgdHJhcCAgICAgICAgICAgIHIxMAotICAgICAgMTgwIDAwMDAwMkI4ICAgMDEzQzAwMDIgICAgICAgICB2YWRkLnNzICAgICAgICAgcjIscjQscjQKLSAgICAgIDE4MSAwMDAwMDJCQyAgIDAxQkMwMDgyICAgICAgICAgdmFkZC5zZCAgICAgICAgIHIyLHI2LHI2Ci0gICAgICAxODIgMDAwMDAyQzAgICAwMkJDMDBBMiAgICAgICAgIHZhZGQuZGQgICAgICAgICByMixyMTAscjEwCi0gICAgICAxODMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDAucyAgICAgICAgICByNgotICAgICAgMTg0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bGQxLnMgICAgICAgICAgcjcKLSAgICAgIDE4NSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMC5kICAgICAgICAgIHI2Ci0gICAgICAxODYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDEuZCAgICAgICAgICByOAotICAgICAgMTg3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksMCxhMwotICAgICAgMTg4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksMCxyMTAKLSAgICAgIDE4OSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc3MgICAgICAgIHI3LHI5LGExLGEzCi0gICAgICAxOTAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSxhMyxyMTAKLSAgICAgIDE5MSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LDAsYTAKLSAgICAgIDE5MiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LDAscjEwCi0gICAgICAxOTMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NkICAgICAgICByNyxyOSxhMSxhMgotICAgICAgMTk0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksYTMscjEwCi0gICAgICAxOTUgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtcHkuc3MgICAgICAgICByMSxyMyxyMwotICAgICAgMTk2ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXB5LnNkICAgICAgICAgcjUscjYscjYKLSAgICAgIDE5NyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1weS5kZCAgICAgICAgIHIyLHI0LHI0Ci0gICAgICAxOTggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSwwLGEwCi0gICAgICAxOTkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSwwLHIxMAotICAgICAgMjAwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzcyAgICAgICAgcjcscjksYTAsYTEKLSAgICAgIDIwMSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LGEzLHIxMAotICAgICAgMjAyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksMCxhMAotICAgICAgMjAzICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksMCxyMTAKLSAgICAgIDIwNCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc2QgICAgICAgIHI3LHI5LGEwLGExCi0gICAgICAyMDUgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSxhMyxyMTAKLSAgICAgIDIwNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc3MgICAgICAgIHI2LGEyLGE0Ci0gICAgICAyMDcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc3ViLnNkICAgICAgICByNixhMixhNAotICAgICAgMjA4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zcyAgICAgICAgcjQsYTQscjYKLSAgICAgIDIwOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc2QgICAgICAgIHI0LGE0LHI2Ci0gICAgICAyMTAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2kgICAgICAgICByNCxyNgotICAgICAgMjExICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNpICAgICAgICAgcjQsYTAKLSAgICAgIDIxMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zdSAgICAgICAgIHI0LHI2Ci0gICAgICAyMTMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc3UgICAgICAgICByNCxhMAotICAgICAgMjE0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNzICAgICAgICAgcjQscjYKLSAgICAgIDIxNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zcyAgICAgICAgIHI0LGEwCi0gICAgICAyMTYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2QgICAgICAgICByNCxyNgotICAgICAgMjE3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNkICAgICAgICAgcjQsYTAKLSAgICAgIDIxOCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kaSAgICAgICAgIHI0LHI2Ci0gICAgICAyMTkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZGkgICAgICAgICByNCxhMAotICAgICAgMjIwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmR1ICAgICAgICAgcjQscjYKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDUKLQotICAgICAgMjIxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmR1ICAgICAgICAgcjQsYTAKLSAgICAgIDIyMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kcyAgICAgICAgIHI0LHI2Ci0gICAgICAyMjMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHMgICAgICAgICByNCxhMAotICAgICAgMjI0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRkICAgICAgICAgcjQscjYKLSAgICAgIDIyNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kZCAgICAgICAgIHI0LGEwCi0gICAgICAyMjYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuaXMgICAgICAgICByNCxyNgotICAgICAgMjI3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmlkICAgICAgICAgcjQscjYKLSAgICAgIDIyOCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC51cyAgICAgICAgIHI0LHI2Ci0gICAgICAyMjkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQudWQgICAgICAgICByNCxyNgotICAgICAgMjMwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3QucyAgICAgICAgICAgcjYKLSAgICAgIDIzMSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN0LmQgICAgICAgICAgIHI2Ci0gICAgICAyMzIgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdWIuc3MgICAgICAgICByMixyNCxyNgotICAgICAgMjMzICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3ViLnNkICAgICAgICAgcjIscjQscjYKLSAgICAgIDIzNCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN1Yi5kZCAgICAgICAgIHIyLHI0LHI2Ci0gICAgICAyMzUgMDAwMDAyQzQgICAwMTcwQTAwNiAgICAgICAgIHdyY3IgICAgICAgICAgICByNixyNQotICAgICAgMjM2IDAwMDAwMkM4ICAgMzlCMzIwMDUgICAgICAgICB4bm9yICAgICAgICAgICAgcjUscjYscjcKLSAgICAgIDIzNyAwMDAwMDJDQyAgIDRBMzJDMDA3ICAgICAgICAgeG9yICAgICAgICAgICAgIHI3LHI4LHI5Ci0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmOTM1Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi07OyBTaW1wbGUgcmVnaXN0ZXIgZm9ybXMKLTs7IFRob3NlIGluc3RydWN0aW9ucyB3aGljaCBhbHNvIHVzZSBhbiBpbW1lZGlhdGUganVzdCB1c2UgYSBjb25zdGFudC4KLQotCS50ZXh0Ci0KLQlhZGQJCXIzLHI0LHI1Ci0JYWRkdQkJcjMscjQscjUKLQlhbmQJCXI1LHI0LHIyCi0JYW5kLnR0CQlyNSxyNCxyMgotCWFuZC5mZgkJcjEwLHIxMixyMTQKLQlhbmQuZnQJCXIxMCxyMTIscjE0Ci0JYW5kLnRmCQlyMTAscjEyLHIxNAotCWJibwkJcjEwLHI4LGxvLncKLQliYm8uYQkJcjEwLHI4LGVxLmIKLQliYnoJCXIxMCxyOCxscy53Ci0JYmJ6LmEJCXIxMCxyOCxoaS53Ci0JYmNuZAkJcjQscjYsbHQwLmIKLQliY25kLmEJCXI0LHI2LGx0MC5iCi0JYnIJCXI2Ci0JYnIuYQkJcjYKLQlicmNyCQkxMAotCWJzcgkJcjYscjMxCi0JYnNyLmEJCXI2LHIzMQotCWNtbmQJCXI3Ci0JY21wCQlyMyxyNCxyNQotCWRjYWNoZWMJCXI4KHIxMCkKLQlkY2FjaGVmCQlyOChyMTApCi0JZGxkLmIJCXI0KHI2KSxyOAotCWRsZC5oCQlyNChyNikscjgKLQlkbGQJCXI0KHI2KSxyOAotCWRsZC5kCQlyNChyNikscjgKLQlkbGQudWIJCXI0KHI2KSxyOAotCWRsZC51aAkJcjQocjYpLHI4Ci0JZHN0LmIJCXI0KHI2KSxyOAotCWRzdC5oCQlyNChyNikscjgKLQlkc3QJCXI0KHI2KSxyOAotCWRzdC5kCQlyNChyNikscjgKLQlldHJhcAkJcjUKLQlleHRzCQlyMywzMSxyNSxyNgotCWV4dHUJCXIyLDMwLHI1LHI5Ci0JZmFkZC5zc3MJcjIscjQscjYKLQlmYWRkLnNzZAlyMixyNCxyNgotCWZhZGQuc2RkCXIyLHI0LHI2Ci0JZmFkZC5kc2QJcjIscjQscjYKLQlmYWRkLmRkZAlyMixyNCxyNgotCWZjbXAuc3MJCXI0LHI2LHI4Ci0JZmNtcC5zZAkJcjQscjYscjgKLQlmY21wLmRzCQlyNCxyNixyOAotCWZjbXAuZGQJCXI0LHI2LHI4Ci0JZmRpdi5zc3MJcjIscjQscjYKLQlmZGl2LnNzZAlyMixyNCxyNgotCWZkaXYuc2RkCXIyLHI0LHI2Ci0JZmRpdi5kc2QJcjIscjQscjYKLQlmZGl2LmRkZAlyMixyNCxyNgotCWZtcHkuc3NzCXIyLHI0LHI2Ci0JZm1weS5zc2QJcjIscjQscjYKLQlmbXB5LnNkZAlyMixyNCxyNgotCWZtcHkuZHNkCXIyLHI0LHI2Ci0JZm1weS5kZGQJcjIscjQscjYKLQlmbXB5LmlpaQlyMixyNCxyNgotCWZtcHkudXV1CXIyLHI0LHI2Ci0JZnJuZG0uc3MJcjQscjYKLQlmcm5kbS5zZAlyNCxyNgotCWZybmRtLnNpCXI0LHI2Ci0JZnJuZG0uc3UJcjQscjYKLQlmcm5kbS5kcwlyMixyOAotCWZybmRtLmRkCXIyLHI4Ci0JZnJuZG0uZGkJcjIscjgKLQlmcm5kbS5kdQlyMixyOAotCWZybmRtLmlzCXI0LHI2Ci0JZnJuZG0uaWQJcjQscjYKLQlmcm5kbS51cwlyMixyOAotCWZybmRtLnVkCXIyLHI4Ci0JZnJuZG4uc3MJcjQscjYKLQlmcm5kbi5zZAlyNCxyNgotCWZybmRuLnNpCXI0LHI2Ci0JZnJuZG4uc3UJcjQscjYKLQlmcm5kbi5kcwlyMixyOAotCWZybmRuLmRkCXIyLHI4Ci0JZnJuZG4uZGkJcjIscjgKLQlmcm5kbi5kdQlyMixyOAotCWZybmRuLmlzCXI0LHI2Ci0JZnJuZG4uaWQJcjQscjYKLQlmcm5kbi51cwlyMixyOAotCWZybmRuLnVkCXIyLHI4Ci0JZnJuZHAuc3MJcjQscjYKLQlmcm5kcC5zZAlyNCxyNgotCWZybmRwLnNpCXI0LHI2Ci0JZnJuZHAuc3UJcjQscjYKLQlmcm5kcC5kcwlyMixyOAotCWZybmRwLmRkCXIyLHI4Ci0JZnJuZHAuZGkJcjIscjgKLQlmcm5kcC5kdQlyMixyOAotCWZybmRwLmlzCXI0LHI2Ci0JZnJuZHAuaWQJcjQscjYKLQlmcm5kcC51cwlyMixyOAotCWZybmRwLnVkCXIyLHI4Ci0JZnJuZHouc3MJcjQscjYKLQlmcm5kei5zZAlyNCxyNgotCWZybmR6LnNpCXI0LHI2Ci0JZnJuZHouc3UJcjQscjYKLQlmcm5kei5kcwlyMixyOAotCWZybmR6LmRkCXIyLHI4Ci0JZnJuZHouZGkJcjIscjgKLQlmcm5kei5kdQlyMixyOAotCWZybmR6LmlzCXI0LHI2Ci0JZnJuZHouaWQJcjQscjYKLQlmcm5kei51cwlyMixyOAotCWZybmR6LnVkCXIyLHI4Ci0JZnNxcnQuc3MJcjYscjgKLQlmc3FydC5zZAlyNixyOAotCWZzcXJ0LmRkCXI2LHI4Ci0JZnN1Yi5zc3MJcjIscjQscjYKLQlmc3ViLnNzZAlyMixyNCxyNgotCWZzdWIuc2RkCXIyLHI0LHI2Ci0JZnN1Yi5kc2QJcjIscjQscjYKLQlmc3ViLmRkZAlyMixyNCxyNgotCWlucwkJcjQsMzEscjgscjEwCi0JanNyCQlyNChyNikscjgKLQlqc3IuYQkJcjQocjYpLHI4Ci0JbGQuYgkJcjQocjYpLHI4Ci0JbGQuaAkJcjQocjYpLHI4Ci0JbGQJCXI0KHI2KSxyOAotCWxkLmQJCXI0KHI2KSxyOAotCWxkLnViCQlyNChyNikscjgKLQlsZC51aAkJcjQocjYpLHI4Ci0JbG1vCQlyNyxyOAotCW9yCQlyMSxyMixyMwotCW9yLnR0CQlyMSxyMixyMwotCW9yLmZmCQlyMSxyMixyMwotCW9yLmZ0CQlyMSxyMixyMwotCW9yLnRmCQlyMSxyMixyMwotCXJkY3IJCXI2LHI0Ci0Jcm1vCQlyNCxyNQotCXJvdGwJCXIyLDMxLHI4LHIxMAotCXJvdHIJCXI4LDMxLHIyLHI2Ci0Jc2hsCQlyNCwzMSxyMixyNgotCXNsLmR6CQlyNCwxMixyNSxyNgotCXNsLmRtCQlyNCwxMixyNSxyNgotCXNsLmRzCQlyNCwxMixyNSxyNgotCXNsLmV6CQlyNCwxMixyNSxyNgotCXNsLmVtCQlyNCwxMixyNSxyNgotCXNsLmVzCQlyNCwxMixyNSxyNgotCXNsLml6CQlyNCwxMixyNSxyNgotCXNsLmltCQlyNCwxMixyNSxyNgotCXNsaS5kegkJcjQsMTIscjUscjYKLQlzbGkuZG0JCXI0LDEyLHI1LHI2Ci0Jc2xpLmRzCQlyNCwxMixyNSxyNgotCXNsaS5legkJcjQsMTIscjUscjYKLQlzbGkuZW0JCXI0LDEyLHI1LHI2Ci0Jc2xpLmVzCQlyNCwxMixyNSxyNgotCXNsaS5pegkJcjQsMTIscjUscjYKLQlzbGkuaW0JCXI0LDEyLHI1LHI2Ci0Jc3IuZHoJCXI0LDEyLHI1LHI2Ci0Jc3IuZG0JCXI0LDEyLHI1LHI2Ci0Jc3IuZHMJCXI0LDEyLHI1LHI2Ci0Jc3IuZXoJCXI0LDEyLHI1LHI2Ci0Jc3IuZW0JCXI0LDEyLHI1LHI2Ci0Jc3IuZXMJCXI0LDEyLHI1LHI2Ci0Jc3IuaXoJCXI0LDEyLHI1LHI2Ci0Jc3IuaW0JCXI0LDEyLHI1LHI2Ci0Jc3JhCQlyNCwzMixyNixyOAotCXNyaS5kegkJcjQsMTIscjUscjYKLQlzcmkuZG0JCXI0LDEyLHI1LHI2Ci0Jc3JpLmRzCQlyNCwxMixyNSxyNgotCXNyaS5legkJcjQsMTIscjUscjYKLQlzcmkuZW0JCXI0LDEyLHI1LHI2Ci0Jc3JpLmVzCQlyNCwxMixyNSxyNgotCXNyaS5pegkJcjQsMTIscjUscjYKLQlzcmkuaW0JCXI0LDEyLHI1LHI2Ci0Jc3JsCQlyNCwzMixyNixyOAotCXN0LmIJCXI0KHI2KSxyOAotCXN0LmgJCXI0KHI2KSxyOAotCXN0CQlyNChyNikscjgKLQlzdC5kCQlyNChyNikscjgKLQlzdWIJCXI3LHI4LHI5Ci0Jc3VidQkJcjcscjgscjkKLQlzd2NyCQlyOCxyNixyNAotCXRyYXAJCXIxMAotCXZhZGQuc3MJCXIyLHI0LHI0Ci0JdmFkZC5zZAkJcjIscjYscjYKLQl2YWRkLmRkCQlyMixyMTAscjEwCi07CXZsZDAucwkJcjYKLTsJdmxkMS5zCQlyNwotOwl2bGQwLmQJCXI2Ci07CXZsZDEuZAkJcjgKLTsJdm1hYy5zc3MJcjcscjksMCxhMwotOwl2bWFjLnNzcwlyNyxyOSwwLHIxMAotOwl2bWFjLnNzcwlyNyxyOSxhMSxhMwotOwl2bWFjLnNzcwlyNyxyOSxhMyxyMTAKLTsJdm1hYy5zc2QJcjcscjksMCxhMAotOwl2bWFjLnNzZAlyNyxyOSwwLHIxMAotOwl2bWFjLnNzZAlyNyxyOSxhMSxhMgotOwl2bWFjLnNzZAlyNyxyOSxhMyxyMTAKLTsJdm1weS5zcwkJcjEscjMscjMKLTsJdm1weS5zZAkJcjUscjYscjYKLTsJdm1weS5kZAkJcjIscjQscjQKLTsJdm1zYy5zc3MJcjcscjksMCxhMAotOwl2bXNjLnNzcwlyNyxyOSwwLHIxMAotOwl2bXNjLnNzcwlyNyxyOSxhMCxhMQotOwl2bXNjLnNzcwlyNyxyOSxhMyxyMTAKLTsJdm1zYy5zc2QJcjcscjksMCxhMAotOwl2bXNjLnNzZAlyNyxyOSwwLHIxMAotOwl2bXNjLnNzZAlyNyxyOSxhMCxhMQotOwl2bXNjLnNzZAlyNyxyOSxhMyxyMTAKLTsJdm1zdWIuc3MJcjYsYTIsYTQKLTsJdm1zdWIuc2QJcjYsYTIsYTQKLTsJdm1zdWIuc3MJcjQsYTQscjYKLTsJdm1zdWIuc2QJcjQsYTQscjYKLTsJdnJuZC5zaQkJcjQscjYKLTsJdnJuZC5zaQkJcjQsYTAKLTsJdnJuZC5zdQkJcjQscjYKLTsJdnJuZC5zdQkJcjQsYTAKLTsJdnJuZC5zcwkJcjQscjYKLTsJdnJuZC5zcwkJcjQsYTAKLTsJdnJuZC5zZAkJcjQscjYKLTsJdnJuZC5zZAkJcjQsYTAKLTsJdnJuZC5kaQkJcjQscjYKLTsJdnJuZC5kaQkJcjQsYTAKLTsJdnJuZC5kdQkJcjQscjYKLTsJdnJuZC5kdQkJcjQsYTAKLTsJdnJuZC5kcwkJcjQscjYKLTsJdnJuZC5kcwkJcjQsYTAKLTsJdnJuZC5kZAkJcjQscjYKLTsJdnJuZC5kZAkJcjQsYTAKLTsJdnJuZC5pcwkJcjQscjYKLTsJdnJuZC5pZAkJcjQscjYKLTsJdnJuZC51cwkJcjQscjYKLTsJdnJuZC51ZAkJcjQscjYKLTsJdnN0LnMJCXI2Ci07CXZzdC5kCQlyNgotOwl2c3ViLnNzCQlyMixyNCxyNgotOwl2c3ViLnNkCQlyMixyNCxyNgotOwl2c3ViLmRkCQlyMixyNCxyNgotCXdyY3IJCXI2LHI1Ci0JeG5vcgkJcjUscjYscjcKLQl4b3IJCXI3LHI4LHI5CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2Y0YTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgcmVnaXN0ZXIgb3BlcmFuZHMgd2l0aCA6bSBtb2RpZmllcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDggODAgYjcgMDIuKgotICAgNDoJMDQgMDAgOWUgMDIuKgotICAgODoJZmMgN2YgOWUgMDIuKgotICAgYzoJMDAgOTAgYjcgMDIgNzggNTYgMzQgMTIuKgotICAxNDoJMDAgOTAgYjcgMDIgZWYgYmUgYWQgZGUuKgotICAxYzoJMDggODAgYjcgMGEuKgotICAyMDoJMDQgMDAgOWUgMGEuKgotICAyNDoJZmMgN2YgOWUgMGEuKgotICAyODoJMDAgOTAgYjcgMGEgNzggNTYgMzQgMTIuKgotICAzMDoJMDAgOTAgYjcgMGEgZWYgYmUgYWQgZGUuKgotICAzODoJMDQgODQgYjQgNDEuKgotICAzYzoJMDQgYTQgYjQgNDEuKgotICA0MDoJMDQgYzQgYjQgNDEuKgotICA0NDoJMDQgZTQgYjQgNDEuKgotICA0ODoJMDAgOTQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA1MDoJMDAgYjQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA1ODoJMDAgZDQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA2MDoJMDAgZjQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA2ODoJMDQgODQgYjUgNDEuKgotICA2YzoJMDQgYTQgYjUgNDEuKgotICA3MDoJMDAgOTQgYjUgNDEgMDAgMDAgMDAgZTAuKgotICA3ODoJMDAgYjQgYjUgNDEgMDAgMDAgMDAgZTAuKgotICA4MDoJMDQgODQgYjYgNDEuKgotICA4NDoJMDQgYTQgYjYgNDEuKgotICA4ODoJMDQgYzQgYjYgNDEuKgotICA4YzoJMDQgZTQgYjYgNDEuKgotICA5MDoJMDAgOTQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICA5ODoJMDAgYjQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBhMDoJMDAgZDQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBhODoJMDAgZjQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBiMDoJMDQgODAgYjQgNDEuKgotICBiNDoJMDQgYTAgYjQgNDEuKgotICBiODoJMDQgYzAgYjQgNDEuKgotICBiYzoJMDQgZTAgYjQgNDEuKgotICBjMDoJZjAgN2YgOTIgNDEuKgotICBjNDoJZjAgZmYgOTIgNDEuKgotICBjODoJZjAgN2YgOTMgNDEuKgotICBjYzoJZjAgZmYgOTMgNDEuKgotICBkMDoJMDAgOTAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBkODoJMDAgYjAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBlMDoJMDAgZDAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBlODoJMDAgZjAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBmMDoJMDQgODAgYjUgNDEuKgotICBmNDoJMDQgYTAgYjUgNDEuKgotICBmODoJZjAgN2YgOTYgNDEuKgotICBmYzoJZjAgZmYgOTYgNDEuKgotIDEwMDoJMDAgOTAgYjUgNDEgMDAgMDAgMDAgZTAuKgotIDEwODoJMDAgYjAgYjUgNDEgMDAgMDAgMDAgZTAuKgotIDExMDoJMDQgODAgYjYgNDEuKgotIDExNDoJMDQgYTAgYjYgNDEuKgotIDExODoJMDQgYzAgYjYgNDEuKgotIDExYzoJMDQgZTAgYjYgNDEuKgotIDEyMDoJMDAgN2YgOWEgNDEuKgotIDEyNDoJMDAgZmYgOWEgNDEuKgotIDEyODoJMDAgN2YgOWIgNDEuKgotIDEyYzoJMDAgZmYgOWIgNDEuKgotIDEzMDoJMDAgOTAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDEzODoJMDAgYjAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDE0MDoJMDAgZDAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDE0ODoJMDAgZjAgYjYgNDEgMDAgMDAgMDAgZTAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxZmI5Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoxNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgMDAwMDAwMDAgICAwMkI3ODAwOCAgICAgICAgIGRjYWNoZWMgcjgocjEwOm0pICAgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLSAgICAgICAgMiAwMDAwMDAwNCAgIDAyOUUwMDA0ICAgICAgICAgZGNhY2hlYyA0KHIxMDptKSAgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgMyAwMDAwMDAwOCAgIDAyOUU3RkZDICAgICAgICAgZGNhY2hlYyAtNChyMTA6bSkgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgNCAwMDAwMDAwQyAgIDAyQjc5MDAwICAgICAgICAgZGNhY2hlYyAweDEyMzQ1Njc4KHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAgIDAwMDAwMDEwICAgMTIzNDU2NzggCi0gICAgICAgIDUgMDAwMDAwMTQgICAwMkI3OTAwMCAgICAgICAgIGRjYWNoZWMgMHhERUFEQkVFRihyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgICAwMDAwMDAxOCAgIERFQURCRUVGIAotICAgICAgICA2IDAwMDAwMDFDICAgMEFCNzgwMDggICAgICAgICBkY2FjaGVmIHI4KHIxMDptKSAgICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybSAobW9kaWZpZWQpCi0gICAgICAgIDcgMDAwMDAwMjAgICAwQTlFMDAwNCAgICAgICAgIGRjYWNoZWYgNChyMTA6bSkgICAgICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgIDggMDAwMDAwMjQgICAwQTlFN0ZGQyAgICAgICAgIGRjYWNoZWYgLTQocjEwOm0pICAgICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgIDkgMDAwMDAwMjggICAwQUI3OTAwMCAgICAgICAgIGRjYWNoZWYgMHgxMjM0NTY3OChyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgICAwMDAwMDAyQyAgIDEyMzQ1Njc4IAotICAgICAgIDEwIDAwMDAwMDMwICAgMEFCNzkwMDAgICAgICAgICBkY2FjaGVmIDB4REVBREJFRUYocjEwOm0pICAgICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgICAgMDAwMDAwMzQgICBERUFEQkVFRiAKLSAgICAgICAxMSAwMDAwMDAzOCAgIDQxQjQ4NDA0ICAgICAgICAgZGxkLmIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMiAwMDAwMDAzQyAgIDQxQjRBNDA0ICAgICAgICAgZGxkLmggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMyAwMDAwMDA0MCAgIDQxQjRDNDA0ICAgICAgICAgZGxkICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNCAwMDAwMDA0NCAgIDQxQjRFNDA0ICAgICAgICAgZGxkLmQgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNSAwMDAwMDA0OCAgIDQxQjQ5NDAwICAgICAgICAgZGxkLmIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA0QyAgIEUwMDAwMDAwIAotICAgICAgIDE2IDAwMDAwMDUwICAgNDFCNEI0MDAgICAgICAgICBkbGQuaCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDU0ICAgRTAwMDAwMDAgCi0gICAgICAgMTcgMDAwMDAwNTggICA0MUI0RDQwMCAgICAgICAgIGRsZCAgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNUMgICBFMDAwMDAwMCAKLSAgICAgICAxOCAwMDAwMDA2MCAgIDQxQjRGNDAwICAgICAgICAgZGxkLmQgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA2NCAgIEUwMDAwMDAwIAotICAgICAgIDE5IDAwMDAwMDY4ICAgNDFCNTg0MDQgICAgICAgICBkbGQudWIgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIwIDAwMDAwMDZDICAgNDFCNUE0MDQgICAgICAgICBkbGQudWggIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIxIDAwMDAwMDcwICAgNDFCNTk0MDAgICAgICAgICBkbGQudWIgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDc0ICAgRTAwMDAwMDAgCi0gICAgICAgMjIgMDAwMDAwNzggICA0MUI1QjQwMCAgICAgICAgIGRsZC51aCAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwN0MgICBFMDAwMDAwMCAKLSAgICAgICAyMyAwMDAwMDA4MCAgIDQxQjY4NDA0ICAgICAgICAgZHN0LmIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNCAwMDAwMDA4NCAgIDQxQjZBNDA0ICAgICAgICAgZHN0LmggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNSAwMDAwMDA4OCAgIDQxQjZDNDA0ICAgICAgICAgZHN0ICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNiAwMDAwMDA4QyAgIDQxQjZFNDA0ICAgICAgICAgZHN0LmQgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNyAwMDAwMDA5MCAgIDQxQjY5NDAwICAgICAgICAgZHN0LmIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA5NCAgIEUwMDAwMDAwIAotICAgICAgIDI4IDAwMDAwMDk4ICAgNDFCNkI0MDAgICAgICAgICBkc3QuaCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDlDICAgRTAwMDAwMDAgCi0gICAgICAgMjkgMDAwMDAwQTAgICA0MUI2RDQwMCAgICAgICAgIGRzdCAgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQTQgICBFMDAwMDAwMCAKLSAgICAgICAzMCAwMDAwMDBBOCAgIDQxQjZGNDAwICAgICAgICAgZHN0LmQgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBBQyAgIEUwMDAwMDAwIAotICAgICAgIDMxIDAwMDAwMEIwICAgNDFCNDgwMDQgICAgICAgICBsZC5iICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDMyIDAwMDAwMEI0ICAgNDFCNEEwMDQgICAgICAgICBsZC5oICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDMzIDAwMDAwMEI4ICAgNDFCNEMwMDQgICAgICAgICBsZCAgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDM0IDAwMDAwMEJDICAgNDFCNEUwMDQgICAgICAgICBsZC5kICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDM1IDAwMDAwMEMwICAgNDE5MjdGRjAgICAgICAgICBsZC5iICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAzNiAwMDAwMDBDNCAgIDQxOTJGRkYwICAgICAgICAgbGQuaCAgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgMzcgMDAwMDAwQzggICA0MTkzN0ZGMCAgICAgICAgIGxkICAgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDM4IDAwMDAwMENDICAgNDE5M0ZGRjAgICAgICAgICBsZC5kICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAzOSAwMDAwMDBEMCAgIDQxQjQ5MDAwICAgICAgICAgbGQuYiAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBENCAgIEUwMDAwMDAwIAotICAgICAgIDQwIDAwMDAwMEQ4ICAgNDFCNEIwMDAgICAgICAgICBsZC5oICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoxNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgICAgMDAwMDAwREMgICBFMDAwMDAwMCAKLSAgICAgICA0MSAwMDAwMDBFMCAgIDQxQjREMDAwICAgICAgICAgbGQgICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBFNCAgIEUwMDAwMDAwIAotICAgICAgIDQyIDAwMDAwMEU4ICAgNDFCNEYwMDAgICAgICAgICBsZC5kICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEVDICAgRTAwMDAwMDAgCi0gICAgICAgNDMgMDAwMDAwRjAgICA0MUI1ODAwNCAgICAgICAgIGxkLnViICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNDQgMDAwMDAwRjQgICA0MUI1QTAwNCAgICAgICAgIGxkLnVoICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNDUgMDAwMDAwRjggICA0MTk2N0ZGMCAgICAgICAgIGxkLnViICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDQ2IDAwMDAwMEZDICAgNDE5NkZGRjAgICAgICAgICBsZC51aCAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICA0NyAwMDAwMDEwMCAgIDQxQjU5MDAwICAgICAgICAgbGQudWIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDEwNCAgIEUwMDAwMDAwIAotICAgICAgIDQ4IDAwMDAwMTA4ICAgNDFCNUIwMDAgICAgICAgICBsZC51aCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTBDICAgRTAwMDAwMDAgCi0gICAgICAgNDkgMDAwMDAxMTAgICA0MUI2ODAwNCAgICAgICAgIHN0LmIgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTAgMDAwMDAxMTQgICA0MUI2QTAwNCAgICAgICAgIHN0LmggICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTEgMDAwMDAxMTggICA0MUI2QzAwNCAgICAgICAgIHN0ICAgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTIgMDAwMDAxMUMgICA0MUI2RTAwNCAgICAgICAgIHN0LmQgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTMgMDAwMDAxMjAgICA0MTlBN0YwMCAgICAgICAgIHN0LmIgICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDU0IDAwMDAwMTI0ICAgNDE5QUZGMDAgICAgICAgICBzdC5oICAgIC0yNTYocjY6bSkscjggICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICA1NSAwMDAwMDEyOCAgIDQxOUI3RjAwICAgICAgICAgc3QgICAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNTYgMDAwMDAxMkMgICA0MTlCRkYwMCAgICAgICAgIHN0LmQgICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDU3IDAwMDAwMTMwICAgNDFCNjkwMDAgICAgICAgICBzdC5iICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTM0ICAgRTAwMDAwMDAgCi0gICAgICAgNTggMDAwMDAxMzggICA0MUI2QjAwMCAgICAgICAgIHN0LmggICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxM0MgICBFMDAwMDAwMCAKLSAgICAgICA1OSAwMDAwMDE0MCAgIDQxQjZEMDAwICAgICAgICAgc3QgICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDE0NCAgIEUwMDAwMDAwIAotICAgICAgIDYwIDAwMDAwMTQ4ICAgNDFCNkYwMDAgICAgICAgICBzdC5kICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTRDICAgRTAwMDAwMDAgCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc1NWIzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIucworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLQlkY2FjaGVjCXI4KHIxMDptKQkJOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLQlkY2FjaGVjCTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVjCS00KHIxMDptKQkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlYwkweDEyMzQ1Njc4KHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWMJMHhERUFEQkVFRihyMTA6bSkJOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVmCXI4KHIxMDptKQkJOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLQlkY2FjaGVmCTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVmCS00KHIxMDptKQkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlZgkweDEyMzQ1Njc4KHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWYJMHhERUFEQkVFRihyMTA6bSkJOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkbGQuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JZGxkLmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZC51YglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLnVoCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQudWgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JZHN0LmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkLmIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5kCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5iCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCWxkLmgJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQuZAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkLnViCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC51aAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWIJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQudWgJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQudWIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlsZC51aAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0CXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5kCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5iCS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdC5oCS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdAktMjU2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0Jc3QuZAktMjU2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0Jc3QuYgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlzdAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhMzAxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCByZWdpc3RlciBvcGVyYW5kcyB3aXRoIDpzIG1vZGlmaWVyCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwNCAwYyBiNCA0MS4qCi0gICA0OgkwNCAyYyBiNCA0MS4qCi0gICA4OgkwNCA0YyBiNCA0MS4qCi0gICBjOgkwNCA2YyBiNCA0MS4qCi0gIDEwOgkwNCAwYyBiNSA0MS4qCi0gIDE0OgkwNCAyYyBiNSA0MS4qCi0gIDE4OgkwNCAwYyBiNiA0MS4qCi0gIDFjOgkwNCAyYyBiNiA0MS4qCi0gIDIwOgkwNCA0YyBiNiA0MS4qCi0gIDI0OgkwNCA2YyBiNiA0MS4qCi0gIDI4OgkwNCAwOCBiNCA0MS4qCi0gIDJjOgkwNCAyOCBiNCA0MS4qCi0gIDMwOgkwNCA0OCBiNCA0MS4qCi0gIDM0OgkwNCA2OCBiNCA0MS4qCi0gIDM4OgkwNCAwOCBiNSA0MS4qCi0gIDNjOgkwNCAyOCBiNSA0MS4qCi0gIDQwOgkwNCAwOCBiNiA0MS4qCi0gIDQ0OgkwNCAyOCBiNiA0MS4qCi0gIDQ4OgkwNCA0OCBiNiA0MS4qCi0gIDRjOgkwNCA2OCBiNiA0MS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU4MDNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzMy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAwMDAwMDAwMCAgIDQxQjQwQzA0ICAgICAgICAgZGxkLmIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgMiAwMDAwMDAwNCAgIDQxQjQyQzA0ICAgICAgICAgZGxkLmggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgMyAwMDAwMDAwOCAgIDQxQjQ0QzA0ICAgICAgICAgZGxkICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNCAwMDAwMDAwQyAgIDQxQjQ2QzA0ICAgICAgICAgZGxkLmQgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNSAwMDAwMDAxMCAgIDQxQjUwQzA0ICAgICAgICAgZGxkLnViICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNiAwMDAwMDAxNCAgIDQxQjUyQzA0ICAgICAgICAgZGxkLnVoICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNyAwMDAwMDAxOCAgIDQxQjYwQzA0ICAgICAgICAgZHN0LmIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgOCAwMDAwMDAxQyAgIDQxQjYyQzA0ICAgICAgICAgZHN0LmggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgOSAwMDAwMDAyMCAgIDQxQjY0QzA0ICAgICAgICAgZHN0ICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMCAwMDAwMDAyNCAgIDQxQjY2QzA0ICAgICAgICAgZHN0LmQgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMSAwMDAwMDAyOCAgIDQxQjQwODA0ICAgICAgICAgbGQuYiAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMiAwMDAwMDAyQyAgIDQxQjQyODA0ICAgICAgICAgbGQuaCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMyAwMDAwMDAzMCAgIDQxQjQ0ODA0ICAgICAgICAgbGQgICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNCAwMDAwMDAzNCAgIDQxQjQ2ODA0ICAgICAgICAgbGQuZCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNSAwMDAwMDAzOCAgIDQxQjUwODA0ICAgICAgICAgbGQudWIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNiAwMDAwMDAzQyAgIDQxQjUyODA0ICAgICAgICAgbGQudWggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNyAwMDAwMDA0MCAgIDQxQjYwODA0ICAgICAgICAgc3QuYiAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxOCAwMDAwMDA0NCAgIDQxQjYyODA0ICAgICAgICAgc3QuaCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxOSAwMDAwMDA0OCAgIDQxQjY0ODA0ICAgICAgICAgc3QgICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyMCAwMDAwMDA0QyAgIDQxQjY2ODA0ICAgICAgICAgc3QuZCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDg3ZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCWRsZC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLnViCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWgJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0CXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuYglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnViCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC51aAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuYglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzYwN2M5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzIHdpdGggYm90aCA6bSBhbmQgOnMgbW9kaWZpZXIKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTA0IDhjIGI0IDQxLioKLSAgIDQ6CTA0IGFjIGI0IDQxLioKLSAgIDg6CTA0IGNjIGI0IDQxLioKLSAgIGM6CTA0IGVjIGI0IDQxLioKLSAgMTA6CTA0IDhjIGI1IDQxLioKLSAgMTQ6CTA0IGFjIGI1IDQxLioKLSAgMTg6CTA0IDhjIGI2IDQxLioKLSAgMWM6CTA0IGFjIGI2IDQxLioKLSAgMjA6CTA0IGNjIGI2IDQxLioKLSAgMjQ6CTA0IGVjIGI2IDQxLioKLSAgMjg6CTA0IDg4IGI0IDQxLioKLSAgMmM6CTA0IGE4IGI0IDQxLioKLSAgMzA6CTA0IGM4IGI0IDQxLioKLSAgMzQ6CTA0IGU4IGI0IDQxLioKLSAgMzg6CTA0IDg4IGI1IDQxLioKLSAgM2M6CTA0IGE4IGI1IDQxLioKLSAgNDA6CTA0IDg4IGI2IDQxLioKLSAgNDQ6CTA0IGE4IGI2IDQxLioKLSAgNDg6CTA0IGM4IGI2IDQxLioKLSAgNGM6CTA0IGU4IGI2IDQxLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjNjOWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFdlZCBGZWIgMjYgMTQ6MzI6MjUgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHM0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxIDAwMDAwMDAwICAgNDFCNDhDMDQgICAgICAgICBkbGQuYiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAyIDAwMDAwMDA0ICAgNDFCNEFDMDQgICAgICAgICBkbGQuaCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAzIDAwMDAwMDA4ICAgNDFCNENDMDQgICAgICAgICBkbGQgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA0IDAwMDAwMDBDICAgNDFCNEVDMDQgICAgICAgICBkbGQuZCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA1IDAwMDAwMDEwICAgNDFCNThDMDQgICAgICAgICBkbGQudWIgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA2IDAwMDAwMDE0ICAgNDFCNUFDMDQgICAgICAgICBkbGQudWggIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA3IDAwMDAwMDE4ICAgNDFCNjhDMDQgICAgICAgICBkc3QuYiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA4IDAwMDAwMDFDICAgNDFCNkFDMDQgICAgICAgICBkc3QuaCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA5IDAwMDAwMDIwICAgNDFCNkNDMDQgICAgICAgICBkc3QgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEwIDAwMDAwMDI0ICAgNDFCNkVDMDQgICAgICAgICBkc3QuZCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDExIDAwMDAwMDI4ICAgNDFCNDg4MDQgICAgICAgICBsZC5iICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEyIDAwMDAwMDJDICAgNDFCNEE4MDQgICAgICAgICBsZC5oICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEzIDAwMDAwMDMwICAgNDFCNEM4MDQgICAgICAgICBsZCAgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE0IDAwMDAwMDM0ICAgNDFCNEU4MDQgICAgICAgICBsZC5kICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE1IDAwMDAwMDM4ICAgNDFCNTg4MDQgICAgICAgICBsZC51YiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE2IDAwMDAwMDNDICAgNDFCNUE4MDQgICAgICAgICBsZC51aCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE3IDAwMDAwMDQwICAgNDFCNjg4MDQgICAgICAgICBzdC5iICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE4IDAwMDAwMDQ0ICAgNDFCNkE4MDQgICAgICAgICBzdC5oICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE5IDAwMDAwMDQ4ICAgNDFCNkM4MDQgICAgICAgICBzdCAgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIwIDAwMDAwMDRDICAgNDFCNkU4MDQgICAgICAgICBzdC5kICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhNzdlOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JZGxkLmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51YglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0CXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnViCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnVoCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWYwNGIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLWV4dGVybiBpbnQgeGZ1bmMgKGludCB5KTsKLQotc3RhdGljIGludCBzZnVuYyAoaW50IHkpCi17Ci0gIHhmdW5jICh5KTsKLX0KLQotaW50IGdmdW5jIChpbnQgeSkKLXsKLSAgc2Z1bmMgKHkpOwotfQotCi1pbnQgYnJhbmNoZXMgKGludCB5KQotewotICBpbnQgejsKLQotICBmb3IgKHogPSB5OyB6IDwgeSArIDEwOyB6KyspCi0gICAgewotICAgICAgaWYgKHogJiAweDEpCi0JewotCSAgZ2Z1bmMgKHopOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB4ZnVuYyAoeik7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjYTZjOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmQKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBzaW1wbGUgcmVsb2NzLCBnbG9iYWwvbG9jYWwgZnVuY3MgJiBicmFuY2hlcyAoY29kZSkKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9zZnVuYz46Ci0gICAwOglmMCBmZiA2YyAwOC4qCi0gICA0OgkwYyAwMCA1OSBmOC4qCi0gICA4OgkwMCAwMCA1OSAxMC4qCi0gICBjOgkwMCA5MCAzOCBmOCAwMCAwMCAwMCAwMC4qCi0gIDE0OgkwMCAwMCA1MSAxMC4qCi0gIDE4OgkwYyAwMCA1MSBmOC4qCi0gIDFjOgkxZiA4MCAzOCAwMC4qCi0gIDIwOgkxMCA4MCA2YyAwOC4qCi0KLTAwMDAwMDI0IDxfZ2Z1bmM+OgotICAyNDoJZjAgZmYgNmMgMDguKgotICAyODoJMGMgMDAgNTkgZjguKgotICAyYzoJMDAgMDAgNTkgMTAuKgotICAzMDoJMDAgOTAgMzggZjggMDAgMDAgMDAgMDAuKgotICAzODoJMDAgMDAgNTEgMTAuKgotICAzYzoJMGMgMDAgNTEgZjguKgotICA0MDoJMWYgODAgMzggMDAuKgotICA0NDoJMTAgODAgNmMgMDguKgotCi0wMDAwMDA0OCA8X2JyYW5jaGVzPjoKLSAgNDg6CWYwIGZmIDZjIDA4LioKLSAgNGM6CTBjIDAwIDU5IGY4LioKLSAgNTA6CTAwIDAwIDU5IDEwLioKLSAgNTQ6CTAwIDAwIDUxIDEwLioKLSAgNTg6CTA0IDAwIDU5IDEwLioKLSAgNWM6CTAwIDAwIDUxIDEwLioKLSAgNjA6CTA0IDAwIDUxIDE4LioKLSAgNjQ6CTBhIDgwIGFjIDEwLioKLSAgNjg6CTAzIDAwIGJhIDEwLioKLSAgNmM6CTEyIDgwIGE1IDMwLioKLSAgNzA6CTA0IDAwIDUxIDEwLioKLSAgNzQ6CTA1IDgwIGE0IGY4LioKLSAgNzg6CTAwIDkwIDM4IGY4IDI0IDAwIDAwIDAwLioKLSAgODA6CTA0IDAwIDUxIDEwLioKLSAgODQ6CTA0IDgwIDI0IDAwLioKLSAgODg6CTAwIDkwIDM4IGY4IDAwIDAwIDAwIDAwLioKLSAgOTA6CTA0IDAwIDUxIDEwLioKLSAgOTQ6CTA0IDAwIDUxIDEwLioKLSAgOTg6CTAxIDgwIGFjIDEwLioKLSAgOWM6CTA0IDAwIDU5IDEwLioKLSAgYTA6CTAwIDAwIDUxIDE4LioKLSAgYTQ6CTA0IDAwIDUxIDEwLioKLSAgYTg6CTBhIDgwIGVjIDE4LioKLSAgYWM6CTAyIDAwIGZhIDEwLioKLSAgYjA6CWYwIGZmIGE1IDM4LioKLSAgYjQ6CTBjIDAwIDUxIGY4LioKLSAgYjg6CTFmIDgwIDM4IDAwLioKLSAgYmM6CTEwIDgwIDZjIDA4LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYWViMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMTM6MTk6MjggMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MxLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUgaGFuZCBoYWNrZWQgb3V0cHV0IG9mIHRoZSBUSSBDIGNvbXBpbGVyIGZvciBhIHNpbXBsZQotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgdGVzdCBwcm9ncmFtIHRoYXQgY29udGFpbnMgbG9jYWwvZ2xvYmFsIGZ1bmN0aW9ucywgbG9jYWwvZ2xvYmFsCi0gICAgICAgIDMgICAgICAgICAgICAgICAgICAgICA7OyBmdW5jdGlvbiBjYWxscywgYW5kIGFuICJpZiIgYW5kICJmb3IiIHN0YXRlbWVudC4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94ZnVuYwotICAgICAgICA2ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDcgMDAwMDAwMDAgICAgICAgICAgICBfc2Z1bmM6Ci0gICAgICAgIDggMDAwMDAwMDAgICAwODZDRkZGMCAgICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCi0gICAgICAgIDkgMDAwMDAwMDQgICBGODU5MDAwQyAgICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDEwIDAwMDAwMDA4ICAgMTA1OTAwMDAgICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCi0gICAgICAgMTEgMDAwMDAwMEMgICBGODM4OTAwMCAgICAgICAgICBqc3IgICAgICAgX3hmdW5jKHIwKSxyMzEKLSAgICAgICAgICAwMDAwMDAxMCAgIDAwMDAwMDAwIAotICAgICAgIDEyIDAwMDAwMDE0ICAgMTA1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgMTMgMDAwMDAwMTggICBGODUxMDAwQyAgICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDE0IDAwMDAwMDFDICAgMDAzODgwMUYgICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICAxNSAwMDAwMDAyMCAgIDA4NkM4MDEwICAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dmdW5jCi0gICAgICAgMTggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxOSAwMDAwMDAyNCAgICAgICAgICAgIF9nZnVuYzoKLSAgICAgICAyMCAwMDAwMDAyNCAgIDA4NkNGRkYwICAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAyMSAwMDAwMDAyOCAgIEY4NTkwMDBDICAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMjIgMDAwMDAwMkMgICAxMDU5MDAwMCAgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAyMyAwMDAwMDAzMCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfc2Z1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDM0ICAgMDAwMDAwMDAgCi0gICAgICAgMjQgMDAwMDAwMzggICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAyNSAwMDAwMDAzQyAgIEY4NTEwMDBDICAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMjYgMDAwMDAwNDAgICAwMDM4ODAxRiAgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgIDI3IDAwMDAwMDQ0ICAgMDg2QzgwMTAgICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0gICAgICAgMjggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyOSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9icmFuY2hlcwotICAgICAgIDMxICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzIgMDAwMDAwNDggICAgICAgICAgICBfYnJhbmNoZXM6Ci0gICAgICAgMzMgMDAwMDAwNDggICAwODZDRkZGMCAgICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCi0gICAgICAgMzQgMDAwMDAwNEMgICBGODU5MDAwQyAgICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDM1IDAwMDAwMDUwICAgMTA1OTAwMDAgICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCi0gICAgICAgMzYgMDAwMDAwNTQgICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAzNyAwMDAwMDA1OCAgIDEwNTkwMDA0ICAgICAgICAgIHN0ICAgICAgICA0KHIxKSxyMgotICAgICAgIDM4IDAwMDAwMDVDICAgMTA1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgMzkgMDAwMDAwNjAgICAxODUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjMKLSAgICAgICA0MCAwMDAwMDA2NCAgIDEwQUM4MDBBICAgICAgICAgIGFkZHUgICAgICAxMCxyMixyMgotICAgICAgIDQxIDAwMDAwMDY4ICAgMTBCQTAwMDMgICAgICAgICAgY21wICAgICAgIHIzLHIyLHIyCi0gICAgICAgNDIgMDAwMDAwNkMgICAzMEE1ODAxMiAgICAgICAgICBiYm8uYSAgICAgTDEyLHIyLGdlLncKLSAgICAgICA0MyAwMDAwMDA3MCAgICAgICAgICAgIEw4OgotICAgICAgIDQ0IDAwMDAwMDcwICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgNDUgMDAwMDAwNzQgICBGOEE0ODAwNSAgICAgICAgICBiYnouYSAgICAgTDEwLHIyLDAKLSAgICAgICA0NiAwMDAwMDA3OCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfZ2Z1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDdDICAgMDAwMDAwMjQgCi0gICAgICAgNDcgMDAwMDAwODAgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICA0OCAwMDAwMDA4NCAgIDAwMjQ4MDA0ICAgICAgICAgIGJyLmEgICAgICBMMTEKLSAgICAgICA0OSAwMDAwMDA4OCAgICAgICAgICAgIEwxMDoKLSAgICAgICA1MCAwMDAwMDA4OCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDhDICAgMDAwMDAwMDAgCi0gICAgICAgNTEgMDAwMDAwOTAgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMTM6MTk6MjggMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MxLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgIDUyIDAwMDAwMDk0ICAgICAgICAgICAgTDExOgotICAgICAgIDUzIDAwMDAwMDk0ICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgNTQgMDAwMDAwOTggICAxMEFDODAwMSAgICAgICAgICBhZGR1ICAgICAgMSxyMixyMgotICAgICAgIDU1IDAwMDAwMDlDICAgMTA1OTAwMDQgICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCi0gICAgICAgNTYgMDAwMDAwQTAgICAxODUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjMKLSAgICAgICA1NyAwMDAwMDBBNCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgIDU4IDAwMDAwMEE4ICAgMThFQzgwMEEgICAgICAgICAgYWRkdSAgICAgIDEwLHIzLHIzCi0gICAgICAgNTkgMDAwMDAwQUMgICAxMEZBMDAwMiAgICAgICAgICBjbXAgICAgICAgcjIscjMscjIKLSAgICAgICA2MCAwMDAwMDBCMCAgIDM4QTVGRkYwICAgICAgICAgIGJiby5hICAgICBMOCxyMixsdC53Ci0gICAgICAgNjEgMDAwMDAwQjQgICAgICAgICAgICBMMTI6Ci0gICAgICAgNjIgMDAwMDAwQjQgICBGODUxMDAwQyAgICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDYzIDAwMDAwMEI4ICAgMDAzODgwMUYgICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICA2NCAwMDAwMDBCQyAgIDA4NkM4MDEwICAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZTM5NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi07OyBUaGlzIGlzIHRoZSBoYW5kIGhhY2tlZCBvdXRwdXQgb2YgdGhlIFRJIEMgY29tcGlsZXIgZm9yIGEgc2ltcGxlCi07OyB0ZXN0IHByb2dyYW0gdGhhdCBjb250YWlucyBsb2NhbC9nbG9iYWwgZnVuY3Rpb25zLCBsb2NhbC9nbG9iYWwKLTs7IGZ1bmN0aW9uIGNhbGxzLCBhbmQgYW4gImlmIiBhbmQgImZvciIgc3RhdGVtZW50LgotCi0JLmZpbGUJICAgInJlbG9jczEucyIKLQotCS5nbG9iYWwJX3hmdW5jCi0KLV9zZnVuYzoKLSAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotCi0JLmdsb2JhbAlfZ2Z1bmMKLQotX2dmdW5jOgotICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgICAganNyICAgICAgIF9zZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0KLQotCS5nbG9iYWwJX2JyYW5jaGVzCi0KLV9icmFuY2hlczoKLSAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCi0gICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMwotICAgICAgICAgYWRkdSAgICAgIDEwLHIyLHIyCi0gICAgICAgICBjbXAgICAgICAgcjMscjIscjIKLSAgICAgICAgIGJiby5hICAgICBMMTIscjIsZ2UudwotTDg6Ci0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGJiei5hICAgICBMMTAscjIsMAotICAgICAgICAganNyICAgICAgIF9nZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGJyLmEgICAgICBMMTEKLUwxMDoKLSAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi1MMTE6Ci0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGFkZHUgICAgICAxLHIyLHIyCi0gICAgICAgICBzdCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMwotICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgICBhZGR1ICAgICAgMTAscjMscjMKLSAgICAgICAgIGNtcCAgICAgICByMixyMyxyMgotICAgICAgICAgYmJvLmEgICAgIEw4LHIyLGx0LncKLUwxMjoKLSAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMWIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViMzE2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jc291cmNlOiByZWxvY3MxLnMKLSNuYW1lOiBUSWM4MCBzaW1wbGUgcmVsb2NzLCBnbG9iYWwvbG9jYWwgZnVuY3MgJiBicmFuY2hlcyAocmVsb2NzKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMDAwMDAwMTAgMzIgICAgICAgICAgICAgICAgX3hmdW5jCi0wMDAwMDAzNCAzMiAgICAgICAgICAgICAgICAudGV4dAotMDAwMDAwN2MgMzIgICAgICAgICAgICAgICAgLnRleHQKLTAwMDAwMDhjIDMyICAgICAgICAgICAgICAgIF94ZnVuYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjExMjBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLWV4dGVybiBjaGFyIHhfY2hhcjsKLWV4dGVybiBzaG9ydCB4X3Nob3J0Owotc3RhdGljIGludCB4X2ludDsKLWV4dGVybiBsb25nIHhfbG9uZzsKLWV4dGVybiBmbG9hdCB4X2Zsb2F0OwotZXh0ZXJuIGRvdWJsZSB4X2RvdWJsZTsKLWV4dGVybiBjaGFyICp4X2NoYXJfcDsKLQotc3RhdGljIGNoYXIgc19jaGFyOwotc3RhdGljIHNob3J0IHNfc2hvcnQ7Ci1zdGF0aWMgaW50IHNfaW50Owotc3RhdGljIGxvbmcgc19sb25nOwotc3RhdGljIGZsb2F0IHNfZmxvYXQ7Ci1zdGF0aWMgZG91YmxlIHNfZG91YmxlOwotc3RhdGljIGNoYXIgKnNfY2hhcl9wOwotCi1jaGFyIGdfY2hhcjsKLXNob3J0IGdfc2hvcnQ7Ci1pbnQgZ19pbnQ7Ci1sb25nIGdfbG9uZzsKLWZsb2F0IGdfZmxvYXQ7Ci1kb3VibGUgZ19kb3VibGU7Ci1jaGFyICpnX2NoYXJfcDsKLQotbWFpbiAoKQotewotICB4X2NoYXIgPSBzX2NoYXI7Ci0gIGdfY2hhciA9IHhfY2hhcjsKLSAgeF9zaG9ydCA9IHNfc2hvcnQ7Ci0gIGdfc2hvcnQgPSB4X3Nob3J0OwotICB4X2ludCA9IHNfaW50OwotICBnX2ludCA9IHhfaW50OwotICB4X2xvbmcgPSBzX2xvbmc7Ci0gIGdfbG9uZyA9IHhfbG9uZzsKLSAgeF9mbG9hdCA9IHNfZmxvYXQ7Ci0gIGdfZmxvYXQgPSB4X2Zsb2F0OwotICB4X2RvdWJsZSA9IHNfZG91YmxlOwotICBnX2RvdWJsZSA9IHhfZG91YmxlOwotICB4X2NoYXJfcCA9IHNfY2hhcl9wOwotICBnX2NoYXJfcCA9IHhfY2hhcl9wOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNlODdkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIHN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAoY29kZSkKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9tYWluPjoKLSAgIDA6CTAwIDEwIDM0IDEwIDI0IDAyIDAwIDAwLioKLSAgIDg6CTAwIDEwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgMTA6CTAwIDEwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgMTg6CTAwIDEwIDM2IDEwIDA0IDAyIDAwIDAwLioKLSAgMjA6CTAwIDMwIDM0IDEwIDI0IDAzIDAwIDAwLioKLSAgMjg6CTAwIDMwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgMzA6CTAwIDMwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgMzg6CTAwIDMwIDM2IDEwIDA0IDAzIDAwIDAwLioKLSAgNDA6CTAwIDUwIDM0IDEwIDM0IDAyIDAwIDAwLioKLSAgNDg6CTAwIDUwIDM2IDEwIDM0IDAzIDAwIDAwLioKLSAgNTA6CTAwIDUwIDM0IDEwIDM0IDAzIDAwIDAwLioKLSAgNTg6CTAwIDUwIDM2IDEwIDE0IDAyIDAwIDAwLioKLSAgNjA6CTAwIDUwIDM0IDEwIGY0IDAxIDAwIDAwLioKLSAgNjg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgNzA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgNzg6CTAwIDUwIDM2IDEwIGY0IDAwIDAwIDAwLioKLSAgODA6CTAwIDUwIDM0IDEwIGY0IDAyIDAwIDAwLioKLSAgODg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgOTA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgOTg6CTAwIDUwIDM2IDEwIDE0IDAzIDAwIDAwLioKLSAgYTA6CTAwIDcwIDM0IDEwIGU0IDAxIDAwIDAwLioKLSAgYTg6CTAwIDcwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgYjA6CTAwIDcwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgYjg6CTAwIDcwIDM2IDEwIGU0IDAyIDAwIDAwLioKLSAgYzA6CTAwIDUwIDM0IDEwIDQ0IDAzIDAwIDAwLioKLSAgYzg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgZDA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgZDg6CTAwIDUwIDM2IDEwIGU0IDAwIDAwIDAwLioKLSAgZTA6CTFmIGEwIDM4IDAwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTBhOGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTdW4gRmViIDIzIDEyOjE2OjMyIDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVsb2NzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIHN0YXRpYywgZ2xvYmFsLCBhbmQgZXh0ZXJuIGRhdGEgdmFyaWFibGVzLgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWxlICAgInJlbG9jczIucyIKLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9jaGFyCi0gICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX3hfc2hvcnQKLSAgICAgICAgNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9sb25nCi0gICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX3hfZmxvYXQKLSAgICAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9kb3VibGUKLSAgICAgICAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9jaGFyX3AKLSAgICAgICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyCi0gICAgICAgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfc2hvcnQKLSAgICAgICAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19pbnQKLSAgICAgICAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19sb25nCi0gICAgICAgMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfZmxvYXQKLSAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19kb3VibGUKLSAgICAgICAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyX3AKLSAgICAgICAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfbWFpbgotICAgICAgIDE5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjAgMDAwMDAwMDAgICAgICAgICAgICBfbWFpbjoKLSAgICAgICAyMSAwMDAwMDAwMCAgIDEwMzQxMDAwICAgICAgICAgIGxkLmIgICAgICBfc19jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMDQgICAwMDAwMDAxQyAKLSAgICAgICAyMiAwMDAwMDAwOCAgIDEwMzYxMDAwICAgICAgICAgIHN0LmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMEMgICAwMDAwMDAwMCAKLSAgICAgICAyMyAwMDAwMDAxMCAgIDEwMzQxMDAwICAgICAgICAgIGxkLmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMTQgICAwMDAwMDAwMCAKLSAgICAgICAyNCAwMDAwMDAxOCAgIDEwMzYxMDAwICAgICAgICAgIHN0LmIgICAgICBfZ19jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMUMgICAwMDAwMDAxNCAKLSAgICAgICAyNSAwMDAwMDAyMCAgIDEwMzQzMDAwICAgICAgICAgIGxkLmggICAgICBfc19zaG9ydCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDI0ICAgMDAwMDAwM0MgCi0gICAgICAgMjYgMDAwMDAwMjggICAxMDM2MzAwMCAgICAgICAgICBzdC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAyQyAgIDAwMDAwMDAwIAotICAgICAgIDI3IDAwMDAwMDMwICAgMTAzNDMwMDAgICAgICAgICAgbGQuaCAgICAgIF94X3Nob3J0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMzQgICAwMDAwMDAwMCAKLSAgICAgICAyOCAwMDAwMDAzOCAgIDEwMzYzMDAwICAgICAgICAgIHN0LmggICAgICBfZ19zaG9ydCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDNDICAgMDAwMDAwMzQgCi0gICAgICAgMjkgMDAwMDAwNDAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3NfaW50KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNDQgICAwMDAwMDAyMCAKLSAgICAgICAzMCAwMDAwMDA0OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9pbnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA0QyAgIDAwMDAwMDQwIAotICAgICAgIDMxIDAwMDAwMDUwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2ludCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDU0ICAgMDAwMDAwNDAgCi0gICAgICAgMzIgMDAwMDAwNTggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfaW50KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNUMgICAwMDAwMDAxOCAKLSAgICAgICAzMyAwMDAwMDA2MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNjQgICAwMDAwMDAxMCAKLSAgICAgICAzNCAwMDAwMDA2OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNkMgICAwMDAwMDAwMCAKLSAgICAgICAzNSAwMDAwMDA3MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNzQgICAwMDAwMDAwMCAKLSAgICAgICAzNiAwMDAwMDA3OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfZ19sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwN0MgICAwMDAwMDAwNCAKLSAgICAgICAzNyAwMDAwMDA4MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19mbG9hdCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDg0ICAgMDAwMDAwMzAgCi0gICAgICAgMzggMDAwMDAwODggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFN1biBGZWIgMjMgMTI6MTY6MzIgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MyLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgICAgIDAwMDAwMDhDICAgMDAwMDAwMDAgCi0gICAgICAgMzkgMDAwMDAwOTAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA5NCAgIDAwMDAwMDAwIAotICAgICAgIDQwIDAwMDAwMDk4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwOUMgICAwMDAwMDAzOCAKLSAgICAgICA0MSAwMDAwMDBBMCAgIDEwMzQ3MDAwICAgICAgICAgIGxkLmQgICAgICBfc19kb3VibGUrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBBNCAgIDAwMDAwMDA4IAotICAgICAgIDQyIDAwMDAwMEE4ICAgMTAzNjcwMDAgICAgICAgICAgc3QuZCAgICAgIF94X2RvdWJsZSswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEFDICAgMDAwMDAwMDAgCi0gICAgICAgNDMgMDAwMDAwQjAgICAxMDM0NzAwMCAgICAgICAgICBsZC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQjQgICAwMDAwMDAwMCAKLSAgICAgICA0NCAwMDAwMDBCOCAgIDEwMzY3MDAwICAgICAgICAgIHN0LmQgICAgICBfZ19kb3VibGUrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBCQyAgIDAwMDAwMDI4IAotICAgICAgIDQ1IDAwMDAwMEMwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2NoYXJfcCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEM0ICAgMDAwMDAwNDQgCi0gICAgICAgNDYgMDAwMDAwQzggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQ0MgICAwMDAwMDAwMCAKLSAgICAgICA0NyAwMDAwMDBEMCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBENCAgIDAwMDAwMDAwIAotICAgICAgIDQ4IDAwMDAwMEQ4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2NoYXJfcCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMERDICAgMDAwMDAwMDAgCi0gICAgICAgNDkgMDAwMDAwRTAgICAwMDM4QTAxRiAgICAgICAgICBqc3IuYSAgICAgcjMxKHIwKSxyMAotICAgICAgIDUwICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgNTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfY2hhcl9wCi0gICAgICAgNTIgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfY2hhcl9wLDQsNAotICAgICAgIDUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2xvbmcKLSAgICAgICA1NCAwMDAwMDAwNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19sb25nLDQsNAotICAgICAgIDU1IDAwMDAwMDA4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2RvdWJsZSw4LDgKLSAgICAgICA1NiAwMDAwMDAxMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19sb25nLDQsNAotICAgICAgIDU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXIKLSAgICAgICA1OCAwMDAwMDAxNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19jaGFyLDEsNAotICAgICAgIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2ludAotICAgICAgIDYwIDAwMDAwMDE4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2ludCw0LDQKLSAgICAgICA2MSAwMDAwMDAxQyAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19jaGFyLDEsNAotICAgICAgIDYyIDAwMDAwMDIwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2ludCw0LDQKLSAgICAgICA2MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19kb3VibGUKLSAgICAgICA2NCAwMDAwMDAyOCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19kb3VibGUsOCw4Ci0gICAgICAgNjUgMDAwMDAwMzAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfZmxvYXQsNCw0Ci0gICAgICAgNjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfc2hvcnQKLSAgICAgICA2NyAwMDAwMDAzNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19zaG9ydCwyLDQKLSAgICAgICA2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19mbG9hdAotICAgICAgIDY5IDAwMDAwMDM4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2Zsb2F0LDQsNAotICAgICAgIDcwIDAwMDAwMDNDICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX3Nob3J0LDIsNAotICAgICAgIDcxIDAwMDAwMDQwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF94X2ludCw0LDQKLSAgICAgICA3MiAwMDAwMDA0NCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19jaGFyX3AsNCw0Ci0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI1N2RmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIucworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKLTs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIHN0YXRpYywgZ2xvYmFsLCBhbmQgZXh0ZXJuIGRhdGEgdmFyaWFibGVzLgotCi0JLmZpbGUJInJlbG9jczIucyIKLQkuZ2xvYmFsCV94X2NoYXIKLQkuZ2xvYmFsCV94X3Nob3J0Ci0JLmdsb2JhbAlfeF9sb25nCi0JLmdsb2JhbAlfeF9mbG9hdAotCS5nbG9iYWwJX3hfZG91YmxlCi0JLmdsb2JhbAlfeF9jaGFyX3AKLQkuZ2xvYmFsCV9nX2NoYXIKLQkuZ2xvYmFsCV9nX3Nob3J0Ci0JLmdsb2JhbAlfZ19pbnQKLQkuZ2xvYmFsCV9nX2xvbmcKLQkuZ2xvYmFsCV9nX2Zsb2F0Ci0JLmdsb2JhbAlfZ19kb3VibGUKLQkuZ2xvYmFsCV9nX2NoYXJfcAotCS5nbG9iYWwJX21haW4KLQotX21haW46Ci0gICAgICAgICBsZC5iICAgICAgX3NfY2hhciswKHIwKSxyMgotICAgICAgICAgc3QuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgIGxkLmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICBzdC5iICAgICAgX2dfY2hhciswKHIwKSxyMgotICAgICAgICAgbGQuaCAgICAgIF9zX3Nob3J0KzAocjApLHIyCi0gICAgICAgICBzdC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKLSAgICAgICAgIGxkLmggICAgICBfeF9zaG9ydCswKHIwKSxyMgotICAgICAgICAgc3QuaCAgICAgIF9nX3Nob3J0KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfaW50KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfaW50KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3hfaW50KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfaW50KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfbG9uZyswKHIwKSxyMgotICAgICAgICAgc3QgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfbG9uZyswKHIwKSxyMgotICAgICAgICAgbGQgICAgICAgIF9zX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotICAgICAgICAgc3QgICAgICAgIF9nX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICBsZC5kICAgICAgX3NfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBzdC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBsZC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBzdC5kICAgICAgX2dfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBqc3IuYSAgICAgcjMxKHIwKSxyMAotCi0JLmdsb2JhbAlfZ19jaGFyX3AKLQkuYnNzCV9nX2NoYXJfcCw0LDQKLQkuZ2xvYmFsCV9nX2xvbmcKLQkuYnNzCV9nX2xvbmcsNCw0Ci0JLmJzcwlfc19kb3VibGUsOCw4Ci0JLmJzcwlfc19sb25nLDQsNAotCS5nbG9iYWwJX2dfY2hhcgotCS5ic3MJX2dfY2hhciwxLDQKLQkuZ2xvYmFsCV9nX2ludAotCS5ic3MJX2dfaW50LDQsNAotCS5ic3MJX3NfY2hhciwxLDQKLQkuYnNzCV9zX2ludCw0LDQKLQkuZ2xvYmFsCV9nX2RvdWJsZQotCS5ic3MJX2dfZG91YmxlLDgsOAotCS5ic3MJX3NfZmxvYXQsNCw0Ci0JLmdsb2JhbAlfZ19zaG9ydAotCS5ic3MJX2dfc2hvcnQsMiw0Ci0JLmdsb2JhbAlfZ19mbG9hdAotCS5ic3MJX2dfZmxvYXQsNCw0Ci0JLmJzcwlfc19zaG9ydCwyLDQKLQkuYnNzCV94X2ludCw0LDQKLQkuYnNzCV9zX2NoYXJfcCw0LDQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczJiLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRmOTlkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczJiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNzb3VyY2U6IHJlbG9jczIucwotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIHN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAocmVsb2NzKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMDAwMDAwMDQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMGMgMzIgICAgICAgICAgICAgICAgX3hfY2hhcgotMDAwMDAwMTQgMzIgICAgICAgICAgICAgICAgX3hfY2hhcgotMDAwMDAwMWMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMjQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMmMgMzIgICAgICAgICAgICAgICAgX3hfc2hvcnQKLTAwMDAwMDM0IDMyICAgICAgICAgICAgICAgIF94X3Nob3J0Ci0wMDAwMDAzYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA0NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA0YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA1NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA1YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA2NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA2YyAzMiAgICAgICAgICAgICAgICBfeF9sb25nCi0wMDAwMDA3NCAzMiAgICAgICAgICAgICAgICBfeF9sb25nCi0wMDAwMDA3YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA4NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA4YyAzMiAgICAgICAgICAgICAgICBfeF9mbG9hdAotMDAwMDAwOTQgMzIgICAgICAgICAgICAgICAgX3hfZmxvYXQKLTAwMDAwMDljIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGE0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGFjIDMyICAgICAgICAgICAgICAgIF94X2RvdWJsZQotMDAwMDAwYjQgMzIgICAgICAgICAgICAgICAgX3hfZG91YmxlCi0wMDAwMDBiYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDBjNCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDBjYyAzMiAgICAgICAgICAgICAgICBfeF9jaGFyX3AKLTAwMDAwMGQ0IDMyICAgICAgICAgICAgICAgIF94X2NoYXJfcAotMDAwMDAwZGMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljNDYzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC90aWM4MC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIFRJIFRNUzMyMEM4MCB0ZXN0cy4KLSMKLWlmIFtpc3RhcmdldCB0aWM4MCotKi0qXSB0aGVuIHsKLQotICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wcyIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWdvcHMyIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wczMiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzNCIKLSAgICBydW5fZHVtcF90ZXN0ICJjcmVnb3BzIgotICAgIHJ1bl9kdW1wX3Rlc3QgImZsb2F0IgotICAgIHJ1bl9kdW1wX3Rlc3QgImVuZG1hc2siCi0gICAgcnVuX2R1bXBfdGVzdCAiYml0bnVtIgotICAgIHJ1bl9kdW1wX3Rlc3QgImNjb2RlIgotICAgIHJ1bl9kdW1wX3Rlc3QgImFkZCIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWxvY3MxIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczFiIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczIiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMmIiCi0gICAgcnVuX2R1bXBfdGVzdCAiYWxpZ24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2FyaXRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2FyaXRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjE0MGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9hcml0aC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGFyaXRoX29wY29kZXMKLWFyaXRoX29wY29kZXM6Ci0JYWRkIHI1LHI2Ci0JYWRkIDUscjYKLQlhZGRpIDcscjUscjYKLQlkaXZoIHI1LHI2Ci0JbXVsaCByNSxyNgotCW11bGggNSxyNgotCW11bGhpIDcscjUscjYKLQlzYXIgcjUscjYKLQlzYXIgMzEscjYKLQlzYXRhZGQgcjUscjYKLQlzYXRhZGQgNSxyNgotCXNhdHN1YiByNSxyNgotCXNhdHN1YmkgNyxyNSxyNgotCXNhdHN1YnIgcjUscjYKLQlzaGwgcjUscjYKLQlzaGwgMzEscjYKLQlzaHIgcjUscjYKLQlzaHIgMzEscjYKLQlzdWIgcjUscjYKLQlzdWJyIHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYmFzaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZhNjMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYmFzaWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fYXJpdGgge30gewotICAgIHNldCB0ZXN0bmFtZSAiYXJpdGguczogQXJpdGhtZXRpYyBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYXJpdGgucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgICMgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ4OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEM1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDQ1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA0NTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBFNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBFNTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBFNTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRTUzN0EwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEJGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEM1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIDI1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEE1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDY1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiA4NTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBFNTM3QzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggREYzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRTUzNzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDlGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEE1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDg1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDNkFGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQzY2RjEwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEM2MkYxMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBDNkVGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19icmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoLnM6IGJyYW5jaCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOEYwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRkVGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTZGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRDdGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQ0JGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgQjlGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQTFGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgOTNGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgODJGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTBGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRDhGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQzRGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgQkNGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQTFGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgOTlGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgODJGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTVFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRERFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlLnM6IGNvbXBhcmUgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbXBhcmUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiA2NTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFMDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRTgyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEUxMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBFMTJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTkyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEU5MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBFMjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRUEyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEUzMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBFQjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRTQyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEU0MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBFQzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRUMyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEU1MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBFRDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRTYyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEVFMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBFNzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRUYyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDY1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2p1bXBzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImp1bXBzLnM6IGp1bXBzIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJqdW1wcy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDgwMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA2NTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBCRjA3RkFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEM1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiAyNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSA4NTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgMjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQTUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1lbS5zOiBtZW1vcnkgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1lbS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA1MzcwNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNTM3MDQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjUzNzA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDQwMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIDQwMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDQwMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIDQ2MkYwNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiA2NjJGMDQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgNjYyRjA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEMwMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEMwMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIDQxMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAibWlzYy5zOiBtaXNjIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtaXNjLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTAwNzYwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEUwODc2MDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFMDA3MjAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRTAwNzQwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEUwMDcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGRjA3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRTcyRjIwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEU1M0Y0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92ZS5zOiBtb3ZlIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZlLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDUzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgMDUzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDQ1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2hpbG8ge30gewotICAgIHNldCB0ZXN0bmFtZSAiaGlsby5zOiBoaWxvIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaGlsby5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIwMEVFRkJFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA0MTBFQUVERVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDEwRUFEREVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotcHJvYyBkb19zaW1wbGVfcmVsb2NfdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAicmVsb2MuczogVGVzdCBmb3IgcHJvcGVyIHJlbG9jYXRpb25zIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlbG9jLnMiICIiICJUZXN0IGZvciBwcm9wZXIgcmVsb2NhdGlvbiAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjAwMDAwMDAyXFteXG5cXSpSX1Y4NTBfTE8xNlxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMDZcW15cblxdKlJfVjg1MF9ISTE2X1NcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDBhXFteXG5cXSpSX1Y4NTBfSEkxNlxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMGVcW15cblxdKlJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAxMlxbXlxuXF0qUl9WODUwX1REQV8xNl8xNl9PRkZTRVRcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDE2XFteXG5cXSpSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgdjg1MCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hcml0aAotICAgIGRvX2JpdAotICAgIGRvX2JyYW5jaAotICAgIGRvX2NvbXBhcmUKLSAgICBkb19qdW1wcwotICAgIGRvX2xvZ2ljYWwKLSAgICBkb19tZW0KLSAgICBkb19taXNjCi0gICAgZG9fbW92ZQotCi0gICAgIyBNYWtlIHN1cmUgd2UgaGFuZGxlIGxvKCkgaGkoKSBhbmQgaGkwKCkgY29ycmVjdGx5LgotICAgIGRvX2hpbG8KLQotICAgICMgQ2hlY2sgZm9yIHByb3BlciByZWxvY3Mgb24gbG8sIGhpLCBoaTAsIHpkYW9mZiwgdGRhb2ZmIGFuZCBzZGFvZmYKLSAgICAjIGV4cHJlc3Npb25zCi0gICAgZG9fc2ltcGxlX3JlbG9jX3Rlc3RzCi0KLSAgICBnYXNfdGVzdCAiaGlsbzIucyIgIiIgIiIgImhpL2xvIHJlZ3Jlc3Npb24gdGVzdCIKLSAgICBnYXNfdGVzdCAiZmVwc3cucyIgIiIgIiIgImVxc3cgcmVncmVzc2lvbiB0ZXN0IgotCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInJhbmdlLnMiICItbXdhcm4tc2lnbmVkLW92ZXJmbG93IiAiQ2hlY2sgZm9yIHJhbmdlIGVycm9yIG9uIGJ5dGUgbG9hZC9zdG9yZSIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JpdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFhYzA1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotCS50ZXh0Ci0JLmdsb2JhbCBiaXQKLWJpdDoKLQljbHIxIDUsMTZbcjZdCi0Jbm90MSA1LDE2W3I2XQotCXNldDEgNSwxNltyNl0KLQl0c3QxIDUsMTZbcjZdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjMWI0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGJjYwotYmNjOgotCWJndCBiY2MKLQliZ2UgYmNjCi0JYmx0IGJjYwotCWJsZSBiY2MKLQliaCBiY2MKLQlibmwgYmNjCi0JYmwgYmNjCi0JYm5oIGJjYwotCWJlIGJjYwotCWJuZSBiY2MKLQlidiBiY2MKLQlibnYgYmNjCi0JYm4gYmNjCi0JYnAgYmNjCi0JYmMgYmNjCi0JYm5jIGJjYwotCWJ6IGJjYwotCWJueiBiY2MKLQliciBiY2MKLQlic2EgYmNjCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2NvbXBhcmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFjOGE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGNvbXBhcmUKLWNvbXBhcmU6Ci0JY21wIHI1LHI2Ci0JY21wIDUscjYKLQlzZXRmIHYscjUKLQlzZXRmIG52LHI1Ci0Jc2V0ZiBjLHI1Ci0Jc2V0ZiBsLHI1Ci0Jc2V0ZiBuYyxyNQotCXNldGYgbmwscjUKLQlzZXRmIHoscjUKLQlzZXRmIG56LHI1Ci0Jc2V0ZiBuaCxyNQotCXNldGYgaCxyNQotCXNldGYgcyxyNQotCXNldGYgbixyNQotCXNldGYgbnMscjUKLQlzZXRmIHAscjUKLQlzZXRmIHQscjUKLQlzZXRmIHNhLHI1Ci0Jc2V0ZiBsdCxyNQotCXNldGYgZ2UscjUKLQlzZXRmIGxlLHI1Ci0Jc2V0ZiBndCxyNQotCXRzdCByNSxyNgotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAzMzNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvZmVwc3cucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbGRzciByMTcsZmVwc3cKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjdlNTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotCS50ZXh0Ci0JbW92ZWEgbG8oMHhkZWFkYmVlZikscjAscjEKLQltb3ZoaSBoaSgweGRlYWRiZWVmKSxyMSxyMQotCW1vdmhpIGhpMCgweGRlYWRiZWVmKSxyMSxyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFkNTkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsbzIucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS50ZXh0Ci0JLm9yZyAweDEwMDAwCi0JbW92ZWEgaGkoYmxhaCkscjAscjEKLWJsYWg6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzE2NGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9qdW1wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwganVtcHMKLWp1bXBzOgotCWphcmwganVtcHMscjUKLQlqbXAgW3I1XQotCWpyIGp1bXBzCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjAwYjNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGxvZ2ljYWxzCi1sb2dpY2FsczoKLQlhbmQgcjUscjYKLQlhbmRpIDcscjUscjYKLQlub3QgcjUscjYKLQlvciByNSxyNgotCW9yaSA3LHI1LHI2Ci0JeG9yIHI1LHI2Ci0JeG9yaSA3LHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2OWNlYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIG1lbW9yeQotbWVtb3J5OgotCWxkLmIgNVtyNV0scjYKLQlsZC5oIDRbcjVdLHI2Ci0JbGQudyA0W3I1XSxyNgotCXNsZC5iIDY0W2VwXSxyNgotCXNsZC5oIDEyOFtlcF0scjYKLQlzbGQudyAxMjhbZXBdLHI2Ci0Jc3QuYiByNSw1W3I2XQotCXN0LmggcjUsNFtyNl0KLQlzdC53IHI1LDRbcjZdCi0Jc3N0LmIgcjYsNjRbZXBdCi0Jc3N0LmggcjYsMTI4W2VwXQotCXNzdC53IHI2LDEyOFtlcF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzRlNGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbWlzYwotbWlzYzoKLQlkaQotCWVpCi0JaGFsdAotCW5vcAotCXJldGkKLQl0cmFwIDAKLQl0cmFwIDMxCi0JbGRzciByNyxwc3cKLQlzdHNyIHBzdyxyNwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tb3ZlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNmZhZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIG1vdmUKLW1vdmU6Ci0JbW92IHI1LHI2Ci0JbW92IDUscjYKLQltb3ZlYSA3LHI1LHI2Ci0JbW92aGkgNyxyNSxyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmFjY2Y0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmFuZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbGQuYiAweGZmNjJbcjBdLHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzhkMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQltb3ZlYSBsbyhmb28pLHIwLHIxCi0JbW92aGkgaGkoZm9vKSxyMSxyMQotCW1vdmhpIGhpMChmb28pLHIxLHIxCi0JbW92ZWEgemRhb2ZmKF9mb28pLHIwLHIxCi0JbW92aGkgdGRhb2ZmKF9mb28pLGVwLHIxCi0JbW92aGkgc2Rhb2ZmKF9mb28pLGdwLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NzcwYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcHJvYyBkb19xdWFkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInF1YWQuczogcXVhZHdvcmQgaW1tZWRpYXRlIHZhbHVlcyIKLSAgICBzZXQgeDEgMAotICAgIHNldCB4MiAwCi0gICAgc2V0IHgzIDAKLSAgICBnYXNfc3RhcnQgInF1YWQucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gKzJcWyBcdFxdKzAwMDArIDdEOEY3ODU2XFsgXHRcXSttb3ZxXFteXG5cXSpcbiIgeyBzZXQgeDEgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rMzQxMkREQ0NcW15cblxdKlxuIgkJICAgeyBzZXQgeDIgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rQkJBQTUwMDFcWyBcdFxdKlxyXG4iCQkgICB7IHNldCB4MyAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmIFthbGxfb25lcyAkeDEgJHgyICR4M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IHZheC0qLSpdIHRoZW4gewotICAgIGRvX3F1YWQKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFkNGFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkudGV4dAotCW1vdnEgJDB4YWFiYmNjZGQxMjM0NTY3OCxyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBiYjk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IHZ0YWJsZSBlbnRyeTAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMTAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY4OWUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotLnRleHQKLS52dGFibGVfZW50cnkgdnRibF9hLCAxNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE2ZTRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IHZ0YWJsZSBlbnRyeTEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMDAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hLioKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Zjg5ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0udGV4dAotLnZ0YWJsZV9lbnRyeSB2dGJsX2EsIDE2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5NWIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogdnRhYmxlIGluaGVyaXQwCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcWy5kYXRhXF06Ci1PRkZTRVQgK1RZUEUgK1ZBTFVFIAotMCswMDAwMDAwIFJfLipfR05VX1ZUSU5IRVJJVCAgXCpBQlNcKgotMCswMDAwMDEwIFJfLipfR05VX1ZUSU5IRVJJVCAgdnRibF9hCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzhkZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0uZGF0YQotCi0udHlwZSB2dGJsX2Esb2JqZWN0Ci12dGJsX2E6Ci0JLnNwYWNlIDE2Ci0uc2l6ZSB2dGJsX2EsMTYKLS52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKLQotLnR5cGUgdnRibF9iLG9iamVjdAotdnRibF9iOgotCS5zcGFjZSAxNgotLnNpemUgdnRibF9iLDE2Ci0udnRhYmxlX2luaGVyaXQgdnRibF9iLCB2dGJsX2EKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDYzNTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjoxOiBFcnJvcjogZXhwZWN0ZWQgYHZ0YmxfYScgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQKLS4qR0FTLioKLQotCi0gKzEuKnZ0YWJsZV9pbmhlcml0IHZ0YmxfYSwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMWQyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS92dGFibGUuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzA3NzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jCi0jIHZ0YWJsZSB0ZXN0cwotIwotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gICAgc2V0IHRlc3RuYW1lICJ2dGFibGUgJG5hbWUiCi0gICAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gICAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0jIFZ0YWJsZSBiaXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBieSBFTEYgdGFyZ2V0cy4KLWlmIHsgKFtpc3RhcmdldCAiKi0qLWVsZioiXQkJCi0gICAgICB8fCBbaXN0YXJnZXQgIiotKi1saW51eCoiXSkKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqYW91dCpdCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB0aGVuIHsKLQotICAgICMgbm90IHN1cHBvcnRlZCBieSBEMzBWCi0gICAgaWYge1tpc3RhcmdldCAiZDMwdi0qLSoiXX0gewotICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgIyBub3QgeWV0IHN1cHBvcnRlZCBieSBpOTYwCi0gICAgaWYge1tpc3RhcmdldCAiaTk2MC0qLSoiXX0gewotICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgcnVuX2R1bXBfdGVzdCAiaW5oZXJpdDAiIAotICAgIHJ1bl9saXN0X3Rlc3QgImluaGVyaXQxIiAiLWFsIgotCi0gICAgIyBUaGUgdnRhYmxlIGVudHJ5IHJlc3VsdHMgYXJlIGRpZmZlcmVudCBvbiBSZWwgYW5kIFJlbGEgdGFyZ2V0cy4KLSAgICBpZiB7W2lzdGFyZ2V0ICJpKjg2LSotKiJdIHx8IFtpc3RhcmdldCAibWlwcyotKi0qIl19IHRoZW4gewotCi0JcnVuX2R1bXBfdGVzdCAiZW50cnkwIgotCi0gICAgfSBlbHNlIHsKLQotCXJ1bl9kdW1wX3Rlc3QgImVudHJ5MSIKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMxLkggYi9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMS5ICmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDM3MzIzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMxLkgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUZJTEUgMSBGSVJTVCBMSU5FCi0JLklOQ0xVREUJIklOQzIuSCIKLUZJTEUgMSBMQVNUIExJTkUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMyLkggYi9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMi5ICmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNjM2RjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMyLkgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQlGSUxFIDIgRklSU1QgTElORQotCUZJTEUgMiBMQVNUIExJTkUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjY3MTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLWZvbzoJLkFTU0lHTkMJImhlbGxvIgotQkFSOgkuQVNTSUdOQQkxMiszNAotCi0JXCZmb28nZm9vCi0JXCZmb29cJmZvb1wmZm9vIAotCVwmZm9vIFwmZm9vIFwmZm9vIAotCVwmQkFSXCZiYXJcJkJBUgotCi0KLQotCQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzczM2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hc3NpZ24uYXNtOjggQ2FuJ3QgZmluZCBwcmVwcm9jZXNzb3IgdmFyaWFibGUgYmFyLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1MDlhZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSEKLQotIWZvbzoJLkFTU0lHTkMJImhlbGxvIgotIUJBUjoJLkFTU0lHTkEJMTIrMzQKLSEKLQotIQlcJmZvbydmb28KLQloZWxsb2ZvbwotIQlcJmZvb1wmZm9vXCZmb28gCi0JaGVsbG9oZWxsb2hlbGxvIAotIQlcJmZvbyBcJmZvbyBcJmZvbyAKLQloZWxsbyBoZWxsbyBoZWxsbyAKLSEJXCZCQVJcJmJhclwmQkFSCi0JNDY0NgotIQotCi0hCi0KLSEKLQotIQkKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ5ZjA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAyCi0JQkFECi0JLkFFTFNFCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgMgotCUJBRAotCS5BRUxTRQotCU9LCi0JLkFJRgkxIEVRIDIKLQlCQUQKLQkuQUVMU0UKLQlPSwotCS5BRU5ESQotCS5BRU5ESQotCS5BSUYJMSBMVCAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRICAyCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIE5FICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgTEUgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBHVCAgMgotCUJBRAotCS5BRU5ESQotCS5BSUYJMyBHRSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkzIExUICAyCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkzIEVRICAyCi0JQkFEIAotCS5BRU5ESQotCS5BSUYJMyBORSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkzIExFICAyCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkzIEdUICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTMgR0UgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJIkZPTyIgRVEgIkJBUiIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCSJGT08iIEVRICJGT08iCi0JT0sKLQkuQUVOREkKLQkuQUlGCSJGT08iIE5FICJCQVIiCi0JT0sKLQkuQUVOREkKLQkuQUlGCSJGT08iIEVRICJGT08iCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgMQotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUVMU0UJCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDAKLQlCQUQKLQkuQUVMU0UJCi0JT0sKLQkuQUVOREkKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUVMU0UJCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDAKLQlCQUQKLQkuQUVMU0UJCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUVMU0UJCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDAKLQlCQUQKLQkuQUVMU0UJCi0JT0sKLQkuQUVOREkKLQkuQUVMU0UJCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDAKLQlCQUQKLQkuQUVMU0UJCi0JT0sKLQkuQUVOREkKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1Y2VmNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAyCi0hCUJBRAotIQkuQUVMU0UKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDIKLSEJQkFECi0hCS5BRUxTRQotIQlPSwotCU9LCi0hCS5BSUYJMSBFUSAyCi0hCUJBRAotIQkuQUVMU0UKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFFTkRJCi0hCS5BSUYJMSBMVCAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgIDIKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgTkUgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIExFICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBHVCAgMgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMyBHRSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTMgTFQgIDIKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTMgRVEgIDIKLSEJQkFEIAotIQkuQUVOREkKLSEJLkFJRgkzIE5FICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMyBMRSAgMgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMyBHVCAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTMgR0UgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkiRk9PIiBFUSAiQkFSIgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJIkZPTyIgRVEgIkZPTyIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkiRk9PIiBORSAiQkFSIgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIEVRICJGT08iCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAxCi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFFTFNFCQotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAwCi0hCUJBRAotIQkuQUVMU0UJCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCU9LCi0JT0sKLSEJLkFFTFNFCQotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAwCi0hCUJBRAotIQkuQUVMU0UJCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFFTFNFCQotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAwCi0hCUJBRAotIQkuQUVMU0UJCi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFFTFNFCQotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAwCi0hCUJBRAotIQkuQUVMU0UJCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFFTFNFCQotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAwCi0hCUJBRAotIQkuQUVMU0UJCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEwY2M1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0KLQlTdHVmZiB0byB0cnkgYW5kIGNyYXNoIGl0Ci0KLWZvbzoJLk1BQ1JPCQotCUhJCi1iYXI6CS5NQUNSTwkKLQlUSEVSRQotCWJhcgotCS5FTkRNCQotCi0KLQkuRU5ETQotCWZvbwotCWZvbwotCWZvbwotCWZvbwotCWZvbwotCWJhcgotCi0KLQotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDg4MDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNyYXNoLmFzbToxOCBVbnJlYXNvbmFibGUgZXhwYW5zaW9uICgtdSB0dXJucyBvZmYgY2hlY2spLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTQ4YTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDMwNTkgKzAsMCBAQAotIQotCi0hCVN0dWZmIHRvIHRyeSBhbmQgY3Jhc2ggaXQKLQlTdHVmZiB0byB0cnkgYW5kIGNyYXNoIGl0Ci0hCi0KLSFmb286CS5NQUNSTwkKLSEJSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotIQotIQkuRU5ETQotIQlmb28KLSEJSEkKLQlISQotIWJhcjoJLk1BQ1JPCQotIQlUSEVSRQotIQliYXIKLSEJLkVORE0JCi0hCi0KLSEKLQotIQlmb28KLSEJSEkKLQlISQotIWJhcjoJLk1BQ1JPCQotIQlUSEVSRQotIQliYXIKLSEJLkVORE0JCi0hCi0KLSEKLQotIQlmb28KLSEJSEkKLQlISQotIWJhcjoJLk1BQ1JPCQotIQlUSEVSRQotIQliYXIKLSEJLkVORE0JCi0hCi0KLSEKLQotIQlmb28KLSEJSEkKLQlISQotIWJhcjoJLk1BQ1JPCQotIQlUSEVSRQotIQliYXIKLSEJLkVORE0JCi0hCi0KLSEKLQotIQlmb28KLSEJSEkKLQlISQotIWJhcjoJLk1BQ1JPCQotIQlUSEVSRQotIQliYXIKLSEJLkVORE0JCi0hCi0KLSEKLQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKLSEJVEhFUkUKLQlUSEVSRQotIQliYXIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjZiMzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLQotCS5NQUNSTyAJZm9vIGEgYiBjPWEKLQlcYSBcYiBcYyBcZAotCS5FTkRNCi0KLQlmb28gMSAyCi0JZm9vIDEgMiAzIDQKLQlmb28gMQotCWZvbyAKLQotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjVkMDc4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIQotCi0hCi0KLSEJLk1BQ1JPIAlmb28gYSBiIGM9YQotIQlcYSBcYiBcYyBcZAotIQkuRU5ETQotIQotCi0hCWZvbyAxIDIKLSEJMSAyIGEgXGQKLQkxIDIgYSBcZAotIQlmb28gMSAyIDMgNAotIQlmb28gMQotIQkxICBhIFxkCi0JMSAgYSBcZAotIQlmb28gCi0hCSAgYSBcZAotCWEgXGQKLSEKLQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGEwMDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0KLWZvbzoJLkFTU0lHTkEJMQotCVwmZm9vKzEJCi0JXCZmb28rMQotZm9vOgkuQVNTSUdOQwkiZm9vIgotCVwmZm9vKzEKLQlcJmZvbysxCi0KLWZvbzoJLkFTU0lHTkEJMQotCVwmZm9vKzEJCi0JXCZmb28rMQotZm9vOgkuQVNTSUdOQwkiZm9vIgotCVwmZm9vKzEKLQlcJmZvbysxCi0KLWZvbzoJLkFTU0lHTkEJMQotCVwmZm9vKzEJCi0JXCZmb28rMQotZm9vOgkuQVNTSUdOQwkiZm9vIgotCVwmZm9vKzEKLQlcJmZvbysxCi0KLWZvbzoJLkFTU0lHTkEJMQotCVwmZm9vKzEJCi0JXCZmb28rMQotZm9vOgkuQVNTSUdOQwkiZm9vIgotCVwmZm9vKzEKLQlcJmZvbysxCi0KLWZvbzoJLkFTU0lHTkEJMQotCVwmZm9vKzEJCi0JXCZmb28rMQotZm9vOgkuQVNTSUdOQwkiZm9vIgotCVwmZm9vKzEKLQlcJmZvbysxCi0JZm9vCi0JZm9vCWZvbwotCWZvbwlmb28KLQlmb28KLQkuRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxYTJmNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCWZvbwotCWZvbwotIQlmb28JZm9vCi0JZm9vCWZvbwotIQlmb28JZm9vCi0JZm9vCWZvbwotIQlmb28KLQlmb28KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTZiMGEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQotZm9vCS5EQVRBCTEsMiwzCi1iYXIJLkRBVEEJMSwyLDMsNCw1ICw2Ci0JLkRBVEEuQgkxMjM0NSwxMiwyCi0JLkRBVEEuVyA5LDIsMTIsMywxMys0MSxmb28rOQotCS5EQVRBLkwgMn45OQotCi0KLQotCS5EQVRBQgkxLDIsMwotCS5EQVRBQgkxLDIsMwotCi0KLQotCi0JLkRBVEFCCTEsOSszMgotCi0JLkRBVEFCLkwJMSxIJzExMTExMTExCi0JLkRBVEFCLlcJMixIJzIyMjIKLQkuREFUQUIuQgkzLEgnMzMzCi0KLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTZlMWU1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSEKLQotIWZvbwkuREFUQQkxLDIsMwotZm9vOgkubG9uZwkxLDIsMwotIWJhcgkuREFUQQkxLDIsMyw0LDUgLDYKLWJhcjoJLmxvbmcJMSwyLDMsNCw1LDYKLSEJLkRBVEEuQgkxMjM0NSwxMiwyCi0JLmJ5dGUJMTIzNDUsMTIsMgotIQkuREFUQS5XIDksMiwxMiwzLDEzKzQxLGZvbys5Ci0JLnNob3J0CTksMiwxMiwzLDU0LGZvbys5Ci0hCS5EQVRBLkwgMn45OQotCS5sb25nCTk3Ci0hCi0KLSEKLQotIQotCi0hCS5EQVRBQgkxLDIsMwotCS5maWxsCTEsNCwyCi0hCS5EQVRBQgkxLDIsMwotCS5maWxsCTEsNCwyCi0hCi0KLSEKLQotIQotCi0hCi0KLSEJLkRBVEFCCTEsOSszMgotCS5maWxsCTEsNCw0MQotIQotCi0hCS5EQVRBQi5MCTEsSCcxMTExMTExMQotCS5maWxsCTEsNCwyODYzMzExNTMKLSEJLkRBVEFCLlcJMixIJzIyMjIKLQkuZmlsbAkyLDIsODczOAotIQkuREFUQUIuQgkzLEgnMzMzCi0JLmZpbGwJMywxLDgxOQotIQotCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxNjA4YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLQotOyB0ZXN0IGFsbCBvcHMKLQotYTEJLkVRVQk0KzEwCi1hMgkuRVFVCTQtMTAKLWEzCS5FUVUJNCYxMAotYTQJLkVRVQk0fDIKLWE1CS5FUVUJNH4yCi1hNgkuRVFVCTQqMTAKLWE3CS5FUVUJNDAvMTAKLWE4CS5FUVUJKzcKLWE5CS5FUVUJLTcKLWExMAkuRVFVCX43Ci0KLQotCWExIGEyIGEzIGE0IGE1IGE2IGE3IGE4IGE5IGExMAotCi07IHRlc3QgdGhlIHByaW9yaXRpZXMKLQotYjEJLkVRVQkxfDJ+MyY0KzUtOCo3LzIKLWIyCS5FUVUJKDF8Mn4oMyYoNCs1LSg4Kig3LzIpKSkpKQotYjMJLkVRVQkxMCoyLzMqNAotYjQJLkVRVQkoKCgxMCoyKS8zKSo0KQotYjUJLkVRVQkxMCsyLTMrNAotYjYJLkVRVQkoKCgxMCsyKS0zKSs0KQotCi0JYjEgYjIgYjMgYjQKLQotOyB0ZXN0IGFzc29jaWF0aW9uCi0KLWMxCS5FUVUJLX4zCi1jMgkuRVFVCX4tMwotYzMJLkVRVQktKH4zKQotYzQJLkVRVQl+KC0zKQotCi0JYzEgYzIgYzMgYzQKLQotOyB0ZXN0IHJ1bGVzIGZvciBzeW1ib2xzCi0KLW9rMQkuRVFVCUZPTwotb2syCS5FUVUJRk9PKzEwCi1vazMJLkVRVQkxMCtGT08KLW9rNAkuRVFVCUZPTy0xMAotCi0Jb2sxCi0Jb2syIAotCW9rMyAKLQlvazQKLQotb2s1CS5FUVUJRk9PKzMrNCs1KzYKLW9rNgkuRVFVCUZPTy1CQVIKLQotCW9rNQotCW9rNgotCi1iYWQxCS5FUVUJRk9PK0ZPTwotYmFkMgkuRVFVCUZPTyoyCi1iYWQzCS5FUVUJRk9PLzIKLWJhZDQJLkVRVQlGT098MgotYmFkNQkuRVFVCUZPTyYyCi1iYWQ2CS5FUVUJRk9PfjIKLWJhZDcJLkVRVQlGT08qMgotCi07IHRlc3Qgc3BhY2luZwotCi1zcGFjZTEJLkVRVQkxICsJMgkrMytGT08gKyAzCi1zcGFjZTIKLQotOyBmcm9tIHRoZSBTSCBtYW51YWwKLQotCS5EQVRBLkwJMSsoMi0oMysoNC01KSkpLDEKLQotCS5EQVRBLkwJLUgnZmZmZmZmZjErSCcwMDAwMDBmMCpIJzAwMDAwMDEwfEgnMDAwMDAwZjAmSCcwMDAwZmZmZixIJzAwMDAwZmZmCi0KLQkuREFUQS5MCS1+LX5IJzAwMDAwMDBmLEgnMDAKLQotCi0JCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDFmZDUyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuZXJyCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1leHAuYXNtOjU2IGNhbid0IGFkZCB0d28gcmVsb2NhdGFibGUgZXhwcmVzc2lvbnMKLWV4cC5hc206NTcgdGhlICogb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KLWV4cC5hc206NTggdGhlIC8gb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KLWV4cC5hc206NTkgdGhlIHwgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KLWV4cC5hc206NjAgdGhlICYgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KLWV4cC5hc206NjEgdGhlIH4gb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KLWV4cC5hc206NjIgdGhlICogb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlY2I5YTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIQotCi0hOyB0ZXN0IGFsbCBvcHMKLQk7IHRlc3QgYWxsIG9wcwotIQotCi0hYTEJLkVRVQk0KzEwCi0hYTIJLkVRVQk0LTEwCi0hYTMJLkVRVQk0JjEwCi0hYTQJLkVRVQk0fDIKLSFhNQkuRVFVCTR+MgotIWE2CS5FUVUJNCoxMAotIWE3CS5FUVUJNDAvMTAKLSFhOAkuRVFVCSs3Ci0hYTkJLkVRVQktNwotIWExMAkuRVFVCX43Ci0hCi0KLSEKLQotIQlhMSBhMiBhMyBhNCBhNSBhNiBhNyBhOCBhOSBhMTAKLQkxNCAtNiAwIDYgNiA0MCA0IDcgLTcgLTgKLSEKLQotITsgdGVzdCB0aGUgcHJpb3JpdGllcwotCTsgdGVzdCB0aGUgcHJpb3JpdGllcwotIQotCi0hYjEJLkVRVQkxfDJ+MyY0KzUtOCo3LzIKLSFiMgkuRVFVCSgxfDJ+KDMmKDQrNS0oOCooNy8yKSkpKSkKLSFiMwkuRVFVCTEwKjIvMyo0Ci0hYjQJLkVRVQkoKCgxMCoyKS8zKSo0KQotIWI1CS5FUVUJMTArMi0zKzQKLSFiNgkuRVFVCSgoKDEwKzIpLTMpKzQpCi0hCi0KLSEJYjEgYjIgYjMgYjQKLQkyIDIgMjQgMjQKLSEKLQotITsgdGVzdCBhc3NvY2lhdGlvbgotCTsgdGVzdCBhc3NvY2lhdGlvbgotIQotCi0hYzEJLkVRVQktfjMKLSFjMgkuRVFVCX4tMwotIWMzCS5FUVUJLSh+MykKLSFjNAkuRVFVCX4oLTMpCi0hCi0KLSEJYzEgYzIgYzMgYzQKLQk0IDIgNCAyCi0hCi0KLSE7IHRlc3QgcnVsZXMgZm9yIHN5bWJvbHMKLQk7IHRlc3QgcnVsZXMgZm9yIHN5bWJvbHMKLSEKLQotIW9rMQkuRVFVCUZPTwotIW9rMgkuRVFVCUZPTysxMAotIW9rMwkuRVFVCTEwK0ZPTwotIW9rNAkuRVFVCUZPTy0xMAotIQotCi0hCW9rMQotCUZPTwotIQlvazIgCi0JRk9PKzEwIAotIQlvazMgCi0JRk9PKzEwIAotIQlvazQKLQlGT08rLTEwCi0hCi0KLSFvazUJLkVRVQlGT08rMys0KzUrNgotIW9rNgkuRVFVCUZPTy1CQVIKLSEKLQotIQlvazUKLQlGT08rMTgKLSEJb2s2Ci0JRk9PLUZPTwotIQotCi0hYmFkMQkuRVFVCUZPTytGT08KLSFiYWQyCS5FUVUJRk9PKjIKLSFiYWQzCS5FUVUJRk9PLzIKLSFiYWQ0CS5FUVUJRk9PfDIKLSFiYWQ1CS5FUVUJRk9PJjIKLSFiYWQ2CS5FUVUJRk9PfjIKLSFiYWQ3CS5FUVUJRk9PKjIKLSEKLQotITsgdGVzdCBzcGFjaW5nCi0JOyB0ZXN0IHNwYWNpbmcKLSEKLQotIXNwYWNlMQkuRVFVCTEgKwkyCSszK0ZPTyArIDMKLSFzcGFjZTIKLXNwYWNlMjoKLSEKLQotITsgZnJvbSB0aGUgU0ggbWFudWFsCi0JOyBmcm9tIHRoZSBTSCBtYW51YWwKLSEKLQotIQkuREFUQS5MCTErKDItKDMrKDQtNSkpKSwxCi0JLmxvbmcJMSwxCi0hCi0KLSEJLkRBVEEuTAktSCdmZmZmZmZmMStIJzAwMDAwMGYwKkgnMDAwMDAwMTB8SCcwMDAwMDBmMCZIJzAwMDBmZmZmLEgnMDAwMDBmZmYKLQkubG9uZwk0MDk1LDQwOTUKLSEKLQotIQkuREFUQS5MCS1+LX5IJzAwMDAwMDBmLEgnMDAKLQkubG9uZwkxNywwCi0hCi0KLSEKLQotIQkKLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZ2FzcC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZ2FzcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNzJhNmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2dhc3AuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBUZXN0IGdhc3AuCi0KLXByb2MgZ2FzcF90ZXN0IHsgZmlsZW5hbWUgdGVzdG5hbWUgb3B0IH0gIHsKLSAgICBnbG9iYWwgR0FTUAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBzZW5kX2xvZyAiJHNyY2Rpci9saWIvcnVuICRHQVNQIC1JJHNyY2Rpci9nYXNwIC1zICRvcHQgJGZpbGVuYW1lLmFzbSAtbyBnYXNwLm91dFxuIgotICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkR0FTUCAtSSRzcmNkaXIvZ2FzcCAtcyAkb3B0ICRmaWxlbmFtZS5hc20gLW8gZ2FzcC5vdXQiIGVycnMKLSAgICBjYXRjaCAiZXhlYyBkaWZmIGdhc3Aub3V0ICRmaWxlbmFtZS5vdXQiIGRpZmZzCi0gICAgc2V0IGRpZmZzIFtwcnVuZV93YXJuaW5ncyAkZGlmZnNdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGRpZmZzXSB7Ci0Jc2VuZF9sb2cgIiRkaWZmc1xuIgotCXZlcmJvc2UgJGRpZmZzCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4gMAotICAgIH0gZWxzZSB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9Ci0KLX0KLQotZm9yZWFjaCBzcmMgWyBsc29ydCBbIGdsb2IgJHNyY2Rpci9nYXNwLyouYXNtIF0gXSB7Ci0gICAgcmVnc3ViIC1hbGwgIi5hc20iICRzcmMgIiIgdAotICAgIHJlZ3N1YiAiXi4qLyhcW14vXF0qKSQiICR0ICJnYXNwIFxcMSIgdGVzdG5hbWUKLSAgICBnYXNwX3Rlc3QgJHQgJHRlc3RuYW1lICIiCi19Ci0KLWZvcmVhY2ggc3JjIFsgbHNvcnQgWyBnbG9iICRzcmNkaXIvZ2FzcC9tcmkvKi5hc20gXSBdIHsKLSAgICByZWdzdWIgLWFsbCAiLmFzbSIgJHNyYyAiIiB0Ci0gICAgcmVnc3ViICJeLiovKFxbXi9cXSopJCIgJHQgImdhc3AgTVJJIFxcMSIgdGVzdG5hbWUKLSAgICBnYXNwX3Rlc3QgJHQgJHRlc3RuYW1lICItTSIKLX0KLQotIyBGSVhNRTogdGhpcyBpcyBoZXJlIGNhdXNlIG9mIGEgYnVnIGluIERlamFHbnUgMS4xLjEuIFdoZW4gaXQgaXMgbm8gbG9uZ2VyCi0jICAgICAgICBpbiB1c2UsIHRoZW4gdGhpcyBjYW4gYmUgcmVtb3ZlZC4KLWlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgIHVuc2V0IGVycm9ySW5mbwotfQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWQxZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JSEkKLQkuSU5DTFVERQkiSU5DMS5IIgotCVRIRVJFCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3N2EwZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIQlISQotCUhJCi0hCS5JTkNMVURFCSJJTkMxLkgiCi0hRklMRSAxIEZJUlNUIExJTkUKLUZJTEU6CTEgRklSU1QgTElORQotIQkuSU5DTFVERQkiSU5DMi5IIgotIQlGSUxFIDIgRklSU1QgTElORQotCUZJTEUgMiBGSVJTVCBMSU5FCi0hCUZJTEUgMiBMQVNUIExJTkUKLQlGSUxFIDIgTEFTVCBMSU5FCi0hRklMRSAxIExBU1QgTElORQotRklMRToJMSBMQVNUIExJTkUKLSEJVEhFUkUKLQlUSEVSRQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTRjZmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0KLQkuSEVBRElORwkiICIiUVVPVEUiIiAiCi0JLlBBR0UKLQkuUFJJTlQgTElTVAotCWZvbwkJCi0JLlBSSU5UIE5PTElTVAotCWZvbwotCi0KLQkuRk9STQlMSU49MTIKLQkuRk9STQlDT0w9OTAKLQkuRk9STQlMSU49MTIzIENPTD0yMwotCQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3Rpbmcub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3Rpbmcub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODViZGEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSEKLQotIQotCi0hCS5IRUFESU5HCSIgIiJRVU9URSIiICIKLQkudGl0bGUJIiAiUVVPVEUiICIKLSEJLlBBR0UKLQkuZWplY3QKLSEJLlBSSU5UIExJU1QKLQkubGlzdAotIQlmb28JCQotCWZvbwkJCi0hCS5QUklOVCBOT0xJU1QKLQkubm9saXN0Ci0hCWZvbwotCWZvbwotIQotCi0hCi0KLSEJLkZPUk0JTElOPTEyCi0JLnBzaXplIDEyLDEzMgotIQkuRk9STQlDT0w9OTAKLQkucHNpemUgNjAsOTAKLSEJLkZPUk0JTElOPTEyMyBDT0w9MjMKLQkucHNpemUgMTIzLDIzCi0hCQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiMTZiZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLQkuTUFDUk8JU1VNIEZST009MCwgVE89OQotCTsgXEZST00gXFRPCi0JTU9WCVJcRlJPTSxSMTAKLUNPVU5UCS5BU1NJR05BCVxGUk9NKzEKLQkuQVdISUxFCVwmQ09VTlQgTEUgXFRPCi0JTU9WCVJcJkNPVU5ULFIxMAotQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0JLkFFTkRXCi0JLkVORE0KLQotCVNVTSAwLDUKLQlTVU0gCVRPPTUKLQlTVU0gCUZST009MiwgVE89NQotCi0KLTsgaGkgdGhpcyBpcyBhIGNvbW1lbnQKLQkuTUFDUk8JQkFDS19TTEFTSF9TRVQKLQlcKE1PVgkjIlwiLFIwKSAKLQkuRU5ETQotCUJBQ0tfU0xBU0hfU0VUCi0JLk1BQ1JPCUNPTU0KLQliYXIJOyB0aGlzIGNvbW1lbnQgd2lsbCBnZXQgY29waWVkIG91dAotCWZvbwlcOyB0aGlzIG9uZSB3aWxsIGdldCBkcm9wcGVkCi0JLkVORE0KLQlDT01NCi0JQkFDS19TTEFTSF9TRVQKLQkuTUFDUk8JUExVUzIKLQlBREQJIzEsUlwmVjEKLQkuU0RBVEEJIlwmVicxIgotCS5FTkRNCi1WCS5BU1NJR05DCSJSIgotVjEJLkFTU0lHTkEJMQotCVBMVVMyCi0JLk1BQ1JPCVBMVVMxCVAsUDEKLQlBREQJIzEsXFAxCi0JLlNEQVRBCSJcUCcxIgotCS5FTkRNCi0JUExVUzEJUixSMQotCi0JLk1BQ1JPCVNVTSBQMQotCU1PVglSMCxSMTAKLQlBREQJUjEsUjEwCi0JQURECVIyLFIxMAotCVxQMQkKLQlBREQJUjMsUjEwCi0JLkVORE0KLQotCVNVTQkuRVhJVE0KLQotCS5NQUNSTyBmb28gYmFyPWEgZGVmYXVsdD1iCi0JXGJhcgotCVxkZWZhdWx0Ci0JYmFyCi0JZGVmYXVsdAotCS5FTkRNCi0JZm9vIGRlZmF1bHQ9ZG9nIGJhcj1jYXQKLQlmb28gWCBZCi0JZm9vCi0JZm9vIGJhcj1jYXQgZGVmYXVsdD1kb2cKLQotCi0JLk1BQ1JPCWZvbyBiYXIKLQlISQotCUhJIFxiYXIKLQlISQotCS5FTkRNCi0KLQlmb28gMQotCWZvbyAxMjMKLQlmb28gMSAyIDMgNAotCWZvbwotCi0JCi0JLk1BQ1JPCVBVU0ggUm4KLQlNT1YuTAlcUm4sQC1yMTUKLQkuRU5ETQotCVBVU0gJUjAKLQlQVVNICVIxCi0KLQotCS5NQUNSTwlSRVNfU1RSIFNUUiwgUm4KLQlNT1YuTAkjc3RyXEAsXFJuCi0JQlJBCWVuZF9zdHJcQAotCU5PUAotc3RyXEAJLlNEQVRBICJcU1RSIgotCS5BTElHTgkyCi1lbmRfc3RyXEAKLQkuRU5ETQotCQotCVJFU19TVFIJIk9ORSIsUjAJCi0JUkVTX1NUUgkiVFdPIixSMQotCVJFU19TVFIJIlRIUkVFIixSMgotCi0KLQotCVJFU19TVFIgU1RSPWRvbmtleSBSbj1SMQotCVJFU19TVFIgZG9ua2V5LFIxCi0gCVJFU19TVFIgZG9ua2V5IFJuPVIxCi0JLkVORAotCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8ub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0MDczMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8ub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLSEJLk1BQ1JPCVNVTSBGUk9NPTAsIFRPPTkKLSEJOyBcRlJPTSBcVE8KLSEJTU9WCVJcRlJPTSxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcRlJPTSsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSBcVE8KLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJLkVORE0KLSEKLQotIQlTVU0gMCw1Ci0hCTsgMCA1Ci0JOyAwIDUKLSEJTU9WCVIwLFIxMAotCU1PVglSMCxSMTAKLSFDT1VOVAkuQVNTSUdOQQkwKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSMSxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSMixSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSMyxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSNCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSNSxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJU1VNIAlUTz01Ci0hCTsgMCA1Ci0JOyAwIDUKLSEJTU9WCVIwLFIxMAotCU1PVglSMCxSMTAKLSFDT1VOVAkuQVNTSUdOQQkwKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSMSxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSMixSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSMyxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSNCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSNSxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJU1VNIAlGUk9NPTIsIFRPPTUKLSEJOyAyIDUKLQk7IDIgNQotIQlNT1YJUjIsUjEwCi0JTU9WCVIyLFIxMAotIUNPVU5UCS5BU1NJR05BCTIrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIzLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI0LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI1LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQotCi0hCi0KLSE7IGhpIHRoaXMgaXMgYSBjb21tZW50Ci0JOyBoaSB0aGlzIGlzIGEgY29tbWVudAotIQkuTUFDUk8JQkFDS19TTEFTSF9TRVQKLSEJXChNT1YJIyJcIixSMCkgCi0hCS5FTkRNCi0hCUJBQ0tfU0xBU0hfU0VUCi0hCU1PVgkjIlwiLFIwIAotCU1PVgkjIlwiLFIwIAotIQkuTUFDUk8JQ09NTQotIQliYXIJOyB0aGlzIGNvbW1lbnQgd2lsbCBnZXQgY29waWVkIG91dAotIQlmb28JXDsgdGhpcyBvbmUgd2lsbCBnZXQgZHJvcHBlZAotIQkuRU5ETQotIQlDT01NCi0hCWJhcgk7IHRoaXMgY29tbWVudCB3aWxsIGdldCBjb3BpZWQgb3V0Ci0JYmFyCTsgdGhpcyBjb21tZW50IHdpbGwgZ2V0IGNvcGllZCBvdXQKLSEJZm9vCVw7IHRoaXMgb25lIHdpbGwgZ2V0IGRyb3BwZWQKLQlmb28JXDsgdGhpcyBvbmUgd2lsbCBnZXQgZHJvcHBlZAotIQlCQUNLX1NMQVNIX1NFVAotIQlNT1YJIyJcIixSMCAKLQlNT1YJIyJcIixSMCAKLSEJLk1BQ1JPCVBMVVMyCi0hCUFERAkjMSxSXCZWMQotIQkuU0RBVEEJIlwmVicxIgotIQkuRU5ETQotIVYJLkFTU0lHTkMJIlIiCi0hVjEJLkFTU0lHTkEJMQotIQlQTFVTMgotIQlBREQJIzEsUlwmVjEKLQlBREQJIzEsUjEKLSEJLlNEQVRBCSJcJlYnMSIKLQkuYnl0ZQk4Miw0OQotIQkuTUFDUk8JUExVUzEJUCxQMQotIQlBREQJIzEsXFAxCi0hCS5TREFUQQkiXFAnMSIKLSEJLkVORE0KLSEJUExVUzEJUixSMQotIQlBREQJIzEsUjEKLQlBREQJIzEsUjEKLSEJLlNEQVRBCSJSMSIKLQkuYnl0ZQk4Miw0OQotIQotCi0hCS5NQUNSTwlTVU0gUDEKLSEJTU9WCVIwLFIxMAotIQlBREQJUjEsUjEwCi0hCUFERAlSMixSMTAKLSEJXFAxCQotIQlBREQJUjMsUjEwCi0hCS5FTkRNCi0hCi0KLSEJU1VNCS5FWElUTQotIQlNT1YJUjAsUjEwCi0JTU9WCVIwLFIxMAotIQlBREQJUjEsUjEwCi0JQURECVIxLFIxMAotIQlBREQJUjIsUjEwCi0JQURECVIyLFIxMAotIQkuRVhJVE0JCi0hCi0KLSEJLk1BQ1JPIGZvbyBiYXI9YSBkZWZhdWx0PWIKLSEJXGJhcgotIQlcZGVmYXVsdAotIQliYXIKLSEJZGVmYXVsdAotIQkuRU5ETQotIQlmb28gZGVmYXVsdD1kb2cgYmFyPWNhdAotIQljYXQKLQljYXQKLSEJZG9nCi0JZG9nCi0hCWJhcgotCWJhcgotIQlkZWZhdWx0Ci0JZGVmYXVsdAotIQlmb28gWCBZCi0hCVgKLQlYCi0hCVkKLQlZCi0hCWJhcgotCWJhcgotIQlkZWZhdWx0Ci0JZGVmYXVsdAotIQlmb28KLSEJYQotCWEKLSEJYgotCWIKLSEJYmFyCi0JYmFyCi0hCWRlZmF1bHQKLQlkZWZhdWx0Ci0hCWZvbyBiYXI9Y2F0IGRlZmF1bHQ9ZG9nCi0hCWNhdAotCWNhdAotIQlkb2cKLQlkb2cKLSEJYmFyCi0JYmFyCi0hCWRlZmF1bHQKLQlkZWZhdWx0Ci0hCi0KLSEKLQotIQkuTUFDUk8JZm9vIGJhcgotIQlISQotIQlISSBcYmFyCi0hCUhJCi0hCS5FTkRNCi0hCi0KLSEJZm9vIDEKLSEJSEkKLQlISQotIQlISSAxCi0JSEkgMQotIQlISQotCUhJCi0hCWZvbyAxMjMKLSEJSEkKLQlISQotIQlISSAxMjMKLQlISSAxMjMKLSEJSEkKLQlISQotIQlmb28gMSAyIDMgNAotIQlmb28KLSEJSEkKLQlISQotIQlISSAKLQlISSAKLSEJSEkKLQlISQotIQotCi0hCQotIQkuTUFDUk8JUFVTSCBSbgotIQlNT1YuTAlcUm4sQC1yMTUKLSEJLkVORE0KLSEJUFVTSAlSMAotIQlNT1YuTAlSMCxALXIxNQotCU1PVi5MCVIwLEAtcjE1Ci0hCVBVU0gJUjEKLSEJTU9WLkwJUjEsQC1yMTUKLQlNT1YuTAlSMSxALXIxNQotIQotCi0hCi0KLSEJLk1BQ1JPCVJFU19TVFIgU1RSLCBSbgotIQlNT1YuTAkjc3RyXEAsXFJuCi0hCUJSQQllbmRfc3RyXEAKLSEJTk9QCi0hc3RyXEAJLlNEQVRBICJcU1RSIgotIQkuQUxJR04JMgotIWVuZF9zdHJcQAotIQkuRU5ETQotIQkKLSEJUkVTX1NUUgkiT05FIixSMAkKLSEJTU9WLkwJI3N0cjAwMDE4LFIwCi0JTU9WLkwJI3N0cjAwMDE4LFIwCi0hCUJSQQllbmRfc3RyMDAwMTgKLQlCUkEJZW5kX3N0cjAwMDE4Ci0hCU5PUAotCU5PUAotIXN0cjAwMDE4CS5TREFUQSAiT05FIgotc3RyMDAwMTg6CS5ieXRlCTc5LDc4LDY5Ci0hCS5BTElHTgkyCi0JLmFsaWduCTIKLSFlbmRfc3RyMDAwMTgKLWVuZF9zdHIwMDAxODoKLSEJUkVTX1NUUgkiVFdPIixSMQotIQlNT1YuTAkjc3RyMDAwMTksUjEKLQlNT1YuTAkjc3RyMDAwMTksUjEKLSEJQlJBCWVuZF9zdHIwMDAxOQotCUJSQQllbmRfc3RyMDAwMTkKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMTkJLlNEQVRBICJUV08iCi1zdHIwMDAxOToJLmJ5dGUJODQsODcsNzkKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAxOQotZW5kX3N0cjAwMDE5OgotIQlSRVNfU1RSCSJUSFJFRSIsUjIKLSEJTU9WLkwJI3N0cjAwMDIwLFIyCi0JTU9WLkwJI3N0cjAwMDIwLFIyCi0hCUJSQQllbmRfc3RyMDAwMjAKLQlCUkEJZW5kX3N0cjAwMDIwCi0hCU5PUAotCU5PUAotIXN0cjAwMDIwCS5TREFUQSAiVEhSRUUiCi1zdHIwMDAyMDoJLmJ5dGUJODQsNzIsODIsNjksNjkKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAyMAotZW5kX3N0cjAwMDIwOgotIQotCi0hCi0KLSEKLQotIQlSRVNfU1RSIFNUUj1kb25rZXkgUm49UjEKLSEJTU9WLkwJI3N0cjAwMDIxLFIxCi0JTU9WLkwJI3N0cjAwMDIxLFIxCi0hCUJSQQllbmRfc3RyMDAwMjEKLQlCUkEJZW5kX3N0cjAwMDIxCi0hCU5PUAotCU5PUAotIXN0cjAwMDIxCS5TREFUQSAiZG9ua2V5Igotc3RyMDAwMjE6CS5ieXRlCTEwMCwxMTEsMTEwLDEwNywxMDEsMTIxCi0hCS5BTElHTgkyCi0JLmFsaWduCTIKLSFlbmRfc3RyMDAwMjEKLWVuZF9zdHIwMDAyMToKLSEJUkVTX1NUUiBkb25rZXksUjEKLSEJTU9WLkwJI3N0cjAwMDIyLFIxCi0JTU9WLkwJI3N0cjAwMDIyLFIxCi0hCUJSQQllbmRfc3RyMDAwMjIKLQlCUkEJZW5kX3N0cjAwMDIyCi0hCU5PUAotCU5PUAotIXN0cjAwMDIyCS5TREFUQSAiZG9ua2V5Igotc3RyMDAwMjI6CS5ieXRlCTEwMCwxMTEsMTEwLDEwNywxMDEsMTIxCi0hCS5BTElHTgkyCi0JLmFsaWduCTIKLSFlbmRfc3RyMDAwMjIKLWVuZF9zdHIwMDAyMjoKLSEgCVJFU19TVFIgZG9ua2V5IFJuPVIxCi0hCU1PVi5MCSNzdHIwMDAyMyxSMQotCU1PVi5MCSNzdHIwMDAyMyxSMQotIQlCUkEJZW5kX3N0cjAwMDIzCi0JQlJBCWVuZF9zdHIwMDAyMwotIQlOT1AKLQlOT1AKLSFzdHIwMDAyMwkuU0RBVEEgImRvbmtleSIKLXN0cjAwMDIzOgkuYnl0ZQkxMDAsMTExLDExMCwxMDcsMTAxLDEyMQotIQkuQUxJR04JMgotCS5hbGlnbgkyCi0hZW5kX3N0cjAwMDIzCi1lbmRfc3RyMDAwMjM6Ci0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiNzdiNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0KLQkuTUFDUk8JSEkKLQlBCi0JXCEgdGhpcyBpcyBoaWRkZW4KLQlCCi0JISB0aGlzIGlzIG5vdAotCUMKLQkuRU5ETQotCUhlbGxvIAotCUhJCi0JRW1pbHkKLQkKLQotCUgnMGYKLQkyMDArSCcwRgotCi1YWAkuQVNTSUdOQQlRJzEwMAotISBEZWZpbml0aW9uOgotCS5NQUNSTwlHRVQgWD0xMDAsWSxaCi0JTU9WCSNcWCtIJzBGLEBCCi0JXFkKLVxaCUpNUAlATUFJTgotTFxACUFERCAJIzEsQEhMCi0JTU9WCSMwLEBDCVwhIENsZWFyIEMKLQlBREQJIzIsQEMKLQlBREQJI1wmWFgsIEBDCi0JLkVORE0KLQotCU5PUAotCi0hQ2FsbDoJCi0JR0VUCTIwMCwiQUREICMxLEBCIiwgRU5UUlkKLQkuRU5ECi0KLQk7IERlZmluaXRpb246Ci0KLQotCU5PUAotCi0JO0NhbGw6CQotCU1PVgkjMjAwKzBGLEBCCi0JQUREICMxLEBCCi1FTlRSWToJSk1QCUBNQUlOCi1MMDAwMDA6CUFERCAJIzEsQEhMCi0JTU9WCSMwLEBDCQotCUFERAkjMixAQwotCUFERAkjMCwgQEMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDlhZDYyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSEKLQotIQkuTUFDUk8JSEkKLSEJQQotIQlcISB0aGlzIGlzIGhpZGRlbgotIQlCCi0hCSEgdGhpcyBpcyBub3QKLSEJQwotIQkuRU5ETQotIQlIZWxsbyAKLQlIZWxsbyAKLSEJSEkKLSEJQQotCUEKLSEJCi0hCUIKLQlCCi0hCSEgdGhpcyBpcyBub3QKLQkhIHRoaXMgaXMgbm90Ci0hCUMKLQlDCi0hCUVtaWx5Ci0JRW1pbHkKLSEJCi0hCi0KLSEJSCcwZgotCTE1Ci0hCTIwMCtIJzBGCi0JMjAwKzE1Ci0hCi0KLSFYWAkuQVNTSUdOQQlRJzEwMAotISEgRGVmaW5pdGlvbjoKLQkhIERlZmluaXRpb246Ci0hCS5NQUNSTwlHRVQgWD0xMDAsWSxaCi0hCU1PVgkjXFgrSCcwRixAQgotIQlcWQotIVxaCUpNUAlATUFJTgotIUxcQAlBREQgCSMxLEBITAotIQlNT1YJIzAsQEMJXCEgQ2xlYXIgQwotIQlBREQJIzIsQEMKLSEJQURECSNcJlhYLCBAQwotIQkuRU5ETQotIQotCi0hCU5PUAotCU5PUAotIQotCi0hIUNhbGw6CQotCSFDYWxsOgkKLSEJR0VUCTIwMCwiQUREICMxLEBCIiwgRU5UUlkKLSEJTU9WCSMyMDArSCcwRixAQgotCU1PVgkjMjAwKzE1LEBCCi0hCUFERCAjMSxAQgotCUFERCAjMSxAQgotIUVOVFJZCUpNUAlATUFJTgotRU5UUlk6CUpNUAlATUFJTgotIUwwMDAwMQlBREQgCSMxLEBITAotTDAwMDAxOglBREQgCSMxLEBITAotIQlNT1YJIzAsQEMJCi0JTU9WCSMwLEBDCQotIQlBREQJIzIsQEMKLQlBREQJIzIsQEMKLSEJQURECSNcJlhYLCBAQwotCUFERAkjNjQsIEBDCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjhmNzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWVtYmVkCW1hY3JvCWxhYmVsCi1hZGRyJiZsYWJlbAlkYy5sCWxhYmVsCi0JZW5kbQotCi0JZW1iZWQJZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ5MjVmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQub3V0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi07ZW1iZWQJbWFjcm8JbGFiZWwKLTthZGRyJiZsYWJlbAlkYy5sCWxhYmVsCi07CWVuZG0KLTsKLQotOwllbWJlZAlmb28KLTthZGRyZm9vCWRjLmwJZm9vCi1hZGRyZm9vOglkYy5sCWZvbwotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyMjBjNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1leGlzdHMJbWFjcm8JYXJnMSxhcmcyCi0JaWZuZQk9PWFyZzIKLQltb3ZlCWFyZzEsYXJnMgotCWVsc2VjCi0JcHVzaAlhcmcxCi0JZW5kYwotCWVuZG0KLQotCWV4aXN0cwlmb28sYmFyCi0JZXhpc3RzCWZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzUzMzdkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTtleGlzdHMJbWFjcm8JYXJnMSxhcmcyCi07CWlmbmUJPT1hcmcyCi07CW1vdmUJYXJnMSxhcmcyCi07CWVsc2VjCi07CXB1c2gJYXJnMQotOwllbmRjCi07CWVuZG0KLTsKLQotOwlleGlzdHMJZm9vLGJhcgotOwlpZm5lCS0xCi07CW1vdmUJZm9vLGJhcgotCW1vdmUJZm9vLGJhcgotOwllbHNlYwotOwlwdXNoCWZvbwotOwllbmRjCi07CWV4aXN0cwlmb28KLTsJaWZuZQkwCi07CW1vdmUJZm9vLAotOwllbHNlYwotOwlwdXNoCWZvbwotCXB1c2gJZm9vCi07CWVuZGMKLTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTIxZDkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JaXJwCXBhcmFtLGFyZzEsYXJnMixhcmczCi0JZGMubAlwYXJhbQotCWVuZHIKLQllbmQJcXVpdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnAub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnAub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTA1NjIwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotOwlpcnAJcGFyYW0sYXJnMSxhcmcyLGFyZzMKLTsJZGMubAlwYXJhbQotOwllbmRyCi0JZGMubAlhcmcxCi0JZGMubAlhcmcyCi0JZGMubAlhcmczCi07CWVuZAlxdWl0Ci0JZW5kCXF1aXQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFkNjg3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQlpcnBjCWR1bW15LDEyMzQKLQlkYy5sCWR1bW15Ci0JZW5kcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Zjg4MjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotOwlpcnBjCWR1bW15LDEyMzQKLTsJZGMubAlkdW1teQotOwllbmRyCi0JZGMubAkxCi0JZGMubAkyCi0JZGMubAkzCi0JZGMubAk0Ci07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9tYWNyby5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxMWJkMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotZ2V0CW1hY3JvCWFyZzEsYXJnMixhcmczCi0JZGMubAlhcmcxCi0JYXJnMgotYXJnMwlkYy5sCVw0Ci0JbW92ZS5cMAlkMCxkMQotCWVuZG0KLQotCWdldC5iCTEsPGRjLmwgMj4sbGFiZWwsZm91cgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9tYWNyby5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlZWI5NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTtnZXQJbWFjcm8JYXJnMSxhcmcyLGFyZzMKLTsJZGMubAlhcmcxCi07CWFyZzIKLTthcmczCWRjLmwJXDQKLTsJbW92ZS5cMAlkMCxkMQotOwllbmRtCi07Ci0KLTsJZ2V0LmIJMSw8ZGMubCAyPixsYWJlbCxmb3VyCi07CWRjLmwJMQotCWRjLmwJMQotOwlkYy5sIDIKLQlkYy5sIDIKLTtsYWJlbAlkYy5sCWZvdXIKLWxhYmVsOglkYy5sCWZvdXIKLTsJbW92ZS5iCWQwLGQxCi0JbW92ZS5iCWQwLGQxCi07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGM5NDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotbG9vcAltYWNybwlhcmcxLGFyZzIsYXJnMwotCWRjLmwJTkFSRwotCWlmbmUJTkFSRwotCWRjLmwJYXJnMQotCWxvb3AJYXJnMixhcmczCi0JZW5kYwotCWVuZG0KLQotCWxvb3AJMSwyLDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL25hcmcub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjNlYmMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi07bG9vcAltYWNybwlhcmcxLGFyZzIsYXJnMwotOwlkYy5sCU5BUkcKLTsJaWZuZQlOQVJHCi07CWRjLmwJYXJnMQotOwlsb29wCWFyZzIsYXJnMwotOwllbmRjCi07CWVuZG0KLTsKLQotOwlsb29wCTEsMiwzCi07CWRjLmwJMwotCWRjLmwJMwotOwlpZm5lCTMKLTsJZGMubAkxCi0JZGMubAkxCi07CWxvb3AJMiwzCi07CWRjLmwJMgotCWRjLmwJMgotOwlpZm5lCTIKLTsJZGMubAkyCi0JZGMubAkyCi07CWxvb3AJMywKLTsJZGMubAkxCi0JZGMubAkxCi07CWlmbmUJMQotOwlkYy5sCTMKLQlkYy5sCTMKLTsJbG9vcAksCi07CWRjLmwJMAotCWRjLmwJMAotOwlpZm5lCTAKLTsJZGMubAkKLTsJbG9vcAksCi07CWVuZGMKLTsJZW5kYwotOwllbmRjCi07CWVuZGMKLTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2M2JiMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JcmVwdAkzCi0JZGMubAkxCi0JZW5kcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGVkNmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTsJcmVwdAkzCi07CWRjLmwJMQotOwllbmRyCi07CWRjLmwJMQotCWRjLmwJMQotOwlSRVBUCTIKLTsJZGMubAkxCi07CUVORFIKLTsJZGMubAkxCi0JZGMubAkxCi07CVJFUFQJMQotOwlkYy5sCTEKLTsJRU5EUgotOwlkYy5sCTEKLQlkYy5sCTEKLTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhiZmRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCQotCS5BTFRFUk5BVEUKLQotYWxsb2MgCU1BQ1JPIHZhbDEsdmFsMgotCURCCXZhbDEKLQlEQiAJdmFsMgotCUVORE0KLQotCWFsbG9jCSJ0aGF0J3MiICdzaG93IGJpeicKLQlhbGxvYwkwLDEKLQlhbGxvYwkwIDEKLQlhbGxvYwkwCTEKLQlhbGxvYwksMQotCi0KLQkKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMzMxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjgwZjEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIQkKLSEJLkFMVEVSTkFURQotIQotCi0hYWxsb2MgCU1BQ1JPIHZhbDEsdmFsMgotIQlEQgl2YWwxCi0hCURCIAl2YWwyCi0hCUVORE0KLSEKLQotIQlhbGxvYwkidGhhdCdzIiAnc2hvdyBiaXonCi0hCURCCSJ0aGF0J3MiCi0JLmJ5dGUJMTE2LDEwNCw5NywxMTYsMzksMTE1Ci0hCURCIAkic2hvdyBiaXoiCi0JLmJ5dGUJMTE1LDEwNCwxMTEsMTE5LDMyLDk4LDEwNSwxMjIKLSEJYWxsb2MJMCwxCi0hCURCCTAKLQkuYnl0ZQkwCi0hCURCIAkxCi0JLmJ5dGUJMQotIQlhbGxvYwkwIDEKLSEJREIJMAotCS5ieXRlCTAKLSEJREIgCTEKLQkuYnl0ZQkxCi0hCWFsbG9jCTAJMQotIQlEQgkwCi0JLmJ5dGUJMAotIQlEQiAJMQotCS5ieXRlCTEKLSEJYWxsb2MJLDEKLSEJREIJCi0JLmJ5dGUJCi0hCURCIAkxCi0JLmJ5dGUJMQotIQotCi0hCi0KLSEJCi0hCi0KLSEKLQotIQotCi0hCi0KLSEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTcxMTM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotCi0KLQkuQUxURVJOQVRFCi0KLQkhIG9rCi0JISEgYWxzbyBvawotCi1mb28JTUFDUk8JCi0JISB5b3UgY2FuIHNlZSBtZQotCSEhIGJ1dCBub3QgbWUKLQkhIHlvdSBjYW4gc2VlIG1lCi0JISEgYnV0IG5vdCBtZQotCWJ1dCB0aGlzICJTSE9VTEQgISFCRSBPSyIKLQlFTkRNCi0KLQlmb28KLQotCi1kZWZpbmUgCU1BQ1JPCXZhbDEsdmFsMgotCURCIAl2YWwxCSEgdGhpcyBjb21tZW50IHdpbGwgc2hvdyB1cCAKLQlEQgl2YWwyCSEhIHRoaXMgb24gd29uJ3QKLQlFTkRNCi0KLQlkZWZpbmUJMCwxCi0KLQotCUVORAotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2E2ZmEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIQotCi0hCi0KLSEJLkFMVEVSTkFURQotIQotCi0hCSEgb2sKLQkhIG9rCi0hCSEhIGFsc28gb2sKLQkhISBhbHNvIG9rCi0hCi0KLSFmb28JTUFDUk8JCi0hCSEgeW91IGNhbiBzZWUgbWUKLSEJISEgYnV0IG5vdCBtZQotIQkhIHlvdSBjYW4gc2VlIG1lCi0hCSEhIGJ1dCBub3QgbWUKLSEJYnV0IHRoaXMgIlNIT1VMRCAhIUJFIE9LIgotIQlFTkRNCi0hCi0KLSEJZm9vCi0hCSEgeW91IGNhbiBzZWUgbWUKLQkhIHlvdSBjYW4gc2VlIG1lCi0hCQotIQkhIHlvdSBjYW4gc2VlIG1lCi0JISB5b3UgY2FuIHNlZSBtZQotIQkKLSEJYnV0IHRoaXMgIlNIT1VMRCAhIUJFIE9LIgotCWJ1dCB0aGlzICJTSE9VTEQgISFCRSBPSyIKLSEKLQotIQotCi0hZGVmaW5lIAlNQUNSTwl2YWwxLHZhbDIKLSEJREIgCXZhbDEJISB0aGlzIGNvbW1lbnQgd2lsbCBzaG93IHVwIAotIQlEQgl2YWwyCSEhIHRoaXMgb24gd29uJ3QKLSEJRU5ETQotIQotCi0hCWRlZmluZQkwLDEKLSEJREIgCTAJISB0aGlzIGNvbW1lbnQgd2lsbCBzaG93IHVwIAotCS5ieXRlCTAhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCi0hCURCCTEJCi0JLmJ5dGUJMQotIQotCi0hCi0KLSEJRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTMxZGNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotCS5BTFRFUk5BVEUKLQotZm9vCU1BQ1JPCXN0cmluZwotCUxPQ0FMCWxhYjEsIGxhYjIKLWxhYjE6CURBVEEuTAlsYWIyCi1sYWIyOglTREFUQQlzdHJpbmcKLQlFTkRNCi0KLQlmb28JIkFuIGV4YW1wbGUiCi0JZm9vCSJ1c2luZyBMT0NBTCIKLQotISB0ZXN0IG9mIExPQ0FMIGRpcmVjdGl2ZQotCi1jaGtfZXJyCU1BQ1JPCWxpbWl0Ci0JTE9DQUwJCXNraXAgISEgZnJvYgotCUxPQ0FMCQl6YXAsZG9nLGJhcmYKLWJhcmY6CWNtcAkJYXgsbGltaXQJISEgY2hlY2sgdmFsdWUgYWdhaW5zdAotCQkJCQkhISBsaW1pdAotCWpsZQkJc2tpcAkJISEgc2tpcCBjYWxsIGlmIE9LCi1za2lwOgljYWxsCSAJZXJyb3IKLQlmb28JCWRvZwotCXphcAkJZG9nCQotCW5vcAotCUVORE0KLQotCWNoa19lcnIgNQotCWNoa19lcnIgMTAKLQotCi0JRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NjE5NGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0hCS5BTFRFUk5BVEUKLSEKLQotIWZvbwlNQUNSTwlzdHJpbmcKLSEJTE9DQUwJbGFiMSwgbGFiMgotIWxhYjE6CURBVEEuTAlsYWIyCi0hbGFiMjoJU0RBVEEJc3RyaW5nCi0hCUVORE0KLSEKLQotIQlmb28JIkFuIGV4YW1wbGUiCi0hCQotIUxMMDAwMToJREFUQS5MCUxMMDAwMgotTEwwMDAxOgkubG9uZwlMTDAwMDIKLSFMTDAwMDI6CVNEQVRBCSJBbiBleGFtcGxlIgotTEwwMDAyOgkuYnl0ZQk2NSwxMTAsMzIsMTAxLDEyMCw5NywxMDksMTEyLDEwOCwxMDEKLSEJZm9vCSJ1c2luZyBMT0NBTCIKLSEJCi0hTEwwMDAzOglEQVRBLkwJTEwwMDA0Ci1MTDAwMDM6CS5sb25nCUxMMDAwNAotIUxMMDAwNDoJU0RBVEEJInVzaW5nIExPQ0FMIgotTEwwMDA0OgkuYnl0ZQkxMTcsMTE1LDEwNSwxMTAsMTAzLDMyLDc2LDc5LDY3LDY1LDc2Ci0hCi0KLSEhIHRlc3Qgb2YgTE9DQUwgZGlyZWN0aXZlCi0JISB0ZXN0IG9mIExPQ0FMIGRpcmVjdGl2ZQotIQotCi0hY2hrX2VycglNQUNSTwlsaW1pdAotIQlMT0NBTAkJc2tpcCAhISBmcm9iCi0hCUxPQ0FMCQl6YXAsZG9nLGJhcmYKLSFiYXJmOgljbXAJCWF4LGxpbWl0CSEhIGNoZWNrIHZhbHVlIGFnYWluc3QKLSEJCQkJCSEhIGxpbWl0Ci0hCWpsZQkJc2tpcAkJISEgc2tpcCBjYWxsIGlmIE9LCi0hc2tpcDoJY2FsbAkgCWVycm9yCi0hCWZvbwkJZG9nCi0hCXphcAkJZG9nCQotIQlub3AKLSEJRU5ETQotIQotCi0hCWNoa19lcnIgNQotIQkKLSEJCi0hTEwwMDA4OgljbXAJCWF4LDUJCi1MTDAwMDg6CWNtcAkJYXgsNQkKLSEJCQkJCQotIQlqbGUJCUxMMDAwNQkJCi0JamxlCQlMTDAwMDUJCQotIUxMMDAwNToJY2FsbAkgCWVycm9yCi1MTDAwMDU6CWNhbGwJIAllcnJvcgotIQlmb28JCUxMMDAwNwotIQkKLSFMTDAwMDk6CURBVEEuTAlMTDAwMGEKLUxMMDAwOToJLmxvbmcJTEwwMDBhCi0hTEwwMDBhOglTREFUQQlMTDAwMDcKLUxMMDAwYToJLmJ5dGUJNzYsNzYsNDgsNDgsNDgsNTUKLSEJTEwwMDA2CQlMTDAwMDcJCi0JTEwwMDA2CQlMTDAwMDcJCi0hCW5vcAotCW5vcAotIQljaGtfZXJyIDEwCi0hCQotIQkKLSFMTDAwMGU6CWNtcAkJYXgsMTAJCi1MTDAwMGU6CWNtcAkJYXgsMTAJCi0hCQkJCQkKLSEJamxlCQlMTDAwMGIJCQotCWpsZQkJTEwwMDBiCQkKLSFMTDAwMGI6CWNhbGwJIAllcnJvcgotTEwwMDBiOgljYWxsCSAJZXJyb3IKLSEJZm9vCQlMTDAwMGQKLSEJCi0hTEwwMDBmOglEQVRBLkwJTEwwMDEwCi1MTDAwMGY6CS5sb25nCUxMMDAxMAotIUxMMDAxMDoJU0RBVEEJTEwwMDBkCi1MTDAwMTA6CS5ieXRlCTc2LDc2LDQ4LDQ4LDQ4LDEwMAotIQlMTDAwMGMJCUxMMDAwZAkKLQlMTDAwMGMJCUxMMDAwZAkKLSEJbm9wCi0Jbm9wCi0hCi0KLSEKLQotIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZGQzZTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLkFMVEVSTkFURQotISB0ZXN0IG9mIG1hY3JvIHN1YnN0aXR1dGlvbiBhcm91bmQgJnMKLQotCi1mb28JTUFDUk8JYSxiCi0JeCZhJmIKLQlFTkRNCi0KLQlmb28gMyAyIAotCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWQxMzkxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIQkuQUxURVJOQVRFCi0hISB0ZXN0IG9mIG1hY3JvIHN1YnN0aXR1dGlvbiBhcm91bmQgJnMKLQkhIHRlc3Qgb2YgbWFjcm8gc3Vic3RpdHV0aW9uIGFyb3VuZCAmcwotIQotCi0hCi0KLSFmb28JTUFDUk8JYSxiCi0hCXgmYSZiCi0hCUVORE0KLSEKLQotIQlmb28gMyAyIAotIQl4MzIKLQl4MzIKLSEJRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI5OTliLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotISB0ZXN0IG9mIGxpdGVyYWwgdGV4dCBvcGVyYXRvcgotCS5BTFRFUk5BVEUKLWZvb3AJTUFDUk8Jc3RyMSxzdHIyCi0JU0RBVEEJInN0cjEiCi0JU0RBVEEJc3RyMgotCUVORE0KLQotCi0JCi0JZm9vcAl0aGlzPCBpcyBhIDxzdHJpbmc+IHdpdGggYW5nbGUgYnJhY2tldHM+Ci0JZm9vcCAJdGhpczwgaXMgYSBzdHJpbmcgd2l0aCBzcGFjZXM+Ci0JZm9vcAl0aGlzIDwgaXMgYSBzdHJpbmcgd2l0aCBhICE+PgotCi0KLQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNDg4Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSEhIHRlc3Qgb2YgbGl0ZXJhbCB0ZXh0IG9wZXJhdG9yCi0JISB0ZXN0IG9mIGxpdGVyYWwgdGV4dCBvcGVyYXRvcgotIQkuQUxURVJOQVRFCi0hZm9vcAlNQUNSTwlzdHIxLHN0cjIKLSEJU0RBVEEJInN0cjEiCi0hCVNEQVRBCXN0cjIKLSEJRU5ETQotIQotCi0hCi0KLSEJCi0hCWZvb3AJdGhpczwgaXMgYSA8c3RyaW5nPiB3aXRoIGFuZ2xlIGJyYWNrZXRzPgotIQlTREFUQQkidGhpcyIKLQkuYnl0ZQkxMTYsMTA0LDEwNSwxMTUKLSEJU0RBVEEJIiBpcyBhIDxzdHJpbmc+IHdpdGggYW5nbGUgYnJhY2tldHMiCi0JLmJ5dGUJMzIsMTA1LDExNSwzMiw5NywzMiw2MCwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw2MiwzMiwxMTksMTA1LDExNiwxMDQsMzIsOTcsMTEwLDEwMywxMDgsMTAxLDMyLDk4LDExNCw5Nyw5OSwxMDcsMTAxLDExNiwxMTUKLSEJZm9vcCAJdGhpczwgaXMgYSBzdHJpbmcgd2l0aCBzcGFjZXM+Ci0hCVNEQVRBCSJ0aGlzIgotCS5ieXRlCTExNiwxMDQsMTA1LDExNQotIQlTREFUQQkiIGlzIGEgc3RyaW5nIHdpdGggc3BhY2VzIgotCS5ieXRlCTMyLDEwNSwxMTUsMzIsOTcsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExNSwxMTIsOTcsOTksMTAxLDExNQotIQlmb29wCXRoaXMgPCBpcyBhIHN0cmluZyB3aXRoIGEgIT4+Ci0hCVNEQVRBCSJ0aGlzIgotCS5ieXRlCTExNiwxMDQsMTA1LDExNQotIQlTREFUQQkiIGlzIGEgc3RyaW5nIHdpdGggYSA+IgotCS5ieXRlCTMyLDEwNSwxMTUsMzIsOTcsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDk3LDMyLDYyCi0hCi0KLSEKLQotIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmQ2MTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLkFMVEVSTkFURQotISB0ZXN0IG9mIGV4cHJlc3Npb24gb3BlcmF0b3IKLWRlZmluZSAJTUFDUk8gCXZhbCwgc3RyaW5nCi0JU0RBVEEgCXZhbAotCVNEQVRBCXN0cmluZwotCUVORE0KLQlkZWZpbmUgIjEiLCI5OSVvZjEwMCIJISBub3RpY2UgJSB3aXRoaW4gc3RyaW5nCi0JZGVmaW5lIAklMSArIDIsICI9MyIKLQotCi0JZGVmaW5lIAklIDEgKyAyICUzKzQKLQotCWRlZmluZQklMyo0LTIgIDw9MTA+Ci0KLQlkZWZpbmUJJTMqNC0yICA1Ci0KLQlkZWZpbmUJJTEgKyAyLDxpcyBlcXVhbCB0byAlMSArIDIsIHJpZ2h0Pz4KLQotCSEgaGFzIG5vIGVmZmVjdAotCi0JZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDE2Y2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0hCS5BTFRFUk5BVEUKLSEhIHRlc3Qgb2YgZXhwcmVzc2lvbiBvcGVyYXRvcgotCSEgdGVzdCBvZiBleHByZXNzaW9uIG9wZXJhdG9yCi0hZGVmaW5lIAlNQUNSTyAJdmFsLCBzdHJpbmcKLSEJU0RBVEEgCXZhbAotIQlTREFUQQlzdHJpbmcKLSEJRU5ETQotIQlkZWZpbmUgIjEiLCI5OSVvZjEwMCIJISBub3RpY2UgJSB3aXRoaW4gc3RyaW5nCi0hCVNEQVRBIAkiMSIKLQkuYnl0ZQk0OQotIQlTREFUQQkiOTklb2YxMDAiCi0JLmJ5dGUJNTcsNTcsMzcsMTExLDEwMiw0OSw0OCw0OAotIQlkZWZpbmUgCSUxICsgMiwgIj0zIgotIQlTREFUQSAJMwotCS5ieXRlCTUxCi0hCVNEQVRBCSI9MyIKLQkuYnl0ZQk2MSw1MQotIQotCi0hCi0KLSEJZGVmaW5lIAklIDEgKyAyICUzKzQKLSEJU0RBVEEgCTMKLQkuYnl0ZQk1MQotIQlTREFUQQk3Ci0JLmJ5dGUJNTUKLSEKLQotIQlkZWZpbmUJJTMqNC0yICA8PTEwPgotIQlTREFUQSAJMTAKLQkuYnl0ZQk0OSw0OAotIQlTREFUQQkiPTEwIgotCS5ieXRlCTYxLDQ5LDQ4Ci0hCi0KLSEJZGVmaW5lCSUzKjQtMiAgNQotIQlTREFUQSAJMTAKLQkuYnl0ZQk0OSw0OAotIQlTREFUQQk1Ci0JLmJ5dGUJNTMKLSEKLQotIQlkZWZpbmUJJTEgKyAyLDxpcyBlcXVhbCB0byAlMSArIDIsIHJpZ2h0Pz4KLSEJU0RBVEEgCTMKLQkuYnl0ZQk1MQotIQlTREFUQQkiaXMgZXF1YWwgdG8gJTEgKyAyLCByaWdodD8iCi0JLmJ5dGUJMTA1LDExNSwzMiwxMDEsMTEzLDExNyw5NywxMDgsMzIsMTE2LDExMSwzMiwzNyw0OSwzMiw0MywzMiw1MCw0NCwzMiwxMTQsMTA1LDEwMywxMDQsMTE2LDYzCi0hCi0KLSEJISBoYXMgbm8gZWZmZWN0Ci0JISBoYXMgbm8gZWZmZWN0Ci0hCi0KLSEJZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGE0MGFmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5BTFRFUk5BVEUKLSEgdGVzdCBvZiBzdHJpbmcgb3BlcmF0b3JzCi1kZWZpbmUJTUFDUk8Jc3RyMSxzdHIyCi0JU0RBVEEJc3RyMQotCVNEQVRBCSJzdHIyIgotRU5ETQotCWRlZmluZQlvbmUiIHdheSB0byBnZXQgInNwYWNlcywwCi0JZGVmaW5lCSJsb3QncyEgb2YgPHNwZWNpYWw+LGNoYXJzJSIsIDAKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3LmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMzMxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3LmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTE5YjM0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIQkuQUxURVJOQVRFCi0hISB0ZXN0IG9mIHN0cmluZyBvcGVyYXRvcnMKLQkhIHRlc3Qgb2Ygc3RyaW5nIG9wZXJhdG9ycwotIWRlZmluZQlNQUNSTwlzdHIxLHN0cjIKLSEJU0RBVEEJc3RyMQotIQlTREFUQQkic3RyMiIKLSFFTkRNCi0hCWRlZmluZQlvbmUiIHdheSB0byBnZXQgInNwYWNlcywwCi0hCVNEQVRBCW9uZSIgd2F5IHRvIGdldCAic3BhY2VzCi0JLmJ5dGUJMTExLDExMCwxMDEsMzQsMzIsMTE5LDk3LDEyMSwzMiwxMTYsMTExLDMyLDEwMywxMDEsMTE2LDMyLDM0LDExNSwxMTIsOTcsOTksMTAxLDExNQotIQlTREFUQQkiMCIKLQkuYnl0ZQk0OAotIQlkZWZpbmUJImxvdCdzISBvZiA8c3BlY2lhbD4sY2hhcnMlIiwgMAotIQlTREFUQQkibG90J3Mgb2YgPHNwZWNpYWw+LGNoYXJzJSIKLQkuYnl0ZQkxMDgsMTExLDExNiwzOSwxMTUsMzIsMTExLDEwMiwzMiw2MCwxMTUsMTEyLDEwMSw5OSwxMDUsOTcsMTA4LDYyLDQ0LDk5LDEwNCw5NywxMTQsMTE1LDM3Ci0hCVNEQVRBCSIwIgotCS5ieXRlCTQ4Ci0hCi0KLSEKLQotIQotCi0hCi0KLSEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjViMTcyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCi0JLkFMVEVSTkFURQotCVNEQVRBCSUxKzIrMyAKLQlTREFUQQkiNSIKLQotCi0KLQlNQUNSTwlmb28KLQlTREFUQQkiSEkiCSEhIHRoaXMgd2lsbCBnbwotCVNEQVRBCSJUSEVSRQkhIHRoaXMgd2lsbCBzdGF5Ci0JRU5ETQotCi0JZm9vCi0KLQotCVNEQVRBCTwhPHRoaXMgaXMgPGEgd2Fja3k+IGV4YW1wbGUhPiEhPgotCVNEQVRBCSI8dGhpcyBpcyA8YSB3YWNreT4gZXhhbXBsZT4hIgotCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4LmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4LmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDgub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzEwNDEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDgub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIQotCi0hCS5BTFRFUk5BVEUKLSEJU0RBVEEJJTErMiszIAotCS5ieXRlCTM3LDQ5LDQzLDUwLDQzLDUxLDMyCi0hCVNEQVRBCSI1IgotCS5ieXRlCTUzCi0hCi0KLSEKLQotIQotCi0hCU1BQ1JPCWZvbwotIQlTREFUQQkiSEkiCSEhIHRoaXMgd2lsbCBnbwotIQlTREFUQQkiVEhFUkUJISB0aGlzIHdpbGwgc3RheQotIQlFTkRNCi0hCi0KLSEJZm9vCi0hCVNEQVRBCSJISSIJCi0JLmJ5dGUJNzIsNzMKLSEJU0RBVEEJIlRIRVJFCSEgdGhpcyB3aWxsIHN0YXkKLQkuYnl0ZQk4NCw3Miw2OSw4Miw2OSw5LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTksMTA1LDEwOCwxMDgsMzIsMTE1LDExNiw5NywxMjEKLSEKLQotIQotCi0hCVNEQVRBCTwhPHRoaXMgaXMgPGEgd2Fja3k+IGV4YW1wbGUhPiEhPgotCS5ieXRlCTYwLDExNiwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDYwLDk3LDMyLDExOSw5Nyw5OSwxMDcsMTIxLDYyLDMyLDEwMSwxMjAsOTcsMTA5LDExMiwxMDgsMTAxLDYyLDMzCi0hCVNEQVRBCSI8dGhpcyBpcyA8YSB3YWNreT4gZXhhbXBsZT4hIgotCS5ieXRlCTYwLDExNiwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDYwLDk3LDMyLDExOSw5Nyw5OSwxMDcsMTIxLDYyLDMyLDEwMSwxMjAsOTcsMTA5LDExMiwxMDgsMTAxLDYyLDM0Ci0hCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3Y2FmNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi0gICAgIC5zZGF0YSAidjEuMDAwMCIKLSAgICAgLmVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWRmMWQ3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0hCi0KLSEgICAgIC5zZGF0YSAidjEuMDAwMCIKLQkuYnl0ZQkxMTgsNDksNDYsNDgsNDgsNDgsNDgKLSEgICAgIC5lbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNDYzZWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotCi1mb28JLlJFRwkocjEpCi0JYWRkCWZvbyxmb28KLQotYmFyCS5yZWcJKHIyKQotCWFkZAliYXIsZm9vCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjY4YTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0hCi0KLSEKLQotIWZvbwkuUkVHCShyMSkKLSEJYWRkCWZvbyxmb28KLQlhZGQJcjEscjEKLSEKLQotIWJhcgkucmVnCShyMikKLSEJYWRkCWJhcixmb28KLQlhZGQJcjIscjEKLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdhYzQ3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS5BUkVQRUFUCTUKLQlGSVZFCi0JLkFSRVBFQVQJMgotCVRXTwotCS5BRU5EUgotCS5BUkVQRUFUCTMKLQlUSFJFRQotCS5BUkVQRUFUCTIKLQlUV08JCi0JLkFFTkRSCi0JLkFFTkRSCi0JLkFFTkRSCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTBkMGUxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLSEJLkFSRVBFQVQJNQotIQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlGSVZFCi0JRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTEKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkyCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJNAotIQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlGSVZFCi0JRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTEKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkyCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMwotIQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlGSVZFCi0JRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTEKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkyCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMgotIQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlGSVZFCi0JRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTEKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkyCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlGSVZFCi0JRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTEKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkyCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4NWRhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQotCS5BUkVQRUFUCTEwCi0JVEVOCi0JLkFSRVBFQVQJMgkKLQlUV0VOVFkKLQkuQUVORFIKLQkuQUVORFIKLQotCS5BUkVQRUFUCTMKLQlST1RDTAlSMgotCURJVjEJUjAsUjEKLQkuQUVORFIKLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1ZDhkOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0hCi0KLSEJLkFSRVBFQVQJMTAKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTkKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTgKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTcKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTYKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTUKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTQKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTMKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTIKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRFTgotCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCi0KLSEJLkFSRVBFQVQJMwotIQlST1RDTAlSMgotIQlESVYxCVIwLFIxCi0hCS5BRU5EUgotIQlST1RDTAlSMgotCVJPVENMCVIyCi0hCURJVjEJUjAsUjEKLQlESVYxCVIwLFIxCi0hCS5BUkVQRUFUCTIKLSEJUk9UQ0wJUjIKLSEJRElWMQlSMCxSMQotIQkuQUVORFIKLSEJUk9UQ0wJUjIKLQlST1RDTAlSMgotIQlESVYxCVIwLFIxCi0JRElWMQlSMCxSMQotIQkuQVJFUEVBVAkxCi0hCVJPVENMCVIyCi0hCURJVjEJUjAsUjEKLSEJLkFFTkRSCi0hCVJPVENMCVIyCi0JUk9UQ0wJUjIKLSEJRElWMQlSMCxSMQotCURJVjEJUjAsUjEKLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg4MmIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0KLQkuUkVQRUFUCTEwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUzMzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOWY4YzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSEKLQotIQkuUkVQRUFUCTEwCi0JLlJFUEVBVAkxMAotIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5ODdlNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotCS5BUkVQRUFUCTEwCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzY1NDViLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVuZCBvZiBmaWxlIHdoaWxzdCBpbnNpZGUgQVJFUEVBVCwgc3RhcnRlZCBvbiBsaW5lIDMuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODI4ODAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0hCi0KLSEJLkFSRVBFQVQJMTAKLSEJLkVORAotIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNmE3MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQotCS5BUkVQRUFUCTUKLQkuQUVORFIJCQotCS5BRU5EUgotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDBjY2M1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXJlcGVycjIuYXNtOjQgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmN2E4NGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIQotCi0hCS5BUkVQRUFUCTUKLSEJLkFFTkRSCQkKLSEJLkFSRVBFQVQJNAotIQkuQUVORFIKLSEJLkFSRVBFQVQJMwotIQkuQUVORFIKLSEJLkFSRVBFQVQJMgotIQkuQUVORFIKLSEJLkFSRVBFQVQJMQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0YmM3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLkFSRVBFQVQJNAotCS5BUkVQRUFUCTQKLQkuQVJFUEVBVAk0Ci0JLkFSRVBFQVQJNAotCXN0dWZmCi0JLkFFTkRSCQkKLQl3aGljaAotCS5BRU5EUgkKLQl3aWxsCi0JLkFFTkRSCQotCWdldAotCS5BRU5EUgkKLQlyZXBldGFlZAotCS5BRU5EUgkKLQotCS5BRU5EUgkKLQkuQUVORFIJCi0JLkFFTkRSCQotCS5BRU5EUgkKLQkuQUVORFIJCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmUwZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmVycgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcmVwZXJyMy5hc206MTQgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCi1yZXBlcnIzLmFzbToxNiBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KLXJlcGVycjMuYXNtOjE3IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgotcmVwZXJyMy5hc206MTggQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCi1yZXBlcnIzLmFzbToxOSBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KLXJlcGVycjMuYXNtOjIwIEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTM1MTNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMzUgKzAsMCBAQAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCWdldAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCWdldAotCWdldAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCWdldAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJZ2V0Ci0JZ2V0Ci0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJZ2V0Ci0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQlnZXQKLQlnZXQKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQlnZXQKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCWdldAotCWdldAotIQlyZXBldGFlZAotCXJlcGV0YWVkCi0hCS5BRU5EUgkKLSEKLQotIQkuQUVORFIJCi0hCS5BRU5EUgkKLSEJLkFFTkRSCQotIQkuQUVORFIJCi0hCS5BRU5EUgkKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmQyM2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLQotCi0JLlNEQVRBCSJISSIsIlNURVZFIgotCS5TREFUQQkiSEkiICwgIlNURVZFIiAsIDw3Mj4sPDczPiw8ODM+PDY5Pjw4Nj48Njk+Ci0KLQkuU0RBVEEJIkgiIkkiICwgIlNURVZFIiAsIDw3Mj4sPDczPiw8ODM+PDY5Pjw4Nj48Njk+Ci0KLQotCi0JLlNEQVRBCSJTSE9VTEQgTk9UIEZBSUwiICJIRVJFIiAKLQkuU0RBVEEJIlNIT1VMRCBGQUlMIiAgZm9vICJIRVJFIiAKLQotCS5TREFUQUIJOCwiQk9JTksiCi0KLQk7IGV4YW1wbGVzIGZyb20gYm9vawotCi0JLlNEQVRBQgkyLCJBQUFBQSIKLQkuU0RBVEFCCTIsIiIiQkJCIiIiCi0JLlNEQVRBQgkyLCJBQUJCIjxIJzA3PgotCi0KLWExOgkuU0RBVEFaCSJISSIKLWEyOgkuU0RBVEFDICJISSIKLWEzOgkuU0RBVEEJIkhJIgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDRjY2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmVycgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc2RhdGEuYXNtOjE5IENoYXJhY3RlciBjb2RlIGluIHN0cmluZyBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24uCi1zZGF0YS5hc206MTkgTWlzc2luZyA+IGZvciBjaGFyYWN0ZXIgY29kZS4KLUVORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4OWQzNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIQotCi0hCi0KLSEJLlNEQVRBCSJISSIsIlNURVZFIgotCS5ieXRlCTcyLDczLDgzLDg0LDY5LDg2LDY5Ci0hCS5TREFUQQkiSEkiICwgIlNURVZFIiAsIDw3Mj4sPDczPiw8ODM+PDY5Pjw4Nj48Njk+Ci0JLmJ5dGUJNzIsNzMsODMsODQsNjksODYsNjksNzIsNzMsODMsNjksODYsNjkKLSEKLQotIQkuU0RBVEEJIkgiIkkiICwgIlNURVZFIiAsIDw3Mj4sPDczPiw8ODM+PDY5Pjw4Nj48Njk+Ci0JLmJ5dGUJNzIsMzQsNzMsODMsODQsNjksODYsNjksNzIsNzMsODMsNjksODYsNjkKLSEKLQotIQotCi0hCi0KLSEJLlNEQVRBCSJTSE9VTEQgTk9UIEZBSUwiICJIRVJFIiAKLQkuYnl0ZQk4Myw3Miw3OSw4NSw3Niw2OCwzMiw3OCw3OSw4NCwzMiw3MCw2NSw3Myw3Niw3Miw2OSw4Miw2OQotIQkuU0RBVEEJIlNIT1VMRCBGQUlMIiAgZm9vICJIRVJFIiAKLQkuYnl0ZQk4Myw3Miw3OSw4NSw3Niw2OCwzMiw3MCw2NSw3Myw3NiwxMDIsMTExLDExMSwzMiwzNCw3Miw2OSw4Miw2OSwzNCwzMgotIQotCi0hCS5TREFUQUIJOCwiQk9JTksiCi0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotIQotCi0hCTsgZXhhbXBsZXMgZnJvbSBib29rCi0JOyBleGFtcGxlcyBmcm9tIGJvb2sKLSEKLQotIQkuU0RBVEFCCTIsIkFBQUFBIgotCS5ieXRlCTY1LDY1LDY1LDY1LDY1Ci0JLmJ5dGUJNjUsNjUsNjUsNjUsNjUKLSEJLlNEQVRBQgkyLCIiIkJCQiIiIgotCS5ieXRlCTM0LDY2LDY2LDY2LDM0Ci0JLmJ5dGUJMzQsNjYsNjYsNjYsMzQKLSEJLlNEQVRBQgkyLCJBQUJCIjxIJzA3PgotCS5ieXRlCTY1LDY1LDY2LDY2LDAKLQkuYnl0ZQk2NSw2NSw2Niw2NiwwCi0hCi0KLSEKLQotIWExOgkuU0RBVEFaCSJISSIKLWExOgkuYnl0ZQk3Miw3MywwCi0hYTI6CS5TREFUQUMgIkhJIgotYTI6CS5ieXRlCTIsNzIsNzMKLSFhMzoJLlNEQVRBCSJISSIKLWEzOgkuYnl0ZQk3Miw3MwotIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTk5NDlhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0KLQkuTUFDUk8JUkVTRVJWRV9TVFIgUDE9MCBQMgotCS5TREFUQQkuU1VCU1RSKCJBQkNERUZHIixcUDEsXFAyKQotCS5FTkRNCi0KLQlSRVNFUlZFX1NUUgkyLDIKLQlSRVNFUlZFX1NUUgksMwotCi0KLQkuTUFDUk8gRklORF9TVFIgUDEKLQkuREFUQS5XCS5JTlNUUigiQUJDREVGRyIsIlxQMSIsIDApCi0JLkVORE0KLQotCUZJTkRfU1RSCUNERQotCUZJTkRfU1RSCUgKLQotCS5NQUNSTwlSRVNFUlZFX0xFTkdUSCBQMQotCS5BTElHTgk0Ci0JLlNSRVMJLkxFTigiXFAxIikKLQkuRU5ETQotCi0JUkVTRVJWRV9MRU5HVEgJQUJDREVGCi0JUkVTRVJWRV9MRU5HVEgJQUJDCi0KLQkuRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjY5NGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSEKLQotIQkuTUFDUk8JUkVTRVJWRV9TVFIgUDE9MCBQMgotIQkuU0RBVEEJLlNVQlNUUigiQUJDREVGRyIsXFAxLFxQMikKLSEJLkVORE0KLSEKLQotIQlSRVNFUlZFX1NUUgkyLDIKLSEJLlNEQVRBCS5TVUJTVFIoIkFCQ0RFRkciLDIsMikKLQkuYnl0ZQk2Nyw2OAotIQlSRVNFUlZFX1NUUgksMwotIQkuU0RBVEEJLlNVQlNUUigiQUJDREVGRyIsMCwzKQotCS5ieXRlCTY1LDY2LDY3Ci0hCi0KLSEKLQotIQkuTUFDUk8gRklORF9TVFIgUDEKLSEJLkRBVEEuVwkuSU5TVFIoIkFCQ0RFRkciLCJcUDEiLCAwKQotIQkuRU5ETQotIQotCi0hCUZJTkRfU1RSCUNERQotIQkuREFUQS5XCS5JTlNUUigiQUJDREVGRyIsIkNERSIsIDApCi0JLnNob3J0CTIKLSEJRklORF9TVFIJSAotIQkuREFUQS5XCS5JTlNUUigiQUJDREVGRyIsIkgiLCAwKQotCS5zaG9ydAktMQotIQotCi0hCS5NQUNSTwlSRVNFUlZFX0xFTkdUSCBQMQotIQkuQUxJR04JNAotIQkuU1JFUwkuTEVOKCJcUDEiKQotIQkuRU5ETQotIQotCi0hCVJFU0VSVkVfTEVOR1RICUFCQ0RFRgotIQkuQUxJR04JNAotCS5hbGlnbgk0Ci0hCS5TUkVTCS5MRU4oIkFCQ0RFRiIpCi0JLnNwYWNlCTI0Ci0hCVJFU0VSVkVfTEVOR1RICUFCQwotIQkuQUxJR04JNAotCS5hbGlnbgk0Ci0hCS5TUkVTCS5MRU4oIkFCQyIpCi0JLnNwYWNlCTEyCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTRjNmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi0JdGVzdCBmb3IgZW9mIGluIG1pZGRsZSBvZiBsaW5lCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkyMzBlMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0hCi0KLSEJdGVzdCBmb3IgZW9mIGluIG1pZGRsZSBvZiBsaW5lCi0JdGVzdCBmb3IgZW9mIGluIG1pZGRsZSBvZiBsaW5lCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGEzNTFhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotCi0JdGVzdAotKyBjb250aW51ZWQKLSsgbGluZXMKLQotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0NGU4Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIQotCi0hCi0KLSEJdGVzdAotIStjb250aW51ZWQKLSErbGluZXMKLQl0ZXN0Y29udGludWVkbGluZXMKLSEKLQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzcwMmRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0KLQl0ZXN0IGJhc2UgY29udmVydGlvbnMKLQotCUInMTAwMTAwMAotCVEnMjEwCi0JRCcxMzYKLQlIJzg4Ci0KLQlGT09CJzEwMDEwMDBCQVIKLQlGT09RJzIxMEJBUgotCUZPT0QnMTM2QkFSCi0JRk9PSCc4OEJBUgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTMzMTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkMTUwYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIQotCi0hCXRlc3QgYmFzZSBjb252ZXJ0aW9ucwotCXRlc3QgYmFzZSBjb252ZXJ0aW9ucwotIQotCi0hCUInMTAwMTAwMAotCTcyCi0hCVEnMjEwCi0JMTM2Ci0hCUQnMTM2Ci0JMTM2Ci0hCUgnODgKLQkxMzYKLSEKLQotIQlGT09CJzEwMDEwMDBCQVIKLQlGT09CJzEwMDEwMDBCQVIKLSEJRk9PUScyMTBCQVIKLQlGT09RJzIxMEJBUgotIQlGT09EJzEzNkJBUgotCUZPT0QnMTM2QkFSCi0hCUZPT0gnODhCQVIKLQlGT09IJzg4QkFSCi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTQzY2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQlkb25rZXkKLWJhcgkuQVNTSUdOQQkwCi0JLkFXSElMRQlcJmJhciBMVCA1CQotCUhJIEJBUiBJUyBcJmJhcgotZm9vCS5BU1NJR05BCTAKLQkuQVdISUxFCVwmZm9vIExUIDIKLQlISSBCRUZPUkUKLQkuQVJFUEVBVAkyCi0JSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JLkFFTkRSCi0JSEkgQUZURVIKLWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0JLkFFTkRXCi1iYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotCUFORCBJVFMgTk9XIFwmYmFyCi0JLkFFTkRXCi0JLkVORAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjhhZWIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotIQlkb25rZXkKLQlkb25rZXkKLSFiYXIJLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmYmFyIExUIDUJCi0hCUhJIEJBUiBJUyBcJmJhcgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLSEJLkFFTkRXCi0hCUhJIEJBUiBJUyBcJmJhcgotCUhJIEJBUiBJUyAwCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAwCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAwCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDAKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDAKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLQlBTkQgSVRTIE5PVyAxCi0hCS5BV0hJTEUJXCZiYXIgTFQgNQkKLSEJSEkgQkFSIElTIFwmYmFyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotIQkuQUVORFcKLSEJSEkgQkFSIElTIFwmYmFyCi0JSEkgQkFSIElTIDEKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDEKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDEKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMQotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMQotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotCUFORCBJVFMgTk9XIDIKLSEJLkFXSElMRQlcJmJhciBMVCA1CQotIQlISSBCQVIgSVMgXCZiYXIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0hCS5BRU5EVwotIQlISSBCQVIgSVMgXCZiYXIKLQlISSBCQVIgSVMgMgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMgotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMgotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAyCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAyCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0JQU5EIElUUyBOT1cgMwotIQkuQVdISUxFCVwmYmFyIExUIDUJCi0hCUhJIEJBUiBJUyBcJmJhcgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLSEJLkFFTkRXCi0hCUhJIEJBUiBJUyBcJmJhcgotCUhJIEJBUiBJUyAzCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAzCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAzCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDMKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDMKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLQlBTkQgSVRTIE5PVyA0Ci0hCS5BV0hJTEUJXCZiYXIgTFQgNQkKLSEJSEkgQkFSIElTIFwmYmFyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotIQkuQUVORFcKLSEJSEkgQkFSIElTIFwmYmFyCi0JSEkgQkFSIElTIDQKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDQKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDQKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgNAotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgNAotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotCUFORCBJVFMgTk9XIDUKLSEJLkFXSElMRQlcJmJhciBMVCA1CQotIQlISSBCQVIgSVMgXCZiYXIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0hCS5BRU5EVwotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb2JvdGggYi9nYXMvdGVzdHN1aXRlL2xpYi9kb2JvdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjYjgzN2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9ib3RoCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyEvYmluL3NoCi0KLXg9JDEgOyBzaGlmdAoteT0kMSA7IHNoaWZ0Ci0KLXJtIHRtcC4wID4gL2Rldi9udWxsIDI+JjEKLWxuIC1zICR4IHRtcC4wCi0kKiB0bXAuMCA+IHRtcC4xCi0KLXJtIHRtcC4wCi1sbiAtcyAkeSB0bXAuMAotJCogdG1wLjAgPiB0bXAuMgotCi1ybSB0bXAuMAotCi1kaWZmIC1jIHRtcC4xIHRtcC4yCi1leGl0Ci0KLSNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2Rvb2JqY21wIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9vYmpjbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1YzMyZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9vYmpjbXAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jIS9iaW4vc2gKLSMgY29tcGFyZSB0d28gb2JqZWN0IGZpbGVzLCBpbiBkZXB0aC4KLQoteD0kMQoteT0kMgotQk9USD0iJDEgJDIiCi0KLQotIyBpZiB0aGV5IGNtcCwgd2UncmUgZmluZS4KLWlmIChjbXAgJEJPVEggPiAvZGV2L251bGwpCi10aGVuCi0JZXhpdCAwCi1maQotCi0jIG90aGVyd2lzZSwgd2UgbXVzdCBsb29rIGNsb3Nlci4KLWlmIChkb2JvdGggJEJPVEggc2l6ZSkKLXRoZW4KLQllY2hvIFNpemVzIG9rLgotZWxzZQotCWVjaG8gU2l6ZXMgZGlmZmVyOgotCXNpemUgJEJPVEgKLSMJZXhpdCAxCi1maQotCi1pZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgK2hlYWRlcikKLXRoZW4KLQllY2hvIEhlYWRlcnMgb2suCi1lbHNlCi0JZWNobyBIZWFkZXIgZGlmZmVyZW5jZXMuCi0jCWV4aXQgMQotZmkKLQotaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wICt0ZXh0ID4gL2Rldi9udWxsKQotdGhlbgotCWVjaG8gVGV4dCBvay4KLWVsc2UKLQllY2hvIFRleHQgZGlmZmVyZW5jZXMuCi0jCWRvYm90aCAkQk9USCBvYmpkdW1wICt0ZXh0Ci0jCWV4aXQgMQotZmkKLQotaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wICtkYXRhID4gL2Rldi9udWxsKQotdGhlbgotCWVjaG8gRGF0YSBvay4KLWVsc2UKLQllY2hvIERhdGEgZGlmZmVyZW5jZXMuCi0jCWRvYm90aCAkQk9USCBvYmpkdW1wICtkYXRhCi0jCWV4aXQgMQotZmkKLQotaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wICtzeW1ib2xzID4gL2Rldi9udWxsKQotdGhlbgotCWVjaG8gU3ltYm9scyBvay4KLWVsc2UKLQllY2hvIC1uIFN5bWJvbCBkaWZmZXJlbmNlcy4uLgotCi0JaWYgKGRvYm90aCAkQk9USCBkb3Vuc29ydHN5bWJvbHMpCi0JdGhlbgotCQllY2hvIGJ1dCBzeW1ib2xzIGFyZSBzaW1wbHkgb3JkZXJlZCBkaWZmZXJlbnRseS4KLSMJCWVjaG8gTm93IHdoYXQgdG8gZG8gYWJvdXQgcmVsb2NzJz8nCi0jCQlleGl0IDEKLQllbHNlCi0JCWVjaG8gYW5kIHN5bWJvbHMgZGlmZmVyIGluIGNvbnRlbnQuCi0JCWV4aXQgMQotCWZpCi1maQotCi0jIG9mIGNvdXJzZSwgaWYgdGhlcmUgd2VyZSBzeW1ib2wgZGlmZnMsIHRoZW4gdGhlIHJlbG9jIHN5bWJvbCBpbmRleGVzCi0jIHdpbGwgYmUgb2ZmLgotCi1pZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgLXIgPiAvZGV2L251bGwpCi10aGVuCi0JZWNobyBSZWxvYyBvay4KLWVsc2UKLQllY2hvIC1uIFJlbG9jIGRpZmZlcmVuY2VzLi4uCi0KLQlpZiAoZG9ib3RoICRCT1RIIGRvdW5zb3J0cmVsb2MpCi0JdGhlbgotCQllY2hvIGJ1dCByZWxvY3MgYXJlIHNpbXBseSBvcmRlcmVkIGRpZmZlcmVudGx5LgotCWVsc2UKLQkJZWNobyBhbmQgcmVsb2NzIGRpZmZlciBpbiBjb250ZW50LgotCQlleGl0IDEKLQlmaQotZmkKLQotZXhpdAotCi0jIGVvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9zdHJpcHRlc3QgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3N0cmlwdGVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2E1MTcwMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3N0cmlwdGVzdAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi14PXN0cmlwdGVzdC54eC4kJAoteT1zdHJpcHRlc3QueXkuJCQKLQotY3AgJDEgJHgKLXN0cmlwICR4Ci1jcCAkMiAkeQotc3RyaXAgJHkKLQotZG9vYmpjbXAgJHggJHkKLWV4aXQKLQotI2VvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG90ZXN0IGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG90ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzY4YTIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdGVzdAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMhL2Jpbi9zaAotIyBhZCBob2MgZGVidWcgdG9vbAotCi14PSQxCi15PSQyCi0KLXhvdXQ9YGJhc2VuYW1lICR4YC54eHguJCQKLXlvdXQ9YGJhc2VuYW1lICR4YC55eXkuJCQKLQotbWtkaXIgJHhvdXQKLW1rZGlyICR5b3V0Ci0KLWZvciBpIGluICoucwotZG8KLQllY2hvIFRlc3RpbmcgJGkuLi4KLQlvYmplY3Q9YGJhc2VuYW1lICRpIC5zYC5vCi0JJHggJGkgLW8gJHhvdXQvJG9iamVjdAotCSR5ICRpIC1vICR5b3V0LyRvYmplY3QKLQotIyBpZiB0aGV5IGNtcCwgd2UncmUgb2suICBPdGhlcndpc2Ugd2UgaGF2ZSB0byBsb29rIGNsb3Nlci4KLQotCWlmIChjbXAgJHhvdXQvJG9iamVjdCAkeW91dC8kb2JqZWN0KQotCXRoZW4KLQkJZWNobyAkaSBpcyBvay4KLQllbHNlCi0JCWlmIChkb29iamNtcCAkeG91dC8kb2JqZWN0ICR5b3V0LyRvYmplY3QpCi0JCXRoZW4KLQkJCWVjaG8gTm90IHRoZSBzYW1lIGJ1dCBvYmpjbXAgb2suCi0JCWVsc2UKLQkJCWV4aXQgMQotCQlmaQotCWZpCi0KLQllY2hvCi1kb25lCi0KLXJtIC1yZiAkeG91dCAkeW91dAotCi1leGl0IDAKLQotIyBFT0YKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3JlbG9jIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNyZWxvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQ2OTUzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3JlbG9jCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIS9iaW4vc2gKLSMgb2JqZHVtcCB0aGUgcmVsb2MgdGFibGUsIGJ1dCBzdHJpcCBvZmYgdGhlIGhlYWRpbmdzIGFuZCByZWxvYwotIyBudW1iZXJzIGFuZCBzb3J0IHRoZSByZXN1bHQuICBJbnRlbmRlZCBmb3IgdXNlIGluIGNvbXBhcmluZyByZWxvYwotIyB0YWJsZXMgdGhhdCBtYXkgbm90IGJlIGluIHRoZSBzYW1lIG9yZGVyLgotCi1vYmpkdW1wICtyZWxvYyArb21pdC1yZWxvY2F0aW9uLW51bWJlcnMgK29taXQtc3ltYm9sLW51bWJlcnMgJDEgXAotCXwgc29ydAotI2VvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNzeW0gYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3N5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ0ZGE2Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3N5bQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyEvYmluL3NoCi0jIG9iamR1bXAgdGhlIHN5bWJvbCB0YWJsZSwgYnV0IHN0cmlwIG9mZiB0aGUgaGVhZGluZ3MgYW5kIHN5bWJvbAotIyBudW1iZXJzIGFuZCBzb3J0IHRoZSByZXN1bHQuICBJbnRlbmRlZCBmb3IgdXNlIGluIGNvbXBhcmluZyBzeW1ib2wKLSMgdGFibGVzIHRoYXQgbWF5IG5vdCBiZSBpbiB0aGUgc2FtZSBvcmRlci4KLQotb2JqZHVtcCArc3ltYm9scyArb21pdC1zeW1ib2wtbnVtYmVycyAkMSBcCi0JfCBzb3J0Ci0jZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGVmcy5leHAgYi9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGVmcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzcxOGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRlZnMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgS2VuIFJhZWJ1cm4gKHJhZWJ1cm5AY3lnbnVzLmNvbSkuCi0KLXByb2MgZ2FzX3ZlcnNpb24ge30gewotICAgIGdsb2JhbCBBUwotICAgIGNhdGNoICJleGVjICRBUyAtdmVyc2lvbiA8IC9kZXYvbnVsbCIgdG1wCi0gICAgIyBTaG91bGQgZmluZCBhIHdheSB0byBkaXNjYXJkIGNvbnN0YW50IHBhcnRzLCBrZWVwIHdoYXRldmVyJ3MKLSAgICAjIGxlZnQsIHNvIHRoZSB2ZXJzaW9uIHN0cmluZyBjb3VsZCBiZSBhbG1vc3QgYW55dGhpbmcgYXQgYWxsLi4uCi0gICAgcmVnZXhwICJcW15cblxdKiAoY3lnbnVzLXwpKFxbLTAtOS5hLXpBLVotXF0rKVxbXHJcblxdLioiICR0bXAgdmVyc2lvbiBjeWcgbnVtYmVyCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBudW1iZXJdIHRoZW4gewotICAgICAgICByZXR1cm4gIlt3aGljaCAkQVNdIChubyB2ZXJzaW9uIG51bWJlcilcbiIKLSAgICB9Ci0gICAgY2xvbmVfb3V0cHV0ICJbd2hpY2ggJEFTXSAkbnVtYmVyXG4iCi0gICAgdW5zZXQgdmVyc2lvbgotfQotCi1wcm9jIGdhc19ydW4geyBwcm9nIGFzX29wdHMgcmVkaXIgfSB7Ci0gICAgZ2xvYmFsIEFTCi0gICAgZ2xvYmFsIEFTRkxBR1MKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHZlcmJvc2UgIkV4ZWN1dGluZyAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRhc19vcHRzICRzcmNkaXIvJHN1YmRpci8kcHJvZyAkcmVkaXIiCi0gICAgY2F0Y2ggImV4ZWMgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkc3JjZGlyLyRzdWJkaXIvJHByb2cgJHJlZGlyIiBjb21wX291dHB1dAotICAgIHNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQotICAgIHZlcmJvc2UgIm91dHB1dCB3YXMgJGNvbXBfb3V0cHV0IgotICAgIHJldHVybiBbbGlzdCAkY29tcF9vdXRwdXQgIiJdOwotfQotCi1wcm9jIGFsbF9vbmVzIHsgYXJncyB9IHsKLSAgICBmb3JlYWNoIHggJGFyZ3MgeyBpZiBbZXhwciAkeCE9MV0geyByZXR1cm4gMCB9IH0KLSAgICByZXR1cm4gMQotfQotCi1wcm9jIGdhc19zdGFydCB7IHByb2cgYXNfb3B0cyB9IHsKLSAgICBnbG9iYWwgQVMKLSAgICBnbG9iYWwgQVNGTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICB2ZXJib3NlICJTdGFydGluZyAkQVMgJEFTRkxBR1MgJGFzX29wdHMgJHByb2ciIDIKLSAgICBjYXRjaCB7Ci0Jc3Bhd24gLW5vZWNobyAtbm90dHljb3B5ICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJGFzX29wdHMgJHNyY2Rpci8kc3ViZGlyLyRwcm9nCi0gICAgfSBmb28KLSAgICBpZiAhW3JlZ2V4cCB7XlswLTldK30gJGZvb10gdGhlbiB7Ci0JcGVycm9yICJDYW4ndCBydW4gJHN1YmRpci8kcHJvZzogJGZvbyIKLSAgICB9Ci19Ci0KLXByb2MgZ2FzX2ZpbmlzaCB7IH0gewotICAgIGdsb2JhbCBzcGF3bl9pZAotCi0gICAgY2F0Y2ggImNsb3NlIgotICAgIGNhdGNoICJ3YWl0IgotfQotCi1wcm9jIHdhbnRfbm9fb3V0cHV0IHsgdGVzdG5hbWUgfSB7Ci0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKLSAgICB9Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXBhc3MgIiR0ZXN0bmFtZSIKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJHRlc3RuYW1lIgotCXJldHVybiAwCi0gICAgfQotfQotCi1wcm9jIGdhc190ZXN0X29sZCB7IGZpbGUgYXNfb3B0cyB0ZXN0bmFtZSB9IHsKLSAgICBnYXNfcnVuICRmaWxlICRhc19vcHRzICIiCi0gICAgcmV0dXJuIFt3YW50X25vX291dHB1dCAkdGVzdG5hbWVdCi19Ci0KLXByb2MgZ2FzX3Rlc3QgeyBmaWxlIGFzX29wdHMgdmFyX29wdHMgdGVzdG5hbWUgfSB7Ci0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0KLSAgICBzZXQgaSAwCi0gICAgZm9yZWFjaCB3b3JkICR2YXJfb3B0cyB7Ci0Jc2V0IGlnbm9yZV9zdGRvdXQoJGkpIFtzdHJpbmcgbWF0Y2ggIio+IiAkd29yZF0KLQlzZXQgb3B0KCRpKSBbc3RyaW5nIHRyaW0gJHdvcmQgez59XQotCWluY3IgaQotICAgIH0KLSAgICBzZXQgbWF4IFtleHByIDE8PCRpXQotICAgIGZvciB7c2V0IGkgMH0ge1tleHByICRpPCRtYXhdfSB7aW5jciBpfSB7Ci0Jc2V0IG1heWJlX2lnbm9yZV9zdGRvdXQgIiIKLQlzZXQgZXh0cmFfb3B0cyAiIgotCWZvciB7c2V0IGJpdCAwfSB7KDE8PCRiaXQpPCRtYXh9IHtpbmNyIGJpdH0gewotCSAgICBzZXQgbnVtIFtleHByIDE8PCRiaXRdCi0JICAgIGlmIFtleHByICRpJiRudW1dIHRoZW4gewotCQlzZXQgZXh0cmFfb3B0cyAiJGV4dHJhX29wdHMgJG9wdCgkYml0KSIKLQkJaWYgJGlnbm9yZV9zdGRvdXQoJGJpdCkgdGhlbiB7Ci0JCSAgICBzZXQgbWF5YmVfaWdub3JlX3N0ZG91dCAiPi9kZXYvbnVsbCIKLQkJfQotCSAgICB9Ci0JfQotCXNldCBleHRyYV9vcHRzIFtzdHJpbmcgdHJpbSAkZXh0cmFfb3B0c10KLQlnYXNfcnVuICRmaWxlICIkYXNfb3B0cyAkZXh0cmFfb3B0cyIgJG1heWJlX2lnbm9yZV9zdGRvdXQKLQotCSMgU2hvdWxkIEkgYmUgYWJsZSB0byB1c2UgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGhlcmU/Ci0JaWYgW3N0cmluZyBtYXRjaCAiIiAkZXh0cmFfb3B0c10gdGhlbiB7Ci0JICAgIHdhbnRfbm9fb3V0cHV0ICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIHdhbnRfbm9fb3V0cHV0ICIkdGVzdG5hbWUgKCRleHRyYV9vcHRzKSIKLQl9Ci0gICAgfQotICAgIGlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgICAgICB1bnNldCBlcnJvckluZm8KLSAgICB9Ci19Ci0KLXByb2MgZ2FzX3Rlc3RfaWdub3JlX3N0ZG91dCB7IGZpbGUgYXNfb3B0cyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIGdhc19ydW4gJGZpbGUgJGFzX29wdHMgIj4vZGV2L251bGwiCi0gICAgd2FudF9ub19vdXRwdXQgJHRlc3RuYW1lCi19Ci0KLXByb2MgZ2FzX3Rlc3RfZXJyb3IgeyBmaWxlIGFzX29wdHMgdGVzdG5hbWUgfSB7Ci0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0KLSAgICBnYXNfcnVuICRmaWxlICRhc19vcHRzICI+L2Rldi9udWxsIgotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCXZlcmJvc2UgIiRjb21wX291dHB1dCIgMwotICAgIH0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0JZmFpbCAiJHRlc3RuYW1lIgotICAgIH0gZWxzZSB7Ci0JcGFzcyAiJHRlc3RuYW1lIgotICAgIH0KLX0KLQotcHJvYyBnYXNfZXhpdCB7fSB7fQotCi1wcm9jIGdhc19pbml0IHsgYXJncyB9IHsKLSAgICBnbG9iYWwgdGFyZ2V0X2NwdQotICAgIGdsb2JhbCB0YXJnZXRfY3B1X2ZhbWlseQotICAgIGdsb2JhbCB0YXJnZXRfZmFtaWx5Ci0gICAgZ2xvYmFsIHRhcmdldF92ZW5kb3IKLSAgICBnbG9iYWwgdGFyZ2V0X29zCi0gICAgZ2xvYmFsIHN0ZG9wdGxpc3QKLQotICAgIGNhc2UgIiR0YXJnZXRfY3B1IiBpbiB7Ci0JIm02OD8/PyIJCXsgc2V0IHRhcmdldF9jcHVfZmFtaWx5IG02OGsgfQotCSJpWzM0XTg2IgkJeyBzZXQgdGFyZ2V0X2NwdV9mYW1pbHkgaTM4NiB9Ci0JZGVmYXVsdAkJCXsgc2V0IHRhcmdldF9jcHVfZmFtaWx5ICR0YXJnZXRfY3B1IH0KLSAgICB9Ci0KLSAgICBzZXQgdGFyZ2V0X2ZhbWlseSAiJHRhcmdldF9jcHVfZmFtaWx5LSR0YXJnZXRfdmVuZG9yLSR0YXJnZXRfb3MiCi0gICAgc2V0IHN0ZG9wdGxpc3QgIi1hPiIKLQotICAgIGlmICFbaXN0YXJnZXQgIiotKi0qIl0gewotCXBlcnJvciAiVGFyZ2V0IG5hbWUgW2lzdGFyZ2V0XSBpcyBub3QgYSB0cmlwbGUuIgotICAgIH0KLSAgICAjIE5lZWQgdG8gcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLSAgICByZXR1cm4KLX0KLQotCi0jIHJ1bl9kdW1wX3Rlc3QgRklMRSAKLSMKLSMgQXNzZW1ibGUgYSAucyBmaWxlLCB0aGVuIHJ1biBzb21lIHV0aWxpdHkgb24gaXQgYW5kIGNoZWNrIHRoZSBvdXRwdXQuCi0jIAotIyBUaGVyZSBzaG91bGQgYmUgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgZmlsZSBuYW1lZCBGSUxFLnMgaW4gdGhlIHRlc3QKLSMgc3VpdGUgZGlyZWN0b3J5LCBhbmQgYSBwYXR0ZXJuIGZpbGUgY2FsbGVkIEZJTEUuZC4gIGBydW5fZHVtcF90ZXN0JwotIyB3aWxsIGFzc2VtYmxlIEZJTEUucywgcnVuIHNvbWUgdG9vbCBsaWtlIGBvYmpkdW1wJywgYG9iamNvcHknLCBvcgotIyBgbm0nIG9uIHRoZSAubyBmaWxlIHRvIHByb2R1Y2UgdGV4dHVhbCBvdXRwdXQsIGFuZCB0aGVuIGFuYWx5emUgdGhhdAotIyB3aXRoIHJlZ2V4cHMuICBUaGUgRklMRS5kIGZpbGUgc3BlY2lmaWVzIHdoYXQgcHJvZ3JhbSB0byBydW4sIGFuZAotIyB3aGF0IHRvIGV4cGVjdCBpbiBpdHMgb3V0cHV0LgotIwotIyBUaGUgRklMRS5kIGZpbGUgYmVnaW5zIHdpdGggemVybyBvciBtb3JlIG9wdGlvbiBsaW5lcywgd2hpY2ggc3BlY2lmeQotIyBmbGFncyB0byBwYXNzIHRvIHRoZSBhc3NlbWJsZXIsIHRoZSBwcm9ncmFtIHRvIHJ1biB0byBkdW1wIHRoZQotIyBhc3NlbWJsZXIncyBvdXRwdXQsIGFuZCB0aGUgb3B0aW9ucyBpdCB3YW50cy4gIFRoZSBvcHRpb24gbGluZXMgaGF2ZQotIyB0aGUgc3ludGF4OgotIyAKLSMgICAgICAgICAjIE9QVElPTjogVkFMVUUKLSMgCi0jIE9QVElPTiBpcyB0aGUgbmFtZSBvZiBzb21lIG9wdGlvbiwgbGlrZSAibmFtZSIgb3IgIm9iamR1bXAiLCBhbmQKLSMgVkFMVUUgaXMgT1BUSU9OJ3MgdmFsdWUuICBUaGUgdmFsaWQgb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGJlbG93LgotIyBXaGl0ZXNwYWNlIGlzIGlnbm9yZWQgZXZlcnl3aGVyZSwgZXhjZXB0IHdpdGhpbiBWQUxVRS4gIFRoZSBvcHRpb24KLSMgbGlzdCBlbmRzIHdpdGggdGhlIGZpcnN0IGxpbmUgdGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBhYm92ZSBzeW50YXgKLSMgKGhtbSwgbm90IGdyZWF0IGZvciBlcnJvciBkZXRlY3Rpb24pLgotIwotIyBUaGUgaW50ZXJlc3Rpbmcgb3B0aW9ucyBhcmU6Ci0jIAotIyAgIG5hbWU6IFRFU1QtTkFNRQotIwlUaGUgbmFtZSBvZiB0aGlzIHRlc3QsIHBhc3NlZCB0byBEZWphR05VJ3MgYHBhc3MnIGFuZCBgZmFpbCcKLSMgICAgICAgY29tbWFuZHMuICBJZiBvbWl0dGVkLCB0aGlzIGRlZmF1bHRzIHRvIEZJTEUsIHRoZSByb290IG9mIHRoZQotIyAgICAgICAucyBhbmQgLmQgZmlsZXMnIG5hbWVzLgotIyAKLSMgICBhczogRkxBR1MKLSMJV2hlbiBhc3NlbWJsaW5nIEZJTEUucywgcGFzcyBGTEFHUyB0byB0aGUgYXNzZW1ibGVyLgotIyAKLSMgICBQUk9HOiBQUk9HUkFNLU5BTUUKLSMgICAgICAgVGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gcnVuIHRvIGFuYWx5emUgdGhlIC5vIGZpbGUgcHJvZHVjZWQKLSMgICAgICAgYnkgdGhlIGFzc2VtYmxlci4gIFRoaXMgY2FuIGJlIG9taXR0ZWQ7IHJ1bl9kdW1wX3Rlc3Qgd2lsbCBndWVzcwotIyAgICAgICB3aGljaCBwcm9ncmFtIHRvIHJ1biBieSBzZWVpbmcgd2hpY2ggb2YgdGhlIGZsYWdzIG9wdGlvbnMgYmVsb3cKLSMJaXMgcHJlc2VudC4KLSMgCi0jICAgb2JqZHVtcDogRkxBR1MKLSMgICBubTogRkxBR1MKLSMgICBvYmpjb3B5OiBGTEFHUwotIwlVc2UgdGhlIHNwZWNpZmllZCBwcm9ncmFtIHRvIGFuYWx5emUgdGhlIC5vIGZpbGUsIGFuZCBwYXNzIGl0Ci0jCUZMQUdTLCBpbiBhZGRpdGlvbiB0byB0aGUgLm8gZmlsZSBuYW1lLgotIwotIyAgIHNvdXJjZTogU09VUkNFCi0jCUFzc2VtYmxlIHRoZSBmaWxlIFNPVVJDRS5zLiAgSWYgb21pdHRlZCwgdGhpcyBkZWZhdWx0cyB0byBGSUxFLnMuCi0jICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHNldmVyYWwgLmQgZmlsZXMgd2FudCB0byBzaGFyZSBhIC5zIGZpbGUuCi0jCi0jIEVhY2ggb3B0aW9uIG1heSBvY2N1ciBhdCBtb3N0IG9uY2UuCi0jCi0jIEFmdGVyIHRoZSBvcHRpb24gbGluZXMgY29tZSByZWdleHAgbGluZXMuICBgcnVuX2R1bXBfdGVzdCcgY2FsbHMKLSMgYHJlZ2V4cF9kaWZmJyB0byBjb21wYXJlIHRoZSBvdXRwdXQgb2YgdGhlIGR1bXBpbmcgdG9vbCBhZ2FpbnN0IHRoZQotIyByZWdleHBzIGluIEZJTEUuZC4gIGByZWdleHBfZGlmZicgaXMgZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGU7IHNlZQotIyBmdXJ0aGVyIGNvbW1lbnRzIHRoZXJlLgotCi1wcm9jIHJ1bl9kdW1wX3Rlc3QgeyBuYW1lIH0gewotICAgIGdsb2JhbCBzdWJkaXIgc3JjZGlyCi0gICAgZ2xvYmFsIE9CSkRVTVAgTk0gQVMgT0JKQ09QWQotICAgIGdsb2JhbCBPQkpEVU1QRkxBR1MgTk1GTEFHUyBBU0ZMQUdTIE9CSkNPUFlGTEFHUwotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiovKiIgJG5hbWVdIHsKLQlzZXQgZmlsZSAkbmFtZQotCXNldCBuYW1lIFtmaWxlIHRhaWwgJG5hbWVdCi0gICAgfSBlbHNlIHsKLQlzZXQgZmlsZSAiJHNyY2Rpci8kc3ViZGlyLyRuYW1lIgotICAgIH0KLSAgICBzZXQgb3B0X2FycmF5IFtzbHVycF9vcHRpb25zICIke2ZpbGV9LmQiXQotICAgIGlmIHsgJG9wdF9hcnJheSA9PSAtMSB9IHsKLQl1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgc2V0IG9wdHMoYXMpIHt9Ci0gICAgc2V0IG9wdHMob2JqZHVtcCkge30KLSAgICBzZXQgb3B0cyhubSkge30KLSAgICBzZXQgb3B0cyhvYmpjb3B5KSB7fQotICAgIHNldCBvcHRzKG5hbWUpIHt9Ci0gICAgc2V0IG9wdHMoUFJPRykge30KLSAgICBzZXQgb3B0cyhzb3VyY2UpIHt9Ci0KLSAgICBmb3JlYWNoIGkgJG9wdF9hcnJheSB7Ci0Jc2V0IG9wdF9uYW1lIFtsaW5kZXggJGkgMF0KLQlzZXQgb3B0X3ZhbCBbbGluZGV4ICRpIDFdCi0JaWYgIVtpbmZvIGV4aXN0cyBvcHRzKCRvcHRfbmFtZSldIHsKLQkgICAgcGVycm9yICJ1bmtub3duIG9wdGlvbiAkb3B0X25hbWUgaW4gZmlsZSAkZmlsZS5kIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCWlmIFtzdHJpbmcgbGVuZ3RoICRvcHRzKCRvcHRfbmFtZSldIHsKLQkgICAgcGVycm9yICJvcHRpb24gJG9wdF9uYW1lIG11bHRpcGx5IHNldCBpbiAkZmlsZS5kIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCXNldCBvcHRzKCRvcHRfbmFtZSkgJG9wdF92YWwKLSAgICB9Ci0KLSAgICBpZiB7JG9wdHMoUFJPRykgIT0gIiJ9IHsKLQlzd2l0Y2ggLS0gJG9wdHMoUFJPRykgewotCSAgICBvYmpkdW1wCi0JCXsgc2V0IHByb2dyYW0gb2JqZHVtcCB9Ci0JICAgIG5tCi0JCXsgc2V0IHByb2dyYW0gbm0gfQotCSAgICBvYmpjb3B5Ci0JCXsgc2V0IHByb2dyYW0gb2JqY29weSB9Ci0JICAgIGRlZmF1bHQKLQkJeyBwZXJyb3IgInVucmVjb2duaXplZCBwcm9ncmFtIG9wdGlvbiAkb3B0cyhQUk9HKSBpbiAkZmlsZS5kIgotCQkgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCQkgIHJldHVybiB9Ci0JfQotICAgIH0gZWxzZSB7Ci0JIyBHdWVzcyB3aGljaCBwcm9ncmFtIHRvIHJ1biwgYnkgc2VlaW5nIHdoaWNoIG9wdGlvbiB3YXMgc3BlY2lmaWVkLgotCXNldCBwcm9ncmFtICIiCi0JZm9yZWFjaCBwIHtvYmpkdW1wIG9iamNvcHkgbm19IHsKLQkgICAgaWYgeyRvcHRzKCRwKSAhPSAiIn0gewotCQlpZiB7JHByb2dyYW0gIT0gIiJ9IHsKLQkJICAgIHBlcnJvciAiYW1iaWd1b3VzIGR1bXAgcHJvZ3JhbSBpbiAkZmlsZS5kIgotCQkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JCSAgICByZXR1cm4KLQkJfSBlbHNlIHsKLQkJICAgIHNldCBwcm9ncmFtICRwCi0JCX0KLQkgICAgfQotCX0KLQlpZiB7JHByb2dyYW0gPT0gIiJ9IHsKLQkgICAgcGVycm9yICJkdW1wIHByb2dyYW0gdW5zcGVjaWZpZWQgaW4gJGZpbGUuZCIKLQkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBzZXQgcHJvZ29wdHMxICRvcHRzKCRwcm9ncmFtKQotICAgIGV2YWwgc2V0IHByb2dvcHRzIFwkW3N0cmluZyB0b3VwcGVyICRwcm9ncmFtXUZMQUdTCi0gICAgZXZhbCBzZXQgYmluYXJ5IFwkW3N0cmluZyB0b3VwcGVyICRwcm9ncmFtXQotICAgIGlmIHsgJG9wdHMobmFtZSkgPT0gIiIgfSB7Ci0Jc2V0IHRlc3RuYW1lICIkc3ViZGlyLyRuYW1lIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHRlc3RuYW1lICRvcHRzKG5hbWUpCi0gICAgfQotCi0gICAgaWYgeyAkb3B0cyhzb3VyY2UpID09ICIiIH0gewotCXNldCBzb3VyY2VmaWxlICR7ZmlsZX0ucwotICAgIH0gZWxzZSB7Ci0Jc2V0IHNvdXJjZWZpbGUgJHNyY2Rpci8kc3ViZGlyLyRvcHRzKHNvdXJjZSkKLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiJEFTICRBU0ZMQUdTICRvcHRzKGFzKSAtbyBkdW1wLm8gJHNvdXJjZWZpbGVcbiIKLSAgICBjYXRjaCAiZXhlYyAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRvcHRzKGFzKSAtbyBkdW1wLm8gJHNvdXJjZWZpbGUiIGNvbXBfb3V0cHV0Ci0gICAgc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIGlmIHsgW3doaWNoICRiaW5hcnldID09IDAgfSB7Ci0JdW50ZXN0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyAkcHJvZ29wdHMxID09ICIiIH0geyBzZXQgJHByb2dvcHRzMSAiLXIiIH0KLSAgICB2ZXJib3NlICJydW5uaW5nICRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEiIDMKLQotICAgICMgT2JqY29weSwgdW5saWtlIHRoZSBvdGhlciB0d28sIHdvbid0IHNlbmQgaXRzIG91dHB1dCB0byBzdGRvdXQsCi0gICAgIyBzbyB3ZSBoYXZlIHRvIHJ1biBpdCBzcGVjaWFsbHkuCi0gICAgaWYgeyAkcHJvZ3JhbSA9PSAib2JqY29weSIgfSB7Ci0Jc2VuZF9sb2cgIiRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vIGR1bXAub3V0XG4iCi0JY2F0Y2ggImV4ZWMgJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gZHVtcC5vdXQiIGNvbXBfb3V0cHV0Ci0Jc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCSAgICBmYWlsICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gPiBkdW1wLm91dFxuIgotCWNhdGNoICJleGVjICRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vID4gZHVtcC5vdXQiIGNvbXBfb3V0cHV0Ci0Jc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCSAgICBmYWlsICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgdmVyYm9zZV9ldmFsIHtbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXX0gMwotICAgIGlmIHsgW3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0uZCJdIH0gdGhlbiB7Ci0JZmFpbCAkdGVzdG5hbWUKLQl2ZXJib3NlICJvdXRwdXQgaXMgW2ZpbGVfY29udGVudHMgImR1bXAub3V0Il0iIDIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi1wcm9jIHNsdXJwX29wdGlvbnMgeyBmaWxlIH0gewotICAgIGlmIFtjYXRjaCB7IHNldCBmIFtvcGVuICRmaWxlIHJdIH0geF0gewotCSNwZXJyb3IgImNvdWxkbid0IG9wZW4gYCRmaWxlJzogJHgiCi0JcGVycm9yICIkeCIKLQlyZXR1cm4gLTEKLSAgICB9Ci0gICAgc2V0IG9wdF9hcnJheSB7fQotICAgICMgd2hpdGVzcGFjZSBleHByZXNzaW9uCi0gICAgc2V0IHdzICB7WyAJXSp9Ci0gICAgc2V0IG53cyB7W14gCV0qfQotICAgICMgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIGFueXdoZXJlIGV4Y2VwdCB3aXRoaW4gdGhlIG9wdGlvbnMgbGlzdDsKLSAgICAjIG9wdGlvbiBuYW1lcyBhcmUgYWxwaGFiZXRpYyBvbmx5Ci0gICAgc2V0IHBhdCAiXiMke3dzfShcW2EtekEtWlxdKikkd3M6JHt3c30oLiopJHdzXCQiCi0gICAgd2hpbGUgeyBbZ2V0cyAkZiBsaW5lXSAhPSAtMSB9IHsKLQlzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCi0JIyBXaGl0ZXNwYWNlIGhlcmUgaXMgc3BhY2UtdGFiLgotCWlmIFtyZWdleHAgJHBhdCAkbGluZSB4eHggb3B0X25hbWUgb3B0X3ZhbF0gewotCSAgICAjIG1hdGNoIQotCSAgICBsYXBwZW5kIG9wdF9hcnJheSBbbGlzdCAkb3B0X25hbWUgJG9wdF92YWxdCi0JfSBlbHNlIHsKLQkgICAgYnJlYWsKLQl9Ci0gICAgfQotICAgIGNsb3NlICRmCi0gICAgcmV0dXJuICRvcHRfYXJyYXkKLX0KLQotcHJvYyBvYmpkdW1wIHsgb3B0cyB9IHsKLSAgICBnbG9iYWwgT0JKRFVNUAotICAgIGdsb2JhbCBjb21wX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGNhdGNoICJleGVjICRPQkpEVU1QICRvcHRzIiBjb21wX291dHB1dAotICAgIHNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQotICAgIHZlcmJvc2UgIm9iamR1bXAgb3V0cHV0PSRjb21wX291dHB1dFxuIiAzCi19Ci0KLXByb2Mgb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgeyBwcm9nIG9wdHMgfSB7Ci0gICAgZ2xvYmFsIE9CSkRVTVAKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICB2ZXJib3NlICJTdGFydGluZyAkT0JKRFVNUCAkb3B0cyAkcHJvZyIgMgotICAgIGNhdGNoIHsKLQlzcGF3biAtbm9lY2hvIC1ub3R0eWluaXQgJHNyY2Rpci9saWIvcnVuICRPQkpEVU1QICRvcHRzICRwcm9nCi0gICAgfSBmb28KLSAgICBpZiAhW3JlZ2V4cCB7XlswLTldK30gJGZvb10gdGhlbiB7Ci0JcGVycm9yICJDYW4ndCBydW4gJHByb2c6ICRmb28iCi0gICAgfQotfQotCi1wcm9jIG9iamR1bXBfZmluaXNoIHsgfSB7Ci0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICBjYXRjaCAiY2xvc2UiCi0gICAgY2F0Y2ggIndhaXQiCi19Ci0KLSMgRGVmYXVsdCB0aW1lb3V0IGlzIDEwIHNlY29uZHMsIGxvc2VzIG9uIGEgc2xvdyBtYWNoaW5lLiAgQnV0IHNvbWUKLSMgY29uZmlndXJhdGlvbnMgb2YgZGVqYWdudSBtYXkgb3ZlcnJpZGUgaXQuCi1pZiB7JHRpbWVvdXQ8MTIwfSB0aGVuIHsgc2V0IHRpbWVvdXQgMTIwIH0KLQotZXhwZWN0X2FmdGVyIC1pIHsKLSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXQiIH0KLSAgICAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgl7IHBlcnJvciAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIiB9Ci0gICAgYnVmZmVyX2Z1bGwJCQl7IHBlcnJvciAiYnVmZmVyIGZ1bGwiIH0KLSAgICBlb2YJCQkJeyBwZXJyb3IgImVvZiIgfQotfQotCi0jIHJlZ2V4cF9kaWZmLCBiYXNlZCBvbiBzaW1wbGVfZGlmZiB0YWtlbiBmcm9tIGxkIHRlc3Qgc3VpdGUKLSMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQotIwlmaWxlMSBjb250YWlucyBzdHJpbmdzLCBmaWxlMiBjb250YWlucyByZWdleHBzIGFuZCAjLWNvbW1lbnRzCi0jCWJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkIGluIGVpdGhlciBmaWxlCi0jCXJldHVybnMgbm9uLXplcm8gaWYgZGlmZmVyZW5jZXMgZXhpc3QKLSMKLXByb2MgcmVnZXhwX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0gewotCi0gICAgc2V0IGVvZiAtMQotICAgIHNldCBlbmRfMSAwCi0gICAgc2V0IGVuZF8yIDAKLSAgICBzZXQgZGlmZmVyZW5jZXMgMAotICAgIHNldCBkaWZmX3Bhc3MgMAotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzFdIHRoZW4gewotCXNldCBmaWxlX2EgW29wZW4gJGZpbGVfMSByXQotICAgIH0gZWxzZSB7Ci0Jd2FybmluZyAiJGZpbGVfMSBkb2Vzbid0IGV4aXN0IgotCXJldHVybiAxCi0gICAgfQotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzJdIHRoZW4gewotCXNldCBmaWxlX2IgW29wZW4gJGZpbGVfMiByXQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGZpbGVfMiBkb2Vzbid0IGV4aXN0IgotCWNsb3NlICRmaWxlX2EKLQlyZXR1cm4gMQotICAgIH0KLQotICAgIHZlcmJvc2UgIiBSZWdleHAtZGlmZidpbmc6ICRmaWxlXzEgJGZpbGVfMiIgMgotCi0gICAgd2hpbGUgeyAxIH0gewotCXNldCBsaW5lX2EgIiIKLQlzZXQgbGluZV9iICIiCi0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9hXSA9PSAwIH0gewotCSAgICBpZiB7IFtnZXRzICRmaWxlX2EgbGluZV9hXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzEgMQotCQlicmVhawotCSAgICB9Ci0JfQotCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYl0gPT0gMCB8fCBbc3RyaW5nIG1hdGNoICIjKiIgJGxpbmVfYl0gfSB7Ci0JICAgIGlmIFsgc3RyaW5nIG1hdGNoICIjcGFzcyIgJGxpbmVfYiBdIHsKLQkJc2V0IGVuZF8yIDEKLQkJc2V0IGRpZmZfcGFzcyAxCi0JCWJyZWFrCi0JICAgIH0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9iIGxpbmVfYl0gPT0gJGVvZiB9IHsKLQkJc2V0IGVuZF8yIDEKLQkJYnJlYWsKLQkgICAgfQotCX0KLQotICAgICAgICBpZiB7ICRkaWZmX3Bhc3MgfSB7IAotICAgICAgICAgICAgYnJlYWsgCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xICYmICRlbmRfMiB9IHsgCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xIiAzCi0gICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzIgfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVyYm9zZSAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIiIgMwotICAgICAgICAgICAgaWYgIVtyZWdleHAgIl4kbGluZV9iJCIgIiRsaW5lX2EiXSB7Ci0JCXNlbmRfbG9nICJyZWdleHBfZGlmZiBtYXRjaCBmYWlsdXJlXG4iCi0JCXNlbmRfbG9nICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiXG4iCi0JCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIHsgJGRpZmZlcmVuY2VzID09IDAgJiYgISRkaWZmX3Bhc3MgJiYgW2VvZiAkZmlsZV9hXSAhPSBbZW9mICRmaWxlX2JdIH0gewotCXNlbmRfbG9nICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3Roc1xuIgotCXZlcmJvc2UgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzIiAzCi0Jc2V0IGRpZmZlcmVuY2VzIDEKLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZV9hCi0gICAgY2xvc2UgJGZpbGVfYgotCi0gICAgcmV0dXJuICRkaWZmZXJlbmNlcwotfQotCi1wcm9jIGZpbGVfY29udGVudHMgeyBmaWxlbmFtZSB9IHsKLSAgICBzZXQgZmlsZSBbb3BlbiAkZmlsZW5hbWUgcl0KLSAgICBzZXQgY29udGVudHMgW3JlYWQgJGZpbGVdCi0gICAgY2xvc2UgJGZpbGUKLSAgICByZXR1cm4gJGNvbnRlbnRzCi19Ci0KLXByb2MgdmVyYm9zZV9ldmFsIHsgZXhwciB7IGxldmVsIDEgfSB9IHsKLSAgICBnbG9iYWwgdmVyYm9zZQotICAgIGlmICR2ZXJib3NlPiRsZXZlbCB0aGVuIHsgZXZhbCB2ZXJib3NlICIkZXhwciIgJGxldmVsIH0KLX0KLQotIyBUaGlzIGRlZmluaXRpb24gaXMgdGFrZW4gZnJvbSBhbiB1bnJlbGVhc2VkIHZlcnNpb24gb2YgRGVqYUdudS4gIE9uY2UKLSMgdGhhdCB2ZXJzaW9uIGdldHMgcmVsZWFzZWQsIGFuZCBoYXMgYmVlbiBvdXQgaW4gdGhlIHdvcmxkIGZvciBhIGZldwotIyBtb250aHMgYXQgbGVhc3QsIGl0IG1heSBiZSBzYWZlIHRvIGRlbGV0ZSB0aGlzIGNvcHkuCi1pZiAhW3N0cmluZyBsZW5ndGggW2luZm8gcHJvYyBwcnVuZV93YXJuaW5nc11dIHsKLSAgICAjCi0gICAgIyBwcnVuZV93YXJuaW5ncyAtLSBkZWxldGUgdmFyaW91cyBzeXN0ZW0gdmVyYm9zaXRpZXMgZnJvbSBURVhULgotICAgICMKLSAgICAjIEFuIGV4YW1wbGUgaXM6Ci0gICAgIyBsZC5zbzogd2FybmluZzogL3Vzci9saWIvbGliYy5zby4xLjguMSBoYXMgb2xkZXIgcmV2aXNpb24gdGhhbiBleHBlY3RlZCA5Ci0gICAgIwotICAgICMgU2l0ZXMgd2l0aCBwYXJ0aWN1bGFyIHZlcmJvc2Ugb3MncyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGluIHNpdGUuZXhwLgotICAgICMKLSAgICBwcm9jIHBydW5lX3dhcm5pbmdzIHsgdGV4dCB9IHsKLQkjIFRoaXMgaXMgZnJvbSBzdW40J3MuICBEbyBpdCBmb3IgYWxsIG1hY2hpbmVzIGZvciBub3cuCi0JIyBUaGUgIlxcMSIgaXMgdG8gdHJ5IHRvIHByZXNlcnZlIGEgIlxuIiBidXQgb25seSBpZiBuZWNlc3NhcnkuCi0JcmVnc3ViIC1hbGwgIihefFxuKShsZC5zbzogd2FybmluZzpcW15cblxdKlxuPykrIiAkdGV4dCAiXFwxIiB0ZXh0Ci0KLQkjIEl0IG1pZ2h0IGJlIHRlbXB0aW5nIHRvIGdldCBjYXJyaWVkIGF3YXkgYW5kIGRlbGV0ZSBibGFuayBsaW5lcywgZXRjLgotCSMgSnVzdCBkZWxldGUgKmV4YWN0bHkqIHdoYXQgd2UncmUgYXNrIHRvLCBhbmQgdGhhdCdzIGl0LgotCXJldHVybiAkdGV4dAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZy5leHAgYi9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGcuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmY3ZjMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIERlZmluZSBnYXMgY2FsbGJhY2tzIGZvciBkZy5leHAuCi0KLWxvYWRfbGliIGRnLmV4cAotCi0jIFRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBzdGlsbCBpbiBhIGJpdCBvZiBmbHV4LgotIyBJdCBzaG91bGQgYmUgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBhc3NlbWJsZSwgbGluaywgYW5kIHJ1biBhIGZpbGUKLSMgYnV0IHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHRoYXQuICBBc3NlbWJsZXIgdGVzdGNhc2VzIGFyZW4ndCB1c3VhbGx5Ci0jIHRoYXQgZWxhYm9yYXRlIGFueXdheS4gIDotKQotCi1wcm9jIGdhcy1kZy10ZXN0IHsgcHJvZyBkb193aGF0IHRvb2xfZmxhZ3MgfSB7Ci0gICAgIyBGSVhNRTogdGhlIGdhcyB0ZXN0c3VpdGUgZG9lc24ndCBkZWZpbmUgdG1wZGlyLiAgVXNlIG91dGRpcj8KLSAgICBzZXQgb3V0cHV0X2ZpbGUgIi4vYS5vdXQiCi0KLSAgICBzd2l0Y2ggJGRvX3doYXQgewotCSJwcmVwcm9jZXNzIiB7Ci0JfQotCSJhc3NlbWJsZSIgewotCX0KLQkibGluayIgewotCX0KLQkicnVuIiB7Ci0JICAgICMgVGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYXJlIGlmIGFuIGV4ZWN1dGFibGUgd2FzCi0JICAgICMgY3JlYXRlZCBvciBub3QuICBJZiBpdCB3YXMsIGRnLmV4cCB3aWxsIHRyeSB0byBydW4gaXQuCi0JICAgIGNhdGNoICJleGVjIHJtIC1mICRvdXRwdXRfZmlsZSIKLQl9Ci0JZGVmYXVsdCB7Ci0JICAgIHBlcnJvciAiJGRvX3doYXQ6IG5vdCBhIHZhbGlkIGRnLWRvIGtleXdvcmQiCi0JICAgIHJldHVybiAiIgotCX0KLSAgICB9Ci0KLSAgICAjIGdhc19zdGFydCBwcmVwZW5kcyAkc3JjZGlyLyRzdWJkaXIgc28gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSBQUk9HCi0gICAgIyBpZiBwcmVzZW50LiAgRmlyc3QgcmVtb3ZlIGV4dHJhbmVvdXMgLy8ncy4KLSAgICBnbG9iYWwgc3JjZGlyIHN1YmRpcgotICAgIHNldCBkaXIgIiRzcmNkaXIvJHN1YmRpciIKLSAgICByZWdzdWIgLWFsbCAiLy8iICRkaXIgIi8iIGRpcgotICAgIHJlZ3N1YiAtYWxsICIvLyIgJHByb2cgIi8iIHByb2cKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIkZGlyLyoiICRwcm9nXSB7Ci0JcmVnc3ViICIkZGlyIiAkcHJvZyAiIiBwcm9nCi0gICAgfQotCi0gICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZ2FzX3N0YXJ0IGJ1dCBpdCBkb2Vzbid0IHNldCBjb21wX291dHB1dC4KLSAgICByZXR1cm4gW2dhc19ydW4gJHByb2cgJHRvb2xfZmxhZ3MgIiJdCi19Ci0KLXByb2MgZ2FzLWRnLXBydW5lIHsgc3lzdGVtIHRleHQgfSB7Ci0gICAgI3NlbmRfdXNlciAiQmVmb3JlOiR0ZXh0XG4iCi0gICAgcmVnc3ViIC1hbGwgIihefFxuKVxbXlxuXF0qOiBBc3NlbWJsZXIgbWVzc2FnZXM6XFteXG5cXSoiICR0ZXh0ICIiIHRleHQKLSAgICByZWdzdWIgLWFsbCAiKF58XG4pXFteXG5cXSo6IEVuZCBvZiBmaWxlIG5vdCBhdCBlbmRcW15cblxdKk5ld2xpbmUgaW5zZXJ0ZWQuIiAkdGV4dCAiIiB0ZXh0Ci0gICAgI3NlbmRfdXNlciAiQWZ0ZXI6JHRleHRcbiIKLQotICAgIHJldHVybiAkdGV4dAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvcnVuIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvcnVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDE1MGY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL3J1bgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1ldmFsIGV4ZWMgJEAKZGlmZiAtLWdpdCBhL2dhcy92bXNjb25mLnNoIGIvZ2FzL3Ztc2NvbmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDUzOGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Ztc2NvbmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyEvYmluL3NoCi0KLWNhdCA8PCAnRU9GJwotJCFtYWtlLWdhcy5jb20KLSQhIFNldCB0aGUgZGVmIGRpciB0byBwcm9wZXIgcGxhY2UgZm9yIHVzZSBpbiBiYXRjaC4gV29ya3MgZm9yIGludGVyYWN0aXZlIHRvLgotJGZsbm0gPSBmJGVudmlyb21lbnQoIlBST0NFRFVSRSIpICAgICAhIGdldCBjdXJyZW50IHByb2NlZHVyZSBuYW1lCi0kc2V0IGRlZmF1bHQgJ2YkcGFyc2UoZmxubSwsLCJERVZJQ0UiKScnZiRwYXJzZShmbG5tLCwsIkRJUkVDVE9SWSIpJwotJHYgPSAnZiR2ZXJpZnkoMCknCi0kIQotJCEJQ29tbWFuZCBmaWxlIHRvIGJ1aWxkIGEgR05VIGFzc2VtYmxlciBvbiBWTVMKLSQhCi0kIQlJZiB5b3UgYXJlIHVzaW5nIGEgdmVyc2lvbiBvZiBHQ0MgdGhhdCBzdXBwb3J0cyBnbG9iYWwgY29uc3RhbnRzCi0kIQl5b3Ugc2hvdWxkIHJlbW92ZSB0aGUgZGVmaW5lPSJjb25zdD0iIGZyb20gdGhlIGdjYyBsaW5lcy4KLSQhCi0kIQlDYXV0aW9uOiAgVmVyc2lvbnMgMS4zOC4xIGFuZCBlYXJsaWVyIGhhZCBhIGJ1ZyBpbiB0aGUgaGFuZGxpbmcgb2YKLSQhCXNvbWUgc3RhdGljIGNvbnN0YW50cy4gSWYgeW91IGFyZSB1c2luZyBzdWNoIGEgdmVyc2lvbiBvZiB0aGUKLSQhCWFzc2VtYmxlciwgYW5kIHlvdSB3aXNoIHRvIGNvbXBpbGUgd2l0aG91dCB0aGUgImNvbnN0PSIgaGFjaywKLSQhCXlvdSBzaG91bGQgZmlyc3QgYnVpbGQgdGhpcyB2ZXJzaW9uICp3aXRoKiB0aGUgImNvbnN0PSIKLSQhCWRlZmluaXRpb24sIGFuZCB0aGVuIHVzZSB0aGF0IGFzc2VtYmxlciB0byByZWJ1aWxkIGl0IHdpdGhvdXQgdGhlCi0kIQkiY29uc3Q9IiBkZWZpbml0aW9uLiAgRmFpbHVyZSB0byBkbyB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIGFzc2VtYmxlcgotJCEJdGhhdCB3aWxsIG11bmcgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotJCEKLSQhCU5vdGU6IFRoZSB2ZXJzaW9uIG9mIGdhcyBzaGlwcGVkIG9uIHRoZSBHQ0MgVk1TIHRhcGVzIGhhcyBiZWVuIHBhdGNoZWQKLSQhCXRvIGZpeCB0aGUgYWJvdmUgbWVudGlvbmVkIGJ1Zy4KLSQhCi0kCSFUaGUgZ2NjLXZtcyBkcml2ZXIgd2FzIG1vZGlmaWVkIHRvIHVzZSBgLTEnIHF1aXRlIHNvbWUgdGltZSBhZ28sCi0kCSFzbyBkb24ndCBlY2hvIHRoaXMgdGV4dCBhbnkgbW9yZS4uLgotJCAhd3JpdGUgc3lzJG91dHB1dCAiSWYgdGhpcyBhc3NlbWJsZXIgaXMgZ29pbmcgdG8gYmUgdXNlZCB3aXRoIEdDQyAxLm4sIHlvdSIKLSQgIXdyaXRlIHN5cyRvdXRwdXQgIm5lZWQgdG8gbW9kaWZ5IHRoZSBkcml2ZXIgdG8gc3VwcGx5IHRoZSAtMSBzd2l0Y2ggdG8gZ2FzLiIKLSQgIXdyaXRlIHN5cyRvdXRwdXQgIlRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBvZiBhIHNtYWxsIGNoYW5nZSBpbiBob3cgZ2xvYmFsIgotJCAhd3JpdGUgc3lzJG91dHB1dCAiY29uc3RhbnQgdmFyaWFibGVzIGFyZSBoYW5kbGVkLiAgRmFpbHVyZSB0byBpbmNsdWRlIHRoaXMiCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJ3aWxsIHJlc3VsdCBpbiBsaW5rZXIgd2FybmluZyBtZXNzYWdlcyBhYm91dCBtaXNtYXRjaGVkCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJwc2VjdCBhdHRyaWJ1dGVzLiIKLSQhCi0kIGdhc19ob3N0PSJ2bXMiCi0kIGFyY2hfaW5keCA9IDEgKyAoKGYkZ2V0c3lpKCJDUFUiKS5nZS4xMjgpLmFuZC4xKQkhIHZheD09MSwgYWxwaGE9PTIKLSQgYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIGlmIGFyY2guZXFzLiJWQVgiCi0kIHRoZW4KLSQgIGNwdV90eXBlPSJ2YXgiCi0kICBvYmpfZm9ybWF0PSJ2bXMiCi0kICBhdG9mPSJ2YXgiCi0kIGVsc2UKLSQgIGNwdV90eXBlPSJhbHBoYSIKLSQgIG9ial9mb3JtYXQ9ImV2YXgiCi0kICBhdG9mPSJpZWVlIgotJCBlbmRpZgotJCBlbXVsYXRpb249ImdlbmVyaWMiCi0kIQotJAlDT1BZCT0gImNvcHkvbm9Mb2ciCi0kIQotJCBDX0RFRlMgOj0iIiJWTVMiIiIKLSQhIENfREVGUyA6PSIiIlZNUyIiIiwiIiJjb25zdD0iIiIKLSQgQ19JTkNMVURFUwk9ICIvSW5jbHVkZT0oW10sWy5jb25maWddLFstLmluY2x1ZGVdLFstLmluY2x1ZGUuYW91dF0pIgotJCBDX0ZMQUdTCT0gIi9ub1ZlcmJvc2UvRGVidWciICsgY19pbmNsdWRlcwotJCEKLSQhCi0kIG9uIGVycm9yIHRoZW4gIGdvdG8gYmFpbAotJCBpZiBmJHNlYXJjaCgiWy0ubGliaWJlcnR5XWxpYmVydHkub2xiIikuZXFzLiIiCi0kIHRoZW4JQFstLmxpYmliZXJ0eV12bXNidWlsZC5jb20KLSQJd3JpdGUgc3lzJG91dHB1dCAiTm93IGJ1aWxkaW5nIGdhcy4iCi0kIGVuZGlmCi0kIGlmICInJ3AxJyIgLmVxcy4gIkxJTksiIHRoZW4gZ290byBMaW5rCi0kIQotJCEgIFRoaXMgaGVscHMgZ2NjIDEubm4gZmluZCB0aGUgYW91dC8qIGZpbGVzLgotJCEKLSQgYW91dF9kZXYgPSBmJHBhcnNlKGZsbm0sLCwiREVWSUNFIikKLSQgdG1wID0gYW91dF9kZXYgLSAiOiIKLSRpZiBmJHRybmxubSh0bXApLm5lcy4iIiB0aGVuIGFvdXRfZGV2ID0gZiR0cm5sbm0odG1wKQotJCBhb3V0X2RpciA9IGFvdXRfZGV2K2YkcGFyc2UoZmxubSwsLCJESVJFQ1RPUlkiKScgLQotCS0gIkdBU10iICsgIklOQ0xVREUuQU9VVC5dIiAtICJdWyIKLSRhc3NpZ24gJ2FvdXRfZGlyJyBhb3V0L3RyYW49Y29uYwotJCBvcGNvZGVfZGlyID0gYW91dF9kZXYrZiRwYXJzZShmbG5tLCwsIkRJUkVDVE9SWSIpJyAtCi0JLSAiR0FTXSIgKyAiSU5DTFVERS5PUENPREUuXSIgLSAiXVsiCi0kYXNzaWduICdvcGNvZGVfZGlyJyBvcGNvZGUvdHJhbj1jb25jCi0kIQotJCBzZXQgdmVyaWZ5Ci0kIQotJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpL09iamVjdD1bXXRjLSdjcHVfdHlwZScub2JqIFsuY29uZmlnXXRjLSdjcHVfdHlwZScuYwotJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpL09iamVjdD1bXW9iai0nb2JqX2Zvcm1hdCcub2JqIFsuY29uZmlnXW9iai0nb2JqX2Zvcm1hdCcuYwotJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpL09iamVjdD1bXWF0b2YtJ2F0b2YnLm9iaiBbLmNvbmZpZ11hdG9mLSdhdG9mJy5jCi1FT0YKLQotY2ZpbGVzPSJgZWNobyAkKiB8IHNlZCAtZSAncy9cLm8vLmMvZycgLWUgJ3MhLi4vXChbXiAvXSpcKS9cKFteIC9dKlwuY1wpIVstLlwxXVwyIWcnYCIKLQotZm9yIGNmaWxlIGluICRjZmlsZXMgOyBkbwotICBjYXNlICRjZmlsZSBpbgotICAgICJbLS4iKikKLQliYXNlPWBlY2hvICRjZmlsZSB8IHNlZCAtZSAncy9cWy4qXF0vLycgLWUgJ3MvXC5jJC8vJ2AKLQllY2hvICJcJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpL09iamVjdD1bXSRiYXNlLm9iaiAkY2ZpbGUiCi0JOzsKLSAgICAqKQotCWVjaG8gIlwkIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykgJGNmaWxlIgotCTs7Ci0gIGVzYWMKLWRvbmUKLQotY2F0IDw8ICdFT0YnCi0kbGluazoKLSQhJ2YkdmVyaWZ5KDApJwotJCBpZiBmJHRybmxubSgiSUZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGlmaWxlJAotJCBjcmVhdGUgZ2NjLWFzLm9wdAotIQotIQlMaW5rZXIgb3B0aW9ucyBmaWxlIGZvciBHTlUgYXNzZW1ibGVyCi0hCi0kIG9wZW4vQXBwZW5kIGlmaWxlJCBnY2MtYXMub3B0Ci0kIHdyaXRlIGlmaWxlJCAidGMtJydjcHVfdHlwZScub2JqIgotJCB3cml0ZSBpZmlsZSQgIm9iai0nJ29ial9mb3JtYXQnLm9iaiIKLSQgd3JpdGUgaWZpbGUkICJhdG9mLScnYXRvZicub2JqIgotJCBDT1BZIHN5cyRpbnB1dDogaWZpbGUkOgotRU9GCi0KLWZvciBvYmogaW4gJCogOyBkbwotICAjIENoYW5nZSAiZm9vLm8iIGludG8gImZvby5vYmoiLgotICBlY2hvICR7b2JqfWJqLC0gfCBzZWQgJ3MhLiovISFnJwotZG9uZQotCi1jYXQgPDwgJ0VPRicKLVstLmxpYmliZXJ0eV1saWJlcnR5Lm9sYi9MaWIKLWdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvTGliLHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL0xpYgotISBUZWxsIGxpbmtlciBleGFjdGx5IHdoYXQgcHNlY3QgYXR0cmlidXRlcyB3ZSB3YW50IC0tIG1hdGNoIFZBWENSVEwuCi1wc2VjdF9hdHRyPUVOVklST04sbG9uZyxwaWMsb3ZyLHJlbCxnYmwsbm9zaHIsbm9leGUscmQsd3J0Ci0kIGNsb3NlIGlmaWxlJAotJCBzZXQgdmVyaWZ5PShQcm9jLG5vSW1hZykKLSQgbGluay9ub01hcC9FeGVjPWdjYy1hcy5leGUgZ2NjLWFzLm9wdC9PcHQsdmVyc2lvbi5vcHQvT3B0Ci0kIQotJGJhaWw6IGV4aXQgJHN0YXR1cyArIDAqZiR2ZXJpZnkodikJISdmJHZlcmlmeSgwKScKLUVPRgpkaWZmIC0tZ2l0IGEvZ2FzL3dyaXRlLmMgYi9nYXMvd3JpdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhOWFjNi4uMDAwMDAwMAotLS0gYS9nYXMvd3JpdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NzcgKzAsMCBAQAotLyogd3JpdGUuYyAtIGVtaXQgLm8gZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTg2LCA4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgdGhpbmcgc2hvdWxkIGJlIHNldCB1cCB0byBkbyBieXRlb3JkZXJpbmcgY29ycmVjdGx5LiAgQnV0Li4uICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLQotLyogVGhpcyBsb29rcyBsaWtlIGEgZ29vZCBpZGVhLiAgTGV0J3MgdHJ5IHR1cm5pbmcgaXQgb24gYWx3YXlzLCBmb3Igbm93LiAgKi8KLSN1bmRlZiAgQkZEX0ZBU1RfU0VDVElPTl9GSUxMCi0jZGVmaW5lIEJGRF9GQVNUX1NFQ1RJT05fRklMTAotCi0vKiBUaGUgTk9QX09QQ09ERSBpcyBmb3IgdGhlIGFsaWdubWVudCBmaWxsIHZhbHVlLiAgRmlsbCBpdCB3aXRoIGEgbm9wCi0gICBpbnN0cnVjdGlvbiBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgZG9lcyBub3QgY2hva2Ugb24gaXQuICAqLwotI2lmbmRlZiBOT1BfT1BDT0RFCi0jZGVmaW5lIE5PUF9PUENPREUgMHgwMAotI2VuZGlmCi0KLSNpZm5kZWYgVENfQURKVVNUX1JFTE9DX0NPVU5UCi0jZGVmaW5lIFRDX0FESlVTVF9SRUxPQ19DT1VOVChGSVhQLENPVU5UKQotI2VuZGlmCi0KLSNpZm5kZWYgVENfRk9SQ0VfUkVMT0NBVElPTgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApIDAKLSNlbmRpZgotCi0jaWZuZGVmIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04oRklYUCxTRUcpIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkKLSNlbmRpZgotCi0jaWZuZGVmCU1EX1BDUkVMX0ZST01fU0VDVElPTgotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tKEZJWFApCi0jZW5kaWYKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1leHRlcm4gQ09OU1QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLWV4dGVybiBDT05TVCBpbnQgbWRfbG9uZ19qdW1wX3NpemU7Ci0jZW5kaWYKLQotaW50IHN5bWJvbF90YWJsZV9mcm96ZW47Ci12b2lkIHByaW50X2ZpeHVwIFBBUkFNUyAoKGZpeFMgKikpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQgcmVudW1iZXJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBXZSBnZW5lcmFsbHkgYXR0YWNoIHJlbG9jcyB0byBmcmFnIGNoYWlucy4gIEhvd2V2ZXIsIGFmdGVyIHdlIGhhdmUKLSAgIGNoYWluZWQgdGhlc2UgYWxsIHRvZ2V0aGVyIGludG8gYSBzZWdtZW50LCBhbnkgcmVsb2NzIHdlIGFkZCBhZnRlcgotICAgdGhhdCBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgc2VnbWVudC4gIFRoaXMgd2lsbCBpbmNsdWRlIHJlbG9jcyBhZGRlZAotICAgaW4gbWRfZXN0aW1hdGVfc2l6ZV9mb3JfcmVsYXgsIGZvciBleGFtcGxlLiAgKi8KLXN0YXRpYyBpbnQgZnJhZ3NfY2hhaW5lZCA9IDA7Ci0jZW5kaWYKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZm5kZWYgTUFOWV9TRUdNRU5UUwotc3RydWN0IGZyYWcgKnRleHRfZnJhZ19yb290Owotc3RydWN0IGZyYWcgKmRhdGFfZnJhZ19yb290Owotc3RydWN0IGZyYWcgKmJzc19mcmFnX3Jvb3Q7Ci0KLXN0cnVjdCBmcmFnICp0ZXh0X2xhc3RfZnJhZzsJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi1zdHJ1Y3QgZnJhZyAqZGF0YV9sYXN0X2ZyYWc7CS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotc3RhdGljIHN0cnVjdCBmcmFnICpic3NfbGFzdF9mcmFnOwkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLSNlbmRpZgotCi0jaWZuZGVmIEJGRAotc3RhdGljIG9iamVjdF9oZWFkZXJzIGhlYWRlcnM7Ci0jZW5kaWYKLQotbG9uZyBzdHJpbmdfYnl0ZV9jb3VudDsKLWNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7CS8qIFRyYWNrcyBvYmplY3QgZmlsZSBieXRlcy4gKi8KLQotI2lmbmRlZiBPQkpfVk1TCi1pbnQgbWFnaWNfbnVtYmVyX2Zvcl9vYmplY3RfZmlsZSA9IERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRTsKLSNlbmRpZgotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgaW50IG5fZml4dXBzOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIGZpeFMgKmZpeF9uZXdfaW50ZXJuYWwgUEFSQU1TICgoZnJhZ1MgKiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwKLQkJCQkgICAgICAgc3ltYm9sUyAqYWRkLCBzeW1ib2xTICpzdWIsCi0JCQkJICAgICAgIG9mZnNldFQgb2Zmc2V0LCBpbnQgcGNyZWwsCi0JCQkJICAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGUpKTsKLSNlbHNlCi1zdGF0aWMgZml4UyAqZml4X25ld19pbnRlcm5hbCBQQVJBTVMgKChmcmFnUyAqLCBpbnQgd2hlcmUsIGludCBzaXplLAotCQkJCSAgICAgICBzeW1ib2xTICphZGQsIHN5bWJvbFMgKnN1YiwKLQkJCQkgICAgICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwKLQkJCQkgICAgICAgaW50IHJfdHlwZSkpOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkKLXN0YXRpYyBsb25nIGZpeHVwX3NlZ21lbnQgUEFSQU1TICgoZml4UyAqIGZpeFAsIHNlZ1QgdGhpc19zZWdtZW50X3R5cGUpKTsKLSNlbmRpZgotc3RhdGljIHJlbGF4X2FkZHJlc3NUIHJlbGF4X2FsaWduIFBBUkFNUyAoKHJlbGF4X2FkZHJlc3NUIGFkZHIsIGludCBhbGlnbikpOwotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICEgZGVmaW5lZCAoQkZEKQotc3RhdGljIGZyYWdTICpjaGFpbl9mcmNoYWluc190b2dldGhlcl8xIFBBUkFNUyAoKHNlZ1QsIHN0cnVjdCBmcmNoYWluICopKTsKLSNlbmRpZgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkIGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBQVFIpKTsKLXN0YXRpYyB2b2lkIGN2dF9mcmFnX3RvX2ZpbGwgUEFSQU1TICgoc2VnVCwgZnJhZ1MgKikpOwotc3RhdGljIHZvaWQgcmVsYXhfYW5kX3NpemVfc2VnIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGFkanVzdF9yZWxvY19zeW1zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBzZXRfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICghIGRlZmluZWQgKEJGRCkgJiYgISBkZWZpbmVkIChPQkpfQU9VVCkpCi1zdGF0aWMgdm9pZCBtZXJnZV9kYXRhX2ludG9fdGV4dCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLSNpZiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICEgZGVmaW5lZCAoQkZEKQotc3RhdGljIHZvaWQgY3Z0X2ZyYWdfdG9fZmlsbCBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqLCBzZWdULCBmcmFnUyAqKSk7Ci1zdGF0aWMgdm9pZCByZW1vdmVfc3Vic2VncyBQQVJBTVMgKChmcmNoYWluUyAqLCBpbnQsIGZyYWdTICoqLCBmcmFnUyAqKikpOwotc3RhdGljIHZvaWQgcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0vKgotICoJCQlmaXhfbmV3KCkKLSAqCi0gKiBDcmVhdGUgYSBmaXhTIGluIG9ic3RhY2sgJ25vdGVzJy4KLSAqLwotc3RhdGljIGZpeFMgKgotZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIHN1Yl9zeW1ib2wsIG9mZnNldCwgcGNyZWwsCi0JCSAgcl90eXBlKQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsJLyogWF9hZGRfc3ltYm9sLiAqLwotICAgICBzeW1ib2xTICpzdWJfc3ltYm9sOwkvKiBYX29wX3N5bWJvbC4gKi8KLSAgICAgb2Zmc2V0VCBvZmZzZXQ7CQkvKiBYX2FkZF9udW1iZXIuICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOyAvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbHNlCi0gICAgIGludCByX3R5cGU7CQkvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbmRpZgotewotICBmaXhTICpmaXhQOwotCi0gIG5fZml4dXBzKys7Ci0KLSAgZml4UCA9IChmaXhTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChmaXhTKSk7Ci0KLSAgZml4UC0+ZnhfZnJhZyA9IGZyYWc7Ci0gIGZpeFAtPmZ4X3doZXJlID0gd2hlcmU7Ci0gIGZpeFAtPmZ4X3NpemUgPSBzaXplOwotICAvKiBXZSd2ZSBtYWRlIGZ4X3NpemUgYSBuYXJyb3cgZmllbGQ7IGNoZWNrIHRoYXQgaXQncyB3aWRlIGVub3VnaC4gICovCi0gIGlmIChmaXhQLT5meF9zaXplICE9IHNpemUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJmaWVsZCBmeF9zaXplIHRvbyBzbWFsbCB0byBob2xkICVkIiksIHNpemUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2w7Ci0gIGZpeFAtPmZ4X3N1YnN5ID0gc3ViX3N5bWJvbDsKLSAgZml4UC0+Znhfb2Zmc2V0ID0gb2Zmc2V0OwotICBmaXhQLT5meF9wY3JlbCA9IHBjcmVsOwotICBmaXhQLT5meF9wbHQgPSAwOwotI2lmIGRlZmluZWQoTkVFRF9GWF9SX1RZUEUpIHx8IGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGZpeFAtPmZ4X3JfdHlwZSA9IHJfdHlwZTsKLSNlbmRpZgotICBmaXhQLT5meF9pbV9kaXNwID0gMDsKLSAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMDsKLSAgZml4UC0+ZnhfYml0X2ZpeFAgPSAwOwotICBmaXhQLT5meF9hZGRudW1iZXIgPSAwOwotICBmaXhQLT5meF90Y2JpdCA9IDA7Ci0gIGZpeFAtPmZ4X2RvbmUgPSAwOwotICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDA7Ci0gIGZpeFAtPmZ4X3NpZ25lZCA9IDA7Ci0KLSNpZmRlZiBVU0lOR19DR0VOCi0gIGZpeFAtPmZ4X2NnZW4uaW5zbiA9IE5VTEw7Ci0gIGZpeFAtPmZ4X2NnZW4ub3BpbmZvID0gMDsKLSNlbmRpZgotCi0jaWZkZWYgVENfRklYX1RZUEUKLSAgVENfSU5JVF9GSVhfREFUQShmaXhQKTsKLSNlbmRpZgotCi0gIGFzX3doZXJlICgmZml4UC0+ZnhfZmlsZSwgJmZpeFAtPmZ4X2xpbmUpOwotCi0gIC8qIFVzdWFsbHksIHdlIHdhbnQgcmVsb2NzIHNvcnRlZCBudW1lcmljYWxseSwgYnV0IHdoaWxlCi0gICAgIGNvbXBhcmluZyB0byBvbGRlciB2ZXJzaW9ucyBvZiBnYXMgdGhhdCBoYXZlIHJlbG9jcwotICAgICByZXZlcnNlIHNvcnRlZCwgaXQgaXMgY29udmVuaWVudCB0byBoYXZlIHRoaXMgY29tcGlsZQotICAgICB0aW1lIG9wdGlvbi4gIHhveG9yaWNoLiAqLwotCi0gIHsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICBmaXhTICoqc2VnX2ZpeF9yb290UCA9IChmcmFnc19jaGFpbmVkCi0JCQkgICAgPyAmc2VnX2luZm8gKG5vd19zZWcpLT5maXhfcm9vdAotCQkJICAgIDogJmZyY2hhaW5fbm93LT5maXhfcm9vdCk7Ci0gICAgZml4UyAqKnNlZ19maXhfdGFpbFAgPSAoZnJhZ3NfY2hhaW5lZAotCQkJICAgID8gJnNlZ19pbmZvIChub3dfc2VnKS0+Zml4X3RhaWwKLQkJCSAgICA6ICZmcmNoYWluX25vdy0+Zml4X3RhaWwpOwotI2VuZGlmCi0KLSNpZmRlZiBSRVZFUlNFX1NPUlRfUkVMT0NTCi0KLSAgICBmaXhQLT5meF9uZXh0ID0gKnNlZ19maXhfcm9vdFA7Ci0gICAgKnNlZ19maXhfcm9vdFAgPSBmaXhQOwotCi0jZWxzZSAvKiBSRVZFUlNFX1NPUlRfUkVMT0NTICovCi0KLSAgICBmaXhQLT5meF9uZXh0ID0gTlVMTDsKLQotICAgIGlmICgqc2VnX2ZpeF90YWlsUCkKLSAgICAgICgqc2VnX2ZpeF90YWlsUCktPmZ4X25leHQgPSBmaXhQOwotICAgIGVsc2UKLSAgICAgICpzZWdfZml4X3Jvb3RQID0gZml4UDsKLSAgICAqc2VnX2ZpeF90YWlsUCA9IGZpeFA7Ci0KLSNlbmRpZiAvKiBSRVZFUlNFX1NPUlRfUkVMT0NTICovCi0KLSAgfQotCi0gIHJldHVybiBmaXhQOwotfQotCi0vKiBDcmVhdGUgYSBmaXh1cCByZWxhdGl2ZSB0byBhIHN5bWJvbCAocGx1cyBhIGNvbnN0YW50KS4gICovCi0KLWZpeFMgKgotZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgcGNyZWwsIHJfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyLCBvciA0IHVzdWFsbHkuICovCi0gICAgIHN5bWJvbFMgKmFkZF9zeW1ib2w7CS8qIFhfYWRkX3N5bWJvbC4gKi8KLSAgICAgb2Zmc2V0VCBvZmZzZXQ7CQkvKiBYX2FkZF9udW1iZXIuICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOyAvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbHNlCi0gICAgIGludCByX3R5cGU7CQkvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbmRpZgotewotICByZXR1cm4gZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsCi0JCQkgICAoc3ltYm9sUyAqKSBOVUxMLCBvZmZzZXQsIHBjcmVsLCByX3R5cGUpOwotfQotCi0vKiBDcmVhdGUgYSBmaXh1cCBmb3IgYW4gZXhwcmVzc2lvbi4gIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgZml4dXBzCi0gICBmb3IgZGlmZmVyZW5jZSBleHByZXNzaW9ucy4gIFRoYXQgaXMgaXRzZWxmIG1vcmUgdGhhbiBtb3N0IG9iamVjdAotICAgZmlsZSBmb3JtYXRzIHN1cHBvcnQgYW55aG93LiAgKi8KLQotZml4UyAqCi1maXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsIHJfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyLCBvciA0IHVzdWFsbHkuICovCi0gICAgIGV4cHJlc3Npb25TICpleHA7CQkvKiBFeHByZXNzaW9uLiAgKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2Vsc2UKLSAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2VuZGlmCi17Ci0gIHN5bWJvbFMgKmFkZCA9IE5VTEw7Ci0gIHN5bWJvbFMgKnN1YiA9IE5VTEw7Ci0gIG9mZnNldFQgb2ZmID0gMDsKLQotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2FkZDoKLSAgICAgIC8qIFRoaXMgY29tZXMgdXAgd2hlbiBfR0xPQkFMX09GRlNFVF9UQUJMRV8rKC4tTDApIGlzIHJlYWQsIGlmCi0JIHRoZSBkaWZmZXJlbmNlIGV4cHJlc3Npb24gY2Fubm90IGltbWVkaWF0ZWx5IGJlIHJlZHVjZWQuICAqLwotICAgICAgewotCXN5bWJvbFMgKnN0bXAgPSBtYWtlX2V4cHJfc3ltYm9sIChleHApOwotCWV4cC0+WF9vcCA9IE9fc3ltYm9sOwotCWV4cC0+WF9vcF9zeW1ib2wgPSAwOwotCWV4cC0+WF9hZGRfc3ltYm9sID0gc3RtcDsKLQlleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JcmV0dXJuIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwgcl90eXBlKTsKLSAgICAgIH0KLQotICAgIGNhc2UgT19zeW1ib2xfcnZhOgotICAgICAgYWRkID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0gICAgICBvZmYgPSBleHAtPlhfYWRkX251bWJlcjsKLQotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikKLSAgICAgIHJfdHlwZSA9IEJGRF9SRUxPQ19SVkE7Ci0jZWxzZQotI2lmIGRlZmluZWQoVENfUlZBX1JFTE9DKQotICAgICAgcl90eXBlID0gVENfUlZBX1JFTE9DOwotI2Vsc2UKLSAgICAgIGFzX2ZhdGFsKF8oInJ2YSBub3Qgc3VwcG9ydGVkIikpOwotI2VuZGlmCi0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3VtaW51czoKLSAgICAgIHN1YiA9IGV4cC0+WF9hZGRfc3ltYm9sOwotICAgICAgb2ZmID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIHN1YiA9IGV4cC0+WF9vcF9zeW1ib2w7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBhZGQgPSBleHAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICAqLwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIG9mZiA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWRkID0gbWFrZV9leHByX3N5bWJvbCAoZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZCwgc3ViLCBvZmYsCi0JCQkgICBwY3JlbCwgcl90eXBlKTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIG9udG8gYW5vdGhlciBzdHJpbmcsIGJ1bXBpbmcgdGhlIHBvaW50ZXIgYWxvbmcuICAqLwotdm9pZAotYXBwZW5kIChjaGFyUFAsIGZyb21QLCBsZW5ndGgpCi0gICAgIGNoYXIgKipjaGFyUFA7Ci0gICAgIGNoYXIgKmZyb21QOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLXsKLSAgLyogRG9uJ3QgdHJ1c3QgbWVtY3B5KCkgb2YgMCBjaGFycy4gKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybjsKLQotICBtZW1jcHkgKCpjaGFyUFAsIGZyb21QLCBsZW5ndGgpOwotICAqY2hhclBQICs9IGxlbmd0aDsKLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQgc2VjdGlvbl9hbGlnbm1lbnRbU0VHX01BWElNVU1fT1JESU5BTF07Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgcm91dGluZSByZWNvcmRzIHRoZSBsYXJnZXN0IGFsaWdubWVudCBzZWVuIGZvciBlYWNoIHNlZ21lbnQuCi0gKiBJZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50IGlzIGFsaWduZWQgb24gdGhlIHdvcnN0LWNhc2UKLSAqIGJvdW5kYXJ5LCBhbGwgb2YgdGhlIG90aGVyIGFsaWdubWVudHMgd2l0aGluIGl0IHdpbGwgd29yay4gIEF0Ci0gKiBsZWFzdCBvbmUgb2JqZWN0IGZvcm1hdCByZWFsbHkgdXNlcyB0aGlzIGluZm8uCi0gKi8KLXZvaWQKLXJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pCi0gICAgIC8qIFNlZ21lbnQgdG8gd2hpY2ggYWxpZ25tZW50IHBlcnRhaW5zICovCi0gICAgIHNlZ1Qgc2VnOwotICAgICAvKiBBbGlnbm1lbnQsIGFzIGEgcG93ZXIgb2YgMiAoZS5nLiwgMSA9PiAyLWJ5dGUgYm91bmRhcnksIDIgPT4gNC1ieXRlCi0JYm91bmRhcnksIGV0Yy4pICAqLwotICAgICBpbnQgYWxpZ247Ci17Ci0gIGlmIChzZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm47Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoKHVuc2lnbmVkIGludCkgYWxpZ24gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZykpCi0gICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIGFsaWduKTsKLSNlbHNlCi0gIGlmIChhbGlnbiA+IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pCi0gICAgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSA9IGFsaWduOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFJlc2V0IHRoZSBzZWN0aW9uIGluZGljZXMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdhcyBjcmVhdGVkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlbnVtYmVyX3NlY3Rpb25zIChhYmZkLCBzZWMsIGNvdW50cGFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgY291bnRwYXJnOwotewotICBpbnQgKmNvdW50cCA9IChpbnQgKikgY291bnRwYXJnOwotCi0gIHNlYy0+aW5kZXggPSAqY291bnRwOwotICArKypjb3VudHA7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgISBkZWZpbmVkIChCRkQpCi0KLXN0YXRpYyBmcmFnUyAqCi1jaGFpbl9mcmNoYWluc190b2dldGhlcl8xIChzZWN0aW9uLCBmcmNocCkKLSAgICAgc2VnVCBzZWN0aW9uOwotICAgICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaHA7Ci17Ci0gIGZyYWdTIGR1bW15LCAqcHJldl9mcmFnID0gJmR1bW15OwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZml4UyBmaXhfZHVtbXksICpwcmV2X2ZpeCA9ICZmaXhfZHVtbXk7Ci0jZW5kaWYKLQotICBmb3IgKDsgZnJjaHAgJiYgZnJjaHAtPmZyY2hfc2VnID09IHNlY3Rpb247IGZyY2hwID0gZnJjaHAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBwcmV2X2ZyYWctPmZyX25leHQgPSBmcmNocC0+ZnJjaF9yb290OwotICAgICAgcHJldl9mcmFnID0gZnJjaHAtPmZyY2hfbGFzdDsKLSAgICAgIGFzc2VydCAocHJldl9mcmFnLT5mcl90eXBlICE9IDApOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmIChmcmNocC0+Zml4X3Jvb3QgIT0gKGZpeFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoc2VnX2luZm8gKHNlY3Rpb24pLT5maXhfcm9vdCA9PSAoZml4UyAqKSBOVUxMKQotCSAgICBzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF9yb290ID0gZnJjaHAtPmZpeF9yb290OwotCSAgcHJldl9maXgtPmZ4X25leHQgPSBmcmNocC0+Zml4X3Jvb3Q7Ci0JICBzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF90YWlsID0gZnJjaHAtPmZpeF90YWlsOwotCSAgcHJldl9maXggPSBmcmNocC0+Zml4X3RhaWw7Ci0JfQotI2VuZGlmCi0gICAgfQotICBhc3NlcnQgKHByZXZfZnJhZy0+ZnJfdHlwZSAhPSAwKTsKLSAgcHJldl9mcmFnLT5mcl9uZXh0ID0gMDsKLSAgcmV0dXJuIHByZXZfZnJhZzsKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXN0YXRpYyB2b2lkCi1jaGFpbl9mcmNoYWluc190b2dldGhlciAoYWJmZCwgc2VjdGlvbiwgeHh4KQotICAgICBiZmQgKmFiZmQ7CQkJLyogdW51c2VkICovCi0gICAgIHNlZ1Qgc2VjdGlvbjsKLSAgICAgUFRSIHh4eDsJCQkvKiB1bnVzZWQgKi8KLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKmluZm87Ci0KLSAgLyogQkZEIG1heSBoYXZlIGludHJvZHVjZWQgaXRzIG93biBzZWN0aW9ucyB3aXRob3V0IHVzaW5nCi0gICAgIHN1YnNlZ19uZXcsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgc2VnX2luZm8gaXMgTlVMTC4gICovCi0gIGluZm8gPSBzZWdfaW5mbyAoc2VjdGlvbik7Ci0gIGlmIChpbmZvICE9IChzZWdtZW50X2luZm9fdHlwZSAqKSBOVUxMKQotICAgaW5mby0+ZnJjaGFpblAtPmZyY2hfbGFzdAotICAgICA9IGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlY3Rpb24sIGluZm8tPmZyY2hhaW5QKTsKLQotICAvKiBOb3cgdGhhdCB3ZSd2ZSBjaGFpbmVkIHRoZSBmcmFncyB0b2dldGhlciwgd2UgbXVzdCBhZGQgbmV3IGZpeHVwcwotICAgICB0byB0aGUgc2VnbWVudCwgbm90IHRvIHRoZSBmcmFnIGNoYWluLiAgKi8KLSAgZnJhZ3NfY2hhaW5lZCA9IDE7Ci19Ci0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfc3Vic2VncyAoaGVhZCwgc2VnLCByb290LCBsYXN0KQotICAgICBmcmNoYWluUyAqaGVhZDsKLSAgICAgaW50IHNlZzsKLSAgICAgZnJhZ1MgKipyb290OwotICAgICBmcmFnUyAqKmxhc3Q7Ci17Ci0gICpyb290ID0gaGVhZC0+ZnJjaF9yb290OwotICAqbGFzdCA9IGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlZywgaGVhZCk7Ci19Ci0KLSNlbmRpZiAvKiBCRkQgKi8KLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZAotY3Z0X2ZyYWdfdG9fZmlsbCAoc2VjLCBmcmFnUCkKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbHNlCi1zdGF0aWMgdm9pZAotY3Z0X2ZyYWdfdG9fZmlsbCAoaGVhZGVyc1AsIHNlYywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzUDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICBzd2l0Y2ggKGZyYWdQLT5mcl90eXBlKQotICAgIHsKLSAgICBjYXNlIHJzX2FsaWduOgotICAgIGNhc2UgcnNfYWxpZ25fY29kZToKLSAgICBjYXNlIHJzX29yZzoKLSAgICBjYXNlIHJzX3NwYWNlOgotI2lmZGVmIEhBTkRMRV9BTElHTgotICAgICAgSEFORExFX0FMSUdOIChmcmFnUCk7Ci0jZW5kaWYKLSAgICAgIGtub3cgKGZyYWdQLT5mcl9uZXh0ICE9IE5VTEwpOwotICAgICAgZnJhZ1AtPmZyX29mZnNldCA9IChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwotCQkJICAtIGZyYWdQLT5mcl9hZGRyZXNzCi0JCQkgIC0gZnJhZ1AtPmZyX2ZpeCkgLyBmcmFnUC0+ZnJfdmFyOwotICAgICAgaWYgKGZyYWdQLT5mcl9vZmZzZXQgPCAwKQotCXsKLQkgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byAub3JnLy5zcGFjZSBiYWNrd2FyZHM/ICglbGQpIiksCi0JCSAgKGxvbmcpIGZyYWdQLT5mcl9vZmZzZXQpOwotCX0KLSAgICAgIGZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByc19maWxsOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHJzX2xlYjEyODoKLSAgICAgIHsKLQl2YWx1ZVQgdmFsdWUgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0JaW50IHNpemU7Ci0KLQlzaXplID0gb3V0cHV0X2xlYjEyOCAoZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LCB2YWx1ZSwKLQkJCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQotCWZyYWdQLT5mcl9maXggKz0gc2l6ZTsKLQlmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0JZnJhZ1AtPmZyX29mZnNldCA9IDA7Ci0JZnJhZ1AtPmZyX3N5bWJvbCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfY2ZhOgotICAgICAgZWhfZnJhbWVfY29udmVydF9mcmFnIChmcmFnUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbWRfY29udmVydF9mcmFnIChzdGRvdXRwdXQsIHNlYywgZnJhZ1ApOwotI2Vsc2UKLSAgICAgIG1kX2NvbnZlcnRfZnJhZyAoaGVhZGVyc1AsIHNlYywgZnJhZ1ApOwotI2VuZGlmCi0KLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX25leHQgPT0gTlVMTAotCSAgICAgIHx8ICgob2Zmc2V0VCkgKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ1AtPmZyX2FkZHJlc3MpCi0JCSAgPT0gZnJhZ1AtPmZyX2ZpeCkpOwotCi0gICAgICAvKgotICAgICAgICogQWZ0ZXIgbWRfY29udmVydF9mcmFnLCB3ZSBtYWtlIHRoZSBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICAgICAgICogTWRfY29udmVydF9mcmFnKCkgc2hvdWxkIHNldCB1cCBhbnkgZml4U3MgYW5kIGNvbnN0YW50cwotICAgICAgICogcmVxdWlyZWQuCi0gICAgICAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotICAgICAgYnJlYWs7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICAgIGNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0gICAgICB7Ci0Jc3RydWN0IGJyb2tlbl93b3JkICpsaWU7Ci0KLQlpZiAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCSAgICBmb3IgKGxpZSA9IChzdHJ1Y3QgYnJva2VuX3dvcmQgKikgKGZyYWdQLT5mcl9zeW1ib2wpOwotCQkgbGllICYmIGxpZS0+ZGlzcGZyYWcgPT0gZnJhZ1A7Ci0JCSBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0JICAgICAgaWYgKGxpZS0+YWRkZWQgPT0gMSkKLQkJZnJhZ1AtPmZyX2ZpeCArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkgIH0KLQlmcmFnX3dhbmUgKGZyYWdQKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZAotcmVsYXhfYW5kX3NpemVfc2VnIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBmbGFnd29yZCBmbGFnczsKLSAgZnJhZ1MgKmZyYWdwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgaW50IHg7Ci0gIHZhbHVlVCBzaXplLCBuZXdzaXplOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0KLSAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYyk7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBpZiAoc2VnaW5mbyAmJiBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICB7Ci0gICAgICByZWxheF9zZWdtZW50IChzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290LCBzZWMpOwotICAgICAgZm9yIChmcmFncCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7IGZyYWdwOyBmcmFncCA9IGZyYWdwLT5mcl9uZXh0KQotCWN2dF9mcmFnX3RvX2ZpbGwgKHNlYywgZnJhZ3ApOwotICAgICAgZm9yIChmcmFncCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0JICAgZnJhZ3AtPmZyX25leHQ7Ci0JICAgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dCkKLQkvKiB3YWxrIHRvIGxhc3QgZWx0ICovOwotICAgICAgc2l6ZSA9IGZyYWdwLT5mcl9hZGRyZXNzICsgZnJhZ3AtPmZyX2ZpeDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzaXplID0gMDsKLQotICBpZiAoc2l6ZSA+IDAgJiYgISBzZWdpbmZvLT5ic3MpCi0gICAgZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotICAvKiBAQCBUaGlzIGlzIGp1c3QgYW4gYXBwcm94aW1hdGlvbi4gICovCi0gIGlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZpeF9yb290KQotICAgIGZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgZWxzZQotICAgIGZsYWdzICY9IH5TRUNfUkVMT0M7Ci0gIHggPSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpOwotICBhc3NlcnQgKHggPT0gdHJ1ZSk7Ci0KLSAgbmV3c2l6ZSA9IG1kX3NlY3Rpb25fYWxpZ24gKHNlYywgc2l6ZSk7Ci0gIHggPSBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBuZXdzaXplKTsKLSAgYXNzZXJ0ICh4ID09IHRydWUpOwotCi0gIC8qIElmIHRoZSBzaXplIGhhZCB0byBiZSByb3VuZGVkIHVwLCBhZGQgc29tZSBwYWRkaW5nIGluIHRoZSBsYXN0Ci0gICAgIG5vbi1lbXB0eSBmcmFnLiAgKi8KLSAgYXNzZXJ0IChuZXdzaXplID49IHNpemUpOwotICBpZiAoc2l6ZSAhPSBuZXdzaXplKQotICAgIHsKLSAgICAgIGZyYWdTICpsYXN0ID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfbGFzdDsKLSAgICAgIGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgICAgIHdoaWxlIChmcmFncC0+ZnJfbmV4dCAhPSBsYXN0KQotCWZyYWdwID0gZnJhZ3AtPmZyX25leHQ7Ci0gICAgICBsYXN0LT5mcl9hZGRyZXNzID0gc2l6ZTsKLSAgICAgIGZyYWdwLT5mcl9vZmZzZXQgKz0gbmV3c2l6ZSAtIHNpemU7Ci0gICAgfQotCi0jaWZkZWYgdGNfZnJvYl9zZWN0aW9uCi0gIHRjX2Zyb2Jfc2VjdGlvbiAoc2VjKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX3NlY3Rpb24KLSAgb2JqX2Zyb2Jfc2VjdGlvbiAoc2VjKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgREVCVUcyCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX3JlbG9jcyAoYWJmZCwgc2VjLCBzdHJlYW1fKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNoYXIgKnN0cmVhbV87Ci17Ci0gIEZJTEUgKnN0cmVhbSA9IChGSUxFICopIHN0cmVhbV87Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGZpeFMgKmZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsKLQotICBpZiAoIWZpeHApCi0gICAgcmV0dXJuOwotCi0gIGZwcmludGYgKHN0cmVhbSwgInNlYyAlcyByZWxvY3M6XG4iLCBzZWMtPm5hbWUpOwotICB3aGlsZSAoZml4cCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzID0gZml4cC0+ZnhfYWRkc3k7Ci0gICAgICBpZiAocykKLQl7Ci0JICBmcHJpbnRmIChzdHJlYW0sICIgICUwOHg6ICVzKCVzIiwgZml4cCwgU19HRVRfTkFNRSAocyksCi0JCSAgIHMtPmJzeW0tPnNlY3Rpb24tPm5hbWUpOwotCSAgaWYgKHMtPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RyZWFtLCAiIHNlY3Rpb24gc3ltIik7Ci0JICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzKSkKLQkJZnByaW50ZiAoc3RyZWFtLCAiKyV4IiwgU19HRVRfVkFMVUUgKHMpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcHJpbnRmIChzdHJlYW0sICIrJXgiLCBTX0dFVF9WQUxVRSAocykpOwotCSAgZnByaW50ZiAoc3RyZWFtLCAiKSsleFxuIiwgZml4cC0+Znhfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RyZWFtLCAiICAlMDh4OiB0eXBlICVkIG5vIHN5bVxuIiwgZml4cCwgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIGZpeHAgPSBmaXhwLT5meF9uZXh0OwotICAgIH0KLX0KLSNlbHNlCi0jZGVmaW5lIGR1bXBfc2VjdGlvbl9yZWxvY3MoQUJGRCxTRUMsU1RSRUFNKQkoKHZvaWQpIDApCi0jZW5kaWYKLQotI2lmbmRlZiBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUyAxCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWFkanVzdF9yZWxvY19zeW1zIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBmaXhTICpmaXhwOwotCi0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGR1bXBfc2VjdGlvbl9yZWxvY3MgKGFiZmQsIHNlYywgc3RkZXJyKTsKLQotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0gICAgICAvKiBpZ25vcmUgaXQgKi87Ci0gICAgZWxzZSBpZiAoZml4cC0+ZnhfYWRkc3kpCi0gICAgICB7Ci0Jc3ltYm9sUyAqc3ltOwotCWFzZWN0aW9uICpzeW1zZWM7Ci0KLSNpZmRlZiBERUJVRzUKLQlmcHJpbnRmIChzdGRlcnIsICJcblxuYWRqdXN0aW5nIGZpeHVwOlxuIik7Ci0JcHJpbnRfZml4dXAgKGZpeHApOwotI2VuZGlmCi0KLQlzeW0gPSBmaXhwLT5meF9hZGRzeTsKLQotCS8qIEFsbCBzeW1ib2xzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBhdCB0aGlzCi0JICAgcG9pbnQuICBJdCBpcyBwb3NzaWJsZSB0byBzZWUgdW5yZXNvbHZlZCBleHByZXNzaW9uCi0JICAgc3ltYm9scywgdGhvdWdoLCBzaW5jZSB0aGV5IGFyZSBub3QgaW4gdGhlIHJlZ3VsYXIgc3ltYm9sCi0JICAgdGFibGUuICAqLwotCWlmIChzeW0gIT0gTlVMTCkKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW0sIDEpOwotCQotCWlmIChmaXhwLT5meF9zdWJzeSAhPSBOVUxMKQotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZpeHAtPmZ4X3N1YnN5LCAxKTsKLQotCS8qIElmIHRoaXMgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCwgY29udmVydAotICAgICAgICAgICB0aGUgZml4dXAgdG8gYmVpbmcgYWdhaW5zdCB0aGF0IHN5bWJvbC4gICovCi0JaWYgKHN5bSAhPSBOVUxMICYmIHN5bWJvbF9lcXVhdGVkX3AgKHN5bSkKLQkgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQkgIHsKLQkgICAgZml4cC0+Znhfb2Zmc2V0ICs9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfbnVtYmVyOwotCSAgICBzeW0gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX3N5bWJvbDsKLQkgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0JICB9Ci0KLQlpZiAoc3ltICE9IE5VTEwgJiYgc3ltYm9sX21yaV9jb21tb25fcCAoc3ltKSkKLQkgIHsKLQkgICAgLyogVGhlc2Ugc3ltYm9scyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgaW4gZml4dXBfc2VnbWVudC4gICovCi0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLQotCXN5bXNlYyA9IFNfR0VUX1NFR01FTlQgKHN5bSk7Ci0KLQlpZiAoc3ltc2VjID09IE5VTEwpCi0JICBhYm9ydCAoKTsKLQkKLQlpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1zZWMpKQotCSAgewotCSAgICAvKiBUaGUgZml4dXBfc2VnbWVudCByb3V0aW5lIHdpbGwgbm90IHVzZSB0aGlzIHN5bWJvbCBpbiBhCi0gICAgICAgICAgICAgICByZWxvY2F0aW9uIHVubGVzcyBUQ19GT1JDRV9SRUxPQ0FUSU9OIHJldHVybnMgMS4gICovCi0JICAgIGlmIChUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhwKSkKLQkgICAgICB7Ci0JCXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLSNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSwotCQlpZiAoZml4cC0+Znhfc3Vic3kgIT0gTlVMTCkKLQkJICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9zdWJzeSk7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLQotCS8qIElmIGl0J3Mgb25lIG9mIHRoZXNlIHNlY3Rpb25zLCBhc3N1bWUgdGhlIHN5bWJvbCBpcwotCSAgIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgb3V0cHV0LiAgVGhlIGNvZGUgaW4KLQkgICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBpbiB0Yy1taXBzLmMgdXNlcyB0aGlzIHRlc3QKLQkgICBhcyB3ZWxsLCBzbyBpZiB5b3UgY2hhbmdlIHRoaXMgY29kZSB5b3Ugc2hvdWxkIGxvb2sgYXQgdGhhdAotCSAgIGNvZGUuICAqLwotCWlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bXNlYykKLQkgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1zZWMpKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0jaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLQkgICAgLyogV2UgaGF2ZSB0aGUgZGlmZmVyZW5jZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sIGFuZCBzb21lCi0JICAgICAgIG90aGVyIHN5bWJvbC4gIE1ha2Ugc3VyZSB0byBtYXJrIHRoZSBvdGhlciBzeW1ib2wgYXMgdXNlZAotCSAgICAgICBpbiBhIHJlbG9jYXRpb24gc28gdGhhdCBpdCB3aWxsIGFsd2F5cyBiZSBvdXRwdXQuICAqLwotCSAgICBpZiAoZml4cC0+Znhfc3Vic3kpCi0JICAgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+Znhfc3Vic3kpOwotI2VuZGlmCi0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLQotCS8qIERvbid0IHRyeSB0byByZWR1Y2UgcmVsb2NzIHdoaWNoIHJlZmVyIHRvIG5vbi1sb2NhbCBzeW1ib2xzCi0gICAgICAgICAgIGluIC5saW5rb25jZSBzZWN0aW9ucy4gIEl0IGNhbiBsZWFkIHRvIGNvbmZ1c2lvbiB3aGVuIGEKLSAgICAgICAgICAgZGVidWdnaW5nIHNlY3Rpb24gcmVmZXJzIHRvIGEgLmxpbmtvbmNlIHNlY3Rpb24uICBJIGhvcGUKLSAgICAgICAgICAgdGhpcyB3aWxsIGFsd2F5cyBiZSBjb3JyZWN0LiAgKi8KLQlpZiAoc3ltc2VjICE9IHNlYyAmJiAhIFNfSVNfTE9DQUwgKHN5bSkpCi0JICB7Ci0JICAgIGJvb2xlYW4gbGlua29uY2U7Ci0KLQkgICAgbGlua29uY2UgPSBmYWxzZTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHN5bXNlYykgJiBTRUNfTElOS19PTkNFKQotCQkhPSAwKQotCSAgICAgIGxpbmtvbmNlID0gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLQkgICAgLyogVGhlIEdOVSB0b29sY2hhaW4gdXNlcyBhbiBleHRlbnNpb24gZm9yIEVMRjogYSBzZWN0aW9uCi0gICAgICAgICAgICAgICBiZWdpbm5pbmcgd2l0aCB0aGUgbWFnaWMgc3RyaW5nIC5nbnUubGlua29uY2UgaXMgYQotICAgICAgICAgICAgICAgbGlua29uY2Ugc2VjdGlvbi4gICovCi0JICAgIGlmIChzdHJuY21wIChzZWdtZW50X25hbWUgKHN5bXNlYyksICIuZ251LmxpbmtvbmNlIiwKLQkJCSBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkKLQkgICAgICBsaW5rb25jZSA9IHRydWU7Ci0jZW5kaWYKLQotCSAgICBpZiAobGlua29uY2UpCi0JICAgICAgewotCQlzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0jaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLQkJaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwpCi0JCSAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+Znhfc3Vic3kpOwotI2VuZGlmCi0JCWdvdG8gZG9uZTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBTaW5jZSB3ZSdyZSByZWR1Y2luZyB0byBzZWN0aW9uIHN5bWJvbHMsIGRvbid0IGF0dGVtcHQgdG8gcmVkdWNlCi0JICAgYW55dGhpbmcgdGhhdCdzIGFscmVhZHkgdXNpbmcgb25lLiAgKi8KLQlpZiAoc3ltYm9sX3NlY3Rpb25fcCAoc3ltKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JLyogV2UgY2FuIG5ldmVyIGFkanVzdCBhIHJlbG9jIGFnYWluc3QgYSB3ZWFrIHN5bWJvbC4gIElmIHdlCi0gICAgICAgICAgIGRpZCwgYW5kIHRoZSB3ZWFrIHN5bWJvbCB3YXMgb3ZlcnJpZGRlbiBieSBhIHJlYWwgc3ltYm9sCi0gICAgICAgICAgIHNvbWV3aGVyZSBlbHNlLCB0aGVuIG91ciByZWxvY2F0aW9uIHdvdWxkIGJlIHBvaW50aW5nIGF0Ci0gICAgICAgICAgIHRoZSB3cm9uZyBhcmVhIG9mIG1lbW9yeS4gICovCi0JaWYgKFNfSVNfV0VBSyAoc3ltKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0jZW5kaWYKLQotCS8qIElzIHRoZXJlIHNvbWUgb3RoZXIgcmVhc29uIHdlIGNhbid0IGFkanVzdCB0aGlzIG9uZT8gIChFLmcuLAotCSAgIGNhbGwvYmFsIGxpbmtzIGluIGk5NjAtYm91dCBzeW1ib2xzLikgICovCi0jaWZkZWYgb2JqX2ZpeF9hZGp1c3RhYmxlCi0JaWYgKCEgb2JqX2ZpeF9hZGp1c3RhYmxlIChmaXhwKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0jZW5kaWYKLQotCS8qIElzIHRoZXJlIHNvbWUgb3RoZXIgKHRhcmdldCBjcHUgZGVwZW5kZW50KSByZWFzb24gd2UgY2FuJ3QgYWRqdXN0Ci0JICAgdGhpcyBvbmU/ICAoRS5nLiByZWxvY2F0aW9ucyBpbnZvbHZpbmcgZnVuY3Rpb24gYWRkcmVzc2VzIG9uCi0JICAgdGhlIFBBLiAgKi8KLSNpZmRlZiB0Y19maXhfYWRqdXN0YWJsZQotCWlmICghIHRjX2ZpeF9hZGp1c3RhYmxlIChmaXhwKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0jZW5kaWYKLQotCS8qIElmIHRoZSBzZWN0aW9uIHN5bWJvbCBpc24ndCBnb2luZyB0byBiZSBvdXRwdXQsIHRoZSByZWxvY3MKLQkgICBhdCBsZWFzdCBzaG91bGQgc3RpbGwgd29yay4gIElmIG5vdCwgZmlndXJlIG91dCB3aGF0IHRvIGRvCi0JICAgd2hlbiB3ZSBydW4gaW50byB0aGF0IGNhc2UuCi0KLQkgICBXZSByZWZldGNoIHRoZSBzZWdtZW50IHdoZW4gY2FsbGluZyBzZWN0aW9uX3N5bWJvbCwgcmF0aGVyCi0JICAgdGhhbiB1c2luZyBzeW1zZWMsIGJlY2F1c2UgU19HRVRfVkFMVUUgbWF5IHdpbmQgdXAgY2hhbmdpbmcKLQkgICB0aGUgc2VjdGlvbiB3aGVuIGl0IGNhbGxzIHJlc29sdmVfc3ltYm9sX3ZhbHVlLiAqLwotCWZpeHAtPmZ4X29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltKTsKLQlmaXhwLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChTX0dFVF9TRUdNRU5UIChzeW0pKTsKLQlzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0KLSAgICAgIGRvbmU6Ci0JOwotICAgICAgfQotI2lmIDEvKmRlZiBSRUxPQ19SRVFVSVJFU19TWU1CT0wqLwotICAgIGVsc2UKLSAgICAgIHsKLQkvKiBUaGVyZSB3YXMgbm8gc3ltYm9sIHJlcXVpcmVkIGJ5IHRoaXMgcmVsb2NhdGlvbi4gIEhvd2V2ZXIsCi0JICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSByZWxvY2F0aW9ucyB3aXRob3V0IHN5bWJvbHMgd2VsbC4KLQkgICAoQXQgbGVhc3QsIHRoZSBDT0ZGIHN1cHBvcnQgZG9lc24ndC4pICBTbyBmb3Igbm93IHdlIGZha2UgdXAKLQkgICBhIGxvY2FsIHN5bWJvbCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi0KLQlmaXhwLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLS8qCWZpeHAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsgKi8KLSAgICAgIH0KLSNlbmRpZgotCi0gIGR1bXBfc2VjdGlvbl9yZWxvY3MgKGFiZmQsIHNlYywgc3RkZXJyKTsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eDsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBuOwotICBhcmVsZW50ICoqcmVsb2NzOwotICBmaXhTICpmaXhwOwotICBjaGFyICplcnI7Ci0KLSAgLyogSWYgc2VnaW5mbyBpcyBOVUxMLCB3ZSBkaWQgbm90IGNyZWF0ZSB0aGlzIHNlY3Rpb247IGRvbid0IGRvCi0gICAgIGFueXRoaW5nIHdpdGggaXQuICAqLwotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmaXh1cF9zZWdtZW50IChzZWdpbmZvLT5maXhfcm9vdCwgc2VjKTsKLQotICBuID0gMDsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHA7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQotICAgIG4rKzsKLQotI2lmbmRlZiBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKLSAgLyogU2V0IHVwIHJlbG9jIGluZm9ybWF0aW9uIGFzIHdlbGwuICAqLwotICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAobiAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gIG1lbXNldCAoKGNoYXIqKXJlbG9jcywgMCwgbiAqIHNpemVvZiAoYXJlbGVudCopKTsKLQotICBpID0gMDsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHAgIT0gKGZpeFMgKikgTlVMTDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgczsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgbi0tOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIGVxdWF0ZWQgdG8gYW5vdGhlcgotICAgICAgICAgc3ltYm9sLCB0aGVuIHVzZSBnZW5lcmF0ZSB0aGUgcmVsb2MgYWdhaW5zdCB0aGUgbGF0dGVyIHN5bWJvbAotICAgICAgICAgcmF0aGVyIHRoYW4gdGhlIGZvcm1lci4gICovCi0gICAgICBzeW0gPSBmaXhwLT5meF9hZGRzeTsKLSAgICAgIHdoaWxlIChzeW1ib2xfZXF1YXRlZF9wIChzeW0pCi0JICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCXsKLQkgIHN5bWJvbFMgKm47Ci0KLQkgIC8qIFdlIG11c3QgYXZvaWQgbG9vcGluZywgYXMgdGhhdCBjYW4gb2NjdXIgd2l0aCBhIGJhZGx5Ci0JICAgICB3cml0dGVuIHByb2dyYW0uICAqLwotCSAgbiA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfc3ltYm9sOwotCSAgaWYgKG4gPT0gc3ltKQotCSAgICBicmVhazsKLQkgIGZpeHAtPmZ4X29mZnNldCArPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX251bWJlcjsKLQkgIHN5bSA9IG47Ci0JfQotICAgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0KLSAgICAgIHJlbG9jID0gdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApOwotICAgICAgaWYgKCFyZWxvYykKLQl7Ci0JICBuLS07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSNpZiAwCi0gICAgICAvKiBUaGlzIHRlc3QgaXMgdHJpZ2dlcmVkIGluYXBwcm9wcmlhdGVseSBmb3IgdGhlIFNILiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSArIGZpeHAtPmZ4X3NpemUKLQkgID4gZml4cC0+ZnhfZnJhZy0+ZnJfZml4ICsgZml4cC0+ZnhfZnJhZy0+ZnJfb2Zmc2V0KQotCWFib3J0ICgpOwotI2VuZGlmCi0KLSAgICAgIHMgPSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChzdGRvdXRwdXQsIHJlbG9jLAotCQkJCSAgZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkgIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkJICBzZWMsICZlcnIpOwotICAgICAgc3dpdGNoIChzKQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwgXygicmVsb2NhdGlvbiBvdXQgb2YgcmFuZ2UiKSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbjogJXgiKSwKLQkJICAgIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIHMpOwotCX0KLSAgICAgIHJlbG9jc1tpKytdID0gcmVsb2M7Ci0gICAgfQotI2Vsc2UKLSAgbiA9IG4gKiBNQVhfUkVMT0NfRVhQQU5TSU9OOwotICAvKiBTZXQgdXAgcmVsb2MgaW5mb3JtYXRpb24gYXMgd2VsbC4gICovCi0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChuICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQotICBpID0gMDsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHAgIT0gKGZpeFMgKikgTlVMTDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbG9jOwotICAgICAgY2hhciAqZGF0YTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzOwotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgaW50IGo7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9kb25lKQotCXsKLQkgIG4tLTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIHdhcyBlcXVhdGVkIHRvIGFub3RoZXIKLSAgICAgICAgIHN5bWJvbCwgdGhlbiB1c2UgZ2VuZXJhdGUgdGhlIHJlbG9jIGFnYWluc3QgdGhlIGxhdHRlciBzeW1ib2wKLSAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBmb3JtZXIuICAqLwotICAgICAgc3ltID0gZml4cC0+ZnhfYWRkc3k7Ci0gICAgICB3aGlsZSAoc3ltYm9sX2VxdWF0ZWRfcCAoc3ltKQotCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQlzeW0gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX3N5bWJvbDsKLSAgICAgIGZpeHAtPmZ4X2FkZHN5ID0gc3ltOwotCi0gICAgICByZWxvYyA9IHRjX2dlbl9yZWxvYyAoc2VjLCBmaXhwKTsKLQotICAgICAgZm9yIChqID0gMDsgcmVsb2Nbal07IGorKykKLQl7Ci0gICAgICAgICAgcmVsb2NzW2krK10gPSByZWxvY1tqXTsKLSAgICAgICAgICBhc3NlcnQoaSA8PSBuKTsKLQl9Ci0gICAgICBkYXRhID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICsgZml4cC0+Znhfc2l6ZQotCSAgPiBmaXhwLT5meF9mcmFnLT5mcl9maXggKyBmaXhwLT5meF9mcmFnLT5mcl9vZmZzZXQpCi0JYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgICBfKCJpbnRlcm5hbCBlcnJvcjogZml4dXAgbm90IGNvbnRhaW5lZCB3aXRoaW4gZnJhZyIpKTsKLSAgICAgIGZvciAoaiA9IDA7IHJlbG9jW2pdOyBqKyspCi0gICAgICAgIHsKLQkgIHMgPSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChzdGRvdXRwdXQsIHJlbG9jW2pdLAotCQkJCSAgICAgIGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwsCi0JCQkJICAgICAgZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgICAgICBzZWMsICZlcnIpOwotICAgICAgICAgIHN3aXRjaCAocykKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vazoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbiIpLAotCQkJZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0JICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgbiA9IGk7Ci0jZW5kaWYKLQotI2lmZGVmIERFQlVHNAotICB7Ci0gICAgaW50IGksIGosIG5zeW1zOwotICAgIGFzeW1ib2wgKipzeW1wcDsKLSAgICBzeW1wcCA9IGJmZF9nZXRfb3V0c3ltYm9scyAoc3Rkb3V0cHV0KTsKLSAgICBuc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKHN0ZG91dHB1dCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICAgIGlmICgoKCpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JewotCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyBqKyspCi0JICAgIGlmIChzeW1wcFtqXSA9PSAqcmVsb2NzW2ldLT5zeW1fcHRyX3B0cikKLQkgICAgICBicmVhazsKLQkgIGlmIChqID09IG5zeW1zKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChuKQotICAgIGJmZF9zZXRfcmVsb2MgKHN0ZG91dHB1dCwgc2VjLCByZWxvY3MsIG4pOwotICBlbHNlCi0gICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsCi0JCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpCi0JCQkgICAgJiAoZmxhZ3dvcmQpIH5TRUNfUkVMT0MpKTsKLQotI2lmZGVmIERFQlVHMwotICB7Ci0gICAgaW50IGk7Ci0gICAgYXJlbGVudCAqcjsKLSAgICBhc3ltYm9sICpzOwotICAgIGZwcmludGYgKHN0ZGVyciwgInJlbG9jcyBmb3Igc2VjICVzXG4iLCBzZWMtPm5hbWUpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICB7Ci0JciA9IHJlbG9jc1tpXTsKLQlzID0gKnItPnN5bV9wdHJfcHRyOwotCWZwcmludGYgKHN0ZGVyciwgIiAgcmVsb2MgJTJkIEAlMDh4IG9mZiAlNHggOiBzeW0gJS0xMHMgYWRkZW5kICV4XG4iLAotCQkgaSwgciwgci0+YWRkcmVzcywgcy0+bmFtZSwgci0+YWRkZW5kKTsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9jb250ZW50cyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eDsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwotICBmcmFnUyAqZjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGZyYWdzLiAgKi8KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTAotICAgICAgfHwgISAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0hBU19DT05URU5UUykpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoZiA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gICAgICAgZjsKLSAgICAgICBmID0gZi0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBpbnQgeDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZmlsbF9zaXplOwotICAgICAgY2hhciAqZmlsbF9saXRlcmFsOwotICAgICAgbG9uZyBjb3VudDsKLQotICAgICAgYXNzZXJ0IChmLT5mcl90eXBlID09IHJzX2ZpbGwpOwotICAgICAgaWYgKGYtPmZyX2ZpeCkKLQl7Ci0JICB4ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChzdGRvdXRwdXQsIHNlYywKLQkJCQkJZi0+ZnJfbGl0ZXJhbCwgKGZpbGVfcHRyKSBvZmZzZXQsCi0JCQkJCShiZmRfc2l6ZV90eXBlKSBmLT5mcl9maXgpOwotCSAgaWYgKHggPT0gZmFsc2UpCi0JICAgIHsKLQkgICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLQkgICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCB3cml0ZSAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLQkgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotCSAgICB9Ci0JICBvZmZzZXQgKz0gZi0+ZnJfZml4OwotCX0KLSAgICAgIGZpbGxfbGl0ZXJhbCA9IGYtPmZyX2xpdGVyYWwgKyBmLT5mcl9maXg7Ci0gICAgICBmaWxsX3NpemUgPSBmLT5mcl92YXI7Ci0gICAgICBjb3VudCA9IGYtPmZyX29mZnNldDsKLSAgICAgIGFzc2VydCAoY291bnQgPj0gMCk7Ci0gICAgICBpZiAoZmlsbF9zaXplICYmIGNvdW50KQotCXsKLQkgIGNoYXIgYnVmWzI1Nl07Ci0JICBpZiAoZmlsbF9zaXplID4gc2l6ZW9mKGJ1ZikpCi0JICAgIHsKLQkgICAgICAvKiBEbyBpdCB0aGUgb2xkIHdheS4gQ2FuIHRoaXMgZXZlciBoYXBwZW4/ICovCi0JICAgICAgd2hpbGUgKGNvdW50LS0pCi0JCXsKLQkJICB4ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChzdGRvdXRwdXQsIHNlYywKLQkJCQkJCWZpbGxfbGl0ZXJhbCwKLQkJCQkJCShmaWxlX3B0cikgb2Zmc2V0LAotCQkJCQkJKGJmZF9zaXplX3R5cGUpIGZpbGxfc2l6ZSk7Ci0JCSAgaWYgKHggPT0gZmFsc2UpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCQkgICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCB3cml0ZSAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLQkJICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQkJICAgIH0KLQkJICBvZmZzZXQgKz0gZmlsbF9zaXplOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEJ1aWxkIGEgYnVmZmVyIGZ1bGwgb2YgZmlsbCBvYmplY3RzIGFuZCBvdXRwdXQgaXQgYXMKLQkJIG9mdGVuIGFzIG5lY2Vzc2FyeS4gVGhpcyBzYXZlcyBvbiB0aGUgb3ZlcmhlYWQgb2YKLQkJIHBvdGVudGlhbGx5IGxvdHMgb2YgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGNhbGxzLiAgKi8KLQkgICAgICBpbnQgbl9wZXJfYnVmLCBpOwotCSAgICAgIGlmIChmaWxsX3NpemUgPT0gMSkKLQkJewotCQkgIG5fcGVyX2J1ZiA9IHNpemVvZiAoYnVmKTsKLQkJICBtZW1zZXQgKGJ1ZiwgKmZpbGxfbGl0ZXJhbCwgbl9wZXJfYnVmKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKmJ1ZnA7Ci0JCSAgbl9wZXJfYnVmID0gc2l6ZW9mKGJ1ZikvZmlsbF9zaXplOwotCQkgIGZvciAoaSA9IG5fcGVyX2J1ZiwgYnVmcCA9IGJ1ZjsgaTsgaS0tLCBidWZwICs9IGZpbGxfc2l6ZSkKLQkJICAgIG1lbWNweShidWZwLCBmaWxsX2xpdGVyYWwsIGZpbGxfc2l6ZSk7Ci0JCX0KLQkgICAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudCAtPSBuX3Blcl9idWYpCi0JCXsKLQkJICBuX3Blcl9idWYgPSBuX3Blcl9idWYgPiBjb3VudCA/IGNvdW50IDogbl9wZXJfYnVmOwotCQkgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQkJYnVmLCAoZmlsZV9wdHIpIG9mZnNldCwKLQkJCQkJCShiZmRfc2l6ZV90eXBlKSBuX3Blcl9idWYgKiBmaWxsX3NpemUpOwotCQkgIGlmICh4ICE9IHRydWUpCi0JCSAgICBhc19mYXRhbCAoXygiQ2Fubm90IHdyaXRlIHRvIG91dHB1dCBmaWxlLiIpKTsKLQkJICBvZmZzZXQgKz0gbl9wZXJfYnVmICogZmlsbF9zaXplOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEJGRF9BU1NFTUJMRVIpIHx8ICghZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZChPQkpfQU9VVCkpCi1zdGF0aWMgdm9pZAotbWVyZ2VfZGF0YV9pbnRvX3RleHQgKCkKLXsKLSNpZiBkZWZpbmVkKEJGRF9BU1NFTUJMRVIpIHx8IGRlZmluZWQoTUFOWV9TRUdNRU5UUykKLSAgc2VnX2luZm8gKHRleHRfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX2xhc3QtPmZyX25leHQgPQotICAgIHNlZ19pbmZvIChkYXRhX3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9yb290OwotICBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfbGFzdCA9Ci0gICAgc2VnX2luZm8gKGRhdGFfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX2xhc3Q7Ci0gIHNlZ19pbmZvIChkYXRhX3NlY3Rpb24pLT5mcmNoYWluUCA9IDA7Ci0jZWxzZQotICBmaXhTICp0bXA7Ci0KLSAgdGV4dF9sYXN0X2ZyYWctPmZyX25leHQgPSBkYXRhX2ZyYWdfcm9vdDsKLSAgdGV4dF9sYXN0X2ZyYWcgPSBkYXRhX2xhc3RfZnJhZzsKLSAgZGF0YV9sYXN0X2ZyYWcgPSBOVUxMOwotICBkYXRhX2ZyYWdfcm9vdCA9IE5VTEw7Ci0gIGlmICh0ZXh0X2ZpeF9yb290KQotICAgIHsKLSAgICAgIGZvciAodG1wID0gdGV4dF9maXhfcm9vdDsgdG1wLT5meF9uZXh0OyB0bXAgPSB0bXAtPmZ4X25leHQpOzsKLSAgICAgIHRtcC0+ZnhfbmV4dCA9IGRhdGFfZml4X3Jvb3Q7Ci0gICAgICB0ZXh0X2ZpeF90YWlsID0gZGF0YV9maXhfdGFpbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZXh0X2ZpeF9yb290ID0gZGF0YV9maXhfcm9vdDsKLSAgZGF0YV9maXhfcm9vdCA9IE5VTEw7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSIHx8ICghIEJGRCAmJiAhIE9CSl9BT1VUKSAqLwotCi0jaWYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICFkZWZpbmVkIChCRkQpCi1zdGF0aWMgdm9pZAotcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzICgpCi17Ci0gIGZyYWdTICpmcmFnUDsKLQotICByZWxheF9zZWdtZW50ICh0ZXh0X2ZyYWdfcm9vdCwgU0VHX1RFWFQpOwotICByZWxheF9zZWdtZW50IChkYXRhX2ZyYWdfcm9vdCwgU0VHX0RBVEEpOwotICByZWxheF9zZWdtZW50IChic3NfZnJhZ19yb290LCBTRUdfQlNTKTsKLSAgLyoKLSAgICogTm93IHRoZSBhZGRyZXNzZXMgb2YgZnJhZ3MgYXJlIGNvcnJlY3Qgd2l0aGluIHRoZSBzZWdtZW50LgotICAgKi8KLQotICBrbm93ICh0ZXh0X2xhc3RfZnJhZy0+ZnJfdHlwZSA9PSByc19maWxsICYmIHRleHRfbGFzdF9mcmFnLT5mcl9vZmZzZXQgPT0gMCk7Ci0gIEhfU0VUX1RFWFRfU0laRSAoJmhlYWRlcnMsIHRleHRfbGFzdF9mcmFnLT5mcl9hZGRyZXNzKTsKLSAgdGV4dF9sYXN0X2ZyYWctPmZyX2FkZHJlc3MgPSBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKTsKLQotICAvKgotICAgKiBKb2luIHRoZSAyIHNlZ21lbnRzIGludG8gMSBodWdlIHNlZ21lbnQuCi0gICAqIFRvIGRvIHRoaXMsIHJlLWNvbXB1dGUgZXZlcnkgcm5fYWRkcmVzcyBpbiB0aGUgU0VHX0RBVEEgZnJhZ3MuCi0gICAqIFRoZW4gam9pbiB0aGUgZGF0YSBmcmFncyBhZnRlciB0aGUgdGV4dCBmcmFncy4KLSAgICoKLSAgICogRGV0ZXJtaW5lIGFfZGF0YSBbbGVuZ3RoIG9mIGRhdGEgc2VnbWVudF0uCi0gICAqLwotICBpZiAoZGF0YV9mcmFnX3Jvb3QpCi0gICAgewotICAgICAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1Qgc2xpZGU7Ci0KLSAgICAgIGtub3cgKCh0ZXh0X2xhc3RfZnJhZy0+ZnJfdHlwZSA9PSByc19maWxsKSAmJiAodGV4dF9sYXN0X2ZyYWctPmZyX29mZnNldCA9PSAwKSk7Ci0KLSAgICAgIEhfU0VUX0RBVEFfU0laRSAoJmhlYWRlcnMsIGRhdGFfbGFzdF9mcmFnLT5mcl9hZGRyZXNzKTsKLSAgICAgIGRhdGFfbGFzdF9mcmFnLT5mcl9hZGRyZXNzID0gSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycyk7Ci0gICAgICBzbGlkZSA9IEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpOwkvKiAmIGluIGZpbGUgb2YgdGhlIGRhdGEgc2VnbWVudC4gKi8KLSNpZmRlZiBPQkpfQk9VVAotI2RlZmluZSBSb3VuZFVwKE4sUykgKCgoTikrKFMpLTEpJi0oUykpCi0gICAgICAvKiBGb3IgYi5vdXQ6IElmIHRoZSBkYXRhIHNlY3Rpb24gaGFzIGEgc3RyaWN0IGFsaWdubWVudAotCSByZXF1aXJlbWVudCwgaXRzIGxvYWQgYWRkcmVzcyBpbiB0aGUgLm8gZmlsZSB3aWxsIGJlCi0JIHJvdW5kZWQgdXAgZnJvbSB0aGUgc2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhlc2UKLQkgdHdvIHZhbHVlcyBhcmUgKm5vdCogdGhlIHNhbWUhICBTaW1pbGFybHkgZm9yIHRoZSBic3MKLQkgc2VjdGlvbi4uLi4gICovCi0gICAgICBzbGlkZSA9IFJvdW5kVXAgKHNsaWRlLCAxIDw8IHNlY3Rpb25fYWxpZ25tZW50W1NFR19EQVRBXSk7Ci0jZW5kaWYKLQotICAgICAgZm9yIChmcmFnUCA9IGRhdGFfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLQl7Ci0JICBmcmFnUC0+ZnJfYWRkcmVzcyArPSBzbGlkZTsKLQl9CQkJLyogZm9yIGVhY2ggZGF0YSBmcmFnICovCi0KLSAgICAgIGtub3cgKHRleHRfbGFzdF9mcmFnICE9IDApOwotICAgICAgdGV4dF9sYXN0X2ZyYWctPmZyX25leHQgPSBkYXRhX2ZyYWdfcm9vdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBIX1NFVF9EQVRBX1NJWkUgKCZoZWFkZXJzLCAwKTsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfQk9VVAotICAvKiBTZWUgYWJvdmUgY29tbWVudHMgb24gYi5vdXQgZGF0YSBzZWN0aW9uIGFkZHJlc3MuICAqLwotICB7Ci0gICAgbG9uZyBic3Nfdm1hOwotICAgIGlmIChkYXRhX2xhc3RfZnJhZyA9PSAwKQotICAgICAgYnNzX3ZtYSA9IEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpOwotICAgIGVsc2UKLSAgICAgIGJzc192bWEgPSBkYXRhX2xhc3RfZnJhZy0+ZnJfYWRkcmVzczsKLSAgICBic3Nfdm1hID0gUm91bmRVcCAoYnNzX3ZtYSwgMSA8PCBzZWN0aW9uX2FsaWdubWVudFtTRUdfQlNTXSk7Ci0gICAgYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzID0gYnNzX3ZtYTsKLSAgfQotI2Vsc2UgLyogISBPQkpfQk9VVCAqLwotICBic3NfYWRkcmVzc19mcmFnLmZyX2FkZHJlc3MgPSAoSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKwotCQkJCSBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSk7Ci0KLSNlbmRpZiAvKiAhIE9CSl9CT1VUICovCi0KLSAgLyogU2xpZGUgYWxsIHRoZSBmcmFncyAqLwotICBpZiAoYnNzX2ZyYWdfcm9vdCkKLSAgICB7Ci0gICAgICByZWxheF9hZGRyZXNzVCBzbGlkZSA9IGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzczsKLQotICAgICAgZm9yIChmcmFnUCA9IGJzc19mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCXsKLQkgIGZyYWdQLT5mcl9hZGRyZXNzICs9IHNsaWRlOwotCX0JCQkvKiBmb3IgZWFjaCBic3MgZnJhZyAqLwotICAgIH0KLQotICBpZiAoYnNzX2xhc3RfZnJhZykKLSAgICBIX1NFVF9CU1NfU0laRSAoJmhlYWRlcnMsCi0JCSAgICBic3NfbGFzdF9mcmFnLT5mcl9hZGRyZXNzIC0gYnNzX2ZyYWdfcm9vdC0+ZnJfYWRkcmVzcyk7Ci0gIGVsc2UKLSAgICBIX1NFVF9CU1NfU0laRSAoJmhlYWRlcnMsIDApOwotfQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAmJiAhIEJGRCAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkCi1zZXRfc3ltdGFiICgpCi17Ci0gIGludCBuc3ltczsKLSAgYXN5bWJvbCAqKmFzeW1wcDsKLSAgc3ltYm9sUyAqc3ltcDsKLSAgYm9vbGVhbiByZXN1bHQ7Ci0gIGV4dGVybiBQVFIgYmZkX2FsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLQotICAvKiBDb3VudCBzeW1ib2xzLiAgV2UgY2FuJ3QgcmVseSBvbiBhIGNvdW50IG1hZGUgYnkgdGhlIGxvb3AgaW4KLSAgICAgd3JpdGVfb2JqZWN0X2ZpbGUsIGJlY2F1c2UgKl9mcm9iX2ZpbGUgbWF5IGFkZCBhIG5ldyBzeW1ib2wgb3IKLSAgICAgdHdvLiAgKi8KLSAgbnN5bXMgPSAwOwotICBmb3IgKHN5bXAgPSBzeW1ib2xfcm9vdFA7IHN5bXA7IHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0gICAgbnN5bXMrKzsKLQotICBpZiAobnN5bXMpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGFzeW1wcCA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKHN0ZG91dHB1dCwKLQkJCQkgICAgICAgbnN5bXMgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgc3ltcCA9IHN5bWJvbF9yb290UDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3ltczsgaSsrLCBzeW1wID0gc3ltYm9sX25leHQgKHN5bXApKQotCXsKLQkgIGFzeW1wcFtpXSA9IHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKTsKLQkgIHN5bWJvbF9tYXJrX3dyaXR0ZW4gKHN5bXApOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc3ltcHAgPSAwOwotICByZXN1bHQgPSBiZmRfc2V0X3N5bXRhYiAoc3Rkb3V0cHV0LCBhc3ltcHAsIG5zeW1zKTsKLSAgYXNzZXJ0IChyZXN1bHQgPT0gdHJ1ZSk7Ci0gIHN5bWJvbF90YWJsZV9mcm96ZW4gPSAxOwotfQotI2VuZGlmCi0KLS8qIEZpbmlzaCB0aGUgc3Vic2VnbWVudHMuICBBZnRlciBldmVyeSBzdWItc2VnbWVudCwgd2UgZmFrZSBhbgotICAgIi5hbGlnbiAuLi4iLiAgVGhpcyBjb25mb3JtcyB0byBCU0Q0LjIgYnJhbmUtZGFtYWdlLiAgV2UgdGhlbiBmYWtlCi0gICAiLmZpbGwgMCIgYmVjYXVzZSB0aGF0IGlzIHRoZSBraW5kIG9mIGZyYWcgdGhhdCByZXF1aXJlcyBsZWFzdAotICAgdGhvdWdodC4gICIuYWxpZ24iIGZyYWdzIGxpa2UgdG8gaGF2ZSBhIGZvbGxvd2luZyBmcmFnIHNpbmNlIHRoYXQKLSAgIG1ha2VzIGNhbGN1bGF0aW5nIHRoZWlyIGludGVuZGVkIGxlbmd0aCB0cml2aWFsLiAgKi8KLQotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAoMCkKLSNlbHNlCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgKDIpCi0jZW5kaWYKLSNlbmRpZgotCi12b2lkCi1zdWJzZWdzX2ZpbmlzaCAoKQotewotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpblA7Ci0KLSAgZm9yIChmcmNoYWluUCA9IGZyY2hhaW5fcm9vdDsgZnJjaGFpblA7IGZyY2hhaW5QID0gZnJjaGFpblAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0IChmcmNoYWluUC0+ZnJjaF9zZWcsIGZyY2hhaW5QLT5mcmNoX3N1YnNlZyk7Ci0KLSAgICAgIC8qIFRoaXMgbm93IGdldHMgY2FsbGVkIGV2ZW4gaWYgd2UgaGFkIGVycm9ycy4gIEluIHRoYXQgY2FzZSwKLSAgICAgICAgIGFueSBhbGlnbm1lbnQgaXMgbWVhbmluZ2xlc3MsIGFuZCwgbW9yZW92ZXIsIHdpbGwgbG9vayB3ZWlyZAotICAgICAgICAgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBsaXN0aW5nLiAgKi8KLSAgICAgIGZyYWdfYWxpZ24gKGhhZF9lcnJvcnMgKCkgPyAwIDogU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLAotCQkgIHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpID8gTk9QX09QQ09ERSA6IDAsCi0JCSAgMCk7Ci0KLSAgICAgIC8qIGZyYWdfYWxpZ24gd2lsbCBoYXZlIGxlZnQgYSBuZXcgZnJhZy4KLQkgVXNlIHRoaXMgbGFzdCBmcmFnIGZvciBhbiBlbXB0eSAiLmZpbGwiLgotCi0JIEZvciB0aGlzIHNlZ21lbnQgLi4uCi0JIENyZWF0ZSBhIGxhc3QgZnJhZy4gRG8gbm90IGxlYXZlIGEgImJlaW5nIGZpbGxlZCBpbiBmcmFnIi4gICovCi0KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19ub3ctPmZyX2ZpeCA9IDA7Ci0gICAgICBrbm93IChmcmFnX25vdy0+ZnJfbmV4dCA9PSBOVUxMKTsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIHRoZSBvYmplY3QgZmlsZS4gICovCi0KLXZvaWQKLXdyaXRlX29iamVjdF9maWxlICgpCi17Ci0jaWYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhIGRlZmluZWQgKFdPUktJTkdfRE9UX1dPUkQpCi0gIGZyYWdTICpmcmFnUDsJCQkvKiBUcmFjayBhbG9uZyBhbGwgZnJhZ3MuICovCi0jZW5kaWYKLQotICAvKiBEbyB3ZSByZWFsbHkgd2FudCB0byB3cml0ZSBpdD8gICovCi0gIHsKLSAgICBpbnQgbl93YXJucywgbl9lcnJzOwotICAgIG5fd2FybnMgPSBoYWRfd2FybmluZ3MgKCk7Ci0gICAgbl9lcnJzID0gaGFkX2Vycm9ycyAoKTsKLSAgICAvKiBUaGUgLVogZmxhZyBpbmRpY2F0ZXMgdGhhdCBhbiBvYmplY3QgZmlsZSBzaG91bGQgYmUgZ2VuZXJhdGVkLAotICAgICAgIHJlZ2FyZGxlc3Mgb2Ygd2FybmluZ3MgYW5kIGVycm9ycy4gICovCi0gICAgaWYgKGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCkKLSAgICAgIHsKLQlpZiAobl93YXJucyB8fCBuX2VycnMpCi0JICBhc193YXJuIChfKCIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIGdlbmVyYXRpbmcgYmFkIG9iamVjdCBmaWxlLlxuIiksCi0JCSAgIG5fZXJycywgbl9lcnJzID09IDEgPyAiIiA6ICJzIiwKLQkJICAgbl93YXJucywgbl93YXJucyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlpZiAobl9lcnJzKQotCSAgYXNfZmF0YWwgKF8oIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgbm8gb2JqZWN0IGZpbGUgZ2VuZXJhdGVkLlxuIiksCi0JCSAgICBuX2VycnMsIG5fZXJycyA9PSAxID8gIiIgOiAicyIsCi0JCSAgICBuX3dhcm5zLCBuX3dhcm5zID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICB9Ci0gIH0KLQotI2lmZGVmCU9CSl9WTVMKLSAgLyogVW5kZXIgVk1TIHdlIHRyeSB0byBiZSBjb21wYXRpYmxlIHdpdGggVkFYLTExICJDIi4gIFRodXMsIHdlIGNhbGwKLSAgICAgYSByb3V0aW5lIHRvIGNoZWNrIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJvY2VkdXJlICJfbWFpbiIsCi0gICAgIGFuZCBpZiBzbyAtLSBmaXggaXQgdXAgc28gdGhhdCBpdCBjYW4gYmUgcHJvZ3JhbSBlbnRyeSBwb2ludC4gKi8KLSAgdm1zX2NoZWNrX2Zvcl9tYWluICgpOwotI2VuZGlmIC8qIE9CSl9WTVMgKi8KLQotICAvKiBGcm9tIG5vdyBvbiwgd2UgZG9uJ3QgY2FyZSBhYm91dCBzdWItc2VnbWVudHMuICBCdWlsZCBvbmUgZnJhZyBjaGFpbgotICAgICBmb3IgZWFjaCBzZWdtZW50LiBMaW5rZWQgdGhydSBmcl9uZXh0LiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogUmVtb3ZlIHRoZSBzZWN0aW9ucyBjcmVhdGVkIGJ5IGdhcyBmb3IgaXRzIG93biBwdXJwb3Nlcy4gICovCi0gIHsKLSAgICBhc2VjdGlvbiAqKnNlY2xpc3QsICpzZWM7Ci0gICAgaW50IGk7Ci0KLSAgICBzZWNsaXN0ID0gJnN0ZG91dHB1dC0+c2VjdGlvbnM7Ci0gICAgd2hpbGUgKHNlY2xpc3QgJiYgKnNlY2xpc3QpCi0gICAgICB7Ci0Jc2VjID0gKnNlY2xpc3Q7Ci0Jd2hpbGUgKHNlYyA9PSByZWdfc2VjdGlvbiB8fCBzZWMgPT0gZXhwcl9zZWN0aW9uKQotCSAgewotCSAgICBzZWMgPSBzZWMtPm5leHQ7Ci0JICAgICpzZWNsaXN0ID0gc2VjOwotCSAgICBzdGRvdXRwdXQtPnNlY3Rpb25fY291bnQtLTsKLQkgICAgaWYgKCFzZWMpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JaWYgKCpzZWNsaXN0KQotCSAgc2VjbGlzdCA9ICYoKnNlY2xpc3QpLT5uZXh0OwotICAgICAgfQotICAgIGkgPSAwOwotICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCByZW51bWJlcl9zZWN0aW9ucywgJmkpOwotICB9Ci0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyLCAoY2hhciAqKSAwKTsKLSNlbHNlCi0gIHJlbW92ZV9zdWJzZWdzIChmcmNoYWluX3Jvb3QsIFNFR19URVhULCAmdGV4dF9mcmFnX3Jvb3QsICZ0ZXh0X2xhc3RfZnJhZyk7Ci0gIHJlbW92ZV9zdWJzZWdzIChkYXRhMF9mcmNoYWluUCwgU0VHX0RBVEEsICZkYXRhX2ZyYWdfcm9vdCwgJmRhdGFfbGFzdF9mcmFnKTsKLSAgcmVtb3ZlX3N1YnNlZ3MgKGJzczBfZnJjaGFpblAsIFNFR19CU1MsICZic3NfZnJhZ19yb290LCAmYnNzX2xhc3RfZnJhZyk7Ci0jZW5kaWYKLQotICAvKiBXZSBoYXZlIHR3byBzZWdtZW50cy4gSWYgdXNlciBnYXZlIC1SIGZsYWcsIHRoZW4gd2UgbXVzdCBwdXQgdGhlCi0gICAgIGRhdGEgZnJhZ3MgaW50byB0aGUgdGV4dCBzZWdtZW50LiBEbyB0aGlzIGJlZm9yZSByZWxheGluZyBzbwotICAgICB3ZSBrbm93IHRvIHRha2UgYWR2YW50YWdlIG9mIC1SIGFuZCBtYWtlIHNob3J0ZXIgYWRkcmVzc2VzLiAgKi8KLSNpZiAhZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICB7Ci0gICAgICBtZXJnZV9kYXRhX2ludG9fdGV4dCAoKTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHJlbGF4X2FuZF9zaXplX3NlZywgKGNoYXIgKikgMCk7Ci0jZWxzZQotICByZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgKCk7Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyoKLSAgICoKLSAgICogQ3Jhd2wgdGhlIHN5bWJvbCBjaGFpbi4KLSAgICoKLSAgICogRm9yIGVhY2ggc3ltYm9sIHdob3NlIHZhbHVlIGRlcGVuZHMgb24gYSBmcmFnLCB0YWtlIHRoZSBhZGRyZXNzIG9mCi0gICAqIHRoYXQgZnJhZyBhbmQgc3Vic3VtZSBpdCBpbnRvIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgotICAgKiBBZnRlciB0aGlzLCB0aGVyZSBpcyBqdXN0IG9uZSB3YXkgdG8gbG9va3VwIGEgc3ltYm9sIHZhbHVlLgotICAgKiBWYWx1ZXMgYXJlIGxlZnQgaW4gdGhlaXIgZmluYWwgc3RhdGUgZm9yIG9iamVjdCBmaWxlIGVtaXNzaW9uLgotICAgKiBXZSBhZGp1c3QgdGhlIHZhbHVlcyBvZiAnTCcgbG9jYWwgc3ltYm9scywgZXZlbiBpZiB3ZSBkbwotICAgKiBub3QgaW50ZW5kIHRvIGVtaXQgdGhlbSB0byB0aGUgb2JqZWN0IGZpbGUsIGJlY2F1c2UgdGhlaXIgdmFsdWVzCi0gICAqIGFyZSBuZWVkZWQgZm9yIGZpeC11cHMuCi0gICAqCi0gICAqIFVubGVzcyB3ZSBzYXcgYSAtTCBmbGFnLCByZW1vdmUgYWxsIHN5bWJvbHMgdGhhdCBiZWdpbiB3aXRoICdMJwotICAgKiBmcm9tIHRoZSBzeW1ib2wgY2hhaW4uICAoVGhleSBhcmUgc3RpbGwgcG9pbnRlZCB0byBieSB0aGUgZml4ZXMuKQotICAgKgotICAgKiBDb3VudCB0aGUgcmVtYWluaW5nIHN5bWJvbHMuCi0gICAqIEFzc2lnbiBhIHN5bWJvbCBudW1iZXIgdG8gZWFjaCBzeW1ib2wuCi0gICAqIENvdW50IHRoZSBudW1iZXIgb2Ygc3RyaW5nLXRhYmxlIGNoYXJzIHdlIHdpbGwgZW1pdC4KLSAgICogUHV0IHRoaXMgaW5mbyBpbnRvIHRoZSBoZWFkZXJzIGFzIGFwcHJvcHJpYXRlLgotICAgKgotICAgKi8KLSAga25vdyAoemVyb19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzcyA9PSAwKTsKLSAgc3RyaW5nX2J5dGVfY291bnQgPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLQotICBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluICgmaGVhZGVycyk7Ci0KLSAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID09IHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpKQotICAgIHN0cmluZ19ieXRlX2NvdW50ID0gMDsKLQotICBIX1NFVF9TVFJJTkdfU0laRSAoJmhlYWRlcnMsIHN0cmluZ19ieXRlX2NvdW50KTsKLQotICAvKgotICAgKiBBZGRyZXNzZXMgb2YgZnJhZ3Mgbm93IHJlZmxlY3QgYWRkcmVzc2VzIHdlIHVzZSBpbiB0aGUgb2JqZWN0IGZpbGUuCi0gICAqIFN5bWJvbCB2YWx1ZXMgYXJlIGNvcnJlY3QuCi0gICAqIFNjYW4gdGhlIGZyYWdzLCBjb252ZXJ0aW5nIGFueSAiLm9yZyJzIGFuZCAiLmFsaWduInMgdG8gIi5maWxsInMuCi0gICAqIEFsc28gY29udmVydGluZyBhbnkgbWFjaGluZS1kZXBlbmRlbnQgZnJhZ3MgdXNpbmcgbWRfY29udmVydF9mcmFnKCk7Ci0gICAqLwotICBzdWJzZWdfY2hhbmdlIChTRUdfVEVYVCwgMCk7Ci0KLSAgZm9yIChmcmFnUCA9IHRleHRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbGlua2VkIGFsbCB0aGUgZnJhZ3MgaW50byBhIHNpbmdsZQotICAgICAgICAgY2hhaW4uICBIb3dldmVyLCBjdnRfZnJhZ190b19maWxsIG1heSBjYWxsIG1kX2NvbnZlcnRfZnJhZwotICAgICAgICAgd2hpY2ggbWF5IGNhbGwgZml4X25ldy4gIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgZml4X25ldyBhZGRzCi0gICAgICAgICB0aGUgZml4dXAgdG8gdGhlIHJpZ2h0IHNlY3Rpb24uICAqLwotICAgICAgaWYgKGZyYWdQID09IGRhdGFfZnJhZ19yb290KQotCXN1YnNlZ19jaGFuZ2UgKFNFR19EQVRBLCAwKTsKLQotICAgICAgY3Z0X2ZyYWdfdG9fZmlsbCAoJmhlYWRlcnMsIFNFR19URVhULCBmcmFnUCk7Ci0KLSAgICAgIC8qIFNvbWUgYXNzZXJ0IG1hY3JvcyBkb24ndCB3b3JrIHdpdGggIyBkaXJlY3RpdmVzIG1peGVkIGluLiAgKi8KLSNpZm5kZWYgTkRFQlVHCi0gICAgICBpZiAoIShmcmFnUC0+ZnJfbmV4dCA9PSBOVUxMCi0jaWZkZWYgT0JKX0JPVVQKLQkgICAgfHwgZnJhZ1AtPmZyX25leHQgPT0gZGF0YV9mcmFnX3Jvb3QKLSNlbmRpZgotCSAgICB8fCAoKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ1AtPmZyX2FkZHJlc3MpCi0JCT09IChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX29mZnNldCAqIGZyYWdQLT5mcl92YXIpKSkpCi0JYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICB9Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICB7Ci0gICAgc3RydWN0IGJyb2tlbl93b3JkICpsaWU7Ci0gICAgc3RydWN0IGJyb2tlbl93b3JkICoqcHJldlA7Ci0KLSAgICBwcmV2UCA9ICZicm9rZW5fd29yZHM7Ci0gICAgZm9yIChsaWUgPSBicm9rZW5fd29yZHM7IGxpZTsgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQotICAgICAgaWYgKCFsaWUtPmFkZGVkKQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgc3Vic2VnX2NoYW5nZSAobGllLT5zZWcsIGxpZS0+c3Vic2VnKTsKLQkgIGV4cC5YX29wID0gT19zdWJ0cmFjdDsKLQkgIGV4cC5YX2FkZF9zeW1ib2wgPSBsaWUtPmFkZDsKLQkgIGV4cC5YX29wX3N5bWJvbCA9IGxpZS0+c3ViOwotCSAgZXhwLlhfYWRkX251bWJlciA9IGxpZS0+YWRkbnVtOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBUQ19DT05TX0ZJWF9ORVcKLQkgIFRDX0NPTlNfRklYX05FVyAobGllLT5mcmFnLAotCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDIsICZleHApOwotI2Vsc2UKLQkgIGZpeF9uZXdfZXhwIChsaWUtPmZyYWcsCi0JCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkgICAgICAgMiwgJmV4cCwgMCwgQkZEX1JFTE9DXzE2KTsKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKFRDX1NQQVJDKSB8fCBkZWZpbmVkKFRDX0EyOUspIHx8IGRlZmluZWQoTkVFRF9GWF9SX1RZUEUpCi0JICBmaXhfbmV3X2V4cCAobGllLT5mcmFnLAotCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDIsICZleHAsIDAsIE5PX1JFTE9DKTsKLSNlbHNlCi0jaWZkZWYgVENfTlMzMksKLQkgIGZpeF9uZXdfbnMzMmtfZXhwIChsaWUtPmZyYWcsCi0JCQkgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCQkgICAgIDIsICZleHAsIDAsIDAsIDIsIDAsIDApOwotI2Vsc2UKLQkgIGZpeF9uZXdfZXhwIChsaWUtPmZyYWcsCi0JCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkgICAgICAgMiwgJmV4cCwgMCwgMCk7Ci0jZW5kaWYgLyogVENfTlMzMksgKi8KLSNlbmRpZiAvKiBUQ19TUEFSQ3xUQ19BMjlLfE5FRURfRlhfUl9UWVBFICovCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCSAgKnByZXZQID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkOwotCX0KLSAgICAgIGVsc2UKLQlwcmV2UCA9ICYobGllLT5uZXh0X2Jyb2tlbl93b3JkKTsKLQotICAgIGZvciAobGllID0gYnJva2VuX3dvcmRzOyBsaWU7KQotICAgICAgewotCXN0cnVjdCBicm9rZW5fd29yZCAqdW50cnV0aDsKLQljaGFyICp0YWJsZV9wdHI7Ci0JYWRkcmVzc1QgdGFibGVfYWRkcjsKLQlhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0JaW50IG4sIG07Ci0KLQlzdWJzZWdfY2hhbmdlIChsaWUtPnNlZywgbGllLT5zdWJzZWcpOwotCWZyYWdQID0gbGllLT5kaXNwZnJhZzsKLQotCS8qIEZpbmQgb3V0IGhvdyBtYW55IGJyb2tlbl93b3JkcyBnbyBoZXJlLiAgKi8KLQluID0gMDsKLQlmb3IgKHVudHJ1dGggPSBsaWU7IHVudHJ1dGggJiYgdW50cnV0aC0+ZGlzcGZyYWcgPT0gZnJhZ1A7IHVudHJ1dGggPSB1bnRydXRoLT5uZXh0X2Jyb2tlbl93b3JkKQotCSAgaWYgKHVudHJ1dGgtPmFkZGVkID09IDEpCi0JICAgIG4rKzsKLQotCXRhYmxlX3B0ciA9IGxpZS0+ZGlzcGZyYWctPmZyX29wY29kZTsKLQl0YWJsZV9hZGRyID0gbGllLT5kaXNwZnJhZy0+ZnJfYWRkcmVzcyArICh0YWJsZV9wdHIgLSBsaWUtPmRpc3BmcmFnLT5mcl9saXRlcmFsKTsKLQkvKiBDcmVhdGUgdGhlIGp1bXAgYXJvdW5kIHRoZSBsb25nIGp1bXBzLiAgVGhpcyBpcyBhIHNob3J0Ci0JICAganVtcCBmcm9tIHRhYmxlX3B0ciswIHRvIHRhYmxlX3B0cituKmxvbmdfanVtcF9zaXplLiAgKi8KLQlmcm9tX2FkZHIgPSB0YWJsZV9hZGRyOwotCXRvX2FkZHIgPSB0YWJsZV9hZGRyICsgbWRfc2hvcnRfanVtcF9zaXplICsgbiAqIG1kX2xvbmdfanVtcF9zaXplOwotCW1kX2NyZWF0ZV9zaG9ydF9qdW1wICh0YWJsZV9wdHIsIGZyb21fYWRkciwgdG9fYWRkciwgbGllLT5kaXNwZnJhZywgbGllLT5hZGQpOwotCXRhYmxlX3B0ciArPSBtZF9zaG9ydF9qdW1wX3NpemU7Ci0JdGFibGVfYWRkciArPSBtZF9zaG9ydF9qdW1wX3NpemU7Ci0KLQlmb3IgKG0gPSAwOyBsaWUgJiYgbGllLT5kaXNwZnJhZyA9PSBmcmFnUDsgbSsrLCBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0JICB7Ci0JICAgIGlmIChsaWUtPmFkZGVkID09IDIpCi0JICAgICAgY29udGludWU7Ci0JICAgIC8qIFBhdGNoIHRoZSBqdW1wIHRhYmxlICovCi0JICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBmcm9tID8/PyB0byB0YWJsZV9wdHIrMCAqLwotCSAgICB0b19hZGRyID0gdGFibGVfYWRkciAtIFNfR0VUX1ZBTFVFIChsaWUtPnN1Yik7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICB0b19hZGRyIC09IHN5bWJvbF9nZXRfZnJhZyAobGllLT5zdWIpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0JICAgIG1kX251bWJlcl90b19jaGFycyAobGllLT53b3JkX2dvZXNfaGVyZSwgdG9fYWRkciwgMik7Ci0JICAgIGZvciAodW50cnV0aCA9IGxpZS0+bmV4dF9icm9rZW5fd29yZDsgdW50cnV0aCAmJiB1bnRydXRoLT5kaXNwZnJhZyA9PSBmcmFnUDsgdW50cnV0aCA9IHVudHJ1dGgtPm5leHRfYnJva2VuX3dvcmQpCi0JICAgICAgewotCQlpZiAodW50cnV0aC0+dXNlX2p1bXAgPT0gbGllKQotCQkgIG1kX251bWJlcl90b19jaGFycyAodW50cnV0aC0+d29yZF9nb2VzX2hlcmUsIHRvX2FkZHIsIDIpOwotCSAgICAgIH0KLQotCSAgICAvKiBJbnN0YWxsIHRoZSBsb25nIGp1bXAgKi8KLQkgICAgLyogdGhpcyBpcyBhIGxvbmcganVtcCBmcm9tIHRhYmxlX3B0ciswIHRvIHRoZSBmaW5hbCB0YXJnZXQgKi8KLQkgICAgZnJvbV9hZGRyID0gdGFibGVfYWRkcjsKLQkgICAgdG9fYWRkciA9IFNfR0VUX1ZBTFVFIChsaWUtPmFkZCkgKyBsaWUtPmFkZG51bTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgIHRvX2FkZHIgKz0gc3ltYm9sX2dldF9mcmFnIChsaWUtPmFkZCktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQkgICAgbWRfY3JlYXRlX2xvbmdfanVtcCAodGFibGVfcHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGxpZS0+ZGlzcGZyYWcsIGxpZS0+YWRkKTsKLQkgICAgdGFibGVfcHRyICs9IG1kX2xvbmdfanVtcF9zaXplOwotCSAgICB0YWJsZV9hZGRyICs9IG1kX2xvbmdfanVtcF9zaXplOwotCSAgfQotICAgICAgfQotICB9Ci0jZW5kaWYgLyogbm90IFdPUktJTkdfRE9UX1dPUkQgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZuZGVmCU9CSl9WTVMKLSAgewkJCQkvKiBub3Qgdm1zICovCi0gICAgY2hhciAqdGhlX29iamVjdF9maWxlOwotICAgIGxvbmcgb2JqZWN0X2ZpbGVfc2l6ZTsKLSAgICAvKgotICAgICAqIFNjYW4gZXZlcnkgRml4UyBwZXJmb3JtaW5nIGZpeHVwcy4gV2UgaGFkIHRvIHdhaXQgdW50aWwgbm93IHRvIGRvCi0gICAgICogdGhpcyBiZWNhdXNlIG1kX2NvbnZlcnRfZnJhZygpIG1heSBoYXZlIG1hZGUgc29tZSBmaXhTcy4KLSAgICAgKi8KLSAgICBpbnQgdHJzaXplLCBkcnNpemU7Ci0KLSAgICBzdWJzZWdfY2hhbmdlIChTRUdfVEVYVCwgMCk7Ci0gICAgdHJzaXplID0gbWRfcmVsb2Nfc2l6ZSAqIGZpeHVwX3NlZ21lbnQgKHRleHRfZml4X3Jvb3QsIFNFR19URVhUKTsKLSAgICBzdWJzZWdfY2hhbmdlIChTRUdfREFUQSwgMCk7Ci0gICAgZHJzaXplID0gbWRfcmVsb2Nfc2l6ZSAqIGZpeHVwX3NlZ21lbnQgKGRhdGFfZml4X3Jvb3QsIFNFR19EQVRBKTsKLSAgICBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzLCB0cnNpemUsIGRyc2l6ZSk7Ci0KLSAgICAvKiBGSVhNRSBtb3ZlIHRoaXMgc3R1ZmYgaW50byB0aGUgcHJlLXdyaXRlLWhvb2sgKi8KLSAgICBIX1NFVF9NQUdJQ19OVU1CRVIgKCZoZWFkZXJzLCBtYWdpY19udW1iZXJfZm9yX29iamVjdF9maWxlKTsKLSAgICBIX1NFVF9FTlRSWV9QT0lOVCAoJmhlYWRlcnMsIDApOwotCi0gICAgb2JqX3ByZV93cml0ZV9ob29rICgmaGVhZGVycyk7CS8qIGV4dHJhIGNvZmYgc3R1ZmYgKi8KLQotICAgIG9iamVjdF9maWxlX3NpemUgPSBIX0dFVF9GSUxFX1NJWkUgKCZoZWFkZXJzKTsKLSAgICBuZXh0X29iamVjdF9maWxlX2NoYXJQID0gdGhlX29iamVjdF9maWxlID0geG1hbGxvYyAob2JqZWN0X2ZpbGVfc2l6ZSk7Ci0KLSAgICBvdXRwdXRfZmlsZV9jcmVhdGUgKG91dF9maWxlX25hbWUpOwotCi0gICAgb2JqX2hlYWRlcl9hcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCAmaGVhZGVycyk7Ci0KLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgY29kZS4KLSAgICAgKi8KLSAgICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotICAgICAgewotCXJlZ2lzdGVyIGxvbmcgY291bnQ7Ci0JcmVnaXN0ZXIgY2hhciAqZmlsbF9saXRlcmFsOwotCXJlZ2lzdGVyIGxvbmcgZmlsbF9zaXplOwotCi0JUFJPR1JFU1MgKDEpOwotCWtub3cgKGZyYWdQLT5mcl90eXBlID09IHJzX2ZpbGwpOwotCWFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGZyYWdQLT5mcl9saXRlcmFsLCAodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2ZpeCk7Ci0JZmlsbF9saXRlcmFsID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4OwotCWZpbGxfc2l6ZSA9IGZyYWdQLT5mcl92YXI7Ci0Ja25vdyAoZnJhZ1AtPmZyX29mZnNldCA+PSAwKTsKLQotCWZvciAoY291bnQgPSBmcmFnUC0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKLQkgIHsKLQkgICAgYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZmlsbF9saXRlcmFsLCAodW5zaWduZWQgbG9uZykgZmlsbF9zaXplKTsKLQkgIH0JCQkvKiBmb3IgZWFjaCAgKi8KLQotICAgICAgfQkJCQkvKiBmb3IgZWFjaCBjb2RlIGZyYWcuICovCi0KLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgcmVsb2NhdGlvbnMuCi0gICAgICovCi0gICAgb2JqX2VtaXRfcmVsb2NhdGlvbnMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCB0ZXh0X2ZpeF9yb290LCAocmVsYXhfYWRkcmVzc1QpIDApOwotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpKSk7Ci0jaWZkZWYgVENfSTk2MAotICAgIC8qIE1ha2UgYWRkcmVzc2VzIGluIGRhdGEgcmVsb2NhdGlvbiBkaXJlY3RpdmVzIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZgotICAgICAqIGZpcnN0IGRhdGEgZnJhZ21lbnQsIG5vdCBlbmQgb2YgbGFzdCB0ZXh0IGZyYWdtZW50OiAgYWxpZ25tZW50IG9mIHRoZQotICAgICAqIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQgbWF5IHBsYWNlIGEgZ2FwIGJldHdlZW4gdGhlIHNlZ21lbnRzLgotICAgICAqLwotICAgIG9ial9lbWl0X3JlbG9jYXRpb25zICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZGF0YV9maXhfcm9vdCwgZGF0YTBfZnJjaGFpblAtPmZyY2hfcm9vdC0+ZnJfYWRkcmVzcyk7Ci0jZWxzZSAvKiBUQ19JOTYwICovCi0gICAgb2JqX2VtaXRfcmVsb2NhdGlvbnMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBkYXRhX2ZpeF9yb290LCB0ZXh0X2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgbGluZSBudW1iZXIgZW50cmllcy4KLSAgICAgKi8KLSAgICBPQkpfRU1JVF9MSU5FTk8gKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBsaW5lbm9fcm9vdFAsIHRoZV9vYmplY3RfZmlsZSk7Ci0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfTElORU5PX1NJWkUgKCZoZWFkZXJzKSkpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IHN5bWJvbHMuCi0gICAgICovCi0gICAgb2JqX2VtaXRfc3ltYm9scyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIHN5bWJvbF9yb290UCk7Ci0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfTElORU5PX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFICgmaGVhZGVycykpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCBzdHJpbmdzLgotICAgICAqLwotCi0gICAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID4gMCkKLSAgICAgIHsKLQlvYmpfZW1pdF9zdHJpbmdzICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCk7Ci0gICAgICB9CQkJCS8qIG9ubHkgaWYgd2UgaGF2ZSBhIHN0cmluZyB0YWJsZSAqLwotCi0jaWZkZWYgQkZEX0hFQURFUlMKLSAgICBiZmRfc2VlayAoc3Rkb3V0cHV0LCAwLCAwKTsKLSAgICBiZmRfd3JpdGUgKHRoZV9vYmplY3RfZmlsZSwgMSwgb2JqZWN0X2ZpbGVfc2l6ZSwgc3Rkb3V0cHV0KTsKLSNlbHNlCi0KLSAgICAvKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZSAqLwotICAgIG91dHB1dF9maWxlX2FwcGVuZCAodGhlX29iamVjdF9maWxlLCBvYmplY3RfZmlsZV9zaXplLCBvdXRfZmlsZV9uYW1lKTsKLSAgICBmcmVlICh0aGVfb2JqZWN0X2ZpbGUpOwotI2VuZGlmCi0gIH0JCQkJLyogbm9uIHZtcyBvdXRwdXQgKi8KLSNlbHNlIC8qIE9CSl9WTVMgKi8KLSAgLyoKLSAgICoJTm93IGRvIHRoZSBWTVMtZGVwZW5kZW50IHBhcnQgb2Ygd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUKLSAgICovCi0gIHZtc193cml0ZV9vYmplY3RfZmlsZSAoSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyksCi0JCQkgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycyksCi0JCQkgSF9HRVRfQlNTX1NJWkUgKCZoZWFkZXJzKSwKLQkJCSB0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QpOwotI2VuZGlmIC8qIE9CSl9WTVMgKi8KLSNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotICAvKiBSZXNvbHZlIHN5bWJvbCB2YWx1ZXMuICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHByb2Nlc3NpbmcKLSAgICAgdGhlIHJlbG9jYXRpb25zLiAgKi8KLSAgaWYgKHN5bWJvbF9yb290UCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1wOwotCi0gICAgICBmb3IgKHN5bXAgPSBzeW1ib2xfcm9vdFA7IHN5bXA7IHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0JcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bXAsIDEpOwotICAgIH0KLSAgcmVzb2x2ZV9sb2NhbF9zeW1ib2xfdmFsdWVzICgpOwotCi0gIFBST0dSRVNTICgxKTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci0gIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci0gIG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKTsKLSNlbmRpZgotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBhZGp1c3RfcmVsb2Nfc3ltcywgKGNoYXIgKikwKTsKLQotICAvKiBTZXQgdXAgc3ltYm9sIHRhYmxlLCBhbmQgd3JpdGUgaXQgb3V0LiAgKi8KLSAgaWYgKHN5bWJvbF9yb290UCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1wOwotCi0gICAgICBmb3IgKHN5bXAgPSBzeW1ib2xfcm9vdFA7IHN5bXA7IHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0JewotCSAgaW50IHB1bnQgPSAwOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKHN5bWJvbF9tcmlfY29tbW9uX3AgKHN5bXApKQotCSAgICB7Ci0JICAgICAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bXApKQotCQlhc19iYWQgKF8oIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIpLAotCQkJU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bXAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIG5hbWUgPSBTX0dFVF9OQU1FIChzeW1wKTsKLQkgIGlmIChuYW1lKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTIgPSBkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAoKGNoYXIgKilTX0dFVF9OQU1FIChzeW1wKSk7Ci0JICAgICAgLyogVGhleSBvbmx5IGRpZmZlciBpZiBgbmFtZScgaXMgYSBmYiBvciBkb2xsYXIgbG9jYWwKLQkJIGxhYmVsIG5hbWUuICAqLwotCSAgICAgIGlmIChuYW1lMiAhPSBuYW1lICYmICEgU19JU19ERUZJTkVEIChzeW1wKSkKLQkJYXNfYmFkIChfKCJsb2NhbCBsYWJlbCAlcyBpcyBub3QgZGVmaW5lZCIpLCBuYW1lMik7Ci0JICAgIH0KLQotCSAgLyogRG8gaXQgYWdhaW4sIGJlY2F1c2UgYWRqdXN0X3JlbG9jX3N5bXMgbWlnaHQgaW50cm9kdWNlCi0JICAgICBtb3JlIHN5bWJvbHMuICBUaGV5J2xsIHByb2JhYmx5IG9ubHkgYmUgc2VjdGlvbiBzeW1ib2xzLAotCSAgICAgYnV0IHRoZXknbGwgc3RpbGwgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZXMgY29tcHV0ZWQuICAqLwotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bXAsIDEpOwotCi0JICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLSAgICAgICAgICAgICBzeW1ib2xzLiAgKi8KLQkgIGlmIChzeW1ib2xfZXF1YXRlZF9wIChzeW1wKQotCSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltcCkgfHwgU19JU19DT01NT04gKHN5bXApKSkKLQkgICAgewotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bXAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFNvIGZhciwgY29tbW9uIHN5bWJvbHMgaGF2ZSBiZWVuIHRyZWF0ZWQgbGlrZSB1bmRlZmluZWQgc3ltYm9scy4KLQkgICAgIFB1dCB0aGVtIGluIHRoZSBjb21tb24gc2VjdGlvbiBub3cuICAqLwotCSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltcCkgPT0gMAotCSAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW1wKSAhPSAwKQotCSAgICBTX1NFVF9TRUdNRU5UIChzeW1wLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLSNpZiAwCi0JICBwcmludGYgKCJzeW1ib2wgYCVzJ1xuXHRAJXg6IHZhbHVlPSVkIGZsYWdzPSV4IHNlZz0lc1xuIiwKLQkJICBTX0dFVF9OQU1FIChzeW1wKSwgc3ltcCwKLQkJICBTX0dFVF9WQUxVRSAoc3ltcCksCi0JCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncywKLQkJICBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bXApKSk7Ci0jZW5kaWYKLQotI2lmZGVmIG9ial9mcm9iX3N5bWJvbAotCSAgb2JqX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KTsKLSNlbmRpZgotI2lmZGVmIHRjX2Zyb2Jfc3ltYm9sCi0JICBpZiAoISBwdW50IHx8IHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHN5bXApKQotCSAgICB0Y19mcm9iX3N5bWJvbCAoc3ltcCwgcHVudCk7Ci0jZW5kaWYKLQotCSAgLyogSWYgd2UgZG9uJ3Qgd2FudCB0byBrZWVwIHRoaXMgc3ltYm9sLCBzcGxpY2UgaXQgb3V0IG9mCi0JICAgICB0aGUgY2hhaW4gbm93LiAgSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgMCwgd2UgbmV2ZXIKLQkgICAgIHdhbnQgc2VjdGlvbiBzeW1ib2xzLiAgT3RoZXJ3aXNlLCB3ZSBza2lwIGxvY2FsIHN5bWJvbHMKLQkgICAgIGFuZCBzeW1ib2xzIHRoYXQgdGhlIGZyb2Jfc3ltYm9sIG1hY3JvcyB0b2xkIHVzIHRvIHB1bnQsCi0JICAgICBidXQgd2Uga2VlcCBzdWNoIHN5bWJvbHMgaWYgdGhleSBhcmUgdXNlZCBpbiByZWxvY3MuICAqLwotCSAgaWYgKCghIEVNSVRfU0VDVElPTl9TWU1CT0xTCi0JICAgICAgICYmIHN5bWJvbF9zZWN0aW9uX3AgKHN5bXApKQotCSAgICAgIC8qIE5vdGUgdGhhdCBTX0lTX0VYVEVSTiBhbmQgU19JU19MT0NBTCBhcmUgbm90IGFsd2F5cwotCQkgb3Bwb3NpdGVzLiAgU29tZXRpbWVzIHRoZSBmb3JtZXIgY2hlY2tzIGZsYWdzIGFuZCB0aGUKLQkJIGxhdHRlciBleGFtaW5lcyB0aGUgbmFtZS4uLiAgKi8KLQkgICAgICB8fCAoIVNfSVNfRVhURVJOIChzeW1wKQotCQkgICYmIChTX0lTX0xPQ0FMIChzeW1wKSB8fCBwdW50KQotCQkgICYmICEgc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCAoc3ltcCkpKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltcCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgLyogQWZ0ZXIgc3ltYm9sX3JlbW92ZSwgc3ltYm9sX25leHQoc3ltcCkgc3RpbGwgcmV0dXJucwotCQkgdGhlIG9uZSB0aGF0IGNhbWUgYWZ0ZXIgaXQgaW4gdGhlIGNoYWluLiAgU28gd2UgZG9uJ3QKLQkJIG5lZWQgdG8gZG8gYW55IGV4dHJhIGNsZWFudXAgd29yayBoZXJlLiAgKi8KLQotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB3ZSByZWFsbHkgZ290IGEgdmFsdWUgZm9yIHRoZSBzeW1ib2wuICAqLwotCSAgaWYgKCEgc3ltYm9sX3Jlc29sdmVkX3AgKHN5bXApKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJjYW4ndCByZXNvbHZlIHZhbHVlIGZvciBzeW1ib2wgXCIlc1wiIiksCi0JCSAgICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkgICAgICBzeW1ib2xfbWFya19yZXNvbHZlZCAoc3ltcCk7Ci0JICAgIH0KLQotCSAgLyogU2V0IHRoZSB2YWx1ZSBpbnRvIHRoZSBCRkQgc3ltYm9sLiAgVXAgdGlsIG5vdyB0aGUgdmFsdWUKLQkgICAgIGhhcyBvbmx5IGJlZW4ga2VwdCBpbiB0aGUgZ2FzIHN5bWJvbFMgc3RydWN0LiAgKi8KLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+dmFsdWUgPSBTX0dFVF9WQUxVRSAoc3ltcCk7Ci0JfQotICAgIH0KLQotICBQUk9HUkVTUyAoMSk7Ci0KLSAgLyogTm93IGRvIGFueSBmb3JtYXQtc3BlY2lmaWMgYWRqdXN0bWVudHMgdG8gdGhlIHN5bWJvbCB0YWJsZSwgc3VjaAotICAgICBhcyBhZGRpbmcgZmlsZSBzeW1ib2xzLiAgKi8KLSNpZmRlZiB0Y19hZGp1c3Rfc3ltdGFiCi0gIHRjX2FkanVzdF9zeW10YWIgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfYWRqdXN0X3N5bXRhYgotICBvYmpfYWRqdXN0X3N5bXRhYiAoKTsKLSNlbmRpZgotCi0gIC8qIE5vdyB0aGF0IGFsbCB0aGUgc2l6ZXMgYXJlIGtub3duLCBhbmQgY29udGVudHMgY29ycmVjdCwgd2UgY2FuCi0gICAgIHN0YXJ0IHdyaXRpbmcgdG8gdGhlIGZpbGUuICAqLwotICBzZXRfc3ltdGFiICgpOwotCi0gIC8qIElmICpfZnJvYl9maWxlIGNoYW5nZXMgdGhlIHN5bWJvbCB2YWx1ZSBhdCB0aGlzIHBvaW50LCBpdCBpcwotICAgICByZXNwb25zaWJsZSBmb3IgbW92aW5nIHRoZSBjaGFuZ2VkIHZhbHVlIGludG8gc3ltcC0+YnN5bS0+dmFsdWUKLSAgICAgYXMgd2VsbC4gIEhvcGVmdWxseSBhbGwgc3ltYm9sIHZhbHVlIGNoYW5naW5nIGNhbiBiZSBkb25lIGluCi0gICAgICpfZnJvYl9zeW1ib2wuICAqLwotI2lmZGVmIHRjX2Zyb2JfZmlsZQotICB0Y19mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9maWxlCi0gIG9ial9mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgd3JpdGVfcmVsb2NzLCAoY2hhciAqKSAwKTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLSAgdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0gIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpOwotI2VuZGlmCi0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHdyaXRlX2NvbnRlbnRzLCAoY2hhciAqKSAwKTsKLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi19Ci0jZW5kaWYgLyogISBCRkQgKi8KLQotLyoKLSAqCQkJcmVsYXhfc2VnbWVudCgpCi0gKgotICogTm93IHdlIGhhdmUgYSBzZWdtZW50LCBub3QgYSBjcm93ZCBvZiBzdWItc2VnbWVudHMsIHdlIGNhbiBtYWtlIGZyX2FkZHJlc3MKLSAqIHZhbHVlcy4KLSAqCi0gKiBSZWxheCB0aGUgZnJhZ3MuCi0gKgotICogQWZ0ZXIgdGhpcywgYWxsIGZyYWdzIGluIHRoaXMgc2VnbWVudCBoYXZlIGFkZHJlc3NlcyB0aGF0IGFyZSBjb3JyZWN0Ci0gKiB3aXRoaW4gdGhlIHNlZ21lbnQuIFNpbmNlIHNlZ21lbnRzIGxpdmUgaW4gZGlmZmVyZW50IGZpbGUgYWRkcmVzc2VzLAotICogdGhlc2UgZnJhZyBhZGRyZXNzZXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyBmaW5hbCBvYmplY3QtZmlsZSBhZGRyZXNzZXMuCi0gKi8KLQotI2lmZGVmIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKLQotc3RhdGljIGludCBpc19kbnJhbmdlIFBBUkFNUyAoKGZyYWdTICosIGZyYWdTICopKTsKLQotLyogU3Vicm91dGluZXMgb2YgcmVsYXhfc2VnbWVudC4gICovCi1zdGF0aWMgaW50Ci1pc19kbnJhbmdlIChmMSwgZjIpCi0gICAgIGZyYWdTICpmMTsKLSAgICAgZnJhZ1MgKmYyOwotewotICBmb3IgKDsgZjE7IGYxID0gZjEtPmZyX25leHQpCi0gICAgaWYgKGYxLT5mcl9uZXh0ID09IGYyKQotICAgICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZWxheCBhIGZyYWdtZW50IGJ5IHNjYW5uaW5nIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUuICAqLwotCi1sb25nCi1yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBsb25nIHN0cmV0Y2g7Ci17Ci0gIGNvbnN0IHJlbGF4X3R5cGVTICp0aGlzX3R5cGU7Ci0gIGNvbnN0IHJlbGF4X3R5cGVTICpzdGFydF90eXBlOwotICByZWxheF9zdWJzdGF0ZVQgbmV4dF9zdGF0ZTsKLSAgcmVsYXhfc3Vic3RhdGVUIHRoaXNfc3RhdGU7Ci0gIGxvbmcgYWltLCB0YXJnZXQsIGdyb3d0aDsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0gIGxvbmcgb2Zmc2V0ID0gZnJhZ1AtPmZyX29mZnNldDsKLSAgLyogUmVjb21wdXRlIHdhc19hZGRyZXNzIGJ5IHVuZG9pbmcgIis9IHN0cmV0Y2giIGRvbmUgYnkgcmVsYXhfc2VnbWVudC4gICovCi0gIHVuc2lnbmVkIGxvbmcgd2FzX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyAtIHN0cmV0Y2g7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzOwotICBjb25zdCByZWxheF90eXBlUyAqdGFibGUgPSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFOwotCi0gIHRoaXNfc3RhdGUgPSBmcmFnUC0+ZnJfc3VidHlwZTsKLSAgc3RhcnRfdHlwZSA9IHRoaXNfdHlwZSA9IHRhYmxlICsgdGhpc19zdGF0ZTsKLSAgdGFyZ2V0ID0gb2Zmc2V0OwotCi0gIGlmIChzeW1ib2xQKQotICAgIHsKLSNpZm5kZWYgRElGRl9FWFBSX09LCi0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICAgICAga25vdyAoKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19BQlNPTFVURSkKLQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKQotCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0JTUykKLQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19URVhUKSk7Ci0jZW5kaWYKLSAgICAgIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcpOwotI2VuZGlmCi0gICAgICBrbm93ICghKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHx8IHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHRhcmdldCArPQlTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzOwotCi0gICAgICAvKiBJZiBmcmFnIGhhcyB5ZXQgdG8gYmUgcmVhY2hlZCBvbiB0aGlzIHBhc3MsCi0JIGFzc3VtZSBpdCB3aWxsIG1vdmUgYnkgU1RSRVRDSCBqdXN0IGFzIHdlIGRpZC4KLQkgSWYgdGhpcyBpcyBub3Qgc28sIGl0IHdpbGwgYmUgYmVjYXVzZSBzb21lIGZyYWcKLQkgYmV0d2VlbiBncm93cywgYW5kIHRoYXQgd2lsbCBmb3JjZSBhbm90aGVyIHBhc3MuCi0KLQkgQmV3YXJlIHplcm8tbGVuZ3RoIGZyYWdzLgotCi0JIFRoZXJlIHNob3VsZCBiZSBhIGZhc3RlciB3YXkgdG8gZG8gdGhpcy4gICovCi0KLSAgICAgIGlmIChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzID49IHdhc19hZGRyZXNzCi0JICAmJiBpc19kbnJhbmdlIChmcmFnUCwgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSkpCi0JewotCSAgdGFyZ2V0ICs9IHN0cmV0Y2g7Ci0JfQotICAgIH0KLQotICBhaW0gPSB0YXJnZXQgLSBhZGRyZXNzIC0gZnJhZ1AtPmZyX2ZpeDsKLSNpZmRlZiBUQ19QQ1JFTF9BREpVU1QKLSAgLyogQ3VycmVudGx5IG9ubHkgdGhlIG5zMzJrIGZhbWlseSBuZWVkcyB0aGlzICovCi0gIGFpbSArPSBUQ19QQ1JFTF9BREpVU1QoZnJhZ1ApOwotLyojZWxzZSovCi0gIC8qIFRoaXMgbWFjaGluZSBkb2Vzbid0IHdhbnQgdG8gdXNlIHBjcmVsX2FkanVzdC4KLSAgICAgSW4gdGhhdCBjYXNlLCBwY3JlbF9hZGp1c3Qgc2hvdWxkIGJlIHplcm8uICAqLwotLyogIGFzc2VydCAoZnJhZ1AtPmZyX3RhcmcubnMzMmsucGNyZWxfYWRqdXN0ID09IDApOyovCi0jZW5kaWYKLSNpZmRlZiBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gLyogZm9ybWVybHkgY2FsbGVkIE02OEtfQUlNX0tMVURHRSAqLwotICBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSk7Ci0jZW5kaWYKLQotICBpZiAoYWltIDwgMCkKLSAgICB7Ci0gICAgICAvKiBMb29rIGJhY2t3YXJkcy4gKi8KLSAgICAgIGZvciAobmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7IG5leHRfc3RhdGU7KQotCWlmIChhaW0gPj0gdGhpc190eXBlLT5ybHhfYmFja3dhcmQpCi0JICBuZXh0X3N0YXRlID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIC8qIEdyb3cgdG8gbmV4dCBzdGF0ZS4gKi8KLQkgICAgdGhpc19zdGF0ZSA9IG5leHRfc3RhdGU7Ci0JICAgIHRoaXNfdHlwZSA9IHRhYmxlICsgdGhpc19zdGF0ZTsKLQkgICAgbmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7Ci0JICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTG9vayBmb3J3YXJkcy4gKi8KLSAgICAgIGZvciAobmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7IG5leHRfc3RhdGU7KQotCWlmIChhaW0gPD0gdGhpc190eXBlLT5ybHhfZm9yd2FyZCkKLQkgIG5leHRfc3RhdGUgPSAwOwotCWVsc2UKLQkgIHsKLQkgICAgLyogR3JvdyB0byBuZXh0IHN0YXRlLiAqLwotCSAgICB0aGlzX3N0YXRlID0gbmV4dF9zdGF0ZTsKLQkgICAgdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOwotCSAgICBuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsKLQkgIH0KLSAgICB9Ci0KLSAgZ3Jvd3RoID0gdGhpc190eXBlLT5ybHhfbGVuZ3RoIC0gc3RhcnRfdHlwZS0+cmx4X2xlbmd0aDsKLSAgaWYgKGdyb3d0aCAhPSAwKQotICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gdGhpc19zdGF0ZTsKLSAgcmV0dXJuIGdyb3d0aDsKLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpICovCi0KLS8qIFJlbGF4X2FsaWduLiBBZHZhbmNlIGxvY2F0aW9uIGNvdW50ZXIgdG8gbmV4dCBhZGRyZXNzIHRoYXQgaGFzICdhbGlnbm1lbnQnCi0gICBsb3dlc3Qgb3JkZXIgYml0cyBhbGwgMHMsIHJldHVybiBzaXplIG9mIGFkanVzdG1lbnQgbWFkZS4gICovCi1zdGF0aWMgcmVsYXhfYWRkcmVzc1QKLXJlbGF4X2FsaWduIChhZGRyZXNzLCBhbGlnbm1lbnQpCi0gICAgIHJlZ2lzdGVyIHJlbGF4X2FkZHJlc3NUIGFkZHJlc3M7CS8qIEFkZHJlc3Mgbm93LiAqLwotICAgICByZWdpc3RlciBpbnQgYWxpZ25tZW50OwkvKiBBbGlnbm1lbnQgKGJpbmFyeSkuICovCi17Ci0gIHJlbGF4X2FkZHJlc3NUIG1hc2s7Ci0gIHJlbGF4X2FkZHJlc3NUIG5ld19hZGRyZXNzOwotCi0gIG1hc2sgPSB+KCh+MCkgPDwgYWxpZ25tZW50KTsKLSAgbmV3X2FkZHJlc3MgPSAoYWRkcmVzcyArIG1hc2spICYgKH5tYXNrKTsKLSNpZmRlZiBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZCi0gIGlmIChsaW5rcmVsYXgpCi0gICAgLyogV2UgbXVzdCBwcm92aWRlIGxvdHMgb2YgcGFkZGluZywgc28gdGhlIGxpbmtlciBjYW4gZGlzY2FyZCBpdAotICAgICAgIHdoZW4gbmVlZGVkLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBhZGQgZXh0cmEgc3BhY2UsIGV2ZXIuICAqLwotICAgIG5ld19hZGRyZXNzICs9ICgxIDw8IGFsaWdubWVudCk7Ci0jZW5kaWYKLSAgcmV0dXJuIChuZXdfYWRkcmVzcyAtIGFkZHJlc3MpOwotfQotCi12b2lkCi1yZWxheF9zZWdtZW50IChzZWdtZW50X2ZyYWdfcm9vdCwgc2VnbWVudCkKLSAgICAgc3RydWN0IGZyYWcgKnNlZ21lbnRfZnJhZ19yb290OwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBmcmFnICpmcmFnUDsKLSAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsKLSNpZiAhZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGtub3cgKHNlZ21lbnQgPT0gU0VHX0RBVEEgfHwgc2VnbWVudCA9PSBTRUdfVEVYVCB8fCBzZWdtZW50ID09IFNFR19CU1MpOwotI2VuZGlmCi0gIC8qIEluIGNhc2UgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSB3YW50cyB0byBtYWtlIGZpeFNzLiAqLwotICBzdWJzZWdfY2hhbmdlIChzZWdtZW50LCAwKTsKLQotICAvKiBGb3IgZWFjaCBmcmFnIGluIHNlZ21lbnQ6IGNvdW50IGFuZCBzdG9yZSAgKGEgMXN0IGd1ZXNzIG9mKQotICAgICBmcl9hZGRyZXNzLiAgKi8KLSAgYWRkcmVzcyA9IDA7Ci0gIGZvciAoZnJhZ1AgPSBzZWdtZW50X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgZnJhZ1AtPmZyX2FkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgYWRkcmVzcyArPSBmcmFnUC0+ZnJfZml4OwotCi0gICAgICBzd2l0Y2ggKGZyYWdQLT5mcl90eXBlKQotCXsKLQljYXNlIHJzX2ZpbGw6Ci0JICBhZGRyZXNzICs9IGZyYWdQLT5mcl9vZmZzZXQgKiBmcmFnUC0+ZnJfdmFyOwotCSAgYnJlYWs7Ci0KLQljYXNlIHJzX2FsaWduOgotCWNhc2UgcnNfYWxpZ25fY29kZToKLQkgIHsKLQkgICAgYWRkcmVzc1Qgb2Zmc2V0ID0gcmVsYXhfYWxpZ24gKGFkZHJlc3MsIChpbnQpIGZyYWdQLT5mcl9vZmZzZXQpOwotCi0JICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSAhPSAwICYmIG9mZnNldCA+IGZyYWdQLT5mcl9zdWJ0eXBlKQotCSAgICAgIG9mZnNldCA9IDA7Ci0KLQkgICAgaWYgKG9mZnNldCAlIGZyYWdQLT5mcl92YXIgIT0gMCkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiYWxpZ25tZW50IHBhZGRpbmcgKCVsdSBieXRlcykgbm90IGEgbXVsdGlwbGUgb2YgJWxkIiksCi0JCQkodW5zaWduZWQgbG9uZykgb2Zmc2V0LCAobG9uZykgZnJhZ1AtPmZyX3Zhcik7Ci0JCW9mZnNldCAtPSAob2Zmc2V0ICUgZnJhZ1AtPmZyX3Zhcik7Ci0JICAgICAgfQotCi0JICAgIGFkZHJlc3MgKz0gb2Zmc2V0OwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIHJzX29yZzoKLQljYXNlIHJzX3NwYWNlOgotCSAgLyogQXNzdW1lIC5vcmcgaXMgbnVnYXRvcnkuIEl0IHdpbGwgZ3JvdyB3aXRoIDFzdCByZWxheC4gICovCi0JICBicmVhazsKLQotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBhZGRyZXNzICs9IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCk7Ci0JICBicmVhazsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0JICAvKiBCcm9rZW4gd29yZHMgZG9uJ3QgY29uY2VybiB1cyB5ZXQgKi8KLQljYXNlIHJzX2Jyb2tlbl93b3JkOgotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgcnNfbGViMTI4OgotCSAgLyogSW5pdGlhbCBndWVzcyBpcyBhbHdheXMgMTsgZG9pbmcgb3RoZXJ3aXNlIGNhbiByZXN1bHQgaW4gCi0JICAgICBzdGFibGUgc29sdXRpb25zIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtLiAgKi8KLQkgIGFkZHJlc3MgKz0gZnJhZ1AtPmZyX29mZnNldCA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgcnNfY2ZhOgotCSAgYWRkcmVzcyArPSBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1ApOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLQkgIGJyZWFrOwotCX0JCQkvKiBzd2l0Y2goZnJfdHlwZSkgKi8KLSAgICB9CQkJCS8qIGZvciBlYWNoIGZyYWcgaW4gdGhlIHNlZ21lbnQgKi8KLQotICAvKiBEbyByZWxheCgpLiAgKi8KLSAgewotICAgIGxvbmcgc3RyZXRjaDsJLyogTWF5IGJlIGFueSBzaXplLCAwIG9yIG5lZ2F0aXZlLiAqLwotICAgIC8qIEN1bXVsYXRpdmUgbnVtYmVyIG9mIGFkZHJlc3NlcyB3ZSBoYXZlICovCi0gICAgLyogcmVsYXhlZCB0aGlzIHBhc3MuICovCi0gICAgLyogV2UgbWF5IGhhdmUgcmVsYXhlZCBtb3JlIHRoYW4gb25lIGFkZHJlc3MuICovCi0gICAgbG9uZyBzdHJldGNoZWQ7CS8qIEhhdmUgd2Ugc3RyZXRjaGVkIG9uIHRoaXMgcGFzcz8gKi8KLSAgICAvKiBUaGlzIGlzICdjdXogc3RyZXRjaCBtYXkgYmUgemVybywgd2hlbiwgaW4gZmFjdCBzb21lIHBpZWNlIG9mIGNvZGUKLSAgICAgICBncmV3LCBhbmQgYW5vdGhlciBzaHJhbmsuICBJZiBhIGJyYW5jaCBpbnN0cnVjdGlvbiBkb2Vzbid0IGZpdCBhbnltb3JlLAotICAgICAgIHdlIGNvdWxkIGJlIHNjcm9kLiAgKi8KLQotICAgIGRvCi0gICAgICB7Ci0Jc3RyZXRjaCA9IHN0cmV0Y2hlZCA9IDA7Ci0JZm9yIChmcmFnUCA9IHNlZ21lbnRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLQkgIHsKLQkgICAgbG9uZyBncm93dGggPSAwOwotCSAgICBhZGRyZXNzVCB3YXNfYWRkcmVzczsKLQkgICAgb2Zmc2V0VCBvZmZzZXQ7Ci0JICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLQkgICAgd2FzX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzczsKLQkgICAgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICs9IHN0cmV0Y2g7Ci0JICAgIHN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOwotCSAgICBvZmZzZXQgPSBmcmFnUC0+ZnJfb2Zmc2V0OwotCi0JICAgIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgcnNfZmlsbDoJLyogLmZpbGwgbmV2ZXIgcmVsYXhlcy4gKi8KLQkJZ3Jvd3RoID0gMDsKLQkJYnJlYWs7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotCQkvKiBKRjogIFRoaXMgaXMgUk1TJ3MgaWRlYS4gIEkgZG8gKk5PVCogd2FudCB0byBiZSBibGFtZWQKLQkJICAgZm9yIGl0IEkgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQuICBJIGRvIG5vdCB3YW50IHRvIGhhdmUKLQkJICAgYW55dGhpbmcgdG8gZG8gd2l0aCBpdC4gIFRoaXMgaXMgbm90IHRoZSBwcm9wZXIgd2F5IHRvCi0JCSAgIGltcGxlbWVudCB0aGlzIG1pc2ZlYXR1cmUuICAqLwotCSAgICAgIGNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0JCXsKLQkJICBzdHJ1Y3QgYnJva2VuX3dvcmQgKmxpZTsKLQkJICBzdHJ1Y3QgYnJva2VuX3dvcmQgKnVudHJ1dGg7Ci0KLQkJICAvKiBZZXMgdGhpcyBpcyB1Z2x5IChzdG9yaW5nIHRoZSBicm9rZW5fd29yZCBwb2ludGVyCi0JCSAgICAgaW4gdGhlIHN5bWJvbCBzbG90KS4gIFN0aWxsLCB0aGlzIHdob2xlIGNodW5rIG9mCi0JCSAgICAgY29kZSBpcyB1Z2x5LCBhbmQgSSBkb24ndCBmZWVsIGxpa2UgZG9pbmcgYW55dGhpbmcKLQkJICAgICBhYm91dCBpdC4gIFRoaW5rIG9mIGl0IGFzIHN0dWJib3JubmVzcyBpbiBhY3Rpb24uICAqLwotCQkgIGdyb3d0aCA9IDA7Ci0JCSAgZm9yIChsaWUgPSAoc3RydWN0IGJyb2tlbl93b3JkICopIChmcmFnUC0+ZnJfc3ltYm9sKTsKLQkJICAgICAgIGxpZSAmJiBsaWUtPmRpc3BmcmFnID09IGZyYWdQOwotCQkgICAgICAgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQotCQkgICAgewotCi0JCSAgICAgIGlmIChsaWUtPmFkZGVkKQotCQkJY29udGludWU7Ci0KLQkJICAgICAgb2Zmc2V0ID0gKHN5bWJvbF9nZXRfZnJhZyAobGllLT5hZGQpLT5mcl9hZGRyZXNzCi0JCQkJKyBTX0dFVF9WQUxVRSAobGllLT5hZGQpCi0JCQkJKyBsaWUtPmFkZG51bQotCQkJCS0gKHN5bWJvbF9nZXRfZnJhZyAobGllLT5zdWIpLT5mcl9hZGRyZXNzCi0JCQkJICAgKyBTX0dFVF9WQUxVRSAobGllLT5zdWIpKSk7Ci0JCSAgICAgIGlmIChvZmZzZXQgPD0gLTMyNzY4IHx8IG9mZnNldCA+PSAzMjc2NykKLQkJCXsKLQkJCSAgaWYgKGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQpCi0JCQkgICAgewotCQkJICAgICAgY2hhciBidWZbNTBdOwotCQkJICAgICAgc3ByaW50X3ZhbHVlIChidWYsIChhZGRyZXNzVCkgbGllLT5hZGRudW0pOwotCQkJICAgICAgYXNfd2FybiAoXygiLndvcmQgJXMtJXMrJXMgZGlkbid0IGZpdCIpLAotCQkJCSAgICAgICBTX0dFVF9OQU1FIChsaWUtPmFkZCksCi0JCQkJICAgICAgIFNfR0VUX05BTUUgKGxpZS0+c3ViKSwKLQkJCQkgICAgICAgYnVmKTsKLQkJCSAgICB9Ci0JCQkgIGxpZS0+YWRkZWQgPSAxOwotCQkJICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBmcmFnUC0+ZnJfc3VidHlwZSsrOwotCQkJICAgICAgZ3Jvd3RoICs9IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQkJCSAgICB9Ci0JCQkgIGZvciAodW50cnV0aCA9IGxpZS0+bmV4dF9icm9rZW5fd29yZDsKLQkJCSAgICAgICB1bnRydXRoICYmIHVudHJ1dGgtPmRpc3BmcmFnID09IGxpZS0+ZGlzcGZyYWc7Ci0JCQkgICAgICAgdW50cnV0aCA9IHVudHJ1dGgtPm5leHRfYnJva2VuX3dvcmQpCi0JCQkgICAgaWYgKChzeW1ib2xfZ2V0X2ZyYWcgKHVudHJ1dGgtPmFkZCkKLQkJCQkgPT0gc3ltYm9sX2dldF9mcmFnIChsaWUtPmFkZCkpCi0JCQkJJiYgKFNfR0VUX1ZBTFVFICh1bnRydXRoLT5hZGQpCi0JCQkJICAgID09IFNfR0VUX1ZBTFVFIChsaWUtPmFkZCkpKQotCQkJICAgICAgewotCQkJCXVudHJ1dGgtPmFkZGVkID0gMjsKLQkJCQl1bnRydXRoLT51c2VfanVtcCA9IGxpZTsKLQkJCSAgICAgIH0KLQkJCSAgZ3Jvd3RoICs9IG1kX2xvbmdfanVtcF9zaXplOwotCQkJfQotCQkgICAgfQotCi0JCSAgYnJlYWs7Ci0JCX0JCS8qIGNhc2UgcnNfYnJva2VuX3dvcmQgKi8KLSNlbmRpZgotCSAgICAgIGNhc2UgcnNfYWxpZ246Ci0JICAgICAgY2FzZSByc19hbGlnbl9jb2RlOgotCQl7Ci0JCSAgYWRkcmVzc1Qgb2xkb2ZmLCBuZXdvZmY7Ci0KLQkJICBvbGRvZmYgPSByZWxheF9hbGlnbiAod2FzX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4LAotCQkJCQkoaW50KSBvZmZzZXQpOwotCQkgIG5ld29mZiA9IHJlbGF4X2FsaWduIChhZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCwKLQkJCQkJKGludCkgb2Zmc2V0KTsKLQotCQkgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAob2xkb2ZmID4gZnJhZ1AtPmZyX3N1YnR5cGUpCi0JCQlvbGRvZmYgPSAwOwotCQkgICAgICBpZiAobmV3b2ZmID4gZnJhZ1AtPmZyX3N1YnR5cGUpCi0JCQluZXdvZmYgPSAwOwotCQkgICAgfQotCi0JCSAgZ3Jvd3RoID0gbmV3b2ZmIC0gb2xkb2ZmOwotCQl9Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSByc19vcmc6Ci0JCXsKLQkJICBsb25nIHRhcmdldCA9IG9mZnNldDsKLQkJICBsb25nIGFmdGVyOwotCi0JCSAgaWYgKHN5bWJvbFApCi0JCSAgICB7Ci0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotCQkgICAgICBrbm93ICgoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0FCU09MVVRFKQotCQkJICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkKLQkJCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX1RFWFQpCi0JCQkgICAgfHwgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0JTUyk7Ci0JCSAgICAgIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcpOwotCQkgICAgICBrbm93ICghKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19BQlNPTFVURSkKLQkJCSAgICB8fCAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSNlbmRpZgotCQkgICAgICB0YXJnZXQgKz0gKFNfR0VUX1ZBTFVFIChzeW1ib2xQKQotCQkJCSArIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX2FkZHJlc3MpOwotCQkgICAgfQkJLyogaWYgd2UgaGF2ZSBhIHN5bWJvbCAqLwotCi0JCSAga25vdyAoZnJhZ1AtPmZyX25leHQpOwotCQkgIGFmdGVyID0gZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3M7Ci0JCSAgZ3Jvd3RoID0gdGFyZ2V0IC0gYWZ0ZXI7Ci0JCSAgaWYgKGdyb3d0aCA8IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIEdyb3d0aCBtYXkgYmUgbmVnYXRpdmUsIGJ1dCB2YXJpYWJsZSBwYXJ0IG9mIGZyYWcKLQkJCSBjYW5ub3QgaGF2ZSBmZXdlciB0aGFuIDAgY2hhcnMuICBUaGF0IGlzLCB3ZSBjYW4ndAotCQkJIC5vcmcgYmFja3dhcmRzLiAqLwotCQkgICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gLm9yZyBiYWNrd2FyZHMgaWdub3JlZCIpKTsKLQkJICAgICAgZ3Jvd3RoID0gMDsKLQkJICAgIH0KLQotCQkgIGdyb3d0aCAtPSBzdHJldGNoOwkvKiBUaGlzIGlzIGFuIGFic29sdXRlIGdyb3d0aCBmYWN0b3IgKi8KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgY2FzZSByc19zcGFjZToKLQkJaWYgKHN5bWJvbFApCi0JCSAgewotCQkgICAgZ3Jvd3RoID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCQkgICAgaWYgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgIT0gJnplcm9fYWRkcmVzc19mcmFnCi0JCQl8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkKLQkJCXx8ICEgU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkJICAgICAgYXNfYmFkX3doZXJlIChmcmFnUC0+ZnJfZmlsZSwgZnJhZ1AtPmZyX2xpbmUsCi0JCQkJICAgIF8oIi5zcGFjZSBzcGVjaWZpZXMgbm9uLWFic29sdXRlIHZhbHVlIikpOwotCQkgICAgZnJhZ1AtPmZyX3N5bWJvbCA9IDA7Ci0JCSAgICBpZiAoZ3Jvd3RoIDwgMCkKLQkJICAgICAgewotCQkJYXNfd2FybiAoXygiLnNwYWNlIG9yIC5maWxsIHdpdGggbmVnYXRpdmUgdmFsdWUsIGlnbm9yZWQiKSk7Ci0JCQlncm93dGggPSAwOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgZ3Jvd3RoID0gMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotI2lmZGVmIG1kX3JlbGF4X2ZyYWcKLQkJZ3Jvd3RoID0gbWRfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotI2Vsc2UKLSNpZmRlZiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFCi0JCS8qIFRoZSBkZWZhdWx0IHdheSB0byByZWxheCBhIGZyYWcgaXMgdG8gbG9vayB0aHJvdWdoCi0JCSAgIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUuICAqLwotCQlncm93dGggPSByZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCk7Ci0jZW5kaWYgLyogVENfR0VORVJJQ19SRUxBWF9UQUJMRSAqLwotI2VuZGlmCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSByc19sZWIxMjg6Ci0JCXsKLQkJICB2YWx1ZVQgdmFsdWU7Ci0JCSAgaW50IHNpemU7Ci0KLQkJICB2YWx1ZSA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmcmFnUC0+ZnJfc3ltYm9sLCAwKTsKLQkJICBzaXplID0gc2l6ZW9mX2xlYjEyOCAodmFsdWUsIGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQkJICBncm93dGggPSBzaXplIC0gZnJhZ1AtPmZyX29mZnNldDsKLQkJICBmcmFnUC0+ZnJfb2Zmc2V0ID0gc2l6ZTsKLQkJfQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgcnNfY2ZhOgotCQlncm93dGggPSBlaF9mcmFtZV9yZWxheF9mcmFnIChmcmFnUCk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoZ3Jvd3RoKQotCSAgICAgIHsKLQkJc3RyZXRjaCArPSBncm93dGg7Ci0JCXN0cmV0Y2hlZCsrOwotCSAgICAgIH0KLQkgIH0JCQkvKiBGb3IgZWFjaCBmcmFnIGluIHRoZSBzZWdtZW50LiAqLwotICAgICAgfQotICAgIHdoaWxlIChzdHJldGNoZWQpOwkJLyogVW50aWwgbm90aGluZyBmdXJ0aGVyIHRvIHJlbGF4LiAqLwotICB9CQkJCS8qIGRvX3JlbGF4ICovCi0KLSAgLyoKLSAgICogV2Ugbm93IGhhdmUgdmFsaWQgZnJfYWRkcmVzcydlcyBmb3IgZWFjaCBmcmFnLgotICAgKi8KLQotICAvKgotICAgKiBBbGwgZnJfYWRkcmVzcydzIGFyZSBjb3JyZWN0LCByZWxhdGl2ZSB0byB0aGVpciBvd24gc2VnbWVudC4KLSAgICogV2UgaGF2ZSBtYWRlIGFsbCB0aGUgZml4UyB3ZSB3aWxsIGV2ZXIgbWFrZS4KLSAgICovCi19CQkJCS8qIHJlbGF4X3NlZ21lbnQoKSAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkKLQotI2lmbmRlZiBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAKLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKFgpICgxKQotI2VuZGlmCi0KLS8qIGZpeHVwX3NlZ21lbnQoKQotCi0gICBHbyB0aHJvdWdoIGFsbCB0aGUgZml4UydzIGluIGEgc2VnbWVudCBhbmQgc2VlIHdoaWNoIG9uZXMgY2FuIGJlCi0gICBoYW5kbGVkIG5vdy4gIChUaGVzZSBjb25zaXN0IG9mIGZpeFMgd2hlcmUgd2UgaGF2ZSBzaW5jZSBkaXNjb3ZlcmVkCi0gICB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIG9yIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFnIGludm9sdmVkLikKLSAgIEZvciBlYWNoIG9uZSwgY2FsbCBtZF9hcHBseV9maXggdG8gcHV0IHRoZSBmaXggaW50byB0aGUgZnJhZyBkYXRhLgotCi0gICBSZXN1bHQgaXMgYSBjb3VudCBvZiBob3cgbWFueSByZWxvY2F0aW9uIHN0cnVjdHMgd2lsbCBiZSBuZWVkZWQgdG8KLSAgIGhhbmRsZSB0aGUgcmVtYWluaW5nIGZpeFMncyB0aGF0IHdlIGNvdWxkbid0IGNvbXBsZXRlbHkgaGFuZGxlIGhlcmUuCi0gICBUaGVzZSB3aWxsIGJlIG91dHB1dCBsYXRlciBieSBlbWl0X3JlbG9jYXRpb25zKCkuICAqLwotCi1zdGF0aWMgbG9uZwotZml4dXBfc2VnbWVudCAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZpeFMgKmZpeFA7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGU7CS8qIE5fVFlQRSBiaXRzIGZvciBzZWdtZW50LiAqLwotewotICBsb25nIHNlZ19yZWxvY19jb3VudCA9IDA7Ci0gIHN5bWJvbFMgKmFkZF9zeW1ib2xQOwotICBzeW1ib2xTICpzdWJfc3ltYm9sUDsKLSAgdmFsdWVUIGFkZF9udW1iZXI7Ci0gIGludCBzaXplOwotICBjaGFyICpwbGFjZTsKLSAgbG9uZyB3aGVyZTsKLSAgaW50IHBjcmVsLCBwbHQ7Ci0gIGZyYWdTICpmcmFnUDsKLSAgc2VnVCBhZGRfc3ltYm9sX3NlZ21lbnQgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCi0gIC8qIElmIHRoZSBsaW5rZXIgaXMgZG9pbmcgdGhlIHJlbGF4aW5nLCB3ZSBtdXN0IG5vdCBkbyBhbnkgZml4dXBzLgotCi0gICAgIFdlbGwsIHN0cmljdGx5IHNwZWFraW5nIHRoYXQncyBub3QgdHJ1ZSAtLSB3ZSBjb3VsZCBkbyBhbnkgdGhhdCBhcmUKLSAgICAgUEMtcmVsYXRpdmUgYW5kIGRvbid0IGNyb3NzIHJlZ2lvbnMgdGhhdCBjb3VsZCBjaGFuZ2Ugc2l6ZS4gIEFuZCBmb3IgdGhlCi0gICAgIGk5NjAgKHRoZSBvbmx5IG1hY2hpbmUgZm9yIHdoaWNoIHdlJ3ZlIGdvdCBhIHJlbGF4aW5nIGxpbmtlciByaWdodCBub3cpLAotICAgICB3ZSBtaWdodCBiZSBhYmxlIHRvIHR1cm4gY2FsbHgvY2FsbGogaW50byBiYWwgYW55d2F5cyBpbiBjYXNlcyB3aGVyZSB3ZQotICAgICBrbm93IHRoZSBtYXhpbXVtIGRpc3BsYWNlbWVudC4gICovCi0gIGlmIChsaW5rcmVsYXgpCi0gICAgewotICAgICAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotCXNlZ19yZWxvY19jb3VudCsrOwotICAgICAgVENfQURKVVNUX1JFTE9DX0NPVU5UIChmaXhQLCBzZWdfcmVsb2NfY291bnQpOwotICAgICAgcmV0dXJuIHNlZ19yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLQotI2lmZGVmIERFQlVHNQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5wcm9jZXNzaW5nIGZpeHVwOlxuIik7Ci0gICAgICBwcmludF9maXh1cCAoZml4UCk7Ci0jZW5kaWYKLQotCi0gICAgICBmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7Ci0gICAgICBrbm93IChmcmFnUCk7Ci0gICAgICB3aGVyZSA9IGZpeFAtPmZ4X3doZXJlOwotICAgICAgcGxhY2UgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICAgICAgc2l6ZSA9IGZpeFAtPmZ4X3NpemU7Ci0gICAgICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OwotI2lmZGVmIFRDX1ZBTElEQVRFX0ZJWAotICAgICAgVENfVkFMSURBVEVfRklYIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSwgc2tpcCk7Ci0jZW5kaWYKLSAgICAgIHN1Yl9zeW1ib2xQID0gZml4UC0+Znhfc3Vic3k7Ci0gICAgICBhZGRfbnVtYmVyID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLSAgICAgIHBsdCA9IGZpeFAtPmZ4X3BsdDsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwKLQkgICYmIHN5bWJvbF9tcmlfY29tbW9uX3AgKGFkZF9zeW1ib2xQKSkKLQl7Ci0JICBrbm93IChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JICBmaXhQLT5meF9vZmZzZXQgPSBhZGRfbnVtYmVyOwotCSAgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSA9Ci0JICAgIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoYWRkX3N5bWJvbFApLT5YX2FkZF9zeW1ib2w7Ci0JfQotCi0gICAgICBpZiAoYWRkX3N5bWJvbFApCi0JYWRkX3N5bWJvbF9zZWdtZW50ID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApOwotCi0gICAgICBpZiAoc3ViX3N5bWJvbFApCi0JewotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN1Yl9zeW1ib2xQLCAxKTsKLQkgIGlmIChhZGRfc3ltYm9sUCA9PSBOVUxMIHx8IGFkZF9zeW1ib2xfc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwpCi0JCXsKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JCSAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogSXQncyBqdXN0IC1zeW0gKi8KLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pCi0JCXsKLQkJICBhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocGNyZWwKLQkJICAgICAgICYmIFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSB0aGlzX3NlZ21lbnRfdHlwZSkKLQkJewotCQkgIC8qIFNob3VsZCB0cnkgY29udmVydGluZyB0byBhIGNvbnN0YW50LiAgKi8KLQkJICBnb3RvIGJhZF9zdWJfcmVsb2M7Ci0JCX0KLQkgICAgICBlbHNlCi0JICAgICAgYmFkX3N1Yl9yZWxvYzoKLQkJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgICAgXygiTmVnYXRpdmUgb2Ygbm9uLWFic29sdXRlIHN5bWJvbCAlcyIpLAotCQkJICAgICAgU19HRVRfTkFNRSAoc3ViX3N5bWJvbFApKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFkZF9zeW1ib2xfc2VnbWVudAotCQkgICAmJiBTRUdfTk9STUFMIChhZGRfc3ltYm9sX3NlZ21lbnQpKQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMgZnJvbSBzYW1lIHNlZ21lbnQuCi0JCSBDYW4ndCBtYWtlIGRpZmZlcmVuY2Ugb2YgMiB1bmRlZmluZWRzOiAndmFsdWUnIG1lYW5zCi0JCSBzb21ldGhpbmcgZGlmZmVyZW50IGZvciBOX1VOREYuICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIE1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBvZiAyIGFyYml0cmFyeSBzeW1ib2xzCi0JCSBhcyB0aGUgdGFyZ2V0IG9mIGEgY2FsbCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKGZpeFAtPmZ4X3RjYml0KQotCQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgICBfKCJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIDIgc3ltYm9scyIpKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApIC0KLQkJU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQotCSAgICAgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQkgICAgICBwY3JlbCA9IDA7CS8qIE5vIGZ1cnRoZXIgcGNyZWwgcHJvY2Vzc2luZy4gKi8KLQotCSAgICAgIC8qIExldCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWFrZSB0aGUgZmluYWwgZGV0ZXJtaW5hdGlvbgotCQkgYXMgdG8gd2hldGhlciBvciBub3QgYSByZWxvY2F0aW9uIHdpbGwgYmUgbmVlZGVkIHRvCi0JCSBoYW5kbGUgdGhpcyBmaXh1cC4gICovCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKSkKLQkJewotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMDsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIERpZmZlcmVudCBzZWdtZW50cyBpbiBzdWJ0cmFjdGlvbi4gKi8KLQkgICAgICBrbm93ICghKFNfSVNfRVhURVJOQUwgKHN1Yl9zeW1ib2xQKQotCQkgICAgICAmJiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKSk7Ci0KLQkgICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLQkJYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCi0jaWZkZWYgRElGRl9FWFBSX09LCi0JICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IHRoaXNfc2VnbWVudF90eXBlCi0jaWYgMCAvKiBEbyB0aGlzIGV2ZW4gaWYgaXQncyBhbHJlYWR5IGRlc2NyaWJlZCBhcyBwYy1yZWxhdGl2ZS4gIEZvciBleGFtcGxlLAotCSBvbiB0aGUgbTY4aywgYW4gb3BlcmFuZCBvZiAicGNAKGZvby0uLTIpIiBzaG91bGQgYWRkcmVzcyAiZm9vIiBpbiBhCi0JIHBjLXJlbGF0aXZlIG1vZGUuICAqLwotCQkgICAgICAgJiYgcGNyZWwKLSNlbmRpZgotCQkgICAgICAgKQotCQl7Ci0JCSAgLyogTWFrZSBpdCBwYy1yZWxhdGl2ZS4gICovCi0JCSAgYWRkX251bWJlciArPSAoTURfUENSRUxfRlJPTV9TRUNUSU9OIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSkKLQkJCQkgLSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApKTsKLQkJICBwY3JlbCA9IDE7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAxOwotCQkgIHN1Yl9zeW1ib2xQID0gMDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0JICAgICAgLyogVGhlIFBBIG5lZWRzIHRoaXMgZm9yIFBJQyBjb2RlIGdlbmVyYXRpb24uICBXZSBiYXNpY2FsbHkKLQkJIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgaWYgd2UgaGF2ZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJIHN5bWJvbHMgYXQgdGhpcyBwb2ludC4gICovCi0JICAgICAgZWxzZSBpZiAoMSkKLQkJewotCQkgIC8qIExlYXZlIGl0IGFsb25lLiAgKi8KLQkJfQotI2VuZGlmCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICAgIGVsc2UgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfR1BSRUwzMgotCQkgICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19HUFJFTDE2KQotCQl7Ci0JCSAgLyogTGVhdmUgaXQgYWxvbmUuICAqLwotCQl9Ci0jZW5kaWYKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyIGJ1Zls1MF07Ci0JCSAgc3ByaW50X3ZhbHVlIChidWYsIGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpOwotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJTdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgXCIlc1wiIHslcyBzZWN0aW9ufSAtIFwiJXNcIiB7JXMgc2VjdGlvbn0gYXQgZmlsZSBhZGRyZXNzICVzLiIpLAotCQkJCVNfR0VUX05BTUUgKGFkZF9zeW1ib2xQKSwKLQkJCQlzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKSksCi0JCQkJU19HRVRfTkFNRSAoc3ViX3N5bWJvbFApLAotCQkJCXNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApKSwKLQkJCQlidWYpOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQl7Ci0JICBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IHRoaXNfc2VnbWVudF90eXBlICYmIHBjcmVsICYmICFwbHQKLQkgICAgICAmJiBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAgKGZpeFApKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBUaGlzIGZpeHVwIHdhcyBtYWRlIHdoZW4gdGhlIHN5bWJvbCdzIHNlZ21lbnQgd2FzCi0JICAgICAgICogU0VHX1VOS05PV04sIGJ1dCBpdCBpcyBub3cgaW4gdGhlIGxvY2FsIHNlZ21lbnQuCi0JICAgICAgICogU28gd2Uga25vdyBob3cgdG8gZG8gdGhlIGFkZHJlc3Mgd2l0aG91dCByZWxvY2F0aW9uLgotCSAgICAgICAqLwotI2lmZGVmIFRDX0k5NjAKLQkgICAgICAvKiByZWxvY19jYWxsaigpIG1heSByZXBsYWNlIGEgJ2NhbGwnIHdpdGggYSAnY2FsbHMnIG9yIGEKLQkJICdiYWwnLCBpbiB3aGljaCBjYXNlcyBpdCBtb2RpZmllcyAqZml4UCBhcyBhcHByb3ByaWF0ZS4KLQkJIEluIHRoZSBjYXNlIG9mIGEgJ2NhbGxzJywgbm8gZnVydGhlciB3b3JrIGlzIHJlcXVpcmVkLAotCQkgYW5kICpmaXhQIGhhcyBiZWVuIHNldCB1cCB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBjb2RlCi0JCSBiZWxvdyBhIG5vLW9wLiAqLwotCSAgICAgIHJlbG9jX2NhbGxqIChmaXhQKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JICAgICAgYWRkX251bWJlciAtPSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKTsKLQkgICAgICBwY3JlbCA9IDA7CS8qIExpZS4gRG9uJ3Qgd2FudCBmdXJ0aGVyIHBjcmVsIHByb2Nlc3NpbmcuICovCi0KLQkgICAgICAvKiBMZXQgdGhlIHRhcmdldCBtYWNoaW5lIG1ha2UgdGhlIGZpbmFsIGRldGVybWluYXRpb24KLQkJIGFzIHRvIHdoZXRoZXIgb3Igbm90IGEgcmVsb2NhdGlvbiB3aWxsIGJlIG5lZWRlZCB0bwotCQkgaGFuZGxlIHRoaXMgZml4dXAuICAqLwotCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCXsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDA7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gYWJzb2x1dGVfc2VjdGlvbgotCQkgICYmICEgcGNyZWwpCi0JCXsKLSNpZmRlZiBUQ19JOTYwCi0JCSAgLyogU2VlIGNvbW1lbnQgYWJvdXQgcmVsb2NfY2FsbGooKSBhYm92ZS4gICovCi0JCSAgcmVsb2NfY2FsbGogKGZpeFApOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0KLQkJICAvKiBMZXQgdGhlIHRhcmdldCBtYWNoaW5lIG1ha2UgdGhlIGZpbmFsIGRldGVybWluYXRpb24KLQkJICAgICBhcyB0byB3aGV0aGVyIG9yIG5vdCBhIHJlbG9jYXRpb24gd2lsbCBiZSBuZWVkZWQgdG8KLQkJICAgICBoYW5kbGUgdGhpcyBmaXh1cC4gICovCi0KLQkJICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQkgICAgewotCQkgICAgICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgICAgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSB1bmRlZmluZWRfc2VjdGlvbgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJICAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYWRkX3N5bWJvbF9zZWdtZW50KQotI2VuZGlmCi0JCSAgICAgICApCi0JCXsKLSNpZmRlZiBUQ19JOTYwCi0JCSAgaWYgKChpbnQpIGZpeFAtPmZ4X2JpdF9maXhQID09IDEzKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgQ09CUiBpbnN0cnVjdGlvbi4gIFRoZXkgaGF2ZSBvbmx5IGEKLQkJICAgICAgICogMTMtYml0IGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZAotCQkgICAgICAgKiBmb3IgbG9jYWwgYnJhbmNoZXM6IGZsYWcgYXMgZXJyb3IsIGRvbid0IGdlbmVyYXRlCi0JCSAgICAgICAqIHJlbG9jYXRpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJICAgIF8oImNhbid0IHVzZSBDT0JSIGZvcm1hdCB3aXRoIGV4dGVybmFsIGxhYmVsIikpOwotCQkgICAgICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0JCS8qIENPQlIgKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLSNpZmRlZiBPQkpfQ09GRgotI2lmZGVmIFRFX0kzODZBSVgKLQkJICBpZiAoU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkKLQkJICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLSNlbmRpZiAvKiBURV9JMzg2QUlYICovCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQkJICArK3NlZ19yZWxvY19jb3VudDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNlZ19yZWxvY19jb3VudCsrOwotI2lmICEoZGVmaW5lZCAoVENfVjg1MCkgJiYgZGVmaW5lZCAoT0JKX0VMRikpCi0jaWYgIShkZWZpbmVkIChUQ19NNjhLKSAmJiBkZWZpbmVkIChPQkpfRUxGKSkKLSNpZiAhKGRlZmluZWQgKFRDX0FSTSkgICYmIGRlZmluZWQgKE9CSl9FTEYpKQotI2lmICEoZGVmaW5lZCAoVENfSTk2MCkgJiYgZGVmaW5lZCAoT0JKX0VMRikpCi0jaWYgIWRlZmluZWQgKFRDX0kzODYpIHx8ICEoZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX0NPRkYpKSB8fCBkZWZpbmVkIChURV9QRSkKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwY3JlbCkKLQl7Ci0JICBhZGRfbnVtYmVyIC09IE1EX1BDUkVMX0ZST01fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpOwotCSAgaWYgKGFkZF9zeW1ib2xQID09IDApCi0JICAgIHsKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gJmFic19zeW1ib2w7Ci0jZWxzZQotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOwotI2VuZGlmCi0JICAgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4UC0+ZnhfYWRkc3kpOwotCSAgICAgICsrc2VnX3JlbG9jX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoIWZpeFAtPmZ4X2RvbmUpCi0JewotI2lmZGVmIE1EX0FQUExZX0ZJWDMKLQkgIG1kX2FwcGx5X2ZpeDMgKGZpeFAsICZhZGRfbnVtYmVyLCB0aGlzX3NlZ21lbnRfdHlwZSk7Ci0jZWxzZQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIG1kX2FwcGx5X2ZpeCAoZml4UCwgJmFkZF9udW1iZXIpOwotI2Vsc2UKLQkgIG1kX2FwcGx5X2ZpeCAoZml4UCwgYWRkX251bWJlcik7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFRDX0hBTkRMRVNfRlhfRE9ORQotCSAgLyogSWYgdGhlIHRjLSogZmlsZXMgaGF2ZW4ndCBiZWVuIGNvbnZlcnRlZCwgYXNzdW1lIGl0J3MgaGFuZGxpbmcKLQkgICAgIGl0IHRoZSBvbGQgd2F5LCB3aGVyZSBhIG51bGwgZnhfYWRkc3kgbWVhbnMgdGhhdCB0aGUgZml4IGhhcwotCSAgICAgYmVlbiBhcHBsaWVkIGNvbXBsZXRlbHksIGFuZCBubyBmdXJ0aGVyIHdvcmsgaXMgbmVlZGVkLiAgKi8KLQkgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmIGZpeFAtPmZ4X3BjcmVsID09IDApCi0JICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotI2VuZGlmCi0JfQotCi0gICAgICBpZiAoIWZpeFAtPmZ4X2JpdF9maXhQICYmICFmaXhQLT5meF9ub19vdmVyZmxvdyAmJiBzaXplID4gMCkKLQl7Ci0JICBpZiAoKHNpemVfdCkgc2l6ZSA8IHNpemVvZiAodmFsdWVUKSkKLQkgICAgewotCSAgICAgIHZhbHVlVCBtYXNrLCBoaWJpdDsKLQotCSAgICAgIC8qIHNldCBhbGwgYml0cyB0byBvbmUgKi8KLQkgICAgICBtYXNrID0gMDsKLQkgICAgICBtYXNrLS07Ci0JICAgICAgLyogVGVjaG5pY2FsbHksIGNvbWJpbmluZyB0aGVzZSBwcm9kdWNlcyBhbiB1bmRlZmluZWQgcmVzdWx0Ci0JCSBpZiBzaXplIGlzIHNpemVvZiAodmFsdWVUKSwgdGhvdWdoIEkgdGhpbmsgdGhlc2UgdHdvCi0JCSBoYWxmLXdheSBvcGVyYXRpb25zIHNob3VsZCBib3RoIGJlIGRlZmluZWQuICBBbmQgdGhlCi0JCSBjb21waWxlciBzaG91bGQgYmUgYWJsZSB0byBjb21iaW5lIHRoZW0gaWYgaXQncyB2YWxpZCBvbgotCQkgdGhlIGhvc3QgYXJjaGl0ZWN0dXJlLiAgKi8KLQkgICAgICBtYXNrIDw8PSBzaXplICogNDsKLQkgICAgICBtYXNrIDw8PSBzaXplICogNDsKLQkgICAgICBoaWJpdCA9ICh2YWx1ZVQpIDEgPDwgKHNpemUgKiA4IC0gMSk7Ci0JICAgICAgaWYgKCgoYWRkX251bWJlciAmIG1hc2spICE9IDAKLQkJICAgfHwgKGZpeFAtPmZ4X3NpZ25lZAotCQkgICAgICAgJiYgKGFkZF9udW1iZXIgJiBoaWJpdCkgIT0gMCkpCi0JCSAgJiYgKChhZGRfbnVtYmVyICYgbWFzaykgIT0gbWFzawotCQkgICAgICB8fCAoYWRkX251bWJlciAmIGhpYml0KSA9PSAwKSkKLQkJewotCQkgIGNoYXIgYnVmWzUwXSwgYnVmMls1MF07Ci0JCSAgc3ByaW50X3ZhbHVlIChidWYsIGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpOwotCQkgIGlmIChhZGRfbnVtYmVyID4gMTAwMCkKLQkJICAgIHNwcmludF92YWx1ZSAoYnVmMiwgYWRkX251bWJlcik7Ci0JCSAgZWxzZQotCQkgICAgc3ByaW50ZiAoYnVmMiwgIiVsZCIsIChsb25nKSBhZGRfbnVtYmVyKTsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiVmFsdWUgb2YgJXMgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAlcyIpLAotCQkJCWJ1ZjIsIHNpemUsIGJ1Zik7Ci0JCX0gLyogZ2VuZXJpYyBlcnJvciBjaGVja2luZyAqLwotCSAgICB9Ci0jaWZkZWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRAotCSAgLyogV2FybiBpZiBhIC53b3JkIHZhbHVlIGlzIHRvbyBsYXJnZSB3aGVuIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIG51bWJlci4gIFdlIGFscmVhZHkga25vdyBpdCBpcyBub3QgdG9vIG5lZ2F0aXZlLiAgVGhpcyBpcyB0bwotCSAgICAgY2F0Y2ggb3Zlci1sYXJnZSBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uIHRoZSA2OGsuICAqLwotCSAgaWYgKCFmbGFnX3NpZ25lZF9vdmVyZmxvd19vawotCSAgICAgICYmIHNpemUgPT0gMgotCSAgICAgICYmIGFkZF9udW1iZXIgPiAweDdmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiU2lnbmVkIC53b3JkIG92ZXJmbG93OyBzd2l0Y2ggbWF5IGJlIHRvbyBsYXJnZTsgJWxkIGF0IDB4JWx4IiksCi0JCQkgIChsb25nKSBhZGRfbnVtYmVyLAotCQkJICAodW5zaWduZWQgbG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKLSNlbmRpZgotCX0JCQkvKiBub3QgYSBiaXQgZml4ICovCi0KLSNpZmRlZiBUQ19WQUxJREFURV9GSVgKLSAgICBza2lwOiA7Ci0jZW5kaWYKLSNpZmRlZiBERUJVRzUKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInJlc3VsdDpcbiIpOwotICAgICAgcHJpbnRfZml4dXAgKGZpeFApOwotI2VuZGlmCi0gICAgfQkJCQkvKiBGb3IgZWFjaCBmaXhTIGluIHRoaXMgc2VnbWVudC4gKi8KLQotICBUQ19BREpVU1RfUkVMT0NfQ09VTlQgKGZpeFAsIHNlZ19yZWxvY19jb3VudCk7Ci0gIHJldHVybiBzZWdfcmVsb2NfY291bnQ7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKE9CSl9WTVMpKSAqLwotCi12b2lkCi1udW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKChzaXplX3QpIG4gPiBzaXplb2YgKHZhbCkgfHwgbiA8PSAwKQotICAgIGFib3J0ICgpOwotICB3aGlsZSAobi0tKQotICAgIHsKLSAgICAgIGJ1ZltuXSA9IHZhbCAmIDB4ZmY7Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgfQotfQotCi12b2lkCi1udW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKChzaXplX3QpIG4gPiBzaXplb2YgKHZhbCkgfHwgbiA8PSAwKQotICAgIGFib3J0ICgpOwotICB3aGlsZSAobi0tKQotICAgIHsKLSAgICAgICpidWYrKyA9IHZhbCAmIDB4ZmY7Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgfQotfQotCi12b2lkCi13cml0ZV9wcmludF9zdGF0aXN0aWNzIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBmcHJpbnRmIChmaWxlLCAiZml4dXBzOiAlZFxuIiwgbl9maXh1cHMpOwotfQotCi0vKiBmb3IgZGVidWdnaW5nICovCi1leHRlcm4gaW50IGluZGVudF9sZXZlbDsKLQotdm9pZAotcHJpbnRfZml4dXAgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGluZGVudF9sZXZlbCA9IDE7Ci0gIGZwcmludGYgKHN0ZGVyciwgImZpeCAlbHggJXM6JWQiLCAobG9uZykgZml4cCwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgcGNyZWwiKTsKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsX2FkanVzdCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgcGNyZWxfYWRqdXN0PSVkIiwgZml4cC0+ZnhfcGNyZWxfYWRqdXN0KTsKLSAgaWYgKGZpeHAtPmZ4X2ltX2Rpc3ApCi0gICAgewotI2lmZGVmIFRDX05TMzJLCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgaW1fZGlzcD0lZCIsIGZpeHAtPmZ4X2ltX2Rpc3ApOwotI2Vsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiBpbV9kaXNwIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGlmIChmaXhwLT5meF90Y2JpdCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgdGNiaXQiKTsKLSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIGRvbmUiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICAgc2l6ZT0lZCBmcmFnPSVseCB3aGVyZT0lbGQgb2Zmc2V0PSVseCBhZGRudW1iZXI9JWx4IiwKLQkgICBmaXhwLT5meF9zaXplLCAobG9uZykgZml4cC0+ZnhfZnJhZywgKGxvbmcpIGZpeHAtPmZ4X3doZXJlLAotCSAgIChsb25nKSBmaXhwLT5meF9vZmZzZXQsIChsb25nKSBmaXhwLT5meF9hZGRudW1iZXIpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICAgJXMgKCVkKSIsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhwLT5meF9yX3R5cGUpLAotCSAgIGZpeHAtPmZ4X3JfdHlwZSk7Ci0jZWxzZQotI2lmZGVmIE5FRURfRlhfUl9UWVBFCi0gIGZwcmludGYgKHN0ZGVyciwgIiByX3R5cGU9JWQiLCBmaXhwLT5meF9yX3R5cGUpOwotI2VuZGlmCi0jZW5kaWYKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuICAgKzwiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChzdGRlcnIsIGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIj4iKTsKLSAgICB9Ci0gIGlmIChmaXhwLT5meF9zdWJzeSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiAgIC08Iik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoc3RkZXJyLCBmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI+Iik7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotI2lmZGVmIFRDX0ZJWF9EQVRBX1BSSU5UCi0gIFRDX0ZJWF9EQVRBX1BSSU5UIChzdGRlcnIsIGZpeHApOwotI2VuZGlmCi19Ci0KLS8qIGVuZCBvZiB3cml0ZS5jICovCmRpZmYgLS1naXQgYS9nYXMvd3JpdGUuaCBiL2dhcy93cml0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODZkMmFkLi4wMDAwMDAwCi0tLSBhL2dhcy93cml0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qIHdyaXRlLmgKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9fd3JpdGVfaF9fCi0jZGVmaW5lIF9fd3JpdGVfaF9fCi0KLSNpZm5kZWYgVENfSTk2MAotI2lmZGVmIGhwdXgKLSNkZWZpbmUgRVhFQ19NQUNISU5FX1RZUEUgSFA5MDAwUzIwMF9JRAotI2VuZGlmCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotI2lmbmRlZiBMT0NBTF9MQUJFTAotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZSBbMF0gPT0gJ0wnICkKLSNlbmRpZgotCi0jZGVmaW5lIFNfTE9DQUxfTkFNRShzKSAoTE9DQUxfTEFCRUwgKFNfR0VUX05BTUUgKHMpKSkKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBUaGlzIGlzIHRoZSBuYW1lIG9mIGEgZmFrZSBzeW1ib2wgd2hpY2ggd2lsbCBuZXZlciBhcHBlYXIgaW4gdGhlCi0gICBhc3NlbWJsZXIgb3V0cHV0LiAgU19JU19MT0NBTCBkZXRlY3RzIGl0IGJlY2F1c2Ugb2YgdGhlIFwwMDEuICAqLwotI2RlZmluZSBGQUtFX0xBQkVMX05BTUUgIkwwXDAwMSIKLQotI2luY2x1ZGUgImJpdF9maXguaCIKLQotLyoKLSAqIEZpeFNzIG1heSBiZSBidWlsdCB1cCBpbiBhbnkgb3JkZXIuCi0gKi8KLQotc3RydWN0IGZpeAotewotICAvKiBUaGVzZSBzbWFsbCBmaWVsZHMgYXJlIGdyb3VwZWQgdG9nZXRoZXIgZm9yIGNvbXBhY3RuZXNzIG9mCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgZWZmaWNpZW5jeSBvZiBhY2Nlc3Mgb24gc29tZSBhcmNoaXRlY3R1cmVzLiAgKi8KLQotICAvKiBwYy1yZWxhdGl2ZSBvZmZzZXQgYWRqdXN0IChvbmx5IHVzZWQgYnkgbTY4aykgKi8KLSAgY2hhciBmeF9wY3JlbF9hZGp1c3Q7Ci0KLSAgLyogSG93IG1hbnkgYnl0ZXMgYXJlIGludm9sdmVkPyAqLwotICB1bnNpZ25lZCBjaGFyIGZ4X3NpemU7Ci0KLSAgLyogSXMgdGhpcyBhIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24/ICAqLwotICB1bnNpZ25lZCBmeF9wY3JlbCA6IDE7Ci0KLSAgLyogSXMgdGhpcyBhIHJlbG9jYXRpb24gdG8gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeT8gIElmIHNvLAotICAgICBzb21lIG9mIHRoZSByZWR1Y3Rpb25zIHdlIHRyeSB0byBhcHBseSBhcmUgaW52YWxpZC4gIEEgYmV0dGVyIHdheQotICAgICBtaWdodCBiZSB0byByZXByZXNlbnQgUExUIGVudHJpZXMgd2l0aCBkaWZmZXJlbnQga2luZHMgb2YKLSAgICAgc3ltYm9scywgYW5kIHVzZSBub3JtYWwgcmVsb2NhdGlvbnMgKHdpdGggdW5kZWZpbmVkIHN5bWJvbHMpOwotICAgICBsb29rIGludG8gaXQgZm9yIHZlcnNpb24gMi42LiAgKi8KLSAgdW5zaWduZWQgZnhfcGx0IDogMTsKLQotICAvKiBJcyB0aGlzIHZhbHVlIGFuIGltbWVkaWF0ZSBkaXNwbGFjZW1lbnQ/ICAqLwotICAvKiBPbmx5IHVzZWQgb24gaTk2MCBhbmQgbnMzMms7IG1lcmdlIGl0IGludG8gVENfRklYX1RZUEUgc29tZXRpbWUuICAqLwotICB1bnNpZ25lZCBmeF9pbV9kaXNwIDogMjsKLQotICAvKiBBIGJpdCBmb3IgdGhlIENQVSBzcGVjaWZpYyBjb2RlLgotICAgICBUaGlzIHByb2JhYmx5IGNhbiBiZSBmb2xkZWQgaW50byB0Y19maXhfZGF0YSwgYmVsb3cuICAqLwotICB1bnNpZ25lZCBmeF90Y2JpdCA6IDE7Ci0KLSAgLyogSGFzIHRoaXMgcmVsb2NhdGlvbiBhbHJlYWR5IGJlZW4gYXBwbGllZD8gICovCi0gIHVuc2lnbmVkIGZ4X2RvbmUgOiAxOwotCi0gIC8qIFN1cHByZXNzIG92ZXJmbG93IGNvbXBsYWludHMgb24gbGFyZ2UgYWRkZW5kcy4gIFRoaXMgaXMgdXNlZAotICAgICBpbiB0aGUgUG93ZXJQQyBFTEYgY29uZmlnIHRvIGFsbG93IGxhcmdlIGFkZGVuZHMgb24gdGhlCi0gICAgIEJGRF9SRUxPQ197TE8xNixISTE2LEhJMTZfU30gcmVsb2NhdGlvbnMuCi0KLSAgICAgQEAgQ2FuIHRoaXMgYmUgZGV0ZXJtaW5lZCBmcm9tIEJGRD8gICovCi0gIHVuc2lnbmVkIGZ4X25vX292ZXJmbG93IDogMTsKLQotICAvKiBUaGUgdmFsdWUgaXMgc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LiAgKi8KLSAgdW5zaWduZWQgZnhfc2lnbmVkIDogMTsKLQotICAvKiBXaGljaCBmcmFnIGRvZXMgdGhpcyBmaXggYXBwbHkgdG8/ICAqLwotICBmcmFnUyAqZnhfZnJhZzsKLQotICAvKiBXaGVyZSBpcyB0aGUgZmlyc3QgYnl0ZSB0byBmaXggdXA/ICAqLwotICBsb25nIGZ4X3doZXJlOwotCi0gIC8qIE5VTEwgb3IgU3ltYm9sIHdob3NlIHZhbHVlIHdlIGFkZCBpbi4gKi8KLSAgc3ltYm9sUyAqZnhfYWRkc3k7Ci0KLSAgLyogTlVMTCBvciBTeW1ib2wgd2hvc2UgdmFsdWUgd2Ugc3VidHJhY3QuICovCi0gIHN5bWJvbFMgKmZ4X3N1YnN5OwotCi0gIC8qIEFic29sdXRlIG51bWJlciB3ZSBhZGQgaW4uICovCi0gIHZhbHVlVCBmeF9vZmZzZXQ7Ci0KLSAgLyogTmV4dCBmaXhTIGluIGxpbmtlZCBsaXN0LCBvciBOVUxMLiAgKi8KLSAgc3RydWN0IGZpeCAqZnhfbmV4dDsKLQotICAvKiBJZiBOVUxMLCBubyBiaXRmaXgncyB0byBkby4gICovCi0gIC8qIE9ubHkgaTk2MC1jb2ZmIGFuZCBuczMyayB1c2UgdGhpcywgYW5kIGk5NjAtY29mZiBzdG9yZXMgYW4KLSAgICAgaW50ZWdlci4gIFRoaXMgY2FuIHByb2JhYmx5IGJlIGZvbGRlZCBpbnRvIHRjX2ZpeF9kYXRhLCBiZWxvdy4KLSAgICAgQEAgQWxwaGEgYWxzbyB1c2VzIGl0LCBidXQgb25seSB0byBkaXNhYmxlIGNlcnRhaW4gcmVsb2NhdGlvbgotICAgICBwcm9jZXNzaW5nLiAgKi8KLSAgYml0X2ZpeFMgKmZ4X2JpdF9maXhQOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZnhfcl90eXBlOwotI2Vsc2UKLSNpZmRlZiBORUVEX0ZYX1JfVFlQRQotICAvKiBIYWNrIGZvciBtYWNoaW5lcyB3aGVyZSB0aGUgdHlwZSBvZiByZWxvYyBjYW4ndCBiZQotICAgICB3b3JrZWQgb3V0IGJ5IGxvb2tpbmcgYXQgaG93IGJpZyBpdCBpcy4gICovCi0gIGludCBmeF9yX3R5cGU7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIC8qIFRoaXMgZmllbGQgaXMgc29ydCBvZiBtaXNuYW1lZC4gIEl0IGFwcGVhcnMgdG8gYmUgYSBzb3J0IG9mIHJhbmRvbQotICAgICBzY3JhdGNoIGZpZWxkLCBmb3IgdXNlIGJ5IHRoZSBiYWNrIGVuZHMuICBUaGUgbWFpbiBnYXMgY29kZSBkb2Vzbid0Ci0gICAgIGRvIGFueXRoaW5nIGJ1dCBpbml0aWFsaXplIGl0IHRvIHplcm8uICBUaGUgdXNlIG9mIGl0IGRvZXMgbmVlZCB0bwotICAgICBiZSBjb29yZGluYXRlZCBiZXR3ZWVuIHRoZSBjcHUgYW5kIGZvcm1hdCBmaWxlcywgdGhvdWdoLiAgRS5nLiwgc29tZQotICAgICBjb2ZmIHRhcmdldHMgcGFzcyB0aGUgYGFkZGVuZCcgZmllbGQgZnJvbSB0aGUgY3B1IGZpbGUgdmlhIHRoaXMKLSAgICAgZmllbGQuICBJIGRvbid0IGtub3cgd2h5IHRoZSBgZnhfb2Zmc2V0JyBmaWVsZCBhYm92ZSBjYW4ndCBiZSB1c2VkCi0gICAgIGZvciB0aGF0OyBpbnZlc3RpZ2F0ZSBsYXRlciBhbmQgZG9jdW1lbnQuIEtSICAqLwotICB2YWx1ZVQgZnhfYWRkbnVtYmVyOwotCi0gIC8qIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggY3JlYXRlZCB0aGUgcmVsb2MsIHVzZWQKLSAgICAgaW4gZXJyb3IgbWVzc2FnZXMuICAqLwotICBjaGFyICpmeF9maWxlOwotICB1bnNpZ25lZCBmeF9saW5lOwotCi0jaWZkZWYgVVNJTkdfQ0dFTgotICBzdHJ1Y3QgewotICAgIC8qIENHRU5fSU5TTiBlbnRyeSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgY29uc3Qgc3RydWN0IGNnZW5faW5zbiAqaW5zbjsKLSAgICAvKiBUYXJnZXQgc3BlY2lmaWMgZGF0YSwgdXN1YWxseSByZWxvYyBudW1iZXIuICAqLwotICAgIGludCBvcGluZm87Ci0gIH0gZnhfY2dlbjsKLSNlbmRpZgotCi0jaWZkZWYgVENfRklYX1RZUEUKLSAgLyogTG9jYXRpb24gd2hlcmUgYSBiYWNrZW5kIGNhbiBhdHRhY2ggYWRkaXRpb25hbCBkYXRhCi0gICAgIG5lZWRlZCB0byBwZXJmb3JtIGZpeHVwcy4gICovCi0gIFRDX0ZJWF9UWVBFIHRjX2ZpeF9kYXRhOwotI2VuZGlmCi19OwotCi10eXBlZGVmIHN0cnVjdCBmaXggZml4UzsKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsKLQotI2lmbmRlZiBNQU5ZX1NFR01FTlRTCi1DT01NT04gZml4UyAqdGV4dF9maXhfcm9vdCwgKnRleHRfZml4X3RhaWw7CS8qIENoYWlucyBmaXhTcy4gKi8KLUNPTU1PTiBmaXhTICpkYXRhX2ZpeF9yb290LCAqZGF0YV9maXhfdGFpbDsJLyogQ2hhaW5zIGZpeFNzLiAqLwotQ09NTU9OIGZpeFMgKmJzc19maXhfcm9vdCwgKmJzc19maXhfdGFpbDsJLyogQ2hhaW5zIGZpeFNzLiAqLwotZXh0ZXJuIHN0cnVjdCBmcmFnICp0ZXh0X2xhc3RfZnJhZzsJCS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotZXh0ZXJuIHN0cnVjdCBmcmFnICpkYXRhX2xhc3RfZnJhZzsJCS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotI2VuZGlmCi1DT01NT04gZml4UyAqKnNlZ19maXhfcm9vdFAsICoqc2VnX2ZpeF90YWlsUDsJLyogLT4gb25lIG9mIGFib3ZlLiAqLwotI2VuZGlmCi0KLWV4dGVybiBsb25nIHN0cmluZ19ieXRlX2NvdW50OwotZXh0ZXJuIGludCBzZWN0aW9uX2FsaWdubWVudFtdOwotCi1leHRlcm4gYml0X2ZpeFMgKmJpdF9maXhfbmV3Ci0gIFBBUkFNUyAoKGludCBzaXplLCBpbnQgb2Zmc2V0LCBsb25nIGJhc2VfdHlwZSwgbG9uZyBiYXNlX2FkaiwgbG9uZyBtaW4sCi0JICAgbG9uZyBtYXgsIGxvbmcgYWRkKSk7Ci1leHRlcm4gdm9pZCBhcHBlbmQgUEFSQU1TICgoY2hhciAqKmNoYXJQUCwgY2hhciAqZnJvbVAsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSk7Ci1leHRlcm4gdm9pZCByZWNvcmRfYWxpZ25tZW50IFBBUkFNUyAoKHNlZ1Qgc2VnLCBpbnQgYWxpZ24pKTsKLWV4dGVybiB2b2lkIHN1YnNlZ3NfZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHdyaXRlX29iamVjdF9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBsb25nIHJlbGF4X2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgbG9uZykpOwotZXh0ZXJuIHZvaWQgcmVsYXhfc2VnbWVudAotICBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqIHNlZ19mcmFnX3Jvb3QsIHNlZ1Qgc2VnX3R5cGUpKTsKLQotZXh0ZXJuIHZvaWQgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50KSk7Ci1leHRlcm4gdm9pZCBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICAgIFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBmaXhTICpmaXhfbmV3Ci0gIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgc3ltYm9sUyAqIGFkZF9zeW1ib2wsCi0JICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZSkpOwotZXh0ZXJuIGZpeFMgKmZpeF9uZXdfZXhwCi0gIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgZXhwcmVzc2lvblMgKmV4cCwgaW50IHBjcmVsLAotCSAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGUpKTsKLSNlbHNlCi1leHRlcm4gZml4UyAqZml4X25ldwotICBQQVJBTVMgKChmcmFnUyAqIGZyYWcsIGludCB3aGVyZSwgaW50IHNpemUsIHN5bWJvbFMgKiBhZGRfc3ltYm9sLAotCSAgIG9mZnNldFQgb2Zmc2V0LCBpbnQgcGNyZWwsIGludCByX3R5cGUpKTsKLWV4dGVybiBmaXhTICpmaXhfbmV3X2V4cAotICBQQVJBTVMgKChmcmFnUyAqIGZyYWcsIGludCB3aGVyZSwgaW50IHNpemUsIGV4cHJlc3Npb25TICpleHAsIGludCBwY3JlbCwKLQkgICBpbnQgcl90eXBlKSk7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgd3JpdGVfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLQotI2VuZGlmIC8qIF9fd3JpdGVfaF9fICovCi0vKiBlbmQgb2Ygd3JpdGUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2MtZXhwLnRhYi5jIGIvZ2RiL2MtZXhwLnRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTM5NWZhLi4wMDAwMDAwCi0tLSBhL2dkYi9jLWV4cC50YWIuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OTYgKzAsMCBAQAotCi0vKiAgQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSBjLWV4cC55Ci0gYnkgIEdOVSBCaXNvbiB2ZXJzaW9uIDEuMjUKLSAgKi8KLQotI2RlZmluZSBZWUJJU09OIDEgIC8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCi0KLSNkZWZpbmUJSU5UCTI1OAotI2RlZmluZQlGTE9BVAkyNTkKLSNkZWZpbmUJU1RSSU5HCTI2MAotI2RlZmluZQlOQU1FCTI2MQotI2RlZmluZQlUWVBFTkFNRQkyNjIKLSNkZWZpbmUJTkFNRV9PUl9JTlQJMjYzCi0jZGVmaW5lCVNUUlVDVAkyNjQKLSNkZWZpbmUJQ0xBU1MJMjY1Ci0jZGVmaW5lCVVOSU9OCTI2NgotI2RlZmluZQlFTlVNCTI2NwotI2RlZmluZQlTSVpFT0YJMjY4Ci0jZGVmaW5lCVVOU0lHTkVECTI2OQotI2RlZmluZQlDT0xPTkNPTE9OCTI3MAotI2RlZmluZQlURU1QTEFURQkyNzEKLSNkZWZpbmUJRVJST1IJMjcyCi0jZGVmaW5lCVNJR05FRF9LRVlXT1JECTI3MwotI2RlZmluZQlMT05HCTI3NAotI2RlZmluZQlTSE9SVAkyNzUKLSNkZWZpbmUJSU5UX0tFWVdPUkQJMjc2Ci0jZGVmaW5lCUNPTlNUX0tFWVdPUkQJMjc3Ci0jZGVmaW5lCVZPTEFUSUxFX0tFWVdPUkQJMjc4Ci0jZGVmaW5lCURPVUJMRV9LRVlXT1JECTI3OQotI2RlZmluZQlWQVJJQUJMRQkyODAKLSNkZWZpbmUJQVNTSUdOX01PRElGWQkyODEKLSNkZWZpbmUJVEhJUwkyODIKLSNkZWZpbmUJVFJVRUtFWVdPUkQJMjgzCi0jZGVmaW5lCUZBTFNFS0VZV09SRAkyODQKLSNkZWZpbmUJQUJPVkVfQ09NTUEJMjg1Ci0jZGVmaW5lCU9ST1IJMjg2Ci0jZGVmaW5lCUFOREFORAkyODcKLSNkZWZpbmUJRVFVQUwJMjg4Ci0jZGVmaW5lCU5PVEVRVUFMCTI4OQotI2RlZmluZQlMRVEJMjkwCi0jZGVmaW5lCUdFUQkyOTEKLSNkZWZpbmUJTFNICTI5MgotI2RlZmluZQlSU0gJMjkzCi0jZGVmaW5lCVVOQVJZCTI5NAotI2RlZmluZQlJTkNSRU1FTlQJMjk1Ci0jZGVmaW5lCURFQ1JFTUVOVAkyOTYKLSNkZWZpbmUJQVJST1cJMjk3Ci0jZGVmaW5lCUJMT0NLTkFNRQkyOTgKLSNkZWZpbmUJRklMRU5BTUUJMjk5Ci0KLSNsaW5lIDM4ICJjLWV4cC55IgotCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgInZhbHVlLmgiCi0jaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKLSNpbmNsdWRlICJsYW5ndWFnZS5oIgotI2luY2x1ZGUgImMtbGFuZy5oIgotI2luY2x1ZGUgImJmZC5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KLSNpbmNsdWRlICJzeW1maWxlLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLwotI2luY2x1ZGUgIm9iamZpbGVzLmgiIC8qIEZvciBoYXZlX2Z1bGxfc3ltYm9scyBhbmQgaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKi8KLQotLyogRmxhZyBpbmRpY2F0aW5nIHdlJ3JlIGRlYWxpbmcgd2l0aCBIUC1jb21waWxlZCBvYmplY3RzICovIAotZXh0ZXJuIGludCBocF9zb21fc29tX29iamVjdF9wcmVzZW50OwotCi0vKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwgZXRjKSwKLSAgIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzLCBzbyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZQotICAgeWFjYyBnZW5lcmF0ZWQgcGFyc2VycyBpbiBnZGIuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcwotICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQotICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCi0gICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLwotCi0jZGVmaW5lCXl5bWF4ZGVwdGggY19tYXhkZXB0aAotI2RlZmluZQl5eXBhcnNlCWNfcGFyc2UKLSNkZWZpbmUJeXlsZXgJY19sZXgKLSNkZWZpbmUJeXllcnJvcgljX2Vycm9yCi0jZGVmaW5lCXl5bHZhbAljX2x2YWwKLSNkZWZpbmUJeXljaGFyCWNfY2hhcgotI2RlZmluZQl5eWRlYnVnCWNfZGVidWcKLSNkZWZpbmUJeXlwYWN0CWNfcGFjdAkKLSNkZWZpbmUJeXlyMQljX3IxCQkJCi0jZGVmaW5lCXl5cjIJY19yMgkJCQotI2RlZmluZQl5eWRlZgljX2RlZgkJCi0jZGVmaW5lCXl5Y2hrCWNfY2hrCQkKLSNkZWZpbmUJeXlwZ28JY19wZ28JCQotI2RlZmluZQl5eWFjdAljX2FjdAkJCi0jZGVmaW5lCXl5ZXhjYQljX2V4Y2EKLSNkZWZpbmUgeXllcnJmbGFnIGNfZXJyZmxhZwotI2RlZmluZSB5eW5lcnJzCWNfbmVycnMKLSNkZWZpbmUJeXlwcwljX3BzCi0jZGVmaW5lCXl5cHYJY19wdgotI2RlZmluZQl5eXMJY19zCi0jZGVmaW5lCXl5X3l5cwljX3l5cwotI2RlZmluZQl5eXN0YXRlCWNfc3RhdGUKLSNkZWZpbmUJeXl0bXAJY190bXAKLSNkZWZpbmUJeXl2CWNfdgotI2RlZmluZQl5eV95eXYJY195eXYKLSNkZWZpbmUJeXl2YWwJY192YWwKLSNkZWZpbmUJeXlsbG9jCWNfbGxvYwotI2RlZmluZSB5eXJlZHMJY19yZWRzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eXRva3MJY190b2tzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eWxocwljX3l5bGhzCi0jZGVmaW5lIHl5bGVuCWNfeXlsZW4KLSNkZWZpbmUgeXlkZWZyZWQgY195eWRlZnJlZAotI2RlZmluZSB5eWRnb3RvCWNfeXlkZ290bwotI2RlZmluZSB5eXNpbmRleCBjX3l5c2luZGV4Ci0jZGVmaW5lIHl5cmluZGV4IGNfeXlyaW5kZXgKLSNkZWZpbmUgeXlnaW5kZXggY195eWdpbmRleAotI2RlZmluZSB5eXRhYmxlCSBjX3l5dGFibGUKLSNkZWZpbmUgeXljaGVjawkgY195eWNoZWNrCi0KLSNpZm5kZWYgWVlERUJVRwotI2RlZmluZQlZWURFQlVHCTAJCS8qIERlZmF1bHQgdG8gbm8geXlkZWJ1ZyBzdXBwb3J0ICovCi0jZW5kaWYKLQotaW50Ci15eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGludAoteXlsZXggUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi15eWVycm9yIFBBUkFNUyAoKGNoYXIgKikpOwotCi0KLSNsaW5lIDEyMCAiYy1leHAueSIKLXR5cGVkZWYgdW5pb24KLSAgewotICAgIExPTkdFU1QgbHZhbDsKLSAgICBzdHJ1Y3QgewotICAgICAgTE9OR0VTVCB2YWw7Ci0gICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSAgICB9IHR5cGVkX3ZhbF9pbnQ7Ci0gICAgc3RydWN0IHsKLSAgICAgIERPVUJMRVNUIGR2YWw7Ci0gICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSAgICB9IHR5cGVkX3ZhbF9mbG9hdDsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0gICAgc3RydWN0IHR5cGUgKnR2YWw7Ci0gICAgc3RydWN0IHN0b2tlbiBzdmFsOwotICAgIHN0cnVjdCB0dHlwZSB0c3ltOwotICAgIHN0cnVjdCBzeW10b2tlbiBzc3ltOwotICAgIGludCB2b2lkdmFsOwotICAgIHN0cnVjdCBibG9jayAqYnZhbDsKLSAgICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOwotICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqaXZhcjsKLQotICAgIHN0cnVjdCB0eXBlICoqdHZlYzsKLSAgICBpbnQgKml2ZWM7Ci0gIH0gWVlTVFlQRTsKLSNsaW5lIDE0NSAiYy1leHAueSIKLQotLyogWVlTVFlQRSBnZXRzIGRlZmluZWQgYnkgJXVuaW9uICovCi1zdGF0aWMgaW50Ci1wYXJzZV9udW1iZXIgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwgWVlTVFlQRSAqKSk7Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotCi0KLSNkZWZpbmUJWVlGSU5BTAkJMjE0Ci0jZGVmaW5lCVlZRkxBRwkJLTMyNzY4Ci0jZGVmaW5lCVlZTlRCQVNFCTY5Ci0KLSNkZWZpbmUgWVlUUkFOU0xBVEUoeCkgKCh1bnNpZ25lZCkoeCkgPD0gMjk5ID8geXl0cmFuc2xhdGVbeF0gOiA5MSkKLQotc3RhdGljIGNvbnN0IGNoYXIgeXl0cmFuc2xhdGVbXSA9IHsgICAgIDAsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICA2MiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgNTIsICAgIDM4LCAgICAgMiwgICAgNTksCi0gICAgNjUsICAgIDUwLCAgICA0OCwgICAgMzAsICAgIDQ5LCAgICA1NywgICAgNTEsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDY4LCAgICAgMiwgICAgNDEsCi0gICAgMzIsICAgIDQyLCAgICAzMywgICAgNDcsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgNTgsICAgICAyLCAgICA2NCwgICAgMzcsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICA2NiwgICAgMzYsICAgIDY3LCAgICA2MywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsCi0gICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsCi0gICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMxLCAgICAzNCwgICAgMzUsICAgIDM5LCAgICA0MCwgICAgNDMsCi0gICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDYwLCAgICA2MQotfTsKLQotI2lmIFlZREVCVUcgIT0gMAotc3RhdGljIGNvbnN0IHNob3J0IHl5cHJoc1tdID0geyAgICAgMCwKLSAgICAgMCwgICAgIDIsICAgICA0LCAgICAgNiwgICAgIDgsICAgIDEyLCAgICAxNSwgICAgMTgsICAgIDIxLCAgICAyNCwKLSAgICAyNywgICAgMzAsICAgIDMzLCAgICAzNiwgICAgMzksICAgIDQyLCAgICA0NiwgICAgNTAsICAgIDU1LCAgICA1OSwKLSAgICA2MywgICAgNjgsICAgIDczLCAgICA3NCwgICAgODAsICAgIDgyLCAgICA4MywgICAgODUsICAgIDg5LCAgICA5MSwKLSAgICA5NSwgICAxMDAsICAgMTA1LCAgIDEwOSwgICAxMTMsICAgMTE3LCAgIDEyMSwgICAxMjUsICAgMTI5LCAgIDEzMywKLSAgIDEzNywgICAxNDEsICAgMTQ1LCAgIDE0OSwgICAxNTMsICAgMTU3LCAgIDE2MSwgICAxNjUsICAgMTY5LCAgIDE3MywKLSAgIDE3NywgICAxODEsICAgMTg1LCAgIDE5MSwgICAxOTUsICAgMTk5LCAgIDIwMSwgICAyMDMsICAgMjA1LCAgIDIwNywKLSAgIDIwOSwgICAyMTQsICAgMjE2LCAgIDIxOCwgICAyMjAsICAgMjIyLCAgIDIyNCwgICAyMjYsICAgMjMwLCAgIDIzNCwKLSAgIDIzOCwgICAyNDMsICAgMjQ1LCAgIDI0OCwgICAyNTAsICAgMjUyLCAgIDI1NSwgICAyNTgsICAgMjYxLCAgIDI2NSwKLSAgIDI2OSwgICAyNzEsICAgMjc0LCAgIDI3NiwgICAyNzksICAgMjgxLCAgIDI4NSwgICAyODgsICAgMjkwLCAgIDI5MywKLSAgIDI5NSwgICAyOTgsICAgMzAyLCAgIDMwNSwgICAzMDksICAgMzExLCAgIDMxNSwgICAzMTcsICAgMzE5LCAgIDMyMSwKLSAgIDMyMywgICAzMjYsICAgMzMwLCAgIDMzMywgICAzMzcsICAgMzQxLCAgIDM0NiwgICAzNDksICAgMzUzLCAgIDM1NSwKLSAgIDM1OCwgICAzNjEsICAgMzY0LCAgIDM2NywgICAzNzAsICAgMzczLCAgIDM3NSwgICAzNzgsICAgMzgwLCAgIDM4NiwKLSAgIDM4OSwgICAzOTIsICAgMzk0LCAgIDM5NiwgICAzOTgsICAgNDAwLCAgIDQwMiwgICA0MDYsICAgNDA4LCAgIDQxMCwKLSAgIDQxMiwgICA0MTQsICAgNDE2Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyaHNbXSA9IHsgICAgNzEsCi0gICAgIDAsICAgIDcwLCAgICAgMCwgICAgODUsICAgICAwLCAgICA3MiwgICAgIDAsICAgIDcxLCAgICAzMCwgICAgNzIsCi0gICAgIDAsICAgIDUwLCAgICA3MiwgICAgIDAsICAgIDM4LCAgICA3MiwgICAgIDAsICAgIDQ5LCAgICA3MiwgICAgIDAsCi0gICAgNjIsICAgIDcyLCAgICAgMCwgICAgNjMsICAgIDcyLCAgICAgMCwgICAgNTQsICAgIDcyLCAgICAgMCwgICAgNTUsCi0gICAgNzIsICAgICAwLCAgICA3MiwgICAgNTQsICAgICAwLCAgICA3MiwgICAgNTUsICAgICAwLCAgICAxMywgICAgNzIsCi0gICAgIDAsICAgIDcyLCAgICA1NiwgICAgODksICAgICAwLCAgICA3MiwgICAgNTYsICAgIDc5LCAgICAgMCwgICAgNzIsCi0gICAgNTYsICAgIDUwLCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA1NywgICAgODksICAgICAwLCAgICA3MiwgICAgNTcsCi0gICAgNzksICAgICAwLCAgICA3MiwgICAgNTcsICAgIDUwLCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA1OCwgICAgNzEsCi0gICAgNjQsICAgICAwLCAgICAgMCwgICAgNzIsICAgIDU5LCAgICA3MywgICAgNzUsICAgIDY1LCAgICAgMCwgICAgNjYsCi0gICAgIDAsICAgICAwLCAgICA3MiwgICAgIDAsICAgIDc1LCAgICAzMCwgICAgNzIsICAgICAwLCAgICA2NywgICAgIDAsCi0gICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc0LCAgICA4NSwgICAgNzYsICAgIDcyLCAgICAgMCwgICAgNTksCi0gICAgODUsICAgIDY1LCAgICA3MiwgICAgIDAsICAgIDU5LCAgICA3MSwgICAgNjUsICAgICAwLCAgICA3MiwgICAgNDcsCi0gICAgNzIsICAgICAwLCAgICA3MiwgICAgNTAsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDUxLCAgICA3MiwgICAgIDAsCi0gICAgNzIsICAgIDUyLCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA0OCwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNDksCi0gICAgNzIsICAgICAwLCAgICA3MiwgICAgNDUsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDQ2LCAgICA3MiwgICAgIDAsCi0gICAgNzIsICAgIDM5LCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA0MCwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNDMsCi0gICAgNzIsICAgICAwLCAgICA3MiwgICAgNDQsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDQxLCAgICA3MiwgICAgIDAsCi0gICAgNzIsICAgIDQyLCAgICA3MiwgICAgIDAsICAgIDcyLCAgICAzOCwgICAgNzIsICAgICAwLCAgICA3MiwgICAgMzcsCi0gICAgNzIsICAgICAwLCAgICA3MiwgICAgMzYsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDM1LCAgICA3MiwgICAgIDAsCi0gICAgNzIsICAgIDM0LCAgICA3MiwgICAgIDAsICAgIDcyLCAgICAzMywgICAgNzIsICAgIDY4LCAgICA3MiwgICAgIDAsCi0gICAgNzIsICAgIDMyLCAgICA3MiwgICAgIDAsICAgIDcyLCAgICAyNiwgICAgNzIsICAgICAwLCAgICAgMywgICAgIDAsCi0gICAgIDgsICAgICAwLCAgICAgNCwgICAgIDAsICAgIDc4LCAgICAgMCwgICAgMjUsICAgICAwLCAgICAxMywgICAgNTksCi0gICAgODUsICAgIDY1LCAgICAgMCwgICAgIDUsICAgICAwLCAgICAyNywgICAgIDAsICAgIDI4LCAgICAgMCwgICAgMjksCi0gICAgIDAsICAgIDYwLCAgICAgMCwgICAgNjEsICAgICAwLCAgICA3NywgICAgMTUsICAgIDg5LCAgICAgMCwgICAgNzcsCi0gICAgMTUsICAgIDg5LCAgICAgMCwgICAgODYsICAgIDE1LCAgICA4OSwgICAgIDAsICAgIDg2LCAgICAxNSwgICAgNjMsCi0gICAgODksICAgICAwLCAgICA3OSwgICAgIDAsICAgIDE1LCAgICA4OSwgICAgIDAsICAgIDkwLCAgICAgMCwgICAgODYsCi0gICAgIDAsICAgIDg2LCAgICAyMiwgICAgIDAsICAgIDg2LCAgICAyMywgICAgIDAsICAgIDg2LCAgICA4MSwgICAgIDAsCi0gICAgODYsICAgIDIyLCAgICA4MSwgICAgIDAsICAgIDg2LCAgICAyMywgICAgODEsICAgICAwLCAgICA1MCwgICAgIDAsCi0gICAgNTAsICAgIDgxLCAgICAgMCwgICAgMzgsICAgICAwLCAgICAzOCwgICAgODEsICAgICAwLCAgICA4MiwgICAgIDAsCi0gICAgNTksICAgIDgxLCAgICA2NSwgICAgIDAsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDgzLCAgICAgMCwgICAgODIsCi0gICAgODQsICAgICAwLCAgICA4NCwgICAgIDAsICAgIDU4LCAgICA2NCwgICAgIDAsICAgIDU4LCAgICAgMywgICAgNjQsCi0gICAgIDAsICAgIDU5LCAgICA2NSwgICAgIDAsICAgIDU5LCAgICA4OCwgICAgNjUsICAgICAwLCAgICA4MCwgICAgIDAsCi0gICAgODYsICAgIDE1LCAgICA1MCwgICAgIDAsICAgICA3LCAgICAgMCwgICAgMjEsICAgICAwLCAgICAxOSwgICAgIDAsCi0gICAgMjAsICAgICAwLCAgICAxOSwgICAgMjEsICAgICAwLCAgICAxNCwgICAgMTksICAgIDIxLCAgICAgMCwgICAgMTksCi0gICAgMTksICAgICAwLCAgICAxOSwgICAgMTksICAgIDIxLCAgICAgMCwgICAgMTQsICAgIDE5LCAgICAxOSwgICAgIDAsCi0gICAgMTQsICAgIDE5LCAgICAxOSwgICAgMjEsICAgICAwLCAgICAyMCwgICAgMjEsICAgICAwLCAgICAxNCwgICAgMjAsCi0gICAgMjEsICAgICAwLCAgICAyNCwgICAgIDAsICAgIDE5LCAgICAyNCwgICAgIDAsICAgICA5LCAgICA4OSwgICAgIDAsCi0gICAgMTAsICAgIDg5LCAgICAgMCwgICAgMTEsICAgIDg5LCAgICAgMCwgICAgMTIsICAgIDg5LCAgICAgMCwgICAgMTQsCi0gICAgODcsICAgICAwLCAgICAxNCwgICAgIDAsICAgIDE4LCAgICA4NywgICAgIDAsICAgIDE4LCAgICAgMCwgICAgMTYsCi0gICAgODksICAgIDQxLCAgICA4NSwgICAgNDIsICAgICAwLCAgICAyMiwgICAgODYsICAgICAwLCAgICAyMywgICAgODYsCi0gICAgIDAsICAgICA3LCAgICAgMCwgICAgMjEsICAgICAwLCAgICAxOSwgICAgIDAsICAgIDIwLCAgICAgMCwgICAgODUsCi0gICAgIDAsICAgIDg4LCAgICAzMCwgICAgODUsICAgICAwLCAgICAgNiwgICAgIDAsICAgIDYwLCAgICAgMCwgICAgIDcsCi0gICAgIDAsICAgICA4LCAgICAgMCwgICAgIDYsICAgICAwLCAgICA2MCwgICAgIDAKLX07Ci0KLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlybGluZVtdID0geyAwLAotICAgMjMwLCAgIDIzMSwgICAyMzQsICAgMjQxLCAgIDI0MiwgICAyNDcsICAgMjUwLCAgIDI1MywgICAyNTcsICAgMjYxLAotICAgMjY1LCAgIDI2OSwgICAyNzMsICAgMjc3LCAgIDI4MSwgICAyODUsICAgMjkxLCAgIDI5OSwgICAzMDMsICAgMzA5LAotICAgMzE3LCAgIDMyMSwgICAzMjUsICAgMzI5LCAgIDMzNSwgICAzMzksICAgMzQyLCAgIDM0NiwgICAzNTAsICAgMzUzLAotICAgMzYwLCAgIDM2NiwgICAzNzIsICAgMzc4LCAgIDM4MiwgICAzODYsICAgMzkwLCAgIDM5NCwgICAzOTgsICAgNDAyLAotICAgNDA2LCAgIDQxMCwgICA0MTQsICAgNDE4LCAgIDQyMiwgICA0MjYsICAgNDMwLCAgIDQzNCwgICA0MzgsICAgNDQyLAotICAgNDQ2LCAgIDQ1MCwgICA0NTQsICAgNDU4LCAgIDQ2MiwgICA0NjgsICAgNDc1LCAgIDQ4NiwgICA0OTMsICAgNDk2LAotICAgNTAwLCAgIDUwOCwgICA1MzMsICAgNTM4LCAgIDU0NSwgICA1NTQsICAgNTYyLCAgIDU2OCwgICA1NzksICAgNTk1LAotICAgNjA4LCAgIDYzMiwgICA2MzMsICAgNjY3LCAgIDcyNSwgICA3MzEsICAgNzMyLCAgIDczMywgICA3MzUsICAgNzM3LAotICAgNzQxLCAgIDc0MywgICA3NDUsICAgNzQ3LCAgIDc0OSwgICA3NTIsICAgNzU0LCAgIDc1OSwgICA3NjYsICAgNzY4LAotICAgNzcyLCAgIDc3NCwgICA3NzgsICAgNzgwLCAgIDc5MiwgICA3OTMsICAgNzk4LCAgIDgwMCwgICA4MDIsICAgODA0LAotICAgODA2LCAgIDgwOCwgICA4MTAsICAgODEyLCAgIDgxNCwgICA4MTYsICAgODE4LCAgIDgyMCwgICA4MjIsICAgODI0LAotICAgODI2LCAgIDgyOSwgICA4MzIsICAgODM1LCAgIDgzOCwgICA4NDAsICAgODQyLCAgIDg0NCwgICA4NDksICAgODU2LAotICAgODU3LCAgIDg2MCwgICA4NjEsICAgODY3LCAgIDg3MywgICA4ODIsICAgODg3LCAgIDg5NCwgICA4OTUsICAgODk2LAotICAgODk3LCAgIDkwMCwgICA5MDEKLX07Ci0jZW5kaWYKLQotCi0jaWYgWVlERUJVRyAhPSAwIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB5eXRuYW1lW10gPSB7ICAgIiQiLCJlcnJvciIsIiR1bmRlZmluZWQuIiwiSU5UIiwiRkxPQVQiLAotIlNUUklORyIsIk5BTUUiLCJUWVBFTkFNRSIsIk5BTUVfT1JfSU5UIiwiU1RSVUNUIiwiQ0xBU1MiLCJVTklPTiIsIkVOVU0iLCJTSVpFT0YiLAotIlVOU0lHTkVEIiwiQ09MT05DT0xPTiIsIlRFTVBMQVRFIiwiRVJST1IiLCJTSUdORURfS0VZV09SRCIsIkxPTkciLCJTSE9SVCIsIklOVF9LRVlXT1JEIiwKLSJDT05TVF9LRVlXT1JEIiwiVk9MQVRJTEVfS0VZV09SRCIsIkRPVUJMRV9LRVlXT1JEIiwiVkFSSUFCTEUiLCJBU1NJR05fTU9ESUZZIiwKLSJUSElTIiwiVFJVRUtFWVdPUkQiLCJGQUxTRUtFWVdPUkQiLCInLCciLCJBQk9WRV9DT01NQSIsIic9JyIsIic/JyIsIk9ST1IiLCJBTkRBTkQiLAotIid8JyIsIideJyIsIicmJyIsIkVRVUFMIiwiTk9URVFVQUwiLCInPCciLCInPiciLCJMRVEiLCJHRVEiLCJMU0giLCJSU0giLCInQCciLAotIicrJyIsIictJyIsIicqJyIsIicvJyIsIiclJyIsIlVOQVJZIiwiSU5DUkVNRU5UIiwiREVDUkVNRU5UIiwiQVJST1ciLCInLiciLAotIidbJyIsIicoJyIsIkJMT0NLTkFNRSIsIkZJTEVOQU1FIiwiJyEnIiwiJ34nIiwiJ10nIiwiJyknIiwiJ3snIiwiJ30nIiwiJzonIiwKLSJzdGFydCIsInR5cGVfZXhwIiwiZXhwMSIsImV4cCIsIkAxIiwibGN1cmx5IiwiYXJnbGlzdCIsInJjdXJseSIsImJsb2NrIiwidmFyaWFibGUiLAotInF1YWxpZmllZF9uYW1lIiwicHR5cGUiLCJhYnNfZGVjbCIsImRpcmVjdF9hYnNfZGVjbCIsImFycmF5X21vZCIsImZ1bmNfbW9kIiwKLSJ0eXBlIiwidHlwZWJhc2UiLCJ0eXBlbmFtZSIsIm5vbmVtcHR5X3R5cGVsaXN0IiwibmFtZSIsIm5hbWVfbm90X3R5cGVuYW1lIiwgTlVMTAotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyMVtdID0geyAgICAgMCwKLSAgICA2OSwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzEsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwKLSAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwKLSAgICA3MiwgICAgNzIsICAgIDczLCAgICA3MiwgICAgNzQsICAgIDc1LCAgICA3NSwgICAgNzUsICAgIDc2LCAgICA3MiwKLSAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwKLSAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwKLSAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwKLSAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDc3LCAgICA3NywgICAgNzcsICAgIDc4LCAgICA3OSwKLSAgICA3OSwgICAgNzgsICAgIDc4LCAgICA3OCwgICAgODAsICAgIDgwLCAgICA4MCwgICAgODAsICAgIDgwLCAgICA4MCwKLSAgICA4MSwgICAgODEsICAgIDgxLCAgICA4MSwgICAgODEsICAgIDgyLCAgICA4MiwgICAgODIsICAgIDgyLCAgICA4MiwKLSAgICA4MywgICAgODMsICAgIDg0LCAgICA4NCwgICAgODUsICAgIDg1LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwKLSAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwKLSAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwKLSAgICA4NiwgICAgODcsICAgIDg3LCAgICA4NywgICAgODcsICAgIDg4LCAgICA4OCwgICAgODksICAgIDg5LCAgICA4OSwKLSAgICA4OSwgICAgOTAsICAgIDkwCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0geyAgICAgMCwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMywgICAgIDQsICAgICAzLCAgICAgMywKLSAgICAgNCwgICAgIDQsICAgICAwLCAgICAgNSwgICAgIDEsICAgICAwLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMywKLSAgICAgNCwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgMywgICAgIDMsICAgICA1LCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgNCwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgNCwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMywKLSAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMSwKLSAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMywgICAgIDMsICAgICA0LCAgICAgMiwgICAgIDMsICAgICAxLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDEsICAgICA1LCAgICAgMiwKLSAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgMSwgICAgIDEsICAgICAxCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZhY3RbXSA9IHsgICAgIDAsCi0gICAgNTYsICAgIDU4LCAgICA2MiwgICAxMzIsICAgIDk3LCAgICA1NywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgMTE2LCAgICAgMCwgICAgIDAsICAgMTE4LCAgICA5OSwgICAxMDAsICAgIDk4LCAgICAgMCwgICAgIDAsCi0gICAxMDksICAgIDYwLCAgICA2MywgICAgNjQsICAgIDY1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgMTMzLCAgICA2NywgICAgIDAsICAgICAwLCAgICAyNSwgICAgIDIsICAgICAxLCAgICAgNCwgICAgMjYsCi0gICAgIDAsICAgIDU5LCAgICA3MiwgICAgOTUsICAgICAzLCAgICA3NSwgICAgNzQsICAgMTI4LCAgIDEzMCwgICAxMzEsCi0gICAxMjksICAgMTExLCAgIDExMiwgICAxMTMsICAgMTE0LCAgICAgMCwgICAgMTUsICAgICAwLCAgIDEyMiwgICAxMjQsCi0gICAxMjUsICAgMTIzLCAgIDExNSwgICAgNzMsICAgICAwLCAgIDEyNCwgICAxMjUsICAgMTE3LCAgIDEwMywgICAxMDEsCi0gICAxMTAsICAgMTA3LCAgIDEyMCwgICAxMjEsICAgICA3LCAgICAgOCwgICAgIDYsICAgIDExLCAgICAxMiwgICAgIDAsCi0gICAgIDAsICAgICA5LCAgICAxMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTMsICAgIDE0LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgIDIzLCAgICAyNywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDc2LCAgICA3NywgICAgODMsCi0gICAgODEsICAgICAwLCAgICAgMCwgICAgNzgsICAgIDg1LCAgICA4OCwgICAgOTAsICAgICAwLCAgICAgMCwgICAxMDUsCi0gICAxMDIsICAgMTA4LCAgICAgMCwgICAxMDQsICAgIDMzLCAgICAgMCwgICAgIDUsICAgIDU1LCAgICA1NCwgICAgIDAsCi0gICAgNTIsICAgIDUxLCAgICA1MCwgICAgNDksICAgIDQ4LCAgICA0MiwgICAgNDMsICAgIDQ2LCAgICA0NywgICAgNDQsCi0gICAgNDUsICAgIDQwLCAgICA0MSwgICAgMzQsICAgIDM4LCAgICAzOSwgICAgMzUsICAgIDM2LCAgICAzNywgICAxMzAsCi0gICAgIDAsICAgIDE3LCAgICAxNiwgICAgIDAsICAgIDIwLCAgICAxOSwgICAgIDAsICAgIDI2LCAgICAgMCwgICAgMjksCi0gICAgMzAsICAgICAwLCAgICA2OSwgICAgOTYsICAgICAwLCAgICA3MCwgICAgNzksICAgIDgwLCAgICA4NCwgICAgODIsCi0gICAgIDAsICAgIDkxLCAgICA5MywgICAgIDAsICAgMTI2LCAgICA3NSwgICAgIDAsICAgICAwLCAgICA4NywgICAgODksCi0gICAgNjEsICAgMTA2LCAgICAgMCwgICAgMzIsICAgICAwLCAgICAxOCwgICAgMjEsICAgIDIyLCAgICAgMCwgICAgMjgsCi0gICAgMzEsICAgIDcxLCAgICA5MiwgICAgODYsICAgICAwLCAgICAgMCwgICAgOTQsICAgMTE5LCAgICA1MywgICAgMjQsCi0gICAxMjcsICAgICAwLCAgICAgMCwgICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmdvdG9bXSA9IHsgICAyMTIsCi0gICAgMzcsICAgIDgwLCAgICAzOSwgICAxNjgsICAgIDQwLCAgIDExNCwgICAxNzEsICAgIDQxLCAgICA0MiwgICAgNDMsCi0gICAgNDQsICAgMTI0LCAgIDEyNSwgICAxMjYsICAgMTI3LCAgIDE4NSwgICAgNTgsICAgIDYzLCAgIDE4NywgICAxNzYsCi0gICAgNDcKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXBhY3RbXSA9IHsgICAyMDUsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgNDYsICAgIDQ2LCAgICA0NiwgICAgNDYsCi0gICAyNjksICAgIDU3LCAgICA0NiwgICAgNDYsICAgMTAwLCAgIDEzNCwgICAtMTQsLTMyNzY4LCAgIDIyOCwgICAyMjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsCi0gICAyMDUsICAgIDIxLC0zMjc2OCwgICAyMDUsICAgMjA1LC0zMjc2OCwtMzI3NjgsICAgLTE2LCAgIDUwNCwgICAyMDUsCi0gICAgMjIsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDEwNywtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDIwNSwgICAgMTQsICAgIDIzLC0zMjc2OCwgICAgIDcsCi0gICAgMjQsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDEwLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAzNCwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDE0LCAgICAxNCwgICAgMTQsICAgIDE0LCAgICAxNCwgICAtMjYsCi0gICAtMjEsICAgIDE0LCAgICAxNCwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsCi0gICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsCi0gICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwtMzI3NjgsLTMyNzY4LCAgIDQxOSwgICA0MzgsCi0gICAyMDUsLTMyNzY4LCAgIDUwNCwgICAtMjUsICAgIC0yLCAgICA0NiwgICAgNTMsICAgICA4LCAgICAgOCwgICAgIDgsCi0gICAgIDgsICAgIC0xLCAgIDM1OSwtMzI3NjgsICAgLTQxLC0zMjc2OCwtMzI3NjgsICAgICA5LCAgICA0MiwgICAgNTQsCi0tMzI3NjgsLTMyNzY4LCAgIDIyOCwtMzI3NjgsLTMyNzY4LCAgIDIwNSwgICA1MDQsICAgNTA0LCAgIDUwNCwgICA0NjcsCi0gICA1NTYsICAgNTgwLCAgIDYwMywgICA2MjUsICAgNjQ2LCAgIDY2NSwgICA2NjUsICAgMjU0LCAgIDI1NCwgICAyNTQsCi0gICAyNTQsICAgMTI0LCAgIDEyNCwgICAzNTYsICAgNDE2LCAgIDQxNiwgICAgMTQsICAgIDE0LCAgICAxNCwgICAgODksCi0gICAyMDUsLTMyNzY4LC0zMjc2OCwgICAyMDUsLTMyNzY4LC0zMjc2OCwgICAtMTcsICAgMjA1LCAgIDIwNSwtMzI3NjgsCi0tMzI3NjgsICAgMjA1LCAgICA5MywtMzI3NjgsICAgIDQ2LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0gICAgNDUsLTMyNzY4LC0zMjc2OCwgICAgNTAsLTMyNzY4LCAgIDE0NiwgICAtMjIsICAgMTI4LC0zMjc2OCwtMzI3NjgsCi0gICAzMzMsLTMyNzY4LCAgICA2OCwgICAgMTQsICAgMjA1LCAgICAxNCwgICAgMTQsLTMyNzY4LCAgICAtMywgICA1MDQsCi0gICAgMTQsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDY3LCAgIDIyOCwtMzI3NjgsLTMyNzY4LCAgIDUzMSwtMzI3NjgsCi0tMzI3NjgsICAgMTI1LCAgIDEyNiwtMzI3NjgKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPSB7LTMyNzY4LAotLTMyNzY4LCAgICAgMywgICAgLTUsLTMyNzY4LC0zMjc2OCwgICAtNDQsICAgIDEyLC0zMjc2OCwtMzI3NjgsICAgLTc2LAotLTMyNzY4LCAgICA3OSwtMzI3NjgsICAgIDExLCAgICAxNiwgICAgIDEsICAgICAwLCAgIDExMywtMzI3NjgsICAgICAyLAotLTMyNzY4Ci19OwotCi0KLSNkZWZpbmUJWVlMQVNUCQk3MjQKLQotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXl0YWJsZVtdID0geyAgICA0NiwKLSAgICA0NSwgICAxODEsICAgIDM4LCAgICA4NCwgICAxNjksICAgIDU3LCAgICA3MiwgICAyMDYsICAgIDUyLCAgICA1MywKLSAgICA1NCwgICAgNTUsICAgIDg0LCAgICA4NCwgICAgNjQsICAgIDY1LCAgIDEyMiwgICAxODgsICAgIDczLCAgICA3NCwKLSAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksICAgMTMwLCAgIDE2OSwgICAxMzEsICAgIDgyLCAgICA4MywKLSAgICA0NiwgICAgODEsICAgMTYyLCAgIDE2NSwgICAxMTMsICAgLTY2LCAgIDExNiwgICAxMjksICAgMTM1LCAgICA0NiwKLSAgIDExNSwgICAxNzAsICAgMjA3LCAgIDEzNiwgICAxMzIsICAgMTIwLCAgIDE5OCwgICAgNDgsICAgIDQ5LCAgICA1MCwKLSAgIDEzMywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAxMzQsICAgIDQ2LCAgIDEyOCwgICAxMjEsICAgIDQ4LCAgICA0OSwKLSAgICA1MCwgICAyMTAsICAgMTgyLCAgICA1OSwgICAxNzAsICAgMTIyLCAgIDEyMywgICAxMDcsICAgMTA4LCAgIDEwOSwKLSAgIDExMCwgICAxMTEsICAgMTEyLCAgIDE5MSwgICAxOTIsICAgIDYwLCAgICA2MSwgICAgNjIsICAgMTM3LCAgIDEzOCwKLSAgIDEzOSwgICAxNDAsICAgMTQxLCAgIDE0MiwgICAxNDMsICAgMTQ0LCAgIDE0NSwgICAxNDYsICAgMTQ3LCAgIDE0OCwKLSAgIDE0OSwgICAxNTAsICAgMTUxLCAgIDE1MiwgICAxNTMsICAgMTU0LCAgIDE1NSwgICAxNTYsICAgMTU3LCAgIDE1OCwKLSAgIDE1OSwgICAgNTEsICAgMTc0LCAgIC05NywgICAxNzUsICAgIDUxLCAgICA1OSwgICAtNjgsICAgMjAzLCAgIDIwOCwKLSAgIDE2MywgICAxNjYsICAgIDUxLCAgIDE2NywgICAyMDQsICAgMTc1LCAgIDE3NCwgICAxNzMsICAgIDY2LCAgICA2NywKLSAgICA2MiwgICAxMTcsICAgMTg2LCAgIDE5OSwgICAyMTMsICAgMjE0LCAgIDE3MiwgICAgNjgsICAgMTE4LCAgIDExOSwKLSAgIDE5NCwgICAgIDAsICAgMTg2LCAgIDE5MywgICAgIDUsICAgMTg5LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKLSAgIDE5MCwgICAgMTIsICAgICAwLCAgICAxNCwgICAxMjAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKLSAgICAyMCwgICAgMjEsICAgIDY5LCAgICAgMCwgICAgNzAsICAgMTk2LCAgIDEyMSwgICAgNzEsICAgMTk3LCAgICAgMCwKLSAgIDIwNSwgICAgIDAsICAgMTEzLCAgIDIwMCwgICAxMjIsICAgMTIzLCAgIDIwMSwgICAxMTgsICAgMTE5LCAgICAgMCwKLSAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgIDIwMiwgICAxMDcsICAgMTA4LCAgIDEwOSwKLSAgIDExMCwgICAxMTEsICAgMTEyLCAgIDEyMCwgICAgIDAsICAgMTk0LCAgICAgMCwgICAxODYsICAgICAwLCAgIDIwOSwKLSAgICAgMCwgICAgIDAsICAgMTgzLCAgICAgMCwgICAgIDAsICAgMTIxLCAgIDE3NywgICAxNzgsICAgMTc5LCAgIDE4MCwKLSAgICAgMCwgICAxODQsICAgICAwLCAgIDEyMiwgICAxMjMsICAgMTg2LCAgIDIxMSwgICAgIDEsICAgICAyLCAgICAgMywKLSAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywKLSAgICAxNCwgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwKLSAgICAgMCwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgIDUsICAgICAwLCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKLSAgICAgMCwgICAgMTIsICAgIDI2LCAgICAxNCwgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKLSAgICAyMCwgICAgMjEsICAgICAwLCAgICAyNywgICAgMjgsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI5LCAgICAzMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgICAwLCAgICAgMCwKLSAgICAzNiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwKLSAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgICAwLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwKLSAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDk5LCAgIDEwMCwKLSAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAyNiwgICAxMDcsICAgMTA4LCAgIDEwOSwKLSAgIDExMCwgICAxMTEsICAgMTEyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjcsICAgIDI4LCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgIDI5LCAgICAzMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNTYsICAgIDMyLCAgICAzMywKLSAgICAzNCwgICAgMzUsICAgICAwLCAgICAgMCwgICAgMzYsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAgMCwKLSAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLCAgICAyMywKLSAgICAyNCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgIDAsICAgICA1LCAgICAgMCwgICAgIDcsICAgICA4LCAgICAgOSwKLSAgICAxMCwgICAgIDAsICAgIDEyLCAgICAgMCwgICAgMTQsICAgICAwLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwKLSAgICAxOSwgICAgMjAsICAgIDIxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyOSwgICAgMzAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsICAgIDM1LCAgIDEyMCwgICAgIDAsICAgIDM2LCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTIxLCAgIDEwNywKLSAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgICAwLCAgIDEyMiwgICAxMjMsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgIDE4MywgICAgNDgsICAgMTYwLCAgICA1MCwgICAgIDcsICAgICA4LCAgICAgOSwKLSAgICAxMCwgICAgIDAsICAgIDEyLCAgICAgMCwgICAgMTQsICAgICAwLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwKLSAgICAxOSwgICAgMjAsICAgIDIxLCAgICA0OCwgICAxNjAsICAgIDUwLCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKLSAgICAgMCwgICAgMTIsICAgICAwLCAgICAxNCwgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKLSAgICAyMCwgICAgMjEsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTYxLCAgIDEwNywKLSAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDUxLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNjQsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgIDg1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNTEsICAgIDg2LCAgICA4NywKLSAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywKLSAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAgMCwKLSAgIDEwNywgICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA4NSwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxOTUsICAgIDg2LCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwKLSAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwKLSAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAgMCwgICAxMDcsICAgMTA4LCAgIDEwOSwKLSAgIDExMCwgICAxMTEsICAgMTEyLCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywKLSAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywKLSAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAgMCwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwKLSAgICA4OSwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwKLSAgICA5OSwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgICAwLCAgIDEwNywKLSAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwKLSAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwKLSAgIDEwNSwgICAxMDYsICAgICAwLCAgIDEwNywgICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgICA5MSwKLSAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwKLSAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgICAwLCAgIDEwNywgICAxMDgsICAgMTA5LCAgIDExMCwKLSAgIDExMSwgICAxMTIsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LCAgICA5OSwKLSAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAgIDAsICAgMTA3LCAgIDEwOCwKLSAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwKLSAgICA5OSwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgICAwLCAgIDEwNywKLSAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LCAgICA5OSwKLSAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAgIDAsICAgMTA3LCAgIDEwOCwKLSAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMgotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5Y2hlY2tbXSA9IHsgICAgIDAsCi0gICAgIDAsICAgICAzLCAgICAgMCwgICAgMzAsICAgIDMwLCAgICAxMSwgICAgMjEsICAgIDMwLCAgICAgNywgICAgIDgsCi0gICAgIDksICAgIDEwLCAgICAzMCwgICAgMzAsICAgIDEzLCAgICAxNCwgICAgNTgsICAgIDU5LCAgICAxOSwgICAgMjAsCi0gICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAxOSwgICAgMzAsICAgIDIxLCAgICAzNCwgICAgMzUsCi0gICAgMzEsICAgIDMxLCAgIDEwOSwgICAxMTAsICAgIDQwLCAgICAxNSwgICAgMTUsICAgIDE1LCAgICA2NSwgICAgNDAsCi0gICAgNDAsICAgIDY3LCAgICA2NSwgICAgNjUsICAgIDIxLCAgICAzOCwgICAgNjQsICAgICA2LCAgICAgNywgICAgIDgsCi0gICAgNDEsICAgICA2LCAgICAgNywgICAgIDgsICAgIDIxLCAgICA1NiwgICAgNTYsICAgIDUwLCAgICAgNiwgICAgIDcsCi0gICAgIDgsICAgIDY1LCAgICA2NCwgICAgIDcsICAgIDY3LCAgICA1OCwgICAgNTksICAgIDU0LCAgICA1NSwgICAgNTYsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjUsICAgIDIxLCAgICAxOSwgICAgMjAsICAgIDIxLCAgICA4NCwgICAgODUsCi0gICAgODYsICAgIDg3LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsCi0gICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsCi0gICAxMDYsICAgIDYwLCAgICA1MCwgICAgMTUsICAgIDYzLCAgICA2MCwgICAgIDcsICAgIDE1LCAgICA2NCwgICAgNDIsCi0gICAxMDksICAgMTEwLCAgICA2MCwgICAxMTEsICAgIDY1LCAgICA2MywgICAgNTAsICAgMTE2LCAgICAxOSwgICAgMjAsCi0gICAgMjEsICAgIDE1LCAgIDEyMywgICAxNjgsICAgICAwLCAgICAgMCwgICAxMTUsICAgIDE1LCAgICAyMiwgICAgMjMsCi0gICAxMzYsICAgIC0xLCAgIDEzMywgICAxMzMsICAgICA3LCAgIDEyNSwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsCi0gICAxMjUsICAgIDE0LCAgICAtMSwgICAgMTYsICAgIDM4LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsCi0gICAgMjMsICAgIDI0LCAgICAxOSwgICAgLTEsICAgIDIxLCAgIDE2MSwgICAgNTAsICAgIDI0LCAgIDE2NCwgICAgLTEsCi0gICAgMTUsICAgIC0xLCAgIDE2OCwgICAxNjksICAgIDU4LCAgICA1OSwgICAxNzIsICAgIDIyLCAgICAyMywgICAgLTEsCi0gICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAxNzUsICAgIDU0LCAgICA1NSwgICAgNTYsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgMzgsICAgIC0xLCAgIDE5MSwgICAgLTEsICAgMTg4LCAgICAtMSwgICAxOTUsCi0gICAgLTEsICAgIC0xLCAgICA2NSwgICAgLTEsICAgIC0xLCAgICA1MCwgICAxMTgsICAgMTE5LCAgIDEyMCwgICAxMjEsCi0gICAgLTEsICAgMTIzLCAgICAtMSwgICAgNTgsICAgIDU5LCAgIDIwNiwgICAyMDYsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsCi0gICAgMTYsICAgIC0xLCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsCi0gICAgLTEsICAgIDI3LCAgICAyOCwgICAgMjksICAgICA3LCAgICAtMSwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsCi0gICAgLTEsICAgIDE0LCAgICAzOCwgICAgMTYsICAgIC0xLCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsCi0gICAgMjMsICAgIDI0LCAgICAtMSwgICAgNDksICAgIDUwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1NCwgICAgNTUsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICAtMSwgICAgLTEsCi0gICAgNjYsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsCi0gICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAtMSwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsCi0gICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIC0xLCAgICAyNywgICAgMjgsICAgIDI5LCAgICA0NSwgICAgNDYsCi0gICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgMzgsICAgIDU0LCAgICA1NSwgICAgNTYsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDU5LCAgICA2MCwgICAgNjEsCi0gICAgNjIsICAgIDYzLCAgICAtMSwgICAgLTEsICAgIDY2LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsCi0gICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgLTEsCi0gICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAtMSwgICAgMjcsCi0gICAgMjgsICAgIDI5LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAgNywgICAgLTEsICAgICA5LCAgICAxMCwgICAgMTEsCi0gICAgMTIsICAgIC0xLCAgICAxNCwgICAgLTEsICAgIDE2LCAgICAtMSwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsCi0gICAgMjIsICAgIDIzLCAgICAyNCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTQsICAgIDU1LCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgMzgsICAgIC0xLCAgICA2NiwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MCwgICAgNTQsCi0gICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICAtMSwgICAgNTgsICAgIDU5LCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsCi0gICAgMTIsICAgIC0xLCAgICAxNCwgICAgLTEsICAgIDE2LCAgICAtMSwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsCi0gICAgMjIsICAgIDIzLCAgICAyNCwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsCi0gICAgLTEsICAgIDE0LCAgICAtMSwgICAgMTYsICAgIC0xLCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsCi0gICAgMjMsICAgIDI0LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MCwgICAgNTQsCi0gICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2MCwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDUwLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAyNiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDYwLCAgICAzMiwgICAgMzMsCi0gICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsCi0gICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgLTEsCi0gICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMjYsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY4LCAgICAzMiwgICAgMzMsICAgIDM0LCAgICAzNSwgICAgMzYsCi0gICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsCi0gICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIDU0LCAgICA1NSwgICAgNTYsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgMzMsICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksCi0gICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksCi0gICAgNTAsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksCi0gICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCi0gICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgNTQsCi0gICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsCi0gICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsCi0gICAgNTEsICAgIDUyLCAgICAtMSwgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgMzcsCi0gICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsCi0gICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsCi0gICAgNTgsICAgIDU5LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsCi0gICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIC0xLCAgICA1NCwgICAgNTUsCi0gICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCi0gICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgNTQsCi0gICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsCi0gICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIC0xLCAgICA1NCwgICAgNTUsCi0gICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTkKLX07Ci0vKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLwotI2xpbmUgMyAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQotLyogU2tlbGV0b24gb3V0cHV0IHBhcnNlciBmb3IgYmlzb24sCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0vKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCi0gICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgotICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KLQotI2lmbmRlZiBhbGxvY2EKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UgLyogbm90IEdOVSBDLiAgKi8KLSNpZiAoIWRlZmluZWQgKF9fU1REQ19fKSAmJiBkZWZpbmVkIChzcGFyYykpIHx8IGRlZmluZWQgKF9fc3BhcmNfXykgfHwgZGVmaW5lZCAoX19zcGFyYykgfHwgZGVmaW5lZCAoX19zZ2kpCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci0jZWxzZSAvKiBub3Qgc3BhcmMgKi8KLSNpZiBkZWZpbmVkIChNU0RPUykgJiYgIWRlZmluZWQgKF9fVFVSQk9DX18pCi0jZWxzZSAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KLSNpZiBkZWZpbmVkKF9BSVgpCi0gI3ByYWdtYSBhbGxvY2EKLSNlbHNlIC8qIG5vdCBNU0RPUywgX19UVVJCT0NfXywgb3IgX0FJWCAqLwotI2lmZGVmIF9faHB1eAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLXZvaWQgKmFsbG9jYSAodW5zaWduZWQgaW50KTsKLX07Ci0jZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KLXZvaWQgKmFsbG9jYSAoKTsKLSNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNlbmRpZiAvKiBfX2hwdXggKi8KLSNlbmRpZiAvKiBub3QgX0FJWCAqLwotI2VuZGlmIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLwotI2VuZGlmIC8qIG5vdCBzcGFyYy4gICovCi0jZW5kaWYgLyogbm90IEdOVSBDLiAgKi8KLSNlbmRpZiAvKiBhbGxvY2Egbm90IGRlZmluZWQuICAqLwotCi0vKiBUaGlzIGlzIHRoZSBwYXJzZXIgY29kZSB0aGF0IGlzIHdyaXR0ZW4gaW50byBlYWNoIGJpc29uIHBhcnNlcgotICB3aGVuIHRoZSAlc2VtYW50aWNfcGFyc2VyIGRlY2xhcmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGdyYW1tYXIuCi0gIEl0IHdhcyB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIGhhaXJ5IHBhcnNlcgotICB1c2VkIHdoZW4gJXNlbWFudGljX3BhcnNlciBpcyBzcGVjaWZpZWQuICAqLwotCi0vKiBOb3RlOiB0aGVyZSBtdXN0IGJlIG9ubHkgb25lIGRvbGxhciBzaWduIGluIHRoaXMgZmlsZS4KLSAgIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBsaXN0IG9mIGFjdGlvbnMsIGVhY2ggYWN0aW9uCi0gICBhcyBvbmUgY2FzZSBvZiB0aGUgc3dpdGNoLiAgKi8KLQotI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQotI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCi0jZGVmaW5lIFlZRU1QVFkJCS0yCi0jZGVmaW5lIFlZRU9GCQkwCi0jZGVmaW5lIFlZQUNDRVBUCXJldHVybigwKQotI2RlZmluZSBZWUFCT1JUIAlyZXR1cm4oMSkKLSNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycmxhYjEKLS8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLgotICAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkgdG8gZWFzZSB0aGUKLSAgIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCi0gICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCi0jZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgotI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCi0jZGVmaW5lIFlZQkFDS1VQKHRva2VuLCB2YWx1ZSkgXAotZG8JCQkJCQkJCVwKLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKLSAgICB7IHl5Y2hhciA9ICh0b2tlbiksIHl5bHZhbCA9ICh2YWx1ZSk7CQkJXAotICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCi0gICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKLSAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAotICAgIH0JCQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJXAotICAgIHsgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTsgWVlFUlJPUjsgfQlcCi13aGlsZSAoMCkKLQotI2RlZmluZSBZWVRFUlJPUgkxCi0jZGVmaW5lIFlZRVJSQ09ERQkyNTYKLQotI2lmbmRlZiBZWVBVUkUKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCkKLSNlbmRpZgotCi0jaWZkZWYgWVlQVVJFCi0jaWZkZWYgWVlMU1BfTkVFREVECi0jaWZkZWYgWVlMRVhfUEFSQU0KLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MpCi0jZW5kaWYKLSNlbHNlIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KLSNpZmRlZiBZWUxFWF9QQVJBTQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCi0jZWxzZQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCkKLSNlbmRpZgotI2VuZGlmIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KLSNlbmRpZgotCi0vKiBJZiBub25yZWVudHJhbnQsIGdlbmVyYXRlIHRoZSB2YXJpYWJsZXMgaGVyZSAqLwotCi0jaWZuZGVmIFlZUFVSRQotCi1pbnQJeXljaGFyOwkJCS8qICB0aGUgbG9va2FoZWFkIHN5bWJvbAkJKi8KLVlZU1RZUEUJeXlsdmFsOwkJCS8qICB0aGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlCQkqLwotCQkJCS8qICBsb29rYWhlYWQgc3ltYm9sCQkJKi8KLQotI2lmZGVmIFlZTFNQX05FRURFRAotWVlMVFlQRSB5eWxsb2M7CQkJLyogIGxvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rYWhlYWQJKi8KLQkJCQkvKiAgc3ltYm9sCQkJCSovCi0jZW5kaWYKLQotaW50IHl5bmVycnM7CQkJLyogIG51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyICAgICAgICovCi0jZW5kaWYgIC8qIG5vdCBZWVBVUkUgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotaW50IHl5ZGVidWc7CQkJLyogIG5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UJKi8KLS8qIFNpbmNlIHRoaXMgaXMgdW5pbml0aWFsaXplZCwgaXQgZG9lcyBub3Qgc3RvcCBtdWx0aXBsZSBwYXJzZXJzCi0gICBmcm9tIGNvZXhpc3RpbmcuICAqLwotI2VuZGlmCi0KLS8qICBZWUlOSVRERVBUSCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzCSovCi0KLSNpZm5kZWYJWVlJTklUREVQVEgKLSNkZWZpbmUgWVlJTklUREVQVEggMjAwCi0jZW5kaWYKLQotLyogIFlZTUFYREVQVEggaXMgdGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvCi0gICAgKGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLiAgKi8KLQotI2lmIFlZTUFYREVQVEggPT0gMAotI3VuZGVmIFlZTUFYREVQVEgKLSNlbmRpZgotCi0jaWZuZGVmIFlZTUFYREVQVEgKLSNkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAotI2VuZGlmCi0KLS8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotaW50IHl5cGFyc2UgKHZvaWQpOwotI2VuZGlmCi0MCi0jaWYgX19HTlVDX18gPiAxCQkvKiBHTlUgQyBhbmQgR05VIEMrKyBkZWZpbmUgdGhpcy4gICovCi0jZGVmaW5lIF9feXlfbWVtY3B5KFRPLEZST00sQ09VTlQpCV9fYnVpbHRpbl9tZW1jcHkoVE8sRlJPTSxDT1VOVCkKLSNlbHNlCQkJCS8qIG5vdCBHTlUgQyBvciBDKysgKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLQotLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKLSAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1fX3l5X21lbWNweSAodG8sIGZyb20sIGNvdW50KQotICAgICBjaGFyICp0bzsKLSAgICAgY2hhciAqZnJvbTsKLSAgICAgaW50IGNvdW50OwotewotICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKLSAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOwotICByZWdpc3RlciBpbnQgaSA9IGNvdW50OwotCi0gIHdoaWxlIChpLS0gPiAwKQotICAgICp0KysgPSAqZisrOwotfQotCi0jZWxzZSAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcwotICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLwotc3RhdGljIHZvaWQKLV9feXlfbWVtY3B5IChjaGFyICp0bywgY2hhciAqZnJvbSwgaW50IGNvdW50KQotewotICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKLSAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOwotICByZWdpc3RlciBpbnQgaSA9IGNvdW50OwotCi0gIHdoaWxlIChpLS0gPiAwKQotICAgICp0KysgPSAqZisrOwotfQotCi0jZW5kaWYKLSNlbmRpZgotDAotI2xpbmUgMTk2ICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotCi0vKiBUaGUgdXNlciBjYW4gZGVmaW5lIFlZUEFSU0VfUEFSQU0gYXMgdGhlIG5hbWUgb2YgYW4gYXJndW1lbnQgdG8gYmUgcGFzc2VkCi0gICBpbnRvIHl5cGFyc2UuICBUaGUgYXJndW1lbnQgc2hvdWxkIGhhdmUgdHlwZSB2b2lkICouCi0gICBJdCBzaG91bGQgYWN0dWFsbHkgcG9pbnQgdG8gYW4gb2JqZWN0LgotICAgR3JhbW1hciBhY3Rpb25zIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlIGJ5IGNhc3RpbmcgaXQKLSAgIHRvIHRoZSBwcm9wZXIgcG9pbnRlciB0eXBlLiAgKi8KLQotI2lmZGVmIFlZUEFSU0VfUEFSQU0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAotI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIFlZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMIHZvaWQgKllZUEFSU0VfUEFSQU07Ci0jZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZWxzZSAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSNlbmRpZiAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLwotCi1pbnQKLXl5cGFyc2UoWVlQQVJTRV9QQVJBTV9BUkcpCi0gICAgIFlZUEFSU0VfUEFSQU1fREVDTAotewotICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKLSAgcmVnaXN0ZXIgaW50IHl5bjsKLSAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOwotICByZWdpc3RlciBZWVNUWVBFICp5eXZzcDsKLSAgaW50IHl5ZXJyc3RhdHVzOwkvKiAgbnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZCAqLwotICBpbnQgeXljaGFyMSA9IDA7CQkvKiAgbG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIgKi8KLQotICBzaG9ydAl5eXNzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc3RhdGUgc3RhY2sJCQkqLwotICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjawkJKi8KLQotICBzaG9ydCAqeXlzcyA9IHl5c3NhOwkJLyogIHJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycyAqLwotICBZWVNUWVBFICp5eXZzID0geXl2c2E7CS8qICB0byBhbGxvdyB5eW92ZXJmbG93IHRvIHhyZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlICovCi0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgbG9jYXRpb24gc3RhY2sJCQkqLwotICBZWUxUWVBFICp5eWxzID0geXlsc2E7Ci0gIFlZTFRZUEUgKnl5bHNwOwotCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSwgeXlsc3AtLSkKLSNlbHNlCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSkKLSNlbmRpZgotCi0gIGludCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOwotCi0jaWZkZWYgWVlQVVJFCi0gIGludCB5eWNoYXI7Ci0gIFlZU1RZUEUgeXlsdmFsOwotICBpbnQgeXluZXJyczsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxsb2M7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIFlZU1RZUEUgeXl2YWw7CQkvKiAgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmV0dXJuCQkqLwotCQkJCS8qICBzZW1hbnRpYyB2YWx1ZXMgZnJvbSB0aGUgYWN0aW9uCSovCi0JCQkJLyogIHJvdXRpbmVzCQkJCSovCi0KLSAgaW50IHl5bGVuOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpOwotI2VuZGlmCi0KLSAgeXlzdGF0ZSA9IDA7Ci0gIHl5ZXJyc3RhdHVzID0gMDsKLSAgeXluZXJycyA9IDA7Ci0gIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwotCi0gIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCi0gICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawotICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCi0gICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLQotICB5eXNzcCA9IHl5c3MgLSAxOwotICB5eXZzcCA9IHl5dnM7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwID0geXlsczsKLSNlbmRpZgotCi0vKiBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiAgeXlzdGF0ZSAgLiAgKi8KLS8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCi0gICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuICAqLwoteXluZXdzdGF0ZToKLQotICAqKyt5eXNzcCA9IHl5c3RhdGU7Ci0KLSAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0gICAgewotICAgICAgLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHhyZWFsbG9jYXRlIHRoZSBzdGFjayAqLwotICAgICAgLyogVXNlIGNvcGllcyBvZiB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvIG1lbW9yeS4gKi8KLSAgICAgIFlZU1RZUEUgKnl5dnMxID0geXl2czsKLSAgICAgIHNob3J0ICp5eXNzMSA9IHl5c3M7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICBZWUxUWVBFICp5eWxzMSA9IHl5bHM7Ci0jZW5kaWYKLQotICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCi0gICAgICBpbnQgc2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7Ci0KLSNpZmRlZiB5eW92ZXJmbG93Ci0gICAgICAvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZgotCSB0aGUgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICAqLwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLAotCSBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KLSAgICAgIHl5b3ZlcmZsb3coInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCi0JCSAmeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAmeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAmeXlsczEsIHNpemUgKiBzaXplb2YgKCp5eWxzcCksCi0JCSAmeXlzdGFja3NpemUpOwotI2Vsc2UKLSAgICAgIHl5b3ZlcmZsb3coInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCi0JCSAmeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAmeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAmeXlzdGFja3NpemUpOwotI2VuZGlmCi0KLSAgICAgIHl5c3MgPSB5eXNzMTsgeXl2cyA9IHl5dnMxOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlscyA9IHl5bHMxOwotI2VuZGlmCi0jZWxzZSAvKiBubyB5eW92ZXJmbG93ICovCi0gICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+PSBZWU1BWERFUFRIKQotCXsKLQkgIHl5ZXJyb3IoInBhcnNlciBzdGFjayBvdmVyZmxvdyIpOwotCSAgcmV0dXJuIDI7Ci0JfQotICAgICAgeXlzdGFja3NpemUgKj0gMjsKLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+IFlZTUFYREVQVEgpCi0JeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOwotICAgICAgeXlzcyA9IChzaG9ydCAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXlzc3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5c3MsIChjaGFyICopeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCkpOwotICAgICAgeXl2cyA9IChZWVNUWVBFICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eXZzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXl2cywgKGNoYXIgKil5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzID0gKFlZTFRZUEUgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eWxzLCAoY2hhciAqKXl5bHMxLCBzaXplICogc2l6ZW9mICgqeXlsc3ApKTsKLSNlbmRpZgotI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLQotICAgICAgeXlzc3AgPSB5eXNzICsgc2l6ZSAtIDE7Ci0gICAgICB5eXZzcCA9IHl5dnMgKyBzaXplIC0gMTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHNwID0geXlscyArIHNpemUgLSAxOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWRcbiIsIHl5c3RhY2tzaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKLQlZWUFCT1JUOwotICAgIH0KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKTsKLSNlbmRpZgotCi0gIGdvdG8geXliYWNrdXA7Ci0geXliYWNrdXA6Ci0KLS8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLwotLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0vKiB5eXJlc3VtZTogKi8KLQotICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KLQotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlGTEFHKQotICAgIGdvdG8geXlkZWZhdWx0OwotCi0gIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0KLSAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCi0gICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCi0KLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQotICAgIHsKLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKTsKLSNlbmRpZgotICAgICAgeXljaGFyID0gWVlMRVg7Ci0gICAgfQotCi0gIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCi0KLSAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCi0gICAgewotICAgICAgeXljaGFyMSA9IDA7Ci0gICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUoeXljaGFyKTsKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UgbWVhbmluZwotCSAgICAgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLwotI2lmZGVmIFlZUFJJTlQKLQkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOwotI2VuZGlmCi0JICBmcHJpbnRmIChzdGRlcnIsICIpXG4iKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgeXluICs9IHl5Y2hhcjE7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0KLSAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgotICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCi0gICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgotICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCi0gICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KLSAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLwotCi0gIGlmICh5eW4gPCAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQotCWdvdG8geXllcnJsYWI7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0KLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCi0gIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLSNlbmRpZgotCi0gIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCi0gIGlmICh5eWNoYXIgIT0gWVlFT0YpCi0gICAgeXljaGFyID0gWVlFTVBUWTsKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgKisreXlsc3AgPSB5eWxsb2M7Ci0jZW5kaWYKLQotICAvKiBjb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yIHN0YXR1cy4gICovCi0gIGlmICh5eWVycnN0YXR1cykgeXllcnJzdGF0dXMtLTsKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLS8qIERvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICAqLwoteXlkZWZhdWx0OgotCi0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycmxhYjsKLQotLyogRG8gYSByZWR1Y3Rpb24uICB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLwoteXlyZWR1Y2U6Ci0gIHl5bGVuID0geXlyMlt5eW5dOwotICBpZiAoeXlsZW4gPiAwKQotICAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07IC8qIGltcGxlbWVudCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb24gKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAotCSAgICAgICB5eW4sIHl5cmxpbmVbeXluXSk7Ci0KLSAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLwotICAgICAgZm9yIChpID0geXlwcmhzW3l5bl07IHl5cmhzW2ldID4gMDsgaSsrKQotCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbaV1dKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKLSAgICB9Ci0jZW5kaWYKLQotCi0gIHN3aXRjaCAoeXluKSB7Ci0KLWNhc2UgMzoKLSNsaW5lIDIzNSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSh5eXZzcFswXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7OwotICAgIGJyZWFrO30KLWNhc2UgNToKLSNsaW5lIDI0MyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0NPTU1BKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjoKLSNsaW5lIDI0OCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzoKLSNsaW5lIDI1MSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQUREUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg6Ci0jbGluZSAyNTQgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX05FRyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk6Ci0jbGluZSAyNTggImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0xPR0lDQUxfTk9UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA6Ci0jbGluZSAyNjIgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NPTVBMRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMToKLSNsaW5lIDI2NiAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUFJFSU5DUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTI6Ci0jbGluZSAyNzAgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BSRURFQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEzOgotI2xpbmUgMjc0ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QT1NUSU5DUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTQ6Ci0jbGluZSAyNzggImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BPU1RERUNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNToKLSNsaW5lIDI4MiAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfU0laRU9GKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTY6Ci0jbGluZSAyODYgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9QVFIpOwotCQkJICB3cml0ZV9leHBfc3RyaW5nICh5eXZzcFswXS5zdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1BUUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE3OgotI2xpbmUgMjkyICJjLWV4cC55IgoteyAvKiBleHAtPnR5cGU6Om5hbWUgYmVjb21lcyBleHAtPiooJnR5cGU6Om5hbWUpICovCi0JCQkgIC8qIE5vdGU6IHRoaXMgZG9lc24ndCB3b3JrIGlmIG5hbWUgaXMgYQotCQkJICAgICBzdGF0aWMgbWVtYmVyISAgRklYTUUgKi8KLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQUREUik7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9NUFRSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTg6Ci0jbGluZSAzMDAgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9NUFRSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTk6Ci0jbGluZSAzMDQgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOwotCQkJICB3cml0ZV9leHBfc3RyaW5nICh5eXZzcFswXS5zdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1NUUlVDVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIwOgotI2xpbmUgMzEwICJjLWV4cC55IgoteyAvKiBleHAudHlwZTo6bmFtZSBiZWNvbWVzIGV4cC4qKCZ0eXBlOjpuYW1lKSAqLwotCQkJICAvKiBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayBpZiBuYW1lIGlzIGEKLQkJCSAgICAgc3RhdGljIG1lbWJlciEgIEZJWE1FICovCi0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0FERFIpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfTUVNQkVSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjE6Ci0jbGluZSAzMTggImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9NRU1CRVIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMjoKLSNsaW5lIDMyMiAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQlNDUklQVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIzOgotI2xpbmUgMzI4ICJjLWV4cC55IgoteyBzdGFydF9hcmdsaXN0ICgpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNDoKLSNsaW5lIDMzMCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0ZVTkNBTEwpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBlbmRfYXJnbGlzdCAoKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9GVU5DQUxMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjU6Ci0jbGluZSAzMzYgImMtZXhwLnkiCi17IHN0YXJ0X2FyZ2xpc3QgKCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI3OgotI2xpbmUgMzQzICJjLWV4cC55IgoteyBhcmdsaXN0X2xlbiA9IDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI4OgotI2xpbmUgMzQ3ICJjLWV4cC55IgoteyBhcmdsaXN0X2xlbisrOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyOToKLSNsaW5lIDM1MSAiYy1leHAueSIKLXsgeXl2YWwubHZhbCA9IGVuZF9hcmdsaXN0ICgpIC0gMTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzA6Ci0jbGluZSAzNTQgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIDApOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSB5eXZzcFswXS5sdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0FSUkFZKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzE6Ci0jbGluZSAzNjEgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01FTVZBTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbLTJdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NRU1WQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMjoKLSNsaW5lIDM2NyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbLTJdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzM6Ci0jbGluZSAzNzMgImMtZXhwLnkiCi17IDsKLSAgICBicmVhazt9Ci1jYXNlIDM0OgotI2xpbmUgMzc5ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVQRUFUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzU6Ci0jbGluZSAzODMgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9NVUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNjoKLSNsaW5lIDM4NyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0RJVik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM3OgotI2xpbmUgMzkxICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVNKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzg6Ci0jbGluZSAzOTUgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BREQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzOToKLSNsaW5lIDM5OSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQwOgotI2xpbmUgNDAzICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTFNIKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDE6Ci0jbGluZSA0MDcgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SU0gpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MjoKLSNsaW5lIDQxMSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0VRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDM6Ci0jbGluZSA0MTUgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9OT1RFUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ0OgotI2xpbmUgNDE5ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVRKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDU6Ci0jbGluZSA0MjMgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HRVEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NjoKLSNsaW5lIDQyNyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFU1MpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NzoKLSNsaW5lIDQzMSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dUUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ4OgotI2xpbmUgNDM1ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9BTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0OToKLSNsaW5lIDQzOSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfWE9SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTA6Ci0jbGluZSA0NDMgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX0lPUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUxOgotI2xpbmUgNDQ3ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9BTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MjoKLSNsaW5lIDQ1MSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MzoKLSNsaW5lIDQ1NSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFRFUk5PUF9DT05EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTQ6Ci0jbGluZSA0NTkgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR04pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NToKLSNsaW5lIDQ2MyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTl9NT0RJRlkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoeXl2c3BbLTFdLm9wY29kZSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR05fTU9ESUZZKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTY6Ci0jbGluZSA0NjkgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFswXS50eXBlZF92YWxfaW50LnR5cGUpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSh5eXZzcFswXS50eXBlZF92YWxfaW50LnZhbCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU3OgotI2xpbmUgNDc2ICJjLWV4cC55IgoteyBZWVNUWVBFIHZhbDsKLQkJCSAgcGFyc2VfbnVtYmVyICh5eXZzcFswXS5zc3ltLnN0b2tlbi5wdHIsIHl5dnNwWzBdLnNzeW0uc3Rva2VuLmxlbmd0aCwgMCwgJnZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh2YWwudHlwZWRfdmFsX2ludC50eXBlKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCl2YWwudHlwZWRfdmFsX2ludC52YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA1ODoKLSNsaW5lIDQ4NyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbMF0udHlwZWRfdmFsX2Zsb2F0LnR5cGUpOwotCQkJICB3cml0ZV9leHBfZWx0X2RibGNzdCAoeXl2c3BbMF0udHlwZWRfdmFsX2Zsb2F0LmR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjE6Ci0jbGluZSA1MDEgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfaW50KTsKLQkJCSAgQ0hFQ0tfVFlQRURFRiAoeXl2c3BbLTFdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBUWVBFX0xFTkdUSCAoeXl2c3BbLTFdLnR2YWwpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MjoKLSNsaW5lIDUwOSAiYy1leHAueSIKLXsgLyogQyBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgaW50byBhcnJheSBjb25zdGFudHMgd2l0aAotCQkJICAgICBhbiBleHBsaWNpdCBudWxsIGJ5dGUgYWRkZWQgYXQgdGhlIGVuZC4gIFRodXMKLQkJCSAgICAgdGhlIGFycmF5IHVwcGVyIGJvdW5kIGlzIHRoZSBzdHJpbmcgbGVuZ3RoLgotCQkJICAgICBUaGVyZSBpcyBubyBzdWNoIHRoaW5nIGluIEMgYXMgYSBjb21wbGV0ZWx5IGVtcHR5Ci0JCQkgICAgIHN0cmluZy4gKi8KLQkJCSAgY2hhciAqc3AgPSB5eXZzcFswXS5zdmFsLnB0cjsgaW50IGNvdW50ID0geXl2c3BbMF0uc3ZhbC5sZW5ndGg7Ci0JCQkgIHdoaWxlIChjb3VudC0tID4gMCkKLQkJCSAgICB7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9jaGFyKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpKCpzcCsrKSk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgICAgfQotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2NoYXIpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSdcMCcpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIDApOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAoeXl2c3BbMF0uc3ZhbC5sZW5ndGgpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0FSUkFZKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjM6Ci0jbGluZSA1MzQgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NDoKLSNsaW5lIDUzOSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9ib29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjU6Ci0jbGluZSA1NDYgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfYm9vbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY2OgotI2xpbmUgNTU1ICJjLWV4cC55IgotewotCQkJICBpZiAoeXl2c3BbMF0uc3N5bS5zeW0pCi0JCQkgICAgeXl2YWwuYnZhbCA9IFNZTUJPTF9CTE9DS19WQUxVRSAoeXl2c3BbMF0uc3N5bS5zeW0pOwotCQkJICBlbHNlCi0JCQkgICAgZXJyb3IgKCJObyBmaWxlIG9yIGZ1bmN0aW9uIFwiJXNcIi4iLAotCQkJCSAgIGNvcHlfbmFtZSAoeXl2c3BbMF0uc3N5bS5zdG9rZW4pKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDY3OgotI2xpbmUgNTYzICJjLWV4cC55IgotewotCQkJICB5eXZhbC5idmFsID0geXl2c3BbMF0uYnZhbDsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDY4OgotI2xpbmUgNTY5ICJjLWV4cC55IgoteyBzdHJ1Y3Qgc3ltYm9sICp0ZW0KLQkJCSAgICA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksIHl5dnNwWy0yXS5idmFsLAotCQkJCQkgICAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKLQkJCQkJICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7Ci0JCQkgIGlmICghdGVtIHx8IFNZTUJPTF9DTEFTUyAodGVtKSAhPSBMT0NfQkxPQ0spCi0JCQkgICAgZXJyb3IgKCJObyBmdW5jdGlvbiBcIiVzXCIgaW4gc3BlY2lmaWVkIGNvbnRleHQuIiwKLQkJCQkgICBjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpKTsKLQkJCSAgeXl2YWwuYnZhbCA9IFNZTUJPTF9CTE9DS19WQUxVRSAodGVtKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjk6Ci0jbGluZSA1ODAgImMtZXhwLnkiCi17IHN0cnVjdCBzeW1ib2wgKnN5bTsKLQkJCSAgc3ltID0gbG9va3VwX3N5bWJvbCAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwgeXl2c3BbLTJdLmJ2YWwsCi0JCQkJCSAgICAgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsCi0JCQkJCSAgICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7Ci0JCQkgIGlmIChzeW0gPT0gMCkKLQkJCSAgICBlcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gc3BlY2lmaWVkIGNvbnRleHQuIiwKLQkJCQkgICBjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpKTsKLQotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgLyogYmxvY2tfZm91bmQgaXMgc2V0IGJ5IGxvb2t1cF9zeW1ib2wuICAqLwotCQkJICB3cml0ZV9leHBfZWx0X2Jsb2NrIChibG9ja19mb3VuZCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzA6Ci0jbGluZSA1OTYgImMtZXhwLnkiCi17Ci0JCQkgIHN0cnVjdCB0eXBlICp0eXBlID0geXl2c3BbLTJdLnR2YWw7Ci0JCQkgIGlmIChUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QKLQkJCSAgICAgICYmIFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX1VOSU9OKQotCQkJICAgIGVycm9yICgiYCVzJyBpcyBub3QgZGVmaW5lZCBhcyBhbiBhZ2dyZWdhdGUgdHlwZS4iLAotCQkJCSAgIFRZUEVfTkFNRSAodHlwZSkpOwotCi0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TQ09QRSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodHlwZSk7Ci0JCQkgIHdyaXRlX2V4cF9zdHJpbmcgKHl5dnNwWzBdLnN2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU0NPUEUpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNzE6Ci0jbGluZSA2MDkgImMtZXhwLnkiCi17Ci0JCQkgIHN0cnVjdCB0eXBlICp0eXBlID0geXl2c3BbLTNdLnR2YWw7Ci0JCQkgIHN0cnVjdCBzdG9rZW4gdG1wX3Rva2VuOwotCQkJICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfU1RSVUNUCi0JCQkgICAgICAmJiBUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9VTklPTikKLQkJCSAgICBlcnJvciAoImAlcycgaXMgbm90IGRlZmluZWQgYXMgYW4gYWdncmVnYXRlIHR5cGUuIiwKLQkJCQkgICBUWVBFX05BTUUgKHR5cGUpKTsKLQotCQkJICB0bXBfdG9rZW4ucHRyID0gKGNoYXIqKSBhbGxvY2EgKHl5dnNwWzBdLnN2YWwubGVuZ3RoICsgMik7Ci0JCQkgIHRtcF90b2tlbi5sZW5ndGggPSB5eXZzcFswXS5zdmFsLmxlbmd0aCArIDE7Ci0JCQkgIHRtcF90b2tlbi5wdHJbMF0gPSAnfic7Ci0JCQkgIG1lbWNweSAodG1wX3Rva2VuLnB0cisxLCB5eXZzcFswXS5zdmFsLnB0ciwgeXl2c3BbMF0uc3ZhbC5sZW5ndGgpOwotCQkJICB0bXBfdG9rZW4ucHRyW3RtcF90b2tlbi5sZW5ndGhdID0gMDsKLQotCQkJICAvKiBDaGVjayBmb3IgdmFsaWQgZGVzdHJ1Y3RvciBuYW1lLiAgKi8KLQkJCSAgZGVzdHJ1Y3Rvcl9uYW1lX3AgKHRtcF90b2tlbi5wdHIsIHR5cGUpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU0NPUEUpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHR5cGUpOwotCQkJICB3cml0ZV9leHBfc3RyaW5nICh0bXBfdG9rZW4pOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU0NPUEUpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNzM6Ci0jbGluZSA2MzQgImMtZXhwLnkiCi17Ci0JCQkgIGNoYXIgKm5hbWUgPSBjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpOwotCQkJICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0JCQkgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKLQotCQkJICBzeW0gPQotCQkJICAgIGxvb2t1cF9zeW1ib2wgKG5hbWUsIChjb25zdCBzdHJ1Y3QgYmxvY2sgKikgTlVMTCwKLQkJCQkJICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAotCQkJCQkgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7Ci0JCQkgIGlmIChzeW0pCi0JCQkgICAgewotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X2Jsb2NrIChOVUxMKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0KLQkJCSAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAobmFtZSwgTlVMTCwgTlVMTCk7Ci0JCQkgIGlmIChtc3ltYm9sICE9IE5VTEwpCi0JCQkgICAgewotCQkJICAgICAgd3JpdGVfZXhwX21zeW1ib2wgKG1zeW1ib2wsCi0JCQkJCQkgbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQpLAotCQkJCQkJIGJ1aWx0aW5fdHlwZV9pbnQpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzICgpKQotCQkJICAgICAgZXJyb3IgKCJObyBzeW1ib2wgdGFibGUgaXMgbG9hZGVkLiAgVXNlIHRoZSBcImZpbGVcIiBjb21tYW5kLiIpOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBjdXJyZW50IGNvbnRleHQuIiwgbmFtZSk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA3NDoKLSNsaW5lIDY2OCAiYy1leHAueSIKLXsgc3RydWN0IHN5bWJvbCAqc3ltID0geXl2c3BbMF0uc3N5bS5zeW07Ci0KLQkJCSAgaWYgKHN5bSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc3ltYm9sX3JlYWRfbmVlZHNfZnJhbWUgKHN5bSkpCi0JCQkJewotCQkJCSAgaWYgKGlubmVybW9zdF9ibG9jayA9PSAwIHx8Ci0JCQkJICAgICAgY29udGFpbmVkX2luIChibG9ja19mb3VuZCwgCi0JCQkJCQkgICAgaW5uZXJtb3N0X2Jsb2NrKSkKLQkJCQkgICAgaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7Ci0JCQkJfQotCi0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgICAgIC8qIFdlIHdhbnQgdG8gdXNlIHRoZSBzZWxlY3RlZCBmcmFtZSwgbm90Ci0JCQkJIGFub3RoZXIgbW9yZSBpbm5lciBmcmFtZSB3aGljaCBoYXBwZW5zIHRvCi0JCQkJIGJlIGluIHRoZSBzYW1lIGJsb2NrLiAgKi8KLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKE5VTEwpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9zeW0gKHN5bSk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKHl5dnNwWzBdLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIEMrKzogaXQgaGFuZ3Mgb2ZmIG9mIGB0aGlzJy4gIE11c3QKLQkJCSAgICAgICAgIG5vdCBpbmFkdmVydGVudGx5IGNvbnZlcnQgZnJvbSBhIG1ldGhvZCBjYWxsCi0JCQkJIHRvIGRhdGEgcmVmLiAgKi8KLQkJCSAgICAgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fCAKLQkJCQkgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIGlubmVybW9zdF9ibG9jaykpCi0JCQkJaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9zdHJpbmcgKHl5dnNwWzBdLnNzeW0uc3Rva2VuKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9QVFIpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKLQkJCSAgICAgIHJlZ2lzdGVyIGNoYXIgKmFyZyA9IGNvcHlfbmFtZSAoeXl2c3BbMF0uc3N5bS5zdG9rZW4pOwotCi0JCQkgICAgICBtc3ltYm9sID0KLQkJCQlsb29rdXBfbWluaW1hbF9zeW1ib2wgKGFyZywgTlVMTCwgTlVMTCk7Ci0JCQkgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQotCQkJCXsKLQkJCQkgIHdyaXRlX2V4cF9tc3ltYm9sIChtc3ltYm9sLAotCQkJCQkJICAgICBsb29rdXBfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlX2ludCksCi0JCQkJCQkgICAgIGJ1aWx0aW5fdHlwZV9pbnQpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UgaWYgKCFoYXZlX2Z1bGxfc3ltYm9scyAoKSAmJiAhaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCi0JCQkJZXJyb3IgKCJObyBzeW1ib2wgdGFibGUgaXMgbG9hZGVkLiAgVXNlIHRoZSBcImZpbGVcIiBjb21tYW5kLiIpOwotCQkJICAgICAgZWxzZQotCQkJCWVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBjdXJyZW50IGNvbnRleHQuIiwKLQkJCQkgICAgICAgY29weV9uYW1lICh5eXZzcFswXS5zc3ltLnN0b2tlbikpOwotCQkJICAgIH0KLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDc4OgotI2xpbmUgNzM0ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gZm9sbG93X3R5cGVzICh5eXZzcFstMV0udHZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDc5OgotI2xpbmUgNzM2ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gZm9sbG93X3R5cGVzICh5eXZzcFstMl0udHZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDgwOgotI2xpbmUgNzM4ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gZm9sbG93X3R5cGVzICh5eXZzcFstMl0udHZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDgxOgotI2xpbmUgNzQyICJjLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX3BvaW50ZXIpOyB5eXZhbC52b2lkdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgODI6Ci0jbGluZSA3NDQgImMtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfcG9pbnRlcik7IHl5dmFsLnZvaWR2YWwgPSB5eXZzcFswXS52b2lkdmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MzoKLSNsaW5lIDc0NiAiYy1leHAueSIKLXsgcHVzaF90eXBlICh0cF9yZWZlcmVuY2UpOyB5eXZhbC52b2lkdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgODQ6Ci0jbGluZSA3NDggImMtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfcmVmZXJlbmNlKTsgeXl2YWwudm9pZHZhbCA9IHl5dnNwWzBdLnZvaWR2YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg2OgotI2xpbmUgNzUzICJjLWV4cC55IgoteyB5eXZhbC52b2lkdmFsID0geXl2c3BbLTFdLnZvaWR2YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg3OgotI2xpbmUgNzU1ICJjLWV4cC55IgotewotCQkJICBwdXNoX3R5cGVfaW50ICh5eXZzcFswXS5sdmFsKTsKLQkJCSAgcHVzaF90eXBlICh0cF9hcnJheSk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA4ODoKLSNsaW5lIDc2MCAiYy1leHAueSIKLXsKLQkJCSAgcHVzaF90eXBlX2ludCAoeXl2c3BbMF0ubHZhbCk7Ci0JCQkgIHB1c2hfdHlwZSAodHBfYXJyYXkpOwotCQkJICB5eXZhbC52b2lkdmFsID0gMDsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDg5OgotI2xpbmUgNzY3ICJjLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX2Z1bmN0aW9uKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTA6Ci0jbGluZSA3NjkgImMtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfZnVuY3Rpb24pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5MToKLSNsaW5lIDc3MyAiYy1leHAueSIKLXsgeXl2YWwubHZhbCA9IC0xOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5MjoKLSNsaW5lIDc3NSAiYy1leHAueSIKLXsgeXl2YWwubHZhbCA9IHl5dnNwWy0xXS50eXBlZF92YWxfaW50LnZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgOTM6Ci0jbGluZSA3NzkgImMtZXhwLnkiCi17IHl5dmFsLnZvaWR2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5NDoKLSNsaW5lIDc4MSAiYy1leHAueSIKLXsgZnJlZSAoKFBUUil5eXZzcFstMV0udHZlYyk7IHl5dmFsLnZvaWR2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5NjoKLSNsaW5lIDc5NCAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF9tZW1iZXJfdHlwZSAoYnVpbHRpbl90eXBlX2ludCwgeXl2c3BbLTJdLnR2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5NzoKLSNsaW5lIDc5OSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IHl5dnNwWzBdLnRzeW0udHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTg6Ci0jbGluZSA4MDEgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfaW50OyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5OToKLSNsaW5lIDgwMyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9sb25nOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDA6Ci0jbGluZSA4MDUgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfc2hvcnQ7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwMToKLSNsaW5lIDgwNyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9sb25nOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDI6Ci0jbGluZSA4MDkgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZzsgOwotICAgIGJyZWFrO30KLWNhc2UgMTAzOgotI2xpbmUgODExICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2xvbmdfbG9uZzsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA0OgotI2xpbmUgODEzICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2xvbmdfbG9uZzsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA1OgotI2xpbmUgODE1ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZzsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA2OgotI2xpbmUgODE3ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZzsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA3OgotI2xpbmUgODE5ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX3Nob3J0OyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDg6Ci0jbGluZSA4MjEgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfc2hvcnQ7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwOToKLSNsaW5lIDgyMyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9kb3VibGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExMDoKLSNsaW5lIDgyNSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9sb25nX2RvdWJsZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTExOgotI2xpbmUgODI3ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX3N0cnVjdCAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwKLQkJCQkJICAgICAgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTEyOgotI2xpbmUgODMwICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX3N0cnVjdCAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwKLQkJCQkJICAgICAgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTEzOgotI2xpbmUgODMzICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX3VuaW9uIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLAotCQkJCQkgICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jayk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExNDoKLSNsaW5lIDgzNiAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF9lbnVtIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLAotCQkJCQkgICAgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE1OgotI2xpbmUgODM5ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lIChUWVBFX05BTUUoeXl2c3BbMF0udHN5bS50eXBlKSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExNjoKLSNsaW5lIDg0MSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9pbnQ7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExNzoKLSNsaW5lIDg0MyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF9zaWduZWRfdHlwZW5hbWUgKFRZUEVfTkFNRSh5eXZzcFswXS50c3ltLnR5cGUpKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE4OgotI2xpbmUgODQ1ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ludDsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE5OgotI2xpbmUgODUwICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX3RlbXBsYXRlX3R5cGUoY29weV9uYW1lKHl5dnNwWy0zXS5zdmFsKSwgeXl2c3BbLTFdLnR2YWwsCi0JCQkJCQkgICAgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDEyMDoKLSNsaW5lIDg1NiAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IHl5dnNwWzBdLnR2YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyMToKLSNsaW5lIDg1NyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IHl5dnNwWzBdLnR2YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyMzoKLSNsaW5lIDg2MiAiYy1leHAueSIKLXsKLQkJICB5eXZhbC50c3ltLnN0b2tlbi5wdHIgPSAiaW50IjsKLQkJICB5eXZhbC50c3ltLnN0b2tlbi5sZW5ndGggPSAzOwotCQkgIHl5dmFsLnRzeW0udHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDEyNDoKLSNsaW5lIDg2OCAiYy1leHAueSIKLXsKLQkJICB5eXZhbC50c3ltLnN0b2tlbi5wdHIgPSAibG9uZyI7Ci0JCSAgeXl2YWwudHN5bS5zdG9rZW4ubGVuZ3RoID0gNDsKLQkJICB5eXZhbC50c3ltLnR5cGUgPSBidWlsdGluX3R5cGVfbG9uZzsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgMTI1OgotI2xpbmUgODc0ICJjLWV4cC55IgotewotCQkgIHl5dmFsLnRzeW0uc3Rva2VuLnB0ciA9ICJzaG9ydCI7Ci0JCSAgeXl2YWwudHN5bS5zdG9rZW4ubGVuZ3RoID0gNTsKLQkJICB5eXZhbC50c3ltLnR5cGUgPSBidWlsdGluX3R5cGVfc2hvcnQ7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDEyNjoKLSNsaW5lIDg4MyAiYy1leHAueSIKLXsgeXl2YWwudHZlYyA9IChzdHJ1Y3QgdHlwZSAqKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSAqIDIpOwotCQkgIHl5dmFsLml2ZWNbMF0gPSAxOwkvKiBOdW1iZXIgb2YgdHlwZXMgaW4gdmVjdG9yICovCi0JCSAgeXl2YWwudHZlY1sxXSA9IHl5dnNwWzBdLnR2YWw7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDEyNzoKLSNsaW5lIDg4OCAiYy1leHAueSIKLXsgaW50IGxlbiA9IHNpemVvZiAoc3RydWN0IHR5cGUgKikgKiAoKysoeXl2c3BbLTJdLml2ZWNbMF0pICsgMSk7Ci0JCSAgeXl2YWwudHZlYyA9IChzdHJ1Y3QgdHlwZSAqKikgeHJlYWxsb2MgKChjaGFyICopIHl5dnNwWy0yXS50dmVjLCBsZW4pOwotCQkgIHl5dmFsLnR2ZWNbeXl2YWwuaXZlY1swXV0gPSB5eXZzcFswXS50dmFsOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjg6Ci0jbGluZSA4OTQgImMtZXhwLnkiCi17IHl5dmFsLnN2YWwgPSB5eXZzcFswXS5zc3ltLnN0b2tlbjsgOwotICAgIGJyZWFrO30KLWNhc2UgMTI5OgotI2xpbmUgODk1ICJjLWV4cC55IgoteyB5eXZhbC5zdmFsID0geXl2c3BbMF0uc3N5bS5zdG9rZW47IDsKLSAgICBicmVhazt9Ci1jYXNlIDEzMDoKLSNsaW5lIDg5NiAiYy1leHAueSIKLXsgeXl2YWwuc3ZhbCA9IHl5dnNwWzBdLnRzeW0uc3Rva2VuOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMzE6Ci0jbGluZSA4OTcgImMtZXhwLnkiCi17IHl5dmFsLnN2YWwgPSB5eXZzcFswXS5zc3ltLnN0b2tlbjsgOwotICAgIGJyZWFrO30KLX0KLSAgIC8qIHRoZSBhY3Rpb24gZmlsZSBnZXRzIGNvcGllZCBpbiBpbiBwbGFjZSBvZiB0aGlzIGRvbGxhcnNpZ24gKi8KLSNsaW5lIDQ5OCAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQwKLSAgeXl2c3AgLT0geXlsZW47Ci0gIHl5c3NwIC09IHl5bGVuOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCAtPSB5eWxlbjsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQotCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAqKyt5eXZzcCA9IHl5dmFsOwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwKys7Ci0gIGlmICh5eWxlbiA9PSAwKQotICAgIHsKLSAgICAgIHl5bHNwLT5maXJzdF9saW5lID0geXlsbG9jLmZpcnN0X2xpbmU7Ci0gICAgICB5eWxzcC0+Zmlyc3RfY29sdW1uID0geXlsbG9jLmZpcnN0X2NvbHVtbjsKLSAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AtMSktPmxhc3RfbGluZTsKLSAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcC0xKS0+bGFzdF9jb2x1bW47Ci0gICAgICB5eWxzcC0+dGV4dCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9saW5lOwotICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2NvbHVtbjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBOb3cgInNoaWZ0IiB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uCi0gICAgIERldGVybWluZSB3aGF0IHN0YXRlIHRoYXQgZ29lcyB0bywKLSAgICAgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvCi0gICAgIGFuZCB0aGUgcnVsZSBudW1iZXIgcmVkdWNlZCBieS4gICovCi0KLSAgeXluID0geXlyMVt5eW5dOwotCi0gIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKLSAgaWYgKHl5c3RhdGUgPj0gMCAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKLSAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKLSAgZWxzZQotICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVEJBU0VdOwotCi0gIGdvdG8geXluZXdzdGF0ZTsKLQoteXllcnJsYWI6ICAgLyogaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgKi8KLQotICBpZiAoISB5eWVycnN0YXR1cykKLSAgICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KLSAgICB7Ci0gICAgICArK3l5bmVycnM7Ci0KLSNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKLSAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLQotICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCi0JewotCSAgaW50IHNpemUgPSAwOwotCSAgY2hhciAqbXNnOwotCSAgaW50IHgsIGNvdW50OwotCi0JICBjb3VudCA9IDA7Ci0JICAvKiBTdGFydCBYIGF0IC15eW4gaWYgbmVjIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4geXljaGVjay4gICovCi0JICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKLQkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKLQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKLQkgICAgICBzaXplICs9IHN0cmxlbih5eXRuYW1lW3hdKSArIDE1LCBjb3VudCsrOwotCSAgbXNnID0gKGNoYXIgKikgeG1hbGxvYyhzaXplICsgMTUpOwotCSAgaWYgKG1zZyAhPSAwKQotCSAgICB7Ci0JICAgICAgc3RyY3B5KG1zZywgInBhcnNlIGVycm9yIik7Ci0KLQkgICAgICBpZiAoY291bnQgPCA1KQotCQl7Ci0JCSAgY291bnQgPSAwOwotCQkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOwotCQkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKLQkJICAgIGlmICh5eWNoZWNrW3ggKyB5eW5dID09IHgpCi0JCSAgICAgIHsKLQkJCXN0cmNhdChtc2csIGNvdW50ID09IDAgPyAiLCBleHBlY3RpbmcgYCIgOiAiIG9yIGAiKTsKLQkJCXN0cmNhdChtc2csIHl5dG5hbWVbeF0pOwotCQkJc3RyY2F0KG1zZywgIiciKTsKLQkJCWNvdW50Kys7Ci0JCSAgICAgIH0KLQkJfQotCSAgICAgIHl5ZXJyb3IobXNnKTsKLQkgICAgICBmcmVlKG1zZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgeXllcnJvciAoInBhcnNlIGVycm9yOyBhbHNvIHZpcnR1YWwgbWVtb3J5IGV4Y2VlZGVkIik7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLwotCXl5ZXJyb3IoInBhcnNlIGVycm9yIik7Ci0gICAgfQotCi0gIGdvdG8geXllcnJsYWIxOwoteXllcnJsYWIxOiAgIC8qIGhlcmUgb24gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgYW4gYWN0aW9uICovCi0KLSAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCi0gICAgewotICAgICAgLyogaWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbiBlcnJvciwgZGlzY2FyZCBpdC4gICovCi0KLSAgICAgIC8qIHJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dCAqLwotICAgICAgaWYgKHl5Y2hhciA9PSBZWUVPRikKLQlZWUFCT1JUOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIkRpc2NhcmRpbmcgdG9rZW4gJWQgKCVzKS5cbiIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0jZW5kaWYKLQotICAgICAgeXljaGFyID0gWVlFTVBUWTsKLSAgICB9Ci0KLSAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4KLSAgICAgYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yIHRva2VuLiAgKi8KLQotICB5eWVycnN0YXR1cyA9IDM7CQkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMgKi8KLQotICBnb3RvIHl5ZXJyaGFuZGxlOwotCi15eWVycmRlZmF1bHQ6ICAvKiBjdXJyZW50IHN0YXRlIGRvZXMgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoZSBlcnJvciB0b2tlbi4gKi8KLQotI2lmIDAKLSAgLyogVGhpcyBpcyB3cm9uZzsgb25seSBzdGF0ZXMgdGhhdCBleHBsaWNpdGx5IHdhbnQgZXJyb3IgdG9rZW5zCi0gICAgIHNob3VsZCBzaGlmdCB0aGVtLiAgKi8KLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07ICAvKiBJZiBpdHMgZGVmYXVsdCBpcyB0byBhY2NlcHQgYW55IHRva2VuLCBvay4gIE90aGVyd2lzZSBwb3AgaXQuKi8KLSAgaWYgKHl5bikgZ290byB5eWRlZmF1bHQ7Ci0jZW5kaWYKLQoteXllcnJwb3A6ICAgLyogcG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4gKi8KLQotICBpZiAoeXlzc3AgPT0geXlzcykgWVlBQk9SVDsKLSAgeXl2c3AtLTsKLSAgeXlzdGF0ZSA9ICotLXl5c3NwOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcC0tOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnNzcDEgPSB5eXNzIC0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiBzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQotCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQoteXllcnJoYW5kbGU6Ci0KLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gKz0gWVlURVJST1I7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0gWVlURVJST1IpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJycG9wOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJycG9wOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNoaWZ0aW5nIGVycm9yIHRva2VuLCAiKTsKLSNlbmRpZgotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLX0KLSNsaW5lIDkxMSAiYy1leHAueSIKLQotCi0vKiBUYWtlIGNhcmUgb2YgcGFyc2luZyBhIG51bWJlciAoYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0KS4KLSAgIFNldCB5eWx2YWwgYW5kIHJldHVybiB0aGUgdG9rZW4gdHlwZTsgdXBkYXRlIGxleHB0ci4KLSAgIExFTiBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaXQuICAqLwotCi0vKioqIE5lZWRzIHNvbWUgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSBmbG9hdCBjYXNlICoqKi8KLQotc3RhdGljIGludAotcGFyc2VfbnVtYmVyIChwLCBsZW4sIHBhcnNlZF9mbG9hdCwgcHV0aXRoZXJlKQotICAgICByZWdpc3RlciBjaGFyICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotICAgICBpbnQgcGFyc2VkX2Zsb2F0OwotICAgICBZWVNUWVBFICpwdXRpdGhlcmU7Ci17Ci0gIC8qIEZJWE1FOiBTaG91bGRuJ3QgdGhlc2UgYmUgdW5zaWduZWQ/ICBXZSBkb24ndCBkZWFsIHdpdGggbmVnYXRpdmUgdmFsdWVzCi0gICAgIGhlcmUsIGFuZCB3ZSBkbyBraW5kIG9mIHNpbGx5IHRoaW5ncyBsaWtlIGNhc3QgdG8gdW5zaWduZWQuICAqLwotICByZWdpc3RlciBMT05HRVNUIG4gPSAwOwotICByZWdpc3RlciBMT05HRVNUIHByZXZuID0gMDsKLSAgVUxPTkdFU1QgdW47Ci0KLSAgcmVnaXN0ZXIgaW50IGkgPSAwOwotICByZWdpc3RlciBpbnQgYzsKLSAgcmVnaXN0ZXIgaW50IGJhc2UgPSBpbnB1dF9yYWRpeDsKLSAgaW50IHVuc2lnbmVkX3AgPSAwOwotCi0gIC8qIE51bWJlciBvZiAiTCIgc3VmZml4ZXMgZW5jb3VudGVyZWQuICAqLwotICBpbnQgbG9uZ19wID0gMDsKLQotICAvKiBXZSBoYXZlIGZvdW5kIGEgIkwiIG9yICJVIiBzdWZmaXguICAqLwotICBpbnQgZm91bmRfc3VmZml4ID0gMDsKLQotICBVTE9OR0VTVCBoaWdoX2JpdDsKLSAgc3RydWN0IHR5cGUgKnNpZ25lZF90eXBlOwotICBzdHJ1Y3QgdHlwZSAqdW5zaWduZWRfdHlwZTsKLQotICBpZiAocGFyc2VkX2Zsb2F0KQotICAgIHsKLSAgICAgIC8qIEl0J3MgYSBmbG9hdCBzaW5jZSBpdCBjb250YWlucyBhIHBvaW50IG9yIGFuIGV4cG9uZW50LiAgKi8KLSAgICAgIGNoYXIgYzsKLSAgICAgIGludCBudW0gPSAwOwkvKiBudW1iZXIgb2YgdG9rZW5zIHNjYW5uZWQgYnkgc2NhbmYgKi8KLSAgICAgIGNoYXIgc2F2ZWRfY2hhciA9IHBbbGVuXTsKLQotICAgICAgcFtsZW5dID0gMDsJLyogbnVsbC10ZXJtaW5hdGUgdGhlIHRva2VuICovCi0gICAgICBpZiAoc2l6ZW9mIChwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsKSA8PSBzaXplb2YgKGZsb2F0KSkKLQludW0gPSBzc2NhbmYgKHAsICIlZyVjIiwgKGZsb2F0ICopICZwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsLCZjKTsKLSAgICAgIGVsc2UgaWYgKHNpemVvZiAocHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCkgPD0gc2l6ZW9mIChkb3VibGUpKQotCW51bSA9IHNzY2FuZiAocCwgIiVsZyVjIiwgKGRvdWJsZSAqKSAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwmYyk7Ci0gICAgICBlbHNlCi0JewotI2lmZGVmIFNDQU5GX0hBU19MT05HX0RPVUJMRQotCSAgbnVtID0gc3NjYW5mIChwLCAiJUxnJWMiLCAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwmYyk7Ci0jZWxzZQotCSAgLyogU2NhbiBpdCBpbnRvIGEgZG91YmxlLCB0aGVuIGFzc2lnbiBpdCB0byB0aGUgbG9uZyBkb3VibGUuCi0JICAgICBUaGlzIGF0IGxlYXN0IHdpbnMgd2l0aCB2YWx1ZXMgcmVwcmVzZW50YWJsZSBpbiB0aGUgcmFuZ2UKLQkgICAgIG9mIGRvdWJsZXMuICovCi0JICBkb3VibGUgdGVtcDsKLQkgIG51bSA9IHNzY2FuZiAocCwgIiVsZyVjIiwgJnRlbXAsJmMpOwotCSAgcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCA9IHRlbXA7Ci0jZW5kaWYKLQl9Ci0gICAgICBwW2xlbl0gPSBzYXZlZF9jaGFyOwkvKiByZXN0b3JlIHRoZSBpbnB1dCBzdHJlYW0gKi8KLSAgICAgIGlmIChudW0gIT0gMSkgCQkvKiBjaGVjayBzY2FuZiBmb3VuZCBPTkxZIGEgZmxvYXQgLi4uICovCi0JcmV0dXJuIEVSUk9SOwotICAgICAgLyogU2VlIGlmIGl0IGhhcyBgZicgb3IgYGwnIHN1ZmZpeCAoZmxvYXQgb3IgbG9uZyBkb3VibGUpLiAgKi8KLQotICAgICAgYyA9IHRvbG93ZXIgKHBbbGVuIC0gMV0pOwotCi0gICAgICBpZiAoYyA9PSAnZicpCi0JcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQudHlwZSA9IGJ1aWx0aW5fdHlwZV9mbG9hdDsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJ2wnKQotCXB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LnR5cGUgPSBidWlsdGluX3R5cGVfbG9uZ19kb3VibGU7Ci0gICAgICBlbHNlIGlmIChpc2RpZ2l0IChjKSB8fCBjID09ICcuJykKLQlwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC50eXBlID0gYnVpbHRpbl90eXBlX2RvdWJsZTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gRVJST1I7Ci0KLSAgICAgIHJldHVybiBGTE9BVDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIGJhc2Utc3dpdGNoaW5nIHByZWZpeGVzIDB4LCAwdCwgMGQsIDAgKi8KLSAgaWYgKHBbMF0gPT0gJzAnKQotICAgIHN3aXRjaCAocFsxXSkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ3gnOgotICAgICAgY2FzZSAnWCc6Ci0JaWYgKGxlbiA+PSAzKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGJhc2UgPSAxNjsKLQkgICAgbGVuIC09IDI7Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgJ3QnOgotICAgICAgY2FzZSAnVCc6Ci0gICAgICBjYXNlICdkJzoKLSAgICAgIGNhc2UgJ0QnOgotCWlmIChsZW4gPj0gMykKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBiYXNlID0gMTA7Ci0JICAgIGxlbiAtPSAyOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJhc2UgPSA4OwotCWJyZWFrOwotICAgICAgfQotCi0gIHdoaWxlIChsZW4tLSA+IDApCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpCi0JYyArPSAnYScgLSAnQSc7Ci0gICAgICBpZiAoYyAhPSAnbCcgJiYgYyAhPSAndScpCi0JbiAqPSBiYXNlOwotICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCXsKLQkgIGlmIChmb3VuZF9zdWZmaXgpCi0JICAgIHJldHVybiBFUlJPUjsKLQkgIG4gKz0gaSA9IGMgLSAnMCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChiYXNlID4gMTAgJiYgYyA+PSAnYScgJiYgYyA8PSAnZicpCi0JICAgIHsKLQkgICAgICBpZiAoZm91bmRfc3VmZml4KQotCQlyZXR1cm4gRVJST1I7Ci0JICAgICAgbiArPSBpID0gYyAtICdhJyArIDEwOwotCSAgICB9Ci0JICBlbHNlIGlmIChjID09ICdsJykKLQkgICAgewotCSAgICAgICsrbG9uZ19wOwotCSAgICAgIGZvdW5kX3N1ZmZpeCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgPT0gJ3UnKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWRfcCA9IDE7Ci0JICAgICAgZm91bmRfc3VmZml4ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICByZXR1cm4gRVJST1I7CS8qIENoYXIgbm90IGEgZGlnaXQgKi8KLQl9Ci0gICAgICBpZiAoaSA+PSBiYXNlKQotCXJldHVybiBFUlJPUjsJCS8qIEludmFsaWQgZGlnaXQgaW4gdGhpcyBiYXNlICovCi0KLSAgICAgIC8qIFBvcnRhYmx5IHRlc3QgZm9yIG92ZXJmbG93IChvbmx5IHdvcmtzIGZvciBub256ZXJvIHZhbHVlcywgc28gbWFrZQotCSBhIHNlY29uZCBjaGVjayBmb3IgemVybykuICBGSVhNRTogQ2FuJ3Qgd2UganVzdCBtYWtlIG4gYW5kIHByZXZuCi0JIHVuc2lnbmVkIGFuZCBhdm9pZCB0aGlzPyAgKi8KLSAgICAgIGlmIChjICE9ICdsJyAmJiBjICE9ICd1JyAmJiAocHJldm4gPj0gbikgJiYgbiAhPSAwKQotCXVuc2lnbmVkX3AgPSAxOwkJLyogVHJ5IHNvbWV0aGluZyB1bnNpZ25lZCAqLwotCi0gICAgICAvKiBQb3J0YWJseSB0ZXN0IGZvciB1bnNpZ25lZCBvdmVyZmxvdy4KLQkgRklYTUU6IFRoaXMgY2hlY2sgaXMgd3Jvbmc7IGZvciBleGFtcGxlIGl0IGRvZXNuJ3QgZmluZCBvdmVyZmxvdwotCSBvbiAweDEyMzQ1Njc4OSB3aGVuIExPTkdFU1QgaXMgMzIgYml0cy4gICovCi0gICAgICBpZiAoYyAhPSAnbCcgJiYgYyAhPSAndScgJiYgbiAhPSAwKQotCXsJCi0JICBpZiAoKHVuc2lnbmVkX3AgJiYgKFVMT05HRVNUKSBwcmV2biA+PSAoVUxPTkdFU1QpIG4pKQotCSAgICBlcnJvciAoIk51bWVyaWMgY29uc3RhbnQgdG9vIGxhcmdlLiIpOwotCX0KLSAgICAgIHByZXZuID0gbjsKLSAgICB9Ci0KLSAgLyogQW4gaW50ZWdlciBjb25zdGFudCBpcyBhbiBpbnQsIGEgbG9uZywgb3IgYSBsb25nIGxvbmcuICBBbiBMCi0gICAgIHN1ZmZpeCBmb3JjZXMgaXQgdG8gYmUgbG9uZzsgYW4gTEwgc3VmZml4IGZvcmNlcyBpdCB0byBiZSBsb25nCi0gICAgIGxvbmcuICBJZiBub3QgZm9yY2VkIHRvIGEgbGFyZ2VyIHNpemUsIGl0IGdldHMgdGhlIGZpcnN0IHR5cGUgb2YKLSAgICAgdGhlIGFib3ZlIHRoYXQgaXQgZml0cyBpbi4gIFRvIGZpZ3VyZSBvdXQgd2hldGhlciBpdCBmaXRzLCB3ZQotICAgICBzaGlmdCBpdCByaWdodCBhbmQgc2VlIHdoZXRoZXIgYW55dGhpbmcgcmVtYWlucy4gIE5vdGUgdGhhdCB3ZQotICAgICBjYW4ndCBzaGlmdCBzaXplb2YgKExPTkdFU1QpICogSE9TVF9DSEFSX0JJVCBiaXRzIG9yIG1vcmUgaW4gb25lCi0gICAgIG9wZXJhdGlvbiwgYmVjYXVzZSBtYW55IGNvbXBpbGVycyB3aWxsIHdhcm4gYWJvdXQgc3VjaCBhIHNoaWZ0Ci0gICAgICh3aGljaCBhbHdheXMgcHJvZHVjZXMgYSB6ZXJvIHJlc3VsdCkuICBTb21ldGltZXMgVEFSR0VUX0lOVF9CSVQKLSAgICAgb3IgVEFSR0VUX0xPTkdfQklUIHdpbGwgYmUgdGhhdCBiaWcsIHNvbWV0aW1lcyBub3QuICBUbyBkZWFsIHdpdGgKLSAgICAgdGhlIGNhc2Ugd2hlcmUgaXQgaXMgd2UganVzdCBhbHdheXMgc2hpZnQgdGhlIHZhbHVlIG1vcmUgdGhhbgotICAgICBvbmNlLCB3aXRoIGZld2VyIGJpdHMgZWFjaCB0aW1lLiAgKi8KLQotICB1biA9IChVTE9OR0VTVCluID4+IDI7Ci0gIGlmIChsb25nX3AgPT0gMAotICAgICAgJiYgKHVuID4+IChUQVJHRVRfSU5UX0JJVCAtIDIpKSA9PSAwKQotICAgIHsKLSAgICAgIGhpZ2hfYml0ID0gKChVTE9OR0VTVCkxKSA8PCAoVEFSR0VUX0lOVF9CSVQtMSk7Ci0KLSAgICAgIC8qIEEgbGFyZ2UgZGVjaW1hbCAobm90IGhleCBvciBvY3RhbCkgY29uc3RhbnQgKGJldHdlZW4gSU5UX01BWAotCSBhbmQgVUlOVF9NQVgpIGlzIGEgbG9uZyBvciB1bnNpZ25lZCBsb25nLCBhY2NvcmRpbmcgdG8gQU5TSSwKLQkgbmV2ZXIgYW4gdW5zaWduZWQgaW50LCBidXQgdGhpcyBjb2RlIHRyZWF0cyBpdCBhcyB1bnNpZ25lZAotCSBpbnQuICBUaGlzIHByb2JhYmx5IHNob3VsZCBiZSBmaXhlZC4gIEdDQyBnaXZlcyBhIHdhcm5pbmcgb24KLQkgc3VjaCBjb25zdGFudHMuICAqLwotCi0gICAgICB1bnNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2ludDsKLSAgICAgIHNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX2ludDsKLSAgICB9Ci0gIGVsc2UgaWYgKGxvbmdfcCA8PSAxCi0JICAgJiYgKHVuID4+IChUQVJHRVRfTE9OR19CSVQgLSAyKSkgPT0gMCkKLSAgICB7Ci0gICAgICBoaWdoX2JpdCA9ICgoVUxPTkdFU1QpMSkgPDwgKFRBUkdFVF9MT05HX0JJVC0xKTsKLSAgICAgIHVuc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZzsKLSAgICAgIHNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX2xvbmc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IHNoaWZ0OwotICAgICAgaWYgKHNpemVvZiAoVUxPTkdFU1QpICogSE9TVF9DSEFSX0JJVCA8IFRBUkdFVF9MT05HX0xPTkdfQklUKQotCS8qIEEgbG9uZyBsb25nIGRvZXMgbm90IGZpdCBpbiBhIExPTkdFU1QuICAqLwotCXNoaWZ0ID0gKHNpemVvZiAoVUxPTkdFU1QpICogSE9TVF9DSEFSX0JJVCAtIDEpOwotICAgICAgZWxzZQotCXNoaWZ0ID0gKFRBUkdFVF9MT05HX0xPTkdfQklUIC0gMSk7Ci0gICAgICBoaWdoX2JpdCA9IChVTE9OR0VTVCkgMSA8PCBzaGlmdDsKLSAgICAgIHVuc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZ19sb25nOwotICAgICAgc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfbG9uZ19sb25nOwotICAgIH0KLQotICAgcHV0aXRoZXJlLT50eXBlZF92YWxfaW50LnZhbCA9IG47Ci0KLSAgIC8qIElmIHRoZSBoaWdoIGJpdCBvZiB0aGUgd29ya2VkIG91dCB0eXBlIGlzIHNldCB0aGVuIHRoaXMgbnVtYmVyCi0gICAgICBoYXMgdG8gYmUgdW5zaWduZWQuICovCi0KLSAgIGlmICh1bnNpZ25lZF9wIHx8IChuICYgaGlnaF9iaXQpKSAKLSAgICAgewotICAgICAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2ludC50eXBlID0gdW5zaWduZWRfdHlwZTsKLSAgICAgfQotICAgZWxzZSAKLSAgICAgewotICAgICAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2ludC50eXBlID0gc2lnbmVkX3R5cGU7Ci0gICAgIH0KLQotICAgcmV0dXJuIElOVDsKLX0KLQotc3RydWN0IHRva2VuCi17Ci0gIGNoYXIgKm9wZXJhdG9yOwotICBpbnQgdG9rZW47Ci0gIGVudW0gZXhwX29wY29kZSBvcGNvZGU7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRva2VuIHRva2VudGFiM1tdID0KLSAgewotICAgIHsiPj49IiwgQVNTSUdOX01PRElGWSwgQklOT1BfUlNIfSwKLSAgICB7Ijw8PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0xTSH0KLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiB0b2tlbnRhYjJbXSA9Ci0gIHsKLSAgICB7Iis9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQUREfSwKLSAgICB7Ii09IiwgQVNTSUdOX01PRElGWSwgQklOT1BfU1VCfSwKLSAgICB7Iio9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfTVVMfSwKLSAgICB7Ii89IiwgQVNTSUdOX01PRElGWSwgQklOT1BfRElWfSwKLSAgICB7IiU9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfUkVNfSwKLSAgICB7Inw9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQklUV0lTRV9JT1J9LAotICAgIHsiJj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9CSVRXSVNFX0FORH0sCi0gICAgeyJePSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0JJVFdJU0VfWE9SfSwKLSAgICB7IisrIiwgSU5DUkVNRU5ULCBCSU5PUF9FTkR9LAotICAgIHsiLS0iLCBERUNSRU1FTlQsIEJJTk9QX0VORH0sCi0gICAgeyItPiIsIEFSUk9XLCBCSU5PUF9FTkR9LAotICAgIHsiJiYiLCBBTkRBTkQsIEJJTk9QX0VORH0sCi0gICAgeyJ8fCIsIE9ST1IsIEJJTk9QX0VORH0sCi0gICAgeyI6OiIsIENPTE9OQ09MT04sIEJJTk9QX0VORH0sCi0gICAgeyI8PCIsIExTSCwgQklOT1BfRU5EfSwKLSAgICB7Ij4+IiwgUlNILCBCSU5PUF9FTkR9LAotICAgIHsiPT0iLCBFUVVBTCwgQklOT1BfRU5EfSwKLSAgICB7IiE9IiwgTk9URVFVQUwsIEJJTk9QX0VORH0sCi0gICAgeyI8PSIsIExFUSwgQklOT1BfRU5EfSwKLSAgICB7Ij49IiwgR0VRLCBCSU5PUF9FTkR9Ci0gIH07Ci0KLS8qIFJlYWQgb25lIHRva2VuLCBnZXR0aW5nIGNoYXJhY3RlcnMgdGhyb3VnaCBsZXhwdHIuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBpbnQgYzsKLSAgaW50IG5hbWVsZW47Ci0gIHVuc2lnbmVkIGludCBpOwotICBjaGFyICp0b2tzdGFydDsKLSAgY2hhciAqdG9rcHRyOwotICBpbnQgdGVtcGJ1ZmluZGV4OwotICBzdGF0aWMgY2hhciAqdGVtcGJ1ZjsKLSAgc3RhdGljIGludCB0ZW1wYnVmc2l6ZTsKLSAgc3RydWN0IHN5bWJvbCAqIHN5bV9jbGFzcyA9IE5VTEw7Ci0gIGNoYXIgKiB0b2tlbl9zdHJpbmcgPSBOVUxMOwotICBpbnQgY2xhc3NfcHJlZml4ID0gMDsKLSAgaW50IHVucXVvdGVkX2V4cHI7Ci0gICAKLSByZXRyeToKLQotICB1bnF1b3RlZF9leHByID0gMTsKLQotICB0b2tzdGFydCA9IGxleHB0cjsKLSAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCB0b2tlbiBvZiBsZW5ndGggMy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdG9rZW50YWIzIC8gc2l6ZW9mIHRva2VudGFiM1swXTsgaSsrKQotICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCB0b2tlbnRhYjNbaV0ub3BlcmF0b3IsIDMpKQotICAgICAgewotCWxleHB0ciArPSAzOwotCXl5bHZhbC5vcGNvZGUgPSB0b2tlbnRhYjNbaV0ub3Bjb2RlOwotCXJldHVybiB0b2tlbnRhYjNbaV0udG9rZW47Ci0gICAgICB9Ci0KLSAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCB0b2tlbiBvZiBsZW5ndGggMi4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdG9rZW50YWIyIC8gc2l6ZW9mIHRva2VudGFiMlswXTsgaSsrKQotICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCB0b2tlbnRhYjJbaV0ub3BlcmF0b3IsIDIpKQotICAgICAgewotCWxleHB0ciArPSAyOwotCXl5bHZhbC5vcGNvZGUgPSB0b2tlbnRhYjJbaV0ub3Bjb2RlOwotCXJldHVybiB0b2tlbnRhYjJbaV0udG9rZW47Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjID0gKnRva3N0YXJ0KQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgJyAnOgotICAgIGNhc2UgJ1x0JzoKLSAgICBjYXNlICdcbic6Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIGdvdG8gcmV0cnk7Ci0KLSAgICBjYXNlICdcJyc6Ci0gICAgICAvKiBXZSBlaXRoZXIgaGF2ZSBhIGNoYXJhY3RlciBjb25zdGFudCAoJzAnIG9yICdcMTc3JyBmb3IgZXhhbXBsZSkKLQkgb3Igd2UgaGF2ZSBhIHF1b3RlZCBzeW1ib2wgcmVmZXJlbmNlICgnZm9vKGludCxpbnQpJyBpbiBDKysKLQkgZm9yIGV4YW1wbGUpLiAqLwotICAgICAgbGV4cHRyKys7Ci0gICAgICBjID0gKmxleHB0cisrOwotICAgICAgaWYgKGMgPT0gJ1xcJykKLQljID0gcGFyc2VfZXNjYXBlICgmbGV4cHRyKTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJ1wnJykKLQllcnJvciAoIkVtcHR5IGNoYXJhY3RlciBjb25zdGFudC4iKTsKLQotICAgICAgeXlsdmFsLnR5cGVkX3ZhbF9pbnQudmFsID0gYzsKLSAgICAgIHl5bHZhbC50eXBlZF92YWxfaW50LnR5cGUgPSBidWlsdGluX3R5cGVfY2hhcjsKLQotICAgICAgYyA9ICpsZXhwdHIrKzsKLSAgICAgIGlmIChjICE9ICdcJycpCi0JewotCSAgbmFtZWxlbiA9IHNraXBfcXVvdGVkICh0b2tzdGFydCkgLSB0b2tzdGFydDsKLQkgIGlmIChuYW1lbGVuID4gMikKLQkgICAgewotCSAgICAgIGxleHB0ciA9IHRva3N0YXJ0ICsgbmFtZWxlbjsKLSAgICAgICAgICAgICAgdW5xdW90ZWRfZXhwciA9IDA7Ci0JICAgICAgaWYgKGxleHB0clstMV0gIT0gJ1wnJykKLQkJZXJyb3IgKCJVbm1hdGNoZWQgc2luZ2xlIHF1b3RlLiIpOwotCSAgICAgIG5hbWVsZW4gLT0gMjsKLQkgICAgICB0b2tzdGFydCsrOwotCSAgICAgIGdvdG8gdHJ5bmFtZTsKLQkgICAgfQotCSAgZXJyb3IgKCJJbnZhbGlkIGNoYXJhY3RlciBjb25zdGFudC4iKTsKLQl9Ci0gICAgICByZXR1cm4gSU5UOwotCi0gICAgY2FzZSAnKCc6Ci0gICAgICBwYXJlbl9kZXB0aCsrOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJyknOgotICAgICAgaWYgKHBhcmVuX2RlcHRoID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBwYXJlbl9kZXB0aC0tOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJywnOgotICAgICAgaWYgKGNvbW1hX3Rlcm1pbmF0ZXMgJiYgcGFyZW5fZGVwdGggPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIC8qIE1pZ2h0IGJlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChsZXhwdHJbMV0gPCAnMCcgfHwgbGV4cHRyWzFdID4gJzknKQotCWdvdG8gc3ltYm9sOwkJLyogTm9wZSwgbXVzdCBiZSBhIHN5bWJvbC4gKi8KLSAgICAgIC8qIEZBTEwgVEhSVSBpbnRvIG51bWJlciBjYXNlLiAgKi8KLQotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgewotCS8qIEl0J3MgYSBudW1iZXIuICAqLwotCWludCBnb3RfZG90ID0gMCwgZ290X2UgPSAwLCB0b2t0eXBlOwotCXJlZ2lzdGVyIGNoYXIgKnAgPSB0b2tzdGFydDsKLQlpbnQgaGV4ID0gaW5wdXRfcmFkaXggPiAxMDsKLQotCWlmIChjID09ICcwJyAmJiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGhleCA9IDE7Ci0JICB9Ci0JZWxzZSBpZiAoYyA9PSAnMCcgJiYgKHBbMV09PSd0JyB8fCBwWzFdPT0nVCcgfHwgcFsxXT09J2QnIHx8IHBbMV09PSdEJykpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgaGV4ID0gMDsKLQkgIH0KLQotCWZvciAoOzsgKytwKQotCSAgewotCSAgICAvKiBUaGlzIHRlc3QgaW5jbHVkZXMgIWhleCBiZWNhdXNlICdlJyBpcyBhIHZhbGlkIGhleCBkaWdpdAotCSAgICAgICBhbmQgdGh1cyBkb2VzIG5vdCBpbmRpY2F0ZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aGVuCi0JICAgICAgIHRoZSByYWRpeCBpcyBoZXguICAqLwotCSAgICBpZiAoIWhleCAmJiAhZ290X2UgJiYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpKQotCSAgICAgIGdvdF9kb3QgPSBnb3RfZSA9IDE7Ci0JICAgIC8qIFRoaXMgdGVzdCBkb2VzIG5vdCBpbmNsdWRlICFoZXgsIGJlY2F1c2UgYSAnLicgYWx3YXlzIGluZGljYXRlcwotCSAgICAgICBhIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlZ2FyZGxlc3Mgb2YgdGhlIHJhZGl4LiAgKi8KLQkgICAgZWxzZSBpZiAoIWdvdF9kb3QgJiYgKnAgPT0gJy4nKQotCSAgICAgIGdvdF9kb3QgPSAxOwotCSAgICBlbHNlIGlmIChnb3RfZSAmJiAocFstMV0gPT0gJ2UnIHx8IHBbLTFdID09ICdFJykKLQkJICAgICAmJiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykpCi0JICAgICAgLyogVGhpcyBpcyB0aGUgc2lnbiBvZiB0aGUgZXhwb25lbnQsIG5vdCB0aGUgZW5kIG9mIHRoZQotCQkgbnVtYmVyLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgLyogV2Ugd2lsbCB0YWtlIGFueSBsZXR0ZXJzIG9yIGRpZ2l0cy4gIHBhcnNlX251bWJlciB3aWxsCi0JICAgICAgIGNvbXBsYWluIGlmIHBhc3QgdGhlIHJhZGl4LCBvciBpZiBMIG9yIFUgYXJlIG5vdCBmaW5hbC4gICovCi0JICAgIGVsc2UgaWYgKCgqcCA8ICcwJyB8fCAqcCA+ICc5JykKLQkJICAgICAmJiAoKCpwIDwgJ2EnIHx8ICpwID4gJ3onKQotCQkJCSAgJiYgKCpwIDwgJ0EnIHx8ICpwID4gJ1onKSkpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JdG9rdHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIHAgLSB0b2tzdGFydCwgZ290X2RvdHxnb3RfZSwgJnl5bHZhbCk7Ci0gICAgICAgIGlmICh0b2t0eXBlID09IEVSUk9SKQotCSAgewotCSAgICBjaGFyICplcnJfY29weSA9IChjaGFyICopIGFsbG9jYSAocCAtIHRva3N0YXJ0ICsgMSk7Ci0KLQkgICAgbWVtY3B5IChlcnJfY29weSwgdG9rc3RhcnQsIHAgLSB0b2tzdGFydCk7Ci0JICAgIGVycl9jb3B5W3AgLSB0b2tzdGFydF0gPSAwOwotCSAgICBlcnJvciAoIkludmFsaWQgbnVtYmVyIFwiJXNcIi4iLCBlcnJfY29weSk7Ci0JICB9Ci0JbGV4cHRyID0gcDsKLQlyZXR1cm4gdG9rdHlwZTsKLSAgICAgIH0KLQotICAgIGNhc2UgJysnOgotICAgIGNhc2UgJy0nOgotICAgIGNhc2UgJyonOgotICAgIGNhc2UgJy8nOgotICAgIGNhc2UgJyUnOgotICAgIGNhc2UgJ3wnOgotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ14nOgotICAgIGNhc2UgJ34nOgotICAgIGNhc2UgJyEnOgotICAgIGNhc2UgJ0AnOgotICAgIGNhc2UgJzwnOgotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJ1snOgotICAgIGNhc2UgJ10nOgotICAgIGNhc2UgJz8nOgotICAgIGNhc2UgJzonOgotICAgIGNhc2UgJz0nOgotICAgIGNhc2UgJ3snOgotICAgIGNhc2UgJ30nOgotICAgIHN5bWJvbDoKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICciJzoKLQotICAgICAgLyogQnVpbGQgdGhlIGdkYiBpbnRlcm5hbCBmb3JtIG9mIHRoZSBpbnB1dCBzdHJpbmcgaW4gdGVtcGJ1ZiwKLQkgdHJhbnNsYXRpbmcgYW55IHN0YW5kYXJkIEMgZXNjYXBlIGZvcm1zIHNlZW4uICBOb3RlIHRoYXQgdGhlCi0JIGJ1ZmZlciBpcyBudWxsIGJ5dGUgdGVybWluYXRlZCAqb25seSogZm9yIHRoZSBjb252ZW5pZW5jZSBvZgotCSBkZWJ1Z2dpbmcgZ2RiIGl0c2VsZiBhbmQgcHJpbnRpbmcgdGhlIGJ1ZmZlciBjb250ZW50cyB3aGVuCi0JIHRoZSBidWZmZXIgY29udGFpbnMgbm8gZW1iZWRkZWQgbnVsbHMuICBHZGIgZG9lcyBub3QgZGVwZW5kCi0JIHVwb24gdGhlIGJ1ZmZlciBiZWluZyBudWxsIGJ5dGUgdGVybWluYXRlZCwgaXQgdXNlcyB0aGUgbGVuZ3RoCi0JIHN0cmluZyBpbnN0ZWFkLiAgVGhpcyBhbGxvd3MgZ2RiIHRvIGhhbmRsZSBDIHN0cmluZ3MgKGFzIHdlbGwKLQkgYXMgc3RyaW5ncyBpbiBvdGhlciBsYW5ndWFnZXMpIHdpdGggZW1iZWRkZWQgbnVsbCBieXRlcyAqLwotCi0gICAgICB0b2twdHIgPSArK3Rva3N0YXJ0OwotICAgICAgdGVtcGJ1ZmluZGV4ID0gMDsKLQotICAgICAgZG8gewotCS8qIEdyb3cgdGhlIHN0YXRpYyB0ZW1wIGJ1ZmZlciBpZiBuZWNlc3NhcnksIGluY2x1ZGluZyBhbGxvY2F0aW5nCi0JICAgdGhlIGZpcnN0IG9uZSBvbiBkZW1hbmQuICovCi0JaWYgKHRlbXBidWZpbmRleCArIDEgPj0gdGVtcGJ1ZnNpemUpCi0JICB7Ci0JICAgIHRlbXBidWYgPSAoY2hhciAqKSB4cmVhbGxvYyAodGVtcGJ1ZiwgdGVtcGJ1ZnNpemUgKz0gNjQpOwotCSAgfQotCXN3aXRjaCAoKnRva3B0cikKLQkgIHsKLQkgIGNhc2UgJ1wwJzoKLQkgIGNhc2UgJyInOgotCSAgICAvKiBEbyBub3RoaW5nLCBsb29wIHdpbGwgdGVybWluYXRlLiAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1xcJzoKLQkgICAgdG9rcHRyKys7Ci0JICAgIGMgPSBwYXJzZV9lc2NhcGUgKCZ0b2twdHIpOwotCSAgICBpZiAoYyA9PSAtMSkKLQkgICAgICB7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXgrK10gPSBjOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gKnRva3B0cisrOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0gd2hpbGUgKCgqdG9rcHRyICE9ICciJykgJiYgKCp0b2twdHIgIT0gJ1wwJykpOwotICAgICAgaWYgKCp0b2twdHIrKyAhPSAnIicpCi0JewotCSAgZXJyb3IgKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGluIGV4cHJlc3Npb24uIik7Ci0JfQotICAgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXhdID0gJ1wwJzsJLyogU2VlIG5vdGUgYWJvdmUgKi8KLSAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRlbXBidWY7Ci0gICAgICB5eWx2YWwuc3ZhbC5sZW5ndGggPSB0ZW1wYnVmaW5kZXg7Ci0gICAgICBsZXhwdHIgPSB0b2twdHI7Ci0gICAgICByZXR1cm4gKFNUUklORyk7Ci0gICAgfQotCi0gIGlmICghKGMgPT0gJ18nIHx8IGMgPT0gJyQnCi0JfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSkKLSAgICAvKiBXZSBtdXN0IGhhdmUgY29tZSBhY3Jvc3MgYSBiYWQgY2hhcmFjdGVyIChlLmcuICc7JykuICAqLwotICAgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBleHByZXNzaW9uLiIsIGMpOwotCi0gIC8qIEl0J3MgYSBuYW1lLiAgU2VlIGhvdyBsb25nIGl0IGlzLiAgKi8KLSAgbmFtZWxlbiA9IDA7Ci0gIGZvciAoYyA9IHRva3N0YXJ0W25hbWVsZW5dOwotICAgICAgIChjID09ICdfJyB8fCBjID09ICckJyB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8IGMgPT0gJzwnKTspCi0gICAgewotICAgICAgLyogVGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzIGFyZSBwYXJ0IG9mIHRoZSBuYW1lLgotCSBGSVhNRTogVGhpcyBtaXNoYW5kbGVzIGBwcmludCAkYTw0JiYkYT4zJy4gICovCi0KLSAgICAgIGlmIChjID09ICc8JykKLQl7IAotICAgICAgICAgICBpZiAoaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBTY2FuIGFoZWFkIHRvIGdldCByZXN0IG9mIHRoZSB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uLiAgTm90ZQotICAgICAgICAgICAgICAgICAgdGhhdCB3ZSBsb29rIGFoZWFkIG9ubHkgd2hlbiB0aGUgJzwnIGFkam9pbnMgbm9uLXdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnM7IGZvciBjb21wYXJpc29uIGV4cHJlc3Npb25zLCBlLmcuICJhIDwgYiA+IGMiLAotICAgICAgICAgICAgICAgICAgdGhlcmUgbXVzdCBiZSBzcGFjZXMgYmVmb3JlIHRoZSAnPCcsIGV0Yy4gKi8KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgY2hhciAqIHAgPSBmaW5kX3RlbXBsYXRlX25hbWVfZW5kICh0b2tzdGFydCArIG5hbWVsZW4pOwotICAgICAgICAgICAgICAgaWYgKHApCi0gICAgICAgICAgICAgICAgIG5hbWVsZW4gPSBwIC0gdG9rc3RhcnQ7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICB7IAotCSAgICAgICBpbnQgaSA9IG5hbWVsZW47Ci0JICAgICAgIGludCBuZXN0aW5nX2xldmVsID0gMTsKLQkgICAgICAgd2hpbGUgKHRva3N0YXJ0WysraV0pCi0JCSB7Ci0JCSAgIGlmICh0b2tzdGFydFtpXSA9PSAnPCcpCi0JCSAgICAgbmVzdGluZ19sZXZlbCsrOwotCQkgICBlbHNlIGlmICh0b2tzdGFydFtpXSA9PSAnPicpCi0JCSAgICAgewotCQkgICAgICAgaWYgKC0tbmVzdGluZ19sZXZlbCA9PSAwKQotCQkJIGJyZWFrOwotCQkgICAgIH0KLQkJIH0KLQkgICAgICAgaWYgKHRva3N0YXJ0W2ldID09ICc+JykKLQkJIG5hbWVsZW4gPSBpOwotCSAgICAgICBlbHNlCi0JCSBicmVhazsKLQkgICAgIH0KLQl9Ci0gICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKLSAgICB9Ci0KLSAgLyogVGhlIHRva2VuICJpZiIgdGVybWluYXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaXMgTk9UIAotICAgICByZW1vdmVkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gICovCi0gIGlmIChuYW1lbGVuID09IDIgJiYgdG9rc3RhcnRbMF0gPT0gJ2knICYmIHRva3N0YXJ0WzFdID09ICdmJykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbGV4cHRyICs9IG5hbWVsZW47Ci0KLSAgdHJ5bmFtZToKLQotICAvKiBDYXRjaCBzcGVjaWZpYyBrZXl3b3Jkcy4gIFNob3VsZCBiZSBkb25lIHdpdGggYSBkYXRhIHN0cnVjdHVyZS4gICovCi0gIHN3aXRjaCAobmFtZWxlbikKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ1bnNpZ25lZCIsIDgpKQotCXJldHVybiBVTlNJR05FRDsKLSAgICAgIGlmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cwotCSAgJiYgU1RSRVFOICh0b2tzdGFydCwgInRlbXBsYXRlIiwgOCkpCi0JcmV0dXJuIFRFTVBMQVRFOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ2b2xhdGlsZSIsIDgpKQotCXJldHVybiBWT0xBVElMRV9LRVlXT1JEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzdHJ1Y3QiLCA2KSkKLQlyZXR1cm4gU1RSVUNUOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzaWduZWQiLCA2KSkKLQlyZXR1cm4gU0lHTkVEX0tFWVdPUkQ7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInNpemVvZiIsIDYpKSAgICAgIAotCXJldHVybiBTSVpFT0Y7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImRvdWJsZSIsIDYpKSAgICAgIAotCXJldHVybiBET1VCTEVfS0VZV09SRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgIGlmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cykKLSAgICAgICAgewotICAgICAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZmFsc2UiLCA1KSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRUtFWVdPUkQ7Ci0gICAgICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJjbGFzcyIsIDUpKQotICAgICAgICAgICAgcmV0dXJuIENMQVNTOwotICAgICAgICB9Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInVuaW9uIiwgNSkpCi0JcmV0dXJuIFVOSU9OOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzaG9ydCIsIDUpKQotCXJldHVybiBTSE9SVDsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiY29uc3QiLCA1KSkKLQlyZXR1cm4gQ09OU1RfS0VZV09SRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZW51bSIsIDQpKQotCXJldHVybiBFTlVNOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJsb25nIiwgNCkpCi0JcmV0dXJuIExPTkc7Ci0gICAgICBpZiAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ0cnVlIiwgNCkpCi0gICAgICAgICAgICAgIHJldHVybiBUUlVFS0VZV09SRDsKLQotICAgICAgICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ0aGlzIiwgNCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0aGlzX25hbWVbXSA9Ci0gICAgICAgICAgICAgICAgeyBDUExVU19NQVJLRVIsICd0JywgJ2gnLCAnaScsICdzJywgJ1wwJyB9OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChsb29rdXBfc3ltYm9sICh0aGlzX25hbWUsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCkpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gVEhJUzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiaW50IiwgMykpCi0JcmV0dXJuIElOVF9LRVlXT1JEOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB5eWx2YWwuc3ZhbC5wdHIgPSB0b2tzdGFydDsKLSAgeXlsdmFsLnN2YWwubGVuZ3RoID0gbmFtZWxlbjsKLQotICBpZiAoKnRva3N0YXJ0ID09ICckJykKLSAgICB7Ci0gICAgICB3cml0ZV9kb2xsYXJfdmFyaWFibGUgKHl5bHZhbC5zdmFsKTsKLSAgICAgIHJldHVybiBWQVJJQUJMRTsKLSAgICB9Ci0gIAotICAvKiBMb29rIGFoZWFkIGFuZCBzZWUgaWYgd2UgY2FuIGNvbnN1bWUgbW9yZSBvZiB0aGUgaW5wdXQKLSAgICAgc3RyaW5nIHRvIGdldCBhIHJlYXNvbmFibGUgY2xhc3MvbmFtZXNwYWNlIHNwZWMgb3IgYQotICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZS4gIFRoaXMgaXMgYSBrbHVkZ2UgdG8gZ2V0IGFyb3VuZCB0aGUKLSAgICAgSFAgYUNDIGNvbXBpbGVyJ3MgZ2VuZXJhdGlvbiBvZiBzeW1ib2wgbmFtZXMgd2l0aCBlbWJlZGRlZAotICAgICBjb2xvbnMgZm9yIG5hbWVzcGFjZSBhbmQgbmVzdGVkIGNsYXNzZXMuICovIAotICBpZiAodW5xdW90ZWRfZXhwcikKLSAgICB7Ci0gICAgICAvKiBPbmx5IGRvIGl0IGlmIG5vdCBpbnNpZGUgc2luZ2xlIHF1b3RlcyAqLyAKLSAgICAgIHN5bV9jbGFzcyA9IHBhcnNlX25lc3RlZF9jbGFzc2VzX2Zvcl9ocGFjYyAoeXlsdmFsLnN2YWwucHRyLCB5eWx2YWwuc3ZhbC5sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b2tlbl9zdHJpbmcsICZjbGFzc19wcmVmaXgsICZsZXhwdHIpOwotICAgICAgaWYgKHN5bV9jbGFzcykKLSAgICAgICAgewotICAgICAgICAgIC8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgdG9rZW4gd2l0aCB0aGUgYmlnZ2VyIG9uZSB3ZSBmb3VuZCAqLyAKLSAgICAgICAgICB5eWx2YWwuc3ZhbC5wdHIgPSB0b2tlbl9zdHJpbmc7Ci0gICAgICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gc3RybGVuICh0b2tlbl9zdHJpbmcpOwotICAgICAgICB9Ci0gICAgfQotICAKLSAgLyogVXNlIHRva2VuLXR5cGUgQkxPQ0tOQU1FIGZvciBzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlIGRlZmluZWQgYXMKLSAgICAgZnVuY3Rpb25zIG9yIHN5bXRhYnMuICBJZiB0aGlzIGlzIG5vdCBzbywgdGhlbiAuLi4KLSAgICAgVXNlIHRva2VuLXR5cGUgVFlQRU5BTUUgZm9yIHN5bWJvbHMgdGhhdCBoYXBwZW4gdG8gYmUgZGVmaW5lZAotICAgICBjdXJyZW50bHkgYXMgbmFtZXMgb2YgdHlwZXM7IE5BTUUgZm9yIG90aGVyIHN5bWJvbHMuCi0gICAgIFRoZSBjYWxsZXIgaXMgbm90IGNvbnN0cmFpbmVkIHRvIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uLiAgKi8KLSAgewotICAgIGNoYXIgKnRtcCA9IGNvcHlfbmFtZSAoeXlsdmFsLnN2YWwpOwotICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKLSAgICBpbnQgaXNfYV9maWVsZF9vZl90aGlzID0gMDsKLSAgICBpbnQgaGV4dHlwZTsKLQotICAgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKHRtcCwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAotCQkJIFZBUl9OQU1FU1BBQ0UsCi0JCQkgY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMKLQkJCSA/ICZpc19hX2ZpZWxkX29mX3RoaXMgOiAoaW50ICopIE5VTEwsCi0JCQkgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOwotICAgIC8qIENhbGwgbG9va3VwX3N5bXRhYiwgbm90IGxvb2t1cF9wYXJ0aWFsX3N5bXRhYiwgaW4gY2FzZSB0aGVyZSBhcmUKLSAgICAgICBubyBwc3ltdGFicyAoY29mZiwgeGNvZmYsIG9yIHNvbWUgZnV0dXJlIGNoYW5nZSB0byBibG93IGF3YXkgdGhlCi0gICAgICAgcHN5bXRhYnMgb25jZSBvbmNlIHN5bWJvbHMgYXJlIHJlYWQpLiAgKi8KLSAgICBpZiAoc3ltICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfQkxPQ0spCi0gICAgICB7Ci0JeXlsdmFsLnNzeW0uc3ltID0gc3ltOwotCXl5bHZhbC5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcyA9IGlzX2FfZmllbGRfb2ZfdGhpczsKLQlyZXR1cm4gQkxPQ0tOQU1FOwotICAgICAgfQotICAgIGVsc2UgaWYgKCFzeW0pCi0gICAgICB7CQkJCS8qIFNlZSBpZiBpdCdzIGEgZmlsZSBuYW1lLiAqLwotCXN0cnVjdCBzeW10YWIgKnN5bXRhYjsKLQotCXN5bXRhYiA9IGxvb2t1cF9zeW10YWIgKHRtcCk7Ci0KLQlpZiAoc3ltdGFiKQotCSAgewotCSAgICB5eWx2YWwuYnZhbCA9IEJMT0NLVkVDVE9SX0JMT0NLIChCTE9DS1ZFQ1RPUiAoc3ltdGFiKSwgU1RBVElDX0JMT0NLKTsKLQkgICAgcmV0dXJuIEZJTEVOQU1FOwotCSAgfQotICAgICAgfQotCi0gICAgaWYgKHN5bSAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX1RZUEVERUYpCi0gICAgICAgIHsKLSNpZiAxCi0JICAvKiBEZXNwaXRlIHRoZSBmb2xsb3dpbmcgZmxhdywgd2UgbmVlZCB0byBrZWVwIHRoaXMgY29kZSBlbmFibGVkLgotCSAgICAgQmVjYXVzZSB3ZSBjYW4gZ2V0IGNhbGxlZCBmcm9tIGNoZWNrX3N0dWJfbWV0aG9kLCBpZiB3ZSBkb24ndAotCSAgICAgaGFuZGxlIG5lc3RlZCB0eXBlcyB0aGVuIGl0IHNjcmV3cyBtYW55IG9wZXJhdGlvbnMgaW4gYW55Ci0JICAgICBwcm9ncmFtIHdoaWNoIHVzZXMgbmVzdGVkIHR5cGVzLiAgKi8KLQkgIC8qIEluICJBOjp4IiwgaWYgeCBpcyBhIG1lbWJlciBmdW5jdGlvbiBvZiBBIGFuZCB0aGVyZSBoYXBwZW5zCi0JICAgICB0byBiZSBhIHR5cGUgKG5lc3RlZCBvciBub3QsIHNpbmNlIHRoZSBzdGFicyBkb24ndCBtYWtlIHRoYXQKLQkgICAgIGRpc3RpbmN0aW9uKSBuYW1lZCB4LCB0aGVuIHRoaXMgY29kZSBpbmNvcnJlY3RseSB0aGlua3Mgd2UKLQkgICAgIGFyZSBkZWFsaW5nIHdpdGggbmVzdGVkIHR5cGVzIHJhdGhlciB0aGFuIGEgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQotCSAgY2hhciAqcDsKLQkgIGNoYXIgKm5hbWVzdGFydDsKLQkgIHN0cnVjdCBzeW1ib2wgKmJlc3Rfc3ltOwotCi0JICAvKiBMb29rIGFoZWFkIHRvIGRldGVjdCBuZXN0ZWQgdHlwZXMuICBUaGlzIHByb2JhYmx5IHNob3VsZCBiZQotCSAgICAgZG9uZSBpbiB0aGUgZ3JhbW1hciwgYnV0IHRyeWluZyBzZWVtZWQgdG8gaW50cm9kdWNlIGEgbG90Ci0JICAgICBvZiBzaGlmdC9yZWR1Y2UgYW5kIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzLiAgSXQncyBwb3NzaWJsZQotCSAgICAgdGhhdCBpdCBjb3VsZCBiZSBkb25lLCB0aG91Z2guICBPciBwZXJoYXBzIGEgbm9uLWdyYW1tYXIsIGJ1dAotCSAgICAgbGVzcyBhZCBob2MsIGFwcHJvYWNoIHdvdWxkIHdvcmsgd2VsbC4gICovCi0KLQkgIC8qIFNpbmNlIHdlIGRvIG5vdCBjdXJyZW50bHkgaGF2ZSBhbnkgd2F5IG9mIGRpc3Rpbmd1aXNoaW5nCi0JICAgICBhIG5lc3RlZCB0eXBlIGZyb20gYSBub24tbmVzdGVkIG9uZSAodGhlIHN0YWJzIGRvbid0IHRlbGwKLQkgICAgIHVzIHdoZXRoZXIgYSB0eXBlIGlzIG5lc3RlZCksIHdlIGp1c3QgaWdub3JlIHRoZQotCSAgICAgY29udGFpbmluZyB0eXBlLiAgKi8KLQotCSAgcCA9IGxleHB0cjsKLQkgIGJlc3Rfc3ltID0gc3ltOwotCSAgd2hpbGUgKDEpCi0JICAgIHsKLQkgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCSAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXG4nKQotCQkrK3A7Ci0JICAgICAgaWYgKCpwID09ICc6JyAmJiBwWzFdID09ICc6JykKLQkJewotCQkgIC8qIFNraXAgdGhlIGA6OicuICAqLwotCQkgIHAgKz0gMjsKLQkJICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCQkgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXG4nKQotCQkgICAgKytwOwotCQkgIG5hbWVzdGFydCA9IHA7Ci0JCSAgd2hpbGUgKCpwID09ICdfJyB8fCAqcCA9PSAnJCcgfHwgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpCi0JCQkgfHwgKCpwID49ICdhJyAmJiAqcCA8PSAneicpCi0JCQkgfHwgKCpwID49ICdBJyAmJiAqcCA8PSAnWicpKQotCQkgICAgKytwOwotCQkgIGlmIChwICE9IG5hbWVzdGFydCkKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IHN5bWJvbCAqY3VyX3N5bTsKLQkJICAgICAgLyogQXMgYmlnIGFzIHRoZSB3aG9sZSByZXN0IG9mIHRoZSBleHByZXNzaW9uLCB3aGljaCBpcwotCQkJIGF0IGxlYXN0IGJpZyBlbm91Z2guICAqLwotCQkgICAgICBjaGFyICpuY29weSA9IGFsbG9jYSAoc3RybGVuICh0bXApK3N0cmxlbiAobmFtZXN0YXJ0KSszKTsKLQkJICAgICAgY2hhciAqdG1wMTsKLQotCQkgICAgICB0bXAxID0gbmNvcHk7Ci0JCSAgICAgIG1lbWNweSAodG1wMSwgdG1wLCBzdHJsZW4gKHRtcCkpOwotCQkgICAgICB0bXAxICs9IHN0cmxlbiAodG1wKTsKLQkJICAgICAgbWVtY3B5ICh0bXAxLCAiOjoiLCAyKTsKLQkJICAgICAgdG1wMSArPSAyOwotCQkgICAgICBtZW1jcHkgKHRtcDEsIG5hbWVzdGFydCwgcCAtIG5hbWVzdGFydCk7Ci0JCSAgICAgIHRtcDFbcCAtIG5hbWVzdGFydF0gPSAnXDAnOwotCQkgICAgICBjdXJfc3ltID0gbG9va3VwX3N5bWJvbCAobmNvcHksIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKLQkJCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKLQkJCQkJICAgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKLQkJICAgICAgaWYgKGN1cl9zeW0pCi0JCQl7Ci0JCQkgIGlmIChTWU1CT0xfQ0xBU1MgKGN1cl9zeW0pID09IExPQ19UWVBFREVGKQotCQkJICAgIHsKLQkJCSAgICAgIGJlc3Rfc3ltID0gY3VyX3N5bTsKLQkJCSAgICAgIGxleHB0ciA9IHA7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZQotCQlicmVhazsKLQkgICAgfQotCi0JICB5eWx2YWwudHN5bS50eXBlID0gU1lNQk9MX1RZUEUgKGJlc3Rfc3ltKTsKLSNlbHNlIC8qIG5vdCAwICovCi0JICB5eWx2YWwudHN5bS50eXBlID0gU1lNQk9MX1RZUEUgKHN5bSk7Ci0jZW5kaWYgLyogbm90IDAgKi8KLQkgIHJldHVybiBUWVBFTkFNRTsKLSAgICAgICAgfQotICAgIGlmICgoeXlsdmFsLnRzeW0udHlwZSA9IGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUgKHRtcCkpICE9IDApCi0JcmV0dXJuIFRZUEVOQU1FOwotCi0gICAgLyogSW5wdXQgbmFtZXMgdGhhdCBhcmVuJ3Qgc3ltYm9scyBidXQgQVJFIHZhbGlkIGhleCBudW1iZXJzLAotICAgICAgIHdoZW4gdGhlIGlucHV0IHJhZGl4IHBlcm1pdHMgdGhlbSwgY2FuIGJlIG5hbWVzIG9yIG51bWJlcnMKLSAgICAgICBkZXBlbmRpbmcgb24gdGhlIHBhcnNlLiAgTm90ZSB3ZSBzdXBwb3J0IHJhZGl4ZXMgPiAxNiBoZXJlLiAgKi8KLSAgICBpZiAoIXN5bSAmJiAKLSAgICAgICAgKCh0b2tzdGFydFswXSA+PSAnYScgJiYgdG9rc3RhcnRbMF0gPCAnYScgKyBpbnB1dF9yYWRpeCAtIDEwKSB8fAotICAgICAgICAgKHRva3N0YXJ0WzBdID49ICdBJyAmJiB0b2tzdGFydFswXSA8ICdBJyArIGlucHV0X3JhZGl4IC0gMTApKSkKLSAgICAgIHsKLSAJWVlTVFlQRSBuZXdsdmFsOwkvKiBJdHMgdmFsdWUgaXMgaWdub3JlZC4gICovCi0JaGV4dHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIG5hbWVsZW4sIDAsICZuZXdsdmFsKTsKLQlpZiAoaGV4dHlwZSA9PSBJTlQpCi0JICB7Ci0JICAgIHl5bHZhbC5zc3ltLnN5bSA9IHN5bTsKLQkgICAgeXlsdmFsLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzID0gaXNfYV9maWVsZF9vZl90aGlzOwotCSAgICByZXR1cm4gTkFNRV9PUl9JTlQ7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAvKiBBbnkgb3RoZXIga2luZCBvZiBzeW1ib2wgKi8KLSAgICB5eWx2YWwuc3N5bS5zeW0gPSBzeW07Ci0gICAgeXlsdmFsLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzID0gaXNfYV9maWVsZF9vZl90aGlzOwotICAgIHJldHVybiBOQU1FOwotICB9Ci19Ci0KLXZvaWQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY2hhciAqbXNnOwotewotICBlcnJvciAoIkEgJXMgaW4gZXhwcmVzc2lvbiwgbmVhciBgJXMnLiIsIChtc2cgPyBtc2cgOiAiZXJyb3IiKSwgbGV4cHRyKTsKLX0KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni93aW5kb3dzLm1oIGIvZ2RiL2NvbmZpZy9pMzg2L3dpbmRvd3MubWgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MzNhNmUuLjAwMDAwMDAKLS0tIGEvZ2RiL2NvbmZpZy9pMzg2L3dpbmRvd3MubWgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIGdkYndpbi5vIGFuZCBzZXItd2luMzJzLmMgaGF2ZSB0byBiZSBuYW1lZCBiZWNhdXNlIHRoZXkgaGF2ZQotIyAgIF9pbml0aWFsaXplIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgZm91bmQgYnkgaW5pdC5jCi0jIGd1aS5vcmVzIGhhcyB0byBiZSBuYW1lZCwgb3IgZWxzZSBtc3ZjIHdvbid0IGxpbmsgaXQgaW4uCi1YREVQRklMRVMgPSBcCi0JbXN3aW4vZ2Rid2luLm8gXAotCW1zd2luL3Nlci13aW4zMnMubyBcCi0JbXN3aW4vZ3VpLm9yZXMgXAotCW1zd2luL2xpYndpbmdkYi5hCi0KLSQoWERFUEZJTEVTKToKLQlyb290bWU9YHB3ZGAgOyBleHBvcnQgcm9vdG1lIDsgXAotCSggY2QgbXN3aW4gOyBcCi0JICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYWxsICkKLQotWE1fRklMRT14bS13aW5kb3dzLmgKLU1NQUxMT0M9Ci1TRVJfSEFSRFdJUkUgPQpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9HREJ2bi50ZXhpIGIvZ2RiL2RvYy9HREJ2bi50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDcyMmJkLi4wMDAwMDAwCi0tLSBhL2dkYi9kb2MvR0RCdm4udGV4aQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUBzZXQgR0RCVk4gNC4xOApkaWZmIC0tZ2l0IGEvZ2RiL2YtZXhwLnRhYi5jIGIvZ2RiL2YtZXhwLnRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdkMjVlLi4wMDAwMDAwCi0tLSBhL2dkYi9mLWV4cC50YWIuYworKysgL2Rldi9udWxsCkBAIC0xLDIwODYgKzAsMCBAQAotCi0vKiAgQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSBmLWV4cC55Ci0gYnkgIEdOVSBCaXNvbiB2ZXJzaW9uIDEuMjUKLSAgKi8KLQotI2RlZmluZSBZWUJJU09OIDEgIC8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCi0KLSNkZWZpbmUJSU5UCTI1OAotI2RlZmluZQlGTE9BVAkyNTkKLSNkZWZpbmUJU1RSSU5HX0xJVEVSQUwJMjYwCi0jZGVmaW5lCUJPT0xFQU5fTElURVJBTAkyNjEKLSNkZWZpbmUJTkFNRQkyNjIKLSNkZWZpbmUJVFlQRU5BTUUJMjYzCi0jZGVmaW5lCU5BTUVfT1JfSU5UCTI2NAotI2RlZmluZQlTSVpFT0YJMjY1Ci0jZGVmaW5lCUVSUk9SCTI2NgotI2RlZmluZQlJTlRfS0VZV09SRAkyNjcKLSNkZWZpbmUJSU5UX1MyX0tFWVdPUkQJMjY4Ci0jZGVmaW5lCUxPR0lDQUxfUzFfS0VZV09SRAkyNjkKLSNkZWZpbmUJTE9HSUNBTF9TMl9LRVlXT1JECTI3MAotI2RlZmluZQlMT0dJQ0FMX0tFWVdPUkQJMjcxCi0jZGVmaW5lCVJFQUxfS0VZV09SRAkyNzIKLSNkZWZpbmUJUkVBTF9TOF9LRVlXT1JECTI3MwotI2RlZmluZQlSRUFMX1MxNl9LRVlXT1JECTI3NAotI2RlZmluZQlDT01QTEVYX1M4X0tFWVdPUkQJMjc1Ci0jZGVmaW5lCUNPTVBMRVhfUzE2X0tFWVdPUkQJMjc2Ci0jZGVmaW5lCUNPTVBMRVhfUzMyX0tFWVdPUkQJMjc3Ci0jZGVmaW5lCUJPT0xfQU5ECTI3OAotI2RlZmluZQlCT09MX09SCTI3OQotI2RlZmluZQlCT09MX05PVAkyODAKLSNkZWZpbmUJQ0hBUkFDVEVSCTI4MQotI2RlZmluZQlWQVJJQUJMRQkyODIKLSNkZWZpbmUJQVNTSUdOX01PRElGWQkyODMKLSNkZWZpbmUJQUJPVkVfQ09NTUEJMjg0Ci0jZGVmaW5lCUVRVUFMCTI4NQotI2RlZmluZQlOT1RFUVVBTAkyODYKLSNkZWZpbmUJTEVTU1RIQU4JMjg3Ci0jZGVmaW5lCUdSRUFURVJUSEFOCTI4OAotI2RlZmluZQlMRVEJMjg5Ci0jZGVmaW5lCUdFUQkyOTAKLSNkZWZpbmUJTFNICTI5MQotI2RlZmluZQlSU0gJMjkyCi0jZGVmaW5lCVVOQVJZCTI5MwotCi0jbGluZSA0MyAiZi1leHAueSIKLQotCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSNpbmNsdWRlICJleHByZXNzaW9uLmgiCi0jaW5jbHVkZSAidmFsdWUuaCIKLSNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgotI2luY2x1ZGUgImxhbmd1YWdlLmgiCi0jaW5jbHVkZSAiZi1sYW5nLmgiCi0jaW5jbHVkZSAiYmZkLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLwotI2luY2x1ZGUgInN5bWZpbGUuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCi0jaW5jbHVkZSAib2JqZmlsZXMuaCIgLyogRm9yIGhhdmVfZnVsbF9zeW1ib2xzIGFuZCBoYXZlX3BhcnRpYWxfc3ltYm9scyAqLwotCi0vKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwgZXRjKSwKLSAgIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzLCBzbyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZQotICAgeWFjYyBnZW5lcmF0ZWQgcGFyc2VycyBpbiBnZGIuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcwotICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQotICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCi0gICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLwotCi0jZGVmaW5lCXl5bWF4ZGVwdGggZl9tYXhkZXB0aAotI2RlZmluZQl5eXBhcnNlCWZfcGFyc2UKLSNkZWZpbmUJeXlsZXgJZl9sZXgKLSNkZWZpbmUJeXllcnJvcglmX2Vycm9yCi0jZGVmaW5lCXl5bHZhbAlmX2x2YWwKLSNkZWZpbmUJeXljaGFyCWZfY2hhcgotI2RlZmluZQl5eWRlYnVnCWZfZGVidWcKLSNkZWZpbmUJeXlwYWN0CWZfcGFjdAkKLSNkZWZpbmUJeXlyMQlmX3IxCQkJCi0jZGVmaW5lCXl5cjIJZl9yMgkJCQotI2RlZmluZQl5eWRlZglmX2RlZgkJCi0jZGVmaW5lCXl5Y2hrCWZfY2hrCQkKLSNkZWZpbmUJeXlwZ28JZl9wZ28JCQotI2RlZmluZQl5eWFjdAlmX2FjdAkJCi0jZGVmaW5lCXl5ZXhjYQlmX2V4Y2EKLSNkZWZpbmUgeXllcnJmbGFnIGZfZXJyZmxhZwotI2RlZmluZSB5eW5lcnJzCWZfbmVycnMKLSNkZWZpbmUJeXlwcwlmX3BzCi0jZGVmaW5lCXl5cHYJZl9wdgotI2RlZmluZQl5eXMJZl9zCi0jZGVmaW5lCXl5X3l5cwlmX3l5cwotI2RlZmluZQl5eXN0YXRlCWZfc3RhdGUKLSNkZWZpbmUJeXl0bXAJZl90bXAKLSNkZWZpbmUJeXl2CWZfdgotI2RlZmluZQl5eV95eXYJZl95eXYKLSNkZWZpbmUJeXl2YWwJZl92YWwKLSNkZWZpbmUJeXlsbG9jCWZfbGxvYwotI2RlZmluZSB5eXJlZHMJZl9yZWRzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eXRva3MJZl90b2tzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eWxocwlmX3l5bGhzCi0jZGVmaW5lIHl5bGVuCWZfeXlsZW4KLSNkZWZpbmUgeXlkZWZyZWQgZl95eWRlZnJlZAotI2RlZmluZSB5eWRnb3RvCWZfeXlkZ290bwotI2RlZmluZSB5eXNpbmRleCBmX3l5c2luZGV4Ci0jZGVmaW5lIHl5cmluZGV4IGZfeXlyaW5kZXgKLSNkZWZpbmUgeXlnaW5kZXggZl95eWdpbmRleAotI2RlZmluZSB5eXRhYmxlCSBmX3l5dGFibGUKLSNkZWZpbmUgeXljaGVjawkgZl95eWNoZWNrCi0KLSNpZm5kZWYgWVlERUJVRwotI2RlZmluZQlZWURFQlVHCTEJCS8qIERlZmF1bHQgdG8gbm8geXlkZWJ1ZyBzdXBwb3J0ICovCi0jZW5kaWYKLQotaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZCBncm93YnVmX2J5X3NpemUgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBpbnQgbWF0Y2hfc3RyaW5nX2xpdGVyYWwgUEFSQU1TICgodm9pZCkpOwotCi0KLSNsaW5lIDEyMiAiZi1leHAueSIKLXR5cGVkZWYgdW5pb24KLSAgewotICAgIExPTkdFU1QgbHZhbDsKLSAgICBzdHJ1Y3QgewotICAgICAgTE9OR0VTVCB2YWw7Ci0gICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSAgICB9IHR5cGVkX3ZhbDsKLSAgICBET1VCTEVTVCBkdmFsOwotICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKLSAgICBzdHJ1Y3QgdHlwZSAqdHZhbDsKLSAgICBzdHJ1Y3Qgc3Rva2VuIHN2YWw7Ci0gICAgc3RydWN0IHR0eXBlIHRzeW07Ci0gICAgc3RydWN0IHN5bXRva2VuIHNzeW07Ci0gICAgaW50IHZvaWR2YWw7Ci0gICAgc3RydWN0IGJsb2NrICpidmFsOwotICAgIGVudW0gZXhwX29wY29kZSBvcGNvZGU7Ci0gICAgc3RydWN0IGludGVybmFsdmFyICppdmFyOwotCi0gICAgc3RydWN0IHR5cGUgKip0dmVjOwotICAgIGludCAqaXZlYzsKLSAgfSBZWVNUWVBFOwotI2xpbmUgMTQ0ICJmLWV4cC55IgotCi0vKiBZWVNUWVBFIGdldHMgZGVmaW5lZCBieSAldW5pb24gKi8KLXN0YXRpYyBpbnQgcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQsIFlZU1RZUEUgKikpOwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZm5kZWYgX19jcGx1c3BsdXMKLSNpZm5kZWYgX19TVERDX18KLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotI2VuZGlmCi0KLQotCi0jZGVmaW5lCVlZRklOQUwJCTEyNQotI2RlZmluZQlZWUZMQUcJCS0zMjc2OAotI2RlZmluZQlZWU5UQkFTRQk1NQotCi0jZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDI5MyA/IHl5dHJhbnNsYXRlW3hdIDogNzEpCi0KLXN0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPSB7ICAgICAwLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDQ5LCAgICAzNSwgICAgIDIsICAgIDUxLAotICAgIDUyLCAgICA0NywgICAgNDUsICAgIDI5LCAgICA0NiwgICAgIDIsICAgIDQ4LCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA1NCwgICAgIDIsICAgICAyLAotICAgIDMxLCAgICAgMiwgICAgMzIsICAgIDQ0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgIDM0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgIDMzLCAgICAgMiwgICAgNTMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LAotICAgIDI2LCAgICAyNywgICAgMjgsICAgIDMwLCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLAotICAgIDQyLCAgICA0MywgICAgNTAKLX07Ci0KLSNpZiBZWURFQlVHICE9IDAKLXN0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9IHsgICAgIDAsCi0gICAgIDAsICAgICAyLCAgICAgNCwgICAgIDYsICAgIDEwLCAgICAxMywgICAgMTYsICAgIDE5LCAgICAyMiwgICAgMjUsCi0gICAgMjgsICAgIDI5LCAgICAzNSwgICAgMzYsICAgIDM4LCAgICA0MCwgICAgNDQsICAgIDQ4LCAgICA1MiwgICAgNTYsCi0gICAgNjEsICAgIDY1LCAgICA2OSwgICAgNzMsICAgIDc3LCAgICA4MSwgICAgODUsICAgIDg5LCAgICA5MywgICAgOTcsCi0gICAxMDEsICAgMTA1LCAgIDEwOSwgICAxMTMsICAgMTE3LCAgIDEyMSwgICAxMjUsICAgMTI5LCAgIDEzMywgICAxMzcsCi0gICAxNDEsICAgMTQ1LCAgIDE0NywgICAxNDksICAgMTUxLCAgIDE1MywgICAxNTUsICAgMTYwLCAgIDE2MiwgICAxNjQsCi0gICAxNjYsICAgMTY4LCAgIDE3MCwgICAxNzMsICAgMTc1LCAgIDE3OCwgICAxODAsICAgMTgzLCAgIDE4NSwgICAxODksCi0gICAxOTIsICAgMTk0LCAgIDE5NywgICAyMDEsICAgMjAzLCAgIDIwNSwgICAyMDcsICAgMjA5LCAgIDIxMSwgICAyMTMsCi0gICAyMTUsICAgMjE3LCAgIDIxOSwgICAyMjEsICAgMjIzLCAgIDIyNSwgICAyMjcsICAgMjI5LCAgIDIzMSwgICAyMzUsCi0gICAyMzcsICAgMjM5LCAgIDI0MQotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cmhzW10gPSB7ICAgIDU3LAotICAgICAwLCAgICA1NiwgICAgIDAsICAgIDYzLCAgICAgMCwgICAgNTEsICAgIDU3LCAgICA1MiwgICAgIDAsICAgIDQ3LAotICAgIDU3LCAgICAgMCwgICAgMzUsICAgIDU3LCAgICAgMCwgICAgNDYsICAgIDU3LCAgICAgMCwgICAgMjUsICAgIDU3LAotICAgICAwLCAgICA1MywgICAgNTcsICAgICAwLCAgICAxMCwgICAgNTcsICAgICAwLCAgICAgMCwgICAgNTcsICAgIDUxLAotICAgIDU4LCAgICA1OSwgICAgNTIsICAgICAwLCAgICAgMCwgICAgNTcsICAgICAwLCAgICA2MCwgICAgIDAsICAgIDU5LAotICAgIDI5LCAgICA1NywgICAgIDAsICAgIDU3LCAgICA1NCwgICAgNTcsICAgICAwLCAgICA1NywgICAgMjksICAgIDU3LAotICAgICAwLCAgICA1MSwgICAgNjEsICAgIDUyLCAgICAgMCwgICAgNTEsICAgIDYzLCAgICA1MiwgICAgNTcsICAgICAwLAotICAgIDU3LCAgICA0NCwgICAgNTcsICAgICAwLCAgICA1NywgICAgNDcsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDQ4LAotICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDQ5LCAgICA1NywgICAgIDAsICAgIDU3LCAgICA0NSwgICAgNTcsICAgICAwLAotICAgIDU3LCAgICA0NiwgICAgNTcsICAgICAwLCAgICA1NywgICAgNDIsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDQzLAotICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDM2LCAgICA1NywgICAgIDAsICAgIDU3LCAgICAzNywgICAgNTcsICAgICAwLAotICAgIDU3LCAgICA0MCwgICAgNTcsICAgICAwLCAgICA1NywgICAgNDEsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDM4LAotICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDM5LCAgICA1NywgICAgIDAsICAgIDU3LCAgICAzNSwgICAgNTcsICAgICAwLAotICAgIDU3LCAgICAzNCwgICAgNTcsICAgICAwLCAgICA1NywgICAgMzMsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDIzLAotICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDI0LCAgICA1NywgICAgIDAsICAgIDU3LCAgICAzMSwgICAgNTcsICAgICAwLAotICAgIDU3LCAgICAyOCwgICAgNTcsICAgICAwLCAgICAgMywgICAgIDAsICAgICA5LCAgICAgMCwgICAgIDQsICAgICAwLAotICAgIDYyLCAgICAgMCwgICAgMjcsICAgICAwLCAgICAxMCwgICAgNTEsICAgIDYzLCAgICA1MiwgICAgIDAsICAgICA2LAotICAgICAwLCAgICAgNSwgICAgIDAsICAgIDcwLCAgICAgMCwgICAgNjQsICAgICAwLCAgICA2OCwgICAgIDAsICAgIDY4LAotICAgIDY1LCAgICAgMCwgICAgNDcsICAgICAwLCAgICA0NywgICAgNjUsICAgICAwLCAgICAzNSwgICAgIDAsICAgIDM1LAotICAgIDY1LCAgICAgMCwgICAgNjYsICAgICAwLCAgICA1MSwgICAgNjUsICAgIDUyLCAgICAgMCwgICAgNjYsICAgIDY3LAotICAgICAwLCAgICA2NywgICAgIDAsICAgIDUxLCAgICA1MiwgICAgIDAsICAgIDUxLCAgICA2OSwgICAgNTIsICAgICAwLAotICAgICA4LCAgICAgMCwgICAgMTIsICAgICAwLCAgICAxMywgICAgIDAsICAgIDI2LCAgICAgMCwgICAgMTYsICAgICAwLAotICAgIDE1LCAgICAgMCwgICAgMTQsICAgICAwLCAgICAxNywgICAgIDAsICAgIDE4LCAgICAgMCwgICAgMTksICAgICAwLAotICAgIDIwLCAgICAgMCwgICAgMjEsICAgICAwLCAgICAyMiwgICAgIDAsICAgICA4LCAgICAgMCwgICAgNjMsICAgICAwLAotICAgIDY5LCAgICAyOSwgICAgNjMsICAgICAwLCAgICAgNywgICAgIDAsICAgICA4LCAgICAgMCwgICAgIDksICAgICAwLAotICAgICA3LCAgICAgMAotfTsKLQotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLXN0YXRpYyBjb25zdCBzaG9ydCB5eXJsaW5lW10gPSB7IDAsCi0gICAyMjEsICAgMjIyLCAgIDIyNSwgICAyMzEsICAgMjM2LCAgIDIzOSwgICAyNDIsICAgMjQ2LCAgIDI1MCwgICAyNTQsCi0gICAyNjMsICAgMjY1LCAgIDI3MSwgICAyNzQsICAgMjc4LCAgIDI4MSwgICAyODUsICAgMjkwLCAgIDI5NCwgICAyOTgsCi0gICAzMDYsICAgMzEwLCAgIDMxNCwgICAzMTgsICAgMzIyLCAgIDMyNiwgICAzMzAsICAgMzM0LCAgIDMzOCwgICAzNDIsCi0gICAzNDYsICAgMzUwLCAgIDM1NCwgICAzNTgsICAgMzYyLCAgIDM2NiwgICAzNzAsICAgMzc0LCAgIDM3OSwgICAzODMsCi0gICAzODcsICAgMzkzLCAgIDQwMCwgICA0MDksICAgNDE2LCAgIDQxOSwgICA0MjIsICAgNDMwLCAgIDQzNywgICA0NDUsCi0gICA0ODksICAgNDkyLCAgIDQ5MywgICA1MzYsICAgNTM4LCAgIDU0MCwgICA1NDIsICAgNTQ0LCAgIDU0NywgICA1NDksCi0gICA1NTEsICAgNTU1LCAgIDU1NywgICA1NjIsICAgNTY0LCAgIDU2NiwgICA1NjgsICAgNTcwLCAgIDU3MiwgICA1NzQsCi0gICA1NzYsICAgNTc4LCAgIDU4MCwgICA1ODIsICAgNTg0LCAgIDU4NiwgICA1OTAsICAgNTk0LCAgIDU5OSwgICA2MDYsCi0gICA2MDgsICAgNjEwLCAgIDYxNAotfTsKLSNlbmRpZgotCi0KLSNpZiBZWURFQlVHICE9IDAgfHwgZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHl5dG5hbWVbXSA9IHsgICAiJCIsImVycm9yIiwiJHVuZGVmaW5lZC4iLCJJTlQiLCJGTE9BVCIsCi0iU1RSSU5HX0xJVEVSQUwiLCJCT09MRUFOX0xJVEVSQUwiLCJOQU1FIiwiVFlQRU5BTUUiLCJOQU1FX09SX0lOVCIsIlNJWkVPRiIsCi0iRVJST1IiLCJJTlRfS0VZV09SRCIsIklOVF9TMl9LRVlXT1JEIiwiTE9HSUNBTF9TMV9LRVlXT1JEIiwiTE9HSUNBTF9TMl9LRVlXT1JEIiwKLSJMT0dJQ0FMX0tFWVdPUkQiLCJSRUFMX0tFWVdPUkQiLCJSRUFMX1M4X0tFWVdPUkQiLCJSRUFMX1MxNl9LRVlXT1JEIiwiQ09NUExFWF9TOF9LRVlXT1JEIiwKLSJDT01QTEVYX1MxNl9LRVlXT1JEIiwiQ09NUExFWF9TMzJfS0VZV09SRCIsIkJPT0xfQU5EIiwiQk9PTF9PUiIsIkJPT0xfTk9UIiwKLSJDSEFSQUNURVIiLCJWQVJJQUJMRSIsIkFTU0lHTl9NT0RJRlkiLCInLCciLCJBQk9WRV9DT01NQSIsIic9JyIsIic/JyIsIid8JyIsCi0iJ14nIiwiJyYnIiwiRVFVQUwiLCJOT1RFUVVBTCIsIkxFU1NUSEFOIiwiR1JFQVRFUlRIQU4iLCJMRVEiLCJHRVEiLCJMU0giLCJSU0giLAotIidAJyIsIicrJyIsIictJyIsIicqJyIsIicvJyIsIiclJyIsIlVOQVJZIiwiJygnIiwiJyknIiwiJ34nIiwiJzonIiwic3RhcnQiLAotInR5cGVfZXhwIiwiZXhwIiwiQDEiLCJhcmdsaXN0Iiwic3Vic3RyaW5nIiwiY29tcGxleG51bSIsInZhcmlhYmxlIiwidHlwZSIsInB0eXBlIiwKLSJhYnNfZGVjbCIsImRpcmVjdF9hYnNfZGVjbCIsImZ1bmNfbW9kIiwidHlwZWJhc2UiLCJub25lbXB0eV90eXBlbGlzdCIsIm5hbWVfbm90X3R5cGVuYW1lIiwgTlVMTAotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyMVtdID0geyAgICAgMCwKLSAgICA1NSwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywKLSAgICA1OCwgICAgNTcsICAgIDU5LCAgICA1OSwgICAgNTksICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDU3LCAgICA1NywKLSAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywKLSAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywKLSAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA2MiwKLSAgICA2MywgICAgNjQsICAgIDY0LCAgICA2NSwgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjUsICAgIDY2LCAgICA2NiwKLSAgICA2NiwgICAgNjcsICAgIDY3LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwKLSAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICAtMSwgICAgNjksICAgIDY5LCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIDcwCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0geyAgICAgMCwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMCwgICAgIDUsICAgICAwLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgNCwKLSAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMiwKLSAgICAgMSwgICAgIDIsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwKLSAgICAgMSwgICAgIDEsICAgICAxCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZhY3RbXSA9IHsgICAgIDAsCi0gICAgNDIsICAgIDQ0LCAgICA0OSwgICAgNDgsICAgIDgzLCAgICA2NCwgICAgNDMsICAgICAwLCAgICA2NSwgICAgNjYsCi0gICAgNzAsICAgIDY5LCAgICA2OCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsCi0gICAgNjcsICAgIDQ2LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAyLCAgICAgMSwgICAgNDUsCi0gICAgIDMsICAgIDUxLCAgICA1MiwgICAgNTAsICAgICAwLCAgICAxMCwgICAgIDgsICAgICA2LCAgICAgNywgICAgIDUsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxMSwgICAgNTYsICAgIDU0LCAgICAgMCwgICAgNTMsCi0gICAgNTgsICAgIDYxLCAgICAgMCwgICAgIDAsICAgICA0LCAgICAxOSwgICAgIDAsICAgIDM4LCAgICAzOSwgICAgNDEsCi0gICAgNDAsICAgIDM3LCAgICAzNiwgICAgMzUsICAgIDI5LCAgICAzMCwgICAgMzMsICAgIDM0LCAgICAzMSwgICAgMzIsCi0gICAgMjcsICAgIDI4LCAgICAyMSwgICAgMjUsICAgIDI2LCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAxMywgICAgNTcsCi0gICAgNTUsICAgIDYyLCAgICA3OCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNjAsICAgIDQ3LCAgICAxOCwgICAgMjAsCi0gICAgMTQsICAgICAwLCAgICAxNSwgICAgNTksICAgICAwLCAgICA2MywgICAgIDAsICAgICAwLCAgICAxMiwgICAgNzksCi0gICAgMTcsICAgIDE2LCAgICAgMCwgICAgIDAsICAgICAwCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZnb3RvW10gPSB7ICAgMTIzLAotICAgIDI4LCAgICA0MSwgICAgOTksICAgMTEyLCAgIDExMywgICAgNDIsICAgIDMwLCAgIDEwMywgICAgMzIsICAgIDcwLAotICAgIDcxLCAgICA3MiwgICAgMzMsICAgMTA1LCAgICAzNAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0geyAgICA3NSwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAxMjYsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDEzNSwKLS0zMjc2OCwtMzI3NjgsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgIDc1LCAgIDEzNSwtMzI3NjgsICAgMzA5LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsICAgLTM0LC0zMjc2OCwgICAgNzUsICAgLTQ5LCAgIC00OSwgICAtNDksICAgLTQ5LCAgIC00OSwKLSAgIDI3OSwgICAtNDYsICAgLTQ1LCAgIC00OSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwKLSAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwKLSAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsLTMyNzY4LCAgIC0zNCwgICAtMzQsICAgMjA2LC0zMjc2OCwKLSAgIC00MiwtMzI3NjgsICAgLTM2LCAgIDEzNSwtMzI3NjgsLTMyNzY4LCAgIDEzNSwgICAzNTUsICAgMzM2LCAgIDMwOSwKLSAgIDMwOSwgICAzOTAsICAgNDA3LCAgIDE2MSwgICAyMjEsICAgMjIxLCAgIC0xMSwgICAtMTEsICAgLTExLCAgIC0xMSwKLSAgICAyMiwgICAgMjIsICAgIDU4LCAgIC0zNywgICAtMzcsICAgLTQ5LCAgIC00OSwgICAtNDksICAgMTM1LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIC0zMywgICAtMjYsICAgMjMwLC0zMjc2OCwgICAxODYsICAgMzA5LCAgIC00OSwKLSAgIDI1MCwgICAtMjQsLTMyNzY4LC0zMjc2OCwgICAzOTcsLTMyNzY4LCAgIDEzNSwgICAxMzUsLTMyNzY4LC0zMjc2OCwKLSAgIDMwOSwgICAzMDksICAgIDE1LCAgICAxOCwtMzI3NjgKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPSB7LTMyNzY4LAotLTMyNzY4LCAgICAgMCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAgNCwtMzI3NjgsICAgLTI1LAotLTMyNzY4LCAgIC01MCwtMzI3NjgsLTMyNzY4LC0zMjc2OAotfTsKLQotCi0jZGVmaW5lCVlZTEFTVAkJNDU4Ci0KLQotc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9IHsgICAgMjksCi0gICAgNjcsICAgIDY2LCAgIDExNSwgICAgMzEsICAgMTE4LCAgICA3NiwgICAgNzcsICAgIDM2LCAgIDEwNiwgICAgNjMsCi0gICAgNjQsICAgIDY1LCAgICA2OCwgICAgNjYsICAgMTI0LCAgIDEwOCwgICAgNjksICAgMTI1LCAgIDExNCwgICAgMzcsCi0gICAxMDcsICAgICAwLCAgICAzOCwgICAgMzksICAgIDQwLCAgIDExNiwgICAgNDQsICAgMTE5LCAgICAgMCwgICAgNDMsCi0gICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA3MywgICAgNjYsCi0gICAgIDAsICAgMTAwLCAgIDEwMSwgICAxMDQsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsCi0gICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTMsCi0gICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsCi0gICAgNjUsICAgICAwLCAgICA2NiwgICAxMDksICAgICAwLCAgICAgMCwgICAxMTAsICAgICAxLCAgICAgMiwgICAgIDMsCi0gICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgMCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsCi0gICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgICAwLCAgIDExMSwgICAgMjAsCi0gICAgMjEsICAgIDIyLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgMTEwLCAgICA2NiwgICAgMjMsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxMjEsICAgMTIyLCAgIDEyMCwgICAgIDAsCi0gICAgMjQsICAgIDI1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyNiwgICAgIDAsICAgIDI3LCAgICAgMSwgICAgIDIsCi0gICAgIDMsICAgICA0LCAgICAgNSwgICAgIDAsICAgICA3LCAgICAgOCwgICAgIDAsICAgICAxLCAgICAgMiwgICAgIDMsCi0gICAgIDQsICAgICA1LCAgICAgMCwgICAgIDcsICAgICA4LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgMjAsICAgICAwLCAgICAyMiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjAsCi0gICAgMjMsICAgIDIyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjMsCi0gICAgIDAsICAgIDI0LCAgICAyNSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzUsICAgICAwLCAgICAyNywgICAgIDAsCi0gICAgMjQsICAgIDI1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyNiwgICAgIDAsICAgIDI3LCAgICAgMSwgICAgIDIsCi0gICAgIDMsICAgICA0LCAgICAgNSwgICAgIDAsICAgICA3LCAgICAgOCwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsCi0gICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsCi0gICAgMjAsICAgIDY2LCAgICAyMiwgICAgIDYsICAgICAwLCAgICAgMCwgICAgIDAsICAgICA5LCAgICAxMCwgICAgMTEsCi0gICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgIDIxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjYsICAgICA2LCAgICAyNywgICAgIDAsCi0gICAgNjcsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsCi0gICAgMTgsICAgIDE5LCAgICA2OCwgICAgIDAsICAgICAwLCAgICAyMSwgICAgNjksICAgMTAyLCAgICA1NCwgICAgNTUsCi0gICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsCi0gICAgIDAsICAgIDY2LCAgICA0NSwgICAgNDYsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ3LCAgICAgMCwgICAgIDAsCi0gICAgNDgsICAgMTAyLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgIDAsCi0gICAgNjYsICAgIDQ1LCAgICA0NiwgICAxMTcsICAgICAwLCAgICAgMCwgICAgNDcsICAgIDc0LCAgICAgMCwgICAgNDgsCi0gICAgIDAsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsCi0gICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICAgMCwgICAgNjYsCi0gICAgNzUsICAgIDQ1LCAgICA0NiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDcsICAgICAwLCAgICAgMCwgICAgNDgsCi0gICAgIDAsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsCi0gICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA0NSwgICAgNjYsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0OSwgICAgNTAsCi0gICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsCi0gICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICAgMCwgICAgNjYsICAgIDQ5LCAgICA1MCwgICAgNTEsCi0gICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsCi0gICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgICA2LCAgICA2NiwgICAgIDAsICAgICAwLCAgICAgOSwgICAgMTAsCi0gICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAyMSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgIDAsCi0gICAgNjYsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksCi0gICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgIDAsICAgIDY2Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXljaGVja1tdID0geyAgICAgMCwKLSAgICAzNSwgICAgNTEsICAgIDI5LCAgICAgMCwgICAgMjksICAgIDUyLCAgICA1MiwgICAgIDgsICAgIDUxLCAgICA0NywKLSAgICA0OCwgICAgNDksICAgIDQ3LCAgICA1MSwgICAgIDAsICAgIDUyLCAgICA1MSwgICAgIDAsICAgIDUyLCAgICAyMCwKLSAgICA3MSwgICAgLTEsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDUyLCAgICAyNywgICAgNTIsICAgIC0xLCAgICAyNiwKLSAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDM1LCAgICA1MSwKLSAgICAtMSwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwKLSAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwKLSAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwKLSAgICA0OSwgICAgLTEsICAgIDUxLCAgICA3NCwgICAgLTEsICAgIC0xLCAgICA3NywgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIC0xLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgLTEsICAgIDk5LCAgICAyNSwKLSAgICAyNiwgICAgMjcsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAxMDgsICAgIDUxLCAgICAzNSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgIDExNywgICAxMTgsICAgMTE1LCAgICAtMSwKLSAgICA0NiwgICAgNDcsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDUxLCAgICAtMSwgICAgNTMsICAgICAzLCAgICAgNCwKLSAgICAgNSwgICAgIDYsICAgICA3LCAgICAtMSwgICAgIDksICAgIDEwLCAgICAtMSwgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgIC0xLCAgICAgOSwgICAgMTAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAyNSwgICAgLTEsICAgIDI3LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAyNSwKLSAgICAzNSwgICAgMjcsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNSwKLSAgICAtMSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1MSwgICAgLTEsICAgIDUzLCAgICAtMSwKLSAgICA0NiwgICAgNDcsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDUxLCAgICAtMSwgICAgNTMsICAgICAzLCAgICAgNCwKLSAgICAgNSwgICAgIDYsICAgICA3LCAgICAtMSwgICAgIDksICAgIDEwLCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwKLSAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwKLSAgICAyNSwgICAgNTEsICAgIDI3LCAgICAgOCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMTIsICAgIDEzLCAgICAxNCwKLSAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgMjYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1MSwgICAgIDgsICAgIDUzLCAgICAtMSwKLSAgICAzNSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwKLSAgICAyMSwgICAgMjIsICAgIDQ3LCAgICAtMSwgICAgLTEsICAgIDI2LCAgICA1MSwgICAgNTIsICAgIDM4LCAgICAzOSwKLSAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwKLSAgICAtMSwgICAgNTEsICAgIDIzLCAgICAyNCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMjgsICAgIC0xLCAgICAtMSwKLSAgICAzMSwgICAgNTIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwKLSAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICAtMSwKLSAgICA1MSwgICAgMjMsICAgIDI0LCAgICA1NCwgICAgLTEsICAgIC0xLCAgICAyOCwgICAgMjksICAgIC0xLCAgICAzMSwKLSAgICAtMSwgICAgMzMsICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwKLSAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIC0xLCAgICA1MSwKLSAgICA1MiwgICAgMjMsICAgIDI0LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAyOCwgICAgLTEsICAgIC0xLCAgICAzMSwKLSAgICAtMSwgICAgMzMsICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwKLSAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDIzLCAgICA1MSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDMzLCAgICAzNCwKLSAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKLSAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIC0xLCAgICA1MSwgICAgMzMsICAgIDM0LCAgICAzNSwKLSAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwKLSAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgIDgsICAgIDUxLCAgICAtMSwgICAgLTEsICAgIDEyLCAgICAxMywKLSAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIDI2LCAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwKLSAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICAtMSwKLSAgICA1MSwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywKLSAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICAtMSwgICAgNTEKLX07Ci0vKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLwotI2xpbmUgMyAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQotLyogU2tlbGV0b24gb3V0cHV0IHBhcnNlciBmb3IgYmlzb24sCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0vKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCi0gICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgotICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KLQotI2lmbmRlZiBhbGxvY2EKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UgLyogbm90IEdOVSBDLiAgKi8KLSNpZiAoIWRlZmluZWQgKF9fU1REQ19fKSAmJiBkZWZpbmVkIChzcGFyYykpIHx8IGRlZmluZWQgKF9fc3BhcmNfXykgfHwgZGVmaW5lZCAoX19zcGFyYykgfHwgZGVmaW5lZCAoX19zZ2kpCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci0jZWxzZSAvKiBub3Qgc3BhcmMgKi8KLSNpZiBkZWZpbmVkIChNU0RPUykgJiYgIWRlZmluZWQgKF9fVFVSQk9DX18pCi0jZWxzZSAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KLSNpZiBkZWZpbmVkKF9BSVgpCi0gI3ByYWdtYSBhbGxvY2EKLSNlbHNlIC8qIG5vdCBNU0RPUywgX19UVVJCT0NfXywgb3IgX0FJWCAqLwotI2lmZGVmIF9faHB1eAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLXZvaWQgKmFsbG9jYSAodW5zaWduZWQgaW50KTsKLX07Ci0jZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KLXZvaWQgKmFsbG9jYSAoKTsKLSNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNlbmRpZiAvKiBfX2hwdXggKi8KLSNlbmRpZiAvKiBub3QgX0FJWCAqLwotI2VuZGlmIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLwotI2VuZGlmIC8qIG5vdCBzcGFyYy4gICovCi0jZW5kaWYgLyogbm90IEdOVSBDLiAgKi8KLSNlbmRpZiAvKiBhbGxvY2Egbm90IGRlZmluZWQuICAqLwotCi0vKiBUaGlzIGlzIHRoZSBwYXJzZXIgY29kZSB0aGF0IGlzIHdyaXR0ZW4gaW50byBlYWNoIGJpc29uIHBhcnNlcgotICB3aGVuIHRoZSAlc2VtYW50aWNfcGFyc2VyIGRlY2xhcmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGdyYW1tYXIuCi0gIEl0IHdhcyB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIGhhaXJ5IHBhcnNlcgotICB1c2VkIHdoZW4gJXNlbWFudGljX3BhcnNlciBpcyBzcGVjaWZpZWQuICAqLwotCi0vKiBOb3RlOiB0aGVyZSBtdXN0IGJlIG9ubHkgb25lIGRvbGxhciBzaWduIGluIHRoaXMgZmlsZS4KLSAgIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBsaXN0IG9mIGFjdGlvbnMsIGVhY2ggYWN0aW9uCi0gICBhcyBvbmUgY2FzZSBvZiB0aGUgc3dpdGNoLiAgKi8KLQotI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQotI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCi0jZGVmaW5lIFlZRU1QVFkJCS0yCi0jZGVmaW5lIFlZRU9GCQkwCi0jZGVmaW5lIFlZQUNDRVBUCXJldHVybigwKQotI2RlZmluZSBZWUFCT1JUIAlyZXR1cm4oMSkKLSNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycmxhYjEKLS8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLgotICAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkgdG8gZWFzZSB0aGUKLSAgIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCi0gICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCi0jZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgotI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCi0jZGVmaW5lIFlZQkFDS1VQKHRva2VuLCB2YWx1ZSkgXAotZG8JCQkJCQkJCVwKLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKLSAgICB7IHl5Y2hhciA9ICh0b2tlbiksIHl5bHZhbCA9ICh2YWx1ZSk7CQkJXAotICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCi0gICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKLSAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAotICAgIH0JCQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJXAotICAgIHsgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTsgWVlFUlJPUjsgfQlcCi13aGlsZSAoMCkKLQotI2RlZmluZSBZWVRFUlJPUgkxCi0jZGVmaW5lIFlZRVJSQ09ERQkyNTYKLQotI2lmbmRlZiBZWVBVUkUKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCkKLSNlbmRpZgotCi0jaWZkZWYgWVlQVVJFCi0jaWZkZWYgWVlMU1BfTkVFREVECi0jaWZkZWYgWVlMRVhfUEFSQU0KLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MpCi0jZW5kaWYKLSNlbHNlIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KLSNpZmRlZiBZWUxFWF9QQVJBTQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCi0jZWxzZQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCkKLSNlbmRpZgotI2VuZGlmIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KLSNlbmRpZgotCi0vKiBJZiBub25yZWVudHJhbnQsIGdlbmVyYXRlIHRoZSB2YXJpYWJsZXMgaGVyZSAqLwotCi0jaWZuZGVmIFlZUFVSRQotCi1pbnQJeXljaGFyOwkJCS8qICB0aGUgbG9va2FoZWFkIHN5bWJvbAkJKi8KLVlZU1RZUEUJeXlsdmFsOwkJCS8qICB0aGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlCQkqLwotCQkJCS8qICBsb29rYWhlYWQgc3ltYm9sCQkJKi8KLQotI2lmZGVmIFlZTFNQX05FRURFRAotWVlMVFlQRSB5eWxsb2M7CQkJLyogIGxvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rYWhlYWQJKi8KLQkJCQkvKiAgc3ltYm9sCQkJCSovCi0jZW5kaWYKLQotaW50IHl5bmVycnM7CQkJLyogIG51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyICAgICAgICovCi0jZW5kaWYgIC8qIG5vdCBZWVBVUkUgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotaW50IHl5ZGVidWc7CQkJLyogIG5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UJKi8KLS8qIFNpbmNlIHRoaXMgaXMgdW5pbml0aWFsaXplZCwgaXQgZG9lcyBub3Qgc3RvcCBtdWx0aXBsZSBwYXJzZXJzCi0gICBmcm9tIGNvZXhpc3RpbmcuICAqLwotI2VuZGlmCi0KLS8qICBZWUlOSVRERVBUSCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzCSovCi0KLSNpZm5kZWYJWVlJTklUREVQVEgKLSNkZWZpbmUgWVlJTklUREVQVEggMjAwCi0jZW5kaWYKLQotLyogIFlZTUFYREVQVEggaXMgdGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvCi0gICAgKGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLiAgKi8KLQotI2lmIFlZTUFYREVQVEggPT0gMAotI3VuZGVmIFlZTUFYREVQVEgKLSNlbmRpZgotCi0jaWZuZGVmIFlZTUFYREVQVEgKLSNkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAotI2VuZGlmCi0KLS8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotaW50IHl5cGFyc2UgKHZvaWQpOwotI2VuZGlmCi0MCi0jaWYgX19HTlVDX18gPiAxCQkvKiBHTlUgQyBhbmQgR05VIEMrKyBkZWZpbmUgdGhpcy4gICovCi0jZGVmaW5lIF9feXlfbWVtY3B5KFRPLEZST00sQ09VTlQpCV9fYnVpbHRpbl9tZW1jcHkoVE8sRlJPTSxDT1VOVCkKLSNlbHNlCQkJCS8qIG5vdCBHTlUgQyBvciBDKysgKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLQotLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKLSAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1fX3l5X21lbWNweSAodG8sIGZyb20sIGNvdW50KQotICAgICBjaGFyICp0bzsKLSAgICAgY2hhciAqZnJvbTsKLSAgICAgaW50IGNvdW50OwotewotICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKLSAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOwotICByZWdpc3RlciBpbnQgaSA9IGNvdW50OwotCi0gIHdoaWxlIChpLS0gPiAwKQotICAgICp0KysgPSAqZisrOwotfQotCi0jZWxzZSAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcwotICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLwotc3RhdGljIHZvaWQKLV9feXlfbWVtY3B5IChjaGFyICp0bywgY2hhciAqZnJvbSwgaW50IGNvdW50KQotewotICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKLSAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOwotICByZWdpc3RlciBpbnQgaSA9IGNvdW50OwotCi0gIHdoaWxlIChpLS0gPiAwKQotICAgICp0KysgPSAqZisrOwotfQotCi0jZW5kaWYKLSNlbmRpZgotDAotI2xpbmUgMTk2ICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotCi0vKiBUaGUgdXNlciBjYW4gZGVmaW5lIFlZUEFSU0VfUEFSQU0gYXMgdGhlIG5hbWUgb2YgYW4gYXJndW1lbnQgdG8gYmUgcGFzc2VkCi0gICBpbnRvIHl5cGFyc2UuICBUaGUgYXJndW1lbnQgc2hvdWxkIGhhdmUgdHlwZSB2b2lkICouCi0gICBJdCBzaG91bGQgYWN0dWFsbHkgcG9pbnQgdG8gYW4gb2JqZWN0LgotICAgR3JhbW1hciBhY3Rpb25zIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlIGJ5IGNhc3RpbmcgaXQKLSAgIHRvIHRoZSBwcm9wZXIgcG9pbnRlciB0eXBlLiAgKi8KLQotI2lmZGVmIFlZUEFSU0VfUEFSQU0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAotI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIFlZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMIHZvaWQgKllZUEFSU0VfUEFSQU07Ci0jZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZWxzZSAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSNlbmRpZiAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLwotCi1pbnQKLXl5cGFyc2UoWVlQQVJTRV9QQVJBTV9BUkcpCi0gICAgIFlZUEFSU0VfUEFSQU1fREVDTAotewotICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKLSAgcmVnaXN0ZXIgaW50IHl5bjsKLSAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOwotICByZWdpc3RlciBZWVNUWVBFICp5eXZzcDsKLSAgaW50IHl5ZXJyc3RhdHVzOwkvKiAgbnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZCAqLwotICBpbnQgeXljaGFyMSA9IDA7CQkvKiAgbG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIgKi8KLQotICBzaG9ydAl5eXNzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc3RhdGUgc3RhY2sJCQkqLwotICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjawkJKi8KLQotICBzaG9ydCAqeXlzcyA9IHl5c3NhOwkJLyogIHJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycyAqLwotICBZWVNUWVBFICp5eXZzID0geXl2c2E7CS8qICB0byBhbGxvdyB5eW92ZXJmbG93IHRvIHhyZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlICovCi0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgbG9jYXRpb24gc3RhY2sJCQkqLwotICBZWUxUWVBFICp5eWxzID0geXlsc2E7Ci0gIFlZTFRZUEUgKnl5bHNwOwotCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSwgeXlsc3AtLSkKLSNlbHNlCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSkKLSNlbmRpZgotCi0gIGludCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOwotCi0jaWZkZWYgWVlQVVJFCi0gIGludCB5eWNoYXI7Ci0gIFlZU1RZUEUgeXlsdmFsOwotICBpbnQgeXluZXJyczsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxsb2M7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIFlZU1RZUEUgeXl2YWw7CQkvKiAgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmV0dXJuCQkqLwotCQkJCS8qICBzZW1hbnRpYyB2YWx1ZXMgZnJvbSB0aGUgYWN0aW9uCSovCi0JCQkJLyogIHJvdXRpbmVzCQkJCSovCi0KLSAgaW50IHl5bGVuOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpOwotI2VuZGlmCi0KLSAgeXlzdGF0ZSA9IDA7Ci0gIHl5ZXJyc3RhdHVzID0gMDsKLSAgeXluZXJycyA9IDA7Ci0gIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwotCi0gIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCi0gICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawotICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCi0gICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLQotICB5eXNzcCA9IHl5c3MgLSAxOwotICB5eXZzcCA9IHl5dnM7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwID0geXlsczsKLSNlbmRpZgotCi0vKiBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiAgeXlzdGF0ZSAgLiAgKi8KLS8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCi0gICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuICAqLwoteXluZXdzdGF0ZToKLQotICAqKyt5eXNzcCA9IHl5c3RhdGU7Ci0KLSAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0gICAgewotICAgICAgLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHhyZWFsbG9jYXRlIHRoZSBzdGFjayAqLwotICAgICAgLyogVXNlIGNvcGllcyBvZiB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvIG1lbW9yeS4gKi8KLSAgICAgIFlZU1RZUEUgKnl5dnMxID0geXl2czsKLSAgICAgIHNob3J0ICp5eXNzMSA9IHl5c3M7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICBZWUxUWVBFICp5eWxzMSA9IHl5bHM7Ci0jZW5kaWYKLQotICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCi0gICAgICBpbnQgc2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7Ci0KLSNpZmRlZiB5eW92ZXJmbG93Ci0gICAgICAvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZgotCSB0aGUgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICAqLwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLAotCSBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KLSAgICAgIHl5b3ZlcmZsb3coInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCi0JCSAmeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAmeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAmeXlsczEsIHNpemUgKiBzaXplb2YgKCp5eWxzcCksCi0JCSAmeXlzdGFja3NpemUpOwotI2Vsc2UKLSAgICAgIHl5b3ZlcmZsb3coInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCi0JCSAmeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAmeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAmeXlzdGFja3NpemUpOwotI2VuZGlmCi0KLSAgICAgIHl5c3MgPSB5eXNzMTsgeXl2cyA9IHl5dnMxOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlscyA9IHl5bHMxOwotI2VuZGlmCi0jZWxzZSAvKiBubyB5eW92ZXJmbG93ICovCi0gICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+PSBZWU1BWERFUFRIKQotCXsKLQkgIHl5ZXJyb3IoInBhcnNlciBzdGFjayBvdmVyZmxvdyIpOwotCSAgcmV0dXJuIDI7Ci0JfQotICAgICAgeXlzdGFja3NpemUgKj0gMjsKLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+IFlZTUFYREVQVEgpCi0JeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOwotICAgICAgeXlzcyA9IChzaG9ydCAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXlzc3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5c3MsIChjaGFyICopeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCkpOwotICAgICAgeXl2cyA9IChZWVNUWVBFICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eXZzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXl2cywgKGNoYXIgKil5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzID0gKFlZTFRZUEUgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eWxzLCAoY2hhciAqKXl5bHMxLCBzaXplICogc2l6ZW9mICgqeXlsc3ApKTsKLSNlbmRpZgotI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLQotICAgICAgeXlzc3AgPSB5eXNzICsgc2l6ZSAtIDE7Ci0gICAgICB5eXZzcCA9IHl5dnMgKyBzaXplIC0gMTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHNwID0geXlscyArIHNpemUgLSAxOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWRcbiIsIHl5c3RhY2tzaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKLQlZWUFCT1JUOwotICAgIH0KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKTsKLSNlbmRpZgotCi0gIGdvdG8geXliYWNrdXA7Ci0geXliYWNrdXA6Ci0KLS8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLwotLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0vKiB5eXJlc3VtZTogKi8KLQotICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KLQotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlGTEFHKQotICAgIGdvdG8geXlkZWZhdWx0OwotCi0gIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0KLSAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCi0gICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCi0KLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQotICAgIHsKLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKTsKLSNlbmRpZgotICAgICAgeXljaGFyID0gWVlMRVg7Ci0gICAgfQotCi0gIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCi0KLSAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCi0gICAgewotICAgICAgeXljaGFyMSA9IDA7Ci0gICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUoeXljaGFyKTsKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UgbWVhbmluZwotCSAgICAgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLwotI2lmZGVmIFlZUFJJTlQKLQkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOwotI2VuZGlmCi0JICBmcHJpbnRmIChzdGRlcnIsICIpXG4iKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgeXluICs9IHl5Y2hhcjE7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0KLSAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgotICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCi0gICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgotICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCi0gICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KLSAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLwotCi0gIGlmICh5eW4gPCAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQotCWdvdG8geXllcnJsYWI7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0KLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCi0gIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLSNlbmRpZgotCi0gIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCi0gIGlmICh5eWNoYXIgIT0gWVlFT0YpCi0gICAgeXljaGFyID0gWVlFTVBUWTsKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgKisreXlsc3AgPSB5eWxsb2M7Ci0jZW5kaWYKLQotICAvKiBjb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yIHN0YXR1cy4gICovCi0gIGlmICh5eWVycnN0YXR1cykgeXllcnJzdGF0dXMtLTsKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLS8qIERvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICAqLwoteXlkZWZhdWx0OgotCi0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycmxhYjsKLQotLyogRG8gYSByZWR1Y3Rpb24uICB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLwoteXlyZWR1Y2U6Ci0gIHl5bGVuID0geXlyMlt5eW5dOwotICBpZiAoeXlsZW4gPiAwKQotICAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07IC8qIGltcGxlbWVudCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb24gKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAotCSAgICAgICB5eW4sIHl5cmxpbmVbeXluXSk7Ci0KLSAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLwotICAgICAgZm9yIChpID0geXlwcmhzW3l5bl07IHl5cmhzW2ldID4gMDsgaSsrKQotCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbaV1dKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKLSAgICB9Ci0jZW5kaWYKLQotCi0gIHN3aXRjaCAoeXluKSB7Ci0KLWNhc2UgMzoKLSNsaW5lIDIyNiAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSh5eXZzcFswXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ6Ci0jbGluZSAyMzIgImYtZXhwLnkiCi17IDsKLSAgICBicmVhazt9Ci1jYXNlIDU6Ci0jbGluZSAyMzcgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0lORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY6Ci0jbGluZSAyNDAgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0FERFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3OgotI2xpbmUgMjQzICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9ORUcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4OgotI2xpbmUgMjQ3ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9MT0dJQ0FMX05PVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk6Ci0jbGluZSAyNTEgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NPTVBMRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDoKLSNsaW5lIDI1NSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfU0laRU9GKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE6Ci0jbGluZSAyNjQgImYtZXhwLnkiCi17IHN0YXJ0X2FyZ2xpc3QgKCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyOgotI2xpbmUgMjY2ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRjc3X1VOREVURVJNSU5FRF9BUkdMSVNUKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgZW5kX2FyZ2xpc3QgKCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRjc3X1VOREVURVJNSU5FRF9BUkdMSVNUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTQ6Ci0jbGluZSAyNzUgImYtZXhwLnkiCi17IGFyZ2xpc3RfbGVuID0gMTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTU6Ci0jbGluZSAyNzkgImYtZXhwLnkiCi17IGFyZ2xpc3RfbGVuID0gMjs7Ci0gICAgYnJlYWs7fQotY2FzZSAxNjoKLSNsaW5lIDI4MiAiZi1leHAueSIKLXsgYXJnbGlzdF9sZW4rKzsgOwotICAgIGJyZWFrO30KLWNhc2UgMTc6Ci0jbGluZSAyODYgImYtZXhwLnkiCi17IDsKLSAgICBicmVhazt9Ci1jYXNlIDE4OgotI2xpbmUgMjkxICJmLWV4cC55IgoteyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxOToKLSNsaW5lIDI5NSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfQ09NUExFWCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIwOgotI2xpbmUgMjk5ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFstMl0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMToKLSNsaW5lIDMwNyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFUEVBVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIyOgotI2xpbmUgMzExICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTVVMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjM6Ci0jbGluZSAzMTUgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9ESVYpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNDoKLSNsaW5lIDMxOSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFTSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI1OgotI2xpbmUgMzIzICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQUREKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjY6Ci0jbGluZSAzMjcgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNzoKLSNsaW5lIDMzMSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xTSCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI4OgotI2xpbmUgMzM1ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUlNIKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjk6Ci0jbGluZSAzMzkgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9FUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMwOgotI2xpbmUgMzQzICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTk9URVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMToKLSNsaW5lIDM0NyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFUSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMyOgotI2xpbmUgMzUxICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR0VRKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzM6Ci0jbGluZSAzNTUgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVNTKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzQ6Ci0jbGluZSAzNTkgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HVFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNToKLSNsaW5lIDM2MyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfQU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzY6Ci0jbGluZSAzNjcgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX1hPUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM3OgotI2xpbmUgMzcxICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9JT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzODoKLSNsaW5lIDM3NSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfQU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzk6Ci0jbGluZSAzODAgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MT0dJQ0FMX09SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDA6Ci0jbGluZSAzODQgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR04pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MToKLSNsaW5lIDM4OCAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTl9NT0RJRlkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoeXl2c3BbLTFdLm9wY29kZSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR05fTU9ESUZZKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDI6Ci0jbGluZSAzOTQgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFswXS50eXBlZF92YWwudHlwZSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpKHl5dnNwWzBdLnR5cGVkX3ZhbC52YWwpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MzoKLSNsaW5lIDQwMSAiZi1leHAueSIKLXsgWVlTVFlQRSB2YWw7Ci0JCQkgIHBhcnNlX251bWJlciAoeXl2c3BbMF0uc3N5bS5zdG9rZW4ucHRyLCB5eXZzcFswXS5zc3ltLnN0b2tlbi5sZW5ndGgsIDAsICZ2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodmFsLnR5cGVkX3ZhbC50eXBlKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCl2YWwudHlwZWRfdmFsLnZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDQ6Ci0jbGluZSA0MTAgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9mX3JlYWxfczgpOwotCQkJICB3cml0ZV9leHBfZWx0X2RibGNzdCAoeXl2c3BbMF0uZHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NzoKLSNsaW5lIDQyMyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9mX2ludGVnZXIpOwotCQkJICBDSEVDS19UWVBFREVGICh5eXZzcFstMV0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIFRZUEVfTEVOR1RIICh5eXZzcFstMV0udHZhbCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ4OgotI2xpbmUgNDMxICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQk9PTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIHl5dnNwWzBdLmx2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQk9PTCk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA0OToKLSNsaW5lIDQzOCAiZi1leHAueSIKLXsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NUUklORyk7Ci0JCQkgIHdyaXRlX2V4cF9zdHJpbmcgKHl5dnNwWzBdLnN2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU1RSSU5HKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDUwOgotI2xpbmUgNDQ2ICJmLWV4cC55IgoteyBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSB5eXZzcFswXS5zc3ltLnN5bTsKLQotCQkJICBpZiAoc3ltKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSAoc3ltKSkKLQkJCQl7Ci0JCQkJICBpZiAoaW5uZXJtb3N0X2Jsb2NrID09IDAgfHwKLQkJCQkgICAgICBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCAKLQkJCQkJCSAgICBpbm5lcm1vc3RfYmxvY2spKQotCQkJCSAgICBpbm5lcm1vc3RfYmxvY2sgPSBibG9ja19mb3VuZDsKLQkJCQl9Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgICAgIC8qIFdlIHdhbnQgdG8gdXNlIHRoZSBzZWxlY3RlZCBmcmFtZSwgbm90Ci0JCQkJIGFub3RoZXIgbW9yZSBpbm5lciBmcmFtZSB3aGljaCBoYXBwZW5zIHRvCi0JCQkJIGJlIGluIHRoZSBzYW1lIGJsb2NrLiAgKi8KLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKE5VTEwpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9zeW0gKHN5bSk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKLQkJCSAgICAgIHJlZ2lzdGVyIGNoYXIgKmFyZyA9IGNvcHlfbmFtZSAoeXl2c3BbMF0uc3N5bS5zdG9rZW4pOwotCi0JCQkgICAgICBtc3ltYm9sID0KLQkJCQlsb29rdXBfbWluaW1hbF9zeW1ib2wgKGFyZywgTlVMTCwgTlVMTCk7Ci0JCQkgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQotCQkJCXsKLQkJCQkgIHdyaXRlX2V4cF9tc3ltYm9sIChtc3ltYm9sLAotCQkJCQkJICAgICBsb29rdXBfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlX2ludCksCi0JCQkJCQkgICAgIGJ1aWx0aW5fdHlwZV9pbnQpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UgaWYgKCFoYXZlX2Z1bGxfc3ltYm9scyAoKSAmJiAhaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCi0JCQkJZXJyb3IgKCJObyBzeW1ib2wgdGFibGUgaXMgbG9hZGVkLiAgVXNlIHRoZSBcImZpbGVcIiBjb21tYW5kLiIpOwotCQkJICAgICAgZWxzZQotCQkJCWVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBjdXJyZW50IGNvbnRleHQuIiwKLQkJCQkgICAgICAgY29weV9uYW1lICh5eXZzcFswXS5zc3ltLnN0b2tlbikpOwotCQkJICAgIH0KLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDUzOgotI2xpbmUgNDk0ICJmLWV4cC55IgotewotCQkgIC8qIFRoaXMgaXMgd2hlcmUgdGhlIGludGVyZXN0aW5nIHN0dWZmIGhhcHBlbnMuICAqLwotCQkgIGludCBkb25lID0gMDsKLQkJICBpbnQgYXJyYXlfc2l6ZTsKLQkJICBzdHJ1Y3QgdHlwZSAqZm9sbG93X3R5cGUgPSB5eXZzcFstMV0udHZhbDsKLQkJICBzdHJ1Y3QgdHlwZSAqcmFuZ2VfdHlwZTsKLQkJICAKLQkJICB3aGlsZSAoIWRvbmUpCi0JCSAgICBzd2l0Y2ggKHBvcF90eXBlICgpKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgdHBfZW5kOgotCQkJZG9uZSA9IDE7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSB0cF9wb2ludGVyOgotCQkJZm9sbG93X3R5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlIChmb2xsb3dfdHlwZSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSB0cF9yZWZlcmVuY2U6Ci0JCQlmb2xsb3dfdHlwZSA9IGxvb2t1cF9yZWZlcmVuY2VfdHlwZSAoZm9sbG93X3R5cGUpOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgdHBfYXJyYXk6Ci0JCQlhcnJheV9zaXplID0gcG9wX3R5cGVfaW50ICgpOwotCQkJaWYgKGFycmF5X3NpemUgIT0gLTEpCi0JCQkgIHsKLQkJCSAgICByYW5nZV90eXBlID0KLQkJCSAgICAgIGNyZWF0ZV9yYW5nZV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwKLQkJCQkJCSBidWlsdGluX3R5cGVfZl9pbnRlZ2VyLCAwLAotCQkJCQkJIGFycmF5X3NpemUgLSAxKTsKLQkJCSAgICBmb2xsb3dfdHlwZSA9Ci0JCQkgICAgICBjcmVhdGVfYXJyYXlfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsCi0JCQkJCQkgZm9sbG93X3R5cGUsIHJhbmdlX3R5cGUpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIGZvbGxvd190eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoZm9sbG93X3R5cGUpOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgdHBfZnVuY3Rpb246Ci0JCQlmb2xsb3dfdHlwZSA9IGxvb2t1cF9mdW5jdGlvbl90eXBlIChmb2xsb3dfdHlwZSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIHl5dmFsLnR2YWwgPSBmb2xsb3dfdHlwZTsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgNTQ6Ci0jbGluZSA1MzcgImYtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfcG9pbnRlcik7IHl5dmFsLnZvaWR2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NToKLSNsaW5lIDUzOSAiZi1leHAueSIKLXsgcHVzaF90eXBlICh0cF9wb2ludGVyKTsgeXl2YWwudm9pZHZhbCA9IHl5dnNwWzBdLnZvaWR2YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU2OgotI2xpbmUgNTQxICJmLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX3JlZmVyZW5jZSk7IHl5dmFsLnZvaWR2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NzoKLSNsaW5lIDU0MyAiZi1leHAueSIKLXsgcHVzaF90eXBlICh0cF9yZWZlcmVuY2UpOyB5eXZhbC52b2lkdmFsID0geXl2c3BbMF0udm9pZHZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgNTk6Ci0jbGluZSA1NDggImYtZXhwLnkiCi17IHl5dmFsLnZvaWR2YWwgPSB5eXZzcFstMV0udm9pZHZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgNjA6Ci0jbGluZSA1NTAgImYtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfZnVuY3Rpb24pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MToKLSNsaW5lIDU1MiAiZi1leHAueSIKLXsgcHVzaF90eXBlICh0cF9mdW5jdGlvbik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYyOgotI2xpbmUgNTU2ICJmLWV4cC55IgoteyB5eXZhbC52b2lkdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgNjM6Ci0jbGluZSA1NTggImYtZXhwLnkiCi17IGZyZWUgKChQVFIpeXl2c3BbLTFdLnR2ZWMpOyB5eXZhbC52b2lkdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgNjQ6Ci0jbGluZSA1NjMgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSB5eXZzcFswXS50c3ltLnR5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY1OgotI2xpbmUgNTY1ICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfaW50ZWdlcjsgOwotICAgIGJyZWFrO30KLWNhc2UgNjY6Ci0jbGluZSA1NjcgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9pbnRlZ2VyX3MyOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NzoKLSNsaW5lIDU2OSAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2NoYXJhY3RlcjsgOwotICAgIGJyZWFrO30KLWNhc2UgNjg6Ci0jbGluZSA1NzEgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9sb2dpY2FsOzsKLSAgICBicmVhazt9Ci1jYXNlIDY5OgotI2xpbmUgNTczICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfbG9naWNhbF9zMjs7Ci0gICAgYnJlYWs7fQotY2FzZSA3MDoKLSNsaW5lIDU3NSAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2xvZ2ljYWxfczE7OwotICAgIGJyZWFrO30KLWNhc2UgNzE6Ci0jbGluZSA1NzcgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9yZWFsOzsKLSAgICBicmVhazt9Ci1jYXNlIDcyOgotI2xpbmUgNTc5ICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfcmVhbF9zODs7Ci0gICAgYnJlYWs7fQotY2FzZSA3MzoKLSNsaW5lIDU4MSAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX3JlYWxfczE2OzsKLSAgICBicmVhazt9Ci1jYXNlIDc0OgotI2xpbmUgNTgzICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfY29tcGxleF9zODs7Ci0gICAgYnJlYWs7fQotY2FzZSA3NToKLSNsaW5lIDU4NSAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2NvbXBsZXhfczE2OzsKLSAgICBicmVhazt9Ci1jYXNlIDc2OgotI2xpbmUgNTg3ICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfY29tcGxleF9zMzI7OwotICAgIGJyZWFrO30KLWNhc2UgNzg6Ci0jbGluZSA1OTUgImYtZXhwLnkiCi17IHl5dmFsLnR2ZWMgPSAoc3RydWN0IHR5cGUgKiopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHR5cGUgKikgKiAyKTsKLQkJICB5eXZhbC5pdmVjWzBdID0gMTsJLyogTnVtYmVyIG9mIHR5cGVzIGluIHZlY3RvciAqLwotCQkgIHl5dmFsLnR2ZWNbMV0gPSB5eXZzcFswXS50dmFsOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA3OToKLSNsaW5lIDYwMCAiZi1leHAueSIKLXsgaW50IGxlbiA9IHNpemVvZiAoc3RydWN0IHR5cGUgKikgKiAoKysoeXl2c3BbLTJdLml2ZWNbMF0pICsgMSk7Ci0JCSAgeXl2YWwudHZlYyA9IChzdHJ1Y3QgdHlwZSAqKikgeHJlYWxsb2MgKChjaGFyICopIHl5dnNwWy0yXS50dmVjLCBsZW4pOwotCQkgIHl5dmFsLnR2ZWNbeXl2YWwuaXZlY1swXV0gPSB5eXZzcFswXS50dmFsOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA4MDoKLSNsaW5lIDYwNyAiZi1leHAueSIKLXsgeXl2YWwuc3ZhbCA9IHl5dnNwWzBdLnNzeW0uc3Rva2VuOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MToKLSNsaW5lIDYwOSAiZi1leHAueSIKLXsgeXl2YWwuc3ZhbCA9IHl5dnNwWzBdLnRzeW0uc3Rva2VuOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MjoKLSNsaW5lIDYxMSAiZi1leHAueSIKLXsgeXl2YWwuc3ZhbCA9IHl5dnNwWzBdLnNzeW0uc3Rva2VuOyA7Ci0gICAgYnJlYWs7fQotfQotICAgLyogdGhlIGFjdGlvbiBmaWxlIGdldHMgY29waWVkIGluIGluIHBsYWNlIG9mIHRoaXMgZG9sbGFyc2lnbiAqLwotI2xpbmUgNDk4ICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotDAotICB5eXZzcCAtPSB5eWxlbjsKLSAgeXlzc3AgLT0geXlsZW47Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwIC09IHl5bGVuOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnNzcDEgPSB5eXNzIC0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInN0YXRlIHN0YWNrIG5vdyIpOwotICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCi0JZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi0gICorK3l5dnNwID0geXl2YWw7Ci0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3ArKzsKLSAgaWYgKHl5bGVuID09IDApCi0gICAgewotICAgICAgeXlsc3AtPmZpcnN0X2xpbmUgPSB5eWxsb2MuZmlyc3RfbGluZTsKLSAgICAgIHl5bHNwLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MuZmlyc3RfY29sdW1uOwotICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcC0xKS0+bGFzdF9saW5lOwotICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwLTEpLT5sYXN0X2NvbHVtbjsKLSAgICAgIHl5bHNwLT50ZXh0ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2xpbmU7Ci0gICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfY29sdW1uOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIE5vdyAic2hpZnQiIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4KLSAgICAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUgdGhhdCBnb2VzIHRvLAotICAgICBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8KLSAgICAgYW5kIHRoZSBydWxlIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KLQotICB5eW4gPSB5eXIxW3l5bl07Ci0KLSAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVEJBU0VdICsgKnl5c3NwOwotICBpZiAoeXlzdGF0ZSA+PSAwICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQotICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOwotICBlbHNlCi0gICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UQkFTRV07Ci0KLSAgZ290byB5eW5ld3N0YXRlOwotCi15eWVycmxhYjogICAvKiBoZXJlIG9uIGRldGVjdGluZyBlcnJvciAqLwotCi0gIGlmICghIHl5ZXJyc3RhdHVzKQotICAgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLwotICAgIHsKLSAgICAgICsreXluZXJyczsKLQotI2lmZGVmIFlZRVJST1JfVkVSQk9TRQotICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotCi0gICAgICBpZiAoeXluID4gWVlGTEFHICYmIHl5biA8IFlZTEFTVCkKLQl7Ci0JICBpbnQgc2l6ZSA9IDA7Ci0JICBjaGFyICptc2c7Ci0JICBpbnQgeCwgY291bnQ7Ci0KLQkgIGNvdW50ID0gMDsKLQkgIC8qIFN0YXJ0IFggYXQgLXl5biBpZiBuZWMgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbiB5eWNoZWNrLiAgKi8KLQkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOwotCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQotCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQotCSAgICAgIHNpemUgKz0gc3RybGVuKHl5dG5hbWVbeF0pICsgMTUsIGNvdW50Kys7Ci0JICBtc2cgPSAoY2hhciAqKSB4bWFsbG9jKHNpemUgKyAxNSk7Ci0JICBpZiAobXNnICE9IDApCi0JICAgIHsKLQkgICAgICBzdHJjcHkobXNnLCAicGFyc2UgZXJyb3IiKTsKLQotCSAgICAgIGlmIChjb3VudCA8IDUpCi0JCXsKLQkJICBjb3VudCA9IDA7Ci0JCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7Ci0JCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQotCQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKLQkJICAgICAgewotCQkJc3RyY2F0KG1zZywgY291bnQgPT0gMCA/ICIsIGV4cGVjdGluZyBgIiA6ICIgb3IgYCIpOwotCQkJc3RyY2F0KG1zZywgeXl0bmFtZVt4XSk7Ci0JCQlzdHJjYXQobXNnLCAiJyIpOwotCQkJY291bnQrKzsKLQkJICAgICAgfQotCQl9Ci0JICAgICAgeXllcnJvcihtc2cpOwotCSAgICAgIGZyZWUobXNnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhjZWVkZWQiKTsKLQl9Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCi0JeXllcnJvcigicGFyc2UgZXJyb3IiKTsKLSAgICB9Ci0KLSAgZ290byB5eWVycmxhYjE7Ci15eWVycmxhYjE6ICAgLyogaGVyZSBvbiBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24gKi8KLQotICBpZiAoeXllcnJzdGF0dXMgPT0gMykKLSAgICB7Ci0gICAgICAvKiBpZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KLQotICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCi0gICAgICBpZiAoeXljaGFyID09IFlZRU9GKQotCVlZQUJPUlQ7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLSNlbmRpZgotCi0gICAgICB5eWNoYXIgPSBZWUVNUFRZOwotICAgIH0KLQotICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbgotICAgICBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IgdG9rZW4uICAqLwotCi0gIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLwotCi0gIGdvdG8geXllcnJoYW5kbGU7Ci0KLXl5ZXJyZGVmYXVsdDogIC8qIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIGVycm9yIHRva2VuLiAqLwotCi0jaWYgMAotICAvKiBUaGlzIGlzIHdyb25nOyBvbmx5IHN0YXRlcyB0aGF0IGV4cGxpY2l0bHkgd2FudCBlcnJvciB0b2tlbnMKLSAgICAgc2hvdWxkIHNoaWZ0IHRoZW0uICAqLwotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsgIC8qIElmIGl0cyBkZWZhdWx0IGlzIHRvIGFjY2VwdCBhbnkgdG9rZW4sIG9rLiAgT3RoZXJ3aXNlIHBvcCBpdC4qLwotICBpZiAoeXluKSBnb3RvIHl5ZGVmYXVsdDsKLSNlbmRpZgotCi15eWVycnBvcDogICAvKiBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbiAqLwotCi0gIGlmICh5eXNzcCA9PSB5eXNzKSBZWUFCT1JUOwotICB5eXZzcC0tOwotICB5eXN0YXRlID0gKi0teXlzc3A7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwLS07Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6IHN0YXRlIHN0YWNrIG5vdyIpOwotICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCi0JZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi15eWVycmhhbmRsZToKLQotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlGTEFHKQotICAgIGdvdG8geXllcnJkZWZhdWx0OwotCi0gIHl5biArPSBZWVRFUlJPUjsKLSAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSBZWVRFUlJPUikKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0gIGlmICh5eW4gPCAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQotCWdvdG8geXllcnJwb3A7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJwb3A7Ci0KLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpOwotI2VuZGlmCi0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgZ290byB5eW5ld3N0YXRlOwotfQotI2xpbmUgNjI0ICJmLWV4cC55IgotCi0KLS8qIFRha2UgY2FyZSBvZiBwYXJzaW5nIGEgbnVtYmVyIChhbnl0aGluZyB0aGF0IHN0YXJ0cyB3aXRoIGEgZGlnaXQpLgotICAgU2V0IHl5bHZhbCBhbmQgcmV0dXJuIHRoZSB0b2tlbiB0eXBlOyB1cGRhdGUgbGV4cHRyLgotICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBpdC4gICovCi0KLS8qKiogTmVlZHMgc29tZSBlcnJvciBjaGVja2luZyBmb3IgdGhlIGZsb2F0IGNhc2UgKioqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9udW1iZXIgKHAsIGxlbiwgcGFyc2VkX2Zsb2F0LCBwdXRpdGhlcmUpCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gICAgIHJlZ2lzdGVyIGludCBsZW47Ci0gICAgIGludCBwYXJzZWRfZmxvYXQ7Ci0gICAgIFlZU1RZUEUgKnB1dGl0aGVyZTsKLXsKLSAgcmVnaXN0ZXIgTE9OR0VTVCBuID0gMDsKLSAgcmVnaXN0ZXIgTE9OR0VTVCBwcmV2biA9IDA7Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciBpbnQgYzsKLSAgcmVnaXN0ZXIgaW50IGJhc2UgPSBpbnB1dF9yYWRpeDsKLSAgaW50IHVuc2lnbmVkX3AgPSAwOwotICBpbnQgbG9uZ19wID0gMDsKLSAgVUxPTkdFU1QgaGlnaF9iaXQ7Ci0gIHN0cnVjdCB0eXBlICpzaWduZWRfdHlwZTsKLSAgc3RydWN0IHR5cGUgKnVuc2lnbmVkX3R5cGU7Ci0KLSAgaWYgKHBhcnNlZF9mbG9hdCkKLSAgICB7Ci0gICAgICAvKiBJdCdzIGEgZmxvYXQgc2luY2UgaXQgY29udGFpbnMgYSBwb2ludCBvciBhbiBleHBvbmVudC4gICovCi0gICAgICAvKiBbZERdIGlzIG5vdCB1bmRlcnN0b29kIGFzIGFuIGV4cG9uZW50IGJ5IGF0b2YsIGNoYW5nZSBpdCB0byAnZScuICAqLwotICAgICAgY2hhciAqdG1wLCAqdG1wMjsKLQotICAgICAgdG1wID0gc3Ryc2F2ZSAocCk7Ci0gICAgICBmb3IgKHRtcDIgPSB0bXA7ICp0bXAyOyArK3RtcDIpCi0JaWYgKCp0bXAyID09ICdkJyB8fCAqdG1wMiA9PSAnRCcpCi0JICAqdG1wMiA9ICdlJzsKLSAgICAgIHB1dGl0aGVyZS0+ZHZhbCA9IGF0b2YgKHRtcCk7Ci0gICAgICBmcmVlICh0bXApOwotICAgICAgcmV0dXJuIEZMT0FUOwotICAgIH0KLQotICAvKiBIYW5kbGUgYmFzZS1zd2l0Y2hpbmcgcHJlZml4ZXMgMHgsIDB0LCAwZCwgMCAqLwotICBpZiAocFswXSA9PSAnMCcpCi0gICAgc3dpdGNoIChwWzFdKQotICAgICAgewotICAgICAgY2FzZSAneCc6Ci0gICAgICBjYXNlICdYJzoKLQlpZiAobGVuID49IDMpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgYmFzZSA9IDE2OwotCSAgICBsZW4gLT0gMjsKLQkgIH0KLQlicmVhazsKLQkKLSAgICAgIGNhc2UgJ3QnOgotICAgICAgY2FzZSAnVCc6Ci0gICAgICBjYXNlICdkJzoKLSAgICAgIGNhc2UgJ0QnOgotCWlmIChsZW4gPj0gMykKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBiYXNlID0gMTA7Ci0JICAgIGxlbiAtPSAyOwotCSAgfQotCWJyZWFrOwotCQotICAgICAgZGVmYXVsdDoKLQliYXNlID0gODsKLQlicmVhazsKLSAgICAgIH0KLSAgCi0gIHdoaWxlIChsZW4tLSA+IDApCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpCi0JYyArPSAnYScgLSAnQSc7Ci0gICAgICBpZiAoYyAhPSAnbCcgJiYgYyAhPSAndScpCi0JbiAqPSBiYXNlOwotICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCW4gKz0gaSA9IGMgLSAnMCc7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJhc2UgPiAxMCAmJiBjID49ICdhJyAmJiBjIDw9ICdmJykKLQkgICAgbiArPSBpID0gYyAtICdhJyArIDEwOwotCSAgZWxzZSBpZiAobGVuID09IDAgJiYgYyA9PSAnbCcpIAotICAgICAgICAgICAgbG9uZ19wID0gMTsKLQkgIGVsc2UgaWYgKGxlbiA9PSAwICYmIGMgPT0gJ3UnKQotCSAgICB1bnNpZ25lZF9wID0gMTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIEVSUk9SOwkvKiBDaGFyIG5vdCBhIGRpZ2l0ICovCi0JfQotICAgICAgaWYgKGkgPj0gYmFzZSkKLQlyZXR1cm4gRVJST1I7CQkvKiBJbnZhbGlkIGRpZ2l0IGluIHRoaXMgYmFzZSAqLwotICAgICAgCi0gICAgICAvKiBQb3J0YWJseSB0ZXN0IGZvciBvdmVyZmxvdyAob25seSB3b3JrcyBmb3Igbm9uemVybyB2YWx1ZXMsIHNvIG1ha2UKLQkgYSBzZWNvbmQgY2hlY2sgZm9yIHplcm8pLiAgKi8KLSAgICAgIGlmICgocHJldm4gPj0gbikgJiYgbiAhPSAwKQotCXVuc2lnbmVkX3A9MTsJCS8qIFRyeSBzb21ldGhpbmcgdW5zaWduZWQgKi8KLSAgICAgIC8qIElmIHJhbmdlIGNoZWNraW5nIGVuYWJsZWQsIHBvcnRhYmx5IHRlc3QgZm9yIHVuc2lnbmVkIG92ZXJmbG93LiAgKi8KLSAgICAgIGlmIChSQU5HRV9DSEVDSyAmJiBuICE9IDApCi0JewotCSAgaWYgKCh1bnNpZ25lZF9wICYmICh1bnNpZ25lZClwcmV2biA+PSAodW5zaWduZWQpbikpCi0JICAgIHJhbmdlX2Vycm9yKCJPdmVyZmxvdyBvbiBudW1lcmljIGNvbnN0YW50LiIpOwkgCi0JfQotICAgICAgcHJldm4gPSBuOwotICAgIH0KLSAgCi0gIC8qIElmIHRoZSBudW1iZXIgaXMgdG9vIGJpZyB0byBiZSBhbiBpbnQsIG9yIGl0J3MgZ290IGFuIGwgc3VmZml4Ci0gICAgIHRoZW4gaXQncyBhIGxvbmcuICBXb3JrIG91dCBpZiB0aGlzIGhhcyB0byBiZSBhIGxvbmcgYnkKLSAgICAgc2hpZnRpbmcgcmlnaHQgYW5kIGFuZCBzZWVpbmcgaWYgYW55dGhpbmcgcmVtYWlucywgYW5kIHRoZQotICAgICB0YXJnZXQgaW50IHNpemUgaXMgZGlmZmVyZW50IHRvIHRoZSB0YXJnZXQgbG9uZyBzaXplLgotICAgICAKLSAgICAgSW4gdGhlIGV4cHJlc3Npb24gYmVsb3csIHdlIGNvdWxkIGhhdmUgdGVzdGVkCi0gICAgIChuID4+IFRBUkdFVF9JTlRfQklUKQotICAgICB0byBzZWUgaWYgaXQgd2FzIHplcm8sCi0gICAgIGJ1dCB0b28gbWFueSBjb21waWxlcnMgd2FybiBhYm91dCB0aGF0LCB3aGVuIGludHMgYW5kIGxvbmdzCi0gICAgIGFyZSB0aGUgc2FtZSBzaXplLiAgU28gd2Ugc2hpZnQgaXQgdHdpY2UsIHdpdGggZmV3ZXIgYml0cwotICAgICBlYWNoIHRpbWUsIGZvciB0aGUgc2FtZSByZXN1bHQuICAqLwotICAKLSAgaWYgKChUQVJHRVRfSU5UX0JJVCAhPSBUQVJHRVRfTE9OR19CSVQgCi0gICAgICAgJiYgKChuID4+IDIpID4+IChUQVJHRVRfSU5UX0JJVC0yKSkpICAgLyogQXZvaWQgc2hpZnQgd2FybmluZyAqLwotICAgICAgfHwgbG9uZ19wKQotICAgIHsKLSAgICAgIGhpZ2hfYml0ID0gKChVTE9OR0VTVCkxKSA8PCAoVEFSR0VUX0xPTkdfQklULTEpOwotICAgICAgdW5zaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nOwotICAgICAgc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfbG9uZzsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgaGlnaF9iaXQgPSAoKFVMT05HRVNUKTEpIDw8IChUQVJHRVRfSU5UX0JJVC0xKTsKLSAgICAgIHVuc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfaW50OwotICAgICAgc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfaW50OwotICAgIH0gICAgCi0gIAotICBwdXRpdGhlcmUtPnR5cGVkX3ZhbC52YWwgPSBuOwotICAKLSAgLyogSWYgdGhlIGhpZ2ggYml0IG9mIHRoZSB3b3JrZWQgb3V0IHR5cGUgaXMgc2V0IHRoZW4gdGhpcyBudW1iZXIKLSAgICAgaGFzIHRvIGJlIHVuc2lnbmVkLiAqLwotICAKLSAgaWYgKHVuc2lnbmVkX3AgfHwgKG4gJiBoaWdoX2JpdCkpIAotICAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsLnR5cGUgPSB1bnNpZ25lZF90eXBlOwotICBlbHNlIAotICAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsLnR5cGUgPSBzaWduZWRfdHlwZTsKLSAgCi0gIHJldHVybiBJTlQ7Ci19Ci0KLXN0cnVjdCB0b2tlbgotewotICBjaGFyICpvcGVyYXRvcjsKLSAgaW50IHRva2VuOwotICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiBkb3Rfb3BzW10gPQotewotICB7ICIuYW5kLiIsIEJPT0xfQU5ELCBCSU5PUF9FTkQgfSwKLSAgeyAiLkFORC4iLCBCT09MX0FORCwgQklOT1BfRU5EIH0sCi0gIHsgIi5vci4iLCBCT09MX09SLCBCSU5PUF9FTkQgfSwKLSAgeyAiLk9SLiIsIEJPT0xfT1IsIEJJTk9QX0VORCB9LAotICB7ICIubm90LiIsIEJPT0xfTk9ULCBCSU5PUF9FTkQgfSwKLSAgeyAiLk5PVC4iLCBCT09MX05PVCwgQklOT1BfRU5EIH0sCi0gIHsgIi5lcS4iLCBFUVVBTCwgQklOT1BfRU5EIH0sCi0gIHsgIi5FUS4iLCBFUVVBTCwgQklOT1BfRU5EIH0sCi0gIHsgIi5lcXYuIiwgRVFVQUwsIEJJTk9QX0VORCB9LAotICB7ICIuTkVRVi4iLCBOT1RFUVVBTCwgQklOT1BfRU5EIH0sCi0gIHsgIi5uZXF2LiIsIE5PVEVRVUFMLCBCSU5PUF9FTkQgfSwKLSAgeyAiLkVRVi4iLCBFUVVBTCwgQklOT1BfRU5EIH0sCi0gIHsgIi5uZS4iLCBOT1RFUVVBTCwgQklOT1BfRU5EIH0sCi0gIHsgIi5ORS4iLCBOT1RFUVVBTCwgQklOT1BfRU5EIH0sCi0gIHsgIi5sZS4iLCBMRVEsIEJJTk9QX0VORCB9LAotICB7ICIuTEUuIiwgTEVRLCBCSU5PUF9FTkQgfSwKLSAgeyAiLmdlLiIsIEdFUSwgQklOT1BfRU5EIH0sCi0gIHsgIi5HRS4iLCBHRVEsIEJJTk9QX0VORCB9LAotICB7ICIuZ3QuIiwgR1JFQVRFUlRIQU4sIEJJTk9QX0VORCB9LAotICB7ICIuR1QuIiwgR1JFQVRFUlRIQU4sIEJJTk9QX0VORCB9LAotICB7ICIubHQuIiwgTEVTU1RIQU4sIEJJTk9QX0VORCB9LAotICB7ICIuTFQuIiwgTEVTU1RIQU4sIEJJTk9QX0VORCB9LAotICB7IE5VTEwsIDAsIDAgfQotfTsKLQotc3RydWN0IGY3N19ib29sZWFuX3ZhbCAKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IHZhbHVlOwotfTsgCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZjc3X2Jvb2xlYW5fdmFsIGJvb2xlYW5fdmFsdWVzW10gID0gCi17Ci0gIHsgIi50cnVlLiIsIDEgfSwKLSAgeyAiLlRSVUUuIiwgMSB9LAotICB7ICIuZmFsc2UuIiwgMCB9LAotICB7ICIuRkFMU0UuIiwgMCB9LAotICB7IE5VTEwsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiBmNzdfa2V5d29yZHNbXSA9IAotewotICB7ICJjb21wbGV4XzE2IiwgQ09NUExFWF9TMTZfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgImNvbXBsZXhfMzIiLCBDT01QTEVYX1MzMl9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAiY2hhcmFjdGVyIiwgQ0hBUkFDVEVSLCBCSU5PUF9FTkQgfSwKLSAgeyAiaW50ZWdlcl8yIiwgSU5UX1MyX0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJsb2dpY2FsXzEiLCBMT0dJQ0FMX1MxX0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJsb2dpY2FsXzIiLCBMT0dJQ0FMX1MyX0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJjb21wbGV4XzgiLCBDT01QTEVYX1M4X0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJpbnRlZ2VyIiwgSU5UX0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJsb2dpY2FsIiwgTE9HSUNBTF9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAicmVhbF8xNiIsIFJFQUxfUzE2X0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJjb21wbGV4IiwgQ09NUExFWF9TOF9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAic2l6ZW9mIiwgU0laRU9GLCBCSU5PUF9FTkQgfSwKLSAgeyAicmVhbF84IiwgUkVBTF9TOF9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAicmVhbCIsIFJFQUxfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OyAKLQotLyogSW1wbGVtZW50YXRpb24gb2YgYSBkeW5hbWljYWxseSBleHBhbmRhYmxlIGJ1ZmZlciBmb3IgcHJvY2Vzc2luZyBpbnB1dAotICAgY2hhcmFjdGVycyBhY3F1aXJlZCB0aHJvdWdoIGxleHB0ciBhbmQgYnVpbGRpbmcgYSB2YWx1ZSB0byByZXR1cm4gaW4KLSAgIHl5bHZhbC4gUmlwcGVkIG9mZiBmcm9tIGNoLWV4cC55ICovIAotCi1zdGF0aWMgY2hhciAqdGVtcGJ1ZjsJCS8qIEN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzICovCi1zdGF0aWMgaW50IHRlbXBidWZzaXplOwkJLyogU2l6ZSBvZiBhbGxvY2F0ZWQgYnVmZmVyICovCi1zdGF0aWMgaW50IHRlbXBidWZpbmRleDsJLyogQ3VycmVudCBpbmRleCBpbnRvIGJ1ZmZlciAqLwotCi0jZGVmaW5lIEdST1dCWV9NSU5fU0laRSA2NAkvKiBNaW5pbXVtIGFtb3VudCB0byBncm93IGJ1ZmZlciBieSAqLwotCi0jZGVmaW5lIENIRUNLQlVGKHNpemUpIFwKLSAgZG8geyBcCi0gICAgaWYgKHRlbXBidWZpbmRleCArIChzaXplKSA+PSB0ZW1wYnVmc2l6ZSkgXAotICAgICAgeyBcCi0JZ3Jvd2J1Zl9ieV9zaXplIChzaXplKTsgXAotICAgICAgfSBcCi0gIH0gd2hpbGUgKDApOwotCi0KLS8qIEdyb3cgdGhlIHN0YXRpYyB0ZW1wIGJ1ZmZlciBpZiBuZWNlc3NhcnksIGluY2x1ZGluZyBhbGxvY2F0aW5nIHRoZSBmaXJzdCBvbmUKLSAgIG9uIGRlbWFuZC4gKi8KLQotc3RhdGljIHZvaWQKLWdyb3didWZfYnlfc2l6ZSAoY291bnQpCi0gICAgIGludCBjb3VudDsKLXsKLSAgaW50IGdyb3dieTsKLQotICBncm93YnkgPSBtYXggKGNvdW50LCBHUk9XQllfTUlOX1NJWkUpOwotICB0ZW1wYnVmc2l6ZSArPSBncm93Ynk7Ci0gIGlmICh0ZW1wYnVmID09IE5VTEwpCi0gICAgdGVtcGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHRlbXBidWZzaXplKTsKLSAgZWxzZQotICAgIHRlbXBidWYgPSAoY2hhciAqKSB4cmVhbGxvYyAodGVtcGJ1ZiwgdGVtcGJ1ZnNpemUpOwotfQotCi0vKiBCbGF0YW50bHkgcmlwcGVkIG9mZiBmcm9tIGNoLWV4cC55LiBUaGlzIHJvdXRpbmUgcmVjb2duaXplcyBGNzcgCi0gICBzdHJpbmctbGl0ZXJhbHMuIAotICAgCi0gICBSZWNvZ25pemUgYSBzdHJpbmcgbGl0ZXJhbC4gIEEgc3RyaW5nIGxpdGVyYWwgaXMgYSBub256ZXJvIHNlcXVlbmNlCi0gICBvZiBjaGFyYWN0ZXJzIGVuY2xvc2VkIGluIG1hdGNoaW5nIHNpbmdsZSBxdW90ZXMsIGV4Y2VwdCB0aGF0Ci0gICBhIHNpbmdsZSBjaGFyYWN0ZXIgaW5zaWRlIHNpbmdsZSBxdW90ZXMgaXMgYSBjaGFyYWN0ZXIgbGl0ZXJhbCwgd2hpY2gKLSAgIHdlIHJlamVjdCBhcyBhIHN0cmluZyBsaXRlcmFsLiAgVG8gZW1iZWQgdGhlIHRlcm1pbmF0b3IgY2hhcmFjdGVyIGluc2lkZQotICAgYSBzdHJpbmcsIGl0IGlzIHNpbXBseSBkb3VibGVkIChJLkUuICd0aGlzJydpcycnb25lJydzdHJpbmcnKSAqLwotCi1zdGF0aWMgaW50Ci1tYXRjaF9zdHJpbmdfbGl0ZXJhbCAoKQotewotICBjaGFyICp0b2twdHIgPSBsZXhwdHI7Ci0KLSAgZm9yICh0ZW1wYnVmaW5kZXggPSAwLCB0b2twdHIrKzsgKnRva3B0ciAhPSAnXDAnOyB0b2twdHIrKykKLSAgICB7Ci0gICAgICBDSEVDS0JVRiAoMSk7Ci0gICAgICBpZiAoKnRva3B0ciA9PSAqbGV4cHRyKQotCXsKLQkgIGlmICgqKHRva3B0ciArIDEpID09ICpsZXhwdHIpCi0JICAgIHRva3B0cisrOwotCSAgZWxzZQotCSAgICBicmVhazsKLQl9Ci0gICAgICB0ZW1wYnVmW3RlbXBidWZpbmRleCsrXSA9ICp0b2twdHI7Ci0gICAgfQotICBpZiAoKnRva3B0ciA9PSAnXDAnCQkJCQkvKiBubyB0ZXJtaW5hdG9yICovCi0gICAgICB8fCB0ZW1wYnVmaW5kZXggPT0gMCkJCQkJLyogbm8gc3RyaW5nICovCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0ZW1wYnVmW3RlbXBidWZpbmRleF0gPSAnXDAnOwotICAgICAgeXlsdmFsLnN2YWwucHRyID0gdGVtcGJ1ZjsKLSAgICAgIHl5bHZhbC5zdmFsLmxlbmd0aCA9IHRlbXBidWZpbmRleDsKLSAgICAgIGxleHB0ciA9ICsrdG9rcHRyOwotICAgICAgcmV0dXJuIFNUUklOR19MSVRFUkFMOwotICAgIH0KLX0KLQotLyogUmVhZCBvbmUgdG9rZW4sIGdldHRpbmcgY2hhcmFjdGVycyB0aHJvdWdoIGxleHB0ci4gICovCi0KLXN0YXRpYyBpbnQKLXl5bGV4ICgpCi17Ci0gIGludCBjOwotICBpbnQgbmFtZWxlbjsKLSAgdW5zaWduZWQgaW50IGksdG9rZW47Ci0gIGNoYXIgKnRva3N0YXJ0OwotICAKLSByZXRyeToKLSAgCi0gIHRva3N0YXJ0ID0gbGV4cHRyOwotICAKLSAgLyogRmlyc3Qgb2YgYWxsLCBsZXQgdXMgbWFrZSBzdXJlIHdlIGFyZSBub3QgZGVhbGluZyB3aXRoIHRoZSAKLSAgICAgc3BlY2lhbCB0b2tlbnMgLnRydWUuIGFuZCAuZmFsc2UuIHdoaWNoIGV2YWx1YXRlIHRvIDEgYW5kIDAuICAqLwotICAKLSAgaWYgKCpsZXhwdHIgPT0gJy4nKQotICAgIHsgCi0gICAgICBmb3IgKGkgPSAwOyBib29sZWFuX3ZhbHVlc1tpXS5uYW1lICE9IE5VTEw7IGkrKykKLQl7Ci0JICBpZiBTVFJFUU4gKHRva3N0YXJ0LCBib29sZWFuX3ZhbHVlc1tpXS5uYW1lLAotCQkgICAgc3RybGVuIChib29sZWFuX3ZhbHVlc1tpXS5uYW1lKSkKLQkgICAgewotCSAgICAgIGxleHB0ciArPSBzdHJsZW4gKGJvb2xlYW5fdmFsdWVzW2ldLm5hbWUpOyAKLQkgICAgICB5eWx2YWwubHZhbCA9IGJvb2xlYW5fdmFsdWVzW2ldLnZhbHVlOyAKLQkgICAgICByZXR1cm4gQk9PTEVBTl9MSVRFUkFMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgLmZvby4gb3BlcmF0b3IgKi8KLSAgCi0gIGZvciAoaSA9IDA7IGRvdF9vcHNbaV0ub3BlcmF0b3IgIT0gTlVMTDsgaSsrKQotICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCBkb3Rfb3BzW2ldLm9wZXJhdG9yLCBzdHJsZW4gKGRvdF9vcHNbaV0ub3BlcmF0b3IpKSkKLSAgICAgIHsKLQlsZXhwdHIgKz0gc3RybGVuIChkb3Rfb3BzW2ldLm9wZXJhdG9yKTsKLQl5eWx2YWwub3Bjb2RlID0gZG90X29wc1tpXS5vcGNvZGU7Ci0JcmV0dXJuIGRvdF9vcHNbaV0udG9rZW47Ci0gICAgICB9Ci0gIAotICBzd2l0Y2ggKGMgPSAqdG9rc3RhcnQpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAwOwotICAgICAgCi0gICAgY2FzZSAnICc6Ci0gICAgY2FzZSAnXHQnOgotICAgIGNhc2UgJ1xuJzoKLSAgICAgIGxleHB0cisrOwotICAgICAgZ290byByZXRyeTsKLSAgICAgIAotICAgIGNhc2UgJ1wnJzoKLSAgICAgIHRva2VuID0gbWF0Y2hfc3RyaW5nX2xpdGVyYWwgKCk7Ci0gICAgICBpZiAodG9rZW4gIT0gMCkKLQlyZXR1cm4gKHRva2VuKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSAnKCc6Ci0gICAgICBwYXJlbl9kZXB0aCsrOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLSAgICAgIAotICAgIGNhc2UgJyknOgotICAgICAgaWYgKHBhcmVuX2RlcHRoID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBwYXJlbl9kZXB0aC0tOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLSAgICAgIAotICAgIGNhc2UgJywnOgotICAgICAgaWYgKGNvbW1hX3Rlcm1pbmF0ZXMgJiYgcGFyZW5fZGVwdGggPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0gICAgICAKLSAgICBjYXNlICcuJzoKLSAgICAgIC8qIE1pZ2h0IGJlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChsZXhwdHJbMV0gPCAnMCcgfHwgbGV4cHRyWzFdID4gJzknKQotCWdvdG8gc3ltYm9sOwkJLyogTm9wZSwgbXVzdCBiZSBhIHN5bWJvbC4gKi8KLSAgICAgIC8qIEZBTEwgVEhSVSBpbnRvIG51bWJlciBjYXNlLiAgKi8KLSAgICAgIAotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgewotICAgICAgICAvKiBJdCdzIGEgbnVtYmVyLiAgKi8KLQlpbnQgZ290X2RvdCA9IDAsIGdvdF9lID0gMCwgZ290X2QgPSAwLCB0b2t0eXBlOwotCXJlZ2lzdGVyIGNoYXIgKnAgPSB0b2tzdGFydDsKLQlpbnQgaGV4ID0gaW5wdXRfcmFkaXggPiAxMDsKLQkKLQlpZiAoYyA9PSAnMCcgJiYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnKSkKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBoZXggPSAxOwotCSAgfQotCWVsc2UgaWYgKGMgPT0gJzAnICYmIChwWzFdPT0ndCcgfHwgcFsxXT09J1QnIHx8IHBbMV09PSdkJyB8fCBwWzFdPT0nRCcpKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGhleCA9IDA7Ci0JICB9Ci0JCi0JZm9yICg7OyArK3ApCi0JICB7Ci0JICAgIGlmICghaGV4ICYmICFnb3RfZSAmJiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykpCi0JICAgICAgZ290X2RvdCA9IGdvdF9lID0gMTsKLQkgICAgZWxzZSBpZiAoIWhleCAmJiAhZ290X2QgJiYgKCpwID09ICdkJyB8fCAqcCA9PSAnRCcpKQotCSAgICAgIGdvdF9kb3QgPSBnb3RfZCA9IDE7Ci0JICAgIGVsc2UgaWYgKCFoZXggJiYgIWdvdF9kb3QgJiYgKnAgPT0gJy4nKQotCSAgICAgIGdvdF9kb3QgPSAxOwotCSAgICBlbHNlIGlmICgoKGdvdF9lICYmIChwWy0xXSA9PSAnZScgfHwgcFstMV0gPT0gJ0UnKSkKLQkJICAgICB8fCAoZ290X2QgJiYgKHBbLTFdID09ICdkJyB8fCBwWy0xXSA9PSAnRCcpKSkKLQkJICAgICAmJiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykpCi0JICAgICAgLyogVGhpcyBpcyB0aGUgc2lnbiBvZiB0aGUgZXhwb25lbnQsIG5vdCB0aGUgZW5kIG9mIHRoZQotCQkgbnVtYmVyLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgLyogV2Ugd2lsbCB0YWtlIGFueSBsZXR0ZXJzIG9yIGRpZ2l0cy4gIHBhcnNlX251bWJlciB3aWxsCi0JICAgICAgIGNvbXBsYWluIGlmIHBhc3QgdGhlIHJhZGl4LCBvciBpZiBMIG9yIFUgYXJlIG5vdCBmaW5hbC4gICovCi0JICAgIGVsc2UgaWYgKCgqcCA8ICcwJyB8fCAqcCA+ICc5JykKLQkJICAgICAmJiAoKCpwIDwgJ2EnIHx8ICpwID4gJ3onKQotCQkJICYmICgqcCA8ICdBJyB8fCAqcCA+ICdaJykpKQotCSAgICAgIGJyZWFrOwotCSAgfQotCXRva3R5cGUgPSBwYXJzZV9udW1iZXIgKHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQsIGdvdF9kb3R8Z290X2V8Z290X2QsCi0JCQkJJnl5bHZhbCk7Ci0gICAgICAgIGlmICh0b2t0eXBlID09IEVSUk9SKQotICAgICAgICAgIHsKLQkgICAgY2hhciAqZXJyX2NvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHAgLSB0b2tzdGFydCArIDEpOwotCSAgICAKLQkgICAgbWVtY3B5IChlcnJfY29weSwgdG9rc3RhcnQsIHAgLSB0b2tzdGFydCk7Ci0JICAgIGVycl9jb3B5W3AgLSB0b2tzdGFydF0gPSAwOwotCSAgICBlcnJvciAoIkludmFsaWQgbnVtYmVyIFwiJXNcIi4iLCBlcnJfY29weSk7Ci0JICB9Ci0JbGV4cHRyID0gcDsKLQlyZXR1cm4gdG9rdHlwZTsKLSAgICAgIH0KLSAgICAgIAotICAgIGNhc2UgJysnOgotICAgIGNhc2UgJy0nOgotICAgIGNhc2UgJyonOgotICAgIGNhc2UgJy8nOgotICAgIGNhc2UgJyUnOgotICAgIGNhc2UgJ3wnOgotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ14nOgotICAgIGNhc2UgJ34nOgotICAgIGNhc2UgJyEnOgotICAgIGNhc2UgJ0AnOgotICAgIGNhc2UgJzwnOgotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJ1snOgotICAgIGNhc2UgJ10nOgotICAgIGNhc2UgJz8nOgotICAgIGNhc2UgJzonOgotICAgIGNhc2UgJz0nOgotICAgIGNhc2UgJ3snOgotICAgIGNhc2UgJ30nOgotICAgIHN5bWJvbDoKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICAKLSAgaWYgKCEoYyA9PSAnXycgfHwgYyA9PSAnJCcKLQl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpKQotICAgIC8qIFdlIG11c3QgaGF2ZSBjb21lIGFjcm9zcyBhIGJhZCBjaGFyYWN0ZXIgKGUuZy4gJzsnKS4gICovCi0gICAgZXJyb3IgKCJJbnZhbGlkIGNoYXJhY3RlciAnJWMnIGluIGV4cHJlc3Npb24uIiwgYyk7Ci0gIAotICBuYW1lbGVuID0gMDsKLSAgZm9yIChjID0gdG9rc3RhcnRbbmFtZWxlbl07Ci0gICAgICAgKGMgPT0gJ18nIHx8IGMgPT0gJyQnIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykgCi0JfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKTsgCi0gICAgICAgYyA9IHRva3N0YXJ0WysrbmFtZWxlbl0pOwotICAKLSAgLyogVGhlIHRva2VuICJpZiIgdGVybWluYXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaXMgTk9UIAotICAgICByZW1vdmVkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gICovCi0gIAotICBpZiAobmFtZWxlbiA9PSAyICYmIHRva3N0YXJ0WzBdID09ICdpJyAmJiB0b2tzdGFydFsxXSA9PSAnZicpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBsZXhwdHIgKz0gbmFtZWxlbjsKLSAgCi0gIC8qIENhdGNoIHNwZWNpZmljIGtleXdvcmRzLiAgKi8KLSAgCi0gIGZvciAoaSA9IDA7IGY3N19rZXl3b3Jkc1tpXS5vcGVyYXRvciAhPSBOVUxMOyBpKyspCi0gICAgaWYgKFNUUkVRTih0b2tzdGFydCwgZjc3X2tleXdvcmRzW2ldLm9wZXJhdG9yLAotICAgICAgICAgICAgICAgc3RybGVuKGY3N19rZXl3b3Jkc1tpXS5vcGVyYXRvcikpKQotICAgICAgewotCS8qIAlsZXhwdHIgKz0gc3RybGVuKGY3N19rZXl3b3Jkc1tpXS5vcGVyYXRvcik7ICovIAotCXl5bHZhbC5vcGNvZGUgPSBmNzdfa2V5d29yZHNbaV0ub3Bjb2RlOwotCXJldHVybiBmNzdfa2V5d29yZHNbaV0udG9rZW47Ci0gICAgICB9Ci0gIAotICB5eWx2YWwuc3ZhbC5wdHIgPSB0b2tzdGFydDsKLSAgeXlsdmFsLnN2YWwubGVuZ3RoID0gbmFtZWxlbjsKLSAgCi0gIGlmICgqdG9rc3RhcnQgPT0gJyQnKQotICAgIHsKLSAgICAgIHdyaXRlX2RvbGxhcl92YXJpYWJsZSAoeXlsdmFsLnN2YWwpOwotICAgICAgcmV0dXJuIFZBUklBQkxFOwotICAgIH0KLSAgCi0gIC8qIFVzZSB0b2tlbi10eXBlIFRZUEVOQU1FIGZvciBzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlIGRlZmluZWQKLSAgICAgY3VycmVudGx5IGFzIG5hbWVzIG9mIHR5cGVzOyBOQU1FIGZvciBvdGhlciBzeW1ib2xzLgotICAgICBUaGUgY2FsbGVyIGlzIG5vdCBjb25zdHJhaW5lZCB0byBjYXJlIGFib3V0IHRoZSBkaXN0aW5jdGlvbi4gICovCi0gIHsKLSAgICBjaGFyICp0bXAgPSBjb3B5X25hbWUgKHl5bHZhbC5zdmFsKTsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0gICAgaW50IGlzX2FfZmllbGRfb2ZfdGhpcyA9IDA7Ci0gICAgaW50IGhleHR5cGU7Ci0gICAgCi0gICAgc3ltID0gbG9va3VwX3N5bWJvbCAodG1wLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCi0JCQkgVkFSX05BTUVTUEFDRSwKLQkJCSBjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cwotCQkJID8gJmlzX2FfZmllbGRfb2ZfdGhpcyA6IE5VTEwsCi0JCQkgTlVMTCk7Ci0gICAgaWYgKHN5bSAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX1RZUEVERUYpCi0gICAgICB7Ci0JeXlsdmFsLnRzeW0udHlwZSA9IFNZTUJPTF9UWVBFIChzeW0pOwotCXJldHVybiBUWVBFTkFNRTsKLSAgICAgIH0KLSAgICBpZiAoKHl5bHZhbC50c3ltLnR5cGUgPSBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lICh0bXApKSAhPSAwKQotICAgICAgcmV0dXJuIFRZUEVOQU1FOwotICAgIAotICAgIC8qIElucHV0IG5hbWVzIHRoYXQgYXJlbid0IHN5bWJvbHMgYnV0IEFSRSB2YWxpZCBoZXggbnVtYmVycywKLSAgICAgICB3aGVuIHRoZSBpbnB1dCByYWRpeCBwZXJtaXRzIHRoZW0sIGNhbiBiZSBuYW1lcyBvciBudW1iZXJzCi0gICAgICAgZGVwZW5kaW5nIG9uIHRoZSBwYXJzZS4gIE5vdGUgd2Ugc3VwcG9ydCByYWRpeGVzID4gMTYgaGVyZS4gICovCi0gICAgaWYgKCFzeW0KLQkmJiAoKHRva3N0YXJ0WzBdID49ICdhJyAmJiB0b2tzdGFydFswXSA8ICdhJyArIGlucHV0X3JhZGl4IC0gMTApCi0JICAgIHx8ICh0b2tzdGFydFswXSA+PSAnQScgJiYgdG9rc3RhcnRbMF0gPCAnQScgKyBpbnB1dF9yYWRpeCAtIDEwKSkpCi0gICAgICB7Ci0gCVlZU1RZUEUgbmV3bHZhbDsJLyogSXRzIHZhbHVlIGlzIGlnbm9yZWQuICAqLwotCWhleHR5cGUgPSBwYXJzZV9udW1iZXIgKHRva3N0YXJ0LCBuYW1lbGVuLCAwLCAmbmV3bHZhbCk7Ci0JaWYgKGhleHR5cGUgPT0gSU5UKQotCSAgewotCSAgICB5eWx2YWwuc3N5bS5zeW0gPSBzeW07Ci0JICAgIHl5bHZhbC5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcyA9IGlzX2FfZmllbGRfb2ZfdGhpczsKLQkgICAgcmV0dXJuIE5BTUVfT1JfSU5UOwotCSAgfQotICAgICAgfQotICAgIAotICAgIC8qIEFueSBvdGhlciBraW5kIG9mIHN5bWJvbCAqLwotICAgIHl5bHZhbC5zc3ltLnN5bSA9IHN5bTsKLSAgICB5eWx2YWwuc3N5bS5pc19hX2ZpZWxkX29mX3RoaXMgPSBpc19hX2ZpZWxkX29mX3RoaXM7Ci0gICAgcmV0dXJuIE5BTUU7Ci0gIH0KLX0KLQotdm9pZAoteXllcnJvciAobXNnKQotICAgICBjaGFyICptc2c7Ci17Ci0gIGVycm9yICgiQSAlcyBpbiBleHByZXNzaW9uLCBuZWFyIGAlcycuIiwgKG1zZyA/IG1zZyA6ICJlcnJvciIpLCBsZXhwdHIpOwotfQpkaWZmIC0tZ2l0IGEvZ2RiL2p2LWV4cC50YWIuYyBiL2dkYi9qdi1leHAudGFiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OTIwY2EuLjAwMDAwMDAKLS0tIGEvZ2RiL2p2LWV4cC50YWIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNTEgKzAsMCBAQAotCi0vKiAgQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSBqdi1leHAueQotIGJ5ICBHTlUgQmlzb24gdmVyc2lvbiAxLjI1Ci0gICovCi0KLSNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLwotCi0jZGVmaW5lCUlOVEVHRVJfTElURVJBTAkyNTgKLSNkZWZpbmUJRkxPQVRJTkdfUE9JTlRfTElURVJBTAkyNTkKLSNkZWZpbmUJSURFTlRJRklFUgkyNjAKLSNkZWZpbmUJU1RSSU5HX0xJVEVSQUwJMjYxCi0jZGVmaW5lCUJPT0xFQU5fTElURVJBTAkyNjIKLSNkZWZpbmUJVFlQRU5BTUUJMjYzCi0jZGVmaW5lCU5BTUVfT1JfSU5UCTI2NAotI2RlZmluZQlFUlJPUgkyNjUKLSNkZWZpbmUJTE9ORwkyNjYKLSNkZWZpbmUJU0hPUlQJMjY3Ci0jZGVmaW5lCUJZVEUJMjY4Ci0jZGVmaW5lCUlOVAkyNjkKLSNkZWZpbmUJQ0hBUgkyNzAKLSNkZWZpbmUJQk9PTEVBTgkyNzEKLSNkZWZpbmUJRE9VQkxFCTI3MgotI2RlZmluZQlGTE9BVAkyNzMKLSNkZWZpbmUJVkFSSUFCTEUJMjc0Ci0jZGVmaW5lCUFTU0lHTl9NT0RJRlkJMjc1Ci0jZGVmaW5lCVRISVMJMjc2Ci0jZGVmaW5lCVNVUEVSCTI3NwotI2RlZmluZQlORVcJMjc4Ci0jZGVmaW5lCU9ST1IJMjc5Ci0jZGVmaW5lCUFOREFORAkyODAKLSNkZWZpbmUJRVFVQUwJMjgxCi0jZGVmaW5lCU5PVEVRVUFMCTI4MgotI2RlZmluZQlMRVEJMjgzCi0jZGVmaW5lCUdFUQkyODQKLSNkZWZpbmUJTFNICTI4NQotI2RlZmluZQlSU0gJMjg2Ci0jZGVmaW5lCUlOQ1JFTUVOVAkyODcKLSNkZWZpbmUJREVDUkVNRU5UCTI4OAotCi0jbGluZSAzOCAianYtZXhwLnkiCi0KLQotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJleHByZXNzaW9uLmgiCi0jaW5jbHVkZSAidmFsdWUuaCIKLSNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgotI2luY2x1ZGUgImxhbmd1YWdlLmgiCi0jaW5jbHVkZSAianYtbGFuZy5oIgotI2luY2x1ZGUgImJmZC5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KLSNpbmNsdWRlICJzeW1maWxlLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLwotI2luY2x1ZGUgIm9iamZpbGVzLmgiIC8qIEZvciBoYXZlX2Z1bGxfc3ltYm9scyBhbmQgaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKi8KLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsIGV0YyksCi0gICBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcywgc28gd2UgY2FuIGhhdmUgbXVsdGlwbGUKLSAgIHlhY2MgZ2VuZXJhdGVkIHBhcnNlcnMgaW4gZ2RiLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBvbmx5IHRoZSB2YXJpYWJsZXMKLSAgIHByb2R1Y2VkIGJ5IHlhY2MuICBJZiBvdGhlciBwYXJzZXIgZ2VuZXJhdG9ycyAoYmlzb24sIGJ5YWNjLCBldGMpIHByb2R1Y2UKLSAgIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQgY29uZmxpY3QgYXQgbGluayB0aW1lLCB0aGVuIHRob3NlIHBhcnNlcgotICAgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlIGZpeGVkIGluc3RlYWQgb2YgYWRkaW5nIHRob3NlIG5hbWVzIHRvIHRoaXMgbGlzdC4gKi8KLQotI2RlZmluZQl5eW1heGRlcHRoIGphdmFfbWF4ZGVwdGgKLSNkZWZpbmUJeXlwYXJzZQlqYXZhX3BhcnNlCi0jZGVmaW5lCXl5bGV4CWphdmFfbGV4Ci0jZGVmaW5lCXl5ZXJyb3IJamF2YV9lcnJvcgotI2RlZmluZQl5eWx2YWwJamF2YV9sdmFsCi0jZGVmaW5lCXl5Y2hhcglqYXZhX2NoYXIKLSNkZWZpbmUJeXlkZWJ1ZwlqYXZhX2RlYnVnCi0jZGVmaW5lCXl5cGFjdAlqYXZhX3BhY3QJCi0jZGVmaW5lCXl5cjEJamF2YV9yMQkJCQotI2RlZmluZQl5eXIyCWphdmFfcjIJCQkKLSNkZWZpbmUJeXlkZWYJamF2YV9kZWYJCQotI2RlZmluZQl5eWNoawlqYXZhX2NoawkJCi0jZGVmaW5lCXl5cGdvCWphdmFfcGdvCQkKLSNkZWZpbmUJeXlhY3QJamF2YV9hY3QJCQotI2RlZmluZQl5eWV4Y2EJamF2YV9leGNhCi0jZGVmaW5lIHl5ZXJyZmxhZyBqYXZhX2VycmZsYWcKLSNkZWZpbmUgeXluZXJycwlqYXZhX25lcnJzCi0jZGVmaW5lCXl5cHMJamF2YV9wcwotI2RlZmluZQl5eXB2CWphdmFfcHYKLSNkZWZpbmUJeXlzCWphdmFfcwotI2RlZmluZQl5eV95eXMJamF2YV95eXMKLSNkZWZpbmUJeXlzdGF0ZQlqYXZhX3N0YXRlCi0jZGVmaW5lCXl5dG1wCWphdmFfdG1wCi0jZGVmaW5lCXl5dglqYXZhX3YKLSNkZWZpbmUJeXlfeXl2CWphdmFfeXl2Ci0jZGVmaW5lCXl5dmFsCWphdmFfdmFsCi0jZGVmaW5lCXl5bGxvYwlqYXZhX2xsb2MKLSNkZWZpbmUgeXlyZWRzCWphdmFfcmVkcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXl0b2tzCWphdmFfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJamF2YV95eWxocwotI2RlZmluZSB5eWxlbglqYXZhX3l5bGVuCi0jZGVmaW5lIHl5ZGVmcmVkIGphdmFfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwlqYXZhX3l5ZGdvdG8KLSNkZWZpbmUgeXlzaW5kZXggamF2YV95eXNpbmRleAotI2RlZmluZSB5eXJpbmRleCBqYXZhX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IGphdmFfeXlnaW5kZXgKLSNkZWZpbmUgeXl0YWJsZQkgamF2YV95eXRhYmxlCi0jZGVmaW5lIHl5Y2hlY2sJIGphdmFfeXljaGVjawotCi0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUJWVlERUJVRwkwCQkvKiBEZWZhdWx0IHRvIG5vIHl5ZGVidWcgc3VwcG9ydCAqLwotI2VuZGlmCi0KLWludAoteXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbnQKLXl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAoteXllcnJvciBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIHN0cnVjdCB0eXBlICogamF2YV90eXBlX2Zyb21fbmFtZSBQQVJBTVMgKChzdHJ1Y3Qgc3Rva2VuKSk7Ci1zdGF0aWMgdm9pZCBwdXNoX2V4cHJlc3Npb25fbmFtZSBQQVJBTVMgKChzdHJ1Y3Qgc3Rva2VuKSk7Ci1zdGF0aWMgdm9pZCBwdXNoX2ZpZWxkbmFtZXMgUEFSQU1TICgoc3RydWN0IHN0b2tlbikpOwotCi1zdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKmNvcHlfZXhwIFBBUkFNUyAoKHN0cnVjdCBleHByZXNzaW9uICosIGludCkpOwotc3RhdGljIHZvaWQgaW5zZXJ0X2V4cCBQQVJBTVMgKChpbnQsIHN0cnVjdCBleHByZXNzaW9uICopKTsKLQotCi0jbGluZSAxMjQgImp2LWV4cC55IgotdHlwZWRlZiB1bmlvbgotICB7Ci0gICAgTE9OR0VTVCBsdmFsOwotICAgIHN0cnVjdCB7Ci0gICAgICBMT05HRVNUIHZhbDsKLSAgICAgIHN0cnVjdCB0eXBlICp0eXBlOwotICAgIH0gdHlwZWRfdmFsX2ludDsKLSAgICBzdHJ1Y3QgewotICAgICAgRE9VQkxFU1QgZHZhbDsKLSAgICAgIHN0cnVjdCB0eXBlICp0eXBlOwotICAgIH0gdHlwZWRfdmFsX2Zsb2F0OwotICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKLSAgICBzdHJ1Y3QgdHlwZSAqdHZhbDsKLSAgICBzdHJ1Y3Qgc3Rva2VuIHN2YWw7Ci0gICAgc3RydWN0IHR0eXBlIHRzeW07Ci0gICAgc3RydWN0IHN5bXRva2VuIHNzeW07Ci0gICAgc3RydWN0IGJsb2NrICpidmFsOwotICAgIGVudW0gZXhwX29wY29kZSBvcGNvZGU7Ci0gICAgc3RydWN0IGludGVybmFsdmFyICppdmFyOwotICAgIGludCAqaXZlYzsKLSAgfSBZWVNUWVBFOwotI2xpbmUgMTQ2ICJqdi1leHAueSIKLQotLyogWVlTVFlQRSBnZXRzIGRlZmluZWQgYnkgJXVuaW9uICovCi1zdGF0aWMgaW50Ci1wYXJzZV9udW1iZXIgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwgWVlTVFlQRSAqKSk7Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotCi0KLSNkZWZpbmUJWVlGSU5BTAkJMjA4Ci0jZGVmaW5lCVlZRkxBRwkJLTMyNzY4Ci0jZGVmaW5lCVlZTlRCQVNFCTU3Ci0KLSNkZWZpbmUgWVlUUkFOU0xBVEUoeCkgKCh1bnNpZ25lZCkoeCkgPD0gMjg4ID8geXl0cmFuc2xhdGVbeF0gOiAxMTIpCi0KLXN0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPSB7ICAgICAwLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgNTUsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDQ0LCAgICAzMSwgICAgIDIsICAgIDQ5LAotICAgIDUwLCAgICA0MiwgICAgNDAsICAgIDI0LCAgICA0MSwgICAgNDcsICAgIDQzLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA1NiwgICAgIDIsICAgIDM0LAotICAgIDI1LCAgICAzNSwgICAgMjYsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgIDQ4LCAgICAgMiwgICAgNTMsICAgIDMwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgNTEsICAgIDI5LCAgICA1MiwgICAgNTQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjcsICAgIDI4LAotICAgIDMyLCAgICAzMywgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQ1LCAgICA0NgotfTsKLQotI2lmIFlZREVCVUcgIT0gMAotc3RhdGljIGNvbnN0IHNob3J0IHl5cHJoc1tdID0geyAgICAgMCwKLSAgICAgMCwgICAgIDIsICAgICA0LCAgICAgNiwgICAgIDgsICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE2LCAgICAxOCwKLSAgICAyMCwgICAgMjIsICAgIDI0LCAgICAyNiwgICAgMjgsICAgIDMwLCAgICAzMiwgICAgMzQsICAgIDM2LCAgICAzOCwKLSAgICA0MCwgICAgNDIsICAgIDQ0LCAgICA0NiwgICAgNDgsICAgIDUxLCAgICA1NCwgICAgNTYsICAgIDU4LCAgICA2MCwKLSAgICA2MiwgICAgNjQsICAgIDY2LCAgICA3MCwgICAgNzIsICAgIDc2LCAgICA3OCwgICAgODAsICAgIDgyLCAgICA4NCwKLSAgICA4OCwgICAgOTAsICAgIDkyLCAgICA5NCwgICAgOTYsICAgMTAwLCAgIDEwMiwgICAxMDQsICAgMTEwLCAgIDExMiwKLSAgIDExNiwgICAxMTcsICAgMTE5LCAgIDEyNCwgICAxMjksICAgMTMxLCAgIDEzNCwgICAxMzgsICAgMTQxLCAgIDE0NSwKLSAgIDE0NywgICAxNDgsICAgMTUyLCAgIDE1NiwgICAxNjEsICAgMTY4LCAgIDE3NSwgICAxODAsICAgMTg1LCAgIDE5MCwKLSAgIDE5MiwgICAxOTQsICAgMTk2LCAgIDE5OCwgICAyMDAsICAgMjAzLCAgIDIwNiwgICAyMDgsICAgMjEwLCAgIDIxMywKLSAgIDIxNiwgICAyMTksICAgMjIxLCAgIDIyNCwgICAyMjcsICAgMjI5LCAgIDIzMiwgICAyMzUsICAgMjM3LCAgIDI0MywKLSAgIDI0OCwgICAyNTQsICAgMjU2LCAgIDI2MCwgICAyNjQsICAgMjY4LCAgIDI3MCwgICAyNzQsICAgMjc4LCAgIDI4MCwKLSAgIDI4NCwgICAyODgsICAgMjkwLCAgIDI5NCwgICAyOTgsICAgMzAyLCAgIDMwNiwgICAzMDgsICAgMzEyLCAgIDMxNiwKLSAgIDMxOCwgICAzMjIsICAgMzI0LCAgIDMyOCwgICAzMzAsICAgMzM0LCAgIDMzNiwgICAzNDAsICAgMzQyLCAgIDM0NiwKLSAgIDM0OCwgICAzNTQsICAgMzU2LCAgIDM1OCwgICAzNjIsICAgMzY2LCAgIDM2OCwgICAzNzAsICAgMzcyLCAgIDM3NAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cmhzW10gPSB7ICAgIDczLAotICAgICAwLCAgICA1OCwgICAgIDAsICAgIDU5LCAgICAgMCwgICAgNjIsICAgICAwLCAgICA2OCwgICAgIDAsICAgICA2LAotICAgICAwLCAgICAgMywgICAgIDAsICAgICA5LCAgICAgMCwgICAgIDQsICAgICAwLCAgICAgNywgICAgIDAsICAgIDYwLAotICAgICAwLCAgICA2MywgICAgIDAsICAgIDE2LCAgICAgMCwgICAgNjQsICAgICAwLCAgICA2NSwgICAgIDAsICAgIDEzLAotICAgICAwLCAgICAxMiwgICAgIDAsICAgIDE0LCAgICAgMCwgICAgMTEsICAgICAwLCAgICAxNSwgICAgIDAsICAgIDE4LAotICAgICAwLCAgICAxNywgICAgIDAsICAgIDY5LCAgICAgMCwgICAgNjYsICAgICAwLCAgICA2MiwgICAgODQsICAgICAwLAotICAgIDY5LCAgICA4NCwgICAgIDAsICAgICA1LCAgICAgMCwgICAgNzIsICAgICAwLCAgICA3MSwgICAgIDAsICAgIDcyLAotICAgICAwLCAgICAgNSwgICAgIDAsICAgICA5LCAgICAgMCwgICAgNjksICAgIDQ3LCAgICA3MSwgICAgIDAsICAgMTExLAotICAgICAwLCAgICA3MywgICAgMjQsICAgMTExLCAgICAgMCwgICAgNzUsICAgICAwLCAgICA4MSwgICAgIDAsICAgIDYxLAotICAgICAwLCAgICAyMSwgICAgIDAsICAgIDQ5LCAgIDExMSwgICAgNTAsICAgICAwLCAgICA3OCwgICAgIDAsICAgIDg2LAotICAgICAwLCAgICA4NywgICAgIDAsICAgIDg4LCAgICAgMCwgICAgNzYsICAgIDc5LCAgICA3NywgICAgIDAsICAgIDUxLAotICAgICAwLCAgICA1MiwgICAgIDAsICAgIDIzLCAgICA2NywgICAgNDksICAgIDgwLCAgICA1MCwgICAgIDAsICAgMTExLAotICAgICAwLCAgICA3OSwgICAgMjQsICAgMTExLCAgICAgMCwgICAgIDAsICAgIDc5LCAgICAgMCwgICAgMjMsICAgIDYyLAotICAgIDgyLCAgICA4NSwgICAgIDAsICAgIDIzLCAgICA2NiwgICAgODIsICAgIDg1LCAgICAgMCwgICAgODMsICAgICAwLAotICAgIDgyLCAgICA4MywgICAgIDAsICAgIDQ4LCAgIDExMSwgICAgNTMsICAgICAwLCAgICA0OCwgICAgNTMsICAgICAwLAotICAgIDg0LCAgICA0OCwgICAgNTMsICAgICAwLCAgICA4NCwgICAgIDAsICAgICAwLCAgICA3NCwgICAgNDcsICAgIDcxLAotICAgICAwLCAgICAxOSwgICAgNDcsICAgIDcxLCAgICAgMCwgICAgNjksICAgIDQ5LCAgICA4MCwgICAgNTAsICAgICAwLAotICAgIDc0LCAgICA0NywgICAgNzEsICAgIDQ5LCAgICA4MCwgICAgNTAsICAgICAwLCAgICAyMiwgICAgNDcsICAgIDcxLAotICAgIDQ5LCAgICA4MCwgICAgNTAsICAgICAwLCAgICA2OSwgICAgNDgsICAgMTExLCAgICA1MywgICAgIDAsICAgIDE5LAotICAgIDQ4LCAgIDExMSwgICAgNTMsICAgICAwLCAgICA3NSwgICAgNDgsICAgMTExLCAgICA1MywgICAgIDAsICAgIDc0LAotICAgICAwLCAgICA2OSwgICAgIDAsICAgIDE5LCAgICAgMCwgICAgOTAsICAgICAwLCAgICA5MSwgICAgIDAsICAgIDg5LAotICAgIDQ1LCAgICAgMCwgICAgODksICAgIDQ2LCAgICAgMCwgICAgOTMsICAgICAwLCAgICA5NCwgICAgIDAsICAgIDQwLAotICAgIDkyLCAgICAgMCwgICAgNDEsICAgIDkyLCAgICAgMCwgICAgNDIsICAgIDkyLCAgICAgMCwgICAgOTUsICAgICAwLAotICAgIDQ1LCAgICA5MiwgICAgIDAsICAgIDQ2LCAgICA5MiwgICAgIDAsICAgIDg5LCAgICAgMCwgICAgNTQsICAgIDkyLAotICAgICAwLCAgICA1NSwgICAgOTIsICAgICAwLCAgICA5NiwgICAgIDAsICAgIDQ5LCAgICA2MiwgICAgODUsICAgIDUwLAotICAgIDkyLCAgICAgMCwgICAgNDksICAgMTExLCAgICA1MCwgICAgOTUsICAgICAwLCAgICA0OSwgICAgNjksICAgIDg0LAotICAgIDUwLCAgICA5NSwgICAgIDAsICAgIDkyLCAgICAgMCwgICAgOTcsICAgIDQyLCAgICA5MiwgICAgIDAsICAgIDk3LAotICAgIDQzLCAgICA5MiwgICAgIDAsICAgIDk3LCAgICA0NCwgICAgOTIsICAgICAwLCAgICA5NywgICAgIDAsICAgIDk4LAotICAgIDQwLCAgICA5NywgICAgIDAsICAgIDk4LCAgICA0MSwgICAgOTcsICAgICAwLCAgICA5OCwgICAgIDAsICAgIDk5LAotICAgIDM4LCAgICA5OCwgICAgIDAsICAgIDk5LCAgICAzOSwgICAgOTgsICAgICAwLCAgICA5OSwgICAgIDAsICAgMTAwLAotICAgIDM0LCAgICA5OSwgICAgIDAsICAgMTAwLCAgICAzNSwgICAgOTksICAgICAwLCAgIDEwMCwgICAgMzYsICAgIDk5LAotICAgICAwLCAgIDEwMCwgICAgMzcsICAgIDk5LCAgICAgMCwgICAxMDAsICAgICAwLCAgIDEwMSwgICAgMzIsICAgMTAwLAotICAgICAwLCAgIDEwMSwgICAgMzMsICAgMTAwLCAgICAgMCwgICAxMDEsICAgICAwLCAgIDEwMiwgICAgMzEsICAgMTAxLAotICAgICAwLCAgIDEwMiwgICAgIDAsICAgMTAzLCAgICAzMCwgICAxMDIsICAgICAwLCAgIDEwMywgICAgIDAsICAgMTA0LAotICAgIDI5LCAgIDEwMywgICAgIDAsICAgMTA0LCAgICAgMCwgICAxMDUsICAgIDI4LCAgIDEwNCwgICAgIDAsICAgMTA1LAotICAgICAwLCAgIDEwNiwgICAgMjcsICAgMTA1LCAgICAgMCwgICAxMDYsICAgICAwLCAgIDEwNiwgICAgMjYsICAgMTExLAotICAgIDU2LCAgIDEwNywgICAgIDAsICAgMTA3LCAgICAgMCwgICAxMDksICAgICAwLCAgIDExMCwgICAgMjUsICAgMTA3LAotICAgICAwLCAgIDExMCwgICAgMjAsICAgMTA3LCAgICAgMCwgICAgNzAsICAgICAwLCAgICAxOSwgICAgIDAsICAgIDg2LAotICAgICAwLCAgICA4OCwgICAgIDAsICAgMTA4LCAgICAgMAotfTsKLQotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLXN0YXRpYyBjb25zdCBzaG9ydCB5eXJsaW5lW10gPSB7IDAsCi0gICAyMDMsICAgMjA0LCAgIDIwNywgICAyMTUsICAgMjE3LCAgIDIyMCwgICAyMjksICAgMjM1LCAgIDI0MywgICAyNDgsCi0gICAyNTMsICAgMjYzLCAgIDI2NSwgICAyNjksICAgMjcxLCAgIDI3NCwgICAyNzcsICAgMjc5LCAgIDI4MSwgICAyODMsCi0gICAyODcsICAgMjkwLCAgIDMwMSwgICAzMDYsICAgMzEwLCAgIDMxMywgICAzMTcsICAgMzE5LCAgIDMyMiwgICAzMjQsCi0gICAzMjcsICAgMzI5LCAgIDMzMiwgICAzNTYsICAgMzU3LCAgIDM2MSwgICAzNjMsICAgMzY2LCAgIDM2OCwgICAzNzEsCi0gICAzNzIsICAgMzczLCAgIDM3NCwgICAzNzUsICAgMzc2LCAgIDM4MywgICAzODgsICAgMzkzLCAgIDM5OCwgICA0MDEsCi0gICA0MDUsICAgNDA4LCAgIDQxMSwgICA0MTQsICAgNDE4LCAgIDQyMCwgICA0MjMsICAgNDI3LCAgIDQzMCwgICA0MzQsCi0gICA0MzYsICAgNDQwLCAgIDQ0MywgICA0NDgsICAgNDUxLCAgIDQ1MywgICA0NTcsICAgNDc1LCAgIDQ3NywgICA0ODEsCi0gICA0ODMsICAgNDg1LCAgIDQ4NywgICA0ODgsICAgNDkxLCAgIDQ5NiwgICA1MDEsICAgNTAzLCAgIDUwNCwgICA1MDUsCi0gICA1MDcsICAgNTA5LCAgIDUxMiwgICA1MTcsICAgNTIyLCAgIDUyNCwgICA1MjYsICAgNTI4LCAgIDUzMSwgICA1MzYsCi0gICA1NTcsICAgNTY0LCAgIDU2NiwgICA1NjgsICAgNTcwLCAgIDU3NCwgICA1NzYsICAgNTc4LCAgIDU4MiwgICA1ODQsCi0gICA1ODYsICAgNTkxLCAgIDU5MywgICA1OTUsICAgNTk3LCAgIDU5OSwgICA2MDQsICAgNjA2LCAgIDYwOCwgICA2MTIsCi0gICA2MTQsICAgNjE4LCAgIDYyMCwgICA2MjMsICAgNjI1LCAgIDYyOSwgICA2MzEsICAgNjM1LCAgIDYzNywgICA2NDEsCi0gICA2NDMsICAgNjQ3LCAgIDY0OSwgICA2NTIsICAgNjU1LCAgIDY2MSwgICA2NjQsICAgNjY2LCAgIDY2NywgICA2NzEKLX07Ci0jZW5kaWYKLQotCi0jaWYgWVlERUJVRyAhPSAwIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB5eXRuYW1lW10gPSB7ICAgIiQiLCJlcnJvciIsIiR1bmRlZmluZWQuIiwiSU5URUdFUl9MSVRFUkFMIiwKLSJGTE9BVElOR19QT0lOVF9MSVRFUkFMIiwiSURFTlRJRklFUiIsIlNUUklOR19MSVRFUkFMIiwiQk9PTEVBTl9MSVRFUkFMIiwiVFlQRU5BTUUiLAotIk5BTUVfT1JfSU5UIiwiRVJST1IiLCJMT05HIiwiU0hPUlQiLCJCWVRFIiwiSU5UIiwiQ0hBUiIsIkJPT0xFQU4iLCJET1VCTEUiLAotIkZMT0FUIiwiVkFSSUFCTEUiLCJBU1NJR05fTU9ESUZZIiwiVEhJUyIsIlNVUEVSIiwiTkVXIiwiJywnIiwiJz0nIiwiJz8nIiwiT1JPUiIsCi0iQU5EQU5EIiwiJ3wnIiwiJ14nIiwiJyYnIiwiRVFVQUwiLCJOT1RFUVVBTCIsIic8JyIsIic+JyIsIkxFUSIsIkdFUSIsIkxTSCIsCi0iUlNIIiwiJysnIiwiJy0nIiwiJyonIiwiJy8nIiwiJyUnIiwiSU5DUkVNRU5UIiwiREVDUkVNRU5UIiwiJy4nIiwiJ1snIiwiJygnIiwKLSInKSciLCIneyciLCInfSciLCInXSciLCInficiLCInISciLCInOiciLCJzdGFydCIsInR5cGVfZXhwIiwiUHJpbWl0aXZlT3JBcnJheVR5cGUiLAotIlN0cmluZ0xpdGVyYWwiLCJMaXRlcmFsIiwiUHJpbWl0aXZlVHlwZSIsIk51bWVyaWNUeXBlIiwiSW50ZWdyYWxUeXBlIiwiRmxvYXRpbmdQb2ludFR5cGUiLAotIkNsYXNzT3JJbnRlcmZhY2VUeXBlIiwiQ2xhc3NUeXBlIiwiQXJyYXlUeXBlIiwiTmFtZSIsIkZvcmNlZE5hbWUiLCJTaW1wbGVOYW1lIiwKLSJRdWFsaWZpZWROYW1lIiwiZXhwMSIsIlByaW1hcnkiLCJQcmltYXJ5Tm9OZXdBcnJheSIsImxjdXJseSIsInJjdXJseSIsIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24iLAotIkFyZ3VtZW50TGlzdCIsIkFyZ3VtZW50TGlzdF9vcHQiLCJBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiIsIkRpbUV4cHJzIiwiRGltRXhwciIsCi0iRGltcyIsIkRpbXNfb3B0IiwiRmllbGRBY2Nlc3MiLCJNZXRob2RJbnZvY2F0aW9uIiwiQXJyYXlBY2Nlc3MiLCJQb3N0Zml4RXhwcmVzc2lvbiIsCi0iUG9zdEluY3JlbWVudEV4cHJlc3Npb24iLCJQb3N0RGVjcmVtZW50RXhwcmVzc2lvbiIsIlVuYXJ5RXhwcmVzc2lvbiIsIlByZUluY3JlbWVudEV4cHJlc3Npb24iLAotIlByZURlY3JlbWVudEV4cHJlc3Npb24iLCJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMiLCJDYXN0RXhwcmVzc2lvbiIsIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsCi0iQWRkaXRpdmVFeHByZXNzaW9uIiwiU2hpZnRFeHByZXNzaW9uIiwiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJFcXVhbGl0eUV4cHJlc3Npb24iLAotIkFuZEV4cHJlc3Npb24iLCJFeGNsdXNpdmVPckV4cHJlc3Npb24iLCJJbmNsdXNpdmVPckV4cHJlc3Npb24iLCJDb25kaXRpb25hbEFuZEV4cHJlc3Npb24iLAotIkNvbmRpdGlvbmFsT3JFeHByZXNzaW9uIiwiQ29uZGl0aW9uYWxFeHByZXNzaW9uIiwiQXNzaWdubWVudEV4cHJlc3Npb24iLCJBc3NpZ25tZW50IiwKLSJMZWZ0SGFuZFNpZGUiLCJFeHByZXNzaW9uIiwgTlVMTAotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyMVtdID0geyAgICAgMCwKLSAgICA1NywgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjEsICAgIDYxLCAgICA2MSwKLSAgICA2MSwgICAgNjIsICAgIDYyLCAgICA2MywgICAgNjMsICAgIDY0LCAgICA2NCwgICAgNjQsICAgIDY0LCAgICA2NCwKLSAgICA2NSwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY4LCAgICA2OSwgICAgNjksICAgIDcwLCAgICA3MCwKLSAgICA3MSwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzMsICAgIDc0LCAgICA3NCwgICAgNzUsICAgIDc1LCAgICA3NSwKLSAgICA3NSwgICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzUsICAgIDc2LCAgICA3NywgICAgNzgsICAgIDc5LCAgICA3OSwKLSAgICA4MCwgICAgODAsICAgIDgxLCAgICA4MSwgICAgODIsICAgIDgyLCAgICA4MywgICAgODQsICAgIDg0LCAgICA4NSwKLSAgICA4NSwgICAgODYsICAgIDg2LCAgICA4NywgICAgODcsICAgIDg3LCAgICA4OCwgICAgODgsICAgIDg4LCAgICA4OSwKLSAgICA4OSwgICAgODksICAgIDg5LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTIsICAgIDkyLCAgICA5MiwKLSAgICA5MiwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk1LCAgICA5NSwgICAgOTUsICAgIDk2LCAgICA5NiwKLSAgICA5NiwgICAgOTcsICAgIDk3LCAgICA5NywgICAgOTcsICAgIDk4LCAgICA5OCwgICAgOTgsICAgIDk5LCAgICA5OSwKLSAgICA5OSwgICAxMDAsICAgMTAwLCAgIDEwMCwgICAxMDAsICAgMTAwLCAgIDEwMSwgICAxMDEsICAgMTAxLCAgIDEwMiwKLSAgIDEwMiwgICAxMDMsICAgMTAzLCAgIDEwNCwgICAxMDQsICAgMTA1LCAgIDEwNSwgICAxMDYsICAgMTA2LCAgIDEwNywKLSAgIDEwNywgICAxMDgsICAgMTA4LCAgIDEwOSwgICAxMDksICAgMTEwLCAgIDExMCwgICAxMTAsICAgMTEwLCAgIDExMQotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cjJbXSA9IHsgICAgIDAsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgIDEsICAgICAxLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDEsICAgICA1LCAgICAgMSwgICAgIDMsCi0gICAgIDAsICAgICAxLCAgICAgNCwgICAgIDQsICAgICAxLCAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMywgICAgIDEsCi0gICAgIDAsICAgICAzLCAgICAgMywgICAgIDQsICAgICA2LCAgICAgNiwgICAgIDQsICAgICA0LCAgICAgNCwgICAgIDEsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAxLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgNSwgICAgIDQsCi0gICAgIDUsICAgICAxLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDMsCi0gICAgIDMsICAgICAxLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMywgICAgIDEsCi0gICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsCi0gICAgIDUsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0geyAgICAgMCwKLSAgICAgNywgICAgIDksICAgIDI3LCAgICAgNiwgICAgMTAsICAgICA4LCAgICAxOSwgICAgMTcsICAgIDE2LCAgICAxOCwKLSAgICAyMCwgICAgMTMsICAgIDIyLCAgICAyMSwgICAgNzIsICAgIDM5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDYsICAgICAwLCAgICAgMCwgICAgIDIsICAgICAzLCAgICAxMSwKLSAgICAzOCwgICAgIDQsICAgIDEyLCAgICAxNCwgICAgMTUsICAgICA1LCAgICA3MSwgICAxMjYsICAgIDI5LCAgICAyOCwKLSAgICAgMSwgICAgNzAsICAgIDM2LCAgICAgMCwgICAgNDEsICAgIDM3LCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA4NSwKLSAgICA3MywgICAgNzQsICAgIDkyLCAgICA3NywgICAgNzgsICAgIDgyLCAgICA4OCwgICAgOTYsICAgIDk5LCAgIDEwMiwKLSAgIDEwNywgICAxMTAsICAgMTEyLCAgIDExNCwgICAxMTYsICAgMTE4LCAgIDEyMCwgICAxMjIsICAgMTMwLCAgIDEyMywKLSAgICAgMCwgICAgMzQsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI3LCAgICAgMCwgICAgMjQsICAgICAwLCAgICAyMywKLSAgICAyOCwgICAgIDgsICAgIDcyLCAgICA3MSwgICAgNDIsICAgIDQ0LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MywKLSAgICA4NCwgICAgNjEsICAgIDcxLCAgICAgMCwgICAgODYsICAgIDg3LCAgICAgMCwgICAgMjUsICAgICAwLCAgICAgMCwKLSAgICA1MSwgICAgMjYsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0OSwgICAgNzUsICAgIDc2LCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAzMSwgICAgMzIsICAgIDYzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA2MSwgICAgNTUsICAgIDYxLCAgICA1MSwKLSAgICAgMCwgICAgNjAsICAgICAwLCAgICAgMCwgICAgNDAsICAgIDU4LCAgICAgMCwgICAgMzMsICAgICAwLCAgICA1MiwKLSAgICAgMCwgICAgMzUsICAgIDYyLCAgICAgMCwgICAgIDAsICAgIDQ3LCAgICA0NSwgICAgOTMsICAgIDk0LCAgICA5NSwKLSAgICA5NywgICAgOTgsICAgMTAwLCAgIDEwMSwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTA4LCAgIDEwOSwKLSAgIDExMSwgICAxMTMsICAgMTE1LCAgIDExNywgICAgIDAsICAgMTE5LCAgIDEyNSwgICAxMjQsICAgIDY4LCAgICA1MSwKLSAgICAgMCwgICAgIDAsICAgIDU2LCAgICA1MywgICAgNTQsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDkwLCAgICA1OSwKLSAgICA2NywgICAgNjQsICAgIDUxLCAgICA2OSwgICAgNTAsICAgICAwLCAgICAgMCwgICAgNTcsICAgIDQ4LCAgICA4OSwKLSAgICA5MSwgICAgIDAsICAgMTIxLCAgICA2NiwgICAgNjUsICAgICAwLCAgICAgMCwgICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmdvdG9bXSA9IHsgICAyMDYsCi0gICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsICAgIDM1LCAgICA3OCwgICAgNzksCi0gICAgMzYsICAgIDg0LCAgICAzOCwgICAgMzksICAgIDgxLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAxNTcsCi0gICAgNDUsICAgMTUwLCAgIDE1MSwgICAgNDYsICAgMTM3LCAgIDEzOCwgICAxNDIsICAgMTQzLCAgICA4NSwgICAgNDgsCi0gICAgODYsICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsCi0gICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsCi0gICAgNjksICAgIDcwLCAgICA3MSwgICAxMDcKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXBhY3RbXSA9IHsgICAyMDYsCi0tMzI3NjgsLTMyNzY4LCAgICAtNSwtMzI3NjgsLTMyNzY4LCAgICAtMywtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgICAxLC0zMjc2OCwgICAtMzQsICAgMjI1LCAgIDMxMiwgICAzMTIsCi0gICAzMTIsICAgMzEyLCAgIDMxMiwgICAyMDYsLTMyNzY4LCAgIDMxMiwgICAzMTIsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsICAgLTIzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgMzQsLTMyNzY4LC0zMjc2OCwgICAgIDcsCi0gICAgIDQsICAgLTI4LCAgIC0xNywgICAzNjUsLTMyNzY4LC0zMjc2OCwgICAgMTUsLTMyNzY4LCAgICAyMSwgICAgNzQsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDQ1LCAgICA0NCwgICAgODYsCi0gICAgMzUsICAgIDk2LCAgICAgMywgICAgMjMsICAgICA4LCAgICA1MSwgICAxMDQsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0gICAgMzIsLTMyNzY4LCAgICA0NiwgICAzNjUsICAgIDQ2LC0zMjc2OCwgICAgMjUsICAgIDI1LCAgICAxNCwgICAgNTUsCi0tMzI3NjgsLTMyNzY4LCAgICA4NywgICAgNDcsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsICAgLTIzLCAgICAzNCwgICAgNDAsLTMyNzY4LC0zMjc2OCwgICAgNTcsICAgIDUwLCAgICA0NiwgICAyNTksCi0gICAzNjUsICAgIDUwLCAgIDM2NSwgICAgNDYsICAgMzY1LCAgIC0xMywtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAzMTIsCi0gICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsCi0gICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzNjUsICAgMzEyLCAgIDMxMiwgICAzMTIsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgNjEsICAgIDU5LCAgIDM2NSwgICAgNTYsLTMyNzY4LCAgICA1NiwgICAzNjUsCi0gICAzNjUsICAgIDUwLCAgICA2NiwgICAgNDMsICAgMzcyLC0zMjc2OCwgICAgNjksLTMyNzY4LCAgICA3MywgICAxMDgsCi0gICAxMDYsLTMyNzY4LCAgIDExMSwgICAxMDksICAgMzY1LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0gICAgNDUsICAgIDQ1LCAgICA0NCwgICAgNDQsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICAzNSwgICAgMzUsCi0gICAgOTYsICAgICAzLCAgICAyMywgICAgIDgsICAgMTA3LCAgICA1MSwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAzNjUsCi0gICAxMTIsICAgMjU5LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDExNCwgICAzMTIsICAgMzcyLC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LCAgIDM2NSwtMzI3NjgsLTMyNzY4LCAgIDMxMiwgICAxMTYsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsICAgMTE4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDE2OSwgICAxNzAsLTMyNzY4Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwZ290b1tdID0gey0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgLTgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwgICAgIDUsLTMyNzY4LCAgIC02NiwgICAgIDAsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwgICAxMjcsICAtMTI2LC0zMjc2OCwgICAgOTQsICAgLTk0LCAgIC0yOSwgICAtNDAsICAgICA2LC0zMjc2OCwKLSAgICAxMiwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgMzksLTMyNzY4LC0zMjc2OCwgIC0xNDEsLTMyNzY4LCAgICAyNCwKLSAgICAyOCwgICAtNDIsICAgIDM2LCAgICA1MiwgICAgNTMsICAgIDQ5LCAgICA1OCwgICAgNDgsLTMyNzY4LCAgLTEyOCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAxOAotfTsKLQotCi0jZGVmaW5lCVlZTEFTVAkJNDI3Ci0KLQotc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9IHsgICAgNDAsCi0gICAxNzcsICAgMTc4LCAgICA5OCwgICAxODksICAgIDM3LCAgICA0NywgICAxMzMsICAgMTAyLCAgIDEzNSwgICAgNzcsCi0gICAxNTUsICAgIDQ5LCAgICA3NSwgICAxODYsICAgLTMxLCAgICA5MiwgICAtMzIsICAgIDcyLCAgIDEwNCwgICAtMzEsCi0gIC0xMjcsICAgLTMyLCAgICA4MCwgICAgNDAsICAgIDk3LCAgLTEyNywgICAtMzAsICAgMTAzLCAgICA5MywgICAgNDcsCi0gICAxMDUsICAgLTMwLCAgIDE0OCwgICAxMjMsICAtMTI4LCAgICA0OSwgICAxMjUsICAgMTUzLCAgIDE1NiwgIC0xMjgsCi0gIC0xMjksICAgIDk0LCAgIDE4MywgICAgNDAsICAgMTgzLCAgLTEyOSwgICAyMDEsICAgIDczLCAgICA3NCwgICAgNDcsCi0gICAxMzEsICAgMTI5LCAgIDEyNCwgICAxOTcsICAgMTMyLCAgICA0OSwgICAxMzAsICAgIDg3LCAgICA4OCwgICAgODksCi0gICAgOTAsICAgIDkxLCAgIDE0MCwgICAxNDQsICAgIDk1LCAgICA5NiwgICAyMDIsICAgMjAzLCAgIDExNywgICAxMTgsCi0gICAxMTksICAgMTIwLCAgIDEzNiwgICAgNDAsICAgMTY1LCAgIDE2NiwgICAxNjcsICAgMTY4LCAgIDEyNiwgICAgNDcsCi0gICAgOTksICAgMTAwLCAgIDEwMSwgICAxMTMsICAgMTE0LCAgICA0OSwgICAxMTAsICAgMTExLCAgIDExMiwgICAxNDUsCi0gICAxNDcsICAgMTM0LCAgIDE4OCwgICAgOTksICAgMTQxLCAgIDEwMSwgICAxODQsICAgMTQ3LCAgIDE4NSwgICAgNDAsCi0gICAgNDAsICAgIDk5LCAgICA0MCwgICAxODIsICAgIDQwLCAgICA0NywgICAgNDcsICAgMTgwLCAgICA0NywgICAxNDYsCi0gICAgNDcsICAgIDQ5LCAgICA0OSwgICAxNzksICAgIDQ5LCAgIDE4NywgICAgNDksICAgMTQ5LCAgIDEwOCwgICAxMDksCi0gICAxNTIsICAgMTkwLCAgIDE1NCwgICAxMTUsICAgMTE2LCAgIDE5MSwgICAgNDAsICAgMTIxLCAgIDEyMiwgICAxMjcsCi0gICAxMjgsICAgMTU1LCAgICA0NywgICAgNzMsICAgIDc0LCAgICA0MCwgICAxNjEsICAgMTYyLCAgICA0OSwgICAgNDAsCi0gICAgNDAsICAgIDQ3LCAgIDE2MywgICAxNjQsICAgMTc1LCAgICA0NywgICAgNDcsICAgIDQ5LCAgIDE1OCwgICAxNTksCi0gICAxNjAsICAgIDQ5LCAgICA0OSwgICAxODEsICAgIDQwLCAgIDE5MiwgICAxNjksICAgMTcwLCAgIDE0OSwgICAxOTMsCi0gICAgNDcsICAgMTk0LCAgIDE5NiwgICAxOTksICAgMTk4LCAgIDIwNCwgICAgNDksICAgMjA1LCAgIDIwNywgICAyMDgsCi0gICAxMDYsICAgMTM5LCAgIDE5NSwgICAxNzMsICAgMTcxLCAgIDE3NiwgICAxNzIsICAgICAwLCAgICAgMCwgICAgNDAsCi0gICAgIDAsICAgIDQwLCAgICAgMCwgICAxNzQsICAgICAwLCAgICA0NywgICAgIDAsICAgIDQ3LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgIDQ5LCAgICA0MCwgICAgNDksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0NywgICAxODEsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMSwgICAgIDIsCi0gICAgIDMsICAgICA0LCAgICAgNSwgICAgIDAsICAgICA2LCAgICAgMCwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsCi0gICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgIDIwMCwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgNzYsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsCi0gICAgMTIsICAgIDEzLCAgICAxNCwgICAgIDAsICAgICAwLCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAgMCwgICAgIDAsCi0gICAgMjIsICAgIDIzLCAgICAgMCwgICAgIDAsICAgIDI0LCAgICAgMCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgMjYsCi0gICAgMjcsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDAsICAgICA2LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE1LCAgICAgMCwgICAgMTYsCi0gICAgMTcsICAgIDE4LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxOSwgICAgMjAsCi0gICAgMjEsICAgICAwLCAgICAgMCwgICAgMjIsICAgIDIzLCAgICAgMCwgICAgIDAsICAgIDI0LCAgICAgMCwgICAgMjUsCi0gICAgIDAsICAgMTQ2LCAgICAyNiwgICAgMjcsICAgICAxLCAgICAgMiwgICAgNzYsICAgICA0LCAgICAgNSwgICAgIDAsCi0gICAgODIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgODMsICAgICAwLCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgIDE5LCAgICAyMCwgICAgMjEsICAgICAwLCAgICAgMCwgICAgMjIsICAgIDIzLCAgICAgMCwgICAgIDAsCi0gICAgMjQsICAgICAwLCAgICAyNSwgICAgIDAsICAgICAwLCAgICAyNiwgICAgMjcsICAgICAxLCAgICAgMiwgICAgIDMsCi0gICAgIDQsICAgICA1LCAgICAgMCwgICAgIDYsICAgICAxLCAgICAgMiwgICAgNzYsICAgICA0LCAgICAgNSwgICAgIDAsCi0gICAgODIsICAgICAwLCAgICAgMCwgICAgMTUsICAgICAwLCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAgMCwgICAgIDAsCi0gICAgODMsICAgICAwLCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE5LCAgICAyMCwgICAgMjEsICAgICAwLCAgICAgMCwgICAgMjIsCi0gICAgMjMsICAgICAwLCAgICAgMCwgICAgMjQsICAgICAwLCAgICAyNSwgICAgIDAsICAgICAwLCAgICAyNiwgICAgMjcsCi0gICAgMjQsICAgICAwLCAgICAyNSwgICAgIDAsICAgICAwLCAgICAyNiwgICAgMjcKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPSB7ICAgICAwLAotICAgMTI5LCAgIDEzMCwgICAgMzIsICAgMTQ1LCAgICAgMCwgICAgIDAsICAgIDczLCAgICAzNywgICAgNzUsICAgIDE4LAotICAgIDI0LCAgICAgMCwgICAgNDcsICAgMTQwLCAgICAyMCwgICAgMjQsICAgIDIwLCAgICAgMCwgICAgNDcsICAgIDI1LAotICAgIDIwLCAgICAyNSwgICAgMTgsICAgIDI0LCAgICA0OCwgICAgMjUsICAgIDIwLCAgICAyNCwgICAgMjQsICAgIDI0LAotICAgIDQ4LCAgICAyNSwgICAgOTksICAgIDMxLCAgICAyMCwgICAgMjQsICAgIDI5LCAgIDEwNCwgICAgNTIsICAgIDI1LAotICAgIDIwLCAgICAyNCwgICAxMzcsICAgIDQ0LCAgIDEzOSwgICAgMjUsICAgMTg4LCAgICA0NywgICAgNDgsICAgIDQ0LAotICAgICA1LCAgICAyMCwgICAgMzAsICAgMTgwLCAgICAgOSwgICAgNDQsICAgIDI1LCAgICAxOSwgICAgMjAsICAgIDIxLAotICAgIDIyLCAgICAyMywgICAgNDksICAgIDkzLCAgICAyNiwgICAgMjcsICAgMTkzLCAgIDE5NiwgICAgMzQsICAgIDM1LAotICAgIDM2LCAgICAzNywgICAgNDgsICAgIDc0LCAgIDExNywgICAxMTgsICAgMTE5LCAgIDEyMCwgICAgMjgsICAgIDc0LAotICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDQwLCAgICA0MSwgICAgNzQsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDUwLAotICAgIDQ4LCAgICA3NCwgICAgNTAsICAgIDQ3LCAgICA0OCwgICAgNDksICAgMTM3LCAgICA0OCwgICAxMzksICAgMTAwLAotICAgMTAxLCAgICA0NywgICAxMDMsICAgIDQ4LCAgIDEwNSwgICAxMDAsICAgMTAxLCAgICA0OSwgICAxMDMsICAgIDUzLAotICAgMTA1LCAgIDEwMCwgICAxMDEsICAgIDUzLCAgIDEwMywgICAgNTAsICAgMTA1LCAgIDEwMCwgICAgNDUsICAgIDQ2LAotICAgMTAzLCAgICA1MywgICAxMDUsICAgIDM4LCAgICAzOSwgICAgNTMsICAgMTI3LCAgICAzMiwgICAgMzMsICAgIDI2LAotICAgIDI3LCAgICAyNCwgICAxMjcsICAgIDQ3LCAgICA0OCwgICAxMzYsICAgMTEzLCAgIDExNCwgICAxMjcsICAgMTQwLAotICAgMTQxLCAgIDEzNiwgICAxMTUsICAgMTE2LCAgIDEyNywgICAxNDAsICAgMTQxLCAgIDEzNiwgICAxMTAsICAgMTExLAotICAgMTEyLCAgIDE0MCwgICAxNDEsICAgMTM2LCAgIDE1NSwgICAgNTAsICAgMTIxLCAgIDEyMiwgICAxNDEsICAgIDQ5LAotICAgMTU1LCAgICA1MywgICAgNTYsICAgIDUwLCAgICA1MywgICAgNTAsICAgMTU1LCAgICA1MCwgICAgIDAsICAgICAwLAotICAgIDQ0LCAgICA3OCwgICAxNTUsICAgMTI1LCAgIDEyMywgICAxMjgsICAgMTI0LCAgICAtMSwgICAgLTEsICAgMTgwLAotICAgIC0xLCAgIDE4MiwgICAgLTEsICAgMTI2LCAgICAtMSwgICAxODAsICAgIC0xLCAgIDE4MiwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgIDE4MCwgICAxOTMsICAgMTgyLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAxOTMsICAgMTgyLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgIDE5MywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgIDMsICAgICA0LAotICAgICA1LCAgICAgNiwgICAgIDcsICAgIC0xLCAgICAgOSwgICAgLTEsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAotICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAxODcsICAgIDIxLCAgICAyMiwgICAgMjMsICAgICA1LAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotICAgIDE2LCAgICAxNywgICAgMTgsICAgIC0xLCAgICAtMSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgLTEsICAgIC0xLAotICAgIDQ1LCAgICA0NiwgICAgLTEsICAgIC0xLCAgICA0OSwgICAgLTEsICAgIDUxLCAgICAtMSwgICAgLTEsICAgIDU0LAotICAgIDU1LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgIC0xLCAgICAgOSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAxOSwgICAgLTEsICAgIDIxLAotICAgIDIyLCAgICAyMywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDAsICAgIDQxLAotICAgIDQyLCAgICAtMSwgICAgLTEsICAgIDQ1LCAgICA0NiwgICAgLTEsICAgIC0xLCAgICA0OSwgICAgLTEsICAgIDUxLAotICAgIC0xLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgIC0xLAotICAgICA5LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAotICAgIDE5LCAgICAtMSwgICAgMjEsICAgIDIyLCAgICAyMywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICA0MCwgICAgNDEsICAgIDQyLCAgICAtMSwgICAgLTEsICAgIDQ1LCAgICA0NiwgICAgLTEsICAgIC0xLAotICAgIDQ5LCAgICAtMSwgICAgNTEsICAgIC0xLCAgICAtMSwgICAgNTQsICAgIDU1LCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgLTEsICAgICA5LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgIC0xLAotICAgICA5LCAgICAtMSwgICAgLTEsICAgIDE5LCAgICAtMSwgICAgMjEsICAgIDIyLCAgICAyMywgICAgLTEsICAgIC0xLAotICAgIDE5LCAgICAtMSwgICAgMjEsICAgIDIyLCAgICAyMywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0MCwgICAgNDEsICAgIDQyLCAgICAtMSwgICAgLTEsICAgIDQ1LAotICAgIDQ2LCAgICAtMSwgICAgLTEsICAgIDQ5LCAgICAtMSwgICAgNTEsICAgIC0xLCAgICAtMSwgICAgNTQsICAgIDU1LAotICAgIDQ5LCAgICAtMSwgICAgNTEsICAgIC0xLCAgICAtMSwgICAgNTQsICAgIDU1Ci19OwotLyogLSotQy0qLSAgTm90ZSBzb21lIGNvbXBpbGVycyBjaG9rZSBvbiBjb21tZW50cyBvbiBgI2xpbmUnIGxpbmVzLiAgKi8KLSNsaW5lIDMgIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0KLS8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAotICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQotICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KLSAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCi0KLSNpZm5kZWYgYWxsb2NhCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlIC8qIG5vdCBHTlUgQy4gICovCi0jaWYgKCFkZWZpbmVkIChfX1NURENfXykgJiYgZGVmaW5lZCAoc3BhcmMpKSB8fCBkZWZpbmVkIChfX3NwYXJjX18pIHx8IGRlZmluZWQgKF9fc3BhcmMpIHx8IGRlZmluZWQgKF9fc2dpKQotI2luY2x1ZGUgPGFsbG9jYS5oPgotI2Vsc2UgLyogbm90IHNwYXJjICovCi0jaWYgZGVmaW5lZCAoTVNET1MpICYmICFkZWZpbmVkIChfX1RVUkJPQ19fKQotI2Vsc2UgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCi0jaWYgZGVmaW5lZChfQUlYKQotICNwcmFnbWEgYWxsb2NhCi0jZWxzZSAvKiBub3QgTVNET1MsIF9fVFVSQk9DX18sIG9yIF9BSVggKi8KLSNpZmRlZiBfX2hwdXgKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci12b2lkICphbGxvY2EgKHVuc2lnbmVkIGludCk7Ci19OwotI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCi12b2lkICphbGxvY2EgKCk7Ci0jZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogX19ocHV4ICovCi0jZW5kaWYgLyogbm90IF9BSVggKi8KLSNlbmRpZiAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KLSNlbmRpZiAvKiBub3Qgc3BhcmMuICAqLwotI2VuZGlmIC8qIG5vdCBHTlUgQy4gICovCi0jZW5kaWYgLyogYWxsb2NhIG5vdCBkZWZpbmVkLiAgKi8KLQotLyogVGhpcyBpcyB0aGUgcGFyc2VyIGNvZGUgdGhhdCBpcyB3cml0dGVuIGludG8gZWFjaCBiaXNvbiBwYXJzZXIKLSAgd2hlbiB0aGUgJXNlbWFudGljX3BhcnNlciBkZWNsYXJhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBncmFtbWFyLgotICBJdCB3YXMgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBoYWlyeSBwYXJzZXIKLSAgdXNlZCB3aGVuICVzZW1hbnRpY19wYXJzZXIgaXMgc3BlY2lmaWVkLiAgKi8KLQotLyogTm90ZTogdGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBkb2xsYXIgc2lnbiBpbiB0aGlzIGZpbGUuCi0gICBJdCBpcyByZXBsYWNlZCBieSB0aGUgbGlzdCBvZiBhY3Rpb25zLCBlYWNoIGFjdGlvbgotICAgYXMgb25lIGNhc2Ugb2YgdGhlIHN3aXRjaC4gICovCi0KLSNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKLSNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQotI2RlZmluZSBZWUVNUFRZCQktMgotI2RlZmluZSBZWUVPRgkJMAotI2RlZmluZSBZWUFDQ0VQVAlyZXR1cm4oMCkKLSNkZWZpbmUgWVlBQk9SVCAJcmV0dXJuKDEpCi0jZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJsYWIxCi0vKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4KLSAgIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5IHRvIGVhc2UgdGhlCi0gICB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgotICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLwotI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKLSNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQotI2RlZmluZSBZWUJBQ0tVUCh0b2tlbiwgdmFsdWUpIFwKLWRvCQkJCQkJCQlcCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCi0gICAgeyB5eWNoYXIgPSAodG9rZW4pLCB5eWx2YWwgPSAodmFsdWUpOwkJCVwKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAotICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCi0gICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKLSAgICB9CQkJCQkJCQlcCi0gIGVsc2UJCQkJCQkJCVwKLSAgICB7IHl5ZXJyb3IgKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIik7IFlZRVJST1I7IH0JXAotd2hpbGUgKDApCi0KLSNkZWZpbmUgWVlURVJST1IJMQotI2RlZmluZSBZWUVSUkNPREUJMjU2Ci0KLSNpZm5kZWYgWVlQVVJFCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgpCi0jZW5kaWYKLQotI2lmZGVmIFlZUFVSRQotI2lmZGVmIFlZTFNQX05FRURFRAotI2lmZGVmIFlZTEVYX1BBUkFNCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jLCBZWUxFWF9QQVJBTSkKLSNlbHNlCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jKQotI2VuZGlmCi0jZWxzZSAvKiBub3QgWVlMU1BfTkVFREVEICovCi0jaWZkZWYgWVlMRVhfUEFSQU0KLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwpCi0jZW5kaWYKLSNlbmRpZiAvKiBub3QgWVlMU1BfTkVFREVEICovCi0jZW5kaWYKLQotLyogSWYgbm9ucmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUgKi8KLQotI2lmbmRlZiBZWVBVUkUKLQotaW50CXl5Y2hhcjsJCQkvKiAgdGhlIGxvb2thaGVhZCBzeW1ib2wJCSovCi1ZWVNUWVBFCXl5bHZhbDsJCQkvKiAgdGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZQkJKi8KLQkJCQkvKiAgbG9va2FoZWFkIHN5bWJvbAkJCSovCi0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLVlZTFRZUEUgeXlsbG9jOwkJCS8qICBsb2NhdGlvbiBkYXRhIGZvciB0aGUgbG9va2FoZWFkCSovCi0JCQkJLyogIHN5bWJvbAkJCQkqLwotI2VuZGlmCi0KLWludCB5eW5lcnJzOwkJCS8qICBudW1iZXIgb2YgcGFyc2UgZXJyb3JzIHNvIGZhciAgICAgICAqLwotI2VuZGlmICAvKiBub3QgWVlQVVJFICovCi0KLSNpZiBZWURFQlVHICE9IDAKLWludCB5eWRlYnVnOwkJCS8qICBub256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlCSovCi0vKiBTaW5jZSB0aGlzIGlzIHVuaW5pdGlhbGl6ZWQsIGl0IGRvZXMgbm90IHN0b3AgbXVsdGlwbGUgcGFyc2VycwotICAgZnJvbSBjb2V4aXN0aW5nLiAgKi8KLSNlbmRpZgotCi0vKiAgWVlJTklUREVQVEggaW5kaWNhdGVzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcwkqLwotCi0jaWZuZGVmCVlZSU5JVERFUFRICi0jZGVmaW5lIFlZSU5JVERFUFRIIDIwMAotI2VuZGlmCi0KLS8qICBZWU1BWERFUFRIIGlzIHRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0bwotICAgIChlZmZlY3RpdmUgb25seSBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4gICovCi0KLSNpZiBZWU1BWERFUFRIID09IDAKLSN1bmRlZiBZWU1BWERFUFRICi0jZW5kaWYKLQotI2lmbmRlZiBZWU1BWERFUFRICi0jZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHdhcm5pbmcgaWYgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCi0jaWZkZWYgX19HTlVDX18KLWludCB5eXBhcnNlICh2b2lkKTsKLSNlbmRpZgotDAotI2lmIF9fR05VQ19fID4gMQkJLyogR05VIEMgYW5kIEdOVSBDKysgZGVmaW5lIHRoaXMuICAqLwotI2RlZmluZSBfX3l5X21lbWNweShUTyxGUk9NLENPVU5UKQlfX2J1aWx0aW5fbWVtY3B5KFRPLEZST00sQ09VTlQpCi0jZWxzZQkJCQkvKiBub3QgR05VIEMgb3IgQysrICovCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCi0gICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCi1zdGF0aWMgdm9pZAotX195eV9tZW1jcHkgKHRvLCBmcm9tLCBjb3VudCkKLSAgICAgY2hhciAqdG87Ci0gICAgIGNoYXIgKmZyb207Ci0gICAgIGludCBjb3VudDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207Ci0gIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKLSAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKLQotICB3aGlsZSAoaS0tID4gMCkKLSAgICAqdCsrID0gKmYrKzsKLX0KLQotI2Vsc2UgLyogX19jcGx1c3BsdXMgKi8KLQotLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKLSAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1fX3l5X21lbWNweSAoY2hhciAqdG8sIGNoYXIgKmZyb20sIGludCBjb3VudCkKLXsKLSAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207Ci0gIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKLSAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKLQotICB3aGlsZSAoaS0tID4gMCkKLSAgICAqdCsrID0gKmYrKzsKLX0KLQotI2VuZGlmCi0jZW5kaWYKLQwKLSNsaW5lIDE5NiAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQotLyogVGhlIHVzZXIgY2FuIGRlZmluZSBZWVBBUlNFX1BBUkFNIGFzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAotICAgaW50byB5eXBhcnNlLiAgVGhlIGFyZ3VtZW50IHNob3VsZCBoYXZlIHR5cGUgdm9pZCAqLgotICAgSXQgc2hvdWxkIGFjdHVhbGx5IHBvaW50IHRvIGFuIG9iamVjdC4KLSAgIEdyYW1tYXIgYWN0aW9ucyBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZSBieSBjYXN0aW5nIGl0Ci0gICB0byB0aGUgcHJvcGVyIHBvaW50ZXIgdHlwZS4gICovCi0KLSNpZmRlZiBZWVBBUlNFX1BBUkFNCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgdm9pZCAqWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSNlbHNlIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyBZWVBBUlNFX1BBUkFNCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTCB2b2lkICpZWVBBUlNFX1BBUkFNOwotI2VuZGlmIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2Vsc2UgLyogbm90IFlZUEFSU0VfUEFSQU0gKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZW5kaWYgLyogbm90IFlZUEFSU0VfUEFSQU0gKi8KLQotaW50Ci15eXBhcnNlKFlZUEFSU0VfUEFSQU1fQVJHKQotICAgICBZWVBBUlNFX1BBUkFNX0RFQ0wKLXsKLSAgcmVnaXN0ZXIgaW50IHl5c3RhdGU7Ci0gIHJlZ2lzdGVyIGludCB5eW47Ci0gIHJlZ2lzdGVyIHNob3J0ICp5eXNzcDsKLSAgcmVnaXN0ZXIgWVlTVFlQRSAqeXl2c3A7Ci0gIGludCB5eWVycnN0YXR1czsJLyogIG51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQgKi8KLSAgaW50IHl5Y2hhcjEgPSAwOwkJLyogIGxvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyICovCi0KLSAgc2hvcnQJeXlzc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHN0YXRlIHN0YWNrCQkJKi8KLSAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc2VtYW50aWMgdmFsdWUgc3RhY2sJCSovCi0KLSAgc2hvcnQgKnl5c3MgPSB5eXNzYTsJCS8qICByZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMgKi8KLSAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOwkvKiAgdG8gYWxsb3cgeXlvdmVyZmxvdyB0byB4cmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZSAqLwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIGxvY2F0aW9uIHN0YWNrCQkJKi8KLSAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOwotICBZWUxUWVBFICp5eWxzcDsKLQotI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCi0jZWxzZQotI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCi0jZW5kaWYKLQotICBpbnQgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKLQotI2lmZGVmIFlZUFVSRQotICBpbnQgeXljaGFyOwotICBZWVNUWVBFIHl5bHZhbDsKLSAgaW50IHl5bmVycnM7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIFlZTFRZUEUgeXlsbG9jOwotI2VuZGlmCi0jZW5kaWYKLQotICBZWVNUWVBFIHl5dmFsOwkJLyogIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJldHVybgkJKi8KLQkJCQkvKiAgc2VtYW50aWMgdmFsdWVzIGZyb20gdGhlIGFjdGlvbgkqLwotCQkJCS8qICByb3V0aW5lcwkJCQkqLwotCi0gIGludCB5eWxlbjsKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKTsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSAwOwotICB5eWVycnN0YXR1cyA9IDA7Ci0gIHl5bmVycnMgPSAwOwotICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KLQotICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgotICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKLSAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgotICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCi0KLSAgeXlzc3AgPSB5eXNzIC0gMTsKLSAgeXl2c3AgPSB5eXZzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCA9IHl5bHM7Ci0jZW5kaWYKLQotLyogUHVzaCBhIG5ldyBzdGF0ZSwgd2hpY2ggaXMgZm91bmQgaW4gIHl5c3RhdGUgIC4gICovCi0vKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcwotICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KLXl5bmV3c3RhdGU6Ci0KLSAgKisreXlzc3AgPSB5eXN0YXRlOwotCi0gIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotICAgIHsKLSAgICAgIC8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byB4cmVhbGxvY2F0ZSB0aGUgc3RhY2sgKi8KLSAgICAgIC8qIFVzZSBjb3BpZXMgb2YgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50byBtZW1vcnkuICovCi0gICAgICBZWVNUWVBFICp5eXZzMSA9IHl5dnM7Ci0gICAgICBzaG9ydCAqeXlzczEgPSB5eXNzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgWVlMVFlQRSAqeXlsczEgPSB5eWxzOwotI2VuZGlmCi0KLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLwotICAgICAgaW50IHNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOwotCi0jaWZkZWYgeXlvdmVyZmxvdwotICAgICAgLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YKLQkgdGhlIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgKi8KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIC8qIFRoaXMgdXNlZCB0byBiZSBhIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywKLQkgYnV0IHRoYXQgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCi0gICAgICB5eW92ZXJmbG93KCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgJnl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgJnl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgJnl5bHMxLCBzaXplICogc2l6ZW9mICgqeXlsc3ApLAotCQkgJnl5c3RhY2tzaXplKTsKLSNlbHNlCi0gICAgICB5eW92ZXJmbG93KCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgJnl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgJnl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgJnl5c3RhY2tzaXplKTsKLSNlbmRpZgotCi0gICAgICB5eXNzID0geXlzczE7IHl5dnMgPSB5eXZzMTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHMgPSB5eWxzMTsKLSNlbmRpZgotI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLwotICAgICAgLyogRXh0ZW5kIHRoZSBzdGFjayBvdXIgb3duIHdheS4gICovCi0gICAgICBpZiAoeXlzdGFja3NpemUgPj0gWVlNQVhERVBUSCkKLQl7Ci0JICB5eWVycm9yKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICAgIHl5c3RhY2tzaXplICo9IDI7Ci0gICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQotCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKLSAgICAgIHl5c3MgPSAoc2hvcnQgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXNzLCAoY2hhciAqKXl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApKTsKLSAgICAgIHl5dnMgPSAoWVlTVFlQRSAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXl2c3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5dnMsIChjaGFyICopeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCkpOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlscyA9IChZWUxUWVBFICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eWxzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXlscywgKGNoYXIgKil5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCi0KLSAgICAgIHl5c3NwID0geXlzcyArIHNpemUgLSAxOwotICAgICAgeXl2c3AgPSB5eXZzICsgc2l6ZSAtIDE7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzcCA9IHl5bHMgKyBzaXplIC0gMTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVkXG4iLCB5eXN0YWNrc2l6ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0JWVlBQk9SVDsKLSAgICB9Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSk7Ci0jZW5kaWYKLQotICBnb3RvIHl5YmFja3VwOwotIHl5YmFja3VwOgotCi0vKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLS8qIFJlYWQgYSBsb29rYWhlYWQgdG9rZW4gaWYgd2UgbmVlZCBvbmUgYW5kIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotLyogeXlyZXN1bWU6ICovCi0KLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2thaGVhZCB0b2tlbi4gICovCi0KLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotCi0gIC8qIHl5Y2hhciBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRgotICAgICBvciBhIHZhbGlkIHRva2VuIGluIGV4dGVybmFsIGZvcm0uICAqLwotCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKLSAgICB7Ci0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIik7Ci0jZW5kaWYKLSAgICAgIHl5Y2hhciA9IFlZTEVYOwotICAgIH0KLQotICAvKiBDb252ZXJ0IHRva2VuIHRvIGludGVybmFsIGZvcm0gKGluIHl5Y2hhcjEpIGZvciBpbmRleGluZyB0YWJsZXMgd2l0aCAqLwotCi0gIGlmICh5eWNoYXIgPD0gMCkJCS8qIFRoaXMgbWVhbnMgZW5kIG9mIGlucHV0LiAqLwotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSAwOwotICAgICAgeXljaGFyID0gWVlFT0Y7CQkvKiBEb24ndCBjYWxsIFlZTEVYIGFueSBtb3JlICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFKHl5Y2hhcik7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIk5leHQgdG9rZW4gaXMgJWQgKCVzIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLQkgIC8qIEdpdmUgdGhlIGluZGl2aWR1YWwgcGFyc2VyIGEgd2F5IHRvIHByaW50IHRoZSBwcmVjaXNlIG1lYW5pbmcKLQkgICAgIG9mIGEgdG9rZW4sIGZvciBmdXJ0aGVyIGRlYnVnZ2luZyBpbmZvLiAgKi8KLSNpZmRlZiBZWVBSSU5UCi0JICBZWVBSSU5UIChzdGRlcnIsIHl5Y2hhciwgeXlsdmFsKTsKLSNlbmRpZgotCSAgZnByaW50ZiAoc3RkZXJyLCAiKVxuIik7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gIHl5biArPSB5eWNoYXIxOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IHl5Y2hhcjEpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotCi0gIC8qIHl5biBpcyB3aGF0IHRvIGRvIGZvciB0aGlzIHRva2VuIHR5cGUgaW4gdGhpcyBzdGF0ZS4KLSAgICAgTmVnYXRpdmUgPT4gcmVkdWNlLCAteXluIGlzIHJ1bGUgbnVtYmVyLgotICAgICBQb3NpdGl2ZSA9PiBzaGlmdCwgeXluIGlzIG5ldyBzdGF0ZS4KLSAgICAgICBOZXcgc3RhdGUgaXMgZmluYWwgc3RhdGUgPT4gZG9uJ3QgYm90aGVyIHRvIHNoaWZ0LAotICAgICAgIGp1c3QgcmV0dXJuIHN1Y2Nlc3MuCi0gICAgIDAsIG9yIG1vc3QgbmVnYXRpdmUgbnVtYmVyID0+IGVycm9yLiAgKi8KLQotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJybGFiOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNoaWZ0aW5nIHRva2VuICVkICglcyksICIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0jZW5kaWYKLQotICAvKiBEaXNjYXJkIHRoZSB0b2tlbiBiZWluZyBzaGlmdGVkIHVubGVzcyBpdCBpcyBlb2YuICAqLwotICBpZiAoeXljaGFyICE9IFlZRU9GKQotICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgLyogY291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvciBzdGF0dXMuICAqLwotICBpZiAoeXllcnJzdGF0dXMpIHl5ZXJyc3RhdHVzLS07Ci0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgZ290byB5eW5ld3N0YXRlOwotCi0vKiBEbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLXl5ZGVmYXVsdDoKLQotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0KLS8qIERvIGEgcmVkdWN0aW9uLiAgeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KLXl5cmVkdWNlOgotICB5eWxlbiA9IHl5cjJbeXluXTsKLSAgaWYgKHl5bGVuID4gMCkKLSAgICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOyAvKiBpbXBsZW1lbnQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJlZHVjaW5nIHZpYSBydWxlICVkIChsaW5lICVkKSwgIiwKLQkgICAgICAgeXluLCB5eXJsaW5lW3l5bl0pOwotCi0gICAgICAvKiBQcmludCB0aGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLCBhbmQgdGhlaXIgcmVzdWx0LiAgKi8KLSAgICAgIGZvciAoaSA9IHl5cHJoc1t5eW5dOyB5eXJoc1tpXSA+IDA7IGkrKykKLQlmcHJpbnRmIChzdGRlcnIsICIlcyAiLCB5eXRuYW1lW3l5cmhzW2ldXSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJXNcbiIsIHl5dG5hbWVbeXlyMVt5eW5dXSk7Ci0gICAgfQotI2VuZGlmCi0KLQotICBzd2l0Y2ggKHl5bikgewotCi1jYXNlIDM6Ci0jbGluZSAyMDggImp2LWV4cC55IgotewotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSh5eXZzcFswXS50dmFsKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgNjoKLSNsaW5lIDIyMiAianYtZXhwLnkiCi17Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NUUklORyk7Ci0JCSAgd3JpdGVfZXhwX3N0cmluZyAoeXl2c3BbMF0uc3ZhbCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NUUklORyk7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDc6Ci0jbGluZSAyMzEgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFswXS50eXBlZF92YWxfaW50LnR5cGUpOwotCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpKHl5dnNwWzBdLnR5cGVkX3ZhbF9pbnQudmFsKSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4OgotI2xpbmUgMjM2ICJqdi1leHAueSIKLXsgWVlTVFlQRSB2YWw7Ci0JCSAgcGFyc2VfbnVtYmVyICh5eXZzcFswXS5zdmFsLnB0ciwgeXl2c3BbMF0uc3ZhbC5sZW5ndGgsIDAsICZ2YWwpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHZhbC50eXBlZF92YWxfaW50LnR5cGUpOwotCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpdmFsLnR5cGVkX3ZhbF9pbnQudmFsKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDk6Ci0jbGluZSAyNDQgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWzBdLnR5cGVkX3ZhbF9mbG9hdC50eXBlKTsKLQkJICB3cml0ZV9leHBfZWx0X2RibGNzdCAoeXl2c3BbMF0udHlwZWRfdmFsX2Zsb2F0LmR2YWwpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDoKLSNsaW5lIDI0OSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGphdmFfYm9vbGVhbl90eXBlKTsKLQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKXl5dnNwWzBdLmx2YWwpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTM6Ci0jbGluZSAyNjYgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9ib29sZWFuX3R5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE2OgotI2xpbmUgMjc2ICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfYnl0ZV90eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNzoKLSNsaW5lIDI3OCAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX3Nob3J0X3R5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE4OgotI2xpbmUgMjgwICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfaW50X3R5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE5OgotI2xpbmUgMjgyICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfbG9uZ190eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMDoKLSNsaW5lIDI4NCAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2NoYXJfdHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjE6Ci0jbGluZSAyODkgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9mbG9hdF90eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMjoKLSNsaW5lIDI5MSAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2RvdWJsZV90eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMzoKLSNsaW5lIDMwMyAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX3R5cGVfZnJvbV9uYW1lICh5eXZzcFswXS5zdmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjU6Ci0jbGluZSAzMTIgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9hcnJheV90eXBlICh5eXZzcFstMV0udHZhbCwgeXl2c3BbMF0ubHZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI2OgotI2xpbmUgMzE0ICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfYXJyYXlfdHlwZSAoamF2YV90eXBlX2Zyb21fbmFtZSAoeXl2c3BbLTFdLnN2YWwpLCB5eXZzcFswXS5sdmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzM6Ci0jbGluZSAzMzQgImp2LWV4cC55IgoteyB5eXZhbC5zdmFsLmxlbmd0aCA9IHl5dnNwWy0yXS5zdmFsLmxlbmd0aCArIHl5dnNwWzBdLnN2YWwubGVuZ3RoICsgMTsKLQkJICBpZiAoeXl2c3BbLTJdLnN2YWwucHRyICsgeXl2c3BbLTJdLnN2YWwubGVuZ3RoICsgMSA9PSB5eXZzcFswXS5zdmFsLnB0cgotCQkgICAgICAmJiB5eXZzcFstMl0uc3ZhbC5wdHJbeXl2c3BbLTJdLnN2YWwubGVuZ3RoXSA9PSAnLicpCi0JCSAgICB5eXZhbC5zdmFsLnB0ciA9IHl5dnNwWy0yXS5zdmFsLnB0cjsgIC8qIE9wdGltaXphdGlvbi4gKi8KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHl5dmFsLnN2YWwucHRyID0gKGNoYXIgKikgeG1hbGxvYyAoeXl2YWwuc3ZhbC5sZW5ndGggKyAxKTsKLQkJICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCB5eXZhbC5zdmFsLnB0cik7Ci0JCSAgICAgIHNwcmludGYgKHl5dmFsLnN2YWwucHRyLCAiJS4qcy4lLipzIiwKLQkJCSAgICAgICB5eXZzcFstMl0uc3ZhbC5sZW5ndGgsIHl5dnNwWy0yXS5zdmFsLnB0ciwgeXl2c3BbMF0uc3ZhbC5sZW5ndGgsIHl5dnNwWzBdLnN2YWwucHRyKTsKLQkJfSA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNToKLSNsaW5lIDM1OCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9DT01NQSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM5OgotI2xpbmUgMzY5ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDU6Ci0jbGluZSAzNzcgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOwotCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIDApOwotCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIHl5dnNwWzBdLmx2YWwpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ2OgotI2xpbmUgMzg1ICJqdi1leHAueSIKLXsgc3RhcnRfYXJnbGlzdCAoKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDc6Ci0jbGluZSAzOTAgImp2LWV4cC55IgoteyB5eXZhbC5sdmFsID0gZW5kX2FyZ2xpc3QgKCkgLSAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0ODoKLSNsaW5lIDM5NSAianYtZXhwLnkiCi17IGVycm9yICgiRklYTUUgLSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ5OgotI2xpbmUgNDAwICJqdi1leHAueSIKLXsgYXJnbGlzdF9sZW4gPSAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MDoKLSNsaW5lIDQwMiAianYtZXhwLnkiCi17IGFyZ2xpc3RfbGVuKys7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUxOgotI2xpbmUgNDA3ICJqdi1leHAueSIKLXsgYXJnbGlzdF9sZW4gPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MzoKLSNsaW5lIDQxMyAianYtZXhwLnkiCi17IGVycm9yICgiRklYTUUgLSBBcnJheUNyZWF0aWlvbkV4cHJlc3Npb24iKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTQ6Ci0jbGluZSA0MTUgImp2LWV4cC55IgoteyBlcnJvciAoIkZJWE1FIC0gQXJyYXlDcmVhdGlpb25FeHByZXNzaW9uIik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU4OgotI2xpbmUgNDI5ICJqdi1leHAueSIKLXsgeXl2YWwubHZhbCA9IDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU5OgotI2xpbmUgNDMxICJqdi1leHAueSIKLXsgeXl2YWwubHZhbCA9IHl5dnNwWy0yXS5sdmFsICsgMTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjE6Ci0jbGluZSA0MzcgImp2LWV4cC55IgoteyB5eXZhbC5sdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgNjI6Ci0jbGluZSA0NDIgImp2LWV4cC55IgoteyBwdXNoX2ZpZWxkbmFtZXMgKHl5dnNwWzBdLnN2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MzoKLSNsaW5lIDQ0NCAianYtZXhwLnkiCi17IHB1c2hfZmllbGRuYW1lcyAoeXl2c3BbMF0uc3ZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY0OgotI2xpbmUgNDUwICJqdi1leHAueSIKLXsgZXJyb3IgKCJtZXRob2QgaW52b2NhdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjU6Ci0jbGluZSA0NTIgImp2LWV4cC55IgoteyBlcnJvciAoIm1ldGhvZCBpbnZvY2F0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NjoKLSNsaW5lIDQ1NCAianYtZXhwLnkiCi17IGVycm9yICgibWV0aG9kIGludm9jYXRpb24gbm90IGltcGxlbWVudGVkIik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY3OgotI2xpbmUgNDU5ICJqdi1leHAueSIKLXsKLSAgICAgICAgICAgICAgICAgIC8qIEVtaXQgY29kZSBmb3IgdGhlIE5hbWUgbm93LCB0aGVuIGV4Y2hhbmdlIGl0IGluIHRoZQotCQkgICAgIGV4cG91dCBhcnJheSB3aXRoIHRoZSBFeHByZXNzaW9uJ3MgY29kZS4gIFdlIGNvdWxkCi0JCSAgICAgaW50cm9kdWNlIGEgT1BfU1dBUCBjb2RlIG9yIGEgcmV2ZXJzZWQgdmVyc2lvbiBvZgotCQkgICAgIEJJTk9QX1NVQlNDUklQVCwgYnV0IHRoYXQgbWFrZXMgdGhlIHJlc3Qgb2YgR0RCIHBheQotCQkgICAgIGZvciBvdXIgcGFyc2luZyBrbHVkZ2VzLiAgKi8KLQkJICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmFtZV9leHByOwotCi0JCSAgcHVzaF9leHByZXNzaW9uX25hbWUgKHl5dnNwWy0zXS5zdmFsKTsKLQkJICBuYW1lX2V4cHIgPSBjb3B5X2V4cCAoZXhwb3V0LCBleHBvdXRfcHRyKTsKLQkJICBleHBvdXRfcHRyIC09IG5hbWVfZXhwci0+bmVsdHM7Ci0JCSAgaW5zZXJ0X2V4cCAoZXhwb3V0X3B0ci1sZW5ndGhfb2Zfc3ViZXhwIChleHBvdXQsIGV4cG91dF9wdHIpLAotCQkJICAgICAgbmFtZV9leHByKTsKLQkJICBmcmVlIChuYW1lX2V4cHIpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUJTQ1JJUFQpOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA2ODoKLSNsaW5lIDQ3NiAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUJTQ1JJUFQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2OToKLSNsaW5lIDQ3OCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUJTQ1JJUFQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3MToKLSNsaW5lIDQ4NCAianYtZXhwLnkiCi17IHB1c2hfZXhwcmVzc2lvbl9uYW1lICh5eXZzcFswXS5zdmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzU6Ci0jbGluZSA0OTMgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QT1NUSU5DUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzY6Ci0jbGluZSA0OTggImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QT1NUREVDUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODA6Ci0jbGluZSA1MDYgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9ORUcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MToKLSNsaW5lIDUwOCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0lORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDgzOgotI2xpbmUgNTE0ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUFJFSU5DUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODQ6Ci0jbGluZSA1MTkgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QUkVERUNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4NjoKLSNsaW5lIDUyNSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NPTVBMRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4NzoKLSNsaW5lIDUyNyAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0xPR0lDQUxfTk9UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODk6Ci0jbGluZSA1MzMgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGphdmFfYXJyYXlfdHlwZSAoeXl2c3BbLTNdLnR2YWwsIHl5dnNwWy0yXS5sdmFsKSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDkwOgotI2xpbmUgNTM3ICJqdi1leHAueSIKLXsKLQkJICBpbnQgZXhwX3NpemUgPSBleHBvdXRfcHRyOwotCQkgIGludCBsYXN0X2V4cF9zaXplID0gbGVuZ3RoX29mX3N1YmV4cChleHBvdXQsIGV4cG91dF9wdHIpOwotCQkgIHN0cnVjdCB0eXBlICp0eXBlOwotCQkgIGludCBpOwotCQkgIGludCBiYXNlID0gZXhwb3V0X3B0ciAtIGxhc3RfZXhwX3NpemUgLSAzOwotCQkgIGlmIChiYXNlIDwgMCB8fCBleHBvdXQtPmVsdHNbYmFzZSsyXS5vcGNvZGUgIT0gT1BfVFlQRSkKLQkJICAgIGVycm9yICgiaW52YWxpZCBjYXN0IGV4cHJlc3Npb24iKTsKLQkJICB0eXBlID0gZXhwb3V0LT5lbHRzW2Jhc2UrMV0udHlwZTsKLQkJICAvKiBSZW1vdmUgdGhlICdFeHByZXNzaW9uJyBhbmQgc2xpZGUgdGhlCi0JCSAgICAgVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIGRvd24gdG8gcmVwbGFjZSBpdC4gKi8KLQkJICBmb3IgKGkgPSAwOyAgaSA8IGxhc3RfZXhwX3NpemU7ICBpKyspCi0JCSAgICBleHBvdXQtPmVsdHNbYmFzZSArIGldID0gZXhwb3V0LT5lbHRzW2Jhc2UgKyBpICsgM107Ci0JCSAgZXhwb3V0X3B0ciAtPSAzOwotCQkgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QpCi0JCSAgICB0eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAodHlwZSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlICh0eXBlKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgOTE6Ci0jbGluZSA1NTggImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGphdmFfYXJyYXlfdHlwZSAoamF2YV90eXBlX2Zyb21fbmFtZSAoeXl2c3BbLTNdLnN2YWwpLCB5eXZzcFstMl0ubHZhbCkpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5MzoKLSNsaW5lIDU2NyAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9NVUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5NDoKLSNsaW5lIDU2OSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9ESVYpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5NToKLSNsaW5lIDU3MSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRU0pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5NzoKLSNsaW5lIDU3NyAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BREQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5ODoKLSNsaW5lIDU3OSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDA6Ci0jbGluZSA1ODUgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTFNIKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTAxOgotI2xpbmUgNTg3ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JTSCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwMzoKLSNsaW5lIDU5NCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVNTKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA0OgotI2xpbmUgNTk2ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dUUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwNToKLSNsaW5lIDU5OCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDY6Ci0jbGluZSA2MDAgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR0VRKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA4OgotI2xpbmUgNjA3ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0VRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA5OgotI2xpbmUgNjA5ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX05PVEVRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTExOgotI2xpbmUgNjE1ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfQU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTEzOgotI2xpbmUgNjIxICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfWE9SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE1OgotI2xpbmUgNjI2ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfSU9SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE3OgotI2xpbmUgNjMyICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfQU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE5OgotI2xpbmUgNjM4ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjE6Ci0jbGluZSA2NDQgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVEVSTk9QX0NPTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjQ6Ci0jbGluZSA2NTQgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTI1OgotI2xpbmUgNjU2ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTl9NT0RJRlkpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlICh5eXZzcFstMV0ub3Bjb2RlKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOX01PRElGWSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyNjoKLSNsaW5lIDY2MyAianYtZXhwLnkiCi17IHB1c2hfZXhwcmVzc2lvbl9uYW1lICh5eXZzcFswXS5zdmFsKTsgOwotICAgIGJyZWFrO30KLX0KLSAgIC8qIHRoZSBhY3Rpb24gZmlsZSBnZXRzIGNvcGllZCBpbiBpbiBwbGFjZSBvZiB0aGlzIGRvbGxhcnNpZ24gKi8KLSNsaW5lIDQ5OCAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQwKLSAgeXl2c3AgLT0geXlsZW47Ci0gIHl5c3NwIC09IHl5bGVuOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCAtPSB5eWxlbjsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQotCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAqKyt5eXZzcCA9IHl5dmFsOwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwKys7Ci0gIGlmICh5eWxlbiA9PSAwKQotICAgIHsKLSAgICAgIHl5bHNwLT5maXJzdF9saW5lID0geXlsbG9jLmZpcnN0X2xpbmU7Ci0gICAgICB5eWxzcC0+Zmlyc3RfY29sdW1uID0geXlsbG9jLmZpcnN0X2NvbHVtbjsKLSAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AtMSktPmxhc3RfbGluZTsKLSAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcC0xKS0+bGFzdF9jb2x1bW47Ci0gICAgICB5eWxzcC0+dGV4dCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9saW5lOwotICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2NvbHVtbjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBOb3cgInNoaWZ0IiB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uCi0gICAgIERldGVybWluZSB3aGF0IHN0YXRlIHRoYXQgZ29lcyB0bywKLSAgICAgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvCi0gICAgIGFuZCB0aGUgcnVsZSBudW1iZXIgcmVkdWNlZCBieS4gICovCi0KLSAgeXluID0geXlyMVt5eW5dOwotCi0gIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKLSAgaWYgKHl5c3RhdGUgPj0gMCAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKLSAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKLSAgZWxzZQotICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVEJBU0VdOwotCi0gIGdvdG8geXluZXdzdGF0ZTsKLQoteXllcnJsYWI6ICAgLyogaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgKi8KLQotICBpZiAoISB5eWVycnN0YXR1cykKLSAgICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KLSAgICB7Ci0gICAgICArK3l5bmVycnM7Ci0KLSNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKLSAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLQotICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCi0JewotCSAgaW50IHNpemUgPSAwOwotCSAgY2hhciAqbXNnOwotCSAgaW50IHgsIGNvdW50OwotCi0JICBjb3VudCA9IDA7Ci0JICAvKiBTdGFydCBYIGF0IC15eW4gaWYgbmVjIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4geXljaGVjay4gICovCi0JICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKLQkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKLQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKLQkgICAgICBzaXplICs9IHN0cmxlbih5eXRuYW1lW3hdKSArIDE1LCBjb3VudCsrOwotCSAgbXNnID0gKGNoYXIgKikgeG1hbGxvYyhzaXplICsgMTUpOwotCSAgaWYgKG1zZyAhPSAwKQotCSAgICB7Ci0JICAgICAgc3RyY3B5KG1zZywgInBhcnNlIGVycm9yIik7Ci0KLQkgICAgICBpZiAoY291bnQgPCA1KQotCQl7Ci0JCSAgY291bnQgPSAwOwotCQkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOwotCQkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKLQkJICAgIGlmICh5eWNoZWNrW3ggKyB5eW5dID09IHgpCi0JCSAgICAgIHsKLQkJCXN0cmNhdChtc2csIGNvdW50ID09IDAgPyAiLCBleHBlY3RpbmcgYCIgOiAiIG9yIGAiKTsKLQkJCXN0cmNhdChtc2csIHl5dG5hbWVbeF0pOwotCQkJc3RyY2F0KG1zZywgIiciKTsKLQkJCWNvdW50Kys7Ci0JCSAgICAgIH0KLQkJfQotCSAgICAgIHl5ZXJyb3IobXNnKTsKLQkgICAgICBmcmVlKG1zZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgeXllcnJvciAoInBhcnNlIGVycm9yOyBhbHNvIHZpcnR1YWwgbWVtb3J5IGV4Y2VlZGVkIik7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLwotCXl5ZXJyb3IoInBhcnNlIGVycm9yIik7Ci0gICAgfQotCi0gIGdvdG8geXllcnJsYWIxOwoteXllcnJsYWIxOiAgIC8qIGhlcmUgb24gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgYW4gYWN0aW9uICovCi0KLSAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCi0gICAgewotICAgICAgLyogaWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbiBlcnJvciwgZGlzY2FyZCBpdC4gICovCi0KLSAgICAgIC8qIHJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dCAqLwotICAgICAgaWYgKHl5Y2hhciA9PSBZWUVPRikKLQlZWUFCT1JUOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIkRpc2NhcmRpbmcgdG9rZW4gJWQgKCVzKS5cbiIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0jZW5kaWYKLQotICAgICAgeXljaGFyID0gWVlFTVBUWTsKLSAgICB9Ci0KLSAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4KLSAgICAgYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yIHRva2VuLiAgKi8KLQotICB5eWVycnN0YXR1cyA9IDM7CQkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMgKi8KLQotICBnb3RvIHl5ZXJyaGFuZGxlOwotCi15eWVycmRlZmF1bHQ6ICAvKiBjdXJyZW50IHN0YXRlIGRvZXMgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoZSBlcnJvciB0b2tlbi4gKi8KLQotI2lmIDAKLSAgLyogVGhpcyBpcyB3cm9uZzsgb25seSBzdGF0ZXMgdGhhdCBleHBsaWNpdGx5IHdhbnQgZXJyb3IgdG9rZW5zCi0gICAgIHNob3VsZCBzaGlmdCB0aGVtLiAgKi8KLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07ICAvKiBJZiBpdHMgZGVmYXVsdCBpcyB0byBhY2NlcHQgYW55IHRva2VuLCBvay4gIE90aGVyd2lzZSBwb3AgaXQuKi8KLSAgaWYgKHl5bikgZ290byB5eWRlZmF1bHQ7Ci0jZW5kaWYKLQoteXllcnJwb3A6ICAgLyogcG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4gKi8KLQotICBpZiAoeXlzc3AgPT0geXlzcykgWVlBQk9SVDsKLSAgeXl2c3AtLTsKLSAgeXlzdGF0ZSA9ICotLXl5c3NwOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcC0tOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnNzcDEgPSB5eXNzIC0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiBzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQotCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQoteXllcnJoYW5kbGU6Ci0KLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gKz0gWVlURVJST1I7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0gWVlURVJST1IpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJycG9wOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJycG9wOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNoaWZ0aW5nIGVycm9yIHRva2VuLCAiKTsKLSNlbmRpZgotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLX0KLSNsaW5lIDY3NSAianYtZXhwLnkiCi0KLS8qIFRha2UgY2FyZSBvZiBwYXJzaW5nIGEgbnVtYmVyIChhbnl0aGluZyB0aGF0IHN0YXJ0cyB3aXRoIGEgZGlnaXQpLgotICAgU2V0IHl5bHZhbCBhbmQgcmV0dXJuIHRoZSB0b2tlbiB0eXBlOyB1cGRhdGUgbGV4cHRyLgotICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBpdC4gICovCi0KLS8qKiogTmVlZHMgc29tZSBlcnJvciBjaGVja2luZyBmb3IgdGhlIGZsb2F0IGNhc2UgKioqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9udW1iZXIgKHAsIGxlbiwgcGFyc2VkX2Zsb2F0LCBwdXRpdGhlcmUpCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gICAgIHJlZ2lzdGVyIGludCBsZW47Ci0gICAgIGludCBwYXJzZWRfZmxvYXQ7Ci0gICAgIFlZU1RZUEUgKnB1dGl0aGVyZTsKLXsKLSAgcmVnaXN0ZXIgVUxPTkdFU1QgbiA9IDA7Ci0gIFVMT05HRVNUIGxpbWl0LCBsaW1pdF9kaXZfYmFzZTsKLQotICByZWdpc3RlciBpbnQgYzsKLSAgcmVnaXN0ZXIgaW50IGJhc2UgPSBpbnB1dF9yYWRpeDsKLQotICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLQotICBpZiAocGFyc2VkX2Zsb2F0KQotICAgIHsKLSAgICAgIC8qIEl0J3MgYSBmbG9hdCBzaW5jZSBpdCBjb250YWlucyBhIHBvaW50IG9yIGFuIGV4cG9uZW50LiAgKi8KLSAgICAgIGNoYXIgYzsKLSAgICAgIGludCBudW0gPSAwOwkvKiBudW1iZXIgb2YgdG9rZW5zIHNjYW5uZWQgYnkgc2NhbmYgKi8KLSAgICAgIGNoYXIgc2F2ZWRfY2hhciA9IHBbbGVuXTsKLQotICAgICAgcFtsZW5dID0gMDsJLyogbnVsbC10ZXJtaW5hdGUgdGhlIHRva2VuICovCi0gICAgICBpZiAoc2l6ZW9mIChwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsKSA8PSBzaXplb2YgKGZsb2F0KSkKLQludW0gPSBzc2NhbmYgKHAsICIlZyVjIiwgKGZsb2F0ICopICZwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsLCAmYyk7Ci0gICAgICBlbHNlIGlmIChzaXplb2YgKHB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwpIDw9IHNpemVvZiAoZG91YmxlKSkKLQludW0gPSBzc2NhbmYgKHAsICIlbGclYyIsIChkb3VibGUgKikgJnB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwsICZjKTsKLSAgICAgIGVsc2UKLQl7Ci0jaWZkZWYgU0NBTkZfSEFTX0xPTkdfRE9VQkxFCi0JICBudW0gPSBzc2NhbmYgKHAsICIlTGclYyIsICZwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsLCAmYyk7Ci0jZWxzZQotCSAgLyogU2NhbiBpdCBpbnRvIGEgZG91YmxlLCB0aGVuIGFzc2lnbiBpdCB0byB0aGUgbG9uZyBkb3VibGUuCi0JICAgICBUaGlzIGF0IGxlYXN0IHdpbnMgd2l0aCB2YWx1ZXMgcmVwcmVzZW50YWJsZSBpbiB0aGUgcmFuZ2UKLQkgICAgIG9mIGRvdWJsZXMuICovCi0JICBkb3VibGUgdGVtcDsKLQkgIG51bSA9IHNzY2FuZiAocCwgIiVsZyVjIiwgJnRlbXAsICZjKTsKLQkgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwgPSB0ZW1wOwotI2VuZGlmCi0JfQotICAgICAgcFtsZW5dID0gc2F2ZWRfY2hhcjsJLyogcmVzdG9yZSB0aGUgaW5wdXQgc3RyZWFtICovCi0gICAgICBpZiAobnVtICE9IDEpIAkJLyogY2hlY2sgc2NhbmYgZm91bmQgT05MWSBhIGZsb2F0IC4uLiAqLwotCXJldHVybiBFUlJPUjsKLSAgICAgIC8qIFNlZSBpZiBpdCBoYXMgYGYnIG9yIGBkJyBzdWZmaXggKGZsb2F0IG9yIGRvdWJsZSkuICAqLwotCi0gICAgICBjID0gdG9sb3dlciAocFtsZW4gLSAxXSk7Ci0KLSAgICAgIGlmIChjID09ICdmJyB8fCBjID09ICdGJykKLQlwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC50eXBlID0gYnVpbHRpbl90eXBlX2Zsb2F0OwotICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnZCcgfHwgYyA9PSAnRCcpCi0JcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQudHlwZSA9IGJ1aWx0aW5fdHlwZV9kb3VibGU7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEVSUk9SOwotCi0gICAgICByZXR1cm4gRkxPQVRJTkdfUE9JTlRfTElURVJBTDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIGJhc2Utc3dpdGNoaW5nIHByZWZpeGVzIDB4LCAwdCwgMGQsIDAgKi8KLSAgaWYgKHBbMF0gPT0gJzAnKQotICAgIHN3aXRjaCAocFsxXSkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ3gnOgotICAgICAgY2FzZSAnWCc6Ci0JaWYgKGxlbiA+PSAzKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGJhc2UgPSAxNjsKLQkgICAgbGVuIC09IDI7Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgJ3QnOgotICAgICAgY2FzZSAnVCc6Ci0gICAgICBjYXNlICdkJzoKLSAgICAgIGNhc2UgJ0QnOgotCWlmIChsZW4gPj0gMykKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBiYXNlID0gMTA7Ci0JICAgIGxlbiAtPSAyOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJhc2UgPSA4OwotCWJyZWFrOwotICAgICAgfQotCi0gIGMgPSBwW2xlbi0xXTsKLSAgbGltaXQgPSAoVUxPTkdFU1QpMHhmZmZmZmZmZjsKLSAgaWYgKGMgPT0gJ2wnIHx8IGMgPT0gJ0wnKQotICAgIHsKLSAgICAgIHR5cGUgPSBqYXZhX2xvbmdfdHlwZTsKLSAgICAgIGxlbi0tOwotICAgICAgLyogQSBwYXJhbm9pZCBjYWxjdWxhdGlvbiBvZiAoMTw8NjQpLTEuICovCi0gICAgICBsaW1pdCA9ICgobGltaXQgPDwgMTYpIDw8IDE2KSB8IGxpbWl0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHR5cGUgPSBqYXZhX2ludF90eXBlOwotICAgIH0KLSAgbGltaXRfZGl2X2Jhc2UgPSBsaW1pdCAvIChVTE9OR0VTVCkgYmFzZTsKLQotICB3aGlsZSAoLS1sZW4gPj0gMCkKLSAgICB7Ci0gICAgICBjID0gKnArKzsKLSAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQljIC09ICcwJzsKLSAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotCWMgLT0gJ0EnIC0gMTA7Ci0gICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKLQljIC09ICdhJyAtIDEwOwotICAgICAgZWxzZQotCXJldHVybiBFUlJPUjsJLyogQ2hhciBub3QgYSBkaWdpdCAqLwotICAgICAgaWYgKGMgPj0gYmFzZSkKLQlyZXR1cm4gRVJST1I7Ci0gICAgICBpZiAobiA+IGxpbWl0X2Rpdl9iYXNlCi0JICB8fCAobiAqPSBiYXNlKSA+IGxpbWl0IC0gYykKLQllcnJvciAoIk51bWVyaWMgY29uc3RhbnQgdG9vIGxhcmdlLiIpOwotICAgICAgbiArPSBjOwotCX0KLQotICAgcHV0aXRoZXJlLT50eXBlZF92YWxfaW50LnZhbCA9IG47Ci0gICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9pbnQudHlwZSA9IHR5cGU7Ci0gICByZXR1cm4gSU5URUdFUl9MSVRFUkFMOwotfQotCi1zdHJ1Y3QgdG9rZW4KLXsKLSAgY2hhciAqb3BlcmF0b3I7Ci0gIGludCB0b2tlbjsKLSAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gdG9rZW50YWIzW10gPQotICB7Ci0gICAgeyI+Pj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9SU0h9LAotICAgIHsiPDw9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfTFNIfQotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRva2VuIHRva2VudGFiMltdID0KLSAgewotICAgIHsiKz0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9BRER9LAotICAgIHsiLT0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9TVUJ9LAotICAgIHsiKj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9NVUx9LAotICAgIHsiLz0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9ESVZ9LAotICAgIHsiJT0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9SRU19LAotICAgIHsifD0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9CSVRXSVNFX0lPUn0sCi0gICAgeyImPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0JJVFdJU0VfQU5EfSwKLSAgICB7Il49IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQklUV0lTRV9YT1J9LAotICAgIHsiKysiLCBJTkNSRU1FTlQsIEJJTk9QX0VORH0sCi0gICAgeyItLSIsIERFQ1JFTUVOVCwgQklOT1BfRU5EfSwKLSAgICB7IiYmIiwgQU5EQU5ELCBCSU5PUF9FTkR9LAotICAgIHsifHwiLCBPUk9SLCBCSU5PUF9FTkR9LAotICAgIHsiPDwiLCBMU0gsIEJJTk9QX0VORH0sCi0gICAgeyI+PiIsIFJTSCwgQklOT1BfRU5EfSwKLSAgICB7Ij09IiwgRVFVQUwsIEJJTk9QX0VORH0sCi0gICAgeyIhPSIsIE5PVEVRVUFMLCBCSU5PUF9FTkR9LAotICAgIHsiPD0iLCBMRVEsIEJJTk9QX0VORH0sCi0gICAgeyI+PSIsIEdFUSwgQklOT1BfRU5EfQotICB9OwotCi0vKiBSZWFkIG9uZSB0b2tlbiwgZ2V0dGluZyBjaGFyYWN0ZXJzIHRocm91Z2ggbGV4cHRyLiAgKi8KLQotc3RhdGljIGludAoteXlsZXggKCkKLXsKLSAgaW50IGM7Ci0gIGludCBuYW1lbGVuOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgY2hhciAqdG9rc3RhcnQ7Ci0gIGNoYXIgKnRva3B0cjsKLSAgaW50IHRlbXBidWZpbmRleDsKLSAgc3RhdGljIGNoYXIgKnRlbXBidWY7Ci0gIHN0YXRpYyBpbnQgdGVtcGJ1ZnNpemU7Ci0gIAotIHJldHJ5OgotCi0gIHRva3N0YXJ0ID0gbGV4cHRyOwotICAvKiBTZWUgaWYgaXQgaXMgYSBzcGVjaWFsIHRva2VuIG9mIGxlbmd0aCAzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiB0b2tlbnRhYjMgLyBzaXplb2YgdG9rZW50YWIzWzBdOyBpKyspCi0gICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsIHRva2VudGFiM1tpXS5vcGVyYXRvciwgMykpCi0gICAgICB7Ci0JbGV4cHRyICs9IDM7Ci0JeXlsdmFsLm9wY29kZSA9IHRva2VudGFiM1tpXS5vcGNvZGU7Ci0JcmV0dXJuIHRva2VudGFiM1tpXS50b2tlbjsKLSAgICAgIH0KLQotICAvKiBTZWUgaWYgaXQgaXMgYSBzcGVjaWFsIHRva2VuIG9mIGxlbmd0aCAyLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiB0b2tlbnRhYjIgLyBzaXplb2YgdG9rZW50YWIyWzBdOyBpKyspCi0gICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsIHRva2VudGFiMltpXS5vcGVyYXRvciwgMikpCi0gICAgICB7Ci0JbGV4cHRyICs9IDI7Ci0JeXlsdmFsLm9wY29kZSA9IHRva2VudGFiMltpXS5vcGNvZGU7Ci0JcmV0dXJuIHRva2VudGFiMltpXS50b2tlbjsKLSAgICAgIH0KLQotICBzd2l0Y2ggKGMgPSAqdG9rc3RhcnQpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAnICc6Ci0gICAgY2FzZSAnXHQnOgotICAgIGNhc2UgJ1xuJzoKLSAgICAgIGxleHB0cisrOwotICAgICAgZ290byByZXRyeTsKLQotICAgIGNhc2UgJ1wnJzoKLSAgICAgIC8qIFdlIGVpdGhlciBoYXZlIGEgY2hhcmFjdGVyIGNvbnN0YW50ICgnMCcgb3IgJ1wxNzcnIGZvciBleGFtcGxlKQotCSBvciB3ZSBoYXZlIGEgcXVvdGVkIHN5bWJvbCByZWZlcmVuY2UgKCdmb28oaW50LGludCknIGluIEMrKwotCSBmb3IgZXhhbXBsZSkuICovCi0gICAgICBsZXhwdHIrKzsKLSAgICAgIGMgPSAqbGV4cHRyKys7Ci0gICAgICBpZiAoYyA9PSAnXFwnKQotCWMgPSBwYXJzZV9lc2NhcGUgKCZsZXhwdHIpOwotICAgICAgZWxzZSBpZiAoYyA9PSAnXCcnKQotCWVycm9yICgiRW1wdHkgY2hhcmFjdGVyIGNvbnN0YW50LiIpOwotCi0gICAgICB5eWx2YWwudHlwZWRfdmFsX2ludC52YWwgPSBjOwotICAgICAgeXlsdmFsLnR5cGVkX3ZhbF9pbnQudHlwZSA9IGJ1aWx0aW5fdHlwZV9jaGFyOwotCi0gICAgICBjID0gKmxleHB0cisrOwotICAgICAgaWYgKGMgIT0gJ1wnJykKLQl7Ci0JICBuYW1lbGVuID0gc2tpcF9xdW90ZWQgKHRva3N0YXJ0KSAtIHRva3N0YXJ0OwotCSAgaWYgKG5hbWVsZW4gPiAyKQotCSAgICB7Ci0JICAgICAgbGV4cHRyID0gdG9rc3RhcnQgKyBuYW1lbGVuOwotCSAgICAgIGlmIChsZXhwdHJbLTFdICE9ICdcJycpCi0JCWVycm9yICgiVW5tYXRjaGVkIHNpbmdsZSBxdW90ZS4iKTsKLQkgICAgICBuYW1lbGVuIC09IDI7Ci0JICAgICAgdG9rc3RhcnQrKzsKLQkgICAgICBnb3RvIHRyeW5hbWU7Ci0JICAgIH0KLQkgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgY29uc3RhbnQuIik7Ci0JfQotICAgICAgcmV0dXJuIElOVEVHRVJfTElURVJBTDsKLQotICAgIGNhc2UgJygnOgotICAgICAgcGFyZW5fZGVwdGgrKzsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcpJzoKLSAgICAgIGlmIChwYXJlbl9kZXB0aCA9PSAwKQotCXJldHVybiAwOwotICAgICAgcGFyZW5fZGVwdGgtLTsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGlmIChjb21tYV90ZXJtaW5hdGVzICYmIHBhcmVuX2RlcHRoID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnLic6Ci0gICAgICAvKiBNaWdodCBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gICovCi0gICAgICBpZiAobGV4cHRyWzFdIDwgJzAnIHx8IGxleHB0clsxXSA+ICc5JykKLQlnb3RvIHN5bWJvbDsJCS8qIE5vcGUsIG11c3QgYmUgYSBzeW1ib2wuICovCi0gICAgICAvKiBGQUxMIFRIUlUgaW50byBudW1iZXIgY2FzZS4gICovCi0KLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIHsKLQkvKiBJdCdzIGEgbnVtYmVyLiAgKi8KLQlpbnQgZ290X2RvdCA9IDAsIGdvdF9lID0gMCwgdG9rdHlwZTsKLQlyZWdpc3RlciBjaGFyICpwID0gdG9rc3RhcnQ7Ci0JaW50IGhleCA9IGlucHV0X3JhZGl4ID4gMTA7Ci0KLQlpZiAoYyA9PSAnMCcgJiYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnKSkKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBoZXggPSAxOwotCSAgfQotCWVsc2UgaWYgKGMgPT0gJzAnICYmIChwWzFdPT0ndCcgfHwgcFsxXT09J1QnIHx8IHBbMV09PSdkJyB8fCBwWzFdPT0nRCcpKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGhleCA9IDA7Ci0JICB9Ci0KLQlmb3IgKDs7ICsrcCkKLQkgIHsKLQkgICAgLyogVGhpcyB0ZXN0IGluY2x1ZGVzICFoZXggYmVjYXVzZSAnZScgaXMgYSB2YWxpZCBoZXggZGlnaXQKLQkgICAgICAgYW5kIHRodXMgZG9lcyBub3QgaW5kaWNhdGUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2hlbgotCSAgICAgICB0aGUgcmFkaXggaXMgaGV4LiAgKi8KLQkgICAgaWYgKCFoZXggJiYgIWdvdF9lICYmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKSkKLQkgICAgICBnb3RfZG90ID0gZ290X2UgPSAxOwotCSAgICAvKiBUaGlzIHRlc3QgZG9lcyBub3QgaW5jbHVkZSAhaGV4LCBiZWNhdXNlIGEgJy4nIGFsd2F5cyBpbmRpY2F0ZXMKLQkgICAgICAgYSBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IG51bWJlciByZWdhcmRsZXNzIG9mIHRoZSByYWRpeC4gICovCi0JICAgIGVsc2UgaWYgKCFnb3RfZG90ICYmICpwID09ICcuJykKLQkgICAgICBnb3RfZG90ID0gMTsKLQkgICAgZWxzZSBpZiAoZ290X2UgJiYgKHBbLTFdID09ICdlJyB8fCBwWy0xXSA9PSAnRScpCi0JCSAgICAgJiYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpKQotCSAgICAgIC8qIFRoaXMgaXMgdGhlIHNpZ24gb2YgdGhlIGV4cG9uZW50LCBub3QgdGhlIGVuZCBvZiB0aGUKLQkJIG51bWJlci4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIC8qIFdlIHdpbGwgdGFrZSBhbnkgbGV0dGVycyBvciBkaWdpdHMuICBwYXJzZV9udW1iZXIgd2lsbAotCSAgICAgICBjb21wbGFpbiBpZiBwYXN0IHRoZSByYWRpeCwgb3IgaWYgTCBvciBVIGFyZSBub3QgZmluYWwuICAqLwotCSAgICBlbHNlIGlmICgoKnAgPCAnMCcgfHwgKnAgPiAnOScpCi0JCSAgICAgJiYgKCgqcCA8ICdhJyB8fCAqcCA+ICd6JykKLQkJCQkgICYmICgqcCA8ICdBJyB8fCAqcCA+ICdaJykpKQotCSAgICAgIGJyZWFrOwotCSAgfQotCXRva3R5cGUgPSBwYXJzZV9udW1iZXIgKHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQsIGdvdF9kb3R8Z290X2UsICZ5eWx2YWwpOwotICAgICAgICBpZiAodG9rdHlwZSA9PSBFUlJPUikKLQkgIHsKLQkgICAgY2hhciAqZXJyX2NvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHAgLSB0b2tzdGFydCArIDEpOwotCi0JICAgIG1lbWNweSAoZXJyX2NvcHksIHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQpOwotCSAgICBlcnJfY29weVtwIC0gdG9rc3RhcnRdID0gMDsKLQkgICAgZXJyb3IgKCJJbnZhbGlkIG51bWJlciBcIiVzXCIuIiwgZXJyX2NvcHkpOwotCSAgfQotCWxleHB0ciA9IHA7Ci0JcmV0dXJuIHRva3R5cGU7Ci0gICAgICB9Ci0KLSAgICBjYXNlICcrJzoKLSAgICBjYXNlICctJzoKLSAgICBjYXNlICcqJzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICclJzoKLSAgICBjYXNlICd8JzoKLSAgICBjYXNlICcmJzoKLSAgICBjYXNlICdeJzoKLSAgICBjYXNlICd+JzoKLSAgICBjYXNlICchJzoKLSAgICBjYXNlICc8JzoKLSAgICBjYXNlICc+JzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICBjYXNlICc/JzoKLSAgICBjYXNlICc6JzoKLSAgICBjYXNlICc9JzoKLSAgICBjYXNlICd7JzoKLSAgICBjYXNlICd9JzoKLSAgICBzeW1ib2w6Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnIic6Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBnZGIgaW50ZXJuYWwgZm9ybSBvZiB0aGUgaW5wdXQgc3RyaW5nIGluIHRlbXBidWYsCi0JIHRyYW5zbGF0aW5nIGFueSBzdGFuZGFyZCBDIGVzY2FwZSBmb3JtcyBzZWVuLiAgTm90ZSB0aGF0IHRoZQotCSBidWZmZXIgaXMgbnVsbCBieXRlIHRlcm1pbmF0ZWQgKm9ubHkqIGZvciB0aGUgY29udmVuaWVuY2Ugb2YKLQkgZGVidWdnaW5nIGdkYiBpdHNlbGYgYW5kIHByaW50aW5nIHRoZSBidWZmZXIgY29udGVudHMgd2hlbgotCSB0aGUgYnVmZmVyIGNvbnRhaW5zIG5vIGVtYmVkZGVkIG51bGxzLiAgR2RiIGRvZXMgbm90IGRlcGVuZAotCSB1cG9uIHRoZSBidWZmZXIgYmVpbmcgbnVsbCBieXRlIHRlcm1pbmF0ZWQsIGl0IHVzZXMgdGhlIGxlbmd0aAotCSBzdHJpbmcgaW5zdGVhZC4gIFRoaXMgYWxsb3dzIGdkYiB0byBoYW5kbGUgQyBzdHJpbmdzIChhcyB3ZWxsCi0JIGFzIHN0cmluZ3MgaW4gb3RoZXIgbGFuZ3VhZ2VzKSB3aXRoIGVtYmVkZGVkIG51bGwgYnl0ZXMgKi8KLQotICAgICAgdG9rcHRyID0gKyt0b2tzdGFydDsKLSAgICAgIHRlbXBidWZpbmRleCA9IDA7Ci0KLSAgICAgIGRvIHsKLQkvKiBHcm93IHRoZSBzdGF0aWMgdGVtcCBidWZmZXIgaWYgbmVjZXNzYXJ5LCBpbmNsdWRpbmcgYWxsb2NhdGluZwotCSAgIHRoZSBmaXJzdCBvbmUgb24gZGVtYW5kLiAqLwotCWlmICh0ZW1wYnVmaW5kZXggKyAxID49IHRlbXBidWZzaXplKQotCSAgewotCSAgICB0ZW1wYnVmID0gKGNoYXIgKikgeHJlYWxsb2MgKHRlbXBidWYsIHRlbXBidWZzaXplICs9IDY0KTsKLQkgIH0KLQlzd2l0Y2ggKCp0b2twdHIpCi0JICB7Ci0JICBjYXNlICdcMCc6Ci0JICBjYXNlICciJzoKLQkgICAgLyogRG8gbm90aGluZywgbG9vcCB3aWxsIHRlcm1pbmF0ZS4gKi8KLQkgICAgYnJlYWs7Ci0JICBjYXNlICdcXCc6Ci0JICAgIHRva3B0cisrOwotCSAgICBjID0gcGFyc2VfZXNjYXBlICgmdG9rcHRyKTsKLQkgICAgaWYgKGMgPT0gLTEpCi0JICAgICAgewotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gYzsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICB0ZW1wYnVmW3RlbXBidWZpbmRleCsrXSA9ICp0b2twdHIrKzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9IHdoaWxlICgoKnRva3B0ciAhPSAnIicpICYmICgqdG9rcHRyICE9ICdcMCcpKTsKLSAgICAgIGlmICgqdG9rcHRyKysgIT0gJyInKQotCXsKLQkgIGVycm9yICgiVW50ZXJtaW5hdGVkIHN0cmluZyBpbiBleHByZXNzaW9uLiIpOwotCX0KLSAgICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4XSA9ICdcMCc7CS8qIFNlZSBub3RlIGFib3ZlICovCi0gICAgICB5eWx2YWwuc3ZhbC5wdHIgPSB0ZW1wYnVmOwotICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gdGVtcGJ1ZmluZGV4OwotICAgICAgbGV4cHRyID0gdG9rcHRyOwotICAgICAgcmV0dXJuIChTVFJJTkdfTElURVJBTCk7Ci0gICAgfQotCi0gIGlmICghKGMgPT0gJ18nIHx8IGMgPT0gJyQnCi0JfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSkKLSAgICAvKiBXZSBtdXN0IGhhdmUgY29tZSBhY3Jvc3MgYSBiYWQgY2hhcmFjdGVyIChlLmcuICc7JykuICAqLwotICAgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBleHByZXNzaW9uLiIsIGMpOwotCi0gIC8qIEl0J3MgYSBuYW1lLiAgU2VlIGhvdyBsb25nIGl0IGlzLiAgKi8KLSAgbmFtZWxlbiA9IDA7Ci0gIGZvciAoYyA9IHRva3N0YXJ0W25hbWVsZW5dOwotICAgICAgIChjID09ICdfJwotCXx8IGMgPT0gJyQnCi0JfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykKLQl8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpCi0JfHwgYyA9PSAnPCcpOwotICAgICAgICkKLSAgICB7Ci0gICAgICBpZiAoYyA9PSAnPCcpCi0JewotCSAgaW50IGkgPSBuYW1lbGVuOwotCSAgd2hpbGUgKHRva3N0YXJ0WysraV0gJiYgdG9rc3RhcnRbaV0gIT0gJz4nKTsKLQkgIGlmICh0b2tzdGFydFtpXSA9PSAnPicpCi0JICAgIG5hbWVsZW4gPSBpOwotCX0KLSAgICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKLSAgICAgfQotCi0gIC8qIFRoZSB0b2tlbiAiaWYiIHRlcm1pbmF0ZXMgdGhlIGV4cHJlc3Npb24gYW5kIGlzIE5PVCAKLSAgICAgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICAqLwotICBpZiAobmFtZWxlbiA9PSAyICYmIHRva3N0YXJ0WzBdID09ICdpJyAmJiB0b2tzdGFydFsxXSA9PSAnZicpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGxleHB0ciArPSBuYW1lbGVuOwotCi0gIHRyeW5hbWU6Ci0KLSAgLyogQ2F0Y2ggc3BlY2lmaWMga2V5d29yZHMuICBTaG91bGQgYmUgZG9uZSB3aXRoIGEgZGF0YSBzdHJ1Y3R1cmUuICAqLwotICBzd2l0Y2ggKG5hbWVsZW4pCi0gICAgewotICAgIGNhc2UgNzoKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiYm9vbGVhbiIsIDcpKQotCXJldHVybiBCT09MRUFOOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJkb3VibGUiLCA2KSkgICAgICAKLQlyZXR1cm4gRE9VQkxFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzaG9ydCIsIDUpKQotCXJldHVybiBTSE9SVDsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZmFsc2UiLCA1KSkKLQl7Ci0JICB5eWx2YWwubHZhbCA9IDA7Ci0JICByZXR1cm4gQk9PTEVBTl9MSVRFUkFMOwotCX0KLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAic3VwZXIiLCA1KSkKLQlyZXR1cm4gU1VQRVI7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImZsb2F0IiwgNSkpCi0JcmV0dXJuIEZMT0FUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJsb25nIiwgNCkpCi0JcmV0dXJuIExPTkc7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImJ5dGUiLCA0KSkKLQlyZXR1cm4gQllURTsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiY2hhciIsIDQpKQotCXJldHVybiBDSEFSOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ0cnVlIiwgNCkpCi0JewotCSAgeXlsdmFsLmx2YWwgPSAxOwotCSAgcmV0dXJuIEJPT0xFQU5fTElURVJBTDsKLQl9Ci0gICAgICBpZiAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMKLQkgICYmIFNUUkVRTiAodG9rc3RhcnQsICJ0aGlzIiwgNCkpCi0JewotCSAgc3RhdGljIGNvbnN0IGNoYXIgdGhpc19uYW1lW10gPQotCQkJCSB7IENQTFVTX01BUktFUiwgJ3QnLCAnaCcsICdpJywgJ3MnLCAnXDAnIH07Ci0KLQkgIGlmIChsb29rdXBfc3ltYm9sICh0aGlzX25hbWUsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKLQkJCSAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAotCQkJICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCkpCi0JICAgIHJldHVybiBUSElTOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiaW50IiwgMykpCi0JcmV0dXJuIElOVDsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAibmV3IiwgMykpCi0JcmV0dXJuIE5FVzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgeXlsdmFsLnN2YWwucHRyID0gdG9rc3RhcnQ7Ci0gIHl5bHZhbC5zdmFsLmxlbmd0aCA9IG5hbWVsZW47Ci0KLSAgaWYgKCp0b2tzdGFydCA9PSAnJCcpCi0gICAgewotICAgICAgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlICh5eWx2YWwuc3ZhbCk7Ci0gICAgICByZXR1cm4gVkFSSUFCTEU7Ci0gICAgfQotCi0gIC8qIElucHV0IG5hbWVzIHRoYXQgYXJlbid0IHN5bWJvbHMgYnV0IEFSRSB2YWxpZCBoZXggbnVtYmVycywKLSAgICAgd2hlbiB0aGUgaW5wdXQgcmFkaXggcGVybWl0cyB0aGVtLCBjYW4gYmUgbmFtZXMgb3IgbnVtYmVycwotICAgICBkZXBlbmRpbmcgb24gdGhlIHBhcnNlLiAgTm90ZSB3ZSBzdXBwb3J0IHJhZGl4ZXMgPiAxNiBoZXJlLiAgKi8KLSAgaWYgKCgodG9rc3RhcnRbMF0gPj0gJ2EnICYmIHRva3N0YXJ0WzBdIDwgJ2EnICsgaW5wdXRfcmFkaXggLSAxMCkgfHwKLSAgICAgICAodG9rc3RhcnRbMF0gPj0gJ0EnICYmIHRva3N0YXJ0WzBdIDwgJ0EnICsgaW5wdXRfcmFkaXggLSAxMCkpKQotICAgIHsKLSAgICAgIFlZU1RZUEUgbmV3bHZhbDsJLyogSXRzIHZhbHVlIGlzIGlnbm9yZWQuICAqLwotICAgICAgaW50IGhleHR5cGUgPSBwYXJzZV9udW1iZXIgKHRva3N0YXJ0LCBuYW1lbGVuLCAwLCAmbmV3bHZhbCk7Ci0gICAgICBpZiAoaGV4dHlwZSA9PSBJTlRFR0VSX0xJVEVSQUwpCi0JcmV0dXJuIE5BTUVfT1JfSU5UOwotICAgIH0KLSAgcmV0dXJuIElERU5USUZJRVI7Ci19Ci0KLXZvaWQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY2hhciAqbXNnOwotewotICBlcnJvciAoIkEgJXMgaW4gZXhwcmVzc2lvbiwgbmVhciBgJXMnLiIsIChtc2cgPyBtc2cgOiAiZXJyb3IiKSwgbGV4cHRyKTsKLX0KLQotc3RhdGljIHN0cnVjdCB0eXBlICoKLWphdmFfdHlwZV9mcm9tX25hbWUgKG5hbWUpCi0gICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKLSAKLXsKLSAgY2hhciAqdG1wID0gY29weV9uYW1lIChuYW1lKTsKLSAgc3RydWN0IHR5cGUgKnR5cCA9IGphdmFfbG9va3VwX2NsYXNzICh0bXApOwotICBpZiAodHlwID09IE5VTEwgfHwgVFlQRV9DT0RFICh0eXApICE9IFRZUEVfQ09ERV9TVFJVQ1QpCi0gICAgZXJyb3IgKCJObyBjbGFzcyBuYW1lZCAlcy4iLCB0bXApOwotICByZXR1cm4gdHlwOwotfQotCi0vKiBJZiBOQU1FIGlzIGEgdmFsaWQgdmFyaWFibGUgbmFtZSBpbiB0aGlzIHNjb3BlLCBwdXNoIGl0IGFuZCByZXR1cm4gMS4KLSAgIE90aGVyd2lzZSwgcmV0dXJuIDAuICovCi0KLXN0YXRpYyBpbnQKLXB1c2hfdmFyaWFibGUgKG5hbWUpCi0gICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKLSAKLXsKLSAgY2hhciAqdG1wID0gY29weV9uYW1lIChuYW1lKTsKLSAgaW50IGlzX2FfZmllbGRfb2ZfdGhpcyA9IDA7Ci0gIHN0cnVjdCBzeW1ib2wgKnN5bTsKLSAgc3ltID0gbG9va3VwX3N5bWJvbCAodG1wLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssIFZBUl9OQU1FU1BBQ0UsCi0JCSAgICAgICAmaXNfYV9maWVsZF9vZl90aGlzLCAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7Ci0gIGlmIChzeW0gJiYgU1lNQk9MX0NMQVNTIChzeW0pICE9IExPQ19UWVBFREVGKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSAoc3ltKSkKLQl7Ci0JICBpZiAoaW5uZXJtb3N0X2Jsb2NrID09IDAgfHwKLQkgICAgICBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCBpbm5lcm1vc3RfYmxvY2spKQotCSAgICBpbm5lcm1vc3RfYmxvY2sgPSBibG9ja19mb3VuZDsKLQl9Ci0KLSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotICAgICAgLyogV2Ugd2FudCB0byB1c2UgdGhlIHNlbGVjdGVkIGZyYW1lLCBub3QgYW5vdGhlciBtb3JlIGlubmVyIGZyYW1lCi0JIHdoaWNoIGhhcHBlbnMgdG8gYmUgaW4gdGhlIHNhbWUgYmxvY2suICAqLwotICAgICAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7Ci0gICAgICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKLSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoaXNfYV9maWVsZF9vZl90aGlzKQotICAgIHsKLSAgICAgIC8qIGl0IGhhbmdzIG9mZiBvZiBgdGhpcycuICBNdXN0IG5vdCBpbmFkdmVydGVudGx5IGNvbnZlcnQgZnJvbSBhCi0JIG1ldGhvZCBjYWxsIHRvIGRhdGEgcmVmLiAgKi8KLSAgICAgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fCAKLQkgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIGlubmVybW9zdF9ibG9jaykpCi0JaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7Ci0gICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7Ci0gICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7Ci0gICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsKLSAgICAgIHdyaXRlX2V4cF9zdHJpbmcgKG5hbWUpOwotICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1BUUik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBBc3N1bWluZyBhIHJlZmVyZW5jZSBleHByZXNzaW9uIGhhcyBiZWVuIHB1c2hlZCwgZW1pdCB0aGUKLSAgIFNUUlVDVE9QX1NUUlVDVCBvcHMgdG8gYWNjZXNzIHRoZSBmaWVsZCBuYW1lZCBOQU1FLiAgSWYgTkFNRSBpcyBhCi0gICBxdWFsaWZpZWQgbmFtZSAoaGFzICcuJyksIGdlbmVyYXRlIGEgZmllbGQgYWNjZXNzIGZvciBlYWNoIHBhcnQuICovCi0KLXN0YXRpYyB2b2lkCi1wdXNoX2ZpZWxkbmFtZXMgKG5hbWUpCi0gICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBzdG9rZW4gdG9rZW47Ci0gIHRva2VuLnB0ciA9IG5hbWUucHRyOwotICBmb3IgKGkgPSAwOyAgOyAgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID09IG5hbWUubGVuZ3RoIHx8IG5hbWUucHRyW2ldID09ICcuJykKLQl7Ci0JICAvKiB0b2tlbi5wdHIgaXMgc3RhcnQgb2YgY3VycmVudCBmaWVsZCBuYW1lLiAqLwotCSAgdG9rZW4ubGVuZ3RoID0gJm5hbWUucHRyW2ldIC0gdG9rZW4ucHRyOwotCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1NUUlVDVCk7Ci0JICB3cml0ZV9leHBfc3RyaW5nICh0b2tlbik7Ci0JICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsKLQkgIHRva2VuLnB0ciArPSB0b2tlbi5sZW5ndGggKyAxOwotCX0KLSAgICAgIGlmIChpID49IG5hbWUubGVuZ3RoKQotCWJyZWFrOwotICAgIH0KLX0KLQotLyogSGVscGVyIHJvdXRpbmUgZm9yIHB1c2hfZXhwcmVzc2lvbl9uYW1lLgotICAgSGFuZGxlIGEgcXVhbGlmaWVkIG5hbWUsIHdoZXJlIERPVF9JTkRFWCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0ICcuJyAqLwotCi1zdGF0aWMgdm9pZAotcHVzaF9xdWFsaWZpZWRfZXhwcmVzc2lvbl9uYW1lIChuYW1lLCBkb3RfaW5kZXgpCi0gICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKLSAgICAgaW50IGRvdF9pbmRleDsKLXsKLSAgc3RydWN0IHN0b2tlbiB0b2tlbjsKLSAgY2hhciAqdG1wOwotICBzdHJ1Y3QgdHlwZSAqdHlwOwotCi0gIHRva2VuLnB0ciA9IG5hbWUucHRyOwotICB0b2tlbi5sZW5ndGggPSBkb3RfaW5kZXg7Ci0KLSAgaWYgKHB1c2hfdmFyaWFibGUgKHRva2VuKSkKLSAgICB7Ci0gICAgICB0b2tlbi5wdHIgPSBuYW1lLnB0ciArIGRvdF9pbmRleCArIDE7Ci0gICAgICB0b2tlbi5sZW5ndGggPSBuYW1lLmxlbmd0aCAtIGRvdF9pbmRleCAtIDE7Ci0gICAgICBwdXNoX2ZpZWxkbmFtZXMgKHRva2VuKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdG9rZW4ucHRyID0gbmFtZS5wdHI7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgdG9rZW4ubGVuZ3RoID0gZG90X2luZGV4OwotICAgICAgdG1wID0gY29weV9uYW1lICh0b2tlbik7Ci0gICAgICB0eXAgPSBqYXZhX2xvb2t1cF9jbGFzcyAodG1wKTsKLSAgICAgIGlmICh0eXAgIT0gTlVMTCkKLQl7Ci0JICBpZiAoZG90X2luZGV4ID09IG5hbWUubGVuZ3RoKQotCSAgICB7Ci0JICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0JICAgICAgd3JpdGVfZXhwX2VsdF90eXBlKHR5cCk7Ci0JICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBkb3RfaW5kZXgrKzsgIC8qIFNraXAgJy4nICovCi0JICBuYW1lLnB0ciArPSBkb3RfaW5kZXg7Ci0JICBuYW1lLmxlbmd0aCAtPSBkb3RfaW5kZXg7Ci0JICBkb3RfaW5kZXggPSAwOwotCSAgd2hpbGUgKGRvdF9pbmRleCA8IG5hbWUubGVuZ3RoICYmIG5hbWUucHRyW2RvdF9pbmRleF0gIT0gJy4nKSAKLQkgICAgZG90X2luZGV4Kys7Ci0JICB0b2tlbi5wdHIgPSBuYW1lLnB0cjsKLQkgIHRva2VuLmxlbmd0aCA9IGRvdF9pbmRleDsKLQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TQ09QRSk7Ci0JICB3cml0ZV9leHBfZWx0X3R5cGUgKHR5cCk7Ci0JICB3cml0ZV9leHBfc3RyaW5nICh0b2tlbik7Ci0JICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU0NPUEUpOyAKLQkgIGlmIChkb3RfaW5kZXggPCBuYW1lLmxlbmd0aCkKLQkgICAgewotCSAgICAgIGRvdF9pbmRleCsrOwotCSAgICAgIG5hbWUucHRyICs9IGRvdF9pbmRleDsKLQkgICAgICBuYW1lLmxlbmd0aCAtPSBkb3RfaW5kZXg7Ci0JICAgICAgcHVzaF9maWVsZG5hbWVzIChuYW1lKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGRvdF9pbmRleCA+PSBuYW1lLmxlbmd0aCkKLQlicmVhazsKLSAgICAgIGRvdF9pbmRleCsrOyAgLyogU2tpcCAnLicgKi8KLSAgICAgIHdoaWxlIChkb3RfaW5kZXggPCBuYW1lLmxlbmd0aCAmJiBuYW1lLnB0cltkb3RfaW5kZXhdICE9ICcuJykKLQlkb3RfaW5kZXgrKzsKLSAgICB9Ci0gIGVycm9yICgidW5rbm93biB0eXBlIGAlLipzJyIsIG5hbWUubGVuZ3RoLCBuYW1lLnB0cik7Ci19Ci0KLS8qIEhhbmRsZSBOYW1lIGluIGFuIGV4cHJlc3Npb24gKG9yIExIUykuCi0gICBIYW5kbGUgVkFSLCBUWVBFLCBUWVBFLkZJRUxEMS4uLi5GSUVMRE4gYW5kIFZBUi5GSUVMRDEuLi4uRklFTEROLiAqLwotCi1zdGF0aWMgdm9pZAotcHVzaF9leHByZXNzaW9uX25hbWUgKG5hbWUpCi0gICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKLXsKLSAgY2hhciAqdG1wOwotICBzdHJ1Y3QgdHlwZSAqdHlwOwotICBjaGFyICpwdHI7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7ICBpIDwgbmFtZS5sZW5ndGg7ICBpKyspCi0gICAgewotICAgICAgaWYgKG5hbWUucHRyW2ldID09ICcuJykKLQl7Ci0JICAvKiBJdCdzIGEgUXVhbGlmaWVkIEV4cHJlc3Npb24gTmFtZS4gKi8KLQkgIHB1c2hfcXVhbGlmaWVkX2V4cHJlc3Npb25fbmFtZSAobmFtZSwgaSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBJdCdzIGEgU2ltcGxlIEV4cHJlc3Npb24gTmFtZS4gKi8KLSAgCi0gIGlmIChwdXNoX3ZhcmlhYmxlIChuYW1lKSkKLSAgICByZXR1cm47Ci0gIHRtcCA9IGNvcHlfbmFtZSAobmFtZSk7Ci0gIHR5cCA9IGphdmFfbG9va3VwX2NsYXNzICh0bXApOwotICBpZiAodHlwICE9IE5VTEwpCi0gICAgewotICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0gICAgICB3cml0ZV9leHBfZWx0X3R5cGUodHlwKTsKLSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKLQotICAgICAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAodG1wLCBOVUxMLCBOVUxMKTsKLSAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCi0JewotCSAgd3JpdGVfZXhwX21zeW1ib2wgKG1zeW1ib2wsCi0JCQkgICAgIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKLQkJCSAgICAgYnVpbHRpbl90eXBlX2ludCk7Ci0JfQotICAgICAgZWxzZSBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKLQllcnJvciAoIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuICBVc2UgdGhlIFwiZmlsZVwiIGNvbW1hbmQuIik7Ci0gICAgICBlbHNlCi0JZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLCB0bXApOwotICAgIH0KLQotfQotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHdvIHJvdXRpbmVzLCBjb3B5X2V4cCBhbmQgaW5zZXJ0X2V4cCwgYXJlbid0IHNwZWNpZmljIHRvCi0gICBKYXZhLCBzbyB0aGV5IGNvdWxkIGdvIGluIHBhcnNlLmMsIGJ1dCB0aGVpciBvbmx5IHB1cnBvc2UgaXMgdG8gc3VwcG9ydAotICAgdGhlIHBhcnNpbmcga2x1ZGdlcyB3ZSB1c2UgaW4gdGhpcyBmaWxlLCBzbyBtYXliZSBpdCdzIGJlc3QgdG8gaXNvbGF0ZQotICAgdGhlbSBoZXJlLiAgKi8KLQotLyogQ29weSB0aGUgZXhwcmVzc2lvbiB3aG9zZSBsYXN0IGVsZW1lbnQgaXMgYXQgaW5kZXggRU5EUE9TIC0gMSBpbiBFWFBSCi0gICBpbnRvIGEgZnJlc2hseSB4bWFsbG9jJ2VkIHN0cnVjdCBleHByZXNzaW9uLiAgSXRzIGxhbmd1YWdlX2RlZm4gaXMgc2V0Ci0gICB0byBudWxsLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1jb3B5X2V4cCAoZXhwciwgZW5kcG9zKQotICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcjsKLSAgICAgaW50IGVuZHBvczsKLXsKLSAgaW50IGxlbiA9IGxlbmd0aF9vZl9zdWJleHAgKGV4cHIsIGVuZHBvcyk7Ci0gIHN0cnVjdCBleHByZXNzaW9uICpuZXcKLSAgICA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSB4bWFsbG9jIChzaXplb2YgKCpuZXcpICsgRVhQX0VMRU1fVE9fQllURVMgKGxlbikpOwotICBuZXctPm5lbHRzID0gbGVuOwotICBtZW1jcHkgKG5ldy0+ZWx0cywgZXhwci0+ZWx0cyArIGVuZHBvcyAtIGxlbiwgRVhQX0VMRU1fVE9fQllURVMgKGxlbikpOwotICBuZXctPmxhbmd1YWdlX2RlZm4gPSAwOwotCi0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIEluc2VydCB0aGUgZXhwcmVzc2lvbiBORVcgaW50byB0aGUgY3VycmVudCBleHByZXNzaW9uIChleHBvdXQpIGF0IFBPUy4gICovCi1zdGF0aWMgdm9pZAotaW5zZXJ0X2V4cCAocG9zLCBuZXcpCi0gICAgIGludCBwb3M7Ci0gICAgIHN0cnVjdCBleHByZXNzaW9uICpuZXc7Ci17Ci0gIGludCBuZXdsZW4gPSBuZXctPm5lbHRzOwotCi0gIC8qIEdyb3cgZXhwb3V0IGlmIG5lY2Vzc2FyeS4gIEluIHRoaXMgZnVuY3Rpb24ncyBvbmx5IHVzZSBhdCBwcmVzZW50LAotICAgICB0aGlzIHNob3VsZCBuZXZlciBiZSBuZWNlc3NhcnkuICAqLwotICBpZiAoZXhwb3V0X3B0ciArIG5ld2xlbiA+IGV4cG91dF9zaXplKQotICAgIHsKLSAgICAgIGV4cG91dF9zaXplID0gbWF4IChleHBvdXRfc2l6ZSAqIDIsIGV4cG91dF9wdHIgKyBuZXdsZW4gKyAxMCk7Ci0gICAgICBleHBvdXQgPSAoc3RydWN0IGV4cHJlc3Npb24gKikKLQl4cmVhbGxvYyAoKGNoYXIgKikgZXhwb3V0LCAoc2l6ZW9mIChzdHJ1Y3QgZXhwcmVzc2lvbikKLQkJCQkgICAgKyBFWFBfRUxFTV9UT19CWVRFUyAoZXhwb3V0X3NpemUpKSk7Ci0gICAgfQotCi0gIHsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IGV4cG91dF9wdHIgLSAxOyBpID49IHBvczsgaS0tKQotICAgICAgZXhwb3V0LT5lbHRzW2kgKyBuZXdsZW5dID0gZXhwb3V0LT5lbHRzW2ldOwotICB9Ci0gIAotICBtZW1jcHkgKGV4cG91dC0+ZWx0cyArIHBvcywgbmV3LT5lbHRzLCBFWFBfRUxFTV9UT19CWVRFUyAobmV3bGVuKSk7Ci0gIGV4cG91dF9wdHIgKz0gbmV3bGVuOwotfQpkaWZmIC0tZ2l0IGEvZ2RiL20yLWV4cC50YWIuYyBiL2dkYi9tMi1leHAudGFiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmM2ODEuLjAwMDAwMDAKLS0tIGEvZ2RiL20yLWV4cC50YWIuYworKysgL2Rldi9udWxsCkBAIC0xLDIwODkgKzAsMCBAQAotCi0vKiAgQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSBtMi1leHAueQotIGJ5ICBHTlUgQmlzb24gdmVyc2lvbiAxLjI1Ci0gICovCi0KLSNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLwotCi0jZGVmaW5lCUlOVAkyNTgKLSNkZWZpbmUJSEVYCTI1OQotI2RlZmluZQlFUlJPUgkyNjAKLSNkZWZpbmUJVUlOVAkyNjEKLSNkZWZpbmUJTTJfVFJVRQkyNjIKLSNkZWZpbmUJTTJfRkFMU0UJMjYzCi0jZGVmaW5lCUNIQVIJMjY0Ci0jZGVmaW5lCUZMT0FUCTI2NQotI2RlZmluZQlTVFJJTkcJMjY2Ci0jZGVmaW5lCU5BTUUJMjY3Ci0jZGVmaW5lCUJMT0NLTkFNRQkyNjgKLSNkZWZpbmUJSURFTlQJMjY5Ci0jZGVmaW5lCVZBUk5BTUUJMjcwCi0jZGVmaW5lCVRZUEVOQU1FCTI3MQotI2RlZmluZQlTSVpFCTI3MgotI2RlZmluZQlDQVAJMjczCi0jZGVmaW5lCU9SRAkyNzQKLSNkZWZpbmUJSElHSAkyNzUKLSNkZWZpbmUJQUJTCTI3NgotI2RlZmluZQlNSU5fRlVOQwkyNzcKLSNkZWZpbmUJTUFYX0ZVTkMJMjc4Ci0jZGVmaW5lCUZMT0FUX0ZVTkMJMjc5Ci0jZGVmaW5lCVZBTAkyODAKLSNkZWZpbmUJQ0hSCTI4MQotI2RlZmluZQlPREQJMjgyCi0jZGVmaW5lCVRSVU5DCTI4MwotI2RlZmluZQlJTkMJMjg0Ci0jZGVmaW5lCURFQwkyODUKLSNkZWZpbmUJSU5DTAkyODYKLSNkZWZpbmUJRVhDTAkyODcKLSNkZWZpbmUJQ09MT05DT0xPTgkyODgKLSNkZWZpbmUJSU5URVJOQUxfVkFSCTI4OQotI2RlZmluZQlBQk9WRV9DT01NQQkyOTAKLSNkZWZpbmUJQVNTSUdOCTI5MQotI2RlZmluZQlMRVEJMjkyCi0jZGVmaW5lCUdFUQkyOTMKLSNkZWZpbmUJTk9URVFVQUwJMjk0Ci0jZGVmaW5lCUlOCTI5NQotI2RlZmluZQlPUk9SCTI5NgotI2RlZmluZQlMT0dJQ0FMX0FORAkyOTcKLSNkZWZpbmUJRElWCTI5OAotI2RlZmluZQlNT0QJMjk5Ci0jZGVmaW5lCVVOQVJZCTMwMAotI2RlZmluZQlET1QJMzAxCi0jZGVmaW5lCU5PVAkzMDIKLSNkZWZpbmUJUUlECTMwMwotCi0jbGluZSA0MCAibTItZXhwLnkiCi0KLQotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCi0jaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgImxhbmd1YWdlLmgiCi0jaW5jbHVkZSAidmFsdWUuaCIKLSNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgotI2luY2x1ZGUgIm0yLWxhbmcuaCIKLSNpbmNsdWRlICJiZmQuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCi0jaW5jbHVkZSAic3ltZmlsZS5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KLSNpbmNsdWRlICJvYmpmaWxlcy5oIiAvKiBGb3IgaGF2ZV9mdWxsX3N5bWJvbHMgYW5kIGhhdmVfcGFydGlhbF9zeW1ib2xzICovCi0KLS8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLCBldGMpLAotICAgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMsIHNvIHdlIGNhbiBoYXZlIG11bHRpcGxlCi0gICB5YWNjIGdlbmVyYXRlZCBwYXJzZXJzIGluIGdkYi4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSB0aGUgdmFyaWFibGVzCi0gICBwcm9kdWNlZCBieSB5YWNjLiAgSWYgb3RoZXIgcGFyc2VyIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlCi0gICBhZGRpdGlvbmFsIGdsb2JhbCBuYW1lcyB0aGF0IGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIKLSAgIGdlbmVyYXRvcnMgbmVlZCB0byBiZSBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCi0KLSNkZWZpbmUJeXltYXhkZXB0aCBtMl9tYXhkZXB0aAotI2RlZmluZQl5eXBhcnNlCW0yX3BhcnNlCi0jZGVmaW5lCXl5bGV4CW0yX2xleAotI2RlZmluZQl5eWVycm9yCW0yX2Vycm9yCi0jZGVmaW5lCXl5bHZhbAltMl9sdmFsCi0jZGVmaW5lCXl5Y2hhcgltMl9jaGFyCi0jZGVmaW5lCXl5ZGVidWcJbTJfZGVidWcKLSNkZWZpbmUJeXlwYWN0CW0yX3BhY3QKLSNkZWZpbmUJeXlyMQltMl9yMQotI2RlZmluZQl5eXIyCW0yX3IyCi0jZGVmaW5lCXl5ZGVmCW0yX2RlZgotI2RlZmluZQl5eWNoawltMl9jaGsKLSNkZWZpbmUJeXlwZ28JbTJfcGdvCi0jZGVmaW5lCXl5YWN0CW0yX2FjdAotI2RlZmluZQl5eWV4Y2EJbTJfZXhjYQotI2RlZmluZQl5eWVycmZsYWcgbTJfZXJyZmxhZwotI2RlZmluZQl5eW5lcnJzCW0yX25lcnJzCi0jZGVmaW5lCXl5cHMJbTJfcHMKLSNkZWZpbmUJeXlwdgltMl9wdgotI2RlZmluZQl5eXMJbTJfcwotI2RlZmluZQl5eV95eXMJbTJfeXlzCi0jZGVmaW5lCXl5c3RhdGUJbTJfc3RhdGUKLSNkZWZpbmUJeXl0bXAJbTJfdG1wCi0jZGVmaW5lCXl5dgltMl92Ci0jZGVmaW5lCXl5X3l5dgltMl95eXYKLSNkZWZpbmUJeXl2YWwJbTJfdmFsCi0jZGVmaW5lCXl5bGxvYwltMl9sbG9jCi0jZGVmaW5lCXl5cmVkcwltMl9yZWRzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZQl5eXRva3MJbTJfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJbTJfeXlsaHMKLSNkZWZpbmUgeXlsZW4JbTJfeXlsZW4KLSNkZWZpbmUgeXlkZWZyZWQgbTJfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwltMl95eWRnb3RvCi0jZGVmaW5lIHl5c2luZGV4IG0yX3l5c2luZGV4Ci0jZGVmaW5lIHl5cmluZGV4IG0yX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IG0yX3l5Z2luZGV4Ci0jZGVmaW5lIHl5dGFibGUJIG0yX3l5dGFibGUKLSNkZWZpbmUgeXljaGVjawkgbTJfeXljaGVjawotCi0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUJWVlERUJVRwkwCQkvKiBEZWZhdWx0IHRvIG5vIHl5ZGVidWcgc3VwcG9ydCAqLwotI2VuZGlmCi0KLWludAoteXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbnQKLXl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAoteXllcnJvciBQQVJBTVMgKChjaGFyICopKTsKLQotI2lmIDAKLXN0YXRpYyBjaGFyICoKLW1ha2VfcXVhbG5hbWUgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1wYXJzZV9udW1iZXIgUEFSQU1TICgoaW50KSk7Ci0KLS8qIFRoZSBzaWduIG9mIHRoZSBudW1iZXIgYmVpbmcgcGFyc2VkLiAqLwotc3RhdGljIGludCBudW1iZXJfc2lnbiA9IDE7Ci0KLS8qIFRoZSBibG9jayB0aGF0IHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5IHRoZSBxdWFsaWZlciBvbiBhbiBpZGVudGlmZXIgaXMKLSAgIGNvbnRhaW5lZCBpbiwgKi8KLSNpZiAwCi1zdGF0aWMgc3RydWN0IGJsb2NrICptb2RibG9jaz0wOwotI2VuZGlmCi0KLQotI2xpbmUgMTM1ICJtMi1leHAueSIKLXR5cGVkZWYgdW5pb24KLSAgewotICAgIExPTkdFU1QgbHZhbDsKLSAgICBVTE9OR0VTVCB1bHZhbDsKLSAgICBET1VCTEVTVCBkdmFsOwotICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKLSAgICBzdHJ1Y3QgdHlwZSAqdHZhbDsKLSAgICBzdHJ1Y3Qgc3Rva2VuIHN2YWw7Ci0gICAgaW50IHZvaWR2YWw7Ci0gICAgc3RydWN0IGJsb2NrICpidmFsOwotICAgIGVudW0gZXhwX29wY29kZSBvcGNvZGU7Ci0gICAgc3RydWN0IGludGVybmFsdmFyICppdmFyOwotCi0gICAgc3RydWN0IHR5cGUgKip0dmVjOwotICAgIGludCAqaXZlYzsKLSAgfSBZWVNUWVBFOwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZm5kZWYgX19jcGx1c3BsdXMKLSNpZm5kZWYgX19TVERDX18KLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotI2VuZGlmCi0KLQotCi0jZGVmaW5lCVlZRklOQUwJCTE4MQotI2RlZmluZQlZWUZMQUcJCS0zMjc2OAotI2RlZmluZQlZWU5UQkFTRQk2OAotCi0jZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDMwMyA/IHl5dHJhbnNsYXRlW3hdIDogODIpCi0KLXN0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPSB7ICAgICAwLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA0NCwgICAgIDIsICAgICAyLCAgICA0OCwgICAgIDIsICAgIDYwLAotICAgIDY0LCAgICA1MiwgICAgNTAsICAgIDM1LCAgICA1MSwgICAgIDIsICAgIDUzLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDM4LAotICAgIDQyLCAgICAzOSwgICAgIDIsICAgIDQ5LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgIDU5LCAgICAgMiwgICAgNjcsICAgIDU3LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgNjUsICAgICAyLCAgICA2NiwgICAgNjIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LAotICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsICAgIDM2LAotICAgIDM3LCAgICA0MCwgICAgNDEsICAgIDQzLCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA1NCwgICAgNTUsICAgIDU2LAotICAgIDU4LCAgICA2MSwgICAgNjMKLX07Ci0KLSNpZiBZWURFQlVHICE9IDAKLXN0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9IHsgICAgIDAsCi0gICAgIDAsICAgICAyLCAgICAgNCwgICAgIDYsICAgICA5LCAgICAxMCwgICAgMTQsICAgIDE3LCAgICAyMCwgICAgMjIsCi0gICAgMjQsICAgIDI5LCAgICAzNCwgICAgMzksICAgIDQ0LCAgICA0OSwgICAgNTQsICAgIDU5LCAgICA2NiwgICAgNzEsCi0gICAgNzYsICAgIDgxLCAgICA4NCwgICAgODksICAgIDk2LCAgIDEwMSwgICAxMDgsICAgMTEyLCAgIDExNCwgICAxMTgsCi0gICAxMjUsICAgMTMyLCAgIDEzNiwgICAxNDEsICAgMTQyLCAgIDE0OCwgICAxNDksICAgMTU1LCAgIDE1NiwgICAxNTgsCi0gICAxNjIsICAgMTY0LCAgIDE2OCwgICAxNzMsICAgMTc4LCAgIDE4MiwgICAxODYsICAgMTkwLCAgIDE5NCwgICAxOTgsCi0gICAyMDIsICAgMjA2LCAgIDIxMCwgICAyMTQsICAgMjE4LCAgIDIyMiwgICAyMjYsICAgMjMwLCAgIDIzNCwgICAyMzgsCi0gICAyNDIsICAgMjQ2LCAgIDI1MCwgICAyNTIsICAgMjU0LCAgIDI1NiwgICAyNTgsICAgMjYwLCAgIDI2MiwgICAyNjQsCi0gICAyNjksICAgMjcxLCAgIDI3MywgICAyNzUsICAgMjc5LCAgIDI4MSwgICAyODMsICAgMjg3LCAgIDI4OQotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cmhzW10gPSB7ICAgIDcwLAotICAgICAwLCAgICA2OSwgICAgIDAsICAgIDgxLCAgICAgMCwgICAgNzAsICAgIDU3LCAgICAgMCwgICAgIDAsICAgIDUxLAotICAgIDcxLCAgICA3MCwgICAgIDAsICAgIDUwLCAgICA3MCwgICAgIDAsICAgIDcyLCAgICA3MCwgICAgIDAsICAgIDYxLAotICAgICAwLCAgICA2MiwgICAgIDAsICAgIDE4LCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgMTksICAgIDYwLAotICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDIxLCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgMjAsICAgIDYwLAotICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDIyLCAgICA2MCwgICAgODEsICAgIDY0LCAgICAgMCwgICAgMjMsICAgIDYwLAotICAgIDgxLCAgICA2NCwgICAgIDAsICAgIDI0LCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgMjUsICAgIDYwLAotICAgIDgxLCAgICAzNSwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgMjYsICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLAotICAgIDI3LCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgMjgsICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLAotICAgIDE3LCAgICA3MCwgICAgIDAsICAgIDI5LCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgMjksICAgIDYwLAotICAgIDcwLCAgICAzNSwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgMzAsICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLAotICAgIDMwLCAgICA2MCwgICAgNzAsICAgIDM1LCAgICA3MCwgICAgNjQsICAgICAwLCAgICA3MCwgICAgNTgsICAgIDEyLAotICAgICAwLCAgICA3MywgICAgIDAsICAgIDcwLCAgICA0NSwgICAgNzMsICAgICAwLCAgICAzMSwgICAgNjAsICAgIDcwLAotICAgIDM1LCAgICA3MCwgICAgNjQsICAgICAwLCAgICAzMiwgICAgNjAsICAgIDcwLCAgICAzNSwgICAgNzAsICAgIDY0LAotICAgICAwLCAgICA2NSwgICAgNzYsICAgIDY2LCAgICAgMCwgICAgODEsICAgIDY1LCAgICA3NiwgICAgNjYsICAgICAwLAotICAgICAwLCAgICA3MCwgICAgNTksICAgIDc0LCAgICA3NywgICAgNjcsICAgICAwLCAgICAgMCwgICAgNzAsICAgIDYwLAotICAgIDc1LCAgICA3NiwgICAgNjQsICAgICAwLCAgICAgMCwgICAgNzAsICAgICAwLCAgICA3NiwgICAgMzUsICAgIDcwLAotICAgICAwLCAgICA3MCwgICAgIDAsICAgIDc3LCAgICAzNSwgICAgNzAsICAgICAwLCAgICA2NSwgICAgODEsICAgIDY2LAotICAgIDcwLCAgICAgMCwgICAgODEsICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLCAgICA2MCwgICAgNzAsICAgIDY0LAotICAgICAwLCAgICA3MCwgICAgNDksICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDUyLCAgICA3MCwgICAgIDAsICAgIDcwLAotICAgIDUzLCAgICA3MCwgICAgIDAsICAgIDcwLCAgICA1NCwgICAgNzAsICAgICAwLCAgICA3MCwgICAgNTUsICAgIDcwLAotICAgICAwLCAgICA3MCwgICAgNTAsICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDUxLCAgICA3MCwgICAgIDAsICAgIDcwLAotICAgIDQyLCAgICA3MCwgICAgIDAsICAgIDcwLCAgICA0MywgICAgNzAsICAgICAwLCAgICA3MCwgICAgNDQsICAgIDcwLAotICAgICAwLCAgICA3MCwgICAgNDAsICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDQxLCAgICA3MCwgICAgIDAsICAgIDcwLAotICAgIDM4LCAgICA3MCwgICAgIDAsICAgIDcwLCAgICAzOSwgICAgNzAsICAgICAwLCAgICA3MCwgICAgNDcsICAgIDcwLAotICAgICAwLCAgICA3MCwgICAgNDYsICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDM3LCAgICA3MCwgICAgIDAsICAgICA3LAotICAgICAwLCAgICAgOCwgICAgIDAsICAgICAzLCAgICAgMCwgICAgIDYsICAgICAwLCAgICAgOSwgICAgIDAsICAgIDEwLAotICAgICAwLCAgICA4MCwgICAgIDAsICAgIDE3LCAgICA2MCwgICAgODEsICAgIDY0LCAgICAgMCwgICAgMTEsICAgICAwLAotICAgIDc5LCAgICAgMCwgICAgMTMsICAgICAwLCAgICA3OCwgICAgMzMsICAgIDEzLCAgICAgMCwgICAgNzksICAgICAwLAotICAgIDM0LCAgICAgMCwgICAgNzgsICAgIDMzLCAgICAxMiwgICAgIDAsICAgIDEyLCAgICAgMCwgICAgMTYsICAgICAwCi19OwotCi0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotc3RhdGljIGNvbnN0IHNob3J0IHl5cmxpbmVbXSA9IHsgMCwKLSAgIDIwNCwgICAyMDUsICAgMjA4LCAgIDIxNywgICAyMjAsICAgMjIyLCAgIDIyNywgICAyMzEsICAgMjM1LCAgIDIzNiwKLSAgIDIzOSwgICAyNDMsICAgMjQ3LCAgIDI1MSwgICAyNTUsICAgMjYxLCAgIDI2NywgICAyNzEsICAgMjc3LCAgIDI4MSwKLSAgIDI4NSwgICAyODksICAgMjk0LCAgIDI5OCwgICAzMDQsICAgMzA4LCAgIDMxNCwgICAzMjAsICAgMzIzLCAgIDMyNywKLSAgIDMzMSwgICAzMzQsICAgMzM2LCAgIDM0MiwgICAzNDcsICAgMzUzLCAgIDM1NywgICAzNjMsICAgMzY2LCAgIDM3MCwKLSAgIDM3NSwgICAzODAsICAgMzg1LCAgIDM5MSwgICAzOTcsICAgNDA1LCAgIDQwOSwgICA0MTMsICAgNDE3LCAgIDQyMSwKLSAgIDQyNSwgICA0MjksICAgNDMzLCAgIDQzNywgICA0MzksICAgNDQzLCAgIDQ0NywgICA0NTEsICAgNDU1LCAgIDQ1OSwKLSAgIDQ2MywgICA0NjcsICAgNDc0LCAgIDQ4MCwgICA0ODYsICAgNDkzLCAgIDUwMiwgICA1MTAsICAgNTE3LCAgIDUyMCwKLSAgIDUyNywgICA1MzQsICAgNTM4LCAgIDU0NywgICA1NTksICAgNTY3LCAgIDU3MSwgICA1ODcsICAgNjM4Ci19OwotI2VuZGlmCi0KLQotI2lmIFlZREVCVUcgIT0gMCB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeXl0bmFtZVtdID0geyAgICIkIiwiZXJyb3IiLCIkdW5kZWZpbmVkLiIsIklOVCIsIkhFWCIsCi0iRVJST1IiLCJVSU5UIiwiTTJfVFJVRSIsIk0yX0ZBTFNFIiwiQ0hBUiIsIkZMT0FUIiwiU1RSSU5HIiwiTkFNRSIsIkJMT0NLTkFNRSIsCi0iSURFTlQiLCJWQVJOQU1FIiwiVFlQRU5BTUUiLCJTSVpFIiwiQ0FQIiwiT1JEIiwiSElHSCIsIkFCUyIsIk1JTl9GVU5DIiwiTUFYX0ZVTkMiLAotIkZMT0FUX0ZVTkMiLCJWQUwiLCJDSFIiLCJPREQiLCJUUlVOQyIsIklOQyIsIkRFQyIsIklOQ0wiLCJFWENMIiwiQ09MT05DT0xPTiIsCi0iSU5URVJOQUxfVkFSIiwiJywnIiwiQUJPVkVfQ09NTUEiLCJBU1NJR04iLCInPCciLCInPiciLCJMRVEiLCJHRVEiLCInPSciLCJOT1RFUVVBTCIsCi0iJyMnIiwiSU4iLCJPUk9SIiwiTE9HSUNBTF9BTkQiLCInJiciLCInQCciLCInKyciLCInLSciLCInKiciLCInLyciLCJESVYiLCJNT0QiLAotIlVOQVJZIiwiJ14nIiwiRE9UIiwiJ1snIiwiJygnIiwiTk9UIiwiJ34nIiwiUUlEIiwiJyknIiwiJ3snIiwiJ30nIiwiJ10nIiwic3RhcnQiLAotInR5cGVfZXhwIiwiZXhwIiwiQDEiLCJub3RfZXhwIiwic2V0IiwiQDIiLCJAMyIsImFyZ2xpc3QiLCJub25fZW1wdHlfYXJnbGlzdCIsCi0iYmxvY2siLCJmYmxvY2siLCJ2YXJpYWJsZSIsInR5cGUiLCBOVUxMCi19OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXIxW10gPSB7ICAgICAwLAotICAgIDY4LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzIsICAgIDcyLAotICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLAotICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLAotICAgIDcwLCAgICA3MywgICAgNzMsICAgIDc0LCAgICA3MCwgICAgNzUsICAgIDcwLCAgICA3NiwgICAgNzYsICAgIDc2LAotICAgIDc3LCAgICA3NywgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLAotICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLAotICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLAotICAgIDcwLCAgICA3OCwgICAgNzksICAgIDc5LCAgICA4MCwgICAgODAsICAgIDgwLCAgICA4MCwgICAgODEKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXIyW10gPSB7ICAgICAwLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLAotICAgICA0LCAgICAgNCwgICAgIDQsICAgICA0LCAgICAgNCwgICAgIDQsICAgICA0LCAgICAgNiwgICAgIDQsICAgICA0LAotICAgICA0LCAgICAgMiwgICAgIDQsICAgICA2LCAgICAgNCwgICAgIDYsICAgICAzLCAgICAgMSwgICAgIDMsICAgICA2LAotICAgICA2LCAgICAgMywgICAgIDQsICAgICAwLCAgICAgNSwgICAgIDAsICAgICA1LCAgICAgMCwgICAgIDEsICAgICAzLAotICAgICAxLCAgICAgMywgICAgIDQsICAgICA0LCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLAotICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLAotICAgICAzLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICA0LAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDEKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0geyAgICAgMCwKLSAgICA2NSwgICAgNjYsICAgIDYzLCAgICA2NCwgICAgNjcsICAgIDY4LCAgICA3MSwgICAgNzgsICAgIDczLCAgICA3OSwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA3NiwgICAgIDAsICAgICA1LCAgICAgMCwKLSAgICAgOSwgICAgMTAsICAgIDM4LCAgICAgMiwgICAgIDEsICAgICAwLCAgICAyOCwgICAgIDAsICAgIDc1LCAgICA2OSwKLSAgICAgMywgICAgIDAsICAgIDIyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgNywKLSAgICAgMCwgICAgIDAsICAgIDM5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgNCwgICAgIDAsICAgIDM0LCAgICAzNiwgICAgIDgsICAgICAwLCAgICAgMCwKLSAgICAzOCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDYsICAgIDQ1LCAgICAgMCwKLSAgICAzMiwgICAgIDAsICAgIDYyLCAgICA1OCwgICAgNTksICAgIDU2LCAgICA1NywgICAgNTMsICAgIDU0LCAgICA1NSwKLSAgICAzOCwgICAgMjksICAgICAwLCAgICA2MSwgICAgNjAsICAgIDQ2LCAgICA1MSwgICAgNTIsICAgIDQ3LCAgICA0OCwKLSAgICA0OSwgICAgNTAsICAgIDI3LCAgICAgMCwgICAgMzgsICAgIDc3LCAgICA3NCwgICAgIDAsICAgICAwLCAgICA3MCwKLSAgICAxMSwgICAgMTIsICAgIDE0LCAgICAxMywgICAgMTUsICAgIDE2LCAgICAxNywgICAgIDAsICAgIDE5LCAgICAyMCwKLSAgICAyMSwgICAgIDAsICAgIDIzLCAgICAgMCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgNDAsICAgIDQzLCAgICA0MSwKLSAgICAgMCwgICAgIDAsICAgIDQ0LCAgICAzMywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAzNSwgICAgMzcsICAgIDE4LCAgICAyNCwgICAgMjYsICAgIDMwLCAgICAzMSwgICAgNDIsICAgICAwLCAgICAgMCwKLSAgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmZ290b1tdID0geyAgIDE3OSwKLSAgICAzNCwgICAgNjMsICAgIDYxLCAgICAzNiwgICAgMzcsICAgMTM0LCAgIDEzNSwgICAgNjQsICAgMTYxLCAgICAzOCwKLSAgICAzOSwgICAgNDAsICAgIDQ0Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwYWN0W10gPSB7ICAgMTU1LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotICAgMjE1LCAgIC0yNywgICAtMjIsICAgLTIwLCAgIC0xOSwgICAgMTQsICAgIDI0LCAgICAyNiwgICAgMjcsICAgIDI4LAotICAgIDI5LCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNSwgICAgMzYsLTMyNzY4LCAgIDE1NSwtMzI3NjgsICAgMTU1LAotLTMyNzY4LC0zMjc2OCwgICAxNTUsLTMyNzY4LCAgIDc0MiwgICAxNTUsLTMyNzY4LCAgICAtNiwgICAgLTQsLTMyNzY4LAotICAgLTM0LCAgIDE1NSwgICAgIDUsICAgLTM0LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAgNDQsICAgIDQ0LAotICAgMTU1LCAgICA0NCwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgICA1LAotICAgMTU1LCAgIDI3MiwgICA3NDIsICAgLTMxLCAgIC00MSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LAotICAgMTU1LCAgIDE1NSwgICAxNTUsICAgLTE1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LAotICAgMTU1LCAgIDE1NSwgICAxNTUsLTMyNzY4LCAgICA4NSwtMzI3NjgsLTMyNzY4LCAgICAgNSwgICAgLTUsICAgMTU1LAotICAgMTU1LCAgIC0yMSwgICAzMDAsICAgMzI4LCAgIDM1NiwgICAzODQsICAgIDM0LCAgICAzOSwgICA0MTIsICAgIDY0LAotICAgNDQwLCAgIDQ2OCwgICA0OTYsICAgIDc4LCAgIDI0NCwgICA2OTIsICAgNzE4LCAgICAgNSwtMzI3NjgsICAgMTU1LAotLTMyNzY4LCAgIDE1NSwgICA3NjYsICAgLTM3LCAgIC0zNywgICAtMzcsICAgLTM3LCAgIC0zNywgICAtMzcsICAgLTM3LAotICAgMTU1LC0zMjc2OCwgICAgNDAsICAgMTQxLCAgIDIwMSwgICA3NzcsICAgNzg2LCAgIDc4NiwgICAgIDUsICAgICA1LAotICAgICA1LCAgICAgNSwtMzI3NjgsICAgMTU1LCAgIDE1NSwtMzI3NjgsLTMyNzY4LCAgIDUyNCwgICAtMjksLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDE1NSwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LCAgIDE1NSwtMzI3NjgsICAgMTU1LC0zMjc2OCwgICAxNTUsICAgMTU1LCAgIDc0MiwgICAgIDUsICAgNzQyLAotICAgLTMzLCAgIC0zMiwtMzI3NjgsLTMyNzY4LCAgIDU1MiwgICA1ODAsICAgNjA4LCAgIDYzNiwgICA2NjQsICAgMTU1LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDc0MiwgICAxMDAsICAgMTA2LAotLTMyNzY4Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwZ290b1tdID0gey0zMjc2OCwKLS0zMjc2OCwgICAgIDAsLTMyNzY4LC0zMjc2OCwgICAgMzcsLTMyNzY4LC0zMjc2OCwgICAtODYsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsICAgIDUyCi19OwotCi0KLSNkZWZpbmUJWVlMQVNUCQk4NDYKLQotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXl0YWJsZVtdID0geyAgICAzNSwKLSAgICAxMCwgICAxNzAsICAgMTEwLCAgIDExMCwgICAxMzksICAgMTEwLCAgIDEzNiwgICAxMzcsICAgIDc1LCAgICA3NiwKLSAgICA0MywgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDkwLCAgICA4NCwKLSAgICA4NSwgICAgODYsICAgIDg3LCAgICA5MSwgICAxMTIsICAgIDkwLCAgICA4OSwgICAgNjAsICAgLTcyLCAgICA2MiwKLSAgICA5MSwgICAxNzIsICAgIDQ1LCAgIDE3MSwgICAxMTEsICAgIDg4LCAgIDE2NCwgICAgNDYsICAgIDkwLCAgICA0NywKLSAgICA0OCwgICAgNjIsICAgMTQwLCAgICA5MSwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgMTYyLCAgIDEyMSwKLSAgICA5OSwgICAgNDEsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTA3LCAgICAxMCwKLSAgIDEwOCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgMTEzLCAgIDExNCwgICAxMTUsICAgMTE2LCAgIDExNywKLSAgIDExOCwgICAxMTksICAgMTIwLCAgICA0OSwgICAxMjQsICAgMTI1LCAgIDEyNiwgICAxMjcsICAgMTI4LCAgIDEyOSwKLSAgIDEzMCwgICAxMzEsICAgMTMyLCAgICA1MCwgICAgNjUsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgIDEzOCwKLSAgICA1NSwgICAgNTYsICAgIDU3LCAgICA5MiwgICAgNTgsICAgIDU5LCAgIDEzMywgICAxNDUsICAgMTQ4LCAgIDE4MCwKLSAgICA5NywgICAgOTgsICAgMTQ2LCAgIDEwMCwgICAgOTEsICAgMTgxLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE1OCwKLSAgIDEyMiwgICAxNTksICAgMTUyLCAgICAgMCwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwKLSAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgMTIzLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwKLSAgICA4MSwgICAgODIsICAgIDgzLCAgIDE2MCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAxNTMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNjUsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAxNjYsICAgICAwLCAgIDE2NywgICAgIDAsICAgMTY4LCAgIDE2OSwgICAgIDEsICAgICAwLCAgICAgMCwKLSAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICAwLCAgIDE3OCwKLSAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKLSAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgNzYsICAgIDI3LCAgICA3NywKLSAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwKLSAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjgsICAgIDI5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgIDEsICAgICAwLCAgICAzMywKLSAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICAwLCAgICAgMCwKLSAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKLSAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgIDAsICAgIDI3LCAgICA3NywKLSAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwKLSAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjgsICAgIDI5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDIsICAgIDMxLCAgICAzMiwgICAgIDAsICAgMTU0LCAgICAzMywKLSAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwKLSAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwKLSAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxNTUsICAgIDY2LCAgICA2NywKLSAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwKLSAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwKLSAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTA5LCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwKLSAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwKLSAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywKLSAgICAgMCwgICAgIDAsICAgICAwLCAgIDE0MSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwKLSAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwKLSAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAxNDIsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywKLSAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwKLSAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE0MywKLSAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwKLSAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwKLSAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxNDQsICAgIDY2LCAgICA2NywKLSAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwKLSAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwKLSAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQ3LCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwKLSAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwKLSAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywKLSAgICAgMCwgICAgIDAsICAgICAwLCAgIDE0OSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwKLSAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwKLSAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAxNTAsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywKLSAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwKLSAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE1MSwKLSAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwKLSAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwKLSAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxNjMsICAgIDY2LCAgICA2NywKLSAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwKLSAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwKLSAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTczLCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwKLSAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwKLSAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywKLSAgICAgMCwgICAgIDAsICAgICAwLCAgIDE3NCwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwKLSAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwKLSAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAxNzUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywKLSAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwKLSAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE3NiwKLSAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwKLSAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwKLSAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgIDE1NiwgICAxNzcsICAgIDY2LCAgICA2NywKLSAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwKLSAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwKLSAgICA4NiwgICAgODcsICAgMTU3LCAgICAgMCwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwKLSAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwKLSAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDY2LCAgICA2NywKLSAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwKLSAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwKLSAgICA4NiwgICAgODcsLTMyNzY4LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywKLSAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwKLSAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwKLSAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgODAsICAgIDgxLCAgICA4MiwKLSAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXljaGVja1tdID0geyAgICAgMCwKLSAgICAxNiwgICAgMzUsICAgIDM1LCAgICAzNSwgICAgOTEsICAgIDM1LCAgICAxMiwgICAgMTMsICAgIDQ2LCAgICA0NywKLSAgICAxMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDYwLCAgICA1NywKLSAgICA1OCwgICAgNTksICAgIDYwLCAgICA2NSwgICAgNjYsICAgIDYwLCAgICAzMywgICAgMjgsICAgIDMzLCAgICAzMCwKLSAgICA2NSwgICAgNjQsICAgIDYwLCAgICA2NywgICAgNjYsICAgIDM2LCAgICA2NiwgICAgNjAsICAgIDYwLCAgICA2MCwKLSAgICA2MCwgICAgNDIsICAgIDY0LCAgICA2NSwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgMTM1LCAgICA2NSwKLSAgICA1MSwgICAgIDAsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICAxNiwKLSAgICA2MSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwKLSAgICA3MSwgICAgNzIsICAgIDczLCAgICA2MCwgICAgNzUsICAgIDc2LCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwKLSAgICA4MSwgICAgODIsICAgIDgzLCAgICA2MCwgICAgMzMsICAgIDYwLCAgICA2MCwgICAgNjAsICAgIDYwLCAgICA5MCwKLSAgICA2MCwgICAgNjAsICAgIDYwLCAgICA0MiwgICAgNjAsICAgIDYwLCAgICAxMiwgICAgNjQsICAgIDM1LCAgICAgMCwKLSAgICA0OSwgICAgNTAsICAgIDY0LCAgICA1MiwgICAgNjUsICAgICAwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgIDExMCwKLSAgICA3NCwgICAxMTIsICAgIDM1LCAgICAtMSwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwKLSAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDc0LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwKLSAgICA1MywgICAgNTQsICAgIDU1LCAgIDEzNCwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgNjQsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAxNDgsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAxNTIsICAgIC0xLCAgIDE1NCwgICAgLTEsICAgMTU2LCAgIDE1NywgICAgIDMsICAgIC0xLCAgICAtMSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIC0xLCAgIDE3MCwKLSAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwKLSAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgNDcsICAgIDM0LCAgICA0OSwKLSAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwKLSAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTAsICAgIDUxLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgIDMsICAgIC0xLCAgICA2NSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIC0xLCAgICAtMSwKLSAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwKLSAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgLTEsICAgIDM0LCAgICA0OSwKLSAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwKLSAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTAsICAgIDUxLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgLTEsICAgIDM1LCAgICA2NSwKLSAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwKLSAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwKLSAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwKLSAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwKLSAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwKLSAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwKLSAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwKLSAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwKLSAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKLSAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwKLSAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwKLSAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwKLSAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwKLSAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwKLSAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwKLSAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwKLSAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwKLSAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwKLSAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwKLSAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKLSAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwKLSAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwKLSAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwKLSAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwKLSAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwKLSAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwKLSAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwKLSAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwKLSAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwKLSAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwKLSAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKLSAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwKLSAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwKLSAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwKLSAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAzNSwgICAgNjQsICAgIDM3LCAgICAzOCwKLSAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwKLSAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwKLSAgICA1OSwgICAgNjAsICAgIDM1LCAgICAtMSwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwKLSAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwKLSAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDM3LCAgICAzOCwKLSAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwKLSAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwKLSAgICA1OSwgICAgNjAsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKLSAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwKLSAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywKLSAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNTIsICAgIDUzLCAgICA1NCwKLSAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwCi19OwotLyogLSotQy0qLSAgTm90ZSBzb21lIGNvbXBpbGVycyBjaG9rZSBvbiBjb21tZW50cyBvbiBgI2xpbmUnIGxpbmVzLiAgKi8KLSNsaW5lIDMgIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0KLS8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAotICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQotICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KLSAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCi0KLSNpZm5kZWYgYWxsb2NhCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlIC8qIG5vdCBHTlUgQy4gICovCi0jaWYgKCFkZWZpbmVkIChfX1NURENfXykgJiYgZGVmaW5lZCAoc3BhcmMpKSB8fCBkZWZpbmVkIChfX3NwYXJjX18pIHx8IGRlZmluZWQgKF9fc3BhcmMpIHx8IGRlZmluZWQgKF9fc2dpKQotI2luY2x1ZGUgPGFsbG9jYS5oPgotI2Vsc2UgLyogbm90IHNwYXJjICovCi0jaWYgZGVmaW5lZCAoTVNET1MpICYmICFkZWZpbmVkIChfX1RVUkJPQ19fKQotI2Vsc2UgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCi0jaWYgZGVmaW5lZChfQUlYKQotICNwcmFnbWEgYWxsb2NhCi0jZWxzZSAvKiBub3QgTVNET1MsIF9fVFVSQk9DX18sIG9yIF9BSVggKi8KLSNpZmRlZiBfX2hwdXgKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci12b2lkICphbGxvY2EgKHVuc2lnbmVkIGludCk7Ci19OwotI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCi12b2lkICphbGxvY2EgKCk7Ci0jZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogX19ocHV4ICovCi0jZW5kaWYgLyogbm90IF9BSVggKi8KLSNlbmRpZiAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KLSNlbmRpZiAvKiBub3Qgc3BhcmMuICAqLwotI2VuZGlmIC8qIG5vdCBHTlUgQy4gICovCi0jZW5kaWYgLyogYWxsb2NhIG5vdCBkZWZpbmVkLiAgKi8KLQotLyogVGhpcyBpcyB0aGUgcGFyc2VyIGNvZGUgdGhhdCBpcyB3cml0dGVuIGludG8gZWFjaCBiaXNvbiBwYXJzZXIKLSAgd2hlbiB0aGUgJXNlbWFudGljX3BhcnNlciBkZWNsYXJhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBncmFtbWFyLgotICBJdCB3YXMgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBoYWlyeSBwYXJzZXIKLSAgdXNlZCB3aGVuICVzZW1hbnRpY19wYXJzZXIgaXMgc3BlY2lmaWVkLiAgKi8KLQotLyogTm90ZTogdGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBkb2xsYXIgc2lnbiBpbiB0aGlzIGZpbGUuCi0gICBJdCBpcyByZXBsYWNlZCBieSB0aGUgbGlzdCBvZiBhY3Rpb25zLCBlYWNoIGFjdGlvbgotICAgYXMgb25lIGNhc2Ugb2YgdGhlIHN3aXRjaC4gICovCi0KLSNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKLSNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQotI2RlZmluZSBZWUVNUFRZCQktMgotI2RlZmluZSBZWUVPRgkJMAotI2RlZmluZSBZWUFDQ0VQVAlyZXR1cm4oMCkKLSNkZWZpbmUgWVlBQk9SVCAJcmV0dXJuKDEpCi0jZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJsYWIxCi0vKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4KLSAgIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5IHRvIGVhc2UgdGhlCi0gICB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgotICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLwotI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKLSNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQotI2RlZmluZSBZWUJBQ0tVUCh0b2tlbiwgdmFsdWUpIFwKLWRvCQkJCQkJCQlcCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCi0gICAgeyB5eWNoYXIgPSAodG9rZW4pLCB5eWx2YWwgPSAodmFsdWUpOwkJCVwKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAotICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCi0gICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKLSAgICB9CQkJCQkJCQlcCi0gIGVsc2UJCQkJCQkJCVwKLSAgICB7IHl5ZXJyb3IgKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIik7IFlZRVJST1I7IH0JXAotd2hpbGUgKDApCi0KLSNkZWZpbmUgWVlURVJST1IJMQotI2RlZmluZSBZWUVSUkNPREUJMjU2Ci0KLSNpZm5kZWYgWVlQVVJFCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgpCi0jZW5kaWYKLQotI2lmZGVmIFlZUFVSRQotI2lmZGVmIFlZTFNQX05FRURFRAotI2lmZGVmIFlZTEVYX1BBUkFNCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jLCBZWUxFWF9QQVJBTSkKLSNlbHNlCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jKQotI2VuZGlmCi0jZWxzZSAvKiBub3QgWVlMU1BfTkVFREVEICovCi0jaWZkZWYgWVlMRVhfUEFSQU0KLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwpCi0jZW5kaWYKLSNlbmRpZiAvKiBub3QgWVlMU1BfTkVFREVEICovCi0jZW5kaWYKLQotLyogSWYgbm9ucmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUgKi8KLQotI2lmbmRlZiBZWVBVUkUKLQotaW50CXl5Y2hhcjsJCQkvKiAgdGhlIGxvb2thaGVhZCBzeW1ib2wJCSovCi1ZWVNUWVBFCXl5bHZhbDsJCQkvKiAgdGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZQkJKi8KLQkJCQkvKiAgbG9va2FoZWFkIHN5bWJvbAkJCSovCi0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLVlZTFRZUEUgeXlsbG9jOwkJCS8qICBsb2NhdGlvbiBkYXRhIGZvciB0aGUgbG9va2FoZWFkCSovCi0JCQkJLyogIHN5bWJvbAkJCQkqLwotI2VuZGlmCi0KLWludCB5eW5lcnJzOwkJCS8qICBudW1iZXIgb2YgcGFyc2UgZXJyb3JzIHNvIGZhciAgICAgICAqLwotI2VuZGlmICAvKiBub3QgWVlQVVJFICovCi0KLSNpZiBZWURFQlVHICE9IDAKLWludCB5eWRlYnVnOwkJCS8qICBub256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlCSovCi0vKiBTaW5jZSB0aGlzIGlzIHVuaW5pdGlhbGl6ZWQsIGl0IGRvZXMgbm90IHN0b3AgbXVsdGlwbGUgcGFyc2VycwotICAgZnJvbSBjb2V4aXN0aW5nLiAgKi8KLSNlbmRpZgotCi0vKiAgWVlJTklUREVQVEggaW5kaWNhdGVzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcwkqLwotCi0jaWZuZGVmCVlZSU5JVERFUFRICi0jZGVmaW5lIFlZSU5JVERFUFRIIDIwMAotI2VuZGlmCi0KLS8qICBZWU1BWERFUFRIIGlzIHRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0bwotICAgIChlZmZlY3RpdmUgb25seSBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4gICovCi0KLSNpZiBZWU1BWERFUFRIID09IDAKLSN1bmRlZiBZWU1BWERFUFRICi0jZW5kaWYKLQotI2lmbmRlZiBZWU1BWERFUFRICi0jZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHdhcm5pbmcgaWYgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCi0jaWZkZWYgX19HTlVDX18KLWludCB5eXBhcnNlICh2b2lkKTsKLSNlbmRpZgotDAotI2lmIF9fR05VQ19fID4gMQkJLyogR05VIEMgYW5kIEdOVSBDKysgZGVmaW5lIHRoaXMuICAqLwotI2RlZmluZSBfX3l5X21lbWNweShUTyxGUk9NLENPVU5UKQlfX2J1aWx0aW5fbWVtY3B5KFRPLEZST00sQ09VTlQpCi0jZWxzZQkJCQkvKiBub3QgR05VIEMgb3IgQysrICovCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCi0gICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCi1zdGF0aWMgdm9pZAotX195eV9tZW1jcHkgKHRvLCBmcm9tLCBjb3VudCkKLSAgICAgY2hhciAqdG87Ci0gICAgIGNoYXIgKmZyb207Ci0gICAgIGludCBjb3VudDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207Ci0gIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKLSAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKLQotICB3aGlsZSAoaS0tID4gMCkKLSAgICAqdCsrID0gKmYrKzsKLX0KLQotI2Vsc2UgLyogX19jcGx1c3BsdXMgKi8KLQotLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKLSAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1fX3l5X21lbWNweSAoY2hhciAqdG8sIGNoYXIgKmZyb20sIGludCBjb3VudCkKLXsKLSAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207Ci0gIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKLSAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKLQotICB3aGlsZSAoaS0tID4gMCkKLSAgICAqdCsrID0gKmYrKzsKLX0KLQotI2VuZGlmCi0jZW5kaWYKLQwKLSNsaW5lIDE5NiAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQotLyogVGhlIHVzZXIgY2FuIGRlZmluZSBZWVBBUlNFX1BBUkFNIGFzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAotICAgaW50byB5eXBhcnNlLiAgVGhlIGFyZ3VtZW50IHNob3VsZCBoYXZlIHR5cGUgdm9pZCAqLgotICAgSXQgc2hvdWxkIGFjdHVhbGx5IHBvaW50IHRvIGFuIG9iamVjdC4KLSAgIEdyYW1tYXIgYWN0aW9ucyBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZSBieSBjYXN0aW5nIGl0Ci0gICB0byB0aGUgcHJvcGVyIHBvaW50ZXIgdHlwZS4gICovCi0KLSNpZmRlZiBZWVBBUlNFX1BBUkFNCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgdm9pZCAqWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSNlbHNlIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyBZWVBBUlNFX1BBUkFNCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTCB2b2lkICpZWVBBUlNFX1BBUkFNOwotI2VuZGlmIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2Vsc2UgLyogbm90IFlZUEFSU0VfUEFSQU0gKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZW5kaWYgLyogbm90IFlZUEFSU0VfUEFSQU0gKi8KLQotaW50Ci15eXBhcnNlKFlZUEFSU0VfUEFSQU1fQVJHKQotICAgICBZWVBBUlNFX1BBUkFNX0RFQ0wKLXsKLSAgcmVnaXN0ZXIgaW50IHl5c3RhdGU7Ci0gIHJlZ2lzdGVyIGludCB5eW47Ci0gIHJlZ2lzdGVyIHNob3J0ICp5eXNzcDsKLSAgcmVnaXN0ZXIgWVlTVFlQRSAqeXl2c3A7Ci0gIGludCB5eWVycnN0YXR1czsJLyogIG51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQgKi8KLSAgaW50IHl5Y2hhcjEgPSAwOwkJLyogIGxvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyICovCi0KLSAgc2hvcnQJeXlzc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHN0YXRlIHN0YWNrCQkJKi8KLSAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc2VtYW50aWMgdmFsdWUgc3RhY2sJCSovCi0KLSAgc2hvcnQgKnl5c3MgPSB5eXNzYTsJCS8qICByZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMgKi8KLSAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOwkvKiAgdG8gYWxsb3cgeXlvdmVyZmxvdyB0byB4cmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZSAqLwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIGxvY2F0aW9uIHN0YWNrCQkJKi8KLSAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOwotICBZWUxUWVBFICp5eWxzcDsKLQotI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCi0jZWxzZQotI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCi0jZW5kaWYKLQotICBpbnQgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKLQotI2lmZGVmIFlZUFVSRQotICBpbnQgeXljaGFyOwotICBZWVNUWVBFIHl5bHZhbDsKLSAgaW50IHl5bmVycnM7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIFlZTFRZUEUgeXlsbG9jOwotI2VuZGlmCi0jZW5kaWYKLQotICBZWVNUWVBFIHl5dmFsOwkJLyogIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJldHVybgkJKi8KLQkJCQkvKiAgc2VtYW50aWMgdmFsdWVzIGZyb20gdGhlIGFjdGlvbgkqLwotCQkJCS8qICByb3V0aW5lcwkJCQkqLwotCi0gIGludCB5eWxlbjsKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKTsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSAwOwotICB5eWVycnN0YXR1cyA9IDA7Ci0gIHl5bmVycnMgPSAwOwotICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KLQotICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgotICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKLSAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgotICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCi0KLSAgeXlzc3AgPSB5eXNzIC0gMTsKLSAgeXl2c3AgPSB5eXZzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCA9IHl5bHM7Ci0jZW5kaWYKLQotLyogUHVzaCBhIG5ldyBzdGF0ZSwgd2hpY2ggaXMgZm91bmQgaW4gIHl5c3RhdGUgIC4gICovCi0vKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcwotICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KLXl5bmV3c3RhdGU6Ci0KLSAgKisreXlzc3AgPSB5eXN0YXRlOwotCi0gIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotICAgIHsKLSAgICAgIC8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byB4cmVhbGxvY2F0ZSB0aGUgc3RhY2sgKi8KLSAgICAgIC8qIFVzZSBjb3BpZXMgb2YgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50byBtZW1vcnkuICovCi0gICAgICBZWVNUWVBFICp5eXZzMSA9IHl5dnM7Ci0gICAgICBzaG9ydCAqeXlzczEgPSB5eXNzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgWVlMVFlQRSAqeXlsczEgPSB5eWxzOwotI2VuZGlmCi0KLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLwotICAgICAgaW50IHNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOwotCi0jaWZkZWYgeXlvdmVyZmxvdwotICAgICAgLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YKLQkgdGhlIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgKi8KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIC8qIFRoaXMgdXNlZCB0byBiZSBhIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywKLQkgYnV0IHRoYXQgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCi0gICAgICB5eW92ZXJmbG93KCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgJnl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgJnl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgJnl5bHMxLCBzaXplICogc2l6ZW9mICgqeXlsc3ApLAotCQkgJnl5c3RhY2tzaXplKTsKLSNlbHNlCi0gICAgICB5eW92ZXJmbG93KCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgJnl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgJnl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgJnl5c3RhY2tzaXplKTsKLSNlbmRpZgotCi0gICAgICB5eXNzID0geXlzczE7IHl5dnMgPSB5eXZzMTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHMgPSB5eWxzMTsKLSNlbmRpZgotI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLwotICAgICAgLyogRXh0ZW5kIHRoZSBzdGFjayBvdXIgb3duIHdheS4gICovCi0gICAgICBpZiAoeXlzdGFja3NpemUgPj0gWVlNQVhERVBUSCkKLQl7Ci0JICB5eWVycm9yKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICAgIHl5c3RhY2tzaXplICo9IDI7Ci0gICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQotCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKLSAgICAgIHl5c3MgPSAoc2hvcnQgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXNzLCAoY2hhciAqKXl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApKTsKLSAgICAgIHl5dnMgPSAoWVlTVFlQRSAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXl2c3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5dnMsIChjaGFyICopeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCkpOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlscyA9IChZWUxUWVBFICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eWxzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXlscywgKGNoYXIgKil5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCi0KLSAgICAgIHl5c3NwID0geXlzcyArIHNpemUgLSAxOwotICAgICAgeXl2c3AgPSB5eXZzICsgc2l6ZSAtIDE7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzcCA9IHl5bHMgKyBzaXplIC0gMTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVkXG4iLCB5eXN0YWNrc2l6ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0JWVlBQk9SVDsKLSAgICB9Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSk7Ci0jZW5kaWYKLQotICBnb3RvIHl5YmFja3VwOwotIHl5YmFja3VwOgotCi0vKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLS8qIFJlYWQgYSBsb29rYWhlYWQgdG9rZW4gaWYgd2UgbmVlZCBvbmUgYW5kIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotLyogeXlyZXN1bWU6ICovCi0KLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2thaGVhZCB0b2tlbi4gICovCi0KLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotCi0gIC8qIHl5Y2hhciBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRgotICAgICBvciBhIHZhbGlkIHRva2VuIGluIGV4dGVybmFsIGZvcm0uICAqLwotCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKLSAgICB7Ci0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIik7Ci0jZW5kaWYKLSAgICAgIHl5Y2hhciA9IFlZTEVYOwotICAgIH0KLQotICAvKiBDb252ZXJ0IHRva2VuIHRvIGludGVybmFsIGZvcm0gKGluIHl5Y2hhcjEpIGZvciBpbmRleGluZyB0YWJsZXMgd2l0aCAqLwotCi0gIGlmICh5eWNoYXIgPD0gMCkJCS8qIFRoaXMgbWVhbnMgZW5kIG9mIGlucHV0LiAqLwotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSAwOwotICAgICAgeXljaGFyID0gWVlFT0Y7CQkvKiBEb24ndCBjYWxsIFlZTEVYIGFueSBtb3JlICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFKHl5Y2hhcik7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIk5leHQgdG9rZW4gaXMgJWQgKCVzIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLQkgIC8qIEdpdmUgdGhlIGluZGl2aWR1YWwgcGFyc2VyIGEgd2F5IHRvIHByaW50IHRoZSBwcmVjaXNlIG1lYW5pbmcKLQkgICAgIG9mIGEgdG9rZW4sIGZvciBmdXJ0aGVyIGRlYnVnZ2luZyBpbmZvLiAgKi8KLSNpZmRlZiBZWVBSSU5UCi0JICBZWVBSSU5UIChzdGRlcnIsIHl5Y2hhciwgeXlsdmFsKTsKLSNlbmRpZgotCSAgZnByaW50ZiAoc3RkZXJyLCAiKVxuIik7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gIHl5biArPSB5eWNoYXIxOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IHl5Y2hhcjEpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotCi0gIC8qIHl5biBpcyB3aGF0IHRvIGRvIGZvciB0aGlzIHRva2VuIHR5cGUgaW4gdGhpcyBzdGF0ZS4KLSAgICAgTmVnYXRpdmUgPT4gcmVkdWNlLCAteXluIGlzIHJ1bGUgbnVtYmVyLgotICAgICBQb3NpdGl2ZSA9PiBzaGlmdCwgeXluIGlzIG5ldyBzdGF0ZS4KLSAgICAgICBOZXcgc3RhdGUgaXMgZmluYWwgc3RhdGUgPT4gZG9uJ3QgYm90aGVyIHRvIHNoaWZ0LAotICAgICAgIGp1c3QgcmV0dXJuIHN1Y2Nlc3MuCi0gICAgIDAsIG9yIG1vc3QgbmVnYXRpdmUgbnVtYmVyID0+IGVycm9yLiAgKi8KLQotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJybGFiOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNoaWZ0aW5nIHRva2VuICVkICglcyksICIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0jZW5kaWYKLQotICAvKiBEaXNjYXJkIHRoZSB0b2tlbiBiZWluZyBzaGlmdGVkIHVubGVzcyBpdCBpcyBlb2YuICAqLwotICBpZiAoeXljaGFyICE9IFlZRU9GKQotICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgLyogY291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvciBzdGF0dXMuICAqLwotICBpZiAoeXllcnJzdGF0dXMpIHl5ZXJyc3RhdHVzLS07Ci0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgZ290byB5eW5ld3N0YXRlOwotCi0vKiBEbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLXl5ZGVmYXVsdDoKLQotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0KLS8qIERvIGEgcmVkdWN0aW9uLiAgeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KLXl5cmVkdWNlOgotICB5eWxlbiA9IHl5cjJbeXluXTsKLSAgaWYgKHl5bGVuID4gMCkKLSAgICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOyAvKiBpbXBsZW1lbnQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJlZHVjaW5nIHZpYSBydWxlICVkIChsaW5lICVkKSwgIiwKLQkgICAgICAgeXluLCB5eXJsaW5lW3l5bl0pOwotCi0gICAgICAvKiBQcmludCB0aGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLCBhbmQgdGhlaXIgcmVzdWx0LiAgKi8KLSAgICAgIGZvciAoaSA9IHl5cHJoc1t5eW5dOyB5eXJoc1tpXSA+IDA7IGkrKykKLQlmcHJpbnRmIChzdGRlcnIsICIlcyAiLCB5eXRuYW1lW3l5cmhzW2ldXSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJXNcbiIsIHl5dG5hbWVbeXlyMVt5eW5dXSk7Ci0gICAgfQotI2VuZGlmCi0KLQotICBzd2l0Y2ggKHl5bikgewotCi1jYXNlIDM6Ci0jbGluZSAyMDkgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUoeXl2c3BbMF0udHZhbCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDQ6Ci0jbGluZSAyMTggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9JTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1OgotI2xpbmUgMjIxICJtMi1leHAueSIKLXsgbnVtYmVyX3NpZ24gPSAtMTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjoKLSNsaW5lIDIyMyAibTItZXhwLnkiCi17IG51bWJlcl9zaWduID0gMTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTkVHKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzoKLSNsaW5lIDIyOCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKFVOT1BfUExVUyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg6Ci0jbGluZSAyMzIgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9MT0dJQ0FMX05PVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExOgotI2xpbmUgMjQwICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FQKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTI6Ci0jbGluZSAyNDQgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9PUkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMzoKLSNsaW5lIDI0OCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0FCUyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE0OgotI2xpbmUgMjUyICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSElHSCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE1OgotI2xpbmUgMjU2ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUlOKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFstMV0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01JTik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE2OgotI2xpbmUgMjYyICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUFYKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFstMV0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01JTik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE3OgotI2xpbmUgMjY4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfRkxPQVQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxODoKLSNsaW5lIDI3MiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9WQUwpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWy0zXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1ZBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE5OgotI2xpbmUgMjc4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0hSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjA6Ci0jbGluZSAyODIgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9PREQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMToKLSNsaW5lIDI4NiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1RSVU5DKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjI6Ci0jbGluZSAyOTAgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9TSVpFT0YpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMzoKLSNsaW5lIDI5NSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKFVOT1BfUFJFSU5DUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjQ6Ci0jbGluZSAyOTkgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9BU1NJR05fTU9ESUZZKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoQklOT1BfQUREKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoQklOT1BfQVNTSUdOX01PRElGWSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI1OgotI2xpbmUgMzA1ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoVU5PUF9QUkVERUNSRU1FTlQpOzsKLSAgICBicmVhazt9Ci1jYXNlIDI2OgotI2xpbmUgMzA5ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoQklOT1BfQVNTSUdOX01PRElGWSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKEJJTk9QX1NVQik7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKEJJTk9QX0FTU0lHTl9NT0RJRlkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNzoKLSNsaW5lIDMxNSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOwotCQkJICB3cml0ZV9leHBfc3RyaW5nICh5eXZzcFswXS5zdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1NUUlVDVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI5OgotI2xpbmUgMzI0ICJtMi1leHAueSIKLXsgZXJyb3IoIlNldHMgYXJlIG5vdCBpbXBsZW1lbnRlZC4iKTs7Ci0gICAgYnJlYWs7fQotY2FzZSAzMDoKLSNsaW5lIDMyOCAibTItZXhwLnkiCi17IGVycm9yKCJTZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQuIik7OwotICAgIGJyZWFrO30KLWNhc2UgMzE6Ci0jbGluZSAzMzIgIm0yLWV4cC55IgoteyBlcnJvcigiU2V0cyBhcmUgbm90IGltcGxlbWVudGVkLiIpOzsKLSAgICBicmVhazt9Ci1jYXNlIDMyOgotI2xpbmUgMzM1ICJtMi1leHAueSIKLXsgZXJyb3IoIlNldHMgYXJlIG5vdCBpbXBsZW1lbnRlZC4iKTs7Ci0gICAgYnJlYWs7fQotY2FzZSAzMzoKLSNsaW5lIDMzNyAibTItZXhwLnkiCi17IGVycm9yKCJTZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQuIik7OwotICAgIGJyZWFrO30KLWNhc2UgMzQ6Ci0jbGluZSAzNDYgIm0yLWV4cC55IgoteyBzdGFydF9hcmdsaXN0KCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM1OgotI2xpbmUgMzQ4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE1VTFRJX1NVQlNDUklQVCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGVuZF9hcmdsaXN0KCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoTVVMVElfU1VCU0NSSVBUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzY6Ci0jbGluZSAzNTYgIm0yLWV4cC55IgoteyBzdGFydF9hcmdsaXN0ICgpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNzoKLSNsaW5lIDM1OCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9GVU5DQUxMKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgZW5kX2FyZ2xpc3QgKCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRlVOQ0FMTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM5OgotI2xpbmUgMzY3ICJtMi1leHAueSIKLXsgYXJnbGlzdF9sZW4gPSAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MDoKLSNsaW5lIDM3MSAibTItZXhwLnkiCi17IGFyZ2xpc3RfbGVuKys7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQxOgotI2xpbmUgMzc2ICJtMi1leHAueSIKLXsgYXJnbGlzdF9sZW4gPSAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MjoKLSNsaW5lIDM4MSAibTItZXhwLnkiCi17IGFyZ2xpc3RfbGVuKys7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQzOgotI2xpbmUgMzg2ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUVNVkFMKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFstMl0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01FTVZBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ0OgotI2xpbmUgMzkyICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbLTNdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDU6Ci0jbGluZSAzOTggIm0yLWV4cC55IgoteyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NjoKLSNsaW5lIDQwNiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRVBFQVQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NzoKLSNsaW5lIDQxMCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9NVUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0ODoKLSNsaW5lIDQxNCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9ESVYpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0OToKLSNsaW5lIDQxOCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9JTlRESVYpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MDoKLSNsaW5lIDQyMiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRU0pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MToKLSNsaW5lIDQyNiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BREQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MjoKLSNsaW5lIDQzMCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MzoKLSNsaW5lIDQzNCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9FUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU0OgotI2xpbmUgNDM4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX05PVEVRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTU6Ci0jbGluZSA0NDAgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTk9URVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NjoKLSNsaW5lIDQ0NCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NzoKLSNsaW5lIDQ0OCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HRVEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1ODoKLSNsaW5lIDQ1MiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVNTKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTk6Ci0jbGluZSA0NTYgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR1RSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjA6Ci0jbGluZSA0NjAgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9BTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MToKLSNsaW5lIDQ2NCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MT0dJQ0FMX09SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjI6Ci0jbGluZSA0NjggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjM6Ci0jbGluZSA0NzUgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQk9PTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIHl5dnNwWzBdLnVsdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NDoKLSNsaW5lIDQ4MSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9CT09MKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgeXl2c3BbMF0udWx2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQk9PTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY1OgotI2xpbmUgNDg3ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9tMl9pbnQpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSB5eXZzcFswXS5sdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NjoKLSNsaW5lIDQ5NCAibTItZXhwLnkiCi17Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfbTJfY2FyZCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIHl5dnNwWzBdLnVsdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNjc6Ci0jbGluZSA1MDMgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX20yX2NoYXIpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSB5eXZzcFswXS51bHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjg6Ci0jbGluZSA1MTEgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfbTJfcmVhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfZGJsY3N0ICh5eXZzcFswXS5kdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDcwOgotI2xpbmUgNTIxICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBUWVBFX0xFTkdUSCAoeXl2c3BbLTFdLnR2YWwpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3MToKLSNsaW5lIDUyOCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9NMl9TVFJJTkcpOwotCQkJICB3cml0ZV9leHBfc3RyaW5nICh5eXZzcFswXS5zdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX00yX1NUUklORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDcyOgotI2xpbmUgNTM1ICJtMi1leHAueSIKLXsgeXl2YWwuYnZhbCA9IFNZTUJPTF9CTE9DS19WQUxVRSh5eXZzcFswXS5zeW0pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3MzoKLSNsaW5lIDUzOSAibTItZXhwLnkiCi17IHN0cnVjdCBzeW1ib2wgKnN5bQotCQkJICAgID0gbG9va3VwX3N5bWJvbCAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAotCQkJCQkgICAgIFZBUl9OQU1FU1BBQ0UsIDAsIE5VTEwpOwotCQkJICB5eXZhbC5zeW0gPSBzeW07OwotICAgIGJyZWFrO30KLWNhc2UgNzQ6Ci0jbGluZSA1NDggIm0yLWV4cC55IgoteyBzdHJ1Y3Qgc3ltYm9sICp0ZW0KLQkJCSAgICA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksIHl5dnNwWy0yXS5idmFsLAotCQkJCQkgICAgIFZBUl9OQU1FU1BBQ0UsIDAsIE5VTEwpOwotCQkJICBpZiAoIXRlbSB8fCBTWU1CT0xfQ0xBU1MgKHRlbSkgIT0gTE9DX0JMT0NLKQotCQkJICAgIGVycm9yICgiTm8gZnVuY3Rpb24gXCIlc1wiIGluIHNwZWNpZmllZCBjb250ZXh0LiIsCi0JCQkJICAgY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSk7Ci0JCQkgIHl5dmFsLnN5bSA9IHRlbTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDc1OgotI2xpbmUgNTYwICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfc3ltICh5eXZzcFswXS5zeW0pOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzc6Ci0jbGluZSA1NzIgIm0yLWV4cC55IgoteyBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0JCQkgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksIHl5dnNwWy0yXS5idmFsLAotCQkJCQkgICAgICAgVkFSX05BTUVTUEFDRSwgMCwgTlVMTCk7Ci0JCQkgIGlmIChzeW0gPT0gMCkKLQkJCSAgICBlcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gc3BlY2lmaWVkIGNvbnRleHQuIiwKLQkJCQkgICBjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpKTsKLQotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgLyogYmxvY2tfZm91bmQgaXMgc2V0IGJ5IGxvb2t1cF9zeW1ib2wuICAqLwotCQkJICB3cml0ZV9leHBfZWx0X2Jsb2NrIChibG9ja19mb3VuZCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzg6Ci0jbGluZSA1ODggIm0yLWV4cC55IgoteyBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0JCQkgIGludCBpc19hX2ZpZWxkX29mX3RoaXM7Ci0KLSAJCQkgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksCi0JCQkJCSAgICAgICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCi0JCQkJCSAgICAgICBWQVJfTkFNRVNQQUNFLAotCQkJCQkgICAgICAgJmlzX2FfZmllbGRfb2ZfdGhpcywKLQkJCQkJICAgICAgIE5VTEwpOwotCQkJICBpZiAoc3ltKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSAoc3ltKSkKLQkJCQl7Ci0JCQkJICBpZiAoaW5uZXJtb3N0X2Jsb2NrID09IDAgfHwKLQkJCQkgICAgICBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCAKLQkJCQkJCSAgICBpbm5lcm1vc3RfYmxvY2spKQotCQkJCSAgICBpbm5lcm1vc3RfYmxvY2sgPSBibG9ja19mb3VuZDsKLQkJCQl9Ci0KLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAgICAgLyogV2Ugd2FudCB0byB1c2UgdGhlIHNlbGVjdGVkIGZyYW1lLCBub3QKLQkJCQkgYW5vdGhlciBtb3JlIGlubmVyIGZyYW1lIHdoaWNoIGhhcHBlbnMgdG8KLQkJCQkgYmUgaW4gdGhlIHNhbWUgYmxvY2suICAqLwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKLQkJCSAgICAgIHJlZ2lzdGVyIGNoYXIgKmFyZyA9IGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCk7Ci0KLQkJCSAgICAgIG1zeW1ib2wgPQotCQkJCWxvb2t1cF9taW5pbWFsX3N5bWJvbCAoYXJnLCBOVUxMLCBOVUxMKTsKLQkJCSAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCi0JCQkJewotCQkJCSAgd3JpdGVfZXhwX21zeW1ib2wKLQkJCQkgICAgKG1zeW1ib2wsCi0JCQkJICAgICBsb29rdXBfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlX2ludCksCi0JCQkJICAgICBidWlsdGluX3R5cGVfaW50KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzICgpKQotCQkJCWVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJzeW1ib2wtZmlsZVwiIGNvbW1hbmQuIik7Ci0JCQkgICAgICBlbHNlCi0JCQkJZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLAotCQkJCSAgICAgICBjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpKTsKLQkJCSAgICB9Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA3OToKLSNsaW5lIDYzOSAibTItZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfdHlwZW5hbWUgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksCi0JCQkJCQlleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssIDApOyA7Ci0gICAgYnJlYWs7fQotfQotICAgLyogdGhlIGFjdGlvbiBmaWxlIGdldHMgY29waWVkIGluIGluIHBsYWNlIG9mIHRoaXMgZG9sbGFyc2lnbiAqLwotI2xpbmUgNDk4ICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotDAotICB5eXZzcCAtPSB5eWxlbjsKLSAgeXlzc3AgLT0geXlsZW47Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwIC09IHl5bGVuOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnNzcDEgPSB5eXNzIC0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInN0YXRlIHN0YWNrIG5vdyIpOwotICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCi0JZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi0gICorK3l5dnNwID0geXl2YWw7Ci0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3ArKzsKLSAgaWYgKHl5bGVuID09IDApCi0gICAgewotICAgICAgeXlsc3AtPmZpcnN0X2xpbmUgPSB5eWxsb2MuZmlyc3RfbGluZTsKLSAgICAgIHl5bHNwLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MuZmlyc3RfY29sdW1uOwotICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcC0xKS0+bGFzdF9saW5lOwotICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwLTEpLT5sYXN0X2NvbHVtbjsKLSAgICAgIHl5bHNwLT50ZXh0ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2xpbmU7Ci0gICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfY29sdW1uOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIE5vdyAic2hpZnQiIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4KLSAgICAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUgdGhhdCBnb2VzIHRvLAotICAgICBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8KLSAgICAgYW5kIHRoZSBydWxlIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KLQotICB5eW4gPSB5eXIxW3l5bl07Ci0KLSAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVEJBU0VdICsgKnl5c3NwOwotICBpZiAoeXlzdGF0ZSA+PSAwICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQotICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOwotICBlbHNlCi0gICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UQkFTRV07Ci0KLSAgZ290byB5eW5ld3N0YXRlOwotCi15eWVycmxhYjogICAvKiBoZXJlIG9uIGRldGVjdGluZyBlcnJvciAqLwotCi0gIGlmICghIHl5ZXJyc3RhdHVzKQotICAgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLwotICAgIHsKLSAgICAgICsreXluZXJyczsKLQotI2lmZGVmIFlZRVJST1JfVkVSQk9TRQotICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotCi0gICAgICBpZiAoeXluID4gWVlGTEFHICYmIHl5biA8IFlZTEFTVCkKLQl7Ci0JICBpbnQgc2l6ZSA9IDA7Ci0JICBjaGFyICptc2c7Ci0JICBpbnQgeCwgY291bnQ7Ci0KLQkgIGNvdW50ID0gMDsKLQkgIC8qIFN0YXJ0IFggYXQgLXl5biBpZiBuZWMgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbiB5eWNoZWNrLiAgKi8KLQkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOwotCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQotCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQotCSAgICAgIHNpemUgKz0gc3RybGVuKHl5dG5hbWVbeF0pICsgMTUsIGNvdW50Kys7Ci0JICBtc2cgPSAoY2hhciAqKSB4bWFsbG9jKHNpemUgKyAxNSk7Ci0JICBpZiAobXNnICE9IDApCi0JICAgIHsKLQkgICAgICBzdHJjcHkobXNnLCAicGFyc2UgZXJyb3IiKTsKLQotCSAgICAgIGlmIChjb3VudCA8IDUpCi0JCXsKLQkJICBjb3VudCA9IDA7Ci0JCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7Ci0JCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQotCQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKLQkJICAgICAgewotCQkJc3RyY2F0KG1zZywgY291bnQgPT0gMCA/ICIsIGV4cGVjdGluZyBgIiA6ICIgb3IgYCIpOwotCQkJc3RyY2F0KG1zZywgeXl0bmFtZVt4XSk7Ci0JCQlzdHJjYXQobXNnLCAiJyIpOwotCQkJY291bnQrKzsKLQkJICAgICAgfQotCQl9Ci0JICAgICAgeXllcnJvcihtc2cpOwotCSAgICAgIGZyZWUobXNnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhjZWVkZWQiKTsKLQl9Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCi0JeXllcnJvcigicGFyc2UgZXJyb3IiKTsKLSAgICB9Ci0KLSAgZ290byB5eWVycmxhYjE7Ci15eWVycmxhYjE6ICAgLyogaGVyZSBvbiBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24gKi8KLQotICBpZiAoeXllcnJzdGF0dXMgPT0gMykKLSAgICB7Ci0gICAgICAvKiBpZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KLQotICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCi0gICAgICBpZiAoeXljaGFyID09IFlZRU9GKQotCVlZQUJPUlQ7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLSNlbmRpZgotCi0gICAgICB5eWNoYXIgPSBZWUVNUFRZOwotICAgIH0KLQotICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbgotICAgICBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IgdG9rZW4uICAqLwotCi0gIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLwotCi0gIGdvdG8geXllcnJoYW5kbGU7Ci0KLXl5ZXJyZGVmYXVsdDogIC8qIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIGVycm9yIHRva2VuLiAqLwotCi0jaWYgMAotICAvKiBUaGlzIGlzIHdyb25nOyBvbmx5IHN0YXRlcyB0aGF0IGV4cGxpY2l0bHkgd2FudCBlcnJvciB0b2tlbnMKLSAgICAgc2hvdWxkIHNoaWZ0IHRoZW0uICAqLwotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsgIC8qIElmIGl0cyBkZWZhdWx0IGlzIHRvIGFjY2VwdCBhbnkgdG9rZW4sIG9rLiAgT3RoZXJ3aXNlIHBvcCBpdC4qLwotICBpZiAoeXluKSBnb3RvIHl5ZGVmYXVsdDsKLSNlbmRpZgotCi15eWVycnBvcDogICAvKiBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbiAqLwotCi0gIGlmICh5eXNzcCA9PSB5eXNzKSBZWUFCT1JUOwotICB5eXZzcC0tOwotICB5eXN0YXRlID0gKi0teXlzc3A7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwLS07Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6IHN0YXRlIHN0YWNrIG5vdyIpOwotICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCi0JZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi15eWVycmhhbmRsZToKLQotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlGTEFHKQotICAgIGdvdG8geXllcnJkZWZhdWx0OwotCi0gIHl5biArPSBZWVRFUlJPUjsKLSAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSBZWVRFUlJPUikKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0gIGlmICh5eW4gPCAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQotCWdvdG8geXllcnJwb3A7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJwb3A7Ci0KLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpOwotI2VuZGlmCi0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgZ290byB5eW5ld3N0YXRlOwotfQotI2xpbmUgNjQ0ICJtMi1leHAueSIKLQotCi0jaWYgMCAgLyogRklYTUUhICovCi1pbnQKLW92ZXJmbG93KGEsYikKLSAgIGxvbmcgYSxiOwotewotICAgcmV0dXJuIChNQVhfT0ZfVFlQRShidWlsdGluX3R5cGVfbTJfaW50KSAtIGIpIDwgYTsKLX0KLQotaW50Ci11b3ZlcmZsb3coYSxiKQotICAgdW5zaWduZWQgbG9uZyBhLGI7Ci17Ci0gICByZXR1cm4gKE1BWF9PRl9UWVBFKGJ1aWx0aW5fdHlwZV9tMl9jYXJkKSAtIGIpIDwgYTsKLX0KLSNlbmRpZiAvKiBGSVhNRSAqLwotCi0vKiBUYWtlIGNhcmUgb2YgcGFyc2luZyBhIG51bWJlciAoYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0KS4KLSAgIFNldCB5eWx2YWwgYW5kIHJldHVybiB0aGUgdG9rZW4gdHlwZTsgdXBkYXRlIGxleHB0ci4KLSAgIExFTiBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaXQuICAqLwotCi0vKioqIE5lZWRzIHNvbWUgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSBmbG9hdCBjYXNlICoqKi8KLQotc3RhdGljIGludAotcGFyc2VfbnVtYmVyIChvbGVuKQotICAgICBpbnQgb2xlbjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcCA9IGxleHB0cjsKLSAgcmVnaXN0ZXIgTE9OR0VTVCBuID0gMDsKLSAgcmVnaXN0ZXIgTE9OR0VTVCBwcmV2biA9IDA7Ci0gIHJlZ2lzdGVyIGludCBjLGksaXNjaGFyPTA7Ci0gIHJlZ2lzdGVyIGludCBiYXNlID0gaW5wdXRfcmFkaXg7Ci0gIHJlZ2lzdGVyIGludCBsZW4gPSBvbGVuOwotICBpbnQgdW5zaWduZWRfcCA9IG51bWJlcl9zaWduID09IDEgPyAxIDogMDsKLQotICBpZihwW2xlbi0xXSA9PSAnSCcpCi0gIHsKLSAgICAgYmFzZSA9IDE2OwotICAgICBsZW4tLTsKLSAgfQotICBlbHNlIGlmKHBbbGVuLTFdID09ICdDJyB8fCBwW2xlbi0xXSA9PSAnQicpCi0gIHsKLSAgICAgYmFzZSA9IDg7Ci0gICAgIGlzY2hhciA9IHBbbGVuLTFdID09ICdDJzsKLSAgICAgbGVuLS07Ci0gIH0KLQotICAvKiBTY2FuIHRoZSBudW1iZXIgKi8KLSAgZm9yIChjID0gMDsgYyA8IGxlbjsgYysrKQotICB7Ci0gICAgaWYgKHBbY10gPT0gJy4nICYmIGJhc2UgPT0gMTApCi0gICAgICB7Ci0JLyogSXQncyBhIGZsb2F0IHNpbmNlIGl0IGNvbnRhaW5zIGEgcG9pbnQuICAqLwotCXl5bHZhbC5kdmFsID0gYXRvZiAocCk7Ci0JbGV4cHRyICs9IGxlbjsKLQlyZXR1cm4gRkxPQVQ7Ci0gICAgICB9Ci0gICAgaWYgKHBbY10gPT0gJy4nICYmIGJhc2UgIT0gMTApCi0gICAgICAgZXJyb3IoIkZsb2F0aW5nIHBvaW50IG51bWJlcnMgbXVzdCBiZSBiYXNlIDEwLiIpOwotICAgIGlmIChiYXNlID09IDEwICYmIChwW2NdIDwgJzAnIHx8IHBbY10gPiAnOScpKQotICAgICAgIGVycm9yKCJJbnZhbGlkIGRpZ2l0IFwnJWNcJyBpbiBudW1iZXIuIixwW2NdKTsKLSB9Ci0KLSAgd2hpbGUgKGxlbi0tID4gMCkKLSAgICB7Ci0gICAgICBjID0gKnArKzsKLSAgICAgIG4gKj0gYmFzZTsKLSAgICAgIGlmKCBiYXNlID09IDggJiYgKGMgPT0gJzgnIHx8IGMgPT0gJzknKSkKLQkgZXJyb3IoIkludmFsaWQgZGlnaXQgXCclY1wnIGluIG9jdGFsIG51bWJlci4iLGMpOwotICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCWkgPSBjIC0gJzAnOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChiYXNlID09IDE2ICYmIGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQotCSAgICBpID0gYyAtICdBJyArIDEwOwotCSAgZWxzZQotCSAgICAgcmV0dXJuIEVSUk9SOwotCX0KLSAgICAgIG4rPWk7Ci0gICAgICBpZihpID49IGJhc2UpCi0JIHJldHVybiBFUlJPUjsKLSAgICAgIGlmKCF1bnNpZ25lZF9wICYmIG51bWJlcl9zaWduID09IDEgJiYgKHByZXZuID49IG4pKQotCSB1bnNpZ25lZF9wPTE7CQkvKiBUcnkgc29tZXRoaW5nIHVuc2lnbmVkICovCi0gICAgICAvKiBEb24ndCBkbyB0aGUgcmFuZ2UgY2hlY2sgaWYgbj09aSBhbmQgaT09MCwgc2luY2UgdGhhdCBzcGVjaWFsCi0JIGNhc2Ugd2lsbCBnaXZlIGFuIG92ZXJmbG93IGVycm9yLiAqLwotICAgICAgaWYoUkFOR0VfQ0hFQ0sgJiYgbiE9aSAmJiBpKQotICAgICAgewotCSBpZigodW5zaWduZWRfcCAmJiAodW5zaWduZWQpcHJldm4gPj0gKHVuc2lnbmVkKW4pIHx8Ci0JICAgICgoIXVuc2lnbmVkX3AgJiYgbnVtYmVyX3NpZ249PS0xKSAmJiAtcHJldm4gPD0gLW4pKQotCSAgICByYW5nZV9lcnJvcigiT3ZlcmZsb3cgb24gbnVtZXJpYyBjb25zdGFudC4iKTsKLSAgICAgIH0KLQkgcHJldm49bjsKLSAgICB9Ci0KLSAgbGV4cHRyID0gcDsKLSAgaWYoKnAgPT0gJ0InIHx8ICpwID09ICdDJyB8fCAqcCA9PSAnSCcpCi0gICAgIGxleHB0cisrOwkJCS8qIEFkdmFuY2UgcGFzdCBCLEMgb3IgSCAqLwotCi0gIGlmIChpc2NoYXIpCi0gIHsKLSAgICAgeXlsdmFsLnVsdmFsID0gbjsKLSAgICAgcmV0dXJuIENIQVI7Ci0gIH0KLSAgZWxzZSBpZiAoIHVuc2lnbmVkX3AgJiYgbnVtYmVyX3NpZ24gPT0gMSkKLSAgewotICAgICB5eWx2YWwudWx2YWwgPSBuOwotICAgICByZXR1cm4gVUlOVDsKLSAgfQotICBlbHNlIGlmKCh1bnNpZ25lZF9wICYmIChuPDApKSkgewotICAgICByYW5nZV9lcnJvcigiT3ZlcmZsb3cgb24gbnVtZXJpYyBjb25zdGFudCAtLSBudW1iZXIgdG9vIGxhcmdlLiIpOwotICAgICAvKiBCdXQsIHRoaXMgY2FuIHJldHVybiBpZiByYW5nZV9jaGVjayA9PSByYW5nZV93YXJuLiAgKi8KLSAgfQotICB5eWx2YWwubHZhbCA9IG47Ci0gIHJldHVybiBJTlQ7Ci19Ci0KLQotLyogU29tZSB0b2tlbnMgKi8KLQotc3RhdGljIHN0cnVjdAotewotICAgY2hhciBuYW1lWzJdOwotICAgaW50IHRva2VuOwotfSB0b2tlbnRhYjJbXSA9Ci17Ci0gICAgeyB7JzwnLCAnPid9LCAgICBOT1RFUVVBTCAJfSwKLSAgICB7IHsnOicsICc9J30sICAgIEFTU0lHTgl9LAotICAgIHsgeyc8JywgJz0nfSwgICAgTEVRCX0sCi0gICAgeyB7Jz4nLCAnPSd9LCAgICBHRVEJfSwKLSAgICB7IHsnOicsICc6J30sICAgIENPTE9OQ09MT04gfSwKLQotfTsKLQotLyogU29tZSBzcGVjaWZpYyBrZXl3b3JkcyAqLwotCi1zdHJ1Y3Qga2V5d29yZCB7Ci0gICBjaGFyIGtleXdbMTBdOwotICAgaW50IHRva2VuOwotfTsKLQotc3RhdGljIHN0cnVjdCBrZXl3b3JkIGtleXRhYltdID0KLXsKLSAgICB7Ik9SIiAsICAgT1JPUgkgfSwKLSAgICB7IklOIiwgICAgSU4gICAgICAgICB9LC8qIE5vdGUgc3BhY2UgYWZ0ZXIgSU4gKi8KLSAgICB7IkFORCIsICAgTE9HSUNBTF9BTkR9LAotICAgIHsiQUJTIiwgICBBQlMJIH0sCi0gICAgeyJDSFIiLCAgIENIUgkgfSwKLSAgICB7IkRFQyIsICAgREVDCSB9LAotICAgIHsiTk9UIiwgICBOT1QJIH0sCi0gICAgeyJESVYiLCAgIERJViAgICAJIH0sCi0gICAgeyJJTkMiLCAgIElOQwkgfSwKLSAgICB7Ik1BWCIsICAgTUFYX0ZVTkMJIH0sCi0gICAgeyJNSU4iLCAgIE1JTl9GVU5DCSB9LAotICAgIHsiTU9EIiwgICBNT0QJIH0sCi0gICAgeyJPREQiLCAgIE9ERAkgfSwKLSAgICB7IkNBUCIsICAgQ0FQCSB9LAotICAgIHsiT1JEIiwgICBPUkQJIH0sCi0gICAgeyJWQUwiLCAgIFZBTAkgfSwKLSAgICB7IkVYQ0wiLCAgRVhDTAkgfSwKLSAgICB7IkhJR0giLCAgSElHSCAgICAgICB9LAotICAgIHsiSU5DTCIsICBJTkNMCSB9LAotICAgIHsiU0laRSIsICBTSVpFICAgICAgIH0sCi0gICAgeyJGTE9BVCIsIEZMT0FUX0ZVTkMgfSwKLSAgICB7IlRSVU5DIiwgVFJVTkMJIH0sCi19OwotCi0KLS8qIFJlYWQgb25lIHRva2VuLCBnZXR0aW5nIGNoYXJhY3RlcnMgdGhyb3VnaCBsZXhwdHIuICAqLwotCi0vKiBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxhbmd1YWdlIGFuZCB0aGUgb3BlcmF0b3JzIHVzZWQgYXJlCi0gICBjb21wYXRpYmxlICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICByZWdpc3RlciBpbnQgYzsKLSAgcmVnaXN0ZXIgaW50IG5hbWVsZW47Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciBjaGFyICp0b2tzdGFydDsKLSAgcmVnaXN0ZXIgY2hhciBxdW90ZTsKLQotIHJldHJ5OgotCi0gIHRva3N0YXJ0ID0gbGV4cHRyOwotCi0KLSAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCB0b2tlbiBvZiBsZW5ndGggMiAqLwotICBmb3IoIGkgPSAwIDsgaSA8IChpbnQpIChzaXplb2YgdG9rZW50YWIyIC8gc2l6ZW9mIHRva2VudGFiMlswXSkgOyBpKyspCi0gICAgIGlmKFNUUkVRTih0b2tlbnRhYjJbaV0ubmFtZSwgdG9rc3RhcnQsIDIpKQotICAgICB7Ci0JbGV4cHRyICs9IDI7Ci0JcmV0dXJuIHRva2VudGFiMltpXS50b2tlbjsKLSAgICAgfQotCi0gIHN3aXRjaCAoYyA9ICp0b2tzdGFydCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlICcgJzoKLSAgICBjYXNlICdcdCc6Ci0gICAgY2FzZSAnXG4nOgotICAgICAgbGV4cHRyKys7Ci0gICAgICBnb3RvIHJldHJ5OwotCi0gICAgY2FzZSAnKCc6Ci0gICAgICBwYXJlbl9kZXB0aCsrOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJyknOgotICAgICAgaWYgKHBhcmVuX2RlcHRoID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBwYXJlbl9kZXB0aC0tOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJywnOgotICAgICAgaWYgKGNvbW1hX3Rlcm1pbmF0ZXMgJiYgcGFyZW5fZGVwdGggPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIC8qIE1pZ2h0IGJlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChsZXhwdHJbMV0gPj0gJzAnICYmIGxleHB0clsxXSA8PSAnOScpCi0JYnJlYWs7CQkJLyogRmFsbHMgaW50byBudW1iZXIgY29kZS4gICovCi0gICAgICBlbHNlCi0gICAgICB7Ci0JIGxleHB0cisrOwotCSByZXR1cm4gRE9UOwotICAgICAgfQotCi0vKiBUaGVzZSBhcmUgY2hhcmFjdGVyIHRva2VucyB0aGF0IGFwcGVhciBhcy1pcyBpbiB0aGUgWUFDQyBncmFtbWFyICovCi0gICAgY2FzZSAnKyc6Ci0gICAgY2FzZSAnLSc6Ci0gICAgY2FzZSAnKic6Ci0gICAgY2FzZSAnLyc6Ci0gICAgY2FzZSAnXic6Ci0gICAgY2FzZSAnPCc6Ci0gICAgY2FzZSAnPic6Ci0gICAgY2FzZSAnWyc6Ci0gICAgY2FzZSAnXSc6Ci0gICAgY2FzZSAnPSc6Ci0gICAgY2FzZSAneyc6Ci0gICAgY2FzZSAnfSc6Ci0gICAgY2FzZSAnIyc6Ci0gICAgY2FzZSAnQCc6Ci0gICAgY2FzZSAnfic6Ci0gICAgY2FzZSAnJic6Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnXCcnIDoKLSAgICBjYXNlICciJzoKLSAgICAgIHF1b3RlID0gYzsKLSAgICAgIGZvciAobmFtZWxlbiA9IDE7IChjID0gdG9rc3RhcnRbbmFtZWxlbl0pICE9IHF1b3RlICYmIGMgIT0gJ1wwJzsgbmFtZWxlbisrKQotCWlmIChjID09ICdcXCcpCi0JICB7Ci0JICAgIGMgPSB0b2tzdGFydFsrK25hbWVsZW5dOwotCSAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JICAgICAgewotCQljID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKLQkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCQkgIGMgPSB0b2tzdGFydFsrK25hbWVsZW5dOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIGlmKGMgIT0gcXVvdGUpCi0JIGVycm9yKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIG9yIGNoYXJhY3RlciBjb25zdGFudC4iKTsKLSAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRva3N0YXJ0ICsgMTsKLSAgICAgIHl5bHZhbC5zdmFsLmxlbmd0aCA9IG5hbWVsZW4gLSAxOwotICAgICAgbGV4cHRyICs9IG5hbWVsZW4gKyAxOwotCi0gICAgICBpZihuYW1lbGVuID09IDIpICAJLyogU2luZ2xlIGNoYXJhY3RlciAqLwotICAgICAgewotCSAgIHl5bHZhbC51bHZhbCA9IHRva3N0YXJ0WzFdOwotCSAgIHJldHVybiBDSEFSOwotICAgICAgfQotICAgICAgZWxzZQotCSByZXR1cm4gU1RSSU5HOwotICAgIH0KLQotICAvKiBJcyBpdCBhIG51bWJlcj8gICovCi0gIC8qIE5vdGU6ICBXZSBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCB0aGUgY2FzZSBvZiB0aGUgdG9rZW4gJy4nLgotICAgICBTZWUgY2FzZSAnLicgYWJvdmUuICAqLwotICBpZiAoKGMgPj0gJzAnICYmIGMgPD0gJzknKSkKLSAgICB7Ci0gICAgICAvKiBJdCdzIGEgbnVtYmVyLiAgKi8KLSAgICAgIGludCBnb3RfZG90ID0gMCwgZ290X2UgPSAwOwotICAgICAgcmVnaXN0ZXIgY2hhciAqcCA9IHRva3N0YXJ0OwotICAgICAgaW50IHRva3R5cGU7Ci0KLSAgICAgIGZvciAoKytwIDs7ICsrcCkKLQl7Ci0JICBpZiAoIWdvdF9lICYmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKSkKLQkgICAgZ290X2RvdCA9IGdvdF9lID0gMTsKLQkgIGVsc2UgaWYgKCFnb3RfZG90ICYmICpwID09ICcuJykKLQkgICAgZ290X2RvdCA9IDE7Ci0JICBlbHNlIGlmIChnb3RfZSAmJiAocFstMV0gPT0gJ2UnIHx8IHBbLTFdID09ICdFJykKLQkJICAgJiYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpKQotCSAgICAvKiBUaGlzIGlzIHRoZSBzaWduIG9mIHRoZSBleHBvbmVudCwgbm90IHRoZSBlbmQgb2YgdGhlCi0JICAgICAgIG51bWJlci4gICovCi0JICAgIGNvbnRpbnVlOwotCSAgZWxzZSBpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKSAmJgotCQkgICAoKnAgPCAnQScgfHwgKnAgPiAnRicpICYmCi0JCSAgICgqcCAhPSAnSCcpKSAgLyogTW9kdWxhLTIgaGV4YWRlY2ltYWwgbnVtYmVyICovCi0JICAgIGJyZWFrOwotCX0KLQl0b2t0eXBlID0gcGFyc2VfbnVtYmVyIChwIC0gdG9rc3RhcnQpOwotICAgICAgICBpZiAodG9rdHlwZSA9PSBFUlJPUikKLQkgIHsKLQkgICAgY2hhciAqZXJyX2NvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHAgLSB0b2tzdGFydCArIDEpOwotCi0JICAgIG1lbWNweSAoZXJyX2NvcHksIHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQpOwotCSAgICBlcnJfY29weVtwIC0gdG9rc3RhcnRdID0gMDsKLQkgICAgZXJyb3IgKCJJbnZhbGlkIG51bWJlciBcIiVzXCIuIiwgZXJyX2NvcHkpOwotCSAgfQotCWxleHB0ciA9IHA7Ci0JcmV0dXJuIHRva3R5cGU7Ci0gICAgfQotCi0gIGlmICghKGMgPT0gJ18nIHx8IGMgPT0gJyQnCi0JfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSkKLSAgICAvKiBXZSBtdXN0IGhhdmUgY29tZSBhY3Jvc3MgYSBiYWQgY2hhcmFjdGVyIChlLmcuICc7JykuICAqLwotICAgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBleHByZXNzaW9uLiIsIGMpOwotCi0gIC8qIEl0J3MgYSBuYW1lLiAgU2VlIGhvdyBsb25nIGl0IGlzLiAgKi8KLSAgbmFtZWxlbiA9IDA7Ci0gIGZvciAoYyA9IHRva3N0YXJ0W25hbWVsZW5dOwotICAgICAgIChjID09ICdfJyB8fCBjID09ICckJyB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKTsKLSAgICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXSkKLSAgICA7Ci0KLSAgLyogVGhlIHRva2VuICJpZiIgdGVybWluYXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaXMgTk9UCi0gICAgIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KLSAgaWYgKG5hbWVsZW4gPT0gMiAmJiB0b2tzdGFydFswXSA9PSAnaScgJiYgdG9rc3RhcnRbMV0gPT0gJ2YnKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBsZXhwdHIgKz0gbmFtZWxlbjsKLQotICAvKiAgTG9va3VwIHNwZWNpYWwga2V5d29yZHMgKi8KLSAgZm9yKGkgPSAwIDsgaSA8IChpbnQpIChzaXplb2Yoa2V5dGFiKSAvIHNpemVvZihrZXl0YWJbMF0pKSA7IGkrKykKLSAgICAgaWYobmFtZWxlbiA9PSBzdHJsZW4oa2V5dGFiW2ldLmtleXcpICYmIFNUUkVRTih0b2tzdGFydCxrZXl0YWJbaV0ua2V5dyxuYW1lbGVuKSkKLQkgICByZXR1cm4ga2V5dGFiW2ldLnRva2VuOwotCi0gIHl5bHZhbC5zdmFsLnB0ciA9IHRva3N0YXJ0OwotICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBuYW1lbGVuOwotCi0gIGlmICgqdG9rc3RhcnQgPT0gJyQnKQotICAgIHsKLSAgICAgIHdyaXRlX2RvbGxhcl92YXJpYWJsZSAoeXlsdmFsLnN2YWwpOwotICAgICAgcmV0dXJuIElOVEVSTkFMX1ZBUjsKLSAgICB9Ci0KLSAgLyogVXNlIHRva2VuLXR5cGUgQkxPQ0tOQU1FIGZvciBzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlIGRlZmluZWQgYXMKLSAgICAgZnVuY3Rpb25zLiAgSWYgdGhpcyBpcyBub3Qgc28sIHRoZW4gLi4uCi0gICAgIFVzZSB0b2tlbi10eXBlIFRZUEVOQU1FIGZvciBzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlIGRlZmluZWQKLSAgICAgY3VycmVudGx5IGFzIG5hbWVzIG9mIHR5cGVzOyBOQU1FIGZvciBvdGhlciBzeW1ib2xzLgotICAgICBUaGUgY2FsbGVyIGlzIG5vdCBjb25zdHJhaW5lZCB0byBjYXJlIGFib3V0IHRoZSBkaXN0aW5jdGlvbi4gICovCi0gewotCi0KLSAgICBjaGFyICp0bXAgPSBjb3B5X25hbWUgKHl5bHZhbC5zdmFsKTsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0KLSAgICBpZiAobG9va3VwX3BhcnRpYWxfc3ltdGFiICh0bXApKQotICAgICAgcmV0dXJuIEJMT0NLTkFNRTsKLSAgICBzeW0gPSBsb29rdXBfc3ltYm9sICh0bXAsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKLQkJCSBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKLSAgICBpZiAoc3ltICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfQkxPQ0spCi0gICAgICByZXR1cm4gQkxPQ0tOQU1FOwotICAgIGlmIChsb29rdXBfdHlwZW5hbWUgKGNvcHlfbmFtZSAoeXlsdmFsLnN2YWwpLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssIDEpKQotICAgICAgcmV0dXJuIFRZUEVOQU1FOwotCi0gICAgaWYoc3ltKQotICAgIHsKLSAgICAgICBzd2l0Y2goc3ltLT5hY2xhc3MpCi0gICAgICAgewotICAgICAgIGNhc2UgTE9DX1NUQVRJQzoKLSAgICAgICBjYXNlIExPQ19SRUdJU1RFUjoKLSAgICAgICBjYXNlIExPQ19BUkc6Ci0gICAgICAgY2FzZSBMT0NfUkVGX0FSRzoKLSAgICAgICBjYXNlIExPQ19SRUdQQVJNOgotICAgICAgIGNhc2UgTE9DX1JFR1BBUk1fQUREUjoKLSAgICAgICBjYXNlIExPQ19MT0NBTDoKLSAgICAgICBjYXNlIExPQ19MT0NBTF9BUkc6Ci0gICAgICAgY2FzZSBMT0NfQkFTRVJFRzoKLSAgICAgICBjYXNlIExPQ19CQVNFUkVHX0FSRzoKLSAgICAgICBjYXNlIExPQ19DT05TVDoKLSAgICAgICBjYXNlIExPQ19DT05TVF9CWVRFUzoKLSAgICAgICBjYXNlIExPQ19PUFRJTUlaRURfT1VUOgotCSAgcmV0dXJuIE5BTUU7Ci0KLSAgICAgICBjYXNlIExPQ19UWVBFREVGOgotCSAgcmV0dXJuIFRZUEVOQU1FOwotCi0gICAgICAgY2FzZSBMT0NfQkxPQ0s6Ci0JICByZXR1cm4gQkxPQ0tOQU1FOwotCi0gICAgICAgY2FzZSBMT0NfVU5ERUY6Ci0JICBlcnJvcigiaW50ZXJuYWw6ICBVbmRlZmluZWQgY2xhc3MgaW4gbTJsZXgoKSIpOwotCi0gICAgICAgY2FzZSBMT0NfTEFCRUw6Ci0gICAgICAgY2FzZSBMT0NfVU5SRVNPTFZFRDoKLQkgIGVycm9yKCJpbnRlcm5hbDogIFVuZm9yc2VlbiBjYXNlIGluIG0ybGV4KCkiKTsKLSAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgLyogQnVpbHQtaW4gQk9PTEVBTiB0eXBlLiAgVGhpcyBpcyBzb3J0IG9mIGEgaGFjay4gKi8KLSAgICAgICBpZihTVFJFUU4odG9rc3RhcnQsIlRSVUUiLDQpKQotICAgICAgIHsKLQkgIHl5bHZhbC51bHZhbCA9IDE7Ci0JICByZXR1cm4gTTJfVFJVRTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZihTVFJFUU4odG9rc3RhcnQsIkZBTFNFIiw1KSkKLSAgICAgICB7Ci0JICB5eWx2YWwudWx2YWwgPSAwOwotCSAgcmV0dXJuIE0yX0ZBTFNFOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBNdXN0IGJlIGFub3RoZXIgdHlwZSBvZiBuYW1lLi4uICovCi0gICAgcmV0dXJuIE5BTUU7Ci0gfQotfQotCi0jaWYgMAkJLyogVW51c2VkICovCi1zdGF0aWMgY2hhciAqCi1tYWtlX3F1YWxuYW1lKG1vZCxpZGVudCkKLSAgIGNoYXIgKm1vZCwgKmlkZW50OwotewotICAgY2hhciAqbmV3ID0geG1hbGxvYyhzdHJsZW4obW9kKStzdHJsZW4oaWRlbnQpKzIpOwotCi0gICBzdHJjcHkobmV3LG1vZCk7Ci0gICBzdHJjYXQobmV3LCIuIik7Ci0gICBzdHJjYXQobmV3LGlkZW50KTsKLSAgIHJldHVybiBuZXc7Ci19Ci0jZW5kaWYgIC8qIDAgKi8KLQotdm9pZAoteXllcnJvciAobXNnKQotICAgICBjaGFyICptc2c7Ci17Ci0gIGVycm9yICgiQSAlcyBpbiBleHByZXNzaW9uLCBuZWFyIGAlcycuIiwgKG1zZyA/IG1zZyA6ICJlcnJvciIpLCBsZXhwdHIpOwotfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9SRUFETUUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2ZmM3NS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUluZm9ybWF0aW9uIGFib3V0IHRoZSB2YXJpb3VzIGV4ZWN1dGFibGVzIGZvdW5kIGluIHRoaXMgdGVzdDoKLQotICAgICAgICAgICAgIEJGRCAgICAgICAgICAgICAgQ1BVICAgICBPYmpmaWxlCi1FeGVjdXRhYmxlICAgVGFyZ2V0ICAgICAgICAgICBUeXBlICAgIFR5cGUgICAgIEluZm8gYWJvdXQgY29tcGlsYXRpb24gbWFjaGluZQotLS0tLS0tLS0tLSAgIC0tLS0tLSAgICAgICAgICAgLS0tLSAgICAtLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pNDg2LWVsZiAgICAgZWxmLWxpdHRsZSAgICAgICBpNDg2ICAgIEVMRiAgICAgIE5DUiAzMDAwLCAvdXNyL2Njcy9BVFQvY2MKLWk4NjAtZWxmICAgICBlbGYtYmlnICAgICAgICAgIGk4NjAgICAgRUxGICAgICAgU3RyYXR1cwotbTY4ay1lbGYgICAgIGVsZi1iaWcgICAgICAgICAgbTY4ayAgICBFTEYgICAgICBBbWlnYSAzMDAwIFVYLCAvdXNyL2Njcy9iaW4vY2MKLW02OGstYW91dCAgICBhLm91dC1uZXdzb3MzICAgIG02OGsgICAgYS5vdXQgICAgU29ueSBORVdTCi1tNjhrLWFvdXQyICAgYS5vdXQtc3Vub3MtYmlnICBtNjhrICAgIGEub3V0ICAgIFN1bk9TIDQuMSwgZ2NjIGN5Z251cy0yLjAuMQotc3BhcmMtYW91dCAgIGEub3V0LXN1bm9zLWJpZyAgc3BhcmMgICBhLm91dCAgICBTdW4gNCwgU3VuT1MgNC4xLjEsIGdjYyAyLjEKLXNwYXJjLWVsZiAgICBlbGYtYmlnICAgICAgICAgIHNwYXJjICAgRUxGICAgICAgU3VuIDQsIFNvbGFyaXMgMS4wLCBnY2MgMi4wLjIKLW1pcHMtZWNvZmYgICBlY29mZi1iaWdtaXBzICAgIG1pcHMgICAgZWNvZmYgICAgSVJJWCA0LjAuMQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jcm9zc2xvYWQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jcm9zc2xvYWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmJiN2ExLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY3Jvc3Nsb2FkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCi0jIFJvYiBTYXZveWUgY2hhbmdlZCBpdCB0byB1c2UgZ2RiX3Rlc3QgKHJvYkBjeWdudXMuY29tKQotCi1pZiAkdHJhY2VsZXZlbCB0aGVuIHsKLQlzdHJhY2UgJHRyYWNlbGV2ZWwKLX0KLQotc2V0IHBybXNfaWQgMAotc2V0IGJ1Z19pZCAwCi0KLSMgRklYTUU6IFRoZSBjb25maWd1cmUuaW4gZm9yIHRoaXMgdGVzdCBzaG91bGQgbG9vayBmb3IgLS13aXRoLXRhcmdldHMKLSMgYW5kIGRlYWwgYWNjb3JkaW5nbHkuICBVbnRpbCB0aGF0IGhhcyBiZWVuIGRvbmUsIHNraXAgdGhlIHdob2xlIHRoaW5nLgotIyBXaXRoIGEgbWluaW1hbCBiZmQgKHRoZSBkZWZhdWx0KSwgZmV3IGlmIGFueSBvZiB0aGVzZSB0ZXN0cyB3b3JrLgotCi12ZXJib3NlICJGSVhNRTogYWxsIHRoZSBjcm9zc2xvYWQgdGVzdHMgaWdub3JlZCIKLXJldHVybgotCi1mb3JlYWNoIGkgIm02OGstZWxmIG02OGstYW91dCBtNjhrLWFvdXQyIG1pcHMtZWNvZmYgaTQ4Ni1lbGYgc3BhcmMtYW91dCBpODYwLWVsZiBzcGFyYy1lbGYiIHsKLSAgICByZW1vdGVfZXhlYyBidWlsZCAiY2QgJHtvYmpkaXJ9LyR7c3ViZGlyfSA7IHV1ZGVjb2RlICR7c3JjZGlyfS8ke3N1YmRpcn0vJGkudSAiCi19Ci0KLSMgRklYTUU6IFRoZXNlIHRlc3RzIGRvbid0IHdvcmsgZm9yIHRoZSBpOTYwLCBiZWNhdXNlCi0jIGJmZC9jb25maWcvaTk2MC1ib3V0Lm10IHNldHMgU0VMRUNUX1ZFQ1MuICBJIGNvdWxkIHVzZSBzZXR1cF94ZmFpbAotIyBmb3IgZWFjaCB0ZXN0LCBidXQgcmVib290aW5nIHRoZSBib2FyZCBiZXR3ZWVuIGVhY2ggb25lIHRha2VzIGEgbG9uZwotIyB0aW1lIHNvIEknbSBqdXN0IHB1bnRpbmcgdGhlIHdob2xlIGZpbGUuCi1pZiBbaXN0YXJnZXQgImk5NjAtKi0qIl0gdGhlbiB7Ci0gICAgaWYgJHZlcmJvc2U+MSB0aGVuIHsKLQl3YXJuaW5nICJGSVhNRTogY3Jvc3Nsb2FkIHRlc3QgY2FzZSBkb2Vzbid0IHJ1biBvbiB0aGUgaTk2MC4iCi0gICAgfQotICAgIGNvbnRpbnVlCi19Ci0KLSMgRklYTUU6IFRoZXNlIHRlc3RzIGRvbid0IHdvcmsgZm9yIHRoZSBhMjlrLCBiZWNhdXNlIFNFTEVDVF9WRUNTIGlzCi0jIHVzZWQgd2hlbiBjb21waWxpbmcgYmZkLiAgSXQgd291bGQgYmUgbmljZSBpZiB0aGVyZSB3ZXJlIHNvbWUgYmV0dGVyCi0jIHdheSBvZiBkZXRlY3RpbmcgdGhpcyBjYXNlLgotaWYgW2lzdGFyZ2V0ICJhMjlrLSotKiJdIHRoZW4gewotICAgIGlmICR2ZXJib3NlPjEgdGhlbiB7Ci0Jd2FybmluZyAiRklYTUU6IGNyb3NzbG9hZCB0ZXN0IGNhc2UgZG9lc24ndCBydW4gb24gdGhlIGEyOWsuIgotICAgIH0KLSAgICBjb250aW51ZQotfQotCi0jIFRlc3QgaWYgZ2RiIGNhbiBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUgYmZkIGZvcm1hdCBvZiBhbgotIyBleGVjdXRhYmxlIGFuZCByZWFkIGl0J3Mgc3ltYm9scy4KLQotcHJvYyBiZmRkZWZhdWx0IHt9IHsKLSAgICBnbG9iYWwgR0RCCi0gICAgZ2xvYmFsIEdEQkZMQUdTCi0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgb2JqZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBmaWxlX2xvYWRlZAotCi0gICAgZ2RiX3VubG9hZAotICAgIHNldCBmaWxlX2xvYWRlZCAwCi0gICAgc2VuZF9nZGIgImZpbGUgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXG4iCi0gICAgZ2RiX2V4cGVjdCB7Ci0JLXJlICJBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeS4gIEtpbGwgaXQuKnkgb3Igbi4iIHsKLQkgICAgc2VuZF9nZGIgInlcbiIKLQkgICAgZXhwX2NvbnRpbnVlCi0JfQotCS1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20gJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXFsuXF0rZG9uZVwuLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCIKLQl9Ci0JLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcWy5cXSsubm8gZGVidWdnaW5nIHN5bWJvbHMgZm91bmQuXFsuXF0rZG9uZVwuLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCAoYnV0IG5vIHN5bWJvbHMgZm91bmQpIgotCX0KLQktcmUgIkZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCAoZm9ybWF0IG5vdCByZWNvZ25pemVkKSIKLQkgICAgcmV0dXJuCi0JfQotCS1yZSAiRmlsZSBmb3JtYXQgaXMgYW1iaWd1b3VzLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCAoZm9ybWF0IGlzIGFtYmlndW91cykiCi0JICAgIHJldHVybgotCX0KLQktcmUgIiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IgotCSAgICByZXR1cm4KLQl9Ci0JdGltZW91dCB7Ci0JICAgIGZhaWwgIih0aW1lb3V0KSAkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQiCi0JICAgIHJldHVybgotCX0JCi0gICAgfQotCi0gICAgaWYgW2dkYl90ZXN0ICJpbmZvIHRhcmdldCIgIi4qZmlsZSB0eXBlICRiZmRmb3JtYXQiICIiXT09MCB0aGVuIHsKLQlzZXQgZmlsZV9sb2FkZWQgMQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHdyb25nIGZvcm1hdCBmb3VuZCIKLSAgICB9Ci19Ci0KLSMgVGVzdCBpZiBnZGIgY2FuIHJlYWQgc3ltYm9scyBmcm9tIGFuIGV4ZWN1dGFibGUgd2hlbiB0aGUgYmZkIGZvcm1hdAotIyBpcyBleHBsaWNpdGx5IHNldCB2aWEgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdOVVRBUkdFVC4KLQotcHJvYyBiZmRleHBsaWNpdCB7fSB7Ci0gICAgZ2xvYmFsIEdEQgotICAgIGdsb2JhbCBHREJGTEFHUwotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBvYmpkaXIKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZmlsZV9sb2FkZWQKLQotICAgIGdkYl91bmxvYWQKLSAgICBzZXQgZmlsZV9sb2FkZWQgMAotCi0gICAgIyBPbmNlIEdEQiA0LjEwICh0aGUgbGFzdCB0byBsYWNrIGBzZXQgZ251dGFyZ2V0JykgaXMgZm9yZ290dGVuLAotICAgICMgY2hhbmdlIHRoaXMgdG8gdXNlIHNldCBnbnV0YXJnZXQuCi0gICBpZiBbZ2RiX3Rlc3QgInNldCBlbnYgR05VVEFSR0VUPSRiZmRmb3JtYXQiICIiICIiXSE9MCB0aGVuIHsKLSAgICAgICBmYWlsICJzZXR0aW5nIEdOVVRBUkdFVD0kYmZkZm9ybWF0IGluIGVudmlyb25tZW50IgotICAgICAgIHJldHVybgotICAgIH0KLQotICAgIHNlbmRfZ2RiICJmaWxlICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxuIgotICAgIGdkYl9leHBlY3QgewotCS1yZSAiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuICBLaWxsIGl0Lip5IG9yIG4uIiB7Ci0JICAgIHNlbmRfZ2RiICJ5XG4iCi0JICAgIGV4cF9jb250aW51ZQotCX0KLQktcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxbLlxdK2RvbmVcLi4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IgotCX0KLQktcmUgIkludmFsaWQgdGFyZ2V0LiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBleHBsaWNpdCBmb3JtYXQgKGludmFsaWQgdGFyZ2V0KSIKLQkgICAgcmV0dXJuCi0JfQotCS1yZSAiJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IgotCSAgICByZXR1cm4KLQl9Ci0JdGltZW91dCB7Ci0JICAgIGZhaWwgIih0aW1lb3V0KSAkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IgotCSAgICByZXR1cm4KLQl9CQotICAgIH0KLQotICAgIHNldCBmaWxlX2xvYWRlZCAxCi19Ci0KLXByb2MgdGVzdF9wdHlwZV9mdW5jdGlvbnMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0gICAgc2VuZF9nZGIgInB0eXBlIG1haW5cbiIKLSAgICBnZGJfZXhwZWN0IHsKLQktcmUgInR5cGUgPSBpbnQgXFspKFxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7fQotCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGZ1bmN0aW9uIG1haW4iIDsgcmV0dXJuIH0KLSAgICB9Ci0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X2NoYXJfZnVuYyIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIFxbKShcXSsiIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Nob3J0X2Z1bmMiICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXFspKFxdKyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9pbnRfZnVuYyIgInR5cGUgPSBpbnQgXFspKFxdKyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9sb25nX2Z1bmMiICJ0eXBlID0gKGxvbmd8bG9uZyBpbnR8aW50KSBcWykoXF0rIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2Zsb2F0X2Z1bmMiICJ0eXBlID0gZmxvYXQgXFspKFxdKyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGVfZnVuYyIgInR5cGUgPSBkb3VibGUgXFspKFxdKyIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgZnVuY3Rpb24gdHlwZXMiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIGZ1bmN0aW9uIHR5cGVzIgotfQotCi0jIE5vdGUgdGhhdCBwbGFpbiBjaGFycyBjYW4gYmUgZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZC4KLQotcHJvYyB0ZXN0X3B0eXBlX3BsYWluX3R5cGVzIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyIiAidHlwZSA9KFwgdW5zaWduZWRcIHxcIHNpZ25lZFwgfFwgKWNoYXIiIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Nob3J0IiAidHlwZSA9IHNob3J0IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2ludCIgInR5cGUgPSBpbnQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZyIgInR5cGUgPSBsb25nIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2Zsb2F0IiAidHlwZSA9IGZsb2F0IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2RvdWJsZSIgInR5cGUgPSBkb3VibGUiIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIHBsYWluIEMgdHlwZXMiCi0JICAgIHJldHVybgotICAgIH0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIHBsYWluIEMgdHlwZXMiCi19Ci0KLSMgTm90ZSB0aGF0IGlmIGNvbXBpbGVkIHdpdGggcHJlLUFOU0kgY29tcGlsZXJzLCB0aGUgInNpZ25lZCIga2V5d29yZHMgYXJlCi0jIGRlZmluZWQgYXdheSBhbmQgdGhlIHZhcmlhYmxlcyBkZWZhdWx0IHRvIHBsYWluIHR5cGVzLiAgU28gYWNjZXB0IGVpdGhlci4KLQotcHJvYyB0ZXN0X3B0eXBlX3NpZ25lZF90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfc2lnbmVkX2NoYXIiICJ0eXBlID0oXCBzaWduZWRcIHxcICljaGFyIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaWduZWRfc2hvcnQiICAidHlwZSA9KFwgc2lnbmVkXCB8XCApc2hvcnQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfc2lnbmVkX2ludCIgInR5cGUgPShcIHNpZ25lZFwgfFwgKWludCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9zaWduZWRfbG9uZyIgInR5cGUgPShcIHNpZ25lZFwgfFwgKWxvbmciIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgaWYgW2V4cHIgW3N0cmluZyBtYXRjaCAiZWNvZmYtYmlnbWlwcyIgJGJmZGZvcm1hdF0rW3N0cmluZyBtYXRjaCAicHR5cGUgdl9zaWduZWRfY2hhciIgW2xpbmRleCAkaSAwXV1dPT0yIHRoZW4gewotCQlzZXR1cF94ZmFpbCAiKi0qLSoiCi0JICAgIH0KLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIHNpZ25lZCBDIHR5cGVzIgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBzaWduZWQgQyB0eXBlcyIKLX0KLQotcHJvYyB0ZXN0X3B0eXBlX3Vuc2lnbmVkX3R5cGVzIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBkZXRfZmlsZQotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl91bnNpZ25lZF9jaGFyIiAidHlwZSA9IHVuc2lnbmVkIGNoYXIiIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Vuc2lnbmVkX3Nob3J0IiBcCi0JCSAgInR5cGUgPSAodW5zaWduZWQgc2hvcnR8c2hvcnQgdW5zaWduZWQgaW50KSIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl91bnNpZ25lZF9pbnQiICJ0eXBlID0gdW5zaWduZWQgaW50IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X3Vuc2lnbmVkX2xvbmciIFwKLQkJICAidHlwZSA9ICh1bnNpZ25lZCBsb25nfGxvbmcgdW5zaWduZWQgaW50KSIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgdW5zaWduZWQgQyB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgdW5zaWduZWQgQyB0eXBlcyIKLX0KLQotIyBOb3RlIHRoYXQgcGxhaW4gY2hhcnMgY2FuIGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQuCi0KLXByb2MgdGVzdF9wdHlwZV9hcnJheV90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfY2hhcl9hcnJheSIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIFxcXFsyXFxcXSIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfc2hvcnRfYXJyYXkiICBcCi0JCSAgInR5cGUgPSAoc2hvcnR8c2hvcnQgaW50KSBcXFxbMlxcXF0iIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50X2FycmF5IiAidHlwZSA9IGludCBcXFxbMlxcXF0iIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZ19hcnJheSIgInR5cGUgPSAobG9uZ3xsb25nIGludCkgXFxcWzJcXFxdIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2Zsb2F0X2FycmF5IiAidHlwZSA9IGZsb2F0IFxcXFsyXFxcXSIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGVfYXJyYXkiICJ0eXBlID0gZG91YmxlIFxcXFsyXFxcXSIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgQyBhcnJheSB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgQyBhcnJheSB0eXBlcyIKLX0KLQotcHJvYyB0ZXN0X3B0eXBlX3BvaW50ZXJfdHlwZXMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X2NoYXJfcG9pbnRlciIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIFwqIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydF9wb2ludGVyIiAgInR5cGUgPSAoc2hvcnR8c2hvcnQgaW50KSBcKiIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9pbnRfcG9pbnRlciIgInR5cGUgPSBpbnQgXCoiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZ19wb2ludGVyIiAidHlwZSA9IChsb25nfGxvbmcgaW50KSBcKiIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdF9wb2ludGVyIiAidHlwZSA9IGZsb2F0IFwqIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2RvdWJsZV9wb2ludGVyIiAidHlwZSA9IGRvdWJsZSBcKiIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgQyBwb2ludGVyIHR5cGVzIgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBDIHBvaW50ZXIgdHlwZXMiCi19Ci0KLXByb2MgbG9hZGFuZHRlc3QgeyBhcmdzIH0gewotICAgIGdsb2JhbCB2ZXJib3NlCi0gICAgZ2xvYmFsIEdEQgotICAgIGdsb2JhbCBHREJGTEFHUwotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBvYmpkaXIKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZmlsZV9sb2FkZWQKLQotICAgIHNldCBiaW5maWxlIFsgbGluZGV4ICRhcmdzIDAgXQotICAgIHNldCBiZmRmb3JtYXQgWyBsaW5kZXggJGFyZ3MgMSBdCi0gICAgc2V0IGZpeG1lIFsgbGluZGV4ICRhcmdzIDIgXQotCi0gICAgaWYgIVtmaWxlIGV4aXN0cyAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVdIHRoZW4gewotICAgICAgICBwZXJyb3IgIiRvYmpkaXIvJHN1YmRpci8kYmluZmlsZSBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLSAgICBnZGJfZXhpdAotICAgIGdkYl9zdGFydAotICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0gICAgYmZkZGVmYXVsdAotICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAkYmZkZm9ybWF0ICJlbGYtYmlnIl0gdGhlbiB7Ci0JaWYgW3N0cmluZyBtYXRjaCAkYmluZmlsZSAiaTg2MC1lbGYiXSB0aGVuIHsKLQkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgotCX0KLSAgICB9Ci0gICAgYmZkZXhwbGljaXQKLSAgICBpZiAkZmlsZV9sb2FkZWQ9PTEgdGhlbiB7Ci0JdGVzdF9wdHlwZV9mdW5jdGlvbnMKLSAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLQl0ZXN0X3B0eXBlX3BsYWluX3R5cGVzCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV9zaWduZWRfdHlwZXMKLSAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLQl0ZXN0X3B0eXBlX3Vuc2lnbmVkX3R5cGVzCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV9hcnJheV90eXBlcwotICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotCXRlc3RfcHR5cGVfcG9pbnRlcl90eXBlcwotICAgIH0KLX0KLQotIyBSdW4gdGVzdHMgZm9yIGVhY2ggb2YgdGhlIHRlc3QgZXhlY3V0YWJsZXMuCi0jIElmIHRoZSB0aGlyZCBhcmd1bWVudCBpcyAxLCB0aGUgdGVzdHMgd2lsbCBiZSBleHBlY3RlZCB0byBmYWlsLgotIyBXZSBzaG91bGQgZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlIHRlc3RzIGFuZCBiZmQgZm9ybWF0cwotIyBmcm9tIHRoZSBtYWtlZmlsZSBvciBzb21lIG90aGVyIGNvbnRyb2wgZmlsZSAoRklYTUUpLgotCi1sb2FkYW5kdGVzdCBtNjhrLWVsZgkiZWxmMzItbTY4ayIJCTAKLQotIyBJJ20gZ2V0dGluZyBhbiBYUEFTUyBmb3IgZXhwbGljaXQgZm9ybWF0IG9uIHRoaXMgb25lCi1sb2FkYW5kdGVzdCBtNjhrLWFvdXQJImEub3V0LW5ld3NvczMiCQkxCi0KLWxvYWRhbmR0ZXN0IG02OGstYW91dDIJImEub3V0LXN1bm9zLWJpZyIJMAotbG9hZGFuZHRlc3QgbWlwcy1lY29mZgkiZWNvZmYtYmlnbWlwcyIJCTAKLWxvYWRhbmR0ZXN0IGk0ODYtZWxmCSJlbGYzMi1pMzg2IgkJMAotbG9hZGFuZHRlc3Qgc3BhcmMtYW91dAkiYS5vdXQtc3Vub3MtYmlnIgkwCi1sb2FkYW5kdGVzdCBzcGFyYy1lbGYJImVsZjMyLXNwYXJjIgkJMAotCi0jRklYTUU6ICBpODYwIHN1cHBvcnQgaXMgdW5saWtlbHkgdG8gYmUgd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUKLSMgc28gc3VwcHJlc3MgdGhpcyB0ZXN0IHVudGlsIGl0IGlzIHdvcmtpbmcuICAtZm5mCi0jbG9hZGFuZHRlc3QgaTg2MC1lbGYJImVsZjMyLWk4NjAiCQkwCi0KLWdkYl90ZXN0ICJzZXQgZ251dGFyZ2V0IGF1dG8iICIiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k0ODYtZWxmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k0ODYtZWxmLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjMzOGIuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pNDg2LWVsZi51CisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLWJlZ2luIDc3NyBpNDg2LWVsZgotTT9UNSwxQCQhIDAgICAgICAgICAgICAoICBQICEgICAgVygoJCIjMCAgICFcK0AgICAgICAgIzAgKCAgJQotTSAiQCAlMCAxICA4ICAgIFQgICAgLSggJCIgICAgICJAICAgIEggICAgIDQgICAgICAgICAgUCAgIC0wIAotTSAgICAgICAgICAgICAhLCAgICAgICAgICEgICAgICAgICAgISAgICAtICAgICMyICEgQCAgICAgKiA4IAotTSAiQCYgICAlICAgICAhICAgICQgICAhPCFAICA3KTgkIiAgICAgIjQgICAgMiAoICAgPCAgICAgJCAgIAotTSBAICAgKCAmICAiIEVAMCggICAgICcgICAgICAgICAgIVAgICAgICAgICBPPTctUitWUUk4Ql1MOjYpQwotTStHLU8rQyQgICAsICAgICwgICAgIUAgICAgTCAgICAqICAgICAgICAgICAgICAgISAgICAgICAgICAoIAotTSAgICQgICAgICAgICAgNCAgICAjICAgICIgICAgIEQgICAgJyAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgJCAgICI8QEAwKCcgICAgISggICAgKiAgICBJKUAkIiAgICAgIDEgLydfI1AgICAmIjYhIEAkICAgIAotTSQwICsgIUAgICAhPEFAMCggICAgICEkIFw/XD8gICAgSygoJCIkICAgICAyICAgIClAICAgLyI2ISBAIAotTSAgICAkMCNRX1JUICAgIyxAQDAoICAgICAhKCAgICBSICAgIC8oOCQiIDAgICAgMSAgSCAvUCAgICtSIgotTSEgQCAgICAgJEAgICAkRCAgICFERUAwKCAgICAgISQgXD9dPyAgICBAKTgkIiAgICAgIDEgLydfICVdQwotTTsmNUE7RzVQICVdRTtGMCA3VjVOPUZFUjtWWCA3VjVUOTdBVCAmJVQ5N0FJPSAhPzk2MUE9JiQgOTdBSQotTT0gIT87JkVCN1c5RTxHLUk7VlggN1VdRjwnLVQ4NylUICVdJzMkXSIwNFE/M1Q5JjRUNTQ3VTEhMERRJQotTTdQIT8xJUUuMDRVKTBQIE89Ny1SK1ZRSThCXUw6NilDK0ctTytDJCAgJyI2ISBAJyAwICA9KTgkIiA8JQotTSAgIVhFQDAoIVBEICAnUjYhIEAnIVAgIFBQICAgL1xVOik4JCIvXEU7KTgkIiAgICAgI18pNyI2ISBBSAotTSAgICAgLkdAX19fX19SNVRFQDAoOiBAICAgI0lUL19fX19cRT4pOCQiJkAwICAgIFo8I19fX19fKTdSNgotTSEgQUgmICAgIC5GUF9fX186QCFKIChPTDRLQjxAQDAoQTwhVCM2QjxAQDAoWis7X19fXiNRIDJYQCk4JAotTSIoNyA9IDdIST9fX19WQFhBQDAoWilPX19fXisxMEItNSg0MEIxNUBFQDAoNEhVNSMlKTBaJV9fX19fSAotTUNPX19fXkAhIDAgIEBcMCw0LkIwX19fXzpAIlggMCAgIClIICAgICAhUCNUUF5MJixcI0sgLEcjNThPTAotTVpfNjBEKSNLIUMvIFpQIylQVTYrWy5PVUQpIjBaUDhTUC5MIFI8LTVCXlNLXTkiMEQuTCYsXCNLICxHIwotTTU4T0xaXzYwRCkjSyFDLyBaUCMpUFU2K1suT1VEKSIwWlA4U1AuTCBSPC01Ql5TS105IjBELkwmLFwjSwotTSAsRyM1OE9MWl82MEQpI0shQy8gWlAjKVBVNitbLk9VRCkiMFpQOFNQLkwgUjwtNUJeU0tdOSIwRC5MJgotTSxcI0sgLEcjNThPTFpfNjBEKSNLIUMvIFpQIylQVTYrWy5PVUQpIjBaUDhTUC5MIFI8LTVCXlNLXTkiMAotTUQuTCpXMDUgQUAwKFpQIylQVTYrWy5PUUQpIjBaUEs9ITRCJiEgQ0sgLEcjNThPTFpfJjBEKSNJXFAkIAotTSApIyYhP0I3ISBAIFFANVRFUDAoIDw4JS5JPCQiIClGUVA1TEVQMCggUCFGUVA1PEVQMCghICFGUVA0JAotTUVQMCghMCMnITEiNyEgQCYgICAgUVA3UEVAMCghUCAgICw8JV0pOCQiIEAgICAjJyE2QjchIEApICAgIAotTVFQN1xFQDAoIkAgICAsPCU+KTwkIiBMICAgIkE0KDgkIiosXEVQMChINUImISBCQyMpPCQiKiU0QUAwKAotTUhQQjchIEJAXik8JCIqKzRFUDAoSCcyNyEgQkIuKTwkIiogWkVQMChIT0I2ISBBRkg2UjchIEFGSFdSNwotTSEgQUZINVI3ISBBRkhUQjchIEFGSDAyNyEgQUZIWCI3ISBCQSQpPCQiKiw8RVAwKEg/IjYhIEJDQyk8JAotTSIqJ1RFQDAoSFUiNyEgQkE6KTwkIiovUEVQMChIP1I2ISBCQzApPCQiKiVYRVAwKEhWIjchIEJBLyk8JAotTSIqL0BFUDAoSDBSNyEgQkMrKTwkIiokKEVQMChIUkI3ISBDJyE4MjchIENYRVAwKFFQN0xFUDAoPSk8JAotTSIsPCVCKTwkIiNKNyEgQychPkI3ISBBTEVQMChRUDY8RVAwKDcpPCQiLDwlICk8JCIgMjchIEMnITRSNwotTSEgQDBFUDAoUVA2NEVQMChcKTgkIiw8JTYpPCQiLzI2ISBDJyE3IjchIEFIRVAwKFFQNzxFUDAoXyk4JAotTSIsPCUmKTwkIidCNyEgQychPUI3ISBAXEVQMChRUDZARVAwKCIpPCQiLDwlKSk8JCIgKCAgICMnITEyNwotTSEgQCIgICAgUVA2MEYgMCggMCAgICw8JV8pPCQiICQgICAiQUYpPCQiKiwgRiAwKDlKJjxGIDAoOUouNAotTUYgMChSPC01Ql5TSSFPW19fWSAgICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxBIgotTSAgICAgICAgOjQgICAgICAgICAgICgiNiEgQCAgICAgICAgICAqKiIhIEJSQEAwKFBIKCQiLSoiISBAIQotTSAgICA6ICAgICBQICAgIihAQDAoIzAgICAjQiYhIEAkICAgIFooICQiIDQgICAjTEAwMCghQCAgICJSIQotTSEgQCogICAgPlAgICAgTCAgICAwICAgICUwICAgICAgICAgIyAgICA5KTgkIiAoICAgIEAgICAgJSAgIAotTSAhJCAgICA3ICAgIDooKCQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCAgICAgICAgIAotTSAgICAgIDAgXD9cICAgICBVKCAkIiAgICAgICMgICQgICAgICAuQiAhIEAgICAgICBQICIgICAgICAgTAotTUAwMCggICAgICAsICBQICAgICAgWygkJCIgICAgICAjICAwICAgICAgJkIiISBAICAgICAgUCAlICAgIAotTSAgIihAQDAoICAgICAgLCAhQCAgICAgIEMoKCQiICAgICAgIyAgPCAgICAgIC1SIiEgQCAgICAgIFAgKAotTSAgICAgICBYQUAwKCAgICAgICwgIjAgICAgICAvKDgkIiAgICAgICMgIEggICAgICAlUjYhIEAgICAgIAotTSBQICsgICAgICAhREVAMCggICAgICAsICMgICAgICAgQCk4JCIgICAgICAjICBUICAgICAgLyI2ISBAIAotTSAgICAgUCAuICAgICAgICAgICAgICAgICAgLCAjUCAgICAgICAgICAgICAgICAgIyAhICAgICAgICAgIAotTSAgICAgICAgIFAgMSAgICAgICAgICAgICAgICAgICwgJEAgICAgICAgICAgICAgICAgICMgISwgICAgIAotTSAgICAgICAgICAgICBQIDQgIEggICAgICAgICAgICAgICAwIFw/XDEgICAgICAgICAgICAgICAkIC8nXwotTSYgICAgICAgICAgICAgICAhICNRX1IwICAgICAgICAgICAgICAgMCBcP1xMICAgICAgICAgICAgICAgJAotTSAvJ18tQCAgICAgICAgICAgICAgISAjUV9TVCAgICEsQFAwKCMwICAgISggIiAhKSAgICBcKTgkIiAwIAotTSAgIDEgIFggNUAgICAvMjYhIEAkICAgICQwIC4gJjQgICAgWEFAMCggICAgICEoICIwIUsgICAgXik4JAotTSIgKCAgICAxICBYIEAwICAgIzIkISBAISBAICAkQCAoICg4ICAgI1xFQDAoISAgICAhJCAjQCI0ICAgIAotTSApPCQiIDAgICAgMSAgWCBLMCAgIClSIiEgQDwgICAgJEAgICArOCAgICJERiAwKCAgICAgISQgXD9eWwotTSAgICAhKTwkIiAoICAgIDEgIFggUyAgICApUiMhIEAtICAgICRAICggLiggICAgKEVQMCgiICAgICEkIAotTSNAI0sgICAgJCk8JCIgMCAgICAxICBYIFwwICAgLVIiISBAICAgICAkQCAoIC9AICAgIDRFUDAoISAgIAotTSAhJCAjQCAjIDAgIDgpOCQiIDAgICAgMSAgTCAjICQgICFCNyEgQCQgICAgJDAgLiAiMCEgICA8RVAwKAotTSIgICAgISQgI0AgUCAwICApKTwkIiAwICAgIDEgIFggLiAkICAlUiMhIEAtICAgICRAICggJEwhICAgSAotTUVQMCgkICAgICEkICNAITogMCAgNyg4JCIgICAgICAxIC8nXzgwJCAgI0I3ISBAIiAgICAkMCAuICc0IQotTSAgIFpFUDAoIDAgICAhJCAjQCIlIDAgIC8pPCQiIDAgICAgMSAgWCBDMCQgICQiNyEgQCggICAgJDAgLgotTSAqJCEgICJMQEAwKDAgICAgISggICAiSCAwICA4KTgkIiAwICAgIEEgIEwgTCAkICAtUiMhIEAtICAgIAotTSRAICggK1AhICAjXEBQMCgjMCAgICEoICIgIzEgMCAgMik8JCIgMCAgICAxICBYIFlAJCAgJFI3ISBAJAotTSAgICAkMCAuIC8wISAgI1BFQDAoICAgICAhJCBcP19bIDAgID8oLCQiIFQgICAgMiAgQCAiICggICUiNwotTSEgQCggICAgJDAgLiAhVCIgICE4RVAwKCEgICAgISQgI0AgVCBAICBLKCwkIiBUICAgIDIgIEAgL1AoIAotTSAlUjchIEAiICAgICQwIC4gJFgiICAgLEEgMCgkMCAgICEoICIgITsgQCAgUygoJCIgICAgICAyICAgIAotTTggKCAgJiI3ISBAKCAgICAkMCAuICc4IiAgIUhFUDAoISAgICAhJCAjQCFdIEAgIDspPCQiICggICAgMQotTSAgWCBBMCggICciNyEgQCQgICAgJDAgLiApMCIgICFURVAwKCAwICAgISQgI0AiQiBAICA+KTwkIiAwIAotTSAgIDEgIFggTEAoICAnUjchIEAkICAgICQwIC4gLCAiICAiIEVQMCghICAgICEkICNAIzcgQCAgLyg4JAotTSIgMCAgICAxICBIIFkgKCAgJE4jISBAICAgICAkQCAoIC5QIiAgIiRFUDAoISAgICAhJCAjQCNbIEAgIAotTUIpPCQiIDAgICAgMSAgWCAkUCwgIChSNyEgQCggICAgJDAgLiAiOCMgICJcQEAwKCAgICAgISggICAgUAotTSBQICBFKTwkIiAwICAgIDEgIFggMTAsICApQjchIEAkICAgICQwIC4gJFAjICAhREVAMCggICAgICEkIAotTVw/XUIgUCAgRyk8JCIgMCAgICAxICBYID4wLCAgKiI3ISBAJCAgICAkMCAuIChIIyAgITxFQDAoISAgIAotTSAhJCAiUCI8IFAgIEkpPCQiIUAgICAgMSAgWCBJQCwgICtSNyEgQDggICAgJDAgLiArICMgICM0RVAwKAotTSBAICAgISQgI0AiXSBQICBWKTwkIiAwICAgIDEgIFggUzAsICAtUjchIEAkICAgICQwIC4gLiwjICAgQAotTUEgMCgkMCAgICEoICIgI1EgUCAgTygsJCIgVCAgICAyICBAICBQMCAgKCI2ISBAICAgICAkMCNRX1BQJAotTSAgI0BFUDAoIiAgICAhJCAjQCA6ISAgIFopPCQiIDAgICAgMSAgWCAqQDAgIC5SIyEgQC0gICAgJEAgKAotTSAjVCQgICNMRVAwKCEgICAgISQgI0AhMyEgICBcKTwkIiBAICAgIDEgIFggOCAwICAoQiIhIEAgICAgIAotTSRAICYgJjgkICAjWEVQMCggMCAgICEkICNAIU0hICAgXyk8JCIgMCAgICAxICBYID0wMCAgJlIjISBALQotTSAgICAkQCAoIChIJCAgICBGIDAoRCAgICAhJCAjQCIxISAgIEMoLCQiIFQgICAgMiAgQCBJMDAgICkiOAotTSEgQCQgICAgJDAgLiAqXCQgICI0RiAwKCIgICAgISQgI0AiWCEgICBTKCwkIiBUICAgIDIgIEAgUyAwIAotTSApUjghIEAoICAgICQwIC4gICFJLSNAVitGNUw5QCFDPEcwUStHLCA4VylUOjJZUyAnOUE7JzVFPFJVOAotTT0iWUMgJj1EOEZVRStGLCA8VkE/OSYlVDgyWUMgJi1SPSZYTjxQIVY3Vi1IODcpPzlHNU44UCFWN1ctSQotTTlWWUU5JV1JO0cwID1FXVU7Ry1JOVZZRTklXUk7RzAgN1Y5STtGRCA9RV1VO0ctSTlWWUU5JV1DOiYlUgotTTdWJVI8RiVZICZVQTo2WCA9RV1TOjY9Tjk2MT87Jl1OOVAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTwotTTo2WVQ5NyggN1YtTDk2JU49NyAgN1Y1TjkgIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVCAnOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzlHNU44UCFWN1YxTz02KUw5MCFWN1ZFTj0gIT88VzFBPEcwIDtGXU48JylJOzYlUgotTT4wIT85NllWOjcpTztAIVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdWRU49JV1BPEcpQQotTT4wIVA8RkVNODcpWSAnOT88VkVHO0Y1RDdWLUg4Nyk/OUc1TjhQIVY3VjFPPTYpTDk1XUE8RylBPjAhPwotTTk3MUU+JzAgPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdWLUg4NyggPUVdRgotTTsmXUE9ICFWN1ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZICYlVDk3QUk9ICFFO0c5STxGXU4gJzk/OyZdTgotTTlVXUY9NllDICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUgotTTxGJVkgJzk/OjZZVDdXIU86NllUOTcoIDdWNUQ4NzFBICc5PzxWQU88RzE/OUc1TjhQIVY3VzVOPFZFRwotTTtGNUQ3VkVOPSVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnOT86NllUN1Y5VQotTTtGLCA9RV1TOjY9Tjk2MT88VkFPPEcwID1FXUY7Jl1BPSVdRj02WUMgJjVYOjcwID1FXVU7Ry1JOVZZRQotTTklXUw7VllHN1YlUjxGJVkgJzk/OyZdTjlQIVY3Vy1IO1cpVCAnOT87Jl1OOVVdUDtWRU49JjVSICc5PwotTTxWRUc7RjVEN1YtSDg3KCA9RV1VO0ctSTlWWUU5JV1MO1ZZRyAnOT88VkFPPEcxPzg3KVI4N0QgPUVdVQotTTtHLUk5VllFOSVdUzomXVI9JV1BPEcpQT4wIT87JkVCN1c5RTxHLUk7VlggN1ZVQztXNU49ICFWN1YtSAotTTg3KT88Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAhVjdXLUk5VllFOSVdSQotTTtHMT84NylSODdEIDdVXUY8Jy1UODcpVCAnOT88VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJy0/OyZFTgotTTpQIT8xVFEvMEQlLDdUXSYxRS0lNSVdNDA0KSwxNVwgPUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRQotTTxAIVY3VjFPPTYpTDk1XVA7VkVOPSY1UiAlXT87Jl1OOVYxTz02KUw5NV1VPFY1RCAnOT88VzFSPTYtVAotTSwwIVY3Vy1UPEc1Qz0jKCA9RV1DOiYlUjdWJVI8RiVZICc5PzlGUU84NzE/PCZdSTtHMUU8QCFWN1ctSQotTTlWWUU5JV1MO1ZZRzdXIU86NllUOTcoID1FXUQ7VzVCOyY1PzlHNU44UCFWN1ctSTlWWUU5JV1JO0cxPwotTTlHNU44UCE/MSVFLjA0VSkwUCFWN1Y5TDtWJVQ3ViVSPEYlWSAnOT88VkFPPEcxPzwmXUk7RzFFPEAhVgotTTdXLUk5VllFOSVdTDtWWUc3VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJzk/OyZdTgotTTlVXUE8RylBPjAhPzo2WUk9ICFWN1YtSDg3KCA4VlFVO0ZNRTxAIVY3VzVOPFZFRztGNUQ3Vi1IODcpPwotTTlHNU44UCFVN1ZRSTtGTCA9RV1TOjY9Tjk2MT88VkFPPEcxPzlHNU44UCFTPCZdUj0nLUM4NyggPUVdVQotTTtGRU87QyggPUVdVTtHLUk5VllFOSVdSTtHMT85RzVOOFAhVjdXNU46Nl1OICAgTjo2WVQ5NylQICJZSAotTTg3LUggIllEPjZZUz42VCArRjFZO0ctVDxAIE48RjVMK0chTD0gIE46NllJPSAgTjwmUVQgIllUOTdBVAotTSAiWUY6NllJICJZUjtWMUE9JiQgK0YxQT0mJCArRj1PPSAgTjknRU44NlVJOFAgTjhHLVMgIllTPjZVVAotTTg2KCArRy1UPEcxQThAIE48VkFTPScpVDg2KCArRi1POzZVRTtHMCArRjFFOEc1RyAiWUw6NllFICQgSAotTShSRUw6NilDKzZEUy4jOFo7JkVCOFJVSSxTQFYrVi1TPTJdQzxHMFErRywpLDJYUS4gIUE8U0hAKiUtIwotTTEkNEkoIzROLCIgQCwjME8sM0RPLjMgIDAiQEMqNlFJOEYsTTozLFgtQ0lDPFc0TzhXKVQ6MllTIjMkTgotTSxAIUE8U0hAKiUtIzEkNEkoIzROLCIgQCwjME8sM0RPLjMgIDAiQEMqNlFJOEYsTTwmXVI9I0lHOTZYTwotTT1GJUw9NjVTKzVBVCtGLCksMlhTICQgSChSRUw6NilDLkZFTjhSXVM+NllPO0dFTTxSWUgiMyROLFMsIAotTTAiQEMqNkFFODYwWjs2JVQ6IllIIjMoTiwzJE4sMlhSLVAhQThWXU08I0hAKiUtIzEkNEkoIzROLCIgQAotTSwjME8sM0RPLjMgIDtXIVQ6NlRaKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZK1NEUCAmJVMuQiBINFQtJAotTTEyREAtMlhQKCIgUC0iXFEuMlxZLCAhQThWXU08I0hAKiUtIzEkNEkoIzROLCIgQCwjME8sM0RPLjMgIAotTTg3LFooIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkrU0RQICQgSChSRUw6NilDKzZEUy4jOFo5VjVOK1ctSAotTTdWMUE9JiROOFBEUStDLCA4Ni1POzcgWigiQTMwVDElKjIgVStDIEAoIyBUK1MkWStTRFAgJl1QPSZFTQotTS5CIEg0VC0kMTJEQC0yWFAoIiBQLSJcUS4yXFksICFBPFNIQColLSMxJDRJKCM0TiwiIEAsIzBPLDNETwotTS4zICAwIkBDKjZRSThGLE06MyxYLUNJTDo2KUMrNkRTLiM4TzhXLVUrVi1SPSZYTjxQRFErQzQgODcsWgotTSgiQTMwVDElKjIgVStDIEAoIyBUK1MkWStTRFAgIiFMOSIgWigiQTMwVDElKjIgVStDIEAoIyBUK1MkWQotTStTRFAgICAgK0AgICAhJCAkQCFQJUAgIC4gIUc5JilNOTJZQyAjOCEgMCAgICEkITMoLCQiIiQhLTg4JAotTSIgOCEgICAgICFUICAgIDMgISggM0AkICAjQCA9JV1TPScpVThXMCBNQCA4ICAgICpAICAgIFQgJEAhVQotTSAgICAuICFWN1YtSDg3KT87NjVNOEY1UiAlNCAgMCBDICA4ICEgICAgICAnKlAgICAgVCAkQCJAICAgIAotTS4gIVY3Vy1IO1cpVDdWVUU7NilFPEAhNSAgMCAoUCAmICAwIiAgICAhUkQgICAgLSAhKCBSMCAgICNAIAotTT1FXUk7RzE/OzY1TThGNVIgJTQgIVAgQyAgOCAhIDAgICAgJypAICAgIFQgJEAjUyAgICAuICFWN1ZRTwotTTtGPT87NjVNOEY1UiAlNCAiQCBDICA4ICEgQCAgICAnKlAgICAgVCAkQCA+IDAgIC4gIVY3VjlMO1YlVAotTTdWVUU7NilFPEAhNSAgWCAoUCAmICAwLCAgICAhUlAgICAgLSAhKCAyQCQgICNAID1FXUQ7VzVCOyY1PwotTTs2NU04RjVSICU0ICNQIEMgIDggISEgICAgICchICAgICFMICAgIDMgISggOyAoICAjQCArQyFGODZNRQotTSArOCAmICAgICJIICAgIC0gISggRFAkICAjQCA9RV1DOiYlUjdWVUU7NilFPEAhNSAgJCAoUCAmICAwIAotTSAgICAhUkwgICAgLSAhKCBPQCQgICNAID1FXVM6Jl1SPSVdTTk2VUI5NyggNTAgJCAiLCAhQCAkIEAgIAotTSAgPEkgICAgIzAgMiAuPCEgICBYICc5Pzo2WVQ3VlVFOzYpRTxAITUgIDwgKFAgJiAgMCQgICAgIVJIIAotTSAgIC0gISggJDAoICAjQCA9RV1MO1ZZRzdWVUU7NilFPEAhNSAgSCAoUCAmICAwKCAgICAhUkwgICAgLQotTSAhKCAvICggICNAID1FXUY7Jl1BPSVdTTk2VUI5NyggNTAgLiAiLCAhQCAkIyAgICAgPEwgICAgIzAgMgotTSAmQCIgICBYICc5PzkmXVU4RlFFN1ZVRTs2KUU8QCE1ICBcIChQICYgIDAwICAgICFQMCAgICA8ICAgIAotTSVQIDIgKEwjICAgWCAnMT89NllJO1ZYIE1AICggICAgKkAgICAgVCAkQCJSIEAgIC4gIVY3Vi1IODcpPwotTTs2NU04RjVSICU0ICAwIEMgIDggISAgICAgICcqUCAgICBUICRAIz0gQCAgLiAhVjdXLUg7VylUN1ZVRQotTTs2KUU8QCE1ICAwIChQICYgIDAgICAgICFSRCAgICAtICEoICFALCAgI0AgPUVdSTtHMT87NjVNOEY1UgotTSAlNCAhUCBDICA4ICEgICAgICAnKkAgICAgVCAkQCBQIFAgIC4gIVY3VlFPO0Y9Pzs2NU04RjVSICU0IAotTSJAIEMgIDggISAgICAgICcqUCAgICBUICRAITsgUCAgLiAhVjdWOUw7ViVUN1ZVRTs2KUU8QCE1ICBYIAotTShQICYgIDAgICAgICFSUCAgICAtICEoIEFQLCAgI0AgPUVdRDtXNUI7JjU/OzY1TThGNVIgJTQgI1AgQwotTSAgOCAhICAgICAgJyEgICAgIUwgICAgNyAhKCBKMDAgICNAICtDJUY4Nk1FICs4ICIgICAgIkggICAgLQotTSAhKCBUICwgICNAID1FXUM6JiVSN1ZVRTs2KUU8QCE1ICAkIChQICYgIDAgICAgICFSTCAgICAtICEoIAotTV5QLCAgI0AgPUVdUzomXVI9JV1NOTZVQjk3KCA1MCAkICIsICFAICQgICAgICA8SSAgICAjMCAyICIwJAotTSAgIFggJzk/OjZZVDdWVUU7NilFPEAhNSAgPCAoUCAmICAwICAgICAhUkggICAgLSAhKCAzQDAgICNAIAotTT1FXUw7VllHN1ZVRTs2KUU8QCE1ICBIIChQICYgIDAgICAgICFSTCAgICAtICEoID4wMCAgI0AgPUVdRgotTTsmXUE9JV1NOTZVQjk3KCA1MCAuICIsICFAICQgICAgICA8TCAgICAjMCAyICo0JCAgIFggJzk/OSZdVQotTThGUUU3VlVFOzYpRTxAITUgIFwgKFAgJiAgMCAgICAgIVAwICAgIEogICAgIUAgMiAtPCQgICBYICc5PwotTThWQUE8RV1GPTZZQyAlNCAgMCAxIDRSIyEgQEEgNUYjISBAJCAgICAsMCAgICA4ICRAICwhMCAgLiAhVgotTTdXLUk5VllFOSVdQzomJVI3VjlVO0YsIDUwICIgISQhNygsJCIiJCE6OCwkIiAwICAgIFMgICAgIUAgMgotTSAkLCUgICBYICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAlNCAgUCAxIDZSIyEgQEEgN0YjISBAJAotTSAgICAqUCAgICA4ICRAIVIhMCAgLiAhVjdXLUg7VylUN1Y5VTtGLCA1MCAkICEkIT8oLCQiIiQhQjgsJAotTSIgMCAgICBSICAgICFAIDIgKkAlICAgWCAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA1MCAlICEkIQotTUMoLCQiIiQhRjgsJCIgMCAgICBUICAgICFAIDIgLiAlICAgWCAnOT89NllTOjY9Tjk2MT88VkFPPEcxPwotTTlHNU44UCE1ICA4ICQwJjxAUDAoKDAmSUBQMCghICAgICJEICAgICYgISggIzA4ICAjQCA9RV1JO0cxPwotTTlHNU44UCE1ICA8ICQwJkxAUDAoKDAmWUBQMCghICAgICMgICAgICYgISggMDA4ICAjQCA9RV1TOjY9TgotTTk2MT86NllUN1Y5VTtGLCA1MCAoICEkIU8oLCQiIiQhUjgsJCIgMCAgICBSICAgICFAIDIgJzwmICAgWAotTSAnOT89NllTOjY9Tjk2MT86NllUN1Y5VTtGLCA1MCApICEkIVMoLCQiIiQhVjgsJCIgMCAgICBKICAgIAotTSFAIDIgKjQmICAgWCAnOT87Jl1OOVVdRj02WUMgJTQgIkAgMSA9UiMhIEBBID5GIyEgQCQgICAgLDAgIAotTSAgOCAkQCM6IUAgIC4gIVY3Vy1JOVZZRTklXUw7VllHN1Y5VTtGLCA1MCArICEkIVsoLCQiIiQhXjgsJAotTSIgMCAgICBTICAgICFAIDIgISQnICAgWCAnOT89NllTOjY9Tjk2MT87Jl1OOVVdRj02WUMgJTQgIyAgMQotTSA/UiMhIEBBIDBGJCEgQCQgICAgKlAgICAgOCAkQCEgIVAgIC4gIVY3VjlMO1YlVDdWOVU7RiwgNTAgLgotTSAhJCEjKDAkIiIkISc4MCQiIDAgICAgTCAgICAhQCAyICcgJyAgIFggJzk/OSZdVThGUUU3VjlVO0YsIAotTTUwIC8gISQhKCgwJCIiJCEsODAkIiAwICAgIDUgICAgJTAgMiAqWCcgICIjICA0ICA+SCcgICA1ICAgIAotTSEwIDIgKUgnICAiIyAgNCAgPkgnICAgMCAgICAhMCAyICpIJyAgITUgIDwgISAgICAjUCAgICAhICEoIAotTVpAPCAgKTQgICAiQyAiQCAgIEAgICAgICAgICAgICAgIiAgICAgICAgMCAgICAgKCAgICAgICAiICAgIAotTSInKCArQCAgICFEICAgIDMgISggPlBAICAjQCA7JkVOOlAiViApQCAgICBGICAgICMwIDIgIkQoICAgWAotTSAmWUU+JzAgQFAgJSAgJ0ohUCAgKFAgJiAgMCAgICAgIVJIICAgIC0gISggNFBAICAjQCA7JkVOOlY5VQotTTtGLCBAUCAlICAlUCFQICAoUCAmICAwJCAgICAhUjAgICAgLSAhKCA9UEAgICNAIDxXMVU5RjggPEAiTgotTSFQICAoUCAmICAwKCAgICAhUDAgICAgNSAgICAlMCAyICtEKCAgIiMgIDQgID5IJyAgIDUgICAgITAgMgotTSAqNCggICIjICA0ICA+SCcgICAwICAgICEwIDIgKzQoICAhNSAgPCAhICAgICNQICAgICEgISggXTBAIAotTSApNCAgICJDICJAICAgQCAgICAgICAgICAgICAiICAgICAgICAwICAgICAoICAgICAgICIgICAgIicoIAotTStAICAgIVAgICAgNyAhKCBCMEQgICNAID0nNT87JkVOOlAiViApICAgICBGICAgICMwIDIgIzwpICAgWAotTSAmWUU+JzAgQFAgJSAgJ0ohUCAgKFAgJiAgMCAgICAgIVJIICAgIC0gISggODBEICAjQCA7JkVOOlY5VQotTTtGLCBAUCAlICAlWyIgICAoUCAmICAwICAgICAhUjAgICAgLSAhKCBBMEQgICNAIDxXMVU5RjggPEAiWQotTSIgICAoUCAmICAwICAgICAhUDAgICAgWiAgICAhICAyICw8KSAgIFggIlhSOUYlSzkwIlYgIDAgICAjUwotTSAhTCAgQCAgICYpTD02NCAgMCAgICY9Ujk2NU4gICAgICAhUjk2MCAhICAgICNYICAgICQgISggIjBIIAotTSAjQCA4Vl1MO1cpUyArOCAhICAgIC8sICdQICIgICAgPCZFTjpQICEgICAgPCc1UjwmUUUgICAgICAhWQotTTk2UUw7VzwgISAgICAjKCAgICAkICEoIC9QSCAgI0AgK0MtRjg2TUUgKzggISAgICAvLCAkUCAhICAgIAotTTlGXVI5ICAgICAgIDhWQUU9R0QgISAgICAjJCAgICAkICEoID0gSCAgI0AgOFYlUjxQIlYgIDAgICAjUwotTSAhMCAgMCAgICchTzxHLUM6JjQgICAgICAmKU09UCAkICAgICxAICAgIDAgJEAiSiJAICAuICBOLSY5QQotTTpWNCBNQCAkICAgIFxQIDMgICQgICAhNDRFNSUgICAgICAhJjA0UTMxMCAkICAgICcgICAgITggJEAjJgotTSJAICAuICFCO1ZdTDk2JU4gJyggPSBIICAjJCAgICAkICEoIF5QSCAgI0AgOEc5QTsnLCBNQCAkICAgIAotTVxQIDMgICQgICAhVDxHNUUgICAgICAhRjg2UVM5MCAkICAgICcwICAgITggJEAgOCJQICAuICFCO1ZdTAotTTk2JU4sQCFSICw4KiAgISYgICAgISAgMiAmKCsgICBYICZVSTxWXVI5JjVSOTYwIE1AICQgICAgXFAgQwotTSAgLCAgICFUOicpRTkwICAgICAgPkY1UjtQICEgICAgO1ZZRSAgKCAgICFUPVZcICEgICAgIiwgICAgJgotTSAhKCBCMEwgICNAIDs2JUk7QCE1ICA8ICQwJFRBIDAoKDAkVUFAMCghICAgICI8ICAgICcgISggTCBMIAotTSAjQCA8VyFPPEcxUzhWJVIgJyggL1BIICAiLCAhMCAjRClAJCIiNCAgICAnICEoIFUwTCAgI0AgOFZRVQotTTtGTUU8QCFSICBEKiAgIEMgIDQgIF9SNyEgQEggICAgIVAgMiAvVCsgICBYICZZTztHIVI6NlVBPEdEIAotTTxAIyciMCAgKFAgJSAgLDRFUDAoKTAgICAgPCAkQCBCIyAgIC4gIVA8RkVNODcpWSAnKCBCMEQgICIsIAotTSEwICMpKTwkIiIwICAgICcgISggMUBQICAjQCA9NV1MOjZZSyAnKCBdMEAgICIsICEwICMgKUAkIiI8IAotTSAgICcgISggOzBQICAjQCA8VV1MOjZZSyAoLCAhMCAhWkA8ICAiLCAhMCAjRik8JCIiOCAgICAnICEoIAotTURQUCAgI0AgPUVdVTtGRU87QyggPEAiKyBQICAoUCAlICAuNEYgMCgpMCAgICA8ICRAIlgjICAgLiAhVgotTTdXNU46Nl1OICcoIDsgKCAgIiwgITAgI0cpQCQiIjwgICAgJyAhKCBXUFAgICNAID1FXVM9JylVOFcwUgotTSAnKCAzQCQgICIsICEwICNPKTwkIiI8ICAgICcgISggIUBUICAjQCA9RV1TPScpVThXMFEgJyggK0AgIAotTSAiLCAhMCAjSSk8JCIiXCAgICAnICEoIC0wVCAgI0AgPUVdRDtXNUI7JjU/PCZdSTtHMUU8QCFDICAsIAotTSAwXCAoUCAlICAuQEVQMCgrQCAgICA8ICRAIUMjMCAgLiAhVjdWOUw7ViVUN1chTzo2WVQ5NyggOFAgIwotTSAgJC4gIiwgITAgI1YpPCQiIzggICAgJyAhKCBGMFQgICNAID1FXVU7Ry1JOVZZRTklXUw7VllHN1chTwotTTo2WVQ5NyggOFAgIyAgJCwgIiwgITAgIyYpPCQiIzAgICAgJyAhKCBTMFQgICNAID1FXVM6Nj1OOTYxPwotTTsmXU45VV1QO1ZFTj0mNVIgJiwgIFAgISJQIEMgIDQgIF1SNyEgQE0gICAgIVAgMiAvSC0gICBYICc5PwotTTsmXU45VV1QO1ZFTj0mNVIgJiwgIFAgISJAIEMgIDQgIFciNyEgQFUgICAgIVAgMiAiXC4gICBYICc5PwotTT02WVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KCA4UCAjICAkKSAiLCAhMCAjNik8JCIjLCAgICAnICEoIAotTThAWCAgI0AgPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoIDhQICMgICQoICIsICEwICNFKTwkIiJQIAotTSAgICcgISggQ0BYICAjQCA9RV1JO0cxPzwmXUk7RzFFPEAhQyAgLCAgMDwgKFAgJSAgLSxFUDAoLVAgIAotTSAgPCAkQCMlI0AgIC4gIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoIDhQICMgICQmICIsIAotTSEwICMgKTwkIiM0ICAgICcgISggXkBYICAjQCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhQwotTSAgLCAgMDQgKFAgJSAgLjxFUDAoK0AgICAgPCAkQCBII1AgIC4gIVY3Vy1IO1cpVDdXIU86NllUOTcoIAotTThQICMgICQkICIsICEwICNaKTwkIiM4ICAgICcgISggN0BcICAjQCA9RV1VO0ctSTlWWUU5JV1DOiYlUgotTTdXIU86NllUOTcoIDhQICMgICQjICIsICEwICNCKTwkIiMwICAgICcgISggREBcICAjQCA9RV1TOjY9TgotTTk2MT84VkFBPEVdUDtWRU49JjVSICYsICBQICEgQCBDICA0ICBeUjchIEBNICAgICFQIDIgK1wvICAgWAotTSAnOT84VkFBPEVdUDtWRU49JjVSICYsICBQICEgMCBDICA0ICBYMjchIEBEICAgICAwIDIgLiwvICAiNQotTSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAjUCBMICAgICFQIDIgIFwwICAgWCAnOT85Jl1VOEZRRQotTTdWJVI8RiVZICcoIE9QXCAgIiwgITAgIyopPCQiIjAgICAgISAhKCAsUSAgICk0ICAgIkMgISAgICBAIAotTSAgICAgICQgICAgKDUwIC4gIkwgICAgJyAhKCA3QSAgICNAID1FXUY7Jl1BPSVdQTxHKUE+MCFSICBcMAotTSAgIEMgIDQgIF4iNyEgQEQgICAgIDAgMiAoKDAgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0IAotTSMgIFMgICAgIVAgMiArNDAgICBYICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4wIVIgJVgwICAgQwotTSAgNCAgViI3ISBARCAgICAgMCAyIC1EMCAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgIlAgUQotTSAgICAhUCAyICBIMSAgIFggJzk/PFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgPEAiVSQgICAoUCAlICAtIAotTUVQMCgpICAgICAkICRAIE4kMCAgRTAgICAqLCAkICAgIiAgICAgICAgMCAgICBBNSAgSCAqQCAgICA8IAotTSRAITgkMCAgLiAhVjdWUU87Rj0/ODcpUjg3RCA8QCAqJDAgIChQICUgIC9QRVAwKCkgICAgICQgJEAhXAotTSQwICBFMCAgICosICQgICAiICAgICAgICAwICAgIEE1ICBEICxAICAgIDwgJEAiTiQwICAuICFWN1c1TgotTTxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhUiAlQDEgICBDICA0ICBVIjchIEBEICAgICAwIDIgLSgxICAiNQotTSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAiICBQICAgICFQIDIgICgyICAgWCAnOT88VkVHO0Y1RAotTTdWRU49JV1BPEcpQT4wIVIgKlgxICAgQyAgNCAgWFI3ISBARCAgICAgMCAyICI4MiAgIjUgICAgSFAgMAotTSAgICggICAgICAgISAgICAiJTQgIVAgSSAgICAhUCAyICRcMiAgIFggJzk/OjZZVDdWJVI8RiVZICcoIAotTSBBKCAgIiwgITAgIycpPCQiIjAgICAgISAhKCA8USggICk0ICAgIkMgISAgICBAICAgICAgICQgICAgKAotTTUwICYgIzAgICAgJyAhKCBJUSggICNAID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCFSICRcMgotTSAgIEMgIDQgIFgiNyEgQEQgICAgIDAgMiAsTDIgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0IAotTSEwIFIgICAgIVAgMiAvVDIgICBYICc5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAnKCBJUSggICIsIAotTSEwICMyKTwkIiIwICAgICEgISggKDEsICApNCAgICJDICEgICAgQCAgICAgICAkICAgICg1MCAkICJMIAotTSAgICcgISggMyEsICAjQCA9RV1TOiZdUj0lXUE8RylBPjAhUiAvVDIgICBDICA0ICBXUjchIEBEICAgIAotTSAwIDIgJyAzICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAgUCBTICAgICFQIDIgKiwzICAgWAotTSAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFSICRQMyAgIEMgIDQgIF9CNiEgQEQgICAgIDAgMgotTSAsPDMgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICBAIFEgICAgIVAgMiAvQDMgICBYICc5PwotTTxWRUc7RjVEN1YtSDg3KT84NylSODdEIDxAIkMkUCAgKFAgJSAgLFhFUDAoKSAgICAgJCAkQCA8JSAgIAotTUUwICAgKiwgJCAgICIgICAgICAgIDAgICAgQTUgICQgKkAgICAgPCAkQCEmJSAgIC4gIVY3Vi1IODcpPwotTTg3KVI4N0QgPEAjWCRQICAoUCAlICAvNEVQMCgpICAgICA8ICRAIUolICAgLiAhVjdWMU89NilMOTAhNQotTSAgXCAoUCAlICAsKEVQMCgoUCAgICA8ICRAIi0lICAgLiAhVjdWOUw7ViVUICU0ICNAIEMgIDQgIFNSNwotTSEgQEsgICAgIVAgMiArQDQgICBYICc5Pz02WVM6Nj1OOTYxPzsmXU45UCE1ICBQIChQICUgIC1YRVAwKAotTSowICAgIDwgJEAjQSUgICAuICFWN1ctSTlWWUU5JV1MO1ZZRyAlNCAiUCBDICA0ICBfUjYhIEBCICAgIAotTSFQIDIgICw1ICAgWCAnOT87Jl1OOVAhNSAgSCAoUCAlICAtSEVQMCgqQCAgICA8ICRAIE0lMCAgLiAhVgotTTdXNU48VkVHO0Y1RDdWRU49ICE1ICBEIChQICUgIC9URUAwKCogICAgIDwgJEAhNSUwICAuICFWN1ctSQotTTlWWUU5JV1JO0cwIDUwICggIiwgITAgI1wpOCQiIiQgICAgJyAhKCA9QTQgICNAID1FXUk7RzAgNTAgJwotTSAiLCAhMCAjJCk8JCIiUCAgICAnICEoIEhBNCAgI0AgPUVdVTtHLUk5VllFOSVdUzomXVI9ICE1ICA4IAotTShQICUgICwkRVAwKCpAICAgIDwgJEAjLCUwICAuICFWN1ctSTlWWUU5JV1TOiZdUj0gITUgIDQgKFAgJQotTSAgLTxFUDAoKFAgICAgPCAkQCNPJTAgIC4gIVY3Vy1IO1cpVCAlNCAhICBDICA0ICBWUjchIEBLICAgIAotTSFQIDIgIUg2ICAgWCAnOT89NllTOjY9Tjk2MT84VkFBPEAhNSAgLCAoUCAlICAsWkVQMCgqMCAgICA8IAotTSRAISMlQCAgLiAhVjdXLUk5VllFOSVdQzomJVIgJTQgIEAgQyAgNCAgVzI3ISBAQiAgICAhUCAyICY0NgotTSAgIFggJzk/OFZBQTxAITUgICQgKFAgJSAgL1hFUDAoISAgICAgPCAgICAgICAiMiBAICAzKCwkIidEIAotTSAgI19fUCAgICAhWiAgICBfX1wwICAgID5QICAgL19fKCAgICAnVCAgICNfX1MgICAgIV4gICAgX19dIAotTSAgICA/UCAgIC9fXzQgICAgKCQgICAjX19WICAgICIiICAgIF9fXVAgICAgQFAgICAvX19AICAgICg0IAotTSAgI19fWSAgICAiJiAgICBfX15AICAgIEFQICAgL19fTCAgICAoRCAgICNfX1wgICAgIiogICAgX19fNAotTSAgICBMQCAgIC9fX1ogICAgKzQgICAjX19eWCAgICJWICAgIF9fX1UgICAgTVAgICAvX19fICAgICtEIAotTSAgI19fUCwhICAiWiAgICBfX1wsIDAgIE5QICAgL19fJTAkICArVCAgICNfX1FYISAgIl4gICAgX19cSAotTSAwICBPUCAgIC9fXyxAJCAgLCQgICAjX19TUCEgICMiICAgIF9fXSYgMCAgUFAgICAvX180ICQgICw0IAotTSAgI19fVUghICAjJiAgICBfX11EIDAgIFIwICAgL19fPiAkICAsSCAgICNfX1goISAgIysgICAgX19eLAotTSAwICBTMCAgIC9fX0VAJCAgLFggICAjX19aKCEgICMvICAgIF9fXk4gMCAgVDAgICAvX19OQCQgIC0oIAotTSAgI19fXDAhICAjMyAgICBfX18uIDAgIFUwICAgL19fViAkICAtOCAgICNfX14oISAgIzcgICAgX19fTAotTSAwICBWMCAgIC9fX11AJCAgLUggICAjX19QICIgICM8ICAgIF9fXDQgQCAgVzAgICAvX18nQCggIC1YIAotTSAgI19fUkAiICAjQCAgICBfX1xSIEAgIFgwICAgL19fLyAoICAuKCAgICNfX1Q4IiAgI0QgICAgX19dMAotTSBAICBZMCAgIC9fXzZAKCAgLjggICAjX19WMCIgICNIICAgIF9fXU4gQCAgWjAgICAvX18+ICggIC5IIAotTSAgI19fWCgiICAjTCAgICBfX14sIEAgIFswICAgL19fRUAoICAuXCAgICNfX1ogIiAgI1AgICAgX19eSgotTSBAICBcMCAgIC9fX00gKCAgLyggICAjX19bWCIgICNUICAgIF9fXyggQCAgXUAgICAvX19UQCggIC88IAotTSAgI19fXVgiICAgICAgICBfX19JIEAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgIDAgICAgJCAgICAiICAgIFUoICQiLTAgICAgMyAgICAgICAgICAgIAotTSAgICEgICAgICAgICAgRCAgICAlICAgICBAICAgLkIgISBDSCAgICAxICAgICAsICAgICAgICAgISAgIAotTSAgMCAgICAvICAgICJQICAgICggICAgTEAwMCgrICQgICwgICAgICQgICAgIDAgICAgMCAgICAwICAgIAotTSVQICAgICwgICAgIiAgICBbKCQkIi5QISAgIVsgICAgICAgICAgICAgICAhICAgICAgICAgIVwgICAgKQotTSAgICAgQCAgICZCIiEgQUggQCAgKCAgICAgLCAgICAnICAgICEgICAgIEAgICAgSCAgICAgMCAgICA4IAotTSAgIihAQDAoQiAoICAgJCAgICAgICAgICAgICAgIDAgICAgICAgICArQCAgICAkICAgICYgICAgQygoJAotTSIoUCIgICEwICAgICAgICAgICAgICAgJCAgICAhICAgICMsICAgICEgICAgIUAgICAtUiIhIEM8IEAgIAotTTYwLCAgICAgICAgICAgICAhICAgICAgICAgIFkgICAgIDAgICAgOCAgICBYQUAwKC4gOCAgICQgICAgIAotTSAgICAgICAgICAwICAgICAgICAgL1AgICAgJCAgICAiICAgIC8oOCQiI1AmICAgQCAgICAgICAgICAgIAotTSAgICQgICAgICAgICAkPCAgICAhICAgICBQICAgJVI2ISBBPCFAICAiICAgICAgICAgICAgICAgISAgIAotTSAgICAgICEtICAgICAwICAgICwgICAhREVAMCg5IDggICFQICAgICAgICAgICAgICAgMCAgICAkICAgIAotTTRAICAgIDggICAgIyAgICBAKTgkIiggJiAgIVAgICAgISAgICAgICAgICAkICAgICIgICAgJUwgICAgKAotTSAgICAgUCAgIC8iNiEgQ1AhQCAgTSAkICAgICAgICAgICAgICEgICAgICAgICAhQCAgICAgQCAgICAgIAotTSAgICAgICAgXCA4ICAgICcgICAwICAgICcgICAgIDAgICAgMCAgICA6ICAgICAsICAgICAgICAgICAgIAotTSAvIC0gICM0ISAgICAgICAgICAgICAgISAgICAgICAgICcgICAgICMgICAgICAgICAgICAgICMkJEAgIAotTUQgICAgICAgICAgICAgICAgMCAgICAgICAgIVogICAgIDAgICAgICAgICAgICAgIDUhLCAgIigiICAgIAotTSAgICAgICAgICAkICAgICAgICAgQFAgICAgJCAgICAgICAgICAgICAgJ0A1ICAhUCVAICAgICAgICAgIAotTSAgICQgICAgICAgICAoSCAgICAhICAgICAgICAgICAgICAjSCpQICBEQCggICAgICAgICAgICAgIDAgIAotJSAgICAgICAgCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTg2MC1lbGYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTg2MC1lbGYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZTgzYi4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k4NjAtZWxmLnUKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotYmVnaW4gNzc1IGk4NjAtZWxmCi1NP1Q1LDFAJCIgMCAgICAgICAgICAgICAiICA8ICAgICEgICAzMiAgICAjMCAgIy00ICAgICAgIFQgIiAgCi1NITAgSCAhNCAkMCAgICA4ICAgIFQgICAwLSAgICAgICAgICJAICAgIEggICAgIDQgICAgICAgICAgUCAgCi1NIC0wICAgICAgICAgICAgICAhLCAgICAgICAgICEgICAgICAgICAgISAgICAtICAgJCMwICAgICAgICAoCi1NXCAgICIvICAgICAlICAgMCAgICAgICQgICBERCAgIEkpICAgICAgICAgIjggICAiNyAgICAgOCAgISAgCi1NICAgICBAICAiNFAgICJFLCAgICAgICAgICcgICAgICAgICAgIVAgICAgIE89Ny1SK1ZRSThCXUw6NilDCi1NK0ctTytDJCAgICAgICAsICAgICwgICAgIVAgICAgUCAgICArICAgICAgICAgICAgICAgICAgICAgQCAgCi1NICAgICAgICMgICAgITAgICAgICAgICAmICAgICEgICAgIEQgICAgKiAgICAiICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgISAgICAgMCAgJE0gICAgISwkQCAgICAgICAgSCAgIk4gCi1NICAgICAhJCBfXyQgICAgLyAgIEkqICAgICAwMSAgICsgICAgJiAgICYyMCAgICAgJDAjX1wwICAgIVwgCi1NICErTCAgICBGISggICAgICAgIEYgICBJTyAgICAgIDEgL19RICAgICswICAkUjAgICAgICRAICAgICAgCi1NICMoICAhRDAgICAgISEkICAgSCAgICBfICAgMyIgICAgICAyICAgICAgICAyMCAgKjMgICAgICAkMCNfCi1NXDAgICAlXCAgIkUsICAgICAhJCBfXyQgN1YtTDk2JU49NyAgN1Y1TjkgIT85NllWOjcpTztAIT85NzFFCi1NPicwIDg3MUU+JkVUICVdRTkmJVQ4MCFFPiZFVCAlXUw6Nik/PUY1UjxWRU87QCE/N1Y5UDxXMUE8RzAgCi1NN1Q9LDNUKSEzJV0vMUQ5MzE1MT81JCUiMyQ1PyAlXSQ2NFkhMzRFIyAiXVU8VyhPOyZFQitWUUk4RixOCi1NPFZcTiwwICAgICBJLyAgICBAMCAgICAgICAgSTAgICAhQDAgICAgICAgIEkxICAgIkAwICAgICAgICBJCi1NMiAgICIgMCAgICAgICAgICAqICAgICEgICBAIEggICAgKiAgICAgN19SRFlbIVwgICE/PiozNSAgL0AgCi1NJV9cSS8+UD8gICNEJzAgIDAgI1ggJk9fX187T08wICBbIVwgIC5QPiAgISAgL0AgJV9cSTA+Xl0gICNECi1NJzAgLFshWCAgJk9fX15cN19SRSVbIVwgIC4wPSAhQSAgL0AgOl9fX1ouXl0gICNMJ1AgIFshWCAgJCAgCi1NXiAgN19SRSlbW1QgIC4wPSAiM0wnQCAgOl9fX1g6ICAgICMoICAgNCckICAgODEiX18iQDBQICAnJCAgCi1NIT5QMCAgIzQwQCAvNkAgICBOODAkTSJAICAgIDtfX19YLj8/KjRTTCdAICA7X19fVlVPQCAgK0wkICAgCi1NSCkgICAuODAmMCFPX19fOEggICAgJl9fX1w+QCAgICA7X19fVlo4MiAgKDQ8ICAxQUUoICYoKTImICA/Ci1NWTkkSVshXCAgJlAgIClKJDwwIDQ7X19fVVogICAgIkAkICAgSCAgICAkP0BeICIkJ1AgIUhcJCAgKiBfCi1NICAiQCAgICAwICNYICogICAgIkAgICAgSCAgICAsQCAgIFA8MCFAIUEkK19cKiAwICAiJDBQICAlJiwgCi1NIDgxXyAhIkdYQCAgMCAgKCAqICAgICMoICAgLCckIDggODEiX18iQCQgICBBJCwgICExQyAgJiQ/UCAwCi1NSV4oICAkICAiICJAICAgIFIgICAjIVEgJiAmJDBPX1BIISAgICgxIyAgIDQ4UCAhQSdcICQqP0IgICEgCi1NICBAIEggICAgLEAgICBQPDAhQCFBJCtfXCogMCAgIiQwUCAgJSYsICA4MV8gISJHWEAgIDAgICggKiAgCi1NICAjKCAgICwnJCA4IDgxIl9fIkAkICAgQSQsICAhMUMgICYkP1AgMEleKCAgJCAgIiAiQCAgICBSICAgCi1NIyFRICYgJiQwT19QSCEgICAoMSMgICA0OFAgIUEnXCAkKj9CICAhICAgQCBIICAgICxAICAgUDwwIUAhCi1NQSQrX1wqIDAgICIkMFAgICUmLCAgODFfICEiR1hAICAwICAoICogICAgIyggICAsJyQgOCA4MSJfXyJACi1NJCAgIEEkLCAgITFDICAmJD9QIDBJXiggICQgICIgIkAgICAgUiAgICMhUSAmICYkME9fUEghICAgKDEjCi1NICAgNDhQICFBJ1wgJCo/QiAgISAgIEAgSCAgICAsQCAgIFA8MCFAIUEkK19cKiAwICAiJDBQICAlJiwgCi1NIDgxXyAhIkdYQCAgMCAgKCAqICAgICMoICAgLCckIDggODEiX18iQCQgICBBJCwgICExQyAgJiQ/UCAwCi1NSV4oICAkICAiICJAICAgIFIgICAjIVEgJiAmJDBPX1BIISAgICgxIyAgIDQ4UCAhQSdcICQqP0IgICEgCi1NICBAIEggICAgLEAgICBQPDAhQCFBJCtfXCRAKCA8RiQwUCAgJSYsICA4MV8gISJHWEAgIDAgICggKiAgCi1NICAjKCAgICwnJCA4IDgxIl9fISgiICcpQSQsICAhMUMgICYkP1AgMEleKCAgJCAgIiAiQCAgICBSICAgCi1NIyFRICYgJiQwT19QWyFcICAoMSMgICI0JyAgISNeNCJTIF9FWEQzTCdQICBbIVwgICkwPCAgKjQnICAjCi1NI143QiJBX0VYQ1NMJ1AgIFshXCAgKTA8ICAyNCcgICUnXjdCKyFfRVg9M0wnUCAgWyFcICApMDwgIDo0Ci1NJyAgJydeN0FYMV9FWDw3TCdQICBbIVwgICkwPCAgQjQnICApJ143QVAxX0VYQ0dMJ1AgIFshXCAgKTA8Ci1NICBKNCcgICsnXjdBUzFfRVhER0wnUCAgKV8gOShOUD8gICBPXCJILlshXCAgIj9QJjFDTCdQICArXyBJCi1NVi5QPyAgICdfIkssWyFcICAgX0VYSkNMJ1AgICFfUEoxLlA/ICAgL1k+KChbIVwgICA/XCpAS0wnUCAgCi1NI143QVIuUD8gICA3XyJIXFshXCAgIV9FWERTTCdQICAlX1BKKy5QPyAgID9ZPig4WyFcICAhP1wqPTNMCi1NJ1AgICdeN0I0LlA/ICAgN18iR0FbIVwgICFfRVg+V0wnUCAgJV9QSVE+UD8gICA/WT4pPVshXCAgIT9cCi1NKjwnTCdQICAnXjdCKD5QPyAgIDdfIkhZWyFcICAhX0VYTDdMJ1AgICVfUElTPlA/ICAgP1k+KDFbIVwgCi1NICE/XCpER0wnUCAgJ143Qiw+UD8gICBHXCJILlshXCAgIl9QKks7TCdQICApXyBJVi5QPyAgIE9cIkdYCi1NWyFcICAuP1wqTFNMJ1AgICdeN0I1PlA/ICAjR18iSSRbIVwgICFfRVhMJ0wnUCAgWV9QSiJOUD8gICA/Ci1NWT4pOVshXCAgLj9cKkNTTCdQICAnXjdCTz5QPyAgI0dfIkhMWyFcICAhX0VYRldMJ1AgIFlfUElVLlA/Ci1NICAgP1k+JzFbIVwgIC4/XCo+I0wnUCAgJ143Qic+UD8gICNHXyJHJFshXCAgIV9FWEY3TCdQICBZX1BJCi1NUC5QPyAgID9ZPihJWyFcICAuP1wqQ0NMJ1AgICdeN0IwPlA/ICAjR18iRyxbIVwgICFfRVhLJ0wnUCAgCi1NWV9QSjIuUD8gICA/WT4nSVshXCAgLj9cKkBTTCdQICAnXjdCSz5QPyAgI0dfIkc4WyFcICAhX0VYRydMCi1NJ1AgIFshXCAgKTA8ICAqNCcgICInXjdBXTFfRVg+N0wnUCAgWyFcICApMDwgICY0JyAgISdeN0M6MV9FCi1NWE0nTCdQICAlX1BKOj5QPyAgID9ZPis5WyFcICAhP1wqV0NMJ1AgICdeN0M8LlA/ICAgNDhQICFBJ1wgCi1NJCo/QiAgISAgIEAgSCAgICAkICAiICJAICAgIEggICAgICAgICAgICAgICAwJkQgICAgICAgISJSICAgCi1NICAgICAgICAgICAgICAgICAgIEkzICAgICAgICAgICAgICAyVyAgICRPQCAgISw0ICAgMywgICAgICQgCi1NICAhSCAgICAjICAgJEsgICAgIC0gICA5ICAgICAgMCAgISNIICAgICEwICAkQCAgICAgJiAgIDEsICAgCi1NICBIICAgIVsgICAgIlAgICAhICAgICA1ICAgICAgICAgICwgICJEUCAgICAgQCAgICMgICAgIDQgICAgCi1NIVAgICAhPCAgISlcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCAgICAgCi1NICAgICAgMCBfXyQgICAgICAgIDBVICAgICAgIyAgICEgICAgICAgICQuQCAgICAgIFAgICBAICAgICAgCi1NICEkUCAgICAgICwgICAsICAgICAgICAyICAgICAgICMgICAkICAgICAgICAkR1AgICAgICBQICAhMCAgCi1NICAgICAhKlAgICAgICAsICAgOCAgICAgICAgMlAgICAgICAjICAgJyAgICAgICAgJFQgICAgICAgUCAgCi1NIiAgICAgICAgIUQgICAgICAgLCAgIEQgICAgICAgIDkkICAgICAgIyAgICogICAgICAgICoyMCAgICAgCi1NIFAgICJQICAgICAgICJEUCAgICAgICwgICBQICAgICAgICBJMyAgICAgICMgICAtICAgICAgICAqPCAgCi1NICAgICBQICAjQCAgICAgICAgICAgICAgICAsICAgXCAgICAgICAgICAgICAgICAjICAgMCAgICAgICAgCi1NICAgICAgICAgUCAgJDAgICAgICAgICAgICAgICAgLCAgISggICAgICAgICAgICAgICAgIyAgIDMgICAgCi1NICAgICAgICAgICAgIFAgICUgICAgIDwgICAgICAgICAgIDAgX18kICAgIC4gICAgICAgICAgICQgL19RCi1NICAgICUwICAgICAgICAgICEgI19cMCAgICIkICAgICAgICAgICAwIF9fJCAgICBJICAgICAgICAgICAkCi1NIC9fUSAgICAsUCAgICAgICAgICAhICNfXDAgICAjSCAgIkcgICAgICEhJCAgIFggICAhKSAgIElRICAgCi1NICAwMSAgIC4gICAgNUAgICRfQCAgICBAJEAgICIgICAgJiggICFEICAgICAgISggICBEICAgIUggICBJCi1NUiAgICAgKDEgICAuICAgID9AICAlQkAgICArOCRAICAiICAgICgsICAiRywgICAgISEkICAgWCAgICIxCi1NICAgSVQgICAgIDAxICAgLiAgICBKQCAgJFggICAgISwkQCAgICAgICArLCAgIk4gICAgICAhJCBfXyQgCi1NICAiWCAgIElVICAgICAoMSAgIC4gICAgUjAgICUsICAgICBAJEAgICIgICAgLVwgICJHOCAgICAiISQgCi1NICBYICAgI0ggICBJWCAgICAgMDEgICAuICAgIFtAICAkVEAgICAgICRAICAiICAgIC80ICAiR0QgICAgCi1NISEkICAgWCAgICQgICAgSSogICAgIDAxICAgKyAgICEiMCAgKj5AICAgICQkMCAgI0AgICAyJCAgIkdMCi1NICAgICIhJCAgIFggICAkTSAgIEldICAgICAwMSAgIC4gICAhLTAgICUiICAgICBAJEAgICIgICAgNEAgCi1NICJHWCAgICAkISQgICBYICAgJTcgICA5KSAgICAgIDEgL19RICAgITdAICAqQEAgICAgIiQwICAjQCAgCi1NIDcoICAiSCogICAgIDEkICAgWCAgICYiICAgSiMgICAgIDAxICAgLiAgICFCQCAgKkEgICAgICgkMCAgCi1NI0AgICA5WCAgITMwICAgIEYhKCAgICAgICAmRSAgIEkqICAgICAwQSAgICsgICAhSzAgICU2ICAgICBACi1NJEAgICIgICAgO0QgICJIOCAgICAhISQgICBYICAgJy4gICA1TCAgICAiIDIgICAoICAgIVhQICAqQVAgCi1NICAgJCQwICAjQCAgID8kICAiRlwgICAgICEkIF9fJCAgICdYICAgNDwgICAgIiAyICAgKCAgICIhMCAgCi1NKkIgICAgICgkMCAgI0AgICBBSCAgIkhIICAgICEhJCAgIFggICAoUSAgIDRaICAgICIgMiAgICggICAiCi1NLyAgICpCUCAgICAiJDAgICNAICAgREwgICE3OCAgICAoISggICBAICAgKTggICA3PCAgICAgIDIgICAgCi1NICAgIjcwICAqQyAgICAgKCQwICAjQCAgIEcsICAiSFggICAgISEkICAgWCAgIClaICAgSi8gICAgICgxCi1NICAgLiAgICJAQCAgKkQgICAgICQkMCAgI0AgICBJJCAgIkkkICAgICAxJCAgIFggICAqPyAgIEoyICAgCi1NICAwMSAgIC4gICAiS1AgICpEUCAgICAkJDAgICNAICAgS1QgICJJMCAgICAhISQgICBYICAgKzQgICA5Ci1NJCAgICAgMDEgICAqICAgIlgwICAkXUAgICAgICRAICAiICAgIE5EICAiSTQgICAgISEkICAgWCAgICtYCi1NICAgSjYgICAgIDAxICAgLiAgICMkICAgKkVQICAgICgkMCAgI0AgICBSLCAgIThAICAgICAhKCAgICAgCi1NICAsTSAgIEo5ICAgICAwMSAgIC4gICAjMEAgICpGQCAgICAkJDAgICNAICAgVEQgICJEUCAgICAgISQgCi1NX18kICAgLT8gICBKOyAgICAgMDEgICAuICAgIz1AICAqRyAgICAgJCQwICAjQCAgIFg8ICAiREQgICAgCi1NISEkICAgTCAgIC45ICAgSj4gICAgIUAxICAgLiAgICNIUCAgKkkgICAgIDgkMCAgI0AgICBaVCAgIkpICi1NICAgICBBJCAgIFggICAuWiAgIEpLICAgICAwMSAgIC4gICAjUkAgICpLICAgICAkJDAgICNAICAgXiAgCi1NICE4ICAgICAoISggICBAICAgL04gICA1JCAgICAiIDIgICAoICAgJCAgICAqNFAgICAgICQwI19cMCAgCi1NISBEICAiSlQgICAgIiEkICAgWCAgIDA3ICAgSk8gICAgIDAxICAgLiAgICQpUCAgJThAICAgIEAkQCAgCi1NIiAgICEjSCAgIksgICAgICEhJCAgIFggICAxMCAgIEpRICAgICBAMSAgIC4gICAkNzAgICRLICAgICAgCi1NJEAgICFAICAhJiwgICJLLCAgICAgMSQgICBYICAgMUogICBKVCAgICAgMDEgICAuICAgJDxAICAlJEAgCi1NICAgQCRAICAiICAgISg8ICAiSzggICAgRCEkICAgWCAgIDIuICAgSzogICAgIDAxICAgLiAgICRGICAgCi1NJSlAICAgIEAkQCAgIiAgICEqUCAgIk1QICAgICIhJCAgIFggICAyVSAgIEs+ICAgICBAMSAgIC4gICAkCi1NTzAgICUzQCAgICBAJEAgICIgIUc5JilNOTAhQzxHMFErRywgOFcpVDoyWVMgJzlBOyc1RTxSVTg9IllDCi1NICY9RDhGVUUrRiwgPFZBPzkmJVQ4MllDICYtUj0mWE48UCFWN1c1TjxWRUc7RjVEN1ZFTj0gIVY3Vy1JCi1NOVZZRTklXUk7RzAgPUVdQzomJVI3VjlVO0YsIDdWOUk7RkQgPUVdVTtHLUk5VllFOSVdQzomJVI3ViVSCi1NPEYlWSAmVUE6NlggPUVdUzo2PU45NjE/OyZdTjlQIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUCi1NOTcoIDdWLUw5NiVOPTcgIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/PTZZUzo2PU45NjE/Ci1NPFZBTzxHMT85RzVOOFAhVjdWMU89NilMOTAhVjdWRU49ICE/PFcxQTxHMCA7Rl1OPCcpSTs2JVI+MCE/Ci1NOTZZVjo3KU87QCFWN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VkVOPSVdQTxHKUE+MCFQCi1NPEZFTTg3KVkgJzk/PFZFRztGNUQ3Vi1IODcpPzlHNU44UCFWN1YxTz02KUw5NV1BPEcpQT4wIT85NzFFCi1NPicwID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vi1IODcoID1FXUY7Jl1BCi1NPSAhVjdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAmJVQ5N0FJPSAhRTtHOUk8Rl1OICc5PzsmXU45VV1GCi1NPTZZQyAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDCi1NICc5Pzo2WVQ3VyFPOjZZVDk3KCA3VjVEODcxQSAnOT88VkFPPEcxPzlHNU44UCFWN1c1TjxWRUc7RjVECi1NN1ZFTj0lXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJzk/OjZZVDdWOVU7RiwgCi1NPUVdUzo2PU45NjE/PFZBTzxHMCA9RV1GOyZdQT0lXUY9NllDICY1WDo3MCA9RV1VO0ctSTlWWUU5JV1MCi1NO1ZZRzdWJVI8RiVZICc5PzsmXU45UCFWN1ctSDtXKVQgJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT88VkVHCi1NO0Y1RDdWLUg4NyggPUVdVTtHLUk5VllFOSVdTDtWWUcgJzk/PFZBTzxHMT84NylSODdEID1FXVU7Ry1JCi1NOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCE/OyZFQjdXOUU8Ry1JO1ZYIDdWVUM7VzVOPSAhVjdWLUg4Nyk/Ci1NPCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUk7RzE/Ci1NODcpUjg3RCA3VV1GPCctVDg3KVQgJzk/PFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICctPzsmRU46UCE/Ci1NMVRRLzBEJSw3VF0mMUUtJTUlXTQwNCksMTVcID1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCFWCi1NN1YxTz02KUw5NV1QO1ZFTj0mNVIgJV0/OyZdTjlWMU89NilMOTVdVTxWNUQgJzk/PFcxUj02LVQsMCFWCi1NN1ctVDxHNUM9IyggPUVdQzomJVI3ViVSPEYlWSAnOT85RlFPODcxPzwmXUk7RzFFPEAhVjdXLUk5VllFCi1NOSVdTDtWWUc3VyFPOjZZVDk3KCA9RV1EO1c1QjsmNT85RzVOOFAhVjdXLUk5VllFOSVdSTtHMT85RzVOCi1NOFAhPzElRS4wNFUpMFAhVjdWOUw7ViVUN1YlUjxGJVkgJzk/PFZBTzxHMT88Jl1JO0cxRTxAIVY3Vy1JCi1NOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICc5PzsmXU45VV1BCi1NPEcpQT4wIT86NllJPSAhVjdWLUg4NyggOFZRVTtGTUU8QCFWN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOCi1NOFAhVTdWUUk7RkwgPFchTzxHMVM4ViVSICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsID1FXVU7RkVPCi1NO0MoID1FXVU7RkVPO0AhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQyAgIE46NllUOTcpUCAiWUg4Ny1ICi1NICJZRD42WVM+NlQgK0YxWTtHLVQ8QCBOPEY1TDgyWVA7JzAgK0ZFTjo3MCArRyFMPSAgTj0mNVg9ICBOCi1NOUZFTjowIE48Rl1EODcxQSAiWUQ4NzFBICJZRztXMCArRjFZO0YlTTo2LCArRilTPFAgTjxXRU09JiVCCi1NICJZUz0nKVQ4NiggK0ctSDxXMVI9JiVCICJZQztWVU05NllUICJZRDk2KVU5UCBOOyZFTjkwIEQyJjVBCi1NOSY1Ui5CIE88Il0yMFUsTz03MUk7IyhNLEJYUStXNVM8Ql1TPEYsTzsmRUIrVlFJOEYsTzozQFYsIl1DCi1NPFc0TzhXKVQsMllTKyc4QCxCWFEoI0RSK1MgVStTJFQoIyBXLkMkVi5DKFAoJjFBPUZFRDtWOUYoJDVYCi1NPCIgRCAkIEgoUkUmNSVAQCxCWFErQyBOLDIhUzhWMUUuQl1VPFcoTzhWLVMrVlFJOEJdQzxHMFErRlwgCi1NKSRBRTg2MUU8Q0hAK1cgTzRELTMrVzVUOjZQUiszKE4sMl1VPFcoTzxXKUMrVlFJOEJdTDo2KUMrVkRYCi1NLUMgTzhXLVUrVi1SPSZETjxSUVYoIyhOLDIgWSxCXFAtMlxRLSIgUC1TSFEtQ0hSLDIhRDg3OUk5Jl1GCi1NOUIhJT4nIEApICEgKiIsSTFFMTgoIyhOLDJYUCtDJEA8Vi1EOTNITz03LVIrVi1DPFJdTDo2KE84VylUCi1NOjJZTyAiMSg5NiVEOTcoWigiXVArVSkjNFJdVT0mRUwsQlRSK0MkTz03LVIrVy1SOFJdTDo2KE87JkVCCi1NOFJdUDtXKVQrVj1FO0JdVjg2UVU5NyxNNicwTjhSUVYoIyhOLDIgWSxCXFAtMlxRLSIgUC1TSFItU0hQCi1NLEIhRDg3OUk5Jl1GOUIhJT4nIEApICBEMiY1QTkmNVIuQiBPPCJdMjBVLE89NzFJOyMoTSxCWFErVzVTCi1NPEJdUzxGLE87JkVCK1ZRSThGLE86NllDK1ctWTtGXU4+NlVTK0ZATD1CIFIrQyRALjMoTywjNE8sMzBACi1NLCM8WixDKFosM0RAOSYlVjo2MU85RjhAMTdBUCgiMCApJEFFODYxRTxDSEArVyBPNEQtMytXNVQ6NlBSCi1NKzMoTiwyXVU8VyhPPFcpQytWQUU4NjBPOzYlVDoiWUgrJzhALEJYUSgjRFIrUyBVK1MkVCgjIFcuQyRSCi1NLkM0VygmMUE9RkVEO1Y5RigkNVg8IiBEICYlQztWVVAuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZCi1NICYlUy5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWCtTQFkgJCBIKFJFJjUlQEAsQlhRK0MgTiwyIVM4VjFFCi1NLkJdVTxXKE84Vi1TK1ZRSThCXVY4NlFVOTcsTTYnME47UCFBOFZdTTwjSEAqJS0jMSQ0SSgjNE4sIiBRCi1NLEJcUC4iXFguMCFBPFNIQColLSMxJDRJKCM0TiwiIFEsQlxQLiJcWC4wIEQyJjVBOSY1Ui5CIE88Il0yCi1NMFUsTz03MUk7IyhNLEJYUStXNVM8Ql1TPEYsTzsmRUIrVlFJOEYsTzozQFYsIl1HOTZYTzxWQT85JiVUCi1NODJZQysnOEAsQlhRKCNEUitTIFUrUyRUKCMgVy5DJFcuQzRUKCYxQT1GRUQ7VjlGKCQ1WDwiIEQgJiVDCi1NO1ZVUC5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWCtTQFkgJiVTLkIgSDRULSQxMkRALTJYUCgjJFIrUyBYCi1NK1NAWSAkIEgoUkUmNSVAQCxCWFErQyBOLDIhUzhWMUUuQl1VPFcoTzhWLVMrVlFJOEJdTDo2KUMrRy1PCi1NICIxKDk2JUQ5NyhaKCJdUCtVKSM0Ul1VPSZFTCxCVFIrQyRPPTctUitXLVI4Ul1MOjYoTzsmRUI4Ul1JCi1NLiM4UCtWLVM9Ml1DPEcxTitHLEw9QiBSK0MkQC4zKE8sIzRPLDMwQCwjPFosMzhaLEMoQDkmJVY6NjFPCi1NOUY4QDE3QVAoIjAgMCJAQyo0OTQ2IiBSK0MkTiwiWFEoJy1DOSY0WitXNVM8Ql1DOFcsTzsmRUIrVi1SCi1NPSZYTjtQIEA7JjBALkIgSDRULSQxMkRALTJYUCgjJFIrUyBYK1NAWSAgICAgIlggJDAgMiAgIDY8ICBYCi1NOVYxQjs2NE44UCAhLUAgICAgJCEkMCAgJF8gISgwICAmMCAhIUAgICAgICAgICA9ICEsICRAICAgNFggCi1NLicxPzxXMVI9Ni1UICAiViAgICAmICAgICJIICMwIDIgICAgPTAgWD1FXUM6JiVSN1ZVRTs2KUU8QCAgCi1NNTAgISAiLCAhQDAgICAgICFQICAgIkwgIzAgMiAgICBIICBYPUVdUzomXVI9JV1NOTZVQjk3KCAgJTQgCi1NISAgQyAgOCQgICAgIEA8ICAgIEkgIFQgJEAgICAsRCAuJzk/OjZZVDdWVUU7NilFPEAgIDUwICcgIiwgCi1NIUAwICAgICQhUCAgICJIICMwIDIgICAgXFAgWD1FXUw7VllHN1ZVRTs2KUU8QCAgNTAgKiAiLCAhQDAgCi1NICAgKCFQICAgIkwgIzAgMiAgICEnQCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAgJTQgI0AgQyAgOCQgICAgCi1NIyA8ICAgIEwgIFQgJEAgICA0SCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICA1MCAvICIsICFAMCAgICAwCi1NIVAgICAgMCAgICA7ICEsICRAICAgRlAgLiJYUDlGJUs5MCAgTUAgICAhQCAgICBKICBUICRAICAgOSwgCi1NLic5PzhWQUE8RV1NOTZVQjk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICA7WCAuJzk/Ci1NPFZBTzxHMT87NjVNOEY1UiAgITUgIDAgKFAgJiEgICAgICgnICAgICowIC0gISggICAnRyAjQVY3VkVOCi1NPSVdTTk2VUI5NyggICU0ICFQIEMgIDgkICAgICEgPCAgICBKICBUICRAICAgQSQgLic5PzsmXU45VV1NCi1NOTZVQjk3KCAgJTQgIkAgQyAgOCQgICAgIiA8ICAgIEsgIFQgJEAgICBDUCAuJzk/OUZRTzg3MT87NjVNCi1NOEY1UiAgITUgIFggKFAgJiEgICAgIFAnICAgICsgIC0gISggICApSCAjQVY3VjFPPTYpTDk1XU05NlVCCi1NOTcoICAlNCAjUCBDICA4JCAgICAkIDwgICAgJCAgICAnICA3ICEoICAgLisgI0FUN1c1Tjo2XU4gICJWCi1NICAgICIgICAgIkggIzAgMiAgICJMQCBYPUVdQzomJVI3VlVFOzYpRTxAICA1MCAhICIsICFAMCAgICAgCi1NIVAgICAiTCAjMCAyICAgIlcwIFg9RV1TOiZdUj0lXU05NlVCOTcoICAlNCAhICBDICA4JCAgICAgIDwgCi1NICAgSSAgVCAkQCAgIFA4IC4nOT86NllUN1ZVRTs2KUU8QCAgNTAgJyAiLCAhQDAgICAgICFQICAgIkggCi1NIzAgMiAgICMsICBYPUVdTDtWWUc3VlVFOzYpRTxAICA1MCAqICIsICFAMCAgICAgIVAgICAiTCAjMCAyCi1NICAgIzZQIFg9RV1GOyZdQT0lXU05NlVCOTcoICAlNCAjQCBDICA4JCAgICAgIDwgICAgTCAgVCAkQCAgCi1NIFg8IC4nOT85Jl1VOEZRRTdWVUU7NilFPEAgIDUwIC8gIiwgIUAwICAgICAhUCAgICAwICAgIDsgITwgCi1NJEAgICEqRCAuIlhROUYlSzkwICBNQCAgICBAICAgIEogIFQgJEAgICBdICAuJzk/OFZBQTxFXU05NlVCCi1NOTcoICAlNCAgMCBDICA4JCAgICAgIDwgICAgSyAgVCAkQCAgIF9MIC4nOT88VkFPPEcxPzs2NU04RjVSCi1NICAhNSAgMCAoUCAmISAgICAgICcgICAgKjAgLSAhKCAgIDBEICNBVjdWRU49JV1NOTZVQjk3KCAgJTQgCi1NIVAgQyAgOCQgICAgICA8ICAgIEogIFQgJEAgICEkWCAuJzk/OyZdTjlVXU05NlVCOTcoICAlNCAiQCBDCi1NICA4JCAgICAgIDwgICAgSyAgVCAkQCAgISdEIC4nOT85RlFPODcxPzs2NU04RjVSICAhNSAgWCAoUCAmCi1NISAgICAgICcgICAgKyAgLSAhKCAgIDJFICNBVjdWMU89NilMOTVdTTk2VUI5NyggICU0ICNQIEMgIDgkCi1NICAgICAgPCAgICAkICAgICpAICYgISggICAzNyAjQVY3Vi1IODcpPzlHNU44UCAgNTAgISAxJCAgIS9YCi1NIDIkICAhMDggICAgISAgICAjJCAhQCAyICAgJSMgIFg9RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgICE1Ci1NICAoISQwICAlIiAhKDAgICUkICAgICAkICAgICxQICYgISggICA1IyAjQVY3VzVOPFZFRztGNUQ3Vi1ICi1NODcpPzlHNU44UCAgNTAgIyAxJCAgITEoIDIkICAhMUggICAgISAgICAiTCAhQCAyICAgJTxAIFg9RV1TCi1NOiZdUj0lXUY9NllDICAhNSAgMCEkMCAgJScgISgwICAlKSAgICAgJCAgICAsQCAmICEoICAgNkggI0FWCi1NN1ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICAhNSAgNCEkMCAgJSlAISgwICAlK0AgICAgJCAgICAtICAmCi1NICEoICAgN0AgI0FWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsICAlNCAhQCQxICAgNFAgJEEgICA0Ci1NWCAgICAgMCAgICBJICA4ICRAICAhQFQgLic5Pzo2WVQ3VjlVO0YsICAlNCAhUCQxICAgNFogJEEgICA1Ci1NIiAgICAgMCAgICBQICA4ICRAICAhRCQgLic5PzxWRUc7RjVEN1ZFTj0lXUY9NllDICAhNSAgQCEkMCAgCi1NJTEgISgwICAlMyAgICAgJCAgICAsQCAmICEoICAgOVcgI0FWN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDCi1NICAhNSAgRCEkMCAgJTNAISgwICAlNUAgICAgJCAgICAqQCAmICEoICAgOkUgI0FWN1ZRTztGPT85RzVOCi1NOFAgIDUwICogMSQgICE1QCAyJCAgITYgICAgICEgICAgIyQgIUAgMiAgICZWQCBYPUVdUzo2PU45NjE/Ci1NOyZdTjlVXUY9NllDICAhNSAgTCEkMCAgJThAISgwICAlOkAgICAgJCAgICAsUCAmICEoICAgPDEgI0FWCi1NN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAgIDUwICwgMSQgICE2UCAyJCAgITcwICAgICEgICAgIkwgCi1NIUAgMiAgICcwICBYPUVdRjsmXUE9JV1GPTZZQyAgITUgIFghJDAgICU9QCEoMCAgJT9AICAgICQgICAgCi1NKyAgJiAhKCAgID1QICNBVjdWMU89NilMOTVdRj02WUMgICE1ICBcISQwICAlQCAhKDAgICVCICAgICAkCi1NICAgICUwIDUgISggICA+TiAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgPjogKCwgITAkICAgP0ogICAgCi1NJCAgJSAhKCAgID5KICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIV5IIEUwICAgKiwgKiAgICIgICAgICAgCi1NICAgICAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAgICA5ICEsICRAICAiJ0wgCi1NLiZRSTtGTCAgKzggICAiOCAgICApQCAtICEoICAgQEkgI0FOOTdBVCAgIiMgIDQhICAgJ1pAIEMgIDgkCi1NICAgICAgPCAgICBKICBUICRAICAiJSwgLiZRSTtGTUY9NllDICAiIyAgNCEgICAnPCAgQyAgOCQgICAgCi1NISA8ICAgIEQgIFQgJEAgICInPCAuJy1UPTY5RiAgIVIgICAnS0AgQyAgOCQgICAgIiA8ICAgICQgICAgCi1NJTAgNSAhKCAgIEJZICgsICEwJCAgID9KICAgICUwICUgISggICBCRSAoLCAhMCQgICA/SiAgICAkICAlCi1NICEoICAgQlUgJTQgIVAgICAgMCAgICBcICAkICRAICAiLzQgRTAgICAqLCAqICAgIiAgICAgICAgICAgCi1NICAgKCAgICAgICAgICAkICAgQCAgICAgICAgICBAQCA8QCAgICJYICAgIDwgITwgJEAgICI4RCAuJzFVCi1NN1ZRSTtGTCAgKzggICAiMCAgICApQCAtICEoICAgRFcgI0FOOTdBVCAgIiMgIDQhICAgJ1pAIEMgIDgkCi1NICAgICAgPCAgICBKICBUICRAICAiNiQgLiZRSTtGTUY9NllDICAiIyAgNCEgICAoPlAgQyAgOCQgICAgCi1NICA8ICAgIEQgIFQgJEAgICI4NCAuJy1UPTY5RiAgIVIgICAoTjAgQyAgOCQgICAgICA8ICAgICQgICAgCi1NLkAgJCAhKCAgIEcnICNATixGOUE6VjQgICs4ICAgICQgLywgJlAgICAgKUI7JzVFICAgICAgJUc8RjVFCi1NO0AgICAgICA8RjVEICAgICAgMCAgICBeICAwICRAICAiQEQgLiYtTzsmXVI8UCAgTUAgICAgMCBcUCA/Ci1NICAgICBHIUk7RkwgICAgICA3IVU8RyFMOTAgICAgICA+NjVMOyZdVyAgICAgIDAgICAgUiAgMCAkQCAgCi1NIkNcIC4iWFM5RiVLOTAgIE1AICAgIDAgXFAgMyAgICAgNjlPPEYwICAgICAgJi1IOTc5WSAgICAgIDAgCi1NICAgUSAgMCAkQCAgIkcwIC4mLUE8RywgICs4ICAgICQgLywgJSAgICAgJVA7VylTOFZBRSAgICAgICFCCi1NOzc8ICAgICAhICAgICMoICEgIDIgICAqSkAgWCtDMUY4Nk1FICAiViAgICAhICNTICEsICAgICE1JSk1Ci1NMTAgICAgICAxRCUsNFQ0ICAgICAhICAgICFQICVAIDIgICAqUUAgWDhGXU87JjVBO0AgIDxAICAiRzAgCi1NICAgUSAgMCAkQCAgIk9MIC4mKVY4NlFTICAiViAgICAhICNTICEsICAgICE9JylVOTAgICAgICA5RiVMCi1NPFY0ICAgICAhICAgICFUICVAIDIgICArJiAgWDhGXU87JjVBO0MoICAnKCAgIEsmICAgIDFAICQgISggCi1NICBNQiAjQU06Ny1PPEYxRTxGNUQgICJWICAgICEgI1MgIiwgICAgIz0mQVI5NjQgICAgICAnSUU8RlwgCi1NICAgICA2XU45MCAgICAgIj0nPU8gICAgICAwICAgIEMgIDggJEAgICJYRCAuJlVBOjZYICAlNCAhUCQxCi1NICAgNiogJEEgICA5ICAgICAgMCAgICBHICA8ICRAICAiWyAgLictUDtXKVQ8Vi1BPEAgIDxAICAiQ1wgCi1NKFAgJSBQICAqVkAgICAgRSAgPCAkQCAgIl00IC4mLUw9NllLOTcoICAnKCAgIEgpICIsICEwLCAgIkswCi1NICAgICogICcgISggICBPXSAjQU47VllQPEZFTTg3KVkgICFSICAgKVFQIEMgIDQjICAgSVkgICAgIjQgCi1NIVAgMiAgICwoQCBYPCcpSTs2JVI+MCAgPEAgICI4RCAoUCAlIFAgICo/MCAgICBEICA8ICRAICAjJDggCi1NLic1PzsmRU46UCAgPEAgICIvNCAoUCAlIFAgICpNQCAgICBHICA8ICRAICAjJlQgLictPzsmRU46UCAgCi1NQFAgJSAwICAhXkggKFAgJSBQICAqRkAgICAgRiAgPCAkQCAgIyksIC4nOT89NllJO1ZYUiAgIVIgICAjCi1NQlAgQyAgNCMgICBLPCAgICAiNCAhUCAyICAgLE4gIFg9RV1VO0ZFTztAICA8QCAgIEZQIChQICUgUCAgCi1NKldAICAgIEcgIDwgJEAgICMtXCAuJzk/PFcxUj02LVQsQCAgPEAgICA0WCAoUCAlIFAgICpJICAgICBHCi1NICA8ICRAICAjMDggLic5PzxXMVI9Ni1ULDAgIDxAICAgIlggKFAgJSBQICAqR0AgICAgTyAgPCAkQCAgCi1NIzM0IC4nOT85Jl1VOEZRRTdXIU86NllUOTcoICAmLCAgUCQgI1AgQyAgNCMgICBKPCAgICAiWCAhUCAyCi1NICAgLThQIFg9RV1GOyZdQT0lXVA7VkVOPSY1UiAgIUMgICwhICBYIChQICUgUCAgKkpQICAgIFYgIDwgCi1NJEAgICM5RCAuJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAgIUMgICwhICBQIChQICUgUCAgCi1NKj5AICAgIFQgIDwgJEAgICM8VCAuJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAgIDhQICMgMCArCi1NICIsICEwLCAgIkpQICAgICswICcgISggICBXWiAjQVY3VlFPO0Y9PzwmXUk7RzFFPEAgIDhQICMgMCAqCi1NICIsICEwLCAgIkkgICAgIC0wICcgISggICBYTyAjQVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSCi1NICAhQyAgLCEgIEQgKFAgJSBQICAqQkAgICAgUyAgPCAkQCAgI0YoIC4nOT88VkVHO0Y1RDdWRU49JV1QCi1NO1ZFTj0mNVIgICFDICAsISAgQCAoUCAlIFAgICpGMCAgICBMICA8ICRAICAjSFggLic5Pzo2WVQ3VyFPCi1NOjZZVDk3KCAgJiwgIFAkICFQIEMgIDQjICAgSicgICAgIzwgIVAgMiAgIC5RMCBYPUVdVTtHLUk5VllFCi1NOSVdUzomXVI9JV1QO1ZFTj0mNVIgICFDICAsISAgOCAoUCAlIFAgICo9ICAgICBVICA8ICRAICAjT0ggCi1NLic5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCAgJiwgIFAkICEwIEMgIDQjICAgSjsgICAgIlggCi1NIVAgMiAgIC8qICBYPUVdUzomXVI9JV1QO1ZFTj0mNVIgICFDICAsISAgMCAoUCAlIFAgICpLUCAgICBWCi1NICA8ICRAICAjVVggLic5Pz02WVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgICFDICAsISAgLCAoUCAlCi1NIFAgICpFQCAgICBUICA8ICRAICAjWSggLic5PzxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAICA4UCAjCi1NIDAgIiAiLCAhMCwgICJLICAgICArMCAnICEoICAgXl8gI0FWN1YtSDg3KT88Jl1JO0cxRTxAICA4UCAjCi1NIDAgISAiLCAhMCwgICJJNCAgICApICAhICEoICAgX0MgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgCi1NNTAgLyAgICArICAnICEoICAhIC8gI0FWN1YxTz02KUw5NV1BPEcpQT4wICA8QCAgI1tcIChQICUgUCAgCi1NKj9AICAgIEQgICQgJEAgICQjLCBFMCAgICosICQgICAiICAgICAgICAgICEiICE1ICBYICAgIEsgIDwgCi1NJEAgICQlWCAuJzk/OUZRTzg3MT84NylSODdEICAnKCAgISAvICIsICEwLCAgIkpUICAgICkgICEgISggCi1NICEiIiApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAsICAgICxQICcgISggICEiVSAjQVY3VzVOCi1NPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgICcoICAhIT4gIiwgITAsICAiSFAgICAgKSAgISAhKCAgISM5Ci1NICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICsgICAgLDAgJyAhKCAgISQqICNBVjdXLUk5VllFCi1NOSVdTDtWWUc3ViVSPEYlWSAgIVIgICAwTTAgQyAgNCMgICBKJCAgICAiMCAgMCAyICAgMStAIjUgICAgCi1NSFAgMCAgICggICAgICAgICAgJCggJTQgIkAgICAiSCAhUCAyICAgMTYgIFg9RV1MO1ZZRzdWJVI8RiVZCi1NICAhUiAgIDEiQCBDICA0IyAgIEpRICAgICIwICAwIDIgICAxPyAiNSAgICBIUCAwICAgKCAgICAgICAgCi1NICAkKCAlNCAiMCAgICMoICFQIDIgICAxS0AgWD1FXVU7Ry1JOVZZRTklXUk7RzE/ODcpUjg3RCAgJyggCi1NICElOCAiLCAhMCwgICJIQCAgICApICAhICEoICAhJzIgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgCi1NNTAgKCAgICAsICAnICEoICAhKCIgI0FWN1ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgICcoICAhJk4gIiwgCi1NITAsICAiSTwgICAgKSAgISAhKCAgIShGICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICcgICAgCi1NKjAgJyAhKCAgISkvICNBVjdWRU49JV1BPEcpQT4wICA8QCAgJEAoIChQICUgUCAgKj5QICAgIEQgICQgCi1NJEAgICRHLCBFMCAgICosICQgICAiICAgICAgICAgICEiICE1ICA4ICAgIFQgIDwgJEAgICRKPCAuJzk/Ci1NPTZZUzo2PU45NjE/PFZBTzxHMT84NylSODdEICAnKCAgISkvICIsICEwLCAgIkkwICAgICkgICEgISggCi1NICErKyApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAlICAgICxAICcgISggICErXSAjQVY3Vy1JCi1NOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCAgPEAgICRKPCAoUCAlIFAgICpBQCAgICBEICAkICRAICAkUiQgCi1NRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgMCAgICBLICA8ICRAICAkVFAgLic5PzxWQU88RzE/Ci1NODcpUjg3RCAgJyggICErXSAiLCAhMCwgICJJLCAgICApICAhICEoICAhLVAgKTQgICAiQyAhICAgIEAgCi1NICAgICAgICAgMEAgNTAgIyAgICAsUCAnICEoICAhLkMgI0FWN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSCi1NODdEICAnKCAgIS0sICIsICEwLCAgIkcoICAgICkgICEgISggICEvJyApNCAgICJDICEgICAgQCAgICAgCi1NICAgICAwQCA1MCAiICAgICwwICcgISggICEvWCAjQVY3Vy1JOVZZRTklXUM6JiVSN1YlUjxGJVkgICFSCi1NICAgM0hQIEMgIDQjICAgSiIgICAgIjAgIDAgMiAgIDQnICI1ICAgIEhQIDAgICAoICAgICAgICAgICQoCi1NICU0ICAwICAgIkggIVAgMiAgIDQxQCBYPUVdQzomJVI3ViVSPEYlWSAgIVIgICAzXiAgQyAgNCMgICBKCi1NSiAgICAiMCAhUCAyICAgNDpAIFg9RV1EO1c1QjsmNCAgJTQgI1AgQyAgNCMgICBJViAgICAiLCAhUCAyCi1NICAgNEMwIFg9RV1GOyZdQT0gICA1MCAuICIsICEwLCAgIkgsICAgICpQICcgISggICEyWCAjQVY3VzVOCi1NPFZFRztGNUQ3VlFPO0Y8ICAlNCAjICBDICA0IyAgIEoyICAgICJEICFQIDIgICA0WDAgWD1FXVM6Nj1OCi1NOTYxPzsmXU45UCAgNTAgKyAiLCAhMCwgICJHLCAgICAoQCAnICEoICAhNCMgI0FWN1ZRTztGPCAgJTQgCi1NIkAgQyAgNCMgICBKLiAgICAiSCAhUCAyICAgNSswIFg9RV1VO0ctSTlWWUU5JV1JO0cwICAlNCAiMCBDCi1NICA0IyAgIElQICAgICJAICFQIDIgICA1NTAgWD1FXVM6Nj1OOTYxPzo2WVQgICE1ICBAIChQICUgUCAgCi1NKjwwICAgIEEgIDwgJEAgICU3OCAuJzk/OjZZVCAgITUgIDwgKFAgJSBQICAqPiAgICAgTCAgPCAkQCAgCi1NJTooIC4nOT89NllTOjY9Tjk2MT88VkFPPEcwICAlNCAhQCBDICA0IyAgIElVICAgICJIICFQIDIgICA1Ci1NUyAgWD1FXVM6Nj1OOTYxPzxWQU88RzAgICU0ICEwIEMgIDQjICAgSisgICAgIiwgIVAgMiAgIDVbUCBYCi1NPUVdUzomXVI9ICAgNTAgJCAiLCAhMCwgICJIXCAgICAqUCAnICEoICAhODogI0FWN1c1TjxWRUc7RjVECi1NN1YtSDg3KCAgJTQgIFAgQyAgNCMgICBKIkAgICAiRCAhUCAyICAgNjBQIFg9RV1TOjY9Tjk2MT84VkFBCi1NPEAgIDUwICIgIiwgITAsICAiSSQgICAgKEAgJyAhKCAgITlFICNBVjdWLUg4NyggICU0ICAwIEMgIDQjCi1NICAgSlMgICAgIDAgICAgJyAgICAgICAiREAgICRfICAgICFZX19cICAgICggICAgPk9fXyAgICAsICAgCi1NICdPX19QICAgJUAgICAhXV9fXCAgICIgICAgID9PX18gICAgSiAgICAnX19fUCAgIC0gICAgIiFfX1wgCi1NICAjWCAgICBAT19fICAgISggICAgKC9fX1AgICA0QCAgICIlX19cICAgJVAgICAgQU9fXyAgICFGICAgCi1NICg/X19QICAgPCAgICAiKV9fXCAgICdIICAgIEJPX18gICAiJCAgICArK19fUCAgIENAICAgIlVfX1wgCi1NICApJCAgICBNT19fICAgIjMgICAgKz9fX1AgICBFQCAgICJZX19cICAgKUQgICAgTk9fXyAgICI8ICAgCi1NICtPX19QICAgR1AgICAiXV9fXCAgICooICAgIE9PX18gICAiRSAgICArX19fUCAgIEogICAgIyFfX1wgCi1NICAqTCAgICBQT19fICAgIk4gICAgLC9fX1AgICBMMCAgICMlX19cICAgKzAgICAgUU9fXyAgICJYICAgCi1NICxHX19QICAgTyAgICAjKl9fXCAgICwgICAgIFJfX18gICAjJCAgICAsV19fUCAgIFIgICAgIy5fX1wgCi1NICAsUCAgICBTX19fICAgIzAgICAgLSdfX1AgICBVICAgICMyX19cICAgLUAgICAgVF9fXyAgICM8ICAgCi1NIC03X19QICAgWCAgICAjNl9fXCAgIC4wICAgIFVfX18gICAjSCAgICAtR19fUCAgIFsgICAgIzpfX1wgCi1NICAvICAgICBXL19fICAgI1QgICAgLVdfX1AgICBeICAgICM+X19cICAgL1AgICAgWC9fXyAgICQgICAgCi1NIC4nX19QICAhISAgICAjQl9fXCAgIDBAICAgIFkvX18gICAkLCAgICAuN19fUCAgISQgICAgI0ZfX1wgCi1NICAxMCAgICBaL19fICAgJDggICAgLkdfX1AgICEnICAgICNKX19cICAgMiAgICAgWy9fXyAgICREICAgCi1NIC5XX19QICAhKiAgICAjT19fXCAgIDJQICAgIFwvX18gICAkTyAgICAvJ19fUCAgISxAICAgI1JfX1wgCi1NICAzNCAgICBdL19fICAgJFggICAgLztfX1AgICEvICAgICNXX19cICAgM1AgICAgIC9fXyAgICUkICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQgCi1NICAgISAgICAgQCAgJC0wICAgIzQgICAgJFAgICAgICAgICAgICAgICAwICAgICAgICAgKSAgICAhMCAgCi1NICAoICAhI0ggICAgWiAgICAkQCAgICAjICAgICAgICAgIDAgICAgJCAgICAjUCAgICBMICAgICIgICAxCi1NLCAgICAzICAgICMwICAgICEgICAgICggICAgJCAgICAkICAgICE8ICAgICMgICAgIEAgICRAICAgICggCi1NICAgID5QICAgICAgICAgICAgICAgMCAgICAgICAgID8gICAgISAgICAgKCAgISlcICAgIj8gICAgIyAgCi1NICAgIyAgICAhUCAgICAwICAgICwgICAgKjAgICAgUCAgICAmICAgMkwgICAgSyAgICAgMCAgICAgICAgCi1NICAgICAgIDAgICAgIiAgICAiXCAgICAsICAgICFAICAkTCAgICArICAgICBAICAgICAgICAgICAgICAgCi1NJCAgICAgQCAgICBUICAgICMgICAgIDggICEtICAgICMwICAgITwgICAgICAgICAgICAgICAhICAgICAoCi1NICAgIC5AICAgIFAgICAgJiAgIDkgICAgIjAgICAgIDAgICAgICAgICAgICAgICAwICAgICIgICAgJCAgCi1NICAgISAgICAgQCAgJjEgICAgRDAgICAgJSAgICAgICAgICAgICAgICIgICAgICAgICAhKCAgICAgMCAgCi1NICAsICAiREQgICApKSAgICAgQCAgICAgICAgICAgICAgIDAgICAgICAgICAzQCAgICAkICAgICMgICBJCi1NLCAgICIzICAgICA8ICAgICAgICAgICAgICAgMCAgICAhICAgICUsICAgICYgICAgIFAgICo0UCAgIEUsCi1NICAgIDwgICAgIDAgICAgICAgICAhICAgICBAICAgITwgICAgIiAgICAgLCAgIkcgICAgKVAgICAgPCAgCi1NICAgICAgICAgICAgICBAICAgICAgICAgODAgICAgKCAgICAgICAgICAgICAiPCAgICA8ICAgICAkICAgCi1NICFQICAgICQgICAgJCAgICAmRCAgICAjICAgICAgICAgICAgICEjICAgICRUMCAgICAgICAgICAgICAgCi1NIDAgICAgICAgICFRICAgICBQICAgICAgICAgICAgIDVEMCAgICkkICAgICAgICAgICAgICAgJCAgICAgCi1NICAgID5QICAgICQgICAgICAgICAgICAgJUIoICAgME4gICAgICAgICAgICAgICAhICAgICAgICAgKDAgCi1NICAgISAgICAgICAgICAgICAhSTAgICA2PCAgICAgICAgICAgICAgICEgICAgICAgICAiKyAgICAgMCAgCi0+ICAgICAgICAgICBQUCAgICBJKCAgICAgICAgICAgICAgICQgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dC51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5NWZjMC4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dC51CisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLWJlZ2luIDc3NyBtNjhrLWFvdXQKLU0gICAhIlAgICQgICAgISAgICAgICAgICAjJEAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gJFk2X18hKFVTQiAyXlggISRHTSAgMEYzJEo8OU9SWVRWNCI2OFBDUyAgICQgME8uMCAgJCAwTyJSXDUKLU04P1wgICAlIldPUCAjIlwgOD9cICAgLS42KF0sW0NCIF9fIS43RFlVM0U4ICAkWT4zRzQgICRALiAgICAKLU0gJEM3ICAhUCAmICAgICkuN0RZVTIgWCAgICAgMi08ICAnICA4ICAgIERZPjNHNSgjQCAgICAhKFVQICAKLU08ICFAICAgIjNFWS49NEAuICAgICAkQzcgICFQICYgICAgKS43RFlVMiBYICAgICAyLTwgICcgIDggICAKLU0gRFk+M0c1KCNAICAgICEoVVAgIDwgIUAgICAiM0VZLj00QC4gICAgICRDNyAgISJAJiAgICApLjdEWVUKLU0yIFggICAgIDItPCAgJCogOCAgICBEWT4zRzUoI0AgICAgIShVUCAgMEghQCAgICIzRVkuPTRALiAgICAKLU0gJEM3ICAhIkAmICAgICkuN0RZVTIgWCAgICAgMi08ICAkKiA4ICAgIERZPjNHNSgjQCAgICAhKFVQICAKLU0wSCFAICAgIjNFWS49NEAuICAgICAkQzcgICNSICVQLzggICAgRFk+M0c1KCNAICAgICEoVVAgIFxAITwKLU0jViAgICApLjdEWVUyIFggICAgIDItPCAgJChZICAgMC0hL1wgICQgICEgViRfUCAgQCAgJCNAU18gICMKLU0gICAwLkMvXCAgMCAgISBcLF9QICEwICAkI1lQIUIvICAgIDAwJyAnKFwgICAhISQ8IEBDUCAgICQkQVAKLU0iMi8gICAgMDMnICooXCAgICEhMDwgTENQICAgJCUwQ18kKyggICAgICEhOChfUSA6MCAgICAgMDciL1wKLU0gICAgICAgICQmIDNeMCAgJCMwICAhIUQkX0QgICEgViAgIDA5QS9ZICAgMC4gICAkJkBTXjAgICQjSCAKLU0gISFMLF9EICAhIFwgICAwPCMvWSAgIDAvQCAgJCcwQ14wICAkJCAgICEhXChfRCAgISEkICAgMEEiL1kKLU0gICAwMiAgICQoUENeMCAgJCRQICAhIjQoX0QgICEhMCAgIDBHIi9ZICAgMDUgICAkKjBDXjAgICQlQCAKLU0gISJMKF9EICAhITwgICAwTSIvWSAgIDA4ICAgJCtAQ18gICAkIzAgICEjJChfUCAgISBWICAgMFIiL1wKLU0gICAwLiAgICQsUENfICAgJCNIICAhIzAoX1AgICEgXCAgIDBVIi9cICAgMC9AICAkLUBDXyAgICQkICAKLU0gISM8KF9QICAhISQgICAwWCIvXCAgIDAyICAgJC4wQ18gICAkJFAgICEjSChfUCAgISEwICAgMFsiL1wKLU0gICAwNSAgICQvIENfICAgJCVAICAhI1QoX1AgICEhPCAgIDBeJyAiKFwgICAhJzQ8IChDUCAgICQ9QVAKLU0gMi8gICAgMVgnICEoXCAgICEnPChfRCAgISRcICAgMTEjL1kgICAxKyAgICQzMS43RFlVMCJAQyo2MUIKLU0+J0FYK0csKS0yWFIoIkEiOTcpSzk2UUU+MkRALVJcUSxCXFgtMCAgMidEICAhJ0goJ0QgICEnRDNJITgKLU1DVFlSIkhRLjVAICA4P1wgICAgNitSWCAiJidfICAgICUlQi8zRVkuPTAgIDNFOCAgJFk+M0c1LjVAICAKLU08ICUuMCIvICAgIDNZJyNfM0VZLj0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICEgLCAgICAgJFlVICAhICoiLEk4VylULCJZQyIzME4tQiBIMEY1UjpWNUw5N0RJKCMsTyxTIE8KLU0uIywgICAgICAgICEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICEgMCAgJjAgICAgICAgICAiUDAgICkoICAgITQgICAgJFYwICAgICAgICE0ICAgICZYICAKLU0gICAgICAgICAgICAvOCAgICAgICAgICAgICAgM1ggICAgICAgICAgICAgIDxIICAgICAgICAgICAgICAKLU1DKCAgICAgICAgICAgICAgSVggICAgICAgICAgICAgIFE4ICAgICAgICAgICAgICBXWCAgICAgICAgICAKLU0gICAgXiggICAgICAgICAgICAgISI4ICAgICAgICAgICAgICEnKCAgICAgICAgICAgICAhKiggICAgICAKLU0gICAgICAgISxCICAgICQgICAgICAgICEvIiAgICAkICAgICAgICAhMzIgICAgJCAgICAgICAgITgiICAKLU0gICggICAgICAgICE6UiAgICAoICAgICAgICAhPzIgICAgKCAgICAgICAgIUQyICAgIDAgICAgICAgICEKLU1GQiAgICAwICAgICAgICAhSkIgICAgMCAgICAgICAgIU8iICAgIDAgICAgICAgICFRQiAgICAwICAgICAKLU0gICAhVVIgICAgMCAgICAgICAgIVpCICAgIDAgICAgICAgICFdMiAgICBAICAgICAgICAiIEIgICAgJCAKLU0gICAgICAgIicyICAgICQgICAgICAgICItMiAgICAkICAgICAgICAiNjIgICAgKCAgICAgICAgIj0yICAKLU0gICggICAgICAgICJDQiAgICAoICAgICAgICAiTFIgICAgMCAgICAgICAgIlMyICAgIDAgICAgICAgICIKLU1ZIiAgICAwICAgICAgICAjIVIgICAgMCAgICAgICAgIyYiICAgIDAgICAgICAgICMsIiAgICAwICAgICAKLU0gICAjMkIgICAgMCAgICAgICAgIzlCICAgIEAgICAgICAgICNBIiAgICAkICAgICAgICAjRkIgICAgJCAKLU0gICAgICAgI00iICAgICQgICAgICAgICNUUiAgICAoICAgICAgICAjWkIgICAgKCAgICAgICAgJCEyICAKLU0gICggICAgICAgICQpMiAgICAwICAgICAgICAkLkIgICAgMCAgICAgICAgJDRSICAgIDAgICAgICAgICQKLU08MiAgICAwICAgICAgICAkQSIgICAgMCAgICAgICAgJEdCICAgIDAgICAgICAgICROQiAgICAwICAgICAKLU0gICAkVDIgICAgQCAgICAgICAgJFpIICAgIUNfX19MJSAgICVAUiAgICFAICAgICAgICAlRDIgICAhQCAKLU0gICAgICAgJipYICAgIENfX19MJSAgICZPIiAgICBAICAgICAgICAmUiIgICAgQCAgICAgICAgJzZCMCAKLU0gICQgICAhNCAgICAgJDAgICdEICAgIT4gICAnOjIwICAgJCAgICFIICAgICAkMCAgJ0ggICAhUiAgICcKLU0/UjAgICAkICAgIVwgICAgICQwICAnTCAgICImICAgJ0VSMCAgICggICAiMCAgICAgJDAgICdUICAgIjoKLU0gICAnSVIwICAgKCAgICJEICAgICAkMCAgJ1ggICAiTiAgICdPQjAgICAoICAgIlggICAgICQwICAnXCAKLU0gICMiICAgJ1VSMCAgIDAgICAjLCAgICAgJDAgICgkICAgIzYgICAnWTIwICAgMCAgICNAICAgICAkMCAKLU0gKCggICAjSiAgICdeQjAgICAwICAgI1QgICAgICQwICAoLCAgICNeICAgKCQyMCAgIDAgICAkKCAgICAKLU0gJDAgICg0ICAgJDIgICAoKCIwICAgMCAgICQ8ICAgICAkMCAgKDggICAkRiAgICgtQjAgICAwICAgJFAKLU0gICAgICQwICAoPCAgICRaICAgKDNCMCAgIDAgICAlJCAgICAgJDAgIChEICAgJS4gICAoN0IwICAgQCAKLU0gICU6ICAgICAkMCAgKEggICAlRCAgICg8KCAgIClDX19fTCUgICAoVyIgICApQCAgICAgICAgKFlYICAKLU0gKSNfX19MJSAgICkpUiAgICkgICAgICAgICApLEIgICAgMCAgICAgICAgKTVIICAgIDNfX19MJSAgICkKLU0/MiAgICAwICAgICAgICApQyIgICAgMCAgICAgICAgKUpIICAgIDNfX19MJSAgIClRQiAgICAwICAgICAKLU0gICApVSggICAgM19fX0wlICAgKVxIICAgIDNfX19MJSAgICojSCAgICAzX19fTCUgICAqJlggICAgM18KLU1fX0wlICAgKjIiMCAgIDAgICAlUCAgICAgJDAgICsoICAgJVogICAgICQwICArLCAgICVaICAgICAkMCAKLU0gKzAgICAlWiAgICAgJDAgICs0ICAgJVogICAgICQwICArOCAgICYgICAgICAkMCAgKzwgICAmKCAgICAKLU0gJDAgICtAICAgJjAgICAgICQwICArRCAgICYwICAgICAkMCAgK0ggICAmOCAgICAgJDAgICtMICAgJkAKLU0gICAgICQwICArUCAgICZIICAgICAkMCAgK1QgICAmSCAgICAgJDAgICtYICAgJlAgICAgICQwICArXCAKLU0gICZYICAgICAkMCAgLCAgICAnICAgICAgJDAgICwkICAgJyAgICAgICQwICAsKCAgICcoICAgICAkMCAKLU0gLCwgICAnMCAgICAgJDAgICwwICAgJzggICAgICQwICAsNCAgICc4ICAgICAkMCAgLDggICAnQiAgICAKLU0gJDAgICw8ICAgJ1YgICAgICQwICAsQCAgICdWICAgICAkMCAgLEQgICAnViAgICAgJDAgICxIICAgKCAKLU0gICAgICQwICAsTCAgICgqICAgICAkMCAgLFAgICAoNCAgICAgJDAgICxUICAgKDQgICAgICQwICAsWCAKLU0gICg+ICAgICAkMCAgLFwgICAoSCAgICAgJDAgIC0gICAgKFIgICAgICQwICAtJCAgIChSICAgICAkMCAKLU0gLSggICAoXCAgICAgJDAgIC0sICAgKSYgICAgICQwICAtMCAgICkwICAgICAkMCAgLTQgICApMCAgICAKLU0gJDAgIC04ICAgKTogICAgICQwICAtPCAgIClEICAgICAkMCAgLUAgICApTiAgICAgJDAgIC1EICAgKU4KLU0gICAgICQwICAtSCAgIClYICAgICAkMCAgLUwgICAqLCAgICAgJDAgIC1QICAgKiwgICAgICQwICAtVCAKLU0gICo2ICAgICAkMCAgLVggICAqQCAgICAgJDAgIC1cICAgKkogICAgICQwICAuICAgICpKICAgICAkMCAKLU0gLiQgICAqVCAgICAgJDAgIC4oICAgKl4gICAgICQwICAuLCAgICsoICAgICAkMCAgLjAgICArKCAgICAKLU0gJDAgIC40ICAgKzIgICAgICQwICAuOCAgICs8ICAgICAkMCAgLjwgICArRiAgICAgJDAgIC5AICAgK0YKLU0gICAgICQwICAuRCAgICtQICAgICAkMCAgLkggICArWiAgICAgJDAgIC5MICAgLCQgICAgICQwICAuUCAKLU0gICwkICAgICAkMCAgLlQgICAsLiAgICAgJDAgIC5YICAgLDggICAgICQwICAuXCAgICw4ICAgICAkMCAKLU0gLyAgICAsQCAgICAgJDAgIC8kICAgLEggICAgICQwICAvKCAgICxQICAgICAkMCAgLywgICAsWCAgICAKLU0gJDAgIC8wICAgLFggICAgICQwICAvNCAgIC0iICAgICAkMCAgLzggICAtIiAgICAgJDAgIC88ICAgLSwKLU0gICAqNCAwICAvPCAgIC0wICAgKjUgMCAgICAgICAtMCAgICo3IDAgICAgICAgLiggICAqOFAwICFOKCAKLU0gIC5EICAgKjpQMCAgWTggICAuTCAgICo8UDAgIU4oICAgLlQgICAqPyA8ICE3KCAgISAkICAgKkEwNCAKLU0hMFggICAgICAgICpCUDQgIFdYICAgJVAgICAqRDA0ICBaICAgIC4oICAgKkVQNCAhQlggICAhKiAgICoKLU1IUDwgICkoICAhICggICAqSkBEICFUOCAgISBUICAgKkxARCAhXlggICEgViAgICpQMEQgISY4ICAhIFgKLU0gICAqVEBEICFZSCAgISBaICAgKlZQRCAgJFAgICEgXCAgICpaUEQgID1IICAhIF4gICAqXzBEICFfICAKLU0gISEgICAgKyEgRCAiJDAgICEhJCAgICskQEQgIUggICAhISggICArKEBEICFbRCAgISEsICAgKypARCAKLU0iJiQgICEhMCAgICsuMEQgIS1EICAhITQgICArMkBEICFMQCAgISE4ICAgKzRQRCAhNkwgICEhPCAgICsKLU03MEQgIVcsICAhIUQgICArOlBEICFFVCAgISFGICAgK0AgRCAhJkQgICEhSCAgICtFUEQgIElEICAhIUwKLU0gICArSUBEICAmVCAgISFQICAgK08gRCAhMiwgICEhVCAgICtVIEQgIU1UICAhIVwgICArWDBEICBALCAKLU0gISIkICAgK10wRCAgMEQgICEiLCAgICwiUEQgIDtMICAhIjQgICAsJjBEICAqNCAgISI8ICAgLCtARCAKLU0hVFwgICEiRCAgICwxMEQgIDxUICAhIkwgICAsNSBEICArRCAgISJUICAgLDkgRCAiJSggICEjJCAgICwKLU09IEQgIF9IICAhIyggICAsQlBEICEsQCAgISMsICAgLEkgRCAhQjggICEjMCAgICxNMEQgIUEwICAhIzQKLU0gICAsUzBEICFaUCAgISM4ICAgLFlQRCAhP0ggICEjPCAgICxdQEQgIFxYICAhI0AgICAtIyBEICIoMCAKLU0gISNEICAgLSkgRCAgSlggICEjSCAgIC0tIEQgIU8wICAhI0wgICAtMlBEICFcKCAgISNQICAgLTkgRCAKLU0gTzggICEjVCAgIC09MEQgIVQwICAhI1ggICAtQVBEICFSTCAgISNcICAgLURARCAhUlAgICEkNCAgIC0KLU1HMEQgIVw4ICAhJEwgICAtSUBEICFSICAgISRUICAgLUwgNCAgWkwgICAhNCAgIC1PMDQgIVZcICAgIUgKLU0gICAtVDA0ICFHNCAgICFcICAgLVlQNCAhOFQgICAiMCAgIC1dMDQgISc8ICAgIkQgICAuIkA0ICBILCAKLU0gICJYICAgLigwNCAhWlwgICAjLCAgIC4rMDQgIC8sICAgI0AgICAuMCA0ICEsNCAgICNUICAgLjUwNCAKLU0gLFwgICAkKCAgIC44QDQgISksICAgJDwgICAuPUA0ICBZRCAgICRQICAgLkMgNCAhMjwgICAlJCAgIC4KLU1GQDQgISlUICAgJTogICAuSjBEICFUNCAgISRcICAgLkwwRCAhWDQgICElJCAgIC5OMEQgIVxcICAhJzQKLU0gICAuUEBEICBHPCAgISc4ICAgLlNARCAhKVggICEnPCAgIC5VUEQgIE9AICAhJ0AgICAuWEBEICAyPCAKLU0gISdEICAgLlpQNCAgOkQgICAtVCAgIC5dIDQgIDswICAgLiQgICAuXzA8ICEsOCAgISBQICAgLyFQNCAKLU0gWTggICAuRCAgIC8kMDQgIU4oICAgLkwgICAvJiA0ICIhUCAgIC5UICAgLydQRCAhWTwgICEvRCAgIC8KLU0pRi1SPSMgTjtQIUc5JilNOTJZTyAmPUQ4RlVFK0YsIDo2WVQuRzBRLzcoUS5SVFIsMzBXLSNAUy1DMFgKLU0uUyhRLSM8VC4jLFYtIzxbICYtSDg3KFo9IyhdPEMoWywjTFEsQzxbICZRTztGPFo9IyxdPEMkWyszKFEKLU0tIzxULiMsVi0jQFssQyRULVMwWCxTOFQtU0wgPFZBTzxHMFo9IzBdPEMkWyszLFItUzhYLlMsUi1TOFcKLU0uUCFVO0ctSTlWWUU5IiFDOiYlUi5HMFUvNyhRLlMgWyxDNFUuUCFVO0ctSTlWWUU5IiFTOiZdUj0jSVQKLU0tQ1VSLDNMUC5TOFUtMyxVLlAhVTtHLUk5VllFOSIhTDtWWUcuRzBXLzcoUS5TIFsrMyRbICc1TjxWRUcKLU07RjVEKCZFTj0jSVQuI1VSLDNMUC5SVFEuUCFGOyZdQT0jSVQuM1VSLDNMVC5TIFsgJjFPPTYpTDkzSVQKLU0sMyBdPEMkWy4jTFAuUCFWO1ZFRC5HMFEsM1RRLDAgXy9TXFo9IyRSLzMkID1FXUM6JiVSLkQ8UiAnOT8KLU08VkVHO0Y1RDdWLUg4NyhaMVMoID1FXVU7Ry1JOVZZRTklXUM6JiVSLkQ8VSAnOT88VkFPPEcwWjFTMCAKLU09RV1TOjY9Tjk2MT88VkFPPEcwWjFTMCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0jSSctQCFWN1ZFTj0jSScKLU0sMCFWN1ctSTlWWUU5JV1JO0cwWjFTJCA9RV1VO0ctSTlWWUU5JV1JO0cwWjFTQCA9RV1MO1ZZRy5EPFEKLU0gJzk/PFZFRztGNUQ3VlFPO0Y8WjFTJCA9RV1VO0ctSTlWWUU5JV1MO1ZZRy5EPFggJzk/OUZRTzg3MFoKLU0xU0QgPUVdRDtXNUI7JjRaMVMkUCAnOT84VkFBPEVdQTxHKUE+M0knLDMsXTg3KFEuUyBbLDNMUiAnOT8KLU08VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyRTICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScKLU0sMzBdODcoUS5TIFssM0xVICc5PzxWQU88RzE/ODcpUjg3RFoxUyRVLzYlUiwzTFAuUyRbLSAhVjdXLUkKLU05VllFOSVdUzomXVI9JV1BPEcpQT4zSScsMzQgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1BPEcpQT4zSScKLU0sMzhdODcoUS5TIFssM0xWICc5Pzo2WVQ3ViVSPEYlWS5EPFEtU1VBPEMkWywjTFEuUyQgPUVdUzo2PU4KLU05NjE/OjZZVDdWJVI8RiVZLkQ8US1QIVY3VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUE+M0knLDNAXTg3KFEKLU0uUyBbLDNMWCAnOT87Jl1OOVVdQTxHKUE+M0knLDM8ID1FXVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4zSScKLU0sMzwgPUVdVTtHLUk5VllFOSVdTDtWWUc3ViVSPEYlWS5EPFEuICFWN1Y5TDtWJVQ3ViVSPEYlWS5EPFEKLU0uM1VBPEMkWywjTFEuU0QgPUVdRDtXNUI7JjU/ODcpUjg3RFoxUyhQLzYlUiwzTFAuUyRbLDMgID1FXUMKLU06JiVSN1chTzo2WVQ5NyhaMVMoUS8ySFIgJzk/PFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPENJJyxDJCAKLU09RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTKFIvMkhVICc5PzxWQU88RzE/PCZdSTtHMUUKLU08Q0knLEMsXSpDMCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPENJJyxDLCA9RV1VO0ctSTlWWUUKLU05JV1TOiZdUj0lXVA7VkVOPSY1Ui5EPFItI1RKLUAhVjdWRU49JV1QO1ZFTj0mNVIuRDxSLTNUSiwwIVYKLU03Vy1JOVZZRTklXUk7RzE/PCZdSTtHMUU8Q0knLEM0ID1FXVU7Ry1JOVZZRTklXUk7RzE/PCZdSTtHMUUKLU08Q0knLEM4XSpDQCA9RV1MO1ZZRzdXIU86NllUOTcoWjFTKFUgJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUkKLU07RzFFPENJJyxDNCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdXIU86NllUOTcoWjFTKFYgJzk/OUZRTzg3MT8KLU08Jl1JO0cxRTxDSScsQzxdKkNEID1FXUQ7VzVCOyY1PzwmXUk7RzFFPENJJyxDQF0qQyRQICcxPzxXMVIKLU09Ni1ULkUwUi4zVVMsQzFWN1YtSDg3KT87NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIKLU0uQzBMLDM4TCwzOFs9RV1JO0cxPzs2NU04RjVSLkMkTCxTKEwsUyhbPUVdTDtWWUc3VlVFOzYpRTxDSFEKLU0rIzhUKyMsUi5XOT85RlFPODcxPzs2NU04RjVSLkNETC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKLU0uQyRQKyMkUi4iUFYtI0xbICc5PzxXMVI9Ni1ULDNJJyxDRCA9RV1TPScpVThXMFIuRDxTLCNVUyxDMVYKLU03Vi1IODcpPzs2NU04RjVSLkMoTCwiUFguVzk/PFZBTzxHMT87NjVNOEY1Ui5DMEwsMzhMLDM4Wz1FXUkKLU07RzE/OzY1TThGNVIuQyRMLFMoTCxTKFs9RV1MO1ZZRzdWVUU7NilFPENIUSsjOFQrIyxSLlc5PzlGUU8KLU04NzE/OzY1TThGNVIuQ0RMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFArIyRSLiJQVi0jTFsKLU0gJzE/PTZZSTtWWFo1IyxRLzc0WD1FXUM6JiVSN1ZVRTs2KUU8Q0hSKyMgTC4jTVY3Vy1IO1cpVDdWVUUKLU07NilFPENIVCsjIEwsMzhbPUVdSTtHMT87NjVNOEY1Ui5DJEwsIlBTLENNVjdWUU87Rj0/OzY1TThGNVIKLU0uQyRMLCJQUyxDTVY3VjlMO1YlVDdWVUU7NilFPENIWSsjIEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKLU0uQyRQKyMgTC1DMFsuUCFWN1c1Tjo2XU4uRDxTLDAhVjdXNU46Nl1OLENJJyxTKF09M0FWN1YtSDg3KT8KLU07NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIuQzBMLCJQUS1DTVY3VkVOPSVdTTk2VUIKLU05NyhaLDJQUCsjLFIuVzk/OyZdTjlVXU05NlVCOTcoWiwyUFArIyxSLlc5PzlGUU84NzE/OzY1TThGNVIKLU0uQ0RMLCJQUyxDTVY3VjFPPTYpTDk1XU05NlVCOTcoWiwzIEwsIlBWLSNMWyAnOT84VkFBPEVdRj02WUMKLU0uRDhSICc5PzxWRUc7RjVEN1YtSDg3KT85RzVOOFNJJixAIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU4KLU04U0kmLTAhVjdXLUg7VylUN1Y5VTtGLFoxQzAgPUVdUzo2PU45NjE/PFZBTzxHMT85RzVOOFNJJi0gIVYKLU03VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RixaMUM4ID1FXUk7RzE/OUc1TjhTSSYsMCFWN1ctSTlWWUUKLU05JV1JO0cxPzlHNU44U0kmLDAhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQy5EOFggJzk/OyZdTjlVXUYKLU09NllDLkQ4USAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhTSSYsMCFWN1c1TjxWRUc7RjVEN1ZRTztGPT8KLU05RzVOOFNJJi4gIVY3VjlMO1YlVDdWOVU7RixaMUNEID1FXUQ7VzVCOyY1PzlHNU44U0kmLDMgIDsmRU4KLU06U0k0LFMsXTxTJFUsRllFPicwWixTMF0qQyxTKyMgTCxTKFs7JkVOOlY5VTtGLFosUzRdKkMsVi82OFMKLU0tIlBTLEJQUyxDTVM9JzVGOUNIUy1TVUE8QyRbLCNMUC5TLFgvNiVSLDNMUC5TJFssU0RdODcoUS5TIFsKLU0sQ0xSLjJQVi0iUFEsMzRSLlNMIDxVXUw6NllLLkQ8Uy0gIVQ9NV1MOjZZSy5FMFQsI1VVLDMwVDtGNVgKLU09I0hTLSJQUCsjLFIuVlFJO0ZNRj02WUMuQyxVKyMgTCxTKFs8VzFVOUY4WixTPEwsIlBRLDM0Ui5TTCAKLU09NV1MOjZZSy5EPFQsICFQPEZFTTg3KVkuRDxULDNVRTxGNUQuQyBMOVcpRTk2WFosMlFCOyc1RS5DKEwKLU0uUCFDO1ZRTzxHLFo1IzBSLzY1WTk2UUw7VzxaLCJRUD03KVA7JjRaLDJRUDo2WUsuQyhMLlAhTjtWWVAKLU08RkVNODcpWS5EPFQsQCFDOyc1TjpWNVIuRDxULFNVRThWQUU9R0RaLCJRRjtXKUQuQyRMLlAhQzg3KVMKLU0uRTBULSNVRThGVVcuQyBMPCZdUjxWLUg5M0hRKyNMIDxXIU88RzFTOFYlUi5EPFQtICFCO1ZdTDk2JU4KLU0uRzBULTNVRTFEJSw0VDRaLCJRNDRFNSUuQyRMLlAhQj1GJUw8U0k0LSM4XTk2OUE7Jy1FLkMgTD0nKVUKLU05M0hRKyNMIDhGXU87JjVBO0MoWj0jMFYgJlVJPFZdUjkmNVI5NjBaNSMwVy82NVQ9VlxaLEJRTztGNFoKLU0sMlFaOTcpTy5DIEw9JkFSOTY0WixSUFsgJlVBOjZYWjFDJCArNlFHICVdUzhWLVM6NjAgOTdBST0iWU8KLU0gJjlBOlYtVStGXCA3VjVYOjcwTjtQIUM5NylSO1coTjtQIT85NllWOjcpTztAIVM9JiVSPSAhPzs2JUkKLU07QCE/OTdBST0gIT87Nl1OOFZdTj0nKU87ICFNOFZdVTtHMCA3Vzk/OFZBQTxAIT89RV1TOjY9Tjk2MT8KLU04VkFBPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSICVdVjdXLUg7VylUICVdVjdXLUk5VllFOSVdUzomXVIKLU09ICE/PUVdVTtHLUk5VllFOSVdUzomXVI9ICE/PUVdSTtHMCA3Vzk/PFZFRztGNUQ3VkVOPSAhPz1FXVUKLU07Ry1JOVZZRTklXUk7RzAgN1c5PzsmXU45UCE/PUVdUzo2PU45NjE/OyZdTjlQIT89RV1VO0ctSTlWWUUKLU05JV1MO1ZZRyAlXVY3VjlMO1YlVCAlXVY3VjFPPTYpTDkwIT89RV1DOiYlUjdWJVI8RiVZICVdVjdXLUkKLU05VllFOSVdQzomJVI3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0QgN1c5PzxWQU8KLU08RzE/ODcpUjg3RCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdXLUgKLU07VylUN1YlUjxGJVkgJV1WN1ZFTj0lXUE8RylBPjAhPz1FXVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWSAlXVYKLU03VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUE+MCE/PUVdTDtWWUc3ViVSPEYlWSAlXVY3Vy1JOVZZRTklXUwKLU07VllHN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEIDdXOT85RlFPODcxPzg3KVIKLU04N0QgN1c5PzkmXVU4RlFFN1YlUjxGJVkgJV1WN1YtSDg3KT88Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT8KLU04VkFBPEVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCE/PUVdUzomXVIKLU09JV1QO1ZFTj0mNVIgJV1WN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQKLU03Vy1IO1cpVDdXIU86NllUOTcoIDdXOT86NllUN1chTzo2WVQ5NyggN1c5PzxWRUc7RjVEN1ZFTj0lXVAKLU07VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdWUU87Rj0/PCZdSTtHMUUKLU08QCE/PUVdUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzwmXUkKLU07RzFFPEAhPz1FXUY7Jl1BPSVdUDtWRU49JjVSICVdVjdWMU89NilMOTVdUDtWRU49JjVSICVdVjdXLVQKLU08RzVDPSMkIDdXOT88VzFSPTYtVCxAIT89RV1VO0ZFTztAIT89RV1VO0ZFTztDKCA3Vzk/OFZBQTxFXUYKLU09NllDICVdVjdXLUk5VllFOSVdQzomJVI3VjlVO0YsIDdXOT89NllTOjY9Tjk2MT84VkFBPEVdRj02WUMKLU0gJV1WN1ctSDtXKVQ3VjlVO0YsIDdXOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA3Vzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT85RzVOOFAhPz1FXUk7RzE/OUc1TjhQIT89RV1TOjY9Tjk2MT86NllUN1Y5VTtGLCAKLU03Vzk/PTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgN1c5PzsmXU45VV1GPTZZQyAlXVY3Vy1JOVZZRTklXUwKLU07VllHN1Y5VTtGLCA3Vzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDICVdVjdWOUw7ViVUN1Y5VTtGLCAKLU03Vzk/OSZdVThGUUU3VjlVO0YsIDdXLT87JkVOOlAhPz01XUw6NllLICVdUDxGRU04NylZICVdTjtWWVAKLU08RkVNODcpWSAlXUM7JzVOOlY1UiAlXVM8Jl1SPSctQzg3KCA3VV1EOEYlUjlXLCA3VV1EOEctVThGLCAKLU03VV1EOEctVThGWCA3VV1MOVVdRjsmJUcgJV0/OFZRRTg2WVU8ICE/N1Y1WDo3MCA4VjVSPEZdUiAlXUUKLU08RylOO1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSUgICAgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dDIudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0Mi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTIwOTYxLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0Mi51CisrKyAvZGV2L251bGwKQEAgLTEsMjIwOCArMCwwIEBACi1iZWdpbiA3NzcgbTY4ay1hb3V0MgotTSAwKCEiUCAgQCAgICAsICAgICAgICAgICdCMCAgIiBAICAgICAgICAgICEtXiAgICkhPSdbUCAkKEArRQotTUA0R1MmIDBDUyAgIiAgISpOMCAgKEA5RyAgICY4MCAgKkRBNDIlLE8gRFpZICAgQkYkWlkgICBDOU1bXAotTSAgUE8gJFpZICAgRjAlQi8rUCEuTjAgIClNQS41T18oMi48UCAkQVogOlEoPiAgIDInSCFCRFpaIDM7PwotTV8gICAgIEBNMC9fUDInQCAoJEFOX1xATyAkWlogM1M/XyAgICAhICxAICAgICIhRyIkJ1ogNzlAICAkVAotTSMmWCEiX18qOU8gRC8gICAnX180S09fLCBIK19fQCAgIUgoICBAICAoICswS09fMFQqW19VJEFaIDYpKAotTT4gICArUltfXCJcWiA5QE8uQCZAK1AhKD4gICAzS0ggUy1fXCAgICAmIlUgX15ATytPXywrUltfXCJcWgotTSA3QE8uQCVYK1JbX1QiICJUKltfWiJcIDNLSCBITV9cICAgICYiOCBFKltfUyJcIigiW19aLSJOX1xQTwotTSAkWlogKSM/XyAgICAgUSg+QCRCMidAICAkQVogLEUuTkAhRjQoXE0wL19MMkpbX1UmOCQ2KF1AKERBWAotTSAgIE8gIlxaIDFATy5AJDgrUltfVS06Tl9dIE8gVFpaICQzP18gICAgIVEhXk9bKCs0Q19fIlVZICAoIAotTSAvX1grN0ggOy9fVDImW19aJEFYICAkQDtPX0hUPltfVyRaMDQoXSxXUCAsM0VZLj0yIU8gIFEoPiAgJQotTTghUEA7UCA8MidAIDFWIDIoJlwgIyRBWCAkRUAiIiFPICEhKD4gICMzRCFFIERZVStRQSg0JEFYICApKAotTT4gICAyJ0AgISRZICtXUCAgICFfICAxKD4gICEzRCAgICAgICtXNVM8Ql1MOjYoTzsmME48VlwgK1YxRQotTT1CXVo5NylPICAgICAgIDg4VylULCNIQDtGXEArVzVTPEJdTDo2KE87JjBOPFZcKiAgICApNi1SPSMgWgotTSgiXVU8VyhPOyZFQitWUUQrRy1PKCZVQTwnIUk7RjxAOUYlSTsnNVI5MEggICAgICRWLVI9IyBaKCZZTwotTSgiXUQ5NzhPPkY1UjtQSCBAICAgIEggICAhKCAgICAnICAgICEwICAgICAgICRbWSAgIEVSICAgM0U4IAotTSAkKiA4ICAgIERZPjNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICQqIAotTTggICAgRFk+M0c1LjVAICAwSCFAICAgIjNFWS49NFk2ICAhIkAmICAgICkuN0RZVTNFOCAgJCogOCAgIAotTSBEWT4zRzUuNUAgIDBIIUAgICAiM0VZLj00WTYgICEiQCYgICAgKS43RFlVM0U4ICAkKiA4ICAgIERZPgotTTNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICcgIDggICAgRFk+M0c1LgotTTVAICA8ICFSICYgICAgKS43RFlVM0U4ICAmJ18gICAiMEQoWSAgKlA0IS9cICAkICBLITIkX1AgIEAgIgotTUwlMFNfICAjICAqUDVDL1wgIDAgIEshOCxfUCAhMCAiTCVJUCFCLyAgICpQNycgJyhcICAgSyFAPCBAQwotTVAgICJMJjFQIjIvICAgKlA6JyAqKFwgICBLIUw8IExDUCAgIkwnIENfJCsoICAgICBLIVQoX1EgOjAgIAotTSAgKlA+JCpZICAqUD8hL1kgICpQNCAgIkwoIDNeMCAiTCUoICBLIiIkX0QgIEshNCAgKlBBIy9ZICAqUAotTTVAICJMKEBTXjAgIkwlQCAgSyIsLF9EICBLITogICpQRCIvWSAgKlA3ICAiTClAQ14wICJMJiAgIEsiQAotTShfRCAgSyFEICAqUEoiL1kgICpQOiAgIkwrIENeMCAiTCZQICBLIlgoX0QgIEshUCAgKlBQIi9ZICAqUAotTT0gICJMLEBDXjAgIkwnQCAgSyMwKF9EICBLIVwgICpQVSIvXCAgKlA0ICAiTC4gQ18gICJMJSggIEsjRAotTShfUCAgSyE0ICAqUFoiL1wgICpQNUAgIkwuUENfICAiTCVAICBLI1AoX1AgIEshOiAgKlBdIi9cICAqUAotTTcgICJML0BDXyAgIkwmICAgSyNcKF9QICBLIUQgICpRICIvXCAgKlA6ICAiTDAwQ18gICJMJlAgIEskKAotTShfUCAgSyFQICAqUSMiL1wgICpQPSAgIkwxIENfICAiTCdAICBLJDQ8IChDUCAgIkwxQENQICAiTDFRUAotTSAyLyAgICpRKCIvICAgKlEpIi9ZICAqUSogICJMMyBTXjAgIkw8ICAgSycoM0VZLj0wICAzRTggICJcKwotTStQSSJAJCdZICAqUiMkSjA5UEE4MiUqIDJJIUZeJEogO1ExJ14wICJMQEElXFBQICglKS5EJUUqTVxJTQotTV1CMU5fX0BGO09fXDNFWS49NFk2ICAgTyJEN1kgICpSJSRKMjlQQEA2RFowMkkpRl4kKkcyJ0QgICI1IAotTTg/XCAgICNGKSZbX18kWT4zRzUuNUAgIDJLRCAgQCBcOUBJUCAyLyAgICggLyYmXDNFWS49NENHQCwhLgotTU4wICAqXEEqMCY8LDNLRCAgIk1IMy1cIyA0WVUyJ0AgLzRBWiAhOSg+ICAiM0tEICAiOy4yJ0AgOFRaWQotTSAgIEZWJFUjLUNAWC4jJEA5RlFPODcxSTtGPEA8Jl1JO0cwQDtGXVQoJiVWODZFTDg2KUw5MiBNKzIhUAotTTxGXUc8RiVNKCcpRTw3NUk8RjVTKCZFVCJAICAgICAgICRZNl9fQShVUiIgK0JYICImIDQoXlQgIiAgIgotTUxBQE8rMCAkK1A8QDU0WjA0JFxKPjAgIkxBQSpDNjtCM0tEICAiO1ArUD0uTjAgIClNQTgzVFNOKCgjXwotTV4kWT4zRzQgICRZNl9fUE5DNEFYICBRLk4wICArUEE4M1JJIDJIVUYhJyNfOCFISktAICgqVlggIyAgJAotTSpXRCAgSyg4ICBAQ1MwICJMQUFQICJJTl9fUS43RFlVICAhLl4wICApTiEoPiAgJDNEIUVcRFlVMidAIAotTSA0WSAgICBDUCAgIiAkMVBfVFlVICAgICAgICAzRTggICRBWSAgIEchRFpZICAgVyglQS8zRVkuPTRZNgotTV9fQShVUiIgKkZYICInW18ySFVHPCMgTSAhICJAICAgIDAtRy5DIE0gISAoICAgJjlDIFArMCAwIiAgIAotTSBGPCQ/QCFAIyRBNTNLRCAgIj40NiRcTiAhIE0gISkpUCJcIDNLRCAgI0FWNiRdKkAmUCI/T1xQKzAgMAotTSIgICAgVjwwK1JUICIkWlkgICBQJ0VBLzBKVCAiJClNICEhIkUyTU0gIEAgISQqTSAgUEAhVFNOKCgjXwotTV4kWT4zRzUuNU9fXCtIVEo7QCAoLCJUICQgQCAgICVGKUYgXCwiVCAkIEAgICAlRykkSk0gIEFHJ0IgTQotTSAgMlBLMCAoOFExKDU0WlkgICBJOEVBLywiVCAkIEAgICApR1RDIE0gISAoICAgJTlQMVBfViAiPCAgSgotTTtPX1wzRVkuPTRZNl9eUShVUiMgKkZYICMhUE4gIExQKzAgMCBIICAgICIyIyggICAgIiI5Q1BAKzAgKAotTVQqVCAjKyJNICAxQyAgIlwoJlQgISUpKCpUQCAhISUmX19cLCFAICo5QCAhJ0RBNTNLRCAgIkVCNiRdXgotTV9bIic5QCAhIyYgICAwMFArMCAwP0E7IEFXWCZMKD1GLCFVJl9fXSJFNEFYICAlKDtPX18kIlQgJERHIAotTStQIS5OMCAgKUxZXiA7Iic5UCAgVUAhTSAiICAkJyNfOCAgIFNDIE0gISFeJEwiJz9AKlBBVjhAMkpUIAotTSImPDooIlQgISsiTSAgQUYpJEo1OUIgUCswIDAgSCAgICAiJDlBMSg1NFpZICAgSVlFQS8ySCFHIUcjXwotTTggICBDIyBNICEgIkAgICAgKDFGIC9cRjIlNS5OMCAgKjYpODNVLjU7MSBAOzAgJDREQEsyICAkJDQ7XwotTV9WISwsIlQgJCBAICAgPUcsQiA1MSgiUEswICw7IkBAOzAgJCQoOCwhQCAqOVEgQDswICQ0REBLMiAgJAotTSQiQ19fViA8MiU0QDswICQ8ICAwJCYgJjIlNVAgISAmK1AhLk4wICApXyEwM1MgTSAhICggICAlOVAxUAotTV9WICQ8ICAwIURTTigsI19bJFk+M0c1LjVPX1AyLTxQUCJJTiAgQEg7MCAoKyJUICEpUiwqVFAgISMgTQotTSAhICJAICAgICgxRyEnWCA4IDBOKzAgLCpIPSpFNlAkP0AhQCBCWDUoIlQgIi0iTSAgUjBLMCAkTCg9TAotTSJEQTUzS0QgICJNIDYkXSpBRlxAK1A5KDUhIE0gISkpUCJcIDNLRCAgIjsuTyghRyJAIU0gIiAgJCcjXwotTTggKVAgJFNOLCwjX1wkWT4zRzUuNU9fWDItPEBAIklOICBAUCswIDA/QSsgQVdYIkwoPUcnQyBNICEgIgotTUAgICAgMClGIScjXzgmQVBbXCFNICEhUiBIISEuVCAgJCMgTSAhICggICAmOURZKkswICg5QEkoNTRaWQotTSAgIEpARUEvKCJUICErIk0gIEFGLSMgTSAhICJAICAgICgxRioiSk0gIFEqRTZQJD9AIUAgQlg1KCJUIAotTSItIk0gIFIwSzAgJEwoPUwiREE1M0tEICAiTSA2JF1QICRTTigoI19eJFk+M0c1LjVPXlQyLTxAUCJJTgotTSAgQDArMCAyMjwgTCAjIE0gISAoICAgIjlROEA+MCAiIEkxIVwmWCAqVEAgIidYKCpUPCAjJiFaK1A5LgotTU4wICAtNyE4M1RKIDlQWCA7MCIgICEgTi8gICAgKCFAJ0RBTl9cME8hRFpZICAgWEFFIS8ySCFNIUJYTgotTV9fIU4hQlhcICAgJCAiICc0KCBPICRaWSAgIE8iJUEvKlQgICImPCwgJlQgIiAgMCpUPCAjJiBAKCdEIAotTSBAKjQwPyFOICJNKCAgQV4iIk0nICBQIjs/XV8gISAgOzAgJCAhIEs7MCAoICAxLFtCIyBfWzEuN0RZVQotTTNFO19dIilOICBAQDowIChUPkQgIyIgKEQqRCAhJkgmKFRAICEmICZMKSVMIEIqIDNFWS49NENHUCwgQAotTS4wICIgJFAsMCAgJDlAOFAvICAyOCIwLDAgICM5QDhQLyAgLjghQCwwICAiOUA4UC8gICo4IFAsMCAgIQotTTlAOFAvICAmM0clIV4wICJKWlFAIUItUSAgICAgQik4TF9QICAgICA5TyEuMERTPyBQLS49MCAgICAgIAotTSAkW1kgICBLWiAgIDNFOCAgJyghKFwkICBLKDwoJlggJCVSSCAgUS43RFlVM0U7X1kiWicyS0QgIEAhOAotTTlRSCxOMCAgICAoICBAITg5QCAgUSdYIyhcPCAgQCEsOCAgIE4iVVwgICBLVC9fVDBKW19eJCpOX19RKAotTTtPX0gyJltfXSRBWCAgPS5OMCAgLVohL1tQICwwS0QgIEsoPDNLRCAgI0g4MiZbX10kQU5fXkEoPiAgJwotTTNLRCAgIz5AM15cICMkSlkgICpSJyY8JD9AJUAgR1giKFw8ICBAITgjK0QgICAgIiAgKCA2JjkuP0AsQwotTVFQICIgJFEuTjAgIC5DISpAJjhWMidEICAiU0AyJ0QgIEArJDNLRCAgI0VQNCRdKD4wICArMiEoPjAgIgotTSBMMS5OMCAgLjchMDNUQVkgICgiUSRaWSAgIEdFJUEvM0tEICAjSDgjK0QgICAgIiAgKCA2JjgkPCAlQAotTSBHICArQltfWSRZPjNHNCooJSFMOTYlUzkyIU47VzFFLkIhLTBTOFguI0BRKCc1UDlXKUE5JjRAPSZcQAotTTAzRFMzQiFNODctSygmVUE+MiFCOTIhQTknOUk8ViVCOyY0TiggSCA0VjVFKCQ5TDtWJVQ6NllHKzUhTwotTTo2WVQoJSFSO1Y9Ujg2VU05NyhHPFIhJz02RUQ5MlgqICRZNl9eUShVUyNAKidQICBAIlAqRTBKK0AgLAotTSsiWCAiJiAwTypUICImMCQqJFVAISRHTSAgMEo1JEotOUAxXiAmICQrQlQgIytaJTkuIS5OMCAgLSgwTgotTSAmPSQqKDxAMVQqMDBKQCAhIiUmICBAQTEwICwoJDhAQTJBJzYoPSpDNjw+TypUICImLCwqKFUpWzAgJAotTSpGVCAhJiAoKCQ8QEMyWC0qRTUqQzY7QkZcVEAxUiItKihVLFtDI0BfXlEuN0RZVTNFO19aJEM3LC8gSgotTTtAICgqJTRMJSY4JD4gIUAhQiEmKiJAICMiWEwgIDFGISdIIDggOEAxUkhIICBSXEFWPVROKDVFLiRKJgotTTlWQSpBJjg6KCQ4QCogICg2KCBPICRBWSAgKCBcJFpZICAgVTclIS84JFhKQUVCJipEOEwlNjgkPiAhQAotTS8iISYqIkAgIyYgVDJIPUcsJEolOUFIQDFSIEggIEE4QCJcIDInRCAgQCQkM0tEICAjNTw0JF1AJUJKJwotTSpEPE4lNjgkPkAhQCFCIScqQkAgIytSJzlIUSJFNEE0M0tEICAjNSI2JF0sW0MjUF9eQS43RFlVM0U7XwotTVkkQzcsKCBKO0AgKCglNSpCJjgkPCAhQCEiIEggIFBINCIpSCAgMSpDJjgkP0AhQClCWEwgIFFAKCtaIQotTTkxOEpDJE9MICAwSDU0Siw5QDFeICYgOCtCUCAjJiAyKkhESjIyKTUySEVGIScoIDggMEIqMCAsT0ghQgotTVQrKiA4TFBKQiIiLCg0RCAhJFNOLCgjX1kkWT4zRzUuNU9fRDItPFBeIkBOICBBOEEnWChOKD1EISdAKAotTTggOTZBLjIsWThRKk4wICIgKyFGISdIIDggSEA+MCAiICsgSiogICxOSDFEJSJcJDNLRCAgIy8oNiRdKgotTUAmOCY8ICFAICAjIionUCAgQCJQKkUxQCgrWiY4QFJeQSYwNDI+VCAhIkkjOCEiXEEmNCgyPlQgISJJIwotTTggMEgzMkklKkE0RiswICQySDVGISdYIDggOEAxMlhIICBRKkBWOCQ/ICFAIUIhIysiQCAjK1okOStKXAotTUEmMlYoIlQgIykiJD9AQlBBVigwKkJUICIkQTQzS0QgICJXOjYkXUArQkhNICBATiE9WiQoJDRGJCk6JAotTSpULCAjIiEnKCgtMk4wICIgJzBLMVAgKDIlMS5OMCAgK0kxODNSISUoKDBAMTIgMFQ7RCAgQCJENEtEIAotTSBAIkhOK0QgIEAiODkgOTJOMCAiICdBOEEyICUzLlhQXi9fRDNFWS49NFk2X14hKFVTI1wpIlggIiEgIgotTT9ALyBBVjw2K1ApKD4wICIgMUEuTjAgIC01UTAzVyAgOCAgIFwrMlkgICggTSY0KE0rRCAgQCJYOFBZXgotTSVCLycgICggMScgIDggICBUQlAiNjg4QDFCQDBGO0QgIEAiRDRbRCAgQCJIKidQICBAIlAqRTEqQzY8IAotTSAqKE4rMCAoKUJUICMrUic5I0BKIU1KJE5IPUYlLUIjNFtEICBAIVQyJTEuTjAgICs9STgzViFQTkg9QwotTSUiXCcrUDkoPjAgIiA1PS5OMCAgLTVRUCAmIU4qJFVANStSJzhTUEohXUojTkg5RiVCUCdWKC0zTjAgIgotTSAnMSg1JFpZICAgTVZFQS84IypaQUYsNCtQKSg+MCAiIDc5Lk4wICAtNVEwM1cgIDgjISlbMCAkOCEwTwotTSBEQVkgICghRiRaWSAgIFU3JSEvPCAhQCVCSTQySFVGIC9dQitQME8hRFpZICAgTTIlIS88ICUsW0MjXAotTV9eIS43RFlVM0U7X1wkQzcsLCBIO0AgKCsiWCAkIlhOICBSPkFHKChPSCVFKCRPVDogIEpBUkImNEtEIAotTSBAIVQ0S0QgIEAiSDImVCAhJFpZICAgUCdFQS82JFBAIyRTTiwsI19cJFk+M0c1LjVPX0AyLTxYXiJJTgotTSAgQEAjN1gjUCg9RiQrT1kgICggTSY0KE5fRCAgQCJYOFE5KDU0QVkgICghTkRaWSAgIFU3JSEvPCAhQAotTSAgI1QxXldfXyJAMzA/LSggIlAoMidAICAyXCQyJS0uTjAgICxMIS9bUCAsP09eUEFWOCY8ICFAICAjKgotTStCWCAjJUInPkBCXkE2MCQ9QEFAIiU6J1koX0VDUjgnTigtRSQiXCMrUDEoNFRaWSAgIFEwJiAgIClaXAotTU4wICIgK0FEOEJBXCAgKCBMIkk0KCQ4SiQmICoyPlQgISYgIiokVEo1JEotOUAxXiAmICQrQlQgIytaJQotTTkzSE4rMCAoTyg9RVkrUic4TUhOIS1aJU9ILUUpREE0M0tEICAiVzo2JF0zTjAgIiAnMztOMCAiICowRgotTUFSXCMrUD0oNFRaWSAgIFEwJiBSK1JYICMkWlkgICBPIiVBLypEISpDNjw+NiRNOUEiXCQyJTUoNFRaWQotTSAgIF0iJF9PICBRKDRUWlkgICBQJ0VBLyggVSxbQ0NYX14hLjdEWVUzRTtfWSRDNy8uIEorQCAsKyJYIAotTSIiMSZVPDRGPyAgIiArIUAiIjktOCAxJ1swICQqRS0qQzY4JD9AIUAhIlhNICBSXkE2NCAgLDhIOzAgKAotTU8oUUYnJEEzM0tEICAiVzo2JF87TjAgIiAqMTJOMCAiICpBUCA2ICAgKjJcQyY2XCtAUz5FK1InOStCVQotTVFWLDoySlggJCY8MCtQOSg+MCAiIEQ9Lk4wICAtNVEwM1cjXzgnQlVRVjhOMiUtLk4wICArPUk4M1UqWQotTSAgKCA9LU5ZICAoIEklMlkgICggSilONDImUCAhJFpZICAgUCdFQS88ICVAMURBMzNLRCAgIlc6NiRdNAotTU4wICIgJzBAJS0mWSAgKCBJJTpZICAoIEoiICdEKDoxRSlaKikoPSg7ICAkM0tEICAjID42JF0oOkAgJAotTTNLRCAgIyA+NiRdUCA2ICI8ICEsW0NTQF9eMS43RFlVM0U7X10kQzcoLCEqTjAgIiAmUUYoRFpZICAgWAotTUlCLyAgICggOyRaWSAgIFRBIkkgMkhVRy5EQTUzS0QgICM1IjYkXE4uMCAiICZRM0FdWk4gIEEsPjcgJwotTSAgKCA7JFBZPCA8ICBAIUwrIDxPIURaWSAgIFhYJUEvKkQhUl9bTyE5QDFQICYhLDJLRCAgQCJUOUA4QwotTVMwICIgKzEhXTZAIChcQCAgQCJYKkg8QC4wICIgK0IwTjAgIiArMENQICAiICcjP04wICIgKjEyTjAgIgotTSAnMTJOMCAiICpBKDswICQzS0QgICMgPjYkXVAgNFNOKCwjX10kWT4zRzUuNU9fWDItPEBAJEpZICAoIAotTVEmPDYqR0QgIEAjJCgnRCAgQCMkKF0gICBAIyQ4ICAgQ0RKWSAgKCBQJllQK0NQICAiICQrUD0uTjAgIAotTS4uITgzUkkgPE9eUEA2ODIyJ0QgIEApWTNLRCAgIzU8NiRdUCAmITwyS0QgIEAiVDlAOENTMCAiICswSgotTUFUJ00gIDBDUiAgIiArUENfICAgIEAgICBAIyAwPzVYICIvKCAgKCBOIiBZICAoIE4pIlkgICggTSIvIAotTSAgKCA8LV5ZICAoIEslLlkgICggUCJJWSAgKCBPJ1gwV1tEICBAIlwoIFUsW0IiIF9fQS43RFlVM0U4IAotTSAiIU4gIEBATjAgIiAsMENbQCAoICAoIFEkWT4zRzUuNUAgIDxBOENQMCAiICQxLjdEWVUgICAgICRZNgotTV9eQE5BUlhZICAoIDEkQU5fXlEoPjQgMjUgJE8rQCAoM0tEICAjQlYySCFMIkIvJyAgKCAxJyAgOCApUAotTSAyWE5fXkEuN0RZVTNFO19fIlotMktEICBKWkw5Q0BKPyAgIiBJUFArMCAwIEggICAgJCM5QDBAIzYhSAotTTJeVCAlK09cICAoJScmN0QzS0QgICM4XDJIIUYjJygsKFwkICBAISQ8ICFAMUJJWSAgKk5LJEo1OVIwQAotTTUzIEggISAiQCAgICAwLUclRUEtTl9EICBKWlA5PjFSJiIvISAgKCAxJyAgOCFBKkU2ODIyJ0AgJSRBWAotTSAgJS5OMCAgLzkhMDNSSiAoITRKO09fXDNFWS49NFk2X19BKFVSIiAzS0QgICNCNitAISg+ICAkK1A9LgotTU4wICAvOSEwM1IvICAgKk5LJEpZICAqTksmOCQ8ICFANyIgJ1lYIE8gJFpZICAgTyIlQS8oXCAgIEAqNAotTTlBQE8uMCAiS0pRLk4wICAsIVk4M1QqWSAgKk5LJyAgOCJYQD4wICJLSlEhXCdQIChcQCAgSlpQK0NQIAotTSBAKjwqR0QgIEpaTDggOEpRVyg0V0gkLEFQICIhMVFFXEcgITMuWEBAL19YM0VZLj00WTZfX1BOQzRKWQotTSAgKk5LJjgqM0tEICAjOFwySCFHK0JJWSAgKk5LK09ZICAqTkwmMEAySTVGJERBWCAhMSg+ICAhM0tEIAotTSAjVjA0JFxKQCVBLU5fRCAgSlpQOT4gSjtPX1wzRVkuPTRZNl9fUE5DNEpOICBBRzlESlkgICpOSyY4SgotTSpHUCAgQCo8LCJUICQgKiAgICAhIFY8KjIlNEA7QCAoM0khODNUT00gITJbXyAgIiExUUQtRiM8KkdEIAotTSBKWkxOX0QgIEpaUDkiOSpFNjw4KCU0UCogIDAgSCAgICAkIzlQSE8lMiFOICBBLkQlQS82JFZbXjAgIgotTUtLIUVWQklOX19RLjdEWVUgICAgICAgIDNFO19WJEM3Ly4gTitAICg7UDlcKCtaJjswOV4lRiAgICo4RAotTTtAIDArIlggIyIgJzRYIVIgPiZBK1AlLk4wICAuLDk4M1JIIDJfRCAgSyhAMl81XCAiOTUyJShPIUJcJwotTTNLRCAgI0VGM15cICMkSiA6VTkqQUY8VjA+W19dIikmKC1EQFYyIzkyPltfXSJQNDlQWVIgO1IhOVBASgotTUFCQlwgICBZJiQqRzIlME8hVFpZICAgWTlEX08gIFEqQCZMPDJISUciQFIyICAgWSYmOCIpKExPITRaWQotTSAgIFhVRUEvPCAhQCZCWFkgICggMSJcJTNLRCAgI0M2NiRcSkJSLycgICggMScjXzMuWFxYL184M0VZLgotTT00W1kgICBGWCRBWCAgOS4wJjdSM0c1Ll4wICApTiEoPiAgXjNEIUVcRFlVM09EICAiO0AyJ0AgNjRZIAotTTk/KS49NFtZICAgRlgkQVggJCEuMCY3UjNHNS5eMCAgKU4hKD4gIFYzRCFFXERZVTNPRCAgIjtAMidAIAotTTs0WSA5PykuPTRbWSAgIEZYJEFYICZZLjAmN1IzRzRAK1AgJDVIIVJfLCIhVCtEICBANDwrVCAgISRBWAotTSAhJS4wJjQwKCNEICBANDwoXlwgISAgIiExUS49NFtZICAgRlggICAgICAgICRDR1AsIS5OMCAgLkcgQAotTStQJDBZOEBAPyAgIkxCIEA8IEAgK1JcISciXE8gMVBPK1AkPCtSXCEnJFowV19QICAgIDAzS0QgICNKWAotTTMtXCMgXV9cICAgICIkQVggKE0uMCRbWSAgIEZYJEFYICZRLjAmN1IzRzUuNU9PWDItPEBAIklOICBBIQotTVtAIDArQEBQKzAgMCIgICAgNjg2LCJUICQgQCAgIEFHIiAhTSAgKCAkJiAkPC9dQDpDIE0gISAoICAgIgotTTlUWCI7P19bICEhIVtPUCAqVEAgIiQnTl8gIEsyICAkKldQICAgMCAgIFEoNTJcJytSWCAjJFpZICAgXQotTVgkX08gIFBOICRBNTNLRCAgIj40NiRcIDswICQgISEiSzAgKDBKVCAjJCo1OCEhKDUyXCcrUlggIyRaWQotTSAgIF1YIlggKCA9LFtCIiBeX0EuN0RZVSAgI1IuSVAgICAxLj0wICAgICAgICAgICAgICAgICAgICAjUgotTS5FMDQgIkNSICYwICMoIEVAICAgOUE7Ui5FMCAgIVtSICYwICMoICBAICAgOUAxUCA2ICIwSCEuPTNfUAotTSAgICAgICAhLiBfX19fWCAgICAgICAgIEdfUCAgICNcK1JcIF8kJ08gIDBAKiAkMCgsICwwICAoOVJQQAotTS4wICIgJFBAUCBRICAgMUYiJFpZICAgW1lGIDYjJCAgIFY4KDNLRCAgI0taOCBALDAgICI5QClBNkRZVQotTTA+XCAhIiA4IyQgICImPEooIUAsMCAgJDlAQS5OMCAgLyYhQCZAUSAgIC1GIiRaWSAgIFshRiAsIyQgIAotTSBGOCYzS0QgICNNVitVPCEgLV9cICAgISAkWVVcQSNQUC8oSE8gICAmJFlVXEFDMFAvKDBHICEuPTIpWQotTSAgKCVVIyBJX19YKCAgIC45UEBRPyEhQyAiIUAoRElJX19ZSlokQUggIiBPLyQgIiAgIE8uMCAiTEohLgotTU4wICAuKzs/XyAgICAgUFM/ISFDX19QUz8hISBfX1BARDIlMSAgMEE0MCAoKDUkICMiJTEgISBBNDAgNAotTSg1JCAmIiUxICFRLj0yKVkgICglVSMgSV9fWCggICAuOVApQChESUlfX1lKW0RBSCAiME8vJCAiICAgTwotTS4wICJMSiEuTjAgIC4rOz9fICAgICBQUz8hIUNfX1BTPyEhIV9fUEJEIipIICAwQkogICgoSkAgIyIqSAotTSAhIEJKICA0KEpAICYiKkggIVBQKj9fXiIgICAjRj9WLFZAICgvX1wzRzdSJC8jIFQ/UCAgICA4XEFCXAotTSAiKVxYICAvJSIjOSgtREBWMiM5KC1EQFYyIzkoLURAVjIjOSgtRENfICAgICAjQCAgXiQoR1NAICBYIAotTSgtREBWMiM5KC1EQFYyIzkoLURAVjIpXFggICAgIi1cICAgICAgXDwoV1AgICAgICNRMEM/ICAgICAoKAotTVQvKFxCICAgICAgIFxDUjAgICAgICAhLj0yL1wgICAgIC4gICNYM1ImLSMgXEFCPCAtJ1wgICAgKyIpXAotTVggICwgIis4KE1AQlYiKzgoTUBCViIrOChNQjFfICAgICRQQj8uICAjUTBCViIrOChNQEI/LiAgICAgQAotTSogIDggSCAgICAgLyhUIChUIi1IICFQKTYiLVwgICAgICBHJCghISFaICAoM0tEICAjUz4oIkNfXyQnSAotTSAgQS5OMCAgLy1ZLj00QSAiICAgI1Y4OiBEID9fIi4wICAhKDAgQCAgIF1GIkApICdfUENKICAkICAhLgotTT0wICAgICAgICIhTyAgMEI7UCAoKCJcICMmXSwoQEYyQiZQICAgMSRAOyogOzAgIDAjKCgiICQgICY8JAotTSRNQTNAIigpIiAkICAmOD4oQCNEQiYgIihNQTFSL19cMEQhM0AmM1QoICQiQCAgICAgLUAgQSs4NDxDXwotTV8kKSA0WCFEXSRZVUxcQU4kJiAiJE1BMVIvX1wwRCEzQCYzVDNHNzFQLS8gOCAoMyglJyhfX1EiMCUuIAotTTkvMS49MCAgICAhLjVPX1gyLTwgUCJQTiAgQSwrRiAmICBQTyFEWlkgICBPIiVBLytAIUYhJyAgOCBYTwotTSFCXCczS0QgICRfWDQkXEAhVFNOICwjX14kWT4zRzUuNUAgICtSWCAiJFpZICAgUCdFQS8zRVkuPTRZNgotTV1IIShVU1NcM0tEICAlWFYoJCBANCFVMF9fXSJLT19YP0AkTTFfX1QwSltfXCJVTiAgU19ZIlVOX14zXwotTVoiVU5fXkNfWyJVTl9eU19YIklOICBAPCc2PSYpRlggJCMgSyAhIV4kTCInP0AqUEFWOEAySkwgIiY8OgotTSgiTCAhKyJLICBBRipESjM5QjhQKlAgMCBIICAgICIkOUFJKDRUWlkgICBJWUVBLzJIIUcjJyNfOCAgLgotTT4nICA4ICAuPEcwICkmTCAhIlgzMD5bVlEiVShdSyEhW087JCs0Q1ZNJCdOXUwwTTIvOzQjIDggKTY8IAotTSBCQTNBVkhMLCJMICQgKiAgICAgQSY8KiggPSRAKyJLICBRTSVCPSogIDEoNFRaWSAgIEk4RUEvKSZMIAotTSEiWDM0WDw0UUUqIjggIC1OQiFOX15ASDQlQk5fXkEqQyY4JionRCAgQDREJyFRRyAgVkA0WD1KKyMgSwotTSAhICJAICAgICgxRyJCICcxKCJQSlAgLDsxOEcyQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJSw5MgotTUBGIyQoJltfWiIgMCcgIThLT19INFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJAotTTIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUsOTJARiAgIzI4QDtPX0grISE4S09fSDJIOUoxJS4nOkJQUAotTSpQIDAgSCAgICAiJDlQSEAhVDIgTCpMICMmVDYpVEggISRBMzNLRCAgIkVCNiRcRDpQICQrQS0zQVEzXAotTSAiVTJARDImOCBIQDtPX0grISE4S09fSConRCAgQDRIMj5bW1dSSFkgICglKiIgJjMnUCAgMCAgICBIQAotTTExRFAmICEsPyYgJiAgICAiRjtGOCAgIEIiSFkgICglKyIhTl9eQEwkJUJOX15BKVtPTz8ySDlHICAiWAotTTJIOUc6JyAvUCg4QDExRFAiICNIQ0Y7UjglQEouMCAiITJAQDtPX0grISE4S09fSDI+W1tXVEomOVAgIAotTUJESiY5U0lQI1wiJigkNDksIEAgWihZRlxGIEoqQ0QgIEA0SCgmW19aIlAwNipbX1okR05eXV0qQUY9PAotTTJIOUcjRyAnUCg4QDExRFAiICNGQ0Y7UjA+W1tXUjgoTjwtRCAgUDQnIVEzQVZITCwiTCAkICogICAgIAotTUEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLykmTCAhIlgzNFg8NFFFKiJOPC1FUUYgIAotTSJdOVwsJiAgX0cxNTM2IS4oJFUyMzEgMDI8IVw+KyImOE5ZIV5AIFA8QFZQJiUzKV9fUUZYIyBbJEA5LgotTV5QICJfSCtfN09bKl9QK14vT1oiX11TXkBPXzxfVVtfLC9XTl9MS18sJ0FVPFchTzsmRUg5Ji04NTRdJAotTTBCW1tUVChOXl0pIitPTzEwQltbVCQoTl5cXSIrT08uOCI4PT8gICFeXSlAJ0FVXCAgJ1tUNiA2JzdQIAotTSA/TzA4IFg9PyAgIV5cXUAhQVVcICAnW1NFKS0kITUpUCdQQEwoOUdXR1BDTCg5R1gnUEtMKDlHUEdQTQotTUwoOUdRJ1BQTCg5R1VGITwySltfXSY8OjImW1sgIlxOX14wTytAICgzS0QgICRTSjNeXCAjJCpOX18wLAotTUtAICAgIytfXCZYNCgiW19cJC9WIzIjWl8iVSldSkhNND9fSDghUE07T08kX15ATytPX1AyJltfWiJcTgotTSAgQS5OMCAgM0dZL1tQICw0RFQsJTAgSjlAICBIRSktMiZbW1IkQTUzS0QgICRePjQkXEogJj1UMkpbXwotTV0mPDoyJltbICJcTl9eME8rQCAoM0tEICAkU0ozXlwgIyQqTl9fMCxLQCAgICMrW1ImWDQoIltbUiQvVgotTSMyI1pfIlUpXUpITTQ/X0A4IVBNO09PJF9eIE8rT08oMiZbX1giXE4gIEEuTjAgIDNHWS9bUCAsKCZbXwotTVgiUDA2KltfWCRKJjpAQSRBQVVcICAnW1QySSU4JEBAO09fSCshIThLT19IMkg5Si5EMiYnN1AgID9PMQotTTgjIVwgJCpOX18hQCVBID0yPCFaLCkiJVcoOEIhTjYhVygnPEAiVSZfXyAwJTRCIDA/RCAgQDc9IiMgIAotTSBAICA5TUAsJTAgTjlAICBPJSktIyE0ICpGOCAgKEkyMzRBTl5PUSg1NFpZICAhL0dFIS8qICFHOiRKTgotTV9fMUcmREFOXlAgTytPX0QrUlggIiRaWSAgISxaRF9PICBRIktPX1QjKlggICAgUl5PUU4lIiBOXk9RIwotTV1AVEBeT1BNMj86Sis1J19bJiA8KzZbW1EvX0wrUltaXyRBTl9eUE8rQCAoM0tEICAkWV4zXlwgIyIhTgotTV9eUEokJUJOX15QSjEmIFYoJltfWiJIMDYqW19aJiBKPkAgMCU0QiAwP0QgIEA3PSIjICAgQCAgOVE4MAotTSc0RyA+IyIwQS1KJShAN0VAPUohVkghQFZHS18jITQgKSY8IF9AKSJLT0tYKzdQICBANSReTzEiS09LUAotTSs3UCAgQDUkXk5RQCAgOUgnN1AgID9PMzggICY3QVVcICBLWlpWIC4nN1AgIi9LSzggOD0/ICAwXk5NKgotTUE2UCI+QCRAO09fSCohIThLT19IIyJYIDkvS0o5USAsK0AhJF5OSUciIFBOICZHWlpGOE4ySDFMIyJVXAotTSAgKCUxP0tUMSgxQCdESE5eXSlHIkJVXCAgKCUxX0tUOCBZKitPTzA5UEBNPyAgIiE0R1pdJEhOXlxZRwotTSVCXE5eTzEuTjAgIDQpITgzUkEmRjwiWVE2XCIqQFAsK0AhOF5OSUYiIjhZICAoJSsmICYpQ0QgIEA0SAotTTI+W1tXUSBOXk5NKVAnKChMKCVHIicoMEwoJUclRiEgMkgxRzAnICdQKDBAMFFEUCIgI0ZDJjtSOCMhKgotTUEmPEw8IF8gQSIhIyYzICggLkIsOU8pQCciICQzJ1AgIDAgICAgSEAwUURQJiAhLD8kICQgICAgIkRKJAotTTlOMSFbT08/KUBAQCMpIiNUKDRNMC9LWDJCW1tTVjwgITs6WVBWOFI4ICAlS0BSTiAgICAgP0tYOyAgJQotTUhHSCErNDdaXiYgICE5QE0/ICAiITRPWl0mICAhOFBNPyAgIiE0W1pdJiAgITggMCtPS0oyPCFaNisiJQotTTleQVo7WyIlOVwhWj4rIiU5XSFAICA1RDJINUwgR0gmMkJbW1RWOFgoJltfWiJVMF5OIE06ICAkXk4xMAotTUtPX0gyJltWViRBTl5NQSg7T0s8KCA1MkAiXCArUltaWSJcTl5OIS5OMCAgOD9BL1tQIDg4IzhIO087NAotTT1BIzZDIiFOX15ASFQlQk5fXkJZUFY3UjImW1ZWJEFOXk1BKDtPSzwoIDUyQCJcIDImW1ZRJFpZICAiKAotTTwkX08gITBIMCRKTl5NQUciQlVcICAoJTQ/S1Q4IVkqK09PMjlQSE0/ICAiITUvWl0mIC4yQltbVCY8KAotTSs3UCAgQDU1Xk8wLCtAIFldTUFPJURHTl1NQSFbICAhKUBAQDBUSDA5UCAgU0UqIzgvMSFbT080KUBBKgotTSUmPCQmIVFAIEdAUCgkLDBBJSojMkg1RiFESE5eXF1HIiIhIyQqW19fVSojKzQ3WlwmIC4yQTFHJCUuTgotTV5PIEAwUSI8NEgtKktPS1A7TlEpW09PNCMiWCAsLzs4OVE4SitPSzw0WDVKJCQyJTggUSFbTzsgKkBBWAotTSEmIFg+QCEoO086XjwgIFAhMlwgM0tEICAnQjA0JF0iK087Ij4mMlpBJlc4Iyg0ICAgL0g7IEkhW086XwotTSpAQVghNiAoMD5bVk9CSCg+IDhNMS86WDRYNEghNEpOXk1RTiIgUE4gIyNWViY4JD5CTUAgR0hNKCQwMAotTUE1LiQrNDNaWyIhJCQqW1paREhOXl0lRiEnSCE4IClaICEgTl5cWSlQLCIlOVAgI08iXE5eTzEuTjAgIAotTTQpITgzVCdOXl0wQiBZKihUKCcwS09LUFQqW1ZOIigmREggTTA/S1g4ICAjRERKJTsgKVohREhOXl0tRgotTS0iIU5fXkBNNC9LQCs2QCAhL0tENCpbX1okQU5dTUEoO09LODImW1pXIlwlK1JbWlkiXE5eTiEuTjAgIAotTThMWS9bUCA4OCMoSDtPOlQ9QSM2QyIhTl9eQEhUJUJOX15CWVBWN1IyJltWViRBTl5NQSg7T0s8K1A1KAotTTtPOyQzS0QgIChFJjNeXCAlIkEgMkpbWlYmPCorN1AgIEA1N15PMUAnREhOXl0pRyJCVVwgICglNj9LVAotTTggWSorT08wOVBATT8gICIhNU9aXSBQTiAjR1ZWJlw2Mj5bVlYkJ0wgICRGIiIhIzJBIUcgICs2NEgtQAotTV0kJ05eXTBGIiJATl5NUU4iQiEjJCtQICwlKiM4ITkqJSY4KCgkLDBPICBQOCAwQDBRIjw0SC0zQSY7SgotTTJCW1tTVjgkMkg1TyIiISMkKltfX1UqIyogNEAhOSIlKzQjWlwmIDw0SltaVyRKTl5NUU8hJEg0OUBAQAotTTBRIlwgIyFAISIhIyQpUTJAVS4kOk4hKitPTzE5QDhYPyAgITggKjlTISBOXlxZKVAiKCxQKCVHKEJcTgotTV5PMS5OMCAgNCkhODNUJ05eXTBCIFkqKFQoJzBLT0tQKEA6MkAiVSFeT0EpW09PNDggICIpJEolOyAxWgotTSFGICYySDVGIEdIITJCW1tUVjhUKCZbX1oiVTBeTiBNOiAgJF5OMTBLT19IMiZbVlYhIE5eXF0pUCJcIAotTStQNE8rT0tEK1JbWlgkWlkgICFFS0RfTyAhMUAsQkFOXUshViQtOiwoJltfWiJDMDYqW19aK0cjOT8pKAotTTtPOzgkIltbU1RHICtQIE8hNEFOXUwxLk4wICBCQ1EvW1AgMDI+W1ZWIFBOICJXVlYmOCwrN1AgIEA1PQotTV5PMTIzJiA+MkJbW1RGPCorN1AgIEA1P15PMUAjREhOXl0hRyIiVVwgICglOD9LVCQiW1paREIgMD9EIAotTSBANz0iIyAgICAgIDlSSEYjJiAqKCQsLCQgIUU5UEEyQFIhIzJBIUZcIiEjIyEgIDk2OCQkK1AgMTIhIwotTTJBIUckJSojOC84RiMmICI0SCxAMFRIMDlPQSJLT0tQMkJbW1Q2OCQ+QCVAIEdIICQiW1tTREcgUCg1RwotTSAgJC4rUltaXSRaWSAgITBEJUEvKEAuMkMtIiEoQDoyQCJVIV5PQUAgICNQKCZbX1oiIDAnNCNbVSVCTgotTV9eQSlbT080MD5QICAyOCg4ICAgVSIhTl9eQEg0JUJOX15BKkE2SCYqQ1FfX19fXzJIUUYhQkFZICAoJQotTSknQCA4IDpYQTZQKDRIMD03LzpPOU8xKitPTzE5QDFaIDYgIj5AIDArT08uMjwjIEE2PCgoIDowQSJVIAotTV5PQTMzIjgsRjwxQD9HSCErNDdfXiYhVjI+W1paRCdMICAkRiImIUooJFUyMzFVMF5OSDArT0tKMjwhWAotTT4rIiQ4TiEhXkAgXjxBMlAmJTMpX19RRlRDIFskQDkuXlAgIiBHI1k+T0s+X0FbWTwvRiJeN0tZQk9dMgotTV43S1pXT1JQX0FbX1VPRVpfXTtfUE9GIl9WW1k+T0YqPic1UztWWUw6NkFHOUY1RDhVQTUzVFEnMTQwIAotTSAkSk5eTyFMISdIIDggMEorT0tQMkpbWl4mUCQ+ICFAISJATl5PQE8rT0tUM0tEICAlIjA2JFxNMC86SgotTStSW1pbJFpZICAhMEQlQS9HKDY8QCIgI0QoUjxAKVIkRypbVkpESE5eXSVGPkYgVjRYPUorIyBLICEgIgotTUAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RzJAICQyJS0uTjAgICo2KTgzUjFLICAwTiRVLiclL1AgKCUqIgotTTRYOUpRRiBcNFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJDIlLS5OMCAgKjYpOAotTTNSMUsgIDBOJFUuJygmW1pdITMwNEgpMktPS1QoJltaXSRIMDlLUUAtRS4nOkJQUCpQIDAgSCAgICAiJAotTTlQSEAhVDIgTCpMICMmVDYpVEggISRBMzNLRCAgIkVCNiRcRDpQICQrQS0zQVEzXCAjITJARS5OXk9BSgotTVErRyM5JyEzQVZITCwiTCAkICogICAgIEEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLwotTSkmTCAhIlgzNFg8NFclKiJOPC1FUiYgVjRYPUorIyBLICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RwotTTJAICQyJS0uTjAgICo2KTgzUjFLICAwTiRVLiclL1AgLCUqIjRaW1pcJkskOCNRM0FWSEwsIkwgJCAqIAotTSAgICBBJjwqKCA9JEArIksgIFFNJUI9KiAgMSg0VFpZICAgSThFQS8pJkwgISJYMzRYPEA7T0tMJS0hMgotTUBFKk5eTlBAO09LTDJBIUZPJEhOXl0lRy8mIFY0WD1KKyMgSyAhICJAICAgICgxRyJCICcxKCJQSlAgLAotTTsxOEcyQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJS9QICglKiI0WDlKUUBSTiAgICAgP19YOUEgQAotTTtPX0goJSE4S09fSCgoKSJLT19YJyFVRiAvKCQpVEggISI6JywiTCAkICogICAgIEEmPFAsIkwgJCBAIAotTSAgKUYnKTdLICBATyJEQVggIEhPKlAgKDNLRCAgJSooM15cICMkSiA5UEkoNFRaWSAgIEk4RUEvLCJMIAotTSQgQCAgIDVHIScjXzggKEAgRFNOLy9TVkAkWT4zRzUuNU9cPDItPFxYJEFYICxBIklUQU5fU0EuTjAgIAotTTQjQS9bUCAsPk9dXCAiQU4gIEEoPiAgRTIlMS5OMCAgODBBMDNSWCA5UCAgX0UqJyokPE8uMCAiITMhKAotTTUkWlkgICFBNiUhLytAICwtICBEPiAhRiREQTQzS0QgICUiUDYkXTNAIlAgNEg/OVFXWCAoIDtFQCQ/VgotTSIyI18uIlxZICAoJS0kQTQzS0QgICYlODQkXzlQIjEsNERQMCRERyA8Ry5QQDYpQDA/SCA6RygqTCFBNAotTVI/X1w5RShQLlEoJjNPTCAgT11aICFQIClAIEYgIjggKUAgRiAhOCAuICBSICJQICFQICE4KlggIVAgIgotTS5HUCAgNiBcLkdQICEmIFYuR1AgIFYgUC5HUCAhRiBKIiA8ICAmPCYuR1AgIVYgPi5HUCAiJiA4IiA8IAotTSAmPzAuR1AgIEYgLDxXIU47Jj1GOTQ9JSpCNCAySDlNI0coUk8oJUwiIjotTkg5TCBCSCY0SDk4MlBAJwotTSAgJUcgL1tcIkg8ICAgICI4ICNfMEdYIDJINU00JE9OX1NATCtAIDAoRDhCS0AgLDJJNUYkRyghKkglQAotTSMlIk4gIFFAKiVCTiAgUUAoQiA1NFghUiFbIiE4QUBQLlBIJjNPTCAgT19IX15DX1ovX0JfXitfWi9fSAotTV9eQTJBVUImNiRWXkE2XlgzLlhcWC9cPDNFWS49NFk2X11RKFVTU1gpJlggIidIUisgNEo7QCAsKUJYIAotTSQmICxOSC1HICAjUjYpNTJBNSomKiRJWCAmICI0SDpaQFY8ICAtQSg+ICBFMiUxLk4wICA4MEEwM1JYIAotTTlQICBRJSonKiQ8Ty4wICIhM0EoNSRaWSAgIUE2JSEvK0AgLC0gIEQ+ICFGJCRBNDNLRCAgJSJQNiRcTAotTSAlKidWPD5aQUY6Uj4gJV4gIlxZICAoJS8kQTQzS0QgICYlODQkXzlQIjksNERQMCRURyA8Ry5QQDYpIgotTTA/SCAyJygqTCFBNFI/X1w5QzBQLlEoJjNPTCAgT11WICFQICkgIEQgIjAgKSAgRCAhOCArICBAICIgIAotTSFQICE4KlggIVAgIjYpNUAnIEAnICAhMEU2IDQiIDwgICVCNTggUVM8JllMOVY5RTFUNEopMCEyQTUqJgotTSIgPCAgNjwgX1MgKkFQICAgIClAIC9dVjJIMUcgL1wsMkgxRiAvXDIzLlhcXi9fPDNFWS49NFk2X18xKAotTVVQIyA/QCFcICIpTiAgQUAlJSomV0g8QiFeNiFXSCQyJjRHIVdIJVIsKVohJCElKEAkJ1kgICglVzBAUAotTSAgKCAgJjs6Mkg5RyRAUDEgIjFGIyIhTiAgUEBBVSkpKCBFQCBHICAzLlggUC9fVDNFWS49MilPICAwQAotTStQICg7UykiQDBATyAgICAhVjwkJEwlM0AiISBZKEFAIEIrITQ8Q19fJCkgNFghRF0iICgiICAgIDY8IgotTSxMJCggICAgOVAoMlA0WVUgICBCK1AgKDlQWDAgPiYpJEAjQUIxKCBYOEQyICIpTyAgMEArUCAsO1MgKAotTStQICAgID1HISErITRYIEAwLjIoOCAoQlA1JyhfX1EiMCUuIDkvMEAiIEAgICAlRyBDKyEiICAgICY8IgotTSRMJEArUCAkM0c0ICAgICAoJlwgISIpKDxPXSomNT8pX19RRiAvX1g0WEYzUiIgKTNHNCAgICAgICAhLgotTTVPX1AyLTwgUCIpTiAgQVIgISAxMjwgTiAkJ1kgICglVzBAUCAgKVggJjkkMD9EICBANz0iIyAgIFdAIAotTTlROTIyMSAxMjwgTiAmI0g8QCUyMjEgMTI8IE4gJiAuKCA9XCpbIiY5XllcKzsiJjleOSFeMCAiIT1UKAotTSwgICI+ICFGIScgIDgjKVwsKVInOCBbPEFCICZZOCM8QCcgUEQoPzxAJSkpJCElKVAiWCAwP0QgIEA3PQotTSIjICAgR0AgOU1RKkA2OCIxKDhAIURTTiAsI19cJFk+M0c0ICAgICAgICEuNU9fXDA/RCAgQDc9VD5YIAotTSIhIDA8QC8gQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAJyBANFk+M0c1LjVPX1wwP0QgIEA3PQotTVQ+WCAiISAwPEArIEA0WT4zRzUuNU9fXDA/RCAgQDc9VD5YICIhIDA8QDMgQDRZPjNHNS41T19cMD9EIAotTSBANz1UPlggIiEgMDxEIyBANFk+M0c1LjVPX1wwP0QgIEA3PVQ+WCAiISAwPEBDIEA0WT4zRzUuNU9fXAotTTA/RCAgQDc9VD5YICIhIDA8QSMgQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAPyBANFk+M0c1LgotTTVPX1wwP0QgIEA3PVQ+WCAiISAwIEggICAgIjczRVkuPTRZNl9fUSFeMCAiIT1XMVtAICgkISFSJVwiIQotTTNFWS49NFk2X19RIV4wICIhPVcxW0AgKCQhIVIoLCIhM0VZLj00WTZfX1FQICBSTiAgICA/UCAoNFwhJAotTSAkWT4zRzUuNU9fXCgiWCAiJylfUCglLjdEWVUzRTtfXCRDNyAsIEA7QCAoJEJYICNSWE4gISEzQVZMLAotTSchQlwgNjtWNFRAQCImICI8ICEsW0AjIF9fIS43RFlVM0U7XU8kQzcgLyEqLjAgIkxNIUYhRFpZICAhQAotTURCQE4gIEBKK0AgLDlAICQgREokOUAgIEVHQCA/QCBMLyAgIkxNIEovICAiTE1cTyEyXCYzS0QgICYkSAotTTQkXSpAJjgyNEg9UiNdSiFXKCVSIUtaITs+KSpBJj04MidEICBLKzAyJ0QgIEpbJDNLRCAgKE9YNCRdXgotTSNQOicgICpSVCJQXCAgKlMuNEFZICAoKDUkQVkgICpOUSRaWSAgIitUJSEvK1A9KD4wICJLTDEuTjAgIAotTUJdITAzV0gvV0g2XkFGNzQoI1AgIEpbJDggICNHQiBcICAqUlQmICAgWTBAISIoIFo4JSRALSIhIUggIAotTSBLKyE4ICAjQCRBWCAiXE8hNFpZICAhQSIlIS8ySCFHICAkVitQNS5OMCAgNCkhODNXWVhMKD1OICAsOAotTStQNSg+MCAiS0wxLk4wICBCX0EwM1JYXCAgKk5RJ1AgMidEICBAQTYrUD0uTjAgIDg5ITAzUlggOUAgIAotTU1HICA4ICAjKUJcJzInQCAgNFpZICAhMk4lIS8ySCFGICAiWjwgIUAgICwsK1A9KD4gICIzS0QgICUqWAotTTQkXSpAJjggICohUCAmICAgTyhPIVRBWCAgLS5OMCAgNEtBMDNUSiA5QCAgQUcgIDggICJWIlwnMidAIAotTSEkWlkgICEyTiUhLzJIIUY7JyAgOCAgIlAiXCcyJ0AgITRaWSAgITJOJSEvMkghRjUnICA4ICAiSiJcJwotTTInQCAhRFpZICAhMk4lIS8ySCFGLycgIDggICJEIlwnMidAICFUWlkgICEyTiUhLzJIIUYpJyAgOCAgIgotTT4iICY8QDpQQDYoNiwjTCohRFtbICArXzBPXTxfVztfRC9eSF9cI19WJ1ggNEg5UiFbUiE7MCNfI0RBWQotTSAgKCg2JCpHM0tEICAmJjA0JF0qQCY4ICAuKSg+MCAiTE0hKDtPV1wrUDUuTjAgIDVRIS9bUCAsL0AhTQotTSAgJzoyRD1HLCRBWCAwJSg7T1dcMidEICBANzwzS0QgIChNIDNeXCAjJEFYIDAlKDtPW10yJ0QgIEA8IAotTTNLRCAgKE0gM15cICMkSiQ5QCAhVURBWSAgKlJXVEFOXzxQTyE0WlkgICE3PERfTyAgUE4gJj1QKCQ9KgotTSQmPSQyS0QgIEBBKDlQWE8uMCAiIiRBLk4wICAsIVk4M1IvJyAgKCgyJEFYICMhIVtPVywzXl9fVCIpLwotTSwjUCAiUis4NDxDX18iXFkgICgoMSRaWSAgIiswJF9PICNBKkEmOCAgNlEoPjAgIkxOWE8hNEFYICAtKAotTT4wICIiJUkuTjAgIDZZOS9bUCAwL0AhTCFHICA4ICAhNERJJzlQUShRUlwnM0tEICAjQVY2JF0qQSY4IAotTSAzISg+MCAiTE9VKDtPVywrUDUuTjAgIDYmMS9bUCAsK0AhRyAgIz4oJD0qJCY8VDJLRCAgQEEsOVBYTwotTS4wICIiJFEuTjAgICwhWTgzUi8nICAoKDMkQVggIyEoO09XLCtTRCAgQEEkM0tEICAoTSAzXlwgIyRKJAotTTlAICBVJEFZICAqUyMiXCUyJ0AgITRBWSAgKCg4RFpZICAhO0VEX08gISBeICZQLDBHRCAgQEAyPCAhQAotTSAgIlQyRD1HJEQpWSAgKCgkREMnK1A9Lk4wICAuJzk4M1RKJDlAICBDJEFZICAqUyZSXCUyJ0AgIURBWQotTSAgKCg6VFpZICAhO0VEX08gISBeICZUVDJEPUcjJEMnK1A9Lk4wICAuJzk4M1RKJDlFOSg+MCAiTFJITwotTSE0QVggID0oPjAgIiInOS5OMCAgNlk5L1tQIDAvQCFMIScgIDgjWSoxVjxOMiw8TyFUWlkgICBYPUVBLwotTTgiIEAhJ1gnTCg9QiYjIFsiQDkuXlAgIl8pW11ZT1hcX0o7XlhPXF5fWDtfTkQqRytQMS5OMCAgNEtBMAotTTNUU04gLyNdTyRZPjNHNS41T19cK0g8TytAIDArUlggIiRBWCAgJSg+MCAiIigpLk4wICA2WTkvW1AgMAotTStAIU8sREFYIEAoTytAICwrUD0uTjAgIEJJOS9bUCAsIyggICAgKCI5UFBPIVRaWSAgIFg9RUEvP09cTwotTSFUWlkgICBYPUVBLyggPE4rT19cM0VZLj00WTZfWzEoVVIjQCtSWCAkIlxOICBBKD4gICIyJ0QgIEBCKwotTTNLRCAgJU42M15cICQiSCA7MCAgT0RKJTlASEAvICAiIik5QCAgIlIyJltfUSJcJTNLRCAgI0ImNCRdKgotTUAmOCAgKVBAK09fNDUoIE8gJFpZICAgTyIlQS8rQCFHICAiJitSW19VIlwnK1A1Lk4wICBCSTkvW1AgLAotTUwqW19VJjlCKkZYICMiUCdXKltfVSIhJiQrUCAiRSomKCQ5IiQkQTUrUD0uTjAgIDZDKTAzUlAgOVMpKAotTTswICQrUDkuTjAgIDZDKTAzUlAgOVIhKDswICgrUDkuTjAgIDZGQTAzVEogOVBYTyE0WlkgICBYPUVBLwotTSggPUAlQlwlM0tEICAjQVY2JFxPIVRaWSAgIFAnRUEvPCAhLFtCI0BfWzEuN0RZVTNFO19NJEM3KC4gTwotTStAIDArUlggIiRBWCAgMSg+MCAiIik9Lk4wICA2WTkvW1AgMCsgIU0gICY6Mkg5RiJCIFwgICgoSFYgIAotTSA4WSg7T18kK1A5Lk4wICAuKDkwM1RKIDlAICE+IiBOX10xNEAiXCAzS0QgICJcKDYkXEogJjwgIDYoTwotTStPXzQrUDRPIURaWSAgIipFRF9PICBSUEtPXzQ5QCAhL0JJTiAgUE4hPVpOX10wQDFRIlwgIEkyQVIhJwotTTBBISg7MCAsK1A1Lk4wICA2QykwM1JYIDlQICEiREFNICEgTyFUWlkgICE6LEUhLytAIUcgICNWMiZUIAotTSUiXCczS0QgICVIUjQkXE4gJjwgIC4pKDswIDgrUD0uTjAgIDZDKTAzUlggOVAgIFNEQU0gIVBPIVRaWQotTSAgITo6JSEvK0AhRyAgIloyJlQgKCJcJzNLRCAgJUhSNCRcTiAmPCAgKjkoOzAgRCtQPS5OMCAgNkMpMAotTTNSWCA5UCAgRERBTSAiRE8hVFpZICAhOk4lIS8rQCFHP0RBTSAiSE8hVFpZICAhOyclIS8rQCFHOyRBTQotTSAiTE8hVFpZICAhOyclIS8rQCFHNkRBTSAiUE8hVFpZICAhOyclIS8rQCFHMiRBTSAiVE8hVFpZICAhOwotTSclIS8rQCFHLURBTSAiWE8hVFpZICAhOk4lIS8rQCFHKSRBTSAiXE8hVFpZICAhOk4lIS8ySCFHJEJcJgotTTNLRCAgI0FWNiRcQC8gICJMT1VAJUJcJjNLRCAgI0FWNiRcTyE0WlkgICBQJ0VBLzwgISxbQiNAX1sxLgotTTdEWVUzRTtfXyJaJytCWCAiIiFOICBQQEFUQVggIEhPIVRaWSAgIUEiJSEvK0AhRiEnICA4IEBAMVQoMAotTTRIPEAhUlhOX19RLjdEWVUzRTtfXiJaJyhGWCAiJEgxOVBQQDtAICwoKEVAKERKJzlAMVAgJiBKPEMiXgotTUA2VC48Q0ZeQDZYKDxDIj5AMSonOCAwMk8gIV80REQwJDRHICtAIVIiS1ohOU0pIiYyICkrQltfXiRZPgotTTNHNS41T19UMi08IFAiKU4gIEEqJDY8QCMhJCAiRjgqKCZYICMhIlwgJ11ALUdQIDgiIVIsK1ohOzA5UgotTS47WiE7UDFQICYgRlcoOEIhTjYhVygnPEFXWFBHKD0yMjEgMTI8IE4gJygqT0glRlUiIU4gIFAwQUQoOQotTSggRSxbQCMgX18xLjdEWVUzRTtfXSJaLSpGWCAiJEg1OVVQQDtAICwjITQgIkY4MCQrUCA/ViEwJCtQIAotTSA2ISAwQSFALyIpLTREVDAkNEcgPEQ6UEA2P048RFpQQDY/SDxFMlBANj88PEVGUEA2PzY8RjpQQDY/NgotTTxGWlBANj8wPEcyUEA2PyQ8R0ZQQDY+XjwgIUAjQFA1ICBJRyEnICA4IDEiJzIgLSpGW19dJFk+M0c1LgotTTVPTzwyLTxAUCJJTiAgQE4rQCAwKCQ9KiQmOUoyJTUuTjAgIEMnITgzUlggOVA4QDFUSDA5RTkoPjAgIgotTSIqMS5OMCAgQychODNSWCA5UDhAMVRIMDlDWSouMCAiS0sxRiwkQVkgICgoSjRaWSAgIiw8JUEvK0AhRwotTSFCIScyQSFGIiRBWSAgKChNJiAiK1A9KD4wICJLSzEuTjAgIEJfQTAzUlhcICAqTk0iIE4gIFBCIC5GIQotTTEoIzBAMDogICAqUlAyXCArUD0uTjAgIDgyQTAzVEogOUEwTyFSXE4gITEuTjAgIEJfQTAzVyAgOCAgIQotTVIiXCczS0QgICUiMDYkXVwjSyImO1A5UF9WICAgOykoPjAgIiIrOSg7T1AgM0tEICAoT1g0JF0oNTRBTgotTV8gIS5OMCAgQl0hMDNUQVkgICgoUFRBTl8gIS5OMCAgQl0hMDNSXCcyJltcICRaWSAgIitUJSEvMEo9KAotTTtPUCAzS0QgIChMVjQkXEwgJlE8IytEICAgICIgICggMSY5MDInRCAgQEMlMiZbXCAkWlkgICIrXiUhLwotTTIlNSg7T1AgM0tEICAoTzA0JF0oPjAgIiItUSg7T1AgM0tEICAoTzA0JFxPIVRBTl8gIS5OMCAgQl0hMAotTTNUKkcyJltcICRaWSAgIistRSEvKyAhKkFGVC4rUDxPK0AgNDNLRCAgKE9YNCRcLEtAICAgICQgIyY4IAotTSAuMSg+MCAiIi1ZKDtPUCAzS0QgIChPMDQkXSJJVEFOXyAhLk4wICBCUzkwM1JYIDxPXl5ANjgqM0tEIAotTSAmIS44ICAgTERBWCAhQSg7T09IK1A9Lk4wICBCSTkvW1AgLDxBQlBANjw2M0tEICAmIS4rUD0uTjAgIAotTS4nOTgzVyNfOCAgIEEkQU5eXkEoPjAgIiFOMS5OMCAgQl9BMDNSL05eX0AgIEA7VDJLRCAgQDtYOVBYTwotTS4wICIhT0EuTjAgICwhWTgzVEpOXl9RTzVCXE5eX1EuTjAgICtQQTgzUkkgK1JbW18kQTUrUD0uTjAgIAotTUJJOS9bUCAsTCpbW18mPDQrUD0uTjAgIC4nOTgzVFpZICAhQDNHI184IShDUzAgIiFPQE8hVFpZICAgWAotTT1FQS8oIDksW0IjIF5dUS43RFlVMEtEICBAO1grUD0uTjAgIC4nOTgzVFpZICAhQDNHI184LVEuNU9fXAotTSgjRCAgQEEkM0VZLj00WTZfXyEoVVIjICsjUCAgQENCK0NQICBARUgqR1AgIEBGXTJLRCAgQEAiOUAgIQotTVYkQVggKyEuTjAgICtQQTgzUi8gICAoKCBESlkgICgoIEY9WitQOS5OMCAgNCkhODNVKiArUCEuTjAgIAotTStQQTgzUi8gICAoKCFGPTwrUDhPLjAgIiIgOS5OMCAgQl9BMDNSXCczS0QgICUiMDYkXTJAIlwgM0tEIAotTSAiXCg2JFxDUCAgIiIgSUcrQlwnK1NEICBAQCozS0QgIChPWDQkXSg1NFpZICAhMEQlQS80SCBPICRaWQotTSAgIE8iJUEvKFwgICBAQC45QDlQICYgICA0MSg1MlxZICAoKCNEWlkgICIrXiUhLysjRCAgQEAmP0AgQAotTT4wICIiICkoPCcwICtQOS5OMCAgNkMpMDNSUCA0RDwsMVAgLDs+KV4gIiFZICAoKCBEQVA9IyBPIURaWQotTSAgITosRSEvKyAhMjFQUScgIFFNWEJQWSAgKCgiR1ggKCdEICBAQCIyJyFUOCJcJjNLRCAgJUhSNCRcTAotTSAlKScjJDwgIVZXQj9AIEA+MCAiIiApKDwnMVwrUDkuTjAgIDZDKTAzUlAgNEQ8LDFQICc7PihMLjAgIgotTSIgWEAuMCAiIiAoJkAgICAgKUBPICJcJjNLRCAgJUhSNCRcTCAiIFkgICgoIEA6ICAgICBHIlwgK1A5LgotTU4wICA2QykwM1JQICgjRCAgQEAiIUggICAgIkArUCBPIURaWSAgITosRSEvKyAgQC4wICIiICgmQCAgIAotTSAqME8gIlwmM0tEICAlSFI0JFxMICIgWSAgKCggQDogICAgIEoiXCArUDkuTjAgIDZDKTAzUlAgKCNEIAotTSBAQCIhSCAgICAiTCtQIE8hRFpZICAhOixFIS8oI0QgIEBAIjMuWEBQL19QM0VZLj00WTYgICEoPjAgIgotTUtLMSg+MCAiIU4xLk4wICBCX0EwM1QqWSAgKCZdJEpZICAoJl4mPC4rU0QgIEA7WDNLRCAgIyA+NiRdIgotTU4wICIhT0EiTjAgIiFPUS43RFlVM0U7X18iWic/QCEoPjAgIiI/OFAhVEMgKEAjSUA0MiBUKCQmQCAgIgotTUxNIE8gJFpZICAiK14lIS80RDwsMVAgJzs9OSg+MCAiIj9BKD4wICIhTjEuTjAgIEJfQTAzVEFZICAoKgotTSAkQVkgICpSUCRaWSAgIiteJSEvKF9QICBASCIgICpSTCIvXCAgKCohQCAiTEswTitPX1wzRVkuPTRZNgotTV9fMEA7QCAoJEJYICNbKDA5QDBAIiYgJjJBQUZdJyAgM0VZLj0wICAzRTtfXSJaJygmWCAjIilOICBAPgotTSYrWDE5QEEqJjY7VjwgIUAiQSAxMjwgMigkRyFEKCROK09fVDNFWS49MCAgM0U7X10iWi0oRlggIiIhTgotTSAgUUAlQkkoOCBAMCU7IDE5UDkyMzRINTlPMSolNjwmNERFKiQ2O0ZEXlggIiIgKSpGW19dJFk+M0c1LgotTTVPX1gyLTxAQCJYTiAgQUYhQlhZICAqTzEkSic5UThPK0AgLCtQPS5OMCAgODVBMDNdIicqRCEqJTY4JAotTTwgIUAqIlxOICBRKDU0WlkgICItIiUhLytAIUYiJCpZICAqTzEmICwoJD0iJCUqJyhcPCAgSl0kKCBVLAotTVtCIiBfX0EuN0RZVSAgICAgJFk2XzxBKFVTI0ArIlggJCJVWSAgKlMvL19UP0AkTTFfX1grNDtfXyRBTgotTV89USg7T1dAMiZbX10kQU4gIEEuTjAgIDxFOEA7QCA4KCpbXVkiSU4gITBKK0AgPCgiW11YJ1glTCg9QgotTT8jIFsiQDkuXlAgIiAiWCAjICAsICQ4IDYgITgoIltdWi0iJipIISpBRl02Ml5bXVsiQSUwPzlJKC9XTAotTStAQDhXO08nOT9JQDAnWCEqSD0qQUZcWCpENEgxTUclJk9QICwrTyw5P0FAKiQqNStDRCAgQEhAPEBCXAotTUA2VCw/IEFAIkQqNStDRCAgQEg8PyAsSjFSQSVXSDg4VztPJzk/SEAxNChQOiAgQCE0U04sLiNdUiRZPgotTTNHNS41T1coMi08QFwiSE4gISBNPjAgIkxTU19dJCpOX19ATTE/X1wyJltdVyRBTl8+ISg7T19UMiZYIAotTSIkWlkgICFSNUIhTiAhQEBLT1dEKiJYICciWE4gITBAK09XQD8gNlBBRiggICsoUC5QSCYzT0wgIEAhJAotTSAgUCAjICFSICg4IEFESiU7MFBAMVIgTl9fIjBBMiIgOCA4QDFSIk5fXyFeICRPTl8+UEwhJiAoKCQ4MAotTUc1Kic0SDpeS09fUDs/KEAxLSdOX18hIiQmIUQoJD0iRCIhJCQrUCAsI0lcICAmWkM2XDY/QCc+QS1KJAotTSsgNEAxUSJcICMhMjM1KidPSDlFXEQoVTIgIUAtQiEnMEkgTC4wICIiQiFeIitKJzswWVoiJiAsKCQ9IgotTUQiUFkgICgqJydIIytAOEoxLVIlKCQ8OlQlKidPSDlFXUIhJDBDITggIiAkMy5YQFwvVygzRVkuPTRZNgotTV9eIShVU1NAKiZYICMiWE4gITEuTjAgIDdDOEAwIiEwJyEgSjFUSkwgIDFHICAmICgkPDBPICBNNEg8SgotTTFWICAgNyg6XyAgUDJINUcgICYuJkw6OVMlLSorQEpZUVZQICA4IDpfICBQNERRQFxHWChNPD1MIiJBWQotTSAgKCouJiAuKidEICBASFQ4IDhIPjAgIiJDUSolJjwgIDU4OlcmI1YySlAgIiZYLiggSTZAJDIgTCpQIAotTSImXCAgKUg6WyAgLCZMOFY/ICAhP0AlQCFBSzI0RE0yQVQ3VD4gUSokRjtSMkg1RiMgUEUgIyFHXktQNQotTTlQKTIzMUtcICY0SDsgIChWPE0zMyRKLDpQODpfICBLOCBIOl8gIE0oIFEkQCJBIDImW19fJyAgLCBQTwotTSAkWlkgICFYRCUhLz9AISlbT19cOCAxMkFVKSwjITAgLCY/Vj8gKl5BRlwkP0ApQCInUCNPSDlOICAiXAotTTI/OVhfJCdOX19RNjIiWCgmTVJZUVYvWjggICBJRyAhRChKUEsgICg7QzleICI5JzggQDpdK0AsNEg9MgotTTJSICpUKlAgIitaIDs+WDpRQjknMkMyWCMmPSBPSElMLyJYKylESDpdJ0AsNEg+XkJWV1Y4IlA6XyAgUAotTSZMOV4gJiAmJk9QICwlKicoIlAgIi0iKjEoIl5AJldOP0AhQCEhSzM0SD0nXSdALDJBLUZdJEolOUMwLAotTSkwIFA5X0pcJTY8SjREVUApQjFOICBASitAIDAoITFeITsiJzhAI15RQyBbIkA5Ll5QICJfRzteTy9aXAotTV9JO15LL1pMMEE1LFtDU0BfXiEuN0RZVTNFO11XIlVZICAqUy8vX1Q8QCRNMD9fWCs2WCAkL19cMiZbXQotTVckQU5fPiEoO09fVDImWCAiJFpZICAhUjVEX08gISBPK0AgOCtSWCAlJEFOXz4gTytAIDAzS0QgICYvOAotTSgiWCAmJFk+M0c1LjVPX1wrUlggJSQqRytSWCAkIlxOICBQTytAICgzS0QgICY2TjNFWS49MCAgM0U7XwotTVwkQzcoLCBKO0AgLCsiWCAmIVhOICE8LCFQIFA5QDkqQUY8ICAsWEI7QCAwPEAmI0QyIU4gIEBAJCcoIwotTUwoJUI3QyBbIkA5Ll5QICIgIEAgTCAhMCAkQCwhUCBVOzAgIEhAUCcgIzVOMCRKJjlDUSpLMCgwO1AgIAotTUQkJ00gIFBAKzAoMCQjIChfVEcgP0MiMEFXKCEySCFMIiQyIFAoJSRAJiAiUCglKkAmICwySlQgISY5QgotTTggOSpLMCAkOVVITiswKDA0WDxMIVYgLDJIPU0kQSpcICMhM0FVLiYwXzVIIyBQMSAjRUdaREonOzA5MgotTS03QCw4JCg7PyAgUSAgUEA7QCAoIypAICAgICEgIDFGIUUqTSAgQUAqJEpNIEEhTyJCIE0gQSA7TyAgUAotTSIgUTJLMCgwOCEpKkswKDA7QFA7PyAgUCAgUV4gMk0nIEEgQCswKDAwQzQoIyRTTigsI19cJFk+M0c1LgotTTVPTEwyLTxYUCNVXCAwI11eI1VcIDAjW1wkQU5eXlEoO09XWCtSWCAiJFpZICAhXkJEX08gIFEqS09PTAotTTpCISg7T09KKCJbW1skMiAgSCAgIC9fXytQISg7T1dYM0tEICAnUlYzXlwgIyRBTl5fISg7T1dYM0tEIAotTSAnXyo0JF0qS09PTDtASSFbT09QKzRDW1kmIVQyJltbWSJcTiAgUE8rT09MMidAICBEQU5eXyEuTjAgIAotTUAzKS9bUCA0KCJbW1kmPEg/QCZQQVY5KitSW1tbJEFZICAoKjckQU5eWTEuTjAgIEJPIS9bUCAsMiZbWwotTUUkQVggIilAKCJcTl5eUSg+MCAiIkclKDtPTSQzS0QgIChLUDNeXCAjJEFOXlQxKD4gICwzS0QgICgjTgotTTQkXSg7T00gKCZbW1knICAsIkAgIEQnUCJAOVAgIyBIX19YTyAkWlkgICFYRCUhLz9AIStbT00gOCAxMgotTUFVKS0jITQgLCY/VilGWCAkKU8tPyAuXkFGWD4wPzlZKC9NICtAQEgyVCdOXlQhNjIiUCgoJDw4VCUqJwotTTREVl5BRi9UKCZbW1knICAsIkAgIEU2ICtAIU0pTi4nMD8vOCAiUCgrUDhAO09PRDwgIFAsJ0AmK1AhLgotTU4wICA+KSEwM1VBLTYoOTVBVktCMEMvOCAiIU4gIUBAQzIhTl5eMFAqICAkMiwgQDtAIDQoKCEhW09PUAotTSgiW1tZKyIoOVBITyAkWlkgICIgVEVBLzMuWFhQL0xMM0VZLj00WTZeUjEoVVIjXCpGWCAlIkhOICEgTAotTStAICwrQlggIiIhTiAhQSJEIiEnMkpAICEmOFQ/QCBIIzYgKigkMDBPICBQNEg9MkErWiU4XykhXTdAIAotTSpAQUAiQiElJCtQICwlKic0SDZeQUYvUigmWCAnIiInOCAgIj1DVVwgMCNdXiNVXCAwI1tcJEFOXl5RKAotTTtPV1grUD0uTjAgID9ISS9bUCAsLzZbW1tPV1w9ISY0S09PTDxAIFIrT1daWjhGNEA0UFwoICggICRUMQotTTxBI0JKTTImTSg1RCBCMCUrQDZcQVYsIitAOSwvJ0AnICAtMjpAOicgIDpEVScoMFhKPTJBVDInMiZbWwotTVoiXCcrUCkoPiAgKjImW11eJFpZICAiISxEX08gITBAK09PSDlSOV4gOyInOUQ4TyBEQVkgICgqQURBTgotTV5ZQS5OMCAgQk8hL1tQICwyJltbRiRBWCAiKUAnQlwiMidEICBASjwyJltbMiRaWSAgIipcJF9PICBRKAotTTtPTSgyJ0AgIyRaWSAgIiBbRSEvKCZbW1ogUUhfXyAgISZZViwiQCAhJEMgMSghSiEnWC9UKD9IQCJAIAotTT9AIVwgJiAuKCZbW1okSVA6IDlGIiUqJzUoOl5BJldOT0gxTCJCIU5eXkAgPCAgITJAOE4hIlAkWFg4SgotTSEuLiUoIDowQTJIIDghIEA7T09ILDshSCFFQCY0SD00QTUyJigmW1taJyAgLCJAICBLWiA5Pio5OiAgIgotTSgmW1taLkYkVjZAICEiIU5eXkEqOiAgJDsjISg7T00mLCJAICEkQyAxKCAiQCAgIF9fXE8gIlwoM0tEIAotTSAnUlYzXlwgIyRJTl5UOUciQiFOXl5AIDogICEgIDkoO09PUCtSW1taJFpZICAhX1JFIS8/QCBeK09PUgotTTRYPEwhXi4mMD85SSgvT1YrIEFAISUuJzU4OEAxREkwOV85KDtPTSA8ICBQLUdMQF5fOE8gJFpZICAhWAotTUQlIS8+QCEhW09NICsgQUAhJSolNEg4QDFAUDAgIyFHXSdQID4gLlpBJlhCMD85OSgvTSAqQEBIIzQnTgotTV5UITYyIjgoKCQwQjExIjE0SDUyQUUqJE5ILUNcJS4nOlMrQ0FUJ1Y+MiNbXUJYKDA/NUggIkgoMD5bWwotTV1CQCgrUDRAMVcgICwhIE8gJFpZICAhWEQlIS82KDk4QTU2J09IMURZJChVOiAgQDtAIDwoKDhAO0AgOAotTUUoOEBARCdOXz9AQCtPT0hMKEFHIkJcIDNLRCAgKCMyNiRdLFtCI1xeUjEuN0RZVTNFO0owJEM3Li9QRgotTTtAIDArQlggIic4UDBKW19fIiEnKVUgICEiOkggIDAsSiAgICAgKCAhJjwsIypAICAgICEgIDFGICA5PgotTSomWCAjIFJMICAgIiAgICg7ITAsSyAgICAgJCAhJjg2IypQICAgICEgIEFMIyIhTiAhMV4iKF4wOCAgJgotTSwkJ05fXVBCMVMgXCAgPEBWNScoX19RIVtPXzwwXltfTyMgXCAgPEJWJScoX19QLEtPX19fX19fWSZYKAotTTBKW19YJiAgIDJQLEtAICAgKV9fWSZUKDBKW19QJiAgIC1YQCtPX0Q8QV0qQCZQKDEoIyBANDIgOCArIAotTUA3WD9MKD1GMSIgTl9eMTJAJkgiVCg/SkAiUCA/QCErW09fKDggMSJHNSonT0g5RV4nUCVPSDlMICAiMgotTVk4PSFdR0NIK0BBIVtPX0gwPkAgJSJQKCgkPSJEJUInT0g5RV1GIVIoIltfWSUqIDpAMV4nXSInWkggTAotTSAnWCAyXltfUiYgJDBJVTJBW1omOT9AQCtPX0Q8QV0qQCZQKDEoIyBANDIgOCArIEA3KD9ESCFQID4uQAotTTRYIE4hTjYnUDs5WFIkOiBQOzlYWiUqJitAOVwhO1omOyFTRUFUJ1Y+LkBOIiQnTl9eQSFaICA0KyBAQAotTTFUKjA2KD5eQUY3VjImW19PJFpZICAhUzolQS8ySltfWCY8ViMqUCAgICAhICAxRiIiWEwgIEEyQVYgJgotTStDUCAgIS0kMiZbTDwkQU5bJzEoO05RWCtQPSg7T188M0tEICAmPFAzXlwgJSYgKDBKW0w8JCpOWycwRAotTStOUVBVKltMPSdAIDJKUCAhJjgmMkpQICImUDQjKlAgICAgISAgMUY6QiBMICBBMkArIiI7ViAsSyAgIAotTSAgJCAhJjg6K0JQICIlMidHSCgsQVAgICBAIUMhQlhcICAgIiAnUCE4ITleICJQTCAgQTRBQFImICAgIgotTSAmLCYrI1AgICAoIDImW0o6JEFOWkZRKDtOSVArUDhPIVRBTl9bUS5OMCAgOi4pL1tQIDgqIltKOy1CTgotTVpGQCxLICAgICAkICEmOCAgQCBKK05RUE5KUCAiJlwkKkJQICInWCAySDVPJyRPSyAgUSFbTlFYKyBBIQotTVtOUVhWSEBAMUFLMDRIPTJBS1IlOT8wSjtOUVBWXltMPStPTCAgQU8hIklMICBCXkM2UDgwPkwgIyJQJwotTVcoQztSIiEmJCtQICwlKic0SDpcQzY3Uk9KUCAiJjggICowRzFQKDAoICowQVI9ICAgQl5ARlEsT0pbTAotTTwmMColQzlZKC5RWDRIPUAgRzhQMD85WSguUVgrIEFAIktaTlsnIUQjJSonNEg4QDFAUDAgIyFHW0taTgotTVsnIUQhR1ghKzQ/X18kSk5fXCFHICAkTj9AJE0xX19cOCAgISkkSk5fXCFHICAkPDJKW0o7JlwmPUMhXAotTSAmICYlQltKPCdQIStAOSFdRkRAWkcgTCImIChPSDFMIyUqJzRIOEAxQFAwICMhR1wrWiQ7ICAgWidYIQotTSs0P19fJiAgIC1YSisgIChGSD0qQVY4Pj8gIStbTklQOCAxMkFFKS0jITQgLCY/VlZIOzpLTklMVypbSgotTTsmICI/ICJaQSZcIipAMEAhNDIgKVQgICIrSk5aRlFPIUJATlpGUUAgQkAlTygxTCRET0sgIFM7UVFLXAotTSAjITJBVSomTygxTV0rUiU7IUkrWlAgLFZcPEAhSSJOWkZQOl1AREBaRyEyQVUqJk8oNU1bKVJOWkZSXAotTUtOSUg7I0kqQUZQJD1DIUAhQThWOjIjSjwlKiY6QClcICRPVjoyI0o8JiAqTypbSjomUCo0SDkyMzBQNQotTSAjIUdcK1JOWkZBTChHUCErNDtfXyYgOjA+TCAjIlAoVyg9QCJCISYkK1AgLCUqJzRIOl5LICAoOz8gRwotTTFQKDArUltfXyRHIytQLE8rQCA0MiUtKDUkWlkgICFGKCYgICBDOSpLICAoOzAgISdCICJUKlAgIiBSIAotTSAgICIgJlAgXl4xXiAkT0sgIFEhW05RWCsgQUAiIiEmJk0hMkFVKiZPSltMPCY3Uk9IKUwmRE9LICBRIQotTV03QCArIEM7UEIhJiQrUCAsJSonNEg6XEM2N1IqQDJYSyAgKDtQMEorICAoTkpbSjsmXCYqIltKOyYgIgotTSogNVwgJEokO1EpK1pQICxWXDw6XyAgUDRIPTJBS1IkOz8yXEE2UDoyXkwgIy1PJyggOjBLTklMJk84KQotTSguSVA0SD0yQUtSJTs+UStaUCAsVlw9QCIhS1wgIyEyQVUqJk8qUCAiJldSKVQ8IiQpMicpVCggIilSTgotTVpGUE4hS1pOWkZBTC8kSic7IDFWLCYgJiVDOVkoLklQNEg9SiBHWCAwPzlZKC5JUCsgQUAiS1pOWkZBTAotTSMlKic0SDhAMUBQMCAjIUdbS1pOWkZBTCFHWCErND9fXyJcTl9fUSlQUlwjK1JYICUkQTMyJTEuTjAgIAotTTlCIUAgICQyKyJQICIkMiYjKCggICAoIDsgI1pSIFImICAgIiAmUCBeS1pUQUZYWk0oOUYiIThOWydBXgotTSA2ICQ9QyFeICRPVj4yI0w+JiAqT0pbTDwmMCo0SD0yMzBQNSAjIUdcK1pOWychRCFHWCErND9fXyQqSwotTSBBIUA7R1ggMD5MICMiQCYyXltMPiJIKDggQEAxMSI9NEg9MkEyIE5bJyIwQStaIDk+WV4gJE9LICBSNAotTUFCSCI4IDg6XyAgUDRIPl5BNldWKVQ8IiQrWk5bJyFEKyE4Vj4yI0w+JSonMl85WSguUVg4IEpeS05RUAotTTkgSTJBVSktIyE0ICwmP1BPSltMPCYwJj9AJE0xX19cMkpbX1AmPCY/QCRNMV9fXCtSW19fJEcjK1AsTwotTStAIDQyJS0oNSRaWSAgIUYoIlhLIEEhKVpQICxWPD1AIUFDXCAjITJBUiBLIEEjMEFLWiA7PyEiSlAgKAotTSlUPCIkJChTPiBRLFtDQ1xaRCEuN0RZVTNFO19VIlotKkZYICQiIU4gITEiRCIhTiAgQE00L19YKzZAIAotTSEvX1xaPlggID9fWCpUICAhIlxOICBBLk4wICA9LCE4M1JKICghNVIhOyIhOEEwUC5QSCYzT0wgIEAgUAotTSAgUCAjICBQICMgICwkQU5fX0EoO09fODNLRCAgJzVYNCRcTytAIDQyJTRPK0AgLDImW19WJFpZICAhSwotTU5CSU5fXTEuN0RZVTNFO19PJEM3LiwgSDtAICgoJlggJSQqMD9AIStbT19QMD5bX1wkJ0ggISBMIiJLVAotTT4gIThBW08mOT85QCUjIFsiQDkuXlAgIiAlICArQCBOICUgIDQgITApRlggJC5HTiAgJ19cIj0gICAxKAotTTUkWlkgICFWSEVBLylIIEAkV1glTCg9Q1JEQTQyJltfVCRaWSAgIVcxJSEvK1JYICUkQTMrUlggIyRBTgotTV9dIS5OMCAgOltJLFtDQyBfW1EuN0RZVSAgICAgJFk2X11BKFVQI1goJlggIiBSSCAgICAgQCAkOUAgIQotTShHWCA4IEAsMVAgJTkgUTIxVyAgLCA9KkwgUCw5XlgsMVAgJTkwQSJKICAkOCAgIF9ESSc5VUkiS09fXAotTT5AIFohV0AlRig2M1I2IC5XKDRBTCZQLEYgUTJLT19cNiRETCtPX1xPKDFFWkBSTiAgICAhP19cOyFTRQotTUFCVSZfXzBAK09fVDBLICgjJUJOX18wLEtAICAgITNfXSZXSjwgIFAhXk4oRDpAICImICI0RD1QICMgJwotTTxAMjJAIikhMksiPCMmP04wRltfXkJYSCAgUCxBUCAgX19dQiInIDBYOlxdMC9fWiMoPCBfX19fOEA7QQotTUNVIU5fX0gsQVBfX19fXUIhTkYvNiZbX15AUicvX19fX1YoJlk4XTQ7T19aIyg9X19fX184QDEyO09fWgotTTwgIFArT19aRDpAICIgUU4gICdfXkY0Tj8gISpCNlRIPCAgUCtPX1o9QiI2QCJYKVk4PSNcJ0AsKkEkUgotTStPX1pYWlRIJD46TEMoNEJBQlAkNjg9SllEU04gL0NfViRZPjNHNS41QCAgPCAkUitAICpYWiIhTjAgIgotTUxUMS43RFlVM0U7X10iIU4gIEBNNC9fWCs2QCAhL19cLCJbX14gKSA/XyFGJkIgTl9fQCJAICAvX19dRgotTSJESk5fX1FGIScgIDgkMVAgNiEgLCJbX14gKSA/XyAsMCdfUDlDIEArT19YIEggICNfX185QEkqS09fXAotTTlAMVAgViA8KCJbX14gKiAgIF9fX1BSICAgMCAgJjQkPCAxQCFHICU4IClQIERZPjNHNS41T19EMi08IAotTVwnUCAoQlggIyIgTiAgQV4jLSInPiIiOEAzIVwgISMxUCJYMFhaXEokLkJNQyg8QEFCUCU2NEJRUCYzTAotTTMuWCBcL19EM0VZLj00WTZfXyEoVVIiICpGWCAiIiFOICBQTTQvX1grNkAgIS9fXFo+WCAgP19YKkggSwotTTtPX1wgISFeIiQqVT4gUThBVyg0T0glTV0jIE5fX0AiMCdfUDlWUFArT19YIEQhX1wgUSA/XyFHICAiMgotTVo+WCAyX19YISggICAgL18qVCAgIidYIipUPCAhIiBOX19AIkAgIC9fX1wgQCAgMCAgIEswICAsMidAIAotTSJUQTUzS0QgICc0WjQkXUAmJEpOX19RRjcnWCMqVDwgISYgKjJKW19fJjg6MEpUICEkU04oKCNfXCRZPgotTTNHNEArT19YIEggICNfX185XiFeIEJNJyAgMEs/L19fXyBUICIiIE5fX0AiQCAgL19fXEswICAsMiU1LgotTU4wICA8VkE4M1YjIigiW19eICogICBfX19WPj4oIltfXiAqICAgX19fUEAgICEtRyInWCQqVDwgISYgMgotTT9AMEsxUCAkMidAICEkWlkgICFUSkVBLygiW19eICogICBfX19QIiAgIEAgICYgIF9UWS41T19AMi08IAotTVAiKU4gIEFcICQnTl9fIE4iJCdOX18hIVogIDAoQEBAMVIiUTogIThBRUInT0glRVxDIE5fXyAiMCdfXwotTTlUSFArT19QIEQhX19QUSA/X11HMUcgIjgiWVAhJiBKMkpbX10mOF4ySltfXiY4WDJKW19fJjhSPCAtQAotTSUkSk5fXzFGJ0RKTl9fQUYmJEpOX19RRiRHICAzLlggUC9fQDNFWS49NElOX18pR1cnICE4LlEqO09fUgotTTlbUVAgIyBOX18oLEAgICBAICFESkcgJTgtMS41T188Mi08UFgiQU4gIFFcICQnTl9fIE4iJCdOX18hIQotTVogIDAqQEBAMVIiVDogIThBRUInT0g1RVxCSU4gIENJW0AgIV9fIEpAIk1OX18wICQiTU5fX0AgJSJNTgotTV9fUCAmJ1gwMEs1WCMlQic/ITJeQUZXVCwiW19cICkgP19dRzgjIE5fXyAiMCdfXyMkIV9fVjwgIChJUAotTSAjIE5fXyAiMCdfXyEoICAgI19fKlQgICInWCIqVDwgIScgICwiW19cQCIgICAkICAiTSAgIFEoPiAgLwotTTIlNS5OMCAgPTNJMDNWICw/QCxLMVAgJDggMSJLMCAkMy5YUFgvXzwzRVkuPTcgICwiW19cSCJOX18yIAotTUtPX1hAKltfXyY/Pj9AKEsxUCAkKldTX19cIDEgIEFQICMgTl9fKEswICAsMiU1Lk4wICA8VkE4M1YiXgotTTwgIFArT19SQCpbX10oIk5fX0IgS09fXDlZWCgrQCAnX18pRyInWCQqVDwgISYgMj9AMEsxUCAkMidAIAotTSEkWlkgICFUSkVBLzwgIFArT19SICQiICAiTSAgIFEoPiAgMDggI183ICAgICAgICAkWTZfXzEoVVAjIAotTT8gLEA7QCAsL0JYICJHICAsIDxOICRRXCAgJCAgICAqPCMjMkAhJiE4ICEsPycgJyAgICAiRScuX14hLAotTVtAIyBfXzEuN0RZVTNFO19XJEM3Li9RXCAnQCA+QCBIO0AgMD1AIFYrQCAqKSAtM0BCSU4gIFFALCJcJgotTSggKjBBUyBUIkAgIkAgICBfX1xPICcgICwhNE8gJFpZICAhWV4kX08gIFBOICtaJjkgKTIxIlAnNEg1NAotTTMyWCVPSC1FUkI5TiAhMFAvL19fUCQ4VkAnKDBYSlhXMUAgIi1UMCAhJFNOLi9TX1ckWT4zRzUuNU9fPAotTTItPFhfJ1ggPiAhXCAiQU4gISFWICM4TiAgSEQgVS4iKkZYICMmIFgrUDxAIEkiJSwjMCogICogICAjXwotTV9SXCA8ICBQJTJcIDNLRCAgJ0dYM15cICMiWCAjKD5SVCVYIDkwQTIxIDInTE0hPiAlKiY1JFRKIUtKIwotTTk8KEY7QCA0KCA9LD8gICEgICBHJCM6ITMnUVAhUCAgKVEgQCFUUVwgICQgICI8MC1UJCAgRFFcPCA8IAotTSAiPDA8ICBQISQyIFk4QEIgLSohVCgnMEFTPSAgIDEsW0NDXF9dUS43RFlVICAgICAkWTZfX1BQK0AgKgotTVAuWCAjTSJOICEhLjdEWVUzRTtfXiRDNyAoMV4gI1hOICBLPktAICwoID0sPyAgICAgIEckJygwWFpBLAotTT8nICIgICBHJCgiIjMuWCBBL19YM0VZLj00WTZfX0BOQVJYTiAgQUcmIiFOICBRUCAjIDBXSCBQLy9fXwotTVAkPFBQJygwWEpdRlsiWE5fX0EuN0RZVTNFO19eJEM3KCggTitAICg5UjBKO0AgLCtQPVAgIyA1K1AhLgotTU4wICA+QFEwM1JYICwjU19fXCEnLkwhUiQuKk85TiEsW0IiIF9fQS43RFlVM0U7X14kQzcgKDBQK0AgKgotTVAuWCAjTSJOICEgTiAkUVwgICAgICI8MDxBI0NKJFFcPCAoICAiPDBAKCksW0AiJF9fQS43RFlVM0U7XwotTV8jIE4gIEsgW0AgLjNFWS49NFk2X19BKFVQIiQsIlggIkwjTiAgWE4gJFFcICAgICAiPDA8QSNDSiRRXAotTTwgKCAgIjwwQCgpLFtAIiRfX0EuN0RZVTNFO19eJEM3ICgwXitAIC48ICBQK0AgKltaQzBLQCAwK0AhLAotTT8gICAgICBHJCcoMFhaQSw/JyAiICAgRyQoIiIzLlggQS9fWDNFWS49NFk2X19QUCtAICpQL1BHJC0iTgotTSAgUS43RFlVM0U7X14kQzcgKDFeICNYTiAgSVIkLi5PV0pYICMiICczJ1AgICAgIClRIVIkLi5IMydRUAotTSBAICApUSIgQERTTiAoM19eJFk+M0c1LjVPX1gyLTwgQSJYTiAgQEAhVFFcICAgICAiPDA8QSNDSiRRXAotTTwgKCAgIjwwQCgpLFtAIiRfX0EuN0RZVTNFO19ZJEM3LC8gSDtAICguIlAgIEdYID8gIStbICAmPkAgWgotTStAIC48ICBQISJAIDgiME8hUlwlPCAgUCUyXCAzS0QgICdMQDNeXCAjIlggLCNTX19cIScuTCFSJC4qRwotTTRIOlxBJjc4Mkg9RylET0wgIDhKIU4uJVZcNE8hVFpZICAhW0lFQS8rQCBQLy9fX1AkPFpQJSomPEEjQgotTUlWO0QuNDggIERTTiwvI19ZJFk+M0c1LjVPX0QyLTwgXiIhTiAgQF4qICAiPkAhXCAjOE4gIFkjWiAgJgotTT4gIFghViA4P0AgXiQ+Pk9XSDRQLy9fX1AkPFJQJygwWEpcSiFVKiZPKDFFWSRKJTlQUFAvL19fUCQ0UQotTUAmSCY0SDhRMUAgIjMuWCBeL19EM0VZLj00WTZfXkEoVVAjVChGWCAiJ1AgPkAgWiowICI0WDVLLiVRKQotTStARVAgIyBOICBZWCQpQiBYWDc6QVIpJSpAPV4gI1gxWjpdVCQuNk5XSDhAIVcoMFhKQFJAIConICAjXwotTV9SUCc1NEZTUTYzPigmWCAkIyImMy5YIF0vX0gzRVkuPTRZNl9eQShVUyNAP0AhXCAiQU4gIEErWyAgJgotTT5AIForQCAuOCIwTyFSXCU8ICBQJTJcIDNLRCAgJ0pIM15cICMiWCAsI1NfX1whJy5MIVIkLipHNEg5UAotTSAjIEwgICpcQCY3MjJIPUcpRE9MICA4SiFOLiVWXDRPIVRaWSAgIVtJRUEvK0AgUC8vX19QJDxaUCUqJgotTTxBI0JJVjtELjQ4ICBEU04sLiNfWiRZPjNHNS41T19EMi08UF4iQU4gIEBeKyAgIj8gIEorQCAwMl5QIAotTSFHQCAuIlggI0c4IC1APUApIlwlK1AxUCAjIDUrUCEuTjAgID4/QS9bUCAsKkAgUC8vX19QJDRaUCcoMAotTVhKVTJBS1IjOT1BKkE2PCwsI1NfX1whJS44IUohRSomLjQ4ICBEU04sL0NfWSRZPjNHNS41T19EMi08UAotTVwiQU4gIEBYKyAgIj9AIVwgJE9MICA5WiAjSE4gIFlQICMgJCogIUApIlwnK1A1UCAjIDUrUCEuTjAgIAotTT5SIS9bUCAsK0AgUC8vX19QJDxaUCcoMFhKXTJBS1IkOT1BKkFWPEYyXlAgIUJIJlhYNztRMlwnM0tEIAotTSAnTkY2JFxOICMgXF9fXyAxU0sgNEg5UiQuKk85TjBZMUAgIjMuWFBcL19EM0VZLj00WTZfXUEoVVNDIAotTT9ALEI7QCAoMl5EICMnUCwrNDtfXy1PJjggMTNBVUUtMkk1R14iOU4gIFEqQVZVIDA+RCAjJCpOX18wQAotTSFeLiBEKltfXSJVIF9fQEoyIlAnWTg7PEIiIE5fX0EpXFBIJighNCJAICAgX19cWEAiID08QSNCSiNFIAotTSAgKTVLT19YTlw5Q1cuLic1KDxXMVAgIjJGTCAhRjhILidQICAzSVwgIClAI0QnSyAgOFFMXUAmVi9ZMgotTTMlMS0oIFFSICMoSyAgKlBANjdGNFZMICBCIEkgIEEyQCcoICxCTCAgTkYpRCgkQDtAIDAoKCEiOlAgJAotTTMuWFhQL184M0VZLj00WTZfXlEoVVMjQD8gIEg7QCAoK0JYICMkT0wgIDlAKCJcJzwgIFAlMlwgM0tEIAotTSAnTU40JFxOICMgXF9fXyAxU0sgPEEjQktVKiY8ICBQKyAgIk8oIUVVREonOVI5K1sgICYqQDtDQT1PJQotTStQPS5OMCAgPlo5ODNSWCAsI1NfX1whJy5MITJBRygwWEpdRlkjRSYgICksW0MjQF9eUS43RFlVM0U7XwotTVwkQzcsLCBIO0AgKCpGWCAjJCdMICA4TCInICAsIlAgIEIhJiwjICpfQCogICAjX19YI1wpUSEoMCNNIAotTSAgOVAgIyBMICAoUiswICZMRyAqX0Y4KC5XUCAgMCAiOCIgWz8gICIgIClQICMgTCAgKEAxQyBQIk9YIgotTUAgICBfX14gXyI8MC5UICAiJ1ggL0JQICBFNic6UVNDQV1aJigkPVAgIyAwK1AhKDU0WlkgICFfNCUhLwotTTU4Pl5BRjNIP0AhQCQkKkcyJTUuTjAgID9VITAzV1AwV0g4UCsgICQyLCFcJCkiJk9IIU9YQyBMICAxKAotTVArIic7UUhQKyAgJDIsIjBBUCogICAjX19SXCAyJTUuTjAgID5dMTAzVClNICAxLFtDIyBfXyEuN0RZVQotTSAgIS41T19QLCJYICRHKCAyRCFHJCIhTiAgUEI7QCAoLE1BMjA7KSA5P0EuN0RZVTNFO19fIlotKkZYIAotTSIkQTUzS0QgICMgPjYkXEo7T19cM0VZLj00WTZfViBDW0AgKCAgKCAxIlxOICBRKD4gIE8yJ0QgIEBLPgotTTInRCAgQEpUMiZbXzgkWlkgICIqXCRfTyAhMSg7T11AM0tEICAoU0A2JF0uTjAgIEMhIS43RFlVM0U7XwotTTokQzcvL1BKO0AgKCoiWCAlJClOX19YTTM/X1gySDFNIkdbXys0P19dJiAgIC8xJEEkKk5fXzFAICAjSgotTS83UCAiT19SLzdEICBHOS5fXlBdPjAgIkJNI19bQ1VZICAoUFNPX1ArN1AgIEc5MF9eIE0/ICAiQk0rXwotTVkiVVwgIChQVC9fSDBKW19VJCpOX11BIktPXzwrN1AgIEc5Vl9cQE0/ICAiSD07X1MiVVwgIClWIi9fMAotTSggMTJAJkgiNUgjREAlMiAvNCNfUUYgICApIF0/ICAiX18oXT4wICI9QlNfWyNVWSAgKVZGT19OLzdEIAotTSBATTRfXyBNPyAgIj1CW19YIlVcICApVkcvX0QrN1AgIEBNNl9eQE0/ICAiPUNDX1IiVVwgICopOE9fLAotTSs3UCAgQyIwX10gTT8gICI9RDNfVSJVXCAgKiomT184KzdQICBDIlBfXVBAISUqIDpAMV4jXSInWighNAotTUAjVSBfXDlAJSIgTiAgUV4gSyInOVAjXyNHWCpMKD1HIC9dVCsiWCAkJCdOX15QTiIkJ05fW0BKIiQnTgotTV9eUTwyIkAoKCQ9UCAjIDAoQDksMCEgICgkNFBAIiEnPCAgUCQkUSA4IDk0QTUyJ09IMUVXR1giKzQ/XwotTU0nQCQwPzkoTiJAKDggUEAxJEkwOUBRM0tPXlQ1ODEqS09eVDsuWSpBRlxSK1A5UCAjIE5fW1BPICcgIAotTSwiW19OQlwgPCAgUCtPXlgrUCEoPjAgIiJOMS5OMCAgQkogQDtAIDg/QCRAQVYgICE3OFwrMCAiMD5bXwotTU4iWCgwPltfUiJIKDA+W19OJVEoKiBAQDFXICAsISBAMTIhMDA/ICogIiknPCAgUCQyKSUoRSUjXDBIIAotTSwiRCAgSSEwVyQhNEFVQiVPSDFFVStRTl9cOUQhI1UmX1w6XDU2KCgoJlggJiIiLTgnIVggI0AmISgwIAotTSAgJCBYWFAmQSAgICBAOE8hJFpZICAgTyIlQS8qICFGIkIhTiAhQSJEJiAgIS8oQDtAIDgoKDFQICMgTQotTSAgKE8gJEFNICA4QDtAIDgoISE8QCJcIDNLRCAgKCJQM15cICMiIU4gIUBANCMlTSAgKCAgQiFOICFAQAotTTQjJU0gIDAgISIhTiAhQEo0I0omMEpbX1AkSk5fWzFLICAxJjwgIFArT19SKzQjX0QnICAsIltfUUJVIAotTV9aISFbT19AKzRDX0YkP05fW0ElW09fKDA+W19VIlUoX1kxKjRWPCAgX0FQICMgMyglKFAsIEgiIEggIAotTSAvX188QCBSJFIhMixDIDogICohICAjX19ZIiErNCNfTCcgICwiVCAgQlUgX1pRKktPX1Q7IlFALkMgTQotTSAgMShQJDIgOkAxXiNdIidaKCBNMC9fVDgiMFArMCAkMiwhJEAmSCI1SCNEQCJVIF9fMUAkIiBOX1khXgotTSBLIic5XFFeIksiJzldUCw7QCAiX18pRipHICAsISxAO09eNCglISFcIEggLCEjMTtPX148ICBQJFIhTgotTV9ZMEA0JCdQIkAgUCQuRShUNlQgISBSTiAgICAgP15QOVVQLEtAICAgICdfSyY9RigiW19EJ1giTCg9RwotTSAgIzA/QEpQQVY8ICAsWUAgICMwPCAgUCRSXCAyJTUuTjAgID9AMTAzViAgIFExIklXICAsISxAO09eOAotTSglISFcIEggPCAgUCQiXCAyJTUuTjAgID85QS9bUCAsOCAgIltCIE5fWSFeIEsiJzldIV4iSyInOVs5QAotTSAgKzovIlQgIUJcTl9bIVAgIyAzKCUoUCwgSCAgSCAgIC9fXygmW19GIiEwMicgKiAkQU0gIDkuTjAgIAotTUArIS9bUCAsLlZbX0xAICIoIltfRCdYIkwoPUcnJ1gqTCg9RiAgKjI8ICBQIUJcIDIlNS5OMCAgPzE5MAotTTNWICAgR1kiSVcgICwgOE8gJEE1M0tEICAnVjgzXlwgIyYgICBGOSI7T15KOCA4XT8iPDBfWkhAK09eTAotTUwqW19MJjQkKCJbX0wlOiBENltfSkJATl9aUzhLT15QMD81KiFEKUhfX1hMISU2JjpQICFNJyAgLCJbXwotTV9CKE5fXzIyQCJVIV9ZUFYhIjBOX1pRM0BCQCZYWDBOIUlaTl9bITJBUkgiPCAgUCRSITIsIyAqICAqIAotTSAgI19fUkFOX1lASDUkR1QiQCJcQEZQIipAOSpBVlAgIC0pXiAmICAgLFEoO09eRCggOjBBNEFUIkAhKAotTT03SCZGSD0yQTAqJSAgI19fUlwlM0tEICAnQy4zXlwgJCRJTl9aQUcmJCdVMiA5KDogICQ8ICBQK09eSAotTStQIS5OMCAgPkQhMDNUSU5fWjlHICAiMjA/NSghREFIICApUCAjIE5fWjhPICRaWSAgIVowJSEvOCc5KAotTTtPXkQoIDowQTRBVCJAISg9N0gmRkg9MkEwKiUgICNfX1JcJTNLRCAgJ0UoM15cICQkSU5fWkFHJiQnVQotTTIgOSg6ICAkPCAgUCtPXkgrUCEuTjAgID5GUTAzVElOX1o5RyskJ1UyIDkoOiAgIjwgIFArT15GK1AhLgotTU4wICA+RlEwM1YgMigiW19EJygiTCglRyAvXEw8QEpQQDY+KjI/NSghQ0JOX1owXiBXICAsIC0hXTBIJgotTTJGQ19fRjgkL0AtMzFbWU5fXDlDIycgICwgPjBLT15ALkAhQCBHSCAoIltfUCsiTl9bMUYwIlgmNSg9UAotTSAjICVPSCFCLSMgTCAgKlA7T15KOEJJUCAjIEwgIClSICMoNEAoJUcnI0gnMkpbX10mVCZPSltfRyZYLgotTTwgIFAhMCFVICAkKiFDUCU4IFEzQUU2JDJIOUogL1lMPyAgQCtPXkxUKltfTCNNICAgKVAgIyBNICApIQotTV0wSCYyRkNfX0Y4KDRWVCAgRiAiNEQ5UCAjICYwPzQqIUJYKDJFIUdcJEkmOVQpWCAjQCY8ICBQKzAgIgotTUQoME8gIlwnMiZUICFEWlkgICIgTCRfTyAgUj07MCAiKCJbX0QnWCJMKD1HIidYKkwoPUciJiAuKCAzSQotTUImICQoIDNFQi0lTSAgMTJLT18gNSRNOEtPXjQ2JEk4S09eOCgiW19QKyJOX1sxTyAvT0ooIltfXisiLQotTTlVKEAwIyBNICAqUDQmKSgoJltfXiMlTSAgKCAgQiFOX19AUTswICQgIDFQICMgTSAgKE8gJEFNICA4QAotTStPX1g3KCBPICRaWSAgIiBMJF9PICBQQDtAIDgrUSEuTjAgIEAtKTgzUiFOICFAQEtPX1gzLlhcXy9dSAotTTNFWS49MCAgM0U7XVIkQzcsLiBMK0AgLCs3RCAgSyxcX18xXiAyVSdfX0BNMU9fXDImW11XJEFOXz4hKAotTTtPX1QrUlggIiRaWSAgIVJVIiFOICEwQEtPV0QqRlggJCJITiAhQEArT1dAP0A2UEFWKVwsI0wqIURbWwotTSAgKCArQCAsICBQIDFAITggJUBAK09XSFQoOEpAJEomO1U5K1tPV0wqJDUhXUZEQF8+UE4iIUM9Tlw9RQotTV5GISA/QCRKQVRKJjtTQEoxMkEmVjw0Ol8gIFBOXFFFXiYgSDBJNE4uMCAiIlJBUiIrUiE7MFFcIiYgKgotTTBJNE4uMCAiIlIxXCBSSScqJDc+QUFDPU5cPUVeQiElMEMhSCAiICUzLlhQWC9XKDNFWS49NFk2XzxRKAotTVVSI0ArIlggIyJVWSAgKlMvL19UMEpbX14iVSZfX1EoO09XPDImW11YJEFOX18wTytAICgzS0QgICcrNAotTSgmWCAlIiJOXz4wSitAIDgrQlggJCIgTl8+IVIhOyIhOEAgIEdDIFsiQDkuXlAgIiAkMCAjICAsICcgIAotTUJAIioySDlNIyIhJygiW19cKSImKCghQCFCIScoKltfXCdYIDJeW11bIlAlOCBAQDFBIj00SD0yQUtaTgotTV9fIU1cQiElVD5bX1wkKDA4JSBAMVQqMCgkNDBPICBQLkdQICA7Ui07UTFeID1aJVcoNEAxUSJcICMhMgotTTM1KidPSDlFXEQoVTYgIUApIiEnMEkhXiIrUic7IEBKLyAgIiJTRUAkQkhcICAoKy82ICooJD0iRCJIXAotTSAgKCsxQiAlMy5YQFgvVywzRVkuPTRZNl89UE0+MCAiTFNTX10nKCErNCdfXiJVTiAgU19fJEFOXz1RKAotTTtPV0AyJltfXSJcTiAgQS5OMCAgPE0xL1tQIDArUlggJSJcTiAhISg7T1dAK1JYICMkWlkgICFDViIgTgotTSAhMS43RFlVICAgICAkW1kgICBGWCRBWCAgLS4wJjdSM0c1LjVPX1wrSD0hW0AgLCtAQFAuMCAiIEwgKAotTSAgICE5QUhQLjAgIiBMICggICAoOVBIID4wICIgICgiUCYgJDwvXUAkREFZICAoIkwiXCcrUlggIiRaWQotTSAgIF1YIlhOX19RLjdEWVUgICAgICRZNl9eQE0/J19fX19fX1siVU4gIENfXCJVTl9fI19dI1VcICQrXwotTV8kQU5fXlEoO0AgMCtSWCAjJFpZICAgXVgiIU5fXyEiJCIgTiAgQS43RFlVICAhLl4wICApTiEoPiAgJQotTTNEIUVcRFlVKEZcICEiIU8gIEBAK1AgLDtUUEIiOSooOyAgICEkMiFMSCFNICAhJCxAQCggMCAgOVAwMgotTVYlLiAoQEQoIDAgIDlBWEIgLjIoOCAoQlYlJyhfX1EiMCUuIDkvMEAgMCogICAgICBWICIkTUExUi9fXAotTTBEITNAJjNUKCJcICEkWVVMXEFOJSYgIiRNQTFSL19cMEQhM0AmM1QoIlwgISRZVVQ8IzNQJiAiJFIhMQotTVIvX1wwRCEzQCYzVCgiXCAhJFlVKCZcICEiKU8gIEBAIicrXzJBQTdSP19cOUAjX14lLig8T1wwVjU/KQotTV9fUUYgL19YM0c0ICAiIU8gIDBCO1AgKCggQVJfUSM5NVxHX18mOCBfX0EuPTRZNl9fUE5BVCpHMidAIAotTSFEWlkgICItNCUhLytAIUckIlwnMidAICFEWlkgICItNCUhLzghQTJOMCAiIlRQLE4wICAgICQgIEBNLAotTTlAOS5OMCAgKU8hKD4gICYzS0QgIChVJitQIS5OMCAgQz5ZMDNSWE5fX1EuN0RZVSAgICAgJFk2X18xKAotTVVTIiAqR0QgIEAgIDJIVUcnIkFOICBBKkU2PDQrUVUoNSRaWSAgIixKRSEvK0AhR1siICc4IClQICRTTgotTSwoI19dJFk+M0c1LjVPX1QoJlggIyIpTiAgQDImKygxOUBILCYwIF05TzBAIiYgMjJBJUYjIFBIICNXXwotTV9WOCQoIEFAIEcgIDNFWS49MCAgICAhLjVAICAyJ0QgIEArJDNLRCAgIj40NiRcTytAICgzS0QgIChXWAotTTYkXS43RFlVICAgICAgICAzRTtfXCJaLSgmWCAjIilOICBASjImICgkITZQJDY8JjREVSolNjtUMkE1RwotTSEiICk4IDkqJjY7RDwgIEo7T19QM0VZLj0wICAgICEuXjAgIClOISg+ICA0M0QhRVxEWVUzRTtfVyRDNwotTSwoIE4rQCAoKzZYICMvX1QoID9FQCJJICFIICAgSl0sKiQgTTUvX1hWX1AgIEpfLCs1N19fJEFOX15BKAotTTtPX1QrUD0uTjAgIC1aIS9bUCAsMkghSzAiIE5fX0JQS09fTDlASEArT19cTCpbX1wmPFArNltfWy9fWAotTSoqW19eIiBOX18hUl5cIiErNCNfXyJKTl9fUSJJVEFOX18wTyFUWlkgICBXSCRKIDsgMVBfViAkKCJbXwotTVokU04sKCNfVyRZPjNHNS5eMCAgKU4hKD4gIEUzRCFFXERZVTNFO19WJEM3LCAgSDtAICgyXltfWCRKLAotTTlSMSolJjxAKkhRKDUkWlkgICEwRCVBLypUICAhJSEtKktQICBKKUw8QChLMDAgJDQkVEAuMCAiICQyUAotTU4wICJIXyFEJEIgWSAgKCAxJCdZICAqQkEiQVAjICFAIUJBXCAgKkI7UkosK1E1Lk4wICA0KSE4M1JNIAotTSAgMTAzMkpcICAqQj83KCEqVCQgISQnTl9eIEAjOSIoWUghMkAiXCAyJltfWCRBWCAgKS5OMCAgQ0o5LAotTVtDICBfXUEuN0RZVSAgICAgICAgM09EICAiO0AyJ0AgPjRZIDk/KS49MCAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICQgSChSRS04VylULDJZUygjJE4tQiBYLiJcUCxCXFAuIiEjO1chWQotTTxCIFEuM0BVKCUtVTtCIS06Ni1SO1AgICAgICIgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFEICAgICEgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFJO0ctRTxHMFooJilBOSIhQgotTTsmXUM6UiFTOjdJRSgiQEU5IkRAODcwQCkyLVgiQCFCOyZdQzpXLUk+RjRdLCIhQT0iIEUoV0AqICYpTAotTTtWLUs8VkVaOTNUUCgmJVQoIjRDPiBIIDlHKUU5M0hAOjZRTDk2PUE7IiFBOSYxUjk3LVMoIkBFKFdASQotTSJAIUY8RjVFLkIhQjg2MEA4RlFPOFZMQDxWRVo5MiBIKTYwSSgmJVQoIjRDPiBIIDlHKUU5M0hAOEZRTwotTThWTVMoIjRDPiJQQCkyLVgoJl1WOTcpTDg3ICogJjlSOTY0WigmKUw7Vi1LKCI0Qz4iIVc4NyxAODZRUgotTTk2JUQ+MiFGPEY1RSJAIUY8RjVFLkIhQjsmXUM6UiBFKFdAQD1WJVMoJiVMPEY1QTknREA5RylFOTBIIAotTTxGNUE7JlFPOFNIQDo2UUw5Nj1BOyIhQTkmMVI5Ny1TKCJARShXQEkiQCFSOTYlTDsmXUMuQiFCODYwQAotTThGUU84VkxAPFZFWjkyIEgpNjBJKCYlVCgiNEM+IEggPEY1QTsmUU84U0hAOEYlRCgmKUw7Vi1LPFZFWgotTTkyQEU5IkRAODcwQCkyLVgiQCFSOTYlTDsmXUMuQiFCODYwQDhGUU84VkxAPFZFWjkyIEgpNjBJKCYlVAotTSgiNEM+IEggPEY1QTsmUU84U0hAOEZRTzhWTEApMi1YKCctVDxGJUQ5JlFFPFIhRjxGNUUoJilMO1YtSwotTSgmKU89NllEODcpWSJAIUc5NzFGPEY1RTomMVIuQiFPPTcwQDtWOEA7NjVNO1cpWSAgICAgSlZMICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICIgMCAgICAgIAotTSAgICAgICAgICAgICAgICAgIDgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgSy0sICAgICAgICIhOjAgIEA2SyAgKCVPICAiITYsICBANU8gICglQEAgIgotTSE4WCAgICAgICJUICpQIEAgIyFYICMhOCAiVCAqUCBAICJUICpQIEAgIlQgKlAgQCAjIFEsQyxULTM4VwotTS4jRFAgIixAKlJUTiwjJFIsUzBVLUM8WC42QSwpICBQLDMoUy0jNFYtU0BZLCAgQygiTE0rQyBRLEMsVAotTS0zOFcuI0VIKSAgICAgICAqJllVOyZQSSAjIFEsQyxULTM4Vy4jRUE4Ri1EOTY4ICwjJFIsUzBVLUM8WAotTS40JSIwVDElMUAgICAgICAgICAgICAgICAgICAgICAgKCIgQCgiIEAoIiBAKiJASCoiQEAoIiBAKCIgQAotTSgiIEAoIiBAKCIgQCgiIigkISAwJCEgMCQhIDAkISAwJCEgMDEkMSQxJDEkMSQxJDEhIDAkISAwJCEhIQotTTA0JSEwNCQhIDAkISAwJCEgMCQhIDAkISAwJCEgMCQhIDEgMCQhIDAkJCkiMEQpIjBAKCIgQCgiIEAoIgotTSBAKCIgQCgiIEAoIiBAKCIkISAwJCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICEgQCwkITA4JyIgRCoiUFAtI0BcMCQxKDMlITQ2JVFAOSZBTDwnMVg/KCIkQihSMEUpQjxIKjJISwotTSsiVE4rUyBRLEMsVC0zOFcuI0RaLlNQXS9DXSA4NilDOSY1RjlWQUk6Rk1MOzZZTzwnJVI8VzFVPUc9WAotTT43STs3JVU+N1YhITBELSQxNDknMiRFKjJUUS0zRF0wNDUpMzUlNTY1VUE5NkdNXD83WV8gICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAhICAoKiMgICIiQFggIEBILyAgKCokICAiIkEkICBASDIgICgqJFAgIiJBMCAgQEg1ICAoKgotTSVHXV8/V11fP1ddXyAgKCglICAgICAgICAgICAgICAgICJcICtQIE8gJFEjN1UxKTM0NCAzJCUuMVRFLgotTTFEXCAzJC0/MFRdLDMkJTQxMCEsMFVdLTE1LTMwND0lNFAhLDBVXSM1JUUwMTAhLDBVXS41NFUlNERFIwotTSAgISwwVV0tM1RZJTUkJTI2MCAgMyQlLjFQISwwVV1EOTY5QT02UVQgJCwgK1Y1VDhSXUw7Vi1BOyY0TwotTSAiXCArVzVTPEJdUzomJVI5Ml1MOjYoTzsmXUM4NlFFK1AgTyAiWUM6MCEqODZYKjFGNUIiRFVBPEBJIQotTTwnKCozNiVZIkRJVTtASSo9NlAqMDc1RyJFLUU8IEkvOFcwKjNGXVYiRDFFOFBJKjg2WVU4NylZIkQ5RQotTThHKVU4NylZIkRVQTxGLUgiRCVQPEZFTCJEVUE+MEkqPTZZRSJESVU7J0QqMDc1Rz03LVQiRS1FPCcxRQotTTs2KUU8QEkvOFcxTzhGNVIiRFlPPUY1TThGNVIiRDFFOFY1TThGNVIgJS1VO0BJLTtWWCo1JzVFIkU9RQotTTkgSTQ6JzQqMUcpSSJFLUE9IEkzPTZZRDg3RCozNl1OOSYlWSJFMVU5Ny1EODdEKjVWNUQ7RjVTOSYlWQotTSJFMUg9NylTOSYlWSJEOVI6NjFBPjBJMzg3MVU8RjFBPjAgRTIjSEUzM0hFNFBIRTsyXEU5IlxFPjBIRQotTTgyIEU4QiBFOTIgRTUiIEU2QiBFNjBJITMwSTAzMEhFMDJQQCk0KEApNjRMKCI1OSJAISMgJjFFOUYlVQotTTsnMCAwUCFZOTcsIDtGXCAgICAgK0AgICAgICAgICAgICAgICAgICAgICAiIkIwICBASEgzRiUuICRFTgotTTlGRU46NzFZICAgICAgICIiRDAgIEBJLSAgKCo0MCAgICAhKTtGOUk7RkVUPjAhKTtGOCAzRiUuICAgIAotTSAgICAgICBAOEZFTjg3KVkoJjVYPCZdTjk2WVQoIjVEKCAgQDhGRU44NylZKCY1WDwmXU45NllUKCI1RAotTSggIEA5JjVDOjZVQTsiIUU+JyFPO0Y1Tj0iIEU5IiAgKCYxRThWRU04NlBAOTdBUDtWWUU7RzBAKTYwQAotTSAgICAoJlFJOEYsQDhGJVM5MiFDO1ZZVjk3KVM6Nl1OKCY5STsmNEApNyxAOyZFTjkyIEU5I0hAKTcsIAotTTdVQTgrRiwgIkIhPz0mRU05Ny0/PCZdVzk3KEA5RiVJOyY1RCgmMVU5MiFUO1IhRT4nIU87RjVOPSIgRQotTTkiIEU5IiBFOSIhTDk2OVQ7VzlFPENIQCk2MEAiQCAgICAgIiJSUCAgQExQM0YlLiAkRU45RkVOOjcxWQotTSAkRU45QCEpO0Y5STtGRVQ+MCEuODRYICAgICAgICAgICAgICAgM0wgICVBICY+UCJBSzIgPicgVCA1UwotTS5dTDIrQ15DR1lXQjg7KzxYQklDIStSNClNNjs4NyBFRUwrQz07RDQiUlBBJ1FVSjgrQDMuWiopVEdVUwotTTgvJzdXXDsqV1JMJjo4PFcpK0AmWzY6MztOTDkyPU1PRFhWIj01WVRGQzslO0s8US1JISJRPEBIPjhYRAotTUtAWz5BLCQ7RFwtR1A1PyNSWjtXTTkjQFtCUFYzLUZSN1BUMEVNMT1MKz1YVCYsJjkyUFJGSSRMPjs2UgotTTIzJCBfQiRIUlEmTzknOkRYNDggKFBFVzRRVy4gJDVXQ0wrPks8XCIrPzIlQklAVzxYNVs+PFo0QklQNgotTVlJJzNNLFQtWCQsLjc0UF5eX0U0Xk1SPSo+TDlCMkZPRz8xSD8nV1U+RF4nRDApRV9JSz00LjwzUk8wNQotTSc5Kks6JipEQCZBQzQkNlMyNU1QKixXUStRVjBEVCw+MjAiQldCODBQRCFKJSBQNEdPIl47VEAhUlwiIwotTTA1W15YJkNdXyY6QjBcIlopSiZZXT45WytWSl0kRVRNLz9KQU4yPCxRQCM9KDAjMF82O0E+TyY/XzlaVwotTU9QVzBUNSNfLkswNkc9LjEuJE82SS4zVDAzX04hOShILTtdNENTWVgnXVkzMkwrXFFNLEkhLyFKXzJBQQotTS07TDY2IFw+OSc5NUxWME9OOT4xV0hdUSUiOl5JKl9dIUI5MlI3MTlTJTUjKS80UzQ7XEJBJi8nOSkiSwotTThPMCUgLVIrLDJCXjxJUTNKUzRDIENSSlxTXSdKIUghMyhGTlI+NkNHTVMrWCdeMSxKVVwhPVdRSyM2MAotTSdOJipNXSNZNiBTLCU2O0UqPiAiRzNFTjBVMS0sIFVcUkAlRig7WSwgPUw5JyQkNEZcLEFUKjIlN0ggWwotTURRK18zV0gvQTRCVjIuIjEzU0FVTEZfJjRQJVg8OVZVSyowQCBIVT1ZJigqI0peKihGWCA7NDswJzYmWwotTTA+KF5ESVM1QVBIMShVMThCNi8hKkBRKkNRTTwiKC5BU0E4MzlFXSYyPDEwRUw0LT4+Wls0ND5LWTciQgotTSxZXD5aPF0jJDgyXVYkLCpCPiQyRVwgNko/P0slQTssPjI9N1NZW0hVSCwgIylGITwnVSw0IlQ5XkBfLQotTTtTOFRZQkU8QEA/IldJVSczJSs5QF0nLTBcP0oiTVkrRUE/PUQzNzE+QE9IITs3OUs8QkkxRy8yTDQ2JgotTUBOPyZAKzohS15PQyFGRj03T0JSUSo+NF1KUSBQIldXTFxcOkE7Q1EgVUpKSyY0USZeTVJWJlwoVSRXKwotTU0+UV5dTzQ+MTxKLCZSQURIRyxWNCA6U0IoISE6MzEpMD1FVS8tXTJUR1pZL0o7TEkqVSkpQTNPO05BNQotTUo3Qz04O1U5LjhRQj0vNjswVSM5NylRWjFNJCFDPCo4Ol5LSy4mKzpFLVhJWyhKMEZLPF8pPy8qJlpZSwotTTosL05IWEZXTFpKWyNYX1tTLSdLO0FUIzpaOEpZIT0nOkIqPUxOLEpGWFlcNDw/I1tfPyQ1VkYpP1U3VQotTVhaJUtJWVNLIj5AW15MXE4/VTxAOUpNSSZOSDAiKUhVIzVAV0VfQ0RZNEhCSVZbQ0olOU49LCsqSyU7RgotTSNWWC4kUzhYLjEpUzhPNzc1J0JaWS1NUy01NCogPyE4RkUjOl1HSVJEWjFDMTlBPFpaQy4iJT5AUl5IRAotTU5CLjJQWENCMEMnMDA7SiclVSNOMyxFUDkvRzxOPl1JQD0jN1ZcMS1CTVpXNkRJLi5GOjQlJEBUMkw8UQotTToiWyUnQ1BeMl4hViVDVTJbIlUmL0BTQkNHR1YtXiNKKElQQiEuODQuNjNATSo2TzYrPVw6OEdKSTBeXgotTU9NX0EgIDs5Xk04Sk5cV0lXUUpZQkMmTl9MSyxfRDJNTEoiPTokK0Q2PCA+Uk5GVSk8WltBSjwxQSRPRgotTVg5USdAWSdVKUMpMCc+NSoySjIiWlc6XC41XzUnS0RfVEZfSFY+XDsjRC1CRlkyPUogUSopRClRQyI9SwotTT8tKEo7MCJOKU4hVUlJM1IpU0lJXU1RPEdePlgiSTg+OVdEXVVMNDxYUVsxWDZcPUFRRE5BLTRNMUFMRgotTSkyT1wjXk9GOikjKCMxK0I9TiRBOilWQT8uWiYjKkZOWTtCTTg0JiUlVENROy5MN1JUIkc7PzhASy8mQAotTV8yMEs0TDk5MjIrL1ddSkRaUiJRNDUvXy5MPyggNStQI0chOT5HL05DVzdVXD1AQUwpLixePyEsMUlNUwotTTFWOzo0N1w0PCAuTlMkXCUsMVAhMCE9O1VWVUI7LTY5JlheNTxGQy4gR04lWVRLKyQqOjAlQU5ZLkFaTgotTSpPS0VRXkJSRCU1NiBeO09IWUkwLlAtTVFITjJOSTs2SlpGXUwtRF8rOz8qJi1RMFQjRSdDPjI2RUchVAotTVROSzpLMUpWISRLPlxKTy04Q0tTW0REM01VQk0uOi0pMFtFTD40JFc9KjJONT0gLSs6XVNXVk5ZOkY0RAotTVtJKVQ+MCBWXyAtTCE+ICAhOz1SPSlRVDA8RkZEXkEyLl4pIE5BPV5LIEUqTlcoXFBWXzdQOlwyTkYiUgotTUdQLlhBUidMKURKISRFXC9aJFovVUwsT0QoIUQ7Mj8iISEvQCNNXyMpITJQIzlFM05HXiRcPlRYQkNVTAotTSo2O1kjMiArWC9GK15YT1FVKTRIKk44P001LDxcLkI8VyE1M0s0S0FHRyomN0deI09FUClTIEZDRSZbXAotTTsuNShMWDhSPjxdSVxcSEAwI19FIzE7WDpIRSwjR0dXOEhTOVRaNCslM1khND5LP1crLyZSUDlOMSwnIQotTTRYUj06LURFSzEuRzRAJi5fWy1RTEhUNVkwLzk/MyQ+PFYkX1tYVVI7JFEkISQ+IC1ALS44RklPIFNMLwotTVZKKDgzUT8pSSAwWkdFNTJKKD1dNCRKS1UuPilBPUc4TUAiIStQPF5NPTddKkoqWEtePCgsUCwgW11cVQotTTdAXkY5JFIuMkUmR0IiLj5MMFBRPUM/PDctPC9DX1ZANy1WW1ZOX0lLXilaVjIrWC0oTyQnMi5NIUQ5UgotTThUJU9TQl1FQEZJIl5cID8qKFMtX1hNJzwxSD9ZJUwqQi9UI1lNXE4+Q1hSIVNEVUAkREFST0tLPSglIAotTS0zKiQqUC5bVTxJWCg6PyknLF9QJV1DIVUjP0VUJzZSLiZVSl1QR0RbLFhCLyZJXzQ0RVFdIkdaOlY1KgotTTJFLSsiSU8pTEM2LzFYJ11XTyZbPFlFVVUpIy5QX0klL19QWzhVNEE9WjpCSE1JQkcpNTFZL0YwXSs8MgotTUg+PFBJKiNRTUZCLUBOLjQmSUNNQzBWV0kpMClIJSQ3MSRcR1MjTkYtW0lEIj4sOVhETChHMURLREM8UAotTT0+Nz1AQDUgTzM7VyVLUSBEPjY8PlUnLV9ESFBRQD5WQyUmUCRdMlxWNT8oNkAnWylMTk01WkghQiZBVAotTUojJE41I0A0XVxIXCNDRlQ7X1pBVjA+VlRWSSJFTDpWWS04NSVEM15XMlswTjxHIyhHSyVcVkw3WUdZWwotTVtATz8uV0QnITc/IVxKOVxXIlIxMyNeVFQ8PTJeMTspLEFJITtcMkssKVdQO0UlSy4rKSY1SzRGPDlIWgotTSlIPjpOOVxIRUw2QCo2XyhAIjkyWFIlT11CUz4tUD1eM0EkRTEiRFpKWC8lTVk7SVw7VlhAXk0sXC8sVAotTTIuTVRGUVYxKyJVNE9CRyFWSEVRSkxbIF5XKkw+JCQxV1AySUpGJjZcJDAoJkBcPDAmTFM5UjpDJiFGRgotTTk0S1RMVEU6VFEhViIwTyJZITdXNic6OkIrQSwyQytAUkNPNDsiNScjXyhOTjJZO0w5XVYwWUY2R11AQgotTVpGLiNYKyctJy4rSTdOQT42RkhcPyVbOyMrPzBMSlxXKC0gNyAqMkEgKzUmWVtLT048RFg0OEIiMCotWAotTUpUIlk9NDE5VkYwKE4tQyxEKVMqMTU+TERDUDxbIE1RWDtUXVg/ICdCRztRLjgyNDQ+WjxBR1hPN0Y2KwotTSlZJTUqSSBeXlE/ISQiLVM1ID0wKDJZTSVJLzU3L1tUSzA1NSY3RjsoWy5bWkpUREBMPTJIPyRGQTpZLQotTTVdW1w+I1Q9JzAjUDMxKDI2SEokVzIlJlAqL0IhKCFfMFlPPlkmWFg6SidORjhVR1o3Wk4sVls+VU9IUAotTVkuWFwjOysmO1k0IVUnP1ZfRSM3TDNAR1xAUyY4Ois+MFdLQzFYSV48LEpeQEJPVig+OiM9IkVRRFteIQotTSQrSVkzI009Wyc0REk3VDNRJEdPIUYhTEFXLlROKjcjVCotXD8pOFtHKDtPVSRJPD0zUTtMQFhAMzFMRAotTT9WS0w3Lj8xREkoWVlWQjRdKiE5TCYgQiU8RThBTVYuUUNfSDsyND0kKEQ8VUJLXTZTOk0kUUsyQl0sQAotTUJXMEorRkA3IS8/ISY2MjBURilZUkNJJyBaRVVHXUQgWTVVI0FJIzlCJ0hGJDYkQUxRJiYpKkM4NiM8NwotTTlfVDgwP1smTyQ9IF1TJDNKLDteSyUmN0E4XTNSLCxCOEMyLlciWV8iLyAnQlo7VzwpJDZRPFw2NkkwVwotTVshSylBWkUpXkxDXEA+J1VNO0ItWDpaMyVVQzJLWCA+Mic9V08kLzg9QE0lUFdcOUpZWk4xKkI6Vkc8OwotTVNKVykgMTEiPERTI1o0NjM4IzUsXjFNIERMQSE3OUcoUjlQR0RUIjhVTlZRNVlFMipSNitfNCc3LSQ2WgotTTJdNzFETyY9NiNAVl1ERTtIO0FRWyVKW046SUIoUSswKVIiISswT1VRUDhbVTU+JiRdXykjXEwyNSc/MgotTUktVTk0JDc2PzMzMEc/QDcpTjEiICErJlsxXV9CSkhdWTxKPyc3PTAqNlMoT1RRP08uWl9NOkooPkI8QAotTVtSPClBNEJMWCIrSSc2Ojo/I0kwVS0iVV8jWTApQEVZSEknQTdPLjhOUVQgQ0g1XCU2RlxIPSBZLDc+MQotTVUrPDUgKSMuJkhHUyxQTkIzP0cuKiIpR0JTK1RbMi1bRiRbWipQUDdTJ0Y1TVJePyBDL1VAPiRXS0M1XgotTS1WOkxEVEhaKkxGRFdATUBbS0EyI0s5TEtfJFVXKTFAW0wsKzotKjY1RT5WUVhNSzlaO0crUUdFRThSPAotTVM4MClMIUY+QU89KClDMjgwSSJQQFVSRCsxVkImRjFJXCw7WzE9JiVFSkEoWSM2LVtVOlxERjQgIjcsIQotTSkgNkxEJkEkWzpZXDlXJkI4T04sNkUlTCdWTSUvNjUnLF5BXyIxXl5RRT5PSUNQISklT1xaMVZcOCtRUwotTVkzM1NRSyJNOVtPM1ksVkYvLlw0Xl1UTlRKPEZSXFpHUixcR1RfWS8vQikgNVQ3T0k/RD4tUCNLVU80OwotTScuSUJBVlY0TU9aV0EiJkEoVzojMj0kIUInKiBSJz1dQCEySkBTSVsxNl8/PFMgKlxPVSRWQjcoPlxPVgotTVwsKSZHRVQ5IEU3VT1XTFJfQkE5PyogLDkjNFZMUipUVzJDQC5bVSYmNDIgXDU7P0NZNjhMNVI1LyQ7KwotTTwwOCkpSS9ZKkY5XTdRLVtWTklFQCIsW0xSKDg3KzBJTDQtKT5GOF9RJkkyWVwtSyxFV18qITxFUSxeSwotTT9aMDMuVjQzWTohLVtAJkc4MlQiLVIkW0UmUjA/IEAqTldfTzg4PE5KTElOQSlXTkk9MSBbXCZOSCw9XwotTVMxUi9AKFI+Py1VXkQpOTM9NT46WVJfT1QmOCtSRkZQUyNYMEQwRkUsMl8/PiE2Q1opKz9PXEM0JDBfJwotTV5PO1hJV19ATlE3OUQgTCxFSSAuKEgrRVY8OFA1Q0ArMF9MVj4mKEogUV1QOlRVXj8gJD85N0hCWSVBTgotTUkoTzVHWTIkVFFaJFpARl80NFxTW15SNzFHVjUlRkpcNl8zTkE0OUNIRTErPCUrNTFbLDAxOFRDQzNPVgotTUJAMjokPitAKzJGWF8rIC8pW1ZZQTBCWl0yU0czRT9KN1IpMTA7LltXITI7RkBPU1ZSWUhWPCY9TEU7VQotTTZLOjFZNi9bSyo+Wy4iKVtBJThJOCczJVlDJzkhXzBeIz0xUD5bKyxLQ0VXNVVVPE5MKlwzWTI+TFpHNgotTUlaNlhERS1HMj9IU0cgVF4gO1FZMU5GIjg3STxNSUdBPik8JThYUCsqJlM/WEhBXVRJTT86UT8iJjMnRgotTUZQXzMiQiozXkRSUShHO0gkVUpLLF5DJDlVSilLMUIkKUhJLEVEKjspVzZHWlMsSF9BJE1aTkw0R1xUQAotTT88Vl5BLENKXCVUJ18nREosUzohSFE3LUBdSFYzJkVTNVA/O1s5WlQjMlotMEdEQl0hQVBKVClWST5NWAotTTg3V0QrTjxPViNbQl1GQTkoNS4vLD8/Xi0wUDMgSEBMXl0hI0ZKRiVFIiBdXU4+KSMyPypZNUxCSE86VgotTUs0NTJVOy0qPkQqVD1MWChTLz05K0VETi0nRDRdQlRPICRPVTFQUUpXVUgqLl8wLUhbOUNSMi4vXCgmKAotTSwyN1c2LVY1IVFWS04pUF0yMzJeSTotUjdDQF4kTTpYVV1LUS84IjkpMic4NjRDN08iVUdJJUUyIjU/SwotTUMwXyo5IkApXTRfXlI6KkNVU1hdUE5OQ0YsOVknOzRaUzpaNDokLDFGLVgyVC4sIlAsSkFbUlFSI0w6SQotTSYgNUhJID8jMTImQEchUyk2U18xMSQqVlReKz1OWFkvODAiKDBUSyRSUDksM0AnTVMlXFMnOlBeVEssVgotTT1VKy0xNFRSIjQqW05QPkw+KFEyR1UoM1oiJ0gpI1pOMik5SENEQyg4O0dQJD8kMUtAIjVZWipMQlpeRAotTTg/OjNaIzUuXURfQz9JMEZCUChJOiBWKFNYKU5UNDJZI1BRUyo+RyQ6USFKMC1MSV5GWlxTLDAkMzlWWgotTSM9QzZdRStYMzNLND1aK1k8LVMmTS4yOzA2IVNDRDM6RjhTP11NV01WLF9AMCw5MjE3SiI/LiY8T089VwotTSpDQjxZJzZVSlRASUI5NCUtW1sxPShSPCctJVk2Iz04OyBAQDwiMzlPOE0oJThNRFo/RlM3JiYsLl1UKAotTSpGOEA5IElbQzdeNEU5OTpURDZIT0VXJUZKIVxONDVbWCgzQTM1J1UuOyUiSyQ4QiMnLzkqU0hBKkUyNQotTV9dRzUoKEJTTEpZU1FbRlE/Jj8mTFxYOTU3RjM7PDYjUzYlLUQsRFgnQFNETSUxSl4hUFNXUkNGOTYxOQotTSJDUydETyZaSDM9VlpAPjUgK1BFSV9MJzJDUks8TTNXOCE1RU0uLDxfLzxaKUJVIjE2IzZaNjs4MVpAVQotTUdQVjslV1FRLUVISjQyMUZNNjJDQEguXSJINlw7M1lFRjs8JTo+UF8nXV4vRUpKLl9dTVZcKFolLUw8XwotTSA9VFUqUVRZQV1VV1tSQEcoTydEMEhfRU88P0kmVUhWUjg8QStYSFlWJCMuSVJLNFVFSCdHSzNBKFwkWAotTU4vIz0hSFddSjM2OydIVSZQQjpIQ0w2XFJTSFAkQ0hUOChdXyw1Tk1XIk9DLjcwNV04UDcmRzlWRCQ8OgotTV4iRS9GRkJLP1shJUxALTFEUkYyUFEzIlxLOiVAUDBcMF04MjciKDklSDReO1YlQDgtPyRZWjEmTVFeJwotTSA1PlZHKl47S0peVF47Jy5fIC8xTTwkUldZPUkqX0UpUFRYIDRLUEJQKCIsUzxYIlVeWytDOFxTO19DMwotTV5JIC8nSVYiXTk/SEpHLC0rN04zRi5RLyYuXUJPTipIJTRSLkI3JFxCVzQ0UjwqVSQkMEw6TCZBNF5bIAotTUhAT1ckOi0yRUIvWExZUCNVPTQ5TlM/SiJZRFMnUTtQVVsnOyxfMTlLKCMiPTo1QEBeTVYiR0hDI1wmRwotTVNFMUxINT4nNVA8MjwuNkIzSVQxKz9EMVpFOkY5WDg2NVc+UCsrUFBFNTBIIlQzViYwQSxCWz8nOVZVIgotTS0pI0tfPElKWSo+WlpIWko+V1swJSxXMyI6JEU6Pic9QVosWVwhO0E8ViMzRlwpVE4/XlhHNzZQXElPQgotTTJXR1ZFR0FFQkBbTy82TSBIVC45UEMmSDZcRjpILS08Okg3KC0tXTVZWkksOVRLQywlUi8jPUInVkQ5XwotTUxTNSc7RVxDUV05SF1eMDQ5XTpaUEokMyZZKEhdWV4kUkZJL0NcWEclRkIiJC5OXltGMiE6NTlMIj9GPwotTUNMJDI9PzpAXUdSQiItUTszVjtbOTVdQltVLU4kUEMwPU4vWFguNjshJTpcLiZaOzAgSEolTSdGJVgmWQotTTA3XEdYXyBXKC5KJDBQIiU3SjA+MEBTVUY2Kj8uRlRcQDgzPlg5LyMyOS5fMUssTllYOCUiXkJQVDdcPAotTSY9TlY0WSwiWEEkNzYtNFszVVJRUVgrO1FAQSMtXCQ7Xls3R1JHLyNKMjxHVkhUIF0wMicwSFcoM0pTIgotTVI8IitENi5FJDMsW0s+OSgiTyFfKzlFRyksXUFGKUNEV1AlOjtQT1ZRSFtHRlAtQ1NWVDtNVFI7Ql0uQAotTTkiNypOViRRIDk/Ojw+VExeKiRQXiVVUVwsXU81ICY4NVguRVRXTEVTKTA8VDUzIzgxRVNJKSgpWShWXAotTUVdIk1VISVSVi5PJjBTUjQgKSlPNUk+JzUrQUhfPE5FVUFNUj8lXzA0L1kkICwhJjlVTSQgP1RVJCZCOQotTTFPVzM9LiYjNlhKI0QjMyk7WCNQIUVQOEFdMUw9OzQ3LCQrU1M+XlZYWj1FSFFBWy4gNlZYQCZMWzEySgotTSw9TzhTKU44OkVGXFwvJ0JHLyI9M0ExRiJaRUhaVTYzND4rV0lNOE9bWjBMUUZEKkpTKyQkPkoiUF9aWQotTUFcUSErTC5HOjIjITojUTw6MkIrVU0yPiNWMVw1NCNCPERUTTJWTUdYKDRFWS5UOj5FUklSI1FQSkEyUAotTSxWOlpTMC0vMDwjTTdJV0sjUCVQT1RbSCEnKC5ENUYgTSlKI10qJSFGViYqLUFGNlYvVk8gXTsoSD5RLgotTS47XjQuW0Y4UUcjOyw+LEYrQyAnNEAiLyZJXCFcPEhDVkYuTzVLTyQvIkVVJTtdS0IzMS0gUVo8RF1JXQotTTxeMkRNS1pNWD4oNi8+XC84NTYqMU08STs4UEpNQCdKS1dKUSteUk01MyA4M15XNlZITF0lJDw6LDZSVwotTUY4LlMhT0BJJkBSUjY+KzBLUytFLjE0WF1PXzhRXyRBJUZAWV1WK19EN1o9UV4hXS8tK1daTk0kXT0iPwotTSdfVicrTyNYLUFKKkNWUCNEKFdQLl1DRlZaIkJALkooIFVGRS9ZNCxFLDZOU1QjQVUxIjYxUz46J1dRWQotTUA/QSYnJjVZNzkhK0k8JFYpSVZQRC9dRSAvV1k0JDYuIT9OLTEzIjZLXCotWitZNV05V1gyXjMpIlQpUgotTUNEW0VZUEY0Ikg+TikrL1E+KUdLPV06N0E6QThJXjJRTzNAWkpGU083JTdWMlEmVi0kKylEWVUhUzdQIgotTUxcR1MvOkk0VyMvPlZBRk1ER0ItUiU8NyIyPkNZPkI0VTM/NjE5PlsgJltJL0EpMVAvOCpJXSs+LkAvMwotTS80JlouOUAqQy9TQTVPUTdAViVOTEhBRlgnRyJSNEFAVTFDPlMhUUwqW1tBJ0VEJS9JJEcyVUslNSsmQgotTS0rOFM4OCZMPFtcTFxbSDtZUjJJKlI7XiUuKDZXVEJYVSsmJSJLW0RZQjYjST05V1lMTTs8QTknJylTTQotTTkjIDc/TyBZV0gtRVAuJVsoSDtSPiJUUiw7VixOR0sqI1AiV0JYJD0gVCMsMD5STUcvTElQWl89WCg+KgotTSYqUVArKF0pLyUgWURMIjQvSF4nXTwqXE8tQVsgUDEiVVpITCYpKj9OKTYzR11FMFIrUS9JLkY2OVArOgotTSJQOTZbWkIhSFdDQ1VFUVYuUDQ0TikkQ0tYIyNPSlwuITNFWVJXTD9UJ0UgKTpIKzc3VlFPOCwmLi0yQwotTSpBMzE4IE4tMFMvRDlCSUk4XjFQVVUtSiQ4TFkzLzlVWSYmPFouTyAiKFBdU1NVSEVbXkZLW0Y7QlYuQAotTUAmOyU7T0IvXTxdXTdAJS40SktSWFlTKCxUMUw3Mjo0IyVVU1w2UEI9UTI3I1EqPk8/KFJINkInVCE4OQotTTxEJEAxQUBLST0wRTJCTS1RLys2VVVXXUhYOV0yWl49IiVBOixGQSlLXUtDUTtUQVFRLFJXLS8sWyQ3VAotTUUrMEUvNVgyK1ZHOz08TyEhN05KO0krUU4hRVoqIl44KiQuQi9OKCwgJ0hBICJPMCU1RDRBIzVbXTNFQAotTTUvQVIrPVtZXkY+RSYjO1tRP1NaLkpYTSouKi8hNCpIMDMlXjxHLkJXKVc1K04sRVVOLTRSNSwzUDQyMwotTU5UKFQjO0o7MiZeTCIxUytJV0ddTUk0TU1bKj4/QCg5TVY7MCNVTVk0ISxRM084XTUqSlxUITFcS0ddWAotTTclOjMoVSBEKV9fMEhGQSc7R0hPRSpKLkYgO1FIQ01dWVsuMVw1TDQqVFgpSE4sWj5HLU5RK1s/XTVZMgotTVcqMEkvMUJOJF1VLDgzIzdKQiZDTEA3RjFQQUgwLTwwJjNIQiBSUT4tUiRFTkI0W0UxNSxASzUkNzRVWwotTS82Mzs+SS8xUSNTMks9SEU5MiZCREYpPEgqKUNJMCdTRVBRRU8wMikqUzhePEUkU0RJS0wwVldBIF0kJQotTT1CUCtaN0xOSSRUR1BCPThJKTUsMlE2KDU/TS83PlZATEtJPS0yKUMnVUBENSFfXVc1NSteOVIoKilPKgotTTorJC01KEo+SjEkTUdXXzE7IFooOiwhNVcsJS4zM11PT1dCWzNZU0dCP04uVlo+W0M4IyAlWFRZQFQuNgotTScpPzgkJCA5OzAkSDBVIlg5RSYiN1cuTU4hRDpMPVxLRT03PCBHOS80RFVTUEQyKVUjKlYpTkBYOj1fVgotTVNHOTpPUyY7Vlg4TS1XSEZeQjBIKzZFJjhaWjw+VjBFWzQqSyI7IEktXFBGWi5INjVVQTMiUFZZSSEqLwotTVtYLCRJRl5OR1MzI1EgLyhGVFdIOCAiOCo2OEUwWjFJQUhBMzRITklYIEdfOU5cUE5MSStZISw9JCtQTwotTSoiRjk8PD4nIzQlLUkrS004UildISlXNUsnIVxfMzBDLU9bUT5WTlM/PjVbL0RFL0Y1L0NaODMmPUwkIwotTVIjPjAqMyIuM1ReJl47Qz41N1NXOENbKVFTRDVTMjgnPig6SUBGPzI8TyMjMkhUJDclKTEyP0koW1NPKwotTTcnMzlAVVxfSidaVSYsVy4jM1U0RkwyVS9VXkkmNS0lKUEkNFAoLiRRLV9ZNj5PJVRRJCwhUFApTk0gVQotTVYtQFwgPilNSjRPLy41Iz89T1deSEA8XUddNFZJN1tdXz87PlQ4XiVJRSRITygmUSIyXkpcICciMiJMMAotTS0pXUohQjpQRD04Oyk+IScwISJZIFJZUCdWT15RNE5HV1c4Ly0pMEo5Lyc6RVIsUU1aX1JUNjczIj47WAotTS47TEwkWy9QLC1GSkk1TTouK0FSS0EoM0slNzZWODRcJiYnIElURThQNF5FUThQOyNVJl5MTyQwI01APgotTUItUyMhPT1SPCIoKUMgIko8VkJYLFRQXzowRyEjKiZPLCtQMFQ9UCc5QEsnXiZVVSMvO1lKNTs8PUczIgotTV5EVCgyKyMtJDEsWVBKJ14xI0s3PTdbN10hWjQ8RU1PIldTQSsqPjcjWzMxNFBTVk5XXDQqN1Q9PiEnMwotTS1QR11RQCcvXEhVL0ggJV1LIF0lMkRDUE44NF8tVCFBOiQoIF02KFA1LkEhIVVcIkE/QFEwXyAkNkwtVwotTSJHWiVSUjcqNSwgU0spUURVO0pYTUBCJjVIIk8xJ1AuNzM0TSE1M0IjRSVIIi4vKD80IiJcVzhbR1VeLwotTT0tOCBFLjQ0NSIsWF5MVSJAW1JXQFtWRFQuPDpKTk4uO0JeXShCP1k0VCYuO0UiISpdIyJfJ0UhTy0nUAotTTFEWjEtW0g8WEUgJyohRiAuPkZVMjA+WTBJWi03U0cpMTdKQU43KjQtQEg4OC5IQzheUSE1PC1TSk0iJAotTTdIRi01TTVBJzk8XyJeXCtdPiowJV5WQ0EnSEFQLDJWIlI4REMiNVVULCQiJltSWk9SRz4lOiZQWjhVRAotTT9ET1s3PyQkJVVUOV4xQyYiUDstUTU7TkY3W0MiSFE1NVI4JjBTSThJXVhRNCdIWSEvKEpIMiEyRFYnIgotTSY5NVY3WD85KFFMIVEoRVZAPUgpXz0yQUNMS0QqICkrNCMzOzc5KF1XWztRIURaVkZKPixZNzpOSkpbLAotTTZNKCo8MElFVy4tMzcyK14gID4sQD9fVzNXKE9UTVsmOlVNMU84QFJFJk9UIjA0Ui9IPUkkWEJRVEAsVgotTUhGRCRfV0M6NzJdSlREXEEwWyJORDBJWCQ5V1EwK15XWzpfSiUrOU5LXVpNNVpAST5ePVomTFZCJy8rNwotTVg/MDApOE9fNitBSi4qMl5NSilIIC5dWlpJVFBEMj4pJipGM08hPVdbUCBUM1YsR09YPjcjKkdRLk8nXQotTVhBLC8qU1k4OVFAX19dXU1VSF0nQyUpMEkpOy5AI0REJD1NNiFCXydGKyRIWkZQKDBaLUhbLE1TKyYyMwotTVo1LyQpWClZKUMmIjMhJyFILVdLVUNVKkIxP1k5QSBMKCgwVjQrWClCSCA/TSoyTVEhWjw/WyxQJzpdKgotTSRLVEFGTEUrTjFQL0Y3NUNBN1JOQTFMK0c0XTAjUVY/UlFCK1QiNTQvPTgwIyFPVz1UT0QiLk9HUzI8LAotTU8nUl5LTTEpNUg5NDs5VCpKVjI4KC9RPCY6LVkkQEdZS1cyRjg3KVJEKlpQUDJMMU8kVERJVCg2RF1VXgotTUZHSzA8Q09LWFg/SFRUNDw8L1NJJiYqRk1NRUUnUFs+KjEsRlNGMks+MClfKSQjSjorODs/ME1BXjxNTAotTTwzPlhSTyYuMyRdP0QqKlU5Ly5KKjtZNUgxXk9JTSBWSlI4PFFSM1ItQlVaXSMnP1YySVg6L0ZfKT4gOgotTSJXU19RTFc3UEo+QTMiQFI0LTU4RFMiWDMzVj5JJk5dTlojRVdESkwpNFBGW15GWiJcJzpTKiUrWk9fRwotTTA7MCo0XCw3QjRWSEEgVU9fWFw8M0haXylKQC1fQj5FNlxCKlUwSDYrIDZGKVpbP1BeQ1InKUopVzImMAotTVEyIi5MJEhXJClVNi5QSyEvXVdILzEjNEM/SUNNNi4uPF0iSypBME0gOkk8XzAxLzJcVDoxNTI6RD5PLQotTTRQLiVbIkYsSyJBSSYrLEFKRz0+X08nMydMOiJaM1QgXUA+VC4hUjE1Ik4xOls2RzgxUl1JNTRGNVQ4VwotTSxVODFTIz9RSDNeV1FSVi5BLVMtN1JHKiZJQidLKzVXMTwuQFMmLSAtOzspJE5bVV4oUDZKVyQqWVQ6XwotTS9QOjA+OkguIUgoK0ZDIS1FQiA6PjpeISxHQidPQTA2IC5eSkJKMFcuO0IpKUI1N0wiIzA9KTc6ST1SSAotTVtCI1UvSiItID0+OTdGP0lEIV49QzwiNF8hPkg/SSQkPiQmPTdZSTtCSTEqPTYnLV09TE5YXjIvUEYjXAotTU84RStVNjEyTFVIIC1SXj5JTUdLWFQnNF4mRUtVXT88OylLNFNXKCMoQlImLCExWUw9M0pEQCY1TUciQAotTTVGPU1MVC9KPUxLIEBUTkxLJz1UWkYxKTVXWTQ7XFpRWEteNV1YPTpMXD9ASV46QEwvPlI+PlZISTktPgotTTJROVJOSlVSMyI9OkAjITIwU0BdSktFVTsrUS08RlxdJUU9PiBRLz9CPkUiI1UjX1RfJDJBNUtJLV9SMQotTSZUO19MQ1o+LVYlVjFMJENLUjQ9NTNUUSlCTiNdODghVCMkPFglMFRWVlxdMiVISSs2PilORFMwV1YyMwotTVRBOFRaIV9WTFMuW19dOkQ8SkElLipBJzJGJ1JaX1UmQSAiWCg7X1BFP1ZcPVBISz1NRyhRNiVVPV5FNwotTThNJyQ1OUtfI0c3IEFKKUEwMjVYIClZQCkjNUFFXE9ENjVWX0dYVSpUIzpcNE1ROFQ4WE8oJy1QMyBALAotTSc6NSM4MCVKSE1QQUksSUtZPzQxOVxeMzUuRjFVUTdYWUgqLlhYVV9EJDEkQiEgOUgkQU4rKl9LXVg5RgotTVMxUCNAXEwxK18iRlhBNTUgLl8oMzZMKDU1KVVBXUVEOyVBNU1GQkwlLEdeNl8hJVNXVysoUDpBMEVBQQotTTNQVF9WVUBFI1Y5Q19LQSojSl9YMSVGJlxTPydIQlAmI1NbMz0xMVZZPVwtJz5KVjs5Xj8jMixTRShAJAotTSpEQEciMixEPFlXPCFaPTgrKypCVCY+Lyc3S0IrKzFXNlxbST05KCUxTCdTMCEjOFhPIlQnWyQrVTlFKAotTUY1MT1CXk9UN0ksXzcyVUVVTFdUOEIkKVg4O1AqOCg3VEtNPT4yP1I8Ok41XU5UTCohQ0MnSCdFQlYtXwotTUcsUi1EXF0yKlc9Il9QWS9OSCZeQSg/SF1cRFZVW0dNWFdfKVY4ITdGVEdWUU03OFJUPkZBPiZdJzNLMwotTSFUIT1FNDtEOkFPQSAkT0w9PF49Mj9FM0FXNl46KElSS0xJSiAyRyhQWE8iJi1EL05ZNUpUUyInU0ZPLQotTThRREdNI09CTS9GN1E1RCozWExBLk9WKidcT1VBLFtcJT5MUzhJVzMrRkhKKDFJSFMyQyUzLlwkJkYrPwotTSohKD8nKEs3R1xNRSpERVwkMEldRE5eLj5SUycnIyBHTU1bXzEzLDhPWV9MKSEmMkpKTlJbISo8TzIkSAotTTk8IklXJS9INiIvVV01WjlIJ1g4QltAPEQ2XSY6QUFZWCZEVk0qJ0A7VVo+Lzc7KF85Kl9XXzY0TCtcMQotTVwlSUhISk5ZK1Q2PFBbOE8rSFpGOjghIFtVXj45WlgpOU0zRzxdK0JRMkIuVShSWlgmQiExXVJEUz5GMQotTSBCPkYnOyhSIjA6SD1JU19HUlBQSzwwRiIvSD4iXldGL0dHWyZSVC4zSzswNVxNLDVMS0NROEdZSVtZXgotTVlTQTpULi8zJ1ouI0IlJVlaSyc0MVhXNS1RWVlFKEtMS0o7SDFdLTY/WUsrPChHJjpcVClWMVlYLyhYWwotTTdXTyQvPzJIXDhNNjc6UUk4QDtSWUgmWzZJJkEpLktNODFdX15aQi5dLSs5JSs0XSlTN1RTWEpFTzNdMAotTStUPS1TKS1bU1o3V0NBSU9NQk8mJlgrNDIlKzFFWSY+JV9JUUpUK1AmSE8nOUpBKz8tNEJKWzY7P1EtKAotTUchQThUJThWXUExOzxIPiRYLFVGKS5YXCspUCUuNy81NSY0RDEkRCNWK1ckPyM9WDQkJlsoNlhfRU9eSwotTUc0LlRZLDgpRyNHKzM9TklON0VZTjAmJFQoXjJBXk8xKCw+J144WCUgPEsyJipYOEBRMFZAS19eJFsnNQotTS4uTjA0QVpDLyhWRUhEV15GWVk9UVs8RkZVLU9AJVU4SlNBJUZaOURLLzxeMD1WOlw0JlNAIFRfJEReKQotTVAtQl5JMlgyMiZLRkwrUjpCJ1xdX1ZcKlNeSE4zWyY2PTpTTU8mVjcpIy5IIzswLklIWjdVQDRJViciMAotTUpLLitIWFo2Ql5NT0hXQVYzWldULytBSEApTitINylPXUdZNEJAWlBULF5VRk9AVS5UIUdOMSs9W19NMgotTUU3NzhcOC1fKTBPKSxNXlVeNkNWUjEqW0YzKkAwNllDTkBBO09HPyknJkArI0lLISorRldNPl4rXT02TQotTU83NFdKIFMrOzdAJUVCL0EpRCEuOjsjXVckIlZRNkUwIzI6UjRfMks9UCVWSz4vPVAyID9PL1I/LiM+UQotTUZOQicxSiUlLlhbU1JbSzBPLSIwLDFNIDAoI0E8SjUpLUlOW1YgIFw4NSNTIFZXV0JaQi83PC4kOCJLRgotTV8kXD8sLSdJLEcuKVI3JFFfSjM2VEFZPCREVkNcQShKLCtQUDggVDpbN01cWDIwSTxHOSo1TD5LXidIPwotTUFNOk9cV1pUK146Vks8VjAvXCQwJE47L1U9XyAjKS5cXkBRSytGNC8qXDBbTkZFMUVAITElX0xcKTk3WgotTSUrPF00LS8tSVgpJCszQSJKQzpfUDlaPjZPQlAuRiEwU1lCQjkwIjU/K0whPVJEJVZJI0ctNlREMyc+UwotTVApSCtGSD1TOV1IMT1DOFpcRCpGRVNEWj87LVtbL0BUJjE6UiUrW1MvUl0kMVFcTlIoPC4+NV1fN1A5MwotTV48UjM4PjlBL0NZVSMiNyZPJkkgKDxBXUtEWEUoQF9PQUk5OiAnN0JaWylZN0A2PCVXPS8iQ0NcXC8ySAotTTAvXC44OlpVKVBSKSwqJClORCFbMjAkT1gnMFQ0I1cvLiQuXTpSQEg9PTNZQExcLkU0RVRHVyk4OCEoPgotTSs0RVlYKCs4PT43I1MiLEE/RlpKJT5eWywyVFchM0YzNzQ+TjNON0kyQVNLVi9PPDotMy4pPS1XKEEsLAotTSszJEFSQVA8IVxZNychRShUQEkpXyIiOSMnPC8tKFE1PlAoXUBPQksyTCI+Q1lAJydQLSlEISg4UjVPQwotTT02Sys4WUQmRlw+QiAxL1BQS1A5Tl4oOiE/RlhYSzVIMCE7PysqU08hWl09SVk3TUEqNis6M0RNJVVTOgotTS9IIyJYRT5GWEcoLyNPVl0jO148T1RYQkwoJjovWEdCVV1eVVpCJ01WQkIqWiROXTsjTFMgRyNEL0RAPgotTSIpIj1GWD1VW0pcXjciWilHPzVEIlsxL1s7PiAoUkVMWVtSLE0pLyBKPCROXjZLUSldOCpJWU08JFY7PgotTVQ5O180Ji4xJjQzMUtKOlNTTUtIIkEiK11XQUE6W1ddW1QpSE1MJz0pQkJFQz0sPSlNJE9CKSxAJEA/OQotTTpAMUNfVD9LKSskKFZfWVdPRFtLQDsmQlg6WE43NTNeXzUtLzksV1BMLjJEKElJUCxTM09LXDE5UjtQRAotTTBfRl4+Tz9HKjo+Pz0qUjsnQE4wTyA4SSAgICAgICAhICM4IEdQJF0gQFgjJSAxLiE7VCc3UERWIlQkLQotTUAwX1QkSVAgICAgICAhOCArMCEjICVIIDwgIicgKVQgTSAjKiAuJCBdUCQuIDIwICAgMDogICQxWCEzMgotTSJGLCoyQEosIC8kIlghP0YiVjgxMSEiRyBUKD5RUVkmJDlMLCQyNC0pPlQ8ViBZWyMpWC0mIVhJJFpEKQotTTlCLjMjKVA7JzIpUyEyVDNXIjIpKS5EKUBRSFApLjQwSTBROiU5QEUzIStVJTpcO1wyJlomSSAoI0AgUwotTSJBXDEsIE1fISRMNDlQKjsnIzgvQUIyIyY5OC9IIE5fIEJQJUpQLigoRlA9VVA9TCRLLC01USY/JV5AJAotTSMwTlUgJiQhRFFPXCNfVDQ4IFJOJSBYQSghQjMoSyQvPyIwNiI3TCAjQjhQIixUQlxBRlYkMFgkU0E9RAotTSVWSDM+QEQ8IyNURVMhJyUlP1QxViIvOyJdUENbMVAhIyJcRjkhOCYjTTAyIjFENSVWOEUmUCgrJSUsKAotTTohUVomTVxGNTElOSVSNCMnQVEkI1ssOEhSIy4gKVQpVSE/Xyg8OD0xIjVPKU0oNCghSl8nVDgiSlAjVAotTSdUOCRLIFpOKTNQIVEgJjElVkA9JkA3NSBPJEY4UDFGIlEsNjpBWF0jNywjPDBCXCFMVDBCMTI/I0U8KwotTT8hMk4nTUhGPyFVMCgzUC88MEc/Iz1IKkYgTD8iXkA8XyBbNyZHLEAiQSQiJyEoP19BJzomMkA1QVIlRQotTSUiJDU8QVtOIEZQND5RNkcjUiQ4VSItViUwSCYtUU8nJCNcKSQiICQmOkQ3TCAkQilPSCBOUiwwKEEoMgotTStQJ0InWlwvWUAhLCJULEVEUVBRJlcsNktAUzknN0Q8MkIiQSJFMEEhIDowISYsP1gxK1AoO0wjVlE5PgotTShWXCwlQEYkJjRAJSVQQlAnKEQlTiBMRylLKCVNIDMuJjUkQ0RAKVcjJlgjUUI4JCNZMD4+QTQ7JDVUKAotTUtASkgjOiRBPlAjKiRXICEmMT1cICEkQkNRKlwjL0BGPCAlRyNbXDBKQiBAJFsgQyxBRy4oKkgvJ0BLUwotTSExLCpZQTclKDMgPSAwVCEmVUAhXDBNTiJUODZMUVFDJD8wQzFRQVgjT1AyQFBMTyM2QDE0Ii1NIjdcKwotTStRIzciS1gyIDA9LClGWEEiUCVLIVEkKiUxNiAhXkA4RkE4SihdUDI9MiRGJz8wKkUwJEEjMiAhJFBIOQotTSIpVDAiMEsyJ1AwMjhCJy0kL0w7XEBZPCY7JCE1IURfIiREKjwhQkEnVTg+SCE3Qik2LDBWIFYqJ1UwJwotTT8gX0YiWlAtQDFEMClFMCg/QitCKF00N08iIVggVUQkMiAyPCBGUDJeUCI4ISQwPTBRKikjUyQvLyBIRwotTSQzJC47ISQsIksgMF0wO0EmRCw1KlFSUyMnODc5MjJUIlxUI0VBXjMnIkA1NTAxKiZQND9BUTdQJ0JIOwotTVEiMlQiUlwlNEIuKSk+IDciICJEKExUIipQJlIoL1QzNjFMKSI0ICEnMDlJJkNEOjYiPCUmUShGPkBGSwotTSAkPDMvMTJTJDJQQyYgXlooKzQlXVAuTCVMIDRWMUxZJChQK0cwQzsiP1g6PyAiWiInVDQ/IUgvI09ERQotTUVRJDcmKzw4UFFcPSVdSCo+QixLKUBMJShAIFIjXUAxKDFcKiE5ODdUMjdSIDwkOiBROzQhSkw2PlBAXAotTSJaNC5cIENZKEY8My4hNT0gU1wrOkIvSSIpKEA6MT9HIiJAK1kxR1EkVyQqVDFRUiRPIDg6UDclIUtURgotTUcgVSggJ0wxQjIoSyksWCs9QENWKU4oLjsiIlkhQigvSlFQVCM1TDJSQTUpIiwoICAwJ1snUiQ0XSFaOwotTShMXEAjQilKIT5MRE4xLSwjIFw1VSBHOCJURCBMICM1IkJcRlRQJTUmSTwzW0BCPyg4IEZNQTZFIU1QLAotTSchO1kiTFgmVkFPXSBKOEAxIEhRJSgkMCVQLi8iUjQ3LiA+QydFODErQVQhJVkoKzVAOiYlKFQ6OCInWAotTShMNCJUUEAtISokMSIwMyQmKTxEP0BaQSJNKChRMjRNKDpAIiFQJSYkUjgpU0AjUCJQJDdZIVFDJUQgNgotTSoxKjYgOSA+XSBGISJNIDtSUjpBJ1dAMyIgVFMmLEwgTyBNNCNCUCJTQEhJIENEMUMyM18nRDw6M0EiJQotTScrODFWQFczKU5QPEVATU0nJzQzTSAuLiEpKDpdQjQnJU04MVpQQDIpPzgnWiI1XilDSDpMQjhcIFZYQQotTTBQJz8jTyw+KTBGQyRPWDhRQUQ9IU1MQT9SNlUnPkg3TCIkVCNJTDosMjdNKEE8PCUgXTAgSCwtVEIvTAotTSFfUClUIF5eJEg4QkZAS04lMlREWjEmLSdPLD5AUV0gKS9IIz8wRjMiOiAiNFAqKCRGQEVVMDBNJjIgNgotTTQiMjYiLyxANzI3KSBcLCMnMFpPKEFIRi5QUE4mIVw6WiFSTCVKUCZeUSYzKSNINVgiJk8hXSArUSFVRQotTSNLUDZSIikoKCJEQjxRITooSDwkVlBaTSY8TCApQiw8IUlERSBQSUAkLTAqUTA5MSgyLDxeUSUwIDo4LQotTSxSMkMnUDQyWCFDXSRQICBBISooJFlIKFIwUVInUExCIVE4PSZeICdHMjlDJCI8PUNAIUohT0Q4UiFEXgotTSVQUEU1UDsvKEM8RjVQSy4iSjhCTjAyOiVZSCUuMERIIE84KFVCOV0pSFghMCBeLSJOPC5FUDJIJ1IsOAotTS5AP1AkN1g+KCFZXyNdPCRbQVI2JCpMIilQRUUnM0AuMjAyNyQiNCI5QS1XI0I4IlYwODEjJygjXVAxTgotTSYyVCw4MjoxJE00ICRQTiMjLygkLEBCLyNGLEUvQjtZIS9IOCMhL1ghVVgzVDFcXCRKJDVUISIsIV5cOwotTVsgTzInSEAuXFEwUicmJDxNIjhPJkpIN1kyIiIlMFQiVFBcRydFOCg4IDlKJTZAMFBRQj4hMjQxISExPgotTSZCQCVHQCwgKEIgOUEgTEApIzAlPlAxLyk1LChYQS1cIS84N1ZRNisoSywpUlAkMydfTDIvQC8vICo0OgotTVUgPlUgWDhHIlA2LSAkWDlBQVgoICpMJD9QICQlMCArKCBQOSczOEU7MSo/IEMwPF4gTS4pNDgiVUBHRwotTSY6QDkoQTovKChYOiEhXk0gUCAxJzFcLCBUIEVfUUkwJDEsPiFCJSYgNFAgSzIgUSgzKCAhIUZCIzo0LAotTSohLiYgSTAlXSFKRyYmKDkyUV9SJ09EQDpCMz8oXEQoJDEuPSMzUDpZUUVPJkFMMC1QMlgnVDQwKEBZTAotTSZSMChDMCxFISgoIEExISkmPlwnJFAvPiU4MEFNMCRMIjA4LU9BLjklLlg2VkInPyY6VCAsMTYwJTlAPwotTUAgVVElUlw0WyE9KyVAIDcoQjEnIjpYJi5SKVshK1BGOlErUCJAVEJFQUJNKCZQO1ogUVkmJSAoXjFCMwotTSIiWEQuQFtVKSIoLiYiMCgmKFgtWVFOSSUgOD4rIExBJy1YRScgRCMiVVAiQDE3XiEvPCg9MVZEJE9URAotTVgxTjYiIFgvI0AkIyUwXCVRMFFIJUxALSVQWyMjOjw3UTI4LyEiUDAtMFo6KUBEKlIxQ1shQjw3XiI1QgotTSA6LEJUISonIChMM1xCMzUmLSg5W1A/QCAiIDk5UEogIC9ULCAiI1YhUSQuJTFUJSYwPC1QUFFaIy40LQotTTVRXjMnMSggIzFDSCNALEY/IFI+IFksOFIhXkIoXkAwJ1A1LyNIJDY+QUtAIkZML0MwOjEgKUwqWjFFIQotTSYrWD5NUEc+I15MKiAhLkchKSggMzFEXyFVNDUsUVxKIkhMISsxLD4iMFA6LyI6IyAuTDhLIjlKJVRUMQotTUAyLVsmKSxBO0IyMidYTEZTIUQlJk84Ll0xPkgiPiQiTFFJUiFOJCw8UipKJycsN1AhU1wlQ1QxRTA2XwotTSlGRDhXQSknJEgkLF1BOlslJlQ0R1FIIylIKCFKISRaICIsIkExX18pIlw2KSBHMSUnIDNYUV9ZIVwoQgotTSMhOTYnOiQsKyBKTCIkODwzUFshJi88NCsxNE0oIVwvUDBbVSVDREVJMSwjJElENlghJCopKEA3IyFdJQotTSJAICxQIV8jJUxIKVlSIlcjWDwiNDFHVCVMPCYqMSUsKC8oJE0yKlAjSCAvXzE6PiAkSDY+UTNMIDo0JgotTSEwKiwgSVA2LFA9NyNPJCA+QipXJjY0RVUgLF0hMzwmXiBZJyZHPCtRMVZAKFBMQltRJzIjNFgyUiBOOgotTSNfNDtbITdZJVVMK0QwNVYiX0wqNTBHLiEiWCpZQC0yKD9ILUxAMyUnJEAiSlBKXCNPUDZFQFxRJC5AQQotTSNBNzomQjAqRSFNJyUgXDpHIFNZJUtYJz5QQF0gPzA1PTE7WyZbXC86UC0pKEVcPVswKUkiVkQoUVAhXQotTSZGOEBXUD1FIiAoQ1IhW1snSjhCWTAsWyM4OD8gQioqJUI8QDhQQyIgOEw/RkA7QidZJEBJMUs9IU5cLwotTUVASUkkKTAtVEI6NSU1VDA2MVArIVowQj0hJTohIEgjTUEvKCUqSCArMSczIUxcPSYgXlkoWCxGXFE7VQotTSdITC84IF1EJV1EIC5AKSAoUVAiRiBdLykrNEFOMVs8JUAkIyJAJ0EhViAkTSEvTSdLOD1JMi9HKT5YKgotTUAxJiUhUFA4UVEjSyMgKEBJMTpVIytYRiBQWSEiIiArLCE4SiAkVEM+QUIpIF00K1dRJlwlIUgmPUEgPwotTSMnXCU9QTFfIU88Q1JRMSEgTCgqT0IjTilKQClcUEtfIjxULTMgSU0jSCQqSEA8JyAoSCNHQi4+KDRUMQotTTlCJzwmLCBGKkInTSk0UCNZMTs2Jzg8RSJSIkohSCQqUzIuJSgjVCZPMjkyIC00PlMwTEUhOCwoWSFDUAotTSgoRDM6MTJFIixMOVxSOUkiWjhEJVAuPyY/NCVMIVxOKD8gN0xRWlIiIVA3ViExQSBIMC1PMTxTJl04PQotTURRK1okP0grL0IyMiZCOCRWICBSKC48N1gxNCooVlQ5V0BBOyFCQCUkUFsjI148Oj9RISAkVlwjXVBSMAotTSU6NDJVQEsgJzY0IiUgL1cjNlA3WCFMVCEiJDRWQDZJJTw8ID9RVS4mPTQ9QSEzQSEnIDItQDstIjlUMwotTV0iKlAjXjA9UUI6ViFVUDpcQFZaJTggLyIxLDghTzBGQTA0OCMzOCdVMVIzIURYPkNBMjspNCQkN0BbVgotTSFWJC0jQiQyJjAgIF9ASFopOzQ5MkEtQCA4VCokIVRcKSNMQCogIycoNzggSDFDOCY6VDVKMD5GIl9MNAotTUNQKE8kVVghLlA4MihJRDwkQiZOI0w4Pi8gUy4hUCg8OSBJKCU3VEVEQihCI0NMOEExPVwjQUghKCEhTgotTSVKMC1EUVAmJFMgQi1BQlMjVCRDUCFcMSQwRDE7UFA3Iz4oJkRRPi4hWEQ8U1FBUiImQDlIQTs2Iy1cLwotTTBAKU0jV1w1QiFMUiUkID85MEdbJiUkO0dRVSAhK1AzKEBGSScqIC5BITshKTxARUlRTzAgO0w9TyIkMQotTSVeKD9QUTshIyggPjEiMFokLTxEQ0EoXCcoMEIoIF1NIERARFVRPEImRkQ2UlA1WilKODtMIEY6IiQgNAotTTdQO1ImO1BHIVI7RChbUDozMTIyIz1AOSkyNj8hRSg1MEBdWyIsJDk/MS9JJkhAQi8xN18jXDgmUiBSWAotTSgpXDRQQjtbJk4wNz9QMUIlJzxBLTE6MCY/RDNeQUtAIDxQIVZQNFEiTUQ/OCFGQidKODs6QjpFKSpcLgotTVQyOUokJjwvIFApUyk9RCg5MCJAITJcRVJCJVApJSxDITFSVSdfTDdAMU48J1lUNj8xVlYiNzwgQVAlVAotTSYpWDFfMD9LKF0sJSshNicoWExCREIsQigiQDE9QVxMJ1Q0PCwhJiIlXlAhKjAwOSZUMEVFMCRXKE88QgotTUxRPTojXlRFOzBHLCRGPDEzIFQtIzxMIiJSLlYnLkQ/MFAuViMtXCFIUVglIk5EMiUgNlopKCAmR0I4MAotTSBFIC8vMVcoJSswIjdQTC4nKiwsXyFTVCknXCNaQjFWIDkgIVkyO0IhLkQgLSFNXyMoKCowQS4vIy1MMAotTUMyM0QmTFA0VlFVNCEpPEQjISxRKFtEJS8gJFIiJSRGUSFeUCBdXDtTQThLJk9IOFMgRkwhLzQ/PTAqKgotTSM/SD4zMD01JzhYIjcgMCwnXyQ/WjA7USc6KC9VUDsxIkhQPzEwICEgNzAjMlBSPSVNTDYyIFpIIjZEQAotTUkhK0YgWigvWlFfNSJDUDlJUFNGJlRQQDNAK1UjLEwvLlFaOCA+QDxBQjNPIjxQQiNBVT0oPFg7IzBXRwotTSg6RDc1MV45KFckNyIxPV4iXVwvUUBQWyhRLEJVIVhbIjogMTIhWUEgVCg2RCIzNyA/TC9FIik/JUU8QwotTS8gUDsnNiwvUjBLNSdOREE4QT8qJjZEOE0gKkYlMkA1T0IwUyVQLCogQCFKIVooM0ZATjMpQUQkL0AoXgotTSkiIEEiMVo5JSFcRTAwVlIpRjQ8OiAuOCg4UDNKIjgrKTdAQlUyIi0oLVQ+TSBYJSg3WCtYIVolJDIoIAotTScgOFkkMkglM0EtWShKPENCIVRGIFQwLUBCMFEpIlgsU1AuMCAyKCVWMSUsJVFcMCxAXkMlTyhBUVAiRwotTSgqUClMUUw0JFhUOT1QSEAgQUAqSlAjIScuOCtAMVlaIFEkL19BITghK1RCRSA6NiQ7VDkhMFQ9JjE8JQotTVhBPykhK1QkOzEvXiM1PCQtMD5GJkEsPF9RQCkmV0g2UVA0WiEiSCdDUCknICYgQjMwUCQkTCA8QUA0PgotTSZMSDdNQi8+I1RALTohMD0gSjQ9MzAvSSNGTCVVIEwgJldEL1xRMEsiXFgnWiE9ICNZJEE/IEhDJVYkNAotTVUwIzQkOlAqO1E0SCcpXEJBUEsiJkpIQENRSDQlQTREVEAyQSFXMCZDMU1GKTE0OkdAPz8kJEg9OCIuKQotTSJBNDwjMV8/KCBQJUshSzApL0w0WFI5RiQzLDZYIFAvJVlMPEQhIDMgXVgjPjIiRCdPLD4nIFBDKCY8QgotTUoxLVAlSSQuXVEhPCBULEApUFlKIzwwREtBTU8hVTA8MSElKyBAKDhTQS44IEA8IEVQMT8hWCA7XzAiKQotTSVGQEQvMEc+J1QgMidBV1sjJ1Q/MkFRJChULCtbICZNJClMIjsxKS8gRDBFUUInNCdKUDhEUiNZJFZEKQotTTlQJywnKkw6OjFFRClPXCMpMC4zKD9AMTcwIFgpJTw6XyBdLSgmMDdWIjhTIz5cIk0gM0sgMjAjMDBRVgotTSkrWC5HICQzISRMJVJBSyUhI0BBO1FfKyE3MDMpQExaKThUNkxAI0woL0w1KiIjKShCXC4oICFGJisgLwotTUkwLEkiMlQ8N0AwRCBZXDgxIDxVIjA0OVIwI0omVlwkIzFeLCQrOEI0UDE3Ik4kNFhSLzYkUChBN1A+WwotTSk+NEJdUE4rIUQ8IS8wJ1wkP1xFTkEpICZLQCc6IDNLKUZAPFlAIlAgM1QsPDE3MSJSICVFUChBKDQoRAotTSsiLT4kRSwyPEBFPCNfICVHQU9ZICI4KTEwQEEgNjw2IEIjPCcsOCY0MDAyKUcoIVsgJkolNSBEViE7JwotTSYpNC0/UC1fKSAoISxQXU8gISg8TUA9IiFQVCE4IV41Iz5YRlAwW18oUFg9MzBYUigxLEBMQSFRIypIIgotTTowIEYlU0wtLCFHTiFAPDBTUUFSIV1AQyExN0ckSkQ2NzEsTCQtQDU7IUIkJFRMK0YwPyUnXiApJFBYPQotTSVPIDgsUDA7IjQgNCJBL1okI1RCRzBWUSgxTDRAUDRAKT1YRjJRREAgNVg7TSIkWyYxVDMoISJAIFtENgotTVsxKzQlVzg0QyIlKyBYRCg6IVhPIlNEMElCOzciOjA5UkAkSyFbPC5IMjFUJDs8MD8xIlEmXkAhKjBeSQotTSg1PCFQUFpdIlgwNyhBPSQjXlw1RVAqTykiTEQjQUs0JFc4P1gwODclUkhCRlBaQSkoKC1NUFlOIUJQOAotTSYwJSMlOzguRVIqKCgrRDpaIDdYIzYsRUwhT1YnOTBCPTBQLSFAODQhUSUuJkpIPFpCMSsgQygkV0ImUAotTSJOSDg8IVdHISNMQj5BJF4hOzAoWUFaVSgpNC43ME5IJEUsIVBQV0ghQlA9R1FFTSNcVD8pICUhJDogJgotTT9CL0IgNyw+W1AzOChROCNZMDxMKTEwNFwhNSglWEQwM0EuIyM5KD8oQEE7IVlcPF5SK04mQkQxNUBXRwotTSIhUEJNMEMwJj4sIidQIkQlTVQyXiFbQiIlJCZPIFsqKDU0LC9QVzMiL1A7KDFRLCQvOC9YUC1aJ0EkRQotTTshWCAgI1Q3PVIqRidBMEMpIUhbIzJIJ1IgLVkjUTA5T0E3QyFeMEVKMDtBIlVcIjAhKiYkLVQnVVE7VAotTSJNSEJNUExMIiNAJ1NCKF0jITgiJyBRWykqVDVNIFcyJFNYLD1BVFAgRiQ1REI7TilEPDYnID1BICAkIwotTVQhLVMiXiBDXUAuWyQyPCsgMC5KISVANURRNCshMUg3MEA+VShUUEErIT0pKFYkMFsxIy0gRDwwQlBWVQotTShVTCNGIEolJTFYI1AxPFkiU1A3NTIjQCE0JCEiMi03IS1ELSgyNlklQkw8JEFCLCRDQEVaUTBaKEBIKwotTVtSMzAnXiAtVSBDTSJbQCA0US4jJCEoKCAwUlcoJ1g4KEA1UiFFSD9QITUqIF5APEcwLlojIjxDQVFAPwotTSFGODwqQS4kJTJYKEhCOEggKCQjTiFNWyMhPClcMCEkIiRENyFROzAnVjg4NjIkJiRNLCAqMjZbIE8wNAotTStBJUMmIUwjLyFMXSA3VDUnMiUsJUlQPzohN1gpTVQvW1FdNSlLNDUuQjI+KTRUMUlQU1MpRywrWzAuSAotTSIrLCYmUiw7JDM4LEFAWTglQiwzL1BZJiMkPEBMUFwgI0o8N1ExPlEnLEwrMlE0LyA1MCsgMSE1KCMsKgotTSIhIlQkWlQ1UlBfVylJRCw1IVciIE4oMVQwPV0lNiwhOSIhSCBBVCNKUF5JJFUkPVlCLFYlJDgnSUIoWgotTSg1QClUUT45ITk4QF9RWzgkVyA3NUA8WCIgVCM0IEEwKFhAQEQhOighLzAqTiBGLSFcVCIoUTIyIiEoKgotTVgxRFkmV0w0XiFXIiE2VCUmISA3IFgsMVFQXEUjJDAvKVBXTCNQMCteQENHJ0UsMC9QWiInSzw3XlAoJAotTSNeTC5ZMCY7Jks0PURALT8mL1QpIEI3TSVUNCc2UEY8IShQPlhSJC4mKDgpNVAyVSk5KEFHIU9EJUZYNgotTV8iOj8jPSxGJyFJVSFPPCxIQU84Ii5UPEdRM1QoU1wwPSAvTSFSLDJXQU0wJkE8KlIyJDEoTUw6KjBBOwotTSdWRCdOQio5Il5ILyVBKiAnQlxEQyFNTCdYICMyIVE3IjZcI0cxOiooOlxCQlA6WiZfIDNRMDJJJU84MQotTUBSJy4lR1RDMDAvRidYLDg+MC0gI1xcLEUxRSIiLlxFUkE2MCEwVD0oIFYiJUg8IlxQWkgmMSA8XFFEKgotTSFJVC03Ui9WJ0tANyAiJkYkNEQyJFE4PyVJQDlfUCojIyYwJ0IyJjMgOjA5TkFNKSJdUDk4IUMqJScoJAotTUJSOzkgMlAjKCFYJCdXUDo4MUlaJD9AOT1ATVElNVAvWzE7ICA6XD45QC0pIllAJCIhWEQpKlhHIFBANQotTSIlPDIxQCFRJygwLS4iKT4kIFQnLDFILSZCJDYtUCw7JE4wQkZSLkohJyQiKzBXPyQmVC9PQElEJVBAJwotTVVBRyMhLEA4RjBIWyUrSDFKQChGIk1ANlMiOFIhIzAtJlFDIig9WD1TQFohJzMwJFkhPkYpNDA1TUBLUwotTSgsUC87ITcuICZEK1RCNTMgKEgmPUFZTClFTEY3MFhCIEQ4OVVANE0nQ1QiJEBGXCMzTCNNQFVAJE08PQotTSRCOikpPygnISEvSyJZMDIhMFkkJEw8OiBRVSYkJ1xCM0FfOyFGMChEIDwyIkUoLjMyLigoJVA+PSI0KgotTSlMIDspUUMzKFFQITdAVjghXCAjICE5UyQ1LCs0QiFAIFw8JzJBJUMoQkw9UkBZRCY0UDJEIUcsIEJYKQotTTQyLEkiOVg0J0EyKyY9QCk1QSE4KTM4Ny0wUSIjUTQtRkAgMyYsNDs/IUNBIC4sNVJCOFEkJkAiJkFIXgotTSJMICUuQSItIiAgNkYxPCskQkAqUFBMIykxMERaQjVCIUJUI05AU08jRkxFKUEpNylDWDMqUEcmJjw0QAotTUsxJEwjJiggNyBRQSkrXCM5Qi8wJlwwIDZBL08kKzA0WCEsWCZYNCZDUDdQJlhMQk8xTF0mSigpVCAoXgotTSYiLDVcQCNBIUZQK0FQNEIpSlQlVlBINiNOOClNMigiIzZERVEwXFMgPTQ4VVIiXiU0XDVJQUlCJDFQIQotTSNQXk4gViw/R1FJISBZKCk6IEE1JycsRD4hOTMpPlQoTjBWMCNSJEZIUTw2JTVcOFJAIz4nXyRFMlA4JwotTScrLCQ5QS1SIj5AOzRBO1UoUTREUTA4JilQQD0yIVIrJj5MIy9RQlwjS0QhQkA9NSAiNDFQME5GJS9YPgotTVUiLT0mOigoRTFDTCgzWChUUD5AIlhQQE5ANy4mPDwvJSAwPiA3VCJDMF1KKD4gQjgyO0glRUQrVSFJSQotTSVPICYoQEFVIjBcOSxRWUwgMEQ1KCEzWSAkLEIrIEI6JjA0M15ASUckNSQ4PEBcSyk4XC9aIVZEI11MKQotTTtRIi4oIkwqIDI1TiQrKDArMTg4IVVcQlZCJCQhUCAhXEFIJyJIRDckUUFeKTFYPDFQLzwlIVA1VjItKQotTSZKLCpAIVBMKD0gMFRQQicnWDwzI0AtXyUvIDlGUCNBJkhQOzhQNDUhMCQ8S0AwQCZQUDgxQjFcICEgOAotTSghRD4mWzAwIjIoMCVFTDc3MjpWJSskMCNAWSMkV1A2TzEoKCRHPDY5QV1KKTFAJT0xIkonMEQhQVArQgotTSNWRDFdQSJPJzlIIiQwJzgmQVRGL1FKMiMpSDxWMVdOJkk4Jz9SNFUmREQ/JkE8ICk8NCozIVZXJzVQQgotTTMhQFojV1QgPCAyWSU3LCo0UEY+JVRMKVRQMy4kIUQvVUBNXCBEODQ+IiAyISNARCAwMCkgRUg9JDBAMQotTSZVOC0sUCdJIEkoPTMxQDcjKkgqTDI1NCFBKCBcQEQzIzFEIyJRMjojISQ4UTAgOCEzIEBeMDMhIlU0RgotTUxSLikjTDwvIDBSLCEwLDRVIVtWJDpcMCFQOF0nIzQ0XjIvJCQsVEJRQF1PKU1YOT9QQTQmQ1wqIUE0UwotTSI9WDMmID0tIU9ELCtROCwpS1gmXVEuXyJZTDgwQEdIJlMsLF1APjIhVVA3KSIsMSI3UEA9UFI5IStIKwotTSdBLDQnLyQ0SiE8ISMhXC5QIFdWJ0lAJiJAKkgpPShGSzAyKSQoUCM/MixUKUNQLSFQKUwmOzQjSzInVgotTSA8WC1QUUdeITxERj0xVC8nMzA2TzBbSyhUWCQ+IUUnKU8sNUdSLTgjV1RERDA3OCJcJDsuMEolJUdMKQotTSZBSjoiMyAlWiBHOyk/PD0qIVk7KC5cK1YwK08nTiA8WkEoVCJMRDRbMEhZJVMkKlkhMEEkRlxCU0BfTgotTSItNEJPIiZeIEBMOyggSywkKyRAKUBbNCguIDkoMVZQJiRcLUUyMCYoKEhBOVAgXShdPD0kQF9MKEc8RgotTUlBICEnX0xGRDI1RSMzXDE6MEBMIjMoRkRBQEImJThBQlApJyQhPChFIiMmKTFcQEMiL1shQ1AsWkFUKQotTSkrNCBZUVssKTUsIDRRKiskLSQ1KCBbQyRPKCZbIEVGIVU0LV5BQD0nSUQgI0IiKCJCMDc1UTEgJTtIIQotTUBROigjKTgnNTBGTSdYIDZUQUEgJEosOyshNkYnNURESTFaRCM8TCpOUTlFIExEKCEwST8nMyAzQiEsRwotTShHLDA8UjsqI1tYJS8wTDMhRTggIyImJiUjSEBQIUE4JEEgRC8wMjonJCAyXDAtVyEgVDJeQiVfJkcwNwotTTchUV8nMURGJ0I6KiBMNC9GQCw/ITdAKTcxWDsnTVgkTiBSJCdWPEFJIVc9IVJMQl8hODkiIkAgTzBELAotTSYnXCBWQUApJTNQICAwIyIiSjhFL1ElOSNBLC0xUjMkJE9YQUNSO1ghPFgoJjBXNyIwUCMyMS44I15ENwotTT9BSEEjVEA8STItSylNOEI3IVkhKS5QP1QwQj8lTyAuRFIyKSlNUENYUUYoKC5EQj8xSEAlXTAvTUIyPgotTSRRVDY+ICAtJUNMKE4xI04lP1g4OUAmUiEsND0pMEVaJUBIMjlAS1whIEQxISBQMSFDLCdSMUcvJFQsPQotTVRQMSokWDQgJVBEPSVHPDwrUEcnJUQ8ISkwMkohVkwhSlE3XyEjRC43IChMKUI0NEIhVyAnMDxCWVE1VQotTSBIUDc/MjZbI0ZMOV8gO0AkLEgpVyArViZELEVQMFIlKSZURkhBWDkoSEQsKEEgNCMxMCtEUVEiICNcLgotTTVRIUYhSUw0OlI8ISYwNEIrICxeJixQNFowTzAkWkA9QCFXRSFOQCpEIUJfJD88IFxSIiwjQShDSCIuJAotTSQkLCY0QjVXKFVANCEhPyQoWVQ3WEEnTSA8WCJaMVFWJjggO1hRQyshUiQjSSAwSyAyNCFOUUg3ICQkLgotTVEhI18gTlxFQFIoJyU4IEJTIVkkKDVUMEZBWzEpJjQ8NEBBICMmNDBKUT1CJEwwJCpBKlgnI1wlVCAqNQotTSk0KDA0Mi1SIEkgKShBMlAhVFwwXlIjIignRCsxITNaJSYwPUdAS00oOCg/PDE4SiNYREVXMEReIEIkIwotTTkxSkgoQCguXUBBVCReJClKIEkkIF5QKkMwOUYmXEQ/STEqLCBaJEIxUjBYIUFAQjUxOEAoJChFQzE1TgotTSRANEZBUixNJF9AJyFRI1koPDQiLkI7TyY2MCMwIiYwIFQ4QzFRWlAlUSwhPzBLKyddREBTQC9DJUpEOAotTVJAMl4kWFw0USFMMCA6IDJWMTxYITEkPT8wNzsgVDwnQiE7ViVHJCxSIEgsJSggJU0gXSEkLCA6SEBFNAotTSdLLEQqIDJBIig0LShRXVIoK1BGSFAmVyU8ID8wUTs8ISxURUBBWkclVSRDODE2NSBcSCRJICVUJFQgKQotTSoiNl4oXjgkP1IrTyUmSCRTIEcmKDokRlBCICkoQTA9WFBfLik9TEZMIDdfKCNIL0tRPSspQ0g5TTIhKAotTSQoOD5aQEIqKSEsOEVRI14iTkgsUVBXQCc1TDgzUEE8JC1IKFJAPlcgRywxO0E4WiM1NC4oUSRZKDYoKgotTV5BRFMnVkg7MTE7NyZAWEFLIT5JIlpEIiIgXC4lJkxDVVFXMCI6XCpZQjVaKEBERjIhQFwgUjBALSAoIQotTSBISEEmIFA/KEgkK1gwMiohLyw+UyFeUiVAIDwyMF0xKT1cKSowK1QpP1BFITBMJCZVUCtKUDdLJi4sPAotTUVBVScnXlglVSA3PiIjTEY8MjZGJz1IRkNSJk0mVFwpK0ErXikpUCZTMjg3I1AwMjkiOzUgWlgjODBLPQotTSU0PCAjUCgwI0MgNl1AJT8gICAlPDFdPCRFID80QVYgJUo4LDAwPTsgLyQlOCEnSiMiOD9LMCxNIjZUPAotTVNBJUsnPFxCXEElRiI5LCJMITtLKCMoLSgyKiAkNTQ1Q1BPVSA2UC9LIiI1JCg8QEohOTwlWjwnSFFUXgotTSgxQCkmIjYxITcsQCRQSCIjUkQjKSE4VCFCUDVdQCNdIiQwPFAxQicoSFhFJEBQJCZDSCM2USxZID04JgotTSggXSojPFg2WTAhJCItMEY7QDsxJkQ0RVJQUV0gNyRENFFMLyZOKCdTUSM/IVxIOVMhXy0iOEApKjFUMwotTSA8JCBSQF8gID5INFZCKSAnJiQzRSInQCVQUDVJMSw7JV0gMSdRQlMlTlglXSFXNiM0QDhXQUElIDpQJwotTTQhL1MmIkgpPTE3KCFVREI5IjVEJ0M4LyoyNVsiRDA+NCEvIidPMDVMMTBEJCAoQ1hAJC0nX1QtXzIgSQotTSYlICsyUVggIzc4P1JBVjApRyxAIyA/IiVeWC1DIi9OKCwwJSkiIyMpJiQuRCFLSSlFNDElID5PKDckNwotTVRRXkokIDA0SDBcNSkpXENCMjdIJyNAJ0owSCkjRiw5MSBBWSIyRDY1QidUJTBEO0QgUSshW0hEWTEqOgotTSUwWDlDMUgnKDRIQjFSIFUgX1ggISFUOyFFPDEyQTRXIkhQLUVAIzgoQERDTkIvICk0PCkrICMpJSs8NwotTSFBNk8jPlAnJFAiNCRZSDZFUFU3IkVYMShRPEonJEQjLUAkUCUqIDMiQiZLI1FcOUswPDInW0Q3VzAzRAotTShLMERcMFU+JlwsMkQhOFwjREwoL1AmNiZQNDlfQjpOJSM8JDZRTkElNEBEVyApXSJdPDIgQEJFKDhAOQotTVQiID0mVTw2RzI0OyAnPDEmUigvIjtcRFYxMV0mJEw5TjA2XidLQCAkMV8lIUU8MFpSLkAnOyQqWSEqMQotTSElRCxaIjc/Ii5URDIyOkYmUSguIyBXQSgoPC49QiUoIFtAOSkwPCIpKDApMTFdSik5PDIzUC00J0FYKwotTSNAKygmUjQzOEFWLCBUVCExMiY2JVFMPklAIiYjX1BAQCBIQiMyJC1HQEFEI1IoJENRWEkiWzQyR0FcNAotTSJaWC4+QUE2Jl84KFdBUzcmXzAgVyAnLSQyNDo6MFRfJz80LVMxITMkNjAnT1AhQCRPVDM6MD5DIUwoNgotTUsgSiIgPiA1RDIhUykrXDREUTFIJT00IThBX0shWExELUEzOiY0NCwvQENWJzU0N1MhWlAkTSRFV0I7MgotTSFMOCBNUFAuKEg8JThAOkAmRVQ0MTFITSE5JDknME5NJiksMVMwRikoK1wsSUEpSCkrVCs9QERPJTZAPAotTSNQR1AnUlw8T0EhJyFKWC5FUFomKEIkPjFATkkhISA+NUBLIyZGWDhOUi4nJVlcNVMhNV0mKiQmREI0IgotTSA8VC9FQSUqKEFYKiBAXUYpQTA7JlAiNiYtPD4gQFRTITMgP1AhPTQmTlAyXyBAWyMwKC4+IDJVICcsNgotTSQiISAjLlAhPUIsUyhDODNNQTBCJF4wNjBBSjomXzBFLzBQSSNOJC9IIS1EJy4sOkggNCIpODhEX1I5RgotTSlNJC1bUidfIjRAOlsxMUInJ1QsQ1BVJig2NClPQDhTI01QKypCLFslVSA+RlE6XSczTDtUMChAKFQgQAotTVNRVTYkPUwoK0BXMiFCRDtWQTpeIVxQJVJQOkQlOTwiLkAsNyJBKCwiISxHJEosPEYgOCkpLlg9PFEjSwotTSNRQEYyQUs4KDUgL0chTzUlRjBFOFAsNicyWEVQMCM7JyhMKEVQRCcoPVQ0RCFfIiU3RDhMQU8hIENMKwotTToiITEnIShGLzBdICRdKCpOQDgkKFVYIUJQVjAjLyQoWCE3QCFbMDRfQTMjJzNcLytSKzchNiwzIFI6VwotTSApXCZbUEcmJSlYP18wOzcgSEQyVlE4JCVSKD9FMVxKI1IwI04wITslKSQiMkIiUSEzLCwgMTUhIkYgIgotTV0gWkYkXEQtOiE3QSJWVDBZIFBFIUMgMEUiOVcmSDA1SiFJXCBWTCtHQDVfJFooKU0wWVwiKCw2VUE+OQotTSYmLEUkUSU5KDhIJF5RQE0oPiggKiEpQCVASEYwUCE4IzYkNz5CJT0lITw/KDIxNyZJLCo3MTI9ISwwKgotTSlAN0cgRkQ3NyIjViA6UClBUi4uJExUIiVAMj4oXihAOlI1KiZBLCQlUUo0IUkgKj5AUl0nVEA6PEFWQgotTSJaJDEvQjNUIDsoPTdQKUcoVlA0LkFbSyJGSC86ISxcJ0pcKEtSJVwlKygmJCIjJSQqXDxbQUM7Jz1YQAotTVNBX0AiITQiJlEuSSc7MCVHITI7ID4oMF9SLlUnU1w5NkA9ICNMUDM7ITAzJDA8OkVQM0IoKjQtJ1BZIQotTSZGKDtDMik1Iz5ILlQxIFIgI1A3O0FcSyg3XCI0ISdIJCBILTMhVyEmTiQqQjBRMCgyQDhOME9DJlNIRAotTSQgPT0jI0gyXlFATCNSVCQlICxWKDMoOSIgPiEmRSRCKVAmTyYwNDxLIU8hIS04OilSLiwkNyw0IiEkRwotTSQ7IDUnQDBIKC4wIlxAUF8gNjwiPkEwOicwXCcjUDFSJVM0IC0gODIoIThBLzBPQSNbTDA/QDEuIjs0LAotTU5AXEAnOCg6TyBRTyNEUDc/UEFGISlML11ATl4lQSAkK0FaPykrKCFIMSVcJVFILDQxXzcoQygxVUFSWgotTSItSCooUjcrKUdEKiAwXCMjTDwxMDAxIyZMUDwxUCwoKEc4OVFQPCQkVjA5WEA6TiROICZSMS1ZKT9QIQotTV0iKVgkUDgxUzBUPSJEPCc6QiczJVo8N0tQNTAjUkA3XDFBKyIsQC04UFtLKUZIIiQyJ1YkXFwyOjI3MgotTSZdICU+IDVJIl1ERFIhXDcgLkA7XEA0KCRcMDIzQUY2KTooM0AwUkwjKDQqOyEqQCdDMDNaUDZNKFEwIQotTSYwIjAlPVQvWEE5UiIqUCslQjk6IFhYLj8hNl0oMFxANDBKViNWSCEsIUQmISAwQ1xQQTwjRkwpOUA9OgotTSA6SCs6QD5BIzZMOUwgI1UmLTA2XFBFVik8KDhPMC5XICk4KDgxVFUlVFglQEBLKyAzLERbITpKJUYkJQotTS5QUloiIFxGXEFAQCFNSDJFMFNBIFw4QTdSKl4gJzQ4MTBDQiQtREIoUFU8IEssNzYxJjkiPkArTTBcSQotTSM/ICVZQTlAJkdUQ0lBWTchQ0RDLjFaWCFbQC5IQVpWJSlENEIwU0UoNjwqV1BFOyc9VCEuUURPJzA0KQotTUIgLk8jPlwnQVEoSShMXEMtQVAkIVxIOCMxIE8oQzQpXVBZICk9RDYtUUNTKShYLylAWFAjWSA8MTBHUwotTSk+MCNYMENGJUo8KC0gOzQnLURFUTFZTyddODhLUEJRKUhYRVZALVQiRzQuVyBNNyInXDUzIVJeKFAkPQotTSUwKCMpMiwrPFFPQyhWSCElIFkpJFYsJzxQP1wgRUw0ISFQJyZXPD4oISVBKUhENENBOzkoVSQuPjFBKgotTSNfUCRZUD83KTxYLiohMFwjPShCMFFfLiRdXEItMUpBIyBILk4xUSwkUSwyIlEhJyFKLENGUi8+ITQwKwotTTZBTS8lMDgtQTImVCZXMEQ7MFgjJyEwMSdSO04nRzggOjBOKyc3KCtBQF40KFs4OkIxMzwjPiwkNzExQgotTSYsVDs3QFspKTBARjtRKlsnMkBFVEFNPiNdSDAjQF9FISo4MFAgRV4oMDgsISA1UyY8KENSUVRXJ1gkMgotTURRLCogSDw4LiBTJiRJRCVTMio8JE9UKTZQNkgoKDwjIiI6SyglNEQhIFRWIk1YLCxRMSojSCgzQTA4IgotTSJDLENRQjE/KElEKUxRIVYiXzgzJCFaRihEMD9HIFlPJzc0Q0IwKjsnR1g2N1BDNSReKDU3Ui4jIzRYIQotTUlAXjomTzg0OyAzICFaVCE9UEslIF4wMC5QNTskXTA9XSAuTCIvPEInIi1DKEZAOFVASlEnXyw0WCElIgotTSZXLC4rUU85IU9UIDghUDghLVgjPlIoRCIyIDMyIEJFITg4PjwwT0EoIjw5QCFORiAyTDw/MDozKCEgPwotTUgwOiYmPyw8UUEwOik5VEZdIE5BKT0wJUkwRD4nNCgkNCFHNSZHSChVQCglJDsoMS5RXVQiVEw2RUBXXgotTSdHNCo2QU8oKSZQN08wMCwgLUQjVSE5WShXSCReUUlOIlpUODNQSFMiLyRHIlAgICZVXC5UQFZTKStEPAotTSBBXiEnNSQ1LTFeTCAjRDJUIUJEIFFMNC0iOScgQChATDFHLSIkVEEoQStXJUNcO1MgSkYmPDA1MjAvWgotTSchLEFVUUNPJTNINTggIU8hJlQ9LlAoXCJFKDxTQFk4JjsoJjAxLk4hWFw/SyFeUCAtTDQkMjo7IStAMQotTSlQLUgkWDRFTkFALCQjQCBdUU1OIUtALTpQWTUgV1AtICBdIilBOEVTUFBaISRAKilBXi0lQFBEKFEqVgotTSZaPDJWICNYJlUgICMxIk8gOCQqQEBMWydTLDlbMjBAJjssRkghIFMlMCAxWEFfSikiVDw4QjgrJTk4LAotTUpQM1cmKEAgQUBDViEpJDdPUClVIj5UIi5QMFIjXiw4MlE/XSNdTD47UUFdJDEoIV4gQFokJlAgIyAmLAotTSgmQDpQUTJTIVtQKEcxPzMnNjhBSjAzWycoQDBUQFAnJyE0PFJROzYhVVAkMzIgRSAkRDE2ICgzJUEkMwotTS9SLUcmOCQ4VCAyTyRPPCRPIjI1IVksMiVCIiIhLjBEJkBDWCYoNC1NIUxZKDxcNFZCKSwnJVwiNlIzWAotTScoIDVOUjtOI1YkOzgwKDEoNlQqUCE9RChVICc0ICg9KCY8MCwgRVIjQSwhIzIqOikpKCkyID06IC4kPQotTSYgRS0hWEwhSkBAKyMwRD8rMUEtKD1ENVhQQEUgSEw6UTA8JiVROEI3UFxQIVdUM1RRUiMiIjwxNDE3TQotTSA7NEJPMFROJTogP10gRU0jTVQyS0EzSyc9KCMwMCxcJC1YN00wPjcmUkQtIFI3VyEhXD8tMipSJ0tQLAotTTdQPjUlRSxEQkInJiY5REFQUEg1IypEOiIwXUAlQlQjIiIsISJCMCU/IiQgIzhIQE1BRCcpNDAuJiImRgotTSVYNCIvMC5VKC4gO1pSJk0iSCw5JzInUyc9KCMhICE5Ik4oPCAxSkcpMFg+P1A4MiE5NEA1QFlIJS5AMgotTSxCKjQoUzRDUlE3WCIzTEMoIVRYKFhMNS0xXi8hLSwkRjIjWSkuLEJCMDdWIFgsMjRBXCspN1ggVEFdXQotTSUvLEFOIic0I0xcO1dROVAjViw0MUErMygmLCVaUVsuIyJIOyogRyIlR1ggXTAxMCVZXCgiIFRTJ1M8OwotTTQxWEghTSgxNiFZWCMnSClUISMoIyAgQVVAPiknQCAvXCEuJyclNDosQCEhJ10gNU9QUFsjOlA/OCBSKgotTShBJEYhMCNWIzA8P1JQSCQiMCw0IkFYJSVfXCpAQS1DKFQwLz9SIyEmMzgrUyBcJCFWNCsyMTZFKDNAIQotTT1BWCkiITAwOVFHSCVXLDAwMVQjJS84Ll8xVFkkJUAvVlFILSJaODlLIVwmJk5QLCRCLlcjXTAjVyIsRAotTSc1MCk/QE9OJixUL0tBLTUmIUwqNiI7LSEgWCtZQitbI0pIMCZQUUcjVigqPkBbVykyRCRPMCYqIFBcMwotTVlBXUskVjgsLlE+IihcWDs9UU9DJThYMz0xMFsoOlgqUTIwTiNDLCs0US9FKSE4QyNQRSYkKTBCO0AgPwotTSZMLClFMVc2IEEgN0cwVyEkRFg1KVFIQSQvODIlMD4oIig4I1IgVDAnPjg3UiEyKykzTCgyQiI6JCRUIgotTVdSLyckOzQ9MTFJOSJETDhPQVtDJ05QKiMgJz4nV1wqPVEqSSEpIDUlMTYqIUdcKiRRRzchWlBBRDE1WgotTSVZMD0pUilPIStAM1MxMVIgRiRDIUEnKCEoNCgsUCBMIF5EREwyIF4gLDAlWzAhUSM+NDchQUg8JVgwKgotTTQgV00gSiA2UkIqLCMqVC8yISIyID4gLzkgWVQpI0gxMCBHXiROWDJXITc/KFhUOSRQNj8lIlA0OFBPUAotTSJDTDVBQVU5IjIsK0IhVVMiSkA6WCBBPCA5OCtWITMiIkIgOloxJioiS1BCSVBePCMoKDk9UEY8J088QAotTUEgQyInLFRFL0FXKic9RDM5MF4kJS9ELzAgQCUoQkBBTUAhXCE5PCY6UTNYJ0MoJlcwSFUnLzggWDIvJgotTSdCWCBRMEk4KTNMO0VARC4oUFAhTDAnKidMTEJAIElGIy8oP0ZRSTwlRDw0ISFUNydUQEQlMUhIJ0xAIAotTSciJzcgQFQrNkFVQSI4SDwzMVhaKE1YICEgO1AkJyQgOlIrKyVMNEA4UFswJl4wQVxBOUEhW1BAQzFDJwotTSRHRDMmUUc1IVUwO1QgTEkkNSQxNzEyOycgLCAsIjFJJ0owO1RQTEMnIERCNlI4MCk6PClMMEghJDJYQgotTVpBPVUjQSxFMFErUyYuUDhaITVGKFY4KFRBXj0kKSguJkFDQyEmIEM2MCZQKDgwRj0gJlskPzgzOzAtLQotTSVUODNRMVwsKTJAQ04yIyInIlAgP0A6KCEpQERBMShOJD9IIytBUDchXUAxOlE5USc2OCJBQT1PKU5MQQotTTlCOF8nRkghJTFHJic7ICNBMFQ4J1hILDUwWS0mNDgjQjBZKSQkVDJRIUg7KUgkMSAwMUMoJjQiRzFLPwotTSBFKCE4MDY0IzNMNihRXjUhKTwwRFAmKSYlWCFQMTxLI1QsJUQgUkQgLFQrU1FAOyArUD4qUi4nITRcJwotTThAO18oLCghTyAiQiI8VC5LMFQ6Ikw0IFlRSCgmUSQ5JkItISBaRCRFUVonJSEoNSkiLTooTURGSVAuVQotTSJHSCNDMjY2JSlcJyExUUokLCwuTSBXVykkKDkxME5EIypUMlxBSl8jRkg0SzE1RygqSCEiIiw3IksoJQotTVdRSj4hQTQqR1IwRSUnLERBUC9VKDs8PUJBUj4iQDQ0V1BVOCNSMCpPMTUoKUMgLVcgREknWVw1TTE9SgotTSBeRCBSMT4sJFI8NEYxLCsjM0xGP0E9ICgiXCIlISw8JDtQRi5QNS0iVzw9PSFRNiAyPCtTISBRKT1ULAotTVIhJScmOCA+RCIuNCgrXDlYMFE0JTMwP0ZQPSsmQUg7PkFWIiBXLDBMUCtbI19UIk0hV0EkOkwqJlIjWwotTSIhJDRKMjJJJiM4PEMhNCwkISQuSEBCRiQyVDEsQUEiJC9IIFFQL10pSkw0X1E9RihULDtMMFQqJSk4JgotTSAyNjYhViAlVUI0JSdVMC07QSgmJTA4RyAiIDgkNVgtWSBVUiE0SCxCQTpfJUpAOkNAVEYiWUAmT0FNSQotTSU/MDYtMVk5IVU4PTMhS1ojU1Q5I0E1RyJMICJRUC9MKEAwMFxCOV4oQ0AkIVBRLiBOPCNRUCpMJ1JYNQotTStBPyknR0QjXjBRViFKMDcnUTVLJjw8PlxARyIjK1gzIzBASCE1WC9NQV83IUokKUYhTTUnU1Q8JjEoVgotTSZZUDkvUFYuKD0wLD9RVCslNFQkLSAmQyJDTCU/QUYlKUs8NzsiOjUkVyg9XiA0OCBTODJSUVRSKTc8JQotTURCLkUpTiwlXTE7KiVESDc3QFZeJTJcODsgMEgiTiwiNzAvXSQ3ICZKMStGKThYIS9QRDMoLFAtVlAgVQotTSVaREY8USBOKTNcPz0wQk8lTzxAX0IgTCRaUD9SMi1RIjkgQSxBQyYmLEREI1EoPylPWCRQMTtCIVYwQwotTVBSLDUhMyw1RUIjTScrNENDIipVI01AQz5BPDIoQDxBLFE0NiIxVClQUDUuJTEwMVFBO04oMjA1TyIxLgotTSlEIDpAQDxMJkJYJkNSNyIgKDw8X0E3WiYpPD5FIU5IIzEkIE4wWVclXCgpT1IqTCUkIC5bQVVMKDcwKgotTT8wOTglOExGK1AkVCkqPEInMFAlJycwPEFAIEMpNlQzL1FURiROVC0gUThdJEZIQTJAQjAgXDA/ODBBQQotTSBNUDZIIi1KIFVAKiowKSEoNFw1RUE9LygsPCtdISNYIFU0LFtRTCYoKyg2R1FJQykiSCdLIFw2JylYKgotTVBQOEghSEwgPVAmIiJATD9fMFRKIEtULFQwKyYoSzQ3XlI7SShNSD9bQiJXJV9IRj1RK1YlSSRBOVFbWgotTScuRC1AMFEnIT4wNj4wWU4lVkQ0OyE1SCI9LDo6UiIvKFggMzxRXFMlSCArV1E6JiVOUCdDIFVLKCUoJgotTUBSIVEpPFg2OzExKSkmSEZWQEYhIFogLV9CI1UlIyQ9ODI6JClAVCMyICA6JywwKi8hUy0hJUg9TDFOKAotTSUqREFKIEwgKT48LiJQQCwkXVgqPDBXKiE0XCcxMSFcI0cwI0BQNSglOlwjXyE5XygyLCNYIiBaKSwsLAotTTshR0ogVUA4O0FAUiNUVEQ0Ii0rIjJQQ1VBWyAjMlhCQzBdJCMoSEAjQFxdISNMKUJBR0InNyglW1A/MgotTSUvXCROUSdVISAsQlQwTjolLDAnXVBbVCkzSEFYIDQqJiYsQFNBV1YgREBBOkI4ViRFJCkkQFxTJTwoKQotTUIwWEQiWyw9JzFVJSc2MENaMDxQKDcoO0tSKlAhSVBES0BBKCYqOCRIQFs4JDsgKkcwWiMkJVAjNCBcRQotTSBcVEFcICJLI0FIJyVBIiInXkAxJUAqICFHMENPMD5fJ0YgNjchXjUnPUgyPyElICYnSDQyIUU5JCM8NgotTTYwO1IiSTA4SUInWihMICc4IV9LI1ZYMkUhIyQhXTQxQVFMPCJdLEFaISJYJ15EPFoiJkcgVSAyM0EkMgotTSExTCZcIVJIJiQgNlkhREQgSzwpQyBJPyIxODAsITlNI1UgNlwxLVMnRUA1P1FQQyIuTD47ID9VKFpMKwotTTkiKDQkSShAPSBFOyZFLCFZMV4pJ0s0JElQLzUhXFgwTTBEIiU4NCsrMCpEJFpcMUhRS1QiIjQ8W1BOJAotTSRMSDwyUV5LJV5QLzxQVl0hICwlTlFeRiQhRC5KQjRGIlhQK1RQLlAoS0RAUSBDPShEVEJbMCdXIUMwPQotTSciOCMmWDRDP0IqXyAlSCwyITchITg8L0ciKkIkQiAtUzBYUiREWEMgMTM+KCQsQUciLVkpKUA+XVE/RQotTSc1NEJRUFJYJlYgLCZQVlQjLERFWzIyPSE1WEJcIFhXKDNEL1JAICwgQShELjErISBPRDMsMUcuJkUsNQotTVkxOCUgTFw7MiAxSiEjOEI3ISRbJyIwQVchMUkhQ1BCOCFeMyU/MCNDQV02KEMkNSlAUTspRDQpTyBAXQotTSkuIEYiMFkrIlhAI0QxIykjUFw6WlFLMyUxIEYnMjIxJC1ANSlQVy0lVkgiIDBSOCM5WCE2QSBWIkwgNwotTSFQUk8iLiw0JDE0UCZMOEZPQENBJzBIOV9QQz0pP0AvMlI4WSg5UC5VUT5RI144KEcgQUEkRyQ6NVIlNQotTSQ5QDFIIiVDKCA8QS5AUVAiUFRBQEE9Kyk5VCxdUDYjIFEgQ1IgXTUiJDRAJiFfPCUmWCNfMiQ0KU9MIAotTVFRP1QkPFAtLyElPyE9XENcUF5cJEFEMU4yOVYmXCAjUUI4WiI2KDhCIiMpIztILjZRLyogIlQ1OyFfWQotTSYuQDghUFpdJ1o0QEpRUTkiJzAtVyAyXyRDTCIrUCdfJURMNkZRViAmO1RCWVBCIyEkICheMD9RISZUIgotTS9CKyAjLCQqPjBVQCIiSD8pISY5ITRUO1EiJT8pMVAtXyAxPCUxQCBbIVU4JCg0QlVAMk4gQiA7KVA5NQotTSMtSEBVQT9XITdAIDNCLiYhMERGPjEiPiM+NCJOICdDJTFAKTdQSi8gOUQlW0AwMygzRCc1MT5MIzlMRAotTSBQLjIkNCAoQjFESCcuNCdYUSw5KFs8OkxAT1coKjAuWzFNWyFbMEA+IDc2JEo4RTAyKiUlQFQoUiIuMQotTSIwLEFFMiYsISo4Pl5CIF0oRzg6UTAhJSZUIDw7Iio6ISw0RiYxLzwkNjQmVEBIJCUrSCYrIjVBITlEOQotTSoiMiYhMiAgSFBITyZbMEM+USgwKCBMQlVRWSUjNyA6SVFARiFeXD0/ITZLJEFQM05BOV4nTywyK1AvUgotTSlQLCMhIVQmJy40QjswRT4oI0wpTiBISyAnOCUjQCNDKSogRldQXDwhIyw0T1FbRyQ2VEAoICQyIlU8RAotTS1AVD8iS0guNVBHJyc6PDovQSQlKFIsMyIwQ10hXUQ+NFEmQSRURC9GIDMhI0FYO1NBOEUlMCgkXDA1QwotTSZbWD5dMDRHIU5ALEhCKFUiMVwsKjA6WiZPICIsUVRFJC1EQ0NAMT0oWVhFUEFIXyE1RDFXMFcuIyEoLQotTUpBWjoiV1xBJEIzIyY2NEQoUEhMIFdQIVRBKFImOUQvOzAlWSJCSCEnICFDIkcsRFkwQi8lOSA1K1BQXgotTSZdTEFTMSwiIDFQNzhCMUEjPjQlIUA5IiElUCopITIhJkhcQVVQOC0nIyg/OzEzWCg6UCA1MiFRJ10gOQotTV8xLFEgUVA2KSAnNyhJND1WITRUIzBUMixBWEAlSkQtMzBZUyAsXDpJMFAxI1c8NycwNEonIlghTUFXIQotTSFATDEpUCJXJFY0NC0iK0UkSSAhV1I4JSBbOD5AQThRIz9UMDBAXzEjPzAvKyAyWyc8TDdUUSRaJzkwPgotTU8gI0UjN1AmQ1FFVCBQWEM6IS9JI11ANE8gJkggVFxAX1AyXiQ9LCJeUU9eKDNIJz4hKlwiTTwvIVAgQwotTSU1XCglMFclIy9EMjkyIVAiXDwuLDAwIykwLC9cMCAvKSssPTFRMk0hNkQiUFEmXyQ7NCAjUENKJVwgOQotTS4hWkMoREAoLiE7UiNFKC8hQUBCJzVUQy0wNCIlI0QuREEvLCJAKCRaQCQqJEIgRDogQkkhIzhAOlBRKwotTSU0MChUQT8+JT4sMl0hIkwoK0glNCFZNiNPSCskME42ID8oJyVBMywoNTwvQCEqTiVZODRZITQiKC08OwotTTcgXT4lT1g5OzElXCI9OCNLQCYjJ0xAIS1AQjIgUTRFLSBeOiY2KDIxIEIyJlc0JU9RWC4oX1gzPzAsRwotTSlOOCtCUDYgKT4kREYwXysgSyhAXjBTOCgvNCU4IS1YITBMQjoiJikpRCBBRVFcUSJULEE5UjYgKDowPwotTVQxXj0lLzA9RzFKSSBXUENSMVJZJSosOyxBKj8kQ0RBTzIkXygpXEVCUFMsKFdEMFkwUFgnJCBDLUI5RAotTSZaTChGIFUuJFcgLi9BKiAkXlAkW1FbTyE1QCA0UVNFJ1UsIjxAMj0oNkhGIkIzISVIOEYvIUsqJlBUOQotTVgyOFclTlA5XlBeLyg4OClYIi5dICtIPyogJEckI1gwI0BbJyEoLCdPUSAhIkY8LjQxLlkoJzgpLjE6MgotTShSNCVMQEYlI1VIJUxQUlooTSw2PDIsUyEjQEIzQE0wJFBULVBBUygnV0xESlEsJyM1RENHQUAlJTxIKwotTStQJSUkNlQ+NUBYQyZMSDpQMC9ZKVA0PSZAOUMlRlQ3R0FfOSFKRDxKMDRfJDlQKz8gQiEoJiwuNSBeNAotTScjWEYjMjBcIT0wQzkhOychV0wwWFBTXyUiMD1UQThDICVUJjNRT0ogOCAlPlFUOiBIQCFDMFRUKCNAJQotTVQiIlsiKzRDXFAnQShcJEAsMCshKTNUPTQwTycoVlggPzEnWyguRDQiUipPIlE8MCshP1AlQ0AmJFBKLAotTSVfQEVaIiBeJEQ4I1UwJCgpK0Q8NVBXMidbMCklICQ4JlZQMCNRMlIpJiwsNFBeTCgxUCo7IE4vIEFcPwotTTgwNU0jQEA2XjBeIiFTNCQwUDAoJTgkREQhTjQgSUw5OEI8IiVYUDdKUEZZJi5AOjxSJickJ0QvQkFGKQotTSI8UEQjIjlGIlc0KUZSI0shSkhDKFE3XiRORDQ3UUNYJiw4NkJBLiYpITw4NyItJCVIWDdYQFFYJT80KgotTT1AQyojUkQqIVIuRCk2NCZDIEQoITVAOy0gUkIkJixGIyEvJykmJEA6UClDJEMkOSEgNF8nTFxCPUIgJQotTSVHKD4/ITU3IV8kLCdBPk8iLkA5WzAwOyI6SDJNIENPJ1AkRjVAVksnKFQmOTFQOSZPUDUyUFJZIlc8LgotTUYwUiYoNURGQDBNSyBJTCRQQFEmKSdANzIiLEMnNjwoIDFVQighXDZZQDMmKTFAKEEgXDooMCA6IEIzRwotTSBTLEVDMTcmKSY0JyJAUFsiXThCLlBfSCNeUD1LQic7I1YkJj8hLk4gK0w1ViAtKCgvXEZbUSg7KSE0PQotTUtCOVgiRVQrWjBaRiVELCFdMFg0IjlAQVNCM1MjSjgqSzFQViVPTDROQTBXKEE8KUBBKFooTFg+LSBGUwotTSEmQEBYIiE0JFNANDtAKzwgMEAyI0EqKCQ/XCZZMVBSJilUNEkhOzcpJFhGOFFPUCUlUD8qUVZfIDVIRAotTVVSMk4mS1gxXCBeMyhTKDdWMU1JIjA0JkEiKDwnTyAzLFAiXSQmMCooIUU9Ji9UPStCI1cgPzA8KiEvQgotTSdIRC00QDA/Iy1UQCNRTTgjVEAiPFAnMSVRJDkyQEhEIj5YIyJAJEwlTzwhSCElQCAtJDgkQV1fI0pMPAotTSYhOi8jOywpViI5TidPPCE1UVRLJ1VALyIgPTslIzg2LCIrIydCPDIiUTVbJklIOjEhTzMmKSgmUyIlSgotTSUlPCZSMCtVKEFQJilAOzEhLjAgOlEvIyBPPDkzUEcrKTg8OD5RSUspMFQnJkA6NCgqQDhHIScpJ0hYKgotTSkwPF4hWzwwQ0FSMigiIDosMiAnJEc8PihQTEcmQDAmUlBVLiY4PCAqUDM6IDJAPjIwPzklKkwjLTAgMgotTSE0MDosITFKIDs0LEUwPkokOyAnMEAkPCZcKCIsIEQ8IDogOUhBREMiR0wzT1A3LSM7SEVGUDJfJiNUJQotTVExRjskRFwsTkBaQylFSEYoQD8iJyVMICcgRl0pSFhDNyA6WCg8NCciITMvJzU8IkRASF0mVUg/XTIqQgotTSEkIDVDUCMxIUxQPjwwTyYhKTw0NFBeVyY5SChXQTEvIFVIJDNQMjcpQkQjMDBNRSZVXCo0UEsvKCIoLwotTVoxQSolW0gkTVFMRSNbJDlbITg3J1ogQzdQR0goXihCQlA1MyUmMCxaUEYoJVdERUUhPkIhJUwyMSBbLwotTSBdJEZNMVMjKE1cODwgIF4gQlw0VDFBRSVDUDVDUEVOJSxQQTNBQE4pL0gvJ1FEPiU8KEExQFAkJDswQQotTTkgMikjVFBFKVAlRCE9LCc1MTBfJVs0MydCMl0jR0w5IFIqNyVcVDklQjdIKD88LUlATTkhXDAuI1AuUQotTSBHTDI0UFFPIl0gRU9ALSMmUFQrUFBdJCFeJDRHUiBAJCAgRiJALiUhMkAoPUAzTylCVCY1QTdKJVIwMwotTStRV08lPkgiIyFIIiU0JCBMUCtNJCZML0kxOEMpJ0QgKDIhWSAwOCktUjY3KDVQPlUyJzcmWDxCNEEnJgotTSNFWC09UDYgJykoQDcwUV8hUkw2OjFWJCcnWEFfUV8gKFYkQFRRIDsmQlA6N1A3KykuRCFWMSI0KExMOAotTVVRNlohWzgrWkIjXihNNCBeUUc2J01UJFZSNkMjJlRBSVEyICUhMERBQTA2ICRQOVoxXTYkR0gnP0FHLwotTSdRMD4gMV4tISVQISNRNycjUjghXSBGSCZVRDZaQVExIVA0RixRPyMmUUg4OSE+OSVFVDFcIjkwIDVIPQotTTZCJickLjQxITBDXyc4JCgiMVshIE1MLixBLScmPTAjWDAlNSNePENYMjo8JERYJ0EgJ0ciJEgtV1FfPQotTSQqNDZLIixPI1lcO0RATVEjTjQ4PkIwQCNJMD4qIE1UJE5YQywxNikgOCg2WkFIVSEqLCtfMTxbIF8kJgotTUIxMDkgXiAoQCAjWCE/ICc4UCRdJCRMIl0yJDYgSFA7SlIiMiY1VDBUUiIzITxUQDRCNC4lMUg/IFAiRQotTSZcREVLQE1PJiE0NzBSNjQoXiwxJTFKVyE+KDk2IiBFJFAkOjcxNEsgX1A7NyIsLCMqWDxbIC5HIlFIJwotTTAiMzkiISw4U0IxMCA+UEQ+IV1EJzIgMzpAVEomRUBEMlA0WyJcXEUsIUw6ID5MPSciIkcpKDQ6XSIuRQotTSQoSDBFMSw2KCc8KCQyL0UoT0AhK1E9JicmSDdSIEQpJDpcPj5QQV0jK0xARCFaMiJGVCE7UDBAJCpYNgotTSciNzskUiQvJzFcSCAiRCQ1UEs9JlskMiAyJywgKjA/IiItJyFBLDU8UFghIls8LyMiI0QnRVAjUjFeWAotTSReWDEtQDFQITlUK1AgQUUgRTw7SEI6RCU8TEYjUTsrKEtMM0NBNyIiLCwhQCFHMSEmVDw7UisoIlJcKwotTV5APz4oQlAxOzBJOiFUSCEoIU02JThQLy4wMi4pRDRBNFIgWidJPC48IC1GJlZcIUExViYhXFxAMEA/XgotTSc1RCpeUiBOISk0NCIgIVokRCw8MTFfViktSCxKIiA8JzdIQElCOCIpPyhCM0BOUCgoMEMsMjdeJlYgRwotTSMxOD0hXyQkSiArWSNbND5MMiwkJilQLCFBKDcjUlRCPzE0RCg1NDMzUjslID88MilAJEgoOjwnJUBMSAotTSczLDdVQitVIDooRTEgRlAiJSQ8XUI6SyQzXCk9IEUmKD9EQSAiIyUmXCwkWTAzPCVTPD4xUTwvIV40JQotTVBBVzInKDQiU0BRUShCNCpQMEg9Jlw8OipQSSIiMTguKyI1LylMLCgtISM5JzUwRlQwLTkhKUwnL1ApVQotTSFRQDNFUSdXIkhcKS8hMD0iNyA9SSIjXilIQEYkUC00IVo4OF1CL1sgRjQvRiBLUCAkXDpVQTpXJ0hUQgotTScyOlkkQlwtOUE5XSBdSEFLMVNOKDs0PVoyLzgpOiAmTzA1OyIwVD9SIE9JJlFEMjMiOCUhSlg2STEwWgotTSMsNCBPMEBPIzA8Mz0xNDQkMiQyVDA2XSIvJC9eUEomJ0ZYP14gWTMkVlw6WUIwUCBMWEFWMCYkIExAKAotTVRQPTIiXTw2IyI2XCg+TEEqIS80KTpMRScwPUAkXUQmPFEnXCQxOD9MIEVOJj0wRlIxQUElPVAkOiBAVwotTSQhKDslQFgyIVFcKEdRNjoiWjAqOEE4ISZBKD44IS9NKDUoJ0NRWSAhOSBAJyFfICRULCUyUVpFJiFIRgotTUJRRlgmUTw6QlEwSyc9VD5OUSNZIDVAJCBASFciRCQ/VTEuWiZJTDxAUiw7Jy1IQToxVV0iVjgyQyAuVgotTSguKCk1MVVCIi00IF9SK04nRTw3PlAsVChPNDVDMCdKJS9UIyMyOk0mIiQtO1EpPyFOJDQgMVVOJylcMgotTScxKlMkLUQsJjBSIiFESCpTIFpGJDJIQCMwPishIzQ0J1AyOyQ8NDRHUiUqJEY8LFxRKEIlVFA7JyFNJwotTSZQMDNTIjI3ISgwRVlBRzAgSVggUFAzPyA0QDwlIF5CJUxINE5QKkwoUCgqUkFaViRYXEVVUjsrJ1IwOAotTVAxIiElPywzOSIlNSYmQDwkMSM4JidENlxBQyQkWUg5XyIkKiVPICMgQChKITE4L1ZCIFgkMDgyKyE+KAotTSBXSDMiUEoxJT0gPTxALzAlPCwhOiA8PCM1MDdFQUJLKSYsOUgxIUUkRShEU0I4OCNJNDwhIjU0Il4oMgotTSlRMzomNkQ0IDBCSyY/IEA0MDBWKEdMKCpQKU8mTDQ3WTI1JigzQDcsMEA2KEw4L1ZSJTsoOyA/SzEnTgotTSFFUDg/IjNVJl9URSRQXyEkJ1BAWkAmLCJHPCcuUiZUI1QkJDRBLiIiLjQ6PDElNCM7KDQ4Qio7JzAwOwotTVVBIUEmO1AlXEFIIiInPDFNMEkoKCIoIVUhMFcoLURDMCI1PCFUPDFGIi8+Iik0QVQyJTEhQEgwSiIsVgotTSZKQCA6QTNNKCE0QyBQVCwgR1gmPiI7QCQ7VCQoQilBKUFcKEtATUghTDw2XkAlISFEKCpBUihcIjRcRAotTUMxRDAmPDgrMUEiISNQIClKMEE8Il84PyhBXikpLjQoMCIrNSJCMCBKUTczIEBQQCdBP1sjUzxGKVBGJgotTSI3OCdVMTYhJFUsMjtBMk4iPjw/KyAuVyhRQCU/UDZAIz04KDVAU1UkSiggQCIkIiFZTCVNIFVAJUAkKgotTSVAKikgQDxAI1E/SSVfTEZJQjtcIUpYRioxMUkgMVA+JVBJICgmTEJaUFgsJkAgKz4hKkIgKSwqTFA+NAotTShKLDI1QjROIFYsK18yMlspKDApTkAyMSgzUCM1MV1SICgsLlYwTzQmNkg1MiBDNChMWDcnUCo+IStAJAotTVBAI0QlXUgpXUI2SiYmVCUkQUxBKUZcPVkwXi0oVDAxXTEpIyRRWEQrIUhMKFQkNy4hJl0lIygvLCA/SgotTSFGXEBZISFXIkVMJTZBOk0nPzBFSjIhRCRHJDQ7UiIgICAsQF8gQFYhQlQrXTAwKiU1SCNDQjdVKUdQOgotTTtQJF0iUEgzL0I2QyE3OERSIDFTJkNEJDIiMiEmRSQiKSFPNCQzLClBUilGKSk0M0cyNFgpOFQ4KTEoOQotTSk4SCouMjlEIydMLFpCMDQhRygkM1E5JSIlLCs/MTYlJTswJy8wMz8iWjw0IjIqJSJDXEY/MV5XJUkoRgotTSBRL1ImS0g/LlAkTSZKMCgvQVMtKDVMLiNRSyAlS1Q0UEBPXSlBRDQpUiY4J0MkNywgLjwjJUAzOzBcKQotTSRYWC1LQjUvJS1UJjAwMSQgOyQmKSE8WiVZOC1WMTMqIjZMRkgxVzkoTDA4LCI6IiEhLDJSUFNMJ0YsKQotTVwxXDsmOVggMkIsOyVFSDNIQE0hJEZcM1ciMFolNyQlLEA6NikvMDE1MiNeIiFMMk4hQSspPTQiOSE5UwotTSQ4SC82UTkpIz9cMklRNSkhSVw5KlIiOCgzVENeMUVHIlk0OytQSkYhRVAhKiBGLyE5WCc+QTQqKCpIMAotTS0hLVMpK0BAV0IxNCgqKD06Ujs+JSA0QkQwTVshUzw/JkAxRCBVLCs/UjowJUE8IycxJygnRiQ+KlIkPAotTSUuKCNUMFhcKFogPFEhK0MoPVRDUTI3KCdISEFTQi1MJzNIJjpBRlInU1gnOkIzPiBfPEA+UU88IU4wQAotTSJBN1YhOzBCMCBWISAmXEI2MUtYKDwkJE8hSEMlPDwqWSFaJyBIOCtWQFE/IUA0LidAIkImVlwsRDImQgotTSRDVCE2QjgzJCIgPFxQIFUhUzApRUE2KCQxRDVLMi9NIlpQNkohUF4mJ1hGR1ElNyEjJCpEMjdAJEI4OwotTVBSMEIkTDhFP0FGUSExWEQ+UiNCKDQ8NycwRFYhJDRHITFdJCMyUDdeISNBJEMkNzwhOF0iOVgvJCBfWQotTSI9SDggIiErIzMgRlBSMVAlPFgqTSIjTSJePCFfUjEkJiY4Ni1BTz8kVyAkRVEgOChcNEEzMU9WJCE8QAotTUowPDIkPTgiRkFBQSNTQDI/MFlQKThINF0yOVwoQ1wlJTE7Tyg1TCJKQS4iISNYPkEwLTMlVUwqNiBRIgotTSlQTDFbUCQnJScwQiwxUyQjWVwhUzBIOSZcMCEsQTBAIks0JlZBJl8pJEAmQiBAKiYkVDJMMDslIFhUNwotTVEhUEgnPCQiSDBPVCg9NDEwMEJZKCk4RThRRFwmTkQqREBdOSUiXCNRUUxWKUtQOUpRQSYmICRDXCAvUgotTSIpOEM9UEwlJlhEOl4yIEsmM1QzNjInKSBYRCFFUjdPIjEsKjpAQEshICQ1I1AzOSZFJEQoIjEyKDAoRAotTTlQNlYoW1gmMVEhKiY4VD45MDZbKC4wNSAgIyImP0w8XVAoISM/SCsyMUpTJEpAL10wKDonXUwsPkIzWwotTSIjREEuMVMpJEtEMD4yN1YoS0wuKkA7SyhBJCA9ITZEJylYLzNBS04nVFAwNSFPQiUnMDRNUEhKIz5QQwotTStROD4kR0Q7LjEmLSRUJCVXQTtBKD5cIDgwXSgkOjxAJiE1WiQnOD8/UDsyKDkgRVlCLFkhP0wkUVEiNwotTSBTMDA+QDJCI0AsRl0wOyYhMSRANFA/SClMIDdNUTw0JCxIIz9QXF4iQ0wnXVIlTyI5WCEzIV8hIkhAOwotTV0hLjElRVgxI0IpLCJFWCpIUSwnIC8wI11SPCMhTzQwKiAgISAgICAgICAhICU4IF9QJ1wgVFgkXSA7TgotTSIzVCtYIFs3JEIoNVBBRlYnP1hCRlAgICAgICAhICAhICBIIDkgL0ggICAgICAgISAgKCAgUCAkICAgIAotTSAgICAgICAgICAgICAhICAgMCAiICAwICIgIDAgIiAgMCAiICAwICIgIDAgIiAgMCAiICAmLyAgIDBLMAotTSAgLCAgICAgICAkICBAICMgIDAgITAgJiAgPCAiICApICBIICJQICwgIFQgI0AgMCAhKCAgICE6ICAkRwotTSQuJCAhPzQwIC0yRSAuQU9QODtSICItQyQlWE06XDwgITokIFMuVDtTTS8iJCAgIjgzWEVTRVhAM15eIQotTUE6USE2UlVNIS5aPyQrLSshUTVbUjk/LiAsIUEgK0dVT1pNPEkvJyM4UkQgJzEgICAxVEQkLi1fV1UqNgotTTxXT1EgIDFfMDskS0VHIjVVQFkjQzA2Tyo9TDBMUUoyIiBZNCwgVjU/NDw0JktIQSAkRC08XTMnQi9XXwotTTpCMjQjUFFYISEwMCApIzlFJjUiKy09QjEwJjooQjg3M1I8IEdRXCFPVktNOSZYWEVeVzpJX0dUWjNdLwotTSBQIDglUSBBNlJdVUNbRkpIMyo+WylVMyRYQydNOFggIF4kIF1DMy85QyctMU9ZNVo7UikuREtKJzBeXgotTUQuMDAgJyY1ST8lVz0yRVlaJjZUSlA9RCU7NDFGPFJHJUFPLlAyPUQ4Wig4Uk5eRD5SNy1UPl1QOl1cXgotTSdZV0ogVV0zJC0nLFtCKUFUX0goPj4jJlZCOUdWV0ZLOThYOlFQQCBAWiQgLzZQUChWOiZZVldEKUs4WAotTS08PEw7I0stXDw+XitBTi4gITAwICYtMTgoXzlOIiVUK1sgLjQsRF4wTzNORVc5SCI8MVdZMSVUICAuLgotTUA+JDdMQ09EPi0gOickOCgjV0dVXSo9QllYSTE4TFc1Qlc/OUNRIkgrRCwoSksoOj8oWEFTRCNTQkxYKwotTUEsMCspV1NLRSwuTSkxKSk4MCI6TSgoSVRVSkVSXlQ6TjpdPiYrKzkxWyJXTElVQyUjXiwgVVdbIExIMAotTSAiOC0+Mk9fPyZHT1guUUgnOjc1Mk5NRjJKMDAhUz9UXSNBJixAVCBdUCFNN0QkRT9OWF0rTkwyWkBcQgotTVgjLjRfOzguUClPTT4nUTk0XCBEOUtAM0g/NCAkLEwwRiQkVEIuICpWXEBDIExJX18wNjlGXClXLy4tWAotTVMoW1lXMj1LTzhZRkI7OCAgQiQgQkBQN05YWkQ1Sl4/SjA5J0xDOT0yVV9AQC1SSiJPI15WNCJIQ0gjMAotTTpRSUMoUSAgPjxELVAuRz8qOy8mUkRXLDdFNTxYMlBcSCYkWjI9TzI+LDUsIU06WE5UPjdBUFxAL0AkTgotTUU5RCkgXVxYXzBcNVkiXEM9LzdMVFxfPCIsMCRMLUpcUzdcOUlDLEYgXkQ/IERYJyQqNyZdSk0uMjFNRwotTSswKU4vMDgxNiJHSz1BQzFfPS1BQiIrLFc1XFtFLlosNCtQSjxAITpYMCInPFkjWyozLVM4QikuLTpYKAotTVhMKV1PTS4nXzA3WV1TTS9INTBfOVA9JVVdMEYkNyciJkAgLSQgID5BNiU7O0RcSjoxQVtYQVAkNCMwSwotTStdVEdbRi0wPDlGRlI+RDZDREhOKiE8KDtGXDoyMUVOICAoTVA/PThfLEpWOSRMSDo3UjdALSE4TCw3KAotTSs2TDc9Wzw8WTAzMzNDJDAtSl4rVFcvNDo1U0I0QCUjJC4xW04lVyhUTjk0QVM8KCYoMj4rUUlYUjUjWwotTTssPyNFJzo4NkxRKTNCQElVT0VFVFVSKTUzUCxAWiQgI05PM0s6PSEzXjNXRTNYQTcxU1tXIypfN1FYSQotTVJdNzlLVT8yVigyWlMrXURMKitdTVFGJVdMSFEgPkAwIC0xIUYhOVs3LS8lLiggLlVRXFszXzVLN0hOPgotTUYjLVJcJTwxLCQnIVMvRFAuQ1cqKzVFTjJdIE4/OTU6ICRITUA/TyNULzEyKEJBME1QX1JcVTwzJSEvPAotTTBFVV1VQ0Q5Rj9BOS4hUCBEQTM2QUstV043SkVfRiQyTVYlSiAgTV8kJ0BBODpJUCBMJihQITkwJ0dNIgotTSxXRzUsIDFLKC0wKTAhQVhaWjUvS149VkxVVl8nPV40T1w4UzAjXVtPKFQgIDYkIEcnLDJdJVQnWDk9WAotTVlbJE9TRUZZN0pLOk0jPTlbJUQiVC5HQSJcP0Q/OEIkKDdATkhGRSg/MSUjTygpLT9ULzUkICE6XzcsPwotTVklMEhIPic8M0YqL0YwPTxfXkZeQDpYX1pdQjspLVYwNyk6TyAlUFdGMERXWUpOODUjXjhQRFZTTyIsKgotTTYzVSFeLShCVCMvR0lfL1ZFRTIlQ1pFXktbODxGQCcgJUUoXFgqUyUrT1hAL1IvXUhJXllaQD9XJ0I7WgotTS1XXEMiVSUlIDkyWyQpMVggTz1UUChQOzcwIlBcLDlVSj1OWSUuKzk8TV1FI1RNLD1SQ0AlRldWRDwpMQotTTBcRy8pWTZLNT07QllCPjxKKyZGICNUQSAqUCtZUT4sPF8iIFk2Ik0sJTUvJi9CVypVQy0yOFZLPVVASwotTUU/VU1DR04xTk49PzszKTYyUU5ONk85JD0jRiVHR1EnOj5MICIxICA8S0QsTCZdU0c2WDpMRDggPiVVRAotTUEgLV9YXCxBNy4uSSo9R1gxKSciWCw/UjJKWTQzPl82N0o8NVZNSDgoV1Y8Sj0tXklGXlkgICU9IDpSIQotTT9BXklYPiRFOSEqWz9HOj1IJDtRTiNSIF9KPy8zLjpCVCAlU0s4U0xVQ0FCQjwvJFEwN10nT0I0SDZbNQotTTZEWSkvPixYJy88MD80IlUwT0EuU1NMQT5PREU8Nk8gPjNPVDsuKURKWl47LVwlKjA7Ni1VJjghICJBIAotTSlURFErWCdQLl1fXlNCMSEpIVlfKExcUSIoX0EgK0ZSPTNSIkIhOjNTM1xaOlhGVEFdWChHRDUmOiRWRgotTSMvVztEWSc/KS5QMywmQSQpWUZUMD5aVkA8SyM2ICkxXD1FSCk6KV09RyYtIDRYMCAtTVVFITdSOF4oOgotTTwmJDMgMSBKOS4uUEZfXlAyRiUkSkUwJj1MUiRRLEBcIEg0WlRRJkY+JTA5J1dUKVsxI0M/N0wgKjRTNwotTSdKO1QiIywgLFhTIUU8UTFSI1I8W1khSC02TiZZOj5WJS43UkUhLFteMzM6QzkoWjgrUCJCPVcyREZVOQotTTRfJT0zIy1FNSExRl8tKlYuWDAqKztQMzg6Ryk8ICAnLFEiJi5KTTtGQ0tSL1tLPSxEOztWKSEqNi5BKQotTTFMNEhDLDg/LCVOOiVQQUVAJ1BJQSskJk9XNi9JWFE1JV4iNF0xO1Q5SDtESVtXVjBLN0YsIlAgIDokIAotTTA2SkcqWS8lVSdBXVFOS0NLMk1MKl9SJDJfIVVLQTFVNidMVDhLOVpWWCwxIyU0IkYyXEJdXVpQWyAiQgotTS5cVkRdPDUvQkVNRUJbQi1cXSohK0ZEMCAlNFEiOk04VEo4LClMTTY4OC4nOkFTVFA3NidaJzhMMSQ/LwotTTA6ICVHTEQoIUNaQE5MQ0hZXF8gNT4nWjErK08gN1pQKSIgRTxdJVJeOCdETiA2TiFRNyxAOzJPQylFIgotTTM3LCYsT082R09HMVBUIC5SKS0vMFtALEw4M1U9Pi8pNl8yLDhJL18hQjI3JlpdMl44TjsoOE8/PiM1NAotTVg7LVpVRVwlPjkrX1FKNE0gMTFPJCEsRC0iK1UxIjFdP0NWI0lZMy8mQVoiMlQgUTY/Syw5OjBfIVdGJAotTUs7TVlMWCNJOkclOTo4NEJSNi05Nk9VJEdELTk6JS1JVCw4Llk5XFhbJTM3LUcwICpGJCBPUylTIltAVAotTT4jUFQ4O1pTWkA5KkUpNkxDPyZfOlM8Kl8iI19HWjtTLkxbNEZdQCNSIldMRl1OSVI9WSleJkciU1BAVAotTT1FU0tEUDZRKio3KSVRXEAsRyNPICA4MCApX01eTVIgUzwvOydWQFgrSj1ZNi82Oig6U0Y2NUAzVTpJRgotTTY2QjssMkE5W1pENUgnWyZBM049SkklREFEVFU6M0JDOC8+Q0wwJV0wLlw2RiQwXEkqPVxWP047JyQlKgotTSlWWDdLRT9MOEhGSltSK1tXOzpCW14wN1g7V1IsVjooQCM+VCsjWl9OLVoxJjpRRCItM1Q6RFhVX1ZILgotTTlVOlklJCM7LlxJWCpJTUg6UyslVj82Tzo7UEY5KkwwRVtdTVAjPFxTS0pETDM0QUM0VF5DTTg+WjpLIAotTVEtVTsjXT9cJSNZPyJEID00PyJWPyZKKkBaPT4yMkMrJzleLkswMiZbOFIlXDteQFU2QzY/LkxCKCY0XQotTUxGKCVWUiQgS1BIUylaQV8yQFVBRlcoUUVeTkA7X1VLSDRMK1ldIDpYIzsvSkg1Rjs4ME1ILEc5JDVKUAotTSstVCJRIERHXjtHPkEpQkQtQV9GMkYmRSxTX0pKWlw1I1owJShZKzVaICNEJCAhW0ozWEVaK1pVQTwnXAotTUovMT0nIDw+LyJOSDZQQCxeNyU9KCArNiAhIChGVEpWTFg7SjsrRUUuMCchMjhRWT0/Ri1XKSY7KDZZUQotTVtCLilPPTVNTCswQiFIOjApW09NWk4sIChHUCFGIlonNltbM0dXKzhWMl4nJEE1MFFGTz47RyMvMk1ALwotTVU5NVE7QjpSOUsiTVFDOEQnMTczNkNRIjUgWUNfVy8gUyU3TyVWN1kqLyk1Tyw/V0AtU01XLzFOW1xZPwotTVclL1cgIDdHJCk/Kzo+QEZVVyheTS4ySkFFTjAuMio8LFA9VTJXS0lEMlUnXjc+OjtEI0clQE9YUSBSMgotTVwhI1I3VlAxKTwuKzBMR1lEOVVTIldSTyE/XE1BOyEjPTZETSpYMExJRT9PJC0gP1gwIixcMFZJL0lGOwotTVMxTk4rP0sjITxYOEQuPUIpNFsjTlkzKSRbXThDTyE3ICE+NzpZVE0lNytLUFklXSJSJk1RXi5DU1IuQQotTVxeQiU/NE9WJyNJIChHIVU8OUtdSStKOj5GJz86QV8hJCAiSDk6XDEuSjQhNzUyRl49R1o0Wj0hN04rOwotTTsrIEk0NDIyU1dQTkcjKiVTWD5WSiZENE5QKjE4OUY7QVhDRCYlL0Q8LUguRl5eKCFUVl5JMzxUO04wOQotTUgsQ0dFNDkzQjhETzMoNEchLUNLUDonIVogOSlQSTI1TjdJUDNYJSI9OjRZLkYsK0JSJyI1TU0mPSErXQotTVE0RypGRDdCOEQsWTovMTg1JidbL1EtOk1ONlsyMzZJLl4qQVAkUEIlMUIwSVRZJFYiViZARE49TyRKRwotTTI9JCBPMiwwSVBGIyNEVichWSUkMyJIXSxULjEiN04zWUZPKCslMjo/IDxART8kJkI1QFJEQk5KITFPJQotTUBGJSM6QktFKFZbX1lIPyk3OU87Uk4qWzUnJkc/Qy06R1RcJzMuJjhISS5BLFglXz0uKDMgIVJBIC0zSQotTTslUV07WU9EVj4/WS5WXkE9VihUNDw6KzY+Qz4qXVk4U1NTXzYiKSY/ITZINVc1OSlOPUc0UT1XTVYvSwotTVlAST9YX1RZOjMvSEgjNkghO0YnXUMkLzBSJD8wXU84Nk82NkpRTDlIRkBfICAwMCAuOEFaQ1MwPihVQwotTVlTRlFbWjw3PTJCTjFZVkslLE1dOiZdRi46VV0nXzU2XjhLOTdPWF9MNTxAJ1pAVENMM0Q2VCtOUyY2WAotTTY5XSInQ007UEQsM11FXS5QLFUkR1tVJV5FMUNdIkVCLlIjOUsiQUtAPks9PFNUKl9TQENKU0AtRUgvXwotTVFVICIxVSZfTDpSM0BAOy9EW1YiPVwwLyM/Lj4mV1RbVT9dVClOJ0ouJ0IzTiMuJixcID4wP0NdM0tQRAotTSwuREw0OTxcMS44QkM/XUVXOFlQMT8kS0M9XiMmRDE/JCZEV0hKOjpBPUM9MSEjLUAhTCJOMjAzVjM1KQotTTZTREEvIFFSIV1JPl5ZVzggQUggVD5DMDMgTE0hXTk5XD9BLCc7Q0pAXVMyXTFdTU07Wj8gVFElL0AwTAotTUxZRTJXIFQ+PkA6KypcUF4/Ly81KEVIJCBGJCAgTyYkO0AwQTQmMzIlVilCJzdMMjdWQzA9ST1KTDQ2SwotTSpDKlVBQldCVF9YT00+MUIvMV4xLU5UKl5WWCgtJSZcMCNXPV1ZOU5MQCEySlgjSzdZLidYUUZGJj8rMwotTS05XFNGRTsxT10pTk49QCBVKS0+IClQMCAvMz0iNSk9MTQrQUtLMFQrSi5TSFZcX1M3SU5NIkFXXVRPIQotTVItIUdUT0NAS0pAWzlaVyk1Sy1MUilUK0U5VyEgJU0oQkNVKk9DO1Q0TUdIMzcnOyg8N1knKCQpMkQ3OAotTTpNPkozJ1AoWDo2PD05TiggLjBcICE/WzAzQVw2K1IjMlYlVDdYQigpQ0NKNCwhUkcmVE4uXlRVN0RCLwotTUY8Ml1VWkFZQEE6JEgsSlQ0O0ouMjVTJilNMylcX1JdTE8+RklUM1IzJzI+KEMiT1ZOPjVEQ0wgTV82IQotTUk8UkhYK0w/JkBfVUQ/KVxAKjUjICAuOyQpKDYuJVpPLk09KE9VWTpcVEVGNSpfWiROOTxaR0JRISVINAotTUBVKlVZQS4nRTE2XVYyTVxEKFgwIiBQNlFWQkonKzZAXVAjVk9EOi0/PDQ7UkxQMVlNVlhBTDsyVlUhOQotTTg3OShJXkgpWkU8L19YXT4xKVBPQ0Y8QSApLClbQksyLjg8XDorRzE4UlkgX1ItTCJYX0gkSjswIVxBIgotTVAtWVw6PjRRQVRIIzNbQlhMOCkuQ0FXMjQlQCQrPS9VQls6I0QgRVZaQTI1VCVRLS1fLDVGSD0oIFU5XgotTUFWSEMtSlE+L1tNU1NTQUcvT0kyS1QwNU5BICBFKUU/I187R01dLy8sQ0xKUF8tLi9JMj45T1IqNTExKAotTUw9W147TitdVzBPPUYlKjRFICQiM1o3VllRUVIjIkgyRE8uNU1TWTFJNy5OTDMiV0VKUjIxPUBJO1xNRAotTSEnR1IiR1pOXEg1JzJJJjgmQDVeLE4lVjxMUT4gVSI7IDUiPEs/JydXKlRMLiNVLS1XLyY5XSNKOzpAJgotTTQ5T1JeLDAjWDoqQDRCLFpVUSFTSjQyJVY7Sy8kQUAjPCg8WkZVKzw0TkNFTE9NLiFRPkYrW1ktVV4kKgotTUpeVS9DJitMPlxaWTAiJzQ5SCwgSDE1VVlMU0MqPyokK1AiIVVRI0U5Sik8JyRKRS9eRFwvMDFSKiNaSgotTTQ6Pi4pPSEzIF8vOjBeOChJOFRCJU45QCZGIjxdT1A0VCVANFIpVDo1XU5aTDksREE8OllbIUMoQzA2WQotTSpeKDlWKiM/RC1BNUZBTF5JMkI7VkJFMDolQS1ALzFVKzlRQzxFOyMuUCAzWDAgISwkUyEoVjtRMD0jVgotTUNdOSNTXigrRS9eMVE7X0A4X0c5UktHLV1ORjRIQExTOjI9LTlONFNEXztEMkxLK1xKQk89XEpcRy0uRwotTSoyIz5FUUBVLSBTMSMoICojSUlNV1soRFRTIF9ZXCtfUjRQNDIrRSE/PlQxNVNRIihAL1ogICwwICg1NQotTSxTWywlQCFWS0MiVzBNT0JWIEErOzM4LC0jWStVVydBXjBMKVoxVy1DTVolKTchSyhfXzw2OiRTTyg3QQotTTwzVVY6SDgxJ1xFXl42JD5AVTkuSyJZKV0sMygwVUBQTCkxMkhIWDE/K1tNXSQ/JipSV0g8QFpbWyVVTwotTTdbPVVSVEshTkNAQywyIiQsUSo8TSRANlZAVVJRRCEiT0FeJjonIkIzUSEjRCFFM1EmUCsnJkAhKkE9OgotTSNPRy8oXkFKVS8vJiZcIzssPFFcPlxYIy80TihUQE9FQTxfKE5YO0UxTEotWDgkNEMwUVssSSg0XUUyXQotTTI+JyQpXVI8WkslODJBJ1kkUSBWWiw5Wio5W1QlQ1wqXFRGRlNXPkUoWi5ET0VOIlMqKVIrUzQwMSdeXgotTUcxLlhKLChSM0xFLCxaVlxHT1paPUpQQSxCWSxTMyheJFkmVDwvWzktS008RVg1IiUhS10xTFM9Xi44WAotTUFdKUkhXSQ3JkArUV9DWlVKWlsjTj5ZTycgQCJPSiQgUjZAJiAsSElIO0Y7V0VUTiZQXlZRIiVRMFUiPwotTTBYODY6UkcyOypEKFdULUBFMVRCKCogUDs7MidYXCk+OVw2PlBTTV1UJ0BQWTdeME4tQDtXSVc6WS0/RgotTTElWSRZODM+TERULTdJWSFNQkZCPUBYJ1U9QkMvJDlRQSwrTVMxU0EoQjwgOlEgIEFRJV5OXilaOjZCSAotTUM+UkgiIj0sODZHUzpBSFM9PS5NIUA2SyZOQjswT0s+ODBbPDtHKkZSTiMzWTpOWiwnSSczTT5KUk44UgotTVBUOFZBKzMlXTxGLC1aRyZOLSRbT0JJQ10hOSMlLFQ6Tjs0XSpQSFoxWjFYODs7WFktXEwkM0U5JV1BOAotTVlAIDAiSCVdMy0jVkQwWDNZN1BYRVhSLjNKXzdJXEg6QClWSjBZUkhCVCMrOjFaVzIpLk4xVjEjPkROQwotTUI/WDYiWSc5UDFBXklRTE8gOCJCIyU+QSVSNSlcPU8lPz8/KiRcMS1IPT1CP00nPDM5TVwhSCtVPVxdNwotTV9ERz44TU1aXyJNKTtEIjwgV1owICApLyQmSTpHJ1kyUEM9UjNIRz9NLVdfVSI5PT0kJjpRKkw1U0wgIQotTSRWPE1QV1IqVi0/KFItQiRGN009OkIqXiteVy9QN0NGW1QuPCk/M1omPERCS1VGOFJJQkFeKUVIJ0o3XAotTTknKjFMLD42TTs4V0UzUDlaVDBIPzRWNV0yKzVZRTJKRkQ4IlwsWUE7UCAgICAgICAwICIgIDAgIVAgKgotTSAgWCAkQCA3ICFQIChAIEkgIyQgLiAhICAkRCA0UCE9ICZAIDxQIV8gKEwgRiAiRiArNCBQUCMyIC4oIAotTVxQJCQgMTghKiAkWyA0WCE4QCVXIDhUIUhAJlggPFwhWVAnXyBBQCIsMCkrIEY0IkAgKjwgS0QiVTArUgotTSBRICMrUC0uIFZYI0NALk8gXSAjXEAwNSEjQCQ2UDFfISowJFJAM1AhMTglLzA1RSE4VCVNQDdAIUBIJgotTS0gOT8hSEwmTiA7RSFRKCcwID1PIVlYJ1NAP18iIyAoODBCMyIsOCheQEROIjYoICAgICAgICAgICAgIAotTSAgJCAgMCAhICAkICBAICIgICggIEAgIyAgLCAgUCAjICAwICEgICQgIDAgITAgJSAgNCAhMCAmICA4IAotTSFAICYgIDwgIVAgJyAgPCAiICAoICBAICIgICkgIEQgIjAgKSAgSCAiQCAqICBIICJQICsgIEwgIlAgLAotTSAgUCAjICAsICBUICMwIC0gIFQgI0AgLiAgWCAjQCAvICBcICNQIC8gISAgJCAgMCAhICAkMCAxICEkIAotTSQwIDIgISggJEAgMiAhLCAkUCAzICEsICUgIDQgITAgJSAgNSAhNCAlMCA1ICE4ICVAICAgJDggIDE2QAotTSAgODxAIjQ4ICJIIkQhV1ckSFQhJjA5MCBbTCJYMUk4IVMwOCghVE4mKSxFQ0BINSIiRCAgMCUwJDJMNwotTStRI1EhOSgmNjIwLCAgPCA4IE1KJFYsQTRASyolLjA6UkIwLSAjLCVMIUpFJC1UMV9RQyEkQUgjSkFIRAotTSJQPCE1ICZAIEU4LidQSTghUiw0WzBRJSJfOCdQMCtJIis4K0ggUlYmOVwrUlA5PCgoPC45IDw8KFQ0PAotTUhAIkMkQDwgIDEwMCNDXCdHUUA7IjVUQltSL0wpPDA5MjFdVSA5TEVcMTo0ICBEKzQgVVskQiA1MSAjSwotTSQkJD1cQEQwJ004Ll5RXiwjUUgmUVFYPiAjWChUIFojKTtIQFJBR1AmSzw4OTBaUiYvRChdUFxCJF8kIQotTSswXT0jSyQhRlIwICEgICQjIEZRI11EMEAxT0gnLCw4SEFNSyE+MDojQjkiJFw8OiNSOzoiSDxGLCIwTQotTSFdUCYxQTpUJiJUOlZSIyUoJShBMFEjIyRYXCxYME4uI1AsMkpBKUInPzAgIDI7MCJZLENKUF5HJUdYIQotTUJAKFQmOjBGPUBTJSBRJDpXUS4wJltIMEJRQFMjSSwjPyE6QCAgTDYwIiE8KDwgKihAR1ooTUgzJjA/MAotTSA9SCZMUVA2JydIREZBUlghPEAsU1E0SiJAPCE6Iio3ICRMK1whViElLTQ7OSE8XShOLC9CIF8uJyA4PAotTUxRLzckPSQgOSBARCE7UChSITZCJjE0Ri5AWFgjKiAhXDFdMCM2TCtLMFRbKTk0I1tSNyYkRlgmXUAgKgotTSU3SCtKQFZGJ0AoIV4xJyYjIVQrQVFTNCUjRDgxMEgvIytMOUwiJ1UpOTAgJUBfNydHWEVfMEJNJVtYOwotTUAxTTImN1wpLSAnJCVYTCgwQUxLJlk0M0cyIE8oWFA3KCInXyE0XCAgQSogJzdALFdBK0soOzgiM0IoWAotTSheSCkwMilKJFQsRDghNzsnQjBAXFBISiZFKDRHMEdHI1pYJi9ASysoOiwhU1I8ICAgVEEsISgtJFosKQotTUIhU10iTyBEJCE0MSRbLD4iUTlaIz4kMzVARjEmRExGWSImUSc8XEBGUV5YIlEsOSpSJjwpOCgxO1FTRwotTSAlTC8kIVVPKUIkIyRSJyopLUw6LEFAKCM0NCFLMScnJl0oOTYgIUooSjQiJDBSVCFNLEMsIU1TJ0YwOwotTT4gXiIiXzwgOTAhVyItVCI2MUpAKFQ4OEFQLEYhQVBCRDFBTiE5KDdYQVBKJl5UPCwxIjUpJ1BFIkFIKwotTSY5ICpEIjgrID9MN15AIi8jWkgqWUIvXCkuPCdKUD82I1YwLSwhKi0pP1wsOFBYJignSCBCMTMwJjM0MgotTSUxIDcgKkA9UUBfQCM+VCJEUDQjIitMKyMwKSMjLiQnNEAkTSFLQDcnUiwlKFdUP0VBLVslS1ggIEI1IAotTSJBUEYxMiM1JFosRjowTUgmQzxCJTIjVSMjMDtBMUU/KCNcKUtAOFYmViQlNiE9SCNSVDc5IT5XKDpMLwotTS0yKjgoVDwsXSBYWSEgOCxUIjAuICEgJSQiNl8jJTgwT1EnMSgvOEU3IDM2JTxcMTAiOEIhQ1gpTyBDKgotTSIwQEEpMEMlKF1cIkoxR0YkWkBAOzEnPidcRCknQFkpJjo8QD4xPFckTiBCMiItSyAmWDIsIExNJVggLQotTVNBWVEiRjQmMUFBTCU+PC1bMDVAID9MOCtQRDwjWEw/TDBdOCFQWCBRUV81IEVIPEVBPlQmMFQxIDAnJQotTShLIC5XUS0kKExENVlARV0oLCwiVUE3UChTJC0gIFkkJSVQKTBCISQhQ1glK0BIPiBYPDZDIUhLIEBUKwotTVVSNk4oOCwuTFBWTiQkRDdPMUNeIDk8KDcgI1AmLDAqNlBaRCgzTCFFIFFLI0ZEOFRBICYkSUwgTCApVQotTSJSNEQyIVYvJDdcKzNQKjYhK1g7JFE9Pik+XC1IUCRSIl80ID4hRkIoIDQmUkBHSSk3UENRIS89KT5cKgotTToiOTYnM1Q4SDIxRCIvRCYvMFEiKUwoIS5RK1chLCQgIFEjUCMuJEBCQU45IU88NFcxPl4jTVwzTSFcRAotTSFOXEQ2Ijk9Jk8wPiVRJDwnVTAmLyEyTCYlLCA0UCdaIENMLThQOC0nRUQkX0BXNCRFVDw0MT5DIjgsQgotTS1CKkIpKDhDSjEnSiAhMDAgIClAJjVIOSgxTTIpL0QqXlE0LCg1RDdIQicoKDg0ICdQSzEoVEg/WUFUJQotTSdVKDswIVJaIDJQJlkhJDQlPlg+KlIxWSVSLDZPIVwgIS9INlVCOTwgL0RFOUI3TSktJD5eMCwsICg4NQotTTQgSksiRCw1XTAuUyNfIC5EQUNcJiAgQitRLVYhJDw+TEIyUCA3KDgpUCcyJiwwJkVRVEsoUjw9LEEtOAotTSdEVCUqQCNZIFlQQEVQPFEkUFQnJEA8SSJQQCxZQDtIIDssOi9AIFEmUVQjO0ElICQ9UCNTMS8yKS08LAotTSQxPiMiSFwzW1E6TSdBSDFXUi1LJT5IRkUgN04gMkQlJEAsLigrMDxaIS5UIytMNDZCMzcmXVA6XCBNNwotTSYzNCQ9QEErKShENisyIlwpJERGJSBZUyUqTDYxMT8wJUdYOzAiNFwmNVQ3RlBTJSI9KCVGQFJYJ084RgotTVEiJC4nQUQzKFFDUCAzLEBNUSBSJz9MPVpARzUhLywoKUEsNSNVJDAwQScyIltIOC9ATDUkMzAhSCBBKgotTShdJEJOQilaJUskJiRBMUglMjQyVTFBQidDTCAgUi5QJFA0PioxRy4mSDxCWFEvTSRAPEVSUDJZIEosIQotTTVQNTUjVVwlPDE+ICZeODc2IS1dJC0gIjkhRCEmVzxBV1FGIyI8WEMjIT8sJiokQ00gPE8gJ0QtSFEwKwotTShSTDkxUC9bIC9QIjcxJlYnKFgvS0FSQiAhQDpcIShRJS9MJUJSITImN1Q9XUBAOyEhQDkoMSlZIyxAQgotTU4gUEEnMFQuPlFVUylNREA0IjZLJiYkRlcxNl0oQigpQ0FfRyU0NDAkISRaIDZQIjggPVomU0g/R0EiLAotTSI5VC4jQDs6IFowMDcxWyIpLDQ0MUAuKCAqKDg8IUMpJDFQIyRBIScmPiQvK1FUTiUtLEZZMD1PJEswNQotTSlBVUohQygiTTAjKyRUKEMjIVpZIzMkQT5QT0UgIlRAQTIlQyZYMEVeMCsnI1pAQDUiOkAoMFwvV1BXOQotTSFUODIsUFotISFEOSMxW00hWzQtU0IlUyJMPCQpQFIwJlA8RCxAICQjRSgsWzA8XCkrOCU3MUtOIDBEQgotTUNAUzMhQVBEWiFKXigpWC5YQDQ1KS4oOVcwMkgjLVRDPjFVKCBOWCYwUDk5KUUgK0IwQjskJyA3NVIgTQotTSFNQCRcUSUtIiU4JkNSMD0gQVAxMDFPVydPREZWIVI2JlMkLlAhKFQhWCgrLkEuMCJFRDEiIjNbIj08MAotTTcgQk0jJ1QqOTI5QSQxTCU3UCc4Jk48PENCM0AlRjwpITFaWCNZVDxSUDFLKFpAOToxWFoiIjg0K1I7JwotTSUjSENaIE9RJT1cPDQgTEIoTjAlKyAgPSVaRCREUD0oIVogPVFAXz0lP0AgISBdQCI8SCJXQE9XIyMwPgotTSFBI0MnTFw8LzA0IiJVQCwzQEMpKDwkOUFAKyAhXThFLUBTPidEPCMvQCM3IC8gQlhQQCcpMzQgJiA3PgotTSAsVEI7IV9bKUA8IVUgLTUjTTA3ViA5NyRfIDg2QiAqKSBIJlNARE8mR1hBKiFfWSFHICQuUixMICFURQotTVgiLFIpR0QmKlEmWiAqTClRMCwgITlMMU0xLTYnMEAkNTA0RShJPCBKQjlKKFdIPzNAMUklQlw2LSAgUQotTSNANDNEQFxBJSpANDxRKVMkPiAjVUFHPCRCUDRIMCNWJj1YMzExQ1AkUEg7VkIqXCQlMDlHQChQI1sgPgotTTtRTF4mKTQsSkI1MSAsLDtEIE03IyJYNyIgSkImL1Q6IFFdRiheSC9fIE08JVZMP1ExX1gpSzxDUCBBPwotTSI2IDNJQElOJixQLyBCJSYoVDBCTCBaUylBRDVcMC0nI0ZQOFIhKjYmTEQ3VlFFJCBeXClNQSBdJC0kLgotTSpATDooQzwpTVBRJSYmSDw/Ui5FI0pUQl9BSCIiJSAlISA/QCclKCElMCpUJz0oJjhBQCUhXVAiRkBXUwotTSU4PDxVIFdaKUxAI0lQJk4jQyQhUEA8MiNfOCAnMC40IFNcMlhCKjMgKkQ8OlI2PyE/JDEvQSdEIVRIJgotTSBAUz0mTUw7WiIuKykuMEVfIDs3Jlo4QSBRNFwkUSAiMkE/IiNOMEE7QT9DJy40MEVQQV4oLiAiMCIvXAotTSBdSCpLIUM3JU1YJioyKDsgKjQtN0BDWyFQPDgoMStdISxIOVVBL1IkWSQsKVA+RicpTCREIUQzJjQ4IwotTSwgWCklOEQzJzBUUiVPOC5YICMiJjxAIEAgOE4kKShCTVA5MyNXSDw5MTJJISYsQz8wND4lXCQuVFBQMwotTSIhSEImIjowKUkgLCcxMUolIjAgITIoQCE3WEJJICxTITMkRFMiJyAlIigiRSEyPyk9SDBbIVdPIF0oQwotTSkwUSUgKigsVlEzLilJPCtEMF8pIypMRyEiOFUmIzwtTlBbJCJHOCpPMjYsKE5cQkowPSUoRUwvW1FBOQotTSEgMDBGIU9OJzdAJi5APiMhSjArT1IsLSY/SCdAUDwqKDkkN1NAPE8hO0Q+TlA3ISAiMClQIC1EIjowKAotTS1ASj0nSTgqVVIvNSc3OEJKIiNUJTUsIl8hJS8jTVg9PFFTXiAiPDhIIS5aJktIIUBSOCUkTTwsIFA7SwotTSk8QENHUCJWJVgkICwwNkMpNDwiQlA0SihRQCowMD0jI0U0IFwgJl0jTzQ4KFBbOydNODBCUFInKSYsQQotTSdASUIiSFAiQVBDWCEyKDdRQitaIC5QPkwgOSUoNUgrJ0EvQSREXC5BIjpfIkQ0MlYyOVQmKkw0STEuQgotTShVXCM0MVZSJDw0Q10hXlEgOUw8OlElLCNUSDJTQSRbJUpAOCZRUjghMVgiTjIpJSkyIDkzMExQI19AIwotTTtCJlkjS0AqP0EvRyAwMCddQF0hJV1cOiogOk8oSVA0QiAjXyRBJEUkISxBKSg8IlEiMC4lI1AmJCAsUAotTSZGVDpaUDYjITUkIjIwRyAlUzBDT1IjUydUODEhIi8gKDdcJUMyMyIgLyQsIzBROSNTKEElUU5aISNUOwotTSQhPSUgVFw+J1AqPSNXWCBCIVAuIVZAJjlSLCMnODRGVTFTSCdWUDg0MSRLIzw0KlAgX0shOVA3UjIuMwotTSVVWCBMMTJCJV8sNipBO1YhWzxEJFAsJSFYODsuQTshICpYICAxUzAmLywrN1FEXSNKLD0uIDo6ICw4QgotTUhBP1cmNjQ8PjBeWCEpVCsqUFAmJU04IEQyNEolR1QjTVAgTiMgTCIiUFQ8J1YwLjBBIDcgKjRCTiAmXQotTSMvUDcrQjpWJCwwKzZQODIgJTwwWEA3USMoPD9cIVElJjAsP00xQVElWTxDPjBEKyVMQCVJUVlVIiRUPgotTVhSOVsnLlxBN0BMXyE6LDomICAmIz0gOjxRT1YnIEQ2OiBcICRPXDwqIFYyITtARiUhJkAkQVQxKiEwTgotTSg2JC4rMDAqIDxILCdQRkcgV1A+O0E2PCIsNEQyQi1KJkM0IU0hLlwhTkAxWkBFSCBITDU1QDQmIVxYJwotTSZBT1soODAvNEBUOic8IDE2MVdfIVlcKzhQPy0lLlQkOjIpTiNFWDNaUU5LJlJQRV0hTjQkIiQ8RjI7MgotTSZVKCAqUTJQJzA0JCoiKTMhP1w2UyFJMSUvIEQ2MVRTJDpQKSMwICgkOUA+NEIsMiYgLD8zIEM6IStIRgotTTAhIzMhMDw4LzEnQyQjUCEhICZdJz84IlcwK1UpPTgiWVI3WCFWTDNZIjIvJzc4OEJROyAoLkgtPyEgXwotTSUqSCAtMDBIIC48MUQyM0ElKDAmSkIvNCInVDMqUStGIzI8PkdRJSIlXkAyQzBdLiNTKCEnQicwIUcsQwotTShAPDElLiw/WDEiVyZcTD1OUEg4I1EoOUkyNCMkJjRGVzBQJyg7TDI8QU5PIzU8OSpRWE0iX0BEOTAgKQotTSc8VDlRUTFKI1wwP1ZBNlgmQCQ6MUEqWyY6NCZYUSpcI1BIKDIwTD0kOVA1PiFLJCJISD9DUCouJUlUOgotTV5BK08mUixCQjFTLylGWERNQTMvIThUQjEyMy8pI1giL0AyNyBNIEI2ID00KTkgOiFQOSkjPyArKTEjUwotTSFeXDooIDFHJFJQMlZSLkUmPig6KFEwVyBCMC1WMVZAJD48JzggLSEnSSwrPUIsRSBXNDA8MEAtJDIwPQotTT8xTTUjQSBFPlIoXihfLDRFIE5TIio4M0ohTlIjTlgzMUE0OSg/NCQjIE82IzowKERSNTMoI1ghOjIxOwotTSVTQCVYQDwvIVRUJikxR1QjKTwySCIkOig3PC4pIVBfIyUsKF8gICEkJSBESlAxKCJbND1KIjJbIiA0PwotTUQwTTcnWFgxNTFXNSEzUDJRQEk+Jz1cQiJCISAhKkAnViBcOCVGMC8zUUdBKCgwOksxUVAlNjQgJUEsJAotTSU1MCVbMDZUJShcLz9BK1ImK1wmP1BSMyRcMEVTIENBKUc8KFcwLUshQigxLVAtQyZGVCooUTxDJlQoOAotTSggVUEoOywhPjA3NiVbPDo9QFNRIjkoOTFBJyEjOFwtRjApQyAgQEBEIFs3KFEkQUEiK1kkSVA7PyI6NAotTSNYIEJBQUA9JzVMQDkhKyIjXEQkSSAsVSIxRCtUISApJCpAPV8gUS8hSTwzVyI6TCZLPEBQQVgqKSssQQotTSNAXFkiPEQ1SDAkLCU9TCkqUVswITA4LE4yNDsmRTw+VUE5NihKUDw1UVQxKDkoOjEgI18mRSxDMEE+VgotTSEvXCVcQFg8IytQQkNQKislIlgzLSBeKiM8LDQ/QFdOJStcQDlAIFQnWiA3IUA4RidCKCAqUEIoIj1MRQotTUxAOEcjJkwmPFBWTSNLOEAmUEYzIys4KyciKDUlXlwzWlBFSCIuTDBFIjo/JVwkRV1RNzMpP0g6REAxQgotTSciQEQpQFI4KSIsRlQhOE8pO0wtJiAvQCheJD5AMDc+JTA0OU5BLjYhU1QjSCEwQiA4ODY+IikrIiMwKgotTT0wJSokJSg3PVAwKCgqPCc/MFJQKEggMTMiMlkkVSg2P0EvLSA4QChNUCU6KS8gKFAwQ1gkWVxBRlAuLgotTSFGREJaIEYrKSNAIyBARFYhPyQzUlBISiAtMDYzUCNQJiZYQCdRICwkN0BGJFBDJihfWDBEQFQiJztURQotTT0xPTcgVFQ8VVIoKyRDWDhNMF9CKS5ARl4gWUUkQzwjLFFBTyhWQDRcMCo9ISMgRTRSJlIiUCQ1X1IgUAotTSMkJC4uISUpIUIwKDUwRzoiKFw8P0BWSCUnPCUiUE4xIkZUQiEiN1ojMDwtLyAhLSItVEBYIV8yJS4wKQotTTIiLkgkIlwiKDAnIyJcMDZMIFY+KE5QNjMwLVEnTEAiS1FUXyVbLC5CIFZaJUk4LzNSJ14nQ0AtOTEgIgotTSJHWDxYQSdWIDtcO0shWjUkQSQgW1E6UyBTWCMiUi1BJTpAQTMhJyEiXkhENDFbPShBLEMkUFZRJiBQJQotTUowOjMjPUQhTTA5JCBJJCYuQiYxJUhMNyQwXUghR0w3QSA0QCBDIDM/QS1VJ1dYOEFRWjYoMVQmRkEsJgotTSAgJCNUIDYjKUtcQUMxX1YlNVgwTTAkVictUCsiUUZBJEUkLidRKDwpLyQzIkBHSyVVTC45MVsvIig8LQotTUVSO0cjPDwuMCIsTSY5SCMlME5LJEdIRlkhWTklLCAtNlAzUSJZLD8sUShRIFpQNDRRTSokPlw/XVAtQgotTSIwSDMtIEdCIkIgJ1ZBRlwmIDgpSDBIUic/IEFcQDQuJD1QPlhASV4gJEw9SlBJXShDSEA9QVU+I1I4LQotTS1BXUMpUDglPVA1WScxVCAiMFEgJ0BQIy9QWV4hUzw1SlBTXSQmJCdUQidSIC4sJSYgVE4oOFgwXCElPAotTSdKUDhcQjIhJjtEOj5AXzclTCQiWTIkISU9NCdKMC0+ISs8Ml4hU1gkNSg/VjBFQSU0SCVNITUrIzpEMQotTSMyO1MoOSgmJkAyPCdHXDc4ICItKCZMNyFRI1wkLzhFOiFGNCRfWDNEQV4kIEFMQz1BVjshPjwqXiFELQotTSNVWC9QMDhQJCEoPlJRX0sjVTg8QSAlMyRfPEMnQic8ICNcI0AgViggU1AvSlIxOiAySC1YQSIyIEJEIwotTVBQWEggOzQ7OEFDMCA4RCFFQVlXJDA0NkQhOk8mIUQrNiBbIyA2JEEzIT5bIkpEMyVRVlIgTTg6RDExTAotTSNePDReQUw8KCU4OEhRL1wnOEQ/QCA7JCM+QCpIQVFWKDhQRjExIT8oWTBDU0E6UiEqSClOIUA3KExEPAotTT0hSV0pKCQ6TTEnOyRYLCMgUCouIjpINTQxNU8nJSg4TCFbMig1ODFQUUkiIiU8MzohNywgOighICBIMAotTSY2WCExISMvIExYOl1RTTsoX0gyTkIpJyJaOCBYQClFJyckIFBRW1UhOzwxQ1E0QCk6UDswIjVLKFBcJAotTUZRTjcnOEgpJCFITShPXDNaQUlbITJIM0JRLksiO1RGM1BWWiEsUCcwUDJVKTJQKSRQUSEgWTwpS1E3MwotTSkpICo7ISIsJ1goJT0hSkIoMyQqJlFSXigqUCM7UjotIi5AI1hBN0AgNVg4JUA8JCFaTDNLMCcvJVMgPwotTU8wS0wjNUA6TyBVTyBGUCpNUVBQIjZUODhBQlkjPFwrWiI3VCNQPClGUjs7KUVcNllAKkwkW0wmODFRJQotTSNfKCQ0MF0pJ10sMiUgREYkXFBATzE6KCgzMEUsIFAqIVlEI0swMz4hWkArU0EyPCY5MDBGIVs1J0YgJAotTVZSNCIiXzxBJkBGXCFHWD9UIjhIJU84LV4gNVEnUywkPEAxQCNBKC9aUVI6IFRcJStQLyMgQjg6OUFYVAotTSdbLDBTIVFJIl9EQltBWDEmIiwyPzIrJiFXLEQ2MCwkIyU8Ml9CMUEnUkAgIDFZQCVBSCVeQiBdIS1EOgotTVxRWSkgSVBALEBKNSUsODkjQS5XJko4LS9BKiElMDQvUSI2LCcwUC9IQTgvIVA8IUtRRlEjTVhAWzEjWwotTSdCUCgzIF5YKEE4KjMxWF4kLShGPSBWQyk8KChJMUEnKElEKDdQM0EnICQ3TzIsXSRBMDREIS8/JSJMKQotTSIhWUcnVFAqXUA0NCZUMCcoUjopISU8NyEyJyElLDA/LFA3SSU4LCtOUi9MJy4gKTRQRl4lNzwzPVEqRgotTSMtRDozUiZZJiFQPkEwICsnUCAuMCFPXSg7WDBJUC9KJUtYQkdAQE4hIFxAI1BLJSIrOEVSIDs3JiZUIQotTSFCJVQoMjRBXFBbQidVQDhAQVohIyFELCtRWzMgLkhBO0ItXiBRMC1NMTdVJlU8QixRKCAgSzAvJTEmRQotTSBOVCwjIDpBKDQoNkJCMEcgJThGISA8TyVfNDYzME9fIVMsNTAhRiAlJEhGMjAgMCRASDQnIC5HJSRUNwotTT4wLUwoJ0w6JCAqWyhCMCkzIE0iIjggOiJAPU0hPzBDWkFFVSYxUDJJMFI2IiM8IDMwWVAnKkREQiFMLgotTSY7ODNFUU9ZJ19MIVQxOCEgT0g5QkBUOShGQDsiUV45ITgwJ1oyLV0oUVBDSEE7LiU0UCZUQUA9JlpUMwotTUZBT0QoOyg4KTA9XyBeKCM1MFNIIz4gPDkwMTwoVEglQVE+VSdPXDJQUSgzKDQ4LUpRSUEmUEQxQFEjWgotTSUmKEEmQE5BJ08gMi0hSVEiNEwqXlEzTyk3QEZLIUkiKUlMQlVRVkAgSlQtMFIwKSJYWCE4UEYpKE0wPQotTVFSMU4nUjBAS0FeWyU1KEA1IFNeICNAIV5AMEAhU1giXUBYTiMxMDgpIUA2ICo0PlZRUkwlLjBERTEuXwotTSJfSC0/QT8gKUdARU5BWjcmXDBAOzIrWyBBRCYtQTBWIlxAN1EiOyogNEwxUiEgISUvMEIkUUYmJTk0MQotTTwhOlgpNDgqNTFRPydPWCVBQUY6JVU4OERBVVgoTSgsTDIqKCUtMDg9UUEiJEFMRVBAWjAkOVA8PlE7NwotTSYyKEQsMVsmJixMITkwVjohVFBDX0A8WSVTTDIvUTkoJFZUREQyJ1skISw5JlBaUChBQCZLQU0hIVFIJgotTSwwU1QlWCAiRiIjVyBIQEA/QSUnJTY8LyMyOz0lVzgyJyI3PSVOJDk7QDZAIT5YQE4gMy8lRTQkT1AuPAotTSkkOCVdITolI0YwIVkwLDkiMyg9MjA/XyBTQCdJMThUKSsoRCJCKzQmPkgqMUEyKiUrUCBYIjpRIio8MwotTUYwKTMkTEg8TSEsNyk0KDZfUUwlKThAIC8wNSwhQTgiVUBHOiZHRDsoUFIpIzAsQUxRXDAoPzwvWFAuVAotTSYzKDI6UVcvJ1E8PlohL0IoUzw9WVFKXSczSCspMFpSJU9QIEsxRS8nRTAmUSAgIiAgICAgICAhICAsIAotTSFAICogIFwgJUAgPiAiPCAsMCBcICREIDVQIUYgJzggQVAiOiAqWCBQUCM5IC8gISIwJEMgM1ghNkAlVwotTSA5OCFNQCc3ID9EIicgKSEgRjwiQ0AqViBNXCMiQCxWIFYsI0QwLyAgXyQkKFAxNiEoSCRPUDNWITJYJQotTTlQNkEhPVQmJkA5OCFJPCZVUDw5IVVQJ0ggP0UiIkwoPFBCXCIwOCk0MEY9Ij5MKi5ASioiTUwrKzBOIQotTSAgICAgICAgICAgWiggITU7Rk1OO1c9TigmNVI8Rl1SICBIICAgICAgICAgIEovVCAgKkNfICAiSSA4IAotTSBKMEAgICpELCAgIkkkQCAgSjEyICAqRDsgICJJJ1ggIEoyMCAgKkRIICAiSSpQICBKMl4gICpEVCAgIgotTUkuKCAgSjNOICAqRSEgICJJMSAgIEo0PCAgKkUrQCAiSTNUICBKNS0gICpFNyAgIkk2VCAgSjYhICAqRQotTUUwICJJOzAgIEo3IyAgKkVUQCAiST5IICBKN1cgICpGIzAgIklBUCAgSjhIICAqRi5QICJJRFAgIEo5QgotTSAgKkY/ICAiSUlIICBKOlkgICpGVUAgIklOPCAgSjwmICAqRylQICJJU1ggIEo9OCAgKkc+QCAiSVlAIAotTSBKPyggICpHV1AgIklfWCAgSkAuICAqSCkwICJKJEQgIEpBSiAgKkhAUCAiSilUICBKQlkgICpIVDAgIgotTUovKCAgSkQ0ICAqSSowICJKM1AgIEpFPiAgKkk8MCAiSjdYICBKRjIgICpJSUAgIko7RCAgSkcoICAqSQotTVcgICJKPyggIEpINCAgKkoqICAiSkM4ICBKSS4gICpKOjAgIkpHUCAgSkovICAqSkxQICJKTFQgIEpLSwotTSAgKkpfICAiSlEoICBKTEMgICpLLEAgIkpUWCAgSk09ICAqSzwgICJKV1AgIEpOMyAgICA2VDVSPEZdUgotTSgjICAzRl1UKCZdVztGNVIgJFlPKCctVThWQEA5RkVMOTIhTzxCIUQ6NylFOFcxTzxHRCAzRlxAPFc1QwotTToiIVA8Rl1DOTctUyAkRU49JjVSPEc1UD0mNUQoJy1ZPFcxRTsyIUM4NlFMICRETzNSIUU8RylPPEAhLgotTTtSIVM9Ni1IKCYxRT1GRUM5MiFPPEIhQTkmMVI5Ny1TICQlUjlSIUw6Ny1UKCcxTztSIUw7VllHICQ1WAotTTk2LEA5Rl1SOzYlVCgmNVI8Rl1SICQpQTkiIUY6NlFFKCZZVTs2KUU8QCEuO1IhQzomRUw5JylFO0AhLgotTTtSIU07VylFKCchUjtWLUU8Vy1FPFAhLjtXMEA5NllPPTY9SCgmVUU7Nl1SPjAhMDk3KU06Ny1TOjZdTgotTSgmMUU7RkVFOSAhIjg2MEA4NjFEPEY1UzxQISI7Jl1DOlIhRDk3OUk4VjRAPEY1UT02RVI5NjAgMSY1VgotTTo2LUUoJilVPFdEIDFGRUw5MiFFPiZFUz0nLCAwVylPPFcsTTkmNVY6Ni1FKCZRSTtGTCAzRlxAPFc1QwotTToiIUQ5NzlJOFY0IDNGXVQoJiRAOSZFUjk2LVQ7VylZICRFUygmJEA5JkVSOTYtVDtXKVkgJEVOPUYlTAotTTo2MEA4NylHPTZVRTtHMCAxRkVMOTIhVDg2KUw5MiFPPUY1UjlGUU89UCE0O1ZcQDs2JU4+MiFPPCY1TgotTSgmOUk7JjVTICRFTjg3IVA8Rl1QPEZFQT0mNEA6Nl1DPSZQQDlGXVIoJjFFPUZFQzkwITQ5N0FUKCY5SQotTTsmNEA4RzVTPjAhJjo2UUUoJzFPO1IhTDg3KUc5MCEuO1IhUzwmJUM5MiFMOTY5VCgmXU4oJjFFPUZFQwotTTkwISk7JlFFOVYlTCgnLUU5NkwgNEY1QTkiVU87RlFZKCY5STsmNEA8V0VTPSY1TSAlMU87UiFNODZZWQotTSgmUUk7Rk1TICQpUjtWTUU7QiFQOjchRSAkJVI5VzVNOTZZVCgnMU87UiFMODcpRzkwITI5Ny1VOycwQAotTT0mXU8oJlFBPEY9RSAkXVA5NylBPSZFTztCIVc7VzVMOSIhQjsmXUM6UCEvPCY1Ujg3MUk7VlhAO0ZdVwotTSgmRU4oJyFSO1Y9Ujk3LVMgJF1QOTcpQT0mRU87QiFBOycpRTg2MVkoJkVOKCchUjtWPVI5Ny1TICUtTwotTThWTUU9IiFPPCY1Ujg3MUk7VlhAO1ZYQDtGXU4rNy1POFZNRT0gISQ5Ny1UOjZZQT0mRU87QiFBOSYxUgotTTk3LVMoJylFPDc1STxGNUQgJFVFPFctQTlWNEA9Jl1PKCZRTztGPCA0JylPPSZdQztWUEA9VylPO0Y8QAotTT0nRVA5MiFGO1coQDxWXUM6VjVUICRdUD0mRU87QiFOO1cwQDxXNVA8Jl1SPSY1RCgmKVkoJyFSO1cxTwotTThWXUwgJSFSO1cxTzhWXUwoJllPPSIhUz03IVA7VylUOTYwIDRWXUM6VjVUKCcxWTwmNEA7Rl1UKCctVQotTTwnIU88RzFFOSAhLzwmNVI4NzFJO1ZYQDtGXVQoJy1VPCchTzxHMUU5IiFPO0IhUztWLUs5NzAgNCcpTwotTT0mXUM7VlBAOUYlTTo2UVkoJllPPSIhUz03IVA7VylUOTYwIDA2MUQ8RjVTPFIhRjg2VUk7J0RAO0ZdVAotTSgnLVU8JyFPPEcxRTkiIUI+MiFQPEZdVDtWLU87IiFGODZVSTsnRCAwNjFEPEY1UzxSIUE7JylFODYxWQotTSgmRU4oJzVTOTAhIzg2WEc9IiFBPFctSTlWWEA8RjVRPTY1Uz0mNUQoJiVEOScpRTxXLCAzRjVUPVZdUgotTTpSIUk8UiFEO1c9TiAkWUU9Jz1PPEZMQDo3LEA9NllSOTYlQzomJUI7JjQgM0Y1VD1WXVI6UiFEPEZdUAotTTwmNUQoJi1PO0ZZRThXMUk7VlhAO1ZYQDxGNVM5NzAgNFZdRj0nPUE8RjRAOFYlVTxWNUQoJi1PO0ZZRQotTThXMUk7VlhAODYpTzxHMCAwVl1OO0Y1Qz0mRU87QiFSOTctRT0iIUI+MiFQOTY1UiAkWU8oJilVOUY5RQotTTxCIVM8JiVDOTIhQT1GJUk7JiVCOyY0IDRWXUM6VjVUKCZFUygmJUw8RjVBOSdEQDhWXU47RjVDPSY1RAotTSAlLU84Vk1FPSIhSTxSIU47VzBAOFZdTjtGNUM9JjVEICQtQTtCPVQoJy1FO0YwQDg2OVQ5NyhAPFZdQwotTTpWNVQoJy1IPTcxRDtXPU4gJTFPO1IhTTg2WVkoJylFOUY1Ujk2WUM5NyxaKCYtQTtCPVQoJy1QOyZFQwotTTkwISM7VllOOTYtVDo2XU4oJzFJOzY1RCgmXVU9ICEjO1ZZTjk2LVQ6Nl1OKCcpRTlHNVM5NjAgNSZdTwotTSgmVUE7R0RAOyY1Vjk2UVMoJl1GKCctWTs2KU87JkVDKCZRSTtGTVMgJDlJOyY0QDtGJU05MiFUO1ZcQAotTTsmXU45UCEoO1ctVCgmRVMoJjFPPVZYIDImXVM9IiFJPFIhVTtHKUU4Ni1IODYpTDkwISQ6NylFOFcxTwotTTxHREA7Rl1UKCY1TTwnMVkgJTFPO1IhTTg2WVkoJyFSO1YtRTxXLUU8UCE0O1ZcQDs2JU4+MiFVPFY1UgotTTxQISQ6Ny1DKCclVTtXMUEoJjVYOFY1RTkmNUQgJS1UODZRRSgkWSY0UiFGOjZRRSgmQUE7RjFMOTAhNAotTTtWXEA7NiVOPjIhTDk3OUU7JyxAO1Y4QDxGNU07VzFFKCZFTignIUE9JkAgM0ZdVCgmJEA8VzFSOTYlTQotTSgmMUU9RkVDOTAhNDo2VUU8QiFFPichSTxGNUQgJF1VPSIhTzlCIVM9JylFODZUQDxGNVM7VzVSOFY1UwotTSAkWU8oJlVFPFctQTlWNEA7VjhAOSY1Uzo3KUU5IiFUPjchRSAkWU89IiFBKCYxQT0mJEA7NjVTPFYlRwotTTkwISk5JjVOPSZFRjo2NVIoJylFOzZdVjk2MCAxJjVBOSZRTzhWTEA8VkVUPTYlVDo2XU4oJjFFPSY1QwotTT0mNUQrViVWO1ZFRDk2MCAzRlxAPEY1QztXKUQoJlFPOFZNUygmJVY4NkVMODYpTDkwIS04Ni1IOjZZRQotTSgmRVMoJllPPSIhTztCIVQ6JjRAO0Y1VD1WXVI6UCEvOEZJRThXMEA6NyxAPEY1TTtXMUUgJFFJO0ZMQAotTTomJVMoJilFOTZYQDxWNVY5NylFOSAhITknOUU8RzFJPFY0QDk3KVI7VyhAICUtUjs2XVU7RzBAOTcpUgotTTtXKEAgJC1POzZVVTtGRUM4NzFJO1ZYQDk3KVI7VyhAO1ZYQDxWNU45ICEwPEZdVDtWLU87IiFFPEcpTwotTTxAIS09NlFUOjZBTzwiIUE9JzFFOzchVDk2MCAxNDEvNSQxLzUiJEEoMiQgNEY1TTtXMUUoJiVEOScpRQotTTxXLEA4VkFBO0Y9RTkgISY9NllDPSZFTztCIU47VzBAOjZVUDsmNU05NllUOTYwICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkISAgICAgICAoIiAgICAgMCEgICAgICAgKElAIAotTSAgID0hICAgICAgIChKICAgICBFISAgICAgICAoSiAgICAgVDkgICAgICAgKEogICAgITc5ICAgICAgIAotTShKICAgICE/QCAgICAgICAgICAgICAiIUAgICAgICAgICAgICAgIjNAICAgICAgICAgICAgICJaQCAgIAotTSAgICAgICAgICAjM0AgICAgICAgICAgICAgI1FAICAgICAgICAgICAgICQvQCAgICAgICAgICAgICAkSQotTUAgICAgICAgICAgICAgJStAICAgICAgICAgICAgICVOQCAgICAgICAgICAgICAmK0AgICAgICAgICAgIAotTSAgJkdAICAgICAgICAgICAgICZZQCAgICAgICAgICAgICAnLEAgICAgICAgICAgICAgJ0RAICAgICAgIAotTSAgICAgICdQQCAgICAgICAgICAgICAoTUAgICAgICAgICAgICAgKTpAICAgICAgICAgICAgICouQCAgIAotTSAgICAgICAgICArKEAgICAgICAgICAgICAgK1NAICAgICAgICAgICAgICAgMSAgID4wICAoSiAgICAgIAotTTEgICA+MCAgKEowICAgICAxICAgPjAgIChKSCAgICxEKSAgICAgICAoSiAgICAgIDEgICA+QCAgKEpYIAotTSAgICAxICAgPkAgIChLKCAgICAgMSAgID5AICAoS0AgICAsUykgICAgICAgKEpYICAgICAxICAgPlAgIAotTShLUCAgICAgMSAgID5QICAoTCAgICAgIDEgICA+UCAgKEw4ICAgLSopICAgICAgIChLUCAgICAgMSAgIAotTT8wICAoTEggICAgIDEgICA/MCAgKExYICAgICAxICAgPzAgIChNMCAgIC1DKSAgICAgICAoTEggICAgIAotTTEgICA/QCAgKE1AICAgICAxICAgP0AgIChNUCAgICAgMSAgID9AICAoTiggICAtUykgICAgICAgKE1AIAotTSAgICAxICAgP1AgIChOOCAgICAgMSAgID9QICAoTkggICAgIDEgICA/UCAgKE8gICAgLiopICAgICAgIAotTShOOCAgICAgMSAgIEAwICAoTzAgICAgIDEgICBAMCAgKE9AICAgICAxICAgQDAgIChPWCAgIC5DKSAgIAotTSAgICAoTzAgICAgIDEgICBAQCAgKFAoICAgICAxICAgQEAgIChQOCAgICAgMSAgIEBAICAoUFAgICAuUQotTSkgICAgICAgKFAoICAgICAxICAgQFAgIChRICAgICAgMSAgIEBQICAoUTAgICAgIDEgICBAUCAgKFFIIAotTSAgLyYpICAgICAgIChRICAgICAgMSAgIEEwICAoUVggICAgIDEgICBBMCAgKFIoICAgICAxICAgQTAgIAotTShSQCAgIC89KSAgICAgICAoUVggICAgIDEgICBBQCAgKFJQICAgICAxICAgQUAgIChTICAgICAgMSAgIAotTUFAICAoUzggICAvTCkgICAgICAgKFJQICAgICAxICAgQVAgIChTSCAgICAgMSAgIEFQICAoU1ggICAgIAotTTEgICBBUCAgKFQwICAgMCIpICAgICAgIChTSCAgICAgMSAgIEIwICAoVEAgICAgIDEgICBCMCAgKFRQIAotTSAgICAxICAgQjAgIChVKCAgIDA6KSAgICAgICAoVEAgICAgIDEgICBCQCAgKFU4ICAgICAxICAgQkAgIAotTShVSCAgICAgMSAgIEJAICAoViggICAwSykgICAgICAgKFU4ICAgMF1AICAgICAgICAgICAgIDFXQCAgIAotTSAgICAgICAgICAyS0AgICAgICAgICAgICAgMztAICAgICAgICAgICAgIDNNQCAgICAgICAgICAgICA0NAotTUAgICAgICAgICAgICAgNFBAICAgICAgICAgICAgIDUuQCAgICAgICAgICAgICA1SkAgICAgICAgICAgIAotTSAgNVdAICAgICAgICAgICAgICAgMSAgIExAICAoVjggICAgIDEgICBNMCAgKFcgICAgICAxICAgTUAgIAotTShXOCAgICAgMSAgIE1QICAoV1ggICAgIDEgICBOMCAgKFg4ICAgICAxICAgTkAgIChYWCAgICAgMSAgIAotTU5QICAoWTggICAgIDEgICBPMCAgKFlYICAgICAxICAgT0AgIChaOCAgICAgMSAgIE9QICAoWlggICAgIAotTTEgICBQMCAgKFs4ICAgICAxICAgUEAgIChbWCAgICAgMSAgIFBQICAoXDggICAgIDEgICBRMCAgKFxYIAotTSAgICAxICAgUUAgIChdQCAgICAgMSAgIFIwICAoXkAgICAgIDEgICBSQCAgKF8oICAgICAxICAgUlAgIAotTShfUCAgICAgMSAgIFMwICApIDggICAgIDEgICBTQCAgKSEgICAgICAxICAgU1AgICkhSCAgICAgMSAgIAotTVQwICApIjAgICAgIDEgICBUQCAgKSJYICAgICAxICAgVFAgICkjQCAgICAgMSAgIFUwICApJCggICAgIAotTTEgICBVQCAgKSRQICAgICAxICAgVVAgICklOCAgICAgMSAgIFYwICApJiAgICAgIDEgICBWQCAgKSZIIAotTSAgICAxICAgVyAgICknWCAgICAgMSAgIFcwICApKEAgICAgIDEgICBXQCAgKSkoICAgICAxICAgWCAgIAotTSkpUCAgICAgMSAgIFgwICApKjggICAgIDEgICBYQCAgKSsgICAgICAxICAgWSAgICkrSCAgICAgMSAgIAotTVkwICApLDAgICAgIDEgICBZQCAgKSxYICAgICAxICAgWiAgICktQCAgICAgMSAgIFowICApLiggICAgIAotTTEgICBaQCAgKS5QICAgICAxICAgWyAgICkvOCAgICAgMSAgIFswICApMCAgICAgIDEgICBbUCAgKTBIIAotTSAgICAxICAgXCAgICkxKCAgICAgMSAgIFwwICApMUAgICAgIDEgICBcQCAgKTIgICAgICAxICAgXSAgIAotTSkyOCAgICAgMSAgIF1AICApMyAgICAgIDEgICBdUCAgKTNIICAgICAxICAgXVAgICkzSCAgIDZEKSAgIAotTSAgICAoVjggICA2TCggICAgICAgICAgICAgNlYoICAgICAgICAgICAgIDcoKCAgICAgICAgICAgICA3PAotTSggICAgICAgICAgICAgN0coICAgICAgICAgICAgIDdZKCAgICAgICAgICAgICA4LSggICAgICAgICAgIAotTSAgODYoICAgICAgICAgICAgIDhGKCAgICAgICAgICAgICA4WCggICAgICAgICAgICAgOSIoICAgICAgIAotTSAgICAgIDkzKCAgICAgICAgICAgICA5RiggICAgICAgICAgICAgOVIoICAgICAgICAgICAgIDlfKCAgIAotTSAgICAgICAgICA6OiggICAgICAgICAgICAgOl0oICAgICAgICAgICAgIDtCKCAgICAgICAgICAgICA7XgotTSggICAgICAgICAgICAgPDcoICAgICAgICAgICAgIDxcKCAgICAgICAgICAgICA9NiggICAgICAgICAgIAotTSAgPU0oICAgICAgICAgICAgID4wKCAgICAgICAgICAgICA+SyggICAgICAgICAgICAgPyMoICAgICAgIAotTSAgICAgID9HKCAgICAgICAgICAgICBAJCggICAgICAgICAgICAgQEIoICAgICAgICAgICAgIEBYKCAgIAotTSAgICAgICAgICBBNiggICAgICAgICAgICAgQVYoICAgICAgICAgICAgIEItKCAgICAgICAgICAgICBCSAotTSggICAgICAgICAgICAgQygoICAgICAgICAgICAgIEM9KCAgICAgICAgICAgICBDViggICAgICAgICAgIAotTSAgRDQoICAgICAgICAgICAgIERKKCAgICAgICAgICAgICBFJCggICAgICAgICAgICAgRUMoICAgICAgIAotTSAgICAgIEVbKCAgICAgICAgICAgICBGNCggICAgICAgICAgICAgRkIoICAgICAgICAgICAgIEdAKCAgIAotTSAgICAgICAgICBILSggICAgICAgICAgICAgSSEoICAgICAgICAgICAgIEktKCAgICAgICAgICAgICBKKAotTSggICAgICAgICAgICAgSlMoICAgICAgICAgICAgIEtEKCAgICAgICAgICAgICBLTyggICAgICAgICAgIAotTSAgS1ooICAgICAgICAgICAgIEw+KCAgICAgICAgICAgICBMTSggICAgICAgICAgICAgTSsoICAgICAgIAotTSAgICAgIE05ISAgICAgICApNCAgICBNQiEgICAgICAgKTQgICAgTVE5ICAgICAgICk0ICAgIE46OSAgIAotTSAgICApNCAgICBOU0AgICAgICAgICAgICAgTzVAICAgICAgICAgICAgIE9HQCAgICAgICAgICAgICBQLgotTUAgICAgICAgICAgICAgUEdAICAgICAgICAgICAgIFElQCAgICAgICAgICAgICBRQ0AgICAgICAgICAgIAotTSAgUV1AICAgICAgICAgICAgIFI/QCAgICAgICAgICAgICBTIkAgICAgICAgICAgICAgUz9AICAgICAgIAotTSAgICAgIFNbQCAgICAgICAgICAgICBULUAgICAgICAgICAgICAgVEBAICAgICAgICAgICAgIFRYQCAgIAotTSAgICAgICAgICBVJEAgICAgICAgICAgICAgViJAICAgICAgICAgICAgIFcmQCAgICAgICAgICAgICBYNAotTUAgICAgICAgICAgICAgWStAICAgICAgICAgICAgIFk4QCAgICAgICAgICAgICBZQkAgICAgICAgICAgIAotTSAgWU1AICAgICAgICAgICAgIFo2QCAgICAgICAgICAgICBaXEAgICAgICAgICAgICAgWzEpICAgICAgIAotTSk0ICAgIFtHKCAgICAgICAgICAgICBbXikgICAgICAgKTggICAgXDQhQCAgICAgIiAjUCAgIFxDKSAgIAotTSAgICApOlggICBcTiEgICAgICAgKTxAICAgXFYhICAgICAgICk8QCAgIF0lOSAgICAgICApPEAgICBdTgotTTkgICAgICAgKTxAICAgXidAICAgICAgICAgICAgIF5JQCAgICAgICAgICAgICBeW0AgICAgICAgICAgIAotTSAgX0JAICAgICAgICAgICAgIF9bQCAgICAgICAgICAgICEgOUAgICAgICAgICAgICAhIFdAICAgICAgIAotTSAgICAgISExQCAgICAgICAgICAgICEhU0AgICAgICAgICAgICAhIjZAICAgICAgICAgICAgISJTQCAgIAotTSAgICAgICAgICEjL0AgICAgICAgICAgICAhI0FAICAgICAgICAgICAgISNUQCAgICAgICAgICAgICEkLAotTUAgICAgICAgICAgICAhJDhAICAgICAgICAgICAgISU2QCAgICAgICAgICAgICEmOkAgICAgICAgICAgIAotTSAhJ0hAICAgICAgICAgICAgISg/QCAgICAgICAgICAgICEoTEAgICAgICAgICAgICAhKFZAICAgICAgIAotTSAgICAgISkhQCAgICAgICAgICAgICEpSkAgICAgICAgICAgICAhKjBAICAgICAgICAgICAgISpFKCAgIAotTSAgICAgICAgICEqWSggICAgICAgICAgICAhKzYoICAgICAgICAgICAgIStIISAgICAgICApPEAgICErTAotTTkgICAgICAgKTxAICAgICAxICNfX1AgICk8QCAgIStTISAgICAgICApPEAgICErXSEgICAgICAgKUQgIAotTSAhLCQhICAgICAgIClIQCAgISwuISAgICAgICApTEAgICEsNiEgICAgICAgKUxAICAhLDohICAgICAgIAotTSlNQCAgISxCISAgICAgICApTiAgICEsSyEgICAgICAgKU8gICAhLFMhICAgICAgIClPICAgISxcISAgIAotTSAgICAqVkAgICEtKyEgICAgICAgKlxAICAhLTMhICAgICAgICpdICAgIS1AISAgICAgICAqXSAgICEtSgotTSEgICAgICAgKzRAICAhLVMhICAgICAgIC03ICAgIS1cISAgICAgICAtOkAgICEuJiEgICAgICAgLVogIAotTSAhLiwhICAgICAgIC1aICAgIS41ISAgICAgICAuJyAgICEuPSEgICAgICAgLicgICAhLkEhICAgICAgIAotTS4oICAgIS5JISAgICAgICAuKCAgICEuTSEgICAgICAgLikgICAhLl0hICAgICAgIC4pICAgIS8hISAgIAotTSAgICAuKiAgICEvLyEgICAgICAgLiogICAhLzMhICAgICAgIC4rICAgIS87ISAgICAgICAuKyAgICEvPwotTSEgICAgICAgLiwgICAhL0ohICAgICAgIC4sICAgIS9OISAgICAgICAuLSAgICEvWyEgICAgICAgLi0gIAotTSAhL18hICAgICAgIC4uICAgITAmISAgICAgICAuMUAgICEwMSEgICAgICAgLjYgICAhMDshICAgICAgIAotTS43ICAgITBFISAgICAgICAuQUAgICEwUCEgICAgICAgLkMgICAhMFghICAgICAgIC5HICAgITEiISAgIAotTSAgICAvMEAgICExKiEgICAgICAgLzkgICAhMTMhICAgICAgIC8+ICAgITE8ISAgICAgICAzX0AgICExSQotTSEgICAgICAgM19AICAhMVEhICAgICAgIDQjQCAgITFaISAgICAgICA0KSAgICEyIyEgICAgICAgNCsgIAotTSAhMiohICAgICAgIDQ1QCAgITIzISAgICAgICA0SEAgICEyPCEgICAgICAgNEtAICAhMkghICAgICAgIAotTTgwQCAgITJRISAgICAgICA4MkAgICEyWiEgICAgICAgODVAICAhMyMhICAgICAgIDg5ICAgITMsISAgIAotTSAgICA4P0AgICEzNyEgICAgICAgOF1AICAhM0IhICAgICAgIDlCICAgITNRISAgICAgICA8VkAgICE0IAotTSEgICAgICAgPikgICAhNCohICAgICAgID4/QCAgITQ1ISAgICAgICA+SkAgICE0RCEgICAgICAgQCsgIAotTSAhNFMhICAgICAgIEInICAgITRfISAgICAgICBCSSAgICE1JiEgICAgICAgQkkgICAhNSohICAgICAgIAotTUJKICAgITUzISAgICAgICBCTyAgICE1PSEgICAgICAgQlMgICAhNUQhICAgICAgIEJTICAgITVIISAgIAotTSAgICBCVCAgICE1USEgICAgICAgQl0gICAhNVohICAgICAgIEJfQCAgITYjISAgICAgICBDISAgICE2KwotTSEgICAgICAgQycgICAhNjQhICAgICAgIEMuICAgITY9ISAgICAgICBDMEAgICE2RyEgICAgICAgQzQgIAotTSAhNlQhICAgICAgIEM0ICAgITcjISAgICAgICBDNCAgICE3LCEgICAgICAgQzQgICAhNzAhICAgICAgIAotTUM1ICAgITc5ISAgICAgICBDPkAgICE3QCEgICAgICAgQz5AICAhN0QhICAgICAgIEM/QCAgITdOISAgIAotTSAgICBDSiAgICE3VyEgICAgICAgQ0ogICAhOCAhICAgICAgIENKICAgITgkISAgICAgICBDSyAgICE4KAotTTkgICAgICAgQ0sgICAgICAxICNfX1AgIENLICAgITgvITAgI0ggICApRCAgICE4NSBQICAgICAgICAgIAotTSAhOD8hMCAlI0AgICgiICAgIThFITAgICAgICAoVjggICE4SyEwICM4QCAgKElAICAhOFchMCAmWEAgIAotTSlNQCAgITheIVAgJTxAICIgICAgICE5JyEwICQwICAgKTxAICAhOS8hMCAjSSAgIChJQCAgITk7ITAgIAotTSAgICAoSiAgICE5SCEwICAgICAgKEpYICAhOVwhMCAgICAgIChLUCAgIToyITAgICAgICAoTEggICE6QAotTSEwICAgICAgKE1AICAhOlUhMCAgICAgIChOOCAgITssITAgICAgICAoTzAgICE7OCEwICAgICAgKFAoIAotTSAhO0shMCAgICAgIChRICAgITwgITAgICAgICAoUVggICE8LSEwICAgICAgKFJQICAhPEEhMCAgICAgIAotTShTSCAgITxXITAgICAgICAoVEAgICE9JSEwICAgICAgKFU4ICAhPTQhMCAgICAgICk6WCAgIT08IjAgIAotTSAgICJMJSAgICE9RCIwICAgICAiTCUoICAhPVMiMCAgICAgIkwlMCAgIT4kIjAgICAgICJMJTggICE+LQotTSIwICAgICAiTCVAICAhPj0iMCAgICAgIkwlSCAgIT5PIjAgICAgICJMJVAgICE+ViIwICAgICAiTCYgIAotTSAhPyQiMCAgICAgIkwmMCAgIT80IjAgICAgICJMJkAgICE/PCIwICAgICAiTCZQICAhP0siMCAgICAgIgotTUwnICAgIT9cIjAgICAgICJMJzAgICFAJSIwICAgICAiTCdAICAhQC8iMCAgICAgIkwoICAgIUA9IjAgIAotTSAgICJMKCggICFAUiIwICAgICAiTCgwICAhQSkiMCAgICAgIkwoQCAgIUE4IjAgICAgICJMKFAgICFBTgotTSIwICAgICAiTCkgICAhQiYiMCAgICAgIkwpQCAgIUIzIjAgICAgICJMKiAgICFCRyIwICAgICAiTCpAIAotTSAhQl0iMCAgICAgIkwrICAgIUMrIjAgICAgICJMK0AgICFDQCIwICAgICAiTCwgICAhQ1ciMCAgICAgIgotTUwsQCAgIUQmIjAgICAgICJMLSAgICFENiIwICAgICAiTC4gICAhREYiMCAgICAgIkwuMCAgIURdIjAgIAotTSAgICJMLkAgICFFNiIwICAgICAiTC5QICAhRUciMCAgICAgIkwvICAgIUVfIjAgICAgICJMLzAgICFGOQotTSIwICAgICAiTC9AICAhRkgiMCAgICAgIkwvUCAgIUZeIjAgICAgICJMMCAgICFHNiIwICAgICAiTDAwIAotTSAhR0YiMCAgICAgIkwwQCAgIUddIjAgICAgICJMMFAgICFINiIwICAgICAiTDEgICAhSEciMCAgICAgIgotTUwxMCAgIUhZIjAgICAgICJMMUAgICFJIiIwICAgICAiTDFQICAhSS4iMCAgICAgIkwyICAgIUk5IjAgIAotTSAgICJMMjAgICFJQiIwICAgICAiTDJAICAhSUoiMCAgICAgIkwzICAgIUlSIjAgICAgICJMPCAgICFJWwotTSIwICAgICAiTDxAICAhSiUiMCAgICAgIkw9ICAgIUowIjAgICAgICJMPyAgICFKOyEwICAgICAgKTQgIAotTSAhSk4iMCAgICAgIkxAQCAgIUpdIVAgICAgICIgI0AgICFLLiFQICAgICAiICQgICAhS0AhMCAgICAgIAotTSk4ICAgIUtTIjAgICAgICJMQSAgICFMIiEwICY9ICAgKUhAICAhTCshMCAgICAgIClMWCAgIUwyITAgJgotTVkwICApPEAgICFMPiEwICI+ICAgKlxAICAhTEQhMCAlJkAgICpWQCAgIUxRITAgI0VAICApTyAgICFMWwotTSIwICdCMCAiTEFAICAhTSshMCAmSlAgICtQQCAgIU0zITAgKCcgICApTiAgICFNOiFQICdFUCAiICQwIAotTSAhTUEhMCAkVzAgICo+OCAgIU1KITAgIjlAICApXyAgICFNUyEwICM+MCAgLCFYICAhTVkhUCAlXkAgIgotTSBJMCAgIU4hITAgJjMgICApWTAgICFOKSEwICQ5ICAgKkgoICAhTjMhMCAgL0AgICo2KCAgIU49ITAgIAotTSAgICAuKDggICFORCEwICUpUCAgKlQgICAhTk4hMCAgICAgIC4nOCAgIU5VITAgJyxQICAtNyAgICFOXQotTSEwICYgMCAgKVA4ICAhTyUhMCAlOjAgIC1SICAgIU8tIjAgIyggICJKWlAgICFPMyFQICM8QCAiICRQIAotTSAhTz4hMCAkNTAgICpeQCAgIU9IIVAgJkBQICIgJUAgICFPWiFQICU1MCAiICYgICAhUCEhUCAmSjAgIgotTSAmMCAgIVAqIVAgI1JQICIgJVAgICFQOyFQICM/QCAiICUwICAhUEwhUCAmO1AgIiAlICAgIVBfITAgJwotTVVQICAtWiAgICFRJyEwICMuICAgKl0gICAhUTMhMCAlSSAgIC43ICAgIVE8ITAgJCowICAuQyAgICFRRAotTSEwICJMQCAgLkFAICAhUU4iMCAjSiAgIkxBUCAgIVFcIVAgIytAICIgSVAgICFSIiEwICYtUCAgLDhIIAotTSAhUishMCAjUDAgIC4uICAgIVIxITAgICAgICAuKjggICFSPiEwICZcMCAgLzBAICAhUkUhUCAjUEAgIgotTSArQCAgIVJOIVAgIzMwICIgJyAgICFSWiFQICcsQCAiICsgICAhUyEhUCAiSEAgIiArMCAgIVMqITAgIAotTSAgICAuKzggICFTMSEwICQ/QCAgLTpAICAhUzshMCAgICAgIC4pOCAgIVNKITAgIkhQICAtQ1AgICFTWAotTSEwICQ1UCAgLU0oICAhVCQhMCAlOlAgIC85ICAgIVQsIjAgJz9QICJMQiAgICFUNiEwICAgICAgLi04IAotTSAhVEIhMCAnPiAgIC4xQCAgIVRNITAgI0hQICAuNjggICFUViEwICAgICAgLiw4ICAhVSAiMCAgICAgIgotTUxUUCAgIVUlIVAgIC8wICIhMVAgICFVLCEwICAqMCAgLkcgICAhVTQhMCAkVTAgIC5LQCAgIVU/ITAgIgotTT9AICAvPiAgICFVSCIwICNeQCAiTEogICAhVVEhUCAoPlAgIiE9MCAgIVVbITAgJz5QICAzX0AgICFWIgotTSEwICZeUCAgLzxQICAhVikhMCAjPDAgIDQrICAgIVYvITAgIDVAICA4NUAgICFWNyFQICJRUCAiIT1QIAotTSAhVkAhMCAmVCAgIDRIQCAgIVZIITAgJyMgICA0I0AgICFWUCEwICEmQCAgQjQ4ICAhVlshMCAoQiAgIAotTThMWCAgIVclITAgICJAICA4MEAgICFXLSEwICU0ICAgN0M4ICAhVzkhMCAjXyAgIDMuSCAgIVdEITAgIAotTSkgICA0KSAgICFXTCEwICVRUCAgPikgICAhV14hMCAhRkAgIEJDUCAgIVgpITAgIDpAICA5OlggICFYMwotTSEwICBGQCAgQicgICAhWD4hMCAoIiAgIDg/QCAgIVhIITAgIiUwICAzR1ggICFYUSBQICQ2XiAgICAgIAotTSAhWFshMCAmXCAgIDQ+QCAgIVkkITAgJihAICA0QyggICFZLSEwICVRMCAgNEYoICAhWTYhMCAoITAgIAotTTRHQCAgIVk/IjAgJFNAICJMSjAgICFZTCEwICU+ICAgNDtAICAhWVYhMCAmTTAgIDQ9ICAgIVlfITAgJQotTVUwICA0QCAgICFaKCEwICcoQCAgNDcgICAhWjEhMCAmJUAgIDRESCAgIVo6ITAgJlZAICA0QUAgICFaQwotTSEwICVNUCAgNDVAICAhWkwhMCAlUCAgIDQ6ICAgIVpVITAgJklAICA0OEAgICFaXiEwICAgICAgQkk4IAotTSAhWyQhUCAnQkAgIiIkMCAgIVsrITAgJVAwICA1USAgICFbPCIwICFZMCAiTEsgICAhW0chMCAiXyAgIAotTTdEMCAgIVtUITAgKEcgICBCXSAgICFbXCIwICdPUCAiTEwgICAhXCYhMCAlUVAgIDRLQCAgIVwxITAgIAotTTUwICA4OSAgICFcOSEwICY+MCAgOCkoICAhXEchMCAgNlAgIDVXKCAgIVxaITAgJllQICBCVCAgICFdIgotTSIwICVcMCAiTE0gICAhXSwhMCAgJEAgIDgyQCAgIV00ITAgICAgICBCUzggICFdOiEwICgxMCAgNlk4IAotTSAhXUYhMCAgKDAgIEJfQCAgIV1OIVAgJlogICIhTjAgICFdXiFQICNVICAiIVAgICAhXikhMCAmOCAgIAotTUMnICAgIV4xIVAgIjcgICIiICggICFeOiEwICBTUCAgQzBAICAhXkMiMCAgSEAgIkxTUCAgIV5RIjAgJwotTT0gICJMVCAgICFfKCIwICBIMCAiTFQwICAhX0AiMCAjRCAgIkxUQCAgIV9XITAgJEVAICA8RTggICIgKgotTSEwICM9QCAgOT9YICAiIDAhMCAmTiAgIDhdQCAgIiA3ITAgKEIgICA5UyAgICIgUiEwICU3MCAgPys4IAotTSAiISkhMCAnXiAgIDlCICAgIiE4ITAgJEggICBAMyggICIhUCEwICY0QCAgOi4oICAiIiwhMCAjVFAgIAotTTxWQCAgIiI7ITAgIDFAICBCTyAgICIiRCEwICEzICAgQC0oICAiIlUhMCAmICAgID9ISCAgIiMtITAgJwotTSggICBALlggICIjRSEwICVQUCAgPTdAICAiI1UhMCAkNlAgID0sICAgIiQkITAgJUcgICA8TTAgICIkOgotTSEwICdPICAgOltIICAiJFAhMCAmQyAgID9cSCAgIiUsITAgIFhQICA9VDAgICIlPyEwICZXUCAgPUooIAotTSAiJVEhMCAkLiAgID0zSCAgIiYgITAgIkcgICA9KkggICImMyEwICclMCAgPj9AICAiJjohMCAiKiAgIAotTT4sWCAgIiZVITAgIFkgICA+NEAgICInMCEwICFBMCAgPkQgICAiJ0YhMCAhOCAgID5GUCAgIidcITAgIAotTTIgICA+QFAgICIoLiEwICA3ICAgPkpAICAiKD0hMCAjMDAgID85QCAgIihRITAgJiowICA/JUggICIpJwotTSEwICgrUCAgP0AwICAiKUIhMCAjJyAgID8xOCAgIilWITAgJiEgICA+XTAgICIqLCEwICUrICAgPlVIIAotTSAiKkAhMCAlRSAgID5NWCAgIipOITAgIS4gICA+WjggICIrISEwICMhQCAgPlZYICAiKzUhMCAmKkAgIAotTT5SICAgIitFITAgJF8gICA+TlggICIrUyEwICVPICAgP1UgICAiLCQhMCAoJiAgIEJKICAgIiwsIVAgJwotTVlAICIsKyAgICIsSyFQICNKICAiQkFIICAiLSwhUCAnOCAgIj1EMCAgIi1MIVAgKDxAICIsKSAgICIuIwotTSFQICVYICAiQjYoICAiLjwhUCAoPyAgIj1DQCAgIi5UIVAgIU1AICIiVTggICIvJSFQICRSQCAiPUlQIAotTSAiLzghUCAjSEAgIj1CWCAgIi9KIVAgJlNAICIiVTAgICIvXyFQICdbQCAiPUlIICAiMDYhUCAlLSAgIgotTT1CUCAgIjBMITAgI1gwICBAKyAgICIxJCEwICZWICAgQyEgICAiMSshUCAoRVAgIj1AQCAgIjFCIVAgJgotTSEwICJIPTggICIxWyFQICAgUCAiPUc4ICAiMjMhUCAhVlAgIiwtICAgIjJEIVAgJFtQICJCTSggICIyVwotTSFQICNRUCAiPUUgICAiMykhUCAmXFAgIiwsWCAgIjM+IVAgKCRQICJCTSAgICIzVSFQICU2MCAiPURYIAotTSAiNCshMCAnSEAgIEMuICAgIjQzITAgICAgICBDPlggICI0OSEwICdOICAgQzUgICAiNEEhMCAgICAgIAotTUM0OCAgIjRJITAgIztAICBDP0AgICI0UiFQICVQQCAiSEgwICAiNF8hMCAgICAgIENKOCAgIjUnIVAgIgotTUZAICJIXyAgICI1MSEwICAgICAiICAgICAiNTghUCAgICAgIkpaUCAgIjU/IjAgICAgICJMVFAgICI1RQotTStWUUk4Ql1DPEcwUCtGXCArVlFJOEJdLThXKVQsMllPICY9RDhGVUUrRlwgOVYtQyxFXUM7VlVQOjZRRQotTTkiWCArVi1ZOVZFTj0iXVA7JiVZK1Y5TjlCXUQ5NzlPK1Y9RDhHMUU8VzBPPSMkUCtQIUc5JilNOTJZQwotTSAmRU49I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUgotTS5TIFssMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVwotTS5QIVU7Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWgotTT0jNF08QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTgotTTlSIUw7VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXQotTTxDJFssI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUQotTS5QIVM6Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWgotTT0jJFEvNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUQotTS5TQFssI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUwotTT0nKVU4VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQgotTTk3KFotQlBRLUJQUS1DTTwgJzk/OjZZVDdWVUU7NilFPENIUSsjLFIrIyxSLlc5PzsmXU45VV1NOTZVQgotTTk3KFosUlBWLSJQUyxDTTwgJzk/OUZRTzg3MT87NjVNOEY1Ui5DJFIrI0RWKyMsUi5XOT85Jl1VOEZRRQotTTdWVUU7NilFPENIUSxSUFEsQ0BMLUMwWy5QIVQ3VzVOOjZdTi5FMFEtU1VVLic5PzhWQUE8RV1NOTZVQgotTTk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaLUJQUCsjJFYuVVAgPUVdSTtHMT87NjVNOEY1UgotTS5DJEwsIlBTLENNVjdWUU87Rj0/OzY1TThGNVIuQyxMLCJQUyxDTTwgJzk/OUZRTzg3MT87NjVNOEY1UgotTS5DJFIrIyBMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSLkMkUysjIEwtQzBbLlAhVjdWLUg4Nyk/OUc1TgotTThTSSYsQCFWN1ctSTlWWUU5JV1DOiYlUjdWOVU7RixaMUMkUCAnOT89NllTOjY9Tjk2MT84VkFBPEVdRgotTT02WUMuRDhRLDAhVjdXLUg7VylUN1Y5VTtGLFoxQzggPUVdUzo2PU45NjE/PFZBTzxHMT85RzVOOFNJJgotTS1AIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RixaMUNAID1FXUk7RzE/OUc1TjhTSSYsMCFWN1ctSQotTTlWWUU5JV1JO0cxPzlHNU44U0kmLDAhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQy5EOFQgJzk/OyZdTgotTTlVXUY9NllDLkQ4UyAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhTSSYsUCFWN1c1TjxWRUc7RjVEN1ZRTwotTTtGPT85RzVOOFNJJi0wIVY3VjlMO1YlVDdWOVU7RixaMUMkUiAnOT85Jl1VOEZRRTdWOVU7RixaMUMkUwotTSAmUUk7RkxaNSMkWC83LFEtMylOOTdBVC5DJFkvMkhRLiJQUCsjLFIuVlFJO0ZNRj02WUMuQyhQLzJIUgotTSwzVUYsM0RMLFMoTCxTKFs3ICFTPSc1RjlDSFIsQ1VBPEMkWywjTFAuUyhTLzYlUiwzTFAuUyRbLEMwXQotTTg3KFEuUyBbLENMUS1CUFYtIlBRLDM0Ui5TTCA9JzU/OyZFTjpTSTQsQzRdPTMkVC0mWUU+JzBaLDNETAotTSwiUFMsQ01MOjZZSzlHNU44U0hSLCJQUCsjLFIuVVAgPFcxVTlGOFosQyhMLCJQUSwzNFIuU0wgOFZdTAotTTtXKVMuRTBSLUNVRT42NUw7Jl1XLkMgTDwnNVI8JlFFLkMkTDwmRU46U0hSKyNMIDhWJVI8U0k0LEM8XQotTTk2KU09U0hQKychTzxHLUM6JjRaLDJQWyAmKU87VlFFODZYWj0jKFgvNjUmMDRRMzEzSFArJTEyNTQ0WgotTSwyUFsgJilWODZRUy5FMFIuM1VFOUYlTDxWNFosIlFUPEc1RS5DJEwuUCFCO1ZdTDk2JU4sQ0lULENEIAotTTs2RVM7VylEOTcpRTkjSTQsUyBdOTcxVztTSFIrJl1OOTNIUSsnSUU8RlxaLCJRVDonKUU5M0hTKyNMIAotTTs2JUk7Q0kmLDAhVjdWLUg4NyhaMVMoID1FXVM6Nj1OOTYxPzhWQUE8Q0knLDMgID1FXVU7Ry1JOVZZRQotTTklXUM6JiVSLkQ8USwwIVY3Vy1IO1cpVC5EPFYgJzk/PFZFRztGNUQ3Vy1IO1cpVC5EPFYgJzk/PTZZUwotTTo2PU45NjE/PFZBTzxHMFoxU0AgPUVdSTtHMFoxUyQgPUVdUzo2PU45NjE/OjZZVC5EPFEgJzk/PTZZUwotTTo2PU45NjE/OjZZVC5EPFQgJzk/OyZdTjlTSScsUCFWN1ctSTlWWUU5JV1MO1ZZRy5EPFMgJzk/PTZZUwotTTo2PU45NjE/OyZdTjlTSSctMCFWN1Y5TDtWJVQuRDxRLEAhVjdWMU89NilMOTNJJywzLCA9RV1DOiYlUgotTTdWJVI8RiVZLkQ8UywzVUE8QyRbLCNMUS5TKCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+M0knLFMoXQotTTg3KFEuUyBbLDNMUSwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0RaMVMsUy82JVIsM0xQLlMkWwotTSwzJCA9RV1TOiZdUj0lXUE8RylBPjNJJyxTMF04NyhRLlMgWywzTFYgJzk/PFZFRztGNUQ3Vy1IO1cpVAotTTdWJVI8RiVZLkQ8Uy0gIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZLkQ8Uy0zVUE8QyRbLCNMUQotTS5TQCA9RV1JO0cxPzg3KVI4N0RaMVMsVi82JVIsM0xQLlMkWywwIVY3Vy1JOVZZRTklXUk7RzE/ODcpUgotTTg3RFoxUyxWICc5Pz02WVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWS5EPFMtU1VBPEMkWywjTFEuUzAgPUVdTAotTTtWWUc3ViVSPEYlWS5EPFMuI1VBPEMkWywjTFEuUywgPUVdUzo2PU45NjE/OyZdTjlVXUE8RylBPjNJJwotTSxTQCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZLkQ8Uy4zVUE8QyRbLCNMUS5TNCA9RV1GOyZdQQotTT0lXUE8RylBPjNJJy0jIF04NyhRLlMgWywzTFEsQCFWN1YxTz02KUw5NV1BPEcpQT4zSSctIyRdODcoUQotTS5TIFssM0xRLFAhVjdWLUg4Nyk/PCZdSTtHMUU8Q0knLSMoXSpDKCA9RV1TOjY9Tjk2MT84VkFBPEVdUAotTTtWRU49JjVSLkQ8VCxTVEosMyAgPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KFoxUzBULzJIUQotTSwwIVY3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUvMkhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVAotTTk3KFoxUzBVICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8Q0knLSM4XSpDQCA9RV1JO0cxPwotTTwmXUk7RzFFPENJJy0jPF0qQyQgPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoWjFTMFcgJzk/PTZZUwotTTo2PU45NjE/OjZZVDdXIU86NllUOTcoWjFTMFgvMkhUICc5PzsmXU45VV1QO1ZFTj0mNVIuRDxULjNUSgotTSxQIVY3Vy1JOVZZRTklXUw7VllHN1chTzo2WVQ5NyhaMVMwWSAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUAotTTtWRU49JjVSLkQ8VSwjVEotMCFWN1Y5TDtWJVQ3VyFPOjZZVDk3KFoxUzRRLzJIUSxAIVY3VjFPPTYpTAotTTk1XVA7VkVOPSY1Ui5EPFUsQ1RKLDMsID1FXVM9JylVOFcwUS5EPFEtQCFWN1ctVDxHNUM9IyhaMVM0UwotTS83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFotQlBRLUJQUQotTS1DTTwgJzk/OjZZVDdWVUU7NilFPENIUSsjLFIrIyxSLlc5PzsmXU45VV1NOTZVQjk3KFosUlBWLSJQUwotTSxDTTwgJzk/OUZRTzg3MT87NjVNOEY1Ui5DJFIrI0RWKyMsUi5XOT85Jl1VOEZRRTdWVUU7NilFPENIUQotTSxSUFEsQ0BMLUMwWy5QIVY3VzVOOjZdTi5EPFEtUCFWN1c1Tjo2XU4sQ0knLTMwXT0zQVY3Vi1IODcpPwotTTs2NU04RjVSLkMoTCwiUFguVzk/PFZBTzxHMT87NjVNOEY1Ui5DOEwsIlBRLUNNPCAnOT86NllUN1ZVRQotTTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUU7NilFPENIUysjIEwsUyhbNyAhVjdWOUw7ViVUN1ZVRQotTTs2KUU8Q0hRLEJQUCsjLFIuVzk/OSZdVThGUUU3VlVFOzYpRTxDSFEsUlBQKyM4VC5TTCA8VV1MOjZZSwotTS5EPFEuMCFVN1ZRSTtGTFoxUyhVICchUjo2VUE8R0RaMVM0VS82NVI5NjBaLCJRRzxGNUU7Q0hRKyYpTAotTT02NFosQlBbICZZTztHIVI6NlVBPEdEWjFTKFYgJi1MPTZZSzk3KFoxUzRWLzY1QzomNVY+M0hQKyY5TwotTTxGMFosMlBbICctUDtXKVQ8Vi1BPENJJyxDPCA3VV1NODZFTitGXCA5Vi1DLEVdQztWVVA6NlFFOSJYIAotTStXLUU7RjFBOjJdQThGLE88RkVDOiJdTDg3MUU8VzBPO1YpSjkmRVIrNy1VO0MsTzlWLUMrUCBOK0JcTgotTStCXUQ5NzlPK1Y9QzhSXUw6NilHOFYsUitGLCA6NllULkcwUS83KFEuUlRSLDMwVy0jQFMtQzBYLlMoUQotTS0jPFQuIyxWLSM8WyAmLUg4NyhaPSMoXTxDKFssI0xRLEM8WyAmUU87RjxAOjZZVC5HMFMvNyhRLlJUUgotTSwzMFctI0BTLUMwWC5TKFEtIzxULiMsVi0jPFsgJzVOPFZFRztGNUQoJkVOPSNJVC0jVVIsM0xQLlJUUQotTS5QIUw7VllHKCc1TjxWRUc7RjVEKCZFTj0jSVQtM1VSLDNMUC5SVFEuUCFTOiZdUj0iIUk7RzBaPSM4XQotTTxDJFsrMyxSLVM4WC5TLFItUzhXLlAhTDtWWUcoJlFPO0Y8QDo2WVQuRzBXLzcoUS5TIFsrMyRbICctSAotTTtXKVQoJzVOPFZFRztGNUQoJkVOPSNJVC4jVVIsM0xQLlM4VS0zLFUuUCFMO1ZZRygmUU87RjxAPTZZUwotTTo2PU45NjBAOjZZVC5HMFkvNyhRLlMgWyszJFsgJy1JOVZZRTkiIUM6JiVSLkcwUSwjVVIsM0xNLDMoWAotTS5TJFItU0wgPTZZUzo2PU45NjBAOFZBQTxDSVQsMyRdPEMkWywjTFItMzRbICY5TDtWJVQuRzBRLENVUgotTSwzTFQuUyBbICYxTz02KUw5M0lULDMsXTxDJFsuI0xQLlAhTDtWWUcoJjFPPTYpTDkzSVQsMzBdPEMkWwotTS4jTFAuUCFWO1ZFRC5HMFEtM1RRLTAhUjk2PT84VlFBPFcsWjUjJFYvNjUuM1VdMjE0PTMuQyBMMyRdPwotTTFFISE3VSklMVUsWiwyUSY0JCU/NEQ1JzRTSFIrJDkwN1UpJTFVLFosUlE8ICQ5MDdUXTI3VDkwMDVdMgotTTE0PTMuQzBMMSQlNDA1XTIxND0zLkM0TDEkJTQwNV0vNEVdJjQkJT80RDUnNFNIViskMSE1JCU/M1UpPwotTTFFIT80RDUnNFNIVyslUCAxJCU0MDVdLzRFXSY0JV0vNEVdJjQkJT80RDUnNFNIWCskJSQxJSk/NEQ1JwotTTRTSFkrJD0lM0Q1MjA0UT80RDUnNFNIUSwiUScxNFklNEQlLDdUXTI3VDkwMDVdMjE0PTMuQyRRKyVQIAotTTFUNS4xNSkhMyVdLzRFXSY0JV0yMTQ9My5DJFIrJCUsMyVdMjE0PTMuQyRTKyRRKTM1XTIxND0/MFRRIQotTTRVLSU0U0hRLSJQWyAnIVQ8RjFJOUY5Pz0jSVQsMCFTOjdJRTdXMFo9IyQgPVYtSDg3KT89I0lULiAhTAotTTtWWUc7Jl1OOVNJNCwzPF08U0FIOjY9SC5DLEwsIlBTLENNTDtXPFosUlBTLEJQUyxDTFsgJlFPO0Y9PwotTTsmXU45U0lULDNAXT0zQVMuQyRXKyMgTC1DMFs7JlBaLVJQUCsjOFQuU0wgOUc1TjhVXVA9JyhaPSMkWQotTS8ySFIsI1VGLDM0IDdVXUQ7VV1HOyZdQjg2UT85JzFPPEcsWjFDJFUgJV1FPiZFVDdWMVU7NlVZN1cpRQotTTlDSScsQyRdKkMkIDdVXUQ7VV1HOyZdQjg2UT84VzFPPEcsWjFDJFUgJV1JO0ZFVDo2JUw6N0lFOSJYUAotTSAlXT87NiVJO0NJJiwzNCA3VjVYOjcwTjtQIUc4VixSN1YtTzs3IUk7JjVEK0AgTzxWNU45JiVJK1YlQgotTThSXVI6Ni1IK1ZRQT0mNVM9Il1POEZJRDo3KE08VzVOLFJdRzhWLE8gIlhOK1JYTitWMUU9RlxPOVYtQwotTStWUUk4Rj1DOFMoTjhQIUk7RzBaPSMkXTxDJFsrMyhRLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMIAotTThWQUE8Q0lULENVUixDTFAuUyRSLVNMIDsmXU45UiFJO0cwWj0jLF08QyRbKzMoUS0jPFQuIyxWLSNAWwotTSxDJFQtUzBYLFM4VC1TTCA9NllTOjY9Tjk2MEA6NllULkcwVC83KFEuUyBbKzMkWyAmUU87RjxAPTZZUwotTTo2PU45NjBAOjZZVC5HMFUvNyhRLlMgWyszJFsgJy1IO1cpVCgmRU49I0lULUNVUiwzTE0sUyhXLUNAWwotTSxTKFctQzxbICZRTztGPEA7Jl1OOVIhSTtHMFo9IzxdPEMkWywjTE0sM0wgPFZBTzxHMEA9NllTOjY9TgotTTk2MEA6NllULkcwWC83KFEuUyBbLUM0VSxTNFsgJlFPO0Y8QDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWgotTT0jRF08QyRbLCNMTSwzTCA8VkVHO0Y1RCgmLUg4NyhaPSMkUC83KFEuUlRRLENAWywzKFcuUCFVO0ctSQotTTlWWUU5IiFDOiYlUi5HMFEsM1VSLDNMUC5TKFUtM0wgOUZRTzg3MFo9IyRSLzcoUS5TMFssI0wgOSZdVQotTThGUUUuRzBRLFNVUiwzTFguUyBbICZRTztGPEA5Jl1VOEZRRS5HMFEtI1VSLDNMWC5TIFsgJzlPOjYwWgotTT0jJFUvMyRVICcpRTlVXUM7JiVTPFNJNCwzOF05NFkvN1UpJTFVLFosIlEsM1VdJjQkJT80RDUnNFNIUQotTSskOTAwNV0yMTQ9My5DKEwxRSE/NEQ1JzRTSFMrJVAgMUUhPzNVKT8xRSEhN1UpJTFVLFotIlEkMDUxIQotTTdVKSUxVSxaLTJRJDA1MSE3VF0yN1Q5MDA1XTIxND0zLkM4TDEkJTQwNV0vNEVdJjQlXTIxND0zLkM8TAotTTcgISQwNTEhN1RdMjdUOTA3VF0yN1Q5MDA1XTIxND0zLkNATDA0MSQ0RV0yMTQ9My5DREwxVDUuMTUpIQotTTMlXTIxND0zLkMkUCskPSUzRDUyMDRRPzNVKT8xRSEhN1UpJTFVLFosMyRMNyAhJzE0WSU0RCUsN1RdMgotTTdUOTA3VSklMVUsWiwzKEwwNFEsN1UpJTFVLFosMyxMMyRFLTdVKSUxVV0jMyQlMzRUNTMuQyRUKyNMIAotTTwnMVI5JkVGOUVdVC5HMFEgJy1JPkY1Pz0jSVQsMCFXOFZBQTxFXVQuRzBYICZRTztGPUw7VllHLkUwUQotTS1TVVMuJkFJOVZAWixSUFArIyxSLlZRTz1TSFMrIyxSKyMsUi5TTCA7Jl1OOVVdTDtWWUcuRzBRLiNVVQotTS4nLFosMzxMLCJQVi0jTUw7I0hXKyMgTC1DMFsuUCFGPTZZQzdXIVQ8Q0lULDNEXSpDKFAvNjhRLTAhPwotTTk3QUk9JV1EPTZVTT41XUQ5Ni1MLkQ8USAlXT8wVTEvNEVdLDI1LTQ3VVxaMVMoUS82JVIsM0xQLlMkWwotTSwzRCA3VV0kNSRdMjdUUSk0VTE/N1NJJyxDJCArNlFHICZRSThGPE48UCEtPFc9ST0mLUgrRlwgOTdBSQotTT0iWU8gJl1ON1Y1WDo3ME47UCFXPEZFVDkyWU8gJjVSPEAhPzk3QUk9IllPICYtRTxHKU88QllPICY1UgotTTxGWU8rRlwgOUZRUzhHNUYrRlwgOUZRTzg3MT88Vz1JPSYtSCtGXCAzNkVOOjcwTjtQIUY8JV1HOyZdQgotTTg2UVMrRlwgOzZFTjo3MUY8IllPICZVQTsmUU84UllPICZFUzg3MVQ+MllPICY5STtGMUk7VyBOO1AhSQotTTtWKE47UCFTOjY9Vjk2LE47UCFDOyZdUzkyWU8gJjVSPEAhRjxXMUE9IllPICY1UjxAIUc5NzFEPSYlQgotTTsmNVM6N0lFK0ZcIDk3KVIgJj1FPSchQTlWNVM6N0lFK0ZcIDk3KVIgJkVPOFcxTCtGXCA5NylSICctSQotTTlWKUw7Vi1LK0ZcIDk3KVIgJy1JOVctRT0mVUE8VkxOO1AhRTxHKCA8VilSOlJZTyAnLUk5VzFSODZVUAotTStGXCA3Vy1JOVc5RThSWU8gJjlQPEZFTj0mOE47UCEtOSY1Rjg3NUw9IllPICZVQS4zLU4rRlwgOUchPwotTTxWJVY5MllPICYpQztXIVkrRlwgOFYlTDsmXUMrRlwgOSZdUDxGWVQrRlwgOUchPzhWXU07Nl1OPFJZTwotTSAmKVo5NylPK0ZcIDs2NU08VjVUK0ZcIDxXMVI7JjVOK0ZcIDg3MU86MllPICYtVD43IUU3UllPICZVRQotTTs2LUg8QllPICctRT0mUU84ViVMOTJZTyAnLVQ8Ri1IPEJZTyAnLVQ8Ri1NPCJZTyAnLVQ8Ry1QO0JZTwotTSAnLVQ8RzFPOlJZTyAmNUM7VllWOTcpVCtGXCA5Vi1PO0c5RTxHME47UCFEO1c1QjsmNT85JjVDOjZUTgotTTtQIT89NllQODYtSzdWMUI7JjROO1AhPzhGJVM5NV0zK0ZcIDdWKUE8VjU/OjZQTjtQIT88VyFSOjZZVAotTTlFXVM9NyBOO1AhPz0mRU05Ny0/PCZdVzk3KE47UCFROTYtTztHOUU8RzBOO1AhUjk2JUQrRlwgOTcpUgotTSAnIVI6NllUOUJZTyAnLVA8RkVOPSY4TjtQIU88JjVOK0ZcIDk3KVIgJlVFOzYtUD4yWU8gJy1UPEYtQQotTT0iWU8gJy1UPEYtUD4yWU8gJiVCO1cpVCtGXCA5VjVUOTZZVitGXCA8JjVSPEZdUitGXCA8VzFSPCYpUgotTTpSWU8gJV1COjY9PzwmXVc5NyhOO1AhPzxWVUE7JlE/PCZdVzk3KE47UCFHOTcxUDo2ME47UCFFPEcoIAotTTxWRUc7RiVMK0ZcIDpWRUw7IllPICY1UjxAIT88JjVSPEZdUitGXCA5NylSOyctVCtGXCA9VylJPSY1VgotTStGXCA5NylSICJVTDlQIUw6NilHK0csIDdWNVg6NzAgN1VdJDY0WSEzNEUjICctVDg3KVQgJV1NODZFTgotTSAnLVQ4NylUN1Y5TDtWJVQgJV0/OTdBST0gIT85NllWOjcpTztAIS08Vz1JPSYtSCAmOFYuI0BYLDVdVQotTTxWNUQgJV1WN1YtSDg3KT85RzVOOFAhPz1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAlXVY3VzVOPFZFRwotTTtGNUQ3Vi1IODcpPzlHNU44UCE/PUVdUzomXVI9JV1GPTZZQyAlXVY3Vy1JOVZZRTklXVM6Jl1SPSVdRgotTT02WUMgJV1WN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIDdXOT86NllUN1Y5VTtGLCA3Vzk/PFZFRwotTTtGNUQ3VkVOPSVdRj02WUMgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDICVdVjdWUU87Rj0/OUc1TgotTThQIT89RV1TOjY9Tjk2MT87Jl1OOVVdRj02WUMgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAhPwotTT1FXUY7Jl1BPSVdRj02WUMgJV1WN1YxTz02KUw5NV1GPTZZQyAlXT83VlVBOjZYIDdXOT84VkFBPEAhPwotTT1FXVM6Nj1OOTYxPzhWQUE8QCE/PUVdVTtHLUk5VllFOSVdQzomJVIgJV1WN1ctSDtXKVQgJV1WN1ctSQotTTlWWUU5JV1TOiZdUj0gIT89RV1VO0ctSTlWWUU5JV1TOiZdUj0gIT89RV1JO0cwIDdXOT88VkVHO0Y1RAotTTdWRU49ICE/PUVdVTtHLUk5VllFOSVdSTtHMCA3Vzk/OyZdTjlQIT89RV1TOjY9Tjk2MT87Jl1OOVAhPwotTT1FXVU7Ry1JOVZZRTklXUw7VllHICVdVjdWOUw7ViVUICVdVjdWMU89NilMOTAhPz1FXUM6JiVSN1YlUgotTTxGJVkgJV1WN1ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUgotTTg3RCA3Vzk/PFZBTzxHMT84NylSODdEIDdXOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJV1WN1c1TgotTTxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXVY3VkVOPSVdQTxHKUE+MCE/PUVdUzo2PU45NjE/OjZZVAotTTdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT89RV1MO1ZZRzdWJVI8RiVZICVdVgotTTdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgN1c5PwotTTlGUU84NzE/ODcpUjg3RCA3Vzk/OSZdVThGUUU3ViVSPEYlWSAlXVY3Vi1IODcpPzwmXUk7RzFFPEAhPwotTT1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRQotTTxAIT89RV1TOiZdUj0lXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICVdVgotTTdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggN1c5Pzo2WVQ3VyFPOjZZVDk3KCA3Vzk/PFZFRwotTTtGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJV1WN1ZRTwotTTtGPT88Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RAotTTdWUU87Rj0/PCZdSTtHMUU8QCE/PUVdRjsmXUE9JV1QO1ZFTj0mNVIgJV1WN1YxTz02KUw5NV1QO1ZFTgotTT0mNVIgJV1QPEZFTTg3KVkgJV1OO1ZZUDxGRU04NylZICVdUzwmXVI9Jy1DODcoIDdWLUw9NllLOTcoIAotTTdXLT87JkVOOlAhPz01XUw6NllLICVdVjdXNU46Nl1OICVdVjdXNU46Nl1OLEAhPz1FXVM9JylVOFcwUQotTSAlXVY3Vy1UPEc1Qz0jKCA3VV0/OSZdPzlWUU84RiVMN1YxVDtXKVMgJV0/N1QxNDNVKT8zJEUzNSVdPwotTSAlXT85N0FJPSVdRD02VU0+NV1SOTY4IDdVXUU+JkVUN1YxVTs2VVk3VjFFOFZQIDdVXT85Jl0/OVZRTwotTThGJUw3Vi1UO1cpUyAlXT83VC00M1UpPzMkRTM1JV0/ICVdTztFXUU+JkVUICVdVzxGRVQ5MCE/OzctVwotTTo3MUM6JjlQN1AhLTo2WUk9ICFGOyZdQT0lXVM9VkVUOFZAIDdVXUM7JjVBO0c1UCAlXT85N0FJPSVdSAotTTg2WUQ7JjVSPFAhPzs2JUw7Jl1DICYtRTxHKU88QCE/OTcpUjtGXCA3VV1XPEcxQzomTCA3VV1GOyctQgotTT02OCA3VjlSOTY0IDdVXVM7NilVOUAhPzlGOUw9Ny1IICVdPzlGRU45JilVOUAhPzdXQUY7Jy1CPTY4IAotTTdWOVM9JiVUICVdPzhHNUY8V0VOOFAhPzhWUU88VjQgN1ZFUzg3MVQ+MCE/OUYtTDtXLUUgJV0/OUc9QQotTTsmTCA1RlFJPFcwIDdWOVA3Vy1XOjcxQzogIT87NkVOOjcxRjwlXCA3VjlQN1ctVDg3MUU3VlVDLUNAWAotTS4jJCA3VDlNO1YxRSAlXSY8VzFBPSc1UyAlXUY8JV1TPSYlVDk1XVM9NllGPCYkIDdWOVA3Vy1UODcxRQotTTdXLUs+NjlGPCAhPzlHIT88VzFBPSY1PzxWXUY9Jz1BPEY0IDdXLUk5VzlFOFAhPzE0VTQ0VyFFOFZFQQotTTsgIT85RyFSOjZZVDlAIT87NiRZLFZZPyAlXS05JjVGODc1TD0gIT8xNFU0NFZFRztGJUw7JjVEICVdPwotTTo2XUIgJV1SOTYlTDsmXUMgJV1TOEcpSyAlXUc5NzFQODY9RTxWRVo5MCE/OEYtTzwnRCA3VV1VOEZdVQotTTtGMCA3VV0/OzYlTDsmRU45RlwgN1VdUjtWXVQgJV0/OyYpTz02WUQgJV1JO1YtVDsgIT83VjlJO0YxSQotTTtXICA3Vj1FPSYxVDg2KUw5Ny1JPkY0IDdVXUY3VlVPPEY1Rjo2UUU8UCE/OUVdUDxGNUE7JlFPOFAhPwotTThWJUw7Jl1DICVdPzxWRUc5RzVOOFAhPzxWRUc8VjVUOzYlUzpQIT83Vy1JOVcxUjg2VVAgJV0/PFZFRwotTT1GNUMgJV1TOjY9QjsmXUM6UCE/OTZZRCAmLVU8RilSOlAhRjwlXVM4NzlFICY5UDdXKUU8VzFPPEY0IAotTTdVXUQ7VyFSO0cwIDdVXVM6V0U/OUYwIDdVXVM6V0VCODctRSAlXUI+RjVSO1AhPzhWOVI5NjQgN1YlVAotTTtWRCA3Vy1UPEctUDtAIT83Vi1UPjchRTdQIT87NjVNOFZBUiAlXU05NlVTOTcwIDdXJUY4Vl1OPUY1UgotTT0gIT85Ri1PO0c5RTxHMCA3Vy1UPEYtSDxAIT87Jl1DODZRRThWXU49QCE/N1ZVSzg3KUc7Jy1UICVdUwotTT0nKUw5NlggN1VdRjtXNVI5JkVHOjcxUzw3NUk4VkwgN1clRzhWXU49RjVSPSAhPzlWLU87RzlFPEcwIAotTTdXJUU4Vl1OPUY1Uj0gIT85Ni1PO0c5RTxHMCA3VV1HOTcxQTxGPCA3VV1GPCYlQjg3LUUgJV1JPFchVQotTTtGLVQgJV1JPFY9Ujg3IUggJV1JPFYlUzhWRUkgJV1UO1YlUzhWRUkgJV0/OzYpPzhXNVI3VlVBPiAhPwotTTo3LVg5JkVHOjcwIDdWRVM8VyFBOFY0IDdWRVM4NlFOPTZUIDdWRVM9NyFQOTcoIDdWRVM4VllUPEZQIAotTTdWRVM8JylJO0cwIDdWRVM4NlFQOiYkIDdWRVM5JkVHOjcwIDdWRVM7Jl1XOTcoIDdXKUU4NjAgN1ZRQwotTTtWWVYgJV1HOTcxTDtWLUE7JjU/OFcxWTwmNCA3VV1MODZZRzo2WUY7UCE/OyZdQzg2UUQ9Ji1PO0c4IAotTTdXLVQ8Ri1BPSAhPzdWVVk3VzFJOzY0IDdXLUU9JlFPOFYlTDkwIT88VzFSPSZdSyAlXUk7RkVUN1ctVAotTTg3MUk4VywgN1Y9RT0mUU84ViVMOTVdTj02VUU8RkVDICVdTTk2VUM8J0QgN1VdTDtWLUE7JjVTICVdUwotTT0nKUM7NyAgN1ZdUDk2WCA3Vl1QOTZZTDtWLUE7JjQgN1ctVDxGLVA+MCE/N1YtTzkmNT88VjVUN1ZFTgotTTlGXCA3VV1DPSdFUDk1XVU7ICE/OVY1VDk2WVYgJV0/OScxQztWWVYgJV1TPScpUDhHKUsgJV1GPCVdRAotTTo3KUU4VzFJO1ZYIDdVXUY8JV1DPTcpUjk2WVQ3VjFJPEY1Qz0mRU87QCE/N1Y5UDdWLVU8RylFO0cxPwotTTk3QUM5NyFUOjZdTjxQIT83VjlQN1YtVTxHKUU7RzE/PCcpRThWRVM6Nl1OICVdRDtXNUI7JjU/PSZdPwotTTkmNUM6NlVBOyAhPzlWLVY9ICE/N1Y9Qz1HMCA3VilJO0YlUj41XVQ7VV1EOTYtSTs2JUw3VkVOPSY1RwotTTk3KCA3VV1SOjY9SD0lXVM6JkVGPSVdQjg3LUU3VzFXO1AhPzkmNUM6NlVBOyVdUjtXNU45ICE/N1YpSQotTTlVXUY7Jl1BPSVdVDo2VUU8VV1QO1c9RTxAIT84RkVOODcpWTdXMU83VjFFOFZFTTg2UT85RylBOFcxSQotTTtWWCA3VV1GPCVdTjtXKU04NlFJPkY0IDdXLVA8RkVOPSY4IDdVXUY8RjVFN1YpSTlVXUY7Jl1BPSAhPwotTTdXNU48JiVDOlY1RDdXMU83VilJOVVdRjsmXUE9ICE/N1YpQTxWNT84Vl1OPUY1UjxWRU87RV1BOEZdUgotTT0gIT83VzVOPCYlQzpVXUQ7VzVCOyY0IDdVXUM7JiVTPFVdRDtXNUI7JjQgN1clVTg2MVI9NyFMOTVdVAotTTtVXUQ5Ni1JOzYlTCAlXT89NllQODYtSzk2MT89Jl0/OSY1Qzo2VUE7ICE/N1YpSTlVXUI6NllBPEdFPwotTT0mXT84RkVHN1YxRThWRU04NlAgN1VdVTtHIUE4Vk0/PDc1QTknKVU8JlFFICVdPzhWUUE8Vy0/PDc1QQotTTknKVU8JlFFICVdPzlHIT87JjVGPSctSDo2OVQgJV0/OUchPzxWNVQ3VjVYOFY1UD0mRU87QCE/N1c1TQotTTg2LCA3VV1NPTZRVDo3IUw+NV1CODctRTdXMVc7VV1WOTYtVDtXKCA3VV1NPTZRVDo3IUw+NV1CODctRQotTTdXMUU7RV1WOTYtVDtXKCA3VV1DODcpUj41XVA8Rl1QODY9QT0mNT89Jz1PICVdPzhWJVI8R0U/PCcpTwotTTwmJUc4NzFFN1cxRTtAIT83Vi1BPEcpWTdWRU43VihRLCMgUCwgIT83VyFSO1YxQzdWKFEsIyBQLCAhPwotTTdWVVU7JzFJPCZRWTdWKUE8VjU/PSc9TyAlXT87JjVGPSVdUzomRUY9JV1CODctRTdXMVc7UCE/N1ZVVQotTTsnMUk8JlFZN1YpQTxWNT89JjVON1YpWTdXMVc7UCE/N1ZVVTsnMUk8JlFZN1YpQTxWNT89JjVOICVdPwotTTsmNUY9JV1TOiZFRj0lXUI4Ny1FN1cxRTtAIT83VyFSO1YxPywzIFAsIyE/OEM4VS0zLFYgJV0/PCcpTwotTTklXUItQzRVLFM4IDdVXUM4NylSPjVdTz03MT84QyRQLCMgUCAlXT88JylPOSVcVi0zNFMtRV1CLDMgUAotTSwjICA3VV1MPFZBSTlHMT84QyRQLCMgUCAlXT88JylPOSVdQiwzIFAsIyAgN1VdTT02UT8tQzRVLFM5UwotTTomXVI9ICE/PCcpSTtHMUYgJV0/OyY1QTkmRU45VV1aOTcpTzxVXUI6Nj0/PCZdVzk3KVM3VzFFO0AhPwotTTdWUUU4NjFJO0Y9Pz5GNVI7Vy0/PFZVQTsmUT88Jl1XOTcpUzdXMUU7QCE/N1ZRRTg2MUk7Rj0/PkY1UgotTTtXLT89JkVOPjVdUDtXPUU8Ry0/PSY1TiAlXT88VzFBPEcxPzhGRUc3VyFPPVY1UjxVXVQ5NlggN1VdUwotTT0mJVI9JV1TOzYlTDslXVA7Vz1FPEctPz0mNU4gJV0/PFcxQTxHMT89JkVOPjVdUDtXPUU8Ry0/PSY1TgotTSAlXT84RkVHN1chTz1WNVI8VV1UOTZYIDdVXVM7NiVMOyVdUDtXPUU8Ry0/PSY1TiAlXT89JkVOPjVdUAotTTtXPUU8Ry0/PSY1TiAlXT87NiVYN1YpSTlVXVA7Vz1FPEctPz0mNU4gJV0/OzYlWDdXLU04NlFMN1chTwotTT1WNVI8VV1UOTZYIDdVXU04N0E/PSZFTj41XVA7Vz1FPEctPz0mNU4gJV0/OFZdUD41XUI6Nj0/OUZRTwotTTg3MT85JkVHOjcxUyAlXUE4Rl1SPSAhPzdXLVQ4NylUN1YpSTlVXVA7Vz1FPEctPz0nPU8gJV0/PFcxQQotTTxHMT88VlVBOyZRPzwmXVc5NylTN1cxVztQIT83Vy1UODcpVDdXMUk7R0U/PCZdVzk3KVM3VzFXO1AhPwotTTdWKUk5VV1QO1c9RTxHLT89Jz1PICVdPzxWVUE7JlE/PCZdVzk3KVM3VzFXO1AhPzdXMUk7R0U/PCZdVwotTTk3KVM3VzFXO1AhPzdWVUE+JV1COjY9PzwmXVc5NylTN1cxVztQIT83VlVBPiVdUzs2JUw7JV1QO1c9RQotTTxHLT89Jz1PICVdPzs2JVg3VzFJO0dFPzwmXVc5NylTN1cxVztQIT88JjVSPEZdUiAlXUs6NlFMICVdUwotTTo2PU44NlAgN1Y9RT0nIUk5ICE/N1chRTxHKU88QCE/PFdFUzdWNVI8RlFJPFcwIDdXPVI6NzFFPUAhPwotPTxXRVM3VllFPEcoIDdWNVQ5N0FUICVdRTkmJVQ4MCE/N1Y1TjkgIVIKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWVsZi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QwNWU3Li4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1lbGYudQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi1iZWdpbiA3NzcgbTY4ay1lbGYKLU0/VDUsMUAkIiAwICAgICAgICAgICAgICIgIDAgICAgIUAgICQ+ICAgICMwICAjIjAgICAgICAgVCAiICAKLU0hMCBIICE0ICQwICAgIDggICAgVEAgICAtICAgICAgICAgIkAgICAgSCAgICAgNCAgICAgICAgICBQICAKLU0gLTAgICAgICAgICAgICAgICEsICAgICAgICAgISAgICAgICAgICAhICAgIC0oICAgIzAgICAgICAgICkKLU1DICAgIjhQICAgICUgICBAICAgICAgJCAgIEcgQCAgSVAgICAgICAgICAiNCAgICI2ICAgICA8ICAiICAKLU0gICAgIEAgICI+MiAgIkdEICAgICAgICAgJyAgICAgICAgICAhUCAgICAgTz03LVIrVlFJOEJdTDo2KUMKLU0rRy1PK0MkICAgICAgJiQgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gIDQgICAgICAgICAgUCAgICAgICAgICAgICAgIVAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAKLU0gICAgICAgICAgICsgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAgICAgICAgQCAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0hQCAgICAgICAgICAgICAgICAgICAgICAgICAhICAgICAgICAgIjAyICAgICAgICAiSCAgKyFAICAgICAKLU0kMCNfXDAgICAgXiAgIkckICAgICEhJCAgIEggICAgOEAgIClQICAgICAgMSAvX1EgICAgJ1AgICAgICAKLU0gICE6JEAgICAgICAgIjogICJJNCAgICAgISQgX18kICAgIE0gICAgICAgICAgIDIgICAgICAgICxIICAKLU0hLUAgICAgJCQwICAiICAgICNcICAgICAgICAgICEoICAgICAgICEpQCAgSVIgICAgICAxIC9fUSAgICAKLU03WCAgKj4wICAgICAkMCNfXDAhPzhWUUU4NllVPCAhPzk2WUQgJV1FO0c5STxGXU4gJV1FPSY1WD0gIUEKLU09JjVYOjcwIDdWNUQ4NzFBICY1WDo3MCA3VlFJOEVdVjk3KVM6Nl1OICVdPzlHIVM9JiVSPSAhPzFUUS8KLU0wRCUsN1RdJjFFLSU1JV00MDQpLDE1XCA3VDE5M0QlLTI0LCArVzVTPEJdTDo2KE87JkVCOFJZUztSWFEKLU0gICIgICJHNCAgICUlMCAgICAiICAiRzggICAhJTAgICAgIiAgIkc8ICAgKSUwICAgICIgICJHQCAgICcKLU0lMCAgICAhLj00WVErU0whPCAgICk7OS5eUCVRICAgRUxAICAgICEuXlAlUSAgIEVKQlxcICAgICAmI18KLU1fX19fVyRbWyA3JCAgIjY6K1NQICAgICw4L19fX19fKDNPTCE8MCAgKThITy8gICAgIUFAX19fX19bMS4KLU1eUCVRICAgRT5CXFwgICAgKSYjX19fX19IIlxcQCAgKU8kWllAICAkKiVBLygjUiAgIDBcOV9cICAgIC4KLU0rUCEuTjggICEiQTgzWV9cICAgICMiWjYwPlggISJdKCAgMSpGJjtcKFxCICAiRyQrVEAgIiRaWUAgICQKLU0kJFpZQCAgJDQkWllAICAnSyJaIDNLRiAgIDFEM0c1LjwwICAgICEoI09fX19fUShbUCAgICAzUi1fICAKLU0gNyAgICAgJDwgIUBfUCAgICAzUi1dICAgNyAgICAgJDMuXCAgICAkM0VZLj00QC5fX19fXyRDTyAgICAKLU0hLyhXXCAgITwgICAgIDFQICYjXyAgICAhLyhXVCAgITwgICAgIDEsW1AgICAgMS43RFlVMiBbX19fX1wKLU0yLlwgICAgJFxDP1AgICVQICAgICEnICA4L1wgICAgJFxDPzAgICVQICAgICEkU08gICAgISRZPjNHNSgKLU0jT19fX19RKFtQICAgIDNSLV8gICA3ICAgICAkPCAhQF9QICAgIDNSLV0gICA3ICAgICAkMy5cICAgICQKLU0zRVkuPTRALl9fX19fJENPICAgICEvKFdcICAhPCAgICAgMVAgJiNfICAgICEvKFdUICAhPCAgICAgMSwKLU1bUCAgICAxLjdEWVUyIFtfX19fXDIuXCAgICAkXEM/UCAgJVAgICAgIScgIDgvXCAgICAkXEM/MCAgJVAKLU0gICAgISRTTyAgICAhJFk+M0c1KCNPX19fX1EoW1AgICAgM1ItXyAgIDcgICAgICQ8ICFAX1AgICAgM1IKLU0tXSAgIDcgICAgICQzLlwgICAgJDNFWS49NEAuX19fX18kQ08gICAgIS8oV1wgICE8ICAgICAxUCAmI18KLU0gICAgIS8oV1QgICE8ICAgICAxLFtQICAgIDEuN0RZVTIgW19fX19cMi5cICAgICRcQz9QICAlUCAgICAKLU0hJyAgOC9cICAgICRcQz8wICAlUCAgICAhJFNPICAgICEkWT4zRzUoI09fX19fUShbUCAgICAzUi1fICAKLU0gNyAgICAgJDwgIUBfUCAgICAzUi1dICAgNyAgICAgJDMuXCAgICAkM0VZLj00QC5fX19fXyRDTyAgICAKLU0hLyhXXCAgITwgICAgIDFQICYjXyAgICAhLyhXVCAgITwgICAgIDEsW1AgICAgMS43RFlVMiBbX19fX1wKLU0yLlwgICAgJFxDP1AgICVQICAgICEnICA4L1wgICAgJFxDPzAgICVQICAgICEkU08gICAgISRZPjNHNSgKLU0jT19fX19RKFtQICAgIDNSLV8gICA3ICAgICAkXENRNCAgICAgICAgICAgIDgvXCAgICAkXEM/MCAgJVAKLU0gICAgISRTTyAgICAhJFk+M0c1KCNPX19fX1EoW1AgICAgM1ItXyAgIDcgICAgICRcQ1E0ICAgICAgICAKLU0gICAgOC9cICAgICRcQz8wICAlUCAgICAhJFNPICAgICEkWT4zRzUoI09fX19fUShbUCAgICAzUi1fICAKLU0gNyAgICAgJDBDRiAgIk1EJF9QICA4ICAqTiAzXyAgIkAgIEpJIy9cICAuICAiSzgsX1AgISggICpMQFMKLU1fICAlQCAgSjsiL1wgICAgIUggICpHQENfICAgICA+ICAiSTgoX1AgICAgKEAgIEo3Ii9cICAgICI4ICAKLU0qTTBDXyAgICAgSiAgIklEKF9QICAgICtAICBKWSIvXDBMQCAgKCAgKkpAQ18kIUkgICIgICJJUChfUCAKLU0gICAgQCAgSj0hL1lAICBLOSggICpUIDNeOCAgKk4iICAiSkAkX0YgICJKREAgIEo4Iy9ZQCAgSlYoICAKLU0qTkBTXjggICpMQiAgIkpULF9GICAiSUxAICBKWyIvWUAgIEo+KCAgKkgwQ144ICAqRUIgICJLWChfRiAKLU0gIkk8QCAgSk8iL1lAICBKVSggICpVUENeOCAgKkYyICAiSkwoX0YgICJLREAgIEpTIi9ZQCAgSkooICAKLU0qVFBDXjggICpHIiAgIkowKF9GICAiSVRAICBKRSIvXEAgIEs5KCAgKk8gQ18oICAqTiIgICJNOChfUiAKLU0gIkpEQCAgSl0iL1xAICBKViggICpVMENfKCAgKkxCICAiTCgoX1IgICJJTEAgIEo6Ii9cQCAgSj4oICAKLU0qS0BDXyggICpFQiAgIkwgKF9SICAiSTxAICBKUSIvXEAgIEpVKCAgKk1QQ18oICAqRjIgICJNKChfUiAKLU0gIktEQCAgSkAiL1xAICBKSiggICpUMENfKCAgKkciICAiTCwoX1AgICAgIkAgIEpDIi9cICAgICBIICAKLU0qR1BDXyAgICAgJiAgIlAgKF9QICAgICFAICBLOiIvWUAgIEshKCAgKlcgU144ICArISIgICJQKFxDPzAKLU0gICVQICAgICEkU08gICAgISRZPjNHNS49NFlRICAgICAgICAgICIgICJHRCAgICAgICAgICAiICAgMFAKLU1AICAkMSggICElQiAgIDFMICAgICAwICAgJkAgICAgLEAgICQkICAgICBWICAgRlwgICAgISggICAuQCAKLU0gICAlQCAgIzkgICAgIDogICAqRCAgICAiQCAgICdMICAgICsgICAgJCAgICAhNCAgICAgICAgICBYICAKLU0qPEAgICAgIiAgICAsICAgICEwICAgICcgICAgJVggICBeICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgIDAgICAgICAgICAgISAjX1wwICAgICIgICAjNCAgICAgICwgICAkICAgICAKLU1AICAgWiAgICAgICMgICAiICAgICAoICAgSjAgICAgICBQICAgUCAgICAiICAgLUQgICAgICAsICAgMCAKLU0gICAgQCAgI1ggICAgICAjICAgJSAgICAgKCAgISEgICAgICAgUCAgIUAgICAgIiAgIDA0ICAgICAgLCAKLU0gIDwgICAgIEAgICQ+ICAgICAgIyAgICggICAgICggICI7UCAgICAgIFAgICIwICAgICIgICJHICAgICAKLU0gICwgICBIICAgICBAICBJUiAgICAgICMgICArICAgICAoICAqPjAgICAgICBQICAjICAgICAiICAiSTgKLU0gICAgICAsICAgVCAgICAgICAgICAgICAgICAjICAgLiAgICAgICAgICAgICAgICAgUCAgI1AgICAgICAKLU0gICAgICAgICAgLCAgISAgICAgICAgICAgICAgICAgIyAgIDEgICAgICAgICAgICAgICAgIFAgICRAICAKLU0gICAgICAgICAgICAgICwgICEsICAgICAgICAgICAgICAgICMgICA0ICAgICJAICAgICAgICAgICEgI18KLU1cMCAgICEkICAgICAgICAgICAwIF9fJCAgICA4ICAgICAgICAgICAkIC9fUSAgICApICAgICAgICAgICAKLU0hICNfXDAgICAiUCAgICAgICAgICAgMCBfXyQgICAgViAgICAgICAgICAgJCAvX1EgICAgLzggICEtUCAKLU0gICBSJEAgICIgICAgJEYgICJJOCAgICAhISQgICBUICAgITZAICBKNyAgICAgMDEgICAtICAgIDk4ICAKLU0iO1AgICAgICRAICAiMCAgICZOICAiSUAgICAgIEEkICAgVCAgICIhQCAgJ0sgICAgQSAyICAgKCAgICAKLU1BSCAgKkYwICAgICQkMCAgIzAgICApMiAgIklIICAgICEhJCAgIFQgICAiTUAgICQvICAgICIwMiAgICAKLU0gICAgTUggICshQCAgICAgJDAjX1wwICAgK04gICJJTCAgICAgQSQgICBUICAgIyxAICAlVUAgICAjKDIKLU0gICAoICAgIFhIICAqRyAgICAgKCQwICAjMCAgIC5OICAiSVggICAgISEkICAgVCAgICNRQCAgJD4gICAKLU0gICAyICAgKCAgICBeKCAgKkdQICAgICQkMCAgIzAgICAwLiAgIkckICAgICEhJCAgIEggICAkLEAgIEoKLU1AICAgICAwMSAgIC0gICAhKSggICpIMCAgICAoJDAgICMwICAgMyIgICJKLCAgICAhISQgICBUICAgJFgKLU1AICAlI0AgICAjKDIgICAoICAgITJYICAqSSAgICAgMCQwICAjMCAgIDVKICAgRyAgICAgICEkIF9fJCAKLU0gICVBQCAgSkggICAgICgxICAgLSAgICE9OCAgKkowICAgICEkMCAgIzAgICA4NiAgIkpIICAgICEhJCAKLU0gIFQgICAmLUAgIEpLICAgICBAMSAgIC0gICAhSDggICEiQCAgICE6JEAgICAgICAgOkIgICJHJCAgICAKLU0hIiQgICBIICAgJlBAICAmR0AgICAjKDIgICAoICAgIU8oICAhUCggICAgUiRAICAiICAgID0mICAiSlQKLU0gICAgISEkICAgVCAgICdGQCAgSk4gICAgIDAxICAgLSAgICFdKCAgKkUwICAgICAkMCNfXDAgICA/TiAKLU0gIDVSICAgICxBKCAgIEAgICAoKEAgIEpPICAgICBAMSAgIC0gICAiJzggICpMMCAgICAkJDAgICMwICAKLU0gQzIgICA4KCAgICAsQSggICBAICAgKF9AICBKUiAgICAgKDEgICAtICAgIjNIICAhUzAgICAgXCRAICAKLU0iICAgIEVOICAgMUQgICAgICEoICAgICAgIClAQCAgSlMgICAgIEAxICAgLSAgICI9SCAgKk0wICAgICQKLU0kMCAgIzAgICBHViAgIks4ICAgICBBJCAgIFQgICAqJUAgIEpXICAgICAwMSAgIC0gICAiRSggICpOICAKLU0gICAhJDAgICMwICAgSiogICJLRCAgICAhISQgICBUICAgKlJAICBKWiAgICAgMDEgICAtICAgIlAoICAKLU0qTlAgICAgJCQwICAjMCAgIE0+ICAgMzggICAgISEkICAgQCAgICtEQCAgJFUgICAgICAyICAgKCAgICIKLU1bKCAgKk8gICAgICQkMCAgIzAgICBPTiAgIktUICAgICEhJCAgIFQgICAsM0AgIEpeICAgICBAMSAgIC0KLU0gICAjKUggICElICAgICAgJEAgICAgICAgUyIgICJMICAgICAhISQgICBUICAgLSVAICBLISAgICAgMDEKLU0gICAtICAgIzMoICAqPEAgICAgICQwI19cMCAgIFYqICAiTCggICAgISEkICAgVCAgIC1ZQCAgSyMgICAKLU0gIDAxICAgLSAgICNCSCAgKjwgICAgICQkMCAgIkAgICBZUiAgIkwwICAgICYhJCAgIFQgICAuRkAgIEsKLU0qICAgICFAMSAgIC0gICAjTCggICpUICAgICAiJDAgICMwICAgW1YgICJNJCAgICAhISQgICBUICAgLy0KLU1AICBLMiAgICAgMDEgICAtICAgI1hYICAhVyAgICAgXCRAICAiICAgIF8mICAgOFogICAgLEEoICAgQCAKLU0gIDAjQCAgSVkgICAgICAxIC9fUSAgICQjKCAgKlRQICAgICgkMCAgIzAgICEhSiAgIk00ICAgICEhJCAKLU0gIFQgICAwSkAgICZUICAgICMoMiAgICggICAkLzggICpVQCAgICAkJDAgICMwICAhJS4gICJNPCAgICAKLU0iISQgICBUICAgMUBAICAkJCAgICAgIDIgICAmICAgJDlIICAqVjAgICAgISQwICAjMCAgISZWICAiTUgKLU0gICAgISEkICAgVCAgIDFVQCAgJTAgICAgIygyICAgKCAgICRCSCAgKlcgICAgIjAkMCAgIzAgICEpJiAKLU0gIDZEICAgICxBKCAgIEAgICAyRUAgIEwgICAgICAwMSAgIC0gICAkS1ggICsgQCAgICAoJDAgICMwICAKLU0hK0IgICA5TCAgICAsQSggICBAICAgMyxAICBMJCAgICAgQDEgICAtICZUVi4mTE45NlFGICYtUj0jJE4KLU08UCFDPEcxSStHLCA9RiVMPTY1Uys1QVQrRiwgOVYxQjs2NE44UCFTOiVdRDg3MUErRiwgOFcpVDtCWVMKLU0gJzk/OFZBQTxFXUY9NllDICc5PzxWRUc7RjVEN1ZFTj0gIVY3VzVOPFZFRztGNUQ3VkVOPSAhPzlGRU4KLU06MCFWN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSODdEIDs2JUk7QCFWN1ctSTlWWUU5JV1MO1ZZRyAnOT8KLU09NllTOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhPzhWUUU4NllVPCAhPzk2WUQgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICc5PzkmXVU4RlFFICc5Pzo2WVQKLU0gJV1TPSYlUj0gIU47VllQPEZFTTg3KVkgJV1FO0c5STxGXU4gJzk/PTZZUzo2PU45NjE/OyZdTjlVXVAKLU07VkVOPSY1UiAnOT86NllUN1YlUjxGJVkgJyFSOjZVQTxHRCA9RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMKLU0gJzk/OSZdVThGUUU3ViVSPEYlWSAlXUU9JjVYPSAhVjdXLUk5VllFOSVdQzomJVI3ViVSPEYlWSAnOT8KLU09NllTOjY9Tjk2MT84VkFBPEAhVjdWOUw7ViVUICc5PzxWRUc7RjVEN1ZRTztGPT84NylSODdEIDg3MUUKLU0+JkVUICY1Tj1GRVI7VlggPUVdTDtWWUc3VjlVO0YsID1FXVU7Ry1JOVZZRTklXUw7VllHN1Y5VTtGLCAKLU09RV1TOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgPUVdSTtHMT88Jl1JO0cxRTxAIT85NjFBPSYkID1FXVMKLU06Jl1SPSVdRj02WUMgJzk/PTZZUzo2PU45NjE/OjZZVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzo2WVQKLU03VyFPOjZZVDk3KCA9RV1JO0cxPzlHNU44UCFWN1ctSTlWWUU5JV1TOiZdUj0gIVY3VjlMO1YlVDdWOVUKLU07RiwgOTdBST0gIVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgPUVdTDtWWUcgJzk/PFZBTzxHMCAKLU09RV1MO1ZZRzdXIU86NllUOTcoID1FXVM6Nj1OOTYxPzhWQUE8QCFWN1c1TjxWRUc7RjVEN1ZRTztGPCAKLU09RV1TOiZdUj0lXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJV1MOjYpPz1GNVIKLU08VkVPO0AhPzs2LU89NllUICc5PzhWQUE8RV1QO1ZFTj0mNVIgJzk/PTZZUzo2PU45NjE/OFZBQTxFXVAKLU07VkVOPSY1UiAnOT88VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT83VjlQPFcxQTxHMCA9RV1TOjY9Tjk2MT8KLU06NllUN1chTzo2WVQ5NyggPFVdTDo2WUsgJV0nMyRdIjA0UT8zVDkmNFQ1NDdVMSEwRFElN1AhVjdXLUkKLU05VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgJzk/OSZdVThGUUU3VyFPOjZZVDk3KCA3VV1MO1ZZRzkmXVUKLU04RlFFN1c1Uzk2MCA9RV1TPScpVThXMFEgJzk/PFcxUj02LVQsQCFWN1YtSDg3KT84NylSODdEID1FXUYKLU07Jl1BPSVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VjFPPTYpTDk1XUYKLU09NllDICc5PzxWRUc7RjVEN1ZFTj0lXUY9NllDICVdJDY0WSEzNEUjICc5PzlGUU84NzE/ODcpUjg3RCAKLU09RV1TOiZdUj0lXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIVY3Vy1JOVZZRTklXUMKLU06JiVSN1chTzo2WVQ5NyggPUVdTDtWWUc3ViVSPEYlWSAlXUk7RkVUICc5PzhWQUE8QCFDOyc1TjpWNVIKLU0gJzk/PTZZUzo2PU45NjE/OFZBQTxFXUY9NllDICc1PzsmRU46UCFWN1ctSTlWWUU5JV1TOiZdUj0lXUYKLU09NllDICctUDtXKVQ8Vi1BPEAhVjdXNU46Nl1OLEAhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQyAnOT8KLU09NllJO1ZYICAiWUk7RzFFPEcgICtGQUE8VkAgK0YxWTtHLVk7MCBOOSdFTjxXMVIgIllSOTZRQStHIUwKLU09ICBOOjZZST0gIE48JlFUICJZVDk3QVQgIllGOjZZSSAiWUQ4NzFBICJZRztXMCArRjFZO0YlTTo2LCAKLU0rRilTPFAgTjxXRU09JiVCICJZUz0nKVQ4NiggK0chRTxWNUwgIllTOictVDxHMUE4QCBOOFZdTTs2NU4KLU09ICBOOSY1Qj02PCArRlFJO0Y0IDAiQEMqNlFJOEYsTTszLFIuRlRUK0YxRTlARFErQzAgMCJAQyo2UUkKLU04RixNOzMsUi5GLVM9Ml1DPEcwUStHLCksMlhRLiAgICAgISAqIixJOyZFQjhSVU0sUyhaOzMwTjkmNUYKLU0iMyROLSAhICoiLEk7JkVCOFJVTSxTKFo4Vy1VK1YtUj0mRE48UERRK0MsIDg3LFooIkEjMSUsSSgjNE4KLU0sIiBRK1MoTy4zICAgICAgMCJAQyo2UUk4RixNOzMsUi5GVFQrRjFFOUBEUStDMCAwIkBDKjZRSThGLE0KLU07MyxSLkYtUz0yXUM8RzFOK0csKSwyWFYgIiFMOSIgWigiQSMxJSxJKCM0TiwiIFErUyhPLjMgICAgICAKLU0gIlggJDAgMiAgIDY8ICBYOVYxQjs2NE44UCAhLUAgICAgJCEkOCAgIS1QISg4ICAiO1AhIUAgICAgICAKLU0gICA9ICEsICRAICAgNFggLicxPzxXMVI9Ni1UICAiViAgICAmICAgICJIICMwIDIgICAgPTAgWD1FXUMKLU06JiVSN1ZVRTs2KUU8QCAgNTAgISAiLCAhQDAgICAgICFQICAgIkwgIzAgMiAgICBIICBYPUVdUzomXVIKLU09JV1NOTZVQjk3KCAgJTQgISAgQyAgOCQgICAgIEA8ICAgIEkgIFQgJEAgICAsRCAuJzk/OjZZVDdWVUUKLU07NilFPEAgIDUwICcgIiwgIUAwICAgICQhUCAgICJIICMwIDIgICAgXFAgWD1FXUw7VllHN1ZVRTs2KUUKLU08QCAgNTAgKiAiLCAhQDAgICAgKCFQICAgIkwgIzAgMiAgICEnQCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAKLU0gJTQgI0AgQyAgOCQgICAgIyA8ICAgIEwgIFQgJEAgICA0SCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICAKLU01MCAvICIsICFAMCAgICAwIVAgICAgMCAgICA7ICEsICRAICAgRlAgLidYUDlGJUs5MCAgTUAgICAhQCAKLU0gICBKICBUICRAICAgOSwgLic5PzhWQUE8RV1NOTZVQjk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsKLU0gIFQgJEAgICA7WCAuJzk/PFZBTzxHMT87NjVNOEY1UiAgITUgIDAgKFAgJiEgICAgICgnICAgICowIC0KLU0gISggICAnRyAjQVY3VkVOPSVdTTk2VUI5NyggICU0ICFQIEMgIDgkICAgICEgPCAgICBKICBUICRAICAKLU0gQSQgLic5PzsmXU45VV1NOTZVQjk3KCAgJTQgIkAgQyAgOCQgICAgIiA8ICAgIEsgIFQgJEAgICBDUCAKLU0uJzk/OUZRTzg3MT87NjVNOEY1UiAgITUgIFggKFAgJiEgICAgIFAnICAgICsgIC0gISggICApSCAjQVYKLU03VjFPPTYpTDk1XU05NlVCOTcoICAlNCAjUCBDICA4JCAgICAkIDwgICAgJCAgICAnICA3ICEoICAgLisKLU0gI0FUN1c1Tjo2XU4gICJWICAgICIgICAgIkggIzAgMiAgICJMQCBYPUVdQzomJVI3VlVFOzYpRTxAICAKLU01MCAhICIsICFAMCAgICAgIVAgICAiTCAjMCAyICAgIlcwIFg9RV1TOiZdUj0lXU05NlVCOTcoICAlNCAKLU0hICBDICA4JCAgICAgIDwgICAgSSAgVCAkQCAgIFA4IC4nOT86NllUN1ZVRTs2KUU8QCAgNTAgJyAiLCAKLU0hQDAgICAgICFQICAgIkggIzAgMiAgICMsICBYPUVdTDtWWUc3VlVFOzYpRTxAICA1MCAqICIsICFAMCAKLU0gICAgIVAgICAiTCAjMCAyICAgIzZQIFg9RV1GOyZdQT0lXU05NlVCOTcoICAlNCAjQCBDICA4JCAgICAKLU0gIDwgICAgTCAgVCAkQCAgIFg8IC4nOT85Jl1VOEZRRTdWVUU7NilFPEAgIDUwIC8gIiwgIUAwICAgICAKLU0hUCAgICAwICAgIDsgITwgJEAgICEqRCAuJ1hROUYlSzkwICBNQCAgICBAICAgIEogIFQgJEAgICBdICAKLU0uJzk/OFZBQTxFXU05NlVCOTcoICAlNCAgMCBDICA4JCAgICAgIDwgICAgSyAgVCAkQCAgIF9MIC4nOT8KLU08VkFPPEcxPzs2NU04RjVSICAhNSAgMCAoUCAmISAgICAgICcgICAgKjAgLSAhKCAgIDBEICNBVjdWRU4KLU09JV1NOTZVQjk3KCAgJTQgIVAgQyAgOCQgICAgICA8ICAgIEogIFQgJEAgICEkWCAuJzk/OyZdTjlVXU0KLU05NlVCOTcoICAlNCAiQCBDICA4JCAgICAgIDwgICAgSyAgVCAkQCAgISdEIC4nOT85RlFPODcxPzs2NU0KLU04RjVSICAhNSAgWCAoUCAmISAgICAgICcgICAgKyAgLSAhKCAgIDJFICNBVjdWMU89NilMOTVdTTk2VUIKLU05NyggICU0ICNQIEMgIDgkICAgICAgPCAgICAkICAgICpAICYgISggICAzNyAjQVY3Vi1IODcpPzlHNU4KLU04UCAgNTAgISAxJiAgIDM8IDImICAgNC4gICAgISAgICAjJCAhQCAyICAgJSMgIFg9RV1TOjY9Tjk2MT8KLU04VkFBPEVdRj02WUMgICE1ICAoISQ4ICAhMFghKDggICE0ICAgICAkICAgICxQICYgISggICA1IyAjQVYKLU03VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU44UCAgNTAgIyAxJiAgIDUgIDImICAgNVIgICAgISAgICAiTCAKLU0hQCAyICAgJTxAIFg9RV1TOiZdUj0lXUY9NllDICAhNSAgMCEkOCAgITcoISg4ICAhOjAgICAgJCAgICAKLU0sQCAmICEoICAgNkggI0FWN1ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICAhNSAgNCEkOCAgITowISg4ICAKLU0hPTggICAgJCAgICAtICAmICEoICAgN0AgI0FWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsICAlNCAKLU0hQCQxQCAgJVVAJEFAICAmIiAgICAgMCAgICBJICA4ICRAICAhQFQgLic5Pzo2WVQ3VjlVO0YsICAlNCAKLU0hUCQxQCAgJiIgJEFAICAmLkAgICAgMCAgICBQICA4ICRAICAhRCQgLic5PzxWRUc7RjVEN1ZFTj0lXUYKLU09NllDICAhNSAgQCEkOCAgIUNIISg4ICAhRlAgICAgJCAgICAsQCAmICEoICAgOVcgI0FWN1c1TjxWRUcKLU07RjVEN1ZFTj0lXUY9NllDICAhNSAgRCEkOCAgIUZQISg4ICAhSVggICAgJCAgICAqQCAmICEoICAgOkUKLU0gI0FWN1ZRTztGPT85RzVOOFAgIDUwICogMSYgICA6PiAyJiAgIDswICAgICEgICAgIyQgIUAgMiAgICYKLU1WQCBYPUVdUzo2PU45NjE/OyZdTjlVXUY9NllDICAhNSAgTCEkOCAgIU0gISg4ICAhUCggICAgJCAgICAKLU0sUCAmICEoICAgPDEgI0FWN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAgIDUwICwgMSYgICA8IiAyJiAKLU0gIDxUICAgICEgICAgIkwgIUAgMiAgICcwICBYPUVdRjsmXUE9JV1GPTZZQyAgITUgIFghJDggICFTMCEKLU0oOCAgIVcgICAgICQgICAgKyAgJiAhKCAgID1QICNBVjdWMU89NilMOTVdRj02WUMgICE1ICBcISQ4ICAKLU0hVyAhKDggICFaUCAgICAkICAgICUwIDUgISggICA+TiAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgPjoKLU0gKCwgITAkICAgP0ogICAgJCAgJSAhKCAgID5KICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIV5IIEUwICAKLU0gKiwgKiAgICIgICAgICAgICAgICAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAKLU0gICA5ICEsICRAICAiJ0wgLiZRSTtGTCAgKzggICAiOCAgICApQCAtICEoICAgQEkgI0FOOTdBVCAgIiMKLU0gIDQhICAgJ1pAIEMgIDgkICAgICAgPCAgICBKICBUICRAICAiJSwgLiZRSTtGTUY9NllDICAiIyAgNCEKLU0gICAnPCAgQyAgOCQgICAgISA8ICAgIEQgIFQgJEAgICInPCAuJy1UPTY5RiAgIVIgICAnS0AgQyAgOCQKLU0gICAgIiA8ICAgICQgICAgJTAgNSAhKCAgIEJZICgsICEwJCAgID9KICAgICUwICUgISggICBCRSAoLCAKLU0hMCQgICA/SiAgICAkICAlICEoICAgQlUgJTQgIVAgICAgMCAgICBcICAkICRAICAiLzQgRTAgICAqLCAKLU0qICAgIiAgICAgICAgICAgICAgKCAgICAgICAgICAkICAgQCAgICAgICAgICBAQCA8QCAgICJYICAgIDwKLU0gITwgJEAgICI4RCAuJzFVN1ZRSTtGTCAgKzggICAiMCAgICApQCAtICEoICAgRFcgI0FOOTdBVCAgIiMKLU0gIDQhICAgJ1pAIEMgIDgkICAgICAgPCAgICBKICBUICRAICAiNiQgLiZRSTtGTUY9NllDICAiIyAgNCEKLU0gICAoPlAgQyAgOCQgICAgICA8ICAgIEQgIFQgJEAgICI4NCAuJy1UPTY5RiAgIVIgICAoTjAgQyAgOCQKLU0gICAgICA8ICAgICQgICAgLkAgJCAhKCAgIEcnICNBXixGOUE6VjQgICs4ICAgICQgLywgJlAgICAgKUIKLU07JzVFICAgICAgJUc8RjVFO0AgICAgICA8RjVEICAgICAgMCAgICBeICAwICRAICAiQEQgLiYtTzsmXVIKLU08UCAgTUAgICAgMCBcUCA/ICAgICBHIUk7RkwgICAgICA3IVU8RyFMOTAgICAgICA+NjVMOyZdVyAgICAKLU0gIDAgICAgUiAgMCAkQCAgIkNcIC4nWFM5RiVLOTAgIE1AICAgIDAgXFAgMyAgICAgNjlPPEYwICAgICAKLU0gJi1IOTc5WSAgICAgIDAgICAgUSAgMCAkQCAgIkcwIC4mLUE8RywgICs4ICAgICQgLywgJSAgICAgJVAKLU07VylTOFZBRSAgICAgICFCOzc8ICAgICAhICAgICMoICEgIDIgICAqSkAgWD9DMUY4Nk1FICAiViAgICAKLU0hICNTICEsICAgICE1JSk1MTAgICAgICAxRCUsNFQ0ICAgICAhICAgICFQICVAIDIgICAqUUAgWDhGXU8KLU07JjVBO0AgIDxAICAiRzAgICAgUSAgMCAkQCAgIk9MIC4mKVY4NlFTICAiViAgICAhICNTICEsICAgICEKLU09JylVOTAgICAgICA5RiVMPFY0ICAgICAhICAgICFUICVAIDIgICArJiAgWDhGXU87JjVBO0MoICAnKCAKLU0gIEsmICAgIDFAICQgISggICBNQiAjQU06Ny1PPEYxRTxGNUQgICJWICAgICEgI1MgIiwgICAgIz0mQVIKLU05NjQgICAgICAnSUU8RlwgICAgICA2XU45MCAgICAgIj0nPU8gICAgICAwICAgIEMgIDggJEAgICJYRCAKLU0uJlVBOjZYICAlNCAhUCQxQCAgJ0sgJEFAICApTyAgICAgMCAgICBHICA8ICRAICAiWyAgLictUDtXKVQKLU08Vi1BPEAgIDxAICAiQ1wgKFAgJSBYICArICAgICAgRSAgPCAkQCAgIl00IC4mLUw9NllLOTcoICAnKCAKLU0gIEgpICIsICEwLiAgIk1IICAgICogICcgISggICBPXSAjQU47VllQPEZFTTg3KVkgICFSICAgKVFQIEMKLU0gIDQjQCAgSj8gICAgIjQgIVAgMiAgICwoQCBYPCcpSTs2JVI+MCAgPEAgICI4RCAoUCAlIFggICpIUCAKLU0gICBEICA8ICRAICAjJDggLic1PzsmRU46UCAgPEAgICIvNCAoUCAlIFggICpXICAgICBHICA8ICRAICAKLU0jJlQgLictPzsmRU46UCAgQFAgJSAwICAhXkggKFAgJSBYICAqUDAgICAgRiAgPCAkQCAgIyksIC4nOT8KLU09NllJO1ZYUiAgIVIgICAjQlAgQyAgNCNAICBMIiAgICAiNCAhUCAyICAgLE4gIFg9RV1VO0ZFTztAICAKLU08QCAgIEZQIChQICUgWCAgKyEgICAgIEcgIDwgJEAgICMtXCAuJzk/PFcxUj02LVQsQCAgPEAgICA0WCAKLU0oUCAlIFggICpSQCAgICBHICA8ICRAICAjMDggLic5PzxXMVI9Ni1ULDAgIDxAICAgIlggKFAgJSBYICAKLU0qUSAgICAgTyAgPCAkQCAgIzM0IC4nOT85Jl1VOEZRRTdXIU86NllUOTcoICAmLCAgUCQgI1AgQyAgNCMKLU1AICBLIyAgICAiWCAhUCAyICAgLThQIFg9RV1GOyZdQT0lXVA7VkVOPSY1UiAgIUMgICwhICBYIChQICUKLU0gWCAgKlQwICAgIFYgIDwgJEAgICM5RCAuJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAgIUMKLU0gICwhICBQIChQICUgWCAgKkggICAgIFQgIDwgJEAgICM8VCAuJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUkKLU07RzFFPEAgIDhQICMgMCArICIsICEwLiAgIk0oICAgICswICcgISggICBXWiAjQVY3VlFPO0Y9PzwmXUkKLU07RzFFPEAgIDhQICMgMCAqICIsICEwLiAgIks8ICAgIC0wICcgISggICBYTyAjQVY3VzVOPFZFRztGNUQKLU03VkVOPSVdUDtWRU49JjVSICAhQyAgLCEgIEQgKFAgJSBYICAqTDAgICAgUyAgPCAkQCAgI0YoIC4nOT8KLU08VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgICFDICAsISAgQCAoUCAlIFggICpQICAgICBMICA8ICRAICAKLU0jSFggLic5Pzo2WVQ3VyFPOjZZVDk3KCAgJiwgIFAkICFQIEMgIDQjQCAgSk4gICAgIzwgIVAgMiAgIC4KLU1RMCBYPUVdVTtHLUk5VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgICFDICAsISAgOCAoUCAlIFggICpGQCAKLU0gICBVICA8ICRAICAjT0ggLic5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCAgJiwgIFAkICEwIEMKLU0gIDQjQCAgSyIgICAgIlggIVAgMiAgIC8qICBYPUVdUzomXVI9JV1QO1ZFTj0mNVIgICFDICAsISAgMCAKLU0oUCAlIFggICpVMCAgICBWICA8ICRAICAjVVggLic5Pz02WVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIKLU0gICFDICAsISAgLCAoUCAlIFggICpPMCAgICBUICA8ICRAICAjWSggLic5PzxWRUc7RjVEN1YtSDg3KT8KLU08Jl1JO0cxRTxAICA4UCAjIDAgIiAiLCAhMC4gICJNOCAgICArMCAnICEoICAgXl8gI0FWN1YtSDg3KT8KLU08Jl1JO0cxRTxAICA4UCAjIDAgISAiLCAhMC4gICJLUCAgICApICAhICEoICAgX0MgKTQgICAiQyAhICAKLU0gIEAgICAgICAgICAgMEAgNTAgLyAgICArICAnICEoICAhIC8gI0FWN1YxTz02KUw5NV1BPEcpQT4wICAKLU08QCAgI1tcIChQICUgWCAgKkkgICAgIEQgICQgJEAgICQjLCBFMCAgICosICQgICAiICAgICAgICAgICEKLU0iICE1ICBYICAgIEsgIDwgJEAgICQlWCAuJzk/OUZRTzg3MT84NylSODdEICAnKCAgISAvICIsICEwLiAKLU0gIk0sICAgICkgICEgISggICEiIiApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAsICAgICxQICcKLU0gISggICEiVSAjQVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgICcoICAhIT4gIiwgITAuICAiSywKLU0gICAgKSAgISAhKCAgISM5ICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICsgICAgLDAgJyAhKCAKLU0gISQqICNBVjdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAgIVIgICAwTTAgQyAgNCNAICBKSyAgICAiMCAKLU0gMCAyICAgMStAIjUgICAgSFAgMCAgICggICAgICAgICAgJCggJTQgIkAgICAiSCAhUCAyICAgMTYgIFgKLU09RV1MO1ZZRzdWJVI8RiVZICAhUiAgIDEiQCBDICA0I0AgIEs3ICAgICIwICAwIDIgICAxPyAiNSAgICAKLU1IUCAwICAgKCAgICAgICAgICAkKCAlNCAiMCAgICMoICFQIDIgICAxS0AgWD1FXVU7Ry1JOVZZRTklXUkKLU07RzE/ODcpUjg3RCAgJyggICElOCAiLCAhMC4gICJKXCAgICApICAhICEoICAhJzIgKTQgICAiQyAhICAKLU0gIEAgICAgICAgICAgMEAgNTAgKCAgICAsICAnICEoICAhKCIgI0FWN1ctSTlWWUU5JV1JO0cxPzg3KVIKLU04N0QgICcoICAhJk4gIiwgITAuICAiS1ggICAgKSAgISAhKCAgIShGICk0ICAgIkMgISAgICBAICAgICAKLU0gICAgIDBAIDUwICcgICAgKjAgJyAhKCAgISkvICNBVjdWRU49JV1BPEcpQT4wICA8QCAgJEAoIChQICUKLU0gWCAgKkgwICAgIEQgICQgJEAgICRHLCBFMCAgICosICQgICAiICAgICAgICAgICEiICE1ICA4ICAgIFQKLU0gIDwgJEAgICRKPCAuJzk/PTZZUzo2PU45NjE/PFZBTzxHMT84NylSODdEICAnKCAgISkvICIsICEwLiAKLU0gIktMICAgICkgICEgISggICErKyApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAlICAgICxAICcKLU0gISggICErXSAjQVY3Vy1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCAgPEAgICRKPCAoUCAlIFggICpLMCAKLU0gICBEICAkICRAICAkUiQgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgMCAgICBLICA8ICRAICAKLU0kVFAgLic5PzxWQU88RzE/ODcpUjg3RCAgJyggICErXSAiLCAhMC4gICJLSCAgICApICAhICEoICAhLVAKLU0gKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgIyAgICAsUCAnICEoICAhLkMgI0FWN1c1TjxWRUcKLU07RjVEN1YtSDg3KT84NylSODdEICAnKCAgIS0sICIsICEwLiAgIklAICAgICkgICEgISggICEvJyApNCAKLU0gICJDICEgICAgQCAgICAgICAgICAwQCA1MCAiICAgICwwICcgISggICEvWCAjQVY3Vy1JOVZZRTklXUMKLU06JiVSN1YlUjxGJVkgICFSICAgM0hQIEMgIDQjQCAgSkggICAgIjAgIDAgMiAgIDQnICI1ICAgIEhQIDAKLU0gICAoICAgICAgICAgICQoICU0ICAwICAgIkggIVAgMiAgIDQxQCBYPUVdQzomJVI3ViVSPEYlWSAgIVIKLU0gICAzXiAgQyAgNCNAICBLMCAgICAiMCAhUCAyICAgNDpAIFg9RV1EO1c1QjsmNCAgJTQgI1AgQyAgNCMKLU1AICBKPCAgICAiLCAhUCAyICAgNEMwIFg9RV1GOyZdQT0gICA1MCAuICIsICEwLiAgIkpIICAgICpQICcKLU0gISggICEyWCAjQVY3VzVOPFZFRztGNUQ3VlFPO0Y8ICAlNCAjICBDICA0I0AgIEpZICAgICJEICFQIDIKLU0gICA0WDAgWD1FXVM6Nj1OOTYxPzsmXU45UCAgNTAgKyAiLCAhMC4gICJJRCAgICAoQCAnICEoICAhNCMKLU0gI0FWN1ZRTztGPCAgJTQgIkAgQyAgNCNAICBKVSAgICAiSCAhUCAyICAgNSswIFg9RV1VO0ctSTlWWUUKLU05JV1JO0cwICAlNCAiMCBDICA0I0AgIEo3ICAgICJAICFQIDIgICA1NTAgWD1FXVM6Nj1OOTYxPzo2WVQKLU0gICE1ICBAIChQICUgWCAgKkVAICAgIEEgIDwgJEAgICU3OCAuJzk/OjZZVCAgITUgIDwgKFAgJSBYICAKLU0qR0AgICAgTCAgPCAkQCAgJTooIC4nOT89NllTOjY9Tjk2MT88VkFPPEcwICAlNCAhQCBDICA0I0AgIEoKLU07ICAgICJIICFQIDIgICA1UyAgWD1FXVM6Nj1OOTYxPzxWQU88RzAgICU0ICEwIEMgIDQjQCAgSlIgICAKLU0gIiwgIVAgMiAgIDVbUCBYPUVdUzomXVI9ICAgNTAgJCAiLCAhMC4gICJLOCAgICAqUCAnICEoICAhODoKLU0gI0FWN1c1TjxWRUc7RjVEN1YtSDg3KCAgJTQgIFAgQyAgNCNAICBKSSAgICAiRCAhUCAyICAgNjBQIFgKLU09RV1TOjY9Tjk2MT84VkFBPEAgIDUwICIgIiwgITAuICAiS0AgICAgKEAgJyAhKCAgITlFICNBVjdWLUgKLU04NyggICU0ICAwIEMgIDQjQCAgSzkgICAgIDAgICAgJyAgICAgICAiREggICEtUCAgICFZX19cICAgICAKLU0gICAgPk9fXyAgICAsQCAgICdPX19QICAgJjAgICAhXV9fXCAgICI2ICAgID9PX18gICAgUiAgICAnX18KLU1fUCAgIC9IICAgIiFfX1wgICAkTCAgICBAT19fICAgITdAICAgKC9fX1AgICA5ICAgICIlX19cICAgJyIKLU0gICAgQU9fXyAgICFdICAgICg/X19QICAgQjggICAiKV9fXCAgICk4ICAgIEJPX18gICAiRSAgICArK18KLU1fUCAgIE0gICAgIlVfX1wgICArRiAgICBNT19fICAgIlsgICAgKz9fX1AgICBPMCAgICJZX19cICAgK1wKLU0gICAgTk9fXyAgICMhICAgICtPX19QICAgUFAgICAiXV9fXCAgICw0ICAgIE9PX18gICAjJ0AgICArX18KLU1fUCAgIFJAICAgIyFfX1wgICAsUiAgICBQT19fICAgIy8gICAgLC9fX1AgICBUOCAgICMlX19cICAgLTAKLU0gICAgUU9fXyAgICM2QCAgICxHX19QICAgVlggICAjKl9fXCAgIC1YICAgIFJfX18gICAjQEAgICAsV18KLU1fUCAgIFhQICAgIy5fX1wgICAuNiAgICBTX19fICAgI0ggICAgLSdfX1AgICBaSCAgICMyX19cICAgLlQKLU0gICAgVF9fXyAgICNPQCAgIC03X19QICAgXEAgICAjNl9fXCAgIC8yICAgIFVfX18gICAjVyAgICAtR18KLU1fUCAgIF44ICAgIzpfX1wgICAvUCAgICBXL19fICAgJCEgICAgLVdfX1AgICEgWCAgICM+X19cICAgMDgKLU0gICAgWC9fXyAgICQoQCAgIC4nX19QICAhIlAgICAjQl9fXCAgIDBWICAgIFkvX18gICAkMCAgICAuN18KLU1fUCAgISRIICAgI0ZfX1wgICAxNCAgICBaL19fICAgJDdAICAgLkdfX1AgICEmQCAgICNKX19cICAgMVIKLU0gICAgWy9fXyAgICQ/ICAgIC5XX19QICAhKDggICAjT19fXCAgIDIwICAgIFwvX18gICAkRkAgICAvJ18KLU1fUCAgISowICAgI1JfX1wgICAyTiAgICBdL19fICAgJE4gICAgLztfX1AgICEsKCAgICNXX19cICAgMywKLU0gICAgIC9fXyAgICRYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICQgICAgISAgICAgSCAgIC0wICAgIzQgICAgJFAgICAgICAgICAgICAgICAwICAKLU0gICAgICAgKSAgICAhMCAgICAqICAgI0ggICAgWiAgICA7UCAgICAjICAgICAgICAgIDAgICAgJCAgICAKLU0jUCAgICBMICAgICJAICAiSSAgICBKMCAgICMgICAgICEgICAgICQgICAgJCAgICAkICAgICE8ICAgICMKLU0gICAgIEggICBWMCAgIC1EICAgID5QICAgICAgICAgICAgICAgMCAgICAgICAgID8gICAgISAgICAgKiAKLU0gIC9AICAgI1ggICAgIyAgICAgIyAgICAhUCAgICAwICAgICwgICAgKjAgICAgJCAgICAmQCAgJCQgICAKLU0hISAgICAgJCAgICAgICAgICAgICAgICQgICAgICAgICAiXCAgICAhICAgICFIICAhITAgICAwNCAgICAKLU05ICAgICAgICAgICAgICAgISAgICAhMCAgICBUICAgICAwICAgIDogICAxWCAgICQ+ICAgITQwICAgICAKLU0gICAgICAgICAgMCAgICAgICAgIC5AICAgICQgICAgJkAgIClPICAgIjtQICAgICQgICAgICAgICAgICAKLU0gICAkICAgICAgICAgJCAgICAgISAgICAgWCAgKjwgICAgRyAgICAgIiAgICAgICAgICAgICAgICEgICAKLU0gICAgICAhJiAgICAgMCAgICAuICAiRyggICApUiAgICAhUCAgICAgICAgICAgICAgIDAgICAgJCAgICAKLU0yUCAgICA4ICAgICNAICBJWSAgICI+MCAgICFQICAgICEgICAgICAgICAgJCAgICAiICAgICUwICAgICgKLU0gICAgIFggICpFQCAgIEk4ICAgIVAgICAgICAgICAgICAgICAiICAgICAgICAgITkgICAgIEAgICAgICAKLU0gICAgICAgKjYgICAhUCAgICAgLyAgICAnICAgICAwICAgIDAgICAgODAgICAgLCAgICAgICAgICAgICAKLU0kNUAgICAzNCAgICAgICAgICAgICAgICEgICAgICAgICAmRCAgICAjICAgICAgICAgICAgICE4TCAgICAKLU0gICAgICAgICAgICAgICAgISAgICAgICAgICFQICAgICBQICAgICAgICAgICAgIDYrICAgICkgICAgICAKLU0gICAgICAgICAgJCAgICAgICAgID5AICAgICQgICAgICAgICAgICAgJUtQICAgIy8gICAgICAgICAgICAKLU0gICAkICAgICAgICAgKCwgICAgISAgICAgICAgICAgICAhPiwgICA2PCAgICAgICAgICAgICAgICEgICAKLUogICAgICAiKiAgICAgMCAgICAgICAgICAgICBNXyAgICBJMCAgICAgICAgICAgICAgIDAgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHMtZWNvZmYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwcy1lY29mZi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWY2NTZhLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwcy1lY29mZi51CisrKyAvZGV2L251bGwKQEAgLTEsNjcxICswLDAgQEAKLWJlZ2luIDc3NyBtaXBzLWVjb2ZmCi1NIDYgICIyRzxfJTAgICMgICAgICA4ICBYICA8ISJQKCogICBAICAgICQgICAgKT0gICQgIVAgISAgICAwCi1NICAgICQgIDAgLy9fX19YICAgICAgICAtVCAgICAgICAgICAgJCAiKkAiWVQ5N0FUICAgICAkICFQICEgCi1NIDwgICAhRTAgICAhUCAgICAgICAgICAgICAgICAgICAgIiBOOjZZST0gICAgICEgJlEgIDAhTDAgICAgCi1NKCAgICZRICAgICAgICAgICAgICAgICIgICAgICtGMUE9JiQgICAgMCAgICAkICAgICAgICJJICAgIiAgCi1NICAgICAgICAgICAgICAgICAgICAwIllMOjcwWCAgICAkICAqRCEgICJJICAgICAwICAgSkQgICAgICAgCi1NICAgICAgICAgIEAgICAgTjsmRVQtICAgICEgICJKIDAgIEpAICAgICQgICAqSiAgICAgICAgICAgICAgCi1NICAgMCAgICArRy1EODcxQSAgIDAgIEpQJCAgKkwgICAgJiAgICJKUCAgICAgICAgLCAgICAgICAgICAiCi1NICJZUzhHLVMgICAgJCAgKyQhICAiUSAgICAlICAgICAgICAgICAgICAjICAgICAgICAgICEgIE44Ry1TCi1NICAgICAhICAjJSAwICBRMCAgIjpcICAgICAgICAgICAgICAgICAgICAgICAgICIgPEctUjhQICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgKF5ECi1NICAgXCchICEpWjQgISI+PEJIIERJQCAkICAwMEAqXiVAOTAgUEMgQSlbV19aKl4mQCMiT0ggIDQgICNQCi1NKDBQMCFMPk9BKCYwIyEgITkgICAgICAsJCAlSCAgIEAoOF4kQDkiL0E4JjRDWDogLCBQMCAuTCAgICAgCi1NIyEgIUkgISAoIiQgICAgLSBeICAiICAgICAgR08wICggXiAgIiAgQF4iJCNYICAoICAgICAgICAgICAgCi1NICAgICAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgCi1NICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgCi1NIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBCi1NIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgCi1NICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9ACi1NICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgCi1NICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgJDIgICAgI1ggICggICAgICAvQCAgQCAgICAgCi1NIF4gICIgICAgICEkQCAgIDEoICggIC9AICBAICAgICAgXiAgIiAgICAgICNYICAoICAgICAqLiBAKSBECi1NI0AgIUhYWiBEMjAvICAqQ0NYIjIpIUAgIFo+OEApMEQmMCAkSVlGIEVCMCggIDZHQigiOCkgRCAhSl4pCi1NQClQRCJAICdLWEogSCIwKyAgQk9CWCJEKSBQICI6XixAKkBEIzAgKktYViBLIjAuICBOT0NIIlBRWDIgCi1NKCAgICAgI0dBKCJUUVg+ICQsPiZAITNHQVgiWFlYOiBPKS4vQCkgICAgICBIWF4gUCkuOEApJCAgICAgCi1NSFlCIFBJLjlAKSggICAgIEhZRiBRKD4oQCkwICAgICBJWEIgUig+KUApOCAgICAgSVhGIFMpPipAKUAgCi1NICAgIElYSiBUKF4rQClQICAgICBLWE4gViheLEAqICAgICAgS1hSIFgoXi1AKjAgICAgIEtYViBaKF4uCi1NQCpAICAgICBLWFogXCheL0AqUCAgICAgS1heIF4oXjhAKyAgICAgIEtZQiEgLD4oQCswICAgICBZWEIhCi1NIiw+K0ArQydCSCJcLyAkMCAuMEs4XyNEKkYvVClZRiBEKl45QDEgR0IoIjFLWEIhJSI+KUApKk9COCQ4Ci1NKVhKIEUqXipAMVBHQlgiNktYTiEoIj4sQClCT0MoJEQpWFYgRypeLUAyQEdDSCJAS1haISsiPi9AKjJPCi1NQ1gkUClZQiBKKl44QDMwR0Y4IkxLWUYhLiI+KEArIk9CKCRcKVhGIE0qXilANCBHQkgiWEtYSiExIjArCi1NICAqT0JYJTwpIFAgIEpeLEA2IEQjMCAhS1hWIToiMC4gICZPQ0glRENYXiE2I1AhJCAiTCtWLFBBWUIhCi1NMiAgICAgIkdGKCUwIF4gICIgICAkIiQjWCAgKCAgICAgICAgICAgI1ggICggICAgICAgICAgICAgICAgCi1NKVtXXTQgIiAmIiREI09fX0tbXCAnITFAICEmT0tAIEQvIDAwICBQMCA7MERBICgkJCQgICEwISAmIiYwCi1NM1AgICAgICAgITdAICBAICAgICBEWUIgMCAgICAgIDMgICAjICAgICAhICAgIiwgICEgQSlYLiAxI1AlCi1NJCAiQ0AoISApKjQiJCI+RCBDICwkICdUS1osIkwoXkMgSyBHSSAoXiMhICFdICFAKiIkR0kgKFAjISAiCi1NKCAgICoiJCQwICAxICQgQCgyPkUgIlBEIUAoIiMhICIqKl5EICJARCAwKCIlJCQgIiheRCAiQFwhISAgCi1NKSgwICAiPkUgIlAsJCAoUCkgOCIgSl5AICIyL0kgIEgjISAiXSAgICAgIi9IQCBEICAgICAoXl8gIVBHCi1NTzAqUCBeICAiICAgICAgICAgICApW1dfWCpeXyAhUCwkICwuS1owICggUDAgUkAgICAgIENaMCAoIFAwCi1NITRQICAgICBDW1wgJyI+XSAiICNYICAoICAgICAgICAgICAgICAgICAgICAgIj5dX14iL0BIIFBLWyQgCi1NJipeUCAhMCBAKEBBS1tcICchMSAgICwgMCggQSQgICAlMCAgJCImL0NIIFAgICAgIChXLyAgICAgICAgCi1NJD4gICNQICAkIiYuITAgICAgICAgIChAKCIkLCQgJzcpQSAgISEhICAgLCAwIUBBJCAgICFAIUAkIiYuCi1NITAgICAgICAgITJAX188IigiIEEgICAwKDheXyAhUi9MICA0Q1skICYgL0AgIEBHTzAgQEQqKCAgKSIjCi1NICAgREkwICEkJCwgISIwJiAjVDAgICAsKSA4IC8yMCYgI1QgOCEgQSUkOCAgUjIkICAkI1ggICggKiAwCi1NKDkiQiAgIjBAUCAgKSo0ICAxISNfX0AgOCEgQSUmICAiICAgJCImMEtPX18gICAgICEzLiAgMCAgISBBCi1NIF4gICIgIkAkIiQgICEgQSBeICAiICAgICAgIEAhIEFAKkAgICMyLSAgLDEgICBEIDoxUChIIkkgICQgCi1NS0dAQCQyICAnUCAgICAiIEpAICIgICAgICElICAhSihLICAgQCpMICBZQkwgICwxOCAgNEooUCAgIiZECi1NX19WIVogICEoPlwgISEkICAhLEBBICAkQD5HX19AICAgICAxKCAgLiAgICAgKCdKX19cICAgICAkNCAgCi1NIjhHTF9fViFaUCAgRj5QICAhNUBfXyZMQyAgICBeICAiICAgICAgI1ggIChOKFAgIFoiKiAgKkBCMCAhCi1NIF4gICIqIiggICAgICAgICAgICAgIjAiIF5UICAgICwkLiAgIFAgICAgICgkIDUwICAgICAgL0AgIEAgCi1NICAgICkgKCNaUCAgICBQMFggICMgICAgICBAMCE1ICAgICAgIF4gICIgICAgICAwUCAgOiAoIFgoMSJECi1NICFAIEEwQEolIiAgIiJDISAhICBJQSBAICgoKCpBIEAgIDBIUDAgMCQgICA2UkMhICEgSFAwIDAlIiAgCi1NITAgICAgIFBIQCAjLCgsICBRISMgIEwgICAgICQsICAhUCAgICAgIElBQEFAKiggICIyRSAgJERBICAhCi1NJSovX18qIiJfX1wjWCAgKCAuIDAoMSEgICFARCAwICEkJCQgI1IwISAgKDAwMCAnICAgICAoIkIgICBECi1NSTAgISkoMCAgMjMmX19cMCAgIC5IKCtfX1gyQiAgIERJMCAiKSgwICBCMyZfX1gwICAgKEkoK19fSCJCCi1NICAiJEhQICFIKCggICIyRSAgLERBICAjKSw7X186MiNfX1hIUDAgQCUiICAlQkMhICEiLEhAICBDKiwgCi1NIShSSCAgQixKMCAsQypIICQoUksgITIsSyAgOEMqVCAnKlIiICAiTEBQICRLKEAgIipSKSAgUkxCQCAwCi1NSyhMICUqUiwgIUBESTAgQCkoMCAoIjMmX14gMCAvX0pLKFdfXyJDISAhIDQoICAuKiwkICEoUkIgICIsCi1NSFAgJEMqQCAiKFJJICBSTEBAICBLKCwgISpSKCAgQERJMCAwKSgwICQiMyZfXyAwIC9fUksoR19fIkMhCi1NICAwNCgvXlUgICAgIChSQiAgIERJMCAkKSgwICEiMyZfX1AwIC9fWEsoK19fIkMhICEgIElCQEAlIiAgCi1NITAiJigiIFBIQCAjLCgsICBRISMgIFQgICAgICQsI19LMCAgICAgREk/X18pKDNfX1AiRiYiLiBIQCAgCi1NKSo3X19SMiRfX1w0SF9fXEgoKCAgMC9AICBAIFghIEEkJCAgJiIwISAgLDAwMCAvKSAkICBBISEgIDwgCi1NICAgIEAqK19fUjJFX19cREEvX18pLDtfX1EgICAgWkBAQCAgQSorX19CMkVfX1hEQS9fXiksO19fQSAgCi1NICBCREBAICBAKitfX1gyQ19fVkBAT19fKSo3X18yMiRfX1REUU9fXUkoLCAgIkMhICIgNCggIDYqLCQgCi1NJChSQl9fUixIX19YQypDX10oUklfXyIsSk9fTEMqT19aKFJMX14yLEs/X0BLKCtfXypSI19fQkxCL19UCi1NSyhHX1wqUipfXlJMQl9fSEsoU19ZIjJFX14gREEvX0ApLDtfWCEgIF9eSkxDMCAgKiwkICQhMEAgIFhICi1NUDAgJEMqK19fKFJDX19CLEovX1RDKkdfXCpSIl9fUkxAX19YSyhDX10iMkVfXyBEQS9fUCksO19cISAgCi1NX18qTEIwICAqLCQgISEwQF9bLCAgICAgQyorX18iMkVfX1BEQS9fXCksO19fISAgX19CTEBAICAgICAgCi1NICAgICAgICAgICAgKSAoI1tAICAgIFAwWCAgIyAgICAgIEAwITUgICAgICAgXiAgIiAgICQiJDBAICAvCi1NKSAoICA4XiNAJiAgICAgIComJCAoISBAICBIRCBAICEgIC1QQCNQISQgICArQEBBKSYsICA6UEQgQiJPCi1NQFghQCBeICAiICAgJCIkRCBAICEgXiAgIiAgICAgIi9AWCFAKVtXX1gqXl8gIVJPTDAgOEtbICAlIUFACi1NICBcRDhPX18vIFwwICI3TyBCICAgRyIgLyEkMCAiOFEgQiAhU1ggQUNBQCAgICAgICAgIyAvQCkgICAgCi1NICI4MF9fUCIkMEBLJCIjX14wICAgICIvT1AgPENbICAlKF5RICFAI1ggICgpW1QgKCheLkAnIEdPP19ACi1NLyBcMCAqXlAgIUBFW1AwVS8hIDAgICcvIiJOT09QIDwlIiAgJDI4MCEjMFwmISAgQ1FAKyAgICAgICAzCi1NICAgJSAgICAgIFAwIFc4IiAiIEEkICAgIFAgICAgICwkIC0mIEAgQCg4XjlAJyBGJCAgMCBBRCgqUTBACi1NX18kICAgICBDW1wgJyheUCAhQCNYICAoKVtUICgiPl1fXUJPTCAgOCAoIiAoOl5fICFQNiAgICMpIC9fCi1NX1EgICAiNEQgT19fREAoICMgICAgICBQM0AiIyQ8ICAlIyE4ICBAUDNQICYpICQgIEE3QSAgOCAgIUBBCi1NIyEgIz1AKCAoIiQwICAgIiAkIDgoMCAgJiImMiEgIC0jISAiXSpeQyAiMi9IUCBEISQkICBAICAgICBECi1NIF9fX0RAKCAjICAgICAgUDYgICgkUCAgIUAgICAgIi4hICAoIyEgJiZKXkMgIjIvSFAgREtAICAiKFg5Ci1NICBCQiAgICxLQCAgICAhQCQiJk4mMCAkQ1tcICcoXlAgIUAjWCAgKClbVCAqIj5dX14iT0wgIDggKCIgCi1NKDE4ICAhLk9PUCA8Q1haIDwjUC8kICBFW1AwVS8hIDAgICcvIiJMNCggICopQSAkLSEoICAgLCAgICAgCi1NIyEgIz1AKCAoIiYvRighUClBICAkICg4IiJMNCgvX1ggICAgICEgICAjQCAgISBBREAsICMgICAgICBQCi1NOEAgIiUkICAjIyFIICAyLiEwICBEQDAgIzIwJiAgJCwkIDlQICA0SChYWDkgIEJOICAgICAgIDAoMSAgCi1NICJGTiYwICQsJkAgISE0ICAiIFA7MCBAJCQgICdDIU0gIiIuIEAgKCAgICAgISEgICFIUDswIEBDQEQgCi1NISAgICAgICAyMEBLJCIgICUzIU0gIiAsJCAxNCBAIEAoOSgjICBQICAgICAsJkggISE1ICAgWFA7MCBACi1NLCZMICBBJUAgIExQOzAgQENAKCAiICAgICAgMDAgICcsJlQgKChYLCAgMCAgICAgICRQKCpRMEBfXlggCi1NICAgICwmVCAoISZAICAwICAhQEEkICAgIEIwI19fXCAgIUBBICYgMCg4Xl8gIVIvTCAgOCBeICAiIj5dCi1NICIgR08/XlBLWyAgJypeXyAiUk9MUCBIICoiICg6XlIgIjJPTDAgQEtaMCA0KSgjICBQRCQwISIpISggCi1NIUIwMyAgKFA7QCEyJUJYICkzIUwgIToyI1AgLS8hRDAgICAvUCggIy4sQEFDU0QiSChYIiAgMCAgICAgCi1NICVEKCpRIEAgJFwgICAgIENaQCA0IjAhICBKQDIgICBDQEQgISAgICAgIEUqQCAhS0BIICEpLksgJSwgCi1NICAgICQ2JCAhICAgICAiL0hAITAkICAgOCheXyAiUCwkIDE0IEAgQCgyMCFfX1w0MDAgJENaLCA0ISAgCi1NICAsRCBfX19DWiwgNCAgICAgIDAgICE0ICYgMCgzIUwgITg2MyAgNCwnQCAkSF5NICUgR0kwISxIWlQgCi1NMykoJCAgVk4gICAgIyEgJj4iMCYgICREIDAgISUkJCAhICAgICAiL0hAITAkICAgMTheXyAiUjIjQCAsCi1NKSArX19TNy8gIiAwICAgX0hAXCAjIyFYICEoNj4gIDAgICAgIChYIiAgQCAgICAgJCQgICMgICAgICIuCi1NJjAgJCAgICAgITE5ICBQICAgICBDQEAgICAgICAgIDUgICAoICAgICAjIUkgJDA1KCAgJiAgIDgoMFAwCi1NISlIIiAiIEEkICAgIEAhICYiJCAgIUBBJCYgICBQICAgICAwICAgRCkgK19fWSgjICBQICAgICAsJkggCi1NMSE1IF9aPFA7QCEyIyEgJDUgKCAoIiYuIEAgICAgICAgIjEiX19cJDAwICZLQCggICkuRCAlLCwkIC8oCi1NIEAgSCgxICAgIEoyI1AgLENaTCA0KFgsICAwICAgICBIOEwgIChYLSAgMCAgICAgKTpYICA6WC4gIDIyCi1NI1AgLCAgICAgIydYICIgMyAgICRDWiwgNCEgICAgLEQgX19fQ1osIDQgICAgICAgOCEgQUNbXCArKF5QCi1NICFSL0wwIEBDWyggKSheUyAiQCNYICAoKVtUIDQiPl1fXiJPT1AgNCAoIFgoOFNDICBCMFtQICxDLlggCi1NISAhQCoiJFFeICEkSy40ICEhLCAgIEAhUTMgQ0QvRCAjM1ApJCAgRSowKkAgIUUgQCAkKSgiJDAgICAqCi1NSy4gICApI0ogIFRcIyEgICk4UCJIICAqNiggITsiIEFDKFQgICAgICAgICFIUSBDSy4oICAoU0IgICAgCi1NICAgICEkJCAhICEgJiIkMCAgICIgICA4KDAhICYiJixDQCAgQy5cICEgICAgICAhU1wgQyBQLCgqQSBACi1NICBIICAgICBLWjQgJypeRiAhQCBYIiBBIyEgJS1KXkcgIiIvSTAgPENaOCAmKF5HICIgICAgICAmLCAgCi1NI1AgICQiJjBZICAtS1o8ICggUDAhR0JPSUAgOENaOCAmKF5HICIgMFBAICcgICAwKDkjWSAgUEQgT19fCi1NLVJAICghICAgICpAWiAgLCAgIDAoOF5fICEwR08wIEAgXiAgIiAgICAgIEdPP19IS1tcICUpIiIgIFBECi1NIDAgIiwkWCAkQSchICBQICAgICAsJFwgQEE3QCAgOEQgP19PIyEgJkBSMCQgIEQwICAgUikgK19fUjAhCi1NX15cIDA8IEQtUUQgIEoiOSAgUixAUCAoICAgICAhMUAgIDwgICAgICMhICRXOl5EICFCL0kgIDggICAgCi1NIChSIyAgQCAgICAgQyhAICEgICAgICA0OiAgQCAgIDAoOSIpICBQICAgICAsMkggMSE1ICAhTCAgISBBCi1NRChMICMzUC0kICBFSzAqQCAgTUBAICYtKiImLEtAICAgICAgICAnIz4iLkxDUCAgQygoICAgICAgICAkCi1NMDAgJCAkIDgoMSAgICAoICAhQEEgJCA4KDhSWCAgIixGMCAkICAgICAgLDkwIiwhIFBASiQiICAhICAgCi1NJCIkLCQgNFYgICAgICAgICQiJi9PUCA0KVtUICYgL0AgIEAgICAgIClbV19YKl5fICEwIEAiQEFEKlggCi1NIykiQyAgVFFTUCAkJD4gICMgIUAsIiRcJjEgIClTRUAiICAmUCwgIyYxIEEgIC0oQCNQISQgICAqMEBBCi1NSyooICIiMSggIEAwICAgVEsiQCJIIkMhICAoMCggIDMgICAgICEzICAgOCAgICAgLyAsMCAiMUMkICJMCi1NSFAgKCQgICAhMCFAJCIkXCBRICApJi0gICpSQyAgQCA4ISBBRCpMICMzUCEkICAgIlYiICAiUCgoMjEqCi1NKCAgMCAgID9LIkgiSCpeRSAiIEQhIiAoIyEgJTUqXkYgIVIvSTAgQENaOCAnISEgICBSTEhAIChEKlQgCi1NIykiWSAgVixLUCAoLyAkMCAjNk4gIEAgJjQiIEgqWCAjICBIIiIkRV4iICAkICAgIypQWCBKIFwiUSAgCi1NRCpQICMyNUs4IEAgIURDICAyTDAoM1AhJCAgICMmQiAgIlQoKDpSQiAgQEQyQCAoSyJIIkgoUk4gIEAgCi1NUCIgQUsqWCAhIFAwIUhCT0kwIEBDWjQgKCEhICAgRi9PUCA0RCooICMgICAgICBQM1AgJCU+ICAhKF5fCi1NICEwVDYwISBIK0QgIyheXyAhMEdPMCBAIF4gICIgICAgICIwQ0AgLS8gLDAgICAuPiggIDtRQEFDJiwiCi1NSChSOCAgMCAgICAgICdAMChQMSEgICwgICAgICBeICAiKlIjICAyLEYwICAgICAgICAhOSIiSDAoICAiCi1NICAgICAqUiIgICAjWCAgKCAgICAgICAgICAgICAgICApICgjWjAgICAgUCNYICAoICAgICAjUCEkICJMCi1NKEBQOCBeICAiIjAiX19cR08/XkhLWzggKypeUiAhUk9PUCBUS1s8ICwqXlUgIkIvQ0glUEtbMCApKl5TCi1NICIiT0wwIDggKCIwKDpeUCAhMDFQICAkICAiUCg4XiVAODAwICAgKylZNiE8Ij4iQDcwR0U4JVBLWCohCi1NPyMxLyAgJk9DWCVQLUtAICAwKkAuIiZPRiglVCAkIEgoOl4nQDdCL0FYJVgpIT9fX1IwNF9fWCBYKEBBCi1NICAgUCg4WEMgICAgICAgICAmIDAoMyE5ICAkNyggID0gQiIgKDAhQEAiJi4gQCAgKUQwICFQICQoKChQCi1NMiAgISUwICAjQCAkKCggIigjQEFLWD4hPiEyUCAgKk4oQCAgIEIgSCg4WEMgICAgICAgICAmIiAoOFgiCi1NICAgICAgICAsJEQgIDEkQF9fOCAgICAgIEIwMCgwKCIiIkw0KCAgIyAlJCgqUSBAICZIICAgICAgJiAwCi1NKDAoQEAiJCA1KEBEIEEkKCpRMEBfXUwgICAgIENYSiE/ICAgICAgMiJAICMgICAgICEgICAgMk9BOCYkCi1NJEM0ICEyMyYgICZPQTgmJCQgICA6UCAgJCIkRFFAICErLCQgIEEwQF9cUCAgICAgKUQsICFQICMmKCpPCi1NSFAgWCAqIigoMCAgKCIkLCQgOkBLWDYhQSheK0A3Ui9IUCBYKTZQICEhISwgIFAgMCggQSkmOCdfUCAmCi1NLEwoUDEgICMkKCAgJCAgJixUIEQjMCAkIDowOChQIUBMIiQgMFggQSQgICAiQCM2LCImL0E4JiRDWFohCi1NPyAgICAgICFRN0BDICBfIEBQIVgsIixEUUBAICAgOFJQQCAmLFQgIiFMQEEgUyAoKlEgQCAgMFwgN19fCi1NJCAgIDAwICAkIiRcIDdfXy0iJ0AgMCMhIiJMNCggIC0gLCI4KDNQJD9fXFRBLiAgIyEgJkgqXkYgJEIvCi1NSUAhKCUlPCAhI1AhQCAgMCAgIFMgICAwKDNQIUAgIFQoMiAgICwkUCgwUDAhSiAgUCIgQSUlPCAhMCAgCi1NICAgLCQgOkwgQCBAKDEgICAiQCAgISBBQ1hCIT8gKDMyIiQhLUUgQyk0T19fKlQwICAiTiJQICBDWFIhCi1NPyAoICoiJEVDMCAkJEBUICEzOkIgICYtQ0AgICAgICAgIzcvICAmTUNQICBDQUAgICAgICAgIk9GKCVcCi1NQ1lGIT8hICBfVz5PKEAgICAkIFgoMCNQIiJMMCggICYtLkQgIDhTSCAgICAgICAgS1hCIUAqU0MgICBUCi1NWjAgISQrJCAhKlhJICAiT0FYJVgkICAgISpeJUA4MCBYIkBBS1g2IUEqXidAN0BGKEAgJENbXCAtKF5QCi1NICEyL0wwIDhDWyggJyheUyAiIi9NICBEQ1s0ICooXlYgIlIvTVAgUCBeICAiIj5dICVAMEAgIC0gKCAwCi1NKDIyIl9fUk9ASCVYQyRYICAiMCFfX1ghUDdAREskXCAgKFE5ICAiL0YoJVwgICAgICE8OSAgKCAgICAgCi1NS1gqIUEgL0AgIEAgICAgIClbV19SKl5QICFAIEAoIEEkQCAgLipeXyAhUi4gT19cICAgICAjIS4gICQxCi1NUCAgKCAlIDgoUCggKCIkLCQgODpLWjQgLyheRSAjUi4gT19cICAgICAgITAmIiwgIFFCI0taLCApICJACi1NKCIkLCQgNTRLWjQgLyheQyAiMi9JMCBcJCQgICEwISAoIiQwNCAgIyAgICAgITJAICAwRElQICMkICAgCi1NKDAiICQiJERJUCAjICA8WEBAI0MiIkwwKCAgIiAgICAgICNAJiImT0kgIFQgQCBIKDAgIywoICwkIChQCi1NS1o8ICgoXkQgIzIvSVAgQCAlICgqUSBAICEgICAgICAgID1YQCAhLyYiJCA8IEBLJSIgICJQICAgICAgCi1NPCxAQyAhRSBAWF44QDggICIkQiAgJEUwKDEgICAgMk02ICAgIyEgJTUgIkAoIiQgMCIgQSAoIDAoOF5fCi1NICFSL0wgIDggXiAgIiI+XSAjQCAgICAgICAgICAiMCIgX0wgICAgLCQuICAgUCAgICAgKCQgNTAgICAgCi1NICAvQCAgQCAgICAgKSAoI1sgICAgIFAwWCAgIyAgICAgIEAwITUgICAgICAgXiAgIiAgICAgIi9ASCY4Ci1NIF4gICIgICAgICJPQSgmOCBeICAiICIgJCIkICAgICAgICAgICI+XV9bIk9PUCA8IyEgJkAqXkQgJSIvCi1NSSAhMEtaKCApIjAlNSBALCQgOlwpWjggKiAxISAgPEQgQCAhQ1owICkgUDAhSCwgICAgICQgICAgQCAgCi1NJCIkRCBAICFDW1wgJyI+XSAlICNYICAoICAgICAgICAgICAgICAgICAgICAgI1AjJCAiLDhQSiQpICgjCi1NXjAiIygiJCAgICAsJS4gICEjUCEkICAgOCEgQSBeICAiKlBEIkgwKCQgNTAgICAgICNQIiQgIiwwQEogCi1NICAgICAgIiIiIkwwKCAgIiAgICAgICEgKCIkRCBAL1kgICAgIyEzQF9fMFwgMSAgSyIwKkEgL0AgIEAgCi1NICEgQSAgICAgICAgICAgRCBAMD4gICAgIyEjQCAgLCAgICAgIiEgJTQgICAgICAjWCAgKCAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICNYICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICgiIEAoIiBAKCIgQCoiQEgqIkBAKCIgQCgiIEAoIiBAKCIgQCgiIEAoIiEoJCEgMCQhIDAkISAwCi1NJCEgMCQhIDBBKDIkQSgyJEEoMiRBISAwJCEgMCQhIiFAOCYhQDgkISAwJCEgMCQhIDAkISAwJCEgMCQhCi1NIDAkISAxIDAkISAwJCgqIkBIKiJAQCgiIEAoIiBAKCIgQCgiIEAoIiBAKCIgQCgiJCEgMCQiICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAoIyEgNCYhUEApCi1NIkBMLCMwWC8kISQyJFEwNSVBPDgmMUg7JyFUPidSIEEoQixEKTI4RyoiREoqUlBNK0JcUCwzKFMtIzRWCi1NLVNAWS5DTFwvM1hfMCYlQjhWMUU5Rj1IOjZJSzsmVU47VyFRPEctVD03OVc+J0VaNlVRPTdFXUAwNCkjCi1NMSQ1JjFUQSkyRE0sMzRZLzQlJTI0VTE1NUU9ODY1SVs/J1VeP1AgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISMyJSkjMyQlMzRQICAgICBPOyZFQitWLUg8Ri1MCi1NODctUytQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgISAgOCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAkICAgICAgICAgICAgICAgICAgICAiIDAgICAgICAgISAgOCFAMCAmIDghQCggCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICo9ICQgIkcwICAgCi1NICAgICAgICAwJkQgICAgICAgICAgICAgICAgICAkKyggICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgIDAgICAmJVM4VkVJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICQgICo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgIDwgRCIiQCAgIUQgICAgKyAgICBQOCAgICAgICAgICAgICAgIC0gICAsUiAgICAkWSAgIF1MICAgCi1NICAgICAgICAgICAiJFAgIDMlUCAgIEEsICAhNEogICAhQjAgICVTVCAgICAnQCAgOFFAICAgITwgICFLCi1NQiAgICAoPCAgJlNYLC8gQFgjIDAwLSEgVCQgMCgqIiEgITkgXCMgMCQhJUBQJSBBKCEgMCgwNCUhMDQlCi1NITA0JSEwNCUhMDgnLCEkMSgxJDEoMSQxKDEkMShBLFIkQShCJEEoQiRBKEIkQShCJSIkMSQyJDEkMiQxCi1NJDIkMSQyJDEoMSQxJDIoQiRQJCEsLSIgICBCUDYoLCAiMSQwLC8gNCRBMEY1ISBCKTAmICAgWiBfXyohCi1NICBcMiRQNFBYIyQ3JSEkOCAhPDIkMUAhJDEpMDghIDAkISAwJCEgMCQhIDAkISAwJCEgUCQhIDAkISAwCi1NJCEgMCQhIDAkISAwJCEgUCQiIDAkISAgJCEkMSQwIDAkMSQxMC8gQSxBIDIkOCggIkEgMCQ3JDAoISBACi1NJC4hIFwoJCAiQSgyLCEgQCQhIzA8ISBAJCEjMDwhIEBcIyAwWCgoICMhIDAkISAwJCEgMCghIDAkISAwCi1NJCkiICAgRDAkLSFSJCEgMCQiIDAkLSEwJCEjMDxBIDAoISAwVCggICQsISBUJCAwJDckMCQhIEAkIiAwCi1NWCQjUEAwICokQShQJCIgMCQtIVAkIiAwJC0hUCQiI1AsISNAQEAgLCQhIDAkISAwJCEgQCQhIDAkISAwCi1NRCggICIxIDBUJygwJCEgMCghIDBUJSAwJC0hUiQhIEAkISMwICEgMSQyJDYlIShCISI8NyUjIzAsLSBSCi1NVCMmJCAgSDMsMTAzIFQjMDAxMEMkUiA1JCIkMiRRISBYISBAXCEsIiwtIVYkUjhUKSIjUCg/ISghIUAoCi1NICFAISIgKTImICBIIDEoOCAzKDAoLiBAXCEwMiQhI1AkLyFIIiA4MSUjJDgiIkAnIEQgQFgyI1AkLiBICi1NIUFAKCEhQCAkISNQJC8gVCAxMDIkMSRDKFE0OCYhQCYpICkgVCMnMDIhI1AsQkAoLVIgMlwhI1AkMSNQCi1NLiAkQCQvIDggISQzLiAgMSUhIDEgISlBPC8gJTwpMVBUIzBQWDEgQFgjIDEwQSA1JiQjUCQhPDYoISAwCi1NJEJAQSRRJSBcISgwXCEnUDwxJ1AoQSBQWCIgVyhRJSNcIjgxKEIsMSQ0ISJQJCAwRCcoMyRBIEBYJCBCCi1NJEEgQCguIEUmICkgVCckUyUzJCJAICApQC9fV0EgICslMSQ1KC4gQyQyMDAlQTw0JC8gUiUgIDAkMSQxCi1NICEgMSQxJSIwIiQhMCwhMFwhMEIkMjBBKC8gQCQyI1AkMiQzJCIgMCQxJDEgISAxJDEkICAgICAgICAgCi1NIEAgICAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICFAICcwICAgICAgLiAgICAmPCAgICAgCi1NICAgIDogICAgIDAgICAgOiAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgKCggCi1NICAiJCAgICAmQCAgICcgICAgICYgICAgJyAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9Ci1NICFcICAgIi8gICAgRFAgICAhTCAgICFcICAgICIgICAgIVwgICAgICAgICAgL19fX19cICAgICAgICAgCi1NICAgICAgICAnMCA/ICAgIEdAICAgKiAgICAgPiAgICAgICAgICIkICAgICAgICAgICAgICAgI19fX19fCi1NICAgICAgICAgICAgICAgICAhVCAnUCAgICdEICAgIVkgICAgICAgICAhQCAgICBFICAgICFAICAgICAgCi1NICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICFaICAgID5AICAgICQgICAgUCAgICAqMCAgCi1NICBQICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICA+UCAgICdMICAgICIgICAgCi1NMiAgICAiVCAgICAyICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAnVCAgICFdCi1NICAgICBQICAgJiAgICAgUSAgICAmICAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgCi1NICAhXiAgICA/QCAgICAwICAgIVggICAgLTAgICAhWCAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgCi1NICAgICcwID8gICAgP1AgICAnXCAgICAlICAgIEQgICAgI0QgICAgRCAgICAgICAgICAjX19fX18gICAgCi1NICAgICAgICAgICAgICFUICdQICAgKCQgICAiISAgICAhQCAgICpAICAgIF0gICAgKkAgICAgICAgICAgCi1NX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIiIgICAgQEAgICAgPCAgICMgICAgIDAwICAgIyAgCi1NICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgIEBQICAgKCwgICAgKCAgICBWICAgCi1NICQ0ICAgIFYgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICg0ICAgIiUgICAgCi1NIjAgICAvICAgICEpICAgIC8gICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICImCi1NICAgIEFAICAgIEggICAkKCAgICAzMCAgICQoICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgCi1NJzAgPyAgICBBUCAgICg8ICAgICsgICAhKCAgICAlJCAgICEoICAgICAgICAgICNfX19fXyAgICAgICAgCi1NICAgICAgICAgIVQgJ1AgICAoRCAgICIpICAgICMgICAgM1AgICAhNSAgICAzUCAgICAgICAgICBfX19fCi1NX1AgICAgICAgICAgICAgICAgID0gIVwgICAiKiAgICBCQCAgICBUICAgJTwgICAgQTAgICAlPCAgICAgCi1NICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgTEAgICAvPCAgICAuICAgICAgICAgICQgCi1NICAgICAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgICggICAgIiAgICAgICAgCi1NICAgICAgICIgICAgICggICAgI19fX1VMX19fX19QICAgICAgICAgICAgICJMICA9ICFcICAgIT8gICAgCi1NQFAgICAgICAgICAgICAgICAwICAgICIgICAgIF9fX19fL19fX19cICAgICAgICAgICAgICAiICAnMCA/Ci1NICAgICcwICAgIlggICAgICAgICAgICAgICAkICAgICBAICwgIC9fX19fU19fX19fICAgICAgICAgICAgCi1NICAgQCAhVCAnUCAgICFYICAgIEYgICAgICAgICAoUCAgICAjICAgIChQICAgICAgICAgIF9fX19fUCAgCi1NICAgICAgICAgICAgICAgPSAhXCAgICBTICAgIC4wICAgIEQgICAgICAgICAgMCAgICAgICAgICAgICAgCi1NIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICA4QCAgIClIICAgICAgICAgICAgICAgJCAgICAgCi1NICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAgWCAgICAyICAgICAgICAgICAgCi1NICAgISAgICAgICAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAgLiAgICAkQCAgCi1NICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgCi1NKiAgICAyWCAgICAgICAgICAgICAgICQgICAgICAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgCi1NICFUICdQICAgIFggICAgMyAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgX19fX19QICAgICAgCi1NICAgICAgICAgICA9ICFcICAgIDcgICAgJyAgICAgICAgICEoICAgICEwICAgISogIFAgIF9fX19fL19fCi1NX19cICAgICAgICAgICAgICAiICAnMCA/ICAgICgwICAgIjQgICAgJCAgICAgICAgICAkICAgICBAICQgCi1NIC9fX19fU19fX19fICAgICAgICAgICAgICAgQCAhVCAnUCAgICJIICAgIF0gICAgICAgICAnQCAgICAjCi1NICAgICdIICEgICNfX19fVF9fX19fUCAgICAgICAgICAgICAgKiAgPSAhXCAgICEuICAgIDkwICAgIFggCi1NICAkWCAgICAhMCAgICRaICAwICBfX19fXy9fX19fXCAgICAgICAgICAgICAgIiAgJzAgPyAgICA8QCAgCi1NIChEICAgIEIgICAiQCAgICAgPCAgICJAQCBcICAvX19fXVNfX19fXyAgICAgICAgICAgICAgITAgIVQgCi1NJ1AgICApSCAgICJaICAgIC0wICAhKyAgICAgKSAgICErKCAgICAjX19fX1RfX19fX1AgICAgICAgICAgCi1NICAgICggID0gIVwgICAjMiAgICBXQCAgICU4ICAgNyggICAgIlAgICA3KiAgICAgX19fX18vX19fX1wgCi1NICAgICAgICAgICAgICFAICcwID8gICAgWkAgICAvQCAgICFLICAgJlUgICAgIFQgICAmVUAgICAgL19fCi1NX18zX19fX18gICAgICAgICAgICAgICBAICFUICdQICAgMCwgICAkOyAgICA+ICAgIiNAICAgIC8gICAiCi1NI0AgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgJEkgICAhLCAgICApNCAgICAgCi1NICAgICAwICAgICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgICNAICAgIFwgCi1NICAgICAgICAgICAgICAkICAgICAgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgCi1NICEkICAgID4gICAgICAgICAgICAgICAmICAgICAoI18gICNfX19fPF9fX19fUCAgICAgICAgICAgICAgCi1NNiAgPSAhXCAgICFEICAgIFEwICAgICAgICAsOCAgICAiICAgICw8ICAgICAgICAgIC9fX19fXCAgICAgCi1NICAgICAgICAgICAgJzAgPyAgICBTICAgIC1MICAgIS4gICAjNiAgICAgSCAgICM3QCAkICAvX19fXjNfCi1NX19fXyAgICAgICAgICAgICAgIFggIVQgJ1AgICAuOCAgICQhICAgIDUgICAgICAgICAgISAgICAgICAgCi1NICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAgLiAgICAkQCAgICAgICAgICAgICAgCi1NIDAgICAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgI0AgICAhKCAgICAgCi1NICAgICAgICAgICQgICAgICAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgIVwgCi1NICAgQyAgICAgICAgICBQICAgICMgICAgIFAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9Ci1NICFcICAgIEogICAgLCAgICAgJCAgICAgICAgICAwICAgICIgICAgIF9fX19TL19fX19cICAgICAgICAgCi1NICAgICAlICAnMCA/ICAgICdAICAgIkAgICAgICAgICAgICAgICAkICAgICAgICAgICAgICAgI19fX19fCi1NICAgICAgICAgICAgICAgICAhVCAnUCAgICE8ICAgID8gICAgICAgICAjICAgICAkICAgICJQICAgICAgCi1NICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICBFICAgICtQICAgIEAgICAgICAgICAgMCAgCi1NICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICAjQCAgICEoICAgICAgICAgCi1NIDAgICAgIEwoICArICAgICMgICAgICAoS19fXyAgICAlMCEgIDwgOCggICIgICAgJTAgICAmQEAoICAiCi1NICAgICcwISAgQkA4KCAgJiAgICAnMCAgICBAQCggICQgICAgKjAhICBDIDgoICAqICAgICowICAgIFBACi1NKCAgJiAgICAsMCEgIENQOCggIC4gICAgLDAgICAgQEAoICAoICAgICAwICAgICBAKCAgICAgICAgMCAgCi1NICAgTCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgCi1NIDAgICAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggIiogICAgMEAgICAhQUk4ICApCi1NICAgIDJQICAgICBFOCAgKCAgICA2MCAgICEgRTggICMgICAgOiAgICAiIEU4ICAkICAgID0wICAgJCBFCi1NOCAgJSAgICBAUCAgICYgRTggICYgICAgREAgICAoIEU4ICAnICAgICAgICAgICBBOCAgISAgICBIQCAgCi1NICFBSTggIDEgICAgSVAgICAgIEU4ICAoICAgIE0wICAgISBFOCAgIyAgICBRICAgICIgRTggICQgICAgCi1NVDAgICAkIEU4ICAlICAgIFdQICAgJiBFOCAgJiAgICBbQCAgICggRTggICcgICAgICAgICAgIEE4ICApCi1NICAgIF9AICAgIEFNOCAgOSAgICEhQCAgICAgRTggICggICAhJSAgICAgIEU4ICAjICAgIShQICAgICBFCi1NOCAgJCAgICEsICAgICAgRTggICUgICAhL0AgICAgIEU4ICAmICAgITMwICAgICBFOCAgJyAgICAgICAgCi1NICAgQTggIDEgICAhNzAgICAgQU04ICBBICAgIThAICAgICBFOCAgKCAgICE8ICAgICAgRTggICMgICAhCi1NP1AgICAgIEU4ICAkICAgIUMgICAgICBFOCAgJSAgICFGQCAgICAgRTggICYgICAhSjAgICAgIEU4ICAnCi1NICAgICAgICAgICBBOCAgOSAgICFOMCEgIEUgOCggIicgICAgICAgICAgIDwoICBEICAgICAgICAgIEBACi1NKCAgQiAgICFOMCAgICFAQCggIEEgICAhUTAhICBGQDgoICIpICAgICAgICAgICA8KCAgSCAgICAgICAgCi1NICBAQCggIEYgICAhUTAgICAhQEAoICBFICAgIVYgISAgSCA4KCAiKyAgICAgICAgICAgPCggIEwgICAgCi1NICAgICAgQEAoICBKICAgIVYgICAgIUBAKCAgSSAgICFbMCEgIElAOCggIi0gICAgICAgICAgIDwoICBQCi1NICAgICAgICAgIEBAKCAgTiAgICFbMCAgICFAQCggIE0gICAhXkAhICBLIDgoICIvICAgICAgICAgICA8Ci1NKCAgVCAgICAgICAgICBAQCggIFIgICAhXkAgICAhQEAoICBRICAgIiNAISAgTEA4KCAiMSAgICAgICAgCi1NICAgPCggIFggICAgICAgICAgQEAoICBWICAgIiNAICAgIUBAKCAgVSAgICIpICEgIE4gOCggIjMgICAgCi1NICAgICAgIDwoICBcICAgICAgICAgIEBAKCAgWiAgICIpICAgICFAQCggIFkgICAiK1AhICBPQDgoICI1Ci1NICAgICAgICAgICA8KCAhICAgICAgICAgICBAQCggIF4gICAiK1AgICAhQEAoICBdICAgIjAwISAgUSA4Ci1NKCAiNyAgICAgICAgICAgPCggISQgICAgICAgICAgQEAoICEiICAgIjAwICAgIUBAKCAhISAgICI1MCEgCi1NIFJAOCggIjkgICAgICAgICAgIDwoICEoICAgICAgICAgIEBAKCAhJiAgICI1MCAgICFAQCggISUgICAiCi1NODAhICBUIDgoICI7ICAgICAgICAgICA8KCAhLCAgICAgICAgICBAQCggISogICAiODAgICAhQEAoICEpCi1NICAgIj0gISAgVUA4KCAiPSAgICAgICAgICAgPCggITAgICAgICAgICAgQEAoICEuICAgIj0gICAgIUBACi1NKCAhLSAgICJCMCEgIFcgOCggIj8gICAgICAgICAgIDwoICE0ICAgICAgICAgIFBAKCAhMiAgICJCMCAgCi1NICFQQCggITEgICAiRUAhICBYUDgoICJBICAgICAgICAgICA8KCAhOCAgICAgICAgICEgQCggITYgICAiCi1NRUAgICAiIEAoICE1ICAgIkkgICAgKUFJOCAhPiAgICJKMCAgICAgRTggIkYgICAiS0AgICAiIEU4ICJJCi1NICAgIk1QICAgJCBFOCAiTCAgICAgICAgICAgQTggITkgICAiTzAgICApIU04ICFDICAgIlEwICAgICBFCi1NOCAjJCAgICJSQCAgICAgRTggIycgICAiVFAgICAgIEU4ICMqICAgICAgICAgICBBOCAhPiAgICJWMCAgCi1NICAxUTggIUggICAiV0AgICAgIEU4ICNCICAgIlhAICAgICRFOCAjQyAgICJaICAgICAoRTggI0QgICAgCi1NICAgICAgIEE4ICFDICAgIlswICAgIDFROCAhTSAgICJdICAgICAgRTggI0sgICAiXlAgICAgJEU4ICNMCi1NICAgIyBAICAgIChFOCAjTSAgICAgICAgICAgQTggIUggICAjIVAgICAgMVE4ICFRICAgIyMgICAgICBFCi1NOCAjVCAgICMkQCAgICAkRTggI1UgICAgICAgICAgIEE4ICFNICAgIyVQICAgIDFROCAhVSAgICMnICAgCi1NICAgRTggI1wgICAjKCAgICAgJEU4ICNdICAgICAgICAgICBBOCAhUSAgICMqICAgICAxUTggIVkgICAjCi1NKzAgICAgIEU4ICQkICAgIyxQICAgICRFOCAkJSAgICAgICAgICAgQTggIVUgICAjLiAgICAgIEk4ICQmCi1NICAgIzAgICAgIDFROCAhXiAgICMxQCAgICAgRTggJCwgICAjMyAgICAgJEU4ICQtICAgICAgICAgICBBCi1NOCAhWiAgICM0MCAgICAgSTggJC4gICAjNkAgICAgMVE4ICIlICAgIzkwICAgIChFOCAkNCAgICM6MCAgCi1NICAkRTggJDUgICAjOzAgICAgIEU4ICQ2ICAgIzxAICAgICxFOCAkNyAgICAgICAgICAgQTggIV8gICAjCi1NPiAhICBaUDgoICQ4ICAgICAgICAgICA8KCAiKCAgICAgICAgID0gQCggIiYgICAjPiAgICA+IEAoICIlCi1NICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgJSAhICE5IDgoICAtICAgICUgICAgIEBACi1NKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICIxICAiTCApS19fXyAgICAlICEgCi1NITogOCggIC0gICAgJSAgICAuUEAoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgCi1NI0AhICFJIDgoICAtICAgICNAICAgIzBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAmCi1NICAgICJAISAhTSA4KCAgLSAgICAiQCAgIChQQCggICEgICAgJDAhICFVUFgoICAvICAgICQwICAgJzBACi1NKCAgIyAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICApICAgICNAISAhXSA4KCAgIiAgICAlMCEgCi1NIiFANCtfX18gICAgKEAhICImIDQrX19fICAgICowISAiJkA0K19fXyAgICAsICEgIiZQNCtfX18gICAgCi1NLVAhICInIDQrX19fICAgICNAICAgKkBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAlCi1NICAgICMwISAiKCA4KCAgIiAgICAkUCEgIilANCtfX18gICAgIzAgICAiIEAoICAhICAgICAwICAgICBACi1NKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgCi1NICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICMwISAiKiA4KCAgIiAgICAkUCEgIitANCtfX18gICAgCi1NIzAgICAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggIDkgICAgIzAhICIsIDgoICAiCi1NICAgICUgISAiLyA0K19fXyAgICAnUCEgIjBQNCtfX18gICAgLDAhICIxQDQrX19fICAgIC9QISAiMlA0Ci1NK19fXyAgICAwUCEgIjMwNCtfX18gICAgNDAhICI2MDQrX19fICAgIDcgISAiN1A0K19fXyAgICA5UCEgCi1NIjlANCtfX18gICAgPCAhICI5QDQrX19fICAgID8gISAiPzA0K19fXyAgICBCICEgIkMgNCtfX18gICAgCi1NRFAhICJFMDQrX19fICAgIEdQISAiRzA0K19fXyAgICBMQCEgIkhANCtfX18gICAgUCAhICJKMDQrX19fCi1NICAgIFNAISAiTTA0K19fXyAgICBWMCEgIk5QNCtfX18gICAgWSAhICJQQDQrX19fICAgIFtAISAiUEA0Ci1NK19fXyAgICBeUCEgIlYwNCtfX18gICAhIiAhICJaIDQrX19fICAgICMwICAgUDBAKCAgISAgICAgMCAgCi1NICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICNAISAiXSA4KCAgIiAgICAlMCEgIl5ANCtfX18gICAgCi1NI0AgICAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICggICAgIkEgICJOIClLX19fCi1NICAgICRRICAgQiAoM19fXyAgICAnQCEgIl8gOCggIC0gICAgJ0AgICAkQEAoICAjICAgICkwISAjI0A4Ci1NKCAgLyAgICApMCAgICZAQCggICUgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgMiAgICAiQCEgCi1NIyogOCggIC0gICAgIkAgICAnQEAoICAhICAgICRQISAjMUA4KCAgLyAgICAkUCAgICwgQCggICMgICAgCi1NJkAhICM9QDgoICAxICAgICZAICAgNEBAKCAgJSAgICAoMCEgI1IgOCggIDMgICAgKDAgICBDIEAoICAnCi1NICAgICowISAkNSA4KCAgNSAgICAqMCAgIDFAQCggICkgICAgLEAhICRGQDgoICA3ICAgICxAICAgMFBACi1NKCAgKyAgICAuQCEgJFcwOCggIDkgICAgLkAgICA2MEAoICAtICAgIDBQISAlLUA4KCAgOyAgICAwUCAgCi1NICUgQCggIC8gICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAjICEgJTMgOCggICIgICAgCi1NIyAgICAhIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgI0AhICU0IDgoICAiCi1NICAgICNAICAgISBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAiICAgICAwICAgICBACi1NKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgLSAgICAiQSAgCi1NIl8gKVNfX18gICAgJDEgICJfQClTX19fICAgICYhICAiX1ApU19fXyAgICAnUSAgIyAgKVNfX18gICAgCi1NKUEgICMgMClTX19fICAgICtQISAlNSA4KCAgLSAgICArUCAgIFFAQCggICYgICAgLUAhICYmQDgoICAvCi1NICAgIC1AICAgJCBAKCAgKCAgICAuUCEgJipAOCggIDEgICAgLlAgICAxIEAoICAqICAgICAwICAgICBACi1NKCAgICAgICAgMCAgICAgTCggICUgICAgI0AhICY8IDgoICAiICAgICUwISAmPUA0K19fXyAgICAjQCAgCi1NICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAjQCEgJj4gOCggICIgICAgCi1NJTAhICY/QDQrX19fICAgICNAICAgIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAmCi1NICAgICMgISAmQCA4KCAgLSAgICAjICAgICBQQCggICEgICAgJTAhICZAUDgoICAvICAgICUwICAgIFBACi1NKCAgIyAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgICJQISAmQiA4KCAgLSAgICAiUCAgCi1NICUwQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgKCAgICAjMCEgJkggOCggICIgICAgCi1NIzAgICAiQEAoICAhICAgICRQISAmSkA0K19fXyAgICAlUCEgJksgOCggICYgICAgJyAhICZMUDQrX19fCi1NICAgICVQICAgI0BAKCAgJCAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICNAISAmTyA4Ci1NKCAgIiAgICAlMCEgJlBANCtfX18gICAgI0AgICAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgCi1NICAgTCggICIgICAgIDAgICAgIEAoICAgX19fX19QICAgICAgICAgJCAgICAgL19fX19cICAgICAgICAgCi1NIUAgICAgI19fX19fICAgICAgICAgIEAgICAgIF9fX19fUCAgICAgICAgICogICAgICAgICAgICYgICAgCi1NIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAjCi1NICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAgQCMgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgCi1NICBAIyAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIEAkICMgIF9fICAhICAgICAgICAgICAgICAgCi1NIDAgICAhICQgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICEgJSAjICBfXyAgISAgICAgICAgICAgCi1NICAgICAwICAgISAmICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAiICYgIyAgX18gICEgICAgICAgCi1NICAgICAgICAgMCAgICIgJyAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIiAoICMgIF9fICAhICAgCi1NICAgICAgICAgICAgIDAgICAiICggIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICIgKSAjICBfXyAgCi1NISAgICAgICAgICAgICAgICAwICAgIiAqICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAiICsgIyAgCi1NX18gICEgICAgICAgICAgICAgICAgMCAgICQgIyAhICAgUCAwICAsICQgICQgISAgISAgMCAgNCAkICAmCi1NICEgICFAIDAgIDwgJCAgKCAhICAiICAwICBEICQgICogISAgIlAgMCAgUCAgICNfX19fX19fX19fUFAgCi1NICAjX1wgICEgICAgICBQICAgI19fX19fX19fX19QUCAgICNfXCAgKSAgICAgIFQgICAjX19fX19fX19fCi1NX1BUICAgI19cICAxICAgICAgVCAgICNfX19fX19fX19fUFQgICAjX1wgIDkgICAgICAgICAiNCMgICAgCi1NICAgICowLCAgICAgICAgTSBQICAgICAgICMkJCAgICAgICAgLTAwICAgICAgICBZITAgICAgICAgI1QmCi1NICAgICAgICAwMDggICAgICAgISUhUCAgICAgICAkRCggICAgICAgIDMwQCAgICAgICAhMSIwICAgICAgCi1NICU0KiAgICAgICAgNjBMICAgICwgICAgX19fX19fX19fX1wsICEgIF9fICA2MCAgICAgLCAhKDBfXyAgCi1NNjAgICAgICwgIyxQX18gICAwICAgICNfXCAgJCAgICAgICAgICAgICAgICIgICAgUC9fUCAgMCAgICAgCi1NICAgICAgICAgICQgICApIF9fICAhICAgICAgICAgICAgICAgICAgICEoICwgISAgX18gIDYwICAgICAtCi1NICAgIF9fX19fX19fX19cLCAhICBfXyAgNjAgICAgICwgISgwX18gIDYwICAgICAsICMsUF9fICAgMCAgCi1NICAjX1wgICQgICAgICAgICAgICAgICAiICAgIFAvX1AgIDAgICAgICAgICAgICAgICAkICAgKSBfXyAgCi1NISAgICAgICAgICAgICAgICAgICAhKCAtICAgIF9fICA3QCAgICAgLiAgICBfX19fX19fX19fXCAgICAgCi1NICAgICAgICAgICAuICAgIF9fICA4UCAgICAgLiAgICBfX19fX19fX19fXCAgICAgICAgICAgICAgICAuCi1NICAgIF9fICA6ICAgICAgLiAgICBfX19fX19fX19fXCAgICAgICAgICAgWCAgICNfXCAhTSAgICAgIFggCi1NICAjX19fX19fX19fX1AgICAgICAgICAgI0AgICAvX1AgJyQgICAgICNAICAgL19fX19fX19fX18gICAgCi1NICAgICAgIC4gICAgX18gID0wICAgICAuICAgIF9fX19fX19fX19cICAgICAgICAgICBYICAgI19cICFaCi1NICAgICAgWCAgICNfX19fX19fX19fUCAgICAgICAgICAgICAgICAgICAgICAgICIpIUAgICAgICAgICAmCi1NICAgICBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggCi1NICAgICAgICMhQCAgICAgICAgICYgICAgIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAgUCAgCi1NICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgJCFAICAgICAgICAgJiAgICAgQCAgICAwICAgICYgICAgCi1NIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICAgICAjIUAgICAgICAgICAmCi1NICAgICBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggCi1NICAgICAgICMgUCAwICAgICAgNCMgISAgX19fX19QICAgICAgICAgKCAgICAgL19fX19cICAgICAgICAgCi1NISAgICAgI19fX19fICAgICAgICAgIDAgICAgIF9fX19fUCAgICAgICAgIDggICAgIC9fX19fXCAgICAgCi1NICAgICEgICAgICAgICAgICFAICAgICggICAgJCAgICAhQCAgICBAICAgICogICAgIlAgICAgLCAgICAlCi1NICAgICFQICAgIEQgICAgOiAgICAgICAgITA4ICAgICAgICAnJkAgICAgICAgICAmICAgICBAICAgIDAgCi1NICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggICAgICAgICMmQCAgCi1NICAgICAgNCYgICAgICAgICFQOCAgICAgICAgKSFAICAgICAgICBMJiAgICAgICAgIzA4ICAgICAgICAvCi1NIUAgICAgICAgISQmICAgIF9fX19fUCAgICAgICAgICMgICAgIC9fX19fXCAgICAgICAgICBQICAgICAgCi1NICAgICFAICAgICggICAgJCAgICAhQCAgICBAICAgICogICAgIlAgICAgLCAgICAlICAgICFQICAgIEQgCi1NICAgOiAgICAgICAgICA4ICAgICIgICAgISAgICAgOCAgICAoICAgICJAICAgIEwgICAgIyAgICAhMCAgCi1NICA8ICAgICkgICAgJkAgICAgICAgICAmICAgICBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgCi1NIFAgICAgNCAgICAnICAgICIwICAgIUggICAgICAgICgmQCAwICAgICAgSDogICAgICAgICMhSCAkICNfCi1NX19fXyAgICAgICAgICAwICAgICBfX19fX1AgICAgICAgICAkICAgICAgICAgICAmICAgICBAICAgIDAgCi1NICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggICAgICAgICMhQCAgCi1NICAgICAgNCYgICAgICAgICAgOCAgICAiICAgICEgICAgIDggICAgKCAgICAiQCAgICBMICAgICMgICAgCi1NITAgICAgPCAgICApICAgICZAICAgICAgICAsJiAgICBfX19fX1AgICAgICAgICAjICAgICAvX19fX1wgCi1NICAgICAgICAhUCAgICAjX19fX18gICAgICAgICAgMCAgICAgICYtUj0jJVQ5N0FUK0csIDRVMSE0RTEmCi1NNERUIDdVXVM9JiVSPSAhPzs2XU44Vl1OPScpTzsgIT87Ni1PPTZZVCAlXVM8JylPOFZVTztHLVQ4NylUCi1NICAgTzhGJUI4Ml1DPjchUjk3LVMrVzVTPEJdSTtGLUw9NjFFK1cpRTlWMUU5QllIICAgTzhGJUI4Ml1DCi1NPjchUjk3LVMrVzVTPEJdSTtGLUw9NjFFK1YlUzsyWUggICFDPEcwUT0mRU46NzBOPFAgIDlWMUI7NjROCi1NOFAgXCtTMSQ5NilVOVJcXiAnIVU8JkVMLkJdQz42PUk7RzBPPCZRQT4yXUY7RjhPOVYxQjs2NE44UCBXCi1NLCMoUy0jQFMtQ0QgLTMsWC1AIVQ3Vy1UPEc1Qz0gIVY3Vi1IODcpPzs2NU04RjVSICc5PzxWQU88RzE/Ci1NOzY1TThGNVIgJzk/OjZZVDdWVUU7NilFPEAhVjdWUU87Rj0/OzY1TThGNVIgJzk/OUZRTzg3MT87NjVNCi1NOEY1UiAnOT85Jl1VOEZRRTdWVUU7NilFPEAgTjFDJFEgJzk/OFZBQTxFXU05NlVCOTcoID1FXVM6Jl1SCi1NPSVdTTk2VUI5NyggPUVdSTtHMT87NjVNOEY1UiAnOT87Jl1OOVVdTTk2VUI5NyggPUVdRjsmXUE9JV1NCi1NOTZVQjk3KCA9RV1EO1c1QjsmNT87NjVNOEY1UiAnMT89NllJO1ZYID1FXUM6JiVSN1ZVRTs2KUU8QCFWCi1NN1ctSDtXKVQ3VlVFOzYpRTxAIVY3VkVOPSVdTTk2VUI5NyggPUVdTDtWWUc3VlVFOzYpRTxAIVY3VjlMCi1NO1YlVDdWVUU7NilFPEAhVjdWMU89NilMOTVdTTk2VUI5NyggK0Q4USxQIVY3Vi1IODcpPzs2NU04RjVSCi1NICc5PzxWQU88RzE/OzY1TThGNVIgJzk/OjZZVDdWVUU7NilFPEAhVjdWUU87Rj0/OzY1TThGNVIgJzk/Ci1NOUZRTzg3MT87NjVNOEY1UiAnOT85Jl1VOEZRRTdWVUU7NilFPEAhVjdWLUg4Nyk/OUc1TjhQIVY3Vy1JCi1NOVZZRTklXUM6JiVSN1Y5VTtGLCA9RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgPUVdUzomXVI9JV1GCi1NPTZZQyAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUY9NllDCi1NICc5Pzo2WVQ3VjlVO0YsID1FXVM6Nj1OOTYxPzo2WVQ3VjlVO0YsID1FXVU7Ry1JOVZZRTklXUk7RzE/Ci1NOUc1TjhQIVY3VlFPO0Y9PzlHNU44UCFWN1ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdVTtHLUk5VllFCi1NOSVdTDtWWUc3VjlVO0YsID1FXUY7Jl1BPSVdRj02WUMgJzk/OSZdVThGUUU3VjlVO0YsIDsmRU46UCFOCi1NOTdBVCAmUUk7Rk1GPTZZQyAnLVQ9NjlGICcxVTdWUUk7RkwgO0Y1WD0gIUw6NllLOUc1TjhQIVM9JzVGCi1NOUAgTjFDKFkgJylFOSAhRzxGNUU7QCFCOyc1RSAmLU87Jl1SPFAhWTk2UUw7VzwgPCc1UjwmUUUgJyFJCi1NO0ZMICtEOFMsMCFDOiY1Vj4wIUY7VylEICYtQTxHLCA4RlVXICchTzxHLUM6JjQgK0Q4UyxQISYwNFEzCi1NMTAhNDRFNSUgJilPO1ZRRTg2WCA4RzlBOycsIDlGJUw8VjQgPScpVTkwIUI7Vl1MOTYlTixAIU06Ny1PCi1NPEYxRTxGNUQgJzFXO1AhTztGNCA+RjVSO1AhVDonKUU5MCFNODZFTiAgIUc5NlhPPFcxVThGOVA5Ny1UCi1NODcpVCtGLCA3VV1SOTYlRDk2WVY3Vy1JOVY5UDkwICA4VzFZPCY0TjhQIUY6NylTPSVdQzg2UUwgJV1TCi1NOTcxQzonKUM7JiVTPFAgIDlWNU4rVi1VOTdBST0iWUMgJjVYOjcwICAmPUU9JjVOPUJZQyAmPUU9JjVOCi1NPUAhTj1GVUE9Ji1IICAhRzk2WE88VzFSOFchWStHLCA8VzFSOFchWSAjJEQsIyBQLCMgUCwjIFAsICBECi1NOSZdQzojLCApJjFPOFZAUiAiMUQ7Vi1ILDAgRDkmXUM6IyAgICctWTxSXT87VyFFO0JZUyAlXU88JjVOCi1NICNERCwjIFAsIyBQLCMgUCwgICArVilBOEYkTzhXRVA8RjVTPFJdVTxXKE86NllDOyc1RDkyXVM+NyxOCi1NPFAgICtWKUE4RiRPOFdFUDxGNVM8Ul1VPFcoTzo2WUM7JzVEOTJdUz43LE88V0VTOFYlTDsiWUggICFTCi1NPjcsTzdXKUU4NjBOPFAhPzxGNUE5ICBZKSMgUCwjIFAsIyBQLCMgICAmPUU7Ql1COFZdUD4yWVMgJlVFCi1NOzYtUD4wIUc7VjlPPEc9QTxGMVMgJjlPPEc9QTxGMVM3VilZPSY1QztXIVkgI0RZKSMgUCwjIFAsIyBQCi1NLCMgIDxGNVQgJjlPPEc9QTsmRUc7RiVCOyY0IDlGXVI9VV1DO1chWSxAIUY7VylXN1YtTzwnRFMgJjlPCi1NPEc9QTxGMVMgJjlPPEc9QTxGMVM3UyxSICY5TzxHPUE8RjFTN1MkViAmOU88Rz1BPEYxUzdTMCA5Vl1CCi1NODYtSz1WJVI5JywgOEYlQzpXPUE8RjFTN1YpWT0mNUM7VyFZICNEWSkjIFAsIyBQLCMgUCwjJCA4RiVDCi1NOlYlTDo2PU44NilMOTAhQjg2LUs3Vi1PPCdEUiAmKUE4Vk0/OFZdUD4zLCA4RiVDOlc9QTxGMVMgJilBCi1NOFZNVzg3KUQ8VVxTLEAhQjg2LUs9ViVSOSctPywzOCA4RiVDOlc9QTxGMVM3UzAgICctWTxSXT84VlFPCi1NPFY0TjxQIT84VlFPPFY0IC4yMFAsIyBQLCMgUCwjIFAgICFBPSY1WDo3ME44UCE/N1ZZRT4nMUY7QCE/Ci1NN1Y1WDo3MT85RllTICYlVDk3QUk9ICE/N1YtQTsmUT85N0FJPSY5TjxQICA5RlFTOEc1RitGLCA3Vi1MCi1NOTYlTj03ICA5Ri1MO1ctRSAmOUY7JzVTOiAhPzlGUVM4RzVGICVdWDlGUVM4RzVGICVdVzxHMUM6JkwgCi1NN1Y5STtGMUI9NjggN1YpVTlHLVk7RiwgICctWTxSXUU+JkVUK0csIDdWNVg6NzAgICYtUj0iXUM5NylSCi1NO1coTjxQIT84VjVSPEZdUiAgIUQ4NzFBK0YsICAmVVA3VjFFOUJZQyAgIU04NlFMO1YsTjhQIUE7JlFPCi1NOFcsIDg2UUw7Vi1QICYlTDsmXUM9ICFBOyZRTzhXQCA4NlFMO1YtRTtGMCA7NiVMOyZdQyAmOVI5NjQgCi1NPEY1QTsmUU84UCAgPFdFUytVXUw8VjVFOlJZUyAlXUw8VjVFOlAgWSkjIFAsIyBQLCMgUCwjICAgJy1ZCi1NPFJdPz1XKUk9JjROPFAhPz1XKUk9JjQgLjIwUCwjIFAsIyBQLCMgUCAgIT87Vy1FPEcpTzxCWUMgJV1PCi1NPFY1UjxGXVIgJV1TOTcxTzxWNVI8Rl1SICAhPzo3LUE9JzFZK0YsIDdWRVM4NzFUPjAgIDxXRVMrVV1TCi1NOEcpSytHLCA3Vy1CPEZMIDk3KVIgJV1CPEZMICwyMFAsIyBQLCMgUCwjIFAgICFTPjcsTzdWRU84VzFMCi1NK0csIDdWRU84VzFMICNERCwjIFAsIyBQLCMgUCwgICA4VylUO0ZFTjo3ME48UCAgN1Y1Tj1GRVI7VlggCi1NOTZZVjo3KU87QCE/N1QlUjlWLCA3VV0hPEY9ViAmNVI8RllPICVdPzxXMUE8RzAgN1Y9UCAlXT86Ny1UCi1NODcpVCAlXT88RjVBOSY1Tj1FXVM6Nj1GPCY0IDdXLUU9Ji1IPEYtTDg3LVMgJlVBOjZYIDk3QUk9ICE/Ci1NOzZdTjhWXU49JylPOyAhPzs2LU89NllUICVdUzwnKU84VlVPO0ctVDg3KVQgJzk/OFZBQTxAIVY3Vy1JCi1NOVZZRTklXUM6JiVSICc5Pz02WVM6Nj1OOTYxPzhWQUE8QCFWN1ctSDtXKVQgJzk/PFZFRztGNUQ3Vy1ICi1NO1cpVCAnOT89NllTOjY9Tjk2MT88VkFPPEcwID1FXUk7RzAgPUVdUzo2PU45NjE/OjZZVCAnOT89NllTCi1NOjY9Tjk2MT86NllUICc5PzsmXU45UCFWN1ctSTlWWUU5JV1MO1ZZRyAnOT89NllTOjY9Tjk2MT87Jl1OCi1NOVAhVjdWOUw7ViVUICc5PzkmXVU4RlFFICc5PzhWQUE8RV1BPEcpQT4wIVY3Vy1JOVZZRTklXUM6JiVSCi1NN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXLUg7VylUN1YlUjxGJVkgJzk/Ci1NPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCA9RV1JCi1NO0cxPzg3KVI4N0QgPUVdUzo2PU45NjE/OjZZVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzo2WVQ3ViVSCi1NPEYlWSAnOT87Jl1OOVVdQTxHKUE+MCFWN1ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZICc5Pz02WVM6Nj1OCi1NOTYxPzsmXU45VV1BPEcpQT4wIVY3VjlMO1YlVDdWJVI8RiVZICc5PzkmXVU4RlFFN1YlUjxGJVkgJzk/Ci1NOFZBQTxFXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVECi1NN1YtSDg3KT88Jl1JO0cxRTxAIVY3Vy1IO1cpVDdXIU86NllUOTcoID1FXVM6Nj1OOTYxPzxWQU88RzE/Ci1NPCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCA9RV1JO0cxPzwmXUk7RzFFCi1NPEAhVjdXLUk5VllFOSVdSTtHMT88Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSCi1NICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdXNU48VkVHCi1NO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1Y5TDtWJVQ3VyFPOjZZVDk3KCA9RV1EO1c1QjsmNT88Jl1JCi1NO0cxRTxAIVY3Vy1UPEc1Qz0jJCA9RV1TPScpVThXMFIgJzk/PTZZSTtWWCA9RV1VO0ZFTztDKCA9RV1DCi1NOiYlUjdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1GCi1NPTZZQyAnOT88VkFPPEcxPzlHNU44UCFWN1ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICc5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzE/OUc1TjhQIVY3VkVOPSVdRj02WUMgJzk/PFZFRztGNUQ3VkVOPSVdRj02WUMgJzk/Ci1NPTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgPUVdTDtWWUc3VjlVO0YsID1FXVM6Nj1OOTYxPzsmXU45VV1GCi1NPTZZQyAnOT89NllTOjY9Tjk2MT87Jl1OOVVdRj02WUMgJzk/OUZRTzg3MT85RzVOOFAhVjdWMU89NilMCi1NOTVdRj02WUMgJy0/OyZFTjpQIVU3VlFJO0ZMIDwnKUk7NiVSPjAhTjtWWVA8RkVNODcpWSAmLUw9NllLCi1NOTcoIDxXIU88RzFTOFYlUiAlXUM9J0VQOTAhRzk3MUU7RzggPFcxUjhXIVkgJV1PPCY1TiAlXVI5NiVECi1NICZVRTs2LVA+MCE/OFZRTzxWNCA3VV1UPEYlUDdWOVA5NV1PPUY1UjxGRUQ5MCE/N1YtQTsmUT85N0FJCi1NPSY5TjxQIT84VlFFODZZVTwgIT85N0FJPSAhPzhWNVI8Rl1SICYlVDk3QUk9ICE/OEc1Rjk2WUQ9JiVCCi1NICVdSTtWKCA3Vy1QPEZdQzk2MCA3VlFBPFcxQj02OCA3Vy1JOEc1RiAlXVM7VilVOUAhPzxWVUI9NjggCi1NOUY5TD03LUggJjlDOyZdUzkwIUY8RjVFICVdTDxWNUU6UCE/PiY5TDxWKVU5QCE/OUZRUzhHNUYgJV1XCi1NPEZFVDkwIT89VylUOFZBSyAlXUI9NjlTPjZZQyAlXVM5NzFPPFY1UjxGXVIgJV1GOjZZRDhHNUYgJlVBCi1NOyZRTzhQIT86Ny1BPScxWSAlXUw7Vi1LICVdVTsmXUM6UCE/O0ZRTzhWTCA3VkVMO1YtSyAlXUY7Jl1DCi1NOlAhPz1WUU84VkwgN1YtTDtWLUsgJV1UOyZdQzpQIT84VzFMO1YtSyAlXUQ7Jl1DOlAhPzhWJVMgJV1VCi1NPFVdUjxXMUg8RjVBOSVdUz0mMUk7UCE/PFYpUjpQIT84RylLICcpRTg2UUw7ViwgN1ZdUzk3KVI7VyggCi1NN1ZFTzhXMUwgJjVOOSAhPzs2RU44RylLICVdQz03KUI8RkwgN1Y1TjkgICAgJCAhUCAgICAgJCAgICAgCi1NICAgIDAgICAgICAgICAgKyAgICAgICAgICIkICAgICAgICAgICAgICAgMCAgICAgICAgICQgICAgICAgCi1NICAgJSY4ICAgICAgICAgICAgID8gJCAhUCAgICAgJCAgICEgICAgICkgICAgIEwgICAgIiAgICAgICAgCi1NICAgICAgICAgICAgICAgJCAgICAgICAwICAgICAgICAgIDQgICAgJSc4ICAgICAgICAgICAgICAgJCAhCi1NUCAgICAgJCAgICFEICAgICgwICAgIFQgICAgIiAgICAgICAgICAgICAgICAgICAgICAgJCAgICAgICAwCi1NICAgICAgICAgIEggICAgJSc4ICAgICAgICAgICAgICAgJCAhUCAgICAgJCAgICIlICAgICMwICAgIFwgCi1NICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgISc4ICAgICAgCi1NICAgICAgICAgJCAiNCAgICAgJCAgICIyICAgIz8wICAgISQgICAiKiAgICAoMCAgICxcICAgICAgICAgCi1NICAgJCAgXCAgICAwICAgISZAICAgISAgICAgISAwICAgICAgICFcICAgIF8gJCAlRCAgICAgJCAgIDAvCi1NICAgICkwICAgKUwgICAgJCAgICBcICAgICAoICAgICAgICAgICAgMyAgJCAgICRKICAgICNQICAgISQgCi1NICAgISA4ICAgICAgICVYICAgICEgJCAlSCAgICAgJCAgIDBUICAgICgwICAgKVwgICAgJSAgICBcQCAgCi1NICNMICAgICAgICAgICAgNCAgJCAgICRZICAgICNQICAgISggICAgISA4ICAgICAgICVcICAgIDcgJCAmCi1NRCAgICAgJCAgIDE1ICAgICRQICAgKjAgICAgJCAgICErMCAgICBUICAgICAgICAgICAgNSAgJCAgICUoCi1NICAgICNQICAgISwgICAgISA4ICAgICAgICc4ICAgICwgJCAmVCAgICAgJCAgIDFIICAgICYwICAgKkAgCi1NICAgJiAgICEuQCAgICQgICAgICAgICAgICAgNiAgKCAgICU3ICAgICQwICAgITAgICAgISA4ICAgICAgCi1NICgoICAgIDAgJCAnVCAgICAgJCAgIDIhICAgIC9AICAgKlggICAgKSAgICE+QCAgICJIICAgICAgICAgCi1NICAgOCAgJCAgICVIICAgICEgICAgITQgICAgJSY4ICAgICAgICkoICAgIEogJCAoQCAgICAgJCAgIDJfCi1NICAgICggICAgKzwgICAgJSAgICFJICAgICBAICAgICAgICAgICAgOSAgJCAgICVMICAgICEgICAgIUggCi1NICAgJSY4ICAgICAgICtQICAgICUgJCAoQCAgICAgJCAgIDM/ICAgICgwICAgK1AgICAgIiAgICAgICAgCi1NICAgICAgICAgICAgICAgISAgICAgICAkICAgICAgICAgIVwgICAgJSc4ICAgICAgICAgICAgICAgJCAoCi1NQCAgICAgJCAgIDQgICAgICowICAgK1ggICAgIiAgICAgICAgICAgICAgICAgICAgICAgISAgICAgICAkCi1NICAgICAgICAgIjAgICAgJSc4ICAgICAgICAgICAgICAgJCAoSCAgICAgJCAgIDRJICAgICggICAgLCAgCi1NICAgJSAgICFLICAgICBAICAgICAgICAgICAgOiAgJCAgICVQICAgICEgICAgIkQgICAgJSY4ICAgICAgCi1NICwkICAgICUgJCAoUCAgICAgJCAgIDUpICAgISUgICAgLDQgICAgOSAgICFNICAgICw4ICAgICAgICAgCi1NICAgOyAgJCAgICVUICAgICEgICAgIlggICAgJSY4ICAgICAgICw4ICAgIlQgJCArVCAgICAgJCAgIDk9Ci1NICAgIChAICAgLVggICAgJSAgICI+QCAgICBAICAgICAgICAgICAgPCAgJCAgICVYICAgICEgICAgIywgCi1NICAgJSY4ICAgICAgIDdIICAgICUgJCArXCAgICAgJCAgIDlfICAgIC0gICAgLiwgICAgKCAgICJAQCAgCi1NICJQICAgICAgICAgICAgPSAgKCAgICVcICAgICQwICAgI0AgICAgISA4ICAgICAgIDdcICAgICggJCAsCi1NSCAgICAgJCAgIDpTICAgIDMgICAgLkwgICAgMiAgICJLQCAgIEIoICAgICAgICAgICAgPyAgQCAgICYtCi1NICAgICcwICAgI0QgICAgISA4ICAgICAgIDg8ICAgIjsgJCA1LCAgICAgJCAgIDtfICAgICRAICAgL1QgCi1NICAgJCAgICRUICAgICAwICAgICAgICAgICAgRyAgJCAgICZKICAgICEgICAgI0ggICAgJSY4ICAgICAgCi1NIEIoICAgICIgJCA1MCAgICAgJCAgIDwxICAgICVAICAgMCQgICAgJCAgICRVICAgICAwICAgICAgICAgCi1NICAgSCAgJCAgICZOICAgICEgICAgI1wgICAgIyY4ICAgICAgIEIwICAgICMgJCA1NCAgICAgJCAgIDxHCi1NICAgICIgICAgMDQgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSICAgICMwICAgJCggCi1NICAgISA4ICAgICAgICAgICAgICAgJCA1NCAgICAgJCAgIDxPICAgICJAICAgMDwgICAgIiAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICZfICAgICMwICAgJCwgICAgISA4ICAgICAgICAgICAgICAgJCA1Ci1NNCAgICAgJCAgIDxZICAgIDBQICAgMEQgICAgLSAgICRWICAgIDFMICAgICAgICAgICAgSSAgLCAgICcsCi1NICAgICRQICAgJDAgICAgISA4ICAgICAgIEI8ICAgIU4gJCA5UCAgICAgJCAgID1cICAgIChAICAgMTggCi1NICAgJSAgICVcUCAgICBAICAgICAgICAgICAgTCAgJCAgICc/ICAgICEgICAgJDQgICAgJSY4ICAgICAgCi1NIEk0ICAgICUgJCA5WCAgICAgJCAgID4+ICAgIChAICAgMUwgICAgJSAgICVeUCAgICBAICAgICAgICAgCi1NICAgTSAgJCAgICdDICAgICEgICAgJEggICAgJSY4ICAgICAgIElIICAgICUgJCA6ICAgICAgJCAgID8gCi1NICAgICgwICAgMiAgICAgJiAgICYgUCAgICA4ICAgICAgICAgICAgTiAgKCAgICdHICAgICQwICAgJFwgCi1NICAgISA4ICAgICAgIElcICAgICMgJCA6KCAgICAgJCAgID9BICAgICRQICAgMjggICAgJCAgICYiMCAgCi1NICE0ICAgICAgICAgICAgUCAgJCAgICdYICAgICNQICAgJSAgICAgISA4ICAgICAgIEooICAgICkgJCA6Ci1NQCAgICAgJCAgID9UICAgICowICAgMkggICAgKCAgICYnQCAgICFIICAgICAgICAgICAgUSAgKCAgICgnCi1NICAgICIgICAgJSQgICAgJSY4ICAgICAgIEpMICAgIDAgJCA6XCAgICAgJCAgIEA9ICAgIChAICAgMyggCi1NICAgJSAgICYuICAgICBAICAgICAgICAgICAgUyAgJCAgICgvICAgICEgICAgJTggICAgJSY4ICAgICAgCi1NIEtMICAgICUkJCA7JCAgICAgJCAgIEBfICAgICMgICAgMzwgICAgIiAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgJUwgICAgISc4ICAgICAgICAgICAgICAgICAgICAgICAgJCAgICAhCi1NICAgICBAICAgICggICAgICAgICAgMCAgICAkICAgICIgICAgIEAgICAgICAgICAhICAgICAwICAgICggCi1NICAgIiAgICAgUCAgICAwICAgICUgICAgIUAgICAgPCAgICAoICAgICIwICAgICggICAgIiAgICAgMCAgCi1NICAkICAgICogICAgIDAgICAgKCAgICArICAgICMgICAgIEggICAgISAgICAgQCAgICBMICAgICwgICAgCi1NIkAgICAgJCAgICAiICAgICJQICAgIFAgICAgLSAgICAgMCAgICAoICAgICsgICAgIyAgICAgWCAgICAiCi1NICAgICBAICAgICQgICAgISAgICAjUCAgICAkICAgICIgICAgIlAgICAgUCAgICAwICAgICQwICAgISggCi1NICAgISAgICAgQCAgICBMICAgICwgICAgJFAgICAgJCAgICAiICAgICUgICAgITQgICAgNiAgICAlUCAgCi1NICAkICAgICIgICAgIlAgICAgUCAgICA4ICAgICAwICAgICggICAgKyAgICAjICAgICFEICAgIDogICAgCi1NJlAgICAgJCAgICAiICAgICJQICAgIFAgICAgPCAgICAgMCAgICAoICAgICsgICAgIyAgICAhVCAgICAgCi1NICAgICAhICAiSyAlS19fXyAgICAgICAgICBEMCAgSlAhOl9fX1AgICAgICAgICAxJCAgLCQgNy9fX1wgCi1NICAgICAgICAmISAgIyEwJVNfX18gICAgICAgICAhXDAgIFA4ITxfX19QICAgICAgICAgRSAkICFQIUBACi1NICAoICAgICAgICAgKzEgIEJIIDRLX19fICAgICBQICAgIyQgMCFMPCVMX19fUCAgICA0ICAgIFogJCAlCi1NRCFAQCAgJCAgICAmICAgIDJQISAhOiA4KCAgIiAgICAhICAgICVAIDAgLkwmIiAgQTAgICAgPCAgICE9Ci1NICQgJkQhQEAgICQgICAgICAgICA4QCEgIEJAOCggICQgICAgICAgICAmWCAwIChQJiIgICFAICAgICAgCi1NICAhViAkICIvIUBAICBAICAgICQgICAgQTEgICJRICVQICAoICAgICEgICAgKFAwICBMMSE8ICAiICAgCi1NICAwICAgIjokICArJEA3ICAgQCAgICAkICAgIEpBICAiUTAlUCAgIyAgICAhICAgICsoMCAgTDYhPCAgCi1NIFAgICAgMCAgICMhJCAgKyYgNyAgIEQgICAgJCAgICBUQSAgIlFQJVAgICQgICAgISAgICAtQDAgIExACi1NITwgICEgICAgIDAgICAjRSQgICspIDcgICBIICAgICQgICAgXSEgICJSQCVQICAlICAgICEgICAgL0wwCi1NICBMTCE8ICAhMCAgICAwICAgJCkkICArLCA3ICAgTCAgICAkICAgISYxICAiUzAlUCAgJiAgICAhICAgCi1NIDIkMCAgTFghPCAgIVAgICAgMCAgICRKJCAgKzAgNyAgIFQgICAgJCAgICEtUSAgIlQoJVAgIDMgICAgCi1NISAgICA0TDAgIE0kITwgICYwICAgIDAgICAlQSQgICsyIDcgICFcICAgICQgICAhO1EgICJUUCVQICBFCi1NICAgICEgICAgODAwICBNMCE8ICAqUCAgICAwICAgJjskICArNiA3ICAjJCAgICAkICAgIUlRICAiViAlCi1NUCAgVyAgICAhICAgIDtIMCAgTUghPCAgLzAgICAgMCAgICcvJCAgKzwgNyAgJCwgICAgJCAgICFXISAgCi1NIldAJVAgISkgICAgISAgICA/IDAgIE4gITwgIDNQICAgIDAgICAoJiQgICtCIDcgICU0ICAgICQgICAiCi1NJSEgIDhfICQ4ICE7ICAgICEgICAgQiwwICBOMCE8ICA4MCAgICAwICAgKFIkICArRSA3ICAmKCAgICAkCi1NICAgIjIhICAiWUAlUCAhQyAgICAhICAgIEYgMCAgTjwhPCAgOSAgICAgMCAgIClQJCAgK0ggNyAgJjQgCi1NICAgJCAgICJBUSAgIlowJVAgIUYgICAgISAgICBKIDAgIE5IITwgIDlQICAgIDAgICAqTiQgICtLIDcgCi1NICZAICAgICQgICAiUFEgICJbICVQICFJICAgICEgICAgTUgwICBOVCE8ICA6QCAgICAwICAgK0kkICArCi1NTiA3ICAmTCAgICAkICAgIl9RICAiW1AlUCAhTCAgICAhICAgIFE8MCAgTyAhPCAgOzAgICAgMCAgICxHCi1NJCAgK1EgNyAgJlggICAgJCAgICMuISAgOFwgJDggIVIgICAgISAgICBUKDAgJi84ISYgID4gICAgIDAgCi1NICAtLCQgICtSIDcgICdYICAgICQgICAjNSEgICJdICVQICIkICAgICEgICAgVVQgMCApMCYiICAoMCAgCi1NICAwICAgLUkgJCAiOiFAQCAiNCAgICAkICAgIz8gISAgSCA4KCAgSSAgICAhICAgIFkkIDAgKjgmIiAgCi1NKzAgICAgMCAgIC4+ICQgIkwhQEAgIyQgICAgJCAgICNMQCEgIExAOCggIFUgICAgISAgICBcQCAwICtACi1NJiIgIC4wICAgIDAgICAvMyAkICJeIUBAICNUICAgICQgICAjWTAhICBRIDgoICEhICAgICEgICAgX0QgCi1NMCAsSCYiICAxMCAgICAwICAgMCUgJCAjMCFAQCAkRCAgICAkICAgJCYgISAgVUA4KCAhLSAgICAhICAgCi1NISJUIDAgLVAmIiAgNDAgICAgMCAgIDBaICQgI0MhQEAgJTQgICAgJCAgICQyISAgIl1AJVAgIl4gICAgCi1NISAgICEkXDAgJixQISYgIFcgICAgIDAgICAxNiQgICtXIDcgIC40ICAgICQgICAkN0EgICJeICVQICNOCi1NICAgICEgICAhJkQwICBPRCE8ICBdQCAgICAwICAgMVEkICArWiA3ICAvWCAgICAmICAgJD5RICAgICAkCi1NM19fXyAgICAiICAgISgoIDAgOzAmIiAgIDAgICAgRCAgIDIpICQgJ1QhQEAgICQgICAgKiAgICREICEgCi1NIiggOCggICEgICAgIzAgICEpOCAwIEJAJiIgICAwICAgIFggICAyPCAkIChQIUBAICAkICAgIC8gICAkCi1NSFAhICJdIDgoICAhICAgICFQICAhKkgwICBLMCE6X19fUCAgICEgICAgMl4gJCAsLiFAQCAgNCAgICAxCi1NICAgJFMwISAjKiA4KCAgISAgICAkQCAgIS04IDAhNFAmIiAgIDAgICAhLCAgIDM8ICQgNTAhQEAgICQgCi1NICAgMCAgICRZICEgIl8gOCggICMgICAgJSAgICEuTDAgICpAISRfX19QICAgITAgICAzViQgICQtIDEvCi1NX19cICAgIDUgICAkXlEgICJQICVLX19fICAgICUgICAhMDAwICBLUCE6X19fUCAgICEwICAgNC0kICAwCi1NICAxT19fXCAgICA0ICAgJSUhICAwICAkO19fXyAgICAlICAgITFMMCAmICghJl9fX1AgICAhJCAgIDRCCi1NICQgLVYhQEAgIDQgICAgMSAgICUqMCEgIzFAOCggICMgICAgJUAgICEzICAwIUFIJiIgICIgICAgITwgCi1NICA0VSAkIDlQIUBAICAkICAgIDEgICAlLyAhICQ1IDgoICApICAgICQwICAhNDQgMCBcQCYiICAhUCAgCi1NICFAICAgNS0gJCA5WCFAQCAgJCAgICAxICAgJTUgISAkRkA4KCAgKyAgICAkMCAgITVQIDAhMzgmIiAgCi1NI1AgICAhRCAgIDVFICQgOiMhQEAgICwgICAgMSAgICU8MCEgJFcwOCggIC0gICAgJUAgICE3SCAwITUwCi1NJiIgICFAICAgIUggICA2ISAkIDooIUBAICAkICAgIDUgICAlQjEgICMhUCVTX19fICAgICUwICAhOFwwCi1NICBQQCE8X19fUCAgICE0ICAgNjYkICAsKSA3L19fXCAgICA1ICAgJUcxICAjIkAlU19fXyAgICAlMCAgCi1NITowMCAgUEwhPF9fX1AgICAhNCAgIDZLJCAgLCwgNy9fX1wgICAgNSAgICVMQSAgIyMwJVNfX18gICAgCi1NJTAgICE7RDAgIFBYITxfX19QICAgITQgICA3ICQgICwvIDcvX19cICAgIDUgICAlUiEgICMkICVTX19fCi1NICAgICUwICAhPFwwICBRJCE8X19fUCAgICE0ICAgNzQkICArISA2T19fXCAgICA7ICAgJVlQISAmSCA4Ci1NKCAgISAgICAmUCAgIT5UIDAhSlAmIiAgISAgICAhOCAgIDdSICQgOEohQEAgIEggICAgOSAgICVeQCEgCi1NJkAgOCggICEgICAgJyAgICFALCAwIUtQJiIgICAwICAgIUwgICA4KiQgIkcwITFPX19cICAgIDsgICAmCi1JI0EgICJIICQzX19fICAgICZQICAhQTgwICBKJCEkX19fUCAgX19cICAgOD4kICJHMCExT19fXDsKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1hb3V0LnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWFvdXQudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0ZWVmOS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWFvdXQudQorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi1iZWdpbiA3Nzcgc3BhcmMtYW91dAotTUAwLCEiUCAgKCAgICAiICAgICAgICAgICNZUCAgIiBAICAgICAgICAgICJcJCIgIFQgLkAwKSgjSCQyNQotTSpCICJFICpAISkwIjAgSDcgICAwVSIrQEggLCAgIEMiICYoKEApICAgMCogICAwISAgICAwICAgIkAkIAotTSAgISAgIEAkIDAgICAkICAgLTY8KFogQDAgICggUCQgICAhICAgQCQgMCAgIClXQ09WQE8gICAoS0E3QgotTSohJCAgIEIwJEIoLDAgICAyWSgwKCAiTCQgIChEQC5ANyQgICAkTjQkIiBAQCooQCghKiAgJFwhICAgIAotTVBBLkA3SCJAODBMMkAgISsgMCAgIC5AI0gmIyIgWiFEWEAuQDoqMCUgICYyISggMStQICAiKlg1WERCMAotTSQiICBFISBAITE8QCAgIjYkTiAiRiEgICVEICAgIzI6JCIgIElBICAiKSAiICEzMiBaIURFISBAIVE8QAotTSAgIjYkTiAyRiEgICVEICAgIk46JCAgNCtQICAiKlg1WEcwMSAgIChEIShCJlQgICAiLjIkIiAgSkEgIAotTSIsKCNIJkIgRCAgISBIICAiUlwgICBCTiU+KShEIDMgJEkoMCAhJjQkIiAnJVIgICApODJYISo4JCAgNQotTTAgICAlWUgwKCAjIiBaIVBIIDMgID44Q0gnU0ooWiIgWyIuQEEgLCAgIEMiICYoKFBCLkBCICwgICEjIgotTSAmIkBQQi5AQyAsICAgQiIkJiFEUEIuQEQpIDAoICY/USAgIERBIEA/KCcnWCBCIVogICAkKCAgIUgoMAotTSggNDBAICAkQEEgQDFRIiAgICoiJCIgI0Q9IEAgIEogICAwISAgICBAPC9AIiAkICAgIjAkIiAiREA3QAotTSEtMCVQICIiJCIgJEQ9IEAgKSAwKCdeIiQiICFEPSBAICAgIDAgIE89Ny1SK1ZRSThCXUw5IllTO1AgTwotTTkmNVYrV0lFPEZcICAgICAgICAgJjYtUj0jIFooJllPKCJdVTxXKE87JkVCK1ZRRCtHLU8iQCAgICAgIAotTSAgIEY4VylULCNIQCtXNVM8Ql1MOjYoTzsmME48VlxAOzYlUDwmRU45UiFGODZFTD03KUUiQCAgICAgIAotTSAhMUM8RzBQLkIhTjtSIE85JjVWK1dJRTxGXCogICAgICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AIAotTSApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFBAICAhQDw/QCIoJ0ggICI9WFteMAotTUwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JydYIEIhWiAgIEc+Ll9EKyAwKCAgUAotTUAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAgKVdDT1kiUCQiICAsKCAgIDgnJwotTVggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AIAotTSApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFBAICAhQDw/QCIoJ0ggICAgICAgIAotTUc+Ll9EISQgICBDISBCLiAsKCAgIDgnJ1ggQiFaICAgRz4uX0QhJCAgISMhJkIiSCwoICAgOCcnWCBCIQotTVogICAwTEAgIClXQ09XQSAgICNEIDAgICAhJCAgISMgKkIsMCQwICAkKSgwKCAnMipCKTgkMCAgJCkoMAotTSggKzIqQiVYJDAgICQpKDAoIC8yLEIkUCQwICAkKSgwKCAzMixCJCgkMCAgJCkoMCggNzIsQidAJDAgIAotTSQpKDAoIDsyKEInKCQwICAkKSgwKCA/MihCJkAkMCAgJCkoMCggQzIoQiQgJDAgICQpKDAoIEcyKEIsKAotTSQwICAkKSgwKCBLMihCKSgkMCAgJCkoMCggTzIoQiVAJDAgICQhLCAgIEM0IEYuVFUiKEEqISQgICEgMwotTSAgIDBVIUlATC0wWig4QDEgICAwJFAgICQtMCo4USM0KkImUCQwICAkISwgICEjNCJGKThVIkhBRiEkIAotTSAhIDMgICAwVSBJQT4tMEooLkAxICAgMCRQICAkLTAyODMjNCxCKUgkMCAgJCEsICAhIzQkRiQoVSMoQgotTSwhJCAgISAzICAgMFUhKUFYLTBSKDVAMSAgIDAkUCAgJC0wIjg8QzQoQiUgJDAgICQhLCAgISM0IEYmQAotTVUiKEEuISQgICEgMyAgIDBVIClBIC0wQihCQDEgICAwJFAgICQtMCI4UEM0KEImSCQwICAkISwgICEjNAotTSBGKShVIihBRCEkICAhIDMgICAwVSApQTgtMEIoLiAxICAgMCRQICAkLTAiODJDNChCKUAkMCAgJCEsIAotTSAhIzQmRiYoVSNIQSQhJCAgISA1ICAgMERBKkMkLShCKC9AMSAgIDAlMCAgJCkoMkhFQzIoQiM4JDAgIAotTSQhNCAgISIyJEolWFRCKEFQISQgICEgNSAgIDBEQSpBLC0oQig3IDEgICAwJTAgICQpKDJIMEMyKEIlMAotTSQwICAkITQgICEiMiRKJ0BUQihDICEkICAhIDUgICAwREEqQVItKEIoRSAxICAgMCUwICAkKSgySDojMgotTShCKEAkMCAgJCE0ICAhIjIkSiQgVEIoQTIhJCAgISA1ICAgMERBKkMiLShCKC8gMSAgIDAlMCAgJCkoMgotTUhEQzIoQiMwJDAgICQhNCAgISIyJEolQFRCKEFOISQgICEgNSAgIDBEQSpBKi0oQig2QDEgICAwJTAgIAotTSQpKDJIOEMyKEInOCQwICAkKSgwKCArMihCIygkMCAgJCkoMCggKzIoQihYJDAgICQpKDAoICcyKEInMAotTSQwICAkKSgwKCAnMihCJ0gkMCAgJCEsICAhIzQgRikgVSIoQjwhJCAgISAzICAgMFUhKUEoLTBSKDgiIQotTVFeIChAPkAgIClXQ09ZIDEgICAwVSAoQygoIkJPX1wyQCAgLURBKEMoLSAiOCAyIEhCICAgSCAgIjkwMAotTSggIjYgRiAkREEgQCApKCI4IDMwIEQgK0AqKEAgISpfX19WNCBKICFESSogICAyICAgSDEgICAwSEEoQwotTSgqJEo4ICswISAgMUdcKCAgKiAkL19SIEkiICAtK19fXz0gJCAhJiFRXiAoQD5AICApV0NPWSAxICAgMAotTVRAKEMnKCJCOCAgIkAgIClIIShDJy0gJCAgIj9QQCAgSCAwQCEtICQgICIgSEIgICRLX19eUCQgICAgMQotTSAgIClEIShCQiQgICFFNjIkIiAgQDw/QCIoJ0ggICI9WFteMCRQICAkLSAiOCtSIEhCICAkSCAgISkgMAotTSggJV9fX19HVCIpQE8oJydYIEIhWiAgICAgICAgICAgMCZQICAgMjZfX19fUSAgIDAnQCAgIEY2X19fXwotTU0gICAwKDAgICA2Nl9fX19LICAgMCkgICAkVjZfX19fMyAgICAgNCAgICA2ICAgIDJAICAgICAgICAgIAotTSAgICAmICAgICBIICAgIDcgICAgISAgICAhRCAgICApICAgIDUwICAgIFQgICAgQSAgICAoQCAgICJUIAotTSAgIEcgICAgMV9fX19fXCAgICAgICAgIC1AICAgICNfX19fXyAgICAgICAgICQkICAgICAgICAgIUAgIAotTSAjWCAgICAiICAgICUwICAgIFAgICAgUiAgICAqQCAgICAgICAgIEsgICAgLFAgICAiMCAgICBVICAgIAotTSFQICAgIjAgICAgISAgICAoICAgICAsICAgIDogICAgIiAgICAjQCAgICArICAgICwgICAgIFggICAgPAotTSAgICAjUCAgICFMICAgIDAgICAgKTAgICAhJCAgICA9ICAgICRAICAgIVggICAgMyAgICAnUCAgICEwIAotTSAgIFkgICAgJTAgICAiKCAgICA2ICAgICpQICAgITwgICAhJiAgICAmICAgICIsICAgIDkgICAgLDAgIAotTSAhSCAgICBHICAgICZQICAgIjggICAgPCAgICAqICAgICFUICAgIEogICAgJ0AgICAiRCAgICA/ICAgIAotTS9QICAgIiAgICAhISAgICAoMCAgICJQICAgIEMgICAgK1AgICAiNCAgICBOICAgIClAICAgICAgICAgSAotTSAgICAgICAgICJEICAgIFsgICAgKyAgICAjOCAgICBNICAgIC1QICAgIlggICAgVCAgICArUCAgICNUIAotTSAgIFAgICAgLkAgICAjJCAgICEvICAgICxAICAgICAgICAgUyAgICAwQCAgICMwICAgICAgICAgLTAgIAotTSAkNCAgICBXICAgIC8gICAgI0AgICAhICAgICAuMCAgICAgICAgIFogICAgICAgICAjTCAgICE0ICAgIAotTS8gICAgJSggICAgXSAgICAwUCAgICNYICAgISQgICAgL1AgICAkRCAgICEgICAgIDIgICAgJCggICAgIAotTSAgICAwUCAgICAgICAgISQgICAgMzAgICAkNCAgICEqICAgIDFAICAgJFAgICAhJyAgICAyUCAgICRAIAotTSAgITAgICAgMjAgICAkWCAgICErICAgIDQwICAgJFAgICAhMyAgICAzMCAgICAgICAgIS4gICAgICAgIAotTSAkXCAgICAgICAgIDQgICAgICAgICAhMSAgICAgICAgICUoICAgICAgICAgNFAgICAgICAgICAgITAgJwotTUMgICAsW0AgICAgJyFQICZYMCAgMCxAICAgIC4iMCAlUyAgIDBSQCAgICAzITAgJSNAICAoIiAgICAgOQotTSAwICM4QCAgICAgICAgIEUgMCAmWEAgICAgICAgICBMITAgIz9AICAoW0AgICAgUiFQICU8QCAgMCogIAotTSAgIFshUCAnLjAgIDAgICAgICElIDAgI0ggICAgICAgICAhKyEwICBcUCAgKFFQICAgIT4hMCAnS1AgIAotTShQQCAgICFKIjAgJ1NQICAwLEAgICAhUyEwICJAUCAgKE8wICAgIioiMCAmXSAgIDAtICAgICJBIjAgIwotTV5AICAwLUAgICAiWCIwICczUCAgMC4gICAgIy8iMCAkOjAgIDAuQCAgICNGIjAgIktAICAwLyAgICAjVgotTSIwICg0QCAgMC9AICAgJCYiMCAmQCAgIDAwICAgICQ2IjAgIDMgICAwMEAgICAkRiIwICBOMCAgMDEgIAotTSAgJFYiMCAnUUAgIDAyICAgICRfIjAgJlIgICAwMkAgICAlKCIwICdGQCAgMDMgICAgJTEhMCAkRFAgIAotTShVQCAgICVFITAgJztQICAoSjAgICAlWSIwICIgUCAgMDNAICAgJi0hMCAgU1AgIChUMCAgICY6ITAgIwotTUpQICAoSSAgICAmRyIwICZXMCAgMDQgICAgJlQhMCAkSUAgIClUUCAgICZcIjAgKEEgICAwNEAgICAnNAotTSIwICYlICAgMDUgICAgJ0wiMCAlKFAgIDA1QCAgICgkIjAgJFYwICAwNiAgICAoNSIwICJdQCAgMDZAIAotTSAgKEYiMCAmKUAgIDA3ICAgIChXIjAgJDlAICAwN0AgICApKCIwICcoICAgMDggICAgKTIiMCAlOlAgIAotTTA4QCAgICk8ITAgJFEwICAoUyAgICApUSEwICQ9UCAgKE4gICAgKiYiMCAgSTAgIDA5ICAgICo7IjAgJgotTTcwICAwOUAgICAqUCEwICUpUCAgKFgwICAgKl4hMCAlQzAgIChMUCAgICssIjAgKDEgICAwOiAgICArOgotTSIwICFOUCAgMDpAICAgK0giMCAnPFAgIDA7ICAgICtWIjAgJ1BAICAwO0AgICAsLyIwICRSICAgMDwgIAotTSAgLEgiMCAnXCAgIDA8QCAgICxPIjAgIl4gICAwPSAgICAsWiIwICcxICAgMD1AICAgLSwiMCAhVkAgIAotTTA+ICAgIC0+IjAgJEdAICAwPkAgICAtRyIwICcqUCAgMD8gICAgLVIiMCAnKyAgIDBAQCAgIC1dITAgIwotTUYwICAoVlAgICAuMyEwICY9MCAgKEtAICAgLkkiMCAjU0AgIDBCICAgIC5fIjAgISIwICAwQkAgICAvNQotTSIwICA7MCAgMEMgICAgL0siMCAiPVAgIDBDQCAgIC9XIjAgJzEwICAwRCAgICAvXyEwICRHMCAgKFlQIAotTSAgMC4iMCAoODAgIDBEQCAgIDA9IjAgJV5AICAwRSAgICAwTCIwICdbQCAgMEVAICAgMFsiMCAhUzAgIAotTTBGICAgIDEqIjAgIkYwICAwRkAgICAxOSIwICdBMCAgMEcgICAgMUEiMCAnSyAgIDBQICAgIDFbIjAgJwotTU4wICAwUEAgICAyIyIwICcxQCAgMFEgICAgMisgMCAmPSAgICAgICAgIDI0IVAgIkYgICAwLCAgICAyRgotTSIwICc8MCAgMFFAICAgMlUiMCAiVFAgIDBSICAgIDMkITAgJj4wICApUCAgICAzNyEwICZCMCAgKUhAIAotTSAgM0ohUCAlSCAgIDArQT85NzFFPicwIDdWNUQ4NzFBICVdRTtGMCA8VzFBPEcwIDxXMUE8RzE/OUZRTwotTTg3MCA3VV1FPiZFVCAlXU04NkVOICVdRTtHOUk8Rl1OICVdPzElRS4wNFUpMFAhPzk3QUk9ICE/PUVdUwotTTo2PU45NjE/OjZZVDdWOVU7RiwgN1c5Pzo2WVQ3VjlVO0YsIDdXIVI6NlVBPEdEIDdXOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzlHNU44UCE/PUVdUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRQotTTklXUM6JiVSN1chTzo2WVQ5NyggN1c5Pz02WVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4wIT89RV1VO0ctSQotTTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdWUU87Rj0/PCZdSTtHMUU8QCE/PUVdQzomJVI3VyFPOjZZVAotTTk3KCA3Vzk/PTZZUzo2PU45NjE/OjZZVCAlXVY3Vy1JOVZZRTklXVM6Jl1SPSAhPz1FXUQ7VzVCOyY1PwotTTg3KVI4N0QgN1c5Pz02WUk7VlggN1c5PzlGUU84NzAgN1c5PzxWQU88RzAgN1c5PzxWRUc7RjVEN1ZRTwotTTtGPT85RzVOOFAhPz1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzE/ODcpUgotTTg3RCA3Vzk/OyZdTjlVXUY9NllDICVdVjdWLUg4Nyk/OUc1TjhQIT89RV1JO0cxPzg3KVI4N0QgN1VdPwotTTs2JUk7QCE/PUVdVTtHLUk5VllFOSVdSTtHMT88Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT88VkFPPEcxPwotTTwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCE/PUVdVTtHLUk5VllFOSVdTAotTTtWWUcgJV1WN1Y5TDtWJVQ3VyFPOjZZVDk3KCA3Vzk/PFZBTzxHMT88Jl1JO0cxRTxAIT89RV1VO0ctSQotTTlWWUU5JV1DOiYlUiAlXVY3VzVOOjZdTixAIT89RV1EO1c1QjsmNCA3Vzk/PTZZUzo2PU45NjE/OjZZVAotTTdWOVU7RiwgN1c5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIDdXOT88VkVHO0Y1RDdWUU87Rj0/ODcpUgotTTg3RCA3Vzk/PFZFRztGNUQ3Vi1IODcpPzg3KVI4N0QgN1c5PzlGUU84NzE/OUc1TjhQIT89RV1TOiZdUgotTT0lXUY9NllDICVdVjdXLUk5VllFOSVdSTtHMCA3Vzk/OyZdTjlVXUE8RylBPjAhPz1FXUM6JiVSN1YlUgotTTxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUgotTTdXIU86NllUOTcoIDdXOT86NllUICVdUzwmXVI9Jy1DODcoIDdXOT85Jl1VOEZRRTdXIU86NllUOTcoIAotTTdXOT89NllTOjY9Tjk2MT88VkFPPEcwIDdWLUw9NllLOTcoIDdXOT88VzFSPTYtVCwwIT89RV1TPScpVQotTThXMFIgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1Y5VQotTTtGLCA3Vzk/PFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQQotTT4wIT89RV1TOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgN1ZZTztHIVI6NlVBPEdEIDdXLT87JkVOOlAhPwotTT1FXUQ7VzVCOyY1PzlHNU44UCE/PUVdUzo2PU45NjE/OyZdTjlQIT89RV1JO0cxPzwmXUk7RzFFPEAhPwotTT1FXVM6Nj1OOTYxPzhWQUE8QCE/PUVdRjsmXUE9JV1BPEcpQT4wIT89RV1TOiZdUj0lXUE8RylBPjAhPwotTT01XUw6NllLICVdVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggN1c5PzsmXU45UCE/PUVdQwotTTomJVIgJV1PO0VdRT4mRVQgJV0/OTdBST0lXUQ9NlVNPjVdRDk2LUwgJV0/N1QtNDNVKT8zJEUzNSVdPwotTSAlXT83VDE0M1UpPzMkRTM1JV0/ICVdPzdWMU83Vj1MO1YpQTslXUM9Jl1SPFAhPzdVXUQ7VV1HOyZdQgotTTg2UT85JzFPPEcsIDdVXUU+JkVUN1YxVTs2VVk3VylFOUAgICAgICAgIl1VPFcoTzsmXUM4NlBPOyZFQgotTStWPUM4UlVMOjYoTzxXNU4tIlxSK0MkTy5CXVU8VyhPOyZdQzg2UE87JkVCK1AgICAgICAgICAgICAgMwotTUQoICAgICAgIDAgJiAgICAgJiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAjICAhICMgICAwIjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotTUAgICAkVEAgICQhPCAgISA4ICAgIVdAICAgPkggICAqNiAgICAgICAgICA1ICAgLjIgICAhMCAgICIgIAotTSAgICAvICAgMCAgIyAgICBAPCFAICAkICAgIj1YW15AP19fX18gJCAgICI9WFteQD9fX19eMCQgICAmPQotTVhbXkA/X19fXUAkICAgKj1YW15AP19fX1xQJCAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICQhSQotTSAgICAgICAgICAhIFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAwJiAgICAgICEgICAgICAgWCQgICAgICAgQCggICAgITQkICAgICAgIEJEICAgICFUJAotTSAgICAgICBCRCAgICAiUUQgICAgICAgQkQgICAgJTVEICAgICAgIEJEICAgICVWICAgICAgICAgICAgIAotTSAnXiAgICAgICAgICAgICAgKSYgICAgICAgICAgICAgICtCICAgICAgICAgICAgICAtJiAgICAgICAgIAotTSAgICAgLl4gICAgICAgICAgICAgIDBWICAgICAgICAgICAgICAyPiAgICAgICAgICAgICAgNEYgICAgIAotTSAgICAgICAgIDZSICAgICAgICAgICAgICA4RiAgICAgICAgICAgICAgOjYgICAgICAgICAgICAgIDs+IAotTSAgICAgICAgICAgICA8SiAgICAgICAgICAgICAgPiogICAgICAgICAgICAgID5aICAgICAgICAgICAgIAotTSBIQiAgICAgICAgICAgICAgICEkICAhWSAgIEJEICAgICAhJCAgIVkgICBCRSAgICAgISQgICFZICAgQgotTUcgICAgUUhEICAgICAgIEJEICAgICAhJCAgIVogICBCSSAgICAgISQgICFaICAgQkogICAgICEkICAhWgotTSAgIEJMICAgIFJERCAgICAgICBCSSAgICAgISQgICFbICAgQk4gICAgICEkICAhWyAgIEJPICAgICAhJAotTSAgIVsgICBCUSAgICBUIEQgICAgICAgQk4gICAgICEkICAhXSAgIEJTICAgICAhJCAgIV0gICBCVCAgIAotTSAgISQgICFdICAgQlYgICAgVUREICAgICAgIEJTICAgICAhJCAgIV4gICBCWCAgICAgISQgICFeICAgQgotTVkgICAgICEkICAhXiAgIEJbICAgIFZERCAgICAgICBCWCAgICAgISQgICFfICAgQl0gICAgICEkICAhXwotTSAgIEJeICAgICAhJCAgIV8gICBDICAgICBYIEQgICAgICAgQl0gICAgICEkICAiISAgIEMiICAgICAhJAotTSAgIiEgICBDIyAgICAgISQgICIhICAgQyUgICAgWUREICAgICAgIEMiICAgICAhJCAgIiIgICBDJyAgIAotTSAgISQgICIiICAgQyggICAgICEkICAiIiAgIEMqICAgIFo8RCAgICAgICBDJyAgICAgISQgICIjICAgQwotTSwgICAgICEkICAiIyAgIEMtICAgICAhJCAgIiMgICBDLyAgICBbUEQgICAgICAgQywgICAgICEkICAiJQotTSAgIEMxICAgICAhJCAgIiUgICBDMiAgICAgISQgICIlICAgQzQgICAgXSxEICAgICAgIEMxICAgICAhJAotTSAgIiYgICBDNiAgICAgISQgICImICAgQzcgICAgICEkICAiJiAgIEM5ICAgIF4oRCAgICAgICBDNiAgIAotTSAgISQgICInICAgQzsgICAgICEkICAiJyAgIEM8ICAgICAhJCAgIicgICBDPiAgICBfQEQgICAgICAgQwotTTsgICAgICEkICAiKSAgIENBICAgICAhJCAgIikgICBDQiAgICAgISQgICIpICAgQ0UgICAhISBEICAgIAotTSAgIENBICAgICAhJCAgIiogICBDRyAgICAgISQgICIqICAgQ0ggICAgICEkICAiKiAgIENLICAgISIkRAotTSAgICAgICBDRyAgICEjLiAgICAgICAgICAgICAhKV4gICAgICAgICAgICAgIS1eICAgICAgICAgICAgIAotTSEwOiAgICAgICAgICAgICAhMiogICAgICAgICAgICAgITQiICAgICAgICAgICAgICE1UiAgICAgICAgIAotTSAgICAhNkYgICAgICAgICAgICAgICAhJCAgIlIgICBDTiAgICAgISQgICJVICAgQ1EgICAgICEkICAiVgotTSAgIENTICAgICAhJCAgIlcgICBDViAgICAgISQgICJZICAgQ1kgICAgICEkICAiWiAgIENcICAgICAhJAotTSAgIlsgICBDXyAgICAgISQgICJdICAgRCIgICAgICEkICAiXiAgIEQlICAgICAhJCAgIl8gICBEKCAgIAotTSAgISQgICMhICAgRCsgICAgICEkICAjIiAgIEQuICAgICAhJCAgIyMgICBEMSAgICAgISQgICMlICAgRAotTTQgICAgICEkICAjJiAgIEQ4ICAgICAhJCAgIykgICBEPCAgICAgISQgICMqICAgREAgICAgICEkICAjKwotTSAgIEREICAgICAhJCAgIy0gICBESCAgICAgISQgICMuICAgREwgICAgICEkICAjLyAgIERQICAgICAhJAotTSAgIzEgICBEVCAgICAgISQgICMyICAgRFggICAgICEkICAjMyAgIERcICAgICAhJCAgIzUgICBFICAgIAotTSAgISQgICM2ICAgRSQgICAgICEkICAjNyAgIEUoICAgICAhJCAgIzkgICBFLCAgICAgISQgICM6ICAgRQotTTAgICAgICEkICAjPCAgIEU0ICAgICAhJCAgIz0gICBFOCAgICAgISQgICM+ICAgRTwgICAgICEkICAjQAotTSAgIEVAICAgICAhJCAgI0EgICBFRCAgICAgISQgICNCICAgRUggICAgICEkICAjRCAgIEVMICAgICAhJAotTSAgI0UgICBFUCAgICAgISQgICNGICAgRVQgICAgICEkICAjSCAgIEVYICAgICAhJCAgI0kgICBFXCAgIAotTSAgISQgICNKICAgRiAgICAgICEkICAjTCAgIEYkICAgICAhJCAgI00gICBGKCAgICAgISQgICNPICAgRgotTSwgICAgICEkICAjUCAgIEYvICAgICAhJCAgI1EgICBGMiAgICAgISQgICNSICAgRjUgICAgICEkICAjVAotTSAgIEY4ICAgICAhJCAgI1YgICBGPCAgICAgISQgICNXICAgRkAgICAgICEkICAjVyAgIEZAICAgITk4RAotTSAgICAgICBDTiAgICE5WEAgICAgICAgICAgICAhOkBAICAgICAgICAgICAgITtIQCAgICAgICAgICAgIAotTSE8WEAgICAgICAgICAgICAhPURAICAgICAgICAgICAgIT5MQCAgICAgICAgICAgICE/XEAgICAgICAgIAotTSAgICAhQEBAICAgICAgICAgICAgIUFAQCAgICAgICAgICAgICFCSEAgICAgICAgICAgICAhQzBAICAgIAotTSAgICAgICAgIUQ0QCAgICAgICAgICAgICFFQEAgICAgICAgICAgICAhRjBAICAgICAgICAgICAgIUckQAotTSAgICAgICAgICAgICFIUEAgICAgICAgICAgICAhSlxAICAgICAgICAgICAgIU0wQCAgICAgICAgICAgIAotTSFPIEAgICAgICAgICAgICAhUERAICAgICAgICAgICAgIVJYQCAgICAgICAgICAgICFUQEAgICAgICAgIAotTSAgICAhVVxAICAgICAgICAgICAgIVgoQCAgICAgICAgICAgICFZVEAgICAgICAgICAgICAhWzRAICAgIAotTSAgICAgICAgIV1EQCAgICAgICAgICAgICFfOEAgICAgICAgICAgICAiITBAICAgICAgICAgICAgIiJIQAotTSAgICAgICAgICAgICIkQEAgICAgICAgICAgICAiJkBAICAgICAgICAgICAgIidcQCAgICAgICAgICAgIAotTSIpSEAgICAgICAgICAgICAiK0hAICAgICAgICAgICAgIixcQCAgICAgICAgICAgICIuQEAgICAgICAgIAotTSAgICAiMDhAICAgICAgICAgICAgIjFQQCAgICAgICAgICAgICIzOEAgICAgICAgICAgICAiNTRAICAgIAotTSAgICAgICAgIjZUQCAgICAgICAgICAgICI4OEAgICAgICAgICAgICAiOTBAICAgICAgICAgICAgIkJcQAotTSAgICAgICAgICAgICJDTEAgICAgICAgICAgICAiTFhAICAgICAgICAgICAgIk1EQCAgICAgICAgICAgIAotTSJOMEAgICAgICAgICAgICAiUEBAICAgICAgICAgICAgIlE8QCAgICAgICAgICAgICJTNEAgICAgICAgIAotTSAgICAiVCwkICAgICAgIEZCICAgIlRQJCAgICAgICBGQiAgICJVTCYgICAgICAhIE8gICAiVklEICAgIAotTSAgIEZCICAgIldVRCAgICAgICBGQiAgICJYRiAgICAgICAgICAgICAiWk4gICAgICAgICAgICAgIltWIAotTSAgICAgICAgICAgICJeMiAgICAgICAgICAgICAiX1YgICAgICAgICAgICAgIyFOICAgICAgICAgICAgIAotTSMjRiAgICAgICAgICAgICAjJS4gICAgICAgICAgICAgIyc2ICAgICAgICAgICAgICMpQiAgICAgICAgIAotTSAgICAjKzYgICAgICAgICAgICAgIy0mICAgICAgICAgICAgICMuLiAgICAgICAgICAgICAjLzogICAgIAotTSAgICAgICAgIzBaICAgICAgICAgICAgICMxSiAgICAgICAgICAgICAjNk4gICAgICAgICAgICAgIzdCIAotTSAgICAgICAgICAgICM4KiAgICAgICAgICAgICAjOFYgICAgICAgICAgICAgIzs6ICAgICAgICAgICAgIAotTSM9UiAgICAgICAgICAgICAjPyREICAgICAgIEZCICAgI0A8QCAgICAgICAgICAgICNBWEQgICAgICAgRwotTSAgICAjQzBEICAgICAgIEczICAgI0NcJCAgICAgICBHPiAgICNEPCQgICAgICAgRz4gICAjRTlEICAgIAotTSAgIEc+ICAgI0ZFRCAgICAgICBHPiAgICNHNiAgICAgICAgICAgICAjST4gICAgICAgICAgICAgI0pGIAotTSAgICAgICAgICAgICNNIiAgICAgICAgICAgICAjTkYgICAgICAgICAgICAgI1A+ICAgICAgICAgICAgIAotTSNSNiAgICAgICAgICAgICAjU14gICAgICAgICAgICAgI1YmICAgICAgICAgICAgICNYMiAgICAgICAgIAotTSAgICAjWiYgICAgICAgICAgICAgI1tWICAgICAgICAgICAgICNcXiAgICAgICAgICAgICAjXiogICAgIAotTSAgICAgICAgI19KICAgICAgICAgICAgICQgOiAgICAgICAgICAgICAkJT4gICAgICAgICAgICAgJCYyIAotTSAgICAgICAgICAgICQmWiAgICAgICAgICAgICAkJ0YgICAgICAgICAgICAgJCoqICAgICAgICAgICAgIAotTSQsQiAgICAgICAgICAgICAkLVRAICAgICAgICAgICAgJC8kQCAgICAgICAgICAgICQwWEAgICAgICAgIAotTSAgICAkMiAkICAgICAgIEc+ICAgJDIxRCAgICAgICBHPiAgICAgISQgL19fICAgRz4gICAkMkwlICA+LAotTSAgIFNOICAgJDMoJyAgO0EgICEgUiAgICQzRCkgIDcsICAhIyogICAkM1glICA0LiAgIEAoICAgJDQwJQotTSAgLV4gICBDTiAgICQ0SCcgIDVSICAhIEggICAkNSwlICAjUyAgIEMnICAgJDY4JSAgPk8gICBDIiAgIAotTSQ3KCkgID8vICAhIFIgICAkN0wlICAqIyAgIEJdICAgJDkoKSAgO1QgICEgVCAgICQ6RCkgIC9aICAhIAotTVYgICAkPCApICA9LyAgISBYICAgJD08KSAgMUkgICEgWiAgICQ+WCkgICpOICAhIFwgICAkP1gpICBBMgotTSAgISBeICAgJEBYKSAgOiAgICEhICAgICRBWCkgICEsICAhISIgICAkQlgpICAiWSAgISEkICAgJENYKQotTSAgPyYgICEhKCAgICREPCkgIDsoICAhISogICAkRSApICA+OiAgISEsICAgJEVEJSAgMjMgICBDNiAgIAotTSRGVCUgID1PICAgQkkgICAkSCQpICAoIyAgISEuICAgJEk0JSAgIy8gICBDMSAgICRKKCUgIC5LICAgQgotTUQgICAkSlwpICA7PSAgISEwICAgJEtQJSAgMkYgICBHMyAgICRMMCkgIEIkICAhITIgICAkTVApICA4NAotTSAgISE0ICAgJE8wKSAgNEMgICEhNiAgICRQUCkgIDM5ICAhITggICAkUVQpICArViAgISE6ICAgJFJYKQotTSAgOEYgICEhPCAgICRTXCkgIDFGICAhIT4gICAkVSApICA8QCAgISFAICAgJFVIKSAgNUsgICEhQiAgIAotTSRWMCUgIDMlICAgQywgICAkV0QlICAxVyAgIEJYICAgJFhYKSAgIkUgICEhRCAgICRaLCkgIDk9ICAhIQotTUYgICAkW0AlICA0RyAgIENBICAgJFw4JSAgNi0gICBCUyAgICRdMCkgIEEkICAhIUggICAkXigpICAmWwotTSAgISFKICAgJF8gKSAgPVMgICEhTCAgICRfWCkgID8iICAhIU4gICAlITwpICAzKCAgISFQICAgJSMgKQotTSAgP1AgICEhUiAgICUjPCkgICtYICAhIVQgICAlJCgpICA9JCAgISFWICAgJSUwKSAgJzogICEhWCAgIAotTSUmOCkgIDI+ICAhIVogICAlJlwpICA8SyAgISFcICAgJSdIKSAgPEwgICEiIiAgICUoNCUgIC45ICAgQwotTTsgICAlKUwlICA5VSAgIEJOICAgJSskKSAgLy4gICEiKCAgICUsPCkgICQpICAhIiogICAlLVQpICAhTQotTSAgISIsICAgJS8sKSAgKVcgICEiLiAgICUvXCkgID0lICAhIjAgICAlMDwlICAyPSAgIENHICAgJTE4KQotTSAgQUEgICEiMiAgICUyNCkgIDdaICAhIjQgICAlMzApICA/TiAgISI2ICAgJTQsKSAgJy0gICEiOCAgIAotTSU1KCkgICo5ICAhIjogICAlNiQpICA+JSAgISI8ICAgJTZEKSAgPkwgICEjICAgICU4LCkgID5ZICAhIwotTSIgICAlOEwpICA9JiAgISMkICAgJTksJyAgKjggICEgUCAgICU6NCkgID1RICAhIyYgICAlOzApICArMwotTSAgISMoICAgJTwsJSAgOVkgICBHICAgICU9OCUgIDopICAgRkIgICAlPkQnICA2QCAgISBOICAgJT9JPwotTTdUMTkzRCUtMjQsIDhXKVQsIllPICY9RDhGVUUrRlwgOVYtQyxFXUM7VlVQOjZRRTkiWCArVkFPOzY0TwotTTlWWVUrVj1EOEJdVztXKUsrVllFPVJdRDk3OU8rVj1EOEcxRTxXME89IyRQK1AhRzkmKU05MllDICZFTgotTT0jSVQsM1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcuUCFDOiYlUi5HMFIvNyhSLlMgWwotTSwzKFcuUCFMO1ZZRygmRU49I0lULFNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhVQotTTtHLUk5VllFOSIhSTtHMFo9IzBdPEMkWywjTE0sM0wgOyZdTjlSIVU7Ry1JOVZZRTkiIUk7RzBaPSM0XQotTTxDJFssI0xNLDNMIDxWQU88RzBAOjZZVC5HMFYvNyhRLlJUUyxDPFYuI0xTLEM8Vi1TTCA7Jl1OOVIhTAotTTtWWUcoJkVOPSNJVC1TVVIsM0xQLlJUUS5QIVM6Jl1SPSIhVTtHLUk5VllFOSIhSTtHMFo9I0BdPEMkWwotTSwjTFYtMzRTLTNMIDsmXU45UiFMO1ZZRygnNU48VkVHO0Y1RCgmRU49I0lULjNVUiwzTFAuUlRRLlAhUwotTTo2PU45NjBAOFZBQTxDSVQsMyBdPEMkWyszJFIuI0xRLEM8WyAnNU48VkVHO0Y1RCgmLUg4NyhaPSMkUQotTS83KFEuUyBbLEM0VS5QIUY7Jl1BPSNJVCwzKF08QyRbLSNMUC5QIUQ7VzVCOyY0Wj0jJFMvNyhRLlNAWwotTSwjTCA7Jl1OOVIhRDtXNUI7JjRaPSMkVC83KFEuU0BbLCNMID1GXUk5I0lULDM0XSwzNCA9JV1TPScpVQotTThXMFo1IyRWLzcsUi0nOT84VkFBPEVdTTk2VUI5NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWgotTS1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFosMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTAotTS1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1UgotTS5DJFMrIyRSLiJQVi0jTFsgJzE/PTZZSTtWWFo1IyRXLzc0WD1FXUM6JiVSN1ZVRTs2KUU8Q0hSKyMgTAotTS4jTVY3Vy1IO1cpVDdWVUU7NilFPENIVisjIEwsMzhbPUVdSTtHMT87NjVNOEY1Ui5DJEwsIlBTLENNVgotTTdWUU87Rj0/OzY1TThGNVIuQyxMLCJQUyxDTVY3VjlMO1YlVDdWVUU7NilFPENIUSxCUFArIyxSLlc5PwotTTkmXVU4RlFFN1ZVRTs2KUU8Q0hRLFJQUCsjOFQuU0wgPUVdQzomJVI3VjlVO0YsWjFDKCA9RV1TOjY9TgotTTk2MT84VkFBPEVdRj02WUMuRDhRLCAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TjhTSSYsMyQgPUVdUwotTTomXVI9JV1GPTZZQy5EOFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RixaMUM4ID1FXVU7Ry1JOVZZRQotTTklXVM6Jl1SPSVdRj02WUMuRDhYICc5Pzo2WVQ3VjlVO0YsWjFDJCA9RV1TOjY9Tjk2MT86NllUN1Y5VQotTTtGLFoxQyQgPUVdVTtHLUk5VllFOSVdSTtHMT85RzVOOFNJJi0gIVY3VlFPO0Y9PzlHNU44U0kmLFAhVgotTTdXLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDLCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWOVU7RixaMUM0IAotTT1FXUY7Jl1BPSVdRj02WUMuRDhRLEAhVjdWMU89NilMOTVdRj02WUMuRDhRLFAhTDo2WUsuRTBRLiNVUwotTSwzNFI7RjVYPSNIUS4zVEosM0BMLCJQUyxDTUw6NllLOUc1TjhTSFIsI1RKLEMkXTlDJFkrIyxSKyMsUgotTS5XLVQ9NjlGLkMoUi82JVIsM0xQLlMgWyxDLF04NyhRLlMgWywzTFItI1VBPEMkWywjTFIuUyRWKyM4VAotTSsjJFEtMyhbLlAhVD01XUw6NllLLkUwUi0zVVUsMzBUO0Y1WD0jSFEuMlBQKyMsUi5WUUk7Rk1GPTZZQwotTS5DKFArIyBMLFMoWzxXMVU5RjhaLEMoTCwiUFEsMzRSLlNMIDhWXUw7VylTLkUwUi1DVUU+NjVMOyZdVwotTS5DIEw8JzVSPCZRRS5DJEw8JkVOOlNIUisjTCA4ViVSPFNJNCxDPF05NilNPVNIUCsnIU88Ry1DOiY0WgotTSwyUFsgJilPO1ZRRTg2WFo9IyhYLzY1JjA0UTMxM0hQKyUxMjU0NFosMlBbICYpVjg2UVMuRTBSLjNVRQotTTlGJUw8VjRaLCJRVDxHNUUuQyRMLlAhQjtWXUw5NiVOLENJVCxDRCA7NkVTO1cpRDk3KUU5I0k0LFMgXQotTTk3MVc7U0hSKyZdTjkzSFErJ0lFPEZcWiwiUVQ6JylFOTNIUysjTCA7NiVJO0NJJiwwIVY3Vi1IODcoWgotTTFTKCA9RV1TOjY9Tjk2MT84VkFBPENJJywzICA9RV1VO0ctSTlWWUU5JV1DOiYlUi5EPFEsMCFWN1ctSAotTTtXKVQuRDxWICc5PzxWRUc7RjVEN1ctSDtXKVQuRDxWICc5Pz02WVM6Nj1OOTYxPzxWQU88RzBaMVNAIAotTT1FXUk7RzBaMVMkID1FXVM6Nj1OOTYxPzo2WVQuRDxRICc5Pz02WVM6Nj1OOTYxPzo2WVQuRDxUICc5PwotTTsmXU45U0knLFAhVjdXLUk5VllFOSVdTDtWWUcuRDxTICc5Pz02WVM6Nj1OOTYxPzsmXU45U0knLTAhVgotTTdWOUw7ViVULkQ8USxAIVY3VjFPPTYpTDkzSScsMywgPUVdQzomJVI3ViVSPEYlWS5EPFMsM1VBPEMkWwotTSwjTFEuUyggPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjNJJyxTKF04NyhRLlMgWywzTFEsICFWN1c1TgotTTxWRUc7RjVEN1YtSDg3KT84NylSODdEWjFTLFMvNiVSLDNMUC5TJFssMyQgPUVdUzomXVI9JV1BPEcpQQotTT4zSScsUzBdODcoUS5TIFssM0xWICc5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWS5EPFMtICFWN1c1TgotTTxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWS5EPFMtM1VBPEMkWywjTFEuU0AgPUVdSTtHMT84NylSODdEWgotTTFTLFYvNiVSLDNMUC5TJFssMCFWN1ctSTlWWUU5JV1JO0cxPzg3KVI4N0RaMVMsViAnOT89NllTOjY9TgotTTk2MT86NllUN1YlUjxGJVkuRDxTLVNVQTxDJFssI0xRLlMwID1FXUw7VllHN1YlUjxGJVkuRDxTLiNVQQotTTxDJFssI0xRLlMsID1FXVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4zSScsU0AgPUVdVTtHLUk5VllFOSVdTAotTTtWWUc3ViVSPEYlWS5EPFMuM1VBPEMkWywjTFEuUzQgPUVdRjsmXUE9JV1BPEcpQT4zSSctIyBdODcoUQotTS5TIFssM0xRLEAhVjdWMU89NilMOTVdQTxHKUE+M0knLSMkXTg3KFEuUyBbLDNMUSxQIVY3Vi1IODcpPwotTTwmXUk7RzFFPENJJy0jKF0qQyggPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1Ui5EPFQsU1RKLDMgIAotTT1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyhaMVMwVC8ySFEsMCFWN1ctSDtXKVQ3VyFPOjZZVAotTTk3KFoxUzBVLzJIViAnOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyhaMVMwVSAnOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzwmXUk7RzFFPENJJy0jOF0qQ0AgPUVdSTtHMT88Jl1JO0cxRTxDSSctIzxdKkMkIAotTT1FXVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KFoxUzBXICc5Pz02WVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVAotTTk3KFoxUzBYLzJIVCAnOT87Jl1OOVVdUDtWRU49JjVSLkQ8VC4zVEosUCFWN1ctSTlWWUU5JV1MO1ZZRwotTTdXIU86NllUOTcoWjFTMFkgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1Ui5EPFUsI1RKLTAhVgotTTdWOUw7ViVUN1chTzo2WVQ5NyhaMVM0US8ySFEsQCFWN1YxTz02KUw5NV1QO1ZFTj0mNVIuRDxVLENUSgotTSwzLCA9RV1TPScpVThXMFEuRDxRLUAhVjdXLVQ8RzVDPSMoWjFTNFMvNyxSLSc5PzhWQUE8RV1NOTZVQgotTTk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaLUJQUS1CUFEtQ01WN1ZFTj0lXU05NlVCOTcoWgotTSwyUFMsQlBTLENNVjdWUU87Rj0/OzY1TThGNVIuQyxMLUMwTCxTKFs9RV1GOyZdQT0lXU05NlVCOTcoWgotTSwzKEwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSLkMkUysjJFIuIlBWLSNMWyAnOT89NllJO1ZYWgotTTFTJFcgJzk/PTZZSTtWWFIuRDxVLSNVVS4nOT84VkFBPEVdTTk2VUI5NyhaLEJQUCsjQFs9RV1TOiZdUgotTT0lXU05NlVCOTcoWi1CUFArIyRWLlc5Pzo2WVQ3VlVFOzYpRTxDSFErIyBMLFMoWz1FXUw7VllHN1ZVRQotTTs2KUU8Q0hTKyMgTCxTKFs9RV1GOyZdQT0lXU05NlVCOTcoWiwzKEwsIlBTLENNVjdWMU89NilMOTVdTQotTTk2VUI5NyhaLDMsTCwiUFYtI0xbICctPzsmRU46U0knLDNEID01XUw6NllLLkQ8Ui0wIVA8RkVNODcpWQotTS5EPFUtM1VFPEY1RC5DIEw5VylFOTZYWiwyUUI7JzVFLkMoTC5QIU47VllQPEZFTTg3KVkuRDxSLUAhQwotTTsnNU46VjVSLkQ8VS1DVUU4VkFFPUdEWiwiUUY7VylELkMkTC5QIVM8Jl1SPSctQzg3KFoxUyhXICVdPwotTTs2JUk7QllPICY9QzhTKT84Vl1NPCZFTDk2ME4gJV1JO0ZFVDo2JUw6N0lFOSJYUCAiXUc7RzRPOVYtQwotTStWPUM4UyhPPFcpQytQIE4rVlFJOEY9QzhTKE44UCFJO0cwWj0jJF08QyRbKzMoUS0jPFQuIyxWLSNAWwotTSxDJFQtUzBYLFM4VC1TTCA4VkFBPENJVCxDVVIsQ0xQLlMkUi1TTCA7Jl1OOVIhSTtHMFo9IyxdPEMkWwotTSszKFEtIzxULiMsVi0jQFssQyRULVMwWCxTOFQtU0wgPTZZUzo2PU45NjBAOjZZVC5HMFQvNyhRLlMgWwotTSszJFsgJlFPO0Y8QD02WVM6Nj1OOTYwQDo2WVQuRzBVLzcoUS5TIFsrMyRbICctSDtXKVQoJkVOPSNJVAotTS1DVVIsM0xNLFMoVy1DQFssUyhXLUM8WyAmUU87RjxAOyZdTjlSIUk7RzBaPSM8XTxDJFssI0xNLDNMIAotTTxWQU88RzBAPTZZUzo2PU45NjBAOjZZVC5HMFgvNyhRLlMgWy1DNFUsUzRbICZRTztGPEA7Jl1OOVIhVQotTTtHLUk5VllFOSIhSTtHMFo9I0RdPEMkWywjTE0sM0wgPFZFRztGNUQoJi1IODcoWj0jJFAvNyhRLlJUUQotTSxDQFssMyhXLlAhVTtHLUk5VllFOSIhQzomJVIuRzBRLDNVUiwzTFAuUyhVLTNMIDlGUU84NzBaPSMkUgotTS83KFEuUzBbLCNMIDkmXVU4RlFFLkcwUSxTVVIsM0xYLlMgWyAmUU87RjxAOSZdVThGUUUuRzBRLSNVUgotTSwzTFguUyBbICc5Tzo2MFo9IyRVLzMkVSAnKUU5VV1DOyYlUzxTSTQsMzhdOTRZLzdVKSUxVSxaLCJRJwotTTE0WSU0RCUsN1UpJTFVLFosMlEmNCVdMjE0PTMuQyhMMDRRLDdVKSUxVSxaLFJRLDI0VT80RDUnN1QtLAotTTA1LTMxNSxaLSJQWyAnIVQ8RjFJOUY5Pz0jSVQsMCFTOjdJRTdXMFo9IyQgPVYtSDg3KT89I0lULiAhTAotTTtWWUc7Jl1OOVNJNCwzPF08U0FIOjY9SC5DLEwsIlBTLENNTDtXPFosUlBTLEJQUyxDTFsgJlFPO0Y9PwotTTsmXU45U0lULDNAXT0zQVMuQyRXKyMgTC1DMFs7JlBaLVJQUCsjOFQuU0wgOUc1TjhVXVA9JyhaPSMkWQotTS8ySFIsI1VGLDM0IDdVXUQ7VV1HOyZdQjg2UT85JzFPPEcsWjFDJFUgJV1FPiZFVDdWMVU7NlVZN1cpRQotTTlDSScsQyRdKkMkIDdVXUQ7VV1HOyZdQjg2UT84VzFPPEcsWjFDJFUgJV0/OzYlSTtDSSYsMzQgN1Y1WAotTTo3ME47UCFHOFYsUjdWLU87NyFJOyY1RCtAIE85VllVK1Y9QzhSXUc4VixSK1ctUjhSXCArQl1MOjYpRwotTThWLFIrRiwgOjZZVC5HMFEvNyhRLlJUUiwzMFctI0BTLUMwWC5TKFEtIzxULiMsVi0jPFsgJi1IODcoWgotTT0jKF08QyhbLCNMUSxDPFsgJlFPO0Y8QDo2WVQuRzBTLzcoUS5SVFIsMzBXLSNAUy1DMFguUyhRLSM8VAotTS4jLFYtIzxbICc1TjxWRUc7RjVEKCZFTj0jSVQtI1VSLDNMUC5SVFEuUCFMO1ZZRygnNU48VkVHO0Y1RAotTSgmRU49I0lULTNVUiwzTFAuUlRRLlAhUzomXVI9IiFJO0cwWj0jOF08QyRbKzMsUi1TOFguUyxSLVM4VwotTS5QIUw7VllHKCZRTztGPEA6NllULkcwVy83KFEuUyBbKzMkWyAnLUg7VylUKCc1TjxWRUc7RjVEKCZFTgotTT0jSVQuI1VSLDNMUC5TOFUtMyxVLlAhTDtWWUcoJlFPO0Y8QD02WVM6Nj1OOTYwQDo2WVQuRzBZLzcoUQotTS5TIFsrMyRbICctSTlWWUU5IiFDOiYlUi5HMFEsI1VSLDNMTSwzKFguUyRSLVNMID02WVM6Nj1OOTYwQAotTThWQUE8Q0lULDMkXTxDJFssI0xSLTM0WyAmOUw7ViVULkcwUSxDVVIsM0xULlMgWyAmMU89NilMOTNJVAotTSwzLF08QyRbLiNMUC5QIUw7VllHKCYxTz02KUw5M0lULDMwXTxDJFsuI0xQLlAhVjtWRUQuRzBRLTNUUQotTS0wIVI5Nj0/OFZRQTxXLFo1IyRWLzY1LjNVXTIxND0zLkMgTDFUNS4xNSkhMyVdMjE0PTMuQyRMMUUhPwotTTRENSc0U0hSKyQlLDMlXTIxND0zLkMsTDMkRS03VSklMVVdIzMkJTM0VDUzLkMwTC5QIVA9JylEOjY5RgotTTdXMFo9IyQgPFZFWjk1XVQuRzBRICc9QzomJVI3VzBaPSNAIDsmXU45VlFPO0Y8WjUjJFcvNyxYOiZFRwotTTojSFMrIyBMLFMoWzsmXVcuQyxMLFMoTCxTKFsuUCFMO1ZZRzdWUU87RjxaPSMkWC83NFg8U0hRLVJQUAotTSsjOFQuVlFMLkM8TCwiUFYtI0xbICY5VTtGLT88JzFSLkcwUS4zVEosQyBdOUMkVSAlXUU+JkVUN1YxVQotTTs2VVk3VjFFOFZQWjFTJCA3VV0jNSRdMjdUUSk0VTE/N1NJJyxDJF04NyhRLlMgWywzTFEuMCE/N1QxNAotTTNVKT8zJEUzNSVdPy5EPFIsMCBNOyY8IDsmRUI5UllTICVdRT0mNVg9ICE/OTYxQT0mJCA3VjVOOSAhUwotTT0mJVI9ICE/OzYlSTtAIT85NllWOjcpTztAIT89RV1TOjY9Tjk2MT86NllUN1Y5VTtGLCA3Vzk/OjZZVAotTTdWOVU7RiwgN1chUjo2VUE8R0QgN1c5Pz02WVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhQIT89RV1TOjY9TgotTTk2MT87Jl1OOVVdUDtWRU49JjVSICVdVjdXLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KCA3Vzk/PTZZUwotTTo2PU45NjE/OyZdTjlVXUE8RylBPjAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1YlUjxGJVkgJV1WN1ZRTwotTTtGPT88Jl1JO0cxRTxAIT89RV1DOiYlUjdXIU86NllUOTcoIDdXOT89NllTOjY9Tjk2MT86NllUICVdVgotTTdXLUk5VllFOSVdUzomXVI9ICE/PUVdRDtXNUI7JjU/ODcpUjg3RCA3Vzk/PTZZSTtWWCA3Vzk/OUZRTwotTTg3MCA3Vzk/PFZBTzxHMCA3Vzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44UCE/PUVdUzo2PU45NjE/OFZBQQotTTxFXUY9NllDICVdVjdXLUk5VllFOSVdSTtHMT84NylSODdEIDdXOT87Jl1OOVVdRj02WUMgJV1WN1YtSAotTTg3KT85RzVOOFAhPz1FXUk7RzE/ODcpUjg3RCA3VV0/OzYlSTtAIT89RV1VO0ctSTlWWUU5JV1JO0cxPwotTTwmXUk7RzFFPEAhPz1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCE/PUVdVTtHLUk5VllFOSVdUwotTTomXVI9JV1BPEcpQT4wIT89RV1VO0ctSTlWWUU5JV1MO1ZZRyAlXVY3VjlMO1YlVDdXIU86NllUOTcoIAotTTdXOT88VkFPPEcxPzwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSICVdVjdXNU46Nl1OLEAhPwotTT1FXUQ7VzVCOyY0IDdXOT89NllTOjY9Tjk2MT86NllUN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVAotTTdWOVU7RiwgN1c5PzxWRUc7RjVEN1ZRTztGPT84NylSODdEIDdXOT88VkVHO0Y1RDdWLUg4Nyk/ODcpUgotTTg3RCA3Vzk/OUZRTzg3MT85RzVOOFAhPz1FXVM6Jl1SPSVdRj02WUMgJV1WN1ctSTlWWUU5JV1JO0cwIAotTTdXOT87Jl1OOVVdQTxHKUE+MCE/PUVdQzomJVI3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PwotTTwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggN1c5Pzo2WVQgJV1TPCZdUgotTT0nLUM4NyggN1c5PzkmXVU4RlFFN1chTzo2WVQ5NyggN1c5Pz02WVM6Nj1OOTYxPzxWQU88RzAgN1YtTAotTT02WUs5NyggN1c5PzxXMVI9Ni1ULDAhPz1FXVM9JylVOFcwUiAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PwotTTlHNU44UCE/PUVdVTtHLUk5VllFOSVdQzomJVI3VjlVO0YsIDdXOT88VkVHO0Y1RDdWRU49JV1QO1ZFTgotTT0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhPz1FXVM6Nj1OOTYxPzxWQU88RzE/ODcpUgotTTg3RCA3VllPO0chUjo2VUE8R0QgN1ctPzsmRU46UCE/PUVdRDtXNUI7JjU/OUc1TjhQIT89RV1TOjY9TgotTTk2MT87Jl1OOVAhPz1FXUk7RzE/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/OFZBQTxAIT89RV1GOyZdQQotTT0lXUE8RylBPjAhPz1FXVM6Jl1SPSVdQTxHKUE+MCE/PTVdTDo2WUsgJV1WN1c1TjxWRUc7RjVEN1ctSAotTTtXKVQ3VyFPOjZZVDk3KCA3Vzk/OyZdTjlQIT89RV1DOiYlUiAlXT85N0FJPSVdRD02VU0+NV1EOTYtTAotTSAlXT83VC00M1UpPzMkRTM1JV0/ICVdPzdUMTQzVSk/MyRFMzUlXT8gJV0/N1YxTzdWPUw7VilBOyVdQwotTT0mXVI8UCE/N1VdRDtVXUc7Jl1CODZRPzknMU88RywgN1VdRT4mRVQ3VjFVOzZVWTdXKUU5QCAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKCAgICAgICAgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1lbGYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyMGMwZi4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWVsZi51CisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLWJlZ2luIDc3NyBzcGFyYy1lbGYKLU0/VDUsMUAkIiAwICAgICAgICAgICAgICIgICggICAgISAgJC8lICAgICMwICAjOzAgICAgICAgVCAiICAKLU0hMCBIICE8ICRQICAgIDggICAgVCAgJCAtICAgICAgICAgIkAgICAgSCAgICAgNCAgICAgICAgICBQICAKLU0gLTAgICAgICAgICAgICAgICEkICAgICAgICAgISAgICAgICAgICAhICAgIC0gICEgIzAgICAgICAgIDMKLU09ICAgJFcwICAgICUgICQgICAgICAgJCAgIS5IICAoM0ogICAgICAgICAjTCAgICJNICAgICA8ICAwICAKLU0gICAgIEAgICUgUCAgQTAsICAgICAgICAgKEAgICAgICAgICAhUCAgICAgTz03LVIrVlFJOEJdTDkiWVMKLU07UlhRICAgICAgICAgJSwgICAhSCAgICAyUCAgICAgICAgICAgICAgLkAgICAmKCAgICBXICAgIDUgICAKLU0gICAgICAgICAgICA0UCAgICVcICAgIUQgICAgNCAgICAkICAgICEqICAgIDVQICAgIzggICAgICAgICAKLU0yMCAgICMsICAgIE0gICAgL1AgICAlWCAgICAgICAgICAgICAgIjQgICAgPCAgICAwUCAgICAgICAgITEKLU0gICAgKiAgICAgICAgICEiICAgICAgICAgIjAgICAhOyAgICAsICAgICMkICAgIFIgICAgMVAgICAkNCAKLU0gICEuICAgIDggICAgICAgICAgQyAgICArQCAgICVAICAgICAgICAgLzAgICAgICAgICAgICAgICggICAKLU0gJDAgICAhPCAgICAyICAgICAgICAgICAgICAgKyAgICAgICAgICEvICAgICAgICAgICAgICAhNiAgICAKLU0gICAgICY8ICAgITogICAgNjAgICAmOCAgICAgICAgIC5QICAgICAgICAgICAgICAgICAgICVUICAgICAKLU0gICAgK1AgICAgICAgICFFICAgICAgICAgICAgICAhQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQCAgICJEICAgICAgICAgICAgICAgICAKLU0gICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AgICAgICAgICAgICAgICAgICAKLU0gIjggICAgOyAgICAgICAgICFUICAgICAgICAgICAgICAhSCAgICBeICAgIDAwICAgIkwgICAgVSAgICAKLU0gICAgICAgICAgIDcgICAgICAgICAgICAgICAgICAgICAgICAgIiggICAgICAgICAgICAgICRQICAgICAKLU0gICAgICAgICAkOCAgICBYICAgIDRAICAgIzAgICAhLSAgICAgICAgICNQICAgICAgICAgICAgICAgICAKLU0gICBHICAgICAgICAgJTQgICAgICAgICAgICAgICFAICAgID4gICAgICAgICAgICAgICBZICAgIDhQICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICQgVSAgICAgICMgICAhICAgICAgICEgLkAgICAgICBQICAKLU0gQCAgICAgICAwLzwgICAgICAsICAgLCAgICAgICAkKjcgICAgICAjICAgJCAgICAgICAhI01AICAgICAKLU0gUCAgITAgICAgICAgMFtEICAgICAgLCAgIDggICAgICAgJC8iICAgICAgIyAgICcgICAgICAgISNRMCAKLU0gICAgIFAgICIgICAgICAgIDEtUCAgICAgICwgICBEICAgICAgICQzQCAgICAgICMgICAqICAgICAgICIKLU0kWkAgICAgICBQICAiUCAgICAgICBBMCAgICAgICAsICAgUCAgICAgICAoNCMgICAgICAjICAgLSAgICAKLU0gICAiJSlAICAgICAgUCAgI0AgICAgICAgICAgICAgICAgLCAgIFwgICAgICAgICAgICAgICAgIyAgIDAKLU0gICAgICAgICAgICAgICAgIFAgICQwICAgICAgICAgICAgICAgICwgICEoICAgICAgICAgICAgICAgICMKLU0gICAzICAgICAgICAgICAgICAgICBQICAlICAgICAgICAgICAgICAgICAsICAhNCAgICAgICAgICAgICAKLU0gICAjICAgNiAgICAgMCAiJSlAICAgICgkMCAgI0AgICAgRCAgMS1QICAgICAhKCAgIEQgICAgLyAgKDQKLU1IICAgICAwMSAgIC4gICAgJUAgIiUqQCAgICIwJDAgICNAICAgIVQgIEE0WCAgICAhISQgICBYICAgIFQKLU0gICg1LyAgICAgMDEgICAuICAgIC5AICIlNCAgICAgISQwICAjQCAgICRAICBBNSQgICAgISEkICAgWCAKLU0gICE2ICAoNTIgICAgIEAxICAgLiAgICA3UCAiJTUgICAgICgkMCAgI0AgICAnNCAgQTU4ICAgICIhJCAKLU0gIFggICAiKiAgKDU4ICAgICAwMSAgIC4gICAgR1AgIiU2MCAgICAkJDAgICNAICAgKjwgIEE1SCAgICAKLU0hISQgICBYICAgIlQgICQwOSAgICAhMDIgICAoICAgIFIwICEjWEAgICAgNCRAICAiICAgIC00ICBBNVAKLU0gICAgIiEkICAgWCAgICM+ICAoNT4gICAgIDAxICAgLiAgICBaICAiJTdQICAgICIkMCAgI0AgICAvWCAKLU0gQTVeICAgICBBJCAgIFggICAkLyAgKDVAICAgICBAMSAgIC4gICAhKFAgISNQQCAgICAgJEAgICFQICAKLU0gMkQgIEE2KCAgICAgQSQgICBYICAgJFggICQvUSAgICAhMDIgICAoICAgITEwICIlOFAgICAgJCQwICAKLU0jQCAgIDRUICBBNjAgICAgIEEkICAgWCAgICU6ICAoNUYgICAgIUAxICAgLiAgICE5ICAiJTsgICAgIDgKLU0kMCAgI0AgICA2WCAgQTcoICAgICEhJCAgIFggICAlVSAgKDVTICAgICAwMSAgIC4gICAhQSAgIiU9ICAKLU0gICAkJDAgICNAICAgOVAgIDEhMCAgICAlISggICBAICAgJk8gICg1VSAgICAgMDEgICAuICAgIVFAICIKLU0lPUAgICAgIiQwICAjQCAgIDxYICAwX0wgICAgJSEoICAgQCAgICdEICAoNCMgICAgICAxIC9fUSAgICEKLU1bMCAhJCpAICAgKygkQCAgIiAgICA/KCAgMS4gICAgICEhJCAgIEggICAnXyAgJDBEICAgICFAMiAgICgKLU0gICAiIzAgIiU9SCAgICAiJDAgICNAICAgQiQgIDEgNCAgICAlISggICBAICAgKFMgICg1VyAgICAgMDEKLU0gICAuICAgIjBQICIlPiAgICAgJCQwICAjQCAgIEUoICBBN0ggICAgJCEkICAgWCAgIClBICAkLyUgICAKLU0gJzAyICAgKCAgICI6ICAiJSkwICAgICAkMCNfXDAgICBGXCAgMSBIICAgICUhKCAgIEAgICAqIyAgKDUKLU1eICAgICBAMSAgIC4gICAiQ1AgIiVAICAgICAkJDAgICNAICAgSTwgIDEhWCAgICAmISggICBAICAgKkQKLU0gICQwLyAgICAhMDIgICAoICAgIkwgICIlQDAgICAgKCQwICAjQCAgIEwsICBBOTAgICAgISIkICAgWCAKLU0gICsrICAoNiMgICAgIDAxICAgLiAgICJXICAiJUEgICAgICQkMCAgI0AgICBPKCAgMF84ICAgICUhKCAKLU0gIEAgICAsJiAgKDYlICAgICAwMSAgIC4gICAjJTAgIiVBQCAgICAkJDAgICNAICAgUlQgIDBeUCAgICAKLU0lISggICBAICAgLSIgICg2NyAgICAgIDEgL19RICAgIzFQICIlQVAgICAgJCQwICAjQCAgIFVYICBBOEAKLU0gICAgISEkICAgWCAgIC1MICAoNikgICAgICQxICAgLiAgICM/ICAiJUJAICAgICQkMCAgI0AgICBYUCAKLU0gQThMICAgICEhJCAgIFggICAuPCAgJDNKICAgICAgMSAvX1EgICAjSFAgIiVDICAgICAoJDAgICNAICAKLU0gWyQgIEE4WCAgICAhISQgICBYICAgLyYgICg0ICAgICAgIDEgL19RICAgI1cgICEkICAgICAgNCRAICAKLU0iICAgIF48ICAwXjwgICAgJSEoICAgQCAgIC9aICAoNi8gICAgIDAxICAgLiAgICQiICAiJUQgICAgICEKLU0kMCAgI0AgICEgXCAgQTkkICAgICEhJCAgIFggICAwOiAgKDYyICAgICBAMSAgIC4gICAkKVAgIiReMCAKLU0gICAwJEAgICAgICAhIlAgIEEvOCAgICA2ISggICAgICAgMFMgICgzXCAgICAgQDIgICAgICAgJC4wICIKLU0lRSAgICAgJCQwICAjQCAgISQoICBBOTQgICAgISEkICAgWCAgIDE7ICAoNjYgICAgIDAxICAgLiAnOT8KLU09NllJO1ZYIDdWOUk7RkQgPFVdTDo2WUsgJzU/OyZFTjpQIVY3Vy1JOVZZRTklXVM6Jl1SPSVdUDtWRU4KLU09JjVSICc5Pzo2WVQgJzk/PFZFRztGNUQ3Vi1IODcoID1FXUk7RzE/PCZdSTtHMUU8QCFWN1YxTz02KUwKLU05MCFWN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEID1FXVU7Ry1JOVZZRTklXUk7RzE/ODcpUjg3RCAKLU09RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyggOFZRVTtGTUU8QCFWN1ctSTlWWUU5JV1JO0cwID1FXVUKLU07Ry1JOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1DOiYlUjdWOVU7RiwgPUVdVTtGRU87QyggPFchTzxHMVMKLU04ViVSICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVCAnOT8KLU08VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3VkVOOjcwID1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdUzomXVIKLU09JV1GPTZZQyAnOT85RlFPODcwID1FXUM6JiVSN1YlUjxGJVkgJzk/PFcxUj02LVQsMCFWN1ctVDxHNUMKLU09IyggPUVdTDtWWUcgJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU4KLU09JjVSICc5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIKLU0gJzk/PFZBTzxHMCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICVdJDY0WSEzNEUjICZVQTo2WCAKLU03VlFJOEVdVjk3KVM6Nl1OICc5PzkmXVU4RlFFN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUEKLU0+MCFWN1ctSTlWWUU5JV1JO0cxPzlHNU44UCFWN1c1TjxWRUc7RjVEN1ZRTztGPCA9RV1VO0ctSTlWWUUKLU05JV1JO0cwID1FXUQ7VzVCOyY1Pzg3KVI4N0QgN1ctVDg3KVQgJV1FOSYlVDgwIVY3VzVOPFZFRztGNUQKLU03VkVOPSVdRj02WUMgJzk/OjZZVDdWJVI8RiVZICchUjo2VUE8R0QgPUVdRjsmXUE9JV1GPTZZQyAnOT8KLU07Jl1OOVVdRj02WUMgJzk/PFZFRztGNUQ3VkVOPSVdQTxHKUE+MCFFO0c5STxGXU4gJzk/OSZdVThGUUUKLU03VyFPOjZZVDk3KCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ctSDtXKVQKLU03VjlVO0YsID1FXUM6JiVSN1chTzo2WVQ5NyggPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KCAKLU09RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgN1Y1TjkgIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVIKLU08RiVZICc5PzxWRUc7RjVEN1ZRTztGPCA9RV1VO0ctSTlWWUU5JV1DOiYlUiAnOT88VkFPPEcxPzwmXUkKLU07RzFFPEAhVjdWOUw7ViVUN1chTzo2WVQ5NyggN1Y1VDk3QVQgJzk/OUZRTzg3MT84NylSODdEID1FXVMKLU06Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCA3VD0sM1QpITMlXS8xRDkzMTUxPzUkJSIzJDU/ICc5Pzo2WVQKLU03VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAnOT88VkFPPEcxPzg3KVI4N0QgPUVdQzomJVIKLU0gJllPO0chUjo2VUE8R0QgPUVdTDtWWUc3ViVSPEYlWSAmNVg6NzAgODcxRT4mRVQgJV1FPiZFVCAlXUUKLU07RzlJPEZdTiAnOT89NllTOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhVjdXLUk5VllFOSVdTDtWWUcKLU03VyFPOjZZVDk3KCA7JkVCOFJZUztSWFEgICAgIEE5MCAgIUUkUCAgICAgICBBLzggICFDJTAgICAgICAKLU0gQS9EICAhQiUwICAgICAgIEEvUCAgIUQlMCAgICAiPVhbXkBAPD9AIignSCAgIlwkIiAgWCAuQDAqKCMKLU1IJDI8KFogQEApICAgMCogICAyMCQgICEwICEhKkAkICAgIDEgICEkRCEoQzwkICAwMjghICAgID9fX18KLU1cICQgICAiMCQgIDBEQSAgJDk0TCggKjQgSiAkRSAxICJBPCAgKDY2JE4pMFUiKyAgJCAgICRYISAgICAKLU0wICEhJlAkICAgISAgJCQ8IDAgICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKLU1AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JycKLU1YIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKLU0gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjAKLU1MISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKLU1AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIDEgICEkUDAoQ0IjIiAKLU0gICYhUV4gKEA+QCAgKVdDT1kgMSAgISRQMUhDRCMiICAgJiFRXiAoQD5AICApV0NPWSAxICAiJVAiSEIKLU0wISQgICg2MiQiICFUQkhBMCEkICAoNjIkIiAiVEJIQikhJCAgKDYyJCIgI1RDKEFWISQgICg2MiQiICQKLU1UQyhBQiEkICAoNjIkIiAlVEMoQT9BJCAgKDYyJCIgJlRCKEEvISQgICg2MiQiICdUQihBOiEkICAoNjIKLU0kIiAoVEIoQVghJCAgKDYyJCIgKVRCKEFSISQgICg2MiQiICpUQihCKCEkICAoNjIkIiArVEIoQVchJCAKLU0gKDQzICAhJFUgKUNGLTBCKDhQMSAgIiUkUCAgMS0wOjhaIzQuQiUoJDAgIEExLCAgKDc0IkYpIFUiSEEKLU1EISQgICg0MyAgIiVVIElBMC0wSig9SDEgICIlJFAgIEE9MCo4QjM0KkIlXCQwICBBMSwgICg3NCRGJzgKLU1VIyhCLyEkICAoNDMgICIlVSEpQUItMFIoQ0AxICAiJSRQICBBPTAyODdbNCxCKDwkMCAgQTEsICAoNzQKLU0gRiRcVSIoQV4hJCAgKDQzICAiJVUgKUE6LTBCKEAwMSAgIiUkUCAgQT0wIjg+IzQoQiU4JDAgIEExLCAKLU0gKDc0IEYnKFUiKEIyISQgICg0MyAgIiVVIClCKC0wQig4IDEgICIlJFAgIEE9MCI4PVM0KEIlMCQwICAKLU1BMSwgICg3NCBGJixVIihCLCEkICAoNDMgICIlVSFJQTItMFooPkAxICAiJSUwICBBOSgySEQjMihCKDQKLU0kMCAgQTE0ICAoNjIkSiUgVEIoQiQhJCAgKDQ1ICAiJURBKkIpLShCKEFAMSAgIiUlMCAgQTkoMkg9QzIKLU0oQihIJDAgIEExNCAgKDYyJEomKFRCKEEuISQgICg0NSAgIiVEQSpBP00oQihFMDEgICIlJTAgIEE5KDIKLU1IM1MyKEIlJCQwICBBMTQgICg2MiRKJUhUQihBOCEkICAoNDUgICIlREEqQVgtKEIoPTAxICAiJSUwICAKLU1BOSgySDxDMihCJywkMCAgQTE0ICAoNjIkSihAVEIoQjYhJCAgKDQ1ICAiJURBKkFXLShCKD0gMSAgIiUKLU0lMCAgQTkoMkg4UzIoQihMJDAgIEExNCAgKDYyJEolKFRCKEIjISQgICg2MiQiICJUQihCICEkICAoNjIKLU0kIiAiVEIoQjEhJCAgKDYyJCIgIVRCKEE+ISQgICg2MiQiICFUQihBOSEkICAoNDMgICIlVSApQEgtMEIKLU0oKkAxICAiJSRQICBBPTAyOClDNCxCJVBAPD9AIignSCAgIj1YW15AQDw/QCIoJ0ggICAgICAgICAgICAKLU0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgMExAICAgICAgICEgOjAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICAjIFAKLU1PX19TIDAgICAgLCAgI1BQT19fUCAwICAgICwgICRAUE9fX00gMCAgICAkICAgICAgQTAsICAgICAgICAKLU0gICAgICAgISAgICQ8MCAgICBQICAwXCggICAgIzAgISRXICAgICAkICAkIFogICAgIDQgIDBJPCAgICAKLU0hQCAhIF1QICAgICogICAkPlAgICAgTCAgICAwICAgICUwICAgICAgICAgIyAgKDNKICAgICAoICAgIEQKLU0gICAgJSAgICAgPCAgICA3ICAkLlkgICAgIDwgIDBbOCAgICAiICAgICMgICAgICkgICAgIyAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAgICQgL19RICAgICAgICEKLU0gLTAgICAgICBQICAgMCAgICAgICAwI0ggICAgICAsICAgKCAgICAgICAkI1cgICAgICAjICAgIyAgICAKLU0gICAhIkVQICAgICAgUCAgISAgICAgICAgMFs4ICAgICAgLCAgIDQgICAgICAgJC5ZICAgICAgIyAgICYKLU0gICAgICAgISNQQCAgICAgIFAgICFQICAgICAgIDBcNCAgICAgICwgICBAICAgICAgICQzPCAgICAgICMKLU0gICApICAgICAgICEkWCAgICAgICBQICAiQCAgICAgICBBLkggICAgICAsICAgTCAgICAgICAoNCAgICAKLU0gICAjICAgLCAgICAgICAiJSBQICAgICAgUCAgIzAgICAgICAgQTI4ICAgICAgLCAgIFggICAgICAgICAKLU0gICAgICAgIyAgIC8gICAgICAgICAgICAgICAgIFAgICQgICAgICAgICAgICAgICAgICwgICEkICAgICAKLU0gICAgICAgICAgICMgICAyICAgICAgICAgICAgICAgICBQICAkUCAgICAgICAgICAgICAgICAsICAhMCAKLU0gICAgICAgICAgICAgICAjICAgNSAgICAgICAgICAgICAgICAgUCAgJUAgICAgPCAgICAgICAgICAgMCAKLU1fXyQgICAgLiAgICAgICAgICAgJCAvX1EgICAgJkAgICAgICAgICAgISAjX1wwICAgIiggICAgICAgICAKLU0gIDAgX18kICAgIEkgICg0RiAgICAgQDEgICAuICAgICwwICEkVyAgICAgICRAICAiMCAgICM8ICBBMkAKLU0gICAgISEkICAgWCAgICBeICAoNEogICAgKSAxICAgLiAgICAxMCAiJTNAICAgICQkMCAgI0AgICAlUCAKLU0gQTRcICAgICEhJCAgIFggICAhQiAgKDUwICAgICAkMSAgIC4gICAgPCAgIiU0MCAgICAkJDAgICNAICAKLU0gJ1ggIEE1KCAgICAiISQgICBYICAgIicgICg1NCAgICAgQDEgICAuICAgIEcwICIlNUAgICAgKCQwICAKLU0jQCAgICsoICBBNUAgICAgISEkICAgWCAgICMnICAoNTkgICAgIDAxICAgLiAgICBTUCAiJTZAICAgICQKLU0kMCAgI0AgICAtUCAgMSFEICAgICUhKCAgIEAgICAjUSAgJC9CICAgICEwMiAgICggICAgXzAgIiU3ICAKLU0gICAoJDAgICNAICAgMDggIEE1WCAgICAhISQgICBYICAgJDAgICg1PyAgICAgKDEgICAuICAgISlAICIKLU0lN1ggICAgIiQwICAjQCAgIDM8ICBBNiAgICAgIiEkICAgWCAgICUrICAkLyIgICAgICAyICAgJyAgICEKLU00MCAiJThAICAgICIkMCAgI0AgICA2ICAgMF8kICAgICUhKCAgIEAgICAlTSAgKDVDICAgICAwMSAgIC4KLU0gICAhPTAgIiU5ICAgICAiJDAgICNAICAgOCggIEE2OCAgICAmISQgICBYICAgJiwgICg1TCAgICAhQDEKLU0gICAuICAgIUVAICIlPEAgICAgJCQwICAjQCAgIDlUICBBNywgICAgISEkICAgWCAgICZMICAoNVQgICAKLU0gIDAxICAgLiAgICFRICAhJCUgICAgIDQkQCAgIiAgICA9PCAgQTc0ICAgICEhJCAgIFggICAnTiAgKDUKLU1WICAgICAoMSAgIC4gICAhXUAgISNeUCAgICA0JEAgICIgICAgQFAgIEEwLCAgICAgISQgX18kICAgKDUKLU0gICQwSiAgICBMQDIgICAoICAgIiZAICEkWCAgICAgJCQwICAiQCAgIEI8ICAxIjAgICAgJiEoICAgQCAKLU0gIChVICAoNVZAICAgICgxICAgLiAgICIyMCAhJCEwICAgIDQkQCAgIiAgICBFTCAgQTc8ICAgICEhJCAKLU0gIFggICApSyAgKDVYICAgICAwMSAgIC4gICAiPkAgIiU+QCAgICAwJDAgICNAICAgSEQgIDBcNCAgICAKLU09ISggICBAICAgKjAgICg0RSAgICAgIDEgL19RICAgIkVQICEkIkAgICAgNCRAICAiICAgIEpMICBBN1gKLU0gICAgIiEkICAgWCAgICpXICAoNiAgICAgIDAxICAgLiAgICJPUCAhJCdAICAgIDgkQCAgIiAgICBMUCAKLU0gMSBcICAgICUhKCAgIEAgICArOCAgKDYhICAgICBAMSAgIC4gICAiWlAgIiVFICAgICAkKDAgICNAICAKLU0gTywgIEE4LCAgICAhISQgICBYICAgLCQgICg2JCAgICAgMDEgICAuICAgIyZAICEjXUAgICAgNCRAICAKLU0iICAgIFJYICBBODQgICAgISEkICAgWCAgICxdICAoNiYgICAgIDAxICAgLiAgICM1MCAhI1sgICAgIDQKLU0kQCAgIiAgICBWSCAgQTk8ICAgICAhJCBfXyQgICAtTyAgKDYnICAgICAwMSAgIC4gICAjQUAgIiVCICAKLU0gICAkJDAgICNAICAgWTAgIEE4RCAgICAgMSQgICBYICAgLkQgICg2KiAgICAgMDEgICAuICAgI00gICIKLU0lQlAgICAgJCQwICAjQCAgIFwwICAxLkggICAgICEkIF9fJCAgIC8rICAoNiwgICAgIEAxICAgLiAgICMKLU1WMCAiJUNAICAgICQkMCAgI0AgICBeWCAgQTAgICAgICAhJCBfXyQgICAwJCAgJDAgICAgICEwMiAgICgKLU0gICAkI1AgISNZUCAgICA0JEAgICIgICAhIiggIEE4XCAgICAhISQgICBYICAgMFAgICg2MCAgICAgJDEKLU0gICAuICAgJC1QICIlRDAgICAgJCQwICAjQCAgISQoICBBOSggICAgIiEkICAgWCAgIDEvICAoM1kgICAKLU0gISAyICAgICAgICQ1ICAiJF1AICAgITgkQCAgICAgICElTCAgQS9QICAgICIhKCAgICAgICAxQSAgKDYKLU00ICAgICAwMSAgIC4gICAkOkAgIiVFMCAgICAkJDAgICNAICAhKCwgIEE5OCAgICAhISQgICBYIDlWMUIKLU07NjQgOFcpVDoyWVMgJzlBOyc1RTxSVTg4MllDICY9RDhGVUUrRiwgOFcpVDtCWVMgJzk/PTZZSTtWWCAKLU03VjlJO0ZEIDxVXUw6NllLICc1PzsmRU46UCFWN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAnOT8KLU06NllUICc5PzxWRUc7RjVEN1YtSDg3KCA9RV1JO0cxPzwmXUk7RzFFPEAhVjdWMU89NilMOTAhVjdXNU4KLU08VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA9RV1VO0ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgPUVdUzo2PU4KLU05NjE/OjZZVDdXIU86NllUOTcoIDhWUVU7Rk1FPEAhVjdXLUk5VllFOSVdSTtHMCA9RV1VO0ctSTlWWUUKLU05JV1MO1ZZRzdWOVU7RiwgPUVdQzomJVI3VjlVO0YsID1FXVU7RkVPO0MoIDxXIU88RzFTOFYlUiAnOT8KLU09NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/PFZFRztGNUQKLU03VlFPO0Y9Pzg3KVI4N0QgN1ZFTjo3MCA9RV1TOjY9Tjk2MT88VkFPPEcwID1FXVM6Jl1SPSVdRj02WUMKLU0gJzk/OUZRTzg3MCA9RV1DOiYlUjdWJVI8RiVZICc5PzxXMVI9Ni1ULDAhVjdXLVQ8RzVDPSMoID1FXUwKLU07VllHICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAnOT8KLU08VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICc5PzxWQU8KLU08RzAgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQyAlXSQ2NFkhMzRFIyAmVUE6NlggN1ZRSThFXVYKLU05NylTOjZdTiAnOT85Jl1VOEZRRTdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXLUkKLU05VllFOSVdSTtHMT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFOSVdSTtHMCAKLU09RV1EO1c1QjsmNT84NylSODdEIDdXLVQ4NylUICVdRTkmJVQ4MCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUYKLU09NllDICc5Pzo2WVQ3ViVSPEYlWSAnIVI6NlVBPEdEID1FXUY7Jl1BPSVdRj02WUMgJzk/OyZdTjlVXUYKLU09NllDICc5PzxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhRTtHOUk8Rl1OICc5PzkmXVU4RlFFN1chTzo2WVQKLU05NyggPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCAKLU09RV1DOiYlUjdXIU86NllUOTcoID1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggPUVdVTtHLUkKLU05VllFOSVdQzomJVI3VjlVO0YsIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAnOT8KLU08VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFOSVdQzomJVIgJzk/PFZBTzxHMT88Jl1JO0cxRTxAIVYKLU03VjlMO1YlVDdXIU86NllUOTcoIDdWNVQ5N0FUICc5PzlGUU84NzE/ODcpUjg3RCA9RV1TOjY9Tjk2MT8KLU08VkFPPEcxPzg3KVI4N0QgN1Q9LDNUKSEzJV0vMUQ5MzE1MT81JCUiMyQ1PyAnOT86NllUN1Y5VTtGLCAKLU09RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJzk/PFZBTzxHMT84NylSODdEID1FXUM6JiVSICZZTztHIVIKLU06NlVBPEdEID1FXUw7VllHN1YlUjxGJVkgJjVYOjcwIDg3MUU+JkVUICVdRT4mRVQgJV1FO0c5STxGXU4KLU0gJzk/PTZZUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUw7VllHN1chTzo2WVQKLU05NyggICc5QTsnNUU8UlU4ODJZQyAiXUQ6NzlFK1cpRTsmNUE8VjRPOEJVUz43LUk5RkVYK1c1UzxCXVMKLU08RixPOyZFQitWUUk4RixPICchTzxHME85VjVOK1c5QTsnNUU8UlU4ODJZQyAgICA2JzBALlIhNi8zKE4KLU0sICFNODZFTiAlXUw6Nik/PUY1UjxWRU87QCBPPSZVUCAiXVU8VyhPOFYtUytWUUk4Ql1WODZRVTk3LE0KLU02JiROO1AgIDlWMUI7NjROOFAgTz0mVVArUCFHOSYpTTkyWUMgJj1DOFMpPzhWXU08JkVMOTYwTiAmRU4KLU09I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUi5TIFsKLU0sMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIVUKLU07Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWj0jNF0KLU08QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTjlSIUwKLU07VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXTxDJFsKLU0sI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUS5QIVMKLU06Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWj0jJFEKLU0vNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUS5TQFsKLU0sI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUz0nKVUKLU04VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFoKLU0tQlBRLUJQUS1DTVY3VkVOPSVdTTk2VUI5NyhaLDJQUyxCUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwKLU0tQzBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaLDMoTC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKLU0uQyRTKyMkUi4iUFYtI0xbICcxPz02WUk7VlhaNSMkVy83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwKLU0uI01WN1ctSDtXKVQ3VlVFOzYpRTxDSFYrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVYKLU03VlFPO0Y9Pzs2NU04RjVSLkMsTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFEsQlBQKyMsUi5XOT8KLU05Jl1VOEZRRTdWVUU7NilFPENIUSxSUFArIzhULlNMID1FXUM6JiVSN1Y5VTtGLFoxQyggPUVdUzo2PU4KLU05NjE/OFZBQTxFXUY9NllDLkQ4USwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU44U0kmLDMkID1FXVMKLU06Jl1SPSVdRj02WUMuRDhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1VO0ctSTlWWUUKLU05JV1TOiZdUj0lXUY9NllDLkQ4WCAnOT86NllUN1Y5VTtGLFoxQyQgPUVdUzo2PU45NjE/OjZZVDdWOVUKLU07RixaMUMkID1FXVU7Ry1JOVZZRTklXUk7RzE/OUc1TjhTSSYtICFWN1ZRTztGPT85RzVOOFNJJixQIVYKLU03Vy1JOVZZRTklXUw7VllHN1Y5VTtGLFoxQywgPUVdVTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDNCAKLU09RV1GOyZdQT0lXUY9NllDLkQ4USxAIVY3VjFPPTYpTDk1XUY9NllDLkQ4USxQIUw6NllLLkUwUS4jVVMKLU0sMzRSO0Y1WD0jSFEuM1RKLDNATCwiUFMsQ01MOjZZSzlHNU44U0hSLCNUSixDJF05QyRZKyMsUisjLFIKLU0uVy1UPTY5Ri5DKFIvNiVSLDNMUC5TIFssQyxdODcoUS5TIFssM0xSLSNVQTxDJFssI0xSLlMkVisjOFQKLU0rIyRRLTMoWy5QIVQ9NV1MOjZZSy5FMFItM1VVLDMwVDtGNVg9I0hRLjJQUCsjLFIuVlFJO0ZNRj02WUMKLU0uQyhQKyMgTCxTKFs8VzFVOUY4WixDKEwsIlBRLDM0Ui5TTCA4Vl1MO1cpUy5FMFItQ1VFPjY1TDsmXVcKLU0uQyBMPCc1UjwmUUUuQyRMPCZFTjpTSFIrI0wgOFYlUjxTSTQsQzxdOTYpTT1TSFArJyFPPEctQzomNFoKLU0sMlBbICYpTztWUUU4NlhaPSMoWC82NSYwNFEzMTNIUCslMTI1NDRaLDJQWyAmKVY4NlFTLkUwUi4zVUUKLU05RiVMPFY0WiwiUVQ8RzVFLkMkTC5QIUI7Vl1MOTYlTixDSVQsQ0QgOzZFUztXKUQ5NylFOSNJNCxTIF0KLU05NzFXO1NIUismXU45M0hRKydJRTxGXFosIlFUOicpRTkzSFMrI0wgOzYlSTtDSSYsMCFWN1YtSDg3KFoKLU0xUyggPUVdUzo2PU45NjE/OFZBQTxDSScsMyAgPUVdVTtHLUk5VllFOSVdQzomJVIuRDxRLDAhVjdXLUgKLU07VylULkQ8ViAnOT88VkVHO0Y1RDdXLUg7VylULkQ8ViAnOT89NllTOjY9Tjk2MT88VkFPPEcwWjFTQCAKLU09RV1JO0cwWjFTJCA9RV1TOjY9Tjk2MT86NllULkQ8USAnOT89NllTOjY9Tjk2MT86NllULkQ8VCAnOT8KLU07Jl1OOVNJJyxQIVY3Vy1JOVZZRTklXUw7VllHLkQ8UyAnOT89NllTOjY9Tjk2MT87Jl1OOVNJJy0wIVYKLU03VjlMO1YlVC5EPFEsQCFWN1YxTz02KUw5M0knLDMsID1FXUM6JiVSN1YlUjxGJVkuRDxTLDNVQTxDJFsKLU0sI0xRLlMoID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScsUyhdODcoUS5TIFssM0xRLCAhVjdXNU4KLU08VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyxTLzYlUiwzTFAuUyRbLDMkID1FXVM6Jl1SPSVdQTxHKUEKLU0+M0knLFMwXTg3KFEuUyBbLDNMViAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLSAhVjdXNU4KLU08VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLTNVQTxDJFssI0xRLlNAID1FXUk7RzE/ODcpUjg3RFoKLU0xUyxWLzYlUiwzTFAuUyRbLDAhVjdXLUk5VllFOSVdSTtHMT84NylSODdEWjFTLFYgJzk/PTZZUzo2PU4KLU05NjE/OjZZVDdWJVI8RiVZLkQ8Uy1TVUE8QyRbLCNMUS5TMCA9RV1MO1ZZRzdWJVI8RiVZLkQ8Uy4jVUEKLU08QyRbLCNMUS5TLCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knLFNAID1FXVU7Ry1JOVZZRTklXUwKLU07VllHN1YlUjxGJVkuRDxTLjNVQTxDJFssI0xRLlM0ID1FXUY7Jl1BPSVdQTxHKUE+M0knLSMgXTg3KFEKLU0uUyBbLDNMUSxAIVY3VjFPPTYpTDk1XUE8RylBPjNJJy0jJF04NyhRLlMgWywzTFEsUCFWN1YtSDg3KT8KLU08Jl1JO0cxRTxDSSctIyhdKkMoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIuRDxULFNUSiwzICAKLU09RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTMFQvMkhRLDAhVjdXLUg7VylUN1chTzo2WVQKLU05NyhaMVMwVS8ySFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT88Jl1JO0cxRTxDSSctIzhdKkNAID1FXUk7RzE/PCZdSTtHMUU8Q0knLSM8XSpDJCAKLU09RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyhaMVMwVyAnOT89NllTOjY9Tjk2MT86NllUN1chTzo2WVQKLU05NyhaMVMwWC8ySFQgJzk/OyZdTjlVXVA7VkVOPSY1Ui5EPFQuM1RKLFAhVjdXLUk5VllFOSVdTDtWWUcKLU03VyFPOjZZVDk3KFoxUzBZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIuRDxVLCNUSi0wIVYKLU03VjlMO1YlVDdXIU86NllUOTcoWjFTNFEvMkhRLEAhVjdWMU89NilMOTVdUDtWRU49JjVSLkQ8VSxDVEoKLU0sMywgPUVdUz0nKVU4VzBRLkQ8US1AIVY3Vy1UPEc1Qz0jKFoxUzRTLzcsUi0nOT84VkFBPEVdTTk2VUIKLU05NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFoKLU0sMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTC1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFoKLU0sMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFMrIyRSLiJQVi0jTFsgJzk/PTZZSTtWWFoKLU0xUyRXICc5Pz02WUk7VlhSLkQ8VS0jVVUuJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVIKLU09JV1NOTZVQjk3KFotQlBQKyMkVi5XOT86NllUN1ZVRTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUUKLU07NilFPENIUysjIEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLCJQUyxDTVY3VjFPPTYpTDk1XU0KLU05NlVCOTcoWiwzLEwsIlBWLSNMWyAnLT87JkVOOlNJJywzRCA9NV1MOjZZSy5EPFItMCFQPEZFTTg3KVkKLU0uRDxVLTNVRTxGNUQuQyBMOVcpRTk2WFosMlFCOyc1RS5DKEwuUCFOO1ZZUDxGRU04NylZLkQ8Ui1AIUMKLU07JzVOOlY1Ui5EPFUtQ1VFOFZBRT1HRFosIlFGO1cpRC5DJEwuUCFTPCZdUj0nLUM4NyhaMVMoVyAgIE4KLU06NllUOTcpUCAiWUg4Ny1IICJZRD42WVM+NlQgK0YxWTtHLVQ8QCBOPEY1TDgyWUI8VywgK0cpRTsmJE4KLU08JlFUICJZSTtGRVQgIllUOTdBVCAiWUY6NllJICJZUjtWMUE9JiQgK0chTD0gIE45Vl1UICJZRD42WUEKLU07NkVDICJZQjxXLCArRy1ZOzcxQThAIE48VzFSPSYlQiAiWVM9JiVCK0ZFTjkmNVg8VzFSICJZUz0mJUIKLU08VzFSICJZUzonLVQ8RzFBOEAgTjhWXU07NjVOPSAgTjxXMUE4QllJO0YxRT4gIE48VzFBOEAgIDg3LFoKLU0oJCxAMSY1Vjk2UU88JlVFO0cwQDRWNVQoIiBIMFQxMyoyITM0JCUyMFZdTTwmRUw5NylTKCMoTiwiIFEKLU0uIiEtODdEQCwzRFksQEggICYlUy5CISMoJDFFPUY1TDtXIU05NllUKCUtRT0iIEAqJC0kNFJEQDRVISEKLU00RC1POzchSTsmNVI8UiBSK0MgQCwzQEAzNiVZKCMkWS4zKCogICEgKiIsSTRXNU4zVSxALTJYUCgmOUMKLU08UlhAKCRJVTtGNEAsM0RZLEAgIDg3LFooJCxAMSY1Vjk2UU88JlVFO0cwQDRWNVQoIiBIMFQxMyoyITMKLU00JCUyMFZdTTwmRUw5NylTKCMoTiwiIFEuIiEtODdEQCwzRFksQEggMVQtIy5CIEgxVFk1KjIhQz42PU4KLU09NyxNLEJYUCtDKCAgJiVTLkIhIygkMUU9RjVMO1chTTk2WVQoJS1FPSIgQCokLSQ0UkRANFUhITRELU8KLU07NyFJOyY1UjxSIFIrQyBALDNAQDM2JVkoIyRZLjMoKiAmUUQuQiBINFQ9NSoyITM9NlkvNFJdMzVFKFQKLU0oIkEsMlJUUStDIEkgICAgICAgICAgJCAgICAnICAgIEIwICAgIFVEICAgICAgICAgICAgICM9RCAgICMKLU0gICAgICAgICAmTFggICAgICAgICAgICAgJyBYICAgICAgICAgICAgICRYXCAgICAqQT02IUAgICAlREoKLU0gICAgICAgICAgICAgJVhAICAgICAgICAgICAgICAkICAgIlwgICArIyAgICAgRUQgICAgICAkL0IgICAKLU0gIF1EICAgICAgJC9CICAgICE8XCAgICAgICAgICAgICAiOiAgICAgICAgICAgICAgJEIgICAgICAgICAKLU0gICAgICVKICAgICAgICAgICAgICAoJiAgICAgICAgICAgICAgKUogICAgICAgICAgICAgICtCICAgICAKLU0gICAgICAgICAtOiAgICAgICAgICAgICAgLyIgICAgICAgICAgICAgIDEqICAgICAgICAgICAgICAzNiAKLU0gICAgICAgICAgICAgNSogICAgICAgICAgICAgIDZaICAgICAgICAgICAgICA4IiAgICAgICAgICAgICAKLU0gOS4gICAgICAgICAgICAgIDpOICAgICAgICAgICAgICA7PiAgICAgICAgICAgICAgRSYgICAgICAgICAKLU0gICAgIE4sRCAgICAgICQvQiAgICAgISQgICFZICAgICAgICAgICEkICAhWSAgICAhICAgICAhJCAgIVkKLU0gICAgIyAgICBPKEQgICAgICAkL0cgICAgICEkICAhWiAgICAgICAgICAhJCAgIVogICAgISAgICAgISQKLU0gICFaICAgICMgICAgUEREICAgICAgJC9MICAgICAhJCAgIVsgICAgICAgICAgISQgICFbICAgICEgICAKLU0gICEkICAhWyAgICAjICAgIFIoRCAgICAgICQvUSAgICAgISQgICFdICAgICAgICAgICEkICAhXSAgICAKLU0hICAgICAhJCAgIV0gICAgIyAgICBTKEQgICAgICAkL1YgICAgICEkICAhXiAgICAgICAgICAhJCAgIV4KLU0gICAgISAgICAgISQgICFeICAgICMgICAgVEREICAgICAgJC9bICAgICAhJCAgIV8gICAgICAgICAgISQKLU0gICFfICAgICEgICAgICEkICAhXyAgICAjICAgIFYoRCAgICAgICQwICAgICAgISQgICIhICAgICAgICAKLU0gICEkICAiISAgICAhICAgICAhJCAgIiEgICAgIyAgICBXIEQgICAgICAkMCUgICAgICEkICAiIiAgICAKLU0gICAgICAhJCAgIiIgICAgISAgICAgISQgICIiICAgICMgICAgWDREICAgICAgJDAqICAgICAhJCAgIiMKLU0gICAgICAgICAgISQgICIjICAgICEgICAgICEkICAiIyAgICAjICAgIFlQRCAgICAgICQwLyAgICAgISQKLU0gICIlICAgICAgICAgICEkICAiJSAgICAhICAgICAhJCAgIiUgICAgIyAgICBaTEQgICAgICAkMDQgICAKLU0gICEkICAiJiAgICAgICAgICAhJCAgIiYgICAgISAgICAgISQgICImICAgICMgICAgXCREICAgICAgJDAKLU05ICAgICAhJCAgIicgICAgICAgICAgISQgICInICAgICEgICAgICEkICAiJyAgICAjICAgIF1ERCAgICAKLU0gICQwPiAgICAgISQgICIpICAgICAgICAgICEkICAiKSAgICAhICAgICAhJCAgIikgICAgJCAgICBeSEQKLU0gICAgICAkMEQgICAgICEkICAiKiAgICAgICAgICAhJCAgIiogICAgISAgICAgISQgICIqICAgICQgICAKLU0gX1IgICAgICAgICAgICAgISZCICAgICAgICAgICAgICEqQiAgICAgICAgICAgICAhLF4gICAgICAgICAKLU0gICAgIS5OICAgICAgICAgICAgICEwRiAgICAgICAgICAgICAhMjYgICAgICAgICAgICAgITMqICAgICAKLU0gICAgICAgICE1XEQgICAgICAkMEogICAgICEkICAiUiAgICAgICAgICAhJCAgIlUgICAgISAgICAgISQKLU0gICJWICAgICMgICAgICEkICAiVyAgICAmICAgICAhJCAgIlkgICAgKSAgICAgISQgICJaICAgICwgICAKLU0gICEkICAiWyAgICAvICAgICAhJCAgIl0gICAgMiAgICAgISQgICJeICAgIDUgICAgICEkICAiXyAgICAKLU04ICAgICAhJCAgIyEgICAgOyAgICAgISQgICMiICAgID4gICAgICEkICAjIyAgICBBICAgICAhJCAgIyUKLU0gICAgRCAgICAgISQgICMmICAgIEggICAgICEkICAjKSAgICBMICAgICAhJCAgIyogICAgUCAgICAgISQKLU0gICMrICAgIFQgICAgICEkICAjLSAgICBYICAgICAhJCAgIy4gICAgXCAgICAgISQgICMvICAgISAgICAKLU0gICEkICAjMSAgICEkICAgICAhJCAgIzIgICAhKCAgICAgISQgICMzICAgISwgICAgICEkICAjNSAgICEKLU0wICAgICAhJCAgIzYgICAhNCAgICAgISQgICM3ICAgITggICAgICEkICAjOSAgICE8ICAgICAhJCAgIzoKLU0gICAhQCAgICAgISQgICM8ICAgIUQgICAgICEkICAjPSAgICFIICAgICAhJCAgIz4gICAhTCAgICAgISQKLU0gICNAICAgIVAgICAgICEkICAjQSAgICFUICAgICAhJCAgI0IgICAhWCAgICAgISQgICNEICAgIVwgICAKLU0gICEkICAjRSAgICIgICAgICAhJCAgI0YgICAiJCAgICAgISQgICNIICAgIiggICAgICEkICAjSSAgICIKLU0sICAgICAhJCAgI0ogICAiMCAgICAgISQgICNMICAgIjQgICAgICEkICAjTSAgICI4ICAgICAhJCAgI08KLU0gICAiPCAgICAgISQgICNQICAgIj8gICAgICEkICAjUSAgICJCICAgICAhJCAgI1IgICAiRSAgICAgISQKLU0gICNUICAgIkggICAgICEkICAjViAgICJMICAgICAhJCAgI1cgICAiUCAgICAgISQgICNXICAgIlAgICAKLU0hNjxAICAgICAgICAgICAgITckQCAgICAgICAgICAgICE4LEAgICAgICAgICAgICAhOTxAICAgICAgICAKLU0gICAgITooQCAgICAgICAgICAgICE7MEAgICAgICAgICAgICAhPEBAICAgICAgICAgICAgIT0kQCAgICAKLU0gICAgICAgICE+JEAgICAgICAgICAgICAhPyxAICAgICAgICAgICAgIT9UQCAgICAgICAgICAgICFAWEAKLU0gICAgICAgICAgICAhQiRAICAgICAgICAgICAgIUJUQCAgICAgICAgICAgICFDSEAgICAgICAgICAgICAKLU0hRTRAICAgICAgICAgICAgIUdAQCAgICAgICAgICAgICFJVEAgICAgICAgICAgICAhS0RAICAgICAgICAKLU0gICAgIU0oQCAgICAgICAgICAgICFPPEAgICAgICAgICAgICAhUSRAICAgICAgICAgICAgIVJAQCAgICAKLU0gICAgICAgICFUTEAgICAgICAgICAgICAhVjhAICAgICAgICAgICAgIVdYQCAgICAgICAgICAgICFaKEAKLU0gICAgICAgICAgICAhW1xAICAgICAgICAgICAgIV1UQCAgICAgICAgICAgICFfLEAgICAgICAgICAgICAKLU0iISRAICAgICAgICAgICAgIiMkQCAgICAgICAgICAgICIkQEAgICAgICAgICAgICAiJixAICAgICAgICAKLU0gICAgIigsQCAgICAgICAgICAgICIpQEAgICAgICAgICAgICAiKyRAICAgICAgICAgICAgIixcQCAgICAKLU0gICAgICAgICIuNEAgICAgICAgICAgICAiL1xAICAgICAgICAgICAgIjFYQCAgICAgICAgICAgICIzOEAKLU0gICAgICAgICAgICAiNFxAICAgICAgICAgICAgIjVUQCAgICAgICAgICAgICI/QEAgICAgICAgICAgICAKLU0iQDBAICAgICAgICAgICAgIkk8QCAgICAgICAgICAgICJKKEAgICAgICAgICAgICAiSlRAICAgICAgICAKLU0gICAgIk0kQCAgICAgICAgICAgICJOIEAgICAgICAgICAgICAiT1hAICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgIDAgICAgKCAKLU0gMCM0ICAgIFUgICAgISQgICAgICAgICAgICAgICAkICAgICAgICAgIjAgICAgNCAgICAiICAkIFogICAKLU0gLkAgICArVCAgICAgUCAgICAgICAgICQgICAgISAgICAgXCAgICArICAgICBAICEgXVAgICAvPCAgICYKLU1AICAgICAwICAgIDcgICAgISAgICAhICAgICA3ICAgICBQICAgICggIDBJPCAgICo3ICAgISdMICAgICAKLU0gICAgICAgICAgJCAgICAgICAgICdQICAgIDAgICAgIiAgJC5WICAgI01AICAgICwgICAgIFAgICAgWCAKLU0gICAkICAgICMgICAgIkQgICAgJCAgICAgQCAhI04wICAgW0QgICAgKSAgICAgLCAgICArICAgICEgICAKLU0gIFAgICAgUyAgICAgMCAgICA4ICAwXCggICAvIiAgICAgUCAgICAgICAgICAgICAgIDAgICAgICAgICAKLU0uMCAgICAkICAgICYgICQvJSAgICNRMCAgIDE8ICAgICAgICAgICAgICAgJCAgICAgICAgICNcICAgICEKLU0gICAgIUAgISRXICAgIS1QICAgICMgICAgICAgICAgICAgICAhICAgICAgICAgISUgICAgIDAgICAgKCAKLU0gMS4gICAgM0AgICAgIkAgICAgICAgICAgICAgICBAICAgICAgICAgMzAgICAgJCAgICAnICAoM0ogICAKLU0kWkAgICAhOCAgICAgICAgICAgICAgICQgICAgISAgICAlKCAgICAhICAgICBQICIlICAgICEwICAgICAKLU0jICAgICAgICAgICAgICAgISAgICAgMCAgICE3ICAgICFAICAgICwgIEEwLCAgIDQjICAgIChAICAgICQKLU0gICAgICAgICAgMCAgICAoICAgIDggICAgIEAgICAgIyAgKDRGICAgJSlAICAgJyQgICAgICAgICAgICAKLU0gICAoICAgICAgICAgJjQgICAgIiAgICAgICAgICAgICAhMjggICAmVCAgICAhICAgICA8ICAgICEgICAKLU0gISAgICAhTSAgICAgUCAgICAgICAgICAgICA7OiAgICEpRCAgICAgICAgICAgICAgICQgICAgICAgICAKLU09MCAgICAsICAgICAgICAgICAgICggJCAgICIpICAgICAgICAgICAgICAgISAgICAgICAgICgwICAgICMKLU0gICAgICAgICAgICAgIiIqICAgKyMgICAgICAgICAgICAgICAgMCAgICAgICAgIi0gICAgIFAgICAgICAKLU0gICAgICAgS0VAICAgKyggICAgICAgICAgICAgICAkICAgICAgICAgRVAgICAgJCAgICAgICAgICAgICAKLU0rJEAgICAlKSAgICAgICAgICAgICAgICEgICAgICAgICAqICAgICAhICAgICAgICAgICAgICJWNCAgICAKLU04ICAgICAgICAgICAgICAgISAgICAgUCAgICJMICAgICAwICAgICAgICAgICAgIE1dICAgIi1QICAgICAKLSwgICAgICAgICAgMCAgICAsCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYW5ub3RhMi5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9hbm5vdGEyLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBnZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Fubm90YTIuY2MKcmVuYW1lIHRvIGdkYi90ZXN0c3VpdGUvZ2RiLmMrKy9hbm5vdGEyLmNjCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Fubm90YTIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2Fubm90YTIuZXhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBnZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Fubm90YTIuZXhwCnJlbmFtZSB0byBnZGIvdGVzdHN1aXRlL2dkYi5jKysvYW5ub3RhMi5leHAKZGlmZiAtLWdpdCBhL2dkYi90dWkvTWFrZWZpbGUgYi9nZGIvdHVpL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDg5YzZlLi4wMDAwMDAwCi0tLSBhL2dkYi90dWkvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KLSMgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotYWxsOiBsaWJ0dWkuYQotCi1zcmNkaXI9LgotCi1TSEVMTCA9IC9iaW4vc2gKLQotQ0M9Z2NjCi1DRkxBR1M9LWcgLU8yCi1BUj1hcgotUkFOTElCPXJhbmxpYgotCi0jIEhvc3QgYW5kIHRhcmdldC1kZXBlbmRlbnQgbWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLQotIyBIb3N0OiBTdW4gNCBvciBTcGFyY3N0YXRpb24sIHJ1bm5pbmcgU3VuT1MgNAotWERFUEZJTEVTPSBzZXItdGNwLm8KLVhNX0ZJTEU9IHhtLXN1bjRvczQuaAotTkFUX0ZJTEU9IG5tLXN1bjRvczQuaAotTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIHNwYXJjLW5hdC5vCi1IT1NUX0lQQz0tREJTRF9JUEMKLUdEQlNFUlZFUl9ERVBGSUxFUz0gbG93LXNwYXJjLm8KLSMgU2V0dGluZyBYTV9DTElCUz0tbHJlc29sdiB3b3VsZCBsZXQgdXMgdXNlIHRoZSBETlMsIGJ1dCB0aGF0IHdvdWxkIHNjcmV3Ci0jIGFueW9uZSB3aG8gd2FudHMgdG8gdXNlIE5JUywgd2hpY2ggaW5jbHVkZXMgYXQgbGVhc3Qgb25lIEN5Z251cyBjdXN0b21lcgotIyAoUFIgMzU5MykuICBTbyBsZWF2ZSBpdCB0aGlzIHdheSB1bnRpbC91bmxlc3Mgd2UgZmluZCBhIHJlc29sdmVyIHdoaWNoIGNhbgotIyBnZXQgbmFtZXMgZnJvbSBlaXRoZXIgRE5TIG9yIE5JUyBmcm9tIHRoZSBzYW1lIEdEQiBiaW5hcnkuCi0KLSMgVGFyZ2V0OiBTdW4gNCBvciBTcGFyY3N0YXRpb24sIHJ1bm5pbmcgU3VuT1MgNAotVERFUEZJTEVTPSBzcGFyYy10ZGVwLm8gc29saWIubwotVE1fRklMRT0gdG0tc3VuNG9zNC5oCi0jIEVuZCBvZiBob3N0IGFuZCB0YXJnZXQtZGVwZW5kZW50IG1ha2VmaWxlIGZyYWdtZW50cwotCi0jIFdoZXJlIGlzIG91ciAiaW5jbHVkZSIgZGlyZWN0b3J5PyAgVHlwaWNhbGx5ICQoc3JjZGlyKS8uLi9pbmNsdWRlLgotIyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBoZWFkZXIgZmlsZSBkaXJlY3RvcnkgZm9yIHRoZSBsaWJyYXJ5Ci0jIHJvdXRpbmVzIGluIGxpYmliZXJ0eS4KLUlOQ0xVREVfRElSID0gICQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlCi1JTkNMVURFX0NGTEFHUyA9IC1JJChJTkNMVURFX0RJUikKLQotIyBDb25maWd1cmVkIGJ5IHRoZSAtLXdpdGgtbW1hbGxvYyBvcHRpb24gdG8gY29uZmlndXJlLgotTU1BTExPQyA9IAotTU1BTExPQ19DRkxBR1MgPSAKLQotIyBXaGVyZSBpcyB0aGUgQkZEIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vYmZkLgotQkZEX0RJUiA9IC4uLy4uL2JmZAotQkZEX1NSQyA9ICQoc3JjZGlyKS8kKEJGRF9ESVIpCi1CRkRfQ0ZMQUdTID0gLUkkKEJGRF9ESVIpIC1JJChCRkRfU1JDKQotCi0jIFdoZXJlIGlzIHRoZSBSRUFETElORSBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL3JlYWRsaW5lLgotUkVBRExJTkVfRElSID0gLi4vLi4vcmVhZGxpbmUKLVJFQURMSU5FX1NSQyA9ICQoc3JjZGlyKS8kKFJFQURMSU5FX0RJUikKLVJFQURMSU5FX0NGTEFHUyA9IC1JJChSRUFETElORV9TUkMpCi0KLSMgV2hlcmUgaXMgdGhlIElOVEwgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi9pbnRsLgotSU5UTF9ESVIgPSAuLi8uLi9pbnRsCi1JTlRMX1NSQyA9ICQoc3JjZGlyKS8kKElOVExfRElSKQotSU5UTF9DRkxBR1MgPSAtSSQoSU5UTF9ESVIpIC1JJChJTlRMX1NSQykKLQotIyBXaGVyZSBpcyB0aGUgVENMIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vdGNsLgotVENMX0NGTEFHUyA9IEBUQ0xIRElSQAotCi0jIFdoZXJlIGlzIHRoZSBUSyBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL3RrLgotVEtfQ0ZMQUdTID0gQFRLSERJUkAgQFRLX0JVSUxEX0lOQ0xVREVTQAotCi0jIFdoZXJlIGlzIEl0Y2w/ICBUeXBpY2FsbHkgaW4gLi4vaXRjbC4KLUlUQ0xfQ0ZMQUdTID0gQElUQ0xIRElSQAotCi0jIFdoZXJlIGlzIFRpeD8gIFR5cGljYWxseSBpbiAuLi90aXguCi1USVhfQ0ZMQUdTID0gQFRJWEhESVJACi0KLVgxMV9DRkxBR1MgPSBAVEtfWElOQ0xVREVTQAotCi1FTkFCTEVfSURFPSBARU5BQkxFX0lERUAKLQotR1VJX0NGTEFHU19YID0gLUkkKHNyY2RpcikvLi4vLi4vbGliZ3VpL3NyYwotCi1JREVfQ0ZMQUdTX1ggPSAtSSQoc3JjZGlyKS8uLi8uLi9saWJpZGV0Y2wvc3JjIC1JJChzcmNkaXIpLy4uLy4uL2xpYmlkZS9zcmMgXAotICBgaWYgWyB4IiQoRU5BQkxFX0lERSkiICE9IHggXSA7IHRoZW4gXAotICAgIGVjaG8gLURJREUgLUkkKHNyY2RpcikvLi4vLi4vaWx1L3J1bnRpbWUvbWFpbmxvb3A7XAotICBmaWAKLQotSURFX0NGTEFHUz0kKEdVSV9DRkxBR1NfWCkgJChJREVfQ0ZMQUdTX1gpCi0KLUVOQUJMRV9DRkxBR1M9IAotCi0jIC1JLiBmb3IgY29uZmlnIGZpbGVzLgotIyAtSSQoc3JjZGlyKSBmb3IgZ2RiIGludGVybmFsIGhlYWRlcnMgYW5kIHBvc3NpYmx5IGZvciBnbnUtcmVnZXguaCBhbHNvLgotIyAtSSQoc3JjZGlyKS9jb25maWcgZm9yIG1vcmUgZ2VuZXJpYyBjb25maWcgZmlsZXMuCi0KLSMgSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gYWRkIC1JL3Vzci9pbmNsdWRlL3N5cyBpZgotIyB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgZmNudGwuaCBpbiAvdXNyL2luY2x1ZGUgKHdoaWNoIGlzIHdoZXJlIGl0Ci0jIHNob3VsZCBiZSBhY2NvcmRpbmcgdG8gUG9zaXgpLgotREVGUyA9IC1ESEFWRV9DT05GSUdfSAotR0RCX0NGTEFHUyA9IC1JLiAtSS4uIC1JJChzcmNkaXIpIC1JJChzcmNkaXIpLy4uIC1JJChzcmNkaXIpLy4uL2NvbmZpZyAkKERFRlMpCi0KLSMgTXtILFR9X0NGTEFHUywgaWYgZGVmaW5lZCwgaGF2ZSBob3N0LSBhbmQgdGFyZ2V0LWRlcGVuZGVudCBDRkxBR1MKLSMgZnJvbSB0aGUgY29uZmlnIGRpcmVjdG9yeS4KLUdMT0JBTF9DRkxBR1MgPSAkKE1UX0NGTEFHUykgJChNSF9DRkxBR1MpCi0jUFJPRklMRV9DRkxBR1MgPSAtcGcKLQotIyBJTlRFUk5BTF9DRkxBR1MgaXMgdGhlIGFnZ3JlZ2F0ZSBvZiBhbGwgb3RoZXIgKkNGTEFHUyBtYWNyb3MuCi1JTlRFUk5BTF9DRkxBR1MgPSAkKENGTEFHUykgJChHTE9CQUxfQ0ZMQUdTKSAkKFBST0ZJTEVfQ0ZMQUdTKSBcCi0JJChHREJfQ0ZMQUdTKSAkKFJFQURMSU5FX0NGTEFHUykgJChCRkRfQ0ZMQUdTKSBcCi0JJChNTUFMTE9DX0NGTEFHUykgJChJTkNMVURFX0NGTEFHUykgJChJTlRMX0NGTEFHUykgXAotCSQoRU5BQkxFX0NGTEFHUykKLQotSEVBREVSUyA9IHR1aUlPLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaCB0dWlMYXlvdXQuaCB0dWlTdGFjay5oIFwKLQkgIHR1aVNvdXJjZS5oIHR1aUNvbW1hbmQuaCB0dWlXaW4uaCB0dWlEaXNhc3NlbS5oIFwKLQkgIHR1aVNvdXJjZVdpbi5oIHR1aVJlZ3MuaCB0dWlEYXRhV2luLmgKLQotU09VUkNFUyA9IHR1aS5jIHR1aURhdGEuYyB0dWlTb3VyY2UuYyB0dWlTdGFjay5jIHR1aUlPLmMgXAotCSAgdHVpR2VuZXJhbFdpbi5jIHR1aUxheW91dC5jIHR1aVdpbi5jIHR1aUNvbW1hbmQuYyBcCi0JICB0dWlEaXNhc3NlbS5jIHR1aVNvdXJjZVdpbi5jIHR1aVJlZ3MuYyB0dWlEYXRhV2luLmMKLQotT0JKRUNUUyA9IHR1aS5vIHR1aURhdGEubyB0dWlTb3VyY2UubyB0dWlTdGFjay5vIHR1aUlPLm8gXAotCSAgdHVpR2VuZXJhbFdpbi5vIHR1aUxheW91dC5vIHR1aVdpbi5vIHR1aUNvbW1hbmQubyBcCi0JICB0dWlEaXNhc3NlbS5vIHR1aVNvdXJjZVdpbi5vIHR1aVJlZ3MubyB0dWlEYXRhV2luLm8gXAotCSAgdHVpSW5pdC5vCi0KLQotIyBQcmV2ZW50IFN1biBtYWtlIGZyb20gcHV0dGluZyBpbiB0aGUgbWFjaGluZSB0eXBlLiAgU2V0dGluZwotIyBUQVJHRVRfQVJDSCB0byBub3RoaW5nIHdvcmtzIGZvciBTdW5PUyAzLCA0LjAsIGJ1dCBub3QgZm9yIDQuMS4KLS5jLm86Ci0JJChDQykgLWMgJChJTlRFUk5BTF9DRkxBR1MpICQ8Ci0uU1VGRklYRVM6IC5jcHAKLS5jLmNwcDoKLQkkKENDKSAtRSAkKElOVEVSTkFMX0NGTEFHUykgJDwgPiAkQAotCi1saWJ0dWkuYTogJChPQkpFQ1RTKQotCXJtIC1mIGxpYnR1aS5hCi0JJChBUikgcmMgbGlidHVpLmEgJChPQkpFQ1RTKQotCSQoUkFOTElCKSBsaWJ0dWkuYQotCi10dWkubzogdHVpLmMgdHVpLmggdHVpRGF0YS5oIHR1aUxheW91dC5oIHR1aUlPLmggdHVpUmVncy5oIHR1aVdpbi5oCi10dWlDb21tYW5kLm86IHR1aS5oIHR1aURhdGEuaCB0dWlXaW4uaCB0dWlJTy5oCi10dWlEYXRhLm86IHR1aS5oIHR1aURhdGEuaAotdHVpRGF0YVdpbi5vOiB0dWkuaCB0dWlEYXRhLmggdHVpUmVncy5oCi10dWlEaXNhc3NlbS5vOiB0dWkuaCB0dWlEYXRhLmggdHVpTGF5b3V0LmggdHVpU291cmNlV2luLmggdHVpU3RhY2suaAotdHVpR2VuZXJhbFdpbi5vOiB0dWkuaCB0dWlEYXRhLmggdHVpR2VuZXJhbFdpbi5oCi10dWlJTy5vOiB0dWkuaCB0dWlEYXRhLmggdHVpSU8uaCB0dWlDb21tYW5kLmggdHVpV2luLmgKLXR1aUxheW91dC5vOiB0dWkuaCB0dWlEYXRhLmggdHVpR2VuZXJhbFdpbi5oIHR1aVN0YWNrLmggdHVpUmVncy5oIFwKLQl0dWlEaXNhc3NlbS5oCi10dWlSZWdzLm86IHR1aS5oIHR1aURhdGEuaCB0dWlMYXlvdXQuaCB0dWlXaW4uaAotdHVpU291cmNlLm86IHR1aS5oIHR1aURhdGEuaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oIHR1aVNvdXJjZS5oCi10dWlTb3VyY2VXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aVN0YWNrLmggdHVpU291cmNlV2luLmggdHVpU291cmNlLmggXAotCXR1aURpc2Fzc2VtLmgKLXR1aVN0YWNrLm86IHR1aS5oIHR1aURhdGEuaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oCi10dWlXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oIFwKLQl0dWlEYXRhV2luLmgKLQotdHVpSW5pdC5vOiB0dWlJbml0LmMKLXR1aUluaXQuYzogJChTT1VSQ0VTKQotCUBlY2hvIE1ha2luZyB0dWlJbml0LmMKLQlAcm0gLWYgaW5pdC5jLXRtcAotCUBlY2hvICcvKiBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZS4gICovJyA+aW5pdC5jLXRtcAotCUBlY2hvICcvKiBJdCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIE1ha2VmaWxlLgkqLyc+PmluaXQuYy10bXAKLQlAZWNobyAnI2luY2x1ZGUgImFuc2lkZWNsLmgiJyA+PmluaXQuYy10bXAKLQlAZWNobyAnZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV90dWlfZmlsZXMgUEFSQU1TICgodm9pZCkpOycgPj5pbml0LmMtdG1wCi0JQGVjaG8gJ3ZvaWQgaW5pdGlhbGl6ZV90dWlfZmlsZXMgUEFSQU1TICgodm9pZCkpIHsnID4+aW5pdC5jLXRtcAotCUAtKCBjZCAkKHNyY2RpcikgOyBncmVwICdeX2luaXRpYWxpemVfW2Etel8wLTlBLVpdKiAqKCcgJChTT1VSQ0VTKSApIDI+L2Rldi9udWxsIFwKLQl8IHNlZCAtZSAncy9eLio6Ly8nIC1lICdzL15cKFthLXpfMC05QS1aXSpcKS4qLyAge2V4dGVybiB2b2lkIFwxIFBBUkFNUyAoKHZvaWQpKTsgXDEgKCk7fS8nID4+aW5pdC5jLXRtcAotCUBlY2hvICd9JyA+PmluaXQuYy10bXAKLQlAbXYgaW5pdC5jLXRtcCB0dWlJbml0LmMKLQotY2xlYW46Ci0Jcm0gLWYgKi5vICouYQpkaWZmIC0tZ2l0IGEvZ2RiL3dpbmRvd3MtbmF0LmMgYi9nZGIvd2luZG93cy1uYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExOTc5Ny4uMDAwMDAwMAotLS0gYS9nZGIvd2luZG93cy1uYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDExNTAgKzAsMCBAQAotLyogVGFyZ2V0LXZlY3RvciBvcGVyYXRpb25zIGZvciBjb250cm9sbGluZyB3aW4zMiBjaGlsZCBwcm9jZXNzZXMsIGZvciBHREIuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZSBudGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSovCi0KLS8qIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBzYWNAY3lnbnVzLmNvbSAqLwotCi0vKiBXZSBhc3N1bWUgd2UncmUgYmVpbmcgYnVpbHQgd2l0aCBhbmQgd2lsbCBiZSB1c2VkIGZvciBjeWd3aW4uICAqLwotCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgImZyYW1lLmgiCQkvKiByZXF1aXJlZCBieSBpbmZlcmlvci5oICovCi0jaW5jbHVkZSAiaW5mZXJpb3IuaCIKLSNpbmNsdWRlICJ0YXJnZXQuaCIKLSNpbmNsdWRlICJ3YWl0LmgiCi0jaW5jbHVkZSAiZ2RiY29yZS5oIgotI2luY2x1ZGUgImNvbW1hbmQuaCIKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlICJ3aW5kZWZzLmgiCi0jZWxzZSAvKiBvdGhlciBXSU4zMiBjb21waWxlciAqLwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiYnVpbGRzeW0uaCIKLSNpbmNsdWRlICJzeW1maWxlLmgiCi0jaW5jbHVkZSAib2JqZmlsZXMuaCIKLSNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCi0jaW5jbHVkZSAiZ2RidGhyZWFkLmgiCi0jaW5jbHVkZSAiZ2RiY21kLmgiCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8qIFRoZSB1aSdzIGV2ZW50IGxvb3AuICovCi1leHRlcm4gaW50ICgqdWlfbG9vcF9ob29rKSBQQVJBTVMgKChpbnQgc2lnbm8pKTsKLQotLyogSWYgd2UncmUgbm90IHVzaW5nIHRoZSBvbGQgQ3lnd2luIGhlYWRlciBmaWxlIHNldCwgZGVmaW5lIHRoZQotICAgZm9sbG93aW5nIHdoaWNoIG5ldmVyIHNob3VsZCBoYXZlIGJlZW4gaW4gdGhlIGdlbmVyaWMgV2luMzIgQVBJCi0gICBoZWFkZXJzIGluIHRoZSBmaXJzdCBwbGFjZSBzaW5jZSB0aGV5IHdlcmUgb3VyIG93biBpbnZlbnRpb24uLi4gKi8KLSNpZm5kZWYgX0dOVV9IX1dJTkRPV1NfSAotI2RlZmluZSBGTEFHX1RSQUNFX0JJVCAweDEwMAotI2RlZmluZSBDT05URVhUX0RFQlVHR0VSIChDT05URVhUX0ZVTEwgfCBDT05URVhUX0ZMT0FUSU5HX1BPSU5UKQotI2VuZGlmCi0KLS8qIFRoZSBzdHJpbmcgc2VudCBieSBjeWd3aW4gd2hlbiBpdCBwcm9jZXNzZXMgYSBzaWduYWwuCi0gICBGSVhNRTogVGhpcyBzaG91bGQgYmUgaW4gYSBjeWd3aW4gaW5jbHVkZSBmaWxlLiAqLwotI2RlZmluZSBDWUdXSU5fU0lHTkFMX1NUUklORyAiY3lnd2luOiBzaWduYWwiCi0KLSNkZWZpbmUgQ0hFQ0soeCkgCWNoZWNrICh4LCBfX0ZJTEVfXyxfX0xJTkVfXykKLSNkZWZpbmUgREVCVUdfRVhFQyh4KQlpZiAoZGVidWdfZXhlYykJCXByaW50ZiB4Ci0jZGVmaW5lIERFQlVHX0VWRU5UUyh4KQlpZiAoZGVidWdfZXZlbnRzKQlwcmludGYgeAotI2RlZmluZSBERUJVR19NRU0oeCkJaWYgKGRlYnVnX21lbW9yeSkJcHJpbnRmIHgKLSNkZWZpbmUgREVCVUdfRVhDRVBUKHgpCWlmIChkZWJ1Z19leGNlcHRpb25zKQlwcmludGYgeAotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCi1leHRlcm4gc3RydWN0IHRhcmdldF9vcHMgY2hpbGRfb3BzOwotCi1zdGF0aWMgdm9pZCBjaGlsZF9zdG9wIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgd2luMzJfY2hpbGRfdGhyZWFkX2FsaXZlIFBBUkFNUyAoKGludCkpOwotdm9pZCBjaGlsZF9raWxsX2luZmVyaW9yIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGludCBsYXN0X3NpZyA9IDA7CS8qIFNldCBpZiBhIHNpZ25hbCB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUKLQkJCQkgICBkZWJ1Z2dlZCBwcm9jZXNzICovCi0KLS8qIFRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byB0cmFjayBpbmZvcm1hdGlvbiB0aGF0IGlzCi0gICBub3QgYXZhaWxhYmxlIGluIGdkYidzIHRocmVhZCBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB0aHJlYWRfaW5mb19zdHJ1Y3QKLXsKLSAgc3RydWN0IHRocmVhZF9pbmZvX3N0cnVjdCAqbmV4dDsKLSAgRFdPUkQgaWQ7Ci0gIEhBTkRMRSBoOwotICBjaGFyICpuYW1lOwotICBpbnQgc3VzcGVuZF9jb3VudDsKLSAgQ09OVEVYVCBjb250ZXh0OwotfSB0aHJlYWRfaW5mbzsKLQotc3RhdGljIHRocmVhZF9pbmZvIHRocmVhZF9oZWFkID0ge05VTEx9OwotCi0vKiBUaGUgcHJvY2VzcyBhbmQgdGhyZWFkIGhhbmRsZXMgZm9yIHRoZSBhYm92ZSBjb250ZXh0LiAqLwotCi1zdGF0aWMgREVCVUdfRVZFTlQgY3VycmVudF9ldmVudDsJLyogVGhlIGN1cnJlbnQgZGVidWcgZXZlbnQgZnJvbQotCQkJCQkgICBXYWl0Rm9yRGVidWdFdmVudCAqLwotc3RhdGljIEhBTkRMRSBjdXJyZW50X3Byb2Nlc3NfaGFuZGxlOwkvKiBDdXJyZW50bHkgZXhlY3V0aW5nIHByb2Nlc3MgKi8KLXN0YXRpYyB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWQ7CS8qIEluZm8gb24gY3VycmVudGx5IHNlbGVjdGVkIHRocmVhZCAqLwotc3RhdGljIERXT1JEIG1haW5fdGhyZWFkX2lkOwkJLyogVGhyZWFkIElEIG9mIHRoZSBtYWluIHRocmVhZCAqLwotCi0vKiBDb3VudHMgb2YgdGhpbmdzLiAqLwotc3RhdGljIGludCBleGNlcHRpb25fY291bnQgPSAwOwotc3RhdGljIGludCBldmVudF9jb3VudCA9IDA7Ci0KLS8qIFVzZXIgb3B0aW9ucy4gKi8KLXN0YXRpYyBpbnQgbmV3X2NvbnNvbGUgPSAwOwotc3RhdGljIGludCBuZXdfZ3JvdXAgPSAwOwotc3RhdGljIGludCBkZWJ1Z19leGVjID0gMDsJCS8qIHNob3cgZXhlY3V0aW9uICovCi1zdGF0aWMgaW50IGRlYnVnX2V2ZW50cyA9IDA7CQkvKiBzaG93IGV2ZW50cyBmcm9tIGtlcm5lbCAqLwotc3RhdGljIGludCBkZWJ1Z19tZW1vcnkgPSAwOwkJLyogc2hvdyB0YXJnZXQgbWVtb3J5IGFjY2Vzc2VzICovCi1zdGF0aWMgaW50IGRlYnVnX2V4Y2VwdGlvbnMgPSAwOwkvKiBzaG93IHRhcmdldCBleGNlcHRpb25zICovCi0KLS8qIFRoaXMgdmVjdG9yIG1hcHMgR0RCJ3MgaWRlYSBvZiBhIHJlZ2lzdGVyJ3MgbnVtYmVyIGludG8gYW4gYWRkcmVzcwotICAgaW4gdGhlIHdpbjMyIGV4Y2VwdGlvbiBjb250ZXh0IHZlY3Rvci4KLQotICAgSXQgYWxzbyBjb250YWlucyB0aGUgYml0IG1hc2sgbmVlZGVkIHRvIGxvYWQgdGhlIHJlZ2lzdGVyIGluIHF1ZXN0aW9uLgotCi0gICBPbmUgZGF5IHdlIGNvdWxkIHJlYWQgYSByZWcsIHdlIGNvdWxkIGluc3BlY3QgdGhlIGNvbnRleHQgd2UKLSAgIGFscmVhZHkgaGF2ZSBsb2FkZWQsIGlmIGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYml0IHNldCB0aGF0IHdlIG5lZWQsCi0gICB3ZSByZWFkIHRoYXQgc2V0IG9mIHJlZ2lzdGVycyBpbiB1c2luZyBHZXRUaHJlYWRDb250ZXh0LiAgSWYgdGhlCi0gICBjb250ZXh0IGFscmVhZHkgY29udGFpbnMgd2hhdCB3ZSBuZWVkLCB3ZSBqdXN0IHVucGFjayBpdC4gVGhlbiB0bwotICAgd3JpdGUgYSByZWdpc3RlciwgZmlyc3Qgd2UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBjb250YWlucwotICAgdGhlIG90aGVyIHJlZ3Mgb2YgdGhlIGdyb3VwLCBhbmQgdGhlbiB3ZSBjb3B5IHRoZSBpbmZvIGluIGFuZCBzZXQKLSAgIG91dCBiaXQuICovCi0KLSNkZWZpbmUgY29udGV4dF9vZmZzZXQoeCkgKChpbnQpJigoKENPTlRFWFQgKilOVUxMKS0+eCkpCi1zdGF0aWMgY29uc3QgaW50IG1hcHBpbmdzW10gPQotewotICBjb250ZXh0X29mZnNldChFYXgpLAotICBjb250ZXh0X29mZnNldChFY3gpLAotICBjb250ZXh0X29mZnNldChFZHgpLAotICBjb250ZXh0X29mZnNldChFYngpLAotICBjb250ZXh0X29mZnNldChFc3ApLAotICBjb250ZXh0X29mZnNldChFYnApLAotICBjb250ZXh0X29mZnNldChFc2kpLAotICBjb250ZXh0X29mZnNldChFZGkpLAotICBjb250ZXh0X29mZnNldChFaXApLAotICBjb250ZXh0X29mZnNldChFRmxhZ3MpLAotICBjb250ZXh0X29mZnNldChTZWdDcyksCi0gIGNvbnRleHRfb2Zmc2V0KFNlZ1NzKSwKLSAgY29udGV4dF9vZmZzZXQoU2VnRHMpLAotICBjb250ZXh0X29mZnNldChTZWdFcyksCi0gIGNvbnRleHRfb2Zmc2V0KFNlZ0ZzKSwKLSAgY29udGV4dF9vZmZzZXQoU2VnR3MpLAotICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzAgKiAxMF0pLAotICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzEgKiAxMF0pLAotICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzIgKiAxMF0pLAotICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzMgKiAxMF0pLAotICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzQgKiAxMF0pLAotICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzUgKiAxMF0pLAotICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzYgKiAxMF0pLAotICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzcgKiAxMF0pLAotfTsKLQotLyogVGhpcyB2ZWN0b3IgbWFwcyB0aGUgdGFyZ2V0J3MgaWRlYSBvZiBhbiBleGNlcHRpb24gKGV4dHJhY3RlZAotICAgZnJvbSB0aGUgREVCVUdfRVZFTlQgc3RydWN0dXJlKSB0byBHREIncyBpZGVhLiAqLwotCi1zdHJ1Y3QgeGxhdGVfZXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgdGhlbTsKLSAgICBlbnVtIHRhcmdldF9zaWduYWwgdXM7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeGxhdGVfZXhjZXB0aW9uCi0gIHhsYXRlW10gPQotewotICB7RVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04sIFRBUkdFVF9TSUdOQUxfU0VHVn0sCi0gIHtTVEFUVVNfU1RBQ0tfT1ZFUkZMT1csIFRBUkdFVF9TSUdOQUxfU0VHVn0sCi0gIHtFWENFUFRJT05fQlJFQUtQT0lOVCwgVEFSR0VUX1NJR05BTF9UUkFQfSwKLSAge0RCR19DT05UUk9MX0MsIFRBUkdFVF9TSUdOQUxfSU5UfSwKLSAge0VYQ0VQVElPTl9TSU5HTEVfU1RFUCwgVEFSR0VUX1NJR05BTF9UUkFQfSwKLSAgey0xLCAtMX19OwotCi0vKiBGaW5kIGEgdGhyZWFkIHJlY29yZCBnaXZlbiBhIHRocmVhZCBpZC4KLSAgIElmIGdldF9jb250ZXh0IHRoZW4gYWxzbyByZXRyaWV2ZSB0aGUgY29udGV4dCBmb3IgdGhpcwotICAgdGhyZWFkLiAqLwotc3RhdGljIHRocmVhZF9pbmZvICoKLXRocmVhZF9yZWMgKERXT1JEIGlkLCBpbnQgZ2V0X2NvbnRleHQpCi17Ci0gIHRocmVhZF9pbmZvICp0aDsKLQotICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOyAodGggPSB0aC0+bmV4dCkgIT0gTlVMTDsgKQotICAgIGlmICh0aC0+aWQgPT0gaWQpCi0gICAgICB7Ci0JaWYgKCF0aC0+c3VzcGVuZF9jb3VudCAmJiBnZXRfY29udGV4dCkKLQkgIHsKLQkgICAgaWYgKGdldF9jb250ZXh0ID4gMCkKLQkgICAgICB0aC0+c3VzcGVuZF9jb3VudCA9IFN1c3BlbmRUaHJlYWQgKHRoLT5oKSArIDE7Ci0JICAgIGVsc2UgaWYgKGdldF9jb250ZXh0IDwgMCkKLQkgICAgICB0aC0+c3VzcGVuZF9jb3VudCA9IC0xOwotCi0JICAgIHRoLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IENPTlRFWFRfREVCVUdHRVI7Ci0JICAgIEdldFRocmVhZENvbnRleHQgKHRoLT5oLCAmdGgtPmNvbnRleHQpOwotCSAgfQotCXJldHVybiB0aDsKLSAgICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQWRkIGEgdGhyZWFkIHRvIHRoZSB0aHJlYWQgbGlzdCAqLwotc3RhdGljIHRocmVhZF9pbmZvICoKLWNoaWxkX2FkZF90aHJlYWQoRFdPUkQgaWQsIEhBTkRMRSBoKQotewotICB0aHJlYWRfaW5mbyAqdGg7Ci0KLSAgaWYgKCh0aCA9IHRocmVhZF9yZWMgKGlkLCBGQUxTRSkpKQotICAgIHJldHVybiB0aDsKLQotICB0aCA9ICh0aHJlYWRfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKCp0aCkpOwotICBtZW1zZXQodGgsIDAsIHNpemVvZiAoKnRoKSk7Ci0gIHRoLT5pZCA9IGlkOwotICB0aC0+aCA9IGg7Ci0gIHRoLT5uZXh0ID0gdGhyZWFkX2hlYWQubmV4dDsKLSAgdGhyZWFkX2hlYWQubmV4dCA9IHRoOwotICBhZGRfdGhyZWFkIChpZCk7Ci0gIHJldHVybiB0aDsKLX0KLQotLyogQ2xlYXIgb3V0IGFueSBvbGQgdGhyZWFkIGxpc3QgYW5kIHJlaW50aWFsaXplIGl0IHRvIGEKLSAgIHByaXN0aW5lIHN0YXRlLiAqLwotc3RhdGljIHZvaWQKLWNoaWxkX2luaXRfdGhyZWFkX2xpc3QgKCkKLXsKLSAgdGhyZWFkX2luZm8gKnRoID0gJnRocmVhZF9oZWFkOwotCi0gIERFQlVHX0VWRU5UUyAoKCJnZGI6IGNoaWxkX2luaXRfdGhyZWFkX2xpc3RcbiIpKTsKLSAgaW5pdF90aHJlYWRfbGlzdCAoKTsKLSAgd2hpbGUgKHRoLT5uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgdGhyZWFkX2luZm8gKmhlcmUgPSB0aC0+bmV4dDsKLSAgICAgIHRoLT5uZXh0ID0gaGVyZS0+bmV4dDsKLSAgICAgICh2b2lkKSBDbG9zZUhhbmRsZSAoaGVyZS0+aCk7Ci0gICAgICBmcmVlIChoZXJlKTsKLSAgICB9Ci19Ci0KLS8qIERlbGV0ZSBhIHRocmVhZCBmcm9tIHRoZSBsaXN0IG9mIHRocmVhZHMgKi8KLXN0YXRpYyB2b2lkCi1jaGlsZF9kZWxldGVfdGhyZWFkIChEV09SRCBpZCkKLXsKLSAgdGhyZWFkX2luZm8gKnRoOwotCi0gIGlmIChpbmZvX3ZlcmJvc2UpCi0gICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJbRGVsZXRpbmcgJXNdXG4iLCB0YXJnZXRfcGlkX3RvX3N0ciAoaWQpKTsKLSAgZGVsZXRlX3RocmVhZCAoaWQpOwotCi0gIGZvciAodGggPSAmdGhyZWFkX2hlYWQ7Ci0gICAgICAgdGgtPm5leHQgIT0gTlVMTCAmJiB0aC0+bmV4dC0+aWQgIT0gaWQ7Ci0gICAgICAgdGggPSB0aC0+bmV4dCkKLSAgICBjb250aW51ZTsKLQotICBpZiAodGgtPm5leHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB0aHJlYWRfaW5mbyAqaGVyZSA9IHRoLT5uZXh0OwotICAgICAgdGgtPm5leHQgPSBoZXJlLT5uZXh0OwotICAgICAgQ2xvc2VIYW5kbGUgKGhlcmUtPmgpOwotICAgICAgZnJlZSAoaGVyZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY2hlY2sgKEJPT0wgb2ssIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBpZiAoIW9rKQotICAgIHByaW50Zl9maWx0ZXJlZCAoImVycm9yIHJldHVybiAlczolZCB3YXMgJWRcbiIsIGZpbGUsIGxpbmUsIEdldExhc3RFcnJvciAoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKGludCByKQotewotICBpZiAociA+PSAwKQotICAgIHN1cHBseV9yZWdpc3RlciAociwgKChjaGFyICopICZjdXJyZW50X3RocmVhZC0+Y29udGV4dCkgKyBtYXBwaW5nc1tyXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKHIgPSAwOyByIDwgTlVNX1JFR1M7IHIrKykKLQlkb19jaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCi17Ci0gIGN1cnJlbnRfdGhyZWFkID0gdGhyZWFkX3JlYyAoaW5mZXJpb3JfcGlkLCBUUlVFKTsKLSAgZG9fY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCi17Ci0gIGlmIChyID49IDApCi0gICAgcmVhZF9yZWdpc3Rlcl9nZW4gKHIsICgoY2hhciAqKSAmY3VycmVudF90aHJlYWQtPmNvbnRleHQpICsgbWFwcGluZ3Nbcl0pOwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChyID0gMDsgciA8IE5VTV9SRUdTOyByKyspCi0JZG9fY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKLSAgICB9Ci19Ci0KLS8qIFN0b3JlIGEgbmV3IHJlZ2lzdGVyIHZhbHVlIGludG8gdGhlIGN1cnJlbnQgdGhyZWFkIGNvbnRleHQgKi8KLXN0YXRpYyB2b2lkCi1jaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKGludCByKQotewotICBjdXJyZW50X3RocmVhZCA9IHRocmVhZF9yZWMgKGluZmVyaW9yX3BpZCwgVFJVRSk7Ci0gIGRvX2NoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocik7Ci19Ci0KLS8qIFdhaXQgZm9yIGNoaWxkIHRvIGRvIHNvbWV0aGluZy4gIFJldHVybiBwaWQgb2YgY2hpbGQsIG9yIC0xIGluIGNhc2UKLSAgIG9mIGVycm9yOyBzdG9yZSBzdGF0dXMgdGhyb3VnaCBhcmd1bWVudCBwb2ludGVyIE9VUlNUQVRVUy4gICovCi0KLXN0YXRpYyBpbnQKLWhhbmRsZV9sb2FkX2RsbCAoUFRSIGR1bW15KQotewotICBMT0FEX0RMTF9ERUJVR19JTkZPICogZXZlbnQgPSAmY3VycmVudF9ldmVudC51LkxvYWREbGw7Ci0gIERXT1JEIGRsbF9uYW1lX3B0cjsKLSAgRFdPUkQgZG9uZTsKLSAgY2hhciBkbGxfYnVmW01BWF9QQVRIICsgMV07Ci0gIGNoYXIgKnAsICpkbGxfbmFtZSA9IE5VTEwsICpkbGxfYmFzZW5hbWU7Ci0gIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOwotICBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbWluZm87Ci0KLSAgZGxsX2J1ZlswXSA9IGRsbF9idWZbc2l6ZW9mKGRsbF9idWYpIC0gMV0gPSAnXDAnOwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBhdHRlbXB0cyB0byBmaW5kIHRoZSBuYW1lIG9mIHRoZSBkbGwgYnkgcmVhZGluZyB0aGUKLSAgICAgbmFtZSBmcm9tIHRoZSBwcm9jZXNzZXMgbWVtb3J5LiAgVW5mb3J0dW5hdGVseSBpdCBkb2Vzbid0IHdvcmsgcmlnaHQuCi0gICAgIERvaW5nIHRoaXMgdGhlICJyaWdodCB3YXkiIGZvciBXaW5kb3dzIGlzIHZlcnkgZGlmZmljdWx0LiAgRklYTUUgKi8KLSNpZmRlZiBET0VTTlRfV09SSwotICBtZW1zZXQgKCZtaW5mbywgMCwgc2l6ZW9mIG1pbmZvKTsKLSAgaWYgKFZpcnR1YWxRdWVyeUV4IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBDVk9JRCkgZXZlbnQtPmxwQmFzZU9mRGxsLAotCQkgICAgICAmbWluZm8sIHNpemVvZihtaW5mbykpICYmIG1pbmZvLkJhc2VBZGRyZXNzKSB7Ci0gICAgICBEV09SRCBsZW47Ci0gICAgICBJTUFHRV9ET1NfSEVBREVSICpobW0wID0gKElNQUdFX0RPU19IRUFERVIgKikgbWluZm8uQmFzZUFkZHJlc3M7Ci0gICAgICBITU9EVUxFIGhtbSA9IChITU9EVUxFKSAoKChEV09SRCkgaG1tMCkgKyBobW0wLT5lX2xmYW5ldyk7Ci0KLSAgICAgIGlmICgobGVuID0gR2V0TW9kdWxlRmlsZU5hbWUgKGhtbSwgZGxsX2J1ZiwgTUFYX1BBVEgpKSkKLQl7Ci0JICBkbGxfbmFtZSA9IGRsbF9idWY7Ci0JICBkbGxfbmFtZVtsZW5dID0gJ1wwJzsKLQl9Ci0gIH0KLSNlbmRpZgotCi0gIC8qIEF0dGVtcHQgdG8gcmVhZCB0aGUgbmFtZSBvZiB0aGUgZGxsIHRoYXQgd2FzIGRldGVjdGVkLgotICAgICBUaGlzIGlzIGRvY3VtZW50ZWQgdG8gd29yayBvbmx5IHdoZW4gYWN0aXZlbHkgZGVidWdnaW5nCi0gICAgIGEgcHJvZ3JhbS4gIEl0IHdpbGwgbm90IHdvcmsgZm9yIGF0dGFjaGVkIHByb2Nlc3Nlcy4gKi8KLSAgaWYgKGRsbF9uYW1lID09IE5VTEwgfHwgKmRsbF9uYW1lID09ICdcMCcpCi0gICAgewotICAgICAgaW50IHNpemUgPSBldmVudC0+ZlVuaWNvZGUgPyBzaXplb2YgKFdDSEFSKSA6IHNpemVvZiAoY2hhcik7Ci0gICAgICBpbnQgbGVuID0gMDsKLSAgICAgIGNoYXIgYlsyXTsKLQotICAgICAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkgKExQQ1ZPSUQpIGV2ZW50LT5scEltYWdlTmFtZSwKLQkJCSAoY2hhciAqKSAmZGxsX25hbWVfcHRyLAotCQkJIHNpemVvZiAoZGxsX25hbWVfcHRyKSwgJmRvbmUpOwotCi0gICAgICAvKiBTZWUgaWYgd2UgY291bGQgcmVhZCB0aGUgYWRkcmVzcyBvZiBhIHN0cmluZywgYW5kIHRoYXQgdGhlCi0JIGFkZHJlc3MgaXNuJ3QgbnVsbC4gKi8KLQotICAgICAgaWYgKGRvbmUgIT0gc2l6ZW9mIChkbGxfbmFtZV9wdHIpIHx8ICFkbGxfbmFtZV9wdHIpCi0JcmV0dXJuIDE7Ci0KLSAgICAgIGRvCi0JewotCSAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkgICAgIChMUENWT0lEKSAoZGxsX25hbWVfcHRyICsgbGVuICogc2l6ZSksCi0JCQkgICAgICZiLAotCQkJICAgICBzaXplLAotCQkJICAgICAmZG9uZSk7Ci0JICBsZW4rKzsKLQl9Ci0gICAgICB3aGlsZSAoKGJbMF0gIT0gMCB8fCBiW3NpemUgLSAxXSAhPSAwKSAmJiBkb25lID09IHNpemUpOwotCi0gICAgICBkbGxfbmFtZSA9IGFsbG9jYSAobGVuKTsKLQotICAgICAgaWYgKGV2ZW50LT5mVW5pY29kZSkKLQl7Ci0JICBXQ0hBUiAqdW5pY29kZV9kbGxfbmFtZSA9IChXQ0hBUiAqKSBhbGxvY2EgKGxlbiAqIHNpemVvZiAoV0NIQVIpKTsKLQkgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJICAgICAoTFBDVk9JRCkgZGxsX25hbWVfcHRyLAotCQkJICAgICB1bmljb2RlX2RsbF9uYW1lLAotCQkJICAgICBsZW4gKiBzaXplb2YgKFdDSEFSKSwKLQkJCSAgICAgJmRvbmUpOwotCi0JICBXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9BQ1AsIDAsCi0JCQkgICAgICAgdW5pY29kZV9kbGxfbmFtZSwgbGVuLAotCQkJICAgICAgIGRsbF9uYW1lLCBsZW4sIDAsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCSAgICAgKExQQ1ZPSUQpIGRsbF9uYW1lX3B0ciwKLQkJCSAgICAgZGxsX25hbWUsCi0JCQkgICAgIGxlbiwKLQkJCSAgICAgJmRvbmUpOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFkbGxfbmFtZSkKLSAgICByZXR1cm4gMTsKLQotICB3aGlsZSAoKHAgPSBzdHJjaHIgKGRsbF9uYW1lLCAnXFwnKSkpCi0gICAgKnAgPSAnLyc7Ci0KLSAgLyogRklYTUUhISBJdCB3b3VsZCBiZSBuaWNlIHRvIGRlZmluZSBvbmUgc3ltYm9sIHdoaWNoIHBvaW50ZWQgdG8gdGhlCi0gICAgIGZyb250IG9mIHRoZSBkbGwgaWYgd2UgY2FuJ3QgZmluZCBhbnkgc3ltYm9scy4gKi8KLQotICBpZiAoIShkbGxfYmFzZW5hbWUgPSBzdHJyY2hyKGRsbF9uYW1lLCAnLycpKSkKLSAgICBkbGxfYmFzZW5hbWUgPSBkbGxfbmFtZTsKLSAgZWxzZQotICAgIGRsbF9iYXNlbmFtZSsrOwotCi0gIEFMTF9PQkpGSUxFUyhvYmpmaWxlKQotICAgIHsKLSAgICAgIGNoYXIgKm9iamZpbGVfYmFzZW5hbWU7Ci0gICAgICBvYmpmaWxlX2Jhc2VuYW1lID0gc3RycmNocihvYmpmaWxlLT5uYW1lLCAnLycpOwotCi0gICAgICBpZiAob2JqZmlsZV9iYXNlbmFtZSAmJgotCSAgc3RyY21wKGRsbF9iYXNlbmFtZSwgb2JqZmlsZV9iYXNlbmFtZSArIDEpID09IDApCi0JewotCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIleDolcyAoc3ltYm9scyBwcmV2aW91c2x5IGxvYWRlZClcbiIsCi0JCQkgICAgIGV2ZW50LT5scEJhc2VPZkRsbCwgZGxsX25hbWUpOwotCSAgZ290byBvdXQ7Ci0JfQotICB9Ci0KLSAgLyogVGhlIHN5bWJvbHMgaW4gYSBkbGwgYXJlIG9mZnNldCBieSAweDEwMDAsIHdoaWNoIGlzIHRoZQotICAgICB0aGUgb2Zmc2V0IGZyb20gMCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiBhbiBpbWFnZSAtIGJlY2F1c2UKLSAgICAgb2YgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQuCi0KLSAgICAgRklYTUU6IElzIHRoaXMgdGhlIHJlYWwgcmVhc29uIHRoYXQgd2UgbmVlZCB0aGUgMHgxMDAwID8gKi8KLQotICBwcmludGZfdW5maWx0ZXJlZCAoIiV4OiVzIiwgZXZlbnQtPmxwQmFzZU9mRGxsLCBkbGxfbmFtZSk7Ci0gIHN5bWJvbF9maWxlX2FkZCAoZGxsX25hbWUsIDAsIChpbnQpIGV2ZW50LT5scEJhc2VPZkRsbCArIDB4MTAwMCwgMCwgMCwgMCwgMCwgMSk7Ci0gIHByaW50Zl91bmZpbHRlcmVkICgiXG4iKTsKLQotb3V0OgotICByZXR1cm4gMTsKLX0KLQotLyogSGFuZGxlIERFQlVHX1NUUklORyBvdXRwdXQgZnJvbSBjaGlsZCBwcm9jZXNzLgotICAgQ3lnd2luIHByZXBlbmRzIGl0cyBtZXNzYWdlcyB3aXRoIGEgImN5Z3dpbjoiLiAgSW50ZXJwcmV0IHRoaXMgYXMKLSAgIGEgQ3lnd2luIHNpZ25hbC4gIE90aGVyd2lzZSBqdXN0IHByaW50IHRoZSBzdHJpbmcgYXMgYSB3YXJuaW5nLiAqLwotc3RhdGljIGludAotaGFuZGxlX291dHB1dF9kZWJ1Z19zdHJpbmcgKHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQotewotICBjaGFyICpzOwotICBpbnQgZ290YXNpZyA9IEZBTFNFOwotCi0gIGlmICghdGFyZ2V0X3JlYWRfc3RyaW5nCi0gICAgICAoKENPUkVfQUREUikgY3VycmVudF9ldmVudC51LkRlYnVnU3RyaW5nLmxwRGVidWdTdHJpbmdEYXRhLCAmcywgMTAyNCwgMCkKLSAgICAgIHx8ICFzIHx8ICEqcykKLSAgICByZXR1cm4gZ290YXNpZzsKLQotICBpZiAoc3RybmNtcChzLCBDWUdXSU5fU0lHTkFMX1NUUklORywgc2l6ZW9mKENZR1dJTl9TSUdOQUxfU1RSSU5HKSAtIDEpKQotICAgIHsKLSAgICAgIHdhcm5pbmcgKHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICAvKmxhc3Rfc2lnID0gKi9zdHJ0b2wocyArIHNpemVvZihDWUdXSU5fU0lHTkFMX1NUUklORykgLSAxLCAmcCwgMCk7Ci0gICAgICBnb3Rhc2lnID0gdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QgKGxhc3Rfc2lnKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gZ290YXNpZzsKLSAgICAgIGlmIChnb3Rhc2lnKQotCW91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOwotICAgIH0KLQotICBmcmVlIChzKTsKLSAgcmV0dXJuIGdvdGFzaWc7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9leGNlcHRpb24gKHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQotewotICBpbnQgaTsKLSAgaW50IGRvbmUgPSAwOwotICB0aHJlYWRfaW5mbyAqdGg7Ci0KLSAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7Ci0KLSAgLyogUmVjb3JkIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHRocmVhZCAqLwotICB0aCA9IHRocmVhZF9yZWMgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwgLTEpOwotCi0gIHN3aXRjaCAoY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSkKLSAgICB7Ci0gICAgY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQUNDRVNTX1ZJT0xBVElPTiBhdCAweCUwOHhcbiIsCi0JCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1NFR1Y7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNUQVRVU19TVEFDS19PVkVSRkxPVzoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gU1RBQ0tfT1ZFUkZMT1cgYXQgMHglMDh4XG4iLAotCQkgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9TRUdWOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFWENFUFRJT05fQlJFQUtQT0lOVDoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQlJFQUtQT0lOVCBhdCAweCUwOHhcbiIsCi0JCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERCR19DT05UUk9MX0M6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIENPTlRST0xfQyBhdCAweCUwOHhcbiIsCi0JCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0lOVDsKLSAgICAgIC8qIFVzZXIgdHlwZWQgQ1RSTC1DLiAgQ29udGludWUgd2l0aCB0aGlzIHN0YXR1cyAqLwotICAgICAgbGFzdF9zaWcgPSBTSUdJTlQ7CS8qIEZJWE1FIC0gc2hvdWxkIGNoZWNrIHBhc3Mgc3RhdGUgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRVhDRVBUSU9OX1NJTkdMRV9TVEVQOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBTSU5HTEVfU1RFUCBhdCAweCUwOHhcbiIsCi0JCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhpcyBtYXkgYmUgYSBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyBleGNlcHRpb24uICBJbgotCSB0aGF0IGNhc2UsIHdlIHdhbnQgdG8gbGV0IHRoZSBwcm9ncmFtIHRyeSB0byBoYW5kbGUgaXQsIGFuZAotCSBvbmx5IGJyZWFrIGlmIHdlIHNlZSB0aGUgZXhjZXB0aW9uIGEgc2Vjb25kIHRpbWUuICAqLwotICAgICAgaWYgKGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uZHdGaXJzdENoYW5jZSkKLQlyZXR1cm4gMDsKLQotICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJnZGI6IHVua25vd24gdGFyZ2V0IGV4Y2VwdGlvbiAweCUwOHggYXQgMHglMDh4XG4iLAotCQkJIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUsCi0JCQkgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcyk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVU5LTk9XTjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZXhjZXB0aW9uX2NvdW50Kys7Ci0gIHJldHVybiAxOwotfQotCi0vKiBSZXN1bWUgYWxsIGFydGlmaWNpYWxseSBzdXNwZW5kZWQgdGhyZWFkcyBpZiB3ZSBhcmUgY29udGludWluZwotICAgZXhlY3V0aW9uICovCi1zdGF0aWMgQk9PTAotY2hpbGRfY29udGludWUgKERXT1JEIGNvbnRpbnVlX3N0YXR1cywgaW50IGlkKQotewotICBpbnQgaTsKLSAgdGhyZWFkX2luZm8gKnRoOwotICBCT09MIHJlczsKLQotICBERUJVR19FVkVOVFMgKCgiQ29udGludWVEZWJ1Z0V2ZW50IChjcGlkPSVkLCBjdGlkPSVkLCBEQkdfQ09OVElOVUUpO1xuIiwKLQkJIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCkpOwotICByZXMgPSBDb250aW51ZURlYnVnRXZlbnQgKGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCQkgICAgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgIGNvbnRpbnVlX3N0YXR1cyk7Ci0gIGlmIChyZXMpCi0gICAgZm9yICh0aCA9ICZ0aHJlYWRfaGVhZDsgKHRoID0gdGgtPm5leHQpICE9IE5VTEw7ICkKLSAgICAgIGlmICgoKGlkID09IC0xKSB8fCAoaWQgPT0gdGgtPmlkKSkgJiYgdGgtPnN1c3BlbmRfY291bnQpCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHRoLT5zdXNwZW5kX2NvdW50OyBpKyspCi0JICAgICh2b2lkKSBSZXN1bWVUaHJlYWQgKHRoLT5oKTsKLQkgIHRoLT5zdXNwZW5kX2NvdW50ID0gMDsKLQl9Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotY2hpbGRfd2FpdCAoaW50IHBpZCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCi17Ci0gIC8qIFdlIGxvb3Agd2hlbiB3ZSBnZXQgYSBub24tc3RhbmRhcmQgZXhjZXB0aW9uIHJhdGhlciB0aGFuIHJldHVybgotICAgICB3aXRoIGEgU1BVUklPVVMgYmVjYXVzZSByZXN1bWUgY2FuIHRyeSBhbmQgc3RlcCBvciBtb2RpZnkgdGhpbmdzLAotICAgICB3aGljaCBuZWVkcyBhIGN1cnJlbnRfdGhyZWFkLT5oLiAgQnV0IHNvbWUgb2YgdGhlc2UgZXhjZXB0aW9ucyBtYXJrCi0gICAgIHRoZSBiaXJ0aCBvciBkZWF0aCBvZiB0aHJlYWRzLCB3aGljaCBtZWFuIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkCi0gICAgIGlzbid0IG5lY2Vzc2FyaWx5IHdoYXQgeW91IHRoaW5rIGl0IGlzLiAqLwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIERXT1JEIGNvbnRpbnVlX3N0YXR1czsKLSAgICAgIEJPT0wgZGVidWdfZXZlbnQgPSBXYWl0Rm9yRGVidWdFdmVudCAoJmN1cnJlbnRfZXZlbnQsIDIwKTsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICB0aHJlYWRfaW5mbyAqdGg7Ci0gICAgICBpbnQgc2lnOwotCi0gICAgICBpZiAoZGVidWdfZXZlbnQpCi0JewotCSAgZXZlbnRfY291bnQrKzsKLQotCSAgY29udGludWVfc3RhdHVzID0gREJHX0NPTlRJTlVFOwotCi0JICBzd2l0Y2ggKGN1cnJlbnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSkKLQkgICAgewotCSAgICBjYXNlIENSRUFURV9USFJFQURfREVCVUdfRVZFTlQ6Ci0JICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSV4IGNvZGU9JXMpXG4iLAotCQkJICAgICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgICJDUkVBVEVfVEhSRUFEX0RFQlVHX0VWRU5UIikpOwotCSAgICAgIC8qIFJlY29yZCB0aGUgZXhpc3RlbmNlIG9mIHRoaXMgdGhyZWFkICovCi0JICAgICAgY2hpbGRfYWRkX3RocmVhZCAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJCWN1cnJlbnRfZXZlbnQudS5DcmVhdGVUaHJlYWQuaFRocmVhZCk7Ci0JICAgICAgaWYgKGluZm9fdmVyYm9zZSkKLQkJcHJpbnRmX3VuZmlsdGVyZWQgKCJbTmV3ICVzXVxuIiwKLQkJCQkgICB0YXJnZXRfcGlkX3RvX3N0ciAoY3VycmVudF9ldmVudC5kd1RocmVhZElkKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBFWElUX1RIUkVBRF9ERUJVR19FVkVOVDoKLQkgICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICAgIkVYSVRfVEhSRUFEX0RFQlVHX0VWRU5UIikpOwotCSAgICAgIGNoaWxkX2RlbGV0ZV90aHJlYWQgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVDoKLQkgICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICAgIkNSRUFURV9QUk9DRVNTX0RFQlVHX0VWRU5UIikpOwotCSAgICAgIGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUgPSBjdXJyZW50X2V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8uaFByb2Nlc3M7Ci0KLQkgICAgICBtYWluX3RocmVhZF9pZCA9IGluZmVyaW9yX3BpZCA9IGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZDsKLQkgICAgICAvKiBBZGQgdGhlIG1haW4gdGhyZWFkICovCi0JICAgICAgY3VycmVudF90aHJlYWQgPSBjaGlsZF9hZGRfdGhyZWFkIChpbmZlcmlvcl9waWQsCi0JCQkJCQkgY3VycmVudF9ldmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmhUaHJlYWQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRVhJVF9QUk9DRVNTX0RFQlVHX0VWRU5UOgotCSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgICAiRVhJVF9QUk9DRVNTX0RFQlVHX0VWRU5UIikpOwotCSAgICAgIG91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWElURUQ7Ci0JICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gY3VycmVudF9ldmVudC51LkV4aXRQcm9jZXNzLmR3RXhpdENvZGU7Ci0JICAgICAgQ2xvc2VIYW5kbGUgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUpOwotCSAgICAgIHJldHVybiBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTE9BRF9ETExfREVCVUdfRVZFTlQ6Ci0JICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkJICAgICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgICJMT0FEX0RMTF9ERUJVR19FVkVOVCIpKTsKLQkgICAgICBjYXRjaF9lcnJvcnMgKGhhbmRsZV9sb2FkX2RsbCwgTlVMTCwgIiIsIFJFVFVSTl9NQVNLX0FMTCk7Ci0JICAgICAgcmVnaXN0ZXJzX2NoYW5nZWQoKTsgICAgICAgICAgLyogbWFyayBhbGwgcmVncyBpbnZhbGlkICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBVTkxPQURfRExMX0RFQlVHX0VWRU5UOgotCSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgICAiVU5MT0FEX0RMTF9ERUJVR19FVkVOVCIpKTsKLQkgICAgICBicmVhazsJLyogRklYTUU6IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlICovCi0KLQkgICAgY2FzZSBFWENFUFRJT05fREVCVUdfRVZFTlQ6Ci0JICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkJICAgICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgICJFWENFUFRJT05fREVCVUdfRVZFTlQiKSk7Ci0JICAgICAgaWYgKGhhbmRsZV9leGNlcHRpb24gKG91cnN0YXR1cykpCi0JCXJldHVybiBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQ7Ci0JICAgICAgY29udGludWVfc3RhdHVzID0gREJHX0VYQ0VQVElPTl9OT1RfSEFORExFRDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9VVFBVVF9ERUJVR19TVFJJTkdfRVZFTlQ6IC8qIG1lc3NhZ2UgZnJvbSB0aGUga2VybmVsICovCi0JICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkJICAgICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgICJPVVRQVVRfREVCVUdfU1RSSU5HX0VWRU5UIikpOwotCSAgICAgIGlmIChoYW5kbGVfb3V0cHV0X2RlYnVnX3N0cmluZyAob3Vyc3RhdHVzKSkKLQkJcmV0dXJuIG1haW5fdGhyZWFkX2lkOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWRcbiIsCi0JCQkJIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCQkJIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCk7Ci0JICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIgICAgICAgICAgICAgICAgIHVua25vd24gZXZlbnQgY29kZSAlZFxuIiwKLQkJCQkgY3VycmVudF9ldmVudC5kd0RlYnVnRXZlbnRDb2RlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBDSEVDSyAoY2hpbGRfY29udGludWUgKGNvbnRpbnVlX3N0YXR1cywgLTEpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGRldGFjaCA9IDA7Ci0KLQkgIGlmICh1aV9sb29wX2hvb2sgIT0gTlVMTCkKLQkgICAgZGV0YWNoID0gdWlfbG9vcF9ob29rICgwKTsKLQotCSAgaWYgKGRldGFjaCkKLQkgICAgY2hpbGRfa2lsbF9pbmZlcmlvciAoKTsKLQl9Ci0gICAgfQotfQotCi0vKiBBdHRhY2ggdG8gcHJvY2VzcyBQSUQsIHRoZW4gaW5pdGlhbGl6ZSBmb3IgZGVidWdnaW5nIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLWNoaWxkX2F0dGFjaCAoYXJncywgZnJvbV90dHkpCi0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgQk9PTCBvazsKLQotICBpZiAoIWFyZ3MpCi0gICAgZXJyb3Jfbm9fYXJnICgicHJvY2Vzcy1pZCB0byBhdHRhY2giKTsKLQotICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkID0gc3RydG91bCAoYXJncywgMCwgMCk7Ci0KLSAgb2sgPSBEZWJ1Z0FjdGl2ZVByb2Nlc3MgKGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpOwotCi0gIGlmICghb2spCi0gICAgZXJyb3IgKCJDYW4ndCBhdHRhY2ggdG8gcHJvY2Vzcy4iKTsKLQotICBleGNlcHRpb25fY291bnQgPSAwOwotICBldmVudF9jb3VudCA9IDA7Ci0KLSAgaWYgKGZyb21fdHR5KQotICAgIHsKLSAgICAgIGNoYXIgKmV4ZWNfZmlsZSA9IChjaGFyICopIGdldF9leGVjX2ZpbGUgKDApOwotCi0gICAgICBpZiAoZXhlY19maWxlKQotCXByaW50Zl91bmZpbHRlcmVkICgiQXR0YWNoaW5nIHRvIHByb2dyYW0gYCVzJywgJXNcbiIsIGV4ZWNfZmlsZSwKLQkJCSAgIHRhcmdldF9waWRfdG9fc3RyIChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gJXNcbiIsCi0JCQkgICB0YXJnZXRfcGlkX3RvX3N0ciAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCkpOwotCi0gICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOwotICAgIH0KLQotICBwdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQotICAgICBjaGFyICphcmdzOwotICAgICBpbnQgZnJvbV90dHk7Ci17Ci0gIGlmIChmcm9tX3R0eSkKLSAgICB7Ci0gICAgICBjaGFyICpleGVjX2ZpbGUgPSBnZXRfZXhlY19maWxlICgwKTsKLSAgICAgIGlmIChleGVjX2ZpbGUgPT0gMCkKLQlleGVjX2ZpbGUgPSAiIjsKLSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiRGV0YWNoaW5nIGZyb20gcHJvZ3JhbTogJXMgJXNcbiIsIGV4ZWNfZmlsZSwKLQkJCSB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7Ci0gICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOwotICAgIH0KLSAgaW5mZXJpb3JfcGlkID0gMDsKLSAgdW5wdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7Ci19Ci0KLS8qIFByaW50IHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdlJ3JlIGFjY2Vzc2luZy4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGlsZF9maWxlc19pbmZvIChpZ25vcmUpCi0gICAgIHN0cnVjdCB0YXJnZXRfb3BzICppZ25vcmU7Ci17Ci0gIHByaW50Zl91bmZpbHRlcmVkICgiXHRVc2luZyB0aGUgcnVubmluZyBpbWFnZSBvZiAlcyAlcy5cbiIsCi0gICAgICBhdHRhY2hfZmxhZyA/ICJhdHRhY2hlZCIgOiAiY2hpbGQiLCB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotY2hpbGRfb3BlbiAoYXJnLCBmcm9tX3R0eSkKLSAgICAgY2hhciAqYXJnOwotICAgICBpbnQgZnJvbV90dHk7Ci17Ci0gIGVycm9yICgiVXNlIHRoZSBcInJ1blwiIGNvbW1hbmQgdG8gc3RhcnQgYSBVbml4IGNoaWxkIHByb2Nlc3MuIik7Ci19Ci0KLS8qIFN0YXJ0IGFuIGluZmVyaW9yIHdpbjMyIGNoaWxkIHByb2Nlc3MgYW5kIHNldHMgaW5mZXJpb3JfcGlkIHRvIGl0cyBwaWQuCi0gICBFWEVDX0ZJTEUgaXMgdGhlIGZpbGUgdG8gcnVuLgotICAgQUxMQVJHUyBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIHByb2dyYW0uCi0gICBFTlYgaXMgdGhlIGVudmlyb25tZW50IHZlY3RvciB0byBwYXNzLiAgRXJyb3JzIHJlcG9ydGVkIHdpdGggZXJyb3IoKS4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGlsZF9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52KQotICAgICBjaGFyICpleGVjX2ZpbGU7Ci0gICAgIGNoYXIgKmFsbGFyZ3M7Ci0gICAgIGNoYXIgKiplbnY7Ci17Ci0gIGNoYXIgcmVhbF9wYXRoW01BWFBBVEhMRU5dOwotICBjaGFyICp3aW5lbnY7Ci0gIGNoYXIgKnRlbXA7Ci0gIGludCAgZW52bGVuOwotICBpbnQgaTsKLQotICBTVEFSVFVQSU5GTyBzaTsKLSAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKLSAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzIGR1bW15OwotICBCT09MIHJldDsKLSAgRFdPUkQgZmxhZ3M7Ci0gIGNoYXIgKmFyZ3M7Ci0KLSAgaWYgKCFleGVjX2ZpbGUpCi0gICAgewotICAgICAgZXJyb3IgKCJObyBleGVjdXRhYmxlIHNwZWNpZmllZCwgdXNlIGB0YXJnZXQgZXhlYycuXG4iKTsKLSAgICB9Ci0KLSAgbWVtc2V0ICgmc2ksIDAsIHNpemVvZiAoc2kpKTsKLSAgc2kuY2IgPSBzaXplb2YgKHNpKTsKLQotICBjeWd3aW4zMl9jb252X3RvX3dpbjMyX3BhdGggKGV4ZWNfZmlsZSwgcmVhbF9wYXRoKTsKLQotICBmbGFncyA9IERFQlVHX09OTFlfVEhJU19QUk9DRVNTOwotCi0gIGlmIChuZXdfZ3JvdXApCi0gICAgZmxhZ3MgfD0gQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQOwotCi0gIGlmIChuZXdfY29uc29sZSkKLSAgICBmbGFncyB8PSBDUkVBVEVfTkVXX0NPTlNPTEU7Ci0KLSAgYXJncyA9IGFsbG9jYSAoc3RybGVuIChyZWFsX3BhdGgpICsgc3RybGVuIChhbGxhcmdzKSArIDIpOwotCi0gIHN0cmNweSAoYXJncywgcmVhbF9wYXRoKTsKLQotICBzdHJjYXQgKGFyZ3MsICIgIik7Ci0gIHN0cmNhdCAoYXJncywgYWxsYXJncyk7Ci0KLSAgLyogUHJlcGFyZSB0aGUgZW52aXJvbm1lbnQgdmFycyBmb3IgQ3JlYXRlUHJvY2Vzcy4gICovCi0gIHsKLSAgICAvKiBUaGlzIGNvZGUgdXNlIHRvIGFzc3VtZSBhbGwgZW52IHZhcnMgd2VyZSBmaWxlIG5hbWVzIGFuZCB3b3VsZAotICAgICAgIHRyYW5zbGF0ZSB0aGVtIGFsbCB0byB3aW4zMiBzdHlsZS4gIFRoYXQgb2J2aW91c2x5IGRvZXNuJ3Qgd29yayBpbiB0aGUKLSAgICAgICBnZW5lcmFsIGNhc2UuICBUaGUgY3VycmVudCBydWxlIGlzIHRoYXQgd2Ugb25seSB0cmFuc2xhdGUgUEFUSC4KLSAgICAgICBXZSBuZWVkIHRvIGhhbmRsZSBQQVRIIGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gY2FsbCBDcmVhdGVQcm9jZXNzIGFuZAotICAgICAgIGl0IHVzZXMgUEFUSCB0byBmaW5kIERMTCdzLiAgRm9ydHVuYXRlbHkgUEFUSCBoYXMgYSB3ZWxsLWRlZmluZWQgdmFsdWUKLSAgICAgICBpbiBib3RoIHBvc2l4IGFuZCB3aW4zMiBlbnZpcm9ubWVudHMuICBjeWd3aW4uZGxsIHdpbGwgY2hhbmdlIGl0IGJhY2sKLSAgICAgICB0byBwb3NpeCBzdHlsZSBpZiBuZWNlc3NhcnkuICAqLwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZfcGF0aF9uYW1lc1tdID0KLSAgICAgIHsKLQkiUEFUSD0iLAotCTAKLSAgICAgIH07Ci0KLSAgICAvKiBDcmVhdGVQcm9jZXNzIHRha2VzIHRoZSBlbnZpcm9ubWVudCBsaXN0IGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHNldCBvZgotICAgICAgIHN0cmluZ3MgKGkuZS4gdHdvIG51bGxzIHRlcm1pbmF0ZSB0aGUgbGlzdCkuICAqLwotCi0gICAgLyogR2V0IHRvdGFsIHNpemUgZm9yIGVudiBzdHJpbmdzLiAgKi8KLSAgICBmb3IgKGVudmxlbiA9IDAsIGkgPSAwOyBlbnZbaV0gJiYgKmVudltpXTsgaSsrKQotICAgICAgewotCWludCBqLCBsZW47Ci0KLQlmb3IgKGogPSAwOyBjb252X3BhdGhfbmFtZXNbal07IGorKykKLQkgIHsKLQkgICAgbGVuID0gc3RybGVuIChjb252X3BhdGhfbmFtZXNbal0pOwotCSAgICBpZiAoc3RybmNtcCAoY29udl9wYXRoX25hbWVzW2pdLCBlbnZbaV0sIGxlbikgPT0gMCkKLQkgICAgICB7Ci0JCWlmIChjeWd3aW4zMl9wb3NpeF9wYXRoX2xpc3RfcCAoZW52W2ldICsgbGVuKSkKLQkJICBlbnZsZW4gKz0gbGVuCi0JCSAgICArIGN5Z3dpbjMyX3Bvc2l4X3RvX3dpbjMyX3BhdGhfbGlzdF9idWZfc2l6ZSAoZW52W2ldICsgbGVuKTsKLQkJZWxzZQotCQkgIGVudmxlbiArPSBzdHJsZW4gKGVudltpXSkgKyAxOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKGNvbnZfcGF0aF9uYW1lc1tqXSA9PSBOVUxMKQotCSAgZW52bGVuICs9IHN0cmxlbiAoZW52W2ldKSArIDE7Ci0gICAgICB9Ci0KLSAgICB3aW5lbnYgPSBhbGxvY2EgKGVudmxlbiArIDEpOwotCi0gICAgLyogQ29weSBlbnYgc3RyaW5ncyBpbnRvIG5ldyBidWZmZXIuICAqLwotICAgIGZvciAodGVtcCA9IHdpbmVudiwgaSA9IDA7IGVudltpXSAmJiAqZW52W2ldOyBpKyspCi0gICAgICB7Ci0JaW50IGosIGxlbjsKLQotCWZvciAoaiA9IDA7IGNvbnZfcGF0aF9uYW1lc1tqXTsgaisrKQotCSAgewotCSAgICBsZW4gPSBzdHJsZW4gKGNvbnZfcGF0aF9uYW1lc1tqXSk7Ci0JICAgIGlmIChzdHJuY21wIChjb252X3BhdGhfbmFtZXNbal0sIGVudltpXSwgbGVuKSA9PSAwKQotCSAgICAgIHsKLQkJaWYgKGN5Z3dpbjMyX3Bvc2l4X3BhdGhfbGlzdF9wIChlbnZbaV0gKyBsZW4pKQotCQkgIHsKLQkJICAgIG1lbWNweSAodGVtcCwgZW52W2ldLCBsZW4pOwotCQkgICAgY3lnd2luMzJfcG9zaXhfdG9fd2luMzJfcGF0aF9saXN0IChlbnZbaV0gKyBsZW4sIHRlbXAgKyBsZW4pOwotCQkgIH0KLQkJZWxzZQotCQkgIHN0cmNweSAodGVtcCwgZW52W2ldKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWlmIChjb252X3BhdGhfbmFtZXNbal0gPT0gTlVMTCkKLQkgIHN0cmNweSAodGVtcCwgZW52W2ldKTsKLQotCXRlbXAgKz0gc3RybGVuICh0ZW1wKSArIDE7Ci0gICAgICB9Ci0KLSAgICAvKiBGaW5hbCBuaWwgc3RyaW5nIHRvIHRlcm1pbmF0ZSBuZXcgZW52LiAgKi8KLSAgICAqdGVtcCA9IDA7Ci0gIH0KLQotICByZXQgPSBDcmVhdGVQcm9jZXNzICgwLAotCQkgICAgICAgYXJncywgCS8qIGNvbW1hbmQgbGluZSAqLwotCQkgICAgICAgTlVMTCwJLyogU2VjdXJpdHkgKi8KLQkJICAgICAgIE5VTEwsCS8qIHRocmVhZCAqLwotCQkgICAgICAgVFJVRSwJLyogaW5oZXJpdCBoYW5kbGVzICovCi0JCSAgICAgICBmbGFncywJLyogc3RhcnQgZmxhZ3MgKi8KLQkJICAgICAgIHdpbmVudiwKLQkJICAgICAgIE5VTEwsCS8qIGN1cnJlbnQgZGlyZWN0b3J5ICovCi0JCSAgICAgICAmc2ksCi0JCSAgICAgICAmcGkpOwotICBpZiAoIXJldCkKLSAgICBlcnJvciAoIkVycm9yIGNyZWF0aW5nIHByb2Nlc3MgJXMsIChlcnJvciAlZClcbiIsIGV4ZWNfZmlsZSwgR2V0TGFzdEVycm9yKCkpOwotCi0gIGV4Y2VwdGlvbl9jb3VudCA9IDA7Ci0gIGV2ZW50X2NvdW50ID0gMDsKLQotICBjdXJyZW50X3Byb2Nlc3NfaGFuZGxlID0gcGkuaFByb2Nlc3M7Ci0gIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQgPSBwaS5kd1Byb2Nlc3NJZDsKLSAgbWVtc2V0ICgmY3VycmVudF9ldmVudCwgMCwgc2l6ZW9mIChjdXJyZW50X2V2ZW50KSk7Ci0gIGluZmVyaW9yX3BpZCA9IGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCA9IHBpLmR3VGhyZWFkSWQ7Ci0gIHB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLSAgY2hpbGRfaW5pdF90aHJlYWRfbGlzdCAoKTsKLSAgaW5pdF93YWl0X2Zvcl9pbmZlcmlvciAoKTsKLSAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7Ci0gIHRhcmdldF90ZXJtaW5hbF9pbml0ICgpOwotICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7Ci0KLSAgLyogSWdub3JlIHRoZSBmaXJzdCB0cmFwICovCi0gIGNoaWxkX3dhaXQgKGluZmVyaW9yX3BpZCwgJmR1bW15KTsKLQotICBwcm9jZWVkICgoQ09SRV9BRERSKSAtIDEsIFRBUkdFVF9TSUdOQUxfMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9tb3Vybl9pbmZlcmlvciAoKQotewotICAodm9pZCkgY2hpbGRfY29udGludWUgKERCR19DT05USU5VRSwgLTEpOwotICB1bnB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLSAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKLX0KLQotLyogU2VuZCBhIFNJR0lOVCB0byB0aGUgcHJvY2VzcyBncm91cC4gIFRoaXMgYWN0cyBqdXN0IGxpa2UgdGhlIHVzZXIgdHlwZWQgYQotICAgXkMgb24gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAqLwotCi1zdGF0aWMgdm9pZAotY2hpbGRfc3RvcCAoKQotewotICBERUJVR19FVkVOVFMgKCgiZ2RiOiBHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQgKENUUkxDX0VWRU5ULCAwKVxuIikpOwotICBDSEVDSyAoR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50IChDVFJMX0NfRVZFTlQsIDApKTsKLSAgcmVnaXN0ZXJzX2NoYW5nZWQoKTsJCS8qIHJlZnJlc2ggcmVnaXN0ZXIgc3RhdGUgKi8KLX0KLQotaW50Ci1jaGlsZF94ZmVyX21lbW9yeSAoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm91ciwgaW50IGxlbiwKLQkJICAgaW50IHdyaXRlLCBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KQotewotICBEV09SRCBkb25lOwotICBpZiAod3JpdGUpCi0gICAgewotICAgICAgREVCVUdfTUVNICgoImdkYjogd3JpdGUgdGFyZ2V0IG1lbW9yeSwgJWQgYnl0ZXMgYXQgMHglMDh4XG4iLAotCQkgIGxlbiwgbWVtYWRkcikpOwotICAgICAgV3JpdGVQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBWT0lEKSBtZW1hZGRyLCBvdXIsCi0JCQkgIGxlbiwgJmRvbmUpOwotICAgICAgRmx1c2hJbnN0cnVjdGlvbkNhY2hlIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBDVk9JRCkgbWVtYWRkciwgbGVuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBERUJVR19NRU0gKCgiZ2RiOiByZWFkIHRhcmdldCBtZW1vcnksICVkIGJ5dGVzIGF0IDB4JTA4eFxuIiwKLQkJICBsZW4sIG1lbWFkZHIpKTsKLSAgICAgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBDVk9JRCkgbWVtYWRkciwgb3VyLCBsZW4sCi0JCQkgJmRvbmUpOwotICAgIH0KLSAgcmV0dXJuIGRvbmU7Ci19Ci0KLXZvaWQKLWNoaWxkX2tpbGxfaW5mZXJpb3IgKHZvaWQpCi17Ci0gIENIRUNLIChUZXJtaW5hdGVQcm9jZXNzIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAwKSk7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAoIWNoaWxkX2NvbnRpbnVlIChEQkdfQ09OVElOVUUsIC0xKSkKLQlicmVhazsKLSAgICAgIGlmICghV2FpdEZvckRlYnVnRXZlbnQgKCZjdXJyZW50X2V2ZW50LCBJTkZJTklURSkpCi0JYnJlYWs7Ci0gICAgICBpZiAoY3VycmVudF9ldmVudC5kd0RlYnVnRXZlbnRDb2RlID09IEVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVCkKLQlicmVhazsKLSAgICB9Ci0KLSAgQ0hFQ0sgKENsb3NlSGFuZGxlIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlKSk7Ci0KLSAgLyogdGhpcyBtYXkgZmFpbCBpbiBhbiBhdHRhY2hlZCBwcm9jZXNzIHNvIGRvbid0IGNoZWNrLiAqLwotICAodm9pZCkgQ2xvc2VIYW5kbGUgKGN1cnJlbnRfdGhyZWFkLT5oKTsKLSAgdGFyZ2V0X21vdXJuX2luZmVyaW9yKCk7CS8qIG9yIGp1c3QgY2hpbGRfbW91cm5faW5mZXJpb3I/ICovCi19Ci0KLXZvaWQKLWNoaWxkX3Jlc3VtZSAoaW50IHBpZCwgaW50IHN0ZXAsIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWcpCi17Ci0gIGludCBpOwotICB0aHJlYWRfaW5mbyAqdGg7Ci0gIERXT1JEIGNvbnRpbnVlX3N0YXR1cyA9IGxhc3Rfc2lnID4gMCAmJiBsYXN0X3NpZyA8IE5TSUcgPwotCQkJICBEQkdfRVhDRVBUSU9OX05PVF9IQU5ETEVEIDogREJHX0NPTlRJTlVFOwotCi0gIERFQlVHX0VYRUMgKCgiZ2RiOiBjaGlsZF9yZXN1bWUgKHBpZD0lZCwgc3RlcD0lZCwgc2lnPSVkKTtcbiIsCi0JICAgICAgIHBpZCwgc3RlcCwgc2lnKSk7Ci0KLSAgLyogR2V0IGNvbnRleHQgZm9yIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQgKi8KLSAgdGggPSB0aHJlYWRfcmVjIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsIEZBTFNFKTsKLSAgaWYgKHN0ZXApCi0gICAgewotI2lmZGVmIGkzODYKLSAgICAgIC8qIFNpbmdsZSBzdGVwIGJ5IHNldHRpbmcgdCBiaXQgKi8KLSAgICAgIGNoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoUFNfUkVHTlVNKTsKLSAgICAgIHRoLT5jb250ZXh0LkVGbGFncyB8PSBGTEFHX1RSQUNFX0JJVDsKLSNlbmRpZgotICAgIH0KLQotICBpZiAodGgtPmNvbnRleHQuQ29udGV4dEZsYWdzKQotICAgIHsKLSAgICAgIENIRUNLIChTZXRUaHJlYWRDb250ZXh0ICh0aC0+aCwgJnRoLT5jb250ZXh0KSk7Ci0gICAgICB0aC0+Y29udGV4dC5Db250ZXh0RmxhZ3MgPSAwOwotICAgIH0KLQotICAvKiBBbGxvdyBjb250aW51aW5nIHdpdGggdGhlIHNhbWUgc2lnbmFsIHRoYXQgaW50ZXJydXB0ZWQgdXMuCi0gICAgIE90aGVyd2lzZSBjb21wbGFpbi4gKi8KLSAgaWYgKHNpZyAmJiBzaWcgIT0gbGFzdF9zaWcpCi0gICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiQ2FuJ3Qgc2VuZCBzaWduYWxzIHRvIHRoZSBjaGlsZC4gIHNpZ25hbCAlZFxuIiwgc2lnKTsKLQotICBsYXN0X3NpZyA9IDA7Ci0gIGNoaWxkX2NvbnRpbnVlIChjb250aW51ZV9zdGF0dXMsIHBpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9wcmVwYXJlX3RvX3N0b3JlICgpCi17Ci0gIC8qIERvIG5vdGhpbmcsIHNpbmNlIHdlIGNhbiBzdG9yZSBpbmRpdmlkdWFsIHJlZ3MgKi8KLX0KLQotc3RhdGljIGludAotY2hpbGRfY2FuX3J1biAoKQotewotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX2Nsb3NlICgpCi17Ci0gIERFQlVHX0VWRU5UUyAoKCJnZGI6IGNoaWxkX2Nsb3NlLCBpbmZlcmlvcl9waWQ9JWRcbiIsIGluZmVyaW9yX3BpZCkpOwotfQotCi1zdHJ1Y3QgdGFyZ2V0X29wcyBjaGlsZF9vcHMgOwotCi1zdGF0aWMgdm9pZCAKLWluaXRfY2hpbGRfb3BzKHZvaWQpCi17Ci0gIGNoaWxkX29wcy50b19zaG9ydG5hbWUgPSAgICJjaGlsZCI7Ci0gIGNoaWxkX29wcy50b19sb25nbmFtZSA9ICAgIldpbjMyIGNoaWxkIHByb2Nlc3MiOwotICBjaGlsZF9vcHMudG9fZG9jID0gICAiV2luMzIgY2hpbGQgcHJvY2VzcyAoc3RhcnRlZCBieSB0aGUgXCJydW5cIiBjb21tYW5kKS4iOwotICBjaGlsZF9vcHMudG9fb3BlbiA9ICAgY2hpbGRfb3BlbjsKLSAgY2hpbGRfb3BzLnRvX2Nsb3NlID0gICBjaGlsZF9jbG9zZTsKLSAgY2hpbGRfb3BzLnRvX2F0dGFjaCA9ICAgY2hpbGRfYXR0YWNoOwotICBjaGlsZF9vcHMudG9fZGV0YWNoID0gICBjaGlsZF9kZXRhY2g7Ci0gIGNoaWxkX29wcy50b19yZXN1bWUgPSAgIGNoaWxkX3Jlc3VtZTsKLSAgY2hpbGRfb3BzLnRvX3dhaXQgID0gICBjaGlsZF93YWl0OwotICBjaGlsZF9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzICA9ICAgY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzOwotICBjaGlsZF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9ICAgY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzOwotICBjaGlsZF9vcHMudG9fcHJlcGFyZV90b19zdG9yZSA9ICAgY2hpbGRfcHJlcGFyZV90b19zdG9yZTsKLSAgY2hpbGRfb3BzLnRvX3hmZXJfbWVtb3J5ICA9ICAgY2hpbGRfeGZlcl9tZW1vcnk7Ci0gIGNoaWxkX29wcy50b19maWxlc19pbmZvICA9ICAgY2hpbGRfZmlsZXNfaW5mbzsKLSAgY2hpbGRfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gICBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQ7Ci0gIGNoaWxkX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgbWVtb3J5X3JlbW92ZV9icmVha3BvaW50OwotICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5pdCAgPSAgIHRlcm1pbmFsX2luaXRfaW5mZXJpb3I7Ci0gIGNoaWxkX29wcy50b190ZXJtaW5hbF9pbmZlcmlvciA9ICAgdGVybWluYWxfaW5mZXJpb3I7Ci0gIGNoaWxkX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgPSAgIHRlcm1pbmFsX291cnNfZm9yX291dHB1dDsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX291cnMgID0gICB0ZXJtaW5hbF9vdXJzOwotICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5mbyAgPSAgIGNoaWxkX3Rlcm1pbmFsX2luZm87Ci0gIGNoaWxkX29wcy50b19raWxsICA9ICAgY2hpbGRfa2lsbF9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX2xvYWQgID0gICAwOwotICBjaGlsZF9vcHMudG9fbG9va3VwX3N5bWJvbCA9ICAgMDsKLSAgY2hpbGRfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICAgY2hpbGRfY3JlYXRlX2luZmVyaW9yOwotICBjaGlsZF9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAgIGNoaWxkX21vdXJuX2luZmVyaW9yOwotICBjaGlsZF9vcHMudG9fY2FuX3J1biAgPSAgIGNoaWxkX2Nhbl9ydW47Ci0gIGNoaWxkX29wcy50b19ub3RpY2Vfc2lnbmFscyA9ICAgMDsKLSAgY2hpbGRfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAgIHdpbjMyX2NoaWxkX3RocmVhZF9hbGl2ZTsKLSAgY2hpbGRfb3BzLnRvX3N0b3AgID0gICBjaGlsZF9zdG9wOwotICBjaGlsZF9vcHMudG9fc3RyYXR1bSA9ICAgcHJvY2Vzc19zdHJhdHVtOwotICBjaGlsZF9vcHMuRE9OVF9VU0UgPSAgIDA7Ci0gIGNoaWxkX29wcy50b19oYXNfYWxsX21lbW9yeSA9ICAgMTsKLSAgY2hpbGRfb3BzLnRvX2hhc19tZW1vcnkgPSAgIDE7Ci0gIGNoaWxkX29wcy50b19oYXNfc3RhY2sgPSAgIDE7Ci0gIGNoaWxkX29wcy50b19oYXNfcmVnaXN0ZXJzID0gICAxOwotICBjaGlsZF9vcHMudG9faGFzX2V4ZWN1dGlvbiA9ICAgMTsKLSAgY2hpbGRfb3BzLnRvX3NlY3Rpb25zID0gICAwOwotICBjaGlsZF9vcHMudG9fc2VjdGlvbnNfZW5kID0gICAwOwotICBjaGlsZF9vcHMudG9fbWFnaWMgPSAgIE9QU19NQUdJQzsKLX0KLQotdm9pZAotX2luaXRpYWxpemVfaW5mdGFyZyAoKQotewotICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKLSAgaW5pdF9jaGlsZF9vcHMoKSA7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJuZXctY29uc29sZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZuZXdfY29uc29sZSwKLQkJICAiU2V0IGNyZWF0aW9uIG9mIG5ldyBjb25zb2xlIHdoZW4gY3JlYXRpbmcgY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoIm5ldy1ncm91cCIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZuZXdfZ3JvdXAsCi0JCSAgIlNldCBjcmVhdGlvbiBvZiBuZXcgZ3JvdXAgd2hlbiBjcmVhdGluZyBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgiZGVidWdleGVjIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJmRlYnVnX2V4ZWMsCi0JCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkgZXhlY3V0aW9uIGluIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V2ZW50cyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZkZWJ1Z19ldmVudHMsCi0JCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkga2VybmVsIGV2ZW50cyBpbiBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgiZGVidWdtZW1vcnkiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmZGVidWdfbWVtb3J5LAotCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IG1lbW9yeSBhY2Nlc3NlcyBpbiBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgiZGVidWdleGNlcHRpb25zIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJmRlYnVnX2V4Y2VwdGlvbnMsCi0JCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkga2VybmVsIGV4Y2VwdGlvbnMgaW4gY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLX0KLQotLyogRGV0ZXJtaW5lIGlmIHRoZSB0aHJlYWQgcmVmZXJlbmNlZCBieSAicGlkIiBpcyBhbGl2ZQotICAgYnkgInBvbGxpbmciIGl0LiAgSWYgV2FpdEZvclNpbmdsZU9iamVjdCByZXR1cm5zIFdBSVRfT0JKRUNUXzAKLSAgIGl0IG1lYW5zIHRoYXQgdGhlIHBpZCBoYXMgZGllZC4gIE90aGVyd2lzZSBpdCBpcyBhc3N1bWVkIHRvIGJlIGFsaXZlLiAqLwotc3RhdGljIGludAotd2luMzJfY2hpbGRfdGhyZWFkX2FsaXZlIChpbnQgcGlkKQotewotICByZXR1cm4gV2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWRfcmVjIChwaWQsIEZBTFNFKS0+aCwgMCkgPT0gV0FJVF9PQkpFQ1RfMCA/Ci0JIEZBTFNFIDogVFJVRTsKLX0KLQotLyogQ29udmVydCBwaWQgdG8gcHJpbnRhYmxlIGZvcm1hdC4gKi8KLWNoYXIgKgotY3lnd2luX3BpZF90b19zdHIgKGludCBwaWQpCi17Ci0gIHN0YXRpYyBjaGFyIGJ1Zls4MF07Ci0gIGlmIChwaWQgPT0gY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCkKLSAgICBzcHJpbnRmIChidWYsICJwcm9jZXNzICVkIiwgcGlkKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGJ1ZiwgInRocmVhZCAlZC4weCV4IiwgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgcGlkKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mLy5nZGJpbml0IGIvZ3Byb2YvLmdkYmluaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTk0NzIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvLmdkYmluaXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1kaXIgLi4KZGlmZiAtLWdpdCBhL2dwcm9mL0NoYW5nZUxvZyBiL2dwcm9mL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5N2ZjNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxMzM4ICswLDAgQEAKLTE5OTktMDctMDEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgY2FzdHMgaW4gbWFueSBwcmludCBzdGF0ZW1lbnRzIHRvIGNhc3QgYmZkX3ZtYQotCXZhbHVlcyB0byB1bnNpZ25lZCBsb25nIHdoZW4gY2FsbGluZyBwcmludGYuCi0JKiBNYWtlZmlsZS5hbSAoJChPQkpFQ1RTKSk6IEFkZCBnbW9uLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEp1biAxNCAxMDozNToyOCAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGdwcm9mLnRleGk6IEZpeCB0eXBvLgotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gQm9iIEJ5cm5lcyA8YnlybmVzQGN1cmwuY29tPjoKLQkqIGNnX2Rmbi5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIKLQkoREZOX0lOQ1JfREVQVEgpOiBEZWZpbmUgaW5zdGVhZCBvZiBERk5fREVQVEguCi0JKGRmbl9zdGFjayk6IERlZmluZSBhcyBwb2ludGVyIHJhdGhlciB0aGFuIGFycmF5LgotCShwcmVfdmlzaXQpOiBSZWFsbG9jYXRlIGRmbl9zdGFjayBhcyBuZWVkZWQuCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ3Byb2YuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0JKiBncHJvZi5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlCi0Jc3lzdGVtIGRvZXMgbm90IGRlZmluZSBpdC4KLQotMTk5OS0wNC0wNSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb3JlZmlsZS5jIChjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBEb24ndCB1c2UgZml4ZWQgc2l6ZSBhcnJheQotCWZvciBwcmV2X25hbWUgYW5kIHByZXZfZmlsZW5hbWUuCi0KLTE5OTktMDQtMDQgIE1pY2hhZWwgSG9obXV0aCAgPGhvaG11dGhAaW5ub2NlbnQuY29tPgotCi0JKiBncHJvZi5oIChGRl9CU0Q0NCk6IERlZmluZS4KLQkqIGdtb24uaCAoc3RydWN0IHJhd19waGRyKTogQWRkIHZlcnNpb24sIHByb2ZyYXRlLCBhbmQgc3BhcmUKLQlmaWVsZHMgdW5jb25kaXRpb25hbGx5LgotCShzdHJ1Y3Qgb2xkX3Jhd19waGRyKTogTmV3IHN0cnVjdC4KLQkqIGdwcm9mLmMgKG1haW4pOiBIYW5kbGUgLU8gNC40YnNkLgotCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogSGFuZGxlIEJTRCA0LjQgZm9ybWF0LCBlaXRoZXIKLQlhdXRvbWF0aWNhbGx5IG9yIGJ5IHVzZXIgc3BlY2lmaWNhdGlvbi4KLQkoZ21vbl9vdXRfd3JpdGUpOiBIYW5kbGUgQlNEIDQuNCBmb3JtYXQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBCU0Q0NF9GT1JNQVQuCi0JKiBncHJvZi50ZXhpIChNaXNjZWxsYW5lb3VzIE9wdGlvbnMpOiBEb2N1bWVudCAtTyA0LjRic2QuCi0JKiBjb25maWd1cmUsIGdjb25maWcuaW46IFJlYnVpbGQuCi0KLVR1ZSBGZWIgMTYgMTc6MDE6MzMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBBQ19QUkVSRVEgdG8gMi4xMy4gIENoYW5nZSBBTV9QUk9HX0lOU1RBTEwKLQl0byBBQ19QUk9HX0lOU1RBTEwuICBSZW1vdmUgQU1fQ1lHV0lOMzIuICBDaGFuZ2UgQU1fRVhFRVhUIHRvCi0JQUNfRVhFRVhULiAgQWRkIGNvbW1lbnQgdG8gQUNfREVGSU5FLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogZ2NvbmZpZy5pbjogUmVidWlsZC4KLQotU3VuIERlYyAgNiAyMTo1Nzo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLnRleGkgKFN5bXNwZWNzKTogTWVudGlvbiB0aGF0IHlvdSBoYXZlIHRvIGFkZCBhbnkKLQl1bmRlcnNjb3JlIHlvdXJzZWxmIHdoZW4gbmFtaW5nIGEgc3ltYm9sLgotCi1Nb24gTm92ICAyIDE1OjA1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0gICAgICAgICogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVdlZCBBdWcgMTIgMTQ6NTk6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQXZvaWQgc29tZSBvdmVyZmxvdyBjYXNlczoKLQkqIGJhc2ljX2Jsb2Nrcy5oIChiYl9taW5fY2FsbHMpOiBDaGFuZ2UgdG8gdW5zaWduZWQgbG9uZy4KLQkqIGNhbGxfZ3JhcGguaCAoY2dfdGFsbHkpOiBDaGFuZ2UgY291bnQgcGFyYW1ldGVyIHRvIHVuc2lnbmVkCi0JbG9uZy4KLQkqIGNnX2FyY3MuaCAoQXJjKTogQ2hhbmdlIGNvdW50IGZpZWxkIHRvIHVuc2lnbmVkIGxvbmcuCi0JKGFyY19hZGQpOiBDaGFuZ2UgY291bnQgcGFyYW1ldGVyIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBzb3VyY2UuaCAoU291cmNlX0ZpbGUpOiBDaGFuZ2UgbmNhbGxzIGZpZWxkIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBzeW10YWIuaCAoU3ltKTogQ2hhbmdlIGZpZWxkcyBuY2FsbHMsIGJiX2NhbGxzLCBhbmQKLQljZy5zZWxmX2NhbGxzIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBNYW55IGZpbGVzOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IHRvb2xzLgotCi1GcmkgSnVsIDEwIDE3OjI5OjQ5IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQlNENDRfRk9STUFUKTogRGVmaW5lIGZvciBjeWd3aW4zMiwgd2luMzIsIG1pbmd3MzIKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEp1biAxMiAxMzo0MDowNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotU3VuIE1heSAxMCAyMjozNTozMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVR1ZSBNYXkgIDUgMTg6Mjg6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBncHJvZi5oIChfKTogVW5kZWZpbmUgQkZEJ3MgdmVyc2lvbi4KLQotVHVlIEFwciAyOCAxOToxNzozMyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogZ3Byb2YuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1UdWUgQXByIDI4IDE5OjUwOjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29yZWZpbGUuYzogUmVuYW1lIGZyb20gY29yZS5jLgotCSogY29yZWZpbGUuaDogUmVuYW1lIGZyb20gY29yZS5oLgotCSogTWFueSAuYyBmaWxlczogSW5jbHVkZSBjb3JlZmlsZS5oIHJhdGhlciB0aGFuIGNvcmUuaC4KLQkqIE1ha2VmaWxlLmFtIChzb3VyY2VzKTogQ2hhbmdlIGNvcmUuYyB0byBjb3JlZmlsZS5jLgotCShub2luc3RfSEVBREVSUyk6IENoYW5nZSBjb3JlLmggdG8gY29yZWZpbGUuaC4KLQkoJChPQkpFQ1RTKSk6IERlcGVuZCB1cG9uIGNvcmVmaWxlLmggcmF0aGVyIHRoYW4gY29yZS5oLgotCShjb3JlZmlsZS5vKTogUmVuYW1lIHRhcmdldCBmcm9tIGNvcmUubywgZGVwZW5kIHVwb24gY29yZWZpbGUuYy4KLQkqIE1ha2VmaWxlLmluLCBwby9QT1RGSUxFUy5pbjogUmVidWlsZC4KLQotTW9uIEFwciAyNyAxNjo1MDo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOS40Ci0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBcHIgMjIgMTY6MDE6MTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChNS0lOU1RBTExESVJTKTogRG9uJ3QgbG9vayBpbiAkKHRvcF9zcmNkaXIpLgotCi1XZWQgQXByIDIyIDAwOjAwOjIyIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmg6IEFkZGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzIGZvciBnZXR0ZXh0LgotCSogY29uZmlndXJlLmluIChBTExfTElOR1VBUyk6IE5ldyBtYWNyby4KLQlDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZCBwby9NYWtlZmlsZS4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogZ3Byb2YuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgdGV4dGRvbWFpbi4KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogTmV3IG1hY3JvLgotCShJTkNMVURFUyk6IExvb2sgaW4gaW50bCBkaXJzIGZvciBoZWFkZXJzLiAgRGVmaW5lIExPQ0FMRURJUi4KLQkoZ3Byb2ZfREVQRU5ERU5DSUVTKTogQWRkZWQgSU5UTERFUFMuCi0JKGdwcm9mX0xEQUREKTogQWRkZWQgSU5UTExMSUJTLgotCShQT1RGSUxFUyk6IE5ldyBtYWNyby4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCSogTWFueSBmaWxlczogV3JhcCB1c2VyLXZpc2libGUgc3RyaW5ncyB3aXRoIGdldHRleHQgaW52b2NhdGlvbi4KLQotVHVlIEFwciAgNyAxMjo0MzozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIGhqbEBsdWNvbi5vcmcgPEguSi4gTHU+OgotCSogTWFrZWZpbGUuYW0gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIE1hciAzMCAxMjo0Nzo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotU2F0IE1hciAyOCAyMzowOTowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBjZ19hcmNzLmMgKG51bV9jeWNsZXMpOiBDaGFuZ2UgdG8gdW5zaWduZWQgaW50LgotCShudW1hcmNzKTogTGlrZXdpc2UuCi0JKGFyY19hZGQpOiBDaGFuZ2UgbWF4YXJjcyB0byB1bnNpZ25lZCBpbnQuCi0JKGNnX2Fzc2VtYmxlKTogQ2hhbmdlIGluZGV4IHRvIHVuc2lnbmVkIGludC4KLQkqIGNnX2FyY3MuaCAobnVtX2N5Y2xlcywgbnVtYXJjcyk6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKiBjZ19wcmludC5jIChjZ19wcmludCk6IENoYW5nZSBpbmRleCB0byB1bnNpZ25lZCBpbnQuCi0JKGNnX3ByaW50X2luZGV4KTogQ2hhbmdlIGluZGV4LCBubmFtZXMsIHRvZG8sIGksIGFuZCBqIHRvIHVuc2lnbmVkCi0JaW50LgotCShjZ19wcmludF9maWxlX29yZGVyaW5nKTogQ2hhbmdlIHN5bWJvbF9jb3VudCBhbmQgaW5kZXgyIHRvCi0JdW5zaWduZWQgaW50LgotCSogY29yZS5jIChzeW1ib2xfbWFwX2NvdW50KTogQ2hhbmdlIHRvIHVuc2lnbmVkIGludC4KLQkoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IENoYW5nZSBqIHRvIHVuc2lnbmVkIGludC4KLQkoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkqIGhpc3QuYyAoaGlzdF9hc3NpZ25fc2FtcGxlcyk6IENoYW5nZSBqIHRvIHVuc2lnbmVkIGludC4KLQkoaGlzdF9wcmludCk6IENoYW5nZSBpbmRleCB0byB1bnNpZ25lZCBpIG50LiAgQWRkIGNhc3QgdG8gYXZvaWQKLQl3YXJuaW5nLgotCSogc3ltX2lkcy5jIChwYXJzZV9zcGVjKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmcuCi0JKiBzeW10YWIuYyAoc3ltdGFiX2ZpbmFsaXplKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgotCShzeW1fbG9va3VwKTogVXBkYXRlIHByaW50ZiBmb3JtYXQgc3RyaW5ncy4KLQkqIHN5bXRhYi5oIChTeW1fVGFibGUpOiBDaGFuZ2UgbGVuIHRvIHVuc2lnbmVkIGludC4KLQkqIHRhaG9lLmMgKHRhaG9lX3JlbGFkZHIpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLVR1ZSBNYXIgMjQgMTk6MDA6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIC0tZGVtYW5nbGUgYW5kIC0tbm8tZGVtYW5nbGUgb3B0aW9uczoKLQkqIGdwcm9mLmggKGRlbWFuZ2xlKTogRGVjbGFyZS4KLQkqIGdwcm9mLmMgKGRlbWFuZ2xlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoT1BUSU9OX0RFTUFOR0xFLCBPUFRJT05fTk9fREVNQU5HTEUpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZGVtYW5nbGUiIGFuZCAibm8tZGVtYW5nbGUiLgotCSh1c2FnZSk6IE1lbnRpb24gLS1kZW1hbmdsZSBhbmQgLS1uby1kZW1hbmdsZS4KLQkobWFpbik6IEhhbmRsZSBPUFRJT05fREVNQU5HTEUgYW5kIE9QVElPTl9OT19ERU1BTkdMRS4KLQkqIHV0aWxzLmMgKHByaW50X25hbWVfb25seSk6IE9ubHkgZGVtYW5nbGUgc3ltYm9sIG5hbWUgaWYgZGVtYW5nbGUKLQlpcyB0cnVlLgotCSogZ3Byb2YudGV4aSAoT3V0cHV0IE9wdGlvbnMpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotRnJpIE1hciAyMCAxOToyMTo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UaHUgRmViIDEyIDE0OjM2OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAodXNhZ2UpOiBVcGRhdGUgYnVnLWdudS11dGlscyBhZGRyZXNzLgotCi1TYXQgRmViICA3IDE1OjQzOjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBGZWIgIDYgMTI6MDI6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5jIChhbHBoYV9JbnN0cnVjdGlvbik6IFVzZSBpbnQsIG5vdCBzaWduZWQuCi0KLUZyaSBGZWIgIDYgMDI6MDA6MTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb3JlLmMgKGNvcmVfaW5pdCk6IEFkZGluZyBtaXNzaW5nICJicmVhayIuCi0KLVRodSBGZWIgIDUgMTI6NDk6MzcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVR1ZSBGZWIgIDMgMTQ6MjU6MjUgMTk5OCAgQnJlbnQgQmFjY2FsYSAgPGJhY2NhbGFAZnJlZXNvZnQub3JnPgotCi0JKiBiYmNvbnYucGw6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgYmJjb252LnBsLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGdwcm9mLnRleGk6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gZG9jdW1lbnQgYWxsIGFyZ3VtZW50cyBhbmQKLQlvdXRwdXQgZm9ybWF0cy4KLQotCSogc3ltdGFiLmMgKHN5bXRhYl9maW5hbGl6ZSk6IFByZWZlciBmdW5jdGlvbiBzeW1ib2xzIG92ZXIgbGluZQotCXN5bWJvbHMuCi0JKGRiZ19zeW1fbG9va3VwKTogQ29ycmVjdCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiAtLXN1bSBpbXBsaWVzIC0tbGluZS4KLQotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnQpOiBXaGVuIGRvaW5nIGxpbmUgYnkgbGluZSBwcm9maWxpbmcsIGRvbid0Ci0JdXNlIGEgbm9uLWZ1bmN0aW9uIGFzIGEgbWFpbiBsaXN0aW5nIGl0ZW0uCi0KLQkqIGNhbGxfZ3JhcGguYyAoY2dfdGFsbHkpOiBXaGVuIHVzaW5nIGxpbmUgYnkgbGluZSBwcm9maWxpbmcsIHVzZQotIAl0aGUgZnVuY3Rpb24gc3ltYm9sIGFzIHRoZSBjaGlsZC4KLQotCSogc3ltdGFiLmggKE5CQlMpOiBEZWZpbmUuCi0JKFN5bSk6IEFkZCBiYl9hZGRyIGFuZCBiYl9jYWxscyBmaWVsZHMuCi0JKiBiYXNpY19ibG9ja3MuYyAoYmJfcmVhZF9yZWMpOiBTYXZlIG11bHRpcGxlIGJhc2ljIGJsb2NrcyBwZXIKLQlzeW1ib2wuCi0JKGJiX3dyaXRlX2Jsb2Nrcyk6IEFkanVzdCBmb3IgbXVsdGlwbGUgYmFzaWMgYmxvY2tzIHBlciBzeW1ib2wuCi0JKHByaW50X2V4ZWNfY291bnRzKTogRG9uJ3QgY2hlY2sgd2hldGhlciBhIHN5bWJvbCBpcyB0aGUgc3RhcnQgb2YKLQlhIGJhc2ljIGJsb2NrLiAgUHJpbnQgYWxsIGJhc2ljIGJsb2NrcyBmb3IgYSBzeW1ib2wuCi0JKGFubm90YXRlX3dpdGhfY291bnQpOiBSZXdyaXRlIHRvIHByaW50IGFsbCBiYXNpYyBibG9jayBjb3VudHMgYW5kCi0JdG8gcGF5IGF0dGVudGlvbiB0byB3aWR0aCBhcmd1bWVudC4KLQkocHJpbnRfYW5ub3RhdGVkX3NvdXJjZSk6IERvbid0IGNoZWNrIHdoZXRoZXIgc3ltYm9sIGlzIHRoZSBzdGFydAotCW9mIGEgYmFzaWMgYmxvY2suCi0KLQlNYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIGEgY3Jvc3MgZ3Byb2YsIGFsdGhvdWdoIGEgZmV3IGNhc2VzIGFyZQotCXN0aWxsIG5vdCBoYW5kbGVkOgotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgTVlfVEFSR0VULgotCSogZ3Byb2YuaDogRG9uJ3QgaW5jbHVkZSBNQUNISU5FX0guICBEb24ndCBkZWZpbmUgRk9QRU5fUkIgb3IKLQlGT1BFTl9XQjsganVzdCBnZXQgdGhlbSBmcm9tIHN5c2RlcC5oLgotCSogY29yZS5oIChtaW5faW5zbl9zaXplLCBvZmZzZXRfdG9fY29kZSk6IERlY2xhcmUuCi0JKiBjb3JlLmMgKE1JTl9JTlNOX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKG1pbl9pbnNuX3NpemUsIG9mZnNldF90b19jb2RlKTogTmV3IHZhcmlhYmxlcy4KLQkoY29yZV9pbml0KTogSW5pdGlhbGl6ZSBtaW5faW5zbl9zaXplIGFuZCBvZmZzZXRfdG9fY29kZS4KLQkoZmluZF9jYWxsKTogTmV3IGZ1bmN0aW9uLgotCShjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBEb24ndCB1c2UgbWluX2Rpc3QuICBTZXQgaXNfc3RhdGljIGluCi0JcGFzcyAyLgotCSogaGlzdC5jIChVTklUU19UT19DT0RFKTogRGVmaW5lLgotCSogZ3Byb2YuYyAoZGVmYXVsdF9leGNsdWRlZF9saXN0KTogQWRkICJfX21jb3VudF9pbnRlcm5hbCIuCi0JKiBnbW9uLmg6IENoYW5nZSBUQVJHRVRfYWxwaGEgdG8gX19hbHBoYV9fLgotCSogaGVydHouaDogSWZkZWYgTUFDSCwgZGVmaW5lIGhlcnR6IGFzIEhaLgotCSogYWxwaGEuYyAoYWxwaGFfSW5zdHJ1Y3Rpb24pOiBSZW5hbWUgZnJvbSBJbnN0cnVjdGlvbi4gIENoYW5nZQotCWFsbCByZWZlcmVuY2VzLgotCShhbHBoYV9maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuCi0JKiBhbHBoYS5oOiBSZW1vdmUuCi0JKiBkdW1teS5jLCBkdW1teS5oOiBSZW1vdmUuCi0JKiBpMzg2LmMgKGkzODZfaXNjYWxsKTogUmVuYW1lIGZyb20gaXNjYWxsLiAgQ2hhbmdlIGFsbAotCXJlZmVyZW5jZXMuICBDaGVjayBmb3IgY2FsbCBpbnN0cnVjdGlvbiwgbm90IGp1bXAgb3IgbGNhbGwuCi0JKGkzODZfZmluZF9jYWxsKTogUmVuYW1lIGZyb20gZmluZF9jYWxsLiAgQ29ycmVjdCBmb3IgVk1BLgotCUNvcnJlY3QgY2FsbCBkZXN0aW5hdGlvbiBjb21wdXRhdGlvbi4gIERvbid0IGRlcmVmZXJlbmNlIHN5bWJvbCBpZgotCWl0IGlzIE5VTEwuCi0JKiBpMzg2Lmg6IFJlbW92ZS4KLQkqIG5zNTMyLmMsIG5zNTMyLmg6IFJlbW92ZS4KLQkqIHNwYXJjLmMgKENBTEwpOiBEZWZpbmUuCi0JKHNwYXJjX2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4KLQkqIHNwYXJjLmg6IFJlbW92ZS4KLQkqIHRhaG9lLmM6IEluY2x1ZGUgY2dfYXJjcy5oLCBjb3JlLmgsIGhpc3QuaCwgYW5kIHN5bXRhYi5oLiAgRG9uJ3QKLQlpbmNsdWRlIHRpbWVfaG9zdC5oLgotCShDQUxMRiwgUEMpOiBEZWZpbmUuCi0JKGVudW0gdGFob2Vfb3Blcm1vZGVzLCB0YWhvZV9vcGVyYW5kZW51bSk6IERlZmluZS4gIFJlbmFtZSBhbGwKLQlyZWZlcmVuY2VzIHRvIG9wZXJtb2RlcyBvciBvcGVyYW5kZW51bSB0byB0aGVzZS4KLQkodGFob2Vfb3BlcmFuZG1vZGUpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbW9kZS4gIENhbGwgYWJvcnQgaWYKLQlzd2l0Y2ggZG9lcyBub3QgcmV0dXJuLgotCSh0YWhvZV9vcGVyYW5kbmFtZSk6IFJlbmFtZSBmcm9tIG9wZXJhbmRuYW1lLiAgQ2FsbCBhYm9ydCBpZgotCXN3aXRjaCBkb2VzIG5vdCByZXR1cm4uCi0JKHRhaG9lX29wZXJhbmRsZW5ndGgpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbGVuZ3RoLiAgQ2FsbCBhYm9ydCBpZgotCXN3aXRjaCBkb2VzIG5vdCByZXR1cm4uCi0JKHRhaG9lX3JlbGFkZHIpOiBSZW5hbWUgZnJvbSByZWxhZGRyLgotCSh0YWhvZV9maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuICBVc2UgY29yZV90ZXh0X3NwYWNlCi0JcmF0aGVyIHRoYW4gdGV4dHNwYWNlLgotCSogdGFob2UuaDogUmVtb3ZlLgotCSogdmF4LmMgKENBTExTLCBQQyk6IERlZmluZS4KLQkoZW51bSBvcGVybW9kZXMsIG9wZXJhbmRlbnVtLCBzdHJ1Y3QgbW9kZWJ5dGUpOiBEZWZpbmUuCi0JKHZheF9vcGVyYW5kbW9kZSk6IFJlbmFtZSBmcm9tIG9wZXJhbmRtb2RlLiAgQ2FsbCBhYm9ydCBpZiBzd2l0Y2gKLQlkb2VzIG5vdCByZXR1cm4uCi0JKHZheF9vcGVyYW5kbmFtZSk6IFJlbmFtZSBmcm9tIG9wZXJhbmRuYW1lLiAgQ2FsbCBhYm9ydCBpZiBzd2l0Y2gKLQlkb2VzIG5vdCByZXR1cm4uCi0JKHZheF9vcGVyYW5kbGVuZ3RoKTogUmVuYW1lIGZyb20gb3BlcmFuZGxlbmd0aC4gIENhbGwgYWJvcnQgaWYKLQlzd2l0Y2ggZG9lcyBub3QgcmV0dXJuLgotCSh2YXhfcmVsYWRkcik6IFJlbmFtZSBmcm9tIHJlbGFkZHIuCi0JKHZheF9maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuCi0JKiB2YXguaDogUmVtb3ZlLgotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBTZXQgdG8gY3lnbnVzLgotCShNWV9UQVJHRVQpOiBSZW1vdmUuCi0JKElOQ0xVREVTKTogUmVtb3ZlIC1EVEFSR0VUXyQoTVlfVEFSR0VUKSBhbmQgLURNQUNISU5FX0g9Ci0JXCIkKE1ZX1RBUkdFVCkuaFwiLgotCShncHJvZl9TT1VSQ0VTKTogQWRkIGkzODYuYywgYWxwaGEuYywgdmF4LmMsIHRhaG9lLmMsIHNwYXJjLmMuCi0JKGdwcm9mX0RFUEVOREVOQ0lFUyk6IFJlbW92ZSAkKE1ZX1RBUkdFVCkuby4KLQkoZ3Byb2ZfTERBREQpOiBMaWtld2lzZS4KLQkobm9pbnN0X0hFQURFUlMpOiBSZW1vdmUgYWxwaGEuaCwgaTM4Ni5oLCBuczUzMi5oLCBzcGFyYy5oLAotCXRhaG9lLmgsIHZheC5oLCBkdW1teS5oLgotCShFWFRSQV9ESVNUKTogUmVtb3ZlIGFscGhhLmMsIGkzODYuYywgbnM1MzIuYywgc3BhcmMuYywgdGFob2UuYywKLQl2YXguYywgZHVtbXkuYy4KLQkoJChPQkpFQ1RTKSk6IERvbid0IGRlcGVuZCB1cG9uICQoTVlfVEFSR0VUKS5oLgotCSgkKE1ZX1RBUkdFVCkubyk6IFJlbW92ZSB0YXJnZXQuCi0JKGkzODYubywgYWxwaGEubywgdmF4Lm8sIHRhaG9lLm8sIHNwYXJjLm8pOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0KLU1vbiBEZWMgMjkgMTQ6MTc6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmMgKGNvcmVfc3ltX2NsYXNzKTogVHJlYXQgd2VhayBzeW1ib2xzIGFzIHRleHQgc3ltYm9scy4KLQlGcm9tIERlYW4gR2F1ZGV0IDxkZ2F1ZGV0QGFyY3RpYy5vcmc+LgotCi1XZWQgU2VwIDI0IDExOjM1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBjdXJyZW50IGF1dG9tYWtlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgQXVnICA5IDE2OjI1OjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi44LjIuICBDYWxsCi0JQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlIHNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieQotCWxpYnRvb2wuICBBZGQgQU1fQ09ORklHX0hFQURFUi4gIENoYW5nZSBBQ19QUk9HX0lOU1RBTEwgdG8KLQlBTV9QUk9HX0lOU1RBTEwuICBBZGQgQU1fRVhFRVhULgotCSogTWFrZWZpbGUuYW0gKExJTkspOiBSZW1vdmUuCi0JKGdwcm9mX0xERkxBR1MpOiBSZW1vdmUKLQkoZ3Byb2ZfREVQRU5ERU5DSUVTKTogQ2hhbmdlIGxpYmJmZC5hIHRvIGxpYmJmZC5sYS4KLQkoZ3Byb2ZfTERBREQpOiBMaWtld2lzZS4KLQkoJChPQkpFQ1RTKSk6IERlcGVuZCB1cG9uIGdjb25maWcuaCBhbmQgLi4vYmZkL2NvbmZpZy5oLgotCSogZ3Byb2YuaDogVW5kZWZpbmUgUEFDS0FHRSBhbmQgVkVSU0lPTiBhZnRlciBpbmNsdWRpbmcgQkZECi0Jc3lzZGVwLmggZmlsZSwgdGhlbiBpbmNsdWRlIG5ldyBnY29uZmlnLmggZmlsZS4KLQkqIGdwcm9mLmMgKFZFUlNJT04pOiBEb24ndCBkZWZpbmUuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogZ2NvbmZpZy5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYXV0b2hlYWRlci4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0KLVNhdCBKdW4gMjggMjM6MjA6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yLgotCi1Nb24gSnVuIDE2IDE1OjMxOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogQWRkIC1EREVCVUcuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEFwciAxNSAxNDoxOTozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlDaGFuZ2UgdG8gdXNlIGF1dG9tYWtlOgotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBSdW4gQU1fSU5JVF9BVVRPTUFLRSwgQU1fTUFJTlRBSU5FUl9NT0RFLCBhbmQKLQlBTV9DWUdXSU4zMi4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLCBjcmVhdGVkIGJ5IGFjbG9jYWwuCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSB3aXRoIGZpbGUgY3JlYXRlZCBieSBhdXRvbWFrZSAtLWN5Z251cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEFwciAgMyAxMzoyMToyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKFZFUlNJT04pOiBEZWZpbmUgYXMgIjIuOC4xIi4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1UaHUgTWFyIDI3IDE3OjE1OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAobWFpbik6IENvcnJlY3QgY29weXJpZ2h0IG1lc3NhZ2UuCi0KLU1vbiBNYXIgMjQgMTE6MTI6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IERlZmluZSBUQVJHRVRfJChNWV9UQVJHRVQpIHdoZW4gY29tcGlsaW5nLgotICAJKiBnbW9uLmg6IFVzZSBieXRlcyBjb3VudHMgcmF0aGVyIHRoYW4gc2l6ZW9mIGluIHN0cnVjdCByYXdfcGhkcgotIAlhbmQgc3RydWN0IHJhd19hcmMuCi0KLU1vbiBNYXIgMTcgMTA6NTQ6NDcgMTk5NyAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY2dfYXJjcy5jIChhcmNfYWRkKTogbWVtc2V0KCkgbmV3bHkgYWxsb2NlZCBhcmMgdG8gZW5zdXJlCi0JYWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCAwLgotCi1TYXQgTWFyIDE1IDE5OjE3OjMxIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBzeW10YWIuaCAoZmluZF9jYWxsKTogRGVjbGFyZS4KLQkqIGNnX2FyY3MuYyAoY2dfYXNzZW1ibGUpOiBEb24ndCBkZWNsYXJlIGZpbmRfY2FsbC4KLQkqIGhpc3QuYyAoc2NhbGVfYW5kX2FsaWduX2VudHJpZXMpOiBEZWNsYXJlLgotCi1UaHUgRmViIDI3IDEyOjQ2OjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgQlNENDRfRk9STUFUIGlmIHRoZSB0YXJnZXQgbG9va3MgbGlrZSBhCi0JQlNENC40IGRlcml2ZWQgc3lzdGVtLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBBZGQgQERFRlNALgotCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogSW4gQlNENDRfRk9STUFUIGNvZGUsIGdldCBwcm9mcmF0ZQotCWZyb20gcHJvZnJhdGUgZmllbGQsIG5vdCB2ZXJzaW9uIGZpZWxkLgotCi1UaHUgSmFuIDE2IDE3OjQyOjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZHVtbXkuYyAoZmluZF9jYWxsKTogQ2xlYXIgaWdub3JlX2RpcmVjdF9jYWxscy4KLQotVHVlIERlYyAzMSAxNTo0NDoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguYy5vKTogQWRkIC1EX0dOVV9TT1VSQ0UuICBQdXQgJChDRkxBR1MpIGF0IHRoZQotCWVuZC4KLQkoZ3Byb2YpOiBQdXQgJChDRkxBR1MpIGFmdGVyIHRoZSBvdGhlciBvcHRpb25zLgotCi1UdWUgTm92IDI2IDE3OjA4OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotV2VkIE9jdCAgMiAxNToyMzoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmMgKGZpbmRfY2FsbCk6IEFsaWduIHBfbG93cGMgdG8gYXZvaWQgYnVzIGVycm9yLgotCi1UdWUgT2N0ICAxIDE1OjU4OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDaGFuZ2UgdmVyc2lvbiBwcmludGluZyB0byBtYXRjaCBjdXJyZW50IEdOVSBzdGFuZGFyZHMuCi0KLUZyaSBBdWcgMzAgMTI6MTY6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnbW9uLmg6IFJlcGxhY2UgI2VsaWYgd2l0aCAjZWxzZS8jZW5kaWYuCi0KLVRodSBBdWcgMjkgMTc6MDQ6MTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEF1ZyAyMiAxNzoxMjozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuCi0JKGdwcm9mKTogVXNlICQoSExERU5WKS4KLQotV2VkIEF1ZyAgNyAxNDo0Mzo1MSAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb3JlLmMgKHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MpOiBDYXN0IHhtYWxsb2MgcmV0dXJuLgotCi1UaHUgSnVsICA0IDEyOjAxOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAoVkVSU0lPTik6IERlZmluZSBhcyAiMi43LjEiLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLQkqIGJiX2V4aXRfZnVuYy5jOiBSZW5hbWUgZnJvbSBfX2JiX2V4aXRfZnVuYy5jLCBzbyB0aGF0IGl0IGNhbiBiZQotCXN0b3JlZCBvbiBhIFN5c3RlbSBWIGZpbGUgc3lzdGVtLgotCi1UaHUgSnVuIDI3IDExOjM2OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0lTQ19QT1NJWC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChncHJvZik6IFBhc3MgJChDRkxBR1MpIGR1cmluZyBsaW5rLgotCSogaGVydHouYzogRG9uJ3QgaW5jbHVkZSA8c3lzL3RpbWUuaD47IGxldCBzeXNkZXAuaCBoYW5kbGUgdGhhdC4KLQlJZiBIQVZFX1NFVElUSU1FUiBpcyBub3QgZGVmaW5lZCwgdHJ5IHVzaW5nIHN5c2NvbmYuCi0KLU1vbiBKdW4gMjQgMTg6Mjc6MjggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGV4ZWNfcHJlZml4LCBiaW5kaXIsIGxpYmRpciwgbWFuZGlyLCBpbmZvZGlyLCBkYXRhZGlyLAotCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0JKEFDX1BST0dfSU5TVEFMTCk6IGFkZGVkLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gSnVuIDI0IDEyOjAzOjA5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBPbiBhbHBoYSotKi1vc2YqLCBsaW5rIGFnYWluc3QgbGliYmZkLmEgaWYgbm90Ci0JdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0KLVR1ZSBKdW4gMTggMTc6MzU6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkqIHNvdXJjZS5jIChzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCk6IExpa2V3aXNlLgotCi1Nb24gQXByICA4IDE0OjQ0OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBNYXIgMjEgMTc6MTg6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBNb3ZlIGZpbGVuYW1lIGFuZCBmdW5jX25hbWUKLQlpbnNpZGUgaWZkZWYgd2hlcmUgdGhleSBhcmUgdXNlZC4KLQotCSogY29yZS5jIChjb3JlX3N5bV9jbGFzcyk6IFBhcmVudGhlc2l6ZSAmJiB3aXRoaW4gfHwuCi0JKiBzeW10YWIuYyAoc3ltdGFiX2ZpbmFsaXplKTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uLgotCi0JKiBjZ19wcmludC5oIChjZ19wcmludF9maWxlX29yZGVyaW5nKTogRGVjbGFyZS4KLQkoY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcpOiBEZWNsYXJlLgotCi0JKiBfX2JiX2V4aXRfZnVuYy5jIChfX2JiX2V4aXRfZnVuYyk6IFJlcGxhY2UgYmNvcHkgd2l0aCBtZW1jcHkuCi0JKiBjZ19hcmNzLmMgKGFyY19hZGQpOiBMaWtld2lzZS4KLQkqIGNnX3ByaW50LmMgKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjEgMTc6MDI6MDIgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZ3Byb2YuYyAoZGVmYXVsdF9leGNsdWRlZF9saXN0KTogQWRkICJfX21jb3VudCIuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiBDaGFuZ2UgaWZkZWYgX19vc2ZfXyB0byBfX2FscGhhX18uCi0KLQkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IElmIEJTRDQ0X0ZPUk1BVCBpcyBkZWZpbmVkLCBnZXQgdGhlCi0JcHJvZmlsaW5nIHJhdGUgZnJvbSB0aGUgaGVhZGVyLgotCi0JKiBnbW9uLmggKHN0cnVjdCByYXdfcGhkcik6IE9ubHkgaW5jbHVkZSBwYWQgaWYgYm90aCBfX2FscGhhX18gYW5kCi0JX19vc2ZfXyBhcmUgZGVmaW5lZC4gIEFkZCBuZXcgZmllbGRzIGlmIEJTRDQ0X0ZPUk1BVCBpcyBkZWZpbmVkLgotCi0JKiBhbHBoYS5oIChNSU5fSU5TTl9TSVpFKTogRGVmaW5lLgotCSogY29yZS5jIChNSU5fSU5TTl9TSVpFKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgotCShjb3JlX3N5bV9jbGFzcyk6IElnbm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4KLQkoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogVXNlIE1JTl9JTlNOX1NJWkUgd2hlbiBnYXRoZXJpbmcgbGluZQotCWluZm9ybWF0aW9uLgotCi1XZWQgTWFyIDIwIDE4OjE1OjQ3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjZ19wcmludC5jIChjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyk6IEZpeCBfX0dOVUNfXyBtaXNzcGVsbGVkCi0JYXMgX19HTlVfQ19fLgotCShvcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyk6IExpa2V3aXNlLgotCi1UdWUgTWFyIDEyIDEyOjE5OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi1TdW4gRmViIDE4IDE1OjA2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLSAJdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBGZWIgMTMgMTU6MzI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBGZWIgIDcgMTQ6MDM6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBDQy4gIExvb2sgZm9yIC0tZW5hYmxlLXNoYXJlZC4gIFNldAotCUJGRExJQiBhbmQgSExERkxBR1MgYW5kIHN1YnN0aXR1dGUgdGhlbS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChMSUJTKTogVXNlIEBCRkRMSUJALgotCShITERGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoZ3Byb2YpOiBVc2UgJChITERGTEFHUykuCi0KLU1vbiBGZWIgIDUgMTY6MzQ6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYmZkIGFuZCBvcGNvZGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMsIGJhc2VkIG9uCi0JcGF0Y2hlcyBmcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIE1ha2VmaWxlLmluIChMSUJERVBTKTogTmV3IHZhcmlhYmxlLgotCShMSUJTKTogVXNlIC1MLi4vYmZkIC1sYmZkLgotCShncHJvZik6IERlcGVuZCB1cG9uICQoTElCREVQUykgcmF0aGVyIHRoYW4gJChMSUJTKS4KLQotU2F0IERlYyAzMCAxMDoxMTowMyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKGxvbmdfb3B0aW9ucyk6IEFkZCAiLS1mdW5jdGlvbi1vcmRlcmluZyIgYW5kCi0JIi0tZmlsZS1vcmRlcmluZyIgb3B0aW9ucy4KLQkodXNhZ2UpOiBBZGQgbmV3IG9wdGlvbnMgdG8gdXNhZ2UgbWVzc2FnZS4KLQkobWFpbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQkqIGdwcm9mLmggKFNUWUxFX0ZVTkNUSU9OX09SREVSKTogRGVmaW5lLgotCShTVFlMRV9GSUxFX09SREVSKTogRGVmaW5lLgotCShmdW5jdGlvbl9tYXBwaW5nX2ZpbGUpOiBEZWNsYXJlLgotCSogY2dfYXJjcy5jIChhcmNzLCBudW1hcmNzKTogTmV3IGdsb2JhbHMuCi0JKGFyY19hZGQpOiBQdXQgbmV3IGFyY3MgaW50byB0aGUgYXJjIGFycmF5IHNvIHRoZSBmdW5jdGlvbi9maWxlCi0Jb3JkZXJpbmcgY29kZSBjYW4gZXhhbWluZSB0aGVtLgotCSogY2dfYXJjcy5oIChzdHJ1Y3QgYXJjKTogTmV3IGZpZWxkICJoYXNfYmVlbl9wbGFjZWQiLgotCShhcmNzLCBudW1hcmNzKTogRGVjbGFyZSBuZXcgZ2xvYmFscy4KLQkqIGNvcmUuYyAoc3ltYm9sX21hcCwgc3ltYm9sX21hcF9jb3VudCk6IE5ldyBnbG9iYWxzLgotCShyZWFkX2Z1bmN0aW9uX21hcHBpbmdzKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgaW4gYSBmdW5jdGlvbgotCXRvIG9iamVjdCBtYXAgZmlsZS4KLQkoY29yZV9pbml0KTogQ2FsbCByZWFkX2Z1bmN0aW9uX21hcHBpbmdzIGlmIGEgZnVuY3Rpb24gbWFwcGluZwotCWZpbGUgZXhpc3RzLgotCShjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogSGFuZGxlIGZ1bmN0aW9uIHRvIG9iamVjdCBmaWxlCi0JbWFwcGluZ3MuCi0JKiBzeW10YWIuaCAoc3RydWN0IHN5bSk6IE5ldyBmaWVsZHMgIm1hcHBlZCIsICJoYXNfYmVlbl9wbGFjZWQiLAotCSJudXNlcyIsICJwcmV2Ii4KLQkqIGNnX3ByaW50LmMgKGNtcF9hcmNfY291bnQpOiBOZXcgZnVuY3Rpb24gZm9yIHNvcnRpbmcgYXJjcy4KLQkoY21wX2Z1bl9udXNlcyk6IExpa2V3aXNlIGZvciBmdW5jdGlvbnMuCi0JKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKTogTmV3IGZ1bmN0aW9uIHRvIHByaW50IGEgc3VnZ2VzdGVkCi0JZnVuY3Rpb24gb3JkZXJpbmcuCi0JKGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcpOiBMaWtld2lzZSBmb3Igb3JkZXJpbmcgLm8gZmlsZXMuCi0JKG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzKTogSGVscGVyIGZ1bmN0aW9uIGZvciBmdW5jdGlvbgotCWFuZCBvYmplY3QgZmlsZSBvcmRlcmluZyBjb2RlLgotCi1TdW4gRGVjIDI0IDIxOjMyOjI3IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29yZS5jIChjb3JlX3N5bV9jbGFzcyk6IElnbm9yZSBzeW1ib2xzIHdpdGhvdXQgQlNGX0ZVTkNUSU9OCi0Jc2V0IGlmIGlnbm9yZV9ub25fZnVuY3Rpb24gaXMgc2V0LgotCSogZ3Byb2YuaCAoaWdub3JlX25vbl9mdW5jdGlvbnMpOiBEZWNsYXJlLgotCSogZ3Byb2YuYyAoaWdub3JlX25vbl9mdW5jdGlvbnMpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiaWdub3JlLW5vbi1mdW5jdGlvbnMiLgotCSh1c2FnZSk6IEFkZCBuZXcgb3B0aW9ucy4KLQkobWFpbik6IFJlY29nbml6ZSAiLUQiIGFuZCAiLS1pZ25vcmUtbm9uLWZ1bmN0aW9ucyIgb3B0aW9uLgotCi1UdWUgTm92IDIxIDEzOjI0OjM5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLm0uYyk6IFN0cmlwIG91dCBkaXJlY3RvcnkgbmFtZSBmcm9tIGZ1bmN0aW9uCi0JbmFtZS4KLQotCSogaGlzdC5jIChzY2FsZV9hbmRfYWxpZ25fZW50cmllcyk6IERvbid0IHVzZSBERUZVTl9WT0lELiAgRG8KLQlVTklUU19UT19DT0RFIGFkanVzdG1lbnQgdW5jb25kaXRpb25hbGx5OyBjb21waWxlciBjYW4gb3B0aW1pemUKLQlhd2F5IHplcm8tb2Zmc2V0IGNhc2UuICBSZWZlciB0byBzY2FsZWRfYWRkciwgbm90IGFsaWduZWRfYWRkci4KLQotCSogdmF4LmM6IERvbid0IGluY2x1ZGUgdmF4LmggaGVyZS4KLQotVGh1IE5vdiAxNiAwMzo0MTozNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVZlcnNpb24gMi42IHJlbGVhc2VkLgotCi1XZWQgTm92ICA4IDExOjQwOjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAobWFpbik6IENhc3QgZ2V0ZW52IHJldHVybiB2YWx1ZS4KLQotTW9uIE5vdiAgNiAxNTowNTowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBOZXcgdGFyZ2V0LgotCi1XZWQgTm92ICAxIDEyOjUxOjIxIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogIFJlbmFtZSB0byBHRU5fRklMRVMsIHRvIGF2b2lkIGNvbmZ1c2lvbi4KLQkoYWxsKTogIERlcGVuZCBvbiAkKEdFTl9GSUxFUyksIG5vdCBkaXN0c3R1ZmYgKHdoaWNoIGFsc28gZGVwZW5kcwotCW9uIGluZm8pLgotCi1XZWQgTm92ICAxIDE1OjIzOjE1IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBzeW1faWRzLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCi1XZWQgT2N0IDI1IDEzOjI0OjMxIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIEFsc28gbWFrZSBpbmZvLgotCShtb3N0bHljbGVhbik6ICBEb24ndCByZW1vdmUgZ3Byb2YuaW5mbyouCi0JKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogIEFsc28gcmVtb3ZlICouaW5mbyouCi0KLUZyaSBPY3QgIDYgMTY6MjU6MzIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVjaWVzIGZvciAkKE9CSlMpIG9uIGhlYWRlciBmaWxlcy4KLQotCSogY2dfcHJpbnQuYyAocHJpbnRfY3ljbGUsIHByaW50X21lbWJlcnMsIGNnX3ByaW50X2luZGV4KTogRml4IG5ldwotCXN0eWxlIG91dHB1dCBmb3JtYXQgdG8gbWFrZSBpdCBjb25zaXN0ZW50LgotCSogZHVtbXkuYyAoZmluZF9jYWxsKTogRml4IHR5cG8gaW4gZXJyb3IgbWVzc2FnZS4KLQotV2VkIFNlcCAyMCAxMzoyMTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uCi0KLUZyaSBTZXAgIDggMTQ6Mzg6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgaW4gJCh0b29sZGlyKS4KLQotRnJpIEF1ZyAyNSAxNTozMDowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU5TMzJLIGNoYW5nZXMgZnJvbSBJYW4gRGFsbDoKLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG5zMzJrLCBub3QgbnM1MzIuCi0JKiBuczUzMi5jOiBJbmNsdWRlIHN5bXRhYi5oLgotCShmaW5kX2NhbGwpOiBSZW5hbWVkIGZyb20gZmluZGNhbGwuICBQcmludCBhIG1lc3NhZ2UuCi0JKiBuczUzMi5oOiBSZW1vdmUgZHVtbXkuaCBjb21tZW50cy4KLQotVHVlIEF1ZyAyMiAxMDowMDo0NSAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgImJyb2tlbnNlZCIgaGFjaywgdW5uZWNlc3Nhcnkgbm93Ci0JdGhhdCB3ZSdyZSB1c2luZyBhdXRvY29uZi4KLQotV2VkIEp1bCAxOSAxODo0NjoxMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29yZS5jIChnZXRfc3JjX2luZm8pOiBDYXN0IGFyZyA3IG9mIGJmZF9maW5kX25lYXJlc3RfbGluZQotCXRvIHByb3BlciB0eXBlIG9mICJ1bnNpZ25lZCBpbnQgKiIuCi0KLUZyaSBKdW4gMTYgMTU6Mjk6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgY2hhbmdlcXVvdGUgYXJvdW5kIHVzZSBvZiBbXS4KLQotTW9uIEp1biAxMiAxMjoxNDo1MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUgYW5kCi0JICBjb25maWcubG9nLgotCi1XZWQgTWF5IDE3IDE3OjU2OjUzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogQWRkZWQgY29uZmlnLnN0YXR1cyB0byBkZXBlbmRlbmN5IGxpc3QuCi0JICAoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0JICAoU0hFTEwpOiBOZXcgZGVmaW5pdGlvbi4KLQotVHVlIEFwciAyNSAyMToxMToxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERlcGVuZCBvbiAiYWxsIi4KLQotVGh1IEFwciAyMCAxNzoyOTowNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvIE1ZX01BQ0hJTkUgdG8gTVlfVEFSR0VULAotCXRvIG1hdGNoIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLVdlZCBBcHIgMTkgMTE6MTk6MzcgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBnZW4tYy1wcm9nLmF3azogQ2hhbmdlZCByZWZlcmVuY2UgdG8gIm1ha2UtYy1wcm9nLmF3ayIgaW4KLQkgIGNvbW1lbnQgZW1pdHRlZCBieSB0aGlzIHNjcmlwdCB0byBnZW4tYy1wcm9nLmF3ay4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29udmVydGVkIHRvIHVzZSBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMy4KLQkqIGNvbmZpZy97bXQtYWxwaGEsIG10LWR1bW15LCBtdC1pMzg2LCBtdC1uczUzMiwgbXQtc3BhcmMsCi0JICBtdC10YWhvZSwgbXQtdmF4fTogUmVtb3ZlZC4KLQotTW9uIE1hciAxMyAyMTo0NDoyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBfX2JiX2V4aXRfZnVuYy5jOiBOZXcgZmlsZSwgZnJvbSBEYXZpZCBNb3NiZXJnZXItVGFuZy4KLQotCVRodSBGZWIgIDkgMTY6NTY6MDcgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBBbGwgKi5jOiBNb3JlIGNsZWFudXAgdG93YXJkcyBHTlUgZm9ybWF0LgotCi0JKiBnbW9uX291dC5oIChzdHJ1Y3QgZ21vbl9oaXN0X2hkciwgc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZCk6IAotCXJlcGxhY2VkIHNpemVvZiAoYmZkX3ZtYSkgYnkgc2l6ZSAoY2hhciopIGJlY2F1c2UgS2VuIHRlbGxzIG1lCi0JdGhhdCBiZmRfdm1hIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSBhdCBsZWFzdCBhcyBiaWcgYXMgYSBwb2ludGVyLgotCi0JKEdNT05fUmVjb3JkX3RhZyk6IGFkZGVkIGV4cGxpY2l0IGVudW1lcmF0aW9uIHZhbHVlcyB0byBlbnN1cmUKLQljb21wYXRpYmlsaXR5IGFjcm9zcyBjb21waWxlcnMuCi0KLQkqIGdtb25faW8uYyAoZ2V0X3ZtYSwgcHV0X3ZtYSk6IHJlcGxhY2VkIHNpemVvZihiZmRfdm1hKSBieQotCXNpemVvZihjaGFyKikuCi0KLVR1ZSBGZWIgIDcgMTc6MjQ6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogQWxsICouYyBhbmQgKi5oIGZpbGVzOiBSYW4gImluZGVudCAtZ251Ii4gIENsZWFuZWQgdXAgYSBjb3VwbGUKLQlvZiBjb25zdHJ1Y3RzIEdOVSBpbmRlbnQgY291bGRuJ3QgaGFuZGxlLiAgQmxvY2sgY29tbWVudHMgbm90IHlldAotCXJld3JpdHRlbiBpbiBHTlUgZm9ybWF0LgotCi0JKiBncHJvZi5jIChWRVJTSU9OKTogQ2hhbmdlZCB0byAyLjYsIHRvIGdldCBpbiBzeW5jIGZvciBuZXh0Ci0JYmludXRpbHMgcmVsZWFzZS4KLQotU3VuIEZlYiAgNSAxNjoxOTo0NiAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIHN5bXRhYi5jIChzeW10YWJfZmluYWxpemUpOiBlbnN1cmUgZ2xvYmFscyBzeW1ib2xzIHJlYWxseQotCWFyZSBmYXZvcmVkIG92ZXIgc3RhdGljIG9uZXMtLS1ldmVuIGlmIHRoZWlyIG5hbWUgbG9va3MgbGVzcwotCXByZWZlcmFibGU7IHRoaXMgaXMgaW1wb3J0YW50IGZvciBIUC1VWDsgZm9yIGV4YW1wbGUsIHRoZXJlCi0JaXMgYSBzdGF0aWMgbGFiZWwgTHRleHRfc29tZXRoaW5nIHRoYXQgYWxpYXNlcyB0aGUgZ2xvYmFsCi0Jc3ltYm9sIF9zdGFydAotCi0JKiBoaXN0LmMgKGhpc3RfcHJpbnQpOiBhdXRvLXNjYWxpbmcgaXMgbm93IGluIGVmZmVjdCBmb3IgRlNGLXN0eWxlCi0Jb3V0cHV0IG9ubHk7IGFsc28sIGF1dG8tc2NhbGluZyBpcyBub3cgcGVyZm9ybWVkIGJhc2VkIG9uCi0JcGVyLWNhbGwsIHJhdGhlciB0aGFuIHRvdGFsIGV4ZWN1dGlvbiB0aW1lLCB3aGljaCBpcyB3aGF0IGl0IHdhcwotCW1lYW50IHRvIGJlLgotCi0JKiBncHJvZi5oIChGaWxlX0Zvcm1hdCk6IG5ldyB0eXBlLgotCi0JKiBncHJvZi5jIChWRVJTSU9OKTogdXBwZWQgdG8gMi43LS0tc2VlbXMgdG8gYmUgY29tcGxldGVseSBvdXQgb2YKLQlzeW5jIHdpdGggQ3lnbnVzIHZlcnNpb24gbnVtYmVycyB0aG91Z2guLi4KLQotCShsb25nX29wdGlvbnMpOiByZW5hbWVkIC0tZ21vbi1pbmZvIHRvIC0tZmlsZS1pbmZvLCAtLXdpZHRoIGFkZGVkLAotCXJlbmFtZWQgLS1vbGQtZmlsZS1mb3JtYXQgdG8gLS1maWxlLWZvcm1hdAotCShtYWluKTogZGl0bzsgYWxzbyBhZGRlZCBzdXBwb3J0IHRvIHJlYWQgcHJvZiBmaWxlcywgYnV0IGFzCi0JbW9uX291dF9yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkLCBpdCdzICNpZmRlZidkIG91dCBmb3Igbm93Ci0KLQkodXNhZ2UpOiB1cGRhdGUgdG8gcmVmbGVjdCBuZXcgb3B0aW9ucy4KLQotCSogZ21vbl9pby5jOiByZXBsYWNlZCAib2xkX2ZpbGVfZm9ybWF0IiBieSBtb3JlIGdlbmVyYWwKLSAgICAgICAgImZpbGVfZm9ybWF0IiBvcHRpb24KLQotCSogZ21vbi5oIChzdHJ1Y3QgcmF3X3BoZHIpOiBmaXhlZCBkZWNsYXJhdGlvbiBmb3IgT1NGLzEuCi0KLQkqIGNvcmUuYyAoY29yZV9zeW1fY2xhc3MpOiBhZGRlZCBiYWNrIGNoZWNrIGZvciBfX2dudV9jb21waWxlZCBhbmQKLQlfX19nbnVfY29tcGlsZWQgZm9yIHRoZSBiZW5lZml0IG9mIHN5c3RlbXMgd2l0aG91dAotCWJmZF9maW5kX25lYXJlc3RfbGluZSgpIHN1cHBvcnQKLQotCShnZXRfc3JjX2luZm8pOiBub3cgdGhlIGxpYmJmZCBpcyBmaXhlZCwgaW52b2tlIGJmZF9maW5kX25lYXJlc3RfbGluZSgpCi0Jd2l0aCBzZWN0aW9uLXJlbGF0aXZlIGFkZHJlc3NlcwotCi0JKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBnZXRfc3JjX2luZm8oKSBjYWxscyBhcmUgY3VycmVudGx5Ci0JZW5hYmxlZCBmb3IgT1NGLzEgb25seS4gIEl0IGFwcGVhcnMgdG8gd29yayBhbGxyaWdodCBmb3IgU3VuT1MKLSAgICAgICAgNC4xLnggYXMgd2VsbCwgYnV0IG9uIFNQQVJDcyBpdCBnZXRzIHBhaW5mdWxseSBzbG93IHdpdGggdGhlCi0gICAgICAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgYW91dF8zMl9maW5kX25lYXJlc3RfbGluZSgpOwotICAgICAgICB1bmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHRoYXQgc3RhdGljIGZ1bmN0aW9ucyB3aWxsIG5vdCBoYXZlIHRoZWlyCi0JZmlsZW5hbWUgcHJpbnRlZCBpbiB0aGUgY2FsbC1ncmFwaCBmdW5jdGlvbiBpbmRleDsgbGluZS1sZXZlbAotCXByb2ZpbGluZyBzaG91bGQgc3RpbGwgd29yaywgYnV0IHJlcXVpcmVzIHNvbWUgcGF0aWVuY2UKLQotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnRfaW5kZXgpOiBzYW5pdGlzZWQgcHJpbnRpbmcgb2YgaW5kZXggd2hlbgotCXVzaW5nIEZTRi1zdHlsZSBvdXRwdXQ7IGluIHBhcnRpY3VsYXIsIG91dHB1dCB3aWR0aCBpcyBub3cgY29udHJvbGxlZAotCXZpYSBvcHRpb24gLS13aWR0aCBhbmQgdGhlIGZ1bmN0aW9uIHRyaWVzIGhhcmQgdG8ga2VlcCBjb2x1bW5zCi0JYWxpZ25lZCBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiAob2NjYXNpb25hbCkgbG9uZyBuYW1lcwotCi0JKiBOT1RFUzogYSBmaXJzdCBzaG90IGF0IHVwZGF0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgotCi1XZWQgRmViICAxIDE5OjA3OjQ0IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogY29yZS5jIChjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogZml4ZWQgY29tcHV0YXRpb24gb2YgbWluX3ZtYQotCWFuZCBtYXhfdm1hLgotCi0JKiAqLmM6IHJlbW92ZWQgcmNzaWQuCi0KLVR1ZSBKYW4gMzEgMTY6MTg6MTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTG90cyBvZiBjaGFuZ2VzIGZyb20gRGF2aWQgTW9zYmVyZ2VyLVRhbmc6Ci0KLQlUdWUgT2N0IDI1IDE5OjIwOjE0IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCTxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBncHJvZi5jIChtYWluKTogcHV0IHBhcmVudGhlc2VzIGFyb3VuZCAmIHdpdGhpbiAmJi4KLQotCSogYmFzaWNfYmxvY2tzLmMgKGJiX3JlYWRfcmVjKTogcHJpbnQgd2FybmluZyBtZXNzYWdlIChvbmNlKSB3aGVuCi0JaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cy4KLQotCSogc291cmNlLmMgKHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lKTogY29ycmVjdGVkIHNlY29uZCBhcmd1bWVudCB0bwotCXN0cmNtcCgpLgotCi0JKiBoaXN0LmMgKHByaW50X2hlYWRlcik6IG1lcmdlZCBGcmkgT2N0IDIxIDE4OjU4OjAyIDE5OTQgY2hhbmdlIGJ5Ci0JS2VuIFJhZWJ1cm4gPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPiBmcm9tIGJpbnV0aWxzLTIuNS4xLgotCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiB0aGUgb3V0cHV0IHN0dWxlIFNUWUxFX0dNT05fSU5GTyBpcyBub3cKLQlzdXBwb3J0ZWQgYm90aCBmb3Igb2xkIGFuZCBuZXcgKHZlcnNpb25lZCkgZ21vbi5vdXQgZmlsZXMuICBPbGQKLQlmaWxlcyBhcmUgaWRlbnRpZmllZCBhcyB2ZXJzaW9uIDAuCi0KLQkqIGdtb24uaCAoc3RydWN0IHJhd19hcmMpOiBjb3VudCBmaWVsZCBpcyBub3cgc2l6ZW9mKGxvbmcpIGJ5dGVzCi0JbG9uZyAoaW5zdGVhZCBvZiA0KSBiZWNhdXNlIHRoYXQgaXMgd2hhdCBPU0YvMSB2My4wIHVzZXMuCi0KLQkqIGNvcmUuYzogbWlub3IgZml4ZXMgYW5kIGRlYnVnZ2luZyBpbmZvIGNoYW5nZXMuCi0KLQlTdW4gU2VwIDExIDE4OjQ3OjQ3IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBjb3JlLmMgKGNvcmVfaW5pdCk6IGlmIC50ZXh0IGNhbm5vdCBiZSBmb3VuZCwgdHJ5ICRDT0RFJCAodGhlCi0JbmFtZSBvZiB0aGUgdGV4dC1zZWN0aW9uIHVuZGVyIEhQLVVYKS4KLQotCSogaGlzdC5jIChoaXN0X2Fzc2lnbl9zYW1wbGVzKTogZml4ZWQgb2ZmLWJ5LW9uZSBidWc6IGhpZ2hwYwotCXBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBzYW1wbGluZyBiaW4sIHNvIGhpc3Rfc2NhbGUgc2hvdWxkIGJlCi0JY29tcHV0ZWQgYXMgImhpc3Rfc2NhbGUgLz0gaGlzdF9udW1fYmlucyIsIG5vdCAiaGlzdF9zY2FsZSAvPQotCWhpc3RfbnVtX2JpbnMgLSAxIi4KLQotCSogZ21vbl9pby5jLCBoaXN0LmMsIGhpc3QuaDogcmVuYW1lZCBoaXN0X251bV9zYW1wbGVzIHRvCi0JaGlzdF9udW1fYmlucy4KLQotCSogY29uZmlndXJlLmluOiBhZGRlZCBhbHBoYS0qLSopIGZvciBwZXItdGFyZ2V0IGNvbmZpZy4KLQotCSogYWxwaGEuYywgYWxwaGEuaDogY3JlYXRlZC4KLQotCSogZ3Byb2YuYyAoZGVmYXVsdF9leGNsdWRlZF9saXN0KTogPGxvY29yZT4sIDxoaWNvcmU+IGFkZGVkLgotCi0JKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMsIGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6Ci0JZXhwbGljaXRseSBrZWVwIHR3byBzZW50aW5lbHMgIjxsb2NvcmU+IiBhbmQgIjxoaWNvcmU+IiB0aGF0IGNhdGNoCi0JYWxsIGFkZHJlc3NlcyBvdXRzaWRlIHRoZSB0ZXh0LXNwYWNlLiAgVGh1cywgc3ltX2xvb2t1cCgmc3ltdGFiLAotCWFkZHIpIGNvbnRpbnVlcyB0byBndWFyYW50ZWUgbm90IHRvIHJldHVybiAwIG9uIGFueSBhZGRyZXNzLiAgSXQKLQlhbHNvIGF2b2lkcyBpbmNvcnJlY3RseSBjcmVkaXRpbmcgdGhlIGZpcnN0L2xhc3Qgc3ltYm9sIGluIHRoZQotCXRleHQtc3BhY2UuCi0KLQkqIGNvcmUuYyAoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogYWx3YXlzIGNyZWF0ZSBmdW5jdGlvbiBzeW1ib2xzCi0JZmlyc3QsIHRoZW4gbWVyZ2UgaW4gbGluZSBzeW1ib2xzOyB0aGlzIGlzIHNvIHRoYXQgaWYgcGFydHMgb2YgdGhlCi0JcHJvZ3JhbSB3ZXJlIGNvbXBpbGVkIHdpdGhvdXQgLWcsIGZ1bmN0aW9uLWxldmVsIHN5bWJvbHMgYXJlCi0JYXZhaWxhYmxlIHN0aWxsLgotCi0JKiB1dGlscy5jIChwcmludF9uYW1lX29ubHkpOiBzdXBwb3J0IGZvciBwcmludF9wYXRoIGFkZGVkLgotCi0JKiBzeW10YWIuYyAoY21wX2FkZHIpOiBhbHNvIHVzZSBpc19mdW5jIGZsYWcgaW4gY29tcGFyaXNvbi4KLQkoc3ltdGFiX2ZpbmFsaXplKTogcmV0dXJuIGltbWVkaWF0ZWx5IHdoZW4gdGFibGUgZW1wdHk7IG5vdwotCW1vcmUgY2FyZWZ1bCBhYm91dCBnZXR0aW5nIHJpZCBvZiB0aGUgcmlnaHQgZHVwbGljYXRlIHN5bWJvbC4KLQotCSogc3BhcmMuYyAoZmluZF9jYWxsKTogbWFueSBmaXhlcy0tLXRoaXMgZnVuY3Rpb24gd2FzIHJhdGhlcgotCWJvdGNoZWQgaW4gYmludXRpbHMtMi40IGFscmVhZHk7IGl0IHNob3VsZCB3b3JrIGFnYWluLgotCi0JKiBzb3VyY2UuYyAoc291cmNlX2ZpbGVfbG9va3VwX3BhdGgpOiBQQVRIIGlzIG5vdyBzdHJkdXAnZWQgKGl0IGlzCi0Jbm90IGdvb2QgdG8gcmVseSBvbiBnZXRfc3JjX2luZm8oKSB0byByZXR1cm4gZGlzdGluY3Qgc3RyaW5nCi0JcG9pbnRlcnMpLgotCi0JKiBzZWFyY2hfbGlzdC5jIChzZWFyY2hfbGlzdF9hcHBlbmQpOiBhZGRlZCBjYXN0IGZvciB4bWFsbG9jKCkuCi0KLQkqIGhpc3QuYzogYWRkZWQgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gdG8gc29tZSBvZiB0aGUgZ2xvYmFsCi0JdmFyaWFibGVzOyBmaXhlZCBTSXRhYiAoc2NhbGVzIHdlcmUgb2ZmIGJ5IGEgZmFjdG9yIG9mIDEwKS4KLQotCSogaGlzdC5oOiBpbmNsdWRlIG9mIGJmZC5oIGFkZGVkLgotCi0JKiBncHJvZi5jLCBncHJvZi5oIChwcmludF9wYXRoKTogYWRkZWQuCi0KLQkqIGdwcm9mLmggKE1BWCk6IGZpeGVkLgotCi0JKiBnbW9uX291dC5oOiByZW5hbWVkIGdtb25fdGltZV9oaXN0X2hkciB0byBnbW9uX2hpc3RfaGRyLgotCi0JKiBnbW9uX2lvLmM6IGFkZGVkIHNvbWUgY2FzdHMgdG8gKGxvbmcpIHNvIHdlIGNhbiBhbHdheXMgcHJpbnQgYXMgJWx4Ci0KLQkqIGNvcmUuYyAoY29yZV9nZXRfdGV4dF9zcGFjZSk6IGZpeGVkIHRvIG1ha2UgaXQgd29yay4KLQotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnRfaW5kZXgpOiBhZGRlZCBzdXBwb3J0IGZvciBwcmludF9wYXRoIG9wdGlvbi4KLQotCSogY2dfZGZuLmggKGNnX2Rmbik6IHdyYXAgcHJvdG90eXBlIGluIFBBUkFNUygpLgotCi0JKiBjYWxsX2dyYXBoLmMsIGdtb25faW8uYywgaGlzdC5jOiBhdm9pZCB0YWtpbmcgYWRkcmVzcyBvZiBhcnJheQotCWFzIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIChlLmcuLCBERUMncyBPU0YvMSBjb21waWxlcikKLQotCSogYmFzaWNfYmxvY2tzLmMsIGdtb25faW8uYywgaGlzdC5jLCBzb3VyY2UuYywgc3ltX2lkcy5jLAotCXN5bXRhYi5jOiBjYWxscyB0byBtZW1zZXQoKSBoYWQgMm5kIGFuZCAzcmQgYXJncyByZXZlcnNlZC4KLQotCVNhdCBTZXAgMTAgMjE6NTM6MTMgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGdwcm9mLmM6IGFkZGVkICJfbWNvdW50IiB0byBkZWZhdWx0X2V4Y2x1ZGVkX2xpc3QuCi0JKG1haW4pOiBpZiBvdXRwdXRfc3R5bGU9PTAgYW5kIHRoZXJlIGlzIGVpdGhlciBhIGhpc3RvZ3JhbSBvciBhCi0JY2FsbC1ncmFwaCwgYWx3YXlzIGdlbmVyYXRlIGZsYXQgYW5kIGNhbGwtZ3JhcGgsIG5vIG1hdHRlciB3aGF0Ci0JbGluZV9ncmFudWxhcml0eSBpcyBzZXQgdG8uCi0KLQkqIHNvdXJjZS5jIChzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSk6IGlmIHNlYXJjaGluZyBmb3Igc2YtPm5hbWUKLQlmYWlscywgdHJ5IGFnYWluIHdpdGggZmlsZW5hbWUgb2J0YWluZWQgYWZ0ZXIgc3RyaXBwaW5nIG9mZiBhbnkKLQlwYXJ0aWFsIHBhdGggZnJvbSBzZi0+bmFtZS4KLQotCSogZ3Byb2YuaCAoU1JDREVCVUcpOiBhZGRlZC4KLQotCSogc2VhcmNoX2xpc3QuYyAoc2VhcmNoX2xpc3RfYXBwZW5kKTogZGlyZWN0b3JpZXMgd2VyZSBhZGRlZCBpbiB3cm9uZwotCW9yZGVyLgotCi0JKiByZWltcGxlbWVudGVkIHNlbGVjdGlvbiBtZWNoYW5pc20gZnJvbSBncm91bmQgdXA7IGl0IGlzIG5vdyBwb3NzaWJsZQotCXRvIGFjY3VyYXRlbHkgY29udHJvbCB3aGF0IGdldHMgaW5jbHVkZWQvZXhjbHVkZWQgaW4gZWFjaCBvZiB0aGUKLQlvdXRwdXQgc3R5bGVzOwlhICJzeW1ib2wtc3BlY2lmaWNhdGlvbiIgKHNwZWMpIGlzIHRoZSBiYXNpYyBtZWFucwotCXRvIHNlbGVjdCBhIHNldCBvZiBzeW1ib2xzOyBhIHNwZWMgaGFzIHRoZSBzeW50YXg6Ci0KLQkgIHNwZWMgPT0gKEZJTEVOQU1FOihGVU5DTkFNRXxMSU5FX05VTSkgfCBOQU1FKS4KLQkgIGFyYyA9PSBzcGVjL3NwZWMuCi0KLQlhbnkgb2YgdGhlIHRlcm1pbmFsIHN5bWJvbHMgY2FuIGJlIGVtcHR5LCBpbiB3aGljaCBjYXNlIHRoZXkKLQltYXRjaCBhbnl0aGluZyAod2lsZGNhcmRzKS4gIE5BTUUgaXMgaW50ZXJwcmV0ZWQgYXMgYSBGSUxFTkFNRQotCWlmIGl0IGNvbnRhaW5zIGEgZG90IChlLmcuLCBmb28uYyksIGFzIExJTkVfTlVNIGlmIGl0IHN0YXJ0cwotCXdpdGggYSBkaWdpdCwgYW5kIGFzIEZVTkNOQU1FIG90aGVyd2lzZS4KLQotCUZvciBleGFtcGxlLCB0byBnZXQgYSBjYWxsLWdyYXBoIGRpc3BsYXkgdGhhdCBpZ25vcmVzIGFyY3MKLQlmcm9tIGZvbygpIHRvIGJhcigpLCB5b3UnZCBzYXkgIi0tbm8tZ3JhcGg9Zm9vL2JhciI7IHRvCi0Jc2hvdyBvbmx5IGFyY3MgaW50byBiYXIoKSAobm8gbWF0dGVyIHdoYXQgdGhlIGNhbGxlciksCi0JeW91J2Qgc2F5ICItLWdyYXBoPS9iYXIiOyBhbmQgdG8gZ2V0IGEgY2FsbC1ncmFwaCB3aXRob3V0Ci0JYW55IGFyYyBpbmZvLCB5b3UnZCBzYXkgIi0tZ3JhcGg9LyI7ICBzaW1pbGFybHksIHRvCi0JZ2V0IGEgZmxhdCBwcm9maWxlIHdpdGhvdXQgbWNvdW50LCB5b3UnZCBzYXkgIi0tbm8tZmxhdD1tY291bnQiCi0JYW5kIHRvIGdldCBhIGZsYXQgcHJvZmlsZSB0aGF0IHNob3dzIGluY2x1ZGVzIGFsbCBmdW5jdGlvbnMKLQl5b3UnZCBzYXkgIi0tZmxhdD0iIiIgKGkuZS4sIGFuIGVtcHR5IHNwZWMpCi0KLQkqIGhpc3QuYyAoaGlzdF9wcmludCk6IHRvcF90aW1lIHdhc24ndCBpbml0aWFsaXplZCB0byAwLjAuCi0KLQlGcmkgU2VwCSA5IDAxOjEwOjIxIDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBnbW9uX291dC5oOiBhbGwgaGVhZGVycyBub3cgZGVjbGFyZWQgaW4gdGVybXMgb2YgY2hhcmFjdGVycwotCSAgdG8gYXZvaWQgZ2V0dGluZyBpbnRvIHRyb3VibGUgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXJzIGludHJvZHVjaW5nCi0JICBkaWZmZXJlbnQgYW1vdW50IG9mIHBhZGRpbmc7IHRoZSBjb2RlIGFscmVhZHkgYWNjZXNzZWQgdGhlIGZpZWxkcwotCSAgdGhyb3VnaCBiZmQgZnVuY3Rpb25zLCBzbyB0aGF0IGRpZG4ndCBoYXZlIHRvIGNoYW5nZS4KLQotCSogaGlzdC5jIChoaXN0X3JlYWRfcmVjLCBoaXN0X3dyaXRlX3JlYyk6IGFkZGVkIHN1cHBvcnQgZm9yCi0JICBjb2xsZWN0aW9uIHBjIGhpc3RvZ3JhbXMgbWVhc3VyaW5nIHF1YW50aXRpZXMgb3RoZXIgdGhhbiB0aW1lOwotCSAgdGhlIGhpc3RvZ3JhbSBoZWFkZXIgbm93IGluY2x1ZGVzIGEgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhlCi0JICBkaW1lbnNpb24gb2YgdGhlIHF1YW50aXR5IG1lYXN1cmVkIGJ5IHRoZSBoaXN0b2dyYW0gYmlucwotCSAgKG5vcm1hbGx5LCB0aGlzIGlzICJzZWNvbmRzIiwgYnV0IG90aGVyIG1lYW5pbmdmdWwgZGltZW5zaW9ucwotCSAgIGluY2x1ZGUgc3VjaCB0aGluZ3MgYXMgIkktY2FjaGUgbWlzc2VzIiwgImluc3RydWN0aW9uIGlzc3VlIHN0YWxscyIKLQkgICBldGMuKTsgdGhlcmUgaXMgYWxzbyBhIGZpZWxkIHRvIHNwZWNpZnkgYSBvbmUtY2hhcmFjdGVyCi0JICBhYmJyZXZpYXRpb24gZm9yIHRoZSBkaW1lbnNpb247IGluIHRoZSBjYXNlIG9mIHRpbWUsIHRoaXMgd291bGQKLQkgIGJlICdzJzsgaW4gbW9zdCBvdGhlciBjYXNlcyBpdCBwcm9iYWJseSB3b3VsZCBiZSAnMScgKG5vdCBhIHBoeXNpY2FsCi0JICBkaW1lbnNpb24pLgotCi0JVGh1IFNlcAkgOCAxNjowNTowOCAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYywgZ21vbl9pby5bY2hdOiBCU0RfQ09NUEFUSUJMRSBpcyBnb25lIGFuZCBuZXdfZmlsZV92ZXJzaW9uCi0JICBoYXMgYmVjb21lIG9sZF9maWxlX3ZlcnNpb247IGdtb25faW8uYyBub3cgYWx3YXlzIHN1cHBvcnRzIG9sZC1zdHlsZQotCSAgZ21vbi5vdXQgZmlsZXM7IGl0IGZpcnN0IHRyaWVzIHRvIHJlYWQgZ21vbi5vdXQgYXMgYSBuZXcgdmVyc2lvbgotCSAgZmlsZSwgaWYgdGhhdCBmYWlscywgaXQgdHJpZXMgdG8gcmVhZCBpdCBpbiB0aGUgb2xkIGZvcm1hdDsKLQkgIGFsdGhvdWdoIG5vdCB2ZXJ5IGxpa2VseSwgaXQgaXMgcG9zc2libGUgZm9yIGdwcm9mIHRvIG1pc3Rha2UgYW4KLQkgIG9sZC1zdHlsZSBmaWxlIGFzIGEgbmV3IG9uZSAodGhlIGZpcnN0IDQgYnl0ZXMgd291bGQgaGF2ZSB0bwotCSAgYmUgImdtb24iLS0taW5jbHVkaW5nIHRoZSB0cmFpbGluZyAnXDAnKTsgaW4gdGhhdCBjYXNlLCBpdCBpcwotCSAgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgLS1vbGQtZmlsZS12ZXJzaW9uCi0KLQkqIGdwcm9mLmg6IHJlbW92ZWQgZGVwZW5kZW5jeSBvbiBTWVNWOyB0aGUgY29kZSBub3cgYWx3YXlzIHVzZXMKLQkgIHN0cnJjaHIoKSwgbWVtc2V0KCksIGFuZCBtZW1jcHkoKSBhbmQgZG9lcyBub3QgaW5jbHVkZSBlaXRoZXIKLQkgIG9mIHN0cmluZy5oIG9yIHN0cmluZ3MuaDsgdGhpcyBzaG91bGQgbWFrZSBncHJvZiBjb21waWxlIG9uCi0JICBhbnkgKFVuaXgpIHN5c3RlbSB3aXRob3V0IGNvbmZpZ3VyYXRpb24gKHBlciBzdWdnZXN0aW9uIG9mCi0JICByYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKHVzYWdlKTogZml4ZWQgbG9jYXRpb24gb2YgLS1uZXctZmlsZS1mb3JtYXQgb3B0aW9uLgotCi0JKiBjZ19hcmNzLmMgKHByb3BhZ2F0ZV9mbGFncyk6IGZpeGVkIHR5cG8gaW4gZGVjbGFyYXRpb24uCi0KLQkqIGZsYXRfYmwubTogcmVtb3ZlZCBmb3JtZmVlZCBhdCBlbmQgb2YgZmlsZTsgdGhlIGZvcm0tZmVlZAotCSAgaXMgbm93IHByaW50ZWQgY2dfcHJpbnQuYyBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotCi0JKiBtYWpvciByZXdyaXRlIG9mIGdwcm9mLS0tdG9vIG1hbnkgY2hhbmdlcyB0byBtZW50aW9uIGFsbCBvZgotCSAgdGhlbS4JIG5ldyBmZWF0dXJlczoKLQotCSsgLWwgbm93IHJlcXVlc3RzIHByb2ZpbGluZyBhdCB0aGUgbGluZSBsZXZlbCAoYXMgb3Bwb3NlZAotCSAgdG8gZnVuY3Rpb24gbGV2ZWwpOyBpbiB0aGlzIG1vZGUsIGdwcm9mIGNyZWF0ZXMgYSAic3ltYm9sIgotCSAgKGFrYSBuYW1lLWxpc3QgZW50cnkpIGZvciBlYWNoIGxpbmUgb2Ygc291cmNlIGNvZGUsIGluc3RlYWQKLQkgICBvZiBvbmUgcGVyIGZ1bmN0aW9uKQotCi0JKyBzdXBwb3J0IGZvciBhIG5ldyBnbW9uLm91dCBmaWxlIGZvcm1hdDsgdGhlIG5ldyBmb3JtYXQgCi0JICBjb25zaXN0cyBvZiBhIGhlYWRlciB3aXRoIGEgbWFnaWMgYW5kIGEgdmVyc2lvbiBudW1iZXIsCi0JICBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mIHByb2ZpbGUgZGF0YTsgcHJvZmlsZSBkYXRhCi0JICBjYW4gYW55IG9mOiAoYSkgUEMgaGlzdG9ncmFtLCAoYikgY2FsbC1ncmFwaCBhcmNzLCBvcgotCSAgKGMpIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHM7IHRoZSB2ZXJzaW9uIG51bWJlciBtYWtlcwotCSAgaXQgcG9zc2libGUgdG8gZXh0ZW5kIGdtb24ub3V0IGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUKLQkgIGZhc2hpb24KLQotCSsgc3VwcG9ydCBmb3IgdGNvdiBzdHlsZSBhbm5vdGF0ZWQgb3V0cHV0OiBpZiB0aGUgZ21vbi5vdXQgZmlsZQotCSAgY29udGFpbnMgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cywgdGhlIHVzZXIgY2FuIHJlcXVlc3QKLQkgIHRoZSBnZW5lcmF0aW9uIG9mIGFubm90YXRlZCBzb3VyY2UgZmlsZXMsIG11Y2ggbGlrZSBTdW4ncwotCSAgdGNvdiB1c2VkIHRvIGRvCi0KLQkrIGxvbmcgb3B0aW9ucwotCi0JKyBuZXcgc2NoZW1lIHRvIHN1cHByZXNzIHN5bWJvbHMgdGhhdCBhcmVuJ3QgZnVuY3Rpb24gbmFtZXMKLQkgIChlLmcuLCBhdm9pZHMgbWlzdGFraW5nIGEgZ290byBsYWJlbCBhcyBhIGZ1bmN0aW9uKQotCi0JKyByZW9yZ2FuaXplZCBzb3VyY2UgY29kZSB0byBtYWtlIGl0IG1vcmUgbWFuYWdhYmxlOyBhcyBhCi0JICBzaWRlIGVmZmVjdCwgZ3Byb2Ygbm93IGNvbXBpbGVzIGNsZWFubHkgd2l0aCAiZ2NjIC1XYWxsIgotCi0JVGh1IFNlcAkgMSAxNTo0Njo0OSAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYyAoZnVuY3N5bWJvbCk6IGJmZF9maW5kX25lYXJlc3RfbGluZSgpIGlzIG5vdyB1c2VkIGFzIGEKLQlmaW5hbCBjcm9zcy1jaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN0YXRpYyBzeW1ib2wgc2hvdWxkIGJlCi0JY29uc2lkZXJlZCBhcyBhIGZ1bmN0aW9uLW5hbWUuCi0KLQlGcmkgQXVnCSA1IDE5OjMyOjM2IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiByZWNvZ25pemUgIi0iIGFzIHRoZSBmaWxlbmFtZSBmb3IKLQlzdGRpbjsgdGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbm5hIGtlZXAgZ21vbi5vdXQgZmlsZXMgY29tcHJlc3NlZDsKLQl0aGlzIHdheSB5b3UgY2FuICJnemNhdCIgdGhlIGNvbXByZXNzZWQgZmlsZSBpbnRvIGdwcm9mLgotCi0JKiBncHJvZi5jOiBmbGFnX21pbl9jb3VudCBub3cgaW5pdGlhbGl6ZWQgd2l0aCAxIGluc3RlYWQgb2YgMC4KLQotCSogYmFzaWNfYmxvY2tzLmMgKGJiX2Fubm90YXRlX3NvdXJjZSk6IGFkZGVkIHN1cHBvcnQgZm9yIGNyZWF0aW5nCi0JLnRjb3YgZmlsZXMgd2hlbiBvcHRpb24gZmxhZ19hbm5vdGF0ZV9tYWtlX2ZpbGVzIGlzIFRSVUUuCi0JKGFubm90YXRlX3dpdGhfY291bnQpOiBhbGwgY291bnRzIGxlc3MgdGhhbiB0aGUgbWluaW11bSBjb3VudAotCXNwZWNpZmllZCBieSAtbSBhcmUgbm93IGFubm90YXRlZCB3aXRoIGhhc2gtbWFya3MuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiAtQSBpcyBub3cgZm9sbG93ZWQgYnkgYSBzdHJpbmcgb2Ygb3B0aW9uIGNoYXJzLgotCi0JKiBiYXNpY19ibG9ja3MuYyAoYW5ub3RhdGVfd2l0aF9jb3VudCk6IHJlcGxhY2VkIGItPmNvdW50IHdpdGgKLQljbnQuCi0KLQkqIHNvdXJjZS5jOiBmbGFnX2Fubm90YXRlX3NvdXJjZSByZXBsYWNlZCBieSBzb3VyY2VfbG9ja19tYXAuCi0KLQkqIHNvdXJjZS5oOiBzb3VyY2VfbG9ja19tYXAgYWRkZWQuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiBuZXcgY29tbWFuZC1saW5lIHN5bnRheDogLVMgc2ltcGx5IHNwZWNpZmllcwotCXdoaWNoIHNvdXJjZS1maWxlcyB1c2VyIGlzIGludGVyZXN0ZWQgaW47IC1BIHJlcXVlc3RzIGFubm90YXRlZAotCXNvdXJjZSBmaWxlcyBhbmQgLUFBIHJlcXVlc3RzIHRoYXQgYWxsIGxpbmVzIGluIGEgc291cmNlIGZpbGUKLQlhcmUgYW5ub3RhdGVkLgotCi0JVGh1IEF1ZwkgNCAyMzoyNzowMyAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogYmFzaWNfYmxvY2tzLmMgKFBBVEhfTUFYKTogaWYgdW5kZWZpbmVkLCBkZWZpbmUgYXMgMTAyNC4KLQotCSogc3BhcmMuYywgaTM4Ni5jLCB0YWhvZS5jLCB2YXguYzogYWRkZWQgaW5jbHVkZSBvZiAidGltZV9oaXN0LmgiCi0Jc28gc19sb3dwYyBldGMuIGdldCBkZWNsYXJlZC4KLQotCSogYXJjcy5oIChkb2FyY3MpOiBjcmVhdGVkLgotCi0JKiBhcmNzLmM6IHJlb3JkZXJlZCBzdGF0aWMgZnVuY3Rpb25zIHN1Y2ggdGhhdCB0aGV5IGdldCBkZWZpbmVkCi0JYmVmb3JlIHVzZS4KLQotCSogZ3Byb2YuYyAobWFpbik6IGFkZGVkIG9wdGlvbnM6Ci0JICAgLUE6IHJlcXVlc3QgYW5ub3RhdGlvbiBvZiBhbGwgc291cmNlIGxpbmVzICh3aXRoIC1TKQotCSAgIC1tOiBtaW5pbXVtIGV4ZWN1dGlvbiBjb3VudCAod2l0aCBkZWZhdWx0IGJhc2ljLWJsb2NrIGRpc3BsYXkpCi0JICAgLU46IGZvcmNlIG5ldyBmaWxlIGZvcm1hdCAob25seSBpZiBCU0RfQ09NUEFUSUJMRSBpcyBkZWZpbmVkKQotCSAgIC1TOiBhbm5vdGF0ZSBzb3VyY2UgZmlsZQotCSAgIC10OiBzZXQgdGFibGUgbGVuZ3RoICh3aXRoIC1TKQotCi0JKiBNYWtlZmlsZSAoT0JKUyk6IGFkZGVkIGJhc2ljX2Jsb2Nrcy5vIGNhbGxfZ3JhcGgubyBnbW9uX2lvLm8KLQlzb3VyY2UubyB0aW1lX2hpc3QubwotCi0JRnJpIEp1bAkgMSAxNToyMzo1MCAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYyAoYXNnbnNhbXBsZXMpOiBjb21wdXRhdGlvbiBvZiAicGNsIiBhbmQgInBjaCIgZGVwZW5kZWQKLQlvbiB0aGUgZmFjdCBiZWluZyBhYmxlIHRvIHN0b3JlIGEgbG9uZyBpbiBhIGRvdWJsZSB3aXRob3V0IGxvc3Mgb2YKLQlwcmVjaXNpb247IHRoaXMgZG9lcyBub3QgaG9sZCBvbiBtYWNoaW5lcyB3aXRoIDY0IGJpdCBsb25ncyBhbmQgNjQKLQliaXQgZG91Ymxlcy4KLQotRnJpIE9jdCAyMSAxODo1ODowMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBwcmludGdwcm9mLmMgKGZsYXRwcm9maGVhZGVyKTogQWx3YXlzIHNldCB0b3RpbWUgdG8gMS4wIGlmIG5vdAotCWdyZWF0ZXIgdGhhbiAwLjAuICBTdWdnZXN0ZWQgYnkgSGFyb2xkIEFzc2luawotCTxjYXJsb0BzZy50bi50dWRlbGZ0Lm5sPi4KLQotRnJpIFNlcCAyMyAxNTowNjo0NSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBwcmludGdwcm9mLmMgKHByaW50cHJvZik6IFVzZSBmcmVlLCBub3QgY2ZyZWUuCi0JKHByaW50Z3Byb2YsIHByaW50aW5kZXgpOiBEaXR0by4KLQotVGh1IFNlcCAgMSAxMDo0MDo0NSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ3Byb2YuaCAoa2Zyb21saXN0LCBrdG9saXN0LCBmbGlzdCwgRmxpc3QsIGVsaXN0LCBFbGlzdCk6IE1ha2UKLQlkZWNscyBleHRlcm4gdG8ga2VlcCBuYXRpdmUgSFAgY29tcGlsZXIgcXVpZXQuCi0KLVR1ZSBBdWcgMzAgMTE6MTI6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogSWdub3JlIF9fX2dudV9jb21waWxlZCBhcyB3ZWxsIGFzCi0JX19nbnVfY29tcGlsZWQsIGZvciB0aGUgYmVuZWZpdCBvZiBzeXN0ZW1zIHdoaWNoIGFkZCBhIGxlYWRpbmcKLQl1bmRlcnNjb3JlLgotCi1XZWQgQXVnIDI0IDEyOjQ5OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaTM4Ni0qLSogdG8gaVszNDVdODYtKi0qLgotCi1TdW4gSnVsIDEwIDAwOjM1OjMxIDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBuczUzMi5jLCBuczUzMi5oOiBOZXcgRmlsZXMuIG5zNTMyIHN1cHBvcnQuCi0KLQkqIGNvbmZpZy9tdC1uczUzMjogTmV3IEZpbGUuIG5zNTMyIHN1cHBvcnQuCi0KLQkqIGdwcm9mLmM6IHVzZXIgcmVnaXN0ZXIgaW50IGkgaW5zdGVhZCBvZiBkZWZhdWx0aW5nIHRoZSBpbnQuCi0JQWxsb3dzIGNvbXBpbGF0aW9uIHdpdGggLURyZWdpc3Rlcj0gZm9yIGRlYnVnZ2luZy4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbnM1MzIgc3VwcG9ydC4KLQotVGh1IEp1biAyMyAxMToyMjo0MSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGdwcm9mKTogRGVwZW5kIG9uICQoTElCUykuCi0KLUZyaSBNYXkgMjcgMTI6MjQ6NTcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCUZyb20gYmludXRpbHMtMi40IHJlbGVhc2U6Ci0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogW25ld10gYnVpbGQgbWFrZWZpbGUgZnJvbSBtYWtlZmlsZS5pbiAoZG9zKQotCSogaGVydHouYzogYWxsb3cgc3RhdGljIEhFUlRaIChtc2RvcyBuZWVkcyBpdCkKLQkqIGdwcm9mLmM6IGFsbG93IHRhcmdldCB0byBzZWxlY3QgInIiIG9yICJyYiIgZm9yIGZvcGVuCi0JKiBncHJvZi5jOiBpZ25vcmUgX19nbnVfY29tcGlsZWQgc3ltYm9scwotCSogaTM4Ni5oOiBkZmluZSBGT1BFTl9SQiB0byAicmIiIGZvciBkb3MuCi0KLVR1ZSBNYXkgMTcgMTU6MzA6MjIgMTk5NCAgRS4gTWljaGFlbCBTbWl0aCAoZW1zQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgubS5jOik6ICBBZGRlZCAuU1VGRklYRVMgOiAubSAKLQlzbyBmbGF0X2JsLmMgd291bGQgbWFrZSBmcm9tIGZsYXRfYmwubSBmaWxlLgotCi1UaHUgTWF5ICA1IDE5OjIzOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBDaGVjayBmb3IgZ3Byb2YuaW5mbyBpbiBidWlsZCBkaXIsCi0JZmFsbCBiYWNrIHRvIHNyY2Rpci4gIERlcGVuZCBvbiBpdC4KLQotCSogZ3Byb2YuaCAoVFJVRSwgRkFMU0UpOiBBbHdheXMgdXNlIHVuZGVmIGJlZm9yZSBkZWZpbmluZyB0aGVtLgotCi1Nb24gQXByICA0IDIzOjQ3OjMwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoTVlfTUFDSElORSk6IFJlbmFtZWQgZnJvbSBNQUNISU5FIHRvIGF2b2lkIGxvc2luZwotCW1ha2VzIChvc2YxKSBpbiB3aGljaCB0aGUgdmFsdWUgb2YgTUFDSElORSBjYW4gbm90IGJlIGNoYW5nZWQuCi0JKiBjb25maWcvKi5tdDogQ2hhbmdlZCBhcHByb3ByaWF0ZWx5LgotCi1XZWQgTWFyIDMwIDE2OjEyOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoZ2V0c3ltdGFiKTogQ2hhbmdlIG5vc3ltcyB0byBsb25nLiAgUmVuYW1lCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0byBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4gIENoZWNrIGZvcgotCWVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCi1UdWUgTWFyIDIyIDEwOjUwOjUyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogVXNlIGJmZF9nZXRfc3ltYm9sX2luZm8gaW5zdGVhZCBvZgotCWJmZF9kZWNvZGVfc3ltY2xhc3MuCi0KLVN1biBNYXIgMjAgMTU6NDA6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiBBdm9pZCBidWcgaW4gaHB1eCBzZWQuCi0KLVdlZCBEZWMgMTUgMjA6MTY6NDAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBncHJvZi50ZXhpIChJbnZva2luZyk6IGFkZCB0ZXh0IGFib3V0IC12IGZsYWcKLQotCSogZ3Byb2YuMTogYWRkIHRleHQgYWJvdXQgLXYgZmxhZwotCi1XZWQgRGVjICA4IDE2OjU1OjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoVkVSU0lPTik6IGRlZmluZWQgYSB2ZXJzaW9uIG1hY3JvLCBwcmludCB0aGUgdmFsdWUgCi0Jd2hlbiB0aGUgLXYgb3B0aW9uIGlzIHVzZWQKLQotVHVlIEp1bCAgNiAxMDoxMTo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogSW5zdGFsbCBjb3JyZWN0bHkuCi0KLVRodSBKdW4gMjQgMTQ6NDM6MjIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChtYWluKTogR2V0IHdob2FtaSBmcm9tIGFyZ3YsIGluc3RlYWQgb2YgaGFyZGNvZGluZy4KLQlVc2UgaXQgaW4gdXNhZ2UgbWVzc2FnZS4gIFNwbGl0IHVzYWdlIG1lc3NhZ2UgdG8gZml0IGluIDgwIGNvbHMuCi0KLVN1biBKdW4gMjAgMjA6NTg6MDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVbmRvIDE1IEp1bmUgY2hhbmdlLgotCi1XZWQgSnVuIDE2IDEyOjU0OjUzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGdtb24uaCwgZ3Byb2YuaDogc3RydWN0cyBvZiBjaGFycyB1c2VkIHRvIGhvbGQgZXh0ZXJuYWwKLQlyZXByZXNlbnRhdGlvbnMuCi0JKiBncHJvZi5jIChnZXRwZmlsZSwgb3BlbnBmaWxlLCByZWFkc2FtcGxlcyk6IFN3YXAgZGF0YSBpbiB1c2luZwotCW5ldyBzdHJ1Y3R1cmVzLgotCi1UdWUgSnVuIDE1IDIzOjA5OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBMb29rIGluIC4uL2luY2x1ZGUsIG5vdCAuLi9iZmQsIGZvciBiZmQuaC4KLQotTW9uIEp1biAxNCAxNjoyMjo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQKLQotTW9uIEp1biAgNyAxMjo1NjoxNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6ICBBZGQgLUkuLi9iZmQgZm9yIHN5c2RlcC5oIGFuZCBiZmQuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIHRvIGNvbmZpZ3VyZSB0byBnZXQgc3lzZGVwLmguCi0KLVR1ZSBNYXkgMTggMjE6NDQ6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IHNob3VsZCBub3QgZGVwZW5kIG9uIGluc3RhbGwtaW5mbwotCi1Nb24gQXByIDI2IDEyOjM3OjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuaDogSW5jbHVkZSBhbnNpZGVjbC5oIGJlZm9yZSBzeXNkZXAuaC4gIFVuZGVmaW5lIGh6LgotCi1UdWUgQXByIDEzIDE2OjE0OjAzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNIE1ha2VmaWxlLmluOiAgQWRkIC1nIHRvIENGTEFHUy4KLQlBZHMgTERGTEFHUyBhbmQgdXNlIGluIHBsYWNlIG9mIENGTEFHUyB3aGVyZSBhcHByb3ByaWF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgYSBzeXNkZXAuaGxpbmsgaW4gdGhlIHNhbWUgd2F5IG90aGVyCi0JYmZkLWJhc2VkIGRpcmVjdG9yaWVzIGRvLgotCSogZ3Byb2YuaCAoVU5JVCk6ICBSZXBsYWNlIG5vbi1zdGFuZGFyZCAndV9zaG9ydCcgYnkgJ3Vuc2lnbmVkCi0Jc2hvcnQnLgotCSogZ3Byb2YuaDogICNpbmNsdWRlIHN5c2RlcC5oIGluc3RlYWQgb2YgYSBidW5jaCBvZiBzdHVmZi4KLQkqIGdwcm9mLmMgKG1haW4pOiAgRml4IHR5cG8gZ3Byb2ZmLT5ncHJvZi4KLQotVGh1IE1hciAyNSAxOTowMDozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLnRleGk6IGFkZCBJTkZPLURJUi1FTlRSWQotCi1UdWUgTWFyIDIzIDAwOjAzOjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLVNhdCBGZWIgMjcgMTg6MTc6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogIEludmVydCB0ZXN0IGZvciBhZmxhZy4KLQotVGh1IEZlYiAyNSAxNjowMTo1MCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHByaW50Z3Byb2YgKHhtYWxsb2MsIHhyZWFsbG9jKTogIENhc3QgcmVzdWx0cyBvZiBtYWxsb2MKLQlhbmQgcmVhbGxvYyB0byBQVFIuCi0KLVdlZCBGZWIgIDMgMTM6NTU6MzMgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNyZWF0ZWQgaW5mbywgaW5zdGFsbC1pbmZvLCBkdmkKLQotV2VkIEphbiAgNiAwMDo1ODowOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggaW5zdGFsbCBydWxlIGZvciAkKFBST0cpCi0KLUZyaSBPY3QgIDkgMTE6MjU6NDEgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuMTogdXBkYXRlZCBTWU5PUFNJUyB0byBtYXRjaCBhY3R1YWwgYmVoYXZpb3IuCi0KLU1vbiBPY3QgIDUgMTc6NTA6MTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGdlbi1jLXByb2cuYXdrOiAgTmV3IGF3ayBzY3JpcHQsIGxpZ2h0bHkgY2hhbmdlZCBmcm9tCi0JcHJldmlvdXNseSBkZWxldGVkIG1ha2UtYy1wcm9nLmF3ay4gIENvbnZlcnRzIGEgdGV4dCBmaWxlCi0JdG8gYSBjIGZ1bmN0aW9uIHRoYXQgcHJpbnRzIHRoYXQgdGV4dC4KLQkqIGZsYXRfYmwubSwgZnNmX2NhbGxnX2JsLm0sIGJzZF9jYWxsZ19ibC5tOiAgTmV3IGZpbGVzLgotCUlucHV0cyB0byBnZW4tYy1wcm9nLmF3aywgY29udGFpbmluZyB0ZXh0IGRlc2NyaWJpbmcKLQlncHJvZiBvdXRwdXQuCi0JKiBibHVyYnMuYzogIFJlbW92ZWQuICBVc2UgKl9ibC5jIGluc3RlYWQuCi0JKiBNYWtlZmlsZS5pbjogVXNlIGdlbi1jcHJvZy5hd2sgdG8gZ2VuZXJhdGUgKl9ibC5jIGZpbGVzCi0JZnJvbSAqX2JsLm0gZmlsZXMuICBBbHNvLCBpbXByb3ZlICpjbGVhbiBydWxlcy4KLQkqIHByaW50Z3Byb2YuYyAocHJpbnRncHJvZik6ICBVc3cgbmV3IGZ1bmN0aW9uIG5hbWVzIGZyb20gKl9ibC5jLgotCQotCi1TdW4gQXVnIDMwIDE5OjU0OjUzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuaCwgZ3Byb2YuYywgcHJpbnRmZ3Byb2YuYzogIEFkZCBzdXBwb3J0IGZvciB0d28KLQlvdXRwdXQgc3R5bGVzOiAgVGhlIGRlZmF1bHQgaXMgc2ltaWxhciB0byB0aGUgb2xkIEZTRiBncHJvZiwKLQl3aGlsZSAtVCBzZXRzIHRoZSB2YXJpYWJsZSBic2Rfc3R5bGVfb3V0cHV0LCB3aGljaCBjYXVzZXMKLQlvdXRwdXQgbWF0Y2hpbmcgQmVya2VsZXkncyBncHJvZi4gIFRoZSBiaWdnZXN0IGRpZmZlcmVuY2VzCi0JYXJlIHRoYXQgd2l0aCB0aGUgRlNGIHN0eWxlIG91dHB1dCwgdGhlIGZsYXQgcHJvZmlsZSBjb21lcwotCWJlZm9yZSB0aGUgY2FsbCBncmFwaDsgbnVtYmVycyBjb21lIGJlZm9yZSBleHBsYW5hdGlvbnM7Ci0JYW5kIHRoZXJlIGlzIGxlc3MgZ3JhdHVpdG91cyB3aGl0ZSBzcGFjZS4KLQkqIGdwcm9mLmgsIGdwcm9mLmMsIHByaW50Zmdwcm9mLmM6ICBOZXcgZGlzY2FyZF91bmRlcnNjb3JlcwotCXZhcmlhYmxlIGNhdXNlcyBkaXNjYXJkaW5nIG9mIGluaXRpYWwgdW5kZXJzY29yZXMgd2hlbgotCXByaW50aW5nIHN5bWJvbCBuYW1lcy4gIEl0IGlzIHNldCB1bmxlc3MgdGhlcmUgaXMgYSAibWFpbiIKLQlzeW1ib2wgKHdpdGhvdXQgYW4gdW5kZXJzY29yZSkuCi0JKiBwcmludGZncHJvZi5jOiAgTmV3IGZ1bmN0aW9uIHByaW50bmFtZW9ubHkoKSwgY2FsbGVkCi0JYnkgcHJpbnRuYW1lKCkuICBJdCBoYW5kbGVzIHN0cmlwcGluZyBvZiBpbml0aWFsICdfJywKLQlhcyB3ZWxsIGFzIEMrKyBuYW1lLWRlbWFuZ2xpbmcuCi0JKiBncHJvZi5jYWxsZywgZ3Byb2YuZmxhdCwgbWFrZS1jLXByb2cuYXdrOiAgUmVtb3ZlZC4KLQlJdCBpcyBqdXN0IGFzIGNvbnZlbmllbnQgdG8gZWRpdCBibHVyYnMuYyBkaXJlY3RseS4KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlZCBydWxlIGZvciBtYWtpbmcgYmx1cmJzLmMuCi0JKiBibHVyYnMuYzogIFRoaXMgaXMgbm93IGEgdHJ1ZSBzb3VyY2UgZmlsZSAoYXMgb3Bwb3NlZAotCXRvIGJlaW5nIGdlbmVyYXRlZCBmcm9tIGdwcm9mLmNhbGxnIGFuZCBncHJvZi5mbGF0KS4KLQlDaGFuZ2Ugc3R5bGUgdG8gdXNlIG9uZSBsb25nIHN0cmluZyBsaXRlcmFsLCBpbnN0ZWFkIG9mCi0Jb25lIGxpdGVyYWwgcGVyIG91dHB1dCBsaW5lLiAgQWRkIEZTRi1zdHlsZSBibHVyYiBmb3IgY2FsbCBncmFwaC4KLQotV2VkIEF1ZyAxOSAxNDozNjozOSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotV2VkIEF1ZyAxMiAxNToxNDoxNCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlICR7TUFDSElORX0gdG8gJChNQUNISU5FKS4KLQotU3VuIEp1bCAxOSAxNzozNDowMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgcmVtb3ZlZCBpbnN0YWxsYXRpb24gb2YgdGhlIG5vdyB1c2VsZXNzCi0JY2FsbC57ZmxhZyxjYWxsZ30gZmlsZXMuICAKLQotCSogZ3Byb2YuMTogbm93IHVzZXMgdGhlIHN0YW5kYXJkIG1hbiBtYWNyb3MgaW5zdGVhZCBvZiB0aGUgbmV3IEJTRAotCW1hbmRvYyBtYWNyb3MuIAotCi1TdW4gSnVsIDEyIDE5OjA2OjAwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZW1vdmUgaG9zdCBzZWN0aW9uLCBleHBhbmQgdGFyZ2V0IHNlY3Rpb24uCi0JKiBjb25maWcvbXQte3RhaG9lLHZheH06ICBBZGQsIHRvIG1hdGNoIGV4aXN0aW5nIHN1cHBvcnQgZmlsZXMuCi0JKiBjb25maWcvdG1ha2UtKjogIFJlbW92ZSBsZWZ0b3ZlciBjcnVkLgotCi0JKiBibHVyYnMuYzogIE5ldyBmaWxlLCBjcmVhdGVkIGZyb20gZ3Byb2YuZmxhdCBhbmQgZ3Byb2YuY2FsbGcgYnkKLQkqIG1ha2UtYy1wcm9nLmF3azogIHdoaWNoIHByb2Nlc3NlcyB0ZXh0IGZpbGVzIGludG8gQyBwcm9ncmFtcy4KLQkqIHByaW50Z3Byb2YuYyAoZmxhdHByb2ZoZWFkZXIsIGdwcm9maGVhZGVyKTogIENhbGwgbmV3IGZ1bmN0aW9ucwotCXRvIHByaW50IGJsdXJicy4KLQkocHJpbnRibHVyYik6ICBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogIEluZnJhc3RydWN0dXJlIHRvIGJ1aWxkIGJsdXJicy4KLQkqIHBhdGhuYW1lcy5oOiAgaGFzIGJlZW4gcmVtb3ZlZC4gIEdwcm9mIG5vdyBoYXMgbm8gZmlsZW5hbWUKLQlkZXBlbmRlbmNpZXMgaW4gaXQuCi0JKiBncHJvZi5jOiAgTGludC4KLQotU2F0IEp1bCAxMSAxODowNzoyMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgbWFuMWRpciBhbmQgaW5zdGFsbCB0aGUgbWFuIHBhZ2UKLQotRnJpIEp1bCAxMCAyMToxNDowOCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHVtbXkgaW5mbyBhbmQgaW5zdGFsbC1pbmZvIHRhcmdldHMKLQotVGh1IEp1biAgNCAxMTozNDowMiAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBsb29rdXAuYzogZml4ZWQgZmVuY2Vwb3N0IGluIG5sbG9va3VwIGFuZCBhZGRlZCBkYmdfbmxsb29rdXAgZm9yCi0JaGVscCBpbiBkZWJ1Z2dpbmcgdGhlIHByb2JsZW0gKHdpdGggLURERUJVRykKLQkqIGdwcm9mLmM6IHN5bWJvbCB2YWx1ZXMgYXJlIG5vdyByZWFsIHZhbHVlcywgZG9uJ3QgYWRkIHRoZSB2bWEKLQlhbnltb3JlLiAoZG9uZSBmb3Igc29sYXJpczsgc2hvdWxkIHZlcmlmeSB0aGlzIG9uIG90aGVyIHBsYXRmb3JtcykKLQkqIENoYW5nZUxvZzogY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2dwcm9mL01ha2VmaWxlLmFtIGIvZ3Byb2YvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWU0YzUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VGRklYRVMgPSAubQotCi1TVUJESVJTID0gcG8KLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1EREVCVUcgLUkuLi9iZmQgLUkkKHNyY2RpcikvLi4vaW5jbHVkZSAtSSQoc3JjZGlyKS8uLi9iZmQgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1iaW5fUFJPR1JBTVMgPSBncHJvZgotCi0jIyBDb252ZW5pZW5jZSB2YXIgbGlzdGluZyBwdXJlIHNvdXJjZXMuCi1zb3VyY2VzID0gYmFzaWNfYmxvY2tzLmMgY2FsbF9ncmFwaC5jIGNnX2FyY3MuYyBjZ19kZm4uYyBcCi0JY2dfcHJpbnQuYyBjb3JlZmlsZS5jIGdtb25faW8uYyBncHJvZi5jIGhlcnR6LmMgaGlzdC5jIHNvdXJjZS5jIFwKLQlzZWFyY2hfbGlzdC5jIHN5bXRhYi5jIHN5bV9pZHMuYyB1dGlscy5jIFwKLQlpMzg2LmMgYWxwaGEuYyB2YXguYyB0YWhvZS5jIHNwYXJjLmMKLWdwcm9mX1NPVVJDRVMgPSAkKHNvdXJjZXMpIGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYwotZ3Byb2ZfREVQRU5ERU5DSUVTID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLWdwcm9mX0xEQUREID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLQotbm9pbnN0X0hFQURFUlMgPSBcCi0JYmFzaWNfYmxvY2tzLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19kZm4uaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb24uaCBnbW9uX2lvLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKLQlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oCi0KLUVYVFJBX0RJU1QgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMgYmJjb252LnBsCi0KLUJVSUxUX1NPVVJDRVMgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLQotZGlzdHN0dWZmOiAkKEJVSUxUX1NPVVJDRVMpIGluZm8KLQotLm0uYzoKLQlhd2sgLWYgJChzcmNkaXIpL2dlbi1jLXByb2cuYXdrID4gLi8kKi5jIFwKLQkgICAgRlVOQ1RJT049YChlY2hvICQqfHNlZCAtZSAncywuKi8sLGcnIC1lICdzL19ibC8vJylgX2JsdXJiIFwKLQkgICAgRklMRT0kKi5tICQoc3JjZGlyKS8kKi5tCi0KLVBPVEZJTEVTID0gJChzb3VyY2VzKSAkKG5vaW5zdF9IRUFERVJTKQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotaW5mb19URVhJTkZPUyA9IGdwcm9mLnRleGkKLW1hbl9NQU5TID0gZ3Byb2YuMQotCi0jIERlcGVuZGVuY2llcy4KLSQoT0JKRUNUUyk6IC4uL2JmZC9iZmQuaCBjYWxsX2dyYXBoLmggY2dfYXJjcy5oIGNnX3ByaW50LmggXAotCWNvcmVmaWxlLmggZ21vbl9pby5oIGdtb24uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAotCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmggXAotCSQoc3JjZGlyKS8uLi9pbmNsdWRlL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9iZmQvc3lzZGVwLmggXAotCWdjb25maWcuaCAuLi9iZmQvY29uZmlnLmgKLWJhc2ljX2Jsb2Nrcy5vOiBiYXNpY19ibG9ja3MuYwotYnNkX2NhbGxfYmwubzogYnNkX2NhbGxfYmwuYwotY2FsbF9ncmFwaC5vOiBjYWxsX2dyYXBoLmMKLWNnX2FyY3MubzogY2dfYXJjcy5jCi1jZ19kZm4ubzogY2dfZGZuLmMKLWNnX3ByaW50Lm86IGNnX3ByaW50LmMKLWNvcmVmaWxlLm86IGNvcmVmaWxlLmMKLWZsYXRfYmwubzogZmxhdF9ibC5jCi1mc2ZfY2FsbGdfYmwubzogZnNmX2NhbGxnX2JsLmMKLWdtb25faW8ubzogZ21vbl9pby5jCi1ncHJvZi5vOiBncHJvZi5jCi1oZXJ0ei5vOiBoZXJ0ei5jCi1oaXN0Lm86IGhpc3QuYwotc2VhcmNoX2xpc3Qubzogc2VhcmNoX2xpc3QuYwotc291cmNlLm86IHNvdXJjZS5jCi1zeW10YWIubzogc3ltdGFiLmMKLXN5bV9pZHMubzogc3ltX2lkcy5jCi11dGlscy5vOiB1dGlscy5jCi1pMzg2Lm86IGkzODYuYwotYWxwaGEubzogYWxwaGEuYwotdmF4Lm86IHZheC5jCi10YWhvZS5vOiB0YWhvZS5jCi1zcGFyYy5vOiBzcGFyYy5jCmRpZmYgLS1naXQgYS9ncHJvZi9NYWtlZmlsZS5pbiBiL2dwcm9mL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEwYWExLi4wMDAwMDAwCi0tLSBhL2dwcm9mL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzI2ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFTID0gQEFTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWwgPSBAbEAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUZGSVhFUyA9IC5tCi0KLVNVQkRJUlMgPSBwbwotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLURERUJVRyAtSS4uL2JmZCAtSSQoc3JjZGlyKS8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uL2JmZCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLWJpbl9QUk9HUkFNUyA9IGdwcm9mCi0KLXNvdXJjZXMgPSBiYXNpY19ibG9ja3MuYyBjYWxsX2dyYXBoLmMgY2dfYXJjcy5jIGNnX2Rmbi5jIFwKLQljZ19wcmludC5jIGNvcmVmaWxlLmMgZ21vbl9pby5jIGdwcm9mLmMgaGVydHouYyBoaXN0LmMgc291cmNlLmMgXAotCXNlYXJjaF9saXN0LmMgc3ltdGFiLmMgc3ltX2lkcy5jIHV0aWxzLmMgXAotCWkzODYuYyBhbHBoYS5jIHZheC5jIHRhaG9lLmMgc3BhcmMuYwotCi1ncHJvZl9TT1VSQ0VTID0gJChzb3VyY2VzKSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLWdwcm9mX0RFUEVOREVOQ0lFUyA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi1ncHJvZl9MREFERCA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi0KLW5vaW5zdF9IRUFERVJTID0gXAotCWJhc2ljX2Jsb2Nrcy5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfZGZuLmggY2dfcHJpbnQuaCBcCi0JY29yZWZpbGUuaCBnbW9uLmggZ21vbl9pby5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCi0Jc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaAotCi0KLUVYVFJBX0RJU1QgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMgYmJjb252LnBsCi0KLUJVSUxUX1NPVVJDRVMgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLQotUE9URklMRVMgPSAkKHNvdXJjZXMpICQobm9pbnN0X0hFQURFUlMpCi0KLWluZm9fVEVYSU5GT1MgPSBncHJvZi50ZXhpCi1tYW5fTUFOUyA9IGdwcm9mLjEKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBnY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotYmluX1BST0dSQU1TID0gIGdwcm9mJChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKGJpbl9QUk9HUkFNUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotZ3Byb2ZfT0JKRUNUUyA9ICBiYXNpY19ibG9ja3MubyBjYWxsX2dyYXBoLm8gY2dfYXJjcy5vIGNnX2Rmbi5vIFwKLWNnX3ByaW50Lm8gY29yZWZpbGUubyBnbW9uX2lvLm8gZ3Byb2YubyBoZXJ0ei5vIGhpc3QubyBzb3VyY2UubyBcCi1zZWFyY2hfbGlzdC5vIHN5bXRhYi5vIHN5bV9pZHMubyB1dGlscy5vIGkzODYubyBhbHBoYS5vIHZheC5vIHRhaG9lLm8gXAotc3BhcmMubyBmbGF0X2JsLm8gYnNkX2NhbGxnX2JsLm8gZnNmX2NhbGxnX2JsLm8KLWdwcm9mX0xERkxBR1MgPSAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGdwcm9mLmluZm8KLURWSVMgPSBncHJvZi5kdmkKLVRFWElORk9TID0gZ3Byb2YudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotSEVBREVSUyA9ICAkKG5vaW5zdF9IRUFERVJTKQotCi1ESVNUX0NPTU1PTiA9ICAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFRPRE8gXAotYWNsb2NhbC5tNCBjb25maWd1cmUgY29uZmlndXJlLmluIGdjb25maWcuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9ICQoZ3Byb2ZfU09VUkNFUykKLU9CSkVDVFMgPSAkKGdwcm9mX09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmxvIC5tIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluIAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotZ2NvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2djb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1nY29uZmlnLmg6Z2NvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2djb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JZWxzZSA6OyBmaQotJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0JQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCi0KLW1vc3RseWNsZWFuLWhkcjoKLQotY2xlYW4taGRyOgotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBnY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLWJpblBST0dSQU1TOgotCi1jbGVhbi1iaW5QUk9HUkFNUzoKLQktdGVzdCAteiAiJChiaW5fUFJPR1JBTVMpIiB8fCBybSAtZiAkKGJpbl9QUk9HUkFNUykKLQotZGlzdGNsZWFuLWJpblBST0dSQU1TOgotCi1tYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TOgotCi1pbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGJpbmRpcikKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1iaW5QUk9HUkFNUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JZG9uZQotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1ncHJvZiQoRVhFRVhUKTogJChncHJvZl9PQkpFQ1RTKSAkKGdwcm9mX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZ3Byb2YkKEVYRUVYVCkKLQkkKExJTkspICQoZ3Byb2ZfTERGTEFHUykgJChncHJvZl9PQkpFQ1RTKSAkKGdwcm9mX0xEQUREKSAkKExJQlMpCi0KLWdwcm9mLmluZm86IGdwcm9mLnRleGkKLWdwcm9mLmR2aTogZ3Byb2YudGV4aQotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBncHJvZi5hdXggZ3Byb2YuY3AgZ3Byb2YuY3BzIGdwcm9mLmR2aSBncHJvZi5mbiBncHJvZi5mbnMgXAotCSAgZ3Byb2Yua3kgZ3Byb2Yua3lzIGdwcm9mLnBzIGdwcm9mLmxvZyBncHJvZi5wZyBncHJvZi50b2MgXAotCSAgZ3Byb2YudHAgZ3Byb2YudHBzIGdwcm9mLnZyIGdwcm9mLnZycyBncHJvZi5vcCBncHJvZi50ciBcCi0JICBncHJvZi5jdiBncHJvZi5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGdjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpZ2NvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBnY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogZ2NvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtbWFuCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKSAkKEhFQURFUlMpIGdjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChiaW5kaXIpICQoREVTVERJUikkKG1hbmRpcikvbWFuMQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChCVUlMVF9TT1VSQ0VTKSIgfHwgcm0gLWYgJChCVUlMVF9TT1VSQ0VTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tdGFncyBtb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIFwKLQkJY2xlYW4tYW1pbmZvIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWJpblBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCi0JCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi10YWdzIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLWJpblBST0dSQU1TIGRpc3RjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1iaW5QUk9HUkFNUyBcCi1tYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TIHVuaW5zdGFsbC1iaW5QUk9HUkFNUyBpbnN0YWxsLWJpblBST0dSQU1TIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gXAotbW9zdGx5Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIFwKLW1haW50YWluZXItY2xlYW4tYW1pbmZvIGluc3RhbGwtbWFuMSB1bmluc3RhbGwtbWFuMSBpbnN0YWxsLW1hbiBcCi11bmluc3RhbGwtbWFuIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCi1kaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCi1kdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKLWluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBcCi1hbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotZGlzdHN0dWZmOiAkKEJVSUxUX1NPVVJDRVMpIGluZm8KLQotLm0uYzoKLQlhd2sgLWYgJChzcmNkaXIpL2dlbi1jLXByb2cuYXdrID4gLi8kKi5jIFwKLQkgICAgRlVOQ1RJT049YChlY2hvICQqfHNlZCAtZSAncywuKi8sLGcnIC1lICdzL19ibC8vJylgX2JsdXJiIFwKLQkgICAgRklMRT0kKi5tICQoc3JjZGlyKS8kKi5tCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0jIERlcGVuZGVuY2llcy4KLSQoT0JKRUNUUyk6IC4uL2JmZC9iZmQuaCBjYWxsX2dyYXBoLmggY2dfYXJjcy5oIGNnX3ByaW50LmggXAotCWNvcmVmaWxlLmggZ21vbl9pby5oIGdtb24uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAotCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmggXAotCSQoc3JjZGlyKS8uLi9pbmNsdWRlL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9iZmQvc3lzZGVwLmggXAotCWdjb25maWcuaCAuLi9iZmQvY29uZmlnLmgKLWJhc2ljX2Jsb2Nrcy5vOiBiYXNpY19ibG9ja3MuYwotYnNkX2NhbGxfYmwubzogYnNkX2NhbGxfYmwuYwotY2FsbF9ncmFwaC5vOiBjYWxsX2dyYXBoLmMKLWNnX2FyY3MubzogY2dfYXJjcy5jCi1jZ19kZm4ubzogY2dfZGZuLmMKLWNnX3ByaW50Lm86IGNnX3ByaW50LmMKLWNvcmVmaWxlLm86IGNvcmVmaWxlLmMKLWZsYXRfYmwubzogZmxhdF9ibC5jCi1mc2ZfY2FsbGdfYmwubzogZnNmX2NhbGxnX2JsLmMKLWdtb25faW8ubzogZ21vbl9pby5jCi1ncHJvZi5vOiBncHJvZi5jCi1oZXJ0ei5vOiBoZXJ0ei5jCi1oaXN0Lm86IGhpc3QuYwotc2VhcmNoX2xpc3Qubzogc2VhcmNoX2xpc3QuYwotc291cmNlLm86IHNvdXJjZS5jCi1zeW10YWIubzogc3ltdGFiLmMKLXN5bV9pZHMubzogc3ltX2lkcy5jCi11dGlscy5vOiB1dGlscy5jCi1pMzg2Lm86IGkzODYuYwotYWxwaGEubzogYWxwaGEuYwotdmF4Lm86IHZheC5jCi10YWhvZS5vOiB0YWhvZS5jCi1zcGFyYy5vOiBzcGFyYy5jCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dwcm9mL05PVEVTIGIvZ3Byb2YvTk9URVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWFmMzAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvTk9URVMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotU3VuIEZlYiAgNSAxNjowOToxNiAxOTk1Ci0KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNoYW5nZXMgYW5kIG5ldyBmZWF0dXJlcyBhdmFpbGFibGUgd2l0aCB0aGlzCi12ZXJzaW9uIG9mIEdOVSBncHJvZi4KLQotKiBOZXcgRmVhdHVyZXMKLQotIG8gTG9uZyBvcHRpb25zCi0KLSBvIFN1cHBvcnRzIGdlbmVyYWxpemVkIGZpbGUgZm9ybWF0LCB3aXRob3V0IGJyZWFraW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci0gICBuZXcgZmlsZSBmb3JtYXQgc3VwcG9ydHMgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBhbmQgbm9uLXJlYWx0aW1lCi0gICBoaXN0b2dyYW1zIChzZWUgYmVsb3cpCi0KLSBvIFN1cHBvcnRzIHByb2ZpbGluZyBhdCB0aGUgbGluZSBsZXZlbDogZmxhdCBwcm9maWxlcywgY2FsbC1ncmFwaCBwcm9maWxlcywKLSAgIGFuZCBleGVjdXRpb24tY291bnRzIGNhbiBhbGwgYmUgZGlzcGxheWVkIGF0IGEgbGV2ZWwgdGhhdCBpZGVudGlmaWVzCi0gICBpbmRpdmlkdWFsIGxpbmVzIHJhdGhlciB0aGFuIGp1c3QgZnVuY3Rpb25zCi0KLSBvIFRlc3QtY292ZXJhZ2Ugc3VwcG9ydCAoc2ltaWxhciB0byBTdW4gdGNvdiBwcm9ncmFtKTogc291cmNlIGZpbGVzCi0gICBjYW4gYmUgYW5ub3RhdGVkIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBhIGZ1bmN0aW9uIHdhcyBpbnZva2VkCi0gICBvciB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBiYXNpYy1ibG9jayBpbiBhIGZ1bmN0aW9uIHdhcwotICAgZXhlY3V0ZWQKLQotIG8gR2VuZXJhbGl6ZWQgaGlzdG9ncmFtczogbm90IGp1c3QgZXhlY3V0aW9uLXRpbWUsIGJ1dCBhcmJpdHJhcnkKLSAgIGhpc3RvZ3JhbXMgYXJlIHN1cHBvcnQgKGZvciBleGFtcGxlLCBwZXJmb3JtYW5jZSBjb3VudGVyIGJhc2VkCi0gICBwcm9maWxlcykKLQotIG8gUG93ZXJmdWwgbWVjaGFuaXNtIHRvIHNlbGVjdCBkYXRhIHRvIGJlIGluY2x1ZGVkL2V4Y2x1ZGVkIGZyb20KLSAgIGFuYWx5c2lzIGFuZC9vciBvdXRwdXQKLQotIG8gU3VwcG9ydCBmb3IgREVDIE9TRi8xIHYzLjAKLQotIG8gRnVsbCBjcm9zcy1wbGF0Zm9ybSBwcm9maWxpbmcgc3VwcG9ydDogZ3Byb2YgdXNlcyBCRkQgdG8gc3VwcG9ydAotICAgYXJiaXRyYXJ5LCBub24tbmF0aXZlIG9iamVjdCBmaWxlIGZvcm1hdHMgYW5kIG5vbi1uYXRpdmUgYnl0ZS1vcmRlcnMKLSAgICh0aGlzIGZlYXR1cmUgaGFzIG5vdCBiZWVuIHRlc3RlZCB5ZXQpCi0KLSBvIEluIHRoZSBjYWxsLWdyYXBoIGZ1bmN0aW9uIGluZGV4LCBzdGF0aWMgZnVuY3Rpb24gbmFtZXMgYXJlIG5vdwotICAgcHJpbnRlZCB0b2dldGhlciB3aXRoIHRoZSBmaWxlbmFtZSBpbiB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQKLSAgIChyZXF1aXJlZCBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKSBzdXBwb3J0IGFuZCBzeW1ib2xpYyBkZWJ1Z2dpbmcKLSAgICBpbmZvcm1hdGlvbiB0byBiZSBwcmVzZW50IGluIHRoZSBleGVjdXRhYmxlIGZpbGUpCi0KLSBvIE1ham9yIG92ZXJoYXVsIG9mIHNvdXJjZSBjb2RlIChjb21waWxlcyBjbGVhbmx5IHdpdGggLVdhbGwsIGV0Yy4pCi0KLSogU3VwcG9ydGVkIFBsYXRmb3JtcwotCi1UaGUgY3VycmVudCB2ZXJzaW9uIGlzIGtub3duIHRvIHdvcmsgb246Ci0KLSBvIERFQyBPU0YvMSB2My4wCi0JQWxsIGZlYXR1cmVzIHN1cHBvcnRlZC4KLQotIG8gU3VuT1MgNC4xLngKLQlBbGwgZmVhdHVyZXMgc3VwcG9ydGVkLgotCi0gbyBTb2xhcmlzIDIuMwotCUxpbmUtbGV2ZWwgcHJvZmlsaW5nIHVuc3VwcG9ydGVkIGJlY2F1c2UgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkKLQlpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgZm9yIEVsZiBiaW5hcmllcy4KLQotIG8gSFAtVVggOS4wMQotCUxpbmUtbGV2ZWwgcHJvZmlsaW5nIHVuc3VwcG9ydGVkIGJlY2F1c2UgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkKLQlpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgZm9yIFNPTSBiaW5hcmllcy4KLQotKiBEZXRhaWxlZCBEZXNjcmlwdGlvbgotCi0qKiBVc2VyIEludGVyZmFjZSBDaGFuZ2VzCi0KLVRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggZWFybGllcgotdmVyc2lvbnMgb2YgR05VIGdwcm9mIGFuZCBCZXJrZWxleSBncHJvZi4gIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcwotdGhlIG9wdGlvbiB0byBkZWxldGUgYXJjcyBmcm9tIHRoZSBjYWxsIGdyYXBoLiAgVGhlIG9sZCBzeW50YXgKLXdhczoKLQotCS1rIGZyb21uYW1lIHRvbmFtZQotCi13aGlsZSB0aGUgbmV3IHN5bnRheCBpczoKLQotCS1rIGZyb21uYW1lL3RvbmFtZQotCi1UaGlzIGNoYW5nZSB3YXMgbmVjZXNzYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBsb25nLW9wdGlvbiBwYXJzaW5nLgotQWxzbywgImZyb21uYW1lIiBhbmQgInRvbmFtZSIgY2FuIG5vdyBiZSBhcmJpdHJhcnkgc3ltc3BlY3MgcmF0aGVyCi10aGFuIGp1c3QgZnVuY3Rpb24gbmFtZXMgKHNlZSBiZWxvdyBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygc3ltc3BlY3MpLgotRm9yIGV4YW1wbGUsIG9wdGlvbiAiLWsgZ3Byb2YuYy8iIHN1cHByZXNzZXMgYWxsIGFyY3MgZHVlIHRvIGNhbGxzIG91dAotb2YgZmlsZSAiZ3Byb2YuYyIuCi0KLSoqKiBTeW0gU3BlY3MKLQotSXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRvIGFwcGx5IGdwcm9mIG9ubHkgdG8gc3BlY2lmaWMgcGFydHMgb2YgYQotcHJvZ3JhbS4gIEdOVSBncHJvZiBoYXMgYSBzaW1wbGUgYnV0IHBvd2VyZnVsIG1lY2hhbmlzbSB0byBhY2hpZXZlCi10aGlzLiAgU28gY2FsbGVkIHtcZW0gc3ltc3BlY3NcL30gcHJvdmlkZSB0aGUgZm91bmRhdGlvbiBmb3IgdGhpcwotbWVjaGFuaXNtLiAgQSBzeW1zcGVjIHNlbGVjdHMgdGhlIHBhcnRzIG9mIGEgcHJvZmlsZWQgcHJvZ3JhbSB0byB3aGljaAotYW4gb3BlcmF0aW9uIHNob3VsZCBiZSBhcHBsaWVkIHRvLiAgVGhlIHN5bnRheCBvZiBhIHN5bXNwZWMgaXMKLXNpbXBsZToKLQotCSAgZmlsZW5hbWVfY29udGFpbmluZ19hX2RvdAotCXwgZnVuY25hbWVfbm90X2NvbnRhaW5pbmdfYV9kb3QKLQl8IGxpbmVudW1iZXIKLQl8ICggWyBhbnlfZmlsZW5hbWUgXSBgOicgKCBhbnlfZnVuY25hbWUgfCBsaW5lbnVtYmVyICkgKQotCi1IZXJlIGFyZSBzb21lIGV4YW1wbGVzOgotCi0JbWFpbi5jCQkJU2VsZWN0cyBldmVyeXRoaW5nIGluIGZpbGUgIm1haW4uYyItLS10aGUKLQkJCQlkb3QgaW4gdGhlIHN0cmluZyB0ZWxscyBncHJvZiB0byBpbnRlcnByZXQKLQkJCQl0aGUgc3RyaW5nIGFzIGEgZmlsZW5hbWUsIHJhdGhlciB0aGFuIGFzCi0JCQkJYSBmdW5jdGlvbiBuYW1lLiAgVG8gc2VsZWN0IGEgZmlsZSB3aG9zZQotCQkJCW5hbWUgZG9lcyBjb250YWluIGEgZG90LCBhIHRyYWlsaW5nIGNvbG9uCi0JCQkJc2hvdWxkIGJlIHNwZWNpZmllZC4gIEZvciBleGFtcGxlLCAib2RkOiIgaXMKLQkJCQlpbnRlcnByZXRlZCBhcyB0aGUgZmlsZSBuYW1lZCAib2RkIi4KLQotCW1haW4JCQlTZWxlY3RzIGFsbCBmdW5jdGlvbnMgbmFtZWQgIm1haW4iLiAgTm90aWNlCi0JCQkJdGhhdCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZQotCQkJCXNhbWUgZnVuY3Rpb24gbmFtZSBiZWNhdXNlIHNvbWUgb2YgdGhlCi0JCQkJZGVmaW5pdGlvbnMgbWF5IGJlIGxvY2FsIChpLmUuLCBzdGF0aWMpLgotCQkJCVVubGVzcyBhIGZ1bmN0aW9uIG5hbWUgaXMgdW5pcXVlIGluIGEgcHJvZ3JhbSwKLQkJCQl5b3UgbXVzdCB1c2UgdGhlIGNvbG9uIG5vdGF0aW9uIGV4cGxhaW5lZAotCQkJCWJlbG93IHRvIHNwZWNpZnkgYSBmdW5jdGlvbiBmcm9tIGEgc3BlY2lmaWMKLQkJCQlzb3VyY2UgZmlsZS4gIFNvbWV0aW1lcywgZnVuY3Rpb25uYW1lcyBjb250YWluCi0JCQkJZG90cy4gIEluIHN1Y2ggY2FzZXMsIGl0IGlzIG5lY2Vzc2FyIHRvCi0JCQkJYWRkIGEgbGVhZGluZyBjb2xvbiB0byB0aGUgbmFtZS4gIEZvciBleGFtcGxlLAotCQkJCSI6Lm11bCIgc2VsZWN0cyBmdW5jdGlvbiAiLm11bCIuCi0JCQkJCi0JbWFpbi5jOm1haW4JCVNlbGVjdHMgZnVuY3Rpb24gIm1haW4iIGluIGZpbGUgIm1haW4uYyIuCi0KLQltYWluLmM6MTM0CQlTZWxlY3RzIGxpbmUgMTM0IGluIGZpbGUgIm1haW4uYyIuCi0KLUlNUExFTUVOVEFUSU9OIE5PVEU6IFRoZSBzb3VyY2UgY29kZSB1c2VzIHRoZSB0eXBlIHN5bV9pZCBmb3Igc3ltc3BlY3MuCi1BdCBzb21lIHBvaW50LCB0aGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGNoYW5nZWQgdG8gInN5bV9zcGVjIiB0byBtYWtlCi1yZWFkaW5nIHRoZSBjb2RlIGVhc2llci4KLQotKioqIExvbmcgb3B0aW9ucwotCi1HTlUgZ3Byb2Ygbm93IHN1cHBvcnRzIGxvbmcgb3B0aW9ucy4gIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIGFsbAotc3VwcG9ydGVkIG9wdGlvbnMuICBPcHRpb25zIHRoYXQgYXJlIGxpc3RlZCB3aXRob3V0IGRlc2NyaXB0aW9uCi1vcGVyYXRlIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgY29ycmVzcG9uZGluZyBvcHRpb24gaW4gb2xkZXIKLXZlcnNpb25zIG9mIGdwcm9mLgotCi1TaG9ydCBGb3JtOglMb25nIEZvcm06Ci0tLS0tLS0tLS0tLQktLS0tLS0tLS0tCi0tbAkJLS1saW5lCi0JCQlSZXF1ZXN0IHByb2ZpbGluZyBhdCB0aGUgbGluZS1sZXZlbCByYXRoZXIKLQkJCXRoYW4ganVzdCBhdCB0aGUgZnVuY3Rpb24gbGV2ZWwuICBTb3VyY2UKLQkJCWxpbmVzIGFyZSBpZGVudGlmaWVkIGJ5IHN5bWJvbHMgb2YgdGhlIGZvcm06Ci0KLQkJCQlmdW5jIChmaWxlOmxpbmUpCi0KLQkJCXdoZXJlICJmdW5jIiBpcyB0aGUgZnVuY3Rpb24gbmFtZSwgImZpbGUiIGlzIHRoZQotCQkJZmlsZSBuYW1lIGFuZCAibGluZSIgaXMgdGhlIGxpbmUtbnVtYmVyIHRoYXQKLQkJCWNvcnJlc3BvbmRzIHRvIHRoZSBsaW5lLgotCi0JCQlUbyB3b3JrIHByb3Blcmx5LCB0aGUgYmluYXJ5IG11c3QgY29udGFpbiBzeW1ib2xpYwotCQkJZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBzb3VyY2UKLQkJCWhhdmUgdG8gYmUgdHJhbnNsYXRlZCB3aXRoIG9wdGlvbiAiLWciIHNwZWNpZmllZC4KLQkJCUZ1bmN0aW9ucyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gc3ltYm9saWMgZGVidWdnaW5nCi0JCQlpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXJlIHRyZWF0ZWQgYXMgaWYgIi0tbGluZSIKLQkJCWhhZCBub3QgYmVlbiBzcGVjaWZpZWQuICBIb3dldmVyLCB0aGUgbGluZSBudW1iZXIKLQkJCXByaW50ZWQgd2l0aCBzdWNoIHN5bWJvbHMgaXMgdXN1YWxseSBpbmNvcnJlY3QKLQkJCWFuZCBzaG91bGQgYmUgaWdub3JlZC4KLQotLWEJCS0tbm8tc3RhdGljCi0tQVtzeW1zcGVjXQktLWFubm90YXRlZC1zb3VyY2VbPXN5bXNwZWNdCi0JCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhbm5vdGF0ZWQgc291cmNlCi0JCQlmaWxlcy4gIElmICJzeW1zcGVjIiBpcyBzcGVjaWZpZWQsIHByaW50IG91dHB1dCBvbmx5Ci0JCQlmb3Igc3ltYm9scyBzZWxlY3RlZCBieSAic3ltc3BlYyIuICBJZiB0aGUgb3B0aW9uCi0JCQlpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIGFubm90YXRlZCBvdXRwdXQgaXMKLQkJCWdlbmVyYXRlZCBmb3IgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotCQkJRXhhbXBsZXM6Ci0KLQkJCSAgLUEJCVByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZvciBhbGwKLQkJCQkJc291cmNlIGZpbGVzLgotCQkJICAtQWdwcm9mLmMJUHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZm9yIGZpbGUKLQkJCQkJZ3Byb2YuYy4KLQkJCSAgLUFmb29iYXIJUHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZm9yIGZpbGVzCi0JCQkJCWNvbnRhaW5pbmcgYSBmdW5jdGlvbiBuYW1lZCAiZm9vYmFyIi4KLQkJCQkJVGhlIGVudGlyZSBmaWxlIHdpbGwgYmUgcHJpbnRlZCwgYnV0Ci0JCQkJCW9ubHkgdGhlIGZ1bmN0aW9uIGl0c2VsZiB3aWxsIGJlCi0JCQkJCWFubm90YXRlZCB3aXRoIHByb2ZpbGUgZGF0YS4KLQotLUpbc3ltc3BlY10JLS1uby1hbm5vdGF0ZWQtc291cmNlWz1zeW1zcGVjXQotCQkJU3VwcHJlc3MgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQuICBJZiBzcGVjaWZpZWQKLQkJCXdpdGhvdXQgYXJndW1lbnQsIGFubm90YXRlZCBvdXRwdXQgaXMgc3VwcHJlc3NlZAotCQkJY29tcGxldGVseS4gIFdpdGggYW4gYXJndW1lbnQsIGFubm90YXRlZCBvdXRwdXQKLQkJCWlzIHN1cHByZXNzZWQgb25seSBmb3IgdGhlIHN5bWJvbHMgc2VsZWN0ZWQgYnkKLQkJCSJzeW1zcGVjIi4gIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlCi0JCQl0aW1lcywgYW5ub3RhdGVkIG91dHB1dCBpcyBzdXBwcmVzc2VkIGZvciB0aGUKLQkJCXVuaW9uIG9mIGFsbCBzeW1zcGVjcy4gIFRoaXMgb3B0aW9uIGhhcyBsb3dlcgotCQkJcHJlY2VkZW5jZSB0aGFuIC0tYW5ub3RhdGVkLXNvdXJjZQotCi0tcFtzeW1zcGVjXQktLWZsYXQtcHJvZmlsZVs9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGEgZmxhdCBwcm9maWxlCi0JCQkodW5sZXNzIGFueSBvdGhlciBvdXRwdXQtc3R5bGUgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCSB0aGlzIG9wdGlvbiBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCkuICBJZgotCQkJInN5bXNwZWMiIGlzIHNwZWNpZmllZCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMKLQkJCXNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBpbiBmbGF0IHByb2ZpbGUuICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBmbGF0Ci0JCQlwcm9maWxlIGluY2x1ZGVzIHN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uCi0JCQlvZiBhbGwgc3ltc3BlY3MuCi0JCQkKLS1QW3N5bXNwZWNdCS0tbm8tZmxhdC1wcm9maWxlWz1zeW1zcGVjXQotCQkJU3VwcHJlc3Mgb3V0cHV0IGluIHRoZSBmbGF0IHByb2ZpbGUuICBJZiBnaXZlbgotCQkJd2l0aG91dCBhbiBhcmd1bWVudCwgdGhlIGZsYXQgcHJvZmlsZSBpcyBzdXBwcmVzc2VkCi0JCQljb21wbGV0ZWx5LiAgSWYgInN5bXNwZWMiIGlzIHNwZWNpZmllZCwgc3VwcHJlc3MKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGluIHRoZSBmbGF0IHByb2ZpbGUuICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbiBvZgotCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgaXMgc3VwcHJlc3NlZC4gIFRoaXMgb3B0aW9uCi0JCQloYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIC0tZmxhdC1wcm9maWxlLgotCi0tcVtzeW1zcGVjXQktLWdyYXBoWz1zeW1zcGVjXQotCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBjYWxsLWdyYXBoCi0JCQkodW5sZXNzIGFueSBvdGhlciBvdXRwdXQtc3R5bGUgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCSB0aGlzIG9wdGlvbiBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCkuICBJZiAic3ltc3BlYyIKLQkJCWlzIHNwZWNpZmllZCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMgc2VsZWN0ZWQgYnkKLQkJCSJzeW1zcGVjIiBpbiB0aGUgY2FsbC1ncmFwaC4gIElmIHRoZSBvcHRpb24gaXMKLQkJCXNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIGNhbGwtZ3JhcGggaW5jbHVkZXMKLQkJCXN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotLVFbc3ltc3BlY10JLS1uby1ncmFwaFs9c3ltc3BlY10KLQkJCVN1cHByZXNzIG91dHB1dCBpbiB0aGUgY2FsbC1ncmFwaC4gIElmIGdpdmVuIHdpdGhvdXQKLQkJCWFuIGFyZ3VtZW50LCB0aGUgY2FsbC1ncmFwaCBpcyBzdXBwcmVzc2VkIGNvbXBsZXRlbHkuCi0JCQlXaXRoIGEgInN5bXNwZWMiLCBzdXBwcmVzcyB0aGUgc2VsZWN0ZWQgc3ltYm9scwotCQkJZnJvbSB0aGUgY2FsbC1ncmFwaC4gIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkCi0JCQltdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uIG9mIHRoZSBzZWxlY3RlZCBzeW1ib2xzCi0JCQlpcyBzdXBwcmVzc2VkLiAgVGhpcyBvcHRpb24gaGFzIGxvd2VyIHByZWNlZGVuY2UKLQkJCXRoYW4gLS1ncmFwaC4KLQotLUNbc3ltc3BlY10JLS1leGVjLWNvdW50c1s9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGV4ZWN1dGlvbiBjb3VudHMuCi0JCQlJZiAic3ltc3BlYyIgaXMgcHJlc2VudCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMKLQkJCXNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBpbiB0aGUgZXhlY3V0aW9uIGNvdW50Ci0JCQlsaXN0aW5nLiAgSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUKLQkJCXRpbWVzLCB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcgaW5jbHVkZXMKLQkJCXN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotLVpbc3ltc3BlY10JLS1uby1leGVjLWNvdW50c1s9c3ltc3BlY10KLQkJCVN1cHByZXNzIG91dHB1dCBpbiB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcuCi0JCQlJZiBnaXZlbiB3aXRob3V0IGFuIGFyZ3VtZW50LCB0aGUgbGlzdGluZyBpcwotCQkJc3VwcHJlc3NlZCBjb21wbGV0ZWx5LiAgV2l0aCBhICJzeW1zcGVjIiwgc3VwcHJlc3MKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGZyb20gdGhlIGNhbGwtZ3JhcGguICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbiBvZgotCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgaXMgc3VwcHJlc3NlZC4gIFRoaXMgb3B0aW9uCi0JCQloYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIC0tZXhlYy1jb3VudHMuCi0KLS1pCQktLWZpbGUtaW5mbwotCQkJUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2ZpbGUgZmlsZXMgdGhhdAotCQkJYXJlIHJlYWQuICBUaGUgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlCi0JCQludW1iZXIgYW5kIHR5cGVzIG9mIHJlY29yZHMgcHJlc2VudCBpbiB0aGUKLQkJCXByb2ZpbGUgZmlsZS4gIEN1cnJlbnRseSwgYSBwcm9maWxlIGZpbGUgY2FuCi0JCQljb250YWluIGFueSBudW1iZXIgYW5kIGFueSBjb21iaW5hdGlvbiBvZiBoaXN0b2dyYW0sCi0JCQljYWxsLWdyYXBoLCBvciBiYXNpYy1ibG9jayBjb3VudCByZWNvcmRzLgotCi0tcwkJLS1zdW0KLQotLXgJCS0tYWxsLWxpbmVzCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlCeSBkZWZhdWx0LCBvbmx5IHRoZSBsaW5lcyBhdCB0aGUgYmVnaW5uaW5nIG9mCi0JCQlhIGJhc2ljLWJsb2NrIGFyZSBhbm5vdGF0ZWQuICBJZiB0aGlzIG9wdGlvbiBpcwotCQkJc3BlY2lmaWVkLCBldmVyeSBsaW5lIGluIGEgYmFzaWMtYmxvY2sgaXMgYW5ub3RhdGVkCi0JCQlieSByZXBlYXRpbmcgdGhlIGFubm90YXRpb24gZm9yIHRoZSBmaXJzdCBsaW5lLgotCQkJVGhpcyBvcHRpb24gaXMgaWRlbnRpY2FsIHRvIHRjb3YncyAiLWEiLgotCi0tSSBkaXJzCQktLWRpcmVjdG9yeS1wYXRoPWRpcnMKLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLQkJCVNwZWNpZmllcyB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBiZSBzZWFyY2hlZAotCQkJZm9yIHNvdXJjZSBmaWxlcy4gIFRoZSBhcmd1bWVudCAiZGlycyIgaXMgYSBjb2xvbgotCQkJc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMuICBCeSBkZWZhdWx0LCBncHJvZgotCQkJc2VhcmNoZXMgZm9yIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudAotCQkJd29ya2luZyBkaXJlY3Rvcnkgb25seS4KLQotLXoJCS0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zCi0KLS1tIG51bQkJLS1taW4tY291bnQ9bnVtCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2UgYW5kIGV4ZWN1dGlvbgotCQkJY291bnQgb3V0cHV0IG9ubHkuICBTeW1ib2xzIHRoYXQgYXJlIGV4ZWN1dGVkCi0JCQlsZXNzIHRoYW4gIm51bSIgdGltZXMgYXJlIHN1cHByZXNzZWQuICBGb3IgYW5ub3RhdGVkCi0JCQlzb3VyY2Ugb3V0cHV0LCBzdXBwcmVzc2VkIHN5bWJvbHMgYXJlIG1hcmtlZAotCQkJYnkgZml2ZSBoYXNoLW1hcmtzICgjIyMjIykuICBJbiBhbiBleGVjdXRpb24gY291bnQKLQkJCW91dHB1dCwgc3VwcHJlc3NlZCBzeW1ib2xzIGRvIG5vdCBhcHBlYXIgYXQgYWxsLgotCi0tTAkJLS1wcmludC1wYXRoCi0JCQlOb3JtYWxseSwgc291cmNlIGZpbGVuYW1lcyBhcmUgcHJpbnRlZCB3aXRoIHRoZSBwYXRoCi0JCQljb21wb25lbnQgc3VwcHJlc3NlZC4gIFdpdGggdGhpcyBvcHRpb24sIGdwcm9mCi0JCQljYW4gYmUgZm9yY2VkIHRvIHByaW50IHRoZSBmdWxsIHBhdGhuYW1lIG9mCi0JCQlzb3VyY2UgZmlsZW5hbWVzLiAgVGhlIGZ1bGwgcGF0aG5hbWUgaXMgZGV0ZXJtaW5lZAotCQkJZnJvbSBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGltYWdlIGZpbGUKLQkJCWFuZCBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlcgotCQkJd2FzIGludm9rZWQuCi0KLS15CQktLXNlcGFyYXRlLWZpbGVzCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlOb3JtYWxseSwgZ3Byb2YgcHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZmlsZXMKLQkJCXRvIHN0YW5kYXJkLW91dHB1dC4gIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCWFubm90YXRlZCBzb3VyY2UgZm9yIGEgZmlsZSBuYW1lZCAicGF0aC9maWxlbmFtZSIKLQkJCWlzIGdlbmVyYXRlZCBpbiB0aGUgZmlsZSAiZmlsZW5hbWUtYW5uIi4gIFRoYXQgaXMsCi0JCQlhbm5vdGF0ZWQgb3V0cHV0IGlzIHtcZW0gYWx3YXlzXC99IGdlbmVyYXRlZCBpbgotCQkJZ3Byb2YncyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgQ2FyZSBoYXMgdG8KLQkJCWJlIHRha2VuIGlmIGEgcHJvZ3JhbSBjb25zaXN0cyBvZiBmaWxlcyB0aGF0IGhhdmUKLQkJCWlkZW50aWNhbCBmaWxlbmFtZXMsIGJ1dCBkaXN0aW5jdCBwYXRocy4KLQotLWMJCS0tc3RhdGljLWNhbGwtZ3JhcGgKLQotLXQgbnVtCQktLXRhYmxlLWxlbmd0aD1udW0KLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLQkJCUFmdGVyIGFubm90YXRpbmcgYSBzb3VyY2UgZmlsZSwgZ3Byb2YgZ2VuZXJhdGVzCi0JCQlhbiBleGVjdXRpb24gY291bnQgc3VtbWFyeSBjb25zaXN0aW5nIG9mIGEgdGFibGUKLQkJCW9mIGxpbmVzIHdpdGggdGhlIHRvcCBleGVjdXRpb24gY291bnRzLiAgQnkKLQkJCWRlZmF1bHQsIHRoaXMgdGFibGUgaXMgdGVuIGVudHJpZXMgbG9uZy4KLQkJCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdGFibGUgbGVuZ3RoCi0JCQlvciwgYnkgc3BlY2lmeWluZyBhbiBhcmd1bWVudCB2YWx1ZSBvZiAwLCBpdCBjYW4gYmUKLQkJCXN1cHByZXNzZWQgY29tcGxldGVseS4KLQotLW4gc3ltc3BlYwktLXRpbWU9c3ltc3BlYwotCQkJT25seSBzeW1ib2xzIHNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBhcmUgY29uc2lkZXJlZAotCQkJaW4gdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0JCQlIb3dldmVyLCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgcGVyY2VudGFnZSB0aW1lCi0JCQljb21wdXRhdGlvbiBmb3IgdGhlIGZsYXQgcHJvZmlsZS4KLQkJCUlmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24KLQkJCW9mIGFsbCBzZWxlY3RlZCBzeW1ib2xzIGlzIHVzZWQgaW4gdGltZSBjb21wdXRhdGlvbnMuCi0KLS1OCQktLW5vLXRpbWU9c3ltc3BlYwotCQkJRXhjbHVkZSB0aGUgc3ltYm9scyBzZWxlY3RlZCBieSAic3ltc3BlYyIgZnJvbQotCQkJdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0JCQlIb3dldmVyLCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgcGVyY2VudGFnZSB0aW1lCi0JCQljb21wdXRhdGlvbiBmb3IgdGhlIGZsYXQgcHJvZmlsZS4KLQkJCVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgYW55IC0tdGltZSBvcHRpb25zIGFyZQotCQkJc3BlY2lmaWVkLgotCi0tdyBudW0JCS0td2lkdGg9bnVtCi0JCQlTZXRzIHRoZSBvdXRwdXQgbGluZSB3aWR0aC4gIEN1cnJlbnRseSwgdGhpcyBvcHRpb24KLQkJCWFmZmVjdHMgdGhlIHByaW50aW5nIG9mIHRoZSBjYWxsLWdyYXBoIGZ1bmN0aW9uIGluZGV4Ci0JCQlvbmx5LgotCi0tZQkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLUUJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1mCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tRgkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLWsJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1iCQktLWJyaWVmCi0tZG51bQkJLS1kZWJ1Z1s9bnVtXQotCi0taAkJLS1oZWxwCi0JCQlQcmludHMgYSB1c2FnZSBtZXNzYWdlLgotCi0tTyBuYW1lCQktLWZpbGUtZm9ybWF0PW5hbWUKLQkJCVNlbGVjdHMgdGhlIGZvcm1hdCBvZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGVzLgotCQkJUmVjb2duaXplZCBmb3JtYXRzIGFyZSAiYXV0byIsICJic2QiLCAibWFnaWMiLAotCQkJYW5kICJwcm9mIi4gIFRoZSBsYXN0IG9uZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4KLQkJCUZvcm1hdCAiYXV0byIgYXR0ZW1wdHMgdG8gZGV0ZWN0IHRoZSBmaWxlIGZvcm1hdAotCQkJYXV0b21hdGljYWxseSAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuCi0JCQlJdCBhdHRlbXB0cyB0byByZWFkIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMgYXMKLQkJCSJtYWdpYyIgZmlsZXMgYW5kIGlmIHRoaXMgZmFpbHMsIGZhbGxzIGJhY2sgdG8KLQkJCXRoZSAiYnNkIiBmb3JtYXQuICAiYnNkIiBmb3JjZXMgZ3Byb2YgdG8gcmVhZAotCQkJdGhlIGRhdGEgZmlsZXMgaW4gdGhlIEJTRCBmb3JtYXQuICAibWFnaWMiIGZvcmNlcwotCQkJZ3Byb2YgdG8gcmVhZCB0aGUgZGF0YSBmaWxlcyBpbiB0aGUgIm1hZ2ljIiBmb3JtYXQuCi0KLS1UCQktLXRyYWRpdGlvbmFsCi0tdgkJLS12ZXJzaW9uCi0KLSoqIEZpbGUgRm9ybWF0IENoYW5nZXMKLQotVGhlIG9sZCBCU0QtZGVyaXZlZCBmb3JtYXQgdXNlZCBmb3IgcHJvZmlsZSBkYXRhIGRvZXMgbm90IGNvbnRhaW4gYQotbWFnaWMgY29va2llIHRoYXQgYWxsb3dzIHRvIGNoZWNrIHdoZXRoZXIgYSBkYXRhIGZpbGUgcmVhbGx5IGlzIGEKLWdwcm9mIGZpbGUuICBGdXJ0aGVybW9yZSwgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHZlcnNpb24gbnVtYmVyLCB0aHVzCi1yZW5kZXJpbmcgY2hhbmdlcyB0byB0aGUgZmlsZSBmb3JtYXQgYWxtb3N0IGltcG9zc2libGUuICBHTlUgZ3Byb2YKLXVzZXMgYSBuZXcgZmlsZSBmb3JtYXQgdGhhdCBwcm92aWRlcyB0aGVzZSBmZWF0dXJlcy4gIEZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSwgR05VIGdwcm9mIGNvbnRpbnVlcyB0byBzdXBwb3J0IHRoZSBvbGQgQlNELWRlcml2ZWQKLWZvcm1hdCwgYnV0IG5vdCBhbGwgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCB3aXRoIGl0LiAgRm9yIGV4YW1wbGUsCi1iYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGNhbm5vdCBiZSBhY2NvbW1vZGF0ZWQgYnkgdGhlIG9sZCBmaWxlCi1mb3JtYXQuCi0KLVRoZSBuZXcgZmlsZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZSBcZmlsZXtnbW9uX291dC5ofS4gIEl0Ci1jb25zaXN0cyBvZiBhIGhlYWRlciBjb250YWluaW5nIHRoZSBtYWdpYyBjb29raWUgYW5kIGEgdmVyc2lvbiBudW1iZXIsCi1hcyB3ZWxsIGFzIHNvbWUgc3BhcmUgYnl0ZXMgYXZhaWxhYmxlIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4gIEFsbCBkYXRhCi1pbiBhIHByb2ZpbGUgZGF0YSBmaWxlIGlzIGluIHRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZSBob3N0IG9uIHdoaWNoCi10aGUgcHJvZmlsZSB3YXMgY29sbGVjdGVkLiAgR05VIGdwcm9mIGFkYXB0cyBhdXRvbWF0aWNhbGx5IHRvIHRoZQotYnl0ZS1vcmRlciBpbiB1c2UuCi0KLUluIHRoZSBuZXcgZmlsZSBmb3JtYXQsIHRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZgotcmVjb3Jkcy4gIEN1cnJlbnRseSwgdGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCByZWNvcmQgdHlwZXM6IGhpc3RvZ3JhbQotcmVjb3JkcywgY2FsbC1ncmFwaCBhcmMgcmVjb3JkcywgYW5kIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudAotcmVjb3Jkcy4gIEVhY2ggZmlsZSBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIGVhY2ggcmVjb3JkIHR5cGUuICBXaGVuCi1yZWFkaW5nIGEgZmlsZSwgR05VIGdwcm9mIHdpbGwgZW5zdXJlIHJlY29yZHMgb2YgdGhlIHNhbWUgdHlwZSBhcmUKLWNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGFuZCBjb21wdXRlIHRoZSB1bmlvbiBvZiBhbGwgcmVjb3Jkcy4gIEZvcgotZXhhbXBsZSwgZm9yIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMsIHRoZSB1bmlvbiBpcyBzaW1wbHkgdGhlIHN1bQotb2YgYWxsIGV4ZWN1dGlvbiBjb3VudHMgZm9yIGVhY2ggYmFzaWMtYmxvY2suCi0KLSoqKiBIaXN0b2dyYW0gUmVjb3JkcwotCi1IaXN0b2dyYW0gcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIHRoYXQgaXMgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YKLWJpbnMuICBUaGUgaGVhZGVyIGNvbnRhaW5zIHRoZSB0ZXh0LXNlZ21lbnQgcmFuZ2UgdGhhdCB0aGUgaGlzdG9ncmFtCi1zcGFucywgdGhlIHNpemUgb2YgdGhlIGhpc3RvZ3JhbSBpbiBieXRlcyAodW5saWtlIGluIHRoZSBvbGQgQlNECi1mb3JtYXQsIHRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyKSwgdGhlIHJhdGUgb2YgdGhlCi1wcm9maWxpbmcgY2xvY2ssIGFuZCB0aGUgcGh5c2ljYWwgZGltZW5zaW9uIHRoYXQgdGhlIGJpbiBjb3VudHMKLXJlcHJlc2VudCBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlIHByb2ZpbGluZyBjbG9jayByYXRlLiAgVGhlCi1waHlzaWNhbCBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHR3byBwYXJ0czogYSBsb25nIG5hbWUgb2YgdXAgdG8gMTUKLWNoYXJhY3RlcnMgYW5kIGEgc2luZ2xlIGNoYXJhY3RlciBhYmJyZXZpYXRpb24uICBGb3IgZXhhbXBsZSwgYQotaGlzdG9ncmFtIHJlcHJlc2VudGluZyByZWFsLXRpbWUgd291bGQgc3BlY2lmeSB0aGUgbG9uZyBuYW1lIGFzCi0ic2Vjb25kcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24gYXMgInMiLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IKLWFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IHBlcmZvcm1hbmNlIG1vbml0b3IgaGFyZHdhcmUgKHdoaWNoLAotZm9ydHVuYXRlbHksIGlzIGJlY29taW5nIGluY3JlYXNpbmdseSBjb21tb24pLiAgRm9yIGV4YW1wbGUsIHVuZGVyIERFQwotT1NGLzEsIHRoZSAidXByb2ZpbGUiIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZSBhIGhpc3RvZ3JhbSBvZiwKLXNheSwgaW5zdHJ1Y3Rpb24gY2FjaGUgbWlzc2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGltZW5zaW9uIGluIHRoZQotaGlzdG9ncmFtIGhlYWRlciBjb3VsZCBiZSBzZXQgdG8gImktY2FjaGUgbWlzc2VzIiBhbmQgdGhlIGFiYnJldmlhdGlvbgotY291bGQgYmUgc2V0IHRvICIxIiAoYmVjYXVzZSBpdCBpcyBzaW1wbHkgYSBjb3VudCwgbm90IGEgcGh5c2ljYWwKLWRpbWVuc2lvbikuICBBbHNvLCB0aGUgcHJvZmlsaW5nIHJhdGUgd291bGQgaGF2ZSB0byBiZSBzZXQgdG8gMSBpbgotdGhpcyBjYXNlLgotCi1IaXN0b2dyYW0gYmlucyBhcmUgMTYtYml0IG51bWJlcnMgYW5kIGVhY2ggYmluIHJlcHJlc2VudCBhbiBlcXVhbAotYW1vdW50IG9mIHRleHQtc3BhY2UuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRleHQtc2VnbWVudCBpcyBvbmUKLXRob3VzYW5kIGJ5dGVzIGxvbmcgYW5kIGlmIHRoZXJlIGFyZSB0ZW4gYmlucyBpbiB0aGUgaGlzdG9ncmFtLCBlYWNoCi1iaW4gcmVwcmVzZW50cyBvbmUgaHVuZHJlZCBieXRlcy4KLQotCi0qKiogQ2FsbC1HcmFwaCBSZWNvcmRzCi0KLUNhbGwtZ3JhcGggcmVjb3JkcyBoYXZlIGEgZm9ybWF0IHRoYXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdXNlZCBpbgotdGhlIEJTRC1kZXJpdmVkIGZpbGUgZm9ybWF0LiAgSXQgY29uc2lzdHMgb2YgYW4gYXJjIGluIHRoZSBjYWxsIGdyYXBoCi1hbmQgYSBjb3VudCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFyYyB3YXMgdHJhdmVyc2VkCi1kdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24uICBBcmNzIGFyZSBzcGVjaWZpZWQgYnkgYSBwYWlyIG9mIGFkZHJlc3NlczoKLXRoZSBmaXJzdCBtdXN0IGJlIHdpdGhpbiBjYWxsZXIncyBmdW5jdGlvbiBhbmQgdGhlIHNlY29uZCBtdXN0IGJlCi13aXRoaW4gdGhlIGNhbGxlZSdzIGZ1bmN0aW9uLiAgV2hlbiBwZXJmb3JtaW5nIHByb2ZpbGluZyBhdCB0aGUKLWZ1bmN0aW9uIGxldmVsLCB0aGVzZSBhZGRyZXNzZXMgY2FuIHBvaW50IGFueXdoZXJlIHdpdGhpbiB0aGUKLXJlc3BlY3RpdmUgZnVuY3Rpb24uICBIb3dldmVyLCB3aGVuIHByb2ZpbGluZyBhdCB0aGUgbGluZS1sZXZlbCwgaXQgaXMKLWJldHRlciBpZiB0aGUgYWRkcmVzc2VzIGFyZSBhcyBjbG9zZSB0byB0aGUgY2FsbC1zaXRlL2VudHJ5LXBvaW50IGFzCi1wb3NzaWJsZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbGluZS1sZXZlbCBjYWxsLWdyYXBoIGlzIGFibGUgdG8KLWlkZW50aWZ5IGV4YWN0bHkgd2hpY2ggbGluZSBvZiBzb3VyY2UgY29kZSBwZXJmb3JtZWQgY2FsbHMgdG8gYQotZnVuY3Rpb24uCi0KLSoqKiBCYXNpYy1CbG9jayBFeGVjdXRpb24gQ291bnQgUmVjb3JkcwotCi1CYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQgcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIGZvbGxvd2VkIGJ5IGEKLXNlcXVlbmNlIG9mIGFkZHJlc3MvY291bnQgcGFpcnMuICBUaGUgaGVhZGVyIHNpbXBseSBzcGVjaWZpZXMgdGhlCi1sZW5ndGggb2YgdGhlIHNlcXVlbmNlLiAgSW4gYW4gYWRkcmVzcy9jb3VudCBwYWlyLCB0aGUgYWRkcmVzcwotaWRlbnRpZmllcyBhIGJhc2ljLWJsb2NrIGFuZCB0aGUgY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMKLXRoYXQgYmFzaWMtYmxvY2sgd2FzIGV4ZWN1dGVkLiAgQW55IGFkZHJlc3Mgd2l0aGluIHRoZSBiYXNpYy1hZGRyZXNzIGNhbgotYmUgdXNlZC4KLQotSU1QTEVNRU5UQVRJT04gTk9URTogZ2NjIC1hIGNhbiBiZSB1c2VkIHRvIGluc3RydW1lbnQgYSBwcm9ncmFtIHRvCi1yZWNvcmQgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cy4gIEhvd2V2ZXIsIHRoZSBfX2JiX2V4aXRfZnVuYygpCi10aGF0IGlzIGN1cnJlbnRseSBwcmVzZW50IGluIGxpYmdjYzIuYyBkb2VzIG5vdCBnZW5lcmF0ZSBhIGdtb24ub3V0Ci1maWxlIGluIGEgc3VpdGVhYmxlIGZvcm1hdC4gIFRoaXMgc2hvdWxkIGJlIGZpeGVkIGZvciBmdXR1cmUgcmVsZWFzZXMKLW9mIGdjYy4gIEluIHRoZSBtZWFudGltZSwgY29udGFjdCBkYXZpZG1AY3MuYXJpem9uYS5lZHUgZm9yIGEgdmVyc2lvbgotb2YgX19iYl9leGl0X2Z1bmMoKSB0byBpcyBhcHByb3ByaWF0ZS4KZGlmZiAtLWdpdCBhL2dwcm9mL1RFU1QgYi9ncHJvZi9URVNUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE5MDMwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL1RFU1QKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS0gY2hlY2sgd2hldGhlciBvbGQgZmlsZSBmb3JtYXQgaXMgcHJvcGVybHkgcmVhZCB3aGVuIGlucHV0IGNvbWVzIGZyb20KLSAgc3RkaW4KLQotLSBjaGVjayB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSBwcm9wZXJseSBkZWFsdCB3aXRoIChib3RoLCBvbiBzeXN0ZW1zCi0gIHRoYXQgcHJlcGVuZCB0aGVtIHRvIGVhY2ggQyBuYW1lIGFuZCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QpCi0KLS0gZW5zdXJlIGdwcm9mIGZhaWxzIGdyYWNlZnVsbHkgd2hlbiBubyBkZWJ1Z2dpbmcgaW5mbyBhdmFpbGFibGUKZGlmZiAtLWdpdCBhL2dwcm9mL1RPRE8gYi9ncHJvZi9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDExMWM2Li4wMDAwMDAwCi0tLSBhL2dwcm9mL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0KLS0gZ21vbl9pby5jIGNhbm5vdCBkZWFsIHdpdGggdGFyZ2V0IGFyY2hpdGVjdHVyZSB0aGF0IGhhdmUgYSBwb2ludGVyIHNpemUKLSAgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgaG9zdCBhcmNoaXRlY3R1cmVzIHBvaW50ZXIgc2l6ZS0tLWZpeCB0aGlzCi0gIChnbW9uX291dC5oLCBhbmQgZ21vbl9pby5jKQotLSBhZGQgc3VwcG9ydCBmb3IgcHJvZiBmaWxlIGZvcm1hdCBzbyB0aGF0IHByb2YgZmlsZXMgY2FuIGJlIGRpc3BsYXllZAotICBhdCB0aGUgbGluZS1sZXZlbCAodGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB1cHJvZmlsZSB0b29sIHVuZGVyIERFQydzCi0gIE9TRi8xKQotLSB0YWtlIGEgaGFyZCBsb29rIGF0IC0tZmlsZS1vcmRlcmluZyAoYnJva2VuKSBhbmQgLS1mdW5jdGlvbi1vcmRlcmluZwotCi0rIGRvY3VtZW50YXRpb24KLSsgb3B0aW1pemUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lX251bSgpIChvciByZXBsYWNlIGJ5IGRpZmZlcmVudCBpbnRlcmZhY2UpCi0rIGNsZWFudXAgX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZV9udW0oKSBmaXhlcyAmIGRlc2NyaXB0aW9uCi0rIGVuc3VyZSAiY2MgLXBnIiBwcm9kdWNlcyBnb29kIGZpbGVzIHVuZGVyIE9TRi8xIHYzLjAKLSsgbWFrZSBzdXJlIGdwcm9mIHdvcmtzIHRvZ2V0aGVyIHdpdGggT1NGLzEgdjMuMCdzIHByb2ZpbGluZyBsaWJyYXJpZXMKLSsgaW1wbGVtZW50IHN5bXRhYl9wYXJzZSgpOyBtb2RpZnkgc3ltX2xvb2t1cCgpIHRvIGNvbnNpZGVyIGFkZHJfaGlnaAotKyBjaGFuZ2UgZ3Byb2YuYyB0byBjb2xsZWN0IGxpc3RzLCB0aGVuIGludm9rZSBzeW10YWJfcGFyc2UoKSBmb3IKLSAgZWFjaCBsaXN0Ci0rIFF1ZXN0aW9uczoKLQlvIGlzIC1jICgtLXN0YXRpYy1jYWxsLWdyYXBoKSB1c2VmdWwgYXQgYWxsPyAgaSBjYW4ndCBzZWUKLQkgIGhvdzsgaWYgaXQgd2VyZSBkZWxldGVkLCBncHJvZiB3b3VsZCBiZSBjb21wbGV0ZWx5IG1hY2hpbmUKLQkgIGluZGVwZW5kZW50ID0+IHl1cCwgaXQgaXMKLQlvIGFyZSAobG9uZykgb3B0aW9uIG5hbWVzIGFwcHJvcHJpYXRlPwotCW8gLWsgKC0tZXhjbHVkZS1hcmMpIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCB3aXRoIGdldG9wdCgpOwotCSAgaXMgbmV3IHN5bnRheCAoLWsgZnJvbS90bykgYWNjZXB0YWJsZT8gIElmIG5vdCwgaG93IHRvCi0JICBmaXggaXQ/Ci0JbyBpbiB0aGUgRlNGIG91dHB1dCwgdGhlIGNhbGwtZ3JhcGggaW5kZXggbm93IHByaW50cwotCSAgdGhlIGZpbGVuYW1lIG9mIHN0YXRpYyBmdW5jdGlvbnMgaW4gcGFyZW50aGVzZXM7IGUuZy4sCi0JICBzdGF0aWMgZnVuY3Rpb24gZm9vKCkgdGhhdCBpcyBkZWZpbmVkIGluIGZpbGUgYmFyLmMKLQkgIHdvdWxkIGJlIHByaW50ZWQgYXM6Ci0KLQkJCVs0XSBmb28gKGJhci5jKQotCi0JICBpcyB0aGlzIGFjY2VwdGFibGU/ICBzaG91bGQgaXQgYmUgZG9uZSBvbmx5IG9wdGlvbmFsbHk/Ci0JbyBzeW1ib2xzIHdpdGggYWRkcmVzc2VzIHRoYXQgbWFwIGJhY2sgdG8gYSBkaWZmZXJlbnQKLQkgIG5hbWUgYXJlIHN1cHByZXNzZWQgKGhhcHBlbnMgd2l0aCBsYWJlbHMsIGZvciBleGFtcGxlKTsKLQkgIGlzIHRoaXMgYWNjZXB0YWJsZT8gIHNob3VsZCBpdCBiZSBkb25lIG9ubHkgb3B0aW9uYWxseT8KLSsgZ2VuZXJhbGl6ZSB0byBhbGxvdyBhcmJpdHJhcnkgaGlzdG9ncmFtcyAobm90IGp1c3QgdGltZSBoaXN0b2dyYW1zKQotKyBiYXNpYy1ibG9jayBpbmZvcm1hdGlvbiBjdXJyZW50bHkgcmVwbGFjZXMgYWxsIHN5bWJvbHMgY3JlYXRlZCBmcm9tCi0gIHRoZSBjb3JlIGJlY2F1c2Ugb2YgYW4gdWdseSBvcmRlcmluZyBjb25mbGljdC0tLWZvciBub3csIHRoZSBjdXJyZW50Ci0gIHNvbHV0aW9uIHdvcmtzLCBidXQgc29tZXRoaW5nIGNsZWFuZXIgaXMgZGVzaXJhYmxlID09PiBjbGVhbmVkIHVwLAotICBidXQgaXQncyBzbG93ZXIgbm93Ci0rIGNvbnZlcnQgdG8gdmVyeSBuZXcgZmlsZSBmb3JtYXQgKGJhY2sgdG8gdHJpdmlhbCBmb3JtYXQsIHRoYXQgaXMgOikKLSsgcmVwbGFjZSAiZHVtbXkuaCIgZm9yIEFscGhhIChpZiB0aGVyZSBpcyBhbnkgdXNlIHRvIGl0KQotKyBhZGQgc3VwcG9ydCBmb3IgZXhlY3V0aW9uIHRpbWUgcHJvZmlsaW5nIGF0IGEgYmFzaWMtYmxvY2sgbGV2ZWwKLSsgZml4IGZpbGVuYW1lLW9mZi1ieS1vbmUgYnVnIGZvciBBbHBoYSAoc2VlIH4vdG1wL2QuW2NoXSktLS1ubyBsb25nZXIKLSAgcmVsZXZhbnQKLSsgIi1wZyAtYSIgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkIGJlY2F1c2UgbWNsZWFudXAoKSB3aWxsIG92ZXJ3cml0ZQotICB0aGUgZmlsZSBnZW5lcmF0ZWQgYnkgX19iYl9leGl0X2Z1bmMoKSAob3IgdmljZSB2ZXJzYSkKLSsgZmlyc3QgYmFzaWMtYmxvY2sgb2YgZmFjKCkgc2VlbXMgdG8gZ2V0IGNyZWRpdGVkIHRvIGxhc3QgYmFzaWMtYmxvY2sKLSAgb2YgcHJldmlvdXMgZnVuY3Rpb24gPT4gYnVnIGluIGJhc2ljX2Jsb2Nrcy5jCi0rIGZsYXQgcHJvZmlsZSBzaG91bGQgcHJvdmlkZSBhdXRvbWF0aWMgc2NhbGluZyBmb3IgcGVyLWNhbGwgdGltZXMgYmVjYXVzZQotICBvdGhlcndpc2UgdGhleSdsbCBhbHdheXMgYmUgemVybyBvbiBhIGZhc3QgbWFjaGluZSB3aXRoIHRvbnMgb2Ygc21hbGwKLSAgZnVuY3Rpb25zCi0rIG1ha2UgIi1hIiBpbXBseSB0byByZXRhaW4gbGluZSBudW1iZXIgaW5mbyAod2l0aG91dCBhY3R1YWxseSBnZW5lcmF0aW5nCi0gIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKHVubGVzcyAtZyBpcyBzcGVjaWZpZWQpLS0tbm8sIHRoaXMgaXMgYQotICBiYWQgaWRlYSwgYmVjYXVzZSBpdCBpcyBub3QgY2xlYXIgd2hhdCBsZXZlbCBvZiBkZWJ1Z2dpbmcgaW5mbyBzaG91bGQKLSAgYmUgcmVxdWVzdGVkIChlLmcuLCAtZyB2cy4gLWczKTsgbGVhdmluZyBpdCB1cCB0byB0aGUgdXNlciBzZWVtcyBiZXN0Ci0rIGFkZCBsb25nIG9wdGlvbnMgc3VwcG9ydCAob3IgYXQgbGVhc3QgdXNlIGdldG9wdCBpbnN0ZWFkIG9mIGFkLWhvYwotICBpbXBsZW1lbnRhdGlvbikKLSsgc3BsaXQgaW50byBmaWxlcyBhY2NvcmRpbmcgdG8gYWJzdHJhY3Qgb2JqZWN0cyB0aGF0IGFyZSBtYW5pcHVsYXRlZAotKyByZXBsYWNlIHNjY3NpZCBieSByY3NpZCAmIGFkZCAiZW5kIG9mIC4uLiIgdG8gZXZlcnkgLmMgZmlsZQotKyB1c2UgREJHKCkgZXZlcnl3aGVyZQotKyBmaXggc3BhY2luZyAoIiAsIiAtPiAiLCIgZXRjLikKLSsgdXNlIERFRlVOcyBldmVyeXdoZXJlCi0rIG1ha2UgY29tcGlsZSBjbGVhbmx5IHdpdGggLVdhbGwKLSsgImdjYyAtcGcgLU8yIiBkb2Vzbid0IHdvcmsgb24gdGVjYy5jIHVubGVzcyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciBpcwotICBzcGVjaWZpZWQ7IGZpbmQgb3V0IHdoeQotKyBtYWtlIHRoaW5ncyBwb3J0YWJsZSAocHJvdG90eXBlcywgY29uc3QsIGV0Yy4pCi0rIGlmIE5FV19HTU9OX09VVCBpcyBub3QgZGVmaW5lZCwgaGF2ZSBhIGZsYWcgdGhhdCB3aWxsIGFsbG93IHRvCi0gIHJlYWQgbmV3IGdtb24ub3V0IHN0eWxlIGZpbGVzLiAgVGhlIGlkZWEgYmVpbmcgdGhhdCBldmVyeW9uZQotICB3aWxsIHVzZSB0aGUgbmV3IGZvcm1hdCBmb3IgYmFzaWMtYmxvY2sgc3R5bGUgcHJvZmlsaW5nIGJ1dAotICB0aGUgb2xkIGZvcm1hdCBmb3IgcmVndWxhciBncHByb2ZpbGluZwpkaWZmIC0tZ2l0IGEvZ3Byb2YvYWNsb2NhbC5tNCBiL2dwcm9mL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjAxMjIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMDkgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgMzUgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotQUNfQ0FDSEVfTE9BRAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotXSkKLQotQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKLVtBQ19QUkVSRVEoMi4xMylkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nXSwKLW5lZWRfbG9ja3M9JGVuYWJsZXZhbCwKLW5lZWRfbG9ja3M9eWVzKQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLV0pCi0KLSMgQUNfTElCVE9PTF9ETE9QRU4gLSBjaGVjayBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbbHRfZGxvcGVuPXllc10pCi0KLSMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwKLVtBQ19FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywKLVtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywKLVtBQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLAotW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwKLVtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1NVQlNUKExEKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBQ19TWVNfTk1fUEFSU0UgLSBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQKLSMgYnkgQyBzeW1ib2wgbmFtZSBmcm9tIG5tLgotQUNfREVGVU4oQUNfU1lTX05NX1BBUlNFLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlLAotWyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotY2hhbmdlcXVvdGUoLClkbmwKLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRhY19zeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotY2hhbmdlcXVvdGUoLClkbmwKLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotY2hhbmdlcXVvdGUoWyxdKWRubAotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotQUNfTVNHX1JFU1VMVCgkYWNfcmVzdWx0KQotXSkKLQotIyBBQ19TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFDX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUgLSBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiB1bmRlcnNjb3JlPwotQUNfREVGVU4oQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSwKLVthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotZmkKLXJtIC1yZiBjb25mdGVzdCoKLV0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCi1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci1BQ19TVUJTVChVU0VfU1lNQk9MX1VOREVSU0NPUkUpZG5sCi1dKQotCi0jIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihBQ19DSEVDS19MSUJNLCBbCi1BQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsKQotQUNfQ0hFQ0tfTElCKG0sIGNvcykKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgWwotICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgWwotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwgTElCTFRETD0iLWxsdGRsIiwgWwotICAgIGNhc2UgIiRlbmFibGVfbHRkbF9pbnN0YWxsIiBpbgotICAgIG5vKSBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkgOzsKLSAgICAiIikgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiIDs7Ci0gICAgZXNhYwotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHgibm8iOyB0aGVuCi0gICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKLSAgZmkKLV0pCi0KLWRubCBvbGQgbmFtZXMKLUFDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19OTV9QQVJTRSwgW2luZGlyKFtBQ19TWVNfTk1fUEFSU0VdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfU1lNQk9MX1VOREVSU0NPUkUsIFtpbmRpcihbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLCBbaW5kaXIoW0FDX1NZU19MSUJUT09MX0NZR1dJTl0pXSlkbmwKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYWxwaGEuYyBiL2dwcm9mL2FscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWQ3NGQuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk4IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0vKgotICogT3Bjb2RlcyBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbnM6Ci0gKi8KLSNkZWZpbmUgT1BfSnh4CTB4MWEKLSNkZWZpbmUJT1BfQlNSCTB4MzQKLQotI2RlZmluZSBKeHhfRlVOQ19KTVAJCTAKLSNkZWZpbmUgSnh4X0ZVTkNfSlNSCQkxCi0jZGVmaW5lIEp4eF9GVU5DX1JFVAkJMgotI2RlZmluZSBKeHhfRlVOQ19KU1JfQ09ST1VUSU5FCTMKLQotdHlwZWRlZiB1bmlvbgotICB7Ci0gICAgc3RydWN0Ci0gICAgICB7Ci0JdW5zaWduZWQgb3RoZXI6MjY7Ci0JdW5zaWduZWQgb3BfY29kZTo2OwotICAgICAgfQotICAgIGE7CQkJCS8qIGFueSBmb3JtYXQgKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlpbnQgZGlzcDoyMTsKLQl1bnNpZ25lZCByYTo1OwotCXVuc2lnbmVkIG9wX2NvZGU6NjsKLSAgICAgIH0KLSAgICBiOwkJCQkvKiBicmFuY2ggZm9ybWF0ICovCi0gICAgc3RydWN0Ci0gICAgICB7Ci0JaW50IGhpbnQ6MTQ7Ci0JdW5zaWduZWQgZnVuYzoyOwotCXVuc2lnbmVkIHJiOjU7Ci0JdW5zaWduZWQgcmE6NTsKLQl1bnNpZ25lZCBvcF9jb2RlOjY7Ci0gICAgICB9Ci0gICAgajsJCQkJLyoganVtcCBmb3JtYXQgKi8KLSAgfQotYWxwaGFfSW5zdHJ1Y3Rpb247Ci0KLXN0YXRpYyBTeW0gaW5kaXJlY3RfY2hpbGQ7Ci0KLQotLyoKLSAqIE9uIHRoZSBBbHBoYSB3ZSBjYW4gb25seSBkZXRlY3QgUEMgcmVsYXRpdmUgY2FsbHMsIHdoaWNoIGFyZQotICogdXN1YWxseSBnZW5lcmF0ZWQgZm9yIGNhbGxzIHRvIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIHNhbWUKLSAqIG9iamVjdCBmaWxlIG9ubHkuICBUaGlzIGlzIHN0aWxsIGJldHRlciB0aGFuIG5vdGhpbmcsIGhvd2V2ZXIuCi0gKiAoSW4gcGFydGljdWxhciBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZmluZCBmdW5jdGlvbnMgdGhhdAotICogIHBvdGVudGlhbGx5IGNhbGwgaW50ZWdlciBkaXZpc2lvbiByb3V0aW5lcywgZm9yIGV4YW1wbGUuKQotICovCi12b2lkCi1hbHBoYV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHN0YXRpYyBiZmRfdm1hIGRlbHRhID0gMDsKLSAgYmZkX3ZtYSBkZXN0X3BjOwotICBhbHBoYV9JbnN0cnVjdGlvbiAqcGM7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgaWYgKCFkZWx0YSkKLSAgICB7Ci0gICAgICBkZWx0YSA9IChiZmRfdm1hKSBjb3JlX3RleHRfc3BhY2UgLSBjb3JlX3RleHRfc2VjdC0+dm1hOwotCi0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0X2NoaWxkKTsKLSAgICAgIGluZGlyZWN0X2NoaWxkLm5hbWUgPSBfKCI8aW5kaXJlY3QgY2hpbGQ+Iik7Ci0gICAgICBpbmRpcmVjdF9jaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RfY2hpbGQuY2cuY3ljLmhlYWQgPSAmaW5kaXJlY3RfY2hpbGQ7Ci0gICAgfQotCi0gIGlmICghY29yZV90ZXh0X3NwYWNlKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmIChfKCJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIpLAotCQkJICBwYXJlbnQtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwX2xvd3BjLAotCQkJICAodW5zaWduZWQgbG9uZykgcF9oaWdocGMpKTsKLSAgZm9yIChwYyA9IChhbHBoYV9JbnN0cnVjdGlvbiAqKSAocF9sb3dwYyArIGRlbHRhKTsKLSAgICAgICBwYyA8IChhbHBoYV9JbnN0cnVjdGlvbiAqKSAocF9oaWdocGMgKyBkZWx0YSk7Ci0gICAgICAgKytwYykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHBjLT5hLm9wX2NvZGUpCi0JewotCWNhc2UgT1BfSnh4OgotCSAgLyoKLQkgICAqIFRoZXJlIGlzIG5vIHNpbXBsZSBhbmQgcmVsaWFibGUgd2F5IHRvIGRldGVybWluZSB0aGUKLQkgICAqIHRhcmdldCBvZiBhIGpzciAodGhlIGhpbnQgYml0cyBoZWxwLCBidXQgdGhlcmUgYXJlbid0Ci0JICAgKiBlbm91Z2ggYml0cyB0byBnZXQgYSBzYXRpc2ZhY3RvcnkgaGl0IHJhdGUpLiAgSW5zdGVhZCwKLQkgICAqIGZvciBhbnkgaW5kaXJlY3QganVtcCB3ZSBzaW1wbHkgYWRkIGFuIGFyYyBmcm9tIFBBUkVOVAotCSAgICogdG8gSU5ESVJFQ1RfQ0hJTEQtLS10aGF0IHdheSB0aGUgdXNlciBpdCBhdCBsZWFzdCBhYmxlCi0JICAgKiB0byBzZWUgdGhhdCB0aGVyZSBhcmUgb3RoZXIgY2FsbHMgYXMgd2VsbC4KLQkgICAqLwotCSAgaWYgKHBjLT5qLmZ1bmMgPT0gSnh4X0ZVTkNfSlNSCi0JICAgICAgfHwgcGMtPmouZnVuYyA9PSBKeHhfRlVOQ19KU1JfQ09ST1VUSU5FKQotCSAgICB7Ci0JICAgICAgREJHIChDQUxMREVCVUcsCi0JCSAgIHByaW50ZiAoXygiW2ZpbmRfY2FsbF0gMHglbHg6IGpzciVzIDxpbmRpcmVjdF9jaGlsZD5cbiIpLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIHBjIC0gZGVsdGEsCi0JCQkgICBwYy0+ai5mdW5jID09IEp4eF9GVU5DX0pTUiA/ICIiIDogIl9jb3JvdXRpbmUiKSk7Ci0JICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RfY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIE9QX0JTUjoKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKF8oIltmaW5kX2NhbGxdIDB4JWx4OiBic3IiKSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBwYyAtIGRlbHRhKSk7Ci0JICAvKgotCSAgICogUmVndWxhciBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nLiAgQ2hlY2sgdGhhdCB0aGlzIGlzIHRoZQotCSAgICogYWRkcmVzcyBvZiBhIGZ1bmN0aW9uLiAgVGhlIGxpbmtlciBzb21ldGltZXMgcmVkaXJlY3RzCi0JICAgKiB0aGUgZW50cnkgcG9pbnQgYnkgOCBieXRlcyB0byBza2lwIGxvYWRpbmcgdGhlIGdsb2JhbAotCSAgICogcG9pbnRlciwgc28gd2UgYWxsIGZvciBlaXRoZXIgYWRkcmVzczoKLQkgICAqLwotCSAgZGVzdF9wYyA9ICgoYmZkX3ZtYSkgKHBjICsgMSArIHBjLT5iLmRpc3ApKSAtIGRlbHRhOwotCSAgaWYgKGRlc3RfcGMgPj0gc19sb3dwYyAmJiBkZXN0X3BjIDw9IHNfaGlnaHBjKQotCSAgICB7Ci0JICAgICAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0X3BjKTsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmICgiIDB4JWx4XHQ7IG5hbWU9JXMsIGFkZHI9MHglbHgiLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGRlc3RfcGMsIGNoaWxkLT5uYW1lLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT5hZGRyKSk7Ci0JICAgICAgaWYgKGNoaWxkLT5hZGRyID09IGRlc3RfcGMgfHwgY2hpbGQtPmFkZHIgPT0gZGVzdF9wYyAtIDgpCi0JCXsKLQkJICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXG4iKSk7Ci0JCSAgLyogYSBoaXQ6ICAqLwotCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICAvKgotCSAgICogU29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmMgYi9ncHJvZi9iYXNpY19ibG9ja3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkZDc2MmIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotLyoKLSAqIEJhc2ljLWJsb2NrIGxldmVsIHJlbGF0ZWQgY29kZTogcmVhZGluZy93cml0aW5nIG9mIGJhc2ljLWJsb2NrIGluZm8KLSAqIHRvL2Zyb20gZ21vbi5vdXQ7IGNvbXB1dGluZyBhbmQgZm9ybWF0dGluZyBvZiBiYXNpYy1ibG9jayByZWxhdGVkCi0gKiBzdGF0aXN0aWNzLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJiYXNpY19ibG9ja3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic291cmNlLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotCi0KLS8qCi0gKiBEZWZhdWx0IG9wdGlvbiB2YWx1ZXM6Ci0gKi8KLWJvb2wgYmJfYW5ub3RhdGVfYWxsX2xpbmVzID0gRkFMU0U7Ci11bnNpZ25lZCBsb25nIGJiX21pbl9jYWxscyA9IDE7Ci1pbnQgYmJfdGFibGVfbGVuZ3RoID0gMTA7Ci0KLS8qCi0gKiBWYXJpYWJsZXMgdXNlZCB0byBjb21wdXRlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZyBzdGF0czoKLSAqLwotc3RhdGljIGxvbmcgbnVtX2V4ZWN1dGFibGVfbGluZXM7Ci1zdGF0aWMgbG9uZyBudW1fbGluZXNfZXhlY3V0ZWQ7Ci0KLQotLyoKLSAqIEhlbHBlciBmb3Igc29ydGluZy4gIENvbXBhcmVzIHR3byBzeW1ib2xzIGFuZCByZXR1cm5zIHJlc3VsdAotICogc3VjaCB0aGF0IHNvcnRpbmcgd2lsbCBiZSBpbmNyZWFzaW5nIGFjY29yZGluZyB0byBmaWxlbmFtZSwgbGluZQotICogbnVtYmVyLCBhbmQgYWRkcmVzcyAoaW4gdGhhdCBvcmRlcikuCi0gKi8KLQotc3RhdGljIGludAotREVGVU4gKGNtcF9iYiwgKGxwLCBycCksIGNvbnN0IHZvaWQgKmxwIEFORCBjb25zdCB2b2lkICpycCkKLXsKLSAgaW50IHI7Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLQotICBpZiAobGVmdC0+ZmlsZSAmJiByaWdodC0+ZmlsZSkKLSAgICB7Ci0gICAgICByID0gc3RyY21wIChsZWZ0LT5maWxlLT5uYW1lLCByaWdodC0+ZmlsZS0+bmFtZSk7Ci0gICAgICBpZiAocikKLQl7Ci0JICByZXR1cm4gcjsKLQl9Ci0KLSAgICAgIGlmIChsZWZ0LT5saW5lX251bSAhPSByaWdodC0+bGluZV9udW0pCi0JewotCSAgcmV0dXJuIGxlZnQtPmxpbmVfbnVtIC0gcmlnaHQtPmxpbmVfbnVtOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxlZnQtPmFkZHIgPCByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlIGlmIChsZWZ0LT5hZGRyID4gcmlnaHQtPmFkZHIpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBIZWxwZXIgZm9yIHNvcnRpbmcuICBPcmRlciBiYXNpYyBibG9ja3MgaW4gZGVjcmVhc2luZyBudW1iZXIgb2YKLSAqIGNhbGxzLCB0aWVzIGFyZSBicm9rZW4gaW4gaW5jcmVhc2luZyBvcmRlciBvZiBsaW5lIG51bWJlcnMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfbmNhbGxzLCAobHAsIHJwKSwgY29uc3Qgdm9pZCAqbHAgQU5EIGNvbnN0IHZvaWQgKnJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0KLSAgaWYgKCFsZWZ0KQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAoIXJpZ2h0KQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGxlZnQtPm5jYWxscyA8IHJpZ2h0LT5uY2FsbHMpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGxlZnQtPm5jYWxscyA+IHJpZ2h0LT5uY2FsbHMpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBsZWZ0LT5saW5lX251bSAtIHJpZ2h0LT5saW5lX251bTsKLX0KLQotCi0vKgotICogU2tpcCBvdmVyIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZnNraXBfc3RyaW5nLCAoZnApLCBGSUxFICogZnApCi17Ci0gIGludCBjaDsKLQotICB3aGlsZSAoKGNoID0gZmdldGMgKGZwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGlmIChjaCA9PSAnXDAnKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIFJlYWQgYSBiYXNpYy1ibG9jayByZWNvcmQgZnJvbSBmaWxlIElGUC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lCi0gKiBvZiBmaWxlIElGUCBhbmQgaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGJiX3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBpbnQgbmJsb2NrcywgYjsKLSAgYmZkX3ZtYSBhZGRyOwotICB1bnNpZ25lZCBsb25nIG5jYWxsczsKLSAgU3ltICpzeW07Ci0KLSAgaWYgKGZyZWFkICgmbmJsb2Nrcywgc2l6ZW9mIChuYmxvY2tzKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iKSwgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgbmJsb2NrcyA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJiBuYmxvY2tzKTsKLSAgaWYgKGdtb25fZmlsZV92ZXJzaW9uID09IDApCi0gICAgewotICAgICAgZnNraXBfc3RyaW5nIChpZnApOwotICAgIH0KLQotICBmb3IgKGIgPSAwOyBiIDwgbmJsb2NrczsgKytiKQotICAgIHsKLSAgICAgIGlmIChnbW9uX2ZpbGVfdmVyc2lvbiA9PSAwKQotCXsKLQkgIGludCBsaW5lX251bTsKLQkgIC8qCi0JICAgKiBWZXJzaW9uIDAgaGFkIGxvdHMgb2YgZXh0cmEgc3R1ZmYgdGhhdCB3ZSBkb24ndAotCSAgICogY2FyZSBhYm91dCBhbnltb3JlLgotCSAgICovCi0JICBpZiAoKGZyZWFkICgmbmNhbGxzLCBzaXplb2YgKG5jYWxscyksIDEsIGlmcCkgIT0gMSkKLQkgICAgICB8fCAoZnJlYWQgKCZhZGRyLCBzaXplb2YgKGFkZHIpLCAxLCBpZnApICE9IDEpCi0JICAgICAgfHwgKGZza2lwX3N0cmluZyAoaWZwKSwgRkFMU0UpCi0JICAgICAgfHwgKGZza2lwX3N0cmluZyAoaWZwKSwgRkFMU0UpCi0JICAgICAgfHwgKGZyZWFkICgmbGluZV9udW0sIHNpemVvZiAobGluZV9udW0pLCAxLCBpZnApICE9IDEpKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZyZWFkICgmYWRkciwgc2l6ZW9mIChhZGRyKSwgMSwgaWZwKSAhPSAxCi0JICAgICAgfHwgZnJlYWQgKCZuY2FsbHMsIHNpemVvZiAobmNhbGxzKSwgMSwgaWZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBCYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGFyZSBtZWFuaW5nZnVsIG9ubHkgaWYgd2UncmUKLSAgICAgICAqIHByb2ZpbGluZyBhdCB0aGUgbGluZS1ieS1saW5lIGxldmVsOgotICAgICAgICovCi0gICAgICBpZiAobGluZV9ncmFudWxhcml0eSkKLQl7Ci0KLQkgIC8qIGNvbnZlcnQgZnJvbSB0YXJnZXQgdG8gaG9zdCBlbmRpYW5uZXNzOiAqLwotCi0JICBhZGRyID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIGFkZHIpOwotCSAgbmNhbGxzID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmbmNhbGxzKTsKLQotCSAgc3ltID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgYWRkcik7Ci0KLQkgIGlmIChzeW0pCi0JICAgIHsKLQkgICAgICBpbnQgaTsKLQotCSAgICAgIERCRyAoQkJERUJVRywKLQkJICAgcHJpbnRmICgiW2JiX3JlYWRfcmVjXSAweCVseC0+MHglbHggKCVzOiVkKSBjbnQ9JWx1XG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsICh1bnNpZ25lZCBsb25nKSBzeW0tPmFkZHIsCi0JCQkgICBzeW0tPm5hbWUsIHN5bS0+bGluZV9udW0sIG5jYWxscykpOwotCi0JICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlM7IGkrKykKLQkJewotCQkgIGlmICghIHN5bS0+YmJfYWRkcltpXSB8fCBzeW0tPmJiX2FkZHJbaV0gPT0gYWRkcikKLQkJICAgIHsKLQkJICAgICAgc3ltLT5iYl9hZGRyW2ldID0gYWRkcjsKLQkJICAgICAgc3ltLT5iYl9jYWxsc1tpXSArPSBuY2FsbHM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RhdGljIGJvb2wgdXNlcl93YXJuZWQgPSBGQUxTRTsKLQotCSAgaWYgKCF1c2VyX3dhcm5lZCkKLQkgICAgewotCSAgICAgIHVzZXJfd2FybmVkID0gVFJVRTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogd2FybmluZzogaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlYyBjb3VudHMgKHVzZSAtbCBvciAtLWxpbmUpXG4iKSwKLQkJICAgICAgIHdob2FtaSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGFsbCBiYXNpYy1ibG9ja3Mgd2l0aCBub24temVybyBjb3VudHMgdG8gZmlsZSBPRlAuICBGSUxFTkFNRQotICogaXMgdGhlIG5hbWUgb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgcHJvZHVjaW5nIGVycm9yLW1lc3NhZ2VzCi0gKiBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoYmJfd3JpdGVfYmxvY2tzLCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyIHRhZyA9IEdNT05fVEFHX0JCX0NPVU5UOwotICBpbnQgbmJsb2NrcyA9IDA7Ci0gIGJmZF92bWEgYWRkcjsKLSAgdW5zaWduZWQgbG9uZyBuY2FsbHM7Ci0gIFN5bSAqc3ltOwotICBpbnQgaTsKLQotICAvKiBjb3VudCBob3cgbWFueSBub24temVybyBibG9ja3Mgd2l0aCBoYXZlOiAqLwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgc3ltLT5iYl9hZGRyW2ldOyBpKyspCi0JOwotICAgICAgbmJsb2NrcyArPSBpOwotICAgIH0KLQotICAvKiB3cml0ZSBoZWFkZXI6ICovCi0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBuYmxvY2tzLCAoYmZkX2J5dGUgKikgJiBuYmxvY2tzKTsKLSAgaWYgKGZ3cml0ZSAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBvZnApICE9IDEKLSAgICAgIHx8IGZ3cml0ZSAoJm5ibG9ja3MsIHNpemVvZiAobmJsb2NrcyksIDEsIG9mcCkgIT0gMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiB3cml0ZSBjb3VudHM6ICovCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgc3ltLT5iYl9hZGRyW2ldOyBpKyspCi0JewotCSAgcHV0X3ZtYSAoY29yZV9iZmQsIHN5bS0+YmJfYWRkcltpXSwgKGJmZF9ieXRlICopICYgYWRkcik7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgc3ltLT5iYl9jYWxsc1tpXSwgKGJmZF9ieXRlICopICYgbmNhbGxzKTsKLQotCSAgaWYgKGZ3cml0ZSAoJmFkZHIsIHNpemVvZiAoYWRkciksIDEsIG9mcCkgIT0gMQotCSAgICAgIHx8IGZ3cml0ZSAoJm5jYWxscywgc2l6ZW9mIChuY2FsbHMpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIE91dHB1dCBiYXNpYy1ibG9jayBzdGF0aXN0aWNzIGluIGEgZm9ybWF0IHRoYXQgaXMgZWFzaWx5IHBhcnNlYWJsZS4KLSAqIEN1cnJlbnQgdGhlIGZvcm1hdCBpczoKLSAqCi0gKiAgICAgIDxmaWxlbmFtZT46PGxpbmUtbnVtYmVyPjogKDxmdW5jdGlvbi1uYW1lPjo8YmItYWRkcik6IDxuY2FsbHM+Ci0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKHByaW50X2V4ZWNfY291bnRzKQotewotICBTeW0gKipzb3J0ZWRfYmJzLCAqc3ltOwotICBpbnQgaSwgaiwgbGVuOwotCi0gIGlmIChmaXJzdF9vdXRwdXQpCi0gICAgewotICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiXGZcbiIpOwotICAgIH0KLQotICAvKiBzb3J0IGJhc2ljLWJsb2NrcyBhY2NvcmRpbmcgdG8gZnVuY3Rpb24gbmFtZSBhbmQgbGluZSBudW1iZXI6ICovCi0KLSAgc29ydGVkX2JicyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKHNvcnRlZF9iYnNbMF0pKTsKLSAgbGVuID0gMDsKLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQWNjZXB0IHN5bWJvbCBpZiBpdCdzIGluIHRoZSBJTkNMX0VYRUMgdGFibGUKLSAgICAgICAqIG9yIHRoZXJlIGlzIG5vIElOQ0xfRVhFQyB0YWJsZQotICAgICAgICogICAgYW5kIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgRVhDTF9FWEVDIHRhYmxlLgotICAgICAgICovCi0gICAgICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9FWEVDXSwgc3ltLT5hZGRyKQotCSAgfHwgKHN5bXNbSU5DTF9FWEVDXS5sZW4gPT0gMAotCSAgICAgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0VYRUNdLCBzeW0tPmFkZHIpKSkKLQl7Ci0JICBzb3J0ZWRfYmJzW2xlbisrXSA9IHN5bTsKLQl9Ci0gICAgfQotICBxc29ydCAoc29ydGVkX2JicywgbGVuLCBzaXplb2YgKHNvcnRlZF9iYnNbMF0pLCBjbXBfYmIpOwotCi0gIC8qIG91dHB1dCBiYXNpYy1ibG9ja3M6ICovCi0KLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQotICAgIHsKLSAgICAgIGlmIChzeW0tPm5jYWxscyA+IDAgfHwgISBpZ25vcmVfemVyb3MpCi0JewotCSAgLyogRklYTUU6IFRoaXMgb25seSB3b3JrcyBpZiBiZmRfdm1hIGlzIHVuc2lnbmVkIGxvbmcuICAqLwotCSAgcHJpbnRmIChfKCIlczolZDogKCVzOjB4JWx4KSAlbHUgZXhlY3V0aW9uc1xuIiksCi0JCSAgc3ltLT5maWxlID8gc3ltLT5maWxlLT5uYW1lIDogXygiPHVua25vd24+IiksIHN5bS0+bGluZV9udW0sCi0JCSAgc3ltLT5uYW1lLCAodW5zaWduZWQgbG9uZykgc3ltLT5hZGRyLCBzeW0tPm5jYWxscyk7Ci0JfQotICAgICAgZm9yIChqID0gMDsgaiA8IE5CQlMgJiYgc3ltLT5iYl9hZGRyW2pdOyBqICsrKQotCXsKLQkgIGlmIChzeW0tPmJiX2NhbGxzW2pdID4gMCB8fCAhIGlnbm9yZV96ZXJvcykKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBUaGlzIG9ubHkgd29ya3MgaWYgYmZkX3ZtYSBpcyB1bnNpZ25lZCBsb25nLiAgKi8KLQkgICAgICBwcmludGYgKF8oIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iKSwKLQkJICAgICAgc3ltLT5maWxlID8gc3ltLT5maWxlLT5uYW1lIDogXygiPHVua25vd24+IiksIHN5bS0+bGluZV9udW0sCi0JCSAgICAgIHN5bS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHN5bS0+YmJfYWRkcltqXSwKLQkJICAgICAgc3ltLT5iYl9jYWxsc1tqXSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBmcmVlIChzb3J0ZWRfYmJzKTsKLX0KLQotLyoKLSAqIEhlbHBlciBmb3IgYmJfYW5ub3RhdGVkX3NvdXJjZTogZm9ybWF0IGFubm90YXRpb24gY29udGFpbmluZwotICogbnVtYmVyIG9mIGxpbmUgZXhlY3V0aW9ucy4gIERlcGVuZHMgb24gYmVpbmcgY2FsbGVkIG9uIGVhY2gKLSAqIGxpbmUgb2YgYSBmaWxlIGluIHNlcXVlbnRpYWwgb3JkZXIuCi0gKgotICogR2xvYmFsIHZhcmlhYmxlIGJiX2Fubm90YXRlX2FsbF9saW5lcyBlbmFibGVzIGV4ZWN1dGlvbiBjb3VudAotICogY29tcHJlc3Npb24gKGNvdW50cyBhcmUgc3VwcmVzc2VkIGlmIGlkZW50aWNhbCB0byB0aGUgbGFzdCBvbmUpCi0gKiBhbmQgcHJpbnRzIGNvdW50cyBvbiBhbGwgZXhlY3V0ZWQgbGluZXMuICBPdGhlcndpc2UsIHByaW50Ci0gKiBhbGwgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBleGFjdGx5IG9uY2Ugb24gdGhlIGxpbmUKLSAqIHRoYXQgc3RhcnRzIHRoZSBiYXNpYy1ibG9jay4KLSAqLwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGFubm90YXRlX3dpdGhfY291bnQsIChidWYsIHdpZHRoLCBsaW5lX251bSwgYXJnKSwKLSAgICAgICBjaGFyICpidWYgQU5EIGludCB3aWR0aCBBTkQgaW50IGxpbmVfbnVtIEFORCB2b2lkICphcmcpCi17Ci0gIFNvdXJjZV9GaWxlICpzZiA9IGFyZzsKLSAgU3ltICpiOwotICBpbnQgaTsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9jb3VudDsKLSAgdW5zaWduZWQgbG9uZyBsYXN0X3ByaW50ID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCi0gIGIgPSBOVUxMOwotICBpZiAobGluZV9udW0gPD0gc2YtPm51bV9saW5lcykKLSAgICB7Ci0gICAgICBiID0gc2YtPmxpbmVbbGluZV9udW0gLSAxXTsKLSAgICB9Ci0gIGlmICghYikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKLQlidWZbaV0gPSAnICc7Ci0gICAgICBidWZbd2lkdGhdID0gJ1wwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIHRtcGJ1ZltOQkJTICogMzBdOwotICAgICAgY2hhciAqcDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwotICAgICAgaW50IG5jYWxsc19zZXQ7Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICArK251bV9leGVjdXRhYmxlX2xpbmVzOwotCi0gICAgICBwID0gdG1wYnVmOwotICAgICAgKnAgPSAnXDAnOwotCi0gICAgICBuY2FsbHMgPSAwOwotICAgICAgbmNhbGxzX3NldCA9IDA7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCwgbGFiZWwgdGhlIGxpbmUgbm8gbWF0dGVyIHdoYXQuCi0gICAgICAgKiBPdGhlcndpc2UsIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBmdW5jdGlvbiwgc28gY2hlY2sgdG8gc2VlCi0gICAgICAgKiBpZiB0aGUgZmlyc3QgYmFzaWMtYmxvY2sgYWRkcmVzcyBpcyBsYXJnZXIgdGhhbiB0aGUgc3RhcnRpbmcKLSAgICAgICAqIGFkZHJlc3Mgb2YgdGhlIGxpbmUuICBJZiBzbywgdGhlbiB0aGlzIGxpbmUgYmVnaW5zIHdpdGggYQotICAgICAgICogYSBwb3J0aW9uIG9mIHRoZSBwcmV2aW91cyBiYXNpYy1ibG9jaywgc28gcHJpbnQgdGhhdCBwcmlvcgotICAgICAgICogZXhlY3V0aW9uIGNvdW50IChpZiBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgaXMgc2V0KS4KLSAgICAgICAqLwotCi0gICAgICBpZiAoYi0+aXNfZnVuYykKLQl7Ci0JICBzcHJpbnRmIChwLCAiJWx1IiwgYi0+bmNhbGxzKTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGxhc3RfY291bnQgPSBiLT5uY2FsbHM7Ci0JICBsYXN0X3ByaW50ID0gbGFzdF9jb3VudDsKLQkgIG5jYWxscyA9IGItPm5jYWxsczsKLQkgIG5jYWxsc19zZXQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGJiX2Fubm90YXRlX2FsbF9saW5lcwotCSAgICAgICAmJiBiLT5iYl9hZGRyWzBdICYmIGItPmJiX2FkZHJbMF0gPiBiLT5hZGRyKQotCXsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OwotCSAgbmNhbGxzID0gbGFzdF9jb3VudDsKLQkgIG5jYWxsc19zZXQgPSAxOwotCX0KLQotICAgICAgLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGlzIGxpbmUncyBiYXNpYy1ibG9ja3MuICBGb3IgZWFjaCBvbmUsCi0gICAgICAgKiB1cGRhdGUgbGFzdF9jb3VudCwgdGhlbiBjb21wcmVzcyBzZXF1ZW50aWFsIGlkZW50aWNhbCBjb3VudHMKLSAgICAgICAqIChpZiBiYl9hbm5vdGF0ZV9hbGxfbGluZXMpIGFuZCBwcmludCB0aGUgZXhlY3V0aW9uIGNvdW50LgotICAgICAgICovCi0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOQkJTICYmIGItPmJiX2FkZHJbaV07IGkrKykKLQl7Ci0JICBsYXN0X2NvdW50ID0gYi0+YmJfY2FsbHNbaV07Ci0JICBpZiAoISBuY2FsbHNfc2V0KQotCSAgICB7Ci0JICAgICAgbmNhbGxzID0gMDsKLQkgICAgICBuY2FsbHNfc2V0ID0gMTsKLQkgICAgfQotCSAgbmNhbGxzICs9IGxhc3RfY291bnQ7Ci0KLQkgIGlmIChiYl9hbm5vdGF0ZV9hbGxfbGluZXMgJiYgbGFzdF9jb3VudCA9PSBsYXN0X3ByaW50KQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaWYgKHAgPiB0bXBidWYpCi0JICAgICpwKysgPSAnLCc7Ci0JICBzcHJpbnRmIChwLCAiJWx1IiwgbGFzdF9jb3VudCk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0KLQkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OwotCX0KLQotICAgICAgLyogV2UncmUgZG9uZS4gIElmIG5vdGhpbmcgaGFzIGJlZW4gcHJpbnRlZCBvbiB0aGlzIGxpbmUsCi0gICAgICAgKiBwcmludCB0aGUgbGFzdCBleGVjdXRpb24gY291bnQgKGJiX2Fubm90YXRlX2FsbF9saW5lcyksCi0gICAgICAgKiB3aGljaCBjb3VsZCBiZSBmcm9tIGVpdGhlciBhIHByZXZpb3VzIGxpbmUgKGlmIHRoZXJlIHdlcmUKLSAgICAgICAqIG5vIEJCcyBvbiB0aGlzIGxpbmUpLCBvciBmcm9tIHRoaXMgbGluZSAoaWYgYWxsIG91ciBCQgotICAgICAgICogY291bnRzIHdlcmUgY29tcHJlc3NlZCBvdXQgYmVjYXVzZSB0aGV5IHdlcmUgaWRlbnRpY2FsKS4KLSAgICAgICAqLwotCi0gICAgICBpZiAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzICYmIHAgPT0gdG1wYnVmKQotCXsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIG5jYWxscyA9IGxhc3RfY291bnQ7Ci0JICBuY2FsbHNfc2V0ID0gMTsKLQl9Ci0KLSAgICAgIGlmICghIG5jYWxsc19zZXQpCi0JewotCSAgaW50IGM7Ci0KLQkgIGZvciAoYyA9IDA7IGMgPCB3aWR0aDsgYysrKQotCSAgICBidWZbY10gPSAnICc7Ci0JICBidWZbd2lkdGhdID0gJ1wwJzsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgICsrbnVtX2xpbmVzX2V4ZWN1dGVkOwotCi0gICAgICBpZiAobmNhbGxzIDwgYmJfbWluX2NhbGxzKQotCXsKLQkgIHN0cmNweSAodG1wYnVmLCAiIyMjIyMiKTsKLQkgIHAgPSB0bXBidWYgKyA1OwotCX0KLQotICAgICAgc3RyY3B5IChwLCAiIC0+ICIpOwotICAgICAgcCArPSA0OwotCi0gICAgICBsZW4gPSBwIC0gdG1wYnVmOwotICAgICAgaWYgKGxlbiA+PSB3aWR0aCkKLQl7Ci0JICBzdHJuY3B5IChidWYsIHRtcGJ1Ziwgd2lkdGgpOwotCSAgYnVmW3dpZHRoXSA9ICdcMCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBjOwotCi0JICBzdHJjcHkgKGJ1ZiArIHdpZHRoIC0gbGVuLCB0bXBidWYpOwotCSAgZm9yIChjID0gMDsgYyA8IHdpZHRoIC0gbGVuOyArK2MpCi0JICAgIGJ1ZltjXSA9ICcgJzsKLQl9Ci0gICAgfQotfQotCi0vKgotICogQW5ub3RhdGUgdGhlIGZpbGVzIG5hbWVkIGluIFNPVVJDRV9GSUxFUyB3aXRoIGJhc2ljLWJsb2NrIHN0YXRpc3RpY3MKLSAqIChleGVjdXRpb24gY291bnRzKS4gIEFmdGVyIGVhY2ggc291cmNlIGZpbGVzLCBhIGZldyBzdGF0aXN0aWNzCi0gKiByZWdhcmRpbmcgdGhhdCBzb3VyY2UgZmlsZSBhcmUgcHJpbnRlZC4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAocHJpbnRfYW5ub3RhdGVkX3NvdXJjZSkKLXsKLSAgU3ltICpzeW0sICpsaW5lX3N0YXRzLCAqbmV3X2xpbmU7Ci0gIFNvdXJjZV9GaWxlICpzZjsKLSAgaW50IGksIHRhYmxlX2xlbjsKLSAgRklMRSAqb2ZwOwotCi0gIC8qCi0gICAqIEZpbmQgbWF4aW11bSBsaW5lIG51bWJlciBmb3IgZWFjaCBzb3VyY2UgZmlsZSB0aGF0IHVzZXIgaXMKLSAgICogaW50ZXJlc3RlZCBpbjoKLSAgICovCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEFjY2VwdCBzeW1ib2wgaWYgaXQncyBmaWxlIGlzIGtub3duLCBpdHMgbGluZSBudW1iZXIgaXMKLSAgICAgICAqIGJpZ2dlciB0aGFuIGFueXRoaW5nIHdlIGhhdmUgc2VlbiBmb3IgdGhhdCBmaWxlIHNvIGZhciBhbmQKLSAgICAgICAqIGlmIGl0J3MgaW4gdGhlIElOQ0xfQU5OTyB0YWJsZSBvciB0aGVyZSBpcyBubyBJTkNMX0FOTk8KLSAgICAgICAqIHRhYmxlIGFuZCBpdCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIEVYQ0xfQU5OTyB0YWJsZS4KLSAgICAgICAqLwotICAgICAgaWYgKHN5bS0+ZmlsZSAmJiBzeW0tPmxpbmVfbnVtID4gc3ltLT5maWxlLT5udW1fbGluZXMKLQkgICYmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0FOTk9dLCBzeW0tPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9BTk5PXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0FOTk9dLCBzeW0tPmFkZHIpKSkpCi0JewotCSAgc3ltLT5maWxlLT5udW1fbGluZXMgPSBzeW0tPmxpbmVfbnVtOwotCX0KLSAgICB9Ci0KLSAgLyogYWxsb2NhdGUgbGluZSBkZXNjcmlwdG9yczogKi8KLQotICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZi0+bnVtX2xpbmVzID4gMCkKLQl7Ci0JICBzZi0+bGluZSA9ICh2b2lkICopIHhtYWxsb2MgKHNmLT5udW1fbGluZXMgKiBzaXplb2YgKHNmLT5saW5lWzBdKSk7Ci0JICBtZW1zZXQgKHNmLT5saW5lLCAwLCBzZi0+bnVtX2xpbmVzICogc2l6ZW9mIChzZi0+bGluZVswXSkpOwotCX0KLSAgICB9Ci0KLSAgLyogY291bnQgZXhlY3V0aW9ucyBwZXIgbGluZTogKi8KLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGlmIChzeW0tPmZpbGUgJiYgc3ltLT5maWxlLT5udW1fbGluZXMKLQkgICYmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0FOTk9dLCBzeW0tPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9BTk5PXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0FOTk9dLCBzeW0tPmFkZHIpKSkpCi0JewotCSAgc3ltLT5maWxlLT5uY2FsbHMgKz0gc3ltLT5uY2FsbHM7Ci0JICBsaW5lX3N0YXRzID0gc3ltLT5maWxlLT5saW5lW3N5bS0+bGluZV9udW0gLSAxXTsKLQkgIGlmICghbGluZV9zdGF0cykKLQkgICAgewotCSAgICAgIC8qIGNvbW1vbiBjYXNlIGhhcyBhdCBtb3N0IG9uZSBiYXNpYy1ibG9jayBwZXIgc291cmNlIGxpbmU6ICovCi0JICAgICAgc3ltLT5maWxlLT5saW5lW3N5bS0+bGluZV9udW0gLSAxXSA9IHN5bTsKLQkgICAgfQotCSAgZWxzZSBpZiAoIWxpbmVfc3RhdHMtPmFkZHIpCi0JICAgIHsKLQkgICAgICAvKiBzeW0gaXMgdGhlIDNyZCAuLiBudGggYmFzaWMgYmxvY2sgZm9yIHRoaXMgbGluZTogKi8KLQkgICAgICBsaW5lX3N0YXRzLT5uY2FsbHMgKz0gc3ltLT5uY2FsbHM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHN5bSBpcyB0aGUgc2Vjb25kIGJhc2ljIGJsb2NrIGZvciB0aGlzIGxpbmUgKi8KLQkgICAgICBuZXdfbGluZSA9IChTeW0gKikgeG1hbGxvYyAoc2l6ZW9mICgqbmV3X2xpbmUpKTsKLQkgICAgICAqbmV3X2xpbmUgPSAqbGluZV9zdGF0czsKLQkgICAgICBuZXdfbGluZS0+YWRkciA9IDA7Ci0JICAgICAgbmV3X2xpbmUtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKLQkgICAgICBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdID0gbmV3X2xpbmU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIHBsb2Qgb3ZlciBzb3VyY2UgZmlsZXMsIGFubm90YXRpbmcgdGhlbTogKi8KLQotICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghc2YtPm51bV9saW5lcyB8fCAoaWdub3JlX3plcm9zICYmIHNmLT5uY2FsbHMgPT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBudW1fZXhlY3V0YWJsZV9saW5lcyA9IG51bV9saW5lc19leGVjdXRlZCA9IDA7Ci0gICAgICBvZnAgPSBhbm5vdGF0ZV9zb3VyY2UgKHNmLCAxNiwgYW5ub3RhdGVfd2l0aF9jb3VudCwgc2YpOwotICAgICAgaWYgKCFvZnApCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoYmJfdGFibGVfbGVuZ3RoID4gMCkKLQl7Ci0JICBmcHJpbnRmIChvZnAsIF8oIlxuXG5Ub3AgJWQgTGluZXM6XG5cbiAgICAgTGluZSAgICAgIENvdW50XG5cbiIpLAotCQkgICBiYl90YWJsZV9sZW5ndGgpOwotCi0JICAvKiBhYnVzZSBsaW5lIGFycmF5cy0tLWl0J3Mgbm90IG5lZWRlZCBhbnltb3JlOiAqLwotCSAgcXNvcnQgKHNmLT5saW5lLCBzZi0+bnVtX2xpbmVzLCBzaXplb2YgKHNmLT5saW5lWzBdKSwgY21wX25jYWxscyk7Ci0JICB0YWJsZV9sZW4gPSBiYl90YWJsZV9sZW5ndGg7Ci0JICBpZiAodGFibGVfbGVuID4gc2YtPm51bV9saW5lcykKLQkgICAgewotCSAgICAgIHRhYmxlX2xlbiA9IHNmLT5udW1fbGluZXM7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCB0YWJsZV9sZW47ICsraSkKLQkgICAgewotCSAgICAgIHN5bSA9IHNmLT5saW5lW2ldOwotCSAgICAgIGlmICghc3ltIHx8IHN5bS0+bmNhbGxzID09IDApCi0JCXsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGZwcmludGYgKG9mcCwgIiU5ZCAlMTBsdVxuIiwgc3ltLT5saW5lX251bSwgc3ltLT5uY2FsbHMpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcmVlIChzZi0+bGluZSk7Ci0gICAgICBzZi0+bGluZSA9IDA7Ci0KLSAgICAgIGZwcmludGYgKG9mcCwgXygiXG5FeGVjdXRpb24gU3VtbWFyeTpcblxuIikpOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCIlOWxkICAgRXhlY3V0YWJsZSBsaW5lcyBpbiB0aGlzIGZpbGVcbiIpLAotCSAgICAgICBudW1fZXhlY3V0YWJsZV9saW5lcyk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5bGQgICBMaW5lcyBleGVjdXRlZFxuIiksIG51bV9saW5lc19leGVjdXRlZCk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5LjJmICAgUGVyY2VudCBvZiB0aGUgZmlsZSBleGVjdXRlZFxuIiksCi0JICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgID8gMTAwLjAgKiBudW1fbGluZXNfZXhlY3V0ZWQgLyAoZG91YmxlKSBudW1fZXhlY3V0YWJsZV9saW5lcwotCSAgICAgICA6IDEwMC4wKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiXG4lOWx1ICAgVG90YWwgbnVtYmVyIG9mIGxpbmUgZXhlY3V0aW9uc1xuIiksCi0JICAgICAgIHNmLT5uY2FsbHMpOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCIlOS4yZiAgIEF2ZXJhZ2UgZXhlY3V0aW9ucyBwZXIgbGluZVxuIiksCi0JICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgID8gKGRvdWJsZSkgc2YtPm5jYWxscyAvIChkb3VibGUpIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgIDogMC4wKTsKLSAgICAgIGlmIChvZnAgIT0gc3Rkb3V0KQotCXsKLQkgIGZjbG9zZSAob2ZwKTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmggYi9ncHJvZi9iYXNpY19ibG9ja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZWNhMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9iYXNpY19ibG9ja3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpZm5kZWYgYmFzaWNfYmxvY2tzX2gKLSNkZWZpbmUgYmFzaWNfYmxvY2tzX2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotLyoKLSAqIE9wdGlvbnM6Ci0gKi8KLWV4dGVybiBib29sIGJiX2Fubm90YXRlX2FsbF9saW5lczsJLyogZm9yY2UgYW5ub3RhdGlvbiBvZiBhbGwgbGluZXM/ICovCi1leHRlcm4gaW50IGJiX3RhYmxlX2xlbmd0aDsJCS8qIGxlbmd0aCBvZiBtb3N0LXVzZWQgYmIgdGFibGUgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJiX21pbl9jYWxsczsJLyogbWluaW11bSBleGVjdXRpb24gY291bnQgKi8KLQotZXh0ZXJuIHZvaWQgYmJfcmVhZF9yZWMgUEFSQU1TICgoRklMRSAqIGlmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGJiX3dyaXRlX2Jsb2NrcyBQQVJBTVMgKChGSUxFICogb2ZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgYmJfY3JlYXRlX3N5bXMgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBwcmludF9hbm5vdGF0ZWRfc291cmNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHByaW50X2V4ZWNfY291bnRzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIGJhc2ljX2Jsb2Nrc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9iYl9leGl0X2Z1bmMuYyBiL2dwcm9mL2JiX2V4aXRfZnVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMzMjE1Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2JiX2V4aXRfZnVuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NCBEYXZpZCBNb3NiZXJnZXItVGFuZy4KLSAqCi0gKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIF9fYmJfZXhpdF9mdW5jKCkgZHVtcHMgYWxsIHRoZSBiYXNpYy1ibG9jayBzdGF0aXN0aWNzIGxpbmtlZCBpbnRvCi0gKiB0aGUgYmJfaGVhZCBjaGFpbiB0byAuZCBmaWxlcy4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0KLS8qIHN0cnVjdHVyZSBlbWl0dGVkIGJ5IC1hICovCi1zdHJ1Y3QgYmIgewotICAgIGxvbmcJCXplcm9fd29yZDsKLSAgICBjb25zdCBjaGFyCQkqZmlsZW5hbWU7Ci0gICAgbG9uZwkJKmNvdW50czsKLSAgICBsb25nCQluY291bnRzOwotICAgIHN0cnVjdCBiYgkJKm5leHQ7Ci0gICAgY29uc3QgdW5zaWduZWQgbG9uZwkqYWRkcmVzc2VzOwotfTsKLQotc3RydWN0IGJiICpfX2JiX2hlYWQgPSAoc3RydWN0IGJiICopMDsKLQotCi12b2lkCi1fX2JiX2V4aXRfZnVuYyAodm9pZCkKLXsKLSAgICBjb25zdCBpbnQgdmVyc2lvbiA9IEdNT05fVkVSU0lPTjsKLSAgICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLSAgICBzdHJ1Y3QgYmIgKnB0cjsKLSAgICBGSUxFICpmcDsKLSAgICAvKgotICAgICAqIEdFTl9HTU9OX0NOVF9GSUxFIHNob3VsZCBiZSBkZWZpbmVkIG9uIHN5c3RlbXMgd2l0aCBtY2xlYW51cCgpCi0gICAgICogZnVuY3Rpb25zIHRoYXQgZG8gbm90IHdyaXRlIGJhc2ljLWJsb2NrIHRvIGdtb24ub3V0LiAgSW4gc3VjaAotICAgICAqIGNhc2VzIHByb2ZpbGluZyB3aXRoICItcGcgLWEiIHdvdWxkIHJlc3VsdCBpbiBhIGdtb24ub3V0IGZpbGUKLSAgICAgKiB3aXRob3V0IGJhc2ljLWJsb2NrIGluZm8gKGJlY2F1c2UgdGhlIGZpbGUgd3JpdHRlbiBoZXJlIHdvdWxkCi0gICAgICogYmUgb3ZlcndyaXR0ZW4uICBUaHVzLCBhIHNlcGFyYXRlIGZpbGUgaXMgZ2VuZXJhdGVkIGluc3RlYWQuCi0gICAgICogVGhlIHR3byBmaWxlcyBjYW4gZWFzaWx5IGJlIGNvbWJpbmVkIGJ5IHNwZWNpZnlpbmcgdGhlbQotICAgICAqIG9uIGdwcm9mJ3MgY29tbWFuZCBsaW5lIChhbmQgcG9zc2libHkgZ2VuZXJhdGluZyBhIGdtb24uc3VtCi0gICAgICogZmlsZSB3aXRoICJncHJvZiAtcyIpLgotICAgICAqLwotI2lmbmRlZiBHRU5fR01PTl9DTlRfRklMRQotIyAgIGRlZmluZSBPVVRfTkFNRQkiZ21vbi5vdXQiCi0jZWxzZQotIyAgIGRlZmluZSBPVVRfTkFNRQkiZ21vbi5jbnQiCi0jZW5kaWYKLSAgICBmcCA9IGZvcGVuKE9VVF9OQU1FLCAid2IiKTsKLSAgICBpZiAoIWZwKSB7Ci0JcGVycm9yKE9VVF9OQU1FKTsKLQlyZXR1cm47Ci0gICAgfSAvKiBpZiAqLwotICAgIG1lbWNweSgmZ2hkci5jb29raWVbMF0sIEdNT05fTUFHSUMsIDQpOwotICAgIG1lbWNweSgmZ2hkci52ZXJzaW9uLCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKTsKLSAgICBmd3JpdGUoJmdoZHIsIHNpemVvZihnaGRyKSwgMSwgZnApOwotCi0gICAgZm9yIChwdHIgPSBfX2JiX2hlYWQ7IHB0ciAhPSAwOyBwdHIgPSBwdHItPm5leHQpIHsKLQl1X2ludCBuY291bnRzID0gcHRyLT5uY291bnRzOwotCXVfY2hhciB0YWc7Ci0JdV9pbnQgaTsKLQotCXRhZyA9IEdNT05fVEFHX0JCX0NPVU5UOwotCWZ3cml0ZSgmdGFnLCBzaXplb2YodGFnKSwgMSwgZnApOwotCWZ3cml0ZSgmbmNvdW50cywgc2l6ZW9mKG5jb3VudHMpLCAxLCBmcCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmNvdW50czsgKytpKSB7Ci0JICAgIGZ3cml0ZSgmcHRyLT5hZGRyZXNzZXNbaV0sIHNpemVvZihwdHItPmFkZHJlc3Nlc1swXSksIDEsIGZwKTsKLQkgICAgZndyaXRlKCZwdHItPmNvdW50c1tpXSwgc2l6ZW9mKHB0ci0+Y291bnRzWzBdKSwgMSwgZnApOwotCX0gLyogZm9yICovCi0gICAgfSAvKiBmb3IgKi8KLSAgICBmY2xvc2UgKGZwKTsKLX0gLyogX19iYl9leGl0X2Z1bmMgKi8KLQotCQkJLyoqKiBlbmQgb2YgX19iYl9leGl0X2Z1bmMuYyAqKiovCmRpZmYgLS1naXQgYS9ncHJvZi9iYmNvbnYucGwgYi9ncHJvZi9iYmNvbnYucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczMTJmNTEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmJjb252LnBsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyEgL3Vzci9iaW4vcGVybAotCi0jIFRoaXMgc2NyaXB0IGNvbnZlcnRzIGEgImJiLm91dCIgZmlsZSBpbnRvIGEgZm9ybWF0Ci0jIHN1aXRhYmxlIGZvciBwcm9jZXNzaW5nIGJ5IGdwcm9mCi0KLSMgV3JpdGUgYSBuZXctc3R5bGUgZ21vbiBoZWFkZXIKLQotcHJpbnQgcGFjaygiQTRJeDEyIiwgImdtb24iLCAxKTsKLQotCi0jIFRoZSBpbnB1dCBmaWxlIGZvcm1hdCBjb250YWlucyBoZWFkZXIgbGluZXMgYW5kIGRhdGEgbGluZXMuCi0jIEhlYWRlciBsaW5lcyBjb250YWluIGEgY291bnQgb2YgaG93IG1hbnkgZGF0YSBsaW5lcyBmb2xsb3cgYmVmb3JlCi0jIHRoZSBuZXh0IGhlYWRlciBsaW5lLiAgJGJsb2NrY291bnQgaXMgc2V0IHRvIHRoZSBjb3VudCB0aGF0Ci0jIGFwcGVhcnMgaW4gZWFjaCBoZWFkZXIgbGluZSwgdGhlbiBkZWNyZW1lbnRlZCBhdCBlYWNoIGRhdGEgbGluZS4KLSMgJGJsb2NrY291bnQgc2hvdWxkIGFsd2F5cyBiZSB6ZXJvIGF0IHRoZSBzdGFydCBvZiBhIGhlYWRlciBsaW5lLAotIyBhbmQgc2hvdWxkIG5ldmVyIGJlIHplcm8gYXQgdGhlIHN0YXJ0IG9mIGEgZGF0YSBsaW5lLgotCi0kYmxvY2tjb3VudD0wOwotCi13aGlsZSAoPD4pIHsKLSAgICBpZiAoL15GaWxlIC4qLCAoWzAtOV0rKSBiYXNpYyBibG9ja3MvKSB7Ci0JcHJpbnQgU1RERVJSICJNaXNjb3VudDogbGluZSAkLlxuIiBpZiAoJGJsb2NrY291bnQgIT0gMCk7Ci0JJGJsb2NrY291bnQgPSAkMTsKLQotCXByaW50IHBhY2soImNJIiwgMiwgJGJsb2NrY291bnQpOwotICAgIH0KLSAgICBpZiAoL0Jsb2NrLipleGVjdXRlZChbIDAtOV0rKSB0aW1lLiogYWRkcmVzcz0gMHgoWzAtOWEtZkEtRl0qKS8pIHsKLQlwcmludCBTVERFUlIgIk1pc2NvdW50OiBsaW5lICQuXG4iIGlmICgkYmxvY2tjb3VudCA9PSAwKTsKLQkkYmxvY2tjb3VudC0tIGlmICgkYmxvY2tjb3VudCA+IDApOwotCi0JJGNvdW50ID0gJDE7Ci0JJGFkZHIgPSBoZXggJDI7Ci0KLQlwcmludCBwYWNrKCJJSSIsJGFkZHIsJGNvdW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9ic2RfY2FsbGdfYmwubSBiL2dwcm9mL2JzZF9jYWxsZ19ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNjOTZjLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2JzZF9jYWxsZ19ibC5tCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLQotCi0KLWNhbGwgZ3JhcGggcHJvZmlsZToKLSAgICAgICAgICBUaGUgc3VtIG9mIHNlbGYgYW5kIGRlc2NlbmRlbnRzIGlzIHRoZSBtYWpvciBzb3J0Ci0gICAgICAgICAgZm9yIHRoaXMgbGlzdGluZy4KLQotICAgICAgICAgIGZ1bmN0aW9uIGVudHJpZXM6Ci0KLWluZGV4ICAgICB0aGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBjYWxsIGdyYXBoCi0gICAgICAgICAgbGlzdGluZywgYXMgYW4gYWlkIHRvIGxvY2F0aW5nIGl0IChzZWUgYmVsb3cpLgotCi0ldGltZSAgICAgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHRpbWUgb2YgdGhlIHByb2dyYW0KLSAgICAgICAgICBhY2NvdW50ZWQgZm9yIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIGl0cwotICAgICAgICAgIGRlc2NlbmRlbnRzLgotCi1zZWxmICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNwZW50IGluIHRoaXMgZnVuY3Rpb24KLSAgICAgICAgICBpdHNlbGYuCi0KLWRlc2NlbmRlbnRzCi0gICAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNwZW50IGluIHRoZSBkZXNjZW5kZW50cyBvZgotICAgICAgICAgIHRoaXMgZnVuY3Rpb24gb24gYmVoYWxmIG9mIHRoaXMgZnVuY3Rpb24uCi0KLWNhbGxlZCAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIChvdGhlcgotICAgICAgICAgIHRoYW4gcmVjdXJzaXZlIGNhbGxzKS4KLQotc2VsZiAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBjYWxscyBpdHNlbGYKLSAgICAgICAgICByZWN1cnNpdmVseS4KLQotbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgd2l0aCBhbiBpbmRpY2F0aW9uIG9mCi0gICAgICAgICAgaXRzIG1lbWJlcnNoaXAgaW4gYSBjeWNsZSwgaWYgYW55LgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FsbCBncmFwaAotICAgICAgICAgIGxpc3RpbmcsIGFzIGFuIGFpZCB0byBsb2NhdGluZyBpdC4KLQotCi0KLSAgICAgICAgICBwYXJlbnQgbGlzdGluZ3M6Ci0KLXNlbGYqICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBmdW5jdGlvbidzIHNlbGYgdGltZQotICAgICAgICAgIHdoaWNoIGlzIGR1ZSB0byBjYWxscyBmcm9tIHRoaXMgcGFyZW50LgotCi1kZXNjZW5kZW50cyoKLSAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBmdW5jdGlvbidzCi0gICAgICAgICAgZGVzY2VuZGVudCB0aW1lIHdoaWNoIGlzIGR1ZSB0byBjYWxscyBmcm9tIHRoaXMKLSAgICAgICAgICBwYXJlbnQuCi0KLWNhbGxlZCoqICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5Ci0gICAgICAgICAgdGhpcyBwYXJlbnQuICBUaGlzIGlzIHRoZSBudW1lcmF0b3Igb2YgdGhlCi0gICAgICAgICAgZnJhY3Rpb24gd2hpY2ggZGl2aWRlcyB1cCB0aGUgZnVuY3Rpb24ncyB0aW1lIHRvCi0gICAgICAgICAgaXRzIHBhcmVudHMuCi0KLXRvdGFsKiAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCBieQotICAgICAgICAgIGFsbCBvZiBpdHMgcGFyZW50cy4gIFRoaXMgaXMgdGhlIGRlbm9taW5hdG9yIG9mCi0gICAgICAgICAgdGhlIHByb3BhZ2F0aW9uIGZyYWN0aW9uLgotCi1wYXJlbnRzICAgdGhlIG5hbWUgb2YgdGhpcyBwYXJlbnQsIHdpdGggYW4gaW5kaWNhdGlvbiBvZiB0aGUKLSAgICAgICAgICBwYXJlbnQncyBtZW1iZXJzaGlwIGluIGEgY3ljbGUsIGlmIGFueS4KLQotaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGlzIHBhcmVudCBpbiB0aGUgY2FsbCBncmFwaAotICAgICAgICAgIGxpc3RpbmcsIGFzIGFuIGFpZCBpbiBsb2NhdGluZyBpdC4KLQotCi0KLSAgICAgICAgICBjaGlsZHJlbiBsaXN0aW5nczoKLQotc2VsZiogICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGNoaWxkJ3Mgc2VsZiB0aW1lCi0gICAgICAgICAgd2hpY2ggaXMgZHVlIHRvIGJlaW5nIGNhbGxlZCBieSB0aGlzIGZ1bmN0aW9uLgotCi1kZXNjZW5kZW50KgotICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGNoaWxkJ3MgZGVzY2VuZGVudCdzCi0gICAgICAgICAgdGltZSB3aGljaCBpcyBkdWUgdG8gYmVpbmcgY2FsbGVkIGJ5IHRoaXMKLSAgICAgICAgICBmdW5jdGlvbi4KLQotY2FsbGVkKiogIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBjaGlsZCBpcyBjYWxsZWQgYnkgdGhpcwotICAgICAgICAgIGZ1bmN0aW9uLiAgVGhpcyBpcyB0aGUgbnVtZXJhdG9yIG9mIHRoZQotICAgICAgICAgIHByb3BhZ2F0aW9uIGZyYWN0aW9uIGZvciB0aGlzIGNoaWxkLgotCi10b3RhbCogICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGNoaWxkIGlzIGNhbGxlZCBieSBhbGwKLSAgICAgICAgICBmdW5jdGlvbnMuICBUaGlzIGlzIHRoZSBkZW5vbWluYXRvciBvZiB0aGUKLSAgICAgICAgICBwcm9wYWdhdGlvbiBmcmFjdGlvbi4KLQotY2hpbGRyZW4gIHRoZSBuYW1lIG9mIHRoaXMgY2hpbGQsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIGl0cwotICAgICAgICAgIG1lbWJlcnNoaXAgaW4gYSBjeWNsZSwgaWYgYW55LgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoaXMgY2hpbGQgaW4gdGhlIGNhbGwgZ3JhcGggbGlzdGluZywKLSAgICAgICAgICBhcyBhbiBhaWQgdG8gbG9jYXRpbmcgaXQuCi0KLQotCi0gICAgICAgICAgKiB0aGVzZSBmaWVsZHMgYXJlIG9taXR0ZWQgZm9yIHBhcmVudHMgKG9yCi0gICAgICAgICAgY2hpbGRyZW4pIGluIHRoZSBzYW1lIGN5Y2xlIGFzIHRoZSBmdW5jdGlvbi4gIElmCi0gICAgICAgICAgdGhlIGZ1bmN0aW9uIChvciBjaGlsZCkgaXMgYSBtZW1iZXIgb2YgYSBjeWNsZSwKLSAgICAgICAgICB0aGUgcHJvcGFnYXRlZCB0aW1lcyBhbmQgcHJvcGFnYXRpb24gZGVub21pbmF0b3IKLSAgICAgICAgICByZXByZXNlbnQgdGhlIHNlbGYgdGltZSBhbmQgZGVzY2VuZGVudCB0aW1lIG9mIHRoZQotICAgICAgICAgIGN5Y2xlIGFzIGEgd2hvbGUuCi0KLSAgICAgICAgICAqKiBzdGF0aWMtb25seSBwYXJlbnRzIGFuZCBjaGlsZHJlbiBhcmUgaW5kaWNhdGVkCi0gICAgICAgICAgYnkgYSBjYWxsIGNvdW50IG9mIDAuCi0KLQotCi0gICAgICAgICAgY3ljbGUgbGlzdGluZ3M6Ci0gICAgICAgICAgdGhlIGN5Y2xlIGFzIGEgd2hvbGUgaXMgbGlzdGVkIHdpdGggdGhlIHNhbWUKLSAgICAgICAgICBmaWVsZHMgYXMgYSBmdW5jdGlvbiBlbnRyeS4gIEJlbG93IGl0IGFyZSBsaXN0ZWQKLSAgICAgICAgICB0aGUgbWVtYmVycyBvZiB0aGUgY3ljbGUsIGFuZCB0aGVpciBjb250cmlidXRpb25zCi0gICAgICAgICAgdG8gdGhlIHRpbWUgYW5kIGNhbGwgY291bnRzIG9mIHRoZSBjeWNsZS4KLQwKZGlmZiAtLWdpdCBhL2dwcm9mL2NhbGxfZ3JhcGguYyBiL2dwcm9mL2NhbGxfZ3JhcGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlZTI1MS4uMDAwMDAwMAotLS0gYS9ncHJvZi9jYWxsX2dyYXBoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLWV4dGVybiB2b2lkCi1ERUZVTiAoY2dfdGFsbHksIChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCksCi0gICAgICAgYmZkX3ZtYSBmcm9tX3BjIEFORCBiZmRfdm1hIHNlbGZfcGMgQU5EIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0gIFN5bSAqcGFyZW50OwotICBTeW0gKmNoaWxkOwotCi0gIHBhcmVudCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGZyb21fcGMpOwotICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIHNlbGZfcGMpOwotCi0gIGlmIChjaGlsZCA9PSBOVUxMIHx8IHBhcmVudCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBJZiB3ZSdyZSBkb2luZyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZQotICAgICBjaGlsZCB3aWxsIHByb2JhYmx5IHBvaW50IHRvIGxpbmUgc3ltYm9scyBpbnN0ZWFkIG9mIGZ1bmN0aW9uCi0gICAgIHN5bWJvbHMuICBGb3IgdGhlIHBhcmVudCB0aGlzIGlzIGZpbmUsIHNpbmNlIHRoaXMgaWRlbnRpZmllcyB0aGUKLSAgICAgbGluZSBudW1iZXIgaW4gdGhlIGNhbGxpbmcgcm91dGluZywgYnV0IHRoZSBjaGlsZCBzaG91bGQgYWx3YXlzCi0gICAgIHBvaW50IHRvIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQsIHNvIHdlIGJhY2sgdXAgaW4gdGhlIHN5bWJvbAotICAgICB0YWJsZSB1bnRpbCB3ZSBmaW5kIGl0LgotICAgCi0gICAgIEZvciBub3JtYWwgcHJvZmlsaW5nLCBpc19mdW5jIHdpbGwgYmUgc2V0IG9uIGFsbCBzeW1ib2xzLCBzbyB0aGlzCi0gICAgIGNvZGUgd2lsbCBkbyBub3RoaW5nLiAgKi8KLQotICB3aGlsZSAoY2hpbGQgPj0gc3ltdGFiLmJhc2UgJiYgISBjaGlsZC0+aXNfZnVuYykKLSAgICAtLWNoaWxkOwotCi0gIGlmIChjaGlsZCA8IHN5bXRhYi5iYXNlKQotICAgIHJldHVybjsKLQotICAvKgotICAgKiBLZWVwIGFyYyBpZiBpdCBpcyBvbiBJTkNMX0FSQ1MgdGFibGUgb3IgaWYgdGhlIElOQ0xfQVJDUyB0YWJsZQotICAgKiBpcyBlbXB0eSBhbmQgaXQgaXMgbm90IGluIHRoZSBFWENMX0FSQ1MgdGFibGUuCi0gICAqLwotICBpZiAoc3ltX2lkX2FyY19pc19wcmVzZW50ICgmc3ltc1tJTkNMX0FSQ1NdLCBwYXJlbnQsIGNoaWxkKQotICAgICAgfHwgKHN5bXNbSU5DTF9BUkNTXS5sZW4gPT0gMAotCSAgJiYgIXN5bV9pZF9hcmNfaXNfcHJlc2VudCAoJnN5bXNbRVhDTF9BUkNTXSwgcGFyZW50LCBjaGlsZCkpKQotICAgIHsKLSAgICAgIGNoaWxkLT5uY2FsbHMgKz0gY291bnQ7Ci0gICAgICBEQkcgKFRBTExZREVCVUcsCi0JICAgcHJpbnRmIChfKCJbY2dfdGFsbHldIGFyYyBmcm9tICVzIHRvICVzIHRyYXZlcnNlZCAlbHUgdGltZXNcbiIpLAotCQkgICBwYXJlbnQtPm5hbWUsIGNoaWxkLT5uYW1lLCBjb3VudCkpOwotICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgY291bnQpOwotICAgIH0KLX0KLQotCi0vKgotICogUmVhZCBhIHJlY29yZCBmcm9tIGZpbGUgSUZQIGRlc2NyaWJpbmcgYW4gYXJjIGluIHRoZSBmdW5jdGlvbgotICogY2FsbC1ncmFwaCBhbmQgdGhlIGNvdW50IG9mIGhvdyBtYW55IHRpbWVzIHRoZSBhcmMgaGFzIGJlZW4KLSAqIHRyYXZlcnNlZC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lIG9mIGZpbGUgSUZQIGFuZCBpcyBwcm92aWRlZAotICogZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGNnX3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIENPTlNUIGNoYXIgKmZpbGVuYW1lKQotewotICBiZmRfdm1hIGZyb21fcGMsIHNlbGZfcGM7Ci0gIHN0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQgYXJjOwotICB1bnNpZ25lZCBsb25nIGNvdW50OwotCi0gIGlmIChmcmVhZCAoJmFyYywgc2l6ZW9mIChhcmMpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLSAgZnJvbV9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgYXJjLmZyb21fcGMpOwotICBzZWxmX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuc2VsZl9wYyk7Ci0gIGNvdW50ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuY291bnQpOwotICBEQkcgKFNBTVBMRURFQlVHLAotICAgICAgIHByaW50ZiAoIltjZ19yZWFkX3JlY10gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBmcm9tX3BjLCAodW5zaWduZWQgbG9uZykgc2VsZl9wYywgY291bnQpKTsKLSAgLyogYWRkIHRoaXMgYXJjOiAqLwotICBjZ190YWxseSAoZnJvbV9wYywgc2VsZl9wYywgY291bnQpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBhbGwgdGhlIGFyY3MgaW4gdGhlIGNhbGwtZ3JhcGggdG8gZmlsZSBPRlAuICBGSUxFTkFNRSBpcwotICogdGhlIG5hbWUgb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcwotICogb25seS4KLSAqLwotdm9pZAotREVGVU4gKGNnX3dyaXRlX2FyY3MsIChvZnAsIGZpbGVuYW1lKSwgRklMRSAqIG9mcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFnID0gR01PTl9UQUdfQ0dfQVJDOwotICBzdHJ1Y3QgZ21vbl9jZ19hcmNfcmVjb3JkIHJhd19hcmM7Ci0gIEFyYyAqYXJjOwotICBTeW0gKnN5bTsKLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7IHN5bSsrKQotICAgIHsKLSAgICAgIGZvciAoYXJjID0gc3ltLT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0JewotCSAgcHV0X3ZtYSAoY29yZV9iZmQsIGFyYy0+cGFyZW50LT5hZGRyLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5mcm9tX3BjKTsKLQkgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPmNoaWxkLT5hZGRyLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5zZWxmX3BjKTsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBhcmMtPmNvdW50LCAoYmZkX2J5dGUgKikgcmF3X2FyYy5jb3VudCk7Ci0JICBpZiAoZndyaXRlICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIG9mcCkgIT0gMQotCSAgICAgIHx8IGZ3cml0ZSAoJnJhd19hcmMsIHNpemVvZiAocmF3X2FyYyksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBEQkcgKFNBTVBMRURFQlVHLAotCSAgICAgcHJpbnRmICgiW2NnX3dyaXRlX2FyY3NdIGZyb21wYyAweCVseCBzZWxmcGMgMHglbHggY291bnQgJWx1XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSBhcmMtPnBhcmVudC0+YWRkciwKLQkJICAgICAodW5zaWduZWQgbG9uZykgYXJjLT5jaGlsZC0+YWRkciwgYXJjLT5jb3VudCkpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9jYWxsX2dyYXBoLmggYi9ncHJvZi9jYWxsX2dyYXBoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTEzOWIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2FsbF9ncmFwaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBjYWxsX2dyYXBoX2gKLSNkZWZpbmUgY2FsbF9ncmFwaF9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLWV4dGVybiB2b2lkIGNnX3RhbGx5IFBBUkFNUyAoKGJmZF92bWEgZnJvbV9wYywgYmZkX3ZtYSBzZWxmX3BjLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkpOwotZXh0ZXJuIHZvaWQgY2dfcmVhZF9yZWMgUEFSQU1TICgoRklMRSAqIGlmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGNnX3dyaXRlX2FyY3MgUEFSQU1TICgoRklMRSAqIG9mcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotI2VuZGlmIC8qIGNhbGxfZ3JhcGhfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfYXJjcy5jIGIvZ3Byb2YvY2dfYXJjcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzAyMzE3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX2FyY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2FsbF9ncmFwaC5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19kZm4uaCIKLSNpbmNsdWRlICJjZ19wcmludC5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotCi1TeW0gKmN5Y2xlX2hlYWRlcjsKLXVuc2lnbmVkIGludCBudW1fY3ljbGVzOwotQXJjICoqYXJjczsKLXVuc2lnbmVkIGludCBudW1hcmNzOwotCi0vKgotICogUmV0dXJuIFRSVUUgaWZmIFBBUkVOVCBoYXMgYW4gYXJjIHRvIGNvdmVycyB0aGUgYWRkcmVzcwotICogcmFuZ2UgY292ZXJlZCBieSBDSElMRC4KLSAqLwotQXJjICoKLURFRlVOIChhcmNfbG9va3VwLCAocGFyZW50LCBjaGlsZCksIFN5bSAqIHBhcmVudCBBTkQgU3ltICogY2hpbGQpCi17Ci0gIEFyYyAqYXJjOwotCi0gIGlmICghcGFyZW50IHx8ICFjaGlsZCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJbYXJjX2xvb2t1cF0gcGFyZW50ID09IDAgfHwgY2hpbGQgPT0gMFxuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIERCRyAoTE9PS1VQREVCVUcsIHByaW50ZiAoIlthcmNfbG9va3VwXSBwYXJlbnQgJXMgY2hpbGQgJXNcbiIsCi0JCQkgICAgcGFyZW50LT5uYW1lLCBjaGlsZC0+bmFtZSkpOwotICBmb3IgKGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotICAgIHsKLSAgICAgIERCRyAoTE9PS1VQREVCVUcsIHByaW50ZiAoIlthcmNfbG9va3VwXVx0IHBhcmVudCAlcyBjaGlsZCAlc1xuIiwKLQkJCQlhcmMtPnBhcmVudC0+bmFtZSwgYXJjLT5jaGlsZC0+bmFtZSkpOwotICAgICAgaWYgKGNoaWxkLT5hZGRyID49IGFyYy0+Y2hpbGQtPmFkZHIKLQkgICYmIGNoaWxkLT5lbmRfYWRkciA8PSBhcmMtPmNoaWxkLT5lbmRfYWRkcikKLQl7Ci0JICByZXR1cm4gYXJjOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiBBZGQgKG9yIGp1c3QgaW5jcmVtZW50KSBhbiBhcmM6Ci0gKi8KLXZvaWQKLURFRlVOIChhcmNfYWRkLCAocGFyZW50LCBjaGlsZCwgY291bnQpLAotICAgICAgIFN5bSAqIHBhcmVudCBBTkQgU3ltICogY2hpbGQgQU5EIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4YXJjcyA9IDA7Ci0gIEFyYyAqYXJjLCAqKm5ld2FyY3M7Ci0KLSAgREJHIChUQUxMWURFQlVHLCBwcmludGYgKCJbYXJjX2FkZF0gJWx1IGFyY3MgZnJvbSAlcyB0byAlc1xuIiwKLQkJCSAgIGNvdW50LCBwYXJlbnQtPm5hbWUsIGNoaWxkLT5uYW1lKSk7Ci0gIGFyYyA9IGFyY19sb29rdXAgKHBhcmVudCwgY2hpbGQpOwotICBpZiAoYXJjKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBBIGhpdDoganVzdCBpbmNyZW1lbnQgdGhlIGNvdW50LgotICAgICAgICovCi0gICAgICBEQkcgKFRBTExZREVCVUcsIHByaW50ZiAoIlt0YWxseV0gaGl0ICVsdSArPSAlbHVcbiIsCi0JCQkgICAgICAgYXJjLT5jb3VudCwgY291bnQpKTsKLSAgICAgIGFyYy0+Y291bnQgKz0gY291bnQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBhcmMgPSAoQXJjICopIHhtYWxsb2MgKHNpemVvZiAoKmFyYykpOwotICBtZW1zZXQgKGFyYywgMCwgc2l6ZW9mICgqYXJjKSk7Ci0gIGFyYy0+cGFyZW50ID0gcGFyZW50OwotICBhcmMtPmNoaWxkID0gY2hpbGQ7Ci0gIGFyYy0+Y291bnQgPSBjb3VudDsKLQotICAvKiBJZiB0aGlzIGlzbid0IGFuIGFyYyBmb3IgYSByZWN1cnNpdmUgY2FsbCB0byBwYXJlbnQsIHRoZW4gYWRkIGl0Ci0gICAgIHRvIHRoZSBhcnJheSBvZiBhcmNzLiAgKi8KLSAgaWYgKHBhcmVudCAhPSBjaGlsZCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSd2ZSBleGhhdXN0ZWQgc3BhY2UgaW4gb3VyIGN1cnJlbnQgYXJyYXksIGdldCBhIG5ldyBvbmUKLQkgYW5kIGNvcHkgdGhlIGNvbnRlbnRzLiAgIFdlIG1pZ2h0IHdhbnQgdG8gdGhyb3R0bGUgdGhlIGRvdWJsaW5nCi0JIGZhY3RvciBvbmUgZGF5LiAgKi8KLSAgICAgIGlmIChudW1hcmNzID09IG1heGFyY3MpCi0JewotCSAgLyogRGV0ZXJtaW5lIGhvdyBtdWNoIHNwYWNlIHdlIHdhbnQgdG8gYWxsb2NhdGUuICAqLwotCSAgaWYgKG1heGFyY3MgPT0gMCkKLQkgICAgbWF4YXJjcyA9IDE7Ci0JICBtYXhhcmNzICo9IDI7Ci0JCi0JICAvKiBBbGxvY2F0ZSB0aGUgbmV3IGFycmF5LiAgKi8KLQkgIG5ld2FyY3MgPSAoQXJjICoqKXhtYWxsb2Moc2l6ZW9mIChBcmMgKikgKiBtYXhhcmNzKTsKLQotCSAgLyogQ29weSB0aGUgb2xkIGFycmF5J3MgY29udGVudHMgaW50byB0aGUgbmV3IGFycmF5LiAgKi8KLQkgIG1lbWNweSAobmV3YXJjcywgYXJjcywgbnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLQotCSAgLyogRnJlZSB1cCB0aGUgb2xkIGFycmF5LiAgKi8KLQkgIGZyZWUgKGFyY3MpOwotCi0JICAvKiBBbmQgbWFrZSB0aGUgbmV3IGFycmF5IGJlIHRoZSBjdXJyZW50IGFycmF5LiAgKi8KLQkgIGFyY3MgPSBuZXdhcmNzOwotCX0KLQotICAgICAgLyogUGxhY2UgdGhpcyBhcmMgaW4gdGhlIGFyYyBhcnJheS4gICovCi0gICAgICBhcmNzW251bWFyY3MrK10gPSBhcmM7Ci0gICAgfQotCi0gIC8qIHByZXBlbmQgdGhpcyBjaGlsZCB0byB0aGUgY2hpbGRyZW4gb2YgdGhpcyBwYXJlbnQ6ICovCi0gIGFyYy0+bmV4dF9jaGlsZCA9IHBhcmVudC0+Y2cuY2hpbGRyZW47Ci0gIHBhcmVudC0+Y2cuY2hpbGRyZW4gPSBhcmM7Ci0KLSAgLyogcHJlcGVuZCB0aGlzIHBhcmVudCB0byB0aGUgcGFyZW50cyBvZiB0aGlzIGNoaWxkOiAqLwotICBhcmMtPm5leHRfcGFyZW50ID0gY2hpbGQtPmNnLnBhcmVudHM7Ci0gIGNoaWxkLT5jZy5wYXJlbnRzID0gYXJjOwotfQotCi0KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfdG9wbywgKGxwLCBycCksIGNvbnN0IFBUUiBscCBBTkQgY29uc3QgUFRSIHJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0KLSAgcmV0dXJuIGxlZnQtPmNnLnRvcF9vcmRlciAtIHJpZ2h0LT5jZy50b3Bfb3JkZXI7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcm9wYWdhdGVfdGltZSwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgQXJjICphcmM7Ci0gIFN5bSAqY2hpbGQ7Ci0gIGRvdWJsZSBzaGFyZSwgcHJvcF9zaGFyZTsKLQotICBpZiAocGFyZW50LT5jZy5wcm9wLmZyYWN0ID09IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGdhdGhlciB0aW1lIGZyb20gY2hpbGRyZW4gb2YgdGhpcyBwYXJlbnQ6ICovCi0KLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IGFyYy0+Y2hpbGQ7Ci0gICAgICBpZiAoYXJjLT5jb3VudCA9PSAwIHx8IGNoaWxkID09IHBhcmVudCB8fCBjaGlsZC0+Y2cucHJvcC5mcmFjdCA9PSAwKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gY2hpbGQpCi0JewotCSAgaWYgKHBhcmVudC0+Y2cuY3ljLm51bSA9PSBjaGlsZC0+Y2cuY3ljLm51bSkKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAocGFyZW50LT5jZy50b3Bfb3JkZXIgPD0gY2hpbGQtPmNnLnRvcF9vcmRlcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltwcm9wYWdhdGVdIHRvcG9yZGVyIGJvdGNoZXNcbiIpOwotCSAgICB9Ci0JICBjaGlsZCA9IGNoaWxkLT5jZy5jeWMuaGVhZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHBhcmVudC0+Y2cudG9wX29yZGVyIDw9IGNoaWxkLT5jZy50b3Bfb3JkZXIpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJbcHJvcGFnYXRlXSB0b3BvcmRlciBib3RjaGVzXG4iKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChjaGlsZC0+bmNhbGxzID09IDApCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBkaXN0cmlidXRlIHRpbWUgZm9yIHRoaXMgYXJjOiAqLwotICAgICAgYXJjLT50aW1lID0gY2hpbGQtPmhpc3QudGltZSAqICgoKGRvdWJsZSkgYXJjLT5jb3VudCkKLQkJCQkgICAgICAvICgoZG91YmxlKSBjaGlsZC0+bmNhbGxzKSk7Ci0gICAgICBhcmMtPmNoaWxkX3RpbWUgPSBjaGlsZC0+Y2cuY2hpbGRfdGltZQotCSogKCgoZG91YmxlKSBhcmMtPmNvdW50KSAvICgoZG91YmxlKSBjaGlsZC0+bmNhbGxzKSk7Ci0gICAgICBzaGFyZSA9IGFyYy0+dGltZSArIGFyYy0+Y2hpbGRfdGltZTsKLSAgICAgIHBhcmVudC0+Y2cuY2hpbGRfdGltZSArPSBzaGFyZTsKLQotICAgICAgLyogKDEgLSBjZy5wcm9wLmZyYWN0KSBnZXRzIGxvc3QgYWxvbmcgdGhlIHdheTogKi8KLSAgICAgIHByb3Bfc2hhcmUgPSBwYXJlbnQtPmNnLnByb3AuZnJhY3QgKiBzaGFyZTsKLQotICAgICAgLyogZml4IHRoaW5ncyBmb3IgcHJpbnRpbmc6ICovCi0gICAgICBwYXJlbnQtPmNnLnByb3AuY2hpbGQgKz0gcHJvcF9zaGFyZTsKLSAgICAgIGFyYy0+dGltZSAqPSBwYXJlbnQtPmNnLnByb3AuZnJhY3Q7Ci0gICAgICBhcmMtPmNoaWxkX3RpbWUgKj0gcGFyZW50LT5jZy5wcm9wLmZyYWN0OwotCi0gICAgICAvKiBhZGQgdGhpcyBzaGFyZSB0byB0aGUgcGFyZW50J3MgY3ljbGUgaGVhZGVyLCBpZiBhbnk6ICovCi0gICAgICBpZiAocGFyZW50LT5jZy5jeWMuaGVhZCAhPSBwYXJlbnQpCi0JewotCSAgcGFyZW50LT5jZy5jeWMuaGVhZC0+Y2cuY2hpbGRfdGltZSArPSBzaGFyZTsKLQkgIHBhcmVudC0+Y2cuY3ljLmhlYWQtPmNnLnByb3AuY2hpbGQgKz0gcHJvcF9zaGFyZTsKLQl9Ci0gICAgICBEQkcgKFBST1BERUJVRywKLQkgICBwcmludGYgKCJbcHJvcF90aW1lXSBjaGlsZCBcdCIpOwotCSAgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgICBwcmludGYgKCIgd2l0aCAlZiAlZiAlbHUvJWx1XG4iLCBjaGlsZC0+aGlzdC50aW1lLAotCQkgICBjaGlsZC0+Y2cuY2hpbGRfdGltZSwgYXJjLT5jb3VudCwgY2hpbGQtPm5jYWxscyk7Ci0JICAgcHJpbnRmICgiW3Byb3BfdGltZV0gcGFyZW50XHQiKTsKLQkgICBwcmludF9uYW1lIChwYXJlbnQpOwotCSAgIHByaW50ZiAoIlxuW3Byb3BfdGltZV0gc2hhcmUgJWZcbiIsIHNoYXJlKSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDb21wdXRlIHRoZSB0aW1lIG9mIGEgY3ljbGUgYXMgdGhlIHN1bSBvZiB0aGUgdGltZXMgb2YgYWxsCi0gKiBpdHMgbWVtYmVycy4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQgKGN5Y2xlX3RpbWUpCi17Ci0gIFN5bSAqbWVtYmVyLCAqY3ljOwotCi0gIGZvciAoY3ljID0gJmN5Y2xlX2hlYWRlclsxXTsgY3ljIDw9ICZjeWNsZV9oZWFkZXJbbnVtX2N5Y2xlc107ICsrY3ljKQotICAgIHsKLSAgICAgIGZvciAobWVtYmVyID0gY3ljLT5jZy5jeWMubmV4dDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIGlmIChtZW1iZXItPmNnLnByb3AuZnJhY3QgPT0gMC4wKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBBbGwgbWVtYmVycyBoYXZlIHRoZSBzYW1lIHByb3BmcmFjdGlvbiBleGNlcHQgdGhvc2UKLQkgICAgICAgKiB0aGF0IHdlcmUgZXhjbHVkZWQgd2l0aCAtRS4KLQkgICAgICAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgY3ljLT5oaXN0LnRpbWUgKz0gbWVtYmVyLT5oaXN0LnRpbWU7Ci0JfQotICAgICAgY3ljLT5jZy5wcm9wLnNlbGYgPSBjeWMtPmNnLnByb3AuZnJhY3QgKiBjeWMtPmhpc3QudGltZTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQgKGN5Y2xlX2xpbmspCi17Ci0gIFN5bSAqc3ltLCAqY3ljLCAqbWVtYmVyOwotICBBcmMgKmFyYzsKLSAgaW50IG51bTsKLQotICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIGN5Y2xlcywgYW5kIGluaXRpYWxpemUgdGhlIGN5Y2xlIGxpc3RzOiAqLwotCi0gIG51bV9jeWNsZXMgPSAwOwotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIC8qIHRoaXMgaXMgaG93IHlvdSBmaW5kIHVuYXR0YWNoZWQgY3ljbGVzOiAqLwotICAgICAgaWYgKHN5bS0+Y2cuY3ljLmhlYWQgPT0gc3ltICYmIHN5bS0+Y2cuY3ljLm5leHQpCi0JewotCSAgKytudW1fY3ljbGVzOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogY3ljbGVfaGVhZGVyIGlzIGluZGV4ZWQgYnkgY3ljbGUgbnVtYmVyOiBpLmUuIGl0IGlzIG9yaWdpbiAxLAotICAgKiBub3Qgb3JpZ2luIDAuCi0gICAqLwotICBjeWNsZV9oZWFkZXIgPSAoU3ltICopIHhtYWxsb2MgKChudW1fY3ljbGVzICsgMSkgKiBzaXplb2YgKFN5bSkpOwotCi0gIC8qCi0gICAqIE5vdyBsaW5rIGN5Y2xlcyB0byB0cnVlIGN5Y2xlLWhlYWRzLCBudW1iZXIgdGhlbSwgYWNjdW11bGF0ZQotICAgKiB0aGUgZGF0YSBmb3IgdGhlIGN5Y2xlLgotICAgKi8KLSAgbnVtID0gMDsKLSAgY3ljID0gY3ljbGVfaGVhZGVyOwotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGlmICghKHN5bS0+Y2cuY3ljLmhlYWQgPT0gc3ltICYmIHN5bS0+Y2cuY3ljLm5leHQgIT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgKytudW07Ci0gICAgICArK2N5YzsKLSAgICAgIHN5bV9pbml0IChjeWMpOwotICAgICAgY3ljLT5jZy5wcmludF9mbGFnID0gVFJVRTsJLyogc2hvdWxkIHRoaXMgYmUgcHJpbnRlZD8gKi8KLSAgICAgIGN5Yy0+Y2cudG9wX29yZGVyID0gREZOX05BTjsJLyogZ3JhcGggY2FsbCBjaGFpbiB0b3Atc29ydCBvcmRlciAqLwotICAgICAgY3ljLT5jZy5jeWMubnVtID0gbnVtOwkvKiBpbnRlcm5hbCBudW1iZXIgb2YgY3ljbGUgb24gKi8KLSAgICAgIGN5Yy0+Y2cuY3ljLmhlYWQgPSBjeWM7CS8qIHBvaW50ZXIgdG8gaGVhZCBvZiBjeWNsZSAqLwotICAgICAgY3ljLT5jZy5jeWMubmV4dCA9IHN5bTsJLyogcG9pbnRlciB0byBuZXh0IG1lbWJlciBvZiBjeWNsZSAqLwotICAgICAgREJHIChDWUNMRURFQlVHLCBwcmludGYgKCJbY3ljbGVfbGlua10gIik7Ci0JICAgcHJpbnRfbmFtZSAoc3ltKTsKLQkgICBwcmludGYgKCIgaXMgdGhlIGhlYWQgb2YgY3ljbGUgJWRcbiIsIG51bSkpOwotCi0gICAgICAvKiBsaW5rIG1lbWJlcnMgdG8gY3ljbGUgaGVhZGVyOiAqLwotICAgICAgZm9yIChtZW1iZXIgPSBzeW07IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBtZW1iZXItPmNnLmN5Yy5udW0gPSBudW07Ci0JICBtZW1iZXItPmNnLmN5Yy5oZWFkID0gY3ljOwotCX0KLQotICAgICAgLyoKLSAgICAgICAqIENvdW50IGNhbGxzIGZyb20gb3V0c2lkZSB0aGUgY3ljbGUgYW5kIHRob3NlIGFtb25nIGN5Y2xlCi0gICAgICAgKiBtZW1iZXJzOgotICAgICAgICovCi0gICAgICBmb3IgKG1lbWJlciA9IHN5bTsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIGZvciAoYXJjID0gbWVtYmVyLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQpCi0JICAgIHsKLQkgICAgICBpZiAoYXJjLT5wYXJlbnQgPT0gbWVtYmVyKQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoYXJjLT5wYXJlbnQtPmNnLmN5Yy5udW0gPT0gbnVtKQotCQl7Ci0JCSAgY3ljLT5jZy5zZWxmX2NhbGxzICs9IGFyYy0+Y291bnQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjeWMtPm5jYWxscyArPSBhcmMtPmNvdW50OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDaGVjayBpZiBhbnkgcGFyZW50IG9mIHRoaXMgY2hpbGQgKG9yIG91dHNpZGUgcGFyZW50cyBvZiB0aGlzCi0gKiBjeWNsZSkgaGF2ZSB0aGVpciBwcmludCBmbGFncyBvbiBhbmQgc2V0IHRoZSBwcmludCBmbGFnIG9mIHRoZQotICogY2hpbGQgKGN5Y2xlKSBhcHByb3ByaWF0ZWx5LiAgU2ltaWxhcmx5LCBkZWFsIHdpdGggcHJvcGFnYXRpb24KLSAqIGZyYWN0aW9ucyBmcm9tIHBhcmVudHMuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoaW5oZXJpdF9mbGFncywgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIFN5bSAqaGVhZCwgKnBhcmVudCwgKm1lbWJlcjsKLSAgQXJjICphcmM7Ci0KLSAgaGVhZCA9IGNoaWxkLT5jZy5jeWMuaGVhZDsKLSAgaWYgKGNoaWxkID09IGhlYWQpCi0gICAgewotICAgICAgLyoganVzdCBhIHJlZ3VsYXIgY2hpbGQsIGNoZWNrIGl0cyBwYXJlbnRzOiAqLwotICAgICAgY2hpbGQtPmNnLnByaW50X2ZsYWcgPSBGQUxTRTsKLSAgICAgIGNoaWxkLT5jZy5wcm9wLmZyYWN0ID0gMC4wOwotICAgICAgZm9yIChhcmMgPSBjaGlsZC0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQotCXsKLQkgIHBhcmVudCA9IGFyYy0+cGFyZW50OwotCSAgaWYgKGNoaWxkID09IHBhcmVudCkKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBjaGlsZC0+Y2cucHJpbnRfZmxhZyB8PSBwYXJlbnQtPmNnLnByaW50X2ZsYWc7Ci0JICAvKgotCSAgICogSWYgdGhlIGNoaWxkIHdhcyBuZXZlciBhY3R1YWxseSBjYWxsZWQgKGUuZy4sIHRoaXMgYXJjCi0JICAgKiBpcyBzdGF0aWMgKGFuZCBhbGwgb3RoZXJzIGFyZSwgdG9vKSkgbm8gdGltZSBwcm9wYWdhdGVzCi0JICAgKiBhbG9uZyB0aGlzIGFyYy4KLQkgICAqLwotCSAgaWYgKGNoaWxkLT5uY2FsbHMgIT0gMCkKLQkgICAgewotCSAgICAgIGNoaWxkLT5jZy5wcm9wLmZyYWN0ICs9IHBhcmVudC0+Y2cucHJvcC5mcmFjdAotCQkqICgoKGRvdWJsZSkgYXJjLT5jb3VudCkgLyAoKGRvdWJsZSkgY2hpbGQtPm5jYWxscykpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBJdHMgYSBtZW1iZXIgb2YgYSBjeWNsZSwgbG9vayBhdCBhbGwgcGFyZW50cyBmcm9tIG91dHNpZGUKLSAgICAgICAqIHRoZSBjeWNsZS4KLSAgICAgICAqLwotICAgICAgaGVhZC0+Y2cucHJpbnRfZmxhZyA9IEZBTFNFOwotICAgICAgaGVhZC0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLSAgICAgIGZvciAobWVtYmVyID0gaGVhZC0+Y2cuY3ljLm5leHQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBmb3IgKGFyYyA9IG1lbWJlci0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQotCSAgICB7Ci0JICAgICAgaWYgKGFyYy0+cGFyZW50LT5jZy5jeWMuaGVhZCA9PSBoZWFkKQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBwYXJlbnQgPSBhcmMtPnBhcmVudDsKLQkgICAgICBoZWFkLT5jZy5wcmludF9mbGFnIHw9IHBhcmVudC0+Y2cucHJpbnRfZmxhZzsKLQkgICAgICAvKgotCSAgICAgICAqIElmIHRoZSBjeWNsZSB3YXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIChlLmcuIHRoaXMKLQkgICAgICAgKiBhcmMgaXMgc3RhdGljIChhbmQgYWxsIG90aGVycyBhcmUsIHRvbykpIG5vIHRpbWUKLQkgICAgICAgKiBwcm9wYWdhdGVzIGFsb25nIHRoaXMgYXJjLgotCSAgICAgICAqLwotCSAgICAgIGlmIChoZWFkLT5uY2FsbHMgIT0gMCkKLQkJewotCQkgIGhlYWQtPmNnLnByb3AuZnJhY3QgKz0gcGFyZW50LT5jZy5wcm9wLmZyYWN0Ci0JCSAgICAqICgoKGRvdWJsZSkgYXJjLT5jb3VudCkgLyAoKGRvdWJsZSkgaGVhZC0+bmNhbGxzKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGZvciAobWVtYmVyID0gaGVhZDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIG1lbWJlci0+Y2cucHJpbnRfZmxhZyA9IGhlYWQtPmNnLnByaW50X2ZsYWc7Ci0JICBtZW1iZXItPmNnLnByb3AuZnJhY3QgPSBoZWFkLT5jZy5wcm9wLmZyYWN0OwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIEluIG9uZSB0b3AtdG8tYm90dG9tIHBhc3Mgb3ZlciB0aGUgdG9wb2xvZ2ljYWxseSBzb3J0ZWQgc3ltYm9scwotICogcHJvcGFnYXRlOgotICogICAgICBjZy5wcmludF9mbGFnIGFzIHRoZSB1bmlvbiBvZiBwYXJlbnRzJyBwcmludF9mbGFncwotICogICAgICBwcm9wZnJhY3Rpb24gYXMgdGhlIHN1bSBvZiBmcmFjdGlvbmFsIHBhcmVudHMnIHByb3BmcmFjdGlvbnMKLSAqIGFuZCB3aGlsZSB3ZSdyZSBoZXJlLCBzdW0gdGltZSBmb3IgZnVuY3Rpb25zLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHByb3BhZ2F0ZV9mbGFncywgKHN5bWJvbHMpLCBTeW0gKiogc3ltYm9scykKLXsKLSAgaW50IGluZGV4OwotICBTeW0gKm9sZF9oZWFkLCAqY2hpbGQ7Ci0KLSAgb2xkX2hlYWQgPSAwOwotICBmb3IgKGluZGV4ID0gc3ltdGFiLmxlbiAtIDE7IGluZGV4ID49IDA7IC0taW5kZXgpCi0gICAgewotICAgICAgY2hpbGQgPSBzeW1ib2xzW2luZGV4XTsKLSAgICAgIC8qCi0gICAgICAgKiBJZiB3ZSBoYXZlbid0IGRvbmUgdGhpcyBmdW5jdGlvbiBvciBjeWNsZSwgaW5oZXJpdCB0aGluZ3MKLSAgICAgICAqIGZyb20gcGFyZW50LiAgVGhpcyB3YXksIHdlIGFyZSBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBhcmNzCi0gICAgICAgKiBzaW5jZSB3ZSBkbyBhbGwgbWVtYmVycyBvZiBhIGN5Y2xlIChhbmQgdGhlIGN5Y2xlIGl0c2VsZikKLSAgICAgICAqIGFzIHdlIGhpdCB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBjeWNsZS4KLSAgICAgICAqLwotICAgICAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSBvbGRfaGVhZCkKLQl7Ci0JICBvbGRfaGVhZCA9IGNoaWxkLT5jZy5jeWMuaGVhZDsKLQkgIGluaGVyaXRfZmxhZ3MgKGNoaWxkKTsKLQl9Ci0gICAgICBEQkcgKFBST1BERUJVRywKLQkgICBwcmludGYgKCJbcHJvcF9mbGFnc10gIik7Ci0JICAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgIHByaW50ZiAoImluaGVyaXRzIHByaW50LWZsYWcgJWQgYW5kIHByb3AtZnJhY3QgJWZcbiIsCi0JCSAgIGNoaWxkLT5jZy5wcmludF9mbGFnLCBjaGlsZC0+Y2cucHJvcC5mcmFjdCkpOwotICAgICAgaWYgKCFjaGlsZC0+Y2cucHJpbnRfZmxhZykKLQl7Ci0JICAvKgotCSAgICogUHJpbnRmbGFnIGlzIG9mZi4gSXQgZ2V0cyB0dXJuZWQgb24gYnkgYmVpbmcgaW4gdGhlCi0JICAgKiBJTkNMX0dSQVBIIHRhYmxlLCBvciB0aGVyZSBiZWluZyBhbiBlbXB0eSBJTkNMX0dSQVBICi0JICAgKiB0YWJsZSBhbmQgbm90IGJlaW5nIGluIHRoZSBFWENMX0dSQVBIIHRhYmxlLgotCSAgICovCi0JICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9HUkFQSF0sIGNoaWxkLT5hZGRyKQotCSAgICAgIHx8IChzeW1zW0lOQ0xfR1JBUEhdLmxlbiA9PSAwCi0JCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfR1JBUEhdLCBjaGlsZC0+YWRkcikpKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByaW50X2ZsYWcgPSBUUlVFOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyBwcmludGluZyBwYXJlbnRzOiBtYXliZSBzb21lb25lIHdhbnRzCi0JICAgKiB0byBzaHV0IGl0IHVwIGJ5IHB1dHRpbmcgaXQgaW4gdGhlIEVYQ0xfR1JBUEggdGFibGUuCi0JICAgKiAoQnV0IGZhdm9yIElOQ0xfR1JBUEggb3ZlciBFWENMX0dSQVBILikKLQkgICAqLwotCSAgaWYgKCFzeW1fbG9va3VwICgmc3ltc1tJTkNMX0dSQVBIXSwgY2hpbGQtPmFkZHIpCi0JICAgICAgJiYgc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9HUkFQSF0sIGNoaWxkLT5hZGRyKSkKLQkgICAgewotCSAgICAgIGNoaWxkLT5jZy5wcmludF9mbGFnID0gRkFMU0U7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY2hpbGQtPmNnLnByb3AuZnJhY3QgPT0gMC4wKQotCXsKLQkgIC8qCi0JICAgKiBObyBwYXJlbnRzIHRvIHBhc3MgdGltZSB0by4gIENvbGxlY3QgdGltZSBmcm9tIGNoaWxkcmVuCi0JICAgKiBpZiBpdHMgaW4gdGhlIElOQ0xfVElNRSB0YWJsZSwgb3IgdGhlcmUgaXMgYW4gZW1wdHkKLQkgICAqIElOQ0xfVElNRSB0YWJsZSBhbmQgaXRzIG5vdCBpbiB0aGUgRVhDTF9USU1FIHRhYmxlLgotCSAgICovCi0JICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9USU1FXSwgY2hpbGQtPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9USU1FXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX1RJTUVdLCBjaGlsZC0+YWRkcikpKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByb3AuZnJhY3QgPSAxLjA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoKLQkgICAqIEl0IGhhcyBwYXJlbnRzIHRvIHBhc3MgdGltZSB0bywgYnV0IG1heWJlIHNvbWVvbmUgd2FudHMKLQkgICAqIHRvIHNodXQgaXQgdXAgYnkgcHV0dHRpbmcgaXQgaW4gdGhlIEVYQ0xfVElNRSB0YWJsZS4KLQkgICAqIChCdXQgZmF2b3IgYmVpbmcgaW4gSU5DTF9USU1FIHRhYmUgb3ZlciBiZWluZyBpbgotCSAgICogRVhDTF9USU1FIHRhYmxlLikKLQkgICAqLwotCSAgaWYgKCFzeW1fbG9va3VwICgmc3ltc1tJTkNMX1RJTUVdLCBjaGlsZC0+YWRkcikKLQkgICAgICAmJiBzeW1fbG9va3VwICgmc3ltc1tFWENMX1RJTUVdLCBjaGlsZC0+YWRkcikpCi0JICAgIHsKLQkgICAgICBjaGlsZC0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLQkgICAgfQotCX0KLSAgICAgIGNoaWxkLT5jZy5wcm9wLnNlbGYgPSBjaGlsZC0+aGlzdC50aW1lICogY2hpbGQtPmNnLnByb3AuZnJhY3Q7Ci0gICAgICBwcmludF90aW1lICs9IGNoaWxkLT5jZy5wcm9wLnNlbGY7Ci0gICAgICBEQkcgKFBST1BERUJVRywKLQkgICBwcmludGYgKCJbcHJvcF9mbGFnc10gIik7Ci0JICAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgIHByaW50ZiAoIiBlbmRzIHVwIHdpdGggcHJpbnRmbGFnICVkIGFuZCBwcm9wLWZyYWN0ICVmXG4iLAotCQkgICBjaGlsZC0+Y2cucHJpbnRfZmxhZywgY2hpbGQtPmNnLnByb3AuZnJhY3QpOwotCSAgIHByaW50ZiAoIltwcm9wX2ZsYWdzXSB0aW1lICVmIHByb3BzZWxmICVmIHByaW50X3RpbWUgJWZcbiIsCi0JCSAgIGNoaWxkLT5oaXN0LnRpbWUsIGNoaWxkLT5jZy5wcm9wLnNlbGYsIHByaW50X3RpbWUpKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgYnkgZGVjcmVhc2luZyBwcm9wYWdhdGVkIHRpbWUuICBJZiB0aW1lcyBhcmUgZXF1YWwsIGJ1dCBvbmUKLSAqIGlzIGEgY3ljbGUgaGVhZGVyLCBzYXkgdGhhdCdzIGZpcnN0IChlLmcuIGxlc3MsIGkuZS4gLTEpLiAgSWYgb25lJ3MKLSAqIG5hbWUgZG9lc24ndCBoYXZlIGFuIHVuZGVyc2NvcmUgYW5kIHRoZSBvdGhlciBkb2VzLCBzYXkgdGhhdCBvbmUgaXMKLSAqIGZpcnN0LiAgQWxsIGVsc2UgYmVpbmcgZXF1YWwsIGNvbXBhcmUgYnkgbmFtZXMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfdG90YWwsIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKLXsKLSAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOwotICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOwotICBkb3VibGUgZGlmZjsKLQotICBkaWZmID0gKGxlZnQtPmNnLnByb3Auc2VsZiArIGxlZnQtPmNnLnByb3AuY2hpbGQpCi0gICAgLSAocmlnaHQtPmNnLnByb3Auc2VsZiArIHJpZ2h0LT5jZy5wcm9wLmNoaWxkKTsKLSAgaWYgKGRpZmYgPCAwLjApCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoZGlmZiA+IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoIWxlZnQtPm5hbWUgJiYgbGVmdC0+Y2cuY3ljLm51bSAhPSAwKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmICghcmlnaHQtPm5hbWUgJiYgcmlnaHQtPmNnLmN5Yy5udW0gIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmICghbGVmdC0+bmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoIXJpZ2h0LT5uYW1lKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGxlZnQtPm5hbWVbMF0gIT0gJ18nICYmIHJpZ2h0LT5uYW1lWzBdID09ICdfJykKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAobGVmdC0+bmFtZVswXSA9PSAnXycgJiYgcmlnaHQtPm5hbWVbMF0gIT0gJ18nKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGxlZnQtPm5jYWxscyA+IHJpZ2h0LT5uY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKGxlZnQtPm5jYWxscyA8IHJpZ2h0LT5uY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gc3RyY21wIChsZWZ0LT5uYW1lLCByaWdodC0+bmFtZSk7Ci19Ci0KLQotLyoKLSAqIFRvcG9sb2dpY2FsbHkgc29ydCB0aGUgZ3JhcGggKGNvbGxhcHNpbmcgY3ljbGVzKSwgYW5kIHByb3BhZ2F0ZXMKLSAqIHRpbWUgYm90dG9tIHVwIGFuZCBmbGFncyB0b3AgZG93bi4KLSAqLwotU3ltICoqCi1ERUZVTl9WT0lEIChjZ19hc3NlbWJsZSkKLXsKLSAgU3ltICpwYXJlbnQsICoqdGltZV9zb3J0ZWRfc3ltcywgKip0b3Bfc29ydGVkX3N5bXM7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgQXJjICphcmM7Ci0KLSAgLyoKLSAgICogaW5pdGlhbGl6ZSB2YXJpb3VzIHRoaW5nczoKLSAgICogICAgICB6ZXJvIG91dCBjaGlsZCB0aW1lcy4KLSAgICogICAgICBjb3VudCBzZWxmLXJlY3Vyc2l2ZSBjYWxscy4KLSAgICogICAgICBpbmRpY2F0ZSB0aGF0IG5vdGhpbmcgaXMgb24gY3ljbGVzLgotICAgKi8KLSAgZm9yIChwYXJlbnQgPSBzeW10YWIuYmFzZTsgcGFyZW50IDwgc3ltdGFiLmxpbWl0OyBwYXJlbnQrKykKLSAgICB7Ci0gICAgICBwYXJlbnQtPmNnLmNoaWxkX3RpbWUgPSAwLjA7Ci0gICAgICBhcmMgPSBhcmNfbG9va3VwIChwYXJlbnQsIHBhcmVudCk7Ci0gICAgICBpZiAoYXJjICYmIHBhcmVudCA9PSBhcmMtPmNoaWxkKQotCXsKLQkgIHBhcmVudC0+bmNhbGxzIC09IGFyYy0+Y291bnQ7Ci0JICBwYXJlbnQtPmNnLnNlbGZfY2FsbHMgPSBhcmMtPmNvdW50OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwYXJlbnQtPmNnLnNlbGZfY2FsbHMgPSAwOwotCX0KLSAgICAgIHBhcmVudC0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLSAgICAgIHBhcmVudC0+Y2cucHJvcC5zZWxmID0gMC4wOwotICAgICAgcGFyZW50LT5jZy5wcm9wLmNoaWxkID0gMC4wOwotICAgICAgcGFyZW50LT5jZy5wcmludF9mbGFnID0gRkFMU0U7Ci0gICAgICBwYXJlbnQtPmNnLnRvcF9vcmRlciA9IERGTl9OQU47Ci0gICAgICBwYXJlbnQtPmNnLmN5Yy5udW0gPSAwOwotICAgICAgcGFyZW50LT5jZy5jeWMuaGVhZCA9IHBhcmVudDsKLSAgICAgIHBhcmVudC0+Y2cuY3ljLm5leHQgPSAwOwotICAgICAgaWYgKGlnbm9yZV9kaXJlY3RfY2FsbHMpCi0JewotCSAgZmluZF9jYWxsIChwYXJlbnQsIHBhcmVudC0+YWRkciwgKHBhcmVudCArIDEpLT5hZGRyKTsKLQl9Ci0gICAgfQotICAvKgotICAgKiBUb3BvbG9naWNhbGx5IG9yZGVyIHRoaW5ncy4gIElmIGFueSBub2RlIGlzIHVubnVtYmVyZWQsIG51bWJlcgotICAgKiBpdCBhbmQgYW55IG9mIGl0cyBkZXNjZW5kZW50cy4KLSAgICovCi0gIGZvciAocGFyZW50ID0gc3ltdGFiLmJhc2U7IHBhcmVudCA8IHN5bXRhYi5saW1pdDsgcGFyZW50KyspCi0gICAgewotICAgICAgaWYgKHBhcmVudC0+Y2cudG9wX29yZGVyID09IERGTl9OQU4pCi0JewotCSAgY2dfZGZuIChwYXJlbnQpOwotCX0KLSAgICB9Ci0KLSAgLyogbGluayB0b2dldGhlciBub2RlcyBvbiB0aGUgc2FtZSBjeWNsZTogKi8KLSAgY3ljbGVfbGluayAoKTsKLQotICAvKiBzb3J0IHRoZSBzeW1ib2wgdGFibGUgaW4gcmV2ZXJzZSB0b3BvbG9naWNhbCBvcmRlcjogKi8KLSAgdG9wX3NvcnRlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICB7Ci0gICAgICB0b3Bfc29ydGVkX3N5bXNbaW5kZXhdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0ICh0b3Bfc29ydGVkX3N5bXMsIHN5bXRhYi5sZW4sIHNpemVvZiAoU3ltICopLCBjbXBfdG9wbyk7Ci0gIERCRyAoREZOREVCVUcsCi0gICAgICAgcHJpbnRmICgiW2NnX2Fzc2VtYmxlXSB0b3BvbG9naWNhbCBzb3J0IGxpc3RpbmdcbiIpOwotICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0gICAgICAgewotICAgICAgIHByaW50ZiAoIltjZ19hc3NlbWJsZV0gIik7Ci0gICAgICAgcHJpbnRmICgiJWQ6IiwgdG9wX3NvcnRlZF9zeW1zW2luZGV4XS0+Y2cudG9wX29yZGVyKTsKLSAgICAgICBwcmludF9uYW1lICh0b3Bfc29ydGVkX3N5bXNbaW5kZXhdKTsKLSAgICAgICBwcmludGYgKCJcbiIpOwotICAgICAgIH0KLSAgKTsKLSAgLyoKLSAgICogU3RhcnRpbmcgZnJvbSB0aGUgdG9wb2xvZ2ljYWwgdG9wLCBwcm9wYWdhdGUgcHJpbnQgZmxhZ3MgdG8KLSAgICogY2hpbGRyZW4uICBhbHNvLCBjYWxjdWxhdGUgcHJvcGFnYXRpb24gZnJhY3Rpb25zLiAgdGhpcyBoYXBwZW5zCi0gICAqIGJlZm9yZSB0aW1lIHByb3BhZ2F0aW9uIHNpbmNlIHRpbWUgcHJvcGFnYXRpb24gdXNlcyB0aGUKLSAgICogZnJhY3Rpb25zLgotICAgKi8KLSAgcHJvcGFnYXRlX2ZsYWdzICh0b3Bfc29ydGVkX3N5bXMpOwotCi0gIC8qCi0gICAqIFN0YXJ0aW5nIGZyb20gdGhlIHRvcG9sb2dpY2FsIGJvdHRvbSwgcHJvcG9nYXRlIGNoaWxkcmVuIHRpbWVzCi0gICAqIHVwIHRvIHBhcmVudHMuCi0gICAqLwotICBjeWNsZV90aW1lICgpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgIHsKLSAgICAgIHByb3BhZ2F0ZV90aW1lICh0b3Bfc29ydGVkX3N5bXNbaW5kZXhdKTsKLSAgICB9Ci0KLSAgZnJlZSAodG9wX3NvcnRlZF9zeW1zKTsKLQotICAvKgotICAgKiBOb3csIHNvcnQgYnkgQ0cuUFJPUC5TRUxGICsgQ0cuUFJPUC5DSElMRC4gIFNvcnRpbmcgYm90aCB0aGUgcmVndWxhcgotICAgKiBmdW5jdGlvbiBuYW1lcyBhbmQgY3ljbGUgaGVhZGVycy4KLSAgICovCi0gIHRpbWVfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jICgoc3ltdGFiLmxlbiArIG51bV9jeWNsZXMpICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIGZvciAoaW5kZXggPSAxOyBpbmRleCA8PSBudW1fY3ljbGVzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbc3ltdGFiLmxlbiArIGluZGV4IC0gMV0gPSAmY3ljbGVfaGVhZGVyW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0ICh0aW1lX3NvcnRlZF9zeW1zLCBzeW10YWIubGVuICsgbnVtX2N5Y2xlcywgc2l6ZW9mIChTeW0gKiksCi0JIGNtcF90b3RhbCk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdLT5jZy5pbmRleCA9IGluZGV4ICsgMTsKLSAgICB9Ci0gIHJldHVybiB0aW1lX3NvcnRlZF9zeW1zOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfYXJjcy5oIGIvZ3Byb2YvY2dfYXJjcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWEwMTk3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX2FyY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSNpZm5kZWYgY2dfYXJjc19oCi0jZGVmaW5lIGNnX2FyY3NfaAotCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotLyoKLSAqIEFyYyBzdHJ1Y3R1cmUgZm9yIGNhbGwtZ3JhcGguCi0gKgotICogV2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBvZiB0aGUgcGFyZW50IGFuZCB0aGUgY2hpbGQsIGEgY291bnQKLSAqIG9mIGhvdyBtYW55IHRpbWVzIHRoaXMgYXJjIHdhcyB0cmF2ZXJzZWQsIGFuZCBwb2ludGVycyB0byB0aGUgbmV4dAotICogcGFyZW50IG9mIHRoaXMgY2hpbGQgYW5kIHRoZSBuZXh0IGNoaWxkIG9mIHRoaXMgcGFyZW50LgotICovCi10eXBlZGVmIHN0cnVjdCBhcmMKLSAgewotICAgIFN5bSAqcGFyZW50OwkJLyogc291cmNlIHZlcnRpY2Ugb2YgYXJjICovCi0gICAgU3ltICpjaGlsZDsJCQkvKiBkZXN0IHZlcnRpY2Ugb2YgYXJjICovCi0gICAgdW5zaWduZWQgbG9uZyBjb3VudDsJLyogIyBvZiBjYWxscyBmcm9tIHBhcmVudCB0byBjaGlsZCAqLwotICAgIGRvdWJsZSB0aW1lOwkJLyogdGltZSBpbmhlcml0ZWQgYWxvbmcgYXJjICovCi0gICAgZG91YmxlIGNoaWxkX3RpbWU7CQkvKiBjaGlsZC10aW1lIGluaGVyaXRlZCBhbG9uZyBhcmMgKi8KLSAgICBzdHJ1Y3QgYXJjICpuZXh0X3BhcmVudDsJLyogbmV4dCBwYXJlbnQgb2YgQ0hJTEQgKi8KLSAgICBzdHJ1Y3QgYXJjICpuZXh0X2NoaWxkOwkvKiBuZXh0IGNoaWxkIG9mIFBBUkVOVCAqLwotICAgIGludCBoYXNfYmVlbl9wbGFjZWQ7CS8qIGhhdmUgdGhpcyBhcmMncyBmdW5jdGlvbnMgYmVlbiBwbGFjZWQ/ICovCi0gIH0KLUFyYzsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fY3ljbGVzOwkvKiBudW1iZXIgb2YgY3ljbGVzIGRpc2NvdmVyZWQgKi8KLWV4dGVybiBTeW0gKmN5Y2xlX2hlYWRlcjsJLyogY3ljbGUgaGVhZGVycyAqLwotCi1leHRlcm4gdm9pZCBhcmNfYWRkIFBBUkFNUyAoKFN5bSAqIHBhcmVudCwgU3ltICogY2hpbGQsIHVuc2lnbmVkIGxvbmcgY291bnQpKTsKLWV4dGVybiBBcmMgKmFyY19sb29rdXAgUEFSQU1TICgoU3ltICogcGFyZW50LCBTeW0gKiBjaGlsZCkpOwotZXh0ZXJuIFN5bSAqKmNnX2Fzc2VtYmxlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBBcmMgKiphcmNzOwotZXh0ZXJuIHVuc2lnbmVkIGludCBudW1hcmNzOwotCi0jZW5kaWYgLyogY2dfYXJjc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19kZm4uYyBiL2dwcm9mL2NnX2Rmbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQ2NGU3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX2Rmbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19kZm4uaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi0jZGVmaW5lCURGTl9JTkNSX0RFUFRIICgxMjgpCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBTeW0gKnN5bTsKLSAgICBpbnQgY3ljbGVfdG9wOwotICB9Ci1ERk5fU3RhY2s7Ci0KLURGTl9TdGFjayAqZGZuX3N0YWNrID0gTlVMTDsKLWludCBkZm5fbWF4ZGVwdGggPSAwOwotaW50IGRmbl9kZXB0aCA9IDA7Ci1pbnQgZGZuX2NvdW50ZXIgPSBERk5fTkFOOwotCi0KLS8qCi0gKiBJcyBDSElMRCBhbHJlYWR5IG51bWJlcmVkPwotICovCi1zdGF0aWMgYm9vbAotREVGVU4gKGlzX251bWJlcmVkLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgcmV0dXJuIGNoaWxkLT5jZy50b3Bfb3JkZXIgIT0gREZOX05BTiAmJiBjaGlsZC0+Y2cudG9wX29yZGVyICE9IERGTl9CVVNZOwotfQotCi0KLS8qCi0gKiBJcyBDSElMRCBhbHJlYWR5IGJ1c3k/Ci0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAoaXNfYnVzeSwgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIGlmIChjaGlsZC0+Y2cudG9wX29yZGVyID09IERGTl9OQU4pCi0gICAgewotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIENISUxEIGlzIHBhcnQgb2YgYSBjeWNsZS4gIEZpbmQgdGhlIHRvcCBjYWxsZXIgaW50byB0aGlzIGN5Y2xlCi0gKiB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSBjeWNsZSBhbmQgbWFrZSBhbGwgZnVuY3Rpb25zIGluIGN5Y2xlCi0gKiBtZW1iZXJzIG9mIHRoYXQgY3ljbGUgKHRvcCBjYWxsZXIgPT0gY2FsbGVyIHdpdGggc21hbGxlc3QKLSAqIGRlcHRoLWZpcnN0IG51bWJlcikuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZmluZF9jeWNsZSwgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIFN5bSAqaGVhZCA9IDA7Ci0gIFN5bSAqdGFpbDsKLSAgaW50IGN5Y2xlX3RvcDsKLSAgaW50IGluZGV4OwotCi0gIGZvciAoY3ljbGVfdG9wID0gZGZuX2RlcHRoOyBjeWNsZV90b3AgPiAwOyAtLWN5Y2xlX3RvcCkKLSAgICB7Ci0gICAgICBoZWFkID0gZGZuX3N0YWNrW2N5Y2xlX3RvcF0uc3ltOwotICAgICAgaWYgKGNoaWxkID09IGhlYWQpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSBjaGlsZCAmJiBjaGlsZC0+Y2cuY3ljLmhlYWQgPT0gaGVhZCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBpZiAoY3ljbGVfdG9wIDw9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2ZpbmRfY3ljbGVdIGNvdWxkbid0IGZpbmQgaGVhZCBvZiBjeWNsZVxuIik7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0jaWZkZWYgREVCVUcKLSAgaWYgKGRlYnVnX2xldmVsICYgREZOREVCVUcpCi0gICAgewotICAgICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGRmbl9kZXB0aCAlZCBjeWNsZV90b3AgJWQgIiwKLQkgICAgICBkZm5fZGVwdGgsIGN5Y2xlX3RvcCk7Ci0gICAgICBpZiAoaGVhZCkKLQl7Ci0JICBwcmludF9uYW1lIChoZWFkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiPHVua25vd24+Iik7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGN5Y2xlX3RvcCA9PSBkZm5fZGVwdGgpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFRoaXMgaXMgcHJldmlvdXMgZnVuY3Rpb24sIGUuZy4gdGhpcyBjYWxscyBpdHNlbGYuICBTb3J0IG9mCi0gICAgICAgKiBib3JpbmcuCi0gICAgICAgKgotICAgICAgICogU2luY2Ugd2UgYXJlIHRha2luZyBvdXQgc2VsZi1jeWNsZXMgZWxzZXdoZXJlIG5vIG5lZWQgZm9yCi0gICAgICAgKiB0aGUgc3BlY2lhbCBjYXNlLCBoZXJlLgotICAgICAgICovCi0gICAgICBEQkcgKERGTkRFQlVHLAotCSAgIHByaW50ZiAoIltmaW5kX2N5Y2xlXSAiKTsKLQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICAgcHJpbnRmICgiXG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEdsb20gaW50ZXJ2ZW5pbmcgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGFscmVhZHkgZ2xvbW1lZCBpbnRvCi0gICAgICAgKiB0aGlzIGN5Y2xlLiAgVGhpbmdzIGhhdmUgYmVlbiBnbG9tbWVkIHdoZW4gdGhlaXIgY3ljbGVoZWFkCi0gICAgICAgKiBmaWVsZCBwb2ludHMgdG8gdGhlIGhlYWQgb2YgdGhlIGN5Y2xlIHRoZXkgYXJlIGdsb21tZWQKLSAgICAgICAqIGludG8uCi0gICAgICAgKi8KLSAgICAgIGZvciAodGFpbCA9IGhlYWQ7IHRhaWwtPmNnLmN5Yy5uZXh0OyB0YWlsID0gdGFpbC0+Y2cuY3ljLm5leHQpCi0JewotCSAgLyogdm9pZDogY2hhc2UgZG93biB0byB0YWlsIG9mIHRoaW5ncyBhbHJlYWR5IGdsb21tZWQgKi8KLQkgIERCRyAoREZOREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kX2N5Y2xlXSB0YWlsICIpOwotCSAgICAgICBwcmludF9uYW1lICh0YWlsKTsKLQkgICAgICAgcHJpbnRmICgiXG4iKSk7Ci0JfQotICAgICAgLyoKLSAgICAgICAqIElmIHdoYXQgd2UgdGhpbmsgaXMgdGhlIHRvcCBvZiB0aGUgY3ljbGUgaGFzIGEgY3ljbGVoZWFkCi0gICAgICAgKiBmaWVsZCwgdGhlbiBpdCdzIG5vdCByZWFsbHkgdGhlIGhlYWQgb2YgdGhlIGN5Y2xlLCB3aGljaCBpcwotICAgICAgICogcmVhbGx5IHdoYXQgd2Ugd2FudC4KLSAgICAgICAqLwotICAgICAgaWYgKGhlYWQtPmNnLmN5Yy5oZWFkICE9IGhlYWQpCi0JewotCSAgaGVhZCA9IGhlYWQtPmNnLmN5Yy5oZWFkOwotCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIG5ldyBjeWNsZWhlYWQgIik7Ci0JICAgICAgIHByaW50X25hbWUgKGhlYWQpOwotCSAgICAgICBwcmludGYgKCJcbiIpKTsKLQl9Ci0gICAgICBmb3IgKGluZGV4ID0gY3ljbGVfdG9wICsgMTsgaW5kZXggPD0gZGZuX2RlcHRoOyArK2luZGV4KQotCXsKLQkgIGNoaWxkID0gZGZuX3N0YWNrW2luZGV4XS5zeW07Ci0JICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkID09IGNoaWxkKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBOb3QgeWV0IGdsb21tZWQgYW55d2hlcmUsIGdsb20gaXQgYW5kIGZpeCBhbnkKLQkgICAgICAgKiBjaGlsZHJlbiBpdCBoYXMgZ2xvbW1lZC4KLQkgICAgICAgKi8KLQkgICAgICB0YWlsLT5jZy5jeWMubmV4dCA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5jZy5jeWMuaGVhZCA9IGhlYWQ7Ci0JICAgICAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGdsb21taW5nICIpOwotCQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JCSAgIHByaW50ZiAoIiBvbnRvICIpOwotCQkgICBwcmludF9uYW1lIChoZWFkKTsKLQkJICAgcHJpbnRmICgiXG4iKSk7Ci0JICAgICAgZm9yICh0YWlsID0gY2hpbGQ7IHRhaWwtPmNnLmN5Yy5uZXh0OyB0YWlsID0gdGFpbC0+Y2cuY3ljLm5leHQpCi0JCXsKLQkJICB0YWlsLT5jZy5jeWMubmV4dC0+Y2cuY3ljLmhlYWQgPSBoZWFkOwotCQkgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltmaW5kX2N5Y2xlXSBhbmQgaXRzIHRhaWwgIik7Ci0JCSAgICAgICBwcmludF9uYW1lICh0YWlsLT5jZy5jeWMubmV4dCk7Ci0JCSAgICAgICBwcmludGYgKCIgb250byAiKTsKLQkJICAgICAgIHByaW50X25hbWUgKGhlYWQpOwotCQkgICAgICAgcHJpbnRmICgiXG4iKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IGhlYWQgLyogZmlyZXdhbGwgKi8gKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2ZpbmRfY3ljbGVdIGdsb21tZWQsIGJ1dCBub3QgdG8gaGVhZFxuIik7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBQcmVwYXJlIGZvciB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgUEFSRU5ULiAgUHVzaCBhIHBhcmVudCBvbnRvCi0gKiB0aGUgc3RhY2sgYW5kIG1hcmsgaXQgYnVzeS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcmVfdmlzaXQsIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gICsrZGZuX2RlcHRoOwotCi0gIGlmIChkZm5fZGVwdGggPj0gZGZuX21heGRlcHRoKQotICAgIHsKLSAgICAgIGRmbl9tYXhkZXB0aCArPSBERk5fSU5DUl9ERVBUSDsKLSAgICAgIGRmbl9zdGFjayA9IHhyZWFsbG9jIChkZm5fc3RhY2ssIGRmbl9tYXhkZXB0aCAqIHNpemVvZiAqZGZuX3N0YWNrKTsKLSAgICB9Ci0KLSAgZGZuX3N0YWNrW2Rmbl9kZXB0aF0uc3ltID0gcGFyZW50OwotICBkZm5fc3RhY2tbZGZuX2RlcHRoXS5jeWNsZV90b3AgPSBkZm5fZGVwdGg7Ci0gIHBhcmVudC0+Y2cudG9wX29yZGVyID0gREZOX0JVU1k7Ci0gIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwcmVfdmlzaXRdXHRcdCVkOiIsIGRmbl9kZXB0aCk7Ci0gICAgICAgcHJpbnRfbmFtZSAocGFyZW50KTsKLSAgICAgICBwcmludGYgKCJcbiIpKTsKLX0KLQotCi0vKgotICogRG9uZSB3aXRoIHZpc2l0aW5nIG5vZGUgUEFSRU5ULiAgUG9wIFBBUkVOVCBvZmYgZGZuX3N0YWNrCi0gKiBhbmQgbnVtYmVyIGZ1bmN0aW9ucyBpZiBQQVJFTlQgaXMgaGVhZCBvZiBhIGN5Y2xlLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHBvc3RfdmlzaXQsIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIFN5bSAqbWVtYmVyOwotCi0gIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwb3N0X3Zpc2l0XVx0JWQ6ICIsIGRmbl9kZXB0aCk7Ci0gICAgICAgcHJpbnRfbmFtZSAocGFyZW50KTsKLSAgICAgICBwcmludGYgKCJcbiIpKTsKLSAgLyoKLSAgICogTnVtYmVyIGZ1bmN0aW9ucyBhbmQgdGhpbmdzIGluIHRoZWlyIGN5Y2xlcyB1bmxlc3MgdGhlIGZ1bmN0aW9uCi0gICAqIGlzIGl0c2VsZiBwYXJ0IG9mIGEgY3ljbGU6Ci0gICAqLwotICBpZiAocGFyZW50LT5jZy5jeWMuaGVhZCA9PSBwYXJlbnQpCi0gICAgewotICAgICAgKytkZm5fY291bnRlcjsKLSAgICAgIGZvciAobWVtYmVyID0gcGFyZW50OyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgbWVtYmVyLT5jZy50b3Bfb3JkZXIgPSBkZm5fY291bnRlcjsKLQkgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwb3N0X3Zpc2l0XVx0XHRtZW1iZXIgIik7Ci0JICAgICAgIHByaW50X25hbWUgKG1lbWJlcik7Ci0JICAgICAgIHByaW50ZiAoIi0+IGNnLnRvcF9vcmRlciA9ICVkXG4iLCBkZm5fY291bnRlcikpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbcG9zdF92aXNpdF1cdFx0aXMgcGFydCBvZiBhIGN5Y2xlXG4iKSk7Ci0gICAgfQotICAtLWRmbl9kZXB0aDsKLX0KLQotCi0vKgotICogR2l2ZW4gdGhpcyBQQVJFTlQsIGRlcHRoIGZpcnN0IG51bWJlciBpdHMgY2hpbGRyZW4uCi0gKi8KLXZvaWQKLURFRlVOIChjZ19kZm4sIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIEFyYyAqYXJjOwotCi0gIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltkZm5dIGRmbiggIik7Ci0gICAgICAgcHJpbnRfbmFtZSAocGFyZW50KTsKLSAgICAgICBwcmludGYgKCIpXG4iKSk7Ci0gIC8qCi0gICAqIElmIHdlJ3JlIGFscmVhZHkgbnVtYmVyZWQsIG5vIG5lZWQgdG8gbG9vayBhbnkgZnVydGhlcjoKLSAgICovCi0gIGlmIChpc19udW1iZXJlZCAocGFyZW50KSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKgotICAgKiBJZiB3ZSdyZSBhbHJlYWR5IGJ1c3ksIG11c3QgYmUgYSBjeWNsZToKLSAgICovCi0gIGlmIChpc19idXN5IChwYXJlbnQpKQotICAgIHsKLSAgICAgIGZpbmRfY3ljbGUgKHBhcmVudCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBwcmVfdmlzaXQgKHBhcmVudCk7Ci0gIC8qCi0gICAqIFJlY3Vyc2l2ZWx5IHZpc2l0IGNoaWxkcmVuOgotICAgKi8KLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLSAgICB7Ci0gICAgICBjZ19kZm4gKGFyYy0+Y2hpbGQpOwotICAgIH0KLSAgcG9zdF92aXNpdCAocGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX2Rmbi5oIGIvZ3Byb2YvY2dfZGZuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDMwMzAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfZGZuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaWZuZGVmIGNnX2Rmbl9oCi0jZGVmaW5lIGNnX2Rmbl9oCi0KLS8qCi0gKiBGbGFncyB3aGljaCBtYXJrIGEgc3ltYm9sIGFzIHRvcG9sb2dpY2FsbHkgYGBidXN5Jycgb3IgYXMKLSAqIHRvcG9sb2dpY2FsbHkgYGBub3RfbnVtYmVyZWQnJzoKLSAqLwotI2RlZmluZQlERk5fQlVTWQktMQotI2RlZmluZQlERk5fTkFOCQkwCi0KLS8qCi0gKiBEZXB0aC1maXJzdCBudW1iZXJpbmcgb2YgYSBjYWxsLWdyYXBoLgotICovCi0KLWV4dGVybiB2b2lkIGNnX2RmbiBQQVJBTVMgKChTeW0gKiByb290KSk7Ci0KLSNlbmRpZiAvKiBjZ19kZm5faCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfcHJpbnQuYyBiL2dwcm9mL2NnX3ByaW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDViYzcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfcHJpbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNzYgKzAsMCBAQAotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19wcmludC5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi0vKgotICogUmV0dXJuIHZhbHVlIG9mIGNvbXBhcmlzb24gZnVuY3Rpb25zIHVzZWQgdG8gc29ydCB0YWJsZXM6Ci0gKi8KLSNkZWZpbmUJTEVTU1RIQU4JLTEKLSNkZWZpbmUJRVFVQUxUTwkJMAotI2RlZmluZQlHUkVBVEVSVEhBTgkxCi0KLXN0YXRpYyB2b2lkIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIFBBUkFNUyAoKEFyYyAqKiwgdW5zaWduZWQgbG9uZywKLQkJCQkJCSAgICAgIGludCwgQXJjICoqLAotCQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKSk7Ci0vKiBkZWNsYXJhdGlvbnMgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIHRvIG91dHB1dCBibHVyYnM6ICovCi1leHRlcm4gdm9pZCBic2RfY2FsbGdfYmx1cmIgUEFSQU1TICgoRklMRSAqIGZwKSk7Ci1leHRlcm4gdm9pZCBmc2ZfY2FsbGdfYmx1cmIgUEFSQU1TICgoRklMRSAqIGZwKSk7Ci0KLWRvdWJsZSBwcmludF90aW1lID0gMC4wOwotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTl9WT0lEIChwcmludF9oZWFkZXIpCi17Ci0gIGlmIChmaXJzdF9vdXRwdXQpCi0gICAgewotICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiXGZcbiIpOwotICAgIH0KLSAgaWYgKCFic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGlmIChwcmludF9kZXNjcmlwdGlvbnMpCi0JewotCSAgcHJpbnRmIChfKCJcdFx0ICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKVxuXG4iKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXHRcdFx0Q2FsbCBncmFwaFxuXG4iKSk7Ci0JfQotICAgIH0KLSAgcHJpbnRmIChfKCJcbmdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzICVsZCBieXRlKHMpIiksCi0JICAobG9uZykgaGlzdF9zY2FsZSAqIHNpemVvZiAoVU5JVCkpOwotICBpZiAocHJpbnRfdGltZSA+IDAuMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiBmb3IgJS4yZiUlIG9mICUuMmYgc2Vjb25kc1xuXG4iKSwKLQkgICAgICAxMDAuMCAvIHByaW50X3RpbWUsIHByaW50X3RpbWUgLyBoeik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgbm8gdGltZSBwcm9wYWdhdGVkXG5cbiIpKTsKLSAgICAgIC8qCi0gICAgICAgKiBUaGlzIGRvZXNuJ3QgaHVydCwgc2luY2UgYWxsIHRoZSBudW1lcmF0b3JzIHdpbGwgYmUgMC4wOgotICAgICAgICovCi0gICAgICBwcmludF90aW1lID0gMS4wOwotICAgIH0KLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgcHJpbnRmICgiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cy8lLTcuN3MgICAgICUtOC44c1xuIiwKLQkgICAgICAiIiwgIiIsICIiLCAiIiwgXygiY2FsbGVkIiksIF8oInRvdGFsIiksIF8oInBhcmVudHMiKSk7Ci0gICAgICBwcmludGYgKCIlLTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cyslLTcuN3MgJS04LjhzXHQlNS41c1xuIiwKLQkgICAgICBfKCJpbmRleCIpLCBfKCIldGltZSIpLCBfKCJzZWxmIiksIF8oImRlc2NlbmRlbnRzIiksCi0JICAgICAgXygiY2FsbGVkIiksIF8oInNlbGYiKSwgXygibmFtZSIpLCBfKCJpbmRleCIpKTsKLSAgICAgIHByaW50ZiAoIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MvJS03LjdzICAgICAlLTguOHNcbiIsCi0JICAgICAgIiIsICIiLCAiIiwgIiIsIF8oImNhbGxlZCIpLCBfKCJ0b3RhbCIpLCBfKCJjaGlsZHJlbiIpKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmIChfKCJpbmRleCAlJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZVxuIikpOwotICAgIH0KLX0KLQotCi0vKgotICogUHJpbnQgYSBjeWNsZSBoZWFkZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfY3ljbGUsIChjeWMpLCBTeW0gKiBjeWMpCi17Ci0gIGNoYXIgYnVmW0JVRlNJWl07Ci0KLSAgc3ByaW50ZiAoYnVmLCAiWyVkXSIsIGN5Yy0+Y2cuaW5kZXgpOwotICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkgID8gIiUtNi42cyAlNS4xZiAlNy4yZiAlMTEuMmYgJTdsdSIKLQkgIDogIiUtNi42cyAlNS4xZiAlNy4yZiAlNy4yZiAlN2x1IiwgYnVmLAotCSAgMTAwICogKGN5Yy0+Y2cucHJvcC5zZWxmICsgY3ljLT5jZy5wcm9wLmNoaWxkKSAvIHByaW50X3RpbWUsCi0JICBjeWMtPmNnLnByb3Auc2VsZiAvIGh6LCBjeWMtPmNnLnByb3AuY2hpbGQgLyBoeiwgY3ljLT5uY2FsbHMpOwotICBpZiAoY3ljLT5jZy5zZWxmX2NhbGxzICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiKyUtN2x1IiwgY3ljLT5jZy5zZWxmX2NhbGxzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJTcuN3MiLCAiIik7Ci0gICAgfQotICBwcmludGYgKF8oIiA8Y3ljbGUgJWQgYXMgYSB3aG9sZT4gWyVkXVxuIiksIGN5Yy0+Y2cuY3ljLm51bSwgY3ljLT5jZy5pbmRleCk7Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgTEVGVCBhbmQgUklHSFQgbWVtYm1lci4gIE1ham9yIGNvbXBhcmlzb24ga2V5IGlzCi0gKiBDRy5QUk9QLlNFTEYrQ0cuUFJPUC5DSElMRCwgc2Vjb25kYXJ5IGtleSBpcyBOQ0FMTFMrQ0cuU0VMRl9DQUxMUy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9tZW1iZXIsIChsZWZ0LCByaWdodCksIFN5bSAqIGxlZnQgQU5EIFN5bSAqIHJpZ2h0KQotewotICBkb3VibGUgbGVmdF90aW1lID0gbGVmdC0+Y2cucHJvcC5zZWxmICsgbGVmdC0+Y2cucHJvcC5jaGlsZDsKLSAgZG91YmxlIHJpZ2h0X3RpbWUgPSByaWdodC0+Y2cucHJvcC5zZWxmICsgcmlnaHQtPmNnLnByb3AuY2hpbGQ7Ci0gIHVuc2lnbmVkIGxvbmcgbGVmdF9jYWxscyA9IGxlZnQtPm5jYWxscyArIGxlZnQtPmNnLnNlbGZfY2FsbHM7Ci0gIHVuc2lnbmVkIGxvbmcgcmlnaHRfY2FsbHMgPSByaWdodC0+bmNhbGxzICsgcmlnaHQtPmNnLnNlbGZfY2FsbHM7Ci0KLSAgaWYgKGxlZnRfdGltZSA+IHJpZ2h0X3RpbWUpCi0gICAgewotICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwotICAgIH0KLSAgaWYgKGxlZnRfdGltZSA8IHJpZ2h0X3RpbWUpCi0gICAgewotICAgICAgcmV0dXJuIExFU1NUSEFOOwotICAgIH0KLQotICBpZiAobGVmdF9jYWxscyA+IHJpZ2h0X2NhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKLSAgICB9Ci0gIGlmIChsZWZ0X2NhbGxzIDwgcmlnaHRfY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIExFU1NUSEFOOwotICAgIH0KLSAgcmV0dXJuIEVRVUFMVE87Ci19Ci0KLQotLyoKLSAqIFNvcnQgbWVtYmVycyBvZiBhIGN5Y2xlLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHNvcnRfbWVtYmVycywgKGN5YyksIFN5bSAqIGN5YykKLXsKLSAgU3ltICp0b2RvLCAqZG9pbmcsICpwcmV2OwotICAvKgotICAgKiBEZXRhY2ggY3ljbGUgbWVtYmVycyBmcm9tIGN5Y2xlaGVhZCwgYW5kIGluc2VydGlvbiBzb3J0IHRoZW0KLSAgICogYmFjayBvbi4KLSAgICovCi0gIHRvZG8gPSBjeWMtPmNnLmN5Yy5uZXh0OwotICBjeWMtPmNnLmN5Yy5uZXh0ID0gMDsKLSAgZm9yIChkb2luZyA9IHRvZG87IGRvaW5nICYmIGRvaW5nLT5jZy5jeWMubmV4dDsgZG9pbmcgPSB0b2RvKQotICAgIHsKLSAgICAgIHRvZG8gPSBkb2luZy0+Y2cuY3ljLm5leHQ7Ci0gICAgICBmb3IgKHByZXYgPSBjeWM7IHByZXYtPmNnLmN5Yy5uZXh0OyBwcmV2ID0gcHJldi0+Y2cuY3ljLm5leHQpCi0JewotCSAgaWYgKGNtcF9tZW1iZXIgKGRvaW5nLCBwcmV2LT5jZy5jeWMubmV4dCkgPT0gR1JFQVRFUlRIQU4pCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGRvaW5nLT5jZy5jeWMubmV4dCA9IHByZXYtPmNnLmN5Yy5uZXh0OwotICAgICAgcHJldi0+Y2cuY3ljLm5leHQgPSBkb2luZzsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFByaW50IHRoZSBtZW1iZXJzIG9mIGEgY3ljbGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfbWVtYmVycywgKGN5YyksIFN5bSAqIGN5YykKLXsKLSAgU3ltICptZW1iZXI7Ci0KLSAgc29ydF9tZW1iZXJzIChjeWMpOwotICBmb3IgKG1lbWJlciA9IGN5Yy0+Y2cuY3ljLm5leHQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLSAgICB7Ci0gICAgICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkgICAgICA/ICIlNi42cyAlNS41cyAlNy4yZiAlMTEuMmYgJTdsdSIKLQkgICAgICA6ICIlNi42cyAlNS41cyAlNy4yZiAlNy4yZiAlN2x1IiwKLQkgICAgICAiIiwgIiIsIG1lbWJlci0+Y2cucHJvcC5zZWxmIC8gaHosIG1lbWJlci0+Y2cucHJvcC5jaGlsZCAvIGh6LAotCSAgICAgIG1lbWJlci0+bmNhbGxzKTsKLSAgICAgIGlmIChtZW1iZXItPmNnLnNlbGZfY2FsbHMgIT0gMCkKLQl7Ci0JICBwcmludGYgKCIrJS03bHUiLCBtZW1iZXItPmNnLnNlbGZfY2FsbHMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIgJTcuN3MiLCAiIik7Ci0JfQotICAgICAgcHJpbnRmICgiICAgICAiKTsKLSAgICAgIHByaW50X25hbWUgKG1lbWJlcik7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotCi0vKgotICogQ29tcGFyZSB0d28gYXJjcyB0by9mcm9tIHRoZSBzYW1lIGNoaWxkL3BhcmVudC4KLSAqICAgICAgLSBpZiBvbmUgYXJjIGlzIGEgc2VsZiBhcmMsIGl0J3MgbGVhc3QuCi0gKiAgICAgIC0gaWYgb25lIGFyYyBpcyB3aXRoaW4gYSBjeWNsZSwgaXQncyBsZXNzIHRoYW4uCi0gKiAgICAgIC0gaWYgYm90aCBhcmNzIGFyZSB3aXRoaW4gYSBjeWNsZSwgY29tcGFyZSBhcmMgY291bnRzLgotICogICAgICAtIGlmIG5laXRoZXIgYXJjIGlzIHdpdGhpbiBhIGN5Y2xlLCBjb21wYXJlIHdpdGgKLSAqICAgICAgICAgICAgICB0aW1lICsgY2hpbGRfdGltZSBhcyBtYWpvciBrZXkKLSAqICAgICAgICAgICAgICBhcmMgY291bnQgYXMgbWlub3Iga2V5Ci0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfYXJjLCAobGVmdCwgcmlnaHQpLCBBcmMgKiBsZWZ0IEFORCBBcmMgKiByaWdodCkKLXsKLSAgU3ltICpsZWZ0X3BhcmVudCA9IGxlZnQtPnBhcmVudDsKLSAgU3ltICpsZWZ0X2NoaWxkID0gbGVmdC0+Y2hpbGQ7Ci0gIFN5bSAqcmlnaHRfcGFyZW50ID0gcmlnaHQtPnBhcmVudDsKLSAgU3ltICpyaWdodF9jaGlsZCA9IHJpZ2h0LT5jaGlsZDsKLSAgZG91YmxlIGxlZnRfdGltZSwgcmlnaHRfdGltZTsKLQotICBEQkcgKFRJTUVERUJVRywKLSAgICAgICBwcmludGYgKCJbY21wX2FyY10gIik7Ci0gICAgICAgcHJpbnRfbmFtZSAobGVmdF9wYXJlbnQpOwotICAgICAgIHByaW50ZiAoIiBjYWxscyAiKTsKLSAgICAgICBwcmludF9uYW1lIChsZWZ0X2NoaWxkKTsKLSAgICAgICBwcmludGYgKCIgJWYgKyAlZiAlbHUvJWx1XG4iLCBsZWZ0LT50aW1lLCBsZWZ0LT5jaGlsZF90aW1lLAotCSAgICAgICBsZWZ0LT5jb3VudCwgbGVmdF9jaGlsZC0+bmNhbGxzKTsKLSAgICAgICBwcmludGYgKCJbY21wX2FyY10gIik7Ci0gICAgICAgcHJpbnRfbmFtZSAocmlnaHRfcGFyZW50KTsKLSAgICAgICBwcmludGYgKCIgY2FsbHMgIik7Ci0gICAgICAgcHJpbnRfbmFtZSAocmlnaHRfY2hpbGQpOwotICAgICAgIHByaW50ZiAoIiAlZiArICVmICVsdS8lbHVcbiIsIHJpZ2h0LT50aW1lLCByaWdodC0+Y2hpbGRfdGltZSwKLQkgICAgICAgcmlnaHQtPmNvdW50LCByaWdodF9jaGlsZC0+bmNhbGxzKTsKLSAgICAgICBwcmludGYgKCJcbiIpOwotICAgICk7Ci0gIGlmIChsZWZ0X3BhcmVudCA9PSBsZWZ0X2NoaWxkKQotICAgIHsKLSAgICAgIHJldHVybiBMRVNTVEhBTjsJCS8qIGxlZnQgaXMgYSBzZWxmIGNhbGwgKi8KLSAgICB9Ci0gIGlmIChyaWdodF9wYXJlbnQgPT0gcmlnaHRfY2hpbGQpCi0gICAgewotICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwkvKiByaWdodCBpcyBhIHNlbGYgY2FsbCAqLwotICAgIH0KLQotICBpZiAobGVmdF9wYXJlbnQtPmNnLmN5Yy5udW0gIT0gMCAmJiBsZWZ0X2NoaWxkLT5jZy5jeWMubnVtICE9IDAKLSAgICAgICYmIGxlZnRfcGFyZW50LT5jZy5jeWMubnVtID09IGxlZnRfY2hpbGQtPmNnLmN5Yy5udW0pCi0gICAgewotICAgICAgLyogbGVmdCBpcyBhIGNhbGwgd2l0aGluIGEgY3ljbGUgKi8KLSAgICAgIGlmIChyaWdodF9wYXJlbnQtPmNnLmN5Yy5udW0gIT0gMCAmJiByaWdodF9jaGlsZC0+Y2cuY3ljLm51bSAhPSAwCi0JICAmJiByaWdodF9wYXJlbnQtPmNnLmN5Yy5udW0gPT0gcmlnaHRfY2hpbGQtPmNnLmN5Yy5udW0pCi0JewotCSAgLyogcmlnaHQgaXMgYSBjYWxsIHdpdGhpbiB0aGUgY3ljbGUsIHRvbyAqLwotCSAgaWYgKGxlZnQtPmNvdW50IDwgcmlnaHQtPmNvdW50KQotCSAgICB7Ci0JICAgICAgcmV0dXJuIExFU1NUSEFOOwotCSAgICB9Ci0JICBpZiAobGVmdC0+Y291bnQgPiByaWdodC0+Y291bnQpCi0JICAgIHsKLQkgICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0JICAgIH0KLQkgIHJldHVybiBFUVVBTFRPOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiByaWdodCBpc24ndCBhIGNhbGwgd2l0aGluIHRoZSBjeWNsZSAqLwotCSAgcmV0dXJuIExFU1NUSEFOOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBsZWZ0IGlzbid0IGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLwotICAgICAgaWYgKHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSAhPSAwICYmIHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtICE9IDAKLQkgICYmIHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSA9PSByaWdodF9jaGlsZC0+Y2cuY3ljLm51bSkKLQl7Ci0JICAvKiByaWdodCBpcyBhIGNhbGwgd2l0aGluIGEgY3ljbGUgKi8KLQkgIHJldHVybiBHUkVBVEVSVEhBTjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbmVpdGhlciBpcyBhIGNhbGwgd2l0aGluIGEgY3ljbGUgKi8KLQkgIGxlZnRfdGltZSA9IGxlZnQtPnRpbWUgKyBsZWZ0LT5jaGlsZF90aW1lOwotCSAgcmlnaHRfdGltZSA9IHJpZ2h0LT50aW1lICsgcmlnaHQtPmNoaWxkX3RpbWU7Ci0JICBpZiAobGVmdF90aW1lIDwgcmlnaHRfdGltZSkKLQkgICAgewotCSAgICAgIHJldHVybiBMRVNTVEhBTjsKLQkgICAgfQotCSAgaWYgKGxlZnRfdGltZSA+IHJpZ2h0X3RpbWUpCi0JICAgIHsKLQkgICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0JICAgIH0KLQkgIGlmIChsZWZ0LT5jb3VudCA8IHJpZ2h0LT5jb3VudCkKLQkgICAgewotCSAgICAgIHJldHVybiBMRVNTVEhBTjsKLQkgICAgfQotCSAgaWYgKGxlZnQtPmNvdW50ID4gcmlnaHQtPmNvdW50KQotCSAgICB7Ci0JICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwotCSAgICB9Ci0JICByZXR1cm4gRVFVQUxUTzsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoc29ydF9wYXJlbnRzLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgQXJjICphcmMsICpkZXRhY2hlZCwgc29ydGVkLCAqcHJldjsKLQotICAvKgotICAgKiBVbmxpbmsgcGFyZW50cyBmcm9tIGNoaWxkLCB0aGVuIGluc2VydGlvbiBzb3J0IGJhY2sgb24gdG8KLSAgICogc29ydGVkJ3MgcGFyZW50cy4KLSAgICogICAgICAqYXJjICAgICAgICB0aGUgYXJjIHlvdSBoYXZlIGRldGFjaGVkIGFuZCBhcmUgaW5zZXJ0aW5nLgotICAgKiAgICAgICpkZXRhY2hlZCAgIHRoZSByZXN0IG9mIHRoZSBhcmNzIHRvIGJlIHNvcnRlZC4KLSAgICogICAgICBzb3J0ZWQgICAgICBhcmMgbGlzdCBvbnRvIHdoaWNoIHlvdSBpbnNlcnRpb24gc29ydC4KLSAgICogICAgICAqcHJldiAgICAgICBhcmMgYmVmb3JlIHRoZSBhcmMgeW91IGFyZSBjb21wYXJpbmcuCi0gICAqLwotICBzb3J0ZWQubmV4dF9wYXJlbnQgPSAwOwotICBmb3IgKGFyYyA9IGNoaWxkLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGRldGFjaGVkKQotICAgIHsKLSAgICAgIGRldGFjaGVkID0gYXJjLT5uZXh0X3BhcmVudDsKLQotICAgICAgLyogY29uc2lkZXIgKmFyYyBhcyBkaXNjb25uZWN0ZWQ7IGluc2VydCBpdCBpbnRvIHNvcnRlZDogKi8KLSAgICAgIGZvciAocHJldiA9ICZzb3J0ZWQ7IHByZXYtPm5leHRfcGFyZW50OyBwcmV2ID0gcHJldi0+bmV4dF9wYXJlbnQpCi0JewotCSAgaWYgKGNtcF9hcmMgKGFyYywgcHJldi0+bmV4dF9wYXJlbnQpICE9IEdSRUFURVJUSEFOKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBhcmMtPm5leHRfcGFyZW50ID0gcHJldi0+bmV4dF9wYXJlbnQ7Ci0gICAgICBwcmV2LT5uZXh0X3BhcmVudCA9IGFyYzsKLSAgICB9Ci0KLSAgLyogcmVhdHRhY2ggc29ydGVkIGFyY3MgdG8gY2hpbGQ6ICovCi0gIGNoaWxkLT5jZy5wYXJlbnRzID0gc29ydGVkLm5leHRfcGFyZW50OwotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfcGFyZW50cywgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIFN5bSAqcGFyZW50OwotICBBcmMgKmFyYzsKLSAgU3ltICpjeWNsZV9oZWFkOwotCi0gIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gMCkKLSAgICB7Ci0gICAgICBjeWNsZV9oZWFkID0gY2hpbGQtPmNnLmN5Yy5oZWFkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGN5Y2xlX2hlYWQgPSBjaGlsZDsKLSAgICB9Ci0gIGlmICghY2hpbGQtPmNnLnBhcmVudHMpCi0gICAgewotICAgICAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JICAgICAgPyBfKCIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzICU3LjdzICAgICA8c3BvbnRhbmVvdXM+XG4iKQotCSAgICAgIDogXygiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIpLAotCSAgICAgICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc29ydF9wYXJlbnRzIChjaGlsZCk7Ci0gIGZvciAoYXJjID0gY2hpbGQtPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gYXJjLT5uZXh0X3BhcmVudCkKLSAgICB7Ci0gICAgICBwYXJlbnQgPSBhcmMtPnBhcmVudDsKLSAgICAgIGlmIChjaGlsZCA9PSBwYXJlbnQgfHwgKGNoaWxkLT5jZy5jeWMubnVtICE9IDAKLQkJCSAgICAgICYmIHBhcmVudC0+Y2cuY3ljLm51bSA9PSBjaGlsZC0+Y2cuY3ljLm51bSkpCi0JewotCSAgLyogc2VsZmNhbGwgb3IgY2FsbCBhbW9uZyBzaWJsaW5nczogKi8KLQkgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCQkgID8gIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTdsdSAlNy43cyAgICAgIgotCQkgIDogIiU2LjZzICU1LjVzICU3LjdzICU3LjdzICU3bHUgJTcuN3MgICAgICIsCi0JCSAgIiIsICIiLCAiIiwgIiIsCi0JCSAgYXJjLT5jb3VudCwgIiIpOwotCSAgcHJpbnRfbmFtZSAocGFyZW50KTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHJlZ3VsYXIgcGFyZW50IG9mIGNoaWxkOiAqLwotCSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JCSAgPyAiJTYuNnMgJTUuNXMgJTcuMmYgJTExLjJmICU3bHUvJS03bHUgICAgICIKLQkJICA6ICIlNi42cyAlNS41cyAlNy4yZiAlNy4yZiAlN2x1LyUtN2x1ICAgICAiLAotCQkgICIiLCAiIiwKLQkJICBhcmMtPnRpbWUgLyBoeiwgYXJjLT5jaGlsZF90aW1lIC8gaHosCi0JCSAgYXJjLT5jb3VudCwgY3ljbGVfaGVhZC0+bmNhbGxzKTsKLQkgIHByaW50X25hbWUgKHBhcmVudCk7Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChzb3J0X2NoaWxkcmVuLCAocGFyZW50KSwgU3ltICogcGFyZW50KQotewotICBBcmMgKmFyYywgKmRldGFjaGVkLCBzb3J0ZWQsICpwcmV2OwotICAvKgotICAgKiBVbmxpbmsgY2hpbGRyZW4gZnJvbSBwYXJlbnQsIHRoZW4gaW5zZXJ0aW9uIHNvcnQgYmFjayBvbiB0bwotICAgKiBzb3J0ZWQncyBjaGlsZHJlbi4KLSAgICogICAgICAqYXJjICAgICAgICB0aGUgYXJjIHlvdSBoYXZlIGRldGFjaGVkIGFuZCBhcmUgaW5zZXJ0aW5nLgotICAgKiAgICAgICpkZXRhY2hlZCAgIHRoZSByZXN0IG9mIHRoZSBhcmNzIHRvIGJlIHNvcnRlZC4KLSAgICogICAgICBzb3J0ZWQgICAgICBhcmMgbGlzdCBvbnRvIHdoaWNoIHlvdSBpbnNlcnRpb24gc29ydC4KLSAgICogICAgICAqcHJldiAgICAgICBhcmMgYmVmb3JlIHRoZSBhcmMgeW91IGFyZSBjb21wYXJpbmcuCi0gICAqLwotICBzb3J0ZWQubmV4dF9jaGlsZCA9IDA7Ci0gIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBkZXRhY2hlZCkKLSAgICB7Ci0gICAgICBkZXRhY2hlZCA9IGFyYy0+bmV4dF9jaGlsZDsKLQotICAgICAgLyogY29uc2lkZXIgKmFyYyBhcyBkaXNjb25uZWN0ZWQ7IGluc2VydCBpdCBpbnRvIHNvcnRlZDogKi8KLSAgICAgIGZvciAocHJldiA9ICZzb3J0ZWQ7IHByZXYtPm5leHRfY2hpbGQ7IHByZXYgPSBwcmV2LT5uZXh0X2NoaWxkKQotCXsKLQkgIGlmIChjbXBfYXJjIChhcmMsIHByZXYtPm5leHRfY2hpbGQpICE9IExFU1NUSEFOKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBhcmMtPm5leHRfY2hpbGQgPSBwcmV2LT5uZXh0X2NoaWxkOwotICAgICAgcHJldi0+bmV4dF9jaGlsZCA9IGFyYzsKLSAgICB9Ci0KLSAgLyogcmVhdHRhY2ggc29ydGVkIGNoaWxkcmVuIHRvIHBhcmVudDogKi8KLSAgcGFyZW50LT5jZy5jaGlsZHJlbiA9IHNvcnRlZC5uZXh0X2NoaWxkOwotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfY2hpbGRyZW4sIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIFN5bSAqY2hpbGQ7Ci0gIEFyYyAqYXJjOwotCi0gIHNvcnRfY2hpbGRyZW4gKHBhcmVudCk7Ci0gIGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47Ci0gIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0gICAgewotICAgICAgY2hpbGQgPSBhcmMtPmNoaWxkOwotICAgICAgaWYgKGNoaWxkID09IHBhcmVudCB8fCAoY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotCQkJICAgICAgJiYgY2hpbGQtPmNnLmN5Yy5udW0gPT0gcGFyZW50LT5jZy5jeWMubnVtKSkKLQl7Ci0JICAvKiBzZWxmIGNhbGwgb3IgY2FsbCB0byBzaWJsaW5nOiAqLwotCSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JCSAgPyAiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlN2x1ICU3LjdzICAgICAiCi0JCSAgOiAiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTdsdSAlNy43cyAgICAgIiwKLQkJICAiIiwgIiIsICIiLCAiIiwgYXJjLT5jb3VudCwgIiIpOwotCSAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogcmVndWxhciBjaGlsZCBvZiBwYXJlbnQ6ICovCi0JICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkJICA/ICIlNi42cyAlNS41cyAlNy4yZiAlMTEuMmYgJTdsdS8lLTdsdSAgICAgIgotCQkgIDogIiU2LjZzICU1LjVzICU3LjJmICU3LjJmICU3bHUvJS03bHUgICAgICIsCi0JCSAgIiIsICIiLAotCQkgIGFyYy0+dGltZSAvIGh6LCBhcmMtPmNoaWxkX3RpbWUgLyBoeiwKLQkJICBhcmMtPmNvdW50LCBjaGlsZC0+Y2cuY3ljLmhlYWQtPm5jYWxscyk7Ci0JICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9saW5lLCAobnApLCBTeW0gKiBucCkKLXsKLSAgY2hhciBidWZbQlVGU0laXTsKLQotICBzcHJpbnRmIChidWYsICJbJWRdIiwgbnAtPmNnLmluZGV4KTsKLSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JICA/ICIlLTYuNnMgJTUuMWYgJTcuMmYgJTExLjJmIgotCSAgOiAiJS02LjZzICU1LjFmICU3LjJmICU3LjJmIiwgYnVmLAotCSAgMTAwICogKG5wLT5jZy5wcm9wLnNlbGYgKyBucC0+Y2cucHJvcC5jaGlsZCkgLyBwcmludF90aW1lLAotCSAgbnAtPmNnLnByb3Auc2VsZiAvIGh6LCBucC0+Y2cucHJvcC5jaGlsZCAvIGh6KTsKLSAgaWYgKChucC0+bmNhbGxzICsgbnAtPmNnLnNlbGZfY2FsbHMpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiICU3bHUiLCBucC0+bmNhbGxzKTsKLSAgICAgIGlmIChucC0+Y2cuc2VsZl9jYWxscyAhPSAwKQotCXsKLQkgIHByaW50ZiAoIislLTdsdSAiLCBucC0+Y2cuc2VsZl9jYWxscyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIiAlNy43cyAiLCAiIik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlNy43cyAlNy43cyAiLCAiIiwgIiIpOwotICAgIH0KLSAgcHJpbnRfbmFtZSAobnApOwotICBwcmludGYgKCJcbiIpOwotfQotCi0KLS8qCi0gKiBQcmludCBkeW5hbWljIGNhbGwgZ3JhcGguCi0gKi8KLXZvaWQKLURFRlVOIChjZ19wcmludCwgKHRpbWVzb3J0c3ltKSwgU3ltICoqIHRpbWVzb3J0c3ltKQotewotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIFN5bSAqcGFyZW50OwotCi0gIGlmIChwcmludF9kZXNjcmlwdGlvbnMgJiYgYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBic2RfY2FsbGdfYmx1cmIgKHN0ZG91dCk7Ci0gICAgfQotCi0gIHByaW50X2hlYWRlciAoKTsKLQotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuICsgbnVtX2N5Y2xlczsgKytpbmRleCkKLSAgICB7Ci0gICAgICBwYXJlbnQgPSB0aW1lc29ydHN5bVtpbmRleF07Ci0gICAgICBpZiAoKGlnbm9yZV96ZXJvcyAmJiBwYXJlbnQtPm5jYWxscyA9PSAwCi0JICAgJiYgcGFyZW50LT5jZy5zZWxmX2NhbGxzID09IDAgJiYgcGFyZW50LT5jZy5wcm9wLnNlbGYgPT0gMAotCSAgICYmIHBhcmVudC0+Y2cucHJvcC5jaGlsZCA9PSAwKQotCSAgfHwgIXBhcmVudC0+Y2cucHJpbnRfZmxhZwotCSAgfHwgKGxpbmVfZ3JhbnVsYXJpdHkgJiYgISBwYXJlbnQtPmlzX2Z1bmMpKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmICghcGFyZW50LT5uYW1lICYmIHBhcmVudC0+Y2cuY3ljLm51bSAhPSAwKQotCXsKLQkgIC8qIGN5Y2xlIGhlYWRlcjogKi8KLQkgIHByaW50X2N5Y2xlIChwYXJlbnQpOwotCSAgcHJpbnRfbWVtYmVycyAocGFyZW50KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRfcGFyZW50cyAocGFyZW50KTsKLQkgIHByaW50X2xpbmUgKHBhcmVudCk7Ci0JICBwcmludF9jaGlsZHJlbiAocGFyZW50KTsKLQl9Ci0gICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLQlwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgICAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0JcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0gIGZyZWUgKHRpbWVzb3J0c3ltKTsKLSAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucyAmJiAhYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBmc2ZfY2FsbGdfYmx1cmIgKHN0ZG91dCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfbmFtZSwgKGxlZnQsIHJpZ2h0KSwgY29uc3QgUFRSIGxlZnQgQU5EIGNvbnN0IFBUUiByaWdodCkKLXsKLSAgY29uc3QgU3ltICoqbnBwMSA9IChjb25zdCBTeW0gKiopIGxlZnQ7Ci0gIGNvbnN0IFN5bSAqKm5wcDIgPSAoY29uc3QgU3ltICoqKSByaWdodDsKLQotICByZXR1cm4gc3RyY21wICgoKm5wcDEpLT5uYW1lLCAoKm5wcDIpLT5uYW1lKTsKLX0KLQotCi12b2lkCi1ERUZVTl9WT0lEIChjZ19wcmludF9pbmRleCkKLXsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICB1bnNpZ25lZCBpbnQgbm5hbWVzLCB0b2RvLCBpLCBqOwotICBpbnQgY29sLCBzdGFydGluZ19jb2w7Ci0gIFN5bSAqKm5hbWVfc29ydGVkX3N5bXMsICpzeW07Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyIGJ1ZlsyMF07Ci0gIGludCBjb2x1bW5fd2lkdGggPSAob3V0cHV0X3dpZHRoIC0gMSkgLyAzOwkvKiBkb24ndCB3cml0ZSBpbiBsYXN0IGNvbCEgKi8KLSAgLyoKLSAgICogTm93LCBzb3J0IHJlZ3VsYXIgZnVuY3Rpb24gbmFtZSBhbHBoYWJldGljYWxseSB0byBjcmVhdGUgYW4KLSAgICogaW5kZXg6Ci0gICAqLwotICBuYW1lX3NvcnRlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoKHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzKSAqIHNpemVvZiAoU3ltICopKTsKLSAgZm9yIChpbmRleCA9IDAsIG5uYW1lcyA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoaWdub3JlX3plcm9zICYmIHN5bXRhYi5iYXNlW2luZGV4XS5uY2FsbHMgPT0gMAotCSAgJiYgc3ltdGFiLmJhc2VbaW5kZXhdLmhpc3QudGltZSA9PSAwKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIG5hbWVfc29ydGVkX3N5bXNbbm5hbWVzKytdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0IChuYW1lX3NvcnRlZF9zeW1zLCBubmFtZXMsIHNpemVvZiAoU3ltICopLCBjbXBfbmFtZSk7Ci0gIGZvciAoaW5kZXggPSAxLCB0b2RvID0gbm5hbWVzOyBpbmRleCA8PSBudW1fY3ljbGVzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIG5hbWVfc29ydGVkX3N5bXNbdG9kbysrXSA9ICZjeWNsZV9oZWFkZXJbaW5kZXhdOwotICAgIH0KLSAgcHJpbnRmICgiXGZcbiIpOwotICBwcmludGYgKF8oIkluZGV4IGJ5IGZ1bmN0aW9uIG5hbWVcblxuIikpOwotICBpbmRleCA9ICh0b2RvICsgMikgLyAzOwotICBmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKLSAgICB7Ci0gICAgICBjb2wgPSAwOwotICAgICAgc3RhcnRpbmdfY29sID0gMDsKLSAgICAgIGZvciAoaiA9IGk7IGogPCB0b2RvOyBqICs9IGluZGV4KQotCXsKLQkgIHN5bSA9IG5hbWVfc29ydGVkX3N5bXNbal07Ci0JICBpZiAoc3ltLT5jZy5wcmludF9mbGFnKQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAiWyVkXSIsIHN5bS0+Y2cuaW5kZXgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcHJpbnRmIChidWYsICIoJWQpIiwgc3ltLT5jZy5pbmRleCk7Ci0JICAgIH0KLQkgIGlmIChqIDwgbm5hbWVzKQotCSAgICB7Ci0JICAgICAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0JCXsKLQkJICBwcmludGYgKCIlNi42cyAlLTE5LjE5cyIsIGJ1Ziwgc3ltLT5uYW1lKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbCArPSBzdHJsZW4gKGJ1Zik7Ci0JCSAgZm9yICg7IGNvbCA8IHN0YXJ0aW5nX2NvbCArIDU7ICsrY29sKQotCQkgICAgewotCQkgICAgICBwdXRjaGFyICgnICcpOwotCQkgICAgfQotCQkgIHByaW50ZiAoIiAlcyAiLCBidWYpOwotCQkgIGNvbCArPSBwcmludF9uYW1lX29ubHkgKHN5bSk7Ci0JCSAgaWYgKCFsaW5lX2dyYW51bGFyaXR5ICYmIHN5bS0+aXNfc3RhdGljICYmIHN5bS0+ZmlsZSkKLQkJICAgIHsKLQkJICAgICAgZmlsZW5hbWUgPSBzeW0tPmZpbGUtPm5hbWU7Ci0JCSAgICAgIGlmICghcHJpbnRfcGF0aCkKLQkJCXsKLQkJCSAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkJCSAgaWYgKGZpbGVuYW1lKQotCQkJICAgIHsKLQkJCSAgICAgICsrZmlsZW5hbWU7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgZmlsZW5hbWUgPSBzeW0tPmZpbGUtPm5hbWU7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBwcmludGYgKCIgKCVzKSIsIGZpbGVuYW1lKTsKLQkJICAgICAgY29sICs9IHN0cmxlbiAoZmlsZW5hbWUpICsgMzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLQkJewotCQkgIHByaW50ZiAoIiU2LjZzICIsIGJ1Zik7Ci0JCSAgc3ByaW50ZiAoYnVmLCBfKCI8Y3ljbGUgJWQ+IiksIHN5bS0+Y2cuY3ljLm51bSk7Ci0JCSAgcHJpbnRmICgiJS0xOS4xOXMiLCBidWYpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY29sICs9IHN0cmxlbiAoYnVmKTsKLQkJICBmb3IgKDsgY29sIDwgc3RhcnRpbmdfY29sICsgNTsgKytjb2wpCi0JCSAgICBwdXRjaGFyICgnICcpOwotCQkgIHByaW50ZiAoIiAlcyAiLCBidWYpOwotCQkgIHNwcmludGYgKGJ1ZiwgXygiPGN5Y2xlICVkPiIpLCBzeW0tPmNnLmN5Yy5udW0pOwotCQkgIHByaW50ZiAoIiVzIiwgYnVmKTsKLQkJICBjb2wgKz0gc3RybGVuIChidWYpOwotCQl9Ci0JICAgIH0KLQkgIHN0YXJ0aW5nX2NvbCArPSBjb2x1bW5fd2lkdGg7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0gIGZyZWUgKG5hbWVfc29ydGVkX3N5bXMpOwotfQotCi0vKiBDb21wYXJlIHR3byBhcmNzIGJhc2VkIG9uIHRoZWlyIHVzYWdlIGNvdW50cy4gIFdlIHdhbnQgdG8gc29ydAotICAgaW4gZGVzY2VuZGluZyBvcmRlci4gICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2FyY19jb3VudCwgKGxlZnQsIHJpZ2h0KSwgY29uc3QgUFRSIGxlZnQgQU5EIGNvbnN0IFBUUiByaWdodCkKLXsKLSAgY29uc3QgQXJjICoqbnBwMSA9IChjb25zdCBBcmMgKiopIGxlZnQ7Ci0gIGNvbnN0IEFyYyAqKm5wcDIgPSAoY29uc3QgQXJjICoqKSByaWdodDsKLQotICBpZiAoKCpucHAxKS0+Y291bnQgPiAoKm5wcDIpLT5jb3VudCkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKCgqbnBwMSktPmNvdW50IDwgKCpucHAyKS0+Y291bnQpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ29tcGFyZSB0d28gZnVudGlvbnMgYmFzZWQgb24gdGhlaXIgdXNhZ2UgY291bnRzLiAgV2Ugd2FudCB0byBzb3J0Ci0gICBpbiBkZXNjZW5kaW5nIG9yZGVyLiAgKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfZnVuX251c2VzLCAobGVmdCwgcmlnaHQpLCBjb25zdCBQVFIgbGVmdCBBTkQgY29uc3QgUFRSIHJpZ2h0KQotewotICBjb25zdCBTeW0gKipucHAxID0gKGNvbnN0IFN5bSAqKikgbGVmdDsKLSAgY29uc3QgU3ltICoqbnBwMiA9IChjb25zdCBTeW0gKiopIHJpZ2h0OwotCi0gIGlmICgoKm5wcDEpLT5udXNlcyA+ICgqbnBwMiktPm51c2VzKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpucHAxKS0+bnVzZXMgPCAoKm5wcDIpLT5udXNlcykKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQcmludCBhIHN1Z2dlc3RlZCBmdW5jdGlvbiBvcmRlcmluZyBiYXNlZCBvbiB0aGUgcHJvZmlsaW5nIGRhdGEuCi0KLSAgIFdlIHBlcmZvcm0gNCBtYWpvciBzdGVwcyB3aGVuIG9yZGVyaW5nIGZ1bmN0aW9uczoKLQotCSogR3JvdXAgdW51c2VkIGZ1bmN0aW9ucyB0b2dldGhlciBhbmQgcGxhY2UgdGhlbSBhdCB0aGUKLQllbmQgb2YgdGhlIGZ1bmN0aW9uIG9yZGVyLgotCi0JKiBTZWFyY2ggdGhlIGhpZ2hlc3QgdXNlIGFyY3MgKHRob3NlIHdoaWNoIGFjY291bnQgZm9yIDkwJSBvZgotCXRoZSB0b3RhbCBhcmMgY291bnQpIGZvciBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBzZXZlcmFsIHBhcmVudHMuCi0KLQlHcm91cCB0aG9zZSB3aXRoIHRoZSBtb3N0IGNhbGwgc2l0ZXMgdG9nZXRoZXIgKGN1cnJlbnRseSB0aGUKLQl0b3AgMS4yNSUgd2hpY2ggaGF2ZSBhdCBsZWFzdCBmaXZlIGRpZmZlcmVudCBjYWxsIHNpdGVzKS4KLQotCVRoZXNlIGFyZSBlbWl0dGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gb3JkZXIuCi0KLQkqIFVzZSBhIGdyZWVkeSBwbGFjZW1lbnQgYWxnb3JpdGhtIHRvIHBsYWNlIGZ1bmN0aW9ucyB3aGljaAotCW9jY3VyIGluIHRoZSB0b3AgOTklIG9mIHRoZSBhcmNzIGluIHRoZSBwcm9maWxlLiAgU29tZSBwcm92aXNpb25zCi0JYXJlIG1hZGUgdG8gaGFuZGxlIGhpZ2ggdXNhZ2UgYXJjcyB3aGVyZSB0aGUgcGFyZW50IGFuZC9vcgotCWNoaWxkIGhhcyBhbHJlYWR5IGJlZW4gcGxhY2VkLgotCi0JKiBSdW4gdGhlIHNhbWUgZ3JlZWR5IHBsYWNlbWVudCBhbGdvcml0aG0gb24gdGhlIHJlbWFpbmluZwotCWFyY3MgdG8gcGxhY2UgdGhlIGxlZnRvdmVyIGZ1bmN0aW9ucy4KLQotCi0gICBUaGUgdmFyaW91cyAibWFnaWMgbnVtYmVycyIgc2hvdWxkIChvbmUgZGF5KSBiZSB0dW5lYWJsZSBieSBjb21tYW5kCi0gICBsaW5lIG9wdGlvbnMuICBUaGV5IHdlcmUgYXJyaXZlZCBhdCBieSBiZW5jaG1hcmtpbmcgYSBmZXcgYXBwbGljYXRpb25zCi0gICB3aXRoIHZhcmlvdXMgdmFsdWVzIHRvIHNlZSB3aGljaCB2YWx1ZXMgcHJvZHVjZWQgYmV0dGVyIG92ZXJhbGwgZnVuY3Rpb24KLSAgIG9yZGVyaW5ncy4KLQotICAgT2YgY291cnNlLCBwcm9maWxpbmcgZXJyb3JzLCBtYWNoaW5lIGxpbWl0YXRpb25zIChQQSBsb25nIGNhbGxzKSwgYW5kCi0gICBwb29yIGN1dG9mZiB2YWx1ZXMgZm9yIHRoZSBwbGFjZW1lbnQgYWxnb3JpdGhtIG1heSBsaW1pdCB0aGUgdXNlZnVsbG5lc3MKLSAgIG9mIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gb3JkZXIuICBJbXByb3ZlbWVudHMgd291bGQgYmUgZ3JlYXRseSBhcHByZWNpYXRlZC4KLSAgIAotICAgU3VnZ2VzdGlvbnM6Ci0KLQkqIFBsYWNlIHRoZSBmdW5jdGlvbnMgd2l0aCBtYW55IGNhbGxlcnMgbmVhciB0aGUgbWlkZGxlIG9mIHRoZQotCWxpc3QgdG8gcmVkdWNlIGxvbmcgY2FsbHMuCi0KLQkqIFByb3BhZ2F0ZSBhcmMgdXNhZ2UgY2hhbmdlcyBhcyBmdW5jdGlvbnMgYXJlIHBsYWNlZC4gIEllIGlmCi0JZnVuYzEgYW5kIGZ1bmMyIGFyZSBwbGFjZWQgdG9nZXRoZXIsIGFyY3MgdG8vZnJvbSB0aG9zZSBhcmNzCi0JdG8gdGhlIHNhbWUgcGFyZW50L2NoaWxkIHNob3VsZCBiZSBjb21iaW5lZCwgdGhlbiByZXNvcnQgdGhlCi0JYXJjcyB0byBjaG9vc2UgdGhlIG5leHQgb25lLgotCi0JKiBJbXBsZW1lbnQgc29tZSBnbG9iYWwgcG9zaXRpb25pbmcgYWxnb3JpdGhtIHRvIHBsYWNlIHRoZQotCWNoYWlucyBtYWRlIGJ5IHRoZSBncmVlZHkgbG9jYWwgcG9zaXRpb25pbmcgYWxnb3JpdGhtLiAgUHJvYmFibHkKLQlieSBleGFtaW5pbmcgYXJjcyB3aGljaCBoYXZlbid0IGJlZW4gcGxhY2VkIHlldCB0byB0aWUgdHdvCi0JY2hhaW5zIHRvZ2V0aGVyLgotCi0JKiBUYWtlIGEgZnVuY3Rpb24ncyBzaXplIGFuZCB0aW1lIGludG8gYWNjb3VudCBpbiB0aGUgYWxnb3JpdGhtOwotCXNpemUgaW4gcGFydGljdWxhciBpcyBpbXBvcnRhbnQgb24gdGhlIFBBIChsb25nIGNhbGxzKS4gIFBsYWNpbmcKLQltYW55IHNtYWxsIGZ1bmN0aW9ucyBvbnRvIHRoZWlyIG93biBwYWdlIG1heSBiZSB3aXNlLgotCi0JKiBVc2UgYmV0dGVyIHByb2ZpbGluZyBpbmZvcm1hdGlvbjsgbWFueSBwdWJsaXNoZWQgYWxnb3JpdGhtcwotCWFyZSBiYXNlZCBvbiBjYWxsIHNlcXVlbmNlcyB0aHJvdWdoIHRpbWUsIHJhdGhlciB0aGFuIGp1c3QKLQlhcmMgY291bnRzLgotCi0JKiBQcm9kZWN1cmUgY2xvbmluZyBjb3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlIHdoZW4gYSBzbWFsbCBudW1iZXIKLQlvZiBhcmNzIGFjY291bnQgZm9yIG1vc3Qgb2YgdGhlIGNhbGxzIHRvIGEgcGFydGljdWxhciBmdW5jdGlvbi4KLQotCSogVXNlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYXZvaWQgbW92aW5nIHVudXNlZCBmdW5jdGlvbnMKLQljb21wbGV0ZWx5IG91dCBvZiB0aGUgY29kZSBzdHJlYW07IHRoaXMgd291bGQgYXZvaWQgc2V2ZXJlIGxvc3NhZ2UKLQl3aGVuIHRoZSBwcm9maWxlIGRhdGEgYmVhcnMgbGl0dGxlIHJlc2VtYmxhbmNlIHRvIGFjdHVhbCBydW5zLgotCi0JKiBQcm9wYWdhdGlvbiBvZiBhcmMgdXNhZ2VzIHNob3VsZCBhbHNvIGltcHJvdmUgLm8gbGluayBsaW5lCi0Jb3JkZXJpbmcgd2hpY2ggc2hhcmVzIHRoZSBzYW1lIGFyYyBwbGFjZW1lbnQgYWxnb3JpdGhtIHdpdGgKLQl0aGUgZnVuY3Rpb24gb3JkZXJpbmcgY29kZSAoaW4gZmFjdCBpdCBpcyBhIGRlZ2VuZXJhdGUgY2FzZQotCW9mIGZ1bmN0aW9uIG9yZGVyaW5nKS4gICovCi0JCi12b2lkCi1ERUZVTl9WT0lEIChjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZykKLXsKLSAgdW5zaWduZWQgbG9uZyBpbmRleCwgdXNlZCwgdW51c2VkLCBzY3JhdGNoX2luZGV4OwotICB1bnNpZ25lZCBsb25nICB1bnBsYWNlZF9hcmNfY291bnQsIGhpZ2hfYXJjX2NvdW50LCBzY3JhdGNoX2FyY19jb3VudDsKLSNpZmRlZiBfX0dOVUNfXwotICB1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfYXJjcywgdG1wX2FyY3NfY291bnQ7Ci0jZWxzZQotICB1bnNpZ25lZCBsb25nIHRvdGFsX2FyY3MsIHRtcF9hcmNzX2NvdW50OwotI2VuZGlmCi0gIFN5bSAqKnVudXNlZF9zeW1zLCAqKnVzZWRfc3ltcywgKipzY3JhdGNoX3N5bXM7Ci0gIEFyYyAqKnVucGxhY2VkX2FyY3MsICoqaGlnaF9hcmNzLCAqKnNjcmF0Y2hfYXJjczsKLQotICBpbmRleCA9IDA7Ci0gIHVzZWQgPSAwOwotICB1bnVzZWQgPSAwOwotICBzY3JhdGNoX2luZGV4ID0gMDsKLSAgdW5wbGFjZWRfYXJjX2NvdW50ID0gMDsKLSAgaGlnaF9hcmNfY291bnQgPSAwOwotICBzY3JhdGNoX2FyY19jb3VudCA9IDA7Ci0KLSAgLyogRmlyc3QgZ3JvdXAgYWxsIHRoZSB1bnVzZWQgZnVuY3Rpb25zIHRvZ2V0aGVyLiAgKi8KLSAgdW51c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICB1c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBzY3JhdGNoX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBoaWdoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICBzY3JhdGNoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICB1bnBsYWNlZF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLQotICAvKiBXYWxrIHRocm91Z2ggYWxsIHRoZSBmdW5jdGlvbnM7IG1hcmsgdGhvc2Ugd2hpY2ggYXJlIG5ldmVyCi0gICAgIGNhbGxlZCBhcyBwbGFjZWQgKHdlJ2xsIGVtaXQgdGhlbSBhcyBhIGdyb3VwIGxhdGVyKS4gICovCi0gIGZvciAoaW5kZXggPSAwLCB1c2VkID0gMCwgdW51c2VkID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChzeW10YWIuYmFzZVtpbmRleF0ubmNhbGxzID09IDApCi0JewotCSAgLyogRmlsdGVyIG91dCBncHJvZiBnZW5lcmF0ZWQgbmFtZXMuICAqLwotCSAgaWYgKHN0cmNtcCAoc3ltdGFiLmJhc2VbaW5kZXhdLm5hbWUsICI8bG9jb3JlPiIpCi0JICAgICAgJiYgc3RyY21wIChzeW10YWIuYmFzZVtpbmRleF0ubmFtZSwgIjxoaWNvcmU+IikpCi0JICAgIHsKLQkgICAgICB1bnVzZWRfc3ltc1t1bnVzZWQrK10gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotCSAgICAgIHN5bXRhYi5iYXNlW2luZGV4XS5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVzZWRfc3ltc1t1c2VkKytdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLQkgIHN5bXRhYi5iYXNlW2luZGV4XS5oYXNfYmVlbl9wbGFjZWQgPSAwOwotCSAgc3ltdGFiLmJhc2VbaW5kZXhdLm5leHQgPSAwOwotCSAgc3ltdGFiLmJhc2VbaW5kZXhdLnByZXYgPSAwOwotCSAgc3ltdGFiLmJhc2VbaW5kZXhdLm51c2VzID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFNvcnQgdGhlIGFyY3MgZnJvbSBtb3N0IHVzZWQgdG8gbGVhc3QgdXNlZC4gICovCi0gIHFzb3J0IChhcmNzLCBudW1hcmNzLCBzaXplb2YgKEFyYyAqKSwgY21wX2FyY19jb3VudCk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgdG90YWwgYXJjIGNvdW50LiAgQWxzbyBtYXJrIGFyY3MgYXMgdW5wbGFjZWQuCi0KLSAgICAgTm90ZSB3ZSBkb24ndCBjb21wZW5zYXRlIGZvciBvdmVyZmxvdyBpZiB0aGF0IGhhcHBlbnMhCi0gICAgIE92ZXJmbG93IGlzIG11Y2ggbGVzcyBsaWtlbHkgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQKLSAgICAgd2l0aCBHQ0MgYXMgaXQgY2FuIGRvdWJsZS13aWRlIGludGVnZXJzIHZpYSBsb25nIGxvbmcuICAqLwotICB0b3RhbF9hcmNzID0gMDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICB0b3RhbF9hcmNzICs9IGFyY3NbaW5kZXhdLT5jb3VudDsKLSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAwOwotICAgIH0KLQotICAvKiBXZSB3YW50IHRvIHB1bGwgb3V0IHRob3NlIGZ1bmN0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlZAotICAgICBieSBtYW55IGhpZ2hseSB1c2VkIGFyY3MgYW5kIGVtaXQgdGhlbSBhcyBhIGdyb3VwLiAgVGhpcwotICAgICBjb3VsZCBwcm9iYWJseSB1c2Ugc29tZSB0dW5pbmcuICAqLwotICB0bXBfYXJjc19jb3VudCA9IDA7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgewotICAgICAgdG1wX2FyY3NfY291bnQgKz0gYXJjc1tpbmRleF0tPmNvdW50OwotCi0gICAgICAvKiBDb3VudCBob3cgbWFueSB0aW1lcyBlYWNoIHBhcmVudCBhbmQgY2hpbGQgYXJlIHVzZWQgdXAKLQkgdG8gb3VyIHRocmVzaGhvbGQgb2YgYXJjcyAoOTAlKS4gICovCi0gICAgICBpZiAoKGRvdWJsZSl0bXBfYXJjc19jb3VudCAvIChkb3VibGUpdG90YWxfYXJjcyA+IDAuOTApCi0JYnJlYWs7Ci0KLSAgICAgIGFyY3NbaW5kZXhdLT5jaGlsZC0+bnVzZXMrKzsKLSAgICB9Ci0KLSAgLyogTm93IHNvcnQgYSB0ZW1wb3Jhcnkgc3ltYm9sIHRhYmxlIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YKLSAgICAgdGltZXMgZWFjaCBmdW5jdGlvbiB3YXMgdXNlZCBpbiB0aGUgaGlnaGVzdCB1c2VkIGFyY3MuICAqLwotICBtZW1jcHkgKHNjcmF0Y2hfc3ltcywgdXNlZF9zeW1zLCB1c2VkICogc2l6ZW9mIChTeW0gKikpOwotICBxc29ydCAoc2NyYXRjaF9zeW1zLCB1c2VkLCBzaXplb2YgKFN5bSAqKSwgY21wX2Z1bl9udXNlcyk7Ci0KLSAgLyogTm93IHBpY2sgb3V0IHRob3NlIHN5bWJvbHMgd2UncmUgZ29pbmcgdG8gZW1pdCBhcwotICAgICBhIGdyb3VwLiAgV2UgdGFrZSB1cCB0byAxLjI1JSBvZiB0aGUgdXNlZCBzeW1ib2xzLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdXNlZCAvIDgwOyBpbmRleCsrKQotICAgIHsKLSAgICAgIFN5bSAqc3ltID0gc2NyYXRjaF9zeW1zW2luZGV4XTsKLSAgICAgIEFyYyAqYXJjOwotCi0gICAgICAvKiBJZiB3ZSBoaXQgc3ltYm9scyB0aGF0IGFyZW4ndCB1c2VkIGZyb20gbWFueSBjYWxsIHNpdGVzLAotCSB0aGVuIHdlIGNhbiBxdWl0LiAgV2UgY2hvb3NlIGZpdmUgYXMgdGhlIGxvdyBsaW1pdCBmb3IKLQkgbm8gcGFydGljdWxhciByZWFzb24uICAqLwotICAgICAgaWYgKHN5bS0+bnVzZXMgPT0gNSkKLQlicmVhazsKLQotICAgICAgLyogV2UncmUgZ29pbmcgdG8gbmVlZCB0aGUgYXJjcyBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucy4KLQkgVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3Qga25vdyBhbGwgdGhlc2UgZnVuY3Rpb25zCi0JIHVudGlsIHdlJ3JlIGRvbmUuICBTbyB3ZSBrZWVwIHRyYWNrIG9mIGFsbCB0aGUgYXJjcwotCSB0byB0aGUgZnVuY3Rpb25zIHdlIGNhcmUgYWJvdXQsIHRoZW4gcHJ1bmUgb3V0IHRob3NlCi0JIHdoaWNoIGFyZSB1bmludGVyZXN0aW5nLiAKLQotCSBBbiBpbnRlcmVzdGluZyB2YXJpYXRpb24gd291bGQgYmUgdG8gcXVpdCB3aGVuIHdlIGZvdW5kCi0JIG11bHRpLWNhbGwgc2l0ZSBmdW5jdGlvbnMgd2hpY2ggYWNjb3VudCBmb3Igc29tZSBwZXJjZW50YWdlCi0JIG9mIHRoZSBhcmNzLiAgKi8KLQotICAgICAgYXJjID0gc3ltLT5jZy5jaGlsZHJlbjsKLSAgICAgIHdoaWxlIChhcmMpCi0JewotCSAgaWYgKGFyYy0+cGFyZW50ICE9IGFyYy0+Y2hpbGQpCi0JICAgIHNjcmF0Y2hfYXJjc1tzY3JhdGNoX2FyY19jb3VudCsrXSA9IGFyYzsKLQkgIGFyYy0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgIGFyYyA9IGFyYy0+bmV4dF9jaGlsZDsKLQl9Ci0KLSAgICAgIGFyYyA9IHN5bS0+Y2cucGFyZW50czsKLSAgICAgIHdoaWxlIChhcmMpCi0JewotCSAgaWYgKGFyYy0+cGFyZW50ICE9IGFyYy0+Y2hpbGQpCi0JICAgIHNjcmF0Y2hfYXJjc1tzY3JhdGNoX2FyY19jb3VudCsrXSA9IGFyYzsKLQkgIGFyYy0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgIGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQ7Ci0JfQotCi0gICAgICAvKiBLZWVwIHRyYWNrIG9mIGhvdyBtYW55IHN5bWJvbHMgd2UncmUgZ29pbmcgdG8gcGxhY2UuICAqLwotICAgICAgc2NyYXRjaF9pbmRleCA9IGluZGV4OwotCi0gICAgICAvKiBBIGxpZSwgYnV0IGl0IG1ha2VzIGlkZW50aWZ5aW5nIHRoZXNlIGZ1bmN0aW9ucyBlYXNpZXIKLQkgbGF0ZXIuICAqLwotICAgICAgc3ltLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotICAgIH0KLQotICAvKiBOb3cgd2FsayB0aHJvdWdoIHRoZSB0ZW1wb3JhcnkgYXJjcyBhbmQgY29weSB0aG9zZSB3ZSBjYXJlIGFib3V0Ci0gICAgIGludG8gdGhlIGhpZ2ggYXJjcyBhcnJheS4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNjcmF0Y2hfYXJjX2NvdW50OyBpbmRleCsrKQotICAgIHsKLSAgICAgIEFyYyAqYXJjID0gc2NyYXRjaF9hcmNzW2luZGV4XTsKLQotICAgICAgLyogSWYgdGhpcyBhcmMgcmVmZXJzIHRvIGhpZ2hseSB1c2VkIGZ1bmN0aW9ucywgdGhlbgotCSB0aGVuIHdlIHdhbnQgdG8ga2VlcCBpdC4gICovCi0gICAgICBpZiAoYXJjLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkCi0JICAmJiBhcmMtPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkKQotCXsKLQkgIGhpZ2hfYXJjc1toaWdoX2FyY19jb3VudCsrXSA9IHNjcmF0Y2hfYXJjc1tpbmRleF07Ci0KLQkgIC8qIFdlIG5lZWQgdG8gdHVybiBvZiBoYXNfYmVlbl9wbGFjZWQgc2luY2Ugd2UncmUgZ29pbmcgdG8KLQkgICAgIHVzZSB0aGUgbWFpbiBhcmMgcGxhY2VtZW50IGFsZ29yaXRobSBvbiB0aGVzZSBhcmNzLiAgKi8KLQkgIGFyYy0+Y2hpbGQtPmhhc19iZWVuX3BsYWNlZCA9IDA7Ci0JICBhcmMtPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIER1bXAgdGhlIG11bHRpLXNpdGUgaGlnaCB1c2FnZSBmdW5jdGlvbnMgd2hpY2ggYXJlIG5vdCBnb2luZwotICAgICB0byBiZSBvcmRlcmVkIGJ5IHRoZSBtYWluIG9yZGVyaW5nIGFsZ29yaXRobS4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNjcmF0Y2hfaW5kZXg7IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKHNjcmF0Y2hfc3ltc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCkKLQlwcmludGYgKCIlc1xuIiwgc2NyYXRjaF9zeW1zW2luZGV4XS0+bmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBjYW4gb3JkZXIgdGhlIG11bHRpLXNpdGUgaGlnaCB1c2UgZnVuY3Rpb25zIGJhc2VkIG9uIHRoZQotICAgICBhcmNzIGJldHdlZW4gdGhlbS4gICovCi0gIHFzb3J0IChoaWdoX2FyY3MsIGhpZ2hfYXJjX2NvdW50LCBzaXplb2YgKEFyYyAqKSwgY21wX2FyY19jb3VudCk7Ci0gIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIChoaWdoX2FyY3MsIGhpZ2hfYXJjX2NvdW50LCAxLAotCQkJCSAgICB1bnBsYWNlZF9hcmNzLCAmdW5wbGFjZWRfYXJjX2NvdW50KTsKLQotICAvKiBPcmRlciBhbmQgZHVtcCB0aGUgaGlnaCB1c2UgZnVuY3Rpb25zIGxlZnQsIHRoZXNlIHR5cGljYWxseQotICAgICBoYXZlIG9ubHkgYSBmZXcgY2FsbCBzaXRlcy4gICovCi0gIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIChhcmNzLCBudW1hcmNzLCAwLAotCQkJCSAgICB1bnBsYWNlZF9hcmNzLCAmdW5wbGFjZWRfYXJjX2NvdW50KTsKLQotICAvKiBOb3cgcGxhY2UgdGhlIHJhcmVseSB1c2VkIGZ1bmN0aW9ucy4gICovCi0gIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzICh1bnBsYWNlZF9hcmNzLCB1bnBsYWNlZF9hcmNfY291bnQsIDEsCi0JCQkJICAgIHNjcmF0Y2hfYXJjcywgJnNjcmF0Y2hfYXJjX2NvdW50KTsKLQotICAvKiBPdXRwdXQgYW55IGZ1bmN0aW9ucyBub3QgZW1pdHRlZCBieSB0aGUgb3JkZXJfYW5kX2R1bXAgY2FsbHMuICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1c2VkOyBpbmRleCsrKQotICAgIGlmICh1c2VkX3N5bXNbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPT0gMCkKLSAgICAgIHByaW50ZigiJXNcbiIsIHVzZWRfc3ltc1tpbmRleF0tPm5hbWUpOwotCi0gIC8qIE91dHB1dCB0aGUgdW51c2VkIGZ1bmN0aW9ucy4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHVudXNlZDsgaW5kZXgrKykKLSAgICBwcmludGYoIiVzXG4iLCB1bnVzZWRfc3ltc1tpbmRleF0tPm5hbWUpOwotCi0gIHVudXNlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgdXNlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgc2NyYXRjaF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgaGlnaF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLSAgc2NyYXRjaF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLSAgdW5wbGFjZWRfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0KLSAgZnJlZSAodW51c2VkX3N5bXMpOwotICBmcmVlICh1c2VkX3N5bXMpOwotICBmcmVlIChzY3JhdGNoX3N5bXMpOwotICBmcmVlIChoaWdoX2FyY3MpOwotICBmcmVlIChzY3JhdGNoX2FyY3MpOwotICBmcmVlICh1bnBsYWNlZF9hcmNzKTsKLX0KLQotLyogUGxhY2UgZnVuY3Rpb25zIGJhc2VkIG9uIHRoZSBhcmNzIGluIEFSQ1Mgd2l0aCBOVU1BUkNTIGVudHJpZXM7Ci0gICBwbGFjZSB1bnVzZWQgYXJjcyBpbnRvIFVOUExBQ0VEX0FSQ1MvVU5QTEFDRURfQVJDX0NPVU5ULgotCi0gICBJZiBBTEwgaXMgbm9uemVybywgdGhlbiBwbGFjZSBhbGwgZnVuY3Rpb25zIHJlZmVyZW5jZWQgYnkgQVJDUywKLSAgIGVsc2Ugb25seSBwbGFjZSB0aG9zZSByZWZlcmVuY2VkIGluIHRoZSB0b3AgOTklIG9mIHRoZSBhcmNzIGluIEFSQ1MuICAqLwotCi0jZGVmaW5lIE1PU1QgMC45OQotc3RhdGljIHZvaWQKLW9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIChhcmNzLCBudW1hcmNzLCBhbGwsCi0JCQkJICB1bnBsYWNlZF9hcmNzLCB1bnBsYWNlZF9hcmNfY291bnQpCi0gICAgIEFyYyAqKmFyY3M7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbnVtYXJjczsKLSAgICAgaW50IGFsbDsKLSAgICAgQXJjICoqdW5wbGFjZWRfYXJjczsKLSAgICAgdW5zaWduZWQgbG9uZyAqdW5wbGFjZWRfYXJjX2NvdW50OwotewotI2lmZGVmIF9fR05VQ19fCi0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0bXBfYXJjcywgdG90YWxfYXJjczsKLSNlbHNlCi0gIHVuc2lnbmVkIGxvbmcgdG1wX2FyY3MsIHRvdGFsX2FyY3M7Ci0jZW5kaWYKLSAgdW5zaWduZWQgaW50IGluZGV4OwotCi0gIC8qIElmIG5lZWRlZCwgY29tcHV0ZSB0aGUgdG90YWwgYXJjIGNvdW50LgotCi0gICAgIE5vdGUgd2UgZG9uJ3QgY29tcGVuc2F0ZSBmb3Igb3ZlcmZsb3cgaWYgdGhhdCBoYXBwZW5zISAgKi8KLSAgaWYgKCEgYWxsKQotICAgIHsKLSAgICAgIHRvdGFsX2FyY3MgPSAwOwotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLQl0b3RhbF9hcmNzICs9IGFyY3NbaW5kZXhdLT5jb3VudDsKLSAgICB9Ci0gIGVsc2UKLSAgICB0b3RhbF9hcmNzID0gMDsKLQotICB0bXBfYXJjcyA9IDA7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgewotICAgICAgU3ltICpzeW0xLCAqc3ltMjsKLSAgICAgIFN5bSAqY2hpbGQsICpwYXJlbnQ7Ci0KLSAgICAgIHRtcF9hcmNzICs9IGFyY3NbaW5kZXhdLT5jb3VudDsKLQotICAgICAgLyogSWdub3JlIHRoaXMgYXJjIGlmIGl0J3MgYWxyZWFkeSBiZWVuIHBsYWNlZC4gICovCi0gICAgICBpZiAoYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCkKLQljb250aW51ZTsKLQotICAgICAgY2hpbGQgPSBhcmNzW2luZGV4XS0+Y2hpbGQ7Ci0gICAgICBwYXJlbnQgPSBhcmNzW2luZGV4XS0+cGFyZW50OwotCi0gICAgICAvKiBJZiB3ZSdyZSBub3QgdXNpbmcgYWxsIGFyY3MsIGFuZCB0aGlzIGlzIGEgcmFyZWx5IHVzZWQKLQkgYXJjLCB0aGVuIHB1dCBpdCBvbiB0aGUgdW5wbGFjZWRfYXJjIGxpc3QuICBTaW1pbGFybHkKLQkgaWYgYm90aCB0aGUgcGFyZW50IGFuZCBjaGlsZCBvZiB0aGlzIGFyYyBoYXZlIGJlZW4gcGxhY2VkLiAgKi8KLSAgICAgIGlmICgoISBhbGwgJiYgKGRvdWJsZSl0bXBfYXJjcyAvIChkb3VibGUpdG90YWxfYXJjcyA+IE1PU1QpCi0JICB8fCBjaGlsZC0+aGFzX2JlZW5fcGxhY2VkIHx8IHBhcmVudC0+aGFzX2JlZW5fcGxhY2VkKQotCXsKLQkgIHVucGxhY2VkX2FyY3NbKCp1bnBsYWNlZF9hcmNfY291bnQpKytdID0gYXJjc1tpbmRleF07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIGFsbCBzbG90cyBpbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBhcmUgZnVsbCwgdGhlbiB0aGVyZSBpc24ndAotCSBhbnl0aGluZyB3ZSBjYW4gZG8gcmlnaHQgbm93LiAgV2UnbGwgcGxhY2UgdGhpcyBhcmMgb24gdGhlCi0JIHVucGxhY2VkIGFyYyBsaXN0IGluIHRoZSBob3BlIHRoYXQgYSBnbG9iYWwgcG9zaXRpb25pbmcKLQkgYWxnb3JpdGhtIGNhbiB1c2UgaXQgdG8gcGxhY2UgZnVuY3Rpb24gY2hhaW5zLiAgKi8KLSAgICAgIGlmIChwYXJlbnQtPm5leHQgJiYgcGFyZW50LT5wcmV2ICYmIGNoaWxkLT5uZXh0ICYmIGNoaWxkLT5wcmV2KQotCXsKLQkgIHVucGxhY2VkX2FyY3NbKCp1bnBsYWNlZF9hcmNfY291bnQpKytdID0gYXJjc1tpbmRleF07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBwYXJlbnQgaXMgdW5hdHRhY2hlZCwgdGhlbiBmaW5kIHRoZSBjbG9zZXN0Ci0JIHBsYWNlIHRvIGF0dGFjaCBpdCBvbnRvIGNoaWxkJ3MgY2hhaW4uICAgU2ltaWxhcmx5Ci0JIGZvciB0aGUgb3Bwb3NpdGUgY2FzZS4gICovCi0gICAgICBpZiAoIXBhcmVudC0+bmV4dCAmJiAhcGFyZW50LT5wcmV2KQotCXsKLQkgIGludCBuZXh0X2NvdW50ID0gMDsKLQkgIGludCBwcmV2X2NvdW50ID0gMDsKLQkgIFN5bSAqcHJldiA9IGNoaWxkOwotCSAgU3ltICpuZXh0ID0gY2hpbGQ7Ci0KLQkgIC8qIFdhbGsgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBjaGlsZCdzIGNoYWluLiAgKi8KLQkgIHdoaWxlIChuZXh0LT5uZXh0KQotCSAgICB7Ci0JICAgICAgbmV4dCA9IG5leHQtPm5leHQ7Ci0JICAgICAgbmV4dF9jb3VudCsrOwotCSAgICB9Ci0KLQkgIHdoaWxlIChwcmV2LT5wcmV2KQotCSAgICB7Ci0JICAgICAgcHJldiA9IHByZXYtPnByZXY7Ci0JICAgICAgcHJldl9jb3VudCsrOwotCSAgICB9Ci0JICAKLQkgIC8qIENob29zZSB0aGUgY2xvc2VzdC4gICovCi0JICBjaGlsZCA9IG5leHRfY291bnQgPCBwcmV2X2NvdW50ID8gbmV4dCA6IHByZXY7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghIGNoaWxkLT5uZXh0ICYmICFjaGlsZC0+cHJldikKLQl7Ci0JICBpbnQgbmV4dF9jb3VudCA9IDA7Ci0JICBpbnQgcHJldl9jb3VudCA9IDA7Ci0JICBTeW0gKnByZXYgPSBwYXJlbnQ7Ci0JICBTeW0gKm5leHQgPSBwYXJlbnQ7Ci0KLQkgIHdoaWxlIChuZXh0LT5uZXh0KQotCSAgICB7Ci0JICAgICAgbmV4dCA9IG5leHQtPm5leHQ7Ci0JICAgICAgbmV4dF9jb3VudCsrOwotCSAgICB9Ci0KLQkgIHdoaWxlIChwcmV2LT5wcmV2KQotCSAgICB7Ci0JICAgICAgcHJldiA9IHByZXYtPnByZXY7Ci0JICAgICAgcHJldl9jb3VudCsrOwotCSAgICB9Ci0KLQkgIHBhcmVudCA9IHByZXZfY291bnQgPCBuZXh0X2NvdW50ID8gcHJldiA6IG5leHQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENvdWxkbid0IGZpbmQgYW55d2hlcmUgdG8gYXR0YWNoIHRoZSBmdW5jdGlvbnMsCi0JICAgICBwdXQgdGhlIGFyYyBvbiB0aGUgdW5wbGFjZWQgYXJjIGxpc3QuICAqLwotCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHRpZSB0d28gZW5kcyB0b2dldGhlci4gICovCi0gICAgICBzeW0xID0gcGFyZW50OwotICAgICAgaWYgKHN5bTEtPm5leHQpCi0Jd2hpbGUgKHN5bTEtPm5leHQpCi0JICBzeW0xID0gc3ltMS0+bmV4dDsKLSAgICAgIGVsc2UKLQl3aGlsZSAoc3ltMS0+cHJldikKLQkgIHN5bTEgPSBzeW0xLT5wcmV2OwotCi0gICAgICBzeW0yID0gY2hpbGQ7Ci0gICAgICBpZiAoc3ltMi0+bmV4dCkKLQl3aGlsZSAoc3ltMi0+bmV4dCkKLQkgIHN5bTIgPSBzeW0yLT5uZXh0OwotICAgICAgZWxzZQotCXdoaWxlIChzeW0yLT5wcmV2KQotCSAgc3ltMiA9IHN5bTItPnByZXY7Ci0KLSAgICAgIGlmIChzeW0xID09IGNoaWxkCi0JICAmJiBzeW0yID09IHBhcmVudCkKLQl7Ci0JICAvKiBUaGlzIHdvdWxkIHRpZSB0d28gZW5kcyB0b2dldGhlci4gICovCi0JICB1bnBsYWNlZF9hcmNzWygqdW5wbGFjZWRfYXJjX2NvdW50KSsrXSA9IGFyY3NbaW5kZXhdOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocGFyZW50LT5uZXh0KQotCXsKLQkgIC8qIE11c3QgYXR0YWNoIHRvIHRoZSBwYXJlbnQncyBwcmV2IGZpZWxkLiAgKi8KLQkgIGlmICghIGNoaWxkLT5uZXh0KQotCSAgICB7Ci0JICAgICAgLyogcGFyZW50LXByZXYgYW5kIGNoaWxkLW5leHQgKi8KLQkgICAgICBwYXJlbnQtPnByZXYgPSBjaGlsZDsKLQkgICAgICBjaGlsZC0+bmV4dCA9IHBhcmVudDsKLQkgICAgICBhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHBhcmVudC0+cHJldikKLQl7Ci0JICAvKiBNdXN0IGF0dGFjaCB0byB0aGUgcGFyZW50J3MgbmV4dCBmaWVsZC4gICovCi0JICBpZiAoISBjaGlsZC0+cHJldikKLQkgICAgewotCSAgICAgIC8qIHBhcmVudC1uZXh0IGFuZCBjaGlsZC1wcmV2ICovCi0JICAgICAgcGFyZW50LT5uZXh0ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPnByZXYgPSBwYXJlbnQ7Ci0JICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FuIGF0dGFjaCB0byBlaXRoZXIgZmllbGQgaW4gdGhlIHBhcmVudCwgZGVwZW5kcwotCSAgICAgb24gd2hlcmUgd2UndmUgZ290IHNwYWNlIGluIHRoZSBjaGlsZC4gICovCi0JICBpZiAoY2hpbGQtPnByZXYpCi0JICAgIHsKLQkgICAgICAvKiBwYXJlbnQtcHJldiBhbmQgY2hpbGQtbmV4dCAqLwotCSAgICAgIHBhcmVudC0+cHJldiA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5uZXh0ID0gcGFyZW50OwotCSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBwYXJlbnQtbmV4dCBhbmQgY2hpbGQtcHJldiAqLwotCSAgICAgIHBhcmVudC0+bmV4dCA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5wcmV2ID0gcGFyZW50OwotCSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBEdW1wIHRoZSBjaGFpbnMgb2YgZnVuY3Rpb25zIHdlJ3ZlIG1hZGUuICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIFN5bSAqc3ltOwotICAgICAgaWYgKGFyY3NbaW5kZXhdLT5wYXJlbnQtPmhhc19iZWVuX3BsYWNlZAotCSAgfHwgYXJjc1tpbmRleF0tPmNoaWxkLT5oYXNfYmVlbl9wbGFjZWQpCi0JY29udGludWU7Ci0KLSAgICAgIHN5bSA9IGFyY3NbaW5kZXhdLT5wYXJlbnQ7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzbid0IGF0dGFjaGVkIHRvIGFueSBvdGhlcgotCSBzeW1ib2xzLCB0aGVuIHdlJ3ZlIGdvdCBhIHJhcmVseSB1c2VkIGFyYy4KLQotCSBTa2lwIGl0IGZvciBub3csIHdlJ2xsIGRlYWwgd2l0aCB0aGVtIGxhdGVyLiAgKi8KLSAgICAgIGlmIChzeW0tPm5leHQgPT0gTlVMTAotCSAgJiYgc3ltLT5wcmV2ID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0byB0aGUgc3RhcnQgb2YgdGhpcyBjaGFpbi4gICovCi0gICAgICB3aGlsZSAoc3ltLT5wcmV2KQotCXN5bSA9IHN5bS0+cHJldjsKLQotICAgICAgd2hpbGUgKHN5bSkKLQl7Ci0JICAvKiBNYXJrIGl0IGFzIHBsYWNlZC4gICovCi0JICBzeW0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICBwcmludGYgKCIlc1xuIiwgc3ltLT5uYW1lKTsKLQkgIHN5bSA9IHN5bS0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIHdhbnQgdG8gcGxhY2UgYWxsIHRoZSBhcmNzLCB0aGVuIG91dHB1dCB0aG9zZSB3aGljaCB3ZXJlbid0Ci0gICAgIHBsYWNlZCBieSB0aGUgbWFpbiBhbGdvcml0aG0uICAqLwotICBpZiAoYWxsKQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgICB7Ci0JU3ltICpzeW07Ci0JaWYgKGFyY3NbaW5kZXhdLT5wYXJlbnQtPmhhc19iZWVuX3BsYWNlZAotCSAgICB8fCBhcmNzW2luZGV4XS0+Y2hpbGQtPmhhc19iZWVuX3BsYWNlZCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ltID0gYXJjc1tpbmRleF0tPnBhcmVudDsKLQotCXN5bS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQlwcmludGYgKCIlc1xuIiwgc3ltLT5uYW1lKTsKLSAgICAgIH0KLX0KLQotLyogUHJpbnQgYSBzdWdnZXN0ZWQgLm8gb3JkZXJpbmcgZm9yIGZpbGVzIG9uIGEgbGluayBsaW5lIGJhc2VkCi0gICBvbiBwcm9maWxpbmcgaW5mb3JtYXRpb24uICBUaGlzIHVzZXMgdGhlIGZ1bmN0aW9uIHBsYWNlbWVudAotICAgY29kZSBmb3IgdGhlIGJ1bGsgb2YgaXRzIHdvcmsuICAqLwotCi1zdHJ1Y3QgZnVuY3Rpb25fbWFwIHsKLSAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLSAgY2hhciAqZmlsZV9uYW1lOwotfTsKLQotdm9pZAotREVGVU5fVk9JRCAoY2dfcHJpbnRfZmlsZV9vcmRlcmluZykKLXsKLSAgdW5zaWduZWQgbG9uZyBzY3JhdGNoX2FyY19jb3VudCwgaW5kZXg7Ci0gIEFyYyAqKnNjcmF0Y2hfYXJjczsKLSAgZXh0ZXJuIHN0cnVjdCBmdW5jdGlvbl9tYXAgKnN5bWJvbF9tYXA7Ci0gIGV4dGVybiB1bnNpZ25lZCBpbnQgc3ltYm9sX21hcF9jb3VudDsKLSAgY2hhciAqbGFzdDsKLQotICBzY3JhdGNoX2FyY19jb3VudCA9IDA7Ci0KLSAgc2NyYXRjaF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoISBhcmNzW2luZGV4XS0+cGFyZW50LT5tYXBwZWQKLQkgIHx8ICEgYXJjc1tpbmRleF0tPmNoaWxkLT5tYXBwZWQpCi0JYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0gICAgfQotCi0gIG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzIChhcmNzLCBudW1hcmNzLCAwLAotCQkJCSAgICBzY3JhdGNoX2FyY3MsICZzY3JhdGNoX2FyY19jb3VudCk7Ci0KLSAgLyogT3V0cHV0IC5vJ3Mgbm90IGhhbmRsZWQgYnkgdGhlIG1haW4gcGxhY2VtZW50IGFsZ29yaXRobS4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKHN5bXRhYi5iYXNlW2luZGV4XS5tYXBwZWQKLQkgICYmICEgc3ltdGFiLmJhc2VbaW5kZXhdLmhhc19iZWVuX3BsYWNlZCkKLQlwcmludGYgKCIlc1xuIiwgc3ltdGFiLmJhc2VbaW5kZXhdLm5hbWUpOwotICAgIH0KLQotICAvKiBOb3cgb3V0cHV0IGFueSAubydzIHRoYXQgZGlkbid0IGhhdmUgYW55IHRleHQgc3ltYm9scy4gICovCi0gIGxhc3QgPSBOVUxMOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW1ib2xfbWFwX2NvdW50OyBpbmRleCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbmRleDI7Ci0KLSAgICAgIC8qIERvbid0IGJvdGhlciBzZWFyY2hpbmcgaWYgdGhpcyBzeW1ib2wgaXMgdGhlCi0JIHNhbWUgYXMgdGhlIHByZXZpb3VzIG9uZS4gICovCi0gICAgICBpZiAobGFzdCAmJiAhc3RyY21wIChsYXN0LCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKGluZGV4MiA9IDA7IGluZGV4MiA8IHN5bXRhYi5sZW47IGluZGV4MisrKQotCXsKLQkgIGlmICghIHN5bXRhYi5iYXNlW2luZGV4Ml0ubWFwcGVkKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKCFzdHJjbXAgKHN5bXRhYi5iYXNlW2luZGV4Ml0ubmFtZSwgc3ltYm9sX21hcFtpbmRleF0uZmlsZV9uYW1lKSkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBpdCBpbiB0aGUgc3ltYm9sIHRhYmxlLCB0aGVuIGl0IG11c3QgYmUgYSAubwotCSB3aXRoIG5vIHRleHQgc3ltYm9scy4gIE91dHB1dCBpdCBsYXN0LiAgKi8KLSAgICAgIGlmIChpbmRleDIgPT0gc3ltdGFiLmxlbikKLQlwcmludGYgKCIlc1xuIiwgc3ltYm9sX21hcFtpbmRleF0uZmlsZV9uYW1lKTsKLSAgICAgIGxhc3QgPSBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWU7Ci0gICAgfSAKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX3ByaW50LmggYi9ncHJvZi9jZ19wcmludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODJjNGFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX3ByaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jaWZuZGVmIGNnX3ByaW50X2gKLSNkZWZpbmUgY2dfcHJpbnRfaAotCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotZXh0ZXJuIGRvdWJsZSBwcmludF90aW1lOwkvKiB0b3RhbCBvZiB0aW1lIGJlaW5nIHByaW50ZWQgKi8KLQotZXh0ZXJuIHZvaWQgY2dfcHJpbnQgUEFSQU1TICgoU3ltICoqIGNnKSk7Ci1leHRlcm4gdm9pZCBjZ19wcmludF9pbmRleCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBjZ19wcmludF9maWxlX29yZGVyaW5nIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIGNnX3ByaW50X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2NvbmZpZ3VyZSBiL2dwcm9mL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZmNTEzNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAzICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWdwcm9mLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTkwOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxMTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI5OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2NDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MTc6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzc0OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1ncHJvZgotCi1WRVJTSU9OPTIuOS40Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIwOiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDY6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NTk6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODcyOiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDY5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTAxOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxMTEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTExNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0ODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTc2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIxOTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjQzOiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDY6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjgyOiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjk4OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMzNjogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogCVwoJGFjX3N5bWNvZGVcKSAJIAkqXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwMzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDU1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLQotZmkKLQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLWVjaG8gIiRhY190IiIkYWNfcmVzdWx0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTAxOiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTM6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5jID4mNQotZmkKLXJtIC1yZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiIDE+JjYKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUzOTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTU4MSAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjAzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYwOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2Mzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjcwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTczNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTU2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTg4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDMwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAzNTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDYzOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNjA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTgzOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxOTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMzg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNjM6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyNzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY3OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQyMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDQyOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDU2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ4MjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ4NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTE1OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NTA6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTgzOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1ODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NDg6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY3ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY4MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MzM6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3NjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc4NTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3OTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgyNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjgyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODc3OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA1MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDkzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNTA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjEyOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyMTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjI0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI0NTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjY1OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyODQ6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI5NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMTE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzM5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzNzQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDQ4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTM5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1NzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1Nzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY0NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2ODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NzE6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3OTk6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODcyOiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg5NTogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzkwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkxMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkyODogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk0MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTU5OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBnY29uZmlnLmg6Z2NvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJnY29uZmlnLmg6Z2NvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlLmJhdCBiL2dwcm9mL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWYzN2UuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLUBlY2hvIG9mZg0KLWVjaG8gQ29uZmlndXJpbmcgZ3Byb2YgZm9yIGdvMzINCi1yZW0gVGhpcyBiYXRjaCBmaWxlIGFzc3VtZXMgYSB1bml4LXR5cGUgInNlZCIgcHJvZ3JhbQ0KLQ0KLWVjaG8gIyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgImNvbmZpZ3VyZS5iYXQiPiBNYWtlZmlsZQ0KLQ0KLWlmIGV4aXN0IGNvbmZpZy5zZWQgZGVsIGNvbmZpZy5zZWQNCi0NCi1lY2hvICIvXiMjIyQvIGlcCQkJCSI+PmNvbmZpZy5zZWQNCi1lY2hvICJNWV9NQUNISU5FPWkzODZcCQkJCSI+PmNvbmZpZy5zZWQNCi1lY2hvICJDQz1nY2MJCQkJCSI+PmNvbmZpZy5zZWQNCi0NCi1lY2hvICMgPj4gY29uZmlnLnNlZA0KLQ0KLXNlZCAtZSAicy9eXCIvLyIgLWUgInMvXCIkLy8iIC1lICJzL1sgCV0qJC8vIiBjb25maWcuc2VkID4gY29uZmlnMi5zZWQNCi1zZWQgLWYgY29uZmlnMi5zZWQgTWFrZWZpbGUuaW4gPj4gTWFrZWZpbGUNCi1kZWwgY29uZmlnLnNlZA0KLWRlbCBjb25maWcyLnNlZA0KZGlmZiAtLWdpdCBhL2dwcm9mL2NvbmZpZ3VyZS5pbiBiL2dwcm9mL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwYjU1ZC4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChncHJvZi5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UoZ3Byb2YsIDIuOS40KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotZG5sIEZvciBzaW1wbGljaXR5LCB3ZSB1c2UgdGhlIEJGRCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIG1vc3QKLWRubCB0aGluZ3MuICBIb3dldmVyLCB3ZSBhbHNvIG5lZWQgb3VyIG93biBjb25maWd1cmF0aW9uIGZpbGUgZm9yCi1kbmwgdGhlIGF1dG9tYWtlIFBBQ0tBR0UgYW5kIFZFUlNJT04gbWFjcm9zLiAgV2UgZG9uJ3QgbmFtZSBpdAotZG5sIGNvbmZpZy5oLCB0byBhdm9pZCBhbnkgcG9zc2libGUgY29uZnVzaW9uIHdpdGggdGhlIGJmZCBjb25maWcuaC4KLUFNX0NPTkZJR19IRUFERVIoZ2NvbmZpZy5oOmdjb25maWcuaW4pCi0KLUFDX1BST0dfQ0MKLUFDX1BST0dfSU5TVEFMTAotCi1BQ19JU0NfUE9TSVgKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi1BQ19PVVRQVVQoTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29yZWZpbGUuYyBiL2dwcm9mL2NvcmVmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWRhYTcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY29yZWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDc2NCArMCwwIEBACi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1iZmQgKmNvcmVfYmZkOwotaW50IGNvcmVfbnVtX3N5bXM7Ci1hc3ltYm9sICoqY29yZV9zeW1zOwotYXNlY3Rpb24gKmNvcmVfdGV4dF9zZWN0OwotUFRSIGNvcmVfdGV4dF9zcGFjZTsKLQotaW50IG1pbl9pbnNuX3NpemU7Ci1pbnQgb2Zmc2V0X3RvX2NvZGU7Ci0KLS8qIEZvciBtYXBwaW5nIHN5bWJvbHMgdG8gc3BlY2lmaWMgLm8gZmlsZXMgZHVyaW5nIGZpbGUgb3JkZXJpbmcuICAqLwotc3RydWN0IGZ1bmN0aW9uX21hcCB7Ci0gIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci0gIGNoYXIgKmZpbGVfbmFtZTsKLX07Ci0KLXN0cnVjdCBmdW5jdGlvbl9tYXAgKnN5bWJvbF9tYXA7Ci11bnNpZ25lZCBpbnQgc3ltYm9sX21hcF9jb3VudDsKLQotZXh0ZXJuIHZvaWQgaTM4Nl9maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIGFscGhhX2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgdmF4X2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgdGFob2VfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCBzcGFyY19maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChyZWFkX2Z1bmN0aW9uX21hcHBpbmdzLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgRklMRSAqZmlsZSA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLSAgY2hhciBkdW1teVsxMDI0XTsKLSAgaW50IGNvdW50ID0gMDsKLQotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY291bGQgbm90IG9wZW4gJXMuXG4iKSwgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogRmlyc3QgcGFyc2UgdGhlIG1hcHBpbmcgZmlsZSBzbyB3ZSBrbm93IGhvdyBiaWcgd2UgbmVlZCB0bwotICAgICBtYWtlIG91ciB0YWJsZXMuICBXZSBhbHNvIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBhdCB0aGlzCi0gICAgIHRpbWUuICAqLwotICB3aGlsZSAoIWZlb2YgKGZpbGUpKQotICAgIHsKLSAgICAgIGludCBtYXRjaGVzOwotCi0gICAgICBtYXRjaGVzID0gZnNjYW5mIChmaWxlLCAiJVteXG46XSIsIGR1bW15KTsKLSAgICAgIGlmICghbWF0Y2hlcykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gcGFyc2UgbWFwcGluZyBmaWxlICVzLlxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiBKdXN0IHNraXAgbWVzc2FnZXMgYWJvdXQgZmlsZXMgd2l0aCBubyBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghc3RybmNtcCAoZHVtbXksICJObyBzeW1ib2xzIGluICIsIDE0KSkKLQl7Ci0JICBmc2NhbmYgKGZpbGUsICJcbiIpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBEb24ndCBjYXJlIHdoYXQgZWxzZSBpcyBvbiB0aGlzIGxpbmUgYXQgdGhpcyBwb2ludC4gICovCi0gICAgICBmc2NhbmYgKGZpbGUsICIlW15cbl1cbiIsIGR1bW15KTsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBrbm93IGhvdyBiaWcgd2UgbmVlZCB0byBtYWtlIG91ciB0YWJsZS4gICovCi0gIHN5bWJvbF9tYXAgPSAoKHN0cnVjdCBmdW5jdGlvbl9tYXAgKikKLQkJeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKHN0cnVjdCBmdW5jdGlvbl9tYXApKSk7Ci0KLSAgLyogUmV3aW5kIHRoZSBpbnB1dCBmaWxlIHNvIHdlIGNhbiByZWFkIGl0IGFnYWluLiAgKi8KLSAgcmV3aW5kIChmaWxlKTsKLQotICAvKiBSZWFkIGVhY2ggZW50cnkgYW5kIHB1dCBpdCBpbnRvIHRoZSB0YWJsZS4gICovCi0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKCFmZW9mIChmaWxlKSkKLSAgICB7Ci0gICAgICBpbnQgbWF0Y2hlczsKLSAgICAgIGNoYXIgKnRtcDsKLQotICAgICAgbWF0Y2hlcyA9IGZzY2FuZiAoZmlsZSwgIiVbXlxuOl0iLCBkdW1teSk7Ci0gICAgICBpZiAoIW1hdGNoZXMpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgZmlsZSAlcy5cbiIpLAotCQkgICB3aG9hbWksIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogSnVzdCBza2lwIG1lc3NhZ2VzIGFib3V0IGZpbGVzIHdpdGggbm8gc3ltYm9scy4gICovCi0gICAgICBpZiAoIXN0cm5jbXAgKGR1bW15LCAiTm8gc3ltYm9scyBpbiAiLCAxNCkpCi0JewotCSAgZnNjYW5mIChmaWxlLCAiXG4iKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogZHVtbXkgaGFzIHRoZSBmaWxlbmFtZSwgZ28gYWhlYWQgYW5kIGNvcHkgaXQuICAqLwotICAgICAgc3ltYm9sX21hcFtjb3VudF0uZmlsZV9uYW1lID0geG1hbGxvYyAoc3RybGVuIChkdW1teSkgKyAxKTsKLSAgICAgIHN0cmNweSAoc3ltYm9sX21hcFtjb3VudF0uZmlsZV9uYW1lLCBkdW1teSk7Ci0KLSAgICAgIC8qIE5vdyB3ZSBuZWVkIHRoZSBmdW5jdGlvbiBuYW1lLiAgKi8KLSAgICAgIGZzY2FuZiAoZmlsZSwgIiVbXlxuXVxuIiwgZHVtbXkpOwotICAgICAgdG1wID0gc3RycmNociAoZHVtbXksICcgJykgKyAxOwotICAgICAgc3ltYm9sX21hcFtjb3VudF0uZnVuY3Rpb25fbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAodG1wKSArIDEpOwotICAgICAgc3RyY3B5IChzeW1ib2xfbWFwW2NvdW50XS5mdW5jdGlvbl9uYW1lLCB0bXApOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgLyogUmVjb3JkIHRoZSBzaXplIG9mIHRoZSBtYXAgdGFibGUgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICAqLwotICBzeW1ib2xfbWFwX2NvdW50ID0gY291bnQ7Ci19Ci0KLXZvaWQKLURFRlVOIChjb3JlX2luaXQsIChhX291dF9uYW1lKSwgY29uc3QgY2hhciAqYV9vdXRfbmFtZSkKLXsKLSAgY29yZV9iZmQgPSBiZmRfb3BlbnIgKGFfb3V0X25hbWUsIDApOwotCi0gIGlmICghY29yZV9iZmQpCi0gICAgewotICAgICAgcGVycm9yIChhX291dF9uYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKGNvcmVfYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogbm90IGluIGEub3V0IGZvcm1hdFxuIiksIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogZ2V0IGNvcmUncyB0ZXh0IHNlY3Rpb246ICovCi0gIGNvcmVfdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGNvcmVfYmZkLCAiLnRleHQiKTsKLSAgaWYgKCFjb3JlX3RleHRfc2VjdCkKLSAgICB7Ci0gICAgICBjb3JlX3RleHRfc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChjb3JlX2JmZCwgIiRDT0RFJCIpOwotICAgICAgaWYgKCFjb3JlX3RleHRfc2VjdCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjYW4ndCBmaW5kIC50ZXh0IHNlY3Rpb24gaW4gJXNcbiIpLAotCQkgICB3aG9hbWksIGFfb3V0X25hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgIH0KLQotICAvKiByZWFkIGNvcmUncyBzeW1ib2wgdGFibGU6ICovCi0KLSAgLyogdGhpcyB3aWxsIHByb2JhYmx5IGdpdmUgdXMgbW9yZSB0aGFuIHdlIG5lZWQsIGJ1dCB0aGF0J3Mgb2s6ICAqLwotICBjb3JlX251bV9zeW1zID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGNvcmVfYmZkKTsKLSAgaWYgKGNvcmVfbnVtX3N5bXMgPCAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHdob2FtaSwgYV9vdXRfbmFtZSwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGNvcmVfc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChjb3JlX251bV9zeW1zKTsKLSAgY29yZV9udW1fc3ltcyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChjb3JlX2JmZCwgY29yZV9zeW1zKTsKLSAgaWYgKGNvcmVfbnVtX3N5bXMgPCAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHdob2FtaSwgYV9vdXRfbmFtZSwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIG1pbl9pbnNuX3NpemUgPSAxOwotICBvZmZzZXRfdG9fY29kZSA9IDA7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGNvcmVfYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgY2FzZSBiZmRfYXJjaF90YWhvZToKLSAgICAgIG9mZnNldF90b19jb2RlID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIG1pbl9pbnNuX3NpemUgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChmdW5jdGlvbl9tYXBwaW5nX2ZpbGUpCi0gICAgcmVhZF9mdW5jdGlvbl9tYXBwaW5ncyAoZnVuY3Rpb25fbWFwcGluZ19maWxlKTsKLX0KLQotCi0vKgotICogUmVhZCBpbiB0aGUgdGV4dCBzcGFjZSBvZiBhbiBhLm91dCBmaWxlCi0gKi8KLXZvaWQKLURFRlVOIChjb3JlX2dldF90ZXh0X3NwYWNlLCAoY29yZV9iZmQpLCBiZmQgKiBjb3JlX2JmZCkKLXsKLSAgY29yZV90ZXh0X3NwYWNlID0gKFBUUikgbWFsbG9jIChjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplKTsKLQotICBpZiAoIWNvcmVfdGV4dF9zcGFjZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiByYW4gb3V0IHJvb20gZm9yICVsdSBieXRlcyBvZiB0ZXh0IHNwYWNlXG4iKSwKLQkgICAgICAgd2hvYW1pLCAodW5zaWduZWQgbG9uZykgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0gIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChjb3JlX2JmZCwgY29yZV90ZXh0X3NlY3QsIGNvcmVfdGV4dF9zcGFjZSwKLQkJCQkgMCwgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZSkpCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoImJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgZnJlZSAoY29yZV90ZXh0X3NwYWNlKTsKLSAgICAgIGNvcmVfdGV4dF9zcGFjZSA9IDA7Ci0gICAgfQotICBpZiAoIWNvcmVfdGV4dF9zcGFjZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjYW4ndCBkbyAtY1xuIiksIHdob2FtaSk7Ci0gICAgfQotfQotCi0KLXZvaWQKLURFRlVOIChmaW5kX2NhbGwsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKSwKLSAgICAgICBTeW0gKiBwYXJlbnQgQU5EIGJmZF92bWEgcF9sb3dwYyBBTkQgYmZkX3ZtYSBwX2hpZ2hwYykKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGNvcmVfYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaTM4Nl9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgYWxwaGFfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgICB2YXhfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIHNwYXJjX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfdGFob2U6Ci0gICAgICB0YWhvZV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogLWMgbm90IHN1cHBvcnRlZCBvbiBhcmNoaXRlY3R1cmUgJXNcbiIpLAotCSAgICAgICB3aG9hbWksIGJmZF9wcmludGFibGVfbmFtZShjb3JlX2JmZCkpOwotCi0gICAgICAvKiBEb24ndCBnaXZlIHRoZSBlcnJvciBtb3JlIHRoYW4gb25jZS4gICovCi0gICAgICBpZ25vcmVfZGlyZWN0X2NhbGxzID0gRkFMU0U7Ci0gICAgfQotfQotCi0vKgotICogUmV0dXJuIGNsYXNzIG9mIHN5bWJvbCBTWU0uICBUaGUgcmV0dXJuZWQgY2xhc3MgY2FuIGJlIGFueSBvZjoKLSAqICAgICAgMCAgIC0+IHN5bWJvbCBpcyBub3QgaW50ZXJlc3RpbmcgdG8gdXMKLSAqICAgICAgJ1QnIC0+IHN5bWJvbCBpcyBhIGdsb2JhbCBuYW1lCi0gKiAgICAgICd0JyAtPiBzeW1ib2wgaXMgYSBsb2NhbCAoc3RhdGljKSBuYW1lCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjb3JlX3N5bV9jbGFzcywgKHN5bSksIGFzeW1ib2wgKiBzeW0pCi17Ci0gIHN5bWJvbF9pbmZvIHN5bWluZm87Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgc3ltX3ByZWZpeDsKLSAgaW50IGk7Ci0KLSAgaWYgKHN5bS0+c2VjdGlvbiA9PSBOVUxMIHx8IChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyoKLSAgICogTXVzdCBiZSBhIHRleHQgc3ltYm9sLCBhbmQgc3RhdGljIHRleHQgc3ltYm9scyBkb24ndCBxdWFsaWZ5IGlmCi0gICAqIGlnbm9yZV9zdGF0aWNfZnVuY3Mgc2V0LgotICAgKi8KLSAgaWYgKGlnbm9yZV9zdGF0aWNfZnVuY3MgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfTE9DQUwpKQotICAgIHsKLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9zeW1fY2xhc3NdICVzOiBub3QgYSBmdW5jdGlvblxuIiwKLQkJCSAgICAgIHN5bS0+bmFtZSkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltYm9sX2luZm8gKGNvcmVfYmZkLCBzeW0sICZzeW1pbmZvKTsKLSAgaSA9IHN5bWluZm8udHlwZTsKLQotICBpZiAoaSA9PSAnVCcpCi0gICAgewotICAgICAgcmV0dXJuIGk7CQkJLyogaXQncyBhIGdsb2JhbCBzeW1ib2wgKi8KLSAgICB9Ci0KLSAgaWYgKGkgPT0gJ1cnKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IHdlYWsgc3ltYm9scyBhcyB0ZXh0IHN5bWJvbHMuICBGSVhNRTogYSB3ZWFrIHN5bWJvbCBtYXkKLSAgICAgICAgIGFsc28gYmUgYSBkYXRhIHN5bWJvbC4gICovCi0gICAgICByZXR1cm4gJ1QnOwotICAgIH0KLQotICBpZiAoaSAhPSAndCcpCi0gICAgewotICAgICAgLyogbm90IGEgc3RhdGljIHRleHQgc3ltYm9sICovCi0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2NvcmVfc3ltX2NsYXNzXSAlcyBpcyBvZiBjbGFzcyAlY1xuIiwKLQkJCSAgICAgIHN5bS0+bmFtZSwgaSkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIGRvIHNvbWUgbW9yZSBmaWx0ZXJpbmcgb24gc3RhdGljIGZ1bmN0aW9uLW5hbWVzOiAqLwotCi0gIGlmIChpZ25vcmVfc3RhdGljX2Z1bmNzKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgLyoKLSAgICogQ2FuJ3QgemVyby1sZW5ndGggbmFtZSBvciBmdW5ueSBjaGFyYWN0ZXJzIGluIG5hbWUsIHdoZXJlCi0gICAqIGBmdW5ueScgaW5jbHVkZXM6IGAuJyAoLm8gZmlsZSBuYW1lcykgYW5kIGAkJyAoUGFzY2FsIGxhYmVscykuCi0gICAqLwotICBpZiAoIXN5bS0+bmFtZSB8fCBzeW0tPm5hbWVbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZm9yIChuYW1lID0gc3ltLT5uYW1lOyAqbmFtZTsgKytuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSA9PSAnLicgfHwgKm5hbWUgPT0gJyQnKQotCXsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIE9uIHN5c3RlbXMgd2hlcmUgdGhlIEMgY29tcGlsZXIgYWRkcyBhbiB1bmRlcnNjb3JlIHRvIGFsbAotICAgKiBuYW1lcywgc3RhdGljIG5hbWVzIHdpdGhvdXQgdW5kZXJzY29yZXMgc2VlbSB1c3VhbGx5IHRvIGJlCi0gICAqIGxhYmVscyBpbiBoYW5kIHdyaXR0ZW4gYXNzZW1ibGVyIGluIHRoZSBsaWJyYXJ5LiAgV2UgZG9uJ3Qgd2FudAotICAgKiB0aGVzZSBuYW1lcy4gIFRoaXMgaXMgY2VydGFpbmx5IG5lY2Vzc2FyeSBvbiBhIFNwYXJjIHJ1bm5pbmcKLSAgICogU3VuT1MgNC4xICh0cnkgcHJvZmlsaW5nIGEgcHJvZ3JhbSB0aGF0IGRvZXMgYSBsb3Qgb2YKLSAgICogZGl2aXNpb24pLiBJIGRvbid0IGtub3cgd2hldGhlciBpdCBoYXMgaGFybWZ1bCBzaWRlIGVmZmVjdHMgb24KLSAgICogb3RoZXIgc3lzdGVtcy4gIFBlcmhhcHMgaXQgc2hvdWxkIGJlIG1hZGUgY29uZmlndXJhYmxlLgotICAgKi8KLSAgc3ltX3ByZWZpeCA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoY29yZV9iZmQpOwotICBpZiAoKHN5bV9wcmVmaXggJiYgc3ltX3ByZWZpeCAhPSBzeW0tPm5hbWVbMF0pCi0gIC8qCi0gICAqIEdDQyBtYXkgYWRkIHNwZWNpYWwgc3ltYm9scyB0byBoZWxwIGdkYiBmaWd1cmUgb3V0IHRoZSBmaWxlCi0gICAqIGxhbmd1YWdlLiAgV2Ugd2FudCB0byBpZ25vcmUgdGhlc2UsIHNpbmNlIHNvbWV0aW1lcyB0aGV5IG1hc2sKLSAgICogdGhlIHJlYWwgZnVuY3Rpb24uICAoZGpAY3Ryb24pCi0gICAqLwotICAgICAgfHwgIXN0cm5jbXAgKHN5bS0+bmFtZSwgIl9fZ251X2NvbXBpbGVkIiwgMTQpCi0gICAgICB8fCAhc3RybmNtcCAoc3ltLT5uYW1lLCAiX19fZ251X2NvbXBpbGVkIiwgMTUpKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBJZiB0aGUgb2JqZWN0IGZpbGUgc3VwcG9ydHMgbWFya2luZyBvZiBmdW5jdGlvbiBzeW1ib2xzLCB0aGVuIHdlIGNhbgotICAgICB6YXAgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGhhdmUgQlNGX0ZVTkNUSU9OIHNldC4gICovCi0gIGlmIChpZ25vcmVfbm9uX2Z1bmN0aW9ucyAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gJ3QnOwkJCS8qIGl0J3MgYSBzdGF0aWMgdGV4dCBzeW1ib2wgKi8KLX0KLQotCi0vKgotICogR2V0IHdoYXRldmVyIHNvdXJjZSBpbmZvIHdlIGNhbiBnZXQgcmVnYXJkaW5nIGFkZHJlc3MgQUREUjoKLSAqLwotc3RhdGljIGJvb2wKLURFRlVOIChnZXRfc3JjX2luZm8sIChhZGRyLCBmaWxlbmFtZSwgbmFtZSwgbGluZV9udW0pLAotICAgICAgIGJmZF92bWEgYWRkciBBTkQgY29uc3QgY2hhciAqKmZpbGVuYW1lIEFORCBjb25zdCBjaGFyICoqbmFtZQotICAgICAgIEFORCBpbnQgKmxpbmVfbnVtKQotewotICBjb25zdCBjaGFyICpmbmFtZSA9IDAsICpmdW5jX25hbWUgPSAwOwotICBpbnQgbCA9IDA7Ci0KLSAgaWYgKGJmZF9maW5kX25lYXJlc3RfbGluZSAoY29yZV9iZmQsIGNvcmVfdGV4dF9zZWN0LCBjb3JlX3N5bXMsCi0JCQkgICAgIGFkZHIgLSBjb3JlX3RleHRfc2VjdC0+dm1hLAotCQkJICAgICAmZm5hbWUsICZmdW5jX25hbWUsICh1bnNpZ25lZCBpbnQgKikgJmwpCi0gICAgICAmJiBmbmFtZSAmJiBmdW5jX25hbWUgJiYgbCkKLSAgICB7Ci0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2dldF9zcmNfaW5mb10gMHglbHggLT4gJXM6JWQgKCVzKVxuIiwKLQkJCSAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLCBmbmFtZSwgbCwgZnVuY19uYW1lKSk7Ci0gICAgICAqZmlsZW5hbWUgPSBmbmFtZTsKLSAgICAgICpuYW1lID0gZnVuY19uYW1lOwotICAgICAgKmxpbmVfbnVtID0gbDsKLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbZ2V0X3NyY19pbmZvXSBubyBpbmZvIGZvciAweCVseCAoJXM6JWQsJXMpXG4iLAotCQkJICAgICAgKGxvbmcpIGFkZHIsIGZuYW1lID8gZm5hbWUgOiAiPHVua25vd24+IiwgbCwKLQkJCSAgICAgIGZ1bmNfbmFtZSA/IGZ1bmNfbmFtZSA6ICI8dW5rbm93bj4iKSk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBSZWFkIGluIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUuICBPbmUgc3ltYm9sIHBlciBmdW5jdGlvbiBpcwotICogZW50ZXJlZC4KLSAqLwotdm9pZAotREVGVU4gKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMsIChjb3JlX2JmZCksIGJmZCAqIGNvcmVfYmZkKQotewotICBiZmRfdm1hIG1pbl92bWEgPSB+MCwgbWF4X3ZtYSA9IDA7Ci0gIGludCBjbGFzczsKLSAgbG9uZyBpLCBmb3VuZCwgc2tpcDsKLSAgdW5zaWduZWQgaW50IGo7Ci0KLSAgLyogcGFzcyAxIC0gZGV0ZXJtaW5lIHVwcGVyIGJvdW5kIG9uIG51bWJlciBvZiBmdW5jdGlvbiBuYW1lczogKi8KLSAgc3ltdGFiLmxlbiA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9zeW1zOyArK2kpCi0gICAgewotICAgICAgaWYgKCFjb3JlX3N5bV9jbGFzcyAoY29yZV9zeW1zW2ldKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBiaW5hcnkgc2VhcmNoIG9yIGhhc2hlZAotCSBzZWFyY2guICBHcm9zcy4gCi0KLQkgRG9uJ3QgY3JlYXRlIGEgc3ltdGFiIGVudHJ5IGZvciBhIGZ1bmN0aW9uIHRoYXQgaGFzCi0JIGEgbWFwcGluZyB0byBhIGZpbGUsIHVubGVzcyBpdCdzIHRoZSBmaXJzdCBmdW5jdGlvbgotCSBpbiB0aGUgZmlsZS4gICovCi0gICAgICBza2lwID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzeW1ib2xfbWFwX2NvdW50OyBqKyspCi0JaWYgKCFzdHJjbXAgKGNvcmVfc3ltc1tpXS0+bmFtZSwgc3ltYm9sX21hcFtqXS5mdW5jdGlvbl9uYW1lKSkKLQkgIHsKLQkgICAgaWYgKGogPiAwICYmICEgc3RyY21wIChzeW1ib2xfbWFwIFtqXS5maWxlX25hbWUsCi0JCQkgCSAgIHN5bWJvbF9tYXAgW2ogLSAxXS5maWxlX25hbWUpKQotCSAgICAgIHNraXAgPSAxOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIGlmICghc2tpcCkKLSAgICAgICAgKytzeW10YWIubGVuOwotICAgIH0KLQotICBpZiAoc3ltdGFiLmxlbiA9PSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgYCVzJyBoYXMgbm8gc3ltYm9sc1xuIiksIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogdGhlICIrIDIiIGlzIGZvciB0aGUgc2VudGluZWxzOiAqLwotICBzeW10YWIuYmFzZSA9IChTeW0gKikgeG1hbGxvYyAoKHN5bXRhYi5sZW4gKyAyKSAqIHNpemVvZiAoU3ltKSk7Ci0KLSAgLyogcGFzcyAyIC0gY3JlYXRlIHN5bWJvbHM6ICovCi0KLSAgc3ltdGFiLmxpbWl0ID0gc3ltdGFiLmJhc2U7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9zeW1zOyArK2kpCi0gICAgewotICAgICAgY2xhc3MgPSBjb3JlX3N5bV9jbGFzcyAoY29yZV9zeW1zW2ldKTsKLSAgICAgIGlmICghY2xhc3MpCi0JewotCSAgREJHIChBT1VUREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zXSByZWplY3Rpbmc6IDB4JWx4ICVzXG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNvcmVfc3ltc1tpXS0+dmFsdWUsCi0JCSAgICAgICBjb3JlX3N5bXNbaV0tPm5hbWUpKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBiaW5hcnkgc2VhcmNoIG9yIGhhc2hlZAotCSBzZWFyY2guICBHcm9zcy4gICAqLwotCi0gICAgICBza2lwID0gMDsKLSAgICAgIGZvdW5kID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzeW1ib2xfbWFwX2NvdW50OyBqKyspCi0JaWYgKCFzdHJjbXAgKGNvcmVfc3ltc1tpXS0+bmFtZSwgc3ltYm9sX21hcFtqXS5mdW5jdGlvbl9uYW1lKSkKLQkgIHsKLQkgICAgaWYgKGogPiAwICYmICEgc3RyY21wIChzeW1ib2xfbWFwIFtqXS5maWxlX25hbWUsCi0JCQkgCSAgIHN5bWJvbF9tYXAgW2ogLSAxXS5maWxlX25hbWUpKQotCSAgICAgIHNraXAgPSAxOwotCSAgICBlbHNlCi0JICAgICAgZm91bmQgPSBqOwotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgaWYgKHNraXApCi0JY29udGludWU7Ci0KLSAgICAgIHN5bV9pbml0IChzeW10YWIubGltaXQpOwotCi0gICAgICAvKiBzeW1ib2wgb2Zmc2V0cyBhcmUgYWx3YXlzIHNlY3Rpb24tcmVsYXRpdmU6ICovCi0KLSAgICAgIHN5bXRhYi5saW1pdC0+YWRkciA9IGNvcmVfc3ltc1tpXS0+dmFsdWUgKyBjb3JlX3N5bXNbaV0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGlmIChzeW1ib2xfbWFwX2NvdW50Ci0JICAmJiAhc3RyY21wIChjb3JlX3N5bXNbaV0tPm5hbWUsIHN5bWJvbF9tYXBbZm91bmRdLmZ1bmN0aW9uX25hbWUpKQotCXsKLQkgIHN5bXRhYi5saW1pdC0+bmFtZSA9IHN5bWJvbF9tYXBbZm91bmRdLmZpbGVfbmFtZTsKLQkgIHN5bXRhYi5saW1pdC0+bWFwcGVkID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gY29yZV9zeW1zW2ldLT5uYW1lOwotCSAgc3ltdGFiLmxpbWl0LT5tYXBwZWQgPSAwOwotCX0KLQotICAgICAgLyogTG9va3VwIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciwgaWYgd2UgY2FuICovCi0KLSAgICAgIHsKLQljb25zdCBjaGFyICpmaWxlbmFtZSwgKmZ1bmNfbmFtZTsKLQkKLQlpZiAoZ2V0X3NyY19pbmZvIChzeW10YWIubGltaXQtPmFkZHIsICZmaWxlbmFtZSwgJmZ1bmNfbmFtZSwKLQkJCSAgJnN5bXRhYi5saW1pdC0+bGluZV9udW0pKQotCSAgewotCSAgICBzeW10YWIubGltaXQtPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCAoZmlsZW5hbWUpOwotCi0JICAgIC8qIEZJWE1FOiBDaGVja2luZyBfX29zZl9fIGhlcmUgZG9lcyBub3Qgd29yayB3aXRoIGEgY3Jvc3MKLSAgICAgICAgICAgICAgIGdwcm9mLiAgKi8KLSNpZmRlZiBfX29zZl9fCi0JICAgIC8qCi0JICAgICAqIFN1cHByZXNzIHN5bWJvbHMgdGhhdCBhcmUgbm90IGZ1bmN0aW9uIG5hbWVzLiAgVGhpcyBpcwotCSAgICAgKiB1c2VmdWwgdG8gc3VwcHJlc3MgY29kZS1sYWJlbHMgYW5kIGFsaWFzZXMuCi0JICAgICAqCi0JICAgICAqIFRoaXMgaXMga25vd24gdG8gYmUgdXNlZnVsIHVuZGVyIERFQydzIE9TRi8xLiAgVW5kZXIgU3VuT1MgNC54LAotCSAgICAgKiBsYWJlbHMgZG8gbm90IGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlIGluZm8sIHNvIHRoaXMgaXNuJ3QKLQkgICAgICogbmVjZXNzYXJ5LgotCSAgICAgKi8KLQotCSAgICBpZiAoc3RyY21wIChzeW10YWIubGltaXQtPm5hbWUsIGZ1bmNfbmFtZSkgIT0gMCkKLQkgICAgICB7Ci0JCS8qCi0JCSAqIFRoZSBzeW1ib2wncyBhZGRyZXNzIG1hcHMgdG8gYSBkaWZmZXJlbnQgbmFtZSwgc28KLQkJICogaXQgY2FuJ3QgYmUgYSBmdW5jdGlvbi1lbnRyeSBwb2ludC4gIFRoaXMgaGFwcGVucwotCQkgKiBmb3IgbGFiZWxzLCBmb3IgZXhhbXBsZS4KLQkJICovCi0JCURCRyAoQU9VVERFQlVHLAotCQkgICAgIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zOiByZWogJXMgKG1hcHMgdG8gJXMpXG4iLAotCQkJICAgICBzeW10YWIubGltaXQtPm5hbWUsIGZ1bmNfbmFtZSkpOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0jZW5kaWYKLQkgIH0KLSAgICAgIH0KLQotICAgICAgc3ltdGFiLmxpbWl0LT5pc19mdW5jID0gVFJVRTsKLSAgICAgIHN5bXRhYi5saW1pdC0+aXNfYmJfaGVhZCA9IFRSVUU7Ci0gICAgICBpZiAoY2xhc3MgPT0gJ3QnKQotCXsKLQkgIHN5bXRhYi5saW1pdC0+aXNfc3RhdGljID0gVFJVRTsKLQl9Ci0KLSAgICAgIG1pbl92bWEgPSBNSU4gKHN5bXRhYi5saW1pdC0+YWRkciwgbWluX3ZtYSk7Ci0gICAgICBtYXhfdm1hID0gTUFYIChzeW10YWIubGltaXQtPmFkZHIsIG1heF92bWEpOwotCi0gICAgICAvKgotICAgICAgICogSWYgd2Ugc2VlICJtYWluIiB3aXRob3V0IGFuIGluaXRpYWwgJ18nLCB3ZSBhc3N1bWUgbmFtZXMKLSAgICAgICAqIGFyZSAqbm90KiBwcmVmaXhlZCBieSAnXycuCi0gICAgICAgKi8KLSAgICAgIGlmIChzeW10YWIubGltaXQtPm5hbWVbMF0gPT0gJ20nICYmIGRpc2NhcmRfdW5kZXJzY29yZXMKLQkgICYmIHN0cmNtcCAoc3ltdGFiLmxpbWl0LT5uYW1lLCAibWFpbiIpID09IDApCi0JewotCSAgZGlzY2FyZF91bmRlcnNjb3JlcyA9IDA7Ci0JfQotCi0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2NvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXNdICVsZCAlcyAweCVseFxuIiwKLQkJCSAgICAgIChsb25nKSAoc3ltdGFiLmxpbWl0IC0gc3ltdGFiLmJhc2UpLAotCQkJICAgICAgc3ltdGFiLmxpbWl0LT5uYW1lLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHN5bXRhYi5saW1pdC0+YWRkcikpOwotICAgICAgKytzeW10YWIubGltaXQ7Ci0gICAgfQotCi0gIC8qIGNyZWF0ZSBzZW50aW5lbHM6ICovCi0KLSAgc3ltX2luaXQgKHN5bXRhYi5saW1pdCk7Ci0gIHN5bXRhYi5saW1pdC0+bmFtZSA9ICI8bG9jb3JlPiI7Ci0gIHN5bXRhYi5saW1pdC0+YWRkciA9IDA7Ci0gIHN5bXRhYi5saW1pdC0+ZW5kX2FkZHIgPSBtaW5fdm1hIC0gMTsKLSAgKytzeW10YWIubGltaXQ7Ci0KLSAgc3ltX2luaXQgKHN5bXRhYi5saW1pdCk7Ci0gIHN5bXRhYi5saW1pdC0+bmFtZSA9ICI8aGljb3JlPiI7Ci0gIHN5bXRhYi5saW1pdC0+YWRkciA9IG1heF92bWEgKyAxOwotICBzeW10YWIubGltaXQtPmVuZF9hZGRyID0gfjA7Ci0gICsrc3ltdGFiLmxpbWl0OwotCi0gIHN5bXRhYi5sZW4gPSBzeW10YWIubGltaXQgLSBzeW10YWIuYmFzZTsKLSAgc3ltdGFiX2ZpbmFsaXplICgmc3ltdGFiKTsKLX0KLQotCi0vKgotICogUmVhZCBpbiBzeW1ib2wgdGFibGUgZnJvbSBjb3JlLiAgT25lIHN5bWJvbCBwZXIgbGluZSBvZiBzb3VyY2UgY29kZQotICogaXMgZW50ZXJlZC4KLSAqLwotdm9pZAotREVGVU4gKGNvcmVfY3JlYXRlX2xpbmVfc3ltcywgKGNvcmVfYmZkKSwgYmZkICogY29yZV9iZmQpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSwgKnByZXZfZmlsZW5hbWU7Ci0gIGludCBwcmV2X25hbWVfbGVuLCBwcmV2X2ZpbGVuYW1lX2xlbjsKLSAgYmZkX3ZtYSB2bWEsIG1pbl92bWEgPSB+MCwgbWF4X3ZtYSA9IDA7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBTeW0gKnByZXYsIGR1bW15LCAqc2VudGluZWwsICpzeW07Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBpbnQgcHJldl9saW5lX251bTsKLSAgU3ltX1RhYmxlIGx0YWI7Ci0gIC8qCi0gICAqIENyZWF0ZSBzeW1ib2xzIGZvciBmdW5jdGlvbnMgYXMgdXN1YWwuICBUaGlzIGlzIG5lY2Vzc2FyeSBpbgotICAgKiBjYXNlcyB3aGVyZSBwYXJ0cyBvZiBhIHByb2dyYW0gd2VyZSBub3QgY29tcGlsZWQgd2l0aCAtZy4gIEZvcgotICAgKiB0aG9zZSBwYXJ0cyB3ZSBzdGlsbCB3YW50IHRvIGdldCBpbmZvIGF0IHRoZSBmdW5jdGlvbiBsZXZlbDoKLSAgICovCi0gIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgKGNvcmVfYmZkKTsKLQotICAvKiBwYXNzIDEgLSBjb3VudGVyIG51bWJlciBvZiBzeW1ib2xzOiAqLwotCi0gIC8qCi0gICAqIFRvIGZpbmQgYWxsIGxpbmUgaW5mb3JtYXRpb24sIHdhbGsgdGhyb3VnaCBhbGwgcG9zc2libGUKLSAgICogdGV4dC1zcGFjZSBhZGRyZXNzZXMgKG9uZSBieSBvbmUhKSBhbmQgZ2V0IHRoZSBkZWJ1Z2dpbmcKLSAgICogaW5mbyBmb3IgZWFjaCBhZGRyZXNzLiAgV2hlbiB0aGUgZGVidWdnaW5nIGluZm8gY2hhbmdlcywKLSAgICogaXQgaXMgdGltZSB0byBjcmVhdGUgYSBuZXcgc3ltYm9sLgotICAgKgotICAgKiBPZiBjb3Vyc2UsIHRoaXMgaXMgcmF0aGVyIHNsb3cgYW5kIGl0IHdvdWxkIGJlIGJldHRlciBpZgotICAgKiBiZmQgd291bGQgcHJvdmlkZSBhbiBpdGVyYXRvciBmb3IgZW51bWVyYXRpbmcgYWxsIGxpbmUgaW5mb3MKLSAgICovCi0gIHByZXZfbmFtZV9sZW4gPSBQQVRIX01BWDsKLSAgcHJldl9maWxlbmFtZV9sZW4gPSBQQVRIX01BWDsKLSAgcHJldl9uYW1lID0geG1hbGxvYyAocHJldl9uYW1lX2xlbik7Ci0gIHByZXZfZmlsZW5hbWUgPSB4bWFsbG9jIChwcmV2X2ZpbGVuYW1lX2xlbik7Ci0gIGx0YWIubGVuID0gMDsKLSAgcHJldl9saW5lX251bSA9IDA7Ci0gIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZTsgb2Zmc2V0ICs9IG1pbl9pbnNuX3NpemUpCi0gICAgewotICAgICAgaW50IGxlbjsKLQotICAgICAgdm1hID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldDsKLSAgICAgIGlmICghZ2V0X3NyY19pbmZvICh2bWEsICZmaWxlbmFtZSwgJmR1bW15Lm5hbWUsICZkdW1teS5saW5lX251bSkKLQkgIHx8IChwcmV2X2xpbmVfbnVtID09IGR1bW15LmxpbmVfbnVtCi0JICAgICAgJiYgcHJldl9uYW1lICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKHByZXZfbmFtZSwgZHVtbXkubmFtZSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAocHJldl9maWxlbmFtZSwgZmlsZW5hbWUpID09IDApKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgKytsdGFiLmxlbjsKLSAgICAgIHByZXZfbGluZV9udW0gPSBkdW1teS5saW5lX251bTsKLQotICAgICAgbGVuID0gc3RybGVuIChkdW1teS5uYW1lKTsKLSAgICAgIGlmIChsZW4gPj0gcHJldl9uYW1lX2xlbikKLQl7Ci0JICBwcmV2X25hbWVfbGVuID0gbGVuICsgMTAyNDsKLQkgIGZyZWUgKHByZXZfbmFtZSk7Ci0JICBwcmV2X25hbWUgPSB4bWFsbG9jIChwcmV2X25hbWVfbGVuKTsKLQl9Ci0gICAgICBzdHJjcHkgKHByZXZfbmFtZSwgZHVtbXkubmFtZSk7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoZmlsZW5hbWUpOwotICAgICAgaWYgKGxlbiA+PSBwcmV2X2ZpbGVuYW1lX2xlbikKLQl7Ci0JICBwcmV2X2ZpbGVuYW1lX2xlbiA9IGxlbiArIDEwMjQ7Ci0JICBmcmVlIChwcmV2X2ZpbGVuYW1lKTsKLQkgIHByZXZfZmlsZW5hbWUgPSB4bWFsbG9jIChwcmV2X2ZpbGVuYW1lX2xlbik7Ci0JfQotICAgICAgc3RyY3B5IChwcmV2X2ZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0KLSAgICAgIG1pbl92bWEgPSBNSU4gKHZtYSwgbWluX3ZtYSk7Ci0gICAgICBtYXhfdm1hID0gTUFYICh2bWEsIG1heF92bWEpOwotICAgIH0KLQotICBmcmVlIChwcmV2X25hbWUpOwotICBmcmVlIChwcmV2X2ZpbGVuYW1lKTsKLQotICAvKiBtYWtlIHJvb20gZm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRvbzogKi8KLSAgbHRhYi5sZW4gKz0gc3ltdGFiLmxlbjsKLSAgbHRhYi5iYXNlID0gKFN5bSAqKSB4bWFsbG9jIChsdGFiLmxlbiAqIHNpemVvZiAoU3ltKSk7Ci0gIGx0YWIubGltaXQgPSBsdGFiLmJhc2U7Ci0KLSAgLyogcGFzcyAyIC0gY3JlYXRlIHN5bWJvbHM6ICovCi0KLSAgLyogV2Ugbm93IHNldCBpc19zdGF0aWMgYXMgd2UgZ28gYWxvbmcsIHJhdGhlciB0aGFuIGJ5IHJ1bm5pbmcKLSAgICAgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoZSBlbmQuCi0KLSAgICAgVGhlIG9sZCB3YXkgY2FsbGVkIHN5bXRhYl9maW5hbGl6ZSBiZWZvcmUgdGhlIGlzX3N0YXRpYyBwYXNzLAotICAgICBjYXVzaW5nIGEgcHJvYmxlbSBzaW5jZSBzeW10YWJfZmluYWxpemUgdXNlcyBpc19zdGF0aWMgYXMgcGFydCBvZgotICAgICBpdHMgYWRkcmVzcyBjb25mbGljdCByZXNvbHV0aW9uIGFsZ29yaXRobS4gIFNpbmNlIGdsb2JhbCBzeW1ib2xzCi0gICAgIHdlcmUgcHJlZmVyZWQgb3ZlciBzdGF0aWMgc3ltYm9scywgYW5kIGFsbCBsaW5lIHN5bWJvbHMgd2VyZQotICAgICBnbG9iYWwgYXQgdGhhdCBwb2ludCwgc3RhdGljIGZ1bmN0aW9uIG5hbWVzIHRoYXQgY29uZmxpY3RlZCB3aXRoCi0gICAgIHRoZWlyIG93biBsaW5lIG51bWJlcnMgKHN0YXRpYywgYnV0IGxhYmVsZWQgYXMgZ2xvYmFsKSB3ZXJlCi0gICAgIHJlamVjdGVkIGluIGZhdm9yIG9mIHRoZSBsaW5lIG51bS4KLQotICAgICBUaGlzIHdhcyBub3QgdGhlIGRlc2lyZWQgZnVuY3Rpb25hbGl0eS4gIFdlIGFsd2F5cyB3YW50IHRvIGtlZXAKLSAgICAgb3VyIGZ1bmN0aW9uIHN5bWJvbHMgYW5kIGRpc2NhcmQgYW55IGNvbmZsaWN0aW5nIGxpbmUgc3ltYm9scy4KLSAgICAgUGVyaGFwcyBzeW10YWJfZmluYWxpemUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIG1ha2UgdGhpcwotICAgICBkaXN0aW5jdGlvbiBhcyB3ZWxsLCBidXQgdGhlIGN1cnJlbnQgZml4IHdvcmtzIGFuZCB0aGUgY29kZSBpcyBhCi0gICAgIGxvdCBjbGVhbmVyIG5vdy4gICovCi0KLSAgcHJldiA9IDA7Ci0gIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZTsgb2Zmc2V0ICs9IG1pbl9pbnNuX3NpemUpCi0gICAgewotICAgICAgc3ltX2luaXQgKGx0YWIubGltaXQpOwotICAgICAgaWYgKCFnZXRfc3JjX2luZm8gKGNvcmVfdGV4dF9zZWN0LT52bWEgKyBvZmZzZXQsICZmaWxlbmFtZSwKLQkJCSAmbHRhYi5saW1pdC0+bmFtZSwgJmx0YWIubGltaXQtPmxpbmVfbnVtKQotCSAgfHwgKHByZXYgJiYgcHJldi0+bGluZV9udW0gPT0gbHRhYi5saW1pdC0+bGluZV9udW0KLQkgICAgICAmJiBzdHJjbXAgKHByZXYtPm5hbWUsIGx0YWIubGltaXQtPm5hbWUpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKHByZXYtPmZpbGUtPm5hbWUsIGZpbGVuYW1lKSA9PSAwKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIG1ha2UgbmFtZSBwb2ludGVyIGEgbWFsbG9jJ2VkIHN0cmluZzogKi8KLSAgICAgIGx0YWIubGltaXQtPm5hbWUgPSB4c3RyZHVwIChsdGFiLmxpbWl0LT5uYW1lKTsKLSAgICAgIGx0YWIubGltaXQtPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCAoZmlsZW5hbWUpOwotCi0gICAgICBsdGFiLmxpbWl0LT5hZGRyID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldDsKLQotICAgICAgLyogU2V0IGlzX3N0YXRpYyBiYXNlZCBvbiB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uLCB1c2luZyBlaXRoZXI6Ci0gICAgICAgKiAxKSB0aGUgcHJldmlvdXMgc3ltYm9sLCBpZiBpdCdzIGZyb20gdGhlIHNhbWUgZnVuY3Rpb24sIG9yCi0gICAgICAgKiAyKSBhIHN5bXRhYiBsb29rdXAKLSAgICAgICAqLwotCi0gICAgICBpZiAocHJldiAmJiBsdGFiLmxpbWl0LT5maWxlID09IHByZXYtPmZpbGUgJiYKLQkgIHN0cmNtcCAobHRhYi5saW1pdC0+bmFtZSwgcHJldi0+bmFtZSkgPT0gMCkKLQl7Ci0JICBsdGFiLmxpbWl0LT5pc19zdGF0aWMgPSBwcmV2LT5pc19zdGF0aWM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bSA9IHN5bV9sb29rdXAoJnN5bXRhYiwgbHRhYi5saW1pdC0+YWRkcik7Ci0JICBsdGFiLmxpbWl0LT5pc19zdGF0aWMgPSBzeW0tPmlzX3N0YXRpYzsKLQl9Ci0KLSAgICAgIHByZXYgPSBsdGFiLmxpbWl0OwotCi0gICAgICAvKgotICAgICAgICogSWYgd2Ugc2VlICJtYWluIiB3aXRob3V0IGFuIGluaXRpYWwgJ18nLCB3ZSBhc3N1bWUgbmFtZXMKLSAgICAgICAqIGFyZSAqbm90KiBwcmVmaXhlZCBieSAnXycuCi0gICAgICAgKi8KLSAgICAgIGlmIChsdGFiLmxpbWl0LT5uYW1lWzBdID09ICdtJyAmJiBkaXNjYXJkX3VuZGVyc2NvcmVzCi0JICAmJiBzdHJjbXAgKGx0YWIubGltaXQtPm5hbWUsICJtYWluIikgPT0gMCkKLQl7Ci0JICBkaXNjYXJkX3VuZGVyc2NvcmVzID0gMDsKLQl9Ci0KLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9jcmVhdGVfbGluZV9zeW1zXSAlZCAlcyAweCVseFxuIiwKLQkJCSAgICAgIGx0YWIubGltaXQgLSBsdGFiLmJhc2UsIGx0YWIubGltaXQtPm5hbWUsCi0JCQkgICAgICAodW5zaWduZWQgbG9uZykgbHRhYi5saW1pdC0+YWRkcikpOwotICAgICAgKytsdGFiLmxpbWl0OwotICAgIH0KLQotICAvKiB1cGRhdGUgc2VudGluZWxzOiAqLwotCi0gIHNlbnRpbmVsID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgMCk7Ci0gIGlmIChzdHJjbXAgKHNlbnRpbmVsLT5uYW1lLCAiPGxvY29yZT4iKSA9PSAwCi0gICAgICAmJiBtaW5fdm1hIDw9IHNlbnRpbmVsLT5lbmRfYWRkcikKLSAgICB7Ci0gICAgICBzZW50aW5lbC0+ZW5kX2FkZHIgPSBtaW5fdm1hIC0gMTsKLSAgICB9Ci0KLSAgc2VudGluZWwgPSBzeW1fbG9va3VwICgmc3ltdGFiLCB+MCk7Ci0gIGlmIChzdHJjbXAgKHNlbnRpbmVsLT5uYW1lLCAiPGhpY29yZT4iKSA9PSAwICYmIG1heF92bWEgPj0gc2VudGluZWwtPmFkZHIpCi0gICAgewotICAgICAgc2VudGluZWwtPmFkZHIgPSBtYXhfdm1hICsgMTsKLSAgICB9Ci0KLSAgLyogY29weSBpbiBmdW5jdGlvbiBzeW1ib2xzOiAqLwotICBtZW1jcHkgKGx0YWIubGltaXQsIHN5bXRhYi5iYXNlLCBzeW10YWIubGVuICogc2l6ZW9mIChTeW0pKTsKLSAgbHRhYi5saW1pdCArPSBzeW10YWIubGVuOwotCi0gIGlmICgodW5zaWduZWQgaW50KSAobHRhYi5saW1pdCAtIGx0YWIuYmFzZSkgIT0gbHRhYi5sZW4pCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICBfKCIlczogc29tZWJvZHkgbWlzY291bnRlZDogbHRhYi5sZW49JWQgaW5zdGVhZCBvZiAlbGRcbiIpLAotCSAgICAgICB3aG9hbWksIGx0YWIubGVuLCAobG9uZykgKGx0YWIubGltaXQgLSBsdGFiLmJhc2UpKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBmaW5hbGl6ZSBsdGFiIGFuZCBtYWtlIGl0IHN5bWJvbCB0YWJsZTogKi8KLQotICBzeW10YWJfZmluYWxpemUgKCZsdGFiKTsKLSAgZnJlZSAoc3ltdGFiLmJhc2UpOwotICBzeW10YWIgPSBsdGFiOwotCi19CmRpZmYgLS1naXQgYS9ncHJvZi9jb3JlZmlsZS5oIGIvZ3Byb2YvY29yZWZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5NmY4NS4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb3JlZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotI2lmbmRlZiBjb3JlZmlsZV9oCi0jZGVmaW5lIGNvcmVmaWxlX2gKLQotI2luY2x1ZGUgImJmZC5oIgotCi1leHRlcm4gYmZkICpjb3JlX2JmZDsJCS8qIGJmZCBmb3IgY29yZS1maWxlICovCi1leHRlcm4gaW50IGNvcmVfbnVtX3N5bXM7CS8qICMgb2YgZW50cmllcyBpbiBzeW1ib2wtdGFibGUgKi8KLWV4dGVybiBhc3ltYm9sICoqY29yZV9zeW1zOwkvKiBzeW1ib2wgdGFibGUgaW4gYS5vdXQgKi8KLWV4dGVybiBhc2VjdGlvbiAqY29yZV90ZXh0X3NlY3Q7CS8qIGNvcmUgdGV4dCBzZWN0aW9uICovCi1leHRlcm4gUFRSIGNvcmVfdGV4dF9zcGFjZTsJLyogdGV4dCBzcGFjZSBvZiBhLm91dCBpbiBjb3JlICovCi0KLWV4dGVybiBpbnQgbWluX2luc25fc2l6ZTsJLyogc2l6ZSBvZiBzbWFsbGVzdCBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMgKi8KLWV4dGVybiBpbnQgb2Zmc2V0X3RvX2NvZGU7CS8qIG9mZnNldCAoaW4gYnl0ZXMpIG9mIGNvZGUgZnJvbSBlbnRyeQotCQkJCSAgIGFkZHJlc3Mgb2Ygcm91dGluZSAqLwotCi1leHRlcm4gdm9pZCBjb3JlX2luaXQgUEFSQU1TICgoY29uc3QgY2hhciAqYV9vdXRfbmFtZSkpOwotZXh0ZXJuIHZvaWQgY29yZV9nZXRfdGV4dF9zcGFjZSBQQVJBTVMgKChiZmQgKiBjb3JlX2JmZCkpOwotZXh0ZXJuIHZvaWQgY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyBQQVJBTVMgKChiZmQgKiBjb3JlX2JmZCkpOwotZXh0ZXJuIHZvaWQgY29yZV9jcmVhdGVfbGluZV9zeW1zIFBBUkFNUyAoKGJmZCAqIGNvcmVfYmZkKSk7Ci0KLSNlbmRpZiAvKiBjb3JlZmlsZV9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9mbGF0X2JsLm0gYi9ncHJvZi9mbGF0X2JsLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjg3MWEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZmxhdF9ibC5tCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCi0gJSAgICAgICAgIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUgb2YgdGhlCi10aW1lICAgICAgIHByb2dyYW0gdXNlZCBieSB0aGlzIGZ1bmN0aW9uLgotCi1jdW11bGF0aXZlIGEgcnVubmluZyBzdW0gb2YgdGhlIG51bWJlciBvZiBzZWNvbmRzIGFjY291bnRlZAotIHNlY29uZHMgICBmb3IgYnkgdGhpcyBmdW5jdGlvbiBhbmQgdGhvc2UgbGlzdGVkIGFib3ZlIGl0LgotCi0gc2VsZiAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhY2NvdW50ZWQgZm9yIGJ5IHRoaXMKLXNlY29uZHMgICAgZnVuY3Rpb24gYWxvbmUuICBUaGlzIGlzIHRoZSBtYWpvciBzb3J0IGZvciB0aGlzCi0gICAgICAgICAgIGxpc3RpbmcuCi0KLWNhbGxzICAgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdhcyBpbnZva2VkLCBpZgotICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLCBlbHNlIGJsYW5rLgotIAotIHNlbGYgICAgICB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKLW1zL2NhbGwgICAgZnVuY3Rpb24gcGVyIGNhbGwsIGlmIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQsCi0JICAgZWxzZSBibGFuay4KLQotIHRvdGFsICAgICB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKLW1zL2NhbGwgICAgZnVuY3Rpb24gYW5kIGl0cyBkZXNjZW5kZW50cyBwZXIgY2FsbCwgaWYgdGhpcyAKLQkgICBmdW5jdGlvbiBpcyBwcm9maWxlZCwgZWxzZSBibGFuay4KLQotbmFtZSAgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBtaW5vciBzb3J0Ci0gICAgICAgICAgIGZvciB0aGlzIGxpc3RpbmcuIFRoZSBpbmRleCBzaG93cyB0aGUgbG9jYXRpb24gb2YKLQkgICB0aGUgZnVuY3Rpb24gaW4gdGhlIGdwcm9mIGxpc3RpbmcuIElmIHRoZSBpbmRleCBpcwotCSAgIGluIHBhcmVudGhlc2lzIGl0IHNob3dzIHdoZXJlIGl0IHdvdWxkIGFwcGVhciBpbgotCSAgIHRoZSBncHJvZiBsaXN0aW5nIGlmIGl0IHdlcmUgdG8gYmUgcHJpbnRlZC4KZGlmZiAtLWdpdCBhL2dwcm9mL2ZzZl9jYWxsZ19ibC5tIGIvZ3Byb2YvZnNmX2NhbGxnX2JsLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMTY4MjEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZnNmX2NhbGxnX2JsLm0KKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0KLSBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgY2FsbCB0cmVlIG9mIHRoZSBwcm9ncmFtLCBhbmQgd2FzIHNvcnRlZCBieQotIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uIGFuZCBpdHMgY2hpbGRyZW4uCi0KLSBFYWNoIGVudHJ5IGluIHRoaXMgdGFibGUgY29uc2lzdHMgb2Ygc2V2ZXJhbCBsaW5lcy4gIFRoZSBsaW5lIHdpdGggdGhlCi0gaW5kZXggbnVtYmVyIGF0IHRoZSBsZWZ0IGhhbmQgbWFyZ2luIGxpc3RzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgotIFRoZSBsaW5lcyBhYm92ZSBpdCBsaXN0IHRoZSBmdW5jdGlvbnMgdGhhdCBjYWxsZWQgdGhpcyBmdW5jdGlvbiwKLSBhbmQgdGhlIGxpbmVzIGJlbG93IGl0IGxpc3QgdGhlIGZ1bmN0aW9ucyB0aGlzIG9uZSBjYWxsZWQuCi0gVGhpcyBsaW5lIGxpc3RzOgotICAgICBpbmRleAlBIHVuaXF1ZSBudW1iZXIgZ2l2ZW4gdG8gZWFjaCBlbGVtZW50IG9mIHRoZSB0YWJsZS4KLQkJSW5kZXggbnVtYmVycyBhcmUgc29ydGVkIG51bWVyaWNhbGx5LgotCQlUaGUgaW5kZXggbnVtYmVyIGlzIHByaW50ZWQgbmV4dCB0byBldmVyeSBmdW5jdGlvbiBuYW1lIHNvCi0JCWl0IGlzIGVhc2llciB0byBsb29rIHVwIHdoZXJlIHRoZSBmdW5jdGlvbiBpbiB0aGUgdGFibGUuCi0KLSAgICAgJSB0aW1lCVRoaXMgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGB0b3RhbCcgdGltZSB0aGF0IHdhcyBzcGVudAotCQlpbiB0aGlzIGZ1bmN0aW9uIGFuZCBpdHMgY2hpbGRyZW4uICBOb3RlIHRoYXQgZHVlIHRvCi0JCWRpZmZlcmVudCB2aWV3cG9pbnRzLCBmdW5jdGlvbnMgZXhjbHVkZWQgYnkgb3B0aW9ucywgZXRjLAotCQl0aGVzZSBudW1iZXJzIHdpbGwgTk9UIGFkZCB1cCB0byAxMDAlLgotCi0gICAgIHNlbGYJVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gdGhpcyBmdW5jdGlvbi4KLQotICAgICBjaGlsZHJlbglUaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBwcm9wYWdhdGVkIGludG8gdGhpcwotCQlmdW5jdGlvbiBieSBpdHMgY2hpbGRyZW4uCi0KLSAgICAgY2FsbGVkCVRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4KLQkJSWYgdGhlIGZ1bmN0aW9uIGNhbGxlZCBpdHNlbGYgcmVjdXJzaXZlbHksIHRoZSBudW1iZXIKLQkJb25seSBpbmNsdWRlcyBub24tcmVjdXJzaXZlIGNhbGxzLCBhbmQgaXMgZm9sbG93ZWQgYnkKLQkJYSBgKycgYW5kIHRoZSBudW1iZXIgb2YgcmVjdXJzaXZlIGNhbGxzLgotCi0gICAgIG5hbWUJVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUgaW5kZXggbnVtYmVyIGlzCi0JCXByaW50ZWQgYWZ0ZXIgaXQuICBJZiB0aGUgZnVuY3Rpb24gaXMgYSBtZW1iZXIgb2YgYQotCQljeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcyBwcmludGVkIGJldHdlZW4gdGhlCi0JCWZ1bmN0aW9uJ3MgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLQotCi0gRm9yIHRoZSBmdW5jdGlvbidzIHBhcmVudHMsIHRoZSBmaWVsZHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgotCi0gICAgIHNlbGYJVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBkaXJlY3RseQotCQlmcm9tIHRoZSBmdW5jdGlvbiBpbnRvIHRoaXMgcGFyZW50LgotCi0gICAgIGNoaWxkcmVuCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZnJvbQotCQl0aGUgZnVuY3Rpb24ncyBjaGlsZHJlbiBpbnRvIHRoaXMgcGFyZW50LgotCi0gICAgIGNhbGxlZAlUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBwYXJlbnQgY2FsbGVkIHRoZQotCQlmdW5jdGlvbiBgLycgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24KLQkJd2FzIGNhbGxlZC4gIFJlY3Vyc2l2ZSBjYWxscyB0byB0aGUgZnVuY3Rpb24gYXJlIG5vdAotCQlpbmNsdWRlZCBpbiB0aGUgbnVtYmVyIGFmdGVyIHRoZSBgLycuCi0KLSAgICAgbmFtZQlUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQuICBUaGUgcGFyZW50J3MgaW5kZXgKLQkJbnVtYmVyIGlzIHByaW50ZWQgYWZ0ZXIgaXQuICBJZiB0aGUgcGFyZW50IGlzIGEKLQkJbWVtYmVyIG9mIGEgY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMgcHJpbnRlZCBiZXR3ZWVuCi0JCXRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotCi0gSWYgdGhlIHBhcmVudHMgb2YgdGhlIGZ1bmN0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCB0aGUgd29yZAotIGA8c3BvbnRhbmVvdXM+JyBpcyBwcmludGVkIGluIHRoZSBgbmFtZScgZmllbGQsIGFuZCBhbGwgdGhlIG90aGVyCi0gZmllbGRzIGFyZSBibGFuay4KLQotIEZvciB0aGUgZnVuY3Rpb24ncyBjaGlsZHJlbiwgdGhlIGZpZWxkcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6Ci0KLSAgICAgc2VsZglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGRpcmVjdGx5Ci0JCWZyb20gdGhlIGNoaWxkIGludG8gdGhlIGZ1bmN0aW9uLgotCi0gICAgIGNoaWxkcmVuCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZnJvbSB0aGUKLQkJY2hpbGQncyBjaGlsZHJlbiB0byB0aGUgZnVuY3Rpb24uCi0KLSAgICAgY2FsbGVkCVRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gY2FsbGVkCi0JCXRoaXMgY2hpbGQgYC8nIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGNoaWxkCi0JCXdhcyBjYWxsZWQuICBSZWN1cnNpdmUgY2FsbHMgYnkgdGhlIGNoaWxkIGFyZSBub3QKLQkJbGlzdGVkIGluIHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGAvJy4KLQotICAgICBuYW1lCVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNoaWxkLiAgVGhlIGNoaWxkJ3MgaW5kZXgKLQkJbnVtYmVyIGlzIHByaW50ZWQgYWZ0ZXIgaXQuICBJZiB0aGUgY2hpbGQgaXMgYQotCQltZW1iZXIgb2YgYSBjeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcyBwcmludGVkCi0JCWJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi0KLSBJZiB0aGVyZSBhcmUgYW55IGN5Y2xlcyAoY2lyY2xlcykgaW4gdGhlIGNhbGwgZ3JhcGgsIHRoZXJlIGlzIGFuCi0gZW50cnkgZm9yIHRoZSBjeWNsZS1hcy1hLXdob2xlLiAgVGhpcyBlbnRyeSBzaG93cyB3aG8gY2FsbGVkIHRoZQotIGN5Y2xlIChhcyBwYXJlbnRzKSBhbmQgdGhlIG1lbWJlcnMgb2YgdGhlIGN5Y2xlIChhcyBjaGlsZHJlbi4pCi0gVGhlIGArJyByZWN1cnNpdmUgY2FsbHMgZW50cnkgc2hvd3MgdGhlIG51bWJlciBvZiBmdW5jdGlvbiBjYWxscyB0aGF0Ci0gd2VyZSBpbnRlcm5hbCB0byB0aGUgY3ljbGUsIGFuZCB0aGUgY2FsbHMgZW50cnkgZm9yIGVhY2ggbWVtYmVyIHNob3dzLAotIGZvciB0aGF0IG1lbWJlciwgaG93IG1hbnkgdGltZXMgaXQgd2FzIGNhbGxlZCBmcm9tIG90aGVyIG1lbWJlcnMgb2YKLSB0aGUgY3ljbGUuCi0KZGlmZiAtLWdpdCBhL2dwcm9mL2djb25maWcuaW4gYi9ncHJvZi9nY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDdlOGUwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2djb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogZ2NvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KZGlmZiAtLWdpdCBhL2dwcm9mL2dlbi1jLXByb2cuYXdrIGIvZ3Byb2YvZ2VuLWMtcHJvZy5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWMxZjguLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ2VuLWMtcHJvZy5hd2sKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1OUiA9PSAxCXsKLSAgICBGUz0iXCIiOwotICAgIHByaW50ICIvKiA9PT4gRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhISAgSXQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IgotICAgIHByaW50ZiAiICAgZnJvbSAlcyB1c2luZyB0aGUgZ2VuLWMtcHJvZy5hd2sgc2NyaXB0LiAgPD09ICovXG5cbiIsIEZJTEUKLSAgICBwcmludCAiI2luY2x1ZGUgPHN0ZGlvLmg+IgotfQotCi0JewotCSAgaWYgKGN1cmZ1biAhPSBGVU5DVElPTikKLQkgICAgewotCSAgICAgIGlmIChjdXJmdW4pCi0JCXByaW50ICJ9IgotCSAgICAgIGN1cmZ1biA9IEZVTkNUSU9OCi0JICAgICAgcHJpbnQgIiIKLQkgICAgICBwcmludCAidm9pZCI7Ci0JICAgICAgcHJpbnRmICIlcyAoZmlsZSlcbiIsIEZVTkNUSU9OCi0JICAgICAgcHJpbnQgIiAgICAgRklMRSAqZmlsZTsiOwotCSAgICAgIHByaW50ICJ7IjsKLQkgICAgfQotCSAgcHJpbnRmICIgIGZwdXRzIChcIiI7Ci0JICBmb3IgKGkgPSAxOyBpIDwgTkY7IGkrKykKLQkgICAgcHJpbnRmICIlc1xcXCIiLCAkaTsKLQkgIHByaW50ZiAiJXNcXG5cIiwgZmlsZSk7XG4iLCAkTkY7Ci19Ci0KLUVORAl7IHByaW50ICJ9IiB9CmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uLmggYi9ncHJvZi9nbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MWZhNGQuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICoJQCgjKWdtb24uaAk1LjIgKEJlcmtlbGV5KSA1LzYvOTEKLSAqLwotI2lmbmRlZiBnbW9uX2gKLSNkZWZpbmUgZ21vbl9oCi0KLXN0cnVjdCByYXdfcGhkcgotICB7Ci0gICAgLyogRklYTUU6IENoZWNraW5nIGEgaG9zdCBjb21waWxlciBkZWZpbmUgbWVhbnMgdGhhdCB3ZSBjYW4ndCB1c2UKLSAgICAgICBhIGNyb3NzIGdwcm9mIHRvIHRoZSBhbHBoYS4gICovCi0jaWZkZWYgX19hbHBoYV9fCi0gICAgY2hhciBsb3dfcGNbOF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1s4XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0jZWxzZQotICAgIGNoYXIgbG93X3BjWzRdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbNF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotI2VuZGlmCi0gICAgY2hhciBuY250WzRdOwkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyIChwbHVzIHRoaXMgaGVhZGVyKSAqLwotCi0gICAgY2hhciB2ZXJzaW9uWzRdOwkJLyogdmVyc2lvbiBudW1iZXIgKi8KLSAgICBjaGFyIHByb2ZyYXRlWzRdOwkJLyogcHJvZmlsaW5nIGNsb2NrIHJhdGUgKi8KLSAgICBjaGFyIHNwYXJlWzMqNF07CQkvKiByZXNlcnZlZCAqLwotICB9OwotCi0jZGVmaW5lIEdNT05WRVJTSU9OICAgICAweDAwMDUxODc5Ci0KLXN0cnVjdCBvbGRfcmF3X3BoZHIKLSAgewotICAgIC8qIEZJWE1FOiBDaGVja2luZyBhIGhvc3QgY29tcGlsZXIgZGVmaW5lIG1lYW5zIHRoYXQgd2UgY2FuJ3QgdXNlCi0gICAgICAgYSBjcm9zcyBncHJvZiB0byB0aGUgYWxwaGEuICAqLwotI2lmZGVmIF9fYWxwaGFfXwotICAgIGNoYXIgbG93X3BjWzhdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbOF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotI2Vsc2UKLSAgICBjaGFyIGxvd19wY1s0XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzRdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbmRpZgotICAgIGNoYXIgbmNudFs0XTsJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAocGx1cyB0aGlzIGhlYWRlcikgKi8KLQotICAgIC8qIEZJWE1FOiBDaGVja2luZyBob3N0IGNvbXBpbGVyIGRlZmluZXMgaGVyZSBtZWFucyB0aGF0IHdlIGNhbid0Ci0gICAgICAgdXNlIGEgY3Jvc3MgZ3Byb2YgYWxwaGEgT1NGLiAgKi8KLSNpZiBkZWZpbmVkIChfX2FscGhhX18pICYmIGRlZmluZWQgKF9fb3NmX18pCi0gICAgLyoKLSAgICAgKiBERUMncyBPU0YgdjMuMCB1c2VzIDQgYnl0ZXMgb2YgcGFkZGluZyB0byBicmluZyB0aGUgaGVhZGVyIHRvCi0gICAgICogYSBzaXplIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiA4LgotICAgICAqLwotICAgIGNoYXIgcGFkWzRdOwotI2VuZGlmCi0gIH07Ci0KLS8qCi0gKiBIaXN0b2dyYW0gY291bnRlcnMgYXJlIHVuc2lnbmVkIHNob3J0czoKLSAqLwotI2RlZmluZQlISVNUQ09VTlRFUiB1bnNpZ25lZCBzaG9ydAotCi0vKgotICogRnJhY3Rpb24gb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgaGlzdG9ncmFtIGNvdW50ZXJzIGhlcmUsIDEvMjoKLSAqLwotI2RlZmluZQlISVNURlJBQ1RJT04JMgotCi0vKgotICogRnJhY3Rpb24gb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgZnJvbSBoYXNoIGJ1Y2tldHMuICBUaGUKLSAqIHZhbHVlIG9mIEhBU0hGUkFDVElPTiBpcyBiYXNlZCBvbiB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgb2YKLSAqIHNlcGFyYXRpb24gYmV0d2VlbiB0d28gc3Vicm91dGluZSBjYWxsIHBvaW50cyBpbiB0aGUgb2JqZWN0IGNvZGUuCi0gKiBHaXZlbiBNSU5fU1VCUl9TRVBBUkFUSU9OIGJ5dGVzIG9mIHNlcGFyYXRpb24gdGhlIHZhbHVlIG9mCi0gKiBIQVNIRlJBQ1RJT04gaXMgY2FsY3VsYXRlZCBhczoKLSAqCi0gKiAgICAgIEhBU0hGUkFDVElPTiA9IE1JTl9TVUJSX1NFUEFSQVRJT04gLyAoMiAqIHNpemVvZihzaG9ydCkgLSAxKTsKLSAqCi0gKiBGb3IgdGhlIFZBWCwgdGhlIHNob3J0ZXN0IHR3byBjYWxsIHNlcXVlbmNlIGlzOgotICoKLSAqICAgICAgY2FsbHMgICAkMCwocjApCi0gKiAgICAgIGNhbGxzICAgJDAsKHIwKQotICoKLSAqIHdoaWNoIGlzIHNlcGFyYXRlZCBieSBvbmx5IHRocmVlIGJ5dGVzLCB0aHVzIEhBU0hGUkFDVElPTiBpcyAKLSAqIGNhbGN1bGF0ZWQgYXM6Ci0gKgotICogICAgICBIQVNIRlJBQ1RJT04gPSAzIC8gKDIgKiAyIC0gMSkgPSAxCi0gKgotICogTm90ZSB0aGF0IHRoZSBkaXZpc2lvbiBhYm92ZSByb3VuZHMgZG93biwgdGh1cyBpZiBNSU5fU1VCUl9GUkFDVElPTgotICogaXMgbGVzcyB0aGFuIHRocmVlLCB0aGlzIGFsZ29yaXRobSB3aWxsIG5vdCB3b3JrIQotICovCi0jZGVmaW5lCUhBU0hGUkFDVElPTiAxCi0KLS8qCi0gKiBQZXJjZW50IG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIHRvc3RydWN0cyB3aXRoIGEgbWluaW11bToKLSAqLwotI2RlZmluZSBBUkNERU5TSVRZCTIKLSNkZWZpbmUgTUlOQVJDUwkJNTAKLQotc3RydWN0IHRvc3RydWN0Ci0gIHsKLSAgICBjaGFyICpzZWxmcGM7Ci0gICAgaW50IGNvdW50OwotICAgIHVuc2lnbmVkIHNob3J0IGxpbms7Ci0gIH07Ci0KLS8qCi0gKiBBIHJhdyBhcmMsIHdpdGggcG9pbnRlcnMgdG8gdGhlIGNhbGxpbmcgc2l0ZSBhbmQgdGhlIGNhbGxlZCBzaXRlCi0gKiBhbmQgYSBjb3VudC4gIEV2ZXJ5dGhpbmcgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBjaGFyYWN0ZXJzIHNvCi0gKiBhcyB0byBnZXQgYSBwYWNrZWQgcmVwcmVzZW50YXRpb24gKG90aGVyd2lzZSwgZGlmZmVyZW50IGNvbXBpbGVycwotICogbWlnaHQgaW50cm9kdWNlIGRpZmZlcmVudCBwYWRkaW5nKToKLSAqLwotc3RydWN0IHJhd19hcmMKLSAgewotICAgIC8qIEZJWE1FOiBDaGVja2luZyBhIGhvc3QgY29tcGlsZXIgZGVmaW5lIG1lYW5zIHRoYXQgd2UgY2FuJ3QgdXNlCi0gICAgICAgYSBjcm9zcyBncHJvZiB0byB0aGUgYWxwaGEuICAqLwotI2lmZGVmIF9fYWxwaGFfXwotICAgIGNoYXIgZnJvbV9wY1s4XTsKLSAgICBjaGFyIHNlbGZfcGNbOF07Ci0gICAgY2hhciBjb3VudFs4XTsKLSNlbHNlCi0gICAgY2hhciBmcm9tX3BjWzRdOwotICAgIGNoYXIgc2VsZl9wY1s0XTsKLSAgICBjaGFyIGNvdW50WzRdOwotI2VuZGlmCi0gIH07Ci0KLS8qCi0gKiBHZW5lcmFsIHJvdW5kaW5nIGZ1bmN0aW9uczoKLSAqLwotI2RlZmluZSBST1VORERPV04oeCx5KQkoKCh4KS8oeSkpKih5KSkKLSNkZWZpbmUgUk9VTkRVUCh4LHkpCSgoKCh4KSsoeSktMSkvKHkpKSooeSkpCi0KLSNlbmRpZiAvKiBnbW9uX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dtb25faW8uYyBiL2dwcm9mL2dtb25faW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3MzIzYy4uMDAwMDAwMAotLS0gYS9ncHJvZi9nbW9uX2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoKLSAqIElucHV0IGFuZCBvdXRwdXQgZnJvbS90byBnbW9uLm91dCBmaWxlcy4KLSAqLwotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJiYXNpY19ibG9ja3MuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImNhbGxfZ3JhcGguaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLSNpbmNsdWRlICJnbW9uLmgiCQkvKiBmZXRjaCBoZWFkZXIgZm9yIG9sZCBmb3JtYXQgKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImhlcnR6LmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1pbnQgZ21vbl9pbnB1dCA9IDA7Ci1pbnQgZ21vbl9maWxlX3ZlcnNpb24gPSAwOwkvKiAwID09IG9sZCAobm9uLXZlcnNpb25lZCkgZmlsZSBmb3JtYXQgKi8KLQotLyoKLSAqIFRoaXMgcHJvYmFibHkgb3VnaHQgdG8gYmUgaW4gbGliYmZkLgotICovCi1iZmRfdm1hCi1ERUZVTiAoZ2V0X3ZtYSwgKGFiZmQsIGFkZHIpLCBiZmQgKiBhYmZkIEFORCBiZmRfYnl0ZSAqIGFkZHIpCi17Ci0gIHN3aXRjaCAoc2l6ZW9mIChjaGFyKikpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gYmZkX2dldF82NCAoYWJmZCwgYWRkcik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF92bWEgaGFzIHVuZXhwZWN0ZWQgc2l6ZSBvZiAlbGQgYnl0ZXNcbiIpLAotCSAgICAgICB3aG9hbWksIChsb25nKSBzaXplb2YgKGNoYXIqKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFRoaXMgcHJvYmFibHkgb3VnaHQgdG8gYmUgaW4gbGliYmZkLgotICovCi12b2lkCi1ERUZVTiAocHV0X3ZtYSwgKGFiZmQsIHZhbCwgYWRkciksIGJmZCAqIGFiZmQgQU5EIGJmZF92bWEgdmFsIEFORCBiZmRfYnl0ZSAqIGFkZHIpCi17Ci0gIHN3aXRjaCAoc2l6ZW9mIChjaGFyKikpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgYWRkcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBiZmRfcHV0XzY0IChhYmZkLCB2YWwsIGFkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF92bWEgaGFzIHVuZXhwZWN0ZWQgc2l6ZSBvZiAlbGQgYnl0ZXNcbiIpLAotCSAgICAgICB3aG9hbWksIChsb25nKSBzaXplb2YgKGNoYXIqKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci19Ci0KLQotdm9pZAotREVGVU4gKGdtb25fb3V0X3JlYWQsIChmaWxlbmFtZSksIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBGSUxFICppZnA7Ci0gIHN0cnVjdCBnbW9uX2hkciBnaGRyOwotICB1bnNpZ25lZCBjaGFyIHRhZzsKLSAgaW50IG5oaXN0ID0gMCwgbmFyY3MgPSAwLCBuYmJzID0gMDsKLQotICAvKiBvcGVuIGdtb24ub3V0IGZpbGU6ICovCi0KLSAgaWYgKHN0cmNtcCAoZmlsZW5hbWUsICItIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZnAgPSBzdGRpbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZnAgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1JCKTsKLSAgICAgIGlmICghaWZwKQotCXsKLQkgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgIH0KLSAgaWYgKGZyZWFkICgmZ2hkciwgc2l6ZW9mIChzdHJ1Y3QgZ21vbl9oZHIpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSB0b28gc2hvcnQgdG8gYmUgYSBnbW9uIGZpbGVcbiIpLAotCSAgICAgICBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKChmaWxlX2Zvcm1hdCA9PSBGRl9NQUdJQykgfHwKLSAgICAgIChmaWxlX2Zvcm1hdCA9PSBGRl9BVVRPICYmICFzdHJuY21wICgmZ2hkci5jb29raWVbMF0sIEdNT05fTUFHSUMsIDQpKSkKLSAgICB7Ci0gICAgICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMgJiYgc3RybmNtcCAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIpLAotCQkgICB3aG9hbWksIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogcmlnaHQgbWFnaWMsIHNvIGl0J3MgcHJvYmFibHkgcmVhbGx5IGEgbmV3IGdtb24ub3V0IGZpbGUgKi8KLQotICAgICAgZ21vbl9maWxlX3ZlcnNpb24gPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGdoZHIudmVyc2lvbik7Ci0gICAgICBpZiAoZ21vbl9maWxlX3ZlcnNpb24gIT0gR01PTl9WRVJTSU9OICYmIGdtb25fZmlsZV92ZXJzaW9uICE9IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCIlczogZmlsZSBgJXMnIGhhcyB1bnN1cHBvcnRlZCB2ZXJzaW9uICVkXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSwgZ21vbl9maWxlX3ZlcnNpb24pOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiByZWFkIGluIGFsbCB0aGUgcmVjb3JkczogKi8KLSAgICAgIHdoaWxlIChmcmVhZCAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBpZnApID09IDEpCi0JewotCSAgc3dpdGNoICh0YWcpCi0JICAgIHsKLQkgICAgY2FzZSBHTU9OX1RBR19USU1FX0hJU1Q6Ci0JICAgICAgKytuaGlzdDsKLQkgICAgICBnbW9uX2lucHV0IHw9IElOUFVUX0hJU1RPR1JBTTsKLQkgICAgICBoaXN0X3JlYWRfcmVjIChpZnAsIGZpbGVuYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEdNT05fVEFHX0NHX0FSQzoKLQkgICAgICArK25hcmNzOwotCSAgICAgIGdtb25faW5wdXQgfD0gSU5QVVRfQ0FMTF9HUkFQSDsKLQkgICAgICBjZ19yZWFkX3JlYyAoaWZwLCBmaWxlbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBHTU9OX1RBR19CQl9DT1VOVDoKLQkgICAgICArK25iYnM7Ci0JICAgICAgZ21vbl9pbnB1dCB8PSBJTlBVVF9CQl9DT1VOVFM7Ci0JICAgICAgYmJfcmVhZF9yZWMgKGlmcCwgZmlsZW5hbWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6ICVzOiBmb3VuZCBiYWQgdGFnICVkIChmaWxlIGNvcnJ1cHRlZD8pXG4iKSwKLQkJICAgICAgIHdob2FtaSwgZmlsZW5hbWUsIHRhZyk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9BVVRPCi0JICAgfHwgZmlsZV9mb3JtYXQgPT0gRkZfQlNECi0JICAgfHwgZmlsZV9mb3JtYXQgPT0gRkZfQlNENDQpCi0gICAgewotICAgICAgc3RydWN0IGhkcgotICAgICAgewotCWJmZF92bWEgbG93X3BjOwotCWJmZF92bWEgaGlnaF9wYzsKLQlpbnQgbmNudDsKLSAgICAgIH07Ci0gICAgICBpbnQgaSwgc2FtcF9ieXRlcywgaGVhZGVyX3NpemU7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotICAgICAgYmZkX3ZtYSBmcm9tX3BjLCBzZWxmX3BjOwotICAgICAgc3RydWN0IHJhd19hcmMgcmF3X2FyYzsKLSAgICAgIHN0cnVjdCByYXdfcGhkciByYXc7Ci0gICAgICBzdGF0aWMgc3RydWN0IGhkciBoOwotICAgICAgVU5JVCByYXdfYmluX2NvdW50OwotICAgICAgc3RydWN0IGhkciB0bXA7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJbmZvcm1hdGlvbiBmcm9tIGEgZ21vbi5vdXQgZmlsZSBpcyBpbiB0d28gcGFydHM6IGFuIGFycmF5IG9mCi0gICAgICAgKiBzYW1wbGluZyBoaXRzIHdpdGhpbiBwYyByYW5nZXMsIGFuZCB0aGUgYXJjcy4KLSAgICAgICAqLwotICAgICAgZ21vbl9pbnB1dCA9IElOUFVUX0hJU1RPR1JBTSB8IElOUFVUX0NBTExfR1JBUEg7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBUaGlzIGZzZWVrKCkgb3VnaHQgdG8gd29yayBldmVuIG9uIHN0ZGluIGFzIGxvbmcgYXMgaXQncwotICAgICAgICogbm90IGFuIGludGVyYWN0aXZlIGRldmljZSAoaGVjaywgaXMgdGhlcmUgYW55Ym9keSB3aG8gd291bGQKLSAgICAgICAqIHdhbnQgdG8gdHlwZSBpbiBhIGdtb24ub3V0IGF0IHRoZSB0ZXJtaW5hbD8pLgotICAgICAgICovCi0gICAgICBpZiAoZnNlZWsgKGlmcCwgMCwgU0VFS19TRVQpIDwgMCkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICAgIGlmIChmcmVhZCAoJnJhdywgMSwgc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpLCBpZnApCi0JICAhPSBzaXplb2YgKHN0cnVjdCByYXdfcGhkcikpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSB0b28gc2hvcnQgdG8gYmUgYSBnbW9uIGZpbGVcbiIpLAotCQkgICBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgICB0bXAubG93X3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3Lmxvd19wY1swXSk7Ci0gICAgICB0bXAuaGlnaF9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5oaWdoX3BjWzBdKTsKLSAgICAgIHRtcC5uY250ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3Lm5jbnRbMF0pOwotCi0gICAgICBpZiAoYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3LnZlcnNpb25bMF0pCi0JICA9PSBHTU9OVkVSU0lPTikKLQl7Ci0JICBpbnQgcHJvZnJhdGU7Ci0KLQkgIC8qIDQuNEJTRCBmb3JtYXQgaGVhZGVyLiAgKi8KLQotCSAgcHJvZnJhdGUgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcucHJvZnJhdGVbMF0pOwotCSAgaWYgKCFzX2hpZ2hwYykKLQkgICAgaHogPSBwcm9mcmF0ZTsKLQkgIGVsc2UgaWYgKGh6ICE9IHByb2ZyYXRlKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IHByb2ZpbGluZyByYXRlIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIiksCi0JCSAgICAgICBmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQotCSAgaGVhZGVyX3NpemUgPSBzaXplb2YgKHN0cnVjdCByYXdfcGhkcik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG9sZCBzdHlsZSBCU0QgZm9ybWF0LiAgKi8KLQkgIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9CU0Q0NCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgYCVzJyBoYXMgYmFkIG1hZ2ljIGNvb2tpZVxuIiksCi0JCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCi0JICBpZiAoZnNlZWsgKGlmcCwgc2l6ZW9mIChzdHJ1Y3Qgb2xkX3Jhd19waGRyKSwgU0VFS19TRVQpIDwgMCkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0KLQkgIGhlYWRlcl9zaXplID0gc2l6ZW9mIChzdHJ1Y3Qgb2xkX3Jhd19waGRyKTsKLQl9Ci0KLSAgICAgIGlmIChzX2hpZ2hwYyAmJiAodG1wLmxvd19wYyAhPSBoLmxvd19wYyB8fAotCQkgICAgICAgdG1wLmhpZ2hfcGMgIT0gaC5oaWdoX3BjIHx8IHRtcC5uY250ICE9IGgubmNudCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iKSwKLQkJICAgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgaCA9IHRtcDsKLSAgICAgIHNfbG93cGMgPSAoYmZkX3ZtYSkgaC5sb3dfcGM7Ci0gICAgICBzX2hpZ2hwYyA9IChiZmRfdm1hKSBoLmhpZ2hfcGM7Ci0gICAgICBsb3dwYyA9IChiZmRfdm1hKSBoLmxvd19wYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBoaWdocGMgPSAoYmZkX3ZtYSkgaC5oaWdoX3BjIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIHNhbXBfYnl0ZXMgPSBoLm5jbnQgLSBoZWFkZXJfc2l6ZTsKLSAgICAgIGhpc3RfbnVtX2JpbnMgPSBzYW1wX2J5dGVzIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIERCRyAoU0FNUExFREVCVUcsCi0JICAgcHJpbnRmICgiW2dtb25fb3V0X3JlYWRdIGxvd3BjIDB4JWx4IGhpZ2hwYyAweCVseCBuY250ICVkXG4iLAotCQkgICAodW5zaWduZWQgbG9uZykgaC5sb3dfcGMsICh1bnNpZ25lZCBsb25nKSBoLmhpZ2hfcGMsCi0JCSAgIGgubmNudCk7Ci0JICAgcHJpbnRmICgiW2dtb25fb3V0X3JlYWRdICAgc19sb3dwYyAweCVseCAgIHNfaGlnaHBjIDB4JWx4XG4iLAotCQkgICAodW5zaWduZWQgbG9uZykgc19sb3dwYywgKHVuc2lnbmVkIGxvbmcpIHNfaGlnaHBjKTsKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICAgIGxvd3BjIDB4JWx4ICAgICBoaWdocGMgMHglbHhcbiIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSBsb3dwYywgKHVuc2lnbmVkIGxvbmcpIGhpZ2hwYyk7Ci0JICAgcHJpbnRmICgiW2dtb25fb3V0X3JlYWRdIHNhbXBfYnl0ZXMgJWQgaGlzdF9udW1fYmlucyAlZFxuIiwKLQkJICAgc2FtcF9ieXRlcywgaGlzdF9udW1fYmlucykpOwotCi0gICAgICBpZiAoaGlzdF9udW1fYmlucykKLQl7Ci0JICArK25oaXN0OwotCX0KLQotICAgICAgaWYgKCFoaXN0X3NhbXBsZSkKLQl7Ci0JICBoaXN0X3NhbXBsZSA9Ci0JICAgIChpbnQgKikgeG1hbGxvYyAoaGlzdF9udW1fYmlucyAqIHNpemVvZiAoaGlzdF9zYW1wbGVbMF0pKTsKLQkgIG1lbXNldCAoaGlzdF9zYW1wbGUsIDAsIGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0JfQotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9udW1fYmluczsgKytpKQotCXsKLQkgIGlmIChmcmVhZCAocmF3X2Jpbl9jb3VudCwgc2l6ZW9mIChyYXdfYmluX2NvdW50KSwgMSwgaWZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IHVuZXhwZWN0ZWQgRU9GIGFmdGVyIHJlYWRpbmcgJWQvJWQgYmluc1xuIiksCi0JCSAgICAgICB3aG9hbWksIC0taSwgaGlzdF9udW1fYmlucyk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQkgIGhpc3Rfc2FtcGxlW2ldICs9IGJmZF9nZXRfMTYgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgcmF3X2Jpbl9jb3VudCk7Ci0JfQotCi0gICAgICAvKgotICAgICAgICogVGhlIHJlc3Qgb2YgdGhlIGZpbGUgY29uc2lzdHMgb2YgYSBidW5jaCBvZiA8ZnJvbSxzZWxmLGNvdW50PgotICAgICAgICogdHVwbGVzOgotICAgICAgICovCi0gICAgICB3aGlsZSAoZnJlYWQgKCZyYXdfYXJjLCBzaXplb2YgKHJhd19hcmMpLCAxLCBpZnApID09IDEpCi0JewotCSAgKytuYXJjczsKLQkgIGZyb21fcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19hcmMuZnJvbV9wYyk7Ci0JICBzZWxmX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLnNlbGZfcGMpOwotCSAgY291bnQgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19hcmMuY291bnQpOwotCSAgREJHIChTQU1QTEVERUJVRywKLQkgICAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBmcm9tcGMgMHglbHggc2VsZnBjIDB4JWx4IGNvdW50ICVsdVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZykgZnJvbV9wYywgKHVuc2lnbmVkIGxvbmcpIHNlbGZfcGMsIGNvdW50KSk7Ci0JICAvKiBhZGQgdGhpcyBhcmM6ICovCi0JICBjZ190YWxseSAoZnJvbV9wYywgc2VsZl9wYywgY291bnQpOwotCX0KLSAgICAgIGZjbG9zZSAoaWZwKTsKLQotICAgICAgaWYgKGh6ID09IEhaX1dST05HKQotCXsKLQkgIC8qCi0JICAgKiBIb3cgbWFueSB0aWNrcyBwZXIgc2Vjb25kPyAgSWYgd2UgY2FuJ3QgdGVsbCwgcmVwb3J0Ci0JICAgKiB0aW1lIGluIHRpY2tzLgotCSAgICovCi0JICBoeiA9IGhlcnR6ICgpOwotCSAgaWYgKGh6ID09IEhaX1dST05HKQotCSAgICB7Ci0JICAgICAgaHogPSAxOwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygidGltZSBpcyBpbiB0aWNrcywgbm90IHNlY29uZHNcbiIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggZmlsZSBmb3JtYXQgJWRcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVfZm9ybWF0KTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfR01PTl9JTkZPKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiRmlsZSBgJXMnICh2ZXJzaW9uICVkKSBjb250YWluczpcbiIpLAotCSAgICAgIGZpbGVuYW1lLCBnbW9uX2ZpbGVfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIlx0JWQgaGlzdG9ncmFtIHJlY29yZCVzXG4iKSwKLQkgICAgICBuaGlzdCwgbmhpc3QgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIHByaW50ZiAoXygiXHQlZCBjYWxsLWdyYXBoIHJlY29yZCVzXG4iKSwKLQkgICAgICBuYXJjcywgbmFyY3MgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIHByaW50ZiAoXygiXHQlZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmQlc1xuIiksCi0JICAgICAgbmJicywgbmJicyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0gICAgfQotfQotCi0KLXZvaWQKLURFRlVOIChnbW9uX291dF93cml0ZSwgKGZpbGVuYW1lKSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIEZJTEUgKm9mcDsKLSAgc3RydWN0IGdtb25faGRyIGdoZHI7Ci0KLSAgb2ZwID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9XQik7Ci0gIGlmICghb2ZwKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9BVVRPIHx8IGZpbGVfZm9ybWF0ID09IEZGX01BR0lDKQotICAgIHsKLSAgICAgIC8qIHdyaXRlIGdtb24gaGVhZGVyOiAqLwotCi0gICAgICBtZW1jcHkgKCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCk7Ci0gICAgICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgR01PTl9WRVJTSU9OLCAoYmZkX2J5dGUgKikgZ2hkci52ZXJzaW9uKTsKLSAgICAgIGlmIChmd3JpdGUgKCZnaGRyLCBzaXplb2YgKGdoZHIpLCAxLCBvZnApICE9IDEpCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIGV4ZWN1dGlvbiB0aW1lIGhpc3RvZ3JhbSBpZiB3ZSBoYXZlIG9uZTogKi8KLSAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfSElTVE9HUkFNKQotCXsKLQkgIGhpc3Rfd3JpdGVfaGlzdCAob2ZwLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICAvKiB3cml0ZSBjYWxsIGdyYXBoIGFyY3MgaWYgd2UgaGF2ZSBhbnk6ICovCi0gICAgICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0NBTExfR1JBUEgpCi0JewotCSAgY2dfd3JpdGVfYXJjcyAob2ZwLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICAvKiB3cml0ZSBiYXNpYy1ibG9jayBpbmZvIGlmIHdlIGhhdmUgaXQ6ICovCi0gICAgICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0JCX0NPVU5UUykKLQl7Ci0JICBiYl93cml0ZV9ibG9ja3MgKG9mcCwgZmlsZW5hbWUpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0JTRCB8fCBmaWxlX2Zvcm1hdCA9PSBGRl9CU0Q0NCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmF3X2FyYyByYXdfYXJjOwotICAgICAgVU5JVCByYXdfYmluX2NvdW50OwotICAgICAgc3RydWN0IHJhd19waGRyIGg7Ci0gICAgICBpbnQgaTsKLSAgICAgIEFyYyAqYXJjOwotICAgICAgU3ltICpzeW07Ci0KLSAgICAgIG1lbXNldCAoJmgsIDAsIHNpemVvZiBoKTsKLSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBzX2xvd3BjLCAoYmZkX2J5dGUgKikgJmgubG93X3BjKTsKLSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBzX2hpZ2hwYywgKGJmZF9ieXRlICopICZoLmhpZ2hfcGMpOwotICAgICAgYmZkX3B1dF8zMiAoY29yZV9iZmQsCi0JCSAgaGlzdF9udW1fYmlucyAqIHNpemVvZiAoVU5JVCkgKyBzaXplb2YgKHN0cnVjdCByYXdfcGhkciksCi0JCSAgKGJmZF9ieXRlICopICZoLm5jbnQpOwotCi0gICAgICAvKiBXcml0ZSBoZWFkZXIuICBVc2UgbmV3IHN0eWxlIEJTRCBmb3JtYXQgaXMgZXhwbGljaXRseQotICAgICAgICAgc3BlY2lmaWVkLCBvciBpZiB0aGUgcHJvZmlsaW5nIHJhdGUgaXMgbm9uLXN0YW5kYXJkOwotICAgICAgICAgb3RoZXJ3aXNlLCB1c2UgdGhlIG9sZCBCU0QgZm9ybWF0LiAgKi8KLSAgICAgIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9CU0Q0NAotCSAgfHwgaHogIT0gaGVydHogKCkpCi0JewotCSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIEdNT05WRVJTSU9OLCAoYmZkX2J5dGUgKikgJmgudmVyc2lvbik7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgaHosIChiZmRfYnl0ZSAqKSAmaC5wcm9mcmF0ZSk7Ci0JICBpZiAoZndyaXRlICgmaCwgc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZndyaXRlICgmaCwgc2l6ZW9mIChzdHJ1Y3Qgb2xkX3Jhd19waGRyKSwgMSwgb2ZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIGR1bXAgdGhlIHNhbXBsZXM6ICovCi0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0JewotCSAgYmZkX3B1dF8xNiAoY29yZV9iZmQsIGhpc3Rfc2FtcGxlW2ldLCAoYmZkX2J5dGUgKikgJiByYXdfYmluX2NvdW50WzBdKTsKLQkgIGlmIChmd3JpdGUgKCZyYXdfYmluX2NvdW50WzBdLCBzaXplb2YgKHJhd19iaW5fY291bnQpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogZHVtcCB0aGUgbm9ybWFsaXplZCByYXcgYXJjIGluZm9ybWF0aW9uOiAqLwotCi0gICAgICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotCXsKLQkgIGZvciAoYXJjID0gc3ltLT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0JICAgIHsKLQkgICAgICBwdXRfdm1hIChjb3JlX2JmZCwgYXJjLT5wYXJlbnQtPmFkZHIsCi0JCSAgICAgICAoYmZkX2J5dGUgKikgcmF3X2FyYy5mcm9tX3BjKTsKLQkgICAgICBwdXRfdm1hIChjb3JlX2JmZCwgYXJjLT5jaGlsZC0+YWRkciwKLQkJICAgICAgIChiZmRfYnl0ZSAqKSByYXdfYXJjLnNlbGZfcGMpOwotCSAgICAgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBhcmMtPmNvdW50LCAoYmZkX2J5dGUgKikgcmF3X2FyYy5jb3VudCk7Ci0JICAgICAgaWYgKGZ3cml0ZSAoJnJhd19hcmMsIHNpemVvZiAocmF3X2FyYyksIDEsIG9mcCkgIT0gMSkKLQkJewotCQkgIHBlcnJvciAoZmlsZW5hbWUpOwotCQkgIGRvbmUgKDEpOwotCQl9Ci0JICAgICAgREJHIChTQU1QTEVERUJVRywKLQkJICAgcHJpbnRmICgiW2R1bXBzdW1dIGZyb21wYyAweCVseCBzZWxmcGMgMHglbHggY291bnQgJWx1XG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGFyYy0+cGFyZW50LT5hZGRyLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGFyYy0+Y2hpbGQtPmFkZHIsIGFyYy0+Y291bnQpKTsKLQkgICAgfQotCX0KLSAgICAgIGZjbG9zZSAob2ZwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggZmlsZSBmb3JtYXQgJWRcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVfZm9ybWF0KTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2dtb25faW8uaCBiL2dwcm9mL2dtb25faW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNTdhNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9nbW9uX2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIGdtb25faW9faAotI2RlZmluZSBnbW9uX2lvX2gKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdtb24uaCIKLQotI2RlZmluZSBJTlBVVF9ISVNUT0dSQU0JCSgxPDwwKQotI2RlZmluZSBJTlBVVF9DQUxMX0dSQVBICSgxPDwxKQotI2RlZmluZSBJTlBVVF9CQl9DT1VOVFMJCSgxPDwyKQotCi1leHRlcm4gaW50IGdtb25faW5wdXQ7CQkvKiB3aGF0IGlucHV0IGRpZCB3ZSBzZWU/ICovCi1leHRlcm4gaW50IGdtb25fZmlsZV92ZXJzaW9uOwkvKiBmaWxlIHZlcnNpb24gYXJlIHdlIGRlYWxpbmcgd2l0aCAqLwotCi1leHRlcm4gYmZkX3ZtYSBnZXRfdm1hIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGJmZF9ieXRlICogYWRkcikpOwotZXh0ZXJuIHZvaWQgcHV0X3ZtYSBQQVJBTVMgKChiZmQgKiBhYmZkLCBiZmRfdm1hIHZhbCwgYmZkX2J5dGUgKiBhZGRyKSk7Ci0KLWV4dGVybiB2b2lkIGdtb25fb3V0X3JlYWQgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGdtb25fb3V0X3dyaXRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSNlbmRpZiAvKiBnbW9uX2lvX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dtb25fb3V0LmggYi9ncHJvZi9nbW9uX291dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQ0ZmI1Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb25fb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIGdtb24ub3V0IGZpbGVzLiAgSXQgc2hvdWxkIGhhdmUKLSAqIGFzIGZldyBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYXMgcG9zc2libGUgYXMgaXQgaXMgZ29pbmcgdG8gYmUKLSAqIGluY2x1ZGVkIGluIG1hbnkgZGlmZmVyZW50IHByb2dyYW1zLiAgVGhhdCBpcywgbWluaW1pemUgdGhlCi0gKiBudW1iZXIgb2YgI2luY2x1ZGUncy4KLSAqCi0gKiBBIGdtb24ub3V0IGZpbGUgY29uc2lzdHMgb2YgYSBoZWFkZXIgKGRlZmluZWQgYnkgZ21vbl9oZHIpIGZvbGxvd2VkCi0gKiBieSBhIHNlcXVlbmNlIG9mIHJlY29yZHMuICBFYWNoIHJlY29yZCBzdGFydHMgd2l0aCBhIG9uZS1ieXRlIHRhZwotICogaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgcmVjb3JkcywgZm9sbG93ZWQgYnkgcmVjb3JkcyBzcGVjaWZpYyBkYXRhLgotICovCi0jaWZuZGVmIGdtb25fb3V0X2gKLSNkZWZpbmUgZ21vbl9vdXRfaAotCi0jZGVmaW5lCUdNT05fTUFHSUMJImdtb24iCS8qIG1hZ2ljIGNvb2tpZSAqLwotI2RlZmluZSBHTU9OX1ZFUlNJT04JMQkvKiB2ZXJzaW9uIG51bWJlciAqLwotCi0vKgotICogUmF3IGhlYWRlciBhcyBpdCBhcHBlYXJzIG9uIGZpbGUgKHdpdGhvdXQgcGFkZGluZyk6Ci0gKi8KLXN0cnVjdCBnbW9uX2hkcgotICB7Ci0gICAgY2hhciBjb29raWVbNF07Ci0gICAgY2hhciB2ZXJzaW9uWzRdOwotICAgIGNoYXIgc3BhcmVbMyAqIDRdOwotICB9OwotCi0vKiB0eXBlcyBvZiByZWNvcmRzIGluIHRoaXMgZmlsZTogKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgR01PTl9UQUdfVElNRV9ISVNUID0gMCwgR01PTl9UQUdfQ0dfQVJDID0gMSwgR01PTl9UQUdfQkJfQ09VTlQgPSAyCi0gIH0KLUdNT05fUmVjb3JkX1RhZzsKLQotc3RydWN0IGdtb25faGlzdF9oZHIKLSAgewotICAgIGNoYXIgbG93X3BjW3NpemVvZiAoY2hhciopXTsJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlzdF9zaXplWzRdOwkJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgcHJvZl9yYXRlWzRdOwkJCS8qIHByb2ZpbGluZyBjbG9jayByYXRlICovCi0gICAgY2hhciBkaW1lblsxNV07CQkJLyogcGh5cy4gZGltLiwgdXN1YWxseSAic2Vjb25kcyIgKi8KLSAgICBjaGFyIGRpbWVuX2FiYnJldjsJCQkvKiB1c3VhbGx5ICdzJyBmb3IgInNlY29uZHMiICovCi0gIH07Ci0KLXN0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQKLSAgewotICAgIGNoYXIgZnJvbV9wY1tzaXplb2YgKGNoYXIqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlcidzIGJvZHkgKi8KLSAgICBjaGFyIHNlbGZfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBhZGRyZXNzIHdpdGhpbiBjYWxsZWUncyBib2R5ICovCi0gICAgY2hhciBjb3VudFs0XTsJCQkvKiBudW1iZXIgb2YgYXJjIHRyYXZlcnNhbHMgKi8KLSAgfTsKLQotI2VuZGlmIC8qIGdtb25fb3V0X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLjEgYi9ncHJvZi9ncHJvZi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTczNGRhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk4MywgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLS5cIiB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0uXCIgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5IHRoZSBmb2xsb3dpbmcKLS5cIiBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0uXCIgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnIGluIHRoZQotLlwiIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiBhbmQgaW4KLS5cIiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0uXCIgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5Ci0uXCIgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotLlwiIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0uXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLS5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotLlwiCi0uXCIgICAgIEAoIylncHJvZi4xCTYuNiAoQmVya2VsZXkpIDcvMjQvOTAKLS5cIgotLlRIIEdQUk9GIDEgIkphbnVhcnkgMjksIDE5OTMiCi0uU0ggTkFNRQotZ3Byb2YgXC0gZGlzcGxheSBjYWxsIGdyYXBoIHByb2ZpbGUgZGF0YQotLlNIIFNZTk9QU0lTCi0uQiBncHJvZiBbIFwtYWJjc3ogXSBbIFwtZXxcLUUKLS5JIG5hbWUKLS5CIF0gWyBcLWZ8XC1GIAotLkkgbmFtZQotLkIgXSAKLS5CIFsgXC1rCi0uSSBmcm9tbmFtZSB0b25hbWUKLS5CIF0gWyAKLS5JIG9iamZpbGUKLS5CIFsgCi0uSSBnbW9uLm91dAotLkIgXSAKLS5CIF0gCi0uU0ggREVTQ1JJUFRJT04KLS5CIGdwcm9mCi1wcm9kdWNlcyBhbiBleGVjdXRpb24gcHJvZmlsZSBvZiBDLCBQYXNjYWwsIG9yIEZvcnRyYW43NyBwcm9ncmFtcy4KLVRoZSBlZmZlY3Qgb2YgY2FsbGVkIHJvdXRpbmVzIGlzIGluY29ycG9yYXRlZCBpbiB0aGUgcHJvZmlsZSBvZiBlYWNoIGNhbGxlci4KLVRoZSBwcm9maWxlIGRhdGEgaXMgdGFrZW4gZnJvbSB0aGUgY2FsbCBncmFwaCBwcm9maWxlIGZpbGUKLVwmKGBnbW9uLm91dCcgZGVmYXVsdCkgd2hpY2ggaXMgY3JlYXRlZCBieSBwcm9ncmFtcwotdGhhdCBhcmUgY29tcGlsZWQgd2l0aCB0aGUKLS5CIFwtcGcKLW9wdGlvbiBvZgotLkJSIGNjICggMSApICwKLS5CUiBwYyAoIDEgKSAsCi1hbmQKLS5CUiBmNzcgKCAxICkgLgotVGhlCi0uQiBcLXBnCi1vcHRpb24gYWxzbyBsaW5rcyBpbiB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSByb3V0aW5lcwotdGhhdCBhcmUgY29tcGlsZWQgZm9yIHByb2ZpbGluZy4KLS5CIEdwcm9mCi1yZWFkcyB0aGUgZ2l2ZW4gb2JqZWN0IGZpbGUgKHRoZSBkZWZhdWx0IGlzIGBhLm91dCcpCi1hbmQgZXN0YWJsaXNoZXMgdGhlIHJlbGF0aW9uIGJldHdlZW4gaXRzIHN5bWJvbCB0YWJsZQotYW5kIHRoZSBjYWxsIGdyYXBoIHByb2ZpbGUgZnJvbSBgZ21vbi5vdXQnLgotSWYgbW9yZSB0aGFuIG9uZSBwcm9maWxlIGZpbGUgaXMgc3BlY2lmaWVkLAotdGhlCi0uQiBncHJvZgotb3V0cHV0IHNob3dzIHRoZSBzdW0gb2YgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIHByb2ZpbGUgZmlsZXMuCi0uUFAKLS5CIEdwcm9mCi1jYWxjdWxhdGVzIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBlYWNoIHJvdXRpbmUuCi1OZXh0LCB0aGVzZSB0aW1lcyBhcmUgcHJvcGFnYXRlZCBhbG9uZyB0aGUgZWRnZXMgb2YgdGhlIGNhbGwgZ3JhcGguCi1DeWNsZXMgYXJlIGRpc2NvdmVyZWQsIGFuZCBjYWxscyBpbnRvIGEgY3ljbGUgYXJlIG1hZGUgdG8gc2hhcmUgdGhlIHRpbWUKLW9mIHRoZSBjeWNsZS4KLVRoZSBmaXJzdCBsaXN0aW5nIHNob3dzIHRoZSBmdW5jdGlvbnMKLXNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIHRpbWUgdGhleSByZXByZXNlbnQKLWluY2x1ZGluZyB0aGUgdGltZSBvZiB0aGVpciBjYWxsIGdyYXBoIGRlc2NlbmRhbnRzLgotQmVsb3cgZWFjaCBmdW5jdGlvbiBlbnRyeSBpcyBzaG93biBpdHMgKGRpcmVjdCkgY2FsbCBncmFwaCBjaGlsZHJlbiwKLWFuZCBob3cgdGhlaXIgdGltZXMgYXJlIHByb3BhZ2F0ZWQgdG8gdGhpcyBmdW5jdGlvbi4KLUEgc2ltaWxhciBkaXNwbGF5IGFib3ZlIHRoZSBmdW5jdGlvbiBzaG93cyBob3cgdGhpcyBmdW5jdGlvbidzIHRpbWUgYW5kIHRoZQotdGltZSBvZiBpdHMgZGVzY2VuZGFudHMgaXMgcHJvcGFnYXRlZCB0byBpdHMgKGRpcmVjdCkgY2FsbCBncmFwaCBwYXJlbnRzLgotLlBQCi1DeWNsZXMgYXJlIGFsc28gc2hvd24sIHdpdGggYW4gZW50cnkgZm9yIHRoZSBjeWNsZSBhcyBhIHdob2xlIGFuZAotYSBsaXN0aW5nIG9mIHRoZSBtZW1iZXJzIG9mIHRoZSBjeWNsZSBhbmQgdGhlaXIgY29udHJpYnV0aW9ucyB0byB0aGUKLXRpbWUgYW5kIGNhbGwgY291bnRzIG9mIHRoZSBjeWNsZS4KLS5QUAotU2Vjb25kLCBhIGZsYXQgcHJvZmlsZSBpcyBnaXZlbiwKLXNpbWlsYXIgdG8gdGhhdCBwcm92aWRlZCBieQotLkJSIHByb2YgKCAxICkgIC4KLVRoaXMgbGlzdGluZyBnaXZlcyB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWVzLCB0aGUgY2FsbCBjb3VudHMsCi10aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhlIGNhbGwgc3BlbnQgaW4gdGhlIHJvdXRpbmUgaXRzZWxmLCBhbmQKLXRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGUgY2FsbCBzcGVudCBpbiB0aGUgcm91dGluZSBpdHNlbGYgaW5jbHVkaW5nCi1pdHMgZGVzY2VuZGFudHMuCi0uUFAKLUZpbmFsbHksIGFuIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBpcyBwcm92aWRlZC4KLS5TSCBPUFRJT05TCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZToKLS5UUAotLkIgXC1hCi1zdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiBzdGF0aWNhbGx5IGRlY2xhcmVkIGZ1bmN0aW9ucy4KLUlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuLCBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRpYyBmdW5jdGlvbgotKGUuZy4sIHRpbWUgc2FtcGxlcywgY2FsbHMgdG8gb3RoZXIgZnVuY3Rpb25zLCBjYWxscyBmcm9tIG90aGVyIGZ1bmN0aW9ucykKLWJlbG9uZ3MgdG8gdGhlIGZ1bmN0aW9uIGxvYWRlZCBqdXN0IGJlZm9yZSB0aGUgc3RhdGljIGZ1bmN0aW9uIGluIHRoZQotXCZgb2JqZmlsZScgZmlsZS4KLS5UUAotLkIgXC1iCi1zdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggZmllbGQgaW4gdGhlIHByb2ZpbGUuCi0uVFAKLS5CIFwtYwotdGhlIHN0YXRpYyBjYWxsIGdyYXBoIG9mIHRoZSBwcm9ncmFtIGlzIGRpc2NvdmVyZWQgYnkgYSBoZXVyaXN0aWMKLXRoYXQgZXhhbWluZXMgdGhlIHRleHQgc3BhY2Ugb2YgdGhlIG9iamVjdCBmaWxlLgotU3RhdGljLW9ubHkgcGFyZW50cyBvciBjaGlsZHJlbiBhcmUgc2hvd24KLXdpdGggY2FsbCBjb3VudHMgb2YgMC4KLS5UUAotLkJJICJcLWUgIiBuYW1lCi1zdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBmb3Igcm91dGluZQotLkkgbmFtZQotYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMKLSh1bmxlc3MgdGhleSBoYXZlIG90aGVyIGFuY2VzdG9ycyB0aGF0IGFyZW4ndCBzdXBwcmVzc2VkKS4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtZQotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lCi0uSSBuYW1lCi1tYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLWUKLW9wdGlvbi4KLS5UUAotLkJJICJcLUUgIiBuYW1lCi1zdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBmb3Igcm91dGluZQotLkkgbmFtZQotKGFuZCBpdHMgZGVzY2VuZGFudHMpIGFzCi0uQiBcLWUgICwKLWFib3ZlLCBhbmQgYWxzbyBleGNsdWRlcyB0aGUgdGltZSBzcGVudCBpbgotLkkgbmFtZQotKGFuZCBpdHMgZGVzY2VuZGFudHMpIGZyb20gdGhlIHRvdGFsIGFuZCBwZXJjZW50YWdlIHRpbWUgY29tcHV0YXRpb25zLgotKEZvciBleGFtcGxlLAotLkJJICJcLUUgIiBtY291bnQKLS5CSSAiXC1FICIgbWNsZWFudXAKLWlzIHRoZSBkZWZhdWx0LikKLS5UUAotLkJJICJcLWYgIiBuYW1lCi1wcmludHMgdGhlIGdyYXBoIHByb2ZpbGUgZW50cnkgb2Ygb25seSB0aGUgc3BlY2lmaWVkIHJvdXRpbmUKLS5JIG5hbWUKLWFuZCBpdHMgZGVzY2VuZGFudHMuCi1Nb3JlIHRoYW4gb25lCi0uQiBcLWYKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4uCi1Pbmx5IG9uZQotLkkgbmFtZQotbWF5IGJlIGdpdmVuIHdpdGggZWFjaAotLkIgXC1mCi1vcHRpb24uCi0uVFAKLS5CSSAiXC1GICIgbmFtZQotcHJpbnRzIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IG9mIG9ubHkgdGhlIHJvdXRpbmUKLS5JIG5hbWUKLWFuZCBpdHMgZGVzY2VuZGFudHMgKGFzCi0uQiBcLWYgLAotYWJvdmUpIGFuZCBhbHNvIHVzZXMgb25seSB0aGUgdGltZXMgb2YgdGhlIHByaW50ZWQgcm91dGluZXMKLWluIHRvdGFsIHRpbWUgYW5kIHBlcmNlbnRhZ2UgY29tcHV0YXRpb25zLgotTW9yZSB0aGFuIG9uZQotLkIgXC1GCi1vcHRpb24gbWF5IGJlIGdpdmVuLgotT25seSBvbmUKLS5JIG5hbWUKLW1heSBiZSBnaXZlbiB3aXRoIGVhY2gKLS5CIFwtRgotb3B0aW9uLgotVGhlCi0uQiBcLUYKLW9wdGlvbgotb3ZlcnJpZGVzCi10aGUKLS5CIFwtRQotb3B0aW9uLgotLlRQCi0uQkkgIlwtayAiICJmcm9tbmFtZSB0b25hbWUiCi13aWxsIGRlbGV0ZSBhbnkgYXJjcyBmcm9tIHJvdXRpbmUKLS5JIGZyb21uYW1lCi10byByb3V0aW5lCi0uSVIgdG9uYW1lICAuCi1UaGlzIGNhbiBiZSB1c2VkIHRvIGJyZWFrIHVuZGVzaXJlZCBjeWNsZXMuCi1Nb3JlIHRoYW4gb25lCi0uQiBcLWsKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4uCi1Pbmx5IG9uZSBwYWlyIG9mIHJvdXRpbmUgbmFtZXMgbWF5IGJlIGdpdmVuIHdpdGggZWFjaAotLkIgXC1rCi1vcHRpb24uCi0uVFAKLS5CIFwtcwotYSBwcm9maWxlIGZpbGUgYGdtb24uc3VtJyBpcyBwcm9kdWNlZCB0aGF0IHJlcHJlc2VudHMKLXRoZSBzdW0gb2YgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gaW4gYWxsIHRoZSBzcGVjaWZpZWQgcHJvZmlsZSBmaWxlcy4KLVRoaXMgc3VtbWFyeSBwcm9maWxlIGZpbGUgbWF5IGJlIGdpdmVuIHRvIGxhdGVyCi1leGVjdXRpb25zIG9mIGdwcm9mIChwcm9iYWJseSBhbHNvIHdpdGggYQotLkJSIFwtcyAgKQotdG8gYWNjdW11bGF0ZSBwcm9maWxlIGRhdGEgYWNyb3NzIHNldmVyYWwgcnVucyBvZiBhbiBgb2JqZmlsZScgZmlsZS4KLS5UUAotLkIgLXYKLXByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIGdwcm9mLCBhbmQgdGhlbiBleGl0cy4KLS5UUAotLkIgLXoKLWRpc3BsYXlzIHJvdXRpbmVzIHRoYXQgaGF2ZSB6ZXJvIHVzYWdlIChhcyBzaG93biBieSBjYWxsIGNvdW50cwotYW5kIGFjY3VtdWxhdGVkIHRpbWUpLgotVGhpcyBpcyB1c2VmdWwgd2l0aCB0aGUKLS5CIFwtYwotb3B0aW9uIGZvciBkaXNjb3ZlcmluZyB3aGljaCByb3V0aW5lcyB3ZXJlIG5ldmVyIGNhbGxlZC4KLS5QUAotLlNIIEZJTEVTCi0udGEgXHcnZ21vbi5zdW0gJ3UKLWEub3V0CXRoZSBuYW1lbGlzdCBhbmQgdGV4dCBzcGFjZS4KLS5icgotZ21vbi5vdXQJZHluYW1pYyBjYWxsIGdyYXBoIGFuZCBwcm9maWxlLgotLmJyCi1nbW9uLnN1bSBzdW1tYXJpemVkIGR5bmFtaWMgY2FsbCBncmFwaCBhbmQgcHJvZmlsZS4KLS5TSCBTRUUgQUxTTwotLkJSIG1vbml0b3IgKCAzICkgLAotLkJSIHByb2ZpbCAoIDIgKSAsCi0uQlIgY2MgKCAxICkgLAotLkJSIHByb2YgKCAxICkKLS5zcAotYGBBbiBFeGVjdXRpb24gUHJvZmlsZXIgZm9yIE1vZHVsYXIgUHJvZ3JhbXMnJywKLWJ5IFMuIEdyYWhhbSwgUC4gS2Vzc2xlciwgTS4gTWNLdXNpY2s7Ci0uSQotU29mdHdhcmUgXC0gUHJhY3RpY2UgYW5kIEV4cGVyaWVuY2UsCi1Wb2wuIDEzLCBwcC4gNjcxLTY4NSwgMTk4My4KLS5zcAotYGBncHJvZjogQSBDYWxsIEdyYXBoIEV4ZWN1dGlvbiBQcm9maWxlcicnLAotYnkgUy4gR3JhaGFtLCBQLiBLZXNzbGVyLCBNLiBNY0t1c2ljazsKLS5JCi1Qcm9jZWVkaW5ncyBvZiB0aGUgU0lHUExBTiAnODIgU3ltcG9zaXVtIG9uIENvbXBpbGVyIENvbnN0cnVjdGlvbiwKLVNJR1BMQU4gTm90aWNlcywgVm9sLiAxNywgTm8gIDYsIHBwLiAxMjAtMTI2LCBKdW5lIDE5ODIuCi0uU0ggSElTVE9SWQotLkIgR3Byb2YKLWFwcGVhcmVkIGluIDQuMiBCU0QuCi0uU0ggQlVHUwotVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzYW1wbGluZyBpcyBzaG93biwgYnV0IHJlbWFpbnMKLXN0YXRpc3RpY2FsIGF0IGJlc3QuCi1XZSBhc3N1bWUgdGhhdCB0aGUgdGltZSBmb3IgZWFjaCBleGVjdXRpb24gb2YgYSBmdW5jdGlvbgotY2FuIGJlIGV4cHJlc3NlZCBieSB0aGUgdG90YWwgdGltZSBmb3IgdGhlIGZ1bmN0aW9uIGRpdmlkZWQKLWJ5IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLVRodXMgdGhlIHRpbWUgcHJvcGFnYXRlZCBhbG9uZyB0aGUgY2FsbCBncmFwaCBhcmNzIHRvIHRoZSBmdW5jdGlvbidzCi1wYXJlbnRzIGlzIGRpcmVjdGx5IHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQKLWFyYyBpcyB0cmF2ZXJzZWQuCi0uUFAKLVBhcmVudHMgdGhhdCBhcmUgbm90IHRoZW1zZWx2ZXMgcHJvZmlsZWQgd2lsbCBoYXZlIHRoZSB0aW1lIG9mCi10aGVpciBwcm9maWxlZCBjaGlsZHJlbiBwcm9wYWdhdGVkIHRvIHRoZW0sIGJ1dCB0aGV5IHdpbGwgYXBwZWFyCi10byBiZSBzcG9udGFuZW91c2x5IGludm9rZWQgaW4gdGhlIGNhbGwgZ3JhcGggbGlzdGluZywgYW5kIHdpbGwKLW5vdCBoYXZlIHRoZWlyIHRpbWUgcHJvcGFnYXRlZCBmdXJ0aGVyLgotU2ltaWxhcmx5LCBzaWduYWwgY2F0Y2hlcnMsIGV2ZW4gdGhvdWdoIHByb2ZpbGVkLCB3aWxsIGFwcGVhcgotdG8gYmUgc3BvbnRhbmVvdXMgKGFsdGhvdWdoIGZvciBtb3JlIG9ic2N1cmUgcmVhc29ucykuCi1BbnkgcHJvZmlsZWQgY2hpbGRyZW4gb2Ygc2lnbmFsIGNhdGNoZXJzIHNob3VsZCBoYXZlIHRoZWlyIHRpbWVzCi1wcm9wYWdhdGVkIHByb3Blcmx5LCB1bmxlc3MgdGhlIHNpZ25hbCBjYXRjaGVyIHdhcyBpbnZva2VkIGR1cmluZwotdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZmlsaW5nIHJvdXRpbmUsIGluIHdoaWNoIGNhc2UgYWxsIGlzIGxvc3QuCi0uUFAKLVRoZSBwcm9maWxlZCBwcm9ncmFtIG11c3QgY2FsbAotLkJSIGV4aXQgKCAyICkKLW9yIHJldHVybiBub3JtYWxseSBmb3IgdGhlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byBiZSBzYXZlZAotaW4gdGhlIGBnbW9uLm91dCcgZmlsZS4KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLmMgYi9ncHJvZi9ncHJvZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjkwNDg3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImJhc2ljX2Jsb2Nrcy5oIgotI2luY2x1ZGUgImNhbGxfZ3JhcGguaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY2dfcHJpbnQuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJoZXJ0ei5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLWNvbnN0IGNoYXIgKndob2FtaTsKLWNvbnN0IGNoYXIgKmZ1bmN0aW9uX21hcHBpbmdfZmlsZTsKLWNvbnN0IGNoYXIgKmFfb3V0X25hbWUgPSBBX09VVE5BTUU7Ci1sb25nIGh6ID0gSFpfV1JPTkc7Ci0KLS8qCi0gKiBEZWZhdWx0IG9wdGlvbnMgdmFsdWVzOgotICovCi1pbnQgZGVidWdfbGV2ZWwgPSAwOwotaW50IG91dHB1dF9zdHlsZSA9IDA7Ci1pbnQgb3V0cHV0X3dpZHRoID0gODA7Ci1ib29sIGJzZF9zdHlsZV9vdXRwdXQgPSBGQUxTRTsKLWJvb2wgZGVtYW5nbGUgPSBUUlVFOwotYm9vbCBkaXNjYXJkX3VuZGVyc2NvcmVzID0gVFJVRTsKLWJvb2wgaWdub3JlX2RpcmVjdF9jYWxscyA9IEZBTFNFOwotYm9vbCBpZ25vcmVfc3RhdGljX2Z1bmNzID0gRkFMU0U7Ci1ib29sIGlnbm9yZV96ZXJvcyA9IFRSVUU7Ci1ib29sIGxpbmVfZ3JhbnVsYXJpdHkgPSBGQUxTRTsKLWJvb2wgcHJpbnRfZGVzY3JpcHRpb25zID0gVFJVRTsKLWJvb2wgcHJpbnRfcGF0aCA9IEZBTFNFOwotYm9vbCBpZ25vcmVfbm9uX2Z1bmN0aW9ucyA9IEZBTFNFOwotRmlsZV9Gb3JtYXQgZmlsZV9mb3JtYXQgPSBGRl9BVVRPOwotCi1ib29sIGZpcnN0X291dHB1dCA9IFRSVUU7Ci0KLWNoYXIgY29weXJpZ2h0W10gPQotIE5fKCJAKCMpIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiIpOwotCi1zdGF0aWMgY2hhciAqZ21vbl9uYW1lID0gR01PTk5BTUU7CS8qIHByb2ZpbGUgZmlsZW5hbWUgKi8KLQotYmZkICphYmZkOwotCi0vKgotICogRnVuY3Rpb25zIHRoYXQgZ2V0IGV4Y2x1ZGVkIGJ5IGRlZmF1bHQ6Ci0gKi8KLXN0YXRpYyBjaGFyICpkZWZhdWx0X2V4Y2x1ZGVkX2xpc3RbXSA9Ci17Ci0gICJfZ3Byb2ZfbWNvdW50IiwgIm1jb3VudCIsICJfbWNvdW50IiwgIl9fbWNvdW50IiwgIl9fbWNvdW50X2ludGVybmFsIiwKLSAgIl9fbWNsZWFudXAiLAotICAiPGxvY29yZT4iLCAiPGhpY29yZT4iLAotICAwCi19OwotCi0vKiBDb2RlcyB1c2VkIGZvciB0aGUgbG9uZyBvcHRpb25zIHdpdGggbm8gc2hvcnQgc3lub255bXMuICAxNTAgaXNuJ3QKLSAgIHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9ERU1BTkdMRQkJKDE1MCkKLSNkZWZpbmUgT1BUSU9OX05PX0RFTUFOR0xFCShPUFRJT05fREVNQU5HTEUgKyAxKQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsibGluZSIsIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7Im5vLXN0YXRpYyIsIG5vX2FyZ3VtZW50LCAwLCAnYSd9LAotICB7Imlnbm9yZS1ub24tZnVuY3Rpb25zIiwgbm9fYXJndW1lbnQsIDAsICdEJ30sCi0KLSAgICAvKiBvdXRwdXQgc3R5bGVzOiAqLwotCi0gIHsiYW5ub3RhdGVkLXNvdXJjZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnQSd9LAotICB7Im5vLWFubm90YXRlZC1zb3VyY2UiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0onfSwKLSAgeyJmbGF0LXByb2ZpbGUiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ3AnfSwKLSAgeyJuby1mbGF0LXByb2ZpbGUiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ1AnfSwKLSAgeyJncmFwaCIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAncSd9LAotICB7Im5vLWdyYXBoIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdRJ30sCi0gIHsiZXhlYy1jb3VudHMiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0MnfSwKLSAgeyJuby1leGVjLWNvdW50cyIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnWid9LAotICB7ImZ1bmN0aW9uLW9yZGVyaW5nIiwgbm9fYXJndW1lbnQsIDAsICdyJ30sCi0gIHsiZmlsZS1vcmRlcmluZyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUid9LAotICB7ImZpbGUtaW5mbyIsIG5vX2FyZ3VtZW50LCAwLCAnaSd9LAotICB7InN1bSIsIG5vX2FyZ3VtZW50LCAwLCAncyd9LAotCi0gICAgLyogdmFyaW91cyBvcHRpb25zIHRvIGFmZmVjdCBvdXRwdXQ6ICovCi0KLSAgeyJhbGwtbGluZXMiLCBub19hcmd1bWVudCwgMCwgJ3gnfSwKLSAgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fREVNQU5HTEV9LAotICB7Im5vLWRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9OT19ERU1BTkdMRX0sCi0gIHsiZGlyZWN0b3J5LXBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJkaXNwbGF5LXVudXNlZC1mdW5jdGlvbnMiLCBub19hcmd1bWVudCwgMCwgJ3onfSwKLSAgeyJtaW4tY291bnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ20nfSwKLSAgeyJwcmludC1wYXRoIiwgbm9fYXJndW1lbnQsIDAsICdMJ30sCi0gIHsic2VwYXJhdGUtZmlsZXMiLCBub19hcmd1bWVudCwgMCwgJ3knfSwKLSAgeyJzdGF0aWMtY2FsbC1ncmFwaCIsIG5vX2FyZ3VtZW50LCAwLCAnYyd9LAotICB7InRhYmxlLWxlbmd0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndCd9LAotICB7InRpbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ24nfSwKLSAgeyJuby10aW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdOJ30sCi0gIHsid2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3cnfSwKLSAgICAvKgotICAgICAqIFRoZXNlIGFyZSBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgb25seS4gIFRoZWlyIGZ1bmN0aW9uYWxpdHkKLSAgICAgKiBpcyBwcm92aWRlZCBieSB0aGUgb3V0cHV0IHN0eWxlIG9wdGlvbnMgYWxyZWFkeToKLSAgICAgKi8KLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2UnfSwKLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0UnfSwKLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2YnfSwKLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwKLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2snfSwKLQotICAgIC8qIG1pc2NlbGxhbmVvdXM6ICovCi0KLSAgeyJicmllZiIsIG5vX2FyZ3VtZW50LCAwLCAnYid9LAotICB7ImRlYnVnIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdkJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImZpbGUtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsidHJhZGl0aW9uYWwiLCBub19hcmd1bWVudCwgMCwgJ1QnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOICh1c2FnZSwgKHN0cmVhbSwgc3RhdHVzKSwgRklMRSAqIHN0cmVhbSBBTkQgaW50IHN0YXR1cykKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1bYWJjRGhpbExzVHZ3eHl6XV0gWy1bQUNlRWZGSm5OT3BQcVFaXVtuYW1lXV0gWy1JIGRpcnNdXG5cCi0JWy1kW251bV1dIFstayBmcm9tL3RvXSBbLW0gbWluLWNvdW50XSBbLXQgdGFibGUtbGVuZ3RoXVxuXAotCVstLVtuby1dYW5ub3RhdGVkLXNvdXJjZVs9bmFtZV1dIFstLVtuby1dZXhlYy1jb3VudHNbPW5hbWVdXVxuXAotCVstLVtuby1dZmxhdC1wcm9maWxlWz1uYW1lXV0gWy0tW25vLV1ncmFwaFs9bmFtZV1dXG5cCi0JWy0tW25vLV10aW1lPW5hbWVdIFstLWFsbC1saW5lc10gWy0tYnJpZWZdIFstLWRlYnVnWz1sZXZlbF1dXG5cCi0JWy0tZnVuY3Rpb24tb3JkZXJpbmddIFstLWZpbGUtb3JkZXJpbmddXG5cCi0JWy0tZGlyZWN0b3J5LXBhdGg9ZGlyc10gWy0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zXVxuXAotCVstLWZpbGUtZm9ybWF0PW5hbWVdIFstLWZpbGUtaW5mb10gWy0taGVscF0gWy0tbGluZV0gWy0tbWluLWNvdW50PW5dXG5cCi0JWy0tbm8tc3RhdGljXSBbLS1wcmludC1wYXRoXSBbLS1zZXBhcmF0ZS1maWxlc11cblwKLQlbLS1zdGF0aWMtY2FsbC1ncmFwaF0gWy0tc3VtXSBbLS10YWJsZS1sZW5ndGg9bGVuXSBbLS10cmFkaXRpb25hbF1cblwKLQlbLS12ZXJzaW9uXSBbLS13aWR0aD1uXSBbLS1pZ25vcmUtbm9uLWZ1bmN0aW9uc11cblwKLQlbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdXG5cCi0JW2ltYWdlLWZpbGVdIFtwcm9maWxlLWZpbGUuLi5dXG4iKSwKLQkgICB3aG9hbWkpOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZG9uZSAoc3RhdHVzKTsKLX0KLQotCi1pbnQKLURFRlVOIChtYWluLCAoYXJnYywgYXJndiksIGludCBhcmdjIEFORCBjaGFyICoqYXJndikKLXsKLSAgY2hhciAqKnNwLCAqc3RyOwotICBTeW0gKipjZyA9IDA7Ci0gIGludCBjaCwgdXNlcl9zcGVjaWZpZWQgPSAwOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgd2hvYW1pID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lICh3aG9hbWkpOwotCi0gIHdoaWxlICgoY2ggPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwKLQkiYUE6OmJCY0NkRDo6ZTpFOmY6RjpoaUk6Sjo6azpsTG06bjo6Tjo6TzpwOjpQOjpxOjpROjpzdDpUdnc6eHl6Wjo6IiwKLQkJCSAgICBsb25nX29wdGlvbnMsIDApKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAnYSc6Ci0JICBpZ25vcmVfc3RhdGljX2Z1bmNzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9BTk5PKTsKLQkgICAgfQotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICBwcmludF9kZXNjcmlwdGlvbnMgPSBGQUxTRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0InOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBpZ25vcmVfZGlyZWN0X2NhbGxzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9FWEVDKTsKLQkgICAgfQotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0VYRUNfQ09VTlRTOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBkZWJ1Z19sZXZlbCB8PSBhdG9pIChvcHRhcmcpOwotCSAgICAgIGRlYnVnX2xldmVsIHw9IEFOWURFQlVHOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBkZWJ1Z19sZXZlbCA9IH4wOwotCSAgICB9Ci0JICBEQkcgKEFOWURFQlVHLCBwcmludGYgKCJbbWFpbl0gZGVidWctbGV2ZWw9MHgleFxuIiwgZGVidWdfbGV2ZWwpKTsKLSNpZm5kZWYgREVCVUcKLQkgIHByaW50ZiAoXygiJXM6IGRlYnVnZ2luZyBub3Qgc3VwcG9ydGVkOyAtZCBpZ25vcmVkXG4iKSwgd2hvYW1pKTsKLSNlbmRpZgkvKiBERUJVRyAqLwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBpZ25vcmVfbm9uX2Z1bmN0aW9ucyA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICdFJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9USU1FKTsKLQljYXNlICdlJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9HUkFQSCk7Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9USU1FKTsKLQljYXNlICdmJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9HUkFQSCk7Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9GTEFUKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0cnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0ZMQVQpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQljYXNlICdpJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9HTU9OX0lORk87Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9HTU9OX0lORk87Ci0JICBicmVhazsKLQljYXNlICdJJzoKLQkgIHNlYXJjaF9saXN0X2FwcGVuZCAoJnNyY19zZWFyY2hfbGlzdCwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0onOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9BTk5PKTsKLQkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgICB9Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgYnJlYWs7Ci0JY2FzZSAnayc6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfQVJDUyk7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGxpbmVfZ3JhbnVsYXJpdHkgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBwcmludF9wYXRoID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ20nOgotCSAgYmJfbWluX2NhbGxzID0gKHVuc2lnbmVkIGxvbmcpIHN0cnRvdWwgKG9wdGFyZywgKGNoYXIgKiopIE5VTEwsIDEwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX1RJTUUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTic6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfVElNRSk7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIHN3aXRjaCAob3B0YXJnWzBdKQotCSAgICB7Ci0JICAgIGNhc2UgJ2EnOgotCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfQVVUTzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbSc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9NQUdJQzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9CU0Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzQnOgotCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfQlNENDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3AnOgotCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfUFJPRjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmtub3duIGZpbGUgZm9ybWF0ICVzXG4iKSwKLQkJICAgICAgIG9wdGFyZywgd2hvYW1pKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAncCc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0ZMQVQpOwotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRkxBVF9QUk9GSUxFOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRkxBVF9QUk9GSUxFOwotCSAgYnJlYWs7Ci0JY2FzZSAnUCc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0ZMQVQpOwotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfRkxBVF9QUk9GSUxFOwotCSAgICB9Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICBicmVhazsKLQljYXNlICdxJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY2hyIChvcHRhcmcsICcvJykpCi0JCXsKLQkJICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfQVJDUyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfR1JBUEgpOwotCQl9Ci0JICAgIH0KLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZVTkNUSU9OX09SREVSOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRlVOQ1RJT05fT1JERVI7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GSUxFX09SREVSOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRklMRV9PUkRFUjsKLQkgIGZ1bmN0aW9uX21hcHBpbmdfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ1EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIGlmIChzdHJjaHIgKG9wdGFyZywgJy8nKSkKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9BUkNTKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9HUkFQSCk7Ci0JCX0KLQkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9DQUxMX0dSQVBIOwotCSAgICB9Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfU1VNTUFSWV9GSUxFOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfU1VNTUFSWV9GSUxFOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBiYl90YWJsZV9sZW5ndGggPSBhdG9pIChvcHRhcmcpOwotCSAgaWYgKGJiX3RhYmxlX2xlbmd0aCA8IDApCi0JICAgIHsKLQkgICAgICBiYl90YWJsZV9sZW5ndGggPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGJzZF9zdHlsZV9vdXRwdXQgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotCSAgcHJpbnRmIChfKCJHTlUgZ3Byb2YgJXNcbiIpLCBWRVJTSU9OKTsKLQkgIHByaW50ZiAoXygiQmFzZWQgb24gQlNEIGdwcm9mLCBjb3B5cmlnaHQgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotCSAgZG9uZSAoMCk7Ci0JY2FzZSAndyc6Ci0JICBvdXRwdXRfd2lkdGggPSBhdG9pIChvcHRhcmcpOwotCSAgaWYgKG91dHB1dF93aWR0aCA8IDEpCi0JICAgIHsKLQkgICAgICBvdXRwdXRfd2lkdGggPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGJiX2Fubm90YXRlX2FsbF9saW5lcyA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICd5JzoKLQkgIGNyZWF0ZV9hbm5vdGF0aW9uX2ZpbGVzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgaWdub3JlX3plcm9zID0gRkFMU0U7Ci0JICBicmVhazsKLQljYXNlICdaJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfRVhFQyk7Ci0JICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0VYRUNfQ09VTlRTOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0VYRUNfQ09VTlRTOwotCSAgICB9Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVNQU5HTEU6Ci0JICBkZW1hbmdsZSA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19ERU1BTkdMRToKLQkgIGRlbWFuZ2xlID0gRkFMU0U7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICAvKiBEb24ndCBhbGxvdyBib3RoIG9yZGVyaW5nIG9wdGlvbnMsIHRoZXkgbW9kaWZ5IHRoZSBhcmMgZGF0YSBpbi1wbGFjZS4gICovCi0gIGlmICgodXNlcl9zcGVjaWZpZWQgJiBTVFlMRV9GVU5DVElPTl9PUkRFUikKLSAgICAgICYmICh1c2VyX3NwZWNpZmllZCAmIFNUWUxFX0ZJTEVfT1JERVIpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVycixfKCJcCi0lczogT25seSBvbmUgb2YgLS1mdW5jdGlvbi1vcmRlcmluZyBhbmQgLS1maWxlLW9yZGVyaW5nIG1heSBiZSBzcGVjaWZpZWQuXG4iKSwKLQkgICAgICAgd2hvYW1pKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiAtLXN1bSBpbXBsaWVzIC0tbGluZSwgb3RoZXJ3aXNlIHdlJ2QgbG9zZSBiLWIgY291bnRzIGluIGdtb24uc3VtICovCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9TVU1NQVJZX0ZJTEUpCi0gICAgewotICAgICAgbGluZV9ncmFudWxhcml0eSA9IDE7Ci0gICAgfQotCi0gIC8qIGFwcGVuZCB2YWx1ZSBvZiBHUFJPRl9QQVRIIHRvIHNvdXJjZSBzZWFyY2ggbGlzdCBpZiBzZXQ6ICovCi0gIHN0ciA9IChjaGFyICopIGdldGVudiAoIkdQUk9GX1BBVEgiKTsKLSAgaWYgKHN0cikKLSAgICB7Ci0gICAgICBzZWFyY2hfbGlzdF9hcHBlbmQgKCZzcmNfc2VhcmNoX2xpc3QsIHN0cik7Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGFfb3V0X25hbWUgPSBhcmd2W29wdGluZCsrXTsKLSAgICB9Ci0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGdtb25fbmFtZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIH0KLQotICAvKgotICAgKiBUdXJuIG9mZiBkZWZhdWx0IGZ1bmN0aW9uczoKLSAgICovCi0gIGZvciAoc3AgPSAmZGVmYXVsdF9leGNsdWRlZF9saXN0WzBdOyAqc3A7IHNwKyspCi0gICAgewotICAgICAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX1RJTUUpOwotICAgICAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX0dSQVBIKTsKLSNpZmRlZiBfX2FscGhhX18KLSAgICAgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9GTEFUKTsKLSNlbmRpZgotICAgIH0KLQotICAvKgotICAgKiBGb3IgbGluZS1ieS1saW5lIHByb2ZpbGluZywgYWxzbyB3YW50IHRvIGtlZXAgdGhvc2UKLSAgICogZnVuY3Rpb25zIG9mZiB0aGUgZmxhdCBwcm9maWxlOgotICAgKi8KLSAgaWYgKGxpbmVfZ3JhbnVsYXJpdHkpCi0gICAgewotICAgICAgZm9yIChzcCA9ICZkZWZhdWx0X2V4Y2x1ZGVkX2xpc3RbMF07ICpzcDsgc3ArKykKLQl7Ci0JICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfRkxBVCk7Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBSZWFkIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUgZmlsZToKLSAgICovCi0gIGNvcmVfaW5pdCAoYV9vdXRfbmFtZSk7Ci0KLSAgLyoKLSAgICogSWYgd2Ugc2hvdWxkIGlnbm9yZSBkaXJlY3QgZnVuY3Rpb24gY2FsbHMsIHdlIG5lZWQgdG8gbG9hZAotICAgKiB0byBjb3JlJ3MgdGV4dC1zcGFjZToKLSAgICovCi0gIGlmIChpZ25vcmVfZGlyZWN0X2NhbGxzKQotICAgIHsKLSAgICAgIGNvcmVfZ2V0X3RleHRfc3BhY2UgKGNvcmVfYmZkKTsKLSAgICB9Ci0KLSAgLyoKLSAgICogQ3JlYXRlIHN5bWJvbHMgZnJvbSBjb3JlIGltYWdlOgotICAgKi8KLSAgaWYgKGxpbmVfZ3JhbnVsYXJpdHkpCi0gICAgewotICAgICAgY29yZV9jcmVhdGVfbGluZV9zeW1zIChjb3JlX2JmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyAoY29yZV9iZmQpOwotICAgIH0KLQotICAvKgotICAgKiBUcmFuc2xhdGUgc3ltIHNwZWNzIGludG8gc3ltczoKLSAgICovCi0gIHN5bV9pZF9wYXJzZSAoKTsKLQotICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfUFJPRikKLSAgICB7Ci0jaWZkZWYgUFJPRl9TVVBQT1JUX0lNUExFTUVOVEVECi0gICAgICAvKgotICAgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IG1vbi5vdXQgZmlsZShzKToKLSAgICAgICAqLwotICAgICAgZG8KLQl7Ci0JICBtb25fb3V0X3JlYWQgKGdtb25fbmFtZSk7Ci0JICBpZiAob3B0aW5kIDwgYXJnYykKLQkgICAgewotCSAgICAgIGdtb25fbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlIChvcHRpbmQrKyA8IGFyZ2MpOwotI2Vsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgXygiJXM6IHNvcnJ5LCBmaWxlIGZvcm1hdCBgcHJvZicgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIpLAotCSAgICAgICB3aG9hbWkpOwotICAgICAgZG9uZSAoMSk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGdtb24ub3V0IGZpbGUocyk6Ci0gICAgICAgKi8KLSAgICAgIGRvCi0JewotCSAgZ21vbl9vdXRfcmVhZCAoZ21vbl9uYW1lKTsKLQkgIGlmIChvcHRpbmQgPCBhcmdjKQotCSAgICB7Ci0JICAgICAgZ21vbl9uYW1lID0gYXJndltvcHRpbmRdOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKG9wdGluZCsrIDwgYXJnYyk7Ci0gICAgfQotCi0gIC8qCi0gICAqIElmIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IG91dHB1dCBzdHlsZSwgdHJ5IHRvIGd1ZXNzIHNvbWV0aGluZwotICAgKiByZWFzb25hYmxlOgotICAgKi8KLSAgaWYgKG91dHB1dF9zdHlsZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChnbW9uX2lucHV0ICYgKElOUFVUX0hJU1RPR1JBTSB8IElOUFVUX0NBTExfR1JBUEgpKQotCXsKLQkgIG91dHB1dF9zdHlsZSA9IFNUWUxFX0ZMQVRfUFJPRklMRSB8IFNUWUxFX0NBTExfR1JBUEg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG91dHB1dF9zdHlsZSA9IFNUWUxFX0VYRUNfQ09VTlRTOwotCX0KLSAgICAgIG91dHB1dF9zdHlsZSAmPSB+dXNlcl9zcGVjaWZpZWQ7Ci0gICAgfQotCi0gIC8qCi0gICAqIER1bXAgYSBnbW9uLnN1bSBmaWxlIGlmIHJlcXVlc3RlZCAoYmVmb3JlIGFueSBvdGhlciBwcm9jZXNzaW5nISk6Ci0gICAqLwotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfU1VNTUFSWV9GSUxFKQotICAgIHsKLSAgICAgIGdtb25fb3V0X3dyaXRlIChHTU9OU1VNKTsKLSAgICB9Ci0KLSAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9ISVNUT0dSQU0pCi0gICAgewotICAgICAgaGlzdF9hc3NpZ25fc2FtcGxlcyAoKTsKLSAgICB9Ci0KLSAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9DQUxMX0dSQVBIKQotICAgIHsKLSAgICAgIGNnID0gY2dfYXNzZW1ibGUgKCk7Ci0gICAgfQotCi0gIC8qIGRvIHNvbWUgc2ltcGxlIHNhbml0eSBjaGVja3M6ICovCi0KLSAgaWYgKChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GTEFUX1BST0ZJTEUpCi0gICAgICAmJiAhKGdtb25faW5wdXQgJiBJTlBVVF9ISVNUT0dSQU0pKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGdtb24ub3V0IGZpbGUgaXMgbWlzc2luZyBoaXN0b2dyYW1cbiIpLCB3aG9hbWkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICgob3V0cHV0X3N0eWxlICYgU1RZTEVfQ0FMTF9HUkFQSCkgJiYgIShnbW9uX2lucHV0ICYgSU5QVVRfQ0FMTF9HUkFQSCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICBfKCIlczogZ21vbi5vdXQgZmlsZSBpcyBtaXNzaW5nIGNhbGwtZ3JhcGggZGF0YVxuIiksIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogb3V0cHV0IHdoYXRldmVyIHVzZXIgd2hpc2hlcyB0byBzZWU6ICovCi0KLSAgaWYgKGNnICYmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9DQUxMX0dSQVBIKSAmJiBic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGNnX3ByaW50IChjZyk7CQkvKiBwcmludCB0aGUgZHluYW1pYyBwcm9maWxlICovCi0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GTEFUX1BST0ZJTEUpCi0gICAgewotICAgICAgaGlzdF9wcmludCAoKTsJCS8qIHByaW50IHRoZSBmbGF0IHByb2ZpbGUgKi8KLSAgICB9Ci0KLSAgaWYgKGNnICYmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9DQUxMX0dSQVBIKSkKLSAgICB7Ci0gICAgICBpZiAoIWJzZF9zdHlsZV9vdXRwdXQpCi0JewotCSAgY2dfcHJpbnQgKGNnKTsJLyogcHJpbnQgdGhlIGR5bmFtaWMgcHJvZmlsZSAqLwotCX0KLSAgICAgIGNnX3ByaW50X2luZGV4ICgpOwotICAgIH0KLQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfRVhFQ19DT1VOVFMpCi0gICAgewotICAgICAgcHJpbnRfZXhlY19jb3VudHMgKCk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9BTk5PVEFURURfU09VUkNFKQotICAgIHsKLSAgICAgIHByaW50X2Fubm90YXRlZF9zb3VyY2UgKCk7Ci0gICAgfQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfRlVOQ1RJT05fT1JERVIpCi0gICAgewotICAgICAgY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcgKCk7Ci0gICAgfQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfRklMRV9PUkRFUikKLSAgICB7Ci0gICAgICBjZ19wcmludF9maWxlX29yZGVyaW5nICgpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWRvbmUgKHN0YXR1cykKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLmggYi9ncHJvZi9ncHJvZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjYyYWVlLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogICAgICBAKCMpZ3Byb2YuaCAgICAgNS45IChCZXJrZWxleSkgNi8xLzkwCi0gKi8KLSNpZm5kZWYgZ3Byb2ZfaAotI2RlZmluZSBncHJvZl9oCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBJbmNsdWRlIHRoZSBCRkQgc3lzZGVwLmggZmlsZS4gICovCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLS8qIFVuZGVmaW5lIHRoZSBCRkQgUEFDS0FHRSBhbmQgVkVSU0lPTiBtYWNyb3MgYmVmb3JlIGluY2x1ZGluZyB0aGUKLSAgIGdwcm9mIGNvbmZpZy5oIGZpbGUuICAqLwotI3VuZGVmIFBBQ0tBR0UKLSN1bmRlZiBWRVJTSU9OCi0vKiBBbHNvIHVuZGVmaW5lIEJGRCdzIGBfJyBtYWNybzsgd2UgaGF2ZSBvdXIgb3duIGRlZmluaXRpb24uICAqLwotI3VuZGVmIF8KLQotI2luY2x1ZGUgImdjb25maWcuaCIKLQotI2lmbmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotI2lmbmRlZiBNQVgKLSNkZWZpbmUgTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi0vKiBBSVggZGVmaW5lcyBoeiBhcyBhIG1hY3JvLiAgKi8KLSN1bmRlZiBoegotCi0jaWZuZGVmIFBBVEhfTUFYCi0jZGVmaW5lIFBBVEhfTUFYCTEwMjQKLSNlbmRpZgotCi0jZGVmaW5lCUFfT1VUTkFNRQkiYS5vdXQiCS8qIGRlZmF1bHQgY29yZSBmaWxlbmFtZSAqLwotI2RlZmluZQlHTU9OTkFNRQkiZ21vbi5vdXQiCS8qIGRlZmF1bHQgcHJvZmlsZSBmaWxlbmFtZSAqLwotI2RlZmluZQlHTU9OU1VNCQkiZ21vbi5zdW0iCS8qIHByb2ZpbGUgc3VtbWFyeSBmaWxlbmFtZSAqLwotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0KLQotLyoKLSAqIFRoZXNlIG1heSBhbHJlYWR5IGJlIGRlZmluZWQgb24gc29tZSBzeXN0ZW1zLiAgV2UgY291bGQgcHJvYmFibHkKLSAqIGp1c3QgdXNlIHRoZSBCRkQgdmVyc2lvbnMgb2YgdGhlc2UsIHNpbmNlIEJGRCBoYXMgYWxyZWFkeSBkZWFsdAotICogd2l0aCB0aGlzIHByb2JsZW0uCi0gKi8KLSN1bmRlZiBGQUxTRQotI2RlZmluZQlGQUxTRQkwCi0jdW5kZWYgVFJVRQotI2RlZmluZQlUUlVFCTEKLQotI2RlZmluZSBTVFlMRV9GTEFUX1BST0ZJTEUJKDE8PDApCi0jZGVmaW5lIFNUWUxFX0NBTExfR1JBUEgJKDE8PDEpCi0jZGVmaW5lIFNUWUxFX1NVTU1BUllfRklMRQkoMTw8MikKLSNkZWZpbmUgU1RZTEVfRVhFQ19DT1VOVFMJKDE8PDMpCi0jZGVmaW5lIFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0UJKDE8PDQpCi0jZGVmaW5lIFNUWUxFX0dNT05fSU5GTwkJKDE8PDUpCi0jZGVmaW5lIFNUWUxFX0ZVTkNUSU9OX09SREVSCSgxPDw2KQotI2RlZmluZSBTVFlMRV9GSUxFX09SREVSCSgxPDw3KQotCi0jZGVmaW5lCUFOWURFQlVHCSgxPDwwKQkvKiAgICAxICovCi0jZGVmaW5lCURGTkRFQlVHCSgxPDwxKQkvKiAgICAyICovCi0jZGVmaW5lCUNZQ0xFREVCVUcJKDE8PDIpCS8qICAgIDQgKi8KLSNkZWZpbmUJQVJDREVCVUcJKDE8PDMpCS8qICAgIDggKi8KLSNkZWZpbmUJVEFMTFlERUJVRwkoMTw8NCkJLyogICAxNiAqLwotI2RlZmluZQlUSU1FREVCVUcJKDE8PDUpCS8qICAgMzIgKi8KLSNkZWZpbmUJU0FNUExFREVCVUcJKDE8PDYpCS8qICAgNjQgKi8KLSNkZWZpbmUJQU9VVERFQlVHCSgxPDw3KQkvKiAgMTI4ICovCi0jZGVmaW5lCUNBTExERUJVRwkoMTw8OCkJLyogIDI1NiAqLwotI2RlZmluZQlMT09LVVBERUJVRwkoMTw8OSkJLyogIDUxMiAqLwotI2RlZmluZQlQUk9QREVCVUcJKDE8PDEwKQkvKiAxMDI0ICovCi0jZGVmaW5lIEJCREVCVUcJCSgxPDwxMSkJLyogMjA0OCAqLwotI2RlZmluZSBJRERFQlVHCQkoMTw8MTIpCS8qIDQwOTYgKi8KLSNkZWZpbmUgU1JDREVCVUcJKDE8PDEzKQkvKiA4MTkyICovCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcobCxzKQlpZiAoZGVidWdfbGV2ZWwgJiAobCkpIHtzO30KLSNlbHNlCi0jZGVmaW5lIERCRyhsLHMpCi0jZW5kaWYKLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBGRl9BVVRPID0gMCwgRkZfTUFHSUMsIEZGX0JTRCwgRkZfQlNENDQsIEZGX1BST0YKLSAgfQotRmlsZV9Gb3JtYXQ7Ci0KLXR5cGVkZWYgaW50IGJvb2w7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVU5JVFsyXTsJLyogdW5pdCBvZiBwcm9maWxpbmcgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKndob2FtaTsJLyogY29tbWFuZC1uYW1lLCBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLWV4dGVybiBjb25zdCBjaGFyICpmdW5jdGlvbl9tYXBwaW5nX2ZpbGU7IC8qIGZpbGUgbWFwcGluZyBmdW5jdGlvbnMgdG8gZmlsZXMgKi8KLWV4dGVybiBjb25zdCBjaGFyICphX291dF9uYW1lOwkvKiBjb3JlIGZpbGVuYW1lICovCi1leHRlcm4gbG9uZyBoejsJCQkvKiB0aWNrcyBwZXIgc2Vjb25kICovCi0KLS8qCi0gKiBDb21tYW5kLWxpbmUgb3B0aW9uczoKLSAqLwotZXh0ZXJuIGludCBkZWJ1Z19sZXZlbDsJCS8qIGRlYnVnIGxldmVsICovCi1leHRlcm4gaW50IG91dHB1dF9zdHlsZTsKLWV4dGVybiBpbnQgb3V0cHV0X3dpZHRoOwkvKiBjb250cm9scyBjb2x1bW4gd2lkdGggaW4gaW5kZXggKi8KLWV4dGVybiBib29sIGJzZF9zdHlsZV9vdXRwdXQ7CS8qIGFzIG9wcG9zZWQgdG8gRlNGIHN0eWxlIG91dHB1dCAqLwotZXh0ZXJuIGJvb2wgZGVtYW5nbGU7CQkvKiBkZW1hbmdsZSBzeW1ib2wgbmFtZXM/ICovCi1leHRlcm4gYm9vbCBkaXNjYXJkX3VuZGVyc2NvcmVzOwkvKiBkaXNjYXJkIGxlYWRpbmcgdW5kZXJzY29yZXM/ICovCi1leHRlcm4gYm9vbCBpZ25vcmVfZGlyZWN0X2NhbGxzOwkvKiBkb24ndCBjb3VudCBkaXJlY3QgY2FsbHMgKi8KLWV4dGVybiBib29sIGlnbm9yZV9zdGF0aWNfZnVuY3M7CS8qIHN1cHByZXNzIHN0YXRpYyBmdW5jdGlvbnMgKi8KLWV4dGVybiBib29sIGlnbm9yZV96ZXJvczsJLyogaWdub3JlIHVudXNlZCBzeW1ib2xzL2ZpbGVzICovCi1leHRlcm4gYm9vbCBsaW5lX2dyYW51bGFyaXR5OwkvKiBmdW5jdGlvbiBvciBsaW5lIGdyYW51bGFyaXR5PyAqLwotZXh0ZXJuIGJvb2wgcHJpbnRfZGVzY3JpcHRpb25zOwkvKiBvdXRwdXQgcHJvZmlsZSBkZXNjcmlwdGlvbiAqLwotZXh0ZXJuIGJvb2wgcHJpbnRfcGF0aDsJCS8qIHByaW50IHBhdGggb3IganVzdCBmaWxlbmFtZT8gKi8KLWV4dGVybiBib29sIGlnbm9yZV9ub25fZnVuY3Rpb25zOy8qIElnbm9yZSBub24tZnVuY3Rpb24gc3ltYm9scy4gICovCi0KLWV4dGVybiBGaWxlX0Zvcm1hdCBmaWxlX2Zvcm1hdDsJLyogcmVxdWVzdGVkIGZpbGUgZm9ybWF0ICovCi0KLWV4dGVybiBib29sIGZpcnN0X291dHB1dDsJLyogbm8gb3V0cHV0IHNvIGZhcj8gKi8KLQotZXh0ZXJuIHZvaWQgZG9uZSBQQVJBTVMgKChpbnQgc3RhdHVzKSk7Ci0KLSNlbmRpZiAvKiBncHJvZl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9ncHJvZi50ZXhpIGIvZ3Byb2YvZ3Byb2YudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2MDZiNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9ncHJvZi50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjAyOCArMCwwIEBACi1caW5wdXQgdGV4aW5mbyBAYyAtKi10ZXhpbmZvLSotCi1Ac2V0ZmlsZW5hbWUgZ3Byb2YuaW5mbwotQHNldHRpdGxlIEdOVSBncHJvZgotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotCi1AaWZpbmZvCi1AYyBUaGlzIGlzIGEgZGlyLmluZm8gZnJhZ21lbnQgdG8gc3VwcG9ydCBzZW1pLWF1dG9tYXRlZCBhZGRpdGlvbiBvZgotQGMgbWFudWFscyB0byBhbiBpbmZvIHRyZWUuICB6b29AY3lnbnVzLmNvbSBpcyBkZXZlbG9waW5nIHRoaXMgZmFjaWxpdHkuCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBncHJvZjogKGdwcm9mKS4gICAgICAgICAgICAgICAgUHJvZmlsaW5nIHlvdXIgcHJvZ3JhbSdzIGV4ZWN1dGlvbgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgZ3Byb2YgcHJvZmlsZXIgb2YgdGhlIEdOVSBzeXN0ZW0uCi0KLUNvcHlyaWdodCAoQykgMTk4OCwgMTk5MiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUBmaW5hbG91dAotQHNtYWxsYm9vawotCi1AdGl0bGVwYWdlCi1AdGl0bGUgR05VIGdwcm9mCi1Ac3VidGl0bGUgVGhlIEBzY3tnbnV9IFByb2ZpbGVyIAotQGF1dGhvciBKYXkgRmVubGFzb24gYW5kIFJpY2hhcmQgU3RhbGxtYW4KLQotQHBhZ2UKLQotVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSBAc2N7Z251fSBwcm9maWxlciwgQGNvZGV7Z3Byb2Z9LCBhbmQgaG93IHlvdQotY2FuIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hpY2ggcGFydHMgb2YgYSBwcm9ncmFtIGFyZSB0YWtpbmcgbW9zdCBvZiB0aGUKLWV4ZWN1dGlvbiB0aW1lLiAgV2UgYXNzdW1lIHRoYXQgeW91IGtub3cgaG93IHRvIHdyaXRlLCBjb21waWxlLCBhbmQKLWV4ZWN1dGUgcHJvZ3JhbXMuICBAc2N7Z251fSBAY29kZXtncHJvZn0gd2FzIHdyaXR0ZW4gYnkgSmF5IEZlbmxhc29uLgotCi1UaGlzIG1hbnVhbCB3YXMgZWRpdGVkIEphbnVhcnkgMTk5MyBieSBKZWZmcmV5IE9zaWVyCi1hbmQgdXBkYXRlZCBTZXB0ZW1iZXIgMTk5NyBieSBCcmVudCBCYWNjYWxhLgotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5ODgsIDE5OTIsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIGFzIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLQotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFByb2ZpbGluZyBhIFByb2dyYW06IFdoZXJlIERvZXMgSXQgU3BlbmQgSXRzIFRpbWU/Ci0KLVRoaXMgbWFudWFsIGRlc2NyaWJlcyB0aGUgQHNje2dudX0gcHJvZmlsZXIsIEBjb2Rle2dwcm9mfSwgYW5kIGhvdyB5b3UKLWNhbiB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhcnRzIG9mIGEgcHJvZ3JhbSBhcmUgdGFraW5nIG1vc3Qgb2YgdGhlCi1leGVjdXRpb24gdGltZS4gIFdlIGFzc3VtZSB0aGF0IHlvdSBrbm93IGhvdyB0byB3cml0ZSwgY29tcGlsZSwgYW5kCi1leGVjdXRlIHByb2dyYW1zLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHdhcyB3cml0dGVuIGJ5IEpheSBGZW5sYXNvbi4KLQotVGhpcyBtYW51YWwgd2FzIHVwZGF0ZWQgQXVndXN0IDE5OTcgYnkgQnJlbnQgQmFjY2FsYS4KLQotQG1lbnUKLSogSW50cm9kdWN0aW9uOjogICAgICAgIFdoYXQgcHJvZmlsaW5nIG1lYW5zLCBhbmQgd2h5IGl0IGlzIHVzZWZ1bC4KLQotKiBDb21waWxpbmc6OiAgICAgICAgICAgSG93IHRvIGNvbXBpbGUgeW91ciBwcm9ncmFtIGZvciBwcm9maWxpbmcuCi0qIEV4ZWN1dGluZzo6ICAgICAgICAgICBFeGVjdXRpbmcgeW91ciBwcm9ncmFtIHRvIGdlbmVyYXRlIHByb2ZpbGUgZGF0YQotKiBJbnZva2luZzo6ICAgICAgICAgICAgSG93IHRvIHJ1biBAY29kZXtncHJvZn0sIGFuZCBpdHMgb3B0aW9ucwotCi0qIE91dHB1dDo6CQlJbnRlcnByZXRpbmcgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0Ci0KLSogSW5hY2N1cmFjeTo6ICAgICAgICAgIFBvdGVudGlhbCBwcm9ibGVtcyB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mCi0qIEhvdyBkbyBJPzo6ICAgICAgICAgICBBbnN3ZXJzIHRvIGNvbW1vbiBxdWVzdGlvbnMKLSogSW5jb21wYXRpYmlsaXRpZXM6OiAgIChiZXR3ZWVuIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBhbmQgVW5peCBAY29kZXtncHJvZn0uKQotKiBEZXRhaWxzOjogICAgICAgICAgICAgRGV0YWlscyBvZiBob3cgcHJvZmlsaW5nIGlzIGRvbmUKLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgSW50cm9kdWN0aW9uCi1AY2hhcHRlciBJbnRyb2R1Y3Rpb24gdG8gUHJvZmlsaW5nCi0KLVByb2ZpbGluZyBhbGxvd3MgeW91IHRvIGxlYXJuIHdoZXJlIHlvdXIgcHJvZ3JhbSBzcGVudCBpdHMgdGltZSBhbmQgd2hpY2gKLWZ1bmN0aW9ucyBjYWxsZWQgd2hpY2ggb3RoZXIgZnVuY3Rpb25zIHdoaWxlIGl0IHdhcyBleGVjdXRpbmcuICBUaGlzCi1pbmZvcm1hdGlvbiBjYW4gc2hvdyB5b3Ugd2hpY2ggcGllY2VzIG9mIHlvdXIgcHJvZ3JhbSBhcmUgc2xvd2VyIHRoYW4geW91Ci1leHBlY3RlZCwgYW5kIG1pZ2h0IGJlIGNhbmRpZGF0ZXMgZm9yIHJld3JpdGluZyB0byBtYWtlIHlvdXIgcHJvZ3JhbQotZXhlY3V0ZSBmYXN0ZXIuICBJdCBjYW4gYWxzbyB0ZWxsIHlvdSB3aGljaCBmdW5jdGlvbnMgYXJlIGJlaW5nIGNhbGxlZCBtb3JlCi1vciBsZXNzIG9mdGVuIHRoYW4geW91IGV4cGVjdGVkLiAgVGhpcyBtYXkgaGVscCB5b3Ugc3BvdCBidWdzIHRoYXQgaGFkCi1vdGhlcndpc2UgYmVlbiB1bm5vdGljZWQuCi0KLVNpbmNlIHRoZSBwcm9maWxlciB1c2VzIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBkdXJpbmcgdGhlIGFjdHVhbCBleGVjdXRpb24KLW9mIHlvdXIgcHJvZ3JhbSwgaXQgY2FuIGJlIHVzZWQgb24gcHJvZ3JhbXMgdGhhdCBhcmUgdG9vIGxhcmdlIG9yIHRvbwotY29tcGxleCB0byBhbmFseXplIGJ5IHJlYWRpbmcgdGhlIHNvdXJjZS4gIEhvd2V2ZXIsIGhvdyB5b3VyIHByb2dyYW0gaXMgcnVuCi13aWxsIGFmZmVjdCB0aGUgaW5mb3JtYXRpb24gdGhhdCBzaG93cyB1cCBpbiB0aGUgcHJvZmlsZSBkYXRhLiAgSWYgeW91Ci1kb24ndCB1c2Ugc29tZSBmZWF0dXJlIG9mIHlvdXIgcHJvZ3JhbSB3aGlsZSBpdCBpcyBiZWluZyBwcm9maWxlZCwgbm8KLXByb2ZpbGUgaW5mb3JtYXRpb24gd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoYXQgZmVhdHVyZS4KLQotUHJvZmlsaW5nIGhhcyBzZXZlcmFsIHN0ZXBzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotWW91IG11c3QgY29tcGlsZSBhbmQgbGluayB5b3VyIHByb2dyYW0gd2l0aCBwcm9maWxpbmcgZW5hYmxlZC4KLUB4cmVme0NvbXBpbGluZ30uCi0KLUBpdGVtCi1Zb3UgbXVzdCBleGVjdXRlIHlvdXIgcHJvZ3JhbSB0byBnZW5lcmF0ZSBhIHByb2ZpbGUgZGF0YSBmaWxlLgotQHhyZWZ7RXhlY3V0aW5nfS4KLQotQGl0ZW0KLVlvdSBtdXN0IHJ1biBAY29kZXtncHJvZn0gdG8gYW5hbHl6ZSB0aGUgcHJvZmlsZSBkYXRhLgotQHhyZWZ7SW52b2tpbmd9LgotQGVuZCBpdGVtaXplCi0KLVRoZSBuZXh0IHRocmVlIGNoYXB0ZXJzIGV4cGxhaW4gdGhlc2Ugc3RlcHMgaW4gZ3JlYXRlciBkZXRhaWwuCi0KLVNldmVyYWwgZm9ybXMgb2Ygb3V0cHV0IGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgYW5hbHlzaXMuCi0KLVRoZSBAZGZue2ZsYXQgcHJvZmlsZX0gc2hvd3MgaG93IG11Y2ggdGltZSB5b3VyIHByb2dyYW0gc3BlbnQgaW4gZWFjaCBmdW5jdGlvbiwKLWFuZCBob3cgbWFueSB0aW1lcyB0aGF0IGZ1bmN0aW9uIHdhcyBjYWxsZWQuICBJZiB5b3Ugc2ltcGx5IHdhbnQgdG8ga25vdwotd2hpY2ggZnVuY3Rpb25zIGJ1cm4gbW9zdCBvZiB0aGUgY3ljbGVzLCBpdCBpcyBzdGF0ZWQgY29uY2lzZWx5IGhlcmUuCi1AeHJlZntGbGF0IFByb2ZpbGV9LgotCi1UaGUgQGRmbntjYWxsIGdyYXBofSBzaG93cywgZm9yIGVhY2ggZnVuY3Rpb24sIHdoaWNoIGZ1bmN0aW9ucyBjYWxsZWQgaXQsIHdoaWNoCi1vdGhlciBmdW5jdGlvbnMgaXQgY2FsbGVkLCBhbmQgaG93IG1hbnkgdGltZXMuICBUaGVyZSBpcyBhbHNvIGFuIGVzdGltYXRlCi1vZiBob3cgbXVjaCB0aW1lIHdhcyBzcGVudCBpbiB0aGUgc3Vicm91dGluZXMgb2YgZWFjaCBmdW5jdGlvbi4gIFRoaXMgY2FuCi1zdWdnZXN0IHBsYWNlcyB3aGVyZSB5b3UgbWlnaHQgdHJ5IHRvIGVsaW1pbmF0ZSBmdW5jdGlvbiBjYWxscyB0aGF0IHVzZSBhCi1sb3Qgb2YgdGltZS4gIEB4cmVme0NhbGwgR3JhcGh9LgotCi1UaGUgQGRmbnthbm5vdGF0ZWQgc291cmNlfSBsaXN0aW5nIGlzIGEgY29weSBvZiB0aGUgcHJvZ3JhbSdzCi1zb3VyY2UgY29kZSwgbGFiZWxlZCB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBsaW5lIG9mIHRoZQotcHJvZ3JhbSB3YXMgZXhlY3V0ZWQuICBAeHJlZntBbm5vdGF0ZWQgU291cmNlfS4KLQotVG8gYmV0dGVyIHVuZGVyc3RhbmQgaG93IHByb2ZpbGluZyB3b3JrcywgeW91IG1heSB3aXNoIHRvIHJlYWQKLWEgZGVzY3JpcHRpb24gb2YgaXRzIGltcGxlbWVudGF0aW9uLgotQHhyZWZ7SW1wbGVtZW50YXRpb259LgotCi1Abm9kZSBDb21waWxpbmcKLUBjaGFwdGVyIENvbXBpbGluZyBhIFByb2dyYW0gZm9yIFByb2ZpbGluZwotCi1UaGUgZmlyc3Qgc3RlcCBpbiBnZW5lcmF0aW5nIHByb2ZpbGUgaW5mb3JtYXRpb24gZm9yIHlvdXIgcHJvZ3JhbSBpcwotdG8gY29tcGlsZSBhbmQgbGluayBpdCB3aXRoIHByb2ZpbGluZyBlbmFibGVkLgotCi1UbyBjb21waWxlIGEgc291cmNlIGZpbGUgZm9yIHByb2ZpbGluZywgc3BlY2lmeSB0aGUgQHNhbXB7LXBnfSBvcHRpb24gd2hlbgoteW91IHJ1biB0aGUgY29tcGlsZXIuICAoVGhpcyBpcyBpbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyB5b3Ugbm9ybWFsbHkKLXVzZS4pCi0KLVRvIGxpbmsgdGhlIHByb2dyYW0gZm9yIHByb2ZpbGluZywgaWYgeW91IHVzZSBhIGNvbXBpbGVyIHN1Y2ggYXMgQGNvZGV7Y2N9Ci10byBkbyB0aGUgbGlua2luZywgc2ltcGx5IHNwZWNpZnkgQHNhbXB7LXBnfSBpbiBhZGRpdGlvbiB0byB5b3VyIHVzdWFsCi1vcHRpb25zLiAgVGhlIHNhbWUgb3B0aW9uLCBAc2FtcHstcGd9LCBhbHRlcnMgZWl0aGVyIGNvbXBpbGF0aW9uIG9yIGxpbmtpbmcKLXRvIGRvIHdoYXQgaXMgbmVjZXNzYXJ5IGZvciBwcm9maWxpbmcuICBIZXJlIGFyZSBleGFtcGxlczoKLQotQGV4YW1wbGUKLWNjIC1nIC1jIG15cHJvZy5jIHV0aWxzLmMgLXBnCi1jYyAtbyBteXByb2cgbXlwcm9nLm8gdXRpbHMubyAtcGcKLUBlbmQgZXhhbXBsZQotCi1UaGUgQHNhbXB7LXBnfSBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIGEgY29tbWFuZCB0aGF0IGJvdGggY29tcGlsZXMgYW5kIGxpbmtzOgotCi1AZXhhbXBsZQotY2MgLW8gbXlwcm9nIG15cHJvZy5jIHV0aWxzLmMgLWcgLXBnCi1AZW5kIGV4YW1wbGUKLQotSWYgeW91IHJ1biB0aGUgbGlua2VyIEBjb2Rle2xkfSBkaXJlY3RseSBpbnN0ZWFkIG9mIHRocm91Z2ggYSBjb21waWxlcgotc3VjaCBhcyBAY29kZXtjY30sIHlvdSBtYXkgaGF2ZSB0byBzcGVjaWZ5IGEgcHJvZmlsaW5nIHN0YXJ0dXAgZmlsZQotQGZpbGV7Z2NydDAub30gYXMgdGhlIGZpcnN0IGlucHV0IGZpbGUgaW5zdGVhZCBvZiB0aGUgdXN1YWwgc3RhcnR1cAotZmlsZSBAZmlsZXtjcnQwLm99LiAgSW4gYWRkaXRpb24sIHlvdSB3b3VsZCBwcm9iYWJseSB3YW50IHRvCi1zcGVjaWZ5IHRoZSBwcm9maWxpbmcgQyBsaWJyYXJ5LCBAZmlsZXtsaWJjX3AuYX0sIGJ5IHdyaXRpbmcKLUBzYW1wey1sY19wfSBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBAc2FtcHstbGN9LiAgVGhpcyBpcyBub3QgYWJzb2x1dGVseQotbmVjZXNzYXJ5LCBidXQgZG9pbmcgdGhpcyBnaXZlcyB5b3UgbnVtYmVyLW9mLWNhbGxzIGluZm9ybWF0aW9uIGZvcgotc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMgc3VjaCBhcyBAY29kZXtyZWFkfSBhbmQgQGNvZGV7b3Blbn0uICBGb3IKLWV4YW1wbGU6Ci0KLUBleGFtcGxlCi1sZCAtbyBteXByb2cgL2xpYi9nY3J0MC5vIG15cHJvZy5vIHV0aWxzLm8gLWxjX3AKLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgY29tcGlsZSBvbmx5IHNvbWUgb2YgdGhlIG1vZHVsZXMgb2YgdGhlIHByb2dyYW0gd2l0aCBAc2FtcHstcGd9LCB5b3UKLWNhbiBzdGlsbCBwcm9maWxlIHRoZSBwcm9ncmFtLCBidXQgeW91IHdvbid0IGdldCBjb21wbGV0ZSBpbmZvcm1hdGlvbiBhYm91dAotdGhlIG1vZHVsZXMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGhvdXQgQHNhbXB7LXBnfS4gIFRoZSBvbmx5IGluZm9ybWF0aW9uCi15b3UgZ2V0IGZvciB0aGUgZnVuY3Rpb25zIGluIHRob3NlIG1vZHVsZXMgaXMgdGhlIHRvdGFsIHRpbWUgc3BlbnQgaW4gdGhlbTsKLXRoZXJlIGlzIG5vIHJlY29yZCBvZiBob3cgbWFueSB0aW1lcyB0aGV5IHdlcmUgY2FsbGVkLCBvciBmcm9tIHdoZXJlLiAgVGhpcwotd2lsbCBub3QgYWZmZWN0IHRoZSBmbGF0IHByb2ZpbGUgKGV4Y2VwdCB0aGF0IHRoZSBAY29kZXtjYWxsc30gZmllbGQgZm9yCi10aGUgZnVuY3Rpb25zIHdpbGwgYmUgYmxhbmspLCBidXQgd2lsbCBncmVhdGx5IHJlZHVjZSB0aGUgdXNlZnVsbmVzcyBvZiB0aGUKLWNhbGwgZ3JhcGguCi0KLUlmIHlvdSB3aXNoIHRvIHBlcmZvcm0gbGluZS1ieS1saW5lIHByb2ZpbGluZywKLXlvdSB3aWxsIGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBAc2FtcHstZ30gb3B0aW9uLAotaW5zdHJ1Y3RpbmcgdGhlIGNvbXBpbGVyIHRvIGluc2VydCBkZWJ1Z2dpbmcgc3ltYm9scyBpbnRvIHRoZSBwcm9ncmFtCi10aGF0IG1hdGNoIHByb2dyYW0gYWRkcmVzc2VzIHRvIHNvdXJjZSBjb2RlIGxpbmVzLgotQHhyZWZ7TGluZS1ieS1saW5lfS4KLQotSW4gYWRkaXRpb24gdG8gdGhlIEBzYW1wey1wZ30gYW5kIEBzYW1wey1nfSBvcHRpb25zLAoteW91IG1heSBhbHNvIHdpc2ggdG8gc3BlY2lmeSB0aGUgQHNhbXB7LWF9IG9wdGlvbiB3aGVuIGNvbXBpbGluZy4KLVRoaXMgd2lsbCBpbnN0cnVtZW50Ci10aGUgcHJvZ3JhbSB0byBwZXJmb3JtIGJhc2ljLWJsb2NrIGNvdW50aW5nLiAgQXMgdGhlIHByb2dyYW0gcnVucywKLWl0IHdpbGwgY291bnQgaG93IG1hbnkgdGltZXMgaXQgZXhlY3V0ZWQgZWFjaCBicmFuY2ggb2YgZWFjaCBAc2FtcHtpZn0KLXN0YXRlbWVudCwgZWFjaCBpdGVyYXRpb24gb2YgZWFjaCBAc2FtcHtkb30gbG9vcCwgZXRjLiAgVGhpcyB3aWxsCi1lbmFibGUgQGNvZGV7Z3Byb2Z9IHRvIGNvbnN0cnVjdCBhbiBhbm5vdGF0ZWQgc291cmNlIGNvZGUKLWxpc3Rpbmcgc2hvd2luZyBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUgb2YgY29kZSB3YXMgZXhlY3V0ZWQuCi0KLUBub2RlIEV4ZWN1dGluZwotQGNoYXB0ZXIgRXhlY3V0aW5nIHRoZSBQcm9ncmFtCi0KLU9uY2UgdGhlIHByb2dyYW0gaXMgY29tcGlsZWQgZm9yIHByb2ZpbGluZywgeW91IG11c3QgcnVuIGl0IGluIG9yZGVyIHRvCi1nZW5lcmF0ZSB0aGUgaW5mb3JtYXRpb24gdGhhdCBAY29kZXtncHJvZn0gbmVlZHMuICBTaW1wbHkgcnVuIHRoZSBwcm9ncmFtCi1hcyB1c3VhbCwgdXNpbmcgdGhlIG5vcm1hbCBhcmd1bWVudHMsIGZpbGUgbmFtZXMsIGV0Yy4gIFRoZSBwcm9ncmFtIHNob3VsZAotcnVuIG5vcm1hbGx5LCBwcm9kdWNpbmcgdGhlIHNhbWUgb3V0cHV0IGFzIHVzdWFsLiAgSXQgd2lsbCwgaG93ZXZlciwgcnVuCi1zb21ld2hhdCBzbG93ZXIgdGhhbiBub3JtYWwgYmVjYXVzZSBvZiB0aGUgdGltZSBzcGVudCBjb2xsZWN0aW5nIGFuZCB0aGUKLXdyaXRpbmcgdGhlIHByb2ZpbGUgZGF0YS4KLQotVGhlIHdheSB5b3UgcnVuIHRoZSBwcm9ncmFtLS0tdGhlIGFyZ3VtZW50cyBhbmQgaW5wdXQgdGhhdCB5b3UgZ2l2ZQotaXQtLS1tYXkgaGF2ZSBhIGRyYW1hdGljIGVmZmVjdCBvbiB3aGF0IHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHNob3dzLiAgVGhlCi1wcm9maWxlIGRhdGEgd2lsbCBkZXNjcmliZSB0aGUgcGFydHMgb2YgdGhlIHByb2dyYW0gdGhhdCB3ZXJlIGFjdGl2YXRlZCBmb3IKLXRoZSBwYXJ0aWN1bGFyIGlucHV0IHlvdSB1c2UuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpcnN0IGNvbW1hbmQgeW91IGdpdmUKLXRvIHlvdXIgcHJvZ3JhbSBpcyB0byBxdWl0LCB0aGUgcHJvZmlsZSBkYXRhIHdpbGwgc2hvdyB0aGUgdGltZSB1c2VkIGluCi1pbml0aWFsaXphdGlvbiBhbmQgaW4gY2xlYW51cCwgYnV0IG5vdCBtdWNoIGVsc2UuCi0KLVlvdXIgcHJvZ3JhbSB3aWxsIHdyaXRlIHRoZSBwcm9maWxlIGRhdGEgaW50byBhIGZpbGUgY2FsbGVkIEBmaWxle2dtb24ub3V0fQotanVzdCBiZWZvcmUgZXhpdGluZy4gIElmIHRoZXJlIGlzIGFscmVhZHkgYSBmaWxlIGNhbGxlZCBAZmlsZXtnbW9uLm91dH0sCi1pdHMgY29udGVudHMgYXJlIG92ZXJ3cml0dGVuLiAgVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byB0ZWxsIHRoZQotcHJvZ3JhbSB0byB3cml0ZSB0aGUgcHJvZmlsZSBkYXRhIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIGJ1dCB5b3UgY2FuIHJlbmFtZQotdGhlIGZpbGUgYWZ0ZXJ3YXJkIGlmIHlvdSBhcmUgY29uY2VybmVkIHRoYXQgaXQgbWF5IGJlIG92ZXJ3cml0dGVuLgotCi1JbiBvcmRlciB0byB3cml0ZSB0aGUgQGZpbGV7Z21vbi5vdXR9IGZpbGUgcHJvcGVybHksIHlvdXIgcHJvZ3JhbSBtdXN0IGV4aXQKLW5vcm1hbGx5OiBieSByZXR1cm5pbmcgZnJvbSBAY29kZXttYWlufSBvciBieSBjYWxsaW5nIEBjb2Rle2V4aXR9LiAgQ2FsbGluZwotdGhlIGxvdy1sZXZlbCBmdW5jdGlvbiBAY29kZXtfZXhpdH0gZG9lcyBub3Qgd3JpdGUgdGhlIHByb2ZpbGUgZGF0YSwgYW5kCi1uZWl0aGVyIGRvZXMgYWJub3JtYWwgdGVybWluYXRpb24gZHVlIHRvIGFuIHVuaGFuZGxlZCBzaWduYWwuCi0KLVRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSBpcyB3cml0dGVuIGluIHRoZSBwcm9ncmFtJ3MgQGVtcGh7Y3VycmVudCB3b3JraW5nCi1kaXJlY3Rvcnl9IGF0IHRoZSB0aW1lIGl0IGV4aXRzLiAgVGhpcyBtZWFucyB0aGF0IGlmIHlvdXIgcHJvZ3JhbSBjYWxscwotQGNvZGV7Y2hkaXJ9LCB0aGUgQGZpbGV7Z21vbi5vdXR9IGZpbGUgd2lsbCBiZSBsZWZ0IGluIHRoZSBsYXN0IGRpcmVjdG9yeQoteW91ciBwcm9ncmFtIEBjb2Rle2NoZGlyfSdkIHRvLiAgSWYgeW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byB3cml0ZSBpbgotdGhpcyBkaXJlY3RvcnksIHRoZSBmaWxlIGlzIG5vdCB3cml0dGVuLCBhbmQgeW91IHdpbGwgZ2V0IGFuIGVycm9yIG1lc3NhZ2UuCi0KLU9sZGVyIHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBwcm9maWxpbmcgbGlicmFyeSBtYXkgYWxzbyB3cml0ZSBhIGZpbGUKLWNhbGxlZCBAZmlsZXtiYi5vdXR9LiAgVGhpcyBmaWxlLCBpZiBwcmVzZW50LCBjb250YWlucyBhbiBodW1hbi1yZWFkYWJsZQotbGlzdGluZyBvZiB0aGUgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cy4gIFVuZm9ydHVuYXRlbHksIHRoZQotYXBwZWFyYW5jZSBvZiBhIGh1bWFuLXJlYWRhYmxlIEBmaWxle2JiLm91dH0gbWVhbnMgdGhlIGJhc2ljLWJsb2NrCi1jb3VudHMgZGlkbid0IGdldCB3cml0dGVuIGludG8gQGZpbGV7Z21vbi5vdXR9LgotVGhlIFBlcmwgc2NyaXB0IEBjb2Rle2JiY29udi5wbH0sIGluY2x1ZGVkIHdpdGggdGhlIEBjb2Rle2dwcm9mfQotc291cmNlIGRpc3RyaWJ1dGlvbiwgd2lsbCBjb252ZXJ0IGEgQGZpbGV7YmIub3V0fSBmaWxlIGludG8KLWEgZm9ybWF0IHJlYWRhYmxlIGJ5IEBjb2Rle2dwcm9mfS4KLQotQG5vZGUgSW52b2tpbmcKLUBjaGFwdGVyIEBjb2Rle2dwcm9mfSBDb21tYW5kIFN1bW1hcnkKLQotQWZ0ZXIgeW91IGhhdmUgYSBwcm9maWxlIGRhdGEgZmlsZSBAZmlsZXtnbW9uLm91dH0sIHlvdSBjYW4gcnVuIEBjb2Rle2dwcm9mfQotdG8gaW50ZXJwcmV0IHRoZSBpbmZvcm1hdGlvbiBpbiBpdC4gIFRoZSBAY29kZXtncHJvZn0gcHJvZ3JhbSBwcmludHMgYQotZmxhdCBwcm9maWxlIGFuZCBhIGNhbGwgZ3JhcGggb24gc3RhbmRhcmQgb3V0cHV0LiAgVHlwaWNhbGx5IHlvdSB3b3VsZAotcmVkaXJlY3QgdGhlIG91dHB1dCBvZiBAY29kZXtncHJvZn0gaW50byBhIGZpbGUgd2l0aCBAc2FtcHs+fS4KLQotWW91IHJ1biBAY29kZXtncHJvZn0gbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi1ncHJvZiBAdmFye29wdGlvbnN9IFtAdmFye2V4ZWN1dGFibGUtZmlsZX0gW0B2YXJ7cHJvZmlsZS1kYXRhLWZpbGVzfUBkb3Rze31dXSBbPiBAdmFye291dGZpbGV9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1IZXJlIHNxdWFyZS1icmFja2V0cyBpbmRpY2F0ZSBvcHRpb25hbCBhcmd1bWVudHMuCi0KLUlmIHlvdSBvbWl0IHRoZSBleGVjdXRhYmxlIGZpbGUgbmFtZSwgdGhlIGZpbGUgQGZpbGV7YS5vdXR9IGlzIHVzZWQuICBJZgoteW91IGdpdmUgbm8gcHJvZmlsZSBkYXRhIGZpbGUgbmFtZSwgdGhlIGZpbGUgQGZpbGV7Z21vbi5vdXR9IGlzIHVzZWQuICBJZgotYW55IGZpbGUgaXMgbm90IGluIHRoZSBwcm9wZXIgZm9ybWF0LCBvciBpZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGUgZG9lcyBub3QKLWFwcGVhciB0byBiZWxvbmcgdG8gdGhlIGV4ZWN1dGFibGUgZmlsZSwgYW4gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkLgotCi1Zb3UgY2FuIGdpdmUgbW9yZSB0aGFuIG9uZSBwcm9maWxlIGRhdGEgZmlsZSBieSBlbnRlcmluZyBhbGwgdGhlaXIgbmFtZXMKLWFmdGVyIHRoZSBleGVjdXRhYmxlIGZpbGUgbmFtZTsgdGhlbiB0aGUgc3RhdGlzdGljcyBpbiBhbGwgdGhlIGRhdGEgZmlsZXMKLWFyZSBzdW1tZWQgdG9nZXRoZXIuCi0KLVRoZSBvcmRlciBvZiB0aGVzZSBvcHRpb25zIGRvZXMgbm90IG1hdHRlci4KLQotQG1lbnUKLSogT3V0cHV0IE9wdGlvbnM6OiAgICAgIENvbnRyb2xsaW5nIEBjb2Rle2dwcm9mfSdzIG91dHB1dCBzdHlsZQotKiBBbmFseXNpcyBPcHRpb25zOjogICAgQ29udHJvbGxpbmcgaG93IEBjb2Rle2dwcm9mfSBhbmFseXNlcyBpdHMgZGF0YQotKiBNaXNjZWxsYW5lb3VzIE9wdGlvbnM6OgotKiBEZXByaWNhdGVkIE9wdGlvbnM6OiAgT3B0aW9ucyB5b3Ugbm8gbG9uZ2VyIG5lZWQgdG8gdXNlLCBidXQgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkKLSogU3ltc3BlY3M6OiAgICAgICAgICAgIFNwZWNpZnlpbmcgZnVuY3Rpb25zIHRvIGluY2x1ZGUgb3IgZXhjbHVkZQotQGVuZCBtZW51Ci0KLUBub2RlIE91dHB1dCBPcHRpb25zLEFuYWx5c2lzIE9wdGlvbnMsLEludm9raW5nCi1Ac2VjdGlvbiBPdXRwdXQgT3B0aW9ucwotCi1UaGVzZSBvcHRpb25zIHNwZWNpZnkgd2hpY2ggb2Ygc2V2ZXJhbCBvdXRwdXQgZm9ybWF0cwotQGNvZGV7Z3Byb2Z9IHNob3VsZCBwcm9kdWNlLgotCi1NYW55IG9mIHRoZXNlIG9wdGlvbnMgdGFrZSBhbiBvcHRpb25hbCBAZGZue3N5bXNwZWN9IHRvIHNwZWNpZnkKLWZ1bmN0aW9ucyB0byBiZSBpbmNsdWRlZCBvciBleGNsdWRlZC4gIFRoZXNlIG9wdGlvbnMgY2FuIGJlCi1zcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHdpdGggZGlmZmVyZW50IHN5bXNwZWNzLCB0byBpbmNsdWRlCi1vciBleGNsdWRlIHNldHMgb2Ygc3ltYm9scy4gIEB4cmVme1N5bXNwZWNzfS4KLQotU3BlY2lmeWluZyBhbnkgb2YgdGhlc2Ugb3B0aW9ucyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgKEBzYW1wey1wIC1xfSksCi13aGljaCBwcmludHMgYSBmbGF0IHByb2ZpbGUgYW5kIGNhbGwgZ3JhcGggYW5hbHlzaXMKLWZvciBhbGwgZnVuY3Rpb25zLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLUFbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLWFubm90YXRlZC1zb3VyY2VbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LUF9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGFubm90YXRlZCBzb3VyY2UgY29kZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBvdXRwdXQgb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scy4KLUB4cmVme0Fubm90YXRlZCBTb3VyY2V9LgotCi1AaXRlbSAtYgotQGl0ZW14IC0tYnJpZWYKLUlmIHRoZSBAc2FtcHstYn0gb3B0aW9uIGlzIGdpdmVuLCBAY29kZXtncHJvZn0gZG9lc24ndCBwcmludCB0aGUKLXZlcmJvc2UgYmx1cmJzIHRoYXQgdHJ5IHRvIGV4cGxhaW4gdGhlIG1lYW5pbmcgb2YgYWxsIG9mIHRoZSBmaWVsZHMgaW4KLXRoZSB0YWJsZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaW50ZW5kIHRvIHByaW50IG91dCB0aGUgb3V0cHV0LCBvcgotYXJlIHRpcmVkIG9mIHNlZWluZyB0aGUgYmx1cmJzLgotCi1AaXRlbSAtQ1tAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tZXhlYy1jb3VudHNbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LUN9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvCi1wcmludCBhIHRhbGx5IG9mIGZ1bmN0aW9ucyBhbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHdhcyBjYWxsZWQuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgdGFsbHkgb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scy4KLQotSWYgdGhlIHByb2ZpbGUgZGF0YSBmaWxlIGNvbnRhaW5zIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZHMsIHNwZWNpZmluZwotdGhlIEBzYW1wey1sfSBvcHRpb24sIGFsb25nIHdpdGggQHNhbXB7LUN9LCB3aWxsIGNhdXNlIGJhc2ljLWJsb2NrCi1leGVjdXRpb24gY291bnRzIHRvIGJlIHRhbGxpZWQgYW5kIGRpc3BsYXllZC4KLQotQGl0ZW0gLWkKLUBpdGVteCAtLWZpbGUtaW5mbwotVGhlIEBzYW1wey1pfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBkaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24KLWFib3V0IHRoZSBwcm9maWxlIGRhdGEgZmlsZShzKSBhbmQgdGhlbiBleGl0LiAgVGhlIG51bWJlciBvZiBoaXN0b2dyYW0sCi1jYWxsIGdyYXBoLCBhbmQgYmFzaWMtYmxvY2sgY291bnQgcmVjb3JkcyBpcyBkaXNwbGF5ZWQuCi0KLUBpdGVtIC1JIEB2YXJ7ZGlyc30KLUBpdGVteCAtLWRpcmVjdG9yeS1wYXRoPUB2YXJ7ZGlyc30KLVRoZSBAc2FtcHstSX0gb3B0aW9uIHNwZWNpZmllcyBhIGxpc3Qgb2Ygc2VhcmNoIGRpcmVjdG9yaWVzIGluCi13aGljaCB0byBmaW5kIHNvdXJjZSBmaWxlcy4gIEVudmlyb25tZW50IHZhcmlhYmxlIEB2YXJ7R1BST0ZfUEFUSH0KLWNhbiBhbHNvIGJlIHVzZWQgdG8gY29udmVyeSB0aGlzIGluZm9ybWF0aW9uLgotVXNlZCBtb3N0bHkgZm9yIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0LgotCi1AaXRlbSAtSltAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tYW5ub3RhdGVkLXNvdXJjZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstSn0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gbm90IHRvCi1wcmludCBhbm5vdGF0ZWQgc291cmNlIGNvZGUuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgQGNvZGV7Z3Byb2Z9IHByaW50cyBhbm5vdGF0ZWQgc291cmNlLAotYnV0IGV4Y2x1ZGVzIG1hdGNoaW5nIHN5bWJvbHMuCi0KLUBpdGVtIC1MCi1AaXRlbXggLS1wcmludC1wYXRoCi1Ob3JtYWxseSwgc291cmNlIGZpbGVuYW1lcyBhcmUgcHJpbnRlZCB3aXRoIHRoZSBwYXRoCi1jb21wb25lbnQgc3VwcHJlc3NlZC4gIFRoZSBAc2FtcHstTH0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0KLXRvIHByaW50IHRoZSBmdWxsIHBhdGhuYW1lIG9mCi1zb3VyY2UgZmlsZW5hbWVzLCB3aGljaCBpcyBkZXRlcm1pbmVkCi1mcm9tIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgaW1hZ2UgZmlsZQotYW5kIGlzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbXBpbGVyCi13YXMgaW52b2tlZC4KLQotQGl0ZW0gLXBbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLWZsYXQtcHJvZmlsZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstcH0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYSBmbGF0IHByb2ZpbGUuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgZmxhdCBwcm9maWxlIG9ubHkgZm9yIG1hdGNoaW5nIHN5bWJvbHMuCi1AeHJlZntGbGF0IFByb2ZpbGV9LgotCi1AaXRlbSAtUFtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tZmxhdC1wcm9maWxlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1QfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdXBwcmVzcyBwcmludGluZyBhIGZsYXQgcHJvZmlsZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGEgZmxhdCBwcm9maWxlLAotYnV0IGV4Y2x1ZGVzIG1hdGNoaW5nIHN5bWJvbHMuCi0KLUBpdGVtIC1xW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1ncmFwaFs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstcX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgdGhlIGNhbGwgZ3JhcGggYW5hbHlzaXMuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgY2FsbCBncmFwaCBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzCi1hbmQgdGhlaXIgY2hpbGRyZW4uCi1AeHJlZntDYWxsIEdyYXBofS4KLQotQGl0ZW0gLVFbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLW5vLWdyYXBoWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1RfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdXBwcmVzcyBwcmludGluZyB0aGUKLWNhbGwgZ3JhcGguCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgQGNvZGV7Z3Byb2Z9IHByaW50cyBhIGNhbGwgZ3JhcGgsCi1idXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLXkKLUBpdGVteCAtLXNlcGFyYXRlLWZpbGVzCi1UaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi1Ob3JtYWxseSwgZ3Byb2YgcHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZmlsZXMKLXRvIHN0YW5kYXJkLW91dHB1dC4gIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwKLWFubm90YXRlZCBzb3VyY2UgZm9yIGEgZmlsZSBuYW1lZCBAZmlsZXtwYXRoL2ZpbGVuYW1lfQotaXMgZ2VuZXJhdGVkIGluIHRoZSBmaWxlIEBmaWxle2ZpbGVuYW1lLWFubn0uCi0KLUBpdGVtIC1aW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1leGVjLWNvdW50c1s9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstWn0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gbm90IHRvCi1wcmludCBhIHRhbGx5IG9mIGZ1bmN0aW9ucyBhbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHdhcyBjYWxsZWQuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgdGFsbHksIGJ1dCBleGNsdWRlIG1hdGNoaW5nIHN5bWJvbHMuCi0KLUBpdGVtIC0tZnVuY3Rpb24tb3JkZXJpbmcKLVRoZSBAc2FtcHstLWZ1bmN0aW9uLW9yZGVyaW5nfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBhCi1zdWdnZXN0ZWQgZnVuY3Rpb24gb3JkZXJpbmcgZm9yIHRoZSBwcm9ncmFtIGJhc2VkIG9uIHByb2ZpbGluZyBkYXRhLgotVGhpcyBvcHRpb24gc3VnZ2VzdHMgYW4gb3JkZXJpbmcgd2hpY2ggbWF5IGltcHJvdmUgcGFnaW5nLCB0bGIgYW5kCi1jYWNoZSBiZWhhdmlvciBmb3IgdGhlIHByb2dyYW0gb24gc3lzdGVtcyB3aGljaCBzdXBwb3J0IGFyYml0cmFyeQotb3JkZXJpbmcgb2YgZnVuY3Rpb25zIGluIGFuIGV4ZWN1dGFibGUuCi0KLVRoZSBleGFjdCBkZXRhaWxzIG9mIGhvdyB0byBmb3JjZSB0aGUgbGlua2VyIHRvIHBsYWNlIGZ1bmN0aW9ucwotaW4gYSBwYXJ0aWN1bGFyIG9yZGVyIGlzIHN5c3RlbSBkZXBlbmRlbnQgYW5kIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcwotbWFudWFsLgotCi1AaXRlbSAtLWZpbGUtb3JkZXJpbmcgQHZhcnttYXBfZmlsZX0KLVRoZSBAc2FtcHstLWZpbGUtb3JkZXJpbmd9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGEKLXN1Z2dlc3RlZCAubyBsaW5rIGxpbmUgb3JkZXJpbmcgZm9yIHRoZSBwcm9ncmFtIGJhc2VkIG9uIHByb2ZpbGluZyBkYXRhLgotVGhpcyBvcHRpb24gc3VnZ2VzdHMgYW4gb3JkZXJpbmcgd2hpY2ggbWF5IGltcHJvdmUgcGFnaW5nLCB0bGIgYW5kCi1jYWNoZSBiZWhhdmlvciBmb3IgdGhlIHByb2dyYW0gb24gc3lzdGVtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkKLW9yZGVyaW5nIG9mIGZ1bmN0aW9ucyBpbiBhbiBleGVjdXRhYmxlLgotCi1Vc2Ugb2YgdGhlIEBzYW1wey1hfSBhcmd1bWVudCBpcyBoaWdobHkgcmVjb21tZW5kZWQgd2l0aCB0aGlzIG9wdGlvbi4KLQotVGhlIEB2YXJ7bWFwX2ZpbGV9IGFyZ3VtZW50IGlzIGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdoaWNoIHByb3ZpZGVzCi1mdW5jdGlvbiBuYW1lIHRvIG9iamVjdCBmaWxlIG1hcHBpbmdzLiAgVGhlIGZvcm1hdCBvZiB0aGUgZmlsZSBpcyBzaW1pbGFyIHRvCi10aGUgb3V0cHV0IG9mIHRoZSBwcm9ncmFtIEBjb2Rle25tfS4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1jLXBhcnNlLm86MDAwMDAwMDAgVCB5eXBhcnNlCi1jLXBhcnNlLm86MDAwMDAwMDQgQyB5eWVycmZsYWcKLWMtbGFuZy5vOjAwMDAwMDAwIFQgbWF5YmVfb2JqY19tZXRob2RfbmFtZQotYy1sYW5nLm86MDAwMDAwMDAgVCBwcmludF9sYW5nX3N0YXRpc3RpY3MKLWMtbGFuZy5vOjAwMDAwMDAwIFQgcmVjb2duaXplX29iamNfa2V5d29yZAotYy1kZWNsLm86MDAwMDAwMDAgVCBwcmludF9sYW5nX2lkZW50aWZpZXIKLWMtZGVjbC5vOjAwMDAwMDAwIFQgcHJpbnRfbGFuZ190eXBlCi1AZG90c3t9Ci0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUdOVSBAY29kZXtubX0gQHNhbXB7LS1leHRlcm4tb25seX0gQHNhbXB7LS1kZWZpbmVkLW9ubHl9IEBzYW1wey12fSBAc2FtcHstLXByaW50LWZpbGUtbmFtZX0gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIEB2YXJ7bWFwX2ZpbGV9LgotCi1AaXRlbSAtVAotQGl0ZW14IC0tdHJhZGl0aW9uYWwKLVRoZSBAc2FtcHstVH0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgaXRzIG91dHB1dCBpbgotYGB0cmFkaXRpb25hbCcnIEJTRCBzdHlsZS4KLQotQGl0ZW0gLXcgQHZhcnt3aWR0aH0KLUBpdGVteCAtLXdpZHRoPUB2YXJ7d2lkdGh9Ci1TZXRzIHdpZHRoIG9mIG91dHB1dCBsaW5lcyB0byBAdmFye3dpZHRofS4KLUN1cnJlbnRseSBvbmx5IHVzZWQgd2hlbiBwcmludGluZyB0aGUgZnVuY3Rpb24gaW5kZXggYXQgdGhlIGJvdHRvbQotb2YgdGhlIGNhbGwgZ3JhcGguCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1hbGwtbGluZXMKLVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLUJ5IGRlZmF1bHQsIG9ubHkgdGhlIGxpbmVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBiYXNpYy1ibG9jawotYXJlIGFubm90YXRlZC4gIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgZXZlcnkgbGluZSBpbgotYSBiYXNpYy1ibG9jayBpcyBhbm5vdGF0ZWQgYnkgcmVwZWF0aW5nIHRoZSBhbm5vdGF0aW9uIGZvciB0aGUKLWZpcnN0IGxpbmUuICBUaGlzIGJlaGF2aW9yIGlzIHNpbWlsYXIgdG8gQGNvZGV7dGNvdn0ncyBAc2FtcHstYX0uCi0KLUBpdGVtIC0tZGVtYW5nbGUKLUBpdGVteCAtLW5vLWRlbWFuZ2xlCi1UaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hldGhlciBDKysgc3ltYm9sIG5hbWVzIHNob3VsZCBiZSBkZW1hbmdsZWQgd2hlbgotcHJpbnRpbmcgb3V0cHV0LiAgVGhlIGRlZmF1bHQgaXMgdG8gZGVtYW5nbGUgc3ltYm9scy4gIFRoZQotQGNvZGV7LS1uby1kZW1hbmdsZX0gb3B0aW9uIG1heSBiZSB1c2VkIHRvIHR1cm4gb2ZmIGRlbWFuZ2xpbmcuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgQW5hbHlzaXMgT3B0aW9ucyxNaXNjZWxsYW5lb3VzIE9wdGlvbnMsT3V0cHV0IE9wdGlvbnMsSW52b2tpbmcKLUBzZWN0aW9uIEFuYWx5c2lzIE9wdGlvbnMKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1uby1zdGF0aWMKLVRoZSBAc2FtcHstYX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gc3VwcHJlc3MgdGhlIHByaW50aW5nIG9mCi1zdGF0aWNhbGx5IGRlY2xhcmVkIChwcml2YXRlKSBmdW5jdGlvbnMuICAoVGhlc2UgYXJlIGZ1bmN0aW9ucyB3aG9zZQotbmFtZXMgYXJlIG5vdCBsaXN0ZWQgYXMgZ2xvYmFsLCBhbmQgd2hpY2ggYXJlIG5vdCB2aXNpYmxlIG91dHNpZGUgdGhlCi1maWxlL2Z1bmN0aW9uL2Jsb2NrIHdoZXJlIHRoZXkgd2VyZSBkZWZpbmVkLikgIFRpbWUgc3BlbnQgaW4gdGhlc2UKLWZ1bmN0aW9ucywgY2FsbHMgdG8vZnJvbSB0aGVtLCBldGMsIHdpbGwgYWxsIGJlIGF0dHJpYnV0ZWQgdG8gdGhlCi1mdW5jdGlvbiB0aGF0IHdhcyBsb2FkZWQgZGlyZWN0bHkgYmVmb3JlIGl0IGluIHRoZSBleGVjdXRhYmxlIGZpbGUuCi1AYyBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBVbml4IEBjb2Rle2dwcm9mfSwgYnV0IGEgYmFkIGlkZWEuICAKLVRoaXMgb3B0aW9uIGFmZmVjdHMgYm90aCB0aGUgZmxhdCBwcm9maWxlIGFuZCB0aGUgY2FsbCBncmFwaC4KLQotQGl0ZW0gLWMKLUBpdGVteCAtLXN0YXRpYy1jYWxsLWdyYXBoCi1UaGUgQHNhbXB7LWN9IG9wdGlvbiBjYXVzZXMgdGhlIGNhbGwgZ3JhcGggb2YgdGhlIHByb2dyYW0gdG8gYmUKLWF1Z21lbnRlZCBieSBhIGhldXJpc3RpYyB3aGljaCBleGFtaW5lcyB0aGUgdGV4dCBzcGFjZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGFuZCBpZGVudGlmaWVzIGZ1bmN0aW9uIGNhbGxzIGluIHRoZSBiaW5hcnkgbWFjaGluZSBjb2RlLgotU2luY2Ugbm9ybWFsIGNhbGwgZ3JhcGggcmVjb3JkcyBhcmUgb25seSBnZW5lcmF0ZWQgd2hlbiBmdW5jdGlvbnMgYXJlCi1lbnRlcmVkLCB0aGlzIG9wdGlvbiBpZGVudGlmaWVzIGNoaWxkcmVuIHRoYXQgY291bGQgaGF2ZSBiZWVuIGNhbGxlZCwKLWJ1dCBuZXZlciB3ZXJlLiAgQ2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgd2VyZSBub3QgY29tcGlsZWQgd2l0aAotcHJvZmlsaW5nIGVuYWJsZWQgYXJlIGFsc28gaWRlbnRpZmllZCwgYnV0IG9ubHkgaWYgc3ltYm9sIHRhYmxlCi1lbnRyaWVzIGFyZSBwcmVzZW50IGZvciB0aGVtLgotQ2FsbHMgdG8gZHluYW1pYyBsaWJyYXJ5IHJvdXRpbmVzIGFyZSB0eXBpY2FsbHkgQGVtcGh7bm90fSBmb3VuZAotYnkgdGhpcyBvcHRpb24uCi1QYXJlbnRzIG9yIGNoaWxkcmVuIGlkZW50aWZpZWQgdmlhIHRoaXMgaGV1cmlzdGljCi1hcmUgaW5kaWNhdGVkIGluIHRoZSBjYWxsIGdyYXBoIHdpdGggY2FsbCBjb3VudHMgb2YgQHNhbXB7MH0uCi0KLUBpdGVtIC1ECi1AaXRlbXggLS1pZ25vcmUtbm9uLWZ1bmN0aW9ucwotVGhlIEBzYW1wey1EfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBpZ25vcmUgc3ltYm9scyB3aGljaAotYXJlIG5vdCBrbm93biB0byBiZSBmdW5jdGlvbnMuICBUaGlzIG9wdGlvbiB3aWxsIGdpdmUgbW9yZSBhY2N1cmF0ZQotcHJvZmlsZSBkYXRhIG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgc3VwcG9ydGVkIChTb2xhcmlzIGFuZCBIUFVYIGZvcgotZXhhbXBsZSkuCi0KLUBpdGVtIC1rIEB2YXJ7ZnJvbX0vQHZhcnt0b30KLVRoZSBAc2FtcHsta30gb3B0aW9uIGFsbG93cyB5b3UgdG8gZGVsZXRlIGZyb20gdGhlIGNhbGwgZ3JhcGggYW55IGFyY3MgZnJvbQotc3ltYm9scyBtYXRjaGluZyBzeW1zcGVjIEB2YXJ7ZnJvbX0gdG8gdGhvc2UgbWF0Y2hpbmcgc3ltc3BlYyBAdmFye3RvfS4KLQotQGl0ZW0gLWwKLUBpdGVteCAtLWxpbmUKLVRoZSBAc2FtcHstbH0gb3B0aW9uIGVuYWJsZXMgbGluZS1ieS1saW5lIHByb2ZpbGluZywgd2hpY2ggY2F1c2VzCi1oaXN0b2dyYW0gaGl0cyB0byBiZSBjaGFyZ2VkIHRvIGluZGl2aWR1YWwgc291cmNlIGNvZGUgbGluZXMsCi1pbnN0ZWFkIG9mIGZ1bmN0aW9ucy4KLUlmIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCB3aXRoIGJhc2ljLWJsb2NrIGNvdW50aW5nIGVuYWJsZWQsCi10aGlzIG9wdGlvbiB3aWxsIGFsc28gaWRlbnRpZnkgaG93IG1hbnkgdGltZXMgZWFjaCBsaW5lIG9mCi1jb2RlIHdhcyBleGVjdXRlZC4KLVdoaWxlIGxpbmUtYnktbGluZSBwcm9maWxpbmcgY2FuIGhlbHAgaXNvbGF0ZSB3aGVyZSBpbiBhIGxhcmdlIGZ1bmN0aW9uCi1hIHByb2dyYW0gaXMgc3BlbmRpbmcgaXRzIHRpbWUsIGl0IGFsc28gc2lnbmlmaWNhbnRseSBpbmNyZWFzZXMKLXRoZSBydW5uaW5nIHRpbWUgb2YgQGNvZGV7Z3Byb2Z9LCBhbmQgbWFnbmlmaWVzIHN0YXRpc3RpY2FsCi1pbmFjY3VyYWNpZXMuCi1AeHJlZntTYW1wbGluZyBFcnJvcn0uCi0KLUBpdGVtIC1tIEB2YXJ7bnVtfQotQGl0ZW14IC0tbWluLWNvdW50PUB2YXJ7bnVtfQotVGhpcyBvcHRpb24gYWZmZWN0cyBleGVjdXRpb24gY291bnQgb3V0cHV0IG9ubHkuCi1TeW1ib2xzIHRoYXQgYXJlIGV4ZWN1dGVkIGxlc3MgdGhhbiBAdmFye251bX0gdGltZXMgYXJlIHN1cHByZXNzZWQuCi0KLUBpdGVtIC1uW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS10aW1lWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1ufSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSwgaW4gaXRzIGNhbGwgZ3JhcGggYW5hbHlzaXMsCi10byBvbmx5IHByb3BhZ2F0ZSB0aW1lcyBmb3Igc3ltYm9scyBtYXRjaGluZyBAdmFye3N5bXNwZWN9LgotCi1AaXRlbSAtTltAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tdGltZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstbn0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0sIGluIGl0cyBjYWxsIGdyYXBoIGFuYWx5c2lzLAotbm90IHRvIHByb3BhZ2F0ZSB0aW1lcyBmb3Igc3ltYm9scyBtYXRjaGluZyBAdmFye3N5bXNwZWN9LgotCi1AaXRlbSAtegotQGl0ZW14IC0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zCi1JZiB5b3UgZ2l2ZSB0aGUgQHNhbXB7LXp9IG9wdGlvbiwgQGNvZGV7Z3Byb2Z9IHdpbGwgbWVudGlvbiBhbGwKLWZ1bmN0aW9ucyBpbiB0aGUgZmxhdCBwcm9maWxlLCBldmVuIHRob3NlIHRoYXQgd2VyZSBuZXZlciBjYWxsZWQsIGFuZAotdGhhdCBoYWQgbm8gdGltZSBzcGVudCBpbiB0aGVtLiAgVGhpcyBpcyB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLUBzYW1wey1jfSBvcHRpb24gZm9yIGRpc2NvdmVyaW5nIHdoaWNoIHJvdXRpbmVzIHdlcmUgbmV2ZXIgY2FsbGVkLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxEZXByaWNhdGVkIE9wdGlvbnMsQW5hbHlzaXMgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gTWlzY2VsbGFuZW91cyBPcHRpb25zCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtZFtAdmFye251bX1dCi1AaXRlbXggLS1kZWJ1Z1s9QHZhcntudW19XQotVGhlIEBzYW1wey1kIEB2YXJ7bnVtfX0gb3B0aW9uIHNwZWNpZmllcyBkZWJ1Z2dpbmcgb3B0aW9ucy4KLUlmIEB2YXJ7bnVtfSBpcyBub3Qgc3BlY2lmaWVkLCBlbmFibGUgYWxsIGRlYnVnZ2luZy4KLUB4cmVme0RlYnVnZ2luZ30uCi0KLUBpdGVtIC1PQHZhcntuYW1lfQotQGl0ZW14IC0tZmlsZS1mb3JtYXQ9QHZhcntuYW1lfQotU2VsZWN0cyB0aGUgZm9ybWF0IG9mIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMuICBSZWNvZ25pemVkIGZvcm1hdHMgYXJlCi1Ac2FtcHthdXRvfSAodGhlIGRlZmF1bHQpLCBAc2FtcHtic2R9LCBAc2FtcHs0LjRic2R9LCBAc2FtcHttYWdpY30sIGFuZAotQHNhbXB7cHJvZn0gKG5vdCB5ZXQgc3VwcG9ydGVkKS4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLXN1bQotVGhlIEBzYW1wey1zfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdW1tYXJpemUgdGhlIGluZm9ybWF0aW9uCi1pbiB0aGUgcHJvZmlsZSBkYXRhIGZpbGVzIGl0IHJlYWQgaW4sIGFuZCB3cml0ZSBvdXQgYSBwcm9maWxlIGRhdGEKLWZpbGUgY2FsbGVkIEBmaWxle2dtb24uc3VtfSwgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBmcm9tCi10aGUgcHJvZmlsZSBkYXRhIGZpbGVzIHRoYXQgQGNvZGV7Z3Byb2Z9IHJlYWQgaW4uICBUaGUgZmlsZSBAZmlsZXtnbW9uLnN1bX0KLW1heSBiZSBvbmUgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBmaWxlczsgdGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRvCi1tZXJnZSB0aGUgZGF0YSBpbiB0aGUgb3RoZXIgaW5wdXQgZmlsZXMgaW50byBAZmlsZXtnbW9uLnN1bX0uCi0KLUV2ZW50dWFsbHkgeW91IGNhbiBydW4gQGNvZGV7Z3Byb2Z9IGFnYWluIHdpdGhvdXQgQHNhbXB7LXN9IHRvIGFuYWx5emUgdGhlCi1jdW11bGF0aXZlIGRhdGEgaW4gdGhlIGZpbGUgQGZpbGV7Z21vbi5zdW19LgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyc2lvbgotVGhlIEBzYW1wey12fSBmbGFnIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgdGhlIGN1cnJlbnQgdmVyc2lvbgotbnVtYmVyLCBhbmQgdGhlbiBleGl0LgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIERlcHJpY2F0ZWQgT3B0aW9ucyxTeW1zcGVjcyxNaXNjZWxsYW5lb3VzIE9wdGlvbnMsSW52b2tpbmcKLUBzZWN0aW9uIERlcHJpY2F0ZWQgT3B0aW9ucwotCi1AdGFibGUgQGNvZGUKLQotVGhlc2Ugb3B0aW9ucyBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBuZXdlciB2ZXJzaW9ucyB0aGF0IHVzZSBzeW1zcGVjcy4KLQotQGl0ZW0gLWUgQHZhcntmdW5jdGlvbl9uYW1lfQotVGhlIEBzYW1wey1lIEB2YXJ7ZnVuY3Rpb259fSBvcHRpb24gdGVsbHMgQGNvZGV7Z3Byb2Z9IHRvIG5vdCBwcmludAotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uIEB2YXJ7ZnVuY3Rpb25fbmFtZX0gKGFuZCBpdHMKLWNoaWxkcmVuQGRvdHN7fSkgaW4gdGhlIGNhbGwgZ3JhcGguICBUaGUgZnVuY3Rpb24gd2lsbCBzdGlsbCBiZSBsaXN0ZWQKLWFzIGEgY2hpbGQgb2YgYW55IGZ1bmN0aW9ucyB0aGF0IGNhbGwgaXQsIGJ1dCBpdHMgaW5kZXggbnVtYmVyIHdpbGwgYmUKLXNob3duIGFzIEBzYW1we1tub3QgcHJpbnRlZF19LiAgTW9yZSB0aGFuIG9uZSBAc2FtcHstZX0gb3B0aW9uIG1heSBiZQotZ2l2ZW47IG9ubHkgb25lIEB2YXJ7ZnVuY3Rpb25fbmFtZX0gbWF5IGJlIGluZGljYXRlZCB3aXRoIGVhY2ggQHNhbXB7LWV9Ci1vcHRpb24uIAotCi1AaXRlbSAtRSBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQGNvZGV7LUUgQHZhcntmdW5jdGlvbn19IG9wdGlvbiB3b3JrcyBsaWtlIHRoZSBAY29kZXstZX0gb3B0aW9uLCBidXQKLXRpbWUgc3BlbnQgaW4gdGhlIGZ1bmN0aW9uIChhbmQgY2hpbGRyZW4gd2hvIHdlcmUgbm90IGNhbGxlZCBmcm9tCi1hbnl3aGVyZSBlbHNlKSwgd2lsbCBub3QgYmUgdXNlZCB0byBjb21wdXRlIHRoZSBwZXJjZW50YWdlcy1vZi10aW1lIGZvcgotdGhlIGNhbGwgZ3JhcGguICBNb3JlIHRoYW4gb25lIEBzYW1wey1FfSBvcHRpb24gbWF5IGJlIGdpdmVuOyBvbmx5IG9uZQotQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaCBAc2FtcHstRX0gb3B0aW9uLgotCi1AaXRlbSAtZiBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQHNhbXB7LWYgQHZhcntmdW5jdGlvbn19IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGxpbWl0IHRoZQotY2FsbCBncmFwaCB0byB0aGUgZnVuY3Rpb24gQHZhcntmdW5jdGlvbl9uYW1lfSBhbmQgaXRzIGNoaWxkcmVuIChhbmQKLXRoZWlyIGNoaWxkcmVuQGRvdHN7fSkuICBNb3JlIHRoYW4gb25lIEBzYW1wey1mfSBvcHRpb24gbWF5IGJlIGdpdmVuOwotb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaCBAc2FtcHstZn0KLW9wdGlvbi4gIAotCi1AaXRlbSAtRiBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQHNhbXB7LUYgQHZhcntmdW5jdGlvbn19IG9wdGlvbiB3b3JrcyBsaWtlIHRoZSBAY29kZXstZn0gb3B0aW9uLCBidXQKLW9ubHkgdGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24gYW5kIGl0cyBjaGlsZHJlbiAoYW5kIHRoZWlyCi1jaGlsZHJlbkBkb3Rze30pIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdG90YWwtdGltZSBhbmQKLXBlcmNlbnRhZ2VzLW9mLXRpbWUgZm9yIHRoZSBjYWxsIGdyYXBoLiAgTW9yZSB0aGFuIG9uZSBAc2FtcHstRn0gb3B0aW9uCi1tYXkgYmUgZ2l2ZW47IG9ubHkgb25lIEB2YXJ7ZnVuY3Rpb25fbmFtZX0gbWF5IGJlIGluZGljYXRlZCB3aXRoIGVhY2gKLUBzYW1wey1GfSBvcHRpb24uICBUaGUgQHNhbXB7LUZ9IG9wdGlvbiBvdmVycmlkZXMgdGhlIEBzYW1wey1FfSBvcHRpb24uCi0KLUBlbmQgdGFibGUKLQotTm90ZSB0aGF0IG9ubHkgb25lIGZ1bmN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCBlYWNoIEBjb2Rley1lfSwKLUBjb2Rley1FfSwgQGNvZGV7LWZ9IG9yIEBjb2Rley1GfSBvcHRpb24uICBUbyBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUKLWZ1bmN0aW9uLCB1c2UgbXVsdGlwbGUgb3B0aW9ucy4gIEZvciBleGFtcGxlLCB0aGlzIGNvbW1hbmQ6Ci0KLUBleGFtcGxlCi1ncHJvZiAtZSBib3JpbmcgLWYgZm9vIC1mIGJhciBteXByb2dyYW0gPiBncHJvZi5vdXRwdXQKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWxpc3RzIGluIHRoZSBjYWxsIGdyYXBoIGFsbCBmdW5jdGlvbnMgdGhhdCB3ZXJlIHJlYWNoZWQgZnJvbSBlaXRoZXIKLUBjb2Rle2Zvb30gb3IgQGNvZGV7YmFyfSBhbmQgd2VyZSBub3QgcmVhY2hhYmxlIGZyb20gQGNvZGV7Ym9yaW5nfS4KLQotQG5vZGUgU3ltc3BlY3MsLERlcHJpY2F0ZWQgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gU3ltc3BlY3MKLQotTWFueSBvZiB0aGUgb3V0cHV0IG9wdGlvbnMgYWxsb3cgZnVuY3Rpb25zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkCi11c2luZyBAZGZue3N5bXNwZWNzfSAoc3ltYm9sIHNwZWNpZmljYXRpb25zKSwgd2hpY2ggb2JzZXJ2ZSB0aGUKLWZvbGxvd2luZyBzeW50YXg6Ci0KLUBleGFtcGxlCi0gIGZpbGVuYW1lX2NvbnRhaW5pbmdfYV9kb3QKLXwgZnVuY25hbWVfbm90X2NvbnRhaW5pbmdfYV9kb3QKLXwgbGluZW51bWJlcgotfCAoIFsgYW55X2ZpbGVuYW1lIF0gYDonICggYW55X2Z1bmNuYW1lIHwgbGluZW51bWJlciApICkKLUBlbmQgZXhhbXBsZQotCi1IZXJlIGFyZSBzb21lIHNhbXBsZSBzeW1zcGVjczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBtYWluLmMKLVNlbGVjdHMgZXZlcnl0aGluZyBpbiBmaWxlIEBmaWxle21haW4uY30tLS10aGUKLWRvdCBpbiB0aGUgc3RyaW5nIHRlbGxzIGdwcm9mIHRvIGludGVycHJldAotdGhlIHN0cmluZyBhcyBhIGZpbGVuYW1lLCByYXRoZXIgdGhhbiBhcwotYSBmdW5jdGlvbiBuYW1lLiAgVG8gc2VsZWN0IGEgZmlsZSB3aG9zZQotbmFtZSBkb2VzIG5vdCBjb250YWluIGEgZG90LCBhIHRyYWlsaW5nIGNvbG9uCi1zaG91bGQgYmUgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIEBzYW1we29kZDp9IGlzCi1pbnRlcnByZXRlZCBhcyB0aGUgZmlsZSBuYW1lZCBAZmlsZXtvZGR9LgotCi1AaXRlbSBtYWluCi1TZWxlY3RzIGFsbCBmdW5jdGlvbnMgbmFtZWQgQHNhbXB7bWFpbn0uCi0KLU5vdGUgdGhhdCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZ1bmN0aW9uIG5hbWUKLWJlY2F1c2Ugc29tZSBvZiB0aGUgZGVmaW5pdGlvbnMgbWF5IGJlIGxvY2FsIChpLmUuLCBzdGF0aWMpLiAgVW5sZXNzIGEKLWZ1bmN0aW9uIG5hbWUgaXMgdW5pcXVlIGluIGEgcHJvZ3JhbSwgeW91IG11c3QgdXNlIHRoZSBjb2xvbiBub3RhdGlvbgotZXhwbGFpbmVkIGJlbG93IHRvIHNwZWNpZnkgYSBmdW5jdGlvbiBmcm9tIGEgc3BlY2lmaWMgc291cmNlIGZpbGUuCi0KLVNvbWV0aW1lcywgZnVuY3Rpb24gbmFtZXMgY29udGFpbiBkb3RzLiAgSW4gc3VjaCBjYXNlcywgaXQgaXMgbmVjZXNzYXJ5Ci10byBhZGQgYSBsZWFkaW5nIGNvbG9uIHRvIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsIEBzYW1wezoubXVsfSBzZWxlY3RzCi1mdW5jdGlvbiBAc2FtcHsubXVsfS4KLQotSW4gc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuICBncHJvZgotd2lsbCBub3JtYWxseSBub3QgcHJpbnQgdGhlc2UgdW5kZXJzY29yZXMuICBIb3dldmVyLCB5b3UgbXVzdCB1c2UgdGhlCi11bmRlcnNjb3JlIHdoZW4geW91IG5hbWUgYSBzeW1ib2wgaW4gYSBzeW1zcGVjLiAgWW91IGNhbiB1c2UgdGhlCi1AY29kZXtubX0gcHJvZ3JhbSB0byBzZWUgd2hldGhlciBzeW1ib2xzIGhhdmUgdW5kZXJzY29yZXMgZm9yIHRoZSBvYmplY3QKLWZpbGUgZm9ybWF0IHlvdSBhcmUgdXNpbmcuCi0KLUBpdGVtIG1haW4uYzptYWluCi1TZWxlY3RzIGZ1bmN0aW9uIEBzYW1we21haW59IGluIGZpbGUgQGZpbGV7bWFpbi5jfS4KLQotQGl0ZW0gbWFpbi5jOjEzNAotU2VsZWN0cyBsaW5lIDEzNCBpbiBmaWxlIEBmaWxle21haW4uY30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIE91dHB1dAotQGNoYXB0ZXIgSW50ZXJwcmV0aW5nIEBjb2Rle2dwcm9mfSdzIE91dHB1dAotCi1AY29kZXtncHJvZn0gY2FuIHByb2R1Y2Ugc2V2ZXJhbCBkaWZmZXJlbnQgb3V0cHV0IHN0eWxlcywgdGhlCi1tb3N0IGltcG9ydGFudCBvZiB3aGljaCBhcmUgZGVzY3JpYmVkIGJlbG93LiAgVGhlIHNpbXBsZXN0IG91dHB1dAotc3R5bGVzIChmaWxlIGluZm9ybWF0aW9uLCBleGVjdXRpb24gY291bnQsIGFuZCBmdW5jdGlvbiBhbmQgZmlsZSBvcmRlcmluZykKLWFyZSBub3QgZGVzY3JpYmVkIGhlcmUsIGJ1dCBhcmUgZG9jdW1lbnRlZCB3aXRoIHRoZSByZXNwZWN0aXZlIG9wdGlvbnMKLXRoYXQgdHJpZ2dlciB0aGVtLgotQHhyZWZ7T3V0cHV0IE9wdGlvbnN9LgotCi1AbWVudQotKiBGbGF0IFByb2ZpbGU6OiAgICAgICAgVGhlIGZsYXQgcHJvZmlsZSBzaG93cyBob3cgbXVjaCB0aW1lIHdhcyBzcGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGluZyBkaXJlY3RseSBpbiBlYWNoIGZ1bmN0aW9uLgotKiBDYWxsIEdyYXBoOjogICAgICAgICAgVGhlIGNhbGwgZ3JhcGggc2hvd3Mgd2hpY2ggZnVuY3Rpb25zIGNhbGxlZCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVycywgYW5kIGhvdyBtdWNoIHRpbWUgZWFjaCBmdW5jdGlvbiB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBpdHMgc3Vicm91dGluZSBjYWxscyBhcmUgaW5jbHVkZWQuCi0qIExpbmUtYnktbGluZTo6ICAgICAgICBAY29kZXtncHJvZn0gY2FuIGFuYWx5emUgaW5kaXZpZHVhbCBzb3VyY2UgY29kZSBsaW5lcwotKiBBbm5vdGF0ZWQgU291cmNlOjogICAgVGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZyBkaXNwbGF5cyBzb3VyY2UgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsZWQgd2l0aCBleGVjdXRpb24gY291bnRzCi1AZW5kIG1lbnUKLQotCi1Abm9kZSBGbGF0IFByb2ZpbGUsQ2FsbCBHcmFwaCwsT3V0cHV0Ci1Ac2VjdGlvbiBUaGUgRmxhdCBQcm9maWxlCi1AY2luZGV4IGZsYXQgcHJvZmlsZQotCi1UaGUgQGRmbntmbGF0IHByb2ZpbGV9IHNob3dzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSB5b3VyIHByb2dyYW0KLXNwZW50IGV4ZWN1dGluZyBlYWNoIGZ1bmN0aW9uLiAgVW5sZXNzIHRoZSBAc2FtcHsten0gb3B0aW9uIGlzIGdpdmVuLAotZnVuY3Rpb25zIHdpdGggbm8gYXBwYXJlbnQgdGltZSBzcGVudCBpbiB0aGVtLCBhbmQgbm8gYXBwYXJlbnQgY2FsbHMKLXRvIHRoZW0sIGFyZSBub3QgbWVudGlvbmVkLiAgTm90ZSB0aGF0IGlmIGEgZnVuY3Rpb24gd2FzIG5vdCBjb21waWxlZAotZm9yIHByb2ZpbGluZywgYW5kIGRpZG4ndCBydW4gbG9uZyBlbm91Z2ggdG8gc2hvdyB1cCBvbiB0aGUgcHJvZ3JhbQotY291bnRlciBoaXN0b2dyYW0sIGl0IHdpbGwgYmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGZ1bmN0aW9uIHRoYXQKLXdhcyBuZXZlciBjYWxsZWQuCi0KLVRoaXMgaXMgcGFydCBvZiBhIGZsYXQgcHJvZmlsZSBmb3IgYSBzbWFsbCBwcm9ncmFtOgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLUZsYXQgcHJvZmlsZToKLQotRWFjaCBzYW1wbGUgY291bnRzIGFzIDAuMDEgc2Vjb25kcy4KLSAgJSAgIGN1bXVsYXRpdmUgICBzZWxmICAgICAgICAgICAgICBzZWxmICAgICB0b3RhbCAgICAgICAgICAgCi0gdGltZSAgIHNlY29uZHMgICBzZWNvbmRzICAgIGNhbGxzICBtcy9jYWxsICBtcy9jYWxsICBuYW1lICAgIAotIDMzLjM0ICAgICAgMC4wMiAgICAgMC4wMiAgICAgNzIwOCAgICAgMC4wMCAgICAgMC4wMCAgb3BlbgotIDE2LjY3ICAgICAgMC4wMyAgICAgMC4wMSAgICAgIDI0NCAgICAgMC4wNCAgICAgMC4xMiAgb2ZmdGltZQotIDE2LjY3ICAgICAgMC4wNCAgICAgMC4wMSAgICAgICAgOCAgICAgMS4yNSAgICAgMS4yNSAgbWVtY2NweQotIDE2LjY3ICAgICAgMC4wNSAgICAgMC4wMSAgICAgICAgNyAgICAgMS40MyAgICAgMS40MyAgd3JpdGUKLSAxNi42NyAgICAgIDAuMDYgICAgIDAuMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jb3VudAotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgIDIzNiAgICAgMC4wMCAgICAgMC4wMCAgdHpzZXQKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAxOTIgICAgIDAuMDAgICAgIDAuMDAgIHRvbG93ZXIKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgNDcgICAgIDAuMDAgICAgIDAuMDAgIHN0cmxlbgotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICA0NSAgICAgMC4wMCAgICAgMC4wMCAgc3RyY2hyCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgIDUwLjAwICBtYWluCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgICAwLjAwICBtZW1jcHkKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgMTAuMTEgIHByaW50Ci0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgICAwLjAwICBwcm9maWwKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgNTAuMDAgIHJlcG9ydAotQGRvdHN7fQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZnVuY3Rpb25zIGFyZSBzb3J0ZWQgYnkgZmlyc3QgYnkgZGVjcmVhc2luZyBydW4tdGltZSBzcGVudCBpbiB0aGVtLAotdGhlbiBieSBkZWNyZWFzaW5nIG51bWJlciBvZiBjYWxscywgdGhlbiBhbHBoYWJldGljYWxseSBieSBuYW1lLiAgVGhlCi1mdW5jdGlvbnMgQHNhbXB7bWNvdW50fSBhbmQgQHNhbXB7cHJvZmlsfSBhcmUgcGFydCBvZiB0aGUgcHJvZmlsaW5nCi1hcGFyYXR1cyBhbmQgYXBwZWFyIGluIGV2ZXJ5IGZsYXQgcHJvZmlsZTsgdGhlaXIgdGltZSBnaXZlcyBhIG1lYXN1cmUgb2YKLXRoZSBhbW91bnQgb2Ygb3ZlcmhlYWQgZHVlIHRvIHByb2ZpbGluZy4KLQotSnVzdCBiZWZvcmUgdGhlIGNvbHVtbiBoZWFkZXJzLCBhIHN0YXRlbWVudCBhcHBlYXJzIGluZGljYXRpbmcKLWhvdyBtdWNoIHRpbWUgZWFjaCBzYW1wbGUgY291bnRlZCBhcy4KLVRoaXMgQGRmbntzYW1wbGluZyBwZXJpb2R9IGVzdGltYXRlcyB0aGUgbWFyZ2luIG9mIGVycm9yIGluIGVhY2ggb2YgdGhlIHRpbWUKLWZpZ3VyZXMuICBBIHRpbWUgZmlndXJlIHRoYXQgaXMgbm90IG11Y2ggbGFyZ2VyIHRoYW4gdGhpcyBpcyBub3QKLXJlbGlhYmxlLiAgSW4gdGhpcyBleGFtcGxlLCBlYWNoIHNhbXBsZSBjb3VudGVkIGFzIDAuMDEgc2Vjb25kcywKLXN1Z2dlc3RpbmcgYSAxMDAgSHogc2FtcGxpbmcgcmF0ZS4KLVRoZSBwcm9ncmFtJ3MgdG90YWwgZXhlY3V0aW9uIHRpbWUgd2FzIDAuMDYKLXNlY29uZHMsIGFzIGluZGljYXRlZCBieSB0aGUgQHNhbXB7Y3VtdWxhdGl2ZSBzZWNvbmRzfSBmaWVsZC4gIFNpbmNlCi1lYWNoIHNhbXBsZSBjb3VudGVkIGZvciAwLjAxIHNlY29uZHMsIHRoaXMgbWVhbnMgb25seSBzaXggc2FtcGxlcwotd2VyZSB0YWtlbiBkdXJpbmcgdGhlIHJ1bi4gIFR3byBvZiB0aGUgc2FtcGxlcyBvY2N1cmVkIHdoaWxlIHRoZQotcHJvZ3JhbSB3YXMgaW4gdGhlIEBzYW1we29wZW59IGZ1bmN0aW9uLCBhcyBpbmRpY2F0ZWQgYnkgdGhlCi1Ac2FtcHtzZWxmIHNlY29uZHN9IGZpZWxkLiAgRWFjaCBvZiB0aGUgb3RoZXIgZm91ciBzYW1wbGVzCi1vY2N1cmVkIG9uZSBlYWNoIGluIEBzYW1we29mZnRpbWV9LCBAc2FtcHttZW1jY3B5fSwgQHNhbXB7d3JpdGV9LAotYW5kIEBzYW1we21jb3VudH0uCi1TaW5jZSBvbmx5IHNpeCBzYW1wbGVzIHdlcmUgdGFrZW4sIG5vbmUgb2YgdGhlc2UgdmFsdWVzIGNhbgotYmUgcmVnYXJkZWQgYXMgcGFydGljdWxhcmx5IHJlbGlhYmxlLgotSW4gYW5vdGhlciBydW4sCi10aGUgQHNhbXB7c2VsZiBzZWNvbmRzfSBmaWVsZCBmb3IKLUBzYW1we21jb3VudH0gbWlnaHQgd2VsbCBiZSBAc2FtcHswLjAwfSBvciBAc2FtcHswLjAyfS4KLUB4cmVme1NhbXBsaW5nIEVycm9yfSwgZm9yIGEgY29tcGxldGUgZGlzY3Vzc2lvbi4KLQotVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgaW4gdGhlIGxpc3RpbmcgKHRob3NlIHdob3NlCi1Ac2FtcHtzZWxmIHNlY29uZHN9IGZpZWxkIGlzIEBzYW1wezAuMDB9KSBkaWRuJ3QgYXBwZWFyCi1pbiB0aGUgaGlzdG9ncmFtIHNhbXBsZXMgYXQgYWxsLiAgSG93ZXZlciwgdGhlIGNhbGwgZ3JhcGgKLWluZGljYXRlZCB0aGF0IHRoZXkgd2VyZSBjYWxsZWQsIHNvIHRoZXJlZm9yZSB0aGV5IGFyZSBsaXN0ZWQsCi1zb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlciBieSB0aGUgQHNhbXB7Y2FsbHN9IGZpZWxkLgotQ2xlYXJseSBzb21lIHRpbWUgd2FzIHNwZW50IGV4ZWN1dGluZyB0aGVzZSBmdW5jdGlvbnMsCi1idXQgdGhlIHBhdWNpdHkgb2YgaGlzdG9ncmFtIHNhbXBsZXMgcHJldmVudHMgYW55Ci1kZXRlcm1pbmF0aW9uIG9mIGhvdyBtdWNoIHRpbWUgZWFjaCB0b29rLgotCi1IZXJlIGlzIHdoYXQgdGhlIGZpZWxkcyBpbiBlYWNoIGxpbmUgbWVhbjoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAlIHRpbWUKLVRoaXMgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIHlvdXIgcHJvZ3JhbSBzcGVudAotaW4gdGhpcyBmdW5jdGlvbi4gIFRoZXNlIHNob3VsZCBhbGwgYWRkIHVwIHRvIDEwMCUuCi0KLUBpdGVtIGN1bXVsYXRpdmUgc2Vjb25kcwotVGhpcyBpcyB0aGUgY3VtdWxhdGl2ZSB0b3RhbCBudW1iZXIgb2Ygc2Vjb25kcyB0aGUgY29tcHV0ZXIgc3BlbnQKLWV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9ucywgcGx1cyB0aGUgdGltZSBzcGVudCBpbiBhbGwgdGhlIGZ1bmN0aW9ucwotYWJvdmUgdGhpcyBvbmUgaW4gdGhpcyB0YWJsZS4KLQotQGl0ZW0gc2VsZiBzZWNvbmRzCi1UaGlzIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhY2NvdW50ZWQgZm9yIGJ5IHRoaXMgZnVuY3Rpb24gYWxvbmUuCi1UaGUgZmxhdCBwcm9maWxlIGxpc3RpbmcgaXMgc29ydGVkIGZpcnN0IGJ5IHRoaXMgbnVtYmVyLgotCi1AaXRlbSBjYWxscwotVGhpcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLiAgSWYgdGhlCi1mdW5jdGlvbiB3YXMgbmV2ZXIgY2FsbGVkLCBvciB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyBjYWxsZWQgY2Fubm90Ci1iZSBkZXRlcm1pbmVkIChwcm9iYWJseSBiZWNhdXNlIHRoZSBmdW5jdGlvbiB3YXMgbm90IGNvbXBpbGVkIHdpdGgKLXByb2ZpbGluZyBlbmFibGVkKSwgdGhlIEBkZm57Y2FsbHN9IGZpZWxkIGlzIGJsYW5rLgotCi1AaXRlbSBzZWxmIG1zL2NhbGwKLVRoaXMgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKLWZ1bmN0aW9uIHBlciBjYWxsLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLiAgT3RoZXJ3aXNlLCB0aGlzIGZpZWxkCi1pcyBibGFuayBmb3IgdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gdG90YWwgbXMvY2FsbAotVGhpcyByZXByZXNlbnRzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgaW4gdGhpcwotZnVuY3Rpb24gYW5kIGl0cyBkZXNjZW5kYW50cyBwZXIgY2FsbCwgaWYgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZC4KLU90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyBibGFuayBmb3IgdGhpcyBmdW5jdGlvbi4KLVRoaXMgaXMgdGhlIG9ubHkgZmllbGQgaW4gdGhlIGZsYXQgcHJvZmlsZSB0aGF0IHVzZXMgY2FsbCBncmFwaCBhbmFseXNpcy4KLQotQGl0ZW0gbmFtZQotVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICAgVGhlIGZsYXQgcHJvZmlsZSBpcyBzb3J0ZWQgYnkgdGhpcwotZmllbGQgYWxwaGFiZXRpY2FsbHkgYWZ0ZXIgdGhlIEBkZm57c2VsZiBzZWNvbmRzfSBhbmQgQGRmbntjYWxsc30KLWZpZWxkcyBhcmUgc29ydGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBDYWxsIEdyYXBoLExpbmUtYnktbGluZSxGbGF0IFByb2ZpbGUsT3V0cHV0Ci1Ac2VjdGlvbiBUaGUgQ2FsbCBHcmFwaAotQGNpbmRleCBjYWxsIGdyYXBoCi0KLVRoZSBAZGZue2NhbGwgZ3JhcGh9IHNob3dzIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50IGluIGVhY2ggZnVuY3Rpb24KLWFuZCBpdHMgY2hpbGRyZW4uICBGcm9tIHRoaXMgaW5mb3JtYXRpb24sIHlvdSBjYW4gZmluZCBmdW5jdGlvbnMgdGhhdCwKLXdoaWxlIHRoZXkgdGhlbXNlbHZlcyBtYXkgbm90IGhhdmUgdXNlZCBtdWNoIHRpbWUsIGNhbGxlZCBvdGhlcgotZnVuY3Rpb25zIHRoYXQgZGlkIHVzZSB1bnVzdWFsIGFtb3VudHMgb2YgdGltZS4KLQotSGVyZSBpcyBhIHNhbXBsZSBjYWxsIGZyb20gYSBzbWFsbCBwcm9ncmFtLiAgVGhpcyBjYWxsIGNhbWUgZnJvbSB0aGUKLXNhbWUgQGNvZGV7Z3Byb2Z9IHJ1biBhcyB0aGUgZmxhdCBwcm9maWxlIGV4YW1wbGUgaW4gdGhlIHByZXZpb3VzCi1jaGFwdGVyLgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzIDIgYnl0ZShzKSBmb3IgMjAuMDAlIG9mIDAuMDUgc2Vjb25kcwotCi1pbmRleCAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwb250YW5lb3VzPgotWzFdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAgICAgICAgICAgc3RhcnQgWzFdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8yICAgICAgICAgICBvbl9leGl0IFsyOF0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xICAgICAgICAgICBleGl0IFs1OV0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgc3RhcnQgWzFdCi1bMl0gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIHJlcG9ydCBbM10KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgbWFpbiBbMl0KLVszXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIHJlcG9ydCBbM10KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDMgICAgICAgOC84ICAgICAgICAgICB0aW1lbG9jYWwgWzZdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAxICAgICAgIDEvMSAgICAgICAgICAgcHJpbnQgWzldCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAxICAgICAgIDkvOSAgICAgICAgICAgZmdldHMgWzEyXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDEyLzM0ICAgICAgICAgIHN0cm5jbXAgPGN5Y2xlIDE+IFs0MF0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgOC84ICAgICAgICAgICBsb29rdXAgWzIwXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEgICAgICAgICAgIGZvcGVuIFsyMV0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgOC84ICAgICAgICAgICBjaGV3dGltZSBbMjRdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDgvMTYgICAgICAgICAgc2tpcHNwYWNlIFs0NF0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1bNF0gICAgIDU5LjggICAgMC4wMSAgICAgICAgMC4wMiAgICAgICA4KzQ3MiAgICAgPGN5Y2xlIDIgYXMgYSB3aG9sZT4JWzRdCi0gICAgICAgICAgICAgICAgMC4wMSAgICAgICAgMC4wMiAgICAgMjQ0KzI2MCAgICAgICAgIG9mZnRpbWUgPGN5Y2xlIDI+IFs3XQotICAgICAgICAgICAgICAgIDAuMDAgICAgICAgIDAuMDAgICAgIDIzNisxICAgICAgICAgICB0enNldCA8Y3ljbGUgMj4gWzI2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBsaW5lcyBmdWxsIG9mIGRhc2hlcyBkaXZpZGUgdGhpcyB0YWJsZSBpbnRvIEBkZm57ZW50cmllc30sIG9uZSBmb3IgZWFjaAotZnVuY3Rpb24uICBFYWNoIGVudHJ5IGhhcyBvbmUgb3IgbW9yZSBsaW5lcy4KLQotSW4gZWFjaCBlbnRyeSwgdGhlIHByaW1hcnkgbGluZSBpcyB0aGUgb25lIHRoYXQgc3RhcnRzIHdpdGggYW4gaW5kZXggbnVtYmVyCi1pbiBzcXVhcmUgYnJhY2tldHMuICBUaGUgZW5kIG9mIHRoaXMgbGluZSBzYXlzIHdoaWNoIGZ1bmN0aW9uIHRoZSBlbnRyeSBpcwotZm9yLiAgVGhlIHByZWNlZGluZyBsaW5lcyBpbiB0aGUgZW50cnkgZGVzY3JpYmUgdGhlIGNhbGxlcnMgb2YgdGhpcwotZnVuY3Rpb24gYW5kIHRoZSBmb2xsb3dpbmcgbGluZXMgZGVzY3JpYmUgaXRzIHN1YnJvdXRpbmVzIChhbHNvIGNhbGxlZAotQGRmbntjaGlsZHJlbn0gd2hlbiB3ZSBzcGVhayBvZiB0aGUgY2FsbCBncmFwaCkuCi0KLVRoZSBlbnRyaWVzIGFyZSBzb3J0ZWQgYnkgdGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24gYW5kIGl0cyBzdWJyb3V0aW5lcy4KLQotVGhlIGludGVybmFsIHByb2ZpbGluZyBmdW5jdGlvbiBAY29kZXttY291bnR9IChAcHhyZWZ7RmxhdCBQcm9maWxlfSkKLWlzIG5ldmVyIG1lbnRpb25lZCBpbiB0aGUgY2FsbCBncmFwaC4KLQotQG1lbnUKLSogUHJpbWFyeTo6ICAgICAgIERldGFpbHMgb2YgdGhlIHByaW1hcnkgbGluZSdzIGNvbnRlbnRzLgotKiBDYWxsZXJzOjogICAgICAgRGV0YWlscyBvZiBjYWxsZXItbGluZXMnIGNvbnRlbnRzLgotKiBTdWJyb3V0aW5lczo6ICAgRGV0YWlscyBvZiBzdWJyb3V0aW5lLWxpbmVzJyBjb250ZW50cy4KLSogQ3ljbGVzOjogICAgICAgIFdoZW4gdGhlcmUgYXJlIGN5Y2xlcyBvZiByZWN1cnNpb24sCi0gICAgICAgICAgICAgICAgICAgc3VjaCBhcyBAY29kZXthfSBjYWxscyBAY29kZXtifSBjYWxscyBAY29kZXthfUBkb3Rze30KLUBlbmQgbWVudQotCi1Abm9kZSBQcmltYXJ5Ci1Ac3Vic2VjdGlvbiBUaGUgUHJpbWFyeSBMaW5lCi0KLVRoZSBAZGZue3ByaW1hcnkgbGluZX0gaW4gYSBjYWxsIGdyYXBoIGVudHJ5IGlzIHRoZSBsaW5lIHRoYXQKLWRlc2NyaWJlcyB0aGUgZnVuY3Rpb24gd2hpY2ggdGhlIGVudHJ5IGlzIGFib3V0IGFuZCBnaXZlcyB0aGUgb3ZlcmFsbAotc3RhdGlzdGljcyBmb3IgdGhpcyBmdW5jdGlvbi4KLQotRm9yIHJlZmVyZW5jZSwgd2UgcmVwZWF0IHRoZSBwcmltYXJ5IGxpbmUgZnJvbSB0aGUgZW50cnkgZm9yIGZ1bmN0aW9uCi1AY29kZXtyZXBvcnR9IGluIG91ciBtYWluIGV4YW1wbGUsIHRvZ2V0aGVyIHdpdGggdGhlIGhlYWRpbmcgbGluZSB0aGF0Ci1zaG93cyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkczoKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotQGRvdHN7fQotWzNdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgcmVwb3J0IFszXQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotSGVyZSBpcyB3aGF0IHRoZSBmaWVsZHMgaW4gdGhlIHByaW1hcnkgbGluZSBtZWFuOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGluZGV4Ci1FbnRyaWVzIGFyZSBudW1iZXJlZCB3aXRoIGNvbnNlY3V0aXZlIGludGVnZXJzLiAgRWFjaCBmdW5jdGlvbgotdGhlcmVmb3JlIGhhcyBhbiBpbmRleCBudW1iZXIsIHdoaWNoIGFwcGVhcnMgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMKLXByaW1hcnkgbGluZS4KLQotRWFjaCBjcm9zcy1yZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiwgYXMgYSBjYWxsZXIgb3Igc3Vicm91dGluZSBvZgotYW5vdGhlciwgZ2l2ZXMgaXRzIGluZGV4IG51bWJlciBhcyB3ZWxsIGFzIGl0cyBuYW1lLiAgVGhlIGluZGV4IG51bWJlcgotZ3VpZGVzIHlvdSBpZiB5b3Ugd2lzaCB0byBsb29rIGZvciB0aGUgZW50cnkgZm9yIHRoYXQgZnVuY3Rpb24uCi0KLUBpdGVtICUgdGltZQotVGhpcyBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgdGltZSB0aGF0IHdhcyBzcGVudCBpbiB0aGlzCi1mdW5jdGlvbiwgaW5jbHVkaW5nIHRpbWUgc3BlbnQgaW4gc3Vicm91dGluZXMgY2FsbGVkIGZyb20gdGhpcwotZnVuY3Rpb24uCi0KLVRoZSB0aW1lIHNwZW50IGluIHRoaXMgZnVuY3Rpb24gaXMgY291bnRlZCBhZ2FpbiBmb3IgdGhlIGNhbGxlcnMgb2YKLXRoaXMgZnVuY3Rpb24uICBUaGVyZWZvcmUsIGFkZGluZyB1cCB0aGVzZSBwZXJjZW50YWdlcyBpcyBtZWFuaW5nbGVzcy4KLQotQGl0ZW0gc2VsZgotVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gdGhpcyBmdW5jdGlvbi4gIFRoaXMKLXNob3VsZCBiZSBpZGVudGljYWwgdG8gdGhlIG51bWJlciBwcmludGVkIGluIHRoZSBAY29kZXtzZWNvbmRzfSBmaWVsZAotZm9yIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGZsYXQgcHJvZmlsZS4KLQotQGl0ZW0gY2hpbGRyZW4KLVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHRoZSBzdWJyb3V0aW5lIGNhbGxzIG1hZGUgYnkKLXRoaXMgZnVuY3Rpb24uICBUaGlzIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgc3VtIG9mIGFsbCB0aGUgQGNvZGV7c2VsZn0KLWFuZCBAY29kZXtjaGlsZHJlbn0gZW50cmllcyBvZiB0aGUgY2hpbGRyZW4gbGlzdGVkIGRpcmVjdGx5IGJlbG93IHRoaXMKLWZ1bmN0aW9uLgotCi1AaXRlbSBjYWxsZWQKLVRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4KLQotSWYgdGhlIGZ1bmN0aW9uIGNhbGxlZCBpdHNlbGYgcmVjdXJzaXZlbHksIHRoZXJlIGFyZSB0d28gbnVtYmVycywKLXNlcGFyYXRlZCBieSBhIEBzYW1weyt9LiAgVGhlIGZpcnN0IG51bWJlciBjb3VudHMgbm9uLXJlY3Vyc2l2ZSBjYWxscywKLWFuZCB0aGUgc2Vjb25kIGNvdW50cyByZWN1cnNpdmUgY2FsbHMuCi0KLUluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZnVuY3Rpb24gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIG9uY2UgZnJvbQotQGNvZGV7bWFpbn0uCi0KLUBpdGVtIG5hbWUKLVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUgaW5kZXggbnVtYmVyIGlzCi1yZXBlYXRlZCBhZnRlciBpdC4KLQotSWYgdGhlIGZ1bmN0aW9uIGlzIHBhcnQgb2YgYSBjeWNsZSBvZiByZWN1cnNpb24sIHRoZSBjeWNsZSBudW1iZXIgaXMKLXByaW50ZWQgYmV0d2VlbiB0aGUgZnVuY3Rpb24ncyBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyCi0oQHB4cmVme0N5Y2xlc30pLiAgRm9yIGV4YW1wbGUsIGlmIGZ1bmN0aW9uIEBjb2Rle2dudXJyfSBpcyBwYXJ0IG9mCi1jeWNsZSBudW1iZXIgb25lLCBhbmQgaGFzIGluZGV4IG51bWJlciB0d2VsdmUsIGl0cyBwcmltYXJ5IGxpbmUgd291bGQKLWJlIGVuZCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1nbnVyciA8Y3ljbGUgMT4gWzEyXQotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi0KLUBub2RlIENhbGxlcnMsIFN1YnJvdXRpbmVzLCBQcmltYXJ5LCBDYWxsIEdyYXBoCi1Ac3Vic2VjdGlvbiBMaW5lcyBmb3IgYSBGdW5jdGlvbidzIENhbGxlcnMKLQotQSBmdW5jdGlvbidzIGVudHJ5IGhhcyBhIGxpbmUgZm9yIGVhY2ggZnVuY3Rpb24gaXQgd2FzIGNhbGxlZCBieS4KLVRoZXNlIGxpbmVzJyBmaWVsZHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGxpbmUsIGJ1dAotdGhlaXIgbWVhbmluZ3MgYXJlIGRpZmZlcmVudCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbmNlIGluIGNvbnRleHQuCi0KLUZvciByZWZlcmVuY2UsIHdlIHJlcGVhdCB0d28gbGluZXMgZnJvbSB0aGUgZW50cnkgZm9yIHRoZSBmdW5jdGlvbgotQGNvZGV7cmVwb3J0fSwgdGhlIHByaW1hcnkgbGluZSBhbmQgb25lIGNhbGxlci1saW5lIHByZWNlZGluZyBpdCwgdG9nZXRoZXIKLXdpdGggdGhlIGhlYWRpbmcgbGluZSB0aGF0IHNob3dzIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzOgotCi1Ac21hbGxleGFtcGxlCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotQGRvdHN7fQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIG1haW4gWzJdCi1bM10gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICByZXBvcnQgWzNdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1IZXJlIGFyZSB0aGUgbWVhbmluZ3Mgb2YgdGhlIGZpZWxkcyBpbiB0aGUgY2FsbGVyLWxpbmUgZm9yIEBjb2Rle3JlcG9ydH0KLWNhbGxlZCBmcm9tIEBjb2Rle21haW59OgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHNlbGYKLUFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBAY29kZXtyZXBvcnR9IGl0c2VsZiB3aGVuIGl0IHdhcwotY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCi0KLUBpdGVtIGNoaWxkcmVuCi1BbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gc3Vicm91dGluZXMgb2YgQGNvZGV7cmVwb3J0fQotd2hlbiBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufS4KLQotVGhlIHN1bSBvZiB0aGUgQGNvZGV7c2VsZn0gYW5kIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgaXMgYW4gZXN0aW1hdGUKLW9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3aXRoaW4gY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tIEBjb2Rle21haW59LgotCi1AaXRlbSBjYWxsZWQKLVR3byBudW1iZXJzOiB0aGUgbnVtYmVyIG9mIHRpbWVzIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LAotZm9sbG93ZWQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBub25yZWN1cnNpdmUgY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tCi1hbGwgaXRzIGNhbGxlcnMuCi0KLUBpdGVtIG5hbWUgYW5kIGluZGV4IG51bWJlcgotVGhlIG5hbWUgb2YgdGhlIGNhbGxlciBvZiBAY29kZXtyZXBvcnR9IHRvIHdoaWNoIHRoaXMgbGluZSBhcHBsaWVzLAotZm9sbG93ZWQgYnkgdGhlIGNhbGxlcidzIGluZGV4IG51bWJlci4KLQotTm90IGFsbCBmdW5jdGlvbnMgaGF2ZSBlbnRyaWVzIGluIHRoZSBjYWxsIGdyYXBoOyBzb21lCi1vcHRpb25zIHRvIEBjb2Rle2dwcm9mfSByZXF1ZXN0IHRoZSBvbWlzc2lvbiBvZiBjZXJ0YWluIGZ1bmN0aW9ucy4KLVdoZW4gYSBjYWxsZXIgaGFzIG5vIGVudHJ5IG9mIGl0cyBvd24sIGl0IHN0aWxsIGhhcyBjYWxsZXItbGluZXMKLWluIHRoZSBlbnRyaWVzIG9mIHRoZSBmdW5jdGlvbnMgaXQgY2FsbHMuCi0KLUlmIHRoZSBjYWxsZXIgaXMgcGFydCBvZiBhIHJlY3Vyc2lvbiBjeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcwotcHJpbnRlZCBiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotQGVuZCB0YWJsZQotCi1JZiB0aGUgaWRlbnRpdHkgb2YgdGhlIGNhbGxlcnMgb2YgYSBmdW5jdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgYQotZHVtbXkgY2FsbGVyLWxpbmUgaXMgcHJpbnRlZCB3aGljaCBoYXMgQHNhbXB7PHNwb250YW5lb3VzPn0gYXMgdGhlCi1gYGNhbGxlcidzIG5hbWUnJyBhbmQgYWxsIG90aGVyIGZpZWxkcyBibGFuay4gIFRoaXMgY2FuIGhhcHBlbiBmb3IKLXNpZ25hbCBoYW5kbGVycy4KLUBjIFdoYXQgaWYgc29tZSBjYWxscyBoYXZlIGRldGVybWluYWJsZSBjYWxsZXJzJyBuYW1lcyBidXQgbm90IGFsbD8KLUBjIEZJWE1FIC0gc3RpbGwgcmVsZXZhbnQ/Ci0KLUBub2RlIFN1YnJvdXRpbmVzLCBDeWNsZXMsIENhbGxlcnMsIENhbGwgR3JhcGgKLUBzdWJzZWN0aW9uIExpbmVzIGZvciBhIEZ1bmN0aW9uJ3MgU3Vicm91dGluZXMKLQotQSBmdW5jdGlvbidzIGVudHJ5IGhhcyBhIGxpbmUgZm9yIGVhY2ggb2YgaXRzIHN1YnJvdXRpbmVzLS0taW4gb3RoZXIKLXdvcmRzLCBhIGxpbmUgZm9yIGVhY2ggb3RoZXIgZnVuY3Rpb24gdGhhdCBpdCBjYWxsZWQuICBUaGVzZSBsaW5lcycKLWZpZWxkcyBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnkgbGluZSwgYnV0IHRoZWlyIG1lYW5pbmdzCi1hcmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVuY2UgaW4gY29udGV4dC4KLQotRm9yIHJlZmVyZW5jZSwgd2UgcmVwZWF0IHR3byBsaW5lcyBmcm9tIHRoZSBlbnRyeSBmb3IgdGhlIGZ1bmN0aW9uCi1AY29kZXttYWlufSwgdGhlIHByaW1hcnkgbGluZSBhbmQgYSBsaW5lIGZvciBhIHN1YnJvdXRpbmUsIHRvZ2V0aGVyCi13aXRoIHRoZSBoZWFkaW5nIGxpbmUgdGhhdCBzaG93cyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkczoKLQotQHNtYWxsZXhhbXBsZQotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLUBkb3Rze30KLVsyXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgcmVwb3J0IFszXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSGVyZSBhcmUgdGhlIG1lYW5pbmdzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHN1YnJvdXRpbmUtbGluZSBmb3IgQGNvZGV7bWFpbn0KLWNhbGxpbmcgQGNvZGV7cmVwb3J0fToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzZWxmCi1BbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgZGlyZWN0bHkgd2l0aGluIEBjb2Rle3JlcG9ydH0KLXdoZW4gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCi0KLUBpdGVtIGNoaWxkcmVuCi1BbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gc3Vicm91dGluZXMgb2YgQGNvZGV7cmVwb3J0fQotd2hlbiBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufS4KLQotVGhlIHN1bSBvZiB0aGUgQGNvZGV7c2VsZn0gYW5kIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgaXMgYW4gZXN0aW1hdGUKLW9mIHRoZSB0b3RhbCB0aW1lIHNwZW50IGluIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbSBAY29kZXttYWlufS4KLQotQGl0ZW0gY2FsbGVkCi1Ud28gbnVtYmVycywgdGhlIG51bWJlciBvZiBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20gQGNvZGV7bWFpbn0KLWZvbGxvd2VkIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2Ygbm9ucmVjdXJzaXZlIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0uCi1UaGlzIHJhdGlvIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIEBjb2Rle3JlcG9ydH0ncyBAY29kZXtzZWxmfQotYW5kIEBjb2Rle2NoaWxkcmVufSB0aW1lIGdldHMgY3JlZGl0ZWQgdG8gQGNvZGV7bWFpbn0uCi1AeHJlZntBc3N1bXB0aW9uc30uCi0KLUBpdGVtIG5hbWUKLVRoZSBuYW1lIG9mIHRoZSBzdWJyb3V0aW5lIG9mIEBjb2Rle21haW59IHRvIHdoaWNoIHRoaXMgbGluZSBhcHBsaWVzLAotZm9sbG93ZWQgYnkgdGhlIHN1YnJvdXRpbmUncyBpbmRleCBudW1iZXIuCi0KLUlmIHRoZSBjYWxsZXIgaXMgcGFydCBvZiBhIHJlY3Vyc2lvbiBjeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcwotcHJpbnRlZCBiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotQGVuZCB0YWJsZQotCi1Abm9kZSBDeWNsZXMsLCBTdWJyb3V0aW5lcywgQ2FsbCBHcmFwaAotQHN1YnNlY3Rpb24gSG93IE11dHVhbGx5IFJlY3Vyc2l2ZSBGdW5jdGlvbnMgQXJlIERlc2NyaWJlZAotQGNpbmRleCBjeWNsZQotQGNpbmRleCByZWN1cnNpb24gY3ljbGUKLQotVGhlIGdyYXBoIG1heSBiZSBjb21wbGljYXRlZCBieSB0aGUgcHJlc2VuY2Ugb2YgQGRmbntjeWNsZXMgb2YKLXJlY3Vyc2lvbn0gaW4gdGhlIGNhbGwgZ3JhcGguICBBIGN5Y2xlIGV4aXN0cyBpZiBhIGZ1bmN0aW9uIGNhbGxzCi1hbm90aGVyIGZ1bmN0aW9uIHRoYXQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGNhbGxzIChvciBhcHBlYXJzIHRvCi1jYWxsKSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uICBGb3IgZXhhbXBsZTogaWYgQGNvZGV7YX0gY2FsbHMgQGNvZGV7Yn0sCi1hbmQgQGNvZGV7Yn0gY2FsbHMgQGNvZGV7YX0sIHRoZW4gQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGZvcm0gYSBjeWNsZS4KLQotV2hlbmV2ZXIgdGhlcmUgYXJlIGNhbGwgcGF0aHMgYm90aCB3YXlzIGJldHdlZW4gYSBwYWlyIG9mIGZ1bmN0aW9ucywgdGhleQotYmVsb25nIHRvIHRoZSBzYW1lIGN5Y2xlLiAgSWYgQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGNhbGwgZWFjaCBvdGhlciBhbmQKLUBjb2Rle2J9IGFuZCBAY29kZXtjfSBjYWxsIGVhY2ggb3RoZXIsIGFsbCB0aHJlZSBtYWtlIG9uZSBjeWNsZS4gIE5vdGUgdGhhdAotZXZlbiBpZiBAY29kZXtifSBvbmx5IGNhbGxzIEBjb2Rle2F9IGlmIGl0IHdhcyBub3QgY2FsbGVkIGZyb20gQGNvZGV7YX0sCi1AY29kZXtncHJvZn0gY2Fubm90IGRldGVybWluZSB0aGlzLCBzbyBAY29kZXthfSBhbmQgQGNvZGV7Yn0gYXJlIHN0aWxsCi1jb25zaWRlcmVkIGEgY3ljbGUuCi0KLVRoZSBjeWNsZXMgYXJlIG51bWJlcmVkIHdpdGggY29uc2VjdXRpdmUgaW50ZWdlcnMuICBXaGVuIGEgZnVuY3Rpb24KLWJlbG9uZ3MgdG8gYSBjeWNsZSwgZWFjaCB0aW1lIHRoZSBmdW5jdGlvbiBuYW1lIGFwcGVhcnMgaW4gdGhlIGNhbGwgZ3JhcGgKLWl0IGlzIGZvbGxvd2VkIGJ5IEBzYW1wezxjeWNsZSBAdmFye251bWJlcn0+fS4KLQotVGhlIHJlYXNvbiBjeWNsZXMgbWF0dGVyIGlzIHRoYXQgdGhleSBtYWtlIHRoZSB0aW1lIHZhbHVlcyBpbiB0aGUgY2FsbAotZ3JhcGggcGFyYWRveGljYWwuICBUaGUgYGB0aW1lIHNwZW50IGluIGNoaWxkcmVuJycgb2YgQGNvZGV7YX0gc2hvdWxkCi1pbmNsdWRlIHRoZSB0aW1lIHNwZW50IGluIGl0cyBzdWJyb3V0aW5lIEBjb2Rle2J9IGFuZCBpbiBAY29kZXtifSdzCi1zdWJyb3V0aW5lcy0tLWJ1dCBvbmUgb2YgQGNvZGV7Yn0ncyBzdWJyb3V0aW5lcyBpcyBAY29kZXthfSEgIEhvdyBtdWNoIG9mCi1AY29kZXthfSdzIHRpbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjaGlsZHJlbiBvZiBAY29kZXthfSwgd2hlbgotQGNvZGV7YX0gaXMgaW5kaXJlY3RseSByZWN1cnNpdmU/Ci0KLVRoZSB3YXkgQGNvZGV7Z3Byb2Z9IHJlc29sdmVzIHRoaXMgcGFyYWRveCBpcyBieSBjcmVhdGluZyBhIHNpbmdsZSBlbnRyeQotZm9yIHRoZSBjeWNsZSBhcyBhIHdob2xlLiAgVGhlIHByaW1hcnkgbGluZSBvZiB0aGlzIGVudHJ5IGRlc2NyaWJlcyB0aGUKLXRvdGFsIHRpbWUgc3BlbnQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9ucyBvZiB0aGUgY3ljbGUuICBUaGUKLWBgc3Vicm91dGluZXMnJyBvZiB0aGUgY3ljbGUgYXJlIHRoZSBpbmRpdmlkdWFsIGZ1bmN0aW9ucyBvZiB0aGUgY3ljbGUsIGFuZAotYWxsIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHdlcmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZW0uICBUaGUgYGBjYWxsZXJzJycgb2YKLXRoZSBjeWNsZSBhcmUgdGhlIGZ1bmN0aW9ucywgb3V0c2lkZSB0aGUgY3ljbGUsIHRoYXQgY2FsbGVkIGZ1bmN0aW9ucyBpbgotdGhlIGN5Y2xlLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgcG9ydGlvbiBvZiBhIGNhbGwgZ3JhcGggd2hpY2ggc2hvd3MgYSBjeWNsZSBjb250YWluaW5nCi1mdW5jdGlvbnMgQGNvZGV7YX0gYW5kIEBjb2Rle2J9LiAgVGhlIGN5Y2xlIHdhcyBlbnRlcmVkIGJ5IGEgY2FsbCB0bwotQGNvZGV7YX0gZnJvbSBAY29kZXttYWlufTsgYm90aCBAY29kZXthfSBhbmQgQGNvZGV7Yn0gY2FsbGVkIEBjb2Rle2N9LgotCi1Ac21hbGxleGFtcGxlCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLVszXSAgICAgOTEuNzEgICAgMS43NyAgICAgICAgMCAgICAxKzUgICAgPGN5Y2xlIDEgYXMgYSB3aG9sZT4gWzNdCi0gICAgICAgICAgICAgICAgIDEuMDIgICAgICAgIDAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgMC43NSAgICAgICAgMCAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi1bNF0gICAgIDUyLjg1ICAgIDEuMDIgICAgICAgIDAgICAgMCAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotWzVdICAgICAzOC44NiAgICAwLjc1ICAgICAgICAwICAgIDEgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotKFRoZSBlbnRpcmUgY2FsbCBncmFwaCBmb3IgdGhpcyBwcm9ncmFtIGNvbnRhaW5zIGluIGFkZGl0aW9uIGFuIGVudHJ5IGZvcgotQGNvZGV7bWFpbn0sIHdoaWNoIGNhbGxzIEBjb2Rle2F9LCBhbmQgYW4gZW50cnkgZm9yIEBjb2Rle2N9LCB3aXRoIGNhbGxlcnMKLUBjb2Rle2F9IGFuZCBAY29kZXtifS4pCi0KLUBzbWFsbGV4YW1wbGUKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BvbnRhbmVvdXM+Ci1bMV0gICAgMTAwLjAwICAgICAgIDAgICAgIDEuOTMgICAgMCAgICAgIHN0YXJ0IFsxXQotICAgICAgICAgICAgICAgICAwLjE2ICAgICAxLjc3ICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMC4xNiAgICAgMS43NyAgICAxLzEgICAgICAgIHN0YXJ0IFsxXQotWzJdICAgIDEwMC4wMCAgICAwLjE2ICAgICAxLjc3ICAgIDEgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBtYWluIFsyXQotWzNdICAgICA5MS43MSAgICAxLjc3ICAgICAgICAwICAgIDErNSAgICA8Y3ljbGUgMSBhcyBhIHdob2xlPiBbM10KLSAgICAgICAgICAgICAgICAgMS4wMiAgICAgICAgMCAgICAzICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAwLjc1ICAgICAgICAwICAgIDIgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgNi82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi1bNF0gICAgIDUyLjg1ICAgIDEuMDIgICAgICAgIDAgICAgMCAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotWzVdICAgICAzOC44NiAgICAwLjc1ICAgICAgICAwICAgIDEgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi1bNl0gICAgICAwLjAwICAgICAgIDAgICAgICAgIDAgICAgNiAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQGNvZGV7c2VsZn0gZmllbGQgb2YgdGhlIGN5Y2xlJ3MgcHJpbWFyeSBsaW5lIGlzIHRoZSB0b3RhbCB0aW1lCi1zcGVudCBpbiBhbGwgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgY3ljbGUuICBJdCBlcXVhbHMgdGhlIHN1bSBvZiB0aGUKLUBjb2Rle3NlbGZ9IGZpZWxkcyBmb3IgdGhlIGluZGl2aWR1YWwgZnVuY3Rpb25zIGluIHRoZSBjeWNsZSwgZm91bmQKLWluIHRoZSBlbnRyeSBpbiB0aGUgc3Vicm91dGluZSBsaW5lcyBmb3IgdGhlc2UgZnVuY3Rpb25zLgotCi1UaGUgQGNvZGV7Y2hpbGRyZW59IGZpZWxkcyBvZiB0aGUgY3ljbGUncyBwcmltYXJ5IGxpbmUgYW5kIHN1YnJvdXRpbmUgbGluZXMKLWNvdW50IG9ubHkgc3Vicm91dGluZXMgb3V0c2lkZSB0aGUgY3ljbGUuICBFdmVuIHRob3VnaCBAY29kZXthfSBjYWxscwotQGNvZGV7Yn0sIHRoZSB0aW1lIHNwZW50IGluIHRob3NlIGNhbGxzIHRvIEBjb2Rle2J9IGlzIG5vdCBjb3VudGVkIGluCi1AY29kZXthfSdzIEBjb2Rle2NoaWxkcmVufSB0aW1lLiAgVGh1cywgd2UgZG8gbm90IGVuY291bnRlciB0aGUgcHJvYmxlbSBvZgotd2hhdCB0byBkbyB3aGVuIHRoZSB0aW1lIGluIHRob3NlIGNhbGxzIHRvIEBjb2Rle2J9IGluY2x1ZGVzIGluZGlyZWN0Ci1yZWN1cnNpdmUgY2FsbHMgYmFjayB0byBAY29kZXthfS4KLQotVGhlIEBjb2Rle2NoaWxkcmVufSBmaWVsZCBvZiBhIGNhbGxlci1saW5lIGluIHRoZSBjeWNsZSdzIGVudHJ5IGVzdGltYXRlcwotdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IEBlbXBoe2luIHRoZSB3aG9sZSBjeWNsZX0sIGFuZCBpdHMgb3RoZXIKLXN1YnJvdXRpbmVzLCBvbiB0aGUgdGltZXMgd2hlbiB0aGF0IGNhbGxlciBjYWxsZWQgYSBmdW5jdGlvbiBpbiB0aGUgY3ljbGUuCi0KLVRoZSBAY29kZXtjYWxsc30gZmllbGQgaW4gdGhlIHByaW1hcnkgbGluZSBmb3IgdGhlIGN5Y2xlIGhhcyB0d28gbnVtYmVyczoKLWZpcnN0LCB0aGUgbnVtYmVyIG9mIHRpbWVzIGZ1bmN0aW9ucyBpbiB0aGUgY3ljbGUgd2VyZSBjYWxsZWQgYnkgZnVuY3Rpb25zCi1vdXRzaWRlIHRoZSBjeWNsZTsgc2Vjb25kLCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZXkgd2VyZSBjYWxsZWQgYnkKLWZ1bmN0aW9ucyBpbiB0aGUgY3ljbGUgKGluY2x1ZGluZyB0aW1lcyB3aGVuIGEgZnVuY3Rpb24gaW4gdGhlIGN5Y2xlIGNhbGxzCi1pdHNlbGYpLiAgVGhpcyBpcyBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSB1c3VhbCBzcGxpdCBpbnRvIG5vbnJlY3Vyc2l2ZSBhbmQKLXJlY3Vyc2l2ZSBjYWxscy4KLQotVGhlIEBjb2Rle2NhbGxzfSBmaWVsZCBvZiBhIHN1YnJvdXRpbmUtbGluZSBmb3IgYSBjeWNsZSBtZW1iZXIgaW4gdGhlCi1jeWNsZSdzIGVudHJ5IHNheXMgaG93IG1hbnkgdGltZSB0aGF0IGZ1bmN0aW9uIHdhcyBjYWxsZWQgZnJvbSBmdW5jdGlvbnMgaW4KLXRoZSBjeWNsZS4gIFRoZSB0b3RhbCBvZiBhbGwgdGhlc2UgaXMgdGhlIHNlY29uZCBudW1iZXIgaW4gdGhlIHByaW1hcnkgbGluZSdzCi1AY29kZXtjYWxsc30gZmllbGQuCi0KLUluIHRoZSBpbmRpdmlkdWFsIGVudHJ5IGZvciBhIGZ1bmN0aW9uIGluIGEgY3ljbGUsIHRoZSBvdGhlciBmdW5jdGlvbnMgaW4KLXRoZSBzYW1lIGN5Y2xlIGNhbiBhcHBlYXIgYXMgc3Vicm91dGluZXMgYW5kIGFzIGNhbGxlcnMuICBUaGVzZSBsaW5lcyBzaG93Ci1ob3cgbWFueSB0aW1lcyBlYWNoIGZ1bmN0aW9uIGluIHRoZSBjeWNsZSBjYWxsZWQgb3Igd2FzIGNhbGxlZCBmcm9tIGVhY2ggb3RoZXIKLWZ1bmN0aW9uIGluIHRoZSBjeWNsZS4gIFRoZSBAY29kZXtzZWxmfSBhbmQgQGNvZGV7Y2hpbGRyZW59IGZpZWxkcyBpbiB0aGVzZQotbGluZXMgYXJlIGJsYW5rIGJlY2F1c2Ugb2YgdGhlIGRpZmZpY3VsdHkgb2YgZGVmaW5pbmcgbWVhbmluZ3MgZm9yIHRoZW0KLXdoZW4gcmVjdXJzaW9uIGlzIGdvaW5nIG9uLgotCi1Abm9kZSBMaW5lLWJ5LWxpbmUsQW5ub3RhdGVkIFNvdXJjZSxDYWxsIEdyYXBoLE91dHB1dAotQHNlY3Rpb24gTGluZS1ieS1saW5lIFByb2ZpbGluZwotCi1AY29kZXtncHJvZn0ncyBAc2FtcHstbH0gb3B0aW9uIGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBwZXJmb3JtCi1AZGZue2xpbmUtYnktbGluZX0gcHJvZmlsaW5nLiAgSW4gdGhpcyBtb2RlLCBoaXN0b2dyYW0KLXNhbXBsZXMgYXJlIGFzc2lnbmVkIG5vdCB0byBmdW5jdGlvbnMsIGJ1dCB0byBpbmRpdmlkdWFsCi1saW5lcyBvZiBzb3VyY2UgY29kZS4gIFRoZSBwcm9ncmFtIHVzdWFsbHkgbXVzdCBiZSBjb21waWxlZAotd2l0aCBhIEBzYW1wey1nfSBvcHRpb24sIGluIGFkZGl0aW9uIHRvIEBzYW1wey1wZ30sIGluIG9yZGVyCi10byBnZW5lcmF0ZSBkZWJ1Z2dpbmcgc3ltYm9scyBmb3IgdHJhY2tpbmcgc291cmNlIGNvZGUgbGluZXMuCi0KLVRoZSBmbGF0IHByb2ZpbGUgaXMgdGhlIG1vc3QgdXNlZnVsIG91dHB1dCB0YWJsZQotaW4gbGluZS1ieS1saW5lIG1vZGUuCi1UaGUgY2FsbCBncmFwaCBpc24ndCBhcyB1c2VmdWwgYXMgbm9ybWFsLCBzaW5jZQotdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtncHJvZn0gZG9lcyBub3QgcHJvcGFnYXRlCi1jYWxsIGdyYXBoIGFyY3MgZnJvbSBzb3VyY2UgY29kZSBsaW5lcyB0byB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uLgotVGhlIGNhbGwgZ3JhcGggZG9lcywgaG93ZXZlciwgc2hvdyBlYWNoIGxpbmUgb2YgY29kZQotdGhhdCBjYWxsZWQgZWFjaCBmdW5jdGlvbiwgYWxvbmcgd2l0aCBhIGNvdW50LgotCi1IZXJlIGlzIGEgc2VjdGlvbiBvZiBAY29kZXtncHJvZn0ncyBvdXRwdXQsIHdpdGhvdXQgbGluZS1ieS1saW5lIHByb2ZpbGluZy4KLU5vdGUgdGhhdCBAY29kZXtjdF9pbml0fSBhY2NvdW50ZWQgZm9yIGZvdXIgaGlzdG9ncmFtIGhpdHMsIGFuZAotMTMzMjcgY2FsbHMgdG8gQGNvZGV7aW5pdF9ibG9ja30uCi0KLUBzbWFsbGV4YW1wbGUKLUZsYXQgcHJvZmlsZToKLQotRWFjaCBzYW1wbGUgY291bnRzIGFzIDAuMDEgc2Vjb25kcy4KLSAgJSAgIGN1bXVsYXRpdmUgICBzZWxmICAgICAgICAgICAgICBzZWxmICAgICB0b3RhbCAgICAgICAgICAgCi0gdGltZSAgIHNlY29uZHMgICBzZWNvbmRzICAgIGNhbGxzICB1cy9jYWxsICB1cy9jYWxsICBuYW1lICAgIAotIDMwLjc3ICAgICAgMC4xMyAgICAgMC4wNCAgICAgNjMzNSAgICAgNi4zMSAgICAgNi4zMSAgY3RfaW5pdAotCi0KLQkJICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKQotCi0KLWdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzIDQgYnl0ZShzKSBmb3IgNy42OSUgb2YgMC4xMyBzZWNvbmRzCi0KLWluZGV4ICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWUKLQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIG5hbWVfdG9vX2xvbmcKLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICA0MC8xMzQ5NiAgICAgICBkZWZsYXRlCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAxMjgvMTM0OTYgICAgICAgZGVmbGF0ZV9mYXN0Ci0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgMTMzMjcvMTM0OTYgICAgICAgY3RfaW5pdAotWzddICAgICAgMC4wICAgIDAuMDAgICAgMC4wMCAgIDEzNDk2ICAgICAgICAgaW5pdF9ibG9jawotCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ob3cgbGV0J3MgbG9vayBhdCBzb21lIG9mIEBjb2Rle2dwcm9mfSdzIG91dHB1dCBmcm9tIHRoZSBzYW1lIHByb2dyYW0gcnVuLAotdGhpcyB0aW1lIHdpdGggbGluZS1ieS1saW5lIHByb2ZpbGluZyBlbmFibGVkLiAgTm90ZSB0aGF0IEBjb2Rle2N0X2luaXR9J3MKLWZvdXIgaGlzdG9ncmFtIGhpdHMgYXJlIGJyb2tlbiBkb3duIGludG8gZm91ciBsaW5lcyBvZiBzb3VyY2UgY29kZSAtIG9uZSBoaXQKLW9jY3VyZWQgb24gZWFjaCBvZiBsaW5lcyAzNDksIDM1MSwgMzgyIGFuZCAzODUuICBJbiB0aGUgY2FsbCBncmFwaCwKLW5vdGUgaG93Ci1AY29kZXtjdF9pbml0fSdzIDEzMzI3IGNhbGxzIHRvIEBjb2Rle2luaXRfYmxvY2t9IGFyZSBicm9rZW4gZG93bgotaW50byBvbmUgY2FsbCBmcm9tIGxpbmUgMzk2LCAzMDcxIGNhbGxzIGZyb20gbGluZSAzODQsIDM3MzAgY2FsbHMKLWZyb20gbGluZSAzODUsIGFuZCA2NTI1IGNhbGxzIGZyb20gMzg3LgotCi1Ac21hbGxleGFtcGxlCi1GbGF0IHByb2ZpbGU6Ci0KLUVhY2ggc2FtcGxlIGNvdW50cyBhcyAwLjAxIHNlY29uZHMuCi0gICUgICBjdW11bGF0aXZlICAgc2VsZiAgICAgICAgICAgICAgICAgICAgCi0gdGltZSAgIHNlY29uZHMgICBzZWNvbmRzICAgIGNhbGxzICBuYW1lICAgIAotICA3LjY5ICAgICAgMC4xMCAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozNDkpCi0gIDcuNjkgICAgICAwLjExICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM1MSkKLSAgNy42OSAgICAgIDAuMTIgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6MzgyKQotICA3LjY5ICAgICAgMC4xMyAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODUpCi0KLQotCQkgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpCi0KLQotZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgNCBieXRlKHMpIGZvciA3LjY5JSBvZiAwLjEzIHNlY29uZHMKLQotICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lCi0KLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIG5hbWVfdG9vX2xvbmcgKGd6aXAuYzoxNDQwKQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjc2MykKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzk2KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDIvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjcyNykKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA0LzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo2ODYpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgNS8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6Njc1KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgMTIvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjY3OSkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDE2LzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo3MzApCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgIDEyOC8xMzQ5NiAgICAgICBkZWZsYXRlX2Zhc3QgKGRlZmxhdGUuYzo2NTQpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgMzA3MS8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NCkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAzNzMwLzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg1KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgIDY1MjUvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODcpCi1bNl0gIDAuMCAgICAwLjAwICAgIDAuMDAgICAxMzQ5NiAgICAgICAgIGluaXRfYmxvY2sgKHRyZWVzLmM6NDA4KQotCi1AZW5kIHNtYWxsZXhhbXBsZQotCi0KLUBub2RlIEFubm90YXRlZCBTb3VyY2UsLExpbmUtYnktbGluZSxPdXRwdXQKLUBzZWN0aW9uIFRoZSBBbm5vdGF0ZWQgU291cmNlIExpc3RpbmcKLQotQGNvZGV7Z3Byb2Z9J3MgQHNhbXB7LUF9IG9wdGlvbiB0cmlnZ2VycyBhbiBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcsCi13aGljaCBsaXN0cyB0aGUgcHJvZ3JhbSdzIHNvdXJjZSBjb2RlLCBlYWNoIGZ1bmN0aW9uIGxhYmVsZWQgd2l0aCB0aGUKLW51bWJlciBvZiB0aW1lcyBpdCB3YXMgY2FsbGVkLiAgWW91IG1heSBhbHNvIG5lZWQgdG8gc3BlY2lmeSB0aGUKLUBzYW1wey1JfSBvcHRpb24sIGlmIEBjb2Rle2dwcm9mfSBjYW4ndCBmaW5kIHRoZSBzb3VyY2UgY29kZSBmaWxlcy4KLQotQ29tcGlsaW5nIHdpdGggQHNhbXB7Z2NjIEBkb3Rze30gLWcgLXBnIC1hfSBhdWdtZW50cyB5b3VyIHByb2dyYW0KLXdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgY29kZSwgaW4gYWRkaXRpb24gdG8gZnVuY3Rpb24gY291bnRpbmcgY29kZS4KLVRoaXMgZW5hYmxlcyBAY29kZXtncHJvZn0gdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHRpbWVzIGVhY2ggbGluZQotb2YgY29kZSB3YXMgZXhldWN0ZWQuCi1Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiwgdGFrZW4gZnJvbSBnemlwLAotd2l0aCBsaW5lIG51bWJlcnMgYWRkZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLSAxIHVsZyB1cGRjcmMocywgbikKLSAyICAgICB1Y2ggKnM7Ci0gMyAgICAgdW5zaWduZWQgbjsKLSA0IEB7Ci0gNSAgICAgcmVnaXN0ZXIgdWxnIGM7Ci0gNgotIDcgICAgIHN0YXRpYyB1bGcgY3JjID0gKHVsZykweGZmZmZmZmZmTDsKLSA4Ci0gOSAgICAgaWYgKHMgPT0gTlVMTCkgQHsKLTEwICAgICAgICAgYyA9IDB4ZmZmZmZmZmZMOwotMTEgICAgIEB9IGVsc2UgQHsKLTEyICAgICAgICAgYyA9IGNyYzsKLTEzICAgICAgICAgaWYgKG4pIGRvIEB7Ci0xNCAgICAgICAgICAgICBjID0gY3JjXzMyX3RhYlsuLi5dOwotMTUgICAgICAgICBAfSB3aGlsZSAoLS1uKTsKLTE2ICAgICBAfQotMTcgICAgIGNyYyA9IGM7Ci0xOCAgICAgcmV0dXJuIGMgXiAweGZmZmZmZmZmTDsKLTE5IEB9Ci0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle3VwZGNyY30gaGFzIGF0IGxlYXN0IGZpdmUgYmFzaWMtYmxvY2tzLgotT25lIGlzIHRoZSBmdW5jdGlvbiBpdHNlbGYuICBUaGUKLUBjb2Rle2lmfSBzdGF0ZW1lbnQgb24gbGluZSA5IGdlbmVyYXRlcyB0d28gbW9yZSBiYXNpYy1ibG9ja3MsIG9uZQotZm9yIGVhY2ggYnJhbmNoIG9mIHRoZSBAY29kZXtpZn0uICBBIGZvdXJ0aCBiYXNpYy1ibG9jayByZXN1bHRzIGZyb20KLXRoZSBAY29kZXtpZn0gb24gbGluZSAxMywgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgQGNvZGV7ZG99IGxvb3AgZm9ybQotdGhlIGZpZnRoIGJhc2ljLWJsb2NrLiAgVGhlIGNvbXBpbGVyIG1heSBhbHNvIGdlbmVyYXRlIGFkZGl0aW9uYWwKLWJhc2ljLWJsb2NrcyB0byBoYW5kbGUgdmFyaW91cyBzcGVjaWFsIGNhc2VzLgotCi1BIHByb2dyYW0gYXVnbWVudGVkIGZvciBiYXNpYy1ibG9jayBjb3VudGluZyBjYW4gYmUgYW5hbHl6ZWQgd2l0aAotQGNvZGV7Z3Byb2YgLWwgLUF9LiAgSSBhbHNvIHN1Z2dlc3QgdXNlIG9mIHRoZSBAc2FtcHsteH0gb3B0aW9uLAotd2hpY2ggZW5zdXJlcyB0aGF0IGVhY2ggbGluZSBvZiBjb2RlIGlzIGxhYmVsZWQgYXQgbGVhc3Qgb25jZS4KLUhlcmUgaXMgQGNvZGV7dXBkY3JjfSdzCi1hbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcgZm9yIGEgc2FtcGxlIEBjb2Rle2d6aXB9IHJ1bjoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAgICAgICAgIHVsZyB1cGRjcmMocywgbikKLSAgICAgICAgICAgICAgICAgICAgdWNoICpzOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBuOwotICAgICAgICAgICAgMiAtPkB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHVsZyBjOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdWxnIGNyYyA9ICh1bGcpMHhmZmZmZmZmZkw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAyIC0+ICAgIGlmIChzID09IE5VTEwpIEB7Ci0gICAgICAgICAgICAxIC0+CWMgPSAweGZmZmZmZmZmTDsKLSAgICAgICAgICAgIDEgLT4gICAgQH0gZWxzZSBAewotICAgICAgICAgICAgMSAtPgljID0gY3JjOwotICAgICAgICAgICAgMSAtPiAgICAgICAgaWYgKG4pIGRvIEB7Ci0gICAgICAgIDI2MzEyIC0+ICAgICAgICAgICAgYyA9IGNyY18zMl90YWJbLi4uXTsKLTI2MzEyLDEsMjYzMTEgLT4gICAgICAgIEB9IHdoaWxlICgtLW4pOwotICAgICAgICAgICAgICAgICAgICBAfQotICAgICAgICAgICAgMiAtPiAgICBjcmMgPSBjOwotICAgICAgICAgICAgMiAtPiAgICByZXR1cm4gYyBeIDB4ZmZmZmZmZmZMOwotICAgICAgICAgICAgMiAtPkB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JbiB0aGlzIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkIHR3aWNlLCBwYXNzaW5nIG9uY2UgdGhyb3VnaAotZWFjaCBicmFuY2ggb2YgdGhlIEBjb2Rle2lmfSBzdGF0ZW1lbnQuICBUaGUgYm9keSBvZiB0aGUgQGNvZGV7ZG99Ci1sb29wIHdhcyBleGVjdXRlZCBhIHRvdGFsIG9mIDI2MzEyIHRpbWVzLiAgTm90ZSBob3cgdGhlIEBjb2Rle3doaWxlfQotc3RhdGVtZW50IGlzIGFubm90YXRlZC4gIEl0IGJlZ2FuIGV4ZWN1dGlvbiAyNjMxMiB0aW1lcywgb25jZSBmb3IKLWVhY2ggaXRlcmF0aW9uIHRocm91Z2ggdGhlIGxvb3AuICBPbmUgb2YgdGhvc2UgdGltZXMgKHRoZSBsYXN0IHRpbWUpCi1pdCBleGl0ZWQsIHdoaWxlIGl0IGJyYW5jaGVkIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcCAyNjMxMSB0aW1lcy4KLQotQG5vZGUgSW5hY2N1cmFjeQotQGNoYXB0ZXIgSW5hY2N1cmFjeSBvZiBAY29kZXtncHJvZn0gT3V0cHV0Ci0KLUBtZW51Ci0qIFNhbXBsaW5nIEVycm9yOjogICAgICBTdGF0aXN0aWNhbCBtYXJnaW5zIG9mIGVycm9yCi0qIEFzc3VtcHRpb25zOjogICAgICAgICBFc3RpbWF0aW5nIGNoaWxkcmVuIHRpbWVzCi1AZW5kIG1lbnUKLQotQG5vZGUgU2FtcGxpbmcgRXJyb3IsQXNzdW1wdGlvbnMsLEluYWNjdXJhY3kKLUBzZWN0aW9uIFN0YXRpc3RpY2FsIFNhbXBsaW5nIEVycm9yCi0KLVRoZSBydW4tdGltZSBmaWd1cmVzIHRoYXQgQGNvZGV7Z3Byb2Z9IGdpdmVzIHlvdSBhcmUgYmFzZWQgb24gYSBzYW1wbGluZwotcHJvY2Vzcywgc28gdGhleSBhcmUgc3ViamVjdCB0byBzdGF0aXN0aWNhbCBpbmFjY3VyYWN5LiAgSWYgYSBmdW5jdGlvbiBydW5zCi1vbmx5IGEgc21hbGwgYW1vdW50IG9mIHRpbWUsIHNvIHRoYXQgb24gdGhlIGF2ZXJhZ2UgdGhlIHNhbXBsaW5nIHByb2Nlc3MKLW91Z2h0IHRvIGNhdGNoIHRoYXQgZnVuY3Rpb24gaW4gdGhlIGFjdCBvbmx5IG9uY2UsIHRoZXJlIGlzIGEgcHJldHR5IGdvb2QKLWNoYW5jZSBpdCB3aWxsIGFjdHVhbGx5IGZpbmQgdGhhdCBmdW5jdGlvbiB6ZXJvIHRpbWVzLCBvciB0d2ljZS4KLQotQnkgY29udHJhc3QsIHRoZSBudW1iZXItb2YtY2FsbHMgYW5kIGJhc2ljLWJsb2NrIGZpZ3VyZXMKLWFyZSBkZXJpdmVkIGJ5IGNvdW50aW5nLCBub3QKLXNhbXBsaW5nLiAgVGhleSBhcmUgY29tcGxldGVseSBhY2N1cmF0ZSBhbmQgd2lsbCBub3QgdmFyeSBmcm9tIHJ1biB0byBydW4KLWlmIHlvdXIgcHJvZ3JhbSBpcyBkZXRlcm1pbmlzdGljLgotCi1UaGUgQGRmbntzYW1wbGluZyBwZXJpb2R9IHRoYXQgaXMgcHJpbnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmbGF0Ci1wcm9maWxlIHNheXMgaG93IG9mdGVuIHNhbXBsZXMgYXJlIHRha2VuLiAgVGhlIHJ1bGUgb2YgdGh1bWIgaXMgdGhhdCBhCi1ydW4tdGltZSBmaWd1cmUgaXMgYWNjdXJhdGUgaWYgaXQgaXMgY29uc2lkZXJhYmx5IGJpZ2dlciB0aGFuIHRoZSBzYW1wbGluZwotcGVyaW9kLgotCi1UaGUgYWN0dWFsIGFtb3VudCBvZiBlcnJvciBjYW4gYmUgcHJlZGljdGVkLgotRm9yIEB2YXJ7bn0gc2FtcGxlcywgdGhlIEBlbXBoe2V4cGVjdGVkfSBlcnJvcgotaXMgdGhlIHNxdWFyZS1yb290IG9mIEB2YXJ7bn0uICBGb3IgZXhhbXBsZSwKLWlmIHRoZSBzYW1wbGluZyBwZXJpb2QgaXMgMC4wMSBzZWNvbmRzIGFuZCBAY29kZXtmb299J3MgcnVuLXRpbWUgaXMgMSBzZWNvbmQsCi1AdmFye259IGlzIDEwMCBzYW1wbGVzICgxIHNlY29uZC8wLjAxIHNlY29uZHMpLCBzcXJ0KEB2YXJ7bn0pIGlzIDEwIHNhbXBsZXMsIHNvCi10aGUgZXhwZWN0ZWQgZXJyb3IgaW4gQGNvZGV7Zm9vfSdzIHJ1bi10aW1lIGlzIDAuMSBzZWNvbmRzICgxMCowLjAxIHNlY29uZHMpLAotb3IgdGVuIHBlcmNlbnQgb2YgdGhlIG9ic2VydmVkIHZhbHVlLgotQWdhaW4sIGlmIHRoZSBzYW1wbGluZyBwZXJpb2QgaXMgMC4wMSBzZWNvbmRzIGFuZCBAY29kZXtiYXJ9J3MgcnVuLXRpbWUgaXMKLTEwMCBzZWNvbmRzLCBAdmFye259IGlzIDEwMDAwIHNhbXBsZXMsIHNxcnQoQHZhcntufSkgaXMgMTAwIHNhbXBsZXMsIHNvCi10aGUgZXhwZWN0ZWQgZXJyb3IgaW4gQGNvZGV7YmFyfSdzIHJ1bi10aW1lIGlzIDEgc2Vjb25kLAotb3Igb25lIHBlcmNlbnQgb2YgdGhlIG9ic2VydmVkIHZhbHVlLgotSXQgaXMgbGlrZWx5IHRvCi12YXJ5IHRoaXMgbXVjaCBAZW1waHtvbiB0aGUgYXZlcmFnZX0gZnJvbSBvbmUgcHJvZmlsaW5nIHJ1biB0byB0aGUgbmV4dC4KLShAZW1waHtTb21ldGltZXN9IGl0IHdpbGwgdmFyeSBtb3JlLikKLQotVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgYSBzbWFsbCBydW4tdGltZSBmaWd1cmUgaXMgZGV2b2lkIG9mIGluZm9ybWF0aW9uLgotSWYgdGhlIHByb2dyYW0ncyBAZW1waHt0b3RhbH0gcnVuLXRpbWUgaXMgbGFyZ2UsIGEgc21hbGwgcnVuLXRpbWUgZm9yIG9uZQotZnVuY3Rpb24gZG9lcyB0ZWxsIHlvdSB0aGF0IHRoYXQgZnVuY3Rpb24gdXNlZCBhbiBpbnNpZ25pZmljYW50IGZyYWN0aW9uIG9mCi10aGUgd2hvbGUgcHJvZ3JhbSdzIHRpbWUuICBVc3VhbGx5IHRoaXMgbWVhbnMgaXQgaXMgbm90IHdvcnRoIG9wdGltaXppbmcuCi0KLU9uZSB3YXkgdG8gZ2V0IG1vcmUgYWNjdXJhY3kgaXMgdG8gZ2l2ZSB5b3VyIHByb2dyYW0gbW9yZSAoYnV0IHNpbWlsYXIpCi1pbnB1dCBkYXRhIHNvIGl0IHdpbGwgdGFrZSBsb25nZXIuICBBbm90aGVyIHdheSBpcyB0byBjb21iaW5lIHRoZSBkYXRhIGZyb20KLXNldmVyYWwgcnVucywgdXNpbmcgdGhlIEBzYW1wey1zfSBvcHRpb24gb2YgQGNvZGV7Z3Byb2Z9LiAgSGVyZSBpcyBob3c6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1SdW4geW91ciBwcm9ncmFtIG9uY2UuCi0KLUBpdGVtCi1Jc3N1ZSB0aGUgY29tbWFuZCBAc2FtcHttdiBnbW9uLm91dCBnbW9uLnN1bX0uCi0KLUBpdGVtCi1SdW4geW91ciBwcm9ncmFtIGFnYWluLCB0aGUgc2FtZSBhcyBiZWZvcmUuCi0KLUBpdGVtCi1NZXJnZSB0aGUgbmV3IGRhdGEgaW4gQGZpbGV7Z21vbi5vdXR9IGludG8gQGZpbGV7Z21vbi5zdW19IHdpdGggdGhpcyBjb21tYW5kOgotCi1AZXhhbXBsZQotZ3Byb2YgLXMgQHZhcntleGVjdXRhYmxlLWZpbGV9IGdtb24ub3V0IGdtb24uc3VtCi1AZW5kIGV4YW1wbGUKLQotQGl0ZW0KLVJlcGVhdCB0aGUgbGFzdCB0d28gc3RlcHMgYXMgb2Z0ZW4gYXMgeW91IHdpc2guCi0KLUBpdGVtCi1BbmFseXplIHRoZSBjdW11bGF0aXZlIGRhdGEgdXNpbmcgdGhpcyBjb21tYW5kOgotCi1AZXhhbXBsZQotZ3Byb2YgQHZhcntleGVjdXRhYmxlLWZpbGV9IGdtb24uc3VtID4gQHZhcntvdXRwdXQtZmlsZX0KLUBlbmQgZXhhbXBsZQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgQXNzdW1wdGlvbnMsLFNhbXBsaW5nIEVycm9yLEluYWNjdXJhY3kKLUBzZWN0aW9uIEVzdGltYXRpbmcgQGNvZGV7Y2hpbGRyZW59IFRpbWVzCi0KLVNvbWUgb2YgdGhlIGZpZ3VyZXMgaW4gdGhlIGNhbGwgZ3JhcGggYXJlIGVzdGltYXRlcy0tLWZvciBleGFtcGxlLCB0aGUKLUBjb2Rle2NoaWxkcmVufSB0aW1lIHZhbHVlcyBhbmQgYWxsIHRoZSB0aGUgdGltZSBmaWd1cmVzIGluIGNhbGxlciBhbmQKLXN1YnJvdXRpbmUgbGluZXMuCi0KLVRoZXJlIGlzIG5vIGRpcmVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZWFzdXJlbWVudHMgaW4gdGhlIHByb2ZpbGUKLWRhdGEgaXRzZWxmLiAgSW5zdGVhZCwgQGNvZGV7Z3Byb2Z9IGVzdGltYXRlcyB0aGVtIGJ5IG1ha2luZyBhbiBhc3N1bXB0aW9uCi1hYm91dCB5b3VyIHByb2dyYW0gdGhhdCBtaWdodCBvciBtaWdodCBub3QgYmUgdHJ1ZS4KLQotVGhlIGFzc3VtcHRpb24gbWFkZSBpcyB0aGF0IHRoZSBhdmVyYWdlIHRpbWUgc3BlbnQgaW4gZWFjaCBjYWxsIHRvIGFueQotZnVuY3Rpb24gQGNvZGV7Zm9vfSBpcyBub3QgY29ycmVsYXRlZCB3aXRoIHdobyBjYWxsZWQgQGNvZGV7Zm9vfS4gIElmCi1AY29kZXtmb299IHVzZWQgNSBzZWNvbmRzIGluIGFsbCwgYW5kIDIvNSBvZiB0aGUgY2FsbHMgdG8gQGNvZGV7Zm9vfSBjYW1lCi1mcm9tIEBjb2Rle2F9LCB0aGVuIEBjb2Rle2Zvb30gY29udHJpYnV0ZXMgMiBzZWNvbmRzIHRvIEBjb2Rle2F9J3MKLUBjb2Rle2NoaWxkcmVufSB0aW1lLCBieSBhc3N1bXB0aW9uLgotCi1UaGlzIGFzc3VtcHRpb24gaXMgdXN1YWxseSB0cnVlIGVub3VnaCwgYnV0IGZvciBzb21lIHByb2dyYW1zIGl0IGlzIGZhcgotZnJvbSB0cnVlLiAgU3VwcG9zZSB0aGF0IEBjb2Rle2Zvb30gcmV0dXJucyB2ZXJ5IHF1aWNrbHkgd2hlbiBpdHMgYXJndW1lbnQKLWlzIHplcm87IHN1cHBvc2UgdGhhdCBAY29kZXthfSBhbHdheXMgcGFzc2VzIHplcm8gYXMgYW4gYXJndW1lbnQsIHdoaWxlCi1vdGhlciBjYWxsZXJzIG9mIEBjb2Rle2Zvb30gcGFzcyBvdGhlciBhcmd1bWVudHMuICBJbiB0aGlzIHByb2dyYW0sIGFsbCB0aGUKLXRpbWUgc3BlbnQgaW4gQGNvZGV7Zm9vfSBpcyBpbiB0aGUgY2FsbHMgZnJvbSBjYWxsZXJzIG90aGVyIHRoYW4gQGNvZGV7YX0uCi1CdXQgQGNvZGV7Z3Byb2Z9IGhhcyBubyB3YXkgb2Yga25vd2luZyB0aGlzOyBpdCB3aWxsIGJsaW5kbHkgYW5kCi1pbmNvcnJlY3RseSBjaGFyZ2UgMiBzZWNvbmRzIG9mIHRpbWUgaW4gQGNvZGV7Zm9vfSB0byB0aGUgY2hpbGRyZW4gb2YKLUBjb2Rle2F9LgotCi1AYyBGSVhNRSAtIGhhcyB0aGlzIGJlZW4gZml4ZWQ/Ci1XZSBob3BlIHNvbWUgZGF5IHRvIHB1dCBtb3JlIGNvbXBsZXRlIGRhdGEgaW50byBAZmlsZXtnbW9uLm91dH0sIHNvIHRoYXQKLXRoaXMgYXNzdW1wdGlvbiBpcyBubyBsb25nZXIgbmVlZGVkLCBpZiB3ZSBjYW4gZmlndXJlIG91dCBob3cuICBGb3IgdGhlCi1ub25jZSwgdGhlIGVzdGltYXRlZCBmaWd1cmVzIGFyZSB1c3VhbGx5IG1vcmUgdXNlZnVsIHRoYW4gbWlzbGVhZGluZy4KLQotQG5vZGUgSG93IGRvIEk/Ci1AY2hhcHRlciBBbnN3ZXJzIHRvIENvbW1vbiBRdWVzdGlvbnMKLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBIb3cgZG8gSSBmaW5kIHdoaWNoIGxpbmVzIGluIG15IHByb2dyYW0gd2VyZSBleGVjdXRlZCB0aGUgbW9zdCB0aW1lcz8KLQotQ29tcGlsZSB5b3VyIHByb2dyYW0gd2l0aCBiYXNpYy1ibG9jayBjb3VudGluZyBlbmFibGVkLCBydW4gaXQsIHRoZW4KLXVzZSB0aGUgZm9sbG93aW5nIHBpcGVsaW5lOgotCi1AZXhhbXBsZQotZ3Byb2YgLWwgLUMgQHZhcntvYmpmaWxlfSB8IHNvcnQgLWsgMyAtbiAtcgotQGVuZCBleGFtcGxlCi0KLVRoaXMgbGlzdGluZyB3aWxsIHNob3cgeW91IHRoZSBsaW5lcyBpbiB5b3VyIGNvZGUgZXhlY3V0ZWQgbW9zdCBvZnRlbiwKLWJ1dCBub3QgbmVjZXNzYXJpbHkgdGhvc2UgdGhhdCBjb25zdW1lZCB0aGUgbW9zdCB0aW1lLgotCi1AaXRlbSBIb3cgZG8gSSBmaW5kIHdoaWNoIGxpbmVzIGluIG15IHByb2dyYW0gY2FsbGVkIGEgcGFydGljdWxhciBmdW5jdGlvbj8KLQotVXNlIEBjb2Rle2dwcm9mIC1sfSBhbmQgbG9va3VwIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FsbCBncmFwaC4KLVRoZSBjYWxsZXJzIHdpbGwgYmUgYnJva2VuIGRvd24gYnkgZnVuY3Rpb24gYW5kIGxpbmUgbnVtYmVyLgotCi1AaXRlbSBIb3cgZG8gSSBhbmFseXplIGEgcHJvZ3JhbSB0aGF0IHJ1bnMgZm9yIGxlc3MgdGhhbiBhIHNlY29uZD8KLQotVHJ5IHVzaW5nIGEgc2hlbGwgc2NyaXB0IGxpa2UgdGhpcyBvbmU6Ci0KLUBleGFtcGxlCi1mb3IgaSBpbiBgc2VxIDEgMTAwYDsgZG8KLSAgZmFzdHByb2cKLSAgbXYgZ21vbi5vdXQgZ21vbi5vdXQuJGkKLWRvbmUKLQotZ3Byb2YgLXMgZmFzdHByb2cgZ21vbi5vdXQuKgotCi1ncHJvZiBmYXN0cHJvZyBnbW9uLnN1bQotQGVuZCBleGFtcGxlCi0KLUlmIHlvdXIgcHJvZ3JhbSBpcyBjb21wbGV0ZWx5IGRldGVybWluaXN0aWMsIGFsbCB0aGUgY2FsbCBjb3VudHMKLXdpbGwgYmUgc2ltcGxlIG11bHRpcGxlcyBvZiAxMDAgKGkuZS4gYSBmdW5jdGlvbiBjYWxsZWQgb25jZSBpbgotZWFjaCBydW4gd2lsbCBhcHBlYXIgd2l0aCBhIGNhbGwgY291bnQgb2YgMTAwKS4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmNvbXBhdGliaWxpdGllcwotQGNoYXB0ZXIgSW5jb21wYXRpYmlsaXRpZXMgd2l0aCBVbml4IEBjb2Rle2dwcm9mfQotCi1Ac2N7Z251fSBAY29kZXtncHJvZn0gYW5kIEJlcmtlbGV5IFVuaXggQGNvZGV7Z3Byb2Z9IHVzZSB0aGUgc2FtZSBkYXRhCi1maWxlIEBmaWxle2dtb24ub3V0fSwgYW5kIHByb3ZpZGUgZXNzZW50aWFsbHkgdGhlIHNhbWUgaW5mb3JtYXRpb24uICBCdXQKLXRoZXJlIGFyZSBhIGZldyBkaWZmZXJlbmNlcy4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUBzY3tnbnV9IEBjb2Rle2dwcm9mfSB1c2VzIGEgbmV3LCBnZW5lcmFsaXplZCBmaWxlIGZvcm1hdCB3aXRoIHN1cHBvcnQKLWZvciBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGFuZCBub24tcmVhbHRpbWUgaGlzdG9ncmFtcy4gIEEgbWFnaWMKLWNvb2tpZSBhbmQgdmVyc2lvbiBudW1iZXIgYWxsb3dzIEBjb2Rle2dwcm9mfSB0byBlYXNpbHkgaWRlbnRpZnkKLW5ldyBzdHlsZSBmaWxlcy4gIE9sZCBCU0Qtc3R5bGUgZmlsZXMgY2FuIHN0aWxsIGJlIHJlYWQuCi1AeHJlZntGaWxlIEZvcm1hdH0uCi0KLUBpdGVtCi1Gb3IgYSByZWN1cnNpdmUgZnVuY3Rpb24sIFVuaXggQGNvZGV7Z3Byb2Z9IGxpc3RzIHRoZSBmdW5jdGlvbiBhcyBhCi1wYXJlbnQgYW5kIGFzIGEgY2hpbGQsIHdpdGggYSBAY29kZXtjYWxsc30gZmllbGQgdGhhdCBsaXN0cyB0aGUgbnVtYmVyCi1vZiByZWN1cnNpdmUgY2FsbHMuICBAc2N7Z251fSBAY29kZXtncHJvZn0gb21pdHMgdGhlc2UgbGluZXMgYW5kIHB1dHMKLXRoZSBudW1iZXIgb2YgcmVjdXJzaXZlIGNhbGxzIGluIHRoZSBwcmltYXJ5IGxpbmUuCi0KLUBpdGVtCi1XaGVuIGEgZnVuY3Rpb24gaXMgc3VwcHJlc3NlZCBmcm9tIHRoZSBjYWxsIGdyYXBoIHdpdGggQHNhbXB7LWV9LCBAc2N7Z251fQotQGNvZGV7Z3Byb2Z9IHN0aWxsIGxpc3RzIGl0IGFzIGEgc3Vicm91dGluZSBvZiBmdW5jdGlvbnMgdGhhdCBjYWxsIGl0LgotCi1AaXRlbQotQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFjY2VwdHMgdGhlIEBzYW1wey1rfSB3aXRoIGl0cyBhcmd1bWVudAotaW4gdGhlIGZvcm0gQHNhbXB7ZnJvbS90b30sIGluc3RlYWQgb2YgQHNhbXB7ZnJvbSB0b30uCi0KLUBpdGVtCi1JbiB0aGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nLAotaWYgdGhlcmUgYXJlIG11bHRpcGxlIGJhc2ljIGJsb2NrcyBvbiB0aGUgc2FtZSBsaW5lLAotQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHByaW50cyBhbGwgb2YgdGhlaXIgY291bnRzLCBzZXBlcmF0ZWQgYnkgY29tbWFzLgotCi1AaWdub3JlIC0gaXQgZG9lcyB0aGlzIG5vdwotQGl0ZW0KLVRoZSBmdW5jdGlvbiBuYW1lcyBwcmludGVkIGluIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBvdXRwdXQgZG8gbm90IGluY2x1ZGUKLXRoZSBsZWFkaW5nIHVuZGVyc2NvcmVzIHRoYXQgYXJlIGFkZGVkIGludGVybmFsbHkgdG8gdGhlIGZyb250IG9mIGFsbAotQyBpZGVudGlmaWVycyBvbiBtYW55IG9wZXJhdGluZyBzeXN0ZW1zLgotQGVuZCBpZ25vcmUKLQotQGl0ZW0KLVRoZSBibHVyYnMsIGZpZWxkIHdpZHRocywgYW5kIG91dHB1dCBmb3JtYXRzIGFyZSBkaWZmZXJlbnQuICBAc2N7Z251fQotQGNvZGV7Z3Byb2Z9IHByaW50cyBibHVyYnMgYWZ0ZXIgdGhlIHRhYmxlcywgc28gdGhhdCB5b3UgY2FuIHNlZSB0aGUKLXRhYmxlcyB3aXRob3V0IHNraXBwaW5nIHRoZSBibHVyYnMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgRGV0YWlscwotQGNoYXB0ZXIgRGV0YWlscyBvZiBQcm9maWxpbmcKLQotQG1lbnUKLSogSW1wbGVtZW50YXRpb246OiAgICAgIEhvdyBhIHByb2dyYW0gY29sbGV0cyBwcm9maWxpbmcgaW5mb3JtYXRpb24KLSogRmlsZSBGb3JtYXQ6OiAgICAgICAgIEZvcm1hdCBvZiBAc2FtcHtnbW9uLm91dH0gZmlsZXMKLSogSW50ZXJuYWxzOjogICAgICAgICAgIEBjb2Rle2dwcm9mfSdzIGludGVybmFsIG9wZXJhdGlvbgotKiBEZWJ1Z2dpbmc6OiAgICAgICAgICAgVXNpbmcgQGNvZGV7Z3Byb2Z9J3MgQHNhbXB7LWR9IG9wdGlvbgotQGVuZCBtZW51Ci0KLUBub2RlIEltcGxlbWVudGF0aW9uLEZpbGUgRm9ybWF0LCxEZXRhaWxzCi1Ac2VjdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiBQcm9maWxpbmcKLQotUHJvZmlsaW5nIHdvcmtzIGJ5IGNoYW5naW5nIGhvdyBldmVyeSBmdW5jdGlvbiBpbiB5b3VyIHByb2dyYW0gaXMgY29tcGlsZWQKLXNvIHRoYXQgd2hlbiBpdCBpcyBjYWxsZWQsIGl0IHdpbGwgc3Rhc2ggYXdheSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlCi1pdCB3YXMgY2FsbGVkIGZyb20uICBGcm9tIHRoaXMsIHRoZSBwcm9maWxlciBjYW4gZmlndXJlIG91dCB3aGF0IGZ1bmN0aW9uCi1jYWxsZWQgaXQsIGFuZCBjYW4gY291bnQgaG93IG1hbnkgdGltZXMgaXQgd2FzIGNhbGxlZC4gIFRoaXMgY2hhbmdlIGlzIG1hZGUKLWJ5IHRoZSBjb21waWxlciB3aGVuIHlvdXIgcHJvZ3JhbSBpcyBjb21waWxlZCB3aXRoIHRoZSBAc2FtcHstcGd9IG9wdGlvbiwKLXdoaWNoIGNhdXNlcyBldmVyeSBmdW5jdGlvbiB0byBjYWxsIEBjb2Rle21jb3VudH0KLShvciBAY29kZXtfbWNvdW50fSwgb3IgQGNvZGV7X19tY291bnR9LCBkZXBlbmRpbmcgb24gdGhlIE9TIGFuZCBjb21waWxlcikKLWFzIG9uZSBvZiBpdHMgZmlyc3Qgb3BlcmF0aW9ucy4KLQotVGhlIEBjb2Rle21jb3VudH0gcm91dGluZSwgaW5jbHVkZWQgaW4gdGhlIHByb2ZpbGluZyBsaWJyYXJ5LAotaXMgcmVzcG9uc2libGUgZm9yIHJlY29yZGluZyBpbiBhbiBpbi1tZW1vcnkgY2FsbCBncmFwaCB0YWJsZQotYm90aCBpdHMgcGFyZW50IHJvdXRpbmUgKHRoZSBjaGlsZCkgYW5kIGl0cyBwYXJlbnQncyBwYXJlbnQuICBUaGlzIGlzCi10eXBpY2FsbHkgZG9uZSBieSBleGFtaW5pbmcgdGhlIHN0YWNrIGZyYW1lIHRvIGZpbmQgYm90aAotdGhlIGFkZHJlc3Mgb2YgdGhlIGNoaWxkLCBhbmQgdGhlIHJldHVybiBhZGRyZXNzIGluIHRoZSBvcmlnaW5hbCBwYXJlbnQuCi1TaW5jZSB0aGlzIGlzIGEgdmVyeSBtYWNoaW5lLWRlcGVuZGFudCBvcGVyYXRpb24sIEBjb2Rle21jb3VudH0KLWl0c2VsZiBpcyB0eXBpY2FsbHkgYSBzaG9ydCBhc3NlbWJseS1sYW5ndWFnZSBzdHViIHJvdXRpbmUKLXRoYXQgZXh0cmFjdHMgdGhlIHJlcXVpcmVkCi1pbmZvcm1hdGlvbiwgYW5kIHRoZW4gY2FsbHMgQGNvZGV7X19tY291bnRfaW50ZXJuYWx9Ci0oYSBub3JtYWwgQyBmdW5jdGlvbikgd2l0aCB0d28gYXJndW1lbnRzIC0gQGNvZGV7ZnJvbXBjfSBhbmQgQGNvZGV7c2VsZnBjfS4KLUBjb2Rle19fbWNvdW50X2ludGVybmFsfSBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcKLXRoZSBpbi1tZW1vcnkgY2FsbCBncmFwaCwgd2hpY2ggcmVjb3JkcyBAY29kZXtmcm9tcGN9LCBAY29kZXtzZWxmcGN9LAotYW5kIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBvZiB0aGVzZSBjYWxsIGFyY3Mgd2FzIHRyYW5zdmVyc2VkLgotCi1HQ0MgVmVyc2lvbiAyIHByb3ZpZGVzIGEgbWFnaWNhbCBmdW5jdGlvbiAoQGNvZGV7X19idWlsdGluX3JldHVybl9hZGRyZXNzfSksCi13aGljaCBhbGxvd3MgYSBnZW5lcmljIEBjb2Rle21jb3VudH0gZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUKLXJlcXVpcmVkIGluZm9ybWF0aW9uIGZyb20gdGhlIHN0YWNrIGZyYW1lLiAgSG93ZXZlciwgb24gc29tZQotYXJjaGl0ZWN0dXJlcywgbW9zdCBub3RhYmx5IHRoZSBTUEFSQywgdXNpbmcgdGhpcyBidWlsdGluIGNhbiBiZQotdmVyeSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlLCBhbmQgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgdmVyc2lvbgotb2YgQGNvZGV7bWNvdW50fSBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgotCi1OdW1iZXItb2YtY2FsbHMgaW5mb3JtYXRpb24gZm9yIGxpYnJhcnkgcm91dGluZXMgaXMgY29sbGVjdGVkIGJ5IHVzaW5nIGEKLXNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgQyBsaWJyYXJ5LiAgVGhlIHByb2dyYW1zIGluIGl0IGFyZSB0aGUgc2FtZSBhcyBpbgotdGhlIHVzdWFsIEMgbGlicmFyeSwgYnV0IHRoZXkgd2VyZSBjb21waWxlZCB3aXRoIEBzYW1wey1wZ30uICBJZiB5b3UKLWxpbmsgeW91ciBwcm9ncmFtIHdpdGggQHNhbXB7Z2NjIEBkb3Rze30gLXBnfSwgaXQgYXV0b21hdGljYWxseSB1c2VzIHRoZQotcHJvZmlsaW5nIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCi0KLVByb2ZpbGluZyBhbHNvIGludm9sdmVzIHdhdGNoaW5nIHlvdXIgcHJvZ3JhbSBhcyBpdCBydW5zLCBhbmQga2VlcGluZyBhCi1oaXN0b2dyYW0gb2Ygd2hlcmUgdGhlIHByb2dyYW0gY291bnRlciBoYXBwZW5zIHRvIGJlIGV2ZXJ5IG5vdyBhbmQgdGhlbi4KLVR5cGljYWxseSB0aGUgcHJvZ3JhbSBjb3VudGVyIGlzIGxvb2tlZCBhdCBhcm91bmQgMTAwIHRpbWVzIHBlciBzZWNvbmQgb2YKLXJ1biB0aW1lLCBidXQgdGhlIGV4YWN0IGZyZXF1ZW5jeSBtYXkgdmFyeSBmcm9tIHN5c3RlbSB0byBzeXN0ZW0uCi0KLVRoaXMgaXMgZG9uZSBpcyBvbmUgb2YgdHdvIHdheXMuICBNb3N0IFVOSVgtbGlrZSBvcGVyYXRpbmcgc3lzdGVtcwotcHJvdmlkZSBhIEBjb2Rle3Byb2ZpbCgpfSBzeXN0ZW0gY2FsbCwgd2hpY2ggcmVnaXN0ZXJzIGEgbWVtb3J5Ci1hcnJheSB3aXRoIHRoZSBrZXJuZWwsIGFsb25nIHdpdGggYSBzY2FsZQotZmFjdG9yIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIHByb2dyYW0ncyBhZGRyZXNzIHNwYWNlIG1hcHMKLWludG8gdGhlIGFycmF5LgotVHlwaWNhbCBzY2FsaW5nIHZhbHVlcyBjYXVzZSBldmVyeSAyIHRvIDggYnl0ZXMgb2YgYWRkcmVzcyBzcGFjZQotdG8gbWFwIGludG8gYSBzaW5nbGUgYXJyYXkgc2xvdC4KLU9uIGV2ZXJ5IHRpY2sgb2YgdGhlIHN5c3RlbSBjbG9jawotKGFzc3VtaW5nIHRoZSBwcm9maWxlZCBwcm9ncmFtIGlzIHJ1bm5pbmcpLCB0aGUgdmFsdWUgb2YgdGhlCi1wcm9ncmFtIGNvdW50ZXIgaXMgZXhhbWluZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHNsb3QgaW4KLXRoZSBtZW1vcnkgYXJyYXkgaXMgaW5jcmVtZW50ZWQuICBTaW5jZSB0aGlzIGlzIGRvbmUgaW4gdGhlIGtlcm5lbCwKLXdoaWNoIGhhZCB0byBpbnRlcnJ1cHQgdGhlIHByb2Nlc3MgYW55d2F5IHRvIGhhbmRsZSB0aGUgY2xvY2sKLWludGVycnVwdCwgdmVyeSBsaXR0bGUgYWRkaXRpb25hbCBzeXN0ZW0gb3ZlcmhlYWQgaXMgcmVxdWlyZWQuCi0KLUhvd2V2ZXIsIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIG1vc3Qgbm90YWJseSBMaW51eCAyLjAgKGFuZCBlYXJsaWVyKSwKLWRvIG5vdCBwcm92aWRlIGEgQGNvZGV7cHJvZmlsKCl9IHN5c3RlbSBjYWxsLiAgT24gc3VjaCBhIHN5c3RlbSwKLWFycmFuZ2VtZW50cyBhcmUgbWFkZSBmb3IgdGhlIGtlcm5lbCB0byBwZXJpb2RpY2FsbHkgZGVsaXZlcgotYSBzaWduYWwgdG8gdGhlIHByb2Nlc3MgKHR5cGljYWxseSB2aWEgQGNvZGV7c2V0aXRpbWVyKCl9KSwKLXdoaWNoIHRoZW4gcGVyZm9ybXMgdGhlIHNhbWUgb3BlcmF0aW9uIG9mIGV4YW1pbmluZyB0aGUKLXByb2dyYW0gY291bnRlciBhbmQgaW5jcmVtZW50aW5nIGEgc2xvdCBpbiB0aGUgbWVtb3J5IGFycmF5LgotU2luY2UgdGhpcyBtZXRob2QgcmVxdWlyZXMgYSBzaWduYWwgdG8gYmUgZGVsaXZlcmVkIHRvCi11c2VyIHNwYWNlIGV2ZXJ5IHRpbWUgYSBzYW1wbGUgaXMgdGFrZW4sIGl0IHVzZXMgY29uc2lkZXJhYmx5Ci1tb3JlIG92ZXJoZWFkIHRoYW4ga2VybmVsLWJhc2VkIHByb2ZpbGluZy4gIEFsc28sIGR1ZSB0byB0aGUKLWFkZGVkIGRlbGF5IHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhlIHNpZ25hbCwgdGhpcyBtZXRob2QgaXMKLWxlc3MgYWNjdXJhdGUgYXMgd2VsbC4KLQotQSBzcGVjaWFsIHN0YXJ0dXAgcm91dGluZSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGUgaGlzdG9ncmFtIGFuZCAKLWVpdGhlciBjYWxscyBAY29kZXtwcm9maWwoKX0gb3Igc2V0cyB1cAotYSBjbG9jayBzaWduYWwgaGFuZGxlci4KLVRoaXMgcm91dGluZSAoQGNvZGV7bW9uc3RhcnR1cH0pIGNhbiBiZSBpbnZva2VkIGluIHNldmVyYWwgd2F5cy4KLU9uIExpbnV4IHN5c3RlbXMsIGEgc3BlY2lhbCBwcm9maWxpbmcgc3RhcnR1cCBmaWxlIEBjb2Rle2djcnQwLm99LAotd2hpY2ggaW52b2tlcyBAY29kZXttb25zdGFydHVwfSBiZWZvcmUgQGNvZGV7bWFpbn0sCi1pcyB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgQGNvZGV7Y3J0MC5vfS4KLVVzZSBvZiB0aGlzIHNwZWNpYWwgc3RhcnR1cCBmaWxlIGlzIG9uZSBvZiB0aGUgZWZmZWN0cwotb2YgdXNpbmcgQHNhbXB7Z2NjIEBkb3Rze30gLXBnfSB0byBsaW5rLgotT24gU1BBUkMgc3lzdGVtcywgbm8gc3BlY2lhbCBzdGFydHVwIGZpbGVzIGFyZSB1c2VkLgotUmF0aGVyLCB0aGUgQGNvZGV7bWNvdW50fSByb3V0aW5lLCB3aGVuIGl0IGlzIGludm9rZWQgZm9yCi10aGUgZmlyc3QgdGltZSAodHlwaWNhbGx5IHdoZW4gQGNvZGV7bWFpbn0gaXMgY2FsbGVkKSwKLWNhbGxzIEBjb2Rle21vbnN0YXJ0dXB9LgotCi1JZiB0aGUgY29tcGlsZXIncyBAc2FtcHstYX0gb3B0aW9uIHdhcyB1c2VkLCBiYXNpYy1ibG9jayBjb3VudGluZwotaXMgYWxzbyBlbmFibGVkLiAgRWFjaCBvYmplY3QgZmlsZSBpcyB0aGVuIGNvbXBpbGVkIHdpdGggYSBzdGF0aWMgYXJyYXkKLW9mIGNvdW50cywgaW5pdGlhbGx5IHplcm8uCi1JbiB0aGUgZXhlY3V0YWJsZSBjb2RlLCBldmVyeSB0aW1lIGEgbmV3IGJhc2ljLWJsb2NrIGJlZ2lucwotKGkuZS4gd2hlbiBhbiBAY29kZXtpZn0gc3RhdGVtZW50IGFwcGVhcnMpLCBhbiBleHRyYSBpbnN0cnVjdGlvbgotaXMgaW5zZXJ0ZWQgdG8gaW5jcmVtZW50IHRoZSBjb3JyZXNwb25kaW5nIGNvdW50IGluIHRoZSBhcnJheS4KLUF0IGNvbXBpbGUgdGltZSwgYSBwYWlyZWQgYXJyYXkgd2FzIGNvbnN0cnVjdGVkIHRoYXQgcmVjb3JkZWQKLXRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGVhY2ggYmFzaWMtYmxvY2suICBUYWtlbiB0b2dldGhlciwKLXRoZSB0d28gYXJyYXlzIHJlY29yZCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBldmVyeSBiYXNpYy1ibG9jaywKLWFsb25nIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgZXhlY3V0ZWQuCi0KLVRoZSBwcm9maWxpbmcgbGlicmFyeSBhbHNvIGluY2x1ZGVzIGEgZnVuY3Rpb24gKEBjb2Rle21jbGVhbnVwfSkgd2hpY2ggaXMKLXR5cGljYWxseSByZWdpc3RlcmVkIHVzaW5nIEBjb2Rle2F0ZXhpdCgpfSB0byBiZSBjYWxsZWQgYXMgdGhlCi1wcm9ncmFtIGV4aXRzLCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgdGhlIGZpbGUgQGZpbGV7Z21vbi5vdXR9LgotUHJvZmlsaW5nIGlzIHR1cm5lZCBvZmYsIHZhcmlvdXMgaGVhZGVycyBhcmUgb3V0cHV0LCBhbmQgdGhlIGhpc3RvZ3JhbQotaXMgd3JpdHRlbiwgZm9sbG93ZWQgYnkgdGhlIGNhbGwtZ3JhcGggYXJjcyBhbmQgdGhlIGJhc2ljLWJsb2NrIGNvdW50cy4KLQotVGhlIG91dHB1dCBmcm9tIEBjb2Rle2dwcm9mfSBnaXZlcyBubyBpbmRpY2F0aW9uIG9mIHBhcnRzIG9mIHlvdXIgcHJvZ3JhbSB0aGF0Ci1hcmUgbGltaXRlZCBieSBJL08gb3Igc3dhcHBpbmcgYmFuZHdpZHRoLiAgVGhpcyBpcyBiZWNhdXNlIHNhbXBsZXMgb2YgdGhlCi1wcm9ncmFtIGNvdW50ZXIgYXJlIHRha2VuIGF0IGZpeGVkIGludGVydmFscyBvZiB0aGUgcHJvZ3JhbSdzIHJ1biB0aW1lLgotVGhlcmVmb3JlLCB0aGUKLXRpbWUgbWVhc3VyZW1lbnRzIGluIEBjb2Rle2dwcm9mfSBvdXRwdXQgc2F5IG5vdGhpbmcgYWJvdXQgdGltZSB0aGF0IHlvdXIKLXByb2dyYW0gd2FzIG5vdCBydW5uaW5nLiAgRm9yIGV4YW1wbGUsIGEgcGFydCBvZiB0aGUgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMKLXNvIG11Y2ggZGF0YSB0aGF0IGl0IGNhbm5vdCBhbGwgZml0IGluIHBoeXNpY2FsIG1lbW9yeSBhdCBvbmNlIG1heSBydW4gdmVyeQotc2xvd2x5IGR1ZSB0byB0aHJhc2hpbmcsIGJ1dCBAY29kZXtncHJvZn0gd2lsbCBzYXkgaXQgdXNlcyBsaXR0bGUgdGltZS4gIE9uCi10aGUgb3RoZXIgaGFuZCwgc2FtcGxpbmcgYnkgcnVuIHRpbWUgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCB0aGUgYW1vdW50IG9mCi1sb2FkIGR1ZSB0byBvdGhlciB1c2VycyB3b24ndCBkaXJlY3RseSBhZmZlY3QgdGhlIG91dHB1dCB5b3UgZ2V0LgotCi1Abm9kZSBGaWxlIEZvcm1hdCxJbnRlcm5hbHMsSW1wbGVtZW50YXRpb24sRGV0YWlscwotQHNlY3Rpb24gUHJvZmlsaW5nIERhdGEgRmlsZSBGb3JtYXQKLQotVGhlIG9sZCBCU0QtZGVyaXZlZCBmaWxlIGZvcm1hdCB1c2VkIGZvciBwcm9maWxlIGRhdGEgZG9lcyBub3QgY29udGFpbiBhCi1tYWdpYyBjb29raWUgdGhhdCBhbGxvd3MgdG8gY2hlY2sgd2hldGhlciBhIGRhdGEgZmlsZSByZWFsbHkgaXMgYQotZ3Byb2YgZmlsZS4gIEZ1cnRoZXJtb3JlLCBpdCBkb2VzIG5vdCBwcm92aWRlIGEgdmVyc2lvbiBudW1iZXIsIHRodXMKLXJlbmRlcmluZyBjaGFuZ2VzIHRvIHRoZSBmaWxlIGZvcm1hdCBhbG1vc3QgaW1wb3NzaWJsZS4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfQotdXNlcyBhIG5ldyBmaWxlIGZvcm1hdCB0aGF0IHByb3ZpZGVzIHRoZXNlIGZlYXR1cmVzLiAgRm9yIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5LCBAc2N7Z251fSBAY29kZXtncHJvZn0gY29udGludWVzIHRvIHN1cHBvcnQgdGhlIG9sZCBCU0QtZGVyaXZlZAotZm9ybWF0LCBidXQgbm90IGFsbCBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkIHdpdGggaXQuICBGb3IgZXhhbXBsZSwKLWJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgY2Fubm90IGJlIGFjY29tbW9kYXRlZCBieSB0aGUgb2xkIGZpbGUKLWZvcm1hdC4KLQotVGhlIG5ldyBmaWxlIGZvcm1hdCBpcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlIEBmaWxle2dtb25fb3V0Lmh9LiAgSXQKLWNvbnNpc3RzIG9mIGEgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIG1hZ2ljIGNvb2tpZSBhbmQgYSB2ZXJzaW9uIG51bWJlciwKLWFzIHdlbGwgYXMgc29tZSBzcGFyZSBieXRlcyBhdmFpbGFibGUgZm9yIGZ1dHVyZSBleHRlbnNpb25zLiAgQWxsIGRhdGEKLWluIGEgcHJvZmlsZSBkYXRhIGZpbGUgaXMgaW4gdGhlIG5hdGl2ZSBmb3JtYXQgb2YgdGhlIGhvc3Qgb24gd2hpY2gKLXRoZSBwcm9maWxlIHdhcyBjb2xsZWN0ZWQuICBAc2N7Z251fSBAY29kZXtncHJvZn0gYWRhcHRzIGF1dG9tYXRpY2FsbHkgdG8gdGhlCi1ieXRlLW9yZGVyIGluIHVzZS4KLQotSW4gdGhlIG5ldyBmaWxlIGZvcm1hdCwgdGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mCi1yZWNvcmRzLiAgQ3VycmVudGx5LCB0aGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IHJlY29yZCB0eXBlczogaGlzdG9ncmFtCi1yZWNvcmRzLCBjYWxsLWdyYXBoIGFyYyByZWNvcmRzLCBhbmQgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50Ci1yZWNvcmRzLiAgRWFjaCBmaWxlIGNhbiBjb250YWluIGFueSBudW1iZXIgb2YgZWFjaCByZWNvcmQgdHlwZS4gIFdoZW4KLXJlYWRpbmcgYSBmaWxlLCBAc2N7Z251fSBAY29kZXtncHJvZn0gd2lsbCBlbnN1cmUgcmVjb3JkcyBvZiB0aGUgc2FtZSB0eXBlIGFyZQotY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgYW5kIGNvbXB1dGUgdGhlIHVuaW9uIG9mIGFsbCByZWNvcmRzLiAgRm9yCi1leGFtcGxlLCBmb3IgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cywgdGhlIHVuaW9uIGlzIHNpbXBseSB0aGUgc3VtCi1vZiBhbGwgZXhlY3V0aW9uIGNvdW50cyBmb3IgZWFjaCBiYXNpYy1ibG9jay4KLQotQHN1YnNlY3Rpb24gSGlzdG9ncmFtIFJlY29yZHMKLQotSGlzdG9ncmFtIHJlY29yZHMgY29uc2lzdCBvZiBhIGhlYWRlciB0aGF0IGlzIGZvbGxvd2VkIGJ5IGFuIGFycmF5IG9mCi1iaW5zLiAgVGhlIGhlYWRlciBjb250YWlucyB0aGUgdGV4dC1zZWdtZW50IHJhbmdlIHRoYXQgdGhlIGhpc3RvZ3JhbQotc3BhbnMsIHRoZSBzaXplIG9mIHRoZSBoaXN0b2dyYW0gaW4gYnl0ZXMgKHVubGlrZSBpbiB0aGUgb2xkIEJTRAotZm9ybWF0LCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciksIHRoZSByYXRlIG9mIHRoZQotcHJvZmlsaW5nIGNsb2NrLCBhbmQgdGhlIHBoeXNpY2FsIGRpbWVuc2lvbiB0aGF0IHRoZSBiaW4gY291bnRzCi1yZXByZXNlbnQgYWZ0ZXIgYmVpbmcgc2NhbGVkIGJ5IHRoZSBwcm9maWxpbmcgY2xvY2sgcmF0ZS4gIFRoZQotcGh5c2ljYWwgZGltZW5zaW9uIGlzIHNwZWNpZmllZCBpbiB0d28gcGFydHM6IGEgbG9uZyBuYW1lIG9mIHVwIHRvIDE1Ci1jaGFyYWN0ZXJzIGFuZCBhIHNpbmdsZSBjaGFyYWN0ZXIgYWJicmV2aWF0aW9uLiAgRm9yIGV4YW1wbGUsIGEKLWhpc3RvZ3JhbSByZXByZXNlbnRpbmcgcmVhbC10aW1lIHdvdWxkIHNwZWNpZnkgdGhlIGxvbmcgbmFtZSBhcwotInNlY29uZHMiIGFuZCB0aGUgYWJicmV2aWF0aW9uIGFzICJzIi4gIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgZm9yCi1hcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCBwZXJmb3JtYW5jZSBtb25pdG9yIGhhcmR3YXJlICh3aGljaCwKLWZvcnR1bmF0ZWx5LCBpcyBiZWNvbWluZyBpbmNyZWFzaW5nbHkgY29tbW9uKS4gIEZvciBleGFtcGxlLCB1bmRlciBERUMKLU9TRi8xLCB0aGUgInVwcm9maWxlIiBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UgYSBoaXN0b2dyYW0gb2YsCi1zYXksIGluc3RydWN0aW9uIGNhY2hlIG1pc3Nlcy4gIEluIHRoaXMgY2FzZSwgdGhlIGRpbWVuc2lvbiBpbiB0aGUKLWhpc3RvZ3JhbSBoZWFkZXIgY291bGQgYmUgc2V0IHRvICJpLWNhY2hlIG1pc3NlcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24KLWNvdWxkIGJlIHNldCB0byAiMSIgKGJlY2F1c2UgaXQgaXMgc2ltcGx5IGEgY291bnQsIG5vdCBhIHBoeXNpY2FsCi1kaW1lbnNpb24pLiAgQWxzbywgdGhlIHByb2ZpbGluZyByYXRlIHdvdWxkIGhhdmUgdG8gYmUgc2V0IHRvIDEgaW4KLXRoaXMgY2FzZS4KLQotSGlzdG9ncmFtIGJpbnMgYXJlIDE2LWJpdCBudW1iZXJzIGFuZCBlYWNoIGJpbiByZXByZXNlbnQgYW4gZXF1YWwKLWFtb3VudCBvZiB0ZXh0LXNwYWNlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXh0LXNlZ21lbnQgaXMgb25lCi10aG91c2FuZCBieXRlcyBsb25nIGFuZCBpZiB0aGVyZSBhcmUgdGVuIGJpbnMgaW4gdGhlIGhpc3RvZ3JhbSwgZWFjaAotYmluIHJlcHJlc2VudHMgb25lIGh1bmRyZWQgYnl0ZXMuCi0KLQotQHN1YnNlY3Rpb24gQ2FsbC1HcmFwaCBSZWNvcmRzCi0KLUNhbGwtZ3JhcGggcmVjb3JkcyBoYXZlIGEgZm9ybWF0IHRoYXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdXNlZCBpbgotdGhlIEJTRC1kZXJpdmVkIGZpbGUgZm9ybWF0LiAgSXQgY29uc2lzdHMgb2YgYW4gYXJjIGluIHRoZSBjYWxsIGdyYXBoCi1hbmQgYSBjb3VudCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFyYyB3YXMgdHJhdmVyc2VkCi1kdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24uICBBcmNzIGFyZSBzcGVjaWZpZWQgYnkgYSBwYWlyIG9mIGFkZHJlc3NlczoKLXRoZSBmaXJzdCBtdXN0IGJlIHdpdGhpbiBjYWxsZXIncyBmdW5jdGlvbiBhbmQgdGhlIHNlY29uZCBtdXN0IGJlCi13aXRoaW4gdGhlIGNhbGxlZSdzIGZ1bmN0aW9uLiAgV2hlbiBwZXJmb3JtaW5nIHByb2ZpbGluZyBhdCB0aGUKLWZ1bmN0aW9uIGxldmVsLCB0aGVzZSBhZGRyZXNzZXMgY2FuIHBvaW50IGFueXdoZXJlIHdpdGhpbiB0aGUKLXJlc3BlY3RpdmUgZnVuY3Rpb24uICBIb3dldmVyLCB3aGVuIHByb2ZpbGluZyBhdCB0aGUgbGluZS1sZXZlbCwgaXQgaXMKLWJldHRlciBpZiB0aGUgYWRkcmVzc2VzIGFyZSBhcyBjbG9zZSB0byB0aGUgY2FsbC1zaXRlL2VudHJ5LXBvaW50IGFzCi1wb3NzaWJsZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbGluZS1sZXZlbCBjYWxsLWdyYXBoIGlzIGFibGUgdG8KLWlkZW50aWZ5IGV4YWN0bHkgd2hpY2ggbGluZSBvZiBzb3VyY2UgY29kZSBwZXJmb3JtZWQgY2FsbHMgdG8gYQotZnVuY3Rpb24uCi0KLUBzdWJzZWN0aW9uIEJhc2ljLUJsb2NrIEV4ZWN1dGlvbiBDb3VudCBSZWNvcmRzCi0KLUJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudCByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgZm9sbG93ZWQgYnkgYQotc2VxdWVuY2Ugb2YgYWRkcmVzcy9jb3VudCBwYWlycy4gIFRoZSBoZWFkZXIgc2ltcGx5IHNwZWNpZmllcyB0aGUKLWxlbmd0aCBvZiB0aGUgc2VxdWVuY2UuICBJbiBhbiBhZGRyZXNzL2NvdW50IHBhaXIsIHRoZSBhZGRyZXNzCi1pZGVudGlmaWVzIGEgYmFzaWMtYmxvY2sgYW5kIHRoZSBjb3VudCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lcwotdGhhdCBiYXNpYy1ibG9jayB3YXMgZXhlY3V0ZWQuICBBbnkgYWRkcmVzcyB3aXRoaW4gdGhlIGJhc2ljLWFkZHJlc3MgY2FuCi1iZSB1c2VkLgotCi1Abm9kZSBJbnRlcm5hbHMsRGVidWdnaW5nLEZpbGUgRm9ybWF0LERldGFpbHMKLUBzZWN0aW9uIEBjb2Rle2dwcm9mfSdzIEludGVybmFsIE9wZXJhdGlvbgotCi1MaWtlIG1vc3QgcHJvZ3JhbXMsIEBjb2Rle2dwcm9mfSBiZWdpbnMgYnkgcHJvY2Vzc2luZyBpdHMgb3B0aW9ucy4KLUR1cmluZyB0aGlzIHN0YWdlLCBpdCBtYXkgYnVpbGRpbmcgaXRzIHN5bXNwZWMgbGlzdAotKEBjb2Rle3N5bV9pZHMuYzpzeW1faWRfYWRkfSksIGlmCi1vcHRpb25zIGFyZSBzcGVjaWZpZWQgd2hpY2ggdXNlIHN5bXNwZWNzLgotQGNvZGV7Z3Byb2Z9IG1haW50YWlucyBhIHNpbmdsZSBsaW5rZWQgbGlzdCBvZiBzeW1zcGVjcywKLXdoaWNoIHdpbGwgZXZlbnR1YWxseSBnZXQgdHVybmVkIGludG8gMTIgc3ltYm9sIHRhYmxlcywKLW9yZ2FuaXplZCBpbnRvIHNpeCBpbmNsdWRlL2V4Y2x1ZGUgcGFpcnMgLSBvbmUKLXBhaXIgZWFjaCBmb3IgdGhlIGZsYXQgcHJvZmlsZSAoSU5DTF9GTEFUL0VYQ0xfRkxBVCksCi10aGUgY2FsbCBncmFwaCBhcmNzIChJTkNMX0FSQ1MvRVhDTF9BUkNTKSwKLXByaW50aW5nIGluIHRoZSBjYWxsIGdyYXBoIChJTkNMX0dSQVBIL0VYQ0xfR1JBUEgpLAotdGltaW5nIHByb3BhZ2F0aW9uIGluIHRoZSBjYWxsIGdyYXBoIChJTkNMX1RJTUUvRVhDTF9USU1FKSwKLXRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcgKElOQ0xfQU5OTy9FWENMX0FOTk8pLAotYW5kIHRoZSBleGVjdXRpb24gY291bnQgbGlzdGluZyAoSU5DTF9FWEVDL0VYQ0xfRVhFQykuCi0KLUFmdGVyIG9wdGlvbiBwcm9jZXNzaW5nLCBAY29kZXtncHJvZn0gZmluaXNoZXMKLWJ1aWxkaW5nIHRoZSBzeW1zcGVjIGxpc3QgYnkgYWRkaW5nIGFsbCB0aGUgc3ltc3BlY3MgaW4KLUBjb2Rle2RlZmF1bHRfZXhjbHVkZWRfbGlzdH0gdG8gdGhlIGV4Y2x1ZGUgbGlzdHMKLUVYQ0xfVElNRSBhbmQgRVhDTF9HUkFQSCwgYW5kIGlmIGxpbmUtYnktbGluZSBwcm9maWxpbmcgaXMgc3BlY2lmaWVkLAotRVhDTF9GTEFUIGFzIHdlbGwuCi1UaGVzZSBkZWZhdWx0IGV4Y2x1ZGVzIGFyZSBub3QgYWRkZWQgdG8gRVhDTF9BTk5PLCBFWENMX0FSQ1MsIGFuZCBFWENMX0VYRUMuCi0KLU5leHQsIHRoZSBCRkQgbGlicmFyeSBpcyBjYWxsZWQgdG8gb3BlbiB0aGUgb2JqZWN0IGZpbGUsCi12ZXJpZnkgdGhhdCBpdCBpcyBhbiBvYmplY3QgZmlsZSwKLWFuZCByZWFkIGl0cyBzeW1ib2wgdGFibGUgKEBjb2Rle2NvcmUuYzpjb3JlX2luaXR9KSwKLXVzaW5nIEBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifSBhZnRlciBtYWxsb2NpbmcKLWFuIGFwcHJvcGlhdGUgc2l6ZWQgYXJyYXkgb2YgYXN5bWJvbHMuICBBdCB0aGlzIHBvaW50LAotZnVuY3Rpb24gbWFwcGluZ3MgYXJlIHJlYWQgKGlmIHRoZSBAc2FtcHstLWZpbGUtb3JkZXJpbmd9IG9wdGlvbgotaGFzIGJlZW4gc3BlY2lmaWVkKSwgYW5kIHRoZSBjb3JlIHRleHQgc3BhY2UgaXMgcmVhZCBpbnRvCi1tZW1vcnkgKGlmIHRoZSBAc2FtcHstY30gb3B0aW9uIHdhcyBnaXZlbikuCi0KLUBjb2Rle2dwcm9mfSdzIG93biBzeW1ib2wgdGFibGUsIGFuIGFycmF5IG9mIFN5bSBzdHJ1Y3R1cmVzLAotaXMgbm93IGJ1aWx0LgotVGhpcyBpcyBkb25lIGluIG9uZSBvZiB0d28gd2F5cywgYnkgb25lIG9mIHR3byByb3V0aW5lcywgZGVwZW5kaW5nCi1vbiB3aGV0aGVyIGxpbmUtYnktbGluZSBwcm9maWxpbmcgKEBzYW1wey1sfSBvcHRpb24pIGhhcyBiZWVuCi1lbmFibGVkLgotRm9yIG5vcm1hbCBwcm9maWxpbmcsIHRoZSBCRkQgY2Fub25pY2FsIHN5bWJvbCB0YWJsZSBpcyBzY2FubmVkLgotRm9yIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIGV2ZXJ5Ci10ZXh0IHNwYWNlIGFkZHJlc3MgaXMgZXhhbWluZWQsIGFuZCBhIG5ldyBzeW1ib2wgdGFibGUgZW50cnkKLWdldHMgY3JlYXRlZCBldmVyeSB0aW1lIHRoZSBsaW5lIG51bWJlciBjaGFuZ2VzLgotSW4gZWl0aGVyIGNhc2UsIHR3byBwYXNzZXMgYXJlIG1hZGUgdGhyb3VnaCB0aGUgc3ltYm9sCi10YWJsZSAtIG9uZSB0byBjb3VudCB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIHJlcXVpcmVkLAotYW5kIHRoZSBvdGhlciB0byBhY3R1YWxseSByZWFkIHRoZSBzeW1ib2xzLiAgSW4gYmV0d2VlbiB0aGUKLXR3byBwYXNzZXMsIGEgc2luZ2xlIGFycmF5IG9mIHR5cGUgQGNvZGV7U3ltfSBpcyBjcmVhdGVkIG9mCi10aGUgYXBwcm9waWF0ZSBsZW5ndGguCi1GaW5hbGx5LCBAY29kZXtzeW10YWIuYzpzeW10YWJfZmluYWxpemV9Ci1pcyBjYWxsZWQgdG8gc29ydCB0aGUgc3ltYm9sIHRhYmxlIGFuZCByZW1vdmUgZHVwbGljYXRlIGVudHJpZXMKLShlbnRyaWVzIHdpdGggdGhlIHNhbWUgbWVtb3J5IGFkZHJlc3MpLgotCi1UaGUgc3ltYm9sIHRhYmxlIG11c3QgYmUgYSBjb250aWd1b3VzIGFycmF5IGZvciB0d28gcmVhc29ucy4KLUZpcnN0LCB0aGUgQGNvZGV7cXNvcnR9IGxpYnJhcnkgZnVuY3Rpb24gKHdoaWNoIHNvcnRzIGFuIGFycmF5KQotd2lsbCBiZSB1c2VkIHRvIHNvcnQgdGhlIHN5bWJvbCB0YWJsZS4KLUFsc28sIHRoZSBzeW1ib2wgbG9va3VwIHJvdXRpbmUgKEBjb2Rle3N5bXRhYi5jOnN5bV9sb29rdXB9KSwKLXdoaWNoIGZpbmRzIHN5bWJvbHMKLWJhc2VkIG9uIG1lbW9yeSBhZGRyZXNzLCB1c2VzIGEgYmluYXJ5IHNlYXJjaCBhbGdvcml0aG0KLXdoaWNoIHJlcXVpcmVzIHRoZSBzeW1ib2wgdGFibGUgdG8gYmUgYSBzb3J0ZWQgYXJyYXkuCi1GdW5jdGlvbiBzeW1ib2xzIGFyZSBpbmRpY2F0ZWQgd2l0aCBhbiBAY29kZXtpc19mdW5jfSBmbGFnLgotTGluZSBudW1iZXIgc3ltYm9scyBoYXZlIG5vIHNwZWNpYWwgZmxhZ3Mgc2V0LgotQWRkaXRpb25hbGx5LCBhIHN5bWJvbCBjYW4gaGF2ZSBhbiBAY29kZXtpc19zdGF0aWN9IGZsYWcKLXRvIGluZGljYXRlIHRoYXQgaXQgaXMgYSBsb2NhbCBzeW1ib2wuCi0KLVdpdGggdGhlIHN5bWJvbCB0YWJsZSByZWFkLCB0aGUgc3ltc3BlY3MgY2FuIG5vdyBiZSB0cmFuc2xhdGVkCi1pbnRvIFN5bXMgKEBjb2Rle3N5bV9pZHMuYzpzeW1faWRfcGFyc2V9KS4gIFJlbWVtYmVyIHRoYXQgYSBzaW5nbGUKLXN5bXNwZWMgY2FuIG1hdGNoIG11bHRpcGxlIHN5bWJvbHMuCi1BbiBhcnJheSBvZiBzeW1ib2wgdGFibGVzCi0oQGNvZGV7c3ltc30pIGlzIGNyZWF0ZWQsIGVhY2ggZW50cnkgb2Ygd2hpY2ggaXMgYSBzeW1ib2wgdGFibGUKLW9mIFN5bXMgdG8gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQgZnJvbSBhIHBhcnRpY3VsYXIgbGlzdGluZy4KLVRoZSBtYXN0ZXIgc3ltYm9sIHRhYmxlIGFuZCB0aGUgc3ltc3BlY3MgYXJlIGV4YW1pbmVkIGJ5IG5lc3RlZAotbG9vcHMsIGFuZCBldmVyeSBzeW1ib2wgdGhhdCBtYXRjaGVzIGEgc3ltc3BlYyBpcyBpbnNlcnRlZAotaW50byB0aGUgYXBwcm9wcmlhdGUgc3ltcyB0YWJsZS4gIFRoaXMgaXMgZG9uZSB0d2ljZSwgb25jZSB0bwotY291bnQgdGhlIHNpemUgb2YgZWFjaCByZXF1aXJlZCBzeW1ib2wgdGFibGUsIGFuZCBhZ2FpbiB0byBidWlsZAotdGhlIHRhYmxlcywgd2hpY2ggaGF2ZSBiZWVuIG1hbGxvY2VkIGJldHdlZW4gcGFzc2VzLgotRnJvbSBub3cgb24sIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIG9uIGFuIGluY2x1ZGUKLW9yIGV4Y2x1ZGUgc3ltc3BlYyBsaXN0LCBAY29kZXtncHJvZn0gc2ltcGx5IHVzZXMgaXRzCi1zdGFuZGFyZCBzeW1ib2wgbG9va3VwIHJvdXRpbmUgb24gdGhlIGFwcHJvcHJpYXRlIHRhYmxlCi1pbiB0aGUgQGNvZGV7c3ltc30gYXJyYXkuCi0KLU5vdyB0aGUgcHJvZmlsZSBkYXRhIGZpbGUocykgdGhlbXNlbHZlcyBhcmUgcmVhZAotKEBjb2Rle2dtb25faW8uYzpnbW9uX291dF9yZWFkfSksCi1maXJzdCBieSBjaGVja2luZyBmb3IgYSBuZXctc3R5bGUgQHNhbXB7Z21vbi5vdXR9IGhlYWRlciwKLXRoZW4gYXNzdW1pbmcgdGhpcyBpcyBhbiBvbGQtc3R5bGUgQlNEIEBzYW1we2dtb24ub3V0fQotaWYgdGhlIG1hZ2ljIG51bWJlciB0ZXN0IGZhaWxlZC4KLQotTmV3LXN0eWxlIGhpc3RvZ3JhbSByZWNvcmRzIGFyZSByZWFkIGJ5IEBjb2Rle2hpc3QuYzpoaXN0X3JlYWRfcmVjfS4KLUZvciB0aGUgZmlyc3QgaGlzdG9ncmFtIHJlY29yZCwgYWxsb2NhdGUgYSBtZW1vcnkgYXJyYXkgdG8gaG9sZAotYWxsIHRoZSBiaW5zLCBhbmQgcmVhZCB0aGVtIGluLgotV2hlbiBtdWx0aXBsZSBwcm9maWxlIGRhdGEgZmlsZXMgKG9yIGZpbGVzIHdpdGggbXVsdGlwbGUgaGlzdG9ncmFtCi1yZWNvcmRzKSBhcmUgcmVhZCwgdGhlIHN0YXJ0aW5nIGFkZHJlc3MsIGVuZGluZyBhZGRyZXNzLCBudW1iZXIKLW9mIGJpbnMgYW5kIHNhbXBsaW5nIHJhdGUgbXVzdCBtYXRjaCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGhpc3RvZ3JhbXMsCi1vciBhIGZhdGFsIGVycm9yIHdpbGwgcmVzdWx0LgotSWYgZXZlcnl0aGluZyBtYXRjaGVzLCBqdXN0IHN1bSB0aGUgYWRkaXRpb25hbCBoaXN0b2dyYW1zIGludG8KLXRoZSBleGlzdGluZyBpbi1tZW1vcnkgYXJyYXkuCi0KLUFzIGVhY2ggY2FsbCBncmFwaCByZWNvcmQgaXMgcmVhZCAoQGNvZGV7Y2FsbF9ncmFwaC5jOmNnX3JlYWRfcmVjfSksCi10aGUgcGFyZW50IGFuZCBjaGlsZCBhZGRyZXNzZXMKLWFyZSBtYXRjaGVkIHRvIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBhbmQgYSBjYWxsIGdyYXBoIGFyYyBpcwotY3JlYXRlZCBieSBAY29kZXtjZ19hcmNzLmM6YXJjX2FkZH0sIHVubGVzcyB0aGUgYXJjIGZhaWxzIGEgc3ltc3BlYwotY2hlY2sgYWdhaW5zdCBJTkNMX0FSQ1MvRVhDTF9BUkNTLiAgQXMgZWFjaCBhcmMgaXMgYWRkZWQsCi1hIGxpbmtlZCBsaXN0IGlzIG1haW50YWluZWQgb2YgdGhlIHBhcmVudCdzIGNoaWxkIGFyY3MsIGFuZCBvZiB0aGUgY2hpbGQncwotcGFyZW50IGFyY3MuCi1Cb3RoIHRoZSBjaGlsZCdzIGNhbGwgY291bnQgYW5kIHRoZSBhcmMncyBjYWxsIGNvdW50IGFyZQotaW5jcmVtZW50ZWQgYnkgdGhlIHJlY29yZCdzIGNhbGwgY291bnQuCi0KLUJhc2ljLWJsb2NrIHJlY29yZHMgYXJlIHJlYWQgKEBjb2Rle2Jhc2ljX2Jsb2Nrcy5jOmJiX3JlYWRfcmVjfSksCi1idXQgb25seSBpZiBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIGhhcyBiZWVuIHNlbGVjdGVkLgotRWFjaCBiYXNpYy1ibG9jayBhZGRyZXNzIGlzIG1hdGNoZWQgdG8gYSBjb3JyZXNwb25kaW5nIGxpbmUKLXN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBhbmQgYW4gZW50cnkgbWFkZSBpbiB0aGUgc3ltYm9sJ3MKLWJiX2FkZHIgYW5kIGJiX2NhbGxzIGFycmF5cy4gIEFnYWluLCBpZiBtdWx0aXBsZSBiYXNpYy1ibG9jawotcmVjb3JkcyBhcmUgcHJlc2VudCBmb3IgdGhlIHNhbWUgYWRkcmVzcywgdGhlIGNhbGwgY291bnRzCi1hcmUgY3VtdWxhdGl2ZS4KLQotQSBnbW9uLnN1bSBmaWxlIGlzIGR1bXBlZCwgaWYgcmVxdWVzdGVkIChAY29kZXtnbW9uX2lvLmM6Z21vbl9vdXRfd3JpdGV9KS4KLQotSWYgaGlzdG9ncmFtcyB3ZXJlIHByZXNlbnQgaW4gdGhlIGRhdGEgZmlsZXMsIGFzc2lnbiB0aGVtIHRvIHN5bWJvbHMKLShAY29kZXtoaXN0LmM6aGlzdF9hc3NpZ25fc2FtcGxlc30pIGJ5IGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgc2FtcGxlCi1iaW5zIGFuZCBhc3NpZ25pbmcgdGhlbSB0byBzeW1ib2xzLiAgU2luY2UgdGhlIHN5bWJvbCB0YWJsZQotaXMgc29ydGVkIGluIG9yZGVyIG9mIGFzY2VuZGluZyBtZW1vcnkgYWRkcmVzc2VzLCB3ZSBjYW4KLXNpbXBsZSBmb2xsb3cgYWxvbmcgaW4gdGhlIHN5bWJvbCB0YWJsZSBhcyB3ZSBtYWtlIG91ciBwYXNzCi1vdmVyIHRoZSBzYW1wbGUgYmlucy4KLVRoaXMgc3RlcCBpbmNsdWRlcyBhIHN5bXNwZWMgY2hlY2sgYWdhaW5zdCBJTkNMX0ZMQVQvRVhDTF9GTEFULgotRGVwZW5kaW5nIG9uIHRoZSBoaXN0b2dyYW0KLXNjYWxlIGZhY3RvciwgYSBzYW1wbGUgYmluIG1heSBzcGFuIG11bHRpcGxlIHN5bWJvbHMsCi1pbiB3aGljaCBjYXNlIGEgZnJhY3Rpb24gb2YgdGhlIHNhbXBsZSBjb3VudCBpcyBhbGxvY2F0ZWQKLXRvIGVhY2ggc3ltYm9sLCBwcm9wb3J0aW9uYWwgdG8gdGhlIGRlZ3JlZSBvZiBvdmVybGFwLgotVGhpcyBlZmZlY3QgaXMgcmFyZSBmb3Igbm9ybWFsIHByb2ZpbGluZywgYnV0IG92ZXJsYXBzCi1hcmUgbW9yZSBjb21tb24gZHVyaW5nIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIGFuZCBjYW4KLWNhdXNlIGVhY2ggb2YgdHdvIGFkamFjZW50IGxpbmVzIHRvIGJlIGNyZWRpdGVkIHdpdGggaGFsZgotYSBoaXQsIGZvciBleGFtcGxlLgotCi1JZiBjYWxsIGdyYXBoIGRhdGEgaXMgcHJlc2VudCwgQGNvZGV7Y2dfYXJjcy5jOmNnX2Fzc2VtYmxlfSBpcyBjYWxsZWQuCi1GaXJzdCwgaWYgQHNhbXB7LWN9IHdhcyBzcGVjaWZpZWQsIGEgbWFjaGluZS1kZXBlbmRhbnQKLXJvdXRpbmUgKEBjb2Rle2ZpbmRfY2FsbH0pIHNjYW5zIHRocm91Z2ggZWFjaCBzeW1ib2wncyBtYWNoaW5lIGNvZGUsCi1sb29raW5nIGZvciBzdWJyb3V0aW5lIGNhbGwgaW5zdHJ1Y3Rpb25zLCBhbmQgYWRkaW5nIHRoZW0KLXRvIHRoZSBjYWxsIGdyYXBoIHdpdGggYSB6ZXJvIGNhbGwgY291bnQuCi1BIHRvcG9sb2dpY2FsIHNvcnQgaXMgcGVyZm9ybWVkIGJ5IGRlcHRoLWZpcnN0IG51bWJlcmluZwotYWxsIHRoZSBzeW1ib2xzIChAY29kZXtjZ19kZm4uYzpjZ19kZm59KSwgc28gdGhhdAotY2hpbGRyZW4gYXJlIGFsd2F5cyBudW1iZXJlZCBsZXNzIHRoYW4gdGhlaXIgcGFyZW50cywKLXRoZW4gbWFraW5nIGEgYXJyYXkgb2YgcG9pbnRlcnMgaW50byB0aGUgc3ltYm9sIHRhYmxlIGFuZCBzb3J0aW5nIGl0IGludG8KLW51bWVyaWNhbCBvcmRlciwgd2hpY2ggaXMgcmV2ZXJzZSB0b3BvbG9naWNhbAotb3JkZXIgKGNoaWxkcmVuIGFwcGVhciBiZWZvcmUgcGFyZW50cykuCi1DeWNsZXMgYXJlIGFsc28gZGV0ZWN0ZWQgYXQgdGhpcyBwb2ludCwgYWxsIG1lbWJlcnMKLW9mIHdoaWNoIGFyZSBhc3NpZ25lZCB0aGUgc2FtZSB0b3BvbG9naWNhbCBudW1iZXIuCi1Ud28gcGFzc2VzIGFyZSBub3cgbWFkZSB0aHJvdWdoIHRoaXMgc29ydGVkIGFycmF5IG9mIHN5bWJvbCBwb2ludGVycy4KLVRoZSBmaXJzdCBwYXNzLCBmcm9tIGVuZCB0byBiZWdpbm5pbmcgKHBhcmVudHMgdG8gY2hpbGRyZW4pLAotY29tcHV0ZXMgdGhlIGZyYWN0aW9uIG9mIGNoaWxkIHRpbWUgdG8gcHJvcG9nYXRlIHRvIGVhY2ggcGFyZW50Ci1hbmQgYSBwcmludCBmbGFnLgotVGhlIHByaW50IGZsYWcgcmVmbGVjdHMgc3ltc3BlYyBoYW5kbGluZyBvZiBJTkNMX0dSQVBIL0VYQ0xfR1JBUEgsCi13aXRoIGEgcGFyZW50J3MgaW5jbHVkZSBvciBleGNsdWRlIChwcmludCBvciBubyBwcmludCkgcHJvcGVydHkKLWJlaW5nIHByb3BhZ2F0ZWQgdG8gaXRzIGNoaWxkcmVuLCB1bmxlc3MgdGhleSB0aGVtc2VsdmVzIGV4cGxpY2l0bHkgYXBwZWFyCi1pbiBJTkNMX0dSQVBIIG9yIEVYQ0xfR1JBUEguCi1BIHNlY29uZCBwYXNzLCBmcm9tIGJlZ2lubmluZyB0byBlbmQgKGNoaWxkcmVuIHRvIHBhcmVudHMpIGFjdHVhbGx5Ci1wcm9wb2dhdGVzIHRoZSB0aW1pbmdzIGFsb25nIHRoZSBjYWxsIGdyYXBoLCBzdWJqZWN0Ci10byBhIGNoZWNrIGFnYWluc3QgSU5DTF9USU1FL0VYQ0xfVElNRS4KLVdpdGggdGhlIHByaW50IGZsYWcsIGZyYWN0aW9ucywgYW5kIHRpbWluZ3Mgbm93IHN0b3JlZCBpbiB0aGUgc3ltYm9sCi1zdHJ1Y3R1cmVzLCB0aGUgdG9wb2xvZ2ljYWwgc29ydCBhcnJheSBpcyBub3cgZGlzY2FyZGVkLCBhbmQgYQotbmV3IGFycmF5IG9mIHBvaW50ZXJzIGlzIGFzc2VtYmxlZCwgdGhpcyB0aW1lIHNvcnRlZCBieSBwcm9wYWdhdGVkIHRpbWUuCi0KLUZpbmFsbHksIHByaW50IHRoZSB2YXJpb3VzIG91dHB1dHMgdGhlIHVzZXIgcmVxdWVzdGVkLCB3aGljaCBpcyBub3cgZmFpcmx5Ci1zdHJhaWdodGZvcndhcmQuICBUaGUgY2FsbCBncmFwaCAoQGNvZGV7Y2dfcHJpbnQuYzpjZ19wcmludH0pIGFuZAotZmxhdCBwcm9maWxlIChAY29kZXtoaXN0LmM6aGlzdF9wcmludH0pIGFyZSByZWd1cmdpdGF0aW9ucyBvZiB2YWx1ZXMKLWFscmVhZHkgY29tcHV0ZWQuICBUaGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nCi0oQGNvZGV7YmFzaWNfYmxvY2tzLmM6cHJpbnRfYW5ub3RhdGVkX3NvdXJjZX0pIHVzZXMgYmFzaWMtYmxvY2sKLWluZm9ybWF0aW9uLCBpZiBwcmVzZW50LCB0byBsYWJlbCBlYWNoIGxpbmUgb2YgY29kZSB3aXRoIGNhbGwgY291bnRzLAotb3RoZXJ3aXNlIG9ubHkgdGhlIGZ1bmN0aW9uIGNhbGwgY291bnRzIGFyZSBwcmVzZW50ZWQuCi0KLVRoZSBmdW5jdGlvbiBvcmRlcmluZyBjb2RlIGlzIG1hcmdpbmFsbHkgd2VsbCBkb2N1bWVudGVkCi1pbiB0aGUgc291cmNlIGNvZGUgaXRzZWxmIChAY29kZXtjZ19wcmludC5jfSkuICBCYXNpY2FsbHksCi10aGUgZnVuY3Rpb25zIHdpdGggdGhlIG1vc3QgdXNlIGFuZCB0aGUgbW9zdCBwYXJlbnRzIGFyZQotcGxhY2VkIGZpcnN0LCBmb2xsb3dlZCBieSBvdGhlciBmdW5jdGlvbnMgd2l0aCB0aGUgbW9zdCB1c2UsCi1mb2xsb3dlZCBieSBsb3dlciB1c2UgZnVuY3Rpb25zLCBmb2xsb3dlZCBieSB1bnVzZWQgZnVuY3Rpb25zCi1hdCB0aGUgZW5kLgotCi1Abm9kZSBEZWJ1Z2dpbmcsLEludGVybmFscyxEZXRhaWxzCi1Ac3Vic2VjdGlvbiBEZWJ1Z2dpbmcgQGNvZGV7Z3Byb2Z9Ci0KLUlmIEBjb2Rle2dwcm9mfSB3YXMgY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZCwKLXRoZSBAc2FtcHstZH0gb3B0aW9uIHRyaWdnZXJzIGRlYnVnZ2luZyBvdXRwdXQKLSh0byBzdGRvdXQpIHdoaWNoIGNhbiBiZSBoZWxwZnVsIGluIHVuZGVyc3RhbmRpbmcgaXRzIG9wZXJhdGlvbi4KLVRoZSBkZWJ1Z2dpbmcgbnVtYmVyIHNwZWNpZmllZCBpcyBpbnRlcnByZXRlZCBhcyBhIHN1bSBvZiB0aGUgZm9sbG93aW5nCi1vcHRpb25zOgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIDIgLSBUb3BvbG9naWNhbCBzb3J0Ci1Nb25pdG9yIGRlcHRoLWZpcnN0IG51bWJlcmluZyBvZiBzeW1ib2xzIGR1cmluZyBjYWxsIGdyYXBoIGFuYWx5c2lzCi1AaXRlbSA0IC0gQ3ljbGVzCi1TaG93cyBzeW1ib2xzIGFzIHRoZXkgYXJlIGlkZW50aWZpZWQgYXMgY3ljbGUgaGVhZHMKLUBpdGVtIDE2IC0gVGFsbHlpbmcKLUFzIHRoZSBjYWxsIGdyYXBoIGFyY3MgYXJlIHJlYWQsIHNob3cgZWFjaCBhcmMgYW5kIGhvdwotdGhlIHRvdGFsIGNhbGxzIHRvIGVhY2ggZnVuY3Rpb24gYXJlIHRhbGxpZWQKLUBpdGVtIDMyIC0gQ2FsbCBncmFwaCBhcmMgc29ydGluZwotRGV0YWlscyBzb3J0aW5nIGluZGl2aWR1YWwgcGFyZW50cy9jaGlsZHJlbiB3aXRoaW4gZWFjaCBjYWxsIGdyYXBoIGVudHJ5Ci1AaXRlbSA2NCAtIFJlYWRpbmcgaGlzdG9ncmFtIGFuZCBjYWxsIGdyYXBoIHJlY29yZHMKLVNob3dzIGFkZHJlc3MgcmFuZ2VzIG9mIGhpc3RvZ3JhbXMgYXMgdGhleSBhcmUgcmVhZCwgYW5kIGVhY2gKLWNhbGwgZ3JhcGggYXJjCi1AaXRlbSAxMjggLSBTeW1ib2wgdGFibGUKLVJlYWRpbmcsIGNsYXNzaWZ5aW5nLCBhbmQgc29ydGluZyB0aGUgc3ltYm9sIHRhYmxlIGZyb20gdGhlIG9iamVjdCBmaWxlLgotRm9yIGxpbmUtYnktbGluZSBwcm9maWxpbmcgKEBzYW1wey1sfSBvcHRpb24pLCBhbHNvIHNob3dzIGxpbmUgbnVtYmVycwotYmVpbmcgYXNzaWduZWQgdG8gbWVtb3J5IGFkZHJlc3Nlcy4KLUBpdGVtIDI1NiAtIFN0YXRpYyBjYWxsIGdyYXBoCi1UcmFjZSBvcGVyYXRpb24gb2YgQHNhbXB7LWN9IG9wdGlvbgotQGl0ZW0gNTEyIC0gU3ltYm9sIHRhYmxlIGFuZCBhcmMgdGFibGUgbG9va3VwcwotRGV0YWlsIG9wZXJhdGlvbiBvZiBsb29rdXAgcm91dGluZXMKLUBpdGVtIDEwMjQgLSBDYWxsIGdyYXBoIHByb3BhZ2F0aW9uCi1TaG93cyBob3cgZnVuY3Rpb24gdGltZXMgYXJlIHByb3BhZ2F0ZWQgYWxvbmcgdGhlIGNhbGwgZ3JhcGgKLUBpdGVtIDIwNDggLSBCYXNpYy1ibG9ja3MKLVNob3dzIGJhc2ljLWJsb2NrIHJlY29yZHMgYXMgdGhleSBhcmUgcmVhZCBmcm9tIHByb2ZpbGUgZGF0YQotKG9ubHkgbWVhbmluZ2Z1bCB3aXRoIEBzYW1wey1sfSBvcHRpb24pCi1AaXRlbSA0MDk2IC0gU3ltc3BlY3MKLVNob3dzIHN5bXNwZWMtdG8tc3ltYm9sIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0aW9uCi1AaXRlbSA4MTkyIC0gQW5ub3RhdGUgc291cmNlCi1UcmFja3Mgb3BlcmF0aW9uIG9mIEBzYW1wey1BfSBvcHRpb24KLUBlbmQgdGFibGUKLQotQGNvbnRlbnRzCi1AYnllCi0KLU5FRURTIEFOIElOREVYCi0KLS1UIC0gInRyYWRpdGlvbmFsIEJTRCBzdHlsZSI6IEhvdyBpcyBpdCBkaWZmZXJlbnQ/ICBTaG91bGQgdGhlCi1kaWZmZXJlbmNlcyBiZSBkb2N1bWVudGVkPwotCi1leGFtcGxlIGZsYXQgZmlsZSBhZGRzIHVwIHRvIDEwMC4wMSUuLi4KLQotbm90ZTogdGltZSBlc3RpbWF0ZXMgbm93IG9ubHkgZ28gb3V0IHRvIG9uZSBkZWNpbWFsIHBsYWNlICgwLjApLCB3aGVyZQotdGhleSB1c2VkIHRvIGV4dGVuZCB0d28gKDc4LjY3KS4KZGlmZiAtLWdpdCBhL2dwcm9mL2hlcnR6LmMgYi9ncHJvZi9oZXJ0ei5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTMxNGFjLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2hlcnR6LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImhlcnR6LmgiCi0KLQotI2lmZGVmIF9fTVNET1NfXwotI2RlZmluZSBIRVJUWiAxOAotI2VuZGlmCi0KLWludAotaGVydHogKCkKLXsKLSNpZmRlZiBIRVJUWgotICByZXR1cm4gSEVSVFo7Ci0jZWxzZSAvKiAhIGRlZmluZWQgKEhFUlRaKSAqLwotI2lmZGVmIEhBVkVfU0VUSVRJTUVSCi0gIHN0cnVjdCBpdGltZXJ2YWwgdGltOwotCi0gIHRpbS5pdF9pbnRlcnZhbC50dl9zZWMgPSAwOwotICB0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDE7Ci0gIHRpbS5pdF92YWx1ZS50dl9zZWMgPSAwOwotICB0aW0uaXRfdmFsdWUudHZfdXNlYyA9IDA7Ci0gIHNldGl0aW1lciAoSVRJTUVSX1JFQUwsICZ0aW0sIDApOwotICBzZXRpdGltZXIgKElUSU1FUl9SRUFMLCAwLCAmdGltKTsKLSAgaWYgKHRpbS5pdF9pbnRlcnZhbC50dl91c2VjIDwgMikKLSAgICB7Ci0gICAgICByZXR1cm4gSFpfV1JPTkc7Ci0gICAgfQotICByZXR1cm4gMTAwMDAwMCAvIHRpbS5pdF9pbnRlcnZhbC50dl91c2VjOwotI2Vsc2UgLyogISBkZWZpbmVkIChIQVZFX1NFVElUSU1FUikgKi8KLSNpZiBkZWZpbmVkIChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQgKF9TQ19DTEtfVENLKQotICByZXR1cm4gc3lzY29uZiAoX1NDX0NMS19UQ0spOwotI2Vsc2UgLyogISBkZWZpbmVkIChIQVZFX1NZU0NPTkYpIHx8ICEgZGVmaW5lZCAoX1NDX0NMS19UQ0spICovCi0gIHJldHVybiBIWl9XUk9ORzsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgfHwgISBkZWZpbmVkIChfU0NfQ0xLX1RDSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfU0VUSVRJTUVSKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoSEVSVFopICovCi19CmRpZmYgLS1naXQgYS9ncHJvZi9oZXJ0ei5oIGIvZ3Byb2YvaGVydHouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhMDFiYS4uMDAwMDAwMAotLS0gYS9ncHJvZi9oZXJ0ei5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI2lmbmRlZiBoZXJ0el9oCi0jZGVmaW5lIGhlcnR6X2gKLQotI2luY2x1ZGUgImdwcm9mLmgiCi0KLSNkZWZpbmUJSFpfV1JPTkcgMAkJLyogaW1wb3NzaWJsZSBjbG9jayBmcmVxdWVuY3kgKi8KLQotLyoKLSAqIERpc2NvdmVyIHRoZSB0aWNrIGZyZXF1ZW5jeSBvZiB0aGUgbWFjaGluZSBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZywKLSAqIHdlIHJldHVybiBIWl9XUk9ORywgYW4gaW1wb3NzaWJsZSBzYW1wbGluZyBmcmVxdWVuY3kuCi0gKi8KLQotLyogRklYTUU6IENoZWNraW5nIGZvciBNQUNIIGhlcmUgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBmb3IgYSBjcm9zcwotICAgZ3Byb2YuICAqLwotI2lmZGVmIE1BQ0gKLSNpbmNsdWRlIDxtYWNoaW5lL21hY2hfcGFyYW0uaD4KLSNkZWZpbmUgaGVydHooKSAoSFopCi0jZWxzZQotZXh0ZXJuIGludCBoZXJ0eiBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIGhlcnR6X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2hpc3QuYyBiL2dwcm9mL2hpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlZjI1YS4uMDAwMDAwMAotLS0gYS9ncHJvZi9oaXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoKLSAqIEhpc3RvZ3JhbSByZWxhdGVkIG9wZXJhdGlvbnMuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0KLSNkZWZpbmUgVU5JVFNfVE9fQ09ERSAob2Zmc2V0X3RvX2NvZGUgLyBzaXplb2YoVU5JVCkpCi0KLXN0YXRpYyB2b2lkIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogZGVjbGFyYXRpb25zIG9mIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZ1bmN0aW9ucyB0byBvdXRwdXQgYmx1cmJzOiAqLwotZXh0ZXJuIHZvaWQgZmxhdF9ibHVyYiBQQVJBTVMgKChGSUxFICogZnApKTsKLQotYmZkX3ZtYSBzX2xvd3BjOwkJLyogbG93ZXN0IGFkZHJlc3MgaW4gLnRleHQgKi8KLWJmZF92bWEgc19oaWdocGMgPSAwOwkJLyogaGlnaGVzdCBhZGRyZXNzIGluIC50ZXh0ICovCi1iZmRfdm1hIGxvd3BjLCBoaWdocGM7CQkvKiBzYW1lLCBidXQgZXhwcmVzc2VkIGluIFVOSVRzICovCi1pbnQgaGlzdF9udW1fYmlucyA9IDA7CQkvKiBudW1iZXIgb2YgaGlzdG9ncmFtIHNhbXBsZXMgKi8KLWludCAqaGlzdF9zYW1wbGUgPSAwOwkJLyogaGlzdG9ncmFtIHNhbXBsZXMgKHNob3J0cyBpbiB0aGUgZmlsZSEpICovCi1kb3VibGUgaGlzdF9zY2FsZTsKLWNoYXIgaGlzdF9kaW1lbnNpb25bc2l6ZW9mICgoKHN0cnVjdCBnbW9uX2hpc3RfaGRyICopIDApLT5kaW1lbikgKyAxXSA9Ci0gICJzZWNvbmRzIjsKLWNoYXIgaGlzdF9kaW1lbnNpb25fYWJicmV2ID0gJ3MnOwotCi1zdGF0aWMgZG91YmxlIGFjY3VtX3RpbWU7CS8qIGFjY3VtdWxhdGVkIHRpbWUgc28gZmFyIGZvciBwcmludF9saW5lKCkgKi8KLXN0YXRpYyBkb3VibGUgdG90YWxfdGltZTsJLyogdG90YWwgdGltZSBmb3IgYWxsIHJvdXRpbmVzICovCi0vKgotICogVGFibGUgb2YgU0kgcHJlZml4ZXMgZm9yIHBvd2VycyBvZiAxMCAodXNlZCB0byBhdXRvbWF0aWNhbGx5Ci0gKiBzY2FsZSBzb21lIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGZsYXQgcHJvZmlsZSkuCi0gKi8KLWNvbnN0IHN0cnVjdAotICB7Ci0gICAgY2hhciBwcmVmaXg7Ci0gICAgZG91YmxlIHNjYWxlOwotICB9Ci1TSXRhYltdID0KLXsKLSAgewotICAgICdUJywgMWUtMTIKLSAgfQotICAsCQkJCS8qIHRlcmEgKi8KLSAgewotICAgICdHJywgMWUtMDkKLSAgfQotICAsCQkJCS8qIGdpZ2EgKi8KLSAgewotICAgICdNJywgMWUtMDYKLSAgfQotICAsCQkJCS8qIG1lZ2EgKi8KLSAgewotICAgICdLJywgMWUtMDMKLSAgfQotICAsCQkJCS8qIGtpbG8gKi8KLSAgewotICAgICcgJywgMWUtMDAKLSAgfQotICAsCi0gIHsKLSAgICAnbScsIDFlKzAzCi0gIH0KLSAgLAkJCQkvKiBtaWxsaSAqLwotICB7Ci0gICAgJ3UnLCAxZSswNgotICB9Ci0gICwJCQkJLyogbWljcm8gKi8KLSAgewotICAgICduJywgMWUrMDkKLSAgfQotICAsCQkJCS8qIG5hbm8gKi8KLSAgewotICAgICdwJywgMWUrMTIKLSAgfQotICAsCQkJCS8qIHBpY28gKi8KLSAgewotICAgICdmJywgMWUrMTUKLSAgfQotICAsCQkJCS8qIGZlbXRvICovCi0gIHsKLSAgICAnYScsIDFlKzE4Ci0gIH0KLSAgLAkJCQkvKiBhdG8gKi8KLX07Ci0KLS8qCi0gKiBSZWFkIHRoZSBoaXN0b2dyYW0gZnJvbSBmaWxlIElGUC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lIG9mIElGUCBhbmQKLSAqIGlzIHByb3ZpZGVkIGZvciBmb3JtYXR0aW5nIGVycm9yIG1lc3NhZ2VzIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChoaXN0X3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBzdHJ1Y3QgZ21vbl9oaXN0X2hkciBoZHI7Ci0gIGJmZF92bWEgbl9sb3dwYywgbl9oaWdocGM7Ci0gIGludCBpLCBuY250LCBwcm9mcmF0ZTsKLSAgVU5JVCBjb3VudDsKLQotICBpZiAoZnJlYWQgKCZoZHIsIHNpemVvZiAoaGRyKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iKSwKLQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgbl9sb3dwYyA9IChiZmRfdm1hKSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5sb3dfcGMpOwotICBuX2hpZ2hwYyA9IChiZmRfdm1hKSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5oaWdoX3BjKTsKLSAgbmNudCA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLmhpc3Rfc2l6ZSk7Ci0gIHByb2ZyYXRlID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIucHJvZl9yYXRlKTsKLSAgc3RybmNweSAoaGlzdF9kaW1lbnNpb24sIGhkci5kaW1lbiwgc2l6ZW9mIChoZHIuZGltZW4pKTsKLSAgaGlzdF9kaW1lbnNpb25bc2l6ZW9mIChoZHIuZGltZW4pXSA9ICdcMCc7Ci0gIGhpc3RfZGltZW5zaW9uX2FiYnJldiA9IGhkci5kaW1lbl9hYmJyZXY7Ci0KLSAgaWYgKCFzX2hpZ2hwYykKLSAgICB7Ci0KLSAgICAgIC8qIHRoaXMgaXMgdGhlIGZpcnN0IGhpc3RvZ3JhbSByZWNvcmQ6ICovCi0KLSAgICAgIHNfbG93cGMgPSBuX2xvd3BjOwotICAgICAgc19oaWdocGMgPSBuX2hpZ2hwYzsKLSAgICAgIGxvd3BjID0gKGJmZF92bWEpIG5fbG93cGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgaGlnaHBjID0gKGJmZF92bWEpIG5faGlnaHBjIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIGhpc3RfbnVtX2JpbnMgPSBuY250OwotICAgICAgaHogPSBwcm9mcmF0ZTsKLSAgICB9Ci0KLSAgREJHIChTQU1QTEVERUJVRywKLSAgICAgICBwcmludGYgKCJbaGlzdF9yZWFkX3JlY10gbl9sb3dwYyAweCVseCBuX2hpZ2hwYyAweCVseCBuY250ICVkXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgbl9sb3dwYywgKHVuc2lnbmVkIGxvbmcpIG5faGlnaHBjLCBuY250KTsKLSAgICAgICBwcmludGYgKCJbaGlzdF9yZWFkX3JlY10gc19sb3dwYyAweCVseCBzX2hpZ2hwYyAweCVseCBuc2FtcGxlcyAlZFxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNfbG93cGMsICh1bnNpZ25lZCBsb25nKSBzX2hpZ2hwYywKLQkgICAgICAgaGlzdF9udW1fYmlucyk7Ci0gICAgICAgcHJpbnRmICgiW2hpc3RfcmVhZF9yZWNdICAgbG93cGMgMHglbHggICBoaWdocGMgMHglbHhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBsb3dwYywgKHVuc2lnbmVkIGxvbmcpIGhpZ2hwYykpOwotCi0gIGlmIChuX2xvd3BjICE9IHNfbG93cGMgfHwgbl9oaWdocGMgIT0gc19oaWdocGMKLSAgICAgIHx8IG5jbnQgIT0gaGlzdF9udW1fYmlucyB8fCBoeiAhPSBwcm9mcmF0ZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBgJXMnIGlzIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICghaGlzdF9zYW1wbGUpCi0gICAgewotICAgICAgaGlzdF9zYW1wbGUgPSAoaW50ICopIHhtYWxsb2MgKGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0gICAgICBtZW1zZXQgKGhpc3Rfc2FtcGxlLCAwLCBoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9udW1fYmluczsgKytpKQotICAgIHsKLSAgICAgIGlmIChmcmVhZCAoJmNvdW50WzBdLCBzaXplb2YgKGNvdW50KSwgMSwgaWZwKSAhPSAxKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiJXM6ICVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkIG9mICVkIHNhbXBsZXNcbiIpLAotCQkgICB3aG9hbWksIGZpbGVuYW1lLCBpLCBoaXN0X251bV9iaW5zKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICAgIGhpc3Rfc2FtcGxlW2ldICs9IGJmZF9nZXRfMTYgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJiBjb3VudFswXSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBXcml0ZSBleGVjdXRpb24gaGlzdG9ncmFtIHRvIGZpbGUgT0ZQLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUKLSAqIG9mIE9GUCBhbmQgaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGhpc3Rfd3JpdGVfaGlzdCwgKG9mcCwgZmlsZW5hbWUpLCBGSUxFICogb2ZwIEFORCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgc3RydWN0IGdtb25faGlzdF9oZHIgaGRyOwotICB1bnNpZ25lZCBjaGFyIHRhZzsKLSAgVU5JVCBjb3VudDsKLSAgaW50IGk7Ci0KLSAgLyogd3JpdGUgaGVhZGVyOiAqLwotCi0gIHRhZyA9IEdNT05fVEFHX1RJTUVfSElTVDsKLSAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfbG93cGMsIChiZmRfYnl0ZSAqKSBoZHIubG93X3BjKTsKLSAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfaGlnaHBjLCAoYmZkX2J5dGUgKikgaGRyLmhpZ2hfcGMpOwotICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgaGlzdF9udW1fYmlucywgKGJmZF9ieXRlICopIGhkci5oaXN0X3NpemUpOwotICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgaHosIChiZmRfYnl0ZSAqKSBoZHIucHJvZl9yYXRlKTsKLSAgc3RybmNweSAoaGRyLmRpbWVuLCBoaXN0X2RpbWVuc2lvbiwgc2l6ZW9mIChoZHIuZGltZW4pKTsKLSAgaGRyLmRpbWVuX2FiYnJldiA9IGhpc3RfZGltZW5zaW9uX2FiYnJldjsKLQotICBpZiAoZndyaXRlICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIG9mcCkgIT0gMQotICAgICAgfHwgZndyaXRlICgmaGRyLCBzaXplb2YgKGhkciksIDEsIG9mcCkgIT0gMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9udW1fYmluczsgKytpKQotICAgIHsKLSAgICAgIGJmZF9wdXRfMTYgKGNvcmVfYmZkLCBoaXN0X3NhbXBsZVtpXSwgKGJmZF9ieXRlICopICYgY291bnRbMF0pOwotICAgICAgaWYgKGZ3cml0ZSAoJmNvdW50WzBdLCBzaXplb2YgKGNvdW50KSwgMSwgb2ZwKSAhPSAxKQotCXsKLQkgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogQ2FsY3VsYXRlIHNjYWxlZCBlbnRyeSBwb2ludCBhZGRyZXNzZXMgKHRvIHNhdmUgdGltZSBpbgotICogaGlzdF9hc3NpZ25fc2FtcGxlcyksIGFuZCwgb24gYXJjaGl0ZWN0dXJlcyB0aGF0IGhhdmUgcHJvY2VkdXJlCi0gKiBlbnRyeSBtYXNrcyBhdCB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiwgcG9zc2libHkgcHVzaCB0aGUgc2NhbGVkCi0gKiBlbnRyeSBwb2ludHMgb3ZlciB0aGUgcHJvY2VkdXJlIGVudHJ5IG1hc2ssIGlmIGl0IHR1cm5zIG91dCB0aGF0Ci0gKiB0aGUgZW50cnkgcG9pbnQgaXMgaW4gb25lIGJpbiBhbmQgdGhlIGNvZGUgZm9yIGEgcm91dGluZSBpcyBpbiB0aGUKLSAqIG5leHQgYmluLgotICovCi1zdGF0aWMgdm9pZAotc2NhbGVfYW5kX2FsaWduX2VudHJpZXMgKCkKLXsKLSAgU3ltICpzeW07Ci0gIGJmZF92bWEgYmluX29mX2VudHJ5OwotICBiZmRfdm1hIGJpbl9vZl9jb2RlOwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgc3ltKyspCi0gICAgewotICAgICAgc3ltLT5oaXN0LnNjYWxlZF9hZGRyID0gc3ltLT5hZGRyIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIGJpbl9vZl9lbnRyeSA9IChzeW0tPmhpc3Quc2NhbGVkX2FkZHIgLSBsb3dwYykgLyBoaXN0X3NjYWxlOwotICAgICAgYmluX29mX2NvZGUgPSAoc3ltLT5oaXN0LnNjYWxlZF9hZGRyICsgVU5JVFNfVE9fQ09ERSAtIGxvd3BjKSAvIGhpc3Rfc2NhbGU7Ci0gICAgICBpZiAoYmluX29mX2VudHJ5IDwgYmluX29mX2NvZGUpCi0JewotCSAgREJHIChTQU1QTEVERUJVRywKLQkgICAgICAgcHJpbnRmICgiW3NjYWxlX2FuZF9hbGlnbl9lbnRyaWVzXSBwdXNoaW5nIDB4JWx4IHRvIDB4JWx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN5bS0+aGlzdC5zY2FsZWRfYWRkciwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoc3ltLT5oaXN0LnNjYWxlZF9hZGRyCi0JCQkJCSsgVU5JVFNfVE9fQ09ERSkpKTsKLQkgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciArPSBVTklUU19UT19DT0RFOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIEFzc2lnbiBzYW1wbGVzIHRvIHRoZSBzeW1ib2wgdG8gd2hpY2ggdGhleSBiZWxvbmcuCi0gKgotICogSGlzdG9ncmFtIGJpbiBJIGNvdmVycyBzb21lIGFkZHJlc3MgcmFuZ2UgW0JJTl9MT1dQQyxCSU5fSElHSF9QQykKLSAqIHdoaWNoIG1heSBvdmVybGFwIG9uZSBtb3JlIHN5bWJvbCBhZGRyZXNzIHJhbmdlcy4gIElmIGEgc3ltYm9sCi0gKiBvdmVybGFwcyB3aXRoIHRoZSBiaW4ncyBhZGRyZXNzIHJhbmdlIGJ5IE8gcGVyY2VudCwgdGhlbiBPIHBlcmNlbnQKLSAqIG9mIHRoZSBiaW4ncyBjb3VudCBpcyBjcmVkaXRlZCB0byB0aGF0IHN5bWJvbC4KLSAqCi0gKiBUaGVyZSBhcmUgdGhyZWUgY2FzZXMgYXMgdG8gd2hlcmUgQklOX0xPV19QQyBhbmQgQklOX0hJR0hfUEMgY2FuIGJlCi0gKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHN5bWJvbCdzIGFkZHJlc3MgcmFuZ2UgW1NZTV9MT1dfUEMsCi0gKiBTWU1fSElHSF9QQykgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBkaWFncmFtLiAgT1ZFUkxBUCBjb21wdXRlcwotICogdGhlIGRpc3RhbmNlIChpbiBVTklUcykgYmV0d2VlbiB0aGUgYXJyb3dzLCB0aGUgZnJhY3Rpb24gb2YgdGhlCi0gKiBzYW1wbGUgdGhhdCBpcyB0byBiZSBjcmVkaXRlZCB0byB0aGUgc3ltYm9sIHdoaWNoIHN0YXJ0cyBhdAotICogU1lNX0xPV19QQy4KLSAqCi0gKiAgICAgICAgc3ltX2xvd19wYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltX2hpZ2hfcGMKLSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKLSAqCi0gKiAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgfCAgLT58ICAgIHw8LSAgICAgICAgIC0+fCAgICAgICAgIHw8LSAgICAgICAgIC0+fCAgICB8PC0gIHwKLSAqICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfAotICogICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICstLS0tLS0tLS0rCi0gKgotICogICAgICAgIF4gICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICBeCi0gKiAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwKLSAqICAgYmluX2xvd19wYyBiaW5faGlnaF9wYyAgYmluX2xvd19wYyBiaW5faGlnaF9wYyAgYmluX2xvd19wYyBiaW5faGlnaF9wYwotICoKLSAqIEZvciB0aGUgVkFYIHdlIGFzc2VydCB0aGF0IHNhbXBsZXMgd2lsbCBuZXZlciBmYWxsIGluIHRoZSBmaXJzdCB0d28KLSAqIGJ5dGVzIG9mIGFueSByb3V0aW5lLCBzaW5jZSB0aGF0IGlzIHRoZSBlbnRyeSBtYXNrLCB0aHVzIHdlIGNhbGwKLSAqIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzKCkgdG8gYWRqdXN0IHRoZSBlbnRyeSBwb2ludHMgaWYgdGhlIGVudHJ5Ci0gKiBtYXNrIGZhbGxzIGluIG9uZSBiaW4gYnV0IHRoZSBjb2RlIGZvciB0aGUgcm91dGluZSBkb2Vzbid0IHN0YXJ0Ci0gKiB1bnRpbCB0aGUgbmV4dCBiaW4uICBJbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbGlnbm1lbnQgb2Ygcm91dGluZQotICogYWRkcmVzc2VzLCB0aGlzIHNob3VsZCBhbGxvdyB1cyB0byBoYXZlIG9ubHkgb25lIHNhbXBsZSBmb3IgZXZlcnkKLSAqIGZvdXIgYnl0ZXMgb2YgdGV4dCBzcGFjZSBhbmQgbmV2ZXIgaGF2ZSBhbnkgb3ZlcmxhcCAodGhlIHR3byBlbmQKLSAqIGNhc2VzLCBhYm92ZSkuCi0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKGhpc3RfYXNzaWduX3NhbXBsZXMpCi17Ci0gIGJmZF92bWEgYmluX2xvd19wYywgYmluX2hpZ2hfcGM7Ci0gIGJmZF92bWEgc3ltX2xvd19wYywgc3ltX2hpZ2hfcGM7Ci0gIGJmZF92bWEgb3ZlcmxhcCwgYWRkcjsKLSAgaW50IGJpbl9jb3VudCwgaTsKLSAgdW5zaWduZWQgaW50IGo7Ci0gIGRvdWJsZSB0aW1lLCBjcmVkaXQ7Ci0KLSAgLyogcmVhZCBzYW1wbGVzIGFuZCBhc3NpZ24gdG8gc3ltYm9sczogKi8KLSAgaGlzdF9zY2FsZSA9IGhpZ2hwYyAtIGxvd3BjOwotICBoaXN0X3NjYWxlIC89IGhpc3RfbnVtX2JpbnM7Ci0gIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzICgpOwotCi0gIC8qIGl0ZXJhdGUgb3ZlciBhbGwgc2FtcGxlIGJpbnM6ICovCi0KLSAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgYmluX2NvdW50ID0gaGlzdF9zYW1wbGVbaV07Ci0gICAgICBpZiAoIWJpbl9jb3VudCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBiaW5fbG93X3BjID0gbG93cGMgKyAoYmZkX3ZtYSkgKGhpc3Rfc2NhbGUgKiBpKTsKLSAgICAgIGJpbl9oaWdoX3BjID0gbG93cGMgKyAoYmZkX3ZtYSkgKGhpc3Rfc2NhbGUgKiAoaSArIDEpKTsKLSAgICAgIHRpbWUgPSBiaW5fY291bnQ7Ci0gICAgICBEQkcgKFNBTVBMRURFQlVHLAotCSAgIHByaW50ZiAoCi0gICAgICAiW2Fzc2lnbl9zYW1wbGVzXSBiaW5fbG93X3BjPTB4JWx4LCBiaW5faGlnaF9wYz0weCVseCwgYmluX2NvdW50PSVkXG4iLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIChzaXplb2YgKFVOSVQpICogYmluX2xvd19wYyksCi0JCSAgICAodW5zaWduZWQgbG9uZykgKHNpemVvZiAoVU5JVCkgKiBiaW5faGlnaF9wYyksCi0JCSAgICBiaW5fY291bnQpKTsKLSAgICAgIHRvdGFsX3RpbWUgKz0gdGltZTsKLQotICAgICAgLyogY3JlZGl0IGFsbCBzeW1ib2xzIHRoYXQgYXJlIGNvdmVyZWQgYnkgYmluIEk6ICovCi0KLSAgICAgIGZvciAoaiA9IGogLSAxOyBqIDwgc3ltdGFiLmxlbjsgKytqKQotCXsKLQkgIHN5bV9sb3dfcGMgPSBzeW10YWIuYmFzZVtqXS5oaXN0LnNjYWxlZF9hZGRyOwotCSAgc3ltX2hpZ2hfcGMgPSBzeW10YWIuYmFzZVtqICsgMV0uaGlzdC5zY2FsZWRfYWRkcjsKLQkgIC8qCi0JICAgKiBJZiBoaWdoIGVuZCBvZiBiaW4gaXMgYmVsb3cgZW50cnkgYWRkcmVzcywgZ28gZm9yIG5leHQKLQkgICAqIGJpbjoKLQkgICAqLwotCSAgaWYgKGJpbl9oaWdoX3BjIDwgc3ltX2xvd19wYykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKgotCSAgICogSWYgbG93IGVuZCBvZiBiaW4gaXMgYWJvdmUgaGlnaCBlbmQgb2Ygc3ltYm9sLCBnbyBmb3IKLQkgICAqIG5leHQgc3ltYm9sLgotCSAgICovCi0JICBpZiAoYmluX2xvd19wYyA+PSBzeW1faGlnaF9wYykKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBvdmVybGFwID0KLQkgICAgTUlOIChiaW5faGlnaF9wYywgc3ltX2hpZ2hfcGMpIC0gTUFYIChiaW5fbG93X3BjLCBzeW1fbG93X3BjKTsKLQkgIGlmIChvdmVybGFwID4gMCkKLQkgICAgewotCSAgICAgIERCRyAoU0FNUExFREVCVUcsCi0JCSAgIHByaW50ZiAoCi0JCQkgICAgIlthc3NpZ25fc2FtcGxlc10gWzB4JWx4LDB4JWx4KSAlcyBnZXRzICVmIHRpY2tzICVsZCBvdmVybGFwXG4iLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSBzeW10YWIuYmFzZVtqXS5hZGRyLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSAoc2l6ZW9mIChVTklUKSAqIHN5bV9oaWdoX3BjKSwKLQkJCSAgICBzeW10YWIuYmFzZVtqXS5uYW1lLCBvdmVybGFwICogdGltZSAvIGhpc3Rfc2NhbGUsCi0JCQkgICAgKGxvbmcpIG92ZXJsYXApKTsKLQkgICAgICBhZGRyID0gc3ltdGFiLmJhc2Vbal0uYWRkcjsKLQkgICAgICBjcmVkaXQgPSBvdmVybGFwICogdGltZSAvIGhpc3Rfc2NhbGU7Ci0JICAgICAgLyoKLQkgICAgICAgKiBDcmVkaXQgc3ltYm9sIGlmIGl0IGFwcGVhcnMgaW4gSU5DTF9GTEFUIG9yIHRoYXQKLQkgICAgICAgKiB0YWJsZSBpcyBlbXB0eSBhbmQgaXQgZG9lcyBub3QgYXBwZWFyIGl0IGluCi0JICAgICAgICogRVhDTF9GTEFULgotCSAgICAgICAqLwotCSAgICAgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0ZMQVRdLCBhZGRyKQotCQkgIHx8IChzeW1zW0lOQ0xfRkxBVF0ubGVuID09IDAKLQkJICAgICAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfRkxBVF0sIGFkZHIpKSkKLQkJewotCQkgIHN5bXRhYi5iYXNlW2pdLmhpc3QudGltZSArPSBjcmVkaXQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0b3RhbF90aW1lIC09IGNyZWRpdDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgREJHIChTQU1QTEVERUJVRywgcHJpbnRmICgiW2Fzc2lnbl9zYW1wbGVzXSB0b3RhbF90aW1lICVmXG4iLAotCQkJICAgIHRvdGFsX3RpbWUpKTsKLX0KLQotCi0vKgotICogUHJpbnQgaGVhZGVyIGZvciBmbGFnIGhpc3RvZ3JhbSBwcm9maWxlOgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X2hlYWRlciwgKHByZWZpeCksIGNvbnN0IGNoYXIgcHJlZml4KQotewotICBjaGFyIHVuaXRbNjRdOwotCi0gIHNwcmludGYgKHVuaXQsIF8oIiVjJWMvY2FsbCIpLCBwcmVmaXgsIGhpc3RfZGltZW5zaW9uX2FiYnJldik7Ci0KLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcbmdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzICVsZCBieXRlKHMpIiksCi0JICAgICAgKGxvbmcpIGhpc3Rfc2NhbGUgKiBzaXplb2YgKFVOSVQpKTsKLSAgICAgIGlmICh0b3RhbF90aW1lID4gMC4wKQotCXsKLQkgIHByaW50ZiAoXygiIGZvciAlLjJmJSUgb2YgJS4yZiAlc1xuXG4iKSwKLQkJICAxMDAuMCAvIHRvdGFsX3RpbWUsIHRvdGFsX3RpbWUgLyBoeiwgaGlzdF9kaW1lbnNpb24pOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuRWFjaCBzYW1wbGUgY291bnRzIGFzICVnICVzLlxuIiksIDEuMCAvIGh6LCBoaXN0X2RpbWVuc2lvbik7Ci0gICAgfQotCi0gIGlmICh0b3RhbF90aW1lIDw9IDAuMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiBubyB0aW1lIGFjY3VtdWxhdGVkXG5cbiIpKTsKLSAgICAgIC8qIHRoaXMgZG9lc24ndCBodXJ0IHNpbmNlIGFsbCB0aGUgbnVtZXJhdG9ycyB3aWxsIGJlIHplcm86ICovCi0gICAgICB0b3RhbF90aW1lID0gMS4wOwotICAgIH0KLQotICBwcmludGYgKCIlNS41cyAlMTAuMTBzICU4LjhzICU4LjhzICU4LjhzICU4LjhzICAlLTguOHNcbiIsCi0JICAiJSAgIiwgXygiY3VtdWxhdGl2ZSIpLCBfKCJzZWxmICAiKSwgIiIsIF8oInNlbGYgICIpLCBfKCJ0b3RhbCAiKSwgIiIpOwotICBwcmludGYgKCIlNS41cyAlOS45cyAgJTguOHMgJTguOHMgJTguOHMgJTguOHMgICUtOC44c1xuIiwKLQkgIF8oInRpbWUiKSwgaGlzdF9kaW1lbnNpb24sIGhpc3RfZGltZW5zaW9uLCBfKCJjYWxscyIpLCB1bml0LCB1bml0LAotCSAgXygibmFtZSIpKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X2xpbmUsIChzeW0sIHNjYWxlKSwgU3ltICogc3ltIEFORCBkb3VibGUgc2NhbGUpCi17Ci0gIGlmIChpZ25vcmVfemVyb3MgJiYgc3ltLT5uY2FsbHMgPT0gMCAmJiBzeW0tPmhpc3QudGltZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYWNjdW1fdGltZSArPSBzeW0tPmhpc3QudGltZTsKLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgcHJpbnRmICgiJTUuMWYgJTEwLjJmICU4LjJmIiwKLQkgICAgICB0b3RhbF90aW1lID4gMC4wID8gMTAwICogc3ltLT5oaXN0LnRpbWUgLyB0b3RhbF90aW1lIDogMC4wLAotCSAgICAgIGFjY3VtX3RpbWUgLyBoeiwgc3ltLT5oaXN0LnRpbWUgLyBoeik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiJTYuMmYgJTkuMmYgJTguMmYiLAotCSAgICAgIHRvdGFsX3RpbWUgPiAwLjAgPyAxMDAgKiBzeW0tPmhpc3QudGltZSAvIHRvdGFsX3RpbWUgOiAwLjAsCi0JICAgICAgYWNjdW1fdGltZSAvIGh6LCBzeW0tPmhpc3QudGltZSAvIGh6KTsKLSAgICB9Ci0gIGlmIChzeW0tPm5jYWxscyAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlOGx1ICU4LjJmICU4LjJmICAiLAotCSAgICAgIHN5bS0+bmNhbGxzLCBzY2FsZSAqIHN5bS0+aGlzdC50aW1lIC8gaHogLyBzeW0tPm5jYWxscywKLQkgIHNjYWxlICogKHN5bS0+aGlzdC50aW1lICsgc3ltLT5jZy5jaGlsZF90aW1lKSAvIGh6IC8gc3ltLT5uY2FsbHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlOC44cyAlOC44cyAlOC44cyAgIiwgIiIsICIiLCAiIik7Ci0gICAgfQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludF9uYW1lIChzeW0pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50X25hbWVfb25seSAoc3ltKTsKLSAgICB9Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgTFAgYW5kIFJQLiAgVGhlIHByaW1hcnkgY29tcGFyaXNvbiBrZXkgaXMgZXhlY3V0aW9uIHRpbWUsCi0gKiB0aGUgc2Vjb25kYXJ5IGlzIG51bWJlciBvZiBpbnZvY2F0aW9uLCBhbmQgdGhlIHRlcnRpYXJ5IGlzIHRoZQotICogbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGUgZnVuY3Rpb24gbmFtZXMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfdGltZSwgKGxwLCBycCksIGNvbnN0IFBUUiBscCBBTkQgY29uc3QgUFRSIHJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0gIGRvdWJsZSB0aW1lX2RpZmY7Ci0KLSAgdGltZV9kaWZmID0gcmlnaHQtPmhpc3QudGltZSAtIGxlZnQtPmhpc3QudGltZTsKLSAgaWYgKHRpbWVfZGlmZiA+IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmICh0aW1lX2RpZmYgPCAwLjApCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAocmlnaHQtPm5jYWxscyA+IGxlZnQtPm5jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChyaWdodC0+bmNhbGxzIDwgbGVmdC0+bmNhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0cmNtcCAobGVmdC0+bmFtZSwgcmlnaHQtPm5hbWUpOwotfQotCi0KLS8qCi0gKiBQcmludCB0aGUgZmxhdCBoaXN0b2dyYW0gcHJvZmlsZS4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAoaGlzdF9wcmludCkKLXsKLSAgU3ltICoqdGltZV9zb3J0ZWRfc3ltcywgKnRvcF9kb2csICpzeW07Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgaW50IGxvZ19zY2FsZTsKLSAgZG91YmxlIHRvcF90aW1lLCB0aW1lOwotICBiZmRfdm1hIGFkZHI7Ci0KLSAgaWYgKGZpcnN0X291dHB1dCkKLSAgICB7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJcZlxuIik7Ci0gICAgfQotCi0gIGFjY3VtX3RpbWUgPSAwLjA7Ci0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGlmIChwcmludF9kZXNjcmlwdGlvbnMpCi0JewotCSAgcHJpbnRmIChfKCJcblxuXG5mbGF0IHByb2ZpbGU6XG4iKSk7Ci0JICBmbGF0X2JsdXJiIChzdGRvdXQpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIkZsYXQgcHJvZmlsZTpcbiIpKTsKLSAgICB9Ci0gIC8qCi0gICAqIFNvcnQgdGhlIHN5bWJvbCB0YWJsZSBieSB0aW1lIChjYWxsLWNvdW50IGFuZCBuYW1lIGFzIHNlY29uZGFyeQotICAgKiBhbmQgdGVydGlhcnkga2V5cyk6Ci0gICAqLwotICB0aW1lX3NvcnRlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICB7Ci0gICAgICB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XSA9ICZzeW10YWIuYmFzZVtpbmRleF07Ci0gICAgfQotICBxc29ydCAodGltZV9zb3J0ZWRfc3ltcywgc3ltdGFiLmxlbiwgc2l6ZW9mIChTeW0gKiksIGNtcF90aW1lKTsKLQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBsb2dfc2NhbGUgPSA1OwkJLyogbWlsbGktc2Vjb25kcyBpcyBCU0QtZGVmYXVsdCAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBTZWFyY2ggZm9yIHN5bWJvbCB3aXRoIGhpZ2hlc3QgcGVyLWNhbGwgZXhlY3V0aW9uIHRpbWUgYW5kCi0gICAgICAgKiBzY2FsZSBhY2NvcmRpbmdseToKLSAgICAgICAqLwotICAgICAgbG9nX3NjYWxlID0gMDsKLSAgICAgIHRvcF9kb2cgPSAwOwotICAgICAgdG9wX3RpbWUgPSAwLjA7Ci0gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotCXsKLQkgIHN5bSA9IHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdOwotCSAgaWYgKHN5bS0+bmNhbGxzICE9IDApCi0JICAgIHsKLQkgICAgICB0aW1lID0gKHN5bS0+aGlzdC50aW1lICsgc3ltLT5jZy5jaGlsZF90aW1lKSAvIHN5bS0+bmNhbGxzOwotCSAgICAgIGlmICh0aW1lID4gdG9wX3RpbWUpCi0JCXsKLQkJICB0b3BfZG9nID0gc3ltOwotCQkgIHRvcF90aW1lID0gdGltZTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKHRvcF9kb2cgJiYgdG9wX2RvZy0+bmNhbGxzICE9IDAgJiYgdG9wX3RpbWUgPiAwLjApCi0JewotCSAgdG9wX3RpbWUgLz0gaHo7Ci0JICB3aGlsZSAoU0l0YWJbbG9nX3NjYWxlXS5zY2FsZSAqIHRvcF90aW1lIDwgMTAwMC4wCi0JCSAmJiAoKHNpemVfdCkgbG9nX3NjYWxlCi0JCSAgICAgPCBzaXplb2YgKFNJdGFiKSAvIHNpemVvZiAoU0l0YWJbMF0pIC0gMSkpCi0JICAgIHsKLQkgICAgICArK2xvZ19zY2FsZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogRm9yIG5vdywgdGhlIGRpbWVuc2lvbiBpcyBhbHdheXMgc2Vjb25kcy4gIEluIHRoZSBmdXR1cmUsIHdlCi0gICAqIG1heSBhbHNvIHdhbnQgdG8gc3VwcG9ydCBvdGhlciAocHNldWRvLSlkaW1lbnNpb25zIChzdWNoIGFzCi0gICAqIEktY2FjaGUgbWlzc2VzIGV0Yy4pLgotICAgKi8KLSAgcHJpbnRfaGVhZGVyIChTSXRhYltsb2dfc2NhbGVdLnByZWZpeCk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0gICAgewotICAgICAgYWRkciA9IHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdLT5hZGRyOwotICAgICAgLyoKLSAgICAgICAqIFByaW50IHN5bWJvbCBpZiBpdHMgaW4gSU5DTF9GTEFUIHRhYmxlIG9yIHRoYXQgdGFibGUKLSAgICAgICAqIGlzIGVtcHR5IGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBpbiBFWENMX0ZMQVQuCi0gICAgICAgKi8KLSAgICAgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0ZMQVRdLCBhZGRyKQotCSAgfHwgKHN5bXNbSU5DTF9GTEFUXS5sZW4gPT0gMAotCSAgICAgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0ZMQVRdLCBhZGRyKSkpCi0JewotCSAgcHJpbnRfbGluZSAodGltZV9zb3J0ZWRfc3ltc1tpbmRleF0sIFNJdGFiW2xvZ19zY2FsZV0uc2NhbGUpOwotCX0KLSAgICB9Ci0gIGZyZWUgKHRpbWVfc29ydGVkX3N5bXMpOwotCi0gIGlmIChwcmludF9kZXNjcmlwdGlvbnMgJiYgIWJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgZmxhdF9ibHVyYiAoc3Rkb3V0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9oaXN0LmggYi9ncHJvZi9oaXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNjJlZjcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2lmbmRlZiBoaXN0X2gKLSNkZWZpbmUgaGlzdF9oCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotZXh0ZXJuIGJmZF92bWEgc19sb3dwYzsJCS8qIGxvd3BjIGZyb20gdGhlIHByb2ZpbGUgZmlsZSAqLwotZXh0ZXJuIGJmZF92bWEgc19oaWdocGM7CS8qIGhpZ2hwYyBmcm9tIHRoZSBwcm9maWxlIGZpbGUgKi8KLWV4dGVybiBiZmRfdm1hIGxvd3BjLCBoaWdocGM7CS8qIHJhbmdlIHByb2ZpbGVkLCBpbiBVTklUJ3MgKi8KLWV4dGVybiBpbnQgaGlzdF9udW1fYmluczsJLyogbnVtYmVyIG9mIGhpc3RvZ3JhbSBiaW5zICovCi1leHRlcm4gaW50ICpoaXN0X3NhbXBsZTsJLyogY29kZSBoaXN0b2dyYW0gKi8KLS8qCi0gKiBTY2FsZSBmYWN0b3IgY29udmVydGluZyBzYW1wbGVzIHRvIHBjIHZhbHVlczogZWFjaCBzYW1wbGUgY292ZXJzCi0gKiBISVNUX1NDQUxFIGJ5dGVzOgotICovCi1leHRlcm4gZG91YmxlIGhpc3Rfc2NhbGU7Ci0KLQotZXh0ZXJuIHZvaWQgaGlzdF9yZWFkX3JlYyBQQVJBTVMgKChGSUxFICogaWZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgaGlzdF93cml0ZV9oaXN0IFBBUkFNUyAoKEZJTEUgKiBvZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBoaXN0X2Fzc2lnbl9zYW1wbGVzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGhpc3RfcHJpbnQgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogaGlzdF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9pMzg2LmMgYi9ncHJvZi9pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYmYyZGMuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLQotaW50Ci1ERUZVTiAoaTM4Nl9pc2NhbGwsIChpcCksIHVuc2lnbmVkIGNoYXIgKmlwKQotewotICBpZiAoKmlwID09IDB4ZTgpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0KLXZvaWQKLWkzODZfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICB1bnNpZ25lZCBjaGFyICppbnN0cnVjdHA7Ci0gIFN5bSAqY2hpbGQ7Ci0gIGJmZF92bWEgZGVzdHBjLCBkZWx0YTsKLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCAodW5zaWduZWQgbG9uZykgcF9sb3dwYywKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBfaGlnaHBjKSk7Ci0KLSAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIChwX2xvd3BjICsgZGVsdGEpOwotICAgICAgIGluc3RydWN0cCA8ICh1bnNpZ25lZCBjaGFyICopIChwX2hpZ2hwYyArIGRlbHRhKTsKLSAgICAgICBpbnN0cnVjdHAgKyspCi0gICAgewotICAgICAgaWYgKGkzODZfaXNjYWxsIChpbnN0cnVjdHApKQotCXsKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGwiLAotCQkgICAgICAgaW5zdHJ1Y3RwIC0gKHVuc2lnbmVkIGNoYXIgKikgZGVsdGEpKTsKLQkgIC8qCi0JICAgKiAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCi0JICAgKiAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCi0JICAgKiAgICBhIGZ1bmN0aW9uLgotCSAgICovCi0KLQkgIGRlc3RwYyA9ICgoYmZkX3ZtYSkgYmZkX2dldF8zMiAoY29yZV9iZmQsIGluc3RydWN0cCArIDEpCi0JCSAgICArIChiZmRfdm1hKSBpbnN0cnVjdHAgLSAoYmZkX3ZtYSkgZGVsdGEgKyA1KTsKLQkgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JICAgIHsKLQkgICAgICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5hZGRyID09IGRlc3RwYykKLQkJewotCQkgIC8qCi0JCSAgICogICAgICBhIGhpdAotCQkgICAqLwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiXHRkZXN0cGMgMHglbHggKCVzKVxuIiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgZGVzdHBjLCBjaGlsZC0+bmFtZSkpOwotCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkJICBpbnN0cnVjdHAgKz0gNDsJLyogY2FsbCBpcyBhIDUgYnl0ZSBpbnN0cnVjdGlvbiAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiAgZWxzZToKLQkgICAqICAgIGl0IGxvb2tlZCBsaWtlIGEgY2FsbGYsIGJ1dCBpdDoKLQkgICAqICAgICAgYSkgd2Fzbid0IGFjdHVhbGx5IGEgY2FsbGYsIG9yCi0JICAgKiAgICAgIGIpIGRpZG4ndCBwb2ludCB0byBhIGtub3duIGZ1bmN0aW9uIGluIHRoZSBzeW10YWIsIG9yCi0JICAgKiAgICAgIGMpIHNvbWV0aGluZyBmdW5ueSBpcyBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9wby9NYWtlLWluIGIvZ3Byb2YvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dwcm9mL3BvL1BPVEZJTEVTLmluIGIvZ3Byb2YvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTgxMTYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1hbHBoYS5jCi1iYXNpY19ibG9ja3MuYwotYmFzaWNfYmxvY2tzLmgKLWNhbGxfZ3JhcGguYwotY2FsbF9ncmFwaC5oCi1jZ19hcmNzLmMKLWNnX2FyY3MuaAotY2dfZGZuLmMKLWNnX2Rmbi5oCi1jZ19wcmludC5jCi1jZ19wcmludC5oCi1jb3JlZmlsZS5jCi1jb3JlZmlsZS5oCi1nbW9uLmgKLWdtb25faW8uYwotZ21vbl9pby5oCi1nbW9uX291dC5oCi1ncHJvZi5jCi1ncHJvZi5oCi1oZXJ0ei5jCi1oZXJ0ei5oCi1oaXN0LmMKLWhpc3QuaAotaTM4Ni5jCi1zZWFyY2hfbGlzdC5jCi1zZWFyY2hfbGlzdC5oCi1zb3VyY2UuYwotc291cmNlLmgKLXNwYXJjLmMKLXN5bV9pZHMuYwotc3ltX2lkcy5oCi1zeW10YWIuYwotc3ltdGFiLmgKLXRhaG9lLmMKLXV0aWxzLmMKLXV0aWxzLmgKLXZheC5jCmRpZmYgLS1naXQgYS9ncHJvZi9wby9ncHJvZi5wb3QgYi9ncHJvZi9wby9ncHJvZi5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxY2YwZWUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vZ3Byb2YucG90CisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA3LTAxIDAxOjM2LTA0MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhbHBoYS5jOjg5Ci1tc2dpZCAiPGluZGlyZWN0IGNoaWxkPiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAweCVseDoganNyJXMgPGluZGlyZWN0X2NoaWxkPlxuIgotbXNnc3RyICIiCi0KLSM6IGFscGhhLmM6MTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltmaW5kX2NhbGxdIDB4JWx4OiBic3IiCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MTM0IGNhbGxfZ3JhcGguYzo3MCBoaXN0LmM6MTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjIxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlYyBjb3VudHMgKHVzZSAtbCBvciAtLWxpbmUpXG4iCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IFRoaXMgb25seSB3b3JrcyBpZiBiZmRfdm1hIGlzIHVuc2lnbmVkIGxvbmcuCi0jOiBiYXNpY19ibG9ja3MuYzozMjQgYmFzaWNfYmxvY2tzLmM6MzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MzI1IGJhc2ljX2Jsb2Nrcy5jOjMzNAotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo1OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlRvcCAlZCBMaW5lczpcbiIKLSJcbiIKLSIgICAgIExpbmUgICAgICBDb3VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYyMAotbXNnaWQgIiIKLSJcbiIKLSJFeGVjdXRpb24gU3VtbWFyeTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTlsZCAgIEV4ZWN1dGFibGUgbGluZXMgaW4gdGhpcyBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU5bGQgICBMaW5lcyBleGVjdXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlOS4yZiAgIFBlcmNlbnQgb2YgdGhlIGZpbGUgZXhlY3V0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiU5bHUgICBUb3RhbCBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU5LjJmICAgQXZlcmFnZSBleGVjdXRpb25zIHBlciBsaW5lXG4iCi1tc2dzdHIgIiIKLQotIzogY2FsbF9ncmFwaC5jOjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltjZ190YWxseV0gYXJjIGZyb20gJXMgdG8gJXMgdHJhdmVyc2VkICVsdSB0aW1lc1xuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MzkKLW1zZ2lkICIiCi0iXHRcdCAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cylcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjQzCi1tc2dpZCAiIgotIlx0XHRcdENhbGwgZ3JhcGhcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjQ2IGhpc3QuYzozODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotImdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzICVsZCBieXRlKHMpIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NTAKLW1zZ2lkICIiCi0iIGZvciAlLjJmJSUgb2YgJS4yZiBzZWNvbmRzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo1NQotbXNnaWQgIiIKLSIgbm8gdGltZSBwcm9wYWdhdGVkXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NCBjZ19wcmludC5jOjY3IGNnX3ByaW50LmM6NjkKLW1zZ2lkICJjYWxsZWQiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NCBjZ19wcmludC5jOjY5Ci1tc2dpZCAidG90YWwiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NAotbXNnaWQgInBhcmVudHMiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NiBjZ19wcmludC5jOjY3Ci1tc2dpZCAiaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NgotbXNnaWQgIiV0aW1lIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYgY2dfcHJpbnQuYzo2NwotbXNnaWQgInNlbGYiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NgotbXNnaWQgImRlc2NlbmRlbnRzIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjcgaGlzdC5jOjQwOQotbXNnaWQgIm5hbWUiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2OQotbXNnaWQgImNoaWxkcmVuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NzQKLW1zZ2lkICJpbmRleCAlJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiA8Y3ljbGUgJWQgYXMgYSB3aG9sZT4gWyVkXVxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjM1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NTg3Ci1tc2dpZCAiIgotIkluZGV4IGJ5IGZ1bmN0aW9uIG5hbWVcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY0NCBjZ19wcmludC5jOjY1MwotIywgYy1mb3JtYXQKLW1zZ2lkICI8Y3ljbGUgJWQ+IgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvdWxkIG5vdCBvcGVuICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6NTMgY29yZWZpbGUuYzo4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgZmlsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IG5vdCBpbiBhLm91dCBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgZmluZCAudGV4dCBzZWN0aW9uIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJhbiBvdXQgcm9vbSBmb3IgJWx1IGJ5dGVzIG9mIHRleHQgc3BhY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgZG8gLWNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjI0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogLWMgbm90IHN1cHBvcnRlZCBvbiBhcmNoaXRlY3R1cmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjQzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSBgJXMnIGhhcyBubyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzo3NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNvbWVib2R5IG1pc2NvdW50ZWQ6IGx0YWIubGVuPSVkIGluc3RlYWQgb2YgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMzIGdtb25faW8uYzo1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX3ZtYSBoYXMgdW5leHBlY3RlZCBzaXplIG9mICVsZCBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzo4NyBnbW9uX2lvLmM6MTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIHRvbyBzaG9ydCB0byBiZSBhIGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzo5NyBnbW9uX2lvLmM6MjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIHVuc3VwcG9ydGVkIHZlcnNpb24gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogZm91bmQgYmFkIHRhZyAlZCAoZmlsZSBjb3JydXB0ZWQ/KVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHByb2ZpbGluZyByYXRlIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgRU9GIGFmdGVyIHJlYWRpbmcgJWQvJWQgYmluc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMDYKLW1zZ2lkICJ0aW1lIGlzIGluIHRpY2tzLCBub3Qgc2Vjb25kc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMTIgZ21vbl9pby5jOjQ1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoIGZpbGUgZm9ybWF0ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJGaWxlIGAlcycgKHZlcnNpb24gJWQpIGNvbnRhaW5zOlxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHQlZCBoaXN0b2dyYW0gcmVjb3JkJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlx0JWQgY2FsbC1ncmFwaCByZWNvcmQlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHQlZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmQlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NTkKLW1zZ2lkICIiCi0iQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIgotIiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1bYWJjRGhpbExzVHZ3eHl6XV0gWy1bQUNlRWZGSm5OT3BQcVFaXVtuYW1lXV0gWy1JIGRpcnNdXG4iCi0iXHRbLWRbbnVtXV0gWy1rIGZyb20vdG9dIFstbSBtaW4tY291bnRdIFstdCB0YWJsZS1sZW5ndGhdXG4iCi0iXHRbLS1bbm8tXWFubm90YXRlZC1zb3VyY2VbPW5hbWVdXSBbLS1bbm8tXWV4ZWMtY291bnRzWz1uYW1lXV1cbiIKLSJcdFstLVtuby1dZmxhdC1wcm9maWxlWz1uYW1lXV0gWy0tW25vLV1ncmFwaFs9bmFtZV1dXG4iCi0iXHRbLS1bbm8tXXRpbWU9bmFtZV0gWy0tYWxsLWxpbmVzXSBbLS1icmllZl0gWy0tZGVidWdbPWxldmVsXV1cbiIKLSJcdFstLWZ1bmN0aW9uLW9yZGVyaW5nXSBbLS1maWxlLW9yZGVyaW5nXVxuIgotIlx0Wy0tZGlyZWN0b3J5LXBhdGg9ZGlyc10gWy0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zXVxuIgotIlx0Wy0tZmlsZS1mb3JtYXQ9bmFtZV0gWy0tZmlsZS1pbmZvXSBbLS1oZWxwXSBbLS1saW5lXSBbLS1taW4tY291bnQ9bl1cbiIKLSJcdFstLW5vLXN0YXRpY10gWy0tcHJpbnQtcGF0aF0gWy0tc2VwYXJhdGUtZmlsZXNdXG4iCi0iXHRbLS1zdGF0aWMtY2FsbC1ncmFwaF0gWy0tc3VtXSBbLS10YWJsZS1sZW5ndGg9bGVuXSBbLS10cmFkaXRpb25hbF1cbiIKLSJcdFstLXZlcnNpb25dIFstLXdpZHRoPW5dIFstLWlnbm9yZS1ub24tZnVuY3Rpb25zXVxuIgotIlx0Wy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXVxuIgotIlx0W2ltYWdlLWZpbGVdIFtwcm9maWxlLWZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzoxNjAKLW1zZ2lkICJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZGVidWdnaW5nIG5vdCBzdXBwb3J0ZWQ7IC1kIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biBmaWxlIGZvcm1hdCAlc1xuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KLSM6IGdwcm9mLmM6MzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBncHJvZiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6Mzk0Ci1tc2dpZCAiIgotIkJhc2VkIG9uIEJTRCBncHJvZiwgY29weXJpZ2h0IDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6Mzk1Ci1tc2dpZCAiIgotIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogT25seSBvbmUgb2YgLS1mdW5jdGlvbi1vcmRlcmluZyBhbmQgLS1maWxlLW9yZGVyaW5nIG1heSBiZSBzcGVjaWZpZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo1NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNvcnJ5LCBmaWxlIGZvcm1hdCBgcHJvZicgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZ21vbi5vdXQgZmlsZSBpcyBtaXNzaW5nIGhpc3RvZ3JhbVxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgY2FsbC1ncmFwaCBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYCVzJyBpcyBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZCBvZiAlZCBzYW1wbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjM4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlYyVjL2NhbGwiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjM4OQotbXNnaWQgIiIKLSIgZm9yICUuMmYlJSBvZiAlLjJmICVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjM5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRWFjaCBzYW1wbGUgY291bnRzIGFzICVnICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDAKLW1zZ2lkICIiCi0iIG5vIHRpbWUgYWNjdW11bGF0ZWRcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA2Ci1tc2dpZCAiY3VtdWxhdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA2Ci1tc2dpZCAic2VsZiAgIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDYKLW1zZ2lkICJ0b3RhbCAiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwOAotbXNnaWQgInRpbWUiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwOAotbXNnaWQgImNhbGxzIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo1MTcKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iXG4iCi0iZmxhdCBwcm9maWxlOlxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo1MjMKLW1zZ2lkICJGbGF0IHByb2ZpbGU6XG4iCi1tc2dzdHIgIiIKLQotIzogc291cmNlLmM6MTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb3VsZCBub3QgbG9jYXRlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb3VyY2UuYzoyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiKioqIEZpbGUgJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogdXRpbHMuYzo5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgPGN5Y2xlICVkPiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc2VhcmNoX2xpc3QuYyBiL2dwcm9mL3NlYXJjaF9saXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzVkYmYuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc2VhcmNoX2xpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInNlYXJjaF9saXN0LmgiCi0KLQotdm9pZAotREVGVU4gKHNlYXJjaF9saXN0X2FwcGVuZCwgKGxpc3QsIHBhdGhzKSwKLSAgICAgICBTZWFyY2hfTGlzdCAqIGxpc3QgQU5EIGNvbnN0IGNoYXIgKnBhdGhzKQotewotICBTZWFyY2hfTGlzdF9FbGVtICpuZXdfZWw7Ci0gIGNvbnN0IGNoYXIgKmJlZywgKmNvbG9uOwotICBpbnQgbGVuOwotCi0gIGNvbG9uID0gcGF0aHMgLSAxOwotICBkbwotICAgIHsKLSAgICAgIGJlZyA9IGNvbG9uICsgMTsKLSAgICAgIGNvbG9uID0gc3RyY2hyIChiZWcsICc6Jyk7Ci0gICAgICBpZiAoY29sb24pCi0JewotCSAgbGVuID0gY29sb24gLSBiZWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxlbiA9IHN0cmxlbiAoYmVnKTsKLQl9Ci0gICAgICBuZXdfZWwgPSAoU2VhcmNoX0xpc3RfRWxlbSAqKSB4bWFsbG9jIChzaXplb2YgKCpuZXdfZWwpICsgbGVuKTsKLSAgICAgIG1lbWNweSAobmV3X2VsLT5wYXRoLCBiZWcsIGxlbik7Ci0gICAgICBuZXdfZWwtPnBhdGhbbGVuXSA9ICdcMCc7Ci0KLSAgICAgIC8qIGFwcGVuZCBuZXcgcGF0aCBhdCBlbmQgb2YgbGlzdDogKi8KLSAgICAgIG5ld19lbC0+bmV4dCA9IDA7Ci0gICAgICBpZiAobGlzdC0+dGFpbCkKLQl7Ci0JICBsaXN0LT50YWlsLT5uZXh0ID0gbmV3X2VsOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsaXN0LT5oZWFkID0gbmV3X2VsOwotCX0KLSAgICAgIGxpc3QtPnRhaWwgPSBuZXdfZWw7Ci0gICAgfQotICB3aGlsZSAoY29sb24pOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc2VhcmNoX2xpc3QuaCBiL2dwcm9mL3NlYXJjaF9saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGZlMzUuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc2VhcmNoX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgc2VhcmNoX2xpc3RfaAotI2RlZmluZSBzZWFyY2hfbGlzdF9oCi0KLXR5cGVkZWYgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0KLSAgewotICAgIHN0cnVjdCBzZWFyY2hfbGlzdF9lbGVtICpuZXh0OwotICAgIGNoYXIgcGF0aFsxXTsKLSAgfQotU2VhcmNoX0xpc3RfRWxlbTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBzZWFyY2hfbGlzdF9lbGVtICpoZWFkOwotICAgIHN0cnVjdCBzZWFyY2hfbGlzdF9lbGVtICp0YWlsOwotICB9Ci1TZWFyY2hfTGlzdDsKLQotZXh0ZXJuIHZvaWQgc2VhcmNoX2xpc3RfYXBwZW5kIFBBUkFNUyAoKFNlYXJjaF9MaXN0ICogbGlzdCwgY29uc3QgY2hhciAqcGF0aHMpKTsKLQotI2VuZGlmIC8qIHNlYXJjaF9saXN0X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3NvdXJjZS5jIGIvZ3Byb2Yvc291cmNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDFhMDQuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc291cmNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIEtlZXBzIHRyYWNrIG9mIHNvdXJjZSBmaWxlcy4KLSAqLwotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLQotI2RlZmluZSBFWFRfQU5OTyAiLWFubiIJCS8qIHBvc3RmaXggb2YgYW5ub3RhdGVkIGZpbGVzICovCi0KLS8qCi0gKiBEZWZhdWx0IG9wdGlvbiB2YWx1ZXM6Ci0gKi8KLWJvb2wgY3JlYXRlX2Fubm90YXRpb25fZmlsZXMgPSBGQUxTRTsKLQotU2VhcmNoX0xpc3Qgc3JjX3NlYXJjaF9saXN0ID0KLXswLCAwfTsKLVNvdXJjZV9GaWxlICpmaXJzdF9zcmNfZmlsZSA9IDA7Ci0KLQotU291cmNlX0ZpbGUgKgotREVGVU4gKHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoLCAocGF0aCksIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gIFNvdXJjZV9GaWxlICpzZjsKLQotICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHBhdGgsIHNmLT5uYW1lKSA9PSAwKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmICghc2YpCi0gICAgewotICAgICAgLyogY3JlYXRlIGEgbmV3IHNvdXJjZSBmaWxlIGRlc2NyaXB0b3I6ICovCi0KLSAgICAgIHNmID0gKFNvdXJjZV9GaWxlICopIHhtYWxsb2MgKHNpemVvZiAoKnNmKSk7Ci0gICAgICBtZW1zZXQgKHNmLCAwLCBzaXplb2YgKCpzZikpOwotICAgICAgc2YtPm5hbWUgPSB4c3RyZHVwIChwYXRoKTsKLSAgICAgIHNmLT5uZXh0ID0gZmlyc3Rfc3JjX2ZpbGU7Ci0gICAgICBmaXJzdF9zcmNfZmlsZSA9IHNmOwotICAgIH0KLSAgcmV0dXJuIHNmOwotfQotCi0KLVNvdXJjZV9GaWxlICoKLURFRlVOIChzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSwgKGZpbGVuYW1lKSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGNvbnN0IGNoYXIgKmZuYW1lOwotICBTb3VyY2VfRmlsZSAqc2Y7Ci0gIC8qCi0gICAqIFRoZSB1c2VyIGNhbm5vdCBrbm93IGV4YWN0bHkgaG93IGEgZmlsZW5hbWUgd2lsbCBiZSBzdG9yZWQgaW4KLSAgICogdGhlIGRlYnVnZ2luZyBpbmZvIChlLmcuLCAuLi9pbmNsdWRlL2Zvby5oCi0gICAqIHZzLiAvdXNyL2luY2x1ZGUvZm9vLmgpLiAgU28gd2Ugc2ltcGx5IGNvbXBhcmUgdGhlIGZpbGVuYW1lCi0gICAqIGNvbXBvbmVudCBvZiBhIHBhdGggb25seToKLSAgICovCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgZm5hbWUgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKLSAgICAgIGlmIChmbmFtZSkKLQl7Ci0JICArK2ZuYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmbmFtZSA9IHNmLT5uYW1lOwotCX0KLSAgICAgIGlmIChzdHJjbXAgKGZpbGVuYW1lLCBmbmFtZSkgPT0gMCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gc2Y7Ci19Ci0KLQotRklMRSAqCi1ERUZVTiAoYW5ub3RhdGVfc291cmNlLCAoc2YsIG1heF93aWR0aCwgYW5ub3RlLCBhcmcpLAotICAgICAgIFNvdXJjZV9GaWxlICogc2YgQU5EIGludCBtYXhfd2lkdGgKLSAgICAgICBBTkQgdm9pZCAoKmFubm90ZSkgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgdywgaW50IGwsIHZvaWQgKmFyZykpCi0gICAgICAgQU5EIHZvaWQgKmFyZykKLXsKLSAgc3RhdGljIGJvb2wgZmlyc3RfZmlsZSA9IFRSVUU7Ci0gIGludCBpLCBsaW5lX251bSwgbnJlYWQ7Ci0gIGJvb2wgbmV3X2xpbmU7Ci0gIGNoYXIgYnVmWzgxOTJdOwotICBjaGFyIGZuYW1lW1BBVEhfTUFYXTsKLSAgY2hhciAqYW5ub3RhdGlvbiwgKm5hbWVfb25seTsKLSAgRklMRSAqaWZwLCAqb2ZwOwotICBTZWFyY2hfTGlzdF9FbGVtICpzbGUgPSBzcmNfc2VhcmNoX2xpc3QuaGVhZDsKLQotICAvKgotICAgKiBPcGVuIGlucHV0IGZpbGUuICBJZiBvcGVuIGZhaWxzLCB3YWxrIGFsb25nIHNlYXJjaC1saXN0IHVudGlsCi0gICAqIG9wZW4gc3VjY2VlZHMgb3IgcmVhY2hpbmcgZW5kIG9mIGxpc3Q6Ci0gICAqLwotICBzdHJjcHkgKGZuYW1lLCBzZi0+bmFtZSk7Ci0gIGlmIChzZi0+bmFtZVswXSA9PSAnLycpCi0gICAgewotICAgICAgc2xlID0gMDsJCQkvKiBkb24ndCB1c2Ugc2VhcmNoIGxpc3QgZm9yIGFic29sdXRlIHBhdGhzICovCi0gICAgfQotICBuYW1lX29ubHkgPSAwOwotICB3aGlsZSAoVFJVRSkKLSAgICB7Ci0gICAgICBEQkcgKFNSQ0RFQlVHLCBwcmludGYgKCJbYW5ub3RhdGVfc291cmNlXTogbG9va2luZyBmb3IgJXMsIHRyeWluZyAlc1xuIiwKLQkJCSAgICAgc2YtPm5hbWUsIGZuYW1lKSk7Ci0gICAgICBpZnAgPSBmb3BlbiAoZm5hbWUsIEZPUEVOX1JCKTsKLSAgICAgIGlmIChpZnApCi0JewotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKCFzbGUgJiYgIW5hbWVfb25seSkKLQl7Ci0JICBuYW1lX29ubHkgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKLQkgIGlmIChuYW1lX29ubHkpCi0JICAgIHsKLQkgICAgICAvKiB0cnkgc2VhcmNoLWxpc3QgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2l0aCBuYW1lIG9ubHk6ICovCi0JICAgICAgKytuYW1lX29ubHk7Ci0JICAgICAgc2xlID0gc3JjX3NlYXJjaF9saXN0LmhlYWQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc2xlKQotCXsKLQkgIHN0cmNweSAoZm5hbWUsIHNsZS0+cGF0aCk7Ci0JICBzdHJjYXQgKGZuYW1lLCAiLyIpOwotCSAgaWYgKG5hbWVfb25seSkKLQkgICAgewotCSAgICAgIHN0cmNhdCAoZm5hbWUsIG5hbWVfb25seSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cmNhdCAoZm5hbWUsIHNmLT5uYW1lKTsKLQkgICAgfQotCSAgc2xlID0gc2xlLT5uZXh0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZXJybm8gPT0gRU5PRU5UKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY291bGQgbm90IGxvY2F0ZSBgJXMnXG4iKSwKLQkJICAgICAgIHdob2FtaSwgc2YtPm5hbWUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKHNmLT5uYW1lKTsKLQkgICAgfQotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICBvZnAgPSBzdGRvdXQ7Ci0gIGlmIChjcmVhdGVfYW5ub3RhdGlvbl9maWxlcykKLSAgICB7Ci0gICAgICAvKiB0cnkgdG8gY3JlYXRlIGFubm90YXRlZCBzb3VyY2UgZmlsZTogKi8KLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCi0gICAgICAvKiBjcmVhdGUgYW5ub3RhdGlvbiBmaWxlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTogKi8KLSAgICAgIGZpbGVuYW1lID0gc3RycmNociAoc2YtPm5hbWUsICcvJyk7Ci0gICAgICBpZiAoZmlsZW5hbWUpCi0JewotCSAgKytmaWxlbmFtZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZmlsZW5hbWUgPSBzZi0+bmFtZTsKLQl9Ci0KLSAgICAgIHN0cmNweSAoZm5hbWUsIGZpbGVuYW1lKTsKLSAgICAgIHN0cmNhdCAoZm5hbWUsIEVYVF9BTk5PKTsKLSAgICAgIG9mcCA9IGZvcGVuIChmbmFtZSwgInciKTsKLSAgICAgIGlmICghb2ZwKQotCXsKLQkgIHBlcnJvciAoZm5hbWUpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBQcmludCBmaWxlIG5hbWVzIGlmIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBhbmQgdGhlcmUgYXJlCi0gICAqIG1vcmUgdGhhbiBvbmUgc291cmNlIGZpbGU6Ci0gICAqLwotICBpZiAob2ZwID09IHN0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoZmlyc3RfZmlsZSkKLQl7Ci0JICBmaXJzdF9maWxlID0gRkFMU0U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwdXRjICgnXG4nLCBvZnApOwotCX0KLSAgICAgIGlmIChmaXJzdF9vdXRwdXQpCi0JewotCSAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKG9mcCwgIlxmXG4iKTsKLQl9Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIioqKiBGaWxlICVzOlxuIiksIHNmLT5uYW1lKTsKLSAgICB9Ci0KLSAgYW5ub3RhdGlvbiA9IHhtYWxsb2MgKG1heF93aWR0aCArIDEpOwotICBsaW5lX251bSA9IDE7Ci0gIG5ld19saW5lID0gVFJVRTsKLSAgd2hpbGUgKChucmVhZCA9IGZyZWFkIChidWYsIDEsIHNpemVvZiAoYnVmKSwgaWZwKSkgPiAwKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBucmVhZDsgKytpKQotCXsKLQkgIGlmIChuZXdfbGluZSkKLQkgICAgewotCSAgICAgICgqYW5ub3RlKSAoYW5ub3RhdGlvbiwgbWF4X3dpZHRoLCBsaW5lX251bSwgYXJnKTsKLQkgICAgICBmcHV0cyAoYW5ub3RhdGlvbiwgb2ZwKTsKLQkgICAgICArK2xpbmVfbnVtOwotCSAgICAgIG5ld19saW5lID0gRkFMU0U7Ci0JICAgIH0KLQkgIG5ld19saW5lID0gKGJ1ZltpXSA9PSAnXG4nKTsKLQkgIGZwdXRjIChidWZbaV0sIG9mcCk7Ci0JfQotICAgIH0KLSAgZnJlZSAoYW5ub3RhdGlvbik7Ci0gIHJldHVybiBvZnA7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zb3VyY2UuaCBiL2dwcm9mL3NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNiYWQzLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotI2lmbmRlZiBzb3VyY2VfaAotI2RlZmluZSBzb3VyY2VfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInNlYXJjaF9saXN0LmgiCi0KLXR5cGVkZWYgc3RydWN0IHNvdXJjZV9maWxlCi0gIHsKLSAgICBzdHJ1Y3Qgc291cmNlX2ZpbGUgKm5leHQ7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIG5hbWUgb2Ygc291cmNlIGZpbGUgKi8KLSAgICB1bnNpZ25lZCBsb25nIG5jYWxsczsJLyogIyBvZiAiY2FsbHMiIHRvIHRoaXMgZmlsZSAqLwotICAgIGludCBudW1fbGluZXM7CQkvKiAjIG9mIGxpbmVzIGluIGZpbGUgKi8KLSAgICBpbnQgbmFsbG9jZWQ7CQkvKiBudW1iZXIgb2YgbGluZXMgYWxsb2NhdGVkICovCi0gICAgdm9pZCAqKmxpbmU7CQkvKiB1c2FnZS1kZXBlbmRlbnQgcGVyLWxpbmUgZGF0YSAqLwotICB9Ci1Tb3VyY2VfRmlsZTsKLQotLyoKLSAqIE9wdGlvbnM6Ci0gKi8KLWV4dGVybiBib29sIGNyZWF0ZV9hbm5vdGF0aW9uX2ZpbGVzOwkvKiBjcmVhdGUgYW5ub3RhdGVkIG91dHB1dCBmaWxlcz8gKi8KLQotLyoKLSAqIExpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBzb3VyY2UgZmlsZXM6Ci0gKi8KLWV4dGVybiBTZWFyY2hfTGlzdCBzcmNfc2VhcmNoX2xpc3Q7Ci0KLS8qCi0gKiBDaGFpbiBvZiBzb3VyY2UtZmlsZSBkZXNjcmlwdG9yczoKLSAqLwotZXh0ZXJuIFNvdXJjZV9GaWxlICpmaXJzdF9zcmNfZmlsZTsKLQotLyoKLSAqIFJldHVybnMgcG9pbnRlciB0byBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yIGZvciBQQVRIL0ZJTEVOQU1FLgotICovCi1leHRlcm4gU291cmNlX0ZpbGUgKnNvdXJjZV9maWxlX2xvb2t1cF9wYXRoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnBhdGgpKTsKLWV4dGVybiBTb3VyY2VfRmlsZSAqc291cmNlX2ZpbGVfbG9va3VwX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotLyoKLSAqIFJlYWQgc291cmNlIGZpbGUgU0Ygb3V0cHV0IGFubm90YXRlZCBzb3VyY2UuICBUaGUgYW5ub3RhdGlvbiBpcyBhdAotICogTUFYX1dJRFRIIGNoYXJhY3RlcnMgd2lkZSBhbmQgZm9yIGVhY2ggc291cmNlLWxpbmUgYW4gYW5ub3RhdGlvbiBpcwotICogb2J0YWluZWQgYnkgaW52b2tpbmcgZnVuY3Rpb24gQU5OT1RFLiAgQVJHIGlzIGFuIGFyZ3VtZW50IHBhc3NlZCB0bwotICogQU5OT1RFIHRoYXQgaXMgbGVmdCB1bmludGVycHJldGVkIGJ5IGFubm90YXRlX3NvdXJjZSgpLgotICoKLSAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgZmlsZSAod2hpY2ggbWF5YmUgc3Rkb3V0KSBzdWNoCi0gKiB0aGF0IHN1bW1hcnkgc3RhdGlzdGljcyBjYW4gYmUgcHJpbnRlZC4gIElmIHRoZSByZXR1cm5lZCBmaWxlCi0gKiBpcyBub3Qgc3Rkb3V0LCBpdCBzaG91bGQgYmUgY2xvc2VkIHdoZW4gZG9uZSB3aXRoIGl0LgotICovCi1leHRlcm4gRklMRSAqYW5ub3RhdGVfc291cmNlIFBBUkFNUyAoKFNvdXJjZV9GaWxlICogc2YsIGludCBtYXhfd2lkdGgsCi0JCQkJICAgICAgdm9pZCAoKmFubm90ZSkgKGNoYXIgKmIsIGludCB3LCBpbnQgbCwKLQkJCQkJCSAgICAgIHZvaWQgKmFyZyksCi0JCQkJICAgICAgdm9pZCAqYXJnKSk7Ci0KLSNlbmRpZiAvKiBzb3VyY2VfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc3BhcmMuYyBiL2dwcm9mL3NwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjU4MjcuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxsZicgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTAkoMHhjMDAwMDAwMCkKLQotdm9pZAotc3BhcmNfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICBiZmRfdm1hIGRlc3RfcGMsIGRlbHRhOwotICB1bnNpZ25lZCBpbnQgKmluc3RyOwotICBTeW0gKmNoaWxkOwotCi0gIGRlbHRhID0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZSAtIGNvcmVfdGV4dF9zZWN0LT52bWE7Ci0KLSAgaWYgKGNvcmVfdGV4dF9zcGFjZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRfY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAotCQkJICBwYXJlbnQtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwX2xvd3BjLAotCQkJICAodW5zaWduZWQgbG9uZykgcF9oaWdocGMpKTsKLSAgZm9yIChpbnN0ciA9ICh1bnNpZ25lZCBpbnQgKikgKCgocF9sb3dwYyArIGRlbHRhKSArIDMpICZ+IDMpOwotICAgICAgIGluc3RyIDwgKHVuc2lnbmVkIGludCAqKSAocF9oaWdocGMgKyBkZWx0YSk7Ci0gICAgICAgKytpbnN0cikKLSAgICB7Ci0gICAgICBpZiAoKCppbnN0ciAmIENBTEwpKQotCXsKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZF9jYWxsXSAweCVseDogY2FsbGYiLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGluc3RyIC0gZGVsdGEpKTsKLQkgIC8qCi0JICAgKiBSZWd1bGFyIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZQotCSAgICogYWRkcmVzcyBvZiBhIGZ1bmN0aW9uLgotCSAgICovCi0JICBkZXN0X3BjID0gKChiZmRfdm1hKSAoaW5zdHIgKyAoKmluc3RyICYgfkNBTEwpKSkgLSBkZWx0YTsKLQkgIGlmIChkZXN0X3BjID49IHNfbG93cGMgJiYgZGVzdF9wYyA8PSBzX2hpZ2hwYykKLQkgICAgewotCSAgICAgIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZGVzdF9wYyk7Ci0JICAgICAgREJHIChDQUxMREVCVUcsCi0JCSAgIHByaW50ZiAoIlx0ZGVzdF9wYz0weCVseCwgKG5hbWU9JXMsIGFkZHI9MHglbHgpXG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGRlc3RfcGMsIGNoaWxkLT5uYW1lLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT5hZGRyKSk7Ci0JICAgICAgaWYgKGNoaWxkLT5hZGRyID09IGRlc3RfcGMpCi0JCXsKLQkJICAvKiBhIGhpdDogICovCi0JCSAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBTb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCi0JICAgKi8KLQkgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJcdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc3RhbXAtaC5pbiBiL2dwcm9mL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3RhbXAtaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvZ3Byb2Yvc3ltX2lkcy5jIGIvZ3Byb2Yvc3ltX2lkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTBmZWFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bV9pZHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLXN0cnVjdCBzeW1faWQKLSAgewotICAgIHN0cnVjdCBzeW1faWQgKm5leHQ7Ci0gICAgY2hhciAqc3BlYzsJCQkvKiBwYXJzaW5nIG1vZGlmaWVzIHRoaXMgKi8KLSAgICBUYWJsZV9JZCB3aGljaF90YWJsZTsKLSAgICBib29sIGhhc19yaWdodDsKLSAgICBzdHJ1Y3QgbWF0Y2gKLSAgICAgIHsKLQlpbnQgcHJldl9pbmRleDsJCS8qIGluZGV4IG9mIHByZXYgbWF0Y2ggKi8KLQlTeW0gKnByZXZfbWF0Y2g7CS8qIHByZXZpb3VzIG1hdGNoICovCi0JU3ltICpmaXJzdF9tYXRjaDsJLyogY2hhaW4gb2YgYWxsIG1hdGNoZXMgKi8KLQlTeW0gc3ltOwotICAgICAgfQotICAgIGxlZnQsIHJpZ2h0OwotICB9Ci0gKmlkX2xpc3Q7Ci0KLVN5bV9UYWJsZSBzeW1zW05VTV9UQUJMRVNdOwotCi0jaWZkZWYgREVCVUcKLWNvbnN0IGNoYXIgKnRhYmxlX25hbWVbXSA9Ci17Ci0gICJJTkNMX0dSQVBIIiwgIkVYQ0xfR1JBUEgiLAotICAiSU5DTF9BUkNTIiwgIkVYQ0xfQVJDUyIsCi0gICJJTkNMX0ZMQVQiLCAiRVhDTF9GTEFUIiwKLSAgIklOQ0xfVElNRSIsICJFWENMX1RJTUUiLAotICAiSU5DTF9BTk5PIiwgIkVYQ0xfQU5OTyIsCi0gICJJTkNMX0VYRUMiLCAiRVhDTF9FWEVDIgotfTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKgotICogVGhpcyBpcyB0aGUgdGFibGUgaW4gd2hpY2ggd2Uga2VlcCBhbGwgdGhlIHN5bXMgdGhhdCBtYXRjaAotICogdGhlIHJpZ2h0IGhhbGYgb2YgYW4gYXJjIGlkLiAgSXQgaXMgTk9UIHNvcnRlZCBhY2NvcmRpbmcKLSAqIHRvIHRoZSBhZGRyZXNzZXMsIGJlY2F1c2UgaXQgaXMgYWNjZXNzZWQgb25seSB0aHJvdWdoCi0gKiB0aGUgbGVmdCBoYWxmJ3MgQ0hJTERSRU4gcG9pbnRlcnMgKHNvIGl0J3MgY3J1Y2lhbCBub3QKLSAqIHRvIHJlb3JkZXIgdGhpcyB0YWJsZSBvbmNlIHBvaW50ZXJzIGludG8gaXQgZXhpc3QpLgotICovCi1zdGF0aWMgU3ltX1RhYmxlIHJpZ2h0X2lkczsKLQotc3RhdGljIFNvdXJjZV9GaWxlIG5vbl9leGlzdGVudF9maWxlID0KLXsKLSAgMCwgIjxub24tZXhpc3RlbnQtZmlsZT4iCi19OwotCi0KLXZvaWQKLURFRlVOIChzeW1faWRfYWRkLCAoc3BlYywgd2hpY2hfdGFibGUpLAotICAgICAgIGNvbnN0IGNoYXIgKnNwZWMgQU5EIFRhYmxlX0lkIHdoaWNoX3RhYmxlKQotewotICBzdHJ1Y3Qgc3ltX2lkICppZDsKLSAgaW50IGxlbiA9IHN0cmxlbiAoc3BlYyk7Ci0KLSAgaWQgPSAoc3RydWN0IHN5bV9pZCAqKSB4bWFsbG9jIChzaXplb2YgKCppZCkgKyBsZW4gKyAxKTsKLSAgbWVtc2V0IChpZCwgMCwgc2l6ZW9mICgqaWQpKTsKLQotICBpZC0+c3BlYyA9IChjaGFyICopIGlkICsgc2l6ZW9mICgqaWQpOwotICBzdHJjcHkgKGlkLT5zcGVjLCBzcGVjKTsKLSAgaWQtPndoaWNoX3RhYmxlID0gd2hpY2hfdGFibGU7Ci0KLSAgaWQtPm5leHQgPSBpZF9saXN0OwotICBpZF9saXN0ID0gaWQ7Ci19Ci0KLQotLyoKLSAqIEEgc3BlYyBoYXMgdGhlIHN5bnRheCBGSUxFTkFNRTooRlVOQ05BTUV8TElORU5VTSkuICBBcyBhIGNvbnZlbmllbmNlCi0gKiB0byB0aGUgdXNlciwgYSBzcGVjIHdpdGhvdXQgYSBjb2xvbiBpcyBpbnRlcnByZXRlZCBhczoKLSAqCi0gKiAgICAgIChpKSAgIGEgRklMRU5BTUUgaWYgaXQgY29udGFpbnMgYSBkb3QKLSAqICAgICAgKGlpKSAgYSBGVU5DTkFNRSBpZiBpdCBzdGFydHMgd2l0aCBhIG5vbi1kaWdpdCBjaGFyYWN0ZXIKLSAqICAgICAgKGlpaSkgYSBMSU5FTlVNIGlmIGl0IHN0YXJ0cyB3aXRoIGEgZGlnaXQKLSAqCi0gKiBBIEZVTkNOQU1FIGNvbnRhaW5pbmcgYSBkb3QgY2FuIGJlIHNwZWNpZmllZCBieSA6RlVOQ05BTUUsIGEKLSAqIEZJTEVOQU1FIG5vdCBjb250YWluaW5nIGEgZG90IGNhbiBiZSBzcGVjaWZpZWQgYnkgRklMRU5BTUU6LgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHBhcnNlX3NwZWMsIChzcGVjLCBzeW0pLCBjaGFyICpzcGVjIEFORCBTeW0gKiBzeW0pCi17Ci0gIGNoYXIgKmNvbG9uOwotCi0gIHN5bV9pbml0IChzeW0pOwotICBjb2xvbiA9IHN0cnJjaHIgKHNwZWMsICc6Jyk7Ci0gIGlmIChjb2xvbikKLSAgICB7Ci0gICAgICAqY29sb24gPSAnXDAnOwotICAgICAgaWYgKGNvbG9uID4gc3BlYykKLQl7Ci0JICBzeW0tPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSAoc3BlYyk7Ci0JICBpZiAoIXN5bS0+ZmlsZSkKLQkgICAgewotCSAgICAgIHN5bS0+ZmlsZSA9ICZub25fZXhpc3RlbnRfZmlsZTsKLQkgICAgfQotCX0KLSAgICAgIHNwZWMgPSBjb2xvbiArIDE7Ci0gICAgICBpZiAoc3RybGVuIChzcGVjKSkKLQl7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNwZWNbMF0pKQotCSAgICB7Ci0JICAgICAgc3ltLT5saW5lX251bSA9IGF0b2kgKHNwZWMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0tPm5hbWUgPSBzcGVjOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybGVuIChzcGVjKSkKLSAgICB7Ci0gICAgICAvKiBubyBjb2xvbjogc3BlYyBpcyBhIGZpbGVuYW1lIGlmIGl0IGNvbnRhaW5zIGEgZG90OiAqLwotICAgICAgaWYgKHN0cmNociAoc3BlYywgJy4nKSkKLQl7Ci0JICBzeW0tPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSAoc3BlYyk7Ci0JICBpZiAoIXN5bS0+ZmlsZSkKLQkgICAgewotCSAgICAgIHN5bS0+ZmlsZSA9ICZub25fZXhpc3RlbnRfZmlsZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqc3BlYykpCi0JewotCSAgc3ltLT5saW5lX251bSA9IGF0b2kgKHNwZWMpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmxlbiAoc3BlYykpCi0JewotCSAgc3ltLT5uYW1lID0gc3BlYzsKLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBBIHN5bWJvbCBpZCBoYXMgdGhlIHN5bnRheCBTUEVDWy9TUEVDXSwgd2hlcmUgU1BFQyBpcyBpcyBkZWZpbmVkCi0gKiBieSBwYXJzZV9zcGVjKCkuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocGFyc2VfaWQsIChpZCksIHN0cnVjdCBzeW1faWQgKmlkKQotewotICBjaGFyICpzbGFzaDsKLQotICBEQkcgKElEREVCVUcsIHByaW50ZiAoIltwYXJzZV9pZF0gJXMgLT4gIiwgaWQtPnNwZWMpKTsKLQotICBzbGFzaCA9IHN0cmNociAoaWQtPnNwZWMsICcvJyk7Ci0gIGlmIChzbGFzaCkKLSAgICB7Ci0gICAgICBwYXJzZV9zcGVjIChzbGFzaCArIDEsICZpZC0+cmlnaHQuc3ltKTsKLSAgICAgICpzbGFzaCA9ICdcMCc7Ci0gICAgICBpZC0+aGFzX3JpZ2h0ID0gVFJVRTsKLSAgICB9Ci0gIHBhcnNlX3NwZWMgKGlkLT5zcGVjLCAmaWQtPmxlZnQuc3ltKTsKLQotI2lmZGVmIERFQlVHCi0gIGlmIChkZWJ1Z19sZXZlbCAmIElEREVCVUcpCi0gICAgewotICAgICAgcHJpbnRmICgiJXM6IiwgaWQtPmxlZnQuc3ltLmZpbGUgPyBpZC0+bGVmdC5zeW0uZmlsZS0+bmFtZSA6ICIqIik7Ci0gICAgICBpZiAoaWQtPmxlZnQuc3ltLm5hbWUpCi0JewotCSAgcHJpbnRmICgiJXMiLCBpZC0+bGVmdC5zeW0ubmFtZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaWQtPmxlZnQuc3ltLmxpbmVfbnVtKQotCXsKLQkgIHByaW50ZiAoIiVkIiwgaWQtPmxlZnQuc3ltLmxpbmVfbnVtKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiKiIpOwotCX0KLSAgICAgIGlmIChpZC0+aGFzX3JpZ2h0KQotCXsKLQkgIHByaW50ZiAoIi8lczoiLAotCQkgIGlkLT5yaWdodC5zeW0uZmlsZSA/IGlkLT5yaWdodC5zeW0uZmlsZS0+bmFtZSA6ICIqIik7Ci0JICBpZiAoaWQtPnJpZ2h0LnN5bS5uYW1lKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJXMiLCBpZC0+cmlnaHQuc3ltLm5hbWUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpZC0+cmlnaHQuc3ltLmxpbmVfbnVtKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJWQiLCBpZC0+cmlnaHQuc3ltLmxpbmVfbnVtKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiKiIpOwotCSAgICB9Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotCi0vKgotICogUmV0dXJuIFRSVUUgaWZmIFBBVFRFUk4gbWF0Y2hlcyBTWU0uCi0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAobWF0Y2gsIChwYXR0ZXJuLCBzeW0pLCBTeW0gKiBwYXR0ZXJuIEFORCBTeW0gKiBzeW0pCi17Ci0gIHJldHVybiAocGF0dGVybi0+ZmlsZSA/IHBhdHRlcm4tPmZpbGUgPT0gc3ltLT5maWxlIDogVFJVRSkKLSAgICAmJiAocGF0dGVybi0+bGluZV9udW0gPyBwYXR0ZXJuLT5saW5lX251bSA9PSBzeW0tPmxpbmVfbnVtIDogVFJVRSkKLSAgICAmJiAocGF0dGVybi0+bmFtZSA/IHN0cmNtcCAocGF0dGVybi0+bmFtZSwgc3ltLT5uYW1lKSA9PSAwIDogVFJVRSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChleHRlbmRfbWF0Y2gsIChtLCBzeW0sIHRhYiwgc2Vjb25kX3Bhc3MpLAotICAgICBzdHJ1Y3QgbWF0Y2ggKm0gQU5EIFN5bSAqIHN5bSBBTkQgU3ltX1RhYmxlICogdGFiIEFORCBib29sIHNlY29uZF9wYXNzKQotewotICBpZiAobS0+cHJldl9tYXRjaCAhPSBzeW0gLSAxKQotICAgIHsKLSAgICAgIC8qIGRpc2NvbnRpbnVpdHk6IGFkZCBuZXcgbWF0Y2ggdG8gdGFibGU6ICovCi0gICAgICBpZiAoc2Vjb25kX3Bhc3MpCi0JewotCSAgdGFiLT5iYXNlW3RhYi0+bGVuXSA9ICpzeW07Ci0JICBtLT5wcmV2X2luZGV4ID0gdGFiLT5sZW47Ci0KLQkgIC8qIGxpbmsgbWF0Y2ggaW50byBtYXRjaCdzIGNoYWluOiAqLwotCSAgdGFiLT5iYXNlW3RhYi0+bGVuXS5uZXh0ID0gbS0+Zmlyc3RfbWF0Y2g7Ci0JICBtLT5maXJzdF9tYXRjaCA9ICZ0YWItPmJhc2VbdGFiLT5sZW5dOwotCX0KLSAgICAgICsrdGFiLT5sZW47Ci0gICAgfQotCi0gIC8qIGV4dGVuZCBtYXRjaCB0byBpbmNsdWRlIHRoaXMgc3ltYm9sOiAqLwotICBpZiAoc2Vjb25kX3Bhc3MpCi0gICAgewotICAgICAgdGFiLT5iYXNlW20tPnByZXZfaW5kZXhdLmVuZF9hZGRyID0gc3ltLT5lbmRfYWRkcjsKLSAgICB9Ci0gIG0tPnByZXZfbWF0Y2ggPSBzeW07Ci19Ci0KLQotLyoKLSAqIEdvIHRocm91Z2ggc3ltX2lkIGxpc3QgcHJvZHVjZWQgYnkgb3B0aW9uIHByb2Nlc3NpbmcgYW5kIGZpbGwKLSAqIGluIHRoZSB2YXJpb3VzIHN5bWJvbCB0YWJsZXMgaW5kaWNhdGluZyB3aGF0IHN5bWJvbHMgc2hvdWxkCi0gKiBiZSBkaXNwbGF5ZWQgb3Igc3VwcHJlc3NlZCBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2Ygb3V0cHV0cy4KLSAqCi0gKiBUaGlzIGNhbiBwb3RlbnRpYWxseSBwcm9kdWNlIGh1Z2UgdGFibGVzIGFuZCBpbiBwYXJ0aWN1bGFycwotICogdG9ucyBvZiBhcmNzLCBidXQgdGhpcyBoYXBwZW5zIG9ubHkgaWYgdGhlIHVzZXIgbWFrZXMgc2lsbHkKLSAqIHJlcXVlc3RzLS0teW91IGdldCB3aGF0IHlvdSBhc2sgZm9yIQotICovCi12b2lkCi1ERUZVTl9WT0lEIChzeW1faWRfcGFyc2UpCi17Ci0gIFN5bSAqc3ltLCAqbGVmdCwgKnJpZ2h0OwotICBzdHJ1Y3Qgc3ltX2lkICppZDsKLSAgU3ltX1RhYmxlICp0YWI7Ci0KLSAgLyoKLSAgICogQ29udmVydCBzeW1ib2wgaWRzIGludG8gU3ltcywgc28gd2UgY2FuIGRlYWwgd2l0aCB0aGVtIG1vcmUgZWFzaWx5OgotICAgKi8KLSAgZm9yIChpZCA9IGlkX2xpc3Q7IGlkOyBpZCA9IGlkLT5uZXh0KQotICAgIHsKLSAgICAgIHBhcnNlX2lkIChpZCk7Ci0gICAgfQotCi0gIC8qIGZpcnN0IGRldGVybWluZSBzaXplIG9mIGVhY2ggdGFibGU6ICovCi0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCi0JewotCSAgaWYgKG1hdGNoICgmaWQtPmxlZnQuc3ltLCBzeW0pKQotCSAgICB7Ci0JICAgICAgZXh0ZW5kX21hdGNoICgmaWQtPmxlZnQsIHN5bSwgJnN5bXNbaWQtPndoaWNoX3RhYmxlXSwgRkFMU0UpOwotCSAgICB9Ci0JICBpZiAoaWQtPmhhc19yaWdodCAmJiBtYXRjaCAoJmlkLT5yaWdodC5zeW0sIHN5bSkpCi0JICAgIHsKLQkgICAgICBleHRlbmRfbWF0Y2ggKCZpZC0+cmlnaHQsIHN5bSwgJnJpZ2h0X2lkcywgRkFMU0UpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBjcmVhdGUgdGFibGVzIG9mIGFwcHJvcHJpYXRlIHNpemUgYW5kIHJlc2V0IGxlbmd0aHM6ICovCi0KLSAgZm9yICh0YWIgPSBzeW1zOyB0YWIgPCAmc3ltc1tOVU1fVEFCTEVTXTsgKyt0YWIpCi0gICAgewotICAgICAgaWYgKHRhYi0+bGVuKQotCXsKLQkgIHRhYi0+YmFzZSA9IChTeW0gKikgeG1hbGxvYyAodGFiLT5sZW4gKiBzaXplb2YgKFN5bSkpOwotCSAgdGFiLT5saW1pdCA9IHRhYi0+YmFzZSArIHRhYi0+bGVuOwotCSAgdGFiLT5sZW4gPSAwOwotCX0KLSAgICB9Ci0gIGlmIChyaWdodF9pZHMubGVuKQotICAgIHsKLSAgICAgIHJpZ2h0X2lkcy5iYXNlID0gKFN5bSAqKSB4bWFsbG9jIChyaWdodF9pZHMubGVuICogc2l6ZW9mIChTeW0pKTsKLSAgICAgIHJpZ2h0X2lkcy5saW1pdCA9IHJpZ2h0X2lkcy5iYXNlICsgcmlnaHRfaWRzLmxlbjsKLSAgICAgIHJpZ2h0X2lkcy5sZW4gPSAwOwotICAgIH0KLQotICAvKiBtYWtlIGEgc2Vjb25kIHBhc3MgdGhyb3VnaCBzeW10YWIsIGNyZWF0aW5nIHN5bXMgYXMgbmVjZXNzYXJ5OiAqLwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgZm9yIChpZCA9IGlkX2xpc3Q7IGlkOyBpZCA9IGlkLT5uZXh0KQotCXsKLQkgIGlmIChtYXRjaCAoJmlkLT5sZWZ0LnN5bSwgc3ltKSkKLQkgICAgewotCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5sZWZ0LCBzeW0sICZzeW1zW2lkLT53aGljaF90YWJsZV0sIFRSVUUpOwotCSAgICB9Ci0JICBpZiAoaWQtPmhhc19yaWdodCAmJiBtYXRjaCAoJmlkLT5yaWdodC5zeW0sIHN5bSkpCi0JICAgIHsKLQkgICAgICBleHRlbmRfbWF0Y2ggKCZpZC0+cmlnaHQsIHN5bSwgJnJpZ2h0X2lkcywgVFJVRSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGdvIHRocm91Z2ggaWRzIGNyZWF0aW5nIGFyY3MgYXMgbmVlZGVkOiAqLwotCi0gIGZvciAoaWQgPSBpZF9saXN0OyBpZDsgaWQgPSBpZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoaWQtPmhhc19yaWdodCkKLQl7Ci0JICBmb3IgKGxlZnQgPSBpZC0+bGVmdC5maXJzdF9tYXRjaDsgbGVmdDsgbGVmdCA9IGxlZnQtPm5leHQpCi0JICAgIHsKLQkgICAgICBmb3IgKHJpZ2h0ID0gaWQtPnJpZ2h0LmZpcnN0X21hdGNoOyByaWdodDsgcmlnaHQgPSByaWdodC0+bmV4dCkKLQkJewotCQkgIERCRyAoSURERUJVRywKLQkJICAgICAgIHByaW50ZiAoCi0JCQkJIltzeW1faWRfcGFyc2VdOiBhcmMgJXM6JXMoJWx4LSVseCkgLT4gJXM6JXMoJWx4LSVseCkgdG8gJXNcbiIsCi0JCQkJbGVmdC0+ZmlsZSA/IGxlZnQtPmZpbGUtPm5hbWUgOiAiKiIsCi0JCQkJbGVmdC0+bmFtZSA/IGxlZnQtPm5hbWUgOiAiKiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGxlZnQtPmFkZHIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGxlZnQtPmVuZF9hZGRyLAotCQkJCXJpZ2h0LT5maWxlID8gcmlnaHQtPmZpbGUtPm5hbWUgOiAiKiIsCi0JCQkJcmlnaHQtPm5hbWUgPyByaWdodC0+bmFtZSA6ICIqIiwKLQkJCQkodW5zaWduZWQgbG9uZykgcmlnaHQtPmFkZHIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIHJpZ2h0LT5lbmRfYWRkciwKLQkJCQl0YWJsZV9uYW1lW2lkLT53aGljaF90YWJsZV0pKTsKLQkJICBhcmNfYWRkIChsZWZ0LCByaWdodCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGZpbmFsbHksIHdlIGNhbiBzb3J0IHRoZSB0YWJsZXMgYW5kIHdlJ3JlIGRvbmU6ICovCi0KLSAgZm9yICh0YWIgPSAmc3ltc1swXTsgdGFiIDwgJnN5bXNbTlVNX1RBQkxFU107ICsrdGFiKQotICAgIHsKLSAgICAgIERCRyAoSURERUJVRywgcHJpbnRmICgiW3N5bV9pZF9wYXJzZV0gc3ltc1slc106XG4iLAotCQkJICAgIHRhYmxlX25hbWVbdGFiIC0gJnN5bXNbMF1dKSk7Ci0gICAgICBzeW10YWJfZmluYWxpemUgKHRhYik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBTeW1ib2wgdGFibGVzIHN0b3JpbmcgdGhlIEZST00gc3ltYm9scyBvZiBhcmNzIGRvIG5vdCBuZWNlc3NhcmlseQotICogaGF2ZSBkaXN0aW5jdCBhZGRyZXNzIHJhbmdlcy4gIEZvciBleGFtcGxlLCBzb21lYm9keSBtaWdodCByZXF1ZXN0Ci0gKiAtayAvX21jb3VudCB0byBzdXBwcmVzcyBhbnkgYXJjcyBpbnRvIF9tY291bnQsIHdoaWxlIGF0IHRoZSBzYW1lCi0gKiB0aW1lIHJlcXVlc3RpbmcgLWsgYS9iLiAgRm9ydHVuYXRlbHksIHRob3NlIHN5bWJvbCB0YWJsZXMgZG9uJ3QgZ2V0Ci0gKiB2ZXJ5IGJpZyAodGhlIHVzZXIgaGFzIHRvIHR5cGUgdGhlbSEpLCBzbyBhIGxpbmVhciBzZWFyY2ggaXMgcHJvYmFibHkKLSAqIHRvbGVyYWJsZS4KLSAqLwotYm9vbAotREVGVU4gKHN5bV9pZF9hcmNfaXNfcHJlc2VudCwgKHN5bXRhYiwgZnJvbSwgdG8pLAotICAgICAgIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgU3ltICogZnJvbSBBTkQgU3ltICogdG8pCi17Ci0gIFN5bSAqc3ltOwotCi0gIGZvciAoc3ltID0gc3ltdGFiLT5iYXNlOyBzeW0gPCBzeW10YWItPmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBpZiAoZnJvbS0+YWRkciA+PSBzeW0tPmFkZHIgJiYgZnJvbS0+YWRkciA8PSBzeW0tPmVuZF9hZGRyCi0JICAmJiBhcmNfbG9va3VwIChzeW0sIHRvKSkKLQl7Ci0JICByZXR1cm4gVFJVRTsKLQl9Ci0gICAgfQotICByZXR1cm4gRkFMU0U7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmggYi9ncHJvZi9zeW1faWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTYzMzguLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltX2lkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2lmbmRlZiBzeW1faWRzX2gKLSNkZWZpbmUgc3ltX2lkc19oCi0KLSNpbmNsdWRlICJzeW10YWIuaCIKLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBJTkNMX0dSQVBIID0gMCwgRVhDTF9HUkFQSCwKLSAgICBJTkNMX0FSQ1MsIEVYQ0xfQVJDUywKLSAgICBJTkNMX0ZMQVQsIEVYQ0xfRkxBVCwKLSAgICBJTkNMX1RJTUUsIEVYQ0xfVElNRSwKLSAgICBJTkNMX0FOTk8sIEVYQ0xfQU5OTywKLSAgICBJTkNMX0VYRUMsIEVYQ0xfRVhFQywKLSAgICBOVU1fVEFCTEVTCi0gIH0KLVRhYmxlX0lkOwotCi1leHRlcm4gU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107Ci0KLWV4dGVybiB2b2lkIHN5bV9pZF9hZGQgUEFSQU1TICgoY29uc3QgY2hhciAqc3BlYywgVGFibGVfSWQgd2hpY2hfdGFibGUpKTsKLWV4dGVybiB2b2lkIHN5bV9pZF9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gYm9vbCBzeW1faWRfYXJjX2lzX3ByZXNlbnQgUEFSQU1TICgoU3ltX1RhYmxlICogc3ltdGFiLAotCQkJCQkgICBTeW0gKiBmcm9tLCBTeW0gKiB0bykpOwotCi0jZW5kaWYgLyogc3ltX2lkc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zeW10YWIuYyBiL2dwcm9mL3N5bXRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2IyNjFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bXRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1TeW1fVGFibGUgc3ltdGFiOwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGEgc3ltYm9sIChzbyBpdCdzIGVtcHR5KS4KLSAqLwotdm9pZAotREVGVU4gKHN5bV9pbml0LCAoc3ltKSwgU3ltICogc3ltKQotewotICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mICgqc3ltKSk7Ci0gIC8qCi0gICAqIEl0IGlzIG5vdCBzYWZlIHRvIGFzc3VtZSB0aGF0IGEgYmluYXJ5IHplcm8gY29ycmVzcG9uZHMgdG8KLSAgICogYSBmbG9hdGluZy1wb2ludCAwLjAsIHNvIGluaXRpYWxpemUgZmxvYXRzIGV4cGxpY2l0bHk6Ci0gICAqLwotICBzeW0tPmhpc3QudGltZSA9IDAuMDsKLSAgc3ltLT5jZy5jaGlsZF90aW1lID0gMC4wOwotICBzeW0tPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0gIHN5bS0+Y2cucHJvcC5zZWxmID0gMC4wOwotICBzeW0tPmNnLnByb3AuY2hpbGQgPSAwLjA7Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgdGhlIGZ1bmN0aW9uIGVudHJ5LXBvaW50IG9mIHR3byBzeW1ib2xzIGFuZCByZXR1cm4gPDAsID0wLAotICogb3IgPjAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGxlZnQgdmFsdWUgaXMgc21hbGxlciB0aGFuLCBlcXVhbAotICogdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgcmlnaHQgdmFsdWUuICBJZiB0d28gc3ltYm9scyBhcmUgZXF1YWwKLSAqIGJ1dCBvbmUgaGFzIGlzX2Z1bmMgc2V0IGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgd2UgbWFrZSB0aGUKLSAqIG5vbi1mdW5jdGlvbiBzeW1ib2wgb25lICJiaWdnZXIiIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIHN5bWJvbCB3aWxsCi0gKiBzdXJ2aXZlIGR1cGxpY2F0ZSByZW1vdmFsLiAgRmluYWxseSwgaWYgYm90aCBzeW1ib2xzIGhhdmUgdGhlCi0gKiBzYW1lIGlzX2Z1bmMgdmFsdWUsIHdlIGRpc2NyaW1pbmF0ZSBhZ2FpbnN0IGlzX3N0YXRpYyBzdWNoIHRoYXQKLSAqIHRoZSBnbG9iYWwgc3ltYm9sIHN1cnZpdmVzLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2FkZHIsIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKLXsKLSAgU3ltICpsZWZ0ID0gKFN5bSAqKSBscDsKLSAgU3ltICpyaWdodCA9IChTeW0gKikgcnA7Ci0KLSAgaWYgKGxlZnQtPmFkZHIgPiByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlZnQtPmFkZHIgPCByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChsZWZ0LT5pc19mdW5jICE9IHJpZ2h0LT5pc19mdW5jKQotICAgIHsKLSAgICAgIHJldHVybiByaWdodC0+aXNfZnVuYyAtIGxlZnQtPmlzX2Z1bmM7Ci0gICAgfQotCi0gIHJldHVybiBsZWZ0LT5pc19zdGF0aWMgLSByaWdodC0+aXNfc3RhdGljOwotfQotCi0KLXZvaWQKLURFRlVOIChzeW10YWJfZmluYWxpemUsICh0YWIpLCBTeW1fVGFibGUgKiB0YWIpCi17Ci0gIFN5bSAqc3JjLCAqZHN0OwotICBiZmRfdm1hIHByZXZfYWRkcjsKLQotICBpZiAoIXRhYi0+bGVuKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyoKLSAgICogU29ydCBzeW1ib2wgdGFibGUgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyBmdW5jdGlvbiBhZGRyZXNzZXM6Ci0gICAqLwotICBxc29ydCAodGFiLT5iYXNlLCB0YWItPmxlbiwgc2l6ZW9mIChTeW0pLCBjbXBfYWRkcik7Ci0KLSAgLyoKLSAgICogUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzIHRvIHNwZWVkLXVwIGxhdGVyIHByb2Nlc3NpbmcgYW5kCi0gICAqIHNldCBlbmRfYWRkciBpZiBpdHMgbm90IHNldCB5ZXQ6Ci0gICAqLwotICBwcmV2X2FkZHIgPSB0YWItPmJhc2VbMF0uYWRkciArIDE7Ci0gIGZvciAoc3JjID0gZHN0ID0gdGFiLT5iYXNlOyBzcmMgPCB0YWItPmxpbWl0OyArK3NyYykKLSAgICB7Ci0gICAgICBpZiAoc3JjLT5hZGRyID09IHByZXZfYWRkcikKLQl7Ci0JICAvKgotCSAgICogSWYgc2FtZSBhZGRyZXNzLCBmYXZvciBnbG9iYWwgc3ltYm9sIG92ZXIgc3RhdGljIG9uZSwKLQkgICAqIHRoZW4gZnVuY3Rpb24gb3ZlciBsaW5lIG51bWJlci4gIElmIGJvdGggc3ltYm9scyBhcmUKLQkgICAqIGVpdGhlciBzdGF0aWMgb3IgZ2xvYmFsIGFuZCBlaXRoZXIgZnVuY3Rpb24gb3IgbGluZSwgY2hlY2sKLQkgICAqIHdoZXRoZXIgb25lIGhhcyBuYW1lIGJlZ2lubmluZyB3aXRoIHVuZGVyc2NvcmUgd2hpbGUKLQkgICAqIHRoZSBvdGhlciBkb2Vzbid0LiAgSW4gc3VjaCBjYXNlcywga2VlcCBzeW0gd2l0aG91dAotCSAgICogdW5kZXJzY29yZS4gIFRoaXMgdGFrZXMgY2FyZXMgb2YgY29tcGlsZXIgZ2VuZXJhdGVkCi0JICAgKiBzeW1ib2xzIChzdWNoIGFzIF9fZ251X2NvbXBpbGVkLCBfX2M4OV91c2VkLCBldGMuKS4KLQkgICAqLwotCSAgaWYgKCghc3JjLT5pc19zdGF0aWMgJiYgZHN0Wy0xXS5pc19zdGF0aWMpCi0JICAgICAgfHwgKChzcmMtPmlzX3N0YXRpYyA9PSBkc3RbLTFdLmlzX3N0YXRpYykKLQkJICAmJiAoKHNyYy0+aXNfZnVuYyAmJiAhZHN0Wy0xXS5pc19mdW5jKQotCQkgICAgICB8fCAoKHNyYy0+aXNfZnVuYyA9PSBkc3RbLTFdLmlzX2Z1bmMpCi0JCQkgICYmICgoc3JjLT5uYW1lWzBdICE9ICdfJyAmJiBkc3RbLTFdLm5hbWVbMF0gPT0gJ18nKQotCQkJICAgICAgfHwgKHNyYy0+bmFtZVswXQotCQkJCSAgJiYgc3JjLT5uYW1lWzFdICE9ICdfJwotCQkJCSAgJiYgZHN0Wy0xXS5uYW1lWzFdID09ICdfJykpKSkpKQotCSAgICB7Ci0JICAgICAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSBmYXZvciAlc0AlYyVjIG92ZXIgJXNAJWMlYyIsCi0JCQkgICBzcmMtPm5hbWUsIHNyYy0+aXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgc3JjLT5pc19mdW5jID8gJ0YnIDogJ2YnLAotCQkJICAgZHN0Wy0xXS5uYW1lLCBkc3RbLTFdLmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIGRzdFstMV0uaXNfZnVuYyA/ICdGJyA6ICdmJyk7Ci0JCSAgIHByaW50ZiAoIiAoYWRkcj0lbHgpXG4iLCAodW5zaWduZWQgbG9uZykgc3JjLT5hZGRyKSk7Ci0JICAgICAgZHN0Wy0xXSA9ICpzcmM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIERCRyAoQU9VVERFQlVHIHwgSURERUJVRywKLQkJICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV0gZmF2b3IgJXNAJWMlYyBvdmVyICVzQCVjJWMiLAotCQkJICAgZHN0Wy0xXS5uYW1lLCBkc3RbLTFdLmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIGRzdFstMV0uaXNfZnVuYyA/ICdGJyA6ICdmJywKLQkJCSAgIHNyYy0+bmFtZSwgc3JjLT5pc19zdGF0aWMgPyAndCcgOiAnVCcsCi0JCQkgICBzcmMtPmlzX2Z1bmMgPyAnRicgOiAnZicpOwotCQkgICBwcmludGYgKCIgKGFkZHI9JWx4KVxuIiwgKHVuc2lnbmVkIGxvbmcpIHNyYy0+YWRkcikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChkc3QgPiB0YWItPmJhc2UgJiYgZHN0Wy0xXS5lbmRfYWRkciA9PSAwKQotCSAgICB7Ci0JICAgICAgZHN0Wy0xXS5lbmRfYWRkciA9IHNyYy0+YWRkciAtIDE7Ci0JICAgIH0KLQotCSAgLyogcmV0YWluIHN5bSBvbmx5IGlmIGl0IGhhcyBhIG5vbi1lbXB0eSBhZGRyZXNzIHJhbmdlOiAqLwotCSAgaWYgKCFzcmMtPmVuZF9hZGRyIHx8IHNyYy0+YWRkciA8PSBzcmMtPmVuZF9hZGRyKQotCSAgICB7Ci0JICAgICAgKmRzdCsrID0gKnNyYzsKLQkgICAgICBwcmV2X2FkZHIgPSBzcmMtPmFkZHI7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAodGFiLT5sZW4gPiAwICYmIGRzdFstMV0uZW5kX2FkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBkc3RbLTFdLmVuZF9hZGRyID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUgLSAxOwotICAgIH0KLQotICBEQkcgKEFPVVRERUJVRyB8IElEREVCVUcsCi0gICAgICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV06IHJlbW92ZWQgJWQgZHVwbGljYXRlIGVudHJpZXNcbiIsCi0JICAgICAgIHRhYi0+bGVuIC0gKGludCkgKGRzdCAtIHRhYi0+YmFzZSkpKTsKLQotICB0YWItPmxpbWl0ID0gZHN0OwotICB0YWItPmxlbiA9IHRhYi0+bGltaXQgLSB0YWItPmJhc2U7Ci0KLSAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotICAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAgZm9yIChqID0gMDsgaiA8IHRhYi0+bGVuOyArK2opCi0gICAgICAgewotICAgICAgIHByaW50ZiAoIltzeW10YWJfZmluYWxpemVdIDB4JWx4LTB4JWx4XHQlc1xuIiwKLQkgICAgICAgKGxvbmcpIHRhYi0+YmFzZVtqXS5hZGRyLCAobG9uZykgdGFiLT5iYXNlW2pdLmVuZF9hZGRyLAotCSAgICAgICB0YWItPmJhc2Vbal0ubmFtZSk7Ci0gICAgICAgfQotICApOwotfQotCi0KLSNpZmRlZiBERUJVRwotCi1TeW0gKgotREVGVU4gKGRiZ19zeW1fbG9va3VwLCAoc3ltdGFiLCBhZGRyZXNzKSwgU3ltX1RhYmxlICogc3ltdGFiIEFORCBiZmRfdm1hIGFkZHJlc3MpCi17Ci0gIGxvbmcgbG93LCBtaWQsIGhpZ2g7Ci0gIFN5bSAqc3ltOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gYWRkcmVzcyAweCVseFxuIiwKLQkgICAodW5zaWduZWQgbG9uZykgYWRkcmVzcyk7Ci0KLSAgc3ltID0gc3ltdGFiLT5iYXNlOwotICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBzeW10YWItPmxlbiAtIDE7IGxvdyAhPSBoaWdoOykKLSAgICB7Ci0gICAgICBtaWQgPSAoaGlnaCArIGxvdykgPj4gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gbG93PTB4JWx4LCBtaWQ9MHglbHgsIGhpZ2g9MHglbHhcbiIsCi0JICAgICAgIGxvdywgbWlkLCBoaWdoKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gc3ltW21dPTB4JWx4IHN5bVttICsgMV09MHglbHhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzeW1bbWlkXS5hZGRyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc3ltW21pZCArIDFdLmFkZHIpOwotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPD0gYWRkcmVzcyAmJiBzeW1bbWlkICsgMV0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgcmV0dXJuICZzeW1bbWlkXTsKLQl9Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaGlnaCA9IG1pZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG93ID0gbWlkICsgMTsKLQl9Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIGJpbmFyeSBzZWFyY2ggZmFpbHM/Pz9cbiIpOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCS8qIERFQlVHICovCi0KLQotLyoKLSAqIExvb2sgdXAgYW4gYWRkcmVzcyBpbiB0aGUgc3ltYm9sLXRhYmxlIHRoYXQgaXMgc29ydGVkIGJ5IGFkZHJlc3MuCi0gKiBJZiBhZGRyZXNzIGRvZXMgbm90IGhpdCBhbnkgc3ltYm9sLCAwIGlzIHJldHVybmVkLgotICovCi1TeW0gKgotREVGVU4gKHN5bV9sb29rdXAsIChzeW10YWIsIGFkZHJlc3MpLCBTeW1fVGFibGUgKiBzeW10YWIgQU5EIGJmZF92bWEgYWRkcmVzcykKLXsKLSAgbG9uZyBsb3csIGhpZ2g7Ci0gIGxvbmcgbWlkID0gLTE7Ci0gIFN5bSAqc3ltOwotI2lmZGVmIERFQlVHCi0gIGludCBwcm9iZXMgPSAwOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgaWYgKCFzeW10YWItPmxlbikKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc3ltID0gc3ltdGFiLT5iYXNlOwotICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBzeW10YWItPmxlbiAtIDE7IGxvdyAhPSBoaWdoOykKLSAgICB7Ci0gICAgICBEQkcgKExPT0tVUERFQlVHLCArK3Byb2Jlcyk7Ci0gICAgICBtaWQgPSAoaGlnaCArIGxvdykgLyAyOwotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPD0gYWRkcmVzcyAmJiBzeW1bbWlkICsgMV0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaWYgKGFkZHJlc3MgPiBzeW1bbWlkXS5lbmRfYWRkcikKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogQWRkcmVzcyBmYWxscyBpbnRvIGdhcCBiZXR3ZWVuIHN5bVttaWRdIGFuZAotCSAgICAgICAqIHN5bVttaWQgKyAxXToKLQkgICAgICAgKi8KLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgREJHIChMT09LVVBERUJVRywKLQkJICAgcHJpbnRmICgiW3N5bV9sb29rdXBdICVkIHByb2JlcyAoc3ltdGFiLT5sZW49JXUpXG4iLAotCQkJICAgcHJvYmVzLCBzeW10YWItPmxlbiAtIDEpKTsKLQkgICAgICByZXR1cm4gJnN5bVttaWRdOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPiBhZGRyZXNzKQotCXsKLQkgIGhpZ2ggPSBtaWQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvdyA9IG1pZCArIDE7Ci0JfQotICAgIH0KLSAgaWYgKHN5bVttaWQgKyAxXS5hZGRyIDw9IGFkZHJlc3MpCi0gICAgewotICAgICAgaWYgKGFkZHJlc3MgPiBzeW1bbWlkICsgMV0uZW5kX2FkZHIpCi0JewotCSAgLyogYWRkcmVzcyBpcyBiZXlvbmQgZW5kIG9mIHN5bVttaWQgKyAxXTogKi8KLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBEQkcgKExPT0tVUERFQlVHLCBwcmludGYgKCJbc3ltX2xvb2t1cF0gJWQgKCV1KSBwcm9iZXMsIGZhbGwgb2ZmXG4iLAotCQkJCSAgICBwcm9iZXMsIHN5bXRhYi0+bGVuIC0gMSkpOwotCSAgcmV0dXJuICZzeW1bbWlkICsgMV07Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zeW10YWIuaCBiL2dwcm9mL3N5bXRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE0NTBlLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bXRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSNpZm5kZWYgc3ltdGFiX2gKLSNkZWZpbmUgc3ltdGFiX2gKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0KLS8qCi0gKiBGb3IgYSBwcm9maWxlIHRvIGJlIGludGVsbGlnaWJsZSB0byBhIGh1bWFuIHVzZXIsIGl0IGlzIG5lY2Vzc2FyeQotICogdG8gbWFwIGNvZGUtYWRkcmVzc2VzIGludG8gc291cmNlLWNvZGUgaW5mb3JtYXRpb24uICBTb3VyY2UtY29kZQotICogaW5mb3JtYXRpb24gY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZjogKGkpIGZ1bmN0aW9uLW5hbWUsIChpaSkKLSAqIHNvdXJjZSBmaWxlLW5hbWUsIGFuZCAoaWlpKSBzb3VyY2UgbGluZSBudW1iZXIuCi0gKgotICogVGhlIHN5bWJvbCB0YWJsZSBpcyB1c2VkIHRvIG1hcCBhZGRyZXNzZXMgaW50byBzb3VyY2UtY29kZQotICogaW5mb3JtYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInNvdXJjZS5oIgotCi0jZGVmaW5lIE5CQlMgMTAKLQotLyoKLSAqIFN5bWJvbC1lbnRyeS4gIEZvciBlYWNoIGV4dGVybmFsIGluIHRoZSBzcGVjaWZpZWQgZmlsZSB3ZSBnYXRoZXIKLSAqIGl0cyBhZGRyZXNzLCB0aGUgbnVtYmVyIG9mIGNhbGxzIGFuZCBjb21wdXRlIGl0cyBzaGFyZSBvZiBjcHUgdGltZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3ltCi0gIHsKLSAgICAvKgotICAgICAqIENvbW1vbiBpbmZvcm1hdGlvbjoKLSAgICAgKgotICAgICAqIEluIHRoZSBzeW1ib2wtdGFibGUsIGZpZWxkcyBBRERSIGFuZCBGVU5DX05BTUUgYXJlIGd1YXJhbnRlZWQKLSAgICAgKiB0byBjb250YWluIHZhbGlkIGluZm9ybWF0aW9uLiAgRklMRSBtYXkgYmUgMCwgaWYgdW5rbm93biBhbmQKLSAgICAgKiBMSU5FX05VTSBtYXliZSAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgYmZkX3ZtYSBhZGRyOwkJLyogYWRkcmVzcyBvZiBlbnRyeSBwb2ludCAqLwotICAgIGJmZF92bWEgZW5kX2FkZHI7CQkvKiBlbmQtYWRkcmVzcyAqLwotICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIGZ1bmN0aW9uIHRoaXMgc3ltIGlzIGZyb20gKi8KLSAgICBTb3VyY2VfRmlsZSAqZmlsZTsJCS8qIHNvdXJjZSBmaWxlIHN5bWJvbCBjb21lcyBmcm9tICovCi0gICAgaW50IGxpbmVfbnVtOwkJLyogc291cmNlIGxpbmUgbnVtYmVyICovCi0gICAgdW5zaWduZWQgaW50IGlzX2Z1bmM6MSwJLyogaXMgdGhpcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50PyAqLwotICAgICAgaXNfc3RhdGljOjEsCQkvKiBpcyB0aGlzIGEgbG9jYWwgKHN0YXRpYykgc3ltYm9sPyAqLwotICAgICAgaXNfYmJfaGVhZDoxLAkJLyogaXMgdGhpcyB0aGUgaGVhZCBvZiBhIGJhc2ljLWJsaz8gKi8KLSAgICAgIG1hcHBlZDoxLAkJCS8qIHRoaXMgc3ltYm9sIHdhcyBtYXBwZWQgdG8gYW5vdGhlciBuYW1lICovCi0gICAgICBoYXNfYmVlbl9wbGFjZWQ6MTsJLyogaGF2ZSB3ZSBwbGFjZWQgdGhpcyBzeW1ib2w/ICAqLwotICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwkvKiBob3cgbWFueSB0aW1lcyBleGVjdXRlZCAqLwotICAgIGludCBudXNlczsJCQkvKiBob3cgbWFueSB0aW1lcyB0aGlzIHN5bWJvbCBhcHBlYXJzIGluCi0JCQkJICAgYSBwYXJ0aWN1bGFyIGNvbnRleHQgKi8KLSAgICBiZmRfdm1hIGJiX2FkZHJbTkJCU107CS8qIGFkZHJlc3Mgb2YgYmFzaWMtYmxvY2sgc3RhcnQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGJiX2NhbGxzW05CQlNdOyAvKiBob3cgbWFueSB0aW1lcyBiYXNpYy1ibG9jayB3YXMgY2FsbGVkICovCi0gICAgc3RydWN0IHN5bSAqbmV4dDsJCS8qIGZvciBidWlsZGluZyBjaGFpbnMgb2Ygc3ltcyAqLwotICAgIHN0cnVjdCBzeW0gKnByZXY7CQkvKiBmb3IgYnVpbGRpbmcgY2hhaW5zIG9mIHN5bXMgKi8KLQotICAgIC8qIHByb2ZpbGUtc3BlY2lmaWMgaW5mb3JtYXRpb246ICovCi0KLSAgICAvKiBoaXN0b2dyYW0gc3BlY2lmaWMgaW5mbzogKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlkb3VibGUgdGltZTsJCS8qICh3ZWlnaHRlZCkgdGlja3MgaW4gdGhpcyByb3V0aW5lICovCi0JYmZkX3ZtYSBzY2FsZWRfYWRkcjsJLyogc2NhbGVkIGVudHJ5IHBvaW50ICovCi0gICAgICB9Ci0gICAgaGlzdDsKLQotICAgIC8qIGNhbGwtZ3JhcGggc3BlY2lmaWMgaW5mbzogKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIHNlbGZfY2FsbHM7IC8qIGhvdyBtYW55IGNhbGxzIHRvIHNlbGYgKi8KLQlkb3VibGUgY2hpbGRfdGltZTsJLyogY3VtdWxhdGl2ZSB0aWNrcyBpbiBjaGlsZHJlbiAqLwotCWludCBpbmRleDsJCS8qIGluZGV4IGluIHRoZSBncmFwaCBsaXN0ICovCi0JaW50IHRvcF9vcmRlcjsJCS8qIGdyYXBoIGNhbGwgY2hhaW4gdG9wLXNvcnQgb3JkZXIgKi8KLQlib29sIHByaW50X2ZsYWc7CS8qIHNob3VsZCB0aGlzIGJlIHByaW50ZWQ/ICovCi0Jc3RydWN0Ci0JICB7Ci0JICAgIGRvdWJsZSBmcmFjdDsJLyogd2hhdCAlIG9mIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgICBkb3VibGUgc2VsZjsJLyogaG93IG11Y2ggc2VsZiB0aW1lIHByb3BhZ2F0ZXMgKi8KLQkgICAgZG91YmxlIGNoaWxkOwkvKiBob3cgbXVjaCBjaGlsZCB0aW1lIHByb3BhZ2F0ZXMgKi8KLQkgIH0KLQlwcm9wOwotCXN0cnVjdAotCSAgewotCSAgICBpbnQgbnVtOwkJLyogaW50ZXJuYWwgbnVtYmVyIG9mIGN5Y2xlIG9uICovCi0JICAgIHN0cnVjdCBzeW0gKmhlYWQ7CS8qIGhlYWQgb2YgY3ljbGUgKi8KLQkgICAgc3RydWN0IHN5bSAqbmV4dDsJLyogbmV4dCBtZW1iZXIgb2YgY3ljbGUgKi8KLQkgIH0KLQljeWM7Ci0Jc3RydWN0IGFyYyAqcGFyZW50czsJLyogbGlzdCBvZiBjYWxsZXIgYXJjcyAqLwotCXN0cnVjdCBhcmMgKmNoaWxkcmVuOwkvKiBsaXN0IG9mIGNhbGxlZSBhcmNzICovCi0gICAgICB9Ci0gICAgY2c7Ci0gIH0KLVN5bTsKLQotLyoKLSAqIFN5bWJvbC10YWJsZXMgYXJlIGFsd2F5cyBhc3N1bWVkIHRvIGJlIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyCi0gKiBvZiBhZGRyZXNzZXM6Ci0gKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbGVuOwkJLyogIyBvZiBzeW1ib2xzIGluIHRoaXMgdGFibGUgKi8KLSAgICBTeW0gKmJhc2U7CQkJLyogZmlyc3QgZWxlbWVudCBpbiBzeW1ib2wgdGFibGUgKi8KLSAgICBTeW0gKmxpbWl0OwkJCS8qIGxpbWl0ID0gYmFzZSArIGxlbiAqLwotICB9Ci1TeW1fVGFibGU7Ci0KLWV4dGVybiBTeW1fVGFibGUgc3ltdGFiOwkvKiB0aGUgc3ltYm9sIHRhYmxlICovCi0KLWV4dGVybiB2b2lkIHN5bV9pbml0IFBBUkFNUyAoKFN5bSAqIHN5bSkpOwotZXh0ZXJuIHZvaWQgc3ltdGFiX2ZpbmFsaXplIFBBUkFNUyAoKFN5bV9UYWJsZSAqIHN5bXRhYikpOwotZXh0ZXJuIFN5bSAqc3ltX2xvb2t1cCBQQVJBTVMgKChTeW1fVGFibGUgKiBzeW10YWIsIGJmZF92bWEgYWRkcmVzcykpOwotCi1leHRlcm4gdm9pZCBmaW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLQotI2VuZGlmIC8qIHN5bXRhYl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi90YWhvZS5jIGIvZ3Byb2YvdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0YjM1OC4uMDAwMDAwMAotLS0gYS9ncHJvZi90YWhvZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxsZicgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTEYJMHhmZQotCi0gICAgLyoKLSAgICAgKiAgICAgICAgcmVnaXN0ZXIgZm9yIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgICAgKi8KLSNkZWZpbmUJUEMJMHhmCi0KLWVudW0gdGFob2Vfb3Blcm1vZGVzCi0gIHsKLSAgICBsaXRlcmFsLCBpbmRleGVkLCByZWcsIHJlZ2RlZiwgYXV0b2RlYywgYXV0b2luYywgYXV0b2luY2RlZiwKLSAgICBieXRlZGlzcCwgYnl0ZWRpc3BkZWYsIHdvcmRkaXNwLCB3b3JkZGlzcGRlZiwgbG9uZ2Rpc3AsIGxvbmdkaXNwZGVmLAotICAgIGltbWVkaWF0ZSwgYWJzb2x1dGUsIGJ5dGVyZWwsIGJ5dGVyZWxkZWYsIHdvcmRyZWwsIHdvcmRyZWxkZWYsCi0gICAgbG9uZ3JlbCwgbG9uZ3JlbGRlZgotICB9OwotdHlwZWRlZiBlbnVtIHRhaG9lX29wZXJtb2RlcyB0YWhvZV9vcGVyYW5kZW51bTsKLQotLyoKLSAqIEEgc3ltYm9sIHRvIGJlIHRoZSBjaGlsZCBvZiBpbmRpcmVjdCBjYWxsZjoKLSAqLwotU3ltIGluZGlyZWN0Y2hpbGQ7Ci0KLQotdGFob2Vfb3BlcmFuZGVudW0KLXRhaG9lX29wZXJhbmRtb2RlIChtb2RlcCkKLSAgICAgdW5zaWduZWQgY2hhciAqbW9kZXA7Ci17Ci0gIGxvbmcgdXNlc3JlZyA9ICgobG9uZykgKm1vZGVwKSAmIDB4ZjsKLQotICBzd2l0Y2ggKCgobG9uZykgKm1vZGVwKSA+PiA0KQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gaW5kZXhlZDsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gcmVnOwotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiByZWdkZWY7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIGF1dG9kZWM7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gMHhlID8gYXV0b2luYyA6IGltbWVkaWF0ZTsKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGF1dG9pbmNkZWYgOiBhYnNvbHV0ZTsKLSAgICBjYXNlIDEwOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcCA6IGJ5dGVyZWw7Ci0gICAgY2FzZSAxMToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYnl0ZWRpc3BkZWYgOiBieXRlcmVsZGVmOwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwIDogd29yZHJlbDsKLSAgICBjYXNlIDEzOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyB3b3JkZGlzcGRlZiA6IHdvcmRyZWxkZWY7Ci0gICAgY2FzZSAxNDoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3AgOiBsb25ncmVsOwotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGxvbmdkaXNwZGVmIDogbG9uZ3JlbGRlZjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLWNoYXIgKgotdGFob2Vfb3BlcmFuZG5hbWUgKG1vZGUpCi0gICAgIHRhaG9lX29wZXJhbmRlbnVtIG1vZGU7Ci17Ci0KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBjYXNlIGxpdGVyYWw6Ci0gICAgICByZXR1cm4gImxpdGVyYWwiOwotICAgIGNhc2UgaW5kZXhlZDoKLSAgICAgIHJldHVybiAiaW5kZXhlZCI7Ci0gICAgY2FzZSByZWc6Ci0gICAgICByZXR1cm4gInJlZ2lzdGVyIjsKLSAgICBjYXNlIHJlZ2RlZjoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIgZGVmZXJyZWQiOwotICAgIGNhc2UgYXV0b2RlYzoKLSAgICAgIHJldHVybiAiYXV0b2RlY3JlbWVudCI7Ci0gICAgY2FzZSBhdXRvaW5jOgotICAgICAgcmV0dXJuICJhdXRvaW5jcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmNkZWY6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2UgYnl0ZWRpc3A6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotICAgICAgcmV0dXJuICJieXRlIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuICJieXRlIHJlbGF0aXZlIjsKLSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIGNhc2Ugd29yZGRpc3A6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIHdvcmRkaXNwZGVmOgotICAgICAgcmV0dXJuICJ3b3JkIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkcmVsOgotICAgICAgcmV0dXJuICJ3b3JkIHJlbGF0aXZlIjsKLSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIGNhc2UgaW1tZWRpYXRlOgotICAgICAgcmV0dXJuICJpbW1lZGlhdGUiOwotICAgIGNhc2UgYWJzb2x1dGU6Ci0gICAgICByZXR1cm4gImFic29sdXRlIjsKLSAgICBjYXNlIGxvbmdkaXNwOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCI7Ci0gICAgY2FzZSBsb25nZGlzcGRlZjoKLSAgICAgIHJldHVybiAibG9uZyBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2UgbG9uZ3JlbDoKLSAgICAgIHJldHVybiAibG9uZyByZWxhdGl2ZSI7Ci0gICAgY2FzZSBsb25ncmVsZGVmOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIGRlZmVycmVkIjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLWxvbmcKLXRhaG9lX29wZXJhbmRsZW5ndGggKG1vZGVwKQotICAgICB1bnNpZ25lZCBjaGFyICptb2RlcDsKLXsKLQotICBzd2l0Y2ggKHRhaG9lX29wZXJhbmRtb2RlIChtb2RlcCkpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICBjYXNlIHJlZzoKLSAgICBjYXNlIHJlZ2RlZjoKLSAgICBjYXNlIGF1dG9kZWM6Ci0gICAgY2FzZSBhdXRvaW5jOgotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgYnl0ZWRpc3A6Ci0gICAgY2FzZSBieXRlZGlzcGRlZjoKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgY2FzZSBieXRlcmVsZGVmOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICBjYXNlIHdvcmRkaXNwZGVmOgotICAgIGNhc2Ugd29yZHJlbDoKLSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIGltbWVkaWF0ZToKLSAgICBjYXNlIGFic29sdXRlOgotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgY2FzZSBsb25nZGlzcGRlZjoKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgY2FzZSBsb25ncmVsZGVmOgotICAgICAgcmV0dXJuIDU7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuIDEgKyB0YWhvZV9vcGVyYW5kbGVuZ3RoIChtb2RlcCArIDEpOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotYmZkX3ZtYQotdGFob2VfcmVsYWRkciAobW9kZXApCi0gICAgIGNoYXIgKm1vZGVwOwotewotICB0YWhvZV9vcGVyYW5kZW51bSBtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKTsKLSAgY2hhciAqY3A7Ci0gIHNob3J0ICpzcDsKLSAgbG9uZyAqbHA7Ci0gIGludCBpOwotICBsb25nIHZhbHVlID0gMDsKLQotICBjcCA9IG1vZGVwOwotICArK2NwOwkJCQkvKiBza2lwIG92ZXIgdGhlIG1vZGUgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3JlbGFkZHJdIG5vdCByZWxhdGl2ZSBhZGRyZXNzXG4iKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgbW9kZXA7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmNwICsgKmNwKTsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICBmb3IgKGkgPSAwOyAoc2l6ZV90KSBpIDwgc2l6ZW9mICpzcDsgaSsrKQotCXZhbHVlID0gKHZhbHVlIDw8IDgpICsgKGNwW2ldICYgMHhmZik7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqc3AgKyB2YWx1ZSk7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgZm9yIChpID0gMDsgKHNpemVfdCkgaSA8IHNpemVvZiAqbHA7IGkrKykKLQl2YWx1ZSA9ICh2YWx1ZSA8PCA4KSArIChjcFtpXSAmIDB4ZmYpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmxwICsgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZAotdGFob2VfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICB1bnNpZ25lZCBjaGFyICppbnN0cnVjdHA7Ci0gIGxvbmcgbGVuZ3RoOwotICBTeW0gKmNoaWxkOwotICB0YWhvZV9vcGVyYW5kZW51bSBtb2RlOwotICB0YWhvZV9vcGVyYW5kZW51bSBmaXJzdG1vZGU7Ci0gIGJmZF92bWEgZGVzdHBjOwotICBzdGF0aWMgYm9vbCBpbml0ZWQgPSBGQUxTRTsKLQotICBpZiAoIWluaXRlZCkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSBUUlVFOwotICAgICAgc3ltX2luaXQgKCZpbmRpcmVjdGNoaWxkKTsKLSAgICAgIGluZGlyZWN0Y2hpbGQuY2cucHJvcC5mcmFjdCA9IDEuMDsKLSAgICAgIGluZGlyZWN0Y2hpbGQuY2cuY3ljLmhlYWQgPSAmaW5kaXJlY3RjaGlsZDsKLSAgICB9Ci0KLSAgaWYgKGNvcmVfdGV4dF9zcGFjZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIsCi0JCQkgIHBhcmVudC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHBfbG93cGMsCi0JCQkgICh1bnNpZ25lZCBsb25nKSBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfbG93cGM7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9oaWdocGM7Ci0gICAgICAgaW5zdHJ1Y3RwICs9IGxlbmd0aCkKLSAgICB7Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgaWYgKCppbnN0cnVjdHAgPT0gQ0FMTEYpCi0JewotCSAgLyoKLQkgICAqICAgIG1heWJlIGEgY2FsbGYsIGJldHRlciBjaGVjayBpdCBvdXQuCi0JICAgKiAgICAgIHNraXAgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXVx0MHgleDpjYWxsZiIsCi0JCQkJICBpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UpKTsKLQkgIGZpcnN0bW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgc3dpdGNoIChmaXJzdG1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBsaXRlcmFsOgotCSAgICBjYXNlIGltbWVkaWF0ZToKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIH0KLQkgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgbW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIlx0Zmlyc3Qgb3BlcmFuZCBpcyAlcyIsIHRhaG9lX29wZXJhbmRuYW1lIChmaXJzdG1vZGUpKTsKLQkgICAgICAgcHJpbnRmICgiXHRzZWNvbmQgb3BlcmFuZCBpcyAlc1xuIiwgdGFob2Vfb3BlcmFuZG5hbWUgKG1vZGUpKTsKLQkgICAgKTsKLQkgIHN3aXRjaCAobW9kZSkKLQkgICAgewotCSAgICBjYXNlIHJlZ2RlZjoKLQkgICAgY2FzZSBieXRlZGlzcGRlZjoKLQkgICAgY2FzZSB3b3JkZGlzcGRlZjoKLQkgICAgY2FzZSBsb25nZGlzcGRlZjoKLQkgICAgY2FzZSBieXRlcmVsZGVmOgotCSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0JICAgIGNhc2UgbG9uZ3JlbGRlZjoKLQkgICAgICAvKgotCSAgICAgICAqICAgIGluZGlyZWN0IGNhbGw6IGNhbGwgdGhyb3VnaCBwb2ludGVyCi0JICAgICAgICogICAgICBlaXRoZXIgICpkKHIpICAgYXMgYSBwYXJhbWV0ZXIgb3IgbG9jYWwKLQkgICAgICAgKiAgICAgICAgICAgICAgKHIpICAgICBhcyBhIHJldHVybiB2YWx1ZQotCSAgICAgICAqICAgICAgICAgICAgICAqZiAgICAgIGFzIGEgZ2xvYmFsIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIFthcmUgdGhlcmUgb3RoZXJzIHRoYXQgd2UgbWlzcz8sCi0JICAgICAgICogICAgICAgZS5nLiBhcnJheXMgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zPz8/XQotCSAgICAgICAqLwotCSAgICAgIGFyY19hZGQgKHBhcmVudCwgJmluZGlyZWN0Y2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkgICAgICBsZW5ndGggKz0gdGFob2Vfb3BlcmFuZGxlbmd0aCAoaW5zdHJ1Y3RwICsgbGVuZ3RoKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBieXRlcmVsOgotCSAgICBjYXNlIHdvcmRyZWw6Ci0JICAgIGNhc2UgbG9uZ3JlbDoKLQkgICAgICAvKgotCSAgICAgICAqICAgIHJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotCSAgICAgICAqICAgICAgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIAotCSAgICAgICAqICAgICAgYSBmdW5jdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBkZXN0cGMgPSB0YWhvZV9yZWxhZGRyIChpbnN0cnVjdHAgKyBsZW5ndGgpCi0JCS0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZTsKLQkgICAgICBpZiAoZGVzdHBjID49IHNfbG93cGMgJiYgZGVzdHBjIDw9IHNfaGlnaHBjKQotCQl7Ci0JCSAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0cGMpOwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiW2ZpbmRjYWxsXVx0ZGVzdHBjIDB4JWx4IiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgZGVzdHBjKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+bmFtZSAlcyIsIGNoaWxkLT5uYW1lKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+YWRkciAweCVseFxuIiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgY2hpbGQtPmFkZHIpOwotCQkgICAgKTsKLQkJICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdHBjKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgICBhIGhpdAotCQkgICAgICAgKi8KLQkJICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgICAgICBsZW5ndGggKz0gdGFob2Vfb3BlcmFuZGxlbmd0aCAoaW5zdHJ1Y3RwICsgbGVuZ3RoKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZ290byBib3RjaGVkOwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBlbHNlOgotCSAgICAgICAqICAgICAgaXQgbG9va2VkIGxpa2UgYSBjYWxsZiwKLQkgICAgICAgKiAgICAgIGJ1dCBpdCB3YXNuJ3QgdG8gYW55d2hlcmUuCi0JICAgICAgICovCi0JICAgICAgZ290byBib3RjaGVkOwotCSAgICBkZWZhdWx0OgotCSAgICBib3RjaGVkOgotCSAgICAgIC8qCi0JICAgICAgICogICAgc29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICAgICAqLwotCSAgICAgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICAgICAgbGVuZ3RoID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi91dGlscy5jIGIvZ3Byb2YvdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmMDMxZC4uMDAwMDAwMAotLS0gYS9ncHJvZi91dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSA8ZGVtYW5nbGUuaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotCi0vKgotICogUHJpbnQgbmFtZSBvZiBzeW1ib2wuICBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KLSAqLwotaW50Ci1ERUZVTiAocHJpbnRfbmFtZV9vbmx5LCAoc2VsZiksIFN5bSAqIHNlbGYpCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBzZWxmLT5uYW1lOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqZGVtYW5nbGVkID0gMDsKLSAgY2hhciBidWZbUEFUSF9NQVhdOwotICBpbnQgc2l6ZSA9IDA7Ci0KLSAgaWYgKG5hbWUpCi0gICAgewotICAgICAgaWYgKCFic2Rfc3R5bGVfb3V0cHV0KQotCXsKLQkgIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdICYmIGRpc2NhcmRfdW5kZXJzY29yZXMpCi0JICAgIHsKLQkgICAgICBuYW1lKys7Ci0JICAgIH0KLQkgIGlmIChkZW1hbmdsZSkKLQkgICAgewotCSAgICAgIGRlbWFuZ2xlZCA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0JICAgICAgaWYgKGRlbWFuZ2xlZCkKLQkJewotCQkgIG5hbWUgPSBkZW1hbmdsZWQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoIiVzIiwgbmFtZSk7Ci0gICAgICBzaXplID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChsaW5lX2dyYW51bGFyaXR5ICYmIHNlbGYtPmZpbGUpCi0JewotCSAgZmlsZW5hbWUgPSBzZWxmLT5maWxlLT5uYW1lOwotCSAgaWYgKCFwcmludF9wYXRoKQotCSAgICB7Ci0JICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkgICAgICBpZiAoZmlsZW5hbWUpCi0JCXsKLQkJICArK2ZpbGVuYW1lOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZmlsZW5hbWUgPSBzZWxmLT5maWxlLT5uYW1lOwotCQl9Ci0JICAgIH0KLQkgIHNwcmludGYgKGJ1ZiwgIiAoJXM6JWQpIiwgZmlsZW5hbWUsIHNlbGYtPmxpbmVfbnVtKTsKLQkgIHByaW50ZiAoYnVmKTsKLQkgIHNpemUgKz0gc3RybGVuIChidWYpOwotCX0KLSAgICAgIGlmIChkZW1hbmdsZWQpCi0JewotCSAgZnJlZSAoZGVtYW5nbGVkKTsKLQl9Ci0gICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJ7JWR9ICIsIHNlbGYtPmNnLnRvcF9vcmRlcikpOwotICAgICAgREJHIChQUk9QREVCVUcsIHByaW50ZiAoIiU0LjBmJSUgIiwgMTAwLjAgKiBzZWxmLT5jZy5wcm9wLmZyYWN0KSk7Ci0gICAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotCi12b2lkCi1ERUZVTiAocHJpbnRfbmFtZSwgKHNlbGYpLCBTeW0gKiBzZWxmKQotewotICBwcmludF9uYW1lX29ubHkgKHNlbGYpOwotCi0gIGlmIChzZWxmLT5jZy5jeWMubnVtICE9IDApCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgPGN5Y2xlICVkPiIpLCBzZWxmLT5jZy5jeWMubnVtKTsKLSAgICB9Ci0gIGlmIChzZWxmLT5jZy5pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzZWxmLT5jZy5wcmludF9mbGFnKQotCXsKLQkgIHByaW50ZiAoIiBbJWRdIiwgc2VsZi0+Y2cuaW5kZXgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIgKCVkKSIsIHNlbGYtPmNnLmluZGV4KTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvdXRpbHMuaCBiL2dwcm9mL3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZmI5YzYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiB1dGlsc19oCi0jZGVmaW5lIHV0aWxzX2gKLQotZXh0ZXJuIGludCBwcmludF9uYW1lX29ubHkgUEFSQU1TICgoU3ltICogc2VsZikpOwotZXh0ZXJuIHZvaWQgcHJpbnRfbmFtZSBQQVJBTVMgKChTeW0gKiBzZWxmKSk7Ci0KLSNlbmRpZiAvKiB1dGlsc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi92YXguYyBiL2dwcm9mL3ZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2ZkZjQzLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3ZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxscycgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTFMJMHhmYgotCi0gICAgLyoKLSAgICAgKiAgICAgICAgcmVnaXN0ZXIgZm9yIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgICAgKi8KLSNkZWZpbmUJUEMJMHhmCi0KLWVudW0gb3Blcm1vZGVzCi0gIHsKLSAgICBsaXRlcmFsLCBpbmRleGVkLCByZWcsIHJlZ2RlZiwgYXV0b2RlYywgYXV0b2luYywgYXV0b2luY2RlZiwKLSAgICBieXRlZGlzcCwgYnl0ZWRpc3BkZWYsIHdvcmRkaXNwLCB3b3JkZGlzcGRlZiwgbG9uZ2Rpc3AsIGxvbmdkaXNwZGVmLAotICAgIGltbWVkaWF0ZSwgYWJzb2x1dGUsIGJ5dGVyZWwsIGJ5dGVyZWxkZWYsIHdvcmRyZWwsIHdvcmRyZWxkZWYsCi0gICAgbG9uZ3JlbCwgbG9uZ3JlbGRlZgotICB9OwotdHlwZWRlZiBlbnVtIG9wZXJtb2RlcyBvcGVyYW5kZW51bTsKLQotc3RydWN0IG1vZGVieXRlCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgcmVnZmllbGQ6NDsKLSAgICB1bnNpZ25lZCBpbnQgbW9kZWZpZWxkOjQ7Ci0gIH07Ci0KLS8qCi0gKiBBIHN5bWJvbCB0byBiZSB0aGUgY2hpbGQgb2YgaW5kaXJlY3QgY2FsbHM6Ci0gKi8KLVN5bSBpbmRpcmVjdGNoaWxkOwotCi0KLXN0YXRpYyBvcGVyYW5kZW51bQotdmF4X29wZXJhbmRtb2RlIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLSAgbG9uZyB1c2VzcmVnID0gbW9kZXAtPnJlZ2ZpZWxkOwotCi0gIHN3aXRjaCAobW9kZXAtPm1vZGVmaWVsZCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIGluZGV4ZWQ7Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIHJlZzsKLSAgICBjYXNlIDY6Ci0gICAgICByZXR1cm4gcmVnZGVmOwotICAgIGNhc2UgNzoKLSAgICAgIHJldHVybiBhdXRvZGVjOwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luYyA6IGltbWVkaWF0ZTsKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGF1dG9pbmNkZWYgOiBhYnNvbHV0ZTsKLSAgICBjYXNlIDEwOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcCA6IGJ5dGVyZWw7Ci0gICAgY2FzZSAxMToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYnl0ZWRpc3BkZWYgOiBieXRlcmVsZGVmOwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwIDogd29yZHJlbDsKLSAgICBjYXNlIDEzOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyB3b3JkZGlzcGRlZiA6IHdvcmRyZWxkZWY7Ci0gICAgY2FzZSAxNDoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3AgOiBsb25ncmVsOwotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGxvbmdkaXNwZGVmIDogbG9uZ3JlbGRlZjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXZheF9vcGVyYW5kbmFtZSAobW9kZSkKLSAgICAgb3BlcmFuZGVudW0gbW9kZTsKLXsKLQotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICAgIHJldHVybiAibGl0ZXJhbCI7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuICJpbmRleGVkIjsKLSAgICBjYXNlIHJlZzoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIiOwotICAgIGNhc2UgcmVnZGVmOgotICAgICAgcmV0dXJuICJyZWdpc3RlciBkZWZlcnJlZCI7Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgICAgcmV0dXJuICJhdXRvZGVjcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUiOwotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUiOwotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgICByZXR1cm4gImltbWVkaWF0ZSI7Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICAgIHJldHVybiAiYWJzb2x1dGUiOwotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIjsKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGxvbmcKLXZheF9vcGVyYW5kbGVuZ3RoIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLQotICBzd2l0Y2ggKHZheF9vcGVyYW5kbW9kZSAobW9kZXApKQotICAgIHsKLSAgICBjYXNlIGxpdGVyYWw6Ci0gICAgY2FzZSByZWc6Ci0gICAgY2FzZSByZWdkZWY6Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgIGNhc2UgYXV0b2luYzoKLSAgICBjYXNlIGF1dG9pbmNkZWY6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIGJ5dGVkaXNwOgotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgY2FzZSBieXRlcmVsOgotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2Ugd29yZGRpc3A6Ci0gICAgY2FzZSB3b3JkZGlzcGRlZjoKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgY2FzZSB3b3JkcmVsZGVmOgotICAgICAgcmV0dXJuIDM7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICBjYXNlIGxvbmdkaXNwOgotICAgIGNhc2UgbG9uZ2Rpc3BkZWY6Ci0gICAgY2FzZSBsb25ncmVsOgotICAgIGNhc2UgbG9uZ3JlbGRlZjoKLSAgICAgIHJldHVybiA1OwotICAgIGNhc2UgaW5kZXhlZDoKLSAgICAgIHJldHVybiAxICsgdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKChjaGFyICopIG1vZGVwKSArIDEpOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGJmZF92bWEKLXZheF9yZWxhZGRyIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLSAgb3BlcmFuZGVudW0gbW9kZSA9IHZheF9vcGVyYW5kbW9kZSAobW9kZXApOwotICBjaGFyICpjcDsKLSAgc2hvcnQgKnNwOwotICBsb25nICpscDsKLQotICBjcCA9IChjaGFyICopIG1vZGVwOwotICArK2NwOwkJCQkvKiBza2lwIG92ZXIgdGhlIG1vZGUgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3JlbGFkZHJdIG5vdCByZWxhdGl2ZSBhZGRyZXNzXG4iKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgbW9kZXA7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmNwICsgKmNwKTsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICBzcCA9IChzaG9ydCAqKSBjcDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpzcCArICpzcCk7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgbHAgPSAobG9uZyAqKSBjcDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpscCArICpscCk7Ci0gICAgfQotfQotCi0KLXZvaWQKLXZheF9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgbG9uZyBsZW5ndGg7Ci0gIFN5bSAqY2hpbGQ7Ci0gIG9wZXJhbmRlbnVtIG1vZGU7Ci0gIG9wZXJhbmRlbnVtIGZpcnN0bW9kZTsKLSAgYmZkX3ZtYSBkZXN0cGM7Ci0gIHN0YXRpYyBib29sIGluaXRlZCA9IEZBTFNFOwotCi0gIGlmICghaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IFRSVUU7Ci0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0Y2hpbGQpOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5jeWMuaGVhZCA9ICZpbmRpcmVjdGNoaWxkOwotICAgIH0KLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCAodW5zaWduZWQgbG9uZykgcF9sb3dwYywKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBfaGlnaHBjKSk7Ci0gIGZvciAoaW5zdHJ1Y3RwID0gKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9sb3dwYzsKLSAgICAgICBpbnN0cnVjdHAgPCAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UgKyBwX2hpZ2hwYzsKLSAgICAgICBpbnN0cnVjdHAgKz0gbGVuZ3RoKQotICAgIHsKLSAgICAgIGxlbmd0aCA9IDE7Ci0gICAgICBpZiAoKmluc3RydWN0cCA9PSBDQUxMUykKLQl7Ci0JICAvKgotCSAgICogICAgbWF5YmUgYSBjYWxscywgYmV0dGVyIGNoZWNrIGl0IG91dC4KLQkgICAqICAgICAgc2tpcCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCi0JICAgKi8KLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGxzIiwKLQkJICAgICAgIGluc3RydWN0cCAtICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSkpOwotCSAgZmlyc3Rtb2RlID0gdmF4X29wZXJhbmRtb2RlICgoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgIHN3aXRjaCAoZmlyc3Rtb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgbGl0ZXJhbDoKLQkgICAgY2FzZSBpbW1lZGlhdGU6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBib3RjaGVkOwotCSAgICB9Ci0JICBsZW5ndGggKz0gdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCSAgbW9kZSA9IHZheF9vcGVyYW5kbW9kZSAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmICgiXHRmaXJzdCBvcGVyYW5kIGlzICVzIiwgdmF4X29wZXJhbmRuYW1lIChmaXJzdG1vZGUpKTsKLQkgICAgICAgcHJpbnRmICgiXHRzZWNvbmQgb3BlcmFuZCBpcyAlc1xuIiwgdmF4X29wZXJhbmRuYW1lIChtb2RlKSkpOwotCSAgc3dpdGNoIChtb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgcmVnZGVmOgotCSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotCSAgICBjYXNlIHdvcmRkaXNwZGVmOgotCSAgICBjYXNlIGxvbmdkaXNwZGVmOgotCSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0JICAgIGNhc2Ugd29yZHJlbGRlZjoKLQkgICAgY2FzZSBsb25ncmVsZGVmOgotCSAgICAgIC8qCi0JICAgICAgICogICAgaW5kaXJlY3QgY2FsbDogY2FsbCB0aHJvdWdoIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIGVpdGhlciAgKmQocikgICBhcyBhIHBhcmFtZXRlciBvciBsb2NhbAotCSAgICAgICAqICAgICAgICAgICAgICAocikgICAgIGFzIGEgcmV0dXJuIHZhbHVlCi0JICAgICAgICogICAgICAgICAgICAgICpmICAgICAgYXMgYSBnbG9iYWwgcG9pbnRlcgotCSAgICAgICAqICAgICAgW2FyZSB0aGVyZSBvdGhlcnMgdGhhdCB3ZSBtaXNzPywKLQkgICAgICAgKiAgICAgICBlLmcuIGFycmF5cyBvZiBwb2ludGVycyB0byBmdW5jdGlvbnM/Pz9dCi0JICAgICAgICovCi0JICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCSAgICAgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoCi0JCQkJICAoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBieXRlcmVsOgotCSAgICBjYXNlIHdvcmRyZWw6Ci0JICAgIGNhc2UgbG9uZ3JlbDoKLQkgICAgICAvKgotCSAgICAgICAqICAgIHJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotCSAgICAgICAqICAgICAgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIAotCSAgICAgICAqICAgICAgYSBmdW5jdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBkZXN0cGMgPSB2YXhfcmVsYWRkciAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSkKLQkJLSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlOwotCSAgICAgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JCXsKLQkJICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JCSAgREJHIChDQUxMREVCVUcsCi0JCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHRkZXN0cGMgMHglbHgiLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkZXN0cGMpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5uYW1lICVzIiwgY2hpbGQtPm5hbWUpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5hZGRyIDB4JWx4XG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGlsZC0+YWRkcik7Ci0JCSAgICApOwotCQkgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0cGMpCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqICAgIGEgaGl0Ci0JCSAgICAgICAqLwotCQkgICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgICAgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoKHN0cnVjdCBtb2RlYnl0ZSAqKQotCQkJCQkJICAgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICBnb3RvIGJvdGNoZWQ7Ci0JCX0KLQkgICAgICAvKgotCSAgICAgICAqICAgIGVsc2U6Ci0JICAgICAgICogICAgICBpdCBsb29rZWQgbGlrZSBhIGNhbGxzLAotCSAgICAgICAqICAgICAgYnV0IGl0IHdhc24ndCB0byBhbnl3aGVyZS4KLQkgICAgICAgKi8KLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGJvdGNoZWQ6Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBzb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCi0JICAgICAgICovCi0JICAgICAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF1cdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKLQkgICAgICBsZW5ndGggPSAxOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvQ09QWUlORyBiL2luY2x1ZGUvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NDliZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9pbmNsdWRlL0NoYW5nZUxvZyBiL2luY2x1ZGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTBiYjNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTU0NSArMCwwIEBACi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQWRkIGluaXRfZnVuY3Rpb24gYW5kCi0JZmluaV9mdW5jdGlvbi4KLQotMTk5OS0wNi0yMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogbWlwcy5oIChFbGYzMl9JbnRlcm5hbF9Nc3ltKTogTmV3IHN0cnVjdHVyZS4KLQkoRWxmMzJfRXh0ZXJuYWxfTXN5bSk6IExpa2V3aXNlLgotCShFTEYzMl9NU19SRUxfSU5ERVgpOiBOZXcgbWFjcm8uCi0JKEVMRjMyX01TX0ZMQUdTKTogTGlrZXdpc2UuCi0JKEVMRjMyX01TX0lORk8pOiBMaWtld2lzZS4KLQkKLTE5OTktMDYtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoYXJtX3RvZ2dsZV9yZWduYW1lcyk6IE5ldyBwcm90b3R5cGUuCi0JKHN0cnVjdCBkaWFzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQ6IGRpc2Fzc2VtYmxlcl9vcHRpb25zLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9lbGZfdmVyc2lvbl9leHByKTogUmVuYW1lIGBtYXRjaCcgdG8gYHBhdHRlcm4nLgotCUFkZCBgbWF0Y2gnIGNhbGxiYWNrIGZ1bmN0aW9uLgotCi0xOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2luZm8pOiBBZGQgbm9fdW5kZWZpbmVkLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcm90b3R5cGUgZm9yIHByaW50X2luc25fbWNvcmUuCi0KLTE5OTktMDQtMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzKTogRGVjbGFyZS4KLQotMTk5OS0wMy0zMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogc3BsYXktdHJlZS5oIChzcGxheV90cmVlX2NvbXBhcmVfaW50cyk6IERlY2xhcmUuCi0KLVdlZCBNYXIgMjQgMTI6NDY6MjkgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBhbXkuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQ3lnd2lueywzMn0gc2hvdWxkIGhhdmUgdGhlIHByb3RvdHlwZS4KLQotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoYmZkX2xpbmtfaW5mbyk6IGFkZCBmaWVsZCAibXBjODYwYzAiLgotCi1Nb24gRmViICAxIDIxOjA1OjQ2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBkaXMtYXNtLmggKHByaW50X2luc25faTM4Nl9hdHQpOiAgRGVjbGFyZS4KLSAgICAgICAocHJpbnRfaW5zbl9pMzg2X2ludGVsKTogIERlY2xhcmUuCi0KLTk5OC0xMi0zMCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBDYXN0IFNUUkVBTSBhbmQKLQlGUFJJTlRGX0ZVTkMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLVdlZCBEZWMgMzAgMTY6MDc6MTQgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogY2hhbmdlIHZvaWQgKiB0byBQVFIgKHR3byBwbGFjZXMpLgotCi1Nb24gRGVjIDE0IDA5OjUzOjMxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogZGVtYW5nbGUuaDogRG9uJ3QgY2hlY2sgSU5fR0NDIGFueW1vcmUuCi0JKiBzcGxheS10cmVlLmg6IExpa2V3aXNlLgotCi1UdWUgRGVjICA4IDAwOjMwOjMxIDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gCi0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IEVsZW5hIFphbm5vbmkKLSAJPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiBhbmQgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluCi0gCWNoYW5nZXMgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBjaGFuZ2UgdGhlIHR5cGUgb2Ygc3RyZWFtCi0JZnJvbSBGSUxFKiB0byB2b2lkKiwgZm9yIHVzZSB3aXRoIGdkYidzIG5ldyB0eXBlIEdEQl9GSUxFLgotCShmcHJpbnRmX2Z0eXBlKTogY2hhbmdlIEZJTEUqIHBhcmFtZXRlciB0eXBlIHRvIHZvaWQqLgotCi0gICAgICAgICogZGVtYW5nbGUuaDogKERNR0xfRURHKTogbmV3IG1hY3JvIGZvciBLdWNrIGFuZCBBc3NvY2lhdGVzCi0gICAgICAgIChETUdMX1NUWUxFX01BU0spOiBtb2RpZnkgdG8gaW5jbHVkZSBLdWNrIGFuZCBBc3NvYyBzdHlsZQotICAgICAgICAoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGVkZ19kZW1hbmdsaW5nIHN0eWxlCi0gICAgICAgIChFREdfREVNQU5HTElOR19TVFlMRV9TVFJJTkcpOiBuZXcgbWFjcm8KLSAgICAgICAgKEVER19ERU1BTkdMSU5HKTogbmV3IG1hY3JvCi0KLSAgICAgICAgKiBkZW1hbmdsZS5oIChETUdMX0hQKTogbmV3IG1hY3JvLCBmb3IgSFAvYUNDIGNvbXBpbGVyLgotICAgICAgICAoRE1HTF9TVFlMRV9NQVNLKTogbW9kaWZ5IHRvIGluY2x1ZGUgbmV3IEhQJ3Mgc3R5bGUuCi0gICAgICAgIChkZW1hbmdsaW5nX3N0eWxlcyk6IGFkZCBuZXcgaHBfZGVtYW5nbGluZyB2YWx1ZS4KLSAgICAgICAgKEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTogbmV3IG1hY3JvLgotICAgICAgICAoQVJNX0RFTUFOR0xJTkcpOiBjb2VyY2UgdG8gaW50LgotICAgICAgICAoSFBfREVNQU5HTElORyk6IG5ldyBtYWNyby4KLQotCSogaHAtc3ltdGFiLmg6IHJld3JpdHRlbiwgZnJvbSBIUC4KLQkocXVpY2tfcHJvY2VkdXJlKTogY2hhbmdlIHR5cGUgb2YgbGFuZ3VhZ2UgZmllbGQgdG8gdW5zaWduZWQgaW50Ci0JKHF1aWNrX21vZHVsZSk6IGNoYW5nZSB0eXBlIG9mIGxhbmd1YWdlIGZpZWxkIHRvIHVuc2lnbmVkIGludAotCShzdHJ1Y3QgZG50dF90eXBlX3N2YXIpOiBhZGQgZmllbGQgdGhyZWFkX3NwZWNpZmljLgotCShocF9sYW5ndWFnZSk6IGFkZCBsYW5ndWFnZXMgbW9kY2FsIGFuZCBkbXBhc2NhbC4KLQotTW9uIE5vdiAzMCAxNToyNTo1OCAxOTk4ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZi9zaC5oIChlbGZfc2hfcmVsb2NfdHlwZSk6IEFkZCBSX1NIX0ZJUlNUX0lOVkFMSURfUkVMT0MsCi0JUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MsIFJfU0hfU1dJVENIOCBhbmQgUl9TSF9tYXguCi0KLUZyaSBOb3YgMjAgMTM6MTQ6MDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoYmFzZW5hbWUpOiBBZGQgcHJvdG90eXBlIGZvciBGcmVlQlNELgotCi1GcmkgTm92IDEzIDE5OjE5OjExIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogbGliaWJlcnR5Lmg6IFByb3RvdHlwZSB4Y2FsbG9jLgotCi1TdW4gTm92ICA4IDE3OjQyOjI1IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogYW5zaWRlY2wuaDogV3JhcCBwcm9ibGVtYXRpYyBtYWNyb3Mgd2l0aCAhSU5fR0NDLgotCi0JKiBkZW1hbmdsZS5oOiBOZXZlciBkZWZpbmUgUEFSQU1TKCkuCi0JKiBzcGxheS10cmVlLmg6IExpa2V3aXNlLgotCi1TYXQgTm92ICA3IDE4OjMwOjIwIDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXRlci5zY2hhdWVyQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl92YXgpOiBEZWNsYXJlLgotCi1TYXQgTm92ICA3IDE2OjA0OjAzIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogZGVtYW5nbGUuaDogRG9uJ3QgaW5jbHVkZSBnYW5zaWRlY2wuaC4KLQkqIHNwbGF5LXRyZWUuaDogTGlrZXdpc2UuCi0KLTE5OTgtMTAtMjYgMTY6MDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIG5ldyBmaWVsZCBvcHRpbWl6ZS4KLQotVGh1IE9jdCAyMiAxOTo1ODowMCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHNwbGF5LXRyZWUuaDogV3JhcCBmdW5jdGlvbiBwb2ludGVyIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMgaW4KLQlQQVJBTVMoKSBtYWNyby4KLQotMTk5OC0xMC0yMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogc3BsYXktdHJlZS5oOiBOZXcgZmlsZS4KLQotRnJpIE9jdCAgOSAwMDowMjowMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1lcmdlIGRldm8gYW5kIGVnY3MgaW5jbHVkZSBkaXJlY3Rvcmllcy4KLQotU2F0IFNlcCAgNSAxMjoxNjozMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oLCBvYnN0YWNrLmg6IFVwZGF0ZWQgZnJvbSBnY2MuCi0KLTE5OTgtMDgtMDMgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogbGliaWJlcnR5LmggKHhleGl0KTogQ2hhbmdlIGRlY2wgdG8gdXNlIG1vZGVybiBHQ0MgYXR0cmlidXRlCi0JdG8gaW5kaWNhdGUgZXhpdCBkb2VzIG5vdCByZXR1cm4uCi0KLU1vbiBKdW4gIDEgMTM6NDg6MzIgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotVHVlIE1heSAyNiAyMDo1Nzo0MyAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBlbGYvc3BhcmMuaCAoRUZfU1BBUkNfTEVEQVRBLCBSX1NQQVJDXzMyTEUpOiBBZGRlZC4KLQotVHVlIEZlYiAyNCAxMzowNTowMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGRpc2Fzc2VtYmxlX2luZm8pOiBNZW1iZXIgYHN5bWJvbCcgcmVuYW1lZCB0byBgc3ltYm9scycKLQlhbmQgbWFkZSBhbiAiYXN5bWJvbCAqKiIuICBOZXcgbWVtYmVyIG51bV9zeW1ib2xzLgotCShJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSCk6IFVwZGF0ZS4KLQotVHVlIEZlYiAxNyAxMjozMjoxOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOiBBZGQKLSAJcmVnaXN0ZXIgbGVuZ3RoIHBhcmFtZXRlci4gIEZ1bmN0aW9ucyByZXR1cm4gYWN0dWFsIGxlbmd0aCBvZgotIAlyZWdpc3Rlci4KLQotVGh1IEZlYiAxMiAxNjoyOTowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdldG9wdC5oOiBVcGRhdGUgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi1XZWQgRmViIDExIDE2OjU2OjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHN5bWNhdC5oOiBOZXcgZmlsZS4KLQotTW9uIEZlYiAgMiAxNzoxMzozMSAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdGljMzApOiBEZWNsYXJlLgotCi1UaHUgSmFuIDIyIDE2OjIzOjU5IDE5OTggIEZyZWQgRmlzaCA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogQWRkIGZsYWcgSU5TTl9IQVNfUkVMT0MgdG8gdGVsbCBkaXNhc3NlbWJseQotCWZ1bmN0aW9uIHRoZXJlIGlzIGEgcmVsb2Mgb24gdGhpcyBsaW5lLgotCi1Nb24gRGVjICA4IDExOjIyOjIzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogUmVtb3ZlIHByb3RvdHlwZSBvZiBkaXNhc21fc3ltYWRkcigpIGFzIHRoaXMgZnVuY3Rpb24KLQlubyBsb25nZXIgZXhpc3RzLgotCi1UdWUgRGVjICAyIDEwOjIwOjUzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoZGlzYXNtX3N5bWFkZHIpOiBOZXcgcHJvdG90eXBlLgotCi1Nb24gRGVjICAxIDIwOjI0OjE4IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi9zaC5oIChSX1NIX1NXSVRDSDgpOiBOZXcuCi0KLU1vbiBEZWMgIDEgMTE6Mjk6MzUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suaCAoQ0JfU1lTQ0FMTCk6IENvbW1lbnQgb3V0IGFyZyBuYW1lcyBpbiBwcm90b3R5cGVzLgotCi1XZWQgTm92IDI2IDE2OjQ3OjU4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChDQl9TWVNDQUxMKTogQ29uc2lzdGFudGx5IHVzZSBuYW1lcyBmb3IgcHJvdG90eXBlCi0JYXJndW1lbnRzLgotCi1XZWQgTm92IDI2IDExOjM5OjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKENCX1NZU0NBTEwpOiBDaGFuZ2UgYnl0ZSBjb3VudCBhcmd1bWVudHMgdG8KLQl7cmVhZCx3cml0ZX1fbWVtIHRvIGBpbnQnLiAgTmV3IG1lbWJlciBgbWFnaWMnLgotCShDQl9TWVNDQUxMX01BR0lDLENCX1NZU0NBTExfSU5JVCk6IE5ldyBtYWNyb3MuCi0KLVR1ZSBOb3YgMjUgMDE6MzU6NTIgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKHN0cnVjdCBzdGF0KTogTW92ZSBmb3J3YXJkIGRlY2wgdXAuCi0JKGhvc3RfY2FsbGJhY2spOiBQYXNzIHN0YXQgc3RydWN0IHBvaW50ZXIgdG8gc3RhdCxmc3RhdC4KLQkoQ0JfU1lTX25ubik6IFJlb3JnYW5pemUuCi0JKENCX1NZU0NBTEwpOiBOZXcgbWVtYmVycyBwMSxwMi4KLQkoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IERlbGV0ZSBmb3VydGggYXJnLgotCi1TYXQgTm92IDIyIDIzOjM0OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fc3RvcF9yZWFzb24pOiBDbGFyaWZ5IHNpbV9zaWduYWxsZWQgU0lHUkMKLSAJYXJndW1lbnQuCi0KLU1vbiBOb3YgMTcgMTQ6MDA6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKENCX1RBUkdFVF9ERUZTX01BUCk6IFJlbmFtZWQgZnJvbSB0YXJnZXRfZGVmc19tYXAuCi0JKGhvc3RfY2FsbGJhY2spOiBBZGQgc3RhdCwgZnN0YXQsIHN5c2NhbGxfbWFwLCBlcnJub19tYXAsIG9wZW5fbWFwLAotCXNpZ25hbF9tYXAsIHN0YXRfbWFwLgotCShlcnJuX21hcCxvcGVuX21hcCk6IFJlbmFtZWQgdG8gY2JfaW5pdF9mb29fbWFwLgotCShjYl9ob3N0X3RvX3RhcmdldF9lcnJubyxjYl90YXJnZXRfdG9faG9zdF9vcGVuKTogUmVuYW1lZCBmcm9tCi0JaG9zdF90b190YXJnZXRfZXJybm8sdGFyZ2V0X3RvX2hvc3Rfb3Blbi4KLQkoY2JfcmVhZF90YXJnZXRfc3lzY2FsbF9tYXBzKTogQWRkIHByb3RvdHlwZS4KLQkoY2JfdGFyZ2V0X3RvX2hvc3Rfc3lzY2FsbCk6IExpa2V3aXNlLgotCShjYl9ob3N0X3RvX3RhcmdldF9zdGF0KTogTGlrZXdpc2UuCi0JKGNiX3N5c2NhbGwpOiBMaWtld2lzZS4KLQkoQ0JfU1lTX3tleGl0LG9wZW4sY2xvc2UscmVhZCx3cml0ZSxsc2Vlayx1bmxpbmssZ2V0cGlkLGtpbGwsZnN0YXQsCi0JYXJndmxlbixhcmd2LGNoZGlyLHN0YXQsY2htb2QsdXRpbWUsdGltZX0pOiBEZWZpbmUuCi0JKENCX1NZU0NBTEwpOiBOZXcgdHlwZS4KLQkoQ0JfUkMpOiBOZXcgZW51bS4KLQotRnJpIE5vdiAgNyAxMDozNDowOSAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBBZGQgZXh0ZXJuICJDIiB7IHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggQysrCi0JcHJvZ3JhbXMuCi0JKiByZW1vdGUtc2ltLmg6ICBBZGQgZXh0ZXJuICJDIiB7IHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggQysrCi0JcHJvZ3JhbXMuCi0KLVR1ZSBPY3QgMTQgMTY6MDc6NTEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyk6IE5ldyBmaWVsZAotCSdzeW1ib2xfYXRfYWRkcmVzc19mdW5jJy4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXNlIG5ldyBmaWVsZCB3aXRoCi0JZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcy4KLQotTW9uIE9jdCAxMyAxMDoxNzoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaDogQ2xhcmlmeSBzaW1fcmVhZCwgc2ltX3dyaXRlIE1FTSBhcmd1bWVudC4KLQotV2VkIFNlcCAyNCAxODowMzoxMCAxOTk3ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiYWJ5bG9uLTUuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChTSU1fUkMpOiAgQWRkIGEgYnVuY2ggb2YgbmV3IHJldHVybiBjb2RlcyBmb3IKLQlicmVha3BvaW50IHN0dWZmLgotCSogQWRkIGZ1bmN0aW9ucyB0byB0ZWxsIHRoZSBzaW11bGF0b3IgdG8gc2V0L2NsZWFyL2VuYWJsZS9kaXNhYmxlCi0JaW50cmluc2ljIGJyZWFrcG9pbnRzLgotCi1UaHUgQXVnIDI4IDE5OjQxOjQyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGR1cGFyZ3YpOiBBZGQgcHJvdG90eXBlLgotCi1UdWUgQXVnIDI2IDEyOjI1OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fY3JlYXRlX2luZmVyaW9yKTogQWRkIEFCRkQgYXJnLiBEb2N1bWVudC4KLQotTW9uIEF1ZyAyNSAxMDo1MDo1MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmcuIERvY3VtZW50LgotCi1GcmkgQXVnICA4IDE2OjQzOjU2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoYXJjX2dldF9kaXNhc3NlbWJsZXIpOiBEZWNsYXJlLgotCi1XZWQgSnVsIDMwIDExOjM5OjUwIDE5OTcgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBkZW1hbmdsZS5oIChETUdMX0pBVkEpOiAgTmV3IG9wdGlvbiB0byByZXF1ZXN0IEphdmEgZGVtYW5nbGluZy4KLQotVHVlIEp1bCAyMiAxNzo1OTo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChQRVhFQ1VURV8qKTogRGVmaW5lLgotCShwZXhlY3V0ZSwgcHdhaXQpOiBEZWNsYXJlLgotCi1GcmkgSnVuICA2IDEzOjAyOjMzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fa2lsbCk6IE1hcmsgYXMgZGVwcmVjaWF0ZWQuCi0KLUZyaSBNYXkgMjMgMTM6NDM6NDEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgdGFza19saW5rIG1lbWJlci4KLQotVGh1IE1heSAyMiAxMTozMjo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaDogUmV2aWV3IGRvY3VtZW50YXRpb24uICBDbGFyaWZ5IHJlc3RyaWN0aW9ucyBvbgotIAl3aGVuIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLgotCi1XZWQgTWF5IDIxIDE2OjQ3OjUzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fc2V0X3Byb2ZpbGVfc2l6ZSk6IEFkZCBwcm90b3R5cGUsIGRvY3VtZW50IGFzCi0gCWRlcHJlY2lhdGVkLgotCi1UdWUgTWF5IDIwIDA5OjMyOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBzdHJ1Y3QuCi0JKHNpbV9zZXRfY2FsbGJhY2tzKTogRHJvcCBTSU1fREVTQyBhcmd1bWVudC4gRG9jdW1lbnQuCi0JKHNpbV9zaXplKTogUmVtb3ZlIHJlY2VudGx5IGFkZGVkIFNJTV9ERVNDIGFyZ3VtZW50LiBEb2N1bWVudC4KLQotTW9uIE1heSAxOSAxOToxNDo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaDogUGFzcyBTRCBpbnRvIHNpbV9zaXplLgotCi1UaHUgTWF5IDE1IDAxOjI0OjE2IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5oIChvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbl93aXRoX2FyZywgb2JzdGFja19jaHVua2Z1biwKLQlvYnN0YWNrX2ZyZWVmdW4pOiBFbGltaW5hdGUgY29tcGlsZSB3YXJuaW5ncyBpbiBnZGIuCi0KLVR1ZSBNYXkgMTMgMTA6MjE6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi9hcm0uaCAoY29uc3RhbnRzKTogICBBZGRlZCBuZXcgZmxhZyBiaXRzIEZfQVBDU18yNiBhbmQKLQlGX0FQQ1NfU0VUIGZvciB0aGUgZl9mbGFncyBmaWVsZCBvZiB0aGUgZmlsZWhkciBzdHJ1Y3R1cmUuICBBZGRlZCBuZXcKLQlmbGFnczogRl9BUENTMjYsIEZfQVJNXzIsIEZfQVJNXzMsIEZfQVJNXzcsIEZfQVJNXzdUIHRvIHN0b3JlCi0JaW5mb3JtYXRpb24gaW4gdGhlIGZsYWdzIGZpZWxkIG9mIHRoZSBpbnRlcm5hbF9mIHN0cnVjdHVyZSB1c2VkIGJ5IEJGRAotCXJvdXRpbmVzLgotCi1UdWUgQXByIDIyIDEwOjI0OjM0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBmbG9hdGZvcm1hdC5oIChmbG9hdGZvcm1hdF9ieXRlb3JkZXJzKTogQWRkIGNvbW1lbnRzIGZvciBwcmV2aW91cwotCWZvcm1hdHMgYW5kIGFkZCBmbG9hdGZvcm1hdF9saXR0bGVieXRlX2JpZ3dvcmQsIHByaW1hcmlseSBmb3IgQVJNLgotCUFkZCBkZWNsYXJhdGlvbiBmb3IgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkLgotCi1GcmkgQXByIDE4IDEzOjA0OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fc3RvcCk6IE5ldyBpbnRlcmZhY2UgLSBhc3luY2hyb25vdXMKLSAJbm90aWZpY2F0aW9uIG9mIGEgcmVxdWVzdCB0byBzdG9wIC8gc3VzcGVuZCB0aGUgcnVubmluZwotIAlzaW11bGF0aW9uLgotCi0JKiByZW1vdGUtc2ltLmggKGVudW0gc2ltX3N0b3ApOiBBZGQgc2ltX3J1bm5pbmcgYW5kIHNpbV9wb2xsaW5nIGFzCi0gCXN0YXRlcyBmb3IgdXNlIGludGVybmFsIHRvIHNpbXVsYXRvcnMuCi0KLQkqIGNhbGxiYWNrLmggKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnV0KTogUHV0IGEgbWFnaWMgbnVtYmVyIGF0Ci0gCXRoZSBlbmQgb2YgdGhlIHN0cnVjdCB0byBhbGxvdyBiYXNpYyBjaGVja2luZy4KLQkoc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICk6IEFkZCBwb2xsX3F1aXQgLSBzbwotIAl0aGF0IHRoZSBjb25zb2xlIGV0YyBjYW4gYmUgcG9sbGVkIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzLgotCi1UaHUgQXByIDE3IDAyOjE3OjEyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc3RydWN0IF9iZmQpOiBEZWNsYXJlLgotCShzaW1fbG9hZCk6IFJldHVybiBTSU1fUkMuICBOZXcgYXJnIGBhYmZkJy4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgYXJnIGBzdGFydF9hZGRyZXNzJy4KLQotV2VkIEFwciAgMiAxNzowOToxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fdHJhY2UsIHNpbV9zaXplKTogTWFrZSB0aGVzZSBnbG9iYWwuICBUaGV5Ci0gCXdpbGwgZ28gYXdheSBzaG9ydGx5LgotCi1XZWQgQXByICAyIDE1OjIzOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoU0lNX09QRU5fS0lORCwgU0lNX1JDKTogTmV3IGVudW1zLgotCShzaW1fb3Blbik6IE5ldyBhcmd1bWVudCBga2luZCcuCi0KLVdlZCBBcHIgIDIgMTQ6NDU6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLUZyaSBNYXIgMjggMTU6Mjk6NTQgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKHRvcCBsZXZlbCk6IEluY2x1ZGUgc3RkYXJnLmggb3IgdmFyYXJncy5oIGlmCi0JdmFfc3RhcnQgaXMgbm90IGRlZmluZWQuCi0JKGhvc3RfY2FsbGJhY2tfc3RydWN0KTogTWFrZSB7LGV9dnByaW50Zl9maWx0ZXJlZCB0YWtlIGEgdmFfbGlzdAotCWluc3RlYWQgb2Ygdm9pZCAqLCBzaW5jZSB2YV9saXN0IG1pZ2h0IGJlIGFuIGFycmF5IG9yIHN0cnVjdHVyZQotCXR5cGUuCi0KLUZyaSBNYXIgMjggMTU6NDQ6NDEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQWRkIHByb3RvdHlwZSBmb3IgZ2xpYmMgYW5kIGxpbnV4LgotCi1Nb24gTWFyIDE3IDE5OjIyOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqYWxsb2MuaDogTmV3IGZpbGUuCi0KLU1vbiBNYXIgMTcgMTQ6NTc6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaDogTmV3IGZpbGUsIGNvcGllZCBpbiBmcm9tIGdkYi9yZW1vdGUtc2ltLmguICBPbmUKLSAJZGF5IHRoaXMgd2lsbCBiZSBwbGFjZWQgaW4gYSBkaXJlY3Rvcnkgb2YgaXRzIG93bi4KLQotU2F0IE1hciAxNSAxOTowMDoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suaDogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb24uCi0KLVRodSBNYXIgIDYgMTU6NDY6NTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCk6IEFkZCBjYWxsYmFja3MgLQotIAlmbHVzaF9zdGRvdXQsIHdyaXRlX3N0ZGVyciwgZmx1c2hfc3RkZXJyLCB2cHJpbnRmX2ZpbHRlcmVkLAotIAlldnByaW50Zl9maWx0ZXJlZC4gIERlbGV0ZSByZWR1bmRhbnQgY2FsbGJhY2tzIC0gcHJpbnRmX2ZpbHRlcmVkLgotCi1UaHUgRmViIDI3IDIzOjE4OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IFJlbW92ZSBscHJlZml4IGFuZCBscHJlZml4X2xlbgotCWZpZWxkcy4KLQotVHVlIEZlYiAyNSAwMDoxMDo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplCi0JYnl0ZXNfcGVyX2NodW5rIGFuZCBkaXNwbGF5X2VuZGlhbi4KLQotTW9uIEZlYiAyNCAxNzo0NzowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwcik6IERlZmluZS4KLQkoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzKTogRGVmaW5lLgotCShzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUpOiBEZWZpbmUuCi0KLVRodSBGZWIgIDYgMTQ6MjA6MDEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogKGRpc2Fzc2VtYmxlX2luZm8pOiAgQWRkIG5ldyBmaWVsZHMKLQlieXRlc19wZXJfY2h1bmsgYW5kIGRpc3BsYXlfZW5kaWFuIHRvIGNvbnRyb2wgdGhlCi0JZGlzcGxheSBvZiByYXcgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgRGVjIDI3IDIyOjE3OjM3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdGljODApOiBEZWNsYXJlLgotCi1TdW4gRGVjICA4IDE3OjExOjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKGhvc3RfY2FsbGJhY2spOiBOZXcgbWVtYmVyIGBlcnJvcicuCi0KLVdlZCBOb3YgMjAgMDA6NDA6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suaDogTmV3IGZpbGUsIG1vdmVkIGhlcmUgZnJvbSBnZGIuCi0KLU1vbiBOb3YgMTggMTY6MzQ6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogQ2hlY2tpbiBhZ2FpbjsgbGFzdCBjaGVja2luIGZhaWxlZCBkdWUgdG8gc3RpY2t5IHRhZy4KLQotV2VkIE5vdiAxMyAwODoyMjowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBSZXZlcnQgbGFzdCBjb21taXQgZHVlIHRvIGNvbmZsaWN0cyB3aXRoIGhwdXgKLQlzeXN0ZW0gaGVhZGVycy4KLQotVHVlIE5vdiAxMiAxNjozMTowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBNb3ZlIHByb3RvdHlwZXMgZnJvbSBhcmd2LmMgaGVyZS4KLQotVGh1IE9jdCAzMSAxNDo1NjoxOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhbnNpZGVjbC5oIChWUEFSQU1TLFZBX1NUQVJUKTogRGVmaW5lLgotCi1GcmkgT2N0IDI1IDEyOjA4OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogQWRkIGJ5dGVzX3Blcl9saW5lIGZpZWxkLgotCShJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSCk6IEluaXRpYWxpemUgYnl0ZXNfcGVyX2xpbmUgZmllbGQuCi0KLVRodSBPY3QgMjQgMTc6MTA6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGRpc2Fzc2VtYmxlX2luZm8pOiBBZGQgc3ltYm9sIGZpZWxkLgotCShJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSCk6IEluaXRpYWxpemUgc3ltYm9sIGZpZWxkLgotCi1UaHUgT2N0IDE3IDExOjE3OjQwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9tMzJyKTogRGVjbGFyZS4KLQotTW9uIE9jdCAxNCAyMzo1Njo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBEZWNsYXJlIHBhcmFtZXRlciB0eXBlcyBmb3IgeG1hbGxvYyBhbmQgeHJlYWxsb2MuCi0KLVRodSBPY3QgIDMgMTM6NDU6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmg6IE5ldyBmaWxlLgotCi1UaHUgT2N0ICAzIDEwOjMzOjE0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX21uMTB4MDApOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKHByaW50X2luc25fbW4xMDIwMCwgcHJpbnRfaW5zbl9tbjEwMzAwKTogRGVjbGFyZS4KLQotV2VkIE9jdCAgMiAyMToyNDo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9tbjEweDAwKTogRGVjbGFyZS4KLQotTW9uIFNlcCAzMCAxMzo1NjoxMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5Lmg6IFJlbW92ZSAjaWZuZGVmIFBSSVZBVEVfWE1BTExPQy4KLQotU2F0IEF1ZyAzMSAxMzoyNzowNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl92ODUwKTogRGVjbGFyZS4KLQotVHVlIEF1ZyAxMyAxNjoxMDozMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6ICBDaGFuZ2UgYmNvcHkgdG8gbWVtY3B5LiAgV29ya3MgYmV0dGVyIG9uIFBvc2l4Ci0Jc3lzdGVtcywgd2hpY2ggZ2VuZXJhbGx5IGxhY2sgYmNvcHkuCi0KLU1vbiBBdWcgMTIgMTc6MDM6MTggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogIENoYW5nZSBXSU4zMiB0byBfV0lOMzIuCi0KLUZyaSBKdWwgMjYgMTM6NTg6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBmbGF2b3VyIGZpZWxkLgotCShwcmludF9pbnNuX2FscGhhKTogRGVjbGFyZS4KLQkocHJpbnRfaW5zbl9hbHBoYV9vc2YsIHByaW50X2luc25fYWxwaGFfdm1zKTogRG9uJ3QgZGVjbGFyZS4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogSW5pdGlhbGl6ZSBmbGF2b3VyIGZpZWxkLgotCi1UdWUgSnVsIDIzIDE3OjM3OjU4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoUFJJVkFURV9YTUFMTE9DKTogRW5jbG9zZSB4bWFsbG9jL3hyZWFsbG9jCi0JZGVmaW5pdGlvbnMgaW5zaWRlICNpZm5kZWYgc28gdGhhdCBwcm9ncmFtcyB0aGF0IHdhbnQgdG8KLQljYW4gZGVmaW5lIFBSSVZBVEVfWE1BTExPQyBhbmQgdGhlbiBkZWZpbmUgeG1hbGxvYyBhbmQKLQl4cmVhbGxvYyBhbnl3YXkgdGhleSB3YW50LgotCShiYXNlbmFtZSk6IERvY3VtZW50IGluIHNvdXJjZSB0aGF0IHdlIGNhbid0IGRlY2xhcmUgdGhlCi0gCXBhcmFtZXRlciB0eXBlIGJlY2F1c2UgaXQgaXMgZGVjbGFyZWQgaW5jb25zaXN0ZW50bHkgYWNyb3NzCi0JZGlmZmVyZW50IHN5c3RlbXMuCi0KLU1vbiBKdWwgMjIgMTM6MTY6MTMgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9hbHBoYSk6IERvbid0IGRlY2xhcmUuCi0JKHByaW50X2luc25fYWxwaGFfb3NmLCBwcmludF9pbnNuX2FscGhhX3Ztcyk6IERlY2xhcmUuCi0KLVdlZCBKdWwgMTcgMTQ6NDU6MTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogKHByaW50X2luc25fZDEwdik6IERlY2xhcmUuCi0KLU1vbiBKdWwgMTUgMTY6NTU6MzggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiAgR2V0IHJpZCBvZiBkZWNscyBmb3IgcHJpbnRfaW5zbl9pODA4NiwKLQlwcmludF9pbnNuX3NwYXJjNjQgYW5kIHByaW50X2luc25fc3BhcmNsaXRlLgotCSogKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6ICBTcGxpdCBpbnRvIHR3byBwaWVjZXMuICBPbmUsCi0JSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0ggaW5pdHMgZXZlcnl0aGluZyBleGNlcHQgZm9yIGVuZGlhbiwKLQltYWNoLCBhbmQgYXJjaC4KLQotRnJpIEp1bCAxMiAxMDoxOToyNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faTgwODYpOiAgRGVjbGFyZS4KLQotV2VkIEp1bCAgMyAxNjowMjozOSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fc3BhcmNsaXRlKTogIERlY2xhcmUuCi0KLVR1ZSBKdW4gMTggMTY6MDI6NDYgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9oODMwMHMpOiBEZWNsYXJlLgotCi1UdWUgSnVuIDE4IDE1OjExOjMzIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBmb3Blbi12bXMuaDogTmV3IGZpbGUuCi0KLVR1ZSBKdW4gIDQgMTg6NTg6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIG5vdGljZV9hbGwgZmllbGQuCi0KLUZyaSBBcHIgMjYgMTA6MzM6MTIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaCAoI2lmZGVmIElOX0dDQyk6ICNpbmNsdWRlICJnYW5zaWRlY2wuaCIuCi0JKFBST1RPLFBUUixjb25zdCk6IERlbGV0ZS4KLQotTW9uIEFwciAyMiAxNzoyNzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgdHJhZGl0aW9uYWxfZm9ybWF0IGZpZWxkLgotCi1Nb24gQXByIDE1IDE1OjE2OjU2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChjaG9vc2VfdGVtcF9iYXNlKTogQWRkIHByb3RvdHlwZS4KLQotVHVlIE1hciAxMiAxNzoyOTo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCk6IERlY2xhcmUuCi0JKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHdyYXBfaGFzaCBmaWVsZC4KLQotV2VkIEZlYiAxNCAxNjo0OToxNyAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBpZWVlLmggKGllZWVfcmVjb3JkX2VudW1fdHlwZSk6IERlZmluZQotCWllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2luZm9fZW51bS4KLQotRnJpIEZlYiAgMiAxNzowOToyNSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChESVNBU01fUkFXX0lOU04pOiBEZWxldGUuCi0KLVR1ZSBKYW4gMjMgMDk6MjE6NDcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoSU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogU2V0IGVuZGlhbiB0byBCRkRfRU5ESUFOX1VOS05PV04uCi0JTmV3IGFyZ3VtZW50IEZQUklOVEZfRlVOQy4KLQotTW9uIEphbiAyMiAxNjozNzo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogTmV3IG1lbWJlcnMgYXJjaCwgbWFjaCwgZW5kaWFuLgotCShJTklUX0RJU0FTU0VNQkxFX0lORk8pOiBJbml0aWFsaXplIHRoZW0uCi0JKERJU0FTTV9SQVdfSU5TTnssRkxBR30pOiBEZWZpbmUuCi0KLVRodSBKYW4gMTggMTE6MzI6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkZW1hbmdsZS5oIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBDaGFuZ2Ugb3BuYW1lIHBhcmFtZXRlciB0bwotCWNvbnN0IGNoYXIgKi4KLQkoY3BsdXNfbWFuZ2xlX29wbmFtZSk6IENoYW5nZSByZXR1cm4gdHlwZSBhbmQgb3BuYW1lIHBhcmFtZXRlciB0bwotCWNvbnN0IGNoYXIgKi4KLQotRnJpIEphbiAgNSAwMDowMToyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuaCAoZW51bSBpZWVlX3JlY29yZCk6IEFkZCBpZWVlX2Fzbl9yZWNvcmRfZW51bSwKLQlpZWVlX2F0X3JlY29yZF9lbnVtLCBpZWVlX3R5X3JlY29yZF9lbnVtLCBpZWVlX2F0bl9yZWNvcmRfZW51bSwKLQlpZWVlX2JiX3JlY29yZF9lbnVtLCBhbmQgaWVlZV9iZV9yZWNvcmRfZW51bS4KLQotV2VkIEphbiAgMyAxMzoxMjowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5oOiBVcGRhdGUgY29weXJpZ2h0IHRvIDE5OTYuCi0JKF9vYnN0YWNrX21lbW9yeV91c2VkKTogRGVjbGFyZS4KLQkob2JzdGFja19tZW1vcnlfdXNlZCk6IERlZmluZSBtYWNyby4KLQotVGh1IERlYyAyOCAxMTo0MjoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oICh4c3RyZHVwKTogRGVjbGFyZS4KLQotVGh1IERlYyAyMSAxNDo0NzoxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHdhaXQuaDogUHJvdGVjdCBhbGwgbWFjcm9zIHdpdGggI2lmbmRlZi4KLQotVHVlIE9jdCAyNCAyMTo0NTo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgc3RhdGljX2xpbmsgZmllbGQuCi0KLVR1ZSBTZXAgMTIgMTY6Mjg6MDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBBZGQgc3ltYm9sIHBhcmFtZXRlciB0bwotCXdhcm5pbmcgY2FsbGJhY2suCi0KLUZyaSBTZXAgIDEgMTM6MTE6NTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBDaGFuZ2Ugd2FybmluZyBjYWxsYmFjawotCXRvIHRha2UgQkZELCBzZWN0aW9uLCBhbmQgYWRkcmVzcyBhcmd1bWVudHMuCi0KLVRodSBBdWcgMzEgMTY6NDU6MTIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IFJlbW92ZSBQRSBzdHVmZi4KLQotVHVlIEF1ZyAyMiAwMzoxODoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBEZWNsYXJlIHhzdHJlcnJvci4gIEZyb20gUGF0IFJhbmtpbi4KLQotTW9uIEF1ZyAyMSAxODoxMTozNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogUmVtb3ZlIFBFIHN0dWZmLgotCi1XZWQgQXVnICAyIDA4OjE0OjEyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9zcGFyYzY0KTogRGVjbGFyZS4KLQotTW9uIEp1bCAxMCAxMzoyNjo0OSAxOTk1ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYWliLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBuZXcgZmllbGQgc3ltYm9saWMuCi0KLVN1biBKdWwgIDIgMTc6NDg6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQ2hhbmdlIHR5cGUgb2YgYmFzZV9maWxlIHRvCi0JUFRSLgotCi1UaHUgSnVuIDI5IDAwOjAyOjQ1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGRlZCBiYXNlX2ZpbGUgbWVtYmVyLgotCi1UdWUgSnVuIDIwIDE2OjQwOjA0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGFuc2lkZWNsLmg6IHdpbjMycyBpcyBBTlNJIGVub3VnaC4KLQotVGh1IE1heSAxOCAwNDoyNTo1MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fYXJtKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShwcmludF9pbnNuX3tsaXR0bGUsYmlnfV9hcm0pOiBOZXcgZGVjbGFyYXRpb25zLgotCi0JKiBmbG9hdGZvcm1hdC5oIChmbG9hdGZvcm1hdF9hcm1fZXh0KTogRGVjbGFyZS4KLQotU2F0IE1heSAxMyAxMDoxNDowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmL3BlLmg6IE5ldyBmaWxlLgotCSogYmZkbGluay5oIChzdWJzeXRlbSwgc3RhY2tfaGVhcF9wYXJhbWV0ZXJzKTogTmV3LgotCSogY29mZi9pMzg2LmggKE5UX1NFQ1RJT05fQUxJR05NRU5ULCBOVF9GSUxFX0FMSUdOTUVOVCwKLQlOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IE5ldy4KLQkqIGNvZmYvaW50ZXJuYWwuaCAoaW50ZXJuYWxfZmlsZWhkcik6ICBOZXcgZmllbGRzIGZvciBQRS4KLQkoSU1BR0VfREFUQV9ESVJFQ1RPUlkpOiBOZXcuCi0JKGludGVybmFsX2FvdXRoZHIpOiBOZXcgZmllbGRzIGZvciBQRS4KLQotVGh1IE1heSAgNCAxNDozNjo0MiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaDogRG9uJ3QgaW5jbHVkZSBhbnNpZGVjbC5oIGlmIElOX0dDQy4KLQotVHVlIEZlYiAyMSAwMDozNzoyOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHAtc3ltdGFiLmg6IERvbid0IHVzZSBiaXRmaWVsZCBlbnVtZXJhdGlvbnMsIHRoZSBIUCBDIGNvbXBpbGVyCi0JZG9lcyBub3QgaGFuZGxlIHRoZW0gY29ycmVjdGx5LgotCi1UaHUgRmViICA5IDE0OjIwOjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXIgdHlwZTsgc29tZQotCXN5c3RlbXMgaGF2ZSB0aGlzIGluIHRoZWlyIGhlYWRlciBmaWxlcy4KLQotV2VkIEZlYiAgOCAxNzozNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgZm9ybWF0IG9mIGNvbW1vbgotCXN5bWJvbCBpbmZvcm1hdGlvbiwgdG8gcmVtb3ZlIHJlc3RyaWN0aW9ucyBvbiBtYXhpbXVtIHNpemUgYW5kCi0JYWxpZ25tZW50IHBvd2VyLCBieSB1c2luZyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgaW5zdGVhZC4KLQotTW9uIEZlYiAgNiAxNDo1NTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoZW51bSBiZmRfbGlua19oYXNoX3R5cGUpOiBSZW5hbWUgYmZkX2xpbmtfaGFzaF93ZWFrCi0JdG8gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsuICBBZGQgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLgotCi1Nb24gSmFuIDE2IDIxOjAwOjIzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChHREJfSU5JVF9ESVNBU1NFTUJMRV9JTkZPLCBldGMpOiBSZW1vdmUgYWxsCi0JR0RCLXNwZWNpZmljIGRlZmluaXRpb25zLgotCi1TdW4gSmFuIDE1IDE4OjM5OjM1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdzY1KTogRGVjbGFyZS4KLQotVGh1IEphbiAxMiAxNzo1MToxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoaGV4X3ApOiBGaXggc2Vuc2Ugb2YgdGVzdC4KLQotV2VkIEphbiAxMSAyMjozNjo0MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoX2hleF9hcnJheV9zaXplLCBfaGV4X2JhZCwgX2hleF92YWx1ZSwgaGV4X2luaXQsCi0JaGV4X3AsIGhleF92YWx1ZSk6IE5ldyBtYWNyb3MgYW5kIGRlY2xhcmF0aW9ucywgZm9yIGhleC5jLgotCi1GcmkgSmFuICA2IDE3OjQ0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oOiBNYWtlIGlkZW1wb3RlbnQuCi0KLVdlZCBEZWMgMTQgMTM6MDg6NDMgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBwcm9ncmVzcy5oOiBOZXcgZmlsZSwgZW1wdHkgZGVmaW5pdGlvbnMgZm9yIHByb2dyZXNzIG1hY3Jvcy4KLQotRnJpIE5vdiAyNSAwMDoxNDowNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHAtc3ltdGFiLmg6IE5ldyBmaWxlIGRlc2NyaWJpbmcgdGhlIGRlYnVnIHN5bWJvbHMgZW1pdHRlZAotCWJ5IHRoZSBIUCBDIGNvbXBpbGVycy4KLQotRnJpIE5vdiAxMSAxNTo0ODozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgdS5jLnNpemUgZnJvbSAyNAotCXRvIDI2IGJpdHMsIGFuZCBjaGFuZ2UgdS5jLmFsaWdubWVudF9wb3dlciBmcm9tIDggdG8gNiBiaXRzLiAgNgotCWJpdCBpbiB0aGUgYWxpZ25tZW50IHBvd2VyIGlzIGVub3VnaCBmb3IgYSA2NCBiaXQgYWRkcmVzcyBzcGFjZS4KLQotTW9uIE9jdCAzMSAxMzowMjo1MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmggKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBEZWNsYXJlLgotCi1UdWUgT2N0IDI1IDExOjM4OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogRml4IGNvbW1lbnRzIGZvcgotCW11bHRpcGxlX2NvbW1vbiBmaWVsZC4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBhb3V0L2FvdXQ2NC5oOiBPbmx5IGRlZmluZSBRTUFHSUMgaWYgaXQgaXNuJ3QgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBkaXMtYXNtLmg6IEFkZCBzdXBwb3J0IGZvciB0aGUgQVJNLgotCi1XZWQgQXVnIDEwIDEyOjUxOjQxIDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oIChzdHJzaWduYWwpOiBEb2N1bWVudCBpdHMgZXhpc3RlbmNlIGV2ZW4gaWYgd2UKLQljYW4ndCBkZWNsYXJlIGl0LgotCi1UdWUgQXVnICAyIDE0OjQwOjAzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBvczlrLmg6IFJlbW92ZSB1X2ludDE2LCB1X2ludDMyLCBhbmQgb3duZXJfaWQgdHlwZWRlZnMgYW5kCi0JZXhwYW5kIHRoZWlyIHVzZXMuICBUaG9zZSBuYW1lcyBjb25mbGljdCB3aXRoIE1hY2ggaGVhZGVycy4KLQotRnJpIEp1bCAyMiAxNDoxNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgdS5jLnNpemUgaW50byBhCi0JYml0ZmllbGQuICBBZGQgZmllbGQgdS5jLmFsaWdubWVudF9wb3dlci4KLQotU3VuIEp1bCAxMCAwMDoyNjozOSAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogZGlzLWFzbS5oOiBBZGQgcHJpbnRfaW5zbl9uczMyayBkZWNsYXJhdGlvbi4KLQotTW9uIEp1biAyMCAxNzoxMzoyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoYmZkX2xpbmtfaGFzaF90YWJsZSk6IE1ha2UgY3JlYXRvciBhIGNvbnN0IHBvaW50ZXIuCi0KLVNhdCBKdW4gMTggMTY6MDk6MzIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBEZWNsYXJlLgotCi1UaHUgSnVuIDE2IDE1OjE5OjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBuZXcgZmllbGQgc2hhcmVkLgotCi1Nb24gSnVuICA2IDE0OjM5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSk6IFJlbW92ZSB3cml0dGVuIGZpZWxkOgotCW5vdCBuZWVkZWQgZm9yIGFsbCBiYWNrZW5kcy4KLQotVGh1IEFwciAyOCAxOTowNjo1MCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKGRpc2Fzc2VtYmxlcik6IERlY2xhcmUuCi0KLUZyaSBBcHIgIDEgMDA6Mzg6MTcgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBtb2xlLmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogb2JzdGFjay5oOiBEZWxldGUgdXNlIG9mIElOX0dDQyB0byBjb250cm9sIHdoZXRoZXIKLSAgICAgICAgc3RkZGVmLmggb3IgZ3N0ZGRlZi5oIGlzIGluY2x1ZGVkLgotCi1UdWUgTWFyIDIyIDEzOjA2OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUpOiBBZGQgYmZkX2RhdGFfbGlua19vcmRlci4KLQkoc3RydWN0IGJmZF9saW5rX29yZGVyKTogQWRkIGRhdGEgZmllbGQgdG8gdW5pb24uCi0KLU1vbiBNYXIgMjEgMTg6NDU6MjYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBDaGFuZ2UgYml0c2l6ZSBhcmd1bWVudAotCXRvIGFkZF90b19zZXQgdG8gcmVsb2MuICBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudCBmcm9tIGNvbnN0cnVjdG9yLgotCUNvbW1lbnQgdGhhdCByZWxvY19vdmVyZmxvdywgcmVsb2NfZGFuZ2Vyb3VzIGFuZCB1bmF0dGFjaGVkX3JlbG9jCi0JbXVzdCBoYW5kbGUgTlVMTCBwb2ludGVycyBmb3IgcmVsb2MgbG9jYXRpb24uCi0JKGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSk6IEFkZCBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIGFuZAotCWJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlci4KLQkoc3RydWN0IGJmZF9saW5rX29yZGVyKTogQWRkIHJlbG9jIGZpZWxkIHRvIHVuaW9uLgotCShzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MpOiBEZWZpbmUuCi0KLU1vbiBNYXIgMTQgMTI6Mjc6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0Lmg6IFJlbW92ZWQ7IG5vIGxvbmdlciB1c2VkLgotCi1UdWUgTWFyICAxIDE4OjEwOjQ5IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIG9zOWsuaDogb3M5MDAwIHRhcmdldCBzcGVjaWZpYyBoZWFkZXIgZmlsZSwgdGhlIGhlYWRlciBvZiB0aGUKLQlvYmplY3QgZmlsZSBpcyB1c2VkIG5vdy4KLQotU3VuIEZlYiAyNyAyMTo1MjoyNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuaDogTmV3IGZpbGUsIGludGVuZGVkIHRvIHJlcGxhY2UgaWVlZS1mbG9hdC5oLgotCi1TdW4gRmViIDIwIDE3OjE1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oIChBTlNJX1BST1RPVFlQRVMpOiBEZWZpbmUgaWYgdXNpbmcgQU5TSSBwcm90b3R5cGVzLgotCi1XZWQgRmViIDE2IDAxOjA3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliaWJlcnR5Lmg6IERvbid0IGRlY2xhcmUgc3Ryc2lnbmFsLCB0byBhdm9pZCBjb25mbGljdHMgd2l0aAotCVNvbGFyaXMgc3lzdGVtIGhlYWRlciBmaWxlcy4KLQotU2F0IEZlYiAxMiAyMjoxMTozMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliaWJlcnR5LmggKHhleGl0KTogVXNlIF9fdm9sYXRpbGVfXyB0byBhdm9pZCBsb3NpbmcgaWYKLQljb21waWxpbmcgd2l0aCBnY2MgLXRyYWRpdGlvbmFsLgotCi1UaHUgRmViIDEwIDE0OjA1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGliaWJlcnR5Lmg6IE5ldyBmaWxlLiAgRGVjbGFyZXMgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5Ci0JbGliaWJlcnR5LgotCi1UdWUgRmViICA4IDA1OjE5OjUyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUhhbmRsZSBvYnN0YWNrX2NodW5rX2FsbG9jIHJldHVybmluZyBOVUxMLiAgVGhpcyBhbGxvd3MKLQlvYnN0YWNrcyB0byBiZSB1c2VkIGJ5IGxpYnJhcmllcywgd2l0aG91dCBmb3JjaW5nIHRoZW0KLQl0byBjYWxsIGV4aXQgb3IgbG9uZ2ptcC4KLQkqIG9ic3RhY2suaCAoc3RydWN0IG9ic3RhY2spOiBBZGQgYWxsb2NfZmFpbGVkIGZsYWcuCi0JX29ic3RhY2tfYmVnaW4sIF9vYnN0YWNrX2JlZ2luXzEpOiBEZWNsYXJlIHRvIHJldHVybiBpbnQsIG5vdCB2b2lkLgotCShvYnN0YWNrX2ZpbmlzaCk6IElmIGFsbG9jX2ZhaWxlZCwgcmV0dXJuIE5VTEwuCi0JKG9ic3RhY2tfYmFzZSwgb2JzdGFja19uZXh0X2ZyZWUsIG9ianN0YWNrX29iamVjdF9zaXplKToKLQlJZiBhbGxvY19mYWlsZWQsIHJldHVybiAwLgotCShvYnN0YWNrX2dyb3csIG9ic3RhY2tfZ3JvdzAsIG9ic3RhY2tfMWdyb3csIG9ic3RhY2tfcHRyX2dyb3csCi0Jb2JzdGFja19pbnRfZ3Jvdywgb2JzdGFja19ibGFuayk6IElmIGFsbG9jX2ZhaWxlZCwgZG8gbm90aGluZyB0aGF0Ci0JY291bGQgY29ycnVwdCB0aGUgb2JzdGFjay4KLQotTW9uIEphbiAyNCAxNTowNjowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEFkZCBuYW1lLCByZWxvY19uYW1lIGFuZAotCWFkZGVuZCBhcmdtZW50cyB0byByZWxvY19vdmVyZmxvdyBjYWxsYmFjay4KLQotRnJpIEphbiAyMSAxOToxMzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9iaWdfcG93ZXJwYywgcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYywKLQlwcmludF9pbnNuX3JzNjAwMCk6IERlY2xhcmUuCi0KLVRodSBKYW4gIDYgMTQ6MTU6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBBZGQgYml0c2l6ZSBhcmd1bWVudCB0bwotCWFkZF90b19zZXQgZmllbGQuICBBZGQgbmV3IGNhbGxiYWNrIG5hbWVkIGNvbnN0cnVjdG9yLgotCi1UaHUgRGVjIDMwIDEwOjQ0OjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaDogTmV3IGZpbGUgZm9yIG5ldyBCRkQgbGlua2VyIGJhY2tlbmQgcm91dGluZXMuCi0KLU1vbiBOb3YgMjkgMTA6NDM6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKGVudW0gZGlzX2luc25fdHl1cGUpOiBSZW1vdmUgbm9uLUFOU0kgdHJhaWxpbmcgY29tbWEuCi0KLVNhdCBPY3QgIDIgMjA6NDI6MjYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogTW92ZSBjb21tZW50IHRvIHJpZ2h0IHBsYWNlLgotCi1Nb24gQXVnICA5IDE5OjAzOjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oIChvYnN0YWNrX2NodW5rZnVuLCBvYnN0YWNrX2ZyZWVmdW4pOiBBZGQgZGVmbnMgZnJvbQotCXByZXZpb3VzIHZlcnNpb24uICBBcmUgdGhlc2UgQ3lnbnVzIGxvY2FsIGNoYW5nZXM/Ci0KLUZyaSBBdWcgIDYgMTc6MDU6NDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaCwgb2JzdGFjay5oOiBVcGRhdGUgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi1Nb24gQXVnICAyIDE2OjM3OjE0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYvaTM4Ni5oOiAgQWRkIEx5bnggbWFnaWMgbnVtYmVyLgotCi1Nb24gQXVnICAyIDE0OjQ1OjI5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6ICBNb3ZlIGVudW0gb3V0c2lkZSBvZiBzdHJ1Y3QgZGVmbiB0byBhdm9pZCB3YXJuaW5ncy4KLQotTW9uIEF1ZyAgMiAwODo0OTozMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiB3YWl0LmggKFdFWElUU1RBVFVTLCBXU1RPUFNJRyk6IE1hc2sgZG93biB0byA4IGJpdHMuICBUaGlzIGlzCi0JZm9yIHN5c3RlbXMgdGhhdCBzdG9yZSBzdHVmZiBpbnRvIHRoZSBoaWdoIDE2IGJpdHMgb2YgYSB3YWl0Ci0Jc3RhdHVzLgotCi1GcmkgSnVsIDMwIDE4OjM4OjAyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6ICBBZGQgbmV3IGZpZWxkcyBpbnNuX2luZm9fdmFsaWQsIGJyYW5jaF9kZWxheV9pbnNucywKLQlkYXRhX3NpemUsIGluc25fdHlwZSwgdGFyZ2V0LCB0YXJnZXQyLiAgVGhlc2UgYXJlIHVzZWQgdG8gcmV0dXJuCi0JaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgYmFjayB0byB0aGUgY2FsbGluZwotCXByb2dyYW0uICBBZGQgY29tbWVudHMsIG1ha2UgbW9yZSByZWFkYWJsZS4KLQotTW9uIEp1bCAxOSAyMjoxNDoxNCAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtOiAgTmV3IGRpcmVjdG9yeSBjb250YWluaW5nIE5MTS9OZXRXYXJlIGluY2x1ZGVzLgotCi1UaHUgSnVsIDE1IDEyOjEwOjA0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyk6IE5ldyBmaWVsZCBhcHBsaWNhdGlvbl9kYXRhLgotCi1UaHUgSnVsIDE1IDEyOjQxOjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBBZGRlZCBkZWNsYXJhdGlvbiBvZiBwcmludF9pbnNuX204OGsuCi0KLVRodSBKdWwgIDggMDk6MDU6MjYgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogb3Bjb2RlL2g4MzAwLmg6IExvdHMgb2YgbGl0dGxlIGZpeGVzIGZvciB0aGUgaDgvMzAwaC4KLQotRnJpIEp1bCAgMiAxMDozMTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6IFVzZSBBTlNJIG1hY3JvcyBpZiBfX21pcHMgYW5kIF9TWVNUWVBFX1NWUjQgYXJlCi0JZGVmaW5lZCwgc2luY2UgUklTQy9PUyBjYyBoYW5kbGVzIEFOU0kgZGVjbGFyYXRpb25zIGluIFNWUjQgbW9kZQotCWJ1dCBkb2VzIG5vdCBkZWZpbmUgX19TVERDX18uCi0KLVN1biBKdW4gMjAgMTg6Mjc6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogRG9uJ3QgbmVlZCB0byBpbmNsdWRlIGFuc2lkZWNsLmggYW55IG1vcmUuCi0KLUZyaSBKdW4gMTggMDM6MjI6MTAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9hc3lzLmg6ICBFbGltaW5hdGUgImludDhfdHlwZSIsICJpbnQxNl90eXBlIiwgImludDMyX3R5cGUiLCBhbmQKLQl0aGVpciB2YXJpYW50cy4gIFRoZXNlIGNoYW5nZXMgYXJlIGNvb3JkaW5hdGVkIHdpdGggY29ycmVzcG9uZGluZwotCWNoYW5nZXMgaW4gLi4vYmZkL29hc3lzLmMuCi0KLVdlZCBKdW4gMTYgMTA6NDM6MDggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgTm90ZSB0aGF0IGl0IGhhcyBiZWVuIHJlbW92ZWQuCi0KLVR1ZSBKdW4gIDggMTI6MTY6MDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSBTdXBwb3J0IGZvciBIOC8zMDAtSAotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2g4MzAwLCBwcmludF9pbnNuX2g4MzAwaCk6IERlY2xhcmUgaXQuCi0JKiBjb2ZmL2g4MzAwLmg6IE5ldyBtYWdpYyBudW1iZXIuCi0JKiBjb2ZmL2ludGVybmFsLmg6IE5ldyByZWxvY2F0aW9ucy4KLQkqIG9wY29kZS9oODMwMC5oOiBMb3RzIG9mIG5ldyBvcGNvZGVzLgotCi1UdWUgSnVuICAxIDA3OjM1OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oIChjb25zdCk6IERvbid0IGRlZmluZSBpdCBpZiBpdCdzIGFscmVhZHkgZGVmaW5lZC4KLQotVGh1IE1heSAyNyAxODoxOTo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9ocHBhKTogRGVjbGFyZSBpdC4KLQotCSogYmZkLmg6IE1vdmVkIHRvIGJmZCBkaXJlY3RvcnkuICBTbWFsbCBzdHViIGhlcmUgaW5jbHVkZXMgaXQKLQl3aXRob3V0IHJlcXVpcmluZyAiLUkuLi9iZmQiLgotCi1UaHUgQXByIDI5IDEyOjA2OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCB3aXRoIEJTRl9GVU5DVElPTi4KLQotTW9uIEFwciAyNiAxODoxNTo1MCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmgsIGRpcy1hc20uaDogVXBkYXRlZCB3aXRoIEhpdGFjaGkgU0guCi0KLUZyaSBBcHIgMjMgMTg6NDE6MzggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIHdpdGggYWxwaGEgY2hhbmdlcy4KLQkqIGRpcy1hc20uaDogQWRkZWQgYWxwaGEuCi0KLUZyaSBBcHIgMTYgMTc6MzU6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIHNpZ25lZCBiZmRfKmdldF8qLgotCi1UaHUgQXByIDE1IDA5OjI0OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCBmb3IgZmlsZV90cnVuY2F0ZWQgZXJyb3IuCi0KLVRodSBBcHIgIDggMTA6NTM6NDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oOiBJZiBubyBBTlNJLCBkZWZpbmUgY29uc3QgdG8gYmUgZW1wdHkuCi0KLVRodSBBcHIgIDEgMDk6MDA6MTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogRGVjbGFyZSBhMjlrIGFuZCBpOTYwIHByaW50X2luc25fKi4KLQotCSogZGlzLWFzbS5oOiBBZGQgcHJpbnRfYWRkcmVzc19mdW5jIGFuZCByZWxhdGVkIHN0dWZmLgotCi0JKiBkaXMtYXNtLmggKGRpc19hc21fcmVhZF9tZW1vcnkpOiBGaXggcHJvdG90eXBlLgotCi1XZWQgTWFyIDMxIDE3OjQwOjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcmludF9pbnNuX3NwYXJjLgotCi1XZWQgTWFyIDMxIDE3OjUxOjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgZm9yIEJGRF9SRUxPQ19NSVBTX0dQUkVMIGFuZCBiZmRfW2dzXWV0X2dwX3NpemUKLQlwcm90b3R5cGVzLgotCi1XZWQgTWFyIDMxIDE2OjM1OjEyIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogKGRpc2Fzc2VtYmxlX2luZm8pOiAgRml4IHR5cG8gaW4gcHJvdG90eXBlIG9mCi0JZGlzX2FzbV9tZW1vcnlfZXJyb3IoKS4KLQotVHVlIE1hciAzMCAxOTowOToyMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZXJfaW5mbyk6IEFkZCByZWFkX21lbW9yeV9mdW5jLAotCW1lbW9yeV9lcnJvcl9mdW5jLCBidWZmZXIsIGFuZCBsZW5ndGguCi0JKHtHREJfLH1JTklUX0RJU0FTU0VNQkxFX0lORk8pOiBTZXQgdGhlbS4KLQlwcmludF9pbnNuXyo6IFJlbW92ZSBzZWNvbmQgYXJndW1lbnQuCi0KLVR1ZSBNYXIgMzAgMTQ6NDg6NTUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIGxtYSBmaWVsZCBvZiBzZWN0aW9uLgotCi1UdWUgTWFyIDMwIDEyOjIyOjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oOiBVc2UgQU5TSSB2ZXJzaW9ucyBvbiBBSVggcmVnYXJkbGVzcyBvZiBfX1NURENfXy4KLQotRnJpIE1hciAxOSAxNDo0OTo0OSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBBZGQgaDg1MDAuCi0KLVRodSBNYXIgMTggMTM6NDk6MDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0Lmg6ICBNb3ZlZCBmcm9tIC4uL2dkYi4KLQkqIGRpcy1hc20uaDogIE5ldyBmaWxlLiAgSW50ZXJmYWNlIHRvIGRpcy1hc3NlbWJsZXIuCi0KLVRodSBNYXIgMTEgMTA6NTI6NTcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmggKERNR0xfTk9fT1BUUyk6ICBBZGQgZGVmaW5lIChzZXQgdG8gMCkgdG8gdXNlCi0JaW4gcGxhY2Ugb2YgYmFyZSAwLCBmb3IgcmVhZGFiaWxpdHkgcmVhc29ucy4KLQotVHVlIE1hciAgMiAxNzo1MDoxMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaDogIFJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gY2Zyb250IHdpdGggQVJNLgotCi1UdWUgRmViIDIzIDEyOjIxOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3IgbmV3IGVsZW1lbnRzIGluIEpVTVBfVEFCTEUuCi0KLVR1ZSBGZWIgMTYgMDA6NTE6MzAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIGZvciBCRkRfVkVSU0lPTiAyLjEuCi0KLVR1ZSBKYW4gMjYgMTE6NDk6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBTRUNfSVNfQ09NTU9OIGZsYWcuCi0KLVR1ZSBKYW4gMTkgMTI6MjU6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBiZmRfYXN5bWJvbF92YWx1ZSBidWcgZml4LgotCi1GcmkgSmFuICA4IDE2OjM3OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSB0byBpbmNsdWRlIEVDT0ZGIHRkYXRhIGFuZCB0YXJnZXRfZmxhdm91ci4KLQotU3VuIERlYyAyNyAxNzo1MjozMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBBZGQgZGVjbGFyYXRpb24gZm9yIGJmZF9nZXRfc2l6ZSgpLgotCi1UdWUgRGVjIDIyIDIyOjQyOjQ2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oOiAgUHJvdGVjdCBmaWxlIGZyb20gbXVsdGlwbGUgaW5jbHVzaW9ucyB3aXRoCi0JI2lmICFkZWZpbmVkKERFTUFOR0xFX0gpLi4uI2RlZmluZSBERU1BTkdMRV9ILi4uI2VuZGlmLgotCi1Nb24gRGVjIDIxIDIxOjI1OjUwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIHRvIGdldCBocHBhX2NvcmVfc3RydWN0IGZyb20gYmZkLmMuCi0KLVRodSBEZWMgMTcgMDA6NDI6MzUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIHRvIGdldCB0ZWtoZXggdGRhdGEgbmFtZSBjaGFuZ2UgZnJvbSBiZmQuCi0KLU1vbiBOb3YgIDkgMjM6NTU6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6ICBVcGRhdGUgY29tbWVudHMgdG8gZGlzY291cmFnZSB1c2Ugb2YgRVhGVU4uCi0KLVRodSBOb3YgIDUgMTY6MzU6NDQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIHRvIGJyaW5nIGluIFNFQ19TSEFSRURfTElCUkFSWS4KLQotVGh1IE5vdiAgNSAwMzoyMTozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgdG8gbWF0Y2ggRVhGVU4sIGJmZF9zZWNsZXRfc3RydWN0LCBhbmQgU0RFRgotCWNsZWFudXBzIGluIGJmZC4KLQotV2VkIE5vdiAgNCAwNzoyODowNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYm91dC5oIChOX0NBTExOQU1FLCBOX0JBTE5BTUUpOiBEZWZpbmUgYXMgY2hhci10eXBlIHZhbHVlcywgc28KLQl3aWRlbmluZyB3b3JrcyBjb25zaXN0ZW50bHkuCi0KLUZyaSBPY3QgMTYgMDM6MTc6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oOiAgVXBkYXRlIHRvIFJldmlzZWQgU3RhbmRhcmQgRlNGIFZlcnNpb24uCi0KLVRodSBPY3QgMTUgMjE6NDM6MjIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaCAoc3RydWN0IG9wdGlvbik6IHVzZSB0aGUgcHJvdmlkZWQgZW51bSBmb3IgaGFzX2FyZy4KLQotCSogZGVtYW5nbGUuaCAoQVVUT19ERU1BTkdMSU5HLCBHTlVfREVNQU5HTElORywKLQkgIExVQ0lEX0RFTUFOR0xJTkcpOiB1bHRyaXggY29tcGlsZXJzIHJlcXVpcmUgZW51bXMgdG8gYmUKLQkgIGVudW1zIGFuZCBpbnRzIHRvIGJlIGludHMgYW5kIGNhc3RzIHdoZXJlIHRoZXkgbWVldC4gIGNhc3Qgc29tZQotCSAgZW51bXMgaW50byBpbnRzLgotCi1UaHUgT2N0IDE1IDA0OjM1OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSBhZnRlciBjb21tZW50IGNoYW5nZXMuCi0KLVRodSBPY3QgIDggMDk6MDM6MDIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBuZXcgbWFjcm8gZm9yIGdldHRpbmcgaW4geHZlYwotCi1UaHUgU2VwICAzIDA5OjEwOjUwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogIHNpemUgbmVlZHMgdG8gYmUgc2lnbmVkIGlmCi0JaXQncyBnb2luZyB0byBob2xkIG5lZ2F0aXZlIHZhbHVlcy4KLQotU3VuIEF1ZyAzMCAxNzo1MDoyNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmg6ICBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9nZGIuICBNYWRlIGluZGVwZW5kZW50Ci0Jb2YgZ2RiLiAgQWxsb3cgZGVtYW5nbGluZyBzdHlsZSBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEKLQlwYXJhbWV0ZXIgdG8gY3BsdXNfZGVtYW5nbGUoKSwgYnV0IHVzaW5nIHRoZQotCWN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSBnbG9iYWwgYXMgdGhlIGRlZmF1bHQuCi0KLVNhdCBBdWcgMjkgMTA6MDc6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogIE1lcmdlIGNvbW1lbnQgY2hhbmdlIGZyb20gY3VycmVudCBGU0YgdmVyc2lvbi4KLQotVGh1IEF1ZyAyNyAxMjo1OToyOSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogYWRkIHdlMzJrCi0KLVR1ZSBBdWcgMjUgMTU6MDc6NDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBuZXcgYWZ0ZXIgWjgwMDAgc3R1ZmYKLQotTW9uIEF1ZyAxNyAwOTowMToyMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFJlZ2VuZXJhdGVkIGFmdGVyIHBhZ2Uvc2VnbWVudCBzaXplIGNoYW5nZXMuCi0KLVNhdCBBdWcgIDEgMTM6NDY6MzEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogTWVyZ2UgY2hhbmdlcyBmcm9tIGN1cnJlbnQgRlNGIHZlcnNpb24uCi0KLU1vbiBKdWwgMjAgMjE6MDY6MjMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaCAoYXJlYV9pZCwgZmxhZ3MpOiAgUmVtb3ZlLCByZXBsYWNlIHdpdGggZXh0cmFfYXJnLAotCXVzZV9leHRyYV9hcmcsIGFuZCBtYXliZV9lbXB0eV9vYmplY3QuCi0JKiBvYnN0YWNrLmggKE9CU1RBQ0tfTUFZQkVfRU1QVFlfT0JKRUNULCBPQlNUQUNLX01NQUxMT0NfTElLRSk6Ci0JUmVtb3ZlLCByZXBsYWNlZCBieSBtYXliZV9lbXB0eV9vYmplY3QgYW5kIHVzZV9leHRyYV9hcmcgYml0ZmllbGRzLgotCSogb2JzdGFjay5oIChvYnN0YWNrX2Z1bGxfYmVnaW4sIF9vYnN0YWNrX2JlZ2luKTogIFJlbW92ZSBhcmVhX2lkCi0JYW5kIGZsYWdzIGFyZ3VtZW50cy4KLQkqIG9ic3RhY2suaCAob2JzdGFja19hbGxvY19hcmcpOiAgTmV3IG1hY3JvIHRvIHNldCBleHRyYV9hcmcuCi0KLVRodSBKdWwgMTYgMDg6MTI6NDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBuZXcgYWZ0ZXIgYWRkaW5nIEJGRF9JU19SRUxBWEFCTEUKLQotU2F0IEp1bCAgNCAwMzoyMjoyMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBSZWdlbiBhZnRlciBhZGRpbmcgQlNGX0ZJTEUuCi0KLU1vbiBKdW4gMjkgMTQ6MTg6MzYgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IHN1bmZpc2gpCi0KLQkqIG9ic3RhY2suaDogIENvbnZlcnQgYmNvcHkoKSB1c2UgdG8gbWVtY3B5KCksIHdoaWNoIGlzIG1vcmUKLQlwb3J0YWJsZSwgbW9yZSBzdGFuZGFyZCwgYW5kIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBnY2MncyBidWlsdGluCi0JZnVuY3Rpb25zIGZvciBpbmNyZWFzZWQgcGVyZm9ybWFuY2UuCi0KLVRodSBKdW4gMjUgMDQ6NDY6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmggKFBBUkFNUyk6ICBJbmNvcnBvcmF0ZSB0aGlzIG1hY3JvIGZyb20gZ2RiJ3MgZGVmcy5oLgotCUl0J3MgYSBjbGVhbmVyIHdheSB0byBmb3J3YXJkLWRlY2xhcmUgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQotRnJpIEp1biAxOSAxNTo0NjozMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIEhQUEEgbWVyZ2UuCi0KLVR1ZSBKdW4gMTYgMjE6MzA6NTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oOiBncmF0dWl0b3VzIHdoaXRlIHNwYWNlIGNoYW5nZXMgbWVyZ2VkIGZyb20gb3RoZXIgcHJlcAotCSAgcmVsZWFzZXMuCi0KLVRodSBKdW4gMTEgMDE6MTA6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgUmVnZW4nZCBmcm9tIGJmZC5jIGFmdGVyIHJlbW92aW5nIGVsZl9jb3JlX3RkYXRhX3N0cnVjdC4KLQotTW9uIE1heSAxOCAxNzoyOTowMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0Lmg6IG1lcmdlZCBjaGFuZ2VzIGZyb20gbWFrZS0zLjYyLjExLgotCi0JKiBnZXRvcHQuaDogbWVyZ2VkIGNoYW5nZXMgZnJvbSBncmVwLTEuNiAoYWxwaGEpLgotCi1GcmkgTWF5ICA4IDE0OjUzOjMyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaDogbWVyZ2VkIGNoYW5nZXMgZnJvbSBiaXNvbi0xLjE4LgotCi1TYXQgTWFyIDE0IDE3OjI1OjIwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6ICBBZGQgImFyZWFfaWQiIGFuZCAiZmxhZ3MiIG1lbWJlcnMgdG8gb2JzdGFjawotCXN0cnVjdHVyZS4gIEFkZCBvYnN0YWNrX2NodW5rZnVuKCkgYW5kIG9ic3RhY2tfZnJlZWZ1bigpIHRvCi0Jc2V0IGZ1bmN0aW9ucyBleHBsaWNpdGx5LiAgQ29udmVydCBtYXliZV9lbXB0eV9vYmplY3QgdG8KLQlhIGJpdCBpbiAiZmxhZ3MiLgotCi1UaHUgRmViIDI3IDIyOjAxOjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiB3YWl0LmggKFdJRlNUT1BQRUQpOiAgQWRkIElCTSByczYwMDAtc3BlY2lmaWMgdmVyc2lvbi4KLQotRnJpIEZlYiAyMSAyMDo0OToyMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgQWRkIG9ic3RhY2tfZnVsbF9iZWdpbi4KLQkqIGJmZC5oLCBvYnN0YWNrLmg6ICBQcm90b2xpbnQuCi0KLVRodSBKYW4gMzAgMDE6MTg6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgUmVtb3ZlIGNvbW1hIGZyb20gZW51bSBkZWNsYXJhdGlvbi4KLQotTW9uIEphbiAyNyAyMjowMToxMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaCA6IG5ldyB0YXJnZXQgZW50ciwgYmZkX3JlbGF4X3NlY3Rpb24KLQotV2VkIERlYyAxOCAxNzoxOTo0NCAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaCwgaWVlZS5oLCBvcGNvZGUvbTY4ay5oLCBvcGNvZGUvc3BhcmMuaDogIEFOU0lmeSBlbnVtcy4KLQotVGh1IERlYyAxMiAyMDo1OTo1NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZm9wZW4tc2FtZS5oLCBmb3Blbi1iaW4uaDogIE5ldyBmaWxlcyBmb3IgY29uZmlndXJpbmcKLQl3aGV0aGVyIGZvcGVuIGRpc3Rpbmd1aXNoZXMgYmluYXJ5IGZpbGVzIG9yIG5vdC4gIEZvciB1c2UKLQlieSBob3N0LWRlcGVuZGVudCBjb25maWcgZmlsZXMuCi0KLVNhdCBOb3YgMzAgMjA6NDY6NDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBjaGFuZ2UgdGhlIGRvY3VtZW50YXRpb24gZm9ybWF0LgotCi0JKiBjcmVhdGVkIGNvZmYsIGVsZiBhbmQgb3Bjb2RlIGFuZCBhb3V0IGRpcmVjdG9yaWVzLiBNb3ZlZDoKLQotCWFvdXQ2NC5oCT09PiBhb3V0L2FvdXQ2NC5oCi0JYXIuaAkJPT0+IGFvdXQvYXIuaAotCWEub3V0LmVuY2FwLmgJPT0+IGFvdXQvZW5jYXAuaAotCWEub3V0Lmhvc3QuaAk9PT4gYW91dC9ob3N0LmgKLQlhLm91dC5ocC5oCT09PiBhb3V0L2hwLmgKLQlhLm91dC5zdW40LmgJPT0+IGFvdXQvc3VuNC5oCi0JcmFubGliLmgJPT0+IGFvdXQvcmFubGliLmgKLQlyZWxvYy5oCQk9PT4gYW91dC9yZWxvYy5oCi0Jc3RhYi5kZWYJPT0+IGFvdXQvc3RhYi5kZWYKLQlzdGFiLmdudS5oCT09PiBhb3V0L3N0YWJfZ251LmgKLQotCWNvZmYtYTI5ay5oCT09PiBjb2ZmL2EyOWsuaAotCWNvZmYtaDgzMDAuaAk9PT4gY29mZi9oODMwMC5oCi0JY29mZi1pMzg2LmgJPT0+IGNvZmYvaTM4Ni5oCi0JY29mZi1pOTYwLmgJPT0+IGNvZmYvaTk2MC5oCi0JaW50ZXJuYWxjb2ZmLmgJPT0+IGNvZmYvaW50ZXJuYWwuaAotCWNvZmYtbTY4ay5oCT09PiBjb2ZmL202OGsuaAotCWNvZmYtbTg4ay5oCT09PiBjb2ZmL204OGsuaAotCWNvZmYtbWlwcy5oCT09PiBjb2ZmL21pcHMuaAotCWNvZmYtcnM2MDAwLmgJPT0+IGNvZmYvcnM2MDAwLmgKLQotCWVsZi1jb21tb24uaAk9PT4gZWxmL2NvbW1vbi5oCi0JZHdhcmYuaAkJPT0+IGVsZi9kd2FyZi5oCi0JZWxmLWV4dGVybmFsLmgJPT0+IGVsZi9leHRlcm5hbC5oCi0JZWxmLWludGVybmFsLmggID09PiBlbGYvaW50ZXJuYWwuaAotCi0JYTI5ay1vcGNvZGUuaAk9PT4gb3Bjb2RlL2EyOWsuaAotCWFybS1vcGNvZGUuaAk9PT4gb3Bjb2RlL2FybS5oCi0JaDgzMDAtb3Bjb2RlLmgJPT0+IG9wY29kZS9oODMwMC5oCi0JaTM4Ni1vcGNvZGUuaAk9PT4gb3Bjb2RlL2kzODYuaAotCWk4NjAtb3Bjb2RlLmgJPT0+IG9wY29kZS9pODYwLmgKLQlpOTYwLW9wY29kZS5oCT09PiBvcGNvZGUvaTk2MC5oCi0JbTY4ay1vcGNvZGUuaAk9PT4gb3Bjb2RlL202OGsuaAotCW04OGstb3Bjb2RlLmgJPT0+IG9wY29kZS9tODhrLmgKLQltaXBzLW9wY29kZS5oCT09PiBvcGNvZGUvbWlwcy5oCi0JbnAxLW9wY29kZS5oCT09PiBvcGNvZGUvbnAxLmgKLQluczMyay1vcGNvZGUuaAk9PT4gb3Bjb2RlL25zMzJrLmgKLQlwbi1vcGNvZGUuaAk9PT4gb3Bjb2RlL3BuLmgKLQlweXItb3Bjb2RlLmgJPT0+IG9wY29kZS9weXIuaAotCXNwYXJjLW9wY29kZS5oCT09PiBvcGNvZGUvc3BhcmMuaAotCXRhaG9lLW9wY29kZS5oCT09PiBvcGNvZGUvdGFob2UuaAotCXZheC1vcGNvZGUuaAk9PT4gb3Bjb2RlL3ZheC5oCi0KLQotCi1XZWQgTm92IDI3IDEwOjM4OjMxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbGNvZmYuaDogKGludGVybmFsX3NjbmhkcikgdG9vayBvdXQgI2RlZiBkZXBlbmRlbmN5LCBub3cKLQlzX25yZWxvYyBhbmQgc19ubG5ubyBhcmUgYWx3YXlzIGxvbmcuIAkoaW50ZXJuYWxfcmVsb2MpOiBhbGx3YXlzCi0JaGFzIGFuIG9mZnNldCBmaWVsZCBub3cuCi0KLUZyaSBOb3YgMjIgMDg6MTI6NTggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmg6ICBMaW50OyB1c2UgdW5zaWduZWQgY2hhcnMgZm9yIGV4dGVybmFsIGZpZWxkcy4KLQkqIGludGVybmFsY29mZi5oOiAgTGludDsgY2FzdCBzdG9yYWdlIGNsYXNzZXMgdG8gc2lnbmVkIGNoYXIuCi0KLVRodSBOb3YgMjEgMjE6MDE6MDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiBSZW1vdmUgdGhlIEdOVSBleHRlbmRlZCB0eXBlIGNvZGVzIChlLmcuIE5fU0VUVCkuCi0JKiBhb3V0NjQuaDogIFRoZSBoZXVyaXN0aWMgZm9yIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4KLQlzdW5vcy1zdHlsZSBhbmQgYnNkLXN0eWxlIFpNQUdJQyBmaWxlcyAod3J0LiB3aGVyZSB0aGUKLQl0ZXh0IHNlZ21lbnQgc3RhcnRzKSBpcyBtb3ZlZCBpbnRvICh0aGUgZGVmYXVsdCBkZWZpbml0aW9uIG9mKQotCXRoZSBtYWNybyBOX0hFQURFUl9JTl9URVhULiAgVGhpcyBkZWZpbml0aW9uIGlzIG9ubHkgdXNlZAotCWlmIG5vIG90aGVyIGRlZmluaXRpb24gaXMgdXNlZCAtIGUuZy4gYmZkL25ld3NvczMuYyBkZWZpbmVzCi0JTl9IRUFERVJfSU5fVEVYVCh4KSB0byBiZSBhbHdheXMgMCAoYXMgYmVmb3JlKS4KLQotVGh1IE5vdiAyMSAxMTo1MzowMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fVFhUQUREUiwgTl9UWFRPRkYsIE5fVFhUU0laRSk6ICBOZXcgZGVmaW5pdGlvbnMKLQl0aGF0IHNob3VsZCBoYW5kbGUgYWxsIHVzZXMuICBMT0dJQ0FMXyB2ZXJzaW9ucyBkZWxldGVkLgotCUVsaW1pbmF0ZSBOX0hFQURFUl9JTl9URVhULCB1c2luZyBhX2VudHJ5IHRvIGRldGVybWluZSB3aGljaAotCWtpbmQgb2Ygem1hZ2ljIGEub3V0IGZpbGUgd2UgYXJlIGxvb2tpbmcgYXQuCi0JKiBjb2ZmLXJzNjAwMC5oOiAgVHlwby4KLQotVHVlIE5vdiAxOSAxODo0MzozNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCShOb3RlOiAgVGhpcyBpcyBhIHJldmlzZWQgZW50cnksIGFzIHdhcyBhb3V0NjQuaC4pCi0JKiBhb3V0NjQuaDogIFNvbWUgY2xlYW51cHMgb2YgTl9UWFRBRERSIGFuZCBOX1RYVE9GRjoKLQlXaWxsIG5vdyB3b3JrIGZvciBib3RoIG9sZC0gYW5kIG5ldy1zdHlsZSBaTUFHSUMgZmlsZXMsCi0JZGVwZW5kaW5nIG9uIE5fSEVBREVSX0lOX1RFWFQgbWFjcm8uCi0JQWRkIExPR0lDQUxfVFhUQUREUiwgTE9JQ0FMX1RYVE9GRiBhbmQgTE9HSUNBTF9UWFRTSVpFCi0JdGhhdCBkb24ndCBjb3VudCB0aGUgZXhlYyBoZWFkZXIgYXMgcGFydAotCW9mIHRoZSB0ZXh0IHNlZ21lbnQsIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBiZmQuCi0JKiBhLm91dC5zdW40Lmg6ICBTaW1wbGlmaWVkL2ZpeGVkIGZvciBwcmV2aW91cyBjaGFuZ2UuCi0KLU1vbiBOb3YgMTggMDA6MDI6MDYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmg6ICBVcGRhdGUgdG8gRFdBUkYgZHJhZnQgNSB2ZXJzaW9uIGZyb20gZ2NjMi4KLQotVGh1IE5vdiAxNCAxOTo0NDo1OSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBBZGRlZCBkZWZzIGZvciBleHRlbmRlZCBHTlUgc3ltYm9sIHR5cGVzLAotCXN1Y2ggYXMgTl9TRVRULiAgVGhlc2UgYXJlIG5vcm1hbGx5IGlmZGVmJ2Qgb3V0IChiZWNhdXNlCi0Jb2YgY29uZmxpY3RzIHdpdGggYS5vdXQuZ251LmgpLCBidXQgYXJlIHVzZWQgYnkgYmZiX3N0YWJfbmFtZSgpLgotCi1UaHUgTm92IDE0IDE5OjE3OjAzIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYtY29tbW9uLmg6ICBBZGQgZGVmaW5lcyB0byBzdXBwb3J0IEVMRiBzeW1ib2wgdGFibGUgY29kZS4KLQotTW9uIE5vdiAxMSAxOTowMTowNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLWludGVybmFsLmgsIGVsZi1leHRlcm5hbC5oLCBlbGYtY29tbW9uLmg6ICBBZGQgc3VwcG9ydCBmb3IKLQlub3RlIHNlY3Rpb25zLCB3aGljaCBhcmUgdXNlZCBpbiBFTEYgY29yZSBmaWxlcyB0byBob2xkIGNvcGllcwotCW9mIHZhcmlvdXMgL3Byb2Mgc3RydWN0dXJlcy4KLQotVGh1IE5vdiAgNyAwODo1ODoyNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbGNvZmYuaDogdG9vayBvdXQgdGhlIE04OCBkZXBlbmRlbmN5IGluIHRoZSBsaW5lbm8KLQlzdHJ1Y3QuCi0JKiBjb2ZmLW04OGsuaDogZGVmaW5lcyBHRVRfTElORU5PX0xOTk8gYW5kIFBVVF9MSU5FTk9fTE5OTyB0byB1c2UKLQkzMmJpdCBsaW5ubyBlbnRyaWVzLgotCSogYTI5ay1vcGNvZGUuaDogZml4ZWQgZW5jb2Rpbmcgb2YgbXRhY2MKLQotU3VuIE5vdiAgMyAxMTo1NDoyMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgZnJvbSAuLi9iZmQvYmZkLWluLmggKHEudikuCi0KLUZyaSBOb3YgIDEgMTE6MTM6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oOiAgQWRkIHhfY3NlY3QgZGVmaW5lcy4KLQotRnJpIE9jdCAyNSAwMzoxODoyMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIENPRkYtcmVsYXRlZCBmaWxlcyBpbiBgY29mZi1BUkNILmgnIGZvcm0uCi0JY29mZi1hMjlrLmgsIGNvZmYtaTM4Ni5oLCBjb2ZmLWk5NjAuaCwgY29mZi1tNjhrLmgsIGNvZmYtbTg4ay5oLAotCWNvZmYtbWlwcy5oLCBjb2ZmLXJzNjAwMC5oIHRvIGJlIGV4YWN0LgotCi1UaHUgT2N0IDI0IDIyOjExOjExIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUlMvNjAwMCBzdXBwb3J0LCBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGj79G5nLVRo5W8gVvUsIGFuZAotCUpvaG4gR2lsbW9yZS4KLQotCSogYS5vdXQuZ251Lmg6ICBVcGRhdGUgc2xpZ2h0bHkuCi0JKiBiZmQuaDogIEFkZCBuZXcgZXJyb3IgY29kZSwgZml4IGRvYywgYWRkIGJmZF9hcmNoX3JzNjAwMC4KLQkqIGludGVybmFsY29mZi5oOiAgQWRkIG1vcmUgRl8gY29kZXMgZm9yIGZpbGVoZHIuICBBZGQKLQlycy82MDAwLWRlcGVuZGVudCBmaWVsZHMgdG8gYW91dGhkci4gIEFkZCBzdG9yYWdlIGNsYXNzZXMKLQl0byBzeW1lbnRzLiAgQWRkIDYwMDAtc3BlY2lmaWMgYXV4ZW50LiAgQWRkIHJfc2l6ZSBpbiByZWxvYy4KLQkqIHJzNjAwMGNvZmYuYzogIE5ldyBmaWxlLgotCi1UaHUgT2N0IDI0IDA0OjEzOjIwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBkd2FyZi5oOiBOZXcgZmlsZSBmb3IgZHdhcmYgc3VwcG9ydC4gIENvcGllZCBmcm9tIGdjYzIKLQlkaXN0cmlidXRpb24uCi0KLVdlZCBPY3QgMTYgMTM6MzE6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiAgUmVtb3ZlIFBBR0VfU0laRSBkZWZpbmVzOyB0aGV5IGFyZSB0YXJnZXQtZGVwZW5kZW50LgotCUFkZCBOX0ZOX1NFUSBmb3IgTl9GTiBzeW1ib2wgdHlwZSB1c2VkIG9uIFNlcXVlbnQgbWFjaGluZXMuCi0JKiBzdGFiLmRlZjogIEluY2x1ZGUgTl9GTl9TRVEgaW4gdGFibGUuCi0JKiBib3V0Lmg6ICBFeHRlcm5hbCBmb3JtYXRzIG9mIHN0cnVjdHVyZXMgdXNlIHVuc2lnbmVkIGNoYXJzLgotCi1GcmkgT2N0IDExIDEyOjQwOjQzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6dXBncmFkZSBmcm9tIGJmZC5jCi0JKiBpbnRlcm5hbGNvZmYuaDogYWRkIG5fbmFtZSwgbl96ZXJvZXMgYW5kIG5fb2Zmc2V0IG1hY3JvcwotCSogYW1kY29mZi5oOiBEZWZpbmUgT01BR0lDIGFuZCBBT1VUSERSU1ouCi0KLUZyaSBPY3QgMTEgMTA6NTg6MDYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGEub3V0Lmhvc3QuaDogQ2hhbmdlIFNFR01FTlRfU0laRSB0byAweDEwMDAgZm9yIFNvbnkuCi0JKiBiZmQuaCAoYWxpZ25fcG93ZXIpOiBBZGQgKGFjdHVhbGx5IG1vdmUpIGNvbW1lbnQuCi0KLVR1ZSBPY3QgIDggMTU6Mjk6MzIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5cy9oLXJ0YnNkLmg6IERlZmluZSBNSVNTSU5HX1ZGUFJJTlQgKGZvciBiaW51dGlscy9idWNvbW0uYykuCi0KLVN1biBPY3QgIDYgMTk6MjQ6MzkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiAgTW92ZSBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyB0byAuLi9iZmQvbGliYW91dC5oIHNvCi0JaXQgY2FuIGJlIHNoYXJlZCBieSBhbGwgYGEub3V0LWZhbWlseScgY29kZS4gIFJlbmFtZQotCUVYVEVSTkFMX0xJU1RfU0laRSB0byBFWFRFUk5BTF9OTElTVF9TSVpFLiAgVXNlIGJhc2ljIHR5cGVzCi0JZm9yIG5saXN0IG1lbWJlcnMsIGFuZCBtYWtlIHN0cnggaW50ZWdyYWwgcmF0aGVyIHRoYW4gcG9pbnRlci4KLQlNb3JlIGNvbW1lbnRhcnkgb24gbl90eXBlIHZhbHVlcy4KLQkqIGJvdXQuaDogIFByb3ZpZGUgYSBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyByYXRoZXIgdGhhbiBhbgotCWludGVybmFsX2V4ZWMuCi0JKiBtNjhrY29mZi5oOiAgUmVtb3ZlIGB0YWdlbnRyaWVzJyB3aGljaCBzbnVjayBpbiBmcm9tIHRoZSBpOTYwCi0JQ09GRiBwb3J0LgotCi1GcmkgT2N0ICA0IDAxOjI1OjU5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBoODMwMC1vcGNvZGUuaDogIFJlbW92ZSBgX2VudW0nIGZyb20gdGhlIHR5cGVkZWYgZm9yIGFuIGVudW0uCi0JKiBiZmQuaDogIFVwZGF0ZSB0byBtYXRjaCBiZmQgY2hhbmdlcy4KLQotCSogc3lzL2gtaTM4Nm1hY2guaCwgc3lzZGVwLmg6ICBBZGQgMzg2IE1hY2ggaG9zdCBzdXBwb3J0LgotCi1UdWUgT2N0ICAxIDA0OjU4OjQyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaCwgZWxmLWNvbW1vbi5oLCBlbGYtZXh0ZXJuYWwuaCwgZWxmLWludGVybmFsLmg6Ci0JQWRkIHByZWxpbWluYXJ5IEVMRiBzdXBwb3J0LCBzdWZmaWNpZW50IGZvciBHREIsIGZyb20gRnJlZCBGaXNoLgotCSogc3lzZGVwLmgsIHN5cy9oLWFtaXguaDogIFN1cHBvcnQgQW1pZ2EgU1ZSNC4KLQotCSogc3lzL2gtdmF4dWx0Lmg6ICBNYWtlIGl0IHdvcmsuICAoRGF2aWQgVGF5bG9yIDx0YXlsb3JAdGhpbmsuY29tPikKLQkqIGEub3V0LnZheC5oOiAgUmVtb3ZlIHVudXNlZCBhbmQgY29uZnVzaW5nIGZpbGUuCi0KLU1vbiBTZXAgMzAgMTI6NTI6MzUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC5oOiBEZWZpbmUgTkVXU09TM19TWVMsIGFuZCB1c2UgaXQuCi0KLUZyaSBTZXAgMjAgMTM6Mzg6MjEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGEub3V0LmdudS5oIChOX0ZOKTogIEl0cyB2YWx1ZSAqcmVhbGx5IGlzKiAweDFGLgotCUZpeCBpdCwgYW5kIGFkZCBjb21tZW50cyB3YXJuaW5nIGFib3V0IG9yLWluZyBOX0VYVCB3aXRoIGl0Ci0JYW5kL29yIE5fV0FSTklORy4KLQkqIGFvdXQ2NC5oIChOX0ZOKTogIEZpeCB2YWx1ZSwgYWRkIGNvbW1lbnRzIGFib3V0IE5fRVhULgotCSogc3RhYi5kZWYgKHRhYmxlIGF0IGVuZCk6ICBVcGRhdGUgdG8gc2hvdyBhbGwgdGhlIHR5cGUKLQl2YWx1ZXMgPDB4MjAsIGluY2x1ZGluZyBsb3cgb3JkZXIgYml0cy4gIE1vdmUgTl9GTiB0bwotCWl0cyByaWdodGZ1bCBwbGFjZS4KLQotVHVlIFNlcCAxNyAxNzo0MTozNyAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzeXMvaC1pcml4My5oOiAgc2dpL2lyaXggc3VwcG9ydC4KLQotVHVlIFNlcCAxNyAwNzo1Mjo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmIChOX0RFRkQpOiAgQWRkIEdOVSBNb2R1bGEtMiBkZWJ1ZyBzdGFiLCBmcm9tIEFuZHJldwotCUJlZXJzLgotCi1UaHUgU2VwIDEyIDE0OjEyOjU5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWxjb2ZmLmggKFNZTU5NTEVOLCBGSUxOTUxFTiwgRElNTlVNKTogIERlZmluZSB0aGVzZQotCWZvciBpbnRlcm5hbGNvZmYsIHNlcGFyYXRlbHkgZnJvbSB0aGUgdmFyaW91cyBleHRlcm5hbCBjb2ZmJ3MuCi0JKiBhbWRjb2ZmLmgsIGJjczg4a2NvZmYuaCwgaTM4NmNvZmYuaCwgaW50ZWwtY29mZi5oLCBtNjhrY29mZi5oLAotCW04OGstYmNzLmg6IFByZWZpeCBTWU1OTUxFTiwgRklMTk1MRU4sIGFuZCBESU1OVU0gd2l0aCBFXydzIGZvcgotCXRoZSBleHRlcm5hbCBzdHJ1Y3QgZGVmaW5pdGlvbnMuCi0JKiBlY29mZi5oOiBSZW1vdmUgdGhlc2UgI2RlZmluZSdzLCBrbHVkZ2Ugbm8gbG9uZ2VyIG5lZWRlZC4KLQotCSogc3lzL2gtdWx0cmEzLmg6ICBBZGQgbmV3IFVsdHJhY29tcHV0ZXIgaG9zdC4KLQkqIHN5c2RlcC5oOiAgQWRkIFVMVFJBM19TWU0xX1NZUyBhbmQgdXNlIGl0LgotCi1UdWUgU2VwIDEwIDEwOjExOjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaTM4NmNvZmYuaCAoTElORVNaKTogIEFsd2F5cyA2LCBub3QgYmFzZWQgb24gc2l6ZW9mKCkuCi0JKEZpeCBmcm9tIFBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4pCi0KLVdlZCBTZXAgIDQgMDg6NTg6MzcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhLm91dC5nbnUuaCwgYW91dDY0Lmg6ICBBZGQgTl9XQVJOSU5HLiAgQ2hhbmdlIE5fRk4gdG8gMHgwRSwKLQl0byBtYXRjaCBTdW5PUyBhbmQgQlNELiAgQWRkIE5fQ09NTSBhcyAweDEyIGZvciBTdW5PUyBzaGFyZWQgbGliCi0Jc3VwcG9ydC4KLQkqIHN0YWIuZGVmOiAgQWRkIE5fQ09NTSB0byB0YWJsZSwgZml4IG92ZXJsYXAgY29tbWVudC4KLQotVHVlIFNlcCAgMyAwNjoyOToyMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlNZXJnZSB3aXRoIGxhdGVzdCBGU0YgdmVyc2lvbnMgb2YgdGhlc2UgZmlsZXMuCi0KLQkqIHN0YWIuZ251Lmg6ICBBZGQgTEFTVF9VTlVTRURfU1RBQl9DT0RFLgotCSogc3RhYi5kZWY6ICBVcGRhdGUgdG8gR1BMMi4gIE1vdmUgTl9XQVJOSU5HIG91dCwgc2luY2Ugbm90IGEKLQlkZWJ1ZyBzeW1ib2wuICBDaGFuZ2UgY29tbWVudHMsIGFuZCByZW9yZGVyIHRhYmxlIHRvIG51bWVyaWMKLQlvcmRlci4gIFVwZGF0ZSBmaW5hbCB0YWJsZSBjb21tZW50LgotCShOX0RTTElORSwgTl9CU0xJTkUpOiAgUmVudW1iZXIgZnJvbSAweDY2IGFuZCAweDY4LCB0byAweDQ2IGFuZCAweDQ4LgotCi0JKiBvYnN0YWNrLmg6ICBHUEwyLiAgTWVyZ2UuCi0KLUZyaSBBdWcgMjMgMDE6NTQ6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhLm91dC5nbnUuaCwgYS5vdXQuc3VuNC5oOiAgTWFrZSBTRUdNRU5UX1NJWkUgYWJsZSB0byBkZXBlbmQKLQlvbiB0aGUgcGFydGljdWxhciBhLm91dCBiZWluZyBleGFtaW5lZC4KLQkqIGEub3V0LnN1bjQuaDogIERlZmluZSBzZWdtZW50IHNpemVzIGZvciBTdW4tMydzIGFuZCBTdW4tNCdzLgotCSogRklYTUU6ICBhLm91dC5nbnUuaCBpcyBhbG1vc3Qgb2Jzb2xldGUuCi0JKiBGSVhNRTogIGEub3V0LnN1bjQuaCBzaG91bGQgYmUgcmVuYW1lZCBhLm91dC5zdW4uaCBub3cuCi0KLVdlZCBBdWcgMjEgMjA6MzI6MTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBTdGFydCBhIENoYW5nZUxvZyBmb3IgdGhlIGluY2x1ZGVzIGRpcmVjdG9yeS4KLQotCSogYS5vdXQuZ251LmggKE5fRk4pOiAgRml4IHZhbHVlIC0tIHdhcyAxNSwgc2hvdWxkIGJlIDB4MUUuCi0JKiBzdGFiLmRlZjogIFVwZGF0ZSBhbGxvY2F0aW9uIHRhYmxlIGluIGNvbW1lbnRzIGF0IGVuZCwKLQl0byByZWZsZWN0IHJlYWxpdHkgYXMgSSBrbm93IGl0LgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2Fuc2lkZWNsLmggYi9pbmNsdWRlL2Fuc2lkZWNsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjlmYjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hbnNpZGVjbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qIEFOU0kgYW5kIHRyYWRpdGlvbmFsIEMgY29tcGF0YWJpbGl0eSBtYWNyb3MKLSAgIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFOU0kgYW5kIHRyYWRpdGlvbmFsIEMgY29tcGF0aWJpbGl0eSBtYWNyb3MKLQotICAgQU5TSSBDIGlzIGFzc3VtZWQgaWYgX19TVERDX18gaXMgI2RlZmluZWQuCi0KLSAgIE1hY3JvCUFOU0kgQyBkZWZpbml0aW9uCVRyYWRpdGlvbmFsIEMgZGVmaW5pdGlvbgotICAgLS0tLS0JLS0tLSAtIC0tLS0tLS0tLS0JLS0tLS0tLS0tLS0gLSAtLS0tLS0tLS0tCi0gICBQVFIJCWB2b2lkIConCQlgY2hhciAqJwotICAgTE9OR19ET1VCTEUJYGxvbmcgZG91YmxlJwkJYGRvdWJsZScKLSAgIFZPTEFUSUxFCWB2b2xhdGlsZScJCWAnCi0gICBTSUdORUQJYHNpZ25lZCcJCWAnCi0gICBQVFJDT05TVAlgdm9pZCAqY29uc3QnCQlgY2hhciAqJwotICAgQU5TSV9QUk9UT1RZUEVTICAxCQkJbm90IGRlZmluZWQKLQotICAgQ09OU1QgaXMgYWxzbyBkZWZpbmVkLCBidXQgaXMgb2Jzb2xldGUuICBKdXN0IHVzZSBjb25zdC4KLQotICAgb2Jzb2xldGUgLS0gICAgIERFRlVOIChuYW1lLCBhcmdsaXN0LCBhcmdzKQotCi0JRGVmaW5lcyBmdW5jdGlvbiBOQU1FLgotCi0JQVJHTElTVCBsaXN0cyB0aGUgYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBlbmNsb3NlZCBpbgotCXBhcmVudGhlc2VzLiAgQVJHTElTVCBiZWNvbWVzIHRoZSBhcmd1bWVudCBsaXN0IGluIHRyYWRpdGlvbmFsIEMuCi0KLQlBUkdTIGxpc3QgdGhlIGFyZ3VtZW50cyB3aXRoIHRoZWlyIHR5cGVzLiAgSXQgYmVjb21lcyBhIHByb3RvdHlwZSBpbgotCUFOU0kgQywgYW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9ucyBpbiB0cmFkaXRpb25hbCBDLiAgQXJndW1lbnRzIHNob3VsZAotCWJlIHNlcGFyYXRlZCB3aXRoIGBBTkQnLiAgRm9yIGZ1bmN0aW9ucyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0JYXJndW1lbnRzLCB0aGUgbGFzdCB0aGluZyBsaXN0ZWQgc2hvdWxkIGJlIGBET1RTJy4KLQotICAgb2Jzb2xldGUgLS0gICAgIERFRlVOX1ZPSUQgKG5hbWUpCi0KLQlEZWZpbmVzIGEgZnVuY3Rpb24gTkFNRSwgd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzLgotCi0gICBvYnNvbGV0ZSAtLSAgICAgRVhGVU4gKG5hbWUsIChwcm90b3R5cGUpKQktLSBvYnNvbGV0ZS4KLQotCVJlcGxhY2VkIGJ5IFBBUkFNUy4gIERvIG5vdCB1c2U7IHdpbGwgZGlzYXBwZWFyIHNvbWVkYXkgc29vbi4KLQlXYXMgdXNlZCBpbiBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JSW4gQU5TSSBDIGl0IGlzIGBOQU1FIFBST1RPVFlQRScgKHNvIFBST1RPVFlQRSBzaG91bGQgYmUgZW5jbG9zZWQgaW4KLQlwYXJlbnRoZXNlcykuICBJbiB0cmFkaXRpb25hbCBDIGl0IGlzIGBOQU1FKCknLgotCUZvciBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLCBQUk9UT1RZUEUgc2hvdWxkIGJlIGAodm9pZCknLgotCi0gICBvYnNvbGV0ZSAtLSAgICAgUFJPVE8gKHR5cGUsIG5hbWUsIChwcm90b3R5cGUpICAgIC0tIG9ic29sZXRlLgotCi0JVGhpcyBvbmUgaGFzIGFsc28gYmVlbiByZXBsYWNlZCBieSBQQVJBTVMuICBEbyBub3QgdXNlLgotCi0gICBQQVJBTVMgKChhcmdzKSkKLQotCVdlIGNvdWxkIHVzZSB0aGUgRVhGVU4gbWFjcm8gdG8gaGFuZGxlIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMsIGJ1dAotCXRoZSBuYW1lIGlzIG1pc2xlYWRpbmcgYW5kIHRoZSByZXN1bHQgaXMgdWdseS4gIFNvIHdlIGp1c3QgZGVmaW5lIGEKLQlzaW1wbGUgbWFjcm8gdG8gaGFuZGxlIHRoZSBwYXJhbWV0ZXIgbGlzdHMsIGFzIGluOgotCi0JICAgICAgc3RhdGljIGludCBmb28gUEFSQU1TICgoaW50LCBjaGFyKSk7Ci0KLQlUaGlzIHByb2R1Y2VzOiAgYHN0YXRpYyBpbnQgZm9vKCk7JyBvciBgc3RhdGljIGludCBmb28gKGludCwgY2hhcik7JwotCi0JRVhGVU4gd291bGQgaGF2ZSBkb25lIGl0IGxpa2UgdGhpczoKLQotCSAgICAgIHN0YXRpYyBpbnQgRVhGVU4gKGZvbywgKGludCwgY2hhcikpOwotCi0JYnV0IHRoZSBmdW5jdGlvbiBpcyBub3QgZXh0ZXJuYWwuLi5hbmQgaXQncyBoYXJkIHRvIHZpc3VhbGx5IHBhcnNlCi0JdGhlIGZ1bmN0aW9uIG5hbWUgb3V0IG9mIHRoZSBtZXNzLiAgIEVYRlVOIHNob3VsZCBiZSBjb25zaWRlcmVkCi0Jb2Jzb2xldGU7IG5ldyBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvIHVzZSBQQVJBTVMuCi0KLSAgIERPVFMgaXMgYWxzbyBvYnNvbGV0ZS4KLQotICAgRXhhbXBsZXM6Ci0KLQlleHRlcm4gaW50IHByaW50ZiBQQVJBTVMgKChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOwotKi8KLQotI2lmbmRlZglfQU5TSURFQ0xfSAotCi0jZGVmaW5lCV9BTlNJREVDTF9ICTEKLQotCi0vKiBFdmVyeSBzb3VyY2UgZmlsZSBpbmNsdWRlcyB0aGlzIGZpbGUsCi0gICBzbyB0aGV5IHdpbGwgYWxsIGdldCB0aGUgc3dpdGNoIGZvciBsaW50LiAgKi8KLS8qIExJTlRMSUJSQVJZICovCi0KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfQUlYKSB8fCAoZGVmaW5lZCAoX19taXBzKSAmJiBkZWZpbmVkIChfU1lTVFlQRV9TVlI0KSkgfHwgZGVmaW5lZChfV0lOMzIpCi0vKiBBbGwga25vd24gQUlYIGNvbXBpbGVycyBpbXBsZW1lbnQgdGhlc2UgdGhpbmdzIChidXQgZG9uJ3QgYWx3YXlzCi0gICBkZWZpbmUgX19TVERDX18pLiAgVGhlIFJJU0MvT1MgTUlQUyBjb21waWxlciBkZWZpbmVzIHRoZXNlIHRoaW5ncwotICAgaW4gU1ZSNCBtb2RlLCBidXQgZG9lcyBub3QgZGVmaW5lIF9fU1REQ19fLiAgKi8KLQotI2RlZmluZQlQVFIJCXZvaWQgKgotI2RlZmluZQlQVFJDT05TVAl2b2lkICpDT05TVAotI2RlZmluZQlMT05HX0RPVUJMRQlsb25nIGRvdWJsZQotCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZQlBTkQJCSwKLSNkZWZpbmUJTk9BUkdTCQl2b2lkCi0jZGVmaW5lCVZPTEFUSUxFCXZvbGF0aWxlCi0jZGVmaW5lCVNJR05FRAkJc2lnbmVkCi0jZW5kaWYgLyogISBJTl9HQ0MgKi8KLQotI2RlZmluZSBQQVJBTVMocGFyYW1saXN0KQkJcGFyYW1saXN0Ci0jZGVmaW5lIEFOU0lfUFJPVE9UWVBFUwkJCTEKLQotI2RlZmluZSBWUEFSQU1TKEFSR1MpCQkJQVJHUwotI2RlZmluZSBWQV9TVEFSVCh2YV9saXN0LHZhcikJCXZhX3N0YXJ0KHZhX2xpc3QsdmFyKQotCi0vKiBUaGVzZSBhcmUgb2Jzb2xldGUuICBEbyBub3QgdXNlLiAgKi8KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lIENPTlNUCQkJCWNvbnN0Ci0jZGVmaW5lIERPVFMJCQkJLCAuLi4KLSNkZWZpbmUgUFJPVE8odHlwZSwgbmFtZSwgYXJnbGlzdCkJdHlwZSBuYW1lIGFyZ2xpc3QKLSNkZWZpbmUgRVhGVU4obmFtZSwgcHJvdG8pCQluYW1lIHByb3RvCi0jZGVmaW5lIERFRlVOKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCW5hbWUoYXJncykKLSNkZWZpbmUgREVGVU5fVk9JRChuYW1lKQkJbmFtZSh2b2lkKQotI2VuZGlmIC8qICEgSU5fR0NDICovCi0KLSNlbHNlCS8qIE5vdCBBTlNJIEMuICAqLwotCi0jZGVmaW5lCVBUUgkJY2hhciAqCi0jZGVmaW5lCVBUUkNPTlNUCVBUUgotI2RlZmluZQlMT05HX0RPVUJMRQlkb3VibGUKLQotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUJQU5ECQk7Ci0jZGVmaW5lCU5PQVJHUwotI2RlZmluZQlWT0xBVElMRQotI2RlZmluZQlTSUdORUQKLSNlbmRpZiAvKiAhSU5fR0NDICovCi0KLSNpZm5kZWYgY29uc3QgLyogc29tZSBzeXN0ZW1zIGRlZmluZSBpdCBpbiBoZWFkZXIgZmlsZXMgZm9yIG5vbi1hbnNpIG1vZGUgKi8KLSNkZWZpbmUJY29uc3QKLSNlbmRpZgotCi0jZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpCQkoKQotCi0jZGVmaW5lIFZQQVJBTVMoQVJHUykJCQkodmFfYWxpc3QpIHZhX2RjbAotI2RlZmluZSBWQV9TVEFSVCh2YV9saXN0LHZhcikJCXZhX3N0YXJ0KHZhX2xpc3QpCi0KLS8qIFRoZXNlIGFyZSBvYnNvbGV0ZS4gIERvIG5vdCB1c2UuICAqLwotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUgQ09OU1QKLSNkZWZpbmUgRE9UUwotI2RlZmluZSBQUk9UTyh0eXBlLCBuYW1lLCBhcmdsaXN0KQl0eXBlIG5hbWUgKCkKLSNkZWZpbmUgRVhGVU4obmFtZSwgcHJvdG8pCQluYW1lKCkKLSNkZWZpbmUgREVGVU4obmFtZSwgYXJnbGlzdCwgYXJncykJbmFtZSBhcmdsaXN0IGFyZ3M7Ci0jZGVmaW5lIERFRlVOX1ZPSUQobmFtZSkJCW5hbWUoKQotI2VuZGlmIC8qICEgSU5fR0NDICovCi0KLSNlbmRpZgkvKiBBTlNJIEMuICAqLwotCi0jZW5kaWYJLyogYW5zaWRlY2wuaAkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L0NoYW5nZUxvZyBiL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGNmZDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi1TdW4gSnVuIDI4IDExOjMzOjQ4IDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KLQotCSogc3RhYi5kZWY6ICBBZGQgTl9BTElBUyBmcm9tIFN1blBybyBGNzcuCi0KLU1vbiBNYXIgMTEgMTI6MTU6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFiLmRlZjogVXNlIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIHJhdGhlciB0aGFuIF9fZGVmaW5lX3N0YWIKLQlmb3IgZHVwbGljYXRlIGVudHJpZXMgTl9CUk9XUyBhbmQgTl9NT0QyLgotCSogc3RhYl9nbnUuaCAoX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZwotCXN0YWIuZGVmLgotCi1GcmkgT2N0IDI3IDE3OjQ3OjE2IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGFvdXQ2NC5oLCBob3N0LmgsIGhwMzAwaHB1eC5oLCBzdW40Lmg6IENoYW5nZWQgUEFHRV9TSVpFIHRvCi0JVEFSR0VUX1BBR0VfU0laRS4KLQotVHVlIFNlcCAxMiAxMjowNzowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bjQuaCAoc3RydWN0IGludGVybmFsX3N1bjRfZHluYW1pY19saW5rKTogQ2hhbmdlIGFsbCBmaWVsZHMKLQlmcm9tIGxvbmcgdG8gdW5zaWduZWQgbG9uZy4KLQotV2VkIEp1bCAxMiAwMDoxNToxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogc3VuNC5oIChQQUdFX1NJWkUpOiBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcuCi0KLVRodSBKdW4gMTYgMTQ6MjI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoQk1BR0lDKTogRGVmaW5lLgotCi1TYXQgSnVuIDExIDE2OjE2OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCB3ZWFrIHN5bWJvbHMgYXMgYW4gZXh0ZW5zaW9uIHRvIGEub3V0LgotCSogYW91dDY0LmggKE5fV0VBS1UsIE5fV0VBS0EsIE5fV0VBS1QsIE5fV0VBS0QsIE5fV0VBS0IpOiBEZWZpbmUuCi0JKiBzdGFiLmRlZjogVXBkYXRlIHN5bWJvbCB2YWx1ZSB0YWJsZS4KLQotVGh1IEp1biAgMiAxNzoxMzozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN1bjQuaCAoRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpOiBDb3JyZWN0IGZyb20gMjggdG8KLQkyNC4gIEZpeCB1cCBsZF9nb3QgY29tbWVudC4KLQotV2VkIE1hciAzMCAwMDozMTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGR5bml4My5oOiAgQ2xlYW51cCwgYWRhcHQgdG8gY3VycmVudCBiZmQgdmVyc2lvbi4KLQotU2F0IEZlYiAyNiAxMDoyNTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgotCi1GcmkgRmViIDExIDEyOjU2OjA0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXIuaCAoQVJNQUcsIEFSTUFHQiwgQVJGTUFHKTogQ2hhbmdlICdcbicgdG8gJ1wwMTInLCBmb3IgZ3JlYXRlcgotCXBvcnRhYmlsaXR5LgotCi1GcmkgSmFuIDIxIDAwOjU5OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3VuNC5oOiBBZGRlZCBpbmZvcm1hdGlvbiBhYm91dCBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgotCi1GcmkgSmFuICA3IDA4OjIwOjEzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9UWFRBRERSKTogQWRkIGNvbW1lbnQgcmVnYXJkaW5nIE9NQUdJQyBhbmQgTk1BR0lDLgotCi1TYXQgRGVjIDI1IDE0OjU1OjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9EQVRPRkYpOiBEb24ndCBwYWQgKHJldmVydCBjaGFuZ2Ugb2YgOCBKdWwgMTk5MykuCi0KLVR1ZSBOb3YgMTYgMTU6NDM6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiBOZXcgbWFjcm9zIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgYW5kIE5fRElTS19CTE9DS19TSVpFCi0JZm9yIExpbnV4IFpNQUdJQy4KLQkoTl9UWFRPRkYsIE5fREFUT0ZGKTogVXNlIHRoZW0uCi0KLVRodSBOb3YgIDQgMDA6MzM6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUpOiBGaXhlZCB2YWx1ZSB0byBtYXRjaAotCXN1bjMgc3lzdGVtOyB1c2VkIHRvIG92ZXJsYXAgb3RoZXIgZmllbGRzLgotCShSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpOiBMaWtld2lzZS4KLQotV2VkIE5vdiAgMyAxMzo0ODoyNyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSk6IE1ha2UgaXQgMHgxMCAoS2VuJ3MKLQlzdWdnZXN0aW9uKSB0byBhdm9pZCBjb25mbGljdCB3aXRoIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUuCi0KLUZyaSBPY3QgMjkgMTU6MDk6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguaCAoTl9TSEFSRURfTElCKTogRGVmaW5lIHRvIGJlIDAuCi0KLU1vbiBTZXAgMTMgMjE6MDA6NTYgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFyLmggKEFSTUFQX1RJTUVfT0ZGU0VUKTogIEFkZCBhbmQgZGVzY3JpYmUuCi0KLU1vbiBBdWcgMjMgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggW0FSQ0hfU0laRSAhPSA2NF06IEFsbG93IE5fQkFETUFHIHRvIGJlIG92ZXJyaWRkZW4uCi0KLU1vbiBBdWcgMTYgMTQ6MzA6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0YWJfZ251Lmg6IEluY2x1ZGUgYW91dC9zdGFiLmRlZiBub3QganVzdCBzdGFiLmRlZi4KLQotU3VuIEp1bCAxOCAyMTo0MTo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGR5bml4My5oOiBOZXcsIGZvciBzeW1tZXRyeSBydW5uaW5nIGR5bml4LgotCi1UaHUgSnVsICA4IDEyOjUyOjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9CQURNQUcpOiBSZWNvZ25pemUgUU1BR0lDLgotCU5fVFhUT0ZGLCBOX1RYVEFERFIsIE5fVFhUU0laRTogU3BlY2lhbCBjb2RlIGZvciBRTUFHSUMuCi0JTl9EQVRPRkY6IFBhZCB0ZXh0IHNpemUgaWYgd2UgbmVlZCB0by4KLQotRnJpIEp1biAxOCAxOToxOTozOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWYgKE5fRUNPTUwpOiBGaXggY29tbWVudC4KLQotTW9uIE1heSAzMSAwOToyMTozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6IFJlbW92ZSBTb2xhcmlzIGluZm9ybWF0aW9uIG9uIE5fRlVOIHN0YWJzdHJpbmcgZ3JhbW1hcjsKLQlJJ3ZlIHRyYW5zZmVycmVkIGl0IHRvIGdkYi9kb2Mvc3RhYnMudGV4aW5mbywgd2hlcmUgaXQgYmVsb25ncy4KLQotTW9uIE1heSAxMCAwNTo0ODo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4Lmg6IFBhdGNoIGZyb20gR2xlbm4gRW5nZWwgZm9yIGxpbmtlciBwcm9ibGVtIGFuZAotCWNvbXBhdGliaWxpdHkgZml4OgotCShPTUFHSUMsIE5NQUdJQyk6IE5ldyBkZWZpbml0aW9ucy4KLQkoU0hBUkVNQUdJQyk6IERlbGV0ZWQuCi0JKEhQVVhfRE9UX09fTUFHSUMpOiBOZXcgbWFjcm8uCi0JKF9OX0JBRE1BRyk6IEFkanVzdGVkLgotCShOX0hFQURFUl9JTl9URVhULCBOX0RBVEFERFIpOiBOZXcgbWFjcm9zLgotCi1UaHUgQXByIDI5IDEyOjA3OjM3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguaDogTmV3IGZpbGUgZnJvbSBHbGVubiBFbmdlbCwgZ2xlbm5lQGxzaWQuaHAuY29tLgotCi1UdWUgQXByIDI3IDA1OjUxOjA0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoc3RydWN0IGV4dGVybmFsX2V4ZWMsICpNQUdJQywgTl9CQURNQUcpOiBEb24ndCBkZWZpbmUKLQlpZiBgZXh0ZXJuYWxfZXhlYycgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKE5fREFUT0ZGLCBOX1RSRUxPRkYsIE5fRFJFTE9GRiwgTl9TWU1PRkYsIE5fU1RST0ZGKTogRG9uJ3QgZGVmaW5lCi0JaWYgYWxyZWFkeSBkZWZpbmVkLgotCShzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QsIEVYVEVSTkFMX05MSVNUX1NJWkUpOiBEb24ndCBkZWZpbmUgaWYKLQlgZXh0ZXJuYWxfbmxpc3QnIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi1TYXQgQXVnIDE1IDA0OjIzOjAyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhZG9iZS5oOiAgQWRkIGRlc2NyaXB0aW9uIG9mIGEub3V0LmFkb2JlIGZvcm1hdC4KLQotRnJpIEp1bCAgMyAwMDozNjo1MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBVcGRhdGUgbW9yZSBTb2xhcmlzIGRlZmluaXRpb25zLgotCSogc3RhYl9nbnUuaDogIEFkZCBOX1NPIGxhbmd1YWdlIHR5cGVzLCBhbmQgU29sYXJpcyBiYXNpYyBmbG9hdCB0eXBlcy4KLQotU3VuIEp1biAxNCAxMDo1Mzo1MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBVcGRhdGUgZGVzY3JpcHRpb25zIG9mIFNvbGFyaXMtMiBzdGFiczsgYWRkIE5fVU5ERi4KLQotVGh1IEp1biAxMSAwMToxMjowNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBBZGQgTl9PQkogYW5kIE5fT1BUIGZyb20gU29sYXJpcy0yLgotCi1UaHUgSmFuIDMwIDE4OjEyOjQ0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0L2FvdXQ2NC5oOiBOX1RYVFNJWkUgbmVlZHMgc29tZSBtb3JlIHBhcmVudGhlc2VzLgotCUkgZG9uJ3QgdHJ1c3QgQyBwcmVjZWRlbmNlLgotCi1XZWQgRGVjIDE4IDE0OjMyOjAxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0L2FvdXQ2NC5oOiAgTW92ZSBjb21tb24gc3Vub3Mtc3BlY2lmaWMgdGVzdAotCXRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzIGludG8gbmV3IG1hY3JvIE5fU0hBUkVEX0xJQi4KLQlVc2UgaXQgdG8gc2ltcGxpZnkmcmVmb3JtYXQgTl9UWFRBRERSLCBOX1RYVE9GRiwgTl9UWFRTSVpFLgotCi1TYXQgTm92IDMwIDIwOjM0OjUyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBDaGFuZ2VMb2csIGFvdXQ2NC5oLCBhci5oLCBlbmNhcC5oLCBob3N0LmgsIGhwLmgsIHJhbmxpYi5oLAotCXJlbG9jLmgsIHN0YWIuZGVmLCBzdGFiX2dudS5oLCBzdW40Lmg6IEFsbCBtb3ZlZCBmcm9tIHRoZQotCWRldm8vaW5jbHVkZSBkaXJlY3RvcnkKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2Fkb2JlLmggYi9pbmNsdWRlL2FvdXQvYWRvYmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZjE1Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvYWRvYmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKiBgYS5vdXQuYWRvYmUnIGRpZmZlcmVuY2VzIGZyb20gc3RhbmRhcmQgYS5vdXQgZmlsZXMgKi8KLQotI2lmbmRlZiBfX0FfT1VUX0FET0JFX0hfXwotI2RlZmluZSBfX0FfT1VUX0FET0JFX0hfXwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotCi0vKiBTdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBpcyB0aGUgc2FtZS4gICovCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBvbiBkaXNrIG9mIHRoZSAzMi1iaXQgb3IgNjQtYml0IGV4ZWMgaGVhZGVyLiAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAKLXsKLSAgYmZkX2J5dGUgZV9pbmZvWzRdOwkJLyogbWFnaWMgbnVtYmVyIGFuZCBzdHVmZgkJKi8KLSAgYmZkX2J5dGUgZV90ZXh0W0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCBzZWN0aW9uIGluIGJ5dGVzCSovCi0gIGJmZF9ieXRlIGVfZGF0YVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2Jzc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGJzcyBhcmVhIGluIGJ5dGVzIAkJKi8KLSAgYmZkX2J5dGUgZV9zeW1zW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGluIGJ5dGVzIAkqLwotICBiZmRfYnl0ZSBlX2VudHJ5W0JZVEVTX0lOX1dPUkRdOyAvKiBzdGFydCBhZGRyZXNzIAkJCSovCi0gIGJmZF9ieXRlIGVfdHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KLSAgYmZkX2J5dGUgZV9kcnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHJlbG9jYXRpb24gaW5mbyAJKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSg0ICsgQllURVNfSU5fV09SRCAqIDcpCi0KLS8qIE1hZ2ljIG51bWJlcnMgZm9yIGEub3V0IGZpbGVzICovCi0KLSN1bmRlZglaTUFHSUMKLSNkZWZpbmUJWk1BR0lDCTB4QUQwQkUJCS8qIEN1dGUsIGVoPyAgKi8KLSN1bmRlZglPTUFHSUMKLSN1bmRlZglOTUFHSUMKLQotI2RlZmluZSBOX0JBRE1BRyh4KQkgICgoeCkuYV9pbmZvICE9IFpNQUdJQykKLQotLyogQnkgZGVmYXVsdCwgc2VnbWVudCBzaXplIGlzIGNvbnN0YW50LiAgQnV0IHNvbWUgbWFjaGluZXMgb3ZlcnJpZGUgdGhpcwotICAgdG8gYmUgYSBmdW5jdGlvbiBvZiB0aGUgYS5vdXQgaGVhZGVyIChlLmcuIG1hY2hpbmUgdHlwZSkuICAqLwotI2lmbmRlZglOX1NFR1NJWkUKLSNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQotI2VuZGlmCi0jdW5kZWYgTl9TRUdTSVpFICAgLyogRklYTUVYWFhYICovCi0KLS8qIFNlZ21lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhLm91dC5BZG9iZSBmb3JtYXQgaXMgc3BlY2lmaWVkIGFmdGVyIHRoZQotICAgZmlsZSBoZWFkZXIuICBJdCBjb250YWlucyBOIHNlZ21lbnQgZGVzY3JpcHRvcnMsIGZvbGxvd2VkIGJ5IG9uZSB3aXRoCi0gICBhIHR5cGUgb2YgemVyby4gIAotCi0gICBUaGUgYWN0dWFsIHRleHQgb2YgdGhlIHNlZ21lbnRzIHN0YXJ0cyBhdCBOX1RYVE9GRiBpbiB0aGUgZmlsZSwKLSAgIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgb3IgaG93IGZldyBzZWdtZW50IGhlYWRlcnMgdGhlcmUgYXJlLiAgKi8KLQotc3RydWN0IGV4dGVybmFsX3NlZ2Rlc2MgewotCXVuc2lnbmVkIGNoYXIgZV90eXBlWzFdOwotCXVuc2lnbmVkIGNoYXIgZV9zaXplWzNdOwotCXVuc2lnbmVkIGNoYXIgZV92aXJ0YmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZmlsZWJhc2VbNF07Ci19OwotCi1zdHJ1Y3QgaW50ZXJuYWxfc2VnZGVzYyB7Ci0JdW5zaWduZWQgaW50CWFfdHlwZTo4OwkvKiBTZWdtZW50IHR5cGUgTl9URVhULCBOX0RBVEEsIDAgKi8KLQl1bnNpZ25lZCBpbnQgCWFfc2l6ZToyNDsJLyogU2VnbWVudCBzaXplICovCi0JYmZkX3ZtYQkJYV92aXJ0YmFzZTsJLyogVmlydHVhbCBhZGRyZXNzICovCi0JdW5zaWduZWQgaW50CWFfZmlsZWJhc2U7CS8qIEJhc2UgYWRkcmVzcyBpbiBvYmplY3QgZmlsZSAqLwotfTsKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotCi0vKiBUaGlzIGlzIGRvY3VtZW50ZWQgdG8gYmUgYXQgMTAyNCwgYnV0IGFwcGVhcnMgdG8gcmVhbGx5IGJlIGF0IDIwNDguCi0gICBGSVhNRT8hICAqLwotI2RlZmluZSBOX1RYVE9GRih4KQkyMDQ4Ci0KLSNkZWZpbmUJTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotCi0jZGVmaW5lIE5fREFUQUREUih4KQotCi0jZGVmaW5lIE5fQlNTQUREUih4KQotCi0vKiBPZmZzZXRzIG9mIHRoZSB2YXJpb3VzIHBvcnRpb25zIG9mIHRoZSBmaWxlIGFmdGVyIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkgKQotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQwKLS8qIFN5bWJvbHMgKi8KLXN0cnVjdCBleHRlcm5hbF9ubGlzdCB7Ci0gIGJmZF9ieXRlIGVfc3RyeFtCWVRFU19JTl9XT1JEXTsJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgb2YgbmFtZSAqLwotICBiZmRfYnl0ZSBlX3R5cGVbMV07CQkJLyogdHlwZSBvZiBzeW1ib2wgKi8KLSAgYmZkX2J5dGUgZV9vdGhlclsxXTsJCQkvKiBtaXNjIGluZm8gKHVzdWFsbHkgZW1wdHkpICovCi0gIGJmZF9ieXRlIGVfZGVzY1syXTsJCQkvKiBkZXNjcmlwdGlvbiBmaWVsZCAqLwotICBiZmRfYnl0ZSBlX3ZhbHVlW0JZVEVTX0lOX1dPUkRdOwkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLX07Ci0KLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAoQllURVNfSU5fV09SRCs0K0JZVEVTX0lOX1dPUkQpCi0KLXN0cnVjdCBpbnRlcm5hbF9ubGlzdCB7Ci0gIHVuc2lnbmVkIGxvbmcgbl9zdHJ4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgdW5zaWduZWQgY2hhciBuX3R5cGU7CQkJLyogdHlwZSBvZiBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhciBuX290aGVyOwkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICB1bnNpZ25lZCBzaG9ydCBuX2Rlc2M7CQkvKiBkZXNjcmlwdGlvbiBmaWVsZCAqLwotICBiZmRfdm1hIG5fdmFsdWU7CQkJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotCi0vKiBUaGUgbl90eXBlIGZpZWxkIGlzIHRoZSBzeW1ib2wgdHlwZSwgY29udGFpbmluZzogICovCi0KLSNkZWZpbmUgTl9VTkRGCTAJLyogVW5kZWZpbmVkIHN5bWJvbCAqLwotI2RlZmluZSBOX0FCUyAJMgkvKiBBYnNvbHV0ZSBzeW1ib2wgLS0gZGVmaW5lZCBhdCBwYXJ0aWN1bGFyIGFkZHIgKi8KLSNkZWZpbmUgTl9URVhUIAk0CS8qIFRleHQgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHRleHQgc2VnICovCi0jZGVmaW5lIE5fREFUQSAJNgkvKiBEYXRhIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiBkYXRhIHNlZyAqLwotI2RlZmluZSBOX0JTUyAJOAkvKiBCU1MgIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB6ZXJvJ2Qgc2VnICovCi0jZGVmaW5lCU5fQ09NTQkweDEyCS8qIENvbW1vbiBzeW1ib2wgKHZpc2libGUgYWZ0ZXIgc2hhcmVkIGxpYiBkeW5saW5rKSAqLwotI2RlZmluZSBOX0ZOCTB4MWYJLyogRmlsZSBuYW1lIG9mIC5vIGZpbGUgKi8KLSNkZWZpbmUJTl9GTl9TRVEgMHgwQwkvKiBOX0ZOIGZyb20gU2VxdWVudCBjb21waWxlcnMgKHNpZ2gpICovCi0vKiBOb3RlOiBOX0VYVCBjYW4gb25seSBiZSB1c2VmdWxseSBPUi1lZCB3aXRoIE5fVU5ERiwgTl9BQlMsIE5fVEVYVCwKLSAgIE5fREFUQSwgb3IgTl9CU1MuICBXaGVuIHRoZSBsb3ctb3JkZXIgYml0IG9mIG90aGVyIHR5cGVzIGlzIHNldCwKLSAgIChlLmcuIE5fV0FSTklORyB2ZXJzdXMgTl9GTiksIHRoZXkgYXJlIHR3byBkaWZmZXJlbnQgdHlwZXMuICAqLwotI2RlZmluZSBOX0VYVCAJMQkvKiBFeHRlcm5hbCBzeW1ib2wgKGFzIG9wcG9zZWQgdG8gbG9jYWwtdG8tdGhpcy1maWxlKSAqLwotI2RlZmluZSBOX1RZUEUgIDB4MWUKLSNkZWZpbmUgTl9TVEFCIAkweGUwCS8qIElmIGFueSBvZiB0aGVzZSBiaXRzIGFyZSBvbiwgaXQncyBhIGRlYnVnIHN5bWJvbCAqLwotCi0jZGVmaW5lIE5fSU5EUiAweDBhCi0KLS8qIFRoZSBmb2xsb3dpbmcgc3ltYm9scyByZWZlciB0byBzZXQgZWxlbWVudHMuCi0gICBBbGwgdGhlIE5fU0VUW0FUREJdIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lIGZvcm0gb25lIHNldC4KLSAgIFNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNldCBpbiB0aGUgdGV4dCBzZWN0aW9uLCBhbmQgZWFjaCBzZXQKLSAgIGVsZW1lbnRzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KLSAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCi0KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKLSAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KLSAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCi0gICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLQotLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLwotI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLQotLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCi0jZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KLQotLyogV2FybmluZyBzeW1ib2wuIFRoZSB0ZXh0IGdpdmVzIGEgd2FybmluZyBtZXNzYWdlLCB0aGUgbmV4dCBzeW1ib2wKLSAgIGluIHRoZSB0YWJsZSB3aWxsIGJlIHVuZGVmaW5lZC4gV2hlbiB0aGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQsIHRoZQotICAgbWVzc2FnZSBpcyBwcmludGVkLiAgKi8KLQotI2RlZmluZQlOX1dBUk5JTkcgMHgxZQotCi0vKiBSZWxvY2F0aW9ucyAKLQotICBUaGVyZQlhcmUgdHdvIHR5cGVzIG9mIHJlbG9jYXRpb24gZmxhdm91cnMgZm9yIGEub3V0IHN5c3RlbXMsCi0gIHN0YW5kYXJkIGFuZCBleHRlbmRlZC4gVGhlIHN0YW5kYXJkIGZvcm0gaXMgdXNlZCBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICBpbnN0cnVjdGlvbiBoYXMgcm9vbSBmb3IgYWxsIHRoZSBiaXRzIG9mIGFuIG9mZnNldCB0byB0aGUgb3BlcmFuZCwgd2hpbHN0Ci0gIHRoZSBleHRlbmRlZCBmb3JtIGlzIHVzZWQgd2hlbiBhbiBhZGRyZXNzIG9wZXJhbmQgaGFzIHRvIGJlIHNwbGl0IG92ZXIgbgotICBpbnN0cnVjdGlvbnMuIEVnLCBvbiB0aGUgNjhrLCBlYWNoIG1vdmUgaW5zdHJ1Y3Rpb24gY2FuIHJlZmVyZW5jZQotICB0aGUgdGFyZ2V0IHdpdGggYSBkaXNwbGFjZW1lbnQgb2YgMTYgb3IgMzIgYml0cy4gT24gdGhlIHNwYXJjLCBtb3ZlCi0gIGluc3RydWN0aW9ucyB1c2UgYW4gb2Zmc2V0IG9mIDE0IGJpdHMsIHNvIHRoZSBvZmZzZXQgaXMgc3RvcmVkIGluCi0gIHRoZSByZWxvYyBmaWVsZCwgYW5kIHRoZSBkYXRhIGluIHRoZSBzZWN0aW9uIGlzIGlnbm9yZWQuCi0qLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAqLwotICBiZmRfYnl0ZSByX2luZGV4WzNdOwkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBiZmRfYnl0ZSByX3R5cGVbMV07CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkweDYwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcJNQkvKiBUbyBzaGlmdCB0byB1bml0cyBwbGFjZSAqLwotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFCTB4MDYKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkweDEwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCTB4MDgKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkweDA0Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRQkweDA0Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCTB4MDIKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCTB4MDIKLQotI2RlZmluZQlSRUxPQ19TVERfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxKQkJLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9pbnRlcm5hbAotewotICBiZmRfdm1hIHJfYWRkcmVzczsJCS8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLwotICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0Ci0gICAgIGFuZCBpdCBzaG91bGQgYmUgcmVsb2NhdGVkIGZvciBjaGFuZ2VzIGluIGl0cyBvd24gYWRkcmVzcwotICAgICBhcyB3ZWxsIGFzIGZvciBjaGFuZ2VzIGluIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiBzcGVjaWZpZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICAvKiBMZW5ndGggKGFzIGV4cG9uZW50IG9mIDIpIG9mIHRoZSBmaWVsZCB0byBiZSByZWxvY2F0ZWQuCi0gICAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCi0gIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOwotICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgotICAgICByX3N5bWJvbG51bSBpcyB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbAotICAgICBpbiBmaWxlcyB0aGUgc3ltYm9sIHRhYmxlLgotICAgICAwID0+IHJlbG9jYXRlIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBzZWdtZW50LgotICAgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKLSAgICAgKHRoZSBOX0VYVCBiaXQgbWF5IGJlIHNldCBhbHNvLCBidXQgc2lnbmlmaWVzIG5vdGhpbmcpLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7Ci0gIC8qIFRoZSBuZXh0IHRocmVlIGJpdHMgYXJlIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgc2VlbSB0bwotICAgICBiZSB1bmRvY3VtZW50ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9iYXNlcmVsOjE7CS8qIExpbmthZ2UgdGFibGUgcmVsYXRpdmUgKi8KLSAgdW5zaWduZWQgaW50IHJfam1wdGFibGU6MTsJLyogcGMtcmVsYXRpdmUgdG8ganVtcCB0YWJsZSAqLwotICB1bnNpZ25lZCBpbnQgcl9yZWxhdGl2ZToxOwkvKiAicmVsYXRpdmUgcmVsb2NhdGlvbiIgKi8KLSAgLyogdW51c2VkICovCi0gIHVuc2lnbmVkIGludCByX3BhZDoxOwkJLyogUGFkZGluZyAtLSBzZXQgdG8gemVybyAqLwotfTsKLQotCi0vKiBFWFRFTkRFRCBSRUxPQ1MgICovCi0KLXN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgewotICBiZmRfYnl0ZSByX2FkZHJlc3NbQllURVNfSU5fV09SRF07CS8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlIAkqLwotICBiZmRfYnl0ZSByX2luZGV4WzNdOwkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBiZmRfYnl0ZSByX3R5cGVbMV07CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF9ieXRlIHJfYWRkZW5kW0JZVEVTX0lOX1dPUkRdOwkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwMQotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkweDFGCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHCTAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUJMHhGOAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRQkzCi0KLS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0jZGVmaW5lCVJFTE9DX0VYVF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEgKyBCWVRFU19JTl9XT1JEKQotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gIFJFTE9DXzgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18xNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18zMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kICsgc3YgCQkqLwotICAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gIFJFTE9DX0RJU1A4LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AxNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfRElTUDMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBTcGVjaWFsICovCi0gIFJFTE9DX1dESVNQMzAsCQkvKiBkYXRhWzA6MjldID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19XRElTUDIyLAkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfSEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KT4+MTAgCSovCi0gIFJFTE9DXzIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpIAkJKi8KLSAgUkVMT0NfMTMsCQkJLyogZGF0YVswOjEyXSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX0xPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KQkJKi8KLSAgUkVMT0NfU0ZBX0JBU0UsCQkKLSAgUkVMT0NfU0ZBX09GRjEzLAotICAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gIFJFTE9DX0JBU0UxMCwgIAkJLyogTm90IHN1cmUgLSBtYXliZSB3ZSBjYW4gZG8gdGhpcyB0aGUgKi8KLSAgUkVMT0NfQkFTRTEzLAkJCS8qIHJpZ2h0IHdheSBub3cgKi8KLSAgUkVMT0NfQkFTRTIyLAotICAvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gIFJFTE9DX1BDMTAsCi0gIFJFTE9DX1BDMjIsCi0gIC8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gIFJFTE9DX0pNUF9UQkwsCi0gIC8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gIFJFTE9DX1NFR09GRjE2LAotICBSRUxPQ19HTE9CX0RBVCwKLSAgUkVMT0NfSk1QX1NMT1QsCi0gIFJFTE9DX1JFTEFUSVZFLAotCi0gIFJFTE9DXzExLAkKLSAgUkVMT0NfV0RJU1AyXzE0LAotICBSRUxPQ19XRElTUDE5LAotICBSRUxPQ19ISEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSA+PiA0MiAgICAgKi8KLSAgUkVMT0NfSExPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KSA+PiAzMiAgICAgICovCi0gIAotICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICBSRUxPQ19KVU1QVEFSRywKLSAgUkVMT0NfQ09OU1QsCi0gIFJFTE9DX0NPTlNUSCwKLSAgCi0gIE5PX1JFTE9DCi0gIH07Ci0KLQotc3RydWN0IHJlbG9jX2ludGVybmFsIHsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgbG9uZwlyX2luZGV4OwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgZW51bSByZWxvY190eXBlIHJfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX3ZtYSByX2FkZGVuZDsJCS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotI2VuZGlmCQkJCS8qIF9fQV9PVVRfQURPQkVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvYW91dDY0LmggYi9pbmNsdWRlL2FvdXQvYW91dDY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjExNDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qIGBhLm91dCcgb2JqZWN0LWZpbGUgZGVmaW5pdGlvbnMsIGluY2x1ZGluZyBleHRlbnNpb25zIHRvIDY0LWJpdCBmaWVsZHMgKi8KLQotI2lmbmRlZiBfX0FfT1VUXzY0X0hfXwotI2RlZmluZSBfX0FfT1VUXzY0X0hfXwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiB0aGUgMzItYml0IG9yIDY0LWJpdCBleGVjIGhlYWRlci4gKi8KLQotI2lmbmRlZiBleHRlcm5hbF9leGVjCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAKLXsKLSAgYmZkX2J5dGUgZV9pbmZvWzRdOwkJLyogbWFnaWMgbnVtYmVyIGFuZCBzdHVmZgkJKi8KLSAgYmZkX2J5dGUgZV90ZXh0W0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCBzZWN0aW9uIGluIGJ5dGVzCSovCi0gIGJmZF9ieXRlIGVfZGF0YVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2Jzc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGJzcyBhcmVhIGluIGJ5dGVzIAkJKi8KLSAgYmZkX2J5dGUgZV9zeW1zW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGluIGJ5dGVzIAkqLwotICBiZmRfYnl0ZSBlX2VudHJ5W0JZVEVTX0lOX1dPUkRdOyAvKiBzdGFydCBhZGRyZXNzIAkJCSovCi0gIGJmZF9ieXRlIGVfdHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KLSAgYmZkX2J5dGUgZV9kcnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHJlbG9jYXRpb24gaW5mbyAJKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSg0ICsgQllURVNfSU5fV09SRCAqIDcpCi0KLS8qIE1hZ2ljIG51bWJlcnMgZm9yIGEub3V0IGZpbGVzICovCi0KLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIE9NQUdJQyAweDEwMDEJCS8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSAgKi8KLSNkZWZpbmUgWk1BR0lDIDB4MTAwMgkJLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDB4MTAwMwkJLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCi0KLS8qIFRoZXJlIGlzIG5vIDY0LWJpdCBRTUFHSUMgYXMgZmFyIGFzIEkga25vdy4gICovCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0gIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDKQotI2Vsc2UKLSNkZWZpbmUgT01BR0lDIDA0MDcJCS8qIC4uLm9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDA0MTAJCS8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBaTUFHSUMgMDQxMwkJLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgQk1BR0lDIDA0MTUJCS8qIFVzZWQgYnkgYSBiLm91dCBvYmplY3QuICAqLwotCi0vKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4KLSAgIEl0IGlzIHVzZWQgYnkgMzg2QlNEIChhbmQgdmFyaWFudHMpIGFuZCBMaW51eCwgYXQgbGVhc3QuICAqLwotI2lmbmRlZiBRTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAzMTQKLSNlbmRpZgotIyBpZm5kZWYgTl9CQURNQUcKLSMgIGRlZmluZSBOX0JBRE1BRyh4KQkgIChOX01BR0lDKHgpICE9IE9NQUdJQwkJXAotCQkJJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLSAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMgXAotCQkgICAgICAgICYmIE5fTUFHSUMoeCkgIT0gUU1BR0lDKQotIyBlbmRpZiAvKiBOX0JBRE1BRyAqLwotI2VuZGlmCi0KLSNlbmRpZgotCi0jaWZkZWYgUU1BR0lDCi0jZGVmaW5lIE5fSVNfUU1BR0lDKHgpIChOX01BR0lDICh4KSA9PSBRTUFHSUMpCi0jZWxzZQotI2RlZmluZSBOX0lTX1FNQUdJQyh4KSAoMCkKLSNlbmRpZgotCi0vKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFRBUkdFVF9QQUdFX1NJWkUgYW5kIE5fU0VHU0laRSBpcyB0aGF0IFRBUkdFVF9QQUdFX1NJWkUgaXMKLSAgIHRoZSBmaW5lc3QgZ3JhbnVsYXJpdHkgYXQgd2hpY2ggeW91IGNhbiBwYWdlIHNvbWV0aGluZywgdGh1cyBpdAotICAgY29udHJvbHMgdGhlIHBhZGRpbmcgKGlmIGFueSkgYmVmb3JlIHRoZSB0ZXh0IHNlZ21lbnQgb2YgYSBaTUFHSUMKLSAgIGZpbGUuICBOX1NFR1NJWkUgaXMgdGhlIHJlc29sdXRpb24gYXQgd2hpY2ggdGhpbmdzIGNhbiBiZSBtYXJrZWQgYXMKLSAgIHJlYWQtb25seSB2ZXJzdXMgcmVhZC93cml0ZSwgc28gaXQgY29udHJvbHMgdGhlIHBhZGRpbmcgYmV0d2VlbiB0aGUKLSAgIHRleHQgc2VnbWVudCBhbmQgdGhlIGRhdGEgc2VnbWVudCAoaW4gbWVtb3J5OyBvbiBkaXNrIHRoZSBwYWRkaW5nCi0gICBiZXR3ZWVuIHRoZW0gaXMgVEFSR0VUX1BBR0VfU0laRSkuICBUQVJHRVRfUEFHRV9TSVpFIGFuZCBOX1NFR1NJWkUgYXJlIHRoZSBzYW1lCi0gICBmb3IgbW9zdCBtYWNoaW5lcywgYnV0IGRpZmZlcmVudCBmb3Igc3VuMy4gICovCi0KLS8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBzb21lIG1hY2hpbmVzIG92ZXJyaWRlIHRoaXMKLSAgIHRvIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KLQotI2lmbmRlZglOX1NFR1NJWkUKLSNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQotI2VuZGlmCi0MCi0vKiBWaXJ0dWFsIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSB0ZXh0IHNlY3Rpb24uCi0gICBUaGlzIGlzIGdldHRpbmcgdmVyeSBjb21wbGljYXRlZC4gIEEgZ29vZCByZWFzb24gdG8gZGlzY2FyZCBhLm91dCBmb3JtYXQKLSAgIGZvciBzb21ldGhpbmcgdGhhdCBzcGVjaWZpZXMgdGhlc2UgZmllbGRzIGV4cGxpY2l0bHkuICBCdXQgdGlsIHRoZW4uLi4KLQotICAgKiBPTUFHSUMgYW5kIE5NQUdJQyBmaWxlczoKLSAgICAgICAob2JqZWN0IGZpbGVzOiB0ZXh0IGZvciAicmVsb2NhdGFibGUgYWRkciAwIiByaWdodCBhZnRlciB0aGUgaGVhZGVyKQotICAgICAgIHN0YXJ0IGF0IDAsIG9mZnNldCBpcyBFWEVDX0JZVEVTX1NJWkUsIHNpemUgYXMgc3RhdGVkLgotICAgKiBUaGUgdGV4dCBhZGRyZXNzLCBvZmZzZXQsIGFuZCBzaXplIG9mIFpNQUdJQyBmaWxlcyBkZXBlbmQKLSAgICAgb24gdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBmaWxlOgotICAgICAqIGVudHJ5IHBvaW50IGJlbG93IFRFWFRfU1RBUlRfQUREUjoKLSAgICAgICAoaGFjayBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcykKLSAgICAgICBzdGFydCBhdCAwLCBvZmZzZXQgaXMgMCwgc2l6ZSBhcyBzdGF0ZWQuCi0gICAgICogSWYgTl9IRUFERVJfSU5fVEVYVCh4KSBpcyB0cnVlICh3aGljaCBkZWZhdWx0cyB0byBiZWluZyB0aGUKLSAgICAgICBjYXNlIHdoZW4gdGhlIGVudHJ5IHBvaW50IGlzIEVYRUNfQllURVNfU0laRSBvciBmdXJ0aGVyIGludG8gYSBwYWdlKToKLSAgICAgICBubyBwYWRkaW5nIGlzIG5lZWRlZDsgdGV4dCBjYW4gc3RhcnQgYWZ0ZXIgZXhlYyBoZWFkZXIuICBTdW4KLSAgICAgICBjb25zaWRlcnMgdGhlIHRleHQgc2VnbWVudCBvZiBzdWNoIGZpbGVzIHRvIGluY2x1ZGUgdGhlIGV4ZWMgaGVhZGVyOwotICAgICAgIGZvciBCRkQncyBwdXJwb3Nlcywgd2UgZG9uJ3QsIHdoaWNoIG1ha2VzIG1vcmUgd29yayBmb3IgdXMuCi0gICAgICAgc3RhcnQgYXQgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFLCBvZmZzZXQgaXMgRVhFQ19CWVRFU19TSVpFLAotICAgICAgIHNpemUgYXMgc3RhdGVkIG1pbnVzIEVYRUNfQllURVNfU0laRS4KLSAgICAgKiBJZiBOX0hFQURFUl9JTl9URVhUKHgpIGlzIGZhbHNlICh3aGljaCBkZWZhdWx0cyB0byBiZWluZyB0aGUgY2FzZSB3aGVuCi0gICAgICAgdGhlIGVudHJ5IHBvaW50IGlzIGxlc3MgdGhhbiBFWEVDX0JZVEVTX1NJWkUgaW50byBhIHBhZ2UgKGUuZy4gcGFnZQotICAgICAgIGFsaWduZWQpKTogKHBhZGRpbmcgaXMgbmVlZGVkIHNvIHRoYXQgdGV4dCBjYW4gc3RhcnQgYXQgYSBwYWdlIGJvdW5kYXJ5KQotICAgICAgIHN0YXJ0IGF0IFRFWFRfU1RBUlRfQUREUiwgb2Zmc2V0IFRBUkdFVF9QQUdFX1NJWkUsIHNpemUgYXMgc3RhdGVkLgotCi0gICAgU3BlY2lmaWMgY29uZmlndXJhdGlvbnMgbWF5IHdhbnQgdG8gaGFyZHdpcmUgTl9IRUFERVJfSU5fVEVYVCwKLSAgICBmb3IgZWZmaWNpZW5jeSBvciB0byBhbGxvdyBwZW9wbGUgdG8gcGxheSBnYW1lcyB3aXRoIHRoZSBlbnRyeSBwb2ludC4KLSAgICBJbiB0aGF0IGNhc2UsIHlvdSB3b3VsZCAjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgYXMgMSBmb3Igc3Vub3MsCi0gICAgYW5kIGFzIDAgZm9yIG1vc3Qgb3RoZXIgaG9zdHMgKFNvbnkgTmV3cywgVmF4IFVsdHJpeCwgZXRjKS4KLSAgICAoRG8gdGhpcyBpbiB0aGUgYXBwcm9wcmlhdGUgYmZkIHRhcmdldCBmaWxlLikKLSAgICAoVGhlIGRlZmF1bHQgaXMgYSBoZXVyaXN0aWMgdGhhdCB3aWxsIGJyZWFrIGlmIHBlb3BsZSB0cnkgY2hhbmdpbmcKLSAgICB0aGUgZW50cnkgcG9pbnQsIHBlcmhhcHMgd2l0aCB0aGUgbGQgLWUgZmxhZy4pCi0KLSAgICAqIFFNQUdJQyBpcyBhbHdheXMgbGlrZSBhIFpNQUdJQyBmb3Igd2hpY2ggTl9IRUFERVJfSU5fVEVYVCBpcyB0cnVlLAotICAgIGFuZCBmb3Igd2hpY2ggdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaXMgVEFSR0VUX1BBR0VfU0laRSAob3Igc2hvdWxkIHRoaXMgYmUKLSAgICBTRUdNRU5UX1NJWkU/KSAoVEVYVF9TVEFSVF9BRERSIG9ubHkgYXBwbGllcyB0byBaTUFHSUMsIG5vdCB0byBRTUFHSUMpLgotICAgICovCi0KLS8qIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCBmb3IgWk1BR0lDIGZpbGVzOyBRTUFHSUMgYWx3YXlzIGhhcyB0aGUgaGVhZGVyCi0gICBpbiB0aGUgdGV4dC4gICovCi0jaWZuZGVmIE5fSEVBREVSX0lOX1RFWFQKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAoKCh4KS5hX2VudHJ5ICYgKFRBUkdFVF9QQUdFX1NJWkUtMSkpID49IEVYRUNfQllURVNfU0laRSkKLSNlbmRpZgotCi0vKiBTdW4gc2hhcmVkIGxpYnJhcmllcywgbm90IGxpbnV4LiAgVGhpcyBtYWNybyBpcyBvbmx5IHJlbGV2YW50IGZvciBaTUFHSUMKLSAgIGZpbGVzLiAgKi8KLSNpZm5kZWYgTl9TSEFSRURfTElCCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAoKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFIpCi0jZW5kaWYKLQotLyogUmV0dXJuaW5nIDAgbm90IFRFWFRfU1RBUlRfQUREUiBmb3IgT01BR0lDIGFuZCBOTUFHSUMgaXMgYmFzZWQgb24KLSAgIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIC5vIGZpbGUsIG5vdCBhbgotICAgZXhlY3V0YWJsZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBPTUFHSUMgKGJ1dCBtZWFucyB3ZSBkb24ndCB3b3JrCi0gICByaWdodCBvbiB0aGUgb3V0cHV0IGZyb20gbGQgLU4pOyBtb3JlIHF1ZXN0aW9uYWJsZSBmb3IgTk1BR0lDLiAgKi8KLQotI2lmbmRlZiBOX1RYVEFERFIKLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgICAoLyogVGhlIGFkZHJlc3Mgb2YgYSBRTUFHSUMgZmlsZSBpcyBhbHdheXMgb25lIHBhZ2UgaW4sICovIFwKLSAgICAgLyogd2l0aCB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAgKi8gXAotICAgICBOX0lTX1FNQUdJQyAoeCkgPyBUQVJHRVRfUEFHRV9TSVpFICsgRVhFQ19CWVRFU19TSVpFIDogXAotICAgICBOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgOgkvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi9cCi0gICAgIE5fU0hBUkVEX0xJQih4KSA/IDAgOglcCi0gICAgIE5fSEVBREVSX0lOX1RFWFQoeCkgID8JXAotCSAgICBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUgOgkvKiBubyBwYWRkaW5nICovXAotCSAgICBURVhUX1NUQVJUX0FERFIJCQkvKiBhIHBhZ2Ugb2YgcGFkZGluZyAqL1wKLSAgICApCi0jZW5kaWYKLQotLyogSWYgTl9IRUFERVJfSU5fVEVYVCBpcyBub3QgdHJ1ZSBmb3IgWk1BR0lDLCB0aGVyZSBpcyBzb21lIHBhZGRpbmcKLSAgIHRvIG1ha2UgdGhlIHRleHQgc2VnbWVudCBzdGFydCBhdCBhIGNlcnRhaW4gYm91bmRhcnkuICBGb3IgbW9zdAotICAgc3lzdGVtcywgdGhpcyBib3VuZGFyeSBpcyBUQVJHRVRfUEFHRV9TSVpFLiAgQnV0IGZvciBMaW51eCwgaW4gdGhlCi0gICB0aW1lLWhvbm9yZWQgdHJhZGl0aW9uIG9mIGNyYXp5IFpNQUdJQyBoYWNrcywgaXQgaXMgMTAyNCB3aGljaCBpcwotICAgbm90IHdoYXQgVEFSR0VUX1BBR0VfU0laRSBuZWVkcyB0byBiZSBmb3IgUU1BR0lDLiAgKi8KLQotI2lmbmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2VuZGlmCi0KLSNkZWZpbmUgTl9ESVNLX0JMT0NLX1NJWkUoeCkgXAotICAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgPyBaTUFHSUNfRElTS19CTE9DS19TSVpFIDogVEFSR0VUX1BBR0VfU0laRSkKLQotLyogT2Zmc2V0IGluIGFuIGEub3V0IG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAqLwotI2lmbmRlZiBOX1RYVE9GRgotI2RlZmluZSBOX1RYVE9GRih4KQlcCi0gICAgKC8qIEZvciB7TyxOLFF9TUFHSUMsIG5vIHBhZGRpbmcuICAqLyBcCi0gICAgIE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gRVhFQ19CWVRFU19TSVpFIDogXAotICAgICBOX1NIQVJFRF9MSUIoeCkgPyAwIDogXAotICAgICBOX0hFQURFUl9JTl9URVhUKHgpID8JXAotCSAgICBFWEVDX0JZVEVTX1NJWkUgOgkJCS8qIG5vIHBhZGRpbmcgKi9cCi0JICAgIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUJCS8qIGEgcGFnZSBvZiBwYWRkaW5nICovXAotICAgICkKLSNlbmRpZgotLyogU2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgSXQncyBhbHdheXMgYXMgc3RhdGVkLCBleGNlcHQgdGhhdCB3ZQotICAgb2Zmc2V0IGl0IHRvIGB1bmRvJyB0aGUgYWRqdXN0bWVudCB0byBOX1RYVEFERFIgYW5kIE5fVFhUT0ZGCi0gICBmb3IgWk1BR0lDIGZpbGVzIHRoYXQgbm9taW5hbGx5IGluY2x1ZGUgdGhlIGV4ZWMgaGVhZGVyCi0gICBhcyBwYXJ0IG9mIHRoZSBmaXJzdCBwYWdlIG9mIHRleHQuICAoQkZEIGRvZXNuJ3QgY29uc2lkZXIgdGhlCi0gICBleGVjIGhlYWRlciB0byBiZSBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQuKSAgKi8KLSNpZm5kZWYgTl9UWFRTSVpFCi0jZGVmaW5lCU5fVFhUU0laRSh4KSBcCi0gICAgKC8qIEZvciBRTUFHSUMsIHdlIGRvbid0IGNvbnNpZGVyIHRoZSBoZWFkZXIgcGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgKi9cCi0gICAgIE5fSVNfUU1BR0lDICh4KSA/ICh4KS5hX3RleHQgLSBFWEVDX0JZVEVTX1NJWkUgOiBcCi0gICAgIChOX01BR0lDKHgpICE9IFpNQUdJQyB8fCBOX1NIQVJFRF9MSUIoeCkpID8gKHgpLmFfdGV4dCA6IFwKLSAgICAgTl9IRUFERVJfSU5fVEVYVCh4KSAgPwlcCi0JICAgICh4KS5hX3RleHQgLSBFWEVDX0JZVEVTX1NJWkU6CS8qIG5vIHBhZGRpbmcgKi9cCi0JICAgICh4KS5hX3RleHQJCQkJLyogYSBwYWdlIG9mIHBhZGRpbmcgKi9cCi0gICAgKQotI2VuZGlmCi0vKiBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IGluIHZpcnR1YWwgbWVtb3J5LgotICAgSXQgaXMgdGhlIHRleHQgc2VnbWVudCBhZGRyZXNzLCBwbHVzIHRleHQgc2VnbWVudCBzaXplLCByb3VuZGVkCi0gICB1cCB0byBhIE5fU0VHU0laRSBib3VuZGFyeSBmb3IgcHVyZSBvciBwYWdlYWJsZSBmaWxlcy4gKi8KLSNpZm5kZWYgTl9EQVRBRERSCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCkpIFwKLSAgICAgOiAgKE5fU0VHU0laRSh4KSArICgoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KS0xKSAmIH4oTl9TRUdTSVpFKHgpLTEpKSkpCi0jZW5kaWYKLS8qIFRoZSBhZGRyZXNzIG9mIHRoZSBCU1Mgc2VnbWVudCAtLSBpbW1lZGlhdGVseSBhZnRlciB0aGUgZGF0YSBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBOX0JTU0FERFIoeCkJKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCi0KLS8qIE9mZnNldHMgb2YgdGhlIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIGZpbGUgYWZ0ZXIgdGhlIHRleHQgc2VnbWVudC4gICovCi0KLS8qIEZvciB7USxafU1BR0lDLCB0aGVyZSBpcyBwYWRkaW5nIHRvIG1ha2UgdGhlIGRhdGEgc2VnbWVudCBzdGFydCBvbgotICAgYSBwYWdlIGJvdW5kYXJ5LiAgTW9zdCBvZiB0aGUgdGltZSB0aGUgYV90ZXh0IGZpZWxkIChhbmQgdGh1cwotICAgTl9UWFRTSVpFKSBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgcGFkZGluZy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgZm9yCi0gICBCU0RJIGFuZC9vciAzODZCU0QgaXQgc29tZXRpbWVzIGRvZXNuJ3QgY29udGFpbiB0aGUgcGFkZGluZywgYW5kCi0gICBwZXJoYXBzIHdlIHNob3VsZCBiZSBhZGRpbmcgaXQgaGVyZS4gIEJ1dCB0aGlzIHNlZW1zIGtpbmQgb2YKLSAgIHF1ZXN0aW9uYWJsZSBhbmQgcHJvYmFibHkgc2hvdWxkIGJlIEJTREkvMzg2QlNELXNwZWNpZmljIGlmIHdlIGRvCi0gICBkbyBpdC4KLQotICAgRm9yIE5NQUdJQyAoYXQgbGVhc3QgZm9yIGhwMzAwIEJTRCwgcHJvYmFibHkgb3RoZXJzKSwgdGhlcmUgaXMKLSAgIHBhZGRpbmcgaW4gbWVtb3J5IG9ubHksIG5vdCBvbiBkaXNrLCBzbyB3ZSBtdXN0ICpub3QqIGV2ZXIgcGFkIGhlcmUKLSAgIGZvciBOTUFHSUMuICAqLwotCi0jaWZuZGVmIE5fREFUT0ZGCi0jZGVmaW5lIE5fREFUT0ZGKHgpIFwKLSAoTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1RSRUxPRkYKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNlbmRpZgotI2lmbmRlZiBOX0RSRUxPRkYKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNlbmRpZgotI2lmbmRlZiBOX1NZTU9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZW5kaWYKLSNpZm5kZWYgTl9TVFJPRkYKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotI2VuZGlmCi0MCi0vKiBTeW1ib2xzICovCi0jaWZuZGVmIGV4dGVybmFsX25saXN0Ci1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgewotICBiZmRfYnl0ZSBlX3N0cnhbQllURVNfSU5fV09SRF07CS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgYmZkX2J5dGUgZV90eXBlWzFdOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIGJmZF9ieXRlIGVfb3RoZXJbMV07CQkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICBiZmRfYnl0ZSBlX2Rlc2NbMl07CQkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX2J5dGUgZV92YWx1ZVtCWVRFU19JTl9XT1JEXTsJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotI2RlZmluZSBFWFRFUk5BTF9OTElTVF9TSVpFIChCWVRFU19JTl9XT1JEKzQrQllURVNfSU5fV09SRCkKLSNlbmRpZgotCi1zdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgewotICB1bnNpZ25lZCBsb25nIG5fc3RyeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOwkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX3ZtYSBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLQotLyogVGhlIG5fdHlwZSBmaWVsZCBpcyB0aGUgc3ltYm9sIHR5cGUsIGNvbnRhaW5pbmc6ICAqLwotCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMgCTIJLyogQWJzb2x1dGUgc3ltYm9sIC0tIGRlZmluZWQgYXQgcGFydGljdWxhciBhZGRyICovCi0jZGVmaW5lIE5fVEVYVCAJNAkvKiBUZXh0IHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB0ZXh0IHNlZyAqLwotI2RlZmluZSBOX0RBVEEgCTYJLyogRGF0YSBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gZGF0YSBzZWcgKi8KLSNkZWZpbmUgTl9CU1MgCTgJLyogQlNTICBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gemVybydkIHNlZyAqLwotI2RlZmluZQlOX0NPTU0JMHgxMgkvKiBDb21tb24gc3ltYm9sICh2aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWIgZHlubGluaykgKi8KLSNkZWZpbmUgTl9GTgkweDFmCS8qIEZpbGUgbmFtZSBvZiAubyBmaWxlICovCi0jZGVmaW5lCU5fRk5fU0VRIDB4MEMJLyogTl9GTiBmcm9tIFNlcXVlbnQgY29tcGlsZXJzIChzaWdoKSAqLwotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgYmUgdXNlZnVsbHkgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChhcyBvcHBvc2VkIHRvIGxvY2FsLXRvLXRoaXMtZmlsZSkgKi8KLSNkZWZpbmUgTl9UWVBFICAweDFlCi0jZGVmaW5lIE5fU1RBQiAJMHhlMAkvKiBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgb24sIGl0J3MgYSBkZWJ1ZyBzeW1ib2wgKi8KLQotI2RlZmluZSBOX0lORFIgMHgwYQotCi0vKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgotICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCi0gICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0Ci0gICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCi0gICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgotCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCi0gICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCi0gICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAotICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0KLS8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KLSNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0KLS8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLwotI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCi0KLS8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCi0gICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKLSAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKLQotLyogV2VhayBzeW1ib2xzLiAgVGhlc2UgYXJlIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgYS5vdXQgZm9ybWF0LiAgVGhlCi0gICBzZW1hbnRpY3MgYXJlIHRob3NlIG9mIEVMRiB3ZWFrIHN5bWJvbHMuICBXZWFrIHN5bWJvbHMgYXJlIGFsd2F5cwotICAgZXh0ZXJuYWxseSB2aXNpYmxlLiAgVGhlIE5fV0VBSz8gdmFsdWVzIGFyZSBzcXVlZXplZCBpbnRvIHRoZQotICAgYXZhaWxhYmxlIHNsb3RzLiAgVGhlIHZhbHVlIG9mIGEgTl9XRUFLVSBzeW1ib2wgaXMgMC4gIFRoZSB2YWx1ZXMKLSAgIG9mIHRoZSBvdGhlciB0eXBlcyBhcmUgdGhlIGRlZmluaXRpb25zLiAgKi8KLSNkZWZpbmUgTl9XRUFLVQkweDBkCQkvKiBXZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtBIDB4MGUJCS8qIFdlYWsgYWJzb2x1dGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLVCAweDBmCQkvKiBXZWFrIHRleHQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLRCAweDEwCQkvKiBXZWFrIGRhdGEgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLQiAweDExCQkvKiBXZWFrIGJzcyBzeW1ib2wuICAqLwotCi0vKiBSZWxvY2F0aW9ucyAKLQotICBUaGVyZQlhcmUgdHdvIHR5cGVzIG9mIHJlbG9jYXRpb24gZmxhdm91cnMgZm9yIGEub3V0IHN5c3RlbXMsCi0gIHN0YW5kYXJkIGFuZCBleHRlbmRlZC4gVGhlIHN0YW5kYXJkIGZvcm0gaXMgdXNlZCBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICBpbnN0cnVjdGlvbiBoYXMgcm9vbSBmb3IgYWxsIHRoZSBiaXRzIG9mIGFuIG9mZnNldCB0byB0aGUgb3BlcmFuZCwgd2hpbHN0Ci0gIHRoZSBleHRlbmRlZCBmb3JtIGlzIHVzZWQgd2hlbiBhbiBhZGRyZXNzIG9wZXJhbmQgaGFzIHRvIGJlIHNwbGl0IG92ZXIgbgotICBpbnN0cnVjdGlvbnMuIEVnLCBvbiB0aGUgNjhrLCBlYWNoIG1vdmUgaW5zdHJ1Y3Rpb24gY2FuIHJlZmVyZW5jZQotICB0aGUgdGFyZ2V0IHdpdGggYSBkaXNwbGFjZW1lbnQgb2YgMTYgb3IgMzIgYml0cy4gT24gdGhlIHNwYXJjLCBtb3ZlCi0gIGluc3RydWN0aW9ucyB1c2UgYW4gb2Zmc2V0IG9mIDE0IGJpdHMsIHNvIHRoZSBvZmZzZXQgaXMgc3RvcmVkIGluCi0gIHRoZSByZWxvYyBmaWVsZCwgYW5kIHRoZSBkYXRhIGluIHRoZSBzZWN0aW9uIGlzIGlnbm9yZWQuCi0qLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsIHsKLSAgYmZkX2J5dGUJcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4ODApCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMSkKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfQklHCSgodW5zaWduZWQgaW50KSAweDYwKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwNikKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkoKHVuc2lnbmVkIGludCkgMHgxMCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwOCkKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwOCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHCSgodW5zaWduZWQgaW50KSAweDA0KQotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MjApCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCSgodW5zaWduZWQgaW50KSAweDAyKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4NDApCi0KLSNkZWZpbmUJUkVMT0NfU1REX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSkJCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCByZWxvY19zdGRfaW50ZXJuYWwKLXsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KLSAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCi0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAotICAgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKLSAgICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotICAgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKLSAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KLSAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKLSAgICAgaW4gZmlsZXMgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLSAgICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCi0gICAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCi0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KLSAgICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0gIC8qIHVudXNlZCAqLwotICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KLX07Ci0KLQotLyogRVhURU5ERUQgUkVMT0NTICAqLwotCi1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotICBiZmRfYnl0ZSByX2FkZGVuZFtCWVRFU19JTl9XT1JEXTsJLyogZGF0dW0gYWRkZW5kCQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4ODApCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCi0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcJCSgodW5zaWduZWQgaW50KSAweDFGKQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRwkwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCSgodW5zaWduZWQgaW50KSAweEY4KQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRQkzCi0KLS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0jZGVmaW5lCVJFTE9DX0VYVF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEgKyBCWVRFU19JTl9XT1JEKQotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gIFJFTE9DXzgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18xNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18zMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kICsgc3YgCQkqLwotICAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gIFJFTE9DX0RJU1A4LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AxNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfRElTUDMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBTcGVjaWFsICovCi0gIFJFTE9DX1dESVNQMzAsCQkvKiBkYXRhWzA6MjldID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19XRElTUDIyLAkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfSEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KT4+MTAgCSovCi0gIFJFTE9DXzIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpIAkJKi8KLSAgUkVMT0NfMTMsCQkJLyogZGF0YVswOjEyXSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX0xPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KQkJKi8KLSAgUkVMT0NfU0ZBX0JBU0UsCQkKLSAgUkVMT0NfU0ZBX09GRjEzLAotICAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gIFJFTE9DX0JBU0UxMCwgIAkJLyogTm90IHN1cmUgLSBtYXliZSB3ZSBjYW4gZG8gdGhpcyB0aGUgKi8KLSAgUkVMT0NfQkFTRTEzLAkJCS8qIHJpZ2h0IHdheSBub3cgKi8KLSAgUkVMT0NfQkFTRTIyLAotICAvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gIFJFTE9DX1BDMTAsCi0gIFJFTE9DX1BDMjIsCi0gIC8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gIFJFTE9DX0pNUF9UQkwsCi0gIC8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gIFJFTE9DX1NFR09GRjE2LAotICBSRUxPQ19HTE9CX0RBVCwKLSAgUkVMT0NfSk1QX1NMT1QsCi0gIFJFTE9DX1JFTEFUSVZFLAotCi0gIFJFTE9DXzExLAkKLSAgUkVMT0NfV0RJU1AyXzE0LAotICBSRUxPQ19XRElTUDE5LAotICBSRUxPQ19ISEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSA+PiA0MiAgICAgKi8KLSAgUkVMT0NfSExPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KSA+PiAzMiAgICAgICovCi0gIAotICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICBSRUxPQ19KVU1QVEFSRywKLSAgUkVMT0NfQ09OU1QsCi0gIFJFTE9DX0NPTlNUSCwKLSAgCi0gIC8qIEFsbCB0aGUgbmV3IG9uZXMgSSBjYW4gdGhpbmsgb2YsIGZvciBzcGFyYyB2OSAqLwotCi0gIFJFTE9DXzY0LAkJCS8qIGRhdGFbMDo2M10gPSBhZGRlbmQgKyBzdiAJCSovCi0gIFJFTE9DX0RJU1A2NCwJCQkvKiBkYXRhWzA6NjNdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfV0RJU1AyMSwJCS8qIGRhdGFbMDoyMF0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0RJU1AyMSwJCQkvKiBkYXRhWzA6MjBdID0gYWRkZW5kIC0gcGMgKyBzdiAgICAgICAgKi8KLSAgUkVMT0NfRElTUDE0LAkJCS8qIGRhdGFbMDoxM10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBRIC4KLSAgICAgV2hhdCBhcmUgdGhlIG90aGVyIG9uZXMsCi0gICAgIFNpbmNlIHRoaXMgaXMgYSBjbGVhbiBzbGF0ZSwgY2FuIHdlIHRocm93IGF3YXkgdGhlIG9uZXMgd2UgZG9udAotICAgICB1bmRlcnN0YW5kID8gU2hvdWxkIHdlIHNvcnQgdGhlIHZhbHVlcyA/IFdoYXQgYWJvdXQgdXNpbmcgYQotICAgICBtaWNyb2NvZGUgZm9ybWF0IGxpa2UgdGhlIDY4ayA/Ci0gICAgICovCi0gIE5PX1JFTE9DCi0gIH07Ci0KLQotc3RydWN0IHJlbG9jX2ludGVybmFsIHsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgbG9uZwlyX2luZGV4OwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgZW51bSByZWxvY190eXBlIHJfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX3ZtYSByX2FkZGVuZDsJCS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotLyogUS4KLSAgIFNob3VsZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUgYmUgNCBieXRlcyBvciA4IGJ5dGVzID8KLQotICAgUS4KLSAgIFdoYXQgYWJvdXQgYXJjaGl2ZSBpbmRleGVzID8KLQotICovCi0KLSNlbmRpZgkJCQkvKiBfX0FfT1VUXzY0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2FyLmggYi9pbmNsdWRlL2FvdXQvYXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1ZGNkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvYXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIGFyY2hpdmUgZmlsZSBkZWZpbml0aW9uIGZvciBHTlUgc29mdHdhcmUgKi8KLQotLyogU28gZmFyIHRoaXMgaXMgY29ycmVjdCBmb3IgQlNEaXNoIGFyY2hpdmVzLiAgRG9uJ3QgZm9yZ2V0IHRoYXQKLSAgIGZpbGVzIG11c3QgYmVnaW4gb24gYW4gZXZlbiBieXRlIGJvdW5kYXJ5LiAqLwotCi0jaWZuZGVmIF9fR05VX0FSX0hfXwotI2RlZmluZSBfX0dOVV9BUl9IX18KLQotLyogTm90ZSB0aGF0IHRoZSB1c3VhbCAnXG4nIGluIG1hZ2ljIHN0cmluZ3MgbWF5IHRyYW5zbGF0ZSB0byBkaWZmZXJlbnQKLSAgIGNoYXJhY3RlcnMsIGFzIGFsbG93ZWQgYnkgQU5TSS4gICdcMDEyJyBoYXMgYSBmaXhlZCB2YWx1ZSwgYW5kIHJlbWFpbnMKLSAgIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBCU0Rpc2ggYXJjaGl2ZXMuICovCi0KLSNkZWZpbmUgQVJNQUcgICIhPGFyY2g+XDAxMiIJLyogRm9yIENPRkYgYW5kIGEub3V0IGFyY2hpdmVzICovCi0jZGVmaW5lIEFSTUFHQiAiITxib3V0PlwwMTIiCS8qIEZvciBiLm91dCBhcmNoaXZlcyAqLwotI2RlZmluZSBTQVJNQUcgOAotI2RlZmluZSBBUkZNQUcgImBcMDEyIgotCi0vKiBUaGUgYXJfZGF0ZSBmaWVsZCBvZiB0aGUgYXJtYXAgKF9fLlNZTURFRikgbWVtYmVyIG9mIGFuIGFyY2hpdmUKLSAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtb2RpZmllZCBkYXRlIG9mIHRoZSBlbnRpcmUgZmlsZSwgb3IgCi0gICBCU0QtZGVyaXZlZCBsaW5rZXJzIGNvbXBsYWluLiAgV2Ugb3JpZ2luYWxseSB3cml0ZSB0aGUgYXJfZGF0ZSB3aXRoCi0gICB0aGlzIG9mZnNldCBmcm9tIHRoZSByZWFsIGZpbGUncyBtb2QtdGltZS4gIEFmdGVyIGZpbmlzaGluZyB0aGUKLSAgIGZpbGUsIHdlIHJld3JpdGUgYXJfZGF0ZSBpZiBpdCdzIG5vdCBzdGlsbCBncmVhdGVyIHRoYW4gdGhlIG1vZCBkYXRlLiAgKi8KLQotI2RlZmluZSBBUk1BUF9USU1FX09GRlNFVCAgICAgICA2MAotCi1zdHJ1Y3QgYXJfaGRyIHsKLSAgY2hhciBhcl9uYW1lWzE2XTsJCS8qIG5hbWUgb2YgdGhpcyBtZW1iZXIgKi8KLSAgY2hhciBhcl9kYXRlWzEyXTsJCS8qIGZpbGUgbXRpbWUgKi8KLSAgY2hhciBhcl91aWRbNl07CQkvKiBvd25lciB1aWQ7IHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX2dpZFs2XTsJCS8qIG93bmVyIGdpZDsgcHJpbnRlZCBhcyBkZWNpbWFsICovCi0gIGNoYXIgYXJfbW9kZVs4XTsJCS8qIGZpbGUgbW9kZSwgcHJpbnRlZCBhcyBvY3RhbCAgICovCi0gIGNoYXIgYXJfc2l6ZVsxMF07CQkvKiBmaWxlIHNpemUsIHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX2ZtYWdbMl07CQkvKiBzaG91bGQgY29udGFpbiBBUkZNQUcgKi8KLX07Ci0KLSNlbmRpZiAvKiBfX0dOVV9BUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9keW5peDMuaCBiL2luY2x1ZGUvYW91dC9keW5peDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlZWViZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvZHluaXgzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogYS5vdXQgc3BlY2lmaWNzIGZvciBTZXF1ZW50IFN5bW1ldHJ5IHJ1bm5pbmcgRHluaXggMy54Ci0gKi8KLSNpZm5kZWYgQV9PVVRfRFlOSVgzX0gKLSNkZWZpbmUgQV9PVVRfRFlOSVgzX0gKLQotI2RlZmluZSBleHRlcm5hbF9leGVjIGR5bml4X2V4dGVybmFsX2V4ZWMKLQotLyogc3RydWN0IGV4ZWMgZm9yIER5bml4IDMKLSAqCi0gKiBhX2dkdGJsIGFuZCBhX2Jvb3RzdHJhcCBhcmUgb25seSBmb3Igc3RhbmRhbG9uZSBiaW5hcmllcy4KLSAqIFNoYXJlZCBkYXRhIGZpZWxkcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsIGFzIG9mIER5bml4IDMuMSwKLSAqIGJ1dCBhcmUgc3VwcG9ydGVkIGJ5IER5bml4IGNvbXBpbGVyIHByb2dyYW1zLgotICovCi1zdHJ1Y3QgZHluaXhfZXh0ZXJuYWxfZXhlYyB7Ci0JdW5zaWduZWQgY2hhciBlX2luZm9bNF07Ci0JdW5zaWduZWQgY2hhciBlX3RleHRbNF07Ci0JdW5zaWduZWQgY2hhciBlX2RhdGFbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZW50cnlbNF07Ci0JdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9nX2NvZGVbOF0sIGVfZ19kYXRhWzhdLCBlX2dfZGVzY1s4XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hkYXRhWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9zaGJzc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hkcnNpemVbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Jvb3RzdHJhcFs0NF07Ci0JdW5zaWduZWQgY2hhciBlX3Jlc2VydmVkWzEyXTsKLQl1bnNpZ25lZCBjaGFyIGVfdmVyc2lvbls0XTsKLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSgxMjgpCi0KLS8qCi0gKiBBbGwgZXhlY3V0YWJsZXMgdW5kZXIgRHluaXggYXJlIGRlbWFuZCBwYWdlZCB3aXRoIHJlYWQtb25seSB0ZXh0LAotICogVGh1cyBubyBOTUFHSUMuCi0gKgotICogWk1BR0lDIGhhcyBhIHBhZ2Ugb2YgMHMgYXQgdmlydHVhbCAwLAotICogWE1BR0lDIGhhcyBhbiBpbnZhbGlkIHBhZ2UgYXQgdmlydHVhbCAwCi0gKi8KLSNkZWZpbmUgT01BR0lDCTB4MTJlYgkJLyogLm8gKi8KLSNkZWZpbmUgWk1BR0lDCTB4MjJlYgkJLyogemVybyBAIDAsIGRlbWFuZCBsb2FkICovCi0jZGVmaW5lIFhNQUdJQwkweDMyZWIJCS8qIGludmFsaWQgQCAwLCBkZW1hbmQgbG9hZCAqLwotI2RlZmluZSBTTUFHSUMJMHg0MmViCQkvKiBzdGFuZGFsb25lLCBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KLQotI2RlZmluZSBOX0JBRE1BRyh4KSAoKE9NQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFpNQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFhNQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFNNQUdJQyAhPSBOX01BR0lDKHgpKSkKLQotI2RlZmluZSBOX0FERFJBREooeCkgKChaTUFHSUMgPT0gTl9NQUdJQyh4KSB8fCBYTUFHSUMgPT0gTl9NQUdJQyh4KSkgPyAweDEwMDAgOiAwKQotCi0jZGVmaW5lIE5fVFhUT0ZGKHgpIChFWEVDX0JZVEVTX1NJWkUpCi0jZGVmaW5lIE5fREFUT0ZGKHgpIChOX1RYVE9GRih4KSArIE5fVFhUU0laRSh4KSkKLSNkZWZpbmUgTl9TSERBVE9GRih4KSAoTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX1RSRUxPRkYoeCkgKE5fU0hEQVRPRkYoeCkgKyAoeCkuYV9zaGRhdGEpCi0jZGVmaW5lIE5fRFJFTE9GRih4KSAoTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplKQotI2RlZmluZSBOX1NIRFJFTE9GRih4KSAoTl9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplKQotI2RlZmluZSBOX1NZTU9GRih4KSAoTl9TSERSRUxPRkYoeCkgKyAoeCkuYV9zaGRyc2l6ZSkKLSNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcykKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotCSgoKE9NQUdJQyA9PSBOX01BR0lDKHgpKSB8fCAoU01BR0lDID09IE5fTUFHSUMoeCkpKSA/IDAgXAotCSA6IFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSkKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkgXAotCSgoKE9NQUdJQyA9PSBOX01BR0lDKHgpKSB8fCAoU01BR0lDID09IE5fTUFHSUMoeCkpKSA/ICgoeCkuYV90ZXh0KSBcCi0JIDogKCh4KS5hX3RleHQgLSBOX0FERFJBREooeCkgLSBFWEVDX0JZVEVTX1NJWkUpKQotCi0jZW5kaWYgLyogQV9PVVRfRFlOSVgzX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9lbmNhcC5oIGIvaW5jbHVkZS9hb3V0L2VuY2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTVkNDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2VuY2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogWWV0IEFub3RoZXIgVHJ5IGF0IGVuY2Fwc3VsYXRpbmcgYnNkIG9iamVjdCBmaWxlcyBpbiBjb2ZmLgotICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBQYWNlIFdpbGxpc3NvbiAxMi85Lzg4Ci0KLSAgIFRoaXMgZmlsZSBpcyBvYnNvbGV0ZS4gIEl0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBqdXN0IGRlZmluZSBhIGJ1bmNoCi0gICBvZiBzdHVmZiB0aGF0IEJGRCBjYW4gdXNlIHRvIGRvIGNvZmYtZW5jYXBzdWxhdGVkIGZpbGVzLiAgLS1nbnVAY3lnbnVzLmNvbQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogV2Ugb25seSB1c2UgdGhlIGNvZmYgaGVhZGVycyB0byB0ZWxsIHRoZSBrZXJuZWwKLSAqIGhvdyB0byBleGVjIHRoZSBmaWxlLiAgVGhlcmVmb3JlLCB0aGUgb25seSBmaWVsZHMgdGhhdCBuZWVkIHRvIAotICogYmUgZmlsbGVkIGluIGFyZSB0aGUgc2NucHRyIGFuZCB2YWRkciBmb3IgdGhlIHRleHQgYW5kIGRhdGEKLSAqIHNlY3Rpb25zLCBhbmQgdGhlIHZhZGRyIGZvciB0aGUgYnNzLiAgQXMgZmFyIGFzIGNvZmYgaXMgY29uY2VybmVkLAotICogdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLCByZWxvY2F0aW9uLCBvciBsaW5lIG51bWJlcnMuCi0gKgotICogQSBub3JtYWwgYnNkIGhlYWRlciAoc3RydWN0IGV4ZWMpIGlzIHBsYWNlZCBhZnRlciB0aGUgY29mZiBoZWFkZXJzLAotICogYW5kIGJlZm9yZSB0aGUgcmVhbCB0ZXh0LiAgSSBkZWZpbmVkIGEgdGhlIG5ldyBmaWVsZHMgJ2FfbWFjaHR5cGUnCi0gKiBhbmQgYV9mbGFncy4gIElmIGFfbWFjaHR5cGUgaXMgTV8zODYsIGFuZCBhX2ZsYWdzICYgQV9FTkNBUCBpcwotICogdHJ1ZSwgdGhlbiB0aGUgYnNkIGhlYWRlciBpcyBwcmVjZWVkZWQgYnkgYSBjb2ZmIGhlYWRlci4gIE1hY3JvcwotICogbGlrZSBOX1RYVE9GRiBhbmQgTl9UWFRBRERSIHVzZSB0aGlzIGZpZWxkIHRvIGZpbmQgdGhlIGJzZCBoZWFkZXIuCi0gKiAKLSAqIFRoZSBvbmx5IHByb2JsZW0gaXMgdG8gdHJhY2sgZG93biB0aGUgYnNkIGV4ZWMgaGVhZGVyLiAgVGhlCi0gKiBtYWNyb3MgSEVBREVSX09GRlNFVCwgZXRjIGRvIHRoaXMuCi0gKi8KLQotI2RlZmluZSBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUgMHgyMCAvKiBjb2ZmIGhlYWRlciBwcmVjZWRlcyBic2QgaGVhZGVyICovCi0KLS8qIERlc2NyaWJlIHRoZSBDT0ZGIGhlYWRlciB1c2VkIGZvciBlbmNhcHN1bGF0aW9uLiAgKi8KLQotc3RydWN0IGNvZmZoZWFkZXIKLXsKLSAgLyogZmlsZWhkciAqLwotICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOwotICB1bnNpZ25lZCBzaG9ydCBmX25zY25zOwotICBsb25nIGZfdGltZGF0OwotICBsb25nIGZfc3ltcHRyOwotICBsb25nIGZfbnN5bXM7Ci0gIHVuc2lnbmVkIHNob3J0IGZfb3B0aGRyOwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwotICAvKiBhb3V0aGRyICovCi0gIHNob3J0IG1hZ2ljOwotICBzaG9ydCB2c3RhbXA7Ci0gIGxvbmcgdHNpemU7Ci0gIGxvbmcgZHNpemU7Ci0gIGxvbmcgYnNpemU7Ci0gIGxvbmcgZW50cnk7Ci0gIGxvbmcgdGV4dF9zdGFydDsKLSAgbG9uZyBkYXRhX3N0YXJ0OwotICBzdHJ1Y3QgY29mZnNjbgotICAgIHsKLSAgICAgIGNoYXIgc19uYW1lWzhdOwotICAgICAgbG9uZyBzX3BhZGRyOwotICAgICAgbG9uZyBzX3ZhZGRyOwotICAgICAgbG9uZyBzX3NpemU7Ci0gICAgICBsb25nIHNfc2NucHRyOwotICAgICAgbG9uZyBzX3JlbHB0cjsKLSAgICAgIGxvbmcgc19sbm5vcHRyOwotICAgICAgdW5zaWduZWQgc2hvcnQgc19ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBzX25sbm5vOwotICAgICAgbG9uZyBzX2ZsYWdzOwotICAgIH0gc2Nuc1szXTsKLX07Ci0MCi0vKiBEZXNjcmliZSBzb21lIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBlbmNhcHN1bGF0aW9uLAotICAgaW5jbHVkaW5nIGhvdyB0byBmaW5kIHRoZSBlbmNhcHN1bGF0ZWQgQlNEIGhlYWRlci4gICovCi0KLS8qIEZJWE1FLCB0aGlzIGlzIGR1bWIuICBUaGUgc2FtZSB0b29scyBjYW4ndCBoYW5kbGUgYS5vdXRzIGZvciBkaWZmZXJlbnQKLSAgIGFyY2hpdGVjdHVyZXMsIGp1c3QgYmVjYXVzZSBDT0ZGX01BR0lDIGlzIGRpZmZlcmVudDsgc28geW91IG5lZWQgYQotICAgc2VwYXJhdGUgR05VIG5tIGZvciBldmVyeSBhcmNoaXRlY3R1cmUhIT8gIFVuZm9ydHVuYXRlbHksIGl0IG5lZWRzIHRvCi0gICBiZSB0aGlzIHdheSwgc2luY2UgdGhlIENPRkZfTUFHSUMgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUga2VybmVsCi0gICB3ZSdyZSB0cnlpbmcgdG8gZm9vbCBoZXJlLiAgKi8KLSAgIAotI2RlZmluZSBDT0ZGX01BR0lDX0kzODYgMDUxNCAvKiBJMzg2TUFHSUMgKi8KLSNkZWZpbmUgQ09GRl9NQUdJQ19NNjhLIDA1MjAgLyogTUM2OE1BR0lDICovCi0jZGVmaW5lCUNPRkZfTUFHSUNfQTI5SyAweDE3QQkvKiBVc2VkIGJ5IGFzbTI5ayBjcm9zcy10b29scyAqLwotCi0jaWZkZWYgQ09GRl9NQUdJQwotc2hvcnQgX19oZWFkZXJfb2Zmc2V0X3RlbXA7Ci0jZGVmaW5lIEhFQURFUl9PRkZTRVQoZikgXAotCShfX2hlYWRlcl9vZmZzZXRfdGVtcCA9IDAsIFwKLQkgZnJlYWQgKChjaGFyICopJl9faGVhZGVyX29mZnNldF90ZW1wLCBzaXplb2YgKHNob3J0KSwgMSwgKGYpKSwgXAotCSBmc2VlayAoKGYpLCAtc2l6ZW9mIChzaG9ydCksIDEpLCBcCi0JIF9faGVhZGVyX29mZnNldF90ZW1wPT1DT0ZGX01BR0lDID8gc2l6ZW9mKHN0cnVjdCBjb2ZmaGVhZGVyKSA6IDApCi0jZWxzZQotI2RlZmluZSBIRUFERVJfT0ZGU0VUKGYpIDAKLSNlbmRpZgotCi0jZGVmaW5lIEhFQURFUl9TRUVLKGYpIChmc2VlayAoKGYpLCBIRUFERVJfT0ZGU0VUKChmKSksIDEpKQotDAotLyogRGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgQlNEIGhlYWRlcgotICAgdGhhdCBhcHBlYXJzIGluc2lkZSB0aGUgZW5jYXBzdWxhdGlvbi4gICovCi0KLS8qIEVuY2Fwc3VsYXRlZCBjb2ZmIGZpbGVzIHRoYXQgYXJlIGxpbmtlZCBaTUFHSUMgaGF2ZSBhIHRleHQgc2VnbWVudAotICAgb2Zmc2V0IGp1c3QgcGFzdCB0aGUgaGVhZGVyIChhbmQgYSBtYXRjaGluZyBUWFRBRERSKSwgZXhjbHVkaW5nCi0gICB0aGUgaGVhZGVycyBmcm9tIHRoZSB0ZXh0IHNlZ21lbnQgcHJvcGVyIGJ1dCBrZWVwaW5nIHRoZSBwaHlzaWNhbAotICAgbGF5b3V0IGFuZCB0aGUgdmlydHVhbCBtZW1vcnkgbGF5b3V0IHBhZ2UtYWxpZ25lZC4KLQotICAgTm9uLWVuY2Fwc3VsYXRlZCBhLm91dCBmaWxlcyB0aGF0IGFyZSBsaW5rZWQgWk1BR0lDIGhhdmUgYSB0ZXh0Ci0gICBzZWdtZW50IHRoYXQgc3RhcnRzIGF0IDAgYW5kIGFuIE5fVFhUQURSIHNpbWlsYXJseSBvZmZzZXQgdG8gMC4KLSAgIFRoZXkgdG9vIGFyZSBwYWdlLWFsaWduZWQgd2l0aCBlYWNoIG90aGVyLCBidXQgdGhleSBpbmNsdWRlIHRoZQotICAgYS5vdXQgaGVhZGVyIGFzIHBhcnQgb2YgdGhlIHRleHQuIAotCi0gICBUaGUgX05fSERST0ZGIGdldHMgc2l6ZW9mIHN0cnVjdCBleGVjIGFkZGVkIHRvIGl0LCBzbyB3ZSBoYXZlCi0gICB0byBjb21wZW5zYXRlIGhlcmUuICBTZWUgPGEub3V0LmdudS5oPi4gICovCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSN1bmRlZiBOX1RYVEFERFIKLSN1bmRlZiBOX0RBVEFERFIKLQotI2RlZmluZSBfTl9IRFJPRkYoeCkgKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotCi0vKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQkoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAotCSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKSArIHNpemVvZiAoc3RydWN0IGV4ZWMpIDogMCkKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4NDAwMDAwCi0KLSNkZWZpbmUgTl9EQVRBRERSKHgpIFwKLQkoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAotCSAoU0VHTUVOVF9TSVpFICsgKChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dC0xKSAmIH4oU0VHTUVOVF9TSVpFLTEpKSkgOiBcCi0JIChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaG9zdC5oIGIvaW5jbHVkZS9hb3V0L2hvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzNjIxMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvaG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogUGFyYW1ldGVycyBhYm91dCB0aGUgYS5vdXQgZm9ybWF0LCBiYXNlZCBvbiB0aGUgaG9zdCBzeXN0ZW0gb24gd2hpY2gKLSAgIHRoZSBwcm9ncmFtIGlzIGNvbXBpbGVkLiAgKi8KLQotLyogQWRkcmVzcyBvZiBkYXRhIHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4KLSAgIEl0IGlzIHVwIHRvIHlvdSB0byBkZWZpbmUgU0VHTUVOVF9TSVpFCi0gICBvbiBtYWNoaW5lcyBub3QgbGlzdGVkIGhlcmUuICAqLwotI2lmbmRlZiBTRUdNRU5UX1NJWkUKLSNpZiBkZWZpbmVkKGhwMzAwKSB8fCBkZWZpbmVkKHB5cikKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIHBhZ2Vfc2l6ZQotI2VuZGlmCi0jaWZkZWYJc29ueQotI2RlZmluZQlTRUdNRU5UX1NJWkUJMHgxMDAwCi0jZW5kaWYJLyogU29ueS4gICovCi0jaWZkZWYgaXM2OGsKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MjAwMDAKLSNlbmRpZgotI2lmIGRlZmluZWQobTY4aykgJiYgZGVmaW5lZChQT1JUQVIpCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHg0MDAKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotI2VuZGlmIC8qIWRlZmluZWQoU0VHTUVOVF9TSVpFKSovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocC5oIGIvaW5jbHVkZS9hb3V0L2hwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmY0OWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiBTcGVjaWFsIHZlcnNpb24gb2YgPGEub3V0Lmg+IGZvciB1c2UgdW5kZXIgaHAtdXguCi0gICBDb3B5cmlnaHQgMTk4OCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVEhJUyBGSUxFIElTIE9CU09MRVRFLiAgSXQgbmVlZHMgdG8gYmUgcmV2aXNlZCBhcyBhIHZhcmlhbnQgImV4dGVybmFsIgotICAgYS5vdXQgZm9ybWF0IGZvciB1c2Ugd2l0aCBCRkQuICAqLwotCi0vKiBUaGUgYGV4ZWMnIHN0cnVjdHVyZSBhbmQgb3ZlcmFsbCBsYXlvdXQgbXVzdCBiZSBjbG9zZSB0byBIUCdzIHdoZW4KLSAgIHdlIGFyZSBydW5uaW5nIG9uIGFuIEhQIHN5c3RlbSwgb3RoZXJ3aXNlIHdlIHdpbGwgbm90IGJlIGFibGUgdG8KLSAgIGV4ZWN1dGUgdGhlIHJlc3VsdGluZyBmaWxlLiAqLwotCi0vKiBBbGxvdyB0aGlzIGZpbGUgdG8gYmUgaW5jbHVkZWQgdHdpY2UuICovCi0jaWZuZGVmIF9fR05VX0VYRUNfTUFDUk9TX18KLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgc2hvcnQgYV9tYWNodHlwZTsJLyogbWFjaGluZSB0eXBlICovCi0gIHVuc2lnbmVkIHNob3J0IGFfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUxOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUyOwotICB1bnNpZ25lZCBsb25nIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUzOwkvKiBIUCA9IHBhc2NhbCBpbnRlcmZhY2Ugc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU0OwkvKiBIUCA9IHN5bWJvbCB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTU7CS8qIEhQID0gZGVidWcgbmFtZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9lbnRyeTsJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU2OwkvKiBIUCA9IHNvdXJjZSBsaW5lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNzsJLyogSFAgPSB2YWx1ZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTg7Ci19OwotCi0vKiBUZWxsIGEub3V0LmdudS5oIG5vdCB0byBkZWZpbmUgYHN0cnVjdCBleGVjJy4gICovCi0jZGVmaW5lIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi0jaW5jbHVkZSAiLi4vYS5vdXQuZ251LmgiCi0KLSN1bmRlZiBOX01BR0lDCi0jdW5kZWYgTl9NQUNIVFlQRQotI3VuZGVmIE5fRkxBR1MKLSN1bmRlZiBOX1NFVF9JTkZPCi0jdW5kZWYgTl9TRVRfTUFHSUMKLSN1bmRlZiBOX1NFVF9NQUNIVFlQRQotI3VuZGVmIE5fU0VUX0ZMQUdTCi0KLSNkZWZpbmUgTl9NQUdJQyhleGVjKSAoKGV4ZWMpIC4gYV9tYWdpYykKLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGV4ZWMpIC4gYV9tYWNodHlwZSkKLSNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpICgoKGV4ZWMpIC4gYV9tYWdpYykgPSAobWFnaWMpKQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgKCgoZXhlYykgLiBhX21hY2h0eXBlKSA9IChtYWNodHlwZSkpCi0KLSN1bmRlZiBOX0JBRE1BRwotI2RlZmluZSBOX0JBRE1BRyh4KSAoKF9OX0JBRE1BRyAoeCkpIHx8IChfTl9CQURNQUNIICh4KSkpCi0KLSNkZWZpbmUgX05fQkFETUFDSCh4KQkJCQkJCQlcCi0oKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5MDAwUzIwMF9JRCkgJiYJCQkJCVwKLSAoKE5fTUFDSFRZUEUgKHgpKSAhPSBIUDk4eDZfSUQpKQotCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDIwQQotI2RlZmluZSBIUDkwMDBTMjAwX0lEIDB4MjBDCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSNkZWZpbmUgX05fSERST0ZGKHgpIChTRUdNRU5UX1NJWkUgLSAoc2l6ZW9mIChzdHJ1Y3QgZXhlYykpKQotCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDEwMDAKLQotI2VuZGlmIC8qIF9fR05VX0VYRUNfTUFDUk9TX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocDMwMGhwdXguaCBiL2luY2x1ZGUvYW91dC9ocDMwMGhwdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkNTE5Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyogU3BlY2lhbCB2ZXJzaW9uIG9mIDxhLm91dC5oPiBmb3IgdXNlIHVuZGVyIGhwLXV4LgotICAgQ29weXJpZ2h0IChDKSAxOTg4LDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICovCi0KLXN0cnVjdCBocDMwMGhwdXhfZXhlY19ieXRlcwotewotICB1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsgICAvKiBhX21hY2h0eXBlL2FfbWFnaWMgKi8KLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlMVs0XTsKLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlMls0XTsKLSAgdW5zaWduZWQgY2hhciBlX3RleHRbNF07ICAgLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOyAgIC8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfYnNzWzRdOyAgICAvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfdHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyovCi0gIHVuc2lnbmVkIGNoYXIgZV9kcnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzKi8KLSAgdW5zaWduZWQgY2hhciBlX3Bhc3NpemVbNF07LyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3N5bXNbNF07ICAgLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3BhcmU1WzRdOyAvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfZW50cnlbNF07ICAvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTZbNF07IC8qIEhQID0gc291cmNlIGxpbmUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3Vwc2l6ZVs0XTsvKiBIUCA9IHZhbHVlIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX2RyZWxvY3NbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV9leHRlbnNpb25bNF07IC8qIGZpbGUgb2Zmc2V0IG9mIGV4dGVuc2lvbiAqLwotfTsKLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCTY0Ci0KLXN0cnVjdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgZV92YWx1ZVs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfdHlwZVsxXTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfbGVuZ3RoWzFdOwkvKiBsZW5ndGggb2YgYXNjaWkgc3ltYm9sIG5hbWUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfYWxtb2RbMl07CS8qIGFsaWdubWVudCBtb2QgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfc2hsaWJbMl07ICAgLyogaW5mbyBhYm91dCBkeW5hbWljIGxpbmtpbmcgKi8KLSAgfTsKLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAxMAotCi1zdHJ1Y3QgaHAzMDBocHV4X3JlbG9jCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHJfYWRkcmVzc1s0XTsvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl9pbmRleFsyXTsgIC8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl90eXBlWzFdOyAgIC8qIHJlbG9jYXRpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl9sZW5ndGhbMV07IC8qIGxlbmd0aCBvZiBpdGVtIHRvIHJlbG9jICAgICAgICAgICAgICAqLwotICB9OwotCi1zdHJ1Y3QgaHAzMDBocHV4X2hlYWRlcl9leHRlbnNpb24KLXsKLSAgICB1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsKLSAgICB1bnNpZ25lZCBjaGFyIHVuaXF1ZV9oZWFkZXJzWzEyKjRdOwotICAgIHVuc2lnbmVkIGNoYXIgZV9oZWFkZXJbMl07ICAgLyogdHlwZSBvZiBoZWFkZXIgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfdmVyc2lvblsyXTsgIC8qIHZlcnNpb24gICAgICAgICovCi0gICAgdW5zaWduZWQgY2hhciBlX3NpemVbNF07ICAgICAvKiBieXRlcyBmb2xsb3dpbmcqLwotICAgIHVuc2lnbmVkIGNoYXIgZV9leHRlbnNpb25bNF07LyogZmlsZSBvZmZzZXQgb2YgbmV4dCBleHRlbnNpb24gKi8KLX07Ci0jZGVmaW5lIEVYVEVSTkFMX0VYVEVOU0lPTl9IRUFERVJfU0laRSAoMTYqNCkKLQotLyogaHB1eCBzZXBhcmF0ZXMgb2JqZWN0IGZpbGVzICgweDEwNikgYW5kIGltcHVyZSBleGVjdXRhYmxlcyAoMHgxMDcpICAqLwotLyogYnV0IHRoZSBiZmQgY29kZSBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0uIFNpbmNlIHdlIHdhbnQgdG8qLwotLyogcmVhZCBocHV4IC5vIGZpbGVzLCB3ZSBhZGQgYW4gc3BlY2lhbCBkZWZpbmUgYW5kIHVzZSBpdCBiZWxvdyBpbiAgICAqLwotLyogb2Zmc2V0IGFuZCBhZGRyZXNzIGNhbGN1bGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEhQVVhfRE9UX09fTUFHSUMgMHgxMDYKLSNkZWZpbmUgT01BR0lDIDB4MTA3ICAgICAgIC8qIG9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDB4MTA4ICAgICAgIC8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAgKi8KLSNkZWZpbmUgWk1BR0lDIDB4MTBCICAgICAgIC8qIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgICAgICAgICAgKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLQotI2lmIDAgLyogbGliYW91dC5oIG9ubHkgdXNlcyB0aGUgbG93ZXIgOCBiaXRzICovCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDIwQQotI2RlZmluZSBIUDkwMDBTMjAwX0lEIDB4MjBDCi0jZW5kaWYKLSNkZWZpbmUgSFA5OHg2X0lEIDB4MEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDBDCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkgKChfTl9CQURNQUcgKHgpKSB8fCAoX05fQkFETUFDSCAoeCkpKQotCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKChOX01BR0lDKHgpPT1PTUFHSUMgfHwgTl9NQUdJQyh4KT09SFBVWF9ET1RfT19NQUdJQykgPyBcCi0gICAgICAgIChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCktMSkgJiB+KE5fU0VHU0laRSh4KS0xKSkpKQotCi0jZGVmaW5lIF9OX0JBRE1BQ0goeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5MDAwUzIwMF9JRCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5OHg2X0lEKSkKLQotI2RlZmluZSBfTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBIUFVYX0RPVF9PX01BR0lDIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCi0JCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQyApCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSNkZWZpbmUgX05fSERST0ZGKHgpIChTRUdNRU5UX1NJWkUgLSAoc2l6ZW9mIChzdHJ1Y3QgZXhlYykpKQotCi0jdW5kZWYgTl9EQVRPRkYKLSN1bmRlZiBOX1BBU09GRgotI3VuZGVmIE5fU1lNT0ZGCi0jdW5kZWYgTl9TVVBPRkYKLSN1bmRlZiBOX1RSRUxPRkYKLSN1bmRlZiBOX0RSRUxPRkYKLSN1bmRlZiBOX1NUUk9GRgotCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkgKQotI2RlZmluZSBOX1BBU09GRih4KSAgICAgKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9QQVNPRkYoeCkgICAvKiArICh4KS5hX3Bhc3NpemUqLyApCi0jZGVmaW5lIE5fU1VQT0ZGKHgpICAgICAoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fU1VQT0ZGKHgpICAgIC8qICsgMCAoeCkuYV9zdXBzaXplKi8gKQotI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX0VYVEhPRkYoeCkgICAgKCBOX0RSRUxPRkYoeCkgICAvKiAgKyAwICh4KS5hX2Ryc2l6ZSAqLykKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCAwIC8qIG5vIHN0cmluZyB0YWJsZSAqLyApCi0KLS8qIHVzZSB0aGVzZSB3aGVuIHRoZSBmaWxlIGhhcyBnbnUgc3ltYm9sIHRhYmxlcyAqLwotI2RlZmluZSBOX0dOVV9UUkVMT0ZGKHgpIChOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCi0jZGVmaW5lIE5fR05VX0RSRUxPRkYoeCkgKE5fR05VX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUpCi0jZGVmaW5lIE5fR05VX1NZTU9GRih4KSAgKE5fR05VX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUpCi0KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDEwMDAKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MTAwMAotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotCi0jdW5kZWYgTl9TSEFSRURfTElCCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAgKCAwIC8qIG5vIHNoYXJlZCBsaWJyYXJpZXMgKi8gKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hwcGEuaCBiL2luY2x1ZGUvYW91dC9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMTg1ZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2luY2x1ZGUgImZpbGVoZHIuaCIKLSNpbmNsdWRlICJhb3V0aGRyLmgiCi0jaW5jbHVkZSAic2NuaGRyLmgiCi0jaW5jbHVkZSAic3BhY2VoZHIuaCIKLSNpbmNsdWRlICJzeW1zLmgiCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3JhbmxpYi5oIGIvaW5jbHVkZS9hb3V0L3JhbmxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI2MDA1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9yYW5saWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIHJhbmxpYi5oIC0tIGFyY2hpdmUgbGlicmFyeSBpbmRleCBtZW1iZXIgZGVmaW5pdGlvbiBmb3IgR05VLgotICAgQ29weXJpZ2h0IDE5OTAtMTk5MSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBTeW1kZWYgbWVtYmVyIG9mIGFuIGFyY2hpdmUgY29udGFpbnMgdHdvIHRoaW5nczoKLSAgIGEgdGFibGUgdGhhdCBtYXBzIHN5bWJvbC1zdHJpbmcgb2Zmc2V0cyB0byBmaWxlIG9mZnNldHMsCi0gICBhbmQgYSBzeW1ib2wtc3RyaW5nIHRhYmxlLiAgQWxsIHRoZSBzeW1ib2wgbmFtZXMgYXJlCi0gICBydW4gdG9nZXRoZXIgKGVhY2ggd2l0aCB0cmFpbGluZyBudWxsKSBpbiB0aGUgc3ltYm9sLXN0cmluZwotICAgdGFibGUuICBUaGVyZSBpcyBhIHNpbmdsZSBsb25nd29yZCBieXRlY291bnQgb24gdGhlIGZyb250Ci0gICBvZiBlYWNoIG9mIHRoZXNlIHRhYmxlcy4gIFRodXMgaWYgd2UgaGF2ZSB0d28gc3ltYm9scywKLSAgICJmb28iIGFuZCAiX2JhciIsIHRoYXQgYXJlIGluIGFyY2hpdmUgbWVtYmVycyBhdCBvZmZzZXRzCi0gICAyMDAgYW5kIDkwMCwgaXQgd291bGQgbG9vayBsaWtlIHRoaXM6Ci0gICAgICAgIDE2CQk7IGJ5dGUgY291bnQgb2YgaW5kZXggdGFibGUKLSAgCTAJCTsgb2Zmc2V0IG9mICJmb28iIGluIHN0cmluZyB0YWJsZQotICAJMjAwCQk7IG9mZnNldCBvZiBmb28tbW9kdWxlIGluIGZpbGUKLSAgCTQJCTsgb2Zmc2V0IG9mICJiYXIiIGluIHN0cmluZyB0YWJsZQotICAJOTAwCQk7IG9mZnNldCBvZiBiYXItbW9kdWxlIGluIGZpbGUKLSAgCTkJCTsgYnl0ZSBjb3VudCBvZiBzdHJpbmcgdGFibGUKLSAgCSJmb29cMF9iYXJcMCIJOyBzdHJpbmcgdGFibGUgICovCi0KLSNkZWZpbmUJUkFOTElCTUFHCSJfXy5TWU1ERUYiCS8qIEFyY2hpdmUgZmlsZSBuYW1lIGNvbnRhaW5pbmcgaW5kZXggKi8KLSNkZWZpbmUJUkFOTElCU0tFVwkzCQkvKiBDcmVhdGlvbiB0aW1lIG9mZnNldCAqLwotCi0vKiBGb3JtYXQgb2YgX18uU1lNREVGOgotICAgRmlyc3QsIGEgbG9uZ3dvcmQgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgJ3N5bWRlZicgZGF0YSB0aGF0IGZvbGxvd3MuCi0gICBTZWNvbmQsIHplcm8gb3IgbW9yZSAnc3ltZGVmJyBzdHJ1Y3R1cmVzLgotICAgVGhpcmQsIGEgbG9uZ3dvcmQgY29udGFpbmluZyB0aGUgbGVuZ3RoIG9mIHN5bWJvbCBuYW1lIHN0cmluZ3MuCi0gICBGb3VydGgsIHplcm8gb3IgbW9yZSBzeW1ib2wgbmFtZSBzdHJpbmdzIChlYWNoIGZvbGxvd2VkIGJ5IGEgbnVsbCkuICAqLwotCi1zdHJ1Y3Qgc3ltZGVmCi0gIHsKLSAgICB1bmlvbgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc3RyaW5nX29mZnNldDsJLyogSW4gdGhlIGZpbGUgKi8KLQljaGFyICpuYW1lOwkJCS8qIEluIG1lbW9yeSwgc29tZXRpbWVzICovCi0gICAgICB9IHM7Ci0gICAgLyogdGhpcyBwb2ludHMgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIGhlYWRlciAoQUtBIG1lbWJlciBoZWFkZXIgLS0KLSAgICAgICBhIHN0cnVjdCBhcl9oZHIpLCBub3QgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIG9yIGludG8gdGhlIGZpbGUpLgotICAgICAgIGluIG90aGVyIHdvcmRzIGl0IG9ubHkgdGVsbHMgeW91IHdoaWNoIGZpbGUgdG8gcmVhZCAqLyAgICAgICAKLSAgICB1bnNpZ25lZCBsb25nIGZpbGVfb2Zmc2V0OwotICB9OwotCi0vKiBDb21wYXRhYmlsaXR5IHdpdGggQlNEIGNvZGUgKi8KLQotI2RlZmluZQlyYW5saWIJc3ltZGVmCi0jZGVmaW5lCXJhbl91bglzCi0jZGVmaW5lCXJhbl9zdHJ4IHN0cmluZ19vZmZzZXQKLSNkZWZpbmUJcmFuX25hbWUgbmFtZQotI2RlZmluZQlyYW5fb2ZmCWZpbGVfb2Zmc2V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvcmVsb2MuaCBiL2luY2x1ZGUvYW91dC9yZWxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjNjNTUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9yZWxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogcmVsb2MuaCAtLSBIZWFkZXIgZmlsZSBmb3IgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAxOTg5LTE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBSZWxvY2F0aW9uIHR5cGVzIGZvciBhLm91dCBmaWxlcyB1c2luZyByZWxvY19pbmZvX2V4dGVuZGVkCi0gICAoU1BBUkMgYW5kIEFNRCAyOTAwMCkuICovCi0KLSNpZm5kZWYgX1JFTE9DX0hfUkVBRF8KLSNkZWZpbmUgX1JFTE9DX0hfUkVBRF8gMQotCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIFJFTE9DXzgsICAgICAgICBSRUxPQ18xNiwgICAgICAgIFJFTE9DXzMyLCAvKiBzaW1wbGUgcmVsb2NhdGlvbnMgKi8KLSAgICBSRUxPQ19ESVNQOCwgICAgUkVMT0NfRElTUDE2LCAgICBSRUxPQ19ESVNQMzIsIC8qIHBjLXJlbCBkaXNwbGFjZW1lbnQgKi8KLSAgICBSRUxPQ19XRElTUDMwLCAgUkVMT0NfV0RJU1AyMiwKLSAgICBSRUxPQ19ISTIyLCAgICAgUkVMT0NfMjIsCi0gICAgUkVMT0NfMTMsICAgICAgIFJFTE9DX0xPMTAsCi0gICAgUkVMT0NfU0ZBX0JBU0UsIFJFTE9DX1NGQV9PRkYxMywKLSAgICBSRUxPQ19CQVNFMTAsICAgUkVMT0NfQkFTRTEzLCAgICBSRUxPQ19CQVNFMjIsIC8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgICBSRUxPQ19QQzEwLCAgICAgUkVMT0NfUEMyMiwJLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICAgIFJFTE9DX0pNUF9UQkwsCQkvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICAgIFJFTE9DX1NFR09GRjE2LAkJLyogcmVwdXRlZGx5IGZvciBzaGFyZWQgbGlicmFyaWVzIHNvbWVob3cgKi8KLSAgICBSRUxPQ19HTE9CX0RBVCwgIFJFTE9DX0pNUF9TTE9ULCBSRUxPQ19SRUxBVElWRSwKLSAgICBSRUxPQ18xMSwKLSAgICBSRUxPQ19XRElTUDJfMTQsCi0gICAgUkVMT0NfV0RJU1AxOSwKLSAgICBSRUxPQ19ISEkyMiwKLSAgICBSRUxPQ19ITE8xMCwKLSAgICAKLSAgICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICAgIFJFTE9DX0pVTVBUQVJHLCBSRUxPQ19DT05TVCwgICAgIFJFTE9DX0NPTlNUSCwKLSAgICAKLSAgICBSRUxPQ19XRElTUDE0LCBSRUxPQ19XRElTUDIxLAotICAgIAotICAgIE5PX1JFTE9DCi0gICAgfTsKLQotI2RlZmluZQlSRUxPQ19UWVBFX05BTUVTIFwKLSI4IiwJCSIxNiIsCQkiMzIiLAkJIkRJU1A4IiwJXAotIkRJU1AxNiIsCSJESVNQMzIiLAkiV0RJU1AzMCIsCSJXRElTUDIyIiwJXAotIkhJMjIiLAkJIjIyIiwJCSIxMyIsCQkiTE8xMCIsCQlcCi0iU0ZBX0JBU0UiLAkiU0ZBT0ZGMTMiLAkiQkFTRTEwIiwJIkJBU0UxMyIsCVwKLSJCQVNFMjIiLAkiUEMxMCIsCQkiUEMyMiIsCQkiSk1QX1RCTCIsCVwKLSJTRUdPRkYxNiIsCSJHTE9CX0RBVCIsCSJKTVBfU0xPVCIsCSJSRUxBVElWRSIsCVwKLSIxMSIsCQkiV0RJU1AyXzE0IiwJIldESVNQMTkiLCAJIkhISTIyIiwJXAotIkhMTzEwIiwJCQkJCQkJXAotIkpVTVBUQVJHIiwJIkNPTlNUIiwJIkNPTlNUSCIsCSJXRElTUDE0IiwJXAotIldESVNQMjEiLAlcCi0iTk9fUkVMT0MiCi0KLSNlbmRpZiAvKiBfUkVMT0NfSF9SRUFEXyAqLwotCi0vKiBlbmQgb2YgcmVsb2MuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N0YWIuZGVmIGIvaW5jbHVkZS9hb3V0L3N0YWIuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJkMmRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9zdGFiLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKiBUYWJsZSBvZiBEQlggc3ltYm9sIGNvZGVzIGZvciB0aGUgR05VIHN5c3RlbS4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIFRoaXMgdXNlcyBhbiBuX3R5cGUgb2YgMCwgd2hpY2ggaW4gYS5vdXQgZmlsZXMKLSAgIG92ZXJsYXBzIHRoZSBOX1VOREYgdXNlZCBmb3Igb3JkaW5hcnkgc3ltYm9scy4gIEluIEVMRiBmaWxlcywgdGhlCi0gICBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBpbiBhIGRpZmZlcmVudCBmaWxlIHNlY3Rpb24sIHNvIHRoZXJlIGlzIG5vIGNvbmZsaWN0LgotICAgVGhpcyBzeW1ib2wncyBuX3ZhbHVlIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgc2VjdGlvbiBhc3NvY2lhdGVkCi0gICB3aXRoIHRoaXMgZmlsZS4gIFRoZSBzeW1ib2wncyBuX3N0cnggKHJlbGF0aXZlIHRvIHRoZSBqdXN0LXVwZGF0ZWQKLSAgIHN0cmluZyBzZWN0aW9uIHN0YXJ0IGFkZHJlc3MpIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSwKLSAgIGUuZy4gImZvby5jIiwgd2l0aG91dCBhbnkgcGF0aCBpbmZvcm1hdGlvbi4gIFRoZSBzeW1ib2wncyBuX2Rlc2MgZ2l2ZXMKLSAgIHRoZSBjb3VudCBvZiB1cGNvbWluZyBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgKG5vdCBpbmNsdWRpbmcKLSAgIHRoaXMgb25lKS4gICovCi0vKiBfX2RlZmluZV9zdGFiIChOX1VOREYsIDB4MDAsICJVTkRGIikgICovCi0KLS8qIEdsb2JhbCB2YXJpYWJsZS4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCi0gICBUbyBmaW5kIHRoZSBhZGRyZXNzLCBsb29rIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIHN5bWJvbC4gICovCi1fX2RlZmluZV9zdGFiIChOX0dTWU0sIDB4MjAsICJHU1lNIikKLQotLyogRnVuY3Rpb24gbmFtZSBmb3IgQlNEIEZvcnRyYW4uICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLwotX19kZWZpbmVfc3RhYiAoTl9GTkFNRSwgMHgyMiwgIkZOQU1FIikKLQotLyogRnVuY3Rpb24gbmFtZSBvciB0ZXh0LXNlZ21lbnQgdmFyaWFibGUgZm9yIEMuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4KLSAgIERlc2MgaXMgc3VwcG9zZWRseSBzdGFydGluZyBsaW5lIG51bWJlciwgYnV0IEdDQyBkb2Vzbid0IHNldCBpdAotICAgYW5kIERCWCBzZWVtcyBub3QgdG8gbWlzcyBpdC4gICovCi1fX2RlZmluZV9zdGFiIChOX0ZVTiwgMHgyNCwgIkZVTiIpCi0KLS8qIERhdGEtc2VnbWVudCB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4KLSAgICJTdGF0aWMgU3ltIi4gICovCi1fX2RlZmluZV9zdGFiIChOX1NUU1lNLCAweDI2LCAiU1RTWU0iKQotCi0vKiBCU1Mtc2VnbWVudCB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0xDU1lNLCAweDI4LCAiTENTWU0iKQotCi0vKiBOYW1lIG9mIG1haW4gcm91dGluZS4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9NQUlOLCAweDJhLCAiTUFJTiIpCi0KLS8qIFNvbGFyaXMyOiAgUmVhZC1vbmx5IGRhdGEgc3ltYm9scy4gICovCi1fX2RlZmluZV9zdGFiIChOX1JPU1lNLCAweDJjLCAiUk9TWU0iKQotCi0vKiBHbG9iYWwgc3ltYm9sIGluIFBhc2NhbC4KLSAgIFN1cHBvc2VkbHkgdGhlIHZhbHVlIGlzIGl0cyBsaW5lIG51bWJlcjsgSSdtIHNrZXB0aWNhbC4gICovCi1fX2RlZmluZV9zdGFiIChOX1BDLCAweDMwLCAiUEMiKQotCi0vKiBOdW1iZXIgb2Ygc3ltYm9sczogIDAsIGZpbGVzLCxmdW5jcyxsaW5lcyBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCi1fX2RlZmluZV9zdGFiIChOX05TWU1TLCAweDMyLCAiTlNZTVMiKQotCi0vKiAiTm8gRFNUIG1hcCBmb3Igc3ltOiBuYW1lLCAsMCx0eXBlLGlnbm9yZWQiICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCi1fX2RlZmluZV9zdGFiIChOX05PTUFQLCAweDM0LCAiTk9NQVAiKQotCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIExpa2UgTl9TTywgYnV0IGZvciB0aGUgb2JqZWN0IGZpbGUuICBUd28gaW4KLSAgIGEgcm93IHByb3ZpZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIC5vIGZyb20gaXQuCi0gICBTb2xhcmlzMiB1c2VzIHRoaXMgdG8gYXZvaWQgcHV0dGluZyB0aGUgc3RhYnMgaW5mbyBpbnRvIHRoZSBsaW5rZWQKLSAgIGV4ZWN1dGFibGU7IHRoaXMgc3RhYiBnb2VzIGludG8gdGhlICIuc3RhYi5pbmRleCIgc2VjdGlvbiwgYW5kIHRoZSBkZWJ1Z2dlcgotICAgcmVhZHMgdGhlIHJlYWwgc3RhYnMgZGlyZWN0bHkgZnJvbSB0aGUgLm8gZmlsZXMgaW5zdGVhZC4gICovCi1fX2RlZmluZV9zdGFiIChOX09CSiwgMHgzOCwgIk9CSiIpCi0KLS8qIE5ldyBzdGFiIGZyb20gU29sYXJpcyAyLiAgT3B0aW9ucyBmb3IgdGhlIGRlYnVnZ2VyLCByZWxhdGVkIHRvIHRoZQotICAgc291cmNlIGxhbmd1YWdlIGZvciB0aGlzIG1vZHVsZS4gIEUuZy4gd2hldGhlciB0byB1c2UgQU5TSQotICAgaW50ZWdyYWwgcHJvbW90aW9ucyBvciB0cmFkaXRpb25hbCBpbnRlZ3JhbCBwcm9tb3Rpb25zLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fT1BULCAweDNjLCAiT1BUIikKLQotLyogUmVnaXN0ZXIgdmFyaWFibGUuICBWYWx1ZSBpcyBudW1iZXIgb2YgcmVnaXN0ZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9SU1lNLCAweDQwLCAiUlNZTSIpCi0KLS8qIE1vZHVsYS0yIGNvbXBpbGF0aW9uIHVuaXQuICBDYW4gc29tZW9uZSBzYXkgd2hhdCBpbmZvIGl0IGNvbnRhaW5zPyAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTTJDLCAweDQyLCAiTTJDIikKLQotLyogTGluZSBudW1iZXIgaW4gdGV4dCBzZWdtZW50LiAgRGVzYyBpcyB0aGUgbGluZSBudW1iZXI7Ci0gICB2YWx1ZSBpcyBjb3JyZXNwb25kaW5nIGFkZHJlc3MuICBPbiBTb2xhcmlzMiwgdGhlIGxpbmUgbnVtYmVyIGlzCi0gICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9TTElORSwgMHg0NCwgIlNMSU5FIikKLQotLyogU2ltaWxhciwgZm9yIGRhdGEgc2VnbWVudC4gICovCi1fX2RlZmluZV9zdGFiIChOX0RTTElORSwgMHg0NiwgIkRTTElORSIpCi0KLS8qIFNpbWlsYXIsIGZvciBic3Mgc2VnbWVudC4gICovCi1fX2RlZmluZV9zdGFiIChOX0JTTElORSwgMHg0OCwgIkJTTElORSIpCi0KLS8qIFN1bidzIHNvdXJjZS1jb2RlIGJyb3dzZXIgc3RhYnMuICA/PyBEb24ndCBrbm93IHdoYXQgdGhlIGZpZWxkcyBhcmUuCi0gICBTdXBwb3NlZGx5IHRoZSBmaWVsZCBpcyAicGF0aCB0byBhc3NvY2lhdGVkIC5jYiBmaWxlIi4gIFRISVMgVkFMVUUKLSAgIE9WRVJMQVBTIFdJVEggTl9CU0xJTkUhICAqLwotX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUgKE5fQlJPV1MsIDB4NDgsICJCUk9XUyIpCi0KLS8qIEdOVSBNb2R1bGEtMiBkZWZpbml0aW9uIG1vZHVsZSBkZXBlbmRlbmN5LiAgVmFsdWUgaXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCi0gICBvZiB0aGUgZGVmaW5pdGlvbiBmaWxlLiAgT3RoZXIgaXMgbm9uLXplcm8gaWYgaXQgaXMgaW1wb3J0ZWQgd2l0aCB0aGUKLSAgIEdOVSBNMiBrZXl3b3JkICVJTklUSUFMSVpFLiAgUGVyaGFwcyBOX00yQyBjYW4gYmUgdXNlZCBpZiB0aGVyZQotICAgYXJlIGVub3VnaCBlbXB0eSBmaWVsZHM/ICovCi1fX2RlZmluZV9zdGFiKE5fREVGRCwgMHg0YSwgIkRFRkQiKQotCi0vKiBOZXcgaW4gU29sYXJpczIuICBGdW5jdGlvbiBzdGFydC9ib2R5L2VuZCBsaW5lIG51bWJlcnMuICAqLwotX19kZWZpbmVfc3RhYihOX0ZMSU5FLCAweDRDLCAiRkxJTkUiKQotCi0vKiBUSEUgRk9MTE9XSU5HIFRXTyBTVEFCIFZBTFVFUyBDT05GTElDVC4gIEhhcHBpbHksIG9uZSBpcyBmb3IgTW9kdWxhLTIKLSAgIGFuZCBvbmUgaXMgZm9yIEMrKy4gICBTdGlsbCwuLi4gKi8KLS8qIEdOVSBDKysgZXhjZXB0aW9uIHZhcmlhYmxlLiAgTmFtZSBpcyB2YXJpYWJsZSBuYW1lLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRUhERUNMLCAweDUwLCAiRUhERUNMIikKLS8qIE1vZHVsYTIgaW5mbyAiZm9yIGltYyI6ICBuYW1lLCwwLDAsMCAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAgKi8KLV9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIChOX01PRDIsIDB4NTAsICJNT0QyIikKLQotLyogR05VIEMrKyBgY2F0Y2gnIGNsYXVzZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgRGVzYyBpcyBub256ZXJvIGlmCi0gICB0aGlzIGVudHJ5IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgQ0FVR0hUIHN0YWIgc2F5aW5nIHdoYXQgZXhjZXB0aW9uCi0gICB3YXMgY2F1Z2h0LiAgTXVsdGlwbGUgQ0FVR0hUIHN0YWJzIG1lYW5zIHRoYXQgbXVsdGlwbGUgZXhjZXB0aW9ucwotICAgY2FuIGJlIGNhdWdodCBoZXJlLiAgSWYgRGVzYyBpcyAwLCBpdCBtZWFucyBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0Ci0gICBoZXJlLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQ0FUQ0gsIDB4NTQsICJDQVRDSCIpCi0KLS8qIFN0cnVjdHVyZSBvciB1bmlvbiBlbGVtZW50LiAgVmFsdWUgaXMgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUuICAqLwotX19kZWZpbmVfc3RhYiAoTl9TU1lNLCAweDYwLCAiU1NZTSIpCi0KLS8qIFNvbGFyaXMyOiAgTGFzdCBzdGFiIGVtaXR0ZWQgZm9yIG1vZHVsZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VORE0sIDB4NjIsICJFTkRNIikKLQotLyogTmFtZSBvZiBtYWluIHNvdXJjZSBmaWxlLgotICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4KLSAgIElmIG11bHRpcGxlIE5fU08ncyBhcHBlYXIsIHRoZSBmaXJzdCB0byBjb250YWluIGEgdHJhaWxpbmcgLyBpcyB0aGUKLSAgIGNvbXBpbGF0aW9uIGRpcmVjdG9yeS4gIFRoZSBmaXJzdCB0byBub3QgY29udGFpbiBhIHRyYWlsaW5nIC8gaXMgdGhlCi0gICBzb3VyY2UgZmlsZSBuYW1lLCByZWxhdGl2ZSB0byB0aGUgY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgT3RoZXJzIChwZXJoYXBzCi0gICByZXN1bHRpbmcgZnJvbSBjZnJvbnQpIGFyZSBpZ25vcmVkLgotICAgT24gU29sYXJpczIsIHZhbHVlIGlzIHVuZGVmaW5lZCwgYnV0IGRlc2MgaXMgYSBzb3VyY2UtbGFuZ3VhZ2UgY29kZS4gICovCi0KLV9fZGVmaW5lX3N0YWIgKE5fU08sIDB4NjQsICJTTyIpCi0KLS8qIFN1blBybyBGNzc6ICBOYW1lIG9mIGFsaWFzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQUxJQVMsIDB4NmMsICJBTElBUyIpCi0KLS8qIEF1dG9tYXRpYyB2YXJpYWJsZSBpbiB0aGUgc3RhY2suICBWYWx1ZSBpcyBvZmZzZXQgZnJvbSBmcmFtZSBwb2ludGVyLgotICAgQWxzbyB1c2VkIGZvciB0eXBlIGRlc2NyaXB0aW9ucy4gICovCi1fX2RlZmluZV9zdGFiIChOX0xTWU0sIDB4ODAsICJMU1lNIikKLQotLyogQmVnaW5uaW5nIG9mIGFuIGluY2x1ZGUgZmlsZS4gIE9ubHkgU3VuIHVzZXMgdGhpcy4KLSAgIEluIGFuIG9iamVjdCBmaWxlLCBvbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVGhlIFN1biBsaW5rZXIgcHV0cyBkYXRhIGludG8gc29tZSBvZiB0aGUgb3RoZXIgZmllbGRzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQklOQ0wsIDB4ODIsICJCSU5DTCIpCi0KLS8qIE5hbWUgb2Ygc3ViLXNvdXJjZSBmaWxlICgjaW5jbHVkZSBmaWxlKS4KLSAgIFZhbHVlIGlzIHN0YXJ0aW5nIHRleHQgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9TT0wsIDB4ODQsICJTT0wiKQotCi0vKiBQYXJhbWV0ZXIgdmFyaWFibGUuICBWYWx1ZSBpcyBvZmZzZXQgZnJvbSBhcmd1bWVudCBwb2ludGVyLgotICAgKE9uIG1vc3QgbWFjaGluZXMgdGhlIGFyZ3VtZW50IHBvaW50ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZyYW1lIHBvaW50ZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9QU1lNLCAweGEwLCAiUFNZTSIpCi0KLS8qIEVuZCBvZiBhbiBpbmNsdWRlIGZpbGUuICBObyBuYW1lLgotICAgVGhpcyBhbmQgTl9CSU5DTCBhY3QgYXMgYnJhY2tldHMgYXJvdW5kIHRoZSBmaWxlJ3Mgb3V0cHV0LgotICAgSW4gYW4gb2JqZWN0IGZpbGUsIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRhdGEgaW4gdGhpcyBlbnRyeS4KLSAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIGZpZWxkcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0VJTkNMLCAweGEyLCAiRUlOQ0wiKQotCi0vKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0VOVFJZLCAweGE0LCAiRU5UUlkiKQotCi0vKiBCZWdpbm5pbmcgb2YgbGV4aWNhbCBibG9jay4KLSAgIFRoZSBkZXNjIGlzIHRoZSBuZXN0aW5nIGxldmVsIGluIGxleGljYWwgYmxvY2tzLgotICAgVGhlIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLgotICAgVGhlIHZhcmlhYmxlcyBkZWNsYXJlZCBpbnNpZGUgdGhlIGJsb2NrICpwcmVjZWRlKiB0aGUgTl9MQlJBQyBzeW1ib2wuCi0gICBPbiBTb2xhcmlzMiwgdGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi1fX2RlZmluZV9zdGFiIChOX0xCUkFDLCAweGMwLCAiTEJSQUMiKQotCi0vKiBQbGFjZSBob2xkZXIgZm9yIGRlbGV0ZWQgaW5jbHVkZSBmaWxlLiAgUmVwbGFjZXMgYSBOX0JJTkNMIGFuZCBldmVyeXRoaW5nCi0gICB1cCB0byB0aGUgY29ycmVzcG9uZGluZyBOX0VJTkNMLiAgVGhlIFN1biBsaW5rZXIgZ2VuZXJhdGVzIHRoZXNlIHdoZW4KLSAgIGl0IGZpbmRzIG11bHRpcGxlIGlkZW50aWNhbCBjb3BpZXMgb2YgdGhlIHN5bWJvbHMgZnJvbSBhbiBpbmNsdWRlIGZpbGUuCi0gICBUaGlzIGFwcGVhcnMgb25seSBpbiBvdXRwdXQgZnJvbSB0aGUgU3VuIGxpbmtlci4gICovCi1fX2RlZmluZV9zdGFiIChOX0VYQ0wsIDB4YzIsICJFWENMIikKLQotLyogTW9kdWxhLTIgc2NvcGUgaW5mb3JtYXRpb24uICBDYW4gc29tZW9uZSBzYXkgd2hhdCBpbmZvIGl0IGNvbnRhaW5zPyAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU0NPUEUsIDB4YzQsICJTQ09QRSIpCi0KLS8qIEVuZCBvZiBhIGxleGljYWwgYmxvY2suICBEZXNjIG1hdGNoZXMgdGhlIE5fTEJSQUMncyBkZXNjLgotICAgVGhlIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KLSAgIE9uIFNvbGFyaXMyLCB0aGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUkJSQUMsIDB4ZTAsICJSQlJBQyIpCi0KLS8qIEJlZ2luIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9CQ09NTSwgMHhlMiwgIkJDT01NIikKLQotLyogRW5kIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQKLSAgIChhbmQgaXQgc2hvdWxkIG1hdGNoIHRoZSBOX0JDT01NKS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VDT01NLCAweGU0LCAiRUNPTU0iKQotCi0vKiBNZW1iZXIgb2YgYSBjb21tb24gYmxvY2s7IHZhbHVlIGlzIG9mZnNldCB3aXRoaW4gdGhlIGNvbW1vbiBibG9jay4KLSAgIFRoaXMgc2hvdWxkIG9jY3VyIHdpdGhpbiBhIEJDT01NL0VDT01NIHBhaXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FQ09NTCwgMHhlOCwgIkVDT01MIikKLQotLyogU29sYXJpczI6IFBhc2NhbCAid2l0aCIgc3RhdGVtZW50OiB0eXBlLCwwLDAsb2Zmc2V0ICovCi1fX2RlZmluZV9zdGFiIChOX1dJVEgsIDB4ZWEsICJXSVRIIikKLQotLyogVGhlc2UgU1RBQidzIGFyZSB1c2VkIG9uIEdvdWxkIHN5c3RlbXMgZm9yIE5vbi1CYXNlIHJlZ2lzdGVyIHN5bWJvbHMKLSAgIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuICBGSVhNRS4gIEkgaGF2ZSBhc3NpZ25lZCB0aGUgdmFsdWVzIGF0IHJhbmRvbQotICAgc2luY2UgSSBkb24ndCBoYXZlIGEgR291bGQgaGVyZS4gIEZpeHVwcyBmcm9tIEdvdWxkIGZvbGsgd2VsY29tZS4uLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OQlRFWFQsIDB4RjAsICJOQlRFWFQiKQotX19kZWZpbmVfc3RhYiAoTl9OQkRBVEEsIDB4RjIsICJOQkRBVEEiKQotX19kZWZpbmVfc3RhYiAoTl9OQkJTUywgIDB4RjQsICJOQkJTUyIpCi1fX2RlZmluZV9zdGFiIChOX05CU1RTLCAgMHhGNiwgIk5CU1RTIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJMQ1MsICAweEY4LCAiTkJMQ1MiKQotCi0vKiBTZWNvbmQgc3ltYm9sIGVudHJ5IGNvbnRhaW5pbmcgYSBsZW5ndGgtdmFsdWUgZm9yIHRoZSBwcmVjZWRpbmcgZW50cnkuCi0gICBUaGUgdmFsdWUgaXMgdGhlIGxlbmd0aC4gICovCi1fX2RlZmluZV9zdGFiIChOX0xFTkcsIDB4ZmUsICJMRU5HIikKLQwKLS8qIFRoZSBhYm92ZSBpbmZvcm1hdGlvbiwgaW4gbWF0cml4IGZvcm1hdC4KLQotCQkJU1RBQiBNQVRSSVgKLQlfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0JfCAwMCAtIDFGIGFyZSBub3QgZGJ4IHN0YWIgc3ltYm9scwkJfAotCXwgSW4gbW9zdCBjYXNlcywgdGhlIGxvdyBiaXQgaXMgdGhlIEVYVGVybmFsIGJpdHwKLQotCXwgMDAgVU5ERUYgIHwgMDIgQUJTCXwgMDQgVEVYVCAgIHwgMDYgREFUQQl8Ci0JfCAwMSAgfEVYVCAgfCAwMyAgfEVYVAl8IDA1ICB8RVhUICB8IDA3ICB8RVhUCXwKLQotCXwgMDggQlNTICAgIHwgMEEgSU5EUgl8IDBDIEZOX1NFUSB8IDBFIFdFQUtBCXwKLQl8IDA5ICB8RVhUICB8IDBCIAl8IDBEIFdFQUtVICB8IDBGIFdFQUtUCXwKLQotCXwgMTAgV0VBS0QgIHwgMTIgQ09NTQl8IDE0IFNFVEEgICB8IDE2IFNFVFQJfAotCXwgMTEgV0VBS0IgIHwgMTMJfCAxNSAJICAgIHwgMTcJfAotCi0JfCAxOCBTRVREICAgfCAxQSBTRVRCCXwgMUMgU0VUViAgIHwgMUUgV0FSTklOR3wKLQl8IDE5CSAgICB8IDFCCXwgMUQgCSAgICB8IDFGIEZOCXwKLQotCXxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLQl8IERlYnVnIGVudHJpZXMgd2l0aCBiaXQgMDEgc2V0IGFyZSB1bnVzZWQuCXwKLQl8IDIwIEdTWU0gICB8IDIyIEZOQU1FCXwgMjQgRlVOICAgIHwgMjYgU1RTWU0JfAotCXwgMjggTENTWU0gIHwgMkEgTUFJTgl8IDJDIFJPU1lNICB8IDJFCXwKLQl8IDMwIFBDCSAgICB8IDMyIE5TWU1TCXwgMzQgTk9NQVAgIHwgMzYJfAotCXwgMzggT0JKICAgIHwgM0EJfCAzQyBPUFQgICAgfCAzRQl8Ci0JfCA0MCBSU1lNICAgfCA0MiBNMkMJfCA0NCBTTElORSAgfCA0NiBEU0xJTkUgfAotCXwgNDggQlNMSU5FKnwgNEEgREVGRAl8IDRDIEZMSU5FICB8IDRFCXwKLQl8IDUwIEVIREVDTCp8IDUyCXwgNTQgQ0FUQ0ggIHwgNTYgICAgICAgIHwKLQl8IDU4ICAgICAgICB8IDVBICAgICAgICB8IDVDICAgICAgICB8IDVFCXwKLQl8IDYwIFNTWU0gICB8IDYyIEVORE0JfCA2NCBTTwkgICAgfCA2NiAJfAotCXwgNjggCSAgICB8IDZBCXwgNkMgQUxJQVMgIHwgNkUJfAotCXwgNzAJICAgIHwgNzIJfCA3NAkgICAgfCA3Ngl8Ci0JfCA3OAkgICAgfCA3QQl8IDdDCSAgICB8IDdFCXwKLQl8IDgwIExTWU0gICB8IDgyIEJJTkNMCXwgODQgU09MICAgIHwgODYJfAotCXwgODgJICAgIHwgOEEJfCA4QwkgICAgfCA4RQl8Ci0JfCA5MAkgICAgfCA5Mgl8IDk0CSAgICB8IDk2CXwKLQl8IDk4CSAgICB8IDlBCXwgOUMJICAgIHwgOUUJfAotCXwgQTAgUFNZTSAgIHwgQTIgRUlOQ0wJfCBBNCBFTlRSWSAgfCBBNgl8Ci0JfCBBOAkgICAgfCBBQQl8IEFDCSAgICB8IEFFCXwKLQl8IEIwCSAgICB8IEIyCXwgQjQJICAgIHwgQjYJfAotCXwgQjgJICAgIHwgQkEJfCBCQwkgICAgfCBCRQl8Ci0JfCBDMCBMQlJBQyAgfCBDMiBFWENMCXwgQzQgU0NPUEUgIHwgQzYJfAotCXwgQzgJICAgIHwgQ0EJfCBDQwkgICAgfCBDRQl8Ci0JfCBEMAkgICAgfCBEMgl8IEQ0CSAgICB8IEQ2CXwKLQl8IEQ4CSAgICB8IERBCXwgREMJICAgIHwgREUJfAotCXwgRTAgUkJSQUMgIHwgRTIgQkNPTU0JfCBFNCBFQ09NTSAgfCBFNgl8Ci0JfCBFOCBFQ09NTCAgfCBFQSBXSVRICXwgRUMJICAgIHwgRUUJfAotCXwgRjAJICAgIHwgRjIJfCBGNAkgICAgfCBGNgl8Ci0JfCBGOAkgICAgfCBGQQl8IEZDCSAgICB8IEZFIExFTkcJfAotCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIDUwIEVIREVDTCBpcyBhbHNvIE1PRDIuCi0gKiA0OCBCU0xJTkUgaXMgYWxzbyBCUk9XUy4KLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmggYi9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxOGUxNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpZm5kZWYgX19HTlVfU1RBQl9fCi0KLS8qIEluZGljYXRlIHRoZSBHTlUgc3RhYi5oIGlzIGluIHVzZS4gICovCi0KLSNkZWZpbmUgX19HTlVfU1RBQl9fCi0KLSNkZWZpbmUgX19kZWZpbmVfc3RhYihOQU1FLCBDT0RFLCBTVFJJTkcpIE5BTUU9Q09ERSwKLSNkZWZpbmUgX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUoTkFNRSwgQ09ERSwgU1RSSU5HKSBOQU1FPUNPREUsCi0KLWVudW0gX19zdGFiX2RlYnVnX2NvZGUKLXsKLSNpbmNsdWRlICJhb3V0L3N0YWIuZGVmIgotTEFTVF9VTlVTRURfU1RBQl9DT0RFCi19OwotCi0jdW5kZWYgX19kZWZpbmVfc3RhYgotCi0vKiBEZWZpbml0aW9ucyBvZiAiZGVzYyIgZmllbGQgZm9yIE5fU08gc3RhYnMgaW4gU29sYXJpczIuICAqLwotCi0jZGVmaW5lCU5fU09fQVMJCTEKLSNkZWZpbmUJTl9TT19DCQkyCi0jZGVmaW5lCU5fU09fQU5TSV9DCTMKLSNkZWZpbmUJTl9TT19DQwkJNAkvKiBDKysgKi8KLSNkZWZpbmUJTl9TT19GT1JUUkFOCTUKLSNkZWZpbmUJTl9TT19QQVNDQUwJNgotCi0vKiBTb2xhcmlzMjogRmxvYXRpbmcgcG9pbnQgdHlwZSB2YWx1ZXMgaW4gYmFzaWMgdHlwZXMuICAqLwotCi0jZGVmaW5lCU5GX05PTkUJCTAKLSNkZWZpbmUJTkZfU0lOR0xFCTEJLyogSUVFRSAzMi1iaXQgKi8KLSNkZWZpbmUJTkZfRE9VQkxFCTIJLyogSUVFRSA2NC1iaXQgKi8KLSNkZWZpbmUJTkZfQ09NUExFWAkzCS8qIEZvcnRyYW4gY29tcGxleCAqLwotI2RlZmluZQlORl9DT01QTEVYMTYJNAkvKiBGb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0jZGVmaW5lCU5GX0NPTVBMRVgzMgk1CS8qIEZvcnRyYW4gY29tcGxleCoxNiAqLwotI2RlZmluZQlORl9MRE9VQkxFCTYJLyogTG9uZyBkb3VibGUgKHdoYXRldmVyIHRoYXQgaXMpICovCi0KLSNlbmRpZiAvKiBfX0dOVV9TVEFCXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N1bjQuaCBiL2luY2x1ZGUvYW91dC9zdW40LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmEwZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3N1bjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKiBTUEFSQy1zcGVjaWZpYyB2YWx1ZXMgZm9yIGEub3V0IGZpbGVzICovCi0KLS8qIFNvbWUgc3lzdGVtcywgZS5nLiwgQUlYLCBtYXkgaGF2ZSBkZWZpbmVkIHRoaXMgaW4gaGVhZGVyIGZpbGVzIGFscmVhZHkKLSAgIGluY2x1ZGVkLiAgKi8KLSN1bmRlZiBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCQkvKiA4Sy4gIGFrYSBOQlBHIGluIDxzeXMvcGFyYW0uaD4gKi8KLS8qIE5vdGUgdGhhdCBzb21lIFNQQVJDcyBoYXZlIDRLIHBhZ2VzLCBzb21lIDhLLCBzb21lIG90aGVycy4gICovCi0KLSNkZWZpbmUgU0VHX1NJWkVfU1BBUkMJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZQlTRUdfU0laRV9TVU4zCTB4MjAwMDAJCS8qIFJlc29sdXRpb24gb2Ygci93IHByb3RlY3Rpb24gaHcgKi8KLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJVEFSR0VUX1BBR0VfU0laRQkvKiBMb2NhdGlvbiAwIGlzIG5vdCBhY2Nlc3NpYmxlICovCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMQotCi0vKiBOb24tZGVmYXVsdCBkZWZpbml0aW9ucyBvZiB0aGUgYWNjZXNzb3IgbWFjcm9zLi4uICovCi0KLS8qIFNlZ21lbnQgc2l6ZSB2YXJpZXMgb24gU3VuLTMgdmVyc3VzIFN1bi00LiAgKi8KLQotI2RlZmluZSBOX1NFR1NJWkUoeCkJKE5fTUFDSFRZUEUoeCkgPT0gTV9TUEFSQz8JU0VHX1NJWkVfU1BBUkM6CVwKLQkJCSBOX01BQ0hUWVBFKHgpID09IE1fNjgwMjA/CVNFR19TSVpFX1NVTjM6CVwKLQkJCS8qIEd1ZXNzPyAqLwkJCVRBUkdFVF9QQUdFX1NJWkUpCi0KLS8qIFZpcnR1YWwgQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgZnJvbSB0aGUgYS5vdXQgZmlsZS4gIEZvciBPTUFHSUMsCi0gICAoYWxtb3N0IGFsd2F5cyAidW5saW5rZWQgLm8ncyIgdGhlc2UgZGF5cyksIHNob3VsZCBiZSB6ZXJvLgotICAgU3VuIGFkZGVkIGEga2x1ZGdlIHNvIHRoYXQgc2hhcmVkIGxpYnJhcmllcyBsaW5rZWQgWk1BR0lDIGdldAotICAgYW4gYWRkcmVzcyBvZiB6ZXJvIGlmIGFfZW50cnkgKCEhISkgaXMgbG93ZXIgdGhhbiB0aGUgb3RoZXJ3aXNlCi0gICBleHBlY3RlZCB0ZXh0IGFkZHJlc3MuICBUaGVzZSBrbHVkZ2VzIGhhdmUgZ290dGEgZ28hCi0gICBGb3IgbGlua2VkIGZpbGVzLCBzaG91bGQgcmVmbGVjdCByZWFsaXR5IGlmIHdlIGtub3cgaXQuICAqLwotCi0vKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdmVyc2lvbiBpbiBhb3V0NjQuaCAod2hpY2ggd2Ugb3ZlcnJpZGUgYnkgZGVmaW5pbmcKLSAgIGl0IGhlcmUpIG9ubHkgZm9yIE5NQUdJQyAod2UgcmV0dXJuIFRFWFRfU1RBUlRfQUREUitFWEVDX0JZVEVTX1NJWkU7Ci0gICB0aGV5IHJldHVybiAwKS4gICovCi0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAwIFwKLSAgICAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgJiYgKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFIpPyAwIFwKLSAgICAgOiBURVhUX1NUQVJUX0FERFIrRVhFQ19CWVRFU19TSVpFKQotCi0vKiBXaGVuIGEgZmlsZSBpcyBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IG9uIFN1bk9TIDQsIHRoZQotICAgZHluYW1pYyBiaXQgaW4gdGhlIGV4ZWMgaGVhZGVyIGlzIHNldCwgYW5kIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlCi0gICBzeW1ib2wgdGFibGUgaXMgX19EWU5BTUlDLiAgSXRzIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgZm9sbG93aW5nIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMKLXsKLSAgLyogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUuICBTdW5PUyA0LjEueCBjcmVhdGVzIGZpbGVzCi0gICAgIHdpdGggdmVyc2lvbiBudW1iZXIgMywgd2hpY2ggaXMgd2hhdCB0aGlzIHN0cnVjdHVyZSBpcyBiYXNlZCBvbi4KLSAgICAgQWNjb3JkaW5nIHRvIGdkYiwgdmVyc2lvbiAyIGlzIHNpbWlsYXIuICBJIGJlbGlldmUgdGhhdCB2ZXJzaW9uIDIKLSAgICAgdXNlZCBhIGRpZmZlcmVudCB0eXBlIG9mIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgdGhlcmUgbWF5Ci0gICAgIGhhdmUgYmVlbiBvdGhlciBkaWZmZXJlbmNlcy4gICovCi0gIGJmZF9ieXRlIGxkX3ZlcnNpb25bNF07Ci0gIC8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYSAyOCBieXRlIHN0cnVjdHVyZSB1c2VkIGluIGRlYnVnZ2luZy4KLSAgICAgVGhlIGNvbnRlbnRzIGFyZSBmaWxsZWQgaW4gYXQgcnVuIHRpbWUgYnkgbGQuc28uICAqLwotICBiZmRfYnl0ZSBsZGRbNF07Ci0gIC8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYW5vdGhlciBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dAotICAgICBob3cgdG8gcmVsb2NhdGUgdGhlIGV4ZWN1dGFibGUgYXQgcnVuIHRpbWUuICAqLwotICBiZmRfYnl0ZSBsZFs0XTsKLX07Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBkZWJ1Z2dpbmcgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGRlYnVnZ2VyCi0gICBmaWVsZCBvZiBfX0RZTkFNSUMuICAqLwotI2RlZmluZSBFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSAoMjQpCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgbGlua2VyIGZpZWxkIG9mIF9fRFlOQU1JQy4gIEFzIGZhcgotICAgYXMgSSBjYW4gdGVsbCwgbW9zdCBvZiB0aGUgYWRkcmVzc2VzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBvZmZzZXRzCi0gICB3aXRoaW4gdGhlIGZpbGUsIGJ1dCBzb21lIGFyZSBhY3R1YWxseSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluawotewotICAvKiBMaW5rZWQgbGlzdCBvZiBsb2FkZWQgb2JqZWN0cy4gIFRoaXMgaXMgZmlsbGVkIGluIGF0IHJ1bnRpbWUgYnkKLSAgICAgbGQuc28gYW5kIHByb2JhYmx5IGJ5IGRsb3Blbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfbG9hZGVkOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBsaXN0IG9mIG5hbWVzIG9mIHNoYXJlZCBvYmplY3RzIHdoaWNoIG11c3QgYmUKLSAgICAgaW5jbHVkZWQgYXQgcnVudGltZS4gIEVhY2ggZW50cnkgaW4gdGhlIGxpc3QgaXMgMTYgYnl0ZXM6IHRoZSA0Ci0gICAgIGJ5dGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nIG5hbWluZyB0aGUgb2JqZWN0IChlLmcuLCBmb3IgLWxjIHRoaXMKLSAgICAgaXMgImMiKTsgNCBieXRlcyBvZiBmbGFncy0tdGhlIGhpZ2ggYml0IGlzIHdoZXRoZXIgdG8gc2VhcmNoIGZvcgotICAgICB0aGUgb2JqZWN0IHVzaW5nIHRoZSBsaWJyYXJ5IHBhdGg7IHRoZSAyIGJ5dGUgbWFqb3IgdmVyc2lvbgotICAgICBudW1iZXI7IHRoZSAyIGJ5dGUgbWlub3IgdmVyc2lvbiBudW1iZXI7IHRoZSA0IGJ5dGUgYWRkcmVzcyBvZgotICAgICB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgbGlzdCAoemVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5KS4gIFRoZQotICAgICB2ZXJzaW9uIG51bWJlcnMgc2VlbSB0byBvbmx5IGJlIG5vbi16ZXJvIHdoZW4gZG9pbmcgbGlicmFyeQotICAgICBzZWFyY2hpbmcuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX25lZWQ7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHBhdGggdG8gc2VhcmNoIGZvciB0aGUgc2hhcmVkIG9iamVjdHMgd2hpY2gKLSAgICAgbXVzdCBiZSBpbmNsdWRlZC4gIFRoaXMgcG9pbnRzIHRvIGEgc3RyaW5nIGluIFBBVEggZm9ybWF0IHdoaWNoCi0gICAgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSAtTCBhcmd1bWVudHMgdG8gdGhlIGxpbmtlci4gIEFjY29yZGluZyB0bwotICAgICB0aGUgbWFuIHBhZ2UsIGxkLnNvIGltcGxpY2l0bHkgYWRkcyAke0xEX0xJQlJBUllfUEFUSH0gdG8gdGhlCi0gICAgIGJlZ2lubmluZyBvZiB0aGlzIHN0cmluZyBhbmQgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiB0byB0aGUKLSAgICAgZW5kLiAgVGhlIHN0cmluZyBpcyB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBieXRlLiAgVGhpcyBmaWVsZCBpcwotICAgICB6ZXJvIGlmIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgcGF0aC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfcnVsZXM7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBUaGlzIGFwcGVhcnMgdG8gYmUgYQotICAgICB2aXJ0dWFsIGFkZHJlc3MsIG5vdCBhIGZpbGUgb2Zmc2V0LiAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZQotICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlIHNlZW1zIHRvIGJlIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN1bjRfZHluYW1pYyBzdHJ1Y3R1cmUgKHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBfX0RZTkFNSUMgc3ltYm9sKS4KLSAgICAgVGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgaXMgdXNlZCBmb3IgUElDIGNvZGUgdG8gaG9sZCB0aGUKLSAgICAgYWRkcmVzc2VzIG9mIHZhcmlhYmxlcy4gIEEgZHluYW1pY2FsbHkgbGlua2VkIGZpbGUgd2hpY2ggZG9lcyBub3QKLSAgICAgaXRzZWxmIGNvbnRhaW4gUElDIGNvZGUgaGFzIGEgZm91ciBieXRlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX2dvdDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBUaGlzIGFwcGVhcnMgdG8gYmUgYQotICAgICB2aXJ0dWFsIGFkZHJlc3MsIG5vdCBhIGZpbGUgb2Zmc2V0LgotCi0gICAgIE9uIGEgU1BBUkMsIHRoZSB0YWJsZSBpcyBjb21wb3NlZCBvZiAxMiBieXRlIGVudHJpZXMsIGVhY2ggb2YKLSAgICAgd2hpY2ggY29uc2lzdHMgb2YgdGhyZWUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGZpcnN0IGVudHJ5IGlzCi0gICAgICAgICBzZXRoaSAlaGkoMCksJWcxCi0JIGptcCAlZzEKLQkgbm9wCi0gICAgIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgY2hhbmdlZCBieSBsZC5zbyBpbnRvIGEganVtcCBkaXJlY3RseSBpbnRvCi0gICAgIGxkLnNvIGl0c2VsZi4gIEVhY2ggc3Vic2VxdWVudCBlbnRyeSBpcwotICAgICAgICAgc2F2ZSAlc3AsIC05NiwgJXNwCi0JIGNhbGwgPGFkZHJlc3Mgb2YgZmlyc3QgZW50cnkgaW4gcHJvY2VkdXJlIGxpbmthZ2UgdGFibGU+Ci0JIDxyZWxvY19udW1iZXIgfCAweDAxMDAwMDAwPgotICAgICBUaGUgcmVsb2NfbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgdGhlIHJlbG9jIHRvIHVzZSB0byByZXNvbHZlCi0gICAgIHRoaXMgZW50cnkuICBUaGUgcmVsb2Mgd2lsbCBiZSBhIEpNUF9TTE9UIHJlbG9jIGFnYWluc3Qgc29tZQotICAgICBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCBmaWxlIGJ1dCBzaG91bGQgYmUKLSAgICAgZGVmaW5lZCBpbiBhIHNoYXJlZCBvYmplY3QgKGlmIGl0IGlzIG5vdCwgbGQuc28gd2lsbCByZXBvcnQgYQotICAgICBydW50aW1lIGVycm9yIGFuZCBleGl0KS4gIFRoZSBjb25zdGFudCAweDAxMDAwMDAwMCB0dXJucyB0aGUKLSAgICAgcmVsb2MgbnVtYmVyIGludG8gYSBzZXRoaSBvZiAlZzAsIHdoaWNoIGRvZXMgbm90aGluZyBzaW5jZSAlZzAgaXMKLSAgICAgaGFyZHdpcmVkIHRvIHplcm8uCi0KLSAgICAgV2hlbiBvbmUgb2YgdGhlc2UgZW50cmllcyBpcyBleGVjdXRlZCwgaXQgd2luZHMgdXAgY2FsbGluZyBpbnRvCi0gICAgIGxkLnNvLiAgbGQuc28gbG9va3MgYXQgdGhlIHJlbG9jIG51bWJlciwgYXZhaWxhYmxlIHZpYSB0aGUgcmV0dXJuCi0gICAgIGFkZHJlc3MsIHRvIGRldGVybWluZSB3aGljaCBlbnRyeSB0aGlzIGlzLiAgSXQgdGhlbiBsb29rcyBhdCB0aGUKLSAgICAgcmVsb2MgYW5kIHBhdGNoZXMgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZSBpbnRvIGEgc2V0aGkgYW5kIGptcAotICAgICB0byB0aGUgcmVhbCBhZGRyZXNzIGZvbGxvd2VkIGJ5IGEgbm9wLiAgVGhpcyBtZWFucyB0aGF0IHRoZSByZWxvYwotICAgICBsb29rdXAgb25seSBoYXMgdG8gaGFwcGVuIG9uY2UsIGFuZCBpdCBhbHNvIG1lYW5zIHRoYXQgdGhlCi0gICAgIHJlbG9jYXRpb24gb25seSBuZWVkcyB0byBiZSBkb25lIGlmIHRoZSBmdW5jdGlvbiBpcyBhY3R1YWxseQotICAgICBjYWxsZWQuICBUaGUgcmVsb2NhdGlvbiBpcyBleHBlbnNpdmUgYmVjYXVzZSBsZC5zbyBtdXN0IGxvb2sgdXAKLSAgICAgdGhlIHN5bWJvbCBieSBuYW1lLgotCi0gICAgIFRoZSBzaXplIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyBnaXZlbiBieSB0aGUgbGRfcGx0X3N6Ci0gICAgIGZpZWxkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9wbHQ7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jcy4gIFRoZXNlIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMKLSAgICAgb3JkaW5hcnkgcmVsb2NzLiAgU3ltYm9sIGluZGV4IG51bWJlcnMgcmVmZXIgdG8gdGhlIHN5bWJvbHMKLSAgICAgcG9pbnRlZCB0byBieSBsZF9zdGFiLiAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotICAgICBudW1iZXIgb2YgcmVsb2NzIGlzIHRvIGFzc3VtZSB0aGF0IGFsbCB0aGUgYnl0ZXMgZnJvbSBsZF9yZWwgdG8KLSAgICAgbGRfaGFzaCBjb250YWluIHJlbG9jIGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3JlbDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIFRoZSBoYXNoIHRhYmxlIGhhcwotICAgICByb3VnaGx5IHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIHRoZXJlIGFyZSBkeW5hbWljIHN5bWJvbHM7Ci0gICAgIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgZXhhY3Qgc2l6ZSBpcyB0byBhc3N1bWUgdGhhdAotICAgICBldmVyeSBieXRlIGZyb20gbGRfaGFzaCB0byBsZF9zdGFiIGlzIGRldm90ZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgICAgRWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBpcyBlaWdodCBieXRlcy4gIFRoZSBmaXJzdCBmb3VyCi0gICAgIGJ5dGVzIGFyZSBhIHN5bWJvbCBpbmRleCBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbHMuICBUaGUgc2Vjb25kCi0gICAgIGZvdXIgYnl0ZXMgYXJlIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZQotICAgICBidWNrZXQuICBUaGUgbGRfYnVja2V0cyBmaWVsZCBnaXZlcyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMsIHNheSBCLgotICAgICBUaGUgZmlyc3QgQiBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlIGVhY2ggc3RhcnQgYSBidWNrZXQgd2hpY2gKLSAgICAgaXMgY2hhaW5lZCB0aHJvdWdoIHRoZSBzZWNvbmQgZm91ciBieXRlcyBvZiBlYWNoIGVudHJ5LiAgQSB2YWx1ZQotICAgICBvZiB6ZXJvIGVuZHMgdGhlIGNoYWluLgotCi0gICAgIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIHNpbXBseQotICAgICAgICAgaCA9IDA7Ci0gICAgICAgICB3aGlsZSAoKnN0cmluZyAhPSAnXDAnKQotCSAgIGggPSAoaCA8PCAxKSArICpzdHJpbmcrKzsKLQkgaCAmPSAweDdmZmZmZmZmOwotCi0gICAgIFRvIGxvb2sgdXAgYSBzeW1ib2wsIGNvbXB1dGUgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIG5hbWUuICBUYWtlCi0gICAgIHRoZSBtb2R1bG9zIG9mIGhhc2ggdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgYnVja2V0cy4gIFN0YXJ0IGF0Ci0gICAgIHRoYXQgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBTZWUgaWYgdGhlIHN5bWJvbCAoZnJvbSB0aGUgZmlyc3QKLSAgICAgZm91ciBieXRlcyBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyeSkgaGFzIHRoZSBuYW1lIHlvdSBhcmUgbG9va2luZwotICAgICBmb3IuICBJZiBub3QsIHVzZSB0aGUgY2hhaW4gZmllbGQgKHRoZSBzZWNvbmQgZm91ciBieXRlcyBvZiB0aGUKLSAgICAgaGFzaCB0YWJsZSBlbnRyeSkgdG8gbW92ZSBvbiB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIGJ1Y2tldC4KLSAgICAgSWYgdGhlIGNoYWluIGZpZWxkIGlzIHplcm8geW91IGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZQotICAgICBidWNrZXQsIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBpbiB0aGUgaGFzaCB0YWJsZS4gICovIAotICB1bnNpZ25lZCBsb25nIGxkX2hhc2g7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgYSBsaXN0IG9mCi0gICAgIGV4dGVybmFsX25saXN0IHN0cnVjdHVyZXMuICBUaGUgc3RyaW5nIGluZGljZXMgYXJlIHJlbGF0aXZlIHRvCi0gICAgIHRoZSBsZF9zeW1ib2xzIGZpZWxkLiAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotICAgICBudW1iZXIgb2Ygc3ltYm9scyBpcyB0byBhc3N1bWUgdGhhdCBhbGwgdGhlIGJ5dGVzIGJldHdlZW4gbGRfc3RhYgotICAgICBhbmQgbGRfc3ltYm9scyBhcmUgZXh0ZXJuYWxfbmxpc3Qgc3RydWN0dXJlcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3RhYjsKLQotICAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIEl0IHNlZW1zIHRvIGFsd2F5cyBiZSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zdGFiX2hhc2g7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9idWNrZXRzOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgVGhlIGZpcnN0IHN0cmluZyBpbiB0aGlzCi0gICAgIHN0cmluZyB0YWJsZSBuZWVkIG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zeW1ib2xzOwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zeW1iX3NpemU7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHRleHQgc2VnbWVudC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfdGV4dDsKLQotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3BsdF9zejsKLX07Ci0KLS8qIFRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsKLXsKLSAgYmZkX2J5dGUgbGRfbG9hZGVkWzRdOwotICBiZmRfYnl0ZSBsZF9uZWVkWzRdOwotICBiZmRfYnl0ZSBsZF9ydWxlc1s0XTsKLSAgYmZkX2J5dGUgbGRfZ290WzRdOwotICBiZmRfYnl0ZSBsZF9wbHRbNF07Ci0gIGJmZF9ieXRlIGxkX3JlbFs0XTsKLSAgYmZkX2J5dGUgbGRfaGFzaFs0XTsKLSAgYmZkX2J5dGUgbGRfc3RhYls0XTsKLSAgYmZkX2J5dGUgbGRfc3RhYl9oYXNoWzRdOwotICBiZmRfYnl0ZSBsZF9idWNrZXRzWzRdOwotICBiZmRfYnl0ZSBsZF9zeW1ib2xzWzRdOwotICBiZmRfYnl0ZSBsZF9zeW1iX3NpemVbNF07Ci0gIGJmZF9ieXRlIGxkX3RleHRbNF07Ci0gIGJmZF9ieXRlIGxkX3BsdF9zels0XTsKLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JmZGxpbmsuaCBiL2luY2x1ZGUvYmZkbGluay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2YxMTNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmZkbGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qIGJmZGxpbmsuaCAtLSBoZWFkZXIgZmlsZSBmb3IgQkZEIGxpbmsgcm91dGluZXMKLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQkZETElOS19ICi0jZGVmaW5lIEJGRExJTktfSAotCi0vKiBXaGljaCBzeW1ib2xzIHRvIHN0cmlwIGR1cmluZyBhIGxpbmsuICAqLwotZW51bSBiZmRfbGlua19zdHJpcAotewotICBzdHJpcF9ub25lLAkJLyogRG9uJ3Qgc3RyaXAgYW55IHN5bWJvbHMuICAqLwotICBzdHJpcF9kZWJ1Z2dlciwJLyogU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMuICAqLwotICBzdHJpcF9zb21lLAkJLyoga2VlcF9oYXNoIGlzIHRoZSBsaXN0IG9mIHN5bWJvbHMgdG8ga2VlcC4gICovCi0gIHN0cmlwX2FsbAkJLyogU3RyaXAgYWxsIHN5bWJvbHMuICAqLwotfTsKLQotLyogV2hpY2ggbG9jYWwgc3ltYm9scyB0byBkaXNjYXJkIGR1cmluZyBhIGxpbmsuICBUaGlzIGlzIGlycmVsZXZhbnQKLSAgIGlmIHN0cmlwX2FsbCBpcyB1c2VkLiAgKi8KLWVudW0gYmZkX2xpbmtfZGlzY2FyZAotewotICBkaXNjYXJkX25vbmUsCQkvKiBEb24ndCBkaXNjYXJkIGFueSBsb2NhbHMuICAqLwotICBkaXNjYXJkX2wsCQkvKiBEaXNjYXJkIGxvY2FsIHRlbXBvcmFyeSBzeW1ib2xzLiAgKi8KLSAgZGlzY2FyZF9hbGwJCS8qIERpc2NhcmQgYWxsIGxvY2Fscy4gICovCi19OwotDAotLyogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBhbiBlbnRyeSBpbiB0aGUgQkZEIGxpbmsgaGFzaAotICAgdGFibGUuICAqLwotCi1lbnVtIGJmZF9saW5rX2hhc2hfdHlwZQotewotICBiZmRfbGlua19oYXNoX25ldywJCS8qIFN5bWJvbCBpcyBuZXcuICAqLwotICBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCwJLyogU3ltYm9sIHNlZW4gYmVmb3JlLCBidXQgdW5kZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF91bmRlZndlYWssCS8qIFN5bWJvbCBpcyB3ZWFrIGFuZCB1bmRlZmluZWQuICAqLwotICBiZmRfbGlua19oYXNoX2RlZmluZWQsCS8qIFN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLAkvKiBTeW1ib2wgaXMgd2VhayBhbmQgZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfY29tbW9uLAkJLyogU3ltYm9sIGlzIGNvbW1vbi4gICovCi0gIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QsCS8qIFN5bWJvbCBpcyBhbiBpbmRpcmVjdCBsaW5rLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF93YXJuaW5nCQkvKiBMaWtlIGluZGlyZWN0LCBidXQgd2FybiBpZiByZWZlcmVuY2VkLiAgKi8KLX07Ci0KLS8qIFRoZSBsaW5raW5nIHJvdXRpbmVzIHVzZSBhIGhhc2ggdGFibGUgd2hpY2ggdXNlcyB0aGlzIHN0cnVjdHVyZSBmb3IKLSAgIGl0cyBlbGVtZW50cy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Ci17Ci0gIC8qIEJhc2UgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogVHlwZSBvZiB0aGlzIGVudHJ5LiAgKi8KLSAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgdHlwZTsKLQotICAvKiBVbmRlZmluZWQgYW5kIGNvbW1vbiBzeW1ib2xzIGFyZSBrZXB0IGluIGEgbGlua2VkIGxpc3QgdGhyb3VnaAotICAgICB0aGlzIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBub3QgaW4gdGhlIHVuaW9uIGJlY2F1c2UgdGhhdCB3b3VsZAotICAgICBmb3JjZSB1cyB0byByZW1vdmUgZW50cmllcyBmcm9tIHRoZSBsaXN0IHdoZW4gd2UgY2hhbmdlZCB0aGVpcgotICAgICB0eXBlLCB3aGljaCB3b3VsZCBmb3JjZSB0aGUgbGlzdCB0byBiZSBkb3VibHkgbGlua2VkLCB3aGljaCB3b3VsZAotICAgICB3YXN0ZSBtb3JlIG1lbW9yeS4gIFdoZW4gYW4gdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wgaXMKLSAgICAgY3JlYXRlZCwgaXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgbGlzdCwgdGhlIGhlYWQgb2Ygd2hpY2ggaXMgaW4KLSAgICAgdGhlIGxpbmsgaGFzaCB0YWJsZSBpdHNlbGYuICBBcyBzeW1ib2xzIGFyZSBkZWZpbmVkLCB0aGV5IG5lZWQKLSAgICAgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdDsgYW55dGhpbmcgd2hpY2ggcmVhZHMgdGhlIGxpc3QgbXVzdAotICAgICBkb3VibGVjaGVjayB0aGUgc3ltYm9sIHR5cGUuCi0KLSAgICAgV2VhayBzeW1ib2xzIGFyZSBub3Qga2VwdCBvbiB0aGlzIGxpc3QuCi0KLSAgICAgRGVmaW5lZCBhbmQgZGVmd2VhayBzeW1ib2xzIHVzZSB0aGlzIGZpZWxkIGFzIGEgcmVmZXJlbmNlIG1hcmtlci4KLSAgICAgSWYgdGhlIGZpZWxkIGlzIG5vdCBOVUxMLCBvciB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgdGFpbCBvZiB0aGUKLSAgICAgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LCB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQuICBJZiB0aGUKLSAgICAgc3ltYm9sIGlzIHVuZGVmaW5lZCBhbmQgYmVjb21lcyBkZWZpbmVkLCB0aGlzIGZpZWxkIHdpbGwKLSAgICAgYXV0b21hdGljYWxseSBiZSBub24tTlVMTCBzaW5jZSB0aGUgc3ltYm9sIHdpbGwgaGF2ZSBiZWVuIG9uIHRoZQotICAgICB1bmRlZmluZWQgc3ltYm9sIGxpc3QuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogQSB1bmlvbiBvZiBpbmZvcm1hdGlvbiBkZXBlbmRpbmcgdXBvbiB0aGUgdHlwZS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogTm90aGluZyBpcyBrZXB0IGZvciBiZmRfaGFzaF9uZXcuICAqLwotICAgICAgLyogYmZkX2xpbmtfaGFzaF91bmRlZmluZWQsIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZCAqYWJmZDsJCS8qIEJGRCBzeW1ib2wgd2FzIGZvdW5kIGluLiAgKi8KLQl9IHVuZGVmOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2RlZndlYWsuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgYmZkX3ZtYSB2YWx1ZTsJLyogU3ltYm9sIHZhbHVlLiAgKi8KLQkgIGFzZWN0aW9uICpzZWN0aW9uOwkvKiBTeW1ib2wgc2VjdGlvbi4gICovCi0JfSBkZWY7Ci0gICAgICAvKiBiZmRfbGlua19oYXNoX2luZGlyZWN0LCBiZmRfbGlua19oYXNoX3dhcm5pbmcuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmxpbms7CS8qIFJlYWwgc3ltYm9sLiAgKi8KLQkgIGNvbnN0IGNoYXIgKndhcm5pbmc7CS8qIFdhcm5pbmcgKGJmZF9saW5rX2hhc2hfd2FybmluZyBvbmx5KS4gICovCi0JfSBpOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9jb21tb24uICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgLyogVGhlIGxpbmtlciBuZWVkcyB0byBrbm93IHRocmVlIHRoaW5ncyBhYm91dCBjb21tb24KLSAgICAgICAgICAgICBzeW1ib2xzOiB0aGUgc2l6ZSwgdGhlIGFsaWdubWVudCwgYW5kIHRoZSBzZWN0aW9uIGluCi0gICAgICAgICAgICAgd2hpY2ggdGhlIHN5bWJvbCBzaG91bGQgYmUgcGxhY2VkLiAgV2Ugc3RvcmUgdGhlIHNpemUKLSAgICAgICAgICAgICBoZXJlLCBhbmQgd2UgYWxsb2NhdGUgYSBzbWFsbCBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIGFuZCB0aGUgYWxpZ25tZW50LiAgVGhlIGFsaWdubWVudCBpcyBzdG9yZWQgYXMgYQotICAgICAgICAgICAgIHBvd2VyIG9mIHR3by4gIFdlIGRvbid0IHN0b3JlIGFsbCB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YKLSAgICAgICAgICAgICB0aGUgdW5pb247IHRoaXMgc3RydWN0dXJlIGlzIGEgbWFqb3Igc3BhY2UgdXNlciBpbiB0aGUKLSAgICAgICAgICAgICBsaW5rZXIuICAqLwotCSAgYmZkX3NpemVfdHlwZSBzaXplOwkvKiBDb21tb24gc3ltYm9sIHNpemUuICAqLwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5Ci0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwkvKiBBbGlnbm1lbnQuICAqLwotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwkJLyogU3ltYm9sIHNlY3Rpb24uICAqLwotCSAgICB9ICpwOwotCX0gYzsKLSAgICB9IHU7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSBsaW5rIGhhc2ggdGFibGUuICBJdCBpcyBhIGRlcml2ZWQgY2xhc3Mgb2YKLSAgIGJmZF9oYXNoX3RhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotICAvKiBUaGUgYmFjayBlbmQgd2hpY2ggY3JlYXRlZCB0aGlzIGhhc2ggdGFibGUuICBUaGlzIGluZGljYXRlcyB0aGUKLSAgICAgdHlwZSBvZiB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgd2hpY2ggaXMgc29tZXRpbWVzCi0gICAgIGltcG9ydGFudCBpbmZvcm1hdGlvbiB3aGVuIGxpbmtpbmcgb2JqZWN0IGZpbGVzIG9mIGRpZmZlcmVudAotICAgICB0eXBlcyB0b2dldGhlci4gICovCi0gIGNvbnN0IGJmZF90YXJnZXQgKmNyZWF0b3I7Ci0gIC8qIEEgbGlua2VkIGxpc3Qgb2YgdW5kZWZpbmVkIGFuZCBjb21tb24gc3ltYm9scywgbGlua2VkIHRocm91Z2ggdGhlCi0gICAgIG5leHQgZmllbGQgaW4gdGhlIGJmZF9saW5rX2hhc2hfZW50cnkgc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmczsKLSAgLyogRW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIHRhaWwgb2YgdGhlIHVuZGVmcyBsaXN0LiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmc190YWlsOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIGxpbmsgaGFzaCB0YWJsZS4gIElmIEZPTExPVyBpcyB0cnVlLCB0aGlzCi0gICBmb2xsb3dzIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QgYW5kIGJmZF9saW5rX2hhc2hfd2FybmluZyBsaW5rcyB0bwotICAgdGhlIHJlYWwgc3ltYm9sLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmZkX2xpbmtfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGNyZWF0ZSwKLQkgICBib29sZWFuIGNvcHksIGJvb2xlYW4gZm9sbG93KSk7Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gdGhlIG1haW4gbGlua2VyIGhhc2ggdGFibGUgaWYgdGhlIHN5bWJvbCBtaWdodAotICAgYmUgd3JhcHBlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcmVmZXJlbmNlcyB0byBhbgotICAgdW5kZWZpbmVkIHN5bWJvbCwgbm90IGZvciBkZWZpbml0aW9ucyBvZiBhIHN5bWJvbC4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLQotLyogVHJhdmVyc2UgYSBsaW5rIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLAotCSAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpLAotCSAgIFBUUikpOwotCi0vKiBBZGQgYW4gZW50cnkgdG8gdGhlIHVuZGVmcyBsaXN0LiAgKi8KLWV4dGVybiB2b2lkIGJmZF9saW5rX2FkZF91bmRlZgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0MCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb21tdW5pY2F0ZQotICAgYmV0d2VlbiBCRkQgYW5kIHRoZSBsaW5rZXIgd2hlbiBkb2luZyBhIGxpbmsuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaW5mbwotewotICAvKiBGdW5jdGlvbiBjYWxsYmFja3MuICAqLwotICBjb25zdCBzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzICpjYWxsYmFja3M7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZS4gICovCi0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSAidGFzayBsaW5rZWQiIG9iamVjdCBmaWxlLAotICAgICBzaW1pbGFyIHRvIHJlbG9jYXRhYmxlIGJ1dCBhbHNvIHdpdGggZ2xvYmFscyBjb252ZXJ0ZWQgdG8gc3RhdGljcy4gKi8KLSAgYm9vbGVhbiB0YXNrX2xpbms7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBhIHNoYXJlZCBvYmplY3QuICAqLwotICBib29sZWFuIHNoYXJlZDsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIHByZS1iaW5kIHN5bWJvbHMgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBzeW1ib2xpYzsKLSAgLyogdHJ1ZSBpZiBzaGFyZWQgb2JqZWN0cyBzaG91bGQgYmUgbGlua2VkIGRpcmVjdGx5LCBub3Qgc2hhcmVkLiAgKi8KLSAgYm9vbGVhbiBzdGF0aWNfbGluazsKLSAgLyogdHJ1ZSBpZiB0aGUgb3V0cHV0IGZpbGUgc2hvdWxkIGJlIGluIGEgdHJhZGl0aW9uYWwgZm9ybWF0LiAgVGhpcwotICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBzZXR0aW5nIG9mIHRoZSBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGZsYWcKLSAgICAgb24gdGhlIG91dHB1dCBmaWxlLCBidXQgbWF5IGJlIGNoZWNrZWQgd2hlbiByZWFkaW5nIHRoZSBpbnB1dAotICAgICBmaWxlcy4gICovCi0gIGJvb2xlYW4gdHJhZGl0aW9uYWxfZm9ybWF0OwotICAvKiB0cnVlIGlmIHdlIHdhbnQgdG8gcHJvZHVjZWQgb3B0aW1pemVkIG91dHB1dCBmaWxlcy4gIFRoaXMgbWlnaHQKLSAgICAgbmVlZCBtdWNoIG1vcmUgdGltZSBhbmQgdGhlcmVmb3JlIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZC4gICovCi0gIGJvb2xlYW4gb3B0aW1pemU7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMgZm9yIHVuZGVmaW5lZCBzeW1ib2xzCi0gICAgIGV2ZW4gaWYgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuICAqLwotICBib29sZWFuIG5vX3VuZGVmaW5lZDsKLSAgLyogV2hpY2ggc3ltYm9scyB0byBzdHJpcC4gICovCi0gIGVudW0gYmZkX2xpbmtfc3RyaXAgc3RyaXA7Ci0gIC8qIFdoaWNoIGxvY2FsIHN5bWJvbHMgdG8gZGlzY2FyZC4gICovCi0gIGVudW0gYmZkX2xpbmtfZGlzY2FyZCBkaXNjYXJkOwotICAvKiB0cnVlIGlmIHN5bWJvbHMgc2hvdWxkIGJlIHJldGFpbmVkIGluIG1lbW9yeSwgZmFsc2UgaWYgdGhleQotICAgICBzaG91bGQgYmUgZnJlZWQgYW5kIHJlcmVhZC4gICovCi0gIGJvb2xlYW4ga2VlcF9tZW1vcnk7Ci0gIC8qIFRoZSBsaXN0IG9mIGlucHV0IEJGRCdzIGludm9sdmVkIGluIHRoZSBsaW5rLiAgVGhlc2UgYXJlIGNoYWluZWQKLSAgICAgdG9nZXRoZXIgdmlhIHRoZSBsaW5rX25leHQgZmllbGQuICAqLwotICBiZmQgKmlucHV0X2JmZHM7Ci0gIC8qIElmIGEgc3ltYm9sIHNob3VsZCBiZSBjcmVhdGVkIGZvciBlYWNoIGlucHV0IEJGRCwgdGhpcyBpcyBzZWN0aW9uCi0gICAgIHdoZXJlIHRob3NlIHN5bWJvbHMgc2hvdWxkIGJlIHBsYWNlZC4gIEl0IG11c3QgYmUgYSBzZWN0aW9uIGluCi0gICAgIHRoZSBvdXRwdXQgQkZELiAgSXQgbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2Ugbm8gc3VjaCBzeW1ib2xzCi0gICAgIHdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgaXMgdG8gc3VwcG9ydCBDUkVBVEVfT0JKRUNUX1NZTUJPTFMgaW4gdGhlCi0gICAgIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLiAgKi8KLSAgYXNlY3Rpb24gKmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uOwotICAvKiBIYXNoIHRhYmxlIGhhbmRsZWQgYnkgQkZELiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmhhc2g7Ci0gIC8qIEhhc2ggdGFibGUgb2Ygc3ltYm9scyB0byBrZWVwLiAgVGhpcyBpcyBOVUxMIHVubGVzcyBzdHJpcCBpcwotICAgICBzdHJpcF9zb21lLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICprZWVwX2hhc2g7Ci0gIC8qIHRydWUgaWYgZXZlcnkgc3ltYm9sIHNob3VsZCBiZSByZXBvcnRlZCBiYWNrIHZpYSB0aGUgbm90aWNlCi0gICAgIGNhbGxiYWNrLiAgKi8KLSAgYm9vbGVhbiBub3RpY2VfYWxsOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8gcmVwb3J0IGJhY2sgdmlhIHRoZSBub3RpY2UgY2FsbGJhY2suICBJZgotICAgICB0aGlzIGlzIE5VTEwsIGFuZCBub3RpY2VfYWxsIGlzIGZhbHNlLCB0aGVuIG5vIHN5bWJvbHMgYXJlCi0gICAgIHJlcG9ydGVkIGJhY2suICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKm5vdGljZV9oYXNoOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgd2hpY2ggYXJlIGJlaW5nIHdyYXBwZWQgKHRoZSAtLXdyYXAgbGlua2VyCi0gICAgIG9wdGlvbikuICBJZiB0aGlzIGlzIE5VTEwsIG5vIHN5bWJvbHMgYXJlIGJlaW5nIHdyYXBwZWQuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKndyYXBfaGFzaDsKLSAgLyogSWYgYSBiYXNlIG91dHB1dCBmaWxlIGlzIHdhbnRlZCwgdGhlbiB0aGlzIHBvaW50cyB0byBpdCAqLwotICBQVFIgYmFzZV9maWxlOwotCi0gIC8qIElmIG5vbi16ZXJvLCBzcGVjaWZpZXMgdGhhdCBicmFuY2hlcyB3aGljaCBhcmUgcHJvYmxlbWF0aWMgZm9yIHRoZQotICBNUEM4NjAgQzAgKG9yIGVhcmxpZXIpIHNob3VsZCBiZSBjaGVja2VkIGZvciBhbmQgbW9kaWZpZWQuICBJdCBnaXZlcyB0aGUKLSAgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHRleHQgcGFnZS4gKi8KLSAgaW50IG1wYzg2MGMwOwotCi0gIC8qIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcwotICAgICBsb2FkZWQuICAqLwotICBjb25zdCBjaGFyICppbml0X2Z1bmN0aW9uOwotICAvKiBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QgaXMKLSAgICAgdW5sb2FkZWQuICAqLwotICBjb25zdCBjaGFyICpmaW5pX2Z1bmN0aW9uOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmVzIGhvbGRzIGEgc2V0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucy4gIFRoZXNlIGFyZQotICAgY2FsbGVkIGJ5IHRoZSBCRkQgbGlua2VyIHJvdXRpbmVzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGVhY2gKLSAgIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHRoZSBiZmRfbGlua19pbmZvIHN0cnVjdHVyZSBiZWluZyB1c2VkLiAgRWFjaAotICAgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwKLSAgIHRoZW4gdGhlIEJGRCBmdW5jdGlvbiB3aGljaCBjYWxsZWQgaXQgd2lsbCByZXR1cm4gd2l0aCBhIGZhaWx1cmUKLSAgIGluZGljYXRpb24uICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzCi17Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIGFkZGVkIGZyb20gYW4KLSAgICAgYXJjaGl2ZS4gIEFCRkQgaXMgdGhlIGFyY2hpdmUgZWxlbWVudCBiZWluZyBhZGRlZC4gIE5BTUUgaXMgdGhlCi0gICAgIG5hbWUgb2YgdGhlIHN5bWJvbCB3aGljaCBjYXVzZWQgdGhlIGFyY2hpdmUgZWxlbWVudCB0byBiZSBwdWxsZWQKLSAgICAgaW4uICAqLwotICBib29sZWFuICgqYWRkX2FyY2hpdmVfZWxlbWVudCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBiZmQgKmFiZmQsCi0JCQkJCSAgY29uc3QgY2hhciAqbmFtZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGlzIGZvdW5kIHdpdGggbXVsdGlwbGUKLSAgICAgZGVmaW5pdGlvbnMuICBOQU1FIGlzIHRoZSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcy4KLSAgICAgT0JGRCBpcyB0aGUgb2xkIEJGRCwgT1NFQyBpcyB0aGUgb2xkIHNlY3Rpb24sIE9WQUwgaXMgdGhlIG9sZAotICAgICB2YWx1ZSwgTkJGRCBpcyB0aGUgbmV3IEJGRCwgTlNFQyBpcyB0aGUgbmV3IHNlY3Rpb24sIGFuZCBOVkFMIGlzCi0gICAgIHRoZSBuZXcgdmFsdWUuICBPQkZEIG1heSBiZSBOVUxMLiAgT1NFQyBhbmQgTlNFQyBtYXkgYmUKLSAgICAgYmZkX2NvbV9zZWN0aW9uIG9yIGJmZF9pbmRfc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gKCptdWx0aXBsZV9kZWZpbml0aW9uKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgYmZkICpvYmZkLAotCQkJCQkgIGFzZWN0aW9uICpvc2VjLAotCQkJCQkgIGJmZF92bWEgb3ZhbCwKLQkJCQkJICBiZmQgKm5iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKm5zZWMsCi0JCQkJCSAgYmZkX3ZtYSBudmFsKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBjb21tb24gc3ltYm9sIGlzIGRlZmluZWQKLSAgICAgbXVsdGlwbGUgdGltZXMuICBOQU1FIGlzIHRoZSBzeW1ib2wgYXBwZWFyaW5nIG11bHRpcGxlIHRpbWVzLgotICAgICBPQkZEIGlzIHRoZSBCRkQgb2YgdGhlIGV4aXN0aW5nIHN5bWJvbDsgaXQgbWF5IGJlIE5VTEwgaWYgdGhpcyBpcwotICAgICBub3Qga25vd24uICBPVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgZXhpc3Rpbmcgc3ltYm9sLCB3aGljaCBtYXkKLSAgICAgYmUgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2RlZndlYWssCi0gICAgIGJmZF9saW5rX2hhc2hfY29tbW9uLCBvciBiZmRfbGlua19oYXNoX2luZGlyZWN0LiAgSWYgT1RZUEUgaXMKLSAgICAgYmZkX2xpbmtfaGFzaF9jb21tb24sIE9TSVpFIGlzIHRoZSBzaXplIG9mIHRoZSBleGlzdGluZyBzeW1ib2wuCi0gICAgIE5CRkQgaXMgdGhlIEJGRCBvZiB0aGUgbmV3IHN5bWJvbC4gIE5UWVBFIGlzIHRoZSB0eXBlIG9mIHRoZSBuZXcKLSAgICAgc3ltYm9sLCBvbmUgb2YgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgb3IKLSAgICAgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4gIElmIE5UWVBFIGlzIGJmZF9saW5rX2hhc2hfY29tbW9uLCBOU0laRQotICAgICBpcyB0aGUgc2l6ZSBvZiB0aGUgbmV3IHN5bWJvbC4gICovCi0gIGJvb2xlYW4gKCptdWx0aXBsZV9jb21tb24pIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgICBiZmQgKm9iZmQsCi0JCQkJICAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb3R5cGUsCi0JCQkJICAgICAgYmZkX3ZtYSBvc2l6ZSwKLQkJCQkgICAgICBiZmQgKm5iZmQsCi0JCQkJICAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgbnR5cGUsCi0JCQkJICAgICAgYmZkX3ZtYSBuc2l6ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB0byBhZGQgYSBzeW1ib2wgdG8gYSBzZXQuICBFTlRSWSBpcwotICAgICB0aGUgbGluayBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgc2V0IGl0c2VsZiAoZS5nLiwKLSAgICAgX19DVE9SX0xJU1RfXykuICBSRUxPQyBpcyB0aGUgcmVsb2NhdGlvbiB0byB1c2UgZm9yIGFuIGVudHJ5IGluCi0gICAgIHRoZSBzZXQgd2hlbiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIGZpbGUsIGFuZCBpcyBhbHNvIHVzZWQgdG8KLSAgICAgZ2V0IHRoZSBzaXplIG9mIHRoZSBlbnRyeSB3aGVuIGdlbmVyYXRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlLgotICAgICBBQkZELCBTRUMgYW5kIFZBTFVFIGlkZW50aWZ5IHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNldC4gICovCi0gIGJvb2xlYW4gKCphZGRfdG9fc2V0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqZW50cnksCi0JCQkJIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYywKLQkJCQkgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBiZmRfdm1hIHZhbHVlKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIG5hbWUgb2YgYSBnKysgY29uc3RydWN0b3Igb3IKLSAgICAgZGVzdHJ1Y3RvciBpcyBmb3VuZC4gIFRoaXMgaXMgb25seSBjYWxsZWQgYnkgc29tZSBvYmplY3QgZmlsZQotICAgICBmb3JtYXRzLiAgQ09OU1RSVUNUT1IgaXMgdHJ1ZSBmb3IgYSBjb25zdHJ1Y3RvciwgZmFsc2UgZm9yIGEKLSAgICAgZGVzdHJ1Y3Rvci4gIFRoaXMgd2lsbCB1c2UgQkZEX1JFTE9DX0NUT1Igd2hlbiBnZW5lcmF0aW5nIGEKLSAgICAgcmVsb2NhdGVhYmxlIGZpbGUuICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgZm91bmQuICBBQkZELAotICAgICBTRUNUSU9OIGFuZCBWQUxVRSBhcmUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotICBib29sZWFuICgqY29uc3RydWN0b3IpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICBib29sZWFuIGNvbnN0cnVjdG9yLAotCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLAotCQkJCSAgYmZkX3ZtYSB2YWx1ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB0byBpc3N1ZSBhIGxpbmtlciB3YXJuaW5nLiAgRm9yCi0gICAgIGV4YW1wbGUsIHRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gYSB3YXJuaW5nCi0gICAgIHN5bWJvbC4gIFdBUk5JTkcgaXMgdGhlIHdhcm5pbmcgdG8gYmUgaXNzdWVkLiAgU1lNQk9MIGlzIHRoZSBuYW1lCi0gICAgIG9mIHRoZSBzeW1ib2wgd2hpY2ggdHJpZ2dlcmVkIHRoZSB3YXJuaW5nOyBpdCBtYXkgYmUgTlVMTCBpZgotICAgICB0aGVyZSBpcyBub25lLiAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24KLSAgICAgd2hpY2ggdHJpZ2VycmVkIHRoZSB3YXJuaW5nOyBlaXRoZXIgQUJGRCBvciBTRUNUSU9OIG9yIGJvdGggbWF5Ci0gICAgIGJlIE5VTEwgaWYgdGhlIGxvY2F0aW9uIGlzIG5vdCBrbm93bi4gICovCi0gIGJvb2xlYW4gKCp3YXJuaW5nKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJICAgICAgY29uc3QgY2hhciAqd2FybmluZywgY29uc3QgY2hhciAqc3ltYm9sLAotCQkJICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCSAgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2NhdGlvbiBpcyBhdHRlbXB0ZWQgYWdhaW5zdAotICAgICBhbiB1bmRlZmluZWQgc3ltYm9sLiAgTkFNRSBpcyB0aGUgc3ltYm9sIHdoaWNoIGlzIHVuZGVmaW5lZC4KLSAgICAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUKLSAgICAgcmVmZXJlbmNlIGlzIG1hZGUuICBJbiBzb21lIGNhc2VzIFNFQ1RJT04gbWF5IGJlIE5VTEwuICAqLwotICBib29sZWFuICgqdW5kZWZpbmVkX3N5bWJvbCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgYmZkICphYmZkLAotCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBvdmVyZmxvdyBvY2N1cnMuICBOQU1FIGlzCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiB0aGUgcmVsb2MgaXMgYWdhaW5zdCwKLSAgICAgUkVMT0NfTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiwgYW5kIEFEREVORCBpcyBhbnkKLSAgICAgYWRkZW5kIHRoYXQgaXMgdXNlZC4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlCi0gICAgIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBvdmVyZmxvdyBvY2N1cnM7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnJlbG9jX292ZXJmbG93KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnJlbG9jX25hbWUsIGJmZF92bWEgYWRkZW5kLAotCQkJCSAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgZGFuZ2Vyb3VzIHJlbG9jIGlzIHBlcmZvcm1lZC4KLSAgICAgVGhlIGNhbm9uaWNhbCBleGFtcGxlIGlzIGFuIGEyOWsgSUhDT05TVCByZWxvYyB3aGljaCBkb2VzIG5vdAotICAgICBmb2xsb3cgYW4gSUhJSEFMRiByZWxvYy4gIE1FU1NBR0UgaXMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KLSAgICAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlCi0gICAgIHByb2JsZW0gb2NjdXJyZWQ7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnJlbG9jX2Rhbmdlcm91cykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICBjb25zdCBjaGFyICptZXNzYWdlLAotCQkJCSAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJICAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBpcyBmb3VuZCB0byBiZSBhdHRhY2hlZAotICAgICB0byBhIHN5bWJvbCB3aGljaCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICBOQU1FIGlzIHRoZSBuYW1lIG9mCi0gICAgIHRoZSBzeW1ib2wuICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBvZgotICAgICB0aGUgcmVsb2M7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnVuYXR0YWNoZWRfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJICAgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGluIG5vdGljZV9oYXNoIGlzCi0gICAgIGRlZmluZWQgb3IgcmVmZXJlbmNlZC4gIE5BTUUgaXMgdGhlIHN5bWJvbC4gIEFCRkQsIFNFQ1RJT04gYW5kCi0gICAgIEFERFJFU1MgYXJlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSWYgU0VDVElPTiBpcwotICAgICBiZmRfdW5kX3NlY3Rpb24sIHRoaXMgaXMgYSByZWZlcmVuY2UuICAqLwotICBib29sZWFuICgqbm90aWNlKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBiZmRfdm1hIGFkZHJlc3MpKTsKLX07Ci0MCi0vKiBUaGUgbGlua2VyIGJ1aWxkcyBsaW5rX29yZGVyIHN0cnVjdHVyZXMgd2hpY2ggdGVsbCB0aGUgY29kZSBob3cgdG8KLSAgIGluY2x1ZGUgaW5wdXQgZGF0YSBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0vKiBUaGVzZSBhcmUgdGhlIHR5cGVzIG9mIGxpbmtfb3JkZXIgc3RydWN0dXJlcy4gICovCi0KLWVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZQotewotICBiZmRfdW5kZWZpbmVkX2xpbmtfb3JkZXIsCS8qIFVuZGVmaW5lZC4gICovCi0gIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyLAkvKiBCdWlsdCBmcm9tIGEgc2VjdGlvbi4gICovCi0gIGJmZF9maWxsX2xpbmtfb3JkZXIsCQkvKiBGaWxsIHdpdGggYSAxNiBiaXQgY29uc3RhbnQuICAqLwotICBiZmRfZGF0YV9saW5rX29yZGVyLAkJLyogU2V0IHRvIGV4cGxpY2l0IGRhdGEuICAqLwotICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyLAkvKiBSZWxvY2F0ZSBhZ2FpbnN0IGEgc2VjdGlvbi4gICovCi0gIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcgkvKiBSZWxvY2F0ZSBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlIGl0c2VsZi4gIFRoZXNlIGZvcm0gYSBjaGFpbgotICAgYXR0YWNoZWQgdG8gdGhlIHNlY3Rpb24gd2hvc2UgY29udGVudHMgdGhleSBhcmUgZGVzY3JpYmluZy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19vcmRlciAKLXsKLSAgLyogTmV4dCBsaW5rX29yZGVyIGluIGNoYWluLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpuZXh0OwotICAvKiBUeXBlIG9mIGxpbmtfb3JkZXIuICAqLwotICBlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUgdHlwZTsKLSAgLyogT2Zmc2V0IHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgb2Zmc2V0OyAgCi0gIC8qIFNpemUgd2l0aGluIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBUeXBlIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5pb24gCi0gICAgewotICAgICAgc3RydWN0IAotCXsKLQkgIC8qIFNlY3Rpb24gdG8gaW5jbHVkZS4gIElmIHRoaXMgaXMgdXNlZCwgdGhlbgotCSAgICAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gbXVzdCBiZSB0aGUgc2VjdGlvbiB0aGUKLQkgICAgIGxpbmtfb3JkZXIgaXMgYXR0YWNoZWQgdG8sIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQgbXVzdAotCSAgICAgZXF1YWwgdGhlIGxpbmtfb3JkZXIgb2Zmc2V0IGZpZWxkLCBhbmQgc2VjdGlvbi0+X3Jhd19zaXplCi0JICAgICBtdXN0IGVxdWFsIHRoZSBsaW5rX29yZGVyIHNpemUgZmllbGQuICBNYXliZSB0aGVzZQotCSAgICAgcmVzdHJpY3Rpb25zIHNob3VsZCBiZSByZWxheGVkIHNvbWVkYXkuICAqLwotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0JfSBpbmRpcmVjdDsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIFZhbHVlIHRvIGZpbGwgd2l0aC4gICovCi0JICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0JfSBmaWxsOwotICAgICAgc3RydWN0Ci0JewotCSAgLyogRGF0YSB0byBwdXQgaW50byBmaWxlLiAgVGhlIHNpemUgZmllbGQgZ2l2ZXMgdGhlIG51bWJlcgotCSAgICAgb2YgYnl0ZXMgd2hpY2ggdGhpcyBmaWVsZCBwb2ludHMgdG8uICAqLwotCSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCX0gZGF0YTsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIERlc2NyaXB0aW9uIG9mIHJlbG9jIHRvIGdlbmVyYXRlLiAgVXNlZCBmb3IKLQkgICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgYW5kCi0JICAgICBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIuICAqLwotCSAgc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jICpwOwotCX0gcmVsb2M7Ci0gICAgfSB1OwotfTsKLQotLyogQSBsaW5rZXIgb3JkZXIgb2YgdHlwZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yCi0gICBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIgbWVhbnMgdG8gY3JlYXRlIGEgcmVsb2MgYWdhaW5zdCBhCi0gICBzZWN0aW9uIG9yIHN5bWJvbCwgcmVzcGVjdGl2ZWx5LiAgVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCAtVXIgdG8KLSAgIGdlbmVyYXRlIHJlbG9jcyBmb3IgdGhlIGNvbnN0cnVjdG9yIHRhYmxlcy4gIFRoZQotICAgYmZkX2xpbmtfb3JkZXJfcmVsb2Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcmVsb2MgdGhhdCBCRkQgc2hvdWxkCi0gICBjcmVhdGUuICBJdCBpcyBzaW1pbGFyIHRvIGEgYXJlbGVudCwgYnV0IEkgZGlkbid0IHVzZSBhcmVsZW50Ci0gICBiZWNhdXNlIHRoZSBsaW5rZXIgZG9lcyBub3Qga25vdyBhbnl0aGluZyBhYm91dCBtb3N0IHN5bWJvbHMsIGFuZAotICAgYW55IGFzeW1ib2wgc3RydWN0dXJlIGl0IGNyZWF0ZXMgd2lsbCBiZSBwYXJ0aWFsbHkgbWVhbmluZ2xlc3MuCi0gICBUaGlzIGluZm9ybWF0aW9uIGNvdWxkIGxvZ2ljYWxseSBiZSBpbiB0aGUgYmZkX2xpbmtfb3JkZXIgc3RydWN0LAotICAgYnV0IEkgZGlkbid0IHdhbnQgdG8gd2FzdGUgdGhlIHNwYWNlIHNpbmNlIHRoZXNlIHR5cGVzIG9mIHJlbG9jcwotICAgYXJlIHJlbGF0aXZlbHkgcmFyZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYwotewotICAvKiBSZWxvYyB0eXBlLiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogRm9yIHR5cGUgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciwgdGhpcyBpcyB0aGUgc2VjdGlvbgotCSB0aGUgcmVsb2Mgc2hvdWxkIGJlIGFnYWluc3QuICBUaGlzIG11c3QgYmUgYSBzZWN0aW9uIGluIHRoZQotCSBvdXRwdXQgQkZELCBub3QgYW55IG9mIHRoZSBpbnB1dCBCRkRzLiAgKi8KLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgLyogRm9yIHR5cGUgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZQotCSBzeW1ib2wgdGhlIHJlbG9jIHNob3VsZCBiZSBhZ2FpbnN0LiAgKi8KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgfSB1OwotCi0gIC8qIEFkZGVuZCB0byB1c2UuICBUaGUgb2JqZWN0IGZpbGUgc2hvdWxkIGNvbnRhaW4gemVyby4gIFRoZSBCRkQKLSAgICAgYmFja2VuZCBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdAotICAgICBmaWxlIGNvcnJlY3RseS4gIEZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgKGUuZy4sIENPRkYpIHRoZQotICAgICBhZGRlbmQgbXVzdCBiZSBzdG9yZWQgaW50byBpbiB0aGUgb2JqZWN0IGZpbGUsIGFuZCBmb3Igc29tZQotICAgICAoZS5nLiwgU1BBUkMgYS5vdXQpIGl0IGlzIGtlcHQgaW4gdGhlIHJlbG9jLiAgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBBbGxvY2F0ZSBhIG5ldyBsaW5rX29yZGVyIGZvciBhIHNlY3Rpb24uICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19vcmRlciAqYmZkX25ld19saW5rX29yZGVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gZGVzY3JpYmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlCi0gICBFTEYgbGlua2VyLiAgVGhlc2Ugc3RydWN0dXJlcyBjb3VsZCBiZSBtYW5pcHVsYXRlZCBlbnRpcmVseSBpbnNpZGUKLSAgIEJGRCwgYnV0IGl0IHdvdWxkIGJlIGEgcGFpbi4gIEluc3RlYWQsIHRoZSByZWd1bGFyIGxpbmtlciBzZXRzIHVwCi0gICB0aGVzZSBzdHJ1Y3R1cmVzLCBhbmQgdGhlbiBwYXNzZXMgdGhlbSBpbnRvIEJGRC4gICovCi0KLS8qIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGEgdmVyc2lvbi4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwcgotewotICAvKiBOZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpuZXh0OwotICAvKiBSZWd1bGFyIGV4cHJlc3Npb24uICAqLwotICBjb25zdCBjaGFyICpwYXR0ZXJuOwotICAvKiBNYXRjaGluZyBmdW5jdGlvbi4gICovCi0gIGludCAoKm1hdGNoKSBQQVJBTVMoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqLCBjb25zdCBjaGFyICopKTsKLX07Ci0KLS8qIFZlcnNpb24gZGVwZW5kZW5jaWVzLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzCi17Ci0gIC8qIE5leHQgZGVwZW5kZW5jeSBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpuZXh0OwotICAvKiBUaGUgdmVyc2lvbiB3aGljaCB0aGlzIHZlcnNpb24gZGVwZW5kcyB1cG9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJzaW9uX25lZWRlZDsKLX07Ci0KLS8qIEEgbm9kZSBpbiB0aGUgdmVyc2lvbiB0cmVlLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlCi17Ci0gIC8qIE5leHQgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqbmV4dDsKLSAgLyogTmFtZSBvZiB0aGlzIHZlcnNpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBWZXJzaW9uIG51bWJlci4gICovCi0gIHVuc2lnbmVkIGludCB2ZXJudW07Ci0gIC8qIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGdsb2JhbCBzeW1ib2xzIGluIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZ2xvYmFsczsKLSAgLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgbG9jYWwgc3ltYm9scyBpbiB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmxvY2FsczsKLSAgLyogTGlzdCBvZiB2ZXJzaW9ucyB3aGljaCB0aGlzIHZlcnNpb24gZGVwZW5kcyB1cG9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZXBzOwotICAvKiBJbmRleCBvZiB0aGUgdmVyc2lvbiBuYW1lLiAgVGhpcyBpcyB1c2VkIHdpdGhpbiBCRkQuICAqLwotICB1bnNpZ25lZCBpbnQgbmFtZV9pbmR4OwotICAvKiBXaGV0aGVyIHRoaXMgdmVyc2lvbiB0cmVlIHdhcyB1c2VkLiAgVGhpcyBpcyB1c2VkIHdpdGhpbiBCRkQuICAqLwotICBpbnQgdXNlZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib3V0LmggYi9pbmNsdWRlL2JvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjMjhjYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAnYS5vdXQuaCcuICBJdCBpcyB0byBiZSB1c2VkIGluIGFsbAotICogR05VIHRvb2xzIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIGk4MDk2MCAob3IgdG9vbHMgdGhhdCBvcGVyYXRlIG9uCi0gKiBvYmplY3QgZmlsZXMgY3JlYXRlZCBieSBzdWNoIHRvb2xzKS4KLSAqCi0gKiBBbGwgaTgwOTYwIGRldmVsb3BtZW50IGlzIGRvbmUgaW4gYSBDUk9TUy1ERVZFTE9QTUVOVCBlbnZpcm9ubWVudC4gIEkuZS4sCi0gKiBvYmplY3QgY29kZSBpcyBnZW5lcmF0ZWQgb24sIGFuZCBleGVjdXRlZCB1bmRlciB0aGUgZGlyZWN0aW9uIG9mIGEgc3ltYm9saWMKLSAqIGRlYnVnZ2VyIHJ1bm5pbmcgb24sIGEgaG9zdCBzeXN0ZW0uICBXZSBkbyBub3Qgd2FudCB0byBiZSBzdWJqZWN0IHRvIHRoZQotICogdmFnYXJpZXMgb2Ygd2hpY2ggaG9zdCBpdCBpcyBvciB3aGV0aGVyIGl0IHN1cHBvcnRzIENPRkYgb3IgYS5vdXQgZm9ybWF0LAotICogb3IgYW55dGhpbmcgZWxzZS4gIFdlIERPIHdhbnQgdG86Ci0gKgotICoJbyBhbHdheXMgZ2VuZXJhdGUgdGhlIHNhbWUgZm9ybWF0IG9iamVjdCBmaWxlcywgcmVnYXJkbGVzcyBvZiBob3N0LgotICoKLSAqCW8gaGF2ZSBhbiAnYS5vdXQnIGhlYWRlciB0aGF0IHdlIGNhbiBtb2RpZnkgZm9yIG91ciBvd24gcHVycG9zZXMKLSAqCSAgKHRoZSA4MDk2MCBpcyB0eXBpY2FsbHkgYW4gZW1iZWRkZWQgcHJvY2Vzc29yIGFuZCBtYXkgcmVxdWlyZQotICoJICBlbmhhbmNlZCBsaW5rZXIgc3VwcG9ydCB0aGF0IHRoZSBub3JtYWwgYS5vdXQuaCBoZWFkZXIgY2FuJ3QKLSAqCSAgYWNjb21tb2RhdGUpLgotICoKLSAqIEFzIGZvciBieXRlLW9yZGVyaW5nLCB0aGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgotICoKLSAqCW8gVGV4dCBhbmQgZGF0YSB0aGF0IGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCBpcyBhbHdheXMKLSAqCSAgaW4gaTgwOTYwIChsaXR0bGUtZW5kaWFuKSBvcmRlci4KLSAqCi0gKglvIEFsbCBvdGhlciBudW1iZXJzIChpbiB0aGUgaGVhZGVyLCBzeW1ib2xzLCByZWxvY2F0aW9uIGRpcmVjdGl2ZXMpCi0gKgkgIGFyZSBpbiBob3N0IGJ5dGUtb3JkZXI6ICBvYmplY3QgZmlsZXMgQ0FOTk9UIGJlIGxpZnRlZCBmcm9tIGEKLSAqCSAgbGl0dGxlLWVuZCBob3N0IGFuZCB1c2VkIG9uIGEgYmlnLWVuZGlhbiAob3IgdmljZSB2ZXJzYSkgd2l0aG91dAotICoJICBtb2RpZmljYXRpb24uCi0gKiA9PT4gVEhJUyBJUyBOTyBMT05HRVIgVFJVRSBVU0lORyBCRkQuICBXRSBDQU4gR0VORVJBVEUgQU5ZIEJZVEUgT1JERVIKLSAqICAgICBGT1IgVEhFIEhFQURFUiwgQU5EIFJFQUQgQU5ZIEJZVEUgT1JERVIuICBQUkVGRVJFTkNFIFdPVUxEIEJFIFRPCi0gKiAgICAgVVNFIExJVFRMRS1FTkRJQU4gQllURSBPUkRFUiBUSFJPVUdIT1VULCBSRUdBUkRMRVNTIE9GIEhPU1QuICA8PT0KLSAqCi0gKglvIFRoZSBkb3dubG9hZGVyICgnY29tbTk2MCcpIHRha2VzIGNhcmUgdG8gZ2VuZXJhdGUgYSBwc2V1ZG8taGVhZGVyCi0gKgkgIHdpdGggY29ycmVjdCAoaTgwOTYwKSBieXRlLW9yZGVyaW5nIGJlZm9yZSBzaGlwcGluZyB0ZXh0IGFuZCBkYXRhCi0gKgkgIG9mZiB0byB0aGUgTklORFkgbW9uaXRvciBpbiB0aGUgdGFyZ2V0IHN5c3RlbXMuICBTeW1ib2xzIGFuZAotICoJICByZWxvY2F0aW9uIGluZm8gYXJlIG5ldmVyIHNlbnQgdG8gdGhlIHRhcmdldC4KLSAqLwotCi0KLSNkZWZpbmUgQk1BR0lDCTA0MTUKLS8qIFdlIGRvbid0IGFjY2VwdCB0aGUgZm9sbG93aW5nIChzZWUgTl9CQURNQUcgbWFjcm8pLgotICogVGhleSdyZSBqdXN0IGhlcmUgc28gR05VIGNvZGUgd2lsbCBjb21waWxlLgotICovCi0jZGVmaW5lCU9NQUdJQwkwNDA3CQkvKiBvbGQgaW1wdXJlIGZvcm1hdCAqLwotI2RlZmluZQlOTUFHSUMJMDQxMAkJLyogcmVhZC1vbmx5IHRleHQgKi8KLSNkZWZpbmUJWk1BR0lDCTA0MTMJCS8qIGRlbWFuZCBsb2FkIGZvcm1hdCAqLwotCi0vKiBGSUxFIEhFQURFUgotICoJQWxsICdsZW5ndGhzJyBhcmUgZ2l2ZW4gYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gKglBbGwgJ2FsaWdubWVudHMnIGFyZSBmb3IgcmVsaW5rYWJsZSBmaWxlcyBvbmx5OyAgYW4gYWxpZ25tZW50IG9mCi0gKgkJJ24nIGluZGljYXRlcyB0aGUgY29ycmVzcG9uZGluZyBzZWdtZW50IG11c3QgYmVnaW4gYXQgYW4KLSAqCQlhZGRyZXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiAoMioqbikuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9leGVjIHsKLQkvKiBTdGFuZGFyZCBzdHVmZiAqLwotCXVuc2lnbmVkIGNoYXIgZV9pbmZvWzRdOwkvKiBJZGVudGlmaWVzIHRoaXMgYXMgYSBiLm91dCBmaWxlICovCi0JdW5zaWduZWQgY2hhciBlX3RleHRbNF07CS8qIExlbmd0aCBvZiB0ZXh0ICovCi0JdW5zaWduZWQgY2hhciBlX2RhdGFbNF07CS8qIExlbmd0aCBvZiBkYXRhICovCi0JdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsJCS8qIExlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSAqLwotCXVuc2lnbmVkIGNoYXIgZV9zeW1zWzRdOwkvKiBMZW5ndGggb2Ygc3ltYm9sIHRhYmxlICovCi0JdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOwkvKiBSdW50aW1lIHN0YXJ0IGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBjaGFyIGVfdHJzaXplWzRdOwkvKiBMZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8gKi8KLQl1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOwkvKiBMZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gKi8KLQotCS8qIEFkZGVkIGZvciBpOTYwICovCi0JdW5zaWduZWQgY2hhciBlX3Rsb2FkWzRdOwkvKiBUZXh0IHJ1bnRpbWUgbG9hZCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX2Rsb2FkWzRdOwkvKiBEYXRhIHJ1bnRpbWUgbG9hZCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX3RhbGlnblsxXTsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudCAqLwotCXVuc2lnbmVkIGNoYXIgZV9kYWxpZ25bMV07CS8qIEFsaWdubWVudCBvZiBkYXRhIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfYmFsaWduWzFdOwkvKiBBbGlnbm1lbnQgb2YgYnNzIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfcmVsYXhhYmxlWzFdOwkvKiBBc3NlbWJsZWQgd2l0aCBlbm91Z2ggaW5mbyB0byBhbGxvdyBsaW5rZXIgdG8gcmVsYXggKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCShzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9leGVjKSkKLQotLyogVGhlc2UgbWFjcm9zIHVzZSB0aGUgYV94eHggZmllbGQgbmFtZXMsIHNpbmNlIHRoZXkgb3BlcmF0ZSBvbiB0aGUgZXhlYwotICAgc3RydWN0dXJlIGFmdGVyIGl0J3MgYmVlbiBieXRlLXN3YXBwZWQgYW5kIHJlYWxpZ25lZCBvbiB0aGUgaG9zdCBtYWNoaW5lLiAqLwotI2RlZmluZSBOX0JBRE1BRyh4KQkoKCh4KS5hX2luZm8pIT1CTUFHSUMpCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCUVYRUNfQllURVNfU0laRQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX1RSRUxPRkYJTl9UUk9GRgotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fRFJFTE9GRglOX0RST0ZGCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLSNkZWZpbmUgTl9EQVRBRERSKHgpCSggKHgpLmFfZGxvYWQgKSAgICAKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jaWYgIWRlZmluZWQgKE5fVFhUQUREUikKLSNkZWZpbmUgTl9UWFRBRERSKHgpIDAKLSNlbmRpZgotCi0vKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gKi8KLXN0cnVjdCBubGlzdCB7Ci0JdW5pb24gewotCQljaGFyCSpuX25hbWU7Ci0JCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCQlsb25nCW5fc3RyeDsJCS8qIEluZGV4IGludG8gc3RyaW5nIHRhYmxlCSovCi0JfSBuX3VuOwotCXVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLQljaGFyCW5fb3RoZXI7CS8qIFVzZWQgaW4gaTgwOTYwIHN1cHBvcnQgLS0gc2VlIGJlbG93CSovCi0Jc2hvcnQJbl9kZXNjOwotCXVuc2lnbmVkIGxvbmcgbl92YWx1ZTsKLX07Ci0KLQotLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZQotICovCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wJKi8KLSNkZWZpbmUgTl9BQlMJMgkvKiBBYnNvbHV0ZSBzeW1ib2wJKi8KLSNkZWZpbmUgTl9URVhUCTQJLyogVGV4dCBzeW1ib2wJCSovCi0jZGVmaW5lIE5fREFUQQk2CS8qIERhdGEgc3ltYm9sCQkqLwotI2RlZmluZSBOX0JTUwk4CS8qIEJTUyBzeW1ib2wJCSovCi0jZGVmaW5lIE5fRk4JMzEJLyogRmlsZW5hbWUgc3ltYm9sCSovCi0KLSNkZWZpbmUgTl9FWFQJMQkvKiBFeHRlcm5hbCBzeW1ib2wgKE9SJ2QgaW4gd2l0aCBvbmUgb2YgYWJvdmUpCSovCi0jZGVmaW5lIE5fVFlQRQkwMzYJLyogTWFzayBmb3IgYWxsIHRoZSB0eXBlIGJpdHMJCQkqLwotI2RlZmluZSBOX1NUQUIJMDM0MAkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotLyogTUVBTklORyBPRiAnbl9vdGhlcicKLSAqCi0gKiBJZiBub24temVybywgdGhlICduX290aGVyJyBmaWVsZHMgaW5kaWNhdGVzIGVpdGhlciBhIGxlYWYgcHJvY2VkdXJlIG9yCi0gKiBhIHN5c3RlbSBwcm9jZWR1cmUsIGFzIGZvbGxvd3M6Ci0gKgotICoJMSA8PSBuX290aGVyIDw9IDMyIDoKLSAqCQlUaGUgc3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludCB0byBhIHN5c3RlbSBwcm9jZWR1cmUuCi0gKgkJJ25fdmFsdWUnIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSwgYXMgZm9yIGFueSBvdGhlcgotICoJCXByb2NlZHVyZS4gIFRoZSBzeXN0ZW0gcHJvY2VkdXJlIG51bWJlciAod2hpY2ggY2FuIGJlIHVzZWQgaW4KLSAqCQlhICdjYWxscycgaW5zdHJ1Y3Rpb24pIGlzIChuX290aGVyLTEpLiAgVGhlc2UgZW50cmllcyBjb21lIGZyb20KLSAqCQknLnN5c3Byb2MnIGRpcmVjdGl2ZXMuCi0gKgotICoJbl9vdGhlciA9PSBOX0NBTExOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2NhbGwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlICpuZXh0KiBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSBtdXN0IGJlIHRoZSBjb3JyZXNwb25kaW5nCi0gKgkJJ2JhbCcgZW50cnkgcG9pbnQgdG8gdGhlIHByb2NlZHVyZSAoc2VlIGZvbGxvd2luZykuICBUaGVzZQotICoJCWVudHJpZXMgY29tZSBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggdHdvIGRpZmZlcmVudAotICoJCXN5bWJvbHMgYXJlIHNwZWNpZmllZCAodGhlIGZpcnN0IG9uZSBpcyByZXByZXNlbnRlZCBoZXJlKS4KLSAqCQotICoKLSAqCW5fb3RoZXIgPT0gTl9CQUxOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2JhbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KLSAqCQlUaGVzZSBlbnRyaWVzIHJlc3VsdCBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggb25seQotICoJCW9uZSBzeW1ib2wgaXMgc3BlY2lmaWVkLCBvciBpbiB3aGljaCB0aGUgc2FtZSBzeW1ib2wgaXMKLSAqCQlzcGVjaWZpZWQgdHdpY2UuCi0gKgotICogTm90ZSB0aGF0IGFuIE5fQ0FMTE5BTUUgZW50cnkgKm11c3QqIGhhdmUgYSBjb3JyZXNwb25kaW5nIE5fQkFMTkFNRSBlbnRyeSwKLSAqIGJ1dCBub3QgZXZlcnkgTl9CQUxOQU1FIGVudHJ5IG11c3QgaGF2ZSBhbiBOX0NBTExOQU1FIGVudHJ5LgotICovCi0jZGVmaW5lIE5fQ0FMTE5BTUUJKChjaGFyKS0xKQotI2RlZmluZSBOX0JBTE5BTUUJKChjaGFyKS0yKQotI2RlZmluZSBJU19DQUxMTkFNRSh4KQkoTl9DQUxMTkFNRSA9PSAoeCkpCi0jZGVmaW5lIElTX0JBTE5BTUUoeCkJKE5fQkFMTkFNRSA9PSAoeCkpCi0jZGVmaW5lIElTX09USEVSKHgpCSgoeCk+MCAmJiAoeCkgPD0zMikKLQotI2RlZmluZSBiX291dF9yZWxvY2F0aW9uX2luZm8gcmVsb2NhdGlvbl9pbmZvCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvIHsKLQlpbnQJIHJfYWRkcmVzczsJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCi0JdW5zaWduZWQKLSNkZWZpbmUgcl9pbmRleCByX3N5bWJvbG51bQotCQlyX3N5bWJvbG51bToyNCwvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCwKLQkJCQkqCWlmIHJfZXh0ZXJuIGlzIHNldC4gIE90aGVyd2lzZSBzZXQgdG8KLQkJCQkqCWVpdGhlciBOX1RFWFQsIE5fREFUQSwgb3IgTl9CU1MgdG8KLQkJCQkqCWluZGljYXRlIHNlY3Rpb24gb24gd2hpY2ggcmVsb2NhdGlvbiBpcwotCQkJCSoJYmFzZWQuCi0JCQkJKi8KLQkJcl9wY3JlbDoxLAkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCi0JCQkJICoJT24gaTk2MCwgcGMtcmVsYXRpdmUgaW1wbGllcyAyNC1iaXQKLQkJCQkgKglhZGRyZXNzLCBhYnNvbHV0ZSBpbXBsaWVzIDMyLWJpdC4KLQkJCQkgKi8KLQkJcl9sZW5ndGg6MiwJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlbG9jYXRlOgotCQkJCSAqCTAgPT4gMSBieXRlCi0JCQkJICoJMSA9PiAyIGJ5dGVzIC0tIHVzZWQgZm9yIDEzIGJpdCBwY3JlbAotCQkJCSAqCTIgPT4gNCBieXRlcyAKLQkJCQkgKi8KLQkJcl9leHRlcm46MSwKLQkJcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotCQlyX2Rpc3A6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotCQlyX2NhbGxqOjEsCS8qIDEgaWYgcmVsb2NhdGlvbiB0YXJnZXQgaXMgYW4gaTk2MCAnY2FsbGonICovCi0JCXJfcmVsYXhhYmxlOjE7CS8qIDEgaWYgZW5vdWdoIGluZm8gaXMgbGVmdCB0byByZWxheAotCQkJCSAgIHRoZSBkYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYWxsYmFjay5oIGIvaW5jbHVkZS9jYWxsYmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc1Mjg0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKiBSZW1vdGUgdGFyZ2V0IHN5c3RlbSBjYWxsIGNhbGxiYWNrIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpbnRlcmZhY2UgaXNuJ3QgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIga2luZAotICAgb2YgcmVtb3RlIChoYXJkd2FyZSwgc2ltdWxhdG9yLCB3aGF0ZXZlcikuICBBcyBzdWNoLCBzdXBwb3J0IGZvciBpdAotICAgKGUuZy4gc2ltL2NvbW1vbi9jYWxsYmFjay5jKSBzaG91bGQgKm5vdCogbGl2ZSBpbiB0aGUgc2ltdWxhdG9yIHNvdXJjZQotICAgdHJlZSwgbm9yIHNob3VsZCBpdCBsaXZlIGluIHRoZSBnZGIgc291cmNlIHRyZWUuICAqLwotCi0vKiBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGhhbmRsZSBzeXN0ZW0gY2FsbHM6Ci0KLSAgIDEpIEhhdmUgYSBzaW11bGF0b3IgaW50ZXJjZXB0IHRoZSBhcHByb3ByaWF0ZSB0cmFwIGluc3RydWN0aW9uIGFuZAotICAgZGlyZWN0bHkgcGVyZm9ybSB0aGUgc3lzdGVtIGNhbGwgb24gYmVoYWxmIG9mIHRoZSB0YXJnZXQgcHJvZ3JhbS4KLSAgIFRoaXMgaXMgdGhlIHR5cGljYWwgd2F5IG9mIGhhbmRsaW5nIHN5c3RlbSBjYWxscyBmb3IgZW1iZWRkZWQgdGFyZ2V0cy4KLSAgIFtIYW5kbGluZyBzeXN0ZW0gY2FsbHMgZm9yIGVtYmVkZGVkIHRhcmdldHMgaXNuJ3QgdGhhdCBtdWNoIG9mIGFuCi0gICBveHltb3JvbiBhcyBydW5uaW5nIGNvbXBpbGVyIHRlc3RzdWl0ZXMgbWFrZSB1c2Ugb2YgdGhlIGNhcGFiaWxpdHkuXQotCi0gICBUaGlzIG1ldGhvZCBvZiBzeXN0ZW0gY2FsbCBoYW5kbGluZyBpcyBkb25lIHdoZW4gU1RBVEVfRU5WSVJPTk1FTlQKLSAgIGlzIEVOVklST05NRU5UX1VTRVIuCi0KLSAgIDIpIEhhdmUgYSBzaW11bGF0b3IgZW11bGF0ZSB0aGUgaGFyZHdhcmUgYXMgbXVjaCBhcyBwb3NzaWJsZS4KLSAgIElmIHRoZSBwcm9ncmFtIHJ1bm5pbmcgb24gdGhlIHJlYWwgaGFyZHdhcmUgY29tbXVuaWNhdGVzIHdpdGggc29tZSBzb3J0Ci0gICBvZiB0YXJnZXQgbWFuYWdlciwgb25lIHdvdWxkIHdhbnQgdG8gYmUgYWJsZSB0byBydW4gdGhpcyBwcm9ncmFtIG9uIHRoZQotICAgc2ltdWxhdG9yIGFzIHdlbGwuCi0KLSAgIFRoaXMgbWV0aG9kIG9mIHN5c3RlbSBjYWxsIGhhbmRsaW5nIGlzIGRvbmUgd2hlbiBTVEFURV9FTlZJUk9OTUVOVAotICAgaXMgRU5WSVJPTk1FTlRfT1BFUkFUSU5HLgotKi8KLQotI2lmbmRlZiBDQUxMQkFDS19ICi0jZGVmaW5lIENBTExCQUNLX0gKLQotLyogPz8/IFRoZSByZWFzb24gd2h5IHdlIGNoZWNrIGZvciB2YV9zdGFydCBoZXJlIHNob3VsZCBiZSBkb2N1bWVudGVkLiAgKi8KLQotI2lmbmRlZiB2YV9zdGFydAotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0MCi0vKiBNYXBwaW5nIG9mIGhvc3QvdGFyZ2V0IHZhbHVlcy4gICovCi0vKiA/Pz8gRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgb25lIG1pZ2h0IHdhbnQgdG8gYWRkIGEgc3RyaW5nIG9mIHRoZQotICAgbmFtZSBvZiB0aGUgc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgaG9zdF92YWw7Ci0gIGludCB0YXJnZXRfdmFsOwotfSBDQl9UQVJHRVRfREVGU19NQVA7Ci0KLSNkZWZpbmUgTUFYX0NBTExCQUNLX0ZEUyAxMAotCi0vKiBGb3J3YXJkIGRlY2wgZm9yIHN0YXQvZnN0YXQuICAqLwotc3RydWN0IHN0YXQ7Ci0KLXR5cGVkZWYgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0IGhvc3RfY2FsbGJhY2s7Ci0KLXN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAKLXsKLSAgaW50ICgqY2xvc2UpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKixpbnQpKTsKLSAgaW50ICgqZ2V0X2Vycm5vKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLSAgaW50ICgqaXNhdHR5KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotICBpbnQgKCpsc2VlaykgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIGxvbmcgLCBpbnQpKTsKLSAgaW50ICgqb3BlbikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyKiwgaW50IG1vZGUpKTsKLSAgaW50ICgqcmVhZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLGludCwgIGNoYXIgKiwgaW50KSk7Ci0gIGludCAoKnJlYWRfc3RkaW4pIFBBUkFNUyAoKCBob3N0X2NhbGxiYWNrICosIGNoYXIgKiwgaW50KSk7Ci0gIGludCAoKnJlbmFtZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotICBpbnQgKCpzeXN0ZW0pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7Ci0gIGxvbmcgKCp0aW1lKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGxvbmcgKikpOwotICBpbnQgKCp1bmxpbmspIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7Ci0gIGludCAoKndyaXRlKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosaW50LCBjb25zdCBjaGFyICosIGludCkpOwotICBpbnQgKCp3cml0ZV9zdGRvdXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgdm9pZCAoKmZsdXNoX3N0ZG91dCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKndyaXRlX3N0ZGVycikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGludCkpOwotICB2b2lkICgqZmx1c2hfc3RkZXJyKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLSAgaW50ICgqc3RhdCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopKTsKLSAgaW50ICgqZnN0YXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLSAgLyogV2hlbiBwcmVzZW50LCBjYWxsIHRvIHRoZSBjbGllbnQgdG8gZ2l2ZSBpdCB0aGUgb3BvcnR1bml0eSB0bwotICAgICBwb2xsIGFueSBpbyBkZXZpY2VzIGZvciBhIHJlcXVlc3QgdG8gcXVpdCAoaW5kaWNhdGVkIGJ5IGEgbm9uemVybwotICAgICByZXR1cm4gdmFsdWUpLiAqLwotICBpbnQgKCpwb2xsX3F1aXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotCi0gIC8qIFVzZWQgd2hlbiB0aGUgdGFyZ2V0IGhhcyBnb25lIGF3YXksIHNvIHdlIGNhbiBjbG9zZSBvcGVuCi0gICAgIGhhbmRsZXMgYW5kIGZyZWUgbWVtb3J5IGV0YyBldGMuICAqLwotICBpbnQgKCpzaHV0ZG93bikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKmluaXQpICAgICBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLQotICAvKiBkZXByZWNpYXRlZCwgdXNlIHZwcmludGZfZmlsdGVyZWQgLSBUYWxrIHRvIHRoZSB1c2VyIG9uIGEgY29uc29sZS4gICovCi0gIHZvaWQgKCpwcmludGZfZmlsdGVyZWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLQotICAvKiBUYWxrIHRvIHRoZSB1c2VyIG9uIGEgY29uc29sZS4gICovCi0gIHZvaWQgKCp2cHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0gIC8qIFNhbWUgYXMgdnByaW50Zl9maWx0ZXJlZCBidXQgdG8gc3RkZXJyLiAgKi8KLSAgdm9pZCAoKmV2cHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0gIC8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kICJleGl0Ii4KLSAgICAgSW4gdGhlIGNhc2Ugb2YgZ2RiICJleGl0aW5nIiBtZWFucyBkb2luZyBhIGxvbmdqbXAgYmFjayB0byB0aGUgbWFpbgotICAgICBjb21tYW5kIGxvb3AuICAqLwotICB2b2lkICgqZXJyb3IpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLQotICBpbnQgbGFzdF9lcnJubzsJCS8qIGhvc3QgZm9ybWF0ICovCi0KLSAgaW50IGZkbWFwW01BWF9DQUxMQkFDS19GRFNdOwotICBjaGFyIGZkb3BlbltNQVhfQ0FMTEJBQ0tfRkRTXTsKLSAgY2hhciBhbHdheXNvcGVuW01BWF9DQUxMQkFDS19GRFNdOwotCi0gIC8qIFN5c3RlbSBjYWxsIG51bWJlcnMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKnN5c2NhbGxfbWFwOwotICAvKiBFcnJubyB2YWx1ZXMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKmVycm5vX21hcDsKLSAgLyogRmxhZ3MgdG8gdGhlIG9wZW4gc3lzdGVtIGNhbGwuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKm9wZW5fbWFwOwotICAvKiBTaWduYWwgbnVtYmVycy4gICovCi0gIENCX1RBUkdFVF9ERUZTX01BUCAqc2lnbmFsX21hcDsKLSAgLyogTGF5b3V0IG9mIGBzdGF0JyBzdHJ1Y3QuCi0gICAgIFRoZSBmb3JtYXQgaXMgYSBzZXJpZXMgb2YgIm5hbWUsbGVuZ3RoIiBwYWlycyBzZXBhcmF0ZWQgYnkgY29sb25zLgotICAgICBFbXB0eSBzcGFjZSBpcyBpbmRpY2F0ZWQgd2l0aCBhIGBuYW1lJyBvZiAic3BhY2UiLgotICAgICBBbGwgcGFkZGluZyBtdXN0IGJlIGV4cGxpY2l0bHkgbWVudGlvbmVkLgotICAgICBMZW5ndGhzIGFyZSBpbiBieXRlcy4gIElmIHRoaXMgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8gYml0cywKLSAgICAgdXNlICJuYW1lLmJpdHMiLgotICAgICBFeGFtcGxlOiAic3RfZGV2LDQ6c3RfaW5vLDQ6c3RfbW9kZSw0Oi4uLiIgICovCi0gIGNvbnN0IGNoYXIgKnN0YXRfbWFwOwotCi0gIC8qIE1hcmtlciBmb3IgdGhvc2Ugd2FudGluZyB0byBkbyBzYW5pdHkgY2hlY2tzLgotICAgICBUaGlzIHNob3VsZCByZW1haW4gdGhlIGxhc3QgbWVtYmVyIG9mIHRoaXMgc3RydWN0IHRvIGhlbHAgY2F0Y2gKLSAgICAgbWlzY29tcGlsYXRpb24gZXJyb3JzLiAqLwotI2RlZmluZSBIT1NUX0NBTExCQUNLX01BR0lDIDQ3MDUgLyogdGVkcyBjb25zdGFudCAqLwotICBpbnQgbWFnaWM7Ci19OwotCi1leHRlcm4gaG9zdF9jYWxsYmFjayBkZWZhdWx0X2NhbGxiYWNrOwotDAotLyogQ2Fub25pY2FsIHZlcnNpb25zIG9mIHN5c3RlbSBjYWxsIG51bWJlcnMuCi0gICBJdCdzIG5vdCBpbnRlbmRlZCB0byB3aWxseS1uaWxseSB0aHJvdyBldmVyeSBzeXN0ZW0gY2FsbCBldmVyIGhlYXJkCi0gICBvZiBpbiBoZXJlLiAgT25seSBpbmNsdWRlIHRob3NlIHRoYXQgaGF2ZSBhbiBpbXBvcnRhbnQgdXNlLgotICAgPz8/IE9uZSBjYW4gY2VydGFpbmx5IHN0YXJ0IGEgZGlzY3Vzc2lvbiBvdmVyIHRoZSBvbmVzIHRoYXQgYXJlIGN1cnJlbnRseQotICAgaGVyZSwgYnV0IHRoYXQgd2lsbCBhbHdheXMgYmUgdHJ1ZS4gICovCi0KLS8qIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBBTlNJIEMgc3VwcG9ydCBvZiBsaWJjLiAgKi8KLSNkZWZpbmUJQ0JfU1lTX2V4aXQJMQotI2RlZmluZQlDQl9TWVNfb3BlbgkyCi0jZGVmaW5lCUNCX1NZU19jbG9zZQkzCi0jZGVmaW5lCUNCX1NZU19yZWFkCTQKLSNkZWZpbmUJQ0JfU1lTX3dyaXRlCTUKLSNkZWZpbmUJQ0JfU1lTX2xzZWVrCTYKLSNkZWZpbmUJQ0JfU1lTX3VubGluawk3Ci0jZGVmaW5lCUNCX1NZU19nZXRwaWQJOAotI2RlZmluZQlDQl9TWVNfa2lsbAk5Ci0jZGVmaW5lIENCX1NZU19mc3RhdCAgICAxMAotLyojZGVmaW5lIENCX1NZU19zYnJrCTExIC0gbm90IGN1cnJlbnRseSBhIHN5c3RlbSBjYWxsLCBidXQgcmVzZXJ2ZWQuICAqLwotCi0vKiBBUkdWIHN1cHBvcnQuICAqLwotI2RlZmluZSBDQl9TWVNfYXJndmxlbgkxMgotI2RlZmluZSBDQl9TWVNfYXJndgkxMwotCi0vKiBUaGVzZSBhcmUgZXh0cmFzIGFkZGVkIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuICAqLwotI2RlZmluZSBDQl9TWVNfY2hkaXIJMTQKLSNkZWZpbmUgQ0JfU1lTX3N0YXQJMTUKLSNkZWZpbmUgQ0JfU1lTX2NobW9kIAkxNgotI2RlZmluZSBDQl9TWVNfdXRpbWUgCTE3Ci0jZGVmaW5lIENCX1NZU190aW1lIAkxOAotDAotLyogU3RydWN0IHVzZSB0byBwYXNzIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHBlcmZvcm0gYQotICAgc3lzdGVtIGNhbGwuICAqLwotLyogRklYTUU6IE5lZWQgdG8gY29uc2lkZXIgdGFyZ2V0IHdvcmQgc2l6ZS4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNiX3N5c2NhbGwgewotICAvKiBUaGUgdGFyZ2V0J3MgdmFsdWUgb2Ygd2hhdCBzeXN0ZW0gY2FsbCB0byBwZXJmb3JtLiAgKi8KLSAgaW50IGZ1bmM7Ci0gIC8qIFRoZSBhcmd1bWVudHMgdG8gdGhlIHN5c2NhbGwuICAqLwotICBsb25nIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQ7Ci0KLSAgLyogVGhlIHJlc3VsdC4gICovCi0gIGxvbmcgcmVzdWx0OwotICAvKiBTb21lIHN5c3RlbSBjYWxscyBoYXZlIHR3byByZXN1bHRzLiAgKi8KLSAgbG9uZyByZXN1bHQyOwotICAvKiBUaGUgdGFyZ2V0J3MgZXJybm8gdmFsdWUsIG9yIDAgaWYgc3VjY2Vzcy4KLSAgICAgVGhpcyBpcyBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCdzIHZhbHVlIHdpdGggaG9zdF90b190YXJnZXRfZXJybm8uICAqLwotICBpbnQgZXJyY29kZTsKLQotICAvKiBXb3JraW5nIHNwYWNlIHRvIGJlIHVzZWQgYnkgbWVtb3J5IHJlYWQvd3JpdGUgY2FsbGJhY2tzLiAgKi8KLSAgUFRSIHAxOwotICBQVFIgcDI7Ci0gIGxvbmcgeDEseDI7Ci0KLSAgLyogQ2FsbGJhY2tzIGZvciByZWFkaW5nL3dyaXRpbmcgbWVtb3J5IChlLmcuIGZvciByZWFkL3dyaXRlIHN5c2NhbGxzKS4KLSAgICAgPz8/IGxvbmcgb3IgdW5zaWduZWQgbG9uZyBtaWdodCBiZSBiZXR0ZXIgdG8gdXNlIGZvciB0aGUgYGNvdW50JwotICAgICBhcmd1bWVudCBoZXJlLiAgV2UgbWltaWMgc2ltX3tyZWFkLHdyaXRlfSBmb3Igbm93LiAgQmUgY2FyZWZ1bCB0bwotICAgICB0ZXN0IGFueSBjaGFuZ2VzIHdpdGggLVdhbGwgLVdlcnJvciwgbWl4ZWQgc2lnbmVkIGNvbXBhcmlzb25zCi0gICAgIHdpbGwgZ2V0IHlvdS4gICovCi0gIGludCAoKnJlYWRfbWVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICogLypjYiovLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqIC8qc2MqLywKLQkJCSAgIHVuc2lnbmVkIGxvbmcgLyp0YWRkciovLCBjaGFyICogLypidWYqLywKLQkJCSAgIGludCAvKmJ5dGVzKi8pKTsKLSAgaW50ICgqd3JpdGVfbWVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICogLypjYiovLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqIC8qc2MqLywKLQkJCSAgICB1bnNpZ25lZCBsb25nIC8qdGFkZHIqLywgY29uc3QgY2hhciAqIC8qYnVmKi8sCi0JCQkgICAgaW50IC8qYnl0ZXMqLykpOwotCi0gIC8qIEZvciBzYW5pdHkgY2hlY2tpbmcsIHNob3VsZCBiZSBsYXN0IGVudHJ5LiAgKi8KLSAgaW50IG1hZ2ljOwotfSBDQl9TWVNDQUxMOwotCi0vKiBNYWdpYyBudW1iZXIgc2FuaXR5IGNoZWNrZXIuICAqLwotI2RlZmluZSBDQl9TWVNDQUxMX01BR0lDIDB4MTIzNDQzMjEKLQotLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBDQl9TWVNDQUxMLiAgQ2FsbGVkIGZpcnN0LCBiZWZvcmUgZmlsbGluZyBpbgotICAgYW55IGZpZWxkcy4gICovCi0jZGVmaW5lIENCX1NZU0NBTExfSU5JVChzYykgXAotZG8geyBcCi0gIG1lbXNldCAoKHNjKSwgMCwgc2l6ZW9mICgqKHNjKSkpOyBcCi0gIChzYyktPm1hZ2ljID0gQ0JfU1lTQ0FMTF9NQUdJQzsgXAotfSB3aGlsZSAoMCkKLQwKLS8qIFJldHVybiBjb2RlcyBmb3IgdmFyaW91cyBpbnRlcmZhY2Ugcm91dGluZXMuICAqLwotCi10eXBlZGVmIGVudW0gewotICBDQl9SQ19PSyA9IDAsCi0gIC8qIGdlbmVyaWMgZXJyb3IgKi8KLSAgQ0JfUkNfRVJSLAotICAvKiBlaXRoZXIgZmlsZSBub3QgZm91bmQgb3Igbm8gcmVhZCBhY2Nlc3MgKi8KLSAgQ0JfUkNfQUNDRVNTLAotICBDQl9SQ19OT19NRU0KLX0gQ0JfUkM7Ci0KLS8qIFJlYWQgaW4gdGFyZ2V0IHZhbHVlcyBmb3Igc3lzdGVtIGNhbGwgbnVtYmVycywgZXJybm8gdmFsdWVzLCBzaWduYWxzLiAgKi8KLUNCX1JDIGNiX3JlYWRfdGFyZ2V0X3N5c2NhbGxfbWFwcyBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUcmFuc2xhdGUgdGFyZ2V0IHRvIGhvc3Qgc3lzY2FsbCBmdW5jdGlvbiBudW1iZXJzLiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9zeXNjYWxsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBob3N0IHRvIHRhcmdldCBlcnJubyB2YWx1ZS4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfZXJybm8gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCB0byBob3N0IG9wZW4gZmxhZ3MuICAqLwotaW50IGNiX3RhcmdldF90b19ob3N0X29wZW4gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCBzaWduYWwgbnVtYmVyIHRvIGhvc3QuICAqLwotaW50IGNiX3RhcmdldF90b19ob3N0X3NpZ25hbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCBzaWduYWwgbnVtYmVyIHRvIHRhcmdldC4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfc2lnbmFsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBob3N0IHN0YXQgc3RydWN0IHRvIHRhcmdldC4KLSAgIElmIHN0YXQgc3RydWN0IHB0ciBpcyBOVUxMLCBqdXN0IGNvbXB1dGUgdGFyZ2V0IHN0YXQgc3RydWN0IHNpemUuCi0gICBSZXN1bHQgaXMgc2l6ZSBvZiB0YXJnZXQgc3RhdCBzdHJ1Y3Qgb3IgMCBpZiBlcnJvci4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfc3RhdCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IHN0cnVjdCBzdGF0ICosIFBUUikpOwotCi0vKiBQZXJmb3JtIGEgc3lzdGVtIGNhbGwuICAqLwotQ0JfUkMgY2Jfc3lzY2FsbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIENCX1NZU0NBTEwgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9DaGFuZ2VMb2cgYi9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGI5YTU4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4MTEgKzAsMCBAQAotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKEZfQVJNXzUpOiBEZWZpbmUuCi0KLVdlZCBKdW4gIDIgMTg6MDg6MTggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoQkVPU19FWEVfSU1BR0VfQkFTRSwgQkVPU19ETExfSU1BR0VfQkFTRSk6IE5ldy4KLQotTW9uIE1heSAxNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi9hcm0uaCAoRl9QSUMsIEZfQVJNXzIsIEZfQVJNXzJhLCBGX0FSTV8zLCBGX0FSTV8zTSwKLQlGX0FSTV80LCBGX0FSTV80VCwgRl9BUENTMjYpOiBDaGFuZ2VkIHZhbHVlcyB0byBkaXN0aW5ndWlzaAotCUZfQVJNXzJhLCBGX0FSTV8zTSwgRl9BUk1fNFQuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKElNQUdFX1JFTF9NQ09SRV9SVkEpOiBEZWZpbmUuCi0KLTE5OTktMDQtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKEdFVF9MSU5FTk9fTE5OTyk6IE5ldyBtYWNyby4KLQkoUFVUX0xJTkVOT19MTk5PKTogTmV3IG1hY3JvLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oOiBOZXcgaGVhZGVyIGZpbGUuICBEZWZpbmVzIGZvciBNb3Rvcm9sbGEncyBNQ29yZQotCXByb2Nlc3Nvci4gCi0KLVN1biBEZWMgIDYgMjE6MzY6MzcgMTk5OCAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0B1c2EubmV0PgotCi0JKiBpbnRlcm5hbC5oIChDX1dFQUtFWFQpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKEZfUElDX0lOVCwgRl9BUk1fMiwgRl9BUk1fMywgRl9BUk1fNCwgRl9BUENTMjYpOgotCUNoYW5nZWQgdmFsdWVzIHRvIGF2b2lkIGNsYXNoaW5nIHdpdGggSU1BR0VfRklMRV8qIGNvZmYgaGVhZGVyCi0JZmxhZyB2YWx1ZXMuCi0JCi1XZWQgQXByICAxIDE2OjA2OjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IERvY3VtZW50IG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIFRodW1iIHN5bWJvbAotCXR5cGVzLiAKLQotRnJpIE1hciAyNyAxNzoxNjo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKElTUFRSLCBJU0ZDTiwgSVNBUlkpOiBBZGQgY2FzdHMgdG8gdW5zaWduZWQgbG9uZy4KLQotTW9uIEZlYiAgMiAxNzoxMDozOCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiB0aWMzMC5oOiBOZXcgZmlsZS4KLQotRnJpIERlYyAxMiAxMTo0OTowNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9NUFBDUjE1Vyk6IE5ldyByZWxvY2F0aW9uIHR5cGUsIGZvciAxNSBiaXQgUEMgcmVsYXRpdmUKLQlvZmZzZXRzLgotCi1UdWUgRGVjICAyIDEwOjIxOjQwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oIChDT0ZGQVJNKTogTmV3IGRlZmluZS4KLQotU2F0IE5vdiAyMiAxNToxMDoxNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX1RIVU1CRVhURlVOQywgQ19USFVNQlNUQVRGVU5DKTogQ29uc3RhbnRzIHRvCi0JZGVmaW5lIHN0YXRpYyBhbmQgZXh0ZXJuYWwgZnVuY3Rpb25zLgotCi0JKiBhcm0uaDogQWRkIGJpdHMgdG8gc3VwcG9ydCBQSUMgYW5kIEFQQ1MtRkxPQVQgdHlwZSBiaW5hcmllcywKLQl3aGVuIGltcGxlbWVudGVkLgotCi1GcmkgT2N0ICAzIDE0OjI1OjE3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChSX1BQTDE2Qik6IE1ha2UgY29uc3RhbnQgdXBwZXJjYXNlIGZvciBjb25zaXN0ZW5jeS4KLQotVHVlIEp1bCAyMiAxODoxODo1OCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGdvMzJleGUuaDogTmV3IGZpbGUuCi0KLVR1ZSBKdWwgIDggMTI6MjM6NTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX1RBUkdFVF9JRCk6IEFkZCBkZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkcik6IEFkZCBmX3RhcmdldF9pZCBmaWVsZC4KLQotVHVlIEp1biAgMyAxNjo0NDoxOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBBZGQgc3RvcmFnZSBjbGFzc2VzIGZvciBUaHVtYiBzeW1ib2xzCi0KLU1vbiBNYXkgMjYgMTQ6MDc6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChSX1BQTDE2Qik6IENvcnJlY3QgdmFsdWUuCi0KLVNhdCBNYXkgIDMgMDg6MjQ6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKENfVUVYVCwgQ19TVEFUTEFCLCBDX0VYVExBQiwgQ19TWVNURU0pOgotCU5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFRJYzgwLgotCi1GcmkgQXByIDE4IDExOjUyOjU1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGFscGhhLmggKEFMUEhBX0VDT0ZGX0JBRE1BRyk6IFJlY29nbml6ZSAqQlNEL2FscGhhIG1hZ2ljIHRvby4KLQkoQUxQSEFfUl9MSVRFUkFMU0xFQVpZKTogRGVmaW5lLgotCSogZWNvZmYuaCAoQUxQSEFfTUFHSUNfQlNEKTogRGVmaW5lLgotCi1XZWQgSmFuIDI5IDExOjMxOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChSX0lQUjEzLCBSX0FMSUdOKTogRGVmaW5lLgotCi1Nb24gSmFuIDI3IDEzOjM0OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoUl9JUFJNRUQsIFJfT1BUQ0FMTCwgUl9PUFRDQUxMWCk6IE1vdmUgZGVmaW5pdGlvbnMKLQlmcm9tIGhlcmUuLi4KLQkqIGk5NjAuaCAoUl9JUFJNRUQsIFJfT1BUQ0FMTCwgUl9PUFRDQUxMWCk6IC4uLnRvIGhlcmUuCi0KLVdlZCBKYW4gMjIgMjA6MTA6NDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwTUFHSUMpOiBSZW5hbWVkIHRvIFRJQzgwX0FPVVRIRFJfTUFHSUMuCi0KLUZyaSBEZWMgMjcgMjI6MDU6NDUgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmg6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCi1UaHUgRGVjIDE5IDE2OjE4OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKF9MSVQpOiBEZWZpbmUuCi0KLUZyaSBKdW4gMjggMTI6NTQ6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZS5oIChGSUxIU1opOiBEZWZpbmUuCi0KLVdlZCBKdW4gMjYgMTY6MjQ6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBBbGwgZmlsZXM6IERlZmluZSBGSUxIU1osIEFPVVRTWiwgQU9VVEhEUlNaLCBTQ05IU1osIFNZTUVTWiwKLQlBVVhFU1osIExJTkVTWiwgUkVMU1ogYXMgbnVtZXJpYyBjb25zdGFudHMgcmF0aGVyIHRoYW4gdXNlcyBvZgotCXNpemVvZi4gIERlZmluZSBBT1VUSERSU1ogaW4gYWxsIGZpbGVzLgotCSogcGUuaCAoQU9VVFNaKTogRGVmaW5lIGJ5IGFkZGluZyB0byBBT1VUSERSU1ouCi0KLUZyaSBKdW4gMjEgMTE6MTc6NDYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IEFkZCBkZWNsYXJhdGlvbnMgZm9yIHJlbG9jYXRpb24gdHlwZXMgYWRkZWQgZm9yIEFscGhhCi0gCU9TRi8xIDMuMC4KLQotVHVlIEp1biAxOCAxNjowNDoyOSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogaDgzMDAuaCAoSDgzMDBTTUFHSUMpOiBEZWZpbmUuCi0JKEg4MzAwU0JBRE1BRyk6IERlZmluZS4KLQotTW9uIEp1biAxMCAxMTo1MzoyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfQkNDX0lOViwgUl9KTVBfREVMKTogTmV3IHJlbG9jYXRpb25zIGZvcgotCXJlbGF4aW5nIGluIHRoZSBIOC8zMDAgc2VyaWVzLgotCi1UaHUgTWF5IDE2IDE1OjQ5OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2guaCAoUl9TSF9DT0RFLCBSX1NIX0RBVEEsIFJfU0hfTEFCRUwpOiBEZWZpbmUuCi0KLVR1ZSBNYXkgIDcgMDA6MzY6MzkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0pNUEwyKTogUmVuYW1lZCBmcm9tIFJfSk1QTF9COCB0byBiZQotCWNvbnNpc3RlbnQgd2l0aCBvdGhlciBzaW1pbGFyIHJlbG9jcy4KLQotCSogaW50ZXJuYWwuaCAoSDgvMzAwIHNwZWNpZmljIHJlbG9jcyk6IEFkZCBjb21tZW50cyBiZXR0ZXIKLQlleHBsYWluaW5nIHdoYXQgZWFjaCByZWxvYyBpcyB1c2VkIGZvci4KLQkoUl9NT1YxNkIxLCBSX01PVjE2QjIpOiBSZW5hbWVkIGZyb20gUl9NT1ZCMSBhbmQgUl9NT1ZCMi4KLQkoUl9NT1YyNEIxLCBSX01PVjI0QjIpOiBSZW5hbWVkIGZyb20gUl9NT1ZMQjEgYW5kIFJfTU9WTEIyLgotCShSX01PVkwxLCBSX01PVkwyKTogTmV3IHJlbG9jcy4KLQkKLUZyaSBNYXkgIDMgMTM6MDE6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX1BDUldPUkRfQik6IERlZmluZSBmb3IgdGhlIGg4MzAwIHJlbGF4aW5nCi0JbGlua2VyLgotCi1XZWQgTWF5ICAxIDE5OjIxOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoU0NOTk1MRU4pOiBEZWZpbmUuCi0JKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIpOiBVc2UgU0NOTk1MRU4gZm9yIHNfbmFtZSBmaWVsZC4KLQotRnJpIE1hciAyOSAxMzo0MToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlLmg6IERlZmluZSBJTUFHRV9DT01EQVQgY29kZXMuCi0KLVdlZCBNYXIgMjcgMTc6Mjk6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcm0uaCAodW5pb24gZXh0ZXJuYWxfYXV4ZW50KTogQWRkIHhfY2hlY2tzdW0sIHhfYXNzb2NpYXRlZCwgYW5kCi0JeF9jb21kYXQgZmllbGRzIHRvIHhfc2NuIHN0cnVjdC4KLQkqIGkzODYuaCAodW5pb24gZXh0ZXJuYWxfYXV4ZW50KTogTGlrZXdpc2UuCi0JKiBwb3dlcnBjLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCSogaW50ZXJuYWwuaCAodW5pb24gaW50ZXJuYWxfYXV4ZW50KTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjEgMTY6MjU6NTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSk6IEFkZCBjYWNoaW5nIGZpZWxkcy4KLQotVGh1IE1hciAxNCAxNToyMjo0NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfTUVNX0lORElSRUNUKTogTmV3IHJlbG9jIGZvciB0aGUgaDgzMDAuCi0gCi1GcmkgRmViICA5IDEwOjQ0OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXV4LWNvZmYuaDogUmVuYW1lIGZyb20gYXV4LmgsIHRvIGF2b2lkIHByb2JsZW1zIG9uIGhhcGxlc3MgRE9TCi0Jc3lzdGVtcyB3aGljaCB0aGluayB0aGF0IGF1eCBpcyBhIGNvbSBwb3J0LgotCi1Nb24gRmViICA1IDE4OjM1OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChGX0k5NjBIWCk6IERlZmluZS4KLQotV2VkIEphbiAzMSAxMzoxMTo1NCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYXV4Lmg6IE5ldyBmaWxlLgotCSogaW50ZXJuYWwuaCwgbTY4ay5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLgotCi1XZWQgTm92IDIyIDEzOjQ4OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuaCAoX1JDT05TVCwgU1RZUF9SQ09OU1QsIFJFTE9DX1NFQ1RJT05fUkNPTlNUKTogRGVmaW5lLgotCShOVU1fUkVMT0NfU0VDVElPTlMpOiBVcGRhdGUuCi0JKiBzeW1jb25zdC5oIChzY1JDb25zdCk6IERlZmluZS4KLQotVHVlIE5vdiAxNCAxODo1NDoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKENfTlRfV0VBSyk6IERlZmluZS4KLQotVGh1IE5vdiAgOSAxNDowODozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChTVFlQX09WUkZMTyk6IERlZmluZS4KLQotVHVlIE5vdiAgNyAxNDozODo0NSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi9wb3dlcnBjLmggKElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyk6IEFkZGVkIGRlZmluZS4KLQkqIGNvZmYvcGUuaDogQWRkZWQgZGVmaW5lcyBmb3IgZmlsZSBsZXZlbCBmbGFncwotCi1Nb24gTm92ICA2IDE3OjI4OjAxIDE5OTUgIEhhcnJ5IERvbGFuICA8ZG9sYW5Ac3NkLmludGVsLmNvbT4KLQotCSogaTg2MC5oOiBOZXcgZmlsZSwgYmFzZWQgb24gaTM4Ni5oLgotCi1XZWQgTm92ICAxIDE1OjI1OjE4IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBtNjhrLmggKFBBR0VNQUdJQ0VYRUNTV0FQUEVEKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1NXQVBQRUQpOiBEZWZpbmUuCi0JKFBBR0VNQUdJQ1BFWEVDVFNITElCKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1BBR0VEKTogRGVmaW5lLgotCShfQ09NTUVOVCk6IERFRklORS4KLQkqIG04OGsuaCAoX0NPTU1FTlQpOiBEZWZpbmUuCi0KLVdlZCBPY3QgMTggMTg6MzY6MTkgMTk5NSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc3ltLmg6ICNpZiAwJ2Qgb3V0IHJ1bnRpbWVfcGRyIHN0cnVjdCBiZWNhdXNlIGl0IGNob2tlcyAKLQlWaXN1YWwgQysrIGFuZCB0aGVyZSBhcmVuJ3QgYW55IHJlZmVyZW5jZXMgdG8gaXQgZWxzZXdoZXJlIGluIGdkYi4KLQotTW9uIE9jdCAxNiAxMToxMjoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChTTUFMTF9BT1VUU1opOiBEZWZpbmUuCi0KLQkqIGludGVybmFsLmggKFhNQ19URCk6IERlZmluZS4KLQotVHVlIE9jdCAxMCAxODo0MTowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyKTogQWRkIG9fY3B1dHlwZSBmaWVsZC4KLQkqIHJzNjAwMC5oIChBT1VUSERSKTogUmVuYW1lIG9fcmVzdjEgdG8gb19jcHV0eXBlLgotCi1Nb24gT2N0ICA5IDE0OjQ1OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2MDAwLmggKEFPVVRIRFIpOiBBZGQgb19tYXhkYXRhIGZpZWxkLiAgQWRkIGNvbW1lbnRzLgotCShfUEFELCBfTE9BREVSKTogRGVmaW5lLgotCShTVFlQX0xPQURFUik6IERlZmluZS4KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyKTogQWRkIG9fbWF4ZGF0YSBmaWVsZC4KLQotVGh1IE9jdCAgNSAxMDowMjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmg6IERlZmluZSBzZWN0aW9uIG5hbWUgbWFjcm9zIGFuZCBTVFlQIG1hY3JvcyBmb3IgdmFyaW91cwotCUFscGhhIHNlY3Rpb25zOiAuZ290LCAuaGFzaCwgLmR5bnN5bSwgLmR5bnN0ciwgLnJlbC5keW4sIC5jb25mbGljLAotCS5jb21tZW50LCAubGlibGlzdCwgLmR5bmFtaWMuCi0KLVdlZCBPY3QgIDQgMTA6NTY6MzUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlLmg6IE1vdmVkIERPU01BR0lDIGFuZCBOVF9TSUdOQVRVUkUgZGVmaW5lcyBoZXJlCi0JKiBwb3dlcnBjLmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JQWxzbyByZW1vdmVkIG90aGVyIHVudXNlZCBkZWZpbmVzICh2YXJpb3VzIE1BR0lDIG9uZXMpCi0JKiBpMzg2Lmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBhcm0uaDogcmVtb3ZlZCBET1NNQUdJQywgTlRfU0lHTkFUVVJFLCBhbmQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGFwb2xsby5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogYWxwaGEuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGg4NTAwLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBoODMwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogaTk2MC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbTg4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogd2UzMmsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHJzNjAwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbWlwcy5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbTY4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogejhrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiB3NjUuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHNwYXJjLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBzaC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCi1GcmkgU2VwIDI5IDA4OjQwOjA4IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwb3dlcnBjLmg6IFJlZm9ybWF0dGVkIHRvIEdOVSBjb2RpbmcgY29udmVudGlvbnMuCi0KLVdlZCBTZXAgMjcgMDY6NTA6NTAgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogcGUuaDogYWRkZWQgZGVmaW5lcyBmb3IgbW9yZSBzZWN0aW9uIGNoYXJhY3RlcmlzdGljcwotCSogcG93ZXJwYy5oIChuZXcgZmlsZSk6IGJhc2UgY29mZiBkZWZpbml0aW9ucyBmb3IgcHBjIFBFCi0KLVR1ZSBTZXAgMTIgMTI6MDg6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KTogQ2hhbmdlIG5fbnVtYXV4IGZpZWxkIGZyb20KLQljaGFyIHRvIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBTZXAgIDEgMTU6Mzk6MzYgMTk5NSAgS2F6dW1vdG8gS29qaW1hICA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+Ci0KLQkqIG1pcHMuaCAoc3RydWN0IHJwZHJfZXh0KTogRGVmaW5lLgotCi1UaHUgQXVnIDMxIDE2OjUxOjUwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKGludGVybmFsX2FvdXRoZHIsIGludGVybmFsX2ZpbGVoZHIpOgotCWRvbid0IGluZGlyZWN0IHRoZSBwZSBzdHVmZi4KLQotVHVlIEF1ZyAyOSAxNDoxNjowNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpMzg2LmggKE5UX0RFRl9SRVNFUlZFLCBOVF9ERUZfQ09NTUlUKTogTWFrZSB0aGUgc2FtZQotCWFzICd0aGUgb3RoZXInIGNvbXBpbGVyLgotCSogaW50ZXJuYWwuaCAoTlRfSU1BR0VfQkFTRSk6IERlbGV0ZWQuCi0JKE5UX0VYRV9JTUFHRV9CQVNFLCBOVF9ETExfSU1BR0VfQkFTRSk6IE5ldy4KLQkoUEVfREVGX1NFQ1RJT05fQUxJR05NRU5ULCBQRV9ERUZfRklMRV9BTElHTk1FTlQpOiBOZXcuCi0JKFJfSU1BR0VCQVNFKTogTmV3LgotCi1Nb24gQXVnIDIxIDE4OjEyOjE5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IChpbnRlcm5hbF9maWxlaGRyKTogTW92ZWQgUEUgc3R1ZmYgaW50bwotCWludGVybmFsX2V4dHJhX3BlX2ZpbGVoZHIuCi0JKGludGVybmFsX2FvdXRoZHIpOiBNb3ZlZCBQRSBzdHVmZiBpbnRvCi0JaW50ZXJhbmxfZXh0cmFfcGVfYW91dGhkci4KLQotTW9uIEp1bCAyNCAxNDowNTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IE1vdmUgUl9TSF8qIHJlbG9jcyBmcm9tIGhlcmUuLi4KLQkqIHNoLmg6IC4uLnRvIGhlcmUuCi0JKFJfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMzIpOiBEZWZpbmUuCi0JKFJfU0hfVVNFUywgUl9TSF9DT1VOVCwgUl9TSF9BTElHTik6IERlZmluZS4KLQotVGh1IEp1biAyOSAwMDowNDoyNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IEluY3JlYXNlIGEgbG90LgotCi1UdWUgTWF5IDE2IDE1OjA4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlbGV0ZQotCi1UdWUgTWF5IDE2IDE1OjA4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IE5vdyBleHRlcm4uCi0KLVR1ZSBGZWIgMTQgMTc6NTk6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oIChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfZmluZF9saW5lKTogRGVmaW5lLgotCi1TYXQgRmViICA0IDE0OjM4OjAzIDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogc3ltLmggKHN0cnVjdCBwZHIpOiBmaWVsZCAicHJvZiIgYWRkZWQuCi0KLQkqIGFscGhhLmggKFBEUl9CSVRTMV9QUk9GXyopOiBhZGRlZCwgbWFjcm9zIGZvciBQRFJfQklUUypfUkVTRVJWRURfKgotCXVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0KLVN1biBKYW4gMTUgMTg6Mzg6MzMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIHc2NS5oOiBOZXcgZmlsZS4KLQotV2VkIE5vdiAyMyAyMjo0MzozOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzaC5oIChTSF9BUkNIX01BR0lDX0JJRywgU0hfQVJDSF9NQUdJQ19MSVRUTEUpOiBOZXcuCi0JKFNIQkFETUFHKTogQ2hhbmdlZCB0byBzdWl0LgotCi1UdWUgSnVsIDI2IDE3OjQ2OjA4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGk5NjAuaCAoRl9JOTYwSlgpOiBOZXcgbWFjcm8uCi0KLVdlZCBKdWwgIDYgMDA6NDg6NTcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS5oOiAgQWRkIGRlZmluaXRpb25zIGZvciBhbHBoYSBmaWxlIGhlYWRlciBmbGFncywgZW5jb2RpbmcKLQl0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIGZpbGUuCi0KLU1vbiBKdW4gMjAgMTM6NDc6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9zd2FwX3Rpcl9pbik6IFJlbW92ZSBkZWNsYXJhdGlvbi4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCk6IEFkZCBuZXcgZmllbGRzOiBzd2FwX3Rpcl9pbiwKLQlzd2FwX3JuZHhfaW4sIHN3YXBfdGlyX291dCwgc3dhcF9ybmR4X291dCwgcmVhZF9kZWJ1Z19pbmZvLgotCi1TdW4gSnVuIDEyIDAzOjUxOjUyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3ltY29uc3QuaDogIFBpY2sgdXAgU0dJIGRlZmluZSBmb3Igc3RJbmRpcmVjdC4KLQotRnJpIEFwciAyMiAxMzowNToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFR0lORk8pOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBlY29mZl9yZWdpbmZvKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBzaC5oIChTSF9BUkNIX01BR0lDKTogUmVuYW1lIGZyb20gU0hNQUdJQy4gIFNITUFHSUMgaXMgdXNlZCBieQotCXNldmVyYWwgdGFyZ2V0cyB0byBtZWFuIGEgc2hhcmVkIGxpYnJhcnkuCi0JKFNIQkFETUFHKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVRodSBBcHIgMTQgMTM6MDA6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKFJFTE9DX0JJVFMzX1RZUEVfQklHKTogQ2hhbmdlZCBmcm9tIDB4MWUgdG8gMHgzZS4KLQkoUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRSk6IERlZmluZS4KLQkoUkVMT0NfQklUUzNfVFlQRUhJX1NIX0xJVFRMRSk6IERlZmluZS4KLQkoTUlQU19SX1BDUkVMMTYpOiBDaGFuZ2UgdmFsdWUgZnJvbSA4IHRvIDEyIHRvIG1hdGNoIElyaXggNC4KLQkoTUlQU19SX1JFTEhJKTogRGVmaW5lLgotCShNSVBTX1JfUkVMTE8pOiBEZWZpbmUuCi0JKE1JUFNfUl9TV0lUQ0gpOiBDaGFuZ2UgdmFsdWUgZnJvbSA5IHRvIDIyLgotCi1UaHUgQXByICA3IDE0OjE5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNSVBTX1JfU1dJVENIKTogRGVmaW5lLgotCi1UaHUgTWFyIDMxIDE5OjI4OjMzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKGludGVybmFsX2FvdXRoZHIpOiBBZGRlZCBjb21tZW50cyBmb3IgQXBvbGxvIGZpZWxkcy4KLQotVGh1IE1hciAzMSAxNjoyODowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFNUWVBfRUNPRkZfTElCKTogRGVmaW5lIGFzIHVzZWQgb24gSXJpeCA0LgotCi1GcmkgTWFyIDI1IDE3OjE2OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8pOiBBZGQgYWRqdXN0IGZpZWxkLgotCShzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0KTogRGVmaW5lLgotCi1UdWUgTWFyIDIyIDEzOjIyOjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNSVBTX1JfUENSRUwxNik6IERlZmluZS4KLQotU2F0IEZlYiAyNiAxMDoyNjozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmg6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuCi0KLU1vbiBGZWIgMjEgMDk6NDg6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIHN5bS5oIChzdHJ1Y3QgcnVudGltZV9wZHIpOiBNYWtlIGZpZWxkIGFkciBiZmRfdm1hLCBub3QgdW5zaWduZWQKLQlsb25nLgotCShTWU1SKTogTWFrZSBmaWVsZCB2YWx1ZSBiZmRfdm1hLCBub3QgbG9uZy4KLQotRnJpIEZlYiAgNCAyMzozNTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC5oIChTVFlQX0RFQlVHKTogRGVmaW5lLgotCi1XZWQgRmViICAyIDE0OjMxOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAodW5pb24gaW50ZXJuYWxfYXV4ZW50KTogQ2hhbmdlIHhfY3NlY3QueF9zY25sZW4gaW50bwotCWEgdW5pb24gb2YgYSBsb25nIGFuZCBhIHBvaW50ZXIgdG8gYSBzeW1ib2wuICBYQ09GRiBzb21ldGltZXMgdXNlcwotCXRoaXMgZmllbGQgYXMgYSBzeW1ib2wgaW5kZXguCi0KLU1vbiBKYW4gMTAgMjM6NTQ6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9kZWJ1Z19pbmZvKTogUmVtb3ZlIGZpZWxkcyBsaW5lX2VuZCwKLQlleHRlcm5hbF9kbnJfZW5kLCBleHRlcm5hbF9wZHJfZW5kLCBleHRlcm5hbF9zeW1fZW5kLAotCWV4dGVybmFsX29wdF9lbmQsIGV4dGVybmFsX2F1eF9lbmQsIHNzX2VuZCwgZXh0ZXJuYWxfZmRyX2VuZC4KLQlSZXBsYWNlIGlmZGJhc2Ugd2l0aCBpZmRtYXAuCi0KLVdlZCBKYW4gIDUgMTc6MDU6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFNUWVBfRVhURU5ERVNDLCBTVFlQX0NPTU1FTlQsIFNUWVBfWERBVEEsIFNUWVBfUERBVEEpOgotCURlZmluZS4KLQotV2VkIEphbiAgNSAxNjo1ODoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKE5VTV9SRUxPQ19TRUNUSU9OUyk6IERlZmluZS4KLQotVHVlIERlYyAyMSAwOToyNDo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKHN0cnVjdCBleHRlcm5hbF9yZWxvYyk6IFJlbmFtZSBmaWVsZCByX2FkZGVuZCB0bwotCXJfb2Zmc2V0LgotCi1TYXQgRGVjIDExIDE2OjEyOjMyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0RJU1A3LCBSX1NIX0lNTTE2KTogTmV3IHJlbG9jIHR5cGVzLgotCi1UdWUgTm92IDIzIDE0OjIzOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBBZGRlZCAqX2VuZCBmaWVsZHMgZm9yIGFsbAotCXRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBwb2ludGVycy4KLQotCSogc3ltLmg6IE5hbWVkIHRoZSBFWFRSIHN0cnVjdHVyZSBlY29mZl9leHRyLgotCi1GcmkgTm92IDE5IDA4OjIxOjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChSRUxTWik6IFVzZSBjb3JyZWN0IHNpemUuCi0KLVdlZCBOb3YgMTcgMTc6MTg6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvKTogRGVmaW5lLgotCi1UdWUgTm92ICAyIDE3OjU2OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmUuCi0KLVRodSBPY3QgMjggMTc6MDc6NTAgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKEkzODZMWU5YTUFHSUMpOiBSZW5hbWUgdG8gTFlOWENPRkZNQUdJQy4KLQkqIG02OGsuaCAoTFlOWENPRkZNQUdJQyk6IERlZmluZS4KLQkqIHNwYXJjLmg6IE5ldyBmaWxlLgotCi1UdWUgT2N0IDE5IDE1OjM0OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaCAoZXh0ZXJuYWxfYW91dGhkcik6IFNwbGl0IGZvdXIgYnl0ZSBwYWRkaW5nIGZpZWxkIGludG8KLQl0d28gYnl0ZSBibGRyZXYgZmllbGQgYW5kIHR3byBieXRlIHBhZGRpbmcgZmllbGQuCi0KLQkqIGVjb2ZmLmggKF9MSVRBLCBfUERBVEEsIF9YREFUQSwgU1RZUF9MSVRBKTogRGVmaW5lZC4KLQotV2VkIE9jdCAxMyAxNTo1MjozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCVN1biBPY3QgMTAgMTc6Mjc6MTAgMTk5MyAgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuZWR1LmF1KQotCi0JKiBjb2ZmL2ludGVybmFsLmg6IEFkZGVkIG9fc3JpLCBvX2lubGliIGFuZCBvX3ZpZCBmb3IgQXBvbGxvcwotCQkJYXMgd2VsbCBhcyBSX0RJUjE2LgotCi0JKiBjb2ZmL2Fwb2xsby5oOiBOZXcgZmlsZQotCi1Nb24gT2N0IDExIDE3OjE2OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoUkVHSU5GTywgc3RydWN0IGVjb2ZmX3JlZ2luZm8pOiBEZWZpbmUuCi0KLVR1ZSBPY3QgIDUgMTA6NTI6NTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC5oOiBDaGFuZ2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gY29tbWVudCB0byBvY3RhbAotCWVzY2FwZXMuCi0KLVR1ZSBTZXAgMjggMDM6Mjc6MDQgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlY29mZi5oIChfRklOSSwgU1RZUF9FQ09GRl9GSU5JKTogIEFkZCB0byBzdXBwb3J0IC5maW5pIHNlY3Rpb24uCi0KLUZyaSBTZXAgMjQgMTE6NTM6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEJBRE1BRyk6IFJlY29nbml6ZSBNSVBTX01BR0lDX0xJVFRMRTMgYW5kIE1JUFNfTUFHSUNfQklHMy4KLQkqIGVjb2ZmLmg6IERlZmluZSBNSVBTX01BR0lDX0xJVFRMRTMgYW5kIE1JUFNfTUFHSUNfQklHMy4KLQotVGh1IFNlcCAyMyAyMTowNzoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChCQURNQUcpOiBSZWNvZ25pemUgTUlQU19NQUdJQ19MSVRUTEUyIGFuZCBNSVBTX01BR0lDX0JJRzIuCi0JKiBlY29mZi5oOiBEZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUyIGFuZCBNSVBTX01BR0lDX0JJRzIuCi0KLVRodSBTZXAgMTYgMjA6Mjc6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzeW0uaCwgc3ltY29uc3QuaDogQWRkIGNvbW1lbnQgc3RhdGluZyB0aGVzZSBmaWxlcyBhcmUgbm90IHBhcnQKLQlvZiBHREIsIEdBUywgZXRjLiAgSW4gMTk5MSwgd2hlbiB3ZSBhc2tlZCBybXMgd2hldGhlciB3ZSBjb3VsZAotCWluY2x1ZGUgdGhlc2UgZmlsZXMgaW4gR0RCIChhbHRob3VnaCB0aGV5IGFyZSBjb3B5cmlnaHRlZCBieQotCXNvbWVvbmUgYmVzaWRlcyB0aGUgRlNGKSwgaGUgc2FpZCBpdCB3YXMgT0sgaWYgdGhleSB3ZXJlIG5vdAotCWNvbnNpZGVyZWQgcGFydCBvZiBHREIuCi0KLUZyaSBTZXAgMTAgMTc6NDA6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfUFVUX0FOWSk6IENhc3QgdmFsIGFyZ3VtZW50IHRvIGJmZF92bWEuCi0KLQkqIGFscGhhLmMgKGV4dGVybmFsX2FvdXRoZHIpOiBOZWVkIGZvdXIgYnl0ZXMgb2YgcGFkZGluZyBiZXR3ZWVuCi0JdnN0YW1wIGFuZCB0c2l6ZS4KLQotVHVlIFNlcCAgNyAxNDoyMDo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKEFVWF9HRVRfQU5ZLCBBVVhfUFVUX0FOWSk6IENoYW5nZWQgdG8gcmVmbGVjdCBmdXJ0aGVyCi0JY2hhbmdlIGluIGJmZCBzd2FwcGluZyByb3V0aW5lIG5hbWVzLgotCi1UdWUgU2VwICA3IDEwOjE1OjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfR0VUX0FOWSk6IENoYW5nZSBuYW1lIG9mIF9kb19nZXRiMzIgdG8gcmVmbGVjdCBiZmQKLQljaGFuZ2VzLgotCi1GcmkgQXVnIDEzIDE0OjMwOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoUkVMT0NfU0VDVElPTl9OT05FKTogRGVmaW5lLgotCi1UaHUgQXVnIDEyIDExOjI0OjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaCAoc3RydWN0IGV4dGVybmFsX3JlbG9jKTogQWRkIHJfc3ltbmR4IGZpZWxkLgotCShSRUxTWik6IENvcnJlY3QuCi0JKFJFTE9DX0JJVFMqKTogQ29ycmVjdC4KLQkoQUxQSEFfUl8qKTogRGVmaW5lLgotCSogZWNvZmYuaCAoUkVMT0NfU0VDVElPTl97WERBVEEsUERBVEEsRklOSSxMSVRBLEFCU30pOiBEZWZpbmUuCi0JKHJfZXh0ZXJuKTogVW5kZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpOiBNYWtlIHJfdmFkZHIgYmZkX3ZtYSByYXRoZXIKLQl0aGFuIGxvbmcuICBBZGQgcl9leHRlcm4gZmllbGQuCi0KLQkqIGFscGhhLmggKFBEUl9CSVRTKik6IERlZmluZS4KLQkqIHN5bS5oIChQRFIpOiBHaXZlIGNvcnJlY3QgbmFtZXMgdG8gbmV3IGZpZWxkcy4KLQotCSogZWNvZmYuaDogTW92ZWQgTUlQUyByZWxvYyBkZWZpbml0aW9ucyBmcm9tIGhlcmUuLi4KLQkqIG1pcHMuaDogdG8gaGVyZS4KLQotVHVlIEF1ZyAgMyAxMToxNzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFscGhhLmg6IENvcnJlY3RlZCBleHRlcm5hbCBzeW1ib2xpYyBkZWJ1Z2dpbmcgc3RydWN0dXJlcyB0bwotCW1hdGNoIGFjdHVhbCB1c2FnZS4KLQkqIGludGVybmFsLmggKGludGVybmFsX2ZpbGVoZHIsIGludGVybmFsX2FvdXRoZHIsCi0JaW50ZXJuYWxfc2NuaGRyKTogQ2hhbmdlZCB0eXBlIG9mIHNvbWUgZmllbGRzIHRvIGJmZF92bWEgc28gdGhleQotCWNhbiBob2xkIDY0IGJpdHMuCi0JKiBzeW0uaCAoSERSUiwgRkRSLCBQRFIsIEVYVFIpOiBMaWtld2lzZS4KLQkoUERSKTogQWRkZWQgbmV3IGZpZWxkcyBmb3VuZCBvbiBBbHBoYS4KLQkqIHN5bWNvbnN0LmggKG1hZ2ljU3ltMik6IERlZmluZTsgbmV3IHZhbHVlIGZvdW5kIG9uIEFscGhhLgotCi0JKiBlY29mZi5oOiBOZXcgZmlsZS4KLQkqIGFscGhhLmgsIG1pcHMuaDogTW92ZWQgY29tbW9uIGluZm9ybWF0aW9uIGludG8gZWNvZmYuaC4gIE1vdmVkCi0JZXh0ZXJuYWwgc3RydWN0dXJlIGRlZmluaXRpb25zIGluIGZyb20gZWNvZmYtZXh0LmguCi0JKiBlY29mZi1leHQuaDogUmVtb3ZlZDsgaW5mb3JtYXRpb24gbm93IGluIGFscGhhLmggYW5kIG1pcHMuaC4KLQotU3VuIEp1bCAxOCAyMTo0Mzo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogUmVjb2duaXplIEkzODZQVFhNQUdJQy4KLQotRnJpIEp1bCAxNiAwOTo1NDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19BT1VUX3tPWn1NQUdJQyk6IFJlbmFtZWQgZnJvbSB7T1p9TUFHSUMuCi0KLVRodSBKdWwgMTUgMTI6MjM6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IE1vdmUgeF9mY24gYmFjayBpbnNpZGUgeF9mY25hcnkuCi0JKHtHRVQsUFVUfV9GQ05fe0xOTk9QVFIsRU5ETkRYfSk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotU3VuIEp1bCAxMSAxODowMDoxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBEZWZpbmUgTUM2OEtCQ1NNQUdJQy4KLQotVGh1IEp1biAxMCAxMTo0NjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoX0lOSVQsIFNUWVBfTUlQU19JTklUKTogRGVmaW5lICh1c2VkIG9uIElyaXg0KS4KLQkoU1RZUF9PVEhFUl9MT0FEKTogRGVmaW5lIGFzIFNUWVBfTUlQU19JTklULgotCi1XZWQgSnVuICA5IDE1OjA5OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChPTUFHSUMpOiBEZWZpbmUuCi0KLU1vbiBBcHIgMjYgMTg6MDQ6NDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmgsIHNoLmg6IFN1cHBvcnQgZm9yIFNILgotCi1TYXQgQXByIDI0IDIxOjM0OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhMjlrLmg6IERlZmluZSBfTElULgotCi1GcmkgQXByIDIzIDE4OjQxOjIzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS5oOiBOZXcgZmlsZS4KLQotVGh1IEFwciAgOCAxMjozNjozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKENfU0hBRE9XLCBDX1ZFUlNJT04pOiBDb3BpZWQgaW4gZnJvbSBtODhrLmguCi0JKiBtODhrLmgsIGkzODYuaCwgd2UzMmsuaDogRG9uJ3QgZGVmaW5lIGFsbCB0aGUgc3RvcmFnZSBjbGFzc2VzOwotCXRoZXkncmUgYWxyZWFkeSBpbiBpbnRlcm5hbC5oLgotCi1XZWQgQXByICA3IDExOjUxOjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBDaGFuZ2Ugbl9zY2xhc3MgdG8gdW5zaWduZWQgY2hhci4KLQlDaGFuZ2UgQ19FRkNOIHRvIDB4ZmYsIGNoYW5nZSBSUy82MDAwIGRieCBzeW1ib2xzCi0JdG8gbm8gbG9uZ2VyIGJlIHNpZ25lZC4KLQotRnJpIE1hciAxOSAxNDo1Mjo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQWRkIEg4LzUwMCByZWxvYyB0eXBlcy4KLQotV2VkIE1hciAxNyAwOTo0NjowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oIChBVVhfUFVUX0FOWSk6IERvbid0IHVzZSB2b2lkIHZhbHVlcyBpbiBicmFuY2hlcyBvZgotCWNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0KLVRodSBNYXIgIDQgMTQ6MTI6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaCAoQVVYX0dFVF8qKTogUmV3cm90ZSB0byB1c2UgbmV3IG1hY3JvIEFVWF9HRVRfQU5ZLgotCShBVVhfUFVUXyopOiBOZXcgbWFjcm9zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFVWF9HRVQgbWFjcm9zLgotCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBBZGRlZCBwcm90b3R5cGUuCi0KLQkqIG1pcHMuaCAoTl9CVE1BU0ssIE5fVE1BU0ssIE5fQlRTSEZULCBOX1RTSElGVCk6IERlZmluZTsgdGhlc2UKLQlhcmUgbmVlZGVkIHRvIGludGVycHJldCBnY2MgZGVidWdnaW5nIG91dHB1dC4KLQotVHVlIEZlYiAgOSAwNzo0MzoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLmggKEJUWVBFLCBJU1BUUiwgSVNGQ04sIElTQVJZLCBERUNSRUYpOiBSZW1vdmVkCi0JbW9yZSBkZWZpbml0aW9ucyBkdXBsaWNhdGVkIGluIGludGVybmFsLmguCi0KLVdlZCBGZWIgIDMgMDk6MTg6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKFJFTE9DX0JJVFMzX1RZUEVfKik6IENvcnJlY3QgZm9yIGJpZyBlbmRpYW4gbWFjaGluZXMuCi0KLU1vbiBKYW4gMjUgMTE6MzU6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyKTogQWRkZWQgYWRkaXRpb25hbCBmaWVsZHMgdXNlZCBvbmx5Ci0JYnkgTUlQUyBFQ09GRi4KLQotVGh1IEphbiAyMSAxMDoyODozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoQU9VVEhEUik6IEFkZGVkIGFkZGl0aW9uYWwgZmllbGRzIHVzZWQgYnkgRUNPRkYuCi0KLVR1ZSBKYW4gMTkgMTI6MjE6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LmgsIHdlMzJrLmggKE5fKiwgVF8qLCBEVF8qKTogUmVtb3ZlZCBzdGlsbCBtb3JlIGRlZmluaXRpb25zCi0JZHVwbGljYXRlZCBpbiBpbnRlcm5hbC5oLgotCi0JKiBtaXBzLmggKFJFTE9DX1NFQ1RJT05fKiwgRUNPRkZfUl8qKTogRGVmaW5lZCBjb25zdGFudHMgZm9yIEVDT0ZGCi0JcmVsb2NzLgotCi1GcmkgSmFuIDE1IDE4OjE3OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIG5ldyBFQ09GRiBzd2FwcGluZyBmdW5jdGlvbnMuCi0JKG9wdF9leHQpOiBOZXcgc3RydWN0dXJlLgotCSogbWlwcy5oIChaTUFHSUMpOiBEZWZpbmVkIHRvIGJlIDA0MTMuCi0JKF9MSUIpOiBEZWZpbmVkIHRvIGJlICIubGliIgotCShleHRlcm5hbF9yZWxvYyk6IE1JUFMgRUNPRkYgcmVsb2NzIGFyZSBvbmx5IDggYnl0ZXMuICBBZGRlZAotCW1hY3JvcyB0byBhaWQgaW4gc3dhcHBpbmcuCi0KLUZyaSBKYW4gIDggMTY6MTk6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaDogQWRkZWQgcHJvdG90eXBlcyBmb3IgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zLgotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfc2NuaGRyKTogQWx3YXlzIHByb3ZpZGUgc19hbGlnbiBmaWVsZCwgbm90Ci0JanVzdCBvbiBpOTYwLgotCShpbnRlcm5hbF9yZWxvYyk6IEFsd2F5cyBwcm92aWRlIHJfc2l6ZSBmaWVsZCwgbm90IGp1c3Qgb24KLQlSUy82MDAwLgotCSogbWlwcy5oIChfUkRBVEEsIF9TREFUQSwgX1NCU1MsIF9MSVQ0LCBfTElUOCwgU1RZUF9SREFUQSwKLQlTVFlQX1NEQVRBLCBTVFlQX1NCU1MsIFNUWVBfTElUNCwgU1RZUF9MSVQ4KTogRGVmaW5lZC4KLQkoQ09ERV9NQVNLLCBNSVBTX0lTX1NUQUIsIE1JUFNfTUFSS19TVEFCLCBNSVBTX1VOTUFSS19TVEFCLAotCVNUQUJTX1NZTUJPTCk6IE1vdmVkIGluIGZyb20gZ2RiL21pcHNyZWFkLmMuCi0KLVdlZCBKYW4gIDYgMTQ6MDE6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LmgsIHdlMzJrLmg6IHJlbW92ZWQgU1RZUF8qIGRlZmluZXMsIHNpbmNlIHRoZXkgZHVwbGljYXRlZAotCXRob3NlIGluIGludGVybmFsLmguCi0KLVR1ZSBEZWMgMjkgMTU6NDA6MDcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGRlZmluZSBJMzg2QUlYTUFHSUMgZm9yIERhbmJ1cnkgQUlYIFBTLzIgY29tcGlsZXIuCi0KLVNhdCBEZWMgMTIgMTY6MDc6NTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGRvbid0IGRlZmluZSBCVFlQRSwgSVNQVFIsIElTRkNOLCBJU0FSWSwgREVDUkVGOiB0aGV5Ci0JYXJlIGRlZmluZWQgaW4gaW50ZXJuYWwuaC4KLQotVGh1IE5vdiAxMiAwOTo1MjowMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogKGludGVybmFsX3JlbG9jKTogcl9vZmZzZXQgaXMgbm93IGEgbG9uZy4KLQkqIHo4ay5oOiBzbGlnaHQgY29tbWVudCBlbmhhbmNlbWVudAotCi1XZWQgU2VwIDMwIDA3OjQ2OjA4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBjaGFuZ2VkIHo4ayByZWxvYyB0eXBlcwotCi1GcmkgQXVnIDI4IDEwOjE2OjMxIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLmg6IG5ldyBmaWxlCi0KLVRodSBBdWcgMjcgMTM6MDA6MDEgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogY29tbWVudCBvdXQgY3J1ZnQgYXQgdGhlIGVuZCBvZiAjZW5kaWYKLQotVHVlIEF1ZyAyNSAxNTowNjo0OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogYWRkZWQgI2RlZmluZSBmb3IgU1RZUF9MSVQsIHJlbW92ZWQgZnJvbSBhMjlrIGFuZAotCWg4MzAwLgotCi0JKiB6OGsuaDogYWRkZWQgejgwMDAgc3VwcG9ydAotCi1UaHUgSnVsIDE2IDE2OjMyOjAwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBhZGRlZCBSX1JFTExPTkdfTkVHIHJlbG9jIHR5cGUKLQotRnJpIEp1biAxMiAyMDoxMTowNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogIEZpeCB1bnRlcm1pbmF0ZWQgY29tbWVudC4KLQotV2VkIEp1biAxMCAwNzo1Nzo0OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBhLm91dCBtYWdpYyBudW1iZXJzIGZyb20KLQltb2hyaW5nQGluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUKLQotTW9uIEp1biAgOCAyMDoxMzozMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0LmgsIG1pcHMuaDogIFVzZSB1bnNpZ25lZCBjaGFycyBldmVyeXdoZXJlLgotCShTdWdnZXN0ZWQgYnkgQW50dGkgTWlldHRpbmVuLikKLQotVHVlIEFwciAxNCAxNToxODo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltLmg6ICBBZGQgY29tbWVudHMuCi0JKiBzeW1jb25zdC5oOiAgTWVyZ2Ugd2l0aCBGcmVkJ3MgY2hhbmdlcy4KLQotVHVlIEFwciAxNCAxNDozMDowNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogIFBpY2sgdXAgU0dJIGRlZmluZXMgZm9yIHN0U3RydWN0LCBzdFVuaW9uLCBzdEVudW0sCi0JbGFuZ0NwbHVzcGx1cywgYW5kIGxhbmdDcGx1c3BsdXNWMi4KLQotVGh1IEFwciAgMiAxOTo0Nzo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltLmgsIHN5bWNvbnN0Lmg6ICBNSVBTIGhhcyBwcm92aWRlZCByZWRpc3RyaWJ1dGFibGUgdmVyc2lvbnMKLQlvZiB0aGVzZSBmaWxlcy4gIFRoYW5rcyEKLQkqIGVjb2ZmLWV4dC5oOiAgQWRkIHdlYWtleHQgYml0IHRvIG1hdGNoIG5ldyBzeW0uaC4KLQotRnJpIE1hciAgNiAwMDoxMDo0NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6ICBBZGQgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9ycy4KLQotVGh1IEZlYiAyNyAxMTo1MzowNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6ICBOZXcgZmlsZSBmb3IgZXh0ZXJuYWwgKGluLWZpbGUpIGZvcm0gb2YgZWNvZmYKLQlzeW1ib2wgc3RydWN0dXJlcy4KLQotVGh1IEZlYiAgNiAxMTozMzozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogbWFkZSB0aGUgZXh0ZXJuYWxfbGluZW5vIGxfbG5ubyBmaWVsZCA0IGJ5dGVzIHdpZGUuCi0JYW5kZGVkIEdFVC9QVVRfTElORU5PX0xOTk8gbWFjcm9zCi0KLVNhdCBOb3YgMzAgMjA6Mzg6MzUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIENoYW5nZUxvZywgYTI5ay5oLCBoODMwMC5oLCBpMzg2LmgsIGk5NjAuaCwgaW50ZXJuYWwuaCwgbTY4ay5oLAotCW04OGsuaCwgbWlwcy5oLCByczYwMDAuaDogbW92ZSBmcm9tIGFib3ZlIGNvZmYtPGZvbz4uaAotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYTI5ay5oIGIvaW5jbHVkZS9jb2ZmL2EyOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzYTY0Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qIENPRkYgc3BlYyBmb3IgQU1EIDI5MCowIAotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBAIE5ldyBZb3JrIFVuaXZlcnNpdHkuCi0gKi8KLSAKLSNpZm5kZWYgQU1ECi0jIGRlZmluZSBBTUQKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSoqIEZpbGUgSGVhZGVyIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkgKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkgICAqLwotCWNoYXIgZl90aW1kYXRbNF07ICAgICAgIC8qIHRpbWUgJiBkYXRlIHN0YW1wCSAgICAqLwotCWNoYXIgZl9zeW1wdHJbNF07ICAgICAgIC8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIgICAgICAgKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcyAgICAgKi8KLQljaGFyIGZfb3B0aGRyWzJdOyAgICAgICAvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkgKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgRklMSERSICBzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZSBGSUxIU1oJMjAKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBNYWdpYyBudW1iZXJzIGZvciBBbTI5MDAwIAotKioJKEFUJlQgd2lsbCBhc3NpZ24gdGhlICJyZWFsIiBtYWdpYyBudW1iZXIpICAKLSovCi0KLSNkZWZpbmUgU0lQRkJPTUFHSUMgICAgIDA1NzIgICAgLyogQW0yOTAwMCAoQnl0ZSAwIGlzIE1TQikgKi8KLSNkZWZpbmUgU0lQUkJPTUFHSUMgICAgIDA1NzMgICAgLyogQW0yOTAwMCAoQnl0ZSAwIGlzIExTQikgKi8KLQotCi0jZGVmaW5lIEEyOUtfTUFHSUNfQklHIAkJU0lQRkJPTUFHSUMJCi0jZGVmaW5lIEEyOUtfTUFHSUNfTElUVExFCVNJUFJCT01BR0lDCQotI2RlZmluZSBBMjlLQkFETUFHKHgpIAkoKCh4KS5mX21hZ2ljIT1BMjlLX01BR0lDX0JJRykgJiYgXAotCQkJICAoKHgpLmZfbWFnaWMhPUEyOUtfTUFHSUNfTElUVExFKSkKLQotI2RlZmluZSBPTUFHSUMgQTI5S19NQUdJQ19CSUcKLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogRmlsZSBoZWFkZXIgZmxhZ3MgY3VycmVudGx5IGtub3duIHRvIHVzLgotKioKLSoqIEFtMjkwMDAgd2lsbCB1c2UgdGhlIEZfQVIzMldSIGFuZCBGX0FSMzJXIGZsYWdzIHRvIGluZGljYXRlCi0qKiB0aGUgYnl0ZSBvcmRlcmluZyBpbiB0aGUgZmlsZS4KLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogT3B0aW9uYWwgKGEub3V0KSBoZWFkZXIgCi0qLwotCi10eXBlZGVmCXN0cnVjdCBleHRlcm5hbF9hb3V0aGRyIAotewotICBjaGFyICBtYWdpY1syXTsJICAgICAgIC8qIHR5cGUgb2YgZmlsZQkJCSAqLwotICBjaGFyICB2c3RhbXBbMl07CSAgICAgIC8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyICB0c2l6ZVs0XTsJICAgICAgIC8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyICBkc2l6ZVs0XTsJICAgICAgIC8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhciAgYnNpemVbNF07CSAgICAgICAvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJICAgICAqLwotICBjaGFyICBlbnRyeVs0XTsJICAgICAgIC8qIGVudHJ5IHB0LgkJCSAgICAqLwotICBjaGFyICB0ZXh0X3N0YXJ0WzRdOwkgIC8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAgZGF0YV9zdGFydFs0XTsJICAvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19IEFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKiBhb3V0aGRyIG1hZ2ljIG51bWJlcnMgKi8KLSNkZWZpbmUgTk1BR0lDCQkwNDEwCS8qIHNlcGFyYXRlIGkvZCBleGVjdXRhYmxlICovCi0jZGVmaW5lIFNITUFHSUMJMDQwNgkJLyogTllVL1VsdHJhMyBzaGFyZWQgZGF0YSBleGVjdXRhYmxlIAotCQkJCSAgICh3cml0YWJsZSB0ZXh0KSAqLwotCi0jZGVmaW5lIF9FVEVYVCAgIAkiX2V0ZXh0IgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIFNlY3Rpb24gaGVhZGVyIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIAotewotCWNoYXIJICAgIHNfbmFtZVs4XTsgICAgICAvKiBzZWN0aW9uIG5hbWUJCSAqLwotCWNoYXIJICAgIHNfcGFkZHJbNF07ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJICAgIHNfdmFkZHJbNF07ICAgICAvKiB2aXJ0dWFsIGFkZHJlc3MJICAgICAgKi8KLQljaGFyCSAgICBzX3NpemVbNF07ICAgICAgLyogc2VjdGlvbiBzaXplCQkgKi8KLQljaGFyCSAgICBzX3NjbnB0cls0XTsgICAgLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCSAgICBzX3JlbHB0cls0XTsgICAgLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbiAgICAgICAqLwotCWNoYXIJICAgIHNfbG5ub3B0cls0XTsgICAvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMgICAgICovCi0JY2hhcgkgICAgc19ucmVsb2NbMl07ICAgIC8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQljaGFyCSAgICBzX25sbm5vWzJdOyAgICAgLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJICAgIHNfZmxhZ3NbNF07ICAgICAvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QJZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQgICAiLnRleHQiCi0jZGVmaW5lIF9EQVRBICAgIi5kYXRhIgotI2RlZmluZSBfQlNTICAgICIuYnNzIgotI2RlZmluZSBfTElUCSIubGl0IgotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIFNlY3Rpb24gdHlwZXMgLSB3aXRoIGFkZGl0aW9uYWwgc2VjdGlvbiB0eXBlIGZvciBnbG9iYWwgCi0qKiByZWdpc3RlcnMgd2hpY2ggd2lsbCBiZSByZWxvY2F0YWJsZSBmb3IgdGhlIEFtMjkwMDAuCi0qKgotKiogSW4gaW5zdGFuY2VzIHdoZXJlIGl0IGlzIG5lY2Vzc2FyeSBmb3IgYSBsaW5rZXIgdG8gcHJvZHVjZSBhbgotKiogb3V0cHV0IGZpbGUgd2hpY2ggY29udGFpbnMgdGV4dCBvciBkYXRhIG5vdCBiYXNlZCBhdCB2aXJ0dWFsCi0qKiBhZGRyZXNzIDAsIGUuZy4gZm9yIGEgUk9NLCB0aGVuIHRoZSBsaW5rZXIgc2hvdWxkIGFjY2VwdAotKiogYWRkcmVzcyBiYXNlIGluZm9ybWF0aW9uIGFzIGNvbW1hbmQgaW5wdXQgYW5kIHVzZSBQQUQgc2VjdGlvbnMKLSoqIHRvIHNraXAgb3ZlciB1bnVzZWQgYWRkcmVzc2VzLgotKi8KLQotI2RlZmluZQlTVFlQX0JTU1JFRwkweDEyMDAJLyogR2xvYmFsIHJlZ2lzdGVyIGFyZWEgKGxpa2UgU1RZUF9JTkZPKSAqLwotI2RlZmluZSBTVFlQX0VOVklSCTB4MjIwMAkvKiBFbnZpcm9ubWVudCAobGlrZSBTVFlQX0lORk8pICovCi0jZGVmaW5lIFNUWVBfQUJTCTB4NDAwMAkvKiBBYnNvbHV0ZSAoYWxsb2NhdGVkLCBub3QgcmVsb2MsIGxvYWRlZCkgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBSZWxvY2F0aW9uIGluZm9ybWF0aW9uIGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07CS8qICh2aXJ0dWFsKSBhZGRyZXNzIG9mIHJlZmVyZW5jZSAqLwotICBjaGFyIHJfc3ltbmR4WzRdOwkvKiBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLwotICBjaGFyIHJfdHlwZVsyXTsJLyogcmVsb2NhdGlvbiB0eXBlICovCi19OwotCi0jZGVmaW5lCVJFTE9DCQlzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUJUkVMU1oJCTEwCQkvKiBzaXplb2YgKFJFTE9DKSAqLyAKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBSZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgQW0yOTAwMCAKLSovCi0KLSNkZWZpbmUJUl9BQlMJCTAJLyogcmVmZXJlbmNlIGlzIGFic29sdXRlICovCi0gCi0jZGVmaW5lCVJfSVJFTAkJMDMwCS8qIGluc3RydWN0aW9uIHJlbGF0aXZlIChqbXAvY2FsbCkgKi8KLSNkZWZpbmUJUl9JQUJTCQkwMzEJLyogaW5zdHJ1Y3Rpb24gYWJzb2x1dGUgKGptcC9jYWxsKSAqLwotI2RlZmluZQlSX0lMT0hBTEYJMDMyCS8qIGluc3RydWN0aW9uIGxvdyBoYWxmICAoY29uc3QpICAqLwotI2RlZmluZQlSX0lISUhBTEYJMDMzCS8qIGluc3RydWN0aW9uIGhpZ2ggaGFsZiAoY29uc3RoKSBwYXJ0IDEgKi8KLSNkZWZpbmUJUl9JSENPTlNUCTAzNAkvKiBpbnN0cnVjdGlvbiBoaWdoIGhhbGYgKGNvbnN0aCkgcGFydCAyICovCi0JCQkJLyogY29uc3RhbnQgb2Zmc2V0IG9mIFJfSUhJSEFMRiByZWxvY2F0aW9uICovCi0jZGVmaW5lCVJfQllURQkJMDM1CS8qIHJlbG9jYXRhYmxlIGJ5dGUgdmFsdWUgKi8KLSNkZWZpbmUgUl9IV09SRAkJMDM2CS8qIHJlbG9jYXRhYmxlIGhhbGZ3b3JkIHZhbHVlICovCi0jZGVmaW5lIFJfV09SRAkJMDM3CS8qIHJlbG9jYXRhYmxlIHdvcmQgdmFsdWUgKi8KLQotI2RlZmluZQlSX0lHTEJMUkMJMDQwCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQyAqLwotI2RlZmluZQlSX0lHTEJMUkEJMDQxCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQSAqLwotI2RlZmluZQlSX0lHTEJMUkIJMDQyCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQiAqLwotIAotLyoKLU5PVEU6Ci1BbGwgdGhlICJJIiBmb3JtcyByZWZlciB0byAyOTAwMCBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgVGhlIGxpbmtlciBpcyAKLWV4cGVjdGVkIHRvIGtub3cgaG93IHRoZSBudW1lcmljIGluZm9ybWF0aW9uIGlzIHNwbGl0IGFuZC9vciBhbGlnbmVkCi13aXRoaW4gdGhlIGluc3RydWN0aW9uIHdvcmQocykuICBSX0JZVEUgd29ya3MgZm9yIGluc3RydWN0aW9ucywgdG9vLgotCi1JZiB0aGUgcGFyYW1ldGVyIHRvIGEgQ09OU1RIIGluc3RydWN0aW9uIGlzIGEgcmVsb2NhdGFibGUgdHlwZSwgdHdvIAotcmVsb2NhdGlvbiByZWNvcmRzIGFyZSB3cml0dGVuLiAgVGhlIGZpcnN0IGhhcyBhbiByX3R5cGUgb2YgUl9JSElIQUxGIAotKDMzIG9jdGFsKSBhbmQgYSBub3JtYWwgcl92YWRkciBhbmQgcl9zeW1uZHguICBUaGUgc2Vjb25kIHJlbG9jYXRpb24gCi1yZWNvcmQgaGFzIGFuIHJfdHlwZSBvZiBSX0lIQ09OU1QgKDM0IG9jdGFsKSwgYSBub3JtYWwgcl92YWRkciAod2hpY2ggCi1pcyByZWR1bmRhbnQpLCBhbmQgYW4gcl9zeW1uZHggY29udGFpbmluZyB0aGUgMzItYml0IGNvbnN0YW50IG9mZnNldCAKLXRvIHRoZSByZWxvY2F0aW9uIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBzeW1ib2wgdGFibGUgaW5kZXguICBUaGlzIAotc2Vjb25kIHJlY29yZCBpcyBhbHdheXMgd3JpdHRlbiwgZXZlbiBpZiB0aGUgY29uc3RhbnQgb2Zmc2V0IGlzIHplcm8uCi1UaGUgY29uc3RhbnQgZmllbGRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgc2V0IHRvIHplcm8uCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIExpbmUgbnVtYmVyIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIAotewotICAgdW5pb24gewotCSBjaGFyIGxfc3ltbmR4WzRdOyAvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkgY2hhciBsX3BhZGRyWzRdOyAgLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyICAgICovCi0gICB9IGxfYWRkcjsKLSAgIGNoYXIgbF9sbm5vWzJdOyAJLyogbGluZSBudW1iZXIJICAqLwotfTsKLQotI2RlZmluZQlMSU5FTk8JCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCQk2CQkvKiBzaXplb2YgKExJTkVOTykgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBTeW1ib2wgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSovCi0KLSNkZWZpbmUJRV9TWU1OTUxFTgk4CS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWiAJMTgKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBTdG9yYWdlIGNsYXNzIGRlZmluaXRpb25zIC0gbmV3IGNsYXNzZXMgZm9yIGdsb2JhbCByZWdpc3RlcnMuCi0qLwotCi0jZGVmaW5lIENfR0xCTFJFRwkxOQkJLyogZ2xvYmFsIHJlZ2lzdGVyICovCi0jZGVmaW5lIENfRVhUUkVHCTIwCQkvKiBleHRlcm5hbCBnbG9iYWwgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ19ERUZSRUcJMjEJCS8qIGV4dC4gZGVmLiBvZiBnbG9iYWwgcmVnaXN0ZXIgKi8KLQotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIERlcml2ZWQgc3ltYm9sIG1hc2svc2hpZnRzLgotKi8KLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIEF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgCi0qKiBkZWZpbml0aW9ucy4KLSovCi0KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNCAgICAgIC8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkgICovCi0jZGVmaW5lIEVfRElNTlVNICAJNCAgICAgICAvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsgICAgICAgLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOyAgLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOyAgIC8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJICAgICAgIC8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07ICAgICAgIC8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07ICAgICAgIC8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07ICAgICAgIC8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsgICAgIC8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkgLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotfTsKLQotI2RlZmluZQlBVVhFTlQJCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJCTE4CQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2FscGhhLmggYi9pbmNsdWRlL2NvZmYvYWxwaGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2Y2JjYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKiBFQ09GRiBzdXBwb3J0IG9uIEFscGhhIG1hY2hpbmVzLgotICAgY29mZi9lY29mZi5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMgZmlsZS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLSAgdW5zaWduZWQgY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9zeW1wdHJbOF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogTWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiBjb2ZmL2Vjb2ZmLmguICAqLwotI2RlZmluZSBBTFBIQV9FQ09GRl9CQURNQUcoeCkgXAotICAoKHgpLmZfbWFnaWMgIT0gQUxQSEFfTUFHSUMgJiYgKHgpLmZfbWFnaWMgIT0gQUxQSEFfTUFHSUNfQlNEKQotCi0vKiBUaGUgb2JqZWN0IHR5cGUgaXMgZW5jb2RlZCBpbiB0aGUgZl9mbGFncy4gICovCi0jZGVmaW5lIEZfQUxQSEFfT0JKRUNUX1RZUEVfTUFTSwkweDMwMDAKLSNkZWZpbmUgRl9BTFBIQV9OT19TSEFSRUQJCTB4MTAwMAotI2RlZmluZSBGX0FMUEhBX1NIQVJBQkxFCQkweDIwMDAKLSNkZWZpbmUgRl9BTFBIQV9DQUxMX1NIQVJFRAkJMHgzMDAwCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyNAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgZXh0ZXJuYWxfYW91dGhkcgotewotICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl2c3RhbXBbMl07CS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICB1bnNpZ25lZCBjaGFyIGJsZHJldlsyXTsJLyogPz8gKi8KLSAgdW5zaWduZWQgY2hhciBwYWRkaW5nWzJdOwkvKiBwYWQgdG8gcXVhZHdvcmQgYm91bmRhcnkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdHNpemVbOF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcwkJCSovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbOF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs4XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzhdOwkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X3N0YXJ0WzhdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YV9zdGFydFs4XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGJzc19zdGFydFs4XTsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BybWFza1s0XTsJLyogYml0bWFzayBvZiBnZW5lcmFsIHJlZ2lzdGVycyB1c2VkICovCi0gIHVuc2lnbmVkIGNoYXIgZnBybWFza1s0XTsJLyogYml0bWFzayBvZiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCAqLwotICB1bnNpZ25lZCBjaGFyIGdwX3ZhbHVlWzhdOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX0gQU9VVEhEUjsKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLSNkZWZpbmUgQU9VVFNaIDgwCi0jZGVmaW5lIEFPVVRIRFJTWiA4MAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgdW5zaWduZWQgY2hhcglzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19wYWRkcls4XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgdW5zaWduZWQgY2hhcglzX3ZhZGRyWzhdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zaXplWzhdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2NucHRyWzhdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNfcmVscHRyWzhdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIHVuc2lnbmVkIGNoYXIJc19sbm5vcHRyWzhdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgdW5zaWduZWQgY2hhcglzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk2NAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgdW5zaWduZWQgY2hhciByX3ZhZGRyWzhdOwotICB1bnNpZ25lZCBjaGFyIHJfc3ltbmR4WzRdOwotICB1bnNpZ25lZCBjaGFyIHJfYml0c1s0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLS8qIENvbnN0YW50cyB0byB1bnBhY2sgdGhlIHJfYml0cyBmaWVsZC4gIFRoZSBBbHBoYSBzZWVtcyB0byBhbHdheXMgYmUKLSAgIGxpdHRsZSBlbmRpYW4sIHNvIEkgaGF2ZW4ndCBib3RoZXJlZCB0byBkZWZpbmUgYmlnIGVuZGlhbiB2YXJpYW50cwotICAgb2YgdGhlc2UuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFCQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUJCTB4MDEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFCQkweDdlCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUJCTEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9MSVRUTEUJCTB4ODAKLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCQk3Ci0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX0xJVFRMRQkJMHgwMwotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQk5Ci0KLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUJCQkweGZjCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFCQkyCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lHTk9SRQkJMAotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkyCi0jZGVmaW5lIEFMUEhBX1JfR1BSRUwzMgkJMwotI2RlZmluZSBBTFBIQV9SX0xJVEVSQUwJCTQKLSNkZWZpbmUgQUxQSEFfUl9MSVRVU0UJCTUKLSNkZWZpbmUgQUxQSEFfUl9HUERJU1AJCTYKLSNkZWZpbmUgQUxQSEFfUl9CUkFERFIJCTcKLSNkZWZpbmUgQUxQSEFfUl9ISU5UCQk4Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDE2CQk5Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDMyCSAgICAgICAxMAotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkgICAgICAgMTEKLSNkZWZpbmUgQUxQSEFfUl9PUF9QVVNICSAgICAgICAxMgotI2RlZmluZSBBTFBIQV9SX09QX1NUT1JFICAgICAgIDEzCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkgICAgICAgMTQKLSNkZWZpbmUgQUxQSEFfUl9PUF9QUlNISUZUICAgICAxNQotI2RlZmluZSBBTFBIQV9SX0dQVkFMVUUJICAgICAgIDE2Ci0jZGVmaW5lIEFMUEhBX1JfR1BSRUxISUdIICAgICAgMTcKLSNkZWZpbmUgQUxQSEFfUl9HUFJFTExPVyAgICAgICAxOAotI2RlZmluZSBBTFBIQV9SX0lNTUVEICAgICAgICAgIDE5Ci0KLS8qIE92ZXJsb2FkZWQgcmVsb2MgdmFsdWUgdXNlZCBieSBOZXQtIGFuZCBPcGVuQlNELiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMU0xFQVpZICAxNwotCi0vKiBXaXRoIEFMUEhBX1JfTElUVVNFLCB0aGUgcl9zaXplIGZpZWxkIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCi0jZGVmaW5lIEFMUEhBX1JfTFVfQkFTRSAgICAgICAgIDEKLSNkZWZpbmUgQUxQSEFfUl9MVV9CWVRPRkYgICAgICAgMgotI2RlZmluZSBBTFBIQV9SX0xVX0pTUiAgICAgICAgICAzCi0KLS8qIFdpdGggQUxQSEFfUl9JTU1FRCwgdGhlIHJfc2l6ZSBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0dQXzE2ICAgICAxCi0jZGVmaW5lIEFMUEhBX1JfSU1NRURfR1BfSEkzMiAgIDIKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9TQ05fSEkzMiAgMwotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0JSX0hJMzIgICA0Ci0jZGVmaW5lIEFMUEhBX1JfSU1NRURfTE8zMiAgICAgIDUKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MSUMgSU5GT1JNQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV3JpdHRlbiBieSBKb2huIEdpbG1vcmUuICAqLwotCi0vKiBFQ09GRiB1c2VzIENPRkYtbGlrZSBzZWN0aW9uIHN0cnVjdHVyZXMsIGJ1dCBpdHMgb3duIHN5bWJvbCBmb3JtYXQuCi0gICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3ltYm9sIGZvcm1hdCBpbiBmaWVsZHMgd2hvc2Ugc2l6ZSBhbmQgYWxpZ25tZW50Ci0gICB3aWxsIG5vdCB2YXJ5IG9uIGRpZmZlcmVudCBob3N0IHN5c3RlbXMuICAqLwotCi0vKiBGaWxlIGhlYWRlciBhcyBhIHNldCBvZiBieXRlcyAqLwotCi1zdHJ1Y3QgaGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhciAJaF9tYWdpY1syXTsKLQl1bnNpZ25lZCBjaGFyCWhfdnN0YW1wWzJdOwotCXVuc2lnbmVkIGNoYXIJaF9pbGluZU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWRuTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pcGRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzeW1NYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lvcHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lhdXhNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc01heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXNzRXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZmRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lleHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZVs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkRuT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlBkT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlN5bU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JPcHRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiQXV4T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzRXh0T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkZkT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlJmZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JFeHRPZmZzZXRbOF07Ci19OwotCi0vKiBGaWxlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBmZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWZfYWRyWzhdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcglmX2NiTGluZVs4XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JTc1s4XTsKLQl1bnNpZ25lZCBjaGFyCWZfcnNzWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3NCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3ltQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3N5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaWxpbmVCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jbGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaW9wdEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lwZEZpcnN0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jcGRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lhdXhCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYXV4WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9yZmRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czJbM107Ci0JdW5zaWduZWQgY2hhcglmX3BhZGRpbmdbNF07Ci19OwotCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0JJRwkJMHhGOAotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9CSUcJCTMKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfTElUVExFCQkweDFGCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRQkwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9CSUcJCTB4MDQKLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUJCTB4MjAKLQotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9CSUcJCTB4MDIKLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFCTB4NDAKLQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9CSUcJMHgwMQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUJMHg4MAotCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfQklHCQkweEMwCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfQklHCQk2Ci0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfTElUVExFCQkweDAzCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFCTAKLQotLyogV2UgaWdub3JlIHRoZSBgcmVzZXJ2ZWQnIGZpZWxkIGluIGJpdHMyLiAqLwotCi0vKiBQcm9jZWR1cmUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbOF07Ci0JdW5zaWduZWQgY2hhcglwX2NiTGluZU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCXBfaXN5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaWxpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaW9wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9ncF9wcm9sb2d1ZVsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglwX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJcF9sb2NhbG9mZlsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOwotfTsKLQotI2RlZmluZSBQRFJfQklUUzFfR1BfVVNFRF9CSUcJCTB4ODAKLSNkZWZpbmUgUERSX0JJVFMxX1JFR19GUkFNRV9CSUcJCTB4NDAKLSNkZWZpbmUgUERSX0JJVFMxX1BST0ZfQklHCQkweDIwCi0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcJCTB4MWYKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHhmZgotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHCTAKLQotI2RlZmluZSBQRFJfQklUUzFfR1BfVVNFRF9MSVRUTEUJMHgwMQotI2RlZmluZSBQRFJfQklUUzFfUkVHX0ZSQU1FX0xJVFRMRQkweDAyCi0jZGVmaW5lIFBEUl9CSVRTMV9QUk9GX0xJVFRMRQkJMHgwNAotI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFCTB4ZjgKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRQkzCi0jZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHhmZgotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUgNQotCi0vKiBMaW5lIG51bWJlcnMgKi8KLQotc3RydWN0IGxpbmVfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWxfbGluZVs0XTsKLX07Ci0KLS8qIFN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHN5bV9leHQgewotCXVuc2lnbmVkIGNoYXIJc192YWx1ZVs4XTsKLQl1bnNpZ25lZCBjaGFyCXNfaXNzWzRdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMzWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzNFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0JJRwkJMHhGQwotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfQklHCQkyCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9MSVRUTEUJCTB4M0YKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19CSUcJCTB4MDMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHCTMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0xJVFRMRQkJMHhDMAotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTElUVExFCQk2Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0JJRwkJMHhFMAotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfQklHCQk1Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19MSVRUTEUJCTB4MDcKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFCTIKLQotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfQklHCQkweDEwCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9CSUcJCTB4MEYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9MSVRUTEUJCTB4RjAKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcJMAotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZXh0X2V4dCB7Ci0Jc3RydWN0CXN5bV9leHQgZXNfYXN5bTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZXNfYml0czJbM107Ci0JdW5zaWduZWQgY2hhcgllc19pZmRbNF07Ci19OwotCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfQklHCQkweDgwCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfTElUVExFCQkweDAxCi0KLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHCTB4NDAKLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFCTB4MDIKLQotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9CSUcJCTB4MjAKLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFCTB4MDQKLQotLyogRGVuc2UgbnVtYmVycyBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGRucl9leHQgewotCXVuc2lnbmVkIGNoYXIJZF9yZmRbNF07Ci0JdW5zaWduZWQgY2hhcglkX2luZGV4WzRdOwotfTsKLQotLyogUmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yICovCi0KLXN0cnVjdCByZmRfZXh0IHsKLSAgdW5zaWduZWQgY2hhcglyZmRbNF07Ci19OwotCi0vKiBPcHRpbWl6ZXIgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgb3B0X2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMVsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMyWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czNbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzNFsxXTsKLSAgc3RydWN0IHJuZHhfZXh0IG9fcm5keDsKLSAgdW5zaWduZWQgY2hhciBvX29mZnNldFs0XTsKLX07Ci0KLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRQkwCi0KLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9CSUcJMAotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hcG9sbG8uaCBiL2luY2x1ZGUvY29mZi9hcG9sbG8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzNDdmMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXBvbGxvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBBcG9sbG8gTTY4SyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBNb3Rvcm9sYSA2ODAwMC82ODAwOC82ODAxMC82ODAyMCAqLwotI2RlZmluZQlNQzY4TUFHSUMJMDUyMAotI2RlZmluZSBNQzY4S1dSTUFHSUMJMDUyMAkvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNQzY4VFZNQUdJQwkwNTIxCi0jZGVmaW5lIE1DNjhLUk9NQUdJQwkwNTIxCS8qIHJlYWRvbmx5IHNoYXJlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIE1DNjhLUEdNQUdJQwkwNTIyCS8qIGRlbWFuZCBwYWdlZCB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU02OE1BR0lDCTAyMTAKLSNkZWZpbmUJTTY4VFZNQUdJQwkwMjExCi0KLS8qIEFwb2xsbyA2ODAwMC1iYXNlZCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IG1hZ2ljIG51bWJlci4gVGhpcyBjb21lcwotICogZnJvbSAvdXNyL2luY2x1ZGUvYXBvbGxvL2ZpbGVoZHIuaAotICovCi0jZGVmaW5lIEFQT0xMT002OEtNQUdJQyAwNjI3Ci0KLSNkZWZpbmUgT01BR0lDIE02OE1BR0lDCi0jZGVmaW5lIE02OEtCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUM2OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhLV1JNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4VFZNQUdJQykgJiYgXAotICAoKHgpLmZfbWFnaWMhPU1DNjhLUk9NQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1BHTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TTY4TUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TTY4VFZNQUdJQykgICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1BUE9MTE9NNjhLTUFHSUMpICkKLQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhcglvX3NyaVs0XTsJCS8qIEFwb2xsbyBzcGVjaWZpYyAtIC5zcmkgZGF0YSBwb2ludGVyICovCi0gIGNoYXIgIG9faW5saWJbNF07CQkvKiBBcG9sbG8gc3BlY2lmaWMgLSAuaW5saWIgZGF0YSBwb2ludGVyICovCi0gIGNoYXIJdmlkWzhdOwkJCS8qIEFwb2xsbyBzcGVjaWZpYyAtIDY0IGJpdCB2ZXJzaW9uIElEICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lCUFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSIDEgLyogdGhlIHZhbHVlIG9mIHRoZSBhb3V0aGRyIG1hZ2ljICovCi0jZGVmaW5lCUFPVVRIRFJTWiA0NAotI2RlZmluZSBBT1VUU1ogNDQKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCS8qIEFwb2xsbyBhbGxvdyBmb3IgbGFyZ2VyIHNlY3Rpb24gbmFtZXMgYnkgIGFsbG93aW5nIGl0IHRvIGJlIGluCi0JICogdGhlIHN0cmluZyB0YWJsZS4KLQkgKi8KLQljaGFyCQlzX25hbWVbOF07Ci0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBJZiBzX3plb3JlcyBpcyBhbGwgemVyb2VzLCBzX29mZnNldCBnaXZlcyB0aGUgcmVhbCBsb2NhdGlvbiBvZiB0aGUgbmFtZQotICogaW4gdGhlIHN0cmluZyB0YWJsZS4KLSAqLwotCi0jZGVmaW5lCXNfemVyb2VzIHNlY3Rpb25fbmFtZS5zX25hbWUKLSNkZWZpbmUJc19vZmZzZXQgKHNlY3Rpb25fbmFtZS5zX25hbWUrNCkKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfVFYJIi50diIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0jZGVmaW5lCV9MSU5FUwkiLmxpbmVzIgotI2RlZmluZQlfQkxPQ0tTCSIuYmxvY2tzIgotI2RlZmluZSBfU1JJICAgICIuc3JpIiAgICAgICAgICAgICAgICAgIC8qIFN0YXRpYyBSZXNvdXJjZSBJbmZvcm1hdGlvbiAoc3lzdHlwZSwKLSBldCBhbC4pICovCi0jZGVmaW5lIF9NSVIgICAgIi5taXIiICAgICAgICAgICAgICAgICAgLyogTW9kdWxlIEluZm9ybWF0aW9uIFJlY29yZHMgICovCi0jZGVmaW5lIF9BUFRWICAgIi5hcHR2IiAgICAgICAgICAgICAgICAgLyogQXBvbGxvLXN0eWxlIHRyYW5zZmVyIHZlY3RvcnMuICovCi0jZGVmaW5lIF9JTkxJQiAgIi5pbmxpYiIgICAgICAgICAgICAgICAgLyogU2hhcmVkIExpYnJhcnkgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgX1JXREkgICAiLnJ3ZGkiICAgICAgICAgLyogUmVhZC93cml0ZSBkYXRhIGluaXRpYWxpemF0aW9uIGRpcmVjdGl2ZXMgZm9yCi0gY29tcHJlc3NlZCBzZWN0aW9ucyAqLwotI2RlZmluZSBfVU5XSU5EICIudW53aW5kIiAgICAgICAgICAgICAgIC8qIFN0YWNrIHVud2luZCBpbmZvcm1hdGlvbiAqLwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotI2lmZGVmIE02OEtfQ09GRl9PRkZTRVQKLSAgY2hhciByX29mZnNldFs0XTsKLSNlbmRpZgotCi19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0KLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0jZGVmaW5lIFJFTFNaIDE0Ci0jZWxzZQotI2RlZmluZSBSRUxTWiAxMAotI2VuZGlmCi0KLS8qIEFwb2xsbyBzcGVjaWZpYyBTVFlQIGZsYWdzICovCi0KLSNkZWZpbmUgU1RZUF9SRUxPQ0FURURfTk9UX0xPQURFRCAweDAwMDEwMDAwCS8qIFNlY3Rpb24gaXMgcmVsb2NhdGVkIG5vcm1hbGx5IGR1cmluZyBsaW5raW5nLCBidXQgbmVlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgbm90IGJlIGxvYWRlZCBkdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24gKi8KLSNkZWZpbmUgU1RZUF9ERUJVRyAgICAgICAgICAgICAgMHgwMDAyMDAwMAkvKiBkZWJ1ZyBzZWN0aW9uICovCi0jZGVmaW5lIFNUWVBfT1ZFUkxBWQkJMHgwMDA0MDAwMAkvKiBTZWN0aW9uIGlzIG92ZXJsYXllZCAqLwotI2RlZmluZSBTVFlQX0lOU1RSVUNUSU9OICAgIAkweDAwMjAwMDAwCS8qIFNlY3Rpb24gY29udGFpbnMgZXhlY3V0YWJsZSBjb2RlICovCi0KLSNkZWZpbmUgU1RZUF9aRVJPCQkweDAwODAwMDAwCS8qIFNlY3Rpb24gaXMgaW5pdGlhbGl6ZWQgdG8gemVybyAqLwotI2RlZmluZSBTVFlQX0lOU1RBTExFRAkJMHgwMjAwMDAwMAkvKiBTZWN0aW9uIHNob3VsZCBiZSBpbnN0YWxsYWJsZSBpbiBLR1QgKi8KLSNkZWZpbmUgU1RZUF9MT09LX0lOU1RBTExFRAkweDA0MDAwMDAwCS8qIExvb2sgZm9yIHNlY3Rpb24gaW4gS0dUICovCi0jZGVmaW5lIFNUWVBfU0VDQUxJR04xCQkweDA4MDAwMDAwCS8qIFNwZWNpYWxseSBhbGlnbmVkIHNlY3Rpb24gKi8KLSNkZWZpbmUgU1RZUF9TRUNBTElHTjIJCTB4MTAwMDAwMDAJLyogICAgICAiICAgICAgICIgICAgICAgIiAgICAqLwotI2RlZmluZSBTVFlQX0NPTVBSRVNTRUQJCTB4MjAwMDAwMDAJLyogTm8gc2VjdGlvbiBkYXRhIHBlciBzZSAoc19zY25wdHIgPSAwKSwgYnV0IHRoZXJlIGFyZQotCQkJCQkJICAgaW5pdGlhbGl6YXRpb24gZGlyZWN0aXZlcyBmb3IgaXQgaW4gLnJ3ZGkgc2VjdGlvbgotCQkJCQkJICAgKHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTVFlQX0JTUykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hcm0uaCBiL2luY2x1ZGUvY29mZi9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkMGM4ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciB0aGUgQVJNICovCi0KLSNkZWZpbmUgQ09GRkFSTSAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqICAgICAgRl9JTlRFUldPUksgICAgIGZpbGUgc3VwcG9ydHMgc3dpdGNoaW5nIGJldHdlZW4gQVJNIGFuZCBUaHVtYiBpbnN0cnVjdGlvbiBzZXRzCi0gKiAgICAgIEZfSU5URVJXT1JLX1NFVCB0aGUgRl9JTlRFUldPUksgYml0IGlzIHZhbGlkCi0gKglGX0FQQ1NfRkxPQVQJY29kZSBwYXNzZXMgZmxvYXQgYXJndW1lbnRzIGluIGZsb2F0IHJlZ2lzdGVycwotICoJRl9QSUMJCWNvZGUgaXMgcmVlbnRyYW50L3Bvc2l0aW9uLWluZGVwZW5kZW50Ci0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqCUZfQVBDU18yNglmaWxlIHVzZXMgMjYgYml0IEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZAotICoJRl9BUENTX1NFVAl0aGUgRl9BUENTXzI2LCBGX0FQQ1NfRkxPQVQgYW5kIEZfUElDIGJpdHMgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKLSNkZWZpbmUgRl9JTlRFUldPUktfU0VUCSgweDAwMjApCi0jZGVmaW5lIEZfQVBDU19GTE9BVAkoMHgwMDQwKQotI3VuZGVmICBGX0FSMTZXUgotI2RlZmluZSBGX1BJQwkJKDB4MDA4MCkKLSNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKLSNkZWZpbmUgRl9BUENTXzI2CSgweDA0MDApCi0jZGVmaW5lIEZfQVBDU19TRVQJKDB4MDgwMCkKLQotLyogQml0cyBzdG9yZWQgaW4gZmxhZ3MgZmllbGQgb2YgdGhlIGludGVybmFsX2Ygc3RydWN0dXJlICovCi0KLSNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKLSNkZWZpbmUgRl9BUENTX0ZMT0FUCSgweDAwNDApCi0jZGVmaW5lIEZfUElDCQkoMHgwMDgwKQotI2RlZmluZSBGX0FQQ1MyNgkoMHgxMDAwKQotI2RlZmluZSBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSyAoMHg0MDAwKzB4MDgwMCsweDA0MDApCi0jZGVmaW5lIEZfQVJNXzIJCSgweDA0MDApCi0jZGVmaW5lIEZfQVJNXzJhCSgweDA4MDApCi0jZGVmaW5lIEZfQVJNXzMJCSgweDBjMDApCi0jZGVmaW5lIEZfQVJNXzNNCSgweDQwMDApCi0jZGVmaW5lIEZfQVJNXzQJCSgweDQ0MDApCi0jZGVmaW5lIEZfQVJNXzRUCSgweDQ4MDApCi0jZGVmaW5lIEZfQVJNXzUJCSgweDRjMDApCi0KLS8qCi0gKiBBUk1NQUdJQyBvdWdodCB0byBlbmNvZGVkIHRoZSBwcm9jZXNvciB0eXBlLAotICogYnV0IGl0IGlzIHRvbyBsYXRlIHRvIGNoYW5nZSBpdCBub3csIGluc3RlYWQKLSAqIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUKLSAqIGlzIHVzZWQgYXMgc2hvd24gYWJvdmUuCi0gKgotICogWFhYIC0gTkMgNS82Lzk3Ci0gKi8KLQotI2RlZmluZQlBUk1NQUdJQwkweGEwMCAgLyogSSBqdXN0IG1hZGUgdGhpcyB1cCAqLyAKLQotI2RlZmluZSBBUk1CQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBBUk1NQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0KLQotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotCi0vKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAgIAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyogV2UgdXNlIHRoZSAucmRhdGEgc2VjdGlvbiB0byBob2xkIHJlYWQgb25seSBkYXRhLiAgKi8KLSNkZWZpbmUgX0xJVAkiLnJkYXRhIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JCWNoYXIgeF9jaGVja3N1bVs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLQkJY2hhciB4X2Fzc29jaWF0ZWRbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLQkJY2hhciB4X2NvbWRhdFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaCBiL2luY2x1ZGUvY29mZi9hdXgtY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODljMTI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9hdXgtY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogTW9kaWZpY2F0aW9ucyBvZiBpbnRlcm5hbC5oIGFuZCBtNjhrLmggbmVlZGVkIGJ5IEEvVVgKLSAgIFN1Z2dlc3RlZCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4gKi8KLQotI2lmbmRlZiBHTlVfQ09GRl9BVVhfSAotI2RlZmluZSBHTlVfQ09GRl9BVVhfSCAxCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9tNjhrLmgiCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgNjQtYnl0ZSBwYWRkZWQgcGF0aG5hbWVzIG9mIHNoYXJlZCBsaWJyYXJpZXMgKi8KLSN1bmRlZiBTVFlQX0xJQgotI2RlZmluZSBTVFlQX0xJQiAweDIwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGNvZGUgKi8KLSN1bmRlZiBTVFlQX0lOSVQKLSNkZWZpbmUgU1RZUF9JTklUIDB4NDAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgLmlkZW50IGluZm9ybWF0aW9uICovCi0jdW5kZWYgU1RZUF9JREVOVAotI2RlZmluZSBTVFlQX0lERU5UIDB4ODAwCi0KLS8qIFNlY3Rpb24gdHlwZXMgdXNlZCBieSBiZmQgYW5kIGdhcyBub3QgZGVmaW5lZCAoZGlyZWN0bHkpIGJ5IEEvVVggKi8KLSN1bmRlZiBTVFlQX09WRVIKLSNkZWZpbmUgU1RZUF9PVkVSIDAKLSN1bmRlZiBTVFlQX0lORk8KLSNkZWZpbmUgU1RZUF9JTkZPIFNUWVBfSURFTlQKLQotLyogVHJhZGl0aW9uYWwgbmFtZSBvZiB0aGUgc2VjdGlvbiB0YWdnZWQgd2l0aCBTVFlQX0xJQiAqLwotI2RlZmluZSBfTElCICIubGliIgotCi0jZW5kaWYgLyogR05VX0NPRkZfQVVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9lY29mZi5oIGIvaW5jbHVkZS9jb2ZmL2Vjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDIwMmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2Vjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotI2lmbmRlZiBFQ09GRl9ICi0jZGVmaW5lIEVDT0ZGX0gKLQotLyogR2VuZXJpYyBFQ09GRiBzdXBwb3J0LgotICAgVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHN5bWJvbCBpbmZvcm1hdGlvbiwgZm91bmQgaW4gc3ltLmggYW5kCi0gICBzeW1jb25zdC5oLiAgKi8KLQotLyogTWlwcyBtYWdpYyBudW1iZXJzIHVzZWQgaW4gZmlsZWhkci4gIE1JUFNfTUFHSUNfTElUVExFIGlzIHVzZWQgb24KLSAgIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMuICBNSVBTX01BR0lDX0JJRyBpcyB1c2VkIG9uIGJpZyBlbmRpYW4KLSAgIG1hY2hpbmVzLiAgV2hlcmUgaXMgTUlQU19NQUdJQ18xIGZyb20/ICAqLwotI2RlZmluZSBNSVBTX01BR0lDXzEgMHgwMTgwCi0jZGVmaW5lIE1JUFNfTUFHSUNfTElUVExFIDB4MDE2MgotI2RlZmluZSBNSVBTX01BR0lDX0JJRyAweDAxNjAKLQotLyogVGhlc2UgYXJlIHRoZSBtYWdpYyBudW1iZXJzIHVzZWQgZm9yIE1JUFMgY29kZSBjb21waWxlZCBhdCBJU0EKLSAgIGxldmVsIDIuICAqLwotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRTIgMHgwMTY2Ci0jZGVmaW5lIE1JUFNfTUFHSUNfQklHMiAweDAxNjMKLQotLyogVGhlc2UgYXJlIHRoZSBtYWdpYyBudW1iZXJzIHVzZWQgZm9yIE1JUFMgY29kZSBjb21waWxlZCBhdCBJU0EKLSAgIGxldmVsIDMuICAqLwotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRTMgMHgxNDIKLSNkZWZpbmUgTUlQU19NQUdJQ19CSUczIDB4MTQwCi0KLS8qIEFscGhhIG1hZ2ljIG51bWJlcnMgdXNlZCBpbiBmaWxlaGRyLiAgKi8KLSNkZWZpbmUgQUxQSEFfTUFHSUMgMHgxODMKLSNkZWZpbmUgQUxQSEFfTUFHSUNfQlNEIDB4MTg1Ci0KLS8qIE1hZ2ljIG51bWJlcnMgdXNlZCBpbiBhLm91dCBoZWFkZXIuICAqLwotI2RlZmluZSBFQ09GRl9BT1VUX09NQUdJQyAwNDA3CS8qIG5vdCBkZW1hbmQgcGFnZWQgKGxkIC1OKS4gICovCi0jZGVmaW5lIEVDT0ZGX0FPVVRfWk1BR0lDIDA0MTMJLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0KLS8qIE5hbWVzIG9mIHNwZWNpYWwgc2VjdGlvbnMuICAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0jZGVmaW5lIF9SREFUQQkiLnJkYXRhIgotI2RlZmluZSBfU0RBVEEJIi5zZGF0YSIKLSNkZWZpbmUgX1NCU1MJIi5zYnNzIgotI2RlZmluZSBfTElUQQkiLmxpdGEiCi0jZGVmaW5lIF9MSVQ0CSIubGl0NCIKLSNkZWZpbmUgX0xJVDgJIi5saXQ4IgotI2RlZmluZSBfTElCCSIubGliIgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLSNkZWZpbmUgX1BEQVRBCSIucGRhdGEiCi0jZGVmaW5lIF9YREFUQQkiLnhkYXRhIgotI2RlZmluZSBfR09UCSIuZ290IgotI2RlZmluZSBfSEFTSAkiLmhhc2giCi0jZGVmaW5lIF9EWU5TWU0JIi5keW5zeW0iCi0jZGVmaW5lIF9EWU5TVFIJIi5keW5zdHIiCi0jZGVmaW5lIF9SRUxEWU4JIi5yZWwuZHluIgotI2RlZmluZSBfQ09ORkxJQyAiLmNvbmZsaWMiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQkxJU1QgIi5saWJsaXN0IgotI2RlZmluZSBfRFlOQU1JQyAiLmR5bmFtaWMiCi0jZGVmaW5lIF9SQ09OU1QJIi5yY29uc3QiCi0KLS8qIEVDT0ZGIHVzZXMgc29tZSBhZGRpdGlvbmFsIHNlY3Rpb24gZmxhZ3MuICAqLwotI2RlZmluZSBTVFlQX1JEQVRBCSAgICAgMHgxMDAKLSNkZWZpbmUgU1RZUF9TREFUQQkgICAgIDB4MjAwCi0jZGVmaW5lIFNUWVBfU0JTUwkgICAgIDB4NDAwCi0jZGVmaW5lIFNUWVBfR09UCSAgICAweDEwMDAKLSNkZWZpbmUgU1RZUF9EWU5BTUlDCSAgICAweDIwMDAKLSNkZWZpbmUgU1RZUF9EWU5TWU0JICAgIDB4NDAwMAotI2RlZmluZSBTVFlQX1JFTERZTgkgICAgMHg4MDAwCi0jZGVmaW5lIFNUWVBfRFlOU1RSCSAgIDB4MTAwMDAKLSNkZWZpbmUgU1RZUF9IQVNICSAgIDB4MjAwMDAKLSNkZWZpbmUgU1RZUF9MSUJMSVNUCSAgIDB4NDAwMDAKLSNkZWZpbmUgU1RZUF9DT05GTElDCSAgMHgxMDAwMDAKLSNkZWZpbmUgU1RZUF9FQ09GRl9GSU5JCSAweDEwMDAwMDAKLSNkZWZpbmUgU1RZUF9FWFRFTkRFU0MJIDB4MjAwMDAwMCAvKiAweDAyRkZGMDAwIGJpdHMgPT4gc2NuIHR5cGUsIHJlc3QgY2xyICovCi0jZGVmaW5lIFNUWVBfTElUQQkgMHg0MDAwMDAwCi0jZGVmaW5lIFNUWVBfTElUOAkgMHg4MDAwMDAwCi0jZGVmaW5lIFNUWVBfTElUNAkweDEwMDAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfTElCCTB4NDAwMDAwMDAKLSNkZWZpbmUgU1RZUF9FQ09GRl9JTklUIDB4ODAwMDAwMDAKLSNkZWZpbmUgU1RZUF9PVEhFUl9MT0FEIChTVFlQX0VDT0ZGX0lOSVQgfCBTVFlQX0VDT0ZGX0ZJTkkpCi0KLS8qIGV4dGVuZGVkIHNlY3Rpb24gdHlwZXMgKi8KLSNkZWZpbmUgU1RZUF9DT01NRU5UCSAweDIxMDAwMDAKLSNkZWZpbmUgU1RZUF9SQ09OU1QJIDB4MjIwMDAwMAotI2RlZmluZSBTVFlQX1hEQVRBCSAweDI0MDAwMDAKLSNkZWZpbmUgU1RZUF9QREFUQQkgMHgyODAwMDAwCi0KLS8qIFRoZSBsaW5rZXIgbmVlZHMgYSBzZWN0aW9uIHRvIGhvbGQgc21hbGwgY29tbW9uIHZhcmlhYmxlcyB3aGlsZQotICAgbGlua2luZy4gIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGNyZWF0ZSBpdCB3aGVuIHRoZSBsaW5rZXIKLSAgIG5lZWRzIGl0LCBzbyB3ZSBhbHdheXMgY3JlYXRlIG9uZSBmb3IgZWFjaCBCRkQuICBXZSB0aGVuIGF2b2lkCi0gICB3cml0aW5nIGl0IG91dC4gICovCi0jZGVmaW5lIFNDT01NT04gIi5zY29tbW9uIgotCi0vKiBJZiB0aGUgZXh0ZXJuIGJpdCBpbiBhIHJlbG9jIGlzIDEsIHRoZW4gcl9zeW1uZHggaXMgYW4gaW5kZXggaW50bwotICAgdGhlIGV4dGVybmFsIHN5bWJvbCB0YWJsZS4gIElmIHRoZSBleHRlcm4gYml0IGlzIDAsIHRoZW4gcl9zeW1uZHgKLSAgIGluZGljYXRlcyBhIHNlY3Rpb24sIGFuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBSRUxPQ19TRUNUSU9OX05PTkUJMAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1RFWFQJMQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1JEQVRBCTIKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9EQVRBCTMKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9TREFUQQk0Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fU0JTUwk1Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fQlNTCTYKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9JTklUCTcKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVQ4CTgKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVQ0CTkKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9YREFUQSAgICAxMAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1BEQVRBICAgIDExCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fRklOSSAgICAgMTIKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVRBICAgICAxMwotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0FCUyAgICAgIDE0Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fUkNPTlNUICAgMTUKLQotI2RlZmluZSBOVU1fUkVMT0NfU0VDVElPTlMgICAgIDE2Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUQUJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGdjYyB1c2VzIG1pcHMtdGZpbGUgdG8gb3V0cHV0IHR5cGUgaW5mb3JtYXRpb24gaW4gc3BlY2lhbCBzdGFicwotICAgZW50cmllcy4gIFRoZXNlIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbiBpbgotICAgZ2NjL2NvbmZpZy9taXBzLmguICBBdCBzb21lIHBvaW50LCB0aGVzZSBzaG91bGQgcHJvYmFibHkgZ28gaW50byBhCi0gICBzaGFyZWQgaW5jbHVkZSBmaWxlLCBidXQgY3VycmVudGx5IGdjYyBhbmQgZ2RiIGRvIG5vdCBzaGFyZSBhbnkKLSAgIGRpcmVjdG9yaWVzLiAqLwotI2RlZmluZSBDT0RFX01BU0sgMHg4RjMwMAotI2RlZmluZSBFQ09GRl9JU19TVEFCKHN5bSkgKCgoc3ltKS0+aW5kZXggJiAweEZGRjAwKSA9PSBDT0RFX01BU0spCi0jZGVmaW5lIEVDT0ZGX01BUktfU1RBQihjb2RlKSAoKGNvZGUpK0NPREVfTUFTSykKLSNkZWZpbmUgRUNPRkZfVU5NQVJLX1NUQUIoY29kZSkgKChjb2RlKS1DT0RFX01BU0spCi0jZGVmaW5lIFNUQUJTX1NZTUJPTCAiQHN0YWJzIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBDT0ZGICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGdjYyBhbHNvIHVzZXMgbWlwcy10ZmlsZSB0byBvdXRwdXQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBUaGVzZSBhcmUgdGhlIHZhbHVlcyBpdCB1c2VzIHdoZW4gb3V0cHV0dGluZyB0aGUgLnR5cGUgZGlyZWN0aXZlLgotICAgVGhlc2Ugc2hvdWxkIGFsc28gYmUgaW4gYSBzaGFyZWQgaW5jbHVkZSBmaWxlLiAgKi8KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBVVggKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGF1eGlsaWFyeSB0eXBlIGluZm9ybWF0aW9uIGlzIHRoZSBzYW1lIG9uIGFsbCBrbm93biBFQ09GRgotICAgdGFyZ2V0cy4gIEkgY2FuJ3Qgc2VlIGFueSByZWFzb24gdGhhdCBpdCB3b3VsZCBldmVyIGNoYW5nZSwgc28gSSBhbQotICAgZ29pbmcgdG8gZ2FtYmxlIGFuZCBkZWZpbmUgdGhlIGV4dGVybmFsIHN0cnVjdHVyZXMgaGVyZSwgaW4gdGhlCi0gICB0YXJnZXQgaW5kZXBlbmRlbnQgRUNPRkYgaGVhZGVyIGZpbGUuICBUaGUgaW50ZXJuYWwgZm9ybXMgYXJlCi0gICBkZWZpbmVkIGluIGNvZmYvc3ltLmgsIHdoaWNoIHdhcyBvcmlnaW5hbGx5IGRvbmF0ZWQgYnkgTUlQUwotICAgQ29tcHV0ZXIgU3lzdGVtcy4gICovCi0KLS8qIFR5cGUgaW5mb3JtYXRpb24gZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCB0aXJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXRfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxNDVbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxMDFbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxMjNbMV07Ci19OwotCi0jZGVmaW5lCVRJUl9CSVRTMV9GQklURklFTERfQklHCQkoKHVuc2lnbmVkIGludCkgMHg4MCkKLSNkZWZpbmUJVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCi0KLSNkZWZpbmUJVElSX0JJVFMxX0NPTlRJTlVFRF9CSUcJCSgodW5zaWduZWQgaW50KSAweDQwKQotI2RlZmluZQlUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMikKLQotI2RlZmluZQlUSVJfQklUUzFfQlRfQklHCQkoKHVuc2lnbmVkIGludCkgMHgzRikKLSNkZWZpbmUJVElSX0JJVFMxX0JUX1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUUzFfQlRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGQykKLSNkZWZpbmUJVElSX0JJVFMxX0JUX1NIX0xJVFRMRQkJMgotCi0jZGVmaW5lCVRJUl9CSVRTX1RRNF9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTRfU0hfQklHCQk0Ci0jZGVmaW5lCVRJUl9CSVRTX1RRNV9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTVfU0hfQklHCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRNF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTRfU0hfTElUVExFCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRNV9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTVfU0hfTElUVExFCQk0Ci0KLSNkZWZpbmUJVElSX0JJVFNfVFEwX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9TSF9CSUcJCTQKLSNkZWZpbmUJVElSX0JJVFNfVFExX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEwX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9TSF9MSVRUTEUJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFExX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9TSF9MSVRUTEUJCTQKLQotI2RlZmluZQlUSVJfQklUU19UUTJfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFEyX1NIX0JJRwkJNAotI2RlZmluZQlUSVJfQklUU19UUTNfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFEzX1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUU19UUTJfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFEyX1NIX0xJVFRMRQkJMAotI2RlZmluZQlUSVJfQklUU19UUTNfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFEzX1NIX0xJVFRMRQkJNAotCi0vKiBSZWxhdGl2ZSBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBybmR4X2V4dCB7Ci0JdW5zaWduZWQgY2hhcglyX2JpdHNbNF07Ci19OwotCi0jZGVmaW5lCVJORFhfQklUUzBfUkZEX1NIX0xFRlRfQklHCTQKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfU0hfQklHCQk0Ci0KLSNkZWZpbmUJUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9MSVRUTEUJMAotI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcJOAotI2RlZmluZQlSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTAKLQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfU0hfTElUVExFCTQKLSNkZWZpbmUJUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRQk0Ci0jZGVmaW5lCVJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogQXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiBleHRlcm5hbCByZWNvcmQgKi8KLQotdW5pb24gYXV4X2V4dCB7Ci0Jc3RydWN0IHRpcl9leHQJYV90aTsKLQlzdHJ1Y3Qgcm5keF9leHQJYV9ybmR4OwotCXVuc2lnbmVkIGNoYXIJYV9kbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCWFfZG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9pc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9pc3NbNF07Ci0JdW5zaWduZWQgY2hhcglhX3dpZHRoWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9jb3VudFs0XTsKLX07Ci0KLSNkZWZpbmUgQVVYX0dFVF9BTlkoYmlnZW5kLCBheCwgZmllbGQpIFwKLSAgKChiaWdlbmQpID8gYmZkX2dldGIzMiAoKGF4KS0+ZmllbGQpIDogYmZkX2dldGwzMiAoKGF4KS0+ZmllbGQpKQotCi0jZGVmaW5lCUFVWF9HRVRfRE5MT1coYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2RuTG93KQotI2RlZmluZQlBVVhfR0VUX0ROSElHSChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfZG5IaWdoKQotI2RlZmluZQlBVVhfR0VUX0lTWU0oYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2lzeW0pCi0jZGVmaW5lIEFVWF9HRVRfSVNTKGJpZ2VuZCwgYXgpCQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfaXNzKQotI2RlZmluZSBBVVhfR0VUX1dJRFRIKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV93aWR0aCkKLSNkZWZpbmUgQVVYX0dFVF9DT1VOVChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfY291bnQpCi0KLSNkZWZpbmUgQVVYX1BVVF9BTlkoYmlnZW5kLCB2YWwsIGF4LCBmaWVsZCkgXAotICAoKGJpZ2VuZCkgXAotICAgPyAoYmZkX3B1dGIzMiAoKGJmZF92bWEpICh2YWwpLCAoYXgpLT5maWVsZCksIDApIFwKLSAgIDogKGJmZF9wdXRsMzIgKChiZmRfdm1hKSAodmFsKSwgKGF4KS0+ZmllbGQpLCAwKSkKLQotI2RlZmluZSBBVVhfUFVUX0ROTE9XKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2RuTG93KQotI2RlZmluZSBBVVhfUFVUX0ROSElHSChiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9kbkhpZ2gpCi0jZGVmaW5lIEFVWF9QVVRfSVNZTShiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9pc3ltKQotI2RlZmluZSBBVVhfUFVUX0lTUyhiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9pc3MpCi0jZGVmaW5lIEFVWF9QVVRfV0lEVEgoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfd2lkdGgpCi0jZGVmaW5lIEFVWF9QVVRfQ09VTlQoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfY291bnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRm9yIGVmZmljaWVuY3ksIGdkYiBkZWFscyBkaXJlY3RseSB3aXRoIHRoZSB1bnN3YXBwZWQgc3ltYm9saWMKLSAgIGluZm9ybWF0aW9uICh0aGF0IHdheSBpdCBvbmx5IHRha2VzIHRoZSB0aW1lIHRvIHN3YXAgaW5mb3JtYXRpb24KLSAgIHRoYXQgaXQgcmVhbGx5IG5lZWRzIHRvIHJlYWQpLiAgZ2RiIG9yaWdpbmFsbHkgcmV0cmlldmVkIHRoZQotICAgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSB0aGUgQkZEIGJhY2tlbmQgaW5mb3JtYXRpb24sIGJ1dCB0aGF0Ci0gICBzdHJhdGVneSwgYmVzaWRlcyBiZWluZyBzb3J0IG9mIHVnbHksIGRvZXMgbm90IHdvcmsgZm9yIE1JUFMgRUxGLAotICAgd2hpY2ggYWxzbyB1c2VzIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgc3RydWN0dXJlIGhvbGRzCi0gICBwb2ludGVycyB0byB0aGUgKG1vc3RseSkgdW5zd2FwcGVkIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8KLXsKLSAgLyogVGhlIHN3YXBwZWQgRUNPRkYgc3ltYm9saWMgaGVhZGVyLiAgKi8KLSAgSERSUiBzeW1ib2xpY19oZWFkZXI7Ci0KLSAgLyogUG9pbnRlcnMgdG8gdGhlIHVuc3dhcHBlZCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCB0aGUKLSAgICAgcG9pbnRlcnMgdG8gZXh0ZXJuYWwgc3RydWN0dXJlcyBwb2ludCB0byBkaWZmZXJlbnQgc29ydHMgb2YKLSAgICAgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IEVDT0ZGIHRhcmdldHMuICBUaGUgZWNvZmZfZGVidWdfc3dhcAotICAgICBzdHJ1Y3R1cmUgcHJvdmlkZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3R1cmVzIGFuZCB0aGUgZnVuY3Rpb25zCi0gICAgIG5lZWRlZCB0byBzd2FwIHRoZSBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0LiAgVGhlc2UgcG9pbnRlcnMgYXJlCi0gICAgIGFsbCBwb2ludGVycyB0byBhcnJheXMsIG5vdCBzaW5nbGUgc3RydWN0dXJlcy4gIFRoZXkgd2lsbCBiZSBOVUxMCi0gICAgIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgb2YgdGhlIHJlbGV2YW50IHN0cnVjdHVyZS4gIFRoZXNlCi0gICAgIGZpZWxkcyBhcmUgYWxzbyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgdG8gb3V0cHV0IEVDT0ZGIGRlYnVnZ2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmxpbmU7Ci0gIFBUUiBleHRlcm5hbF9kbnI7CS8qIHN0cnVjdCBkbnJfZXh0ICovCi0gIFBUUiBleHRlcm5hbF9wZHI7CS8qIHN0cnVjdCBwZHJfZXh0ICovCi0gIFBUUiBleHRlcm5hbF9zeW07CS8qIHN0cnVjdCBzeW1fZXh0ICovCi0gIFBUUiBleHRlcm5hbF9vcHQ7CS8qIHN0cnVjdCBvcHRfZXh0ICovCi0gIHVuaW9uIGF1eF9leHQgKmV4dGVybmFsX2F1eDsKLSAgY2hhciAqc3M7Ci0gIGNoYXIgKnNzZXh0OwotICBQVFIgZXh0ZXJuYWxfZmRyOwkvKiBzdHJ1Y3QgZmRyX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfcmZkOwkvKiBzdHJ1Y3QgcmZkX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfZXh0OwkvKiBzdHJ1Y3QgZXh0X2V4dCAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGV5IG1heSBkaXNhcHBlYXIgYXQgc29tZQotICAgICBwb2ludC4gICovCi0gIGNoYXIgKnNzZXh0X2VuZDsKLSAgUFRSIGV4dGVybmFsX2V4dF9lbmQ7Ci0KLSAgLyogV2hlbiBsaW5raW5nLCB0aGlzIGZpZWxkIGhvbGRzIGEgbWFwcGluZyBmcm9tIHRoZSBpbnB1dCBGRFIKLSAgICAgbnVtYmVycyB0byB0aGUgb3V0cHV0IG51bWJlcnMsIGFuZCBpcyB1c2VkIHdoZW4gd3JpdGluZyBvdXQgdGhlCi0gICAgIGV4dGVybmFsIHN5bWJvbHMuICBJdCBpcyBOVUxMIGlmIG5vIG1hcHBpbmcgaXMgcmVxdWlyZWQuICAqLwotICBSRkRUICppZmRtYXA7Ci0KLSAgLyogVGhlIHN3YXBwZWQgRkRSIGluZm9ybWF0aW9uLiAgQ3VycmVudGx5IHRoaXMgaXMgbmV2ZXIgTlVMTCwgYnV0Ci0gICAgIGNvZGUgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayBpbiBjYXNlCi0gICAgIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlLiAgVGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXksIG5vdCBhCi0gICAgIHNpbmdsZSBzdHJ1Y3R1cmUuICAqLwotICBGRFIgKmZkcjsKLQotICAvKiBXaGVuIHJlbGF4aW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsIHdlIG1heSBuZWVkIHRvIGFkanVzdAotICAgICBzeW1ib2wgdmFsdWVzIHdoZW4gdGhleSBhcmUgb3V0cHV0LiAgVGhpcyBpcyBhIGxpbmtlZCBsaXN0IG9mCi0gICAgIHN0cnVjdHVyZXMgaW5kaWNhdGluZyBob3cgdmFsdWVzIHNob3VsZCBiZSBhZGp1c3RlZC4gIFRoZXJlIGlzIG5vCi0gICAgIHJlcXVpcmVtZW50IHRoYXQgdGhlIGVudHJpZXMgYmUgaW4gYW55IG9yZGVyLCBvciB0aGF0IHRoZXkgbm90Ci0gICAgIG92ZXJsYXAuICBUaGlzIGZpZWxkIGlzIG5vcm1hbGx5IE5VTEwsIGluIHdoaWNoIGNhc2Ugbm8KLSAgICAgYWRqdXN0bWVudHMgbmVlZCB0byBiZSBtYWRlLiAgKi8KLSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGhvdyB0byBhZGp1c3Qgc3ltYm9sIHZhbHVlcyB3aGVuCi0gICBvdXRwdXR0aW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUuICBUaGVzZSBhZGp1c3RtZW50cyBvbmx5IGFwcGx5IHRvCi0gICB0aGUgaW50ZXJuYWwgc3ltYm9scywgYXMgdGhlIGV4dGVybmFsIHN5bWJvbCB2YWx1ZXMgd2lsbCBjb21lIGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlIGFuZCBoYXZlIGFscmVhZHkgYmVlbiBhZGp1c3RlZC4gICovCi0KLXN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QKLXsKLSAgLyogTmV4dCBlbnRyeSBvbiBhZGp1c3RtZW50IGxpc3QuICAqLwotICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICpuZXh0OwotICAvKiBTdGFydGluZyBWTUEgb2YgYWRqdXN0bWVudC4gIFRoaXMgaXMgdGhlIFZNQSBpbiB0aGUgRUNPRkYgZmlsZSwKLSAgICAgbm90IHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBUaHVzIGl0IHNob3VsZAotICAgICBpbmRpY2F0ZSBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgc3RhcnQ7Ci0gIC8qIEVuZGluZyBWTUEgb2YgYWRqdXN0bWVudC4gICovCi0gIGJmZF92bWEgZW5kOwotICAvKiBBZGp1c3RtZW50LiAgVGhpcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIG9yCi0gICAgIEZEUi4gIFRoaXMgaXMgemVybyBmb3IgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5LiAgKi8KLSAgbG9uZyBhZGp1c3Q7Ci19OwotCi0vKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGJ5IHRoZSBFQ09GRiBmaW5kX25lYXJlc3RfbGluZSBmdW5jdGlvbi4gICovCi0KLXN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkKLXsKLSAgLyogQmFzZSBhZGRyZXNzIGluIC50ZXh0IG9mIHRoaXMgRkRSLiAgKi8KLSAgYmZkX3ZtYSBiYXNlX2FkZHI7Ci0gIEZEUiAqZmRyOwotfTsKLQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZQotewotICAvKiBBbGxvY2F0ZWQgbWVtb3J5IHRvIGhvbGQgZnVuY3Rpb24gYW5kIGZpbGUgbmFtZXMuICAqLwotICBjaGFyICpmaW5kX2J1ZmZlcjsKLQotICAvKiBGRFIgdGFibGUsIHNvcnRlZCBieSBhZGRyZXNzOiAqLwotICBsb25nIGZkcnRhYl9sZW47Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKmZkcnRhYjsKLQotICAvKiBDYWNoZSBlbnRyeSBmb3IgbW9zdCByZWNlbnRseSBmb3VuZCBsaW5lIGluZm9ybWF0aW9uLiAgVGhlIHNlY3QKLSAgICAgZmllbGQgaXMgTlVMTCBpZiB0aGlzIGNhY2hlIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdDsKLSAgICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgICBiZmRfdm1hIHN0b3A7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9ubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lX251bTsKLSAgICB9IGNhY2hlOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1dBUFBJTkcgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGdlbmVyaWMgRUNPRkYgY29kZSBuZWVkcyB0byBiZSBhYmxlIHRvIHN3YXAgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0IGluIHRoZSBzcGVjaWZpYyBmb3JtYXQgdXNlZCBieSBhIHBhcnRpY3VsYXIKLSAgIEVDT0ZGIGltcGxlbWVudGF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uCi0gICBuZWVkZWQgdG8gZG8gdGhpcy4gICovCi0KLXN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwCi17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBpbnQgc3ltX21hZ2ljOwotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIGJmZF9zaXplX3R5cGUgZGVidWdfYWxpZ247Ci0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9kbnJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9vcHRfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZmRfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZTsKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIHZvaWQgKCpzd2FwX2hkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgSERSUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX2Rucl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRE5SICopKTsKLSAgdm9pZCAoKnN3YXBfcGRyX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBQRFIgKikpOwotICB2b2lkICgqc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpOwotICB2b2lkICgqc3dhcF9vcHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIE9QVFIgKikpOwotICB2b2lkICgqc3dhcF9mZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEZEUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JmZF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSk7Ci0gIHZvaWQgKCpzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3Rpcl9pbikgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqLCBUSVIgKikpOwotICB2b2lkICgqc3dhcF9ybmR4X2luKSBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCBybmR4X2V4dCAqLCBSTkRYUiAqKSk7Ci0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgdm9pZCAoKnN3YXBfaGRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEhEUlIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2Rucl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBETlIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3Bkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpOwotICB2b2lkICgqc3dhcF9vcHRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgT1BUUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfcmZkX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFJGRFQgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2V4dF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpOwotICB2b2lkICgqc3dhcF90aXJfb3V0KSBQQVJBTVMgKChpbnQsIGNvbnN0IFRJUiAqLCBzdHJ1Y3QgdGlyX2V4dCAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JuZHhfb3V0KSBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7Ci0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgc3ltYm9sIGRhdGEgYW5kIHNldCB1cCBwb2ludGVycyBpbgotICAgICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4gIFRoZSBzZWN0aW9uIGFyZ3VtZW50IGlzIHVzZWQgZm9yCi0gICAgIEVMRiwgbm90IHN0cmFpZ2h0IEVDT0ZGLiAgKi8KLSAgYm9vbGVhbiAoKnJlYWRfZGVidWdfaW5mbykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOwotfTsKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoRUNPRkZfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9nbzMyZXhlLmggYi9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQyNmMxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9nbzMyZXhlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiBDT0ZGIGluZm9ybWF0aW9uIGZvciBQQyBydW5uaW5nIGdvMzIuICAqLwotCi0jZGVmaW5lIFNUVUJTSVpFIDIwNDgKLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHJfZ28zMl9leGUgewotCWNoYXIgc3R1YltTVFVCU0laRV07CS8qIHRoZSBzdHViIHRvIGxvYWQgdGhlIGltYWdlCSovCi0JLyogdGhlIHN0YW5kYXJkIENPRkYgaGVhZGVyICovCi0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI3VuZGVmIEZJTEhEUgotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHJfZ28zMl9leGUKLSN1bmRlZiBGSUxIU1oKLSNkZWZpbmUJRklMSFNaCVNUVUJTSVpFKzIwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaDgzMDAuaCBiL2luY2x1ZGUvY29mZi9oODMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyMzk0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9oODMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBIOC8zMDAgYW5kIEg4LzMwMC1IICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlIODMwME1BR0lDCTB4ODMwMAotI2RlZmluZQlIODMwMEhNQUdJQwkweDgzMDEKLSNkZWZpbmUJSDgzMDBTTUFHSUMJMHg4MzAyCi0KLSNkZWZpbmUgSDgzMDBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBNQUdJQykpCi0jZGVmaW5lIEg4MzAwSEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwMEhNQUdJQykpCi0jZGVmaW5lIEg4MzAwU0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwMFNNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9oODUwMC5oIGIvaW5jbHVkZS9jb2ZmL2g4NTAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDViZjJiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9oODUwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBIOC81MDAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCUg4NTAwTUFHSUMJMHg4NTAwCi0KLQotI2RlZmluZSBIODUwMEJBRE1BRyh4KSAoKDB4ZmZmZiAmJiAoKHgpLmZfbWFnaWMpIT1IODUwME1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2kzODYuaCBiL2luY2x1ZGUvY29mZi9pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYmY0YTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2kzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEludGVsIDM4Ni80ODYuICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLQotCi0jZGVmaW5lCUkzODZNQUdJQwkweDE0YwotI2RlZmluZSBJMzg2UFRYTUFHSUMJMHgxNTQKLSNkZWZpbmUgSTM4NkFJWE1BR0lDCTB4MTc1Ci0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJMDQxNQotCi0jZGVmaW5lIEkzODZCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBJMzg2TUFHSUMpIFwKLQkJICAgICAgICYmICh4KS5mX21hZ2ljICE9IEkzODZBSVhNQUdJQyBcCi0JCSAgICAgICAmJiAoeCkuZl9tYWdpYyAhPSBJMzg2UFRYTUFHSUMgXAotCQkgICAgICAgJiYgKHgpLmZfbWFnaWMgIT0gTFlOWENPRkZNQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLQotCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0KLS8qIGRlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzICovCi0vKiAgI2RlZmluZSBOVF9JTUFHRV9CQVNFICAgICAgICAweDQwMDAwMCBtb3ZlZCB0byBpbnRlcm5hbC5oICovCi0jZGVmaW5lIE5UX1NFQ1RJT05fQUxJR05NRU5UIDB4MTAwMAotI2RlZmluZSBOVF9GSUxFX0FMSUdOTUVOVCAgICAweDIwMAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JCWNoYXIgeF9jaGVja3N1bVs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLQkJY2hhciB4X2Fzc29jaWF0ZWRbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLQkJY2hhciB4X2NvbWRhdFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pODYwLmggYi9pbmNsdWRlL2NvZmYvaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzY4NmU5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pODYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyogVGhpcyBmaWxlIHdhcyBoYWNrZWQgZnJvbSBpMzg2LmggICBbZG9sYW5Ac3NkLmludGVsLmNvbV0gKi8KLQotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCA4NjAuICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLQotCi0KLSNkZWZpbmUJSTg2ME1BR0lDCTB4MTRkCi0KLSNkZWZpbmUgSTg2MEJBRE1BRyh4KSAgICgoeCkuZl9tYWdpYyAhPSBJODYwTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKiBGSVhNRTogV2hhdCBhcmUgdGhlIGEub3V0IG1hZ2ljIG51bWJlcnM/ICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0jCWRlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pOTYwLmggYi9pbmNsdWRlL2NvZmYvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM1ODM2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciA4MDk2MC4gIE9yaWdpbnM6IEludGVsIGNvcnAsIG5hdGNoLiAqLwotCi0vKiBOT1RFOiBUYWdlbnRyaWVzIChjZiBUQUdCSVRTKSBhcmUgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIDk2MCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZSBPTUFHSUMgICAgICAoMDQwNykJLyogb2xkIGltcHVyZSBmb3JtYXQuIGRhdGEgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93cyB0ZXh0LiBib3RoIHNlY3Rpb25zIGFyZSBydy4gKi8KLSNkZWZpbmUgTk1BR0lDICAgICAgKDA0MTApCS8qIHNwbGl0IGkmZCwgcmVhZC1vbmx5IHRleHQgKi8KLQotLyoKLSoJSW50ZWwgODA5NjAgKEk5NjApIHByb2Nlc3NvciBmbGFncy4KLSoJRl9JOTYwVFlQRSA9PSBtYXNrIGZvciBwcm9jZXNzb3IgdHlwZSBmaWVsZC4gCi0qLwotCi0jZGVmaW5lCUZfSTk2MFRZUEUJKDB4ZjAwMCkKLSNkZWZpbmUJRl9JOTYwQ09SRQkoMHgxMDAwKQotI2RlZmluZQlGX0k5NjBLQgkoMHgyMDAwKQotI2RlZmluZQlGX0k5NjBTQgkoMHgyMDAwKQotI2RlZmluZQlGX0k5NjBNQwkoMHgzMDAwKQotI2RlZmluZQlGX0k5NjBYQQkoMHg0MDAwKQotI2RlZmluZQlGX0k5NjBDQQkoMHg1MDAwKQotI2RlZmluZQlGX0k5NjBLQQkoMHg2MDAwKQotI2RlZmluZQlGX0k5NjBTQQkoMHg2MDAwKQotI2RlZmluZSBGX0k5NjBKWAkoMHg3MDAwKQotI2RlZmluZSBGX0k5NjBIWAkoMHg4MDAwKQotCi0KLS8qKiBpODA5NjAgTWFnaWMgTnVtYmVycwotKi8KLQotI2RlZmluZSBJOTYwUk9NQUdJQwkoMHgxNjApCS8qIHJlYWQtb25seSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIEk5NjBSV01BR0lDCSgweDE2MSkJLyogcmVhZC13cml0ZSB0ZXh0IHNlZ21lbnRzICovCi0KLSNkZWZpbmUgSTk2MEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1JOTYwUk9NQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1JOTYwUldNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nCXBoeXNfYWRkcjsKLQl1bnNpZ25lZCBsb25nCWJpdGFycmF5OwotfSBUQUdCSVRTOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyCXRhZ2VudHJpZXNbNF07CQkvKiBudW1iZXIgb2YgdGFnIGVudHJpZXMgdG8gZm9sbG93ICovCi19Ci1BT1VUSERSOwotCi0vKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0YWcgYml0cyBhcnJheSAqLwotCi0jZGVmaW5lIFRBR1BUUihhb3V0KSAoKFRBR0JJVFMgKikgKCYoYW91dC50YWdlbnRyaWVzKSsxKSkKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLS8qI2RlZmluZSBBT1VUU1ooYW91dCkgKHNpemVvZihBT1VUSERSKSsoYW91dC50YWdlbnRyaWVzKnNpemVvZihUQUdCSVRTKSkpKi8KLSNkZWZpbmUgQU9VVFNaIDMyCi0jZGVmaW5lIEFPVVRIRFJTWiAzMgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotCWNoYXIgCQlzX2FsaWduWzRdOwkvKiBzZWN0aW9uIGFsaWdubWVudAkJKi8KLX07Ci0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDQKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkJLyogbGluZSBudW1iZXIJCSovCi0JY2hhciBwYWRkaW5nWzJdOwkvKiBmb3JjZSBhbGlnbm1lbnQJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX2ZsYWdzWzJdOwotICBjaGFyIGVfdHlwZVs0XTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWQyWzJdOwotfTsKLQotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMHgxZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4NjApCi0jZGVmaW5lIE5fQlRTSEZUCSg1KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAgSTk2MC1zcGVjaWZpYyAqMm5kKiBhdXguIGVudHJ5IGZvcm1hdHMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXN0cnVjdCB7Ci0JICAvKiBUaGlzIGlzIGEgdmVyeSBvbGQgdHlwbyB0aGF0IGtlZXBzIGdldHRpbmcgcHJvcGFnYXRlZC4gKi8KLSNkZWZpbmUgeF9zdGRpbmR4IHhfc3RpbmR4Ci0JCWNoYXIgeF9zdGluZHhbNF07CS8qIHN5cy4gdGFibGUgZW50cnkgKi8KLQl9IHhfc2M7CS8qIHN5c3RlbSBjYWxsIGVudHJ5ICovCi0KLQlzdHJ1Y3QgewotCQljaGFyIHhfYmFsbnRyeVs0XTsgLyogQkFMIGVudHJ5IHBvaW50ICovCi0JfSB4X2JhbDsgLyogQkFMLWNhbGxhYmxlIGZ1bmN0aW9uICovCi0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3RpbWVzdGFtcFs0XTsJICAgICAgICAvKiB0aW1lIHN0YW1wICovCi0JCWNoYXIgCXhfaWRzdHJpbmdbMjBdOwkgICAgICAgIC8qIHByb2R1Y2VyIGlkZW50aXR5IHN0cmluZyAqLwotCX0geF9pZGVudDsJICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvZHVjZXIgaWRlbnQgaW5mbyAqLwotCi19OwotCi0KLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMjQKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMjQKLQotIwlkZWZpbmUgX0VURVhUCSJfZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHBhZFsyXTsKLX07Ci0KLS8qIHJfdHlwZSB2YWx1ZXMgZm9yIHRoZSBpOTYwLiAgKi8KLQotLyogVGhlIGk5NjAgdXNlcyBSX1JFTExPTkcsIHdoaWNoIGlzIGRlZmluZWQgaW4gaW50ZXJuYWwuaCBhcyAweDExLgotICAgSXQgaXMgYW4gYWJzb2x1dGUgMzIgYml0IHJlbG9jYXRpb24uICAqLwotCi0jZGVmaW5lIFJfSVBSTUVEIAkoMHgxOSkJLyogMjQtYml0IGlwLXJlbGF0aXZlIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgUl9PUFRDQUxMCSgweDFiKQkvKiAzMi1iaXQgb3B0aW1pemFibGUgY2FsbCAobGVhZnByb2Mvc3lzcHJvYykgKi8KLSNkZWZpbmUgUl9PUFRDQUxMWAkoMHgxYykJLyogNjQtYml0IG9wdGltaXphYmxlIGNhbGwgKGxlYWZwcm9jL3N5c3Byb2MpICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgcmVsb2NhdGlvbiB0eXBlcyBhcmUgZGVmaW5lZCB1c2UgYnkgcmVsYXhpbmcgbGlua2VycywKLSAgIHdoaWNoIGNvbnZlcnQgMzIgYml0IGNhbGxzICh3aGljaCByZXF1aXJlIGEgNjQgYml0IGluc3RydWN0aW9uKQotICAgaW50byAyNCBiaXQgY2FsbHMgKHdoaWNoIHJlcXVpcmUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24pIHdoZW4KLSAgIHBvc3NpYmxlLiAgSXQgd2lsbCBiZSBwb3NzaWJsZSB3aGVuZXZlciB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsIGlzCi0gICB3aXRoaW4gYSAyNCBiaXQgcmFuZ2Ugb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24uCi0KLSAgIEl0IGlzIGFsd2F5cyBzYWZlIHRvIGlnbm9yZSB0aGVzZSByZWxvY2F0aW9ucy4gIFRoZXkgb25seSBzZXJ2ZSB0bwotICAgbWFyayBwb2ludHMgd2hpY2ggdGhlIHJlbGF4aW5nIGxpbmtlciB3aWxsIGhhdmUgdG8gY29uc2lkZXIuICBUaGUKLSAgIGFzc2VtYmxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIGV2ZW4gaWYKLSAgIHRoZSByZWxvY2F0aW9ucyBhcmUgaWdub3JlZC4gIEluIHBhcnRpY3VsYXIsIHRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgIFJfSVBSMTMgcmVsb2NhdGlvbiBtYXkgbm90IGFwcGVhciB3aXRoIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLSNkZWZpbmUgUl9JUFIxMwkJKDB4MWQpCS8qIDEzIGJpdCBpcC1yZWxhdGl2ZSBicmFuY2ggKi8KLSNkZWZpbmUgUl9BTElHTgkJKDB4MWUpICAvKiBhbGlnbm1lbnQgbWFya2VyLiAgVGhpcyBoYXMgbm8KLQkJCQkgICBhc3NvY2lhdGVkIHN5bWJvbC4gIEluc3RlYWQsIHRoZQotCQkJCSAgIHJfc3ltbmR4IGZpZWxkIGluZGljYXRlcyB0aGUKLQkJCQkgICByZXF1aXJlIGFsaWdubWVudCBhdCB0aGlzIHBvaW50IGluCi0JCQkJICAgdGhlIGZpbGUuICBJdCBtdXN0IGJlIGEgcG93ZXIgb2YgMi4gICovCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEyCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pbnRlcm5hbC5oIGIvaW5jbHVkZS9jb2ZmL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTczMGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyogSW50ZXJuYWwgZm9ybWF0IG9mIENPRkYgb2JqZWN0IGZpbGUgZGF0YSBzdHJ1Y3R1cmVzLCBmb3IgR05VIEJGRC4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4gICovCi0KLSNpZm5kZWYgR05VX0NPRkZfSU5URVJOQUxfSAotI2RlZmluZSBHTlVfQ09GRl9JTlRFUk5BTF9IIDEKLQotLyogRmlyc3QsIG1ha2UgInNpZ25lZCBjaGFyIiB3b3JrLCBldmVuIG9uIG9sZCBjb21waWxlcnMuICovCi0jaWZuZGVmIHNpZ25lZAotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZQlzaWduZWQJCQkvKiovCi0jZW5kaWYKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBleHRyYSBzdHVmZiBpbiBhIFBFIGhlYWRlci4gKi8KLQotc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2ZpbGVoZHIKLXsKLSAgLyogRE9TIGhlYWRlciBkYXRhIGZvbGxvd3MgZm9yIFBFIHN0dWZmICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbWFnaWM7CS8qIE1hZ2ljIG51bWJlciwgMHg1YTRkICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY2JscDsJLyogQnl0ZXMgb24gbGFzdCBwYWdlIG9mIGZpbGUsIDB4OTAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jcDsJCS8qIFBhZ2VzIGluIGZpbGUsIDB4MyAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NybGM7CS8qIFJlbG9jYXRpb25zLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jcGFyaGRyOwkvKiBTaXplIG9mIGhlYWRlciBpbiBwYXJhZ3JhcGhzLCAweDQgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9taW5hbGxvYzsJLyogTWluaW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbWF4YWxsb2M7CS8qIE1heGltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4RkZGRiAqLwotICB1bnNpZ25lZCBzaG9ydCBlX3NzOwkJLyogSW5pdGlhbCAocmVsYXRpdmUpIFNTIHZhbHVlLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9zcDsJCS8qIEluaXRpYWwgU1AgdmFsdWUsIDB4YjggKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jc3VtOwkvKiBDaGVja3N1bSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfaXA7CQkvKiBJbml0aWFsIElQIHZhbHVlLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBDUyB2YWx1ZSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbGZhcmxjOwkvKiBGaWxlIGFkZHJlc3Mgb2YgcmVsb2NhdGlvbiB0YWJsZSwgMHg0MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX292bm87CS8qIE92ZXJsYXkgbnVtYmVyLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9yZXNbNF07CS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfb2VtaWQ7CS8qIE9FTSBpZGVudGlmaWVyIChmb3IgZV9vZW1pbmZvKSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfb2VtaW5mbzsJLyogT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9yZXMyWzEwXTsJLyogUmVzZXJ2ZWQgd29yZHMsIGFsbCAweDAgKi8KLSAgYmZkX3ZtYSAgZV9sZmFuZXc7CQkvKiBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIsIDB4ODAgKi8KLSAgdW5zaWduZWQgbG9uZyBkb3NfbWVzc2FnZVsxNl07IC8qIHRleHQgd2hpY2ggYWx3YXlzIGZvbGxvd3MgZG9zIGhlYWRlciAqLwotICBiZmRfdm1hICBudF9zaWduYXR1cmU7ICAgCS8qIHJlcXVpcmVkIE5UIHNpZ25hdHVyZSwgMHg0NTUwICovIAotfTsKLQotc3RydWN0IGludGVybmFsX2ZpbGVoZHIKLXsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2ZpbGVoZHIgcGU7Ci0KLSAgLyogc3RhbmRhcmQgY29mZiAgaW50ZXJuYWwgaW5mbyAqLwotICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICB1bnNpZ25lZCBzaG9ydCBmX25zY25zOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGxvbmcgZl90aW1kYXQ7CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgYmZkX3ZtYSBmX3N5bXB0cjsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgbG9uZyBmX25zeW1zOwkJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICB1bnNpZ25lZCBzaG9ydCBmX29wdGhkcjsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfZmxhZ3M7CS8qIGZsYWdzCQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl90YXJnZXRfaWQ7CS8qIChUSWM4MCBzcGVjaWZpYykJCSovCi19OwotCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjE2V1IJZmlsZSBpcyAxNi1iaXQgbGl0dGxlLWVuZGlhbgotICoJRl9BUjMyV1IJZmlsZSBpcyAzMi1iaXQgbGl0dGxlLWVuZGlhbgotICoJRl9BUjMyVwkJZmlsZSBpcyAzMi1iaXQgYmlnLWVuZGlhbgotICoJRl9EWU5MT0FECXJzLzYwMDAgYWl4OiBkeW5hbWljYWxseSBsb2FkYWJsZSB3L2ltcG9ydHMgJiBleHBvcnRzCi0gKglGX1NIUk9CSglycy82MDAwIGFpeDogZmlsZSBpcyBhIHNoYXJlZCBvYmplY3QKLSAqICAgICAgRl9ETEwgICAgICAgICAgIFBFIGZvcm1hdCBETEwKLSAqLwotCi0jZGVmaW5lCUZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lCUZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUJRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZQlGX0xTWU1TCQkoMHgwMDA4KQotI2RlZmluZQlGX0FSMTZXUgkoMHgwMDgwKQotI2RlZmluZQlGX0FSMzJXUgkoMHgwMTAwKQotI2RlZmluZQlGX0FSMzJXICAgICAJKDB4MDIwMCkKLSNkZWZpbmUJRl9EWU5MT0FECSgweDEwMDApCi0jZGVmaW5lCUZfU0hST0JKCSgweDIwMDApCi0jZGVmaW5lIEZfRExMICAgICAgICAgICAoMHgyMDAwKQotCi0vKiBleHRyYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBpbiB0aGUgb3B0aW9uYWwgaGVhZGVyICovCi10eXBlZGVmIHN0cnVjdCBfSU1BR0VfREFUQV9ESVJFQ1RPUlkgCi17Ci0gIGJmZF92bWEgVmlydHVhbEFkZHJlc3M7Ci0gIGxvbmcgICAgU2l6ZTsKLX0gIElNQUdFX0RBVEFfRElSRUNUT1JZOwotI2RlZmluZSBJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUyAgMTYKLQotLyogRGVmYXVsdCBpbWFnZSBiYXNlIGZvciBOVC4gICovCi0jZGVmaW5lIE5UX0VYRV9JTUFHRV9CQVNFIDB4NDAwMDAwCi0jZGVmaW5lIE5UX0RMTF9JTUFHRV9CQVNFIDB4MTAwMDAwMDAKLQotLyogRGVmYXVsdCBpbWFnZSBiYXNlIGZvciBCZU9TLiAqLwotI2RlZmluZSBCRU9TX0VYRV9JTUFHRV9CQVNFIDB4ODAwMDAwMDAKLSNkZWZpbmUgQkVPU19ETExfSU1BR0VfQkFTRSAweDEwMDAwMDAwCi0KLS8qIEV4dHJhIHN0dWZmIGluIGEgUEUgYW91dGhkciAqLwotCi0jZGVmaW5lIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgUEVfREVGX0ZJTEVfQUxJR05NRU5UIDB4MjAwCi0KLXN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIAotewotICAvKiBQRSBzdHVmZiAgKi8KLSAgYmZkX3ZtYSBJbWFnZUJhc2U7CQkvKiBhZGRyZXNzIG9mIHNwZWNpZmljIGxvY2F0aW9uIGluIG1lbW9yeSB0aGF0Ci0JCQkJICAgZmlsZSBpcyBsb2NhdGVkLCBOVCBkZWZhdWx0IDB4MTAwMDAgKi8KLQotICBiZmRfdm1hIFNlY3Rpb25BbGlnbm1lbnQ7CS8qIHNlY3Rpb24gYWxpZ25tZW50IGRlZmF1bHQgMHgxMDAwICovCi0gIGJmZF92bWEgRmlsZUFsaWdubWVudDsJLyogZmlsZSBhbGlnbm1lbnQgZGVmYXVsdCAweDIwMCAqLwotICBzaG9ydCAgIE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLyogbWluaW11bSB2ZXJzaW9uIG9mIHRoZSBvcGVyYXRpbmcgKi8KLSAgc2hvcnQgICBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8qIHN5c3RlbSByZXEnZCBmb3IgZXhlLCBkZWZhdWx0IHRvIDEqLwotICBzaG9ydCAgIE1ham9ySW1hZ2VWZXJzaW9uOwkvKiB1c2VyIGRlZmluZWFibGUgZmllbGQgdG8gc3RvcmUgdmVyc2lvbiBvZiAqLwotICBzaG9ydCAgIE1pbm9ySW1hZ2VWZXJzaW9uOwkvKiBleGUgb3IgZGxsIGJlaW5nIGNyZWF0ZWQsIGRlZmF1bHQgdG8gMCAqLyAKLSAgc2hvcnQgICBNYWpvclN1YnN5c3RlbVZlcnNpb247IC8qIG1pbmltdW0gc3Vic3lzdGVtIHZlcnNpb24gcmVxdWlyZWQgdG8gKi8KLSAgc2hvcnQgICBNaW5vclN1YnN5c3RlbVZlcnNpb247IC8qIHJ1biBleGU7IGRlZmF1bHQgdG8gMy4xICovCi0gIGxvbmcgICAgUmVzZXJ2ZWQxOwkJLyogc2VlbXMgdG8gYmUgMCAqLwotICBsb25nICAgIFNpemVPZkltYWdlOwkJLyogc2l6ZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgZm9yIHByb2cgKi8KLSAgbG9uZyAgICBTaXplT2ZIZWFkZXJzOwkvKiBzaXplIG9mIFBFIGhlYWRlciBhbmQgc2VjdGlvbiB0YWJsZSAqLwotICBsb25nICAgIENoZWNrU3VtOwkJLyogc2V0IHRvIDAgKi8KLSAgc2hvcnQgICBTdWJzeXN0ZW07CQotCi0gIC8qIHR5cGUgb2Ygc3Vic3lzdGVtIGV4ZSB1c2VzIGZvciB1c2VyIGludGVyZmFjZSwKLSAgICAgcG9zc2libGUgdmFsdWVzOgotICAgICAxIC0gTkFUSVZFICAgRG9lc24ndCByZXF1aXJlIGEgc3Vic3lzdGVtCi0gICAgIDIgLSBXSU5ET1dTX0dVSSBydW5zIGluIFdpbmRvd3MgR1VJIHN1YnN5c3RlbQotICAgICAzIC0gV0lORE9XU19DVUkgcnVucyBpbiBXaW5kb3dzIGNoYXIgc3ViLiAoY29uc29sZSBhcHApCi0gICAgIDUgLSBPUzJfQ1VJIHJ1bnMgaW4gT1MvMiBjaGFyYWN0ZXIgc3Vic3lzdGVtCi0gICAgIDcgLSBQT1NJWF9DVUkgcnVucyBpbiBQb3NpeCBjaGFyYWN0ZXIgc3Vic3lzdGVtICovCi0gIHNob3J0ICAgRGxsQ2hhcmFjdGVyaXN0aWNzOwkvKiBmbGFncyBmb3IgRExMIGluaXQsIHVzZSAwICovCi0gIGJmZF92bWEgU2l6ZU9mU3RhY2tSZXNlcnZlOwkvKiBhbW91bnQgb2YgbWVtb3J5IHRvIHJlc2VydmUgICovCi0gIGJmZF92bWEgU2l6ZU9mU3RhY2tDb21taXQ7CS8qIGFtb3VudCBvZiBtZW1vcnkgaW5pdGlhbGx5IGNvbW1pdHRlZCBmb3IgCi0JCQkJICAgaW5pdGlhbCB0aHJlYWQncyBzdGFjaywgZGVmYXVsdCBpcyAweDEwMDAgKi8KLSAgYmZkX3ZtYSBTaXplT2ZIZWFwUmVzZXJ2ZTsJLyogYW1vdW50IG9mIHZpcnR1YWwgbWVtb3J5IHRvIHJlc2VydmUgYW5kICovCi0gIGJmZF92bWEgU2l6ZU9mSGVhcENvbW1pdDsJLyogY29tbWl0LCBkb24ndCBrbm93IHdoYXQgdG8gZGVmYXV0IGl0IHRvICovCi0gIGxvbmcgICAgTG9hZGVyRmxhZ3M7CQkvKiBjYW4gcHJvYmFibHkgc2V0IHRvIDAgKi8KLSAgbG9uZyAgICBOdW1iZXJPZlJ2YUFuZFNpemVzOwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBuZXh0IGVudHJ5LCAxNiAqLwotICBJTUFHRV9EQVRBX0RJUkVDVE9SWSBEYXRhRGlyZWN0b3J5W0lNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTXTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyCi17Ci0gIHNob3J0IG1hZ2ljOwkJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBzaG9ydCB2c3RhbXA7CQkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGJmZF92bWEgdHNpemU7CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgYmZkX3ZtYSBkc2l6ZTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgYmZkX3ZtYSBic2l6ZTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgYmZkX3ZtYSBlbnRyeTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBiZmRfdm1hIHRleHRfc3RhcnQ7CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGJmZF92bWEgZGF0YV9zdGFydDsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLQotICAvKiBpOTYwIHN0dWZmICovCi0gIHVuc2lnbmVkIGxvbmcgdGFnZW50cmllczsJLyogbnVtYmVyIG9mIHRhZyBlbnRyaWVzIHRvIGZvbGxvdyAqLwotCi0gIC8qIFJTLzYwMDAgc3R1ZmYgKi8KLSAgdW5zaWduZWQgbG9uZyBvX3RvYzsJCS8qIGFkZHJlc3Mgb2YgVE9DCQkJKi8KLSAgc2hvcnQgb19zbmVudHJ5OwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGVudHJ5IHBvaW50ICovCi0gIHNob3J0IG9fc250ZXh0OwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIHRleHQJKi8KLSAgc2hvcnQgb19zbmRhdGE7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgZGF0YQkqLwotICBzaG9ydCBvX3NudG9jOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIHRvYwkqLwotICBzaG9ydCBvX3NubG9hZGVyOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGxvYWRlciBzZWN0aW9uICovCi0gIHNob3J0IG9fc25ic3M7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgYnNzCSovCi0gIHNob3J0IG9fYWxnbnRleHQ7CQkvKiBtYXggYWxpZ25tZW50IGZvciB0ZXh0CSovCi0gIHNob3J0IG9fYWxnbmRhdGE7CQkvKiBtYXggYWxpZ25tZW50IGZvciBkYXRhCSovCi0gIHNob3J0IG9fbW9kdHlwZTsJCS8qIE1vZHVsZSB0eXBlIGZpZWxkLCAxUixSRSxSTwkqLwotICBzaG9ydCBvX2NwdXR5cGU7CQkvKiBFbmNvZGVkIENQVSB0eXBlCQkqLwotICB1bnNpZ25lZCBsb25nIG9fbWF4c3RhY2s7CS8qIG1heCBzdGFjayBzaXplIGFsbG93ZWQuCSovCi0gIHVuc2lnbmVkIGxvbmcgb19tYXhkYXRhOwkvKiBtYXggZGF0YSBzaXplIGFsbG93ZWQuCSovCi0KLSAgLyogRUNPRkYgc3R1ZmYgKi8KLSAgYmZkX3ZtYSBic3Nfc3RhcnQ7CQkvKiBCYXNlIG9mIGJzcyBzZWN0aW9uLgkJKi8KLSAgYmZkX3ZtYSBncF92YWx1ZTsJCS8qIEdQIHJlZ2lzdGVyIHZhbHVlLgkJKi8KLSAgdW5zaWduZWQgbG9uZyBncHJtYXNrOwkvKiBHZW5lcmFsIHJlZ2lzdGVycyB1c2VkLgkqLwotICB1bnNpZ25lZCBsb25nIGNwcm1hc2tbNF07CS8qIENvcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkLgkqLwotICB1bnNpZ25lZCBsb25nIGZwcm1hc2s7CS8qIEZsb2F0aW5nIHBvaW50ZXIgcmVnaXN0ZXJzIHVzZWQuICAqLwotCi0gIC8qIEFwb2xsbyBzdHVmZiAqLwotICBsb25nIG9faW5saWI7CQkJLyogaW5saWIgZGF0YSAqLwotICBsb25nIG9fc3JpOwkJCS8qIFN0YXRpYyBSZXNvdXJjZSBJbmZvcm1hdGlvbiAqLwotICBsb25nIHZpZFsyXTsJCQkvKiBWZXJzaW9uIGlkICovCi0KLQotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZTsKLQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1RPUkFHRSBDTEFTU0VTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgdXNlZCB0byBiZSBkZWZpbmVkIGFzIC0xLCBidXQgbm93IG5fc2NsYXNzIGlzIHVuc2lnbmVkLiAgKi8KLSNkZWZpbmUgQ19FRkNOCQkweGZmCS8qIHBoeXNpY2FsIGVuZCBvZiBmdW5jdGlvbgkqLwotI2RlZmluZSBDX05VTEwJCTAKLSNkZWZpbmUgQ19BVVRPCQkxCS8qIGF1dG9tYXRpYyB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ19FWFQJCTIJLyogZXh0ZXJuYWwgc3ltYm9sCQkqLwotI2RlZmluZSBDX1NUQVQJCTMJLyogc3RhdGljCQkJKi8KLSNkZWZpbmUgQ19SRUcJCTQJLyogcmVnaXN0ZXIgdmFyaWFibGUJCSovCi0jZGVmaW5lIENfRVhUREVGCTUJLyogZXh0ZXJuYWwgZGVmaW5pdGlvbgkJKi8KLSNkZWZpbmUgQ19MQUJFTAkJNgkvKiBsYWJlbAkJCSovCi0jZGVmaW5lIENfVUxBQkVMCTcJLyogdW5kZWZpbmVkIGxhYmVsCQkqLwotI2RlZmluZSBDX01PUwkJOAkvKiBtZW1iZXIgb2Ygc3RydWN0dXJlCQkqLwotI2RlZmluZSBDX0FSRwkJOQkvKiBmdW5jdGlvbiBhcmd1bWVudAkJKi8KLSNkZWZpbmUgQ19TVFJUQUcJMTAJLyogc3RydWN0dXJlIHRhZwkJKi8KLSNkZWZpbmUgQ19NT1UJCTExCS8qIG1lbWJlciBvZiB1bmlvbgkJKi8KLSNkZWZpbmUgQ19VTlRBRwkJMTIJLyogdW5pb24gdGFnCQkJKi8KLSNkZWZpbmUgQ19UUERFRgkJMTMJLyogdHlwZSBkZWZpbml0aW9uCQkqLwotI2RlZmluZSBDX1VTVEFUSUMJMTQJLyogdW5kZWZpbmVkIHN0YXRpYwkJKi8KLSNkZWZpbmUgQ19FTlRBRwkJMTUJLyogZW51bWVyYXRpb24gdGFnCQkqLwotI2RlZmluZSBDX01PRQkJMTYJLyogbWVtYmVyIG9mIGVudW1lcmF0aW9uCSovCi0jZGVmaW5lIENfUkVHUEFSTQkxNwkvKiByZWdpc3RlciBwYXJhbWV0ZXIJCSovCi0jZGVmaW5lIENfRklFTEQJCTE4CS8qIGJpdCBmaWVsZAkJCSovCi0jZGVmaW5lIENfQVVUT0FSRwkxOQkvKiBhdXRvIGFyZ3VtZW50CQkqLwotI2RlZmluZSBDX0xBU1RFTlQJMjAJLyogZHVtbXkgZW50cnkgKGVuZCBvZiBibG9jaykJKi8KLSNkZWZpbmUgQ19CTE9DSwkJMTAwCS8qICIuYmIiIG9yICIuZWIiCQkqLwotI2RlZmluZSBDX0ZDTgkJMTAxCS8qICIuYmYiIG9yICIuZWYiCQkqLwotI2RlZmluZSBDX0VPUwkJMTAyCS8qIGVuZCBvZiBzdHJ1Y3R1cmUJCSovCi0jZGVmaW5lIENfRklMRQkJMTAzCS8qIGZpbGUgbmFtZQkJCSovCi0jZGVmaW5lIENfTElORQkJMTA0CS8qIGxpbmUgIyByZWZvcm1hdHRlZCBhcyBzeW1ib2wgdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgQ19BTElBUwkgCTEwNQkvKiBkdXBsaWNhdGUgdGFnCQkqLwotI2RlZmluZSBDX0hJRERFTgkxMDYJLyogZXh0IHN5bWJvbCBpbiBkbWVydCBwdWJsaWMgbGliICovCi0KLSNkZWZpbmUgQ19XRUFLRVhUCTEyNwkvKiB3ZWFrIHN5bWJvbCAtLSBHTlUgZXh0ZW5zaW9uICovCi0KLS8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFRJYzgwICovCi0jZGVmaW5lIENfVUVYVAkJMTkJLyogVGVudGF0aXZlIGV4dGVybmFsIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgQ19TVEFUTEFCCTIwCS8qIFN0YXRpYyBsb2FkIHRpbWUgbGFiZWwgKi8KLSNkZWZpbmUgQ19FWFRMQUIJMjEJLyogRXh0ZXJuYWwgbG9hZCB0aW1lIGxhYmVsICovCi0jZGVmaW5lIENfU1lTVEVNCTIzCS8qIFN5c3RlbSBXaWRlIHZhcmlhYmxlICovCi0KLS8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFdJTkRPV1NfTlQgICAqLwotI2RlZmluZSBDX1NFQ1RJT04gICAgICAgMTA0ICAgICAvKiBzZWN0aW9uIG5hbWUgKi8KLSNkZWZpbmUgQ19OVF9XRUFLCTEwNQkvKiB3ZWFrIGV4dGVybmFsICovCi0KLSAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciA4MDk2MCAqLwotCi0vKiBDX0xFQUZQUk9DIGlzIG9ic29sZXRlLiAgVXNlIENfTEVBRkVYVCBvciBDX0xFQUZTVEFUICovCi0jZGVmaW5lIENfTEVBRlBST0MJMTA4CS8qIExlYWYgcHJvY2VkdXJlLCAiY2FsbCIgdmlhIEJBTCAqLwotCi0jZGVmaW5lIENfU0NBTEwJCTEwNwkvKiBQcm9jZWR1cmUgcmVhY2hhYmxlIHZpYSBzeXN0ZW0gY2FsbCAqLwotI2RlZmluZSBDX0xFQUZFWFQgICAgICAgMTA4CS8qIEV4dGVybmFsIGxlYWYgKi8KLSNkZWZpbmUgQ19MRUFGU1RBVCAgICAgIDExMwkvKiBTdGF0aWMgbGVhZiAqLwotI2RlZmluZSBDX09QVFZBUgkxMDkJLyogT3B0aW1pemVkIHZhcmlhYmxlCQkqLwotI2RlZmluZSBDX0RFRklORQkxMTAJLyogUHJlcHJvY2Vzc29yICNkZWZpbmUJCSovCi0jZGVmaW5lIENfUFJBR01BCTExMQkvKiBBZHZpY2UgdG8gY29tcGlsZXIgb3IgbGlua2VyCSovCi0jZGVmaW5lIENfU0VHTUVOVAkxMTIJLyogODA5NjAgc2VnbWVudCBuYW1lCQkqLwotCi0gIC8qIFN0b3JhZ2UgY2xhc3NlcyBmb3IgbTg4ayAqLwotI2RlZmluZSBDX1NIQURPVyAgICAgICAgMTA3ICAgICAvKiBzaGFkb3cgc3ltYm9sICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENfVkVSU0lPTiAgICAgICAxMDggICAgIC8qIGNvZmYgdmVyc2lvbiBzeW1ib2wgICAgICAgICAgKi8KLQotIC8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFJTLzYwMDAgKi8KLSNkZWZpbmUgQ19ISURFWFQgICAgICAgIDEwNwkvKiBVbi1uYW1lZCBleHRlcm5hbCBzeW1ib2wgKi8KLSNkZWZpbmUgQ19CSU5DTCAgICAgICAgIDEwOAkvKiBNYXJrcyBiZWdpbm5pbmcgb2YgaW5jbHVkZSBmaWxlICovCi0jZGVmaW5lIENfRUlOQ0wgICAgICAgICAxMDkJLyogTWFya3MgZW5kaW5nIG9mIGluY2x1ZGUgZmlsZSAqLwotCi0gLyogc3RvcmFnZSBjbGFzc2VzIGZvciBzdGFiIHN5bWJvbHMgZm9yIFJTLzYwMDAgKi8KLSNkZWZpbmUgQ19HU1lNICAgICAgICAgICgweDgwKQotI2RlZmluZSBDX0xTWU0gICAgICAgICAgKDB4ODEpCi0jZGVmaW5lIENfUFNZTSAgICAgICAgICAoMHg4MikKLSNkZWZpbmUgQ19SU1lNICAgICAgICAgICgweDgzKQotI2RlZmluZSBDX1JQU1lNICAgICAgICAgKDB4ODQpCi0jZGVmaW5lIENfU1RTWU0gICAgICAgICAoMHg4NSkKLSNkZWZpbmUgQ19UQ1NZTSAgICAgICAgICgweDg2KQotI2RlZmluZSBDX0JDT01NICAgICAgICAgKDB4ODcpCi0jZGVmaW5lIENfRUNPTUwgICAgICAgICAoMHg4OCkKLSNkZWZpbmUgQ19FQ09NTSAgICAgICAgICgweDg5KQotI2RlZmluZSBDX0RFQ0wgICAgICAgICAgKDB4OGMpCi0jZGVmaW5lIENfRU5UUlkgICAgICAgICAoMHg4ZCkKLSNkZWZpbmUgQ19GVU4gICAgICAgICAgICgweDhlKQotI2RlZmluZSBDX0JTVEFUICAgICAgICAgKDB4OGYpCi0jZGVmaW5lIENfRVNUQVQgICAgICAgICAoMHg5MCkKLQotLyogU3RvcmFnZSBjbGFzc2VzIGZvciBUaHVtYiBzeW1ib2xzICovCi0jZGVmaW5lIENfVEhVTUJFWFQgICAgICAoMTI4ICsgQ19FWFQpCQkvKiAxMzAgKi8KLSNkZWZpbmUgQ19USFVNQlNUQVQgICAgICgxMjggKyBDX1NUQVQpCQkvKiAxMzEgKi8KLSNkZWZpbmUgQ19USFVNQkxBQkVMICAgICgxMjggKyBDX0xBQkVMKQkJLyogMTM0ICovCi0jZGVmaW5lIENfVEhVTUJFWFRGVU5DICAoQ19USFVNQkVYVCAgKyAyMCkJLyogMTUwICovCi0jZGVmaW5lIENfVEhVTUJTVEFURlVOQyAoQ19USFVNQlNUQVQgKyAyMCkJLyogMTUxICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU0NOTk1MRU4gKDgpCi0KLXN0cnVjdCBpbnRlcm5hbF9zY25oZHIKLXsKLSAgY2hhciBzX25hbWVbU0NOTk1MRU5dOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCi0gIC8qIFBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliLgotICAgICBJbiB0aGUgcGVpIGZvcm1hdCwgdGhpcyBmaWVsZCBpcyB0aGUgdmlydHVhbCBzZWN0aW9uIHNpemUKLSAgICAgKHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGFmdGVyIGJlaW5nIGxvYWRlZCBpbnQgbWVtb3J5KSwKLSAgICAgTk9UIHRoZSBwaHlzaWNhbCBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBzX3BhZGRyOwotCi0gIGJmZF92bWEgc192YWRkcjsJCS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgYmZkX3ZtYSBzX3NpemU7CQkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBiZmRfdm1hIHNfc2NucHRyOwkJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgYmZkX3ZtYSBzX3JlbHB0cjsJCS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgYmZkX3ZtYSBzX2xubm9wdHI7CQkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgdW5zaWduZWQgbG9uZyBzX25yZWxvYzsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICB1bnNpZ25lZCBsb25nIHNfbmxubm87CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgbG9uZyBzX2ZsYWdzOwkJCS8qIGZsYWdzCQkJKi8KLSAgbG9uZyBzX2FsaWduOwkJCS8qIHVzZWQgb24gSTk2MAkJCSovCi19OwotCi0vKgotICogc19mbGFncyAidHlwZSIKLSAqLwotI2RlZmluZSBTVFlQX1JFRwkgKDB4MDAwMCkJLyogInJlZ3VsYXIiOiBhbGxvY2F0ZWQsIHJlbG9jYXRlZCwgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfRFNFQ1QJICgweDAwMDEpCS8qICJkdW1teSI6ICByZWxvY2F0ZWQgb25seSovCi0jZGVmaW5lIFNUWVBfTk9MT0FECSAoMHgwMDAyKQkvKiAibm9sb2FkIjogYWxsb2NhdGVkLCByZWxvY2F0ZWQsIG5vdCBsb2FkZWQgKi8KLSNkZWZpbmUgU1RZUF9HUk9VUAkgKDB4MDAwNCkJLyogImdyb3VwZWQiOiBmb3JtZWQgb2YgaW5wdXQgc2VjdGlvbnMgKi8KLSNkZWZpbmUgU1RZUF9QQUQJICgweDAwMDgpCS8qICJwYWRkaW5nIjogbm90IGFsbG9jYXRlZCwgbm90IHJlbG9jYXRlZCwgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfQ09QWQkgKDB4MDAxMCkJLyogImNvcHkiOiBmb3IgZGVjaXNpb24gZnVuY3Rpb24gdXNlZCBieSBmaWVsZCB1cGRhdGU7ICBub3QgYWxsb2NhdGVkLCBub3QgcmVsb2NhdGVkLAotCQkJCQkJCQkJICAgICBsb2FkZWQ7IHJlbG9jICYgbGluZW5vIGVudHJpZXMgcHJvY2Vzc2VkIG5vcm1hbGx5ICovCi0jZGVmaW5lIFNUWVBfVEVYVAkgKDB4MDAyMCkJLyogc2VjdGlvbiBjb250YWlucyB0ZXh0IG9ubHkgKi8KLSNkZWZpbmUgU19TSFJTRUcJICgweDAwMjApCS8qIEluIDNiIFVwZGF0ZSBmaWxlcyAob3V0cHV0IG9mIG9nZW4pLCBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gU0hBUkVEIHNlZ21lbnRzIG9mIHRoZSBQZmlsZQotCQkJCQkJCQkJICAgICB3aWxsIGhhdmUgdGhlIFNfU0hSU0VHIGZsYWcgc2V0IGJ5IG9nZW4sIHRvIGluZm9ybSBkdWZyIHRoYXQgdXBkYXRpbmcgMSBjb3B5IG9mIHRoZSBwcm9jLiB3aWxsCi0JCQkJCQkJCQkgICAgIHVwZGF0ZSBhbGwgcHJvY2VzcyBpbnZvY2F0aW9ucy4gKi8KLSNkZWZpbmUgU1RZUF9EQVRBCSAoMHgwMDQwKQkvKiBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgb25seSAqLwotI2RlZmluZSBTVFlQX0JTUwkgKDB4MDA4MCkJLyogc2VjdGlvbiBjb250YWlucyBic3Mgb25seSAqLwotI2RlZmluZSBTX05FV0ZDTgkgKDB4MDEwMCkJLyogSW4gYSBtaW5pbWFsIGZpbGUgb3IgYW4gdXBkYXRlIGZpbGUsIGEgbmV3IGZ1bmN0aW9uIChhcyBjb21wYXJlZCB3aXRoIGEgcmVwbGFjZWQgZnVuY3Rpb24pICovCi0jZGVmaW5lIFNUWVBfSU5GTwkgKDB4MDIwMCkJLyogY29tbWVudDogbm90IGFsbG9jYXRlZCBub3QgcmVsb2NhdGVkLCBub3QgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfT1ZFUgkgKDB4MDQwMCkJLyogb3ZlcmxheTogcmVsb2NhdGVkIG5vdCBhbGxvY2F0ZWQgb3IgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfTElCCSAoMHgwODAwKQkvKiBmb3IgLmxpYjogc2FtZSBhcyBJTkZPICovCi0jZGVmaW5lIFNUWVBfTUVSR0UJICgweDIwMDApCS8qIG1lcmdlIHNlY3Rpb24gLS0gY29tYmluZXMgd2l0aCB0ZXh0LCBkYXRhIG9yIGJzcyBzZWN0aW9ucyBvbmx5ICovCi0jZGVmaW5lIFNUWVBfUkVWRVJTRV9QQUQgKDB4NDAwMCkJLyogc2VjdGlvbiB3aWxsIGJlIHBhZGRlZCB3aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVyZXZlciBwYWRkaW5nIGlzIG5lY2Vzc2FyeSBhbmQgdGhlcmUgaXMgYQotCQkJCQkKLQkJCQkJCQkJCSAgICAgd29yZCBvZiBjb250aWd1b3VzIGJ5dGVzCi0JCQkJCQkJCQkgICAgIGJlZ2lubmluZyBvbiBhIHdvcmQgYm91bmRhcnkuICovCi0KLSNkZWZpbmUgU1RZUF9MSVQJMHg4MDIwCS8qIExpdGVyYWwgZGF0YSAobGlrZSBTVFlQX1RFWFQpICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLQotc3RydWN0IGludGVybmFsX2xpbmVubwotewotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsX3N5bW5keDsJCS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotICAgIGxvbmcgbF9wYWRkcjsJCS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotICB9ICAgICBsX2FkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbF9sbm5vOwkJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBGSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIERJTU5VTQkJNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQKLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgX25fbmFtZVtTWU1OTUxFTl07CS8qIG9sZCBDT0ZGIHZlcnNpb24JKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBsb25nIF9uX3plcm9lczsJCS8qIG5ldyA9PSAwCQkqLwotICAgICAgbG9uZyBfbl9vZmZzZXQ7CQkvKiBvZmZzZXQgaW50byBzdHJpbmcgdGFibGUgKi8KLSAgICB9ICAgICAgX25fbjsKLSAgICBjaGFyICpfbl9ucHRyWzJdOwkJLyogYWxsb3dzIGZvciBvdmVybGF5aW5nCSovCi0gIH0gICAgIF9uOwotICBsb25nIG5fdmFsdWU7CQkJLyogdmFsdWUgb2Ygc3ltYm9sCQkqLwotICBzaG9ydCBuX3NjbnVtOwkJLyogc2VjdGlvbiBudW1iZXIJCSovCi0gIHVuc2lnbmVkIHNob3J0IG5fZmxhZ3M7CS8qIGNvcHkgb2YgZmxhZ3MgZnJvbSBmaWxoZHIJKi8KLSAgdW5zaWduZWQgc2hvcnQgbl90eXBlOwkvKiB0eXBlIGFuZCBkZXJpdmVkIHR5cGUJKi8KLSAgdW5zaWduZWQgY2hhciBuX3NjbGFzczsJLyogc3RvcmFnZSBjbGFzcwkJKi8KLSAgdW5zaWduZWQgY2hhciBuX251bWF1eDsJLyogbnVtYmVyIG9mIGF1eC4gZW50cmllcwkqLwotfTsKLQotI2RlZmluZSBuX25hbWUJCV9uLl9uX25hbWUKLSNkZWZpbmUgbl96ZXJvZXMJX24uX25fbi5fbl96ZXJvZXMKLSNkZWZpbmUgbl9vZmZzZXQJX24uX25fbi5fbl9vZmZzZXQKLQotCi0vKiBSZWxvY2F0YWJsZSBzeW1ib2xzIGhhdmUgbnVtYmVyIG9mIHRoZSBzZWN0aW9uIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQsCi0gICBvciBvbmUgb2YgdGhlIGZvbGxvd2luZzogKi8KLQotI2RlZmluZSBOX1VOREVGCSgoc2hvcnQpMCkJLyogdW5kZWZpbmVkIHN5bWJvbCAqLwotI2RlZmluZSBOX0FCUwkoKHNob3J0KS0xKQkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KLSNkZWZpbmUgTl9ERUJVRwkoKHNob3J0KS0yKQkvKiBkZWJ1Z2dpbmcgc3ltYm9sIC0tIHZhbHVlIGlzIG1lYW5pbmdsZXNzICovCi0jZGVmaW5lIE5fVFYJKChzaG9ydCktMykJLyogaW5kaWNhdGVzIHN5bWJvbCBuZWVkcyBwcmVsb2FkIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBQX1RWCSgoc2hvcnQpLTQpCS8qIGluZGljYXRlcyBzeW1ib2wgbmVlZHMgcG9zdGxvYWQgdHJhbnNmZXIgdmVjdG9yKi8KLQotLyoKLSAqIFR5cGUgb2YgYSBzeW1ib2wsIGluIGxvdyBOIGJpdHMgb2YgdGhlIHdvcmQKLSAqLwotI2RlZmluZSBUX05VTEwJCTAKLSNkZWZpbmUgVF9WT0lECQkxCS8qIGZ1bmN0aW9uIGFyZ3VtZW50IChvbmx5IHVzZWQgYnkgY29tcGlsZXIpICovCi0jZGVmaW5lIFRfQ0hBUgkJMgkvKiBjaGFyYWN0ZXIJCSovCi0jZGVmaW5lIFRfU0hPUlQJCTMJLyogc2hvcnQgaW50ZWdlcgkqLwotI2RlZmluZSBUX0lOVAkJNAkvKiBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0xPTkcJCTUJLyogbG9uZyBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0ZMT0FUCQk2CS8qIGZsb2F0aW5nIHBvaW50CSovCi0jZGVmaW5lIFRfRE9VQkxFCTcJLyogZG91YmxlIHdvcmQJCSovCi0jZGVmaW5lIFRfU1RSVUNUCTgJLyogc3RydWN0dXJlIAkJKi8KLSNkZWZpbmUgVF9VTklPTgkJOQkvKiB1bmlvbiAJCSovCi0jZGVmaW5lIFRfRU5VTQkJMTAJLyogZW51bWVyYXRpb24gCQkqLwotI2RlZmluZSBUX01PRQkJMTEJLyogbWVtYmVyIG9mIGVudW1lcmF0aW9uKi8KLSNkZWZpbmUgVF9VQ0hBUgkJMTIJLyogdW5zaWduZWQgY2hhcmFjdGVyCSovCi0jZGVmaW5lIFRfVVNIT1JUCTEzCS8qIHVuc2lnbmVkIHNob3J0CSovCi0jZGVmaW5lIFRfVUlOVAkJMTQJLyogdW5zaWduZWQgaW50ZWdlcgkqLwotI2RlZmluZSBUX1VMT05HCQkxNQkvKiB1bnNpZ25lZCBsb25nCSovCi0jZGVmaW5lIFRfTE5HREJMCTE2CS8qIGxvbmcgZG91YmxlCQkqLwotCi0vKgotICogZGVyaXZlZCB0eXBlcywgaW4gbl90eXBlCi0qLwotI2RlZmluZSBEVF9OT04JCSgwKQkvKiBubyBkZXJpdmVkIHR5cGUgKi8KLSNkZWZpbmUgRFRfUFRSCQkoMSkJLyogcG9pbnRlciAqLwotI2RlZmluZSBEVF9GQ04JCSgyKQkvKiBmdW5jdGlvbiAqLwotI2RlZmluZSBEVF9BUlkJCSgzKQkvKiBhcnJheSAqLwotCi0jZGVmaW5lIEJUWVBFKHgpCSgoeCkgJiBOX0JUTUFTSykKLQotI2RlZmluZSBJU1BUUih4KSBcCi0gICgoKHVuc2lnbmVkIGxvbmcpICh4KSAmIE5fVE1BU0spID09ICgodW5zaWduZWQgbG9uZykgRFRfUFRSIDw8IE5fQlRTSEZUKSkKLSNkZWZpbmUgSVNGQ04oeCkgXAotICAoKCh1bnNpZ25lZCBsb25nKSAoeCkgJiBOX1RNQVNLKSA9PSAoKHVuc2lnbmVkIGxvbmcpIERUX0ZDTiA8PCBOX0JUU0hGVCkpCi0jZGVmaW5lIElTQVJZKHgpIFwKLSAgKCgodW5zaWduZWQgbG9uZykgKHgpICYgTl9UTUFTSykgPT0gKCh1bnNpZ25lZCBsb25nKSBEVF9BUlkgPDwgTl9CVFNIRlQpKQotI2RlZmluZSBJU1RBRyh4KSBcCi0gICgoeCkgPT0gQ19TVFJUQUcgfHwgKHgpID09IENfVU5UQUcgfHwgKHgpID09IENfRU5UQUcpCi0jZGVmaW5lIERFQ1JFRih4KSBcCi0gICgoKCh4KSA+PiBOX1RTSElGVCkgJiB+IE5fQlRNQVNLKSB8ICgoeCkgJiBOX0JUTUFTSykpCi0KLXVuaW9uIGludGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QKLSAgewotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBsb25nIGw7CQkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgICAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLSAgICB9ICAgICB4X3RhZ25keDsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7Ci0JdW5zaWduZWQgc2hvcnQgeF9sbm5vOwkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCXVuc2lnbmVkIHNob3J0IHhfc2l6ZTsJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0gICAgICB4X2xuc3o7Ci0gICAgICBsb25nIHhfZnNpemU7CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgfSAgICAgeF9taXNjOwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QKLSAgICAgIHsJCQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JbG9uZyB4X2xubm9wdHI7CQkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCXVuaW9uCi0JewkJCS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCSAgbG9uZyBsOwotCSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLQl9ICAgICB4X2VuZG5keDsKLSAgICAgIH0gICAgICB4X2ZjbjsKLQotICAgICAgc3RydWN0Ci0gICAgICB7CQkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCXVuc2lnbmVkIHNob3J0IHhfZGltZW5bRElNTlVNXTsKLSAgICAgIH0gICAgICB4X2FyeTsKLSAgICB9ICAgICB4X2ZjbmFyeTsKLQotICAgIHVuc2lnbmVkIHNob3J0IHhfdHZuZHg7CS8qIHR2IGluZGV4ICovCi0gIH0gICAgICB4X3N5bTsKLQotICB1bmlvbgotICB7Ci0gICAgY2hhciB4X2ZuYW1lW0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBsb25nIHhfemVyb2VzOwotICAgICAgbG9uZyB4X29mZnNldDsKLSAgICB9ICAgICAgeF9uOwotICB9ICAgICB4X2ZpbGU7Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBsb25nIHhfc2NubGVuOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X25yZWxvYzsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X25saW5ubzsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgICB1bnNpZ25lZCBsb25nIHhfY2hlY2tzdW07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtIGZvciBQRSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfYXNzb2NpYXRlZDsgLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCBmb3IgUEUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfY29tZGF0OwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciBmb3IgUEUgKi8KLSAgfSAgICAgIHhfc2NuOwotCi0gIHN0cnVjdAotICB7Ci0gICAgbG9uZyB4X3R2ZmlsbDsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3R2bGVuOwkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF90dnJhblsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSAgICAgIHhfdHY7CQkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogUlMvNjAwMC1zcGVjaWZpYyBhdXhlbnQgLSBsYXN0IGF1eGVudCBmb3IgZXZlcnkgZXh0ZXJuYWwgc3ltYm9sCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIHN0cnVjdAotICB7Ci0gICAgdW5pb24KLSAgICAgIHsJCQkJLyogY3NlY3QgbGVuZ3RoIG9yIGVuY2xvc2luZyBjc2VjdCAqLwotCWxvbmcgbDsKLQlzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpwOwotICAgICAgfSB4X3NjbmxlbjsKLSAgICBsb25nIHhfcGFybWhhc2g7CQkvKiBwYXJtIHR5cGUgaGFzaCBpbmRleCAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfc25oYXNoOwkvKiBzZWN0IG51bSB3aXRoIHBhcm0gaGFzaCAqLwotICAgIHVuc2lnbmVkIGNoYXIgeF9zbXR5cDsJLyogc3ltYm9sIGFsaWduIGFuZCB0eXBlICovCi0gICAgLyogMC00IC0gTG9nIDIgb2YgYWxpZ25tZW50ICovCi0gICAgLyogNS03IC0gc3ltYm9sIHR5cGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfc21jbGFzOwkvKiBzdG9yYWdlIG1hcHBpbmcgY2xhc3MgKi8KLSAgICBsb25nIHhfc3RhYjsJCS8qIGRieCBzdGFiIGluZm8gaW5kZXggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3Nuc3RhYjsJLyogc2VjdCBudW0gd2l0aCBkYnggc3RhYiAqLwotICB9ICAgICAgeF9jc2VjdDsJCS8qIGNzZWN0IGRlZmluaXRpb24gaW5mb3JtYXRpb24gKi8KLQotLyogeF9zbXR5cCB2YWx1ZXM6ICAqLwotCi0jZGVmaW5lCVNNVFlQX0FMSUdOKHgpCSgoeCkgPj4gMykJLyogbG9nMiBvZiBhbGlnbm1lbnQgKi8KLSNkZWZpbmUJU01UWVBfU01UWVAoeCkJKCh4KSAmIDB4NykJLyogc3ltYm9sIHR5cGUgKi8KLS8qIFN5bWJvbCB0eXBlIHZhbHVlczogICovCi0jZGVmaW5lCVhUWV9FUgkwCQkvKiBFeHRlcm5hbCByZWZlcmVuY2UgKi8KLSNkZWZpbmUJWFRZX1NECTEJCS8qIENzZWN0IGRlZmluaXRpb24gKi8KLSNkZWZpbmUJWFRZX0xECTIJCS8qIExhYmVsIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgWFRZX0NNCTMJCS8qIC5CU1MgKi8KLSNkZWZpbmUJWFRZX0VNCTQJCS8qIEVycm9yIG1lc3NhZ2UgKi8KLSNkZWZpbmUJWFRZX1VTCTUJCS8qICJSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIiAqLwotCi0vKiB4X3NtY2xhcyB2YWx1ZXM6ICAqLwotCi0jZGVmaW5lCVhNQ19QUgkwCQkvKiBSZWFkLW9ubHkgcHJvZ3JhbSBjb2RlICovCi0jZGVmaW5lCVhNQ19STwkxCQkvKiBSZWFkLW9ubHkgY29uc3RhbnQgKi8KLSNkZWZpbmUJWE1DX0RCCTIJCS8qIFJlYWQtb25seSBkZWJ1ZyBkaWN0aW9uYXJ5IHRhYmxlICovCi0jZGVmaW5lCVhNQ19UQwkzCQkvKiBSZWFkLXdyaXRlIGdlbmVyYWwgVE9DIGVudHJ5ICovCi0jZGVmaW5lCVhNQ19VQQk0CQkvKiBSZWFkLXdyaXRlIHVuY2xhc3NpZmllZCAqLwotI2RlZmluZQlYTUNfUlcJNQkJLyogUmVhZC13cml0ZSBkYXRhICovCi0jZGVmaW5lCVhNQ19HTAk2CQkvKiBSZWFkLW9ubHkgZ2xvYmFsIGxpbmthZ2UgKi8KLSNkZWZpbmUJWE1DX1hPCTcJCS8qIFJlYWQtb25seSBleHRlbmRlZCBvcGVyYXRpb24gKi8KLSNkZWZpbmUJWE1DX1NWCTgJCS8qIFJlYWQtb25seSBzdXBlcnZpc29yIGNhbGwgKi8KLSNkZWZpbmUJWE1DX0JTCTkJCS8qIFJlYWQtd3JpdGUgQlNTICovCi0jZGVmaW5lCVhNQ19EUwkxMAkJLyogUmVhZC13cml0ZSBkZXNjcmlwdG9yIGNzZWN0ICovCi0jZGVmaW5lCVhNQ19VQwkxMQkJLyogUmVhZC13cml0ZSB1bm5hbWVkIEZvcnRyYW4gY29tbW9uICovCi0jZGVmaW5lCVhNQ19USQkxMgkJLyogUmVhZC1vbmx5IHRyYWNlYmFjayBpbmRleCBjc2VjdCAqLwotI2RlZmluZQlYTUNfVEIJMTMJCS8qIFJlYWQtb25seSB0cmFjZWJhY2sgdGFibGUgY3NlY3QgKi8KLS8qIAkJMTQJPz8/ICovCi0jZGVmaW5lCVhNQ19UQzAJMTUJCS8qIFJlYWQtd3JpdGUgVE9DIGFuY2hvciAqLwotI2RlZmluZSBYTUNfVEQJMTYJCS8qIFJlYWQtd3JpdGUgZGF0YSBpbiBUT0MgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqICBJOTYwLXNwZWNpZmljICoybmQqIGF1eC4gZW50cnkgZm9ybWF0cwotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBzdHJ1Y3QKLSAgewotICAgIC8qIFRoaXMgaXMgYSB2ZXJ5IG9sZCB0eXBvIHRoYXQga2VlcHMgZ2V0dGluZyBwcm9wYWdhdGVkLiAqLwotI2RlZmluZSB4X3N0ZGluZHggeF9zdGluZHgKLSAgICBsb25nIHhfc3RpbmR4OwkJLyogc3lzLiB0YWJsZSBlbnRyeSAqLwotICB9ICAgICAgeF9zYzsJCQkvKiBzeXN0ZW0gY2FsbCBlbnRyeSAqLwotCi0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyB4X2JhbG50cnk7CS8qIEJBTCBlbnRyeSBwb2ludCAqLwotICB9ICAgICAgeF9iYWw7CQkJLyogQkFMLWNhbGxhYmxlIGZ1bmN0aW9uICovCi0KLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIHhfdGltZXN0YW1wOwkvKiB0aW1lIHN0YW1wICovCi0gICAgY2hhciB4X2lkc3RyaW5nWzIwXTsJLyogcHJvZHVjZXIgaWRlbnRpdHkgc3RyaW5nICovCi0gIH0gICAgICB4X2lkZW50OwkJLyogUHJvZHVjZXIgaWRlbnQgaW5mbyAqLwotCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGludGVybmFsX3JlbG9jCi17Ci0gIGJmZF92bWEgcl92YWRkcjsJCS8qIFZpcnR1YWwgYWRkcmVzcyBvZiByZWZlcmVuY2UgKi8KLSAgbG9uZyByX3N5bW5keDsJCS8qIEluZGV4IGludG8gc3ltYm9sIHRhYmxlCSovCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsJLyogUmVsb2NhdGlvbiB0eXBlCQkqLwotICB1bnNpZ25lZCBjaGFyIHJfc2l6ZTsJCS8qIFVzZWQgYnkgUlMvNjAwMCBhbmQgRUNPRkYJKi8KLSAgdW5zaWduZWQgY2hhciByX2V4dGVybjsJLyogVXNlZCBieSBFQ09GRgkJKi8KLSAgdW5zaWduZWQgbG9uZyByX29mZnNldDsJLyogVXNlZCBieSBBbHBoYSBFQ09GRiwgU1BBUkMsIG90aGVycyAqLwotfTsKLQotI2RlZmluZSBSX1JFTEJZVEUJMDE3Ci0jZGVmaW5lIFJfUkVMV09SRAkwMjAKLSNkZWZpbmUgUl9QQ1JCWVRFCTAyMgotI2RlZmluZSBSX1BDUldPUkQJMDIzCi0jZGVmaW5lIFJfUENSTE9ORwkwMjQKLQotI2RlZmluZQlSX0RJUjE2CQkwMQotI2RlZmluZSBSX0RJUjMyCQkwNgotI2RlZmluZQlSX1BDTE9ORwkwMjAKLSNkZWZpbmUgUl9SRUxCWVRFCTAxNwotI2RlZmluZSBSX1JFTFdPUkQJMDIwCi0jZGVmaW5lIFJfSU1BR0VCQVNFICAgICAwNwotCi0KLSNkZWZpbmUgUl9QQ1IxNkwgMTI4Ci0jZGVmaW5lIFJfUENSMjZMIDEyOQotI2RlZmluZSBSX1ZSVDE2ICAxMzAKLSNkZWZpbmUgUl9IVlJUMTYgMTMxCi0jZGVmaW5lIFJfTFZSVDE2IDEzMgotI2RlZmluZSBSX1ZSVDMyICAxMzMKLSNkZWZpbmUgUl9SRUxMT05HCSgweDExKQkvKiBEaXJlY3QgMzItYml0IHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgUl9JUFJTSE9SVAkoMHgxOCkKLSNkZWZpbmUgUl9JUFJMT05HCSgweDFhKQotI2RlZmluZSBSX0dFVFNFRwkoMHgxZCkKLSNkZWZpbmUgUl9HRVRQQQkJKDB4MWUpCi0jZGVmaW5lIFJfVEFHV09SRAkoMHgxZikKLSNkZWZpbmUgUl9KVU1QVEFSRwkweDIwCS8qIHN0cmFuZ2UgMjlrIDAweHgwMHh4IHJlbG9jICovCi0KLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aXRoIGEgMTZiaXQgYWJzb2x1dGUKLSAgIGFkZHJlc3MuICBUaGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gaW5zbnMgd2l0aCB0aGlzIHJlbG9jIGludG8KLSAgIGFuIGFic29sdXRlIDgtYml0IGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjE2QjEgICAgCTB4NDEKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aGljaCBoYWQgYSAxNmJpdAotICAgYWJzb2x1dGUgYWRkcmVzcyB3aGljaCBoYXZlIGJlZW4gc2hvcnRlbmVkIGludG8gYSA4LWJpdAotICAgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WMTZCMiAJMHg0MgotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgam1wIGluc25zIHdpdGggYSAxNmJpdCB0YXJnZXQgYWRkcmVzczsKLSAgIHRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiB0aGVzZSBpbnNucyBpbnRvIGJyYSBpbnNucyB3aXRoCi0gICBhbiA4Yml0IHBjLXJlbGF0aXZlIHRhcmdldC4gICovCi0jZGVmaW5lIFJfSk1QMSAgICAgCTB4NDMKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgYnJhIHdpdGggYW4gOC1iaXQgcGMtcmVsYXRpdmUKLSAgIHRhcmdldCB0aGF0IHdhcyBmb3JtZXJsbHkgYSBqbXAgaW5zbiB3aXRoIGEgMTZiaXQgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVAyIAkJMHg0NAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgUl9SRUxMT05HX05FRyAgCTB4NDUKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGptcCBpbnNucyB3aXRoIGEgMjRiaXQgdGFyZ2V0IGFkZHJlc3M7Ci0gICB0aGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gdGhlc2UgaW5zbnMgaW50byBicmEgaW5zbnMgd2l0aAotICAgYW4gOGJpdCBwYy1yZWxhdGl2ZSB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUEwxICAgICAJMHg0NgotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBicmEgd2l0aCBhbiA4LWJpdCBwYy1yZWxhdGl2ZQotICAgdGFyZ2V0IHRoYXQgd2FzIGZvcm1lcmxseSBhIGptcCBpbnNuIHdpdGggYSAyNGJpdCB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUEwyCQkweDQ3Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2l0aCBhIDI0Yml0IGFic29sdXRlCi0gICBhZGRyZXNzLiAgVGhlIGxpbmtlciB0cmllcyB0byB0dXJuIGluc25zIHdpdGggdGhpcyByZWxvYyBpbnRvCi0gICBhbiBhYnNvbHV0ZSA4LWJpdCBhZGRyZXNzLiAgKi8KLQotI2RlZmluZSBSX01PVjI0QjEgICAgCTB4NDgKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aGljaCBoYWQgYSAyNGJpdAotICAgYWJzb2x1dGUgYWRkcmVzcyB3aGljaCBoYXZlIGJlZW4gc2hvcnRlbmVkIGludG8gYSA4LWJpdAotICAgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WMjRCMiAJMHg0OQotCi0vKiBBbiBoODMwMCBtZW1vcnkgaW5kaXJlY3QganVtcC9jYWxsLiAgRm9yY2VzIHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wL2NhbGwKLSAgIHRhcmdldCBpbnRvIHRoZSBmdW5jdGlvbiB2ZWN0b3IgKGluIHBhZ2UgemVybyksIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIHZlY3RvciBlbnRyeSB0byBiZSBwbGFjZWQgaW4gdGhlIGp1bXAvY2FsbCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJfTUVNX0lORElSRUNUCTB4NGEKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgMTZiaXQgcGMtcmVsYXRpdmUgYnJhbmNoIHRhcmdldCB3aGljaCB3YXMKLSAgIHNob3J0ZW5lZCBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUgYnJhbmNoIHRhcmdldC4gICovCi0jZGVmaW5lIFJfUENSV09SRF9CCTB4NGIKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5bd2xdIGluc3RydWN0aW9ucyB3aXRoIGEgMzIvMjQgYml0Ci0gICBhYnNvbHV0ZSBhZGRyZXNzOyB0aGUgbGlua2VyIG1heSB0dXJuIHRoaXMgaW50byBhIG1vdi5bd2xdCi0gICBpbnNuIHdpdGggYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1ZMMSAgICAJMHg0YwotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92Llt3bF0gaW5zbnMgd2hpY2ggZm9ybWVybGx5IGhhZAotICAgYSAzMi8yNGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGFuZCBob3cgaGF2ZSBhIDE2Yml0IGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVkwyIAkweDRkCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGJDQzo4IHdoaWNoIHdpbGwgaGF2ZSBpdCdzIGNvbmRpdGlvbgotICAgaW52ZXJ0ZWQgYW5kIGl0cyB0YXJnZXQgcmVkaXJlY3RlZCB0byB0aGUgdGFyZ2V0IG9mIHRoZSBicmFuY2gKLSAgIGluIHRoZSBmb2xsb3dpbmcgaW5zbi4gICovCi0jZGVmaW5lIFJfQkNDX0lOVgkweDRlCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGptcCBpbnN0cnVjdGlvbiB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQuICAqLwotI2RlZmluZSBSX0pNUF9ERUwJMHg0ZgotCi0vKiBaOGsgbW9kZXMgKi8KLSNkZWZpbmUgUl9JTU0xNiAgIDB4MDEJCS8qIDE2IGJpdCBhYnMgKi8KLSNkZWZpbmUgUl9KUgkgIDB4MDIJCS8qIGpyICA4IGJpdCBkaXNwICovCi0jZGVmaW5lIFJfSU1NNEwgICAweDIzCQkvKiBsb3cgbmliYmxlICovCi0jZGVmaW5lIFJfSU1NOCAgICAweDIyCQkvKiA4IGJpdCBhYnMgKi8KLSNkZWZpbmUgUl9JTU0zMiAgIFJfUkVMTE9ORwkvKiAzMiBiaXQgYWJzICovCi0jZGVmaW5lIFJfQ0FMTCAgICBSX0RBCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGNvdWxkIGJlIGEgY2FsbHIgKi8KLSNkZWZpbmUgUl9KUAkgIFJfREEJCS8qIEFic29sdXRlIGFkZHJlc3Mgd2hpY2ggY291bGQgYmUgYSBqcCAqLwotI2RlZmluZSBSX1JFTDE2ICAgMHgwNAkJLyogMTYgYml0IFBDIHJlbCAqLwotI2RlZmluZSBSX0NBTExSCSAgMHgwNQkJLyogY2FsbHIgMTIgYml0IGRpc3AgKi8KLSNkZWZpbmUgUl9TRUcgICAgIDB4MTAJCS8qIHNldCBpZiBpbiBzZWdtZW50ZWQgbW9kZSAqLwotI2RlZmluZSBSX0lNTTRIICAgMHgyNAkJLyogaGlnaCBuaWJibGUgKi8KLSNkZWZpbmUgUl9ESVNQNyAgIDB4MjUgICAgICAgICAgLyogZGpueiBkaXNwbGFjZW1lbnQgKi8KLQotLyogSDg1MDAgbW9kZXMgKi8KLQotI2RlZmluZSBSX0g4NTAwX0lNTTggIAkxCQkvKiAgOCBiaXQgaW1tZWRpYXRlIAkqLwotI2RlZmluZSBSX0g4NTAwX0lNTTE2IAkyCQkvKiAxNiBiaXQgaW1tZWRpYXRlCSovCi0jZGVmaW5lIFJfSDg1MDBfUENSRUw4IAkzCQkvKiAgOCBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfSDg1MDBfUENSRUwxNiA0CQkvKiAxNiBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfSDg1MDBfSElHSDggIAk1CQkvKiBoaWdoIDggYml0cyBvZiAyNCBiaXQgYWRkcmVzcyAqLwotI2RlZmluZSBSX0g4NTAwX0xPVzE2IAk3CQkvKiBsb3cgMTYgYml0cyBvZiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfSDg1MDBfSU1NMjQJNgkJLyogMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX0g4NTAwX0lNTTMyICAgOCAgICAgICAgICAgICAgIC8qIDMyIGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9IODUwMF9ISUdIMTYgIDkJCS8qIGhpZ2ggMTYgYml0cyBvZiAzMiBiaXQgaW1tZWRpYXRlICovCi0KLS8qIFc2NSBtb2RlcyAqLwotCi0jZGVmaW5lIFJfVzY1X0FCUzgJMSAgLyogYWRkciAmIDB4ZmYgCQkqLwotI2RlZmluZSBSX1c2NV9BQlMxNgkyICAvKiBhZGRyICYgMHhmZmZmIAkJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMjQJMyAgLyogYWRkciAmIDB4ZmZmZmZmIAkJKi8KLQotI2RlZmluZSBSX1c2NV9BQlM4UzggICAgNCAgLyogKGFkZHIgPj4gOCkgJiAweGZmIAkqLwotI2RlZmluZSBSX1c2NV9BQlM4UzE2ICAgNSAgLyogKGFkZHIgPj4gMTYpICYgMHhmZiAJKi8KLQotI2RlZmluZSBSX1c2NV9BQlMxNlM4ICAgNiAgLyogKGFkZHIgPj4gOCkgJiAwZmZmZiAJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMTZTMTYgIDcgIC8qIChhZGRyID4+IDE2KSAmIDBmZmZmIAkqLwotCi0jZGVmaW5lIFJfVzY1X1BDUjgJOAotI2RlZmluZSBSX1c2NV9QQ1IxNgk5Ci0KLSNkZWZpbmUgUl9XNjVfRFAgICAgICAgMTAgIC8qIGRpcmVjdCBwYWdlIDggYml0cyBvbmx5ICAgKi8KLQotI2VuZGlmIC8qIEdOVV9DT0ZGX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9tNjhrLmggYi9pbmNsdWRlL2NvZmYvbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTE0N2VkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9tNjhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBNNjhLICovCi0KLSNpZm5kZWYgR05VX0NPRkZfTTY4S19ICi0jZGVmaW5lIEdOVV9DT0ZGX002OEtfSCAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIE1vdG9yb2xhIDY4MDAwLzY4MDA4LzY4MDEwLzY4MDIwICovCi0jZGVmaW5lCU1DNjhNQUdJQwkwNTIwCi0jZGVmaW5lIE1DNjhLV1JNQUdJQwkwNTIwCS8qIHdyaXRlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU1DNjhUVk1BR0lDCTA1MjEKLSNkZWZpbmUgTUM2OEtST01BR0lDCTA1MjEJLyogcmVhZG9ubHkgc2hhcmVhYmxlIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUgTUM2OEtQR01BR0lDCTA1MjIJLyogZGVtYW5kIHBhZ2VkIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUJTTY4TUFHSUMJMDIxMAotI2RlZmluZQlNNjhUVk1BR0lDCTAyMTEKLQotLyogdGhpcyBpcyB0aGUgbWFnaWMgb2YgdGhlIEJ1bGwgZHB4LzIgKi8KLSNkZWZpbmUgTUM2OEtCQ1NNQUdJQwkwNTI2Ci0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJMDQxNQotCi0jZGVmaW5lIE9NQUdJQyBNNjhNQUdJQwotCi0vKiBUaGlzIGludGVudGlvbmFsbHkgZG9lcyBub3QgaW5jbHVkZSBNQzY4S0JDU01BR0lDOyBpdCBvbmx5IGluY2x1ZGVzCi0gICBtYWdpYyBudW1iZXJzIHdoaWNoIGltcGx5IHRoYXQgbmFtZXMgZG8gbm90IGhhdmUgdW5kZXJzY29yZXMuICAqLwotI2RlZmluZSBNNjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1dSTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OFRWTUFHSUMpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1NQzY4S1JPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtQR01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OFRWTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TFlOWENPRkZNQUdJQykgKQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLQotI2RlZmluZSBQQUdFTUFHSUNFWEVDU1dBUFBFRCAgMDQwNyAvKiBleGVjdXRhYmxlIChzd2FwcGVkKSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1NXQVBQRUQgMDQxMCAvKiBwdXJlIGV4ZWN1dGFibGUgKHN3YXBwZWQpICovCi0jZGVmaW5lIFBBR0VNQUdJQ1BFWEVDVFNITElCICAwNDQzIC8qIHB1cmUgZXhlY3V0YWJsZSAodGFyZ2V0IHNoYXJlZCBsaWJyYXJ5KSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1BBR0VEICAgMDQxMyAvKiBwdXJlIGV4ZWN1dGFibGUgKHBhZ2VkKSAqLwotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0gIGNoYXIgcl9vZmZzZXRbNF07Ci0jZW5kaWYKLQotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotCi0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotI2RlZmluZSBSRUxTWiAxNAotI2Vsc2UKLSNkZWZpbmUgUkVMU1ogMTAKLSNlbmRpZgotCi0jZW5kaWYgLyogR05VX0NPRkZfTTY4S19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbTg4ay5oIGIvaW5jbHVkZS9jb2ZmL204OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2ZWI0MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbTg4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgODhrIGJjcyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgTUM4OE1BR0lDICAwNTQwICAgICAgICAgICAvKiA4OGsgQkNTIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgTUM4OERNQUdJQyAwNTQxICAgICAgICAgICAvKiBERy9VWCBleGVjdXRhYmxlICAgKi8KLSNkZWZpbmUgTUM4OE9NQUdJQyAwNTU1CSAgICAgICAgICAvKiBPYmplY3QgZmlsZSAgICAgICAgKi8KLQotI2RlZmluZSBNQzg4QkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DODhNQUdJQykgJiYoKHgpLmZfbWFnaWMhPU1DODhETUFHSUMpICYmICgoeCkuZl9tYWdpYyAhPSBNQzg4T01BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgUEFHRU1BR0lDMyAwNDE0IC8qIFNwbGl0IGkmZCwgemVybyBtYXBwZWQgKi8KLSNkZWZpbmUgUEFHRU1BR0lDQkNTIDA0MTMKLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgCi17Ci0gIGNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBjaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyCQlzX25yZWxvY1s0XTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICBjaGFyCQlzX25sbm5vWzRdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDQKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm97Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQotCWNoYXIgbF9sbm5vWzRdOwotCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWQyWzJdOwotfTsKLQotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkwMTcKLSNkZWZpbmUgTl9UTUFTSwkJMDYwCi0jZGVmaW5lIE5fQlRTSEZUCTQKLSNkZWZpbmUgTl9UU0hJRlQJMgotCi0KLS8qIE5vdGUgdGhhdCB0aGlzIGlzbid0IHRoZSBzYW1lIHNoYXBlIGFzIG90aGVyIGNvZmZzICovCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgLyogNCAqLwotICAgIHVuaW9uIHsKLSAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLSAgICAgIHN0cnVjdCB7Ci0JY2hhciAgeF9sbm5vWzRdOwkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCWNoYXIgIHhfc2l6ZVs0XTsJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0geF9sbnN6OwotICAgIH0geF9taXNjOwotICAgIAotICAgIC8qIDEyICovCi0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQljaGFyIHhfZW5kbmR4WzRdOwkJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0gICAgICB9IHhfZmNuOwotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICB9IHhfZmNuYXJ5OwotICAgIC8qIDIwICovCi0gICAgCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0gICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIHhfemVyb2VzWzRdOwotICAgICAgY2hhciB4X29mZnNldFs0XTsKLSAgICB9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF9zY25sZW5bNF07CQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotICAgIGNoYXIgeF9ucmVsb2NbNF07CQkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIGNoYXIgeF9ubGlubm9bNF07CQkvKiAjIGxpbmUgbnVtYmVycyAqLwotICB9IHhfc2NuOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdHZmaWxsWzRdOwkJLyogdHYgZmlsbCB2YWx1ZSAqLwotICAgIGNoYXIgeF90dmxlblsyXTsJCS8qIGxlbmd0aCBvZiAudHYgKi8KLSAgICBjaGFyIHhfdHZyYW5bMl1bMl07CQkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi19OwotCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgR0VUX0ZDTl9FTkRORFgoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZGVmaW5lIFBVVF9GQ05fTE5OT1BUUihhYmZkLCBpbiwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2RlZmluZSBQVVRfRkNOX0VORE5EWChhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSAgIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZGVmaW5lIEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFBVVF9MTlNaX0xOTk8oYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNkZWZpbmUgUFVUX0xOU1pfU0laRShhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2RlZmluZSBQVVRfU0NOX05SRUxPQyhhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgUFVUX1NDTl9OTElOTk8oYWJmZCxpbiwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKQotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotCi0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTIwCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbMl07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAgMTIKLQotI2RlZmluZSBOT19UVk5EWApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL21jb3JlLmggYi9pbmNsdWRlL2NvZmYvbWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxODk0Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKiBNb3Rvcm9sbGEgTUNvcmUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTUNvcmUgQ09GRi9QRSBBQkkuICovCi0KLSNpZm5kZWYgX0NPRkZfTU9SRV9ICi0jZGVmaW5lIF9DT0ZGX01PUkVfSAotCi0KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX0FCU09MVVRFICAgICAgICAgIAkweDAwMDAKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX0FERFIzMiAgICAgICAgICAgIAkweDAwMDEKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQJCTB4MDAwMgotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIJCTB4MDAwMwotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMgkJMHgwMDA0Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMgkJMHgwMDA1Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIJMHgwMDA2Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9SVkEJCQkweDAwMDcKLQotI2RlZmluZSBQRU1DT1JFCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpYyAgICAgIFsyXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcCAgICAgWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemUgICAgICBbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZSAgICAgIFs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZSAgICAgIFs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeSAgICAgIFs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0IFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydCBbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotLyogRnJvbSB3aW5udC5oICovCi0jZGVmaW5lIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyAgICAgICAgMHgxMGIKLQotCi0vKiBEZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcy4gKi8KLSNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwICAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jCi17Ci0gIGNoYXIgcl92YWRkciAgWzRdOwotICBjaGFyIHJfc3ltbmR4IFs0XTsKLSAgY2hhciByX3R5cGUgICBbMl07Ci0gIGNoYXIgcl9vZmZzZXQgWzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTQKLQotI2RlZmluZQlNQ09SRU1BR0lDCTB4YjAwICAvKiBJIGp1c3QgbWFkZSB0aGlzIHVwICovIAotCi0jZGVmaW5lIE1DT1JFQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPSBNQ09SRU1BR0lDKSkKLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLSAgY2hhciBmX21hZ2ljICBbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2NucyAgWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXQgWzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0ciBbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zICBbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyIFsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFncyAgWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGVfbmFtZSBbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgY2hhciBlX3plcm9lcyBbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0IFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgCi0gIGNoYXIgZV92YWx1ZSAgWzRdOwotICBjaGFyIGVfc2NudW0gIFsyXTsKLSAgY2hhciBlX3R5cGUgICBbMl07Ci0gIGNoYXIgZV9zY2xhc3MgWzFdOwotICBjaGFyIGVfbnVtYXV4IFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJMHhmCi0jZGVmaW5lIE5fVE1BU0sJCTB4MzAKLSNkZWZpbmUgTl9CVFNIRlQJNAotI2RlZmluZSBOX1RTSElGVAkyCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QKLSAgewotICAgIGNoYXIgeF90YWduZHggWzRdOwkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgIAotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7Ci0JY2hhciAgeF9sbm5vIFsyXTsgCS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JY2hhciAgeF9zaXplIFsyXTsgCS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9IHhfbG5zejsKLQotICAgICAgY2hhciB4X2ZzaXplIFs0XTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQotICAgIH0geF9taXNjOwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QgCQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0gICAgICB7Ci0JY2hhciB4X2xubm9wdHIgWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCWNoYXIgeF9lbmRuZHggIFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0gICAgICB9IHhfZmNuOwotCi0gICAgICBzdHJ1Y3QgCQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0gICAgICB7Ci0JY2hhciB4X2RpbWVuIFtFX0RJTU5VTV1bMl07Ci0gICAgICB9IHhfYXJ5OwotICAgICAgCi0gICAgfSB4X2ZjbmFyeTsKLQotICAgIGNoYXIgeF90dm5keCBbMl07CQkvKiB0diBpbmRleCAqLwotCi0gIH0geF9zeW07Ci0KLSAgdW5pb24KLSAgewotICAgIGNoYXIgeF9mbmFtZSBbRV9GSUxOTUxFTl07Ci0gICAgCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgY2hhciB4X3plcm9lcyBbNF07Ci0gICAgICBjaGFyIHhfb2Zmc2V0IFs0XTsKLSAgICB9IHhfbjsKLSAgICAKLSAgfSB4X2ZpbGU7Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHhfc2NubGVuICAgICBbNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgY2hhciB4X25yZWxvYyAgICAgWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIGNoYXIgeF9ubGlubm8gICAgIFsyXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgICBjaGFyIHhfY2hlY2tzdW0gICBbNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0gICAgY2hhciB4X2Fzc29jaWF0ZWQgWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0gICAgY2hhciB4X2NvbWRhdCAgICAgWzFdOwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciAqLwotICB9IHhfc2NuOwotCi0gIHN0cnVjdAotICB7Ci0gICAgY2hhciB4X3R2ZmlsbCBbNF07CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgY2hhciB4X3R2bGVuICBbMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuICBbMl1bMl07CS8qIHR2IHJhbmdlICovCi0gIH0geF90djsJCQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gICBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAgIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gICBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuICAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubwotewotICB1bmlvbgotICB7Ci0gICAgY2hhciBsX3N5bW5keCBbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotICAgIGNoYXIgbF9wYWRkciAgWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLSAgfSBsX2FkZHI7Ci0KLSAgY2hhciBsX2xubm8gWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSAgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIJc19uYW1lICAgIFs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhcglzX3BhZGRyICAgWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICBjaGFyCXNfdmFkZHIgICBbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgY2hhcglzX3NpemUgICAgWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBjaGFyCXNfc2NucHRyICBbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGNoYXIJc19yZWxwdHIgIFs0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyCXNfbG5ub3B0ciBbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyCXNfbnJlbG9jICBbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgY2hhcglzX25sbm5vICAgWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIJc19mbGFncyAgIFs0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyogTmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotCi0jZW5kaWYgLyogX19DT0ZGX01DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9taXBzLmggYi9pbmNsdWRlL2NvZmYvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDY2NWIxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyogRUNPRkYgc3VwcG9ydCBvbiBNSVBTIG1hY2hpbmVzLgotICAgY29mZi9lY29mZi5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMgZmlsZS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLSAgdW5zaWduZWQgY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogTWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiBjb2ZmL2Vjb2ZmLmguICAqLwotI2RlZmluZSBNSVBTX0VDT0ZGX0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDXzEpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19MSVRUTEUpICYmXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0JJRykgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0xJVFRMRTIpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUcyKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfTElUVExFMykgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0JJRzMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IGV4dGVybmFsX2FvdXRoZHIKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl0c2l6ZVs0XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbNF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs0XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzRdOwkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X3N0YXJ0WzRdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YV9zdGFydFs0XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGJzc19zdGFydFs0XTsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BybWFza1s0XTsJLyogPz8gKi8KLSAgdW5zaWduZWQgY2hhciBjcHJtYXNrWzRdWzRdOwkvKiA/PyAqLwotICB1bnNpZ25lZCBjaGFyIGdwX3ZhbHVlWzRdOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX0gQU9VVEhEUjsKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLSNkZWZpbmUgQU9VVFNaIDU2Ci0jZGVmaW5lIEFPVVRIRFJTWiA1NgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgdW5zaWduZWQgY2hhcglzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgdW5zaWduZWQgY2hhcglzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIHVuc2lnbmVkIGNoYXIJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgdW5zaWduZWQgY2hhcglzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgdW5zaWduZWQgY2hhciByX3ZhZGRyWzRdOwotICB1bnNpZ25lZCBjaGFyIHJfYml0c1s0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDgKLQotLyogTUlQUyBFQ09GRiB1c2VzIGEgcGFja2VkIDggYnl0ZSBmb3JtYXQgZm9yIHJlbG9jcy4gIFRoZXNlIGNvbnN0YW50cwotICAgYXJlIHVzZWQgdG8gdW5wYWNrIHRoZSByX2JpdHMgZmllbGQuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0JJRwkJMTYKLSNkZWZpbmUgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFCTAKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUcJCTgKLSNkZWZpbmUgUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9CSUcJCTAKLSNkZWZpbmUgUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfTElUVExFCTE2Ci0KLS8qIE9yaWdpbmFsbHksIEVDT0ZGIHVzZWQgZm91ciBiaXRzIGZvciB0aGUgcmVsb2MgdHlwZSBhbmQgaGFkIHRocmVlCi0gICByZXNlcnZlZCBiaXRzLiAgSXJpeCA0IGFkZGVkIGFub3RoZXIgYml0IGZvciB0aGUgcmVsb2MgdHlwZSwgd2hpY2gKLSAgIHdhcyBlYXN5IGJlY2F1c2UgaXQgd2FzIGJpZyBlbmRpYW4gYW5kIG9uZSBvZiB0aGUgc3BhcmUgYml0cyBiZWNhbWUKLSAgIHRoZSBuZXcgbW9zdCBzaWduaWZpY2FudCBiaXQuICBUbyBtYWtlIHRoaXMgYWxzbyB3b3JrIGZvciBsaXR0bGUKLSAgIGVuZGlhbiBFQ09GRiwgd2UgbmVlZCB0byB3cmFwIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgYml0cyBhcm91bmQgdG8KLSAgIGJlY29tZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIHJlbG9jIHR5cGUuICAqLwotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX0JJRwkJCTB4M0UKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9TSF9CSUcJCQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFCQkJMHg3OAotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRQkJMwotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFSElfTElUVExFCQkweDA0Ci0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUJCTIKLQotI2RlZmluZSBSRUxPQ19CSVRTM19FWFRFUk5fQklHCQkJMHgwMQotI2RlZmluZSBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFCQkweDgwCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICBJCi0gICBkb24ndCBrbm93IGlmIGFueSBvdGhlciB2YWx1ZXMgY2FuIGFwcGVhci4gIFRoZXNlIHNlZW0gdG8gYmUgYWxsCi0gICB0aGF0IG9jY3VyIGluIHRoZSBVbHRyaXggNC4yIGxpYnJhcmllcy4gICovCi0jZGVmaW5lIE1JUFNfUl9JR05PUkUJMAotI2RlZmluZSBNSVBTX1JfUkVGSEFMRgkxCi0jZGVmaW5lIE1JUFNfUl9SRUZXT1JECTIKLSNkZWZpbmUgTUlQU19SX0pNUEFERFIJMwotI2RlZmluZSBNSVBTX1JfUkVGSEkJNAotI2RlZmluZSBNSVBTX1JfUkVGTE8JNQotI2RlZmluZSBNSVBTX1JfR1BSRUwJNgotI2RlZmluZSBNSVBTX1JfTElURVJBTAk3Ci0KLS8qIFRoZXNlIHJlbG9jIHR5cGVzIGFyZSBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcKLSAgIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBUaGUgbnVtYmVycyBhcmUKLSAgIHRha2VuIGZyb20gSXJpeCA0LCBidXQgYXQgbGVhc3QgZm9yIGludGVybmFsIHJlbG9jcyBJcml4IDUgZG9lcyBub3QKLSAgIGdpdmUgdGhlbSB0aGUgc2FtZSBtZWFuaW5nLiAgRm9yIGFuIGludGVybmFsIHJlbG9jIHRoZSBzeW1ib2wgaW5kZXgKLSAgIG9mIFJFTEhJIGFuZCBSRUxMTyBpcyBtb2RpZmllZCBhcyBkZXNjcmliZWQgYmVsb3cgZm9yCi0gICBNSVBTX1JfU1dJVENILiAgKi8KLSNkZWZpbmUgTUlQU19SX1BDUkVMMTYJMTIKLSNkZWZpbmUgTUlQU19SX1JFTEhJCTEzCi0jZGVmaW5lIE1JUFNfUl9SRUxMTwkxNAotCi0vKiBUaGlzIHJlbG9jIHR5cGUgaXMgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uCi0gICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgaXMgdXNlZCBmb3IgYW4gZW50cnkgaW4KLSAgIGEgc3dpdGNoIHRhYmxlLCB3aGljaCBsb29rcyBsaWtlIHRoaXM6Ci0gICAgIC53b3JkICRMMy0kTFMxMgotICAgVGhlIG9iamVjdCBmaWxlIHdpbGwgY29udGFpbiB0aGUgY29ycmVjdCBkaWZmZXJlbmNlLCBhbmQgZG9lcyBub3QKLSAgIHJlcXVpcmUgYWRqdXN0bWVudC4gIEhvd2V2ZXIsIHdoZW4gdGhlIGxpbmtlciBpcyByZWxheGluZyBQQwotICAgcmVsYXRpdmUgY2FsbHMsIGl0IGlzIHBvc3NpYmxlIGZvciAkTDMgdG8gbW92ZSBmYXJ0aGVyIGF3YXkuICBUaGlzCi0gICByZWxvYyBhbHdheXMgYXBwZWFycyBpbiB0aGUgLnRleHQgc2VjdGlvbiwgYW5kIGlzIGFsd2F5cyBhZ2FpbnN0Ci0gICB0aGUgLnRleHQgc2VjdGlvbi4gIEhvd2V2ZXIsIHRoZSBzeW1ib2wgaW5kZXggaXMgbm90Ci0gICBSRUxPQ19TRUNUSU9OX1RFWFQuICBJdCBpcywgaW5zdGVhZCwgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcwotICAgc3dpdGNoIHRhYmxlIGVudHJ5IGFuZCAkTFMxMi4gIFRodXMsIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDEyIGlzCi0gICAgIHZhZGRyIC0gc3ltbmR4Ci0gICBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMyBpcwotICAgICB2YWRkciAtIHN5bW5keCArIGFkZGVuZAotICAgd2hlcmUgYWRkZW5kIGlzIHRoZSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGZpbGUuICBLbm93aW5nIHRoaXMsIHRoZQotICAgbGlua2VyIGNhbiBrbm93IHdoZXRoZXIgdGhlIGFkZGVuZCBpbiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZQotICAgYWRqdXN0ZWQuICAqLwotI2RlZmluZSBNSVBTX1JfU1dJVENICTIyCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUQUJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTUlQU19JU19TVEFCIEVDT0ZGX0lTX1NUQUIKLSNkZWZpbmUgTUlQU19NQVJLX1NUQUIgRUNPRkZfTUFSS19TVEFCCi0jZGVmaW5lIE1JUFNfVU5NQVJLX1NUQUIgRUNPRkZfVU5NQVJLX1NUQUIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MSUMgSU5GT1JNQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV3JpdHRlbiBieSBKb2huIEdpbG1vcmUuICAqLwotCi0vKiBFQ09GRiB1c2VzIENPRkYtbGlrZSBzZWN0aW9uIHN0cnVjdHVyZXMsIGJ1dCBpdHMgb3duIHN5bWJvbCBmb3JtYXQuCi0gICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3ltYm9sIGZvcm1hdCBpbiBmaWVsZHMgd2hvc2Ugc2l6ZSBhbmQgYWxpZ25tZW50Ci0gICB3aWxsIG5vdCB2YXJ5IG9uIGRpZmZlcmVudCBob3N0IHN5c3RlbXMuICAqLwotCi0vKiBGaWxlIGhlYWRlciBhcyBhIHNldCBvZiBieXRlcyAqLwotCi1zdHJ1Y3QgaGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhciAJaF9tYWdpY1syXTsKLQl1bnNpZ25lZCBjaGFyCWhfdnN0YW1wWzJdOwotCXVuc2lnbmVkIGNoYXIJaF9pbGluZU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lkbk1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JEbk9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXBkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlBkT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3ltTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlN5bU9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaW9wdE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JPcHRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lhdXhNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiQXV4T2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3NPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc0V4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc0V4dE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWZkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkZkT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlJmZE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWV4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JFeHRPZmZzZXRbNF07Ci19OwotCi0vKiBGaWxlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBmZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWZfYWRyWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9yc3NbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lzc0Jhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NiU3NbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lzeW1CYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pbGluZUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pb3B0QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY29wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXBkRmlyc3RbMl07Ci0JdW5zaWduZWQgY2hhcglmX2NwZFsyXTsKLQl1bnNpZ25lZCBjaGFyCWZfaWF1eEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NhdXhbNF07Ci0JdW5zaWduZWQgY2hhcglmX3JmZEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMlszXTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVbNF07Ci19OwotCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0JJRwkJMHhGOAotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9CSUcJCTMKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfTElUVExFCQkweDFGCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRQkwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9CSUcJCTB4MDQKLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUJCTB4MjAKLQotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9CSUcJCTB4MDIKLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFCTB4NDAKLQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9CSUcJMHgwMQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUJMHg4MAotCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfQklHCQkweEMwCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfQklHCQk2Ci0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfTElUVExFCQkweDAzCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFCTAKLQotLyogV2UgaWdub3JlIHRoZSBgcmVzZXJ2ZWQnIGZpZWxkIGluIGJpdHMyLiAqLwotCi0vKiBQcm9jZWR1cmUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglwX2lsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9jYkxpbmVPZmZzZXRbNF07Ci19OwotCi0vKiBSdW50aW1lIHByb2NlZHVyZSB0YWJsZSAqLwotCi1zdHJ1Y3QgcnBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZXJlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfcGNyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX2lycHNzWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZXNlcnZlZFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZXhjZXB0aW9uX2luZm9bNF07Ci19OwotCi0vKiBMaW5lIG51bWJlcnMgKi8KLQotc3RydWN0IGxpbmVfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWxfbGluZVs0XTsKLX07Ci0KLS8qIFN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHN5bV9leHQgewotCXVuc2lnbmVkIGNoYXIJc19pc3NbNF07Ci0JdW5zaWduZWQgY2hhcglzX3ZhbHVlWzRdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMzWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzNFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0JJRwkJMHhGQwotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfQklHCQkyCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9MSVRUTEUJCTB4M0YKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19CSUcJCTB4MDMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHCTMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0xJVFRMRQkJMHhDMAotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTElUVExFCQk2Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0JJRwkJMHhFMAotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfQklHCQk1Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19MSVRUTEUJCTB4MDcKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFCTIKLQotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfQklHCQkweDEwCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9CSUcJCTB4MEYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9MSVRUTEUJCTB4RjAKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcJMAotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZXh0X2V4dCB7Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJZXNfaWZkWzJdOwotCXN0cnVjdAlzeW1fZXh0IGVzX2FzeW07Ci19OwotCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfQklHCQkweDgwCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfTElUVExFCQkweDAxCi0KLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHCTB4NDAKLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFCTB4MDIKLQotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9CSUcJCTB4MjAKLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFCTB4MDQKLQotLyogRGVuc2UgbnVtYmVycyBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGRucl9leHQgewotCXVuc2lnbmVkIGNoYXIJZF9yZmRbNF07Ci0JdW5zaWduZWQgY2hhcglkX2luZGV4WzRdOwotfTsKLQotLyogUmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yICovCi0KLXN0cnVjdCByZmRfZXh0IHsKLSAgdW5zaWduZWQgY2hhcglyZmRbNF07Ci19OwotCi0vKiBPcHRpbWl6ZXIgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgb3B0X2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMVsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMyWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czNbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzNFsxXTsKLSAgc3RydWN0IHJuZHhfZXh0IG9fcm5keDsKLSAgdW5zaWduZWQgY2hhciBvX29mZnNldFs0XTsKLX07Ci0KLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRQkwCi0KLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9CSUcJMAotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9wZS5oIGIvaW5jbHVkZS9jb2ZmL3BlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNjc2YTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogUEUgQ09GRiBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLQotI2lmbmRlZiBfUEVfSAotI2RlZmluZSBfUEVfSAotCi0vKiBOVCBzcGVjaWZpYyBmaWxlIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgSU1BR0VfRklMRV9SRUxPQ1NfU1RSSVBQRUQgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIElNQUdFX0ZJTEVfTElORV9OVU1TX1NUUklQUEVEICAgICAgICAweDAwMDQKLSNkZWZpbmUgSU1BR0VfRklMRV9MT0NBTF9TWU1TX1NUUklQUEVEICAgICAgIDB4MDAwOAotI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0xPICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIElNQUdFX0ZJTEVfMzJCSVRfTUFDSElORSAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBJTUFHRV9GSUxFX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfRExMICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9ISSAgICAgICAgIDB4ODAwMAotCi0vKiBhZGRpdGlvbmFsIGZsYWdzIHRvIGJlIHNldCBmb3Igc2VjdGlvbiBoZWFkZXJzIHRvIGFsbG93IHRoZSBOVCBsb2FkZXIgdG8KLSAgIHJlYWQgYW5kIHdyaXRlIHRvIHRoZSBzZWN0aW9uIGRhdGEgKHRvIHJlcGxhY2UgdGhlIGFkZHJlc3NlcyBvZiBkYXRhIGluCi0gICBkbGxzIGZvciBvbmUgdGhpbmcpOyBhbHNvIHRvIGV4ZWN1dGUgdGhlIHNlY3Rpb24gaW4gLnRleHQncyBjYXNlICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgMHgwMjAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFEICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fV1JJVEUgICAgICAgMHg4MDAwMDAwMAotCi0vKgotICogU2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYWRkZWQgZm9yIHBwYy1udAotICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8qIFJlc2VydmVkLiAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUuICovCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSAgICAgICAweDAwMDAwMDQwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGluaXRpYWxpemVkIGRhdGEuICovCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBICAgICAweDAwMDAwMDgwICAvKiBTZWN0aW9uIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgZGF0YS4gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fTE5LX09USEVSICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLyogUmVzZXJ2ZWQuICovCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfSU5GTyAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIG9yIHNvbWUgb3RoZXIgdHlwZSBvZiBpbmZvcm1hdGlvbi4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19SRU1PVkUgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFNlY3Rpb24gY29udGVudHMgd2lsbCBub3QgYmVjb21lIHBhcnQgb2YgaW1hZ2UuICovCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfQ09NREFUICAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAvKiBTZWN0aW9uIGNvbnRlbnRzIGNvbWRhdC4gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0ZBUkRBVEEgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUFVSR0VBQkxFICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fMTZCSVQgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fTE9DS0VEICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUFJFTE9BRCAgICAgICAgICAgICAgICAweDAwMDgwMDAwCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUyAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzRCWVRFUyAgICAgICAgICAgICAgIDB4MDAzMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgICAgICAgICAgICAgIDB4MDA1MDAwMDAgIC8qIERlZmF1bHQgYWxpZ25tZW50IGlmIG5vIG90aGVycyBhcmUgc3BlY2lmaWVkLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyAgICAgICAgICAgICAgMHgwMDYwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUyAgICAgICAgICAgICAgMHgwMDcwMDAwMAotCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19OUkVMT0NfT1ZGTCAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIFNlY3Rpb24gY29udGFpbnMgZXh0ZW5kZWQgcmVsb2NhdGlvbnMuICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCAgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBTZWN0aW9uIGlzIG5vdCBjYWNoYWJsZS4gICAgICAgICAgICAgICAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRCAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLyogU2VjdGlvbiBpcyBub3QgcGFnZWFibGUuICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9TSEFSRUQgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAgIC8qIFNlY3Rpb24gaXMgc2hhcmVhYmxlLiAgICAgICAgICAgICAgICAgICovCi0KLS8qIENPTURBVCBzZWxlY3Rpb24gY29kZXMuICAqLwotCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTICAgICAoMSkgLyogV2FybiBpZiBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9BTlkJCSAgICAgKDIpIC8qIE5vIHdhcm5pbmcuICAqLwotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRQkgICAgICgzKSAvKiBXYXJuIGlmIGRpZmZlcmVudCBzaXplLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSAkgICAgICg0KSAvKiBXYXJuIGlmIGRpZmZlcmVudC4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkUJICAgICAoNSkgLyogQmFzZSBvbiBvdGhlciBzZWN0aW9uLiAgKi8KLQotLyogTWFnaWMgdmFsdWVzIHRoYXQgYXJlIHRydWUgZm9yIGFsbCBkb3MvbnQgaW1wbGVtZW50YXRpb25zICovCi0jZGVmaW5lIERPU01BR0lDICAgICAgIDB4NWE0ZCAgCi0jZGVmaW5lIE5UX1NJR05BVFVSRSAgIDB4MDAwMDQ1NTAKLQotICAvKiBOVCBhbGxvd3MgbG9uZyBmaWxlbmFtZXMsIHdlIHdhbnQgdG8gYWNjb21tb2RhdGUgdGhpcy4gIFRoaXMgbWF5IGJyZWFrCi0gICAgIHNvbWUgb2YgdGhlIGJmZCBmdW5jdGlvbnMgKi8KLSN1bmRlZiAgRklMTk1MRU4KLSNkZWZpbmUgRklMTk1MRU4JMTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLS8qIFRoZSBmaWxlaGRyIGlzIG9ubHkgd2VpcmVkIGluIGltYWdlcyAqLwotCi0jdW5kZWYgRklMSERSCi1zdHJ1Y3QgZXh0ZXJuYWxfUEVfZmlsZWhkcgotewotICAvKiBET1MgaGVhZGVyIGZpZWxkcyAqLwotICBjaGFyIGVfbWFnaWNbMl07CQkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLwotICBjaGFyIGVfY2JscFsyXTsJCS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCi0gIGNoYXIgZV9jcFsyXTsJCQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KLSAgY2hhciBlX2NybGNbMl07CQkvKiBSZWxvY2F0aW9ucywgMHgwICovCi0gIGNoYXIgZV9jcGFyaGRyWzJdOwkJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCi0gIGNoYXIgZV9taW5hbGxvY1syXTsJCS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLwotICBjaGFyIGVfbWF4YWxsb2NbMl07CQkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KLSAgY2hhciBlX3NzWzJdOwkJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9zcFsyXTsJCQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCi0gIGNoYXIgZV9jc3VtWzJdOwkJLyogQ2hlY2tzdW0sIDB4MCAqLwotICBjaGFyIGVfaXBbMl07CQkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9jc1syXTsJCQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLwotICBjaGFyIGVfbGZhcmxjWzJdOwkJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KLSAgY2hhciBlX292bm9bMl07CQkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCi0gIGNoYXIgZV9yZXNbNF1bMl07CQkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICBjaGFyIGVfb2VtaWRbMl07CQkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLwotICBjaGFyIGVfb2VtaW5mb1syXTsJCS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCi0gIGNoYXIgZV9yZXMyWzEwXVsyXTsJCS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIGNoYXIgZV9sZmFuZXdbNF07CQkvKiBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIsIDB4ODAgKi8KLSAgY2hhciBkb3NfbWVzc2FnZVsxNl1bNF07CS8qIG90aGVyIHN0dWZmLCBhbHdheXMgZm9sbG93IERPUyBoZWFkZXIgKi8KLSAgY2hhciBudF9zaWduYXR1cmVbNF07CQkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKLQotICAvKiBGcm9tIHN0YW5kYXJkIGhlYWRlciAqLyAgCi0KLQotICBjaGFyIGZfbWFnaWNbMl07CQkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnNbMl07CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0cls0XTsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zWzRdOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CQkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzWzJdOwkJLyogZmxhZ3MJCQkqLwotCi19OwotCi0KLSNkZWZpbmUgRklMSERSIHN0cnVjdCBleHRlcm5hbF9QRV9maWxlaGRyCi0jdW5kZWYgRklMSFNaCi0jZGVmaW5lIEZJTEhTWiAxNTIKLQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBBT1VUSERSIHN0YW5kYXJkOwotCi0gIC8qIE5UIGV4dHJhIGZpZWxkczsgc2VlIGludGVybmFsLmggZm9yIGRlc2NyaXB0aW9ucyAqLwotICBjaGFyICBJbWFnZUJhc2VbNF07Ci0gIGNoYXIgIFNlY3Rpb25BbGlnbm1lbnRbNF07Ci0gIGNoYXIgIEZpbGVBbGlnbm1lbnRbNF07Ci0gIGNoYXIgIE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBNYWpvckltYWdlVmVyc2lvblsyXTsKLSAgY2hhciAgTWlub3JJbWFnZVZlcnNpb25bMl07Ci0gIGNoYXIgIE1ham9yU3Vic3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBSZXNlcnZlZDFbNF07Ci0gIGNoYXIgIFNpemVPZkltYWdlWzRdOwotICBjaGFyICBTaXplT2ZIZWFkZXJzWzRdOwotICBjaGFyICBDaGVja1N1bVs0XTsKLSAgY2hhciAgU3Vic3lzdGVtWzJdOwotICBjaGFyICBEbGxDaGFyYWN0ZXJpc3RpY3NbMl07Ci0gIGNoYXIgIFNpemVPZlN0YWNrUmVzZXJ2ZVs0XTsKLSAgY2hhciAgU2l6ZU9mU3RhY2tDb21taXRbNF07Ci0gIGNoYXIgIFNpemVPZkhlYXBSZXNlcnZlWzRdOwotICBjaGFyICBTaXplT2ZIZWFwQ29tbWl0WzRdOwotICBjaGFyICBMb2FkZXJGbGFnc1s0XTsKLSAgY2hhciAgTnVtYmVyT2ZSdmFBbmRTaXplc1s0XTsKLSAgLyogSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107ICovCi0gIGNoYXIgIERhdGFEaXJlY3RvcnlbMTZdWzJdWzRdOyAvKiAxNiBlbnRyaWVzLCAyIGVsZW1lbnRzL2VudHJ5LCA0IGNoYXJzICovCi0KLX0gUEVBT1VUSERSOwotCi0KLSN1bmRlZiBBT1VUU1oKLSNkZWZpbmUgQU9VVFNaIChBT1VUSERSU1ogKyAxOTYpCi0KLSN1bmRlZiAgRV9GSUxOTUxFTgotI2RlZmluZSBFX0ZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3Bvd2VycGMuaCBiL2luY2x1ZGUvY29mZi9wb3dlcnBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTJjZjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3Bvd2VycGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBCYXNpYyBjb2ZmIGluZm9ybWF0aW9uIGZvciB0aGUgUG93ZXJQQwotICoKLSAqIEJhc2VkIG9uIGNvZmYvcnM2MDAwLmgsIGNvZmYvaTM4Ni5oIGFuZCBvdGhlcnMuCi0gKgotICogSW5pdGlhbCByZWxlYXNlOiBLaW0gS251dHRpbGEgKGtya0BjeWdudXMuY29tKQotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLSAgY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLQotLyogZXh0cmEgTlQgZGVmaW5lcyAqLwotI2RlZmluZSBQUENNQUdJQyAgICAgICAwNzYwICAgICAgICAgLyogcGVla2VkIG9uIGFhIFBvd2VyUEMgV2luZG93cyBOVCBib3ggKi8KLSNkZWZpbmUgRE9TTUFHSUMgICAgICAgMHg1YTRkICAgICAgIC8qIGZyb20gYXJtLmgsIGkzODYuaCAqLwotI2RlZmluZSBOVF9TSUdOQVRVUkUgICAweDAwMDA0NTUwICAgLyogZnJvbSBhcm0uaCwgaTM4Ni5oICovCi0KLS8qIGZyb20gd2lubnQuaCAqLwotI2RlZmluZSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMgICAgICAgIDB4MTBiCi0KLSNkZWZpbmUgUFBDQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBQUENNQUdJQykgCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotICBjaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSAgICAqLwotICBjaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICBjaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJICAgICAgICAgICAgKi8KLSAgY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkgICAgKi8KLSAgY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSAgICAqLwotICBjaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkgICAgKi8KLSAgY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJICAgICovCi0gIGNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzICAgICovCi0gIGNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJICAgICovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLSAgdW5pb24gewotICAgIGNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAgKi8KLSAgICBjaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkgICAgICAgKi8KLSAgfSBsX2FkZHI7Ci0gIGNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJICAgICAgICAgICAgICAgICAgICAgICAqLwotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4ICAgICAvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZSAgICAgICAqLwotCi0vKiBBbGxvdyB0aGUgZmlsZSBuYW1lIGxlbmd0aCB0byBiZSBvdmVycmlkZGVuIGluIHRoZSBpbmNsdWRpbmcgZmlsZSAgICovCi0jaWZuZGVmIEVfRklMTk1MRU4KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAotI2VuZGlmCi0KLSNkZWZpbmUgRV9ESU1OVU0JNCAgICAgLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3RhZ25keFs0XTsJICAgICAgICAgICAvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICAgICAgICovCi0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsKLQljaGFyICB4X2xubm9bMl07ICAgICAgICAgICAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAgICAgICAgICovCi0JY2hhciAgeF9zaXplWzJdOyAgICAgICAgICAgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgICAgICAgICAgICAqLwotICAgICAgfSB4X2xuc3o7Ci0gICAgICBjaGFyIHhfZnNpemVbNF07CSAgICAgICAgICAgLyogc2l6ZSBvZiBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwotICAgIH0geF9taXNjOwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7CQkgICAgICAgICAgIC8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAgICAgICAgICAgKi8KLQljaGFyIHhfbG5ub3B0cls0XTsgICAgICAgICAvKiBwdHIgdG8gZmNuIGxpbmUgIyAgICAgICAgICAgICAgICovCi0JY2hhciB4X2VuZG5keFs0XTsJICAgLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICAgICAgICAqLwotICAgICAgfSB4X2ZjbjsKLSAgICAgIHN0cnVjdCB7CQkgICAgICAgICAgIC8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAgICAgICAgKi8KLQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICB9IHhfZmNuYXJ5OwotICAgIGNoYXIgeF90dm5keFsyXTsJCSAgIC8qIHR2IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLSAgICBjaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgeF96ZXJvZXNbNF07Ci0gICAgICBjaGFyIHhfb2Zmc2V0WzRdOwotICAgIH0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3Njbmxlbls0XTsJICAgICAgICAgICAvKiBzZWN0aW9uIGxlbmd0aCAgICAgICAgICAgICAgICAgICovCi0gICAgY2hhciB4X25yZWxvY1syXTsJICAgICAgICAgICAvKiAjIHJlbG9jYXRpb24gZW50cmllcyAgICAgICAgICAgICovCi0gICAgY2hhciB4X25saW5ub1syXTsJICAgICAgICAgICAvKiAjIGxpbmUgbnVtYmVycyAgICAgICAgICAgICAgICAgICovCi0gICAgY2hhciB4X2NoZWNrc3VtWzRdOwkJICAgLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0JICAgICAgKi8KLSAgICBjaGFyIHhfYXNzb2NpYXRlZFsyXTsJICAgLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotICAgIGNoYXIgeF9jb21kYXRbMV07CQkgICAvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlcgkgICAgICAqLwotICB9IHhfc2NuOwotfTsKLQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0jZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3JzNjAwMC5oIGIvaW5jbHVkZS9jb2ZmL3JzNjAwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGVmMWQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9yczYwMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKiBJQk0gUlMvNjAwMCAiWENPRkYiIGZpbGUgZGVmaW5pdGlvbnMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEZJWE1FOiBDYW4gc29tZW9uZSBwcm92aWRlIGEgdHJhbnNsaXRlcmF0aW9uIG9mIHRoaXMgbmFtZSBpbnRvIEFTQ0lJPwotICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFycyBjYXVzZWQgYSBjb21waWxlciB3YXJuaW5nIG9uIEhJVVggKHNvIEkgcmVwbGFjZWQKLSAgIHRoZW0gd2l0aCBvY3RhbCBlc2NhcGVzKSwgYW5kIGlzbid0IHVzZWZ1bCB3aXRob3V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdAotICAgY2hhcmFjdGVyIHNldCBpdCBpcy4KLSAgIFdyaXR0ZW4gYnkgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSBvZiBJQk0KLSAgIGFuZCBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotICAgICAgICAvKiBJQk0gUlMvNjAwMCAqLwotI2RlZmluZSBVODAyV1JNQUdJQyAgICAgMDczMCAgICAvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqKmNoaCoqICAgICAgKi8KLSNkZWZpbmUgVTgwMlJPTUFHSUMgICAgIDA3MzUgICAgLyogcmVhZG9ubHkgc2hhcmFibGUgdGV4dCBzZWdtZW50cyAgICAgICovCi0jZGVmaW5lIFU4MDJUT0NNQUdJQyAgICAwNzM3ICAgIC8qIHJlYWRvbmx5IHRleHQgc2VnbWVudHMgYW5kIFRPQyAgICAgICAqLwotCi0jZGVmaW5lIEJBRE1BRyh4KQlcCi0JKCh4KS5mX21hZ2ljICE9IFU4MDJST01BR0lDICYmICh4KS5mX21hZ2ljICE9IFU4MDJXUk1BR0lDICYmIFwKLQkgKHgpLmZfbWFnaWMgIT0gVTgwMlRPQ01BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIHVuc2lnbmVkIGNoYXIJbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkqLwotICB1bnNpZ25lZCBjaGFyCXRzaXplWzRdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5ICovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbNF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkqLwotICB1bnNpZ25lZCBjaGFyCWJzaXplWzRdOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJKi8KLSAgdW5zaWduZWQgY2hhcgllbnRyeVs0XTsJLyogZW50cnkgcHQuCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl0ZXh0X3N0YXJ0WzRdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJZGF0YV9zdGFydFs0XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCW9fdG9jWzRdOwkvKiBhZGRyZXNzIG9mIFRPQyAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25lbnRyeVsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgZW50cnkgcG9pbnQgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NudGV4dFsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLnRleHQgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25kYXRhWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAuZGF0YSBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbnRvY1syXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgVE9DICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmxvYWRlclsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmxvYWRlciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmJzc1syXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmJzcyBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19hbGdudGV4dFsyXTsJLyogLnRleHQgYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJb19hbGduZGF0YVsyXTsJLyogLmRhdGEgYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJb19tb2R0eXBlWzJdOwkvKiBtb2R1bGUgdHlwZSAoPz8pICovCi0gIHVuc2lnbmVkIGNoYXIgb19jcHV0eXBlWzJdOwkvKiBjcHUgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCW9fbWF4c3RhY2tbNF07CS8qIG1heCBzdGFjayBzaXplICg/PykgKi8KLSAgdW5zaWduZWQgY2hhciBvX21heGRhdGFbNF07CS8qIG1heCBkYXRhIHNpemUgKD8/KSAqLwotICB1bnNpZ25lZCBjaGFyCW9fcmVzdjJbMTJdOwkvKiByZXNlcnZlZCAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogNzIKLSNkZWZpbmUgU01BTExfQU9VVFNaICgyOCkKLSNkZWZpbmUgQU9VVEhEUlNaIDcyCi0KLSNkZWZpbmUJUlM2S19BT1VUSERSX09NQUdJQwkweDAxMDcJLyogb2xkOiB0ZXh0ICYgZGF0YSB3cml0ZWFibGUgKi8KLSNkZWZpbmUJUlM2S19BT1VUSERSX05NQUdJQwkweDAxMDgJLyogbmV3OiB0ZXh0IHIvbywgZGF0YSByL3cgKi8KLSNkZWZpbmUJUlM2S19BT1VUSERSX1pNQUdJQwkweDAxMEIJLyogcGFnZWQ6IHRleHQgci9vLCBib3RoIHBhZ2UtYWxpZ25lZCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfUEFECSIucGFkIgotI2RlZmluZSBfTE9BREVSCSIubG9hZGVyIgotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAubG9hZGVyIHNlY3Rpb24gd2l0aCB0eXBlIFNUWVBfTE9BREVSLiAgKi8KLSNkZWZpbmUgU1RZUF9MT0FERVIgMHgxMDAwCi0KLS8qIFhDT0ZGIHVzZXMgYSBzcGVjaWFsIC5kZWJ1ZyBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0RFQlVHLiAgKi8KLSNkZWZpbmUgU1RZUF9ERUJVRyAweDIwMDAKLQotLyogWENPRkYgaGFuZGxlcyBsaW5lIG51bWJlciBvciByZWxvY2F0aW9uIG92ZXJmbG93IGJ5IGNyZWF0aW5nCi0gICBhbm90aGVyIHNlY3Rpb24gaGVhZGVyIHdpdGggU1RZUF9PVlJGTE8gc2V0LiAgKi8KLSNkZWZpbmUgU1RZUF9PVlJGTE8gMHg4MDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBjaGFyIHhfc2NubGVuWzRdOwotCQl1bnNpZ25lZCBjaGFyIHhfcGFybWhhc2hbNF07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbmhhc2hbMl07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbXR5cFsxXTsKLQkJdW5zaWduZWQgY2hhciB4X3NtY2xhc1sxXTsKLQkJdW5zaWduZWQgY2hhciB4X3N0YWJbNF07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbnN0YWJbMl07Ci0JfSB4X2NzZWN0OwotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLSNkZWZpbmUgREJYTUFTSyAweDgwCQkvKiBmb3IgZGJ4IHN0b3JhZ2UgbWFzayAqLwotI2RlZmluZSBTWU1OQU1FX0lOX0RFQlVHKHN5bXB0cikgKChzeW1wdHIpLT5uX3NjbGFzcyAmIERCWE1BU0spCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9zaXplWzFdOwotICBjaGFyIHJfdHlwZVsxXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQotI2RlZmluZSBERUZBVUxUX0RBVEFfU0VDVElPTl9BTElHTk1FTlQgNAotI2RlZmluZSBERUZBVUxUX0JTU19TRUNUSU9OX0FMSUdOTUVOVCA0Ci0jZGVmaW5lIERFRkFVTFRfVEVYVF9TRUNUSU9OX0FMSUdOTUVOVCA0Ci0vKiBGb3IgbmV3IHNlY3Rpb25zIHdlIGhhdm4ndCBoZWFyZCBvZiBiZWZvcmUgKi8KLSNkZWZpbmUgREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVCA0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvc2guaCBiL2luY2x1ZGUvY29mZi9zaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk1N2RmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBTSCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJU0hfQVJDSF9NQUdJQ19CSUcJMHgwNTAwCi0jZGVmaW5lCVNIX0FSQ0hfTUFHSUNfTElUVExFCTB4MDU1MCAgLyogTGl0dGxlIGVuZGlhbiBTSCAqLwotCi0KLSNkZWZpbmUgU0hCQURNQUcoeCkgXAotICgoKHgpLmZfbWFnaWMhPVNIX0FSQ0hfTUFHSUNfQklHKSAmJiBcCi0gICgoeCkuZl9tYWdpYyE9U0hfQVJDSF9NQUdJQ19MSVRUTEUpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0vKiBTSCByZWxvY2F0aW9uIHR5cGVzLiAgTm90IGFsbCBvZiB0aGVzZSBhcmUgYWN0dWFsbHkgdXNlZC4gICovCi0KLSNkZWZpbmUgUl9TSF9VTlVTRUQJMAkJLyogb25seSB1c2VkIGludGVybmFsbHkgKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTDggCTMJCS8qICA4IGJpdCBwY3JlbCAJKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTDE2IAk0CQkvKiAxNiBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfU0hfSElHSDggIAk1CQkvKiBoaWdoIDggYml0cyBvZiAyNCBiaXQgYWRkcmVzcyAqLwotI2RlZmluZSBSX1NIX0xPVzE2IAk3CQkvKiBsb3cgMTYgYml0cyBvZiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NMjQJNgkJLyogMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX1BDRElTUDhCWTQJOSAgCQkvKiBQQyByZWwgOCBiaXRzICo0ICt2ZSAqLwotI2RlZmluZSBSX1NIX1BDRElTUDhCWTIJMTAgIAkJLyogUEMgcmVsIDggYml0cyAqMiArdmUgKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1A4ICAgIDExICAJCS8qIDggYml0IGJyYW5jaCAqLwotI2RlZmluZSBSX1NIX1BDRElTUCAgICAgMTIgIAkJLyogMTIgYml0IGJyYW5jaCAqLwotI2RlZmluZSBSX1NIX0lNTTMyICAgICAgMTQgICAgCQkvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NOCAgIAkxNgkJLyogOCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NOEJZMiAgICAxNwkJLyogOCBiaXQgaW1tZWRpYXRlICoyICovCi0jZGVmaW5lIFJfU0hfSU1NOEJZNCAgICAxOAkJLyogOCBiaXQgaW1tZWRpYXRlICo0ICovCi0jZGVmaW5lIFJfU0hfSU1NNCAgIAkxOQkJLyogNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NNEJZMiAgICAyMAkJLyogNCBiaXQgaW1tZWRpYXRlICoyICovCi0jZGVmaW5lIFJfU0hfSU1NNEJZNCAgICAyMQkJLyogNCBiaXQgaW1tZWRpYXRlICo0ICovCi0jZGVmaW5lIFJfU0hfUENSRUxJTU04QlkyICAgMjIJCS8qIFBDIHJlbCA4IGJpdHMgKjIgdW5zaWduZWQgKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTElNTThCWTQgICAyMwkJLyogUEMgcmVsIDggYml0cyAqNCB1bnNpZ25lZCAqLwotI2RlZmluZSBSX1NIX0lNTTE2ICAgICAgMjQgICAgCQkvKiAxNiBiaXQgaW1tZWRpYXRlICovCi0KLS8qIFRoZSBzd2l0Y2ggdGFibGUgcmVsb2MgdHlwZXMgYXJlIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhleSBhcmUKLSAgIGdlbmVyYXRlZCBmb3IgZXhwcmVzc2lvbnMgc3VjaCBhcwotICAgICAud29yZCBMMSAtIEwyCi0gICBUaGUgcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcwotICAgYW5kIEwyLiAgKi8KLSNkZWZpbmUgUl9TSF9TV0lUQ0g4CTMzCQkvKiA4IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgUl9TSF9TV0lUQ0gxNgkyNQkJLyogMTYgYml0IHN3aXRjaCB0YWJsZSBlbnRyeSAqLwotI2RlZmluZSBSX1NIX1NXSVRDSDMyCTI2CQkvKiAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5ICovCi0KLS8qIFRoZSBVU0VTIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUgY29tcGlsZXIgd2lsbAotICAgZ2VuZXJhdGUgLnVzZXMgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBpdAotICAgY2FuIHJlbGF4LiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBVU0VTIHJlbG9jIGhvbGRzIHRoZSBQQwotICAgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbgotICAgdGhlIGZ1bmN0aW9uIGNhbGwuICAqLwotI2RlZmluZSBSX1NIX1VTRVMJMjcJCS8qIC51c2VzIHBzZXVkby1vcCAqLwotCi0vKiBUaGUgQ09VTlQgcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSBhc3NlbWJsZXIgd2lsbAotICAgZ2VuZXJhdGUgQ09VTlQgcmVsb2NzIGZvciBhZGRyZXNzZXMgcmVmZXJyZWQgdG8gYnkgdGhlIHJlZ2lzdGVyCi0gICBsb2FkcyBhc3NvY2lhdGVkIHdpdGggVVNFUyByZWxvY3MuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlIENPVU5UCi0gICByZWxvYyBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCi0gICBvYmplY3QgZmlsZS4gICovCi0jZGVmaW5lIFJfU0hfQ09VTlQJMjgJCS8qIENvdW50IG9mIGNvbnN0YW50IHBvb2wgdXNlcyAqLwotCi0vKiBUaGUgQUxJR04gcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSByX29mZnNldCBmaWVsZCBpcwotICAgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZQotICAgbXVzdCBiZSBhbGlnbmVkLiAgKi8KLSNkZWZpbmUgUl9TSF9BTElHTgkyOQkJLyogLmFsaWduIHBzZXVkby1vcCAqLwotCi0vKiBUaGUgQ09ERSBhbmQgREFUQSByZWxvYyB0eXBlcyBhcmUgdXNlZCBmb3IgYWxpZ25pbmcgbG9hZCBhbmQgc3RvcmUKLSAgIGluc3RydWN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIENPREUgcmVsb2MgYmVmb3JlIGEKLSAgIGJsb2NrIG9mIGluc3RydWN0aW9ucy4gIEl0IHdpbGwgZ2VuZXJhdGUgYSBEQVRBIHJlbG9jIGJlZm9yZSBkYXRhLgotICAgQSBzZWN0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgYXNzdW1pbmcgaXQgY29udGFpbnMgZGF0YSwgdW5sZXNzIGEKLSAgIENPREUgcmVsb2MgaXMgc2Vlbi4gIFRoZSBvbmx5IHJlbGV2YW50IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgIENPREUgYW5kIERBVEEgcmVsb2NzIGFyZSB0aGUgc2VjdGlvbiBhbmQgdGhlIGFkZHJlc3MuICBUaGUgc3ltYm9sCi0gICBhbmQgb2Zmc2V0IGFyZSBtZWFuaW5nbGVzcy4gICovCi0jZGVmaW5lIFJfU0hfQ09ERQkzMAkJLyogc3RhcnQgb2YgY29kZSAqLwotI2RlZmluZSBSX1NIX0RBVEEJMzEJCS8qIHN0YXJ0IG9mIGRhdGEgKi8KLQotLyogVGhlIExBQkVMIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgYWxpZ25pbmcgbG9hZCBhbmQgc3RvcmUKLSAgIGluc3RydWN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIExBQkVMIHJlbG9jIGZvciBlYWNoCi0gICBsYWJlbCB3aXRoaW4gYSBibG9jayBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0bwotICAgYXZvaWQgc3dhcHBpbmcgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSB0aGUgdGFyZ2V0cyBvZiBicmFuY2hlcy4gICovCi0jZGVmaW5lIFJfU0hfTEFCRUwJMzIJCS8qIGxhYmVsICovCi0KLS8qIE5COiBSX1NIX1NXSVRDSDggaXMgMzMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zcGFyYy5oIGIvaW5jbHVkZS9jb2ZmL3NwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTI0ZjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3NwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBTcGFyYy4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBhbiBhbWFsZ2FtYXRpb24gb2Ygc2V2ZXJhbCBzdGFuZGFyZCBpbmNsdWRlIGZpbGVzIHRoYXQKLSAgIGRlZmluZSBjb2ZmIGZvcm1hdCwgc3VjaCBhcyBmaWxlaGRyLmgsIGFvdXRoZHIuaCwgYW5kIHNvIGZvcnRoLiAgSW4KLSAgIGFkZGl0aW9uLCBhbGwgZGF0YXR5cGVzIGhhdmUgYmVlbiB0cmFuc2xhdGVkIGludG8gY2hhcmFjdGVyIGFycmF5cyBvZgotICAgKHByZXN1bWVkKSBlcXVpdmFsZW50IHNpemUuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHRoaXMgZmlsZSBjYW4KLSAgIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgc3lzdGVtcyB3aGlsZSBzdGlsbCB5aWVsZGluZyB0aGUgc2FtZSByZXN1bHRzLiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLSAgY2hhciBmX21hZ2ljWzJdOwkJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zWzJdOwkJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBjaGFyIGZfdGltZGF0WzRdOwkJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGNoYXIgZl9zeW1wdHJbNF07CQkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltc1s0XTsJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyWzJdOwkJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFnc1syXTsJCS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkJLyogcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkICovCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikJLyogZmlsZSBpcyBleGVjdXRhYmxlICovCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkJLyogbGluZSBudW1iZXJzIHN0cmlwcGVkICovCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCS8qIGxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgKi8KLQotI2RlZmluZSBTUEFSQ01BR0lDCSgwNTQwKQotCi0vKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KLQotI2RlZmluZSBMWU5YQ09GRk1BR0lDCSgwNDE1KQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciBtYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyIHZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyIHRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIgZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIgYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIgZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciB0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIGRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkcgotewotICBjaGFyIHNfbmFtZVs4XTsJCS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIGNoYXIgc19wYWRkcls0XTsJCS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIgc192YWRkcls0XTsJCS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgY2hhciBzX3NpemVbNF07CQkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBjaGFyIHNfc2NucHRyWzRdOwkJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhciBzX3JlbHB0cls0XTsJCS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgY2hhciBzX2xubm9wdHJbNF07CQkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgY2hhciBzX25yZWxvY1syXTsJCS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgY2hhciBzX25sbm5vWzJdOwkJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICBjaGFyIHNfZmxhZ3NbNF07CQkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKiBOYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMuICovCi0KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9UVgkiLnR2IgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gICBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAgIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gICBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuICovCi0KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLXsKLSAgdW5pb24gewotICAgIGNoYXIgbF9zeW1uZHhbNF07CQkvKiBmbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwICovCi0gICAgY2hhciBsX3BhZGRyWzRdOwkJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyICovCi0gIH0gbF9hZGRyOwotICBjaGFyIGxfbG5ub1syXTsJCS8qIGxpbmUgbnVtYmVyICovCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgkoNikKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JKDgpCS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JKDE0KQkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCSg0KQkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotI2lmIDAgLyogb2YgZG91YnRmdWwgdmFsdWUgKi8KLSAgICBjaGFyIGVfbnB0clsyXVs0XTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX2xlYWRpbmdfemVyb1sxXTsKLSAgICAgIGNoYXIgZV9kYnhfdHlwZVsxXTsKLSAgICAgIGNoYXIgZV9kYnhfZGVzY1syXTsKLSAgICB9IGVfZGJ4OwotI2VuZGlmCi0gIH0gZTsKLQotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci0gIGNoYXIgcGFkZGluZ1syXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQKLXsKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdGFnbmR4WzRdOwkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7Ci0JY2hhciAgeF9sbm5vWzJdOwkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCWNoYXIgIHhfc2l6ZVsyXTsJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0geF9sbnN6OwotICAgICAgY2hhciB4X2ZzaXplWzRdOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotICAgIH0geF9taXNjOwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7CQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0gICAgICB9IHhfZmNuOwotICAgICAgc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0gICAgICB9IHhfYXJ5OwotICAgIH0geF9mY25hcnk7Ci0gICAgY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLSAgICBjaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgeF96ZXJvZXNbNF07Ci0gICAgICBjaGFyIHhfb2Zmc2V0WzRdOwotICAgIH0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3Njbmxlbls0XTsJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgY2hhciB4X25yZWxvY1syXTsJCS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0gICAgY2hhciB4X25saW5ub1syXTsJCS8qICMgbGluZSBudW1iZXJzICovCi0gIH0geF9zY247Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90dmZpbGxbNF07CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgY2hhciB4X3R2bGVuWzJdOwkJLyogbGVuZ3RoIG9mIC50diAqLwotICAgIGNoYXIgeF90dnJhblsyXVsyXTsJCS8qIHR2IHJhbmdlICovCi0gIH0geF90djsJCQkvKiAudHYgc2VjdGlvbiBpbmZvIChpbiBhdXhlbnQgb2Ygc3ltIC50dikpICovCi0KLSAgY2hhciB4X2ZpbGxbMjBdOwkJLyogZm9yY2VzIHRvIDIwLWJ5dGUgc2l6ZSAqLwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMjAJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTIwCi0KLSNkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zcGFyZVsyXTsKLSAgY2hhciByX29mZnNldFs0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zeW0uaCBiL2luY2x1ZGUvY29mZi9zeW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyMDRhZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc3ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIG9mIGludGVybmFsIGZvcm1hdCBvZiBNSVBTIEVDT0ZGIHN5bWJvbHMuCi0gICBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcyBhbmQgVGhpcmQgRXllIFNvZnR3YXJlLgotICAgQ2hhbmdlcyBjb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydCBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uICAKLQotICAgVGhpcyBmaWxlIGlzIGp1c3QgYWdncmVnYXRlZCB3aXRoIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIEdOVQotICAgcmVsZWFzZTsgaXQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiBHQVMsIEdEQiwgb3Igb3RoZXIgR05VCi0gICBwcm9ncmFtcy4gICovCi0KLS8qCi0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKiB8IENvcHlyaWdodCAoYykgMTk5MiwgMTk5MSwgMTk5MCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy58Ci0gKiB8IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgICB8Ci0gKiB8IHJpZ2h0cyB0byBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgICAgICB8Ci0gKiB8IG1haW50YWluZWQgaW4gdGhlIGNvcHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKi8KLSNpZm5kZWYgX1NZTV9ICi0jZGVmaW5lIF9TWU1fSAotCi0vKiAoQykgQ29weXJpZ2h0IDE5ODQgYnkgVGhpcmQgRXllIFNvZnR3YXJlLCBJbmMuCi0gKgotICogVGhpcmQgRXllIFNvZnR3YXJlLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSByaWdodHMgdG8KLSAqIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyBtYWludGFpbmVkIGluIHRoZSBjb3B5LgotICoKLSAqIFRoaXJkIEV5ZSBtYWtlcyBubyBjbGFpbXMgYWJvdXQgdGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhpcwotICogc3ltYm9sIHRhYmxlIHRvIGEgcGFydGljdWxhciB1c2UuCi0gKi8KLQotLyogCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIFRoaXJkIEV5ZSBTeW1ib2wgVGFibGUuCi0gKgotICogU3ltYm9scyBhcmUgYXNzdW1lZCB0byBiZSBpbiAnZW5jb3VudGVyIG9yZGVyJyAtIGkuZS4gdGhlIG9yZGVyIHRoYXQKLSAqIHRoZSB0aGluZ3MgdGhleSByZXByZXNlbnQgd2VyZSBlbmNvdW50ZXJlZCBieSB0aGUgY29tcGlsZXIvYXNzZW1ibGVyL2xvYWRlci4KLSAqIEVYQ0VQVCBmb3IgZ2xvYmFscyEJVGhlc2UgYXJlIGFzc3VtZWQgdG8gYmUgYnVuY2hlZCB0b2dldGhlciwKLSAqIHByb2JhYmx5IHJpZ2h0IGFmdGVyIHRoZSBsYXN0ICdub3JtYWwnIHN5bWJvbC4gIEdsb2JhbHMgQVJFIHNvcnRlZAotICogaW4gYXNjZW5kaW5nIG9yZGVyLgotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBBIGJyaWVmIHdvcmQgYWJvdXQgVGhpcmQgRXllIG5hbWluZy91c2UgY29udmVudGlvbnM6Ci0gKgotICogQWxsIGFycmF5cyBhbmQgaW5kZXgncyBhcmUgMCBiYXNlZC4KLSAqIEFsbCAiaWZvb01heCIgdmFsdWVzIGFyZSB0aGUgaGlnaGVzdCBsZWdhbCB2YWx1ZSBQTFVTIE9ORS4gVGhpcyBtYWtlcwotICogdGhlbSBnb29kIGZvciBhbGxvY2F0aW5nIGFycmF5cywgZXRjLiBBbGwgY2hlY2tzIGFyZSAiaWZvbyA8IGlmb29NYXgiLgotICoKLSAqICJpc3ltIglJbmRleCBpbnRvIHRoZSBTWU1ib2wgdGFibGUuCi0gKiAiaXBkIglJbmRleCBpbnRvIHRoZSBQcm9jZWR1cmUgRGVzY3JpcHRvciBhcnJheS4KLSAqICJpZmQiCUluZGV4IGludG8gdGhlIEZpbGUgRGVzY3JpcHRvciBhcnJheS4KLSAqICJpc3MiCUluZGV4IGludG8gU3RyaW5nIFNwYWNlLgotICogImNiIgkJQ291bnQgb2YgQnl0ZXMuCi0gKiAicmdQZCIJYXJyYXkgd2hvc2UgZG9tYWluIGlzICIwLi5pcGRNYXgtMSIgYW5kIFJhbkdlIGlzIFBEUi4KLSAqICJyZ0ZkIglhcnJheSB3aG9zZSBkb21haW4gaXMgIjAuLmlmZE1heC0xIiBhbmQgUmFuR2UgaXMgRkRSLgotICovCi0KLQotLyogCi0gKiBTeW1ib2xpYyBIZWFkZXIgKEhEUikgc3RydWN0dXJlLgotICogQXMgbG9uZyBhcyBhbGwgdGhlIHBvaW50ZXJzIGFyZSBzZXQgY29ycmVjdGx5LAotICogd2UgZG9uJ3QgY2FyZSBXSEFUIG9yZGVyIHRoZSB2YXJpb3VzIHNlY3Rpb25zIGNvbWUgb3V0IGluIQotICoKLSAqIEEgZmlsZSBwcm9kdWNlZCBzb2xlbHkgZm9yIHRoZSB1c2Ugb2YgQ0RCIHdpbGwgcHJvYmFibHkgTk9UIGhhdmUKLSAqIGFueSBpbnN0cnVjdGlvbnMgb3IgZGF0YSBhcmVhcyBpbiBpdCwgYXMgdGhlc2UgYXJlIGF2YWlsYWJsZQotICogaW4gdGhlIG9yaWdpbmFsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydAltYWdpYzsJCS8qIHRvIHZlcmlmeSB2YWxpZGl0eSBvZiB0aGUgdGFibGUgKi8KLQlzaG9ydAl2c3RhbXA7CQkvKiB2ZXJzaW9uIHN0YW1wICovCi0JbG9uZwlpbGluZU1heDsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiTGluZTsJCS8qIG51bWJlciBvZiBieXRlcyBmb3IgbGluZSBudW1iZXIgZW50cmllcyAqLwotCWJmZF92bWEJY2JMaW5lT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JbG9uZwlpZG5NYXg7CQkvKiBtYXggaW5kZXggaW50byBkZW5zZSBudW1iZXIgdGFibGUgKi8KLQliZmRfdm1hCWNiRG5PZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBkZW5zZSBudW1iZXIgdGFibGUgKi8KLQlsb25nCWlwZE1heDsJCS8qIG51bWJlciBvZiBwcm9jZWR1cmVzICovCi0JYmZkX3ZtYQljYlBkT2Zmc2V0OwkvKiBvZmZzZXQgdG8gcHJvY2VkdXJlIGRlc2NyaXB0b3IgdGFibGUgKi8KLQlsb25nCWlzeW1NYXg7CS8qIG51bWJlciBvZiBsb2NhbCBzeW1ib2xzICovCi0JYmZkX3ZtYQljYlN5bU9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGxvY2FsIHN5bWJvbHMqLwotCWxvbmcJaW9wdE1heDsJLyogbWF4IGluZGV4IGludG8gb3B0aW1pemF0aW9uIHN5bWJvbCBlbnRyaWVzICovCi0JYmZkX3ZtYQljYk9wdE9mZnNldDsJLyogb2Zmc2V0IHRvIG9wdGltaXphdGlvbiBzeW1ib2wgZW50cmllcyAqLwotCWxvbmcJaWF1eE1heDsJLyogbnVtYmVyIG9mIGF1eGlsbGFyeSBzeW1ib2wgZW50cmllcyAqLwotCWJmZF92bWEJY2JBdXhPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBhdXhpbGxhcnkgc3ltYm9sIGVudHJpZXMqLwotCWxvbmcJaXNzTWF4OwkJLyogbWF4IGluZGV4IGludG8gbG9jYWwgc3RyaW5ncyAqLwotCWJmZF92bWEJY2JTc09mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGxvY2FsIHN0cmluZ3MgKi8KLQlsb25nCWlzc0V4dE1heDsJLyogbWF4IGluZGV4IGludG8gZXh0ZXJuYWwgc3RyaW5ncyAqLwotCWJmZF92bWEJY2JTc0V4dE9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGV4dGVybmFsIHN0cmluZ3MgKi8KLQlsb25nCWlmZE1heDsJCS8qIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3IgZW50cmllcyAqLwotCWJmZF92bWEJY2JGZE9mZnNldDsJLyogb2Zmc2V0IHRvIGZpbGUgZGVzY3JpcHRvciB0YWJsZSAqLwotCWxvbmcJY3JmZDsJCS8qIG51bWJlciBvZiByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgZW50cmllcyAqLwotCWJmZF92bWEJY2JSZmRPZmZzZXQ7CS8qIG9mZnNldCB0byByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgKi8KLQlsb25nCWlleHRNYXg7CS8qIG1heCBpbmRleCBpbnRvIGV4dGVybmFsIHN5bWJvbHMgKi8KLQliZmRfdm1hCWNiRXh0T2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgZXh0ZXJuYWwgc3ltYm9sIGVudHJpZXMqLwotCS8qIElmIHlvdSBhZGQgbWFjaGluZSBkZXBlbmRlbnQgZmllbGRzLCBhZGQgdGhlbSBoZXJlICovCi0JfSBIRFJSLCAqcEhEUlI7IAotI2RlZmluZSBjYkhEUlIgc2l6ZW9mKEhEUlIpCi0jZGVmaW5lIGhkck5pbCAoKHBIRFJSKTApCi0KLS8qCi0gKiBUaGUgRkRSIGFuZCBQRFIgc3RydWN0dXJlcyBzcGVlZCBtYXBwaW5nIG9mIGFkZHJlc3MgPC0+IG5hbWUuCi0gKiBUaGV5IGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG1lbW9yeSBvcmRlciBhbmQgYXJlIGtlcHQgaW4KLSAqIG1lbW9yeSBieSBDREIgYXQgcnVudGltZS4KLSAqLwotCi0vKiAKLSAqIEZpbGUgRGVzY3JpcHRvcgotICoKLSAqIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgRVZFUlkgRklMRSwgd2hldGhlciBjb21waWxlZCB3aXRoCi0gKiBmdWxsIGRlYnVnZ2luZyBzeW1ib2xzIG9yIG5vdC4gIFRoZSBuYW1lIG9mIGEgZmlsZSBzaG91bGQgYmUKLSAqIHRoZSBwYXRoIG5hbWUgZ2l2ZW4gdG8gdGhlIGNvbXBpbGVyLgkgVGhpcyBhbGxvd3MgdGhlIHVzZXIKLSAqIHRvIHNpbXBseSBzcGVjaWZ5IHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgdGhlIENPTVBJTEVTCi0gKiB3ZXJlIGRvbmUsIGFuZCB3ZSB3aWxsIGJlIGFibGUgdG8gZmluZCB0aGVpciBmaWxlcy4KLSAqIEEgZmllbGQgd2hvc2UgY29tbWVudCBzdGFydHMgd2l0aCAiUiAtICIgaW5kaWNhdGVzIHRoYXQgaXQgd2lsbCBiZQotICogc2V0dXAgYXQgcnVudGltZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZmRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBmaWxlICovCi0JbG9uZwlyc3M7CQkvKiBmaWxlIG5hbWUgKG9mIHNvdXJjZSwgaWYga25vd24pICovCi0JbG9uZwlpc3NCYXNlOwkvKiBmaWxlJ3Mgc3RyaW5nIHNwYWNlICovCi0JYmZkX3ZtYQljYlNzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzcyAqLwotCWxvbmcJaXN5bUJhc2U7CS8qIGJlZ2lubmluZyBvZiBzeW1ib2xzICovCi0JbG9uZwljc3ltOwkJLyogY291bnQgZmlsZSdzIG9mIHN5bWJvbHMgKi8KLQlsb25nCWlsaW5lQmFzZTsJLyogZmlsZSdzIGxpbmUgc3ltYm9scyAqLwotCWxvbmcJY2xpbmU7CQkvKiBjb3VudCBvZiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0JbG9uZwlpb3B0QmFzZTsJLyogZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCi0JbG9uZwljb3B0OwkJLyogY291bnQgb2YgZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCi0JdW5zaWduZWQgc2hvcnQgaXBkRmlyc3Q7Lyogc3RhcnQgb2YgcHJvY2VkdXJlcyBmb3IgdGhpcyBmaWxlICovCi0Jc2hvcnQJY3BkOwkJLyogY291bnQgb2YgcHJvY2VkdXJlcyBmb3IgdGhpcyBmaWxlICovCi0JbG9uZwlpYXV4QmFzZTsJLyogZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0JbG9uZwljYXV4OwkJLyogY291bnQgb2YgZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0JbG9uZwlyZmRCYXNlOwkvKiBpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCi0JbG9uZwljcmZkOwkJLyogY291bnQgZmlsZSBpbmRpcmVjdCBlbnRyaWVzICovCi0JdW5zaWduZWQgbGFuZzogNTsJLyogbGFuZ3VhZ2UgZm9yIHRoaXMgZmlsZSAqLwotCXVuc2lnbmVkIGZNZXJnZSA6IDE7CS8qIHdoZXRoZXIgdGhpcyBmaWxlIGNhbiBiZSBtZXJnZWQgKi8KLQl1bnNpZ25lZCBmUmVhZGluIDogMTsJLyogdHJ1ZSBpZiBpdCB3YXMgcmVhZCBpbiAobm90IGp1c3QgY3JlYXRlZCkgKi8KLQl1bnNpZ25lZCBmQmlnZW5kaWFuIDogMTsvKiBpZiBzZXQsIHdhcyBjb21waWxlZCBvbiBiaWcgZW5kaWFuIG1hY2hpbmUgKi8KLQkJCQkvKglhdXgncyB3aWxsIGJlIGluIGNvbXBpbGUgaG9zdCdzIHNleCAqLwotCXVuc2lnbmVkIGdsZXZlbCA6IDI7CS8qIGxldmVsIHRoaXMgZmlsZSB3YXMgY29tcGlsZWQgd2l0aCAqLwotCXVuc2lnbmVkIHJlc2VydmVkIDogMjI7ICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCWJmZF92bWEJY2JMaW5lT2Zmc2V0OwkvKiBieXRlIG9mZnNldCBmcm9tIGhlYWRlciBmb3IgdGhpcyBmaWxlIGxuJ3MgKi8KLQliZmRfdm1hCWNiTGluZTsJCS8qIHNpemUgb2YgbGluZXMgZm9yIHRoaXMgZmlsZSAqLwotCX0gRkRSLCAqcEZEUjsKLSNkZWZpbmUgY2JGRFIgc2l6ZW9mKEZEUikKLSNkZWZpbmUgZmROaWwgKChwRkRSKTApCi0jZGVmaW5lIGlmZE5pbCAtMQotI2RlZmluZSBpZmRUZW1wIDAKLSNkZWZpbmUgaWxuTmlsIC0xCi0KLQotLyogCi0gKiBQcm9jZWR1cmUgRGVzY3JpcHRvcgotICoKLSAqIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgRVZFUlkgVEVYVCBMQUJFTC4KLSAqIElmIGEgcHJvY2VkdXJlIGlzIGluIGEgZmlsZSB3aXRoIGZ1bGwgc3ltYm9scywgdGhlbiBpc3ltCi0gKiB3aWxsIHBvaW50IHRvIHRoZSBQUk9DIHN5bWJvbHMsIGVsc2UgaXQgd2lsbCBwb2ludCB0byB0aGUKLSAqIGdsb2JhbCBzeW1ib2wgZm9yIHRoZSBsYWJlbC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBwZHIgewotCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2Ygc3RhcnQgb2YgcHJvY2VkdXJlICovCi0JbG9uZwlpc3ltOwkJLyogc3RhcnQgb2YgbG9jYWwgc3ltYm9sIGVudHJpZXMgKi8KLQlsb25nCWlsaW5lOwkJLyogc3RhcnQgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JbG9uZwlyZWdtYXNrOwkvKiBzYXZlIHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCXJlZ29mZnNldDsJLyogc2F2ZSByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWlvcHQ7CQkvKiBzdGFydCBvZiBvcHRpbWl6YXRpb24gc3ltYm9sIGVudHJpZXMqLwotCWxvbmcJZnJlZ21hc2s7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJZnJlZ29mZnNldDsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyYW1lb2Zmc2V0OwkvKiBmcmFtZSBzaXplICovCi0Jc2hvcnQJZnJhbWVyZWc7CS8qIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgKi8KLQlzaG9ydAlwY3JlZzsJCS8qIG9mZnNldCBvciByZWcgb2YgcmV0dXJuIHBjICovCi0JbG9uZwlsbkxvdzsJCS8qIGxvd2VzdCBsaW5lIGluIHRoZSBwcm9jZWR1cmUgKi8KLQlsb25nCWxuSGlnaDsJCS8qIGhpZ2hlc3QgbGluZSBpbiB0aGUgcHJvY2VkdXJlICovCi0JYmZkX3ZtYQljYkxpbmVPZmZzZXQ7CS8qIGJ5dGUgb2Zmc2V0IGZvciB0aGlzIHByb2NlZHVyZSBmcm9tIHRoZSBmZCBiYXNlICovCi0JLyogVGhlc2UgZmllbGRzIGFyZSBuZXcgZm9yIDY0IGJpdCBFQ09GRi4gICovCi0JdW5zaWduZWQgZ3BfcHJvbG9ndWUgOiA4OyAvKiBieXRlIHNpemUgb2YgR1AgcHJvbG9ndWUgKi8KLQl1bnNpZ25lZCBncF91c2VkIDogMTsJLyogdHJ1ZSBpZiB0aGUgcHJvY2VkdXJlIHVzZXMgR1AgKi8KLQl1bnNpZ25lZCByZWdfZnJhbWUgOiAxOwkvKiB0cnVlIGlmIHJlZ2lzdGVyIGZyYW1lIHByb2NlZHVyZSAqLwotCXVuc2lnbmVkIHByb2YgOiAxOwkvKiB0cnVlIGlmIGNvbXBpbGVkIHdpdGggLXBnICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQgOiAxMzsJLyogcmVzZXJ2ZWQ6IG11c3QgYmUgemVybyAqLwotCXVuc2lnbmVkIGxvY2Fsb2ZmIDogODsJLyogb2Zmc2V0IG9mIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHZmcCAqLwotCX0gUERSLCAqcFBEUjsKLSNkZWZpbmUgY2JQRFIgc2l6ZW9mKFBEUikKLSNkZWZpbmUgcGROaWwgKChwUERSKSAwKQotI2RlZmluZSBpcGROaWwJLTEKLQotLyoKLSAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgY3JlYXRlZCBieSB0aGUgbG9hZGVyCi0gKiBmb3IgdXNlIGJ5IHRoZSBzdGF0aWMgZXhjZXB0aW9uIHN5c3RlbS4KLSAqLwotLyoKLSAqIElmIDAnZCBvdXQgYmVjYXVzZSBleGNlcHRpb25faW5mbyBjaG9rZXMgVmlzdWFsIEMrKyBhbmQgYmVjYXVzZSB0aGVyZQotICogZG9uJ3Qgc2VlbSB0byBiZSBhbnkgcmVmZXJlbmNlcyB0byB0aGlzIHN0cnVjdHVyZSBlbHNld2hlcmUgaW4gZ2RiLgotICovCi0jaWYgMAotdHlwZWRlZiBzdHJ1Y3QgcnVudGltZV9wZHIgewotCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2Ygc3RhcnQgb2YgcHJvY2VkdXJlICovCi0JbG9uZwlyZWdtYXNrOwkvKiBzYXZlIHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCXJlZ29mZnNldDsJLyogc2F2ZSByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyZWdtYXNrOwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCWZyZWdvZmZzZXQ7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmFtZW9mZnNldDsJLyogZnJhbWUgc2l6ZSAqLwotCXNob3J0CWZyYW1lcmVnOwkvKiBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyICovCi0Jc2hvcnQJcGNyZWc7CQkvKiBvZmZzZXQgb3IgcmVnIG9mIHJldHVybiBwYyAqLwotCWxvbmcJaXJwc3M7CQkvKiBpbmRleCBpbnRvIHRoZSBydW50aW1lIHN0cmluZyB0YWJsZSAqLwotCWxvbmcJcmVzZXJ2ZWQ7Ci0Jc3RydWN0IGV4Y2VwdGlvbl9pbmZvICpleGNlcHRpb25faW5mbzsvKiBwb2ludGVyIHRvIGV4Y2VwdGlvbiBhcnJheSAqLwotfSBSUERSLCAqcFJQRFI7Ci0jZGVmaW5lIGNiUlBEUiBzaXplb2YoUlBEUikKLSNkZWZpbmUgcnBkTmlsICgocFJQRFIpIDApCi0jZW5kaWYKLQotLyoKLSAqIExpbmUgTnVtYmVycwotICoKLSAqIExpbmUgTnVtYmVycyBhcmUgc2VncmVnYXRlZCBmcm9tIHRoZSBub3JtYWwgc3ltYm9scyBiZWNhdXNlIHRoZXkKLSAqIGFyZSBbMV0gc21hbGxlciAsIFsyXSBhcmUgb2Ygbm8gaW50ZXJlc3QgdG8geW91cgotICogYXZlcmFnZSBsb2FkZXIsIGFuZCBbM10gYXJlIG5ldmVyIG5lZWRlZCBpbiB0aGUgbWlkZGxlIG9mIG5vcm1hbAotICogc2Nhbm5pbmcgYW5kIHRoZXJlZm9yZSBzbG93IHRoaW5ncyBkb3duLgotICoKLSAqIEJ5IGRlZmluaXRpb24sIHRoZSBmaXJzdCBMSU5FUiBmb3IgYW55IGdpdmVuIHByb2NlZHVyZSB3aWxsIGhhdmUKLSAqIHRoZSBmaXJzdCBsaW5lIG9mIGEgcHJvY2VkdXJlIGFuZCByZXByZXNlbnQgdGhlIGZpcnN0IGFkZHJlc3MuCi0gKi8KLQotdHlwZWRlZglsb25nIExJTkVSLCAqcExJTkVSOwotI2RlZmluZSBsaW5lTmlsICgocExJTkVSKTApCi0jZGVmaW5lIGNiTElORVIgc2l6ZW9mKExJTkVSKQotI2RlZmluZSBpbGluZU5pbAktMQotCi0KLQotLyoKLSAqIFRoZSBTeW1ib2wgU3RydWN0dXJlCQkoR0ZXLCB0byB0aG9zZSB3aG8gS25vdyEpCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcJaXNzOwkJLyogaW5kZXggaW50byBTdHJpbmcgU3BhY2Ugb2YgbmFtZSAqLwotCWJmZF92bWEJdmFsdWU7CQkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLQl1bnNpZ25lZCBzdCA6IDY7CS8qIHN5bWJvbCB0eXBlICovCi0JdW5zaWduZWQgc2MgIDogNTsJLyogc3RvcmFnZSBjbGFzcyAtIHRleHQsIGRhdGEsIGV0YyAqLwotCXVuc2lnbmVkIHJlc2VydmVkIDogMTsJLyogcmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBpbmRleCA6IDIwOwkvKiBpbmRleCBpbnRvIHN5bS9hdXggdGFibGUgKi8KLQl9IFNZTVIsICpwU1lNUjsKLSNkZWZpbmUgc3ltTmlsICgocFNZTVIpMCkKLSNkZWZpbmUgY2JTWU1SIHNpemVvZihTWU1SKQotI2RlZmluZSBpc3ltTmlsIC0xCi0jZGVmaW5lIGluZGV4TmlsIDB4ZmZmZmYKLSNkZWZpbmUgaXNzTmlsIC0xCi0jZGVmaW5lIGlzc051bGwgMAotCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29udmVydHMgYSBtZW1vcnkgcmVzaWRlbnQgc3RyaW5nIHRvIGFuIGlzcy4KLSAqIFRoaXMgaGFjayBpcyByZWNvZ25pemVkIGluIFNiRklzcywgaW4gc3ltLmMgb2YgdGhlIGRlYnVnZ2VyLgotICovCi0jZGVmaW5lIElzc0ZTYihzYikgKDB4ODAwMDAwMDAgfCAoKHVuc2lnbmVkIGxvbmcpKHNiKSkpCi0KLS8qIEUgWCBUIEUgUiBOIEEgTCAgIFMgWSBNIEIgTyBMICBSIEUgQyBPIFIgRAotICoKLSAqCVNhbWUgYXMgdGhlIFNZTVIgZXhjZXB0IGl0IGNvbnRhaW5zIGZpbGUgY29udGV4dCB0byBkZXRlcm1pbmUgd2hlcmUKLSAqCXRoZSBpbmRleCBpcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfZXh0ciB7Ci0JdW5zaWduZWQgam1wdGJsOjE7CS8qIHN5bWJvbCBpcyBhIGp1bXAgdGFibGUgZW50cnkgZm9yIHNobGlicyAqLwotCXVuc2lnbmVkIGNvYm9sX21haW46MTsJLyogc3ltYm9sIGlzIGEgY29ib2wgbWFpbiBwcm9jZWR1cmUgKi8KLQl1bnNpZ25lZCB3ZWFrZXh0OjE7CS8qIHN5bWJvbCBpcyB3ZWFrIGV4dGVybmFsICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQ6MTM7CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0JaW50CWlmZDsJCS8qIHdoZXJlIHRoZSBpc3MgYW5kIGluZGV4IGZpZWxkcyBwb2ludCBpbnRvICovCi0JU1lNUglhc3ltOwkJLyogc3ltYm9sIGZvciB0aGUgZXh0ZXJuYWwgKi8KLQl9IEVYVFIsICpwRVhUUjsKLSNkZWZpbmUgZXh0TmlsICgocEVYVFIpMCkKLSNkZWZpbmUgY2JFWFRSIHNpemVvZihFWFRSKQotCi0KLS8qIEEgVSBYIEkgTCBMIEEgUiBZICAgVCBZIFAgRQkgSSBOIEYgTyBSIE0gQSBUIEkgTyBOICovCi0KLS8qCi0gKiBUeXBlIEluZm9ybWF0aW9uIFJlY29yZAotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgZkJpdGZpZWxkIDogMTsgLyogc2V0IGlmIGJpdCB3aWR0aCBpcyBzcGVjaWZpZWQgKi8KLQl1bnNpZ25lZCBjb250aW51ZWQgOiAxOyAvKiBpbmRpY2F0ZXMgYWRkaXRpb25hbCBUUSBpbmZvIGluIG5leHQgQVVYICovCi0JdW5zaWduZWQgYnQgIDogNjsJLyogYmFzaWMgdHlwZSAqLwotCXVuc2lnbmVkIHRxNCA6IDQ7Ci0JdW5zaWduZWQgdHE1IDogNDsKLQkvKiAtLS0tIDE2IGJpdCBib3VuZGFyeSAtLS0tICovCi0JdW5zaWduZWQgdHEwIDogNDsKLQl1bnNpZ25lZCB0cTEgOiA0OwkvKiA2IHR5cGUgcXVhbGlmaWVycyAtIHRxUHRyLCBldGMuICovCi0JdW5zaWduZWQgdHEyIDogNDsKLQl1bnNpZ25lZCB0cTMgOiA0OwotCX0gVElSLCAqcFRJUjsKLSNkZWZpbmUgY2JUSVIgc2l6ZW9mKFRJUikKLSNkZWZpbmUgdGlOaWwgKChwVElSKTApCi0jZGVmaW5lIGl0cU1heCA2Ci0KLS8qCi0gKiBSZWxhdGl2ZSBzeW1ib2wgcmVjb3JkCi0gKgotICogSWYgdGhlIHJmZCBmaWVsZCBpcyA0MDk1LCB0aGUgaW5kZXggZmllbGQgaW5kZXhlcyBpbnRvIHRoZSBnbG9iYWwgc3ltYm9sCi0gKgl0YWJsZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQJcmZkIDogMTI7ICAgIC8qIGluZGV4IGludG8gdGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgKi8KLQl1bnNpZ25lZAlpbmRleCA6IDIwOyAvKiBpbmRleCBpbnQgc3ltL2F1eC9pc3MgdGFibGVzICovCi0JfSBSTkRYUiwgKnBSTkRYUjsKLSNkZWZpbmUgY2JSTkRYUiBzaXplb2YoUk5EWFIpCi0jZGVmaW5lIHJuZHhOaWwgKChwUk5EWFIpMCkKLQotLyogZGVuc2UgbnVtYmVycyBvciBzb21ldGltZXMgY2FsbGVkIGJsb2NrIG51bWJlcnMgYXJlIHN0b3JlZCBpbiB0aGlzIHR5cGUsCi0gKglhIHJmZCBvZiAweGZmZmZmZmZmIGlzIGFuIGluZGV4IGludG8gdGhlIGdsb2JhbCB0YWJsZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcJcmZkOyAgICAvKiBpbmRleCBpbnRvIHRoZSBmaWxlIHRhYmxlICovCi0JdW5zaWduZWQgbG9uZwlpbmRleDsgCS8qIGluZGV4IGludCBzeW0vYXV4L2lzcyB0YWJsZXMgKi8KLQl9IEROUiwgKnBETlI7Ci0jZGVmaW5lIGNiRE5SIHNpemVvZihETlIpCi0jZGVmaW5lIGRuTmlsICgocEROUikwKQotCi0KLQotLyoKLSAqIEF1eGlsbGFyeSBpbmZvcm1hdGlvbiBvY2N1cnMgb25seSBpZiBuZWVkZWQuCi0gKiBJdCBBTFdBWVMgb2NjdXJzIGluIHRoaXMgb3JkZXIgd2hlbiBwcmVzZW50LgotCi0JICAgIGlzeW1NYWMJCXVzZWQgYnkgc3RQcm9jIG9ubHkKLQkgICAgVElSCQkJdHlwZSBpbmZvCi0JICAgIFRJUgkJCWFkZGl0aW9uYWwgVFEgaW5mbyAoaWYgZmlyc3QgVElSIHdhcyBub3QgZW5vdWdoKQotCSAgICBybmR4CQlpZiAoYnQgPT0gYnRTdHJ1Y3QsYnRVbmlvbixidEVudW0sYnRTZXQsYnRSYW5nZSwKLQkJCQkgICAgYnRUeXBlZGVmKToKLQkJCQkgICAgcnN5bS5pbmRleCA9PSBpYXV4IGZvciBidFNldCBvciBidFJhbmdlCi0JCQkJICAgIGVsc2UgcnN5bS5pbmRleCA9PSBpc3ltCi0JICAgIGRpbUxvdwkJYnRSYW5nZSwgYnRTZXQKLQkgICAgZGltTWFjCQlidFJhbmdlLCBidFNldAotCSAgICBybmR4MAkJQXMgbWFueSBhcyB0aGVyZSBhcmUgdHEgYXJyYXlzCi0JICAgIGRpbUxvdzAKLQkgICAgZGltSGlnaDAKLQkgICAgLi4uCi0JICAgIHJuZHhNYXgtMQotCSAgICBkaW1Mb3dNYXgtMQotCSAgICBkaW1IaWdoTWF4LTEKLQkgICAgd2lkdGggaW4gYml0cwlpZiAoYml0IGZpZWxkKSwgd2lkdGggaW4gYml0cy4KLSAqLwotI2RlZmluZSBjQXV4TWF4ICg2ICsgKGlkaW1NYXgqMykpCi0KLS8qIGEgdW5pb24gb2YgYWxsIHBvc3NpYmxlIGluZm8gaW4gdGhlIEFVWCB1bml2ZXJzZSAqLwotdHlwZWRlZiB1bmlvbiB7Ci0JVElSCXRpOwkJLyogdHlwZSBpbmZvcm1hdGlvbiByZWNvcmQgKi8KLQlSTkRYUglybmR4OwkJLyogcmVsYXRpdmUgaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KLQlsb25nCWRuTG93OwkJLyogbG93IGRpbWVuc2lvbiAqLwotCWxvbmcJZG5IaWdoOwkJLyogaGlnaCBkaW1lbnNpb24gKi8KLQlsb25nCWlzeW07CQkvKiBzeW1ib2wgdGFibGUgaW5kZXggKGVuZCBvZiBwcm9jKSAqLwotCWxvbmcJaXNzOwkJLyogaW5kZXggaW50byBzdHJpbmcgc3BhY2UgKG5vdCB1c2VkKSAqLwotCWxvbmcJd2lkdGg7CQkvKiB3aWR0aCBmb3Igbm9uLWRlZmF1bHQgc2l6ZWQgc3RydWMgZmllbGRzICovCi0JbG9uZwljb3VudDsJCS8qIGNvdW50IG9mIHJhbmdlcyBmb3IgdmFyaWFudCBhcm0gKi8KLQl9IEFVWFUsICpwQVVYVTsKLSNkZWZpbmUgY2JBVVhVIHNpemVvZihBVVhVKQotI2RlZmluZSBhdXhOaWwgKChwQVVYVSkwKQotI2RlZmluZSBpYXV4TmlsIC0xCi0KLQotLyoKLSAqIE9wdGltaXphdGlvbiBzeW1ib2xzCi0gKgotICogT3B0aW1pemF0aW9uIHN5bWJvbHMgY29udGFpbiBzb21lIG92ZXJsYXAgaW5mb3JtYXRpb24gd2l0aCB0aGUgbm9ybWFsCi0gKiBzeW1ib2wgdGFibGUuIEluIHBhcnRpY3VsYXIsIHRoZSBwcm9jIGluZm9ybWF0aW9uCi0gKiBpcyBzb21ld2hhdCByZWR1bmRhbnQgYnV0IG5lY2Vzc2FyeSB0byBlYXNpbHkgZmluZCB0aGUgb3RoZXIgaW5mb3JtYXRpb24KLSAqIHByZXNlbnQuIAotICoKLSAqIEFsbCBvZiB0aGUgb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGFzdCBvdFByb2MKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgb3Q6IDg7CQkvKiBvcHRpbWl6YXRpb24gdHlwZSAqLwotCXVuc2lnbmVkIHZhbHVlOiAyNDsJLyogYWRkcmVzcyB3aGVyZSB3ZSBhcmUgbW92aW5nIGl0IHRvICovCi0JUk5EWFIJcm5keDsJCS8qIHBvaW50cyB0byBhIHN5bWJvbCBvciBvcHQgZW50cnkgKi8KLQl1bnNpZ25lZCBsb25nCW9mZnNldDsJLyogcmVsYXRpdmUgb2Zmc2V0IHRoaXMgb2NjdXJlZCAqLwotCX0gT1BUUiwgKnBPUFRSOwotI2RlZmluZSBvcHROaWwJKChwT1BUUikgMCkKLSNkZWZpbmUgY2JPUFRSIHNpemVvZihPUFRSKQotI2RlZmluZSBpb3B0TmlsIC0xCi0KLS8qCi0gKiBGaWxlIEluZGlyZWN0Ci0gKgotICogV2hlbiBhIHN5bWJvbCBpcyByZWZlcmVuY2VkIGFjcm9zcyBmaWxlcyB0aGUgZm9sbG93aW5nIHByb2NlZHVyZSBpcyB1c2VkOgotICoJMSkgdXNlIHRoZSBmaWxlIGluZGV4IHRvIGdldCB0aGUgRmlsZSBpbmRpcmVjdCBlbnRyeS4KLSAqCTIpIHVzZSB0aGUgZmlsZSBpbmRpcmVjdCBlbnRyeSB0byBnZXQgdGhlIEZpbGUgZGVzY3JpcHRvci4KLSAqCTMpIGFkZCB0aGUgc3ltIGluZGV4IHRvIHRoZSBiYXNlIG9mIHRoYXQgZmlsZSdzIHN5bSB0YWJsZQotICoKLSAqLwotCi10eXBlZGVmIGxvbmcgUkZEVCwgKnBSRkRUOwotI2RlZmluZSBjYlJGRFQgc2l6ZW9mKFJGRFQpCi0jZGVmaW5lIHJmZE5pbAktMQotCi0vKgotICogVGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgaW4gdGhlIG1pcHMgbG9hZGVyIGlzIGtub3duIGFzIGFuIGFycmF5IG9mIEZJVHMuCi0gKiBUaGlzIGlzIGRvbmUgdG8ga2VlcCB0aGUgY29kZSBpbiB0aGUgbG9hZGVyIHJlYWRhYmxlIGluIHRoZSBhcmVhIHdoZXJlCi0gKiB0aGVzZSB0YWJsZXMgYXJlIG1lcmdlZC4gIE5vdGUgdGhpcyBpcyBvbmx5IGEgbmFtZSBjaGFuZ2UuCi0gKi8KLXR5cGVkZWYgbG9uZyBGSVQsICpwRklUOwotI2RlZmluZSBjYkZJVAlzaXplb2YoRklUKQotI2RlZmluZSBpZmlOaWwJLTEKLSNkZWZpbmUgZmlOaWwJKChwRklUKSAwKQotCi0jaWZkZWYgX0xBTkdVQUdFX1BBU0NBTAotI2RlZmluZSBpZmROaWwgLTEKLSNkZWZpbmUgaWxuTmlsIC0xCi0jZGVmaW5lIGlwZE5pbCAtMQotI2RlZmluZSBpbGluZU5pbCAtMQotI2RlZmluZSBpc3ltTmlsIC0xCi0jZGVmaW5lIGluZGV4TmlsIDE2I2ZmZmZmCi0jZGVmaW5lIGlzc05pbCAtMQotI2RlZmluZSBpc3NOdWxsIDAKLSNkZWZpbmUgaXRxTWF4IDYKLSNkZWZpbmUgaWF1eE5pbCAtMQotI2RlZmluZSBpb3B0TmlsIC0xCi0jZGVmaW5lIHJmZE5pbCAtMQotI2RlZmluZSBpZmlOaWwgLTEKLSNlbmRpZgkvKiBfTEFOR1VBR0VfUEFTQ0FMICovCi0KLQotLyogRGVuc2UgbnVtYmVycwotICoKLSAqIFJhdGhlciB0aGFuIHVzZSBmaWxlIGluZGV4LCBzeW1ib2wgaW5kZXggcGFpcnMgdG8gcmVwcmVzZW50IHN5bWJvbHMKLSAqCWFuZCBnbG9iYWxzLCB3ZSB1c2UgZGVuc2UgbnVtYmVyIHNvIHRoYXQgdGhleSBjYW4gYmUgZWFzaWx5IGVtYmVkZWQKLSAqCWluIGludGVybWVkaWF0ZSBjb2RlIGFuZCB0aGUgcHJvZ3JhbXMgdGhhdCBwcm9jZXNzIHRoZW0gY2FuCi0gKgl1c2UgZGlyZWN0IGFjY2VzcyB0YWJscyBpbnN0ZWFkIG9mIGhhc2ggdGFibGUgKHdoaWNoIHdvdWxkIGJlCi0gKgluZWNlc2FyeSBvdGhlcndpc2UgYmVjYXVzZSBvZiB0aGUgc3BhcnNlIG5hbWUgc3BhY2UgY2F1c2VkIGJ5Ci0gKglmaWxlIGluZGV4LCBzeW1ib2wgaW5kZXggcGFpcnMuIERlbnNlIG51bWJlciBhcmUgcmVwcmVzZW50ZWQKLSAqCWJ5IFJORFhScy4KLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyB0YWJsZSBkZWZpbmVzIHRoZSBtZWFuaW5nIG9mIGVhY2ggU1lNIGZpZWxkIGFzCi0gKiBhIGZ1bmN0aW9uIG9mIHRoZSAic3QiLiAoc2NEL0IgPT0gc2NEYXRhIE9SIHNjQnNzKQotICoKLSAqIE5vdGU6IHRoZSB2YWx1ZSAiaXN5bU1hYyIgaXMgdXNlZCBieSBzeW1ib2xzIHRoYXQgaGF2ZSB0aGUgY29uY2VwdAotICogb2YgZW5jbG9zaW5nIGEgYmxvY2sgb2YgcmVsYXRlZCBpbmZvcm1hdGlvbi4JIFRoaXMgdmFsdWUgaXMgdGhlCi0gKiBpc3ltIG9mIHRoZSBmaXJzdCBzeW1ib2wgQUZURVIgdGhlIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkKLSAqIHN5bWJvbC4gRm9yIGV4YW1wbGUgaWYgYSBwcm9jZWR1cmUgd2FzIGF0IGlzeW09PTkwIGFuZCBoYWQgYW4KLSAqIGlzeW1NYWM9PTE1NSwgdGhlIGFzc29jaWF0ZWQgZW5kIHdvdWxkIGJlIGF0IGlzeW09PTE1NCwgYW5kIHRoZQotICogc3ltYm9sIGF0IDE1NSB3b3VsZCBwcm9iYWJseSAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5KSBiZSB0aGUKLSAqIHN5bWJvbCBmb3IgdGhlIG5leHQgcHJvY2VkdXJlLiAgVGhpcyBhbGxvd3MgcmFwaWQgc2tpcHBpbmcgb3ZlcgotICogaW50ZXJuYWwgaW5mb3JtYXRpb24gb2YgdmFyaW91cyBzb3J0cy4gInN0RW5kInMgQUxXQVlTIGhhdmUgdGhlCi0gKiBpc3ltIG9mIHRoZSBwcmltYXJ5IHN5bWJvbCB0aGF0IHN0YXJ0ZWQgdGhlIGJsb2NrLgotICogCi0KLVNUCQlTQwlWQUxVRQkJSU5ERVgKLS0tLS0tLS0tCS0tLS0tLQktLS0tLS0tLQktLS0tLS0KLXN0RmlsZQkJc2NUZXh0CWFkZHJlc3MJCWlzeW1NYWMKLXN0TGFiZWwJCXNjVGV4dAlhZGRyZXNzCQktLS0KLXN0R2xvYmFsCXNjRC9CCWFkZHJlc3MJCWlhdXgKLXN0U3RhdGljCXNjRC9CCWFkZHJlc3MJCWlhdXgKLXN0UGFyYW0JCXNjQWJzCW9mZnNldAkJaWF1eAotc3RMb2NhbAkJc2NBYnMJb2Zmc2V0CQlpYXV4Ci1zdFByb2MJCXNjVGV4dAlhZGRyZXNzCQlpYXV4CShpc3ltTWFjIGlzIGZpcnN0IEFVWCkKLXN0U3RhdGljUHJvYwlzY1RleHQJYWRkcmVzcwkJaWF1eAkoaXN5bU1hYyBpcyBmaXJzdCBBVVgpCi0KLXN0TWVtYmVyCXNjTmlsCW9yZGluYWwJCS0tLQkoaWYgbWVtYmVyIG9mIGVudW0pCi0JKG1pcHNyZWFkIHRoaW5rcyB0aGUgY2FzZSBiZWxvdyBoYXMgYSBiaXQsIG5vdCBieXRlLCBvZmZzZXQuKQotc3RNZW1iZXIJc2NOaWwJYnl0ZSBvZmZzZXQJaWF1eAkoaWYgbWVtYmVyIG9mIHN0cnVjdC91bmlvbikKLXN0TWVtYmVyCXNjQml0cwliaXQgb2Zmc2V0CWlhdXgJKGJpdCBmaWVsZCBzcGVjKQotCi1zdEJsb2NrCQlzY1RleHQJYWRkcmVzcwkJaXN5bU1hYyAodGV4dCBibG9jaykKLQkodGhlIGNvZGUgc2VlbXMgdG8gdGhpbmsgdGhhdCByYXRoZXIgdGhhbiBzY05pbCwgd2Ugc2VlIHNjSW5mbyBmb3IKLQkgdGhlIHR3byBjYXNlcyBiZWxvdy4pCi1zdEJsb2NrCQlzY05pbAljYgkJaXN5bU1hYyAoc3RydWN0L3VuaW9uIG1lbWJlciBkZWZpbmUpCi1zdEJsb2NrCQlzY05pbAljTWVtYmVycwlpc3ltTWFjIChlbnVtIG1lbWJlciBkZWZpbmUpCi0KLQkoTmV3IHR5cGVzIGFkZGVkIGJ5IFNHSSB0byBzaW1wbGlmeSB0aGluZ3M6KQotc3RTdHJ1Y3QJc2NJbmZvCWNiCQlpc3ltTWFjIChzdHJ1Y3QgdHlwZSBkZWZpbmUpCi1zdFVuaW9uCQlzY0luZm8JY2IJCWlzeW1NYWMgKHVuaW9uICB0eXBlIGRlZmluZSkKLXN0RW51bQkJc2NJbmZvCWNNZW1iZXJzCWlzeW1NYWMgKGVudW0gICB0eXBlIGRlZmluZSkKLQotc3RFbmQJCXNjVGV4dAlhZGRyZXNzCQlpc3ltU3RhcnQKLXN0RW5kCQlzY05pbAktLS0tLS0tCQlpc3ltU3RhcnQgKHN0cnVjdC91bmlvbi9lbnVtKQotCi1zdFR5cGVkZWYJc2NOaWwJLS0tLS0tLQkJaWF1eAotc3RSZWdSZWxvYwlzYz8/Pwl2YWx1ZQkJb2xkIHJlZ2lzdGVyIG51bWJlcgotc3RGb3J3YXJkCXNjPz8/CW5ldyBhZGRyZXNzCWlzeW0gdG8gb3JpZ2luYWwgc3ltYm9sCi0KLXN0Q29uc3RhbnQJc2NJbmZvCXZhbHVlCQktLS0gKHNjYWxhcikKLXN0Q29uc3RhbnQJc2NJbmZvCWlzcwkJLS0tIChjb21wbGV4LCBlLmcuIHN0cmluZykKLQotICoKLSAqLwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvc3ltY29uc3QuaCBiL2luY2x1ZGUvY29mZi9zeW1jb25zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBlZWYyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zeW1jb25zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBvZiBjb25zdGFudHMgZm9yIGludGVybmFsIGZvcm1hdCBvZiBNSVBTIEVDT0ZGIHN5bWJvbHMuCi0gICBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcyBhbmQgVGhpcmQgRXllIFNvZnR3YXJlLgotICAgQ2hhbmdlcyBjb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydCBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uCi0KLSAgIFRoaXMgZmlsZSBpcyBqdXN0IGFnZ3JlZ2F0ZWQgd2l0aCB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBHTlUKLSAgIHJlbGVhc2U7IGl0IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgR0FTLCBHREIsIG9yIG90aGVyIEdOVQotICAgcHJvZ3JhbXMuICAqLwotCi0vKgotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICogfCBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTEsIDE5OTAgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMufAotICogfCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlICAgfAotICogfCByaWdodHMgdG8gYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzICAgICAgfAotICogfCBtYWludGFpbmVkIGluIHRoZSBjb3B5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICovCi0KLS8qIChDKSBDb3B5cmlnaHQgMTk4NCBieSBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlIHJpZ2h0cyB0bwotICogYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzIG1haW50YWluZWQgaW4gdGhlIGNvcHkuCi0gKgotICogVGhpcmQgRXllIG1ha2VzIG5vIGNsYWltcyBhYm91dCB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzCi0gKiBzeW1ib2wgdGFibGUgdG8gYSBwYXJ0aWN1bGFyIHVzZS4KLSAqLwotCi0vKiBnbGV2ZWxzIGZvciBmaWVsZCBpbiBGRFIgKi8KLSNkZWZpbmUgR0xFVkVMXzAJMgotI2RlZmluZSBHTEVWRUxfMQkxCi0jZGVmaW5lIEdMRVZFTF8yCTAJLyogZm9yIHVwd2FyZCBjb21wYXQgcmVhc29ucy4gKi8KLSNkZWZpbmUgR0xFVkVMXzMJMwotCi0vKiBtYWdpYyBudW1iZXIgZm8gc3ltaGVhZGVyICovCi0jZGVmaW5lIG1hZ2ljU3ltCTB4NzAwOQotLyogVGhlIEFscGhhIHVzZXMgdGhpcyB2YWx1ZSBpbnN0ZWFkLCBmb3Igc29tZSByZWFzb24uICAqLwotI2RlZmluZSBtYWdpY1N5bTIJMHgxOTkyCi0KLS8qIExhbmd1YWdlIGNvZGVzICovCi0jZGVmaW5lIGxhbmdDCQkwCQotI2RlZmluZSBsYW5nUGFzY2FsCTEKLSNkZWZpbmUgbGFuZ0ZvcnRyYW4JMgotI2RlZmluZQlsYW5nQXNzZW1ibGVyCTMJLyogb25lIEFzc2VtYmxleSBpbnN0IG1pZ2h0IG1hcCB0byBtYW55IG1hY2ggKi8KLSNkZWZpbmUgbGFuZ01hY2hpbmUJNAotI2RlZmluZSBsYW5nTmlsCQk1Ci0jZGVmaW5lIGxhbmdBZGEJCTYKLSNkZWZpbmUgbGFuZ1BsMQkJNwotI2RlZmluZSBsYW5nQ29ib2wJOAotI2RlZmluZSBsYW5nU3RkYwk5CS8qIEZJWE1FOiBDb2xsaWRlcyB3aXRoIFNHSSBsYW5nQ3BsdXNwbHVzICovCi0jZGVmaW5lIGxhbmdDcGx1c3BsdXMJOQkvKiBGSVhNRTogQ29sbGlkZXMgd2l0aCBsYW5nU3RkYyAqLwotI2RlZmluZSBsYW5nQ3BsdXNwbHVzVjIJMTAJLyogU0dJIGFkZGl0aW9uICovCi0jZGVmaW5lIGxhbmdNYXgJCTExCS8qIG1heGltdW4gYWxsb3dlZCAzMiAtLSA1IGJpdHMgKi8KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgdmFsdWUgZGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZHMgaW4gdGhlIFNZTVIgKi8KLQotLyoKLSAqIFN0b3JhZ2UgQ2xhc3NlcwotICovCi0KLSNkZWZpbmUgc2NOaWwJCTAKLSNkZWZpbmUgc2NUZXh0CQkxCS8qIHRleHQgc3ltYm9sICovCi0jZGVmaW5lIHNjRGF0YQkJMgkvKiBpbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLwotI2RlZmluZSBzY0JzcwkJMwkvKiB1bi1pbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLwotI2RlZmluZSBzY1JlZ2lzdGVyCTQJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlciAqLwotI2RlZmluZSBzY0FicwkJNQkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KLSNkZWZpbmUgc2NVbmRlZmluZWQJNgkvKiB3aG8ga25vd3M/ICovCi0jZGVmaW5lIHNjQ2RiTG9jYWwJNwkvKiB2YXJpYWJsZSdzIHZhbHVlIGlzIElOIHNlLT52YS4/PyAqLwotI2RlZmluZSBzY0JpdHMJCTgJLyogdGhpcyBpcyBhIGJpdCBmaWVsZCAqLwotI2RlZmluZSBzY0NkYlN5c3RlbQk5CS8qIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gQ0RCJ3MgYWRkcmVzcyBzcGFjZSAqLwotI2RlZmluZSBzY0RieAkJOQkvKiBvdmVybGFwIGRieCBpbnRlcm5hbCB1c2UgKi8KLSNkZWZpbmUgc2NSZWdJbWFnZQkxMAkvKiByZWdpc3RlciB2YWx1ZSBzYXZlZCBvbiBzdGFjayAqLwotI2RlZmluZSBzY0luZm8JCTExCS8qIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBzY1VzZXJTdHJ1Y3QJMTIJLyogYWRkcmVzcyBpbiBzdHJ1Y3QgdXNlciBmb3IgY3VycmVudCBwcm9jZXNzICovCi0jZGVmaW5lIHNjU0RhdGEJCTEzCS8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGRhdGEgKi8KLSNkZWZpbmUgc2NTQnNzCQkxNAkvKiBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24gKi8KLSNkZWZpbmUgc2NSRGF0YQkJMTUJLyogbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEgKi8KLSNkZWZpbmUgc2NWYXIJCTE2CS8qIFZhciBwYXJhbWV0ZXIgKGZvcnRyYW4scGFzY2FsKSAqLwotI2RlZmluZSBzY0NvbW1vbgkxNwkvKiBjb21tb24gdmFyaWFibGUgKi8KLSNkZWZpbmUgc2NTQ29tbW9uCTE4CS8qIHNtYWxsIGNvbW1vbiAqLwotI2RlZmluZSBzY1ZhclJlZ2lzdGVyCTE5CS8qIFZhciBwYXJhbWV0ZXIgaW4gYSByZWdpc3RlciAqLwotI2RlZmluZSBzY1ZhcmlhbnQJMjAJLyogVmFyaWFudCByZWNvcmQgKi8KLSNkZWZpbmUgc2NTVW5kZWZpbmVkCTIxCS8qIHNtYWxsIHVuZGVmaW5lZChleHRlcm5hbCkgZGF0YSAqLwotI2RlZmluZSBzY0luaXQJCTIyCS8qIC5pbml0IHNlY3Rpb24gc3ltYm9sICovCi0jZGVmaW5lIHNjQmFzZWRWYXIJMjMJLyogRm9ydHJhbiBvciBQTC8xIHB0ciBiYXNlZCB2YXIgKi8gCi0jZGVmaW5lIHNjWERhdGEgICAgICAgICAyNCAgICAgIC8qIGV4Y2VwdGlvbiBoYW5kbGluZyBkYXRhICovCi0jZGVmaW5lIHNjUERhdGEgICAgICAgICAyNSAgICAgIC8qIFByb2NlZHVyZSBzZWN0aW9uICovCi0jZGVmaW5lIHNjRmluaSAgICAgICAgICAyNiAgICAgIC8qIC5maW5pIHNlY3Rpb24gKi8KLSNkZWZpbmUgc2NSQ29uc3QJMjcJLyogLnJjb25zdCBzZWN0aW9uICovCi0jZGVmaW5lIHNjTWF4CQkzMgotCi0KLS8qCi0gKiAgIFN5bWJvbCBUeXBlcwotICovCi0KLSNkZWZpbmUgc3ROaWwJCTAJLyogTnV0aGluJyBzcGVjaWFsICovCi0jZGVmaW5lIHN0R2xvYmFsCTEJLyogZXh0ZXJuYWwgc3ltYm9sICovCi0jZGVmaW5lIHN0U3RhdGljCTIJLyogc3RhdGljICovCi0jZGVmaW5lIHN0UGFyYW0JCTMJLyogcHJvY2VkdXJlIGFyZ3VtZW50ICovCi0jZGVmaW5lIHN0TG9jYWwJCTQJLyogbG9jYWwgdmFyaWFibGUgKi8KLSNkZWZpbmUgc3RMYWJlbAkJNQkvKiBsYWJlbCAqLwotI2RlZmluZSBzdFByb2MJCTYJLyogICAgICIgICAgICAiCSBQcm9jZWR1cmUgKi8KLSNkZWZpbmUgc3RCbG9jawkJNwkvKiBiZWdpbm5uaW5nIG9mIGJsb2NrICovCi0jZGVmaW5lIHN0RW5kCQk4CS8qIGVuZCAob2YgYW55dGhpbmcpICovCi0jZGVmaW5lIHN0TWVtYmVyCTkJLyogbWVtYmVyIChvZiBhbnl0aGluZwktIHN0cnVjdC91bmlvbi9lbnVtICovCi0jZGVmaW5lIHN0VHlwZWRlZgkxMAkvKiB0eXBlIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgc3RGaWxlCQkxMQkvKiBmaWxlIG5hbWUgKi8KLSNkZWZpbmUgc3RSZWdSZWxvYwkxMgkvKiByZWdpc3RlciByZWxvY2F0aW9uICovCi0jZGVmaW5lIHN0Rm9yd2FyZAkxMwkvKiBmb3J3YXJkaW5nIGFkZHJlc3MgKi8KLSNkZWZpbmUgc3RTdGF0aWNQcm9jCTE0CS8qIGxvYWQgdGltZSBvbmx5IHN0YXRpYyBwcm9jcyAqLwotI2RlZmluZSBzdENvbnN0YW50CTE1CS8qIGNvbnN0ICovCi0jZGVmaW5lIHN0U3RhUGFyYW0JMTYJLyogRm9ydHJhbiBzdGF0aWMgcGFyYW1ldGVycyAqLwotICAgIC8qIFRoZXNlIG5ldyBzeW1ib2wgdHlwZXMgaGF2ZSBiZWVuIHJlY2VudGx5IGFkZGVkIHRvIFNHSSBtYWNoaW5lcy4gKi8KLSNkZWZpbmUgc3RTdHJ1Y3QJMjYJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGEgc3RydWN0IHR5cGUgKi8KLSNkZWZpbmUgc3RVbmlvbgkJMjcJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGEgdW5pb24gdHlwZSAqLwotI2RlZmluZSBzdEVudW0JCTI4CS8qIEJlZ2lubmluZyBvZiBibG9jayBkZWZpbmluZyBhbiBlbnVtIHR5cGUgKi8KLSNkZWZpbmUgc3RJbmRpcmVjdAkzNAkvKiBJbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSAgICAvKiBQc2V1ZG8tc3ltYm9scyAtIGludGVybmFsIHRvIGRlYnVnZ2VyICovCi0jZGVmaW5lIHN0U3RyCQk2MAkvKiBzdHJpbmcgKi8KLSNkZWZpbmUgc3ROdW1iZXIJNjEJLyogcHVyZSBudW1iZXIgKGllLiA0IE5PUiAyKzIpICovCi0jZGVmaW5lIHN0RXhwcgkJNjIJLyogMisyIHZzLiA0ICovCi0jZGVmaW5lIHN0VHlwZQkJNjMJLyogcG9zdC1jb2Vyc2lvbiBTRVIgKi8KLSNkZWZpbmUgc3RNYXgJCTY0Ci0KLS8qIGRlZmluaXRpb25zIGZvciBmaWVsZHMgaW4gVElSICovCi0KLS8qIHR5cGUgcXVhbGlmaWVycyBmb3IgdGkudHEwIC0+IHRpLihpdHFNYXgtMSkgKi8KLSNkZWZpbmUgdHFOaWwJMAkvKiBidCBpcyB3aGF0IHlvdSBzZWUgKi8KLSNkZWZpbmUgdHFQdHIJMQkvKiBwb2ludGVyICovCi0jZGVmaW5lIHRxUHJvYwkyCS8qIHByb2NlZHVyZSAqLwotI2RlZmluZSB0cUFycmF5IDMJLyogZHVoICovCi0jZGVmaW5lIHRxRmFyCTQJLyogbG9uZ2VyIGFkZHJlc3NpbmcgLSA4MDg2LzggbGFuZCAqLwotI2RlZmluZSB0cVZvbAk1CS8qIHZvbGF0aWxlICovCi0jZGVmaW5lIHRxQ29uc3QgNgkvKiBjb25zdCAqLwotI2RlZmluZSB0cU1heAk4Ci0KLS8qIGJhc2ljIHR5cGVzIGFzIHNlZW4gaW4gdGkuYnQgKi8KLSNkZWZpbmUgYnROaWwJCTAJLyogdW5kZWZpbmVkIChhbHNvLCBlbnVtIG1lbWJlcnMpICovCi0jZGVmaW5lIGJ0QWRyCQkxCS8qIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwb2ludGVyICovCi0jZGVmaW5lIGJ0Q2hhcgkJMgkvKiBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgYnRVQ2hhcgkJMwkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgYnRTaG9ydAkJNAkvKiBzaG9ydCAqLwotI2RlZmluZSBidFVTaG9ydAk1CS8qIHVuc2lnbmVkIHNob3J0ICovCi0jZGVmaW5lIGJ0SW50CQk2CS8qIGludCAqLwotI2RlZmluZSBidFVJbnQJCTcJLyogdW5zaWduZWQgaW50ICovCi0jZGVmaW5lIGJ0TG9uZwkJOAkvKiBsb25nICovCi0jZGVmaW5lIGJ0VUxvbmcJCTkJLyogdW5zaWduZWQgbG9uZyAqLwotI2RlZmluZSBidEZsb2F0CQkxMAkvKiBmbG9hdCAocmVhbCkgKi8KLSNkZWZpbmUgYnREb3VibGUJMTEJLyogRG91YmxlIChyZWFsKSAqLwotI2RlZmluZSBidFN0cnVjdAkxMgkvKiBTdHJ1Y3R1cmUgKFJlY29yZCkgKi8KLSNkZWZpbmUgYnRVbmlvbgkJMTMJLyogVW5pb24gKHZhcmlhbnQpICovCi0jZGVmaW5lIGJ0RW51bQkJMTQJLyogRW51bWVyYXRlZCAqLwotI2RlZmluZSBidFR5cGVkZWYJMTUJLyogZGVmaW5lZCB2aWEgYSB0eXBlZGVmLCBpc3ltUmVmIHBvaW50cyAqLwotI2RlZmluZSBidFJhbmdlCQkxNgkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KLSNkZWZpbmUgYnRTZXQJCTE3CS8qIHBhc2NhbCBzZXRzICovCi0jZGVmaW5lIGJ0Q29tcGxleAkxOAkvKiBmb3J0cmFuIGNvbXBsZXggKi8KLSNkZWZpbmUgYnREQ29tcGxleAkxOQkvKiBmb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0jZGVmaW5lIGJ0SW5kaXJlY3QJMjAJLyogZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYgKi8KLSNkZWZpbmUgYnRGaXhlZERlYwkyMQkvKiBGaXhlZCBEZWNpbWFsICovCi0jZGVmaW5lIGJ0RmxvYXREZWMJMjIJLyogRmxvYXQgRGVjaW1hbCAqLwotI2RlZmluZSBidFN0cmluZwkyMwkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCi0jZGVmaW5lIGJ0Qml0CQkyNAkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KLSNkZWZpbmUgYnRQaWN0dXJlCTI1CS8qIFBpY3R1cmUgKi8KLSNkZWZpbmUgYnRWb2lkCQkyNgkvKiB2b2lkICovCi0jZGVmaW5lIGJ0TG9uZ0xvbmcJMjcJLyogbG9uZyBsb25nICovCi0jZGVmaW5lIGJ0VUxvbmdMb25nCTI4CS8qIHVuc2lnbmVkIGxvbmcgbG9uZyAqLwotI2RlZmluZSBidE1heAkJNjQKLQotI2lmIChfTUZHID09IF9NSVBTKQotLyogb3B0aW1pemF0aW9uIHR5cGUgY29kZXMgKi8KLSNkZWZpbmUgb3ROaWwJCTAKLSNkZWZpbmUgb3RSZWcJCTEJLyogbW92ZSB2YXIgdG8gcmVnICovCi0jZGVmaW5lIG90QmxvY2sJCTIJLyogYmVnaW4gYmFzaWMgYmxvY2sgKi8KLSNkZWZpbmUJb3RQcm9jCQkzCS8qIHByb2NlZHVyZSAqLwotI2RlZmluZSBvdElubGluZQk0CS8qIGlubGluZSBwcm9jZWR1cmUgKi8KLSNkZWZpbmUgb3RFbmQJCTUJLyogd2hhdGV2ZXIgeW91IHN0YXJ0ZWQgKi8KLSNkZWZpbmUgb3RNYXgJCTYJLyogS0VFUCBVUCBUTyBEQVRFICovCi0jZW5kaWYgLyogKF9NRkcgPT0gX01JUFMpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvdGljMzAuaCBiL2luY2x1ZGUvY29mZi90aWMzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIwMjZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi90aWMzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzNYICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLSNkZWZpbmUJVElDMzBNQUdJQwkweEMwMDAKLQotI2RlZmluZSBUSUMzMEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1USUMzME1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotICBzdHJ1Y3QgewotCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQl1bmlvbiB7Ci0JICBzdHJ1Y3QgewotCQljaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCWNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkgIH0geF9sbnN6OwotCSAgY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JfSB4X21pc2M7Ci0JdW5pb24gewotCSAgc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JICB9IHhfZmNuOwotCSAgc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCSAgfSB4X2FyeTsKLQl9IHhfZmNuYXJ5OwotCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0JY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCXN0cnVjdCB7Ci0JICBjaGFyIHhfemVyb2VzWzRdOwotCSAgY2hhciB4X29mZnNldFs0XTsKLQl9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0gIH0geF9zY247Ci0gIAotICBzdHJ1Y3QgewotCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0gIH0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLSAgCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgejhrIGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHdpdGggc2VnbWVudHMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0vKiBUTVMzMjBDMzAgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0KLSNkZWZpbmUgUl9USUMzMF9BQlMxNiAweDEwMCAgLyogMTYgYml0IGFic29sdXRlLiAqLwotI2RlZmluZSBSX1RJQzMwX0FCUzI0IDB4MTAxICAvKiAyNCBiaXQgYWJzb2x1dGUuICovCi0jZGVmaW5lIFJfVElDMzBfQUJTMzIgMHgxMDIgIC8qIDMyIGJpdCBhYnNvbHV0ZS4gKi8KLSNkZWZpbmUgUl9USUMzMF9MRFAgICAweDEwMyAgLyogTERQIGJpdHMgMjMtMTYgdG8gNy0wLiAqLwotI2RlZmluZSBSX1RJQzMwX1BDMTYgIDB4MTA0ICAvKiAxNiBiaXQgcGMgcmVsYXRpdmUuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvdGljODAuaCBiL2luY2x1ZGUvY29mZi90aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkzOGY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi90aWM4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgVEkgVE1TMzIwQzgwIChNVlApICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi0JY2hhciBmX3RhcmdldF9pZFsyXTsJLyogdGFyZ2V0IGlkIChUSWM4MCBzcGVjaWZpYykJKi8KLX07Ci0KLSNkZWZpbmUJVElDODBfQVJDSF9NQUdJQwkweDBDMQkvKiBHb2VzIGluIHRoZSBmaWxlIGhlYWRlciBtYWdpYyBudW1iZXIgZmllbGQgKi8KLSNkZWZpbmUgVElDODBfVEFSR0VUX0lECQkweDk1CS8qIEdvZXMgaW4gdGhlIHRhcmdldCBpZCBmaWVsZCAqLwotCi0jZGVmaW5lIFRJQzgwQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBUSUM4MF9BUkNIX01BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBUSUM4MF9BT1VUSERSX01BR0lDCTB4MTA4CS8qIEdvZXMgaW4gdGhlIG9wdGlvbmFsIGZpbGUgaGVhZGVyIG1hZ2ljIG51bWJlciBmaWVsZCAqLwotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi0JY2hhcgkJc19yZXNlcnZlZFsxXTsJLyogcmVzZXJ2ZWQgKFRJYzgwIHNwZWNpZmljKQkqLwotCWNoYXIJCXNfbWVtcGFnZVsxXTsJLyogbWVtb3J5IHBhZ2UgbnVtYmVyIChUSWM4MCkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NJTklUCSIuY2luaXQiCi0jZGVmaW5lIF9DT05TVAkiLmNvbnN0IgotI2RlZmluZSBfU1dJVENICSIuc3dpdGNoIgotI2RlZmluZSBfU1RBQ0sJIi5zdGFjayIKLSNkZWZpbmUgX1NZU01FTQkiLnN5c21lbSIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJCQkvKiBsaW5lIG51bWJlcgkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0vKiBGSVhNRSAtIG5lZWQgdG8gY29ycmVsYXRlIHdpdGggVEljODAgQ29kZSBHZW5lcmF0aW9uIFRvb2xzIFVzZXIncyBHdWlkZSwgQ0c6QS0yNSAqLwotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9yZXNlcnZlZFsyXTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEyCi0KLS8qIFRJYzgwIHJlbG9jYXRpb24gdHlwZXMuICovCi0KLSNkZWZpbmUgUl9BQlMJCTB4MDAJCS8qIEFic29sdXRlIGFkZHJlc3MgLSBubyByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfUkVMTE9OR1gJMHgxMQkJLyogUFA6IDMyIGJpdHMsIGRpcmVjdCAqLwotI2RlZmluZSBSX1BQQkFTRQkweDM0CQkvKiBQUDogR2xvYmFsIGJhc2UgYWRkcmVzcyB0eXBlICovCi0jZGVmaW5lIFJfUFBMQkFTRQkweDM1CQkvKiBQUDogTG9jYWwgYmFzZSBhZGRyZXNzIHR5cGUgKi8KLSNkZWZpbmUgUl9QUDE1CQkweDM4CQkvKiBQUDogR2xvYmFsIDE1IGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUDE1VwkJMHgzOQkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQMTVICQkweDNBCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFAxNkIJCTB4M0IJCS8qIFBQOiBHbG9iYWwgMTYgYml0IG9mZnNldCBmb3IgYnl0ZXMgKi8KLSNkZWZpbmUgUl9QUEwxNQkJMHgzQwkJLyogUFA6IExvY2FsIDE1IGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUEwxNVcJMHgzRAkJLyogUFA6IExvY2FsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFBMMTVICTB4M0UJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQTDE2QgkweDNGCQkvKiBQUDogTG9jYWwgMTYgYml0IG9mZnNldCBmb3IgYnl0ZXMgKi8KLSNkZWZpbmUgUl9QUE4xNQkJMHg0MAkJLyogUFA6IEdsb2JhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBOMTVXCTB4NDEJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUE4xNUgJMHg0MgkJLyogUFA6IEdsb2JhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQTjE2QgkweDQzCQkvKiBQUDogR2xvYmFsIDE2IGJpdCBuZWdhdGl2ZSBieXRlIG9mZnNldCAqLwotI2RlZmluZSBSX1BQTE4xNQkweDQ0CQkvKiBQUDogTG9jYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCAqLwotI2RlZmluZSBSX1BQTE4xNVcJMHg0NQkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFBMTjE1SAkweDQ2CQkvKiBQUDogTG9jYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUExOMTZCCTB4NDcJCS8qIFBQOiBMb2NhbCAxNiBiaXQgbmVnYXRpdmUgYnl0ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9NUFBDUjE1VwkweDRFCQkvKiBNUDogMTUgYml0IFBDLXJlbGF0aXZlIGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX01QUENSCQkweDRGCQkvKiBNUDogMzIgYml0IFBDLXJlbGF0aXZlIGRpdmlkZWQgYnkgNCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3c2NS5oIGIvaW5jbHVkZS9jb2ZmL3c2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc4YzIzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi93NjUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFdEQyA2NTgxNiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJVzY1TUFHSUMJMHg2NTAwCi0KLQotI2RlZmluZSBXNjVCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9VzY1TUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgdzY1IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3dlMzJrLmggYi9pbmNsdWRlL2NvZmYvd2UzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzZmEzNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvd2UzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIHdlMzJrICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUJRl9CTTMyQgkJKDAwMjAwMDApCi0jZGVmaW5lCUZfQk0zMk1BVQkoMDA0MDAwMCkKLQotI2RlZmluZQlXRTMyS01BR0lDCTB4MTcwCS8qIHdlMzJrIHNhbnMgdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIEZCT01BR0lDCTB4MTcwCS8qIHdlMzJrIHNhbnMgdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIE1UVk1BR0lDCTB4MTcxCS8qIHdlMzJrIHdpdGggdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIFJCT01BR0lDCTB4MTcyCS8qIHJlc2VydmVkICovCi0jZGVmaW5lIFdFMzJLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gV0UzMktNQUdJQykgXAotCQkJJiYgKCh4KS5mX21hZ2ljICE9IEZCT01BR0lDKSBcCi0JCQkmJiAoKHgpLmZfbWFnaWMgIT0gUkJPTUFHSUMpIFwKLQkJCSYmICgoeCkuZl9tYWdpYyAhPSBNVFZNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9UVgkiLnR2IgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi96OGsuaCBiL2luY2x1ZGUvY29mZi96OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliODQ2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvejhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBaaWxvZyBaODAwTiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBUeXBlIG9mIGNwdSBpcyBzdG9yZWQgaW4gZmxhZ3MgKi8KLSNkZWZpbmUgRl9aODAwMSAgICAweDEwMDAKLSNkZWZpbmUgRl9aODAwMiAgICAweDIwMDAKLSNkZWZpbmUgRl9NQUNITUFTSyAweGYwMDAKLQotI2RlZmluZQlaOEtNQUdJQwkweDgwMDAKLQotI2RlZmluZSBaOEtCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9WjhLTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgejhrIGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHdpdGggc2VnbWVudHMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlbWFuZ2xlLmggYi9pbmNsdWRlL2RlbWFuZ2xlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmU1ZTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9kZW1hbmdsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyogRGVmcyBmb3IgaW50ZXJmYWNlIHRvIGRlbWFuZ2xlcnMuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmICFkZWZpbmVkIChERU1BTkdMRV9IKQotI2RlZmluZSBERU1BTkdMRV9ICi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBPcHRpb25zIHBhc3NlZCB0byBjcGx1c19kZW1hbmdsZSAoaW4gMm5kIHBhcmFtZXRlcikuICovCi0KLSNkZWZpbmUgRE1HTF9OT19PUFRTCTAJCS8qIEZvciByZWFkYWJpbGl0eS4uLiAqLwotI2RlZmluZSBETUdMX1BBUkFNUwkoMSA8PCAwKQkvKiBJbmNsdWRlIGZ1bmN0aW9uIGFyZ3MgKi8KLSNkZWZpbmUgRE1HTF9BTlNJCSgxIDw8IDEpCS8qIEluY2x1ZGUgY29uc3QsIHZvbGF0aWxlLCBldGMgKi8KLSNkZWZpbmUgRE1HTF9KQVZBCSgxIDw8IDIpCS8qIERlbWFuZ2xlIGFzIEphdmEgcmF0aGVyIHRoYW4gQysrLiAqLwotCi0jZGVmaW5lIERNR0xfQVVUTwkoMSA8PCA4KQotI2RlZmluZSBETUdMX0dOVQkoMSA8PCA5KQotI2RlZmluZSBETUdMX0xVQ0lECSgxIDw8IDEwKQotI2RlZmluZSBETUdMX0FSTQkoMSA8PCAxMSkKLSNkZWZpbmUgRE1HTF9IUCAJKDEgPDwgMTIpICAgICAgIC8qIEZvciB0aGUgSFAgYUNDIGNvbXBpbGVyOyBzYW1lIGFzIEFSTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGVtcGxhdGUgYXJndW1lbnRzLCBldGMuICovCi0jZGVmaW5lIERNR0xfRURHCSgxIDw8IDEzKQotCi0vKiBJZiBub25lIG9mIHRoZXNlIGFyZSBzZXQsIHVzZSAnY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlJyBhcyB0aGUgZGVmYXVsdC4gKi8KLSNkZWZpbmUgRE1HTF9TVFlMRV9NQVNLIChETUdMX0FVVE98RE1HTF9HTlV8RE1HTF9MVUNJRHxETUdMX0FSTXxETUdMX0hQfERNR0xfRURHKQotCi0vKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBkZW1hbmdsaW5nIHN0eWxlcy4KLQotICAgTHVjaWQgYW5kIEFSTSBzdHlsZXMgYXJlIHN0aWxsIGtlcHQgbG9naWNhbGx5IGRpc3RpbmN0LCBldmVuIHRob3VnaAotICAgdGhleSBub3cgYm90aCBiZWhhdmUgaWRlbnRpY2FsbHkuICBUaGUgcmVzdWx0aW5nIHN0eWxlIGlzIGFjdHVhbCB0aGUKLSAgIHVuaW9uIG9mIGJvdGguICBJLkUuIGVpdGhlciBzdHlsZSByZWNvZ25pemVzIGJvdGggIl9fcHRfXyIgYW5kICJfX3JmX18iCi0gICBmb3Igb3BlcmF0b3IgIi0+IiwgZXZlbiB0aG91Z2ggdGhlIGZpcnN0IGlzIGx1Y2lkIHN0eWxlIGFuZCB0aGUgc2Vjb25kCi0gICBpcyBBUk0gc3R5bGUuIChGSVhNRT8pICovCi0KLWV4dGVybiBlbnVtIGRlbWFuZ2xpbmdfc3R5bGVzCi17Ci0gIHVua25vd25fZGVtYW5nbGluZyA9IDAsCi0gIGF1dG9fZGVtYW5nbGluZyA9IERNR0xfQVVUTywKLSAgZ251X2RlbWFuZ2xpbmcgPSBETUdMX0dOVSwKLSAgbHVjaWRfZGVtYW5nbGluZyA9IERNR0xfTFVDSUQsCi0gIGFybV9kZW1hbmdsaW5nID0gRE1HTF9BUk0sCi0gIGhwX2RlbWFuZ2xpbmcgPSBETUdMX0hQLAotICBlZGdfZGVtYW5nbGluZyA9IERNR0xfRURHCi19IGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZTsKLQotLyogRGVmaW5lIHN0cmluZyBuYW1lcyBmb3IgdGhlIHZhcmlvdXMgZGVtYW5nbGluZyBzdHlsZXMuICovCi0KLSNkZWZpbmUgQVVUT19ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiYXV0byIKLSNkZWZpbmUgR05VX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJnbnUiCi0jZGVmaW5lIExVQ0lEX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJsdWNpZCIKLSNkZWZpbmUgQVJNX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJhcm0iCi0jZGVmaW5lIEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJocCIKLSNkZWZpbmUgRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJlZGciCi0KLS8qIFNvbWUgbWFjcm9zIHRvIHRlc3Qgd2hhdCBkZW1hbmdsaW5nIHN0eWxlIGlzIGFjdGl2ZS4gKi8KLQotI2RlZmluZSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlCi0jZGVmaW5lIEFVVE9fREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0FVVE8pCi0jZGVmaW5lIEdOVV9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfR05VKQotI2RlZmluZSBMVUNJRF9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfTFVDSUQpCi0jZGVmaW5lIEFSTV9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfQVJNKQotI2RlZmluZSBIUF9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfSFApCi0jZGVmaW5lIEVER19ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfRURHKQotCi1leHRlcm4gY2hhciAqCi1jcGx1c19kZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICptYW5nbGVkLCBpbnQgb3B0aW9ucykpOwotCi1leHRlcm4gaW50Ci1jcGx1c19kZW1hbmdsZV9vcG5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqb3BuYW1lLCBjaGFyICpyZXN1bHQsIGludCBvcHRpb25zKSk7Ci0KLWV4dGVybiBjb25zdCBjaGFyICoKLWNwbHVzX21hbmdsZV9vcG5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqb3BuYW1lLCBpbnQgb3B0aW9ucykpOwotCi0vKiBOb3RlOiBUaGlzIHNldHMgZ2xvYmFsIHN0YXRlLiAgRklYTUUgaWYgeW91IGNhcmUgYWJvdXQgbXVsdGktdGhyZWFkaW5nLiAqLwotCi1leHRlcm4gdm9pZAotc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyBQQVJBTVMgKChpbnQgY2gpKTsKLQotI2VuZGlmCS8qIERFTUFOR0xFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGlzLWFzbS5oIGIvaW5jbHVkZS9kaXMtYXNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmE1Y2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9kaXMtYXNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyogSW50ZXJmYWNlIGJldHdlZW4gdGhlIG9wY29kZSBsaWJyYXJ5IGFuZCBpdHMgY2FsbGVycy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQsIDE5OTMuCi0KLSAgIFRoZSBvcGNvZGUgbGlicmFyeSAobGlib3Bjb2Rlcy5hKSBwcm92aWRlcyBpbnN0cnVjdGlvbiBkZWNvZGVycyBmb3IKLSAgIGEgbGFyZ2UgdmFyaWV0eSBvZiBpbnN0cnVjdGlvbiBzZXRzLCBjYWxsYWJsZSB3aXRoIGFuIGlkZW50aWNhbAotICAgaW50ZXJmYWNlLCBmb3IgbWFraW5nIGluc3RydWN0aW9uLXByb2Nlc3NpbmcgcHJvZ3JhbXMgbW9yZSBpbmRlcGVuZGVudAotICAgb2YgdGhlIGluc3RydWN0aW9uIHNldCBiZWluZyBwcm9jZXNzZWQuICAqLwotCi0jaWZuZGVmIERJU19BU01fSAotI2RlZmluZSBESVNfQVNNX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0KLXR5cGVkZWYgaW50ICgqZnByaW50Zl9mdHlwZSkgUEFSQU1TKChQVFIsIGNvbnN0IGNoYXIqLCAuLi4pKTsKLQotZW51bSBkaXNfaW5zbl90eXBlIHsKLSAgZGlzX25vbmluc24sCQkJLyogTm90IGEgdmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLSAgZGlzX25vbmJyYW5jaCwJCS8qIE5vdCBhIGJyYW5jaCBpbnN0cnVjdGlvbiAqLwotICBkaXNfYnJhbmNoLAkJCS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIGRpc19jb25kYnJhbmNoLAkJLyogQ29uZGl0aW9uYWwgYnJhbmNoICovCi0gIGRpc19qc3IsCQkJLyogSnVtcCB0byBzdWJyb3V0aW5lICovCi0gIGRpc19jb25kanNyLAkJCS8qIENvbmRpdGlvbmFsIGp1bXAgdG8gc3Vicm91dGluZSAqLwotICBkaXNfZHJlZiwJCQkvKiBEYXRhIHJlZmVyZW5jZSBpbnN0cnVjdGlvbiAqLwotICBkaXNfZHJlZjIJCQkvKiBUd28gZGF0YSByZWZlcmVuY2VzIGluIGluc3RydWN0aW9uICovCi19OwotCi0vKiBUaGlzIHN0cnVjdCBpcyBwYXNzZWQgaW50byB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2Rpbmcgcm91dGluZSwgCi0gICBhbmQgaXMgcGFzc2VkIGJhY2sgb3V0IGludG8gZWFjaCBjYWxsYmFjay4gIFRoZSB2YXJpb3VzIGZpZWxkcyBhcmUgdXNlZAotICAgZm9yIGNvbnZleWluZyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgbWFpbiByb3V0aW5lIGludG8geW91ciBjYWxsYmFja3MsCi0gICBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVycyAoc3VjaCBhcyB0aGUKLSAgIGFkZHJlc3NlcyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zKSwgb3IgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24KLSAgIGJhY2sgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgdG8gdGhlaXIgY2FsbGVycy4KLQotICAgSXQgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgaXQgaXMgZmlyc3QgcGFzc2VkOyB0aGlzIGNhbiBiZSBkb25lCi0gICBieSBoYW5kLCBvciB1c2luZyBvbmUgb2YgdGhlIGluaXRpYWxpemF0aW9uIG1hY3JvcyBiZWxvdy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gewotICBmcHJpbnRmX2Z0eXBlIGZwcmludGZfZnVuYzsKLSAgUFRSIHN0cmVhbTsKLSAgUFRSIGFwcGxpY2F0aW9uX2RhdGE7Ci0KLSAgLyogVGFyZ2V0IGRlc2NyaXB0aW9uLiAgV2UgY291bGQgcmVwbGFjZSB0aGlzIHdpdGggYSBwb2ludGVyIHRvIHRoZSBiZmQsCi0gICAgIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgb25lLiAgVGhlcmUgY3VycmVudGx5IGlzbid0IGFueSBzdWNoIHJlcXVpcmVtZW50Ci0gICAgIHNvIHRvIGF2b2lkIGludHJvZHVjaW5nIG9uZSB3ZSByZWNvcmQgdGhlc2UgZXhwbGljaXRseS4gICovCi0gIC8qIFRoZSBiZmRfZmxhdm91ci4gIFRoaXMgY2FuIGJlIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLiAgKi8KLSAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotICAvKiBUaGUgYmZkX2FyY2ggdmFsdWUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogVGhlIGJmZF9tYWNoIHZhbHVlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYWNoOwotICAvKiBFbmRpYW5uZXNzIChmb3IgYmktZW5kaWFuIGNwdXMpLiAgTW9uby1lbmRpYW4gY3B1cyBjYW4gaWdub3JlIHRoaXMuICAqLwotICBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuOwotCi0gIC8qIEFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHN5bWJvbHMgZWl0aGVyIGF0IHRoZSBsb2NhdGlvbiBiZWluZyBkaXNhc3NlbWJsZWQKLSAgICAgb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBiZWluZyBkaXNhc3NlbWJsZWQuICBUaGUgYXJyYXkgaXMgc29ydGVkCi0gICAgIHNvIHRoYXQgdGhlIGZpcnN0IHN5bWJvbCBpcyBpbnRlbmRlZCB0byBiZSB0aGUgb25lIHVzZWQuICBUaGUgb3RoZXJzIGFyZQotICAgICBwcmVzZW50IGZvciBhbnkgbWlzYy4gcHVycG9zZXMuICBUaGlzIGlzIG5vdCBzZXQgcmVsaWFibHksIGJ1dCBpZiBpdCBpcwotICAgICBub3QgTlVMTCwgaXQgaXMgY29ycmVjdC4gICovCi0gIGFzeW1ib2wgKipzeW1ib2xzOwotICAvKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBhcnJheS4gICovCi0gIGludCBudW1fc3ltYm9sczsKLQotICAvKiBGb3IgdXNlIGJ5IHRoZSBkaXNhc3NlbWJsZXIuCi0gICAgIFRoZSB0b3AgMTYgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIHB1YmxpYyB1c2UgKGFuZCBhcmUgZG9jdW1lbnRlZCBoZXJlKS4KLSAgICAgVGhlIGJvdHRvbSAxNiBiaXRzIGFyZSBmb3IgdGhlIGludGVybmFsIHVzZSBvZiB0aGUgZGlzYXNzZW1ibGVyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSNkZWZpbmUgSU5TTl9IQVNfUkVMT0MJMHg4MDAwMDAwMAotICBQVFIgcHJpdmF0ZV9kYXRhOwotCi0gIC8qIEZ1bmN0aW9uIHVzZWQgdG8gZ2V0IGJ5dGVzIHRvIGRpc2Fzc2VtYmxlLiAgTUVNQUREUiBpcyB0aGUKLSAgICAgYWRkcmVzcyBvZiB0aGUgc3R1ZmYgdG8gYmUgZGlzYXNzZW1ibGVkLCBNWUFERFIgaXMgdGhlIGFkZHJlc3MgdG8KLSAgICAgcHV0IHRoZSBieXRlcyBpbiwgYW5kIExFTkdUSCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCi0gICAgIElORk8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0LgotICAgICBSZXR1cm5zIGFuIGVycm5vIHZhbHVlIG9yIDAgZm9yIHN1Y2Nlc3MuICAqLwotICBpbnQgKCpyZWFkX21lbW9yeV9mdW5jKQotICAgIFBBUkFNUyAoKGJmZF92bWEgbWVtYWRkciwgYmZkX2J5dGUgKm15YWRkciwgaW50IGxlbmd0aCwKLQkgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLSAgLyogRnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBpZiB3ZSBnZXQgYW4gZXJyb3IgdGhhdCB3ZSBjYW4ndAotICAgICByZWNvdmVyIGZyb20uICBTVEFUVVMgaXMgdGhlIGVycm5vIHZhbHVlIGZyb20gcmVhZF9tZW1vcnlfZnVuYyBhbmQKLSAgICAgTUVNQUREUiBpcyB0aGUgYWRkcmVzcyB0aGF0IHdlIHdlcmUgdHJ5aW5nIHRvIHJlYWQuICBJTkZPIGlzIGEKLSAgICAgcG9pbnRlciB0byB0aGlzIHN0cnVjdC4gICovCi0gIHZvaWQgKCptZW1vcnlfZXJyb3JfZnVuYykKLSAgICBQQVJBTVMgKChpbnQgc3RhdHVzLCBiZmRfdm1hIG1lbWFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLSAgLyogRnVuY3Rpb24gY2FsbGVkIHRvIHByaW50IEFERFIuICAqLwotICB2b2lkICgqcHJpbnRfYWRkcmVzc19mdW5jKQotICAgIFBBUkFNUyAoKGJmZF92bWEgYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotICAvKiBGdW5jdGlvbiBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc3ltYm9sIGF0IHRoZSBnaXZlbiBBRERSLgotICAgICBJZiB0aGVyZSBpcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgMC4KLSAgICAgVGhpcyBpcyB1c2VkIGJ5IHBvcnRzIHdoaWNoIHN1cHBvcnQgYW4gb3ZlcmxheSBtYW5hZ2VyIHdoZXJlCi0gICAgIHRoZSBvdmVybGF5IG51bWJlciBpcyBoZWxkIGluIHRoZSB0b3AgcGFydCBvZiBhbiBhZGRyZXNzLiAgSW4KLSAgICAgc29tZSBjaXJjdW1zdGFuY2VzIHdlIHdhbnQgdG8gaW5jbHVkZSB0aGUgb3ZlcmxheSBudW1iZXIgaW4gdGhlCi0gICAgIGFkZHJlc3MsIChub3JtYWxseSBiZWNhdXNlIHRoZXJlIGlzIGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aAotICAgICB0aGF0IGFkZHJlc3MpLCBidXQgc29tZXRpbWVzIHdlIHdhbnQgdG8gbWFzayBvdXQgdGhlIG92ZXJsYXkgYml0cy4gICovCi0gIGludCAoKiBzeW1ib2xfYXRfYWRkcmVzc19mdW5jKQotICAgIFBBUkFNUyAoKGJmZF92bWEgYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvKSk7Ci0KLSAgLyogVGhlc2UgYXJlIGZvciBidWZmZXJfcmVhZF9tZW1vcnkuICAqLwotICBiZmRfYnl0ZSAqYnVmZmVyOwotICBiZmRfdm1hIGJ1ZmZlcl92bWE7Ci0gIGludCBidWZmZXJfbGVuZ3RoOwotCi0gIC8qIFRoaXMgdmFyaWFibGUgbWF5IGJlIHNldCBieSB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2Rlci4gIEl0IHN1Z2dlc3RzCi0gICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9iamR1bXAgc2hvdWxkIGRpc3BsYXkgb24gYSBzaW5nbGUgbGluZS4gIElmCi0gICAgICB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlciBzZXRzIHRoaXMsIGl0IHNob3VsZCBhbHdheXMgc2V0IGl0IHRvCi0gICAgICB0aGUgc2FtZSB2YWx1ZSBpbiBvcmRlciB0byBnZXQgcmVhc29uYWJsZSBsb29raW5nIG91dHB1dC4gICovCi0gIGludCBieXRlc19wZXJfbGluZTsKLQotICAvKiB0aGUgbmV4dCB0d28gdmFyaWFibGVzIGNvbnRyb2wgdGhlIHdheSBvYmpkdW1wIGRpc3BsYXlzIHRoZSByYXcgZGF0YSAqLwotICAvKiBGb3IgZXhhbXBsZSwgaWYgYnl0ZXNfcGVyX2xpbmUgaXMgOCBhbmQgYnl0ZXNfcGVyX2NodW5rIGlzIDQsIHRoZSAqLwotICAvKiBvdXRwdXQgd2lsbCBsb29rIGxpa2UgdGhpczoKLSAgICAgMDA6ICAgMDAwMDAwMDAgMDAwMDAwMDAKLSAgICAgd2l0aCB0aGUgY2h1bmtzIGRpc3BsYXllZCBhY2NvcmRpbmcgdG8gImRpc3BsYXlfZW5kaWFuIi4gKi8KLSAgaW50IGJ5dGVzX3Blcl9jaHVuazsKLSAgZW51bSBiZmRfZW5kaWFuIGRpc3BsYXlfZW5kaWFuOwotCi0gIC8qIFJlc3VsdHMgZnJvbSBpbnN0cnVjdGlvbiBkZWNvZGVycy4gIE5vdCBhbGwgZGVjb2RlcnMgeWV0IHN1cHBvcnQKLSAgICAgdGhpcyBpbmZvcm1hdGlvbi4gIFRoaXMgaW5mbyBpcyBzZXQgZWFjaCB0aW1lIGFuIGluc3RydWN0aW9uIGlzCi0gICAgIGRlY29kZWQsIGFuZCBpcyBvbmx5IHZhbGlkIGZvciB0aGUgbGFzdCBzdWNoIGluc3RydWN0aW9uLgotCi0gICAgIFRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjb2RlciBzdXBwb3J0cyB0aGlzIGluZm9ybWF0aW9uLCBzZXQKLSAgICAgaW5zbl9pbmZvX3ZhbGlkIHRvIDAsIGRlY29kZSBhbiBpbnN0cnVjdGlvbiwgdGhlbiBjaGVjayBpdC4gICovCi0KLSAgY2hhciBpbnNuX2luZm9fdmFsaWQ7CQkvKiBCcmFuY2ggaW5mbyBoYXMgYmVlbiBzZXQuICovCi0gIGNoYXIgYnJhbmNoX2RlbGF5X2luc25zOwkvKiBIb3cgbWFueSBzZXF1ZW50aWFsIGluc24ncyB3aWxsIHJ1biBiZWZvcmUKLQkJCQkgICBhIGJyYW5jaCB0YWtlcyBlZmZlY3QuICAoMCA9IG5vcm1hbCkgKi8KLSAgY2hhciBkYXRhX3NpemU7CQkvKiBTaXplIG9mIGRhdGEgcmVmZXJlbmNlIGluIGluc24sIGluIGJ5dGVzICovCi0gIGVudW0gZGlzX2luc25fdHlwZSBpbnNuX3R5cGU7CS8qIFR5cGUgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgYmZkX3ZtYSB0YXJnZXQ7CQkvKiBUYXJnZXQgYWRkcmVzcyBvZiBicmFuY2ggb3IgZHJlZiwgaWYga25vd247Ci0JCQkJICAgemVybyBpZiB1bmtub3duLiAgKi8KLSAgYmZkX3ZtYSB0YXJnZXQyOwkJLyogU2Vjb25kIHRhcmdldCBhZGRyZXNzIGZvciBkcmVmMiAqLwotCi0gIC8qIENvbW1hbmQgbGluZSBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSB0YXJnZXQgZGlzYXNzZW1ibGVyLiAgKi8KLSAgY2hhciAqIGRpc2Fzc2VtYmxlcl9vcHRpb25zOwotCi19IGRpc2Fzc2VtYmxlX2luZm87Ci0KLQwKLS8qIFN0YW5kYXJkIGRpc2Fzc2VtYmxlcnMuICBEaXNhc3NlbWJsZSBvbmUgaW5zdHJ1Y3Rpb24gYXQgdGhlIGdpdmVuCi0gICB0YXJnZXQgYWRkcmVzcy4gIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcHJvY2Vzc2VkLiAgKi8KLXR5cGVkZWYgaW50ICgqZGlzYXNzZW1ibGVyX2Z0eXBlKQotICAgICBQQVJBTVMoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1leHRlcm4gaW50IHByaW50X2luc25fYmlnX21pcHMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX21pcHMJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pMzg2X2F0dAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pMzg2X2ludGVsCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbTY4awkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl96ODAwMQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl96ODAwMgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODMwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODMwMGgJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDgzMDBzCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4NTAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2FscGhhCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGRpc2Fzc2VtYmxlcl9mdHlwZSBhcmNfZ2V0X2Rpc2Fzc2VtYmxlciBQQVJBTVMgKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19hcm0JCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX2FybQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3NwYXJjCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19hMjlrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9hMjlrCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTk2MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9zaAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9zaGwJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faHBwYQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9mcjMwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX20zMnIJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbTg4awkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tY29yZQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tbjEwMjAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX21uMTAzMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbnMzMmsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYmlnX3Bvd2VycGMJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYwlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3JzNjAwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl93NjUJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fZDEwdgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9kMzB2CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3Y4NTAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdGljMzAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdmF4CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3RpYzgwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotCi1leHRlcm4gaW50IGFybV90b2dnbGVfcmVnbmFtZXMgICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGZXRjaCB0aGUgZGlzYXNzZW1ibGVyIGZvciBhIGdpdmVuIEJGRCwgaWYgdGhhdCBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gICovCi1leHRlcm4gZGlzYXNzZW1ibGVyX2Z0eXBlIGRpc2Fzc2VtYmxlcglQQVJBTVMgKChiZmQgKikpOwotCi0MCi0vKiBUaGlzIGJsb2NrIG9mIGRlZmluaXRpb25zIGlzIGZvciBwYXJ0aWN1bGFyIGNhbGxlcnMgd2hvIHJlYWQgaW5zdHJ1Y3Rpb25zCi0gICBpbnRvIGEgYnVmZmVyIGJlZm9yZSBjYWxsaW5nIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyLiAgKi8KLQotLyogSGVyZSBpcyBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxlcnMgbWF5IHdpc2ggdG8gdXNlIGZvciByZWFkX21lbW9yeV9mdW5jLgotICAgSXQgZ2V0cyBieXRlcyBmcm9tIGEgYnVmZmVyLiAgKi8KLWV4dGVybiBpbnQgYnVmZmVyX3JlYWRfbWVtb3J5Ci0gIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICosIGludCwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGdvZXMgd2l0aCBidWZmZXJfcmVhZF9tZW1vcnkuCi0gICBJdCBwcmludHMgYSBtZXNzYWdlIHVzaW5nIGluZm8tPmZwcmludGZfZnVuYyBhbmQgaW5mby0+c3RyZWFtLiAgKi8KLWV4dGVybiB2b2lkIHBlcnJvcl9tZW1vcnkgUEFSQU1TICgoaW50LCBiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLQotLyogSnVzdCBwcmludCB0aGUgYWRkcmVzcyBpbiBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MgZXZlbgotICAgdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0byBwcmludCBzeW1ib2xpYwotICAgYWRkcmVzc2VzKS4gICovCi1leHRlcm4gdm9pZCBnZW5lcmljX3ByaW50X2FkZHJlc3MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBBbHdheXMgdHJ1ZS4gICovCi1leHRlcm4gaW50IGdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBNYWNybyB0byBpbml0aWFsaXplIGEgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3QuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQKLSAgIGJ5IGFsbCBhcHBsaWNhdGlvbnMgY3JlYXRpbmcgc3VjaCBhIHN0cnVjdC4gICovCi0jZGVmaW5lIElOSVRfRElTQVNTRU1CTEVfSU5GTyhJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykgXAotICAoSU5GTykuZmxhdm91ciA9IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLCBcCi0gIChJTkZPKS5hcmNoID0gYmZkX2FyY2hfdW5rbm93biwgXAotICAoSU5GTykubWFjaCA9IDAsIFwKLSAgKElORk8pLmVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTiwgXAotICBJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSChJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykKLQotLyogQ2FsbCB0aGlzIG1hY3JvIHRvIGluaXRpYWxpemUgb25seSB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGZvciB0aGUKLSAgIGRpc2Fzc2VtYmxlci4gIEFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgdGhpbmdzIHN1Y2ggYXMgYnl0ZSBvcmRlciwgb3IgbWFjaGluZQotICAgdmFyaWFudCBhcmUgbm90IHRvdWNoZWQgYnkgdGhpcyBtYWNyby4gIFRoaXMgbWFrZXMgdGhpbmdzIG11Y2ggZWFzaWVyIGZvcgotICAgR0RCIHdoaWNoIG11c3QgaW5pdGlhbGl6ZSB0aGVzZSB0aGluZ3Mgc2VwZXJhdGx5LiAgKi8KLQotI2RlZmluZSBJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSChJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykgXAotICAoSU5GTykuZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpKEZQUklOVEZfRlVOQyksIFwKLSAgKElORk8pLnN0cmVhbSA9IChQVFIpKFNUUkVBTSksIFwKLSAgKElORk8pLnN5bWJvbHMgPSBOVUxMLCBcCi0gIChJTkZPKS5udW1fc3ltYm9scyA9IDAsIFwKLSAgKElORk8pLmJ1ZmZlciA9IE5VTEwsIFwKLSAgKElORk8pLmJ1ZmZlcl92bWEgPSAwLCBcCi0gIChJTkZPKS5idWZmZXJfbGVuZ3RoID0gMCwgXAotICAoSU5GTykucmVhZF9tZW1vcnlfZnVuYyA9IGJ1ZmZlcl9yZWFkX21lbW9yeSwgXAotICAoSU5GTykubWVtb3J5X2Vycm9yX2Z1bmMgPSBwZXJyb3JfbWVtb3J5LCBcCi0gIChJTkZPKS5wcmludF9hZGRyZXNzX2Z1bmMgPSBnZW5lcmljX3ByaW50X2FkZHJlc3MsIFwKLSAgKElORk8pLnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgPSBnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzLCBcCi0gIChJTkZPKS5mbGFncyA9IDAsIFwKLSAgKElORk8pLmJ5dGVzX3Blcl9saW5lID0gMCwgXAotICAoSU5GTykuYnl0ZXNfcGVyX2NodW5rID0gMCwgXAotICAoSU5GTykuZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX1VOS05PV04sIFwKLSAgKElORk8pLmluc25faW5mb192YWxpZCA9IDAKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoRElTX0FTTV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvQ2hhbmdlTG9nIGIvaW5jbHVkZS9lbGYvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ0ZGRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi1Nb24gSnVuIDIxIDE2OjM2OjAyIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChlbGZfaHBwYV9yZWxvY190eXBlKTogUmVuYW1lZCBmcm9tIGVsZjMyX2hwcGFfcmVsb2NfdHlwZS4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX21heF9zdGQpOiBEZWZpbmUuCi0KLVdlZCBKdW4gIDkgMTU6MTY6MzQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IFVwZGF0ZSB3aXRoIHZhcmlvdXMgY2hhbmdlcyBmcm9tIG5ld2VzdCBQQSBFTEYKLQlzcGVjaWZpY2F0aW9ucy4KLQotMTk5OS0wNi0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9QUEM2NCk6IERlZmluZS4KLQotMTk5OS0wNi0wMiAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+Ci0KLQkqIGR3YXJmLmg6IEFkZCBMQU5HX0pBVkEuCi0JKiBkd2FyZjIuaDogQWRkIERXX0xBTkdfSmF2YS4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVMRk9TQUJJX0FSTSk6IERlZmluZS4KLQotMTk5OS0wNS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmg6IFVwZGF0ZSBjb21tZW50LgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogaTk2MC5oOiBOZXcgZmlsZS4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoUl9NQ09SRV9DT1BZKTogRGVmaW5lLgotCShSX01DT1JFX0dMT0JfREFUKTogRGVmaW5lLgotCShSX01DT1JFX0pVTVBfU0xPVCk6IERlZmluZS4KLQotMTk5OS0wNS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoUl9NQ09SRV9SRUxBVElWRSk6IERlZmluZS4KLQotOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBtNjhrLmggKEVGX0NQVTMyKTogRGVmaW5lLgotIAotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmggKFNUQVJUX1JFTE9DX05VTUJFUlMpOiBQcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8KLQlmYWtlIHJlbG9jIGVudHJ5IG5hbWUgKGlmIHBvc3NpYmxlKSwgaW4gb3JkZXIgdG8gYXZvaWQgY29uZmxpY3RzCi0Jd2l0aCB0eXBlZGVmcyBvZiB0aGUgc2FtZSBuYW1lLgotCi0xOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTXzMyQklUTU9ERSk6IE5ldy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUKLQlwcm9jZXNzb3IuIAotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIG5ldyBjb25zdGFudHMgZGVmaW5lZCBpbjogIlN5c3RlbSBWIEFwcGxpY2F0aW9uCi0JQmluYXJ5IEludGVyZmFjZSAtIERSQUZUIC0gQXByaWwgMjksIDE5OTgiIGZvdW5kIGF0IHRoZSB3ZWIgc2l0ZTogCi0JaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3Blci9nYWJpL2NvbnRlbnRzLmh0bWwKLQotCShFTV9NTUEpOiBSZW1vdmVkLiAgUmVwbGFjZWQgd2l0aCBFTV9NQ09SRSBhcyBNb3Rvcm9sbGEgb3duIHRoaXMKLQl2YWx1ZS4gCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLW1hY3Jvcy5oOiBGaXhlZCB0byBub3QgZ2VuZXJhdGUgYW4gZW51bSB3aXRoIGEgdHJhaWxpbmcKLQljb21tYS4gCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVfTUlQU19NQUNIXzUwMDApOiBOZXcuCi0KLTE5OTktMDMtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIGRlZmluaXRpb25zIGZvciBhIGZldyBtb3JlIFNvbGFyaXMgRUxGIGV4dGVuc2lvbnMuCi0KLVRodSBGZWIgMTggMTg6NTg6MjYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHRlcm5hbC5oOiBPbmx5IHVzZSBhdHRyaWJ1dGUgaWYgX19HTlVDX18gaXMgZGVmaW5lZC4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIHN1Ym1pdHRlZCBieTogU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0KLQkqIGVsZi9leHRlcm5hbC5oOiBzdHJ1Y3QgRWxmX0V4dGVybmFsX1ZlcnN5bSBtdXN0IGJlIHBhY2tlZCBvbgotCUFSTS4gIENvZGUgdXNlcyBzaXplb2YoRWxmX0V4dGVybmFsX1ZlcnN5bSkgYW5kIGFzc3VtZXMgaXQgaXMKLQllcXVhbCB0byBzaXplb2YoY2hhclsyXSkuICBSZXBvcnRlZCBieSBKaW0gUGljayA8amltQGppbXBpY2suY29tPgotCi0xOTk5LTAyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaCAoRFdBUkYyX0V4dGVybmFsX0FSYW5nZSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UpOiBOZXcgc3RydWN0dXJlLgotCi1Nb24gRmViICAxIDExOjMzOjU2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6ICBSZW51bWJlciByZWxvY3MgdG8gY29uZm9ybSB0byBzdGFuZGFyZC4KLSAgICAgICAgKEVGX05FV19BQkkpOiAgRGVmaW5lLgotICAgICAgICAoRUZfT0xEX0FCSSk6ICBEZWZpbmUuCi0gICAgICAgICogYXJtLW9hYmkuaDogIE5ldyBmaWxlLgotCi0xOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBmcjMwLmg6IEFkZCBSX0ZSMzBfR05VX1ZUe0lOSEVSSVQsRU5UUll9IHJlbG9jcy4KLQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmg6IEFkZCB0eXBlZGVmcyBmb3Igc3RydWN0dXJlcyBmb3VuZCBpbiBkd2FyZjIgc2VjdGlvbnMuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVfTUlQU19NQUNIXzQxMTEpOiBOZXcuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfQUJJLEVfTUlQU19BQklfTzMyLEVfTUlQU19BQklfTzY0LAotCUVfTUlQU19BQklfRUFCSTMyLEVfTUlQU19BQklfRUFCSTY0KToKLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZnIzMC5oOiBBZGQgUl9GUjMwXzQ4IHJlbG9jLgotCi0xOTk4LTEyLTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgZXh0ZXJuYWwgZGF0YSB0eXBlIGZvciBjb25mbGljdCBzZWN0aW9uLgotCi0JKiBtaXBzLmg6IEFkZCBtb3JlIExMXyogb3B0aW9ucyBmcm9tIElyaXggNi41LgotCi0JKiBtaXBzLmg6IEFkZCBSX01JUFNfSkFMUiBhbmQgYWRqdXN0IFJfTUlQU19tYXggYXBwcm9wcmlhdGVseS4KLQotVHVlIE5vdiAxMCAxNToxMjoyOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBSZWR1Y2UgdG8gYSAxNiBiaXQgdmFsdWUuCi0KLVR1ZSBOb3YgMTAgMTU6MTc6MjggMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkMTB2Lmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotV2VkIE5vdiAgNCAxNTo1Njo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBOZXcgbWFjaGluZSBudW1iZXIuCi0KLQkqIGZyMzAuaDogTmV3IGZpbGU6IERlZmluaXRpb25zIGZvciB0aGUgRlIzMC4KLQotRnJpIE9jdCAzMCAxMTo1NDoxNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICBGcm9tIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+OgotICAgICAgICAqIGFybS5oIChSX0FSTV9DT1BZLCBldCBhbC4pOiBOZXcgcmVsb2NzLCB1c2VkIGJ5IExpbnV4IGZvciBQSUMuCi0gICAgICAgIChFRl9BTElHTjgpOiBOZXcgZmxhZy4KLQotVHVlIE9jdCAyMCAxMToxOTo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChOVF9MV1BTVEFUVVMpOiBDbG9zZSBjb21tZW50IGFjY2lkZW50YWxseSBsZWZ0IG9wZW4uCi0KLU1vbiBPY3QgMTkgMjA6MjQ6MTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzaC5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBPY3QgMTkgMDE6NDQ6NDIgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfUFNUQVRVUywgTlRfRlBSRUdTLCBOVF9QU0lORk8sCi0gCU5UX0xXUFNUQVRVUyxOVF9MV1BTSU5GTyk6IGFkZGVkLgotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVybmFsX05vdGUpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCi0KLUZyaSBPY3QgMTYgMTQ6MTE6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtMzJyLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotVHVlIE9jdCAgNiAwOToyMjoyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNwYXJjLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotTW9uIE9jdCAgNSAwOTozOToyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHY4NTAuaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1TdW4gT2N0ICA0IDIxOjE3OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChSXzM4Nl9tYXgpOiBDaGFuZ2UgZnJvbSAyNTIgdG8gMjQuCi0KLU1vbiBTZXAgMjEgMTI6MjQ6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBpMzg2Lmg6ICBDaGFuZ2UgdnRhYmxlIHJlbG9jIG51bWJlcnMuCi0KLVN1biBTZXAgMjAgMDA6NTQ6MjIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGsuaDogQWRkIHZ0YWJsZSByZWxvY3MgYW5kIFJfNjhLX21heC4KLQotVHVlIFNlcCAxNSAwOTo1Njo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGFybS5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBBdWcgMzEgMTE6MjU6MjcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0uaDogIERlZmluZSBTVFRfQVJNX1RGVU5DLiAgUmVtb3ZlIFNUX1RIVU1CX3h4eHgKLSAgICAgICAgZGVmaW5pdGlvbnMuCi0KLVNhdCBBdWcgMjkgMjI6MjU6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgdnRhYmxlIHJlbG9jcy4KLQotMTk5OC0wOC0yNSAxNjo0MiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oOiBBZGQgU1lNSU5GT18qIG1hY3JvcyB0byBhY2Nlc3MgRWxmKl9TeW1pbmZvIGluZm9ybWF0aW9uLgotCi0JKiBleHRlcm5hbC5oOiBBZGQgRWxmX0V4dGVybmFsX1N5bWluZm8gZGVmaW5pdGlvbi4KLQotCSogaW50ZXJuYWwuaDogQWRkIEVsZl9JbnRlcm5hbF9TeW1pbmZvLCBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvLAotCWFuZCBFbGY2NF9TeW1pbmZvIGRlZmluaXRpb25zLgotCi1TdW4gQXVnICA5IDIwOjI2OjQ5IENEVCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogYXJtLmg6ICBBZGQgU1RfVEhVTUIgZGVmaW5pdGlvbnMuCi0KLVdlZCBBdWcgIDUgMTU6NTI6MzUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLmg6IEFkZCBFTEYgaGVhZGVyIGZsYWdzIHRvIHNwZWNpZnkgY29tcGlsZSB0aW1lIG9wdGluczoKLQlFRl9JTlRFUldPUks6IE5ldyBmbGFnLgotCUVGX0FQQ1NfMjY6IE5ldyBmbGFnLgotCUVGX0FQQ1NfRkxPQVQ6IE5ldyBmbGFnLgotCUVGX1BJQzogTmV3IGZsYWcuCi0KLTE5OTgtMDctMzEgMjE6MjggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBtaXNzaW5nIFJIRl8qIGNvbnN0YW50cy4KLQotRnJpIEp1bCAzMSAxMDowMTo0MCAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6IEFkZCBSX0FSTV9USE1fUEM5IHJlbG9jYXRpb24uCi0KLTE5OTgtMDctMzAgMTY6MjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIG5ldyBEVF8qIGVudHJpZXMgYW5kIHRoZXJlIGZsYWcgbWFjcm9zIGZyb20gU29sYXJpcy4KLQotVHVlIEp1bCAyOCAxODoxNDowNyAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oOiAoUl9TUEFSQ19SRVYzMik6IEFkZGVkIGZvciBsaXR0bGUgZW5kaWFuIGRhdGEgZS5nLiBzcGFyYyA4NnguCi0KLUZyaSBKdWwgMjQgMTE6MjI6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IEFkZCBSX01OMTAzMDBfMjQgcmVsb2NhdGlvbi4KLQotMTk5OC0wNy0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIE1JUFM2NCByZWxvY2F0aW9uIG5hbWVzIGFuZCB2YWx1ZXMuCi0KLVdlZCBKdWwgMjIgMTk6Mjk6MDAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0uaDogUmVuYW1lIHJlbG9jYXRpb25zLgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcHBjLmg6IERlZmluZSBlbnVtIGFzIGVsZl9wcGNfcmVsb2NfdHlwZS4KLQotV2VkIEp1bCAyMiAxNjoyMjoxMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaDogTmV3IGZpbGUuICBQcm92aWRlcyByZWxvY2F0aW9uIG1hY3JvczoKLQlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIEZBS0VfUkVMT0MsIEVNUFRZX1JFTE9DIGFuZAotCUVORF9SRUxPQ19OVU1CRVJTIHVzZWQgYnkgb3RoZXIgZWxmIGhlYWRlciBmaWxlcy4KLQotCSogYWxwaGEuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogYXJjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGFybS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBkMTB2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGQzMHYuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogaHBwYS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBpMzg2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG0zMnIuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbTY4ay5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtaXBzLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG1uMTAyMDAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbW4xMDMwMC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBwcGMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogc2guaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogc3BhcmMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogdjg1MC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0KLTE5OTgtMDctMjIgMTM6MDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtbjEwMzAwLmg6IFJld3JpdGUgcmVsb2NhdGlvbiBkZWZpbml0aW9uIHVzaW5nIG1hY3Jvcy4KLQkqIG1pcHMuaDogTGlrZXdpc2UuCi0JKiBwcGMuaDogTGlrZXdpc2UuCi0JKiBhbHBoYS5oOiBMaWtld2lzZS4KLQkqIGFybS5oOiBMaWtld2lzZS4KLQkqIGQxMHYuaDogTGlrZXdpc2UuCi0JKiBkMzB2Lmg6IExpa2V3aXNlLgotCSogbTMyci5oOiBMaWtld2lzZS4KLQkqIG02OGsuaDogTGlrZXdpc2UuCi0JKiBtbjEwMjAwLmg6IExpa2V3aXNlLgotCSogc2guaDogTGlrZXdpc2UuCi0JKiBzcGFyYy5oOiBMaWtld2lzZS4KLQotMTk5OC0wNy0yMSAxMzowNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oOiBOZXcgZmlsZS4KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0JKiBkMzB2Lmg6IE5ldyBmaWxlLgotCSogaTM4Ni5oOiBOZXcgZmlsZS4KLQkqIG02OGsuaDogTmV3IGZpbGUuCi0JKiBtbjEwMjAwLmg6IE5ldyBmaWxlLgotCSogc2guaDogTmV3IGZpbGUuCi0KLQkqIG1pcHMuaDogQWRkIFJfTUlQU18qIGFuZCBTSFRfTUlQU18qIGVudHJpZXMuCi0KLQkqIG1uMTAzMDAuaDogQWRkIFJfTU4xMDMwMF8qIGVudHJpZXMuCi0KLQkqIHBwYy5oOiBBZGQgUl9QUENfKiBlbnRyaWVzLgotCi0xOTk4LTA3LTIwIDA3OjExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgT0RLXyosIE9FWF8qLCBPUEFEXyosIE9IV18qLCBhbmQgT0dQXyogY29uc3RhbnRzLgotCURlZmluZSBFbGYzMl9FeHRlcm5hbF9MaWIuCi0KLTE5OTgtMDctMTkgMTU6MjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFBUX01JUFNfT1BUSU9OUyk6IE5ldyBzeW1ib2wuCi0JQWRkIGxvdHMgb2YgRFRfTUlQU18qIHN5bWJvbHMuCi0KLUZyaSBKdW4gMjYgMTA6NDY6MzUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IE5ldyBmaWxlLgotCi1UaHUgSnVuIDE4IDE5OjI3OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV85NjAsIEVNX1Y4MDAsIEVNX0ZSMjAsIEVNX1JIMzIsIEVNX01NQSwKLQlFTV9PTERfQUxQSEEpOiBBZGQgdGhlc2UgY29uc3RhbnRzLgotCi1UaHUgSnVuIDExIDE3OjU5OjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV80ODYsIEVNX1MzNzApOiBBZGQgdGhlc2UgY29uc3RhbnRzLgotCi1UdWUgSnVuICA5IDA5OjM1OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9BUk0pOiBBZGQgdGhpcyBjb25zdGFudC4KLQotV2VkIE1heSAgNiAwOTo0NTozMCAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX01BQ0gsRV9NSVBTX01BQ0hfKik6IEFkZGVkLgotCi1TYXQgQXByIDI1IDE4OjM1OjA2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKFNUT19BTFBIQV9OT1BWLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk6IE5ldy4KLQotV2VkIEFwciAxNSAxNTo0Mjo0NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fU1BBUkM2NCk6IE1vdmUgYW5kIHJlbmFtZSB0byBFTV9PTERfU1BBUkNWOS4KLQkoRU1fU1BBUkNWOSk6IE5ldy4gIFRoaXMgaXMgdGhlIG9mZmljaWFsIEFCSSBuYW1lIGFuZCBudW1iZXIuCi0KLVNhdCBGZWIgMjggMTc6MDQ6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuaCAoRUZfQUxQSEFfMzJCSVQsIEVGX0FMUEhBX0NBTlJFTEFYKTogTmV3LgotCi1Nb24gRGVjIDE1IDE1OjA3OjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoRUZfTTMyUl9BUkNILCBFX00zMlJfQVJDSCk6IE5ldyBmbGFncyB0bwotCXNwZWNpZnkgbWFjaGluZSBhcmNoaXRlY3R1cmUuCi0KLUZyaSBEZWMgIDUgMTE6MjA6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBOZXcgY29uc3RhbnRzOiBTSE5fVjg1MF9TQ09NTU9OLCBTSE5fVjg1MF9UQ09NTU9OLAotCVNITl9WODUwX1pDT01NT04sIFNIVF9WODUwX1NDT01NT04sIFNIVF9WODUwX1RDT01NT04sCi0JU0hUX1Y4NTBfWkNPTU1PTiB0byBoYW5kbGUgdjg1MCBjb21tb24gc2VjdGlvbnMuCi0JZW51bSByZWxvY190eXBlIHJlbmFtZWQgdG8gdjg1MF9yZWxvY190eXBlIHRvIGF2b2lkIG5hbWUKLQljb25mbGljdC4KLQotVGh1IE9jdCAyMyAxMzo1NToyNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIGVsZl9zcGFyY19yZWxvY190eXBlKTogQWRkIFVBNjQgJiBVQTE2LgotCi1UaHUgT2N0IDIzIDAwOjQyOjA0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChEVF9TUEFSQ19SRUdJU1RFUik6IE5ldyBtYWNyby4KLQkoRFRfU1BBUkNfUExURk1UKTogSW4gc3VwcG9ydCBvZiBvbGQgc3BhcmM2NC1saW51eCAucGx0czsgd2lsbAotCWdvIGF3YXkgc29vbi4KLQotVHVlIFNlcCAzMCAxMzoyNjo1OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChFRl9TUEFSQ19IQUxfUjEsIEVGX1NQQVJDX0VYVF9NQVNLKTogTmV3IG1hY3Jvcy4KLQkoRUZfU1BBUkNWOV97TU0sVFNPLFBTTyxSTU99KTogTmV3IG1hY3Jvcy4KLQkoU0hOX0JFRk9SRSxTSE5fQUZURVIpOiBOZXcgbWFjcm9zLgotCShTSEZfRVhDTFVERSxTSEZfT1JERVJFRCk6IE5ldyBtYWNyb3MuCi0JKFNUVF9SRUdJU1RFUik6IE5ldyBtYWNyby4KLQkoUl9TUEFSQ19HTE9CX0pNUCk6IERlbGV0ZWQsIGJ1dCBzbG90IHJlc2VydmVkLgotCShSX1NQQVJDX3tESVNQNjQsUExUNjQsSElYMjIsTE9YMTB9KTogTmV3IHJlbG9jYXRpb25zLgotCShSX1NQQVJDX3tINDQsTTQ0LEw0NCxSRUdJU1RFUn0pOiBOZXcgcmVsb2NhdGlvbnMuCi0JKEVMRjY0X1JfVFlQRV97REFUQSxJRCxJTkZPfSk6IE5ldyBtYWNyb3MuCi0KLVdlZCBTZXAgMTcgMTY6NDE6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBBZGQgUl9WODUwX0NBTExUXzZfN19PRkZTRVQgYW5kIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQuCi0KLVR1ZSBTZXAgMTYgMTQ6MTY6MTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogQWRkIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULgotCi1XZWQgU2VwICAzIDE1OjExOjE0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0KLVdlZCBTZXAgIDMgMTE6MjU6NTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogUmVtb3ZlIFJfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAxNzo0MTowNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEUuCi0JKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEVBLgotCSogdjg1MC5oOiBBZGQgbmV3IGZsYWdzIGZvciBlX2ZsYWdzIGZpZWxkIGluIGVsZiBoZWFkZXIuCi0KLU1vbiBBdWcgMjUgMTY6MDY6NDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19WODUwRSk6IGJhY2tlbmQgbWFnaWMgbnVtYmVyIGZvciB2ODUwZS4KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfVjg1MEVBKTogYmFja2VuZCBtYWdpYyBudW1iZXIgZm9yIHY4NTBlYS4KLQotTW9uIEF1ZyAxOCAxMTowNToyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHJlbG9jX3R5cGUpOiBBZGQgMTYgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0KLUZyaSBBdWcgMTUgMDU6MTA6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmggKGVudW0gcmVsb2MpOiBNb3ZlIGhlcmUgZnJvbSBlbGYzMi1hcmMuYy4KLQotRnJpIEF1ZyAgOCAxNzowNToyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcmMuaDogTmV3IGZpbGUuCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0FSQyk6IERlZmluZS4KLQotTW9uIEp1biAxNiAxNDo0NjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9FaGRyKTogQ2hhbmdlIGVfcGhvZmYgYW5kIGVfc2hvZmYgZnJvbQotCWJmZF9zaWduZWRfdm1hIHRvIGJmZF9zaXplX3R5cGUsIGFzIHRoZXkgYXJlIG5vdCBzaWduZWQuCi0KLVdlZCBNYXIgIDUgMTU6MzU6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoU0hGX00zMlJfQ0FOX1JFTEFYKTogRGVmaW5lLgotCi1Nb24gRmViIDI0IDE3OjQ5OjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXh0ZXJuYWwuaDogRHVtcCB0aGUgMzIvNjQgYml0IHNwZWNpZmljIGZvcm1zIG9mIHRoZSB2ZXJzaW9uCi0Jc3RydWN0dXJlcywgYW5kIGp1c3QgZGVmaW5lIHRoZW0gYXMgc2l6ZSBpbmRlcGVuZGVudC4KLQotCSogY29tbW9uLmggKFZFUlNZTV9ISURERU4sIFZFUlNZTV9WRVJTSU9OKTogRGVmaW5lLgotCi1GcmkgRmViIDIxIDEzOjAwOjM0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoZW51bSByZWxvY190eXBlKTogQWRkIFJfTTMyUl9TREExNi4KLQkoU0hOX00zMlJfU0NPTU1PTik6IERlZmluZS4KLQotV2VkIEZlYiAxOSAxNTozNTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBjb21tb24uaDogQWRkZWQgbmV3IHN0cnVjdHVyZXMgYW5kCi0JZGVmaW5pdGlvbnMgZm9yIEVMRiB2ZXJzaW9ucy4KLQotVHVlIEZlYiAxOCAxNzo0MDozNiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19EMzBWKTogRGVmaW5lLgotCi1Nb24gSmFuIDI3IDExOjU0OjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX00zMlJfSEkxNl9bU1VdTE8sUl9NMzJSX0xPMTYuCi0KLUZyaSBKYW4gIDMgMTE6MzI6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfT1RIRVJfe1REQV9CWVRFLEVSUk9SfSk6IE5ldyBiaXRzIGZvciB0aGUgc3Rfb3RoZXIKLQlmaWVsZC4KLQkoU0hOX1Y4NTBfKik6IFJlbW92ZSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gaW5kZXhlcywgd2hpY2ggYXJlIG5vdAotCW5lZWRlZC4KLQkoZW51bSByZWxvY190eXBlKTogTW92ZSB0aGUgdjg1MCByZWxvY2F0aW9ucyBoZXJlIGZyb20KLQllbGYzMi12ODUwLmMKLQotVGh1IEphbiAgMiAxOTozMDoyMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGZpbGUsIHByb3ZpZGUgVjg1MCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotVHVlIERlYyAzMSAxNDo0NDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChEVF9BVVhJTElBUlkpOiBEZWZpbmUuCi0JKERUX0ZJTFRFUik6IERlZmluZS4KLQotV2VkIERlYyAgNCAwNTowMzozNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5oOiBVcGRhdGUuCi0KLVR1ZSBOb3YgMjYgMTA6NDQ6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNUT19NSVBTMTYpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTIgMTU6NDU6NDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogUmVtb3ZlIGVtcHR5IGZpbGUuCi0KLVR1ZSBPY3QgIDggMTE6MzE6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfQUJJMik6IERlZmluZS4KLQotVGh1IE9jdCAgMyAxMDowMTo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byBtbjEwMjAwIGFuZCBtbjEwMzAwLgotCi1XZWQgT2N0ICAyIDIxOjI2OjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKEVNX0NZR05VU19NTjEweDAwKTogRGVmaW5lLgotCi1Nb24gU2VwIDIzIDA5OjE4OjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmg6IE5ldyBmaWxlLgotCi1GcmkgQXVnIDMwIDE3OjA2OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1NIKTogRGVmaW5lLgotCi1UdWUgQXVnIDIwIDE0OjQ3OjU0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1Y4NTApOiBEZWZpbmUuCi0KLU1vbiBBdWcgMTkgMTA6NTk6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19NMzJSKTogRGVmaW5lLgotCi1Nb24gSnVsIDIyIDE4OjU5OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTSFRfTUlQU19JRkFDRSwgU0hUX01JUFNfQ09OVEVOVCk6IERlZmluZS4KLQkoU0hUX01JUFNfU1lNQk9MX0xJQik6IERlZmluZS4KLQkoU0hGX01JUFNfTUVSR0UsIFNIRl9NSVBTX0FERFIzMiwgU0hGX01JUFNfQUREUjY0KTogRGVmaW5lLgotCShTSEZfTUlQU19OT1NUUklQLCBTSEZfTUlQU19MT0NBTCwgU0hGX01JUFNfTkFNRVMpOiBEZWZpbmUuCi0KLVRodSBKdWwgMTggMTk6MTI6MTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaDogTmV3IGZpbGUuCi0KLUp1bCAxOCAxMzoyMDozOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19EMTBWKTogRGVmaW5lLgotCSogZDEwdi5oOiBOZXcgZmlsZS4KLQotRnJpIEp1biAyMSAxMjozMzoyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0JKiBjb21tb24uaCAoRU1fQUxQSEEpOiBEZWZpbmUuCi0KLUZyaSBNYXkgMzEgMTc6Mjg6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVsZl9FeHRlcm5hbF9PcHRpb25zLCBFbGZfSW50ZXJuYWxfT3B0aW9ucyk6IERlZmluZS4KLQkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbik6IERlY2xhcmUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0KTogRGVjbGFyZS4KLQkoT0RLXyopOiBEZWZpbmUuCi0JKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8sIEVsZjY0X0ludGVybmFsX1JlZ0luZm8pOiBEZWZpbmUuCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbik6IERlY2xhcmUuCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiBEZWNsYXJlLgotCi1UaHUgTWF5IDMwIDEyOjM1OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfQVJDSF80KTogRGVmaW5lLgotCi1XZWQgTWF5IDI5IDE1OjM1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCk6IERlZmluZS4KLQkoRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwpOiBEZWZpbmUuCi0JKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSwgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhKTogRGVmaW5lLgotCShSU1NfKik6IERlZmluZS4KLQotTW9uIEFwciAyMiAxODoyNjozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX1s1Nl0pOiBBbHdheXMgZGVmaW5lLgotCi1Nb24gRmViIDE5IDAxOjU1OjU2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX3tQTFQzMixISVBMVDIyLExPUExUMTAsUENQTFQzMixQQ1BMVDIyLAotCVBDUExUMTAsNSw2fSk6IERvbid0IGRlZmluZSBpZmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MuCi0KLVR1ZSBGZWIgIDYgMTE6MzM6NTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKGVudW0gc3BhcmNfZWxmX3JlbG9jX3R5cGUpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMTcgMDk6MDk6MTYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IERlZmluZSBFTV9TUEFSQzMyUExVUy4KLQkqIHNwYXJjLmg6IE5ldyBmaWxlLgotCi1UaHUgSmFuIDExIDE2OjI3OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKFNIRl9FWENMVURFLCBTSFRfT1JERVJFRCk6IE5ldyBmaWVsZHMgZnJvbSB0aGUgYWJpLgotCi1UaHUgTm92IDMwIDE2OjQ3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IGVsZl9zZWdtZW50X21hcCk6IEFkZCBpbmNsdWRlc19maWxlaGRyIGFuZAotCWluY2x1ZGVzX3BoZHJzIGZpZWxkcy4KLQotVHVlIE5vdiAyOCAxNjo1ODoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMzEgMTU6MTk6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBocHBhLmgsIGludGVybmFsLmgsCi0JbWlwcy5oLCBwcGMuaDogIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCi1UaHUgU2VwIDIxIDEzOjUxOjU4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpOiBBZGQgbmV3IGZsYWcgYml0LgotCi1GcmkgU2VwICAxIDE1OjMyOjE3IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBtaXBzLmg6IEFkZCBzb21lIGRlZmluaXRpb25zIHVzZWQgb24gSXJpeCA1LgotCi1UdWUgSnVuIDIwIDEwOjE4OjI4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKENQVV9QQV9SSVNDMV8wKTogUHJvdGVjdCBmcm9tIHJlZGVmaW5pdGlvbnMuCi0JKENQVV9QQV9SSVNDMV8xKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgIDggMTg6MTQ6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMuaDogTmV3IGZpbGUgZm9yIFBvd2VyUEMgc3VwcG9ydC4KLQotVHVlIEZlYiAxNCAxMzo1OToxMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9QUEMpOiBVc2Ugb2ZmaWNhbCB2YWx1ZSBvZiAyMCwgbm90IDE3LgotCShFTV9QUENfT0xEKTogRGVmaW5lIHRoaXMgdG8gYmUgdGhlIG9sZCB2YWx1ZSBvZiBFTV9QUEMuCi0KLVR1ZSBKYW4gMjQgMDk6NDA6NTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDKTogTmV3IG1hY3JvLCBQb3dlclBDIG1hY2hpbmUgaWQuCi0KLVR1ZSBKYW4gMTcgMTA6NTE6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNIVF9NSVBTX01TWU0sIFNIVF9NSVBTX0RXQVJGLCBTSFRfTUlQU19FVkVOVFMpOiBEZWZpbmUuCi0KLU1vbiBPY3QgMTcgMTM6NDM6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfU2hkcik6IFJlbW92ZSByYXdkYXRhIGFuZCBzaXplIGZpZWxkcy4KLQlBZGQgYmZkX3NlY3Rpb24gZmllbGQuCi0KLVR1ZSBNYXkgMjQgMTY6MTE6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEVsZjMyX0V4dGVybmFsX2dwdGFiKTogRGVmaW5lLgotCi1Nb24gTWF5IDE2IDEzOjIyOjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb21tb24uaCAoRU1fSFBQQSk6IERlbGV0ZS4KLQkoRU1fUEFSSVNDKTogQWRkLgotCSogaHBwYS5oOiBOZXcgZmlsZS4KLQotTW9uIE1heSAgOSAxMzoyNzowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChTSE5fTE9SRVNFUlZFKTogUmVuYW1lIGZyb20gU0hOX0xPUkVTRVJWLgotCShFTEYzMl9SX1RZUEUsIEVMRjMyX1JfSU5GTyk6IERvbid0IHJlbHkgb24gc2l6ZSBvZiB1bnNpZ25lZCBjaGFyLgotCShFTEY2NF9SX1RZUEUpOiBEb24ndCByZWx5IG9uIHNpemUgb2YgdW5zaWduZWQgbG9uZy4KLQotTW9uIEFwciAyNSAxNTo1MzowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9TaGRyKTogVXNlIFBUUiwgbm90IHZvaWQgKi4KLQotRnJpIE1hciAxMSAwMDozNDo1OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG1pcHMuaCAoU0hOX01JUFNfVEVYVCwgU0hOX01JUFNfREFUQSk6ICBEZWZpbmUuCi0KLVNhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpbnRlcm5hbC5oOiAgUmVtb3ZlIEVsZjMyXyosIEVsZjY0XyogdHlwZWRlZnMuICBUaGVzZSBuYW1lcwotCWNhdXNlIGNvbmZsaWN0cyB3aXRoIHN5c3RlbSBoZWFkZXJzLCBlLmcuIGxpbmsuaCBpbiBnZGIvc29saWIuYy4KLQlDb21iaW5lIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mICpfSW50ZXJuYWxfRHluLgotCSogY29tbW9uLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmNjRfV29yZCwgRWxmNjRfWHdvcmQgdHlwZWRlZnMKLQlieSB0aGVpciBleHBhbnNpb24uCi0JKiBtaXBzLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmMzJfV29yZCwgRWxmMzJfU3dvcmQsIEVsZjMyX0FkZHIKLQl0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24uIEFkZCBEVF9NSVBTX1JMRF9NQVAgZGVmaW5pdGlvbi4KLQotRnJpIEZlYiAxOCAxMDozOTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfUE9XRVJQQyk6IERlZmluZS4gIFRoaXMgbWF5IGJlIHRlbXBvcmFyeSwKLQlkZXBlbmRpbmcgdXBvbiBob3cgcXVpY2tseSBJIGNhbiBmaW5kIGEgcmVhbCBQb3dlclBDIEFCSS4KLQotTW9uIEZlYiAgNyAwODoyNzoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQotV2VkIEZlYiAgMiAxNDoxMjoxOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmg6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgdmFsdWUgb2YgRU1fSFBQQSBhbmQgaG93IHRvCi0JcGljayBhbiB1bm9mZmljaWFsIHZhbHVlLgotCi1XZWQgTm92IDE3IDE3OjE0OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChTSFRfTUlQU19PUFRJT05TKTogRGVmaW5lLgotCi1Nb24gTm92ICA4IDE3OjU3OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBBZGRlZCBzb21lIG1vcmUgTUlQUyBBQkkgbWFjcm8gZGVmaW5pdGlvbnMuCi0KLVdlZCBOb3YgIDMgMjI6MDc6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fTUlQU19SUzRfQkUpOiBOZXcgbWFjcm8uCi0KLVR1ZSBPY3QgMTIgMDc6Mjg6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IE5ldyBmaWxlLiAgTUlQUyBBQkkgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLU1vbiBKdW4gMjEgMTM6MTM6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENvbWJpbmVkIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mIGFsbCBzdHJ1Y3R1cmVzCi0JZXhjZXB0ICpfSW50ZXJuYWxfRHluLiAgVGhpcyB3aWxsIHNpbXBseSB0aGUgYXNzZW1ibGVyIGludGVyZmFjZSwKLQlhbmQgc29tZSBiZmQgY29kZS4KLQotVHVlIE1heSAyNSAwMjowMDoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGV4dGVybmFsLmgsIGludGVybmFsLmgsIGNvbW1vbi5oOiBBZGRlZCA2NC1iaXQgdmVyc2lvbnMgb2Ygc29tZQotCXN0cnVjdHVyZXMgYW5kIG1hY3Jvcy4gIFJlbmFtZWQgb2xkIHZlcnNpb25zIHRvIHB1dCAiMzIiIGluIHRoZQotCW5hbWUuICBTb21lIGFyZSB1bmNoYW5nZWQuCi0KLVRodSBBcHIgMjkgMTI6MTI6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9IUFBBLCBOVF9WRVJTSU9OLCBTVE5fVU5ERUYsIERUXyopOiBOZXcgbWFjcm9zLgotCSogZXh0ZXJuYWwuaCAoRWxmX0V4dGVybmFsX0R5bik6IE5ldyB0eXBlLgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZW5yYWxfU2hkcik6IE5ldyBmaWVsZCBgc2l6ZScuCi0JKEVsZl9JbnRlcm5hbF9EeW4pOiBOZXcgdHlwZS4KLQotVHVlIEFwciAyMCAxNjowMzo0NSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBDaGFuZ2UgdmFsdWUgdG8gb25lIHJhbmRvbWx5IHBpY2tlZCBpbgotCXRoZSB1c2VyIGRlZmluZWQgcmFuZ2UsIHRvIHJlZHVjZSBwcm9iYWJpbGl0eSBvZiBjb2xsaXNpb25zLgotCi1TdW4gTm92IDE1IDA5OjM0OjAyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkd2FyZi5oIChBVF9zcmNfY29vcmRzKTogIFdoaXRlc3BhY2UgY2hhbmdlIG9ubHkuCi0JKiBkd2FyZi5oIChBVF9ib2R5X2JlZ2luLCBBVF9ib2R5X2VuZCwgTEFOR19NT0RVTEEyKToKLQlBZGQgZnJvbSBsYXRlc3QgZ2NjLgotCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBBZGQgYXMgR05VIGV4dGVuc2lvbi4KLQotU2F0IEF1ZyAgMSAxMzo0Njo1MyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogIFJlcGxhY2Ugd2l0aCBjdXJyZW50IHZlcnNpb24gZnJvbSBnY2MgZGlzdHJpYnV0aW9uLgotCi1GcmkgSnVuIDE5IDE5OjA1OjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiAgQWRkIHJlYWwgc3RydWN0IHRhZ3MgdG8gYWxsIHRoZSBUeXBlX0RlZnMsIHNvIHRoZXkKLQljYW4gYmUgdXNlZCBpbiBwcm90b3R5cGVzIHdoZXJlIHRoZSBUeXBlX0RlZnMgYXJlIG5vdCBrbm93bi4KLQotRnJpIEFwciAgMyAyMDo1ODo1OCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb21tb24uaDogYWRkZWQgRUxGX1Jfe1NZTSxUWVBFLElORk99IGZvciBoYW5kbGluZyByZWxvY2F0aW9uCi0JaW5mbwotCWFkZGVkIEVNX01JUFMsIGFuZCBjb3JyZWN0ZWQgdmFsdWUgb2YgRU1fODYwIGJhc2VkIG9uIFN5c3RlbSBWIEFCSQotCW1hbnVhbC4KLQotCSogZXh0ZXJuYWwuaDogYWRkZWQgRWxmX0V4dGVybmFsX3tSZWwsUmVsYX0uCi0KLQkqIGludGVybmFsLmg6IGFkZGVkIEVsZl9JbnRlcm5hbF97UmVsLFJlbGF9LgotCWFkZGVkIHJhd2RhdGEgdG8gRWxmX0ludGVybmFsX1NoZHIuCi0KLVNhdCBOb3YgMzAgMjA6NDM6NTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBDaGFuZ2VMb2c7IG1vdmVkIGZyb20KLQkuLi9lbGYtPGZvbz4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYWxwaGEuaCBiL2luY2x1ZGUvZWxmL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTlkNWUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiBBTFBIQSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBFcmljIFlvdW5nZGFsZSwgPGVyaWNAYWliLmNvbT4uICBObyBwcm9jZXNzb3Igc3VwcGxlbWVudCBhdmFpbGFibGUKLSAgIGZvciB0aGlzIHBsYXRmb3JtLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgQUxQSEEgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfQUxQSEFfSAotI2RlZmluZSBfRUxGX0FMUEhBX0gKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogQWxsIGFkZHJlc3NlcyBtdXN0IGJlIGJlbG93IDJHQi4gICovCi0jZGVmaW5lIEVGX0FMUEhBXzMyQklUCQkweDAwMDAwMDAxCi0KLS8qIEFsbCByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIHJlbGF4YXRpb24gd2l0aCBjb2RlIG1vdmVtZW50IGFyZSBwcmVzZW50LiAgKi8KLSNkZWZpbmUgRUZfQUxQSEFfQ0FOUkVMQVgJMHgwMDAwMDAwMgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSBnbG9iYWwgZGF0YSBhcmVhLiAgKi8KLSNkZWZpbmUgU0hGX0FMUEhBX0dQUkVMCQkweDEwMDAwMDAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgc29tZSBzb3J0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZSBleGFjdAotICAgZm9ybWF0IGlzIHVuc3BlY2lmaWVkLiAgSXQncyBwcm9iYWJseSBFQ09GRiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hUX0FMUEhBX0RFQlVHCQkweDcwMDAwMDAxCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgcmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBTSFRfQUxQSEFfUkVHSU5GTwkweDcwMDAwMDAyCi0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8gY29udGFpbnMgdGhlIGZvbGxvd2luZwotICAgc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICBsb25nIHJpX2dwX3ZhbHVlOwotfSBFbGY2NF9SZWdJbmZvOwotCi0vKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHN0X290aGVyIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi0jZGVmaW5lIFNUT19BTFBIQV9OT1BWCQkweDgwCi0jZGVmaW5lIFNUT19BTFBIQV9TVERfR1BMT0FECTB4ODgKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogQWxwaGEgcmVsb2NzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hbHBoYV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTk9ORSwgMCkJLyogTm8gcmVsb2MgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFRkxPTkcsIDEpCS8qIERpcmVjdCAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFRlFVQUQsIDIpCS8qIERpcmVjdCA2NCBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMMzIsIDMpCS8qIEdQIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTElURVJBTCwgNCkJLyogR1AgcmVsYXRpdmUgMTYgYml0IHcvb3B0aW1pemF0aW9uICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9MSVRVU0UsIDUpCS8qIE9wdGltaXphdGlvbiBoaW50IGZvciBMSVRFUkFMICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUERJU1AsIDYpCS8qIEFkZCBkaXNwbGFjZW1lbnQgdG8gR1AgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0JSQUREUiwgNykJLyogUEMrNCByZWxhdGl2ZSAyMyBiaXQgc2hpZnRlZCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSElOVCwgOCkJLyogUEMrNCByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDE2LCA5KQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUwzMiwgMTApCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDY0LCAxMSkJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCi0KLS8qIEluaGVyaXRlZCB0aGVzZSBmcm9tIEVDT0ZGLCBidXQgdGhleSBhcmUgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwKLSAgIGFuZCBhcmUgZGVwcmVjaWF0ZWQuICBBbmQgbm90IGltcGxlbWVudGVkIGluIHRoZSBCRkQsIGJ0dy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QVVNILCAxMikJLyogT1Agc3RhY2sgcHVzaCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfU1RPUkUsIDEzKQkvKiBPUCBzdGFjayBwb3AgYW5kIHN0b3JlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QU1VCLCAxNCkJLyogT1Agc3RhY2sgc3VidHJhY3QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1BSU0hJRlQsIDE1KQkvKiBPUCBzdGFjayByaWdodCBzaGlmdCAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFZBTFVFLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMSElHSCwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTExPVywgMTgpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9HUF8xNiwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9HUF9ISTMyLCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX1NDTl9ISTMyLCAyMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0JSX0hJMzIsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfTE8zMiwgMjMpCi0KLS8qIFRoZXNlIHJlbG9jYXRpb25zIGFyZSBzcGVjaWZpYyB0byBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0NPUFksIDI0KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HTE9CX0RBVCwgMjUpCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0pNUF9TTE9ULCAyNikJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfUkVMQVRJVkUsIDI3KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0KLSAgRU1QVFlfUkVMT0MgIChSX0FMUEhBX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0FMUEhBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FyYy5oIGIvaW5jbHVkZS9lbGYvYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNGI1NWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBBUkMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMsIChkamVAY3lnbnVzLmNvbSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEFSQyBFTEYgQUJJLiAgKi8KLQotI2lmbmRlZiBfRUxGX0FSQ19ICi0jZGVmaW5lIF9FTEZfQVJDX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FyY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9BUkNfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUkNfQjI2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX0IyMl9QQ1JFTCwgMykKLSAgRU1QVFlfUkVMT0MgIChSX0FSQ19tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBGb3VyIGJpdCBBUkMgbWFjaGluZSB0eXBlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfQVJDX01BQ0gJCTB4MDAwMDAwMGYKLQotLyogVmFyaW91cyBDUFUgdHlwZXMuICAqLwotI2RlZmluZSBFX0FSQ19NQUNIX0JBU0UJCTB4MDAwMDAwMDAKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQxCTB4MDAwMDAwMDEKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQyCTB4MDAwMDAwMDIKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQ0CTB4MDAwMDAwMDMKLQotLyogTGVhdmUgYml0cyAweGYwIGFsb25lIGluIGNhc2Ugd2UgZXZlciBoYXZlIG1vcmUgdGhhbiAxNiBjcHUgdHlwZXMuCi0gICBIaWdobHkgdW5saWtlbHksIGJ1dCB3aGF0IHRoZSBoZWNrLiAgKi8KLQotLyogRmlsZSBjb250YWlucyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfQVJDX1BJQwkJMHgwMDAwMDEwMAotCi0jZW5kaWYgLyogX0VMRl9BUkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJtLW9hYmkuaCBiL2luY2x1ZGUvZWxmL2FybS1vYWJpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDk4NDIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJtLW9hYmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qIEFSTSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUk1fSAotI2RlZmluZSBfRUxGX0FSTV9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSTV9SRUxFWEVDICAgICAweDAxCi0jZGVmaW5lIEVGX0FSTV9IQVNFTlRSWSAgICAweDAyCi0jZGVmaW5lIEVGX0lOVEVSV09SSyAgICAgICAweDA0Ci0jZGVmaW5lIEVGX0FQQ1NfMjYgICAgICAgICAweDA4Ci0jZGVmaW5lIEVGX0FQQ1NfRkxPQVQgICAgICAweDEwCi0jZGVmaW5lIEVGX1BJQyAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEVGX0FMSUdOOAkgICAweDQwCQkvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLQotLyogTG9jYWwgYWxpYXNlcyBmb3Igc29tZSBmbGFncyB0byBtYXRjaCBuYW1lcyB1c2VkIGJ5IENPRkYgcG9ydC4gICovCi0jZGVmaW5lIEZfSU5URVJXT1JLCSAgIEVGX0lOVEVSV09SSwotI2RlZmluZSBGX0FQQ1MyNgkgICBFRl9BUENTXzI2Ci0jZGVmaW5lIEZfQVBDU19GTE9BVAkgICBFRl9BUENTX0ZMT0FUCi0jZGVmaW5lIEZfUElDICAgICAgICAgICAgICBFRl9QSUMKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgIDB4ZAotCi0vKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLwotI2RlZmluZSBTSEZfRU5UUllTRUNUICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KLSNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcCAqLwotCi0vKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KLSNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICovCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FybV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX05PTkUsICAgICAgICAgMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzI0LCAgICAgICAgIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTDMyLCAgICAgICAgMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlM4LCAgICAgICAgIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTYsICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fQUJTNSwgICAgIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMjIsICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgOSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BTVBfVkNBTEw5LCAgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMTEsICAgIDExKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM5LCAgICAgMTIpICAgICAgIC8qIGN5Z251cyBleHRlbnNpb24gdG8gYWJpOiB0aHVtYiBjb25kaXRpb25hbCBicmFuY2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRFTlRSWSwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBjb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR0xPQl9EQVQsICAgIDIxKSAgICAgICAvKiBjcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgIDIyKSAgICAgICAvKiBjcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBhZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UT0ZGLCAgICAgIDI0KSAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAyNSkgICAgICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QTFQzMiwgICAgICAgMjcpICAgICAgIC8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MsIDI4KQotICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQywgIDI0OSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SU0JSRUwzMiwgICAyNTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1JQQzIyLCAgMjUxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JSRUwzMiwgICAgIDI1MikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQUJTMzIsICAgICAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlBDMjQsICAgICAgMjU0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JCQVNFLCAgICAgIDI1NSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJtLmggYi9pbmNsdWRlL2VsZi9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5NGIxMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qIEFSTSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUk1fSAotI2RlZmluZSBfRUxGX0FSTV9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSTV9SRUxFWEVDICAgICAweDAxCi0jZGVmaW5lIEVGX0FSTV9IQVNFTlRSWSAgICAweDAyCi0jZGVmaW5lIEVGX0lOVEVSV09SSyAgICAgICAweDA0Ci0jZGVmaW5lIEVGX0FQQ1NfMjYgICAgICAgICAweDA4Ci0jZGVmaW5lIEVGX0FQQ1NfRkxPQVQgICAgICAweDEwCi0jZGVmaW5lIEVGX1BJQyAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEVGX0FMSUdOOAkgICAweDQwCQkvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLQotLyogTG9jYWwgYWxpYXNlcyBmb3Igc29tZSBmbGFncyB0byBtYXRjaCBuYW1lcyB1c2VkIGJ5IENPRkYgcG9ydC4gICovCi0jZGVmaW5lIEZfSU5URVJXT1JLCSAgIEVGX0lOVEVSV09SSwotI2RlZmluZSBGX0FQQ1MyNgkgICBFRl9BUENTXzI2Ci0jZGVmaW5lIEZfQVBDU19GTE9BVAkgICBFRl9BUENTX0ZMT0FUCi0jZGVmaW5lIEZfUElDICAgICAgICAgICAgICBFRl9QSUMKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgIDB4ZAotCi0vKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLwotI2RlZmluZSBTSEZfRU5UUllTRUNUICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KLSNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcCAqLwotCi0vKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KLSNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICovCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FybV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX05PTkUsICAgICAgICAgMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzI0LCAgICAgICAgIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTDMyLCAgICAgICAgMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzEzLCAgICAgICAgIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTYsICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fQUJTNSwgICAgIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTOCwgICAgICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgOSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMyMiwgICAgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOCwgICAgIDExKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FNUF9WQ0FMTDksICAxMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9TV0kyNCwgICAgICAgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1NXSTgsICAgIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1hQQzI1LCAgICAgICAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fWFBDMjIsICAgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBjb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR0xPQl9EQVQsICAgIDIxKSAgICAgICAvKiBjcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgIDIyKSAgICAgICAvKiBjcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBhZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UT0ZGLCAgICAgIDI0KSAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAyNSkgICAgICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QTFQzMiwgICAgICAgMjcpICAgICAgIC8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MxLCAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MxLCAgOTkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZURU5UUlksIDEwMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMTEsICAgIDEwMikgICAgICAgLyogY3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IHRodW1iIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgIDEwMykgICAgICAgLyogY3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IHRodW1iIGNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MyLCAxMDQpCi0gIEZBS0VfUkVMT0MgICAoTEFTVF9JTlZBTElEX1JFTE9DMiwgIDI0OCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SWFBDMjUsICAgICAyNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlNCUkVMMzIsICAgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9SUEMyMiwgIDI1MSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SUkVMMzIsICAgICAyNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkFCUzMyLCAgICAgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JQQzI0LCAgICAgIDI1NCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQkFTRSwgICAgICAyNTUpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2NvbW1vbi5oIGIvaW5jbHVkZS9lbGYvY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNWRmNDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyogRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCwxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBFTEYgc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGFyZSBjb21tb24gdG8gYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4KLSAgIEZvciBleGFtcGxlLCBFTEZNQUcwIGlzIHRoZSBieXRlIDB4N0YgaW4gYm90aCB0aGUgaW50ZXJuYWwgKGluLW1lbW9yeSkKLSAgIGFuZCBleHRlcm5hbCAoaW4tZmlsZSkgcmVwcmVzZW50YXRpb25zLiAqLwotCi0jaWZuZGVmIF9FTEZfQ09NTU9OX0gKLSNkZWZpbmUgX0VMRl9DT01NT05fSAotCi0vKiBGaWVsZHMgaW4gZV9pZGVudFtdICovCi0KLSNkZWZpbmUgRUlfTUFHMAkJMAkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMCBpbmRleCAqLwotI2RlZmluZSBFTEZNQUcwCQkweDdGCS8qIE1hZ2ljIG51bWJlciBieXRlIDAgKi8KLQotI2RlZmluZSBFSV9NQUcxCQkxCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAxIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzEJCSdFJwkvKiBNYWdpYyBudW1iZXIgYnl0ZSAxICovCi0KLSNkZWZpbmUgRUlfTUFHMgkJMgkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMiBpbmRleCAqLwotI2RlZmluZSBFTEZNQUcyCQknTCcJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMiAqLwotCi0jZGVmaW5lIEVJX01BRzMJCTMJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDMgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMwkJJ0YnCS8qIE1hZ2ljIG51bWJlciBieXRlIDMgKi8KLQotI2RlZmluZSBFSV9DTEFTUwk0CS8qIEZpbGUgY2xhc3MgKi8KLSNkZWZpbmUgRUxGQ0xBU1NOT05FCTAJLyogSW52YWxpZCBjbGFzcyAqLwotI2RlZmluZSBFTEZDTEFTUzMyCTEJLyogMzItYml0IG9iamVjdHMgKi8KLSNkZWZpbmUgRUxGQ0xBU1M2NAkyCS8qIDY0LWJpdCBvYmplY3RzICovCi0KLSNkZWZpbmUgRUlfREFUQQkJNQkvKiBEYXRhIGVuY29kaW5nICovCi0jZGVmaW5lIEVMRkRBVEFOT05FCTAJLyogSW52YWxpZCBkYXRhIGVuY29kaW5nICovCi0jZGVmaW5lIEVMRkRBVEEyTFNCCTEJLyogMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4gKi8KLSNkZWZpbmUgRUxGREFUQTJNU0IJMgkvKiAyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiAqLwotCi0jZGVmaW5lIEVJX1ZFUlNJT04JNgkvKiBGaWxlIHZlcnNpb24gKi8KLQotI2RlZmluZSBFSV9PU0FCSSAgICAgICAgNyAgICAgICAvKiBPcGVyYXRpbmcgU3lzdGVtL0FCSSBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEVMRk9TQUJJX1NZU1YgICAwICAgICAgIC8qIFVOSVggU3lzdGVtIFYgQUJJICovCi0jZGVmaW5lIEVMRk9TQUJJX0hQVVggICAxICAgICAgIC8qIEhQLVVYIG9wZXJhdGluZyBzeXN0ZW0gKi8KLSNkZWZpbmUgRUxGT1NBQklfU1RBTkRBTE9ORSAyNTUgLyogU3RhbmRhbG9uZSAoZW1iZWRkZWQpIGFwcGxpY2F0aW9uICovCi0jZGVmaW5lIEVMRk9TQUJJX0FSTSAgIDk3CQkvKiBBUk0gKi8KLQotI2RlZmluZSBFSV9BQklWRVJTSU9OICAgOCAgICAgICAvKiBBQkkgdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVJX1BBRAkJOQkvKiBTdGFydCBvZiBwYWRkaW5nIGJ5dGVzICovCi0KLQotLyogVmFsdWVzIGZvciBlX3R5cGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIG9iamVjdCBmaWxlIHR5cGUgKi8KLQotI2RlZmluZSBFVF9OT05FCQkwCS8qIE5vIGZpbGUgdHlwZSAqLwotI2RlZmluZSBFVF9SRUwJCTEJLyogUmVsb2NhdGFibGUgZmlsZSAqLwotI2RlZmluZSBFVF9FWEVDCQkyCS8qIEV4ZWN1dGFibGUgZmlsZSAqLwotI2RlZmluZSBFVF9EWU4JCTMJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCi0jZGVmaW5lIEVUX0NPUkUJCTQJLyogQ29yZSBmaWxlICovCi0jZGVmaW5lIEVUX0xPT1MgICAgICAgICAweEZFMDAJLyogT3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyAqLwotI2RlZmluZSBFVF9ISU9TICAgICAgICAgMHhGRUZGICAvKiBPcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0xPUFJPQwkweEZGMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0hJUFJPQwkweEZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0KLS8qIFZhbHVlcyBmb3IgZV9tYWNoaW5lLCB3aGljaCBpZGVudGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgKi8KLQotI2RlZmluZSBFTV9OT05FCQkwCS8qIE5vIG1hY2hpbmUgKi8KLSNkZWZpbmUgRU1fTTMyCQkxCS8qIEFUJlQgV0UgMzIxMDAgKi8KLSNkZWZpbmUgRU1fU1BBUkMJMgkvKiBTVU4gU1BBUkMgKi8KLSNkZWZpbmUgRU1fMzg2CQkzCS8qIEludGVsIDgwMzg2ICovCi0jZGVmaW5lIEVNXzY4SwkJNAkvKiBNb3Rvcm9sYSBtNjhrIGZhbWlseSAqLwotI2RlZmluZSBFTV84OEsJCTUJLyogTW90b3JvbGEgbTg4ayBmYW1pbHkgKi8KLSNkZWZpbmUgRU1fNDg2CQk2CS8qIEludGVsIDgwNDg2ICovCi0jZGVmaW5lIEVNXzg2MAkJNwkvKiBJbnRlbCA4MDg2MCAqLwotI2RlZmluZSBFTV9NSVBTCQk4CS8qIE1JUFMgUjMwMDAgKG9mZmljaWFsbHksIGJpZy1lbmRpYW4gb25seSkgKi8KLSNkZWZpbmUgRU1fUzM3MAkJOQkvKiBBbWRhaGwgKi8KLSNkZWZpbmUgRU1fTUlQU19SUzRfQkUgMTAJLyogTUlQUyBSNDAwMCBiaWctZW5kaWFuICovCi0KLSNkZWZpbmUgRU1fUEFSSVNDICAgICAgMTUJLyogSFBQQSAqLwotI2RlZmluZSBFTV9WUFA1NTAgICAgICAxNyAgICAgICAvKiBGdWppdHN1IFZQUDUwMCAqLwotI2RlZmluZSBFTV9TUEFSQzMyUExVUyAxOAkvKiBTdW4ncyAidjhwbHVzIiAqLwotI2RlZmluZSBFTV85NjAgICAgICAgICAxOSAgICAgICAvKiBJbnRlbCA4MDk2MCAqLwotI2RlZmluZSBFTV9QUEMJICAgICAgIDIwCS8qIFBvd2VyUEMgKi8KLSNkZWZpbmUgRU1fUFBDNjQgICAgICAgMjEJLyogNjQtYml0IFBvd2VyUEMgKi8KLQotI2RlZmluZSBFTV9WODAwICAgICAgICAzNgkvKiBORUMgVjgwMCBzZXJpZXMgKi8KLSNkZWZpbmUgRU1fRlIyMAkgICAgICAgMzcJLyogRnVqaXRzdSBGUjIwICovCi0jZGVmaW5lIEVNX1JIMzIJICAgICAgIDM4ICAgICAgIC8qIFRSVyBSSDMyICovCi0jZGVmaW5lIEVNX01DT1JFICAgICAgIDM5ICAgICAgIC8qIE1vdG9yb2xsYSBNQ29yZSAqLyAvKiBNYXkgYWxzbyBiZSB0YWtlbiBieSBGdWppdHN1IE1NQSAqLwotI2RlZmluZSBFTV9BUk0JICAgICAgIDQwCS8qIEFSTSAqLwotI2RlZmluZSBFTV9PTERfQUxQSEEgICA0MQkvKiBEaWdpdGFsIEFscGhhICovCi0jZGVmaW5lIEVNX1NICSAgICAgICA0MgkvKiBIaXRhY2hpIFNIICovCi0jZGVmaW5lIEVNX1NQQVJDVjkgICAgIDQzCS8qIFNQQVJDIHY5IDY0LWJpdCAqLwotI2RlZmluZSBFTV9UUklDT1JFICAgICA0NCAgICAgICAvKiBTaWVtZW5zIFRyaWNvcmUgZW1iZWRkZWQgcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX0FSQyAgICAgICAgIDQ1ICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSwgQXJnb25hdXQgVGVjaG5vbG9naWVzIEluYy4gKi8KLSNkZWZpbmUgRU1fSDhfMzAwICAgICAgNDYgICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KLSNkZWZpbmUgRU1fSDhfMzAwSCAgICAgNDcgICAgICAgLyogSGl0YWNoaSBIOC8zMDBIICovCi0jZGVmaW5lIEVNX0g4UyAgICAgICAgIDQ4ICAgICAgIC8qIEhpdGFjaGkgSDhTICovCi0jZGVmaW5lIEVNX0g4XzUwMCAgICAgIDQ5ICAgICAgIC8qIEhpdGFjaGkgSDgvNTAwICovCi0jZGVmaW5lIEVNX0lBXzY0ICAgICAgIDUwICAgICAgIC8qIEludGVsIE1lcmNlZFRNIFByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9NSVBTX1ggICAgICA1MSAgICAgICAvKiBTdGFuZm9yZCBNSVBTLVggKi8KLSNkZWZpbmUgRU1fQ09MREZJUkUgICAgNTIgICAgICAgLyogTW90b3JvbGEgQ29sZGZpcmUgKi8KLSNkZWZpbmUgRU1fNjhIQzEyICAgICAgNTMgICAgICAgLyogTW90b3JvbGEgTTY4SEMxMiAqLwotCi0vKiBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gYXNzaWduIG5ldyB1bm9mZmljaWFsIEVNXyogdmFsdWVzLCBwbGVhc2UgcGljayBsYXJnZQotICAgcmFuZG9tIG51bWJlcnMgKDB4ODUyMywgMHhhN2YyLCBldGMuKSB0byBtaW5pbWl6ZSB0aGUgY2hhbmNlcyBvZiBjb2xsaXNpb24KLSAgIHdpdGggb2ZmaWNpYWwgb3Igbm9uLUdOVSB1bm9mZmljaWFsIHZhbHVlcy4KLQotICAgTk9URTogRG8gbm90IGp1c3QgaW5jcmVtZW50IHRoZSBtb3N0IHJlY2VudCBudW1iZXIgYnkgb25lLgotICAgU29tZWJvZHkgZWxzZSBzb21ld2hlcmUgd2lsbCBkbyBleGFjdGx5IHRoZSBzYW1lIHRoaW5nLCBhbmQgeW91Ci0gICB3aWxsIGhhdmUgYSBjb2xsaXNpb24uICBJbnN0ZWFkLCBwaWNrIGEgcmFuZG9tIG51bWJlci4gICovCi0KLS8qIEN5Z251cyBQb3dlclBDIEVMRiBiYWNrZW5kLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfUE9XRVJQQyAweDkwMjUKLQotLyogT2xkIHZlcnNpb24gb2YgU3BhcmMgdjksIGZyb20gYmVmb3JlIHRoZSBBQkk7IHRoaXMgc2hvdWxkIGJlCi0gICByZW1vdmVkIHNob3J0bHkuICAqLwotI2RlZmluZSBFTV9PTERfU1BBUkNWOQkxMQotCi0vKiBPbGQgdmVyc2lvbiBvZiBQb3dlclBDLCB0aGlzIHNob3VsZCBiZSByZW1vdmVkIHNob3J0bHkuICovCi0jZGVmaW5lIEVNX1BQQ19PTEQJMTcKLQotLyogQ3lnbnVzIEFSQyBFTEYgYmFja2VuZC4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0FSQyAweDkwNDAKLQotLyogQ3lnbnVzIE0zMlIgRUxGIGJhY2tlbmQuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19NMzJSIDB4OTA0MQotCi0vKiBBbHBoYSBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQUxQSEEJMHg5MDI2Ci0KLS8qIEQxMFYgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19EMTBWCTB4NzY1MAotCi0vKiBEMzBWIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfRDMwVgkweDc2NzYKLQotLyogVjg1MCBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2Vuc2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX1Y4NTAJMHg5MDgwCi0KLS8qIG1uMTAyMDAgYW5kIG1uMTAzMDAgYmFja2VuZCBtYWdpYyBudW1iZXJzLgotICAgV3JpdHRlbiBpbiB0aGUgYWJzZW5zZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfTU4xMDIwMAkweGRlYWQKLSNkZWZpbmUgRU1fQ1lHTlVTX01OMTAzMDAJMHhiZWVmCi0KLS8qIEZSMzAgbWFnaWMgbnVtYmVyIC0gbm8gRUFCSSBhdmFpbGFibGUuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfRlIzMAkJMHgzMzMwCi0KLS8qIFNlZSB0aGUgYWJvdmUgY29tbWVudCBiZWZvcmUgeW91IGFkZCBhIG5ldyBFTV8qIHZhbHVlIGhlcmUuICAqLwotCi0vKiBWYWx1ZXMgZm9yIGVfdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVWX05PTkUJCTAJCS8qIEludmFsaWQgRUxGIHZlcnNpb24gKi8KLSNkZWZpbmUgRVZfQ1VSUkVOVAkxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KLQotLyogVmFsdWVzIGZvciBwcm9ncmFtIGhlYWRlciwgcF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUJUFRfTlVMTAkJMAkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgdW51c2VkICovCi0jZGVmaW5lIFBUX0xPQUQJCTEJCS8qIExvYWRhYmxlIHByb2dyYW0gc2VnbWVudCAqLwotI2RlZmluZSBQVF9EWU5BTUlDCTIJCS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBQVF9JTlRFUlAJMwkJLyogUHJvZ3JhbSBpbnRlcnByZXRlciAqLwotI2RlZmluZSBQVF9OT1RFCQk0CQkvKiBBdXhpbGlhcnkgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgUFRfU0hMSUIJNQkJLyogUmVzZXJ2ZWQsIHVuc3BlY2lmaWVkIHNlbWFudGljcyAqLwotI2RlZmluZSBQVF9QSERSCQk2CQkvKiBFbnRyeSBmb3IgaGVhZGVyIHRhYmxlIGl0c2VsZiAqLwotI2RlZmluZSBQVF9MT09TICAgICAgICAgMHg2MDAwMDAwMAkvKiBPUy1zcGVjaWZpYyAqLwotI2RlZmluZSBQVF9ISU9TICAgICAgICAgMHg2ZmZmZmZmZgkvKiBPUy1zcGVjaWZpYyAqLwotI2RlZmluZSBQVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfSElQUk9DCTB4N0ZGRkZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0KLS8qIFByb2dyYW0gc2VnbWVudCBwZXJtaXNzaW9ucywgaW4gcHJvZ3JhbSBoZWFkZXIgcF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFBGX1gJCSgxIDw8IDApCS8qIFNlZ21lbnQgaXMgZXhlY3V0YWJsZSAqLwotI2RlZmluZSBQRl9XCQkoMSA8PCAxKQkvKiBTZWdtZW50IGlzIHdyaXRhYmxlICovCi0jZGVmaW5lIFBGX1IJCSgxIDw8IDIpCS8qIFNlZ21lbnQgaXMgcmVhZGFibGUgKi8KLSNkZWZpbmUgUEZfTUFTS09TCTB4MEYwMDAwMDAJLyogT1Mtc3BlY2lmaWMgcmVzZXJ2ZWQgYml0cyAqLwotI2RlZmluZSBQRl9NQVNLUFJPQwkweEYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyByZXNlcnZlZCBiaXRzICovCi0KLS8qIFZhbHVlcyBmb3Igc2VjdGlvbiBoZWFkZXIsIHNoX3R5cGUgZmllbGQgKi8KLQotI2RlZmluZSBTSFRfTlVMTAkwCQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSB1bnVzZWQgKi8KLSNkZWZpbmUgU0hUX1BST0dCSVRTCTEJCS8qIFByb2dyYW0gc3BlY2lmaWMgKHByaXZhdGUpIGRhdGEgKi8KLSNkZWZpbmUgU0hUX1NZTVRBQgkyCQkvKiBMaW5rIGVkaXRpbmcgc3ltYm9sIHRhYmxlICovCi0jZGVmaW5lIFNIVF9TVFJUQUIJMwkJLyogQSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU0hUX1JFTEEJNAkJLyogUmVsb2NhdGlvbiBlbnRyaWVzIHdpdGggYWRkZW5kcyAqLwotI2RlZmluZSBTSFRfSEFTSAk1CQkvKiBBIHN5bWJvbCBoYXNoIHRhYmxlICovCi0jZGVmaW5lIFNIVF9EWU5BTUlDCTYJCS8qIEluZm9ybWF0aW9uIGZvciBkeW5hbWljIGxpbmtpbmcgKi8KLSNkZWZpbmUgU0hUX05PVEUJNwkJLyogSW5mb3JtYXRpb24gdGhhdCBtYXJrcyBmaWxlICovCi0jZGVmaW5lIFNIVF9OT0JJVFMJOAkJLyogU2VjdGlvbiBvY2N1cGllcyBubyBzcGFjZSBpbiBmaWxlICovCi0jZGVmaW5lIFNIVF9SRUwJCTkJCS8qIFJlbG9jYXRpb24gZW50cmllcywgbm8gYWRkZW5kcyAqLwotI2RlZmluZSBTSFRfU0hMSUIJMTAJCS8qIFJlc2VydmVkLCB1bnNwZWNpZmllZCBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU0hUX0RZTlNZTQkxMQkJLyogRHluYW1pYyBsaW5raW5nIHN5bWJvbCB0YWJsZSAqLwotCi0jZGVmaW5lIFNIVF9MT09TICAgICAgICAweDYwMDAwMDAwICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNIVF9ISU9TICAgICAgICAweDZmZmZmZmZmICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGhpICovCi0KLS8qIFRoZSBuZXh0IHRocmVlIHNlY3Rpb24gdHlwZXMgYXJlIGRlZmluZWQgYnkgU29sYXJpcywgYW5kIGFyZSBuYW1lZAotICAgU0hUX1NVTlcqLiAgV2UgdXNlIHRoZW0gaW4gR05VIGNvZGUsIHNvIHdlIGFsc28gZGVmaW5lIFNIVF9HTlUqCi0gICB2ZXJzaW9ucy4gICovCi0jZGVmaW5lIFNIVF9TVU5XX3ZlcmRlZgkweDZmZmZmZmZkCS8qIFZlcnNpb25zIGRlZmluZWQgYnkgZmlsZSAqLwotI2RlZmluZSBTSFRfU1VOV192ZXJuZWVkIDB4NmZmZmZmZmUJLyogVmVyc2lvbnMgbmVlZGVkIGJ5IGZpbGUgKi8KLSNkZWZpbmUgU0hUX1NVTldfdmVyc3ltCTB4NmZmZmZmZmYJLyogU3ltYm9sIHZlcnNpb25zICovCi0KLSNkZWZpbmUgU0hUX0dOVV92ZXJkZWYJU0hUX1NVTldfdmVyZGVmCi0jZGVmaW5lIFNIVF9HTlVfdmVybmVlZAlTSFRfU1VOV192ZXJuZWVkCi0jZGVmaW5lIFNIVF9HTlVfdmVyc3ltCVNIVF9TVU5XX3ZlcnN5bQotCi0jZGVmaW5lIFNIVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgc2VtYW50aWNzLCBsbyAqLwotI2RlZmluZSBTSFRfSElQUk9DCTB4N0ZGRkZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLSNkZWZpbmUgU0hUX0xPVVNFUgkweDgwMDAwMDAwCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTSFRfSElVU0VSCTB4OEZGRkZGRkYJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0KLS8qIFZhbHVlcyBmb3Igc2VjdGlvbiBoZWFkZXIsIHNoX2ZsYWdzIGZpZWxkICovCi0KLSNkZWZpbmUgU0hGX1dSSVRFCSgxIDw8IDApCS8qIFdyaXRhYmxlIGRhdGEgZHVyaW5nIGV4ZWN1dGlvbiAqLwotI2RlZmluZSBTSEZfQUxMT0MJKDEgPDwgMSkJLyogT2NjdXBpZXMgbWVtb3J5IGR1cmluZyBleGVjdXRpb24gKi8KLSNkZWZpbmUgU0hGX0VYRUNJTlNUUgkoMSA8PCAyKQkvKiBFeGVjdXRhYmxlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFNIRl9NQVNLT1MJMHgwRjAwMDAwMAkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU0hGX01BU0tQUk9DCTB4RjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0vKiBWYWx1ZXMgb2Ygbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIGNvcmUgZmlsZXMuICovCi0KLSNkZWZpbmUgTlRfUFJTVEFUVVMJMQkJLyogQ29udGFpbnMgY29weSBvZiBwcnN0YXR1cyBzdHJ1Y3QgKi8KLSNkZWZpbmUgTlRfRlBSRUdTRVQJMgkJLyogQ29udGFpbnMgY29weSBvZiBmcHJlZ3NldCBzdHJ1Y3QgKi8KLSNkZWZpbmUgTlRfUFJQU0lORk8JMwkJLyogQ29udGFpbnMgY29weSBvZiBwcnBzaW5mbyBzdHJ1Y3QgKi8KLQotLyogTm90ZSBzZWdtZW50cyBmb3IgY29yZSBmaWxlcyBvbiBkaXItc3R5bGUgcHJvY2ZzIHN5c3RlbXMuICovCi0KLSNkZWZpbmUgTlRfUFNUQVRVUwkxMAkJLyogSGFzIGEgc3RydWN0IHBzdGF0dXMgKi8KLSNkZWZpbmUgTlRfRlBSRUdTCTEyCQkvKiBIYXMgYSBzdHJ1Y3QgZnByZWdzZXQgKi8KLSNkZWZpbmUgTlRfUFNJTkZPCTEzCQkvKiBIYXMgYSBzdHJ1Y3QgcHNpbmZvICovCi0jZGVmaW5lIE5UX0xXUFNUQVRVUwkxNgkJLyogSGFzIGEgc3RydWN0IGx3cHN0YXR1c190ICovCi0jZGVmaW5lIE5UX0xXUFNJTkZPCTE3CQkvKiBIYXMgYSBzdHJ1Y3QgbHdwc2luZm9fdCAqLwotCi0vKiBWYWx1ZXMgb2Ygbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIG9iamVjdCBmaWxlcy4gICovCi0vKiAoT25seSBmb3IgaHBwYSByaWdodCBub3cuICBTaG91bGQgdGhpcyBiZSBtb3ZlZCBlbHNld2hlcmU/KSAgKi8KLQotI2RlZmluZSBOVF9WRVJTSU9OCTEJCS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcuICAqLwotCi0vKiBUaGVzZSB0aHJlZSBtYWNyb3MgZGlzYXNzZW1ibGUgYW5kIGFzc2VtYmxlIGEgc3ltYm9sIHRhYmxlIHN0X2luZm8gZmllbGQsCi0gICB3aGljaCBjb250YWlucyB0aGUgc3ltYm9sIGJpbmRpbmcgYW5kIHN5bWJvbCB0eXBlLiAgVGhlIFNUQl8gYW5kIFNUVF8KLSAgIGRlZmluZXMgaWRlbnRpZnkgdGhlIGJpbmRpbmcgYW5kIHR5cGUuICovCi0KLSNkZWZpbmUgRUxGX1NUX0JJTkQodmFsKQkJKCgodW5zaWduZWQgaW50KSh2YWwpKSA+PiA0KQotI2RlZmluZSBFTEZfU1RfVFlQRSh2YWwpCQkoKHZhbCkgJiAweEYpCi0jZGVmaW5lIEVMRl9TVF9JTkZPKGJpbmQsdHlwZSkJCSgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4RikpCi0KLSNkZWZpbmUgU1ROX1VOREVGCTAJCS8qIHVuZGVmaW5lZCBzeW1ib2wgaW5kZXggKi8KLQotI2RlZmluZSBTVEJfTE9DQUwJMAkJLyogU3ltYm9sIG5vdCB2aXNpYmxlIG91dHNpZGUgb2JqICovCi0jZGVmaW5lIFNUQl9HTE9CQUwJMQkJLyogU3ltYm9sIHZpc2libGUgb3V0c2lkZSBvYmogKi8KLSNkZWZpbmUgU1RCX1dFQUsJMgkJLyogTGlrZSBnbG9iYWxzLCBsb3dlciBwcmVjZWRlbmNlICovCi0jZGVmaW5lIFNUQl9MT09TICAgICAgICAxMAkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUQl9ISU9TICAgICAgICAxMgkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUQl9MT1BST0MJMTMJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVEJfSElQUk9DCTE1CQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotI2RlZmluZSBTVFRfTk9UWVBFCTAJCS8qIFN5bWJvbCB0eXBlIGlzIHVuc3BlY2lmaWVkICovCi0jZGVmaW5lIFNUVF9PQkpFQ1QJMQkJLyogU3ltYm9sIGlzIGEgZGF0YSBvYmplY3QgKi8KLSNkZWZpbmUgU1RUX0ZVTkMJMgkJLyogU3ltYm9sIGlzIGEgY29kZSBvYmplY3QgKi8KLSNkZWZpbmUgU1RUX1NFQ1RJT04JMwkJLyogU3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24gKi8KLSNkZWZpbmUgU1RUX0ZJTEUJNAkJLyogU3ltYm9sIGdpdmVzIGEgZmlsZSBuYW1lICovCi0jZGVmaW5lIFNUVF9MT09TICAgICAgICAxMAkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9ISU9TICAgICAgICAxMgkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9MT1BST0MJMTMJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVFRfSElQUk9DCTE1CQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMsIHdoaWNoIG1heSBzaG93IHVwIGluIHN0X3NobmR4IGZpZWxkcywgYW1vbmcKLSAgIG90aGVyIHBsYWNlcy4gKi8KLQotI2RlZmluZSBTSE5fVU5ERUYJMAkJLyogVW5kZWZpbmVkIHNlY3Rpb24gcmVmZXJlbmNlICovCi0jZGVmaW5lIFNITl9MT1JFU0VSVkUJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiByZXNlcnZlZCBpbmRpY2VzICovCi0jZGVmaW5lIFNITl9MT1BST0MJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiBhcHBsLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9ISVBST0MJMHhGRjFGCQkvKiBFbmQgcmFuZ2Ugb2YgYXBwbC1zcGVjaWZpYyAqLwotI2RlZmluZSBTSE5fTE9PUyAgICAgICAgMHhGRjIwCQkvKiBPUyBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNITl9ISU9TICAgICAgICAweEZGM0YJCS8qIE9TIHNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLSNkZWZpbmUgU0hOX0FCUwkJMHhGRkYxCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotI2RlZmluZSBTSE5fQ09NTU9OCTB4RkZGMgkJLyogQXNzb2NpYXRlZCBzeW1ib2wgaXMgaW4gY29tbW9uICovCi0jZGVmaW5lIFNITl9ISVJFU0VSVkUJMHhGRkZGCQkvKiBFbmQgcmFuZ2Ugb2YgcmVzZXJ2ZWQgaW5kaWNlcyAqLwotCi0vKiByZWxvY2F0aW9uIGluZm8gaGFuZGxpbmcgbWFjcm9zICovCi0KLSNkZWZpbmUgRUxGMzJfUl9TWU0oaSkJCSgoaSkgPj4gOCkKLSNkZWZpbmUgRUxGMzJfUl9UWVBFKGkpCQkoKGkpICYgMHhmZikKLSNkZWZpbmUgRUxGMzJfUl9JTkZPKHMsdCkJKCgocykgPDwgOCkgKyAoKHQpICYgMHhmZikpCi0KLSNkZWZpbmUgRUxGNjRfUl9TWU0oaSkJCSgoaSkgPj4gMzIpCi0jZGVmaW5lIEVMRjY0X1JfVFlQRShpKQkJKChpKSAmIDB4ZmZmZmZmZmYpCi0jZGVmaW5lIEVMRjY0X1JfSU5GTyhzLHQpCSgoKGJmZF92bWEpIChzKSA8PCAzMikgKyAoYmZkX3ZtYSkgKHQpKQotCi0vKiBEeW5hbWljIHNlY3Rpb24gdGFncyAqLwotCi0jZGVmaW5lIERUX05VTEwJCTAKLSNkZWZpbmUgRFRfTkVFREVECTEKLSNkZWZpbmUgRFRfUExUUkVMU1oJMgotI2RlZmluZSBEVF9QTFRHT1QJMwotI2RlZmluZSBEVF9IQVNICQk0Ci0jZGVmaW5lIERUX1NUUlRBQgk1Ci0jZGVmaW5lIERUX1NZTVRBQgk2Ci0jZGVmaW5lIERUX1JFTEEJCTcKLSNkZWZpbmUgRFRfUkVMQVNaCTgKLSNkZWZpbmUgRFRfUkVMQUVOVAk5Ci0jZGVmaW5lIERUX1NUUlNaCTEwCi0jZGVmaW5lIERUX1NZTUVOVAkxMQotI2RlZmluZSBEVF9JTklUCQkxMgotI2RlZmluZSBEVF9GSU5JCQkxMwotI2RlZmluZSBEVF9TT05BTUUJMTQKLSNkZWZpbmUgRFRfUlBBVEgJMTUKLSNkZWZpbmUgRFRfU1lNQk9MSUMJMTYKLSNkZWZpbmUgRFRfUkVMCQkxNwotI2RlZmluZSBEVF9SRUxTWgkxOAotI2RlZmluZSBEVF9SRUxFTlQJMTkKLSNkZWZpbmUgRFRfUExUUkVMCTIwCi0jZGVmaW5lIERUX0RFQlVHCTIxCi0jZGVmaW5lIERUX1RFWFRSRUwJMjIKLSNkZWZpbmUgRFRfSk1QUkVMCTIzCi0jZGVmaW5lIERUX0JJTkRfTk9XICAgICAyNAotI2RlZmluZSBEVF9JTklUX0FSUkFZICAgMjUKLSNkZWZpbmUgRFRfRklOSV9BUlJBWSAgIDI2Ci0jZGVmaW5lIERUX0lOSVRfQVJSQVlTWiAyNwotI2RlZmluZSBEVF9GSU5JX0FSUkFZU1ogMjgKLQotI2RlZmluZSBEVF9MT09TICAgICAgICAgMHg2MDAwMDAwMAotI2RlZmluZSBEVF9ISU9TICAgICAgICAgMHg2ZmZmZmZmZgotCi0vKiBUaGUgbmV4dCBmb3VyIGR5bmFtaWMgdGFncyBhcmUgdXNlZCBvbiBTb2xhcmlzLiAgV2Ugc3VwcG9ydCB0aGVtCi0gICBldmVyeXdoZXJlLiAgKi8KLSNkZWZpbmUgRFRfVkFMUk5HTE8JMHg2ZmZmZmQwMAotI2RlZmluZSBEVF9QTFRQQURTWgkweDZmZmZmZGY5Ci0jZGVmaW5lIERUX01PVkVFTlQJMHg2ZmZmZmRmYQotI2RlZmluZSBEVF9NT1ZFU1oJMHg2ZmZmZmRmYgotI2RlZmluZSBEVF9GRUFUVVJFXzEJMHg2ZmZmZmRmYwotI2RlZmluZSBEVF9QT1NGTEFHXzEJMHg2ZmZmZmRmZAotI2RlZmluZSBEVF9TWU1JTlNaCTB4NmZmZmZkZmUKLSNkZWZpbmUgRFRfU1lNSU5FTlQJMHg2ZmZmZmRmZgotI2RlZmluZSBEVF9WQUxSTkdISQkweDZmZmZmZGZmCi0KLSNkZWZpbmUgRFRfQUREUlJOR0xPCTB4NmZmZmZlMDAKLSNkZWZpbmUgRFRfU1lNSU5GTwkweDZmZmZmZWZmCi0jZGVmaW5lIERUX0FERFJSTkdISQkweDZmZmZmZWZmCi0KLSNkZWZpbmUgRFRfUkVMQUNPVU5UCTB4NmZmZmZmZjkKLSNkZWZpbmUgRFRfUkVMQ09VTlQJMHg2ZmZmZmZmYQotI2RlZmluZSBEVF9GTEFHU18xCTB4NmZmZmZmZmIKLSNkZWZpbmUgRFRfVkVSREVGCTB4NmZmZmZmZmMKLSNkZWZpbmUgRFRfVkVSREVGTlVNCTB4NmZmZmZmZmQKLSNkZWZpbmUgRFRfVkVSTkVFRAkweDZmZmZmZmZlCi0jZGVmaW5lIERUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgotCi0vKiBUaGlzIHRhZyBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFNvbGFyaXMgdmVyc2lvbiBzY2hlbWUuICAqLwotI2RlZmluZSBEVF9WRVJTWU0JMHg2ZmZmZmZmMAotCi0jZGVmaW5lIERUX0xPUFJPQwkweDcwMDAwMDAwCi0jZGVmaW5lIERUX0hJUFJPQwkweDdmZmZmZmZmCi0KLS8qIFRoZXNlIHNlY3Rpb24gdGFncyBhcmUgdXNlZCBvbiBTb2xhcmlzLiAgV2Ugc3VwcG9ydCB0aGVtCi0gICBldmVyeXdoZXJlLCBhbmQgaG9wZSB0aGV5IGRvIG5vdCBjb25mbGljdC4gICovCi0KLSNkZWZpbmUgRFRfQVVYSUxJQVJZCTB4N2ZmZmZmZmQKLSNkZWZpbmUgRFRfVVNFRAkJMHg3ZmZmZmZmZQotI2RlZmluZSBEVF9GSUxURVIJMHg3ZmZmZmZmZgotCi0vKiBWYWx1ZXMgdXNlZCBpbiBEVF9GRUFUVVJFXzEgLmR5bmFtaWMgZW50cnkuICAqLwotI2RlZmluZSBEVEZfMV9QQVJJTklUCTB4MDAwMDAwMDEKLQotLyogRmxhZyB2YWx1ZXMgdXNlZCBpbiB0aGUgRFRfUE9TRkxBR18xIC5keW5hbWljIGVudHJ5LiAgKi8KLSNkZWZpbmUgREZfUDFfTEFaWUxPQUQJMHgwMDAwMDAwMQotI2RlZmluZSBERl9QMV9HUk9VUFBFUk0JMHgwMDAwMDAwMgotCi0vKiBGbGFnIHZhbHVlIGluIGluIHRoZSBEVF8xX0ZMQUdTIC5keW5hbWljIGVudHJ5LiAgKi8KLSNkZWZpbmUgREZfMV9OT1cJMHgwMDAwMDAwMQotI2RlZmluZSBERl8xX0dMT0JBTAkweDAwMDAwMDAyCi0jZGVmaW5lIERGXzFfR1JPVVAJMHgwMDAwMDAwNAotI2RlZmluZSBERl8xX05PREVMRVRFCTB4MDAwMDAwMDgKLSNkZWZpbmUgREZfMV9MT0FERkxUUgkweDAwMDAwMDEwCi0jZGVmaW5lIERGXzFfSU5JVEZJUlNUCTB4MDAwMDAwMjAKLSNkZWZpbmUgREZfMV9OT09QRU4JMHgwMDAwMDA0MAotI2RlZmluZSBERl8xX09SSUdJTgkweDAwMDAwMDgwCi0jZGVmaW5lIERGXzFfRElSRUNUCTB4MDAwMDAxMDAKLSNkZWZpbmUgREZfMV9UUkFOUwkweDAwMDAwMjAwCi0jZGVmaW5lIERGXzFfSU5URVJQT1NFCTB4MDAwMDA0MDAKLQotLyogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBFbGYzMl9WZXJkZWYKLSAgIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgVkVSX0RFRl9OT05FCQkwCi0jZGVmaW5lIFZFUl9ERUZfQ1VSUkVOVAkJMQotCi0vKiBUaGVzZSBjb25zdGFudHMgYXBwZWFyIGluIHRoZSB2ZF9mbGFncyBmaWVsZCBvZiBhIEVsZjMyX1ZlcmRlZgotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfRkxHX0JBU0UJCTB4MQotI2RlZmluZSBWRVJfRkxHX1dFQUsJCTB4MgotCi0vKiBUaGVzZSBzcGVjaWFsIGNvbnN0YW50cyBjYW4gYmUgZm91bmQgaW4gYW4gRWxmMzJfVmVyc3ltIGZpZWxkLiAgKi8KLQotI2RlZmluZSBWRVJfTkRYX0xPQ0FMCQkwCi0jZGVmaW5lIFZFUl9ORFhfR0xPQkFMCQkxCi0KLS8qIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGEgRWxmMzJfVmVybmVlZAotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfTkVFRF9OT05FCQkwCi0jZGVmaW5lIFZFUl9ORUVEX0NVUlJFTlQJMQotCi0vKiBUaGlzIGZsYWcgYXBwZWFycyBpbiBhIFZlcnN5bSBzdHJ1Y3R1cmUuICBJdCBtZWFucyB0aGF0IHRoZSBzeW1ib2wKLSAgIGlzIGhpZGRlbiwgYW5kIGlzIG9ubHkgdmlzaWJsZSB3aXRoIGFuIGV4cGxpY2l0IHZlcnNpb24gbnVtYmVyLgotICAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotCi0jZGVmaW5lIFZFUlNZTV9ISURERU4JCTB4ODAwMAotCi0vKiBUaGlzIGlzIHRoZSBtYXNrIGZvciB0aGUgcmVzdCBvZiB0aGUgVmVyc3ltIGluZm9ybWF0aW9uLiAgKi8KLQotI2RlZmluZSBWRVJTWU1fVkVSU0lPTgkJMHg3ZmZmCi0KLS8qIFRoaXMgaXMgYSBzcGVjaWFsIHRva2VuIHdoaWNoIGFwcGVhcnMgYXMgcGFydCBvZiBhIHN5bWJvbCBuYW1lLiAgSXQKLSAgIGluZGljdGVzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIG5hbWUgaXMgYWN0dWFsbHkgdGhlIG5hbWUgb2YgYQotICAgdmVyc2lvbiBub2RlLCBhbmQgaXMgbm90IHBhcnQgb2YgdGhlIGFjdHVhbCBuYW1lLiAgVGhpcyBpcyBhIEdOVQotICAgZXh0ZW5zaW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBzeW1ib2wgbmFtZSBgc3RhdEB2ZXIyJyBpcyB0YWtlbiB0bwotICAgbWVhbiB0aGUgc3ltYm9sIGBzdGF0JyBpbiB2ZXJzaW9uIGB2ZXIyJy4gICovCi0KLSNkZWZpbmUgRUxGX1ZFUl9DSFIJJ0AnCi0KLS8qIFBvc3NpYmxlIHZhbHVlcyBmb3Igc2lfYm91bmR0by4gICovCi0jZGVmaW5lIFNZTUlORk9fQlRfU0VMRgkJMHhmZmZmCS8qIFN5bWJvbCBib3VuZCB0byBzZWxmICovCi0jZGVmaW5lIFNZTUlORk9fQlRfUEFSRU5UCTB4ZmZmZQkvKiBTeW1ib2wgYm91bmQgdG8gcGFyZW50ICovCi0jZGVmaW5lIFNZTUlORk9fQlRfTE9XUkVTRVJWRQkweGZmMDAJLyogQmVnaW5uaW5nIG9mIHJlc2VydmVkIGVudHJpZXMgKi8KLQotLyogUG9zc2libGUgYml0bWFza3MgZm9yIHNpX2ZsYWdzLiAgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfRElSRUNUCTB4MDAwMQkvKiBEaXJlY3QgYm91bmQgc3ltYm9sICovCi0jZGVmaW5lIFNZTUlORk9fRkxHX1BBU1NUSFJVCTB4MDAwMgkvKiBQYXNzLXRocnUgc3ltYm9sIGZvciB0cmFuc2xhdG9yICovCi0jZGVmaW5lIFNZTUlORk9fRkxHX0NPUFkJMHgwMDA0CS8qIFN5bWJvbCBpcyBhIGNvcHktcmVsb2MgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfTEFaWUxPQUQJMHgwMDA4CS8qIFN5bWJvbCBib3VuZCB0byBvYmplY3QgdG8gYmUgbGF6eQotCQkJCQkgICBsb2FkZWQgKi8KLS8qIFN5bWluZm8gdmVyc2lvbiB2YWx1ZXMuICAqLwotI2RlZmluZSBTWU1JTkZPX05PTkUJCTAKLSNkZWZpbmUgU1lNSU5GT19DVVJSRU5UCQkxCi0jZGVmaW5lIFNZTUlORk9fTlVNCQkyCi0KLSNlbmRpZiAvKiBfRUxGX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kMTB2LmggYi9pbmNsdWRlL2VsZi9kMTB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjc5YzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZDEwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogZDEwdiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9EMTBWX0gKLSNkZWZpbmUgX0VMRl9EMTBWX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfZDEwdl9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xMF9QQ1JFTF9SLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xMF9QQ1JFTF9MLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xNiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfMTgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzE4X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8zMiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfR05VX1ZUSU5IRVJJVCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfR05VX1ZURU5UUlksIDgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2QzMHYuaCBiL2luY2x1ZGUvZWxmL2QzMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiYWQxOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kMzB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBkMzB2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0QzMFZfSAotI2RlZmluZSBfRUxGX0QzMFZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfZDMwdl9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl82LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl85X1BDUkVMLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl85X1BDUkVMX1IsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzE1LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8xNV9QQ1JFTCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMTVfUENSRUxfUiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMjEsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzIxX1BDUkVMLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8yMV9QQ1JFTF9SLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8zMiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzMyX1BDUkVMLCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMzJfTk9STUFMLCAxMikKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZHdhcmYuaCBiL2luY2x1ZGUvZWxmL2R3YXJmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzJjZDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZHdhcmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgYW5kIGRlZmluaXRpb25zIG9mIGNvZGVzIHJlbGF0aW5nIHRvIHRoZSBEV0FSRiBzeW1ib2xpYwotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvcm1hdC4KLQotICAgV3JpdHRlbiBieSBSb24gR3VpbG1ldHRlIChyZmdAbmNkLmNvbSkKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCi0gICBSZXZpc2lvbiAxLjAuMSAoQXByaWwgOCwgMTk5MikgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKLSAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCi0gICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQotICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuCi0qLwotCi0jaWZuZGVmIF9FTEZfRFdBUkZfSAotI2RlZmluZSBfRUxGX0RXQVJGX0gKLQotLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdGFnIHsKLSAgICBUQUdfcGFkZGluZwkJCT0gMHgwMDAwLAotICAgIFRBR19hcnJheV90eXBlCQk9IDB4MDAwMSwKLSAgICBUQUdfY2xhc3NfdHlwZQkJPSAweDAwMDIsCi0gICAgVEFHX2VudHJ5X3BvaW50CQk9IDB4MDAwMywKLSAgICBUQUdfZW51bWVyYXRpb25fdHlwZQk9IDB4MDAwNCwKLSAgICBUQUdfZm9ybWFsX3BhcmFtZXRlcgk9IDB4MDAwNSwKLSAgICBUQUdfZ2xvYmFsX3N1YnJvdXRpbmUJPSAweDAwMDYsCi0gICAgVEFHX2dsb2JhbF92YXJpYWJsZQkJPSAweDAwMDcsCi0gICAgCQkJCS8qIDB4MDAwOCAtLSByZXNlcnZlZCAqLwotCQkJCS8qIDB4MDAwOSAtLSByZXNlcnZlZCAqLwotICAgIFRBR19sYWJlbAkJCT0gMHgwMDBhLAotICAgIFRBR19sZXhpY2FsX2Jsb2NrCQk9IDB4MDAwYiwKLSAgICBUQUdfbG9jYWxfdmFyaWFibGUJCT0gMHgwMDBjLAotICAgIFRBR19tZW1iZXIJCQk9IDB4MDAwZCwKLQkJCQkvKiAweDAwMGUgLS0gcmVzZXJ2ZWQgKi8KLSAgICBUQUdfcG9pbnRlcl90eXBlCQk9IDB4MDAwZiwKLSAgICBUQUdfcmVmZXJlbmNlX3R5cGUJCT0gMHgwMDEwLAotICAgIFRBR19jb21waWxlX3VuaXQJCT0gMHgwMDExLAotICAgIFRBR19zdHJpbmdfdHlwZQkJPSAweDAwMTIsCi0gICAgVEFHX3N0cnVjdHVyZV90eXBlCQk9IDB4MDAxMywKLSAgICBUQUdfc3Vicm91dGluZQkJPSAweDAwMTQsCi0gICAgVEFHX3N1YnJvdXRpbmVfdHlwZQkJPSAweDAwMTUsCi0gICAgVEFHX3R5cGVkZWYJCQk9IDB4MDAxNiwKLSAgICBUQUdfdW5pb25fdHlwZQkJPSAweDAwMTcsCi0gICAgVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMJPSAweDAwMTgsCi0gICAgVEFHX3ZhcmlhbnQJCQk9IDB4MDAxOSwKLSAgICBUQUdfY29tbW9uX2Jsb2NrCQk9IDB4MDAxYSwKLSAgICBUQUdfY29tbW9uX2luY2x1c2lvbgk9IDB4MDAxYiwKLSAgICBUQUdfaW5oZXJpdGFuY2UJCT0gMHgwMDFjLAotICAgIFRBR19pbmxpbmVkX3N1YnJvdXRpbmUJPSAweDAwMWQsCi0gICAgVEFHX21vZHVsZQkJCT0gMHgwMDFlLAotICAgIFRBR19wdHJfdG9fbWVtYmVyX3R5cGUJPSAweDAwMWYsCi0gICAgVEFHX3NldF90eXBlCQk9IDB4MDAyMCwKLSAgICBUQUdfc3VicmFuZ2VfdHlwZQkJPSAweDAwMjEsCi0gICAgVEFHX3dpdGhfc3RtdAkJPSAweDAwMjIsCi0KLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotCi0gICAgVEFHX2Zvcm1hdF9sYWJlbAkJPSAweDgwMDAsICAvKiBmb3IgRk9SVFJBTiA3NyBhbmQgRm9ydHJhbiA5MCAqLwotICAgIFRBR19uYW1lbGlzdAkJPSAweDgwMDEsICAvKiBGb3IgRm9ydHJhbiA5MCAqLwotICAgIFRBR19mdW5jdGlvbl90ZW1wbGF0ZQk9IDB4ODAwMiwgIC8qIGZvciBDKysgKi8KLSAgICBUQUdfY2xhc3NfdGVtcGxhdGUJCT0gMHg4MDAzICAgLyogZm9yIEMrKyAqLwotfTsKLQotI2RlZmluZSBUQUdfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgVEFHX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotI2RlZmluZSBUQUdfc291cmNlX2ZpbGUgVEFHX2NvbXBpbGVfdW5pdCAgLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLQotLyogRm9ybSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2Zvcm0gewotICAgIEZPUk1fQUREUgk9IDB4MSwKLSAgICBGT1JNX1JFRgk9IDB4MiwKLSAgICBGT1JNX0JMT0NLMgk9IDB4MywKLSAgICBGT1JNX0JMT0NLNAk9IDB4NCwKLSAgICBGT1JNX0RBVEEyCT0gMHg1LAotICAgIEZPUk1fREFUQTQJPSAweDYsCi0gICAgRk9STV9EQVRBOAk9IDB4NywKLSAgICBGT1JNX1NUUklORwk9IDB4OAotfTsKLQotLyogQXR0cmlidXRlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfYXR0cmlidXRlIHsKLSAgICBBVF9zaWJsaW5nCQkJPSAoMHgwMDEwfEZPUk1fUkVGKSwKLSAgICBBVF9sb2NhdGlvbgkJCT0gKDB4MDAyMHxGT1JNX0JMT0NLMiksCi0gICAgQVRfbmFtZQkJCT0gKDB4MDAzMHxGT1JNX1NUUklORyksCi0gICAgQVRfZnVuZF90eXBlCQk9ICgweDAwNTB8Rk9STV9EQVRBMiksCi0gICAgQVRfbW9kX2Z1bmRfdHlwZQkJPSAoMHgwMDYwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF91c2VyX2RlZl90eXBlCQk9ICgweDAwNzB8Rk9STV9SRUYpLAotICAgIEFUX21vZF91X2RfdHlwZQkJPSAoMHgwMDgwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9vcmRlcmluZwkJCT0gKDB4MDA5MHxGT1JNX0RBVEEyKSwKLSAgICBBVF9zdWJzY3JfZGF0YQkJPSAoMHgwMGEwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9ieXRlX3NpemUJCT0gKDB4MDBiMHxGT1JNX0RBVEE0KSwKLSAgICBBVF9iaXRfb2Zmc2V0CQk9ICgweDAwYzB8Rk9STV9EQVRBMiksCi0gICAgQVRfYml0X3NpemUJCQk9ICgweDAwZDB8Rk9STV9EQVRBNCksCi0JCQkJLyogKDB4MDBlMHxGT1JNX3h4eHgpIC0tIHJlc2VydmVkICovCi0gICAgQVRfZWxlbWVudF9saXN0CQk9ICgweDAwZjB8Rk9STV9CTE9DSzQpLAotICAgIEFUX3N0bXRfbGlzdAkJPSAoMHgwMTAwfEZPUk1fREFUQTQpLAotICAgIEFUX2xvd19wYwkJCT0gKDB4MDExMHxGT1JNX0FERFIpLAotICAgIEFUX2hpZ2hfcGMJCQk9ICgweDAxMjB8Rk9STV9BRERSKSwKLSAgICBBVF9sYW5ndWFnZQkJCT0gKDB4MDEzMHxGT1JNX0RBVEE0KSwKLSAgICBBVF9tZW1iZXIJCQk9ICgweDAxNDB8Rk9STV9SRUYpLAotICAgIEFUX2Rpc2NyCQkJPSAoMHgwMTUwfEZPUk1fUkVGKSwKLSAgICBBVF9kaXNjcl92YWx1ZQkJPSAoMHgwMTYwfEZPUk1fQkxPQ0syKSwKLQkJCQkvKiAoMHgwMTcwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLQkJCQkvKiAoMHgwMTgwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLSAgICBBVF9zdHJpbmdfbGVuZ3RoCQk9ICgweDAxOTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2NvbW1vbl9yZWZlcmVuY2UJCT0gKDB4MDFhMHxGT1JNX1JFRiksCi0gICAgQVRfY29tcF9kaXIJCQk9ICgweDAxYjB8Rk9STV9TVFJJTkcpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9zdHJpbmcJPSAoMHgwMWMwfEZPUk1fU1RSSU5HKSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfZGF0YTIJPSAoMHgwMWMwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9kYXRhNAk9ICgweDAxYzB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2RhdGE4CT0gKDB4MDFjMHxGT1JNX0RBVEE4KSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfYmxvY2syCT0gKDB4MDFjMHxGT1JNX0JMT0NLMiksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2Jsb2NrNAk9ICgweDAxYzB8Rk9STV9CTE9DSzQpLAotICAgIEFUX2NvbnRhaW5pbmdfdHlwZQkJPSAoMHgwMWQwfEZPUk1fUkVGKSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9hZGRyCT0gKDB4MDFlMHxGT1JNX0FERFIpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2RhdGEyCT0gKDB4MDFlMHxGT1JNX0RBVEEyKSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9kYXRhNAk9ICgweDAxZTB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfZGF0YTgJPSAoMHgwMWUwfEZPUk1fREFUQTgpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX3N0cmluZwk9ICgweDAxZTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX2ZyaWVuZHMJCQk9ICgweDAxZjB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2lubGluZQkJCT0gKDB4MDIwMHxGT1JNX1NUUklORyksCi0gICAgQVRfaXNfb3B0aW9uYWwJCT0gKDB4MDIxMHxGT1JNX1NUUklORyksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX3JlZgk9ICgweDAyMjB8Rk9STV9SRUYpLAotICAgICAgICBBVF9sb3dlcl9ib3VuZF9kYXRhMgk9ICgweDAyMjB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX2RhdGE0CT0gKDB4MDIyMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfZGF0YTgJPSAoMHgwMjIwfEZPUk1fREFUQTgpLAotICAgIEFUX3ByaXZhdGUJCQk9ICgweDAyNDB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb2R1Y2VyCQkJPSAoMHgwMjUwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm9ncmFtCQkJPSAoMHgwMjMwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm90ZWN0ZWQJCT0gKDB4MDI2MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHJvdG90eXBlZAkJPSAoMHgwMjcwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wdWJsaWMJCQk9ICgweDAyODB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3B1cmVfdmlydHVhbAkJPSAoMHgwMjkwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9yZXR1cm5fYWRkcgkJPSAoMHgwMmEwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9hYnN0cmFjdF9vcmlnaW4JCT0gKDB4MDJiMHxGT1JNX1JFRiksCi0gICAgQVRfc3RhcnRfc2NvcGUJCT0gKDB4MDJjMHxGT1JNX0RBVEE0KSwKLSAgICBBVF9zdHJpZGVfc2l6ZQkJPSAoMHgwMmUwfEZPUk1fREFUQTQpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9yZWYJPSAoMHgwMmYwfEZPUk1fUkVGKSwKLSAgICAgICAgQVRfdXBwZXJfYm91bmRfZGF0YTIJPSAoMHgwMmYwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9kYXRhNAk9ICgweDAyZjB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX2RhdGE4CT0gKDB4MDJmMHxGT1JNX0RBVEE4KSwKLSAgICBBVF92aXJ0dWFsCQkJPSAoMHgwMzAwfEZPUk1fU1RSSU5HKSwKLQotICAgIC8qIEdOVSBleHRlbnNpb25zLiAgKi8KLQotICAgIEFUX3NmX25hbWVzCQkJPSAoMHg4MDAwfEZPUk1fREFUQTQpLAotICAgIEFUX3NyY19pbmZvCQkJPSAoMHg4MDEwfEZPUk1fREFUQTQpLAotICAgIEFUX21hY19pbmZvCQkJPSAoMHg4MDIwfEZPUk1fREFUQTQpLAotICAgIEFUX3NyY19jb29yZHMJCT0gKDB4ODAzMHxGT1JNX0RBVEE0KSwKLSAgICBBVF9ib2R5X2JlZ2luCQk9ICgweDgwNDB8Rk9STV9BRERSKSwKLSAgICBBVF9ib2R5X2VuZAkJCT0gKDB4ODA1MHxGT1JNX0FERFIpCi19OwotCi0jZGVmaW5lIEFUX2xvX3VzZXIJMHg4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIEFUX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfbG9jYXRpb25fYXRvbSB7Ci0gICAgT1BfUkVHCT0gMHgwMSwKLSAgICBPUF9CQVNFUkVHCT0gMHgwMiwKLSAgICBPUF9BRERSCT0gMHgwMywKLSAgICBPUF9DT05TVAk9IDB4MDQsCi0gICAgT1BfREVSRUYyCT0gMHgwNSwKLSAgICBPUF9ERVJFRjQJPSAweDA2LAotICAgIE9QX0FERAk9IDB4MDcKLX07Ci0KLSNkZWZpbmUgT1BfTE9fVVNFUgkweDgwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIE9QX0hJX1VTRVIJMHhmZiAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KLQotLyogRnVuZGFtZW50YWwgdHlwZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgewotICAgIEZUX2NoYXIJCT0gMHgwMDAxLAotICAgIEZUX3NpZ25lZF9jaGFyCT0gMHgwMDAyLAotICAgIEZUX3Vuc2lnbmVkX2NoYXIJPSAweDAwMDMsCi0gICAgRlRfc2hvcnQJCT0gMHgwMDA0LAotICAgIEZUX3NpZ25lZF9zaG9ydAk9IDB4MDAwNSwKLSAgICBGVF91bnNpZ25lZF9zaG9ydAk9IDB4MDAwNiwKLSAgICBGVF9pbnRlZ2VyCQk9IDB4MDAwNywKLSAgICBGVF9zaWduZWRfaW50ZWdlcgk9IDB4MDAwOCwKLSAgICBGVF91bnNpZ25lZF9pbnRlZ2VyCT0gMHgwMDA5LAotICAgIEZUX2xvbmcJCT0gMHgwMDBhLAotICAgIEZUX3NpZ25lZF9sb25nCT0gMHgwMDBiLAotICAgIEZUX3Vuc2lnbmVkX2xvbmcJPSAweDAwMGMsCi0gICAgRlRfcG9pbnRlcgkJPSAweDAwMGQsICAvKiBhbiBhbGlhcyBmb3IgKHZvaWQgKikgKi8KLSAgICBGVF9mbG9hdAkJPSAweDAwMGUsCi0gICAgRlRfZGJsX3ByZWNfZmxvYXQJPSAweDAwMGYsCi0gICAgRlRfZXh0X3ByZWNfZmxvYXQJPSAweDAwMTAsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfY29tcGxleAkJPSAweDAwMTEsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfZGJsX3ByZWNfY29tcGxleAk9IDB4MDAxMiwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLQkJCS8qIDB4MDAxMyAtLSByZXNlcnZlZCAqLwotICAgIEZUX3ZvaWQJCT0gMHgwMDE0LAotICAgIEZUX2Jvb2xlYW4JCT0gMHgwMDE1LCAgLyogYnJlYWtzICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotICAgIEZUX2V4dF9wcmVjX2NvbXBsZXgJPSAweDAwMTYsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfbGFiZWwJCT0gMHgwMDE3LAotICAKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucwotICAgICAgIFRoZSBsb3cgb3JkZXIgYnl0ZSBtdXN0IGluZGljYXRlIHRoZSBzaXplIChpbiBieXRlcykgZm9yIHRoZSB0eXBlLgotICAgICAgIEFsbCBvZiB0aGVzZSB0eXBlcyB3aWxsIHByb2JhYmx5IGJyZWFrICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotCi0gICAgRlRfbG9uZ19sb25nCT0gMHg4MDA4LAotICAgIEZUX3NpZ25lZF9sb25nX2xvbmcJPSAweDgxMDgsCi0gICAgRlRfdW5zaWduZWRfbG9uZ19sb25nID0gMHg4MjA4LAotCi0gICAgRlRfaW50OAkJPSAweDkwMDEsCi0gICAgRlRfc2lnbmVkX2ludDgJPSAweDkxMDEsCi0gICAgRlRfdW5zaWduZWRfaW50OAk9IDB4OTIwMSwKLSAgICBGVF9pbnQxNgkJPSAweDkzMDIsCi0gICAgRlRfc2lnbmVkX2ludDE2CT0gMHg5NDAyLAotICAgIEZUX3Vuc2lnbmVkX2ludDE2CT0gMHg5NTAyLAotICAgIEZUX2ludDMyCQk9IDB4OTYwNCwKLSAgICBGVF9zaWduZWRfaW50MzIJPSAweDk3MDQsCi0gICAgRlRfdW5zaWduZWRfaW50MzIJPSAweDk4MDQsCi0gICAgRlRfaW50NjQJCT0gMHg5OTA4LAotICAgIEZUX3NpZ25lZF9pbnQ2NAk9IDB4OWEwOCwKLSAgICBGVF91bnNpZ25lZF9pbnQ2NAk9IDB4OWIwOCwKLQotICAgIEZUX3JlYWwzMgkJPSAweGEwMDQsCi0gICAgRlRfcmVhbDY0CQk9IDB4YTEwOCwKLSAgICBGVF9yZWFsOTYJCT0gMHhhMjBjLAotICAgIEZUX3JlYWwxMjgJCT0gMHhhMzEwCi19OwotCi0jZGVmaW5lIEZUX2xvX3VzZXIJMHg4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIEZUX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBUeXBlIG1vZGlmaWVyIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdHlwZV9tb2RpZmllciB7Ci0gICAgTU9EX3BvaW50ZXJfdG8JPSAweDAxLAotICAgIE1PRF9yZWZlcmVuY2VfdG8JPSAweDAyLAotICAgIE1PRF9jb25zdAkJPSAweDAzLAotICAgIE1PRF92b2xhdGlsZQk9IDB4MDQKLX07Ci0KLSNkZWZpbmUgTU9EX2xvX3VzZXIJMHg4MCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBNT0RfaGlfdXNlcgkweGZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2FycmF5X2RpbV9vcmRlcmluZyB7Ci0gICAgT1JEX3Jvd19tYWpvcgk9IDAsCi0gICAgT1JEX2NvbF9tYWpvcgk9IDEKLX07Ci0KLS8qIEFycmF5IHN1YnNjcmlwdCBmb3JtYXQgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9zdWJzY3JfZGF0YV9mb3JtYXRzIHsKLSAgICBGTVRfRlRfQ19DCT0gMHgwLAotICAgIEZNVF9GVF9DX1gJPSAweDEsCi0gICAgRk1UX0ZUX1hfQwk9IDB4MiwKLSAgICBGTVRfRlRfWF9YCT0gMHgzLAotICAgIEZNVF9VVF9DX0MJPSAweDQsCi0gICAgRk1UX1VUX0NfWAk9IDB4NSwKLSAgICBGTVRfVVRfWF9DCT0gMHg2LAotICAgIEZNVF9VVF9YX1gJPSAweDcsCi0gICAgRk1UX0VUCT0gMHg4Ci19OwotCi0vKiBEZXJpdmVkIGZyb20gYWJvdmUgZm9yIGVhc2Ugb2YgdXNlLiAgKi8KLQotI2RlZmluZSBGTVRfQ09ERShfRlVOREFNRU5UQUxfVFlQRV9QLCBfVUJfQ09OU1RfUCwgX0xCX0NPTlNUX1ApIFwKLSAoKChfRlVOREFNRU5UQUxfVFlQRV9QKSA/IDAgOiA0KQlcCi0gIHwgKChfVUJfQ09OU1RfUCkgPyAwIDogMikJCVwKLSAgfCAoKF9MQl9DT05TVF9QKSA/IDAgOiAxKSkKLQotLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlIHsKLSAgICBMQU5HX0M4OQkJPSAweDAwMDAwMDAxLAotICAgIExBTkdfQwkJPSAweDAwMDAwMDAyLAotICAgIExBTkdfQURBODMJCT0gMHgwMDAwMDAwMywKLSAgICBMQU5HX0NfUExVU19QTFVTCT0gMHgwMDAwMDAwNCwKLSAgICBMQU5HX0NPQk9MNzQJPSAweDAwMDAwMDA1LAotICAgIExBTkdfQ09CT0w4NQk9IDB4MDAwMDAwMDYsCi0gICAgTEFOR19GT1JUUkFONzcJPSAweDAwMDAwMDA3LAotICAgIExBTkdfRk9SVFJBTjkwCT0gMHgwMDAwMDAwOCwKLSAgICBMQU5HX1BBU0NBTDgzCT0gMHgwMDAwMDAwOSwKLSAgICBMQU5HX01PRFVMQTIJPSAweDAwMDAwMDBhLAotCi0gICAgLyogR05VIGV4dGVuc2lvbnMgKi8KLQotICAgIExBTkdfQ0hJTEwJCT0gMHgwMDAwOWFmMywJLyogcmFuZG9tIHZhbHVlIGZvciBHTlUgQ2hpbGwgKi8KLSAgICBMQU5HX0pBVkEJCT0gMHgwMDAwOWFmNCAgICAvKiByYW5kb20gdmFsdWUgKyAxIGZvciBHTlUgSmF2YSAqLwotfTsKLQotI2RlZmluZSBMQU5HX2xvX3VzZXIJMHgwMDAwODAwMCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBMQU5HX2hpX3VzZXIJMHgwMDAwZmZmZiAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KLQotLyogTmFtZXMgYW5kIGNvZGVzIGZvciBHTlUgIm1hY2luZm8iIGV4dGVuc2lvbi4gICovCi0KLWVudW0gZHdhcmZfbWFjaW5mb19yZWNvcmRfdHlwZSB7Ci0gICAgTUFDSU5GT19zdGFydAk9ICdzJywKLSAgICBNQUNJTkZPX3Jlc3VtZQk9ICdyJywKLSAgICBNQUNJTkZPX2RlZmluZQk9ICdkJywKLSAgICBNQUNJTkZPX3VuZGVmCT0gJ3UnCi19OwotCi0jZW5kaWYgLyogX0VMRl9EV0FSRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kd2FyZjIuaCBiL2luY2x1ZGUvZWxmL2R3YXJmMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmQ0ZmE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2R3YXJmMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2YgY29kZXMgcmVsYXRpbmcgdG8gdGhlIERXQVJGIHN5bWJvbGljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEdhcnkgRnVuY2sgKGdhcnlAaW50cmVwaWQuY29tKSBUaGUgQWRhIEpvaW50IFByb2dyYW0KLSAgIE9mZmljZSAoQUpQTyksIEZsb3JpZGEgU3RhdGUgVW52aXZlcnNpdHkgYW5kIFNpbGljb24gR3JhcGhpY3MgSW5jLgotICAgcHJvdmlkZWQgc3VwcG9ydCBmb3IgdGhpcyBlZmZvcnQgLS0gSnVuZSAyMSwgMTk5NS4KLQotICAgRGVyaXZlZCBmcm9tIHRoZSBEV0FSRiAxIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgUm9uIEd1aWxtZXR0ZQotICAgKHJmZ0BuZXRjb20uY29tKSwgTm92ZW1iZXIgMTk5MC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotCi1HTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci1sYXRlciB2ZXJzaW9uLgotCi1HTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLUFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1mb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIERXQVJGIHNwZWNpZmljYXRpb24gKGEgcHVibGljIGRvY3VtZW50KQotICAgUmV2aXNpb24gMi4wLjAgKEp1bHkgMjcsIDE5OTMpIGRldmVsb3BlZCBieSB0aGUgVU5JWCBJbnRlcm5hdGlvbmFsCi0gICBQcm9ncmFtbWluZyBMYW5ndWFnZXMgU3BlY2lhbCBJbnRlcmVzdCBHcm91cCAoVUkvUExTSUcpIGFuZCBkaXN0cmlidXRlZAotICAgYnkgVU5JWCBJbnRlcm5hdGlvbmFsLiAgQ29waWVzIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBhcmUgYXZhaWxhYmxlIGZyb20KLSAgIFVOSVggSW50ZXJuYXRpb25hbCwgMjAgV2F0ZXJ2aWV3IEJvdWxldmFyZCwgUGFyc2lwcGFueSwgTkosIDA3MDU0LiAgKi8KLQotI2lmbmRlZiBfRUxGX0RXQVJGMl9ICi0jZGVmaW5lIF9FTEZfRFdBUkYyX0gKLQotLyogU3RydWN0dXJlIGZvdW5kIGluIHRoZSAuZGVidWdfbGluZSBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGVuZ3RoICAgICAgICAgIFs0XTsKLSAgdW5zaWduZWQgY2hhciBsaV92ZXJzaW9uICAgICAgICAgWzJdOwotICB1bnNpZ25lZCBjaGFyIGxpX3Byb2xvZ3VlX2xlbmd0aCBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbWluX2luc25fbGVuZ3RoIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9kZWZhdWx0X2lzX3N0bXQgWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX2xpbmVfYmFzZSAgICAgICBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGluZV9yYW5nZSAgICAgIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9vcGNvZGVfYmFzZSAgICAgWzFdOwotfQotRFdBUkYyX0V4dGVybmFsX0xpbmVJbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBsaV9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IGxpX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGludCAgIGxpX3Byb2xvZ3VlX2xlbmd0aDsKLSAgdW5zaWduZWQgY2hhciAgbGlfbWluX2luc25fbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICBsaV9kZWZhdWx0X2lzX3N0bXQ7Ci0gIGludCAgICAgICAgICAgIGxpX2xpbmVfYmFzZTsKLSAgdW5zaWduZWQgY2hhciAgbGlfbGluZV9yYW5nZTsKLSAgdW5zaWduZWQgY2hhciAgbGlfb3Bjb2RlX2Jhc2U7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfTGluZUluZm87Ci0KLS8qIFN0cnVjdHVyZSBmb3VuZCBpbiAuZGVidWdfcHVibmFtZXMgc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIHBuX2xlbmd0aCAgWzRdOwotICB1bnNpZ25lZCBjaGFyIHBuX3ZlcnNpb24gWzJdOwotICB1bnNpZ25lZCBjaGFyIHBuX29mZnNldCAgWzRdOwotICB1bnNpZ25lZCBjaGFyIHBuX3NpemUgICAgWzRdOwotfQotRFdBUkYyX0V4dGVybmFsX1B1Yk5hbWVzOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBwbl9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IHBuX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGxvbmcgIHBuX29mZnNldDsKLSAgdW5zaWduZWQgbG9uZyAgcG5fc2l6ZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9QdWJOYW1lczsKLQotLyogU3RyY3V0dXJlIGZvdW5kIGluIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciAgY3VfbGVuZ3RoICAgICAgICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGN1X3ZlcnNpb24gICAgICAgWzJdOwotICB1bnNpZ25lZCBjaGFyICBjdV9hYmJyZXZfb2Zmc2V0IFs0XTsKLSAgdW5zaWduZWQgY2hhciAgY3VfcG9pbnRlcl9zaXplICBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfQ29tcFVuaXQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIGN1X2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgY3VfdmVyc2lvbjsKLSAgdW5zaWduZWQgbG9uZyAgY3VfYWJicmV2X29mZnNldDsKLSAgdW5zaWduZWQgY2hhciAgY3VfcG9pbnRlcl9zaXplOwotfQotRFdBUkYyX0ludGVybmFsX0NvbXBVbml0OwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICBhcl9sZW5ndGggICAgICAgWzRdOwotICB1bnNpZ25lZCBjaGFyICBhcl92ZXJzaW9uICAgICAgWzJdOwotICB1bnNpZ25lZCBjaGFyICBhcl9pbmZvX29mZnNldCAgWzRdOwotICB1bnNpZ25lZCBjaGFyICBhcl9wb2ludGVyX3NpemUgWzFdOwotICB1bnNpZ25lZCBjaGFyICBhcl9zZWdtZW50X3NpemUgWzFdOwotfQotRFdBUkYyX0V4dGVybmFsX0FSYW5nZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZyAgYXJfbGVuZ3RoOwotICB1bnNpZ25lZCBzaG9ydCBhcl92ZXJzaW9uOwotICB1bnNpZ25lZCBsb25nICBhcl9pbmZvX29mZnNldDsKLSAgdW5zaWduZWQgY2hhciAgYXJfcG9pbnRlcl9zaXplOwotICB1bnNpZ25lZCBjaGFyICBhcl9zZWdtZW50X3NpemU7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfQVJhbmdlOwotCi0KLS8qIFRhZyBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3RhZwotICB7Ci0gICAgRFdfVEFHX3BhZGRpbmcgPSAweDAwLAotICAgIERXX1RBR19hcnJheV90eXBlID0gMHgwMSwKLSAgICBEV19UQUdfY2xhc3NfdHlwZSA9IDB4MDIsCi0gICAgRFdfVEFHX2VudHJ5X3BvaW50ID0gMHgwMywKLSAgICBEV19UQUdfZW51bWVyYXRpb25fdHlwZSA9IDB4MDQsCi0gICAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIgPSAweDA1LAotICAgIERXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbiA9IDB4MDgsCi0gICAgRFdfVEFHX2xhYmVsID0gMHgwYSwKLSAgICBEV19UQUdfbGV4aWNhbF9ibG9jayA9IDB4MGIsCi0gICAgRFdfVEFHX21lbWJlciA9IDB4MGQsCi0gICAgRFdfVEFHX3BvaW50ZXJfdHlwZSA9IDB4MGYsCi0gICAgRFdfVEFHX3JlZmVyZW5jZV90eXBlID0gMHgxMCwKLSAgICBEV19UQUdfY29tcGlsZV91bml0ID0gMHgxMSwKLSAgICBEV19UQUdfc3RyaW5nX3R5cGUgPSAweDEyLAotICAgIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSA9IDB4MTMsCi0gICAgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSA9IDB4MTUsCi0gICAgRFdfVEFHX3R5cGVkZWYgPSAweDE2LAotICAgIERXX1RBR191bmlvbl90eXBlID0gMHgxNywKLSAgICBEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycyA9IDB4MTgsCi0gICAgRFdfVEFHX3ZhcmlhbnQgPSAweDE5LAotICAgIERXX1RBR19jb21tb25fYmxvY2sgPSAweDFhLAotICAgIERXX1RBR19jb21tb25faW5jbHVzaW9uID0gMHgxYiwKLSAgICBEV19UQUdfaW5oZXJpdGFuY2UgPSAweDFjLAotICAgIERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUgPSAweDFkLAotICAgIERXX1RBR19tb2R1bGUgPSAweDFlLAotICAgIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUgPSAweDFmLAotICAgIERXX1RBR19zZXRfdHlwZSA9IDB4MjAsCi0gICAgRFdfVEFHX3N1YnJhbmdlX3R5cGUgPSAweDIxLAotICAgIERXX1RBR193aXRoX3N0bXQgPSAweDIyLAotICAgIERXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb24gPSAweDIzLAotICAgIERXX1RBR19iYXNlX3R5cGUgPSAweDI0LAotICAgIERXX1RBR19jYXRjaF9ibG9jayA9IDB4MjUsCi0gICAgRFdfVEFHX2NvbnN0X3R5cGUgPSAweDI2LAotICAgIERXX1RBR19jb25zdGFudCA9IDB4MjcsCi0gICAgRFdfVEFHX2VudW1lcmF0b3IgPSAweDI4LAotICAgIERXX1RBR19maWxlX3R5cGUgPSAweDI5LAotICAgIERXX1RBR19mcmllbmQgPSAweDJhLAotICAgIERXX1RBR19uYW1lbGlzdCA9IDB4MmIsCi0gICAgRFdfVEFHX25hbWVsaXN0X2l0ZW0gPSAweDJjLAotICAgIERXX1RBR19wYWNrZWRfdHlwZSA9IDB4MmQsCi0gICAgRFdfVEFHX3N1YnByb2dyYW0gPSAweDJlLAotICAgIERXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtID0gMHgyZiwKLSAgICBEV19UQUdfdGVtcGxhdGVfdmFsdWVfcGFyYW0gPSAweDMwLAotICAgIERXX1RBR190aHJvd25fdHlwZSA9IDB4MzEsCi0gICAgRFdfVEFHX3RyeV9ibG9jayA9IDB4MzIsCi0gICAgRFdfVEFHX3ZhcmlhbnRfcGFydCA9IDB4MzMsCi0gICAgRFdfVEFHX3ZhcmlhYmxlID0gMHgzNCwKLSAgICBEV19UQUdfdm9sYXRpbGVfdHlwZSA9IDB4MzUsCi0gICAgLyogU0dJL01JUFMgRXh0ZW5zaW9ucyAqLwotICAgIERXX1RBR19NSVBTX2xvb3AgPSAweDQwODEsCi0gICAgLyogR05VIGV4dGVuc2lvbnMgKi8KLSAgICBEV19UQUdfZm9ybWF0X2xhYmVsID0gMHg0MTAxLAkvKiBmb3IgRk9SVFJBTiA3NyBhbmQgRm9ydHJhbiA5MCAqLwotICAgIERXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZSA9IDB4NDEwMiwJLyogZm9yIEMrKyAqLwotICAgIERXX1RBR19jbGFzc190ZW1wbGF0ZSA9IDB4NDEwMwkvKiBmb3IgQysrICovCi0gIH07Ci0KLSNkZWZpbmUgRFdfVEFHX2xvX3VzZXIJMHg0MDgwCi0jZGVmaW5lIERXX1RBR19oaV91c2VyCTB4ZmZmZgotCi0vKiBmbGFnIHRoYXQgdGVsbHMgd2hldGhlciBlbnRyeSBoYXMgYSBjaGlsZCBvciBub3QgKi8KLSNkZWZpbmUgRFdfY2hpbGRyZW5fbm8gICAwCi0jZGVmaW5lCURXX2NoaWxkcmVuX3llcyAgMQotCi0vKiBGb3JtIG5hbWVzIGFuZCBjb2Rlcy4gICovCi1lbnVtIGR3YXJmX2Zvcm0KLSAgewotICAgIERXX0ZPUk1fYWRkciA9IDB4MDEsCi0gICAgRFdfRk9STV9ibG9jazIgPSAweDAzLAotICAgIERXX0ZPUk1fYmxvY2s0ID0gMHgwNCwKLSAgICBEV19GT1JNX2RhdGEyID0gMHgwNSwKLSAgICBEV19GT1JNX2RhdGE0ID0gMHgwNiwKLSAgICBEV19GT1JNX2RhdGE4ID0gMHgwNywKLSAgICBEV19GT1JNX3N0cmluZyA9IDB4MDgsCi0gICAgRFdfRk9STV9ibG9jayA9IDB4MDksCi0gICAgRFdfRk9STV9ibG9jazEgPSAweDBhLAotICAgIERXX0ZPUk1fZGF0YTEgPSAweDBiLAotICAgIERXX0ZPUk1fZmxhZyA9IDB4MGMsCi0gICAgRFdfRk9STV9zZGF0YSA9IDB4MGQsCi0gICAgRFdfRk9STV9zdHJwID0gMHgwZSwKLSAgICBEV19GT1JNX3VkYXRhID0gMHgwZiwKLSAgICBEV19GT1JNX3JlZl9hZGRyID0gMHgxMCwKLSAgICBEV19GT1JNX3JlZjEgPSAweDExLAotICAgIERXX0ZPUk1fcmVmMiA9IDB4MTIsCi0gICAgRFdfRk9STV9yZWY0ID0gMHgxMywKLSAgICBEV19GT1JNX3JlZjggPSAweDE0LAotICAgIERXX0ZPUk1fcmVmX3VkYXRhID0gMHgxNSwKLSAgICBEV19GT1JNX2luZGlyZWN0ID0gMHgxNgotICB9OwotCi0vKiBBdHRyaWJ1dGUgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9hdHRyaWJ1dGUKLSAgewotICAgIERXX0FUX3NpYmxpbmcgPSAweDAxLAotICAgIERXX0FUX2xvY2F0aW9uID0gMHgwMiwKLSAgICBEV19BVF9uYW1lID0gMHgwMywKLSAgICBEV19BVF9vcmRlcmluZyA9IDB4MDksCi0gICAgRFdfQVRfc3Vic2NyX2RhdGEgPSAweDBhLAotICAgIERXX0FUX2J5dGVfc2l6ZSA9IDB4MGIsCi0gICAgRFdfQVRfYml0X29mZnNldCA9IDB4MGMsCi0gICAgRFdfQVRfYml0X3NpemUgPSAweDBkLAotICAgIERXX0FUX2VsZW1lbnRfbGlzdCA9IDB4MGYsCi0gICAgRFdfQVRfc3RtdF9saXN0ID0gMHgxMCwKLSAgICBEV19BVF9sb3dfcGMgPSAweDExLAotICAgIERXX0FUX2hpZ2hfcGMgPSAweDEyLAotICAgIERXX0FUX2xhbmd1YWdlID0gMHgxMywKLSAgICBEV19BVF9tZW1iZXIgPSAweDE0LAotICAgIERXX0FUX2Rpc2NyID0gMHgxNSwKLSAgICBEV19BVF9kaXNjcl92YWx1ZSA9IDB4MTYsCi0gICAgRFdfQVRfdmlzaWJpbGl0eSA9IDB4MTcsCi0gICAgRFdfQVRfaW1wb3J0ID0gMHgxOCwKLSAgICBEV19BVF9zdHJpbmdfbGVuZ3RoID0gMHgxOSwKLSAgICBEV19BVF9jb21tb25fcmVmZXJlbmNlID0gMHgxYSwKLSAgICBEV19BVF9jb21wX2RpciA9IDB4MWIsCi0gICAgRFdfQVRfY29uc3RfdmFsdWUgPSAweDFjLAotICAgIERXX0FUX2NvbnRhaW5pbmdfdHlwZSA9IDB4MWQsCi0gICAgRFdfQVRfZGVmYXVsdF92YWx1ZSA9IDB4MWUsCi0gICAgRFdfQVRfaW5saW5lID0gMHgyMCwKLSAgICBEV19BVF9pc19vcHRpb25hbCA9IDB4MjEsCi0gICAgRFdfQVRfbG93ZXJfYm91bmQgPSAweDIyLAotICAgIERXX0FUX3Byb2R1Y2VyID0gMHgyNSwKLSAgICBEV19BVF9wcm90b3R5cGVkID0gMHgyNywKLSAgICBEV19BVF9yZXR1cm5fYWRkciA9IDB4MmEsCi0gICAgRFdfQVRfc3RhcnRfc2NvcGUgPSAweDJjLAotICAgIERXX0FUX3N0cmlkZV9zaXplID0gMHgyZSwKLSAgICBEV19BVF91cHBlcl9ib3VuZCA9IDB4MmYsCi0gICAgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luID0gMHgzMSwKLSAgICBEV19BVF9hY2Nlc3NpYmlsaXR5ID0gMHgzMiwKLSAgICBEV19BVF9hZGRyZXNzX2NsYXNzID0gMHgzMywKLSAgICBEV19BVF9hcnRpZmljaWFsID0gMHgzNCwKLSAgICBEV19BVF9iYXNlX3R5cGVzID0gMHgzNSwKLSAgICBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb24gPSAweDM2LAotICAgIERXX0FUX2NvdW50ID0gMHgzNywKLSAgICBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbiA9IDB4MzgsCi0gICAgRFdfQVRfZGVjbF9jb2x1bW4gPSAweDM5LAotICAgIERXX0FUX2RlY2xfZmlsZSA9IDB4M2EsCi0gICAgRFdfQVRfZGVjbF9saW5lID0gMHgzYiwKLSAgICBEV19BVF9kZWNsYXJhdGlvbiA9IDB4M2MsCi0gICAgRFdfQVRfZGlzY3JfbGlzdCA9IDB4M2QsCi0gICAgRFdfQVRfZW5jb2RpbmcgPSAweDNlLAotICAgIERXX0FUX2V4dGVybmFsID0gMHgzZiwKLSAgICBEV19BVF9mcmFtZV9iYXNlID0gMHg0MCwKLSAgICBEV19BVF9mcmllbmQgPSAweDQxLAotICAgIERXX0FUX2lkZW50aWZpZXJfY2FzZSA9IDB4NDIsCi0gICAgRFdfQVRfbWFjcm9faW5mbyA9IDB4NDMsCi0gICAgRFdfQVRfbmFtZWxpc3RfaXRlbXMgPSAweDQ0LAotICAgIERXX0FUX3ByaW9yaXR5ID0gMHg0NSwKLSAgICBEV19BVF9zZWdtZW50ID0gMHg0NiwKLSAgICBEV19BVF9zcGVjaWZpY2F0aW9uID0gMHg0NywKLSAgICBEV19BVF9zdGF0aWNfbGluayA9IDB4NDgsCi0gICAgRFdfQVRfdHlwZSA9IDB4NDksCi0gICAgRFdfQVRfdXNlX2xvY2F0aW9uID0gMHg0YSwKLSAgICBEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXIgPSAweDRiLAotICAgIERXX0FUX3ZpcnR1YWxpdHkgPSAweDRjLAotICAgIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uID0gMHg0ZCwKLSAgICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCi0gICAgRFdfQVRfTUlQU19mZGUgPSAweDIwMDEsCi0gICAgRFdfQVRfTUlQU19sb29wX2JlZ2luID0gMHgyMDAyLAotICAgIERXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luID0gMHgyMDAzLAotICAgIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luID0gMHgyMDA0LAotICAgIERXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yID0gMHgyMDA1LAotICAgIERXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGggPSAweDIwMDYsCi0gICAgRFdfQVRfTUlQU19saW5rYWdlX25hbWUgPSAweDIwMDcsCi0gICAgRFdfQVRfTUlQU19zdHJpZGUgPSAweDIwMDgsCi0gICAgRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lID0gMHgyMDA5LAotICAgIERXX0FUX01JUFNfY2xvbmVfb3JpZ2luID0gMHgyMDBhLAotICAgIERXX0FUX01JUFNfaGFzX2lubGluZXMgPSAweDIwMGIsCi0gICAgLyogR05VIGV4dGVuc2lvbnMuICAqLwotICAgIERXX0FUX3NmX25hbWVzID0gMHgyMTAxLAotICAgIERXX0FUX3NyY19pbmZvID0gMHgyMTAyLAotICAgIERXX0FUX21hY19pbmZvID0gMHgyMTAzLAotICAgIERXX0FUX3NyY19jb29yZHMgPSAweDIxMDQsCi0gICAgRFdfQVRfYm9keV9iZWdpbiA9IDB4MjEwNSwKLSAgICBEV19BVF9ib2R5X2VuZCA9IDB4MjEwNgotICB9OwotCi0jZGVmaW5lIERXX0FUX2xvX3VzZXIJMHgyMDAwCS8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRFdfQVRfaGlfdXNlcgkweDNmZjAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KLQotLyogTG9jYXRpb24gYXRvbSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2xvY2F0aW9uX2F0b20KLSAgewotICAgIERXX09QX2FkZHIgPSAweDAzLAotICAgIERXX09QX2RlcmVmID0gMHgwNiwKLSAgICBEV19PUF9jb25zdDF1ID0gMHgwOCwKLSAgICBEV19PUF9jb25zdDFzID0gMHgwOSwKLSAgICBEV19PUF9jb25zdDJ1ID0gMHgwYSwKLSAgICBEV19PUF9jb25zdDJzID0gMHgwYiwKLSAgICBEV19PUF9jb25zdDR1ID0gMHgwYywKLSAgICBEV19PUF9jb25zdDRzID0gMHgwZCwKLSAgICBEV19PUF9jb25zdDh1ID0gMHgwZSwKLSAgICBEV19PUF9jb25zdDhzID0gMHgwZiwKLSAgICBEV19PUF9jb25zdHUgPSAweDEwLAotICAgIERXX09QX2NvbnN0cyA9IDB4MTEsCi0gICAgRFdfT1BfZHVwID0gMHgxMiwKLSAgICBEV19PUF9kcm9wID0gMHgxMywKLSAgICBEV19PUF9vdmVyID0gMHgxNCwKLSAgICBEV19PUF9waWNrID0gMHgxNSwKLSAgICBEV19PUF9zd2FwID0gMHgxNiwKLSAgICBEV19PUF9yb3QgPSAweDE3LAotICAgIERXX09QX3hkZXJlZiA9IDB4MTgsCi0gICAgRFdfT1BfYWJzID0gMHgxOSwKLSAgICBEV19PUF9hbmQgPSAweDFhLAotICAgIERXX09QX2RpdiA9IDB4MWIsCi0gICAgRFdfT1BfbWludXMgPSAweDFjLAotICAgIERXX09QX21vZCA9IDB4MWQsCi0gICAgRFdfT1BfbXVsID0gMHgxZSwKLSAgICBEV19PUF9uZWcgPSAweDFmLAotICAgIERXX09QX25vdCA9IDB4MjAsCi0gICAgRFdfT1Bfb3IgPSAweDIxLAotICAgIERXX09QX3BsdXMgPSAweDIyLAotICAgIERXX09QX3BsdXNfdWNvbnN0ID0gMHgyMywKLSAgICBEV19PUF9zaGwgPSAweDI0LAotICAgIERXX09QX3NociA9IDB4MjUsCi0gICAgRFdfT1Bfc2hyYSA9IDB4MjYsCi0gICAgRFdfT1BfeG9yID0gMHgyNywKLSAgICBEV19PUF9icmEgPSAweDI4LAotICAgIERXX09QX2VxID0gMHgyOSwKLSAgICBEV19PUF9nZSA9IDB4MmEsCi0gICAgRFdfT1BfZ3QgPSAweDJiLAotICAgIERXX09QX2xlID0gMHgyYywKLSAgICBEV19PUF9sdCA9IDB4MmQsCi0gICAgRFdfT1BfbmUgPSAweDJlLAotICAgIERXX09QX3NraXAgPSAweDJmLAotICAgIERXX09QX2xpdDAgPSAweDMwLAotICAgIERXX09QX2xpdDEgPSAweDMxLAotICAgIERXX09QX2xpdDIgPSAweDMyLAotICAgIERXX09QX2xpdDMgPSAweDMzLAotICAgIERXX09QX2xpdDQgPSAweDM0LAotICAgIERXX09QX2xpdDUgPSAweDM1LAotICAgIERXX09QX2xpdDYgPSAweDM2LAotICAgIERXX09QX2xpdDcgPSAweDM3LAotICAgIERXX09QX2xpdDggPSAweDM4LAotICAgIERXX09QX2xpdDkgPSAweDM5LAotICAgIERXX09QX2xpdDEwID0gMHgzYSwKLSAgICBEV19PUF9saXQxMSA9IDB4M2IsCi0gICAgRFdfT1BfbGl0MTIgPSAweDNjLAotICAgIERXX09QX2xpdDEzID0gMHgzZCwKLSAgICBEV19PUF9saXQxNCA9IDB4M2UsCi0gICAgRFdfT1BfbGl0MTUgPSAweDNmLAotICAgIERXX09QX2xpdDE2ID0gMHg0MCwKLSAgICBEV19PUF9saXQxNyA9IDB4NDEsCi0gICAgRFdfT1BfbGl0MTggPSAweDQyLAotICAgIERXX09QX2xpdDE5ID0gMHg0MywKLSAgICBEV19PUF9saXQyMCA9IDB4NDQsCi0gICAgRFdfT1BfbGl0MjEgPSAweDQ1LAotICAgIERXX09QX2xpdDIyID0gMHg0NiwKLSAgICBEV19PUF9saXQyMyA9IDB4NDcsCi0gICAgRFdfT1BfbGl0MjQgPSAweDQ4LAotICAgIERXX09QX2xpdDI1ID0gMHg0OSwKLSAgICBEV19PUF9saXQyNiA9IDB4NGEsCi0gICAgRFdfT1BfbGl0MjcgPSAweDRiLAotICAgIERXX09QX2xpdDI4ID0gMHg0YywKLSAgICBEV19PUF9saXQyOSA9IDB4NGQsCi0gICAgRFdfT1BfbGl0MzAgPSAweDRlLAotICAgIERXX09QX2xpdDMxID0gMHg0ZiwKLSAgICBEV19PUF9yZWcwID0gMHg1MCwKLSAgICBEV19PUF9yZWcxID0gMHg1MSwKLSAgICBEV19PUF9yZWcyID0gMHg1MiwKLSAgICBEV19PUF9yZWczID0gMHg1MywKLSAgICBEV19PUF9yZWc0ID0gMHg1NCwKLSAgICBEV19PUF9yZWc1ID0gMHg1NSwKLSAgICBEV19PUF9yZWc2ID0gMHg1NiwKLSAgICBEV19PUF9yZWc3ID0gMHg1NywKLSAgICBEV19PUF9yZWc4ID0gMHg1OCwKLSAgICBEV19PUF9yZWc5ID0gMHg1OSwKLSAgICBEV19PUF9yZWcxMCA9IDB4NWEsCi0gICAgRFdfT1BfcmVnMTEgPSAweDViLAotICAgIERXX09QX3JlZzEyID0gMHg1YywKLSAgICBEV19PUF9yZWcxMyA9IDB4NWQsCi0gICAgRFdfT1BfcmVnMTQgPSAweDVlLAotICAgIERXX09QX3JlZzE1ID0gMHg1ZiwKLSAgICBEV19PUF9yZWcxNiA9IDB4NjAsCi0gICAgRFdfT1BfcmVnMTcgPSAweDYxLAotICAgIERXX09QX3JlZzE4ID0gMHg2MiwKLSAgICBEV19PUF9yZWcxOSA9IDB4NjMsCi0gICAgRFdfT1BfcmVnMjAgPSAweDY0LAotICAgIERXX09QX3JlZzIxID0gMHg2NSwKLSAgICBEV19PUF9yZWcyMiA9IDB4NjYsCi0gICAgRFdfT1BfcmVnMjMgPSAweDY3LAotICAgIERXX09QX3JlZzI0ID0gMHg2OCwKLSAgICBEV19PUF9yZWcyNSA9IDB4NjksCi0gICAgRFdfT1BfcmVnMjYgPSAweDZhLAotICAgIERXX09QX3JlZzI3ID0gMHg2YiwKLSAgICBEV19PUF9yZWcyOCA9IDB4NmMsCi0gICAgRFdfT1BfcmVnMjkgPSAweDZkLAotICAgIERXX09QX3JlZzMwID0gMHg2ZSwKLSAgICBEV19PUF9yZWczMSA9IDB4NmYsCi0gICAgRFdfT1BfYnJlZzAgPSAweDcwLAotICAgIERXX09QX2JyZWcxID0gMHg3MSwKLSAgICBEV19PUF9icmVnMiA9IDB4NzIsCi0gICAgRFdfT1BfYnJlZzMgPSAweDczLAotICAgIERXX09QX2JyZWc0ID0gMHg3NCwKLSAgICBEV19PUF9icmVnNSA9IDB4NzUsCi0gICAgRFdfT1BfYnJlZzYgPSAweDc2LAotICAgIERXX09QX2JyZWc3ID0gMHg3NywKLSAgICBEV19PUF9icmVnOCA9IDB4NzgsCi0gICAgRFdfT1BfYnJlZzkgPSAweDc5LAotICAgIERXX09QX2JyZWcxMCA9IDB4N2EsCi0gICAgRFdfT1BfYnJlZzExID0gMHg3YiwKLSAgICBEV19PUF9icmVnMTIgPSAweDdjLAotICAgIERXX09QX2JyZWcxMyA9IDB4N2QsCi0gICAgRFdfT1BfYnJlZzE0ID0gMHg3ZSwKLSAgICBEV19PUF9icmVnMTUgPSAweDdmLAotICAgIERXX09QX2JyZWcxNiA9IDB4ODAsCi0gICAgRFdfT1BfYnJlZzE3ID0gMHg4MSwKLSAgICBEV19PUF9icmVnMTggPSAweDgyLAotICAgIERXX09QX2JyZWcxOSA9IDB4ODMsCi0gICAgRFdfT1BfYnJlZzIwID0gMHg4NCwKLSAgICBEV19PUF9icmVnMjEgPSAweDg1LAotICAgIERXX09QX2JyZWcyMiA9IDB4ODYsCi0gICAgRFdfT1BfYnJlZzIzID0gMHg4NywKLSAgICBEV19PUF9icmVnMjQgPSAweDg4LAotICAgIERXX09QX2JyZWcyNSA9IDB4ODksCi0gICAgRFdfT1BfYnJlZzI2ID0gMHg4YSwKLSAgICBEV19PUF9icmVnMjcgPSAweDhiLAotICAgIERXX09QX2JyZWcyOCA9IDB4OGMsCi0gICAgRFdfT1BfYnJlZzI5ID0gMHg4ZCwKLSAgICBEV19PUF9icmVnMzAgPSAweDhlLAotICAgIERXX09QX2JyZWczMSA9IDB4OGYsCi0gICAgRFdfT1BfcmVneCA9IDB4OTAsCi0gICAgRFdfT1BfZmJyZWcgPSAweDkxLAotICAgIERXX09QX2JyZWd4ID0gMHg5MiwKLSAgICBEV19PUF9waWVjZSA9IDB4OTMsCi0gICAgRFdfT1BfZGVyZWZfc2l6ZSA9IDB4OTQsCi0gICAgRFdfT1BfeGRlcmVmX3NpemUgPSAweDk1LAotICAgIERXX09QX25vcCA9IDB4OTYKLSAgfTsKLQotI2RlZmluZSBEV19PUF9sb191c2VyCTB4ODAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19PUF9oaV91c2VyCTB4ZmYJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KLQotLyogVHlwZSBlbmNvZGluZ3MuICAqLwotCi1lbnVtIGR3YXJmX3R5cGUKLSAgewotICAgIERXX0FURV92b2lkID0gMHgwLAotICAgIERXX0FURV9hZGRyZXNzID0gMHgxLAotICAgIERXX0FURV9ib29sZWFuID0gMHgyLAotICAgIERXX0FURV9jb21wbGV4X2Zsb2F0ID0gMHgzLAotICAgIERXX0FURV9mbG9hdCA9IDB4NCwKLSAgICBEV19BVEVfc2lnbmVkID0gMHg1LAotICAgIERXX0FURV9zaWduZWRfY2hhciA9IDB4NiwKLSAgICBEV19BVEVfdW5zaWduZWQgPSAweDcsCi0gICAgRFdfQVRFX3Vuc2lnbmVkX2NoYXIgPSAweDgKLSAgfTsKLQotI2RlZmluZQlEV19BVEVfbG9fdXNlciAweDgwCi0jZGVmaW5lCURXX0FURV9oaV91c2VyIDB4ZmYKLQotLyogQXJyYXkgb3JkZXJpbmcgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLWVudW0gZHdhcmZfYXJyYXlfZGltX29yZGVyaW5nCi0gIHsKLSAgICBEV19PUkRfcm93X21ham9yID0gMCwKLSAgICBEV19PUkRfY29sX21ham9yID0gMQotICB9OwotCi0vKiBhY2Nlc3MgYXR0cmlidXRlICovCi1lbnVtIGR3YXJmX2FjY2Vzc19hdHRyaWJ1dGUKLSAgewotICAgIERXX0FDQ0VTU19wdWJsaWMgPSAxLAotICAgIERXX0FDQ0VTU19wcm90ZWN0ZWQgPSAyLAotICAgIERXX0FDQ0VTU19wcml2YXRlID0gMwotICB9OwotCi0vKiB2aXNpYmlsaXR5ICovCi1lbnVtIGR3YXJmX3Zpc2liaWxpdHlfYXR0cmlidXRlCi0gIHsKLSAgICBEV19WSVNfbG9jYWwgPSAxLAotICAgIERXX1ZJU19leHBvcnRlZCA9IDIsCi0gICAgRFdfVklTX3F1YWxpZmllZCA9IDMKLSAgfTsKLQotLyogdmlydHVhbGl0eSAqLwotZW51bSBkd2FyZl92aXJ0dWFsaXR5X2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfVklSVFVBTElUWV9ub25lID0gMCwKLSAgICBEV19WSVJUVUFMSVRZX3ZpcnR1YWwgPSAxLAotICAgIERXX1ZJUlRVQUxJVFlfcHVyZV92aXJ0dWFsID0gMgotICB9OwotCi0vKiBjYXNlIHNlbnNpdGl2aXR5ICovCi1lbnVtIGR3YXJmX2lkX2Nhc2UKLSAgewotICAgIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlID0gMCwKLSAgICBEV19JRF91cF9jYXNlID0gMSwKLSAgICBEV19JRF9kb3duX2Nhc2UgPSAyLAotICAgIERXX0lEX2Nhc2VfaW5zZW5zaXRpdmUgPSAzCi0gIH07Ci0KLS8qIGNhbGxpbmcgY29udmVudGlvbiAqLwotZW51bSBkd2FyZl9jYWxsaW5nX2NvbnZlbnRpb24KLSAgewotICAgIERXX0NDX25vcm1hbCA9IDB4MSwKLSAgICBEV19DQ19wcm9ncmFtID0gMHgyLAotICAgIERXX0NDX25vY2FsbCA9IDB4MwotICB9OwotCi0jZGVmaW5lIERXX0NDX2xvX3VzZXIgMHg0MAotI2RlZmluZSBEV19DQ19oaV91c2VyIDB4ZmYKLQotLyogaW5saW5lIGF0dHJpYnV0ZSAqLwotZW51bSBkd2FyZl9pbmxpbmVfYXR0cmlidXRlCi0gIHsKLSAgICBEV19JTkxfbm90X2lubGluZWQgPSAwLAotICAgIERXX0lOTF9pbmxpbmVkID0gMSwKLSAgICBEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWQgPSAyLAotICAgIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkID0gMwotICB9OwotCi0vKiBkZXNjcmltaW5hbnQgbGlzdHMgKi8KLWVudW0gZHdhcmZfZGVzY3JpbV9saXN0Ci0gIHsKLSAgICBEV19EU0NfbGFiZWwgPSAwLAotICAgIERXX0RTQ19yYW5nZSA9IDEKLSAgfTsKLQotLyogbGluZSBudW1iZXIgb3Bjb2RlcyAqLwotZW51bSBkd2FyZl9saW5lX251bWJlcl9vcHMKLSAgewotICAgIERXX0xOU19leHRlbmRlZF9vcCA9IDAsCi0gICAgRFdfTE5TX2NvcHkgPSAxLAotICAgIERXX0xOU19hZHZhbmNlX3BjID0gMiwKLSAgICBEV19MTlNfYWR2YW5jZV9saW5lID0gMywKLSAgICBEV19MTlNfc2V0X2ZpbGUgPSA0LAotICAgIERXX0xOU19zZXRfY29sdW1uID0gNSwKLSAgICBEV19MTlNfbmVnYXRlX3N0bXQgPSA2LAotICAgIERXX0xOU19zZXRfYmFzaWNfYmxvY2sgPSA3LAotICAgIERXX0xOU19jb25zdF9hZGRfcGMgPSA4LAotICAgIERXX0xOU19maXhlZF9hZHZhbmNlX3BjID0gOQotICB9OwotCi0vKiBsaW5lIG51bWJlciBleHRlbmRlZCBvcGNvZGVzICovCi1lbnVtIGR3YXJmX2xpbmVfbnVtYmVyX3hfb3BzCi0gIHsKLSAgICBEV19MTkVfZW5kX3NlcXVlbmNlID0gMSwKLSAgICBEV19MTkVfc2V0X2FkZHJlc3MgPSAyLAotICAgIERXX0xORV9kZWZpbmVfZmlsZSA9IDMKLSAgfTsKLQotLyogY2FsbCBmcmFtZSBpbmZvcm1hdGlvbiAqLwotZW51bSBkd2FyZl9jYWxsX2ZyYW1lX2luZm8KLSAgewotICAgIERXX0NGQV9hZHZhbmNlX2xvYyA9IDB4NDAsCi0gICAgRFdfQ0ZBX29mZnNldCA9IDB4ODAsCi0gICAgRFdfQ0ZBX3Jlc3RvcmUgPSAweGMwLAotICAgIERXX0NGQV9ub3AgPSAweDAwLAotICAgIERXX0NGQV9zZXRfbG9jID0gMHgwMSwKLSAgICBEV19DRkFfYWR2YW5jZV9sb2MxID0gMHgwMiwKLSAgICBEV19DRkFfYWR2YW5jZV9sb2MyID0gMHgwMywKLSAgICBEV19DRkFfYWR2YW5jZV9sb2M0ID0gMHgwNCwKLSAgICBEV19DRkFfb2Zmc2V0X2V4dGVuZGVkID0gMHgwNSwKLSAgICBEV19DRkFfcmVzdG9yZV9leHRlbmRlZCA9IDB4MDYsCi0gICAgRFdfQ0ZBX3VuZGVmaW5lZCA9IDB4MDcsCi0gICAgRFdfQ0ZBX3NhbWVfdmFsdWUgPSAweDA4LAotICAgIERXX0NGQV9yZWdpc3RlciA9IDB4MDksCi0gICAgRFdfQ0ZBX3JlbWVtYmVyX3N0YXRlID0gMHgwYSwKLSAgICBEV19DRkFfcmVzdG9yZV9zdGF0ZSA9IDB4MGIsCi0gICAgRFdfQ0ZBX2RlZl9jZmEgPSAweDBjLAotICAgIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyID0gMHgwZCwKLSAgICBEV19DRkFfZGVmX2NmYV9vZmZzZXQgPSAweDBlLAotICAgIC8qIFNHSS9NSVBTIHNwZWNpZmljICovCi0gICAgRFdfQ0ZBX01JUFNfYWR2YW5jZV9sb2M4ID0gMHgxZAotICB9OwotCi0jZGVmaW5lIERXX0NJRV9JRAkgIDB4ZmZmZmZmZmYKLSNkZWZpbmUgRFdfQ0lFX1ZFUlNJT04JICAxCi0KLSNkZWZpbmUgRFdfQ0ZBX2V4dGVuZGVkICAgMAotI2RlZmluZSBEV19DRkFfbG93X3VzZXIgICAweDFjCi0jZGVmaW5lIERXX0NGQV9oaWdoX3VzZXIgIDB4M2YKLQotI2RlZmluZSBEV19DSElMRFJFTl9ubwkJICAgICAweDAwCi0jZGVmaW5lIERXX0NISUxEUkVOX3llcwkJICAgICAweDAxCi0KLSNkZWZpbmUgRFdfQUREUl9ub25lCQkwCi0KLS8qIFNvdXJjZSBsYW5ndWFnZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3NvdXJjZV9sYW5ndWFnZQotICB7Ci0gICAgRFdfTEFOR19DODkgPSAweDAwMDEsCi0gICAgRFdfTEFOR19DID0gMHgwMDAyLAotICAgIERXX0xBTkdfQWRhODMgPSAweDAwMDMsCi0gICAgRFdfTEFOR19DX3BsdXNfcGx1cyA9IDB4MDAwNCwKLSAgICBEV19MQU5HX0NvYm9sNzQgPSAweDAwMDUsCi0gICAgRFdfTEFOR19Db2JvbDg1ID0gMHgwMDA2LAotICAgIERXX0xBTkdfRm9ydHJhbjc3ID0gMHgwMDA3LAotICAgIERXX0xBTkdfRm9ydHJhbjkwID0gMHgwMDA4LAotICAgIERXX0xBTkdfUGFzY2FsODMgPSAweDAwMDksCi0gICAgRFdfTEFOR19Nb2R1bGEyID0gMHgwMDBhLAotICAgIERXX0xBTkdfSmF2YSA9IDB4OWFmNCwKLSAgICBEV19MQU5HX01pcHNfQXNzZW1ibGVyID0gMHg4MDAxCi0gIH07Ci0KLQotI2RlZmluZSBEV19MQU5HX2xvX3VzZXIgMHg4MDAwCS8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRFdfTEFOR19oaV91c2VyIDB4ZmZmZgkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0KLS8qIE5hbWVzIGFuZCBjb2RlcyBmb3IgbWFjcm8gaW5mb3JtYXRpb24uICAqLwotCi1lbnVtIGR3YXJmX21hY2luZm9fcmVjb3JkX3R5cGUKLSAgewotICAgIERXX01BQ0lORk9fZGVmaW5lID0gMSwKLSAgICBEV19NQUNJTkZPX3VuZGVmID0gMiwKLSAgICBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUgPSAzLAotICAgIERXX01BQ0lORk9fZW5kX2ZpbGUgPSA0LAotICAgIERXX01BQ0lORk9fdmVuZG9yX2V4dCA9IDI1NQotICB9OwotCi0jZW5kaWYgLyogX0VMRl9EV0FSRjJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZXh0ZXJuYWwuaCBiL2luY2x1ZGUvZWxmL2V4dGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWI3N2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZXh0ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IEVMRiBpcyByZXByZXNlbnRlZCBleHRlcm5hbGx5IGJ5IHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1maWxlIHJlcHJlc2VudGF0aW9uIG9mIEVMRi4gIEl0IHJlcXVpcmVzCi0gICB0aGUgZWxmLWNvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLQotLyogVGhlIDY0LWJpdCBzdHVmZiBpcyBraW5kIG9mIHJhbmRvbS4gIFBlcmhhcHMgc29tZW9uZSB3aWxsIHB1Ymxpc2ggYQotICAgc3BlYyBzb21lZGF5LiAgKi8KLQotI2lmbmRlZiBfRUxGX0VYVEVSTkFMX0gKLSNkZWZpbmUgX0VMRl9FWFRFUk5BTF9ICi0KLS8qIEVMRiBIZWFkZXIgKDMyLWJpdCBpbXBsZW1lbnRhdGlvbnMpICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgllX2lkZW50WzE2XTsJCS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLwotICB1bnNpZ25lZCBjaGFyCWVfdHlwZVsyXTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfbWFjaGluZVsyXTsJCS8qIFNwZWNpZmllcyByZXF1aXJlZCBhcmNoaXRlY3R1cmUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3ZlcnNpb25bNF07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHZlcnNpb24gKi8KLSAgdW5zaWduZWQgY2hhcgllX2VudHJ5WzRdOwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG9mZls0XTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG9mZls0XTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9mbGFnc1s0XTsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCWVfZWhzaXplWzJdOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waGVudHNpemVbMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG51bVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaGVudHNpemVbMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG51bVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaHN0cm5keFsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGYzMl9FeHRlcm5hbF9FaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJZV9pZGVudFsxNl07CQkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KLSAgdW5zaWduZWQgY2hhcgllX3R5cGVbMl07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcgllX21hY2hpbmVbMl07CQkvKiBTcGVjaWZpZXMgcmVxdWlyZWQgYXJjaGl0ZWN0dXJlICovCi0gIHVuc2lnbmVkIGNoYXIJZV92ZXJzaW9uWzRdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB2ZXJzaW9uICovCi0gIHVuc2lnbmVkIGNoYXIJZV9lbnRyeVs4XTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhvZmZbOF07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hvZmZbOF07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCWVfZmxhZ3NbNF07CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KLSAgdW5zaWduZWQgY2hhcgllX2Voc2l6ZVsyXTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhlbnRzaXplWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhudW1bMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hlbnRzaXplWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hudW1bMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hzdHJuZHhbMl07CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KLX0gRWxmNjRfRXh0ZXJuYWxfRWhkcjsKLQotLyogUHJvZ3JhbSBoZWFkZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXBfdHlwZVs0XTsJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX29mZnNldFs0XTsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglwX3ZhZGRyWzRdOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX3BhZGRyWzRdOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9maWxlc3pbNF07CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfbWVtc3pbNF07CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCi0gIHVuc2lnbmVkIGNoYXIJcF9mbGFnc1s0XTsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX2FsaWduWzRdOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KLX0gRWxmMzJfRXh0ZXJuYWxfUGhkcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXBfdHlwZVs0XTsJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZsYWdzWzRdOwkJLyogU2VnbWVudCBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCXBfb2Zmc2V0WzhdOwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCXBfdmFkZHJbOF07CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfcGFkZHJbOF07CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZpbGVzels4XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJcF9tZW1zels4XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgdW5zaWduZWQgY2hhcglwX2FsaWduWzhdOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KLX0gRWxmNjRfRXh0ZXJuYWxfUGhkcjsKLQotLyogU2VjdGlvbiBoZWFkZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXNoX25hbWVbNF07CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzaF90eXBlWzRdOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZmxhZ3NbNF07CQkvKiBNaXNjZWxsYW5lb3VzIHNlY3Rpb24gYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2FkZHJbNF07CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9vZmZzZXRbNF07CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfc2l6ZVs0XTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2xpbmtbNF07CQkvKiBJbmRleCBvZiBhbm90aGVyIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9pbmZvWzRdOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcmFsaWduWzRdOwkvKiBTZWN0aW9uIGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2VudHNpemVbNF07CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KLX0gRWxmMzJfRXh0ZXJuYWxfU2hkcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXNoX25hbWVbNF07CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzaF90eXBlWzRdOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZmxhZ3NbOF07CQkvKiBNaXNjZWxsYW5lb3VzIHNlY3Rpb24gYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2FkZHJbOF07CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9vZmZzZXRbOF07CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfc2l6ZVs4XTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2xpbmtbNF07CQkvKiBJbmRleCBvZiBhbm90aGVyIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9pbmZvWzRdOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcmFsaWduWzhdOwkvKiBTZWN0aW9uIGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2VudHNpemVbOF07CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KLX0gRWxmNjRfRXh0ZXJuYWxfU2hkcjsKLQotLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglzdF9uYW1lWzRdOwkJLyogU3ltYm9sIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzdF92YWx1ZVs0XTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9zaXplWzRdOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCXN0X2luZm9bMV07CQkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9vdGhlclsxXTsJCS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NobmR4WzJdOwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi19IEVsZjMyX0V4dGVybmFsX1N5bTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXN0X25hbWVbNF07CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X2luZm9bMV07CQkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9vdGhlclsxXTsJCS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NobmR4WzJdOwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfdmFsdWVbOF07CQkvKiBWYWx1ZSBvZiB0aGUgc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2l6ZVs4XTsJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIHNpemUgKi8KLX0gRWxmNjRfRXh0ZXJuYWxfU3ltOwotCi0vKiBOb3RlIHNlZ21lbnRzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgluYW1lc3pbNF07CQkvKiBTaXplIG9mIGVudHJ5J3Mgb3duZXIgc3RyaW5nICovCi0gIHVuc2lnbmVkIGNoYXIJZGVzY3N6WzRdOwkJLyogU2l6ZSBvZiB0aGUgbm90ZSBkZXNjcmlwdG9yICovCi0gIHVuc2lnbmVkIGNoYXIJdHlwZVs0XTsJCS8qIEludGVycHJldGF0aW9uIG9mIHRoZSBkZXNjcmlwdG9yICovCi0gIGNoYXIJCW5hbWVbMV07CQkvKiBTdGFydCBvZiB0aGUgbmFtZStkZXNjIGRhdGEgKi8KLX0gRWxmX0V4dGVybmFsX05vdGU7Ci0KLS8qIFJlbG9jYXRpb24gRW50cmllcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzRdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzRdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi19IEVsZjMyX0V4dGVybmFsX1JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzRdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzRdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9hZGRlbmRbNF07CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KLX0gRWxmMzJfRXh0ZXJuYWxfUmVsYTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzhdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi19IEVsZjY0X0V4dGVybmFsX1JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzhdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9hZGRlbmRbOF07CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KLX0gRWxmNjRfRXh0ZXJuYWxfUmVsYTsKLQotLyogZHluYW1pYyBzZWN0aW9uIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJZF90YWdbNF07CQkvKiBlbnRyeSB0YWcgdmFsdWUgKi8KLSAgdW5pb24gewotICAgIHVuc2lnbmVkIGNoYXIJZF92YWxbNF07Ci0gICAgdW5zaWduZWQgY2hhcglkX3B0cls0XTsKLSAgfSBkX3VuOwotfSBFbGYzMl9FeHRlcm5hbF9EeW47Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglkX3RhZ1s4XTsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLwotICB1bmlvbiB7Ci0gICAgdW5zaWduZWQgY2hhcglkX3ZhbFs4XTsKLSAgICB1bnNpZ25lZCBjaGFyCWRfcHRyWzhdOwotICB9IGRfdW47Ci19IEVsZjY0X0V4dGVybmFsX0R5bjsKLQotLyogVGhlIHZlcnNpb24gc3RydWN0dXJlcyBhcmUgY3VycmVudGx5IHNpemUgaW5kZXBlbmRlbnQuICBUaGV5IGFyZQotICAgbmFtZWQgd2l0aG91dCBhIDMyIG9yIDY0LiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoZXNlIHN0cnVjdHVyZXMKLSAgIHdpbGwgbmVlZCB0byBiZSByZW5hbWVkLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX3ZlcnNpb25bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX2ZsYWdzWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9uZHhbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX2NudFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfaGFzaFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfYXV4WzRdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVyZGVmOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdmRhX25hbWVbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkYV9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVyZGF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2bl92ZXJzaW9uWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bl9jbnRbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX2ZpbGVbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX2F1eFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fbmV4dFs0XTsKLX0gRWxmX0V4dGVybmFsX1Zlcm5lZWQ7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX2hhc2hbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9mbGFnc1syXTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX290aGVyWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfbmFtZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJuYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJzeW0gc2VjdGlvbi4gIFRoaXMgaXMgbm90IGEKLSAgIHN0YW5kYXJkIEVMRiBzdHJ1Y3R1cmU7IEVMRiBqdXN0IHVzZXMgRWxmMzJfSGFsZi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdnNfdmVyc1syXTsKLX0KLSNpZmRlZiBfX0dOVUNfXwotICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLSNlbmRpZgotICBFbGZfRXh0ZXJuYWxfVmVyc3ltOwotCi0vKiBTdHJ1Y3R1cmUgZm9yIHN5bWluZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyCQlzaV9ib3VuZHRvWzJdOwotICB1bnNpZ25lZCBjaGFyCQlzaV9mbGFnc1syXTsKLX0gRWxmX0V4dGVybmFsX1N5bWluZm87Ci0KLSNlbmRpZiAvKiBfRUxGX0VYVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2ZyMzAuaCBiL2luY2x1ZGUvZWxmL2ZyMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzYjA1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9mcjMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBGUjMwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0ZSMzBfSAotI2RlZmluZSBfRUxGX0ZSMzBfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfZnIzMF9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF84LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8yMCwgMikKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfMzIsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzQ4LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF82X0lOXzQsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzhfSU5fOCwgNikKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOV9JTl84LCA3KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8xMF9JTl84LCA4KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF85X1BDUkVMLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8xMl9QQ1JFTCwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX0dOVV9WVElOSEVSSVQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF9HTlVfVlRFTlRSWSwgMTIpCi0gIEVNUFRZX1JFTE9DICAoUl9GUjMwX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0ZSMzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaHBwYS5oIGIvaW5jbHVkZS9lbGYvaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTUwNzI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2hwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKiBIUFBBIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBIUFBBIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX0hQUEFfSAotI2RlZmluZSBfRUxGX0hQUEFfSAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBUcmFwIG51bGwgYWRkcmVzcyBkZXJlZmVyZW5jZXMuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfVFJBUE5JTAkweDAwMDEwMDAwCi0KLS8qIC5QQVJJU0MuYXJjaGV4dCBzZWN0aW9uIGlzIHByZXNlbnQuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfRVhUCQkweDAwMDIwMDAwCi0KLS8qIFByb2dyYW0gZXhwZWN0cyBsaXR0bGUtZW5kaWFuIG1vZGUuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTFNCCQkweDAwMDQwMDAwCi0KLS8qIFByb2dyYW0gZXhwZWN0cyB3aWRlIG1vZGUuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfV0lERQkJMHgwMDA4MDAwMAotCi0vKiBEbyBub3QgYWxsb3cga2VybmVsLWFzc2lzdGVkIGJyYW5jaCBwcmVkaWN0aW9uLiAgKi8KLSNkZWZpbmUgRUZfUEFSSVNDX05PX0tBQlAJMHgwMDEwMDAwMAotCi0vKiBBbGxvdyBsYXp5IHN3YXAgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KLSNkZWZpbmUgRUZfUEFSSVNDX0xBWllTV0FQCTB4MDA0MDAwMDAKLQotLyogQXJjaGl0ZWN0dXJlIHZlcnNpb24gKi8KLSNkZWZpbmUgRUZfUEFSSVNDX0FSQ0gJCTB4MDAwMGZmZmYKLQotI2RlZmluZSBFRkFfUEFSSVNDXzFfMAkJCTB4MDIwYgotI2RlZmluZSBFRkFfUEFSSVNDXzFfMQkJCTB4MDIxMAotI2RlZmluZSBFRkFfUEFSSVNDXzJfMAkJCTB4MDIxNAotCi0vKiBTcGVjaWFsIHNlY3Rpb24gaW5kaWNlcy4gICovCi0vKiBBIHN5bWJvbCB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgdGVudGF0aXZlIGRlZmluaXRpb24gaW4gYW4gQU5TSSBDCi0gICBjb21waWxhdGlvbi4gICovCi0jZGVmaW5lIFNITl9QQVJJU0NfQU5TSV9DT01NT04gCTB4ZmYwMAotCi0vKiBBIHN5bWJvbCB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgY29tbW9uIGJsb2NrIHVzaW5nIHRoZSAKLSAgIGh1Z2UgbWVtb3J5IG1vZGVsLiAgKi8KLSNkZWZpbmUgU0hOX1BBUklTQ19IVUdFX0NPTU1PTgkweGZmMDEKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHByb2R1Y3Qgc3BlY2lmaWMgZXh0ZW5zaW9uIGJpdHMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0VYVAkJMHg3MDAwMDAwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHVud2luZCB0YWJsZSBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19VTldJTkQJMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGRlYnVnIGluZm9ybWF0aW9uIGZvciBvcHRpbWl6ZWQgY29kZS4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfRE9DCQkweDcwMDAwMDAyCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgY29kZSBhbm5vdGF0aW9ucy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfQU5OT1QJMHg3MDAwMDAwMwotCi0vKiBUaGVzZSBhcmUgc3RyaWN0bHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkZXIgZWxmMzItaHBwYQotICAgaW1wbGVtZW50YXRpb24uICBIb3BlZnVsbHkgd2UgY2FuIGVsaW1pbmF0ZSB0aGVtIGluIHRoZSBmdXR1cmUuICAqLwotLyogT3B0aW9uYWwgc2VjdGlvbiBob2xkaW5nIGFyZ3VtZW50IGxvY2F0aW9uL3JlbG9jYXRpb24gaW5mby4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfU1lNRVhUTiAgICBTSFRfTE9QUk9DKzgKLQotLyogT3B0aW9uIHNlY3Rpb24gZm9yIGxpbmtlciBzdHVicy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfU1RVQlMgICAgICBTSFRfTE9QUk9DKzkKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUgY29tcGlsZWQgZm9yIHN0YXRpYyBicmFuY2ggcHJlZGljdGlvbi4gICovCi0jZGVmaW5lIFNIRl9QQVJJU0NfU0JQCQkweDgwMDAwMDAwCi0KLS8qIFNlY3Rpb24gc2hvdWxkIGJlIGFsbG9jYXRlZCBmcm9tIGZyb20gR1AuICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX0hVR0UJCTB4NDAwMDAwMDAKLQotLyogU2VjdGlvbiBzaG91bGQgZ28gbmVhciBHUC4gICovCi0jZGVmaW5lIFNIRl9QQVJJU0NfU0hPUlQJMHgyMDAwMDAwMAotCi0KLS8qIElkZW50aWZpZXMgdGhlIGVudHJ5IHBvaW50IG9mIGEgbWlsbGljb2RlIHJvdXRpbmUuICAqLwotI2RlZmluZSBTVFRfUEFSSVNDX01JTExJCTEzCi0KLS8qIEVMRi9IUFBBIHJlbG9jYXRpb24gdHlwZXMgKi8KLQotLyogTm90ZTogUEEtRUxGIGlzIGRlZmluZWQgdG8gdXNlIG9ubHkgUkVMQSByZWxvY2F0aW9ucy4gICovCi0jaW5jbHVkZSAicmVsb2MtbWFjcm9zLmgiCi0KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9ocHBhX3JlbG9jX3R5cGUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTk9ORSwgICAgICAwKQkvKiBObyByZWxvYyAqLwotICAgICAKLSAgICAgLyogVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBkbyBzaW1wbGUgYmFzZSArIG9mZnNldCByZWxvY2F0aW9ucy4gICovCi0KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIzMiwgIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMjFMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE3UiwgMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxN0YsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTRSLCA2KQotCi0gICAgLyogUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcwotICAgICAgIFR5cGljYWxseSB1c2VkIGZvciBjYWxscy4KLSAgICAgICBOb3RlIFBDUkVMMTdDIGFuZCBQQ1JFTDE3RiBkaWZmZXIgb25seSBpbiBvdmVyZmxvdyBoYW5kbGluZy4KLSAgICAgICBQQ1JFTDE3QyBuZXZlciByZXBvcnRzIGEgcmVsb2NhdGlvbiBlcnJvci4KLQotICAgICAgIFdoZW4gc3VwcG9ydGluZyBhcmd1bWVudCByZWxvY2F0aW9ucywgZnVuY3Rpb24gY2FsbHMgbXVzdCBiZQotICAgICAgIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyAKLSAgICAgICBjYXJyaWVkIGluIHRoZSB0ZW4gaGlnaC1vcmRlciBiaXRzIG9mIHRoZSBhZGRlbmQgZmllbGQuICBUaGUgcmVtYWluaW5nCi0gICAgICAgMjIgYml0cyBvZiBvZiB0aGUgYWRkZW5kIGZpZWxkIGFyZSBzaWduLWV4dGVuZGVkIHRvIGZvcm0gdGhlIEFkZGVuZC4KLQotICAgICAgIE5vdGUgdGhlIGNvZGUgdG8gYnVpbGQgYXJndW1lbnQgcmVsb2NhdGlvbnMgZGVwZW5kcyBvbiB0aGUgCi0gICAgICAgYWRkZW5kIGJlaW5nIHplcm8uICBBIGNvbnNlcXVlbmNlIG9mIHRoaXMgbGltaXRhdGlvbiBpcyBHQVMKLSAgICAgICBjYW4gbm90IHBlcmZvcm0gcmVsb2NhdGlvbiByZWR1Y3Rpb25zIGZvciBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLSAgICAgCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDMyLCA5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwyMUwsIDEwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxN1IsIDExKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxN0YsIDEyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxN0MsIDEzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNFIsIDE0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNEYsIDE1KQotCi0gICAgLyogRFAtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDIxTCwgMTgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDE0V1IsIDE5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNERSLCAyMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMTRSLCAyMikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMTRGLCAyMykKLQotICAgIC8qIERhdGEgbGlua2FnZSB0YWJsZSAoRExUKSByZWxvY2F0aW9uIHR5cGVzCi0KLSAgICAgICBTT00gRExUX1JFTCBmaXh1cCByZXF1ZXN0cyBhcmUgdXNlZCB0byBmb3Igc3RhdGljIGRhdGEgcmVmZXJlbmNlcwotICAgICAgIGZyb20gcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSB3aXRoaW4gc2hhcmVkIGxpYnJhcmllcy4gIFRoZXkgYXJlCi0gICAgICAgc2ltaWxhciB0byB0aGUgR09UIHJlbG9jYXRpb24gdHlwZXMgaW4gc29tZSBTVlI0IGltcGxlbWVudGF0aW9ucy4gICovCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDIxTCwgMjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNFIsIDMwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMTRGLCAzMSkKLQotICAgIC8qIERMVCBpbmRpcmVjdCByZWxvY2F0aW9uIHR5cGVzICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMjFMLCAzNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0UiwgMzgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQxNEYsIDM5KQotCi0gICAgLyogQmFzZSByZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgVWdoLiAgVGhlc2UgaW1wbHkgbG90cyBvZiBzdGF0ZSAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VUQkFTRSwgNDApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUNSRUwzMiwgNDEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMjFMLCA0MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxN1IsIDQzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE3RiwgNDQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTRSLCA0NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNEYsIDQ3KQotCi0gICAgLyogU2VnbWVudCByZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFR0JBU0UsIDQ4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VHUkVMMzIsIDQ5KQotCi0gICAgLyogT2Zmc2V0cyBmcm9tIHRoZSBQTFQuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMjFMLCA1MCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE0UiwgNTQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNEYsIDU1KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMzIsIDU3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjIxTCwgNTgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTRSLCA2MikKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRlBUUjY0LCA2NCkKLQotICAgIC8qIFBsYWJlbCByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDMyLCA2NSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDIxTCwgNjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTEFCRUwxNFIsIDcwKQotCi0gICAgLyogUENSRUwgcmVsb2NhdGlvbnMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUw2NCwgNzIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDIyQywgNzMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDIyRiwgNzQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0V1IsIDc1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNERSLCA3NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTZGLCA3NykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTZXRiwgNzgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE2REYsIDc5KQotCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjY0LCA4MCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjY0V1IsIDgxKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSNjREUiwgODIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNFdSLCA4MykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE0RFIsIDg0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTZGLCA4NSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE2V0YsIDg2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTZERiwgODcpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0dQUkVMNjQsIDg4KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNFdSLCA5MSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0RFIsIDkyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUwxNkYsIDkzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUwxNldGLCA5NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0dQUkVMMTZERiwgOTUpCi0KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkY2NCwgOTYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQxNFdSLCA5OSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0RFIsIDEwMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGMTZGLCAxMDEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRjE2V0YsIDEwMikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGMTZERiwgMTAzKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUNSRUw2NCwgMTA0KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTRXUiwgMTA3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0RFIsIDEwOCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VHUkVMNjQsIDExMikKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTRXUiwgMTE1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTREUiwgMTE2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTZGLCAxMTcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNldGLCAxMTgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNkRGLCAxMTkpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFI2NCwgMTIwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1IsIDEyMykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSLCAxMjQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTZGLCAxMjUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTZXRiwgMTI2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE2REYsIDEyNykKLQotIAotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQ09QWSwgMTI4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfSVBMVCwgMTI5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRVBMVCwgMTMwKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDMyLCAxNTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDIxTCwgMTU0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNFIsIDE1OCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAyMUwsIDE2MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTRSLCAxNjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0RiwgMTY3KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDY0LCAyMTYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE0V1IsIDIxOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTREUiwgMjIwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNkYsIDIyMSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZXRiwgMjIyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNkRGLCAyMjMpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQNjQsIDIyNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTRXUiwgMjI3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNERSLCAyMjgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE2RiwgMjI5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNldGLCAyMzApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE2REYsIDIzMSkKLSAgICBFTVBUWV9SRUxPQyAoUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNpZm5kZWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi10eXBlZGVmIGVudW0gZWxmX2hwcGFfcmVsb2NfdHlwZSBlbGZfaHBwYV9yZWxvY190eXBlOwotI2VuZGlmCi0KLSNkZWZpbmUgUFRfUEFSSVNDX0FSQ0hFWFQJMHg3MDAwMDAwMAotI2RlZmluZSBQVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKLSNkZWZpbmUgUEZfUEFSSVNDX1NCUAkJMHgwODAwMDAwMAotI2VuZGlmIC8qIF9FTEZfSFBQQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9pMzg2LmggYi9pbmNsdWRlL2VsZi9pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOWYxMDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogaXg4NiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9JMzg2X0gKLSNkZWZpbmUgX0VMRl9JMzg2X0gKLQotI2luY2x1ZGUgInJlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTM4Nl9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X05PTkUsICAgICAgMCkJLyogTm8gcmVsb2MgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8zMiwgICAgICAgIDEpCS8qIERpcmVjdCAzMiBiaXQgICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMzMiwgICAgICAyKQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HT1QzMiwgICAgIDMpCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QTFQzMiwJICAgIDQpCS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0NPUFksCSAgICA1KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR0xPQl9EQVQsICA2KQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfSlVNUF9TTE9ULCA3KQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUkVMQVRJVkUsICA4KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR09UT0ZGLCAgICA5KQkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dPVFBDLCAgICAxMCkJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgICAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DLCAxMSkKLSAgICAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAxOSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8xNiwgICAgICAgMjApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMxNiwgICAgIDIxKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2XzgsCSAgIDIyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDOCwgICAgICAyMykKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9tYXgsCSAgIDI0KQotICAgICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HTlVfVlRJTkhFUklULCAyNTApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR05VX1ZURU5UUlksIDI1MSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaTk2MC5oIGIvaW5jbHVkZS9lbGYvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTM5ZDI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2k5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIEludGVsIDk2MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9JOTYwX0gKLSNkZWZpbmUgX0VMRl9JOTYwX0gKLQotI2luY2x1ZGUgInJlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTk2MF9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX05PTkUsCSAgICAwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwXzEyLAkgICAgMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF8zMiwJICAgIDIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfSVAyNCwJICAgIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfU1VCLAkgICAgNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF9PUFRDQUxMLCAgIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfT1BUQ0FMTFgsICA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX09QVENBTExYQSwgNykKLSAgICAgRU1QVFlfUkVMT0MgKFJfOTYwX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0k5NjBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaCBiL2luY2x1ZGUvZWxmL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjgxYTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IEVMRiBpcyByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGluIHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0KLS8qIE5PVEUgdGhhdCB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSBub3Qga2VwdCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhcgotICAgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gc29tZSBjYXNlcyB0aGV5J3ZlIGJlZW4gcmVvcmRlcmVkIGZvciBtb3JlIG9wdGltYWwKLSAgIHBhY2tpbmcgdW5kZXIgdmFyaW91cyBjaXJjdW1zdGFuY2VzLiAgKi8KLQotI2lmbmRlZiBfRUxGX0lOVEVSTkFMX0gKLSNkZWZpbmUgX0VMRl9JTlRFUk5BTF9ICi0KLS8qIEVMRiBIZWFkZXIgKi8KLQotI2RlZmluZSBFSV9OSURFTlQJMTYJCS8qIFNpemUgb2YgZV9pZGVudFtdICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9laGRyIHsKLSAgdW5zaWduZWQgY2hhcgkJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KLSAgYmZkX3ZtYQkJZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBiZmRfc2l6ZV90eXBlCQllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgYmZkX3NpemVfdHlwZQkJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGxvbmcJCWVfdmVyc2lvbjsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBsb25nCQllX2ZsYWdzOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIHNob3J0CWVfdHlwZTsJCQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9tYWNoaW5lOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBzaG9ydAllX3BoZW50c2l6ZTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIHNob3J0CWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX3NobnVtOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGZfSW50ZXJuYWxfRWhkcjsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9laGRyIGVsZl9pbnRlcm5hbF9laGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX0VoZHIgRWxmX0ludGVybmFsX0VoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZWhkciBlbGZfaW50ZXJuYWxfZWhkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9FaGRyIEVsZl9JbnRlcm5hbF9FaGRyCi0KLS8qIFByb2dyYW0gaGVhZGVyICovCi0KLXN0cnVjdCBlbGZfaW50ZXJuYWxfcGhkciB7Ci0gIHVuc2lnbmVkIGxvbmcJcF90eXBlOwkJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KLSAgdW5zaWduZWQgbG9uZwlwX2ZsYWdzOwkJLyogU2VnbWVudCBmbGFncyAqLwotICBiZmRfdm1hCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICBiZmRfdm1hCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBiZmRfdm1hCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgYmZkX3ZtYQlwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIGJmZF92bWEJcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgYmZkX3ZtYQlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9waGRyIEVsZl9JbnRlcm5hbF9QaGRyOwotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9waGRyIGVsZl9pbnRlcm5hbF9waGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1BoZHIgRWxmX0ludGVybmFsX1BoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcGhkciBlbGZfaW50ZXJuYWxfcGhkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9QaGRyIEVsZl9JbnRlcm5hbF9QaGRyCi0KLS8qIFNlY3Rpb24gaGVhZGVyICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyIHsKLSAgdW5zaWduZWQgaW50CXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgaW50CXNoX3R5cGU7CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgYmZkX3ZtYQlzaF9mbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIGJmZF92bWEJc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICBiZmRfc2l6ZV90eXBlCXNoX3NpemU7CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KLSAgYmZkX3NpemVfdHlwZQlzaF9lbnRzaXplOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCi0gIHVuc2lnbmVkIGxvbmcJc2hfbGluazsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBsb25nCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgZmlsZV9wdHIJc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBpbnQJc2hfYWRkcmFsaWduOwkJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KLQotICAvKiBUaGUgaW50ZXJuYWwgcmVwIGFsc28gaGFzIHNvbWUgY2FjaGVkIGluZm8gYXNzb2NpYXRlZCB3aXRoIGl0LiAqLwotICBhc2VjdGlvbiAqCWJmZF9zZWN0aW9uOwkJLyogQXNzb2NpYXRlZCBCRkQgc2VjdGlvbi4gICovCi0gIFBUUgkJY29udGVudHM7CQkvKiBTZWN0aW9uIGNvbnRlbnRzLiAgKi8KLX0gRWxmX0ludGVybmFsX1NoZHI7Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc2hkciBlbGZfaW50ZXJuYWxfc2hkcgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TaGRyIEVsZl9JbnRlcm5hbF9TaGRyCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3NoZHIgZWxmX2ludGVybmFsX3NoZHIKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU2hkciBFbGZfSW50ZXJuYWxfU2hkcgotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zeW0gewotICBiZmRfdm1hCXN0X3ZhbHVlOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICBiZmRfdm1hCXN0X3NpemU7CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcJc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIHNob3J0IHN0X3NobmR4OwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfc3ltIEVsZl9JbnRlcm5hbF9TeW07Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KLQotLyogTm90ZSBzZWdtZW50cyAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfbm90ZSB7Ci0gIHVuc2lnbmVkIGxvbmcJbmFtZXN6OwkJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KLSAgdW5zaWduZWQgbG9uZwlkZXNjc3o7CQkJLyogU2l6ZSBvZiB0aGUgbm90ZSBkZXNjcmlwdG9yICovCi0gIHVuc2lnbmVkIGxvbmcJdHlwZTsJCQkvKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgZGVzY3JpcHRvciAqLwotICBjaGFyICoJbmFtZWRhdGE7CQkvKiBTdGFydCBvZiB0aGUgbmFtZStkZXNjIGRhdGEgKi8KLSAgY2hhciAqCWRlc2NkYXRhOwkJLyogU3RhcnQgb2YgdGhlIGRlc2MgZGF0YSAqLwotICBiZmRfdm1hCWRlc2Nwb3M7CQkvKiBGaWxlIG9mZnNldCBvZiB0aGUgZGVzY2RhdGEgKi8KLX0gRWxmX0ludGVybmFsX05vdGU7Ci0jZGVmaW5lIEVsZjMyX0ludGVybmFsX05vdGUJRWxmX0ludGVybmFsX05vdGUKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfbm90ZQllbGZfaW50ZXJuYWxfbm90ZQotCi0vKiBSZWxvY2F0aW9uIEVudHJpZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3JlbCB7Ci0gIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICBiZmRfdm1hCXJfaW5mbzsJCS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmX0ludGVybmFsX1JlbDsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfcmVsYSB7Ci0gIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgYmZkX3ZtYQlyX2luZm87CQkvKiBJbmRleCBhbmQgVHlwZSBvZiByZWxvY2F0aW9uICovCi0gIGJmZF9zaWduZWRfdm1hIHJfYWRkZW5kOwkvKiBDb25zdGFudCBhZGRlbmQgdXNlZCB0byBjb21wdXRlIHZhbHVlICovCi19IEVsZl9JbnRlcm5hbF9SZWxhOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3JlbGEgZWxmX2ludGVybmFsX3JlbGEKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcmVsYSBlbGZfaW50ZXJuYWxfcmVsYQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWxhIEVsZl9JbnRlcm5hbF9SZWxhCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1JlbGEgRWxmX0ludGVybmFsX1JlbGEKLQotLyogZHluYW1pYyBzZWN0aW9uIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfZHluIHsKLSAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICBiZmRfdm1hIGRfdGFnOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCi0gICAgYmZkX3ZtYQlkX3ZhbDsKLSAgICBiZmRfdm1hCWRfcHRyOwotICB9IGRfdW47Ci19IEVsZl9JbnRlcm5hbF9EeW47Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGVmIHsKLSAgdW5zaWduZWQgc2hvcnQgdmRfdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfZmxhZ3M7CS8qIEZsYWdzIChWRVJfRkxHXyopLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfbmR4OwkvKiBWZXJzaW9uIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfY250OwkvKiBOdW1iZXIgb2YgdmVyZGF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfaGFzaDsJLyogSGFzaCBvZiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfYXV4OwkvKiBPZmZzZXQgdG8gdmVyZGF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVyZGVmLiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgYmZkCQkJICAgICAgKnZkX2JmZDsJCS8qIEJGRC4gICovCi0gIGNvbnN0IGNoYXIJCSAgICAgICp2ZF9ub2RlbmFtZTsJLyogVmVyc2lvbiBuYW1lLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkZWYgICp2ZF9uZXh0ZGVmOwkvKiB2ZF9uZXh0IGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkX2F1eHB0cjsJLyogdmRfYXV4IGFzIHBvaW50ZXIuICAqLwotICB1bnNpZ25lZCBpbnQJCSAgICAgICB2ZF9leHBfcmVmbm87CS8qIFVzZWQgYnkgdGhlIGxpbmtlci4gICovCi19IEVsZl9JbnRlcm5hbF9WZXJkZWY7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggewotICB1bnNpZ25lZCBsb25nIHZkYV9uYW1lOwkvKiBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nIHZkYV9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJkYXV4LiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgY29uc3QgY2hhciAqdmRhX25vZGVuYW1lOwkJCS8qIHZkYV9uYW1lIGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkYV9uZXh0cHRyOwkvKiB2ZGFfbmV4dCBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1ZlcmRhdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuZWVkIHsKLSAgdW5zaWduZWQgc2hvcnQgdm5fdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5fY250OwkvKiBOdW1iZXIgb2YgdmVybmF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5fZmlsZTsJLyogU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBsaWJyYXJ5IG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9hdXg7CS8qIE9mZnNldCB0byB2ZXJuYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJuZWVkLiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgYmZkCQkJICAgICAgKnZuX2JmZDsJCS8qIEJGRC4gICovCi0gIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqdm5fZmlsZW5hbWU7CS8qIHZuX2ZpbGUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5fYXV4cHRyOwkvKiB2bl9hdXggYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmVlZCAqdm5fbmV4dHJlZjsJLyogdm5fbmV4dHJlZiBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1Zlcm5lZWQ7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4IHsKLSAgdW5zaWduZWQgbG9uZwkgdm5hX2hhc2g7CS8qIEhhc2ggb2YgZGVwZW5kZW5jeSBuYW1lLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5hX2ZsYWdzOwkvKiBGbGFncyAoVkVSX0ZMR18qKS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZuYV9vdGhlcjsJLyogVW51c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5hX25hbWU7CS8qIFN0cmluZyB0YWJsZSBvZmZzZXQgdG8gdmVyc2lvbiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5hX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcm5hdXguICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnZuYV9ub2RlbmFtZTsJLyogdm5hX25hbWUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5hX25leHRwdHI7CS8qIHZuYV9uZXh0IGFzIHBvaW50ZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVybmF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24uICBUaGlzIGlzIG5vdCBhCi0gICBzdGFuZGFyZCBFTEYgc3RydWN0dXJlOyBFTEYganVzdCB1c2VzIEVsZjMyX0hhbGYuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyc3ltIHsKLSAgdW5zaWduZWQgc2hvcnQgdnNfdmVyczsKLX0gRWxmX0ludGVybmFsX1ZlcnN5bTsKLQotLyogU3RydWN0dXJlIGZvciBzeW1pbmZvIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgc2hvcnQgaW50IAlzaV9ib3VuZHRvOwotICB1bnNpZ25lZCBzaG9ydCBpbnQJc2lfZmxhZ3M7Ci19IEVsZl9JbnRlcm5hbF9TeW1pbmZvOwotCi0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGF1eCBlbGZfaW50ZXJuYWxfdmVyZGF1eAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJkYXV4IGVsZl9pbnRlcm5hbF92ZXJkYXV4Ci0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3Zlcm5lZWQgZWxmX2ludGVybmFsX3Zlcm5lZWQKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVybmVlZCBlbGZfaW50ZXJuYWxfdmVybmVlZAotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJuYXV4IGVsZl9pbnRlcm5hbF92ZXJuYXV4Ci0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3Zlcm5hdXggZWxmX2ludGVybmFsX3Zlcm5hdXgKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KLQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkYXV4IEVsZl9JbnRlcm5hbF9WZXJkYXV4Ci0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcmRhdXggRWxmX0ludGVybmFsX1ZlcmRhdXgKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVybmVlZCBFbGZfSW50ZXJuYWxfVmVybmVlZAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJuZWVkIEVsZl9JbnRlcm5hbF9WZXJuZWVkCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1Zlcm5hdXggRWxmX0ludGVybmFsX1Zlcm5hdXgKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVybmF1eCBFbGZfSW50ZXJuYWxfVmVybmF1eAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvIEVsZl9JbnRlcm5hbF9TeW1pbmZvCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1N5bWluZm8gRWxmX0ludGVybmFsX1N5bWluZm8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBob3cgc2VjdGlvbnMgc2hvdWxkIGJlIGFzc2lnbmVkCi0gICB0byBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KLQotc3RydWN0IGVsZl9zZWdtZW50X21hcAotewotICAvKiBOZXh0IHByb2dyYW0gc2VnbWVudC4gICovCi0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm5leHQ7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwX3R5cGU7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgcF9mbGFnczsKLSAgLyogUHJvZ3JhbSBzZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MuICAqLwotICBiZmRfdm1hIHBfcGFkZHI7Ci0gIC8qIFdoZXRoZXIgdGhlIHBfZmxhZ3MgZmllbGQgaXMgdmFsaWQ7IGlmIG5vdCwgdGhlIGZsYWdzIGFyZSBiYXNlZAotICAgICBvbiB0aGUgc2VjdGlvbiBmbGFncy4gICovCi0gIHVuc2lnbmVkIGludCBwX2ZsYWdzX3ZhbGlkIDogMTsKLSAgLyogV2hldGhlciB0aGUgcF9wYWRkciBmaWVsZCBpcyB2YWxpZDsgaWYgbm90LCB0aGUgcGh5c2ljYWwgYWRkcmVzcwotICAgICBpcyBiYXNlZCBvbiB0aGUgc2VjdGlvbiBsbWEgdmFsdWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHBfcGFkZHJfdmFsaWQgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgc2VnbWVudCBpbmNsdWRlcyB0aGUgZmlsZSBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfZmlsZWhkciA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZWdtZW50IGluY2x1ZGVzIHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfcGhkcnMgOiAxOwotICAvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgKG1heSBiZSAwKS4gICovCi0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgLyogU2VjdGlvbnMuICBBY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGlzIGluIGNvdW50IGZpZWxkLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb25zWzFdOwotfTsKLQotI2VuZGlmIC8qIF9FTEZfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTMyci5oIGIvaW5jbHVkZS9lbGYvbTMyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTM3ZDEzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL20zMnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIE0zMlIgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfTTMyUl9ICi0jZGVmaW5lIF9FTEZfTTMyUl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tMzJyX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzE2LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8zMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMjQsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzEwX1BDUkVMLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8xOF9QQ1JFTCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMjZfUENSRUwsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0hJMTZfVUxPLCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9ISTE2X1NMTywgOCkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfTE8xNiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfU0RBMTYsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9HTlVfVlRJTkhFUklULCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfR05VX1ZURU5UUlksIDEyKQotICBFTVBUWV9SRUxPQyAgKFJfTTMyUl9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIFNtYWxsIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fTTMyUl9TQ09NTU9OCTB4ZmYwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBjb250YWlucyBzdWZmaWNpZW50IHJlbG9jcyB0byBiZSByZWxheGVkLgotICAgV2hlbiByZWxheGluZywgZXZlbiByZWxvY3Mgb2YgYnJhbmNoIGluc3RydWN0aW9ucyB0aGUgYXNzZW1ibGVyIGNvdWxkCi0gICBjb21wbGV0ZSBtdXN0IGJlIHByZXNlbnQgYmVjYXVzZSByZWxheGluZyBtYXkgY2F1c2UgdGhlIGJyYW5jaCB0YXJnZXQgdG8KLSAgIG1vdmUuICAqLwotI2RlZmluZSBTSEZfTTMyUl9DQU5fUkVMQVgJMHgxMDAwMDAwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBUd28gYml0IG0zMnIgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfTTMyUl9BUkNICQkweDMwMDAwMDAwCi0KLS8qIG0zMnIgY29kZS4gICovCi0jZGVmaW5lIEVfTTMyUl9BUkNICQkweDAwMDAwMDAwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTY4ay5oIGIvaW5jbHVkZS9lbGYvbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODcyZTBmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL202OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIE1DNjhrIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX002OEtfSAotI2RlZmluZSBfRUxGX002OEtfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tNjhrX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfTk9ORSwgMCkJCS8qIE5vIHJlbG9jICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfMzIsIDEpCQkvKiBEaXJlY3QgMzIgYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLXzE2LCAyKQkJLyogRGlyZWN0IDE2IGJpdCAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S184LCAzKQkJLyogRGlyZWN0IDggYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BDMzIsIDQpCQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QQzE2LCA1KQkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUEM4LCA2KQkJLyogUEMgcmVsYXRpdmUgOCBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QzMiwgNykJCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QxNiwgOCkJCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1Q4LCA5KQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UMzJPLCAxMCkJLyogMzIgYml0IEdPVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QxNk8sIDExKQkvKiAxNiBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDhPLCAxMikJLyogOCBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDMyLCAxMykJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMTYsIDE0KQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQ4LCAxNSkJCS8qIDggYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMzJPLCAxNikJLyogMzIgYml0IFBMVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQxNk8sIDE3KQkvKiAxNiBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDhPLCAxOCkJLyogOCBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0NPUFksIDE5KQkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dMT0JfREFULCAyMCkJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0pNUF9TTE9ULCAyMSkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1JFTEFUSVZFLCAyMikJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTlVfVlRJTkhFUklULCAyMykKLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTlVfVlRFTlRSWSwgMjQpCi0gIEVNUFRZX1JFTE9DICAoUl82OEtfbWF4KSAgIAotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCi0KLSNkZWZpbmUgRUZfQ1BVMzIgICAgMHgwMDgxMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbWNvcmUuaCBiL2luY2x1ZGUvZWxmL21jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGE5M2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIE1vdG9yb2xsYSBNQ29yZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNQ29yZSBFTEYgQUJJLiAqLwotI2lmbmRlZiBfRUxGX01PUkVfSAotI2RlZmluZSBfRUxGX01PUkVfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbWNvcmVfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9BRERSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTThCWTQsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTTExQlkyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxJTU00QlkyLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUwzMiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfR05VX1ZUSU5IRVJJVCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dOVV9WVEVOVFJZLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUkVMQVRJVkUsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9DT1BZLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dMT0JfREFULCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0pVTVBfU0xPVCwgMTIpCi0gIEVNUFRZX1JFTE9DICAoUl9NQ09SRV9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBTZWN0aW9uIEF0dHJpYnV0ZXMuICAqLwotI2RlZmluZSBTSEZfTUNPUkVfTk9SRUFECTB4ODAwMDAwMDAKLQotI2VuZGlmIC8qIF9FTEZfTUNPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbWlwcy5oIGIvaW5jbHVkZS9lbGYvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNhY2JlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5NCArMCwwIEBACi0vKiBNSVBTIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+LCBmcm9tCi0gICBpbmZvcm1hdGlvbiBpbiB0aGUgU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgTUlQUwotICAgUHJvY2Vzc29yIFN1cHBsZW1lbnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNSVBTIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX01JUFNfSAotI2RlZmluZSBfRUxGX01JUFNfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9taXBzX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTXzE2LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU18zMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUkVMMzIsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTXzI2LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISTE2LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19MTzE2LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HUFJFTDE2LCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19MSVRFUkFMLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1QxNiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUEMxNiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0NBTEwxNiwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dQUkVMMzIsIDEyKQotICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZGVmaW5lZCBvbiBJcml4LCBhbHRob3VnaCB0aGV5IGFyZSBub3QKLSAgICAgaW4gdGhlIE1JUFMgRUxGIEFCSS4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1VOVVNFRDEsIDEzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19VTlVTRUQyLCAxNCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfVU5VU0VEMywgMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NISUZUNSwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NISUZUNiwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTXzY0LCAxOCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX0RJU1AsIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfUEFHRSwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9PRlNULCAyMSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX0hJMTYsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfTE8xNiwgMjMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NVQiwgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0lOU0VSVF9BLCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSU5TRVJUX0IsIDI2KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ERUxFVEUsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISUdIRVIsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISUdIRVNULCAyOSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfQ0FMTF9ISTE2LCAzMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfQ0FMTF9MTzE2LCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfU0NOX0RJU1AsIDMyKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19SRUwxNiwgMzMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0FERF9JTU1FRElBVEUsIDM0KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19QSlVNUCwgMzUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1JFTEdPVCwgMzYpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0pBTFIsIDM3KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19tYXgsIDM4KQotICAvKiBUaGVzZSByZWxvY3MgYXJlIHVzZWQgZm9yIHRoZSBtaXBzMTYuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfTUlQUzE2XzI2LCAxMDApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTMTZfR1BSRUwsIDEwMSkKLSAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dOVV9WVElOSEVSSVQsIDI1MykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR05VX1ZURU5UUlksIDI1NCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEF0IGxlYXN0IG9uZSAubm9yZW9yZGVyIGRpcmVjdGl2ZSBhcHBlYXJzIGluIHRoZSBzb3VyY2UuICAqLwotI2RlZmluZSBFRl9NSVBTX05PUkVPUkRFUgkweDAwMDAwMDAxCi0KLS8qIEZpbGUgY29udGFpbnMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfUElDCQkweDAwMDAwMDAyCi0KLS8qIENvZGUgaW4gZmlsZSB1c2VzIHRoZSBzdGFuZGFyZCBjYWxsaW5nIHNlcXVlbmNlIGZvciBjYWxsaW5nCi0gICBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19DUElDCQkweDAwMDAwMDA0Ci0KLS8qIENvZGUgaW4gZmlsZSB1c2VzIG5ldyBBQkkgKC1uMzIgb24gSXJpeCA2KS4gICovCi0jZGVmaW5lIEVGX01JUFNfQUJJMgkJMHgwMDAwMDAyMAotCi0vKiBJbmRpY2F0ZXMgY29kZSBjb21waWxlZCBmb3IgYSA2NC1iaXQgbWFjaGluZSBpbiAzMi1iaXQgbW9kZS4gCi0gICAocmVncyBhcmUgMzItYml0cyB3aWRlLikgKi8KLSNkZWZpbmUgRUZfTUlQU18zMkJJVE1PREUgICAgICAgMHgwMDAwMDEwMAotCi0vKiBGb3VyIGJpdCBNSVBTIGFyY2hpdGVjdHVyZSBmaWVsZC4gICovCi0jZGVmaW5lIEVGX01JUFNfQVJDSAkJMHhmMDAwMDAwMAotCi0vKiAtbWlwczEgY29kZS4gICovCi0jZGVmaW5lIEVfTUlQU19BUkNIXzEJCTB4MDAwMDAwMDAKLQotLyogLW1pcHMyIGNvZGUuICAqLwotI2RlZmluZSBFX01JUFNfQVJDSF8yCQkweDEwMDAwMDAwCi0KLS8qIC1taXBzMyBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NSVBTX0FSQ0hfMwkJMHgyMDAwMDAwMAotCi0vKiAtbWlwczQgY29kZS4gICovCi0jZGVmaW5lIEVfTUlQU19BUkNIXzQJCTB4MzAwMDAwMDAKLQotLyogVGhlIEFCSSBvZiB0aGUgZmlsZS4gIEFsc28gc2VlIEVGX01JUFNfQUJJMiBhYm92ZS4gKi8KLSNkZWZpbmUgRUZfTUlQU19BQkkJCTB4MDAwMEYwMDAKLQotLyogVGhlIG9yaWdpbmFsIG8zMiBhYmkuICovCi0jZGVmaW5lIEVfTUlQU19BQklfTzMyICAgICAgICAgIDB4MDAwMDEwMDAKLQotLyogTzMyIGV4dGVuZGVkIHRvIHdvcmsgb24gNjQgYml0IGFyY2hpdGVjdHVyZXMgKi8KLSNkZWZpbmUgRV9NSVBTX0FCSV9PNjQgICAgICAgICAgMHgwMDAwMjAwMAotCi0vKiBFQUJJIGluIDMyIGJpdCBtb2RlICovCi0jZGVmaW5lIEVfTUlQU19BQklfRUFCSTMyICAgICAgIDB4MDAwMDMwMDAKLQotLyogRUFCSSBpbiA2NCBiaXQgbW9kZSAqLwotI2RlZmluZSBFX01JUFNfQUJJX0VBQkk2NCAgICAgICAweDAwMDA0MDAwCi0KLQotLyogTWFjaGluZSB2YXJpYW50IGlmIHdlIGtub3cgaXQuICBUaGlzIGZpZWxkIHdhcyBpbnZlbnRlZCBhdCBDeWdudXMsCi0gICBidXQgaXQgaXMgaG9wZWQgdGhhdCBvdGhlciB2ZW5kb3JzIHdpbGwgYWRvcHQgaXQuICBJZiBzb21lIHN0YW5kYXJkCi0gICBpcyBkZXZlbG9wZWQsIHRoaXMgY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBmb2xsb3cgaXQuICovCi0KLSNkZWZpbmUgRUZfTUlQU19NQUNICQkweDAwRkYwMDAwCi0KLS8qIEN5Z251cyBpcyBjaG9vc2luZyB2YWx1ZXMgYmV0d2VlbiA4MCBhbmQgOUY7Ci0gICAwMCAtIDdGIHNob3VsZCBiZSBsZWZ0IGZvciBhIGZ1dHVyZSBzdGFuZGFyZDsKLSAgIHRoZSByZXN0IGFyZSBvcGVuLiAqLwotCi0jZGVmaW5lIEVfTUlQU19NQUNIXzM5MDAJMHgwMDgxMDAwMAotCi0jZGVmaW5lIEVfTUlQU19NQUNIXzQwMTAJMHgwMDgyMDAwMAotI2RlZmluZSBFX01JUFNfTUFDSF80MTAwCTB4MDA4MzAwMDAKLSNkZWZpbmUgRV9NSVBTX01BQ0hfNDY1MAkweDAwODUwMDAwCi0jZGVmaW5lIEVfTUlQU19NQUNIXzQxMTEJMHgwMDg4MDAwMAotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIERlZmluZWQgYW5kIGFsbG9jYXRlZCBjb21tb24gc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLiAgSWYKLSAgIHJlbG9jYXRlZCwgYWxpZ25tZW50IG11c3QgYmUgcHJlc2VydmVkLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfQUNPTU1PTgkweGZmMDAKLQotLyogRGVmaW5lZCBhbmQgYWxsb2NhdGVkIHRleHQgc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLgotICAgT2NjdXIgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIEFscGhhIE9TRi8xIGFuZCBJcml4IDUgZXhlY3V0YWJsZXMuICAqLwotI2RlZmluZSBTSE5fTUlQU19URVhUCQkweGZmMDEKLQotLyogRGVmaW5lZCBhbmQgYWxsb2NhdGVkIGRhdGEgc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLgotICAgT2NjdXIgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIEFscGhhIE9TRi8xIGFuZCBJcml4IDUgZXhlY3V0YWJsZXMuICAqLwotI2RlZmluZSBTSE5fTUlQU19EQVRBCQkweGZmMDIKLQotLyogU21hbGwgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9NSVBTX1NDT01NT04JMHhmZjAzCi0KLS8qIFNtYWxsIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fTUlQU19TVU5ERUZJTkVECTB4ZmYwNAotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSBzZXQgb2YgZHluYW1pYyBzaGFyZWQgb2JqZWN0cyB1c2VkIHdoZW4KLSAgIHN0YXRpY2FsbHkgbGlua2luZy4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0xJQkxJU1QJMHg3MDAwMDAwMAotCi0vKiBJJ20gbm90IHN1cmUgd2hhdCB0aGlzIGlzLCBidXQgaXQncyB1c2VkIG9uIElyaXggNS4gICovCi0jZGVmaW5lIFNIVF9NSVBTX01TWU0JCTB4NzAwMDAwMDEKLQotLyogU2VjdGlvbiBjb250YWlucyBsaXN0IG9mIHN5bWJvbHMgd2hvc2UgZGVmaW5pdGlvbnMgY29uZmxpY3Qgd2l0aAotICAgc3ltYm9scyBkZWZpbmVkIGluIHNoYXJlZCBvYmplY3RzLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwMgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSBnbG9iYWwgcG9pbnRlciB0YWJsZS4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0dQVEFCCQkweDcwMDAwMDAzCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgbWljcm9jb2RlIGluZm9ybWF0aW9uLiAgVGhlIGV4YWN0IGZvcm1hdCBpcwotICAgdW5zcGVjaWZpZWQuICAqLwotI2RlZmluZSBTSFRfTUlQU19VQ09ERQkJMHg3MDAwMDAwNAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZXhhY3QKLSAgIGZvcm1hdCBpcyB1bnNwZWNpZmllZC4gIEl0J3MgcHJvYmFibHkgRUNPRkYgc3ltYm9scy4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFQlVHCQkweDcwMDAwMDA1Ci0KLS8qIFNlY3Rpb24gY29udGFpbnMgcmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19SRUdJTkZPCTB4NzAwMDAwMDYKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1BBQ0tBR0UJMHg3MDAwMDAwNwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUEFDS1NZTQkweDcwMDAwMDA4Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19SRUxECQkweDcwMDAwMDA5Ci0KLS8qIFNlY3Rpb24gY29udGFpbnMgaW50ZXJmYWNlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfSUZBQ0UJCTB4NzAwMDAwMGIKLQotLyogU2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbiBvZiBjb250ZW50cyBvZiBhbm90aGVyIHNlY3Rpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19DT05URU5UCTB4NzAwMDAwMGMKLQotLyogU2VjdGlvbiBjb250YWlucyBtaXNjZWxsYW5lb3VzIG9wdGlvbnMuICAqLwotI2RlZmluZSBTSFRfTUlQU19PUFRJT05TCTB4NzAwMDAwMGQKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1NIRFIJCTB4NzAwMDAwMTAKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0ZERVNDCQkweDcwMDAwMDExCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19FWFRTWU0JCTB4NzAwMDAwMTIKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTlNFCQkweDcwMDAwMDEzCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QREVTQwkJMHg3MDAwMDAxNAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfTE9DU1lNCQkweDcwMDAwMDE1Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19BVVhTWU0JCTB4NzAwMDAwMTYKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX09QVFNZTQkJMHg3MDAwMDAxNwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfTE9DU1RSCQkweDcwMDAwMDE4Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19MSU5FCQkweDcwMDAwMDE5Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19SRkRFU0MJCTB4NzAwMDAwMWEKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBU1lNCTB4NzAwMDAwMWIKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBSU5TVAkweDcwMDAwMDFjCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERUxUQUNMQVNTCTB4NzAwMDAwMWQKLQotLyogRFdBUkYgZGVidWdnaW5nIHNlY3Rpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19EV0FSRgkJMHg3MDAwMDAxZQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfREVMVEFERUNMCTB4NzAwMDAwMWYKLQotLyogTGlzdCBvZiBsaWJyYXJpZXMgdGhlIGJpbmFyeSBkZXBlbmRzIG9uLiAgSW5jbHVkZXMgYSB0aW1lIHN0YW1wLCB2ZXJzaW9uCi0gICBudW1iZXIuICAqLwotI2RlZmluZSBTSFRfTUlQU19TWU1CT0xfTElCCTB4NzAwMDAwMjAKLQotLyogRXZlbnRzIHNlY3Rpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJCTB4NzAwMDAwMjEKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1RSQU5TTEFURQkweDcwMDAwMDIyCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QSVhJRQkJMHg3MDAwMDAyMwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfWExBVEUJCTB4NzAwMDAwMjQKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1hMQVRFX0RFQlVHCTB4NzAwMDAwMjUKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1dISVJMCQkweDcwMDAwMDI2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19FSF9SRUdJT04JMHg3MDAwMDAyNwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfWExBVEVfT0xECTB4NzAwMDAwMjgKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1BEUl9FWENFUFRJT04JMHg3MDAwMDAyOQotCi0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX0xJQkxJU1QgY29udGFpbnMgYW4gYXJyYXkgb2YgdGhlCi0gICBmb2xsb3dpbmcgc3RydWN0dXJlLiAgVGhlIHNoX2xpbmsgZmllbGQgaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlCi0gICBzdHJpbmcgdGFibGUuICBUaGUgc2hfaW5mbyBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlCi0gICBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFN0cmluZyB0YWJsZSBpbmRleCBmb3IgbmFtZSBvZiBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX25hbWU7Ci0gIC8qIFRpbWUgc3RhbXAuICAqLwotICB1bnNpZ25lZCBsb25nIGxfdGltZV9zdGFtcDsKLSAgLyogQ2hlY2tzdW0gb2Ygc3ltYm9sIG5hbWVzIGFuZCBjb21tb24gc2l6ZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGxfY2hlY2tzdW07Ci0gIC8qIFN0cmluZyB0YWJsZSBpbmRleCBmb3IgdmVyc2lvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF92ZXJzaW9uOwotICAvKiBGbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF9mbGFnczsKLX0gRWxmMzJfTGliOwotCi0vKiBUaGUgZXh0ZXJuYWwgdmVyc2lvbiBvZiBFbGYzMl9MaWIuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciBsX25hbWVbNF07Ci0gIHVuc2lnbmVkIGNoYXIgbF90aW1lX3N0YW1wWzRdOwotICB1bnNpZ25lZCBjaGFyIGxfY2hlY2tzdW1bNF07Ci0gIHVuc2lnbmVkIGNoYXIgbF92ZXJzaW9uWzRdOwotICB1bnNpZ25lZCBjaGFyIGxfZmxhZ3NbNF07Ci19IEVsZjMyX0V4dGVybmFsX0xpYjsKLQotLyogVGhlIGxfZmxhZ3MgZmllbGQgb2YgYW4gRWxmMzJfTGliIHN0cnVjdHVyZSBtYXkgY29udGFpbiB0aGUKLSAgIGZvbGxvd2luZyBmbGFncy4gICovCi0KLS8qIFJlcXVpcmUgYW4gZXhhY3QgbWF0Y2ggYXQgcnVudGltZS4gICovCi0jZGVmaW5lIExMX0VYQUNUX01BVENICQkweDAwMDAwMDAxCi0KLS8qIElnbm9yZSB2ZXJzaW9uIGluY29tcGF0aWJpbGl0aWVzIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBMTF9JR05PUkVfSU5UX1ZFUgkweDAwMDAwMDAyCi0KLS8qIFJlcXVpcmUgbWF0Y2hpbmcgbWlub3IgdmVyc2lvbiBudW1iZXIuICAqLwotI2RlZmluZSBMTF9SRVFVSVJFX01JTk9SCTB4MDAwMDAwMDQKLQotLyogPz8/ICovCi0jZGVmaW5lIExMX0VYUE9SVFMJCTB4MDAwMDAwMDgKLQotLyogRGVsYXkgbG9hZGluZyBvZiB0aGlzIGxpYnJhcnkgdW50aWwgcmVhbGx5IG5lZWRlZC4gICovCi0jZGVmaW5lIExMX0RFTEFZX0xPQUQJCTB4MDAwMDAwMTAKLQotLyogPz8/IERlbHRhIEMrKyBzdHVmZiA/Pz8gKi8KLSNkZWZpbmUgTExfREVMVEEJCTB4MDAwMDAwMjAKLQotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19DT05GTElDVCBpcyBhbiBhcnJheSBvZiBpbmRpY2VzIGludG8gdGhlCi0gICAuZHluc3ltIHNlY3Rpb24uICBFYWNoIGVsZW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgdHlwZS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgRWxmMzJfQ29uZmxpY3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgRWxmMzJfRXh0ZXJuYWxfQ29uZmxpY3RbNF07Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBFbGY2NF9Db25mbGljdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBFbGY2NF9FeHRlcm5hbF9Db25mbGljdFs4XTsKLQotLyogQSBzZWN0aW9uIG9mIHR5cGUgU0hUX01JUFNfR1BUQUIgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaG93Ci0gICBtdWNoIEdQIHNwYWNlIHdvdWxkIGJlIHJlcXVpcmVkIGZvciBkaWZmZXJlbnQgLUcgYXJndW1lbnRzLiAgVGhpcwotICAgaW5mb3JtYXRpb24gaXMgb25seSB1c2VkIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4gcHJvdmlkZSBpbmZvcm1hdGl2ZQotICAgc3VnZ2VzdGlvbnMgYXMgdG8gdGhlIGJlc3QgLUcgdmFsdWUgdG8gdXNlLiAgVGhlIHNoX2luZm8gZmllbGQgaXMKLSAgIHRoZSBpbmRleCBvZiB0aGUgc2VjdGlvbiBmb3Igd2hpY2ggdGhpcyBpbmZvcm1hdGlvbiBhcHBsaWVzLiAgVGhlCi0gICBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcmUgYW4gYXJyYXkgb2YgdGhlIGZvbGxvd2luZyB1bmlvbi4gIFRoZQotICAgZmlyc3QgZWxlbWVudCB1c2VzIHRoZSBndF9oZWFkZXIgZmllbGQuICBUaGUgcmVtYWluaW5nIGVsZW1lbnRzIHVzZQotICAgdGhlIGd0X2VudHJ5IGZpZWxkLiAgKi8KLXR5cGVkZWYgdW5pb24KLXsKLSAgc3RydWN0Ci0gICAgewotICAgICAgLyogLUcgdmFsdWUgYWN0dWFsbHkgdXNlZCBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGd0X2N1cnJlbnRfZ192YWx1ZTsKLSAgICAgIC8qIFVudXNlZC4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGd0X3VudXNlZDsKLSAgICB9IGd0X2hlYWRlcjsKLSAgc3RydWN0Ci0gICAgewotICAgICAgLyogSWYgdGhpcyAtRyBhcmd1bWVudCBoYXMgYmVlbiB1c2VkLi4uICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBndF9nX3ZhbHVlOwotICAgICAgLyogLi4udGhpcyBtYW55IEdQIHNlY3Rpb24gYnl0ZXMgd291bGQgYmUgcmVxdWlyZWQuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBndF9ieXRlczsKLSAgICB9IGd0X2VudHJ5OwotfSBFbGYzMl9ncHRhYjsKLQotLyogVGhlIGV4dGVybmFsIHZlcnNpb24gb2YgRWxmMzJfZ3B0YWIuICAqLwotCi10eXBlZGVmIHVuaW9uCi17Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfY3VycmVudF9nX3ZhbHVlWzRdOwotICAgICAgdW5zaWduZWQgY2hhciBndF91bnVzZWRbNF07Ci0gICAgfSBndF9oZWFkZXI7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfZ192YWx1ZVs0XTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfYnl0ZXNbNF07Ci0gICAgfSBndF9lbnRyeTsKLX0gRWxmMzJfRXh0ZXJuYWxfZ3B0YWI7Ci0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8gY29udGFpbnMgdGhlIGZvbGxvd2luZwotICAgc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICBsb25nIHJpX2dwX3ZhbHVlOwotfSBFbGYzMl9SZWdJbmZvOwotCi0vKiBUaGUgZXh0ZXJuYWwgdmVyc2lvbiBvZiB0aGUgRWxmX1JlZ0luZm8gc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgcmlfZ3BybWFza1s0XTsKLSAgdW5zaWduZWQgY2hhciByaV9jcHJtYXNrWzRdWzRdOwotICB1bnNpZ25lZCBjaGFyIHJpX2dwX3ZhbHVlWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvOwotCi0vKiBNSVBTIEVMRiAucmVnaW5mbyBzd2FwcGluZyByb3V0aW5lcy4gICovCi1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKiwgRWxmMzJfUmVnSW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9SZWdJbmZvICosIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikpOwotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLwotCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgZ2xvYmFsIGRhdGEgYXJlYS4gICovCi0jZGVmaW5lIFNIRl9NSVBTX0dQUkVMCQkweDEwMDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBzaG91bGQgYmUgbWVyZ2VkLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfTUVSR0UJCTB4MjAwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIDMyIGJpdCBhZGRyZXNzZXMuICAqLwotI2RlZmluZSBTSEZfTUlQU19BRERSMzIJCTB4NDAwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIDY0IGJpdCBhZGRyZXNzZXMuICAqLwotI2RlZmluZSBTSEZfTUlQU19BRERSNjQJCTB4ODAwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIG1heSBub3QgYmUgc3RyaXBwZWQuICAqLwotI2RlZmluZSBTSEZfTUlQU19OT1NUUklQCTB4MDgwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIGlzIGxvY2FsIHRvIHRocmVhZHMuICAqLwotI2RlZmluZSBTSEZfTUlQU19MT0NBTAkJMHgwNDAwMDAwMAotCi0vKiBMaW5rZXIgc2hvdWxkIGdlbmVyYXRlIGltcGxpY2l0IHdlYWsgbmFtZXMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNIRl9NSVBTX05BTUVTCQkweDAyMDAwMDAwCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgdHlwZXMuICAqLwotCi0vKiBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gIElkZW50aWZpZXMgb25lIC5yZWdpbmZvIHNlY3Rpb24uICAqLwotI2RlZmluZSBQVF9NSVBTX1JFR0lORk8JCTB4NzAwMDAwMDAKLQotLyogUnVudGltZSBwcm9jZWR1cmUgdGFibGUuICAqLwotI2RlZmluZSBQVF9NSVBTX1JUUFJPQwkJMHg3MDAwMDAwMQotCi0vKiBPcHRpb25zIChmb3Igd2hhdCA/Pz8pLiAgKi8KLSNkZWZpbmUgUFRfTUlQU19PUFRJT05TCQkweDcwMDAwMDAyCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZHluYW1pYyBhcnJheSB0YWdzLiAgKi8KLQotLyogMzIgYml0IHZlcnNpb24gbnVtYmVyIGZvciBydW50aW1lIGxpbmtlciBpbnRlcmZhY2UuICAqLwotI2RlZmluZSBEVF9NSVBTX1JMRF9WRVJTSU9OCTB4NzAwMDAwMDEKLQotLyogVGltZSBzdGFtcC4gICovCi0jZGVmaW5lIERUX01JUFNfVElNRV9TVEFNUAkweDcwMDAwMDAyCi0KLS8qIENoZWNrc3VtIG9mIGV4dGVybmFsIHN0cmluZ3MgYW5kIGNvbW1vbiBzaXplcy4gICovCi0jZGVmaW5lIERUX01JUFNfSUNIRUNLU1VNCTB4NzAwMDAwMDMKLQotLyogSW5kZXggb2YgdmVyc2lvbiBzdHJpbmcgaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19JVkVSU0lPTgkweDcwMDAwMDA0Ci0KLS8qIDMyIGJpdHMgb2YgZmxhZ3MuICAqLwotI2RlZmluZSBEVF9NSVBTX0ZMQUdTCQkweDcwMDAwMDA1Ci0KLS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgc2VnbWVudC4gICovCi0jZGVmaW5lIERUX01JUFNfQkFTRV9BRERSRVNTCTB4NzAwMDAwMDYKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfTVNZTQkJMHg3MDAwMDAwNwotCi0vKiBBZGRyZXNzIG9mIC5jb25mbGljdCBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19DT05GTElDVAkweDcwMDAwMDA4Ci0KLS8qIEFkZHJlc3Mgb2YgLmxpYmxpc3Qgc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfTElCTElTVAkJMHg3MDAwMDAwOQotCi0vKiBOdW1iZXIgb2YgbG9jYWwgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1ROTwkweDcwMDAwMDBhCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAuY29uZmxpY3Qgc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfQ09ORkxJQ1ROTwkweDcwMDAwMDBiCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAubGlibGlzdCBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19MSUJMSVNUTk8JMHg3MDAwMDAxMAotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19TWU1UQUJOTwkweDcwMDAwMDExCi0KLS8qIEluZGV4IG9mIGZpcnN0IGV4dGVybmFsIGR5bmFtaWMgc3ltYm9sIG5vdCByZWZlcmVuY2VkIGxvY2FsbHkuICAqLwotI2RlZmluZSBEVF9NSVBTX1VOUkVGRVhUTk8JMHg3MDAwMDAxMgotCi0vKiBJbmRleCBvZiBmaXJzdCBkeW5hbWljIHN5bWJvbCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19HT1RTWU0JCTB4NzAwMDAwMTMKLQotLyogTnVtYmVyIG9mIHBhZ2UgdGFibGUgZW50cmllcyBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ISVBBR0VOTwkweDcwMDAwMDE0Ci0KLS8qIEFkZHJlc3Mgb2YgcnVuIHRpbWUgbG9hZGVyIG1hcCwgdXNlZCBmb3IgZGVidWdnaW5nLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19STERfTUFQCQkweDcwMDAwMDE2Ci0KLS8qIERlbHRhIEMrKyBjbGFzcyBkZWZpbml0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTUwkweDcwMDAwMDE3Ci0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfQ0xBU1MuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05PCTB4NzAwMDAwMTgKLQotLyogRGVsdGEgQysrIGNsYXNzIGluc3RhbmNlcy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfSU5TVEFOQ0UJMHg3MDAwMDAxOQotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTwkweDcwMDAwMDFhCi0KLS8qIERlbHRhIHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQwkweDcwMDAwMDFiCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfUkVMT0MuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX1JFTE9DX05PCTB4NzAwMDAwMWMKLQotLyogRGVsdGEgc3ltYm9scyB0aGF0IERlbHRhIHJlbG9jYXRpb25zIHJlZmVyIHRvLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9TWU0JMHg3MDAwMDAxZAotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX1NZTS4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfU1lNX05PCTB4NzAwMDAwMWUKLQotLyogRGVsdGEgc3ltYm9scyB0aGF0IGhvbGQgY2xhc3MgZGVjbGFyYXRpb25zLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU1NZTQkweDcwMDAwMDIwCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfQ0xBU1NTWU0uICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNX05PCTB4NzAwMDAwMjEKLQotLyogRmxhZ3MgaW5kaWNhdGluZyBpbmZvcm1hdGlvbiBhYm91dCBDKysgZmxhdm9yLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19DWFhfRkxBR1MJMHg3MDAwMDAyMgotCi0vKiBQaXhpZSBpbmZvcm1hdGlvbiAoPz8/KS4gICovCi0jZGVmaW5lIERUX01JUFNfUElYSUVfSU5JVAkweDcwMDAwMDIzCi0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX1NZTUJPTF9MSUIJMHg3MDAwMDAyNAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19MT0NBTFBBR0VfR09USURYCTB4NzAwMDAwMjUKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfTE9DQUxfR09USURYCTB4NzAwMDAwMjYKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfSElEREVOX0dPVElEWAkweDcwMDAwMDI3Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX1BST1RFQ1RFRF9HT1RJRFgJMHg3MDAwMDAyOAotCi0vKiBBZGRyZXNzIG9mIGAuTUlQUy5vcHRpb25zJy4gICovCi0jZGVmaW5lIERUX01JUFNfT1BUSU9OUwkJMHg3MDAwMDAyOQotCi0vKiBBZGRyZXNzIG9mIGAuaW50ZXJmYWNlJy4gICovCi0jZGVmaW5lIERUX01JUFNfSU5URVJGQUNFCTB4NzAwMDAwMmEKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfRFlOU1RSX0FMSUdOCTB4NzAwMDAwMmIKLQotLyogU2l6ZSBvZiB0aGUgLmludGVyZmFjZSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19JTlRFUkZBQ0VfU0laRQkweDcwMDAwMDJjCi0KLS8qIFNpemUgb2YgcmxkX3RleHRfcmVzb2x2ZSBmdW5jdGlvbiBzdG9yZWQgaW4gdGhlIEdPVC4gICovCi0jZGVmaW5lIERUX01JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSCTB4NzAwMDAwMmQKLQotLyogRGVmYXVsdCBzdWZmaXggb2YgRFNPIHRvIGJlIGFkZGVkIGJ5IHJsZCBvbiBkbG9wZW4oKSBjYWxscy4gICovCi0jZGVmaW5lIERUX01JUFNfUEVSRl9TVUZGSVgJMHg3MDAwMDAyZQotCi0vKiBTaXplIG9mIGNvbXBhY3QgcmVsb2NhdGlvbiBzZWN0aW9uIChPMzIpLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19DT01QQUNUX1NJWkUJMHg3MDAwMDAyZgotCi0vKiBHUCB2YWx1ZSBmb3IgYXV4aWxpYXJ5IEdPVHMuICAqLwotI2RlZmluZSBEVF9NSVBTX0dQX1ZBTFVFCTB4NzAwMDAwMzAKLQotLyogQWRkcmVzcyBvZiBhdXhpbGlhcnkgLmR5bmFtaWMuICAqLwotI2RlZmluZSBEVF9NSVBTX0FVWF9EWU5BTUlDCTB4NzAwMDAwMzEKLQwKLS8qIEZsYWdzIHdoaWNoIG1heSBhcHBlYXIgaW4gYSBEVF9NSVBTX0ZMQUdTIGVudHJ5LiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBSSEZfTk9ORQkJMHgwMDAwMDAwMAotCi0vKiBVc2VzIHNob3J0Y3V0IHBvaW50ZXJzLiAgKi8KLSNkZWZpbmUgUkhGX1FVSUNLU1RBUlQJCTB4MDAwMDAwMDEKLQotLyogSGFzaCBzaXplIGlzIG5vdCBhIHBvd2VyIG9mIHR3by4gICovCi0jZGVmaW5lIFJIRl9OT1RQT1QJCTB4MDAwMDAwMDIKLQotLyogSWdub3JlIExEX0xJQlJBUllfUEFUSC4gICovCi0jZGVmaW5lIFJIU19OT19MSUJSQVJZX1JFUExBQ0VNRU5UIFwKLQkJCQkweDAwMDAwMDA0Ci0KLSNkZWZpbmUgUkhGX05PX01PVkUJCSAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUkhGX1NHSV9PTkxZCQkgICAweDAwMDAwMDEwCi0jZGVmaW5lIFJIRl9HVUFSQU5URUVfSU5JVAkgICAweDAwMDAwMDIwCi0jZGVmaW5lIFJIRl9ERUxUQV9DX1BMVVNfUExVUwkgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJIRl9HVUFSQU5URUVfU1RBUlRfSU5JVCAgIDB4MDAwMDAwODAKLSNkZWZpbmUgUkhGX1BJWElFCQkgICAweDAwMDAwMTAwCi0jZGVmaW5lIFJIRl9ERUZBVUxUX0RFTEFZX0xPQUQJICAgMHgwMDAwMDIwMAotI2RlZmluZSBSSEZfUkVRVUlDS1NUQVJUCSAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVEVECSAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgUkhGX0NPUkQJCSAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgUkhGX05PX1VOUkVTX1VOREVGCSAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgUkhGX1JMRF9PUkRFUl9TQUZFCSAgIDB4MDAwMDQwMDAKLQwKLS8qIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlCi0gICBhcmUgdXNlZCBpbiBhbiBJcml4IDUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotCi0jZGVmaW5lIFNUT19ERUZBVUxUCQkweDAwCi0jZGVmaW5lIFNUT19JTlRFUk5BTAkJMHgwMQotI2RlZmluZSBTVE9fSElEREVOCQkweDAyCi0jZGVmaW5lIFNUT19QUk9URUNURUQJCTB4MDMKLQotLyogVGhpcyB2YWx1ZSBpcyB1c2VkIGZvciBhIG1pcHMxNiAudGV4dCBzeW1ib2wuICAqLwotI2RlZmluZSBTVE9fTUlQUzE2CQkweGYwCi0MCi0vKiBUaGUgNjQtYml0IE1JUFMgRUxGIEFCSSB1c2VzIGFuIHVudXN1YWwgcmVsb2MgZm9ybWF0LiAgRWFjaAotICAgcmVsb2NhdGlvbiBlbnRyeSBzcGVjaWZpZXMgdXAgdG8gdGhyZWUgYWN0dWFsIHJlbG9jYXRpb25zLCBhbGwgYXQKLSAgIHRoZSBzYW1lIGFkZHJlc3MuICBUaGUgZmlyc3QgcmVsb2NhdGlvbiB3aGljaCByZXF1aXJlZCBhIHN5bWJvbAotICAgdXNlcyB0aGUgc3ltYm9sIGluIHRoZSByX3N5bSBmaWVsZC4gIFRoZSBzZWNvbmQgcmVsb2NhdGlvbiB3aGljaAotICAgcmVxdWlyZXMgYSBzeW1ib2wgdXNlcyB0aGUgc3ltYm9sIGluIHRoZSByX3NzeW0gZmllbGQuICBJZiBhbGwKLSAgIHRocmVlIHJlbG9jYXRpb25zIHJlcXVpcmUgYSBzeW1ib2wsIHRoZSB0aGlyZCBvbmUgdXNlcyBhIHplcm8KLSAgIHZhbHVlLiAgKi8KLQotLyogQW4gZW50cnkgaW4gYSA2NCBiaXQgU0hUX1JFTCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX29mZnNldFs4XTsKLSAgLyogU3ltYm9sIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3N5bVs0XTsKLSAgLyogU3BlY2lhbCBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3N5bVsxXTsKLSAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlM1sxXTsKLSAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTJbMV07Ci0gIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsKLX0gRWxmNjRfTWlwc19FeHRlcm5hbF9SZWw7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCi0gIGJmZF92bWEgcl9vZmZzZXQ7Ci0gIC8qIFN5bWJvbCBpbmRleC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcl9zeW07Ci0gIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3NzeW07Ci0gIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTM7Ci0gIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUyOwotICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGU7Ci19IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsOwotCi0vKiBBbiBlbnRyeSBpbiBhIDY0IGJpdCBTSFRfUkVMQSBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX29mZnNldFs4XTsKLSAgLyogU3ltYm9sIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3N5bVs0XTsKLSAgLyogU3BlY2lhbCBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3N5bVsxXTsKLSAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlM1sxXTsKLSAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTJbMV07Ci0gIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsKLSAgLyogQWRkZW5kLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX2FkZGVuZFs4XTsKLX0gRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLwotICBiZmRfdm1hIHJfb2Zmc2V0OwotICAvKiBTeW1ib2wgaW5kZXguICAqLwotICB1bnNpZ25lZCBsb25nIHJfc3ltOwotICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zc3ltOwotICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUzOwotICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMjsKLSAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlOwotICAvKiBBZGRlbmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSByX2FkZGVuZDsKLX0gRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhOwotCi0vKiBWYWx1ZXMgZm91bmQgaW4gdGhlIHJfc3N5bSBmaWVsZCBvZiBhIHJlbG9jYXRpb24gZW50cnkuICAqLwotCi0vKiBObyByZWxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgUlNTX1VOREVGCTAKLQotLyogVmFsdWUgb2YgR1AuICAqLwotI2RlZmluZSBSU1NfR1AJCTEKLQotLyogVmFsdWUgb2YgR1AgaW4gb2JqZWN0IGJlaW5nIHJlbG9jYXRlZC4gICovCi0jZGVmaW5lIFJTU19HUDAJCTIKLQotLyogQWRkcmVzcyBvZiBsb2NhdGlvbiBiZWluZyByZWxvY2F0ZWQuICAqLwotI2RlZmluZSBSU1NfTE9DCQkzCi0MCi0vKiBBIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbiBjb250YWlucyBhIHNlcmllcyBvZiBvcHRpb25zLCBlYWNoIG9mCi0gICB3aGljaCBzdGFydHMgd2l0aCB0aGlzIGhlYWRlci4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFR5cGUgb2Ygb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBraW5kWzFdOwotICAvKiBTaXplIG9mIG9wdGlvbiBkZXNjcmlwdG9yLCBpbmNsdWRpbmcgaGVhZGVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplWzFdOwotICAvKiBTZWN0aW9uIGluZGV4IG9mIGFmZmVjdGVkIHNlY3Rpb24sIG9yIDAgZm9yIGdsb2JhbCBvcHRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHNlY3Rpb25bMl07Ci0gIC8qIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMga2luZCBvZiBvcHRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIGluZm9bNF07Ci19IEVsZl9FeHRlcm5hbF9PcHRpb25zOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUeXBlIG9mIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIga2luZDsKLSAgLyogU2l6ZSBvZiBvcHRpb24gZGVzY3JpcHRvciwgaW5jbHVkaW5nIGhlYWRlci4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgLyogU2VjdGlvbiBpbmRleCBvZiBhZmZlY3RlZCBzZWN0aW9uLCBvciAwIGZvciBnbG9iYWwgb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgc2VjdGlvbjsKLSAgLyogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBraW5kIG9mIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgaW5mbzsKLX0gRWxmX0ludGVybmFsX09wdGlvbnM7Ci0KLS8qIE1JUFMgRUxGIG9wdGlvbiBoZWFkZXIgc3dhcHBpbmcgcm91dGluZXMuICAqLwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX09wdGlvbnMgKiwgRWxmX0ludGVybmFsX09wdGlvbnMgKikpOwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9PcHRpb25zICosIEVsZl9FeHRlcm5hbF9PcHRpb25zICopKTsKLQotLyogVmFsdWVzIHdoaWNoIG1heSBhcHBlYXIgaW4gdGhlIGtpbmQgZmllbGQgb2YgYW4gRWxmX09wdGlvbnMKLSAgIHN0cnVjdHVyZS4gICovCi0KLS8qIFVuZGVmaW5lZC4gICovCi0jZGVmaW5lIE9ES19OVUxMCTAKLQotLyogUmVnaXN0ZXIgdXNhZ2UgYW5kIEdQIHZhbHVlLiAgKi8KLSNkZWZpbmUgT0RLX1JFR0lORk8JMQotCi0vKiBFeGNlcHRpb24gcHJvY2Vzc2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIE9ES19FWENFUFRJT05TCTIKLQotLyogU2VjdGlvbiBwYWRkaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgT0RLX1BBRAkJMwotCi0vKiBIYXJkd2FyZSB3b3JrYXJvdW5kcyBwZXJmb3JtZWQuICAqLwotI2RlZmluZSBPREtfSFdQQVRDSAk0Ci0KLS8qIEZpbGwgdmFsdWUgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLSNkZWZpbmUgT0RLX0ZJTEwJNQotCi0vKiBSZXNlcnZlZCBzcGFjZSBmb3IgZGVza3RvcCB0b29scy4gICovCi0jZGVmaW5lIE9ES19UQUdTCTYKLQotLyogSGFyZHdhcmUgd29ya2Fyb3VuZHMsIEFORCBiaXRzIHdoZW4gbWVyZ2luZy4gICovCi0jZGVmaW5lIE9ES19IV0FORAk3Ci0KLS8qIEhhcmR3YXJlIHdvcmthcm91bmRzLCBPUiBiaXRzIHdoZW4gbWVyZ2luZy4gICovCi0jZGVmaW5lIE9ES19IV09SCTgKLQotLyogR1AgZ3JvdXAgdG8gdXNlIGZvciB0ZXh0L2RhdGEgc2VjdGlvbnMuICAqLwotI2RlZmluZSBPREtfR1BfR1JPVVAJOQotCi0vKiBJRCBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIE9ES19JREVOVAkxMAotCi0vKiBJbiB0aGUgMzIgYml0IEFCSSwgYW4gT0RLX1JFR0lORk8gb3B0aW9uIGlzIGp1c3QgYSBFbGYzMl9SZWdJbmZvCi0gICBzdHJ1Y3R1cmUuICBJbiB0aGUgNjQgYml0IEFCSSwgaXQgaXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuICBUaGUKLSAgIGluZm8gZmllbGQgb2YgdGhlIG9wdGlvbnMgaGVhZGVyIGlzIG5vdCB1c2VkLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTWFzayBvZiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBjaGFyIHJpX2dwcm1hc2tbNF07Ci0gIC8qIFBhZGRpbmcuICAqLwotICB1bnNpZ25lZCBjaGFyIHJpX3BhZFs0XTsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBjaGFyIHJpX2Nwcm1hc2tbNF1bNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgdW5zaWduZWQgY2hhciByaV9ncF92YWx1ZVs4XTsKLX0gRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTWFzayBvZiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2dwcm1hc2s7Ci0gIC8qIFBhZGRpbmcuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX3BhZDsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2Nwcm1hc2tbNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgYmZkX3ZtYSByaV9ncF92YWx1ZTsKLX0gRWxmNjRfSW50ZXJuYWxfUmVnSW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIGhhc2ggdmFsdWUgY29tcHV0ZWQgZnJvbSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZwotICAgICBkeW5hbWljIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgbXNfaGFzaF92YWx1ZVs0XTsKLSAgLyogQ29udGFpbnMgYm90aCB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGluZGV4IGFuZCB0aGUgc3ltYm9sIGZsYWdzCi0gICAgIGZpZWxkLiAgVGhlIG1hY3JvcyBFTEYzMl9NU19SRUxfSU5ERVggYW5kIEVMRjMyX01TX0ZMQUdTIGFyZSB1c2VkCi0gICAgIHRvIGFjY2VzcyB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMuICBUaGUgZHluYW1pYyByZWxvY2F0aW9uIGluZGV4Ci0gICAgIGlkZW50aWZpZXMgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSAucmVsLmR5biBzZWN0aW9uIHRoYXQKLSAgICAgcmVmZXJlbmNlcyB0aGUgZHluYW1pYyBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGlzIG1zeW0gZW50cnkuCi0gICAgIElmIHRoZSBpbmRleCBpcyAwLCBubyBkeW5hbWljIHJlbG9jYXRpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgIHN5bWJvbC4gIFRoZSBzeW1ib2wgZmxhZ3MgZmllbGQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICAqLwotICB1bnNpZ25lZCBjaGFyIG1zX2luZm9bNF07Ci19IEVsZjMyX0V4dGVybmFsX01zeW07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRoZSBoYXNoIHZhbHVlIGNvbXB1dGVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgZHluYW1pYyBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBsb25nIG1zX2hhc2hfdmFsdWU7Ci0gIC8qIENvbnRhaW5zIGJvdGggdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmRleCBhbmQgdGhlIHN5bWJvbCBmbGFncwotICAgICBmaWVsZC4gIFRoZSBtYWNyb3MgRUxGMzJfTVNfUkVMX0lOREVYIGFuZCBFTEYzMl9NU19GTEFHUyBhcmUgdXNlZAotICAgICB0byBhY2Nlc3MgdGhlIGluZGl2aWR1YWwgdmFsdWVzLiAgVGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmRleAotICAgICBpZGVudGlmaWVzIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgLnJlbC5keW4gc2VjdGlvbiB0aGF0Ci0gICAgIHJlZmVyZW5jZXMgdGhlIGR5bmFtaWMgc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtc3ltIGVudHJ5LgotICAgICBJZiB0aGUgaW5kZXggaXMgMCwgbm8gZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICBzeW1ib2wuICBUaGUgc3ltYm9sIGZsYWdzIGZpZWxkIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtc19pbmZvOwotfSBFbGYzMl9JbnRlcm5hbF9Nc3ltOwotCi0jZGVmaW5lIEVMRjMyX01TX1JFTF9JTkRFWChpKSAoKGkpID4+IDgpCi0jZGVmaW5lIEVMRjMyX01TX0ZMQUdTKGkpICAgICAoaSkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9NU19JTkZPKHIsIGYpICAgKCgocikgPDwgOCkgKyAoKGYpICYgMHhmZikpCi0KLS8qIE1JUFMgRUxGIHJlZ2luZm8gc3dhcHBpbmcgcm91dGluZXMuICAqLwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICosIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKikpOwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyAqLCBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICopKTsKLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmsgb2YgYW4gT0RLX0VYQ0VQVElPTlMgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9FWF9GUFVfTUlOCTB4MWYJLyogRlBFcyB3aGljaCBtdXN0IGJlIGVuYWJsZWQuICAqLwotI2RlZmluZSBPRVhfRlBVX01BWAkweDFmMDAJLyogRlBFcyB3aGljaCBtYXkgYmUgZW5hYmxlZC4gICovCi0jZGVmaW5lIE9FWF9QQUdFMAkweDEwMDAwCS8qIFBhZ2UgemVybyBtdXN0IGJlIG1hcHBlZC4gICovCi0jZGVmaW5lIE9FWF9TTU0JCTB4MjAwMDAJLyogRm9yY2Ugc2VxdWVudGlhbCBtZW1vcnkgbW9kZS4gICovCi0jZGVmaW5lIE9FWF9GUERCVUcJMHg0MDAwMAkvKiBGb3JjZSBmbG9hdGluZy1wb2ludCBkZWJ1ZyBtb2RlLiAgKi8KLSNkZWZpbmUgT0VYX0RJU01JU1MJMHg4MDAwMAkvKiBEaXNtaXNzIGludmFsaWQgYWRkcmVzcyBmYXVsdHMuICAqLwotCi0vKiBNYXNrcyBvZiB0aGUgRlAgZXhjZXB0aW9ucyBmb3IgT0VYX0ZQVV9NSU4gYW5kIE9FWF9GUFVfTUFYLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9JTlZBTAkweDEwCS8qIEludmFsaWQgb3BlcmF0aW9uIGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfRElWMAkweDA4CS8qIERpdmlzaW9uIGJ5IHplcm8gZXhjZXB0aW9uLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9PRkxPCTB4MDQJLyogT3ZlcmZsb3cgZXhjZXB0aW9uLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9VRkxPCTB4MDIJLyogVW5kZXJmbG93IGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfSU5FWAkweDAxCS8qIEluZXhhY3QgZXhjZXB0aW9uLiAgKi8KLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX1BBRCBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT1BBRF9QUkVGSVgJMHgwMQotI2RlZmluZSBPUEFEX1BPU1RGSVgJMHgwMgotI2RlZmluZSBPUEFEX1NZTUJPTAkweDA0Ci0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19IV1BBVENIIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPSFdfUjRLRU9QCTB4MDEJLyogUjQwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjhLUEZFVENICTB4MDIJLyogTWF5IG5lZWQgUjgwMDAgcHJlZmV0Y2ggcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjVLRU9QCTB4MDQJLyogUjUwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjVLQ1ZUTAkweDA4CS8qIFI1MDAwIGN2dC5bZHNdLmwgYnVnIChjbGVhbiA9PSAxKS4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19JREVOVC9PREtfR1BfR1JPVVAgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9HUF9HUk9VUAkweDAwMDBmZmZmCS8qIEdQIGdyb3VwIG51bWJlci4gICovCi0jZGVmaW5lIE9HUF9TRUxGCTB4ZmZmZjAwMDAJLyogU2VsZi1jb250YWluZWQgR1AgZ3JvdXBzLiAgKi8KLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX0hXQU5EL09ES19IV09SIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPSFdBMF9SNEtFT1BfQ0hFQ0tFRAkweDAwMDAwMDAxCi0jZGVmaW5lIE9IV0EwX1I0S0VPUF9DTEVBTgkweDAwMDAwMDAyCi0MCi0KLSNlbmRpZiAvKiBfRUxGX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbW4xMDIwMC5oIGIvaW5jbHVkZS9lbGYvbW4xMDIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTI5ZTBhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL21uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIE1OMTAyMDAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1OMTAyMDAgRUxGIEFCSS4gKi8KLQotI2lmbmRlZiBfRUxGX01OMTAyMDBfSAotI2RlZmluZSBfRUxGX01OMTAyMDBfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbW4xMDIwMF9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF8zMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfMTYsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzgsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzI0LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDgsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwX1BDUkVMMTYsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwX1BDUkVMMjQsIDcpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9NTjEwMjAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21uMTAzMDAuaCBiL2luY2x1ZGUvZWxmL21uMTAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhMDc1MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tbjEwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBNTjEwMzAwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNTjEwMzAwIEVMRiBBQkkuICovCi0KLSNpZm5kZWYgX0VMRl9NTjEwMzAwX0gKLSNkZWZpbmUgX0VMRl9NTjEwMzAwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21uMTAzMDBfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzE2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF84LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDMyLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDE2LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDgsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX0dOVV9WVEVOVFJZLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF8yNCwgOSkKLSAgRU1QVFlfUkVMT0MgIChSX01OMTAzMDBfTUFYKQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogTWFjaGluZSB2YXJpYW50IGlmIHdlIGtub3cgaXQuICBUaGlzIGZpZWxkIHdhcyBpbnZlbnRlZCBhdCBDeWdudXMsCi0gICBidXQgaXQgaXMgaG9wZWQgdGhhdCBvdGhlciB2ZW5kb3JzIHdpbGwgYWRvcHQgaXQuICBJZiBzb21lIHN0YW5kYXJkCi0gICBpcyBkZXZlbG9wZWQsIHRoaXMgY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBmb2xsb3cgaXQuICovCi0KLSNkZWZpbmUgRUZfTU4xMDMwMF9NQUNICQkweDAwRkYwMDAwCi0KLS8qIEN5Z251cyBpcyBjaG9vc2luZyB2YWx1ZXMgYmV0d2VlbiA4MCBhbmQgOUY7Ci0gICAwMCAtIDdGIHNob3VsZCBiZSBsZWZ0IGZvciBhIGZ1dHVyZSBzdGFuZGFyZDsKLSAgIHRoZSByZXN0IGFyZSBvcGVuLiAqLwotCi0jZGVmaW5lIEVfTU4xMDMwMF9NQUNIX01OMTAzMDAJMHgwMDgxMDAwMAotI2VuZGlmIC8qIF9FTEZfTU4xMDMwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9wcGMuaCBiL2luY2x1ZGUvZWxmL3BwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzExNmQ4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3BwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qIFBQQyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBNaWNoYWVsIE1laXNzbmVyLCBDeWdudXMgU3VwcG9ydCwgPG1laXNzbmVyQGN5Z251cy5jb20+LCBmcm9tIGluZm9ybWF0aW9uCi0gICBpbiB0aGUgU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgUG93ZXJQQyBQcm9jZXNzb3IgU3VwcGxlbWVudAotICAgYW5kIHRoZSBQb3dlclBDIEVtYmVkZGVkIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UgKGVhYmkpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgUFBDIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX1BQQ19ICi0jZGVmaW5lIF9FTEZfUFBDX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3BwY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIyNCwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTYsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2X0xPLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNl9ISSwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTZfSEEsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE0LCA3KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNF9CUlRBS0VOLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNF9CUk5UQUtFTiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwyNCwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMTQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0X0JSVEFLRU4sIDEyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0X0JSTlRBS0VOLCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNiwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTZfTE8sIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2X0hJLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNl9IQSwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUUkVMMjQsIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0NPUFksIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dMT0JfREFULCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19KTVBfU0xPVCwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMQVRJVkUsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0xPQ0FMMjRQQywgMjMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfVUFERFIzMiwgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfVUFERFIxNiwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMzIsIDI2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDMyLCAyNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFRSRUwzMiwgMjgpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMTZfTE8sIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDE2X0hJLCAzMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQxNl9IQSwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfU0RBUkVMMTYsIDMyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkYsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfTE8sIDM0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfSEksIDM1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfSEEsIDM2KQotCi0vKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZnJvbSB0aGUgRW1iZWRkZWQgRUxGIEFCSSwgYW5kIGFyZSBub3QKLSAgIGluIHRoZSBTVlI0IEVMRiBBQkkuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjMyLCAxMDEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTYsIDEwMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNl9MTywgMTAzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2X0hJLCAxMDQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTZfSEEsIDEwNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBSTE2LCAxMDYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQTJJMTYsIDEwNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBMlJFTCwgMTA4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREEyMSwgMTA5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9NUktSRUYsIDExMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU0VDMTYsIDExMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfTE8sIDExMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfSEksIDExMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfSEEsIDExNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfQklUX0ZMRCwgMTE1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTREEsIDExNikKLQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HTlVfVlRJTkhFUklULCAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR05VX1ZURU5UUlksIDI1NCkKLQotLyogVGhpcyBpcyBhIHBob255IHJlbG9jIHRvIGhhbmRsZSBhbnkgb2xkIGZhc2hpb25lZCBUT0MxNiByZWZlcmVuY2VzCi0gICB0aGF0IG1heSBzdGlsbCBiZSBpbiBvYmplY3QgZmlsZXMuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1RPQzE2LCAyNTUpCi0KLSAgRU1QVFlfUkVMT0MgKFJfUFBDX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotI2RlZmluZQlFRl9QUENfRU1CCQkweDgwMDAwMDAwCS8qIFBvd2VyUEMgZW1iZWRkZWQgZmxhZyAgKi8KLQotCQkJCQkJLyogQ1lHTlVTIGxvY2FsIGJpdHMgYmVsb3cgKi8KLSNkZWZpbmUJRUZfUFBDX1JFTE9DQVRBQkxFCTB4MDAwMTAwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlIGZsYWcgKi8KLSNkZWZpbmUJRUZfUFBDX1JFTE9DQVRBQkxFX0xJQgkweDAwMDA4MDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZS1saWIgZmxhZyAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBoZWFkZXJzLCBzaF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUgU0hUX09SREVSRUQJCVNIVF9ISVBST0MJLyogTGluayBlZGl0b3IgaXMgdG8gc29ydCB0aGUgXAotCQkJCQkJICAgZW50cmllcyBpbiB0aGlzIHNlY3Rpb24gXAotCQkJCQkJICAgYmFzZWQgb24gdGhlIGFkZHJlc3MgXAotCQkJCQkJICAgc3BlY2lmaWVkIGluIHRoZSBhc3NvY2lhdGVkIFwKLQkJCQkJCSAgIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLCBzaF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFNIRl9FWENMVURFCQkweDgwMDAwMDAwCS8qIExpbmsgZWRpdG9yIGlzIHRvIGV4Y2x1ZGUgXAotCQkJCQkJICAgdGhpcyBzZWN0aW9uIGZyb20gZXhlY3V0YWJsZSBcCi0JCQkJCQkgICBhbmQgc2hhcmVkIG9iamVjdHMgdGhhdCBpdCBcCi0JCQkJCQkgICBidWlsZHMgd2hlbiB0aG9zZSBvYmplY3RzIFwKLQkJCQkJCSAgIGFyZSBub3QgdG8gYmUgZnVyaHRlciBcCi0JCQkJCQkgICByZWxvY2F0ZWQuICAqLwotI2VuZGlmIC8qIF9FTEZfUFBDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oIGIvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTc0Y2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogR2VuZXJpYyByZWxvY2F0aW9uIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYnkgdGhlIHZhcmlvdXMgKi5oIHRhcmdldCBzcGVjaWZpYyBoZWFkZXIKLSAgIGZpbGVzIHRvIGVpdGhlciBnZW5lcmF0ZSBhbiBlbnVtIGNvbnRhaW5pbmcgYWxsIHRoZSBrbm93biByZWxvY2F0aW9ucwotICAgZm9yIHRoYXQgdGFyZ2V0LCBvciBpZiBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgaXMgZGVmaW5lZCwgYSByZWNvZ25pdGlvbgotICAgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGluc3RlYWQuICAoVGhpcyBpcyB1c2VkIGJ5IGJpbnV0aWxzL3JlYWRlbGYuYykKLQotICAgR2l2ZW4gYSBoZWFkZXIgZmlsZSBsaWtlIHRoaXM6Ci0KLSAgIAlTVEFSVF9SRUxPQ19OVU1CRVJTIChmb28pCi0gICAJICAgIFJFTE9DX05VTUJFUiAoUl9mb29fTk9ORSwgICAgMCkKLSAgIAkgICAgUkVMT0NfTlVNQkVSIChSX2Zvb18zMiwgICAgICAxKQotICAgCSAgICBGQUtFX1JFTE9DICAgKFJfZm9vX2lsbGVnYWwsIDIpCi0gICAJICAgIEVNUFRZX1JFTE9DICAoUl9mb29fbWF4KQotICAgCUVORF9SRUxPQ19OVU1CRVJTCi0KLSAgIFRoZW4gdGhlIGZvbGxvd2luZyB3aWxsIGJlIHByb2R1Y2VkIGJ5IGRlZmF1bHQgKGllIGlmCi0gICBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgaXMgKm5vdCogZGVmaW5lZCkuCi0KLSAgIAllbnVtIGZvbwotCXsKLQkgIGZvbyA9IC0xLAotICAgCSAgUl9mb29fTk9ORSA9IDAsCi0gICAJICBSX2Zvb18zMiA9IDEsCi0gICAJICBSX2Zvb19pbGxlZ2FsID0gMiwKLSAgIAkgIFJfZm9vX21heAotICAgCX07Ci0KLSAgIElmIFJFTE9DX01BQ1JPU19HRU5fRlVOQyAqaXMqIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGUKLSAgIGZvbGxvd2luZyBmdW5jdGlvbiB3aWxsIGJlIGdlbmVyYXRlZDoKLQotICAgCXN0YXRpYyBjb25zdCBjaGFyICogZm9vIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgcnR5cGUpKTsKLSAgIAlzdGF0aWMgY29uc3QgY2hhciAqCi0gICAJZm9vIChydHlwZSkKLSAgIAkgICAgdW5zaWduZWQgbG9uZyBydHlwZTsKLSAgIAl7Ci0gICAJICAgc3dpdGNoIChydHlwZSkKLSAgIAkgICB7Ci0gICAJICAgY2FzZSAwOiByZXR1cm4gIlJfZm9vX05PTkUiOwotICAgCSAgIGNhc2UgMTogcmV0dXJuICJSX2Zvb18zMiI7Ci0gICAJICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7Ci0gICAJICAgfQotICAgCX0KLSAgICovCi0gICAKLSNpZm5kZWYgX1JFTE9DX01BQ1JPU19ICi0jZGVmaW5lIF9SRUxPQ19NQUNST1NfSAotCi0jaWZkZWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi0KLS8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJlbG9jYXRpb24gbnVtYmVyIGFuZCByZXR1cm5zIHRoZQotICAgc3RyaW5nIHZlcnNpb24gbmFtZSBvZiB0aGUgbmFtZSBvZiB0aGF0IHJlbG9jYXRpb24uICBJZgotICAgdGhlIHJlbG9jYXRpb24gaXMgbm90IHJlY29nbmlzZWQsIE5VTEwgaXMgcmV0dXJuZWQuICAqLwotCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICAJCQkJXAotc3RhdGljIGNvbnN0IGNoYXIgKiBuYW1lICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgcnR5cGUpKTsgCVwKLXN0YXRpYyBjb25zdCBjaGFyICoJCQkJCQlcCi1uYW1lIChydHlwZSkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgcnR5cGU7CQkJCQlcCi17CQkJCQkJCQlcCi0gIHN3aXRjaCAocnR5cGUpCQkJCQkJXAotICB7Ci0KLSNpZmRlZiBfX1NURENfXwkJCQkJICAKLSNkZWZpbmUgUkVMT0NfTlVNQkVSKG5hbWUsIG51bWJlcikgIGNhc2UgbnVtYmVyIDogcmV0dXJuICNuYW1lIDsKLSNlbHNlCi0jZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICBjYXNlIG51bWJlciA6IHJldHVybiAibmFtZSIgOwotI2VuZGlmCi0KLSNkZWZpbmUgRkFLRV9SRUxPQyhuYW1lLCBudW1iZXIpICAgIAotI2RlZmluZSBFTVBUWV9SRUxPQyhuYW1lKQotCQkJCQkgIAotI2RlZmluZSBFTkRfUkVMT0NfTlVNQkVSUwlcCi0gICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CVwKLSAgfQkJCQlcCi19Ci0KLQotI2Vsc2UgLyogRGVmYXVsdCB0byBnZW5lcmF0aW5nIGVudW0uICAqLwotCi0vKiBTb21lIGNvbXBpbGVycyBjYW5ub3QgY29wZSB3aXRoIGFuIGVudW0gdGhhdCBlbmRzIHdpdGggYSB0cmFpbGluZwotICAgY29tbWEsIHNvIFNUQVJUX1JFTE9DX05VTUJFUlMgY3JlYXRlcyBhIGZha2UgcmVsb2MgZW50cnksIChpbml0aWFsaXNlZAotICAgdG8gLTEgc28gdGhhdCB0aGUgZmlyc3QgcmVhbCBlbnRyeSB3aWxsIHN0aWxsIGRlZmF1bHQgdG8gMCkuICBGdXJ0aGVyCi0gICBlbnRyaWVzIHRoZW4gcHJlcGVuZCBhIGNvbW1hIHRvIHRoZWlyIGRlZmluaXRpb25zLCBjcmVhdGluZyBhIGxpc3QKLSAgIG9mIGVudW1lcmF0b3IgZW50cmllcyB0aGF0IHdpbGwgc2F0aXNmeSB0aGVzZSBjb21waWxlcnMuICAqLwotI2lmZGVmIF9fU1REQ19fCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICBlbnVtIG5hbWUgeyBfIyNuYW1lID0gLTEKLSNlbHNlCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICBlbnVtIG5hbWUgeyBuYW1lID0gLTEKLSNlbmRpZgotCQkJCQkJCi0jZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICAsIG5hbWUgPSBudW1iZXIKLSNkZWZpbmUgRkFLRV9SRUxPQyhuYW1lLCBudW1iZXIpICAgICwgbmFtZSA9IG51bWJlciAKLSNkZWZpbmUgRU1QVFlfUkVMT0MobmFtZSkgICAgICAgICAgICwgbmFtZSAKLSNkZWZpbmUgRU5EX1JFTE9DX05VTUJFUlMgICAgICAgICAgIH07Ci0KLSNlbmRpZgotCi0jZW5kaWYgLyogUkVMT0NfTUFDUk9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3NoLmggYi9pbmNsdWRlL2VsZi9zaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQ3NjY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3NoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBTSCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9TSF9ICi0jZGVmaW5lIF9FTEZfU0hfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi0vKiBSZWxvY2F0aW9ucyAyNWZmIGFyZSBHTlUgZXh0ZW5zaW9ucy4KLSAgIDI1Li4zMyBhcmUgdXNlZCBmb3IgcmVsYXhhdGlvbiBhbmQgdXNlIHRoZSBzYW1lIGNvbnN0YW50cyBhcyBDT0ZGIHVzZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3NoX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9SRUwzMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXUE4sIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9JTkQxMlcsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4V1BMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOFdQWiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhCUCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOEwsIDkpCi0gIEZBS0VfUkVMT0MgKFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQywgMTApCi0gIEZBS0VfUkVMT0MgKFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDE2LCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDMyLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1VTRVMsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09VTlQsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQUxJR04sIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09ERSwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9EQVRBLCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0xBQkVMLCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDgsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfR05VX1ZUSU5IRVJJVCwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9HTlVfVlRFTlRSWSwgMzUpCi0gIEVNUFRZX1JFTE9DIChSX1NIX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvc3BhcmMuaCBiL2luY2x1ZGUvZWxmL3NwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZDAwYmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKiBTUEFSQyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgRG91ZyBFdmFucywgQ3lnbnVzIFN1cHBvcnQsIDxkamVAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX1NQQVJDX0gKLSNkZWZpbmUgX0VMRl9TUEFSQ19ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IFN1bi4gICovCi0KLSNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTX01BU0sJMHhmZmZmMDAJLyogYml0cyBpbmRpY2F0aW5nIFY4KyB0eXBlICovCi0jZGVmaW5lIEVGX1NQQVJDXzMyUExVUwkJMHgwMDAxMDAJLyogZ2VuZXJpYyBWOCsgZmVhdHVyZXMgKi8KLSNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMQkweDAwMDIwMAkvKiBTdW4gVWx0cmFTUEFSQzEgZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBFRl9TUEFSQ19IQUxfUjEJCTB4MDAwNDAwCS8qIEhBTCBSMSBleHRlbnNpb25zICovCi0KLSNkZWZpbmUgRUZfU1BBUkNfTEVEQVRBICAgICAgICAgMHg4MDAwMDAJLyogbGl0dGxlIGVuZGlhbiBkYXRhICovCi0KLS8qIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZSBWOSBBQkkuICAqLwotI2RlZmluZSBFRl9TUEFSQ19FWFRfTUFTSwkweGZmZmYwMAkvKiByZXNlcnZlZCBmb3IgdmVuZG9yIGV4dGVuc2lvbnMgKi8KLQotLyogVjkgbWVtb3J5IG1vZGVscyAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X01NCQkweDMJCS8qIG1lbW9yeSBtb2RlbCBtYXNrICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfVFNPCQkweDAJCS8qIHRvdGFsIHN0b3JlIG9yZGVyaW5nICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfUFNPCQkweDEJCS8qIHBhcnRpYWwgc3RvcmUgb3JkZXJpbmcgKi8KLSNkZWZpbmUgRUZfU1BBUkNWOV9STU8JCTB4MgkJLyogcmVsYXhlZCBzdG9yZSBvcmRlcmluZyAqLwotCi0vKiBTZWN0aW9uIGluZGljZXMuICAqLwotCi0jZGVmaW5lIFNITl9CRUZPUkUJCTB4ZmYwMAkJLyogdXNlZCB3aXRoIFNIRl9PUkRFUkVEICovCi0jZGVmaW5lIFNITl9BRlRFUgkJMHhmZjAxCQkvKiB1c2VkIHdpdGggU0hGX09SREVSRUQgKi8KLQotLyogU2VjdGlvbiBmbGFncy4gICovCi0KLSNkZWZpbmUgU0hGX0VYQ0xVREUJCTB4ODAwMDAwMDAJLyogZXhjbHVkZSBmcm9tIGxpbmtpbmcgKi8KLSNkZWZpbmUgU0hGX09SREVSRUQJCTB4NDAwMDAwMDAJLyogdHJlYXQgc2hfbGluayxzaF9pbmZvIHNwZWNpYWxseSAqLwotCi0vKiBTeW1ib2wgdHlwZXMuICAqLwotCi0jZGVmaW5lIFNUVF9SRUdJU1RFUgkJMTMJCS8qIGdsb2JhbCByZWcgcmVzZXJ2ZWQgdG8gYXBwLiAqLwotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9zcGFyY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzgsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzMyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQMTYsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQMzIsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDMwLCA3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AyMiwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hJMjIsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18yMiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMywgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MTzEwLCAxMikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDEwLCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDEzLCAxNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDIyLCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDMTAsIDE2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUEMyMiwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XUExUMzAsIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfQ09QWSwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HTE9CX0RBVCwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19KTVBfU0xPVCwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRUxBVElWRSwgMjIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTMyLCAyMykKLQotICAvKiA/Pz8gVGhlc2UgNiByZWxvY3MgYXJlIG5ldyBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgRm9yIGJpbmFyeQotICAgICBjb21wYXRpbGl0eSBpbiB0aGUgc3BhcmM2NC1lbGYgdG9vbGNoYWluLCB3ZSBsZWF2ZSB0aGVtIG91dC4KLSAgICAgQSBub24tYmluYXJ5IHVwd2FyZCBjb21wYXRpYmxlIGNoYW5nZSBpcyBleHBlY3RlZCBmb3Igc3BhcmM2NC1lbGYuICAqLwotI2lmbmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MKLSAgLyogPz8/IE5ldyByZWxvY3Mgb24gdGhlIFVsdHJhU1BBUkMuICBOb3Qgc3VyZSB3aGF0IHRoZXkncmUgZm9yIHlldC4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QTFQzMiwgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISVBMVDIyLCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xPUExUMTAsIDI2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENQTFQzMiwgMjcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ1BMVDIyLCAyOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDUExUMTAsIDI5KQotI2VuZGlmCi0KLSAgLyogdjkgcmVsb2NzICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMCwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMSwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ182NCwgMzIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19PTE8xMCwgMzMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISDIyLCAzNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hNMTAsIDM1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE0yMiwgMzYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ19ISDIyLCAzNykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDX0hNMTAsIDM4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENfTE0yMiwgMzkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDE2LCA0MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMTksIDQxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVU5VU0VEXzQyLCA0MikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzcsIDQzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNSwgNDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ182LCA0NSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1A2NCwgNDYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QTFQ2NCwgNDcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISVgyMiwgNDgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MT1gxMCwgNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19INDQsIDUwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTTQ0LCA1MSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0w0NCwgNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRUdJU1RFUiwgNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTY0LCA1NCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VBMTYsIDU1KQotCi0gIC8qIGxpdHRsZSBlbmRpYW4gZGF0YSByZWxvY3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1JFVjMyLCA1NikKLQotICBFTVBUWV9SRUxPQyAgKFJfU1BBUkNfbWF4X3N0ZCkKLQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR05VX1ZUSU5IRVJJVCwgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR05VX1ZURU5UUlksIDI1MSkKLQotICBFTVBUWV9SRUxPQyAgKFJfU1BBUkNfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUmVsb2NhdGlvbiBtYWNyb3MuICAqLwotCi0jZGVmaW5lIEVMRjY0X1JfVFlQRV9EQVRBKGluZm8pCQkoKChiZmRfdm1hKSAoaW5mbykgPDwgMzIpID4+IDQwKQotI2RlZmluZSBFTEY2NF9SX1RZUEVfSUQoaW5mbykJCSgoKGJmZF92bWEpIChpbmZvKSA8PCA1NikgPj4gNTYpCi0jZGVmaW5lIEVMRjY0X1JfVFlQRV9JTkZPKGRhdGEsIHR5cGUpCSgoKGJmZF92bWEpIChkYXRhKSA8PCA4KSBcCi0JCQkJCSArIChiZmRfdm1hKSAodHlwZSkpCi0KLSNkZWZpbmUgRFRfU1BBUkNfUkVHSVNURVIJMHg3MDAwMDAwMQotCi0vKgotICogRklYTUU6IE5PVCBBQkkgLS0gR0VUIFJJRCBPRiBUSElTCi0gKiBEZWZpbmVzIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgLnBsdC4gIEN1cnJlbnRseSBkZWZpbmVkIHZhbHVlcyBhcmUKLSAqICAgMCAtLSByZXNlcnZlZCB0byBTSQotICogICAxIC0tIGFic29sdXRlIGFkZHJlc3MgaW4gLmdvdC5wbHQKLSAqICAgMiAtLSBnb3QtcmVsYXRpdmUgYWRkcmVzcyBpbiAuZ290LnBsdAotICovCi0KLSNkZWZpbmUgRFRfU1BBUkNfUExURk1UCQkweDcwMDAwMDAxCi0KLSNlbmRpZiAvKiBfRUxGX1NQQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3Y4NTAuaCBiL2luY2x1ZGUvZWxmL3Y4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0M2I3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi92ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogVjg1MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ3JlYXRlZCBieSBNaWNoYWVsIE1laXNzbmVyLCBDeWdudXMgU3VwcG9ydCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1JUFMgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfVjg1MF9ICi0jZGVmaW5lIF9FTEZfVjg1MF9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEZvdXIgYml0IFY4NTAgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfVjg1MF9BUkNICQkweGYwMDAwMDAwCi0KLS8qIHY4NTAgY29kZS4gICovCi0jZGVmaW5lIEVfVjg1MF9BUkNICQkweDAwMDAwMDAwCi0KLS8qIHY4NTBlIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBFX0FSQ0gJCTB4MTAwMDAwMDAKLQotLyogdjg1MGVhIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBFQV9BUkNICQkweDIwMDAwMDAwCi0KLQotLyogRmxhZ3MgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCAqLwotI2RlZmluZSBWODUwX09USEVSX1NEQQkJMHgwMQkvKiBzeW1ib2wgaGFkIFNEQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1pEQQkJMHgwMgkvKiBzeW1ib2wgaGFkIFpEQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1REQQkJMHgwNAkvKiBzeW1ib2wgaGFkIFREQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1REQV9CWVRFCTB4MDgJLyogc3ltYm9sIGhhZCBUREEgYnl0ZSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX0VSUk9SCTB4ODAJLyogc3ltYm9sIGhhZCBhbiBlcnJvciByZXBvcnRlZCAqLwotCi0vKiBWODUwIHJlbG9jYXRpb25zICovCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTICh2ODUwX3JlbG9jX3R5cGUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX05PTkUsIDApCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzlfUENSRUwsIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzIyX1BDUkVMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9ISTE2X1MsIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0hJMTYsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0xPMTYsIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzMyLCA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF8xNiwgNykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfOCwgOCkKLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwgOSkJCS8qIEZvciBsZC5iLCBzdC5iLCBzZXQxLCBjbHIxLCBub3QxLCB0c3QxLCBtb3ZlYSwgbW92aGkgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwgMTApCQkvKiBGb3IgbGQudywgbGQuaCwgbGQuaHUsIHN0LncsIHN0LmggKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwgMTEpCQkvKiBGb3IgbGQuYiwgc3QuYiwgc2V0MSwgY2xyMSwgbm90MSwgdHN0MSwgbW92ZWEsIG1vdmhpICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQsIDEyKQkJLyogRm9yIGxkLncsIGxkLmgsIGxkLmh1LCBzdC53LCBzdC5oICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV82XzhfT0ZGU0VULCAxMykJCS8qIEZvciBzc3Qudywgc2xkLncgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzdfOF9PRkZTRVQsIDE0KQkJLyogRm9yIHNzdC5oLCBzbGQuaCAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfN183X09GRlNFVCwgMTUpCQkvKiBGb3Igc3N0LmIsIHNsZC5iICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV8xNl8xNl9PRkZTRVQsIDE2KQkJLyogRm9yIHNldDEsIGNscjEsIG5vdDEsIHRzdDEsIG1vdmVhLCBtb3ZoaSAqLwotLyogQ1lHTlVTIExPQ0FMIHY4NTBlICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV80XzVfT0ZGU0VULCAxNykJCS8qIEZvciBzbGQuaHUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzRfNF9PRkZTRVQsIDE4KQkJLyogRm9yIHNsZC5idSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULCAxOSkJLyogRm9yIGxkLmJ1ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsIDIwKQkvKiBGb3IgbGQuYnUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwgMjEpCQkvKiBGb3IgY2FsbHQgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULCAyMikJLyogRm9yIGNhbGx0ICovCi0vKiBFTkQgQ1lHTlVTIExPQ0FMICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0dOVV9WVElOSEVSSVQsIDIzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9HTlVfVlRFTlRSWSwgMjQpCi0KLSAgICAgRU1QVFlfUkVMT0MgKFJfVjg1MF9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIFNtYWxsIGRhdGEgYXJlYSBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX1Y4NTBfU0NPTU1PTgkweGZmMDAKLQotLyogVGlueSBkYXRhIGFyZWEgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9WODUwX1RDT01NT04JMHhmZjAxCi0KLS8qIFplcm8gZGF0YSBhcmVhIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fVjg1MF9aQ09NTU9OCTB4ZmYwMgotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIC5zY29tbW9uIGRhdGEuICAqLwotI2RlZmluZSBTSFRfVjg1MF9TQ09NTU9OCTB4NzAwMDAwMDAKLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgLnNjb21tb24gZGF0YS4gICovCi0jZGVmaW5lIFNIVF9WODUwX1RDT01NT04JMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSAuc2NvbW1vbiBkYXRhLiAgKi8KLSNkZWZpbmUgU0hUX1Y4NTBfWkNPTU1PTgkweDcwMDAwMDAyCi0KLQotI2VuZGlmIC8qIF9FTEZfVjg1MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmggYi9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGFjYTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mbG9hdGZvcm1hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIElFRUUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBkZWNsYXJhdGlvbnMsIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChGTE9BVEZPUk1BVF9IKQotI2RlZmluZSBGTE9BVEZPUk1BVF9IIDEKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEEgZmxvYXRmb3JtYXQgY29uc2lzdHMgb2YgYSBzaWduIGJpdCwgYW4gZXhwb25lbnQgYW5kIGEgbWFudGlzc2EuICBPbmNlIHRoZQotICAgYnl0ZXMgYXJlIGNvbmNhdGVuYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGJ5dGVvcmRlciBmbGFnLCB0aGVuIGVhY2ggb2YgdGhvc2UKLSAgIGZpZWxkcyBpcyBjb250aWd1b3VzLiAgV2UgbnVtYmVyIHRoZSBiaXRzIHdpdGggMCBiZWluZyB0aGUgbW9zdCBzaWduaWZpY2FudAotICAgKGkuZS4gQklUU19CSUdfRU5ESUFOIHR5cGUgbnVtYmVyaW5nKSwgYW5kIHNwZWNpZnkgd2hpY2ggYml0cyBlYWNoIGZpZWxkCi0gICBjb250YWlucyB3aXRoIHRoZSAqX3N0YXJ0IGFuZCAqX2xlbiBmaWVsZHMuICAqLwotCi0vKiBXaGF0IGlzIHRoZSBvcmRlciBvZiB0aGUgYnl0ZXMuICovCi0KLWVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyB7Ci0KLSAgLyogU3RhbmRhcmQgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLgotICAgICBFWDogMS4yMzQ1Njc4ZTEwID0+IDAwIDAwIDgwIGM1IGUwIGZlIDA2IDQyICovCi0KLSAgZmxvYXRmb3JtYXRfbGl0dGxlLAotCi0gIC8qIFN0YW5kYXJkIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci4KLSAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiA0MiAwNiBmZSBlMCBjNSA4MCAwMCAwMCAqLwotCi0gIGZsb2F0Zm9ybWF0X2JpZywKLQotICAvKiBMaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgYnV0IGJpZyBlbmRpYW4gd29yZCBvcmRlci4KLSAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiBlMCBmZSAwNiA0MiAwMCAwMCA4MCBjNSAqLwotCi0gIGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZAotCi19OwotCi1lbnVtIGZsb2F0Zm9ybWF0X2ludGJpdCB7IGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubyB9OwotCi1zdHJ1Y3QgZmxvYXRmb3JtYXQKLXsKLSAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIGJ5dGVvcmRlcjsKLSAgdW5zaWduZWQgaW50IHRvdGFsc2l6ZTsJLyogVG90YWwgc2l6ZSBvZiBudW1iZXIgaW4gYml0cyAqLwotCi0gIC8qIFNpZ24gYml0IGlzIGFsd2F5cyBvbmUgYml0IGxvbmcuICAxIG1lYW5zIG5lZ2F0aXZlLCAwIG1lYW5zIHBvc2l0aXZlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpZ25fc3RhcnQ7Ci0KLSAgdW5zaWduZWQgaW50IGV4cF9zdGFydDsKLSAgdW5zaWduZWQgaW50IGV4cF9sZW47Ci0gIC8qIEFtb3VudCBhZGRlZCB0byAidHJ1ZSIgZXhwb25lbnQuICAweDNmZmYgZm9yIG1hbnkgSUVFRSBleHRlbmRlZHMuICAqLwotICB1bnNpZ25lZCBpbnQgZXhwX2JpYXM7Ci0gIC8qIEV4cG9uZW50IHZhbHVlIHdoaWNoIGluZGljYXRlcyBOYU4uICBUaGlzIGlzIHRoZSBhY3R1YWwgdmFsdWUgc3RvcmVkIGluCi0gICAgIHRoZSBmbG9hdCwgbm90IGFkanVzdGVkIGJ5IHRoZSBleHBfYmlhcy4gIFRoaXMgdXN1YWxseSBjb25zaXN0cyBvZiBhbGwKLSAgICAgb25lIGJpdHMuICAqLwotICB1bnNpZ25lZCBpbnQgZXhwX25hbjsKLQotICB1bnNpZ25lZCBpbnQgbWFuX3N0YXJ0OwotICB1bnNpZ25lZCBpbnQgbWFuX2xlbjsKLQotICAvKiBJcyB0aGUgaW50ZWdlciBiaXQgZXhwbGljaXQgb3IgaW1wbGljaXQ/ICAqLwotICBlbnVtIGZsb2F0Zm9ybWF0X2ludGJpdCBpbnRiaXQ7Ci19OwotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIElFRUUgc2luZ2xlIGFuZCBkb3VibGUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGU7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlOwotCi0vKiBmbG9hdGZvcm1hdCBmb3IgQVJNIElFRUUgZG91YmxlLCBsaXR0bGUgZW5kaWFuIGJ5dGVzIGFuZCBiaWcgZW5kaWFuIHdvcmRzICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkOwotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIHZhcmlvdXMgZXh0ZW5kZWRzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTY4ODgxX2V4dDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTk2MF9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X204ODExMF9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2FybV9leHQ7Ci0KLS8qIENvbnZlcnQgZnJvbSBGTVQgdG8gYSBkb3VibGUuCi0gICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KLSAgIFN0b3JlIHRoZSBkb3VibGUgaW4gKlRPLiAgKi8KLQotZXh0ZXJuIHZvaWQKLWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiwgY2hhciAqLCBkb3VibGUgKikpOwotCi0vKiBUaGUgY29udmVyc2U6IGNvbnZlcnQgdGhlIGRvdWJsZSAqRlJPTSB0byBGTVQKLSAgIGFuZCBzdG9yZSB3aGVyZSBUTyBwb2ludHMuICAqLwotCi1leHRlcm4gdm9pZAotZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICosCi0JCQkJIGRvdWJsZSAqLCBjaGFyICopKTsKLQotI2VuZGlmCS8qIGRlZmluZWQgKEZMT0FURk9STUFUX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZubWF0Y2guaCBiL2luY2x1ZGUvZm5tYXRjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWViNzAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm5tYXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1OT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQHByZXAuYWkubWl0LmVkdS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYJX0ZOTUFUQ0hfSAotCi0jZGVmaW5lCV9GTk1BVENIX0gJMQotCi0jaWZkZWYJX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXykKLSN1bmRlZglfX1AKLSNkZWZpbmUJX19QKGFyZ3MpCWFyZ3MKLSNlbHNlIC8qIE5vdCBDKysgb3IgQU5TSSBDLiAgKi8KLSN1bmRlZglfX1AKLSNkZWZpbmUJX19QKGFyZ3MpCSgpCi0vKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aG91dCBkZWZpbmluZyBgY29uc3QnIGhlcmUgb25seSBiZWNhdXNlIGluIHRoaXMgZmlsZQotICAgaXQgaXMgdXNlZCBvbmx5IGluc2lkZSB0aGUgcHJvdG90eXBlIGZvciBgZm5tYXRjaCcsIHdoaWNoIGlzIGVsaWRlZCBpbgotICAgbm9uLUFOU0kgQyB3aGVyZSBgY29uc3QnIGlzIHByb2JsZW1hdGljYWwuICAqLwotI2VuZGlmIC8qIEMrKyBvciBBTlNJIEMuICAqLwotCi0KLS8qIFdlICN1bmRlZiB0aGVzZSBiZWZvcmUgZGVmaW5pbmcgdGhlbSBiZWNhdXNlIHNvbWUgbG9zaW5nIHN5c3RlbXMKLSAgIChIUC1VWCBBLjA4LjA3IGZvciBleGFtcGxlKSBkZWZpbmUgdGhlc2UgaW4gPHVuaXN0ZC5oPi4gICovCi0jdW5kZWYJRk5NX1BBVEhOQU1FCi0jdW5kZWYJRk5NX05PRVNDQVBFCi0jdW5kZWYJRk5NX1BFUklPRAotCi0vKiBCaXRzIHNldCBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYGZubWF0Y2gnLiAgKi8KLSNkZWZpbmUJRk5NX1BBVEhOQU1FCSgxIDw8IDApIC8qIE5vIHdpbGRjYXJkIGNhbiBldmVyIG1hdGNoIGAvJy4gICovCi0jZGVmaW5lCUZOTV9OT0VTQ0FQRQkoMSA8PCAxKSAvKiBCYWNrc2xhc2hlcyBkb24ndCBxdW90ZSBzcGVjaWFsIGNoYXJzLiAgKi8KLSNkZWZpbmUJRk5NX1BFUklPRAkoMSA8PCAyKSAvKiBMZWFkaW5nIGAuJyBpcyBtYXRjaGVkIG9ubHkgZXhwbGljaXRseS4gICovCi0KLSNpZiAhZGVmaW5lZCAoX1BPU0lYX0NfU09VUkNFKSB8fCBfUE9TSVhfQ19TT1VSQ0UgPCAyIHx8IGRlZmluZWQgKF9HTlVfU09VUkNFKQotI2RlZmluZQlGTk1fRklMRV9OQU1FCUZOTV9QQVRITkFNRSAvKiBQcmVmZXJyZWQgR05VIG5hbWUuICAqLwotI2RlZmluZQlGTk1fTEVBRElOR19ESVIJKDEgPDwgMykgLyogSWdub3JlIGAvLi4uJyBhZnRlciBhIG1hdGNoLiAgKi8KLSNkZWZpbmUJRk5NX0NBU0VGT0xECSgxIDw8IDQpIC8qIENvbXBhcmUgd2l0aG91dCByZWdhcmQgdG8gY2FzZS4gICovCi0jZW5kaWYKLQotLyogVmFsdWUgcmV0dXJuZWQgYnkgYGZubWF0Y2gnIGlmIFNUUklORyBkb2VzIG5vdCBtYXRjaCBQQVRURVJOLiAgKi8KLSNkZWZpbmUJRk5NX05PTUFUQ0gJMQotCi0vKiBNYXRjaCBTVFJJTkcgYWdhaW5zdCB0aGUgZmlsZW5hbWUgcGF0dGVybiBQQVRURVJOLAotICAgcmV0dXJuaW5nIHplcm8gaWYgaXQgbWF0Y2hlcywgRk5NX05PTUFUQ0ggaWYgbm90LiAgKi8KLWV4dGVybiBpbnQgZm5tYXRjaCBfX1AgKChjb25zdCBjaGFyICpfX3BhdHRlcm4sIGNvbnN0IGNoYXIgKl9fc3RyaW5nLAotCQkJIGludCBfX2ZsYWdzKSk7Ci0KLSNpZmRlZglfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBmbm1hdGNoLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tYmluLmggYi9pbmNsdWRlL2ZvcGVuLWJpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODY4ZjYzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tYmluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRoZSAndHlwZScgcGFydCBvZiBhbiBmb3BlbiwgZnJlb3BlbiBvciBmZG9wZW4uIAotCi0JPFJlYWR8V3JpdGU+W1VwZGF0ZV08QmluYXJ5IGZpbGV8dGV4dCBmaWxlPgotCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yICJiaW5hcnkiIHN5c3RlbXMsIHdoZXJlIHRleHQgYW5kIGJpbmFyeSBmaWxlcyBhcmUKLSAgIGRpZmZlcmVudC4gIEFuIGV4YW1wbGUgaXMgTWVzcy1Eb3NlLiAgTWFueSBVbml4IHN5c3RlbXMgY291bGQgYWxzbwotICAgY29wZSB3aXRoIGEgImIiIGluIHRoZSBzdHJpbmcsIGluZGljYXRpbmcgYmluYXJ5IGZpbGVzLCBidXQgc29tZSByZWplY3QgdGhpcwotICAgKGFuZCB0aGVyZWJ5IGRvbid0IGNvbmZvcm0gdG8gQU5TSSBDLCBidXQgd2hhdCBlbHNlIGlzIG5ldz8pLgotCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyYiIKLSNkZWZpbmUgRk9QRU5fV0IgCSJ3YiIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhYiIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicitiIgotI2RlZmluZSBGT1BFTl9XVUIgCSJ3K2IiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErYiIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvcGVuLXNhbWUuaCBiL2luY2x1ZGUvZm9wZW4tc2FtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM3NTI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tc2FtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogTWFjcm9zIGZvciB0aGUgJ3R5cGUnIHBhcnQgb2YgYW4gZm9wZW4sIGZyZW9wZW4gb3IgZmRvcGVuLiAKLQotCTxSZWFkfFdyaXRlPltVcGRhdGVdPEJpbmFyeSBmaWxlfHRleHQgZmlsZT4KLQotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAic2FtZSIgc3lzdGVtcywgd2hlcmUgdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGFyZQotICAgdGhlIHNhbWUuICBBbiBleGFtcGxlIGlzIFVuaXguICBNYW55IFVuaXggc3lzdGVtcyBjb3VsZCBhbHNvIGFkZCBhCi0gICAiYiIgdG8gdGhlIHN0cmluZywgaW5kaWNhdGluZyBiaW5hcnkgZmlsZXMsIGJ1dCBzb21lIHJlamVjdCB0aGlzCi0gICAoYW5kIHRoZXJlYnkgZG9uJ3QgY29uZm9ybSB0byBBTlNJIEMsIGJ1dCB3aGF0IGVsc2UgaXMgbmV3PykuCi0KLSAgIFRoaXMgZmlsZSBpcyBkZXNpZ25lZCBmb3IgaW5jbHVzaW9uIGJ5IGhvc3QtZGVwZW5kZW50IC5oIGZpbGVzLiAgTm8KLSAgIHVzZXIgYXBwbGljYXRpb24gc2hvdWxkIGluY2x1ZGUgaXQgZGlyZWN0bHksIHNpbmNlIHRoYXQgd291bGQgbWFrZQotICAgdGhlIGFwcGxpY2F0aW9uIHVuYWJsZSB0byBiZSBjb25maWd1cmVkIGZvciBib3RoICJzYW1lIiBhbmQgImJpbmFyeSIKLSAgIHZhcmlhbnQgc3lzdGVtcy4gICovCi0KLSNkZWZpbmUgRk9QRU5fUkIJInIiCi0jZGVmaW5lIEZPUEVOX1dCIAkidyIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhIgotI2RlZmluZSBGT1BFTl9SVUIgCSJyKyIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidysiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErIgotCi0jZGVmaW5lIEZPUEVOX1JUCSJyIgotI2RlZmluZSBGT1BFTl9XVCAJInciCi0jZGVmaW5lIEZPUEVOX0FUIAkiYSIKLSNkZWZpbmUgRk9QRU5fUlVUIAkicisiCi0jZGVmaW5lIEZPUEVOX1dVVCAJIncrIgotI2RlZmluZSBGT1BFTl9BVVQgCSJhKyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tdm1zLmggYi9pbmNsdWRlL2ZvcGVuLXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTc2YjdmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tdm1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRoZSAndHlwZScgcGFydCBvZiBhbiBmb3BlbiwgZnJlb3BlbiBvciBmZG9wZW4uIAotCi0JPFJlYWR8V3JpdGU+W1VwZGF0ZV08QmluYXJ5IGZpbGV8dGV4dCBmaWxlPgotCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yIFZNUyBzeXN0ZW1zLCB3aGVyZSB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgYXJlCi0gICBkaWZmZXJlbnQuCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyYiIsInJmbT12YXIiCi0jZGVmaW5lIEZPUEVOX1dCIAkid2IiLCJyZm09dmFyIgotI2RlZmluZSBGT1BFTl9BQiAJImFiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicitiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidytiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fQVVCIAkiYStiIiwicmZtPXZhciIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkYm0uaCBiL2luY2x1ZGUvZ2RibS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJjMjZkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ2RibS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogR05VIERCTSAtIERhdGFCYXNlIE1hbmFnZXIgaW5jbHVkZSBmaWxlCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBoaWxpcCBBLiBOZWxzb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFlvdSBtYXkgY29udGFjdCB0aGUgYXV0aG9yIGJ5OgotICAgICAgIGUtbWFpbDogIHBoaWxAd3d1LmVkdQotICAgICAgdXMtbWFpbDogIFBoaWxpcCBBLiBOZWxzb24KLSAgICAgICAgICAgICAgICBDb21wdXRlciBTY2llbmNlIERlcGFydG1lbnQKLSAgICAgICAgICAgICAgICBXZXN0ZXJuIFdhc2hpbmd0b24gVW5pdmVyc2l0eQotICAgICAgICAgICAgICAgIEJlbGxpbmdoYW0sIFdBIDk4MjI2Ci0gICAgICAgIHBob25lOiAgKDIwNikgNjc2LTMwMzUKLSAgICAgICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFBhcmFtZXRlcnMgdG8gZ2RibV9vcGVuIGZvciBSRUFERVJTLCBXUklURVJTLCBhbmQgV1JJVEVSUyB3aG8KLSAgIGNhbiBjcmVhdGUgdGhlIGRhdGFiYXNlLiAqLwotI2RlZmluZSAgR0RCTV9SRUFERVIgIDAKLSNkZWZpbmUgIEdEQk1fV1JJVEVSICAxCi0jZGVmaW5lICBHREJNX1dSQ1JFQVQgMgotI2RlZmluZSAgR0RCTV9ORVdEQiAgIDMKLQotLyogUGFyYW1ldGVycyB0byBnZGJtX3N0b3JlIGZvciBzaW1wbGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2VtZW50LiAqLwotI2RlZmluZSAgR0RCTV9JTlNFUlQgIDAKLSNkZWZpbmUgIEdEQk1fUkVQTEFDRSAxCi0KLQotLyogVGhlIGRhdGEgYW5kIGtleSBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKmRwdHI7Ci0JaW50ICAgZHNpemU7Ci0gICAgICB9IGRhdHVtOwotCi0KLS8qIFRoZSBmaWxlIGluZm9ybWF0aW9uIGhlYWRlci4gVGhpcyBpcyBnb29kIGVub3VnaCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuICovCi10eXBlZGVmIHN0cnVjdCB7aW50IGR1bW15WzEwXTt9ICpHREJNX0ZJTEU7Ci0KLQotLyogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyEgKi8KLQotZXh0ZXJuIEdEQk1fRklMRSBnZGJtX29wZW4gKCk7Ci0KLWV4dGVybiB2b2lkCSBnZGJtX2Nsb3NlICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fZmV0Y2ggKCk7Ci0KLWV4dGVybiBpbnQJIGdkYm1fc3RvcmUgKCk7Ci0KLWV4dGVybiBpbnQJIGdkYm1fZGVsZXRlICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fZmlyc3RrZXkgKCk7Ci0KLWV4dGVybiBkYXR1bQkgZ2RibV9uZXh0a2V5ICgpOwotCi1leHRlcm4gaW50CSBnZGJtX3Jlb3JnYW5pemUgKCk7Ci0KLQotLyogZ2RibSBzZW5kcyBiYWNrIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgaW4gdGhlIHZhcmlhYmxlIGdkYm1fZXJybm8uICovCi10eXBlZGVmIGVudW0gewlOT19FUlJPUiwKLQkJTUFMTE9DX0VSUk9SLAotCQlCTE9DS19TSVpFX0VSUk9SLAotCQlGSUxFX09QRU5fRVJST1IsCi0JCUZJTEVfV1JJVEVfRVJST1IsCi0JCUZJTEVfU0VFS19FUlJPUiwKLQkJRklMRV9SRUFEX0VSUk9SLAotCQlCQURfTUFHSUNfTlVNQkVSLAotCQlFTVBUWV9EQVRBQkFTRSwKLQkJQ0FOVF9CRV9SRUFERVIsCi0JICAgICAgICBDQU5UX0JFX1dSSVRFUiwKLQkJUkVBREVSX0NBTlRfUkVDT1ZFUiwKLQkJUkVBREVSX0NBTlRfREVMRVRFLAotCQlSRUFERVJfQ0FOVF9TVE9SRSwKLQkJUkVBREVSX0NBTlRfUkVPUkdBTklaRSwKLQkJVU5LTk9XTl9VUERBVEUsCi0JCUlURU1fTk9UX0ZPVU5ELAotCQlSRU9SR0FOSVpFX0ZBSUxFRCwKLQkJQ0FOTk9UX1JFUExBQ0V9Ci0JZ2RibV9lcnJvcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2V0b3B0LmggYi9pbmNsdWRlL2dldG9wdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjMwNzE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ2V0b3B0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGZvciBnZXRvcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVE9QVF9ICi0jZGVmaW5lIF9HRVRPUFRfSCAxCi0KLSNpZmRlZglfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogRm9yIGNvbW11bmljYXRpb24gZnJvbSBgZ2V0b3B0JyB0byB0aGUgY2FsbGVyLgotICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudCwKLSAgIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBoZXJlLgotICAgQWxzbywgd2hlbiBgb3JkZXJpbmcnIGlzIFJFVFVSTl9JTl9PUkRFUiwKLSAgIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4gICovCi0KLWV4dGVybiBjaGFyICpvcHRhcmc7Ci0KLS8qIEluZGV4IGluIEFSR1Ygb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSBzY2FubmVkLgotICAgVGhpcyBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHRvIGFuZCBmcm9tIHRoZSBjYWxsZXIKLSAgIGFuZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYGdldG9wdCcuCi0KLSAgIE9uIGVudHJ5IHRvIGBnZXRvcHQnLCB6ZXJvIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGw7IGluaXRpYWxpemUuCi0KLSAgIFdoZW4gYGdldG9wdCcgcmV0dXJucyAtMSwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZQotICAgbm9uLW9wdGlvbiBlbGVtZW50cyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGl0c2VsZiBzY2FuLgotCi0gICBPdGhlcndpc2UsIGBvcHRpbmQnIGNvbW11bmljYXRlcyBmcm9tIG9uZSBjYWxsIHRvIHRoZSBuZXh0Ci0gICBob3cgbXVjaCBvZiBBUkdWIGhhcyBiZWVuIHNjYW5uZWQgc28gZmFyLiAgKi8KLQotZXh0ZXJuIGludCBvcHRpbmQ7Ci0KLS8qIENhbGxlcnMgc3RvcmUgemVybyBoZXJlIHRvIGluaGliaXQgdGhlIGVycm9yIG1lc3NhZ2UgYGdldG9wdCcgcHJpbnRzCi0gICBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMuICAqLwotCi1leHRlcm4gaW50IG9wdGVycjsKLQotLyogU2V0IHRvIGFuIG9wdGlvbiBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVucmVjb2duaXplZC4gICovCi0KLWV4dGVybiBpbnQgb3B0b3B0OwotCi0vKiBEZXNjcmliZSB0aGUgbG9uZy1uYW1lZCBvcHRpb25zIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICBUaGUgTE9OR19PUFRJT05TIGFyZ3VtZW50IHRvIGdldG9wdF9sb25nIG9yIGdldG9wdF9sb25nX29ubHkgaXMgYSB2ZWN0b3IKLSAgIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMKLSAgIHplcm8uCi0KLSAgIFRoZSBmaWVsZCBgaGFzX2FyZycgaXM6Ci0gICBub19hcmd1bWVudAkJKG9yIDApIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudCwKLSAgIHJlcXVpcmVkX2FyZ3VtZW50CShvciAxKSBpZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LAotICAgb3B0aW9uYWxfYXJndW1lbnQgCShvciAyKSBpZiB0aGUgb3B0aW9uIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgotCi0gICBJZiB0aGUgZmllbGQgYGZsYWcnIGlzIG5vdCBOVUxMLCBpdCBwb2ludHMgdG8gYSB2YXJpYWJsZSB0aGF0IGlzIHNldAotICAgdG8gdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBmaWVsZCBgdmFsJyB3aGVuIHRoZSBvcHRpb24gaXMgZm91bmQsIGJ1dAotICAgbGVmdCB1bmNoYW5nZWQgaWYgdGhlIG9wdGlvbiBpcyBub3QgZm91bmQuCi0KLSAgIFRvIGhhdmUgYSBsb25nLW5hbWVkIG9wdGlvbiBkbyBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXQgYW4gYGludCcgdG8KLSAgIGEgY29tcGlsZWQtaW4gY29uc3RhbnQsIHN1Y2ggYXMgc2V0IGEgdmFsdWUgZnJvbSBgb3B0YXJnJywgc2V0IHRoZQotICAgb3B0aW9uJ3MgYGZsYWcnIGZpZWxkIHRvIHplcm8gYW5kIGl0cyBgdmFsJyBmaWVsZCB0byBhIG5vbnplcm8KLSAgIHZhbHVlICh0aGUgZXF1aXZhbGVudCBzaW5nbGUtbGV0dGVyIG9wdGlvbiBjaGFyYWN0ZXIsIGlmIHRoZXJlIGlzCi0gICBvbmUpLiAgRm9yIGxvbmcgb3B0aW9ucyB0aGF0IGhhdmUgYSB6ZXJvIGBmbGFnJyBmaWVsZCwgYGdldG9wdCcKLSAgIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgdmFsJyBmaWVsZC4gICovCi0KLXN0cnVjdCBvcHRpb24KLXsKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgY29uc3QgY2hhciAqbmFtZTsKLSNlbHNlCi0gIGNoYXIgKm5hbWU7Ci0jZW5kaWYKLSAgLyogaGFzX2FyZyBjYW4ndCBiZSBhbiBlbnVtIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQKLSAgICAgdHlwZSBtaXNtYXRjaGVzIGluIGFsbCB0aGUgY29kZSB0aGF0IGFzc3VtZXMgaXQgaXMgYW4gaW50LiAgKi8KLSAgaW50IGhhc19hcmc7Ci0gIGludCAqZmxhZzsKLSAgaW50IHZhbDsKLX07Ci0KLS8qIE5hbWVzIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBgaGFzX2FyZycgZmllbGQgb2YgYHN0cnVjdCBvcHRpb24nLiAgKi8KLQotI2RlZmluZQlub19hcmd1bWVudAkJMAotI2RlZmluZSByZXF1aXJlZF9hcmd1bWVudAkxCi0jZGVmaW5lIG9wdGlvbmFsX2FyZ3VtZW50CTIKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2lmZGVmIF9fR05VX0xJQlJBUllfXwotLyogTWFueSBvdGhlciBsaWJyYXJpZXMgaGF2ZSBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQsIHdpdGgKLSAgIGRpZmZlcmVuY2VzIGluIHRoZSBjb25zdHMsIGluIHN0ZGxpYi5oLiAgVG8gYXZvaWQgY29tcGlsYXRpb24KLSAgIGVycm9ycywgb25seSBwcm90b3R5cGUgZ2V0b3B0IGZvciB0aGUgR05VIEMgbGlicmFyeS4gICovCi1leHRlcm4gaW50IGdldG9wdCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpzaG9ydG9wdHMpOwotI2Vsc2UgLyogbm90IF9fR05VX0xJQlJBUllfXyAqLwotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci0jZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCi1leHRlcm4gaW50IGdldG9wdF9sb25nIChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKnNob3J0b3B0cywKLQkJICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKLWV4dGVybiBpbnQgZ2V0b3B0X2xvbmdfb25seSAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAotCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKLQotLyogSW50ZXJuYWwgb25seS4gIFVzZXJzIHNob3VsZCBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LiAgKi8KLWV4dGVybiBpbnQgX2dldG9wdF9pbnRlcm5hbCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAotCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kLAotCQkJICAgICBpbnQgbG9uZ19vbmx5KTsKLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci1leHRlcm4gaW50IGdldG9wdF9sb25nICgpOwotZXh0ZXJuIGludCBnZXRvcHRfbG9uZ19vbmx5ICgpOwotCi1leHRlcm4gaW50IF9nZXRvcHRfaW50ZXJuYWwgKCk7Ci0jZW5kaWYgLyogX19TVERDX18gKi8KLQotI2lmZGVmCV9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIGdldG9wdC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hwLXN5bXRhYi5oIGIvaW5jbHVkZS9ocC1zeW10YWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmNTY2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hwLXN5bXRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg3MSArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcyBmb3IgcmVhZGluZyBkZWJ1ZyBzeW1ib2xzIGZyb20gdGhlCi0gICBuYXRpdmUgSFAgQyBjb21waWxlci4KLQotICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSFBfU1lNVEFCX0lOQ0xVREVECi0jZGVmaW5lIEhQX1NZTVRBQl9JTkNMVURFRAotCi0vKiBHZW5lcmFsIGluZm9ybWF0aW9uOgotCi0gICBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgYW5kIGRlc2NyaWJlcyBvbmx5IHRoZSBkYXRhIHN0cnVjdHVyZXMKLSAgIG5lY2Vzc2FyeSB0byByZWFkIGRlYnVnIHN5bWJvbHMgcHJvZHVjZWQgYnkgdGhlIEhQIEMgY29tcGlsZXIsCi0gICBIUCBBTlNJIEMrKyBjb21waWxlciwgYW5kIEhQIEZPUlRSQU4gOTAgY29tcGlsZXIgdXNpbmcgdGhlCi0gICBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LiAgCi0gICAoRm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgZGVidWcgZm9ybWF0LCBmdHAgaHB1eC1zeW10YWIuaCBmcm9tCi0gICBqYWd1YXIuY3MudXRhaC5lZHU6L2Rpc3QpLgotICAgCi0gICBBZGRpdGlvbmFsIG5vdGVzIChSaWNoIFRpdGxlKQotICAgVGhpcyBmaWxlIGlzIGEgcmV2ZXJzZS1lbmdpbmVlcmVkIHZlcnNpb24gb2YgYSBmaWxlIGNhbGxlZAotICAgInN5bXRhYi5oIiB3aGljaCBleGlzdHMgaW50ZXJuYWwgdG8gSFAncyBDb21wdXRlciBMYW5ndWFnZXMgT3JnYW5pemF0aW9uCi0gICBpbiAvQ0xPL0NvbXBvbmVudHMvRERFL29iai9zb20vc3ltdGFiLmguIEJlY2F1c2UgSFAncyB2ZXJzaW9uIG9mCi0gICB0aGUgZmlsZSBpcyBjb3B5cmlnaHRlZCBhbmQgbm90IGRpc3RyaWJ1dGVkLCBpdCBpcyBuZWNlc3NhcnkgZm9yCi0gICBHREIgdG8gdXNlIHRoZSByZXZlcnNlLWVuZ2luZWVyZWQgdmVyc2lvbiB0aGF0IGZvbGxvd3MuCi0gICBXb3JrIHdhcyBkb25lIGJ5IEN5Z251cyB0byByZXZlcnNlLWVuZ2luZWVyIHRoZSBDIHN1YnNldCBvZiBzeW10YWIuaC4KLSAgIFRoZSBXREIgcHJvamVjdCBoYXMgZXh0ZW5kZWQgdGhpcyB0byBhbHNvIGNvbnRhaW4gdGhlIEMrKyAKLSAgIHN5bWJvbCBkZWZpbml0aW9ucywgdGhlIEY5MCBzeW1ib2wgZGVmaW5pdGlvbnMsIAotICAgYW5kIHRoZSBET0MgKGRlYnVnZ2luZy1vcHRpbWl6ZWQtY29kZSkgc3ltYm9sIGRlZmluaXRpb25zLgotICAgSW4gc29tZSBjYXNlcyAodGhlIEMrKyBzeW1ib2wgZGVmaW5pdGlvbnMpCi0gICBJIGhhdmUgYWRkZWQgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBoZXJlIHRoYXQKLSAgIGdvZXMgYmV5b25kIHdoYXQgaXMgc3VwcGxpZWQgaW4gSFAncyBzeW10YWIuaC4gSWYgd2Ugc29tZWRheQotICAgdW5pZnkgdGhlc2UgZmlsZXMgYWdhaW4sIHRoZSBleHRyYSBjb21tZW50cyBzaG91bGQgYmUgbWVyZ2VkIGJhY2sKLSAgIGludG8gSFAncyBzeW10YWIuaC4KLSAgCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIERlYnVnIHN5bWJvbHMgYXJlIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4gYW4gdW5sb2FkYWJsZSBzcGFjZSBjYWxsZWQKLSAgICRERUJVRyQuICAkREVCVUckIGNvbnRhaW5zIHNldmVyYWwgc3Vic3BhY2VzIHdoaWNoIGdyb3VwIHJlbGF0ZWQKLSAgIGRlYnVnIHN5bWJvbHMuCi0KLSAgICRHTlRUJCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgZ2xvYmFsIHZhcmlhYmxlcywgdHlwZXMgYW5kIGNvbnRhbnRzLgotCi0gICAkTE5UVCQgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHByb2NlZHVyZXMgKGluY2x1ZGluZyBuZXN0aW5nKSwgc2NvcGluZwotICAgaW5mb3JtYXRpb24sIGxvY2FsIHZhcmlhYmxlcywgdHlwZXMsIGFuZCBjb25zdGFudHMuCi0KLSAgICRTTFQkIGNvbnRhaW5zIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHNvIHRoYXQgY29kZSBhZGRyZXNzZXMgbWF5IGJlCi0gICBtYXBwZWQgdG8gc291cmNlIGxpbmVzLgotCi0gICAkVlQkIGNvbnRhaW5zIHZhcmlvdXMgc3RyaW5ncyBhbmQgY29uc3RhbnRzIGZvciBuYW1lZCBvYmplY3RzICh2YXJpYWJsZXMsCi0gICB0eXBlZGVmcywgZnVuY3Rpb25zLCBldGMpLiAgU3RyaW5ncyBhcmUgc3RvcmVkIGFzIG51bGwtdGVybWluYXRlZCBjaGFyYWN0ZXIKLSAgIGxpc3RzLiAgQ29uc3RhbnRzIGFsd2F5cyBiZWdpbiBvbiB3b3JkIGJvdW5kYXJpZXMuICBUaGUgZmlyc3QgYnl0ZSBvZgotICAgdGhlIFZUIG11c3QgYmUgemVybyAoYSBudWxsIHN0cmluZykuCi0KLSAgICRYVCQgaXMgbm90IGN1cnJlbnRseSB1c2VkIGJ5IEdEQi4KLQotICAgTWFueSBzdHJ1Y3R1cmVzIHdpdGhpbiB0aGUgc3Vic3BhY2VzIHBvaW50IHRvIG90aGVyIHN0cnVjdHVyZXMgd2l0aGluCi0gICB0aGUgc2FtZSBzdWJzcGFjZSwgb3IgdG8gc3RydWN0dXJlcyB3aXRoaW4gYSBkaWZmZXJlbnQgc3Vic3BhY2UuICBUaGVzZQotICAgcG9pbnRlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgc3RydWN0dXJlIGluZGV4IGZyb20gdGhlIGJlZ2lubmluZyBvZgotICAgdGhlIGFwcHJvcHJpYXRlIHN1YnNwYWNlLiAgKi8KLQotLyogVXNlZCB0byBkZXNjcmliZSB3aGVyZSBhIGNvbnN0YW50IGlzIHN0b3JlZC4gICovCi1lbnVtIGxvY2F0aW9uX3R5cGUKLXsKLSAgTE9DQVRJT05fSU1NRURJQVRFLAotICBMT0NBVElPTl9QVFIsCi0gIExPQ0FUSU9OX1ZULAotfTsKLQotLyogTGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSB0aGlzIGRlYnVnIGZvcm1hdC4gIFdpdGhpbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzCi0gICB0aGlzIHR5cGUgaXMgbGltaXRlZCB0byA0IGJpdHMgZm9yIGEgbWF4aW11bSBvZiAxNiBsYW5ndWFnZXMuICAqLwotZW51bSBocF9sYW5ndWFnZQotewotICBIUF9MQU5HVUFHRV9VTktOT1dOLAotICBIUF9MQU5HVUFHRV9DLAotICBIUF9MQU5HVUFHRV9GNzcsCi0gIEhQX0xBTkdVQUdFX1BBU0NBTCwKLSAgSFBfTEFOR1VBR0VfTU9EQ0FMLAotICBIUF9MQU5HVUFHRV9DT0JPTCwKLSAgSFBfTEFOR1VBR0VfQkFTSUMsCi0gIEhQX0xBTkdVQUdFX0FEQSwKLSAgSFBfTEFOR1VBR0VfQ1BMVVNQTFVTLAotICBIUF9MQU5HVUFHRV9ETVBBU0NBTAotfTsKLQotCi0vKiBCYXNpYyBkYXRhIHR5cGVzIGF2YWlsYWJsZSBpbiB0aGlzIGRlYnVnIGZvcm1hdC4gIFdpdGhpbiB0aGUgZGF0YQotICAgc3RydWN0dXJlcyB0aGlzIHR5cGUgaXMgbGltaXRlZCB0byA1IGJpdHMgZm9yIGEgbWF4aW11bSBvZiAzMiBiYXNpYwotICAgZGF0YSB0eXBlcy4gICovCi1lbnVtIGhwX3R5cGUKLXsKLSAgSFBfVFlQRV9VTkRFRklORUQsIC8qIDAgKi8KLSAgSFBfVFlQRV9CT09MRUFOLCAvKiAxICovCi0gIEhQX1RZUEVfQ0hBUiwgLyogMiAqLwotICBIUF9UWVBFX0lOVCwgLyogMyAqLwotICBIUF9UWVBFX1VOU0lHTkVEX0lOVCwgLyogNCAqLwotICBIUF9UWVBFX1JFQUwsIC8qIDUgKi8KLSAgSFBfVFlQRV9DT01QTEVYLCAvKiA2ICovCi0gIEhQX1RZUEVfU1RSSU5HMjAwLCAvKiA3ICovCi0gIEhQX1RZUEVfTE9OR1NUUklORzIwMCwgLyogOCAqLwotICBIUF9UWVBFX1RFWFQsIC8qIDkgKi8KLSAgSFBfVFlQRV9GTEFCRUwsIC8qIDEwICovCi0gIEhQX1RZUEVfRlROX1NUUklOR19TUEVDLCAvKiAxMSAqLwotICBIUF9UWVBFX01PRF9TVFJJTkdfU1BFQywgLyogMTIgKi8KLSAgSFBfVFlQRV9QQUNLRURfREVDSU1BTCwgLyogMTMgKi8KLSAgSFBfVFlQRV9SRUFMXzMwMDAsIC8qIDE0ICovCi0gIEhQX1RZUEVfTU9EX1NUUklOR18zMDAwLCAvKiAxNSAqLwotICBIUF9UWVBFX0FOWVBPSU5URVIsIC8qIDE2ICovCi0gIEhQX1RZUEVfR0xPQkFMX0FOWVBPSU5URVIsIC8qIDE3ICovCi0gIEhQX1RZUEVfTE9DQUxfQU5ZUE9JTlRFUiwgLyogMTggKi8KLSAgSFBfVFlQRV9DT01QTEVYUzMwMDAsIC8qIDE5ICovCi0gIEhQX1RZUEVfRlROX1NUUklOR19TMzAwX0NPTVBBVCwgLyogMjAgKi8gCi0gIEhQX1RZUEVfRlROX1NUUklOR19WQVhfQ09NUEFULCAvKiAyMSAqLwotICBIUF9UWVBFX0JPT0xFQU5fUzMwMF9DT01QQVQsIC8qIDIyICovCi0gIEhQX1RZUEVfQk9PTEVBTl9WQVhfQ09NUEFULCAvKiAyMyAqLwotICBIUF9UWVBFX1dJREVfQ0hBUiwgLyogMjQgKi8KLSAgSFBfVFlQRV9MT05HLCAvKiAyNSAqLwotICBIUF9UWVBFX1VOU0lHTkVEX0xPTkcsIC8qIDI2ICovCi0gIEhQX1RZUEVfRE9VQkxFLCAvKiAyNyAqLwotICBIUF9UWVBFX1RFTVBMQVRFX0FSRywgLyogMjggKi8KLSAgSFBfVFlQRV9WT0lEIC8qIDI5ICovCi19OwotCi0vKiBBbiBpbW1lZGlhdGUgbmFtZSBhbmQgdHlwZSB0YWJsZSBlbnRyeS4KLQotICAgZXh0ZW5zaW9uIGFuZCBpbW1lZGlhdGUgd2lsbCBhbHdheXMgYmUgb25lLgotICAgZ2xvYmFsIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0gICBocF90eXBlIGlzIHRoZSBiYXNpYyB0eXBlIHRoaXMgZW50cnkgZGVzY3JpYmVzLgotICAgYml0bGVuZ3RoIGlzIHRoZSBsZW5ndGggaW4gYml0cyBmb3IgdGhlIGJhc2ljIHR5cGUuICAqLwotc3RydWN0IGRudHRwX2ltbWVkaWF0ZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQgaW1tZWRpYXRlOgkxOwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IHR5cGU6IAkJNTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDoJMjQ7Ci19OwotCi0vKiBBIG5vbmltbWVkaWF0ZSBuYW1lIGFuZCB0eXBlIHRhYmxlIGVudHJ5LgotCi0gICBleHRlbnNpb24gd2lsbCBhbHdheXMgYmUgb25lLgotICAgaW1tZWRpYXRlIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0gICBpZiBnbG9iYWwgaXMgemVybywgdGhpcyBlbnRyeSBwb2ludHMgaW50byB0aGUgTE5UVAotICAgaWYgZ2xvYmFsIGlzIG9uZSwgdGhpcyBlbnRyeSBwb2ludHMgaW50byB0aGUgR05UVAotICAgaW5kZXggaXMgdGhlIGluZGV4IHdpdGhpbiB0aGUgR05UVCBvciBMTlRUIGZvciB0aGlzIGVudHJ5LiAgKi8KLXN0cnVjdCBkbnR0cF9ub25pbW1lZGlhdGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGltbWVkaWF0ZToJMTsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRleDoJCTI5OwotfTsKLQotLyogQSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBHTlRUIGFuZCBMTlRUIHRhYmxlcy4gIEl0IGhhcyB0d28KLSAgIGZvcm1zIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBiZWluZyBkZXNjcmliZWQuCi0KLSAgIFRoZSBpbW1lZGlhdGUgZm9ybSBpcyB1c2VkIGZvciBzaW1wbGUgZW50cmllcyBhbmQgaXMgb25lCi0gICB3b3JkLgotCi0gICBUaGUgbm9uaW1tZWRpYXRlIGZvcm0gaXMgdXNlZCBmb3IgY29tcGxleCBlbnRyaWVzIGFuZCBjb250YWlucwotICAgYW4gaW5kZXggaW50byB0aGUgTE5UVCBvciBHTlRUIHdoaWNoIGRlc2NyaWJlcyB0aGUgZW50aXJlIHR5cGUuCi0KLSAgIElmIGEgZG50dHBvaW50ZXIgaXMgLTEsIHRoZW4gaXQgaXMgYSBOSUwgZW50cnkuICAqLwotCi0jZGVmaW5lIEROVFROSUwgKC0xKQotdHlwZWRlZiB1bmlvbiBkbnR0cG9pbnRlcgotewotICBzdHJ1Y3QgZG50dHBfaW1tZWRpYXRlICAgIGRudHRpOwotICBzdHJ1Y3QgZG50dHBfbm9uaW1tZWRpYXRlIGRudHRwOwotICBpbnQgd29yZDsKLX0gZG50dHBvaW50ZXI7Ci0KLS8qIEFuIGluZGV4IGludG8gdGhlIHNvdXJjZSBsaW5lIHRhYmxlLiAgQXMgd2l0aCBkbnR0cG9pbnRlcnMsIGEgc2x0cG9pbnRlcgotICAgb2YgLTEgaW5kaWNhdGVzIGEgTklMIGVudHJ5LiAgKi8KLSNkZWZpbmUgU0xUTklMICgtMSkKLXR5cGVkZWYgaW50IHNsdHBvaW50ZXI7Ci0KLS8qIEluZGV4IGludG8gRE9DICg9ICJEZWJ1Z2dpbmcgT3B0aW1pemVkIENvZGUiKSBsaW5lIHRhYmxlICovCi0jZGVmaW5lIExUTklMICgtMSkKLXR5cGVkZWYgaW50IGx0cG9pbnRlcjsKLQotLyogSW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0jZGVmaW5lIENUWFROSUwgKC0xKQotdHlwZWRlZiBpbnQgY3R4dHBvaW50ZXI7Ci0KLS8qIFVuc2lnbmVkIGJ5dGUgb2Zmc2V0IGludG8gdGhlIFZULiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IHZ0cG9pbnRlcjsKLQotLyogQSBETlRUIGVudHJ5ICh1c2VkIHdpdGhpbiB0aGUgR05UVCBhbmQgTE5UVCkuCi0KLSAgIEROVFQgZW50cmllcyBhcmUgdmFyaWFibGUgc2l6ZWQgb2JqZWN0cywgYnV0IGFyZSBhbHdheXMgYSBtdWx0aXBsZQotICAgb2YgMyB3b3JkcyAod2UgY2FsbCBlYWNoIGdyb3VwIG9mIDMgd29yZHMgYSAiYmxvY2siKS4KLQotICAgVGhlIGZpcnN0IGJpdCBpbiBlYWNoIGJsb2NrIGlzIGFuIGV4dGVuc2lvbiBiaXQuICBUaGlzIGJpdCBpcyB6ZXJvCi0gICBmb3IgdGhlIGZpcnN0IGJsb2NrIG9mIGEgRE5UVCBlbnRyeS4gIElmIHRoZSBlbnRyeSByZXF1aXJlcyBtb3JlCi0gICB0aGFuIG9uZSBibG9jaywgdGhlbiB0aGlzIGJpdCBpcyBzZXQgdG8gb25lIGluIGFsbCBibG9ja3MgYWZ0ZXIKLSAgIHRoZSBmaXJzdCBvbmUuICAqLwotCi0vKiBFYWNoIEROVFQgZW50cnkgZGVzY3JpYmVzIGEgcGFydGljdWxhciBkZWJ1ZyBzeW1ib2wgKGJlZ2lubmluZyBvZgotICAgYSBzb3VyY2UgZmlsZSwgYSBmdW5jdGlvbiwgdmFyaWFibGVzLCBzdHJ1Y3R1cmVzLCBldGMuCi0KLSAgIFRoZSB0eXBlIG9mIHRoZSBETlRUIGVudHJ5IGlzIHN0b3JlZCBpbiB0aGUgImtpbmQiIGZpZWxkIHdpdGhpbiB0aGUKLSAgIEROVFQgZW50cnkgaXRzZWxmLiAgKi8KLQotZW51bSBkbnR0X2VudHJ5X3R5cGUKLXsKLSAgRE5UVF9UWVBFX05JTCA9IC0xLAotICBETlRUX1RZUEVfU1JDRklMRSwKLSAgRE5UVF9UWVBFX01PRFVMRSwKLSAgRE5UVF9UWVBFX0ZVTkNUSU9OLAotICBETlRUX1RZUEVfRU5UUlksCi0gIEROVFRfVFlQRV9CRUdJTiwKLSAgRE5UVF9UWVBFX0VORCwKLSAgRE5UVF9UWVBFX0lNUE9SVCwKLSAgRE5UVF9UWVBFX0xBQkVMLAotICBETlRUX1RZUEVfRlBBUkFNLAotICBETlRUX1RZUEVfU1ZBUiwKLSAgRE5UVF9UWVBFX0RWQVIsCi0gIEROVFRfVFlQRV9IT0xFMSwKLSAgRE5UVF9UWVBFX0NPTlNULAotICBETlRUX1RZUEVfVFlQRURFRiwKLSAgRE5UVF9UWVBFX1RBR0RFRiwKLSAgRE5UVF9UWVBFX1BPSU5URVIsCi0gIEROVFRfVFlQRV9FTlVNLAotICBETlRUX1RZUEVfTUVNRU5VTSwKLSAgRE5UVF9UWVBFX1NFVCwKLSAgRE5UVF9UWVBFX1NVQlJBTkdFLAotICBETlRUX1RZUEVfQVJSQVksCi0gIEROVFRfVFlQRV9TVFJVQ1QsCi0gIEROVFRfVFlQRV9VTklPTiwKLSAgRE5UVF9UWVBFX0ZJRUxELAotICBETlRUX1RZUEVfVkFSSUFOVCwKLSAgRE5UVF9UWVBFX0ZJTEUsCi0gIEROVFRfVFlQRV9GVU5DVFlQRSwKLSAgRE5UVF9UWVBFX1dJVEgsCi0gIEROVFRfVFlQRV9DT01NT04sCi0gIEROVFRfVFlQRV9DT0JTVFJVQ1QsCi0gIEROVFRfVFlQRV9YUkVGLAotICBETlRUX1RZUEVfU0EsCi0gIEROVFRfVFlQRV9NQUNSTywKLSAgRE5UVF9UWVBFX0JMT0NLREFUQSwKLSAgRE5UVF9UWVBFX0NMQVNTX1NDT1BFLAotICBETlRUX1RZUEVfUkVGRVJFTkNFLAotICBETlRUX1RZUEVfUFRSTUVNLAotICBETlRUX1RZUEVfUFRSTUVNRlVOQywKLSAgRE5UVF9UWVBFX0NMQVNTLAotICBETlRUX1RZUEVfR0VORklFTEQsCi0gIEROVFRfVFlQRV9WRlVOQywKLSAgRE5UVF9UWVBFX01FTUFDQ0VTUywKLSAgRE5UVF9UWVBFX0lOSEVSSVRBTkNFLAotICBETlRUX1RZUEVfRlJJRU5EX0NMQVNTLAotICBETlRUX1RZUEVfRlJJRU5EX0ZVTkMsCi0gIEROVFRfVFlQRV9NT0RJRklFUiwKLSAgRE5UVF9UWVBFX09CSkVDVF9JRCwKLSAgRE5UVF9UWVBFX01FTUZVTkMsCi0gIEROVFRfVFlQRV9URU1QTEFURSwKLSAgRE5UVF9UWVBFX1RFTVBMQVRFX0FSRywKLSAgRE5UVF9UWVBFX0ZVTkNfVEVNUExBVEUsCi0gIEROVFRfVFlQRV9MSU5LLAotICBETlRUX1RZUEVfRFlOX0FSUkFZX0RFU0MsCi0gIEROVFRfVFlQRV9ERVNDX1NVQlJBTkdFLAotICBETlRUX1RZUEVfQkVHSU5fRVhULAotICBETlRUX1RZUEVfSU5MTiwKLSAgRE5UVF9UWVBFX0lOTE5fTElTVCwKLSAgRE5UVF9UWVBFX0FMSUFTLAotICBETlRUX1RZUEVfRE9DX0ZVTkNUSU9OLAotICBETlRUX1RZUEVfRE9DX01FTUZVTkMsCi0gIEROVFRfVFlQRV9NQVgKLX07Ci0KLS8qIEROVFRfVFlQRV9TUkNGSUxFOgotCi0gICBPbmUgRE5UVF9UWVBFX1NSQ0ZJTEUgc3ltYm9sIGlzIG91dHB1dCBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlCi0gICBmaWxlIGFuZCBhdCB0aGUgYmVnaW4gYW5kIGVuZCBvZiBhbiBpbmNsdWRlZCBmaWxlLiAgQSBETlRUX1RZUEVfU1JDRklMRQotICAgZW50cnkgaXMgYWxzbyBvdXRwdXQgYmVmb3JlIGVhY2ggRE5UVF9UWVBFX0ZVTkMgc3ltYm9sIHNvIHRoYXQgZGVidWdnZXJzCi0gICBjYW4gZGV0ZXJtaW5lIHdoYXQgZmlsZSBhIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLgotCi0gICBMQU5HVUFHRSBkZXNjcmliZXMgdGhlIHNvdXJjZSBmaWxlJ3MgbGFuZ3VhZ2UuCi0KLSAgIE5BTUUgcG9pbnRzIHRvIGFuIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgc291cmNlIGZpbGUncyBuYW1lLgotCi0gICBOb3RlIHRoZSBuYW1lIHVzZWQgZm9yIEROVFRfVFlQRV9TUkNGSUxFIGVudHJpZXMgYXJlIGV4YWN0bHkgYXMgc2VlbgotICAgYnkgdGhlIGNvbXBpbGVyIChpZSB0aGV5IG1heSBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSkuICBDIGluY2x1ZGUgZmlsZXMKLSAgIHZpYSA8PiBpbmNsdXNpb24gbXVzdCB1c2UgYWJzb2x1dGUgcGF0aHMuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3NyY2ZpbGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgICAgLyogRE5UVF9UWVBFX1NSQ0ZJTEUgKi8KLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOgk0OwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfTU9EVUxFOgotCi0gICBBIEROVFRfVFlQRV9NT0RVTEUgc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIHRoZSBzdGFydCBvZiBhIHBhc2NhbAotICAgbW9kdWxlIG9yIEMgc291cmNlIGZpbGUuIEEgbW9kdWxlIGluZGljYXRlcyBhIGNvbXBpbGF0aW9uIHVuaXQKLSAgIGZvciBuYW1lLXNjb3BpbmcgcHVycG9zZXM7IGluIHRoYXQgcmVnYXJkIHRoZXJlIHNob3VsZCBiZSAKLSAgIGEgMS0xIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gR0RCICJzeW10YWIiJ3MgYW5kIE1PRFVMRSBzeW1ib2wgcmVjb3Jkcy4KLQotICAgRWFjaCBETlRUX1RZUEVfTU9EVUxFIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEROVFRfVFlQRV9FTkQgc3ltYm9sLgotCi0gICBOQU1FIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgbW9kdWxlJ3MgbmFtZS4gIE5vdGUgQwotICAgc291cmNlIGZpbGVzIGFyZSBjb25zaWRlcmVkIG5hbWVsZXNzIG1vZHVsZXMuCi0KLSAgIEFMSUFTIHBvaW50IHRvIGEgVlQgZW50cnkgcHJvdmlkaW5nIGEgc2Vjb25kYXJ5IG5hbWUuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX21vZHVsZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOyAJLyogRE5UVF9UWVBFX01PRFVMRSAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICB2dHBvaW50ZXIgYWxpYXM7Ci0gIGRudHRwb2ludGVyIHVudXNlZDI7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLX07Ci0KLS8qIEROVFRfVFlQRV9GVU5DVElPTiwKLSAgIEROVFRfVFlQRV9FTlRSWSwKLSAgIEROVFRfVFlQRV9CTE9DS0RBVEEsCi0gICBETlRUX1RZUEVfTUVNRlVOQzoKLQotICAgQSBETlRUX1RZUEVfRlVOQ1RJT04gc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIGVhY2ggZnVuY3Rpb24gZGVmaW5pdGlvbjsKLSAgIGEgRE5UVF9UWVBFX0VOVFJZIHN5bWJvbHMgaXMgdXNlZCBmb3Igc2Vjb25kYXJ5IGVudHJ5IHBvaW50cy4gIEJvdGgKLSAgIHN5bWJvbHMgdXNlZCB0aGUgZG50dF90eXBlX2Z1bmN0aW9uIHN0cnVjdHVyZS4KLSAgIEEgRE5UVF9UWVBFX0JMT0NLREFUQSBzeW1ib2wgaXMgZW1pdHRlZCAuLi4/Ci0gICBBIEROVFRfVFlQRV9NRU1GVU5DIHN5bWJvbCBpcyBlbWl0dGVkIGZvciBpbmxpbmVkIG1lbWJlciBmdW5jdGlvbnMgKEMrKykuIAotCi0gICBFYWNoIG9mIEROVFRfVFlQRV9GVU5DVElPTiBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5ELgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgZnVuY3Rpb24gaGFzIGdsb2JhbCBzY29wZS4KLQotICAgTEFOR1VBR0UgZGVzY3JpYmVzIHRoZSBmdW5jdGlvbidzIHNvdXJjZSBsYW5ndWFnZS4KLQotICAgT1BUX0xFVkVMIGRlc2NyaWJlcyB0aGUgb3B0aW1pemF0aW9uIGxldmVsIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQKLSAgIHdpdGguCi0KLSAgIFZBUkFSR1MgaXMgbm9uemVybyBpZiB0aGUgZnVuY3Rpb24gdXNlcyB2YXJhcmdzLgotCi0gICBOQU1FIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgZnVuY3Rpb24ncyBuYW1lLgotCi0gICBBTElBUyBwb2ludHMgdG8gYSBWVCBlbnRyeSBwcm92aWRpbmcgYSBzZWNvbmRhcnkgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uLgotCi0gICBGSVJTVFBBUkFNIHBvaW50cyB0byBhIExOVFQgZW50cnkgd2hpY2ggZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLQotICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCi0gICBtYXkgYmUgZGV0ZXJtaW5lZC4KLQotICAgRU5UUllBRERSIGlzIHRoZSBtZW1vcnkgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRoZSB0aGUgZnVuY3Rpb24ncyBlbnRyeSBwb2ludAotCi0gICBSRVRWQUwgcG9pbnRzIHRvIGEgTE5UVCBlbnRyeSBkZXNjcmliaW5nIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4KLQotICAgTE9XQUREUiBpcyB0aGUgbG93ZXN0IG1lbW9yeSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgotCi0gICBISUFERFIgaXMgdGhlIGhpZ2hlc3QgbWVtb3J5IGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CS8qIEROVFRfVFlQRV9GVU5DVElPTiwKLQkJCQkgICAgICAgICAgIEROVFRfVFlQRV9FTlRSWSwKLQkJCQkJICAgRE5UVF9UWVBFX0JMT0NLREFUQQotCQkJCQkgICBvciBETlRUX1RZUEVfTUVNRlVOQyAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOgk0OwotICB1bnNpZ25lZCBpbnQgbmVzdF9sZXZlbDoJNTsKLSAgdW5zaWduZWQgaW50IG9wdF9sZXZlbDoJMjsKLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6CQkxOwotICB1bnNpZ25lZCBpbnQgbGFuZ19pbmZvOgk0OwotICB1bnNpZ25lZCBpbnQgaW5saW5lZDoJCTE7Ci0gIHVuc2lnbmVkIGludCBsb2NhbGFsbG9jOgkxOwotICB1bnNpZ25lZCBpbnQgZXhwYW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHZ0cG9pbnRlciBhbGlhczsKLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbTsKLSAgc2x0cG9pbnRlciBhZGRyZXNzOwotICBDT1JFX0FERFIgZW50cnlhZGRyOwotICBkbnR0cG9pbnRlciByZXR2YWw7Ci0gIENPUkVfQUREUiBsb3dhZGRyOwotICBDT1JFX0FERFIgaGlhZGRyOwotfTsKLQotLyogRE5UVF9UWVBFX0JFR0lOOgotCi0gICBBIEROVFRfVFlQRV9CRUdJTiBzeW1ib2wgaXMgZW1pdHRlZCB0byBiZWdpbiBhIG5ldyBuZXN0ZWQgc2NvcGUuCi0gICBFdmVyeSBETlRUX1RZUEVfQkVHSU4gc3ltYm9sIG11c3QgaGF2ZSBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sLgotCi0gICBDTEFTU0ZMQUcgaXMgbm9uemVybyBpZiB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYSBjKysgY2xhc3MgZGVmaW5pdGlvbi4KLQotICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCi0gICBtYXkgYmUgZGV0ZXJtaW5lZC4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfYmVnaW4KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGNsYXNzZmxhZzoJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIwOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfRU5EOgotCi0gICBBIEROVFRfVFlQRV9FTkQgc3ltYm9sIGlzIGVtaXR0ZWQgd2hlbiBjbG9zaW5nIGEgc2NvcGUgc3RhcnRlZCBieQotICAgYSBETlRUX1RZUEVfTU9EVUxFLCBETlRUX1RZUEVfRlVOQ1RJT04sIEROVFRfVFlQRV9XSVRILAotICAgRE5UVF9UWVBFX0NPTU1PTiwgRE5UVF9UWVBFX0JFR0lOLCBhbmQgRE5UVF9UWVBFX0NMQVNTX1NDT1BFIHN5bWJvbHMuCi0KLSAgIEVOREtJTkQgZGVzY3JpYmVzIHdoYXQgdHlwZSBvZiBzY29wZSB0aGUgRE5UVF9UWVBFX0VORCBpcyBjbG9zaW5nCi0gICAob25lIG9mIHRoZSBhYm92ZSA2IGtpbmRzKS4KLQotICAgQ0xBU1NGTEFHIGlzIG5vbnplcm8gaWYgdGhpcyBpcyB0aGUgZW5kIG9mIGEgYysrIGNsYXNzIGRlZmluaXRpb24uCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuCi0KLSAgIEJFR0lOU0NPUEUgcG9pbnRzIHRvIHRoZSBMTlRUIGVudHJ5IHdoaWNoIG9wZW5lZCB0aGUgc2NvcGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2VuZAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgZW5ka2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgY2xhc3NmbGFnOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTA7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLSAgZG50dHBvaW50ZXIgYmVnaW5zY29wZTsKLX07Ci0KLS8qIEROVFRfVFlQRV9JTVBPUlQgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfTEFCRUwgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0KLS8qIEROVFRfVFlQRV9GUEFSQU06Ci0KLSAgIEEgRE5UVF9UWVBFX0ZQQVJBTSBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgYSBmdW5jdGlvbiBhcmd1bWVudC4gIFdoZW4KLSAgIGNoYWluZWQgdG9nZXRoZXIgdGhlIHN5bWJvbHMgcmVwcmVzZW50IGFuIGFyZ3VtZW50IGxpc3QgZm9yIGEgZnVuY3Rpb24uCi0KLSAgIFJFR1BBUkFNIGlzIG5vbnplcm8gaWYgdGhpcyBwYXJhbWV0ZXIgd2FzIHBhc3NlZCBpbiBhIHJlZ2lzdGVyLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoaXMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyCi0gICAocGFzcyBieSByZWZlcmVuY2Ugb3IgcGFzcyBieSB2YWx1ZSBmb3IgbGFyZ2UgaXRlbXMpLgotCi0gICBMT05HQUREUiBpcyBub256ZXJvIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSA2NGJpdCBwb2ludGVyLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIHBhcmFtZXRlcidzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIGRlc2NyaWJlcyB3aGVyZSB0aGUgcGFyYW1ldGVyIGlzIHN0b3JlZC4gIERlcGVuZGluZyBvbiB0aGUKLSAgIHBhcmFtZXRlciB0eXBlIExPQ0FUSU9OIGNvdWxkIGJlIGEgcmVnaXN0ZXIgbnVtYmVyLCBvciBhbiBvZmZzZXQKLSAgIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIuCi0KLSAgIFRZUEUgcG9pbnRzIHRvIGEgTlRUIGVudHJ5IGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIuCi0KLSAgIE5FWFRQQVJBTSBwb2ludHMgdG8gdGhlIExOVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgbmV4dCBwYXJhbWV0ZXIuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZwYXJhbQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgcmVncGFyYW06CTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOgkxOwotICB1bnNpZ25lZCBpbnQgY29weXBhcmFtOgkxOwotICB1bnNpZ25lZCBpbnQgZGZsdDoJCTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNjsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIGludCBsb2NhdGlvbjsKLSAgZG50dHBvaW50ZXIgdHlwZTsKLSAgZG50dHBvaW50ZXIgbmV4dHBhcmFtOwotICBpbnQgbWlzYzsKLX07Ci0KLS8qIEROVFRfVFlQRV9TVkFSOgotCi0gICBBIEROVFRfVFlQRV9TVkFSIGlzIGVtaXR0ZWQgdG8gZGVzY3JpYmUgYSB2YXJpYWJsZSBpbiBzdGF0aWMgc3RvcmFnZS4KLQotICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGhhcyBnbG9iYWwgc2NvcGUuCi0KLSAgIElORElSRUNUIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGEgcG9pbnRlciB0byBhbiBvYmplY3QuCi0KLSAgIExPTkdBRERSIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGluIGxvbmcgcG9pbnRlciBzcGFjZS4KLQotICAgU1RBVElDTUVNIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGEgbWVtYmVyIG9mIGEgY2xhc3MuCi0KLSAgIEFfVU5JT04gaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYW4gYW5vbnltb3VzIHVuaW9uIG1lbWJlci4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSB2YXJpYWJsZSdzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBmb3IgdGhlIHZhcmlhYmxlLgotCi0gICBUWVBFIGlzIGEgcG9pbnRlciBpbnRvIGVpdGhlciB0aGUgR05UVCBvciBMTlRUIHdoaWNoIGRlc2NyaWJlcwotICAgdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfc3ZhcgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IGluZGlyZWN0OgkxOwotICB1bnNpZ25lZCBpbnQgbG9uZ2FkZHI6CTE7Ci0gIHVuc2lnbmVkIGludCBzdGF0aWNtZW06CTE7Ci0gIHVuc2lnbmVkIGludCBhX3VuaW9uOgkJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDE6ICAgICAgICAgMTsKLSAgdW5zaWduZWQgaW50IHRocmVhZF9zcGVjaWZpYzogMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDI6ICAgICAgICAgMTQ7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBDT1JFX0FERFIgbG9jYXRpb247Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBkaXNwbGFjZW1lbnQ7Ci19OwotCi0vKiBETlRUX1RZUEVfRFZBUjoKLQotICAgQSBETlRUX1RZUEVfRFZBUiBpcyBlbWl0dGVkIHRvIGRlc2NyaWJlIGF1dG9tYXRpYyB2YXJpYWJsZXMgYW5kIHZhcmlhYmxlcwotICAgaGVsZCBpbiByZWdpc3RlcnMuCi0KLSAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBoYXMgZ2xvYmFsIHNjb3BlLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0LgotCi0gICBSRUdWQVIgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgaW4gYSByZWdpc3Rlci4KLQotICAgQV9VTklPTiBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhbiBhbm9ueW1vdXMgdW5pb24gbWVtYmVyLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIHZhcmlhYmxlJ3MgbmFtZS4KLQotICAgTE9DQVRJT04gcHJvdmlkZXMgdGhlIG1lbW9yeSBhZGRyZXNzIG9yIHJlZ2lzdGVyIG51bWJlciBmb3IgdGhlIHZhcmlhYmxlLgotCi0gICBUWVBFIGlzIGEgcG9pbnRlciBpbnRvIGVpdGhlciB0aGUgR05UVCBvciBMTlRUIHdoaWNoIGRlc2NyaWJlcwotICAgdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZHZhcgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IGluZGlyZWN0OgkxOwotICB1bnNpZ25lZCBpbnQgcmVndmFyOgkJMTsKLSAgdW5zaWduZWQgaW50IGFfdW5pb246CQkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBpbnQgbG9jYXRpb247Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci19OwotCi0vKiBETlRUX1RZUEVfQ09OU1Q6Ci0KLSAgIEEgRE5UVF9UWVBFX0NPTlNUIHN5bWJvbCBpcyBlbWl0dGVkIGZvciBwcm9ncmFtIGNvbnN0YW50cy4KLQotICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIGNvbnN0YW50IGhhcyBnbG9iYWwgc2NvcGUuCi0KLSAgIElORElSRUNUIGlzIG5vbnplcm8gaWYgdGhlIGNvbnN0YW50IGlzIGEgcG9pbnRlciB0byBhbiBvYmplY3QuCi0KLSAgIExPQ0FUSU9OX1RZUEUgZGVzY3JpYmVzIHdoZXJlIHRvIGZpbmQgdGhlIGNvbnN0YW50J3MgdmFsdWUKLSAgIChpbiB0aGUgVlQsIG1lbW9yeSwgb3IgZW1iZWRkZWQgaW4gYW4gaW5zdHJ1Y3Rpb24pLgotCi0gICBDTEFTU01FTSBpcyBub256ZXJvIGlmIHRoZSBjb25zdGFudCBpcyBhIG1lbWJlciBvZiBhIGNsYXNzLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIGNvbnN0YW50J3MgbmFtZS4KLQotICAgTE9DQVRJT04gcHJvdmlkZXMgdGhlIG1lbW9yeSBhZGRyZXNzLCByZWdpc3RlciBudW1iZXIgb3IgcG9pbnRlcgotICAgaW50byB0aGUgVlQgZm9yIHRoZSBjb25zdGFudCdzIHZhbHVlLgotCi0gICBUWVBFIGlzIGEgcG9pbnRlciBpbnRvIGVpdGhlciB0aGUgR05UVCBvciBMTlRUIHdoaWNoIGRlc2NyaWJlcwotICAgdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfY29uc3QKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50OgkJCTM7Ci0gIHVuc2lnbmVkIGludCBjbGFzc21lbToJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE1OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgQ09SRV9BRERSIGxvY2F0aW9uOwotICBkbnR0cG9pbnRlciB0eXBlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZGlzcGxhY2VtZW50OwotfTsKLQotLyogRE5UVF9UWVBFX1RZUEVERUYgYW5kIEROVFRfVFlQRV9UQUdERUY6Ci0KLSAgIFRoZSBzYW1lIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlc2NyaWJlIHR5cGVkZWZzIGFuZCB0YWdkZWZzLgotCi0gICBETlRUX1RZUEVfVFlQRURFRlMgYXJlIGFzc29jaWF0ZWQgd2l0aCBDICJ0eXBlZGVmcyIuCi0KLSAgIEROVFRfVFlQRV9UQUdERUZzIGFyZSBhc3NvY2lhdGVkIHdpdGggQyAic3RydWN0IiwgInVuaW9uIiwgYW5kICJlbnVtIgotICAgdGFncywgd2hpY2ggbWF5IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBhIHR5cGVkZWYgaW4gdGhlIHNhbWUgc2NvcGUuCi0gICBBbHNvIHRoZXkgYXJlIGFzc29jaWF0ZWQgd2l0aCBDKysgImNsYXNzIiB0YWdzLCB3aGljaCBpbXBsaWNpdGx5IGhhdmUgCi0gICB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjbGFzcyB0eXBlLgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgdHlwZWRlZi90YWdkZWYgaGFzIGdsb2JhbCBzY29wZS4KLQotICAgVFlQRUlORk8gaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgZnVsbCB0eXBlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQotICAgZm9yIGEgdGFnLiAgKHVzdWFsbHkgMSwgYnV0IGNhbiBiZSB6ZXJvIGZvciBvcGFxdWUgdHlwZXMgaW4gQykuCi0KLSAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgY29uc3RhbnQncyBuYW1lLgotCi0gICBUWVBFIHBvaW50cyB0byB0aGUgdW5kZXJseWluZyB0eXBlIGZvciB0aGUgdHlwZWRlZi90YWdkZWYgaW4gdGhlCi0gICBHTlRUIG9yIExOVFQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3R5cGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgICAgLyogRE5UVF9UWVBFX1RZUEVERUYgb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETlRUX1RZUEVfVEFHREVGIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOwotICB1bnNpZ25lZCBpbnQgdHlwZWluZm86CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxOTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIGRudHRwb2ludGVyIHR5cGU7ICAgICAgICAgICAgICAgICAgICAvKiBVbmRlcmx5aW5nIHR5cGUsIHdoaWNoIGZvciBUQUdERUYncyBtYXkgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEROVFRfVFlQRV9TVFJVQ1QsIEROVFRfVFlQRV9VTklPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEROVFRfVFlQRV9FTlVNLCBvciBETlRUX1RZUEVfQ0xBU1MuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRm9yIFRZUEVERUYncyBvdGhlciB1bmRlcmx5aW5nIHR5cGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgYWxzbyBwb3NzaWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogRE5UVF9UWVBFX1BPSU5URVI6Ci0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgYSBwb2ludGVyIHRvIGFuIHVuZGVybHlpbmcgdHlwZS4KLQotICAgUE9JTlRTVE8gaXMgYSBwb2ludGVyIGludG8gdGhlIEdOVFQgb3IgTE5UVCBmb3IgdGhlIHR5cGUgd2hpY2ggdGhpcwotICAgcG9pbnRlciBwb2ludHMgdG8uCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwb2ludGVyIChub3QgdGhlIHVuZGVybHlpbmcgdHlwZSkuICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfcG9pbnRlcgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIGRudHRwb2ludGVyIHBvaW50c3RvOwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotCi0vKiBETlRUX1RZUEVfRU5VTToKLQotICAgVXNlZCB0byBkZXNjcmliZSBlbnVtZXJhdGVkIHR5cGVzLgotCi0gICBGSVJTVE1FTSBpcyBhIHBvaW50ZXIgdG8gYSBETlRUX1RZUEVfTUVNRU5VTSBpbiB0aGUgR05UVC9MTlRUIHdoaWNoCi0gICBkZXNjcmliZXMgdGhlIGZpcnN0IG1lbWJlciAoYW5kIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgY2hhaW4gb2YKLSAgIG1lbWJlcnMpLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gaG9sZCB0aGUgdmFsdWVzIG9mIHRoZSBlbnVtJ3MKLSAgIG1lbWJlcnMuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2VudW0KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIGRudHRwb2ludGVyIGZpcnN0bWVtOwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotLyogRE5UVF9UWVBFX01FTUVOVU0KLQotICAgVXNlZCB0byBkZXNjcmliZSBtZW1iZXJzIG9mIGFuIGVudW1lcmF0ZWQgdHlwZS4KLQotICAgQ0xBU1NNRU0gaXMgbm9uemVybyBpZiB0aGlzIG1lbWJlciBpcyBwYXJ0IG9mIGEgY2xhc3MuCi0KLSAgIE5BTUUgcG9pbnRzIGludG8gdGhlIFZUIGZvciB0aGUgbmFtZSBvZiB0aGlzIG1lbWJlci4KLQotICAgVkFMVUUgaXMgdGhlIHZhbHVlIG9mIHRoaXMgZW51bWVyYXRpb24gbWVtYmVyLgotCi0gICBORVhUTUVNIHBvaW50cyB0byB0aGUgbmV4dCBETlRUX1RZUEVfTUVNRU5VTSBpbiB0aGUgY2hhaW4uICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX21lbWVudW0KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgY2xhc3NtZW06CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMDsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHVuc2lnbmVkIGludCB2YWx1ZTsKLSAgZG50dHBvaW50ZXIgbmV4dG1lbTsKLX07Ci0KLS8qIEROVFRfVFlQRV9TRVQKLQotICAgVXNlZCB0byBkZXNjcmliZSBQQVNDQUwgInNldCIgdHlwZS4KLQotICAgREVDTEFSQVRJT04gZGVzY3JpYmVzIHRoZSBiaXRwYWNraW5nIG9mIHRoZSBzZXQuCi0KLSAgIFNVQlRZUEUgcG9pbnRzIHRvIGEgRE5UVCBlbnRyeSBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXJzLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIHNpemUgb2YgdGhlIHNldC4gICovIAotCi1zdHJ1Y3QgZG50dF90eXBlX3NldAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCBkZWNsYXJhdGlvbjoJMjsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE5OwotICBkbnR0cG9pbnRlciBzdWJ0eXBlOwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotLyogRE5UVF9UWVBFX1NVQlJBTkdFCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgc3VicmFuZ2UgdHlwZS4KLQotICAgRFlOX0xPVyBkZXNjcmliZXMgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBzdWJyYW5nZToKLQotICAgICAwMCBmb3IgYSBjb25zdGFudCBsb3dlciBib3VuZCAoZm91bmQgaW4gTE9XQk9VTkQpLgotCi0gICAgIDAxIGZvciBhIGR5bmFtaWMgbG93ZXIgYm91bmQgd2l0aCB0aGUgbG93ZXIgYm91bmQgZm91bmQgaW4gdGhlIHRoZQotICAgICBtZW1vcnkgYWRkcmVzcyBwb2ludGVkIHRvIGJ5IExPV0JPVU5ELgotCi0gICAgIDEwIGZvciBhIGR5bmFtaWMgbG93ZXIgYm91bmQgZGVzY3JpYmVkIGJ5IGFuIHZhcmlhYmxlIGZvdW5kIGluIHRoZQotICAgICBETlRUL0xOVFQgKExPV0JPVU5EIHdvdWxkIGJlIGEgcG9pbnRlciBpbnRvIHRoZSBETlRUL0xOVFQpLgotCi0gICBEWU5fSElHSCBpcyBzaW1pbGFyIHRvIERZTl9MT1csIGV4Y2VwdCBpdCBkZXNjcmliZXMgdGhlIHVwcGVyIGJvdW5kLgotCi0gICBTVUJUWVBFIHBvaW50cyB0byB0aGUgdHlwZSBvZiB0aGUgc3VicmFuZ2UuCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgbGVuZ3RoIGluIGJpdHMgbmVlZGVkIHRvIGRlc2NyaWJlIHRoZSBzdWJyYW5nZSdzCi0gICB2YWx1ZXMuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3N1YnJhbmdlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGR5bl9sb3c6CQkyOwotICB1bnNpZ25lZCBpbnQgZHluX2hpZ2g6CTI7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNzsKLSAgaW50IGxvd2JvdW5kOwotICBpbnQgaGlnaGJvdW5kOwotICBkbnR0cG9pbnRlciBzdWJ0eXBlOwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotLyogRE5UVF9UWVBFX0FSUkFZCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgYW4gYXJyYXkgdHlwZS4KLQotICAgREVDTEFSQVRJT04gZGVzY3JpYmVzIHRoZSBiaXQgcGFja2luZyB1c2VkIGluIHRoZSBhcnJheS4KLQotICAgQVJSQVlJU0JZVEVTIGlzIG5vbnplcm8gaWYgdGhlIGZpZWxkIGluIGFycmF5bGVuZ3RoIGRlc2NyaWJlcyB0aGUKLSAgIGxlbmd0aCBpbiBieXRlcyByYXRoZXIgdGhhbiBpbiBiaXRzLiAgQSB2YWx1ZSBvZiB6ZXJvIGlzIHVzZWQgdG8KLSAgIGRlc2NyaWJlIGFuIGFycmF5IHdpdGggc2l6ZSAyKiozMi4KLQotICAgRUxFTUlTQllURVMgaXMgbm9uemVybyBpZiB0aGUgbGVuZ3RoIGlmIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKLSAgIGlzIGRlc2NyaWJlcyBpbiBieXRlcyByYXRoZXIgdGhhbiBiaXRzLiAgQSB2YWx1ZSBvZiB6ZXJvIGlzIHVzZWQKLSAgIHRvIGFuIGVsZW1lbnQgd2l0aCBzaXplIDIqKjMyLgotCi0gICBFTEVNT1JERVIgaXMgbm9uemVybyBpZiB0aGUgZWxlbWVudHMgYXJlIGluZGV4ZWQgaW4gaW5jcmVhc2luZyBvcmRlci4KLQotICAgSlVTVElGSUVEIGlmIHRoZSBlbGVtZW50cyBhcmUgbGVmdCBqdXN0aWZpZWQgdG8gaW5kZXggemVyby4KLQotICAgQVJSQVlMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuCi0KLSAgIElOREVYVFlQRSBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgdHlwZSB1c2VkIHRvIGluZGV4IHRoZSBhcnJheS4KLQotICAgRUxFTVRZUEUgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgZm9yIHRoZSBhcnJheSBlbGVtZW50cy4KLQotICAgRUxFTUxFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgKGluY2x1ZGluZwotICAgYW55IHBhZGRpbmcpLgotCi0gICBNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIHJlcHJlc2VudGVkIGJ5IEVMRU1UWVBFIHBvaW50aW5nIHRvCi0gICBhbm90aGVyIEROVFRfVFlQRV9BUlJBWS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfYXJyYXkKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgZGVjbGFyYXRpb246CTI7Ci0gIHVuc2lnbmVkIGludCBkeW5fbG93OgkJMjsKLSAgdW5zaWduZWQgaW50IGR5bl9oaWdoOgkyOwotICB1bnNpZ25lZCBpbnQgYXJyYXlpc2J5dGVzOgkxOwotICB1bnNpZ25lZCBpbnQgZWxlbWlzYnl0ZXM6CTE7Ci0gIHVuc2lnbmVkIGludCBlbGVtb3JkZXI6CTE7Ci0gIHVuc2lnbmVkIGludCBqdXN0aWZpZWQ6CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxMTsKLSAgdW5zaWduZWQgaW50IGFycmF5bGVuZ3RoOwotICBkbnR0cG9pbnRlciBpbmRleHR5cGU7Ci0gIGRudHRwb2ludGVyIGVsZW10eXBlOwotICB1bnNpZ25lZCBpbnQgZWxlbWxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9TVFJVQ1QKLQotICAgRE5UVF9UWVBFX1NUUlVDVCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgQyBzdHJ1Y3R1cmUuCi0KLSAgIERFQ0xBUkFUSU9OIGRlc2NyaWJlcyB0aGUgYml0cGFja2luZyB1c2VkLgotCi0gICBGSVJTVEZJRUxEIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgc3RydWN0dXJlCi0gICAoZWFjaCBmaWVsZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgZmllbGQsIHdhbGsgdGhlIGxpc3QKLSAgIHRvIGFjY2VzcyBhbGwgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmUpLgotCi0gICBWQVJUQUdGSUVMRCBhbmQgVkFSTElTVCBhcmUgdXNlZCBmb3IgUGFzY2FsIHZhcmlhbnQgcmVjb3Jkcy4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYml0cy4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGRlY2xhcmF0aW9uOgkyOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTk7Ci0gIGRudHRwb2ludGVyIGZpcnN0ZmllbGQ7Ci0gIGRudHRwb2ludGVyIHZhcnRhZ2ZpZWxkOwotICBkbnR0cG9pbnRlciB2YXJsaXN0OwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotLyogRE5UVF9UWVBFX1VOSU9OCi0KLSAgIEROVFRfVFlQRV9VTklPTiBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgQyB1bmlvbi4KLQotICAgRklSU1RGSUVMRCBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWVsZCBjaGFpbi4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSB1bmlvbiBpbiBiaXRzLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV91bmlvbgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMTsKLSAgZG50dHBvaW50ZXIgZmlyc3RmaWVsZDsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9GSUVMRAotCi0gICBETlRUX1RZUEVfRklFTEQgZGVzY3JpYmVzIG9uZSBmaWVsZCBpbiBhIHN0cnVjdHVyZSBvciB1bmlvbgotICAgb3IgQysrIGNsYXNzLgotCi0gICBWSVNJQklMSVRZIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZpZWxkCi0gICAoZm9yIGMrKy4gIHB1YmxpYyA9IDAsIHByb3RlY3RlZCA9IDEsIHByaXZhdGUgPSAyKS4KLQotICAgQV9VTklPTiBpcyBub256ZXJvIGlmIHRoaXMgZmllbGQgaXMgYSBtZW1iZXIgb2YgYW4gYW5vbnltb3VzIHVuaW9uLgotCi0gICBTVEFUSUNNRU0gaXMgbm9uemVybyBpZiB0aGlzIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciBvZiBhIHRlbXBsYXRlLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi0gICBCSVRPRkZTRVQgZ2l2ZXMgdGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkIGluIGJpdHMgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICBvZiB0aGUgc3RydWN0dXJlIG9yIHVuaW9uIHRoaXMgZmllbGQgaXMgYSBtZW1iZXIgb2YuCi0KLSAgIFRZUEUgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgZGVzY3JpYmluZyB0aGlzIGZpZWxkLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIHNpemUgb2YgdGhlIGVudHJ5IGluIGJpdHMuCi0KLSAgIE5FWFRGSUVMRCBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgY2hhaW4uICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZpZWxkCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IHZpc2liaWxpdHk6CTI7Ci0gIHVuc2lnbmVkIGludCBhX3VuaW9uOgkJMTsKLSAgdW5zaWduZWQgaW50IHN0YXRpY21lbToJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE3OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgdW5zaWduZWQgaW50IGJpdG9mZnNldDsKLSAgZG50dHBvaW50ZXIgdHlwZTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLSAgZG50dHBvaW50ZXIgbmV4dGZpZWxkOwotfTsKLQotLyogRE5UVF9UWVBFX1ZBUklBTlQgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfRklMRSBpcyB1bnVzZWQgYnkgR0RCLiAgKi8KLQotLyogRE5UVF9UWVBFX0ZVTkNUWVBFCi0KLSAgIEkgdGhpbmsgdGhpcyBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgZnVuY3Rpb24gdHlwZSAoZS5nLiwgd291bGQKLSAgIGJlIGVtaXR0ZWQgYXMgcGFydCBvZiBhIGZ1bmN0aW9uLXBvaW50ZXIgZGVzY3JpcHRpb24pLgotCi0gICBWQVJBUkdTIGlzIG5vbnplcm8gaWYgdGhpcyBmdW5jdGlvbiB1c2VzIHZhcmFyZ3MuCi0KLSAgIEZJUlNUUEFSQU0gaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBwYXJhbWV0ZXIKLSAgIGNoYWluLgotCi0gICBSRVRWQUwgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZnVuY3R5cGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6CQkxOwotICB1bnNpZ25lZCBpbnQgaW5mbzoJCTQ7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNjsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbTsKLSAgZG50dHBvaW50ZXIgcmV0dmFsOwotfTsKLQotLyogRE5UVF9UWVBFX1dJVEggaXMgZW1pdHRlZCBieSBDKysgdG8gaW5kaWNhdGUgIndpdGgiIHNjb3Bpbmcgc2VtYW50aWNzLgotICAgKFByb2JhYmx5IGFsc28gZW1pdHRlZCBieSBQQVNDQUwgdG8gc3VwcG9ydCAid2l0aCIuLi4pLgotICAgCi0gICBDKysgZXhhbXBsZTogU2F5ICJtZW1mdW5jIiBpcyBhIG1ldGhvZCBvZiBjbGFzcyAiYyIsIGFuZCBzYXkKLSAgICJtIiBpcyBhIGRhdGEgbWVtYmVyIG9mIGNsYXNzICJjIi4gVGhlbiBmcm9tIHdpdGhpbiAibWVtZnVuYyIsCi0gICBpdCBpcyBsZWdhbCB0byByZWZlcmVuY2UgIm0iIGRpcmVjdGx5IChlLmcuIHlvdSBkb24ndCBoYXZlIHRvCi0gICBzYXkgInRoaXMtPm0iLiBUaGUgc3ltYm9sIHRhYmxlIGluZGljYXRlcwotICAgdGhpcyBieSBlbWl0dGluZyBhIEROVFRfVFlQRV9XSVRIIHN5bWJvbCB3aXRoaW4gdGhlIGZ1bmN0aW9uICJtZW1mdW5jIiwKLSAgIHBvaW50aW5nIHRvIHRoZSB0eXBlIHN5bWJvbCBmb3IgY2xhc3MgImMiLgotIAotICAgSW4gR0RCLCB0aGlzIHN5bWJvbCByZWNvcmQgaXMgdW5uZWNlc3NhcnksIAotICAgYmVjYXVzZSBHREIncyBzeW1ib2wgbG9va3VwIGFsZ29yaXRobQotICAgaW5mZXJzIHRoZSAid2l0aCIgc2VtYW50aWNzIHdoZW4gaXQgc2VlcyBhICJ0aGlzIiBhcmd1bWVudCB0byB0aGUgbWVtYmVyCi0gICBmdW5jdGlvbi4gU28gR0RCIGNhbiBzYWZlbHkgaWdub3JlIHRoZSBETlRUX1RZUEVfV0lUSCByZWNvcmQuCi0KLSAgIEEgRE5UVF9UWVBFX1dJVEggaGFzIGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORCBzeW1ib2wgCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV93aXRoIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsgICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgICAvKiBhbHdheXMgRE5UVF9UWVBFX1dJVEggKi8KLSAgdW5zaWduZWQgaW50IGFkZHJ0eXBlOiAgCTI7ICAgIC8qIDAgPT4gU1RBVFRZUEUgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSA9PiBEWU5UWVBFICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyID0+IFJFR1RZUEUgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDogCTE7ICAgIC8qIDEgPT4gcG9pbnRlciB0byBvYmplY3QgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOiAgCTE7ICAgIC8qIDEgPT4gaW4gbG9uZyBwb2ludGVyIHNwYWNlICAgKi8KLSAgdW5zaWduZWQgaW50IG5lc3RsZXZlbDogCTY7ICAgIC8qICMgb2YgbmVzdGluZyBsZXZlbHMgYmFjayAgICAgKi8KLSAgdW5zaWduZWQgaW50IGRvY19yYW5nZXM6IAkxOyAgICAvKiAxID0+IGxvY2F0aW9uIGlzIHJhbmdlIGxpc3QgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgCTEwOwotICBsb25nIGxvY2F0aW9uOyAgICAgICAJCSAgICAgIC8qIHdoZXJlIHN0b3JlZCAoYWxsb2NhdGVkKSAgICAgKi8KLSAgc2x0cG9pbnRlciBhZGRyZXNzOwotICBkbnR0cG9pbnRlciB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG9mIHdpdGggZXhwcmVzc2lvbiAgICAgICovCi0gIHZ0cG9pbnRlciBuYW1lOyAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWUgb2Ygd2l0aCBleHByZXNzaW9uICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyAgb2Zmc2V0OyAgICAgICAgICAgICAgLyogYnl0ZSBvZmZzZXQgZnJvbSBsb2NhdGlvbiAgICAqLwotfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0vKiBETlRUX1RZUEVfQ09NTU9OIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBBIEROVFRfVFlQRV9DT01NT04gc3ltYm9sIG11c3QgaGF2ZSBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sICovCi0KLS8qIEROVFRfVFlQRV9DT0JTVFJVQ1QgaXMgdW5zdXBwb3J0ZWQgYnkgR0RCLiAgKi8KLS8qIEROVFRfVFlQRV9YUkVGIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfU0EgaXMgdW5zdXBwb3J0ZWQgYnkgR0RCLiAgKi8KLS8qIEROVFRfVFlQRV9NQUNSTyBpcyB1bnN1cHBvcnRlZCBieSBHREIgKi8KLQotLyogRE5UVF9UWVBFX0JMT0NLREFUQSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIEROVFRfVFlQRV9GVU5DVElPTiAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgQysrIHNwZWNpZmljIFNPTSByZWNvcmRzICovCi0KLS8qICBUaGUgcHVycG9zZSBvZiB0aGUgRE5UVF9UWVBFX0NMQVNTX1NDT1BFIGlzIHRvIGJyYWNrZXQgQysrIG1ldGhvZHMKLSAgICBhbmQgaW5kaWNhdGUgdGhlIG1ldGhvZCBuYW1lIGJlbG9uZ3MgaW4gdGhlICJjbGFzcyBzY29wZSIgcmF0aGVyCi0gICAgdGhhbiBpbiB0aGUgbW9kdWxlIHRoZXkgYXJlIGJlaW5nIGRlZmluZWQgaW4uIEZvciBleGFtcGxlOgotCi0gICAgY2xhc3MgYyB7Ci0gICAgLi4uCi0gICAgdm9pZCBtZW1mdW5jKCk7IC8vIG1lbWJlciBmdW5jdGlvbgotICAgIH07Ci0KLSAgICB2b2lkIGM6Om1lbWZ1bmMoKSAgIC8vIGRlZmluaXRpb24gb2YgY2xhc3MgYydzICJtZW1mdW5jIgotICAgIHsKLSAgICAuLi4KLSAgICB9Ci0KLSAgICBtYWluKCkKLSAgICB7Ci0gICAgLi4uCi0gICAgfQotCi0gICAgSW4gdGhlIGFib3ZlLCB0aGUgbmFtZSAibWVtZnVuYyIgaXMgbm90IGRpcmVjdGx5IHZpc2libGUgZnJvbSAibWFpbiIuCi0gICAgSS5lLiwgeW91IGhhdmUgdG8gc2F5ICJicmVhayBjOjptZW1mdW5jIi4KLSAgICBJZiBpdCB3ZXJlIGEgbm9ybWFsIGZ1bmN0aW9uIChub3QgYSBtZXRob2QpLCBpdCB3b3VsZCBiZSB2aXNpYmxlCi0gICAgdmlhIHRoZSBzaW1wbGUgImJyZWFrIG1lbWZ1bmMiLiBTaW5jZSAibWVtZnVuYyIgb3RoZXJ3aXNlIGxvb2tzCi0gICAgbGlrZSBhIG5vcm1hbCBGVU5DVElPTiBpbiB0aGUgc3ltYm9sIHRhYmxlLCB0aGUgYnJhY2tldGluZwotICAgIENMQVNTX1NDT1BFIGlzIHdoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSBpdCBpcyByZWFsbHkgYSBtZXRob2QuCi0gICAgCi0KLSAgIEEgRE5UVF9UWVBFX0NMQVNTX1NDT1BFIHN5bWJvbCBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5EIHN5bWJvbCAKLSovCi0KLXN0cnVjdCBkbnR0X3R5cGVfY2xhc3Nfc2NvcGUgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfQ0xBU1NfU0NPUEUgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDogICAgIDIxOyAKLSAgc2x0cG9pbnRlciBhZGRyZXNzICAgICAgICAgOyAgICAvKiBwb2ludGVyIHRvIFNMVCBlbnRyeSAqLwotICBkbnR0cG9pbnRlciB0eXBlICAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIHR5cGUgRE5UVCAqLwotfTsKLQotLyogQysrIHJlZmVyZW5jZSBwYXJhbWV0ZXIuCi0gICBUaGUgc3RydWN0dXJlIG9mIHRoaXMgcmVjb3JkIGlzIHRoZSBzYW1lIGFzIEROVFRfVFlQRV9QT0lOVEVSIC0gCi0gICByZWZlciB0byBzdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIuCi0gKi8KLQotLyogVGhlIG5leHQgdHdvIGRlc2NyaWJlIEMrKyBwb2ludGVyLXRvLWRhdGEtbWVtYmVyIHR5cGUsIGFuZCAKLSAgIHBvaW50ZXItdG8tbWVtYmVyLWZ1bmN0aW9uIHR5cGUsIHJlc3BlY3RpdmVseS4KLSAgIEROVFRfVFlQRV9QVFJNRU0gYW5kIEROVFRfVFlQRV9QVFJNRU1GVU5DIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlIAotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfcHRybWVtIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1BUUk1FTSAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgcG9pbnRzdG8JICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIEROVFQgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBtZW10eXBlIAkgICAgIDsgICAgIC8qIHR5cGUgb2YgbWVtYmVyICAgICAgICAgICAgICAgICovCi19OwotCi1zdHJ1Y3QgZG50dF90eXBlX3B0cm1lbWZ1bmMgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfUFRSTUVNRlVOQyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgcG9pbnRzdG8JICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIEROVFQgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBtZW10eXBlIAkgICAgIDsgICAgIC8qIHR5cGUgb2YgbWVtYmVyICAgICAgICAgICAgICAgICovCi19OwotCi0vKiBUaGUgRE5UVF9UWVBFX0NMQVNTIHN5bWJvbCBpcyBlbWl0dGVkIHRvIGRlc2NyaWJlIGEgY2xhc3MgdHlwZS4KLSAqICJtZW1iZXJsaXN0IiBwb2ludHMgdG8gYSBjaGFpbmVkIGxpc3Qgb2YgRklFTEQgb3IgR0VORklFTEQgcmVjb3JkcwotICogaW5kaWNhdGluZyB0aGUgY2xhc3MgbWVtYmVycy4gInBhcmVudGxpc3QiIHBvaW50cyB0byBhIGNoYWluZWQgbGlzdAotICogb2YgSU5IRVJJVEFOQ0UgcmVjb3JkcyBpbmRpY2F0aW5nIGNsYXNzZXMgZnJvbSB3aGljaCB3ZSBpbmhlcml0Ci0gKiBmaWVsZHMuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9jbGFzcyAKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOyAgICAgLyogYWx3YXlzIDAgKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9DTEFTUyAqLwotICB1bnNpZ25lZCBpbnQgYWJzdHJhY3Q6ICAgIDE7ICAgICAvKiBpcyB0aGlzIGFuIGFic3RyYWN0IGNsYXNzPyAgICAqLwotICB1bnNpZ25lZCBpbnQgY2xhc3NfZGVjbDogIDI7ICAgICAvKiAwPWNsYXNzLDE9dW5pb24sMj1zdHJ1Y3QgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZXhwYW5zaW9uOiAgIDE7ICAgICAvKiAxPXRlbXBsYXRlIGV4cGFuc2lvbiAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOiAgICAgMTc7ICAgICAKLSAgZG50dHBvaW50ZXIgbWVtYmVybGlzdCAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIFtHRU5dRklFTERzICovCi0gIHVuc2lnbmVkIGxvbmcgdnRibF9sb2MgICAgIDsgICAgIC8qIG9mZnNldCBpbiBvYmogb2YgcHRyIHRvIHZ0YmwgICovCi0gIGRudHRwb2ludGVyIHBhcmVudGxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBLX0lOSEVSSVRBTkNFIGxpc3QgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgYml0bGVuZ3RoICAgIDsgICAgIC8qIHRvdGFsIGF0IHRoaXMgbGV2ZWwgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIGlkZW50bGlzdCAgICAgIDsgICAgIC8qIHB0ciB0byBjaGFpbiBvZiBjbGFzcyBpZGVudCdzICovCi0gIGRudHRwb2ludGVyIGZyaWVuZGxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBLX0ZSSUVORCBsaXN0ICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHRlbXBsYXRlcHRyICAgIDsgICAgIC8qIHB0ciB0byB0ZW1wbGF0ZSAgICAgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIG5leHRleHAgICAgICAgIDsgICAgIC8qIHB0ciB0byBuZXh0IGV4cGFuc2lvbiAgICAgICAgICovCi19OwotCi0vKiBDbGFzcyBtZW1iZXJzIGFyZSBpbmRpY2F0ZWQgdmlhIGVpdGhlciB0aGUgRklFTEQgcmVjb3JkIChmb3IKLSAgIGRhdGEgbWVtYmVycywgc2FtZSBhcyBmb3IgQyBzdHJ1Y3QgZmllbGRzKSwgb3IgYnkgdGhlIEdFTkZJRUxEIHJlY29yZAotICAgKGZvciBtZW1iZXIgZnVuY3Rpb25zKS4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2dlbmZpZWxkIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0dFTkZJRUxEICovCi0gIHVuc2lnbmVkIGludCB2aXNpYmlsaXR5OiAgMjsgICAgIC8qIHB1YiA9IDAsIHByb3QgPSAxLCBwcml2ID0gMiAgICovCi0gIHVuc2lnbmVkIGludCBhX3VuaW9uOiAgICAgMTsgICAgIC8qIDEgPT4gYW5vbnltb3VzIHVuaW9uIG1lbWJlciAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE4OwotICBkbnR0cG9pbnRlciBmaWVsZAkgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gZmllbGQgb3IgcXVhbGlmaWVyICovCi0gIGRudHRwb2ludGVyIG5leHRmaWVsZCAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBmaWVsZCAgICAgICAgICovCi19OwotCi0vKiBDKysgdmlydHVhbCBmdW5jdGlvbnMgKi8KLQotc3RydWN0IGRudHRfdHlwZV92ZnVuYyB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9WRlVOQyAqLwotICB1bnNpZ25lZCBpbnQgcHVyZTogICAgICAgIDE7ICAgICAvKiBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gPyAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMDsKLSAgZG50dHBvaW50ZXIgZnVuY3B0ciAgICAgICAgOyAgICAgLyogcG9pbnRzIHRvIEZVTkNUSU9OIHN5bWJvbCAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyB2dGJsX29mZnNldCAgOyAgICAgLyogb2Zmc2V0IGludG8gdnRibCBmb3IgdmlydHVhbCAgKi8KLX07Ci0KLS8qIE5vdCBwcmVjaXNlbHkgc3VyZSB3aGF0IHRoaXMgaXMgaW50ZW5kZWQgZm9yIC0gRERFIGlnbm9yZXMgaXQgKi8KLQotc3RydWN0IGRudHRfdHlwZV9tZW1hY2Nlc3MgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfTUVNQUNDRVNTICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIxOwotICBkbnR0cG9pbnRlciBjbGFzc3B0cgkgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gYmFzZSBjbGFzcyAgICAgICAgICovCi0gIGRudHRwb2ludGVyIGZpZWxkICAgICAgICAgIDsgICAgIC8qIHBvaW50ZXIgZmllbGQgICAgICAgICAgICAgICAgICovCi19OwotCi0vKiBUaGUgRE5UVF9UWVBFX0lOSEVSSVRBTkNFIHJlY29yZCBkZXNjcmliZXMgZGVyaXZlZCBjbGFzc2VzLgotICogSW4gcGFydGljdWxhciwgdGhlICJwYXJlbnRsaXN0IiBmaWVsZCBvZiB0aGUgQ0xBU1MgcmVjb3JkIHBvaW50cwotICogdG8gYSBsaXN0IG9mIElOSEVSSVRBTkNFIHJlY29yZHMgZm9yIGNsYXNzZXMgZnJvbSB3aGljaCB3ZSAKLSAqIGluaGVyaXQgbWVtYmVycy4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2luaGVyaXRhbmNlIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0lOSEVSSVRBTkNFICovCi0gIHVuc2lnbmVkIGludCBWaXJ0dWFsOiAgICAgMTsgICAgIC8qIHZpcnR1YWwgYmFzZSBjbGFzcyA/ICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCB2aXNpYmlsaXR5OiAgMjsgICAgIC8qIHB1YiA9IDAsIHByb3QgPSAxLCBwcml2ID0gMiAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE4OwotICBkbnR0cG9pbnRlciBjbGFzc25hbWUgICAgICA7ICAgICAvKiBmaXJzdCBwYXJlbnQgY2xhc3MsIGlmIGFueSAgICAqLwotICB1bnNpZ25lZCBsb25nIG9mZnNldCAgICAgICA7ICAgICAvKiBvZmZzZXQgdG8gc3RhcnQgb2YgYmFzZSBjbGFzcyAqLwotICBkbnR0cG9pbnRlciBuZXh0ICAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIG5leHQgS19JTkhFUklUQU5DRSAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZVsyXSAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogQysrICJmcmllbmQiIGNsYXNzZXMgLi4uICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZnJpZW5kX2NsYXNzIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0ZSSUVORF9DTEFTUyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgY2xhc3NwdHIgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogbmV4dCBETlRUX0ZSSUVORCAgICAgICAgICAgICAgKi8KLX07Ci0KLXN0cnVjdCBkbnR0X3R5cGVfZnJpZW5kX2Z1bmMgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfRlJJRU5EX0ZVTkMgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIGZ1bmNwdHIgICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gZnVuY3Rpb24gICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIGNsYXNzcHRyICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gY2xhc3MgRE5UVCAgICAgICAgICovCi0gIGRudHRwb2ludGVyIG5leHQgICAgICAgICAgIDsgICAgIC8qIG5leHQgRE5UVF9GUklFTkQgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgZnV0dXJlWzJdICAgIDsgICAgIC8qIHBhZGRpbmcgdG8gMy13b3JkIGJsb2NrIGVuZCAgICovCi19OwotCi0vKiBEREUgYXBwZWFycyB0byBpZ25vcmUgdGhlIEROVFRfVFlQRV9NT0RJRklFUiByZWNvcmQuCi0gKiBJdCBjb3VsZCBwZXJoYXBzIGJlIHVzZWQgdG8gZ2l2ZSBiZXR0ZXIgInB0eXBlIiBvdXRwdXQgaW4gR0RCOwotICogb3RoZXJ3aXNlIGl0IGlzIHByb2JhYmx5IHNhZmUgZm9yIEdEQiB0byBpZ25vcmUgaXQgYWxzby4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX21vZGlmaWVyIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX01PRElGSUVSICovCi0gIHVuc2lnbmVkIGludCBtX2NvbnN0OiAgICAgMTsgICAgIC8qIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBtX3N0YXRpYzogICAgMTsgICAgIC8qIHN0YXRpYyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBtX3ZvaWQ6ICAgICAgMTsgICAgIC8qIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBtX3ZvbGF0aWxlOiAgMTsgICAgIC8qIHZvbGF0aWxlICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBtX2R1cGxpY2F0ZTogMTsgICAgIC8qIGR1cGxpY2F0ZSAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE2OwotICBkbnR0cG9pbnRlciB0eXBlICAgICAgICAgICA7ICAgICAvKiBzdWJ0eXBlICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZSAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhpcyB3YXMgaW50ZW5kZWQgZm9yIC0gRERFIGlnbm9yZXMgaXQgKi8KLQotc3RydWN0IGRudHRfdHlwZV9vYmplY3RfaWQgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfT0JKRUNUX0lEICovCi0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDogICAgMTsgICAgIC8qIElzIG9iamVjdF9pZGVudCBhZGRyIG9mIGFkZHI/ICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIwOwotICB1bnNpZ25lZCBsb25nIG9iamVjdF9pZGVudCA7ICAgICAvKiBvYmplY3QgaWRlbnRpZmllciAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIG9mZnNldCAgICAgICA7ICAgICAvKiBvZmZzZXQgdG8gc3RhcnQgb2YgYmFzZSBjbGFzcyAqLwotICBkbnR0cG9pbnRlciBuZXh0ICAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIG5leHQgS19PQkpFQ1RfSUQgICAqLwotICB1bnNpZ25lZCBsb25nIHNlZ29mZnNldCAgICA7ICAgICAvKiBmb3IgbGlua2VyIGZpeHVwICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZSAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogTm8gc2VwYXJhdGUgZG50dF90eXBlX21lbWZ1bmM7IHNhbWUgYXMgZG50dF90eXBlX2Z1bmMgKi8KLQotLyogU3ltYm9sIHJlY29yZHMgdG8gc3VwcG9ydCB0ZW1wbGF0ZXMuIFRoZXNlIG9ubHkgZ2V0IHVzZWQKLSAqIGluIERERSdzICJkZXNjcmliZSIgb3V0cHV0IChsaWtlIEdEQidzICJwdHlwZSIpLgotICovCi0KLS8qIFRoZSBURU1QTEFURSByZWNvcmQgaXMgdGhlIGhlYWRlciBmb3IgYSB0ZW1wbGF0ZS1jbGFzcy4KLSAqIExpa2UgdGhlIENMQVNTIHJlY29yZCwgYSBURU1QTEFURSByZWNvcmQgaGFzIGEgbWVtYmVybGlzdCB0aGF0Ci0gKiBwb2ludHMgdG8gYSBsaXN0IG9mIHRlbXBsYXRlIG1lbWJlcnMuIEl0IGFsc28gaGFzIGFuIGFyZ2xpc3QKLSAqIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBURU1QTEFURV9BUkcgcmVjb3Jkcy4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3RlbXBsYXRlIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1RFTVBMQVRFICovCi0gIHVuc2lnbmVkIGludCBhYnN0cmFjdDogICAgMTsgICAgIC8qIGlzIHRoaXMgYW4gYWJzdHJhY3QgY2xhc3M/ICAgICovCi0gIHVuc2lnbmVkIGludCBjbGFzc19kZWNsOiAgMjsgICAgIC8qIDA9Y2xhc3MsMT11bmlvbiwyPXN0cnVjdCAgICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE4OwotICBkbnR0cG9pbnRlciBtZW1iZXJsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gY2hhaW4gb2YgS19bR0VOXUZJRUxEcyAqLwotICBsb25nIHVudXNlZDIgICAgICAgICAgICAgICA7ICAgICAvKiBvZmZzZXQgaW4gb2JqIG9mIHB0ciB0byB2dGJsICAqLwotICBkbnR0cG9pbnRlciBwYXJlbnRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19JTkhFUklUQU5DRSBsaXN0ICAgICAqLwotICB1bnNpZ25lZCBsb25nIGJpdGxlbmd0aCAgICA7ICAgICAvKiB0b3RhbCBhdCB0aGlzIGxldmVsICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBpZGVudGxpc3QgICAgICA7ICAgICAvKiBwdHIgdG8gY2hhaW4gb2YgY2xhc3MgaWRlbnQncyAqLwotICBkbnR0cG9pbnRlciBmcmllbmRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19GUklFTkQgbGlzdCAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBhcmdsaXN0ICAgICAgICA7ICAgICAvKiBwdHIgdG8gYXJndW1lbnQgbGlzdCAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBleHBhbnNpb25zICAgICA7ICAgICAvKiBwdHIgdG8gZXhwYW5zaW9uIGxpc3QgICAgICAgICAqLwotfTsKLQotLyogVGVtcGxhdGUtY2xhc3MgYXJndW1lbnRzIGFyZSBhIGxpc3Qgb2YgVEVNUExfQVJHIHJlY29yZHMKLSAqIGNoYWluZWQgdG9nZXRoZXIuIFRoZSAibmFtZSIgZmllbGQgaXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hbC4KLSAqIEUuZy46Ci0gKiB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgcSB7IC4uLiB9OwotICogVGhlbiAiVCIgaXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hbCBhcmd1bWVudC4KLSAqLwotc3RydWN0IGRudHRfdHlwZV90ZW1wbF9hcmcgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfVEVNUExfQVJHICovCi0gIHVuc2lnbmVkIGludCB1c2FnZXR5cGU6ICAgMTsgICAgIC8qIDAgdHlwZS1uYW1lIDEgZXhwcmVzc2lvbiAgICAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjA7Ci0gIHZ0cG9pbnRlciBuYW1lICAgICAgICAgICAgIDsgICAgIC8qIG5hbWUgb2YgYXJndW1lbnQgICAgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgdHlwZSAgICAgICAgICAgOyAgICAgLyogZm9yIG5vbiB0eXBlIGFyZ3VtZW50cyAgICAgICAqLwotICBkbnR0cG9pbnRlciBuZXh0YXJnICAgICAgICA7ICAgICAvKiBOZXh0IGFyZ3VtZW50IGlmIGFueSAgICAgICAgICovCi0gIGxvbmcgZnV0dXJlWzJdICAgICAgICAgICAgIDsgICAgIC8qIHBhZGRpbmcgdG8gMy13b3JkIGJsb2NrIGVuZCAgKi8KLX07Ci0KLS8qIEZVTkNfVEVNUExBVEUgcmVjb3JkcyBhcmUgc29ydCBvZiBsaWtlIEZVTkNUSU9OLCBidXQgYXJlIGVtaXR0ZWQKLSAqIGZvciB0ZW1wbGF0ZSBtZW1iZXIgZnVuY3Rpb25zLiBFLmcuLAotICogdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHEgeyAKLSAgICAgIC4uLgotICAgICAgdm9pZCBmKCk7Ci0gICAgICAuLi4gCi0gICB9OwotICogV2l0aGluIHRoZSBsaXN0IG9mIEZJRUxEcy9HRU5GSUVMRHMgZGVmaW5pbmcgdGhlIG1lbWJlciBsaXN0Ci0gKiBvZiB0aGUgdGVtcGxhdGUgInEiLCAiZiIgd291bGQgYXBwZWFyIGFzIGEgRlVOQ19URU1QTEFURS4KLSAqIFdlJ2xsIGFsc28gc2VlIGluc3RhbmNlcyBvZiBGVU5DVElPTiAiZiIgcmVjb3JkcyBmb3IgZWFjaCAKLSAqIGluc3RhbnRpYXRpb24gb2YgdGhlIHRlbXBsYXRlLgotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZnVuY190ZW1wbGF0ZSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9GVU5DX1RFTVBMQVRFICovCi0gIHVuc2lnbmVkIGludCBwdWJsaWM6ICAgICAgMTsgICAgIC8qIDEgPT4gZ2xvYmFsbHkgdmlzaWJsZSAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOiAgICA0OyAgICAgLyogdHlwZSBvZiBsYW5ndWFnZSAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbGV2ZWw6ICAgICAgIDU7ICAgICAvKiBuZXN0aW5nIGxldmVsICh0b3AgbGV2ZWwgPSAwKSovCi0gIHVuc2lnbmVkIGludCBvcHRpbWl6ZTogICAgMjsgICAgIC8qIGxldmVsIG9mIG9wdGltaXphdGlvbiAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6ICAgICAxOyAgICAgLyogZWxsaXBzZXMuICBQYXNjYWwvODAwIGxhdGVyICAqLyAKLSAgdW5zaWduZWQgaW50IGluZm86ICAgICAgICA0OyAgICAgLyogbGFuZy1zcGVjaWZpYyBzdHVmZjsgRl94eHh4ICAqLwotICB1bnNpZ25lZCBpbnQgaW5saW5lZDogICAgIDE7Ci0gIHVuc2lnbmVkIGludCBsb2NhbGxvYzogICAgMTsgICAgIC8qIDAgYXQgdG9wLCAxIGF0IGVuZCBvZiBibG9jayAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDogICAgICAyOwotICB2dHBvaW50ZXIgbmFtZSAgICAgICAgICAgICA7ICAgICAvKiBuYW1lIG9mIGZ1bmN0aW9uICAgICAgICAgICAgICovCi0gIHZ0cG9pbnRlciBhbGlhcyAgICAgICAgICAgIDsgICAgIC8qIGFsdGVybmF0ZSBuYW1lLCBpZiBhbnkgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbSAgICAgOyAgICAgLyogZmlyc3QgRlBBUkFNLCBpZiBhbnkgICAgICAgICAqLwotICBkbnR0cG9pbnRlciByZXR2YWwgICAgICAgICA7ICAgICAvKiByZXR1cm4gdHlwZSwgaWYgYW55ICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIGFyZ2xpc3QgICAgICAgIDsgICAgIC8qIHB0ciB0byBhcmd1bWVudCBsaXN0ICAgICAgICAgKi8KLX07Ci0KLS8qIExJTksgaXMgYXBwYXJlbnRseSBpbnRlbmRlZCB0byBsaW5rIHRvZ2V0aGVyIGZ1bmN0aW9uIHRlbXBsYXRlCi0gKiBkZWZpbml0aW9ucyB3aXRoIHRoZWlyIGluc3RhbnRpYXRpb25zLiBIb3dldmVyLCBpdCBpcyBub3QgY2xlYXIKLSAqIHdoeSB0aGlzIHdvdWxkIGJlIG5lZWRlZCwgZXhjZXB0IHRvIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIG9uCi0gKiBhICJwdHlwZSIgY29tbWFuZC4gQW5kIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBhQ0MgZG9lcyBub3QgCi0gKiBnZW5lcmF0ZSB0aGlzIHJlY29yZC4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2xpbmsgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfTElOSyAqLwotICB1bnNpZ25lZCBpbnQgbGlua0tpbmQ6ICAgIDQ7ICAgICAvKiBhbHdheXMgTElOS19VTktOT1dOICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE3OwotICBsb25nIGZ1dHVyZTEgICAgICAgICAgICAgICA7ICAgICAvKiBleHBhbnNpb24gICAgICAgICAgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHB0cjEgICAgICAgICAgIDsgICAgIC8qIGxpbmsgZnJvbSB0ZW1wbGF0ZSAgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgcHRyMiAgICAgICAgICAgOyAgICAgLyogdG8gZXhwYW5zaW9uICAgICAgICAgICAgICAgICAqLwotICBsb25nIGZ1dHVyZVsyXSAgICAgICAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICovCi19OwotCi0vKiBlbmQgb2YgQysrIHNwZWNpZmljIFNPTSdzICovCi0KLS8qIEROVFRfVFlQRV9EWU5fQVJSQVlfREVTQyBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfREVTQ19TVUJSQU5HRSBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfQkVHSU5fRVhUIGlzIHVudXNlZCBieSBHREIgKi8KLS8qIEROVFRfVFlQRV9JTkxOIGlzIHVudXNlZCBieSBHREIgKi8KLS8qIEROVFRfVFlQRV9JTkxOX0xJU1QgaXMgdW51c2VkIGJ5IEdEQiAqLwotLyogRE5UVF9UWVBFX0FMSUFTIGlzIHVudXNlZCBieSBHREIgKi8KLQotc3RydWN0IGRudHRfdHlwZV9kb2NfZnVuY3Rpb24gewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAxOyAgIC8qIGFsd2F5cyB6ZXJvICAgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAxMDsgICAvKiBLX0RPQ19GVU5DVElPTiBvciAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogS19ET0NfTUVNRlVOQyAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOiAgICAxOyAgIC8qIDEgPT4gZ2xvYmFsbHkgdmlzaWJsZSAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOiAgNDsgICAvKiB0eXBlIG9mIGxhbmd1YWdlICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsZXZlbDogICAgIDU7ICAgLyogbmVzdGluZyBsZXZlbCAodG9wIGxldmVsID0gMCkqLwotICB1bnNpZ25lZCBpbnQgb3B0aW1pemU6ICAyOyAgIC8qIGxldmVsIG9mIG9wdGltaXphdGlvbiAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6ICAgMTsgICAvKiBlbGxpcHNlcy4gIFBhc2NhbC84MDAgbGF0ZXIgICovCi0gIHVuc2lnbmVkIGludCBpbmZvOiAgICAgIDQ7ICAgLyogbGFuZy1zcGVjaWZpYyBzdHVmZjsgRl94eHh4ICAqLwotICB1bnNpZ25lZCBpbnQgaW5saW5lZDogICAxOwotICB1bnNpZ25lZCBpbnQgbG9jYWxsb2M6ICAxOyAgIC8qIDAgYXQgdG9wLCAxIGF0IGVuZCBvZiBibG9jayAgKi8KLSAgdW5zaWduZWQgaW50IGV4cGFuc2lvbjogMTsgICAvKiAxID0gZnVuY3Rpb24gZXhwYW5zaW9uICAgICAgICovCi0gIHVuc2lnbmVkIGludCBkb2NfY2xvbmU6IDE7Ci0gIHZ0cG9pbnRlciBuYW1lOyAgICAgICAgICAgICAgLyogbmFtZSBvZiBmdW5jdGlvbiAgICAgICAgICAgICAqLwotICB2dHBvaW50ZXIgYWxpYXM7ICAgICAgICAgICAgIC8qIGFsdGVybmF0ZSBuYW1lLCBpZiBhbnkgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbTsgICAgICAvKiBmaXJzdCBGUEFSQU0sIGlmIGFueSAgICAgICAgICovCi0gIHNsdHBvaW50ZXIgYWRkcmVzczsgICAgICAgICAgLyogY29kZSBhbmQgdGV4dCBsb2NhdGlvbnMgICAgICAqLwotICBDT1JFX0FERFIgZW50cnlhZGRyOyAgICAgICAgIC8qIGFkZHJlc3Mgb2YgZW50cnkgcG9pbnQgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgcmV0dmFsOyAgICAgICAgICAvKiByZXR1cm4gdHlwZSwgaWYgYW55ICAgICAgICAgICovCi0gIENPUkVfQUREUiBsb3dhZGRyOyAgICAgICAgICAgLyogbG93ZXN0IGFkZHJlc3Mgb2YgZnVuY3Rpb24gICAqLwotICBDT1JFX0FERFIgaGlhZGRyOyAgICAgICAgICAgIC8qIGhpZ2hlc3QgYWRkcmVzcyBvZiBmdW5jdGlvbiAgKi8KLSAgZG50dHBvaW50ZXIgaW5saW5lX2xpc3Q7ICAgICAvKiBwb2ludGVyIHRvIGZpcnN0IGlubGluZSAgICAqLwotICBsdHBvaW50ZXIgbHRfb2Zmc2V0OyAgICAgICAgIC8qIHN0YXJ0IG9mIGZyYWcvY3AgbGluZSB0YWJsZSAgKi8KLSAgY3R4dHBvaW50ZXIgY3R4dF9vZmZzZXQ7ICAgICAvKiBzdGFydCBvZiBjb250ZXh0IHRhYmxlIGZvciB0aGlzIHJvdXRpbmUgKi8KLX07Ci0KLS8qIEROVFRfVFlQRV9ET0NfTUVNRlVOQyBpcyB1bnVzZWQgYnkgR0RCICovCi0KLS8qIEROVFRfVFlQRV9HRU5FUklDIGFuZCBETlRUX1RZUEVfQkxPQ0sgYXJlIGNvbnZpZW5jZSBzdHJ1Y3R1cmVzCi0gICBzbyB3ZSBjYW4gZXhhbWluZSBhIEROVFQgZW50cnkgaW4gYSBnZW5lcmljIGZhc2hpb24uICAqLwotc3RydWN0IGRudHRfdHlwZV9nZW5lcmljCi17Ci0gIHVuc2lnbmVkIGludCB3b3JkWzldOwotfTsKLQotc3RydWN0IGRudHRfdHlwZV9ibG9jawotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgICAgICAxMDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICB1bnNpZ25lZCBpbnQgd29yZFsyXTsKLX07Ci0KLS8qIE9uZSBlbnRyeSBpbiBhIEROVFQgKGVpdGhlciB0aGUgTE5UVCBvciBHTlRUKS4gIAotICogVGhpcyBpcyBhIHVuaW9uIG9mIHRoZSBhYm92ZSA2MCBvciBzbyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCi0gKi8KLXVuaW9uIGRudHRlbnRyeQotewotICBzdHJ1Y3QgZG50dF90eXBlX3NyY2ZpbGUgZHNmaWxlOwotICBzdHJ1Y3QgZG50dF90eXBlX21vZHVsZSBkbW9kdWxlOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uIGRmdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uIGRlbnRyeTsKLSAgc3RydWN0IGRudHRfdHlwZV9iZWdpbiBkYmVnaW47Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZW5kIGRlbmQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZnBhcmFtIGRmcGFyYW07Ci0gIHN0cnVjdCBkbnR0X3R5cGVfc3ZhciBkc3ZhcjsKLSAgc3RydWN0IGRudHRfdHlwZV9kdmFyIGRkdmFyOwotICBzdHJ1Y3QgZG50dF90eXBlX2NvbnN0IGRjb25zdDsKLSAgc3RydWN0IGRudHRfdHlwZV90eXBlIGR0eXBlOwotICBzdHJ1Y3QgZG50dF90eXBlX3R5cGUgZHRhZzsKLSAgc3RydWN0IGRudHRfdHlwZV9wb2ludGVyIGRwdHI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZW51bSBkZW51bTsKLSAgc3RydWN0IGRudHRfdHlwZV9tZW1lbnVtIGRtZW1iZXI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfc2V0IGRzZXQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfc3VicmFuZ2UgZHN1YnI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfYXJyYXkgZGFycmF5OwotICBzdHJ1Y3QgZG50dF90eXBlX3N0cnVjdCBkc3RydWN0OwotICBzdHJ1Y3QgZG50dF90eXBlX3VuaW9uIGR1bmlvbjsKLSAgc3RydWN0IGRudHRfdHlwZV9maWVsZCBkZmllbGQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZnVuY3R5cGUgZGZ1bmN0eXBlOwotICBzdHJ1Y3QgZG50dF90eXBlX3dpdGggZHdpdGg7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZnVuY3Rpb24gZGJsb2NrZGF0YTsKLSAgc3RydWN0IGRudHRfdHlwZV9jbGFzc19zY29wZSBkY2xhc3Nfc2NvcGU7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfcG9pbnRlciBkcmVmZXJlbmNlOwotICBzdHJ1Y3QgZG50dF90eXBlX3B0cm1lbSBkcHRybWVtOwotICBzdHJ1Y3QgZG50dF90eXBlX3B0cm1lbWZ1bmMgZHB0cm1lbWZ1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfY2xhc3MgZGNsYXNzOwotICBzdHJ1Y3QgZG50dF90eXBlX2dlbmZpZWxkIGRnZW5maWVsZDsKLSAgc3RydWN0IGRudHRfdHlwZV92ZnVuYyBkdmZ1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbWVtYWNjZXNzIGRtZW1hY2Nlc3M7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfaW5oZXJpdGFuY2UgZGluaGVyaXRhbmNlOwotICBzdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9jbGFzcyBkZnJpZW5kX2NsYXNzOwotICBzdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9mdW5jIGRmcmllbmRfZnVuYzsKLSAgc3RydWN0IGRudHRfdHlwZV9tb2RpZmllciBkbW9kaWZpZXI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfb2JqZWN0X2lkIGRvYmplY3RfaWQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfdGVtcGxhdGUgZHRlbXBsYXRlOwotICBzdHJ1Y3QgZG50dF90eXBlX3RlbXBsX2FyZyBkdGVtcGxfYXJnOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmNfdGVtcGxhdGUgZGZ1bmNfdGVtcGxhdGU7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbGluayBkbGluazsKLSAgc3RydWN0IGRudHRfdHlwZV9kb2NfZnVuY3Rpb24gZGRvY2Z1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZ2VuZXJpYyBkZ2VuZXJpYzsKLSAgc3RydWN0IGRudHRfdHlwZV9ibG9jayBkYmxvY2s7Ci19OwotCi0vKiBTb3VyY2UgbGluZSBlbnRyeSB0eXBlcy4gICovCi1lbnVtIHNsdHR5cGUKLXsKLSAgU0xUX05PUk1BTCwKLSAgU0xUX1NSQ0ZJTEUsCi0gIFNMVF9NT0RVTEUsCi0gIFNMVF9GVU5DVElPTiwKLSAgU0xUX0VOVFJZLAotICBTTFRfQkVHSU4sCi0gIFNMVF9FTkQsCi0gIFNMVF9XSVRILAotICBTTFRfRVhJVCwKLSAgU0xUX0FTU0lTVCwKLSAgU0xUX01BUktFUiwKLSAgU0xUX0NMQVNTX1NDT1BFLAotICBTTFRfSU5MTiwKLSAgU0xUX05PUk1BTF9PRkZTRVQsCi19OwotCi0vKiBBIG5vcm1hbCBzb3VyY2UgbGluZSBlbnRyeS4gIFNpbXBseSBwcm92aWRlcyBhIG1hcHBpbmcgb2YgYSBzb3VyY2UKLSAgIGxpbmUgbnVtYmVyIHRvIGEgY29kZSBhZGRyZXNzLgotCi0gICBTTFRERVNDIHdpbGwgYWx3YXlzIGJlIFNMVF9OT1JNQUwgb3IgU0xUX0VYSVQuICAqLwotCi1zdHJ1Y3Qgc2x0X25vcm1hbAotewotICB1bnNpZ25lZCBpbnQgc2x0ZGVzYzoJNDsKLSAgdW5zaWduZWQgaW50IGxpbmU6CTI4OwotICBDT1JFX0FERFIgYWRkcmVzczsKLX07Ci0KLXN0cnVjdCBzbHRfbm9ybWFsX29mZgotewotICB1bnNpZ25lZCBpbnQgc2x0ZGVzYzoJNDsKLSAgdW5zaWduZWQgaW50IG9mZnNldDoJNjsKLSAgdW5zaWduZWQgaW50IGxpbmU6CTIyOwotICBDT1JFX0FERFIgYWRkcmVzczsKLX07Ci0KLS8qIEEgc3BlY2lhbCBzb3VyY2UgbGluZSBlbnRyeS4gIFByb3ZpZGVzIGEgbWFwcGluZyBvZiBhIGRlY2xhcmF0aW9uCi0gICB0byBhIGxpbmUgbnVtYmVyLiAgVGhlc2UgZW50cmllcyBwb2ludCBiYWNrIGludG8gdGhlIEROVFQgd2hpY2gKLSAgIHJlZmVyZW5jZXMgdGhlbS4gICovCi0KLXN0cnVjdCBzbHRfc3BlY2lhbAotewotICB1bnNpZ25lZCBpbnQgc2x0ZGVzYzoJNDsKLSAgdW5zaWduZWQgaW50IGxpbmU6CTI4OwotICBkbnR0cG9pbnRlciBiYWNrcHRyOwotfTsKLQotLyogVXNlZCB0byBkZXNjcmliZSBuZXN0aW5nLgotCi0gICBGb3IgbmVzdGVkIGxhbmd1YWdlcywgYW4gc2x0X2Fzc2lzdCBlbnRyeSBtdXN0IGZvbGxvdyBlYWNoIFNMVF9GVU5DCi0gICBlbnRyeSBpbiB0aGUgU0xULiAgVGhlIGFkZHJlc3MgZmllbGQgd2lsbCBwb2ludCBmb3J3YXJkIHRvIHRoZQotICAgZmlyc3Qgc2x0X25vcm1hbCBlbnRyeSB3aXRoaW4gdGhlIGZ1bmN0aW9uJ3Mgc2NvcGUuICAqLwotCi1zdHJ1Y3Qgc2x0X2Fzc2lzdAotewotICB1bnNpZ25lZCBpbnQgc2x0ZGVzYzoJNDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJMjg7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLX07Ci0KLXN0cnVjdCBzbHRfZ2VuZXJpYwotewotICB1bnNpZ25lZCBpbnQgd29yZFsyXTsKLX07Ci0KLXVuaW9uIHNsdGVudHJ5Ci17Ci0gIHN0cnVjdCBzbHRfbm9ybWFsIHNub3JtOwotICBzdHJ1Y3Qgc2x0X25vcm1hbF9vZmYgc25vcm1vZmY7Ci0gIHN0cnVjdCBzbHRfc3BlY2lhbCBzc3BlYzsKLSAgc3RydWN0IHNsdF9hc3Npc3Qgc2Fzc3Q7Ci0gIHN0cnVjdCBzbHRfZ2VuZXJpYyBzZ2VuZXJpYzsKLX07Ci0KLS8qICAkTElORVMkIGRlY2xhcmF0aW9ucwotICogIFRoaXMgaXMgdGhlIGxpbmUgdGFibGUgdXNlZCBmb3Igb3B0aW1pemVkIGNvZGUsIHdoaWNoIGlzIG9ubHkgcHJlc2VudCAKLSAqICBpbiB0aGUgbmV3ICRQUk9HUkFNX0lORk8kIGRlYnVnIHNwYWNlLiAgCi0gKi8KLQotI2RlZmluZSBEU1RfTE5fRVNDQVBFX0ZMQUcxICAgMTUKLSNkZWZpbmUgRFNUX0xOX0VTQ0FQRV9GTEFHMiAgIDE0Ci0jZGVmaW5lIERTVF9MTl9DVFhfU1BFQzEgICAgICAxMyAgCi0jZGVmaW5lIERTVF9MTl9DVFhfU1BFQzIgICAgICAxMgotCi0vKgotICBFc2NhcGUgZnVuY3Rpb24gY29kZXM6Ci0qLwotdHlwZWRlZiBlbnVtCi0gICAgewotICAgIGRzdF9sbl9wYWQsICAgICAgICAgIC8qIHBhZCBieXRlICovCi0gICAgZHN0X2xuX2VzY2FwZV8xLCAgICAgLyogcmVzZXJ2ZWQgKi8KLSAgICBkc3RfbG5fZHBjMV9kbG4xLCAgICAvKiAxIGJ5dGUgbGluZSBkZWx0YSwgMSBieXRlIHBjIGRlbHRhICovCi0gICAgZHN0X2xuX2RwYzJfZGxuMiwgICAgLyogMiBieXRlcyBsaW5lIGRlbHRhLCAyIGJ5dGVzIHBjIGRlbHRhICovCi0gICAgZHN0X2xuX3BjNF9sbjQsICAgICAgLyogNCBieXRlcyBBQlNPTFVURSBsaW5lIG51bWJlciwgNCBieXRlcyBBQlNPTFVURSBwYyAqLwotICAgIGRzdF9sbl9kcGMwX2RsbjEsICAgIC8qIDEgYnl0ZSBsaW5lIGRlbHRhLCBwYyBkZWx0YSA9IDAgKi8KLSAgICBkc3RfbG5fbG5fb2ZmXzEsICAgICAvKiBzdGF0ZW1lbnQgZXNjYXBlLCBzdG10ICMgPSAxICgybmQgc3RtdCBvbiBsaW5lKSAqLwotICAgIGRzdF9sbl9sbl9vZmYsICAgICAgIC8qIHN0YXRlbWVudCBlc2NhcGUsIHN0bXQgIyA9IG5leHQgYnl0ZSAqLwotICAgIGRzdF9sbl9lbnRyeSwgICAgICAgIC8qIGVudHJ5IGVzY2FwZSwgbmV4dCBieXRlIGlzIGVudHJ5IG51bWJlciAqLwotICAgIGRzdF9sbl9leGl0LCAgICAgICAgIC8qIGV4aXQgZXNjYXBlICovCi0gICAgZHN0X2xuX3N0bXRfZW5kLCAgICAgLyogZ2FwIGVzY2FwZSwgNCBieXRlcyBwYyBkZWx0YSAqLwotICAgIGRzdF9sbl9zdG10X2NwLCAgICAgIC8qIGN1cnJlbnQgc3RtdCBpcyBhIGNyaXRpY2FsIHBvaW50ICovCi0gICAgZHN0X2xuX2VzY2FwZV8xMiwgICAgLyogcmVzZXJ2ZWQgKi8KLSAgICBkc3RfbG5fZXNjYXBlXzEzLCAgICAvKiB0aGlzIGlzIGFuIGV4Y2VwdGlvbiBzaXRlIHJlY29yZCAqLwotICAgIGRzdF9sbl9ueHRfYnl0ZSwgICAgIC8qIG5leHQgYnl0ZSBjb250YWlucyB0aGUgcmVhbCBlc2NhcGUgY29kZSAqLwotICAgIGRzdF9sbl9lbmQsICAgICAgICAgIC8qIGVuZCBlc2NhcGUsIGZpbmFsIGVudHJ5IGZvbGxvd3MgKi8KLSAgICBkc3RfbG5fZXNjYXBlMV9FTkRfT0ZfRU5VTQotICAgIH0KLSAgICBkc3RfbG5fZXNjYXBlMV90OwotCi10eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgZHN0X2xuX2N0eF8xLCAgICAgICAgLyogbmV4dCBieXRlIGRlc2NyaWJlcyBjb250ZXh0IHN3aXRjaCB3aXRoIDUtYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW50byB0aGUgaW1hZ2UgdGFibGUgYW5kIDMtYml0IHJ1biBsZW5ndGguICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgcnVuIGxlbmd0aCBpcyAwLCBlbmQgd2l0aCBhbm90aGVyIGN4dCBzcGVjaWZpZXIgb3IgY3R4X2VuZCAqLwotICAgIGRzdF9sbl9jdHhfMiwgICAgICAgIC8qIG5leHQgMiBieXRlcyBzd2l0Y2ggY29udGV4dDogMTMgYml0IGluZGV4LCAzIGJpdCBydW4gbGVuZ3RoICovCi0gICAgZHN0X2xuX2N0eF80LCAgICAgICAgLyogbmV4dCA0IGJ5dGVzIHN3aXRjaCBjb250ZXh0OiAyOSBiaXQgaW5kZXgsIDMgYml0IHJ1biBsZW5ndGggKi8KLSAgICBkc3RfbG5fY3R4X2VuZCwgICAgICAvKiBlbmQgY3VycmVudCBjb250ZXh0ICovCi0gICAgZHN0X2xuX2NvbF9ydW5fMSwgICAgLyogbmV4dCBieXRlIGlzIGNvbHVtbiBwb3NpdGlvbiBvZiBzdGFydCBvZiBuZXh0IHN0YXRlbWVudCwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb2xsb3dpbmcgYnl0ZSBpcyBsZW5ndGggb2Ygc3RhdGVtZW50ICovCi0gICAgZHN0X2xuX2NvbF9ydW5fMiwgICAgLyogbmV4dCAyIGJ5dGVzIGlzIGNvbHVtbiBwb3NpdGlvbiBvZiBzdGFydCBvZiBuZXh0IHN0YXRlbWVudCwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb2xsb3dpbmcgMiBieXRlcyBpcyBsZW5ndGggb2Ygc3RhdGVtZW50ICovCi0gICAgZHN0X2xuX2luaXRfYmFzZTEsICAgLyogbmV4dCA0IGJ5dGVzIGFyZSBhYnNvbHV0ZSBQQywgZm9sbG93ZWQgYnkgMSBieXRlIG9mIGxpbmUgbnVtYmVyICovCi0gICAgZHN0X2xuX2luaXRfYmFzZTIsICAgLyogbmV4dCA0IGJ5dGVzIGFyZSBhYnNvbHV0ZSBQQywgZm9sbG93ZWQgYnkgMiBieXRlcyBvZiBsaW5lIG51bWJlciAqLwotICAgIGRzdF9sbl9pbml0X2Jhc2UzLCAgIC8qIG5leHQgNCBieXRlcyBhcmUgYWJzb2x1dGUgUEMsIGZvbGxvd2VkIGJ5IDMgYnl0ZXMgb2YgbGluZSBudW1iZXIgKi8KLSAgICBkc3RfbG5fZXNjYXBlMl9FTkRfT0ZfRU5VTQotICAgIH0KLSAgICBkc3RfbG5fZXNjYXBlMl90OyAgICAgICAgICAgCi0KLXR5cGVkZWYgdW5pb24KLSAgICB7Ci0gICAgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgcGNfZGVsdGEgOiA0OyAgICAgIC8qIDQgYml0IHBjIGRlbHRhICovCi0gICAgICAgIGludCAgICAgICAgICAgICAgIGxuX2RlbHRhIDogNDsgICAgICAvKiA0IGJpdCBsaW5lIG51bWJlciBkZWx0YSAqLwotICAgICAgICB9Ci0gICAgICAgIGRlbHRhOwotCi0gICAgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZXNjX2ZsYWcgOiA0OyAgICAgIC8qIGFsaWFzIGZvciBwY19kZWx0YSAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZXNjX2NvZGUgOiA0OyAgICAgIC8qIGVzY2FwZSBmdW5jdGlvbiBjb2RlIChkc3RfbG5fZXNjYXBlMV90LCBvciAuLi4yX3QgKi8KLSAgICAgICAgfQotICAgICAgICBlc2M7Ci0KLSAgICBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBlc2NfZmxhZyA6IDQ7ICAgICAgLyogZHN0X2xuX2N0eF9zcGVjMSwgb3IgZHN0X2xuX2N0eF9zcGVjMiAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBydW5fbGVuZ3RoIDogMjsgICAgICAKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgY3R4X2luZGV4IDogMjsgICAgICAvKiAuLi5zcGVjMiBjb250YWlucyBpbmRleDsgIC4uLnNwZWMxLCBpbmRleCAtIDQgKi8KLSAgICAgICAgfQotICAgICAgICBjdHhfc3BlYzsKLQotICAgIGNoYXIgICAgICAgICAgICAgICBzZGF0YTsgICAgICAgICAgICAgICAvKiBzaWduZWQgZGF0YSBieXRlICovCi0gICAgdW5zaWduZWQgY2hhciAgICAgIHVkYXRhOyAgICAgICAgICAgICAgIC8qIHVuc2lnbmVkIGRhdGEgYnl0ZSAqLwotICAgIH0KLSAgICBkc3RfbG5fZW50cnlfdCwKLSAgICAqZHN0X2xuX2VudHJ5X3B0cl90OwotCi0vKiBXYXJuaW5nOiBhbHRob3VnaCB0aGUgYWJvdmUgdW5pb24gb2NjdXBpZXMgb25seSAxIGJ5dGUgdGhlIGNvbXBpbGVyIHRyZWF0cwotICogaXQgYXMgaGF2aW5nIHNpemUgMiAodGhlIG1pbmltdW0gc2l6ZSBvZiBhIHN0cnVjdCkuICBUaGVyZWZvcmUgYSBzZXF1ZW5jZSBvZgotICogZHN0X2xuX2VudHJ5X3QncyBjYW5ub3QgYmUgZGVzY3JpYmVkIGFzIGFuIGFycmF5LCBhbmQgd2Fsa2luZyB0aHJvdWdoIHN1Y2ggYQotICogc2VxdWVuY2UgcmVxdWlyZXMgY29udm9sdXRlZCBjb2RlIHN1Y2ggYXMKLSAqICAgICAgbG5fcHRyID0gKGRzdF9sbl9lbnRyeV9wdHJfdCkgKGNoYXIqKSBsbl9wdHIgKyAxCi0gKiBXZSByZWdyZXQgdGhlIGluY29udmVuaWVuY2UuICovCi0KLS8qIFN0cnVjdHVyZSBmb3IgaW50ZXJwcmV0aW5nIHRoZSBieXRlIGZvbGxvd2luZyBhIGRzdF9sbl9jdHgxIGVudHJ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgxX2luZGV4IDogNTsgICAgICAvKiA1IGJpdCBpbmRleCBpbnRvIGNvbnRleHQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDFfcnVuX2xlbmd0aCA6IDM7IC8qIDMgYml0IHJ1biBsZW5ndGggKi8KLX0gZHN0X2xuX2N0eDFfdCwKLSAgKmRzdF9sbl9jdHgxX3B0cl90OwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGludGVycHJldGluZyB0aGUgYnl0ZXMgZm9sbG93aW5nIGEgZHN0X2xuX2N0eDIgZW50cnkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDJfaW5kZXggOiAxMzsgICAgIC8qIDEzIGJpdCBpbmRleCBpbnRvIGNvbnRleHQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDJfcnVuX2xlbmd0aCA6IDM7IC8qIDMgYml0IHJ1biBsZW5ndGggKi8KLX0gZHN0X2xuX2N0eDJfdCwKLSAgKmRzdF9sbl9jdHgyX3B0cl90OwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGludGVycHJldGluZyB0aGUgYnl0ZXMgZm9sbG93aW5nIGEgZHN0X2xuX2N0eDQgZW50cnkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDRfaW5kZXggOiAyOTsgICAgIC8qIDI5IGJpdCBpbmRleCBpbnRvIGNvbnRleHQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDRfcnVuX2xlbmd0aCA6IDM7IC8qIDMgYml0IHJ1biBsZW5ndGggKi8KLX0gZHN0X2xuX2N0eDRfdCwKLSAgKmRzdF9sbl9jdHg0X3B0cl90OwotCi0KLS8qICBQWERCIGRlZmluaXRpb25zLgotICoKLSAqIFBYREIgaXMgYSBwb3N0LXByb2Nlc3NvciB3aGljaCB0YWtlcyB0aGUgZXhlY3V0YWJsZSBmaWxlCi0gKiBhbmQgbWFzc2FnZXMgdGhlIGRlYnVnIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIG1heQotICogc3RhcnQgdXAgYW5kIHJ1biBtb3JlIGVmZmljaWVudGx5LiAgU29tZSBvZiB0aGUgdGFza3MKLSAqIHBlcmZvcm1lZCBieSBQWERCIGFyZToKLSAqCi0gKiBvICAgUmVtb3ZlIGR1cGxpY2F0ZSBnbG9iYWwgdHlwZSBhbmQgdmFyaWFibGUgaW5mb3JtYXRpb24KLSAqICAgICBmcm9tIHRoZSBHTlRULAotICoKLSAqIG8gICBBcHBlbmQgdGhlIEdOVFQgb250byB0aGUgZW5kIG9mIHRoZSBMTlRUIGFuZCBwbGFjZSBib3RoCi0gKiAgICAgYmFjayBpbiB0aGUgTE5UVCBzZWN0aW9uLAotICoKLSAqIG8gICBCdWlsZCBxdWljayBsb29rLXVwIHRhYmxlcyAoZGVzY3JpcHRpb24gZm9sbG93cykgZm9yCi0gKiAgICAgZmlsZXMsIHByb2NlZHVyZXMsIG1vZHVsZXMsIGFuZCBwYXJhZ3JhcGhzIChmb3IgQ29ib2wpLAotICogICAgIHBsYWNpbmcgdGhlc2UgaW4gdGhlIEdOVFQgc2VjdGlvbiwKLSAqCi0gKiBvICAgUmVjb25zdHJ1Y3QgdGhlIGhlYWRlciBhcHBlYXJpbmcgaW4gdGhlIGhlYWRlciBzZWN0aW9uCi0gKiAgICAgdG8gYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24uCi0gKgotICogVGhlICJxdWljayBsb29rLXVwIiB0YWJsZXMgYXJlIGluIHRoZSAkR05UVCQgc3ViLXNwYWNlLCBpbgotICogdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAqCi0gKiAgICAgUHJvY2VkdXJlcyAgICAtc29ydGVkIGJ5IGFkZHJlc3MKLSAqICAgICBTb3VyY2UgZmlsZXMgIC1zb3J0ZWQgYnkgYWRkcmVzcyAob2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGNvZGUgZnJvbSByb3V0aW5lcykKLSAqICAgICBNb2R1bGVzICAgICAgIC1zb3J0ZWQgYnkgYWRkcmVzcwotICogICAgIENsYXNzZXMgICAgICAgLTx1bnNvcnRlZD8+Ci0gKiAgICAgQWRkcmVzcyBBbGlhcyAtc29ydGVkIGJ5IGluZGV4IDw/PgotICogICAgIE9iamVjdCBJRHMgICAgLXNvcnRlZCBieSBvYmplY3QgaWRlbnRpZmllcgotICoKLSAqIE1vc3QgcXVpY2sgZW50cmllcyBoYXZlICgwLWJhc2VkKSBpbmRpY2VzIGludG8gdGhlIExOVFQgdGFibGVzIHRvCi0gKiB0aGUgZnVsbCBlbnRyaWVzIGZvciB0aGUgaXRlbSBpdCBkZXNjcmliZXMuCi0gKgotICogVGhlIHBvc3QtUFhEQiBoZWFkZXIgaXMgaW4gdGhlICRIRUFERVIkIHN1Yi1zcGFjZS4gIEFsYXMsIGl0Ci0gKiBvY2N1cnMgaW4gZGlmZmVyZW50IGZvcm1zLCBkZXBlbmRpbmcgb24gdGhlIG9wdGltaXphdGlvbiBsZXZlbAotICogaW4gdGhlIGNvbXBpbGF0aW9uIHN0ZXAgYW5kIHdoZXRoZXIgUFhEQiB3YXMgcnVuIG9yIG5vdC4gVGhlCi0gKiB3b3JzdCBwYXJ0IGlzIHRoZSBmb3JtcyBhcmVuJ3Qgc2VsZi1kZXNjcmliaW5nLCBzbyB3ZSdsbCBoYXZlCi0gKiB0byBncm92ZWwgaW4gdGhlIGJpdHMgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQgd2UncmUgbG9va2luZyBhdAotICogKHNlZSBocF9nZXRfaGVhZGVyIGluIGhwLXBzeW10YWItcmVhZC5jKS4KLSAqLwotCi0vKiBQWERCIHZlcnNpb25zCi0gKi8KLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0NQTFVTUExVUwkxCi0jZGVmaW5lIFBYREJfVkVSU0lPTl83XzQJMgotI2RlZmluZSBQWERCX1ZFUlNJT05fQ1BQXzMwCTMKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0RERV8zXzJBCTQKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0RERV8zXzIJNQotI2RlZmluZSBQWERCX1ZFUlNJT05fRERFXzRfMAk2Ci0KLSNkZWZpbmUgUFhEQl9WRVJTSU9OXzJfMQkxCi0KLS8qIEhlYWRlciB2ZXJzaW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIERPQyBpbmZvCi0gKiBidXQgdGhlIGV4ZWN1dGFibGUgaGFzIGJlZW4gcHJvY2Vzc2VkIGJ5IHB4ZGIgKHRoZSBlYXN5Ci0gKiBjYXNlLCBmcm9tICJjYyAtZyIpLgotICovCi10eXBlZGVmIHN0cnVjdCBQWERCX3N0cnVjdCB7Ci0gICAgaW50ICAgICAgICAgICAgICBwZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmdW5jdGlvbiBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBmZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmaWxlIGxvb2stdXAgdGFibGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgIG1kX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIG1vZHVsZSBsb29rLXVwIHRhYmxlICovCi0gICAgdW5zaWduZWQgaW50ICAgICBweGRiZWQgOiAxOyAgIC8qIDEgPT4gZmlsZSBoYXMgYmVlbiBwcmVwcm9jZXNzZWQgICAgICAqLwotICAgIHVuc2lnbmVkIGludCAgICAgYmlnaGRyIDogMTsgICAvKiAxID0+IHRoaXMgaGVhZGVyIGNvbnRhaW5zICd0aW1lJyB3b3JkICovCi0gICAgdW5zaWduZWQgaW50ICAgICBzYV9oZWFkZXIgOiAxOy8qIDEgPT4gY3JlYXRlZCBieSBTQSB2ZXJzaW9uIG9mIHB4ZGIgKi8KLQkJCSAgICAgICAgICAgLyogICB1c2VkIGZvciB2ZXJzaW9uIGNoZWNrIGluIHhkYiAqLwotICAgIHVuc2lnbmVkIGludCAgICAgaW5saW5lZDogMTsgICAvKiBvbmUgb3IgbW9yZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIGlubGluZWQgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIHNwYXJlOjEyOwotICAgIHNob3J0ICAgICAgICAgICAgdmVyc2lvbjsgICAgICAvKiBweGRiIGhlYWRlciB2ZXJzaW9uICovCi0gICAgaW50ICAgICAgICAgICAgICBnbG9iYWxzOyAgICAgIC8qIGluZGV4IGludG8gdGhlIEROVFQgd2hlcmUgR05UVCBiZWdpbnMgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIHRpbWU7ICAgICAgICAgLyogbW9kaWZ5IHRpbWUgb2YgZmlsZSBiZWZvcmUgYmVpbmcgcHhkYmVkICovCi0gICAgaW50ICAgICAgICAgICAgICBwZ19lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBsYWJlbCBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBmdW5jdGlvbnM7ICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZnVuY3Rpb25zICovCi0gICAgaW50ICAgICAgICAgICAgICBmaWxlczsgICAgICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZmlsZXMgKi8KLSAgICBpbnQgICAgICAgICAgICAgIGNkX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGNsYXNzIGxvb2stdXAgdGFibGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgIGFhX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGFkZHIgYWxpYXMgbG9vay11cCB0YWJsZSAqLwotICAgIGludCAgICAgICAgICAgICAgb2lfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gb2JqZWN0IGlkIGxvb2stdXAgdGFibGUgKi8KLX0gUFhEQl9oZWFkZXIsICpQWERCX2hlYWRlcl9wdHI7Ci0KLS8qIEhlYWRlciB2ZXJzaW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIERPQyBpbmZvIGFuZCB0aGUKLSAqIGV4ZWN1dGFibGUgaGFzIE5PVCBiZWVuIHByb2Nlc3NlZCBieSBweGRiLgotICovCi10eXBlZGVmIHN0cnVjdCBYREJfaGVhZGVyX3N0cnVjdCB7Ci0gICAgbG9uZyBnbnR0X2xlbmd0aDsgCi0gICAgbG9uZyBsbnR0X2xlbmd0aDsgCi0gICAgbG9uZyBzbHRfbGVuZ3RoOyAKLSAgICBsb25nIHZ0X2xlbmd0aDsgCi0gICAgbG9uZyB4dF9sZW5ndGg7IAotfSBYREJfaGVhZGVyOwotCi0vKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBET0MgaW5mbyBhbmQgdGhlCi0gKiBleGVjdXRhYmxlIGhhcyBiZWVuIHByb2Nlc3NlZCBieSBweGRiLgotICovCi10eXBlZGVmIHN0cnVjdCBET0NfaW5mb19QWERCX2hlYWRlcl9zdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBpbnQgeGRiX2hlYWRlcjogMTsgCSAgICAvKiBiaXQgc2V0IGlmIHRoaXMgaXMgcG9zdC0zLjEgeGRiICovIAotICAgICAgICB1bnNpZ25lZCBpbnQgZG9jX2hlYWRlcjogMTsgICAgICAgICAvKiBiaXQgc2V0IGlmIHRoaXMgaXMgZG9jLXN0eWxlIGhlYWRlciovCi0gICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uOiA4OyAgICAgICAgICAgIC8qIHZlcnNpb24gb2YgcHhkYiBzZWUgZGVmaW5lcwotCQkJCQkgICAgICogUFhEQl9WRVJTSU9OXyogaW4gdGhpcyBmaWxlICovCi0gICAgICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF9mb3JfZmxhZ3M6IDE2Oy8qIGZvciBmdXR1cmUgdXNlOyAtLSBtdXN0IGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc2V0IHRvIHplcm8gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfYXV4X3BkX3RhYmxlOiAxOyAgIC8qICRHTlRUJCBoYXMgYXV4IFBEIHRhYmxlICovCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfZXhwcl90YWJsZTogMTsgICAgIC8qIHNwYWNlIGhhcyAkRVhQUiQgKi8gICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfcmFuZ2VfdGFibGU6IDE7ICAgIC8qIHNwYWNlIGhhcyAkUkFOR0UkICovICAgICAgIAotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2NvbnRleHRfdGFibGU6IDE7ICAvKiBzcGFjZSBoYXMgJFNSQ19DVFhUJCAqLyAgICAKLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19saW5lc190YWJsZTogMTsgICAgLyogc3BhY2UgY29udGFpbnMgYSAkTElORVMkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzdWJzcGFjZSBmb3IgbGluZSB0YWJsZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2x0X29mZnNldF9tYXA6IDE7ICAvKiBzcGFjZSBjb250YWlucyBhbiBsdF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgIC8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBpbiB0aGUgUFhEQl9oZWFkZXIgaW4gJERFQlVHJCAqLwotICAgICAgICBpbnQgICAgICBwZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmdW5jdGlvbiBsb29rLXVwIHRhYmxlICovCi0gICAgICAgIGludCAgICAgIGZkX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGZpbGUgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBtZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBtb2R1bGUgbG9vay11cCB0YWJsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHB4ZGJlZCA6IDE7ICAgLyogMSA9PiBmaWxlIGhhcyBiZWVuIHByZXByb2Nlc3NlZCAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgYmlnaGRyIDogMTsgICAvKiAxID0+IHRoaXMgaGVhZGVyIGNvbnRhaW5zICd0aW1lJyB3b3JkICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgc2FfaGVhZGVyIDogMTsvKiAxID0+IGNyZWF0ZWQgYnkgU0EgdmVyc2lvbiBvZiBweGRiICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICB1c2VkIGZvciB2ZXJzaW9uIGNoZWNrIGluIHhkYiAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGlubGluZWQ6IDE7ICAgLyogb25lIG9yIG1vcmUgZnVuY3Rpb25zIGhhdmUgYmVlbiBpbmxpbmVkICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgc3BhcmUgOiAyODsKLSAgICAgICAgaW50ICAgICAgZ2xvYmFsczsgICAgICAvKiBpbmRleCBpbnRvIHRoZSBETlRUIHdoZXJlIEdOVFQgYmVnaW5zICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdGltZTsgICAgICAgICAvKiBtb2RpZnkgdGltZSBvZiBmaWxlIGJlZm9yZSBiZWluZyBweGRiZWQgKi8KLSAgICAgICAgaW50ICAgICAgcGdfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbGFiZWwgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBmdW5jdGlvbnM7ICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZnVuY3Rpb25zICovCi0gICAgICAgIGludCAgICAgIGZpbGVzOyAgICAgICAgLyogYWN0dWFsIG51bWJlciBvZiBmaWxlcyAqLwotICAgICAgICBpbnQgICAgICBjZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBjbGFzcyBsb29rLXVwIHRhYmxlICovCi0gICAgICAgIGludCAgICAgIGFhX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGFkZHIgYWxpYXMgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBvaV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBvYmplY3QgaWQgbG9vay11cCB0YWJsZSAqLwotfSBET0NfaW5mb19QWERCX2hlYWRlcjsKLQotLyogSGVhZGVyIHZlcnNpb24gZm9yIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgRE9DIGluZm8gYW5kIHRoZQotICogZXhlY3V0YWJsZSBoYXMgTk9UIGJlZW4gcHJvY2Vzc2VkIGJ5IHB4ZGIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IERPQ19pbmZvX2hlYWRlcl9zdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBpbnQgeGRiX2hlYWRlcjogMTsgCS8qIGJpdCBzZXQgaWYgdGhpcyBpcyBwb3N0LTMuMSB4ZGIgKi8gCi0gICAgICAgIHVuc2lnbmVkIGludCBkb2NfaGVhZGVyOiAxOyAgICAgLyogYml0IHNldCBpZiB0aGlzIGlzIGRvYy1zdHlsZSBoZWFkZXIqLwotICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbjogODsgICAgICAgICAgICAgLyogdmVyc2lvbiBvZiBkZWJ1Zy9oZWFkZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuIEZvciAxMC4wIHRoZSB2YWx1ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgMS4gRm9yICJEYXZpcyIgdGhlCi0JCQkJCQl2YWx1ZSBpcyAyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50IHJlc2VydmVkX2Zvcl9mbGFnczogMTg7IC8qIGZvciBmdXR1cmUgdXNlOyAtLSBtdXN0IGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIHplcm8gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX3JhbmdlX3RhYmxlOiAxOyAgICAgLyogc3BhY2UgY29udGFpbnMgYSAkUkFOR0UkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzcGFjZSBmb3IgdmFyaWFibGUgcmFuZ2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfY29udGV4dF90YWJsZTogMTsgICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJENUWFQkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzcGFjZSBmb3IgY29udGV4dC9pbmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50IGhhc19saW5lc190YWJsZTogMTsgICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJExJTkVTJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIGxpbmUgdGFibGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50IGhhc19sdF9vZmZzZXRfbWFwOiAxOyAgIC8qIHNwYWNlIGNvbnRhaW5zIGFuIGx0X29mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIGxpbmUgdGFibGUgbWFwcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgbG9uZyAgIGdudHRfbGVuZ3RoOyAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCi0gICAgICAgIGxvbmcgICBsbnR0X2xlbmd0aDsgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgc2x0X2xlbmd0aDsgICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KLSAgICAgICAgbG9uZyAgIHZ0X2xlbmd0aDsgICAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCi0gICAgICAgIGxvbmcgICB4dF9sZW5ndGg7ICAgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgY3R4dF9sZW5ndGg7ICAvKiBwcmVzZW50IG9ubHkgaWYgdmVyc2lvbiA+PSAyICovCi0gICAgICAgIGxvbmcgICByYW5nZV9sZW5ndGg7ICAvKiBwcmVzZW50IG9ubHkgaWYgdmVyc2lvbiA+PSAyICovCi0gICAgICAgIGxvbmcgICBleHByX2xlbmd0aDsgIC8qIHByZXNlbnQgb25seSBpZiB2ZXJzaW9uID49IDIgKi8KLQotfSBET0NfaW5mb19oZWFkZXI7Ci0KLXR5cGVkZWYgdW5pb24gR2VuZXJpY0RlYnVnSGVhZGVyX3VuaW9uCi17Ci0gICBQWERCX2hlYWRlciAgICAgICAgICBub19kb2M7Ci0gICBET0NfaW5mb19QWERCX2hlYWRlciBkb2M7Ci0gICBYREJfaGVhZGVyICAgICAgICAgICBub19weGRiX25vX2RvYzsKLSAgIERPQ19pbmZvX2hlYWRlciAgICAgIG5vX3B4ZGJfZG9jOwotfSBHZW5lcmljRGVidWdIZWFkZXI7Ci0KLQotLyogIFByb2NlZHVyZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBwcm9jZWR1cmUgcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19wcm9jZWR1cmUgewotICAgICAgICBsb25nICAgICAgICAgICAgIGlzeW07CQkvKiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IHN5bWJvbCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBmb3IgcHJvY2VkdXJlIGluICRMTlRUJCwgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgaS5lLiB0aGUgcHJvY2VkdXJlIGl0c2VsZiAgKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJTdGFydDsJLyogbWVtb3J5IGFkciBvZiBzdGFydCBvZiBwcm9jCSovCi0gICAgICAgIENPUkVfQUREUgkgYWRyRW5kOwkvKiBtZW1vcnkgYWRyIG9mIGVuZCBvZiBwcm9jCSovCi0gICAgICAgIGNoYXIgICAgICAgICAgIAkqc2JBbGlhczsJLyogYWxpYXMgbmFtZSBvZiBwcm9jZWR1cmUJKi8KLSAgICAgICAgY2hhciAgICAgICAgICAgICpzYlByb2M7CS8qIHJlYWwgbmFtZSBvZiBwcm9jZWR1cmUJKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJCcDsJCS8qIGFkZHJlc3Mgb2YgZW50cnkgYnJlYWtwb2ludCAgKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJFeGl0QnA7CS8qIGFkZHJlc3Mgb2YgZXhpdCBicmVha3BvaW50ICAgKi8KLQlpbnQgICAgICAgICAgICAgIGljZDsgICAgICAgICAgIC8qIG1lbWJlciBvZiB0aGlzIGNsYXNzIChpbmRleCkgKi8JCi0JdW5zaWduZWQgaW50CSBpcGQ7CQkvKiBpbmRleCBvZiB0ZW1wbGF0ZSBmb3IgdGhpcyAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBmdW5jdGlvbiAoaW5kZXgpICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQJIHVudXNlZDogICAgNTsKLSAgICAgICAgdW5zaWduZWQgaW50CSBub19sdF9vZmZzZXQ6IDE7Lyogbm8gZW50cnkgaW4gbHRfb2Zmc2V0IHRhYmxlICovCi0gICAgICAgIHVuc2lnbmVkIGludAkgZlRlbXBsYXRlOiAxOwkvKiBmdW5jdGlvbiB0ZW1wbGF0ZQkJKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSBmRXhwYW5zaW9uOiAxOwkvKiBmdW5jdGlvbiBleHBhbnNpb24JCSovCi0JdW5zaWduZWQgaW50CSBsaW5rZWQJICA6IDE7CS8qIGxpbmtlZCB3aXRoIG90aGVyIGV4cGFuc2lvbnMJKi8KLQl1bnNpZ25lZCBpbnQJIGR1cGxpY2F0ZTogMTsgIC8qIGNsb25lIG9mIGFub3RoZXIgcHJvY2VkdXJlICAgKi8KLQl1bnNpZ25lZCBpbnQJIG92ZXJsb2FkZWQ6MTsgIC8qIG92ZXJsb2FkZWQgZnVuY3Rpb24gICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJIG1lbWJlcjogICAgMTsgIC8qIGNsYXNzIG1lbWJlciBmdW5jdGlvbiAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJIGNvbnN0cnVjdG9yOjE7IC8qIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJIGRlc3RydWN0b3I6MTsgIC8qIGRlc3RydWN0b3IgZnVuY3Rpb24gICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIFN0YXRpYzogICAgMTsgIC8qIHN0YXRpYyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIFZpcnR1YWw6ICAgMTsgIC8qIHZpcnR1YWwgZnVuY3Rpb24gICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIGNvbnN0YW50OiAgMTsgIC8qIGNvbnN0YW50IGZ1bmN0aW9uICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIHB1cmU6ICAgICAgMTsgIC8qIHB1cmUgKHZpcnR1YWwpIGZ1bmN0aW9uICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIGxhbmd1YWdlOiAgNDsgIC8qIHByb2NlZHVyZSdzIGxhbmd1YWdlICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIGlubGluZWQ6ICAgMTsgIC8qIGZ1bmN0aW9uIGhhcyBiZWVuIGlubGluZWQgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIE9wZXJhdG9yOiAgMTsgIC8qIG9wZXJhdG9yIGZ1bmN0aW9uICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJIHN0dWI6ICAgICAgMTsgIC8qIGJvZHlsZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSBvcHRpbWl6ZTogIDI7CS8qIG9wdGltaXphdGlvbiBsZXZlbCAgIAkqLwotICAgICAgICB1bnNpZ25lZCBpbnQJIGxldmVsOiAgICAgNTsJLyogbmVzdGluZyBsZXZlbCAodG9wPTApCSovCi19IHF1aWNrX3Byb2NlZHVyZV9lbnRyeSwgKnF1aWNrX3Byb2NlZHVyZV9lbnRyeV9wdHI7Ci0KLS8qICBTb3VyY2UgRmlsZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBzb3VyY2UgZmlsZSBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX3NvdXJjZSB7Ci0gICAgICAgIGxvbmcJICAgICAgIGlzeW07CQkvKiAwLWJhc2VkIGluZGV4IGluICRMTlRUJCBvZiAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBmaXJzdCBzeW1ib2wgZm9yIHRoaXMgZmlsZSAgICAqLwotICAgICAgICBDT1JFX0FERFIgICAgICBhZHJTdGFydDsJLyogbWVtIGFkciBvZiBzdGFydCBvZiBmaWxlJ3MgY29kZSAqLwotICAgICAgICBDT1JFX0FERFIgICAgICBhZHJFbmQ7CQkvKiBtZW0gYWRyIG9mIGVuZCBvZiBmaWxlJ3MgY29kZSAgICovCi0gICAgICAgIGNoYXIJICAgICAgKnNiRmlsZTsJCS8qIG5hbWUgb2Ygc291cmNlIGZpbGUJCSAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIGZIYXNEZWNsOiAxOwkvKiBkbyB3ZSBoYXZlIGEgLmQgZmlsZT8JICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgZldhcm5lZDogIDE7CS8qIGhhdmUgd2FybmVkIGFib3V0IGFnZSBwcm9ibGVtcz8gKi8KLQl1bnNpZ25lZCBpbnQgICBmU3JjZmlsZTogMTsgICAgIC8qIDAgPT4gaW5jbHVkZSAxPT4gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgaWxuTWFjOwkJLyogbGluZXMgaW4gZmlsZSAoMCBpZiBkb24ndCBrbm93KSAqLwotICAgICAgICBpbnQJICAgICAgIGlwZDsJCS8qIDAtYmFzZWQgaW5kZXggb2YgZmlyc3QgcHJvY2VkdXJlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGluIHRoaXMgZmlsZSwgaW4gdGhlIHF1aWNrICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBsb29rLXVwIHRhYmxlIG9mIHByb2NlZHVyZXMgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICpyZ0xuOwkJLyogbGluZSBwb2ludGVyIGFycmF5LCBpZiBhbnkJICAgKi8KLX0gcXVpY2tfZmlsZV9lbnRyeSwgKnF1aWNrX2ZpbGVfZW50cnlfcHRyOwotCi0vKiAgTW9kdWxlIERlc2NyaXB0b3I6Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIG1vZHVsZSBxdWljayByZWZlcmVuY2UgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfbW9kdWxlIHsKLSAgICAgICAgbG9uZyAgICAgICAgICAgICBpc3ltOwkJICAgLyogMC1iYXNlZCBpbmRleCBvZiBmaXJzdCAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgc3ltYm9sIGZvciBtb2R1bGUgICAgICAgKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJTdGFydDsJICAgLyogYWRyIG9mIHN0YXJ0IG9mIG1vZC4JKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJFbmQ7CSAgIC8qIGFkciBvZiBlbmQgb2YgbW9kLgkqLwotICAgICAgICBjaGFyCSAgICAgICAgKnNiQWxpYXM7CSAgIC8qIGFsaWFzIG5hbWUgb2YgbW9kdWxlICAgCSovCi0gICAgICAgIGNoYXIJICAgICAgICAqc2JNb2Q7CQkgICAvKiByZWFsIG5hbWUgb2YgbW9kdWxlCSovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgaW1wb3J0czogICAgICAgMTsgLyogbW9kdWxlIGhhdmUgYW55IGltcG9ydHM/ICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHZhcnNfaW5fZnJvbnQ6IDE7IC8qIG1vZHVsZSBnbG9iYWxzIGluIGZyb250PyAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICB2YXJzX2luX2dhcHM6ICAxOyAvKiBtb2R1bGUgZ2xvYmFscyBpbiBnYXBzPyAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgbGFuZ3VhZ2U6ICAgICAgNDsgLyogdHlwZSBvZiBsYW5ndWFnZSAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHVudXNlZCAgICAgIDogMjU7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdW51c2VkMjsJICAgLyogc3BhY2UgZm9yIGZ1dHVyZSBzdHVmZgkqLwotfSBxdWlja19tb2R1bGVfZW50cnksICpxdWlja19tb2R1bGVfZW50cnlfcHRyOwotCi0vKiAgQXV4aWxpYXJ5IFByb2NlZHVyZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBhdXhpbGlhcnkgcHJvY2VkdXJlIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfYXV4X3Byb2NlZHVyZSB7Ci0gICAgICAgIGxvbmcJIGlzeW1faW5sbjsJLyogc3RhcnQgb24gaW5saW5lIGxpc3QgZm9yIHByb2MgKi8KLQlsb25nICAgICBzcGFyZTsKLX0gcXVpY2tfYXV4X3Byb2NlZHVyZV9lbnRyeSwgKnF1aWNrX2F1eF9wcm9jZWR1cmVfZW50cnlfcHRyOwotCi0vKiAgUGFyYWdyYXBoIERlc2NyaXB0b3I6Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIHBhcmFncmFwaCBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX3BhcmFncmFwaCB7Ci0gICAgICAgIGxvbmcgICAgICAgICAgICAgaXN5bTsgICAgICAgLyogZmlyc3Qgc3ltYm9sIGZvciBsYWJlbCAoaW5kZXgpICAqLwotICAgICAgICBDT1JFX0FERFIgICAgICAgIGFkclN0YXJ0OyAgIC8qIG1lbW9yeSBhZHIgb2Ygc3RhcnQgb2YgbGFiZWwgICAgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgICBhZHJFbmQ7ICAgICAvKiBtZW1vcnkgYWRyIG9mIGVuZCBvZiBsYWJlbCAgICAgICovCi0gICAgICAgIGNoYXIgICAgICAgICAgICAqc2JMYWI7ICAgICAgLyogbmFtZSBvZiBsYWJlbCAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGluc3Q7ICAgICAgIC8qIFVzZWQgaW4geGRiIHRvIHN0b3JlIGluc3QgQCBicCAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBzZWN0OiAgICAxOyAvKiB0cnVlID0gc2VjdGlvbiwgZmFsc2UgPSBwYXJhZy4gICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdW51c2VkOiAzMTsgLyogZnV0dXJlIHVzZSAgICAgICAgICAgICAgICAgICAgICAqLwotfSBxdWlja19wYXJhZ3JhcGhfZW50cnksICpxdWlja19wYXJhZ3JhcGhfZW50cnlfcHRyOwotCi0vKgotICogIENsYXNzIERlc2NyaXB0b3I6Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIGNsYXNzIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfY2xhc3MgewotICAgICAgICBjaGFyCSAgICAgICAgICpzYkNsYXNzOwkvKiBuYW1lIG9mIGNsYXNzCSAgICAgICAgKi8KLSAgICAgICAgbG9uZyAgICAgICAgICAgICAgaXN5bTsgICAgICAgICAvKiBjbGFzcyBzeW1ib2wgKHRhZykgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSAgdHlwZSA6IDI7CS8qIDA9Y2xhc3MsIDE9dW5pb24sIDI9c3RydWN0ICAgKi8KLQl1bnNpZ25lZCBpbnQJICBmVGVtcGxhdGUgOiAxOy8qIGNsYXNzIHRlbXBsYXRlICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJICBleHBhbnNpb24gOiAxOy8qIHRlbXBsYXRlIGV4cGFuc2lvbiAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJICB1bnVzZWQgICAgOjI4OwotCXNsdHBvaW50ZXIgICAgICAgIGxvd3Njb3BlOwkvKiBiZWdpbm5pbmcgb2YgZGVmaW5lZCBzY29wZSAgICovCi0Jc2x0cG9pbnRlciAgICAgICAgaGlzY29wZTsJLyogZW5kIG9mIGRlZmluZWQgc2NvcGUgICAgICAgICAqLwotfSBxdWlja19jbGFzc19lbnRyeSwgKnF1aWNrX2NsYXNzX2VudHJ5X3B0cjsKLQotLyogIEFkZHJlc3MgQWxpYXMgRW50cnkKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgYWRkcmVzcyBhbGlhcyBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX2FsaWFzIHsKLQlDT1JFX0FERFIgICAgICAgbG93OwotCUNPUkVfQUREUiAgICAgICBoaWdoOwotCWludCAgICAgICAgICAgICBpbmRleDsKLQl1bnNpZ25lZCBpbnQJdW51c2VkIDogMzE7Ci0JdW5zaWduZWQgaW50CWFsdGVybmF0ZSA6IDE7CS8qIGFsdGVybmF0ZSB1bm5hbWVkIGFsaWFzZXM/ICAgKi8KLX0gcXVpY2tfYWxpYXNfZW50cnksICpxdWlja19hbGlhc19lbnRyeV9wdHI7Ci0KLS8qICBPYmplY3QgSWRlbnRpZmljYXRpb24gRW50cnkKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgb2JqZWN0IGlkZW50aWZpY2F0aW9uIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBxdWlja19vYmpfSUQgewotCUNPUkVfQUREUiAgICBvYmpfaWRlbnQ7CQkvKiBjbGFzcyBpZGVudGlmaWVyICAgICAgICAgKi8KLQlsb25nICAgICAgICAgaXN5bTsJCS8qIGNsYXNzIHN5bWJvbCAgICAgICAgICAgICAqLwotCWxvbmcgICAgICAgICBvZmZzZXQ7CQkvKiBvZmZzZXQgdG8gb2JqZWN0IHN0YXJ0ICAgKi8KLX0gcXVpY2tfb2JqX0lEX2VudHJ5LCAqcXVpY2tfb2JqX0lEX2VudHJ5X3B0cjsKLQotCi0jZW5kaWYgLyogSFBfU1lNVEFCX0lOQ0xVREVEICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaWVlZS5oIGIvaW5jbHVkZS9pZWVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZGUzOWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9pZWVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogSUVFRSBTdGFuZGFyZCA2OTUtMTk4MCAiVW5pdmVyc2FsIEZvcm1hdCBmb3IgT2JqZWN0IE1vZHVsZXMiIGhlYWRlciBmaWxlCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gICovCi0KLSNkZWZpbmUgTl9XX1ZBUklBQkxFUyA4Ci0jZGVmaW5lIE1vZHVsZV9CZWdpbm5pbmcgMHhlMAotCi10eXBlZGVmIHN0cnVjdCBpZWVlX21vZHVsZSB7Ci0gIGNoYXIgKnByb2Nlc3NvcjsKLSAgY2hhciAqbW9kdWxlX25hbWU7Ci19IGllZWVfbW9kdWxlX2JlZ2luX3R5cGU7Ci0KLSNkZWZpbmUgQWRkcmVzc19EZXNjcmlwdG9yIDB4ZWMKLXR5cGVkZWYgc3RydWN0IGllZWVfYWRkcmVzcyB7Ci1iZmRfdm1hIG51bWJlcl9vZl9iaXRzX21hdTsKLSBiZmRfdm1hIG51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3M7Ci0KLSAgdW5zaWduZWQgY2hhciBieXRlX29yZGVyOwotI2RlZmluZSBJRUVFX0xJVFRMRSAweGNjCi0jZGVmaW5lIElFRUVfQklHIDB4Y2QKLX0gaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfdHlwZTsKLQotdHlwZWRlZiB1bmlvbiBpZWVlX3dfdmFyaWFibGUgewotICBmaWxlX3B0ciBvZmZzZXRbTl9XX1ZBUklBQkxFU107Ci0gIHN0cnVjdCB7Ci0gICAgZmlsZV9wdHIgZXh0ZW5zaW9uX3JlY29yZDsKLSAgICBmaWxlX3B0ciBlbnZpcm9ubWVudGFsX3JlY29yZDsKLSAgICBmaWxlX3B0ciBzZWN0aW9uX3BhcnQ7Ci0gICAgZmlsZV9wdHIgZXh0ZXJuYWxfcGFydDsKLSAgICBmaWxlX3B0ciBkZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0OwotICAgIGZpbGVfcHRyIGRhdGFfcGFydDsKLSAgICBmaWxlX3B0ciB0cmFpbGVyX3BhcnQ7Ci0gICAgZmlsZV9wdHIgbWVfcmVjb3JkOwotICB9IHI7Ci19IGllZWVfd192YXJpYWJsZV90eXBlOwotCi0KLQotCi0KLXR5cGVkZWYgZW51bSBpZWVlX3JlY29yZAoteyAKLSAgaWVlZV9udW1iZXJfc3RhcnRfZW51bSA9IDB4MDAsCi0gIGllZWVfbnVtYmVyX2VuZF9lbnVtPTB4N2YsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtID0gMHg4MCwKLSAgaWVlZV9udW1iZXJfcmVwZWF0X2VuZF9lbnVtID0gMHg4OCwKLSAgaWVlZV9udW1iZXJfcmVwZWF0XzRfZW51bSA9IDB4ODQsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF8zX2VudW0gPSAweDgzLAotICBpZWVlX251bWJlcl9yZXBlYXRfMl9lbnVtID0gMHg4MiwKLSAgaWVlZV9udW1iZXJfcmVwZWF0XzFfZW51bSA9IDB4ODEsCi0gIGllZWVfbW9kdWxlX2JlZ2lubmluZ19lbnVtID0gMHhlMCwKLSAgaWVlZV9tb2R1bGVfZW5kX2VudW0gPSAweGUxLAotICBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtID0gMHhkZSwKLSAgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSA9IDB4ZGYsCi0gIGllZWVfc2VjdGlvbl90eXBlX2VudW0gPSAweGU2LAotICBpZWVlX3NlY3Rpb25fYWxpZ25tZW50X2VudW0gPSAweGU3LAotICBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtID0gMHhlOCwKLSAgaWVlZV9jb21tYSA9IDB4OTAsCi0gIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0gPSAweGU5LAotICBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bSA9IDB4ZTUsCi0gIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX2VudW0gPSAweGVjLAotICBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bSA9IDB4ZWQsCi0gIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bSA9IDB4ZTQsCi0KLSAgaWVlZV92YXJpYWJsZV9BX2VudW0gPSAweGMxLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0JfZW51bSA9IDB4YzIsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfQ19lbnVtID0gMHhjMywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9EX2VudW0gPSAweGM0LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0VfZW51bSA9IDB4YzUsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfRl9lbnVtID0gMHhjNiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9HX2VudW0gPSAweGM3LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0hfZW51bSA9IDB4YzgsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfSV9lbnVtID0gMHhjOSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9KX2VudW0gPSAweGNhLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0tfZW51bSA9IDB4Y2IsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfTF9lbnVtID0gMHhjYywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9NX2VudW0gPSAweGNkLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX05fZW51bSA9IDB4Y2UsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfT19lbnVtID0gMHhjZiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9QX2VudW0gPSAweGQwLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1FfZW51bSA9IDB4ZDEsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfUl9lbnVtID0gMHhkMiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9TX2VudW0gPSAweGQzLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1RfZW51bSA9IDB4ZDQsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfVV9lbnVtID0gMHhkNSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9WX2VudW0gPSAweGQ2LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1dfZW51bSA9IDB4ZDcsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfWF9lbnVtID0gMHhkOCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9ZX2VudW0gPSAweGQ5LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1pfZW51bSA9IDB4ZGEsCi0gIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtID0gMHhhNSwKLSAgaWVlZV9mdW5jdGlvbl9taW51c19lbnVtID0gMHhhNiwKLSAgaWVlZV9mdW5jdGlvbl9zaWduZWRfb3Blbl9iX2VudW0gPSAweGJhLAotICBpZWVlX2Z1bmN0aW9uX3NpZ25lZF9jbG9zZV9iX2VudW0gPSAweGJiLAotCi0gIGllZWVfZnVuY3Rpb25fdW5zaWduZWRfb3Blbl9iX2VudW0gPSAweGJjLAotICBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX2Nsb3NlX2JfZW51bSA9IDB4YmQsCi0KLSAgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0gPSAweGJlLAotICBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9jbG9zZV9iX2VudW0gPSAweGJmLAotICBpZWVlX3JlY29yZF9zZXBlcmF0b3JfZW51bSA9IDB4ZGIsCi0KLSAgaWVlZV9lMl9maXJzdF9ieXRlX2VudW0gPSAweGUyLAotICBpZWVlX3NlY3Rpb25fc2l6ZV9lbnVtID0gMHhlMmQzLAotICBpZWVlX3BoeXNpY2FsX3JlZ2lvbl9zaXplX2VudW0gPSAweGUyYzEsCi0gIGllZWVfcmVnaW9uX2Jhc2VfYWRkcmVzc19lbnVtID0gMHhlMmMyLAotICBpZWVlX21hdV9zaXplX2VudW0gPSAweGUyYzYsCi0gIGllZWVfbV92YWx1ZV9lbnVtID0gMHhlMmNkLAotICBpZWVlX3NlY3Rpb25fYmFzZV9hZGRyZXNzX2VudW0gPSAweGUyY2MsCi0gIGllZWVfYXNuX3JlY29yZF9lbnVtID0gMHhlMmNlLAotICBpZWVlX3NlY3Rpb25fb2Zmc2V0X2VudW0gPSAweGUyZDIsCi0gIGllZWVfdmFsdWVfc3RhcnRpbmdfYWRkcmVzc19lbnVtID0gMHhlMmM3LAotICBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtID0gMHhlMmQ3LAotICBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gPSAweGUyZDAsCi0gIGllZWVfdmFsdWVfcmVjb3JkX2VudW0gPSAweGUyYzksCi0gIGllZWVfbm5fcmVjb3JkID0gMHhmMCwKLSAgaWVlZV9hdF9yZWNvcmRfZW51bSA9IDB4ZjEsCi0gIGllZWVfdHlfcmVjb3JkX2VudW0gPSAweGYyLAotICBpZWVlX2F0dHJpYnV0ZV9yZWNvcmRfZW51bSA9IDB4ZjFjOSwKLSAgaWVlZV9hdG5fcmVjb3JkX2VudW0gPSAweGYxY2UsCi0gIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2luZm9fcmVjb3JkX2VudW0gPSAweGYxZDgsCi0gIGllZWVfd2Vha19leHRlcm5hbF9yZWZlcmVuY2VfZW51bT0gMHhmNCwKLSAgaWVlZV9yZXBlYXRfZGF0YV9lbnVtID0gMHhmNywKLSAgaWVlZV9iYl9yZWNvcmRfZW51bSA9IDB4ZjgsCi0gIGllZWVfYmVfcmVjb3JkX2VudW0gPSAweGY5Ci19IGllZWVfcmVjb3JkX2VudW1fdHlwZTsKLQkJIAotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3NlY3Rpb24gewotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9pbmRleDsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fdHlwZTsKLSAgY2hhciAqc2VjdGlvbl9uYW1lOwotICB1bnNpZ25lZCBpbnQgcGFyZW50X3NlY3Rpb25faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzaWJsaW5nX3NlY3Rpb25faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBjb250ZXh0X2luZGV4OwotfSBpZWVlX3NlY3Rpb25fdHlwZTsKLSNkZWZpbmUgSUVFRV9SRUZFUkVOQ0VfQkFTRSAxMQotI2RlZmluZSBJRUVFX1BVQkxJQ19CQVNFIDMyCi0jZGVmaW5lIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSAxCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliaWJlcnR5LmggYi9pbmNsdWRlL2xpYmliZXJ0eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjMxMzY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGliaWJlcnR5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciBsaWJpYmVydHkuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LCAxOTk0LgotCi0gICBUaGUgbGliaWJlcnR5IGxpYnJhcnkgcHJvdmlkZXMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZQotICAgbWlzc2luZyBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLiAgV2UgZG8gbm90IGRlY2xhcmUgdGhvc2UgaGVyZSwKLSAgIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIG9uIG9wZXJhdGluZwotICAgc3lzdGVtcyB0aGF0IGRvIHN1cHBvcnQgdGhvc2UgZnVuY3Rpb25zLiAgSW4gdGhpcyBmaWxlIHdlIG9ubHkKLSAgIGRlY2xhcmUgdGhvc2UgZnVuY3Rpb25zIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBsaWJpYmVydHkuICAqLwotCi0jaWZuZGVmIExJQklCRVJUWV9ICi0jZGVmaW5lIExJQklCRVJUWV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEJ1aWxkIGFuIGFyZ3VtZW50IHZlY3RvciBmcm9tIGEgc3RyaW5nLiAgQWxsb2NhdGVzIG1lbW9yeSB1c2luZwotICAgbWFsbG9jLiAgVXNlIGZyZWVhcmd2IHRvIGZyZWUgdGhlIHZlY3Rvci4gICovCi0KLWV4dGVybiBjaGFyICoqYnVpbGRhcmd2IFBBUkFNUyAoKGNoYXIgKikpOwotCi0vKiBGcmVlIGEgdmVjdG9yIHJldHVybmVkIGJ5IGJ1aWxkYXJndi4gICovCi0KLWV4dGVybiB2b2lkIGZyZWVhcmd2IFBBUkFNUyAoKGNoYXIgKiopKTsKLQotLyogRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gQWxsb2NhdGVzIG1lbW9yeSB1c2luZyBtYWxsb2MuICBVc2UKLSAgIGZyZWVhcmd2IHRvIGZyZWUgdGhlIHZlY3Rvci4gICovCi0KLWV4dGVybiBjaGFyICoqZHVwYXJndiBQQVJBTVMgKChjaGFyICoqKSk7Ci0KLQotLyogUmV0dXJuIHRoZSBsYXN0IGNvbXBvbmVudCBvZiBhIHBhdGggbmFtZS4gIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgYQotICAgcHJvdG90eXBlIGhlcmUgYmVjYXVzZSB0aGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5Ci0gICBhY3Jvc3MgZGlmZmVyZW50IHN5c3RlbXMsIHNvbWV0aW1lcyBhcyAiY2hhciAqIiBhbmQgc29tZXRpbWVzIGFzCi0gICAiY29uc3QgY2hhciAqIiAqLwotCi0jaWYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fICkgfHwgZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotZXh0ZXJuIGNoYXIgKmJhc2VuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotI2Vsc2UKLWV4dGVybiBjaGFyICpiYXNlbmFtZSAoKTsKLSNlbmRpZgotCi0vKiBDb25jYXRlbmF0ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHN0cmluZ3MsIHVwIHRvIChjaGFyICopIE5VTEwuCi0gICBBbGxvY2F0ZXMgbWVtb3J5IHVzaW5nIHhtYWxsb2MuICAqLwotCi1leHRlcm4gY2hhciAqY29uY2F0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLS8qIENoZWNrIHdoZXRoZXIgdHdvIGZpbGUgZGVzY3JpcHRvcnMgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4gICovCi0KLWV4dGVybiBpbnQgZmRtYXRjaCBQQVJBTVMgKChpbnQgZmQxLCBpbnQgZmQyKSk7Ci0KLS8qIEdldCB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIHByb2Nlc3MgaGFzIHJ1biwgaW4gbWljcm9zZWNvbmRzLiAgKi8KLQotZXh0ZXJuIGxvbmcgZ2V0X3J1bl90aW1lIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ2hvb3NlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIHNjcmF0Y2ggZmlsZXMuICAqLwotCi1leHRlcm4gY2hhciAqY2hvb3NlX3RlbXBfYmFzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSBmaWxsZWQgd2l0aCBzcGFjZXMuICBBbGxvY2F0ZXMgdXNpbmcgbWFsbG9jLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYWNlcyBQQVJBTVMgKChpbnQgY291bnQpKTsKLQotLyogUmV0dXJuIHRoZSBtYXhpbXVtIGVycm9yIG51bWJlciBmb3Igd2hpY2ggc3RyZXJyb3Igd2lsbCByZXR1cm4gYQotICAgc3RyaW5nLiAgKi8KLQotZXh0ZXJuIGludCBlcnJub19tYXggUEFSQU1TICgodm9pZCkpOwotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUgKGUuZy4sIHN0cmVycm5vIChFSU5WQUwpIHJldHVybnMKLSAgICJFSU5WQUwiKS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzdHJlcnJubyBQQVJBTVMgKChpbnQpKTsKLQotLyogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUsIHJldHVybiB0aGUgdmFsdWUuICAqLwotCi1leHRlcm4gaW50IHN0cnRvZXJybm8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIEFOU0kncyBzdHJlcnJvcigpLCBidXQgbW9yZSByb2J1c3QuICAqLwotCi1leHRlcm4gY2hhciAqeHN0cmVycm9yIFBBUkFNUyAoKGludCkpOwotCi0vKiBSZXR1cm4gdGhlIG1heGltdW0gc2lnbmFsIG51bWJlciBmb3Igd2hpY2ggc3Ryc2lnbmFsIHdpbGwgcmV0dXJuIGEKLSAgIHN0cmluZy4gICovCi0KLWV4dGVybiBpbnQgc2lnbm9fbWF4IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmV0dXJuIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nIGZvciBhIHNpZ25hbCBudW1iZXIKLSAgIChlLmcuLCBzdHJzaWduYWwgKFNJR0hVUCkgcmV0dXJucyBzb21ldGhpbmcgbGlrZSAiSGFuZ3VwIikuICAqLwotLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGFzIGl0IGNhbiBjb25mbGljdCB3aXRoIG9uZSBpbiBzeXN0ZW0gaGVhZGVycy4KLSAgIFdlIHN0aWxsIGRvY3VtZW50IGl0cyBleGlzdGVuY2UgdGhvdWdoLiAgKi8KLQotLypleHRlcm4gY29uc3QgY2hhciAqc3Ryc2lnbmFsIFBBUkFNUyAoKGludCkpOyovCi0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBhIHNpZ25hbCBudW1iZXIgKGUuZy4sIHN0cnNpZ25vIChTSUdIVVApIHJldHVybnMKLSAgICJTSUdIVVAiKS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzdHJzaWdubyBQQVJBTVMgKChpbnQpKTsKLQotLyogR2l2ZW4gdGhlIG5hbWUgb2YgYSBzaWduYWwsIHJldHVybiBpdHMgbnVtYmVyLiAgKi8KLQotZXh0ZXJuIGludCBzdHJ0b3NpZ25vIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIHJ1biBieSB4ZXhpdC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLiAgKi8KLQotZXh0ZXJuIGludCB4YXRleGl0IFBBUkFNUyAoKHZvaWQgKCpmbikgKHZvaWQpKSk7Ci0KLS8qIEV4aXQsIGNhbGxpbmcgYWxsIHRoZSBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHhhdGV4aXQuICAqLwotCi0jaWZuZGVmIF9fR05VQ19fCi1leHRlcm4gdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSk7Ci0jZWxzZQotdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBwcm9ncmFtIG5hbWUgdXNlZCBieSB4bWFsbG9jLiAgKi8KLQotZXh0ZXJuIHZvaWQgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgd2l0aG91dCBmYWlsLiAgSWYgbWFsbG9jIGZhaWxzLCB0aGlzIHdpbGwgcHJpbnQgYQotICAgbWVzc2FnZSB0byBzdGRlcnIgKHVzaW5nIHRoZSBuYW1lIHNldCBieSB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUsCi0gICBpZiBhbnkpIGFuZCB0aGVuIGNhbGwgeGV4aXQuICAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciBzaXplX3QuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1leHRlcm4gUFRSIHhtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLS8qIFJlYWxsb2NhdGUgbWVtb3J5IHdpdGhvdXQgZmFpbC4gIFRoaXMgd29ya3MgbGlrZSB4bWFsbG9jLgotCi0gICBGSVhNRTogV2UgZG8gbm90IGRlY2xhcmUgdGhlIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzCi0gICB4bWFsbG9jLiAgKi8KLQotZXh0ZXJuIFBUUiB4cmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgd2l0aG91dCBmYWlsIGFuZCBzZXQgaXQgdG8gemVyby4gIFRoaXMgd29ya3MgbGlrZQotICAgeG1hbGxvYy4gICovCi0KLWV4dGVybiBQVFIgeGNhbGxvYyBQQVJBTVMgKChzaXplX3QsIHNpemVfdCkpOwotCi0vKiBDb3B5IGEgc3RyaW5nIGludG8gYSBtZW1vcnkgYnVmZmVyIHdpdGhvdXQgZmFpbC4gICovCi0KLWV4dGVybiBjaGFyICp4c3RyZHVwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBoZXggY2hhcmFjdGVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcyAqLwotCi0jZGVmaW5lIF9oZXhfYXJyYXlfc2l6ZSAyNTYKLSNkZWZpbmUgX2hleF9iYWQJOTkKLWV4dGVybiBjaGFyIF9oZXhfdmFsdWVbX2hleF9hcnJheV9zaXplXTsKLWV4dGVybiB2b2lkIGhleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgaGV4X3AoYykJKGhleF92YWx1ZSAoYykgIT0gX2hleF9iYWQpCi0vKiBJZiB5b3UgY2hhbmdlIHRoaXMsIG5vdGUgd2VsbDogU29tZSBjb2RlIHJlbGllcyBvbiBzaWRlIGVmZmVjdHMgaW4KLSAgIHRoZSBhcmd1bWVudCBiZWluZyBwZXJmb3JtZWQgZXhhY3RseSBvbmNlLiAgKi8KLSNkZWZpbmUgaGV4X3ZhbHVlKGMpCShfaGV4X3ZhbHVlWyh1bnNpZ25lZCBjaGFyKSAoYyldKQotCi0vKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBwZXhlY3V0ZSByb3V0aW5lLiAgKi8KLQotI2RlZmluZSBQRVhFQ1VURV9GSVJTVCAgIDEKLSNkZWZpbmUgUEVYRUNVVEVfTEFTVCAgICAyCi0jZGVmaW5lIFBFWEVDVVRFX09ORSAgICAgKFBFWEVDVVRFX0ZJUlNUICsgUEVYRUNVVEVfTEFTVCkKLSNkZWZpbmUgUEVYRUNVVEVfU0VBUkNIICA0Ci0jZGVmaW5lIFBFWEVDVVRFX1ZFUkJPU0UgOAotCi0vKiBFeGVjdXRlIGEgcHJvZ3JhbS4gICovCi0KLWV4dGVybiBpbnQgcGV4ZWN1dGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICogY29uc3QgKiwgY29uc3QgY2hhciAqLAotCQkJICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgY2hhciAqKiwgaW50KSk7Ci0KLS8qIFdhaXQgZm9yIHBleGVjdXRlIHRvIGZpbmlzaC4gICovCi0KLWV4dGVybiBpbnQgcHdhaXQgUEFSQU1TICgoaW50LCBpbnQgKiwgaW50KSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCSUJFUlRZX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9DaGFuZ2VMb2cgYi9pbmNsdWRlL21wdy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYmFkODcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotVHVlIEZlYiAyNyAxMjoyMzowNCAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHcuaCAoSEFWRV9WUFJJTlRGKTogQWRkIGFuZCBkZWZpbmUgdG8gaGF2ZSB0aGUgdmFsdWUgMS4KLQotRnJpIERlYyAyOSAxNDo0MDo0NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oIChIQVZFX1NURExJQl9ILCBldGMpOiBEZWZpbmUgdG8gaGF2ZSB0aGUgdmFsdWUgMS4KLQkoSEFWRV9GQ05UTF9IKTogRGVmaW5lLgotCi1Nb24gRGVjIDExIDE1OjM5OjA2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmggKG9wZW4sIGFjY2Vzcyk6IERlZmluZSBhcyBtcHdfb3BlbiBhbmQgbXB3X2FjY2Vzcy4KLQotVGh1IE5vdiAgOSAxNTozODozNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oOiBJbmNsdWRlIHVuaXguaCBpZiBVU0VfTVdfSEVBREVSUywgb3RoZXJ3aXNlIGluY2x1ZGUKLQl2YXJpb3VzIG9yaWdpbmFsIE1QVyBpbmNsdWRlIGZpbGVzIChpb2N0bC5oLCBldGMpLgotCShFSU8pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKiBzeXMvaW9jdGwuaDogUmVtb3ZlLCBub3QgbmVlZGVkLgotCi1XZWQgT2N0IDI1IDEyOjMwOjQ0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3Lmg6IERvbid0IGluY2x1ZGUgZXJybm8uaCBvciBpb2N0bC5oLgotCShFTk9FTlQsIEVBQ0NFUywgRU5PU1lTKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShmZG9wZW4pOiBEZWNsYXJlIGlmIF9fU1REQ19fLgotCShSX09LLCBXX09LLCBYX09LKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCi1UdWUgU2VwIDI2IDE0OjU3OjIxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3Lmg6IE5ldyBmaWxlLCB1bml2ZXJzYWxseSB1c2VmdWwgTVBXIGhvc3QgZGVmaW5pdGlvbnMuCi0JTWFueSBvZiB0aGVzZSB1c2VkIHRvIGxpdmUgaW4gYmZkL2hvc3RzL21wdy5oLgotCSogZ3JwLmg6IFJlbW92ZSBSQ1MgY29tbWVudC4KLQkqIHN5cy9pb2N0bC5oOiBBZGQgYSBjb21tZW50IGxpbmUuCi0KLVdlZCBEZWMgMTQgMTM6MTI6MTQgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBzcGluLmg6IE5ldyBmaWxlLCBjdXJzb3Igc3Bpbm5pbmcgZm9yIHByb2dyZXNzLgotCi1UaHUgSnVuIDMwIDE1OjMyOjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZmNudGwuaCAob3Blbik6IEFsbG93IG9wdGlvbmFsIHRoaXJkIGFyZy4KLQotVGh1IEFwciAxNCAxMjo1NDo1MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGRpci5oLCBkaXJlbnQuaCwgZmNudGwuaCwgZ3JwLmgsIHB3ZC5oLCBzdGF0Lmg6IE5ldyBmaWxlcy4KLQkqIHN5cy9pb2N0bC5oOiBOZXcgZmlsZS4KLQotTW9uIEZlYiAyMSAwOTo0NDo0NSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIHN5cy9zdGF0LmggKHN0cnVjdCBzdGF0KTogTmV3IGZpZWxkIHN0X3JzaXplLgotCShTX0lGTVQsIGV0Yyk6IFVzZSBkaWZmZXJlbnQgYml0IHBvc2l0aW9ucy4KLQkoZnN0YXQpOiBBZGQgcGFyYW1ldGVyIG5hbWVzIHRvIHByb3RvdHlwZS4KLQotTW9uIEphbiAzMSAxOTozMDoxNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogTmV3IGZpbGUuCi0JKiB1dGltZS5oLCB2YXJhcmdzLmg6IE5ldyBmaWxlcywgc2ltdWxhdGVkIFBvc2l4LgotCSogc3lzL3tmaWxlLHBhcmFtLHJlc291cmNlLHN0YXQsdGltZSx0eXBlc30uaDogTmV3IGZpbGVzLCBtb3JlCi0Jc2ltdWxhdGVkIFBvc2l4LgotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L1JFQURNRSBiL2luY2x1ZGUvbXB3L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlOTJkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBpbmNsdWRlIGZpbGVzIHRoYXQgaGVscCBpbWl0YXRlIFBvc2l4IGluIE1QVy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L2Rpci5oIGIvaW5jbHVkZS9tcHcvZGlyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2NkMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvZGlyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBUaGUgPGRpci5oPiBoZWFkZXIgZ2l2ZXMgdGhlIGxheW91dCBvZiBhIGRpcmVjdG9yeS4gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZm5kZWYgX0RJUl9ICi0jZGVmaW5lIF9ESVJfSAotCi0jaWZuZGVmIF9UWVBFU19ICQkvKiBub3QgcXVpdGUgcmlnaHQgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi0jZGVmaW5lCURJUkJMS1NJWgk1MTIJLyogc2l6ZSBvZiBkaXJlY3RvcnkgYmxvY2sgKi8KLQotI2lmbmRlZiBESVJTSVoKLSNkZWZpbmUJRElSU0laCTE0Ci0jZW5kaWYKLQotc3RydWN0IGRpcmVjdCB7Ci0gIGlub190IGRfaW5vOwotICBjaGFyIGRfbmFtZVtESVJTSVpdOwotfTsKLQotI2VuZGlmIC8qIF9ESVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZGlyZW50LmggYi9pbmNsdWRlL21wdy9kaXJlbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwMDBiMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9kaXJlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpZm5kZWYgX19kaXJlbnRfaAotI2RlZmluZSBfX2RpcmVudF9oCi0KLSNpbmNsdWRlICJzeXMvZGlyLmgiCi0KLXN0cnVjdCBkaXJlbnQgewotICBsb25nIGRfaW5vOwkJCS8qIGlub2RlIG51bWJlciBvZiBlbnRyeSAqLwotICBvZmZfdAlkX29mZjsJCQkvKiBvZmZzZXQgb2YgZGlzayBkaXJlY3RvcnkgZW50cnkgKi8KLSAgdW5zaWduZWQgc2hvcnQgZF9yZWNsZW47CS8qIGxlbmd0aCBvZiB0aGlzIHJlY29yZCAqLwotICBjaGFyIGRfbmFtZVsxXTsJCS8qIG5hbWUgb2YgZmlsZSAqLwotfTsKLQotLyoKLSNkZWZpbmUJRElSRU5UQkFTRVNJWkUgXAotCSgoKHN0cnVjdCBkaXJlbnQgKikgMCktPmRfbmFtZSAtIChjaGFyICopIDApCi0jZGVmaW5lCURJUkVOVFNJWkUobmFtZWxlbikgXAotCSgoRElSRU5UQkFTRVNJWkUgKyAobmFtZWxlbikgKyBOQlBXKSAmIH4oTkJQVyAtIDEpKQotKi8KLQotLyogZnJvbSBNaXBzIHBvc2l4L2RpcmVudC5oICovCi0KLS8qCi0jdW5kZWYgcmV3aW5kZGlyCi0qLwotCi1leHRlcm4gRElSICpvcGVuZGlyKCk7Ci1leHRlcm4gc3RydWN0IGRpcmVudCAqcmVhZGRpcigpOwotZXh0ZXJuIHZvaWQJCXJld2luZGRpcigpOwotZXh0ZXJuIGludAkJY2xvc2VkaXIoKTsKLQotI2VuZGlmIC8qICEgX19kaXJlbnRfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZmNudGwuaCBiL2luY2x1ZGUvbXB3L2ZjbnRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOTk5YjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvZmNudGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogRkNudGwuaCAtLSBmYWNjZXNzKCksIGZjbnRsKCksIGFuZCBvcGVuKCkgbW9kZSBmbGFncwotICoKLSAqIFBvcnRpb25zIGNvcHlyaWdodCBBbWVyaWNhbiBUZWxlcGhvbmUgJiBUZWxlZ3JhcGgKLSAqIFVzZWQgd2l0aCBwZXJtaXNzaW9uLCBBcHBsZSBDb21wdXRlciBJbmMuICgxOTg1LDE5ODgsMTk5MCwxOTkyKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0jaWZuZGVmIF9fRkNOVExfXwotI2RlZmluZSBfX0ZDTlRMX18KLQotI2lmbmRlZiBfX1RZUEVTX18KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2VuZGlmCi0KLS8qCi0gKglGb3IgdXNlIGJ5IGxzZWVrKCk6Ci0gKi8KLQotI2lmbmRlZiBfX1NURElPX18JCQkvKiB0aGVzZSBkZWZucyBleGFjdGx5IHBhcmFsbGVkIGluIFN0ZElPLmggZm9yIGZzZWVrKCkgKi8KLSNkZWZpbmUgU0VFS19DVVIJMQotI2RlZmluZSBTRUVLX0VORAkyCi0jZGVmaW5lIFNFRUtfU0VUCTAKLSNlbmRpZgotCi0vKgotICogZmFjY2VzcygpIGNvbW1hbmRzOyBmb3IgZ2VuZXJhbCB1c2UKLSAqLwotIAkJCQkJLyogJ2QnID0+ICJkaXJlY3RvcnkiIG9wcyAqLwotI2RlZmluZSBGX0RFTEVURQkJKCgnZCc8PDgpfDB4MDEpCi0jZGVmaW5lIEZfUkVOQU1FCQkoKCdkJzw8OCl8MHgwMikKLQotLyoKLSAqIG1vcmUgZmFjY2VzcygpIGNvbW1hbmRzOyBmb3IgdXNlIG9ubHkgYnkgTVBXIHRvb2xzCi0gKi8KLSAKLSNkZWZpbmUgRl9PUEVOIAkJCSgoJ2QnPDw4KXwweDAwKQkJLyogcmVzZXJ2ZWQgZm9yIG9wZXJhdGluZyBzeXN0ZW0gdXNlICovCi0JCQkJCS8qICdlJyA9PiAiZWRpdG9yIiBvcHMgKi8KLSNkZWZpbmUgRl9HVEFCSU5GTyAJCSgoJ2UnPDw4KXwweDAwKQkJLyogZ2V0IHRhYiBvZmZzZXQgZm9yIGZpbGUgKi8JCi0jZGVmaW5lIEZfU1RBQklORk8gCQkoKCdlJzw8OCl8MHgwMSkJCS8qIHNldCAJIgkiCQkiCSIgICovCi0jZGVmaW5lIEZfR0ZPTlRJTkZPCQkoKCdlJzw8OCl8MHgwMikJCS8qIGdldCBmb250IG51bWJlciBhbmQgc2l6ZSBmb3IgZmlsZSAqLwotI2RlZmluZSBGX1NGT05USU5GTwkJKCgnZSc8PDgpfDB4MDMpCQkvKiBzZXQgCSIJCSIJIgkiCSIJIiAJICovCi0jZGVmaW5lIEZfR1BSSU5UUkVDCQkoKCdlJzw8OCl8MHgwNCkJCS8qIGdldCBwcmludCByZWNvcmQgZm9yIGZpbGUgKi8KLSNkZWZpbmUgRl9TUFJJTlRSRUMJCSgoJ2UnPDw4KXwweDA1KQkJLyogc2V0IAkiCQkiCSIJIiAJICovCi0jZGVmaW5lIEZfR1NFTElORk8gCQkoKCdlJzw8OCl8MHgwNikJCS8qIGdldCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gZm9yIGZpbGUgKi8KLSNkZWZpbmUgRl9TU0VMSU5GTyAJCSgoJ2UnPDw4KXwweDA3KQkJLyogc2V0CQkiCQkiCQkiCQkiICovCi0jZGVmaW5lIEZfR1dJTklORk8gCQkoKCdlJzw8OCl8MHgwOCkJCS8qIGdldCBjdXJyZW50IHdpbmRvdyBwb3NpdGlvbiAqLwotI2RlZmluZSBGX1NXSU5JTkZPIAkJKCgnZSc8PDgpfDB4MDkpCQkvKiBzZXQJIgkJIgkJIiAJICAgKi8KLSNkZWZpbmUgRl9HU0NST0xMSU5GTwkoKCdlJzw8OCl8MHgwQSkJCS8qIGdldCBzY3JvbGwgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgRl9TU0NST0xMSU5GTwkoKCdlJzw8OCl8MHgwQikJCS8qIHNldCAgICAiICAgCQkiICAJICAqLwotI2RlZmluZSBGX0dNQVJLRVIJCSgoJ2UnPDw4KXwweDBEKQkJLyogR2V0IE1hcmtlciAqLwotI2RlZmluZSBGX1NNQVJLRVIJCSgoJ2UnPDw4KXwweDBDKQkJLyogU2V0ICAgIiAJICAqLwotI2RlZmluZSBGX0dTQVZFT05DTE9TRQkoKCdlJzw8OCl8MHgwRikJCS8qIEdldCBTYXZlIG9uIGNsb3NlICovCi0jZGVmaW5lIEZfU1NBVkVPTkNMT1NFCSgoJ2UnPDw4KXwweDBFKQkJLyogU2V0ICAgIgkgIgkgIiAJICovCi0KLS8qCi0gKglhcmd1bWVudCBzdHJ1Y3R1cmVzIHVzZWQgYnkgdmFyaW91cyBmYWNjZXNzKCkgY29tbWFuZHMKLSAqLwotIAotc3RydWN0IE1hcmtFbGVtZW50IHsKLQlpbnQJCQkJc3RhcnQ7CQkJLyogc3RhcnQgcG9zaXRpb24gb2YgbWFyayAqLwotCWludAkJCQllbmQ7CQkJLyogZW5kIHBvc2l0aW9uICovCi0JdW5zaWduZWQgY2hhcgljaGFyQ291bnQ7CQkvKiBudW1iZXIgb2YgY2hhcnMgaW4gbWFyayBuYW1lICovCi0JY2hhcgkJCW5hbWVbNjRdOwkJLyogbWFyayBuYW1lICovCi19IDsJCQkJCQkJCQkvKiBub3RlOiBtYXJrZXIgbmFtZXMgbWF5IGJlIHVwIHRvIDY0IGNoYXJhY3RlcnMgbG9uZyAqLwotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIHN0cnVjdCBNYXJrRWxlbWVudCBNYXJrRWxlbWVudDsKLSNlbmRpZgotCi1zdHJ1Y3QgU2VsZWN0aW9uUmVjb3JkIHsKLQlsb25nCXN0YXJ0aW5nUG9zOwotCWxvbmcJZW5kaW5nUG9zOwotCWxvbmcJZGlzcGxheVRvcDsKLX07Ci0KLSNpZm5kZWYgX19jcGx1c3BsdXMKLXR5cGVkZWYgc3RydWN0IFNlbGVjdGlvblJlY29yZCBTZWxlY3Rpb25SZWNvcmQ7Ci0jZW5kaWYKLQotCi0vKgotICogTW9kZSB2YWx1ZXMgYWNjZXNzaWJsZSB0byBvcGVuKCkKLSAqLwotI2RlZmluZSBPX1JET05MWQkJIDAgCQkvKiBCaXRzIDAgYW5kIDEgYXJlIHVzZWQgaW50ZXJuYWxseSAqLwotI2RlZmluZSBPX1dST05MWQkJIDEgCQkvKiBWYWx1ZXMgMC4uMiBhcmUgaGlzdG9yaWNhbCAqLwotI2RlZmluZSBPX1JEV1IgCQkJIDIJCS8qIE5PVEU6IGl0IGdvZXMgMCwgMSwgMiwgKiEqIDgsIDE2LCAzMiwgLi4uICovCi0jZGVmaW5lIE9fQVBQRU5ECSgxPDwgMykJCS8qIGFwcGVuZCAod3JpdGVzIGd1YXJhbnRlZWQgYXQgdGhlIGVuZCkgKi8KLSNkZWZpbmUgT19SU1JDIAkJKDE8PCA0KQkJLyogT3BlbiB0aGUgcmVzb3VyY2UgZm9yayAqLwotI2RlZmluZSBPX0FMSUFTCQkoMTw8IDUpCQkvKiBPcGVuIGFsaWFzIGZpbGUgKi8KLSNkZWZpbmUgT19DUkVBVAkJKDE8PCA4KQkJLyogT3BlbiB3aXRoIGZpbGUgY3JlYXRlICovCi0jZGVmaW5lIE9fVFJVTkMJCSgxPDwgOSkJCS8qIE9wZW4gd2l0aCB0cnVuY2F0aW9uICovCi0jZGVmaW5lIE9fRVhDTCAJCSgxPDwxMCkgCS8qIHcvIE9fQ1JFQVQ6ICBFeGNsdXNpdmUgImNyZWF0ZS1vbmx5IiAqLwotI2RlZmluZSBPX0JJTkFSWQkoMTw8MTEpIAkvKiBPcGVuIGFzIGEgYmluYXJ5IHN0cmVhbSAqLwotI2RlZmluZSBPX05SRVNPTFZFCSgxPDwxNCkJCS8qIERvbid0IHJlc29sdmUgYW55IGFsaWFzZXMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICoJCWZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqLwotaW50ICBjbG9zZShpbnQpOwotaW50ICBjcmVhdChjb25zdCBjaGFyKik7Ci1pbnQJIGR1cChpbnQgZmlsZWRlcyk7CQkvKiBPQlNPTEVURTogZmNudGwoZmlsZWRlcywgRl9EVVBGRCwgMCkgaXMgcHJlZmVycmVkICovCi1pbnQJIGZhY2Nlc3MoY2hhciosIHVuc2lnbmVkIGludCwgbG9uZyopOwotaW50ICBmY250bChpbnQsIHVuc2lnbmVkIGludCwgaW50KTsKLWxvbmcgbHNlZWsoaW50LCBsb25nLCBpbnQpOwotaW50ICBvcGVuKGNvbnN0IGNoYXIqLCBpbnQsIC4uLik7Ci1pbnQgIHJlYWQoaW50LCBjaGFyKiwgdW5zaWduZWQpOwotaW50ICB1bmxpbmsoY2hhciopOwotaW50ICB3cml0ZShpbnQsIGNvbnN0IGNoYXIqLCB1bnNpZ25lZCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLS8qCi0gKiBmY250bCgpIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgRl9EVVBGRCAwCSAgIC8qIER1cGxpY2F0ZSBmaWxlcyAoZmlsZSBkZXNjcmlwdG9yKSAqLwotCi0jZW5kaWYgX19GQ05UTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9ncnAuaCBiL2luY2x1ZGUvbXB3L2dycC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWYyYzZhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L2dycC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJzeXMvdHlwZXMuaCIKLQotc3RydWN0IGdyb3VwIHsKLSAgY2hhciAqZ3JfbmFtZTsKLSAgZ2lkX3QgZ3JfZ2lkOwotICBjaGFyICpncl9wYXNzd2Q7Ci0gIGNoYXIgKipncl9tZW07Ci19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvbXB3LmggYi9pbmNsdWRlL21wdy9tcHcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3MDJlNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9tcHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKiBNYWMgTVBXIGhvc3Qtc3BlY2lmaWMgZGVmaW5pdGlvbnMuICovCi0KLSNpZm5kZWYJX19JTkNMVURFX01QV19ICi0jZGVmaW5lIF9fSU5DTFVERV9NUFdfSAotCi0jaWZuZGVmIE1QVwotI2RlZmluZSBNUFcKLSNlbmRpZgotCi0vKiBNUFcgQyBpcyBiYXNpY2FsbHkgQU5TSSwgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIF9fU1REQ19fLAotICAgbm9yIGRvZXMgaXQgYWxsb3cgX19TVERDX18gdG8gYmUgI2RlZmluZWQuICovCi0KLSNpZm5kZWYgQUxNT1NUX1NUREMKLSNkZWZpbmUgQUxNT1NUX1NUREMKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVElNRV9IIDEKLQotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLQotI2RlZmluZSBIQVZFX0VSUk5PX0ggMQotCi0jZGVmaW5lIEhBVkVfU1REREVGX0ggMQotCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotCi0jZGVmaW5lIEhBVkVfU1REQVJHX0ggMQotCi0jZGVmaW5lIEhBVkVfVlBSSU5URiAxCi0KLSNpZmRlZiBVU0VfTVdfSEVBREVSUwotCi0jaW5jbHVkZSA8dW5peC5oPgotCi0jZWxzZQotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLQotI2lmbmRlZglPX0FDQ01PREUKLSNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQotI2VuZGlmCi0KLSNpZm5kZWYgZmlsZW5vCi0jZGVmaW5lIGZpbGVubyhmcCkgKChmcCktPl9maWxlKQotI2VuZGlmCi0KLS8qIHN0ZGlvLmggZG9lcyBub3QgZGVmaW5lIHRoaXMgaWYgX19TVERDX18sIHNvIGRlZmluZSBoZXJlLiAqLwotCi0jaWZkZWYgX19TVERDX18KLUZJTEUgKmZkb3BlbihpbnQgZmlsZGVzLCBjb25zdCBjaGFyICptb2RlKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogVVNFX01XX0hFQURFUlMgKi8KLQotLyogQWRkIGVyc2F0eiBkZWZpbml0aW9ucywgZm9yIHN5c3RlbXMgdGhhdCBsYWNrIHRoZW0uICAqLwotCi0jaWZuZGVmIEVJTwotI2RlZmluZSBFSU8gOTYKLSNlbmRpZgotI2lmbmRlZiBFTk9FTlQKLSNkZWZpbmUgRU5PRU5UIDk3Ci0jZW5kaWYKLSNpZm5kZWYgRUFDQ0VTCi0jZGVmaW5lIEVBQ0NFUyA5OAotI2VuZGlmCi0jaWZuZGVmIEVOT1NZUwotI2RlZmluZSBFTk9TWVMgOTkKLSNlbmRpZgotCi0jaWZuZGVmIFJfT0sKLSNkZWZpbmUgUl9PSyA0Ci0jZGVmaW5lIFdfT0sgMgotI2RlZmluZSBYX09LIDEKLSNlbmRpZgotCi0vKiBCaW5hcnkgZmlsZXMgaGF2ZSBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzOyBmb3IgaW5zdGFuY2UsIG5vIGNyL25sCi0gICB0cmFuc2xhdGlvbi4gKi8KLQotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOCi0KLSNpbmNsdWRlIDxzcGluLmg+Ci0KLSNpZmRlZiBNUFdfQwotI3VuZGVmICBfX1BUUl9UT19JTlQKLSNkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoaW50KShQKSkKLSN1bmRlZiBfX0lOVF9UT19QVFIKLSNkZWZpbmUgX19JTlRfVE9fUFRSKFApICgoY2hhciAqKShQKSkKLSNlbmRpZiAvKiBNUFdfQyAqLwotCi0jZGVmaW5lIE5PX0ZDTlRMCi0KLWludCBmc3RhdCAoKTsKLQotRklMRSAqbXB3X2ZvcGVuICgpOwotaW50IG1wd19mc2VlayAoKTsKLWludCBtcHdfZnJlYWQgKCk7Ci1pbnQgbXB3X2Z3cml0ZSAoKTsKLWludCBtcHdfYWNjZXNzICgpOwotaW50IG1wd19vcGVuICgpOwotaW50IG1wd19jcmVhdCAoKTsKLXZvaWQgbXB3X2Fib3J0ICh2b2lkKTsKLQotLyogTWFwIHRoZXNlIHN0YW5kYXJkIGZ1bmN0aW9ucyB0byBpbXByb3ZlZCB2ZXJzaW9ucyBpbiBsaWJpYmVydHkuICovCi0KLSNkZWZpbmUgZm9wZW4gbXB3X2ZvcGVuCi0jZGVmaW5lIGZzZWVrIG1wd19mc2VlawotI2RlZmluZSBmcmVhZCBtcHdfZnJlYWQKLSNkZWZpbmUgZndyaXRlIG1wd19md3JpdGUKLSNkZWZpbmUgb3BlbiBtcHdfb3BlbgotI2RlZmluZSBhY2Nlc3MgbXB3X2FjY2VzcwotI2RlZmluZSBjcmVhdCBtcHdfY3JlYXQKLSNkZWZpbmUgYWJvcnQgbXB3X2Fib3J0Ci0KLSNkZWZpbmUgUE9TSVhfVVRJTUUKLQotI2RlZmluZSBMT1NJTkdfVE9UQUxMWQotCi0vKiBEZWZpbmUgdGhpcyBzbyB0aGF0IGZpbGVzIHdpbGwgYmUgY2xvc2VkIGJlZm9yZSBiZWluZyB1bmxpbmtlZC4gKi8KLQotI2RlZmluZSBDTE9TRV9CRUZPUkVfVU5MSU5LCi0KLSNlbmRpZiAvKiBfX0lOQ0xVREVfTVBXX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3B3ZC5oIGIvaW5jbHVkZS9tcHcvcHdkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGZiNzAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvcHdkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jaWZuZGVmIF9fcHdkX2gKLSNkZWZpbmUgX19wd2RfaAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLXN0cnVjdCBwYXNzd2QgewotICBjaGFyICpwd19uYW1lOwotICB1aWRfdCBwd191aWQ7Ci0gIGdpZF90IHB3X2dpZDsKLSAgY2hhciAqcHdfZGlyOwotICBjaGFyICpwd19zaGVsbDsKLSAgY2hhciAqcHdfcGFzc3dkOwotfTsKLQotI2VuZGlmIC8qICEgX19wd2RfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3Bpbi5oIGIvaW5jbHVkZS9tcHcvc3Bpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdkMTQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3NwaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qIFByb2dyZXNzIG1hY3JvcyB0aGF0IHVzZSBTcGluQ3Vyc29yIGluIE1QVy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfU1BJTl9ICi0jZGVmaW5lIF9TUElOX0gKLQotLyogRm9yIE1QVywgcHJvZ3Jlc3MgbWFjcm9zIGp1c3QgbmVlZCB0byAic3BpbiB0aGUgY3Vyc29yIiBmcmVxdWVudGx5LAotICAgcHJlZmVyYWJseSBzZXZlcmFsIHRpbWVzIHBlciBzZWNvbmQgb24gYSA2OEsgTWFjLiAgKi8KLQotLyogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIG1lZXRpbmcgdGhlIGdvYWwsIGRlZmluZSB0aGlzIG1hY3JvCi0gICBhbmQgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IG9mIHNwaW5uaW5nIHdpbGwgYmUgY29sbGVjdGVkIGFuZAotICAgZGlzcGxheWVkLiAgKi8KLQotI2RlZmluZSBTUElOX01FQVNVUkVNRU5UCi0KLSNpbmNsdWRlIDxDdXJzb3JDdGwuaD4KLQotLyogUHJvZ3JhbXMgdXNlIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbGVuZ3RoeQotICAgYWN0aXZpdHkuICBTVFIgaWRlbnRpZmllcyB0aGUgcGFydGljdWxhciBhY3Rpdml0eSwgd2hpbGUgTgotICAgaW5kaWNhdGVzIHRoZSBleHBlY3RlZCBkdXJhdGlvbiwgaW4gdW5zcGVjaWZpZWQgdW5pdHMuICBJZiBOIGlzCi0gICB6ZXJvLCB0aGVuIHRoZSBleHBlY3RlZCB0aW1lIHRvIGNvbXBsZXRpb24gaXMgdW5rbm93bi4gICovCi0KLSN1bmRlZiBTVEFSVF9QUk9HUkVTUwotI2RlZmluZSBTVEFSVF9QUk9HUkVTUyhTVFIsTikgbXB3X3N0YXJ0X3Byb2dyZXNzIChTVFIsIE4sIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0KLS8qIFByb2dyYW1zIHVzZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoYXQgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSBvbiBhCi0gICBsZW5ndGh5IGFjdGl2aXR5LiAgKi8KLQotI3VuZGVmIFBST0dSRVNTCi0jaWZkZWYgU1BJTl9NRUFTVVJFTUVOVAotI2RlZmluZSBQUk9HUkVTUyhYKSBtcHdfcHJvZ3Jlc3NfbWVhc3VyZWQgKFgsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0jZWxzZQotI2RlZmluZSBQUk9HUkVTUyhYKSBtcHdfcHJvZ3Jlc3MgKFgpOwotI2VuZGlmIAotCi0vKiBQcm9ncmFtcyB1c2UgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgbGVuZ3RoeSBhY3Rpdml0eS4KLSAgIFNUUiBtdXN0IG1hdGNoIGEgU1RSIHBhc3NlZCB0byBTVEFSVF9QUk9HUkVTUyBwcmV2aW91c2x5LiAgKi8KLQotI3VuZGVmIEVORF9QUk9HUkVTUwotI2RlZmluZSBFTkRfUFJPR1JFU1MoU1RSKSBtcHdfZW5kX3Byb2dyZXNzIChTVFIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0KLWV4dGVybiB2b2lkIG1wd19zdGFydF9wcm9ncmVzcyAoY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKLQotZXh0ZXJuIHZvaWQgbXB3X3Byb2dyZXNzIChpbnQpOwotCi1leHRlcm4gdm9pZCBtcHdfcHJvZ3Jlc3NfbWVhc3VyZWQgKGludCwgY2hhciAqLCBpbnQpOwotCi1leHRlcm4gdm9pZCBtcHdfZW5kX3Byb2dyZXNzIChjaGFyICosIGNoYXIgKiwgaW50KTsKLQotI2VuZGlmIC8qIF9TUElOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N0YXQuaCBiL2luY2x1ZGUvbXB3L3N0YXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3YjhkNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zdGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBUaGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBkZWZpbmVzIGEgc3RydWN0IHRoYXQgaXMgdXNlZCBpbiB0aGUgc3RhdCgpIGFuZAotICogZnN0YXQgZnVuY3Rpb25zLiAgVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgc3RydWN0IGNvbWVzIGZyb20gdGhlIGktbm9kZSBvZgotICogc29tZSBmaWxlLiAgVGhlc2UgY2FsbHMgYXJlIHRoZSBvbmx5IGFwcHJvdmVkIHdheSB0byBpbnNwZWN0IGktbm9kZXMuCi0gKi8KLQotI2lmbmRlZiBfU1RBVF9ICi0jZGVmaW5lIF9TVEFUX0gKLQotI2lmbmRlZiBfVFlQRVNfSAkJLyogbm90IHF1aXRlIHJpZ2h0ICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotc3RydWN0IHN0YXQgewotICBkZXZfdCBzdF9kZXY7CQkJLyogbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciAqLwotICBpbm9fdCBzdF9pbm87CQkJLyogaS1ub2RlIG51bWJlciAqLwotICBtb2RlX3Qgc3RfbW9kZTsJCS8qIGZpbGUgbW9kZSwgcHJvdGVjdGlvbiBiaXRzLCBldGMuICovCi0gIHNob3J0IGludCBzdF9ubGluazsJCS8qICMgbGlua3M7IFRFTVBPUkFSWSBIQUNLOiBzaG91bGQgYmUgbmxpbmtfdCovCi0gIHVpZF90IHN0X3VpZDsJCQkvKiB1aWQgb2YgdGhlIGZpbGUncyBvd25lciAqLwotICBzaG9ydCBpbnQgc3RfZ2lkOwkJLyogZ2lkOyBURU1QT1JBUlkgSEFDSzogc2hvdWxkIGJlIGdpZF90ICovCi0gIGRldl90IHN0X3JkZXY7Ci0gIG9mZl90IHN0X3NpemU7CQkvKiBmaWxlIHNpemUgKi8KLSAgdGltZV90IHN0X2F0aW1lOwkJLyogdGltZSBvZiBsYXN0IGFjY2VzcyAqLwotICB0aW1lX3Qgc3RfbXRpbWU7CQkvKiB0aW1lIG9mIGxhc3QgZGF0YSBtb2RpZmljYXRpb24gKi8KLSAgdGltZV90IHN0X2N0aW1lOwkJLyogdGltZSBvZiBsYXN0IGZpbGUgc3RhdHVzIGNoYW5nZSAqLwotfTsKLQotLyogVHJhZGl0aW9uYWwgbWFzayBkZWZpbml0aW9ucyBmb3Igc3RfbW9kZS4gKi8KLSNkZWZpbmUgU19JRk1UICAwMTcwMDAwCQkvKiB0eXBlIG9mIGZpbGUgKi8KLSNkZWZpbmUgU19JRlJFRyAwMTAwMDAwCQkvKiByZWd1bGFyICovCi0jZGVmaW5lIFNfSUZCTEsgMDA2MDAwMAkJLyogYmxvY2sgc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGRElSIDAwNDAwMDAgIAkvKiBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgU19JRkNIUiAwMDIwMDAwCQkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGSUZPIDAwMTAwMDAJCS8qIHRoaXMgaXMgYSBGSUZPICovCi0jZGVmaW5lIFNfSVNVSUQgMDAwNDAwMAkJLyogc2V0IHVzZXIgaWQgb24gZXhlY3V0aW9uICovCi0jZGVmaW5lIFNfSVNHSUQgMDAwMjAwMAkJLyogc2V0IGdyb3VwIGlkIG9uIGV4ZWN1dGlvbiAqLwotCQkJCS8qIG5leHQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLSNkZWZpbmUgU19JU1ZUWCAgIDAxMDAwCQkvKiBzYXZlIHN3YXBwZWQgdGV4dCBldmVuIGFmdGVyIHVzZSAqLwotCi0vKiBQT1NJWCBtYXNrcyBmb3Igc3RfbW9kZS4gKi8KLSNkZWZpbmUgU19JUldYVSAgIDAwNzAwCQkvKiBvd25lcjogIHJ3eC0tLS0tLSAqLwotI2RlZmluZSBTX0lSVVNSICAgMDA0MDAJCS8qIG93bmVyOiAgci0tLS0tLS0tICovCi0jZGVmaW5lIFNfSVdVU1IgICAwMDIwMAkJLyogb3duZXI6ICAtdy0tLS0tLS0gKi8KLSNkZWZpbmUgU19JWFVTUiAgIDAwMTAwCQkvKiBvd25lcjogIC0teC0tLS0tLSAqLwotCi0jZGVmaW5lIFNfSVJXWEcgICAwMDA3MAkJLyogZ3JvdXA6ICAtLS1yd3gtLS0gKi8KLSNkZWZpbmUgU19JUkdSUCAgIDAwMDQwCQkvKiBncm91cDogIC0tLXItLS0tLSAqLwotI2RlZmluZSBTX0lXR1JQICAgMDAwMjAJCS8qIGdyb3VwOiAgLS0tLXctLS0tICovCi0jZGVmaW5lIFNfSVhHUlAgICAwMDAxMAkJLyogZ3JvdXA6ICAtLS0tLXgtLS0gKi8KLQotI2RlZmluZSBTX0lSV1hPICAgMDAwMDcJCS8qIG90aGVyczogLS0tLS0tcnd4ICovCi0jZGVmaW5lIFNfSVJPVEggICAwMDAwNAkJLyogb3RoZXJzOiAtLS0tLS1yLS0gKi8gCi0jZGVmaW5lIFNfSVdPVEggICAwMDAwMgkJLyogb3RoZXJzOiAtLS0tLS0tdy0gKi8KLSNkZWZpbmUgU19JWE9USCAgIDAwMDAxCQkvKiBvdGhlcnM6IC0tLS0tLS0teCAqLwotCi0vKiBUaGUgZm9sbG93aW5nIG1hY3JvcyB0ZXN0IHN0X21vZGUgKGZyb20gUE9TSVggU2VjLiA1LjYuMS4xLiAqLwotI2RlZmluZSBTX0lTUkVHKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRlJFRykJLyogaXMgYSByZWcgZmlsZSAqLwotI2RlZmluZSBTX0lTRElSKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRkRJUikJLyogaXMgYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgU19JU0NIUihtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZDSFIpCS8qIGlzIGEgY2hhciBzcGVjICovCi0jZGVmaW5lIFNfSVNCTEsobSkJKChtICYgU19JRk1UKSA9PSBTX0lGQkxLKQkvKiBpcyBhIGJsb2NrIHNwZWMgKi8KLSNkZWZpbmUgU19JU0ZJRk8obSkJKChtICYgU19JRk1UKSA9PSBTX0lGSUZPKQkvKiBpcyBhIHBpcGUvRklGTyAqLwotCi0KLS8qIEZ1bmN0aW9uIFByb3RvdHlwZXMuICovCi0jaWZuZGVmIF9BTlNJX0gKLSNpbmNsdWRlIDxhbnNpLmg+Ci0jZW5kaWYKLQotX1BST1RPVFlQRSggaW50IGNobW9kLCAoY29uc3QgY2hhciAqX3BhdGgsIGludCBfbW9kZSkJCQkpOwotX1BST1RPVFlQRSggaW50IGZzdGF0LCAoaW50IF9maWxkZXMsIHN0cnVjdCBzdGF0ICpfYnVmKQkJCSk7Ci1fUFJPVE9UWVBFKCBpbnQgbWtkaXIsIChjb25zdCBjaGFyICpfcGF0aCwgaW50IF9tb2RlKQkJCSk7Ci1fUFJPVE9UWVBFKCBpbnQgbWtmaWZvLCAoY29uc3QgY2hhciAqX3BhdGgsIGludCBfbW9kZSkJCQkpOwotX1BST1RPVFlQRSggaW50IHN0YXQgLCAoY29uc3QgY2hhciAqX3BhdGgsIHN0cnVjdCBzdGF0ICpfYnVmKQkJKTsKLV9QUk9UT1RZUEUoIG1vZGVfdCB1bWFzaywgKGludCBfY21hc2spCQkJCQkpOwotCi0jZW5kaWYgLyogX1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3lzL2ZpbGUuaCBiL2luY2x1ZGUvbXB3L3N5cy9maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYThjMTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3lzL2ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaCBiL2luY2x1ZGUvbXB3L3N5cy9wYXJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE4YzE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9wYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oIGIvaW5jbHVkZS9tcHcvc3lzL3Jlc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTQzOWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3lzL3Jlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNpZm5kZWYgX19TWVNfUkVTT1VSQ0VfSF9fCi0jZGVmaW5lIF9fU1lTX1JFU09VUkNFX0hfXwotCi1zdHJ1Y3QgcnVzYWdlIHsKLSAgc3RydWN0IHRpbWV2YWwgcnVfdXRpbWU7Ci0gIHN0cnVjdCB0aW1ldmFsIHJ1X3N0aW1lOwotfTsKLQotI2VuZGlmIC8qIF9fU1lTX1JFU09VUkNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3lzL3N0YXQuaCBiL2luY2x1ZGUvbXB3L3N5cy9zdGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NWM3MmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3lzL3N0YXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIEltaXRhdGlvbiBzeXMvc3RhdC5oLiAqLwotCi0jaWZuZGVmIF9fU1lTX1NUQVRfSF9fCi0jZGVmaW5lIF9fU1lTX1NUQVRfSF9fCi0KLSNpbmNsdWRlICA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSAgPHRpbWUuaD4KLQotc3RydWN0IHN0YXQgewotICBkZXZfdCAgIHN0X2RldjsKLSAgaW5vX3QgICBzdF9pbm87Ci0gIG1vZGVfdCAgc3RfbW9kZTsKLSAgc2hvcnQgICBzdF9ubGluazsKLSAgdWlkX3QgICBzdF91aWQ7Ci0gIGdpZF90ICAgc3RfZ2lkOwotICBkZXZfdCAgIHN0X3JkZXY7Ci0gIG9mZl90ICAgc3Rfc2l6ZTsKLSAgb2ZmX3QgICBzdF9yc2l6ZTsKLSAgdGltZV90ICBzdF9hdGltZTsKLSAgaW50ICAgICBzdF9zcGFyZTE7Ci0gIHRpbWVfdCAgc3RfbXRpbWU7Ci0gIGludCAgICAgc3Rfc3BhcmUyOwotICB0aW1lX3QgIHN0X2N0aW1lOwotICBpbnQgICAgIHN0X3NwYXJlMzsKLSAgbG9uZyAgICBzdF9ibGtzaXplOwotICBsb25nICAgIHN0X2Jsb2NrczsKLSAgbG9uZyAgICBzdF9zcGFyZTRbMl07Ci19OwotCi0jZGVmaW5lIFNfSUZNVAkwMTcwMDAwTAotI2RlZmluZSBTX0lGRElSCTAwNDAwMDBMCi0jZGVmaW5lIFNfSUZSRUcgMDEwMDAwMEwKLSNkZWZpbmUgU19JUkVBRCAgICAwNDAwCi0jZGVmaW5lIFNfSVdSSVRFICAgMDIwMAotI2RlZmluZSBTX0lFWEVDICAgIDAxMDAKLQotI2RlZmluZSBTX0lGSUZPIDAxMDAwMCAgLyogRklGTyBzcGVjaWFsICovCi0jZGVmaW5lIFNfSUZDSFIgMDIwMDAwICAvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGQkxLIDAzMDAwMCAgLyogYmxvY2sgc3BlY2lhbCAqLwotCi1pbnQgc3RhdCAoY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKmJ1Zik7Ci1pbnQgZnN0YXQgKGludCBmZCwgc3RydWN0IHN0YXQgKmJ1Zik7Ci0KLSNlbmRpZiAvKiBfX1NZU19TVEFUX0hfX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy90aW1lLmggYi9pbmNsdWRlL21wdy9zeXMvdGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWU0ODUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy90aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKiBJbWl0YXRpb24gc3lzL3RpbWUuaC4gKi8KLQotI2lmbmRlZiBfX1NZU19USU1FX0hfXwotI2RlZmluZSBfX1NZU19USU1FX0hfXwotCi0jaW5jbHVkZSA8dGltZS5oPgotCi1zdHJ1Y3QgdGltZXZhbCB7Ci0gIGxvbmcgdHZfc2VjOwotICBsb25nIHR2X3VzZWM7Ci19OwotCi0jZW5kaWYgLyogX19TWVNfVElNRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oIGIvaW5jbHVkZS9tcHcvc3lzL3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDljOWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3lzL3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKiBJbWl0YXRpb24gc3lzL3R5cGVzLmguICovCi0KLSNpZm5kZWYgX19TWVNfVFlQRVNfSF9fCi0jZGVmaW5lIF9fU1lTX1RZUEVTX0hfXwotCi0jaW5jbHVkZSA8VHlwZXMuaD4KLQotdHlwZWRlZiBzaG9ydCBkZXZfdDsKLXR5cGVkZWYgc2hvcnQgaW5vX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG1vZGVfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGdpZF90OwotdHlwZWRlZiBsb25nIG9mZl90OwotCi0jZW5kaWYgLyogX19TWVNfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy91dGltZS5oIGIvaW5jbHVkZS9tcHcvdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiZjY2ZjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCi1zdHJ1Y3QgdXRpbWJ1ZiB7Ci0gIHRpbWVfdCBhY3RpbWU7Ci0gIHRpbWVfdCBtb2R0aW1lOwotfTsKLQotaW50IHV0aW1lIChjaGFyICosIHN0cnVjdCB1dGltYnVmICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvdmFyYXJncy5oIGIvaW5jbHVkZS9tcHcvdmFyYXJncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I5ZTQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyogdmFyYXJncy5oLiAqLwotI2lmbmRlZiBfX3ZhX2xpc3RfXwotI2RlZmluZSBfX3ZhX2xpc3RfXwotdHlwZWRlZiBjaGFyICp2YV9saXN0OwotI2VuZGlmCi0jZGVmaW5lIHZhX2RjbCBpbnQgdmFfYWxpc3Q7Ci0jZGVmaW5lIHZhX3N0YXJ0KGxpc3QpIGxpc3QgPSAoY2hhciAqKSAmdmFfYWxpc3QKLSNkZWZpbmUgdmFfZW5kKGxpc3QpCi0jZGVmaW5lIHZhX2FyZyhsaXN0LG1vZGUpICgobW9kZSAqKShsaXN0ICs9IHNpemVvZihtb2RlKSkpWy0xXQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vQ2hhbmdlTG9nIGIvaW5jbHVkZS9ubG0vQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWVhM2QwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmxtL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLUZyaSBNYXkgIDYgMTM6MzE6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBleHRlcm5hbC5oIChubG1OQU1FKEV4dGVybmFsX0N1c3RvbV9IZWFkZXIpKTogQWRkIGxlbmd0aCwKLQlkYXRhT2Zmc2V0LCBhbmQgZGF0YVN0YW1wIGZpZWxkLgotCShubG1OQU1FKEV4dGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSk6IFJlbW92ZS4KLQkqIGludGVybmFsLmggKE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyKTogQWRkIGhkckxlbmd0aCwKLQlkYXRhT2Zmc2V0LCBkYXRhU3RhbXAgYW5kIGhkciBmaWVsZHMuCi0KLUZyaSBBcHIgMjIgMTE6MTI6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBleHRlcm5hbC5oIChzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcikpOiBSZW5hbWUKLQlmcm9tIG5sbU5BTUUoZXh0ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyKS4gIENoYW5nZSBzdGFtcCBmaWVsZAotCXRvIDggYnl0ZXMuICBBZGQgYnl0ZXMgZmllbGQuCi0JKiBpbnRlcm5hbC5oIChubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIpOiBSZW5hbWUgZnJvbQotCW5sbV9pbnRlcm5hbF9jeWdudXNfc2VjdGlvbl9oZWFkZXIuICBDaGFuZ2Ugc3RhbXAgZmllbGQgdG8gOAotCWJ5dGVzLgotCi1UaHUgQXByIDIxIDExOjU3OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IG5sbV9pbnRlcm5hbF9jeWdudXNfc2VjdGlvbl9oZWFkZXIpOiBEZWZpbmUuCi0JKiBleHRlcm5hbC5oIChzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jeWdudXNfc2VjdGlvbl9oZWFkZXIpOgotCURlZmluZS4KLQotV2VkIEFwciAyMCAxNDoyNzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKHN0cnVjdCBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcik6IFJlbW92ZQotCWRlYnVnUmVjT2Zmc2V0IGFuZCBkZWJ1Z1JlY0xlbmd0aCBmaWVsZHMuICBBZGQgZGF0YSBmaWVsZC4KLQkqIGV4dGVybmFsLmggKHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2N1c3RvbV9oZWFkZXIpKTogUmVtb3ZlCi0JZGVidWdSZWNPZmZzZXQgYW5kIGRlYnVnUmVjTGVuZ3RoIGZpZWxkcy4KLQotTW9uIEZlYiAgNyAwODoyODo0MCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQotVGh1IERlYyAgMiAxNDoxNDo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFscGhhLWV4dC5oOiBOZXcgZmlsZSBkZXNjcmliaW5nIGZvcm1hdHMgb2YgaW5mb3JtYXRpb24gaW4gQWxwaGEKLQlOZXRXYXJlIGZpbGVzLgotCSogY29tbW9uLmg6IERlZmluZSBzb21lIG5vbi1leHRlcm5hbCBBbHBoYSBpbmZvcm1hdGlvbi4KLQotV2VkIE5vdiAxNyAxNzozODo1OCAxOTkzICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogZXh0ZXJuYWwuaDogRG9uJ3QgZGVmaW5lIGV4dGVybmFsX2ZpeGVkX2hlYWRlciBoZXJlLgotCSogaTM4Ni1leHQuaCwgc3BhcmMzMi1leHQuaDogTmV3IGhlYWRlciBmaWxlcyB0byBkZWZpbmUKLQlleHRlcm5hbF9maXhlZF9oZWFkZXIgZm9yIHBhcnRpY3VsYXIgQ1BVJ3MuCi0KLVdlZCBPY3QgMjcgMTE6NDU6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKTogQWRkZWQgZmllbGRzCi0Jc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgYW5kIHNoYXJlZERlYnVnUmVjb3JkQ291bnQuCi0JKiBleHRlcm5hbC5oIChObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcikpOiBMaWtld2lzZS4KLQotCSogY29tbW9uLmggKE5MTV9TSUdOQVRVUkUpOiBEbyBub3QgZGVmaW5lIChpdCdzIGRpZmZlcmVudCBmb3IgZWFjaAotCWJhY2tlbmQpLgotCi1UdWUgQXVnIDMxIDEzOjI0OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIGxlbmd0aCBmaWVsZHMgb2YgdHlwZSBjaGFyIHRvIHR5cGUgdW5zaWduZWQKLQljaGFyLgotCi1TYXQgSnVsIDMxIDAyOjEyOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKE5MTV9ISUJJVCwgTkxNX0hFQURFUl9WRVJTSU9OKTogRGVmaW5lLgotCi1UaHUgSnVsIDIyIDE2OjA5OjQ3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoTkxNX0NBVCosIE5MTV9BUkNIX1NJWkUsIE5MTV9UQVJHRVRfTE9OR19TSVpFLAotCU5MTV9UQVJHRVRfQUREUkVTU19TSVpFLCBOTE1fTkFNRSwgTmxtTkFNRSwgbmxtTkFNRSk6ICBOZXcKLQltYWNyb3MuCi0JKiBleHRlcm5hbC5oIChUQVJHRVRfTE9OR19TSVpFLCBUQVJHRVRfQUREUkVTU19TSVpFKTogUmVtb3ZlCi0JbWFjcm9zLCBjb252ZXJ0IHVzYWdlcyB0byBOTE1fIGVxdWl2YWxlbnRzLgotCSogZXh0ZXJuYWwuaDogIFVzZSBubG1OQU1FIGFuZCBObG1OQU1FIG1hY3JvcyB0byBkZXJpdmUgYm90aAotCTMyIGFuZCA2NCBiaXQgdmVyc2lvbnMuCi0KLU1vbiBKdWwgMTkgMjI6MTI6NDAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIChjb21tb24uaCwgZXh0ZXJuYWwuaCwgaW50ZXJuYWwuaCk6ICBOZXcgZmlsZXMgZm9yIE5MTS9OZXRXYXJlCi0Jc3VwcG9ydC4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vYWxwaGEtZXh0LmggYi9pbmNsdWRlL25sbS9hbHBoYS1leHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxOTlkZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9hbHBoYS1leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKiBBbHBoYSBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFuIEFscGhhIE5MTSBzdGFydHMgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyCi17Ci0gIC8qIE1hZ2ljIG51bWJlci4gIE11c3QgYmUgTkxNMzJfQUxQSEFfTUFHSUMuICAqLwotICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzRdOwotICAvKiBGb3JtYXQgZGVzY3JpcHRvci4gIEN1cnJlbnQgdmFsdWUgaXMgMi4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0WzRdOwotICAvKiBTaXplIG9mIHByZWZpeCBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHNpemVbNF07Ci0gIC8qIFBhZGRpbmcuICAqLwotICB1bnNpZ25lZCBjaGFyIHBhZDFbNF07Ci0gIC8qIE1vcmUgZmllbGRzIG1heSBiZSBhZGRlZCBsYXRlciwgc3VwcG9zZWRseS4gICovCi19OwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybWF0IG9mIGFuIEFscGhhIE5MTSByZWxvYy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgYW4KLSAgIEFscGhhIEVDT0ZGIHJlbG9jLiAgKi8KLQotc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3JlbG9jCi17Ci0gIHVuc2lnbmVkIGNoYXIgcl92YWRkcls4XTsKLSAgdW5zaWduZWQgY2hhciByX3N5bW5keFs0XTsKLSAgdW5zaWduZWQgY2hhciByX2JpdHNbNF07Ci19OwotCi0vKiBDb25zdGFudHMgdG8gdW5wYWNrIHRoZSByX2JpdHMgZmllbGQgb2YgYSByZWxvYy4gICovCi0KLSNkZWZpbmUgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUJCQkweGZmCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFCQkwCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRQkJMHgwMQotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUJCTB4N2UKLSNkZWZpbmUgUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRQkJMQotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX1JFU0VSVkVEX0xJVFRMRQkJMHg4MAotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUJCTcKLSNkZWZpbmUgUkVMT0NfQklUUzJfUkVTRVJWRURfTElUVExFCQkweGZmCi0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFCTEKLSNkZWZpbmUgUkVMT0NfQklUUzNfUkVTRVJWRURfTElUVExFCQkweDAzCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFCTkKLQotI2RlZmluZSBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRQkJCTB4ZmMKLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUJCTIKLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfZml4ZWRfaGVhZGVyCi17Ci0KLSAgLyogVGhlIHNpZ25hdHVyZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBmaWxlIGFzIGFuIE5MTS4gIEl0IG11c3QgY29udGFpbgotICAgICB0aGUgc2lnbmF0dXJlIHN0cmluZywgd2hpY2ggZGVwZW5kcyB1cG9uIHRoZSBOTE0gdGFyZ2V0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlWzI0XTsKLQotICAvKiBUaGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyLiAgQXQgdGhpcyB0aW1lLCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlcgotICAgICBpcyA0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgdmVyc2lvbls0XTsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCB3aGljaCBtdXN0IGJlIGEgRE9TIG5hbWUgKDEtOCBjaGFyYWN0ZXJzIGZvbGxvd2VkCi0gICAgIGJ5IGEgcGVyaW9kIGFuZCBhIDEtMyBjaGFyYWN0ZXIgZXh0ZW5zaW9uKS4gIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBieXRlCi0gICAgIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgdGhlIGxhc3QgYnl0ZSBpcyBhIG51bGwgdGVybWluYXRvciBieXRlLiAgVGhpcwotICAgICBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIGFuZCBhbnkgdW51c2VkIGJ5dGVzIHNob3VsZCBiZSBudWxsIGJ5dGVzLiAgVGhlCi0gICAgIHZhbHVlIGlzIHNldCBieSB0aGUgT1VUUFVUIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZU5hbWVbMTRdOwotCi0gIC8qIFBhZGRpbmcgdG8gbWFrZSBpdCBjb21lIG91dCBjb3JyZWN0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgcGFkMVsyXTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGNvZGUgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAotICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCi0gICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gIEl0IGlzIHBvc3NpYmxlCi0gICAgIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBjdXN0b20gZGF0YS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGN1c3RvbSBkYXRhLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgVGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIE1PRFVMRSBrZXl3b3JkIGluCi0gICAgIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0gICAgIAotICB1bnNpZ25lZCBjaGFyIHJlbG9jYXRpb25GaXh1cE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4dGVybmFsUmVmZXJlbmNlc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHVibGljc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUHVibGljc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGludGVybmFsIGRlYnVnIGluZm8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGVidWdJbmZvT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZEZWJ1Z1JlY29yZHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjb2RlU3RhcnRPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleGl0UHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVUeXBlWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3NbNF07Ci0KLX0gTmxtMzJfYWxwaGFfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vY29tbW9uLmggYi9pbmNsdWRlL25sbS9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NTUwYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0vKiBTZW1pLXBvcnRhYmxlIHN0cmluZyBjb25jYXRlbmF0aW9uIGluIGNwcC4KLSAgIFRoZSBOTE1fQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQwotICAgcHJlcHJvY2Vzc29ycy4gIFRoZSBwcm9ibGVtIGlzLCAiMzJfIiBvciAiNjRfIiBhcmUgbm90IGEgdmFsaWQKLSAgIHByZXByb2Nlc3NpbmcgdG9rZW5zLCBhbmQgd2UgZG9uJ3Qgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwKLSAgICJubG1fMzJfIikuICBUaGUgWE5MTV9DQVQyIG1hY3JvIHdpbGwgY2F1c2UgdGhlIGlubmVyIE5MTV9DQVQgbWFjcm9zCi0gICB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuICBUaGVuIHRoZQotICAgZmluYWwgY29uY2F0ZW5hdGlvbiBjYW4gYmUgZG9uZS4gIChTaWdoLikgICovCi0KLSNpZmRlZiBTQUJFUgotIyAgZGVmaW5lIE5MTV9DQVQoYSxiKQkJYSMjYgotIyAgZGVmaW5lIE5MTV9DQVQzKGEsYixjKQlhIyNiIyNjCi0jICBkZWZpbmUgTkxNX0NBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSMgIGlmZGVmIF9fU1REQ19fCi0jICAgIGRlZmluZSBOTE1fQ0FUKGEsYikJYSMjYgotIyAgICBkZWZpbmUgTkxNX0NBVDMoYSxiLGMpCWEjI2IjI2MKLSMgICAgZGVmaW5lIFhOTE1fQ0FUMihhLGIpCU5MTV9DQVQoYSxiKQotIyAgICBkZWZpbmUgTkxNX0NBVDQoYSxiLGMsZCkJWE5MTV9DQVQyKE5MTV9DQVQoYSxiKSxOTE1fQ0FUKGMsZCkpCi0jICBlbHNlCi0jICAgIGRlZmluZSBOTE1fQ0FUKGEsYikJYS8qKi9iCi0jICAgIGRlZmluZSBOTE1fQ0FUMyhhLGIsYykJYS8qKi9iLyoqL2MKLSMgICAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCWEvKiovYi8qKi9jLyoqL2QKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogSWYgTkxNX0FSQ0hfU0laRSBpcyBub3QgZGVmaW5lZCwgZGVmYXVsdCB0byAzMi4gIE5MTV9BUkNIX1NJWkUgaXMKLSAgIG9wdGlvbmFsbHkgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24uICovCi0KLSNpZm5kZWYgTkxNX0FSQ0hfU0laRQotIyAgZGVmaW5lIE5MTV9BUkNIX1NJWkUJCQkzMgotI2VuZGlmCi0KLSNpZiBOTE1fQVJDSF9TSVpFID09IDMyCi0jICBkZWZpbmUgTkxNX1RBUkdFVF9MT05HX1NJWkUJCTQKLSMgIGRlZmluZSBOTE1fVEFSR0VUX0FERFJFU1NfU0laRQk0Ci0jICBkZWZpbmUgTkxNX05BTUUoeCx5KQkJCU5MTV9DQVQ0KHgsMzIsXyx5KQotIyAgZGVmaW5lIE5MTV9ISUJJVAkJCSgoKGJmZF92bWEpIDEpIDw8IDMxKQotI2VuZGlmCi0jaWYgTkxNX0FSQ0hfU0laRSA9PSA2NAotIyAgZGVmaW5lIE5MTV9UQVJHRVRfTE9OR19TSVpFCQk4Ci0jICBkZWZpbmUgTkxNX1RBUkdFVF9BRERSRVNTX1NJWkUJOAotIyAgZGVmaW5lIE5MTV9OQU1FKHgseSkJCQlOTE1fQ0FUNCh4LDY0LF8seSkKLSMgIGRlZmluZSBOTE1fSElCSVQJCQkoKChiZmRfdm1hKSAxKSA8PCA2MykKLSNlbmRpZgotCi0jZGVmaW5lIE5sbU5BTUUoWCkJCU5MTV9OQU1FKE5sbSxYKQotI2RlZmluZSBubG1OQU1FKFgpCQlOTE1fTkFNRShubG0sWCkKLQotLyogR2l2ZSBuYW1lcyB0byB0aGluZ3MgdGhhdCBzaG91bGQgbm90IGNoYW5nZS4gKi8KLQotI2RlZmluZSBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSAkJMTI3Ci0jZGVmaW5lIE5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RICQk3MQotI2RlZmluZSBOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSAkJNzEKLSNkZWZpbmUgTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEgJMjU1Ci0jZGVmaW5lIE5MTV9PVEhFUl9EQVRBX0xFTkdUSCAJCQk0MDAJCS8qIEZJWE1FICovCi0jZGVmaW5lIE5MTV9PTERfVEhSRUFEX05BTUVfTEVOR1RICQk1Ci0jZGVmaW5lIE5MTV9TSUdOQVRVUkVfU0laRQkJCTI0Ci0jZGVmaW5lIE5MTV9IRUFERVJfVkVSU0lPTgkJCTQKLSNkZWZpbmUgTkxNX01PRFVMRV9OQU1FX1NJWkUJCQkxNAotI2RlZmluZSBOTE1fREVGQVVMVF9TVEFDS1NJWkUJCQkoOCAqIDEwMjQpCi0MCi0vKiBBbHBoYSBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGluIGEgc2VwYXJhdGUgQWxwaGEKLSAgIGhlYWRlciBmaWxlLCBidXQgaXQgY2FuJ3QgZ28gaW4gYWxwaGEtZXh0LmggYmVjYXVzZSBzb21lIG9mIGl0IGlzCi0gICBuZWVkZWQgYnkgbmxtY29udi5jLiAgKi8KLQotLyogTWFnaWMgbnVtYmVyIGluIEFscGhhIHByZWZpeCBoZWFkZXIuICAqLwotI2RlZmluZSBOTE0zMl9BTFBIQV9NQUdJQyAoMHg4MzU2MTg0MCkKLQotLyogVGhlIHJfdHlwZSBmaWVsZCBpbiBhbiBBbHBoYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lHTk9SRQkJMAotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkyCi0jZGVmaW5lIEFMUEhBX1JfR1BSRUwzMgkJMwotI2RlZmluZSBBTFBIQV9SX0xJVEVSQUwJCTQKLSNkZWZpbmUgQUxQSEFfUl9MSVRVU0UJCTUKLSNkZWZpbmUgQUxQSEFfUl9HUERJU1AJCTYKLSNkZWZpbmUgQUxQSEFfUl9CUkFERFIJCTcKLSNkZWZpbmUgQUxQSEFfUl9ISU5UCQk4Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDE2CQk5Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDMyCSAgICAgICAxMAotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkgICAgICAgMTEKLSNkZWZpbmUgQUxQSEFfUl9PUF9QVVNICSAgICAgICAxMgotI2RlZmluZSBBTFBIQV9SX09QX1NUT1JFICAgICAgIDEzCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkgICAgICAgMTQKLSNkZWZpbmUgQUxQSEFfUl9PUF9QUlNISUZUICAgICAxNQotI2RlZmluZSBBTFBIQV9SX0dQVkFMVUUJICAgICAgIDE2Ci0jZGVmaW5lIEFMUEhBX1JfTldfUkVMT0MgICAgICAyNTAKLQotLyogQSBsb2NhbCByZWxvYywgb3RoZXIgdGhhbiBBTFBIQV9SX0dQRElTUCBvciBBTFBIQV9SX0lHTk9SRSwgbXVzdCBiZQotICAgYWdhaW5zdCBvbmUgb2YgdGhlc2Ugc3ltYm9sIGluZGljZXMuICAqLwotI2RlZmluZSBBTFBIQV9SRUxPQ19TRUNUSU9OX1RFWFQJMQotI2RlZmluZSBBTFBIQV9SRUxPQ19TRUNUSU9OX0RBVEEJMwotCi0vKiBBbiBBTFBIQV9SX05XX1JFTE9DIGhhcyBvbmUgb2YgdGhlc2UgdmFsdWVzIGluIHRoZSBzaXplIGZpZWxkLiAgSWYKLSAgIGl0IGlzIFNFVEdQLCB0aGUgcl92YWRkciBmaWVsZCBob2xkcyB0aGUgR1AgdmFsdWUgdG8gdXNlLiAgSWYgaXQgaXMKLSAgIExJVEEsIHRoZSByX3ZhZGRyIGZpZWxkIGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSAubGl0YSBzZWN0aW9uIGFuZAotICAgdGhlIHJfc3ltbmR4IGZpZWxkIGhvbGRzIHRoZSBzaXplIG9mIHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9OV19SRUxPQ19TRVRHUAkxCi0jZGVmaW5lIEFMUEhBX1JfTldfUkVMT0NfTElUQQkyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9leHRlcm5hbC5oIGIvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3YTViYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9leHRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkxNIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBkZXNjcmliZSBob3cgTkxNIGlzIHJlcHJlc2VudGVkIGV4dGVybmFsbHkgYnkgdGhlIEJGRCBsaWJyYXJ5LgotICAgSS5FLiBpdCBkZXNjcmliZXMgdGhlIGluLWZpbGUgcmVwcmVzZW50YXRpb24gb2YgTkxNLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBubG0vY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLgotCi0gICBOb3RlIHRoYXQgYW4gTkxNIGhlYWRlciBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0czoKLQotICAgKDEpCUEgZml4ZWQgbGVuZ3RoIGhlYWRlciB0aGF0IGhhcyBzcGVjaWZpYyBmaWVsZHMgb2Yga25vd24gbGVuZ3RoLAotCWF0IHNwZWNpZmljIG9mZnNldHMgaW4gdGhlIGZpbGUuIAotCi0gICAoMikgIEEgdmFyaWFibGUgbGVuZ3RoIGhlYWRlciB0aGF0IGhhcyBzcGVjaWZpYyBmaWVsZHMgaW4gYSBzcGVjaWZpYwotICAgICAgICBvcmRlciwgYnV0IHNvbWUgZmllbGRzIG1heSBiZSB2YXJpYWJsZSBsZW5ndGguCi0KLSAgICgzKQlBIGF1eGlsaWFyeSBoZWFkZXIgdGhhdCBoYXMgdmFyaW91cyBvcHRpb25hbCBmaWVsZHMgaW4gbm8gc3BlY2lmaWMKLSAgICAgICAgb3JkZXIuICBUaGVyZSBpcyBubyB3YXkgdG8gaWRlbnRpZnkgdGhlIGVuZCBvZiB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMKLQlleGNlcHQgYnkgZmluZGluZyBhIGhlYWRlciB3aXRob3V0IGEgcmVjb2duaXplZCAnc3RhbXAnLgotCi0gICBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoZSBmaXhlZCBsZW5ndGggaGVhZGVyIHVuZm9ydHVuYXRlbHkgdmFyaWVzCi0gICBmcm9tIG9uZSBOTE0gdGFyZ2V0IHRvIGFub3RoZXIsIGR1ZSB0byBwYWRkaW5nLiAgRWFjaCB0YXJnZXQKLSAgIGRlZmluZXMgdGhlIGNvcnJlY3QgZXh0ZXJuYWwgZm9ybWF0IGluIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUuCi0KLSovCi0gICAKLS8qIE5MTSBIZWFkZXIgKi8KLQotLyogVGhlIHZlcnNpb24gaGVhZGVyIGlzIG9uZSBvZiB0aGUgb3B0aW9uYWwgYXV4aWxpYXJ5IGhlYWRlcnMgYW5kCi0gICBmb2xsb3dzIHRoZSBmaXhlZCBsZW5ndGggYW5kIHZhcmlhYmxlIGxlbmd0aCBOTE0gaGVhZGVycy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF92ZXJzaW9uX2hlYWRlcikKLXsKLQotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIlZlUnNJb04jIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0KLSAgdW5zaWduZWQgY2hhciBtYWpvclZlcnNpb25bTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWlub3JWZXJzaW9uW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJldmlzaW9uW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHllYXJbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9udGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgZGF5W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotfSBObG1OQU1FKEV4dGVybmFsX1ZlcnNpb25fSGVhZGVyKTsKLQotCi10eXBlZGVmIHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2NvcHlyaWdodF9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDb1B5UmlHaFQ9IiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0KLSAgY2hhciBzdGFtcFsxMF07Ci0KLSAgdW5zaWduZWQgY2hhciBjb3B5cmlnaHRNZXNzYWdlTGVuZ3RoWzFdOwotCi0gIC8qIFRoZXJlIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGZpZWxkIGhlcmUgY2FsbGVkICdjb3B5cmlnaHRNZXNzYWdlJwotICAgICB0aGF0IGlzIHRoZSBsZW5ndGggc3BlY2lmaWVkIGJ5IGNvcHlyaWdodE1lc3NhZ2VMZW5ndGguICovCi0KLX0gTmxtTkFNRShFeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKTsKLQotCi10eXBlZGVmIHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2V4dGVuZGVkX2hlYWRlcikKLXsKLQotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIk1lU3NBZ0VzIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0KLSAgY2hhciBzdGFtcFs4XTsKLQotICB1bnNpZ25lZCBjaGFyIGxhbmd1YWdlSURbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWVzc2FnZUZpbGVPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWVzc2FnZUZpbGVMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWVzc2FnZUNvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIGhlbHBGaWxlT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIGhlbHBGaWxlTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIFJQQ0RhdGFPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgUlBDRGF0YUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRDb2RlT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZENvZGVMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRGF0YU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWREYXRhTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRFeHRlcm5hbFJlZmVyZW5jZUNvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZFB1YmxpY3NPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkUHVibGljc0NvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZERlYnVnUmVjb3JkQ291bnRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXRbTkxNX1RBUkdFVF9BRERSRVNTX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldFtOTE1fVEFSR0VUX0FERFJFU1NfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBwcm9kdWN0SURbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQwW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkMVtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDJbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQzW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkNFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDVbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi19IE5sbU5BTUUoRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKTsKLQotCi10eXBlZGVmIHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2N1c3RvbV9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDdVN0SGVBZCIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotCi0gIC8qIExlbmd0aCBvZiB0aGlzIGhlYWRlci4gICovCi0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBPZmZzZXQgdG8gZGF0YS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogTGVuZ3RoIG9mIGRhdGEuICAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIC8qIFN0YW1wIGZvciB0aGlzIGN1c3RvbWVyIGhlYWRlci0td2UgcmVjb2duaXplICJDeUduVXNFeCIuICAqLwotICBjaGFyIGRhdGFTdGFtcFs4XTsKLQotfSBObG1OQU1FKEV4dGVybmFsX0N1c3RvbV9IZWFkZXIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vaTM4Ni1leHQuaCBiL2luY2x1ZGUvbmxtL2kzODYtZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzM2FkMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vaTM4Ni1leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBpMzg2IE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybWF0IG9mIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG0zMl9pMzg2X2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGNvZGUgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAotICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCi0gICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gIEl0IGlzIHBvc3NpYmxlCi0gICAgIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBjdXN0b20gZGF0YS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGN1c3RvbSBkYXRhLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgVGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIE1PRFVMRSBrZXl3b3JkIGluCi0gICAgIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0gICAgIAotICB1bnNpZ25lZCBjaGFyIHJlbG9jYXRpb25GaXh1cE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4dGVybmFsUmVmZXJlbmNlc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHVibGljc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUHVibGljc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGludGVybmFsIGRlYnVnIGluZm8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGVidWdJbmZvT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZEZWJ1Z1JlY29yZHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjb2RlU3RhcnRPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleGl0UHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVUeXBlWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3NbNF07Ci0KLX0gTmxtMzJfaTM4Nl9FeHRlcm5hbF9GaXhlZF9IZWFkZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9pbnRlcm5hbC5oIGIvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyN2RjNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IE5MTSBpcyByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGluIHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgTkxNLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBubG0vY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotICAgCi0jaWYgMAotCi0vKiBUeXBlcyB1c2VkIGJ5IHZhcmlvdXMgc3RydWN0dXJlcywgZnVuY3Rpb25zLCBldGMuICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9BZGRyOwkvKiBVbnNpZ25lZCBwcm9ncmFtIGFkZHJlc3MgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9PZmY7CS8qIFVuc2lnbmVkIGZpbGUgb2Zmc2V0ICovCi10eXBlZGVmIAkgbG9uZwlObG0zMl9Td29yZDsJLyogU2lnbmVkIGxhcmdlIGludGVnZXIgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9Xb3JkOwkvKiBVbnNpZ25lZCBsYXJnZSBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0CU5sbTMyX0hhbGY7CS8qIFVuc2lnbmVkIG1lZGl1bSBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJTmxtMzJfQ2hhcjsJLyogVW5zaWduZWQgdGlueSBpbnRlZ2VyICovCi0KLSNpZmRlZiBCRkRfSE9TVF82NF9CSVQKLXR5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUCU5sbTY0X0FkZHI7Ci10eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9PZmY7Ci10eXBlZGVmICAgICAgICAgIEJGRF9IT1NUXzY0X0JJVAlObG02NF9TeHdvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9Yd29yZDsKLSNlbmRpZgotdHlwZWRlZiAgICAgICAgICBsb25nCQlObG02NF9Td29yZDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZwkJTmxtNjRfV29yZDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCU5sbTY0X0hhbGY7Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmb3JtIG9mIHRoZSBwb3J0aW9uIG9mIHRoZSBOTE0KLSAgIGhlYWRlciB0aGF0IGlzIGZpeGVkIGxlbmd0aC4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgotewotICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCi0gICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCi0KLSAgY2hhciBzaWduYXR1cmVbTkxNX1NJR05BVFVSRV9TSVpFXTsKLQotICAvKiBUaGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyLiAgQXQgdGhpcyB0aW1lLCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlcgotICAgICBpcyA0LiAqLwotCi0gIGxvbmcgdmVyc2lvbjsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCB3aGljaCBtdXN0IGJlIGEgRE9TIG5hbWUgKDEtOCBjaGFyYWN0ZXJzIGZvbGxvd2VkCi0gICAgIGJ5IGEgcGVyaW9kIGFuZCBhIDEtMyBjaGFyYWN0ZXIgZXh0ZW5zaW9uLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKLSAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCi0gICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKLSAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLwotCi0gIGNoYXIgbW9kdWxlTmFtZVtOTE1fTU9EVUxFX05BTUVfU0laRV07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIGZpbGVfcHRyIGNvZGVJbWFnZU9mZnNldDsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY29kZSBpbWFnZSwgaW4gYnl0ZXMuICovCi0KLSAgYmZkX3NpemVfdHlwZSBjb2RlSW1hZ2VTaXplOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZGF0YSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICBmaWxlX3B0ciBkYXRhSW1hZ2VPZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIGJmZF9zaXplX3R5cGUgZGF0YUltYWdlU2l6ZTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAotICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KLQotICBiZmRfc2l6ZV90eXBlIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCi0gICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICBmaWxlX3B0ciBjdXN0b21EYXRhT2Zmc2V0OwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgYmZkX3NpemVfdHlwZSBjdXN0b21EYXRhU2l6ZTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIGZpbGVfcHRyIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBtb2R1bGUgZGVwZW5kZW5jaWVzIGF0IHRoZSBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0LiAqLwotCi0gIGxvbmcgbnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXM7Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSByZWxvY2F0aW9uIGZpeHVwIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KLQotICBmaWxlX3B0ciByZWxvY2F0aW9uRml4dXBPZmZzZXQ7Ci0gIGxvbmcgbnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotICBmaWxlX3B0ciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQ7Ci0gIGxvbmcgbnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXM7Ci0gIGZpbGVfcHRyIHB1YmxpY3NPZmZzZXQ7Ci0gIGxvbmcgbnVtYmVyT2ZQdWJsaWNzOwotICBmaWxlX3B0ciBkZWJ1Z0luZm9PZmZzZXQ7Ci0gIGxvbmcgbnVtYmVyT2ZEZWJ1Z1JlY29yZHM7Ci0gIGZpbGVfcHRyIGNvZGVTdGFydE9mZnNldDsKLSAgZmlsZV9wdHIgZXhpdFByb2NlZHVyZU9mZnNldDsKLSAgZmlsZV9wdHIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQ7Ci0gIGxvbmcgbW9kdWxlVHlwZTsKLSAgbG9uZyBmbGFnczsKLX0gTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcjsKLQotI2RlZmluZSBubG0zMl9pbnRlcm5hbF9maXhlZF9oZWFkZXIgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcgotI2RlZmluZSBubG02NF9pbnRlcm5hbF9maXhlZF9oZWFkZXIgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgotI2RlZmluZSBObG02NF9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcgotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgcG9ydGlvbnMgb2YgdGhlIE5MTSBoZWFkZXIgdGhhdCBhcmUgZWl0aGVyCi0gICB2YXJpYWJsZSBpbiBzaXplIGluIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiwgb3IgZWxzZSBhcmUgbm90IGF0IGEKLSAgIGZpeGVkIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIE5MTSBoZWFkZXIgZHVlIHRvIHByZWNlZGluZwotICAgdmFyaWFibGUgc2l6ZWQgZmllbGRzLgotCi0gICBOb3RlIHRoYXQgYWxsIHRoZSBmaWVsZHMgbXVzdCBleGlzdCBpbiB0aGUgZXh0ZXJuYWwgaGVhZGVyLCBhbmQgaW4KLSAgIHRoZSBvcmRlciB1c2VkIGhlcmUgKHRoZSBzYW1lIG9yZGVyIGlzIHVzZWQgaW4gdGhlIGludGVybmFsIGZvcm0KLSAgIGZvciBjb25zaXN0ZW5jeSwgbm90IG91dCBvZiBuZWNlc3NpdHkpLiAqLwotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCi17Ci0KLSAgLyogVGhlIGRlc2NyaXB0aW9uTGVuZ3RoIGZpZWxkIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgaW4KLSAgICAgZGVzY3JpcHRpb25UZXh0LCBleGNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvci4gIFRoZSBkZXNjcmlwdGlvblRleHQKLSAgICAgZmllbGQgY29udGFpbnMgdGhlIE5MTSBkZXNjcmlwdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBERVNDUklQVElPTgotICAgICBrZXl3b3JkIGluIE5MTUxJTksgcGx1cyB0aGUgbnVsbCBieXRlIHRlcm1pbmF0b3IuICBUaGUgZGVzY3JpcHRpb25UZXh0Ci0gICAgIGNhbiBiZSB1cCB0byBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCBjaGFyYWN0ZXJzLiAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciBkZXNjcmlwdGlvbkxlbmd0aDsKLSAgY2hhciBkZXNjcmlwdGlvblRleHRbTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEggKyAxXTsKLQotICAvKiBUaGUgc3RhY2tTaXplIGZpZWxkIGNvbnRhaW5zIHRoZSBzaXplIG9mIHRoZSBzdGFjayBpbiBieXRlcywgYXMKLSAgICAgc3BlY2lmaWVkIGJ5IHRoZSBTVEFDSyBvciBTVEFDS1NJWkUga2V5d29yZCBpbiBOTE1MSU5LLiAgSWYgbm8gc2l6ZQotICAgICBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIE5MTV9ERUZBVUxUX1NUQUNLU0laRS4gKi8KLSAgICAgCi0gIGxvbmcgc3RhY2tTaXplOwotCi0gIC8qIFRoZSByZXNlcnZlZCBmaWVsZCBpcyBpbmNsdWRlZCBvbmx5IGZvciBjb21wbGV0ZW5lc3MuICBJdCBzaG91bGQgY29udGFpbgotICAgICB6ZXJvLiAqLwotCi0gIGxvbmcgcmVzZXJ2ZWQ7Ci0KLSAgLyogVGhpcyBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIHNob3VsZCBjb250YWluICIgTE9ORyIgKG5vdGUgbGVhZGluZwotICAgICBzcGFjZSksIGFuZCBpcyB1bnVzZWQuICovCi0KLSAgY2hhciBvbGRUaHJlYWROYW1lW05MTV9PTERfVEhSRUFEX05BTUVfTEVOR1RIXTsKLQotICAvKiBUaGUgc2NyZWVuTmFtZUxlbmd0aCBmaWVsZCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBhY3R1YWwgdGV4dCBzdG9yZWQKLSAgICAgaW4gdGhlIHNjcmVlbk5hbWUgZmllbGQsIGV4Y2x1ZGluZyB0aGUgbnVsbCBieXRlIHRlcm1pbmF0b3IuICBUaGUKLSAgICAgc2NyZWVuTmFtZSBmaWVsZCBjb250YWlucyB0aGUgc2NyZWVuIG5hbWUgYXMgc3BlY2lmaWVkIGJ5IHRoZSBTQ1JFRU5OQU1FCi0gICAgIGtleXdvcmQgaW4gTkxNTElOSywgYW5kIGNhbiBiZSB1cCB0byBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSAotICAgICBjaGFyYWN0ZXJzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgc2NyZWVuTmFtZUxlbmd0aDsKLSAgY2hhciBzY3JlZW5OYW1lW05MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIICsgMV07Ci0KLSAgLyogVGhlIHRocmVhZE5hbWVMZW5ndGggZmllbGQgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIHRleHQgc3RvcmVkCi0gICAgIGluIHRoZSB0aHJlYWROYW1lIGZpZWxkLCBleGNsdWRpbmcgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlCi0gICAgIHRocmVhZE5hbWUgZmllbGQgY29udGFpbnMgdGhlIHRocmVhZCBuYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgVEhSRUFETkFNRQotICAgICBrZXl3b3JkIGluIE5MTUxJTkssIGFuZCBjYW4gYmUgdXAgdG8gTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgKLSAgICAgY2hhcmFjdGVycy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHRocmVhZE5hbWVMZW5ndGg7Ci0gIGNoYXIgdGhyZWFkTmFtZVtOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCArIDFdOwotCi19IE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyIG5sbV9pbnRlcm5hbF92YXJpYWJsZV9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyIG5sbV9pbnRlcm5hbF92YXJpYWJsZV9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIKLQotLyogVGhlIHZlcnNpb24gaGVhZGVyIGlzIG9uZSBvZiB0aGUgb3B0aW9uYWwgYXV4aWxpYXJ5IGhlYWRlcnMgYW5kCi0gICBmb2xsb3dzIHRoZSBmaXhlZCBsZW5ndGggYW5kIHZhcmlhYmxlIGxlbmd0aCBOTE0gaGVhZGVycy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCi17Ci0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiVmVSc0lvTiMiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFs4XTsKLSAgbG9uZyBtYWpvclZlcnNpb247Ci0gIGxvbmcgbWlub3JWZXJzaW9uOwotICBsb25nIHJldmlzaW9uOwotICBsb25nIHllYXI7Ci0gIGxvbmcgbW9udGg7Ci0gIGxvbmcgZGF5OwotfSBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcgotI2RlZmluZSBubG02NF9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlciBubG1faW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyCi17Ci0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ29QeVJpR2hUPSIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzEwXTsKLSAgdW5zaWduZWQgY2hhciBjb3B5cmlnaHRNZXNzYWdlTGVuZ3RoOwotICBjaGFyIGNvcHlyaWdodE1lc3NhZ2VbTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEhdOwotfSBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcjsKLQotI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyIG5sbV9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlciBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgotI2RlZmluZSBObG02NF9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKLXsKLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJNZVNzQWdFcyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotICBsb25nIGxhbmd1YWdlSUQ7Ci0gIGZpbGVfcHRyIG1lc3NhZ2VGaWxlT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIG1lc3NhZ2VGaWxlTGVuZ3RoOwotICBsb25nIG1lc3NhZ2VDb3VudDsKLSAgZmlsZV9wdHIgaGVscEZpbGVPZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgaGVscEZpbGVMZW5ndGg7Ci0gIGZpbGVfcHRyIFJQQ0RhdGFPZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgUlBDRGF0YUxlbmd0aDsKLSAgZmlsZV9wdHIgc2hhcmVkQ29kZU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaGFyZWRDb2RlTGVuZ3RoOwotICBmaWxlX3B0ciBzaGFyZWREYXRhT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIHNoYXJlZERhdGFMZW5ndGg7Ci0gIGZpbGVfcHRyIHNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldDsKLSAgbG9uZyBzaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudDsKLSAgZmlsZV9wdHIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQ7Ci0gIGxvbmcgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudDsKLSAgZmlsZV9wdHIgc2hhcmVkUHVibGljc09mZnNldDsKLSAgbG9uZyBzaGFyZWRQdWJsaWNzQ291bnQ7Ci0gIGZpbGVfcHRyIHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0OwotICBsb25nIHNoYXJlZERlYnVnUmVjb3JkQ291bnQ7Ci0gIGJmZF92bWEgU2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQ7Ci0gIGJmZF92bWEgU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldDsKLSAgbG9uZyBwcm9kdWN0SUQ7Ci0gIGxvbmcgcmVzZXJ2ZWQwOwotICBsb25nIHJlc2VydmVkMTsKLSAgbG9uZyByZXNlcnZlZDI7Ci0gIGxvbmcgcmVzZXJ2ZWQzOwotICBsb25nIHJlc2VydmVkNDsKLSAgbG9uZyByZXNlcnZlZDU7Ci19IE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIKLQotLyogVGhlIGZvcm1hdCBvZiBhIGN1c3RvbSBoZWFkZXIgYXMgc3RvcmVkIGludGVybmFsbHkgaXMgZGlmZmVyZW50Ci0gICBmcm9tIHRoZSBleHRlcm5hbCBmb3JtYXQuICBUaGlzIGlzIGhvdyB3ZSBzdG9yZSBhIGN1c3RvbSBoZWFkZXIKLSAgIHdoaWNoIHdlIGRvIG5vdCByZWNvZ25pemUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkN1U3RIZUFkIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0gIGJmZF9zaXplX3R5cGUgaGRyTGVuZ3RoOwotICBmaWxlX3B0ciBkYXRhT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIGRhdGFMZW5ndGg7Ci0gIGNoYXIgZGF0YVN0YW1wWzhdOwotICBQVFIgaGRyOwotfSBObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcjsKLQotI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jdXN0b21faGVhZGVyIG5sbV9pbnRlcm5hbF9jdXN0b21faGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0N1c3RvbV9IZWFkZXIgTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfY3VzdG9tX2hlYWRlciBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgotI2RlZmluZSBObG02NF9JbnRlcm5hbF9DdXN0b21fSGVhZGVyIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCi0KLS8qIFRoZSBpbnRlcm5hbCBDeWdudXMgaGVhZGVyIGlzIHdyaXR0ZW4gb3V0IGV4dGVybmFsbHkgYXMgYSBjdXN0b20KLSAgIGhlYWRlci4gIFdlIGRvbid0IHRyeSB0byByZXBsaWNhdGUgdGhhdCBzdHJ1Y3R1cmUgaGVyZS4gICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkN5R25Vc0V4IiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0gIC8qIEZpbGUgbG9jYXRpb24gb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgZmlsZV9wdHIgb2Zmc2V0OwotICAvKiBMZW5ndGggb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsZW5ndGg7Ci19IE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcjsKLQotI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlciBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyIG5sbV9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcgotI2RlZmluZSBObG02NF9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlciBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL3BwYy1leHQuaCBiL2luY2x1ZGUvbmxtL3BwYy1leHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZTEwNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9wcGMtZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogUG93ZXJQQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIE9MREZPUk1BVAotCi0vKiBUaGUgZm9ybWF0IG9mIGEgUG93ZXJQQyBOTE0gY2hhbmdlZC4gIFRoZXNlIHN0cnVjdHVyZXMgYXJlIG9ubHkKLSAgIHVzZWQgaW4gdGhlIG9sZCBmb3JtYXQuICAqLwotCi0vKiBBIFBvd2VyUEMgTkxNIHN0YXJ0cyB3aXRoIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlcgotewotICAvKiBTaWduYXR1cmUuICBNdXN0IGJlICJBcHBsZU5MTSIuICAqLwotICBjaGFyIHNpZ25hdHVyZVs4XTsKLSAgLyogVmVyc2lvbiBudW1iZXIuICBDdXJyZW50IHZhbHVlIGlzIDEuICAqLwotICB1bnNpZ25lZCBjaGFyIGhlYWRlclZlcnNpb25bNF07Ci0gIC8qID8/LiAgU2hvdWxkIGJlIHNldCB0byAwLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcmlnaW5zWzRdOwotICAvKiBGaWxlIGNyZWF0aW9uIGRhdGUgaW4gc3RhbmRhcmQgVW5peCB0aW1lIGZvcm1hdCAoc2Vjb25kcyBzaW5jZQotICAgICAxLzEvNzApLiAgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRlWzRdOwotfTsKLQotI2RlZmluZSBOTE0zMl9QT1dFUlBDX1NJR05BVFVSRSAiQXBwbGVOTE0iCi0jZGVmaW5lIE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04gMQotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybWF0IG9mIGEgUG93ZXJQQyBOTE0gcmVsb2MuICBUaGlzIGlzIHRoZSBzYW1lIGFzIGFuCi0gICBYQ09GRiBkeW5hbWljIHJlbG9jLiAgKi8KLQotc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcmVsb2MKLXsKLSAgLyogQWRkcmVzcy4gICovCi0gIHVuc2lnbmVkIGNoYXIgbF92YWRkcls0XTsKLSAgLyogU3ltYm9sIHRhYmxlIGluZGV4LiAgVGhpcyBpcyAwIGZvciAudGV4dCBhbmQgMSBmb3IgLmRhdGEuICAyCi0gICAgIG1lYW5zIC5ic3MsIGJ1dCBJIGRvbid0IGtub3cgaWYgaXQgaXMgdXNlZC4gIEluIFhDT0ZGLCBsYXJnZXIKLSAgICAgbnVtYmVycyBhcmUgaW5kaWNlcyBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgYnV0IHRoZXkgYXJlCi0gICAgIHByZXN1bWFibHkgbm90IHVzZWQgaW4gYW4gTkxNLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsX3N5bW5keFs0XTsKLSAgLyogUmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsX3J0eXBlWzJdOwotICAvKiBTZWN0aW9uIG51bWJlciBiZWluZyByZWxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBjaGFyIGxfcnNlY25tWzJdOwotfTsKLQotI2VuZGlmIC8qIE9MREZPUk1BVCAqLwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybWF0IG9mIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX3Bvd2VycGNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vc3BhcmMzMi1leHQuaCBiL2luY2x1ZGUvbmxtL3NwYXJjMzItZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWIyZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vc3BhcmMzMi1leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKiBTUEFSQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfc3BhcmNfZXh0ZXJuYWxfZml4ZWRfaGVhZGVyCi17Ci0KLSAgLyogVGhlIHNpZ25hdHVyZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBmaWxlIGFzIGFuIE5MTS4gIEl0IG11c3QgY29udGFpbgotICAgICB0aGUgc2lnbmF0dXJlIHN0cmluZywgd2hpY2ggZGVwZW5kcyB1cG9uIHRoZSBOTE0gdGFyZ2V0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlWzI0XTsKLQotICAvKiBUaGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyLiAgQXQgdGhpcyB0aW1lLCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlcgotICAgICBpcyA0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgdmVyc2lvbls0XTsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCB3aGljaCBtdXN0IGJlIGEgRE9TIG5hbWUgKDEtOCBjaGFyYWN0ZXJzIGZvbGxvd2VkCi0gICAgIGJ5IGEgcGVyaW9kIGFuZCBhIDEtMyBjaGFyYWN0ZXIgZXh0ZW5zaW9uKS4gIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBieXRlCi0gICAgIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgdGhlIGxhc3QgYnl0ZSBpcyBhIG51bGwgdGVybWluYXRvciBieXRlLiAgVGhpcwotICAgICBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIGFuZCBhbnkgdW51c2VkIGJ5dGVzIHNob3VsZCBiZSBudWxsIGJ5dGVzLiAgVGhlCi0gICAgIHZhbHVlIGlzIHNldCBieSB0aGUgT1VUUFVUIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZU5hbWVbMTRdOwotCi0gIC8qIFBhZGRpbmcgdG8gbWFrZSBpdCBjb21lIG91dCBjb3JyZWN0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgcGFkMVsyXTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGNvZGUgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAotICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCi0gICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gIEl0IGlzIHBvc3NpYmxlCi0gICAgIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBjdXN0b20gZGF0YS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGN1c3RvbSBkYXRhLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgVGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIE1PRFVMRSBrZXl3b3JkIGluCi0gICAgIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0gICAgIAotICB1bnNpZ25lZCBjaGFyIHJlbG9jYXRpb25GaXh1cE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4dGVybmFsUmVmZXJlbmNlc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHVibGljc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUHVibGljc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGludGVybmFsIGRlYnVnIGluZm8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGVidWdJbmZvT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZEZWJ1Z1JlY29yZHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjb2RlU3RhcnRPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleGl0UHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVUeXBlWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3NbNF07Ci0KLX0gTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vYXN5cy5oIGIvaW5jbHVkZS9vYXN5cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdkMjUwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb2FzeXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKiBPYXN5cyBvYmplY3QgZm9ybWF0IGhlYWRlciBmaWxlIGZvciBCRkQuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gICovCi0KLSNkZWZpbmUgT0FTWVNfTUFYX1NFQ19DT1VOVCAxNgotLyogKioqKiAqLwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19hcmNoaXZlX2hlYWRlciB7Ci0gIHVuc2lnbmVkIGludCAgdmVyc2lvbjsKLSAgY2hhciBjcmVhdGVfZGF0ZVsxMl07Ci0gIGNoYXIgcmV2aXNpb25fZGF0ZVsxMl07Ci0gIHVuc2lnbmVkIGludCBtb2RfY291bnQ7Ci0gIGZpbGVfcHRyIG1vZF90Ymxfb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc3ltX3RibF9zaXplOwotICB1bnNpZ25lZCBpbnQgc3ltX2NvdW50OwotICBmaWxlX3B0ciBzeW1fdGJsX29mZnNldDsKLSAgdW5zaWduZWQgaW50IHhyZWZfY291bnQ7Ci0gIGZpbGVfcHRyIHhyZWZfbHN0X29mZnNldDsKLX0gb2FzeXNfYXJjaGl2ZV9oZWFkZXJfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZXh0YXJjaGl2ZV9oZWFkZXIgewotICBiZmRfYnl0ZSB2ZXJzaW9uWzRdOwotICBiZmRfYnl0ZSBjcmVhdGVfZGF0ZVsxMl07Ci0gIGJmZF9ieXRlIHJldmlzaW9uX2RhdGVbMTJdOwotICBiZmRfYnl0ZSBtb2RfY291bnRbNF07Ci0gIGJmZF9ieXRlIG1vZF90Ymxfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSBzeW1fdGJsX3NpemVbNF07Ci0gIGJmZF9ieXRlIHN5bV9jb3VudFs0XTsKLSAgYmZkX2J5dGUgc3ltX3RibF9vZmZzZXRbNF07Ci0gIGJmZF9ieXRlIHhyZWZfY291bnRbNF07Ci0gIGJmZF9ieXRlIHhyZWZfbHN0X29mZnNldFs0XTsKLX0gb2FzeXNfZXh0YXJjaGl2ZV9oZWFkZXJfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfbW9kdWxlX3RhYmxlIHsKLSAgaW50IG1vZF9udW1iZXI7Ci0gIGNoYXIgbW9kX2RhdGVbMTJdOwotICB1bnNpZ25lZCBpbnQgbW9kX3NpemU7Ci0gIHVuc2lnbmVkIGludCBkZXBfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBkZXBlZV9jb3VudDsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBzZWN0X2NvdW50OwotICBjaGFyICptb2R1bGVfbmFtZTsKLSAgdW5zaWduZWQgaW50IG1vZHVsZV9uYW1lX3NpemU7Ci19IG9hc3lzX21vZHVsZV90YWJsZV90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2V4dG1vZHVsZV90YWJsZV9hIHsKLSAgYmZkX2J5dGUgbW9kX251bWJlcls0XTsKLSAgYmZkX2J5dGUgbW9kX2RhdGVbMTJdOwotICBiZmRfYnl0ZSBtb2Rfc2l6ZVs0XTsKLSAgYmZkX2J5dGUgZGVwX2NvdW50WzRdOwotICBiZmRfYnl0ZSBkZXBlZV9jb3VudFs0XTsKLSAgYmZkX2J5dGUgc2VjdF9jb3VudFs0XTsKLSAgYmZkX2J5dGUgZmlsZV9vZmZzZXRbNF07Ci0gIGJmZF9ieXRlIG1vZF9uYW1lWzMyXTsKLX0gb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19leHRtb2R1bGVfdGFibGVfYiB7Ci0gIGJmZF9ieXRlIG1vZF9udW1iZXJbNF07Ci0gIGJmZF9ieXRlIG1vZF9kYXRlWzEyXTsKLSAgYmZkX2J5dGUgbW9kX3NpemVbNF07Ci0gIGJmZF9ieXRlIGRlcF9jb3VudFs0XTsKLSAgYmZkX2J5dGUgZGVwZWVfY291bnRbNF07Ci0gIGJmZF9ieXRlIHNlY3RfY291bnRbNF07Ci0gIGJmZF9ieXRlIGZpbGVfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSBtb2RfbmFtZV9sZW5ndGhbNF07Ci19IG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2JfdHlwZTsKLQotCi10eXBlZGVmIGVudW0gb2FzeXNfcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2lzX2VuZF9lbnVtID0gMCwKLSAgb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bSA9IDEsCi0gIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bSA9IDIsCi0gIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bSA9IDMsCi0gIG9hc3lzX3JlY29yZF9pc19uYW1lZF9zZWN0aW9uX2VudW0gPSA0LAotICBvYXN5c19yZWNvcmRfaXNfY29tX2VudW0gPSA1LAotICBvYXN5c19yZWNvcmRfaXNfZGVidWdfZW51bSA9IDYsCi0gIG9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW0gPSA3LAotICBvYXN5c19yZWNvcmRfaXNfZGVidWdfZmlsZV9lbnVtID0gOCwKLSAgb2FzeXNfcmVjb3JkX2lzX21vZHVsZV9lbnVtID0gOSwKLSAgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0gPSAxMAotfSBvYXN5c19yZWNvcmRfZW51bV90eXBlOwotCi0gIAotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19yZWNvcmRfaGVhZGVyIHsKLSAgdW5zaWduZWQgY2hhciBsZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgY2hlY2tfc3VtOwotICB1bnNpZ25lZCBjaGFyIHR5cGU7Ci0gIHVuc2lnbmVkIGNoYXIgZmlsbDsKLX0gb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19kYXRhX3JlY29yZCB7Ci0gIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuc2lnbmVkIGNoYXIgcmVsYjsKLSAgYmZkX2J5dGUgYWRkcls0XTsKLSAgLyogbWF4aW11bSB0b3RhbCBzaXplIG9mIGRhdGEgcmVjb3JkIGlzIDI1NSBieXRlcyAqLwotICBiZmRfYnl0ZSBkYXRhWzI0Nl07Ci19IG9hc3lzX2RhdGFfcmVjb3JkX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2hlYWRlcl9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25fbnVtYmVyOwotICB1bnNpZ25lZCBjaGFyIHJldl9udW1iZXI7Ci0gIGNoYXIgbW9kdWxlX25hbWVbMjYtNl07Ci0gIGNoYXIgZGVzY3JpcHRpb25bNjQtMjZdOwotfSBvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGU7Ci0KLSNkZWZpbmUgT0FTWVNfVkVSU0lPTl9OVU1CRVIgMAotI2RlZmluZSBPQVNZU19SRVZfTlVNQkVSIDAKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfc3ltYm9sX3JlY29yZCB7Ci0gIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuc2lnbmVkIGNoYXIgcmVsYjsKLSAgYmZkX2J5dGUgdmFsdWVbNF07Ci0gIGJmZF9ieXRlIHJlZm5vWzJdOwotICBjaGFyIG5hbWVbNjRdOwotfSBvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGU7Ci0KLSNkZWZpbmUgUkVMT0NBVElPTl9QQ1JFTF9CSVQgMHg4MAotI2RlZmluZSBSRUxPQ0FUSU9OXzMyQklUX0JJVCAweDQwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9CSVRTIDB4MzAKLSNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX0FCUyAweDAwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9SRUwgMHgxMAotI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfVU5EIDB4MjAKLSNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX0NPTSAweDMwCi0jZGVmaW5lIFJFTE9DQVRJT05fU0VDVF9CSVRTIDB4MGYKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfc2VjdGlvbl9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIHZhbHVlWzRdOwotICBiZmRfYnl0ZSB2bWFbNF07Ci0gIGJmZF9ieXRlIGZpbGxbM107Ci19IG9hc3lzX3NlY3Rpb25fcmVjb3JkX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2VuZF9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIGVudHJ5WzRdOwotICBiZmRfYnl0ZSBmaWxsWzJdOwotICBiZmRfYnl0ZSB6ZXJvOwotfSBvYXN5c19lbmRfcmVjb3JkX3R5cGU7Ci0KLXR5cGVkZWYgdW5pb24gb2FzeXNfcmVjb3JkX3VuaW9uIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgb2FzeXNfZGF0YV9yZWNvcmRfdHlwZSBkYXRhOwotICBvYXN5c19zZWN0aW9uX3JlY29yZF90eXBlIHNlY3Rpb247Ci0gIG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSBzeW1ib2w7Ci0gIG9hc3lzX2hlYWRlcl9yZWNvcmRfdHlwZSBmaXJzdDsKLSAgb2FzeXNfZW5kX3JlY29yZF90eXBlIGVuZDsKLSAgYmZkX2J5dGUgcGFkWzI1Nl07Ci19IG9hc3lzX3JlY29yZF91bmlvbl90eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vYmphbGxvYy5oIGIvaW5jbHVkZS9vYmphbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ1MWNkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb2JqYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBvYmphbGxvYy5oIC0tIHJvdXRpbmVzIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2JqZWN0cwotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE9CSkFMTE9DX0gKLSNkZWZpbmUgT0JKQUxMT0NfSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgc3BhY2UgZm9yIGFuIG9iamVjdC4gIFRoZSBhc3N1bXB0aW9uIGlzCi0gICB0aGF0IHRoZSBvYmplY3Qgd2lsbCB3YW50IHRvIGFsbG9jYXRlIHNwYWNlIGFzIGl0IGdvZXMgYWxvbmcsIGJ1dAotICAgd2lsbCBuZXZlciB3YW50IHRvIGZyZWUgYW55IHBhcnRpY3VsYXIgYmxvY2suICBUaGVyZSBpcyBhIGZ1bmN0aW9uCi0gICB0byBmcmVlIGEgYmxvY2ssIHdoaWNoIGFsc28gZnJlZXMgYWxsIG1vcmUgcmVjZW50bHkgYWxsb2NhdGVkCi0gICBibG9ja3MuICBUaGVyZSBpcyBhbHNvIGEgZnVuY3Rpb24gdG8gZnJlZSBhbGwgdGhlIGFsbG9jYXRlZCBzcGFjZS4KLQotICAgVGhpcyBpcyBlc3NlbnRpYWxseSBhIHNwZWNpYWxpemF0aW9uIG9mIG9ic3RhY2tzLiAgVGhlIG1haW4KLSAgIGRpZmZlcmVuY2UgaXMgdGhhdCBhIGJsb2NrIG1heSBub3QgYmUgYWxsb2NhdGVkIGEgYml0IGF0IGEgdGltZS4KLSAgIEFub3RoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXNlIHJvdXRpbmVzIGFyZSBhbHdheXMgYnVpbHQgb24gdG9wCi0gICBvZiBtYWxsb2MsIGFuZCBhbHdheXMgcGFzcyBhbiBtYWxsb2MgZmFpbHVyZSBiYWNrIHRvIHRoZSBjYWxsZXIsCi0gICB1bmxpa2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgb2Ygb2JzdGFja3MuICAqLwotCi0vKiBUaGlzIGlzIHdoYXQgYW4gb2JqYWxsb2Mgc3RydWN0dXJlIGxvb2tzIGxpa2UuICBDYWxsZXJzIHNob3VsZCBub3QKLSAgIHJlZmVyIHRvIHRoZXNlIGZpZWxkcywgbm9yIHNob3VsZCB0aGV5IGFsbG9jYXRlIHRoZXNlIHN0cnVjdHVyZQotICAgdGhlbXNlbHZlcy4gIEluc3RlYWQsIHRoZXkgc2hvdWxkIG9ubHkgY3JlYXRlIHRoZW0gdmlhCi0gICBvYmphbGxvY19pbml0LCBhbmQgb25seSBhY2Nlc3MgdGhlbSB2aWEgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zCi0gICBsaXN0ZWQgYmVsb3cuICBUaGUgc3RydWN0dXJlIGlzIG9ubHkgZGVmaW5lZCBoZXJlIHNvIHRoYXQgd2UgY2FuCi0gICBhY2Nlc3MgaXQgdmlhIG1hY3Jvcy4gICovCi0KLXN0cnVjdCBvYmphbGxvYwotewotICBjaGFyICpjdXJyZW50X3B0cjsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfc3BhY2U7Ci0gIFBUUiBjaHVua3M7Ci19OwotCi0vKiBXb3JrIG91dCB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLQotc3RydWN0IG9iamFsbG9jX2FsaWduIHsgY2hhciB4OyBkb3VibGUgZDsgfTsKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2lmbmRlZiBvZmZzZXRvZgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0jZGVmaW5lIE9CSkFMTE9DX0FMSUdOIFwKLSAgKChwdHJkaWZmX3QpICgoY2hhciAqKSAmKChzdHJ1Y3Qgb2JqYWxsb2NfYWxpZ24gKikgMCktPmQgLSAoY2hhciAqKSAwKSkKLSNlbHNlCi0jZGVmaW5lIE9CSkFMTE9DX0FMSUdOIFwKLSAgKChsb25nKSAoKGNoYXIgKikgJigoc3RydWN0IG9iamFsbG9jX2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCi0jZW5kaWYKLQotLyogQ3JlYXRlIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gIFJldHVybnMgTlVMTCBpZiBtYWxsb2MgZmFpbHMuICAqLwotCi1leHRlcm4gc3RydWN0IG9iamFsbG9jICpvYmphbGxvY19jcmVhdGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmcm9tIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gIFJldHVybnMgTlVMTCBpZiBtYWxsb2MKLSAgIGZhaWxzLiAgKi8KLQotZXh0ZXJuIFBUUiBfb2JqYWxsb2NfYWxsb2MgUEFSQU1TICgoc3RydWN0IG9iamFsbG9jICosIHVuc2lnbmVkIGxvbmcpKTsKLQotLyogVGhlIG1hY3JvIHZlcnNpb24gb2Ygb2JqYWxsb2NfYWxsb2MuICBXZSBvbmx5IGRlZmluZSB0aGlzIGlmIHVzaW5nCi0gICBnY2MsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmUgdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cwotICAgbXVsdGlwbGUgdGltZXMsIG9yIHVzZSBhIHRlbXBvcmFyeSBmaWVsZCBhcyBvYnN0YWNrLmggZG9lcy4gICovCi0KLSNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0KLS8qIE5leHRTdGVwIDIuMCBjYyBpcyByZWFsbHkgZ2NjIDEuOTMgYnV0IGl0IGRlZmluZXMgX19HTlVDX18gPSAyIGFuZAotICAgZG9lcyBub3QgaW1wbGVtZW50IF9fZXh0ZW5zaW9uX18uICBCdXQgdGhhdCBjb21waWxlciBkb2Vzbid0IGRlZmluZQotICAgX19HTlVDX01JTk9SX18uICAqLwotI2lmIF9fR05VQ19fIDwgMiB8fCAoX19OZVhUX18gJiYgIV9fR05VQ19NSU5PUl9fKQotI2RlZmluZSBfX2V4dGVuc2lvbl9fCi0jZW5kaWYKLQotI2RlZmluZSBvYmphbGxvY19hbGxvYyhvLCBsKQkJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JqYWxsb2MgKl9fbyA9IChvKTsJCQkJCVwKLSAgICAgdW5zaWduZWQgbG9uZyBfX2xlbiA9IChsKTsJCQkJCQlcCi0gICAgIGlmIChfX2xlbiA9PSAwKQkJCQkJCQlcCi0gICAgICAgX19sZW4gPSAxOwkJCQkJCQlcCi0gICAgIF9fbGVuID0gKF9fbGVuICsgT0JKQUxMT0NfQUxJR04gLSAxKSAmfiAoT0JKQUxMT0NfQUxJR04gLSAxKTsJXAotICAgICAoX19sZW4gPD0gX19vLT5jdXJyZW50X3NwYWNlCQkJCQlcCi0gICAgICA/IChfX28tPmN1cnJlbnRfcHRyICs9IF9fbGVuLAkJCQkJXAotCSBfX28tPmN1cnJlbnRfc3BhY2UgLT0gX19sZW4sCQkJCQlcCi0JIChQVFIpIChfX28tPmN1cnJlbnRfcHRyIC0gX19sZW4pKQkJCQlcCi0gICAgICA6IF9vYmphbGxvY19hbGxvYyAoX19vLCBfX2xlbikpOyB9KQotCi0jZWxzZSAvKiAhIF9fR05VQ19fICovCi0KLSNkZWZpbmUgb2JqYWxsb2NfYWxsb2MobywgbCkgX29iamFsbG9jX2FsbG9jICgobyksIChsKSkKLQotI2VuZGlmIC8qICEgX19HTlVDX18gKi8KLQotLyogRnJlZSBhbiBlbnRpcmUgb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotZXh0ZXJuIHZvaWQgb2JqYWxsb2NfZnJlZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqYWxsb2MgKikpOwotCi0vKiBGcmVlIGEgYmxvY2sgYWxsb2NhdGVkIGJ5IG9iamFsbG9jX2FsbG9jLiAgVGhpcyBhbHNvIGZyZWVzIGFsbCBtb3JlCi0gICByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2tzLiAgKi8KLQotZXh0ZXJuIHZvaWQgb2JqYWxsb2NfZnJlZV9ibG9jayBQQVJBTVMgKChzdHJ1Y3Qgb2JqYWxsb2MgKiwgUFRSKSk7Ci0KLSNlbmRpZiAvKiBPQkpBTExPQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29ic3RhY2suaCBiL2luY2x1ZGUvb2JzdGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGU5Njc3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb2JzdGFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qIG9ic3RhY2suaCAtIG9iamVjdCBzdGFjayBtYWNyb3MKLSAgIENvcHlyaWdodCAoQykgMTk4OCw4OSw5MCw5MSw5Miw5Myw5NCw5Niw5Nyw5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotCi0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0vKiBTdW1tYXJ5OgotCi1BbGwgdGhlIGFwcGFyZW50IGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgYXJlIG1hY3Jvcy4gVGhlIGlkZWEKLWlzIHRoYXQgeW91IHdvdWxkIHVzZSB0aGVzZSBwcmUtdGVzdGVkIG1hY3JvcyB0byBzb2x2ZSBhCi12ZXJ5IHNwZWNpZmljIHNldCBvZiBwcm9ibGVtcywgYW5kIHRoZXkgd291bGQgcnVuIGZhc3QuCi1DYXV0aW9uOiBubyBzaWRlLWVmZmVjdHMgaW4gYXJndW1lbnRzIHBsZWFzZSEhIFRoZXkgbWF5IGJlCi1ldmFsdWF0ZWQgTUFOWSB0aW1lcyEhCi0KLVRoZXNlIG1hY3JvcyBvcGVyYXRlIGEgc3RhY2sgb2Ygb2JqZWN0cy4gIEVhY2ggb2JqZWN0IHN0YXJ0cyBsaWZlCi1zbWFsbCwgYW5kIG1heSBncm93IHRvIG1hdHVyaXR5LiAgKENvbnNpZGVyIGJ1aWxkaW5nIGEgd29yZCBzeWxsYWJsZQotYnkgc3lsbGFibGUuKSAgQW4gb2JqZWN0IGNhbiBtb3ZlIHdoaWxlIGl0IGlzIGdyb3dpbmcuICBPbmNlIGl0IGhhcwotYmVlbiAiZmluaXNoZWQiIGl0IG5ldmVyIGNoYW5nZXMgYWRkcmVzcyBhZ2Fpbi4gIFNvIHRoZSAidG9wIG9mIHRoZQotc3RhY2siIGlzIHR5cGljYWxseSBhbiBpbW1hdHVyZSBncm93aW5nIG9iamVjdCwgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlCi1zdGFjayBpcyBvZiBtYXR1cmUsIGZpeGVkIHNpemUgYW5kIGZpeGVkIGFkZHJlc3Mgb2JqZWN0cy4KLQotVGhlc2Ugcm91dGluZXMgZ3JhYiBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5LCB1c2luZyBhIGZ1bmN0aW9uIHlvdQotc3VwcGx5LCBjYWxsZWQgYG9ic3RhY2tfY2h1bmtfYWxsb2MnLiAgT24gb2NjYXNpb24sIHRoZXkgZnJlZSBjaHVua3MsCi1ieSBjYWxsaW5nIGBvYnN0YWNrX2NodW5rX2ZyZWUnLiAgWW91IG11c3QgZGVmaW5lIHRoZW0gYW5kIGRlY2xhcmUKLXRoZW0gYmVmb3JlIHVzaW5nIGFueSBvYnN0YWNrIG1hY3Jvcy4KLQotRWFjaCBpbmRlcGVuZGVudCBzdGFjayBpcyByZXByZXNlbnRlZCBieSBhIGBzdHJ1Y3Qgb2JzdGFjaycuCi1FYWNoIG9mIHRoZSBvYnN0YWNrIG1hY3JvcyBleHBlY3RzIGEgcG9pbnRlciB0byBzdWNoIGEgc3RydWN0dXJlCi1hcyB0aGUgZmlyc3QgYXJndW1lbnQuCi0KLU9uZSBtb3RpdmF0aW9uIGZvciB0aGlzIHBhY2thZ2UgaXMgdGhlIHByb2JsZW0gb2YgZ3Jvd2luZyBjaGFyIHN0cmluZ3MKLWluIHN5bWJvbCB0YWJsZXMuICBVbmxlc3MgeW91IGFyZSAiZmFzY2lzdCBwaWcgd2l0aCBhIHJlYWQtb25seSBtaW5kIgotLS1Hb3NwZXIncyBpbW1vcnRhbCBxdW90ZSBmcm9tIEhBS01FTSBpdGVtIDE1NCwgb3V0IG9mIGNvbnRleHQtLXlvdQotd291bGQgbm90IGxpa2UgdG8gcHV0IGFueSBhcmJpdHJhcnkgdXBwZXIgbGltaXQgb24gdGhlIGxlbmd0aCBvZiB5b3VyCi1zeW1ib2xzLgotCi1JbiBwcmFjdGljZSB0aGlzIG9mdGVuIG1lYW5zIHlvdSB3aWxsIGJ1aWxkIG1hbnkgc2hvcnQgc3ltYm9scyBhbmQgYQotZmV3IGxvbmcgc3ltYm9scy4gIEF0IHRoZSB0aW1lIHlvdSBhcmUgcmVhZGluZyBhIHN5bWJvbCB5b3UgZG9uJ3Qga25vdwotaG93IGxvbmcgaXQgaXMuICBPbmUgdHJhZGl0aW9uYWwgbWV0aG9kIGlzIHRvIHJlYWQgYSBzeW1ib2wgaW50byBhCi1idWZmZXIsIHJlYWxsb2MoKWF0aW5nIHRoZSBidWZmZXIgZXZlcnkgdGltZSB5b3UgdHJ5IHRvIHJlYWQgYSBzeW1ib2wKLXRoYXQgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgYmVhdXQsIGJ1dCB5b3Ugc3RpbGwgd2lsbAotd2FudCB0byBjb3B5IHRoZSBzeW1ib2wgZnJvbSB0aGUgYnVmZmVyIHRvIGEgbW9yZSBwZXJtYW5lbnQKLXN5bWJvbC10YWJsZSBlbnRyeSBzYXkgYWJvdXQgaGFsZiB0aGUgdGltZS4KLQotV2l0aCBvYnN0YWNrcywgeW91IGNhbiB3b3JrIGRpZmZlcmVudGx5LiAgVXNlIG9uZSBvYnN0YWNrIGZvciBhbGwgc3ltYm9sCi1uYW1lcy4gIEFzIHlvdSByZWFkIGEgc3ltYm9sLCBncm93IHRoZSBuYW1lIGluIHRoZSBvYnN0YWNrIGdyYWR1YWxseS4KLVdoZW4gdGhlIG5hbWUgaXMgY29tcGxldGUsIGZpbmFsaXplIGl0LiAgVGhlbiwgaWYgdGhlIHN5bWJvbCBleGlzdHMgYWxyZWFkeSwKLWZyZWUgdGhlIG5ld2x5IHJlYWQgbmFtZS4KLQotVGhlIHdheSB3ZSBkbyB0aGlzIGlzIHRvIHRha2UgYSBsYXJnZSBjaHVuaywgYWxsb2NhdGluZyBtZW1vcnkgZnJvbQotbG93IGFkZHJlc3Nlcy4gIFdoZW4geW91IHdhbnQgdG8gYnVpbGQgYSBzeW1ib2wgaW4gdGhlIGNodW5rIHlvdSBqdXN0Ci1hZGQgY2hhcnMgYWJvdmUgdGhlIGN1cnJlbnQgImhpZ2ggd2F0ZXIgbWFyayIgaW4gdGhlIGNodW5rLiAgV2hlbiB5b3UKLWhhdmUgZmluaXNoZWQgYWRkaW5nIGNoYXJzLCBiZWNhdXNlIHlvdSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sLAoteW91IGtub3cgaG93IGxvbmcgdGhlIGNoYXJzIGFyZSwgYW5kIHlvdSBjYW4gY3JlYXRlIGEgbmV3IG9iamVjdC4KLU1vc3RseSB0aGUgY2hhcnMgd2lsbCBub3QgYnVyc3Qgb3ZlciB0aGUgaGlnaGVzdCBhZGRyZXNzIG9mIHRoZSBjaHVuaywKLWJlY2F1c2UgeW91IHdvdWxkIHR5cGljYWxseSBleHBlY3QgYSBjaHVuayB0byBiZSAoc2F5KSAxMDAgdGltZXMgYXMKLWxvbmcgYXMgYW4gYXZlcmFnZSBvYmplY3QuCi0KLUluIGNhc2UgdGhhdCBpc24ndCBjbGVhciwgd2hlbiB3ZSBoYXZlIGVub3VnaCBjaGFycyB0byBtYWtlIHVwCi10aGUgb2JqZWN0LCBUSEVZIEFSRSBBTFJFQURZIENPTlRJR1VPVVMgSU4gVEhFIENIVU5LIChndWFyYW50ZWVkKQotc28gd2UganVzdCBwb2ludCB0byBpdCB3aGVyZSBpdCBsaWVzLiAgTm8gbW92aW5nIG9mIGNoYXJzIGlzCi1uZWVkZWQgYW5kIHRoaXMgaXMgdGhlIHNlY29uZCB3aW46IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5ncyBuZWVkCi1uZXZlciBiZSBleHBsaWNpdGx5IHNodWZmbGVkLiBPbmNlIGFuIG9iamVjdCBpcyBmb3JtZWQsIGl0IGRvZXMgbm90Ci1jaGFuZ2UgaXRzIGFkZHJlc3MgZHVyaW5nIGl0cyBsaWZldGltZS4KLQotV2hlbiB0aGUgY2hhcnMgYnVyc3Qgb3ZlciBhIGNodW5rIGJvdW5kYXJ5LCB3ZSBhbGxvY2F0ZSBhIGxhcmdlcgotY2h1bmssIGFuZCB0aGVuIGNvcHkgdGhlIHBhcnRseSBmb3JtZWQgb2JqZWN0IGZyb20gdGhlIGVuZCBvZiB0aGUgb2xkCi1jaHVuayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgbGFyZ2VyIGNodW5rLiAgV2UgdGhlbiBjYXJyeSBvbgotYWNjcmV0aW5nIGNoYXJhY3RlcnMgdG8gdGhlIGVuZCBvZiB0aGUgb2JqZWN0IGFzIHdlIG5vcm1hbGx5IHdvdWxkLgotCi1BIHNwZWNpYWwgbWFjcm8gaXMgcHJvdmlkZWQgdG8gYWRkIGEgc2luZ2xlIGNoYXIgYXQgYSB0aW1lIHRvIGEKLWdyb3dpbmcgb2JqZWN0LiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiByZWdpc3RlciB2YXJpYWJsZXMsIHdoaWNoCi1icmVhayB0aGUgb3JkaW5hcnkgJ2dyb3d0aCcgbWFjcm8uCi0KLVN1bW1hcnk6Ci0JV2UgYWxsb2NhdGUgbGFyZ2UgY2h1bmtzLgotCVdlIGNhcnZlIG91dCBvbmUgb2JqZWN0IGF0IGEgdGltZSBmcm9tIHRoZSBjdXJyZW50IGNodW5rLgotCU9uY2UgY2FydmVkLCBhbiBvYmplY3QgbmV2ZXIgbW92ZXMuCi0JV2UgYXJlIGZyZWUgdG8gYXBwZW5kIGRhdGEgb2YgYW55IHNpemUgdG8gdGhlIGN1cnJlbnRseQotCSAgZ3Jvd2luZyBvYmplY3QuCi0JRXhhY3RseSBvbmUgb2JqZWN0IGlzIGdyb3dpbmcgaW4gYW4gb2JzdGFjayBhdCBhbnkgb25lIHRpbWUuCi0JWW91IGNhbiBydW4gb25lIG9ic3RhY2sgcGVyIGNvbnRyb2wgYmxvY2suCi0JWW91IG1heSBoYXZlIGFzIG1hbnkgY29udHJvbCBibG9ja3MgYXMgeW91IGRhcmUuCi0JQmVjYXVzZSBvZiB0aGUgd2F5IHdlIGRvIGl0LCB5b3UgY2FuIGB1bndpbmQnIGFuIG9ic3RhY2sKLQkgIGJhY2sgdG8gYSBwcmV2aW91cyBzdGF0ZS4gKFlvdSBtYXkgcmVtb3ZlIG9iamVjdHMgbXVjaAotCSAgYXMgeW91IHdvdWxkIHdpdGggYSBzdGFjay4pCi0qLwotCi0KLS8qIERvbid0IGRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbW9yZSB0aGFuIG9uY2UuICAqLwotCi0jaWZuZGVmIF9PQlNUQUNLX0gKLSNkZWZpbmUgX09CU1RBQ0tfSCAxCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQwKLS8qIFdlIHVzZSBzdWJ0cmFjdGlvbiBvZiAoY2hhciAqKSAwIGluc3RlYWQgb2YgY2FzdGluZyB0byBpbnQKLSAgIGJlY2F1c2Ugb24gd29yZC1hZGRyZXNzYWJsZSBtYWNoaW5lcyBhIHNpbXBsZSBjYXN0IHRvIGludAotICAgbWF5IGlnbm9yZSB0aGUgYnl0ZS13aXRoaW4td29yZCBmaWVsZCBvZiB0aGUgcG9pbnRlci4gICovCi0KLSNpZm5kZWYgX19QVFJfVE9fSU5UCi0jIGRlZmluZSBfX1BUUl9UT19JTlQoUCkgKChQKSAtIChjaGFyICopIDApCi0jZW5kaWYKLQotI2lmbmRlZiBfX0lOVF9UT19QVFIKLSMgZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKFApICsgKGNoYXIgKikgMCkKLSNlbmRpZgotCi0vKiBXZSBuZWVkIHRoZSB0eXBlIG9mIHRoZSByZXN1bHRpbmcgb2JqZWN0LiAgSWYgX19QVFJESUZGX1RZUEVfXyBpcwotICAgZGVmaW5lZCwgYXMgd2l0aCBHTlUgQywgdXNlIHRoYXQ7IHRoYXQgd2F5IHdlIGRvbid0IHBvbGx1dGUgdGhlCi0gICBuYW1lc3BhY2Ugd2l0aCA8c3RkZGVmLmg+J3Mgc3ltYm9scy4gIE90aGVyd2lzZSwgaWYgPHN0ZGRlZi5oPiBpcwotICAgYXZhaWxhYmxlLCBpbmNsdWRlIGl0IGFuZCB1c2UgcHRyZGlmZl90LiAgSW4gdHJhZGl0aW9uYWwgQywgbG9uZyBpcwotICAgdGhlIGJlc3QgdGhhdCB3ZSBjYW4gZG8uICAqLwotCi0jaWZkZWYgX19QVFJESUZGX1RZUEVfXwotIyBkZWZpbmUgUFRSX0lOVF9UWVBFIF9fUFRSRElGRl9UWVBFX18KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1REREVGX0gKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPgotIyAgZGVmaW5lIFBUUl9JTlRfVFlQRSBwdHJkaWZmX3QKLSMgZWxzZQotIyAgZGVmaW5lIFBUUl9JTlRfVFlQRSBsb25nCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUklOR19ICi0jIGluY2x1ZGUgPHN0cmluZy5oPgotIyBkZWZpbmUgX29ic3RhY2tfbWVtY3B5KFRvLCBGcm9tLCBOKSBtZW1jcHkgKChUbyksIChGcm9tKSwgKE4pKQotI2Vsc2UKLSMgaWZkZWYgbWVtY3B5Ci0jICBkZWZpbmUgX29ic3RhY2tfbWVtY3B5KFRvLCBGcm9tLCBOKSBtZW1jcHkgKChUbyksIChGcm9tKSwgKE4pKQotIyBlbHNlCi0jICBkZWZpbmUgX29ic3RhY2tfbWVtY3B5KFRvLCBGcm9tLCBOKSBiY29weSAoKEZyb20pLCAoVG8pLCAoTikpCi0jIGVuZGlmCi0jZW5kaWYKLQotc3RydWN0IF9vYnN0YWNrX2NodW5rCQkvKiBMaXZlcyBhdCBmcm9udCBvZiBlYWNoIGNodW5rLiAqLwotewotICBjaGFyICAqbGltaXQ7CQkJLyogMSBwYXN0IGVuZCBvZiB0aGlzIGNodW5rICovCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcHJldjsJLyogYWRkcmVzcyBvZiBwcmlvciBjaHVuayBvciBOVUxMICovCi0gIGNoYXIJY29udGVudHNbNF07CQkvKiBvYmplY3RzIGJlZ2luIGhlcmUgKi8KLX07Ci0KLXN0cnVjdCBvYnN0YWNrCQkvKiBjb250cm9sIGN1cnJlbnQgb2JqZWN0IGluIGN1cnJlbnQgY2h1bmsgKi8KLXsKLSAgbG9uZwljaHVua19zaXplOwkJLyogcHJlZmVycmVkIHNpemUgdG8gYWxsb2NhdGUgY2h1bmtzIGluICovCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7CS8qIGFkZHJlc3Mgb2YgY3VycmVudCBzdHJ1Y3Qgb2JzdGFja19jaHVuayAqLwotICBjaGFyCSpvYmplY3RfYmFzZTsJCS8qIGFkZHJlc3Mgb2Ygb2JqZWN0IHdlIGFyZSBidWlsZGluZyAqLwotICBjaGFyCSpuZXh0X2ZyZWU7CQkvKiB3aGVyZSB0byBhZGQgbmV4dCBjaGFyIHRvIGN1cnJlbnQgb2JqZWN0ICovCi0gIGNoYXIJKmNodW5rX2xpbWl0OwkJLyogYWRkcmVzcyBvZiBjaGFyIGFmdGVyIGN1cnJlbnQgY2h1bmsgKi8KLSAgUFRSX0lOVF9UWVBFIHRlbXA7CQkvKiBUZW1wb3JhcnkgZm9yIHNvbWUgbWFjcm9zLiAgKi8KLSAgaW50ICAgYWxpZ25tZW50X21hc2s7CQkvKiBNYXNrIG9mIGFsaWdubWVudCBmb3IgZWFjaCBvYmplY3QuICovCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotICAvKiBUaGVzZSBwcm90b3R5cGVzIHZhcnkgYmFzZWQgb24gYHVzZV9leHRyYV9hcmcnLCBhbmQgd2UgdXNlCi0gICAgIGNhc3RzIHRvIHRoZSBwcm90b3R5cGVsZXNzIGZ1bmN0aW9uIHR5cGUgaW4gYWxsIGFzc2lnbm1lbnRzLAotICAgICBidXQgaGF2aW5nIHByb3RvdHlwZXMgaGVyZSBxdWlldHMgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCpjaHVua2Z1bikgKHZvaWQgKiwgbG9uZyk7Ci0gIHZvaWQgKCpmcmVlZnVuKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKik7Ci0gIHZvaWQgKmV4dHJhX2FyZzsJCS8qIGZpcnN0IGFyZyBmb3IgY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyAqLwotI2Vsc2UKLSAgc3RydWN0IF9vYnN0YWNrX2NodW5rICooKmNodW5rZnVuKSAoKTsgLyogVXNlcidzIGZjbiB0byBhbGxvY2F0ZSBhIGNodW5rLiAgKi8KLSAgdm9pZCAoKmZyZWVmdW4pICgpOwkJLyogVXNlcidzIGZ1bmN0aW9uIHRvIGZyZWUgYSBjaHVuay4gICovCi0gIGNoYXIgKmV4dHJhX2FyZzsJCS8qIGZpcnN0IGFyZyBmb3IgY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyAqLwotI2VuZGlmCi0gIHVuc2lnbmVkIHVzZV9leHRyYV9hcmc6MTsJLyogY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyB0YWtlIGV4dHJhIGFyZyAqLwotICB1bnNpZ25lZCBtYXliZV9lbXB0eV9vYmplY3Q6MTsvKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGN1cnJlbnQKLQkJCQkgICBjaHVuayBjb250YWlucyBhIHplcm8tbGVuZ3RoIG9iamVjdC4gIFRoaXMKLQkJCQkgICBwcmV2ZW50cyBmcmVlaW5nIHRoZSBjaHVuayBpZiB3ZSBhbGxvY2F0ZQotCQkJCSAgIGEgYmlnZ2VyIGNodW5rIHRvIHJlcGxhY2UgaXQuICovCi0gIHVuc2lnbmVkIGFsbG9jX2ZhaWxlZDoxOwkvKiBObyBsb25nZXIgdXNlZCwgYXMgd2Ugbm93IGNhbGwgdGhlIGZhaWxlZAotCQkJCSAgIGhhbmRsZXIgb24gZXJyb3IsIGJ1dCByZXRhaW5lZCBmb3IgYmluYXJ5Ci0JCQkJICAgY29tcGF0aWJpbGl0eS4gICovCi19OwotCi0vKiBEZWNsYXJlIHRoZSBleHRlcm5hbCBmdW5jdGlvbnMgd2UgdXNlOyB0aGV5IGFyZSBpbiBvYnN0YWNrLmMuICAqLwotCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotZXh0ZXJuIHZvaWQgX29ic3RhY2tfbmV3Y2h1bmsgKHN0cnVjdCBvYnN0YWNrICosIGludCk7Ci1leHRlcm4gdm9pZCBfb2JzdGFja19mcmVlIChzdHJ1Y3Qgb2JzdGFjayAqLCB2b2lkICopOwotZXh0ZXJuIGludCBfb2JzdGFja19iZWdpbiAoc3RydWN0IG9ic3RhY2sgKiwgaW50LCBpbnQsCi0JCQkgICAgdm9pZCAqKCopIChsb25nKSwgdm9pZCAoKikgKHZvaWQgKikpOwotZXh0ZXJuIGludCBfb2JzdGFja19iZWdpbl8xIChzdHJ1Y3Qgb2JzdGFjayAqLCBpbnQsIGludCwKLQkJCSAgICAgdm9pZCAqKCopICh2b2lkICosIGxvbmcpLAotCQkJICAgICB2b2lkICgqKSAodm9pZCAqLCB2b2lkICopLCB2b2lkICopOwotZXh0ZXJuIGludCBfb2JzdGFja19tZW1vcnlfdXNlZCAoc3RydWN0IG9ic3RhY2sgKik7Ci0jZWxzZQotZXh0ZXJuIHZvaWQgX29ic3RhY2tfbmV3Y2h1bmsgKCk7Ci1leHRlcm4gdm9pZCBfb2JzdGFja19mcmVlICgpOwotZXh0ZXJuIGludCBfb2JzdGFja19iZWdpbiAoKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW5fMSAoKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfbWVtb3J5X3VzZWQgKCk7Ci0jZW5kaWYKLQwKLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0KLS8qIERvIHRoZSBmdW5jdGlvbi1kZWNsYXJhdGlvbnMgYWZ0ZXIgdGhlIHN0cnVjdHMKLSAgIGJ1dCBiZWZvcmUgZGVmaW5pbmcgdGhlIG1hY3Jvcy4gICovCi0KLXZvaWQgb2JzdGFja19pbml0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLXZvaWQgKiBvYnN0YWNrX2FsbG9jIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IHNpemUpOwotCi12b2lkICogb2JzdGFja19jb3B5IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYWRkcmVzcywgaW50IHNpemUpOwotdm9pZCAqIG9ic3RhY2tfY29weTAgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICphZGRyZXNzLCBpbnQgc2l6ZSk7Ci0KLXZvaWQgb2JzdGFja19mcmVlIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYmxvY2spOwotCi12b2lkIG9ic3RhY2tfYmxhbmsgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Ci0KLXZvaWQgb2JzdGFja19ncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqZGF0YSwgaW50IHNpemUpOwotdm9pZCBvYnN0YWNrX2dyb3cwIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqZGF0YSwgaW50IHNpemUpOwotCi12b2lkIG9ic3RhY2tfMWdyb3cgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgZGF0YV9jaGFyKTsKLXZvaWQgb2JzdGFja19wdHJfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEpOwotdm9pZCBvYnN0YWNrX2ludF9ncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGEpOwotCi12b2lkICogb2JzdGFja19maW5pc2ggKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLQotaW50IG9ic3RhY2tfb2JqZWN0X3NpemUgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLQotaW50IG9ic3RhY2tfcm9vbSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotdm9pZCBvYnN0YWNrX21ha2Vfcm9vbSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBzaXplKTsKLXZvaWQgb2JzdGFja18xZ3Jvd19mYXN0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGFfY2hhcik7Ci12b2lkIG9ic3RhY2tfcHRyX2dyb3dfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEpOwotdm9pZCBvYnN0YWNrX2ludF9ncm93X2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgZGF0YSk7Ci12b2lkIG9ic3RhY2tfYmxhbmtfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBzaXplKTsKLQotdm9pZCAqIG9ic3RhY2tfYmFzZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotdm9pZCAqIG9ic3RhY2tfbmV4dF9mcmVlIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci1pbnQgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotaW50IG9ic3RhY2tfY2h1bmtfc2l6ZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotaW50IG9ic3RhY2tfbWVtb3J5X3VzZWQgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLQotI2VuZGlmIC8qIF9fU1REQ19fICovCi0KLS8qIE5vbi1BTlNJIEMgY2Fubm90IHJlYWxseSBzdXBwb3J0IGFsdGVybmF0aXZlIGZ1bmN0aW9ucyBmb3IgdGhlc2UgbWFjcm9zLAotICAgc28gd2UgZG8gbm90IGRlY2xhcmUgdGhlbS4gICovCi0KLS8qIEVycm9yIGhhbmRsZXIgY2FsbGVkIHdoZW4gYG9ic3RhY2tfY2h1bmtfYWxsb2MnIGZhaWxlZCB0byBhbGxvY2F0ZQotICAgbW9yZSBtZW1vcnkuICBUaGlzIGNhbiBiZSBzZXQgdG8gYSB1c2VyIGRlZmluZWQgZnVuY3Rpb24uICBUaGUKLSAgIGRlZmF1bHQgYWN0aW9uIGlzIHRvIHByaW50IGEgbWVzc2FnZSBhbmQgYWJvcnQuICAqLwotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLWV4dGVybiB2b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKHZvaWQpOwotI2Vsc2UKLWV4dGVybiB2b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0jZW5kaWYKLQotLyogRXhpdCB2YWx1ZSB1c2VkIHdoZW4gYHByaW50X2FuZF9hYm9ydCcgaXMgdXNlZC4gICovCi1leHRlcm4gaW50IG9ic3RhY2tfZXhpdF9mYWlsdXJlOwotDAotLyogUG9pbnRlciB0byBiZWdpbm5pbmcgb2Ygb2JqZWN0IGJlaW5nIGFsbG9jYXRlZCBvciB0byBiZSBhbGxvY2F0ZWQgbmV4dC4KLSAgIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IG5vdCBiZSB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICBiZWNhdXNlIGEgbmV3IGNodW5rIG1pZ2h0IGJlIG5lZWRlZCB0byBob2xkIHRoZSBmaW5hbCBzaXplLiAgKi8KLQotI2RlZmluZSBvYnN0YWNrX2Jhc2UoaCkgKChoKS0+b2JqZWN0X2Jhc2UpCi0KLS8qIFNpemUgZm9yIGFsbG9jYXRpbmcgb3JkaW5hcnkgY2h1bmtzLiAgKi8KLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX3NpemUoaCkgKChoKS0+Y2h1bmtfc2l6ZSkKLQotLyogUG9pbnRlciB0byBuZXh0IGJ5dGUgbm90IHlldCBhbGxvY2F0ZWQgaW4gY3VycmVudCBjaHVuay4gICovCi0KLSNkZWZpbmUgb2JzdGFja19uZXh0X2ZyZWUoaCkJKChoKS0+bmV4dF9mcmVlKQotCi0vKiBNYXNrIHNwZWNpZnlpbmcgbG93IGJpdHMgdGhhdCBzaG91bGQgYmUgY2xlYXIgaW4gYWRkcmVzcyBvZiBhbiBvYmplY3QuICAqLwotCi0jZGVmaW5lIG9ic3RhY2tfYWxpZ25tZW50X21hc2soaCkgKChoKS0+YWxpZ25tZW50X21hc2spCi0KLS8qIFRvIHByZXZlbnQgcHJvdG90eXBlIHdhcm5pbmdzIHByb3ZpZGUgY29tcGxldGUgYXJndW1lbnQgbGlzdCBpbgotICAgc3RhbmRhcmQgQyB2ZXJzaW9uLiAgKi8KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0KLSMgZGVmaW5lIG9ic3RhY2tfaW5pdChoKSBcCi0gIF9vYnN0YWNrX2JlZ2luICgoaCksIDAsIDAsIFwKLQkJICAodm9pZCAqKCopIChsb25nKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICh2b2lkICopKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmVnaW4oaCwgc2l6ZSkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAoc2l6ZSksIDAsIFwKLQkJICAodm9pZCAqKCopIChsb25nKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICh2b2lkICopKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4pIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAobG9uZykpIChjaHVua2Z1biksICh2b2lkICgqKSAodm9pZCAqKSkgKGZyZWVmdW4pKQotCi0jIGRlZmluZSBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbl93aXRoX2FyZyhoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuLCBhcmcpIFwKLSAgX29ic3RhY2tfYmVnaW5fMSAoKGgpLCAoc2l6ZSksIChhbGlnbm1lbnQpLCBcCi0JCSAgICAodm9pZCAqKCopICh2b2lkICosIGxvbmcpKSAoY2h1bmtmdW4pLCBcCi0JCSAgICAodm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSkgKGZyZWVmdW4pLCAoYXJnKSkKLQotIyBkZWZpbmUgb2JzdGFja19jaHVua2Z1bihoLCBuZXdjaHVua2Z1bikgXAotICAoKGgpIC0+IGNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopKHZvaWQgKiwgbG9uZykpIChuZXdjaHVua2Z1bikpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZnJlZWZ1bihoLCBuZXdmcmVlZnVuKSBcCi0gICgoaCkgLT4gZnJlZWZ1biA9ICh2b2lkICgqKSh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKSkgKG5ld2ZyZWVmdW4pKQotCi0jZWxzZQotCi0jIGRlZmluZSBvYnN0YWNrX2luaXQoaCkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAwLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAoKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICgpKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmVnaW4oaCwgc2l6ZSkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAoc2l6ZSksIDAsIFwKLQkJICAodm9pZCAqKCopICgpKSBvYnN0YWNrX2NodW5rX2FsbG9jLCAodm9pZCAoKikgKCkpIG9ic3RhY2tfY2h1bmtfZnJlZSkKLQotIyBkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24oaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1bikgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAoc2l6ZSksIChhbGlnbm1lbnQpLCBcCi0JCSAgICAodm9pZCAqKCopICgpKSAoY2h1bmtmdW4pLCAodm9pZCAoKikgKCkpIChmcmVlZnVuKSkKLQotIyBkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKSBcCi0gIF9vYnN0YWNrX2JlZ2luXzEgKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAoKSkgKGNodW5rZnVuKSwgKHZvaWQgKCopICgpKSAoZnJlZWZ1biksIChhcmcpKQotCi0jIGRlZmluZSBvYnN0YWNrX2NodW5rZnVuKGgsIG5ld2NodW5rZnVuKSBcCi0gICgoaCkgLT4gY2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikoKSkgKG5ld2NodW5rZnVuKSkKLQotIyBkZWZpbmUgb2JzdGFja19mcmVlZnVuKGgsIG5ld2ZyZWVmdW4pIFwKLSAgKChoKSAtPiBmcmVlZnVuID0gKHZvaWQgKCopKCkpIChuZXdmcmVlZnVuKSkKLQotI2VuZGlmCi0KLSNkZWZpbmUgb2JzdGFja18xZ3Jvd19mYXN0KGgsYWNoYXIpICgqKChoKS0+bmV4dF9mcmVlKSsrID0gYWNoYXIpCi0KLSNkZWZpbmUgb2JzdGFja19ibGFua19mYXN0KGgsbikgKChoKS0+bmV4dF9mcmVlICs9IChuKSkKLQotI2RlZmluZSBvYnN0YWNrX21lbW9yeV91c2VkKGgpIF9vYnN0YWNrX21lbW9yeV91c2VkIChoKQotDAotI2lmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotLyogTmV4dFN0ZXAgMi4wIGNjIGlzIHJlYWxseSBnY2MgMS45MyBidXQgaXQgZGVmaW5lcyBfX0dOVUNfXyA9IDIgYW5kCi0gICBkb2VzIG5vdCBpbXBsZW1lbnQgX19leHRlbnNpb25fXy4gIEJ1dCB0aGF0IGNvbXBpbGVyIGRvZXNuJ3QgZGVmaW5lCi0gICBfX0dOVUNfTUlOT1JfXy4gICovCi0jIGlmIF9fR05VQ19fIDwgMiB8fCAoX19OZVhUX18gJiYgIV9fR05VQ19NSU5PUl9fKQotIyAgZGVmaW5lIF9fZXh0ZW5zaW9uX18KLSMgZW5kaWYKLQotLyogRm9yIEdOVSBDLCBpZiBub3QgLXRyYWRpdGlvbmFsLAotICAgd2UgY2FuIGRlZmluZSB0aGVzZSBtYWNyb3MgdG8gY29tcHV0ZSBhbGwgYXJncyBvbmx5IG9uY2UKLSAgIHdpdGhvdXQgdXNpbmcgYSBnbG9iYWwgdmFyaWFibGUuCi0gICBBbHNvLCB3ZSBjYW4gYXZvaWQgdXNpbmcgdGhlIGB0ZW1wJyBzbG90LCB0byBtYWtlIGZhc3RlciBjb2RlLiAgKi8KLQotIyBkZWZpbmUgb2JzdGFja19vYmplY3Rfc2l6ZShPQlNUQUNLKQkJCQkJXAotICBfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0gICh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICAgICh1bnNpZ25lZCkgKF9fby0+bmV4dF9mcmVlIC0gX19vLT5vYmplY3RfYmFzZSk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfcm9vbShPQlNUQUNLKQkJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgICAodW5zaWduZWQpIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUpOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX21ha2Vfcm9vbShPQlNUQUNLLGxlbmd0aCkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKLSAgIGlmIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUgPCBfX2xlbikJCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2VtcHR5X3AoT0JTVEFDSykJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgICAoX19vLT5jaHVuay0+cHJldiA9PSAwICYmIF9fby0+bmV4dF9mcmVlIC0gX19vLT5jaHVuay0+Y29udGVudHMgPT0gMCk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfZ3JvdyhPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIF9fbGVuID4gX19vLT5jaHVua19saW1pdCkJCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKLSAgIF9vYnN0YWNrX21lbWNweSAoX19vLT5uZXh0X2ZyZWUsIChjaGFyICopICh3aGVyZSksIF9fbGVuKTsJCVwKLSAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2dyb3cwKE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAotICAgaWYgKF9fby0+bmV4dF9mcmVlICsgX19sZW4gKyAxID4gX19vLT5jaHVua19saW1pdCkJCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuICsgMSk7CQkJCVwKLSAgIF9vYnN0YWNrX21lbWNweSAoX19vLT5uZXh0X2ZyZWUsIChjaGFyICopICh3aGVyZSksIF9fbGVuKTsJCVwKLSAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKLSAgICooX19vLT5uZXh0X2ZyZWUpKysgPSAwOwkJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrXzFncm93KE9CU1RBQ0ssZGF0dW0pCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaWYgKF9fby0+bmV4dF9mcmVlICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgMSk7CQkJCQlcCi0gICAqKF9fby0+bmV4dF9mcmVlKSsrID0gKGRhdHVtKTsJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0vKiBUaGVzZSBhc3N1bWUgdGhhdCB0aGUgb2JzdGFjayBhbGlnbm1lbnQgaXMgZ29vZCBlbm91Z2ggZm9yIHBvaW50ZXJzIG9yIGludHMsCi0gICBhbmQgdGhhdCB0aGUgZGF0YSBhZGRlZCBzbyBmYXIgdG8gdGhlIGN1cnJlbnQgb2JqZWN0Ci0gICBzaGFyZXMgdGhhdCBtdWNoIGFsaWdubWVudC4gICovCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAodm9pZCAqKSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAodm9pZCAqKSk7CQkJCVwKLSAgICooKHZvaWQgKiopX19vLT5uZXh0X2ZyZWUpKysgPSAoKHZvaWQgKilkYXR1bSk7CQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAoaW50KSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAoaW50KSk7CQkJCVwKLSAgICooKGludCAqKV9fby0+bmV4dF9mcmVlKSsrID0gKChpbnQpZGF0dW0pOwkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19wdHJfZ3Jvd19mYXN0KGgsYXB0cikgKCooKHZvaWQgKiopIChoKS0+bmV4dF9mcmVlKSsrID0gKHZvaWQgKilhcHRyKQotIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KGgsYWludCkgKCooKGludCAqKSAoaCktPm5leHRfZnJlZSkrKyA9IChpbnQpIGFpbnQpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAotICAgaWYgKF9fby0+Y2h1bmtfbGltaXQgLSBfX28tPm5leHRfZnJlZSA8IF9fbGVuKQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4pOwkJCQkJXAotICAgX19vLT5uZXh0X2ZyZWUgKz0gX19sZW47CQkJCQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfYWxsb2MoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ibGFuayAoX19oLCAobGVuZ3RoKSk7CQkJCQlcCi0gICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19jb3B5KE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ncm93IChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weTAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX2ggPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBvYnN0YWNrX2dyb3cwIChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLS8qIFRoZSBsb2NhbCB2YXJpYWJsZSBpcyBuYW1lZCBfX28xIHRvIGF2b2lkIGEgbmFtZSBjb25mbGljdAotICAgd2hlbiBvYnN0YWNrX2JsYW5rIGlzIGNhbGxlZC4gICovCi0jIGRlZmluZSBvYnN0YWNrX2ZpbmlzaChPQlNUQUNLKSAgCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vMSA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIHZvaWQgKnZhbHVlOwkJCQkJCQkJXAotICAgdmFsdWUgPSAodm9pZCAqKSBfX28xLT5vYmplY3RfYmFzZTsJCQkJCVwKLSAgIGlmIChfX28xLT5uZXh0X2ZyZWUgPT0gdmFsdWUpCQkJCQlcCi0gICAgIF9fbzEtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7CQkJCQlcCi0gICBfX28xLT5uZXh0X2ZyZWUJCQkJCQkJXAotICAgICA9IF9fSU5UX1RPX1BUUiAoKF9fUFRSX1RPX0lOVCAoX19vMS0+bmV4dF9mcmVlKStfX28xLT5hbGlnbm1lbnRfbWFzaylcCi0JCSAgICAgJiB+IChfX28xLT5hbGlnbm1lbnRfbWFzaykpOwkJCVwKLSAgIGlmIChfX28xLT5uZXh0X2ZyZWUgLSAoY2hhciAqKV9fbzEtPmNodW5rCQkJCVwKLSAgICAgICA+IF9fbzEtPmNodW5rX2xpbWl0IC0gKGNoYXIgKilfX28xLT5jaHVuaykJCQlcCi0gICAgIF9fbzEtPm5leHRfZnJlZSA9IF9fbzEtPmNodW5rX2xpbWl0OwkJCQlcCi0gICBfX28xLT5vYmplY3RfYmFzZSA9IF9fbzEtPm5leHRfZnJlZTsJCQkJCVwKLSAgIHZhbHVlOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2ZyZWUoT0JTVEFDSywgT0JKKQkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIHZvaWQgKl9fb2JqID0gKE9CSik7CQkJCQkJCVwKLSAgIGlmIChfX29iaiA+ICh2b2lkICopX19vLT5jaHVuayAmJiBfX29iaiA8ICh2b2lkICopX19vLT5jaHVua19saW1pdCkgIFwKLSAgICAgX19vLT5uZXh0X2ZyZWUgPSBfX28tPm9iamVjdF9iYXNlID0gX19vYmo7CQkJCVwKLSAgIGVsc2UgKG9ic3RhY2tfZnJlZSkgKF9fbywgX19vYmopOyB9KQotDAotI2Vsc2UgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLwotCi0jIGRlZmluZSBvYnN0YWNrX29iamVjdF9zaXplKGgpIFwKLSAodW5zaWduZWQpICgoaCktPm5leHRfZnJlZSAtIChoKS0+b2JqZWN0X2Jhc2UpCi0KLSMgZGVmaW5lIG9ic3RhY2tfcm9vbShoKQkJXAotICh1bnNpZ25lZCkgKChoKS0+Y2h1bmtfbGltaXQgLSAoaCktPm5leHRfZnJlZSkKLQotIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKGgpIFwKLSAoKGgpLT5jaHVuay0+cHJldiA9PSAwICYmIChoKS0+bmV4dF9mcmVlIC0gKGgpLT5jaHVuay0+Y29udGVudHMgPT0gMCkKLQotLyogTm90ZSB0aGF0IHRoZSBjYWxsIHRvIF9vYnN0YWNrX25ld2NodW5rIGlzIGVuY2xvc2VkIGluICguLi4sIDApCi0gICBzbyB0aGF0IHdlIGNhbiBhdm9pZCBoYXZpbmcgdm9pZCBleHByZXNzaW9ucwotICAgaW4gdGhlIGFybXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0gICBDYXN0aW5nIHRoZSB0aGlyZCBvcGVyYW5kIHRvIHZvaWQgd2FzIHRyaWVkIGJlZm9yZSwKLSAgIGJ1dCBzb21lIGNvbXBpbGVycyB3b24ndCBhY2NlcHQgaXQuICAqLwotCi0jIGRlZmluZSBvYnN0YWNrX21ha2Vfcm9vbShoLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wKSwgMCkgOiAwKSkKLQotIyBkZWZpbmUgb2JzdGFja19ncm93KGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAotKCAoaCktPnRlbXAgPSAobGVuZ3RoKSwJCQkJCQkJXAotICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wID4gKGgpLT5jaHVua19saW1pdCkJCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXApLCAwKSA6IDApLAkJCVwKLSAgX29ic3RhY2tfbWVtY3B5ICgoaCktPm5leHRfZnJlZSwgKGNoYXIgKikgKHdoZXJlKSwgKGgpLT50ZW1wKSwJXAotICAoaCktPm5leHRfZnJlZSArPSAoaCktPnRlbXApCi0KLSMgZGVmaW5lIG9ic3RhY2tfZ3JvdzAoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCi0oIChoKS0+dGVtcCA9IChsZW5ndGgpLAkJCQkJCQlcCi0gICgoKGgpLT5uZXh0X2ZyZWUgKyAoaCktPnRlbXAgKyAxID4gKGgpLT5jaHVua19saW1pdCkJCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXAgKyAxKSwgMCkgOiAwKSwJCQlcCi0gIF9vYnN0YWNrX21lbWNweSAoKGgpLT5uZXh0X2ZyZWUsIChjaGFyICopICh3aGVyZSksIChoKS0+dGVtcCksCVwKLSAgKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wLAkJCQkJCVwKLSAgKigoaCktPm5leHRfZnJlZSkrKyA9IDApCi0KLSMgZGVmaW5lIG9ic3RhY2tfMWdyb3coaCxkYXR1bSkJCQkJCQlcCi0oICgoKGgpLT5uZXh0X2ZyZWUgKyAxID4gKGgpLT5jaHVua19saW1pdCkJCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgMSksIDApIDogMCksCQkJCVwKLSAgKCooKGgpLT5uZXh0X2ZyZWUpKysgPSAoZGF0dW0pKSkKLQotIyBkZWZpbmUgb2JzdGFja19wdHJfZ3JvdyhoLGRhdHVtKQkJCQkJXAotKCAoKChoKS0+bmV4dF9mcmVlICsgc2l6ZW9mIChjaGFyICopID4gKGgpLT5jaHVua19saW1pdCkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIHNpemVvZiAoY2hhciAqKSksIDApIDogMCksCQlcCi0gICgqKChjaGFyICoqKSAoKChoKS0+bmV4dF9mcmVlKz1zaXplb2YoY2hhciAqKSktc2l6ZW9mKGNoYXIgKikpKSA9ICgoY2hhciAqKSBkYXR1bSkpKQotCi0jIGRlZmluZSBvYnN0YWNrX2ludF9ncm93KGgsZGF0dW0pCQkJCQlcCi0oICgoKGgpLT5uZXh0X2ZyZWUgKyBzaXplb2YgKGludCkgPiAoaCktPmNodW5rX2xpbWl0KQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIHNpemVvZiAoaW50KSksIDApIDogMCksCQkJXAotICAoKigoaW50ICopICgoKGgpLT5uZXh0X2ZyZWUrPXNpemVvZihpbnQpKS1zaXplb2YoaW50KSkpID0gKChpbnQpIGRhdHVtKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3dfZmFzdChoLGFwdHIpICgqKChjaGFyICoqKSAoaCktPm5leHRfZnJlZSkrKyA9IChjaGFyICopIGFwdHIpCi0jIGRlZmluZSBvYnN0YWNrX2ludF9ncm93X2Zhc3QoaCxhaW50KSAoKigoaW50ICopIChoKS0+bmV4dF9mcmVlKSsrID0gKGludCkgYWludCkKLQotIyBkZWZpbmUgb2JzdGFja19ibGFuayhoLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPmNodW5rX2xpbWl0IC0gKGgpLT5uZXh0X2ZyZWUgPCAoaCktPnRlbXApCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wKSwgMCkgOiAwKSwJCQlcCi0gICgoaCktPm5leHRfZnJlZSArPSAoaCktPnRlbXApKQotCi0jIGRlZmluZSBvYnN0YWNrX2FsbG9jKGgsbGVuZ3RoKQkJCQkJXAotIChvYnN0YWNrX2JsYW5rICgoaCksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weShoLHdoZXJlLGxlbmd0aCkJCQkJCVwKLSAob2JzdGFja19ncm93ICgoaCksICh3aGVyZSksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weTAoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCi0gKG9ic3RhY2tfZ3JvdzAgKChoKSwgKHdoZXJlKSwgKGxlbmd0aCkpLCBvYnN0YWNrX2ZpbmlzaCAoKGgpKSkKLQotIyBkZWZpbmUgb2JzdGFja19maW5pc2goaCkgIAkJCQkJCVwKLSggKChoKS0+bmV4dF9mcmVlID09IChoKS0+b2JqZWN0X2Jhc2UJCQkJCVwKLSAgID8gKCgoaCktPm1heWJlX2VtcHR5X29iamVjdCA9IDEpLCAwKQkJCQkJXAotICAgOiAwKSwJCQkJCQkJCVwKLSAgKGgpLT50ZW1wID0gX19QVFJfVE9fSU5UICgoaCktPm9iamVjdF9iYXNlKSwJCQkJXAotICAoaCktPm5leHRfZnJlZQkJCQkJCQlcCi0gICAgPSBfX0lOVF9UT19QVFIgKChfX1BUUl9UT19JTlQgKChoKS0+bmV4dF9mcmVlKSsoaCktPmFsaWdubWVudF9tYXNrKQlcCi0JCSAgICAmIH4gKChoKS0+YWxpZ25tZW50X21hc2spKSwJCQkJXAotICAoKChoKS0+bmV4dF9mcmVlIC0gKGNoYXIgKikgKGgpLT5jaHVuawkJCQlcCi0gICAgPiAoaCktPmNodW5rX2xpbWl0IC0gKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAotICAgPyAoKGgpLT5uZXh0X2ZyZWUgPSAoaCktPmNodW5rX2xpbWl0KSA6IDApLAkJCQlcCi0gIChoKS0+b2JqZWN0X2Jhc2UgPSAoaCktPm5leHRfZnJlZSwJCQkJCVwKLSAgX19JTlRfVE9fUFRSICgoaCktPnRlbXApKQotCi0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSMgIGRlZmluZSBvYnN0YWNrX2ZyZWUoaCxvYmopCQkJCQkJXAotKCAoaCktPnRlbXAgPSAoY2hhciAqKSAob2JqKSAtIChjaGFyICopIChoKS0+Y2h1bmssCQkJXAotICAoKChoKS0+dGVtcCA+IDAgJiYgKGgpLT50ZW1wIDwgKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspXAotICAgPyAoaW50KSAoKGgpLT5uZXh0X2ZyZWUgPSAoaCktPm9iamVjdF9iYXNlCQkJCVwKLQkgICAgPSAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKQkJCQlcCi0gICA6ICgoKG9ic3RhY2tfZnJlZSkgKChoKSwgKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuayksIDApLCAwKSkpCi0jIGVsc2UKLSMgIGRlZmluZSBvYnN0YWNrX2ZyZWUoaCxvYmopCQkJCQkJXAotKCAoaCktPnRlbXAgPSAoY2hhciAqKSAob2JqKSAtIChjaGFyICopIChoKS0+Y2h1bmssCQkJXAotICAoKChoKS0+dGVtcCA+IDAgJiYgKGgpLT50ZW1wIDwgKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspXAotICAgPyAoaW50KSAoKGgpLT5uZXh0X2ZyZWUgPSAoaCktPm9iamVjdF9iYXNlCQkJCVwKLQkgICAgPSAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKQkJCQlcCi0gICA6IChfb2JzdGFja19mcmVlICgoaCksIChoKS0+dGVtcCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKSkpCi0jIGVuZGlmCi0KLSNlbmRpZiAvKiBub3QgX19HTlVDX18gb3Igbm90IF9fU1REQ19fICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQkvKiBDKysgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogb2JzdGFjay5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cgYi9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZTNkZDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTkyOSArMCwwIEBACi1UaHUgSnVsICAxIDAwOjE3OjI0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChzdHJ1Y3QgcGFfb3Bjb2RlKTogQWRkIG5ldyBmaWVsZCAiZmxhZ3MiLgotCShGTEFHU19TVFJJQ1QpOiBEZWZpbmUuCi0KLUZyaSBKdW4gMjUgMDQ6MjI6MDQgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0JCQkgIEplZmYgTGF3IDxsYXdAY3lnbnVzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIHBhMi4wIGNscmJ0cyBpbnN0cnVjdGlvbi4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIGVudHJpZXMgZm9yIG1maWEgYW5kIG10c2FyY20gaW5zdHJ1Y3Rpb25zLgotCi0xOTk5LTA2LTIzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogQWxsb3cgYGwnIHN1ZmZpeCBvbiBic3dhcC4gIEFsbG93IGB3JyBzdWZmaXggb24gYXJwbCwKLQlsbGR0LCBsbXN3LCBsdHIsIHN0ciwgdmVyciwgdmVydy4gIEFkZCBGUCBmbGFnIHRvIGZjbW92Ki4gIEFkZCBGUAotCWZsYWcgdG8gZmNvbWkgYW5kIGZyaWVuZHMuCi0KLUZyaSBNYXkgMjggMTU6MjY6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBNb3ZlIGludGVnZXIgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgYWZ0ZXIKLQlpbnRlZ2VyIGxvZ2ljYWwgaW5zdHJ1Y3Rpb25zLiAgCi0KLTE5OTktMDUtMjggIExpbnVzIE5vcmRiZXJnICA8bGludXMubm9yZGJlcmdAY2FuaXQuc2U+Ci0KLQkqIG02OGsuaDogRG9jdW1lbnQgbmV3IGZvcm1hdHMgYEUnLCBgRycsIGBIJyBhbmQgbmV3IHBsYWNlcyBgTicsCi0JYG4nLCBgbycuCi0KLQkqIG02OGsuaDogRGVmaW5lIG1jZjUyMDZlLCBtY2Y1MzA3LCBtY2YuICBEb2N1bWVudCBuZXcgZm9ybWF0IGB1JwotCWFuZCBuZXcgcGxhY2VzIGBtJywgYE0nLCBgaCcuCi0KLVRodSBNYXkgMjcgMDQ6MTM6NTQgMTk5OSAgSm9lbCBTaGVycmlsbCAoam9lbEBPQVJjb3JwLmNvbQotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgc2V2ZXJhbCBwcm9jZXNzb3Igc3BlY2lmaWMgc3lzdGVtCi0JaW5zdHJ1Y3Rpb25zLgotCi1XZWQgTWF5IDI2IDE2OjU3OjQ0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIHNlY29uZCBlbnRyeSBmb3IgImNvbWIiLCAiY29taWIiLCAKLQkiYWRkYiIsIGFuZCAiYWRkaWIiIHRvIGJlIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4KLQotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5AYXByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKFJldmVyc2VNb2RybSk6IFJlbW92ZSBhbGwgb2NjdXJlbmNlcy4KLQkoSW52TWVtKTogQWRkIHRvIGNvbnRyb2wvZGVidWcvdGVzdCBtb3YgaW5zbnMsIG1vdmhscHMsIG1vdmxocHMsCi0JbW92bXNrcHMsIHBleHRydywgcG1vdm1za2IsIG1hc2ttb3ZxLgotCUNoYW5nZSBOb1N1ZiB0byBGUCBvbiBhbGwgTU1YLCBYTU0gYW5kIEFNRCBpbnNucyBhcyB0aGVzZSBhbGwKLQlpZ25vcmUgdGhlIGRhdGEgc2l6ZSBwcmVmaXguCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYiwgaTM4Nl9yZWd0YWIpOiBBZGQgc3VwcG9ydCBmb3IgUElJSSBTSU1ELgotCU1vc3RseSBzdG9sZW4gZnJvbSBEb3VnIExlZGZvcmQgPGRsZWRmb3JkQHJlZGhhdC5jb20+Ci0KLVNhdCBNYXkgIDggMjM6Mjc6MzUgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKFBQQ19PUENPREVfNjRfQlJJREdFKTogTmV3LgotCi0xOTk5LTA0LTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9BVFRSKTogRGVsZXRlIG1lbWJlciBudW1fbm9uYm9vbHMuCi0JKENHRU5fQVRUUl9UWVBFKTogVXBkYXRlLgotCShDR0VOX0FUVFJfTUFTSyk6IE51bWJlciBib29sZWFucyBzdGFydGluZyBhdCAwLgotCShDR0VOX0FUVFJfVkFMVUUpOiBVcGRhdGUuCi0JKENHRU5fSU5TTl9BVFRSKTogVXBkYXRlLgotCi1Nb24gQXByIDEyIDIzOjQzOjI3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChmbXB5ZmFkZCwgZm1weW5mYWRkLCBmbmVnLCBmbmVnYWJzKTogTmV3IFBBMi4wCi0JaW5zdHJ1Y3Rpb25zLgotCi1UdWUgTWFyIDIzIDExOjI0OjM4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChiYiwgYnZiKTogVHdlYWsgb3Bjb2RlL21hc2suCi0KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fSVNBLENHRU5fTUFDSCk6IE5ldyB0eXBlZGVmcy4KLQkoc3RydWN0IGNnZW5fY3B1X2Rlc2MpOiBSZW5hbWUgbWVtYmVyIG1hY2ggdG8gbWFjaHMuICBOZXcgbWVtYmVyIGlzYXMuCi0JTmV3IG1lbWJlcnMgd29yZF9iaXRzaXplLGRlZmF1bHRfaW5zbl9iaXRzaXplLGJhc2VfaW5zbi1iaXRzaXplLAotCW1pbl9pbnNuX2JpdHNpemUsbWF4X2luc25fYml0c2l6ZSxpc2FfdGFibGUsbWFjaF90YWJsZSxyZWJ1aWxkX3RhYmxlcy4KLQlEZWxldGUgbWVtYmVyIG1heF9pbnNuX3NpemUuCi0JKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcpOiBOZXcgZW51bS4KLQkoY3B1X29wZW4pOiBVcGRhdGUgcHJvdG90eXBlLgotCShjcHVfb3Blbl8xKTogRGVjbGFyZS4KLQkoY2dlbl9zZXRfY3B1KTogRGVsZXRlLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9IV19UQUJMRSk6IERlbGV0ZSBgbnVtX2luaXRfZW50cmllcycgbWVtYmVyLgotCShDR0VOX09QRVJBTkRfTklMKTogTmV3IG1hY3JvLgotCShDR0VOX09QRVJBTkQpOiBOZXcgbWVtYmVyIGB0eXBlJy4KLQkoQGFyY2hAX2NnZW5fb3BlcmFuZF90YWJsZSk6IERlbGV0ZSBkZWNsLgotCShDR0VOX09QRVJBTkRfSU5ERVgsQ0dFTl9PUEVSQU5EX1RZUEUsQ0dFTl9PUEVSQU5EX0VOVFJZKTogRGVsZXRlLgotCShDR0VOX09QRVJBTkRfVEFCTEUpOiBOZXcgc3RydWN0LgotCShjZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUsY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0pOiBEZWNsYXJlLgotCShDR0VOX09QSU5TVCk6IFBvaW50ZXIgdG8gb3BlcmFuZCB0YWJsZSBlbnRyeSByZXBsYWNlZCB3aXRoIGVudW0uCi0JKENHRU5fQ1BVX1RBQkxFKTogTmV3IG1lbWJlciBgaXNhJy4gIENoYW5nZSBtZW1iZXIgYG9wZXJhbmRfdGFibGUnLAotCW5vdyBhIENHRU5fT1BFUkFORF9UQUJMRS4gIEFkZCBDR0VOX0NQVV9ERVNDIGFyZyB0bwotCXtnZXQsc2V0fV97aW50LHZtYX1fb3BlcmFuZC4KLQkoQGFyY2hAX2NnZW5fY3B1X29wZW4pOiBOZXcgYXJnIGBpc2EnLgotCShjZ2VuX3NldF9jcHUpOiBEaXR0by4KLQotRnJpIEZlYiAyNiAwMjozNjo0NSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEZpbGwgaW4gY21vdiBhbmQgZmNtb3YgYWx0ZXJuYXRlcy4gIEFkZCBmY29taSBzaG9ydCBmb3Jtcy4KLQotMTk5OS0wMi0yNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGVudW0gY2dlbl9hc21fdHlwZSk6IEFkZCBDR0VOX0FTTV9OT05FLgotCShDR0VOX0hXX0VOVFJZKTogRGVsZXRlIG1lbWJlciBgbmV4dCcuICBDaGFuZ2UgdHlwZSBvZiBgdHlwZScgdG8KLQllbnVtIGNnZW5faHdfdHlwZS4KLQkoQ0dFTl9IV19UQUJMRSk6IE5ldyBzdHJ1Y3QuCi0JKGh3X3RhYmxlKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShDR0VOX09QRVJBTkQpOiBDaGFuZ2UgbWVtYmVyIGh3IHRvIGh3X3R5cGUsIGNoYW5nZSB0eXBlIGZyb20gcG9pbnRlcgotCXRvIHRhYmxlIGVudHJ5IHRvIGVudW0uCi0JKENHRU5fT1BJTlNUKTogRGl0dG8uCi0JKENHRU5fQ1BVX1RBQkxFKTogQ2hhbmdlIG1lbWJlciBod19saXN0IHRvIGh3X3RhYmxlLgotCi1TYXQgRmViIDEzIDE0OjEzOjQ0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKEFYUF9PUENPREVfRVY2KTogTmV3LgotCShBWFBfT1BDT0RFX05PUEFMKTogSW5jbHVkZSBpdC4KLQotMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQ1BVX0RFU0MpOiBSZW5hbWVkIGZyb20gQ0dFTl9PUENPREVfREVTQy4KLQlBbGwgdXNlcyB1cGRhdGVkLiAgTmV3IG1lbWJlcnMgaW50X2luc25fcCwgbWF4X2luc25fc2l6ZSwKLQlwYXJzZV9vcGVyYW5kLGluc2VydF9vcGVyYW5kLGV4dHJhY3Rfb3BlcmFuZCxwcmludF9vcGVyYW5kLAotCXNpemVvZl9maWVsZHMsc2V0X2ZpZWxkc19iaXRzaXplLGdldF9pbnRfb3BlcmFuZCxzZXRfaW50X29wZXJhbmQsCi0JZ2V0X3ZtYV9vcGVyYW5kLHNldF92bWFfb3BlcmFuZCxwYXJzZV9oYW5kbGVycyxpbnNlcnRfaGFuZGxlcnMsCi0JZXh0cmFjdF9oYW5kbGVycyxwcmludF9oYW5kbGVycy4KLQkoQ0dFTl9BVFRSKTogQ2hhbmdlIHR5cGUgb2YgbnVtX25vbmJvb2xzIHRvIHVuc2lnbmVkIGludC4KLQkoQ0dFTl9BVFRSX0JPT0xfT0ZGU0VUKTogTmV3IG1hY3JvLgotCShDR0VOX0FUVFJfTUFTSyk6IFN1YnRyYWN0IGl0IHRvIGNvbXB1dGUgYml0IG51bWJlci4KLQkoQ0dFTl9BVFRSX1ZBTFVFKTogUmVkbyBib29sL25vbmJvb2wgYXR0ciBjYWxjdWxhdGlvbi4KLQkoY2dlbl9vcGNvZGVfaGFuZGxlcik6IFJlbmFtZWQgZnJvbSBjZ2VuX2Jhc2UuCi0JKENHRU5fSFdfQVRUUl9WQUxVRSk6IFJlbmFtZWQgZnJvbSBDR0VOX0hXX0FUVFIsIGFsbCB1c2VzIHVwZGF0ZWQuCi0JKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFKTogUmVuYW1lZCBmcm9tIENHRU5fT1BFUkFORF9BVFRSLAotCWFsbCB1c2VzIHVwZGF0ZWQuCi0JKENHRU5fT1BFUkFORF9JTkRFWCk6IFJld3JpdGUgdG8gdXNlIHRhYmxlIGVudHJ5LCBub3QgZ2xvYmFsLgotCShlbnVtIGNnZW5fb3BpbnN0X3R5cGUpOiBSZW5hbWVkIGZyb20gY2dlbl9vcGVyYW5kX2luc3RhbmNlX3R5cGUuCi0JKENHRU5fSUZMRF9BVFRSX1ZBTFVFKTogUmVuYW1lZCBmcm9tIENHRU5fSUZMRF9BVFRSLCBhbGwgdXNlcyB1cGRhdGVkLgotCShDR0VOX09QQ09ERSxDR0VOX0lCQVNFKTogTmV3IHR5cGVzLgotCShDR0VOX0lOU04pOiBSZXdyaXRlLgotCShDR0VOX3tBU00sRElTfV9IQVNIKik6IERlbGV0ZS4KLQkoaW5pdF9vcGNvZGVfdGFibGUsaW5pdF9pYmxkX3RhYmxlKTogRGVjbGFyZS4KLQkoQ0dFTl9JTlNOX0FUVFIpOiBOZXcgdHlwZS4KLQotTW9uIEZlYiAgMSAyMTowOToxNCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBpMzg2LmggKGRfU3VmLCB4X1N1Ziwgc2xkX1N1Ziwgc2xkeF9TdWYsIGJ3bGRfU3VmKTogIERlZmluZS4KLSAgICAgICAgKHhfRlAsIGRfRlAsIGRsc19GUCwgc2xkeF9GUCk6ICBEZWZpbmUuCi0gICAgICAgIENoYW5nZSAqU3VmIGRlZmluaXRpb25zIHRvIGluY2x1ZGUgeCBhbmQgZCBzdWZmaXhlcy4KLSAgICAgICAgKG1vdnN4KTogIFVzZSB3X1N1ZiBhbmQgYl9TdWYuCi0gICAgICAgIChtb3Z6eCk6ICBMaWtld2lzZS4KLSAgICAgICAgKG1vdnMpOiAgVXNlIGJ3bGRfU3VmLgotICAgICAgICAoZmxkKTogIENoYW5nZSBvcmRlcmluZy4gIFVzZSBzbGRfRlAuCi0gICAgICAgIChmaWxkKTogIEFkZCBJbnRlbCBTeW50YXggZXF1aXZhbGVudCBvZiBmaWxkcS4KLSAgICAgICAgKGZzdCk6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZmlzdCk6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZnN0cCk6ICBVc2Ugc2xkX0ZQLiAgQWRkIHhfRlAgdmVyc2lvbi4KLSAgICAgICAgKGZpc3RwKTogIExMb25nTWVtIHZlcnNpb24gZm9yIEludGVsIFN5bnRheC4KLSAgICAgICAgKGZjb20sIGZjb21wKTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmYWRkLCBmaWFkZCwgZnN1Yik6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZnN1YnIpOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZtdWwsIGZpbXVsLCBmZHZpLCBmaWRpdiwgZmRpdnIpOiAgVXNlIHNsZF9GUC4KLQotMTk5OS0wMS0yNyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGVudW0gY2dlbl9tb2RlKTogQWRkIENHRU5fTU9ERV9UQVJHRVRfTUFYLCBDR0VOX01PREVfSU5ULAotCUNHRU5fTU9ERV9VSU5ULgotCi1TYXQgSmFuIDE2IDAxOjI5OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChidik6IEZpeCBtYXNrLgotCi0xOTk5LTAxLTA1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9BVFRSX1ZBTFVFX1RZUEUpOiBOZXcgdHlwZWRlZi4KLQkoQ0dFTl9BVFRSKTogVXNlIGl0LgotCShDR0VOX0FUVFJfVFlQRSxDR0VOX0FUVFJfRU5UUlkpOiBEaXR0by4KLQkoQ0dFTl9BVFRSX1RBQkxFKTogTmV3IG1lbWJlciBkZmF1bHQuCi0KLTE5OTgtMTItMzAgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE1JUFMxNl9JTlNOX0JSQU5DSCk6IE5ldy4KLQotV2VkIERlYyAgOSAxMDozODo0OCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCVRoZSBmb2xsb3dpbmcgaXMgcGFydCBvZiBhIGNoYW5nZSBtYWRlIGJ5IEVkaXRoIEVwc3RlaW4KLSAJPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbgotIAljaGFuZ2VzIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cgZW50cmllcy4KLQotCSogaHBwYS5oIChjb21wbGV0ZXJfY2hhcnMpOiBsaXN0IG9mIGNoYXJzIHRvIG5vdCBwdXQgYSBzcGFjZQotIAlhZnRlci4KLQotU3VuIERlYyAgNiAxMzoyMTozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFBlcm1pdCB3IHN1ZmZpeCBvbiBwcm9jZXNzb3IgY29udHJvbCBhbmQKLSAJc3RhdHVzIHdvcmQgaW5zdHJ1Y3Rpb25zLgotCi0xOTk4LTExLTMwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoc3RydWN0IGNnZW5faHdfZW50cnkpOiBEZWxldGUgY29uc3Qgb24gYXR0cnMgbWVtYmVyLgotCShzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5KTogRGl0dG8uCi0JKHN0cnVjdCBjZ2VuX29wZXJhbmQpOiBEaXR0by4KLQkoQ0dFTl9JRkxEKTogTmV3IHR5cGVkZWYsIHdpdGggYXNzb2NpYXRlZCBhY2Nlc3MgbWFjcm9zLgotCShDR0VOX0lGTVQpOiBOZXcgdHlwZWRlZiwgd2l0aCBhc3NvY2lhdGVkIGFjY2VzcyBtYWNyb3MuCi0JKENHRU5fSUZNVCk6IFJlbmFtZWQgZnJvbSBDR0VOX0ZPUk1BVC4gIE5ldyBtZW1iZXIgYGlmbGRzJy4KLQkoQ0dFTl9JVkFMVUUpOiBOZXcgdHlwZWRlZi4KLQkoc3RydWN0IGNnZW5faW5zbik6IERlbGV0ZSBjb25zdCBvbiBzeW50YXgsYXR0cnMgbWVtYmVycy4KLQlgZm9ybWF0JyBub3cgcG9pbnRzIHRvIGZvcm1hdCBkYXRhLiAgVHlwZSBvZiBgdmFsdWUnIGlzIG5vdwotCUNHRU5fSVZBTFVFLgotCShzdHJ1Y3QgY2dlbl9vcGNvZGVfdGFibGUpOiBOZXcgbWVtYmVyIGlmbGRfdGFibGUuCi0KLTE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2V4dHJhY3RfZm4pOiBVcGRhdGUgdHlwZSBvZiBgYmFzZV9pbnNuJyBhcmcuCi0JKENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyBtZW1iZXIgYGF0dHJzJy4KLQkoQ0dFTl9PUEVSQU5EX0lOU1RBTkNFX3tBVFRSUyxBVFRSfSk6IE5ldyBtYWNyb3MuCi0JKGNnZW5fZGlzX2xvb2t1cF9pbnNuKTogVXBkYXRlIHR5cGUgb2YgYGJhc2VfaW5zbicgYXJnLgotCShjZ2VuX29wY29kZV90YWJsZSk6IFVwZGF0ZSB0eXBlIG9mIGRpc19oYXNoIGZuLgotCShleHRyYWN0X29wZXJhbmQpOiBVcGRhdGUgdHlwZSBvZiBgaW5zbl92YWx1ZScgYXJnLgotCi1UaHUgT2N0IDI5IDExOjM4OjM2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9WRVJTSU9OX3tNQUpPUixNSU5PUixGSVhMRVZFTH0pOiBEZWxldGUuCi0KLVR1ZSBPY3QgMjcgMDg6NTc6NTkgMTk5OCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl9NVUxUKTogQWRkZWQuCi0KLVR1ZSBPY3QgMjAgMTE6MzE6MzQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKE1BWF9NTkVNX1NJWkUpOiBSZW5hbWUgZnJvbSBNQVhfT1BDT0RFX1NJWkUuCi0KLU1vbiBPY3QgMTkgMTI6NTA6MDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JTlNOX0lOVCk6IE5ldyB0eXBlZGVmLgotCShDR0VOX0lOVF9JTlNOX1ApOiBSZW5hbWVkIGZyb20gQ0dFTl9JTlRfSU5TTi4KLQkoQ0dFTl9JTlNOX0JZVEVTKTogUmVuYW1lZCBmcm9tIGNnZW5faW5zbl90LgotCShDR0VOX0lOU05fQllURVNfUFRSKTogTmV3IHR5cGVkZWYuCi0JKENHRU5fRVhUUkFDVF9JTkZPKTogTmV3IHR5cGVkZWYuCi0JKGNnZW5faW5zZXJ0X2ZuLGNnZW5fZXh0cmFjdF9mbik6IFVwZGF0ZS4KLQkoY2dlbl9vcGNvZGVfdGFibGUpOiBOZXcgbWVtYmVyIGBpbnNuX2VuZGlhbicuCi0JKGFzc2VtYmxlX2luc24sbG9va3VwX2luc24sbG9va3VwX2dldF9pbnNuX29wZXJhbmRzKTogVXBkYXRlLgotCShpbnNlcnRfb3BlcmFuZCxleHRyYWN0X29wZXJhbmQpOiBVcGRhdGUuCi0JKGNnZW5fZ2V0X2luc25fdmFsdWUsY2dlbl9wdXRfaW5zbl92YWx1ZSk6IEFkZCBwcm90b3R5cGVzLgotCi1GcmkgT2N0ICA5IDEzOjM4OjEzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQVRUUl9CT09MUyk6IE5ldyBtYWNyby4KLQkoc3RydWN0IENHRU5fSFdfRU5UUlkpOiBOZXcgbWVtYmVyIGBhdHRycycuCi0JKENHRU5fSFdfQVRUUik6IE5ldyBtYWNyby4KLQkoc3RydWN0IENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyBtZW1iZXIgYG5hbWUnLgotCShDR0VOX0lOU05fSU5WQUxJRF9QKTogTmV3IG1hY3JvLgotCi1Nb24gT2N0ICA1IDAwOjIxOjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBBZGQgImZpZCIuCi0JCi1TdW4gT2N0ICA0IDIxOjAwOjAwIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCUZyb20gUm9iZXJ0IEFuZHJldyBEYWxlIDxyb2JAbmIubmV0PgotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkIEFNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zLgotCShBTURfM0ROT1dfT1BDT0RFKTogRGVmaW5lLgotCi1UdWUgU2VwIDIyIDE3OjUzOjQ3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoRUlUSEVSX0JVVF9QUkVGRVJfTVUpOiBEZWZpbmUuCi0KLU1vbiBBdWcgMTAgMTQ6MDk6MzggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2luc24pOiAjaWYgMCBvdXQgZWxlbWVudCBgY2R4Jy4KLQotTW9uIEF1ZyAgMyAxMjoyMTo1NyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCU1vdmUgYWxsIGdsb2JhbCBzdGF0ZSBkYXRhIGludG8gb3Bjb2RlIHRhYmxlIHN0cnVjdCwgYW5kIHRyZWF0Ci0Jb3Bjb2RlIHRhYmxlIGFzIHNvbWV0aGluZyB0aGF0IGlzICJvcGVuZWQvY2xvc2VkIi4KLQkqIGNnZW4uaCAoQ0dFTl9PUENPREVfREVTQyk6IE5ldyB0eXBlLgotCShhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KLQkoY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbik6IEFkZCBwcm90b3R5cGUuCi0JKGNnZW5fY3VycmVudF9tYWNoaW5lLGNnZW5fY3VycmVudF9lbmRpYW4pOiBEZWxldGUuCi0JKENHRU5fT1BDT0RFX1RBQkxFKTogTmV3IG1lbWJlcnMgbWFjaCxlbmRpYW4sb3BlcmFuZF90YWJsZSwKLQlwYXJzZV9vcGVyYW5kX2ZuLGFzbV9oYXNoX3RhYmxlLGFzbV9oYXNoX3RhYmxlX2VudHJpZXMsCi0JZGlzX2hhc2hfdGFibGUsZGlzX2hhc2hfdGFibGVfZW50cmllcy4KLQkob3Bjb2RlX29wZW4sb3Bjb2RlX2Nsb3NlKTogQWRkIHByb3RvdHlwZXMuCi0KLQkqIGNnZW4uaCAoY2dlbl9pbnNuKTogTmV3IGVsZW1lbnQgYGNkeCcuCi0KLVRodSBKdWwgMzAgMjE6NDQ6MjUgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChGTEFHX0xLUik6IE5ldyBmbGFnIGZvciAibGVmdC1raWxscy1yaWdodCIgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgSnVsIDI4IDEwOjU5OjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgIm5vX21hdGNoX29wZXJhbmRzIiBmaWVsZCBmb3IgaW5zdHJ1Y3Rpb25zLgotCShNTjEwMzAwX01BWF9PUEVSQU5EUyk6IERlZmluZS4KLQotRnJpIEp1bCAyNCAxMTo0NDoyNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5fbWFjcm9faW5zbl9jb3VudCk6IERlY2xhcmUuCi0KLVR1ZSBKdWwgMjEgMTM6MTI6MTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9WRVJTSU9OX3tNQUpPUixNSU5PUixGSVhMRVZFTH0pOiBEZWZpbmUuCi0JKGNnZW5faW5zZXJ0X2ZuLGNnZW5fZXh0cmFjdF9mbik6IE5ldyBhcmcgYHBjJy4KLQkoZ2V0X29wZXJhbmQscHV0X29wZXJhbmQpOiBSZXBsYWNlZCB3aXRoIGdldF97aW50LHZtYX1fb3BlcmFuZCwKLQlzZXRfe2ludCx2bWF9X29wZXJhbmQuCi0KLUZyaSBKdW4gMjYgMTE6MDk6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IEFkZCAibWFjaGluZSIgZmllbGQgZm9yIGluc3RydWN0aW9ucy4KLQkoTU4xMDMsIEFNMzApOiBEZWZpbmUgbWFjaGluZSB0eXBlcy4KLQkKLUZyaSBKdW4gMTkgMTY6MDk6MDkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IFVzZSBGUCwgbm90IHNsX1N1ZiwgZm9yIGZ4c2F2ZSBhbmQgZnhyc3Rvci4KLQotMTk5OC0wNi0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIHN1cHBvcnQgZm9yIGZ4c2F2ZSwgZnhyc3Rvciwgc3lzZW50ZXIgYW5kIHN5c2V4aXQuCi0KLVNhdCBKdW4gMTMgMTE6MzE6MzUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgZ2VuZXJhbCBmb3JtIG9mIGFhZCBhbmQgYWFtLiAgQWRkIHVkMmEKLQlhbmQgdWQyYi4KLQkoaTM4Nl9yZWd0YWIpOiBBbGxvdyBjcjAuLjcsIGRiMC4uNywgZHIwLi43LCB0cjAuLjcsIG5vdCBqdXN0Ci0JdGhvc2UgdGhhdCBoYXBwZW4gdG8gYmUgaW1wbGVtZW50ZWQgb24gcGVudGl1bXMuCi0KLVR1ZSBKdW4gIDkgMTI6MTY6MDEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IENoYW5nZSBvY2N1cmVuY2VzIG9mIERhdGExNiB0byBTaXplMTYsIERhdGEzMiB0byBTaXplMzIsCi0JSWdub3JlRGF0YVNpemUgdG8gSWdub3JlU2l6ZS4gIEZsYWcgYWRkcmVzcyBhbmQgZGF0YSBzaXplIHByZWZpeGVzCi0Jd2l0aCBTaXplMTZ8SWdub3JlU2l6ZSBvciBTaXplMzJ8SWdub3JlU2l6ZS4KLQotTW9uIEp1biAgOCAxMjoxNTo1MiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoUkVQTkUpOiBSZW5hbWUgdG8gUkVQTkVfUFJFRklYX09QQ09ERS4KLQkoUkVQRSk6IFJlbmFtZSB0byBSRVBFX1BSRUZJWF9PUENPREUuCi0JKGkzODZfcmVndGFiX2VuZCk6IFJlbW92ZS4KLQkoaTM4Nl9wcmVmaXh0YWIsIGkzODZfcHJlZml4dGFiX2VuZCk6IFJlbW92ZS4KLQkoaTM4Nl9vcHRhYik6IFVzZSBOVUxMIGFzIHNlbnRpbmVsIHJhdGhlciB0aGFuICIiIHRvIHN1aXQgcmV3cml0ZQotCW9mIG1kX2JlZ2luLgotCShNQVhfT1BDT0RFX1NJWkUpOiBEZWZpbmUuCi0JKGkzODZfb3B0YWJfZW5kKTogUmVtb3ZlLgotCShzbF9TdWYpOiBEZWZpbmUuCi0JKHNsX0ZQKTogVXNlIHNsX1N1Zi4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWxsb3cgMTYgYml0IGRpc3BsYWNlbWVudCBmb3IgYG1vdgotCW1lbSxhY2MnLiAgQ29tYmluZSAxNiBhbmQgMzIgYml0IGZvcm1zIG9mIHZhcmlvdXMgaW5zbnMuICBBbGxvdyAxNgotCWJpdCBmb3JtIG9mIGxqbXAuICBBZGQgSXNQcmVmaXggbW9kaWZpZXIgdG8gcHJlZml4ZXMuICBBZGQgYWRkcjMyLAotCWRhdGEzMiwgZHdvcmQsIGFuZCBhZHdvcmQgcHJlZml4ZXMuCi0JKGkzODZfcmVndGFiKTogQWRkIEJhc2VJbmRleCBtb2RpZmllciB0byB2YWxpZCAxNiBiaXQgYmFzZS9pbmRleAotCXJlZ3MuCi0KLUZyaSBKdW4gIDUgMjM6NDI6NDMgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfcmVndGFiKTogUmVtb3ZlIEJhc2VJbmRleCBtb2RpZmllciBmcm9tIGVzcC4KLQotCSogaTM4Ni5oOiBBbGxvdyBgbCcgc3VmZml4IG9uIGZsZCwgZnN0LCBmc3RwLCBmY29tLCBmY29tcCB3aXRoCi0JcmVnaXN0ZXIgb3BlcmFuZHMsIGJlY2F1c2UgdGhpcyBpcyBhIGNvbW1vbiBpZGlvbS4gIEZsYWcgdGhlbSB3aXRoCi0JYSB3YXJuaW5nLiAgQWxsb3cgaWxsZWdhbCBmYWRkcCwgZnN1YnAsIGZzdWJycCwgZm11bHAsIGZkaXZwLAotCWZkaXZycCBiZWNhdXNlIGdjYyBlcnJvbmVvdXNseSBnZW5lcmF0ZXMgdGhlbS4gIEFsc28gZmxhZyB3aXRoIGEKLQl3YXJuaW5nLgotCi0JKiBpMzg2Lmg6IEFkZCBzdWZmaXggbW9kaWZpZXJzIHRvIG1vc3QgaW5zbnMsIGFuZCB0aWdodGVyIG9wZXJhbmQKLQljaGVja3MgaW4gc29tZSBjYXNlcy4gIEZpeCBhIG51bWJlciBvZiBVbml4V2FyZSBjb21wYXRpYmlsaXR5Ci0JaXNzdWVzIHdpdGggZmxvYXQgaW5zbnMuICBNZXJnZSBzb21lIGZsb2F0aW5nIHBvaW50IG9wY29kZXMsIHVzaW5nCi0JbmV3IEZsb2F0TUYgbW9kaWZpZXIuCi0JKFdPUkRfUFJFRklYX09QQ09ERSk6IFJlbmFtZSB0byBEQVRBX1BSRUZJWF9PUENPREUgZm9yCi0JY29uc2lzdGVuY3kuCi0KLQkqIGkzODYuaDogQ2hhbmdlIG9jY3VyZW5jZSBvZiBTaG9ydGZvcm1XIHRvIFd8U2hvcnRGb3JtLiAgQWRkCi0JSWdub3JlRGF0YVNpemUgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLVdlZCBKdW4gIDMgMTg6Mjg6NDUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IChvbmVfYnl0ZV9zZWdtZW50X2RlZmF1bHRzKTogUmVtb3ZlLgotCSh0d29fYnl0ZV9zZWdtZW50X2RlZmF1bHRzKTogUmVtb3ZlLgotCShpMzg2X3JlZ3RhYik6IEFkZCBCYXNlSW5kZXggdG8gMzIgYml0IHJlZ3MgcmVnX3R5cGUuCi0KLUZyaSBNYXkgMTUgMTU6NTk6MDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9od19sb29rdXBfYnlfbmFtZSk6IFJlbmFtZWQgZnJvbSBjZ2VuX2h3X2xvb2t1cC4KLQkoY2dlbl9od19sb29rdXBfYnlfbnVtKTogRGVjbGFyZS4KLQotVGh1IE1heSAgNyAwOToyNzo1OCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE9QX3tTSCxNQVNLfV9DT0RFMik6IEFkZGVkICJxIiBvcGVyYW5kIGZvcm1hdCBmb3IgbG93ZXIKLQl0ZW4gYml0cyBvZiBNSVBTIElTQTEgImJyZWFrIiBpbnN0cnVjdGlvbiwgYW5kIGZvciAic2RiYnAiCi0KLVRodSBNYXkgIDcgMDI6MTQ6MDggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9hc21faW5pdF9wYXJzZSk6IERlbGV0ZS4KLQkoY2dlbl9zYXZlX2ZpeHVwcyxjZ2VuX3Jlc3RvcmVfZml4dXBzLGNnZW5fc3dhcF9maXh1cHMpOiBEZWxldGUuCi0JKGNnZW5fYXNtX3JlY29yZF9yZWdpc3RlcixjZ2VuX2FzbV9maW5pc2hfaW5zbik6IERlbGV0ZS4KLQotTW9uIEFwciAyNyAxMDoxMzoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0FUVFJfVFlQRSk6IERlbGV0ZSBgY29uc3QnLCBtb3ZlZCB0byB1c2VzLgotCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGNnZW5faW5zbik6IE5ldyBtZW1iZXJzIG51bSwgZGF0YS4KLQkoQ0dFTl9JTlNOX1RBQkxFKTogTWVtYmVycyBhc21faGFzaCwgYXNtX2hhc2hfdGFibGVfc2l6ZSwKLQlkaXNfaGFzaCwgZGlzX2hhc2hfdGFibGVfc2l6ZSBtb3ZlZCB0byAuLi4KLQkoQ0dFTl9PUENPREVfVEFCTEUpLiAgSGVyZS4gIFJlbmFtZWQgZnJvbSBDR0VOX09QQ09ERV9EQVRBLgotCUFsbCB1c2VzIHVwZGF0ZWQuICBOZXcgbWVtYmVycyBhc21faGFzaF9wLCBkaXNfaGFzaF9wLgotCShDR0VOX01JTlNOX0VYUEFOU0lPTik6IE5ldyBzdHJ1Y3QuCi0JKGNnZW5fZXhwYW5kX21hY3JvX2luc24pOiBEZWNsYXJlLgotCShjZ2VuX21hY3JvX2luc25fY291bnQpOiBEZWNsYXJlLgotCShnZXRfaW5zbl9vcGVyYW5kcyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGxvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyk6IERlY2xhcmUuCi0KLVR1ZSBBcHIgMjEgMTc6MTE6MzIgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBDaGFuZ2UgaWNscktsdWRnZSBhbmQgaW11bEtsdWRnZSB0bwotCXJlZ0tsdWRnZS4gIEFkZCBvcGVyYW5kcyB0eXBlcyBmb3Igc3RyaW5nIGluc3RydWN0aW9ucy4KLQotTW9uIEFwciAyMCAxNDo0MDoyOSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoWCk6IFJlbmFtZWQgZnJvbSBgWl8nIHRvIHByZXNlcnZlIGZvcm1hdHRpbmcgb2Ygb3Bjb2RlCi0JdGFibGUuCi0KLVN1biBBcHIgMTkgMTM6NTQ6MDYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBpMzg2LmggKFpfKTogUmVuYW1lZCBmcm9tIGBfJyB0byBhdm9pZCBjbGFzaCB3aXRoIGNvbW1vbiBhbGlhcwotCWZvciBgZ2V0dGV4dCcuCi0KLUZyaSBBcHIgIDMgMTI6MDQ6NDggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IFJlbW92ZSBOb01vZHJtIGZsYWcgZnJvbSBhbGwgaW5zbnM6IGl0J3MgbmV2ZXIgY2hlY2tlZC4KLQlBZGQgSXNTdHJpbmcgZmxhZyB0byBzdHJpbmcgaW5zdHJ1Y3Rpb25zLgotCShJU19TVFJJTkcpOiBEb24ndCBkZWZpbmUuCi0JKExPQ0tfUFJFRklYX09QQ09ERSwgQ1NfUFJFRklYX09QQ09ERSwgRFNfUFJFRklYX09QQ09ERSk6IERlZmluZS4KLQkoRVNfUFJFRklYX09QQ09ERSwgRlNfUFJFRklYX09QQ09ERSwgR1NfUFJFRklYX09QQ09ERSk6IERlZmluZS4KLQkoU1NfUFJFRklYX09QQ09ERSk6IERlZmluZS4KLQotTW9uIE1hciAzMCAyMTozMTo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogUmV2ZXJ0IE1hcmNoIDI0IHBhdGNoOyBubyBtb3JlIExpbmVhckFkZHJlc3MuCi0KLU1vbiBNYXIgMzAgMTA6MjU6NTQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBSZW1vdmUgZndhaXQgKDliKSBmcm9tIGFsbCBmbG9hdGluZyBwb2ludAotCWluc3RydWN0aW9ucywgYW5kIGluc3RlYWQgYWRkIEZXYWl0IG9wY29kZSBtb2RpZmllci4gIEFkZCBzaG9ydAotCWZvcm0gb2YgZmxkZW52IGFuZCBmc3RlbnYuCi0JKEZXQUlUX09QQ09ERSk6IERlZmluZS4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQ2hhbmdlIHNlY29uZCBvcGVyYW5kIGNvbnN0cmFpbnQgb2YgYG1vdgotCXNyZWcscmVnfG1lbScgaW5zdHJ1Y3Rpb24gZnJvbSBSZWcxNnxNZW0gdG8gV29yZFJlZ3xXb3JkTWVtIHRvCi0JYWxsb3cgbGVnYWwgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgYG1vdmwgJWdzLCVlc2knCi0KLUZyaSBNYXIgMjcgMTg6MzA6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBoODMwMC5oOiBWYXJpb3VzIGNoYW5nZXMgdG8gZnVsbHkgYnJhY2tldCBpbml0aWFsaXplcnMuCi0KLVR1ZSBNYXIgMjQgMTg6MzI6NDcgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBpMzg2Lmg6IFNldCBMaW5lYXJBZGRyZXNzIGZvciBsaWR0IGFuZCBsZ2R0LgotCi1Nb24gTWFyICAyIDEwOjQ0OjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQk9PTF9BVFRSKTogTmV3IG1hY3JvLgotCi1UaHUgRmViIDI2IDE1OjU0OjMxIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKEZMQUdfREVMQVkpOiBOZXcgZmxhZyBmb3IgZGVsYXllZCBicmFuY2hlcy9qdW1wcy4KLQotTW9uIEZlYiAyMyAxMDozODoyMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0NBVDMpOiBEZWxldGUuICBVc2UgQ09OQ0FUMyBub3cuCi0JKGNnZW5faW5zbik6IFJlY29yZCBzeW50YXggYW5kIGZvcm1hdCBlbnRyaWVzIGhlcmUsIHJhdGhlciB0aGFuCi0Jc2VwYXJhdGVseS4KLQotVHVlIEZlYiAxNyAyMTo0Mjo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fU1lOVEFYX01BS0VfRklFTEQpOiBOZXcgbWFjcm8uCi0KLVR1ZSBGZWIgMTcgMTY6MDA6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9pbnNlcnRfZm4pOiBDaGFuZ2UgdHlwZSBvZiByZXN1bHQgdG8gY29uc3QgY2hhciAqLgotCShjZ2VuX3BhcnNlX3tzaWduZWQsdW5zaWduZWR9X2ludGVnZXIpOiBEZWxldGUgbWluLG1heCBhcmd1bWVudHMuCi0JKENHRU5fe0lOU04sS0VZV09SRCxPUEVSQU5EfV9OQk9PTF9BVFRSUyk6IFJlbmFtZWQgZnJvbSAuLi5fTUFYX0FUVFJTLgotCi1UaHUgRmViIDEyIDE4OjMwOjQxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAobG9va3VwX2luc24pOiBOZXcgYXJndW1lbnQgYWxpYXNfcC4KLQotVGh1IEZlYiAxMiAwMzo0MTowMCAxOTk4ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi1GaXggcmFjIHRvIGFjY2VwdCBvbmx5IGEwOgotCSogZDEwdi5oIChPUEVSQU5EX0FDQyk6IFNwbGl0IGludG86Ci0JKE9QRVJBTkRfQUNDMCwgT1BFUkFORF9BQ0MxKSAuCi0JKE9QRVJBTkRfR1BSKTogRGVmaW5lLgotCi1XZWQgRmViIDExIDE3OjMxOjUzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fRklFTERTKTogRGVmaW5lIGhlcmUuCi0JKENHRU5fSFdfRU5UUlkpOiBOZXcgbWVtYmVyIGB0eXBlJy4KLQkoaHdfbGlzdCk6IERlbGV0ZSBkZWNsLgotCShlbnVtIGNnZW5fbW9kZSk6IERlY2xhcmUuCi0JKENHRU5fT1BFUkFORCk6IE5ldyBtZW1iZXIgYGh3Jy4KLQkoZW51bSBjZ2VuX29wZXJhbmRfaW5zdGFuY2VfdHlwZSk6IERlY2xhcmUuCi0JKENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyB0eXBlLgotCShDR0VOX0lOU04pOiBOZXcgbWVtYmVyIGBvcGVyYW5kcycuCi0JKENHRU5fT1BDT0RFX0RBVEEpOiBNYWtlIGh3X2xpc3QgY29uc3QuCi0JKGdldF9pbnNuX29wZXJhbmRzLGxvb2t1cF9pbnNuKTogQWRkIHByb3RvdHlwZXMgZm9yLgotCi1UdWUgRmViICAzIDE3OjExOjIzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fSU5TTl9NQVhfQVRUUlMpOiBSZW5hbWVkIGZyb20gQ0dFTl9NQVhfSU5TTl9BVFRSUy4KLQkoQ0dFTl9IV19FTlRSWSk6IE1vdmUgYG5leHQnIGVudHJ5IHRvIGVuZCBvZiBzdHJ1Y3QuCi0JKENHRU5fS0VZV09SRF9NQVhfQVRUUlMpOiBSZW5hbWVkIGZyb20gQ0dFTl9NQVhfS0VZV09SRF9BVFRSUy4KLQkoQ0dFTl9PUEVSQU5EX01BWF9BVFRSUyk6IFJlbmFtZWQgZnJvbSBDR0VOX01BWF9PUEVSQU5EX0FUVFJTLgotCi1Nb24gRmViICAyIDE5OjE5OjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBDb3JyZWN0IHR5cG8gaW4gY29tbWVudCBlbmQgbWFya2VyLgotCi1Nb24gRmViICAyIDE3OjEwOjM4IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQkqIHRpYzMwLmg6IE5ldyBmaWxlLgotCi1UaHUgSmFuIDIyIDE3OjU0OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogQWRkIHByb3RvdHlwZXMgZm9yIGNnZW5fc2F2ZV9maXh1cHMoKSwKLQljZ2VuX3Jlc3RvcmVfZml4dXBzKCksIGFuZCBjZ2VuX3N3YXBfZml4dXBzKCkuICBDaGFuZ2UgcHJvdG90eXBlCi0Jb2YgY2dlbl9hc21fZmluaXNoX2luc24oKSB0byByZXR1cm4gYSBjaGFyICouCi0KLVdlZCBKYW4gMTQgMTc6MjE6NDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBGb3JtYXR0aW5nIGNoYW5nZXMgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KLQotTW9uIEphbiAxMiAxMTozNzozNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oICgqKTogQ2xlYW4gdXAgcGFzcyBvdmVyIGBzdHJ1Y3QgZm9vJyB1c2FnZS4KLQkoQ0dFTl9BVFRSKTogTWFrZSB1bnNpZ25lZCBjaGFyLgotCShDR0VOX0FUVFJfVFlQRSk6IFVwZGF0ZS4KLQkoQ0dFTl9BVFRSX3tFTlRSWSxUQUJMRX0pOiBOZXcgdHlwZXMuCi0JKGNnZW5fYmFzZSk6IE1vdmUgbWVtYmVyIGBhdHRycycgdG8gY2dlbl9pbnNuLgotCShDR0VOX0tFWVdPUkQpOiBOZXcgbWVtYmVyIGBudWxsX2VudHJ5Jy4KLQkoQ0dFTl97U1lOVEFYLEZPUk1BVH0pOiBOZXcgdHlwZXMuCi0JKGNnZW5faW5zbik6IEZvcm1hdCBhbmQgc3ludGF4IHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIuCi0KLVR1ZSBEZWMgMTYgMTU6MTU6NTIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoZDMwdl9vcGNvZGUpOiBSZW9yZGVyIGZsYWdzIHNvbWV3aGF0LCBhZGQgbmV3IGZsYWdzIGZvcgotCTIgd29yZCBsb2FkL3N0b3JlLCBBRERwcHAvU1VCcHBwLCAxNi8zMiBiaXQgbXVsdGlwbHkuICBNYWtlCi0JZmxhZ3Nfe3VzZWQsc2V0fSBsb25nLgotCShkMzB2X29wZXJhbmQpOiBNYWtlIGZsYWdzIGZpZWxkIGxvbmcuCi0KLU1vbiBEZWMgIDEgMTI6MjQ6NDQgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGsuaDogRml4IGNvbW1lbnQgZGVzY3JpYmluZyBvcGVyYW5kIHR5cGVzLgotCi1TdW4gTm92IDIzIDIyOjMxOjI3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKFNIT1JUX0NNUFUpOiBBZGQgY2FzZSBmb3IgY21wdSBpbnN0cnVjdGlvbiwgYW5kIG1vdmUKLQlldmVyeXRoaW5nIGVsc2UgYWZ0ZXIgZG93bi4KLQotVHVlIE5vdiAxOCAxODo0NToxNCAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkMTB2LmggKE9QRVJBTkRfRkxBRyk6IFNwbGl0IGludG86Ci0JKE9QRVJBTkRfRkZMQUcsIE9QRVJBTkRfQ0ZMQUcpIC4KLQotVGh1IE5vdiAxMyAxMTowNDoyNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChzdHJ1Y3QgbWlwc19vcGNvZGUpOiBDaGFuZ2VkIGNvbW1lbnRzIHRvIHJlZmxlY3QgbmV3Ci0JZmllbGQgdXNhZ2UuCi0KLUZyaSBPY3QgMjQgMjI6MzY6MjAgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkZWQgdG8gY29tbWVudHMgYSBxdWljay1yZWYgbGlzdCBvZiBhbGwgYXNzaWduZWQKLQlvcGVyYW5kIHR5cGUgY2hhcmFjdGVycy4KLQkoT1Bfe01BU0ssU0h9X1BFUkZSRUcpOiBOZXcgbWFjcm9zLgotCi1XZWQgT2N0IDIyIDE3OjI4OjMzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmg6IEFkZCAnXycgYW5kICcvJyBmb3IgdjlhIGFzcidzLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1PgotCi1UdWUgT2N0IDE0IDEzOjIyOjI5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogQml0IG9wcyB3aXRoIGFic29sdXRlIGFkZHJlc3NlcyBub3QgaW4gdGhlIDggYml0Ci0JYXJlYSBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUgYmFzZSBtb2RlbCAoSDgvMzAwKS4KLQotVGh1IFNlcCAyNSAxMzowMzo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogUmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgYCBvcGVyYW5kIHNwZWNpZmllci4KLQotV2VkIFNlcCAyNCAxOTowMDozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogRG9jdW1lbnQgcSBhbmQgdiBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLU1vbiBTZXAgMTUgMTg6Mjg6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChzdHJ1Y3Qgdjg1MF9vcGNvZGUpOiBBZGQgcHJvY2Vzc29ycyBmaWVsZC4KLQkoUFJPQ0VTU09SX1Y4NTAsIFBST0NFU1NPUl9BTEwpOiBOZXcgYml0IGNvbnN0YW50cy4KLQkoUFJPQ0VTU09SX1Y4NTBFLCBQUk9DRVNTT1JfTk9UX1Y4NTApOiBOZXcgYml0IGNvbnN0YW50cy4KLQkoUFJPQ0VTU09SX1Y4NTBFQSk6IE5ldyBiaXQgY29uc3RhbnRzLgotCi1Nb24gU2VwIDE1IDExOjI5OjQzIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBkMzB2Lmg6IEFsbG93IHVwIHRvIDY0IGNvbnRyb2wgcmVnaXN0ZXJzLiBBZGQKLQlTSE9SVF9BNVMgZm9ybWF0LgotCi0JKiBkMzB2LmggKExPTkdfRGIpOiBOZXcgZm9ybSBmb3IgZGVsYXllZCBicmFuY2hlcy4KLQotCSogZDMwdi5oOiAoTE9OR19EYik6IE5ldyBmb3JtIGZvciByZXBlYXRpLgotCi0JKiBkMzB2LmggKFNIT1JUX0QyQik6IE5ldyBmb3JtLgotCi0JKiBkMzB2LmggKFNIT1JUX0EyKTogTmV3IGZvcm0uCi0KLQkqIGQzMHYuaCAoT1BFUkFORF8yUkVHKTogQWRkIG5ldyBvcGVyYW5kIHRvIGluZGljYXRlIDIKLQlyZWdpc3RlcnMgYXJlIHVzZWQuICBOZWVkZWQgZm9yIFZMSVcgb3B0aW1pemF0aW9uLgotCi1Nb24gU2VwICA4IDE0OjA1OjQ1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogTW92ZSBhc3NlbWJsZXIgaW50ZXJmYWNlIHNlY3Rpb24KLQl1cCBzbyBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IGlzIGRlZmluZWQgZm9yIGNnZW5fcGFyc2VfYWRkcmVzcy4KLQkoY2dlbl9wYXJzZV9hZGRyZXNzKTogVXBkYXRlIHByb3RvdHlwZS4KLQotVHVlIFNlcCAgMiAxNTozMjozMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfT1BSRUFORF9BREpVU1RfU0hPUlRfTUVNT1JZKTogUmVtb3ZlZC4KLQotVHVlIEF1ZyAyNiAxMjoyMTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAodHdvX2J5dGVfc2VnbWVudF9kZWZhdWx0cyk6IENvcnJlY3QgYmFzZSByZWdpc3RlciA1IGluCi0JbW9kZXMgMSBhbmQgMiB0byBiZSBzcyByYXRoZXIgdGhhbiBkcy4gIEZyb20gR2FicmllbCBQYXViZXJ0Ci0JPHBhdWJlcnRAaXJhbS5lcz4uCi0KLQkqIGkzODYuaDogU2V0IHVkMiB0byAweDBmMGIuICBGcm9tIEdhYnJpZWwgUGF1YmVydAotCTxwYXViZXJ0QGlyYW0uZXM+LgotCi0JKiBpMzg2Lmg6IENvbW1lbnQgZml4ZXMgZm9yIGZpY29tW3BdP3tzLGx9IGZyb20gR2FicmllbCBQYXViZXJ0Ci0JPHBhdWJlcnRAaXJhbS5lcz4uCi0KLQkqIGkzODYuaCAoSlVNUF9PTl9DWF9aRVJPKTogVW5jb21tZW50IChkZWZpbmUgYWdhaW4pLgotCShKVU1QX09OX0VDWF9aRVJPKTogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgbWFjcm8uCi0KLUZyaSBBdWcgMjIgMTA6Mzg6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX05PVF9SMCk6IE5ldyBmbGFnLgotCi1Nb24gQXVnIDE4IDExOjA1OjU4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoc3RydWN0IHY4NTBfb3Bjb2RlKTogUmVtb3ZlIGZsYWdzIGZpZWxkLgotCi1XZWQgQXVnIDEzIDE4OjQ1OjQ4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoc3RydWN0IHY4NTBfb3Bjb2RlKTogQWRkIGZsYWdzIGZpZWxkLgotCShzdHJ1Y3Qgdjg1MF9vcGVyYW5kKTogRXh0ZW5kIG1lYW5pbmcgb2YgJ2JpdHMnIGFuZCAnc2hpZnQnCi0JZmllbGRzLgotCShWODUwRV9JTlNUUlVDVElPTiwgVjg1MEVBX0lOU1RSVUNUSU9OKTogTmV3IGZsYWdzLgotCShWODUwRV9QVVNIX1BPUCwgVjg1MEVfSU1NRURJQVRFMTYsIFY4NTBFX0lNTUVESUFURTMyKTogTmV3IGZsYWdzLgotCi1GcmkgQXVnICA4IDE2OjU4OjQyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFyYy5oOiBOZXcgZmlsZS4KLQotVGh1IEp1bCAyNCAyMToxNjo1OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY19vcGNvZGVzKTogRGVjbGFyZSBhcyBjb25zdC4KLQotVGh1IEp1bCAxMCAxMjo1MzoyNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoRlBfUywgRlBfRCk6IERlZmluZS4gIEJpdG1hc2tzIGluZGljYXRpbmcgaWYgYW4gaW5zbgotCXVzZXMgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcmVzb3VyY2VzLgotCShJTlNOX05PX0lTQSwgSU5TTl9JU0ExKTogRGVmaW5lLgotCShjcHUgc3BlY2lmaWMgSU5TTiBtYWNyb3MpOiBUd2VhayBpbnRvIGJpdG1hc2tzIG91dHNpZGUgdGhlIHJhbmdlCi0Jb2YgSU5TTl9JU0EgZmllbGQuCi0KLU1vbiBKdW4gMTYgMTQ6MTA6MDAgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogaTM4Ni5oOiBGaXggcGFuZCBvcGNvZGUuCi0KLU1vbiBKdW4gIDIgMTE6MzU6MDkgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogV2lkZW4gSU5TTl9JU0EgYW5kIG1vdmUgaXQgdG8gYSBtb3JlIGNvbnZlbmllbnQKLQliaXQgcG9zaXRpb24uICBBZGQgSU5TTl8zOTAwLgotCi1UdWUgTWF5IDIwIDExOjI1OjI5IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKHN0cnVjdCBtaXBzX29wY29kZSk6IGFkZGVkIG5ldyBmaWVsZCBtZW1iZXJzaGlwLgotCi1Nb24gTWF5IDEyIDE2OjI2OjUwIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGkzODYuaCAobW92ZCk6IG9ubHkgUmVnMzIgaXMgYWxsb3dlZC4KLQotCSogaTM4Ni5oOiBhZGQgZmNvbXAgYW5kIHVkMi4gIEZyb20gV2F5bmUgU2NvdHQKLQk8d3Njb3R0QGljaGlwcy5pbnRlbC5jb20+LgotCi1Nb24gTWF5ICA1IDE3OjE2OjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgTU1YIGluc3RydWN0aW9ucy4KLQotTW9uIE1heSAgNSAxMjo0NToxOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBpMzg2Lmg6IFJlbW92ZSBXIG1vZGlmaWVyIGZyb20gY29uZGl0aW9uYWwgbW92ZSBpbnN0cnVjdGlvbnMuCi0KLU1vbiBBcHIgMTQgMTQ6NTY6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IENoYW5nZSB0aGUgb3Bjb2RlcyBmb3IgZnN1YnAsIGZzdWJycCwgZmRpdnAsIGFuZCBmZGl2cnAKLQl3aXRoIG5vIGFyZ3VtZW50cyB0byBtYXRjaCB0aGF0IGdlbmVyYXRlZCBieSB0aGUgVW5peFdhcmUKLQlhc3NlbWJsZXIuCi0KLVRodSBBcHIgMTAgMTQ6MzU6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oICg8Y3B1Pl9jZ2VuX2Fzc2VtYmxlX2luc24pOiBOZXcgYXJnIGZvciBlcnJtc2cuCi0JKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbik6IERlY2xhcmUuCi0JKGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kKTogRGVjbGFyZS4KLQkoY2dlbl9wYXJzZV9vcGVyYW5kKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX3BhcnNlX29wZXJhbmQsCi0JbmV3IGFyZ3VtZW50IGB3YW50Jy4KLQkoZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0KTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX3Jlc3VsdC4KLQkoZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfdHlwZSk6IE5ldyBlbnVtLgotCi1TYXQgQXByICA1IDEzOjE0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBSZXZlcnQgbGFzdCBwYXRjaCBmb3IgdGhlIE5PTl9CUk9LRU5fT1BDT0RFUyBjYXNlcy4KLQotRnJpIEFwciAgNCAxMTo0NjoxMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IE5ldyBmaWxlLgotCi1GcmkgQXByICA0IDE0OjAyOjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBDb3JyZWN0IG9wY29kZSB2YWx1ZXMgZm9yIGZzdWJwLCBmc3VicnAsIGZkaXZwLCBhbmQKLQlmZGl2cnAuCi0KLVR1ZSBNYXIgMjUgMjI6NTc6MjYgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oIChleHRyYWN0KTogIE1ha2UgdW5zaWduZWQuCi0KLU1vbiBNYXIgMjQgMTQ6Mzg6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEFkZCBpY2xyLgotCi1UaHUgTWFyIDIwIDE5OjQ5OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBDaGFuZ2UgRFcgdG8gVyBmb3IgY21weGNoZyBhbmQgeGFkZCwgc2luY2UgdGhleSBkb24ndAotCXRha2UgYSBkaXJlY3Rpb24gYml0LgotCi1TYXQgTWFyIDE1IDE5OjAzOjI5IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBzcGFyYy5oIChzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpOiBVc2UgZnVsbCBwcm90b3R5cGUuCi0KLUZyaSBNYXIgMTQgMTU6MjI6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oOiBJbmNsdWRlIDxhbnNpZGVjbC5oPi4gIFVwZGF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgdG8KLQl1c2UgcHJvdG90eXBlcywgYW5kIHRvIHVzZSBjb25zdCB3aGVuIGFwcHJvcHJpYXRlLgotCi1UaHUgTWFyICA2IDE0OjE4OjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUkVMQVgpOiBEZWZpbmUuCi0KLU1vbiBGZWIgMjQgMTU6MTU6NTYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogQ2hhbmdlIHByZV9kZWZpbmVkX3JlZ2lzdGVycyB0bwotCWQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgYW5kIHJlZ19uYW1lX2NudCB0byBkMTB2X3JlZ19uYW1lX2NudC4KLQotU2F0IEZlYiAyMiAyMToyNTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIG1hY3JvcyBmb3IgY29wMCwgY29wMSBjb3AyIGFuZCBjb3AzLgotCUNoYW5nZSBtaXBzX29wY29kZXMgZnJvbSBjb25zdCBhcnJheSB0byBhIHBvaW50ZXIsCi0JYW5kIGNoYW5nZSBiZmRfbWlwc19udW1fb3Bjb2RlcyBmcm9tIGNvbnN0IGludCB0byBpbnQsCi0Jc28gdGhhdCB3ZSBjYW4gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG1pcHMgb3Bjb2RlcyB0YWJsZQotCWR5bmFtaWNhbGx5LgotCi1GcmkgRmViIDIxIDE2OjM0OjE4IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMzB2LmggKEZMQUdfWCk6IFJlbW92ZSB1bnVzZWQgZmxhZy4KLQotVHVlIEZlYiAxOCAxNzozNzoyMCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oOiBOZXcgZmlsZS4KLQotRnJpIEZlYiAxNCAxMzoxNjoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUERTX05BTUUpOiBNYWNybyB0byBhY2Nlc3MgbmFtZSBmaWVsZCBvZiBwcmVkZWZpbmVkIHN5bWJvbHMuCi0JKFBEU19WQUxVRSk6IE1hY3JvIHRvIGFjY2VzcyB2YWx1ZSBmaWVsZCBvZiBwcmVkZWZpbmVkIHN5bWJvbHMuCi0JKHRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wpOiBBZGQgcHJvdG90eXBlLgotCi1Nb24gRmViIDEwIDEwOjMyOjE3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oICh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIG1hdGNoCi0JY2hhbmdlIGluIGZ1bmN0aW9uLCBhZGRlZCBjbGFzcyBwYXJhbWV0ZXIuCi0KLVRodSBGZWIgIDYgMTc6MzA6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfRU5ETUFTSyk6IEFkZCBmb3IgZmxhZ2dpbmcgVEljODAKLQllbmRtYXNrIGZpZWxkcywgd2hpY2ggYXJlIHNvbWV3aGF0IHdlaXJkIGluIHRoYXQgMCBhbmQgMzIgYXJlCi0JdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lLgotCi1UaHUgSmFuIDMwIDEzOjQ2OjE4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oOiBDaGFuZ2UgYWxsIHRoZSBPUEVSQU5EIGRlZmluZXMgdG8gdXNlIHRoZSBmb3JtICgxIDw8IFgpCi0JcmF0aGVyIHRoYW4gYSBjb25zdGFudCB0aGF0IGlzIDIqKlguICBSZW9yZGVyIHRoZW0gdG8gcHV0IGJpdHMgZm9yCi0Jb3BlcmFuZHMgdGhhdCBoYXZlIHN5bWJvbGljIG5hbWVzIGluIHRoZSB1cHBlciBiaXRzLCBzbyB0aGV5IGNhbgotCWJlIHBhY2tlZCBpbnRvIGFuIGludCB3aGVyZSB0aGUgbG93ZXIgYml0cyBjb250YWluIHRoZSB2YWx1ZSB0aGF0Ci0JY29ycmVzcG9uZHMgdG8gdGhhdCBzeW1ib2xpYyBuYW1lLgotCShwcmVkZWZpbmVkX3N5bWJvKTogQWRkIHN0cnVjdC4KLQkodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogRGVjbGFyZSBhcnJheSBvZiB0cmFuc2xhdGlvbnMuCi0JKHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMpOiBEZWNsYXJlIHNpemUgb2YgdGhhdCBhcnJheS4KLQkodGljODBfdmFsdWVfdG9fc3ltYm9sKTogRGVjbGFyZSBmdW5jdGlvbi4KLQkodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogRGVjbGFyZSBmdW5jdGlvbi4KLQotV2VkIEphbiAyOSAwOTozNzoyNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAuaCAoTU4xMDIwMF9PUEVSQU5EX1JFTEFYKTogRGVmaW5lLgotCi1TYXQgSmFuIDE4IDE1OjE4OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9OT19SMF9ERVNUKTogQWRkIGZvciBvcGNvZGVzIHdoZXJlIHIwIGNhbm5vdAotCWJlIHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KLQotVGh1IEphbiAxNiAyMDo0ODo1NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoc3RydWN0IHRpYzgwX29wY29kZSk6IENoYW5nZSAiZm9ybWF0IiBmaWVsZCB0byAiZmxhZ3MiLgotCShGTVRfVU5VU0VELCBGTVRfU0ksIEZNVF9MSSwgRk1UX1JFRyk6IERlbGV0ZS4KLQkoVElDODBfVkVDVE9SKTogRGVmaW5lIGEgZmxhZyBiaXQgZm9yIHRoZSBmbGFncy4gIFRoaXMgb25lIG1lYW5zCi0JdGhhdCB0aGUgb3Bjb2RlIGNhbiBoYXZlIHR3byB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIGluIGEgc2luZ2xlCi0JMzIgYml0IHdvcmQgYW5kIHdlIGhhdmUgdG8gZW5jb2RlL2RlY29kZSBib3RoLgotCi1UdWUgSmFuIDE0IDE5OjM3OjA5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX1BDUkVMKTogUmVuYW1lZCBmcm9tCi0JVElDODBfT1BFUkFORF9SRUxBVElWRSBmb3IgUEMgcmVsYXRpdmUuCi0JKFRJQzgwX09QRVJBTkRfQkFTRVJFTCk6IE5ldyBmbGFnIGJpdCBmb3IgcmVnaXN0ZXIKLQliYXNlIHJlbGF0aXZlLgotCi1Nb24gSmFuIDEzIDE1OjU2OjM4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX0ZMT0FUKTogQWRkIGZvciBmbG9hdGluZyBwb2ludCBvcGVyYW5kcy4KLQotTW9uIEphbiAgNiAxMDo1MToxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9TQ0FMRUQpOiBPcGVyYW5kIG1heSBoYXZlIG9wdGlvbmFsCi0JIjpzIiBtb2RpZmllciBmb3Igc2NhbGluZy4KLQotU3VuIEphbiAgNSAxMjoxMjoxOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9NX1NJKTogQWRkIG9wZXJhbmQgbW9kaWZpZXIgZm9yICI6bSIuCi0JKFRJQzgwX09QRVJBTkRfTV9MSSk6IERpdHRvCi0KLVNhdCBKYW4gIDQgMTk6MDI6NDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfQklUTlVNKTogUmVuYW1lZCBmcm9tIFRJQzgwX09QRVJBTkRfQ0NfU1ouCi0JKFRJQzgwX09QRVJBTkRfQ0MpOiBOZXcgZGVmaW5lIGZvciBjb25kaXRpb24gY29kZSBvcGVyYW5kLgotCShUSUM4MF9PUEVSQU5EX0NSKTogTmV3IGRlZmluZSBmb3IgY29udHJvbCByZWdpc3RlciBvcGVyYW5kLgotCi1GcmkgSmFuICAzIDE2OjIyOjIzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChzdHJ1Y3QgdGljODBfb3Bjb2RlKTogTmFtZSBjaGFuZ2VkLgotCShzdHJ1Y3QgdGljODBfb3Bjb2RlKTogUmVtb3ZlIGZvcm1hdCBmaWVsZC4KLQkoc3RydWN0IHRpYzgwX29wZXJhbmQpOiBBZGQgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uIGZ1bmN0aW9ucy4KLQkoVElDODBfT1BFUkFORF8qKTogUmVtb3ZlIG9sZCBib2d1cyB2YWx1ZXMsIHN0YXJ0IGFkZGluZyBuZXcKLQljb3JyZWN0IG9uZXMuCi0JKEZNVF8qKTogRGl0dG8uCi0KLVR1ZSBEZWMgMzEgMTU6MDU6NDEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZKTogTmV3IGZsYWcgdG8gYWRqdXN0Ci0JdHlwZSBJViBpbnN0cnVjdGlvbiBvZmZzZXRzLgotCi1GcmkgRGVjIDI3IDIyOjIzOjEwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oOiBOZXcgZmlsZS4KLQotV2VkIERlYyAxOCAxMDowNjozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAuaCAoTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0spOiBEZWZpbmUuCi0KLVNhdCBEZWMgMTQgMTA6NDg6MzEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+Ci0KLQkqIG1uMTAyMDAuaDogRml4IGNvbW1lbnQsIG1uMTAyMDBfb3BlcmFuZCBub3QgcG93ZXJwY19vcGVyYW5kLgotCSogbW4xMDMwMC5oOiBGaXggY29tbWVudCwgbW4xMDMwMF9vcGVyYW5kIG5vdCBwb3dlcnBjX29wZXJhbmQuCi0JKiB2ODUwLmg6IEZpeCBjb21tZW50LCB2ODUwX29wZXJhbmQgbm90IHBvd2VycGNfb3BlcmFuZC4KLQotTW9uIERlYyAgOSAxNjo0NTozOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAuaDogRmxlc2ggb3V0IHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIG5lZWRlZCBieQotCXRoZSBtbjEwMjAwIGFzc2VtYmxlciAmIGRpc2Fzc2VtYmxlci4KLQotVHVlIE5vdiAyNiAxMDo0Njo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIG1pcHMxNiBkZWZpbml0aW9ucy4KLQotTW9uIE5vdiAyNSAxNzo1Njo1NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBEb2N1bWVudCBuZXcgPCwgPiwgbSwgbiwgbyBhbmQgcCBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLVdlZCBOb3YgMjAgMTA6NTk6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9QQ1JFTCk6IERlZmluZS4KLQkoTU4xMDMwMF9PUEVSQU5EX01FTUFERFIpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTkgMTM6MzA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCk6IERlZmluZS4KLQotV2VkIE5vdiAgNiAxMzo0MTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1NQTElUKTogRGVmaW5lLgotCi1UdWUgTm92ICA1IDEzOjI2OjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpOiBEZWZpbmUuCi0KLU1vbiBOb3YgIDQgMTI6NTI6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCk6IERlZmluZS4KLQotRnJpIE5vdiAgMSAxMDozMTowMiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogRG9uJ3QgaW5jbHVkZSAiYmZkLmgiOyBwcml2YXRlIHJlbG9jYXRpb24gdHlwZXMgYXJlIG5vdwotIAluZWdhdGl2ZSB0byBtaW5pbWl6ZSBwcm9ibGVtcyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMuICBPcmdhbml6ZQotIAlpbnN0cnVjdGlvbiBzdWJzZXRzIGJ5IEFNQVNLIGV4dGVuc2lvbnMgYW5kIFBBTGNvZGUKLSAJaW1wbGVtZW50YXRpb24uCi0JKHN0cnVjdCBhbHBoYV9vcGVyYW5kKTogTW92ZSBmbGFncyBzbG90IGZvciBiZXR0ZXIgcGFja2luZy4KLQotVHVlIE9jdCAyOSAxMjoxOToxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAuaCAoVjg1MF9PUEVSQU5EX1JFTEFYKTogTmV3IG9wZXJhbmQgZmxhZy4KLQotVGh1IE9jdCAxMCAxNDoyOToxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoRk1UXyopOiBNb3ZlIG9wZXJhbmQgZm9ybWF0IGRlZmluaXRpb25zCi0JaGVyZS4KLQotVHVlIE9jdCAgOCAxNDo0ODowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1BBUkVOKTogRGVmaW5lLgotCi1Nb24gT2N0ICA3IDE2OjUyOjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChtbjEwMzAwX29wY29kZSk6IEFkZCAiZm9ybWF0IiBmaWVsZC4KLQkoTU4xMDMwMF9PUEVSQU5EXyopOiBEZWZpbmUuCi0KLVRodSBPY3QgIDMgMTA6MzM6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEweDAwLmg6IERlbGV0ZS4KLQkqIG1uMTAyMDAuaCwgbW4xMDMwMC5oOiBOZXcgZmlsZXMuCi0KLVdlZCBPY3QgIDIgMjE6MzE6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEweDAwLmg6IE5ldyBmaWxlLgotCi1GcmkgU2VwIDI3IDE4OjI2OjQ2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHY4NTAuaDogIEFkZCBuZXcgZmxhZyB0byBpbmRpY2F0ZSB0aGlzIGluc3RydWN0aW9uIHVzZXMgYSBQQwotCWRpc3BsYWNlbWVudC4KLQotRnJpIFNlcCAxMyAxNDo1ODoxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKHN0bWFjKTogQWRkIG1pc3NpbmcgaW5zdHJ1Y3Rpb24uCi0KLVNhdCBBdWcgMzEgMTY6MDI6MDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLmggKHY4NTBfb3Bjb2RlKTogUmVtb3ZlICJzaXplIiBmaWVsZC4gIEFkZCAibWVtb3AiCi0JZmllbGQuCi0KLUZyaSBBdWcgMjMgMTA6Mzk6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLmggKFY4NTBfT1BFUkFORF9FUCk6IERlZmluZS4KLQotCSogdjg1MC5oICh2ODUwX29wY29kZSk6IEFkZCBzaXplIGZpZWxkLgotCi1UaHUgQXVnIDIyIDE2OjUxOjI1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oICh2ODUwX29wZXJhbmRzKTogQWRkIGluc2VydCBhbmQgZXh0cmFjdCBmaWVsZHMsIHBvaW50ZXJzCi0gCXRvIGZ1bmN0aW9ucyB1c2VkIHRvIGhhbmRsZSB1bnVzdWFsIG9wZXJhbmQgZW5jb2RpbmcuCi0JKFY4NTBfT1BFUkFORF9SRUcsIFY4NTBfT1BFUkFORF9TUkcsIFY4NTBfT1BFUkFORF9DQywKLSAJVjg1MF9PUEVSQU5EX1NJR05FRCk6IERlZmluZWQuCi0KLVdlZCBBdWcgMjEgMTc6NDU6MTAgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHY4NTBfb3BlcmFuZHMpOiBBZGQgZmxhZ3MgZmllbGQuCi0JKE9QRVJBTkRfUkVHLCBPUEVSQU5EX05VTSk6IERlZmluZWQuCi0KLVR1ZSBBdWcgMjAgMTQ6NTI6MDIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiB2ODUwLmg6IE5ldyBmaWxlLgotCi1GcmkgQXVnIDE2IDE0OjQ0OjE1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogbWlwcy5oIChPUF9TSF9MT0NDLCBPUF9TSF9ISUNDLCBPUF9NQVNLX0NDLCBPUF9TSF9DT1AxTk9STSwKLSAJT1BfTUFTS19DT1AxTk9STSwgT1BfU0hfQ09QMVNQRUMsIE9QX01BU0tfQ09QMVNQRUMsCi0gCU9QX01BU0tfQ09QMVNDTFIsIE9QX01BU0tfQ09QMUNNUCwgT1BfU0hfQ09QMUNNUCwgT1BfU0hfRk9STUFULAotIAlPUF9NQVNLX0ZPUk1BVCwgT1BfU0hfVFJVRSwgT1BfTUFTS19UUlVFLCBPUF9TSF9HRSwgT1BfTUFTS19HRSwKLSAJT1BfU0hfVU5TSUdORUQsIE9QX01BU0tfVU5TSUdORUQsIE9QX1NIX0hJTlQsIE9QX01BU0tfSElOVCk6Ci0gCURlZmluZWQuCi0KLUZyaSBBdWcgMTYgMDA6MTU6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBpdGxiLCBwaXRsYmUsIGlpdGxiYSwgaWl0bGJwLCBmaWMsIGZpY2UpOiBBY2NlcHQKLQlhIDMgYml0IHNwYWNlIGlkIGluc3RlYWQgb2YgYSAyIGJpdCBzcGFjZSBpZC4KLQotVGh1IEF1ZyAxNSAxMzoxMTo0NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBBZGQgc29tZSBhZGRpdGlvbmFsIGRlZmluZXMgdG8gc3VwcG9ydCB0aGUKLSAJYXNzZW1ibGVyIGluIGRldGVybWluaW5nIHdoaWNoIG9wZXJhdGlvbnMgY2FuIGJlIGRvbmUgaW4gcGFyYWxsZWwuCi0KLVR1ZSBBdWcgIDYgMTE6MTM6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChTTik6IERlZmluZS4KLQkoZWVwbW92LmIpOiBSZW5hbWVkIGZyb20gImVlcG1vdiIKLQkobm9wLCBicHQsIHJ0ZSwgcnRzLCBzbGVlcCwgY2xybWFjKTogVGhlc2UgaGF2ZSBubyBzaXplIGFzc29jaWF0ZWQKLQl3aXRoIHRoZW0uCi0KLUZyaSBKdWwgMjYgMTE6NDc6MTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaCAoT1BFUkFORF9TSElGVCk6IE5ldyBvcGVyYW5kIGZsYWcuCi0KLVRodSBKdWwgMjUgMTI6MDY6MjIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogQ2hhbmdlcyBmb3IgZGl2cywgcGFyYWxsZWwtb25seSBpbnN0cnVjdGlvbnMsIGFuZAotIAlzaWduZWQgbnVtYmVycy4KLQotTW9uIEp1bCAyMiAxMToyMToxNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oIChwZF9yZWcpOiBEZWZpbmUuIFB1dHRpbmcgdGhlIGRlZmluaXRpb24gaGVyZSBhbGxvd3MKLQl0aGUgYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgdG8gc2hhcmUgdGhlIHNhbWUgc3RydWN0LgotCi1Nb24gSnVsIDIyIDEyOjE1OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChpOTYwX29wY29kZXMpOiAiaGFsdCIgdGFrZXMgYW4gYXJndW1lbnQuICBGcm9tIFN0ZXBoZW4KLQlXaWxsaWFtcyA8c3RldmVAaWNhcnVzLmNvbT4uCi0KLVdlZCBKdWwgMTcgMTQ6NDY6MzggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0KLVRodSBKdWwgMTEgMTI6MDk6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChiYW5kLCBiY2xyKTogRm9yY2UgaGlnaCBiaXQgb2YgaW1tZWRpYXRlIG5pYmJsZSB0byB6ZXJvLgotCi1XZWQgSnVsICAzIDE0OjMwOjEyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotIAkqIG02OGsuaCAobWNmNTIwMCk6IE5ldyBtYWNyby4KLQlEb2N1bWVudCBuYW1lcyBvZiBjb2xkZmlyZSBjb250cm9sIHJlZ2lzdGVycy4KLQotVHVlIEp1bCAgMiAyMzowNTo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKFNSQ19JTl9EU1QpOiBEZWZpbmUuCi0KLQkqIGg4MzAwLmggKFVOT1AzKTogTWFyayB0aGUgcmVnaXN0ZXIgb3BlcmFuZCBpbiB0aGlzIGluc24KLQlhcyBhIHNvdXJjZSBvcGVyYW5kLCBub3QgYSBkZXN0aW5hdGlvbiBvcGVyYW5kLgotCShTSElGVF8yLCBTSElGVF9JTU0pOiBSZW1vdmUuICBFbGltaW5hdGUgYWxsIHJlZmVyZW5jZXMuCi0JKFVOT1AzKTogQ2hhbmdlIFNISUZUX0lNTSB0byBJTU0gZm9yIEg4L1MgYml0b3BzLiAgTWFyawotCXJlZ2lzdGVyIG9wZXJhbmQgd2l0aCBTUkNfSU5fRFNULgotCi1GcmkgSnVuIDIxIDEzOjUyOjE3IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS5oOiBOZXcgZmlsZS4KLQotVGh1IEp1biAyMCAxNTowMjo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNmsuaDogUmVtb3ZlIG9ic29sZXRlIGZpbGUuCi0KLVdlZCBKdW4gMTkgMTU6Mjk6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IENvcnJlY3Qgb3Bjb2RlIHZhbHVlcyBmb3IgZmFkZHAsIGZzdWJwLCBmc3VicnAsIGZtdWxwLAotCWZkaXZwLCBhbmQgZmRpdnJwLiAgQWRkIGZmcmVlcC4KLQotVHVlIEp1biAxOCAxNjowNjowMCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogaDgzMDAuaDogUmVvcmRlciB2YXJpb3VzICNkZWZpbmVzIGZvciByZWFkYWJpbGl0eS4KLQkoQUJTMzJTUkMsIEFCUzMyRFNULCBEU1AzMkxJU1QsIEFCUzMyTElTVCwgQTMyTElTVCk6IERlZmluZS4KLQkoQklUT1ApOiBBY2NlcHQgYWRkaXRpb25hbCAodW51c2VkKSBhcmd1bWVudC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKEVCSVRPUCk6IExpa2V3aXNlLgotCShPX0xBU1QpOiBCdW1wLgotCShsZGMsIHN0YywgbW92YiwgbW92dywgbW92bCk6IFVzZSAzMmJpdCBvZmZzZXRzIGFuZCBhYnNvbHV0ZXMuCi0KLQkqIGg4MzAwLmggKEVYUiwgU0hJRlRfMiwgTUFDUkVHLCBTSElGVF9JTU0sIFJESU5DKTogRGVmaW5lLgotCShPX1RBUywgT19DTFJNQUMsIE9fTERNQUMsIE9fTUFDLCBPX0xETSwgT19TVE0pOiBEZWZpbmUuCi0JKEJJVE9QLCBFQklUT1ApOiBIYW5kbGUgbmV3IEg4L1MgYWRkcmVzc2luZyBtb2RlcyBmb3IKLQliaXQgaW5zbnMuCi0JKFVOT1AzKTogSGFuZGxlIG5ldyBzaGlmdC9yb3RhdGUgaW5zbnMgb24gdGhlIEg4L1MuCi0JKGluc25zIHVzaW5nIGV4cik6IE5ldyBpbnN0cnVjdGlvbnMuCi0JKHRhcywgbWFjLCBsZG1hYywgY2xybWFjLCBsZG0sIHN0bSk6IE5ldyBpbnN0cnVjdGlvbnMuCi0KLVRodSBNYXkgMjMgMTY6NTY6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChhZGQubCk6IFVuZG8gQXByIDV0aCBjaGFuZ2UuICBUaGUgbWFudWFsIEkgaGFkCi0Jd2FzIGluY29ycmVjdC4KLQotTW9uIE1heSAgNiAyMzozODoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKFNUQVJUKTogUmVtb3ZlLgotCShNRU1SRUxBWCk6IERlZmluZS4gIE1hcmsgYWJzb2x1dGUgbWVtb3J5IG9wZXJhbmRzIGluIG1vdi5iLCBtb3YudwotCWFuZCBtb3YubCBpbnNucyB0aGF0IGNhbiBiZSByZWxheGVkLgotCi1UdWUgQXByIDMwIDE4OjMwOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBSZW1vdmUgQWJzMzIgZnJvbSBsY2FsbC4KLQotTW9uIEFwciAyMiAxNzowOToyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1ApOiBOZXcgbWFjcm8uCi0JKFNMQ1BPUCk6IE5ldyBtYWNyby4KLQlNYXJrIFgsWSBvcGNvZGUgbGV0dGVycyBhcyBpbiB1c2UuCi0KLVRodSBBcHIgMTEgMTc6Mjg6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChGX0ZMT0FULCBGX0ZCUik6IERlZmluZS4KLQotRnJpIEFwciAgNSAxNjo1NTozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKEFCUzhNRU0pOiBSZW5hbWVkIGZyb20gQUJTTU9WLiAgUmVtb3ZlIEFCU01PVgotCWZyb20gYWxsIGluc25zLgotCShBQlM4U1JDLEFCUzhEU1QpOiBBZGQgQUJTOE1FTS4KLQkoYWRkLmwpOiBGaXggcmVnK3JlZyB2YXJpYW50LgotCShlZXBtb3Yudyk6IFJlbmFtZWQgZnJvbSBlZXBtb3Z3LgotCShsZGMsc3RjKTogRml4IG1hbnkgY2FzZXMuCi0KLVN1biBNYXIgMzEgMTM6MzA6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyk6IE5ldyBtYWNyby4KLQotVGh1IE1hciAgNyAxNTowODoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoTyk6IE1hcmsgb3BlcmFuZCBsZXR0ZXIgYXMgaW4gdXNlLgotCi1UdWUgRmViIDIwIDIwOjQ2OjIxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY197ZW5jb2RlLGRlY29kZX1fc3BhcmNsZXRfY3ByZWcpOiBEZWNsYXJlLgotCU1hcmsgb3BlcmFuZCBsZXR0ZXJzIHVVIGFzIGluIHVzZS4KLQotTW9uIEZlYiAxOSAwMTo1OTowOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2RlX2FyY2hfdmFsKTogQWRkIFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVULgotCShzcGFyY19vcGNvZGVfYXJjaCk6IERlbGV0ZSBtZW1iZXIgYGNvbmZsaWN0cycuICBBZGQgYHN1cHBvcnRlZCcuCi0JKFNQQVJDX09QQ09ERV9TVVBQT1JURUQpOiBOZXcgbWFjcm8uCi0JKFNQQVJDX09QQ09ERV9DT05GTElDVF9QKTogUmV3cml0ZS4KLQkoRl9OT1RWOSk6IERlbGV0ZS4KLQotRnJpIEZlYiAxNiAxMjoyMzozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCkgTWFrZSByZXR1cm4gdHlwZSBpbgotCWRlY2xhcmF0aW9uIGNvbnNpc3RlbnQgd2l0aCByZXR1cm4gdHlwZSBpbiBkZWZpbml0aW9uLgotCi1XZWQgRmViIDE0IDE4OjE0OjExIDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUmVtb3ZlIERhdGEzMiBmcm9tIHB1c2hmIGFuZCBwb3BmLgotCi1UaHUgRmViICA4IDE0OjI3OjIxIDE5OTYgIEphbWVzIENhcmxzb24gPGNhcmxzb25AeHlsb2dpY3MuY29tPgotCi0JKiBpMzg2LmggKGkzODZfcmVndGFiKTogQWRkIDgwNDg2IHRlc3QgcmVnaXN0ZXJzLgotCi1Nb24gRmViICA1IDE4OjM1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChJX0hYKTogRGVmaW5lLgotCShpOTYwX29wY29kZXMpOiBBZGQgSFggaW5zdHJ1Y3Rpb24uCi0KLU1vbiBKYW4gMjkgMTI6NDM6MzkgMTk5NiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogRml4IHdhaXRpbmcgZm9ybXMgb2YgZmluaXQsIGZzdGVudiwgZnNhdmUsIGZzdHN3LCBmc3RjdywKLQlhbmQgZmNsZXguCi0KLVdlZCBKYW4gMjQgMjI6MzY6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsKTogUmVwbGFjZXMgc3BhcmNfYXJjaGl0ZWN0dXJlLgotCShTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCk6IFJlbmFtZWQgZnJvbSBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AuCi0JKGJmZF8qIGRlZmluZXMpOiBEZWxldGUuCi0JKHNwYXJjX29wY29kZV9hcmNocyk6IFJlcGxhY2VzIGFyY2hpdGVjdHVyZV9wbmFtZS4KLQkoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKTogRGVjbGFyZS4KLQkoTlVNT1BDT0RFUyk6IERlbGV0ZS4KLQotTW9uIEphbiAyMiAwODoyNDozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoZW51bSBzcGFyY19hcmNoaXRlY3R1cmUpOiBBZGQgdjlhLgotCShBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1ApOiBVcGRhdGUuCi0KLVRodSBEZWMgMjggMTM6Mjc6NTMgMTk5NSAgSm9obiBIYXNzZXkgIDxoYXNzZXlAcnRwLmRnLmNvbT4KLQotCSogaTM4Ni5oOiBBZGRlZCBQZW50aXVtIFBybyBpbnN0cnVjdGlvbnMuCi0KLVRodSBOb3YgIDIgMjI6NTk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IERvY3VtZW50IG5ldyAnVycgb3BlcmFuZCBwbGFjZS4KLQotVHVlIE9jdCAyNCAxMDo0OToxMCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogQWRkIGxjaSBhbmQgc3luY2RtYSBpbnN0cnVjdGlvbnMuCi0KLU1vbiBPY3QgMjMgMTE6MDk6MTYgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+Ci0KLQkqIG1pcHMuaDogQWRkZWQgSU5TTl80MTAwIGZsYWcgdG8gbWFyayBORUMgVlI0MTAwIHNwZWNpZmljCi0gCWluc3RydWN0aW9ucy4KLQotTW9uIE9jdCAxNiAxMDoyODoxNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChQUENfT1BDT0RFX3tDT01NT04sQU5ZfSk6IE5ldyBvcGNvZGUgZmxhZ3MgZm9yCi0JYXNzZW1ibGVyJ3MgLW1jb20gYW5kIC1tYW55IHN3aXRjaGVzLgotCi1XZWQgT2N0IDExIDE2OjU2OjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEZpeCBjbXB4Y2hnOGIgZXh0ZW5zaW9uIG9wY29kZSBkZXNjcmlwdGlvbi4KLQotVGh1IE9jdCAgNSAxODowMzozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgUGVudGl1bSBpbnN0cnVjdGlvbnMgd3Jtc3IsIHJkdHNjLCByZG1zciwgY21weGNoZzhiLAotCWFuZCByZWdpc3RlciBjcjQuCi0KLVR1ZSBTZXAgMTkgMTU6MjY6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IENoYW5nZSBjb21tZW50OiBzcGxpdCB0eXBlIFAgaW50byB0eXBlcyAwLCAxIGFuZCAyLgotCi1XZWQgQXVnIDMwIDEzOjUwOjU1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9wcmVmZXRjaCk6IERlY2xhcmUuCi0KLVR1ZSBBdWcgMjkgMTU6MzQ6NTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3thc2ksbWVtYmFyfSk6IERlY2xhcmUuCi0KLVdlZCBBdWcgIDIgMTg6MzI6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrbXJpLmg6IFJlbW92ZS4KLQotCSogbTY4ay5oOiBNb3ZlIHRhYmxlcyBpbnRvIG9wY29kZXMvbTY4ay1vcGMuYywgbGVhdmluZyBqdXN0IHRoZQotCWRlY2xhcmF0aW9ucy4gIFJlbW92ZSBGX0FMSUFTIGFuZCBmbGFnIGZpZWxkIG9mIHN0cnVjdAotCW02OGtfb3Bjb2RlLiAgQ2hhbmdlIGFyY2ggZmllbGQgb2Ygc3RydWN0IG02OGtfb3Bjb2RlIHRvIHVuc2lnbmVkCi0JaW50LiAgTWFrZSBuYW1lIGFuZCBhcmdzIGZpZWxkcyBvZiBzdHJ1Y3QgbTY4a19vcGNvZGUgY29uc3QuCi0KLVdlZCBBdWcgIDIgMDg6MTY6NDYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRl9OT1RWOSk6IERlZmluZS4KLQotVHVlIEp1bCAxMSAxNDoyMDo0MiAxOTk1ICBKZWZmIFNwaWVnZWwgIDxqZWZmc0Bsc2lsLmNvbT4KLQotCSogbWlwcy5oIChJTlNOXzQwMTApOiBEZWZpbmUuCi0KLVdlZCBKdW4gMjEgMTg6NDk6NTEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oIChUQkwxKTogUmV2ZXJzZSBzZW5zZSBvZiAicm91bmQiIGFyZ3VtZW50IGluIHJlc3VsdC4KLQotCUNoYW5nZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjoKLQkqIG02OGsuaDogRml4IGFyZ3VtZW50IGRlc2NyaXB0aW9ucyBvZiBjb3Byb2Nlc3NvcgotCWluc3RydWN0aW9ucyB0byBhbGxvdyBvbmx5IGFsdGVyYWJsZSBvcGVyYW5kcyB3aGVyZSBhcHByb3ByaWF0ZS4KLQlbIU5PX0RFRkFVTFRfU0laRVNdOiBBbiBvbWl0dGVkIHNpemUgZGVmYXVsdHMgdG8gYHcnLgotCShtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIG1vcmUgYWxpYXNlcy4KLQotRnJpIEFwciAxNCAyMjoxNTozNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IEFkZGVkIGV4cGxjaXRseSBzaG9ydC1zaXplZCBjb25kaXRpb25hbCBicmFuY2hlcywgYW5kIGEKLQlidW5jaCBvZiBhbGlhc2VzIChmbW92KiwgZnRlc3QqLCB0ZGl2dWwpIHRvIHN1cHBvcnQgZ2NjJ3MKLQlzdnI0LWJhc2VkIGNvbmZpZ3VyYXRpb25zLgotCi1Nb24gTWFyIDEzIDIxOjMwOjAxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlNb24gRmViIDI3IDA4OjM2OjM5IDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0JKiBpMzg2Lmg6IGFkZGVkIG1pc3NpbmcgRGF0YTE2L0RhdGEzMiBmbGFncyB0byBhIGZldyBpbnN0cnVjdGlvbnMuCi0KLVdlZCBNYXIgIDggMTU6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE9QX01BU0tfRlIsIE9QX1NIX0ZSKTogRGVmaW5lLgotCShPUF9NQVNLX0JDQywgT1BfU0hfQkNDKTogRGVmaW5lLgotCShPUF9NQVNLX1BSRUZYLCBPUF9TSF9QUkVGWCk6IERlZmluZS4KLQkoT1BfTUFTS19DQ0MsIE9QX1NIX0NDQyk6IERlZmluZS4KLQkoSU5TTl9SRUFEX0ZQUl9SKTogRGVmaW5lLgotCShJTlNOX1JGRSk6IERlbGV0ZS4KLQotV2VkIE1hciAgOCAwMzoxMzoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLmggKGVudW0gbTY4a19hcmNoaXRlY3R1cmUpOiBEZWxldGVkLgotCShzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMpOiBOZXcgdHlwZS4KLQkobTY4a19vcGNvZGVzKTogTm93IGNvbnN0LiAgRGVsZXRlZCBvcGNvZGUgYWxpYXNlcyB3aXRoIGV4YWN0bHkKLQltYXRjaGluZyBjb25zdHJhaW50cywgdmFsdWVzIGFuZCBmbGFncy4gIEFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhpcywKLQl0aGUgTU9UT1JPTEFfU1lOVEFYX09OTFkgYW5kIE1JVF9TWU5UQVhfT05MWSBtYWNyb3MsIHdoaWNoIHNvIGZhcgotCWFzIEkga25vdyB3ZXJlIG5ldmVyIHVzZWQsIG5vdyBtYXkgbmVlZCByZS1leGFtaW5pbmcuCi0JKG51bW9wY29kZXMpOiBOb3cgY29uc3QuCi0JKG02OGtfb3Bjb2RlX2FsaWFzZXMsIG51bWFsaWFzZXMpOiBOZXcgdmFyaWFibGVzLgotCShlbmRvcCk6IERlbGV0ZWQuCi0JW0RPTlRfREVGSU5FX1RBQkxFXTogRGVjbGFyZSBudW1vcGNvZGVzLCBudW1hbGlhc2VzLCBhbmQKLQltNjhrX29wY29kZV9hbGlhc2VzOyB1cGRhdGUgZGVjbGFyYXRpb24gb2YgbTY4a19vcGNvZGVzLgotCi1Nb24gTWFyICA2IDEwOjAyOjAwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKGRlbGF5X3R5cGUpOiBEZWxldGUgdW51c2VkIGVudW1lcmF0aW9uLgotCShwYV9vcGNvZGUpOiBSZXBsYWNlIHVudXNlZCBkZWxheWVkIGZpZWxkIHdpdGggYW4gYXJjaGl0ZWN0dXJlCi0JZmllbGQuCi0JKHBhX29wY29kZXMpOiBNYXJrIGVhY2ggaW5zdHJ1Y3Rpb24gYXMgZWl0aGVyIFBBMS4wIG9yIFBBMS4xLgotCi1GcmkgTWFyICAzIDE2OjEwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChJTlNOX0lTQTQpOiBEZWZpbmUuCi0KLUZyaSBGZWIgMjQgMTk6MTM6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE1fRExBX0FCLCBNX0RMSSk6IERlZmluZS4KLQotVGh1IEZlYiAyMyAxNzozMzowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChmc3R3eCk6IEZpeCBzaW5nbGUtYml0IGVycm9yLgotCi1XZWQgRmViIDE1IDEyOjE5OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChNX1VMRCwgTV9VTERfQSwgTV9VU0QsIE1fVVNEX0EpOiBEZWZpbmUuCi0KLU1vbiBGZWIgIDYgMTA6MzU6MjMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IGFkZGVkIGNwdWlkIGluc3RydWN0aW9uICwgYW5kIGRyWzAtN10gYWxpYXNlcyBmb3IgdGhlCi0JICBkZWJ1ZyByZWdpc3RlcnMuICBGcm9tIENoYXJsZXMgSGFubnVtIChteWNyb2Z0QG5ldGJzZC5vcmcpLgotCi1Nb24gRmViICA2IDAzOjMxOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gQnJ5YW4gRm9yZCA8YmFmb3JkQHNjaGlyZi5jcy51dGFoLmVkdT4gZm9yIDE2LWJpdAotCWkzODYgc3VwcG9ydDoKLQkqIGkzODYuaCAoTU9WX0FYX0RJU1AzMik6IE5ldyBtYWNyby4KLQkoaTM4Nl9vcHRhYik6IEFkZGVkIERhdGExNiBhbmQgRGF0YTMyIGFzIG5lZWRlZC4gIEFkZGVkICJ3IiBmb3JtcwotCW9mIHNldmVyYWwgY2FsbC9yZXR1cm4gaW5zdHJ1Y3Rpb25zLgotCShBRERSX1BSRUZJWF9PUENPREUpOiBOZXcgbWFjcm8uCi0KLU1vbiBKYW4gMjMgMTY6NDU6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVNhdCBKYW4gMjEgMTc6NTA6MzggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIC4uL2luY2x1ZGUvb3Bjb2RlL3ZheC5oIChzdHJ1Y3Qgdm90X3dvdCwgZmllbGQgYGFyZ3MnKTogIG1ha2UKLQlpdCBwb2ludGVyIHRvIGNvbnN0IGNoYXI7Ci0JKHN0cnVjdCB2b3QsIGZpZWxkIGBuYW1lJyk6ICBkaXR0by4KLQotVGh1IEphbiAxOSAxNDo0Nzo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiB2YXguaDogU3VwcGx5IGFuZCBwcm9wZXJseSBncm91cCBhbGwgdmFsdWVzIGluIGVuZCBzZW50aW5lbC4KLQotVHVlIEphbiAxNyAxMDo1NTozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl9JU0EsIElOU05fNDY1MCk6IERlZmluZS4KLQotV2VkIE9jdCAxOSAxMzozNDoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGEyOWsuaDogQWRkIG9wZXJhbmQgdHlwZSAnSScgZm9yIGBpbnYnIGFuZCBgaXJldGludicuICBPbgotCXN5c3RlbXMgd2l0aCBhIHNlcGFyYXRlIGluc3RydWN0aW9uIGFuZCBkYXRhIGNhY2hlLCBzdWNoIGFzIHRoZQotCTI5MDQwLCB0aGVzZSBpbnN0cnVjdGlvbnMgdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVudC4KLQotV2VkIFNlcCAxNCAxNzo0NDoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoSU5TTl9TVE9SRV9NRU1PUlkpOiBDb3JyZWN0IHZhbHVlIHRvIG5vdCBjb25mbGljdCB3aXRoCi0JSU5TTl9UUkFQLgotCi1UdWUgU2VwICA2IDExOjM5OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChJTlNOX1NUT1JFX01FTU9SWSk6IERlZmluZS4KLQotVGh1IEp1bCAyOCAxOToyODowNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBEb2N1bWVudCBuZXcgb3BlcmFuZCB0eXBlICd4Jy4KLQotVHVlIEp1bCAyNiAxNzo0ODowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpOTYwLmggKElfQ1gyKTogTmV3IGluc3RydWN0aW9uIGNhdGVnb3J5LiAgSXQgaW5jbHVkZXMKLQlpbnN0cnVjdGlvbnMgYXZhaWxhYmxlIG9uIEN4IGFuZCBKeCBwcm9jZXNzb3JzLgotCShJX0pYKTogTmV3IGluc3RydWN0aW9uIGNhdGVnb3J5LCBmb3IgSlgtb25seSBpbnN0cnVjdGlvbnMuCi0JKGk5NjBfb3Bjb2Rlcyk6IFB1dCBlc2hybyBhbmQgc3lzY3RsIGluIElfQ1gyIGNhdGVnb3J5LiAgQWRkZWQKLQlKeC1vbmx5IGluc3RydWN0aW9ucywgaW4gSV9KWCBjYXRlZ29yeS4KLQotV2VkIEp1bCAxMyAxODo0Mzo0NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBuczMyay5oIChlbmRvcCk6IE1hZGUgcG9pbnRlciBjb25zdCB0b28uCi0KLVN1biBKdWwgMTAgMTE6MDE6MDkgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIG5zMzJrLmg6IERyb3AgUSBvcGVyYW5kIHR5cGUgYXMgdGhlcmUgaXMgbm8gY29ycmVjdCB1c2UKLQlmb3IgaXQuIEFkZCBJIGFuZCBaIG9wZXJhbmQgdHlwZXMgd2hpY2ggYWxsb3cgYmV0dGVyIGNoZWNraW5nLgotCi1UaHUgSnVsICA3IDEyOjM0OjQ4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKHhvci5sKSA6Zml4IGJpdCBwYXR0ZXJuLgotCShMXzIpOiBOZXcgc2l6ZSBvZiBvcGVyYW5kLgotCSh0cmFwYSk6IFVzZSBpdC4KLQotRnJpIEp1biAxMCAxNjozODoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogTW92ZSAidHJhcCIgYmVmb3JlICJ0cGNjIiB0byBjaGFuZ2UgZGlzYXNzZW1ibHkuCi0KLUZyaSBKdW4gIDMgMTU6NTc6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogSW5jbHVkZSB2OSBkZWZpbml0aW9ucy4KLQotVGh1IEp1biAgMiAxMjoyMzoxNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKG02ODA2MCk6IERlZmluZWQuCi0JKG02ODA0MHVwLCBtZmxvYXQsIG1tbXUpOiBJbmNsdWRlIGl0LgotCShzdHJ1Y3QgbTY4a19vcGNvZGUpOiBXaWRlbiBgYXJjaCcgZmllbGQuCi0JKG02OGtfb3Bjb2Rlcyk6IFVwZGF0ZWQgZm9yIE02ODA2MC4gIFJlbW92ZWQgY29tbWVudHMgdGhhdCB3ZXJlCi0JaW5zdHJ1Y3Rpb25zIGNvbW1lbnRlZCBvdXQgYnkgIkpGIiB5ZWFycyBhZ28uCi0KLVRodSBBcHIgMjggMTg6MzE6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChzdHJ1Y3QgbTY4a19vcGNvZGUpOiBTaG9ydGVuIGBhcmNoJyBmaWVsZCB0byA4IGJpdHMsIGFuZAotCWFkZCBhIG9uZS1iaXQgYGZsYWdzJyBmaWVsZC4KLQkoRl9BTElBUyk6IE5ldyBtYWNyby4KLQotV2VkIEFwciAyNyAxMToyOTo1MiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChkZWMsIGluYyk6IEdldCBlbmNvZGluZyByaWdodC4KLQotTW9uIEFwciAgNCAxMzoxMjo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oIChzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kKTogUmVtb3ZlZCBzaWduZWRwIGZpZWxkOyBqdXN0IHVzZQotCWEgZmxhZyBpbnN0ZWFkLgotCShQUENfT1BFUkFORF9TSUdORUQpOiBEZWZpbmUuCi0JKFBQQ19PUEVSQU5EX1NJR05PUFQpOiBEZWZpbmUuCi0KLVRodSBNYXIgMzEgMTk6MzQ6MDggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChJU19KVU1QX09OX0VDWF9aRVJPLCAiamN4eiIgcGF0dGVybik6IE9wZXJhbmQgc2l6ZQotCXByZWZpeCBpcyAweDY2LCBub3QgMHg2Ny4gIFBhdGNoIGZyb20gSC5KLiBMdSAoaGx1QG55bmV4c3QuY29tKS4KLQotVGh1IE1hciAgMyAxNTo1MTowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IFJldmVyc2UgbGFzdCBjaGFuZ2UuICBJdCdsbCBiZSBoYW5kbGVkIGluIGdhcyBpbnN0ZWFkLgotCi1UaHUgRmViIDI0IDE1OjI5OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoc2FyKTogRGlzYWJsZWQgdGhlIHR3by1vcGVyYW5kIEltbTEgZm9ybSwgc2luY2UgaXQgd2FzCi0Jc2xvd2VyIG9uIHRoZSA0ODYgYW5kIHVzZWQgdGhlIGltcGxpY2l0IHNoaWZ0IGNvdW50IGRlc3BpdGUgdGhlCi0JZXhwbGljaXQgb3BlcmFuZC4gIFRoZSBvbmUtb3BlcmFuZCBmb3JtIGlzIHN0aWxsIGF2YWlsYWJsZSB0byBnZXQKLQl0aGUgc2hvcnRlciBmb3JtIHdpdGggdGhlIGltcGxpY2l0IHNoaWZ0IGNvdW50LgotCi1UaHUgRmViIDE3IDEyOjI3OjUyIDE5OTQgIFRvcmJqb3JuIEdyYW5sdW5kICAodGVnZUBtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogRml4IHR5cG8gaW4gZnN0d3MgYXJnIHN0cmluZy4KLQotV2VkIEZlYiAgOSAyMToyMzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oIChzdHJ1Y3QgcG93ZXJwY19vcGNvZGUpOiBNYWtlIG9wZXJhbmRzIGZpZWxkIHVuc2lnbmVkLgotCi1Nb24gRmViICA3IDE5OjE0OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmggKFBQQ19PUENPREVfNjAxKTogRGVmaW5lLgotCi1GcmkgRmViICA0IDIzOjQzOjUwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKGFkZGIpOiBVc2UgJ0AnIGZvciBhZGRiIGFuZCBhZGRpYiBwc2V1ZG8gb3BzLgotCShzbyB3ZSBjYW4gZGV0ZXJtaW5lIHZhbGlkIGNvbXBsZXRlcnMgZm9yIGJvdGggYWRkYiBhbmQgYWRkYlt0Zl0uKQotCi0JKiBocHBhLmggKHhtcHl1KTogTm8gZmxvYXRpbmcgcG9pbnQgZm9ybWF0IHNwZWNpZmllciBmb3IgdGhlCi0JeG1weXUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBGZWIgIDQgMjM6MzY6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaCAoUFBDX09QRVJBTkRfTkVYVCk6IERlZmluZS4KLQkoUFBDX09QRVJBTkRfTkVHQVRJVkUpOiBDaGFuZ2UgdmFsdWUgdG8gbWFrZSByb29tIGZvciBhYm92ZS4KLQkoc3RydWN0IHBvd2VycGNfbWFjcm8pOiBEZWZpbmUuCi0JKHBvd2VycGNfbWFjcm9zLCBwb3dlcnBjX251bV9tYWNyb3MpOiBEZWNsYXJlLgotCi1GcmkgSmFuIDIxIDE5OjEzOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmg6IE5ldyBmaWxlLiAgSGVhZGVyIGZpbGUgZm9yIFBvd2VyUEMgb3Bjb2RlIHRhYmxlLgotCi1Nb24gSmFuIDE3IDAwOjE0OjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmg6IE1vcmUgbWlub3IgdGVtcGxhdGUgZml4ZXMgZm9yIHNmdSBhbmQgY29wciAodG8gYWxsb3cKLQlmb3IgZWFzaWVyIGRpc2Fzc2VtYmx5KS4KLQotCSogaHBwYS5oOiBGaXggdGVtcGxhdGVzIGZvciBhbGwgdGhlIHNmdSBhbmQgY29wciBpbnN0cnVjdGlvbnMuCi0KLVdlZCBEZWMgMTUgMTU6MTI6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChwdXNoKTogUGVybWl0IEltbTE2IG9wZXJhbmQgdG9vLgotCi1TYXQgRGVjIDExIDE2OjE0OjA2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiAgaDgzMDAuaCAoYW5kYyk6IEV4aXN0cyBpbiBiYXNlIGFyY2guCi0KLVdlZCBEZWMgIDEgMTI6MTU6MzIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEZyb20gSGlzYXNoaSBNSU5BTUlOTyA8bWluYW1pbm9Ac3JhbWhjLnNyYS5jby5qcD4KLQkqIGhwcGEuaDogI3VuZGVmIE5PTkUgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBoaXV4IGluY2x1ZGUgZmlsZXMuCi0KLVN1biBOb3YgMjEgMjI6MDY6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaDogQWRkIEZQIHF1YWR3b3JkIHN0b3JlIGluc3RydWN0aW9ucy4KLQotV2VkIE5vdiAxNyAxNzoxMzoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogKE1fSl9BKTogQWRkZWQuCi0JKE1fTEEpOiBSZW1vdmVkLgotCi1Nb24gTm92ICA4IDEyOjEyOjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChPUF9NQVNLX0NBQ0hFLCBPUF9TSF9DQUNIRSk6IERlZmluZS4gIEZyb20gVGVkIExlbW9uCi0JPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4uCi0KLVN1biBOb3YgIDcgMDA6MzA6MTEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaDogSW1tZWRpYXRlIGZpZWxkIGluIHByb2JlaSBpbnN0cnVjdGlvbnMgaXMgdW5zaWduZWQsCi0Jbm90IGxvdy1zaWduIGV4dGVuZGVkLgotCi1XZWQgTm92ICAzIDEwOjMwOjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtODhrLmggKFJSSTEwTUFTSyk6IENoYW5nZSBmcm9tIDB4ZmMwMGZmZTAgdG8gMHhmYzAwZmMwMC4KLQotVHVlIE5vdiAgMiAxMjo0MTozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBBZGQgImZ4Y2giIHdpdGhvdXQgb3BlcmFuZC4KLQotTW9uIE5vdiAgMSAxODoxMzowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTV9KQUxfMSwgTV9KQUxfMiwgTV9KQUxfQSk6IEFkZGVkLgotCi1TYXQgT2N0ICAyIDIyOjI2OjExIDE5OTMgIEplZmZyZXkgQSBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaDogQWRkIGdmdyBhbmQgZ2ZyIHRvIHRoZSBvcGNvZGUgdGFibGUuCi0KLVdlZCBTZXAgMjkgMTY6MjM6MDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBtODhrLmg6IGV4dGVuZGVkIHRvIGhhbmRsZSBtODgxMTAuCi0KLVR1ZSBTZXAgMjggMTk6MTk6MDggMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChiZSwgYmxlKTogVXNlIG9wZXJhbmQgdHlwZSAneicgdG8gZGVub3RlIGFic29sdXRlIGJyYW5jaAotCWFkZHJlc3Nlcy4KLQotVHVlIFNlcCAxNCAxNDowNDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGk5NjAuaCAoaTk2MF9vcGNvZGVzKTogUHJvcGVybHkgYnJhY2tldCBpbml0aWFsaXplcnMuCi0KLU1vbiBTZXAgMTMgMTI6NTA6NTIgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBtODhrLmggKEJPRkxBRyk6IHJld3JpdGUgdG8gYXZvaWQgbmVzdGVkIGNvbW1lbnQuCi0KLU1vbiBTZXAgMTMgMTU6NDY6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKHR3byk6IFByb3RlY3Qgc2Vjb25kIGFyZ3VtZW50IHdpdGggcGFyZW50aGVzZXMuCi0KLUZyaSBTZXAgMTAgMTY6Mjk6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGRlZCBuZXcgaW5zdHJ1Y3Rpb24gInJzbSIgKGZvciBpMzg2c2wpLgotCURlbGV0ZWQgb2xkIGluL291dCBpbnN0cnVjdGlvbnMgaW4gIiNpZiAwIiBzZWN0aW9uLgotCi1UaHUgU2VwICA5IDE3OjQyOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUHJvcGVybHkgYnJhY2tldCBpbml0aWFsaXplcnMuCi0KLVdlZCBBdWcgMjUgMTM6NTA6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZSk6IFVzZSAnfCcgZm9yIG1vdmIgYW5kIG1vdmliIGluc25zLiAgKEZyb20KLQlKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1KS4KLQotTW9uIEF1ZyAyMyAxNjo1NTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAobGNhbGwpOiBBY2NlcHQgSW1tMzIgb3BlcmFuZCBhbHNvLgotCi1Nb24gQXVnIDIzIDEyOjQzOjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNX0FCU1UpOiBSZW1vdmVkIChhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCBudW1iZXI/PykuCi0JKE1fREFCUyk6IEFkZGVkLgotCi1UaHUgQXVnIDE5IDE1OjA4OjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChJTlNOXyopOiBDaGFuZ2VkIHZhbHVlcy4gIFJlbW92ZWQgdW51c2VkIGRlZmluaXRpb25zLgotCUFkZGVkIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZLCBJTlNOX0lTQTIgYW5kIElOU05fSVNBMy4gIFNwbGl0Ci0JSU5TTl9MT0FEX0RFTEFZIGludG8gSU5TTl9MT0FEX01FTU9SWV9ERUxBWSBhbmQKLQlJTlNOX0xPQURfQ09QUk9DX0RFTEFZLiAgU3BsaXQgSU5TTl9DT1BST0NfREVMQVkgaW50bwotCUlOU05fQ09QUk9DX01PVkVfREVMQVkgYW5kIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWS4KLQkoTV8qKTogQWRkZWQgbmV3IHZhbHVlcyBmb3IgcjYwMDAgYW5kIHI0MDAwIG1hY3Jvcy4KLQkoQU5ZX0RFTEFZKTogUmVtb3ZlZC4KLQotV2VkIEF1ZyAxOCAxNTozNzo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogQWRkZWQgTV9MSV9TIGFuZCBNX0xJX1NTLgotCi1UdWUgQXVnIDE3IDA3OjA4OjA4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IEdldCBzb21lIHJhcmUgbW92LmJzIGNvcnJlY3QuCi0KLVRodSBBdWcgIDUgMDk6MTU6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IERvbid0IGRlZmluZSBjb25zdCBvdXJzZWxmOyByZWx5IG9uIGFuc2lkZWNsLmggaGF2aW5nCi0JYmVlbiBpbmNsdWRlZC4KLQotRnJpIEp1bCAzMCAxODo0MToxMSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoRl9KU1IsIEZfVU5CUiwgRl9DT05EQlIpOiAgQWRkIG5ldyBmbGFncyB0byBtYXJrCi0JanVtcCBpbnN0cnVjdGlvbnMsIGZvciB1c2UgaW4gZGlzYXNzZW1ibGVycy4KLQotVGh1IEp1bCAyMiAwNzoyNToyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG04OGsuaDogTWFrZSBiaXRmaWVsZHMganVzdCB1bnNpZ25lZCwgbm90IHVuc2lnbmVkIGxvbmcgb3IKLQl1bnNpZ25lZCBzaG9ydC4KLQotV2VkIEp1bCAyMSAxMTo1NTozMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBOZXcgYXJndW1lbnQgdHlwZSAneScuICBVc2UgaW4gdmFyaW91cyBmbG9hdCBpbnN0cnVjdGlvbnMuCi0KLU1vbiBKdWwgMTkgMTc6MTc6MDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoYnJlYWspOiBGaXJzdCBpbW1lZGlhdGUgZmllbGQgaXMgdW5zaWduZWQuCi0KLQkqIGhwcGEuaDogQWRkIHJmaXIgaW5zdHJ1Y3Rpb24uCi0KLVN1biBKdWwgMTggMTY6Mjg6MDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IFNwbGl0IHRoZSBhY3R1YWwgdGFibGUgb3V0IGludG8gLi4vLi4vb3Bjb2Rlcy9taXBzLW9wYy5jLgotCi1GcmkgSnVsIDE2IDA5OjU5OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBSZXdvcmtlZCB0aGUgaGF6YXJkIGluZm9ybWF0aW9uIHNvbWV3aGF0LCBhbmQgZml4ZWQgc29tZQotCWJ1Z3MgaW4gdGhlIGluc3RydWN0aW9uIGhhemFyZCBkZXNjcmlwdGlvbnMuCi0KLVRodSBKdWwgMTUgMTI6NDI6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLmg6IENvcnJlY3RlZCBhIGNvdXBsZSBvZiBvcGNvZGVzLgotCi1UdWUgSnVsICA2IDE1OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBSZXBsYWNlZCB3aXRoIHZlcnNpb24gZnJvbSBSYWxwaCBDYW1wYmVsbCBhbmQgT1NGLiAgVGhlCi0JbmV3IHZlcnNpb24gaW5jbHVkZXMgaW5zdHJ1Y3Rpb24gaGF6YXJkIGluZm9ybWF0aW9uLCBidXQgaXMKLQlvdGhlcndpc2UgcmVhc29uYWJseSBzaW1pbGFyLgotCi1UaHUgSnVsICAxIDIwOjM2OjE3IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IEZpeCB0eXBvIGluIFVOT1AzIChhZmZlY3RlZCBzaFthbF1bbHJdLmwpLgotCi1GcmkgSnVuIDExIDE4OjM4OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHU6Ci0JKiBocHBhLmg6IENsZWFuIHVwIHNvbWUgb2YgdGhlIE9MRF9UQUJMRSwgbm9uLU9MRF9UQUJMRSBicmFpbmRhbWFnZS4KLQlNYWtlIHRoZSB0YWJsZXMgYmUgdGhlIHNhbWUgZm9yIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOgotCSJiYiIsICJhZGRiW3RmXSIsICJhZGRpYlt0Zl0iLCAiYWRkIiwgImFkZFtsb2NdIiwgImFkZGNvIiwKLQkic2hbMTIzXWFkZCIsICJzaFsxMjNdYWRkW2xvXSIsICJzdWIiLCAic3ViW29idF0iLCAic3ViW2J0XW8iLAotCSJkcyIsICJjb21jbHIiLCAiYWRkaSIsICJhZGRpW290XSIsICJhZGRpdG8iLCAic3ViaSIsICJzdWJpbyIsCi0JImNvbWljbHIiLCAiZmFkZCIsICJmc3ViIiwgImZtcHkiLCAiZmRpdiIsICJmc3FydCIsICJmYWJzIiwKLQkiZnJuZCIsICJmY3B5IiwgImZjbnZmZiIsICJmY252eGYiLCAiZmNudmZ4IiwgImZjbnZmeHQiLAotCSJmY21wIiwgYW5kICJmdGVzdCIuCi0KLQkqIGhwcGEuaDogTWFrZSBuZXcgYW5kIG9sZCB0YWJsZXMgdGhlIHNhbWUgZm9yICJicmVhayIsICJtdGN0bCIsCi0JIm1mY3RsIiwgImJiIiwgInNzbSIsICJyc20iLCAieG1weXUiLCAiZm1weWFkZCIsICJmbXB5c3ViIi4KLQlGaXggdHlwbyBpbiBsYXN0IHBhdGNoLiAgQ29sbGFwc2Ugc2V2ZXJhbCAjaWZkZWZzIGludG8gYQotCXNpbmdsZSAjaWZkZWYuCi0KLQkqIGhwcGEuaDogRGVsZXRlIHJlbWFpbmluZyBPTERfVEFCTEUgY29kZS4gIEJyaW5nIHNvbWUKLQlvZiB0aGUgY29tbWVudHMgdXAtdG8tZGF0ZS4KLQotCSogaHBwYS5oOiBVcGRhdGUgImZyZWUgbGlzdCIgb2YgbGV0dGVycyBhbmQgdXBkYXRlCi0JY29tbWVudHMgZGVzY3JpYmluZyBlYWNoIGxldHRlcidzIGZ1bmN0aW9uLgotCi1GcmkgSnVuICA0IDE1OjQxOjM3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IGNoZWNrcG9pbnQsIGluY2x1ZGVzIEg4LzMwMC1IIG9wY29kZXMuCi0KLVRodSBKdW4gIDMgMTU6NDI6NTkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogUGF0Y2hlcyBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgotCSogaHBwYS5oOiBSZXdvcmsgc2luZ2xlIHByZWNpc2lvbiBGUAotCWluc3RydWN0aW9ucyBzbyB0aGF0IHRoZXkgY29ycmVjdGx5IGRpc2Fzc2VtYmxlIGNvZGUKLQlQQTEuMSBjb2RlLgotCi1UaHUgTWF5IDI3IDE5OjIxOjIyIDE5OTMgIEJydWNlIEJhdW1hbiAgKGJvb3RAb3NmLm9yZykKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiLCBtb3YgcGF0dGVybik6IFJlbW92ZSBNZW0xNiByZXN0cmljdGlvbiBmcm9tCi0JbW92IHRvIGFsbG93IGluc3RydWN0aW9ucyBsaWtlIG1vdiBzcyx4eXooZWN4KSB0byBhc3NlbWJsZS4KLQotVHVlIE1heSAyNSAwMDozOTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBVc2UgbmV3IHZlcnNpb24gZnJvbSBVdGFoIGlmIE9MRF9UQUJMRSBpc24ndCBkZWZpbmVkOwotCWdkYiB3aWxsIGRlZmluZSBpdCBmb3Igbm93LgotCi1Nb24gTWF5IDI0IDE1OjIwOjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogRG9uJ3QgZW5kIGVudW1lcmF0b3IgbGlzdCB3aXRoIGNvbW1hLgotCi1GcmkgTWF5IDE0IDE1OjE1OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQmFzZWQgb24gcGF0Y2hlcyBmcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6Ci0JKiBtaXBzLmggKE9QX01BU0tfQ09QWiwgT1BfU0hfQ09QWik6IERlZmluZS4KLQkoImJjMnQiKTogQ29ycmVjdCB0eXBvLgotCSgiW2xzXXdjWzAyM10iKTogVXNlIFQgcmF0aGVyIHRoYW4gdC4KLQkoImNbMDEyM10iKTogRGVmaW5lIGdlbmVyYWwgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gTWF5IDEwIDA2OjAyOjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IE1vdmUgc3BsaXQgcG9pbnQgZm9yIGdjYyBjb21waWxhdGlvbiBtb3JlIHRvd2FyZHMKLQltaWRkbGUuCi0KLUZyaSBBcHIgIDkgMTM6MjY6MTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHJzNmsuaDogQ2xlYW4gdXAgaW5zdHJ1Y3Rpb25zIGZvciBwcmltYXJ5IG9wY29kZSAxOSAobWFueSB3ZXJlCi0Jc2ltcGx5IHdyb25nLCBpY3MsIHJmaSwgJiByZnN2YyB3ZXJlIG1pc3NpbmcpLgotCUFkZCAiYSIgdG8gb3ByX2V4dCBmb3IgImJiIi4gIERvYyBmaXguCi0KLVRodSBNYXIgMTggMTM6NDU6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6ICA0ODYgZXh0ZW5zaW9ucyBmcm9tIEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkuCi0JKiBtaXBzLmg6ICBBZGQgY2FzdHMsIHRvIHN1cHByZXNzIHdhcm5pbmdzIGFib3V0IHNoaWZ0aW5nIHRvbyBtdWNoLgotCSogbTY4ay5oOiAgRG9jdW1lbnQgdGhlIHBsYWNlbWVudCBjb2RlICc5Jy4KLQotVGh1IEZlYiAxOCAwMjowMzoxNCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChCUkVBS19VUF9CSUdfREVDTCwgQU5EX09USEVSX1BBUlQpOiAgQWRkIGtsdWRnZSB3aGljaAotCWFsbG93cyBjYWxsZXJzIHRvIGJyZWFrIHVwIHRoZSBsYXJnZSBpbml0aWFsaXplZCBzdHJ1Y3QgZnVsbCBvZgotCW9wY29kZXMgaW50byB0d28gaGFsZi1zaXplZCBvbmVzLiAgVGhpcyBwZXJtaXRzIEdDQyB0byBjb21waWxlCi0JdGhpcyBtb2R1bGUsIHNpbmNlIGl0IHRha2VzIGV4cG9uZW50aWFsIHNwYWNlIGZvciBpbml0aWFsaXplcnMuCi0JKG51bW9wY29kZXMsIGVuZG9wKTogIFJldmlzZSB0byB1c2UgQU5EX09USEVSX1BBUlQgaW4gc2l6ZSBjYWxjcy4KLQotVGh1IEZlYiAgNCAwMjowNjo1NiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYTI5ay5oOiAgUmVtb3ZlIFJDUyBjcnVkLCB1cGRhdGUgR1BMIHRvIHYyLCB1cGRhdGUgY29weXJpZ2h0cy4KLQkqIGNvbnZleC5oOiAgQWRkZWQsIGZyb20gR0RCJ3MgY29udngtb3Bjb2RlLmguICBBZGRlZCBDT05TVCB0byBhbGwKLQlpbml0aWFsaXplZCBzdHJ1Y3RzIGluIGl0LgotCi1UaHUgSmFuIDI4IDIxOjMyOjIyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JRGVsdGEgODggY2hhbmdlcyBpbnNwaXJlZCBieSBDYXJsIEdyZWNvLCA8Y2dyZWNvQENyZWlnaHRvbi5FZHU+OgotCSogbTg4ay5oIChQTUVNKTogIEF2b2lkIHByZXZpb3VzIGRlZmluaXRpb24gZnJvbSA8c3lzL3BhcmFtLmg+LgotCShBTkQpOiAgQ2hhbmdlIHRvIEFORF8gdG8gYXZvaWQgYW5zaWRlY2wuaCBgQU5EJyBjb25mbGljdC4KLQotU2F0IEphbiAyMyAxODoxMDo0OSBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCi0KLQkqIG1pcHMuaDogZG9jdW1lbnQgImkiIGFuZCAiaiIgb3BlcmFuZHMgY29ycmVjdGx5LgotCi1UaHUgSmFuICA3IDE1OjU4OjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBSZW1vdmVkIGVuZGlhbm5lc3MgZGVwZW5kZW5jeS4KLQotU3VuIEphbiAgMyAxNDoxMzozNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogaW5jbHVkZSBpbmZvIG9uIG51bWJlciBvZiBjeWNsZXMgcGVyIGluc3RydWN0aW9uLgotCi1Nb24gRGVjIDIxIDIxOjI5OjA4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogIE1vdmUgaGFuZHkgYWxpYXNlcyB0byB0aGUgZnJvbnQuICBGaXggbWFza3MgZm9yIGV4dHJhY3QKLQlhbmQgZGVwb3NpdCBpbnN0cnVjdGlvbnMuCi0KLVNhdCBEZWMgMTIgMTY6MDk6NDggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGFjY2VwdCBzaGxkIGFuZCBzaHJkIGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgc2hpZnQKLQljb3VudCBhcmd1bWVudCwgd2hpY2ggaXMgYWx3YXlzICVjbC4KLQotRnJpIE5vdiAyNyAxNzoxMzoxOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm4gYXQgY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiX2VuZCwgaTM4Nl9yZWd0YWJfZW5kKTogTm93IGNvbnN0LgotCShvbmVfYnl0ZV9zZWdtZW50X2RlZmF1bHRzLCB0d29fYnl0ZV9zZWdtZW50X2RlZmF1bHRzLAotCWkzODZfcHJlZml4dGFiX2VuZCk6IERpdHRvLgotCi1Nb24gTm92IDIzIDEwOjQ3OjI1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiB2YXguaCAoYmIqKTogVXNlICJ2IiAoYml0ZmllbGQgdHlwZSksIG5vdCAiYSIgKGFkZHJlc3Mgb3BlcmFuZCkKLQlmb3Igb3BlcmFuZCAyOyBmcm9tIEpvaG4gQ2FyciwgamZjQGRzZy5kZWMuY29tLgotCi1XZWQgTm92ICA0IDA3OjM2OjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IERlZmluZSBGSVhFRF9TSVpFX0JSQU5DSCwgc28gYnNyIGFuZCBicmEgaW5zdHJ1Y3Rpb25zCi0JYWx3YXlzIHVzZSAxNi1iaXQgb2Zmc2V0cy4gIE1ha2VzIGNhbGN1bGF0ZWQtc2l6ZSBqdW1wIHRhYmxlcwotCWZlYXNpYmxlLgotCi1GcmkgT2N0IDE2IDIyOjUyOjQzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IEZpeCBvbmUtb3BlcmFuZCBmb3JtcyBvZiBpbiogYW5kIG91dCogcGF0dGVybnMuCi0KLVR1ZSBTZXAgMjIgMTQ6MDg6MTQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IEFkZGVkIENQVTMyIHN1cHBvcnQuCi0KLVR1ZSBTZXAgMjIgMDA6Mzg6NDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoYnJlYWspOiAgRGlzYXNzZW1ibGUgdGhlIGFyZ3VtZW50LiAgUGF0Y2ggZnJvbQotCWpvbmF0aGFuQGNzLnN0YW5mb3JkLmVkdSAoSm9uYXRoYW4gU3RvbmUpLgotCi1XZWQgU2VwICA5IDExOjI1OjI4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBtZXJnZWQgTW90b3JvbGEgYW5kIE1JVCBzeW50YXguCi0KLVRodSBTZXAgIDMgMDk6MzM6MjIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAocG1vdmUpOiBtYWtlIHRoZSB0ZXN0cyBsZXNzIHN0cmljdCwgdGhlIDY4ayBib29rIGlzCi0Jd3JvbmcuCi0KLVR1ZSBBdWcgMjUgMjM6MjU6MTkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKG02OGVjMDMwKTogRGVmaW5lZCBhcyBhbGlhcyBmb3IgNjgwMzAuCi0JKG02OGtfb3Bjb2Rlcyk6IE5ldyB0eXBlIGNoYXJhY3RlcnMgIjMiIGZvciA2ODAzMCBNTVUgcmVncyBhbmQgInQiCi0JZm9yIGltbWVkaWF0ZSAwLTcgYWRkZWQuICBTZXQgdXAgc29tZSBvcGNvZGVzIChwdGVzdCwgYmtwdCkgdG8gdXNlCi0JdGhlbS4gIFRpZ2h0ZW5lZCBkZXNjcmlwdGlvbiBvZiAiZm1vdmV4IiB0byBkaXN0aW5ndWlzaCBpdCBmcm9tCi0Jc29tZSAicG1vdmUiIGVuY29kaW5ncy4gIEFkZGVkICJwbW92ZSIgZm9yIDY4MDMwIE1NVSByZWdzLCBjbGVhbmVkCi0JdXAgZGVzY3JpcHRpb25zIHRoYXQgY2xhaW1lZCB2ZXJzaW9ucyB3ZXJlIGF2YWlsYWJsZSBmb3IgY2hpcHMgbm90Ci0Jc3VwcG9ydGluZyB0aGVtLiAgQWRkZWQgInBtb3ZlZmQiLgotCi1Nb24gQXVnIDI0IDEyOjA0OjUxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IGZpeCB3aGVyZSB0aGUgLiBnb2VzIGluIGRpdnVsbAotCi1XZWQgQXVnIDE5IDExOjIyOjI0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiB0aGUgY2FzMiBpbnN0cnVjdGlvbiBpcyBzdXBwb3NlZCB0byBiZSB3cml0dGVuIHdpdGgKLQlpbmRpcmVjdGlvbiBvbiB0aGUgbGFzdCB0d28gb3BlcmFuZHMsIHdoaWNoIGNhbiBiZSBlaXRoZXIgZGF0YSBvcgotCWFkZHJlc3MgcmVnaXN0ZXJzLiAgQWRkZWQgYSBuZXcgb3BlcmFuZCB0eXBlICdyJyB3aGljaCBhY2NlcHRzCi0JZWl0aGVyIHJlZ2lzdGVyIHR5cGUuICBBZGRlZCBuZXcgY2FzZXMgZm9yIGNhczJsIGFuZCBjYXMydyB3aGljaAotCXVzZSB0aGVtLiAgQ29ycmVjdGVkIG1hc2tzIGZvciBjYXMyIHdoaWNoIGZhaWxlZCB0byByZWNvZ25pemUgdXNlCi0Jb2YgYWRkcmVzcyByZWdpc3Rlci4KLQotRnJpIEF1ZyAxNCAxNDoyMDozOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiAgTWVyZ2VkIGluIHBhdGNoZXMgKG1vc3RseSBtNjgwNDAtc3BlY2lmaWMpIGZyb20KLQlDb2xpbiBTbWl0aCA8Y29saW5Ad3JzLmNvbT4uCi0KLQkqIG02OGsuaDogIE1lcmdlZCBtNjhrbXJpLmggYW5kIG02OGsuaCAodXNpbmcgdGhlIGZvcm1lciBhcyBhCi0JYmFzZSkuICBBbHNvIGNsZWFuZWQgdXAgZHVwbGljYXRlcywgcmUtb3JkZXJlZCBpbnN0cnVjdGlvbnMgZm9yCi0JdGhlIHNha2Ugb2YgZGlzLWFzc2VtYmxpbmcgKHNvIGFsaWFzZXMgY29tZSBhZnRlciBzdGFuZGFyZCBuYW1lcykuCi0JKiBtNjhrbXJpLmg6IE5vdyBqdXN0IGRlZmluZXMgc29tZSBtYWNyb3MsIGFuZCAjaW5jbHVkZXMgbTY4ay5oLgotCi1XZWQgQXVnIDEyIDE2OjM4OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtNjhrbXJpLmg6IGFkZGVkIHZhcmlvdXMgb3Bjb2Rlcy4gTW92ZWQgamJ4eCB0byBieHhlcy4gRmlsbGVkIGluCi0JYWxsIG1pc3NpbmcgLnMKLQotTW9uIEF1ZyAxMCAyMzoyMjozMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogTW92ZWQgdGFibGVzIHRvIEJGRCBsaWJyYXJ5LgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgZmlsZHEsIGZpc3RwcSBhbGlhc2VzIHVzZWQgYnkgZ2NjLgotCi1TdW4gSnVuIDI4IDEzOjI5OjAzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiAgRmluaXNoIGZpbGxpbmcgaW4gYWxsIHRoZSBob2xlcyBpbiB0aGUgb3Bjb2RlIHRhYmxlLAotCXNvIHRoYXQgdGhlIEx1Y2lkIEMgY29tcGlsZXIgY2FuIGRpZ2VzdCB0aGlzIGFzIHdlbGwuLi4KLQotRnJpIEp1biAyNiAyMToyNzoxNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiAgQWRkIHNldGMsIHNldG5jLCBhZGRyMTYsIGRhdGExNiwgcmVweiwgcmVwbnogYWxpYXNlcy4KLQlGaXggb3Bjb2RlcyBvbiB2YXJpb3VzIHNpemVzIG9mIGZpbGQvZmlzdCBpbnN0cnVjdGlvbnMKLQkoMTZiaXQ9bm8gc3VmZml4LCAzMmJpdD0ibCIgc3VmZml4LCA2NGJpdD0ibGwiIHN1ZmZpeCkuCi0JVXNlIHRhYnMgdG8gaW5kZW50IGZvciBjb21tZW50cy4gIEZpeGVzIHN1Z2dlc3RlZCBieSBNaW5oIFRyYW4tTGUuCi0KLVRodSBKdW4gMjUgMTY6MTM6MjYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogIEZpbGwgaW4gYWxsIHRoZSBob2xlcyBpbiB0aGUgb3Bjb2RlIHRhYmxlIHNvIHRoYXQgdGhlCi0JbG9zaW5nIEhQVVggQyBjb21waWxlciBjYW4gZGlnZXN0IHRoaXMuLi4KLQotVGh1IEp1biAxMSAxMjoxNToyNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiAgRml4IGRlY29kaW5nIG9mIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucywgc29tZXdoYXQuCi0JKEZpeCBieSBFcmljIEFuZGVyc29uLCAzamVhbkBtYWFzLW5lb3Rlay5hcmMubmFzYS5nb3YuKQotCi1UaHUgTWF5IDI4IDExOjE3OjQ0IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogQWRkIG5ldyBhcmNoaXRlY3R1cmUgdmFyaWFudCBzcGFyY2xpdGU7IGFkZCBpdHMgc2NhbgotCWFuZCBkaXZzY2Mgb3Bjb2Rlcy4gIERlZmluZSBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AgbWFjcm8uCi0KLVR1ZSBNYXkgIDUgMTQ6MjM6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6ICBBZGQgc29tZSBtb3JlIG9wY29kZSBzeW5vbnltcyAoZnJvbSBGcmFuayBZZWxsaW4sCi0JZnlAbHVjaWQuY29tKS4KLQotVGh1IEFwciAxNiAxODoyNToyNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogcnM2ay5oOiAgTmV3IHZlcnNpb24gZnJvbSBJQk0gKE1ldGluKS4KLQotVGh1IEFwciAgOSAwMDozMToxOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHJzNmsuaDogRml4IGluY29ycmVjdCBleHRlbmRlZCBvcGNvZGUgZm9yIGluc3RydWN0aW9ucyBgZm0nCi0gICAgICAgIGFuZCBgZmQnLiAgKEZyb20gbWV0aW5AaWJtcGEuYXdkcGEuaWJtLmNvbSAoTWV0aW4gRy4gT3ppc2lrKS4pCi0KLVR1ZSBBcHIgIDcgMTM6Mzg6NDcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcnM2ay5oOiAgTW92ZSBmcm9tIC4uLy4uL2dkYi9yczZrLW9wY29kZS5oLgotCi1GcmkgQXByICAzIDExOjMwOjIwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtNjhrLmggKG9uZSwgdHdvKTogIENhc3QgbWFjcm8gYXJncyB0byB1bnNpZ25lZCB0byBzdXBwcmVzcwotCWNvbXBsYWludHMgZnJvbSBjb21waWxlciBhbmQgbGludCBhYm91dCBpbnRlZ2VyIG92ZXJmbG93IGR1cmluZwotCXNoaWZ0LgotCi1TdW4gTWFyIDI5IDEyOjIyOjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChPUCk6ICBBdm9pZCBzaWduZWQgb3ZlcmZsb3cgd2hlbiBzaGlmdGluZyB0byBoaWdoIG9yZGVyIGJpdC4KLQotRnJpIE1hciAgNiAwMDoyMjozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiAgTWFrZSBiaXRmaWVsZCBsYXlvdXQgZGVwZW5kIG9uIHRoZSBIT1NUIGNvbXBpbGVyLAotCW5vdCBvbiB0aGUgVEFSR0VUIHN5c3RlbS4KLQotRnJpIEZlYiAyMSAwMToyOTo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBhZGRlZCBpbmIsIGludywgb3V0Yiwgb3V0dyBvcGNvZGVzLCBhZGRlZCBhdHQgc3ludGF4IGZvcgotCSAgc2NtcCwgc2xvZCwgc21vdiwgc3NjYSwgc3N0by4gIEN1cnRlc3kgTWluaCBUcmFuLUxlCi0JICA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4uCi0KLVRodSBKYW4gMzAgMDc6MzE6NDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IHR1cm5lZCBvcF90eXBlIGVudW0gaW50byAjZGVmaW5lIGxpc3QKLQotVGh1IEphbiAzMCAwMTowNzoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogIFJlbW92ZSAiY3lwcmVzcyIgYXJjaGl0ZWN0dXJlLiAgUmVtb3ZlICJmaXRveCIgYW5kCi0Jc2ltaWxhciBpbnN0cnVjdGlvbnMgLS0gdGhleSd2ZSBiZWVuIHJlbmFtZWQgdG8gImZpdG9xIiwgZXRjLgotCVJFQUxMWSBmaXggdHN1YmNjdHYuICBGaXggImZjbXBlcSIgYW5kICJmY21wcSIgd2hpY2ggaGFkIHdyb25nCi0JbnVtYmVyIG9mIGFyZ3VtZW50cy4KLQkqIGg4MzAwLmg6ICBSZW1vdmUgZXh0cmEgOyB3aGljaCBwcm9kdWNlcyBjb21waWxlciB3YXJuaW5nLgotCi1UdWUgSmFuIDI4IDIyOjU5OjIyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6ICBmaXggb3Bjb2RlIGZvciB0c3ViY2N0di4KLQotVHVlIEphbiAgNyAxNzoxOTozOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogZmJhIGFuZCBjYmEgYXJlIG5vdyBhbGlhc2VzIGZvciBmYiBhbmQgY2IgcmVzcGVjdGl2ZWx5LgotCi1GcmkgRGVjIDI3IDEwOjU1OjUwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChub3ApOiAgTWFkZSB0aGUgJ2xvc2UnIGZpZWxkIGJlIGV2ZW4gdGlnaHRlciwKLQlzbyBvbmx5IGEgc3RhbmRhcmQgJ25vcCcgaXMgZGlzYXNzZW1ibGVkIGFzIGEgbm9wLgotCi1TdW4gRGVjIDIyIDEyOjE4OjE4IDE5OTEgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAobm9wKTogQWRkIFJEX0dPIHRvIGBsb3NlJyBzbyB0aGF0IG9ubHkgJWcwIGluIGRlc3QgaXMKLQlkaXNhc3NlbWJsZWQgYXMgYSBub3AuCi0KLVR1ZSBEZWMgMTAgMDA6MjI6MjAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBmaXggYSB0eXBvLgotCi1TYXQgTm92IDMwIDIwOjQwOjUxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhMjlrLmgsIGFybS5oLCBoODMwMC5oLCAgaTM4Ni5oLCAgaTg2MC5oLCBpOTYwLmggLCBtNjhrLmgsCi0JbTg4ay5oLCBtaXBzLmggLCBucDEuaCwgbnMzMmsuaCwgcG4uaCwgcHlyLmgsIHNwYXJjLmgsIHRhaG9lLmgsCi0JdmF4LmgsIENoYW5nZUxvZzogcmVuYW1lZCBmcm9tIC4uLzxmb28+LW9wY29kZS5oCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2EyOWsuaCBiL2luY2x1ZGUvb3Bjb2RlL2EyOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyZTEyNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hMjlrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIEFNRCAyOTAwMCBmYW1pbHkuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCIGFuZCBHQVMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXN0cnVjdCBhMjlrX29wY29kZSB7Ci0gIC8qIE5hbWUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgY2hhciAqbmFtZTsKLQotICAvKiBPcGNvZGUgd29yZCAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBBIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHdoaWNoIGRlc2NyaWJlIHRoZSBvcGVyYW5kcy4KLSAgICAgVmFsaWQgY2hhcmFjdGVycyBhcmU6Ci0gICAgICwgICAgICAgIEl0c2VsZi4gIFRoZSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgYXNzZW1ibHkgY29kZS4KLSAgICAgYSAgICAgICAgUkEuICBUaGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGluIGJpdHMgOC0xNSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGIgICAgICAgIFJCLiAgVGhlIHJlZ2lzdGVyIG51bWJlciBpcyBpbiBiaXRzIDAtNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGMgICAgICAgIFJDLiAgVGhlIHJlZ2lzdGVyIG51bWJlciBpcyBpbiBiaXRzIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgaSAgICAgICAgQW4gaW1tZWRpYXRlIG9wZXJhbmQgaXMgaW4gYml0cyAwLTcgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICB4ICAgICAgICBCaXRzIDAtNyBhbmQgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSBiaXRzIDAtNyBhbmQgOC0xNQotICAgICAgICAgICAgICAocmVzcGVjdGl2ZWx5KSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQuCi0gICAgIGggICAgICAgIFNhbWUgYXMgeCBidXQgdGhlIGluc3RydWN0aW9uIGNvbnRhaW5zIGJpdHMgMTYtMzEgb2YgdGhlCi0gICAgICAgICAgICAgIGltbWVkaWF0ZSBvcGVyYW5kLgotICAgICBYICAgICAgICBTYW1lIGFzIHggYnV0IGJpdHMgMTYtMzEgb2YgdGhlIHNpZ25lZCBpbW1lZGlhdGUgb3BlcmFuZAotICAgICAgICAgICAgICBhcmUgc2V0IHRvIDEgKHRodXMgdGhlIG9wZXJhbmQgaXMgYWx3YXlzIG5lZ2F0aXZlKS4KLSAgICAgUCxBICAgICAgQml0cyAwLTcgYW5kIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgYml0cyAyLTkgYW5kIDEwLTE3Ci0gICAgICAgICAgICAgIChyZXNwZWN0aXZlbHkpIG9mIHRoZSBpbW1lZGlhdGUgb3BlcmFuZC4KLQkgICAgICBQPVBDLXJlbGF0aXZlLCBzaWduLWV4dGVuZGVkIHRvIDMyIGJpdHMuCi0JICAgICAgQT1BYnNvbHV0ZSwgemVyby1leHRlbmRlZCB0byAzMiBiaXRzLgotICAgICBlICAgICAgICBDRSBiaXQgKGJpdCAyMykgZm9yIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbi4KLSAgICAgbiAgICAgICAgQ29udHJvbCBmaWVsZCAoYml0cyAxNi0yMikgZm9yIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbi4KLSAgICAgdiAgICAgICAgSW1tZWRpYXRlIG9wZXJhbmQgaW4gYml0cyAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICAgICh1c2VkIGZvciB0cmFwIG51bWJlcnMpLgotICAgICBzICAgICAgICBTQS4gIFNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBudW1iZXIgaW4gYml0cyA4LTE1Ci0gICAgICAgICAgICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgdSAgICAgICAgVUktLWJpdCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgciAgICAgICAgUk5ELS1iaXRzIDQtNiBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGQgICAgICAgIEZELS1iaXRzIDItMyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGYgICAgICAgIEZTLS1iaXRzIDAtMSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIEkJICAgICAgSUQtLWJpdHMgMTYtMTcgb2YgdGhlIGluc3RydWN0aW9uLgotCi0gICAgIEV4dGVuc2lvbnMgZm9yIDI5MDUwOgotCi0gICAgIGQJICAgICAgRk1ULS1iaXRzIDItMyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCByZWFsbHkgbmV3KS4KLSAgICAgZgkgICAgICBBQ04tLWJpdHMgMC0xIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHJlYWxseSBuZXcpLgotICAgICBGCSAgICAgIEZVTkMtLVNwZWNpYWwgZnVuY3Rpb24gaW4gYml0cyAxOC0yMSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIEMJICAgICAgQUNOLS1iaXRzIDE2LTE3IHNwZWNpZnlpbmcgdGhlIGFjY3VtbGF0b3IgcmVnaXN0ZXIuICAqLwotICBjaGFyICphcmdzOwotfTsKLQotI2lmbmRlZiBDT05TVAotI2RlZmluZSBDT05TVAotI2VuZGlmIC8qIENPTlNUICovCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYTI5a19vcGNvZGUgYTI5a19vcGNvZGVzW10gPQotewotCi17ICJhZGQiLCAweDE0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGQiLCAweDE1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRjIiwgMHgxYzAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkYyIsIDB4MWQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZGNzIiwgMHgxODAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkY3MiLCAweDE5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRjdSIsIDB4MWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZGN1IiwgMHgxYjAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkcyIsIDB4MTAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZHMiLCAweDExMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGR1IiwgMHgxMjAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkdSIsIDB4MTMwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFuZCIsIDB4OTAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFuZCIsIDB4OTEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFuZG4iLCAweDljMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhbmRuIiwgMHg5ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiYXNlcSIsIDB4NzAwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZXEiLCAweDcxMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2dlIiwgMHg1YzAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNnZSIsIDB4NWQwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzZ2V1IiwgMHg1ZTAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNnZXUiLCAweDVmMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2d0IiwgMHg1ODAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNndCIsIDB4NTkwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzZ3R1IiwgMHg1YTAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNndHUiLCAweDViMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2xlIiwgMHg1NDAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNsZSIsIDB4NTUwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbGV1IiwgMHg1NjAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNsZXUiLCAweDU3MDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2x0IiwgMHg1MDAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNsdCIsIDB4NTEwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbHR1IiwgMHg1MjAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNsdHUiLCAweDUzMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc25lcSIsIDB4NzIwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbmVxIiwgMHg3MzAwMDAwMCwgInYsYSxpIiB9LAoteyAiY2FsbCIsIDB4YTgwMDAwMDAsICJhLFAiIH0sCi17ICJjYWxsIiwgMHhhOTAwMDAwMCwgImEsQSIgfSwKLXsgImNhbGxpIiwgMHhjODAwMDAwMCwgImEsYiIgfSwKLXsgImNsYXNzIiwgMHhlNjAwMDAwMCwgImMsYSxmIiB9LAoteyAiY2x6IiwgMHgwODAwMDAwMCwgImMsYiIgfSwKLXsgImNseiIsIDB4MDkwMDAwMDAsICJjLGkiIH0sCi17ICJjb25zdCIsIDB4MDMwMDAwMDAsICJhLHgiIH0sCi17ICJjb25zdGgiLCAweDAyMDAwMDAwLCAiYSxoIiB9LAoteyAiY29uc3RoeiIsIDB4MDUwMDAwMDAsICJhLGgiIH0sCi17ICJjb25zdG4iLCAweDAxMDAwMDAwLCAiYSxYIiB9LAoteyAiY29udmVydCIsIDB4ZTQwMDAwMDAsICJjLGEsdSxyLGQsZiIgfSwKLXsgImNwYnl0ZSIsIDB4MmUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwYnl0ZSIsIDB4MmYwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZXEiLCAweDYwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGVxIiwgMHg2MTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BnZSIsIDB4NGMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZ2UiLCAweDRkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGdldSIsIDB4NGUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZ2V1IiwgMHg0ZjAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BndCIsIDB4NDgwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZ3QiLCAweDQ5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGd0dSIsIDB4NGEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZ3R1IiwgMHg0YjAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsZSIsIDB4NDQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbGUiLCAweDQ1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGxldSIsIDB4NDYwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbGV1IiwgMHg0NzAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsdCIsIDB4NDAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbHQiLCAweDQxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGx0dSIsIDB4NDIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbHR1IiwgMHg0MzAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BuZXEiLCAweDYyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcG5lcSIsIDB4NjMwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRhZGQiLCAweGYxMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkZGl2IiwgMHhmNzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGVxIiwgMHhlYjAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGdlIiwgMHhlZjAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGd0IiwgMHhlZDAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2IiwgMHg2YTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2IiwgMHg2YjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZGl2MCIsIDB4NjgwMDAwMDAsICJjLGIiIH0sCi17ICJkaXYwIiwgMHg2OTAwMDAwMCwgImMsaSIgfSwKLXsgImRpdmlkZSIsIDB4ZTEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdmlkdSIsIDB4ZTMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdmwiLCAweDZjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZsIiwgMHg2ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiZGl2cmVtIiwgMHg2ZTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2cmVtIiwgMHg2ZjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZG1hYyIsIDB4ZDkwMDAwMDAsICJGLEMsYSxiIiB9LAoteyAiZG1zbSIsIDB4ZGIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRtdWwiLCAweGY1MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkc3ViIiwgMHhmMzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZW11bGF0ZSIsIDB4ZDcwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImV4Ynl0ZSIsIDB4MGEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImV4Ynl0ZSIsIDB4MGIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImV4aHciLCAweDdjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJleGh3IiwgMHg3ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiZXhod3MiLCAweDdlMDAwMDAwLCAiYyxhIiB9LAoteyAiZXh0cmFjdCIsIDB4N2EwMDAwMDAsICJjLGEsYiIgfSwKLXsgImV4dHJhY3QiLCAweDdiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJmYWRkIiwgMHhmMDAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmRpdiIsIDB4ZjYwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZkbXVsIiwgMHhmOTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmVxIiwgMHhlYTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmdlIiwgMHhlZTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmd0IiwgMHhlYzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZm1hYyIsIDB4ZDgwMDAwMDAsICJGLEMsYSxiIiB9LAoteyAiZm1zbSIsIDB4ZGEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZtdWwiLCAweGY0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmc3ViIiwgMHhmMjAwMDAwMCwgImMsYSxiIiB9LAoteyAiaGFsdCIsIDB4ODkwMDAwMDAsICIiIH0sCi17ICJpbmJ5dGUiLCAweDBjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJpbmJ5dGUiLCAweDBkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJpbmh3IiwgMHg3ODAwMDAwMCwgImMsYSxiIiB9LAoteyAiaW5odyIsIDB4NzkwMDAwMDAsICJjLGEsaSIgfSwKLXsgImludiIsIDB4OWYwMDAwMDAsICJJIiB9LAoteyAiaXJldCIsIDB4ODgwMDAwMDAsICIiIH0sCi17ICJpcmV0aW52IiwgMHg4YzAwMDAwMCwgIkkiIH0sCi17ICJqbXAiLCAweGEwMDAwMDAwLCAiUCIgfSwKLXsgImptcCIsIDB4YTEwMDAwMDAsICJBIiB9LAoteyAiam1wZiIsIDB4YTQwMDAwMDAsICJhLFAiIH0sCi17ICJqbXBmIiwgMHhhNTAwMDAwMCwgImEsQSIgfSwKLXsgImptcGZkZWMiLCAweGI0MDAwMDAwLCAiYSxQIiB9LAoteyAiam1wZmRlYyIsIDB4YjUwMDAwMDAsICJhLEEiIH0sCi17ICJqbXBmaSIsIDB4YzQwMDAwMDAsICJhLGIiIH0sCi17ICJqbXBpIiwgMHhjMDAwMDAwMCwgImIiIH0sCi17ICJqbXB0IiwgMHhhYzAwMDAwMCwgImEsUCIgfSwKLXsgImptcHQiLCAweGFkMDAwMDAwLCAiYSxBIiB9LAoteyAiam1wdGkiLCAweGNjMDAwMDAwLCAiYSxiIiB9LAoteyAibG9hZCIsIDB4MTYwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAibG9hZCIsIDB4MTcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibG9hZGwiLCAweDA2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWRsIiwgMHgwNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJsb2FkbSIsIDB4MzYwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAibG9hZG0iLCAweDM3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgImxvYWRzZXQiLCAweDI2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWRzZXQiLCAweDI3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgIm1mYWNjIiwgMHhlOTAwMDEwMCwgImMsZCxmIiB9LAoteyAibWZzciIsIDB4YzYwMDAwMDAsICJjLHMiIH0sCi17ICJtZnRsYiIsIDB4YjYwMDAwMDAsICJjLGEiIH0sCi17ICJtdGFjYyIsIDB4ZTgwMTAwMDAsICJhLGQsZiIgfSwKLXsgIm10c3IiLCAweGNlMDAwMDAwLCAicyxiIiB9LAoteyAibXRzcmltIiwgMHgwNDAwMDAwMCwgInMseCIgfSwKLXsgIm10dGxiIiwgMHhiZTAwMDAwMCwgImEsYiIgfSwKLXsgIm11bCIsIDB4NjQwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bCIsIDB4NjUwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm11bGwiLCAweDY2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWxsIiwgMHg2NzAwMDAwMCwgImMsYSxpIiB9LAoteyAibXVsdGlwbHUiLCAweGUyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx0aXBseSIsIDB4ZTAwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHRtIiwgMHhkZTAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdG11IiwgMHhkZjAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdSIsIDB4NzQwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHUiLCAweDc1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJuYW5kIiwgMHg5YTAwMDAwMCwgImMsYSxiIiB9LAoteyAibmFuZCIsIDB4OWIwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm5vcCIsIDB4NzA0MDAxMDEsICIiIH0sCi17ICJub3IiLCAweDk4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJub3IiLCAweDk5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJvciIsIDB4OTIwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm9yIiwgMHg5MzAwMDAwMCwgImMsYSxpIiB9LAoteyAib3JuIiwgMHhhYTAwMDAwMCwgImMsYSxiIiB9LAoteyAib3JuIiwgMHhhYjAwMDAwMCwgImMsYSxpIiB9LAotCi0vKiBUaGUgZGVzY3JpcHRpb24gb2YgInNldGlwIiBpbiBDaGFwdGVyIDggKCJpbnN0cnVjdGlvbiBzZXQiKSBvZiB0aGUgdXNlcidzCi0gICBtYW51YWwgY2xhaW1zIHRoYXQgdGhlc2UgYXJlIGFic29sdXRlIHJlZ2lzdGVyIG51bWJlcnMuICBCdXQgc2VjdGlvbgotICAgNy4yLjEgZXhwbGFpbnMgdGhhdCB0aGV5IGFyZSBub3QuICBUaGUgbGF0dGVyIGlzIGNvcnJlY3QsIHNvIHByaW50Ci0gICB0aGVzZSBub3JtYWxseSAoImxyMCIsICJscjUiLCBldGMuKS4gICovCi17ICJzZXRpcCIsIDB4OWUwMDAwMDAsICJjLGEsYiIgfSwKLQoteyAic2xsIiwgMHg4MDAwMDAwMCwgImMsYSxiIiB9LAoteyAic2xsIiwgMHg4MTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3FydCIsIDB4ZTUwMDAwMDAsICJjLGEsZiIgfSwKLXsgInNyYSIsIDB4ODYwMDAwMDAsICJjLGEsYiIgfSwKLXsgInNyYSIsIDB4ODcwMDAwMDAsICJjLGEsaSIgfSwKLXsgInNybCIsIDB4ODIwMDAwMDAsICJjLGEsYiIgfSwKLXsgInNybCIsIDB4ODMwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN0b3JlIiwgMHgxZTAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJzdG9yZSIsIDB4MWYwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAic3RvcmVsIiwgMHgwZTAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJzdG9yZWwiLCAweDBmMDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgInN0b3JlbSIsIDB4M2UwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAic3RvcmVtIiwgMHgzZjAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJzdWIiLCAweDI0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWIiLCAweDI1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJjIiwgMHgyYzAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViYyIsIDB4MmQwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YmNzIiwgMHgyODAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViY3MiLCAweDI5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJjdSIsIDB4MmEwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YmN1IiwgMHgyYjAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViciIsIDB4MzQwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnIiLCAweDM1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJyYyIsIDB4M2MwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJjIiwgMHgzZDAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicmNzIiwgMHgzODAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicmNzIiwgMHgzOTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicmN1IiwgMHgzYTAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicmN1IiwgMHgzYjAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicnMiLCAweDMwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJycyIsIDB4MzEwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJ1IiwgMHgzMjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicnUiLCAweDMzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJzIiwgMHgyMDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicyIsIDB4MjEwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnUiLCAweDIyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJ1IiwgMHgyMzAwMDAwMCwgImMsYSxpIiB9LAoteyAieG5vciIsIDB4OTYwMDAwMDAsICJjLGEsYiIgfSwKLXsgInhub3IiLCAweDk3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJ4b3IiLCAweDk0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJ4b3IiLCAweDk1MDAwMDAwLCAiYyxhLGkiIH0sCi0KLXsgIiIsIDB4MCwgIiIgfQkJLyogRHVtbXkgZW50cnksIG5vdCBpbmNsdWRlZCBpbiBOVU1fT1BDT0RFUy4gIFRoaXMKLQkJCSAgIGxldHMgY29kZSBleGFtaW5lIGVudHJ5IGkrMSB3aXRob3V0IGNoZWNraW5nCi0JCQkgICBpZiB3ZSd2ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLX07Ci0KLUNPTlNUIHVuc2lnbmVkIGludCBudW1fb3Bjb2RlcyA9ICgoKHNpemVvZiBhMjlrX29wY29kZXMpIC8gKHNpemVvZiBhMjlrX29wY29kZXNbMF0pKSAtIDEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYWxwaGEuaCBiL2luY2x1ZGUvb3Bjb2RlL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOGViMDQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKiBhbHBoYS5oIC0tIEhlYWRlciBmaWxlIGZvciBBbHBoYSBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4sCi0gICBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIFBQQyBvcGNvZGUgdGFibGUgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE9QQ09ERV9BTFBIQV9ICi0jZGVmaW5lIE9QQ09ERV9BTFBIQV9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGFscGhhX29wY29kZS4gICovCi0KLXN0cnVjdCBhbHBoYV9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIG1hc2s7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSBwcmltYXJpbHkgdXNlZCB0bwotICAgICBpbmRpY2F0ZSBzcGVjaWZpYyBwcm9jZXNzb3JzIGFuZCBlbnZpcm9ubWVudHMgc3VwcG9ydCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGRlZmluZWQgdmFsdWVzIGFyZSBsaXN0ZWQgYmVsb3cuICovCi0gIHVuc2lnbmVkIGZsYWdzOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbNF07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSBhbHBoYV9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGFscGhhX251bV9vcGNvZGVzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFscGhhX29wY29kZS4gICovCi0KLS8qIENQVSBBdmFpbGFiaWxpdHkgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9CQVNFICAweDAwMDEgIC8qIEJhc2UgYXJjaGl0ZWN0dXJlIC0tIGFsbCBjcHVzLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjQgICAweDAwMDIgIC8qIEVWNCBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjUgICAweDAwMDQgIC8qIEVWNSBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjYgICAweDAwMDggIC8qIEVWNiBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9CV1ggICAweDAxMDAgIC8qIEJ5dGUvd29yZCBleHRlbnNpb24gKGFtYXNrIGJpdCAwKS4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfQ0lYICAgMHgwMjAwICAvKiAiQ291bnQiIGV4dGVuc2lvbiAoYW1hc2sgYml0IDEpLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9NQVggICAweDA0MDAgIC8qIE11bHRpbWVkaWEgZXh0ZW5zaW9uIChhbWFzayBiaXQgOCkuICAqLwotCi0jZGVmaW5lIEFYUF9PUENPREVfTk9QQUwgKH4oQVhQX09QQ09ERV9FVjR8QVhQX09QQ09ERV9FVjV8QVhQX09QQ09ERV9FVjYpKQotCi0vKiBBIG1hY3JvIHRvIGV4dHJhY3QgdGhlIG1ham9yIG9wY29kZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQVhQX09QKGkpCSgoKGkpID4+IDI2KSAmIDB4M0YpCi0KLS8qIFRoZSB0b3RhbCBudW1iZXIgb2YgbWFqb3Igb3Bjb2Rlcy4gKi8KLSNkZWZpbmUgQVhQX05PUFMJMHg0MAotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGFscGhhX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgYWxwaGFfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogVGhlIGRlZmF1bHQgcmVsb2NhdGlvbiB0eXBlIGZvciB0aGlzIG9wZXJhbmQuICAqLwotICBpbnQgZGVmYXVsdF9yZWxvYzsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGZsYWdzOwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkICgqaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBpbnN0cnVjdGlvbiwgaW50IG9wLAotCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uLCBvIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgKi8KLSAgaW50ICgqZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBhbHBoYV9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kIGFscGhhX29wZXJhbmRzW107Ci1leHRlcm4gY29uc3QgaW50IGFscGhhX251bV9vcGVyYW5kczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhbHBoYV9vcGVyYW5kLiAgKi8KLQotLyogTWFzayBmb3Igc2VsZWN0aW5nIHRoZSB0eXBlIGZvciB0eXBlY2hlY2sgcHVycG9zZXMgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfVFlQRUNIRUNLX01BU0sJCQkJCVwKLSAgKEFYUF9PUEVSQU5EX1BBUkVOUyB8IEFYUF9PUEVSQU5EX0NPTU1BIHwgQVhQX09QRVJBTkRfSVIgfAkJXAotICAgQVhQX09QRVJBTkRfRlBSIHwgQVhQX09QRVJBTkRfUkVMQVRJVkUgfCBBWFBfT1BFUkFORF9TSUdORUQgfCAJXAotICAgQVhQX09QRVJBTkRfVU5TSUdORUQpCi0KLS8qIFRoaXMgb3BlcmFuZCBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBpbiB0aGUgYXNzZW1ibGVyIGlucHV0LiAgVGhpcwotICAgaXMgdXNlZCB0byBzdXBwb3J0IGV4dGVuZGVkIG1uZW1vbmljcywgZm9yIHdoaWNoIHR3byBvcGVyYW5kcyBmaWVsZHMKLSAgIGFyZSBpZGVudGljYWwuICBUaGUgYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZSBpbnNlcnQgZnVuY3Rpb24gd2l0aAotICAgYW55IG9wIHZhbHVlLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUgZXh0cmFjdCBmdW5jdGlvbiwKLSAgIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLCBhbmQgY2hlY2sgdGhlIHZhbHVlIHBsYWNlZCBpbiB0aGUgaW52YWxpZAotICAgYXJndW1lbnQuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9GQUtFCTAxCi0KLS8qIFRoZSBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgcHJldmlvdXMgYnkgYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGxvYWQgYW5kIHN0b3JlCi0gICBpbnN0cnVjdGlvbnMgd2hpY2ggd2FudCB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UgIlJhLGRpc3AoUmIpIi4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1BBUkVOUwkwMgotCi0vKiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggUEFSRU5TLCB0aGlzIHN1cHJlc3NlcyB0aGUgc3VwcmVzc2lvbiBvZgotICAgdGhlIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciAiam1wIFJhLChSYiksaGludCIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9DT01NQQkwNAotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYW4gaW50ZWdlciByZWdpc3Rlci4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0lSCQkwMTAKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9GUFIJCTAyMAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1JFTEFUSVZFCTA0MAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1NJR05FRAkwMTAwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyB1bnNpZ25lZCB2YWx1ZXMuICBUaGlzIGV4aXN0cyBwcmltYXJpbHkgc28gdGhhdAotICAgYSBmbGFncyB2YWx1ZSBvZiAwIGNhbiBiZSB0cmVhdGVkIGFzIGVuZC1vZi1hcmd1bWVudHMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9VTlNJR05FRAkwMjAwCi0KLS8qIFN1cHJlc3Mgb3ZlcmZsb3cgZGV0ZWN0aW9uIG9uIHRoaXMgZmllbGQuICBUaGlzIGlzIHVzZWQgZm9yIGhpbnRzLiAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9OT09WRVJGTE9XCTA0MDAKLQotLyogTWFzayBmb3Igb3B0aW9uYWwgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZS4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX09QVElPTkFMX01BU0sgMDcwMDAKLQotLyogVGhpcyBvcGVyYW5kIGRlZmF1bHRzIHRvIHplcm8uICBUaGlzIGlzIHVzZWQgZm9yIGp1bXAgaGludHMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk8gMDEwMDAKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBkZWZhdWx0IHRvIHRoZSBmaXJzdCAocmVhbCkgb3BlcmFuZCBhbmQgaXMgdXNlZAotICAgaW4gY29uanVuY3Rpb24gd2l0aCBBWFBfT1BFUkFORF9PUFRJT05BTC4gIFRoaXMgYWxsb3dzCi0gICAiYW5kICQwLDMsJDAiIHRvIGJlIHdyaXR0ZW4gYXMgImFuZCAkMCwzIiwgZXRjLiAgSSBkb24ndCBsaWtlCi0gICBpdCwgYnV0IGl0J3Mgd2hhdCBERUMgZG9lcy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QgMDIwMDAKLQotLyogU2ltaWxhcmx5LCB0aGlzIG9wZXJhbmQgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIHNlY29uZCAocmVhbCkgb3BlcmFuZC4KLSAgIFRoaXMgYWxsb3dzICJuZWdsICQwIiBpbnN0ZWFkIG9mICJuZWdsICQwLCQwIi4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfU0VDT05EIDA0MDAwCi0KLQwKLS8qIFJlZ2lzdGVyIGNvbW1vbiBuYW1lcyAqLwotCi0jZGVmaW5lIEFYUF9SRUdfVjAJMAotI2RlZmluZSBBWFBfUkVHX1QwCTEKLSNkZWZpbmUgQVhQX1JFR19UMQkyCi0jZGVmaW5lIEFYUF9SRUdfVDIJMwotI2RlZmluZSBBWFBfUkVHX1QzCTQKLSNkZWZpbmUgQVhQX1JFR19UNAk1Ci0jZGVmaW5lIEFYUF9SRUdfVDUJNgotI2RlZmluZSBBWFBfUkVHX1Q2CTcKLSNkZWZpbmUgQVhQX1JFR19UNwk4Ci0jZGVmaW5lIEFYUF9SRUdfUzAJOQotI2RlZmluZSBBWFBfUkVHX1MxCTEwCi0jZGVmaW5lIEFYUF9SRUdfUzIJMTEKLSNkZWZpbmUgQVhQX1JFR19TMwkxMgotI2RlZmluZSBBWFBfUkVHX1M0CTEzCi0jZGVmaW5lIEFYUF9SRUdfUzUJMTQKLSNkZWZpbmUgQVhQX1JFR19GUAkxNQotI2RlZmluZSBBWFBfUkVHX0EwCTE2Ci0jZGVmaW5lIEFYUF9SRUdfQTEJMTcKLSNkZWZpbmUgQVhQX1JFR19BMgkxOAotI2RlZmluZSBBWFBfUkVHX0EzCTE5Ci0jZGVmaW5lIEFYUF9SRUdfQTQJMjAKLSNkZWZpbmUgQVhQX1JFR19BNQkyMQotI2RlZmluZSBBWFBfUkVHX1Q4CTIyCi0jZGVmaW5lIEFYUF9SRUdfVDkJMjMKLSNkZWZpbmUgQVhQX1JFR19UMTAJMjQKLSNkZWZpbmUgQVhQX1JFR19UMTEJMjUKLSNkZWZpbmUgQVhQX1JFR19SQQkyNgotI2RlZmluZSBBWFBfUkVHX1BWCTI3Ci0jZGVmaW5lIEFYUF9SRUdfVDEyCTI3Ci0jZGVmaW5lIEFYUF9SRUdfQVQJMjgKLSNkZWZpbmUgQVhQX1JFR19HUAkyOQotI2RlZmluZSBBWFBfUkVHX1NQCTMwCi0jZGVmaW5lIEFYUF9SRUdfWkVSTwkzMQotCi0jZW5kaWYgLyogT1BDT0RFX0FMUEhBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2FyYy5oIGIvaW5jbHVkZS9vcGNvZGUvYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTBjYTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgYW5kCi10aGUgR05VIEJpbnV0aWxzLgotCi1HQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCUlmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTGlzdCBvZiB0aGUgdmFyaW91cyBjcHUgdHlwZXMuCi0gICBUaGUgdGFibGVzIGN1cnJlbnRseSB1c2UgYml0IG1hc2tzIHRvIHNheSB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBvcgotICAgd2hhdGV2ZXIgaXMgc3VwcG9ydGVkIGJ5IGEgcGFydGljdWxhciBjcHUuICBUaGlzIGxldHMgdXMgaGF2ZSBvbmUgZW50cnkKLSAgIGFwcGx5IHRvIHNldmVyYWwgY3B1cy4KLQotICAgVGhpcyBkdXBsaWNhdGVzIGJmZF9tYWNoX2FyY194eHguICBGb3Igbm93IEkgd2lzaCB0byBpc29sYXRlIHRoaXMgZnJvbSBiZmQKLSAgIGFuZCBiZmQgZnJvbSB0aGlzLiAgQWxzbyBub3RlIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgYml0IHZhbHVlcyBhcyB3ZSB3YW50Ci0gICB0byBhbGxvdyBmb3IgdGhpbmdzIGF2YWlsYWJsZSBvbiBtb3JlIHRoYW4gb25lIEFSQyAoYnV0IG5vdCBuZWNlc3NhcmlseSBhbGwKLSAgIEFSQ3MpLiAgKi8KLQotLyogVGhlIGBiYXNlJyBjcHUgbXVzdCBiZSAwICh0YWJsZSBlbnRyaWVzIGFyZSBvbWl0dGVkIGZvciB0aGUgYmFzZSBjcHUpLgotICAgVGhlIGNwdSB0eXBlIGlzIHRyZWF0ZWQgaW5kZXBlbmRlbnRseSBvZiBlbmRpYW5uZXNzLgotICAgVGhlIGNvbXBsZXRlIGBtYWNoJyBudW1iZXIgaW5jbHVkZXMgZW5kaWFubmVzcy4KLSAgIFRoZXNlIHZhbHVlcyBhcmUgaW50ZXJuYWwgdG8gb3Bjb2Rlcy9iZmQvYmludXRpbHMvZ2FzLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQkFTRSAwCi0jZGVmaW5lIEFSQ19NQUNIX1VOVVNFRDEgMQotI2RlZmluZSBBUkNfTUFDSF9VTlVTRUQyIDIKLSNkZWZpbmUgQVJDX01BQ0hfVU5VU0VENCA0Ci0vKiBBZGRpdGlvbmFsIGNwdSB2YWx1ZXMgY2FuIGJlIGluc2VydGVkIGhlcmUgYW5kIEFSQ19NQUNIX0JJRyBtb3ZlZCBkb3duLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQklHIDgKLQotLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQ1BVX01BU0sgNwotLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlICsgZW5kaWFubmVzcy4gICovCi0jZGVmaW5lIEFSQ19NQUNIX01BU0sgMTUKLQotLyogVHlwZSB0byBkZW5vdGUgYW4gQVJDIGluc3RydWN0aW9uIChhdCBsZWFzdCBhIDMyIGJpdCB1bnNpZ25lZCBpbnQpLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IGFyY19pbnNuOwotCi1zdHJ1Y3QgYXJjX29wY29kZSB7Ci0gIGNoYXIgKnN5bnRheDsJCQkvKiBzeW50YXggb2YgaW5zbiAqLwotICB1bnNpZ25lZCBsb25nIG1hc2ssIHZhbHVlOwkvKiByZWNvZ25pemUgaW5zbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gIGludCBmbGFnczsJCQkvKiB2YXJpb3VzIGZsYWcgYml0cyAqLwotCi0vKiBWYWx1ZXMgZm9yIGBmbGFncycuICAqLwotCi0vKiBSZXR1cm4gQ1BVIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogUmV0dXJuIE1BQ0ggbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi0vKiBGaXJzdCBvcGNvZGUgZmxhZyBiaXQgYXZhaWxhYmxlIGFmdGVyIG1hY2hpbmUgbWFzay4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfRkxBR19TVEFSVCAoKEFSQ19NQUNIX01BU0sgKyAxKSA8PCAwKQotLyogVGhpcyBpbnNuIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9DT05EX0JSQU5DSCAoQVJDX09QQ09ERV9GTEFHX1NUQVJUKQotCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBhc3NlbWJseSBhbmQgZGlzYXNzZW1ibHkuICBFYWNoIGluc24gaXMKLSAgICAgb24gYSBsaXN0IG9mIHJlbGF0ZWQgaW5zbnMgKHNhbWUgZmlyc3QgbGV0dGVyIGZvciBhc3NlbWJseSwgc2FtZSBpbnNuIGNvZGUKLSAgICAgZm9yIGRpc2Fzc2VtYmx5KS4gICovCi0gIHN0cnVjdCBhcmNfb3Bjb2RlICpuZXh0X2FzbTsJLyogTmV4dCBpbnN0cnVjdGlvbiB0byB0cnkgZHVyaW5nIGFzc2VtYmx5LiAgKi8KLSAgc3RydWN0IGFyY19vcGNvZGUgKm5leHRfZGlzOwkvKiBOZXh0IGluc3RydWN0aW9uIHRvIHRyeSBkdXJpbmcgZGlzYXNzZW1ibHkuICAqLwotCi0gIC8qIE1hY3JvcyB0byBjcmVhdGUgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgbGlzdHMuICAqLwotI2RlZmluZSBBUkNfSEFTSF9PUENPREUoc3RyaW5nKSBcCi0gICgoc3RyaW5nKVswXSA+PSAnYScgJiYgKHN0cmluZylbMF0gPD0gJ3onID8gKHN0cmluZylbMF0gLSAnYScgOiAyNikKLSNkZWZpbmUgQVJDX0hBU0hfSUNPREUoaW5zbikgXAotICAoKHVuc2lnbmVkIGludCkgKGluc24pID4+IDI3KQotCi0gIC8qIE1hY3JvcyB0byBhY2Nlc3MgYG5leHRfYXNtJywgYG5leHRfZGlzJyBzbyB1c2VycyBuZWVkbid0IGNhcmUgYWJvdXQgdGhlCi0gICAgIHVuZGVybHlpbmcgbWVjaGFuaXNtLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9ORVhUX0FTTShvcCkgKChvcCktPm5leHRfYXNtKQotI2RlZmluZSBBUkNfT1BDT0RFX05FWFRfRElTKG9wKSAoKG9wKS0+bmV4dF9kaXMpCi19OwotCi1zdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgewotICBjaGFyICpuYW1lOwkJCS8qIGVnOiAiZXEiICovCi0gIHNob3J0IHZhbHVlOwkJCS8qIGVnOiAxICovCi0gIHVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycgKi8KLSAgdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIHZhcmlvdXMgZmxhZyBiaXRzICovCi0KLS8qIFZhbHVlcyBmb3IgYGZsYWdzJy4gICovCi0KLS8qIFJldHVybiBDUFUgbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BWQUxfQ1BVKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9DUFVfTUFTSykKLS8qIFJldHVybiBNQUNIIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QVkFMX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi19OwotCi1zdHJ1Y3QgYXJjX29wZXJhbmQgewotICAvKiBPbmUgb2YgdGhlIGluc24gZm9ybWF0IGNoYXJzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmbXQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kIChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG9yCi0gICAgIHRoZSBtb2RpZmllcidzIGZsYWcgYml0IChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaGlmdDsKLQotICAvKiBWYXJpb3VzIGZsYWcgYml0cy4gICovCi0gIGludCBmbGFnczsKLQotLyogVmFsdWVzIGZvciBgZmxhZ3MnLiAgKi8KLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgc3VmZml4IHRvIHRoZSBvcGNvZGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TVUZGSVggMQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCAyCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9BQlNPTFVURV9CUkFOQ0ggNAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9BRERSRVNTIDgKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgbG9uZyBpbW1lZGlhdGUgdmFsdWUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9MSU1NIDB4MTAKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TSUdORUQgMHgyMAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcywgYnV0IGFsc28gYWNjZXB0cyBhIGZ1bGwgcG9zaXRpdmUKLSAgIHJhbmdlIG9mIHZhbHVlcy4gIFRoYXQgaXMsIGlmIGJpdHMgaXMgMTYsIGl0IHRha2VzIGFueSB2YWx1ZSBmcm9tCi0gICAtMHg4MDAwIHRvIDB4ZmZmZi4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1NJR05PUFQgMHg0MAotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUKLSAgIHB1cnBvc2VzIG9mIG92ZXJmbG93IGNoZWNraW5nIChpLmUuLCB0aGUgbm9ybWFsIG1vc3QgbmVnYXRpdmUKLSAgIG51bWJlciBpcyBkaXNhbGxvd2VkIGFuZCBvbmUgbW9yZSB0aGFuIHRoZSBub3JtYWwgbW9zdCBwb3NpdGl2ZQotICAgbnVtYmVyIGlzIGFsbG93ZWQpLiAgVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgZm9yIGEgc2lnbmVkCi0gICBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfTkVHQVRJVkUgMHg4MAotCi0vKiBUaGlzIG9wZXJhbmQgZG9lc24ndCByZWFsbHkgZXhpc3QuICBUaGUgcHJvZ3JhbSB1c2VzIHRoZXNlIG9wZXJhbmRzCi0gICBpbiBzcGVjaWFsIHdheXMuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9GQUtFIDB4MTAwCi0KLS8qIE1vZGlmaWVyIHZhbHVlcy4gICovCi0vKiBBIGRvdCBpcyByZXF1aXJlZCBiZWZvcmUgYSBzdWZmaXguICBFZzogLmxlICAqLwotI2RlZmluZSBBUkNfTU9EX0RPVCAweDEwMDAKLQotLyogQSBub3JtYWwgcmVnaXN0ZXIgaXMgYWxsb3dlZCAobm90IHVzZWQsIGJ1dCBoZXJlIGZvciBjb21wbGV0ZW5lc3MpLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9SRUcgMHgyMDAwCi0KLS8qIEFuIGF1eGlsaWFyeSByZWdpc3RlciBuYW1lIGlzIGV4cGVjdGVkLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9BVVhSRUcgMHg0MDAwCi0KLS8qIFN1bSBvZiBhbGwgQVJDX01PRF9YWFggYml0cy4gICovCi0jZGVmaW5lIEFSQ19NT0RfQklUUyAweDcwMDAKLQotLyogTm9uLXplcm8gaWYgdGhlIG9wZXJhbmQgdHlwZSBpcyByZWFsbHkgYSBtb2RpZmllci4gICovCi0jZGVmaW5lIEFSQ19NT0RfUChYKSAoKFgpICYgQVJDX01PRF9CSVRTKQotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChwICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OwotICAgICAoSSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIE8gaXMgYSBwb2ludGVyIHRvCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgT1AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKLSAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgotICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZwotICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQuCi0KLSAgICAgUkVHIGlzIG5vbi1OVUxMIHdoZW4gaW5zZXJ0aW5nIGEgcmVnaXN0ZXIgdmFsdWUuICAqLwotCi0gIGFyY19pbnNuICgqaW5zZXJ0KSBQQVJBTVMgKChhcmNfaW5zbiBpbnNuLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kLCBpbnQgbW9kcywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnLCBsb25nIHZhbHVlLAotCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKEkgaXMgdGhlIGluc3RydWN0aW9uLCBPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIE9QCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgotCi0gICAgIElOU04gaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHR3byBgYXJjX2luc24ncy4gIFRoZSBmaXJzdCBlbGVtZW50IGlzCi0gICAgIHRoZSBpbnNuLCB0aGUgc2Vjb25kIGlzIHRoZSBsaW1tIGlmIHByZXNlbnQuCi0KLSAgICAgT3BlcmFuZHMgdGhhdCBoYXZlIGEgcHJpbnRhYmxlIGZvcm0gbGlrZSByZWdpc3RlcnMgYW5kIHN1ZmZpeGVzIGhhdmUKLSAgICAgdGhlaXIgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIHBvaW50ZXIgc3RvcmVkIGluIE9QVkFMLiAgKi8KLQotICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgoYXJjX2luc24gKmluc24sCi0JCQkgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQsCi0JCQkgICBpbnQgbW9kcywgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWwsCi0JCQkgICBpbnQgKmludmFsaWQpKTsKLX07Ci0KLS8qIEJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIGNwdSB3ZSBoYXZlLgotICAgVGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCB0byBhcmNfaW5pdF9vcGNvZGVfdGFibGVzLgotICAgQXQgcHJlc2VudCwgYWxsIHRoZXJlIGlzIGlzIHRoZSBjcHUgdHlwZS4gICovCi0KLS8qIENQVSBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLwotI2RlZmluZSBBUkNfSEFWRV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogTUFDSCBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLwotI2RlZmluZSBBUkNfSEFWRV9NQUNIKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9NQVNLKQotCi0vKiBTcGVjaWFsIHJlZ2lzdGVyIHZhbHVlczogICovCi0jZGVmaW5lIEFSQ19SRUdfU0hJTU1fVVBEQVRFIDYxCi0jZGVmaW5lIEFSQ19SRUdfU0hJTU0gNjMKLSNkZWZpbmUgQVJDX1JFR19MSU1NIDYyCi0KLS8qIE5vbi16ZXJvIGlmIFJFRyBpcyBhIGNvbnN0YW50IG1hcmtlci4gICovCi0jZGVmaW5lIEFSQ19SRUdfQ09OU1RBTlRfUChSRUcpICgoUkVHKSA+PSA2MSkKLQotLyogUG9zaXRpb25zIGFuZCBtYXNrcyBvZiB2YXJpb3VzIGZpZWxkczogICovCi0jZGVmaW5lIEFSQ19TSElGVF9SRUdBIDIxCi0jZGVmaW5lIEFSQ19TSElGVF9SRUdCIDE1Ci0jZGVmaW5lIEFSQ19TSElGVF9SRUdDIDkKLSNkZWZpbmUgQVJDX01BU0tfUkVHIDYzCi0KLS8qIERlbGF5IHNsb3QgdHlwZXMuICAqLwotI2RlZmluZSBBUkNfREVMQVlfTk9ORSAwCS8qIG5vIGRlbGF5IHNsb3QgKi8KLSNkZWZpbmUgQVJDX0RFTEFZX05PUk1BTCAxCS8qIGRlbGF5IHNsb3QgaW4gYm90aCBjYXNlcyAqLwotI2RlZmluZSBBUkNfREVMQVlfSlVNUCAyCS8qIGRlbGF5IHNsb3Qgb25seSBpZiBicmFuY2ggdGFrZW4gKi8KLQotLyogTm9uLXplcm8gaWYgWCB3aWxsIGZpdCBpbiBhIHNpZ25lZCA5IGJpdCBmaWVsZC4gICovCi0jZGVmaW5lIEFSQ19TSElNTV9DT05TVF9QKHgpICgobG9uZykgKHgpID49IC0yNTYgJiYgKGxvbmcpICh4KSA8PSAyNTUpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgYXJjX29wZXJhbmRzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19vcGVyYW5kX2NvdW50OwotZXh0ZXJuIC8qY29uc3QqLyBzdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfb3Bjb2Rlc19jb3VudDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19zdWZmaXhlc19jb3VudDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3JlZ19uYW1lc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50OwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYXJjX29wZXJhbmRfbWFwW107Ci0KLS8qIFV0aWxpdHkgZm5zIGluIGFyYy1vcGMuYy4gICovCi1pbnQgYXJjX2dldF9vcGNvZGVfbWFjaCBQQVJBTVMgKChpbnQsIGludCkpOwotLyogYGFyY19vcGNvZGVfaW5pdF90YWJsZXMnIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBgYXJjX3h4eF9zdXBwb3J0ZWQnLiAgKi8KLXZvaWQgYXJjX29wY29kZV9pbml0X3RhYmxlcyBQQVJBTVMgKChpbnQpKTsKLXZvaWQgYXJjX29wY29kZV9pbml0X2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGFyY19vcGNvZGVfaW5pdF9leHRyYWN0IFBBUkFNUyAoKHZvaWQpKTsKLWNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICphcmNfb3Bjb2RlX2xvb2t1cF9hc20gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqYXJjX29wY29kZV9sb29rdXBfZGlzIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotaW50IGFyY19vcGNvZGVfbGltbV9wIFBBUkFNUyAoKGxvbmcgKikpOwotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICphcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggUEFSQU1TICgoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICp0eXBlLCBpbnQgdmFsdWUpKTsKLWludCBhcmNfb3Bjb2RlX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqKSk7Ci1pbnQgYXJjX29wdmFsX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKikpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYXJtLmggYi9pbmNsdWRlL29wY29kZS9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwODdlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKiBBUk0gb3Bjb2RlIGxpc3QuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotR0RCIGFuZCBHQVMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGFuZCBHQVMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCIG9yIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogdHlwZXMgb2YgaW5zdHJ1Y3Rpb24gKGVuY29kZWQgaW4gYml0cyAyNiBhbmQgMjcgb2YgdGhlIGluc3RydWN0aW9uKSAqLwotCi0jZGVmaW5lIFRZUEVfQVJJVEhNRVRJQwkJMAotI2RlZmluZSBUWVBFX0xEUl9TVFIJCTEKLSNkZWZpbmUgVFlQRV9CTE9DS19CUkFOQ0gJMgotI2RlZmluZSBUWVBFX1NXSQkJMwotCi0vKiBiaXQgMjUgZGVjaWRlcyB3aGV0aGVyIGFuIGluc3RydWN0aW9uIGlzIGEgYmxvY2sgbW92ZSBvciBhIGJyYW5jaCAqLwotI2RlZmluZSBTVUJUWVBFX0JMT0NLCQkwCi0jZGVmaW5lIFNVQlRZUEVfQlJBTkNICQkxCi0KLS8qIGNvZGVzIHRvIGRpc3Rpbmd1aXNoIHRoZSBhcml0aG1ldGljIGluc3RydWN0aW9ucyAqLwotCi0jZGVmaW5lIE9QQ09ERV9BTkQJMAotI2RlZmluZSBPUENPREVfRU9SCTEKLSNkZWZpbmUgT1BDT0RFX1NVQgkyCi0jZGVmaW5lIE9QQ09ERV9SU0IJMwotI2RlZmluZSBPUENPREVfQURECTQKLSNkZWZpbmUgT1BDT0RFX0FEQwk1Ci0jZGVmaW5lIE9QQ09ERV9TQkMJNgotI2RlZmluZSBPUENPREVfUlNDCTcKLSNkZWZpbmUgT1BDT0RFX1RTVAk4Ci0jZGVmaW5lIE9QQ09ERV9URVEJOQotI2RlZmluZSBPUENPREVfQ01QCTEwCi0jZGVmaW5lIE9QQ09ERV9DTU4JMTEKLSNkZWZpbmUgT1BDT0RFX09SUgkxMgotI2RlZmluZSBPUENPREVfTU9WCTEzCi0jZGVmaW5lIE9QQ09ERV9CSUMJMTQKLSNkZWZpbmUgT1BDT0RFX01WTgkxNQotCi0vKiBjb25kaXRpb24gY29kZXMgKi8KLQotI2RlZmluZSBDT05EX0VRCQkwCi0jZGVmaW5lIENPTkRfTkUJCTEKLSNkZWZpbmUgQ09ORF9DUwkJMgotI2RlZmluZSBDT05EX0NDCQkzCi0jZGVmaW5lIENPTkRfTUkJCTQKLSNkZWZpbmUgQ09ORF9QTAkJNQotI2RlZmluZSBDT05EX1ZTCQk2Ci0jZGVmaW5lIENPTkRfVkMJCTcKLSNkZWZpbmUgQ09ORF9ISQkJOAotI2RlZmluZSBDT05EX0xTCQk5Ci0jZGVmaW5lIENPTkRfR0UJCTEwCi0jZGVmaW5lIENPTkRfTFQJCTExCi0jZGVmaW5lIENPTkRfR1QJCTEyCi0jZGVmaW5lIENPTkRfTEUJCTEzCi0jZGVmaW5lIENPTkRfQUwJCTE0Ci0jZGVmaW5lIENPTkRfTlYJCTE1Ci0KLS8qIERlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIGFuIEFSTSBtYWNoaW5lIGluc3RydWN0aW9uICovCi0KLXN0cnVjdCBnZW5lcmljX2ZtdCB7Ci0gICAgdW5zaWduZWQgcmVzdAk6MjU7CS8qIHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIHN1YnR5cGUJOjE7CS8qIHVzZWQgdG8gZGVjaWRlIGJldHdlZW4gYmxvY2sgYW5kIGJyYW5jaCAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qIG9uZSBvZiBUWVBFXyogKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBhcml0aF9mbXQgewotICAgIHVuc2lnbmVkIG9wZXJhbmQyCToxMjsJLyogI25uIG9yIHJuIG9yIHJuIHNoaWZ0ICNtIG9yIHJuIHNoaWZ0IHJtICovCi0gICAgdW5zaWduZWQgZGVzdAk6NDsJLyogcGxhY2Ugd2hlcmUgdGhlIGFuc3dlciBnb2VzICovCi0gICAgdW5zaWduZWQgb3BlcmFuZDEJOjQ7CS8qIGZpcnN0IG9wZXJhbmQgdG8gaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBzZXQJOjE7CS8qID09IDEgbWVhbnMgc2V0IHByb2Nlc3NvciBmbGFncyAqLwotICAgIHVuc2lnbmVkIG9wY29kZQk6NDsJLyogb25lIG9mIE9QQ09ERV8qIGRlZmluZWQgYWJvdmUgKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogb3BlcmFuZDIgaXMgYW4gaW1tZWRpYXRlIHZhbHVlICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9BUklUSE1FVElDICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgbGRyX3N0cl9mbXQgewotICAgIHVuc2lnbmVkIG9mZnNldAk6MTI7CS8qICNubiBvciBybiBvciBybiBzaGlmdCAjbSAqLwotICAgIHVuc2lnbmVkIHJlZwk6NDsJLyogZGVzdGluYXRpb24gZm9yIExEUiwgc291cmNlIGZvciBTVFIgKi8KLSAgICB1bnNpZ25lZCBiYXNlCTo0OwkvKiBiYXNlIHJlZ2lzdGVyICovCi0gICAgdW5zaWduZWQgaXNfbG9hZAk6MTsJLyogPT0gMSBmb3IgTERSICovCi0gICAgdW5zaWduZWQgd3JpdGViYWNrCToxOwkvKiA9PSAxIG1lYW5zIHdyaXRlIGJhY2sgKGJhc2Urb2Zmc2V0KSBpbnRvIGJhc2UgKi8KLSAgICB1bnNpZ25lZCBieXRlCToxOwkvKiA9PSAxIG1lYW5zIGJ5dGUgYWNjZXNzIGVsc2Ugd29yZCAqLwotICAgIHVuc2lnbmVkIHVwCQk6MTsJLyogPT0gMSBtZWFucyBhZGQgb2Zmc2V0IGVsc2Ugc3VidHJhY3QgaXQgKi8KLSAgICB1bnNpZ25lZCBwcmVfaW5kZXgJOjE7CS8qID09IDEgbWVhbnMgW2EsYl0gZm9ybSBlbHNlIFthXSxiIGZvcm0gKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogPT0gMCBtZWFucyBpbW1lZGlhdGUgb2Zmc2V0ICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9MRFJfU1RSICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYmxvY2tfZm10IHsKLSAgICB1bnNpZ25lZCBtYXNrCToxNjsJLyogcmVnaXN0ZXIgbWFzayAqLwotICAgIHVuc2lnbmVkIGJhc2UJOjQ7CS8qIHJlZ2lzdGVyIHVzZWQgYXMgYmFzZSBvZiBtb3ZlICovCi0gICAgdW5zaWduZWQgaXNfbG9hZAk6MTsJLyogPT0gMSBmb3IgTERNICovCi0gICAgdW5zaWduZWQgd3JpdGViYWNrCToxOwkvKiA9PSAxIG1lYW5zIHVwZGF0ZSBiYXNlIGFmdGVyIG1vdmUgKi8KLSAgICB1bnNpZ25lZCBzZXQJOjE7CS8qID09IDEgbWVhbnMgc2V0IGZsYWdzIGluIHBjIGlmIGluY2x1ZGVkIGluIG1hc2sgKi8KLSAgICB1bnNpZ25lZCBpbmNyZW1lbnQJOjE7CS8qID09IDEgbWVhbnMgaW5jcmVtZW50IGJhc2UgcmVnaXN0ZXIgKi8KLSAgICB1bnNpZ25lZCBiZWZvcmUJOjE7CS8qID09IDEgbWVhbnMgaW5jL2RlYyBiZWZvcmUgZWFjaCBtb3ZlICovCi0gICAgdW5zaWduZWQgaXNfYmxvY2sJOjE7CS8qID09IFNVQlRZUEVfQkxPQ0sgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0JMT0NLX0JSQU5DSCAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotc3RydWN0IGJyYW5jaF9mbXQgewotICAgIHVuc2lnbmVkIGRlc3QJOjI0OwkvKiBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoICovCi0gICAgdW5zaWduZWQgbGluawk6MTsJLyogYnJhbmNoIHdpdGggbGluayAoZnVuY3Rpb24gY2FsbCkgKi8KLSAgICB1bnNpZ25lZCBpc19icmFuY2gJOjE7CS8qID09IFNVQlRZUEVfQlJBTkNIICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9CTE9DS19CUkFOQ0ggKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLSNkZWZpbmUgUk9VTkRfTgkJMAotI2RlZmluZSBST1VORF9QCQkxCi0jZGVmaW5lIFJPVU5EX00JCTIKLSNkZWZpbmUgUk9VTkRfWgkJMwotCi0jZGVmaW5lIEZMT0FUMl9NVkYJMAotI2RlZmluZSBGTE9BVDJfTU5GCTEKLSNkZWZpbmUgRkxPQVQyX0FCUwkyCi0jZGVmaW5lIEZMT0FUMl9STkQJMwotI2RlZmluZSBGTE9BVDJfU1FUCTQKLSNkZWZpbmUgRkxPQVQyX0xPRwk1Ci0jZGVmaW5lIEZMT0FUMl9MR04JNgotI2RlZmluZSBGTE9BVDJfRVhQCTcKLSNkZWZpbmUgRkxPQVQyX1NJTgk4Ci0jZGVmaW5lIEZMT0FUMl9DT1MJOQotI2RlZmluZSBGTE9BVDJfVEFOCTEwCi0jZGVmaW5lIEZMT0FUMl9BU04JMTEKLSNkZWZpbmUgRkxPQVQyX0FDUwkxMgotI2RlZmluZSBGTE9BVDJfQVROCTEzCi0KLSNkZWZpbmUgRkxPQVQzX0FERgkwCi0jZGVmaW5lIEZMT0FUM19NVUYJMQotI2RlZmluZSBGTE9BVDNfU1VGCTIKLSNkZWZpbmUgRkxPQVQzX1JTRgkzCi0jZGVmaW5lIEZMT0FUM19EVkYJNAotI2RlZmluZSBGTE9BVDNfUkRGCTUKLSNkZWZpbmUgRkxPQVQzX1BPVwk2Ci0jZGVmaW5lIEZMT0FUM19SUFcJNwotI2RlZmluZSBGTE9BVDNfUk1GCTgKLSNkZWZpbmUgRkxPQVQzX0ZNTAk5Ci0jZGVmaW5lIEZMT0FUM19GRFYJMTAKLSNkZWZpbmUgRkxPQVQzX0ZSRAkxMQotI2RlZmluZSBGTE9BVDNfUE9MCTEyCi0KLXN0cnVjdCBmbG9hdDJfZm10IHsKLSAgICB1bnNpZ25lZCBvcGVyYW5kMgk6MzsJLyogc2Vjb25kIG9wZXJhbmQgKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogPT0gMSBpZiBzZWNvbmQgb3BlcmFuZCBpcyBhIGNvbnN0YW50ICovCi0gICAgdW5zaWduZWQgcGFkMQk6MTsJLyogPT0gMCAqLwotICAgIHVuc2lnbmVkIHJvdW5kaW5nCToyOwkvKiBST1VORF8qICovCi0gICAgdW5zaWduZWQgaXNfZG91YmxlCToxOwkvKiA9PSAxIGlmIHByZWNpc2lvbiBpcyBkb3VibGUgKG9ubHkgaWYgbm90IGV4dGVuZGVkKSAqLwotICAgIHVuc2lnbmVkIHBhZDIJOjQ7CS8qID09IDEgKi8KLSAgICB1bnNpZ25lZCBkZXN0CTozOwkvKiBkZXN0aW5hdGlvbiAqLwotICAgIHVuc2lnbmVkIGlzXzJfb3AJOjE7CS8qID09IDEgaWYgMiBvcGVyYW5kIGlucyAqLwotICAgIHVuc2lnbmVkIG9wZXJhbmQxCTozOwkvKiBmaXJzdCBvcGVyYW5kIChvbmx5IG9mIGlzXzJfb3AgPT0gMCkgKi8KLSAgICB1bnNpZ25lZCBpc19leHRlbmRlZCA6MTsJLyogPT0gMSBpZiBwcmVjaXNpb24gaXMgZXh0ZW5kZWQgKi8KLSAgICB1bnNpZ25lZCBvcGNvZGUJOjQ7CS8qIEZMT0FUMl8qIG9yIEZMT0FUM18qIGRlcGVuZGluZyBvbiBpc18yX29wICovCi0gICAgdW5zaWduZWQgbXVzdF9iZV8yCToyOwkvKiA9PSAyICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9TV0kgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBDT05EXyogKi8KLX07Ci0KLXN0cnVjdCBzd2lfZm10IHsKLSAgICB1bnNpZ25lZCBhcmd1bWVudAk6MjQ7CS8qIGFyZ3VtZW50IHRvIFNXSSAoc3lzY2FsbCBudW1iZXIpICovCi0gICAgdW5zaWduZWQgbXVzdF9iZV8zCToyOwkvKiA9PSAzICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9TV0kgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXVuaW9uIGluc25fZm10IHsKLSAgICBzdHJ1Y3QgZ2VuZXJpY19mbXQJZ2VuZXJpYzsKLSAgICBzdHJ1Y3QgYXJpdGhfZm10CWFyaXRoOwotICAgIHN0cnVjdCBsZHJfc3RyX2ZtdAlsZHJfc3RyOwotICAgIHN0cnVjdCBibG9ja19mbXQJYmxvY2s7Ci0gICAgc3RydWN0IGJyYW5jaF9mbXQJYnJhbmNoOwotICAgIHN0cnVjdCBzd2lfZm10CXN3aTsKLSAgICB1bnNpZ25lZCBsb25nCWluczsKLX07Ci0KLXN0cnVjdCBvcGNvZGUgewotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqYXNzZW1ibGVyOwkJLyogaG93IHRvIGRpc2Fzc2VtYmxlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLS8qIGZvcm1hdCBvZiB0aGUgYXNzZW1ibGVyIHN0cmluZyA6Ci0gICAKLSAgICUlCQkJJQotICAgJTxiaXRmaWVsZD5kCQlwcmludCB0aGUgYml0ZmllbGQgaW4gZGVjaW1hbAotICAgJTxiaXRmaWVsZD54CQlwcmludCB0aGUgYml0ZmllbGQgaW4gaGV4Ci0gICAlPGJpdGZpZWxkPnIJCXByaW50IGFzIGFuIEFSTSByZWdpc3RlcgotICAgJTxiaXRmaWVsZD5mCQlwcmludCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGlmID43IGVsc2UgYW4gZnAgcmVnaXN0ZXIKLSAgICVjCQkJcHJpbnQgY29uZGl0aW9uIGNvZGUgKGFsd2F5cyBiaXRzIDI4LTMxKQotICAgJVAJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gYXJpdGhtZXRpYyBpbnNuCi0gICAlUQkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBsZGYvc3RmIGluc24KLSAgICVSCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgbW9kZQotICAgJTxiaXRudW0+J2MJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgb25lCi0gICAlPGJpdG51bT5gYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyB6ZXJvCi0gICAlPGJpdG51bT4/YWIJCXByaW50IGEgaWYgYml0IGlzIG9uZSBlbHNlIHByaW50IGIKLSAgICVwCQkJcHJpbnQgJ3AnIGlmZiBiaXRzIDEyLTE1IGFyZSAxNQotICAgJW8JCQlwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCi0gICAlYQkJCXByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaW5zdHJ1Y3Rpb24KLSAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCi0gICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgotICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0qLwotCi1zdGF0aWMgc3RydWN0IG9wY29kZSBvcGNvZGVzW10gPSB7Ci0gICAgLyogQVJNIGluc3RydWN0aW9ucyAqLwotICAgIDB4MDAwMDAwOTAsIDB4MGZlMDAwZjAsICJtdWwlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlMC0zciIsCi0gICAgMHgwMDIwMDA5MCwgMHgwZmUwMDBmMCwgIm1sYSUyMCdzICUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIiLAotICAgIDB4MDAwMDAwMDAsIDB4MGRlMDAwMDAsICJhbmQlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwMjAwMDAwLCAweDBkZTAwMDAwLCAiZW9yJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMDQwMDAwMCwgMHgwZGUwMDAwMCwgInN1YiVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDA2MDAwMDAsIDB4MGRlMDAwMDAsICJyc2IlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwODAwMDAwLCAweDBkZTAwMDAwLCAiYWRkJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMGEwMDAwMCwgMHgwZGUwMDAwMCwgImFkYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDBjMDAwMDAsIDB4MGRlMDAwMDAsICJzYmMlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwZTAwMDAwLCAweDBkZTAwMDAwLCAicnNjJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTAwMDAwMCwgMHgwZGUwMDAwMCwgInRzdCVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDEyMDAwMDAsIDB4MGRlMDAwMDAsICJ0ZXElYyVwICUxNi0xOXIsICVvIiwKLSAgICAweDAxNDAwMDAwLCAweDBkZTAwMDAwLCAiY21wJWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTYwMDAwMCwgMHgwZGUwMDAwMCwgImNtbiVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDE4MDAwMDAsIDB4MGRlMDAwMDAsICJvcnIlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAxYTAwMDAwLCAweDBkZTAwMDAwLCAibW92JWMlMjAncyAlMTItMTVyLCAlbyIsCi0gICAgMHgwMWMwMDAwMCwgMHgwZGUwMDAwMCwgImJpYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDFlMDAwMDAsIDB4MGRlMDAwMDAsICJtdm4lYyUyMCdzICUxMi0xNXIsICVvIiwKLSAgICAweDA0MDAwMDAwLCAweDBjMTAwMDAwLCAic3RyJWMlMjInYiAlMTItMTVyLCAlYSIsCi0gICAgMHgwNDEwMDAwMCwgMHgwYzEwMDAwMCwgImxkciVjJTIyJ2IgJTEyLTE1ciwgJWEiLAotICAgIDB4MDgwMDAwMDAsIDB4MGUxMDAwMDAsICJzdG0lYyUyMz9pZCUyND9iYSAlMTYtMTlyJTIyYCEsICVtIiwKLSAgICAweDA4MTAwMDAwLCAweDBlMTAwMDAwLCAibGRtJWMlMjM/aWQlMjQ/YmEgJTE2LTE5ciUyMmAhLCAlbSUyMideIiwKLSAgICAweDBhMDAwMDAwLCAweDBlMDAwMDAwLCAiYiVjJTI0J2wgJWIiLAotICAgIDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsICJzd2klYyAlMC0yM3giLAotICAgIC8qIEZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIDB4MGUwMDAxMDAsIDB4MGZmMDhmMTAsICJhZGYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUxMDAxMDAsIDB4MGZmMDhmMTAsICJtdWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUyMDAxMDAsIDB4MGZmMDhmMTAsICJzdWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUzMDAxMDAsIDB4MGZmMDhmMTAsICJyc2YlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU0MDAxMDAsIDB4MGZmMDhmMTAsICJkdmYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU1MDAxMDAsIDB4MGZmMDhmMTAsICJyZGYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU2MDAxMDAsIDB4MGZmMDhmMTAsICJwb3clYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU3MDAxMDAsIDB4MGZmMDhmMTAsICJycHclYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU4MDAxMDAsIDB4MGZmMDhmMTAsICJybWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU5MDAxMDAsIDB4MGZmMDhmMTAsICJmbWwlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVhMDAxMDAsIDB4MGZmMDhmMTAsICJmZHYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGViMDAxMDAsIDB4MGZmMDhmMTAsICJmcmQlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVjMDAxMDAsIDB4MGZmMDhmMTAsICJwb2wlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUwMDgxMDAsIDB4MGZmMDhmMTAsICJtdmYlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUxMDgxMDAsIDB4MGZmMDhmMTAsICJtbmYlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUyMDgxMDAsIDB4MGZmMDhmMTAsICJhYnMlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUzMDgxMDAsIDB4MGZmMDhmMTAsICJybmQlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU0MDgxMDAsIDB4MGZmMDhmMTAsICJzcXQlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU1MDgxMDAsIDB4MGZmMDhmMTAsICJsb2clYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU2MDgxMDAsIDB4MGZmMDhmMTAsICJsZ24lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU3MDgxMDAsIDB4MGZmMDhmMTAsICJleHAlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU4MDgxMDAsIDB4MGZmMDhmMTAsICJzaW4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU5MDgxMDAsIDB4MGZmMDhmMTAsICJjb3MlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVhMDgxMDAsIDB4MGZmMDhmMTAsICJ0YW4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGViMDgxMDAsIDB4MGZmMDhmMTAsICJhc24lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVjMDgxMDAsIDB4MGZmMDhmMTAsICJhY3MlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVkMDgxMDAsIDB4MGZmMDhmMTAsICJhdG4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUwMDAxMTAsIDB4MGZmMDBmMWYsICJmbHQlYyVQJVIgJTE2LTE4ZiwgJTEyLTE1ciIsCi0gICAgMHgwZTEwMDExMCwgMHgwZmZmMGY5OCwgImZpeCVjJVIgJTEyLTE1ciwgJTAtMmYiLAotICAgIDB4MGUyMDAxMTAsIDB4MGZmZjBmZmYsICJ3ZnMlYyAlMTItMTVyIiwKLSAgICAweDBlMzAwMTEwLCAweDBmZmYwZmZmLCAicmZzJWMgJTEyLTE1ciIsCi0gICAgMHgwZTQwMDExMCwgMHgwZmZmMGZmZiwgIndmYyVjICUxMi0xNXIiLAotICAgIDB4MGU1MDAxMTAsIDB4MGZmZjBmZmYsICJyZmMlYyAlMTItMTVyIiwKLSAgICAweDBlOTBmMTEwLCAweDBmZjhmZmYwLCAiY21mJWMgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGViMGYxMTAsIDB4MGZmOGZmZjAsICJjbmYlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWQwZjExMCwgMHgwZmY4ZmZmMCwgImNtZmUlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWYwZjExMCwgMHgwZmY4ZmZmMCwgImNuZmUlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwYzAwMDEwMCwgMHgwZTEwMGYwMCwgInN0ZiVjJVEgJTEyLTE0ZiwgJUEiLAotICAgIDB4MGMxMDAxMDAsIDB4MGUxMDBmMDAsICJsZGYlYyVRICUxMi0xNGYsICVBIiwKLSAgICAvKiBHZW5lcmljIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIDB4MGUwMDAwMDAsIDB4MGYwMDAwMTAsICJjZHAlYyAlOC0xMWQsICUyMC0yM2QsIGNyJTEyLTE1ZCwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9IiwKLSAgICAweDBlMDAwMDEwLCAweDBmMTAwMDEwLCAibXJjJWMgJTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0iLAotICAgIDB4MGUxMDAwMTAsIDB4MGYxMDAwMTAsICJtY3IlYyAlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSIsCi0gICAgMHgwYzAwMDAwMCwgMHgwZTEwMDAwMCwgInN0YyVjJTIyYGwgJTgtMTFkLCBjciUxMi0xNWQsICVBIiwKLSAgICAweDBjMTAwMDAwLCAweDBlMTAwMDAwLCAibGRjJWMlMjJgbCAlOC0xMWQsIGNyJTEyLTE1ZCwgJUEiLAotICAgIC8qIHRoZSByZXN0ICovCi0gICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgiLAotfTsKLSNkZWZpbmUgTl9PUENPREVTCShzaXplb2Ygb3Bjb2RlcyAvIHNpemVvZiBvcGNvZGVzWzBdKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvY2dlbi5oIGIvaW5jbHVkZS9vcGNvZGUvY2dlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU0MmEzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2NnZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzODAgKzAsMCBAQAotLyogSGVhZGVyIGZpbGUgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIsIGFuZCB0aGUgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIENHRU5fSAotI2RlZmluZSBDR0VOX0gKLQotLyogPz8/IFRoaXMgZmlsZSByZXF1aXJlcyBiZmQuaCBidXQgb25seSB0byBnZXQgYmZkX3ZtYS4KLSAgIFNlZW1zIGxpa2UgYW4gYXdmdWwgbG90IHRvIHJlcXVpcmUganVzdCB0byBnZXQgc3VjaCBhIGZ1bmRhbWVudGFsIHR5cGUuCi0gICBQZXJoYXBzIHRoZSBkZWZpbml0aW9uIG9mIGJmZF92bWEgY2FuIGJlIG1vdmVkIG91dHNpZGUgb2YgYmZkLmguCi0gICBPciBwZXJoYXBzIG9uZSBjb3VsZCBkdXBsaWNhdGUgaXRzIGRlZmluaXRpb24gaW4gYW5vdGhlciBmaWxlLgotICAgVW50aWwgc3VjaCB0aW1lLCB0aGlzIGZpbGUgY29uZGl0aW9uYWxseSBjb21waWxlcyBkZWZpbml0aW9ucyB0aGF0IHJlcXVpcmUKLSAgIGJmZF92bWEgdXNpbmcgQkZEX1ZFUlNJT04uICAqLwotCi0vKiBFbnVtcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQuCi0gICBBbGxvdyB0aGVtIHRvIGJlIHVzZWQgaW4gc3RydWN0IGRlZmluaXRpb25zLCBldmVuIHRob3VnaCB0aGUgZW51bSBtdXN0Ci0gICBiZSBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgIElmIENHRU5fQVJDSCBpc24ndCBkZWZpbmVkLCB0aGlzIGZpbGUgaXMgYmVpbmcgaW5jbHVkZWQgYnkgc29tZXRoaW5nIG90aGVyCi0gICB0aGFuIDxhcmNoPi1kZXNjLmguICAqLwotCi0vKiBQcmVwZW5kIHRoZSBhcmNoIG5hbWUsIGRlZmluZWQgaW4gPGFyY2g+LWRlc2MuaCwgYW5kIF9jZ2VuXyB0byBzeW1ib2wgUy4KLSAgIFRoZSBsYWNrIG9mIHNwYWNlcyBpbiB0aGUgYXJnIGxpc3QgaXMgaW1wb3J0YW50IGZvciBub24tc3RkYyBzeXN0ZW1zLgotICAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IDxhcmNoPi1kZXNjLmguCi0gICBJdCBjYW4gYmUgaW5jbHVkZWQgaW5kZXBlbmRlbnRseSBvZiA8YXJjaD4tZGVzYy5oLCBpbiB3aGljaCBjYXNlIHRoZSBhcmNoCi0gICBkZXBlbmRlbnQgcG9ydGlvbnMgd2lsbCBiZSBkZWNsYXJlZCBhcyAidW5rbm93bl9jZ2VuX2ZvbyIuICAqLwotCi0jaWZuZGVmIENHRU5fU1lNCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKHVua25vd24sX2NnZW5fLHMpCi0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdGF0aWMgKHVuY2hhbmdpbmcpIHBpZWNlcyBhbmQgYXMgbXVjaCBvdGhlciBzdHVmZgotICAgYXMgd2UgY2FuIHJlYXNvbmFibHkgcHV0IGhlcmUuICBJdCdzIGdlbmVyYWxseSBjbGVhbmVyIHRvIHB1dCBzdHVmZiBoZXJlCi0gICByYXRoZXIgdGhhbiBoYXZpbmcgaXQgbWFjaGluZSBnZW5lcmF0ZWQgaWYgcG9zc2libGUuICAqLwotCi0vKiBUaGUgYXNzZW1ibGVyIHN5bnRheCBpcyBtYWRlIHVwIG9mIGV4cHJlc3Npb25zIChkdWguLi4pLgotICAgQXQgdGhlIGxvd2VzdCBsZXZlbCB0aGUgdmFsdWVzIGFyZSBtbmVtb25pY3MsIHJlZ2lzdGVyIG5hbWVzLCBudW1iZXJzLCBldGMuCi0gICBBYm92ZSB0aGF0IGFyZSBzdWJleHByZXNzaW9ucywgaWYgYW55IChhbiBleGFtcGxlIG1pZ2h0IGJlIHRoZQotICAgImVmZmVjdGl2ZSBhZGRyZXNzIiBpbiBtNjhrIGNwdXMpLiAgU3ViZXhwcmVzc2lvbnMgYXJlIHdpcC4KLSAgIEF0IHRoZSBzZWNvbmQgaGlnaGVzdCBsZXZlbCBhcmUgdGhlIGluc25zIHRoZW1zZWx2ZXMuICBBYm92ZSB0aGF0IGFyZQotICAgcHNldWRvLWluc25zLCBzeW50aGV0aWMgaW5zbnMsIGFuZCBtYWNyb3MsIGlmIGFueS4gICovCi0MCi0vKiBMb3RzIG9mIGNwdSdzIGhhdmUgYSBmaXhlZCBpbnNuIHNpemUsIG9yIG9uZSB3aGljaCByYXJlbHkgY2hhbmdlcywKLSAgIGFuZCBpdCdzIGdlbmVyYWxseSBlYXNpZXIgdG8gaGFuZGxlIHRoZXNlIGJ5IHRyZWF0aW5nIHRoZSBpbnNuIGFzIGFuCi0gICBpbnRlZ2VyIHR5cGUsIHJhdGhlciB0aGFuIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuICBTbyB3ZSBhbGxvdyB0YXJnZXRzCi0gICB0byBjb250cm9sIHRoaXMuICBXaGVuIGFuIGludGVnZXIgdHlwZSB0aGUgdmFsdWUgaXMgaW4gaG9zdCBieXRlIG9yZGVyLAotICAgd2hlbiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRoZSB2YWx1ZSBpcyBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IENHRU5fSU5TTl9JTlQ7Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi10eXBlZGVmIENHRU5fSU5TTl9JTlQgQ0dFTl9JTlNOX0JZVEVTOwotdHlwZWRlZiBDR0VOX0lOU05fSU5UICpDR0VOX0lOU05fQllURVNfUFRSOwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqQ0dFTl9JTlNOX0JZVEVTOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICpDR0VOX0lOU05fQllURVNfUFRSOwotI2VuZGlmCi0KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBDR0VOX0lOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBDR0VOX0lOTElORQotI2VuZGlmCi0KLWVudW0gY2dlbl9lbmRpYW4KLXsKLSAgQ0dFTl9FTkRJQU5fVU5LTk9XTiwKLSAgQ0dFTl9FTkRJQU5fTElUVExFLAotICBDR0VOX0VORElBTl9CSUcKLX07Ci0KLS8qIEZvcndhcmQgZGVjbC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5faW5zbiBDR0VOX0lOU047Ci0KLS8qIE9wYXF1ZSBwb2ludGVyIHZlcnNpb24gZm9yIHVzZSBieSBleHRlcm5hbCB3b3JsZC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fY3B1X2Rlc2MgKkNHRU5fQ1BVX0RFU0M7Ci0MCi0vKiBBdHRyaWJ1dGVzLgotICAgQXR0cmlidXRlcyBhcmUgdXNlZCB0byBkZXNjcmliZSB2YXJpb3VzIHJhbmRvbSB0aGluZ3MgYXNzb2NpYXRlZCB3aXRoCi0gICBhbiBvYmplY3QgKGlmaWVsZCwgaGFyZHdhcmUsIG9wZXJhbmQsIGluc24sIHdoYXRldmVyKSBhbmQgYXJlIHNwZWNpZmllZAotICAgYXMgbmFtZS92YWx1ZSBwYWlycy4KLSAgIEludGVnZXIgYXR0cmlidXRlcyBjb21wdXRlZCBhdCBjb21waWxlIHRpbWUgYXJlIGN1cnJlbnRseSBhbGwgdGhhdCdzCi0gICBzdXBwb3J0ZWQsIHRob3VnaCBhZGRpbmcgc3RyaW5nIGF0dHJpYnV0ZXMgYW5kIHJ1bi10aW1lIGNvbXB1dGF0aW9uIGlzCi0gICBzdHJhaWdodGZvcndhcmQuICBJbnRlZ2VyIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGFsd2F5cyBob3N0IGludCdzCi0gICAoc2lnbmVkIG9yIHVuc2lnbmVkKS4gIEZvciBwb3J0YWJpbGl0eSwgdGhpcyBtZWFucyAzMiBiaXRzLgotICAgSW50ZWdlciBhdHRyaWJ1dGVzIGFyZSBmdXJ0aGVyIGNhdGVnb3JpemVkIGFzIGJvb2xlYW4sIGJpdHNldCwgaW50ZWdlciwKLSAgIGFuZCBlbnVtIHR5cGVzLiAgQm9vbGVhbiBhdHRyaWJ1dGVzIGFwcGVhciBmcmVxdWVudGx5IGVub3VnaCB0aGF0IHRoZXkncmUKLSAgIHJlY29yZGVkIGluIG9uZSBob3N0IGludC4gIFRoaXMgbGltaXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBib29sZWFuCi0gICBhdHRyaWJ1dGVzIHRvIDMyLCB0aG91Z2ggdGhhdCdzIGEgKmxvdCogb2YgYXR0cmlidXRlcy4gICovCi0KLS8qIFR5cGUgb2YgYXR0cmlidXRlIHZhbHVlcy4gICovCi0KLXR5cGVkZWYgaW50IENHRU5fQVRUUl9WQUxVRV9UWVBFOwotCi0vKiBTdHJ1Y3QgdG8gcmVjb3JkIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEJvb2xlYW4gYXR0cmlidXRlcy4gICovCi0gIHVuc2lnbmVkIGludCBib29sOwotICAvKiBOb24tYm9vbGVhbiBpbnRlZ2VyIGF0dHJpYnV0ZXMuICAqLwotICBDR0VOX0FUVFJfVkFMVUVfVFlQRSBub25ib29sWzFdOwotfSBDR0VOX0FUVFI7Ci0KLS8qIERlZmluZSBhIHN0cnVjdHVyZSBtZW1iZXIgZm9yIGF0dHJpYnV0ZXMgd2l0aCBOIG5vbi1ib29sZWFuIGVudHJpZXMuCi0gICBUaGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBub24tYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgVGhlcmUgaXMgYSBtYXhpbXVtIG9mIDMyIGJvb2xlYW4gYXR0cmlidXRlcyAoc2luY2UgdGhleSBhcmUgYWxsIHJlY29yZGVkCi0gICBpbiBvbmUgaG9zdCBpbnQpLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfVFlQRShuKSBcCi1zdHJ1Y3QgeyB1bnNpZ25lZCBpbnQgYm9vbDsgXAotCSBDR0VOX0FUVFJfVkFMVUVfVFlQRSBub25ib29sWyhuKSA/IChuKSA6IDFdOyB9Ci0KLS8qIFJldHVybiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfQk9PTFMoYSkgKChhKS0+Ym9vbCkKLQotLyogTm9uLWJvb2xlYW4gYXR0cmlidXRlIG51bWJlcnMgYXJlIG9mZnNldCBieSB0aGlzIG11Y2guICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9OQk9PTF9PRkZTRVQgMzIKLQotLyogR2l2ZW4gYSBib29sZWFuIGF0dHJpYnV0ZSBudW1iZXIsIHJldHVybiBpdHMgbWFzay4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX01BU0soYXR0cikgKDEgPDwgKGF0dHIpKQotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGJvb2xlYW4gYXR0cmlidXRlIEFUVFIgaW4gQVRUUlMuICAqLwotCi0jZGVmaW5lIENHRU5fQk9PTF9BVFRSKGF0dHJzLCBhdHRyKSAoKENHRU5fQVRUUl9NQVNLIChhdHRyKSAmIChhdHRycykpICE9IDApCi0KLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBBVFRSX1RBQkxFIGZvciBPQkouCi0gICBPQkogaXMgYSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgdGhhdCBoYXMgdGhlIGF0dHJpYnV0ZXMKLSAgICg/Pz8gbm90IHVzZWQgYXQgcHJlc2VudCBidXQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBwdXJwb3NlcyAtIGV2ZW50dWFsbHkKLSAgIHRoZSBnb2FsIGlzIHRvIGFsbG93IHJlY29yZGluZyBhdHRyaWJ1dGVzIGluIHNvdXJjZSBmb3JtIGFuZCBjb21wdXRpbmcKLSAgIHRoZW0gbGF6aWx5IGF0IHJ1bnRpbWUsIG5vdCBzdXJlIG9mIHRoZSBkZXRhaWxzIHlldCkuICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9WQUxVRShvYmosIGF0dHJfdGFibGUsIGF0dHIpIFwKLSgodW5zaWduZWQgaW50KSAoYXR0cikgPCBDR0VOX0FUVFJfTkJPT0xfT0ZGU0VUIFwKLSA/ICgoQ0dFTl9BVFRSX0JPT0xTIChhdHRyX3RhYmxlKSAmIENHRU5fQVRUUl9NQVNLIChhdHRyKSkgIT0gMCkgXAotIDogKChhdHRyX3RhYmxlKS0+bm9uYm9vbFsoYXR0cikgLSBDR0VOX0FUVFJfTkJPT0xfT0ZGU0VUXSkpCi0KLS8qIEF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHRhYmxlcy4KLSAgIFRoZXNlIGFyZSB1c2VkIHRvIGFzc2lzdCBwYXJzaW5nIG9mIGRlc2NyaXB0aW9ucyBhdCBydW4tdGltZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lOwotICBDR0VOX0FUVFJfVkFMVUVfVFlQRSB2YWx1ZTsKLX0gQ0dFTl9BVFRSX0VOVFJZOwotCi0vKiBGb3IgZWFjaCBkb21haW4gKGlmbGQsaHcsb3BlcmFuZCxpbnNuKSwgbGlzdCBvZiBhdHRyaWJ1dGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqIG5hbWU7Ci0gIGNvbnN0IENHRU5fQVRUUl9FTlRSWSAqIGRmYXVsdDsKLSAgY29uc3QgQ0dFTl9BVFRSX0VOVFJZICogdmFsczsKLX0gQ0dFTl9BVFRSX1RBQkxFOwotDAotLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIERlZmF1bHQgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHdoZW4gaXQgZW5jb3VudGVycyBhbiB1bmtub3duIGluc24uICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogQmFzZSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4KLSAgICAgRm9yIG5vbi1MSVcgY3B1cyB0aGlzIGlzIGdlbmVyYWxseSB0aGUgbGVuZ3RoIG9mIHRoZSBzbWFsbGVzdCBpbnNuLgotICAgICBGb3IgTElXIGNwdXMgaXRzIHdpcCAod29yay1pbi1wcm9ncmVzcykuICBGb3IgdGhlIG0zMnIgaXRzIDMyLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2VfaW5zbl9iaXRzaXplOwotCi0gIC8qIE1pbmltdW0vbWF4aW11bSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4gICovCi0gIHVuc2lnbmVkIGludCBtaW5faW5zbl9iaXRzaXplOwotICB1bnNpZ25lZCBpbnQgbWF4X2luc25fYml0c2l6ZTsKLX0gQ0dFTl9JU0E7Ci0KLS8qIE1hY2hpbmUgdmFyaWFudHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBhcmd1bWVudCB0byBiZmRfYXJjaF9pbmZvLT5zY2FuLiAgKi8KLSAgY29uc3QgY2hhciAqYmZkX25hbWU7Ci0gIC8qIG9uZSBvZiBlbnVtIG1hY2hfYXR0ciAqLwotICBpbnQgbnVtOwotfSBDR0VOX01BQ0g7Ci0MCi0vKiBQYXJzZSByZXN1bHQgKGFsc28gZXh0cmFjdGlvbiByZXN1bHQpLgotCi0gICBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgYW4gaW5zbiBpcyBzdG9yZWQgaGVyZS4KLSAgIFRvIGdlbmVyYXRlIHRoZSBhY3R1YWwgaW5zbiwgdGhpcyBpcyBwYXNzZWQgdG8gdGhlIGluc2VydCBoYW5kbGVyLgotICAgV2hlbiBwcmludGluZyBhbiBpbnNuLCB0aGUgcmVzdWx0IG9mIGV4dHJhY3Rpb24gaXMgc3RvcmVkIGhlcmUuCi0gICBUbyBwcmludCB0aGUgaW5zbiwgdGhpcyBpcyBwYXNzZWQgdG8gdGhlIHByaW50IGhhbmRsZXIuCi0KLSAgIEl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkIHNvIHdlIGRvbid0IGRlZmluZSBpdCBoZXJlLAotICAgYnV0IHdlIGRvIG5lZWQgYSBmb3J3YXJkIGRlY2wgZm9yIHRoZSBoYW5kbGVyIGZucy4KLQotICAgVGhlcmUgaXMgb25lIG1lbWJlciBmb3IgZWFjaCBwb3NzaWJsZSBmaWVsZCBpbiB0aGUgaW5zbi4KLSAgIFRoZSB0eXBlIGRlcGVuZHMgb24gdGhlIGZpZWxkLgotICAgQWxzbyByZWNvcmRlZCBoZXJlIGlzIHRoZSBjb21wdXRlZCBsZW5ndGggb2YgdGhlIGluc24gZm9yIGFyY2hpdGVjdHVyZXMKLSAgIHdoZXJlIGl0IHZhcmllcy4KLSovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fZmllbGRzIENHRU5fRklFTERTOwotCi0vKiBUb3RhbCBsZW5ndGggb2YgdGhlIGluc24sIGFzIHJlY29yZGVkIGluIHRoZSBgZmllbGRzJyBzdHJ1Y3QuICAqLwotLyogPz8/IFRoZSBmaWVsZCBpbnNlcnQgaGFuZGxlciBoYXMgbG90cyBvZiBvcHBvcnR1bml0aWVzIGZvciBvcHRpbWl6YXRpb24KLSAgIGlmIGl0IGV2ZXIgZ2V0cyBpbmxpbmVkLiAgT24gYXJjaGl0ZWN0dXJlcyB3aGVyZSBpbnNucyBhbGwgaGF2ZSB0aGUgc2FtZQotICAgc2l6ZSwgbWF5IHdpc2ggdG8gZGV0ZWN0IHRoYXQgYW5kIG1ha2UgdGhpcyBtYWNybyBhIGNvbnN0YW50IC0gdG8gYWxsb3cKLSAgIGZ1cnRoZXIgb3B0aW1pemF0aW9ucy4gICovCi0KLSNkZWZpbmUgQ0dFTl9GSUVMRFNfQklUU0laRShmaWVsZHMpICgoZmllbGRzKS0+bGVuZ3RoKQotDAotLyogRXh0cmFjdGlvbiBzdXBwb3J0IGZvciB2YXJpYWJsZSBsZW5ndGggaW5zbiBzZXRzLiAgKi8KLQotLyogV2hlbiBkaXNhc3NlbWJsaW5nIHdlIGRvbid0IGtub3cgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGF0IHRoZSBzdGFydC4KLSAgIFNvIHRoZSBmaXJzdCBDR0VOX0JBU0VfSU5TTl9TSVpFIGJ5dGVzIGFyZSByZWFkIGF0IHRoZSBzdGFydCBhbmQgdGhlIHJlc3QKLSAgIGFyZSByZWFkIHdoZW4gbmVlZGVkLiAgVGhpcyBzdHJ1Y3QgY29udHJvbHMgdGhpcy4gIEl0IGlzIGJhc2ljYWxseSB0aGUKLSAgIGRpc2Fzc2VtYmxlX2luZm8gc3R1ZmYsIGV4Y2VwdCB0aGF0IHdlIHByb3ZpZGUgYSBjYWNoZSBmb3IgdmFsdWVzIGFscmVhZHkKLSAgIHJlYWQgKHNpbmNlIGJ5dGVzIGNhbiB0eXBpY2FsbHkgYmUgcmVhZCBzZXZlcmFsIHRpbWVzIHRvIGZldGNoIG11bHRpcGxlCi0gICBvcGVyYW5kcyB0aGF0IG1heSBiZSBpbiB0aGVtKSwgYW5kIHRoYXQgZXh0cmFjdGlvbiBvZiBmaWVsZHMgaXMgbmVlZGVkCi0gICBpbiBjb250ZXh0cyBvdGhlciB0aGFuIGRpc2Fzc2VtYmx5LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBBIHBvaW50ZXIgdG8gdGhlIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0LgotICAgICBXZSBkb24ndCByZXF1aXJlIGRpcy1hc20uaCBzbyB3ZSB1c2UgUFRSIGZvciB0aGUgdHlwZSBoZXJlLgotICAgICBJZiBOVUxMLCBCWVRFUyBpcyBmdWxsIG9mIHZhbGlkIGRhdGEgKFZBTElEID09IC0xKS4gICovCi0gIFBUUiBkaXNfaW5mbzsKLSAgLyogUG9pbnRzIHRvIGEgd29ya2luZyBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplLiAgKi8KLSAgdW5zaWduZWQgY2hhciAqaW5zbl9ieXRlczsKLSAgLyogTWFzayBvZiBieXRlcyB0aGF0IGFyZSB2YWxpZCBpbiBJTlNOX0JZVEVTLiAgKi8KLSAgdW5zaWduZWQgaW50IHZhbGlkOwotfSBDR0VOX0VYVFJBQ1RfSU5GTzsKLQwKLS8qIEFzc29jaWF0ZWQgd2l0aCBlYWNoIGluc24gb3IgZXhwcmVzc2lvbiBpcyBhIHNldCBvZiAiaGFuZGxlcnMiIGZvcgotICAgcGVyZm9ybWluZyBvcGVyYXRpb25zIGxpa2UgcGFyc2luZywgcHJpbnRpbmcsIGV0Yy4gIFRoZXNlIHJlcXVpcmUgYSBiZmRfdm1hCi0gICB2YWx1ZSB0byBiZSBwYXNzZWQgYXJvdW5kIGJ1dCB3ZSBkb24ndCB3YW50IGFsbCBhcHBsaWNhdGlvbnMgdG8gbmVlZCBiZmQuaC4KLSAgIFNvIHRoaXMgc3R1ZmYgaXMgb25seSBwcm92aWRlZCBpZiBiZmQuaCBoYXMgYmVlbiBpbmNsdWRlZC4gICovCi0KLS8qIFBhcnNlIGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwYXJzZWQuCi0gICBTVFJQIGlzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIHRleHQgYmVpbmcgcGFyc2VkLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdCBpbiB3aGljaCB0aGUgcmVzdWx0cyBhcmUgcGxhY2VkLgotICAgSWYgdGhlIGV4cHJlc3Npb24gaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgKlNUUlAgaXMgdXBkYXRlZC4KLSAgIElmIG5vdCBpdCBpcyBsZWZ0IGFsb25lLgotICAgVGhlIHJlc3VsdCBpcyBOVUxMIGlmIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgbWVzc2FnZS4gICovCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9wYXJzZV9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBjb25zdCBjaGFyICoqc3RycF8sIENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0KLS8qIEluc2VydCBoYW5kbGVyLgotICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcGFyc2VkLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdCBmcm9tIHdoaWNoIHRoZSB2YWx1ZXMKLSAgIGFyZSBmZXRjaGVkLgotICAgSU5TTlAgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIGluIHdoaWNoIHRvIHBsYWNlIHRoZSBpbnNuLgotICAgUEMgaXMgdGhlIHBjIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLSNpZmRlZiBCRkRfVkVSU0lPTgotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5faW5zZXJ0X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBDR0VOX0lOU05fQllURVNfUFRSIGluc25wXywKLQkgICAgICBiZmRfdm1hIHBjXykpOwotI2Vsc2UKLXR5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX2luc2VydF9mbikgKCk7Ci0jZW5kaWYKLQotLyogRXh0cmFjdCBoYW5kbGVyLgotICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcGFyc2VkLgotICAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgY29udHJvbGxpbmcgZXh0cmFjdGlvbgotICAgKG9ubHkgdXNlZCBmb3IgdmFyaWFibGUgbGVuZ3RoIGluc25zKS4KLSAgIEVYX0lORk8gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGZvciBjb250cm9sbGluZyByZWFkaW5nIG9mIGZ1cnRoZXIKLSAgIGJ5dGVzIGZvciB0aGUgaW5zbi4KLSAgIEJBU0VfSU5TTiBpcyB0aGUgZmlyc3QgQ0dFTl9CQVNFX0lOU05fU0laRSBieXRlcyAoaG9zdCBvcmRlcikuCi0gICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0IGluIHdoaWNoIHRoZSByZXN1bHRzIGFyZSBwbGFjZWQuCi0gICBQQyBpcyB0aGUgcGMgdmFsdWUgb2YgdGhlIGluc24uCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cyBvciB6ZXJvIGlmIG5vdCByZWNvZ25pemVkLiAgKi8KLQotI2lmZGVmIEJGRF9WRVJTSU9OCi10eXBlZGVmIGludCAoY2dlbl9leHRyYWN0X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvXywgQ0dFTl9JTlNOX0lOVCBiYXNlX2luc25fLAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBiZmRfdm1hIHBjXykpOwotI2Vsc2UKLXR5cGVkZWYgaW50IChjZ2VuX2V4dHJhY3RfZm4pICgpOwotI2VuZGlmCi0KLS8qIFByaW50IGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5GTyBpcyBhIHBvaW50ZXIgdG8gdGhlIGRpc2Fzc2VtYmx5IGluZm8uCi0gICBFZzogZGlzYXNzZW1ibGVfaW5mby4gIEl0J3MgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGlzIGZpbGUgY2FuIGJlIGluY2x1ZGVkCi0gICB3aXRob3V0IGRpcy1hc20uaC4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcHJpbnRlZC4KLSAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QuCi0gICBQQyBpcyB0aGUgcGMgdmFsdWUgb2YgdGhlIGluc24uCi0gICBMRU4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiwgaW4gYml0cy4gICovCi0KLSNpZmRlZiBCRkRfVkVSU0lPTgotdHlwZWRlZiB2b2lkIChjZ2VuX3ByaW50X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIgaW5mb18sIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgcGNfLCBpbnQgbGVuXykpOwotI2Vsc2UKLXR5cGVkZWYgdm9pZCAoY2dlbl9wcmludF9mbikgKCk7Ci0jZW5kaWYKLQotLyogUGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgaGFuZGxlcnMuCi0KLSAgIEluZGljZXMgaW50byB0aGUgaGFuZGxlciB0YWJsZXMuCi0gICBXZSBjb3VsZCB1c2UgcG9pbnRlcnMgaGVyZSBpbnN0ZWFkLCBidXQgOTAlIG9mIHRoZW0gYXJlIGdlbmVyYWxseSBpZGVudGljYWwKLSAgIGFuZCB0aGF0J3MgYSBsb3Qgb2YgcmVkdW5kYW50IGRhdGEuICBNYWtpbmcgdGhlc2UgdW5zaWduZWQgY2hhciBpbmRpY2VzCi0gICBpbnRvIHRhYmxlcyBvZiBwb2ludGVycyBzYXZlcyBhIGJpdCBvZiBzcGFjZS4KLSAgIFVzaW5nIGluZGljZXMgYWxzbyBrZWVwcyBhc3NlbWJsZXIgY29kZSBvdXQgb2YgdGhlIGRpc2Fzc2VtYmxlciBhbmQKLSAgIHZpY2UgdmVyc2EuICAqLwotCi1zdHJ1Y3QgY2dlbl9vcGNvZGVfaGFuZGxlcgotewotICB1bnNpZ25lZCBjaGFyIHBhcnNlLCBpbnNlcnQsIGV4dHJhY3QsIHByaW50OwotfTsKLQwKLS8qIEFzc2VtYmxlciBpbnRlcmZhY2UuCi0KLSAgIFRoZSBpbnRlcmZhY2UgdG8gdGhlIGFzc2VtYmxlciBpcyBpbnRlbmRlZCB0byBiZSBjbGVhbiBpbiB0aGUgc2Vuc2UgdGhhdAotICAgbGlib3Bjb2Rlcy5hIGlzIGEgc3RhbmRhbG9uZSBlbnRpdHkgYW5kIGNvdWxkIGJlIHVzZWQgd2l0aCBhbnkgYXNzZW1ibGVyLgotICAgTm90IHRoYXQgb25lIHdvdWxkIG5lY2Vzc2FyaWx5IHdhbnQgdG8gZG8gdGhhdCBidXQgcmF0aGVyIHRoYXQgaXQgaGVscHMKLSAgIGtlZXAgYSBjbGVhbiBpbnRlcmZhY2UuICBUaGUgaW50ZXJmYWNlIHdpbGwgb2J2aW91c2x5IGJlIHNsYW50ZWQgdG93YXJkcwotICAgR0FTLCBidXQgYXQgbGVhc3QgaXQncyBhIHN0YXJ0LgotICAgPz8/IE5vdGUgdGhhdCBvbmUgcG9zc2libGUgdXNlciBvZiB0aGUgYXNzZW1ibGVyIGJlc2lkZXMgR0FTIGlzIEdEQi4KLQotICAgUGFyc2luZyBpcyBjb250cm9sbGVkIGJ5IHRoZSBhc3NlbWJsZXIgd2hpY2ggY2FsbHMKLSAgIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKS4gIElmIGl0IGNhbiBwYXJzZSBhbmQgYnVpbGQgdGhlIGVudGlyZSBpbnNuCi0gICBpdCBkb2Vzbid0IGNhbGwgYmFjayB0byB0aGUgYXNzZW1ibGVyLiAgSWYgaXQgbmVlZHMvd2FudHMgdG8gY2FsbCBiYWNrCi0gICB0byB0aGUgYXNzZW1ibGVyLCBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gaXMgY2FsbGVkIHdoaWNoIGNhbiBlaXRoZXIKLQotICAgLSByZXR1cm4gYSBudW1iZXIgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGluc24KLSAgIC0gcmV0dXJuIGEgInJlZ2lzdGVyIiB2YWx1ZSB0byBiZSBpbnNlcnRlZAotICAgICAodGhlIHJlZ2lzdGVyIG1pZ2h0IG5vdCBiZSBhIHJlZ2lzdGVyIHBlciBwZSkKLSAgIC0gcXVldWUgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gYSBtYXJrZXIgc2F5aW5nIHRoZSBleHByZXNzaW9uIGhhcyBiZWVuCi0gICAgIHF1ZXVlZCAoZWc6IGEgZml4LXVwKQotICAgLSByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBleHByZXNzaW9uIHdhc24ndCByZWNvZ25pemFibGUKLQotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgZm9yIHN1Y2Nlc3MuCi0gICBUaGUgcGFyc2VkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgYmZkX3ZtYSAqLiAgKi8KLQotLyogVmFsdWVzIGZvciBpbmRpY2F0aW5nIHdoYXQgdGhlIGNhbGxlciB3YW50cy4gICovCi0KLWVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUKLXsKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9JTlRFR0VSLAotICBDR0VOX1BBUlNFX09QRVJBTkRfQUREUkVTUwotfTsKLQotLyogVmFsdWVzIGZvciBpbmRpY2F0aW5nIHdoYXQgd2FzIHBhcnNlZC4gICovCi0KLWVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdAotewotICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUiwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9SRUdJU1RFUiwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9RVUVVRUQsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfRVJST1IKLX07Ci0KLSNpZmRlZiBCRkRfVkVSU0lPTiAvKiBEb24ndCByZXF1aXJlIGJmZC5oIHVubmVjZXNzYXJpbHkuICAqLwotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywKLQkgICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlLCBjb25zdCBjaGFyICoqLCBpbnQsIGludCwKLQkgICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwgYmZkX3ZtYSAqKSk7Ci0jZWxzZQotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikgKCk7Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gY2FsbGJhY2suICAqLwotCi1leHRlcm4gdm9pZCBjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikpOwotCi0vKiBDYWxsZWQgYmVmb3JlIHRyeWluZyB0byBtYXRjaCBhIHRhYmxlIGVudHJ5IHdpdGggdGhlIGluc24uICAqLwotCi1leHRlcm4gdm9pZCBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0MCi0vKiBPcGVyYW5kIHZhbHVlcyAoa2V5d29yZHMsIGludGVnZXJzLCBzeW1ib2xzLCBldGMuKSAgKi8KLQotLyogVHlwZXMgb2YgYXNzZW1ibGVyIGVsZW1lbnRzLiAgKi8KLQotZW51bSBjZ2VuX2FzbV90eXBlCi17Ci0gIENHRU5fQVNNX05PTkUsIENHRU5fQVNNX0tFWVdPUkQsIENHRU5fQVNNX01BWAotfTsKLQotI2lmbmRlZiBDR0VOX0FSQ0gKLWVudW0gY2dlbl9od190eXBlIHsgQ0dFTl9IV19NQVggfTsKLSNlbmRpZgotCi0vKiBMaXN0IG9mIGhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBjZ2VuX2h3X3R5cGUgdHlwZTsKLSAgLyogVGhlcmUgaXMgY3VycmVudGx5IG5vIGV4YW1wbGUgd2hlcmUgYm90aCBpbmRleCBzcGVjcyBhbmQgdmFsdWUgc3BlY3MKLSAgICAgYXJlIHJlcXVpcmVkLCBzbyBmb3Igbm93IGJvdGggYXJlIGNsdW1wZWQgdW5kZXIgImFzbV9kYXRhIi4gICovCi0gIGVudW0gY2dlbl9hc21fdHlwZSBhc21fdHlwZTsKLSAgUFRSIGFzbV9kYXRhOwotI2lmbmRlZiBDR0VOX0hXX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX0hXX05CT09MX0FUVFJTKSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9IV19BVFRSUyhodykgKCYoaHcpLT5hdHRycykKLX0gQ0dFTl9IV19FTlRSWTsKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIEhXLiAgKi8KLQotI2RlZmluZSBDR0VOX0hXX0FUVFJfVkFMVUUoaHcsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKGh3KSwgQ0dFTl9IV19BVFRSUyAoaHcpLCAoYXR0cikpCi0KLS8qIFRhYmxlIG9mIGhhcmR3YXJlIGVsZW1lbnRzIGZvciBzZWxlY3RlZCBtYWNoLCBjb21wdXRlZCBhdCBydW50aW1lLgotICAgZW51bSBjZ2VuX2h3X3R5cGUgaXMgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlIChzcGVjaWZpY2FsbHkgYGVudHJpZXMnKS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogUG9pbnRlciB0byBudWxsIHRlcm1pbmF0ZWQgdGFibGUgb2YgYWxsIGNvbXBpbGVkIGluIGVudHJpZXMuICAqLwotICBjb25zdCBDR0VOX0hXX0VOVFJZICppbml0X2VudHJpZXM7Ci0gIHVuc2lnbmVkIGludCBlbnRyeV9zaXplOyAvKiBzaW5jZSB0aGUgYXR0cmlidXRlIG1lbWJlciBpcyB2YXJpYWJsZSBzaXplZCAqLwotICAvKiBBcnJheSBvZiBhbGwgZW50cmllcywgaW5pdGlhbCBhbmQgcnVuLXRpbWUgYWRkZWQuICAqLwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqZW50cmllczsKLSAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGBlbnRyaWVzJy4gICovCi0gIHVuc2lnbmVkIGludCBudW1fZW50cmllczsKLSAgLyogRm9yIG5vdywgeHJlYWxsb2MgaXMgY2FsbGVkIGVhY2ggdGltZSBhIG5ldyBlbnRyeSBpcyBhZGRlZCBhdCBydW50aW1lLgotICAgICA/Pz8gTWF5IHdpc2ggdG8ga2VlcCB0cmFjayBvZiBzb21lIHNsb3AgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8KLSAgICAgeHJlYWxsb2MsIGV4Y2VwdCB0aGF0IHRoZXJlJ3MgdW5saWtlbHkgdG8gYmUgbWFueSBhbmQgbm90IGV4cGVjdGVkIHRvIGJlCi0gICAgIGluIHNwZWVkIGNyaXRpY2FsIGNvZGUuICAqLwotfSBDR0VOX0hXX1RBQkxFOwotCi1leHRlcm4gY29uc3QgQ0dFTl9IV19FTlRSWSAqIGNnZW5faHdfbG9va3VwX2J5X25hbWUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgQ0dFTl9IV19FTlRSWSAqIGNnZW5faHdfbG9va3VwX2J5X251bQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQpKTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBkZXNjcmliZSB0aGluZ3MgbGlrZSByZWdpc3RlciBuYW1lcywgZXRjLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5Ci17Ci0gIC8qIE5hbWUgKGFzIGluIHJlZ2lzdGVyIG5hbWUpLiAgKi8KLSAgY2hhciAqIG5hbWU7Ci0KLSAgLyogVmFsdWUgKGFzIGluIHJlZ2lzdGVyIG51bWJlcikuCi0gICAgIFRoZSB2YWx1ZSBjYW5ub3QgYmUgLTEgYXMgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlICJub3QgZm91bmQiLgotICAgICBJREVBOiBIYXZlICJGVU5DVElPTiIgYXR0cmlidXRlPyBbZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGZldGNoIHZhbHVlXS4gICovCi0gIGludCB2YWx1ZTsKLQotICAvKiBBdHRyaWJ1dGVzLgotICAgICBUaGlzIHNob3VsZCwgYnV0IHRlY2huaWNhbGx5IG5lZWRuJ3QsIGFwcGVhciBsYXN0LiAgSXQgaXMgYSB2YXJpYWJsZSBzaXplZAotICAgICBhcnJheSBpbiB0aGF0IG9uZSBhcmNoaXRlY3R1cmUgbWF5IGhhdmUgMSBub25ib29sIGF0dHJpYnV0ZSBhbmQgYW5vdGhlcgotICAgICBtYXkgaGF2ZSBtb3JlLiAgSGF2aW5nIHRoaXMgbGFzdCBtZWFucyB0aGUgbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlCi0gICAgIG5lZWRuJ3QgY2FyZS4gIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVjb3JkCi0gICAgIGF0dHJpYnV0ZXMgaW4gdGhlaXIgcmF3IGZvcm0sIGV2YWx1YXRlIHRoZW0gYXQgcnVuLXRpbWUsIGFuZCBjYWNoZSB0aGUKLSAgICAgdmFsdWVzLCBzbyB0aGlzIHdvcnJ5IHdpbGwgZ28gYXdheSBhbnl3YXkuICAqLwotICAvKiA/Pz8gTW92aW5nIHRoaXMgbGFzdCBzaG91bGQgYmUgZG9uZSBieSB0cmVhdGluZyBrZXl3b3JkcyBsaWtlIGluc24gbGlzdHMKLSAgICAgYW5kIG1vdmluZyB0aGUgYG5leHQnIGZpZWxkcyBpbnRvIGEgQ0dFTl9LRVlXT1JEX0xJU1Qgc3RydWN0LiAgKi8KLSAgLyogRklYTUU6IE5vdCB1c2VkIHlldC4gICovCi0jaWZuZGVmIENHRU5fS0VZV09SRF9OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX0tFWVdPUkRfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX0tFWVdPUkRfTkJPT0xfQVRUUlMpIGF0dHJzOwotCi0gIC8qID8/PyBQdXR0aW5nIHRoZXNlIGhlcmUgbWVhbnMgY29tcGlsZWQgaW4gZW50cmllcyBjYW4ndCBiZSBjb25zdC4KLSAgICAgTm90IGEgcmVhbGx5IGJpZyBkZWFsLCBidXQgc29tZXRoaW5nIHRvIGNvbnNpZGVyLiAgKi8KLSAgLyogTmV4dCBuYW1lIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5ICpuZXh0X25hbWU7Ci0gIC8qIE5leHQgdmFsdWUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkgKm5leHRfdmFsdWU7Ci19IENHRU5fS0VZV09SRF9FTlRSWTsKLQotLyogVG9wIGxldmVsIHN0cnVjdCBmb3IgZGVzY3JpYmluZyBhIHNldCBvZiByZWxhdGVkIGtleXdvcmRzCi0gICAoZS5nLiByZWdpc3RlciBuYW1lcykuCi0KLSAgIFRoaXMgc3RydWN0IHN1cHBvcnRzIHJ1bi10aW1lIGVudHJ5IG9mIG5ldyB2YWx1ZXMsIGFuZCBoYXNoZWQgbG9va3Vwcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fa2V5d29yZAotewotICAvKiBQb2ludGVyIHRvIGluaXRpYWwgW2NvbXBpbGVkIGluXSB2YWx1ZXMuICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKmluaXRfZW50cmllczsKLSAgCi0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGBpbml0X2VudHJpZXMnLiAgKi8KLSAgdW5zaWduZWQgaW50IG51bV9pbml0X2VudHJpZXM7Ci0gIAotICAvKiBIYXNoIHRhYmxlIHVzZWQgZm9yIG5hbWUgbG9va3VwLiAgKi8KLSAgQ0dFTl9LRVlXT1JEX0VOVFJZICoqbmFtZV9oYXNoX3RhYmxlOwotICAKLSAgLyogSGFzaCB0YWJsZSB1c2VkIGZvciB2YWx1ZSBsb29rdXAuICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKip2YWx1ZV9oYXNoX3RhYmxlOwotICAKLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2hfdGFibGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGhhc2hfdGFibGVfc2l6ZTsKLSAgCi0gIC8qIFBvaW50ZXIgdG8gbnVsbCBrZXl3b3JkICIiIGVudHJ5IGlmIHByZXNlbnQuICAqLwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKm51bGxfZW50cnk7Ci19IENHRU5fS0VZV09SRDsKLQotLyogU3RydWN0dXJlIHVzZWQgZm9yIHNlYXJjaGluZy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRhYmxlIGJlaW5nIHNlYXJjaGVkLiAgKi8KLSAgY29uc3QgQ0dFTl9LRVlXT1JEICp0YWJsZTsKLSAgCi0gIC8qIFNwZWNpZmljYXRpb24gb2Ygd2hhdCBpcyBiZWluZyBzZWFyY2hlZCBmb3IuICAqLwotICBjb25zdCBjaGFyICpzcGVjOwotICAKLSAgLyogQ3VycmVudCBpbmRleCBpbiBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfaGFzaDsKLSAgCi0gIC8qIEN1cnJlbnQgZWxlbWVudCBpbiBjdXJyZW50IGhhc2ggY2hhaW4uICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKmN1cnJlbnRfZW50cnk7Ci19IENHRU5fS0VZV09SRF9TRUFSQ0g7Ci0KLS8qIExvb2t1cCBhIGtleXdvcmQgZnJvbSBpdHMgbmFtZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lCi0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogTG9va3VwIGEga2V5d29yZCBmcm9tIGl0cyB2YWx1ZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZQotICBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgaW50KSk7Ci0KLS8qIEFkZCBhIGtleXdvcmQuICAqLwotCi12b2lkIGNnZW5fa2V5d29yZF9hZGQgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0KLS8qIEtleXdvcmQgc2VhcmNoaW5nLgotICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBldmVyeSBrZXl3b3JkLCBvciBhIHN1YnNldC4gICovCi0KLUNHRU5fS0VZV09SRF9TRUFSQ0ggY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0Ci0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBjb25zdCBjaGFyICopKTsKLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0Ci0gIFBBUkFNUyAoKENHRU5fS0VZV09SRF9TRUFSQ0ggKikpOwotCi0vKiBPcGVyYW5kIHZhbHVlIHN1cHBvcnQgcm91dGluZXMuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV9rZXl3b3JkCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIENHRU5fS0VZV09SRCAqLCBsb25nICopKTsKLSNpZmRlZiBCRkRfVkVSU0lPTiAvKiBEb24ndCByZXF1aXJlIGJmZC5oIHVubmVjZXNzYXJpbHkuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCBsb25nICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCB1bnNpZ25lZCBsb25nICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX2FkZHJlc3MKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCBpbnQsCi0JICAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICosIGJmZF92bWEgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fdmFsaWRhdGVfc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgobG9uZywgbG9uZywgbG9uZykpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fdmFsaWRhdGVfdW5zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci0jZW5kaWYKLQwKLS8qIE9wZXJhbmQgbW9kZXMuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIHRoZSB2YWx1ZXMgaW4gYXJjaC5oLiAgUmV2aXNpdC4KLSAgIFRoZXNlIGhvd2V2ZXIgbmVlZCB0aGUgQ0dFTl8gcHJlZml4IFthcyBkb2VzIGV2ZXJ5dGhpbmcgaW4gdGhpcyBmaWxlXS4gICovCi0vKiA/Pz8gVGFyZ2V0cyBtYXkgbmVlZCB0byBhZGQgdGhlaXIgb3duIG1vZGVzIHNvIHdlIG1heSB3aXNoIHRvIG1vdmUgdGhpcwotICAgdG8gPGFyY2g+LW9wYy5oLCBvciBhZGQgYSBob29rLiAgKi8KLQotZW51bSBjZ2VuX21vZGUgewotICBDR0VOX01PREVfVk9JRCwgLyogPz8/IHJlbmFtZSBzaW11bGF0b3IncyBWTSB0byBWT0lEPyAqLwotICBDR0VOX01PREVfQkksIENHRU5fTU9ERV9RSSwgQ0dFTl9NT0RFX0hJLCBDR0VOX01PREVfU0ksIENHRU5fTU9ERV9ESSwKLSAgQ0dFTl9NT0RFX1VCSSwgQ0dFTl9NT0RFX1VRSSwgQ0dFTl9NT0RFX1VISSwgQ0dFTl9NT0RFX1VTSSwgQ0dFTl9NT0RFX1VESSwKLSAgQ0dFTl9NT0RFX1NGLCBDR0VOX01PREVfREYsIENHRU5fTU9ERV9YRiwgQ0dFTl9NT0RFX1RGLAotICBDR0VOX01PREVfVEFSR0VUX01BWCwKLSAgQ0dFTl9NT0RFX0lOVCwgQ0dFTl9NT0RFX1VJTlQsCi0gIENHRU5fTU9ERV9NQVgKLX07Ci0KLS8qIEZJWE1FOiBVbnRpbCBzaW11bGF0b3IgaXMgdXBkYXRlZC4gICovCi0KLSNkZWZpbmUgQ0dFTl9NT0RFX1ZNIENHRU5fTU9ERV9WT0lECi0MCi0vKiBPcGVyYW5kcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9BUkNICi1lbnVtIGNnZW5fb3BlcmFuZF90eXBlIHsgQ0dFTl9PUEVSQU5EX01BWCB9OwotI2VuZGlmCi0KLS8qICJuaWwiIGluZGljYXRvciBmb3IgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgKi8KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05JTCBDR0VOX09QRVJBTkRfTUFYCi0KLS8qIFRoaXMgc3RydWN0IGRlZmluZXMgZWFjaCBlbnRyeSBpbiB0aGUgb3BlcmFuZCB0YWJsZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgLyogT3BlcmFuZCB0eXBlLiAgKi8KLSAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB0eXBlOwotCi0gIC8qIFRoZSBoYXJkd2FyZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhbmQuICAqLwotICBlbnVtIGNnZW5faHdfdHlwZSBod190eXBlOwotCi0gIC8qIEZJWE1FOiBXZSBkb24ndCB5ZXQgcmVjb3JkIGlmaWVsZCBkZWZpbml0aW9ucywgd2hpY2ggd2Ugc2hvdWxkLgotICAgICBXaGVuIHdlIGRvIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gZGVsZXRlIHN0YXJ0L2xlbmd0aCAoc2luY2UgdGhleSB3aWxsCi0gICAgIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIGlmaWVsZCdzIGRlZmluaXRpb24pIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBhCi0gICAgIHBvaW50ZXIgdG8gdGhlIGlmaWVsZCBlbnRyeS4gICovCi0KLSAgLyogQml0IHBvc2l0aW9uLgotICAgICBUaGlzIGlzIGp1c3QgYSBoaW50LCBhbmQgbWF5IGJlIHVudXNlZCBpbiBtb3JlIGNvbXBsZXggb3BlcmFuZHMuCi0gICAgIE1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YXJ0OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4KLSAgICAgVGhpcyBpcyBqdXN0IGEgaGludCwgYW5kIG1heSBiZSB1bnVzZWQgaW4gbW9yZSBjb21wbGV4IG9wZXJhbmRzLgotICAgICBNYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsZW5ndGg7Ci0KLSNpZiAwIC8qID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCByZWxvY3MgdGVuZCB0byBnZXQgdG9vIGNvbXBsaWNhdGVkLAotCSBhbmQgQUJJIGRlcGVuZGVudCwgZm9yIHNpbXBsZSB0YWJsZSBsb29rdXBzIHRvIHdvcmsuICAqLwotICAvKiBJZGVhbGx5IHRoaXMgd291bGQgYmUgdGhlIGludGVybmFsIChleHRlcm5hbD8pIHJlbG9jIHR5cGUuICAqLwotICBpbnQgcmVsb2NfdHlwZTsKLSNlbmRpZgotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgIFRoaXMgc2hvdWxkLCBidXQgdGVjaG5pY2FsbHkgbmVlZG4ndCwgYXBwZWFyIGxhc3QuICBJdCBpcyBhIHZhcmlhYmxlIHNpemVkCi0gICAgIGFycmF5IGluIHRoYXQgb25lIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSAxIG5vbmJvb2wgYXR0cmlidXRlIGFuZCBhbm90aGVyCi0gICAgIG1heSBoYXZlIG1vcmUuICBIYXZpbmcgdGhpcyBsYXN0IG1lYW5zIHRoZSBub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUKLSAgICAgbmVlZG4ndCBjYXJlLCBub3cgb3IgdG9tb3Jyb3cuICBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlY29yZAotICAgICBhdHRyaWJ1dGVzIGluIHRoZWlyIHJhdyBmb3JtLCBldmFsdWF0ZSB0aGVtIGF0IHJ1bi10aW1lLCBhbmQgY2FjaGUgdGhlCi0gICAgIHZhbHVlcywgc28gdGhpcyB3b3JyeSB3aWxsIGdvIGF3YXkgYW55d2F5LiAgKi8KLSNpZm5kZWYgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLSAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUykgYXR0cnM7Ci0jZGVmaW5lIENHRU5fT1BFUkFORF9BVFRSUyhvcGVyYW5kKSAoJihvcGVyYW5kKS0+YXR0cnMpCi19IENHRU5fT1BFUkFORDsKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIE9QRVJBTkQuICAqLwotCi0jZGVmaW5lIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFKG9wZXJhbmQsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKG9wZXJhbmQpLCBDR0VOX09QRVJBTkRfQVRUUlMgKG9wZXJhbmQpLCAoYXR0cikpCi0KLS8qIFRhYmxlIG9mIG9wZXJhbmRzIGZvciBzZWxlY3RlZCBtYWNoL2lzYSwgY29tcHV0ZWQgYXQgcnVudGltZS4KLSAgIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgaXMgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlIChzcGVjaWZpY2FsbHkKLSAgIGBlbnRyaWVzJykuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFBvaW50ZXIgdG8gbnVsbCB0ZXJtaW5hdGVkIHRhYmxlIG9mIGFsbCBjb21waWxlZCBpbiBlbnRyaWVzLiAgKi8KLSAgY29uc3QgQ0dFTl9PUEVSQU5EICppbml0X2VudHJpZXM7Ci0gIHVuc2lnbmVkIGludCBlbnRyeV9zaXplOyAvKiBzaW5jZSB0aGUgYXR0cmlidXRlIG1lbWJlciBpcyB2YXJpYWJsZSBzaXplZCAqLwotICAvKiBBcnJheSBvZiBhbGwgZW50cmllcywgaW5pdGlhbCBhbmQgcnVuLXRpbWUgYWRkZWQuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKiplbnRyaWVzOwotICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYGVudHJpZXMnLiAgKi8KLSAgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOwotICAvKiBGb3Igbm93LCB4cmVhbGxvYyBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbmV3IGVudHJ5IGlzIGFkZGVkIGF0IHJ1bnRpbWUuCi0gICAgID8/PyBNYXkgd2lzaCB0byBrZWVwIHRyYWNrIG9mIHNvbWUgc2xvcCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0bwotICAgICB4cmVhbGxvYywgZXhjZXB0IHRoYXQgdGhlcmUncyB1bmxpa2VseSB0byBiZSBtYW55IGFuZCBub3QgZXhwZWN0ZWQgdG8gYmUKLSAgICAgaW4gc3BlZWQgY3JpdGljYWwgY29kZS4gICovCi19IENHRU5fT1BFUkFORF9UQUJMRTsKLQotZXh0ZXJuIGNvbnN0IENHRU5fT1BFUkFORCAqIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBDR0VOX09QRVJBTkQgKiBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQpKTsKLQwKLS8qIEluc3RydWN0aW9uIG9wZXJhbmQgaW5zdGFuY2VzLgotCi0gICBGb3IgZWFjaCBpbnN0cnVjdGlvbiwgYSBsaXN0IG9mIHRoZSBoYXJkd2FyZSBlbGVtZW50cyB0aGF0IGFyZSByZWFkIGFuZAotICAgd3JpdHRlbiBhcmUgcmVjb3JkZWQuICAqLwotCi0vKiBUaGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UuICAqLwotCi1lbnVtIGNnZW5fb3BpbnN0X3R5cGUgewotICAvKiBFbmQgb2YgdGFibGUgbWFya2VyLiAgKi8KLSAgQ0dFTl9PUElOU1RfRU5EID0gMCwKLSAgQ0dFTl9PUElOU1RfSU5QVVQsIENHRU5fT1BJTlNUX09VVFBVVAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogSW5wdXQgb3Igb3V0cHV0IGluZGljYXRvci4gICovCi0gIGVudW0gY2dlbl9vcGluc3RfdHlwZSB0eXBlOwotCi0gIC8qIE5hbWUgb2Ygb3BlcmFuZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIGhhcmR3YXJlIGVsZW1lbnQgcmVmZXJlbmNlZC4gICovCi0gIGVudW0gY2dlbl9od190eXBlIGh3X3R5cGU7Ci0KLSAgLyogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIG9wZXJhbmQgaXMgYmVpbmcgdXNlZC4gICovCi0gIGVudW0gY2dlbl9tb2RlIG1vZGU7Ci0KLSAgLyogVGhlIG9wZXJhbmQgdGFibGUgZW50cnkgQ0dFTl9PUEVSQU5EX05JTCBpZiB0aGVyZSBpcyBub25lCi0gICAgIChpLmUuIGFuIGV4cGxpY2l0IGhhcmR3YXJlIHJlZmVyZW5jZSkuICAqLwotICBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIG9wX3R5cGU7Ci0KLSAgLyogSWYgYG9wZXJhbmQnIGlzICJuaWwiLCB0aGUgaW5kZXggKGUuZy4gaW50byBhcnJheSBvZiByZWdpc3RlcnMpLiAgKi8KLSAgaW50IGluZGV4OwotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgID8/PyBUaGlzIHBlcmhhcHMgc2hvdWxkIGJlIGEgcmVhbCBhdHRyaWJ1dGUgc3RydWN0IGJ1dCB0aGVyZSdzCi0gICAgIG5vIGN1cnJlbnQgbmVlZCwgc28gd2Ugc2F2ZSBhIGJpdCBvZiBzcGFjZSBhbmQganVzdCBoYXZlIGEgc2V0IG9mCi0gICAgIGZsYWdzLiAgVGhlIGludGVyZmFjZSBpcyBzdWNoIHRoYXQgdGhpcyBjYW4gZWFzaWx5IGJlIG1hZGUgYXR0cmlidXRlcwotICAgICBzaG91bGQgaXQgcHJvdmUgdXNlZnVsLiAgKi8KLSAgdW5zaWduZWQgaW50IGF0dHJzOwotI2RlZmluZSBDR0VOX09QSU5TVF9BVFRSUyhvcGluc3QpICgob3BpbnN0KS0+YXR0cnMpCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gT1BJTlNULiAgKi8KLSNkZWZpbmUgQ0dFTl9PUElOU1RfQVRUUihvcGluc3QsIGF0dHIpIFwKLSgoQ0dFTl9PUElOU1RfQVRUUlMgKG9waW5zdCkgJiAoYXR0cikpICE9IDApCi0vKiBPcGVyYW5kIGlzIGNvbmRpdGlvbmFsbHkgcmVmZXJlbmNlZCAocmVhZC93cml0dGVuKS4gICovCi0jZGVmaW5lIENHRU5fT1BJTlNUX0NPTkRfUkVGIDEKLX0gQ0dFTl9PUElOU1Q7Ci0MCi0vKiBTeW50YXggc3RyaW5nLgotCi0gICBFYWNoIGluc24gZm9ybWF0IGFuZCBzdWJleHByZXNzaW9uIGhhcyBvbmUgb2YgdGhlc2UuCi0KLSAgIFRoZSBzeW50YXggInN0cmluZyIgY29uc2lzdHMgb2YgY2hhcmFjdGVycyAobiA+IDAgJiYgbiA8IDEyOCksIGFuZCBvcGVyYW5kCi0gICB2YWx1ZXMgKG4gPj0gMTI4KSwgYW5kIGlzIHRlcm1pbmF0ZWQgYnkgMC4gIE9wZXJhbmQgdmFsdWVzIGFyZSAxMjggKyBpbmRleAotICAgaW50byB0aGUgb3BlcmFuZCB0YWJsZS4gIFRoZSBvcGVyYW5kIHRhYmxlIGRvZXNuJ3QgZXhpc3QgaW4gQywgcGVyIHNlLCBhcwotICAgdGhlIGRhdGEgaXMgcmVjb3JkZWQgaW4gdGhlIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IHN3aXRjaCBzdGF0ZW1lbnRzLiAqLwotCi0jaWZuZGVmIENHRU5fTUFYX1NZTlRBWF9CWVRFUwotI2RlZmluZSBDR0VOX01BWF9TWU5UQVhfQllURVMgMTYKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIHN5bnRheFtDR0VOX01BWF9TWU5UQVhfQllURVNdOwotfSBDR0VOX1NZTlRBWDsKLQotI2RlZmluZSBDR0VOX1NZTlRBWF9TVFJJTkcoc3luKSAoc3luLT5zeW50YXgpCi0jZGVmaW5lIENHRU5fU1lOVEFYX0NIQVJfUChjKSAoKGMpIDwgMTI4KQotI2RlZmluZSBDR0VOX1NZTlRBWF9DSEFSKGMpIChjKQotI2RlZmluZSBDR0VOX1NZTlRBWF9GSUVMRChjKSAoKGMpIC0gMTI4KQotI2RlZmluZSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEKGMpICgoYykgKyAxMjgpCi0KLS8qID8/PyBJIGNhbid0IGN1cnJlbnRseSB0aGluayBvZiBhbnkgY2FzZSB3aGVyZSB0aGUgbW5lbW9uaWMgZG9lc24ndCBjb21lCi0gICBmaXJzdCBbYW5kIGlmIG9uZSBldmVyIGRvZXNuJ3QgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGVzIHdpbGwgYmUgdHJpY2t5XS4KLSAgIEhvd2V2ZXIsIHdlIHRyZWF0IG1uZW1vbmljcyBhcyBqdXN0IGFub3RoZXIgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBBIHZhbHVlIG9mIDEgbWVhbnMgInRoaXMgaXMgd2hlcmUgdGhlIG1uZW1vbmljIGFwcGVhcnMiLiAgMSBpc24ndAotICAgc3BlY2lhbCBvdGhlciB0aGFuIGl0J3MgYSBub24tcHJpbnRhYmxlIEFTQ0lJIGNoYXIuICAqLwotCi0jZGVmaW5lIENHRU5fU1lOVEFYX01ORU1PTklDICAgICAgIDEKLSNkZWZpbmUgQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUChjaCkgKChjaCkgPT0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMpCi0MCi0vKiBJbnN0cnVjdGlvbiBmaWVsZHMuCi0KLSAgID8/PyBXZSBjdXJyZW50bHkgZG9uJ3QgYWxsb3cgYWRkaW5nIGZpZWxkcyBhdCBydW4tdGltZS4KLSAgIEVhc3kgdG8gZml4IHdoZW4gbmVlZGVkLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9pZmxkIHsKLSAgLyogRW51bSBvZiBpZmllbGQuICAqLwotICBpbnQgbnVtOwotI2RlZmluZSBDR0VOX0lGTERfTlVNKGYpICgoZiktPm51bSkKLQotICAvKiBOYW1lIG9mIHRoZSBmaWVsZCwgZGlzdGluZ3Vpc2hlcyBpdCBmcm9tIGFsbCBvdGhlciBmaWVsZHMuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotI2RlZmluZSBDR0VOX0lGTERfTkFNRShmKSAoKGYpLT5uYW1lKQotCi0gIC8qIERlZmF1bHQgb2Zmc2V0LCBpbiBiaXRzLCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiB0byB0aGUgd29yZAotICAgICBjb250YWluaW5nIHRoZSBmaWVsZC4gICovCi0gIGludCB3b3JkX29mZnNldDsKLSNkZWZpbmUgQ0dFTl9JRkxEX1dPUkRfT0ZGU0VUKGYpICgoZiktPndvcmRfb2Zmc2V0KQotCi0gIC8qIERlZmF1bHQgbGVuZ3RoIG9mIHRoZSB3b3JkIGNvbnRhaW5pbmcgdGhlIGZpZWxkLiAgKi8KLSAgaW50IHdvcmRfc2l6ZTsKLSNkZWZpbmUgQ0dFTl9JRkxEX1dPUkRfU0laRShmKSAoKGYpLT53b3JkX3NpemUpCi0KLSAgLyogRGVmYXVsdCBzdGFydGluZyBiaXQgbnVtYmVyLgotICAgICBXaGV0aGVyIGxzYj0wIG9yIG1zYj0wIGlzIGRldGVybWluZWQgYnkgQ0dFTl9JTlNOX0xTQjBfUC4gICovCi0gIGludCBzdGFydDsKLSNkZWZpbmUgQ0dFTl9JRkxEX1NUQVJUKGYpICgoZiktPnN0YXJ0KQotCi0gIC8qIExlbmd0aCBvZiB0aGUgZmllbGQsIGluIGJpdHMuICAqLwotICBpbnQgbGVuZ3RoOwotI2RlZmluZSBDR0VOX0lGTERfTEVOR1RIKGYpICgoZiktPmxlbmd0aCkKLQotI2lmbmRlZiBDR0VOX0lGTERfTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIDEKLSNlbmRpZgotICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9JRkxEX05CT09MX0FUVFJTKSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9JRkxEX0FUVFJTKGYpICgmKGYpLT5hdHRycykKLX0gQ0dFTl9JRkxEOwotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gSUZMRC4gICovCi0jZGVmaW5lIENHRU5fSUZMRF9BVFRSX1ZBTFVFKGlmbGQsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKGlmbGQpLCBDR0VOX0lGTERfQVRUUlMgKGlmbGQpLCAoYXR0cikpCi0MCi0vKiBJbnN0cnVjdGlvbiBkYXRhLiAgKi8KLQotLyogSW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLQotICAgSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkIGJ5IGZvcm1hdC4gIEFzc29jaWF0ZWQgd2l0aCBhbiBpbnN0cnVjdGlvbiBpcyBpdHMKLSAgIGZvcm1hdC4gIEVhY2ggaW5zbidzIG9wY29kZSB0YWJsZSBlbnRyeSBjb250YWlucyBhIGZvcm1hdCB0YWJsZSBlbnRyeS4KLSAgID8/PyBUaGVyZSBpcyB1c3VhbGx5IHZlcnkgZmV3IGZvcm1hdHMgY29tcGFyZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluc25zLAotICAgc28gb25lIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIG9wY29kZSB0YWJsZSBieSByZWNvcmRpbmcgdGhlIGZvcm1hdCB0YWJsZQotICAgYXMgYSBzZXBhcmF0ZSBlbnRpdHkuICBHaXZlbiB0aGF0IHdlIGN1cnJlbnRseSBkb24ndCwgZm9ybWF0IHRhYmxlIGVudHJpZXMKLSAgIGFyZSBhbHNvIGRpc3Rpbmd1aXNoZWQgYnkgdGhlaXIgb3BlcmFuZHMuICBUaGlzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUKLSAgIHRhYmxlLCBidXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHRhYmxlcy4gIEl0J3MgYWxsIG1pbnV0aWFlIGFueXdheSBzbyBpdAotICAgZG9lc24ndCByZWFsbHkgbWF0dGVyIFthdCB0aGlzIHBvaW50IGluIHRpbWVdLgotCi0gICA/Pz8gU3VwcG9ydCBmb3IgdmFyaWFibGUgbGVuZ3RoIElTQSdzIGlzIHdpcC4gICovCi0KLS8qIEFjY29tcGFueWluZyBlYWNoIGlmb3JtYXQgZGVzY3JpcHRpb24gaXMgYSBsaXN0IG9mIGl0cyBmaWVsZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IENHRU5fSUZMRCAqaWZsZDsKLSNkZWZpbmUgQ0dFTl9JRk1UX0lGTERfSUZMRChpaSkgKChpaSktPmlmbGQpCi19IENHRU5fSUZNVF9JRkxEOwotCi0jaWZuZGVmIENHRU5fTUFYX0lGTVRfT1BFUkFORFMKLSNkZWZpbmUgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyAxCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTGVuZ3RoIHRoYXQgTUFTSyBhbmQgVkFMVUUgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgdG8KLSAgICAgW1ZBTFVFIGlzIHJlY29yZGVkIGVsc2V3aGVyZV0uCi0gICAgIE5vcm1hbGx5IGl0IGlzIGJhc2VfaW5zbl9iaXRzaXplLiAgT24gW1ZdTElXIGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlIGJhc2UKLSAgICAgaW5zbiBzaXplIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiBhbiBpbnNuLCB0aGlzIGZpZWxkIGlzIGxlc3MgdGhhbgotICAgICBiYXNlX2luc25fYml0c2l6ZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbWFza19sZW5ndGg7Ci0jZGVmaW5lIENHRU5fSUZNVF9NQVNLX0xFTkdUSChpZm10KSAoKGlmbXQpLT5tYXNrX2xlbmd0aCkKLQotICAvKiBUb3RhbCBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24sIGluIGJpdHMuICAqLwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKLSNkZWZpbmUgQ0dFTl9JRk1UX0xFTkdUSChpZm10KSAoKGlmbXQpLT5sZW5ndGgpCi0KLSAgLyogTWFzayB0byBhcHBseSB0byB0aGUgZmlyc3QgTUFTS19MRU5HVEggYml0cy4KLSAgICAgRWFjaCBpbnNuJ3MgdmFsdWUgaXMgc3RvcmVkIHdpdGggdGhlIGluc24uCi0gICAgIFRoZSBmaXJzdCBzdGVwIGluIHJlY29nbml6aW5nIGFuIGluc24gZm9yIGRpc2Fzc2VtYmx5IGlzCi0gICAgIChvcGNvZGUgJiBtYXNrKSA9PSB2YWx1ZS4gICovCi0gIENHRU5fSU5TTl9JTlQgbWFzazsKLSNkZWZpbmUgQ0dFTl9JRk1UX01BU0soaWZtdCkgKChpZm10KS0+bWFzaykKLQotICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuCi0gICAgICsxIGZvciB0cmFpbGluZyBOVUxMLiAgKi8KLSAgQ0dFTl9JRk1UX0lGTEQgaWZsZHNbQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyArIDFdOwotI2RlZmluZSBDR0VOX0lGTVRfSUZMRFMoaWZtdCkgKChpZm10KS0+aWZsZHMpCi19IENHRU5fSUZNVDsKLQotLyogSW5zdHJ1Y3Rpb24gdmFsdWVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIG9wY29kZSBwb3J0aW9uIG9mIHRoZSBiYXNlIGluc24uICAqLwotICBDR0VOX0lOU05fSU5UIGJhc2VfdmFsdWU7Ci0KLSNpZmRlZiBDR0VOX01BWF9FWFRSQV9PUENPREVfT1BFUkFORFMKLSAgLyogRXh0cmEgb3Bjb2RlIHZhbHVlcyBiZXlvbmQgYmFzZV92YWx1ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaWZpZWxkX3ZhbHVlc1tDR0VOX01BWF9FWFRSQV9PUENPREVfT1BFUkFORFNdOwotI2VuZGlmCi19IENHRU5fSVZBTFVFOwotCi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUuCi0gICBUaGlzIGNvbnRhaW5zIHRoZSBzeW50YXggYW5kIGZvcm1hdCBkYXRhIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLQotLyogPz8/IFNvbWUgcG9ydHMgYWxyZWFkeSBoYXZlIGFuIG9wY29kZSB0YWJsZSB5ZXQgc3RpbGwgbmVlZCB0byB1c2UgdGhlIHJlc3QKLSAgIG9mIHdoYXQgY2dlbl9pbnNuIGhhcy4gIFBsdXMga2VlcGluZyB0aGUgb3Bjb2RlIGRhdGEgd2l0aCB0aGUgb3BlcmFuZAotICAgaW5zdGFuY2UgZGF0YSBjYW4gY3JlYXRlIGEgcHJldHR5IGJpZyBmaWxlLiAgU28gd2Uga2VlcCB0aGVtIHNlcGFyYXRlbHkuCi0gICBOb3Qgc3VyZSB0aGlzIGlzIGEgZ29vZCBpZGVhIGluIHRoZSBsb25nIHJ1bi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEluZGljZXMgaW50byBwYXJzZS9pbnNlcnQvZXh0cmFjdC9wcmludCBoYW5kbGVyIHRhYmxlcy4gICovCi0gIHN0cnVjdCBjZ2VuX29wY29kZV9oYW5kbGVyIGhhbmRsZXJzOwotI2RlZmluZSBDR0VOX09QQ09ERV9IQU5ETEVSUyhvcGMpICgmIChvcGMpLT5oYW5kbGVycykKLQotICAvKiBTeW50YXggc3RyaW5nLiAgKi8KLSAgQ0dFTl9TWU5UQVggc3ludGF4OwotI2RlZmluZSBDR0VOX09QQ09ERV9TWU5UQVgob3BjKSAoJiAob3BjKS0+c3ludGF4KQotCi0gIC8qIEZvcm1hdCBlbnRyeS4gICovCi0gIGNvbnN0IENHRU5fSUZNVCAqZm9ybWF0OwotI2RlZmluZSBDR0VOX09QQ09ERV9GT1JNQVQob3BjKSAoKG9wYyktPmZvcm1hdCkKLSNkZWZpbmUgQ0dFTl9PUENPREVfTUFTS19CSVRTSVpFKG9wYykgQ0dFTl9JRk1UX01BU0tfTEVOR1RIIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0JJVFNJWkUob3BjKSBDR0VOX0lGTVRfTEVOR1RIIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0lGTERTKG9wYykgQ0dFTl9JRk1UX0lGTERTIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi0KLSAgLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHZhbHVlLiAgKi8KLSAgQ0dFTl9JVkFMVUUgdmFsdWU7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX1ZBTFVFKG9wYykgKCYgKG9wYyktPnZhbHVlKQotI2RlZmluZSBDR0VOX09QQ09ERV9CQVNFX1ZBTFVFKG9wYykgKENHRU5fT1BDT0RFX1ZBTFVFIChvcGMpLT5iYXNlX3ZhbHVlKQotI2RlZmluZSBDR0VOX09QQ09ERV9CQVNFX01BU0sob3BjKSBDR0VOX0lGTVRfTUFTSyAoQ0dFTl9PUENPREVfRk9STUFUIChvcGMpKQotfSBDR0VOX09QQ09ERTsKLQotLyogSW5zdHJ1Y3Rpb24gYXR0cmlidXRlcy4KLSAgIFRoaXMgaXMgbWFkZSBhIHB1Ymxpc2hlZCB0eXBlIGFzIGFwcGxpY2F0aW9ucyBjYW4gY2FjaGUgYSBwb2ludGVyIHRvCi0gICB0aGUgYXR0cmlidXRlcyBmb3Igc3BlZWQuICAqLwotCi0jaWZuZGVmIENHRU5fSU5TTl9OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX0lOU05fTkJPT0xfQVRUUlMgMQotI2VuZGlmCi10eXBlZGVmIENHRU5fQVRUUl9UWVBFIChDR0VOX0lOU05fTkJPT0xfQVRUUlMpIENHRU5fSU5TTl9BVFRSX1RZUEU7Ci0KLS8qIEVudW0gb2YgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGF0dHJpYnV0ZXMuICAqLwotCi0jaWZuZGVmIENHRU5fQVJDSAotLyogPz8/IE51bWJlcnMgaGVyZSBhcmUgcmVjb3JkZWQgaW4gdHdvIHBsYWNlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMgPSAwCi19IENHRU5fSU5TTl9BVFRSOwotI2VuZGlmCi0KLS8qIFRoaXMgc3RydWN0IGRlZmluZXMgZWFjaCBlbnRyeSBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBFYWNoIHJlYWwgaW5zdHJ1Y3Rpb24gaXMgZW51bWVyYXRlZC4gICovCi0gIC8qID8/PyBUaGlzIG1heSBnbyBhd2F5IGluIHRpbWUuICAqLwotICBpbnQgbnVtOwotI2RlZmluZSBDR0VOX0lOU05fTlVNKGluc24pICgoaW5zbiktPmJhc2UtPm51bSkKLQotICAvKiBOYW1lIG9mIGVudHJ5ICh0aGF0IGRpc3Rpbmd1aXNoZXMgaXQgZnJvbSBhbGwgb3RoZXIgZW50cmllcykuICAqLwotICAvKiA/Pz8gSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMsIHRyeSB0byBwcmludCBmdWxsIG1uZW1vbmljLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSNkZWZpbmUgQ0dFTl9JTlNOX05BTUUoaW5zbikgKChpbnNuKS0+YmFzZS0+bmFtZSkKLQotICAvKiBNbmVtb25pYy4gIFRoaXMgaXMgdXNlZCB3aGVuIHBhcnNpbmcgYW5kIHByaW50aW5nIHRoZSBpbnNuLgotICAgICBJbiB0aGUgY2FzZSBvZiBpbnNucyB0aGF0IGhhdmUgb3BlcmFuZHMgb24gdGhlIG1uZW1vbmljcywgdGhpcyBpcwotICAgICBvbmx5IHRoZSBjb25zdGFudCBwYXJ0LiAgRS5nLiBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uIG9mIGFuIGBhZGQnIGluc24sCi0gICAgIHdoZXJlIHRoZSBmdWxsIG1uZW1vbmljIGlzIGFkZGVxLCBhZGRuZSwgZXRjLiwgYW5kIHRoZSBjb25kaXRpb24gaXMKLSAgICAgdHJlYXRlZCBhcyBhbiBvcGVyYW5kLCB0aGlzIGlzIG9ubHkgImFkZCIuICAqLwotICBjb25zdCBjaGFyICptbmVtb25pYzsKLSNkZWZpbmUgQ0dFTl9JTlNOX01ORU1PTklDKGluc24pICgoaW5zbiktPmJhc2UtPm1uZW1vbmljKQotCi0gIC8qIFRvdGFsIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiwgaW4gYml0cy4gICovCi0gIGludCBiaXRzaXplOwotI2RlZmluZSBDR0VOX0lOU05fQklUU0laRShpbnNuKSAoKGluc24pLT5iYXNlLT5iaXRzaXplKQotCi0jaWYgMCAvKiA/Pz8gRGlzYWJsZWQgZm9yIG5vdyBhcyB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBlbWJlZGRlZCBuZXdsaW5lcwotCSBhbmQgdGhlIHRhYmxlIGlzIGFscmVhZHkgcHJldHR5IGJpZy4gIFNob3VsZCBwZXJoYXBzIGJlIG1vdmVkCi0JIHRvIGEgZmlsZSBvZiBpdHMgb3duLiAgKi8KLSAgLyogU2VtYW50aWNzLCBhcyBSVEwuICAqLwotICAvKiA/Pz8gUGxhaW4gdGV4dCBvciBieXRlY29kZXM/ICAqLwotICAvKiA/Pz8gTm90ZSB0aGF0IHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGNvdWxkIGJlIGNvbXB1dGVkIGF0IHJ1bi10aW1lCi0gICAgIGlmIHdlIHBhcnNlIHRoaXMgYW5kIGNhY2hlIHRoZSByZXN1bHRzLiAgU29tZXRoaW5nIHRvIGV2ZW50dWFsbHkgZG8uICAqLwotICBjb25zdCBjaGFyICpydHg7Ci0jZGVmaW5lIENHRU5fSU5TTl9SVFgoaW5zbikgKChpbnNuKS0+YmFzZS0+cnR4KQotI2VuZGlmCi0KLSAgLyogQXR0cmlidXRlcy4KLSAgICAgVGhpcyBtdXN0IGFwcGVhciBsYXN0LiAgSXQgaXMgYSB2YXJpYWJsZSBzaXplZCBhcnJheSBpbiB0aGF0IG9uZQotICAgICBhcmNoaXRlY3R1cmUgbWF5IGhhdmUgMSBub25ib29sIGF0dHJpYnV0ZSBhbmQgYW5vdGhlciBtYXkgaGF2ZSBtb3JlLgotICAgICBIYXZpbmcgdGhpcyBsYXN0IG1lYW5zIHRoZSBub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUgbmVlZG4ndAotICAgICBjYXJlLiAgVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZWNvcmQgYXR0cmlidXRlcyBpbiB0aGVpciByYXcgZm9ybSwKLSAgICAgZXZhbHVhdGUgdGhlbSBhdCBydW4tdGltZSwgYW5kIGNhY2hlIHRoZSB2YWx1ZXMsIHNvIHRoaXMgd29ycnkgd2lsbCBnbwotICAgICBhd2F5IGFueXdheS4gICovCi0gIENHRU5fSU5TTl9BVFRSX1RZUEUgYXR0cnM7Ci0jZGVmaW5lIENHRU5fSU5TTl9BVFRSUyhpbnNuKSAoJihpbnNuKS0+YmFzZS0+YXR0cnMpCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gSU5TTi4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9BVFRSX1ZBTFVFKGluc24sIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKGluc24pLCBDR0VOX0lOU05fQVRUUlMgKGluc24pLCAoYXR0cikpCi19IENHRU5fSUJBU0U7Ci0KLS8qIFJldHVybiBub24temVybyBpZiBJTlNOIGlzIHRoZSAiaW52YWxpZCIgaW5zbiBtYXJrZXIuICAqLwotCi0jZGVmaW5lIENHRU5fSU5TTl9JTlZBTElEX1AoaW5zbikgKENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikgPT0gMCkKLQotLyogTWFpbiBzdHJ1Y3QgY29udGFpbiBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbi4KLSAgIEJBU0UgaXMgYWx3YXlzIHByZXNlbnQsIHRoZSByZXN0IGlzIHByZXNlbnQgb25seSBpZiBhc2tlZCBmb3IuICAqLwotCi1zdHJ1Y3QgY2dlbl9pbnNuCi17Ci0gIC8qID8/PyBNYXkgYmUgb2YgdXNlIHRvIHB1dCBhIHR5cGUgaW5kaWNhdG9yIGhlcmUuCi0gICAgIFRoZW4gdGhpcyBzdHJ1Y3QgY291bGQgZGlmZmVyZW50IGluZm8gZm9yIGRpZmZlcmVudCBjbGFzc2VzIG9mIGluc25zLiAgKi8KLSAgLyogPz8/IEEgc3BlZWR1cCBjYW4gYmUgaGFkIGJ5IG1vdmluZyBgYmFzZScgaW50byB0aGlzIHN0cnVjdC4KLSAgICAgTWF5YmUgbGF0ZXIuICAqLwotICBjb25zdCBDR0VOX0lCQVNFICpiYXNlOwotICBjb25zdCBDR0VOX09QQ09ERSAqb3Bjb2RlOwotICBjb25zdCBDR0VOX09QSU5TVCAqb3BpbnN0OwotfTsKLQotLyogSW5zdHJ1Y3Rpb24gbGlzdHMuCi0gICBUaGlzIGlzIHVzZWQgZm9yIGFkZGluZyBuZXcgZW50cmllcyBhbmQgZm9yIGNyZWF0aW5nIHRoZSBoYXNoIGxpc3RzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9pbnNuX2xpc3QKLXsKLSAgc3RydWN0IGNnZW5faW5zbl9saXN0ICpuZXh0OwotICBjb25zdCBDR0VOX0lOU04gKmluc247Ci19IENHRU5fSU5TTl9MSVNUOwotCi0vKiBUYWJsZSBvZiBpbnN0cnVjdGlvbnMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBDR0VOX0lOU04gKmluaXRfZW50cmllczsKLSAgdW5zaWduZWQgaW50IGVudHJ5X3NpemU7IC8qIHNpbmNlIHRoZSBhdHRyaWJ1dGUgbWVtYmVyIGlzIHZhcmlhYmxlIHNpemVkICovCi0gIHVuc2lnbmVkIGludCBudW1faW5pdF9lbnRyaWVzOwotICBDR0VOX0lOU05fTElTVCAqbmV3X2VudHJpZXM7Ci19IENHRU5fSU5TTl9UQUJMRTsKLQotLyogUmV0dXJuIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIGluY2x1ZGVzIGFueSBhZGRlZCBhdCBydW4tdGltZS4gICovCi0KLWV4dGVybiBpbnQgY2dlbl9pbnNuX2NvdW50IFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLWV4dGVybiBpbnQgY2dlbl9tYWNyb19pbnNuX2NvdW50IFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQotLyogTWFjcm9zIHRvIGFjY2VzcyB0aGUgb3RoZXIgaW5zbiBlbGVtZW50cyBub3QgcmVjb3JkZWQgaW4gQ0dFTl9JQkFTRS4gICovCi0KLS8qIEZldGNoIElOU04ncyBvcGVyYW5kIGluc3RhbmNlIHRhYmxlLiAgKi8KLS8qID8/PyBEb2Vzbid0IGhhbmRsZSBpbnNucyBhZGRlZCBhdCBydW50aW1lLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX09QRVJBTkRTKGluc24pICgoaW5zbiktPm9waW5zdCkKLQotLyogUmV0dXJuIElOU04ncyBvcGNvZGUgdGFibGUgZW50cnkuICAqLwotI2RlZmluZSBDR0VOX0lOU05fT1BDT0RFKGluc24pICgoaW5zbiktPm9wY29kZSkKLQotLyogUmV0dXJuIElOU04ncyBoYW5kbGVyIGRhdGEuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSEFORExFUlMoaW5zbikgQ0dFTl9PUENPREVfSEFORExFUlMgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gSU5TTidzIHN5bnRheC4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9TWU5UQVgoaW5zbikgQ0dFTl9PUENPREVfU1lOVEFYIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIHNpemUgb2YgYmFzZSBtYXNrIGluIGJpdHMuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTUFTS19CSVRTSVpFKGluc24pIFwKLSAgQ0dFTl9PUENPREVfTUFTS19CSVRTSVpFIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIG1hc2sgb2YgYmFzZSBwYXJ0IG9mIElOU04uICAqLwotI2RlZmluZSBDR0VOX0lOU05fQkFTRV9NQVNLKGluc24pIFwKLSAgQ0dFTl9PUENPREVfQkFTRV9NQVNLIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIHZhbHVlIG9mIGJhc2UgcGFydCBvZiBJTlNOLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0JBU0VfVkFMVUUoaW5zbikgXAotICBDR0VOX09QQ09ERV9CQVNFX1ZBTFVFIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQwKLS8qIE1hY3JvIGluc3RydWN0aW9ucy4KLSAgIE1hY3JvIGluc25zIGFyZW4ndCByZWFsIGluc25zLCB0aGV5IG1hcCB0byBvbmUgb3IgbW9yZSByZWFsIGluc25zLgotICAgRS5nLiBBbiBhcmNoaXRlY3R1cmUncyAibm9wIiBpbnNuIG1heSBhY3R1YWxseSBiZSBhbiAibXYgcjAscjAiIG9yCi0gICBzb21lIHN1Y2guCi0KLSAgIE1hY3JvIGluc25zIGNhbiBleHBhbmQgdG8gbm90aGluZyAoZS5nLiBhIG5vcCB0aGF0IGlzIG9wdGltaXplZCBhd2F5KS4KLSAgIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLWluc24gbWFjcm9zIHRoYXQgYnVpbGQgYSBjb25zdGFudCBpbiBhIHJlZ2lzdGVyLgotICAgT2YgY291cnNlIHRoaXMgaXNuJ3QgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGFuZCBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZC4KLQotICAgQXNzZW1ibHkgb2YgbWFjcm8taW5zbnMgaXMgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQuICBEaXNhc3NlbWJseSBpc24ndC4KLSAgIEhvd2V2ZXIsIGRpc2Fzc2VtYmx5IG9mIGF0IGxlYXN0IHNvbWUga2luZHMgb2YgbWFjcm8gaW5zbnMgaXMgaW1wb3J0YW50Ci0gICBpbiBvcmRlciB0aGF0IHRoZSBkaXNhc3NlbWJsZWQgY29kZSBwcmVzZXJ2ZSB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIG9yaWdpbmFsCi0gICBpbnNuLiAgV2hhdCBpcyBhdHRlbXB0ZWQgaGVyZSBpcyB0byBkaXNhc3NlbWJsZSBhbGwgInNpbXBsZSIgbWFjcm8taW5zbnMsCi0gICB3aGVyZSAic2ltcGxlIiBpcyBjdXJyZW50bHkgZGVmaW5lZCB0byBtZWFuICJleHBhbmRzIHRvIG9uZSByZWFsIGluc24iLgotCi0gICBTaW1wbGUgbWFjcm8taW5zbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgVGhleSBhcmUgZW1pdHRlZCBhcyBBTElBUydzCi0gICBvZiByZWFsIGluc25zLiAgVGhpcyBzaW1wbGlmaWVzIHRoZWlyIGhhbmRsaW5nIHNpbmNlIHRoZXJlJ3MgdXN1YWxseSBtb3JlCi0gICBvZiB0aGVtIHRoYW4gYW55IG90aGVyIGtpbmQgb2YgbWFjcm8taW5zbiwgYW5kIHByb3BlciBkaXNhc3NlbWJseSBvZiB0aGVtCi0gICBmYWxscyBvdXQgZm9yIGZyZWUuICAqLwotCi0vKiBGb3IgZWFjaCBtYWNyby1pbnNuIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBleHBhbnNpb24gcG9zc2liaWxpdGllcywKLSAgIGRlcGVuZGluZyBvbiB0aGUgYXJndW1lbnRzLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgYWNjZXNzZWQgdmlhIHRoZSBgZGF0YScKLSAgIG1lbWJlciBvZiBDR0VOX0lOU04uICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX21pbnNuX2V4cGFuc2lvbiB7Ci0gIC8qIEZ1bmN0aW9uIHRvIGRvIHRoZSBleHBhbnNpb24uCi0gICAgIElmIHRoZSBleHBhbnNpb24gZmFpbHMgKGUuZy4gIm5vIG1hdGNoIikgTlVMTCBpcyByZXR1cm5lZC4KLSAgICAgU3BhY2UgZm9yIHRoZSBleHBhbnNpb24gaXMgb2J0YWluZWQgd2l0aCBtYWxsb2MuCi0gICAgIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZnJlZSBpdC4gICovCi0gIGNvbnN0IGNoYXIgKiAoKiBmbikgUEFSQU1TICgoY29uc3Qgc3RydWN0IGNnZW5fbWluc25fZXhwYW5zaW9uICosCi0JCQkgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBpbnQgKiwKLQkJCSAgICAgICBDR0VOX09QRVJBTkQgKiopKTsKLSNkZWZpbmUgQ0dFTl9NSUVYUE5fRk4oZXgpICgoZXgpLT5mbikKLQotICAvKiBJbnN0cnVjdGlvbihzKSB0aGUgbWFjcm8gZXhwYW5kcyB0by4KLSAgICAgVGhlIGZvcm1hdCBvZiBTVFIgaXMgZGVmaW5lZCBieSBGTi4KLSAgICAgSXQgaXMgdHlwaWNhbGx5IHRoZSBhc3NlbWJseSBjb2RlIG9mIHRoZSByZWFsIGluc24sIGJ1dCBpdCBjb3VsZCBhbHNvIGJlCi0gICAgIHRoZSBvcmlnaW5hbCBTY2hlbWUgZXhwcmVzc2lvbiBvciBhIHRva2VuaXplZCBmb3JtIG9mIGl0ICh3aXRoIEZOIGJlaW5nCi0gICAgIGFuIGFwcHJvcHJpYXRlIGludGVycHJldGVyKS4gICovCi0gIGNvbnN0IGNoYXIgKiBzdHI7Ci0jZGVmaW5lIENHRU5fTUlFWFBOX1NUUihleCkgKChleCktPnN0cikKLX0gQ0dFTl9NSU5TTl9FWFBBTlNJT047Ci0KLS8qIE5vcm1hbCBleHBhbmRlci4KLSAgIFdoZW4gc3VwcG9ydGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCB0aGUgaW5wdXQgc3RyaW5nIHRvIGFub3RoZXIKLSAgIHN0cmluZyBhbmQgdGhlIHBhcnNlciB3aWxsIGJlIGludm9rZWQgcmVjdXJzaXZlbHkuICBUaGUgb3V0cHV0IHN0cmluZwotICAgbWF5IGNvbnRhaW4gZnVydGhlciBtYWNybyBpbnZvY2F0aW9ucy4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICogY2dlbl9leHBhbmRfbWFjcm9faW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBzdHJ1Y3QgY2dlbl9taW5zbl9leHBhbnNpb24gKiwKLQkgICAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGludCAqLCBDR0VOX09QRVJBTkQgKiopKTsKLQwKLS8qIFRoZSBhc3NlbWJsZXIgaW5zbiB0YWJsZSBpcyBoYXNoZWQgYmFzZWQgb24gc29tZSBmdW5jdGlvbiBvZiB0aGUgbW5lbW9uaWMKLSAgICh0aGUgYWN0dWFsbHkgaGFzaGluZyBkb25lIGlzIHVwIHRvIHRoZSB0YXJnZXQsIGJ1dCB3ZSBwcm92aWRlIGEgZmV3Ci0gICBleGFtcGxlcyBsaWtlIHRoZSBmaXJzdCBsZXR0ZXIgb3IgYSBmdW5jdGlvbiBvZiB0aGUgZW50aXJlIG1uZW1vbmljKS4gICovCi0KLWV4dGVybiBDR0VOX0lOU05fTElTVCAqIGNnZW5fYXNtX2xvb2t1cF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKikpOwotI2RlZmluZSBDR0VOX0FTTV9MT09LVVBfSU5TTihjZCwgc3RyaW5nKSBjZ2VuX2FzbV9sb29rdXBfaW5zbiAoKGNkKSwgKHN0cmluZykpCi0jZGVmaW5lIENHRU5fQVNNX05FWFRfSU5TTihpbnNuKSAoKGluc24pLT5uZXh0KQotCi0vKiBUaGUgZGlzYXNzZW1ibGVyIGluc24gdGFibGUgaXMgaGFzaGVkIGJhc2VkIG9uIHNvbWUgZnVuY3Rpb24gb2YgbWFjaGluZQotICAgaW5zdHJ1Y3Rpb24gKHRoZSBhY3R1YWxseSBoYXNoaW5nIGRvbmUgaXMgdXAgdG8gdGhlIHRhcmdldCkuICAqLwotCi1leHRlcm4gQ0dFTl9JTlNOX0xJU1QgKiBjZ2VuX2Rpc19sb29rdXBfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLS8qIEZJWE1FOiBkZWxldGUgdGhlc2UgdHdvICovCi0jZGVmaW5lIENHRU5fRElTX0xPT0tVUF9JTlNOKGNkLCBidWYsIHZhbHVlKSBjZ2VuX2Rpc19sb29rdXBfaW5zbiAoKGNkKSwgKGJ1ZiksICh2YWx1ZSkpCi0jZGVmaW5lIENHRU5fRElTX05FWFRfSU5TTihpbnNuKSAoKGluc24pLT5uZXh0KQotDAotLyogVGhlIENQVSBkZXNjcmlwdGlvbi4KLSAgIEEgY29weSBvZiB0aGlzIGlzIGNyZWF0ZWQgd2hlbiB0aGUgY3B1IHRhYmxlIGlzICJvcGVuZWQiLgotICAgQWxsIGdsb2JhbCBzdGF0ZSBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZCBoZXJlLgotICAgQWNjZXNzIG1hY3JvcyBhcmUgcHJvdmlkZWQgZm9yICJwdWJsaWMiIG1lbWJlcnMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2NwdV9kZXNjCi17Ci0gIC8qIEJpdG1hcCBvZiBzZWxlY3RlZCBtYWNoaW5lKHMpIChhIGxhIEJGRCBtYWNoaW5lIG51bWJlcikuICAqLwotICBpbnQgbWFjaHM7Ci0KLSAgLyogQml0bWFwIG9mIHNlbGVjdGVkIGlzYShzKS4KLSAgICAgPz8/IFNpbXVsdGFuZW91cyBtdWx0aXBsZSBpc2FzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlLCBidXQgaXQncyBub3QgKHlldCkKLSAgICAgcHJlY2x1ZGVkLiAgKi8KLSAgaW50IGlzYXM7Ci0KLSAgLyogQ3VycmVudCBlbmRpYW4uICAqLwotICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbjsKLSNkZWZpbmUgQ0dFTl9DUFVfRU5ESUFOKGNkKSAoKGNkKS0+ZW5kaWFuKQotCi0gIC8qIEN1cnJlbnQgaW5zbiBlbmRpYW4uICAqLwotICBlbnVtIGNnZW5fZW5kaWFuIGluc25fZW5kaWFuOwotI2RlZmluZSBDR0VOX0NQVV9JTlNOX0VORElBTihjZCkgKChjZCktPmluc25fZW5kaWFuKQotCi0gIC8qIFdvcmQgc2l6ZSAoaW4gYml0cykuICAqLwotICAvKiA/Pz8gT3IgbWF5YmUgbWF4aW11bSB3b3JkIHNpemUgLSBtaWdodCB3ZSBldmVyIG5lZWQgdG8gYWxsb3cgYSBjcHUgdGFibGUKLSAgICAgdG8gYmUgb3BlbmVkIGZvciBib3RoIHNwYXJjMzIvc3BhcmM2ND8KLSAgICAgPz8/IEFub3RoZXIgYWx0ZXJuYXRpdmUgaXMgdG8gY3JlYXRlIGEgdGFibGUgb2Ygc2VsZWN0ZWQgbWFjaHMgYW5kCi0gICAgIGxhemlseSBmZXRjaCB0aGUgZGF0YSBmcm9tIHRoZXJlLiAgKi8KLSAgdW5zaWduZWQgaW50IHdvcmRfYml0c2l6ZTsKLQotICAvKiBJbmRpY2F0b3IgaWYgc2l6ZXMgYXJlIHVua25vd24uCi0gICAgIFRoaXMgaXMgdXNlZCBieSBkZWZhdWx0X2luc25fYml0c2l6ZSxiYXNlX2luc25fYml0c2l6ZSBpZiB0aGVyZSBpcyBhCi0gICAgIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgaXNhJ3MuICAqLwotI2RlZmluZSBDR0VOX1NJWkVfVU5LTk9XTiA2NTUzNQotCi0gIC8qIERlZmF1bHQgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHdoZW4gaXQgZW5jb3VudGVycyBhbiB1bmtub3duIGluc24uICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogQmFzZSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4KLSAgICAgRm9yIG5vbi1MSVcgY3B1cyB0aGlzIGlzIGdlbmVyYWxseSB0aGUgbGVuZ3RoIG9mIHRoZSBzbWFsbGVzdCBpbnNuLgotICAgICBGb3IgTElXIGNwdXMgaXRzIHdpcCAod29yay1pbi1wcm9ncmVzcykuICBGb3IgdGhlIG0zMnIgaXRzIDMyLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2VfaW5zbl9iaXRzaXplOwotCi0gIC8qIE1pbmltdW0vbWF4aW11bSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4gICovCi0gIHVuc2lnbmVkIGludCBtaW5faW5zbl9iaXRzaXplOwotICB1bnNpZ25lZCBpbnQgbWF4X2luc25fYml0c2l6ZTsKLQotICAvKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotICBjb25zdCBDR0VOX0lTQSAqaXNhX3RhYmxlOwotCi0gIC8qIE1hY2hpbmUgdmFyaWFudHMuICAqLwotICBjb25zdCBDR0VOX01BQ0ggKm1hY2hfdGFibGU7Ci0KLSAgLyogSGFyZHdhcmUgZWxlbWVudHMuICAqLwotICBDR0VOX0hXX1RBQkxFIGh3X3RhYmxlOwotCi0gIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovCi0gIGNvbnN0IENHRU5fSUZMRCAqaWZsZF90YWJsZTsKLQotICAvKiBPcGVyYW5kcy4gICovCi0gIENHRU5fT1BFUkFORF9UQUJMRSBvcGVyYW5kX3RhYmxlOwotCi0gIC8qIE1haW4gaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotICBDR0VOX0lOU05fVEFCTEUgaW5zbl90YWJsZTsKLSNkZWZpbmUgQ0dFTl9DUFVfSU5TTl9UQUJMRShjZCkgKCYgKGNkKS0+aW5zbl90YWJsZSkKLQotICAvKiBNYWNybyBpbnN0cnVjdGlvbnMgYXJlIGRlZmluZWQgc2VwYXJhdGVseSBhbmQgYXJlIGNvbWJpbmVkIHdpdGggcmVhbAotICAgICBpbnNucyBkdXJpbmcgaGFzaCB0YWJsZSBjb21wdXRhdGlvbi4gICovCi0gIENHRU5fSU5TTl9UQUJMRSBtYWNyb19pbnNuX3RhYmxlOwotCi0gIC8qIENvcHkgb2YgQ0dFTl9JTlRfSU5TTl9QLiAgKi8KLSAgaW50IGludF9pbnNuX3A7Ci0KLSAgLyogQ2FsbGVkIHRvIHJlYnVpbGQgdGhlIHRhYmxlcyBhZnRlciBzb21ldGhpbmcgaGFzIGNoYW5nZWQuICAqLwotICB2b2lkICgqcmVidWlsZF90YWJsZXMpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQotICAvKiBPcGVyYW5kIHBhcnNlciBjYWxsYmFjay4gICovCi0gIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiAqIHBhcnNlX29wZXJhbmRfZm47Ci0KLSAgLyogUGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgY292ZXIgZm5zIGZvciBvcGVyYW5kcy4gICovCi0gIGNvbnN0IGNoYXIgKiAoKnBhcnNlX29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgY29uc3QgY2hhciAqKiwKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotI2lmZGVmIEJGRF9WRVJTSU9OCi0gIGNvbnN0IGNoYXIgKiAoKmluc2VydF9vcGVyYW5kKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIENHRU5fRklFTERTICpmaWVsZHNfLAotCSAgICAgIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEgcGNfKSk7Ci0gIGludCAoKmV4dHJhY3Rfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBiZmRfdm1hIHBjXykpOwotICB2b2lkICgqcHJpbnRfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBQVFIgaW5mb18sIENHRU5fRklFTERTICogZmllbGRzXywKLQkgICAgICB2b2lkIGNvbnN0ICphdHRyc18sIGJmZF92bWEgcGNfLCBpbnQgbGVuZ3RoXykpOwotI2Vsc2UKLSAgY29uc3QgY2hhciAqICgqaW5zZXJ0X29wZXJhbmQpICgpOwotICBpbnQgKCpleHRyYWN0X29wZXJhbmQpICgpOwotICB2b2lkICgqcHJpbnRfb3BlcmFuZCkgKCk7Ci0jZW5kaWYKLSNkZWZpbmUgQ0dFTl9DUFVfUEFSU0VfT1BFUkFORChjZCkgKChjZCktPnBhcnNlX29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX0lOU0VSVF9PUEVSQU5EKGNkKSAoKGNkKS0+aW5zZXJ0X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX0VYVFJBQ1RfT1BFUkFORChjZCkgKChjZCktPmV4dHJhY3Rfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfUFJJTlRfT1BFUkFORChjZCkgKChjZCktPnByaW50X29wZXJhbmQpCi0KLSAgLyogU2l6ZSBvZiBDR0VOX0ZJRUxEUyBzdHJ1Y3QuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZW9mX2ZpZWxkczsKLSNkZWZpbmUgQ0dFTl9DUFVfU0laRU9GX0ZJRUxEUyhjZCkgKChjZCktPnNpemVvZl9maWVsZHMpCi0KLSAgLyogU2V0IHRoZSBiaXRzaXplIGZpZWxkLiAgKi8KLSAgdm9pZCAoKnNldF9maWVsZHNfYml0c2l6ZSkgUEFSQU1TICgoQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGludCBzaXplXykpOwotI2RlZmluZSBDR0VOX0NQVV9TRVRfRklFTERTX0JJVFNJWkUoY2QpICgoY2QpLT5zZXRfZmllbGRzX2JpdHNpemUpCi0KLSAgLyogQ0dFTl9GSUVMRFMgYWNjZXNzb3JzLiAgKi8KLSAgaW50ICgqZ2V0X2ludF9vcGVyYW5kKQotICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgY29uc3QgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLSAgdm9pZCAoKnNldF9pbnRfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgdmFsdWVfKSk7Ci0jaWZkZWYgQkZEX1ZFUlNJT04KLSAgYmZkX3ZtYSAoKmdldF92bWFfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0gIHZvaWQgKCpzZXRfdm1hX29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSB2YWx1ZV8pKTsKLSNlbHNlCi0gIGxvbmcgKCpnZXRfdm1hX29wZXJhbmQpICgpOwotICB2b2lkICgqc2V0X3ZtYV9vcGVyYW5kKSAoKTsKLSNlbmRpZgotI2RlZmluZSBDR0VOX0NQVV9HRVRfSU5UX09QRVJBTkQoY2QpICgoY2QpLT5nZXRfaW50X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX1NFVF9JTlRfT1BFUkFORChjZCkgKChjZCktPnNldF9pbnRfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfR0VUX1ZNQV9PUEVSQU5EKGNkKSAoKGNkKS0+Z2V0X3ZtYV9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9TRVRfVk1BX09QRVJBTkQoY2QpICgoY2QpLT5zZXRfdm1hX29wZXJhbmQpCi0KLSAgLyogSW5zdHJ1Y3Rpb24gcGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgaGFuZGxlcnMuICAqLwotICAvKiBGSVhNRTogbWFrZSB0aGVzZSB0eXBlcyB1cHBlcmNhc2UuICAqLwotICBjZ2VuX3BhcnNlX2ZuICogY29uc3QgKnBhcnNlX2hhbmRsZXJzOwotICBjZ2VuX2luc2VydF9mbiAqIGNvbnN0ICppbnNlcnRfaGFuZGxlcnM7Ci0gIGNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0ICpleHRyYWN0X2hhbmRsZXJzOwotICBjZ2VuX3ByaW50X2ZuICogY29uc3QgKnByaW50X2hhbmRsZXJzOwotI2RlZmluZSBDR0VOX1BBUlNFX0ZOKGNkLCBpbnNuKSAgIChjZC0+cGFyc2VfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLnBhcnNlXSkKLSNkZWZpbmUgQ0dFTl9JTlNFUlRfRk4oY2QsIGluc24pICAoY2QtPmluc2VydF9oYW5kbGVyc1soaW5zbiktPm9wY29kZS0+aGFuZGxlcnMuaW5zZXJ0XSkKLSNkZWZpbmUgQ0dFTl9FWFRSQUNUX0ZOKGNkLCBpbnNuKSAoY2QtPmV4dHJhY3RfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLmV4dHJhY3RdKQotI2RlZmluZSBDR0VOX1BSSU5UX0ZOKGNkLCBpbnNuKSAgIChjZC0+cHJpbnRfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLnByaW50XSkKLQotICAvKiBSZXR1cm4gbm9uLXplcm8gaWYgaW5zbiBzaG91bGQgYmUgYWRkZWQgdG8gaGFzaCB0YWJsZS4gICovCi0gIGludCAoKiBhc21faGFzaF9wKSBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotCi0gIC8qIEFzc2VtYmxlciBoYXNoIGZ1bmN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50ICgqIGFzbV9oYXNoKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBhc3NlbWJsZXIgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBhc21faGFzaF9zaXplOwotCi0gIC8qIFJldHVybiBub24temVybyBpZiBpbnNuIHNob3VsZCBiZSBhZGRlZCB0byBoYXNoIHRhYmxlLiAgKi8KLSAgaW50ICgqIGRpc19oYXNoX3ApIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci0KLSAgLyogRGlzYXNzZW1ibGVyIGhhc2ggZnVuY3Rpb24uICAqLwotICB1bnNpZ25lZCBpbnQgKCogZGlzX2hhc2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOwotCi0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGRpc2Fzc2VtYmxlciBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IGRpc19oYXNoX3NpemU7Ci0KLSAgLyogQXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotICBDR0VOX0lOU05fTElTVCAqKmFzbV9oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqYXNtX2hhc2hfdGFibGVfZW50cmllczsKLQotICAvKiBEaXNhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0gIENHRU5fSU5TTl9MSVNUICoqZGlzX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICpkaXNfaGFzaF90YWJsZV9lbnRyaWVzOwotfSBDR0VOX0NQVV9UQUJMRTsKLQotLyogd2lwICovCi0jaWZuZGVmIENHRU5fV09SRF9FTkRJQU4KLSNkZWZpbmUgQ0dFTl9XT1JEX0VORElBTihjZCkgQ0dFTl9DUFVfRU5ESUFOIChjZCkKLSNlbmRpZgotI2lmbmRlZiBDR0VOX0lOU05fV09SRF9FTkRJQU4KLSNkZWZpbmUgQ0dFTl9JTlNOX1dPUkRfRU5ESUFOKGNkKSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpCi0jZW5kaWYKLQwKLS8qIFByb3RvdHlwZXMgb2YgbWFqb3IgZnVuY3Rpb25zLiAgKi8KLS8qIEZJWE1FOiBNb3ZlIG1vcmUgQ0dFTl9TWU0tZGVmaW5lZCBmdW5jdGlvbnMgaW50byBDR0VOX0NQVV9ERVNDLgotICAgTm90IHRoZSBpbml0IGZucyB0aG91Z2gsIGFzIHRoYXQgd291bGQgZHJhZyBpbiB0aGluZ3MgdGhhdCBtaWdodG4ndCBiZQotICAgdXNlZCBhbmQgbWlnaHQgbm90IGV2ZW4gZXhpc3QuICAqLwotCi0vKiBBcmd1bWVudCB0eXBlcyB0byBjcHVfb3Blbi4gICovCi0KLWVudW0gY2dlbl9jcHVfb3Blbl9hcmcgewotICBDR0VOX0NQVV9PUEVOX0VORCwKLSAgLyogU2VsZWN0IGluc3RydWN0aW9uIHNldChzKSwgYXJnIGlzIGJpdG1hcCBvciAwIG1lYW5pbmcgInVuc3BlY2lmaWVkIi4gICovCi0gIENHRU5fQ1BVX09QRU5fSVNBUywKLSAgLyogU2VsZWN0IG1hY2hpbmUocyksIGFyZyBpcyBiaXRtYXAgb3IgMCBtZWFuaW5nICJ1bnNwZWNpZmllZCIuICAqLwotICBDR0VOX0NQVV9PUEVOX01BQ0hTLAotICAvKiBTZWxlY3QgbWFjaGluZSwgYXJnIGlzIG1hY2gncyBiZmQgbmFtZS4KLSAgICAgTXVsdGlwbGUgbWFjaGluZXMgY2FuIGJlIHNwZWNpZmllZCBieSByZXBlYXRlZCB1c2UuICAqLwotICBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsCi0gIC8qIFNlbGVjdCBlbmRpYW4sIGFyZyBpcyBDR0VOX0VORElBTl8qLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4KLX07Ci0KLS8qIE9wZW4gYSBjcHUgZGVzY3JpcHRvciB0YWJsZSBmb3IgdXNlLgotICAgPz8/IFdlIG9ubHkgc3VwcG9ydCBJU08gQyBzdGRhcmdzIGhlcmUsIG5vdCBLJlIuCi0gICBMYXppbmVzcywgcGx1cyBleHBlcmltZW50IHRvIHNlZSBpZiBhbnl0aGluZyByZXF1aXJlcyBLJlIgLSBldmVudHVhbGx5Ci0gICBLJlIgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIC0gZS5nLiBHREIgaXMgY3VycmVudGx5IHRyeWluZyB0aGlzLiAgKi8KLQotZXh0ZXJuIENHRU5fQ1BVX0RFU0MgQ0dFTl9TWU0gKGNwdV9vcGVuKSAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZywgLi4uKTsKLQotLyogQ292ZXIgZm4gdG8gaGFuZGxlIHNpbXBsZSBjYXNlLiAgKi8KLQotZXh0ZXJuIENHRU5fQ1BVX0RFU0MgQ0dFTl9TWU0gKGNwdV9vcGVuXzEpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1hY2hfbmFtZV8sCi0JCQkJCQkgICAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW5fKSk7Ci0KLS8qIENsb3NlIGl0LiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGNwdV9jbG9zZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBvcGNvZGUgdGFibGUgZm9yIHVzZS4KLSAgIENhbGxlZCBieSBpbml0X2FzbS9pbml0X2Rpcy4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X29wY29kZV90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgaWJsZCB0YWJsZSBmb3IgdXNlLgotICAgQ2FsbGVkIGJ5IGluaXRfYXNtL2luaXRfZGlzLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfaWJsZF90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogSW5pdGlhbGl6ZSBhbiBjcHUgdGFibGUgZm9yIGFzc2VtYmxlciBvciBkaXNhc3NlbWJsZXIgdXNlLgotICAgVGhlc2UgbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3B1X29wZW4uICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9hc20pIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X2RpcykgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGZvciB1c2UuICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9vcGluc3RfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7Ci0KLS8qIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uLiAgKi8KLQotZXh0ZXJuIGNvbnN0IENHRU5fSU5TTiAqIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICosIENHRU5fRklFTERTICosCi0JICAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgY2hhciAqKikpOwotCi1leHRlcm4gY29uc3QgQ0dFTl9LRVlXT1JEIENHRU5fU1lNIChvcGVyYW5kX21hY2gpOwotZXh0ZXJuIGludCBDR0VOX1NZTSAoZ2V0X21hY2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBPcGVyYW5kIGluZGV4IGNvbXB1dGF0aW9uLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0lOU04gKiBjZ2VuX2xvb2t1cF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqIGluc25fLAotCSAgICAgIENHRU5fSU5TTl9JTlQgaW50X3ZhbHVlXywgdW5zaWduZWQgY2hhciAqYnl0ZXNfdmFsdWVfLAotCSAgICAgIGludCBsZW5ndGhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IGFsaWFzX3BfKSk7Ci1leHRlcm4gdm9pZCBjZ2VuX2dldF9pbnNuX29wZXJhbmRzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqIGluc25fLAotCSAgICAgIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgKmluZGljZXNfKSk7Ci1leHRlcm4gY29uc3QgQ0dFTl9JTlNOICogY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBDR0VOX0lOU05fSU5UIGludF92YWx1ZV8sIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX3ZhbHVlXywKLQkgICAgICBpbnQgbGVuZ3RoXywgaW50ICppbmRpY2VzXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLQotLyogQ292ZXIgZm5zIHRvIGJmZF9nZXQvc2V0LiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9JTlQgY2dlbl9nZXRfaW5zbl92YWx1ZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCB1bnNpZ25lZCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgY2dlbl9wdXRfaW5zbl92YWx1ZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCB1bnNpZ25lZCBjaGFyICosIGludCwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBSZWFkIGluIGEgY3B1IGRlc2NyaXB0aW9uIGZpbGUuCi0gICA/Pz8gRm9yIGZ1dHVyZSBjb25jZXJucywgaW5jbHVkaW5nIGFkZGluZyBpbnN0cnVjdGlvbnMgdG8gdGhlIGFzc2VtYmxlci8KLSAgIGRpc2Fzc2VtYmxlciBhdCBydW4tdGltZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICogY2dlbl9yZWFkX2NwdV9maWxlCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiBmaWxlbmFtZV8pKTsKLQotI2VuZGlmIC8qIENHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvY29udmV4LmggYi9pbmNsdWRlL29wY29kZS9jb252ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhZWViYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9jb252ZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MTEgKzAsMCBAQAotLyogSW5mb3JtYXRpb24gZm9yIGluc3RydWN0aW9uIGRpc2Fzc2VtYmx5IG9uIHRoZSBDb252ZXguCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmCUNPTlNUCi0jZGVmaW5lCUNPTlNUCi0jZW5kaWYJLyogQ09OU1QgKi8KLQotI2RlZmluZSB4eHggMAotI2RlZmluZSBycnIgMQotI2RlZmluZSByciAyCi0jZGVmaW5lIHJ4ciAzCi0jZGVmaW5lIHIgNAotI2RlZmluZSBub3BzIDUKLSNkZWZpbmUgbnIgNgotI2RlZmluZSBwY3JlbCA3Ci0jZGVmaW5lIGxyIDgKLSNkZWZpbmUgcnhsIDkKLSNkZWZpbmUgcmxyIDEwCi0jZGVmaW5lIHJybCAxMQotI2RlZmluZSBpbWwgMTIKLSNkZWZpbmUgaW1yIDEzCi0jZGVmaW5lIGExciAxNAotI2RlZmluZSBhMWwgMTUKLSNkZWZpbmUgYTJyIDE2Ci0jZGVmaW5lIGEybCAxNwotI2RlZmluZSBhMyAxOAotI2RlZmluZSBhNCAxOQotI2RlZmluZSBhNSAyMAotI2RlZmluZSBWIDEKLSNkZWZpbmUgUyAyCi0jZGVmaW5lIFZNIDMKLSNkZWZpbmUgQSA0Ci0jZGVmaW5lIFZMIDUKLSNkZWZpbmUgVlMgNgotI2RlZmluZSBWTFMgNwotI2RlZmluZSBQU1cgOAotLyogUHJldmVudCBhbiBlcnJvciBkdXJpbmcgIm1ha2UgZGVwZW5kIi4gICovCi0jaWYgIWRlZmluZWQgKFBDKQotI2RlZmluZSBQQyA5Ci0jZW5kaWYKLSNkZWZpbmUgSVRSIDEwCi0jZGVmaW5lIFZWIDExCi0jZGVmaW5lIElUU1IgMTIKLSNkZWZpbmUgVE9DIDEzCi0jZGVmaW5lIENJUiAxNAotI2RlZmluZSBUVFIgMTUKLSNkZWZpbmUgVk1VIDE2Ci0jZGVmaW5lIFZNTCAxNwotI2RlZmluZSBJQ1IgMTgKLSNkZWZpbmUgVENQVSAxOQotI2RlZmluZSBDUFVJRCAyMAotI2RlZmluZSBUSUQgMjEKLQotQ09OU1QgY2hhciAqb3BbXSA9IHsKLSAgIiIsCi0gICJ2MFwwdjFcMHYyXDB2M1wwdjRcMHY1XDB2NlwwdjciLAotICAiczBcMHMxXDBzMlwwczNcMHM0XDBzNVwwczZcMHM3IiwKLSAgInZtIiwKLSAgInNwXDBhMVwwYTJcMGEzXDBhNFwwYTVcMGFwXDBmcCIsCi0gICJ2bCIsCi0gICJ2cyIsCi0gICJ2bHMiLAotICAicHN3IiwKLSAgInBjIiwKLSAgIml0ciIsCi0gICJ2diIsCi0gICJpdHNyIiwKLSAgInRvYyIsCi0gICJjaXIiLAotICAidHRyIiwKLSAgInZtdSIsCi0gICJ2bWwiLAotICAiaWNyIiwKLSAgInRjcHUiLAotICAiY3B1aWQiLAotICAidGlkIiwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDBbXSA9IHsKLSAgezAsMCxycnIsVixTLFN9LAkvKiBtb3YgKi8KLSAgezAsMCxycnIsUyxTLFZ9LAkvKiBtb3YgKi8KLSAgezEsMSxycnIsVixWLFZ9LAkvKiBtZXJnLnQgKi8KLSAgezIsMSxycnIsVixWLFZ9LAkvKiBtYXNrLnQgKi8KLSAgezEsMixycnIsVixTLFZ9LAkvKiBtZXJnLmYgKi8KLSAgezIsMixycnIsVixTLFZ9LAkvKiBtYXNrLmYgKi8KLSAgezEsMSxycnIsVixTLFZ9LAkvKiBtZXJnLnQgKi8KLSAgezIsMSxycnIsVixTLFZ9LAkvKiBtYXNrLnQgKi8KLSAgezMsMyxycnIsVixWLFZ9LAkvKiBtdWwucyAqLwotICB7Myw0LHJycixWLFYsVn0sCS8qIG11bC5kICovCi0gIHs0LDMscnJyLFYsVixWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsVixWLFZ9LAkvKiBkaXYuZCAqLwotICB7MywzLHJycixWLFMsVn0sCS8qIG11bC5zICovCi0gIHszLDQscnJyLFYsUyxWfSwJLyogbXVsLmQgKi8KLSAgezQsMyxycnIsVixTLFZ9LAkvKiBkaXYucyAqLwotICB7NCw0LHJycixWLFMsVn0sCS8qIGRpdi5kICovCi0gIHs1LDAscnJyLFYsVixWfSwJLyogYW5kICovCi0gIHs2LDAscnJyLFYsVixWfSwJLyogb3IgKi8KLSAgezcsMCxycnIsVixWLFZ9LAkvKiB4b3IgKi8KLSAgezgsMCxycnIsVixWLFZ9LAkvKiBzaGYgKi8KLSAgezUsMCxycnIsVixTLFZ9LAkvKiBhbmQgKi8KLSAgezYsMCxycnIsVixTLFZ9LAkvKiBvciAqLwotICB7NywwLHJycixWLFMsVn0sCS8qIHhvciAqLwotICB7OCwwLHJycixWLFMsVn0sCS8qIHNoZiAqLwotICB7OSwzLHJycixWLFYsVn0sCS8qIGFkZC5zICovCi0gIHs5LDQscnJyLFYsVixWfSwJLyogYWRkLmQgKi8KLSAgezEwLDMscnJyLFYsVixWfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnJyLFYsVixWfSwJLyogc3ViLmQgKi8KLSAgezksMyxycnIsVixTLFZ9LAkvKiBhZGQucyAqLwotICB7OSw0LHJycixWLFMsVn0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJycixWLFMsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixWLFMsVn0sCS8qIHN1Yi5kICovCi0gIHs5LDUscnJyLFYsVixWfSwJLyogYWRkLmIgKi8KLSAgezksNixycnIsVixWLFZ9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJycixWLFYsVn0sCS8qIGFkZC53ICovCi0gIHs5LDgscnJyLFYsVixWfSwJLyogYWRkLmwgKi8KLSAgezksNSxycnIsVixTLFZ9LAkvKiBhZGQuYiAqLwotICB7OSw2LHJycixWLFMsVn0sCS8qIGFkZC5oICovCi0gIHs5LDcscnJyLFYsUyxWfSwJLyogYWRkLncgKi8KLSAgezksOCxycnIsVixTLFZ9LAkvKiBhZGQubCAqLwotICB7MTAsNSxycnIsVixWLFZ9LAkvKiBzdWIuYiAqLwotICB7MTAsNixycnIsVixWLFZ9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycnIsVixWLFZ9LAkvKiBzdWIudyAqLwotICB7MTAsOCxycnIsVixWLFZ9LAkvKiBzdWIubCAqLwotICB7MTAsNSxycnIsVixTLFZ9LAkvKiBzdWIuYiAqLwotICB7MTAsNixycnIsVixTLFZ9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycnIsVixTLFZ9LAkvKiBzdWIudyAqLwotICB7MTAsOCxycnIsVixTLFZ9LAkvKiBzdWIubCAqLwotICB7Myw1LHJycixWLFYsVn0sCS8qIG11bC5iICovCi0gIHszLDYscnJyLFYsVixWfSwJLyogbXVsLmggKi8KLSAgezMsNyxycnIsVixWLFZ9LAkvKiBtdWwudyAqLwotICB7Myw4LHJycixWLFYsVn0sCS8qIG11bC5sICovCi0gIHszLDUscnJyLFYsUyxWfSwJLyogbXVsLmIgKi8KLSAgezMsNixycnIsVixTLFZ9LAkvKiBtdWwuaCAqLwotICB7Myw3LHJycixWLFMsVn0sCS8qIG11bC53ICovCi0gIHszLDgscnJyLFYsUyxWfSwJLyogbXVsLmwgKi8KLSAgezQsNSxycnIsVixWLFZ9LAkvKiBkaXYuYiAqLwotICB7NCw2LHJycixWLFYsVn0sCS8qIGRpdi5oICovCi0gIHs0LDcscnJyLFYsVixWfSwJLyogZGl2LncgKi8KLSAgezQsOCxycnIsVixWLFZ9LAkvKiBkaXYubCAqLwotICB7NCw1LHJycixWLFMsVn0sCS8qIGRpdi5iICovCi0gIHs0LDYscnJyLFYsUyxWfSwJLyogZGl2LmggKi8KLSAgezQsNyxycnIsVixTLFZ9LAkvKiBkaXYudyAqLwotICB7NCw4LHJycixWLFMsVn0sCS8qIGRpdi5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQxW10gPSB7Ci0gIHsxMSwwLHh4eCwwLDAsMH0sCS8qIGV4aXQgKi8KLSAgezEyLDAsYTMsMCwwLDB9LAkvKiBqbXAgKi8KLSAgezEzLDIsYTMsMCwwLDB9LAkvKiBqbXBpLmYgKi8KLSAgezEzLDEsYTMsMCwwLDB9LAkvKiBqbXBpLnQgKi8KLSAgezE0LDIsYTMsMCwwLDB9LAkvKiBqbXBhLmYgKi8KLSAgezE0LDEsYTMsMCwwLDB9LAkvKiBqbXBhLnQgKi8KLSAgezE1LDIsYTMsMCwwLDB9LAkvKiBqbXBzLmYgKi8KLSAgezE1LDEsYTMsMCwwLDB9LAkvKiBqbXBzLnQgKi8KLSAgezE2LDAsYTMsMCwwLDB9LAkvKiB0YWMgKi8KLSAgezE3LDAsYTFyLEEsMCwwfSwJLyogbGRlYSAqLwotICB7MTgsOCxhMWwsVkxTLDAsMH0sCS8qIGxkLmwgKi8KLSAgezE4LDksYTFsLFZNLDAsMH0sCS8qIGxkLnggKi8KLSAgezE5LDAsYTMsMCwwLDB9LAkvKiB0YXMgKi8KLSAgezIwLDAsYTMsMCwwLDB9LAkvKiBwc2hlYSAqLwotICB7MjEsOCxhMmwsVkxTLDAsMH0sCS8qIHN0LmwgKi8KLSAgezIxLDksYTJsLFZNLDAsMH0sCS8qIHN0LnggKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezIyLDAsYTMsMCwwLDB9LAkvKiBjYWxsICovCi0gIHsyMywwLGEzLDAsMCwwfSwJLyogY2FsbHMgKi8KLSAgezI0LDAsYTMsMCwwLDB9LAkvKiBjYWxscSAqLwotICB7MjUsMCxhMXIsQSwwLDB9LAkvKiBwZm9yayAqLwotICB7MjYsNSxhMnIsUywwLDB9LAkvKiBzdGUuYiAqLwotICB7MjYsNixhMnIsUywwLDB9LAkvKiBzdGUuaCAqLwotICB7MjYsNyxhMnIsUywwLDB9LAkvKiBzdGUudyAqLwotICB7MjYsOCxhMnIsUywwLDB9LAkvKiBzdGUubCAqLwotICB7MTgsNSxhMXIsQSwwLDB9LAkvKiBsZC5iICovCi0gIHsxOCw2LGExcixBLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsYTFyLEEsMCwwfSwJLyogbGQudyAqLwotICB7MjcsNyxhMXIsQSwwLDB9LAkvKiBpbmNyLncgKi8KLSAgezIxLDUsYTJyLEEsMCwwfSwJLyogc3QuYiAqLwotICB7MjEsNixhMnIsQSwwLDB9LAkvKiBzdC5oICovCi0gIHsyMSw3LGEycixBLDAsMH0sCS8qIHN0LncgKi8KLSAgezI3LDgsYTFyLFMsMCwwfSwJLyogaW5jci5sICovCi0gIHsxOCw1LGExcixTLDAsMH0sCS8qIGxkLmIgKi8KLSAgezE4LDYsYTFyLFMsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxhMXIsUywwLDB9LAkvKiBsZC53ICovCi0gIHsxOCw4LGExcixTLDAsMH0sCS8qIGxkLmwgKi8KLSAgezIxLDUsYTJyLFMsMCwwfSwJLyogc3QuYiAqLwotICB7MjEsNixhMnIsUywwLDB9LAkvKiBzdC5oICovCi0gIHsyMSw3LGEycixTLDAsMH0sCS8qIHN0LncgKi8KLSAgezIxLDgsYTJyLFMsMCwwfSwJLyogc3QubCAqLwotICB7MTgsNSxhMXIsViwwLDB9LAkvKiBsZC5iICovCi0gIHsxOCw2LGExcixWLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsYTFyLFYsMCwwfSwJLyogbGQudyAqLwotICB7MTgsOCxhMXIsViwwLDB9LAkvKiBsZC5sICovCi0gIHsyMSw1LGEycixWLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLFYsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsViwwLDB9LAkvKiBzdC53ICovCi0gIHsyMSw4LGEycixWLDAsMH0sCS8qIHN0LmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDJbXSA9IHsKLSAgezI4LDUscnIsQSxBLDB9LAkvKiBjdnR3LmIgKi8KLSAgezI4LDYscnIsQSxBLDB9LAkvKiBjdnR3LmggKi8KLSAgezI5LDcscnIsQSxBLDB9LAkvKiBjdnRiLncgKi8KLSAgezMwLDcscnIsQSxBLDB9LAkvKiBjdnRoLncgKi8KLSAgezI4LDUscnIsUyxTLDB9LAkvKiBjdnR3LmIgKi8KLSAgezI4LDYscnIsUyxTLDB9LAkvKiBjdnR3LmggKi8KLSAgezI5LDcscnIsUyxTLDB9LAkvKiBjdnRiLncgKi8KLSAgezMwLDcscnIsUyxTLDB9LAkvKiBjdnRoLncgKi8KLSAgezI4LDMscnIsUyxTLDB9LAkvKiBjdnR3LnMgKi8KLSAgezMxLDcscnIsUyxTLDB9LAkvKiBjdnRzLncgKi8KLSAgezMyLDMscnIsUyxTLDB9LAkvKiBjdnRkLnMgKi8KLSAgezMxLDQscnIsUyxTLDB9LAkvKiBjdnRzLmQgKi8KLSAgezMxLDgscnIsUyxTLDB9LAkvKiBjdnRzLmwgKi8KLSAgezMyLDgscnIsUyxTLDB9LAkvKiBjdnRkLmwgKi8KLSAgezMzLDMscnIsUyxTLDB9LAkvKiBjdnRsLnMgKi8KLSAgezMzLDQscnIsUyxTLDB9LAkvKiBjdnRsLmQgKi8KLSAgezM0LDAscnIsQSxBLDB9LAkvKiBsZHBhICovCi0gIHs4LDAsbnIsQSwwLDB9LAkvKiBzaGYgKi8KLSAgezE4LDYsbnIsQSwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LG5yLEEsMCwwfSwJLyogbGQudyAqLwotICB7MzMsNyxycixTLFMsMH0sCS8qIGN2dGwudyAqLwotICB7MjgsOCxycixTLFMsMH0sCS8qIGN2dHcubCAqLwotICB7MzUsMSxycixTLFMsMH0sCS8qIHBsYy50ICovCi0gIHszNiwwLHJyLFMsUywwfSwJLyogdHpjICovCi0gIHszNyw2LHJyLEEsQSwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixBLEEsMH0sCS8qIGVxLncgKi8KLSAgezM3LDYsbnIsQSwwLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LG5yLEEsMCwwfSwJLyogZXEudyAqLwotICB7MzcsNSxycixTLFMsMH0sCS8qIGVxLmIgKi8KLSAgezM3LDYscnIsUyxTLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LHJyLFMsUywwfSwJLyogZXEudyAqLwotICB7MzcsOCxycixTLFMsMH0sCS8qIGVxLmwgKi8KLSAgezM4LDYscnIsQSxBLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxycixBLEEsMH0sCS8qIGxldS53ICovCi0gIHszOCw2LG5yLEEsMCwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcsbnIsQSwwLDB9LAkvKiBsZXUudyAqLwotICB7MzgsNSxycixTLFMsMH0sCS8qIGxldS5iICovCi0gIHszOCw2LHJyLFMsUywwfSwJLyogbGV1LmggKi8KLSAgezM4LDcscnIsUyxTLDB9LAkvKiBsZXUudyAqLwotICB7MzgsOCxycixTLFMsMH0sCS8qIGxldS5sICovCi0gIHszOSw2LHJyLEEsQSwwfSwJLyogbHR1LmggKi8KLSAgezM5LDcscnIsQSxBLDB9LAkvKiBsdHUudyAqLwotICB7MzksNixucixBLDAsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LG5yLEEsMCwwfSwJLyogbHR1LncgKi8KLSAgezM5LDUscnIsUyxTLDB9LAkvKiBsdHUuYiAqLwotICB7MzksNixycixTLFMsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LHJyLFMsUywwfSwJLyogbHR1LncgKi8KLSAgezM5LDgscnIsUyxTLDB9LAkvKiBsdHUubCAqLwotICB7NDAsNixycixBLEEsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsQSxBLDB9LAkvKiBsZS53ICovCi0gIHs0MCw2LG5yLEEsMCwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxucixBLDAsMH0sCS8qIGxlLncgKi8KLSAgezQwLDUscnIsUyxTLDB9LAkvKiBsZS5iICovCi0gIHs0MCw2LHJyLFMsUywwfSwJLyogbGUuaCAqLwotICB7NDAsNyxycixTLFMsMH0sCS8qIGxlLncgKi8KLSAgezQwLDgscnIsUyxTLDB9LAkvKiBsZS5sICovCi0gIHs0MSw2LHJyLEEsQSwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixBLEEsMH0sCS8qIGx0LncgKi8KLSAgezQxLDYsbnIsQSwwLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LG5yLEEsMCwwfSwJLyogbHQudyAqLwotICB7NDEsNSxycixTLFMsMH0sCS8qIGx0LmIgKi8KLSAgezQxLDYscnIsUyxTLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LHJyLFMsUywwfSwJLyogbHQudyAqLwotICB7NDEsOCxycixTLFMsMH0sCS8qIGx0LmwgKi8KLSAgezksNyxycixTLEEsMH0sCS8qIGFkZC53ICovCi0gIHs4LDAscnIsQSxBLDB9LAkvKiBzaGYgKi8KLSAgezAsMCxycixBLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJyLFMsQSwwfSwJLyogbW92ICovCi0gIHswLDcscnIsUyxTLDB9LAkvKiBtb3YudyAqLwotICB7OCwwLHJyLFMsUywwfSwJLyogc2hmICovCi0gIHswLDAscnIsUyxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxycixBLFMsMH0sCS8qIG1vdiAqLwotICB7NSwwLHJyLEEsQSwwfSwJLyogYW5kICovCi0gIHs2LDAscnIsQSxBLDB9LAkvKiBvciAqLwotICB7NywwLHJyLEEsQSwwfSwJLyogeG9yICovCi0gIHs0MiwwLHJyLEEsQSwwfSwJLyogbm90ICovCi0gIHs1LDAscnIsUyxTLDB9LAkvKiBhbmQgKi8KLSAgezYsMCxycixTLFMsMH0sCS8qIG9yICovCi0gIHs3LDAscnIsUyxTLDB9LAkvKiB4b3IgKi8KLSAgezQyLDAscnIsUyxTLDB9LAkvKiBub3QgKi8KLSAgezQwLDMscnIsUyxTLDB9LAkvKiBsZS5zICovCi0gIHs0MCw0LHJyLFMsUywwfSwJLyogbGUuZCAqLwotICB7NDEsMyxycixTLFMsMH0sCS8qIGx0LnMgKi8KLSAgezQxLDQscnIsUyxTLDB9LAkvKiBsdC5kICovCi0gIHs5LDMscnIsUyxTLDB9LAkvKiBhZGQucyAqLwotICB7OSw0LHJyLFMsUywwfSwJLyogYWRkLmQgKi8KLSAgezEwLDMscnIsUyxTLDB9LAkvKiBzdWIucyAqLwotICB7MTAsNCxycixTLFMsMH0sCS8qIHN1Yi5kICovCi0gIHszNywzLHJyLFMsUywwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixTLFMsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDYscnIsQSxBLDB9LAkvKiBuZWcuaCAqLwotICB7NDMsNyxycixBLEEsMH0sCS8qIG5lZy53ICovCi0gIHszLDMscnIsUyxTLDB9LAkvKiBtdWwucyAqLwotICB7Myw0LHJyLFMsUywwfSwJLyogbXVsLmQgKi8KLSAgezQsMyxycixTLFMsMH0sCS8qIGRpdi5zICovCi0gIHs0LDQscnIsUyxTLDB9LAkvKiBkaXYuZCAqLwotICB7OSw2LHJyLEEsQSwwfSwJLyogYWRkLmggKi8KLSAgezksNyxycixBLEEsMH0sCS8qIGFkZC53ICovCi0gIHs5LDYsbnIsQSwwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LG5yLEEsMCwwfSwJLyogYWRkLncgKi8KLSAgezksNSxycixTLFMsMH0sCS8qIGFkZC5iICovCi0gIHs5LDYscnIsUyxTLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJyLFMsUywwfSwJLyogYWRkLncgKi8KLSAgezksOCxycixTLFMsMH0sCS8qIGFkZC5sICovCi0gIHsxMCw2LHJyLEEsQSwwfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnIsQSxBLDB9LAkvKiBzdWIudyAqLwotICB7MTAsNixucixBLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LG5yLEEsMCwwfSwJLyogc3ViLncgKi8KLSAgezEwLDUscnIsUyxTLDB9LAkvKiBzdWIuYiAqLwotICB7MTAsNixycixTLFMsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LHJyLFMsUywwfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnIsUyxTLDB9LAkvKiBzdWIubCAqLwotICB7Myw2LHJyLEEsQSwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxycixBLEEsMH0sCS8qIG11bC53ICovCi0gIHszLDYsbnIsQSwwLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LG5yLEEsMCwwfSwJLyogbXVsLncgKi8KLSAgezMsNSxycixTLFMsMH0sCS8qIG11bC5iICovCi0gIHszLDYscnIsUyxTLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LHJyLFMsUywwfSwJLyogbXVsLncgKi8KLSAgezMsOCxycixTLFMsMH0sCS8qIG11bC5sICovCi0gIHs0LDYscnIsQSxBLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJyLEEsQSwwfSwJLyogZGl2LncgKi8KLSAgezQsNixucixBLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsbnIsQSwwLDB9LAkvKiBkaXYudyAqLwotICB7NCw1LHJyLFMsUywwfSwJLyogZGl2LmIgKi8KLSAgezQsNixycixTLFMsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcscnIsUyxTLDB9LAkvKiBkaXYudyAqLwotICB7NCw4LHJyLFMsUywwfSwJLyogZGl2LmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDNbXSA9IHsKLSAgezMyLDMscnIsVixWLDB9LAkvKiBjdnRkLnMgKi8KLSAgezMxLDQscnIsVixWLDB9LAkvKiBjdnRzLmQgKi8KLSAgezMzLDQscnIsVixWLDB9LAkvKiBjdnRsLmQgKi8KLSAgezMyLDgscnIsVixWLDB9LAkvKiBjdnRkLmwgKi8KLSAgezAsMCxycmwsUyxTLFZNfSwJLyogbW92ICovCi0gIHswLDAscmxyLFMsVk0sU30sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NDQsMCxycixTLFMsMH0sCS8qIGxvcCAqLwotICB7MzYsMCxycixWLFYsMH0sCS8qIHR6YyAqLwotICB7NDQsMCxycixWLFYsMH0sCS8qIGxvcCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NDIsMCxycixWLFYsMH0sCS8qIG5vdCAqLwotICB7OCwwLHJyLFMsViwwfSwJLyogc2hmICovCi0gIHszNSwxLHJyLFYsViwwfSwJLyogcGxjLnQgKi8KLSAgezQ1LDIscnIsVixWLDB9LAkvKiBjcHJzLmYgKi8KLSAgezQ1LDEscnIsVixWLDB9LAkvKiBjcHJzLnQgKi8KLSAgezM3LDMscnIsVixWLDB9LAkvKiBlcS5zICovCi0gIHszNyw0LHJyLFYsViwwfSwJLyogZXEuZCAqLwotICB7NDMsMyxycixWLFYsMH0sCS8qIG5lZy5zICovCi0gIHs0Myw0LHJyLFYsViwwfSwJLyogbmVnLmQgKi8KLSAgezM3LDMscnIsUyxWLDB9LAkvKiBlcS5zICovCi0gIHszNyw0LHJyLFMsViwwfSwJLyogZXEuZCAqLwotICB7NDMsMyxycixTLFMsMH0sCS8qIG5lZy5zICovCi0gIHs0Myw0LHJyLFMsUywwfSwJLyogbmVnLmQgKi8KLSAgezQwLDMscnIsVixWLDB9LAkvKiBsZS5zICovCi0gIHs0MCw0LHJyLFYsViwwfSwJLyogbGUuZCAqLwotICB7NDEsMyxycixWLFYsMH0sCS8qIGx0LnMgKi8KLSAgezQxLDQscnIsVixWLDB9LAkvKiBsdC5kICovCi0gIHs0MCwzLHJyLFMsViwwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixTLFYsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsUyxWLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFMsViwwfSwJLyogbHQuZCAqLwotICB7MzcsNSxycixWLFYsMH0sCS8qIGVxLmIgKi8KLSAgezM3LDYscnIsVixWLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LHJyLFYsViwwfSwJLyogZXEudyAqLwotICB7MzcsOCxycixWLFYsMH0sCS8qIGVxLmwgKi8KLSAgezM3LDUscnIsUyxWLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFMsViwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixTLFYsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsUyxWLDB9LAkvKiBlcS5sICovCi0gIHs0MCw1LHJyLFYsViwwfSwJLyogbGUuYiAqLwotICB7NDAsNixycixWLFYsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsVixWLDB9LAkvKiBsZS53ICovCi0gIHs0MCw4LHJyLFYsViwwfSwJLyogbGUubCAqLwotICB7NDAsNSxycixTLFYsMH0sCS8qIGxlLmIgKi8KLSAgezQwLDYscnIsUyxWLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLFMsViwwfSwJLyogbGUudyAqLwotICB7NDAsOCxycixTLFYsMH0sCS8qIGxlLmwgKi8KLSAgezQxLDUscnIsVixWLDB9LAkvKiBsdC5iICovCi0gIHs0MSw2LHJyLFYsViwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixWLFYsMH0sCS8qIGx0LncgKi8KLSAgezQxLDgscnIsVixWLDB9LAkvKiBsdC5sICovCi0gIHs0MSw1LHJyLFMsViwwfSwJLyogbHQuYiAqLwotICB7NDEsNixycixTLFYsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsUyxWLDB9LAkvKiBsdC53ICovCi0gIHs0MSw4LHJyLFMsViwwfSwJLyogbHQubCAqLwotICB7NDMsNSxycixWLFYsMH0sCS8qIG5lZy5iICovCi0gIHs0Myw2LHJyLFYsViwwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsVixWLDB9LAkvKiBuZWcudyAqLwotICB7NDMsOCxycixWLFYsMH0sCS8qIG5lZy5sICovCi0gIHs0Myw1LHJyLFMsUywwfSwJLyogbmVnLmIgKi8KLSAgezQzLDYscnIsUyxTLDB9LAkvKiBuZWcuaCAqLwotICB7NDMsNyxycixTLFMsMH0sCS8qIG5lZy53ICovCi0gIHs0Myw4LHJyLFMsUywwfSwJLyogbmVnLmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDRbXSA9IHsKLSAgezQ2LDAsbm9wcywwLDAsMH0sCS8qIG5vcCAqLwotICB7NDcsMCxwY3JlbCwwLDAsMH0sCS8qIGJyICovCi0gIHs0OCwyLHBjcmVsLDAsMCwwfSwJLyogYnJpLmYgKi8KLSAgezQ4LDEscGNyZWwsMCwwLDB9LAkvKiBicmkudCAqLwotICB7NDksMixwY3JlbCwwLDAsMH0sCS8qIGJyYS5mICovCi0gIHs0OSwxLHBjcmVsLDAsMCwwfSwJLyogYnJhLnQgKi8KLSAgezUwLDIscGNyZWwsMCwwLDB9LAkvKiBicnMuZiAqLwotICB7NTAsMSxwY3JlbCwwLDAsMH0sCS8qIGJycy50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ1W10gPSB7Ci0gIHs1MSw1LHJyLFYsViwwfSwJLyogbGR2aS5iICovCi0gIHs1MSw2LHJyLFYsViwwfSwJLyogbGR2aS5oICovCi0gIHs1MSw3LHJyLFYsViwwfSwJLyogbGR2aS53ICovCi0gIHs1MSw4LHJyLFYsViwwfSwJLyogbGR2aS5sICovCi0gIHsyOCwzLHJyLFYsViwwfSwJLyogY3Z0dy5zICovCi0gIHszMSw3LHJyLFYsViwwfSwJLyogY3Z0cy53ICovCi0gIHsyOCw4LHJyLFYsViwwfSwJLyogY3Z0dy5sICovCi0gIHszMyw3LHJyLFYsViwwfSwJLyogY3Z0bC53ICovCi0gIHs1Miw1LHJ4cixWLFYsMH0sCS8qIHN0dmkuYiAqLwotICB7NTIsNixyeHIsVixWLDB9LAkvKiBzdHZpLmggKi8KLSAgezUyLDcscnhyLFYsViwwfSwJLyogc3R2aS53ICovCi0gIHs1Miw4LHJ4cixWLFYsMH0sCS8qIHN0dmkubCAqLwotICB7NTIsNSxyeHIsUyxWLDB9LAkvKiBzdHZpLmIgKi8KLSAgezUyLDYscnhyLFMsViwwfSwJLyogc3R2aS5oICovCi0gIHs1Miw3LHJ4cixTLFYsMH0sCS8qIHN0dmkudyAqLwotICB7NTIsOCxyeHIsUyxWLDB9LAkvKiBzdHZpLmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDZbXSA9IHsKLSAgezUzLDAscixBLDAsMH0sCS8qIGxkc2RyICovCi0gIHs1NCwwLHIsQSwwLDB9LAkvKiBsZGtkciAqLwotICB7NTUsMyxyLFMsMCwwfSwJLyogbG4ucyAqLwotICB7NTUsNCxyLFMsMCwwfSwJLyogbG4uZCAqLwotICB7NTYsMCxub3BzLDAsMCwwfSwJLyogcGF0dSAqLwotICB7NTcsMCxyLEEsMCwwfSwJLyogcGF0ZSAqLwotICB7NTgsMCxub3BzLDAsMCwwfSwJLyogcGljaCAqLwotICB7NTksMCxub3BzLDAsMCwwfSwJLyogcGxjaCAqLwotICB7MCwwLGxyLFBTVyxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsQSxQU1csMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFBDLEEsMH0sCS8qIG1vdiAqLwotICB7NjAsMCxyLFMsMCwwfSwJLyogaWRsZSAqLwotICB7MCwwLGxyLElUUixTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxJVFIsMH0sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLHJ4bCxTLElUU1IsMH0sCS8qIG1vdiAqLwotICB7NjEsMCxub3BzLDAsMCwwfSwJLyogcnRucSAqLwotICB7NjIsMCxub3BzLDAsMCwwfSwJLyogY2ZvcmsgKi8KLSAgezYzLDAsbm9wcywwLDAsMH0sCS8qIHJ0biAqLwotICB7NjQsMCxub3BzLDAsMCwwfSwJLyogd2ZvcmsgKi8KLSAgezY1LDAsbm9wcywwLDAsMH0sCS8qIGpvaW4gKi8KLSAgezY2LDAsbm9wcywwLDAsMH0sCS8qIHJ0bmMgKi8KLSAgezY3LDMscixTLDAsMH0sCS8qIGV4cC5zICovCi0gIHs2Nyw0LHIsUywwLDB9LAkvKiBleHAuZCAqLwotICB7NjgsMyxyLFMsMCwwfSwJLyogc2luLnMgKi8KLSAgezY4LDQscixTLDAsMH0sCS8qIHNpbi5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs2OSwzLHIsUywwLDB9LAkvKiBjb3MucyAqLwotICB7NjksNCxyLFMsMCwwfSwJLyogY29zLmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezcwLDcscixBLDAsMH0sCS8qIHBzaC53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs3MSw3LHIsQSwwLDB9LAkvKiBwb3AudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NzAsNyxyLFMsMCwwfSwJLyogcHNoLncgKi8KLSAgezcwLDgscixTLDAsMH0sCS8qIHBzaC5sICovCi0gIHs3MSw3LHIsUywwLDB9LAkvKiBwb3AudyAqLwotICB7NzEsOCxyLFMsMCwwfSwJLyogcG9wLmwgKi8KLSAgezcyLDAsbm9wcywwLDAsMH0sCS8qIGVuaSAqLwotICB7NzMsMCxub3BzLDAsMCwwfSwJLyogZHNpICovCi0gIHs3NCwwLG5vcHMsMCwwLDB9LAkvKiBia3B0ICovCi0gIHs3NSwwLG5vcHMsMCwwLDB9LAkvKiBtc3luYyAqLwotICB7NzYsMCxyLFMsMCwwfSwJLyogbXNraSAqLwotICB7NzcsMCxyLFMsMCwwfSwJLyogeG10aSAqLwotICB7MCwwLHJ4bCxTLFZWLDB9LAkvKiBtb3YgKi8KLSAgezc4LDAsbm9wcywwLDAsMH0sCS8qIHRzdHZ2ICovCi0gIHswLDAsbHIsVlMsQSwwfSwJLyogbW92ICovCi0gIHswLDAscnhsLEEsVlMsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZMLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxBLFZMLDB9LAkvKiBtb3YgKi8KLSAgezAsNyxscixWUyxTLDB9LAkvKiBtb3YudyAqLwotICB7MCw3LHJ4bCxTLFZTLDB9LAkvKiBtb3YudyAqLwotICB7MCw3LGxyLFZMLFMsMH0sCS8qIG1vdi53ICovCi0gIHswLDcscnhsLFMsVkwsMH0sCS8qIG1vdi53ICovCi0gIHs3OSwwLHIsQSwwLDB9LAkvKiBkaWFnICovCi0gIHs4MCwwLG5vcHMsMCwwLDB9LAkvKiBwYmtwdCAqLwotICB7ODEsMyxyLFMsMCwwfSwJLyogc3FydC5zICovCi0gIHs4MSw0LHIsUywwLDB9LAkvKiBzcXJ0LmQgKi8KLSAgezgyLDAsbm9wcywwLDAsMH0sCS8qIGNhc3IgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezgzLDMscixTLDAsMH0sCS8qIGF0YW4ucyAqLwotICB7ODMsNCxyLFMsMCwwfSwJLyogYXRhbi5kICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ3W10gPSB7Ci0gIHs4NCw1LHIsViwwLDB9LAkvKiBzdW0uYiAqLwotICB7ODQsNixyLFYsMCwwfSwJLyogc3VtLmggKi8KLSAgezg0LDcscixWLDAsMH0sCS8qIHN1bS53ICovCi0gIHs4NCw4LHIsViwwLDB9LAkvKiBzdW0ubCAqLwotICB7ODUsMCxyLFYsMCwwfSwJLyogYWxsICovCi0gIHs4NiwwLHIsViwwLDB9LAkvKiBhbnkgKi8KLSAgezg3LDAscixWLDAsMH0sCS8qIHBhcml0eSAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7ODgsNSxyLFYsMCwwfSwJLyogbWF4LmIgKi8KLSAgezg4LDYscixWLDAsMH0sCS8qIG1heC5oICovCi0gIHs4OCw3LHIsViwwLDB9LAkvKiBtYXgudyAqLwotICB7ODgsOCxyLFYsMCwwfSwJLyogbWF4LmwgKi8KLSAgezg5LDUscixWLDAsMH0sCS8qIG1pbi5iICovCi0gIHs4OSw2LHIsViwwLDB9LAkvKiBtaW4uaCAqLwotICB7ODksNyxyLFYsMCwwfSwJLyogbWluLncgKi8KLSAgezg5LDgscixWLDAsMH0sCS8qIG1pbi5sICovCi0gIHs4NCwzLHIsViwwLDB9LAkvKiBzdW0ucyAqLwotICB7ODQsNCxyLFYsMCwwfSwJLyogc3VtLmQgKi8KLSAgezkwLDMscixWLDAsMH0sCS8qIHByb2QucyAqLwotICB7OTAsNCxyLFYsMCwwfSwJLyogcHJvZC5kICovCi0gIHs4OCwzLHIsViwwLDB9LAkvKiBtYXgucyAqLwotICB7ODgsNCxyLFYsMCwwfSwJLyogbWF4LmQgKi8KLSAgezg5LDMscixWLDAsMH0sCS8qIG1pbi5zICovCi0gIHs4OSw0LHIsViwwLDB9LAkvKiBtaW4uZCAqLwotICB7OTAsNSxyLFYsMCwwfSwJLyogcHJvZC5iICovCi0gIHs5MCw2LHIsViwwLDB9LAkvKiBwcm9kLmggKi8KLSAgezkwLDcscixWLDAsMH0sCS8qIHByb2QudyAqLwotICB7OTAsOCxyLFYsMCwwfSwJLyogcHJvZC5sICovCi0gIHszNSwyLGxyLFZNLFMsMH0sCS8qIHBsYy5mICovCi0gIHszNSwxLGxyLFZNLFMsMH0sCS8qIHBsYy50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXR4W10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQxYVtdID0gewotICB7OTEsMCxpbXIsQSwwLDB9LAkvKiBoYWx0ICovCi0gIHs5MiwwLGE0LDAsMCwwfSwJLyogc3lzYyAqLwotICB7MTgsNixpbXIsQSwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGltcixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezUsMCxpbXIsQSwwLDB9LAkvKiBhbmQgKi8KLSAgezYsMCxpbXIsQSwwLDB9LAkvKiBvciAqLwotICB7NywwLGltcixBLDAsMH0sCS8qIHhvciAqLwotICB7OCwwLGltcixBLDAsMH0sCS8qIHNoZiAqLwotICB7OSw2LGltcixBLDAsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcsaW1yLEEsMCwwfSwJLyogYWRkLncgKi8KLSAgezEwLDYsaW1yLEEsMCwwfSwJLyogc3ViLmggKi8KLSAgezEwLDcsaW1yLEEsMCwwfSwJLyogc3ViLncgKi8KLSAgezMsNixpbXIsQSwwLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LGltcixBLDAsMH0sCS8qIG11bC53ICovCi0gIHs0LDYsaW1yLEEsMCwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxpbXIsQSwwLDB9LAkvKiBkaXYudyAqLwotICB7MTgsNyxpbWwsVkwsMCwwfSwJLyogbGQudyAqLwotICB7MTgsNyxpbWwsVlMsMCwwfSwJLyogbGQudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7OCw3LGltcixTLDAsMH0sCS8qIHNoZi53ICovCi0gIHs5MywwLGE1LDAsMCwwfSwJLyogdHJhcCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MzcsNixpbXIsQSwwLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LGltcixBLDAsMH0sCS8qIGVxLncgKi8KLSAgezM4LDYsaW1yLEEsMCwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcsaW1yLEEsMCwwfSwJLyogbGV1LncgKi8KLSAgezM5LDYsaW1yLEEsMCwwfSwJLyogbHR1LmggKi8KLSAgezM5LDcsaW1yLEEsMCwwfSwJLyogbHR1LncgKi8KLSAgezQwLDYsaW1yLEEsMCwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxpbXIsQSwwLDB9LAkvKiBsZS53ICovCi0gIHs0MSw2LGltcixBLDAsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcsaW1yLEEsMCwwfSwJLyogbHQudyAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MWJbXSA9IHsKLSAgezE4LDQsaW1yLFMsMCwwfSwJLyogbGQuZCAqLwotICB7MTgsMTAsaW1yLFMsMCwwfSwJLyogbGQudSAqLwotICB7MTgsOCxpbXIsUywwLDB9LAkvKiBsZC5sICovCi0gIHsxOCw3LGltcixTLDAsMH0sCS8qIGxkLncgKi8KLSAgezUsMCxpbXIsUywwLDB9LAkvKiBhbmQgKi8KLSAgezYsMCxpbXIsUywwLDB9LAkvKiBvciAqLwotICB7NywwLGltcixTLDAsMH0sCS8qIHhvciAqLwotICB7OCwwLGltcixTLDAsMH0sCS8qIHNoZiAqLwotICB7OSw2LGltcixTLDAsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcsaW1yLFMsMCwwfSwJLyogYWRkLncgKi8KLSAgezEwLDYsaW1yLFMsMCwwfSwJLyogc3ViLmggKi8KLSAgezEwLDcsaW1yLFMsMCwwfSwJLyogc3ViLncgKi8KLSAgezMsNixpbXIsUywwLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LGltcixTLDAsMH0sCS8qIG11bC53ICovCi0gIHs0LDYsaW1yLFMsMCwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxpbXIsUywwLDB9LAkvKiBkaXYudyAqLwotICB7OSwzLGltcixTLDAsMH0sCS8qIGFkZC5zICovCi0gIHsxMCwzLGltcixTLDAsMH0sCS8qIHN1Yi5zICovCi0gIHszLDMsaW1yLFMsMCwwfSwJLyogbXVsLnMgKi8KLSAgezQsMyxpbXIsUywwLDB9LAkvKiBkaXYucyAqLwotICB7NDAsMyxpbXIsUywwLDB9LAkvKiBsZS5zICovCi0gIHs0MSwzLGltcixTLDAsMH0sCS8qIGx0LnMgKi8KLSAgezM3LDYsaW1yLFMsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxpbXIsUywwLDB9LAkvKiBlcS53ICovCi0gIHszOCw2LGltcixTLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LGltcixTLDAsMH0sCS8qIGxldS53ICovCi0gIHszOSw2LGltcixTLDAsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LGltcixTLDAsMH0sCS8qIGx0dS53ICovCi0gIHs0MCw2LGltcixTLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsaW1yLFMsMCwwfSwJLyogbGUudyAqLwotICB7NDEsNixpbXIsUywwLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LGltcixTLDAsMH0sCS8qIGx0LncgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDBbXSA9IHsKLSAgezEwLDMscnJyLFMsVixWfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnJyLFMsVixWfSwJLyogc3ViLmQgKi8KLSAgezQsMyxycnIsUyxWLFZ9LAkvKiBkaXYucyAqLwotICB7NCw0LHJycixTLFYsVn0sCS8qIGRpdi5kICovCi0gIHsxMCwxMSxycnIsUyxWLFZ9LAkvKiBzdWIucy5mICovCi0gIHsxMCwxMixycnIsUyxWLFZ9LAkvKiBzdWIuZC5mICovCi0gIHs0LDExLHJycixTLFYsVn0sCS8qIGRpdi5zLmYgKi8KLSAgezQsMTIscnJyLFMsVixWfSwJLyogZGl2LmQuZiAqLwotICB7MywxMSxycnIsVixWLFZ9LAkvKiBtdWwucy5mICovCi0gIHszLDEyLHJycixWLFYsVn0sCS8qIG11bC5kLmYgKi8KLSAgezQsMTEscnJyLFYsVixWfSwJLyogZGl2LnMuZiAqLwotICB7NCwxMixycnIsVixWLFZ9LAkvKiBkaXYuZC5mICovCi0gIHszLDExLHJycixWLFMsVn0sCS8qIG11bC5zLmYgKi8KLSAgezMsMTIscnJyLFYsUyxWfSwJLyogbXVsLmQuZiAqLwotICB7NCwxMSxycnIsVixTLFZ9LAkvKiBkaXYucy5mICovCi0gIHs0LDEyLHJycixWLFMsVn0sCS8qIGRpdi5kLmYgKi8KLSAgezUsMixycnIsVixWLFZ9LAkvKiBhbmQuZiAqLwotICB7NiwyLHJycixWLFYsVn0sCS8qIG9yLmYgKi8KLSAgezcsMixycnIsVixWLFZ9LAkvKiB4b3IuZiAqLwotICB7OCwyLHJycixWLFYsVn0sCS8qIHNoZi5mICovCi0gIHs1LDIscnJyLFYsUyxWfSwJLyogYW5kLmYgKi8KLSAgezYsMixycnIsVixTLFZ9LAkvKiBvci5mICovCi0gIHs3LDIscnJyLFYsUyxWfSwJLyogeG9yLmYgKi8KLSAgezgsMixycnIsVixTLFZ9LAkvKiBzaGYuZiAqLwotICB7OSwxMSxycnIsVixWLFZ9LAkvKiBhZGQucy5mICovCi0gIHs5LDEyLHJycixWLFYsVn0sCS8qIGFkZC5kLmYgKi8KLSAgezEwLDExLHJycixWLFYsVn0sCS8qIHN1Yi5zLmYgKi8KLSAgezEwLDEyLHJycixWLFYsVn0sCS8qIHN1Yi5kLmYgKi8KLSAgezksMTEscnJyLFYsUyxWfSwJLyogYWRkLnMuZiAqLwotICB7OSwxMixycnIsVixTLFZ9LAkvKiBhZGQuZC5mICovCi0gIHsxMCwxMSxycnIsVixTLFZ9LAkvKiBzdWIucy5mICovCi0gIHsxMCwxMixycnIsVixTLFZ9LAkvKiBzdWIuZC5mICovCi0gIHs5LDEzLHJycixWLFYsVn0sCS8qIGFkZC5iLmYgKi8KLSAgezksMTQscnJyLFYsVixWfSwJLyogYWRkLmguZiAqLwotICB7OSwxNSxycnIsVixWLFZ9LAkvKiBhZGQudy5mICovCi0gIHs5LDE2LHJycixWLFYsVn0sCS8qIGFkZC5sLmYgKi8KLSAgezksMTMscnJyLFYsUyxWfSwJLyogYWRkLmIuZiAqLwotICB7OSwxNCxycnIsVixTLFZ9LAkvKiBhZGQuaC5mICovCi0gIHs5LDE1LHJycixWLFMsVn0sCS8qIGFkZC53LmYgKi8KLSAgezksMTYscnJyLFYsUyxWfSwJLyogYWRkLmwuZiAqLwotICB7MTAsMTMscnJyLFYsVixWfSwJLyogc3ViLmIuZiAqLwotICB7MTAsMTQscnJyLFYsVixWfSwJLyogc3ViLmguZiAqLwotICB7MTAsMTUscnJyLFYsVixWfSwJLyogc3ViLncuZiAqLwotICB7MTAsMTYscnJyLFYsVixWfSwJLyogc3ViLmwuZiAqLwotICB7MTAsMTMscnJyLFYsUyxWfSwJLyogc3ViLmIuZiAqLwotICB7MTAsMTQscnJyLFYsUyxWfSwJLyogc3ViLmguZiAqLwotICB7MTAsMTUscnJyLFYsUyxWfSwJLyogc3ViLncuZiAqLwotICB7MTAsMTYscnJyLFYsUyxWfSwJLyogc3ViLmwuZiAqLwotICB7MywxMyxycnIsVixWLFZ9LAkvKiBtdWwuYi5mICovCi0gIHszLDE0LHJycixWLFYsVn0sCS8qIG11bC5oLmYgKi8KLSAgezMsMTUscnJyLFYsVixWfSwJLyogbXVsLncuZiAqLwotICB7MywxNixycnIsVixWLFZ9LAkvKiBtdWwubC5mICovCi0gIHszLDEzLHJycixWLFMsVn0sCS8qIG11bC5iLmYgKi8KLSAgezMsMTQscnJyLFYsUyxWfSwJLyogbXVsLmguZiAqLwotICB7MywxNSxycnIsVixTLFZ9LAkvKiBtdWwudy5mICovCi0gIHszLDE2LHJycixWLFMsVn0sCS8qIG11bC5sLmYgKi8KLSAgezQsMTMscnJyLFYsVixWfSwJLyogZGl2LmIuZiAqLwotICB7NCwxNCxycnIsVixWLFZ9LAkvKiBkaXYuaC5mICovCi0gIHs0LDE1LHJycixWLFYsVn0sCS8qIGRpdi53LmYgKi8KLSAgezQsMTYscnJyLFYsVixWfSwJLyogZGl2LmwuZiAqLwotICB7NCwxMyxycnIsVixTLFZ9LAkvKiBkaXYuYi5mICovCi0gIHs0LDE0LHJycixWLFMsVn0sCS8qIGRpdi5oLmYgKi8KLSAgezQsMTUscnJyLFYsUyxWfSwJLyogZGl2LncuZiAqLwotICB7NCwxNixycnIsVixTLFZ9LAkvKiBkaXYubC5mICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQxW10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHs5NCwwLGEzLDAsMCwwfSwJLyogdHN0ICovCi0gIHs5NSwwLGEzLDAsMCwwfSwJLyogbGNrICovCi0gIHs5NiwwLGEzLDAsMCwwfSwJLyogdWxrICovCi0gIHsxNywwLGExcixTLDAsMH0sCS8qIGxkZWEgKi8KLSAgezk3LDAsYTFyLEEsMCwwfSwJLyogc3Bhd24gKi8KLSAgezk4LDAsYTFyLEEsMCwwfSwJLyogbGRjbXIgKi8KLSAgezk5LDAsYTJyLEEsMCwwfSwJLyogc3RjbXIgKi8KLSAgezEwMCwwLGExcixBLDAsMH0sCS8qIHBvcHIgKi8KLSAgezEwMSwwLGEycixBLDAsMH0sCS8qIHBzaHIgKi8KLSAgezEwMiw3LGExcixBLDAsMH0sCS8qIHJjdnIudyAqLwotICB7MTAzLDcsYTJyLEEsMCwwfSwJLyogbWF0bS53ICovCi0gIHsxMDQsNyxhMnIsQSwwLDB9LAkvKiBzbmRyLncgKi8KLSAgezEwNCw4LGEycixTLDAsMH0sCS8qIHNuZHIubCAqLwotICB7MTAyLDgsYTFyLFMsMCwwfSwJLyogcmN2ci5sICovCi0gIHsxMDMsOCxhMnIsUywwLDB9LAkvKiBtYXRtLmwgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezEwNSw3LGEycixBLDAsMH0sCS8qIHB1dHIudyAqLwotICB7MTA1LDgsYTJyLFMsMCwwfSwJLyogcHV0ci5sICovCi0gIHsxMDYsNyxhMXIsQSwwLDB9LAkvKiBnZXRyLncgKi8KLSAgezEwNiw4LGExcixTLDAsMH0sCS8qIGdldHIubCAqLwotICB7MjYsMTMsYTJyLFMsMCwwfSwJLyogc3RlLmIuZiAqLwotICB7MjYsMTQsYTJyLFMsMCwwfSwJLyogc3RlLmguZiAqLwotICB7MjYsMTUsYTJyLFMsMCwwfSwJLyogc3RlLncuZiAqLwotICB7MjYsMTYsYTJyLFMsMCwwfSwJLyogc3RlLmwuZiAqLwotICB7MTA3LDcsYTJyLEEsMCwwfSwJLyogbWF0ci53ICovCi0gIHsxMDgsNyxhMnIsQSwwLDB9LAkvKiBtYXQudyAqLwotICB7MTA5LDcsYTFyLEEsMCwwfSwJLyogZ2V0LncgKi8KLSAgezExMCw3LGExcixBLDAsMH0sCS8qIHJjdi53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTEsNyxhMXIsQSwwLDB9LAkvKiBpbmMudyAqLwotICB7MTEyLDcsYTJyLEEsMCwwfSwJLyogcHV0LncgKi8KLSAgezExMyw3LGEycixBLDAsMH0sCS8qIHNuZC53ICovCi0gIHsxMDcsOCxhMnIsUywwLDB9LAkvKiBtYXRyLmwgKi8KLSAgezEwOCw4LGEycixTLDAsMH0sCS8qIG1hdC5sICovCi0gIHsxMDksOCxhMXIsUywwLDB9LAkvKiBnZXQubCAqLwotICB7MTEwLDgsYTFyLFMsMCwwfSwJLyogcmN2LmwgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezExMSw4LGExcixTLDAsMH0sCS8qIGluYy5sICovCi0gIHsxMTIsOCxhMnIsUywwLDB9LAkvKiBwdXQubCAqLwotICB7MTEzLDgsYTJyLFMsMCwwfSwJLyogc25kLmwgKi8KLSAgezE4LDEzLGExcixWLDAsMH0sCS8qIGxkLmIuZiAqLwotICB7MTgsMTQsYTFyLFYsMCwwfSwJLyogbGQuaC5mICovCi0gIHsxOCwxNSxhMXIsViwwLDB9LAkvKiBsZC53LmYgKi8KLSAgezE4LDE2LGExcixWLDAsMH0sCS8qIGxkLmwuZiAqLwotICB7MjEsMTMsYTJyLFYsMCwwfSwJLyogc3QuYi5mICovCi0gIHsyMSwxNCxhMnIsViwwLDB9LAkvKiBzdC5oLmYgKi8KLSAgezIxLDE1LGEycixWLDAsMH0sCS8qIHN0LncuZiAqLwotICB7MjEsMTYsYTJyLFYsMCwwfSwJLyogc3QubC5mICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQyW10gPSB7Ci0gIHsyOCw1LHJyLFYsViwwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLFYsViwwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLFYsViwwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLFYsViwwfSwJLyogY3Z0aC53ICovCi0gIHsyOCwxMyxycixWLFYsMH0sCS8qIGN2dHcuYi5mICovCi0gIHsyOCwxNCxycixWLFYsMH0sCS8qIGN2dHcuaC5mICovCi0gIHsyOSwxNSxycixWLFYsMH0sCS8qIGN2dGIudy5mICovCi0gIHszMCwxNSxycixWLFYsMH0sCS8qIGN2dGgudy5mICovCi0gIHszMSw4LHJyLFYsViwwfSwJLyogY3Z0cy5sICovCi0gIHszMiw3LHJyLFYsViwwfSwJLyogY3Z0ZC53ICovCi0gIHszMywzLHJyLFYsViwwfSwJLyogY3Z0bC5zICovCi0gIHsyOCw0LHJyLFYsViwwfSwJLyogY3Z0dy5kICovCi0gIHszMSwxNixycixWLFYsMH0sCS8qIGN2dHMubC5mICovCi0gIHszMiwxNSxycixWLFYsMH0sCS8qIGN2dGQudy5mICovCi0gIHszMywxMSxycixWLFYsMH0sCS8qIGN2dGwucy5mICovCi0gIHsyOCwxMixycixWLFYsMH0sCS8qIGN2dHcuZC5mICovCi0gIHsxMTQsMCxycixTLFMsMH0sCS8qIGVuYWwgKi8KLSAgezgsNyxycixTLFMsMH0sCS8qIHNoZi53ICovCi0gIHsxMTUsMCxycixTLFMsMH0sCS8qIGVuYWcgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezI4LDQscnIsUyxTLDB9LAkvKiBjdnR3LmQgKi8KLSAgezMyLDcscnIsUyxTLDB9LAkvKiBjdnRkLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwzLHJyLFMsUywwfSwJLyogZnJpbnQucyAqLwotICB7MTE2LDQscnIsUyxTLDB9LAkvKiBmcmludC5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMyxycixWLFYsMH0sCS8qIGZyaW50LnMgKi8KLSAgezExNiw0LHJyLFYsViwwfSwJLyogZnJpbnQuZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTE2LDExLHJyLFYsViwwfSwJLyogZnJpbnQucy5mICovCi0gIHsxMTYsMTIscnIsVixWLDB9LAkvKiBmcmludC5kLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezgxLDMscnIsVixWLDB9LAkvKiBzcXJ0LnMgKi8KLSAgezgxLDQscnIsVixWLDB9LAkvKiBzcXJ0LmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezgxLDExLHJyLFYsViwwfSwJLyogc3FydC5zLmYgKi8KLSAgezgxLDEyLHJyLFYsViwwfSwJLyogc3FydC5kLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDNbXSA9IHsKLSAgezMyLDExLHJyLFYsViwwfSwJLyogY3Z0ZC5zLmYgKi8KLSAgezMxLDEyLHJyLFYsViwwfSwJLyogY3Z0cy5kLmYgKi8KLSAgezMzLDEyLHJyLFYsViwwfSwJLyogY3Z0bC5kLmYgKi8KLSAgezMyLDE2LHJyLFYsViwwfSwJLyogY3Z0ZC5sLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezM2LDIscnIsVixWLDB9LAkvKiB0emMuZiAqLwotICB7NDQsMixycixWLFYsMH0sCS8qIGxvcC5mICovCi0gIHsxMTcsMixycixWLFYsMH0sCS8qIHhwbmQuZiAqLwotICB7NDIsMixycixWLFYsMH0sCS8qIG5vdC5mICovCi0gIHs4LDIscnIsUyxWLDB9LAkvKiBzaGYuZiAqLwotICB7MzUsMTcscnIsVixWLDB9LAkvKiBwbGMudC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNywxMSxycixWLFYsMH0sCS8qIGVxLnMuZiAqLwotICB7MzcsMTIscnIsVixWLDB9LAkvKiBlcS5kLmYgKi8KLSAgezQzLDExLHJyLFYsViwwfSwJLyogbmVnLnMuZiAqLwotICB7NDMsMTIscnIsVixWLDB9LAkvKiBuZWcuZC5mICovCi0gIHszNywxMSxycixTLFYsMH0sCS8qIGVxLnMuZiAqLwotICB7MzcsMTIscnIsUyxWLDB9LAkvKiBlcS5kLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezQwLDExLHJyLFYsViwwfSwJLyogbGUucy5mICovCi0gIHs0MCwxMixycixWLFYsMH0sCS8qIGxlLmQuZiAqLwotICB7NDEsMTEscnIsVixWLDB9LAkvKiBsdC5zLmYgKi8KLSAgezQxLDEyLHJyLFYsViwwfSwJLyogbHQuZC5mICovCi0gIHs0MCwxMSxycixTLFYsMH0sCS8qIGxlLnMuZiAqLwotICB7NDAsMTIscnIsUyxWLDB9LAkvKiBsZS5kLmYgKi8KLSAgezQxLDExLHJyLFMsViwwfSwJLyogbHQucy5mICovCi0gIHs0MSwxMixycixTLFYsMH0sCS8qIGx0LmQuZiAqLwotICB7MzcsMTMscnIsVixWLDB9LAkvKiBlcS5iLmYgKi8KLSAgezM3LDE0LHJyLFYsViwwfSwJLyogZXEuaC5mICovCi0gIHszNywxNSxycixWLFYsMH0sCS8qIGVxLncuZiAqLwotICB7MzcsMTYscnIsVixWLDB9LAkvKiBlcS5sLmYgKi8KLSAgezM3LDEzLHJyLFMsViwwfSwJLyogZXEuYi5mICovCi0gIHszNywxNCxycixTLFYsMH0sCS8qIGVxLmguZiAqLwotICB7MzcsMTUscnIsUyxWLDB9LAkvKiBlcS53LmYgKi8KLSAgezM3LDE2LHJyLFMsViwwfSwJLyogZXEubC5mICovCi0gIHs0MCwxMyxycixWLFYsMH0sCS8qIGxlLmIuZiAqLwotICB7NDAsMTQscnIsVixWLDB9LAkvKiBsZS5oLmYgKi8KLSAgezQwLDE1LHJyLFYsViwwfSwJLyogbGUudy5mICovCi0gIHs0MCwxNixycixWLFYsMH0sCS8qIGxlLmwuZiAqLwotICB7NDAsMTMscnIsUyxWLDB9LAkvKiBsZS5iLmYgKi8KLSAgezQwLDE0LHJyLFMsViwwfSwJLyogbGUuaC5mICovCi0gIHs0MCwxNSxycixTLFYsMH0sCS8qIGxlLncuZiAqLwotICB7NDAsMTYscnIsUyxWLDB9LAkvKiBsZS5sLmYgKi8KLSAgezQxLDEzLHJyLFYsViwwfSwJLyogbHQuYi5mICovCi0gIHs0MSwxNCxycixWLFYsMH0sCS8qIGx0LmguZiAqLwotICB7NDEsMTUscnIsVixWLDB9LAkvKiBsdC53LmYgKi8KLSAgezQxLDE2LHJyLFYsViwwfSwJLyogbHQubC5mICovCi0gIHs0MSwxMyxycixTLFYsMH0sCS8qIGx0LmIuZiAqLwotICB7NDEsMTQscnIsUyxWLDB9LAkvKiBsdC5oLmYgKi8KLSAgezQxLDE1LHJyLFMsViwwfSwJLyogbHQudy5mICovCi0gIHs0MSwxNixycixTLFYsMH0sCS8qIGx0LmwuZiAqLwotICB7NDMsMTMscnIsVixWLDB9LAkvKiBuZWcuYi5mICovCi0gIHs0MywxNCxycixWLFYsMH0sCS8qIG5lZy5oLmYgKi8KLSAgezQzLDE1LHJyLFYsViwwfSwJLyogbmVnLncuZiAqLwotICB7NDMsMTYscnIsVixWLDB9LAkvKiBuZWcubC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ0W10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ1W10gPSB7Ci0gIHs1MSwxMyxycixWLFYsMH0sCS8qIGxkdmkuYi5mICovCi0gIHs1MSwxNCxycixWLFYsMH0sCS8qIGxkdmkuaC5mICovCi0gIHs1MSwxNSxycixWLFYsMH0sCS8qIGxkdmkudy5mICovCi0gIHs1MSwxNixycixWLFYsMH0sCS8qIGxkdmkubC5mICovCi0gIHsyOCwxMSxycixWLFYsMH0sCS8qIGN2dHcucy5mICovCi0gIHszMSwxNSxycixWLFYsMH0sCS8qIGN2dHMudy5mICovCi0gIHsyOCwxNixycixWLFYsMH0sCS8qIGN2dHcubC5mICovCi0gIHszMywxNSxycixWLFYsMH0sCS8qIGN2dGwudy5mICovCi0gIHs1MiwxMyxyeHIsVixWLDB9LAkvKiBzdHZpLmIuZiAqLwotICB7NTIsMTQscnhyLFYsViwwfSwJLyogc3R2aS5oLmYgKi8KLSAgezUyLDE1LHJ4cixWLFYsMH0sCS8qIHN0dmkudy5mICovCi0gIHs1MiwxNixyeHIsVixWLDB9LAkvKiBzdHZpLmwuZiAqLwotICB7NTIsMTMscnhyLFMsViwwfSwJLyogc3R2aS5iLmYgKi8KLSAgezUyLDE0LHJ4cixTLFYsMH0sCS8qIHN0dmkuaC5mICovCi0gIHs1MiwxNSxyeHIsUyxWLDB9LAkvKiBzdHZpLncuZiAqLwotICB7NTIsMTYscnhyLFMsViwwfSwJLyogc3R2aS5sLmYgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDZbXSA9IHsKLSAgezAsMCxyeGwsUyxDSVIsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLENJUixTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUT0MsUywwfSwJLyogbW92ICovCi0gIHswLDAsbHIsQ1BVSUQsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsVFRSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUVFIsUywwfSwJLyogbW92ICovCi0gIHsxMTgsMCxub3BzLDAsMCwwfSwJLyogY3Ryc2wgKi8KLSAgezExOSwwLG5vcHMsMCwwLDB9LAkvKiBjdHJzZyAqLwotICB7MCwwLHJ4bCxTLFZNVSwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVk1VLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLFZNTCwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVk1MLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLElDUiwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsSUNSLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLFRDUFUsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFRDUFUsUywwfSwJLyogbW92ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMjAsMCxub3BzLDAsMCwwfSwJLyogc3RvcCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLHJ4bCxTLFRJRCwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVElELFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0N1tdID0gewotICB7ODQsMTMscixWLDAsMH0sCS8qIHN1bS5iLmYgKi8KLSAgezg0LDE0LHIsViwwLDB9LAkvKiBzdW0uaC5mICovCi0gIHs4NCwxNSxyLFYsMCwwfSwJLyogc3VtLncuZiAqLwotICB7ODQsMTYscixWLDAsMH0sCS8qIHN1bS5sLmYgKi8KLSAgezg1LDIscixWLDAsMH0sCS8qIGFsbC5mICovCi0gIHs4NiwyLHIsViwwLDB9LAkvKiBhbnkuZiAqLwotICB7ODcsMixyLFYsMCwwfSwJLyogcGFyaXR5LmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDEzLHIsViwwLDB9LAkvKiBtYXguYi5mICovCi0gIHs4OCwxNCxyLFYsMCwwfSwJLyogbWF4LmguZiAqLwotICB7ODgsMTUscixWLDAsMH0sCS8qIG1heC53LmYgKi8KLSAgezg4LDE2LHIsViwwLDB9LAkvKiBtYXgubC5mICovCi0gIHs4OSwxMyxyLFYsMCwwfSwJLyogbWluLmIuZiAqLwotICB7ODksMTQscixWLDAsMH0sCS8qIG1pbi5oLmYgKi8KLSAgezg5LDE1LHIsViwwLDB9LAkvKiBtaW4udy5mICovCi0gIHs4OSwxNixyLFYsMCwwfSwJLyogbWluLmwuZiAqLwotICB7ODQsMTEscixWLDAsMH0sCS8qIHN1bS5zLmYgKi8KLSAgezg0LDEyLHIsViwwLDB9LAkvKiBzdW0uZC5mICovCi0gIHs5MCwxMSxyLFYsMCwwfSwJLyogcHJvZC5zLmYgKi8KLSAgezkwLDEyLHIsViwwLDB9LAkvKiBwcm9kLmQuZiAqLwotICB7ODgsMTEscixWLDAsMH0sCS8qIG1heC5zLmYgKi8KLSAgezg4LDEyLHIsViwwLDB9LAkvKiBtYXguZC5mICovCi0gIHs4OSwxMSxyLFYsMCwwfSwJLyogbWluLnMuZiAqLwotICB7ODksMTIscixWLDAsMH0sCS8qIG1pbi5kLmYgKi8KLSAgezkwLDEzLHIsViwwLDB9LAkvKiBwcm9kLmIuZiAqLwotICB7OTAsMTQscixWLDAsMH0sCS8qIHByb2QuaC5mICovCi0gIHs5MCwxNSxyLFYsMCwwfSwJLyogcHJvZC53LmYgKi8KLSAgezkwLDE2LHIsViwwLDB9LAkvKiBwcm9kLmwuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0MFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTAsMTgscnJyLFMsVixWfSwJLyogc3ViLnMudCAqLwotICB7MTAsMTkscnJyLFMsVixWfSwJLyogc3ViLmQudCAqLwotICB7NCwxOCxycnIsUyxWLFZ9LAkvKiBkaXYucy50ICovCi0gIHs0LDE5LHJycixTLFYsVn0sCS8qIGRpdi5kLnQgKi8KLSAgezMsMTgscnJyLFYsVixWfSwJLyogbXVsLnMudCAqLwotICB7MywxOSxycnIsVixWLFZ9LAkvKiBtdWwuZC50ICovCi0gIHs0LDE4LHJycixWLFYsVn0sCS8qIGRpdi5zLnQgKi8KLSAgezQsMTkscnJyLFYsVixWfSwJLyogZGl2LmQudCAqLwotICB7MywxOCxycnIsVixTLFZ9LAkvKiBtdWwucy50ICovCi0gIHszLDE5LHJycixWLFMsVn0sCS8qIG11bC5kLnQgKi8KLSAgezQsMTgscnJyLFYsUyxWfSwJLyogZGl2LnMudCAqLwotICB7NCwxOSxycnIsVixTLFZ9LAkvKiBkaXYuZC50ICovCi0gIHs1LDEscnJyLFYsVixWfSwJLyogYW5kLnQgKi8KLSAgezYsMSxycnIsVixWLFZ9LAkvKiBvci50ICovCi0gIHs3LDEscnJyLFYsVixWfSwJLyogeG9yLnQgKi8KLSAgezgsMSxycnIsVixWLFZ9LAkvKiBzaGYudCAqLwotICB7NSwxLHJycixWLFMsVn0sCS8qIGFuZC50ICovCi0gIHs2LDEscnJyLFYsUyxWfSwJLyogb3IudCAqLwotICB7NywxLHJycixWLFMsVn0sCS8qIHhvci50ICovCi0gIHs4LDEscnJyLFYsUyxWfSwJLyogc2hmLnQgKi8KLSAgezksMTgscnJyLFYsVixWfSwJLyogYWRkLnMudCAqLwotICB7OSwxOSxycnIsVixWLFZ9LAkvKiBhZGQuZC50ICovCi0gIHsxMCwxOCxycnIsVixWLFZ9LAkvKiBzdWIucy50ICovCi0gIHsxMCwxOSxycnIsVixWLFZ9LAkvKiBzdWIuZC50ICovCi0gIHs5LDE4LHJycixWLFMsVn0sCS8qIGFkZC5zLnQgKi8KLSAgezksMTkscnJyLFYsUyxWfSwJLyogYWRkLmQudCAqLwotICB7MTAsMTgscnJyLFYsUyxWfSwJLyogc3ViLnMudCAqLwotICB7MTAsMTkscnJyLFYsUyxWfSwJLyogc3ViLmQudCAqLwotICB7OSwyMCxycnIsVixWLFZ9LAkvKiBhZGQuYi50ICovCi0gIHs5LDIxLHJycixWLFYsVn0sCS8qIGFkZC5oLnQgKi8KLSAgezksMjIscnJyLFYsVixWfSwJLyogYWRkLncudCAqLwotICB7OSwyMyxycnIsVixWLFZ9LAkvKiBhZGQubC50ICovCi0gIHs5LDIwLHJycixWLFMsVn0sCS8qIGFkZC5iLnQgKi8KLSAgezksMjEscnJyLFYsUyxWfSwJLyogYWRkLmgudCAqLwotICB7OSwyMixycnIsVixTLFZ9LAkvKiBhZGQudy50ICovCi0gIHs5LDIzLHJycixWLFMsVn0sCS8qIGFkZC5sLnQgKi8KLSAgezEwLDIwLHJycixWLFYsVn0sCS8qIHN1Yi5iLnQgKi8KLSAgezEwLDIxLHJycixWLFYsVn0sCS8qIHN1Yi5oLnQgKi8KLSAgezEwLDIyLHJycixWLFYsVn0sCS8qIHN1Yi53LnQgKi8KLSAgezEwLDIzLHJycixWLFYsVn0sCS8qIHN1Yi5sLnQgKi8KLSAgezEwLDIwLHJycixWLFMsVn0sCS8qIHN1Yi5iLnQgKi8KLSAgezEwLDIxLHJycixWLFMsVn0sCS8qIHN1Yi5oLnQgKi8KLSAgezEwLDIyLHJycixWLFMsVn0sCS8qIHN1Yi53LnQgKi8KLSAgezEwLDIzLHJycixWLFMsVn0sCS8qIHN1Yi5sLnQgKi8KLSAgezMsMjAscnJyLFYsVixWfSwJLyogbXVsLmIudCAqLwotICB7MywyMSxycnIsVixWLFZ9LAkvKiBtdWwuaC50ICovCi0gIHszLDIyLHJycixWLFYsVn0sCS8qIG11bC53LnQgKi8KLSAgezMsMjMscnJyLFYsVixWfSwJLyogbXVsLmwudCAqLwotICB7MywyMCxycnIsVixTLFZ9LAkvKiBtdWwuYi50ICovCi0gIHszLDIxLHJycixWLFMsVn0sCS8qIG11bC5oLnQgKi8KLSAgezMsMjIscnJyLFYsUyxWfSwJLyogbXVsLncudCAqLwotICB7MywyMyxycnIsVixTLFZ9LAkvKiBtdWwubC50ICovCi0gIHs0LDIwLHJycixWLFYsVn0sCS8qIGRpdi5iLnQgKi8KLSAgezQsMjEscnJyLFYsVixWfSwJLyogZGl2LmgudCAqLwotICB7NCwyMixycnIsVixWLFZ9LAkvKiBkaXYudy50ICovCi0gIHs0LDIzLHJycixWLFYsVn0sCS8qIGRpdi5sLnQgKi8KLSAgezQsMjAscnJyLFYsUyxWfSwJLyogZGl2LmIudCAqLwotICB7NCwyMSxycnIsVixTLFZ9LAkvKiBkaXYuaC50ICovCi0gIHs0LDIyLHJycixWLFMsVn0sCS8qIGRpdi53LnQgKi8KLSAgezQsMjMscnJyLFYsUyxWfSwJLyogZGl2LmwudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0MVtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MjYsMjAsYTJyLFMsMCwwfSwJLyogc3RlLmIudCAqLwotICB7MjYsMjEsYTJyLFMsMCwwfSwJLyogc3RlLmgudCAqLwotICB7MjYsMjIsYTJyLFMsMCwwfSwJLyogc3RlLncudCAqLwotICB7MjYsMjMsYTJyLFMsMCwwfSwJLyogc3RlLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTgsMjAsYTFyLFYsMCwwfSwJLyogbGQuYi50ICovCi0gIHsxOCwyMSxhMXIsViwwLDB9LAkvKiBsZC5oLnQgKi8KLSAgezE4LDIyLGExcixWLDAsMH0sCS8qIGxkLncudCAqLwotICB7MTgsMjMsYTFyLFYsMCwwfSwJLyogbGQubC50ICovCi0gIHsyMSwyMCxhMnIsViwwLDB9LAkvKiBzdC5iLnQgKi8KLSAgezIxLDIxLGEycixWLDAsMH0sCS8qIHN0LmgudCAqLwotICB7MjEsMjIsYTJyLFYsMCwwfSwJLyogc3Qudy50ICovCi0gIHsyMSwyMyxhMnIsViwwLDB9LAkvKiBzdC5sLnQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDJbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezI4LDIwLHJyLFYsViwwfSwJLyogY3Z0dy5iLnQgKi8KLSAgezI4LDIxLHJyLFYsViwwfSwJLyogY3Z0dy5oLnQgKi8KLSAgezI5LDIyLHJyLFYsViwwfSwJLyogY3Z0Yi53LnQgKi8KLSAgezMwLDIyLHJyLFYsViwwfSwJLyogY3Z0aC53LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezMxLDIzLHJyLFYsViwwfSwJLyogY3Z0cy5sLnQgKi8KLSAgezMyLDIyLHJyLFYsViwwfSwJLyogY3Z0ZC53LnQgKi8KLSAgezMzLDE4LHJyLFYsViwwfSwJLyogY3Z0bC5zLnQgKi8KLSAgezI4LDE5LHJyLFYsViwwfSwJLyogY3Z0dy5kLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwxOCxycixWLFYsMH0sCS8qIGZyaW50LnMudCAqLwotICB7MTE2LDE5LHJyLFYsViwwfSwJLyogZnJpbnQuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwxOCxycixWLFYsMH0sCS8qIHNxcnQucy50ICovCi0gIHs4MSwxOSxycixWLFYsMH0sCS8qIHNxcnQuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQzW10gPSB7Ci0gIHszMiwxOCxycixWLFYsMH0sCS8qIGN2dGQucy50ICovCi0gIHszMSwxOSxycixWLFYsMH0sCS8qIGN2dHMuZC50ICovCi0gIHszMywxOSxycixWLFYsMH0sCS8qIGN2dGwuZC50ICovCi0gIHszMiwyMyxycixWLFYsMH0sCS8qIGN2dGQubC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNiwxLHJyLFYsViwwfSwJLyogdHpjLnQgKi8KLSAgezQ0LDEscnIsVixWLDB9LAkvKiBsb3AudCAqLwotICB7MTE3LDEscnIsVixWLDB9LAkvKiB4cG5kLnQgKi8KLSAgezQyLDEscnIsVixWLDB9LAkvKiBub3QudCAqLwotICB7OCwxLHJyLFMsViwwfSwJLyogc2hmLnQgKi8KLSAgezM1LDI0LHJyLFYsViwwfSwJLyogcGxjLnQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzcsMTgscnIsVixWLDB9LAkvKiBlcS5zLnQgKi8KLSAgezM3LDE5LHJyLFYsViwwfSwJLyogZXEuZC50ICovCi0gIHs0MywxOCxycixWLFYsMH0sCS8qIG5lZy5zLnQgKi8KLSAgezQzLDE5LHJyLFYsViwwfSwJLyogbmVnLmQudCAqLwotICB7MzcsMTgscnIsUyxWLDB9LAkvKiBlcS5zLnQgKi8KLSAgezM3LDE5LHJyLFMsViwwfSwJLyogZXEuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs0MCwxOCxycixWLFYsMH0sCS8qIGxlLnMudCAqLwotICB7NDAsMTkscnIsVixWLDB9LAkvKiBsZS5kLnQgKi8KLSAgezQxLDE4LHJyLFYsViwwfSwJLyogbHQucy50ICovCi0gIHs0MSwxOSxycixWLFYsMH0sCS8qIGx0LmQudCAqLwotICB7NDAsMTgscnIsUyxWLDB9LAkvKiBsZS5zLnQgKi8KLSAgezQwLDE5LHJyLFMsViwwfSwJLyogbGUuZC50ICovCi0gIHs0MSwxOCxycixTLFYsMH0sCS8qIGx0LnMudCAqLwotICB7NDEsMTkscnIsUyxWLDB9LAkvKiBsdC5kLnQgKi8KLSAgezM3LDIwLHJyLFYsViwwfSwJLyogZXEuYi50ICovCi0gIHszNywyMSxycixWLFYsMH0sCS8qIGVxLmgudCAqLwotICB7MzcsMjIscnIsVixWLDB9LAkvKiBlcS53LnQgKi8KLSAgezM3LDIzLHJyLFYsViwwfSwJLyogZXEubC50ICovCi0gIHszNywyMCxycixTLFYsMH0sCS8qIGVxLmIudCAqLwotICB7MzcsMjEscnIsUyxWLDB9LAkvKiBlcS5oLnQgKi8KLSAgezM3LDIyLHJyLFMsViwwfSwJLyogZXEudy50ICovCi0gIHszNywyMyxycixTLFYsMH0sCS8qIGVxLmwudCAqLwotICB7NDAsMjAscnIsVixWLDB9LAkvKiBsZS5iLnQgKi8KLSAgezQwLDIxLHJyLFYsViwwfSwJLyogbGUuaC50ICovCi0gIHs0MCwyMixycixWLFYsMH0sCS8qIGxlLncudCAqLwotICB7NDAsMjMscnIsVixWLDB9LAkvKiBsZS5sLnQgKi8KLSAgezQwLDIwLHJyLFMsViwwfSwJLyogbGUuYi50ICovCi0gIHs0MCwyMSxycixTLFYsMH0sCS8qIGxlLmgudCAqLwotICB7NDAsMjIscnIsUyxWLDB9LAkvKiBsZS53LnQgKi8KLSAgezQwLDIzLHJyLFMsViwwfSwJLyogbGUubC50ICovCi0gIHs0MSwyMCxycixWLFYsMH0sCS8qIGx0LmIudCAqLwotICB7NDEsMjEscnIsVixWLDB9LAkvKiBsdC5oLnQgKi8KLSAgezQxLDIyLHJyLFYsViwwfSwJLyogbHQudy50ICovCi0gIHs0MSwyMyxycixWLFYsMH0sCS8qIGx0LmwudCAqLwotICB7NDEsMjAscnIsUyxWLDB9LAkvKiBsdC5iLnQgKi8KLSAgezQxLDIxLHJyLFMsViwwfSwJLyogbHQuaC50ICovCi0gIHs0MSwyMixycixTLFYsMH0sCS8qIGx0LncudCAqLwotICB7NDEsMjMscnIsUyxWLDB9LAkvKiBsdC5sLnQgKi8KLSAgezQzLDIwLHJyLFYsViwwfSwJLyogbmVnLmIudCAqLwotICB7NDMsMjEscnIsVixWLDB9LAkvKiBuZWcuaC50ICovCi0gIHs0MywyMixycixWLFYsMH0sCS8qIG5lZy53LnQgKi8KLSAgezQzLDIzLHJyLFYsViwwfSwJLyogbmVnLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NVtdID0gewotICB7NTEsMjAscnIsVixWLDB9LAkvKiBsZHZpLmIudCAqLwotICB7NTEsMjEscnIsVixWLDB9LAkvKiBsZHZpLmgudCAqLwotICB7NTEsMjIscnIsVixWLDB9LAkvKiBsZHZpLncudCAqLwotICB7NTEsMjMscnIsVixWLDB9LAkvKiBsZHZpLmwudCAqLwotICB7MjgsMTgscnIsVixWLDB9LAkvKiBjdnR3LnMudCAqLwotICB7MzEsMjIscnIsVixWLDB9LAkvKiBjdnRzLncudCAqLwotICB7MjgsMjMscnIsVixWLDB9LAkvKiBjdnR3LmwudCAqLwotICB7MzMsMjIscnIsVixWLDB9LAkvKiBjdnRsLncudCAqLwotICB7NTIsMjAscnhyLFYsViwwfSwJLyogc3R2aS5iLnQgKi8KLSAgezUyLDIxLHJ4cixWLFYsMH0sCS8qIHN0dmkuaC50ICovCi0gIHs1MiwyMixyeHIsVixWLDB9LAkvKiBzdHZpLncudCAqLwotICB7NTIsMjMscnhyLFYsViwwfSwJLyogc3R2aS5sLnQgKi8KLSAgezUyLDIwLHJ4cixTLFYsMH0sCS8qIHN0dmkuYi50ICovCi0gIHs1MiwyMSxyeHIsUyxWLDB9LAkvKiBzdHZpLmgudCAqLwotICB7NTIsMjIscnhyLFMsViwwfSwJLyogc3R2aS53LnQgKi8KLSAgezUyLDIzLHJ4cixTLFYsMH0sCS8qIHN0dmkubC50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQ2W10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQ3W10gPSB7Ci0gIHs4NCwyMCxyLFYsMCwwfSwJLyogc3VtLmIudCAqLwotICB7ODQsMjEscixWLDAsMH0sCS8qIHN1bS5oLnQgKi8KLSAgezg0LDIyLHIsViwwLDB9LAkvKiBzdW0udy50ICovCi0gIHs4NCwyMyxyLFYsMCwwfSwJLyogc3VtLmwudCAqLwotICB7ODUsMSxyLFYsMCwwfSwJLyogYWxsLnQgKi8KLSAgezg2LDEscixWLDAsMH0sCS8qIGFueS50ICovCi0gIHs4NywxLHIsViwwLDB9LAkvKiBwYXJpdHkudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7ODgsMjAscixWLDAsMH0sCS8qIG1heC5iLnQgKi8KLSAgezg4LDIxLHIsViwwLDB9LAkvKiBtYXguaC50ICovCi0gIHs4OCwyMixyLFYsMCwwfSwJLyogbWF4LncudCAqLwotICB7ODgsMjMscixWLDAsMH0sCS8qIG1heC5sLnQgKi8KLSAgezg5LDIwLHIsViwwLDB9LAkvKiBtaW4uYi50ICovCi0gIHs4OSwyMSxyLFYsMCwwfSwJLyogbWluLmgudCAqLwotICB7ODksMjIscixWLDAsMH0sCS8qIG1pbi53LnQgKi8KLSAgezg5LDIzLHIsViwwLDB9LAkvKiBtaW4ubC50ICovCi0gIHs4NCwxOCxyLFYsMCwwfSwJLyogc3VtLnMudCAqLwotICB7ODQsMTkscixWLDAsMH0sCS8qIHN1bS5kLnQgKi8KLSAgezkwLDE4LHIsViwwLDB9LAkvKiBwcm9kLnMudCAqLwotICB7OTAsMTkscixWLDAsMH0sCS8qIHByb2QuZC50ICovCi0gIHs4OCwxOCxyLFYsMCwwfSwJLyogbWF4LnMudCAqLwotICB7ODgsMTkscixWLDAsMH0sCS8qIG1heC5kLnQgKi8KLSAgezg5LDE4LHIsViwwLDB9LAkvKiBtaW4ucy50ICovCi0gIHs4OSwxOSxyLFYsMCwwfSwJLyogbWluLmQudCAqLwotICB7OTAsMjAscixWLDAsMH0sCS8qIHByb2QuYi50ICovCi0gIHs5MCwyMSxyLFYsMCwwfSwJLyogcHJvZC5oLnQgKi8KLSAgezkwLDIyLHIsViwwLDB9LAkvKiBwcm9kLncudCAqLwotICB7OTAsMjMscixWLDAsMH0sCS8qIHByb2QubC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1jaGFyICpsb3BbXSA9IHsKLSAgIm1vdiIsCS8qIDAgKi8KLSAgIm1lcmciLAkvKiAxICovCi0gICJtYXNrIiwJLyogMiAqLwotICAibXVsIiwJLyogMyAqLwotICAiZGl2IiwJLyogNCAqLwotICAiYW5kIiwJLyogNSAqLwotICAib3IiLAkvKiA2ICovCi0gICJ4b3IiLAkvKiA3ICovCi0gICJzaGYiLAkvKiA4ICovCi0gICJhZGQiLAkvKiA5ICovCi0gICJzdWIiLAkvKiAxMCAqLwotICAiZXhpdCIsCS8qIDExICovCi0gICJqbXAiLAkvKiAxMiAqLwotICAiam1waSIsCS8qIDEzICovCi0gICJqbXBhIiwJLyogMTQgKi8KLSAgImptcHMiLAkvKiAxNSAqLwotICAidGFjIiwJLyogMTYgKi8KLSAgImxkZWEiLAkvKiAxNyAqLwotICAibGQiLAkvKiAxOCAqLwotICAidGFzIiwJLyogMTkgKi8KLSAgInBzaGVhIiwJLyogMjAgKi8KLSAgInN0IiwJLyogMjEgKi8KLSAgImNhbGwiLAkvKiAyMiAqLwotICAiY2FsbHMiLAkvKiAyMyAqLwotICAiY2FsbHEiLAkvKiAyNCAqLwotICAicGZvcmsiLAkvKiAyNSAqLwotICAic3RlIiwJLyogMjYgKi8KLSAgImluY3IiLAkvKiAyNyAqLwotICAiY3Z0dyIsCS8qIDI4ICovCi0gICJjdnRiIiwJLyogMjkgKi8KLSAgImN2dGgiLAkvKiAzMCAqLwotICAiY3Z0cyIsCS8qIDMxICovCi0gICJjdnRkIiwJLyogMzIgKi8KLSAgImN2dGwiLAkvKiAzMyAqLwotICAibGRwYSIsCS8qIDM0ICovCi0gICJwbGMiLAkvKiAzNSAqLwotICAidHpjIiwJLyogMzYgKi8KLSAgImVxIiwJLyogMzcgKi8KLSAgImxldSIsCS8qIDM4ICovCi0gICJsdHUiLAkvKiAzOSAqLwotICAibGUiLAkvKiA0MCAqLwotICAibHQiLAkvKiA0MSAqLwotICAibm90IiwJLyogNDIgKi8KLSAgIm5lZyIsCS8qIDQzICovCi0gICJsb3AiLAkvKiA0NCAqLwotICAiY3BycyIsCS8qIDQ1ICovCi0gICJub3AiLAkvKiA0NiAqLwotICAiYnIiLAkvKiA0NyAqLwotICAiYnJpIiwJLyogNDggKi8KLSAgImJyYSIsCS8qIDQ5ICovCi0gICJicnMiLAkvKiA1MCAqLwotICAibGR2aSIsCS8qIDUxICovCi0gICJzdHZpIiwJLyogNTIgKi8KLSAgImxkc2RyIiwJLyogNTMgKi8KLSAgImxka2RyIiwJLyogNTQgKi8KLSAgImxuIiwJLyogNTUgKi8KLSAgInBhdHUiLAkvKiA1NiAqLwotICAicGF0ZSIsCS8qIDU3ICovCi0gICJwaWNoIiwJLyogNTggKi8KLSAgInBsY2giLAkvKiA1OSAqLwotICAiaWRsZSIsCS8qIDYwICovCi0gICJydG5xIiwJLyogNjEgKi8KLSAgImNmb3JrIiwJLyogNjIgKi8KLSAgInJ0biIsCS8qIDYzICovCi0gICJ3Zm9yayIsCS8qIDY0ICovCi0gICJqb2luIiwJLyogNjUgKi8KLSAgInJ0bmMiLAkvKiA2NiAqLwotICAiZXhwIiwJLyogNjcgKi8KLSAgInNpbiIsCS8qIDY4ICovCi0gICJjb3MiLAkvKiA2OSAqLwotICAicHNoIiwJLyogNzAgKi8KLSAgInBvcCIsCS8qIDcxICovCi0gICJlbmkiLAkvKiA3MiAqLwotICAiZHNpIiwJLyogNzMgKi8KLSAgImJrcHQiLAkvKiA3NCAqLwotICAibXN5bmMiLAkvKiA3NSAqLwotICAibXNraSIsCS8qIDc2ICovCi0gICJ4bXRpIiwJLyogNzcgKi8KLSAgInRzdHZ2IiwJLyogNzggKi8KLSAgImRpYWciLAkvKiA3OSAqLwotICAicGJrcHQiLAkvKiA4MCAqLwotICAic3FydCIsCS8qIDgxICovCi0gICJjYXNyIiwJLyogODIgKi8KLSAgImF0YW4iLAkvKiA4MyAqLwotICAic3VtIiwJLyogODQgKi8KLSAgImFsbCIsCS8qIDg1ICovCi0gICJhbnkiLAkvKiA4NiAqLwotICAicGFyaXR5IiwJLyogODcgKi8KLSAgIm1heCIsCS8qIDg4ICovCi0gICJtaW4iLAkvKiA4OSAqLwotICAicHJvZCIsCS8qIDkwICovCi0gICJoYWx0IiwJLyogOTEgKi8KLSAgInN5c2MiLAkvKiA5MiAqLwotICAidHJhcCIsCS8qIDkzICovCi0gICJ0c3QiLAkvKiA5NCAqLwotICAibGNrIiwJLyogOTUgKi8KLSAgInVsayIsCS8qIDk2ICovCi0gICJzcGF3biIsCS8qIDk3ICovCi0gICJsZGNtciIsCS8qIDk4ICovCi0gICJzdGNtciIsCS8qIDk5ICovCi0gICJwb3ByIiwJLyogMTAwICovCi0gICJwc2hyIiwJLyogMTAxICovCi0gICJyY3ZyIiwJLyogMTAyICovCi0gICJtYXRtIiwJLyogMTAzICovCi0gICJzbmRyIiwJLyogMTA0ICovCi0gICJwdXRyIiwJLyogMTA1ICovCi0gICJnZXRyIiwJLyogMTA2ICovCi0gICJtYXRyIiwJLyogMTA3ICovCi0gICJtYXQiLAkvKiAxMDggKi8KLSAgImdldCIsCS8qIDEwOSAqLwotICAicmN2IiwJLyogMTEwICovCi0gICJpbmMiLAkvKiAxMTEgKi8KLSAgInB1dCIsCS8qIDExMiAqLwotICAic25kIiwJLyogMTEzICovCi0gICJlbmFsIiwJLyogMTE0ICovCi0gICJlbmFnIiwJLyogMTE1ICovCi0gICJmcmludCIsCS8qIDExNiAqLwotICAieHBuZCIsCS8qIDExNyAqLwotICAiY3Ryc2wiLAkvKiAxMTggKi8KLSAgImN0cnNnIiwJLyogMTE5ICovCi0gICJzdG9wIiwJLyogMTIwICovCi19OwotCi1jaGFyICpyb3BbXSA9IHsKLSAgIiIsCS8qIDAgKi8KLSAgIi50IiwJLyogMSAqLwotICAiLmYiLAkvKiAyICovCi0gICIucyIsCS8qIDMgKi8KLSAgIi5kIiwJLyogNCAqLwotICAiLmIiLAkvKiA1ICovCi0gICIuaCIsCS8qIDYgKi8KLSAgIi53IiwJLyogNyAqLwotICAiLmwiLAkvKiA4ICovCi0gICIueCIsCS8qIDkgKi8KLSAgIi51IiwJLyogMTAgKi8KLSAgIi5zLmYiLAkvKiAxMSAqLwotICAiLmQuZiIsCS8qIDEyICovCi0gICIuYi5mIiwJLyogMTMgKi8KLSAgIi5oLmYiLAkvKiAxNCAqLwotICAiLncuZiIsCS8qIDE1ICovCi0gICIubC5mIiwJLyogMTYgKi8KLSAgIi50LmYiLAkvKiAxNyAqLwotICAiLnMudCIsCS8qIDE4ICovCi0gICIuZC50IiwJLyogMTkgKi8KLSAgIi5iLnQiLAkvKiAyMCAqLwotICAiLmgudCIsCS8qIDIxICovCi0gICIudy50IiwJLyogMjIgKi8KLSAgIi5sLnQiLAkvKiAyMyAqLwotICAiLnQudCIsCS8qIDI0ICovCi19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvZDEwdi5oIGIvaW5jbHVkZS9vcGNvZGUvZDEwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc0Yzk4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKiBkMTB2LmggLS0gSGVhZGVyIGZpbGUgZm9yIEQxMFYgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSksIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRDEwVl9ICi0jZGVmaW5lIEQxMFZfSAotCi0vKiBGb3JtYXQgU3BlY2lmaWVyICovCi0jZGVmaW5lIEZNMDAJMAotI2RlZmluZSBGTTAxCTB4NDAwMDAwMDAKLSNkZWZpbmUgRk0xMAkweDgwMDAwMDAwCi0jZGVmaW5lIEZNMTEJMHhDMDAwMDAwMAotCi0jZGVmaW5lIE5PUCAweDVlMDAKLSNkZWZpbmUgT1BDT0RFX0RJVlMJMHgxNDAwMjgwMAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMTB2X29wY29kZS4gICovCi0KLXN0cnVjdCBkMTB2X29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIHRoZSBvcGNvZGUgZm9ybWF0ICovCi0gIGludCBmb3JtYXQ7Ci0KLSAgLyogVGhlc2UgbnVtYmVycyB3ZXJlIHBpY2tlZCBzbyB3ZSBjYW4gZG8gaWYoIGkgJiBTSE9SVF9PUENPREUpICovCi0jZGVmaW5lIFNIT1JUX09QQ09ERSAxCi0jZGVmaW5lIExPTkdfT1BDT0RFICA4Ci0jZGVmaW5lIFNIT1JUXzIJICAgICAxCQkvKiBzaG9ydCB3aXRoIDIgb3BlcmFuZHMgKi8KLSNkZWZpbmUgU0hPUlRfQgkgICAgIDMJCS8qIHNob3J0IHdpdGggOC1iaXQgYnJhbmNoICovCi0jZGVmaW5lIExPTkdfQgkgICAgIDgJCS8qIGxvbmcgd2l0aCAxNi1iaXQgYnJhbmNoICovCi0jZGVmaW5lIExPTkdfTCAgICAgICAxMAkJLyogbG9uZyB3aXRoIDMgb3BlcmFuZHMgKi8KLSNkZWZpbmUgTE9OR19SICAgICAgIDEyCQkvKiByZXNlcnZlZCAqLwotCi0gIC8qIGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgdmFyaWFibGUtbGVuZ3RoIGluc3RydWN0aW9ucyAqLwotICAvKiBmb3IgZXhhbXBsZSwgImJyYSIgd2lsbCBiZSBhIGZha2UgZm9yICJicmEucyIgYW5kIGJyYS5sIiAqLwotICAvKiB3aGljaCB3aWxsIGltbWVkaWF0ZWx5IGZvbGxvdyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSNkZWZpbmUgT1BDT0RFX0ZBS0UgIDMyCi0KLSAgLyogdGhlIG51bWJlciBvZiBjeWNsZXMgKi8KLSAgaW50IGN5Y2xlczsKLQotICAvKiB0aGUgZXhlY3V0aW9uIHVuaXQocykgdXNlZCAqLwotICBpbnQgdW5pdDsKLSNkZWZpbmUgRUlUSEVSCTAKLSNkZWZpbmUgSVUJMQotI2RlZmluZSBNVQkyCi0jZGVmaW5lIEJPVEgJMwotCi0gIC8qIGV4ZWN1dGlvbiB0eXBlOyBwYXJhbGxlbCBvciBzZXF1ZW50aWFsICovCi0gIC8qIHRoaXMgZmllbGQgaXMgdXNlZCB0byBkZWNpZGUgaWYgdHdvIGluc3RydWN0aW9ucyAqLwotICAvKiBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwgKi8KLSAgaW50IGV4ZWNfdHlwZTsKLSNkZWZpbmUgUEFST05MWSAxCS8qIHBhcmFsbGVsIG9ubHkgKi8KLSNkZWZpbmUgU0VRCTIJLyogbXVzdCBiZSBzZXF1ZW50aWFsICovCi0jZGVmaW5lIFBBUgk0CS8qIG1heSBiZSBwYXJhbGxlbCAqLwotI2RlZmluZSBCUkFOQ0hfTElOSyA4CS8qIHN1YnJvdXRpbmUgY2FsbC4gIG11c3QgYmUgYWxpZ25lZCAqLwotI2RlZmluZSBSTUVNICAgICAxNgkvKiByZWFkcyBtZW1vcnkgKi8KLSNkZWZpbmUgV01FTSAgICAgMzIJLyogd3JpdGVzIG1lbW9yeSAqLwotI2RlZmluZSBSRjAgICAgICA2NAkvKiByZWFkcyBmMCAqLwotI2RlZmluZSBXRjAgICAgIDEyOAkvKiBtb2RpZmllcyBmMCAqLwotI2RlZmluZSBXQ0FSICAgIDI1NgkvKiB3cml0ZSBDYXJyeSAqLwotI2RlZmluZSBCUkFOQ0ggIDUxMgkvKiBicmFuY2gsIG5vIGxpbmsgKi8KLQotICAvKiB0aGUgb3Bjb2RlICovCi0gIGxvbmcgb3Bjb2RlOwotCi0gIC8qIG1hc2suICBpZiggKGkgJiBtYXNrKSA9PSBvcGNvZGUgKSB0aGVuIG1hdGNoICovCi0gIGxvbmcgbWFzazsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzZdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMTB2X29wY29kZSBkMTB2X29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgZDEwdl9udW1fb3Bjb2RlczsKLQotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMTB2X29wZXJhbmQuICAqLwotc3RydWN0IGQxMHZfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIGQxMHZfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDEwdl9vcGVyYW5kIGQxMHZfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBkMTB2X29wZXJhbmQuICAqLwotCi0vKiB0aGUgb3BlcmFuZCBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfRVZFTgkoMSkKLQotLyogdGhlIG9wZXJhbmQgbXVzdCBiZSBhbiBvZGQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfT0RECSgyKQkKLQotLyogdGhpcyBpcyB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXI7IGl0IHdpbGwgYmUgbW9kaWZpZWQgKi8KLS8qIHRoaXMgaXMgdXNlZCBieSB0aGUgb3B0aW1pemVyICovCi0jZGVmaW5lIE9QRVJBTkRfREVTVAkoNCkKLQotLyogbnVtYmVyIG9yIHN5bWJvbCAqLwotI2RlZmluZSBPUEVSQU5EX05VTQkoOCkKLQotLyogYWRkcmVzcyBvciBsYWJlbCAqLwotI2RlZmluZSBPUEVSQU5EX0FERFIJKDB4MTApCi0KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfUkVHCSgweDIwKQotCi0vKiBwb3N0aW5jcmVtZW50ICsgICovCi0jZGVmaW5lIE9QRVJBTkRfUExVUwkoMHg0MCkKLQotLyogcG9zdGRlY3JlbWVudCAtICAqLwotI2RlZmluZSBPUEVSQU5EX01JTlVTCSgweDgwKQotCi0vKiBAICAqLwotI2RlZmluZSBPUEVSQU5EX0FUU0lHTgkoMHgxMDApCi0KLS8qIEAoICAqLwotI2RlZmluZSBPUEVSQU5EX0FUUEFSCSgweDIwMCkKLQotLyogYWNjdW11bGF0b3IgMCAqLwotI2RlZmluZSBPUEVSQU5EX0FDQzAJKDB4NDAwKQotCi0vKiBhY2N1bXVsYXRvciAxICovCi0jZGVmaW5lIE9QRVJBTkRfQUNDMQkoMHg4MDApCi0KLS8qIGYwIC8gZjEgZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0ZGTEFHCSgweDEwMDApCi0KLS8qIGMgZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0NGTEFHCSgweDIwMDApCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgICovCi0jZGVmaW5lIE9QRVJBTkRfQ09OVFJPTAkoMHg0MDAwKQotCi0vKiBwcmVkZWNyZW1lbnQgbW9kZSAnQC1zcCcgICovCi0jZGVmaW5lIE9QRVJBTkRfQVRNSU5VUwkoMHg4MDAwKQotCi0vKiBzaWduZWQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfU0lHTkVECSgweDEwMDAwKQotCi0vKiBzcGVjaWFsIGFjY3VtdWxhdG9yIHNoaWZ0cyBuZWVkIGEgNC1iaXQgbnVtYmVyICovCi0vKiAxIDw9IHggPD0gMTYgKi8KLSNkZWZpbmUgT1BFUkFORF9TSElGVAkoMHgyMDAwMCkKLQotLyogZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfR1BSCSgweDQwMDAwKQotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi17Ci0gIGNoYXIgKm5hbWU7CQkvKiBuYW1lIHRvIHJlY29nbml6ZSAqLwotICBjaGFyICpwbmFtZTsJCS8qIG5hbWUgdG8gcHJpbnQgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwZF9yZWcgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tdOwotaW50IGQxMHZfcmVnX25hbWVfY250KCk7Ci0KLS8qIGFuIGV4cHJlc3Npb25TIG9ubHkgaGFzIG9uZSByZWdpc3RlciB0eXBlLCBzbyB3ZSBmYWtlIGl0ICovCi0vKiBieSBzZXR0aW5nIGhpZ2ggYml0cyB0byBpbmRpY2F0ZSB0eXBlICovCi0jZGVmaW5lIFJFR0lTVEVSX01BU0sJMHhGRgotCi0jZW5kaWYgLyogRDEwVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9kMzB2LmggYi9pbmNsdWRlL29wY29kZS9kMzB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjhkYWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvZDMwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qIGQzMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgRDMwViBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKSwgQ3lnbnVzIFNvbHV0aW9ucwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEQzMFZfSAotI2RlZmluZSBEMzBWX0gKLQotI2RlZmluZSBOT1AgMHgwMEYwMDAwMAotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi17Ci0gIGNoYXIgKm5hbWU7CQkvKiBuYW1lIHRvIHJlY29nbml6ZSAqLwotICBjaGFyICpwbmFtZTsJCS8qIG5hbWUgdG8gcHJpbnQgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW107Ci1pbnQgcmVnX25hbWVfY250KCk7Ci0KLS8qIHRoZSBudW1iZXIgb2YgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTUFYX0NPTlRST0xfUkVHCTY0Ci0KLS8qIGRlZmluZSB0aGUgZm9ybWF0IHNwZWNpZmllcnMgKi8KLSNkZWZpbmUgRk0wMAkwCi0jZGVmaW5lIEZNMDEJMHg4MDAwMDAwMAotI2RlZmluZSBGTTEwCTB4ODAwMDAwMDAwMDAwMDAwMExMCi0jZGVmaW5lIEZNMTEJMHg4MDAwMDAwMDgwMDAwMDAwTEwKLQotLyogZGVmaW5lIHRoZSBvcGNvZGUgY2xhc3NlcyAqLwotI2RlZmluZSBCUkEJMAotI2RlZmluZSBMT0dJQwkxCi0jZGVmaW5lIElNRU0JMgotI2RlZmluZSBJQUxVMQk0Ci0jZGVmaW5lIElBTFUyCTUKLQotLyogZGVmaW5lIHRoZSBleGVjdXRpb24gY29uZGl0aW9uIGNvZGVzICovCi0jZGVmaW5lIEVDQ19BTAkwCS8qIEFMd2F5cyAoZGVmYXVsdCkgKi8KLSNkZWZpbmUgRUNDX1RYCTEJLyogRjA9VHJ1ZSwgRjE9RG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFQ0NfRlgJMgkvKiBGMD1GYWxzZSwgRjE9RG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFQ0NfWFQJMwkvKiBGMD1Eb24ndCBjYXJlLCBGMT1UcnVlICovCi0jZGVmaW5lIEVDQ19YRgk0CS8qIEYwPURvbid0IGNhcmUsIEYxPUZhbHNlICovCi0jZGVmaW5lIEVDQ19UVAk1CS8qIEYwPVRydWUsIEYxPVRydWUgKi8KLSNkZWZpbmUgRUNDX1RGCTYJLyogRjA9VHJ1ZSwgRjE9RmFsc2UgKi8KLSNkZWZpbmUgRUNDX1JFU0VSVkVECTcJLyogcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgRUNDX01BWAlFQ0NfUkVTRVJWRUQKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmQzMHZfZWNjX25hbWVzW107Ci0KLS8qIGNvbmRpdGlvbiBjb2RlIHRhYmxlIGZvciBDTVAgYW5kIENNUFUgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkMzB2X2NjX25hbWVzW107Ci0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfb3Bjb2RlLiAgKi8KLXN0cnVjdCBkMzB2X29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIHRoZSBvcGNvZGUgKi8KLSAgaW50IG9wMTsJLyogZmlyc3QgcGFydCwgIklBTFUxIiBmb3IgZXhhbXBsZSAqLwotICBpbnQgb3AyOwkvKiB0aGUgcmVzdCBvZiB0aGUgb3Bjb2RlICovCi0KLSAgLyogb3Bjb2RlIGZvcm1hdChzKS4gIFRoZXNlIG51bWJlcnMgY29ycmVzcG9uZCB0byBlbnRyaWVzICovCi0gIC8qIGluIHRoZSBkMzB2X2Zvcm1hdF90YWJsZSAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdFs0XTsKLQotI2RlZmluZSBTSE9SVF9NCQkxCi0jZGVmaW5lIFNIT1JUX00yCTUJLyogZm9yIGxkMncgYW5kIHN0MncgKi8KLSNkZWZpbmUgU0hPUlRfQQkJOQotI2RlZmluZSBTSE9SVF9CMQkxMQotI2RlZmluZSBTSE9SVF9CMgkxMgotI2RlZmluZSBTSE9SVF9CMwkxMwotI2RlZmluZSBTSE9SVF9CM2IJMTUKLSNkZWZpbmUgU0hPUlRfRDEJMTcKLSNkZWZpbmUgU0hPUlRfRDIJMTkKLSNkZWZpbmUgU0hPUlRfRDJCCTIxCi0jZGVmaW5lIFNIT1JUX1UJCTIzCS8qIHVuYXJ5IFNIT1JUX0EuICBBQlMgZm9yIGV4YW1wbGUgKi8KLSNkZWZpbmUgU0hPUlRfRgkJMjUJLyogU0hPUlRfQSB3aXRoIGZsYWcgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNIT1JUX0FGCTI3CS8qIFNIT1JUX0Egd2l0aCBvbmx5IHRoZSBmaXJzdCByZWdpc3RlciBhIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0hPUlRfVAkJMjkJLyogZm9yIHRyYXAgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgU0hPUlRfQTUJMzAJLyogU0hPUlRfQSB3aXRoIGEgNS1iaXQgaW1tZWRpYXRlIGluc3RlYWQgb2YgNiAqLwotI2RlZmluZSBTSE9SVF9DTVAJMzIJLyogc3BlY2lhbCBmb3JtIGZvciBDTVBjYyAqLwotI2RlZmluZSBTSE9SVF9DTVBVCTM0CS8qIHNwZWNpYWwgZm9ybSBmb3IgQ01QVWNjICovCi0jZGVmaW5lIFNIT1JUX0ExCTM2CS8qIHNwZWNpYWwgZm9ybSBvZiBTSE9SVF9BIGZvciBNQUNhIG9wY29kZXMgd2hlcmUgYT0xICovCi0jZGVmaW5lIFNIT1JUX0FBCTM4CS8qIFNIT1JUX0Egd2l0aCB0aGUgZmlyc3QgcmVnaXN0ZXIgYW4gYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgU0hPUlRfUkEJNDAJLyogU0hPUlRfQSB3aXRoIHRoZSBzZWNvbmQgcmVnaXN0ZXIgYW4gYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgU0hPUlRfTU9ESU5DCTQyCQotI2RlZmluZSBTSE9SVF9NT0RERUMJNDMKLSNkZWZpbmUgU0hPUlRfQzEJNDQKLSNkZWZpbmUgU0hPUlRfQzIJNDUKLSNkZWZpbmUgU0hPUlRfVUYJNDYKLSNkZWZpbmUgU0hPUlRfQTIJNDcKLSNkZWZpbmUgU0hPUlRfQTVTCTQ5Ci0jZGVmaW5lIFNIT1JUX05PTkUJNTEJLyogbm8gb3BlcmFuZHMgKi8KLSNkZWZpbmUgTE9ORwkJNTIKLSNkZWZpbmUgTE9OR19VCQk1MwkvKiB1bmFyeSBMT05HICovCi0jZGVmaW5lIExPTkdfQUYJCTU0CS8qIExPTkcgd2l0aCB0aGUgZmlyc3QgcmVnaXN0ZXIgYSBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIExPTkdfQ01QCTU1CS8qIHNwZWNpYWwgZm9ybSBmb3IgQ01QY2MgYW5kIENNUFVjYyAqLwotI2RlZmluZSBMT05HX00JCTU2CS8qIE1lbW9yeSBsb25nIGZvciBsZGIsIHN0YiAqLwotI2RlZmluZSBMT05HX00yCQk1NwkvKiBNZW1vcnkgbG9uZyBmb3IgbGQydywgc3QydyAqLwotI2RlZmluZSBMT05HXzIJCTU4CS8qIExPTkcgd2l0aCAyIG9wZXJhbmRzOyBicmF0bnogKi8KLSNkZWZpbmUgTE9OR18yYgkJNTkJLyogTE9OR18yIHdpdGggbW9kaWZpZXIgb2YgMyAqLwotI2RlZmluZSBMT05HX0QJCTYwCS8qIGZvciBEQlJBSSovCi0jZGVmaW5lIExPTkdfRGIJCTYxCS8qIGZvciByZXBlYXRpKi8KLQotICAvKiB0aGUgZXhlY3V0aW9uIHVuaXQocykgdXNlZCAqLwotICBpbnQgdW5pdDsKLSNkZWZpbmUgRUlUSEVSCTAKLSNkZWZpbmUgSVUJMQotI2RlZmluZSBNVQkyCi0jZGVmaW5lIEVJVEhFUl9CVVRfUFJFRkVSX01VIDMKLQotICAvKiB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gZGVjaWRlIGlmIHR3byBpbnN0cnVjdGlvbnMgKi8KLSAgLyogY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsICovCi0gIGxvbmcgZmxhZ3NfdXNlZDsKLSAgbG9uZyBmbGFnc19zZXQ7Ci0jZGVmaW5lIEZMQUdfMAkJKDFMPDwwKQotI2RlZmluZSBGTEFHXzEJCSgxTDw8MSkKLSNkZWZpbmUgRkxBR18yCQkoMUw8PDIpCi0jZGVmaW5lIEZMQUdfMwkJKDFMPDwzKQotI2RlZmluZSBGTEFHXzQJCSgxTDw8NCkJCS8qIFMgKHNhdHVyYXRpb24pICovCi0jZGVmaW5lIEZMQUdfNQkJKDFMPDw1KQkJLyogViAob3ZlcmZsb3cpICovCi0jZGVmaW5lIEZMQUdfNgkJKDFMPDw2KQkJLyogVkEgKGFjY3VtdWxhdGVkIG92ZXJmbG93KSAqLwotI2RlZmluZSBGTEFHXzcJCSgxTDw8NykJCS8qIEMgKGNhcnJ5L2JvcnJvdykgKi8KLSNkZWZpbmUgRkxBR19TTQkJKDFMPDw4KQkJLyogU00gKHN0YWNrIG1vZGUpICovCi0jZGVmaW5lIEZMQUdfUlAJCSgxTDw8OSkJCS8qIFJQIChyZXBlYXQgZW5hYmxlKSAqLwotI2RlZmluZSBGTEFHX0NPTlRST0wJKDFMPDwxMCkJLyogY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRkxBR19BMAkJKDFMPDwxMSkJLyogQTAgKi8KLSNkZWZpbmUgRkxBR19BMQkJKDFMPDwxMikJLyogQTEgKi8KLSNkZWZpbmUgRkxBR19KTVAJKDFMPDwxMykJLyogaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggKi8KLSNkZWZpbmUgRkxBR19KU1IJKDFMPDwxNCkJLyogc3Vicm91dGluZSBjYWxsLiAgbXVzdCBiZSBhbGlnbmVkICovCi0jZGVmaW5lIEZMQUdfTUVNCSgxTDw8MTUpCS8qIHJlYWRzL3dyaXRlcyBtZW1vcnkgKi8KLSNkZWZpbmUgRkxBR18yV09SRAkoMUw8PDE2KQkvKiAyIHdvcmQvNCBieXRlIG9wZXJhdGlvbiAqLwotI2RlZmluZSBGTEFHX01VTDE2CSgxTDw8MTcpCS8qIDE2IGJpdCBtdWx0aXBseSAqLwotI2RlZmluZSBGTEFHX01VTDMyCSgxTDw8MTgpCS8qIDMyIGJpdCBtdWx0aXBseSAqLwotI2RlZmluZSBGTEFHX0FERFNVQnBwcAkoMUw8PDE5KQkvKiBBRERwcHAgb3IgU1VCcHBwICovCi0jZGVmaW5lIEZMQUdfREVMQVkJKDFMPDwyMCkJLyogVGhpcyBpcyBhIGRlbGF5ZWQgYnJhbmNoIG9yIGp1bXAgKi8KLSNkZWZpbmUgRkxBR19MS1IJKDFMPDwyMSkJLyogaW5zbiBpbiBsZWZ0IHNsb3Qga2lsbHMgcmlnaHQgc2xvdCAqLwotI2RlZmluZSBGTEFHX0NWVkEJKEZMQUdfNXxGTEFHXzZ8RkxBR183KQotI2RlZmluZSBGTEFHX0MJCUZMQUdfNwotI2RlZmluZSBGTEFHX0FMTAkoRkxBR18wIHwgXAotCQkJIEZMQUdfMSB8IFwKLQkJCSBGTEFHXzIgfCBcCi0JCQkgRkxBR18zIHwgXAotCQkJIEZMQUdfNCB8IFwKLQkJCSBGTEFHXzUgfCBcCi0JCQkgRkxBR182IHwgXAotCQkJIEZMQUdfNyB8IFwKLQkJCSBGTEFHX1NNIHwgXAotCQkJIEZMQUdfUlAgfCBcCi0JCQkgRkxBR19DT05UUk9MKQotCi0gIGludCByZWxvY19mbGFnOwotI2RlZmluZSBSRUxPQ19QQ1JFTAkxCi0jZGVmaW5lIFJFTE9DX0FCUwkyCi19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGQzMHZfb3Bjb2RlIGQzMHZfb3Bjb2RlX3RhYmxlW107Ci1leHRlcm4gY29uc3QgaW50IGQzMHZfbnVtX29wY29kZXM7Ci0KLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDMwdl9vcGVyYW5kLiAgKi8KLXN0cnVjdCBkMzB2X29wZXJhbmQKLXsKLSAgLyogdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgKi8KLSAgaW50IGxlbmd0aDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBwb3NpdGlvbiByZWxhdGl2ZSB0byBSYSAqLwotICBpbnQgcG9zaXRpb247Ci0KLSAgLyogc3ludGF4IGZsYWdzLiAgKi8KLSAgbG9uZyBmbGFnczsKLX07Ci1leHRlcm4gY29uc3Qgc3RydWN0IGQzMHZfb3BlcmFuZCBkMzB2X29wZXJhbmRfdGFibGVbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBkMzB2X29wZXJhbmQuICAqLwotCi0vKiB0aGlzIGlzIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlcjsgaXQgd2lsbCBiZSBtb2RpZmllZCAqLwotLyogdGhpcyBpcyB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9ERVNUCSgxKQotCi0vKiBudW1iZXIgb3Igc3ltYm9sICovCi0jZGVmaW5lIE9QRVJBTkRfTlVNCSgyKQotCi0vKiBhZGRyZXNzIG9yIGxhYmVsICovCi0jZGVmaW5lIE9QRVJBTkRfQUREUgkoNCkKLQotLyogcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9SRUcJKDgpCi0KLS8qIHBvc3RpbmNyZW1lbnQgKyAgKi8KLSNkZWZpbmUgT1BFUkFORF9QTFVTCSgweDEwKQotCi0vKiBwb3N0ZGVjcmVtZW50IC0gICovCi0jZGVmaW5lIE9QRVJBTkRfTUlOVVMJKDB4MjApCi0KLS8qIHNpZ25lZCBudW1iZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9TSUdORUQJKDB4NDApCi0KLS8qIHRoaXMgb3BlcmFuZCBtdXN0IGJlIHNoaWZ0ZWQgbGVmdCBieSAzICovCi0jZGVmaW5lIE9QRVJBTkRfU0hJRlQJKDB4ODApCi0KLS8qIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9GTEFHCSgweDEwMCkKLQotLyogY29udHJvbCByZWdpc3RlciAgKi8KLSNkZWZpbmUgT1BFUkFORF9DT05UUk9MCSgweDIwMCkKLQotLyogYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgT1BFUkFORF9BQ0MJKDB4NDAwKQotCi0vKiBAICAqLwotI2RlZmluZSBPUEVSQU5EX0FUU0lHTgkoMHg4MDApCi0KLS8qIEAoICAqLwotI2RlZmluZSBPUEVSQU5EX0FUUEFSCSgweDEwMDApCi0KLS8qIHByZWRlY3JlbWVudCBtb2RlICdALXNwJyAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVE1JTlVTCSgweDIwMDApCi0KLS8qIHRoaXMgb3BlcmFuZCBjaGFuZ2VzIHRoZSBpbnN0cnVjdGlvbiBuYW1lICovCi0vKiBmb3IgZXhhbXBsZSwgQ1BNY2MsIENNUFVjYyAqLwotI2RlZmluZSBPUEVSQU5EX05BTUUJKDB4NDAwMCkKLQotLyogZmFrZSBvcGVyYW5kIGZvciBtdnRzeXMgYW5kIG12ZnN5cyAqLwotI2RlZmluZSBPUEVSQU5EX1NQRUNJQUwJKDB4ODAwMCkKLQotLyogbGV0IHRoZSBvcHRpbWl6ZXIga25vdyB0aGF0IHR3byByZWdpc3RlcnMgYXJlIGFmZmVjdGVkICovCi0jZGVmaW5lIE9QRVJBTkRfMlJFRwkoMHgxMDAwMCkKLQotLyogVGhlIGZvcm1hdCB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDMwdl9mb3JtYXQuICAqLwotc3RydWN0IGQzMHZfZm9ybWF0Ci17Ci0gIGludAlmb3JtOwkJLyogU0hPUlRfQSwgTE9ORywgZXRjICovCi0gIGludAltb2RpZmllcjsJLyogdHdvIGJpdCBtb2RpZmllciBmb2xsb3dpbmcgb3Bjb2RlICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbNV07Ci19OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X2Zvcm1hdCBkMzB2X2Zvcm1hdF90YWJsZVtdOwotCi0KLS8qIGFuIGluc3RydWN0aW9uIGlzIGRlZmluZWQgYnkgYW4gb3Bjb2RlIGFuZCBhIGZvcm1hdCAqLwotLyogZm9yIGV4YW1wbGUsICJhZGQiIGhhcyBvbmUgb3Bjb2RlLCBidXQgdGhyZWUgZGlmZmVyZW50ICovCi0vKiBmb3JtYXRzLCAyIFNIT1JUX0EgZm9ybXMgYW5kIGEgTE9ORyBmb3JtLiAqLwotc3RydWN0IGQzMHZfaW5zbgotewotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wOwkvKiBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUgKi8KLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmb3JtOwkvKiBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmb3JtYXQgdGFibGUgKi8KLSAgaW50IGVjYzsJCQkvKiBleGVjdXRpb24gY29uZGl0aW9uIGNvZGUgKi8KLX07Ci0KLS8qIGFuIGV4cHJlc3Npb25TIG9ubHkgaGFzIG9uZSByZWdpc3RlciB0eXBlLCBzbyB3ZSBmYWtlIGl0ICovCi0vKiBieSBzZXR0aW5nIGhpZ2ggYml0cyB0byBpbmRpY2F0ZSB0eXBlICovCi0jZGVmaW5lIFJFR0lTVEVSX01BU0sJMHhGRgotCi0jZW5kaWYgLyogRDMwVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9oODMwMC5oIGIvaW5jbHVkZS9vcGNvZGUvaDgzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwNWU0ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9oODMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEg4LTMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20uCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlciBhbmQgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGFzIGEgc2VxdWVuY2Ugb2YgbmliYmxlcy4KLSAgIElmIHRoZSBuaWJibGUgaGFzIHZhbHVlIDE1IG9yIGxlc3MgdGhlbiB0aGUgcmVwcmVzZW50YXRpb24gaXMgY29tcGxldGUuCi0gICBPdGhlcndpc2UsIHdlIHJlY29yZCB3aGF0IGl0IGNvbnRhaW5zIHdpdGggc2V2ZXJhbCBmbGFncy4gICovCi0KLXR5cGVkZWYgaW50IG9wX3R5cGU7Ci0KLSNkZWZpbmUgSGV4MAkwCi0jZGVmaW5lIEhleDEgCTEKLSNkZWZpbmUgSGV4MiAJMgotI2RlZmluZSBIZXgzIAkzCi0jZGVmaW5lIEhleDQgCTQKLSNkZWZpbmUgSGV4NSAJNQotI2RlZmluZSBIZXg2IAk2Ci0jZGVmaW5lIEhleDcgCTcKLSNkZWZpbmUgSGV4OCAJOAotI2RlZmluZSBIZXg5IAk5Ci0jZGVmaW5lIEhleEEgCTEwCi0jZGVmaW5lIEhleEIgCTExCi0jZGVmaW5lIEhleEMgCTEyCi0jZGVmaW5lIEhleEQgCTEzCi0jZGVmaW5lIEhleEUgCTE0Ci0jZGVmaW5lIEhleEYgCTE1Ci0KLSNkZWZpbmUgTF84CQkweDAxCi0jZGVmaW5lIExfMTYJCTB4MDIKLSNkZWZpbmUgTF8zMgkJMHgwNAotI2RlZmluZSBMX1AgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBMXzI0CQkweDEwCi0jZGVmaW5lIE1FTVJFTEFYIAkweDIwCQkJLyogbW92ZSBpbnNuIHdoaWNoIG1heSByZWxheCAqLyAKLSNkZWZpbmUgU1JDICAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgRFNUICAgICAgICAgICAgIDB4ODAKLQotI2RlZmluZSBSRUcJCTB4MTAwCi0jZGVmaW5lIEVYUgkJMHgyMDAKLSNkZWZpbmUgTUFDUkVHCQkweDgwMAotI2RlZmluZSBTUkNfSU5fRFNUCTB4NDAwCi0jZGVmaW5lIElNTQkJMHgxMDAwCi0jZGVmaW5lIERJU1AJCTB4MjAwMAotI2RlZmluZSBJTkQJCTB4NDAwMAotI2RlZmluZSBJTkMJCTB4ODAwMAotI2RlZmluZSBERUMJCTB4MTAwMDAKLSNkZWZpbmUgTF8zCQkweDIwMDAwCi0jZGVmaW5lIEtCSVQgCQkweDQwMDAwCi0jZGVmaW5lIERCSVQgICAgICAgICAgICAweDgwMDAwCi0jZGVmaW5lIERJU1BSRUcgICAgICAgICAweDEwMDAwMAotI2RlZmluZSBJR05PUkUgCQkweDIwMDAwMAotI2RlZmluZSBFICAgICAgCQkweDQwMDAwMAkJLyogRklYTUU6IGVuZCBvZiBuaWJibGUgc2VxdWVuY2U/ICovCi0jZGVmaW5lIExfMgkJMHg4MDAwMDAKLSNkZWZpbmUgQjMwICAJCTB4MTAwMDAwMCAJCS8qIGJpdCAzIG11c3QgYmUgbG93ICovCi0jZGVmaW5lIEIzMSAgCQkweDIwMDAwMDAJCS8qIGJpdCAzIG11c3QgYmUgaGlnaCAqLwotI2RlZmluZSBDQ1IJCTB4NDAwMDAwMAotI2RlZmluZSBBQlMgICAgICAgICAgICAgMHg4MDAwMDAwCi0jZGVmaW5lIEFCU0pNUAkJMHgxMDAwMDAwMCAgCi0jZGVmaW5lIEFCUzhNRU0gICAgICAgICAweDIwMDAwMDAwCQotI2RlZmluZSBQQ1JFTCAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBNRU1JTkQgICAgICAgICAgMHg4MDAwMDAwMAotCi0jZGVmaW5lIElNTTMgCQlJTU18TF8zCi0jZGVmaW5lIElNTTIgCQlJTU18TF8yCi0KLSNkZWZpbmUgU0laRQkJKExfMnxMXzN8TF84fExfMTZ8TF8zMnxMX1B8TF8yNCkKLSNkZWZpbmUgTU9ERQkJKFJFR3xJTU18RElTUHxJTkR8SU5DfERFQ3xDQ1J8QUJTfE1FTUlORHxFWFIpCi0KLSNkZWZpbmUgUkQ4IAkJKERTVHxMXzh8UkVHKQotI2RlZmluZSBSRDE2IAkJKERTVHxMXzE2fFJFRykKLSNkZWZpbmUgUkQzMiAJCShEU1R8TF8zMnxSRUcpCi0jZGVmaW5lIFJTOCAJCShTUkN8TF84fFJFRykKLSNkZWZpbmUgUlMxNiAJCShTUkN8TF8xNnxSRUcpCi0jZGVmaW5lIFJTMzIJCShTUkN8TF8zMnxSRUcpCi0KLSNkZWZpbmUgUlNQIAkJKFNSQ3xMX1B8UkVHKQotI2RlZmluZSBSRFAgCQkoRFNUfExfUHxSRUcpCi0KLSNkZWZpbmUgSU1NOCAJCShJTU18U1JDfExfOCkKLSNkZWZpbmUgSU1NMTYgCQkoSU1NfFNSQ3xMXzE2KQotI2RlZmluZSBJTU0zMiAJCShJTU18U1JDfExfMzIpCi0KLSNkZWZpbmUgQUJTOFNSQyAJKFNSQ3xBQlN8TF84fEFCUzhNRU0pCi0jZGVmaW5lIEFCUzhEU1QJCShEU1R8QUJTfExfOHxBQlM4TUVNKQotCi0jZGVmaW5lIERJU1A4IAkJKFBDUkVMfExfOCkKLSNkZWZpbmUgRElTUDE2IAkJKFBDUkVMfExfMTYpCi0KLSNkZWZpbmUgRElTUDhTUkMJKERJU1B8TF84fFNSQykKLSNkZWZpbmUgRElTUDE2U1JDCShESVNQfExfMTZ8U1JDKQotCi0jZGVmaW5lIERJU1A4RFNUCShESVNQfExfOHxEU1QpCi0jZGVmaW5lIERJU1AxNkRTVAkoRElTUHxMXzE2fERTVCkKLQotI2RlZmluZSBBQlMxNlNSQyAJKFNSQ3xBQlN8TF8xNikKLSNkZWZpbmUgQUJTMTZEU1QgCShEU1R8QUJTfExfMTYpCi0jZGVmaW5lIEFCUzI0U1JDIAkoU1JDfEFCU3xMXzI0KQotI2RlZmluZSBBQlMyNERTVCAJKERTVHxBQlN8TF8yNCkKLSNkZWZpbmUgQUJTMzJTUkMgCShTUkN8QUJTfExfMzIpCi0jZGVmaW5lIEFCUzMyRFNUIAkoRFNUfEFCU3xMXzMyKQotCi0jZGVmaW5lIFJEREVDIAkJKERTVHxERUMpCi0jZGVmaW5lIFJTSU5DIAkJKFNSQ3xJTkMpCi0jZGVmaW5lIFJESU5DCQkoRFNUfElOQykKLQotI2RlZmluZSBSRElORCAJCShEU1R8SU5EKQotI2RlZmluZSBSU0lORCAJCShTUkN8SU5EKQotCi0jaWYgMQotI2RlZmluZSBPUjggUlM4CQkvKiA/Pz8gT1IgYXMgaW4gT25lIFJlZ2lzdGVyPyAqLwotI2RlZmluZSBPUjE2IFJTMTYKLSNkZWZpbmUgT1IzMiBSUzMyCi0jZWxzZQotI2RlZmluZSBPUjggUkQ4Ci0jZGVmaW5lIE9SMTYgUkQxNgotI2RlZmluZSBPUjMyIFJEMzIKLSNlbmRpZgotCi1zdHJ1Y3QgY29kZSAKLXsKLSAgb3BfdHlwZSBuaWJbMzBdOwotfTsKLQotc3RydWN0IGFyZyAKLXsKLSAgb3BfdHlwZSBuaWJbM107Ci19OwotCi1zdHJ1Y3QgaDhfb3Bjb2RlIAotewotICBpbnQgaG93OwotICBpbnQgaW5iYXNlOwotICBpbnQgdGltZTsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IGFyZyBhcmdzOwotICBzdHJ1Y3QgY29kZSBkYXRhOwotICBpbnQgbGVuZ3RoOwotICBpbnQgbm9wZXJhbmRzOwotICBpbnQgaWR4OwotICBpbnQgc2l6ZTsKLX07Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLQotI2RlZmluZSBCSVRPUChjb2RlLCBpbW0sIG5hbWUsIG9wMDAsIG9wMDEsb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMClcCi17IGNvZGUsIDEsIDIsIG5hbWUsCXt7aW1tLFJEOCxFfX0sCXt7b3AwMCwgb3AwMSwgaW1tLCBSRDgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sXAoteyBjb2RlLCAxLCA2LCBuYW1lLAl7e2ltbSxSRElORCxFfX0se3tvcDEwLCBvcDExLCBCMzB8UkRJTkQsIDAsIG9wMDAsb3AwMSwgaW1tLCAwLCBFfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMSwgNiwgbmFtZSwJe3tpbW0sQUJTOERTVCxFfX0se3tvcDIwLCBvcDIxLCBBQlM4RFNULCBJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH1cCi0seyBjb2RlLCAwLCA2LCBuYW1lLAl7e2ltbSxBQlMxNkRTVCxFfX0se3sweDYsMHhhLDB4MSxvcDMwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLCBvcDAwLG9wMDEsIGltbSwgMCxFfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMCwgNiwgbmFtZSwJe3tpbW0sQUJTMzJEU1QsRX19LHt7MHg2LDB4YSwweDMsb3AzMCxBQlMzMkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH0KLQotCi0jZGVmaW5lIEVCSVRPUChjb2RlLCBpbW0sIG5hbWUsIG9wMDAsIG9wMDEsb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMClcCi0gICBCSVRPUChjb2RlLGltbSwgbmFtZSwgb3AwMCsxLCBvcDAxLCBvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKSxcCi0gICBCSVRPUChjb2RlLFJTOCwgIG5hbWUsIG9wMDAsIG9wMDEsIG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApCi0KLSNkZWZpbmUgV1RXT1AoY29kZSxuYW1lLCBvcDEsIG9wMikgXAoteyBjb2RlLCAxLCAyLCBuYW1lLCB7e1JTMTYsIFJEMTYsIEV9fSwge3sgb3AxLCBvcDIsIFJTMTYsIFJEMTYsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotI2RlZmluZSBCUkFOQ0goY29kZSwgbmFtZSwgb3ApIFwKLXsgY29kZSwgMSwgNCxuYW1lLHt7RElTUDgsRSwwfX0sIHt7IDB4NCwgb3AsIERJU1A4LCBJR05PUkUsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgY29kZSwgMCwgNixuYW1lLHt7RElTUDE2LEUsMH19LCB7eyAweDUsIDB4OCwgb3AsIDB4MCwgRElTUDE2LCBJR05PUkUsIElHTk9SRSwgSUdOT1JFLCBFLDB9fSwgMCwgMCwgMCwgMH0gCi0KLSNkZWZpbmUgU09QKGNvZGUsIHgsbmFtZSkgXAote2NvZGUsIDEsIHgsICBuYW1lIAotCi0jZGVmaW5lIE5FV19TT1AoY29kZSwgaW4seCxuYW1lKSBcCi17Y29kZSwgaW4sIHgsICBuYW1lIAotI2RlZmluZSBFT1AgICwwLDAsMCB9Ci0KLSNkZWZpbmUgVFdPT1AoY29kZSwgbmFtZSwgb3AxLCBvcDIsb3AzKSBcCi17IGNvZGUsMSwgMixuYW1lLCB7e0lNTTgsIFJEOCwgRX19LAl7eyBvcDEsIFJEOCwgSU1NOCwgSUdOT1JFLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMSwgMixuYW1lLCB7e1JTOCwgUkQ4LCBFfX0sCXt7IG9wMiwgb3AzLCBSUzgsIFJEOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSAKLQotI2RlZmluZSBVTk9QKGNvZGUsbmFtZSwgb3AxLCBvcDIpIFwKLXsgY29kZSwgMSwgMiwgbmFtZSwge3tPUjgsIEUsIDB9fSwge3sgb3AxLCBvcDIsIDAsIE9SOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfQotCi0jZGVmaW5lIFVOT1AzKGNvZGUsIG5hbWUsIG9wMSwgb3AyLCBvcDMpIFwKLXsgTyhjb2RlLFNCKSwgMSwgMiwgbmFtZSwge3tPUjgsICBFLCAwfX0sIHt7b3AxLCBvcDIsIG9wMyswLCBPUjgsICBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IE8oY29kZSxTVyksIDAsIDIsIG5hbWUsIHt7T1IxNiwgRSwgMH19LCB7e29wMSwgb3AyLCBvcDMrMSwgT1IxNiwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU0wpLCAwLCAyLCBuYW1lLCB7e09SMzIsIEUsIDB9fSwge3tvcDEsIG9wMiwgb3AzKzMsIE9SMzJ8QjMwLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9IFwKLSx7IE8oY29kZSxTQiksIDEsIDIsIG5hbWUsIHt7SU1NLCBPUjggfCBTUkNfSU5fRFNULCAgRX19LCB7e29wMSwgb3AyLCBvcDMrNCwgT1I4IHwgU1JDX0lOX0RTVCwgIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNXKSwgMCwgMiwgbmFtZSwge3tJTU0sIE9SMTYgfCBTUkNfSU5fRFNULCBFfX0sIHt7b3AxLCBvcDIsIG9wMys1LCBPUjE2IHwgU1JDX0lOX0RTVCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU0wpLCAwLCAyLCBuYW1lLCB7e0lNTSwgT1IzMiB8IFNSQ19JTl9EU1QsIEV9fSwge3tvcDEsIG9wMiwgb3AzKzcsIE9SMzIgfCBTUkNfSU5fRFNUfEIzMCAsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotCi0jZGVmaW5lIElNTTMyTElTVCBJTU0zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgSU1NMjRMSVNUIElNTTI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgSU1NMTZMSVNUIElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEExNkxJU1QgTF8xNixJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBESVNQMjRMSVNUIERJU1B8TF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIERJU1AzMkxJU1QgRElTUHxMXzMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBQlMyNExJU1QgQUJTfExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBQlMzMkxJU1QgQUJTfExfMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEEyNExJU1QgTF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEEzMkxJU1QgTF8zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgUFJFRklYMzIgMHgwLDB4MSwweDAsMHgwCi0jZGVmaW5lIFBSRUZJWExEQyAweDAsMHgxLDB4NCwweDAKLQotCi0jZGVmaW5lIE8ob3AsIHNpemUpIChvcCo0K3NpemUpCi0KLSNkZWZpbmUgT19SRUNPTVBJTEUgMAotI2RlZmluZSBPX0FERCAgMQotI2RlZmluZSBPX0FERFggMgotI2RlZmluZSBPX0FORCAgMwotI2RlZmluZSBPX0JBTkQgNAotI2RlZmluZSBPX0JSQSAgNQotI2RlZmluZSBPX0JSTiAgNgotI2RlZmluZSBPX0JISSAgNwotI2RlZmluZSBPX0JMUyAgOAotI2RlZmluZSBPX0JDQyAgOQotI2RlZmluZSBPX0JDUyAgMTAKLSNkZWZpbmUgT19CTkUgIDExICAKLSNkZWZpbmUgT19CVkMgIDEyCi0jZGVmaW5lIE9fQlZTICAxMwotI2RlZmluZSBPX0JQTCAgMTQKLSNkZWZpbmUgT19CTUkgIDE1Ci0jZGVmaW5lIE9fQkdFICAxNgotI2RlZmluZSBPX0JMVCAgMTcKLSNkZWZpbmUgT19CR1QgIDE4Ci0jZGVmaW5lIE9fQkxFICAxOQotI2RlZmluZSBPX0FOREMgMjAKLSNkZWZpbmUgT19CRVEgMjEKLSNkZWZpbmUgT19CQ0xSIDIyCi0jZGVmaW5lIE9fQklBTkQgMjMKLSNkZWZpbmUgT19CSUxEIDI0Ci0jZGVmaW5lIE9fQklPUiAyNQotI2RlZmluZSBPX0JJWE9SIDI2Ci0jZGVmaW5lIE9fQklTVCAyNwotI2RlZmluZSBPX0JMRCAyOAotI2RlZmluZSBPX0JOT1QgMjkKLSNkZWZpbmUgT19CU0VUIDMwCi0jZGVmaW5lIE9fQlNSIDMxCi0jZGVmaW5lIE9fQlhPUiAzMgotI2RlZmluZSBPX0NNUCAzMwotI2RlZmluZSBPX0RBQSAzNAotI2RlZmluZSBPX0RBUyAzNQotI2RlZmluZSBPX0RFQyAzNgotI2RlZmluZSBPX0RJVlUgMzcKLSNkZWZpbmUgT19ESVZTIDM4Ci0jZGVmaW5lIE9fSU5DIDM5Ci0jZGVmaW5lIE9fTERDIDQwCi0jZGVmaW5lIE9fTU9WX1RPX01FTSA0MQotI2RlZmluZSBPX09SIDQyCi0jZGVmaW5lIE9fUk9UTCA0MwotI2RlZmluZSBPX1JPVFIgNDQKLSNkZWZpbmUgT19ST1RYTCA0NQotI2RlZmluZSBPX1JPVFhSIDQ2Ci0jZGVmaW5lIE9fQlBUIDQ3Ci0jZGVmaW5lIE9fU0hBTCA0OAotI2RlZmluZSBPX1NIQVIgNDkKLSNkZWZpbmUgT19TSExMIDUwCi0jZGVmaW5lIE9fU0hMUiA1MQotI2RlZmluZSBPX1NVQiAgNTIKLSNkZWZpbmUgT19TVUJTIDUzCi0jZGVmaW5lIE9fVFJBUEEgNTQKLSNkZWZpbmUgT19YT1IgNTUKLSNkZWZpbmUgT19YT1JDIDU2Ci0jZGVmaW5lIE9fQk9SIDU3Ci0jZGVmaW5lIE9fQlNUIDU4Ci0jZGVmaW5lIE9fQlRTVCA1OQotI2RlZmluZSBPX0VFUE1PViA2MAotI2RlZmluZSBPX0VYVFMgNjEKLSNkZWZpbmUgT19FWFRVIDYyCi0jZGVmaW5lIE9fSk1QIDYzCi0jZGVmaW5lIE9fSlNSIDY0Ci0jZGVmaW5lIE9fTVVMVSA2NQotI2RlZmluZSBPX01VTFMgNjYKLSNkZWZpbmUgT19OT1AgNjcKLSNkZWZpbmUgT19OT1QgNjgKLSNkZWZpbmUgT19PUkMgNjkKLSNkZWZpbmUgT19SVEUgNzAKLSNkZWZpbmUgT19TVEMgNzEKLSNkZWZpbmUgT19TVUJYIDcyCi0jZGVmaW5lIE9fTkVHIDczCi0jZGVmaW5lIE9fUlRTIDc0Ci0jZGVmaW5lIE9fU0xFRVAgNzUKLSNkZWZpbmUgT19JTEwgNzYKLSNkZWZpbmUgT19BRERTIDc3Ci0jZGVmaW5lIE9fU1lTQ0FMTCA3OAotI2RlZmluZSBPX01PVl9UT19SRUcgNzkKLSNkZWZpbmUgT19UQVMgODAKLSNkZWZpbmUgT19DTFJNQUMgODIKLSNkZWZpbmUgT19MRE1BQyA4MwotI2RlZmluZSBPX01BQyA4NAotI2RlZmluZSBPX0xETSA4NQotI2RlZmluZSBPX1NUTSA4NgotI2RlZmluZSBPX1NUTUFDIDg3Ci0jZGVmaW5lIE9fTEFTVCA4OAotI2RlZmluZSBTQiAwCi0jZGVmaW5lIFNXIDEKLSNkZWZpbmUgU0wgMgotI2RlZmluZSBTTiAzCi0KLQotLyogRklYTUU6IExvdHMgb2YgaW5zbnMgaGF2ZSAiRSwgMCwgMCwgMCwgMCIgaW4gdGhlIG5pYmJsZSBjb2RlIHNlcXVlbmNlcy4KLSAgIE1ldGhpbmtzIHRoZSB6ZXJvZXMgYXJlbid0IG5lY2Vzc2FyeS4gIE9uY2UgY29uZmlybWVkLCBudWtlICdlbS4gICovCi0KLXN0cnVjdCBoOF9vcGNvZGUgaDhfb3Bjb2Rlc1tdID0gCi17Ci0gIFRXT09QKE8oT19BREQsU0IpLCJhZGQuYiIsIDB4OCwgMHgwLDB4OCksCi0gIAotICBORVdfU09QKE8oT19BREQsU1cpLDEsMiwiYWRkLnciKSx7e1JTMTYsUkQxNixFfX0se3sweDAsMHg5LFJTMTYsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19BREQsU1cpLDAsNCwiYWRkLnciKSx7e0lNTTE2LFJEMTYsRX19LHt7MHg3LDB4OSwweDEsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19BREQsU0wpLDAsMiwiYWRkLmwiKSx7e1JTMzIsUkQzMixFIH19LCB7ezB4MCwweEEsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNMKSwwLDYsImFkZC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MSxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQUREUyxTTCksMSwyLCJhZGRzIiksIHt7S0JJVCxSRFAsRX19LCAgIHt7MHgwLDB4QixLQklULFJEUCxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgVFdPT1AoTyhPX0FERFgsU0IpLCJhZGR4IiwweDksMHgwLDB4RSksCi0gIFRXT09QKE8oT19BTkQsU0IpLCAiYW5kLmIiLDB4RSwweDEsMHg2KSwKLQotICBORVdfU09QKE8oT19BTkQsU1cpLDAsMiwiYW5kLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NixSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5ELFNXKSwwLDQsImFuZC53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4NixSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIAotICBORVdfU09QKE8oT19BTkQsU0wpLDAsNiwiYW5kLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg2LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19BTkQsU0wpLDAsMiwiYW5kLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg2LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fQU5EQyxTQiksMSwyLCJhbmRjIiksIHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDYsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBORVdfU09QKE8oT19BTkRDLFNCKSwxLDIsImFuZGMiKSwge3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDYsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotCi0gIEJJVE9QKE8oT19CQU5ELFNCKSwgSU1NM3xCMzAsImJhbmQiLDB4NywweDYsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJSQU5DSChPKE9fQlJBLFNCKSwiYnJhIiwweDApLAotICBCUkFOQ0goTyhPX0JSQSxTQiksImJ0IiwweDApLAotICBCUkFOQ0goTyhPX0JSTixTQiksImJybiIsMHgxKSwKLSAgQlJBTkNIKE8oT19CUk4sU0IpLCJiZiIsMHgxKSwKLSAgQlJBTkNIKE8oT19CSEksU0IpLCJiaGkiLDB4MiksCi0gIEJSQU5DSChPKE9fQkxTLFNCKSwiYmxzIiwweDMpLAotICBCUkFOQ0goTyhPX0JDQyxTQiksImJjYyIsMHg0KSwKLSAgQlJBTkNIKE8oT19CQ0MsU0IpLCJiaHMiLDB4NCksCi0gIEJSQU5DSChPKE9fQkNTLFNCKSwiYmNzIiwweDUpLAotICBCUkFOQ0goTyhPX0JDUyxTQiksImJsbyIsMHg1KSwKLSAgQlJBTkNIKE8oT19CTkUsU0IpLCJibmUiLDB4NiksCi0gIEJSQU5DSChPKE9fQkVRLFNCKSwiYmVxIiwweDcpLAotICBCUkFOQ0goTyhPX0JWQyxTQiksImJ2YyIsMHg4KSwKLSAgQlJBTkNIKE8oT19CVlMsU0IpLCJidnMiLDB4OSksCi0gIEJSQU5DSChPKE9fQlBMLFNCKSwiYnBsIiwweEEpLAotICBCUkFOQ0goTyhPX0JNSSxTQiksImJtaSIsMHhCKSwKLSAgQlJBTkNIKE8oT19CR0UsU0IpLCJiZ2UiLDB4QyksCi0gIEJSQU5DSChPKE9fQkxULFNCKSwiYmx0IiwweEQpLAotICBCUkFOQ0goTyhPX0JHVCxTQiksImJndCIsMHhFKSwKLSAgQlJBTkNIKE8oT19CTEUsU0IpLCJibGUiLDB4RiksCi0KLSAgRUJJVE9QKE8oT19CQ0xSLFNCKSxJTU0zfEIzMCwiYmNsciIsIDB4NiwweDIsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0gIEJJVE9QKE8oT19CSUFORCxTQiksSU1NM3xCMzEsImJpYW5kIiwweDcsMHg2LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQklMRCxTQiksIElNTTN8QjMxLCJiaWxkIiwgMHg3LDB4NywweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JJT1IsU0IpLCBJTU0zfEIzMSwiYmlvciIsIDB4NywweDQsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CSVNULFNCKSwgSU1NM3xCMzEsImJpc3QiLCAweDYsMHg3LDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQklYT1IsU0IpLElNTTN8QjMxLCJiaXhvciIsMHg3LDB4NSwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JMRCxTQiksICBJTU0zfEIzMCwiYmxkIiwgIDB4NywweDcsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEVCSVRPUChPKE9fQk5PVCxTQiksSU1NM3xCMzAsImJub3QiLCAweDYsMHgxLDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQk9SLFNCKSwgIElNTTN8QjMwLCJib3IiLCAgMHg3LDB4NCwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgRUJJVE9QKE8oT19CU0VULFNCKSxJTU0zfEIzMCwiYnNldCIsIDB4NiwweDAsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0KLSAgU09QKE8oT19CU1IsU0IpLDYsImJzciIpLHt7RElTUDgsRSwwfX0se3sgMHg1LDB4NSxESVNQOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBTT1AoTyhPX0JTUixTQiksNiwiYnNyIikse3tESVNQMTYsRSwwfX0se3sgMHg1LDB4QywweDAsMHgwLERJU1AxNixJR05PUkUsSUdOT1JFLElHTk9SRSxFLDAsMCwwLDB9fSBFT1AsCi0gIEJJVE9QKE8oT19CU1QsU0IpLCBJTU0zfEIzMCwiYnN0IiwweDYsMHg3LDB4NywweEQsMHg3LDB4RiwweDgpLAotICBFQklUT1AoTyhPX0JUU1QsU0IpLCBJTU0zfEIzMCwiYnRzdCIsMHg2LDB4MywweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JYT1IsU0IpLCBJTU0zfEIzMCwiYnhvciIsMHg3LDB4NSwweDcsMHhDLDB4NywweEUsMHgwKSwKLQotICBUV09PUChPKE9fQ01QLFNCKSwgImNtcC5iIiwweEEsMHgxLDB4QyksCi0gIFdUV09QKE8oT19DTVAsU1cpLCAiY21wLnciLDB4MSwweEQpLAotCi0gIE5FV19TT1AoTyhPX0NNUCxTVyksMSwyLCJjbXAudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDEsMHhELFJTMTYsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19DTVAsU1cpLDAsNCwiY21wLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHgyLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19DTVAsU0wpLDAsNiwiY21wLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgyLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19DTVAsU0wpLDAsMiwiY21wLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MSwweEYsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLQotICBVTk9QKE8oT19EQUEsU0IpLCAiZGFhIiwweDAsMHhGKSwKLSAgVU5PUChPKE9fREFTLFNCKSwgImRhcyIsMHgxLDB4RiksCi0gIFVOT1AoTyhPX0RFQyxTQiksICJkZWMuYiIsMHgxLDB4QSksCi0KLSAgTkVXX1NPUChPKE9fREVDLCBTVyksMCwyLCJkZWMudyIpICx7e0RCSVQsUkQxNixFIH19LHt7MHgxLDB4QiwweDV8REJJVCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0RFQywgU0wpLDAsMiwiZGVjLmwiKSAse3tEQklULFJEMzIsRSB9fSx7ezB4MSwweEIsMHg3fERCSVQsUkQzMnxCMzAsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19ESVZVLFNCKSwxLDYsImRpdnh1LmIiKSwge3tSUzgsUkQxNixFfX0sIHt7MHg1LDB4MSxSUzgsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRElWVSxTVyksMCwyMCwiZGl2eHUudyIpLHt7UlMxNixSRDMyLEV9fSx7ezB4NSwweDMsUlMxNixCMzB8UkQzMixFfX1FT1AsCi0gICAgCi0gIE5FV19TT1AoTyhPX0RJVlMsU0IpLDAsMjAsImRpdnhzLmIiKSAse3tSUzgsUkQxNixFIH19LHt7MHgwLDB4MSwweEQsMHgwLDB4NSwweDEsUlM4LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fRElWUyxTVyksMCwwMiwiZGl2eHMudyIpICx7e1JTMTYsUkQzMixFIH19LHt7MHgwLDB4MSwweEQsMHgwLDB4NSwweDMsUlMxNixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0VFUE1PVixTQiksMSw1MCwiZWVwbW92LmIiKSx7e0UsMCwwfX0se3sweDcsMHhCLDB4NSwweEMsMHg1LDB4OSwweDgsMHhGLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fRUVQTU9WLFNXKSwwLDUwLCJlZXBtb3YudyIpLHt7RSwwLDB9fSx7ezB4NywweEIsMHhELDB4NCwweDUsMHg5LDB4OCwweEYsRX19IEVPUCwKLSAgICAKLSAgTkVXX1NPUChPKE9fRVhUUyxTVyksMCwyLCJleHRzLnciKSx7e09SMTYsRSwwfX0se3sweDEsMHg3LDB4RCxPUjE2LEUgICB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRVhUUyxTTCksMCwyLCJleHRzLmwiKSx7e09SMzIsRSwwfX0se3sweDEsMHg3LDB4RixPUjMyfEIzMCxFICAgfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fRVhUVSxTVyksMCwyLCJleHR1LnciKSx7e09SMTYsRSwwfX0se3sweDEsMHg3LDB4NSxPUjE2LEUgICB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRVhUVSxTTCksMCwyLCJleHR1LmwiKSx7e09SMzIsRSwwfX0se3sweDEsMHg3LDB4NyxPUjMyfEIzMCxFICAgfX1FT1AsCi0gICAgCi0gIFVOT1AoTyhPX0lOQyxTQiksICJpbmMiLDB4MCwweEEpLAotCi0gIE5FV19TT1AoTyhPX0lOQyxTVyksMCwyLCJpbmMudyIpICx7e0RCSVQsUkQxNixFIH19LHt7MHgwLDB4QiwweDV8REJJVCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0lOQyxTTCksMCwyLCJpbmMubCIpICx7e0RCSVQsUkQzMixFIH19LHt7MHgwLDB4QiwweDd8REJJVCxSRDMyfEIzMCxFfX0gRU9QLAotCi0gIFNPUChPKE9fSk1QLFNCKSw0LCJqbXAiKSx7e1JTSU5ELEUsMH19LHt7MHg1LDB4OSxCMzB8UlNJTkQsMHgwLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX0pNUCxTQiksNiwiam1wIikse3tTUkN8QUJTSk1QLEUsMH19LHt7MHg1LDB4QSxTUkN8QUJTSk1QLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX0pNUCxTQiksOCwiam1wIikse3tTUkN8TUVNSU5ELEUsMH19LHt7MHg1LDB4QixTUkN8TUVNSU5ELElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX0pTUixTQiksNiwianNyIikse3tTUkN8UlNJTkQsRSwwfX0sIHt7MHg1LDB4RCxCMzB8UlNJTkQsMHgwLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX0pTUixTQiksOCwianNyIikse3tTUkN8QUJTSk1QLEUsMH19LHt7MHg1LDB4RSxTUkN8QUJTSk1QLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX0pTUixTQiksOCwianNyIikse3tTUkN8TUVNSU5ELEUsMH19LHt7MHg1LDB4RixTUkN8TUVNSU5ELElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tJTU04LENDUixFfX0sICAgICAgICAge3sgMHgwLDB4NyxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7T1I4LENDUixFfX0sICAgICAgICAgIHt7IDB4MCwweDMsMHgwLE9SOCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMTZTUkMsQ0NSLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHgwLDB4MCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzMyU1JDLENDUixFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4MiwweDAsU1JDfEFCUzMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMTYsQ0NSLEV9fSx7e1BSRUZJWExEQywweDYsMHhGLEIzMHxESVNQUkVHLDAsRElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8zMixDQ1IsRX19LHt7UFJFRklYTERDLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4MiwweDAsU1JDfERJU1AzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lOQyxDQ1IsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4RCxCMzB8UlNJTkMsMHgwLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkQsQ0NSLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweDksQjMwfFJESU5ELDB4MCxFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e0lNTTgsRVhSLEV9fSwgICAgICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NyxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7T1I4LEVYUixFfX0sICAgICAgICAgIHt7IDB4MCwweDMsMHgxLE9SOCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMTZTUkMsRVhSLEV9fSwgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhiLDB4MCwweDAsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMzMlNSQyxFWFIsRX19LCAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweGIsMHgyLDB4MCxTUkN8QUJTMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8xNixFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhmLEIzMHxESVNQUkVHLDAsRElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8zMixFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweDIsMHgwLFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkMsRVhSLEV9fSwgICAgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhkLEIzMHxSU0lOQywweDAsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lORCxFWFIsRX19LCAgICAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweDksQjMwfFJESU5ELDB4MCxFfX0gRU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e0FCU3xTUkN8TF8xNnxNRU1SRUxBWCxSRDgsRX19LCAge3sgMHg2LDB4QSwweDAsUkQ4LFNSQ3xBQlN8TUVNUkVMQVh8QTE2TElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0FCU3xTUkN8TF8zMnxNRU1SRUxBWCxSRDgsRSB9fSwge3sgMHg2LDB4QSwweDIsUkQ4LFNSQ3xBQlN8TUVNUkVMQVh8QTMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsQUJTfExfMTZ8TUVNUkVMQVh8RFNULEV9fSwgICAgIHt7IDB4NiwweEEsMHg4LFJTOCxEU1R8QUJTfE1FTVJFTEFYfEExNkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDYsIm1vdi5iIikse3tSUzgsQUJTfERTVHxMXzMyfE1FTVJFTEFYLEUgfX0sICAgIHt7IDB4NiwweEEsMHhBLFJTOCxEU1R8QUJTfE1FTVJFTEFYfEEzMkxJU1QsRSB9fUVPUCwKLSAgICAKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7RElTUHxMXzMyfFNSQyxSRDgsRX19LCAge3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QSwweDIsUkQ4LFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LERJU1B8TF8zMnxEU1QsRX19LCAge3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QSwweEEsUlM4LERTVHxESVNQMzJMSVNULEV9fUVPUCwKLQotCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwyLCJtb3YuYiIpLHt7UlM4LFJEOCxFfX0sCSAgICB7eyAweDAsMHhDLFJTOCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMiwibW92LmIiKSx7e0lNTTgsUkQ4LEV9fSwgICAgICAgICAgIHt7IDB4RixSRDgsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e1JTSU5ELFJEOCxFfX0sICAgICAgICAgIHt7IDB4NiwweDgsQjMwfFJTSU5ELFJEOCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7RElTUDE2U1JDLFJEOCxFfX0sICAgICAge3sgMHg2LDB4RSxCMzB8RElTUFJFRyxSRDgsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7UlNJTkMsUkQ4LEV9fSwgICAgICAgICAge3sgMHg2LDB4QyxCMzB8UlNJTkMsUkQ4LEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e0FCUzhTUkMsUkQ4LEV9fSwgICAgICAgIHt7IDB4MixSRDgsQUJTOFNSQyxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxSRElORCxFfX0sICAgICAgICAgIHt7IDB4NiwweDgsUkRJTkR8QjMxLFJTOCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LERJU1AxNkRTVCxFfX0sICAgICAge3sgMHg2LDB4RSxESVNQUkVHfEIzMSxSUzgsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LFJEREVDfEIzMSxFfX0sICAgICAge3sgMHg2LDB4QyxSRERFQ3xCMzEsUlM4LEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxBQlM4RFNULEV9fSwgICAgICAgIHt7IDB4MyxSUzgsQUJTOERTVCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixSRElORCxFfX0sICAgICAgICB7eyAweDYsMHg5LFJESU5EfEIzMSxSUzE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tESVNQfExfMzJ8U1JDLFJEMTYsRX19LHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHgyLFJEMTYsU1JDfERJU1AzMkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LERJU1B8TF8zMnxEU1QsRX19LHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHhBLFJTMTYsRFNUfERJU1AzMkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tBQlN8TF8zMnxNRU1SRUxBWHxTUkMsUkQxNixFIH19LHt7IDB4NiwweEIsMHgyLFJEMTYsU1JDfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LEFCU3xMXzMyfE1FTVJFTEFYfERTVCxFIH19LHt7IDB4NiwweEIsMHhBLFJTMTYsRFNUfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDIsIm1vdi53Iikse3tSUzE2LFJEMTYsRX19LCAgICAgICAgIHt7IDB4MCwweEQsUlMxNiwgUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw0LCJtb3YudyIpLHt7SU1NMTYsUkQxNixFfX0sICAgICAgICB7eyAweDcsMHg5LDB4MCxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw0LCJtb3YudyIpLHt7UlNJTkQsUkQxNixFfX0sICAgICAgICB7eyAweDYsMHg5LEIzMHxSU0lORCxSRDE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tESVNQMTZTUkMsUkQxNixFfX0sICAgIHt7IDB4NiwweEYsQjMwfERJU1BSRUcsUkQxNixESVNQMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tSU0lOQyxSRDE2LEV9fSwgICAgICAgIHt7IDB4NiwweEQsQjMwfFJTSU5DLFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNiwibW92LnciKSx7e0FCUzE2U1JDLFJEMTYsRX19LCAgICAge3sgMHg2LDB4QiwweDAsUkQxNixBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixESVNQMTZEU1QsRX19LCAgICB7eyAweDYsMHhGLERJU1BSRUd8QjMxLFJTMTYsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixSRERFQyxFfX0sICAgICAgICB7eyAweDYsMHhELFJEREVDfEIzMSxSUzE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LEFCUzE2RFNULEV9fSwgICAgIHt7IDB4NiwweEIsMHg4LFJTMTYsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNCwibW92LmwiKSx7e0lNTTMyLFJEMzIsRX19LCAgICAgICAge3sgMHg3LDB4QSwweDAsQjMwfFJEMzIsSU1NMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSwyLCJtb3YubCIpLHt7UlMzMixSRDMyLEV9fSwgICAgICAgICB7eyAweDAsMHhGLEIzMXxSUzMyLEIzMHxSRDMyLEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNCwibW92LmwiKSx7e1JTSU5ELFJEMzIsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4OSxSU0lORHxCMzAsQjMwfFJEMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tESVNQMTZTUkMsUkQzMixFfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEYsRElTUFJFR3xCMzAsQjMwfFJEMzIsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0RJU1B8TF8zMnxTUkMsUkQzMixFfX0se3sgUFJFRklYMzIsMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QiwweDIsQjMwfFJEMzIsU1JDfERJU1AzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7UlNJTkMsUkQzMixFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHhELEIzMHxSU0lOQyxCMzB8UkQzMixFLDAsMCwwLDAgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0FCUzE2U1JDLFJEMzIsRX19LCAgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDAsQjMwfFJEMzIsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7QUJTMzJTUkN8TUVNUkVMQVgsUkQzMixFIH19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4MixCMzB8UkQzMixTUkN8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsUkRJTkQsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4OSxSRElORHxCMzEsQjMwfFJTMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLERJU1AxNkRTVCxFfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEYsRElTUFJFR3xCMzEsQjMwfFJTMzIsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsRElTUHxMXzMyfERTVCxFfX0se3sgUFJFRklYMzIsMHg3LDB4OCxCMzF8RElTUFJFRywweDAsMHg2LDB4QiwweEEsQjMwfFJTMzIsRFNUfERJU1AzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixSRERFQyxFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHhELFJEREVDfEIzMSxCMzB8UlMzMixFLDAsMCwwLDAgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsQUJTMTZEU1QsRX19LCAgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDgsQjMwfFJTMzIsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixBQlMzMkRTVHxNRU1SRUxBWCxFIH19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4QSxCMzB8UlMzMixEU1R8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwxMCwibW92ZnBlIikse3tBQlMxNlNSQyxSRDgsRX19LHt7IDB4NiwweEEsMHg0LFJEOCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksMTAsIm1vdnRwZSIpLHt7UlM4LEFCUzE2RFNULEV9fSx7eyAweDYsMHhBLDB4QyxSUzgsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIE5FV19TT1AoTyhPX01VTFUsU0IpLDEsMTQsIm11bHh1LmIiKSx7e1JTOCxSRDE2LEV9fSwge3sgMHg1LDB4MCxSUzgsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTVVMVSxTVyksMCwxNCwibXVseHUudyIpLHt7UlMxNixSRDMyLEV9fSx7eyAweDUsMHgyLFJTMTYsQjMwfFJEMzIsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTVVMUyxTQiksMCwyMCwibXVseHMuYiIpLHt7UlM4LFJEMTYsRX19LCB7eyAweDAsMHgxLDB4YywweDAsMHg1LDB4MCxSUzgsUkQxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX01VTFMsU1cpLDAsMjAsIm11bHhzLnciKSx7e1JTMTYsUkQzMixFfX0se3sgMHgwLDB4MSwweGMsMHgwLDB4NSwweDIsUlMxNixCMzB8UkQzMixFfX1FT1AsCi0gIAotICAvKiA/Pz8gVGhpcyBjYW4gdXNlIFVOT1AzLiAgKi8KLSAgTkVXX1NPUChPKE9fTkVHLFNCKSwxLDIsIm5lZy5iIikse3sgT1I4LEUsIDB9fSx7eyAweDEsMHg3LDB4OCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX05FRyxTVyksMCwyLCJuZWcudyIpLHt7IE9SMTYsRSwwfX0se3sgMHgxLDB4NywweDksT1IxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX05FRyxTTCksMCwyLCJuZWcubCIpLHt7IE9SMzIsRSwwfX0se3sgMHgxLDB4NywweEIsQjMwfE9SMzIsRX19RU9QLAotICAgIAotICBORVdfU09QKE8oT19OT1AsU04pLDEsMiwibm9wIikse3tFLDAsMH19LHt7IDB4MCwweDAsMHgwLDB4MCxFLDAsMCwwLDB9fUVPUCwKLQotICAvKiA/Pz8gVGhpcyBjYW4gdXNlIFVOT1AzLiAgKi8KLSAgTkVXX1NPUChPKE9fTk9ULFNCKSwxLDIsIm5vdC5iIikse3sgT1I4LEUsIDB9fSx7eyAweDEsMHg3LDB4MCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX05PVCxTVyksMCwyLCJub3QudyIpLHt7IE9SMTYsRSwwfX0se3sgMHgxLDB4NywweDEsT1IxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX05PVCxTTCksMCwyLCJub3QubCIpLHt7IE9SMzIsRSwwfX0se3sgMHgxLDB4NywweDMsQjMwfE9SMzIsRX19RU9QLAotCi0gIFRXT09QKE8oT19PUiwgU0IpLCJvci5iIiwweEMsMHgxLDB4NCksCi0gIE5FV19TT1AoTyhPX09SLFNXKSwwLDQsIm9yLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHg0LFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fT1IsU1cpLDAsMiwib3IudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDYsMHg0LFJTMTYsUkQxNixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX09SLFNMKSwwLDYsIm9yLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg0LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19PUixTTCksMCwyLCJvci5sIikse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg0LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fT1JDLFNCKSwxLDIsIm9yYyIpLHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDQsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX09SQyxTQiksMSwyLCJvcmMiKSx7e0lNTTgsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NCxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19NT1ZfVE9fUkVHLFNXKSwxLDYsInBvcC53Iikse3tPUjE2LEUsMH19LHt7IDB4NiwweEQsMHg3LE9SMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19SRUcsU0wpLDAsNiwicG9wLmwiKSx7e09SMzIsRSwwfX0se3sgUFJFRklYMzIsMHg2LDB4RCwweDcsT1IzMnxCMzAsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19NRU0sU1cpLDEsNiwicHVzaC53Iikse3tPUjE2LEUsMH19LHt7IDB4NiwweEQsMHhGLE9SMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19NRU0sU0wpLDAsNiwicHVzaC5sIikse3tPUjMyLEUsMH19LHt7IFBSRUZJWDMyLDB4NiwweEQsMHhGLE9SMzJ8QjMwLEUsMCwwLDAsMH19RU9QLAotCi0gIFVOT1AzKE9fUk9UTCwgICJyb3RsIiwgMHgxLDB4MiwweDgpLAotICBVTk9QMyhPX1JPVFIsICAicm90ciIsIDB4MSwweDMsMHg4KSwKLSAgVU5PUDMoT19ST1RYTCwgInJvdHhsIiwweDEsMHgyLDB4MCksCi0gIFVOT1AzKE9fUk9UWFIsICJyb3R4ciIsMHgxLDB4MywweDApLAotCi0gIFNPUChPKE9fQlBULFNOKSwgIDEwLCJicHQiKSx7e0UsMCwwfX0se3sgMHg3LDB4QSwweEYsMHhGLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX1JURSxTTiksICAxMCwicnRlIikse3tFLDAsMH19LHt7IDB4NSwweDYsMHg3LDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19SVFMsU04pLCAgIDgsInJ0cyIpLHt7RSwwLDB9fSx7eyAweDUsMHg0LDB4NywweDAsRSwwLDAsMCwwfX1FT1AsCi0KLSAgVU5PUDMoT19TSEFMLCAgInNoYWwiLDB4MSwweDAsMHg4KSwKLSAgVU5PUDMoT19TSEFSLCAgInNoYXIiLDB4MSwweDEsMHg4KSwKLSAgVU5PUDMoT19TSExMLCAgInNobGwiLDB4MSwweDAsMHgwKSwKLSAgVU5PUDMoT19TSExSLCAgInNobHIiLDB4MSwweDEsMHgwKSwKLQotICBTT1AoTyhPX1NMRUVQLFNOKSwyLCJzbGVlcCIpLHt7RSwwLDB9fSx7eyAweDAsMHgxLDB4OCwweDAsRSwwLDAsMCwwfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksIDEsMiwic3RjIikse3tDQ1IsUkQ4LEV9fSx7eyAweDAsMHgyLDB4MCxSRDgsRSwwLDAsMCwwfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixSU0lORCxFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHg5LEIzMXxSRElORCwweDAsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLERJU1B8RFNUfExfMTYsRX19LHt7UFJFRklYTERDLDB4NiwweEYsQjMxfERJU1BSRUcsMCxEU1R8RElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLERJU1B8RFNUfExfMzIsRX19LHt7UFJFRklYTERDLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4QSwweDAsRFNUfERJU1AzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsUkRERUMsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4RCxCMzF8UkRERUMsMHgwLEV9fUVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsQUJTMTZTUkMsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweDgsMHgwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLEFCUzMyU1JDLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHhBLDB4MCxEU1R8QUJTMzJMSVNULEV9fUVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLCAxLDIsInN0YyIpLHt7RVhSLFJEOCxFfX0se3sgMHgwLDB4MiwweDEsUkQ4LEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsUlNJTkQsRX19LCAgICAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4OSxCMzF8UkRJTkQsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixESVNQfERTVHxMXzE2LEV9fSx7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhGLEIzMXxESVNQUkVHLDAsRFNUfERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixESVNQfERTVHxMXzMyLEV9fSx7ezB4MCwweDEsMHg0LDB4MSwweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweEEsMHgwLERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLFJEREVDLEV9fSwgICAgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEQsQjMxfFJEREVDLDB4MCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLEFCUzE2U1JDLEV9fSwgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEIsMHg4LDB4MCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixBQlMzMlNSQyxFfX0sICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhCLDB4QSwweDAsRFNUfEFCUzMyTElTVCxFfX1FT1AsCi0KLSAgU09QKE8oT19TVUIsU0IpLDIsInN1Yi5iIikse3tSUzgsUkQ4LEV9fSx7eyAweDEsMHg4LFJTOCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1VCLFNXKSwxLDIsInN1Yi53Iikse3tSUzE2LFJEMTYsRSB9fSwgIHt7MHgxLDB4OSxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1VCLFNXKSwwLDQsInN1Yi53Iikse3tJTU0xNixSRDE2LEUgfX0sIHt7MHg3LDB4OSwweDMsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19TVUIsU0wpLDAsMiwic3ViLmwiKSAse3tSUzMyLFJEMzIsRSB9fSwge3sweDEsMHhBLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NVQixTTCksMCw2LCJzdWIubCIpLCB7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgzLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotCi0gIFNPUChPKE9fU1VCUyxTTCksMiwic3VicyIpLHt7S0JJVCxSRFAsRX19LHt7IDB4MSwweEIsS0JJVCxSRFAsRSwwLDAsMCwwfX1FT1AsCi0gIFRXT09QKE8oT19TVUJYLFNCKSwic3VieCIsMHhCLDB4MSwweEUpLAotCi0gIE5FV19TT1AoTyhPX1RSQVBBLFNCKSwwLDIsInRyYXBhIikse3sgSU1NMixFfX0sICB7ezB4NSwweDcsSU1NMixJR05PUkUsRSAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX1RBUyxTQiksMCwyLCJ0YXMiKSx7e1JTSU5ELEV9fSwgIHt7MHgwLDB4MSwweGUsMHgwLDB4NywweGIsQjMwfFJTSU5ELDB4YyxFICB9fUVPUCwKLQotICBUV09PUChPKE9fWE9SLCBTQiksInhvciIsMHhELDB4MSwweDUpLAotCi0gIE5FV19TT1AoTyhPX1hPUixTVyksMCw0LCJ4b3IudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDUsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19YT1IsU1cpLDAsMiwieG9yLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NSxSUzE2LFJEMTYsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19YT1IsU0wpLDAsNiwieG9yLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg1LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19YT1IsU0wpLDAsMiwieG9yLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg1LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgU09QKE8oT19YT1JDLFNCKSwyLCJ4b3JjIikse3tJTU04LENDUixFfX0se3sgMHgwLDB4NSxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19YT1JDLFNCKSwyLCJ4b3JjIikse3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDUsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fQ0xSTUFDLFNOKSwxLDIsImNscm1hYyIpLHt7RSwgMCwgMH19LHt7MHgwLDB4MSwweGEsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX01BQyxTTCksMSwyLCJtYWMiKSx7e1JTSU5DLFJESU5DLEV9fSx7ezB4MCwweDEsMHg2LDB4MCwweDYsMHhkLEIzMHxSU0lOQyxCMzB8UkRJTkMsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fTERNQUMsU0wpLDEsMiwibGRtYWMiKSx7e1JTMzIsTUFDUkVHLEV9fSx7ezB4MCwweDMsTUFDUkVHLFJTMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1RNQUMsU0wpLDEsMiwic3RtYWMiKSx7e01BQ1JFRyxSRDMyLEV9fSx7ezB4MCwweDIsTUFDUkVHLFJEMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fTERNLFNMKSwwLDYsImxkbS5sIikse3tSU0lOQywgUlMzMiwgRX19LHt7IDB4MCwweDEsSUdOT1JFLDB4MCwweDYsMHhELDB4NyxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVE0sU0wpLDAsNiwic3RtLmwiKSx7e1JTMzIsIFJEREVDLCBFfX0se3sweDAsMHgxLElHTk9SRSwweDAsMHg2LDB4RCwweEYsSUdOT1JFLEV9fUVPUCwKLSAgeyAwIH0KLX07Ci0jZWxzZQotZXh0ZXJuIHN0cnVjdCBoOF9vcGNvZGUgaDhfb3Bjb2Rlc1tdIDsKLSNlbmRpZgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9ocHBhLmggYi9pbmNsdWRlL29wY29kZS9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTRiZTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBQQS1SSVNDLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgZGlzYXNzZW1ibGVyLgotCi1HQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAhZGVmaW5lZChfX1NURENfXykgJiYgIWRlZmluZWQoY29uc3QpCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyoKLSAqIFN0cnVjdHVyZSBvZiBhbiBvcGNvZGUgdGFibGUgZW50cnkuCi0gKi8KLQotLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBkZWxheSBzbG90IG51bGxpZmljYXRpb246IG5vcm1hbCB3aGljaCBpcwotICogY29udHJvbGVkIGJ5IHRoZSBudWxsaWZpY2F0aW9uIGJpdCwgYW5kIGNvbmRpdGlvbmFsLCB3aGljaCBkZXBlbmRzCi0gKiBvbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBicmFuY2ggYW5kIGl0cyBzdWNjZXNzIG9yIGZhaWx1cmUuCi0gKgotICogTk9ORSBpcyB1bmZvcnR1bmF0ZWx5ICNkZWZpbmVkIGluIHRoZSBoaXV4IHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgCi0gKiAjdW5kZWYgaXQgYXdheS4KLSAqLwotI3VuZGVmIE5PTkUKLXN0cnVjdCBwYV9vcGNvZGUKLXsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoOwkvKiBCaXRzIHRoYXQgbXVzdCBiZSBzZXQuLi4gICovCi0gICAgdW5zaWduZWQgbG9uZyBpbnQgbWFzazsJLyogLi4uIGluIHRoZXNlIGJpdHMuICovCi0gICAgY2hhciAqYXJnczsKLSAgICBlbnVtIHBhX2FyY2ggYXJjaDsKLSAgICBjaGFyIGZsYWdzOwotfTsKLQotLyogRW5hYmxlL2Rpc2FibGUgc3RyaWN0IHN5bnRheCBjaGVja2luZy4gIE5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IHdpbGwKLSAgIGJlIG5lY2Vzc2FyeSBmb3IgUEEyLjAgc3VwcG9ydCBpbiB0aGUgZnV0dXJlLiAgKi8KLSNkZWZpbmUgRkxBR19TVFJJQ1QgMHgxCi0KLS8qCi0gICBBbGwgaHBwYSBvcGNvZGVzIGFyZSAzMiBiaXRzLgotCi0gICBUaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIG9uZSBjaGFyYWN0ZXIKLSAgIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLgotCi0gICBCaXQgcG9zaXRpb25zIGluIHRoaXMgZGVzY3JpcHRpb24gZm9sbG93IEhQIHVzYWdlIG9mIGxzYiA9IDMxLAotICAgImF0IiBpcyBsc2Igb2YgZmllbGQuCi0KLSAgIEluIHRoZSBhcmdzIGZpZWxkLCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCBleGFjdGx5OgotCi0JJyssKCkgJwotCi0gICBJbiB0aGUgYXJncyBmaWVsZCwgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB1bnVzZWQ6Ci0KLQknICAiIyQlICAgICorLSAuLyAgICAgICAgICA6OyAgICAnCi0JJyAgICAgICAgICAgICAgICAgICAgICAgICAgW1xdICAnCi0JJyAgICAgICAgICAgICAgICAgICAgICAgICAgeyB9ICcKLQotICAgSGVyZSBhcmUgYWxsIHRoZSBjaGFyYWN0ZXJzOgotCi0JJyAhIiMkJSYnKCkqKy0sLi8wMTIzNDU2Nzg5Ojs8PT4/QCcKLQknQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eXycKLQknYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+JwotCi1LaW5kcyBvZiBvcGVyYW5kczoKLSAgIHggICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAxNS4KLSAgIGIgICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAxMC4KLSAgIHQgICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAzMS4KLSAgIHkgICAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgZmllbGQgYXQgMzEKLSAgIDUgICAgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LgotICAgcyAgICAyIGJpdCBzcGFjZSBzcGVjaWZpZXIgYXQgMTcuCi0gICBTICAgIDMgYml0IHNwYWNlIHNwZWNpZmllciBhdCAxOC4KLSAgIGMgICAgaW5kZXhlZCBsb2FkIGNvbXBsZXRlci4KLSAgIEMgICAgc2hvcnQgbG9hZCBhbmQgc3RvcmUgY29tcGxldGVyLgotICAgWQlTdG9yZSBCeXRlcyBTaG9ydCBjb21wbGV0ZXIKLSAgIDwgICAgbm9uLW5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb25zLgotICAgYQljb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbnMKLSAgIGQgICAgbm9uLW5lZ2F0ZWQgYWRkIGNvbmRpdGlvbnMKLSAgICYgICAgbG9naWNhbCBpbnN0cnVjdGlvbiBjb25kaXRpb25zCi0gICBVICAgIHVuaXQgaW5zdHJ1Y3Rpb24gY29uZGl0aW9ucwotICAgPiAgICBzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9ucy4KLSAgIH4gICAgYnZiLGJiIGNvbmRpdGlvbnMKLSAgIFYgICAgNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBpICAgIDExIGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIGogICAgMTQgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgayAgICAyMSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBuCW51bGxpZmljYXRpb24gZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMKLSAgIE4JbnVsbGlmaWNhdGlvbiBmb3Igc3BvcCBhbmQgY29wciBpbnN0cnVjdGlvbnMKLSAgIHcgICAgMTIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQKLSAgIFcgICAgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKFBDIHJlbGF0aXZlKQotICAgeiAgICAxNyBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudCAoanVzdCBhIG51bWJlciwgbm90IGFuIGFkZHJlc3MpCi0KLUFsc28gdGhlc2U6Ci0KLSAgIHAgICAgNSBiaXQgc2hpZnQgY291bnQgYXQgMjYgKHRvIHN1cHBvcnQgdGhlIFNIRCBpbnN0cnVjdGlvbikgZW5jb2RlZCBhcwotICAgICAgICAzMS1wCi0gICBQICAgIDUgYml0IGJpdCBwb3NpdGlvbiBhdCAyNgotICAgVCAgICA1IGJpdCBmaWVsZCBsZW5ndGggYXQgMzEgKGVuY29kZWQgYXMgMzItVCkKLSAgIEEgICAgMTMgYml0IGltbWVkaWF0ZSBhdCAxOCAodG8gc3VwcG9ydCB0aGUgQlJFQUsgaW5zdHJ1Y3Rpb24pCi0gICBeCWxpa2UgYiwgYnV0IGRlc2NyaWJlcyBhIGNvbnRyb2wgcmVnaXN0ZXIKLSAgIFogICAgU3lzdGVtIENvbnRyb2wgQ29tcGxldGVyICh0byBzdXBwb3J0IExQQSwgTEhBLCBldGMuKQotICAgRCAgICAyNiBiaXQgaW1tZWRpYXRlIGF0IDMxICh0byBzdXBwb3J0IHRoZSBESUFHIGluc3RydWN0aW9uKQotCi0gICBmICAgIDMgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBpZGVudGlmaWVyIGF0IDI1Ci0gICBPICAgIDIwIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTUgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICBvICAgIDE1IGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIGF0IDIwCi0gICAyICAgIDIyIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTcgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICAxICAgIDE1IGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTAgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICAwICAgIDEwIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gNSBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIHUgICAgMyBiaXQgY29wcm9jZXNzb3IgdW5pdCBpZGVudGlmaWVyIGF0IDI1Ci0gICBGICAgIFNvdXJjZSBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBDb21wbGV0ZXIgZW5jb2RlZCAyIGJpdHMgYXQgMjAKLSAgIEkgICAgU291cmNlIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDEgYml0cyBhdCAyMAotCShmb3IgMHhlIGZvcm1hdCBGUCBpbnN0cnVjdGlvbnMpCi0gICBHICAgIERlc3RpbmF0aW9uIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDIgYml0cyBhdCAxOAotICAgTSAgICBGbG9hdGluZy1Qb2ludCBDb21wYXJlIENvbmRpdGlvbnMgKGVuY29kZWQgYXMgNSBiaXRzIGF0IDMxKQotICAgPyAgICBub24tbmVnYXRlZC9uZWdhdGVkIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9ucy4KLSAgIEAgICAgbm9uLW5lZ2F0ZWQvbmVnYXRlZCBhZGQgY29uZGl0aW9ucy4KLSAgICEgICAgbm9uLW5lZ2F0ZWQgYWRkIGNvbmRpdGlvbnMuCi0KLSAgIHMgICAgMiBiaXQgc3BhY2Ugc3BlY2lmaWVyIGF0IDE3LgotICAgYiAgICByZWdpc3RlciBmaWVsZCBhdCAxMC4KLSAgIHIJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxIChmb3IgdGhlIGJyZWFrIGluc3RydWN0aW9uKQotCSh2ZXJ5IHNpbWlsYXIgdG8gViBhYm92ZSwgZXhjZXB0IHRoZSB2YWx1ZSBpcyB1bnNpZ25lZCBpbnN0ZWFkIG9mCi0JbG93X3NpZ25fZXh0KQotICAgUgk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTUgKGZvciB0aGUgc3NtLCByc20sIHByb2JlaSBpbnN0cnVjdGlvbnMpCi0JKHNhbWUgYXMgciBhYm92ZSwgZXhjZXB0IHRoZSB2YWx1ZSBpcyBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbikKLSAgIFEJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDEwIChhIGJpdCBwb3NpdGlvbiBzcGVjaWZpZWQgaW4KLQl0aGUgYmIgaW5zdHJ1Y3Rpb24uIEl0J3MgdGhlIHNhbWUgYXMgciBhYm92ZSwgZXhjZXB0IHRoZQotICAgICAgICB2YWx1ZSBpcyBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbikKLSAgIHwJc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbnMgd2hlbiB1c2VkIGluIGEgY29uZGl0aW9uYWwgYnJhbmNoCi0KLUFuZCB0aGVzZSAoUEpIKSBmb3IgUEEtODkgRi5QLiByZWdpc3RlcnMgYW5kIGluc3RydWN0aW9uczoKLQotICAgdiAgICBhICd0JyBvcGVyYW5kIHR5cGUgZXh0ZW5kZWQgdG8gaGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMuCi0gICBFICAgIGEgJ2InIG9wZXJhbmQgdHlwZSBleHRlbmRlZCB0byBoYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcy4KLSAgIFggICAgYW4gJ3gnIG9wZXJhbmQgdHlwZSBleHRlbmRlZCB0byBoYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcy4KLSAgIEogICAgYSAnYicgb3BlcmFuZCB0eXBlIGZ1cnRoZXIgZXh0ZW5kZWQgdG8gaGFuZGxlIGV4dHJhIDEuMSByZWdpc3RlcnMKLSAgIEsgICAgYSAneCcgb3BlcmFuZCB0eXBlIGZ1cnRoZXIgZXh0ZW5kZWQgdG8gaGFuZGxlIGV4dHJhIDEuMSByZWdpc3RlcnMKLSAgIDQgICAgYSB2YXJpYXRpb24gb2YgdGhlICdiJyBvcGVyYW5kIHR5cGUgZm9yICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInCi0gICA2ICAgIGEgdmFyaWF0aW9uIG9mIHRoZSAneCcgb3BlcmFuZCB0eXBlIGZvciAnZm1weWFkZCcgYW5kICdmbXB5c3ViJwotICAgNyAgICBhIHZhcmlhdGlvbiBvZiB0aGUgJ3QnIG9wZXJhbmQgdHlwZSBmb3IgJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicKLSAgIDggICAgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMjAgKHVzZWQgaW4gJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicpCi0gICA5ICAgIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDI1ICh1c2VkIGluICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInKQotICAgSCAgICBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBhdCAyNiBmb3IgJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicKLSAgICAgICAgKHZlcnkgc2ltaWxhciB0byAnRicpCi0qLwotCi0KLS8qIExpc3Qgb2YgY2hhcmFjdGVycyBub3QgdG8gcHV0IGEgc3BhY2UgYWZ0ZXIuICBOb3RlIHRoYXQKLSAgICIsIiBpcyBpbmNsdWRlZCwgYXMgdGhlICJzcG9wTiIgb3BlcmF0aW9ucyB1c2UgbGl0ZXJhbAotICAgY29tbWFzIGluIHRoZWlyIGNvbXBsZXRlciBzZWN0aW9ucy4gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb21wbGV0ZXJfY2hhcnMgPSAiLENjWTw+PyFAKyZVfkZmR0hJTm5Pb1pNYWR1fC89MDEyMyVlJG19IjsKLQotLyogVGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzIGluIHRoaXMgdGFibGUgaXMgc2lnbmlmaWNhbnQ6Ci0KLSAgICogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZQotICAgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQgcnVudGltZS4KLQotICAgKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBhX29wY29kZSBwYV9vcGNvZGVzW10gPQotewotCi0KLS8qIHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLQoteyAiYiIsCQkweGU4MDAwMDAwLCAweGZmZTBlMDAwLCAiblciLCBwYTEwfSwgLyogYmwgZm9vLHIwICovCi17ICJsZGkiLAkweDM0MDAwMDAwLCAweGZmZTBjMDAwLCAiaix4IiwgcGExMH0sCS8qIGxkbyB2YWwocjApLHIgKi8KLXsgImNvbWliIiwgCTB4ODQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bjUsYix3IiwgcGExMH0sIC8qIGNvbWlie3RmfSovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJjb21pYiIsIAkweDhjMDAwMDAwLCAweGZjMDAwMDAwLCAiP241LGIsdyIsIHBhMTB9LCAvKiBjb21pYnt0Zn0qLwoteyAiY29tYiIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bngsYix3IiwgcGExMH0sIC8qIGNvbWJ7dGZ9ICovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJjb21iIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwgIj9ueCxiLHciLCBwYTEwfSwgLyogY29tYnt0Zn0gKi8KLXsgImFkZGIiLAkweGEwMDAwMDAwLCAweGZjMDAwMDAwLCAiQG54LGIsdyIsIHBhMTB9LCAvKiBhZGRie3RmfSAqLwotLyogVGhpcyBlbnRyeSBpcyBmb3IgdGhlIGRpc2Fzc2VtYmxlciBvbmx5LiAgSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5Ci0gICBhc3NlbWJsZXIuICAqLwoteyAiYWRkYiIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJAbngsYix3IiwgcGExMH0sCi17ICJhZGRpYiIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJAbjUsYix3IiwgcGExMH0sIC8qIGFkZGlie3RmfSovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJhZGRpYiIsCTB4YWMwMDAwMDAsIDB4ZmMwMDAwMDAsICJAbjUsYix3IiwgcGExMH0sIC8qIGFkZGlie3RmfSovCi17ICJub3AiLCAgICAgICAgMHgwODAwMDI0MCwgMHhmZmZmZmZmZiwgIiIsIHBhMTB9LCAgICAgIC8qIG9yIDAsMCwwICovCi17ICJjb3B5IiwgICAgICAgMHgwODAwMDI0MCwgMHhmZmUwZmZlMCwgIngsdCIsIHBhMTB9LCAgIC8qIG9yIHIsMCx0ICovCi17ICJtdHNhciIsICAgICAgMHgwMTYwMTg0MCwgMHhmZmUwZmZmZiwgIngiLCBwYTEwfSwgLyogbXRjdGwgcixjcjExICovCi0KLS8qIExvYWRzIGFuZCBTdG9yZXMgZm9yIGludGVnZXIgcmVnaXN0ZXJzLiAgKi8KLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwfSwKLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTB9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTB9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwfSwKLXsgInN0dyIsICAgICAgICAweDY4MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwfSwKLXsgInN0dyIsICAgICAgICAweDY4MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMH0sCi17ICJzdGgiLCAgICAgICAgMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMH0sCi17ICJzdGgiLCAgICAgICAgMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTB9LAoteyAic3RiIiwgICAgICAgIDB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTB9LAoteyAic3RiIiwgICAgICAgIDB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwfSwKLXsgImxkd20iLCAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwfSwKLXsgImxkd20iLCAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMH0sCi17ICJzdHdtIiwgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMH0sCi17ICJzdHdtIiwgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTB9LAoteyAibGR3eCIsICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkd3giLCAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGRoeCIsICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkaHgiLCAgICAgICAweDBjMDAwMDQwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGRieCIsICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkYngiLCAgICAgICAweDBjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGR3YXgiLCAgICAgIDB4MGMwMDAxODAsIDB4ZmMwMGRmYzAsICJjeChiKSx0IiwgcGExMH0sCi17ICJsZGN3eCIsICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMWZjMCwgImN4KHMsYiksdCIsIHBhMTB9LAoteyAibGRjd3giLCAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDFmYzAsICJjeChiKSx0IiwgcGExMH0sCi17ICJsZHdzIiwJMHgwYzAwMTA4MCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGR3cyIsCTB4MGMwMDEwODAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGhzIiwJMHgwYzAwMTA0MCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGRocyIsCTB4MGMwMDEwNDAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGJzIiwJMHgwYzAwMTAwMCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGRicyIsCTB4MGMwMDEwMDAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZHdhcyIsCTB4MGMwMDExODAsIDB4ZmMwMGRmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGN3cyIsCTB4MGMwMDExYzAsIDB4ZmMwMDFmYzAsICJDNShzLGIpLHQiLCBwYTEwfSwKLXsgImxkY3dzIiwJMHgwYzAwMTFjMCwgMHhmYzAwMWZjMCwgIkM1KGIpLHQiLCBwYTEwfSwKLXsgInN0d3MiLAkweDBjMDAxMjgwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdHdzIiwJMHgwYzAwMTI4MCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0aHMiLAkweDBjMDAxMjQwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdGhzIiwJMHgwYzAwMTI0MCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0YnMiLAkweDBjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdGJzIiwJMHgwYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0d2FzIiwJMHgwYzAwMTM4MCwgMHhmYzAwZGZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0YnlzIiwJMHgwYzAwMTMwMCwgMHhmYzAwMWZjMCwgIll4LFYocyxiKSIsIHBhMTB9LAoteyAic3RieXMiLAkweDBjMDAxMzAwLCAweGZjMDAxZmMwLCAiWXgsVihiKSIsIHBhMTB9LAotCi0vKiBJbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsgImxkbyIsCTB4MzQwMDAwMDAsIDB4ZmMwMGMwMDAsICJqKGIpLHgiLCBwYTEwfSwKLXsgImxkaWwiLAkweDIwMDAwMDAwLCAweGZjMDAwMDAwLCAiayxiIiwgcGExMH0sCi17ICJhZGRpbCIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJrLGIiLCBwYTEwfSwKLQotLyogQnJhbmNoaW5nIGluc3RydWN0aW9ucy4gKi8KLXsgImJsIiwJCTB4ZTgwMDAwMDAsIDB4ZmMwMGUwMDAsICJuVyxiIiwgcGExMH0sCi17ICJnYXRlIiwJMHhlODAwMjAwMCwgMHhmYzAwZTAwMCwgIm5XLGIiLCBwYTEwfSwKLXsgImJsciIsCTB4ZTgwMDQwMDAsIDB4ZmMwMGUwMDEsICJueCxiIiwgcGExMH0sCi17ICJidiIsCQkweGU4MDBjMDAwLCAweGZjMDBmZmZkLCAibngoYikiLCBwYTEwfSwKLXsgImJ2IiwJCTB4ZTgwMGMwMDAsIDB4ZmMwMGZmZmQsICJuKGIpIiwgcGExMH0sCi17ICJiZSIsCQkweGUwMDAwMDAwLCAweGZjMDAwMDAwLCAibnooUyxiKSIsIHBhMTB9LAoteyAiYmxlIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwgIm56KFMsYikiLCBwYTEwfSwKLXsgIm1vdmIiLAkweGM4MDAwMDAwLCAweGZjMDAwMDAwLCAifG54LGIsdyIsIHBhMTB9LAoteyAibW92aWIiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLCAifG41LGIsdyIsIHBhMTB9LAoteyAiY29tYnQiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLCAiPG54LGIsdyIsIHBhMTB9LAoteyAiY29tYmYiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLCAiPG54LGIsdyIsIHBhMTB9LAoteyAiY29taWJ0IiwJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwgIjxuNSxiLHciLCBwYTEwfSwKLXsgImNvbWliZiIsCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsICI8bjUsYix3IiwgcGExMH0sCi17ICJhZGRidCIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsICIhbngsYix3IiwgcGExMH0sCi17ICJhZGRiZiIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsICIhbngsYix3IiwgcGExMH0sCi17ICJhZGRpYnQiLAkweGE0MDAwMDAwLCAweGZjMDAwMDAwLCAiIW41LGIsdyIsIHBhMTB9LAoteyAiYWRkaWJmIiwJMHhhYzAwMDAwMCwgMHhmYzAwMDAwMCwgIiFuNSxiLHciLCBwYTEwfSwKLXsgImJiIiwJCTB4YzQwMDQwMDAsIDB4ZmMwMDQwMDAsICJ+bngsUSx3IiwgcGExMH0sIAoteyAiYnZiIiwJMHhjMDAwNDAwMCwgMHhmZmUwNDAwMCwgIn5ueCx3IiwgcGExMH0sCi17ICJjbHJidHMiLAkweGU4MDA0MDA1LCAweGZmZmZmZmZmLCAiIiwgcGEyMH0sCi0KLS8qIENvbXB1dGF0aW9uIEluc3RydWN0aW9ucyAqLwotCi17ICJjb21jbHIiLCAgICAgMHgwODAwMDg4MCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAib3IiLCAgICAgICAgIDB4MDgwMDAyNDAsIDB4ZmMwMDBmZTAsICImeCxiLHQiLCBwYTEwfSwKLXsgInhvciIsICAgICAgICAweDA4MDAwMjgwLCAweGZjMDAwZmUwLCAiJngsYix0IiwgcGExMH0sCi17ICJhbmQiLCAgICAgICAgMHgwODAwMDIwMCwgMHhmYzAwMGZlMCwgIiZ4LGIsdCIsIHBhMTB9LAoteyAiYW5kY20iLCAgICAgIDB4MDgwMDAwMDAsIDB4ZmMwMDBmZTAsICImeCxiLHQiLCBwYTEwfSwKLXsgInV4b3IiLCAgICAgICAweDA4MDAwMzgwLCAweGZjMDAwZmUwLCAiVXgsYix0IiwgcGExMH0sCi17ICJ1YWRkY20iLCAgICAgMHgwODAwMDk4MCwgMHhmYzAwMGZlMCwgIlV4LGIsdCIsIHBhMTB9LAoteyAidWFkZGNtdCIsICAgIDB4MDgwMDA5YzAsIDB4ZmMwMDBmZTAsICJVeCxiLHQiLCBwYTEwfSwKLXsgImRjb3IiLCAgICAgICAweDA4MDAwYjgwLCAweGZjMWYwZmUwLCAiVWIsdCIsICAgcGExMH0sCi17ICJpZGNvciIsICAgICAgMHgwODAwMGJjMCwgMHhmYzFmMGZlMCwgIlViLHQiLCAgIHBhMTB9LAoteyAiYWRkaSIsICAgICAgIDB4YjQwMDAwMDAsIDB4ZmMwMDA4MDAsICJkaSxiLHgiLCBwYTEwfSwKLXsgImFkZGlvIiwgICAgICAweGI0MDAwODAwLCAweGZjMDAwODAwLCAiZGksYix4IiwgcGExMH0sCi17ICJhZGRpdCIsICAgICAgMHhiMDAwMDAwMCwgMHhmYzAwMDgwMCwgImRpLGIseCIsIHBhMTB9LAoteyAiYWRkaXRvIiwgICAgIDB4YjAwMDA4MDAsIDB4ZmMwMDA4MDAsICJkaSxiLHgiLCBwYTEwfSwKLXsgImFkZCIsICAgICAgICAweDA4MDAwNjAwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJhZGRsIiwgICAgICAgMHgwODAwMGEwMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAiYWRkbyIsICAgICAgIDB4MDgwMDBlMDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgImFkZGMiLCAgICAgICAweDA4MDAwNzAwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJhZGRjbyIsICAgICAgMHgwODAwMGYwMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0MDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKLXsgInN1Ym8iLCAgICAgICAweDA4MDAwYzAwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCi17ICJzdWJiIiwgICAgICAgMHgwODAwMDUwMCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAic3ViYm8iLCAgICAgIDB4MDgwMDBkMDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKLXsgInN1YnQiLCAgICAgICAweDA4MDAwNGMwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCi17ICJzdWJ0byIsICAgICAgMHgwODAwMGNjMCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAiZHMiLCAgICAgICAgIDB4MDgwMDA0NDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKLXsgInN1YmkiLCAgICAgICAweDk0MDAwMDAwLCAweGZjMDAwODAwLCAiYWksYix4IiwgcGExMH0sCi17ICJzdWJpbyIsICAgICAgMHg5NDAwMDgwMCwgMHhmYzAwMDgwMCwgImFpLGIseCIsIHBhMTB9LAoteyAiY29taWNsciIsICAgIDB4OTAwMDAwMDAsIDB4ZmMwMDA4MDAsICJhaSxiLHgiLCBwYTEwfSwKLXsgInNoMWFkZCIsICAgICAweDA4MDAwNjQwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDFhZGRsIiwgICAgMHgwODAwMGE0MCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gxYWRkbyIsICAgIDB4MDgwMDBlNDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgInNoMmFkZCIsICAgICAweDA4MDAwNjgwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDJhZGRsIiwgICAgMHgwODAwMGE4MCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gyYWRkbyIsICAgIDB4MDgwMDBlODAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgInNoM2FkZCIsICAgICAweDA4MDAwNmMwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDNhZGRsIiwgICAgMHgwODAwMGFjMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gzYWRkbyIsICAgIDB4MDgwMDBlYzAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLQotLyogRXh0cmFjdCBhbmQgRGVwb3NpdCBJbnN0cnVjdGlvbnMgKi8KLQoteyAidnNoZCIsICAgICAgIDB4ZDAwMDAwMDAsIDB4ZmMwMDFmZTAsICI+eCxiLHQiLCBwYTEwfSwKLXsgInNoZCIsICAgICAgICAweGQwMDAwODAwLCAweGZjMDAxYzAwLCAiPngsYixwLHQiLCBwYTEwfSwKLXsgInZleHRydSIsICAgICAweGQwMDAxMDAwLCAweGZjMDAxZmUwLCAiPmIsVCx4IiwgcGExMH0sCi17ICJ2ZXh0cnMiLCAgICAgMHhkMDAwMTQwMCwgMHhmYzAwMWZlMCwgIj5iLFQseCIsIHBhMTB9LAoteyAiZXh0cnUiLCAgICAgIDB4ZDAwMDE4MDAsIDB4ZmMwMDFjMDAsICI+YixQLFQseCIsIHBhMTB9LAoteyAiZXh0cnMiLCAgICAgIDB4ZDAwMDFjMDAsIDB4ZmMwMDFjMDAsICI+YixQLFQseCIsIHBhMTB9LAoteyAienZkZXAiLCAgICAgIDB4ZDQwMDAwMDAsIDB4ZmMwMDFmZTAsICI+eCxULGIiLCBwYTEwfSwKLXsgInZkZXAiLCAgICAgICAweGQ0MDAwNDAwLCAweGZjMDAxZmUwLCAiPngsVCxiIiwgcGExMH0sCi17ICJ6ZGVwIiwgICAgICAgMHhkNDAwMDgwMCwgMHhmYzAwMWMwMCwgIj54LHAsVCxiIiwgcGExMH0sCi17ICJkZXAiLCAgICAgICAgMHhkNDAwMGMwMCwgMHhmYzAwMWMwMCwgIj54LHAsVCxiIiwgcGExMH0sCi17ICJ6dmRlcGkiLCAgICAgMHhkNDAwMTAwMCwgMHhmYzAwMWZlMCwgIj41LFQsYiIsIHBhMTB9LAoteyAidmRlcGkiLCAgICAgIDB4ZDQwMDE0MDAsIDB4ZmMwMDFmZTAsICI+NSxULGIiLCBwYTEwfSwKLXsgInpkZXBpIiwgICAgICAweGQ0MDAxODAwLCAweGZjMDAxYzAwLCAiPjUscCxULGIiLCBwYTEwfSwKLXsgImRlcGkiLCAgICAgICAweGQ0MDAxYzAwLCAweGZjMDAxYzAwLCAiPjUscCxULGIiLCBwYTEwfSwKLQotLyogU3lzdGVtIENvbnRyb2wgSW5zdHJ1Y3Rpb25zICovCi0KLXsgImJyZWFrIiwgICAgICAweDAwMDAwMDAwLCAweGZjMDAxZmUwLCAicixBIiwgcGExMH0sCi17ICJyZmkiLCAgICAgICAgMHgwMDAwMGMwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTB9LAoteyAicmZpciIsICAgICAgIDB4MDAwMDBjYTAsIDB4ZmZmZmZmZmYsICIiLCBwYTExfSwKLXsgInNzbSIsICAgICAgICAweDAwMDAwZDYwLCAweGZmZTBmZmUwLCAiUix0IiwgcGExMH0sCi17ICJyc20iLCAgICAgICAgMHgwMDAwMGU2MCwgMHhmZmUwZmZlMCwgIlIsdCIsIHBhMTB9LAoteyAibXRzbSIsICAgICAgIDB4MDAwMDE4NjAsIDB4ZmZlMGZmZmYsICJ4IiwgcGExMH0sCi17ICJsZHNpZCIsICAgICAgMHgwMDAwMTBhMCwgMHhmYzFmM2ZlMCwgIihzLGIpLHQiLCBwYTEwfSwKLXsgImxkc2lkIiwgICAgICAweDAwMDAxMGEwLCAweGZjMWYzZmUwLCAiKGIpLHQiLCBwYTEwfSwKLXsgIm10c3AiLCAgICAgICAweDAwMDAxODIwLCAweGZmZTAxZmZmLCAieCxTIiwgcGExMH0sCi17ICJtdGN0bCIsICAgICAgMHgwMDAwMTg0MCwgMHhmYzAwZmZmZiwgIngsXiIsIHBhMTB9LAoteyAibXRzYXJjbSIsICAgIDB4MDE2MDE4QzAsIDB4ZmZlMGZmZmYsICJ4IiwgcGEyMH0sCi17ICJtZmlhIiwgICAgICAgMHgwMDAwMTRBMCwgMHhmZmZmZmZlMCwgInQiLCBwYTIwfSwKLXsgIm1mc3AiLCAgICAgICAweDAwMDAwNGEwLCAweGZmZmYxZmUwLCAiUyx0IiwgcGExMH0sCi17ICJtZmN0bCIsICAgICAgMHgwMDAwMDhhMCwgMHhmYzFmZmZlMCwgIl4sdCIsIHBhMTB9LAoteyAic3luYyIsICAgICAgIDB4MDAwMDA0MDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwfSwKLXsgInN5bmNkbWEiLCAgICAweDAwMTAwNDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMH0sCi17ICJwcm9iZXIiLCAgICAgMHgwNDAwMTE4MCwgMHhmYzAwM2ZlMCwgIihzLGIpLHgsdCIsIHBhMTB9LAoteyAicHJvYmVyIiwgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmZTAsICIoYikseCx0IiwgcGExMH0sCi17ICJwcm9iZXJpIiwgICAgMHgwNDAwMzE4MCwgMHhmYzAwM2ZlMCwgIihzLGIpLFIsdCIsIHBhMTB9LAoteyAicHJvYmVyaSIsICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmZTAsICIoYiksUix0IiwgcGExMH0sCi17ICJwcm9iZXciLCAgICAgMHgwNDAwMTFjMCwgMHhmYzAwM2ZlMCwgIihzLGIpLHgsdCIsIHBhMTB9LAoteyAicHJvYmV3IiwgICAgIDB4MDQwMDExYzAsIDB4ZmMwMDNmZTAsICIoYikseCx0IiwgcGExMH0sCi17ICJwcm9iZXdpIiwgICAgMHgwNDAwMzFjMCwgMHhmYzAwM2ZlMCwgIihzLGIpLFIsdCIsIHBhMTB9LAoteyAicHJvYmV3aSIsICAgIDB4MDQwMDMxYzAsIDB4ZmMwMDNmZTAsICIoYiksUix0IiwgcGExMH0sCi17ICJscGEiLCAgICAgICAgMHgwNDAwMTM0MCwgMHhmYzAwM2ZjMCwgIlp4KHMsYiksdCIsIHBhMTB9LAoteyAibHBhIiwgICAgICAgIDB4MDQwMDEzNDAsIDB4ZmMwMDNmYzAsICJaeChiKSx0IiwgcGExMH0sCi17ICJsaGEiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZjMCwgIlp4KHMsYiksdCIsIHBhMTB9LAoteyAibGhhIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmYzAsICJaeChiKSx0IiwgcGExMH0sCi17ICJsY2kiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZlMCwgIngocyxiKSx0IiwgcGExMH0sCi17ICJsY2kiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZlMCwgIngoYiksdCIsIHBhMTB9LAoteyAicGR0bGIiLCAgICAgIDB4MDQwMDEyMDAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTIwMCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJwaXRsYiIsICAgICAgMHgwNDAwMDIwMCwgMHhmYzAwMWZkZiwgIlp4KFMsYikiLCBwYTEwfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwMjAwLCAweGZjMDAxZmRmLCAiWngoYikiLCBwYTEwfSwKLXsgInBkdGxiZSIsICAgICAweDA0MDAxMjQwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTB9LAoteyAicGR0bGJlIiwgICAgIDB4MDQwMDEyNDAsIDB4ZmMwMDNmZGYsICJaeChiKSIsIHBhMTB9LAoteyAicGl0bGJlIiwgICAgIDB4MDQwMDAyNDAsIDB4ZmMwMDFmZGYsICJaeChTLGIpIiwgcGExMH0sCi17ICJwaXRsYmUiLCAgICAgMHgwNDAwMDI0MCwgMHhmYzAwMWZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJpZHRsYmEiLCAgICAgMHgwNDAwMTA0MCwgMHhmYzAwM2ZmZiwgIngsKHMsYikiLCBwYTEwfSwKLXsgImlkdGxiYSIsICAgICAweDA0MDAxMDQwLCAweGZjMDAzZmZmLCAieCwoYikiLCBwYTEwfSwKLXsgImlpdGxiYSIsICAgICAweDA0MDAwMDQwLCAweGZjMDAxZmZmLCAieCwoUyxiKSIsIHBhMTB9LAoteyAiaWl0bGJhIiwgICAgIDB4MDQwMDAwNDAsIDB4ZmMwMDFmZmYsICJ4LChiKSIsIHBhMTB9LAoteyAiaWR0bGJwIiwgICAgIDB4MDQwMDEwMDAsIDB4ZmMwMDNmZmYsICJ4LChzLGIpIiwgcGExMH0sCi17ICJpZHRsYnAiLCAgICAgMHgwNDAwMTAwMCwgMHhmYzAwM2ZmZiwgIngsKGIpIiwgcGExMH0sCi17ICJpaXRsYnAiLCAgICAgMHgwNDAwMDAwMCwgMHhmYzAwMWZmZiwgIngsKFMsYikiLCBwYTEwfSwKLXsgImlpdGxicCIsICAgICAweDA0MDAwMDAwLCAweGZjMDAxZmZmLCAieCwoYikiLCBwYTEwfSwKLXsgInBkYyIsICAgICAgICAweDA0MDAxMzgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTB9LAoteyAicGRjIiwgICAgICAgIDB4MDQwMDEzODAsIDB4ZmMwMDNmZGYsICJaeChiKSIsIHBhMTB9LAoteyAiZmRjIiwgICAgICAgIDB4MDQwMDEyODAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMH0sCi17ICJmZGMiLCAgICAgICAgMHgwNDAwMTI4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJmaWMiLCAgICAgICAgMHgwNDAwMDI4MCwgMHhmYzAwMWZkZiwgIlp4KFMsYikiLCBwYTEwfSwKLXsgImZpYyIsICAgICAgICAweDA0MDAwMjgwLCAweGZjMDAxZmRmLCAiWngoYikiLCBwYTEwfSwKLXsgImZkY2UiLCAgICAgICAweDA0MDAxMmMwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTB9LAoteyAiZmRjZSIsICAgICAgIDB4MDQwMDEyYzAsIDB4ZmMwMDNmZGYsICJaeChiKSIsIHBhMTB9LAoteyAiZmljZSIsICAgICAgIDB4MDQwMDAyYzAsIDB4ZmMwMDFmZGYsICJaeChTLGIpIiwgcGExMH0sCi17ICJmaWNlIiwgICAgICAgMHgwNDAwMDJjMCwgMHhmYzAwMWZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJkaWFnIiwgICAgICAgMHgxNDAwMDAwMCwgMHhmYzAwMDAwMCwgIkQiLCBwYTEwfSwKLQotLyogVGhlc2UgbWF5IGJlIHNwZWNpZmljIHRvIGNlcnRhaW4gdmVyc2lvbnMgb2YgdGhlIFBBLiAgSm9lbCBjbGFpbWVkCi0gICB0aGV5IHdlcmUgNzIwMDAgKDcyMDA/KSBzcGVjaWZpYy4gIEhvd2V2ZXIsIEknbSBhbG1vc3QgY2VydGFpbiB0aGUKLSAgIG10Y3B1L21mY3B1IHdlcmUgdW5kb2N1bWVudGVkLCBidXQgYXZhaWxhYmxlIGluIHRoZSBvbGRlciA3MDAgbWFjaGluZXMuICAqLwoteyAibXRjcHUiLCAgICAgIDB4MTQwMDE2MDAsIDB4ZmMwMGZmZmYsICJ4LF4ifSwKLXsgIm1mY3B1IiwgICAgICAweDE0MDAxQTAwLCAweGZjMDBmZmZmLCAiXix4In0sCi17ICJ0b2NlbiIsICAgICAgMHgxNDQwMzYwMCwgMHhmZmZmZmZmZiwgIiJ9LAoteyAidG9jZGlzIiwgICAgIDB4MTQ0MDE2MjAsIDB4ZmZmZmZmZmYsICIifSwKLXsgInNoZHdnciIsICAgICAweDE0NDAyNjAwLCAweGZmZmZmZmZmLCAiIn0sCi17ICJncnNoZHciLCAgICAgMHgxNDQwMDYyMCwgMHhmZmZmZmZmZiwgIiJ9LAotCi0vKiBnZncgYW5kIGdmciBhcmUgbm90IGluIHRoZSBIUCBQQSAxLjEgbWFudWFsLCBidXQgdGhleSBhcmUgaW4gZWl0aGVyCi0gICB0aGUgVGltZXggRlBVIG9yIHRoZSBNdXN0YW5nIEVSUyAobm90IHN1cmUgd2hpY2gpIG1hbnVhbC4gICovCi17ICJnZnciLAkweDA0MDAxNjgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTF9LAoteyAiZ2Z3IiwJMHgwNDAwMTY4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMX0sCi17ICJnZnIiLAkweDA0MDAxYTgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTF9LAoteyAiZ2ZyIiwJMHgwNDAwMWE4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMX0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IENvcHJvY2Vzc29yIEluc3RydWN0aW9ucyAqLwotICAKLXsgImZsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZjgwLCAiY3gocyxiKSx2IiwgcGExMH0sCi17ICJmbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWY4MCwgImN4KGIpLHYiLCBwYTEwfSwKLXsgImZsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3gocyxiKSx5IiwgcGExMH0sCi17ICJmbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4KGIpLHkiLCBwYTEwfSwKLXsgImZzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZjgwLCAiY3YseChzLGIpIiwgcGExMH0sCi17ICJmc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWY4MCwgImN2LHgoYikiLCBwYTEwfSwKLXsgImZzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3kseChzLGIpIiwgcGExMH0sCi17ICJmc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN5LHgoYikiLCBwYTEwfSwKLXsgImZzdHF4IiwgICAgICAweDNjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3kseChzLGIpIiwgcGExMH0sCi17ICJmc3RxeCIsICAgICAgMHgzYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN5LHgoYikiLCBwYTEwfSwKLXsgImZsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZjgwLCAiQzUocyxiKSx2IiwgcGExMH0sCi17ICJmbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWY4MCwgIkM1KGIpLHYiLCBwYTEwfSwKLXsgImZsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZmMwLCAiQzUocyxiKSx5IiwgcGExMH0sCi17ICJmbGRkcyIsICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWZjMCwgIkM1KGIpLHkiLCBwYTEwfSwKLXsgImZzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZjgwLCAiQ3YsNShzLGIpIiwgcGExMH0sCi17ICJmc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWY4MCwgIkN2LDUoYikiLCBwYTEwfSwKLXsgImZzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3ksNShzLGIpIiwgcGExMH0sCi17ICJmc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN5LDUoYikiLCBwYTEwfSwKLXsgImZzdHFzIiwgICAgICAweDNjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3ksNShzLGIpIiwgcGExMH0sCi17ICJmc3RxcyIsICAgICAgMHgzYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN5LDUoYikiLCBwYTEwfSwKLXsgImZhZGQiLCAgICAgICAweDMwMDAwNjAwLCAweGZjMDBlN2UwLCAiRkUsWCx2IiwgcGExMH0sCi17ICJmYWRkIiwgICAgICAgMHgzODAwMDYwMCwgMHhmYzAwZTcyMCwgIklKLEssdiIsIHBhMTB9LAoteyAiZnN1YiIsICAgICAgIDB4MzAwMDI2MDAsIDB4ZmMwMGU3ZTAsICJGRSxYLHYiLCBwYTEwfSwKLXsgImZzdWIiLCAgICAgICAweDM4MDAyNjAwLCAweGZjMDBlNzIwLCAiSUosSyx2IiwgcGExMH0sCi17ICJmbXB5IiwgICAgICAgMHgzMDAwNDYwMCwgMHhmYzAwZTdlMCwgIkZFLFgsdiIsIHBhMTB9LAoteyAiZm1weSIsICAgICAgIDB4MzgwMDQ2MDAsIDB4ZmMwMGU3MjAsICJJSixLLHYiLCBwYTEwfSwKLXsgImZkaXYiLCAgICAgICAweDMwMDA2NjAwLCAweGZjMDBlN2UwLCAiRkUsWCx2IiwgcGExMH0sCi17ICJmZGl2IiwgICAgICAgMHgzODAwNjYwMCwgMHhmYzAwZTcyMCwgIklKLEssdiIsIHBhMTB9LAoteyAiZnNxcnQiLCAgICAgIDB4MzAwMDgwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGExMH0sCi17ICJmc3FydCIsICAgICAgMHgzODAwODAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTEwfSwKLXsgImZhYnMiLCAgICAgICAweDMwMDA2MDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMTB9LAoteyAiZmFicyIsICAgICAgIDB4MzgwMDYwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGExMH0sCi17ICJmcmVtIiwgICAgICAgMHgzMDAwODYwMCwgMHhmYzAwZTdlMCwgIkZFLFgsdiIsIHBhMTB9LAoteyAiZnJlbSIsICAgICAgIDB4MzgwMDg2MDAsIDB4ZmMwMGU3MjAsICJGSixLLHYiLCBwYTEwfSwKLXsgImZybmQiLCAgICAgICAweDMwMDBhMDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMTB9LAoteyAiZnJuZCIsICAgICAgIDB4MzgwMGEwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGExMH0sCi17ICJmY3B5IiwgICAgICAgMHgzMDAwNDAwMCwgMHhmYzFmZTdlMCwgIkZFLHYiLCBwYTEwfSwKLXsgImZjcHkiLCAgICAgICAweDM4MDA0MDAwLCAweGZjMWZlNzIwLCAiRkosdiIsIHBhMTB9LAoteyAiZmNudmZmIiwgICAgIDB4MzAwMDAyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZmIiwgICAgIDB4MzgwMDAyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudnhmIiwgICAgIDB4MzAwMDgyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudnhmIiwgICAgIDB4MzgwMDgyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzAwMTAyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzgwMTAyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzAwMTgyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzgwMTgyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZm1weWZhZGQiLCAgIDB4YjgwMDAwMDAsIDB4ZmMwMDAwMjAsICJGRSxYLDMsdiIsIHBhMjB9LAoteyAiZm1weW5mYWRkIiwgIDB4YjgwMDAwMjAsIDB4ZmMwMDAwMjAsICJGRSxYLDMsdiIsIHBhMjB9LAoteyAiZm5lZyIsICAgICAgIDB4MzAwMGMwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGEyMH0sCi17ICJmbmVnIiwgICAgICAgMHgzODAwYzAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTIwfSwKLXsgImZuZWdhYnMiLCAgICAweDMwMDBlMDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMjB9LAoteyAiZm5lZ2FicyIsICAgIDB4MzgwMGUwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGEyMH0sCi17ICJmY21wIiwgICAgICAgMHgzMDAwMDQwMCwgMHhmYzAwZTdlMCwgIkZNRSxYIiwgcGExMH0sCi17ICJmY21wIiwgICAgICAgMHgzODAwMDQwMCwgMHhmYzAwZTcyMCwgIklNSixLIiwgcGExMH0sCi17ICJ4bXB5dSIsCTB4MzgwMDQ3MDAsIDB4ZmMwMGU3MjAsICJFLFgsdiIsIHBhMTF9LAoteyAiZm1weWFkZCIsCTB4MTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJINCw2LDcsOSw4IiwgcGExMX0sCi17ICJmbXB5c3ViIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwgIkg0LDYsNyw5LDgiLCBwYTExfSwKLXsgImZ0ZXN0IiwgICAgICAweDMwMDAyNDIwLCAweGZmZmZmZmZmLCAiIiwgcGExMH0sCi17ICJmaWQiLCAgICAgICAgMHgzMDAwMDAwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTF9LAotCi0KLS8qIEFzc2lzdCBJbnN0cnVjdGlvbnMgKi8KLQoteyAic3BvcDAiLCAgICAgIDB4MTAwMDAwMDAsIDB4ZmMwMDA2MDAsICJmLE9OIiwgcGExMH0sCi17ICJzcG9wMSIsICAgICAgMHgxMDAwMDIwMCwgMHhmYzAwMDYwMCwgImYsb050IiwgcGExMH0sCi17ICJzcG9wMiIsICAgICAgMHgxMDAwMDQwMCwgMHhmYzAwMDYwMCwgImYsMU5iIiwgcGExMH0sCi17ICJzcG9wMyIsICAgICAgMHgxMDAwMDYwMCwgMHhmYzAwMDYwMCwgImYsME54LGIiLCBwYTEwfSwKLXsgImNvcHIiLCAgICAgICAweDMwMDAwMDAwLCAweGZjMDAwMDAwLCAidSwyTiIsIHBhMTB9LAoteyAiY2xkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3gocyxiKSx0IiwgcGExMH0sCi17ICJjbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeChiKSx0IiwgcGExMH0sCi17ICJjbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeChzLGIpLHQiLCBwYTEwfSwKLXsgImNsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4KGIpLHQiLCBwYTEwfSwKLXsgImNzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZTAwLCAidWN0LHgocyxiKSIsIHBhMTB9LAoteyAiY3N0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3QseChiKSIsIHBhMTB9LAoteyAiY3N0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3QseChzLGIpIiwgcGExMH0sCi17ICJjc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWUwMCwgInVjdCx4KGIpIiwgcGExMH0sCi17ICJjbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVDNShzLGIpLHQiLCBwYTEwfSwKLXsgImNsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidUM1KGIpLHQiLCBwYTEwfSwKLXsgImNsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZTAwLCAidUM1KHMsYiksdCIsIHBhMTB9LAoteyAiY2xkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1QzUoYiksdCIsIHBhMTB9LAoteyAiY3N0d3MiLCAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Q3QsNShzLGIpIiwgcGExMH0sCi17ICJjc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWUwMCwgInVDdCw1KGIpIiwgcGExMH0sCi17ICJjc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVDdCw1KHMsYikiLCBwYTEwfSwKLXsgImNzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidUN0LDUoYikiLCBwYTEwfSwKLX07Ci0KLSNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBwYV9vcGNvZGVzKS8oc2l6ZW9mIHBhX29wY29kZXNbMF0pKQotCi0vKiBTS1YgMTIvMTgvOTIuIEFkZGVkIHNvbWUgZGVub3RhdGlvbnMgZm9yIHZhcmlvdXMgb3BlcmFuZHMuICovCi0KLSNkZWZpbmUgUEFfSU1NMTFfQVRfMzEgJ2knCi0jZGVmaW5lIFBBX0lNTTE0X0FUXzMxICdqJwotI2RlZmluZSBQQV9JTU0yMV9BVF8zMSAnaycKLSNkZWZpbmUgUEFfRElTUDEyICd3JwotI2RlZmluZSBQQV9ESVNQMTcgJ1cnCi0KLSNkZWZpbmUgTl9IUFBBX09QRVJBTkRfRk9STUFUUyA1CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pMzg2LmggYi9pbmNsdWRlL29wY29kZS9pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhODcyZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NyArMCwwIEBACi0vKiBvcGNvZGUvaTM4Ni5oIC0tIEludGVsIDgwMzg2IG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBVbml4V2FyZSBhc3NlbWJsZXIsIGFuZCBwcm9iYWJseSBvdGhlciBBVCZUIGRlcml2ZWQgaXg4NiBVbml4Ci0gICBhc3NlbWJsZXJzLCBnZW5lcmF0ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgd2l0aCByZXZlcnNlZAotICAgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgaW4gY2VydGFpbiBjYXNlcy4gIFVuZm9ydHVuYXRlbHksCi0gICBnY2MgYW5kIHBvc3NpYmx5IG1hbnkgb3RoZXIgcHJvZ3JhbXMgdXNlIHRoaXMgcmV2ZXJzZWQgc3ludGF4LCBzbwotICAgd2UncmUgc3R1Y2sgd2l0aCBpdC4KLQotICAgZWcuIGBmc3ViICVzdCgzKSwlc3QnIHJlc3VsdHMgaW4gc3QgPC0gc3QgLSBzdCgzKSBhcyBleHBlY3RlZCwgYnV0Ci0gICBgZnN1YiAlc3QsJXN0KDMpJyByZXN1bHRzIGluIHN0KDMpIDwtIHN0IC0gc3QoMyksIHJhdGhlciB0aGFuCi0gICB0aGUgZXhwZWN0ZWQgc3QoMykgPC0gc3QoMykgLSBzdCAhCi0KLSAgIFRoaXMgaGFwcGVucyB3aXRoIGFsbCB0aGUgbm9uLWNvbW11dGF0aXZlIGFyaXRobWV0aWMgZmxvYXRpbmcgcG9pbnQKLSAgIG9wZXJhdGlvbnMgd2l0aCB0d28gcmVnaXN0ZXIgb3BlcmFuZHMsIHdoZXJlIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMKLSAgICVzdCwgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzICVzdChpKS4gIExvb2sgZm9yIEZsb2F0RFIgYmVsb3cuICAqLwotCi0jaWZuZGVmIFVOSVhXQVJFX0NPTVBBVAotLyogU2V0IG5vbi16ZXJvIGZvciBicm9rZW4sIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgU2V0IHRvIHplcm8gZm9yCi0gICBub24tYnJva2VuIG9wY29kZXMgYXQgeW91ciBwZXJpbC4gIGdjYyBnZW5lcmF0ZXMgVW5peFdhcmUKLSAgIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgVU5JWFdBUkVfQ09NUEFUIDEKLSNlbmRpZgotCi0KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZSBpMzg2X29wdGFiW10gPSB7Ci0KLSNkZWZpbmUgWCBOb25lCi0jZGVmaW5lIE5vU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgYl9TdWYgKE5vX3dTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgd19TdWYgKE5vX2JTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgbF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgZF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2xTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgeF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2xTdWZ8Tm9fZFN1ZikKLSNkZWZpbmUgYndfU3VmIChOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBibF9TdWYgKE5vX3dTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHdsX1N1ZiAoTm9fYlN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgc2xfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBzbGRfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgc2xkeF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZikKLSNkZWZpbmUgYndsX1N1ZiAoTm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGJ3bGRfU3VmIChOb19zU3VmfE5vX3hTdWYpCi0jZGVmaW5lIEZQIChOb1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBsX0ZQIChsX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBkX0ZQIChkX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSB4X0ZQICh4X1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBzbF9GUCAoc2xfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsZF9GUCAoc2xkX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBzbGR4X0ZQIChzbGR4X1N1ZnxJZ25vcmVTaXplKQotI2lmIFVOSVhXQVJFX0NPTVBBVAotI2RlZmluZSBGbG9hdERSIEZsb2F0RAotI2Vsc2UKLSNkZWZpbmUgRmxvYXREUiAoRmxvYXREfEZsb2F0UikKLSNlbmRpZgotCi0vKiBtb3ZlIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNT1ZfQVhfRElTUDMyIDB4YTAKLXsgIm1vdiIsICAgMiwJMHhhMCwgWCwgYndsX1N1ZnxEfFcsCQkJeyBEaXNwMTZ8RGlzcDMyLCBBY2MsIDAgfSB9LAoteyAibW92IiwgICAyLAkweDg4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHhiMCwgWCwgYndsX1N1ZnxXfFNob3J0Rm9ybSwJCXsgSW1tLCBSZWcsIDAgfSB9LAoteyAibW92IiwgICAyLAkweGM2LCBYLCBid2xfU3VmfFd8TW9kcm0sCQl7IEltbSwgUmVnfEFueU1lbSwgMCB9IH0sCi0vKiBUaGUgbmV4dCB0d28gaW5zdHJ1Y3Rpb25zIGFjY2VwdCBXb3JkUmVnIHNvIHRoYXQgYSBzZWdtZW50IHJlZ2lzdGVyCi0gICBjYW4gYmUgY29waWVkIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCBhbmQgdmljZSB2ZXJzYSwgd2l0aG91dCB1c2luZyBhCi0gICBzaXplIHByZWZpeC4gIFdoZW4gbW92aW5nIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCB0aGUgdXBwZXIgMTYgYml0cwotICAgYXJlIHNldCB0byBhbiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHZhbHVlIChvbiB0aGUgUGVudGl1bSBQcm8sCi0gICB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB2YWx1ZSBpcyB6ZXJvKS4gICovCi17ICJtb3YiLCAgIDIsCTB4OGMsIFgsIHdsX1N1ZnxNb2RybSwJCQl7IFNSZWczfFNSZWcyLCBXb3JkUmVnfFdvcmRNZW0sIDAgfSB9LAoteyAibW92IiwgICAyLAkweDhlLCBYLCB3bF9TdWZ8TW9kcm18SWdub3JlU2l6ZSwJeyBXb3JkUmVnfFdvcmRNZW0sIFNSZWczfFNSZWcyLCAwIH0gfSwKLS8qIG1vdmUgdG8vZnJvbSBjb250cm9sIGRlYnVnIHJlZ2lzdGVycyAqLwoteyAibW92IiwgICAyLCAweDBmMjAsIFgsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBDb250cm9sLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyMSwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IERlYnVnLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyNCwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IFRlc3QsIFJlZzMyfEludk1lbSwgMH0gfSwKLQotLyogbW92ZSB3aXRoIHNpZ24gZXh0ZW5kICovCi0vKiAibW92c2JsIiAmICJtb3ZzYnciIG11c3Qgbm90IGJlIHVuaWZpZWQgaW50byAibW92c2IiIHRvIGF2b2lkCi0gICBjb25mbGljdCB3aXRoIHRoZSAibW92cyIgc3RyaW5nIG1vdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyJtb3ZzYmwiLCAyLCAweDBmYmUsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBSZWczMiwgMH0gfSwKLXsibW92c2J3IiwgMiwgMHgwZmJlLCBYLCBOb1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgUmVnMTYsIDB9IH0sCi17Im1vdnN3bCIsIDIsIDB4MGZiZiwgWCwgTm9TdWZ8TW9kcm0sCQkJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsibW92c3giLCAgMiwgMHgwZmJmLCBYLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLXsibW92c3giLCAgMiwgMHgwZmJlLCBYLCBiX1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgV29yZFJlZywgMH0gfSwKLQotLyogbW92ZSB3aXRoIHplcm8gZXh0ZW5kICovCi17Im1vdnpiIiwgIDIsIDB4MGZiNiwgWCwgd2xfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJtb3Z6d2wiLCAyLCAweDBmYjcsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnMTZ8U2hvcnRNZW0sIFJlZzMyLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17Im1vdnp4IiwgIDIsIDB4MGZiNywgWCwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSwJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi17Im1vdnp4IiwgIDIsIDB4MGZiNiwgWCwgYl9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLS8qIHB1c2ggaW5zdHJ1Y3Rpb25zICovCi17InB1c2giLCAgIDEsCTB4NTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywwLDAgfSB9LAoteyJwdXNoIiwgICAxLAkweGZmLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMCB9IH0sCi17InB1c2giLCAgIDEsCTB4NmEsIFgsIHdsX1N1ZiwJCXsgSW1tOFMsIDAsIDB9IH0sCi17InB1c2giLCAgIDEsCTB4NjgsIFgsIHdsX1N1ZiwJCXsgSW1tMTZ8SW1tMzIsIDAsIDB9IH0sCi17InB1c2giLCAgIDEsCTB4MDYsIFgsIHdsX1N1ZnxTZWcyU2hvcnRGb3JtLAl7IFNSZWcyLDAsMCB9IH0sCi17InB1c2giLCAgIDEsIDB4MGZhMCwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm0sCXsgU1JlZzMsMCwwIH0gfSwKLS8qIHB1c2ggYWxsICovCi17InB1c2hhIiwgIDAsCTB4NjAsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMCB9IH0sCi0KLS8qIHBvcCBpbnN0cnVjdGlvbnMgKi8KLXsicG9wIiwJICAgMSwJMHg1OCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLDAsMCB9IH0sCi17InBvcCIsCSAgIDEsCTB4OGYsIDAsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwIH0gfSwKLSNkZWZpbmUgUE9QX1NFR19TSE9SVCAweDA3Ci17InBvcCIsCSAgIDEsCTB4MDcsIFgsIHdsX1N1ZnxTZWcyU2hvcnRGb3JtLAl7IFNSZWcyLDAsMCB9IH0sCi17InBvcCIsCSAgIDEsIDB4MGZhMSwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm0sCXsgU1JlZzMsMCwwIH0gfSwKLS8qIHBvcCBhbGwgKi8KLXsicG9wYSIsICAgMCwJMHg2MSwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwIH0gfSwKLQotLyogeGNoZyBleGNoYW5nZSBpbnN0cnVjdGlvbnMKLSAgIHhjaGcgY29tbXV0ZXM6ICB3ZSBhbGxvdyBib3RoIG9wZXJhbmQgb3JkZXJzICovCi17InhjaGciLCAgIDIsCTB4OTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgQWNjLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg5MCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBBY2MsIFdvcmRSZWcsIDAgfSB9LAoteyJ4Y2hnIiwgICAyLAkweDg2LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg4NiwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMCB9IH0sCi0KLS8qIGluL291dCBmcm9tIHBvcnRzICovCi17ImluIiwJICAgMiwJMHhlNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW04LCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDIsCTB4ZWMsIFgsIGJ3bF9TdWZ8VywJCXsgSW5PdXRQb3J0UmVnLCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDEsCTB4ZTQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tOCwgMCwgMCB9IH0sCi17ImluIiwJICAgMSwJMHhlYywgWCwgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAyLAkweGU2LCBYLCBid2xfU3VmfFcsCQl7IEFjYywgSW1tOCwgMCB9IH0sCi17Im91dCIsCSAgIDIsCTB4ZWUsIFgsIGJ3bF9TdWZ8VywJCXsgQWNjLCBJbk91dFBvcnRSZWcsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGU2LCBYLCBid2xfU3VmfFcsCQl7IEltbTgsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGVlLCBYLCBid2xfU3VmfFcsCQl7IEluT3V0UG9ydFJlZywgMCwgMCB9IH0sCi0KLS8qIGxvYWQgZWZmZWN0aXZlIGFkZHJlc3MgKi8KLXsibGVhIiwJICAgMiwgMHg4ZCwgICBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDAgfSB9LAotCi0vKiBsb2FkIHNlZ21lbnQgcmVnaXN0ZXJzIGZyb20gbWVtb3J5ICovCi17ImxkcyIsCSAgIDIsCTB4YzUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGVzIiwJICAgMiwJMHhjNCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZnMiLAkgICAyLCAweDBmYjQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGdzIiwJICAgMiwgMHgwZmI1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxzcyIsCSAgIDIsIDB4MGZiMiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBmbGFncyByZWdpc3RlciBpbnN0cnVjdGlvbnMgKi8KLXsiY2xjIiwJICAgMCwJMHhmOCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJjbGQiLAkgICAwLAkweGZjLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsaSIsCSAgIDAsCTB4ZmEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiY2x0cyIsICAgMCwgMHgwZjA2LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNtYyIsCSAgIDAsCTB4ZjUsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsibGFoZiIsICAgMCwJMHg5ZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJzYWhmIiwgICAwLAkweDllLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InB1c2hmIiwgIDAsCTB4OWMsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicG9wZiIsICAgMCwJMHg5ZCwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJzdGMiLAkgICAwLAkweGY5LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InN0ZCIsCSAgIDAsCTB4ZmQsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsic3RpIiwJICAgMCwJMHhmYiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBhcml0aG1ldGljICovCi17ImFkZCIsCSAgIDIsCTB4MDAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiYWRkIiwJICAgMiwJMHg4MywgMCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDA0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDgwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImluYyIsCSAgIDEsCTB4NDAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgMCwgMH0gfSwKLXsiaW5jIiwJICAgMSwJMHhmZSwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic3ViIiwJICAgMiwJMHgyOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzdWIiLAkgICAyLAkweDgzLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4MmMsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4ODAsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsiZGVjIiwJICAgMSwJMHg0OCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLCAwLCAwfSB9LAoteyJkZWMiLAkgICAxLAkweGZlLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzYmIiLAkgICAyLAkweDE4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNiYiIsCSAgIDIsCTB4ODMsIDMsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsic2JiIiwJICAgMiwJMHgxYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsic2JiIiwJICAgMiwJMHg4MCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJjbXAiLAkgICAyLAkweDM4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImNtcCIsCSAgIDIsCTB4ODMsIDcsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiY21wIiwJICAgMiwJMHgzYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiY21wIiwJICAgMiwJMHg4MCwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgUmVnLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGE4LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGY2LCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImFuZCIsCSAgIDIsCTB4MjAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiYW5kIiwJICAgMiwJMHg4MywgNCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDI0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDgwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17Im9yIiwJICAgMiwJMHgwOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODMsIDEsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsib3IiLAkgICAyLAkweDBjLCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODAsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsieG9yIiwJICAgMiwJMHgzMCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJ4b3IiLAkgICAyLAkweDgzLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InhvciIsCSAgIDIsCTB4MzQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InhvciIsCSAgIDIsCTB4ODAsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLS8qIGljbHIgd2l0aCAxIG9wZXJhbmQgaXMgcmVhbGx5IHhvciB3aXRoIDIgb3BlcmFuZHMuICovCi17ImNsciIsCSAgIDEsCTB4MzAsIFgsIGJ3bF9TdWZ8V3xNb2RybXxyZWdLbHVkZ2UsCXsgUmVnLCAwLCAwIH0gfSwKLQoteyJhZGMiLAkgICAyLAkweDEwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4ODMsIDIsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHgxNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHg4MCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJuZWciLAkgICAxLAkweGY2LCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsibm90IiwJICAgMSwJMHhmNiwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsiYWFhIiwJICAgMCwJMHgzNywgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYXMiLAkgICAwLAkweDNmLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImRhYSIsCSAgIDAsCTB4MjcsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiZGFzIiwJICAgMCwJMHgyZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYWQiLAkgICAwLCAweGQ1MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFkIiwJICAgMSwgICAweGQ1LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAoteyJhYW0iLAkgICAwLCAweGQ0MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFtIiwJICAgMSwgICAweGQ0LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAotCi0vKiBjb252ZXJzaW9uIGluc25zICovCi0vKiBjb252ZXJzaW9uOglpbnRlbCBuYW1pbmcgKi8KLXsiY2J3IiwJICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjd2RlIiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3ZCIsCSAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2RxIiwJICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAotLyogIGF0dCBuYW1pbmcgKi8KLXsiY2J0dyIsICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjd3RsIiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3dGQiLCAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2x0ZCIsICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAotCi0vKiBXYXJuaW5nISB0aGUgbXVsL2ltdWwgKG9wY29kZSAweGY2KSBtdXN0IG9ubHkgaGF2ZSAxIG9wZXJhbmQhICBUaGV5IGFyZQotICAgZXhwYW5kaW5nIDY0LWJpdCBtdWx0aXBsaWVzLCBhbmQgKmNhbm5vdCogYmUgc2VsZWN0ZWQgdG8gYWNjb21wbGlzaAotICAgJ2ltdWwgJWVieCwgJWVheCcgKG9wY29kZSAweDBmYWYgbXVzdCBiZSB1c2VkIGluIHRoaXMgY2FzZSkKLSAgIFRoZXNlIG11bHRpcGxpZXMgY2FuIG9ubHkgYmUgc2VsZWN0ZWQgd2l0aCBzaW5nbGUgb3BlcmFuZCBmb3Jtcy4gICovCi17Im11bCIsCSAgIDEsCTB4ZjYsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJpbXVsIiwgICAxLAkweGY2LCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaW11bCIsICAgMiwgMHgwZmFmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMywJMHg2YiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnfSB9LAoteyJpbXVsIiwgICAzLAkweDY5LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTE2fEltbTMyLCBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWd9IH0sCi0vKiBpbXVsIHdpdGggMiBvcGVyYW5kcyBtaW1pY3MgaW11bCB3aXRoIDMgYnkgcHV0dGluZyB0aGUgcmVnaXN0ZXIgaW4KLSAgIGJvdGggaS5ybS5yZWcgJiBpLnJtLnJlZ21lbSBmaWVsZHMuICByZWdLbHVkZ2UgZW5hYmxlcyB0aGlzCi0gICB0cmFuc2Zvcm1hdGlvbi4gICovCi17ImltdWwiLCAgIDIsCTB4NmIsIFgsIHdsX1N1ZnxNb2RybXxyZWdLbHVkZ2UseyBJbW04UywgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMiwJMHg2OSwgWCwgd2xfU3VmfE1vZHJtfHJlZ0tsdWRnZSx7IEltbTE2fEltbTMyLCBXb3JkUmVnLCAwfSB9LAotCi17ImRpdiIsCSAgIDEsCTB4ZjYsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJkaXYiLAkgICAyLAkweGY2LCA2LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgQWNjLCAwfSB9LAoteyJpZGl2IiwgICAxLAkweGY2LCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaWRpdiIsICAgMiwJMHhmNiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIEFjYywgMH0gfSwKLQoteyJyb2wiLAkgICAyLAkweGQwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9sIiwJICAgMiwJMHhjMCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvbCIsCSAgIDIsCTB4ZDIsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb2wiLAkgICAxLAkweGQwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyb3IiLAkgICAyLAkweGQwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9yIiwJICAgMiwJMHhjMCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvciIsCSAgIDIsCTB4ZDIsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb3IiLAkgICAxLAkweGQwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY2wiLAkgICAyLAkweGQwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNsIiwJICAgMiwJMHhjMCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjbCIsCSAgIDIsCTB4ZDIsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY2wiLAkgICAxLAkweGQwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY3IiLAkgICAyLAkweGQwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNyIiwJICAgMiwJMHhjMCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjciIsCSAgIDIsCTB4ZDIsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY3IiLAkgICAxLAkweGQwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzYWwiLAkgICAyLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FsIiwJICAgMiwJMHhjMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhbCIsCSAgIDIsCTB4ZDIsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYWwiLAkgICAxLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsic2hsIiwJICAgMiwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNobCIsCSAgIDIsCTB4YzAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaGwiLAkgICAyLAkweGQyLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hsIiwJICAgMSwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2hsZCIsICAgMywgMHgwZmE0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hsZCIsICAgMywgMHgwZmE1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFNoaWZ0Q291bnQsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hsZCIsICAgMiwgMHgwZmE1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLQoteyJzaHIiLAkgICAyLAkweGQwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hyIiwJICAgMiwJMHhjMCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNociIsCSAgIDIsCTB4ZDIsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaHIiLAkgICAxLAkweGQwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzaHJkIiwgICAzLCAweDBmYWMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaHJkIiwgICAzLCAweDBmYWQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgU2hpZnRDb3VudCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaHJkIiwgICAyLCAweDBmYWQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAotCi17InNhciIsCSAgIDIsCTB4ZDAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYXIiLAkgICAyLAkweGMwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FyIiwJICAgMiwJMHhkMiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhciIsCSAgIDEsCTB4ZDAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi0vKiBjb250cm9sIHRyYW5zZmVyIGluc3RydWN0aW9ucyAqLwoteyJjYWxsIiwgICAxLAkweGU4LCBYLCB3bF9TdWZ8SnVtcER3b3JkLAl7IERpc3AxNnxEaXNwMzIsIDAsIDB9IH0sCi17ImNhbGwiLCAgIDEsCTB4ZmYsIDIsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJjYWxsIiwgICAyLAkweDlhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi17ImxjYWxsIiwgIDIsCTB4OWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50LCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGNhbGwiLCAgMSwJMHhmZiwgMywgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAotCi0jZGVmaW5lIEpVTVBfUENfUkVMQVRJVkUgMHhlYgoteyJqbXAiLAkgICAxLAkweGViLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbXAiLAkgICAxLAkweGZmLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbXxKdW1wQWJzb2x1dGUsIDAsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiam1wIiwgICAgMiwJMHhlYSwgWCwgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnQsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoteyJqbXAiLCAgICAxLAkweGZmLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17ImxqbXAiLCAgIDIsCTB4ZWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50LCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGptcCIsICAgMSwJMHhmZiwgNSwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAotCi17InJldCIsCSAgIDAsCTB4YzMsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmV0IiwJICAgMSwJMHhjMiwgWCwgd2xfU3VmLAkJeyBJbW0xNiwgMCwgMH0gfSwKLXsibHJldCIsICAgMCwJMHhjYiwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJscmV0IiwgICAxLAkweGNhLCBYLCB3bF9TdWYsCQl7IEltbTE2LCAwLCAwfSB9LAoteyJlbnRlciIsICAyLAkweGM4LCBYLCB3bF9TdWYsCQl7IEltbTE2LCBJbW04LCAwfSB9LAoteyJsZWF2ZSIsICAwLAkweGM5LCBYLCB3bF9TdWYsCQl7IDAsIDAsIDB9IH0sCi0KLS8qIGNvbmRpdGlvbmFsIGp1bXBzICovCi17ImpvIiwJICAgMSwJMHg3MCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5vIiwJICAgMSwJMHg3MSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamIiLAkgICAxLAkweDcyLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYyIsCSAgIDEsCTB4NzIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYWUiLCAgIDEsCTB4NzIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYiIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYyIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImphZSIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImplIiwJICAgMSwJMHg3NCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianoiLAkgICAxLAkweDc0LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmUiLAkgICAxLAkweDc1LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbnoiLAkgICAxLAkweDc1LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYmUiLAkgICAxLAkweDc2LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmEiLAkgICAxLAkweDc2LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmJlIiwgICAxLAkweDc3LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYSIsCSAgIDEsCTB4NzcsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpzIiwJICAgMSwJMHg3OCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5zIiwJICAgMSwJMHg3OSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianAiLAkgICAxLAkweDdhLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcGUiLAkgICAxLAkweDdhLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbnAiLAkgICAxLAkweDdiLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcG8iLAkgICAxLAkweDdiLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbCIsCSAgIDEsCTB4N2MsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuZ2UiLCAgIDEsCTB4N2MsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubCIsCSAgIDEsCTB4N2QsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpnZSIsCSAgIDEsCTB4N2QsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpsZSIsCSAgIDEsCTB4N2UsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuZyIsCSAgIDEsCTB4N2UsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubGUiLCAgIDEsCTB4N2YsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpnIiwJICAgMSwJMHg3ZiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLQotLyogamN4eiB2cy4gamVjeHogaXMgY2hvc2VuIG9uIHRoZSBiYXNpcyBvZiB0aGUgYWRkcmVzcyBzaXplIHByZWZpeC4gICovCi17ImpjeHoiLCAgIDEsCTB4ZTMsIFgsIE5vU3VmfEp1bXBCeXRlfFNpemUxNiwgeyBEaXNwLCAwLCAwfSB9LAoteyJqZWN4eiIsICAxLAkweGUzLCBYLCBOb1N1ZnxKdW1wQnl0ZXxTaXplMzIsIHsgRGlzcCwgMCwgMH0gfSwKLQotLyogVGhlIGxvb3AgaW5zdHJ1Y3Rpb25zIGFsc28gdXNlIHRoZSBhZGRyZXNzIHNpemUgcHJlZml4IHRvIHNlbGVjdAotICAgJWN4IHJhdGhlciB0aGFuICVlY3ggZm9yIHRoZSBsb29wIGNvdW50LCBzbyB0aGUgYHcnIGZvcm0gb2YgdGhlc2UKLSAgIGluc3RydWN0aW9ucyBlbWl0IGFuIGFkZHJlc3Mgc2l6ZSBwcmVmaXggcmF0aGVyIHRoYW4gYSBkYXRhIHNpemUKLSAgIHByZWZpeC4gICovCi17Imxvb3AiLCAgIDEsCTB4ZTIsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29weiIsICAxLAkweGUxLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcGUiLCAgMSwJMHhlMSwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi17Imxvb3BueiIsIDEsCTB4ZTAsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29wbmUiLCAxLAkweGUwLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLQotLyogc2V0IGJ5dGUgb24gZmxhZyBpbnN0cnVjdGlvbnMgKi8KLXsic2V0byIsICAgMSwgMHgwZjkwLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRubyIsICAxLCAweDBmOTEsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGIiLCAgIDEsIDB4MGY5MiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YyIsICAgMSwgMHgwZjkyLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYWUiLCAxLCAweDBmOTIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5iIiwgIDEsIDB4MGY5MywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmMiLCAgMSwgMHgwZjkzLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRhZSIsICAxLCAweDBmOTMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGUiLCAgIDEsIDB4MGY5NCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0eiIsICAgMSwgMHgwZjk0LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuZSIsICAxLCAweDBmOTUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG56IiwgIDEsIDB4MGY5NSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YmUiLCAgMSwgMHgwZjk2LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYSIsICAxLCAweDBmOTYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5iZSIsIDEsIDB4MGY5NywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YSIsICAgMSwgMHgwZjk3LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRzIiwgICAxLCAweDBmOTgsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5zIiwgIDEsIDB4MGY5OSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cCIsICAgMSwgMHgwZjlhLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRwZSIsICAxLCAweDBmOWEsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5wIiwgIDEsIDB4MGY5YiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cG8iLCAgMSwgMHgwZjliLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRsIiwgICAxLCAweDBmOWMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5nZSIsIDEsIDB4MGY5YywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmwiLCAgMSwgMHgwZjlkLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRnZSIsICAxLCAweDBmOWQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGxlIiwgIDEsIDB4MGY5ZSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmciLCAgMSwgMHgwZjllLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRubGUiLCAxLCAweDBmOWYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGciLCAgIDEsIDB4MGY5ZiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLQotLyogc3RyaW5nIG1hbmlwdWxhdGlvbiAqLwoteyJjbXBzIiwgICAwLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17ImNtcHMiLCAgIDIsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBbnlNZW0sIDB9IH0sCi17InNjbXAiLCAgIDAsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic2NtcCIsICAgMiwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFueU1lbSwgMH0gfSwKLXsiaW5zIiwJICAgMCwJMHg2YywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJpbnMiLAkgICAyLAkweDZjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEluT3V0UG9ydFJlZywgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJvdXRzIiwgICAwLAkweDZlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17Im91dHMiLCAgIDIsCTB4NmUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBJbk91dFBvcnRSZWcsIDB9IH0sCi17ImxvZHMiLCAgIDAsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsibG9kcyIsICAgMSwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIDAsIDB9IH0sCi17ImxvZHMiLCAgIDIsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBY2MsIDB9IH0sCi17InNsb2QiLCAgIDAsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic2xvZCIsICAgMSwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIDAsIDB9IH0sCi17InNsb2QiLCAgIDIsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBY2MsIDB9IH0sCi17Im1vdnMiLCAgIDAsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsibW92cyIsICAgMiwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFueU1lbXxFc1NlZywgMH0gfSwKLXsic21vdiIsICAgMCwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzbW92IiwgICAyLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJzY2FzIiwgICAwLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNjYXMiLCAgIDEsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCAwLCAwfSB9LAoteyJzY2FzIiwgICAyLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQWNjLCAwfSB9LAoteyJzc2NhIiwgICAwLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNzY2EiLCAgIDEsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCAwLCAwfSB9LAoteyJzc2NhIiwgICAyLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQWNjLCAwfSB9LAoteyJzdG9zIiwgICAwLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InN0b3MiLCAgIDEsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCAwLCAwfSB9LAoteyJzdG9zIiwgICAyLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFjYywgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJzc3RvIiwgICAwLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNzdG8iLCAgIDEsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCAwLCAwfSB9LAoteyJzc3RvIiwgICAyLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFjYywgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJ4bGF0IiwgICAwLAkweGQ3LCBYLCBiX1N1ZnxJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJ4bGF0IiwgICAxLAkweGQ3LCBYLCBiX1N1ZnxJc1N0cmluZywJeyBBbnlNZW0sIDAsIDB9IH0sCi0KLS8qIGJpdCBtYW5pcHVsYXRpb24gKi8KLXsiYnNmIiwJICAgMiwgMHgwZmJjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiYnNyIiwJICAgMiwgMHgwZmJkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiYnQiLAkgICAyLCAweDBmYTMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidCIsCSAgIDIsIDB4MGZiYSwgNCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0YyIsCSAgIDIsIDB4MGZiYiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0YyIsCSAgIDIsIDB4MGZiYSwgNywgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0ciIsCSAgIDIsIDB4MGZiMywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0ciIsCSAgIDIsIDB4MGZiYSwgNiwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0cyIsCSAgIDIsIDB4MGZhYiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0cyIsCSAgIDIsIDB4MGZiYSwgNSwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi0KLS8qIGludGVycnVwdHMgJiBvcC4gc3lzIGluc25zICovCi0vKiBTZWUgZ2FzL2NvbmZpZy90Yy1pMzg2LmMgZm9yIGNvbnZlcnNpb24gb2YgJ2ludCAkMycgaW50byB0aGUgc3BlY2lhbAotICAgaW50IDMgaW5zbi4gKi8KLSNkZWZpbmUgSU5UX09QQ09ERSAweGNkCi0jZGVmaW5lIElOVDNfT1BDT0RFIDB4Y2MKLXsiaW50IiwJICAgMSwJMHhjZCwgWCwgTm9TdWYsCQkJeyBJbW04LCAwLCAwfSB9LAoteyJpbnQzIiwgICAwLAkweGNjLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImludG8iLCAgIDAsCTB4Y2UsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiaXJldCIsICAgMCwJMHhjZiwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAotLyogaTM4NnNsLCBpNDg2c2wsIGxhdGVyIDQ4NiwgYW5kIFBlbnRpdW0gKi8KLXsicnNtIiwJICAgMCwgMHgwZmFhLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi0KLXsiYm91bmQiLCAgMiwJMHg2MiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkTWVtLCAwfSB9LAotCi17ImhsdCIsCSAgIDAsCTB4ZjQsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLS8qIG5vcCBpcyBhY3R1YWxseSAneGNoZ2wgJWVheCwgJWVheCcgKi8KLXsibm9wIiwJICAgMCwJMHg5MCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBwcm90ZWN0aW9uIGNvbnRyb2wgKi8KLXsiYXJwbCIsICAgMiwJMHg2MywgWCwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2LCBSZWcxNnxTaG9ydE1lbSwgMH0gfSwKLXsibGFyIiwJICAgMiwgMHgwZjAyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGdkdCIsICAgMSwgMHgwZjAxLCAyLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17ImxpZHQiLCAgIDEsIDB4MGYwMSwgMywgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsbGR0IiwgICAxLCAweDBmMDAsIDIsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLXsibG1zdyIsICAgMSwgMHgwZjAxLCA2LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi17ImxzbCIsCSAgIDIsIDB4MGYwMywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17Imx0ciIsCSAgIDEsIDB4MGYwMCwgMywgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAotCi17InNnZHQiLCAgIDEsIDB4MGYwMSwgMCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJzaWR0IiwgICAxLCAweDBmMDEsIDEsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsic2xkdCIsICAgMSwgMHgwZjAwLCAwLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMH0gfSwKLXsic21zdyIsICAgMSwgMHgwZjAxLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMH0gfSwKLXsic3RyIiwJICAgMSwgMHgwZjAwLCAxLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi0KLXsidmVyciIsICAgMSwgMHgwZjAwLCA0LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi17InZlcnciLCAgIDEsIDB4MGYwMCwgNSwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAotCi0vKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotLyogbG9hZCAqLwoteyJmbGQiLAkgICAxLCAweGQ5YzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIHJlZ2lzdGVyICovCi17ImZsZCIsCSAgIDEsCTB4ZDksIDAsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZmxkIiwJICAgMSwgMHhkOWMwLCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZmxkIiwgICAgMSwJMHhkYiwgNSwgeF9GUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBlZmxvYXQgKi8KLXsiZmlsZCIsICAgMSwJMHhkZiwgMCwgc2xfU3VmfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHdvcmQoMTYpL2R3b3JkKDMyKSAqLwotLyogSW50ZWwgU3ludGF4ICovCi17ImZpbGQiLCAgMSwJMHhkZiwgNSwgZF9TdWZ8SWdub3JlU2l6ZXxNb2RybSx7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaWxkcSIsICAxLAkweGRmLCA1LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBxd29yZCAoNjQpICovCi17ImZpbGRsbCIsIDEsCTB4ZGYsIDUsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmxkdCIsICAgMSwJMHhkYiwgNSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gZWZsb2F0ICovCi17ImZibGQiLCAgIDEsCTB4ZGYsIDQsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGJjZCAqLwotCi0vKiBzdG9yZSAobm8gcG9wKSAqLwoteyJmc3QiLAkgICAxLCAweGRkZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIHJlZ2lzdGVyICovCi17ImZzdCIsCSAgIDEsCTB4ZDksIDIsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZnN0IiwJICAgMSwgMHhkZGQwLCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpc3QiLCAgIDEsCTB4ZGYsIDIsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSB3b3JkKDE2KS9kd29yZCgzMikgKi8KLQotLyogc3RvcmUgKHdpdGggcG9wKSAqLwoteyJmc3RwIiwgICAxLCAweGRkZDgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIHJlZ2lzdGVyICovCi17ImZzdHAiLCAgIDEsCTB4ZDksIDMsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZnN0cCIsICAgMSwgMHhkZGQ4LCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZnN0cCIsICAgMSwJMHhkYiwgNywgeF9GUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBlZmxvYXQgKi8KLXsiZmlzdHAiLCAgMSwJMHhkZiwgMywgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gd29yZCgxNikvZHdvcmQoMzIpICovCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZmlzdHAiLCAxLAkweGRmLCA3LCBkX0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmlzdHBxIiwgMSwJMHhkZiwgNywgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaXN0cGxsIiwxLAkweGRmLCA3LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBxd29yZCAoNjQpICovCi17ImZzdHB0IiwgIDEsCTB4ZGIsIDcsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGVmbG9hdCAqLwoteyJmYnN0cCIsICAxLAkweGRmLCA2LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBiY2QgKi8KLQotLyogZXhjaGFuZ2UgJXN0PG4+IHdpdGggJXN0MCAqLwoteyJmeGNoIiwgICAxLCAweGQ5YzgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ4Y2giLCAgIDAsIDB4ZDljOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmeGNoICVzdCgxKSAqLwotCi0vKiBjb21wYXJpc29uICh3aXRob3V0IHBvcCkgKi8KLXsiZmNvbSIsICAgMSwgMHhkOGQwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29tIiwgICAwLCAweGQ4ZDEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmNvbSAlc3QoMSkgKi8KLXsiZmNvbSIsICAgMSwJMHhkOCwgMiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gZmxvYXQvZG91YmxlICovCi17ImZjb20iLCAgIDEsIDB4ZDhkMCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmaWNvbSIsICAxLAkweGRlLCAyLCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIHdvcmQvZHdvcmQgKi8KLQotLyogY29tcGFyaXNvbiAod2l0aCBwb3ApICovCi17ImZjb21wIiwgIDEsIDB4ZDhkOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmNvbXAiLCAgMCwgMHhkOGQ5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZjb21wICVzdCgxKSAqLwoteyJmY29tcCIsICAxLAkweGQ4LCAzLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZmNvbXAiLCAgMSwgMHhkOGQ4LCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpY29tcCIsIDEsCTB4ZGUsIDMsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gd29yZC9kd29yZCAqLwoteyJmY29tcHAiLCAwLCAweGRlZDksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBjb21wYXJlICVzdDAsICVzdDEgJiBwb3AgMiAqLwotCi0vKiB1bm9yZGVyZWQgY29tcGFyaXNvbiAod2l0aCBwb3ApICovCi17ImZ1Y29tIiwgIDEsIDB4ZGRlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb20iLCAgMCwgMHhkZGUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZ1Y29tICVzdCgxKSAqLwoteyJmdWNvbXAiLCAxLCAweGRkZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ1Y29tcCIsIDAsIDB4ZGRlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmdWNvbXAgJXN0KDEpICovCi17ImZ1Y29tcHAiLDAsIDB4ZGFlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIHVjb21wYXJlICVzdDAsICVzdDEgJiBwb3AgdHdpY2UgKi8KLQoteyJmdHN0IiwgICAwLCAweGQ5ZTQsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiB0ZXN0ICVzdDAgKi8KLXsiZnhhbSIsICAgMCwgMHhkOWU1LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogZXhhbWluZSAlc3QwICovCi0KLS8qIGxvYWQgY29uc3RhbnRzIGludG8gJXN0MCAqLwoteyJmbGQxIiwgICAwLCAweGQ5ZTgsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSAxLjAgKi8KLXsiZmxkbDJ0IiwgMCwgMHhkOWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gbG9nMigxMCkgKi8KLXsiZmxkbDJlIiwgMCwgMHhkOWVhLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gbG9nMihlKSAqLwoteyJmbGRwaSIsICAwLCAweGQ5ZWIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBwaSAqLwoteyJmbGRsZzIiLCAwLCAweGQ5ZWMsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsb2cxMCgyKSAqLwoteyJmbGRsbjIiLCAwLCAweGQ5ZWQsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsbigyKSAqLwoteyJmbGR6IiwgICAwLCAweGQ5ZWUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSAwLjAgKi8KLQotLyogYXJpdGhtZXRpYyAqLwotCi0vKiBhZGQgKi8KLXsiZmFkZCIsICAgMiwgMHhkOGMwLCBYLCBGUHxTaG9ydEZvcm18RmxvYXRELAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmFkZCIsICAgMSwgMHhkOGMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LCAvKiBhbGlhcyBmb3IgZmFkZCAlc3QoaSksICVzdCAqLwotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmYWRkIiwgICAwLCAweGRlYzEsIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmFkZHAgKi8KLSNlbmRpZgoteyJmYWRkIiwgICAxLAkweGQ4LCAwLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWFkZCIsICAxLAkweGRlLCAwLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi17ImZhZGRwIiwgIDIsIDB4ZGVjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZhZGRwIiwgIDEsIDB4ZGVjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmFkZHAiLCAgMCwgMHhkZWMxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZhZGRwICVzdCwgJXN0KDEpICovCi17ImZhZGRwIiwgIDIsIDB4ZGVjMCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0KLS8qIHN1YnRyYWN0ICovCi17ImZzdWIiLCAgIDIsIDB4ZDhlMCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmc3ViIiwgICAxLCAweGQ4ZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZzdWIiLCAgIDAsIDB4ZGVlMSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmc3VicCAqLwotI2VuZGlmCi17ImZzdWIiLCAgIDEsCTB4ZDgsIDQsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpc3ViIiwgIDEsCTB4ZGUsIDQsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmc3VicCIsICAyLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicCIsICAxLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZzdWJwIiwgIDAsIDB4ZGVlMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc3VicCIsICAyLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2Vsc2UKLXsiZnN1YnAiLCAgMiwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnAiLCAgMSwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicCIsICAwLCAweGRlZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgotCi0vKiBzdWJ0cmFjdCByZXZlcnNlICovCi17ImZzdWJyIiwgIDIsIDB4ZDhlOCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmc3ViciIsICAxLCAweGQ4ZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZzdWJyIiwgIDAsIDB4ZGVlOSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmc3VicnAgKi8KLSNlbmRpZgoteyJmc3ViciIsICAxLAkweGQ4LCA1LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaXN1YnIiLCAxLAkweGRlLCA1LCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZnN1YnJwIiwgMiwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnJwIiwgMSwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicnAiLCAwLCAweGRlZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnN1YnJwIiwgMiwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbHNlCi17ImZzdWJycCIsIDIsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJycCIsIDEsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnJwIiwgMCwgMHhkZWUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQotLyogbXVsdGlwbHkgKi8KLXsiZm11bCIsICAgMiwgMHhkOGM4LCBYLCBGUHxTaG9ydEZvcm18RmxvYXRELAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZm11bCIsICAgMSwgMHhkOGM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmbXVsIiwgICAwLCAweGRlYzksIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZm11bHAgKi8KLSNlbmRpZgoteyJmbXVsIiwgICAxLAkweGQ4LCAxLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaW11bCIsICAxLAkweGRlLCAxLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi17ImZtdWxwIiwgIDIsIDB4ZGVjOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZtdWxwIiwgIDEsIDB4ZGVjOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZm11bHAiLCAgMCwgMHhkZWM5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZtdWxwIiwgIDIsIDB4ZGVjOCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0KLS8qIGRpdmlkZSAqLwoteyJmZGl2IiwgICAyLCAweGQ4ZjAsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmRpdiIsICAgMSwgMHhkOGYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmZGl2IiwgICAwLCAweGRlZjEsIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmRpdnAgKi8KLSNlbmRpZgoteyJmZGl2IiwgICAxLAkweGQ4LCA2LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWRpdiIsICAxLAkweGRlLCA2LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZkaXZwIiwgIDIsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZwIiwgIDEsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnAiLCAgMCwgMHhkZWYxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZkaXZwIiwgIDIsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZWxzZQoteyJmZGl2cCIsICAyLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cCIsICAxLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZwIiwgIDAsIDB4ZGVmOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLS8qIGRpdmlkZSByZXZlcnNlICovCi17ImZkaXZyIiwgIDIsIDB4ZDhmOCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmZGl2ciIsICAxLCAweGQ4ZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZkaXZyIiwgIDAsIDB4ZGVmOSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmZGl2cnAgKi8KLSNlbmRpZgoteyJmZGl2ciIsICAxLAkweGQ4LCA3LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWRpdnIiLCAxLAkweGRlLCA3LCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZmRpdnJwIiwgMiwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZmRpdnJwIiwgMSwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmZGl2cnAiLCAwLCAweGRlZjksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmRpdnJwIiwgMiwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbHNlCi17ImZkaXZycCIsIDIsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZycCIsIDEsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnJwIiwgMCwgMHhkZWYxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQoteyJmMnhtMSIsICAwLCAweGQ5ZjAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnlsMngiLCAgMCwgMHhkOWYxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwdGFuIiwgIDAsIDB4ZDlmMiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcGF0YW4iLCAwLCAweGQ5ZjMsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnh0cmFjdCIsMCwgMHhkOWY0LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwcmVtMSIsIDAsIDB4ZDlmNSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmZGVjc3RwIiwwLCAweGQ5ZjYsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmluY3N0cCIsMCwgMHhkOWY3LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwcmVtIiwgIDAsIDB4ZDlmOCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmeWwyeHAxIiwwLCAweGQ5ZjksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnNxcnQiLCAgMCwgMHhkOWZhLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzaW5jb3MiLDAsIDB4ZDlmYiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcm5kaW50IiwwLCAweGQ5ZmMsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnNjYWxlIiwgMCwgMHhkOWZkLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzaW4iLCAgIDAsIDB4ZDlmZSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmY29zIiwgICAwLCAweGQ5ZmYsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNocyIsICAgMCwgMHhkOWUwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZhYnMiLCAgIDAsIDB4ZDllMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBwcm9jZXNzb3IgY29udHJvbCAqLwoteyJmbmluaXQiLCAwLCAweGRiZTMsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmluaXQiLCAgMCwgMHhkYmUzLCBYLCBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLXsiZmxkY3ciLCAgMSwJMHhkOSwgNSwgRlB8TW9kcm0sCQl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmbnN0Y3ciLCAxLAkweGQ5LCA3LCBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZzdGN3IiwgIDEsCTB4ZDksIDcsIEZQfEZXYWl0fE1vZHJtLAl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmbnN0c3ciLCAxLCAweGRmZTAsIFgsIEZQLAkJCXsgQWNjLCAwLCAwfSB9LAoteyJmbnN0c3ciLCAxLAkweGRkLCA3LCBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZuc3RzdyIsIDAsIDB4ZGZlMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc3RzdyIsICAxLCAweGRmZTAsIFgsIEZQfEZXYWl0LAkJeyBBY2MsIDAsIDB9IH0sCi17ImZzdHN3IiwgIDEsCTB4ZGQsIDcsIEZQfEZXYWl0fE1vZHJtLAl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmc3RzdyIsICAwLCAweGRmZTAsIFgsIEZQfEZXYWl0LAkJeyAwLCAwLCAwfSB9LAoteyJmbmNsZXgiLCAwLCAweGRiZTIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNsZXgiLCAgMCwgMHhkYmUyLCBYLCBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLS8qIFNob3J0IGZvcm1zIG9mIGZsZGVudiwgZnN0ZW52IHVzZSBkYXRhIHNpemUgcHJlZml4LgotICAgRklYTUU6IEFyZSB0aGVzZSB0aGUgcmlnaHQgc3VmZml4ZXM/ICAqLwoteyJmbnN0ZW52IiwxLAkweGQ5LCA2LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmc3RlbnYiLCAxLAkweGQ5LCA2LCBzbF9TdWZ8RldhaXR8TW9kcm0sCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZsZGVudiIsIDEsCTB4ZDksIDQsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZuc2F2ZSIsIDEsCTB4ZGQsIDYsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZzYXZlIiwgIDEsCTB4ZGQsIDYsIHNsX1N1ZnxGV2FpdHxNb2RybSwJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnJzdG9yIiwgMSwJMHhkZCwgNCwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLQoteyJmZnJlZSIsICAxLCAweGRkYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBQNjpmcmVlIHN0KGkpLCBwb3Agc3QgKi8KLXsiZmZyZWVwIiwgMSwgMHhkZmMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmbm9wIiwgICAwLCAweGQ5ZDAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRldBSVRfT1BDT0RFIDB4OWIKLXsiZndhaXQiLCAgMCwJMHg5YiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi0vKgotICBvcGNvZGUgcHJlZml4ZXM7IHdlIGFsbG93IHRoZW0gYXMgc2VwZXJhdGUgaW5zbnMgdG9vCi0qLwotI2RlZmluZSBBRERSX1BSRUZJWF9PUENPREUgMHg2NwoteyJhZGRyMTYiLCAwLAkweDY3LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJhZGRyMzIiLCAwLAkweDY3LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJhd29yZCIsICAwLAkweDY3LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJhZHdvcmQiLCAwLAkweDY3LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBEQVRBX1BSRUZJWF9PUENPREUgMHg2NgoteyJkYXRhMTYiLCAwLAkweDY2LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJkYXRhMzIiLCAwLAkweDY2LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJ3b3JkIiwgICAwLAkweDY2LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJkd29yZCIsICAwLAkweDY2LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBMT0NLX1BSRUZJWF9PUENPREUgMHhmMAoteyJsb2NrIiwgICAwLAkweGYwLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJ3YWl0IiwgICAwLCAgIDB4OWIsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIENTX1BSRUZJWF9PUENPREUgMHgyZQoteyJjcyIsCSAgIDAsCTB4MmUsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIERTX1BSRUZJWF9PUENPREUgMHgzZQoteyJkcyIsCSAgIDAsCTB4M2UsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEVTX1BSRUZJWF9PUENPREUgMHgyNgoteyJlcyIsCSAgIDAsCTB4MjYsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEZTX1BSRUZJWF9PUENPREUgMHg2NAoteyJmcyIsCSAgIDAsCTB4NjQsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEdTX1BSRUZJWF9PUENPREUgMHg2NQoteyJncyIsCSAgIDAsCTB4NjUsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIFNTX1BSRUZJWF9PUENPREUgMHgzNgoteyJzcyIsCSAgIDAsCTB4MzYsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIFJFUE5FX1BSRUZJWF9PUENPREUgMHhmMgotI2RlZmluZSBSRVBFX1BSRUZJWF9PUENPREUgIDB4ZjMKLXsicmVwIiwJICAgMCwJMHhmMywgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVwZSIsICAgMCwJMHhmMywgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVweiIsICAgMCwJMHhmMywgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVwbmUiLCAgMCwJMHhmMiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVwbnoiLCAgMCwJMHhmMiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLQotLyogNDg2IGV4dGVuc2lvbnMgKi8KLQoteyJic3dhcCIsICAgMSwgMHgwZmM4LCBYLCBsX1N1ZnxTaG9ydEZvcm0sCXsgUmVnMzIsMCwwIH0gfSwKLXsieGFkZCIsICAgIDIsIDB4MGZjMCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCi17ImNtcHhjaGciLCAyLCAweDBmYjAsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyJpbnZkIiwgICAgMCwgMHgwZjA4LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsid2JpbnZkIiwgIDAsIDB4MGYwOSwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImludmxwZyIsICAxLCAweDBmMDEsIDcsIE5vU3VmfE1vZHJtLAkJeyBBbnlNZW0sIDAsIDB9IH0sCi0KLS8qIDU4NiBhbmQgbGF0ZSA0ODYgZXh0ZW5zaW9ucyAqLwoteyJjcHVpZCIsICAgMCwgMHgwZmEyLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLQotLyogUGVudGl1bSBleHRlbnNpb25zICovCi17IndybXNyIiwgICAwLCAweDBmMzAsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJyZHRzYyIsICAgMCwgMHgwZjMxLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmRtc3IiLCAgIDAsIDB4MGYzMiwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImNtcHhjaGc4YiIsMSwweDBmYzcsIDEsIE5vU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsic3lzZW50ZXIiLDAsIDB4MGYzNCwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17InN5c2V4aXQiLCAwLCAweDBmMzUsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJmeHNhdmUiLCAgMSwgMHgwZmFlLCAwLCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZ4cnN0b3IiLCAxLCAweDBmYWUsIDEsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLQotLyogUGVudGl1bSBQcm8gZXh0ZW5zaW9ucyAqLwoteyJyZHBtYyIsICAgMCwgMHgwZjMzLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLQoteyJ1ZDIiLAkgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogb2ZmaWNpYWwgdW5kZWZpbmVkIGluc3RyLiAqLwoteyJ1ZDJhIiwgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogYWxpYXMgZm9yIHVkMiAqLwoteyJ1ZDJiIiwgICAgMCwgMHgwZmI5LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogMm5kLiBvZmZpY2lhbCB1bmRlZmluZWQgaW5zdHIuICovCi0KLXsiY21vdm8iLCAgIDIsIDB4MGY0MCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubyIsICAyLCAweDBmNDEsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YiIsICAgMiwgMHgwZjQyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmMiLCAgIDIsIDB4MGY0MiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYWUiLCAyLCAweDBmNDIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YWUiLCAgMiwgMHgwZjQzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5jIiwgIDIsIDB4MGY0MywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYiIsICAyLCAweDBmNDMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92ZSIsICAgMiwgMHgwZjQ0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnoiLCAgIDIsIDB4MGY0NCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZSIsICAyLCAweDBmNDUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnoiLCAgMiwgMHgwZjQ1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmJlIiwgIDIsIDB4MGY0NiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYSIsICAyLCAweDBmNDYsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YSIsICAgMiwgMHgwZjQ3LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5iZSIsIDIsIDB4MGY0NywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZzIiwgICAyLCAweDBmNDgsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnMiLCAgMiwgMHgwZjQ5LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnAiLCAgIDIsIDB4MGY0YSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZucCIsICAyLCAweDBmNGIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bCIsICAgMiwgMHgwZjRjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5nZSIsIDIsIDB4MGY0YywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZnZSIsICAyLCAweDBmNGQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmwiLCAgMiwgMHgwZjRkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmxlIiwgIDIsIDB4MGY0ZSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZyIsICAyLCAweDBmNGUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92ZyIsICAgMiwgMHgwZjRmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5sZSIsIDIsIDB4MGY0ZiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLXsiZmNtb3ZiIiwgIDIsIDB4ZGFjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmFlIiwyLCAweGRhYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdmUiLCAgMiwgMHhkYWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZiZSIsIDIsIDB4ZGFkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmEiLCAyLCAweGRhZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdnUiLCAgMiwgMHhkYWQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhZSIsIDIsIDB4ZGJjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmIiLCAyLCAweGRiYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5lIiwgMiwgMHhkYmM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhIiwgIDIsIDB4ZGJkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmJlIiwyLCAweGRiZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm51IiwgMiwgMHhkYmQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLQoteyJmY29taSIsICAgMiwgMHhkYmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNvbWkiLCAgIDAsIDB4ZGJmMSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmY29taSIsICAgMSwgMHhkYmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMiwgMHhkYmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnVjb21pIiwgIDAsIDB4ZGJlOSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMSwgMHhkYmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29taXAiLCAgMiwgMHhkZmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNvbXBpIiwgIDIsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21waSIsICAwLCAweGRmZjEsIFgsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZmNvbXBpIiwgIDEsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb21pcCIsIDIsIDB4ZGZlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZ1Y29tcGkiLCAyLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmdWNvbXBpIiwgMCwgMHhkZmU5LCBYLCBGUHxTaG9ydEZvcm0sCQl7IDAsIDAsIDB9IH0sCi17ImZ1Y29tcGkiLCAxLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0KLS8qIE1NWCBpbnN0cnVjdGlvbnMuICAqLwotCi17ImVtbXMiLCAgICAgMCwgMHgwZjc3LCBYLCBGUCwJCQl7IDAsIDAsIDAgfSB9LAoteyJtb3ZkIiwgICAgIDIsIDB4MGY2ZSwgWCwgRlB8TW9kcm0sCQl7IFJlZzMyfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17Im1vdmQiLCAgICAgMiwgMHgwZjdlLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YLCBSZWczMnxMb25nTWVtLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmNmYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmN2YsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVgsIFJlZ01NWHxMb25nTWVtLCAwIH0gfSwKLXsicGFja3NzZHciLCAyLCAweDBmNmIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Nzd2IiLCAyLCAweDBmNjMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Vzd2IiLCAyLCAweDBmNjcsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGIiLCAgICAyLCAweDBmZmMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHciLCAgICAyLCAweDBmZmQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGQiLCAgICAyLCAweDBmZmUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHNiIiwgICAyLCAweDBmZWMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHN3IiwgICAyLCAweDBmZWQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzYiIsICAyLCAweDBmZGMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzdyIsICAyLCAweDBmZGQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZCIsICAgICAyLCAweDBmZGIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZG4iLCAgICAyLCAweDBmZGYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxYiIsICAyLCAweDBmNzQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxdyIsICAyLCAweDBmNzUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxZCIsICAyLCAweDBmNzYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0YiIsICAyLCAweDBmNjQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0dyIsICAyLCAweDBmNjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0ZCIsICAyLCAweDBmNjYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1hZGR3ZCIsICAyLCAweDBmZjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGh3IiwgICAyLCAweDBmZTUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGx3IiwgICAyLCAweDBmZDUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG9yIiwJICAgICAyLCAweDBmZWIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmZjEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmNzEsIDYsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGZmMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGY3MiwgNiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZmYzLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZjczLCA2LCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmZTEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmNzEsIDQsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGZlMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGY3MiwgNCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZmQxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZjcxLCAyLCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmZDIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmNzIsIDIsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGZkMywgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGY3MywgMiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzdWJiIiwgICAgMiwgMHgwZmY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ3IiwgICAgMiwgMHgwZmY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJkIiwgICAgMiwgMHgwZmZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzYiIsICAgMiwgMHgwZmU4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzdyIsICAgMiwgMHgwZmU5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c2IiLCAgMiwgMHgwZmQ4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c3ciLCAgMiwgMHgwZmQ5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hidyIsMiwgMHgwZjY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2h3ZCIsMiwgMHgwZjY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hkcSIsMiwgMHgwZjZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xidyIsMiwgMHgwZjYwLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2x3ZCIsMiwgMHgwZjYxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xkcSIsMiwgMHgwZjYyLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB4b3IiLCAgICAgMiwgMHgwZmVmLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi0KLQotLyogUElJSSBLYXRtYWkgTmV3IEluc3RydWN0aW9ucyAvIFNJTUQgaW5zdHJ1Y3Rpb25zICovCi0KLXsiYWRkcHMiLCAgICAgMiwgMHgwZjU4LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFkZHNzIiwgICAgIDIsIDB4ZjMwZjU4LCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFuZG5wcyIsICAgIDIsIDB4MGY1NSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJhbmRwcyIsICAgICAyLCAweDBmNTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBwcyIsICAgICAzLCAweDBmYzIsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NIH0gfSwKLXsiY21wc3MiLCAgICAgMywgMHhmMzBmYzIsICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdYTU18V29yZE1lbSwgUmVnWE1NIH0gfSwKLXsiY21wZXFwcyIsICAgMiwgMHgwZmMyLCAgICAwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBlcXNzIiwgICAyLCAweGYzMGZjMiwgIDAsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbHRwcyIsICAgMiwgMHgwZmMyLCAgICAxLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsdHNzIiwgICAyLCAweGYzMGZjMiwgIDEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbGVwcyIsICAgMiwgMHgwZmMyLCAgICAyLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsZXNzIiwgICAyLCAweGYzMGZjMiwgIDIsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wdW5vcmRwcyIsMiwgMHgwZmMyLCAgICAzLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXB1bm9yZHNzIiwyLCAweGYzMGZjMiwgIDMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmVxcHMiLCAgMiwgMHgwZmMyLCAgICA0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBuZXFzcyIsICAyLCAweGYzMGZjMiwgIDQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmx0cHMiLCAgMiwgMHgwZmMyLCAgICA1LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubHRzcyIsICAyLCAweGYzMGZjMiwgIDUsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmxlcHMiLCAgMiwgMHgwZmMyLCAgICA2LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubGVzcyIsICAyLCAweGYzMGZjMiwgIDYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wb3JkcHMiLCAgMiwgMHgwZmMyLCAgICA3LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBvcmRzcyIsICAyLCAweGYzMGZjMiwgIDcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY29taXNzIiwgICAgMiwgMHgwZjJmLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0cGkycHMiLCAgMiwgMHgwZjJhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImN2dHNpMnNzIiwgIDIsIDB4ZjMwZjJhLCAgWCwgRlB8TW9kcm0sCXsgUmVnMzJ8V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0cHMycGkiLCAgMiwgMHgwZjJkLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHNzMnNpIiwgIDIsIDB4ZjMwZjJkLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiY3Z0dHBzMnBpIiwgMiwgMHgwZjJjLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHRzczJzaSIsIDIsIDB4ZjMwZjJjLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiZGl2cHMiLCAgICAgMiwgMHgwZjVlLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImRpdnNzIiwgICAgIDIsIDB4ZjMwZjVlLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImxkbXhjc3IiLCAgIDEsIDB4MGZhZSwgICAgMiwgRlB8TW9kcm0sIAl7IFdvcmRNZW0sIDAsIDAgfSB9LAoteyJzdG14Y3NyIiwgICAxLCAweDBmYWUsICAgIDMsIEZQfE1vZHJtLCAJeyBXb3JkTWVtLCAwLCAwIH0gfSwKLXsic2ZlbmNlIiwgICAgMCwgMHgwZmFlZjgsICBYLCBGUCwJCXsgMCwgMCwgMCB9IH0sCi17Im1heHBzIiwgICAgIDIsIDB4MGY1ZiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtYXhzcyIsICAgICAyLCAweGYzMGY1ZiwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtaW5wcyIsICAgICAyLCAweDBmNWQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibWluc3MiLCAgICAgMiwgMHhmMzBmNWQsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92YXBzIiwgICAgMiwgMHgwZjI4LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmFwcyIsICAgIDIsIDB4MGYyOSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBSZWdYTU18TExvbmdNZW0sIDAgfSB9LAoteyJtb3ZobHBzIiwgICAyLCAweDBmMTIsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxJbnZNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmhwcyIsICAgIDIsIDB4MGYxNiwgICAgWCwgRlB8TW9kcm0sCXsgTExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmhwcyIsICAgIDIsIDB4MGYxNywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBMTG9uZ01lbSwgMCB9IH0sCi17Im1vdmxocHMiLCAgIDIsIDB4MGYxNiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfEludk1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92bHBzIiwgICAgMiwgMHgwZjEyLCAgICBYLCBGUHxNb2RybSwJeyBMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92bHBzIiwgICAgMiwgMHgwZjEzLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bXNrcHMiLCAgMiwgMHgwZjUwLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18SW52TWVtLCBSZWczMiwgMCB9IH0sCi17Im1vdnVwcyIsICAgIDIsIDB4MGYxMCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3Z1cHMiLCAgICAyLCAweDBmMTEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTSwgUmVnWE1NfExMb25nTWVtLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTAsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTEsICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIFJlZ1hNTXxXb3JkTWVtLCAwIH0gfSwKLXsibXVscHMiLCAgICAgMiwgMHgwZjU5LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im11bHNzIiwgICAgIDIsIDB4ZjMwZjU5LCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im9ycHMiLCAgICAgIDIsIDB4MGY1NiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJyY3BwcyIsICAgICAyLCAweDBmNTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsicmNwc3MiLCAgICAgMiwgMHhmMzBmNTMsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsicnNxcnRwcyIsICAgMiwgMHgwZjUyLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InJzcXJ0c3MiLCAgIDIsIDB4ZjMwZjUyLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InNodWZwcyIsICAgIDMsIDB4MGZjNiwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0gfSB9LAoteyJzcXJ0cHMiLCAgICAyLCAweDBmNTEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3FydHNzIiwgICAgMiwgMHhmMzBmNTEsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3VicHMiLCAgICAgMiwgMHgwZjVjLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InN1YnNzIiwgICAgIDIsIDB4ZjMwZjVjLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVjb21pc3MiLCAgIDIsIDB4MGYyZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVucGNraHBzIiwgIDIsIDB4MGYxNSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJ1bnBja2xwcyIsICAyLCAweDBmMTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsieG9ycHMiLCAgICAgMiwgMHgwZjU3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InBhdmdiIiwgICAgIDIsIDB4MGZlMCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwYXZndyIsICAgICAyLCAweDBmZTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGV4dHJ3IiwgICAgMywgMHgwZmM1LCAgICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdNTVgsIFJlZzMyfEludk1lbSB9IH0sCi17InBpbnNydyIsICAgIDMsIDB4MGZjNCwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnMzJ8U2hvcnRNZW0sIFJlZ01NWCB9IH0sCi17InBtYXhzdyIsICAgIDIsIDB4MGZlZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWF4dWIiLCAgICAyLCAweDBmZGUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1pbnN3IiwgICAgMiwgMHgwZmVhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtaW51YiIsICAgIDIsIDB4MGZkYSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbW92bXNrYiIsICAyLCAweDBmZDcsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWCwgUmVnMzJ8SW52TWVtLCAwIH0gfSwKLXsicG11bGh1dyIsICAgMiwgMHgwZmU0LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzYWRidyIsICAgIDIsIDB4MGZmNiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2h1ZnciLCAgICAzLCAweDBmNzAsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YIH0gfSwKLXsibWFza21vdnEiLCAgMiwgMHgwZmY3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8SW52TWVtLCBSZWdNTVgsIDAgfSB9LAoteyJtb3ZudHBzIiwgICAyLCAweDBmMmIsICAgIFgsIEZQfE1vZHJtLCAJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bnRxIiwgICAgMiwgMHgwZmU3LCAgICBYLCBGUHxNb2RybSwgCXsgUmVnTU1YLCBMTG9uZ01lbSwgMCB9IH0sCi17InByZWZldGNobnRhIiwgMSwgMHgwZjE4LCAgMCwgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h0MCIsICAxLCAweDBmMTgsICAxLCBGUHxNb2RybSwgCXsgTExvbmdNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHQxIiwgIDEsIDB4MGYxOCwgIDIsIEZQfE1vZHJtLCAJeyBMTG9uZ01lbSwgMCwgMCB9IH0sCi17InByZWZldGNodDIiLCAgMSwgMHgwZjE4LCAgMywgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLQotLyogQU1EIDNETm93ISBpbnN0cnVjdGlvbnMgKi8KLQoteyJwcmVmZXRjaCIsIDEsIDB4MGYwZCwJICAgMCwgRlB8TW9kcm0sCQl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHciLDEsIDB4MGYwZCwJICAgMSwgRlB8TW9kcm0sCQl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoteyJmZW1tcyIsICAgIDAsIDB4MGYwZSwJICAgWCwgRlAsCQl7IDAsIDAsIDAgfSB9LAoteyJwYXZndXNiIiwgIDIsIDB4MGYwZiwgMHhiZiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZjJpZCIsICAgIDIsIDB4MGYwZiwgMHgxZCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmFjYyIsICAgIDIsIDB4MGYwZiwgMHhhZSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmFkZCIsICAgIDIsIDB4MGYwZiwgMHg5ZSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGVxIiwgIDIsIDB4MGYwZiwgMHhiMCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGdlIiwgIDIsIDB4MGYwZiwgMHg5MCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGd0IiwgIDIsIDB4MGYwZiwgMHhhMCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm1heCIsICAgIDIsIDB4MGYwZiwgMHhhNCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm1pbiIsICAgIDIsIDB4MGYwZiwgMHg5NCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm11bCIsICAgIDIsIDB4MGYwZiwgMHhiNCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcCIsICAgIDIsIDB4MGYwZiwgMHg5NiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MSIsIDIsIDB4MGYwZiwgMHhhNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MiIsIDIsIDB4MGYwZiwgMHhiNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcWl0MSIsIDIsIDB4MGYwZiwgMHhhNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcXJ0IiwgIDIsIDB4MGYwZiwgMHg5NywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnN1YiIsICAgIDIsIDB4MGYwZiwgMHg5YSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnN1YnIiLCAgIDIsIDB4MGYwZiwgMHhhYSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwaTJmZCIsICAgIDIsIDB4MGYwZiwgMHgwZCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbXVsaHJ3IiwgIDIsIDB4MGYwZiwgMHhiNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAotCi17TlVMTCwgMCwgMCwgMCwgMCwgeyAwLCAwLCAwfSB9CS8qIHNlbnRpbmVsICovCi19OwotI3VuZGVmIFgKLSN1bmRlZiBOb1N1ZgotI3VuZGVmIGJfU3VmCi0jdW5kZWYgd19TdWYKLSN1bmRlZiBsX1N1ZgotI3VuZGVmIGJ3X1N1ZgotI3VuZGVmIGJsX1N1ZgotI3VuZGVmIHdsX1N1ZgotI3VuZGVmIHNsX1N1ZgotI3VuZGVmIGJ3bF9TdWYKLSN1bmRlZiBGUAotI3VuZGVmIGxfRlAKLSN1bmRlZiBzbF9GUAotCi0jZGVmaW5lIE1BWF9NTkVNX1NJWkUgMTYJLyogZm9yIHBhcnNpbmcgaW5zbiBtbmVtb25pY3MgZnJvbSBpbnB1dCAqLwotCi0KLS8qIDM4NiByZWdpc3RlciB0YWJsZSAqLwotCi1zdGF0aWMgY29uc3QgcmVnX2VudHJ5IGkzODZfcmVndGFiW10gPSB7Ci0gIC8qIDggYml0IHJlZ3MgKi8KLSAgeyJhbCIsIFJlZzh8QWNjLCAwfSwKLSAgeyJjbCIsIFJlZzh8U2hpZnRDb3VudCwgMX0sCi0gIHsiZGwiLCBSZWc4LCAyfSwKLSAgeyJibCIsIFJlZzgsIDN9LAotICB7ImFoIiwgUmVnOCwgNH0sCi0gIHsiY2giLCBSZWc4LCA1fSwKLSAgeyJkaCIsIFJlZzgsIDZ9LAotICB7ImJoIiwgUmVnOCwgN30sCi0gIC8qIDE2IGJpdCByZWdzICovCi0gIHsiYXgiLCBSZWcxNnxBY2MsIDB9LAotICB7ImN4IiwgUmVnMTYsIDF9LAotICB7ImR4IiwgUmVnMTZ8SW5PdXRQb3J0UmVnLCAyfSwKLSAgeyJieCIsIFJlZzE2fEJhc2VJbmRleCwgM30sCi0gIHsic3AiLCBSZWcxNiwgNH0sCi0gIHsiYnAiLCBSZWcxNnxCYXNlSW5kZXgsIDV9LAotICB7InNpIiwgUmVnMTZ8QmFzZUluZGV4LCA2fSwKLSAgeyJkaSIsIFJlZzE2fEJhc2VJbmRleCwgN30sCi0gIC8qIDMyIGJpdCByZWdzICovCi0gIHsiZWF4IiwgUmVnMzJ8QmFzZUluZGV4fEFjYywgMH0sCi0gIHsiZWN4IiwgUmVnMzJ8QmFzZUluZGV4LCAxfSwKLSAgeyJlZHgiLCBSZWczMnxCYXNlSW5kZXgsIDJ9LAotICB7ImVieCIsIFJlZzMyfEJhc2VJbmRleCwgM30sCi0gIHsiZXNwIiwgUmVnMzIsIDR9LAotICB7ImVicCIsIFJlZzMyfEJhc2VJbmRleCwgNX0sCi0gIHsiZXNpIiwgUmVnMzJ8QmFzZUluZGV4LCA2fSwKLSAgeyJlZGkiLCBSZWczMnxCYXNlSW5kZXgsIDd9LAotICAvKiBzZWdtZW50IHJlZ2lzdGVycyAqLwotICB7ImVzIiwgU1JlZzIsIDB9LAotICB7ImNzIiwgU1JlZzIsIDF9LAotICB7InNzIiwgU1JlZzIsIDJ9LAotICB7ImRzIiwgU1JlZzIsIDN9LAotICB7ImZzIiwgU1JlZzMsIDR9LAotICB7ImdzIiwgU1JlZzMsIDV9LAotICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICB7ImNyMCIsIENvbnRyb2wsIDB9LAotICB7ImNyMSIsIENvbnRyb2wsIDF9LAotICB7ImNyMiIsIENvbnRyb2wsIDJ9LAotICB7ImNyMyIsIENvbnRyb2wsIDN9LAotICB7ImNyNCIsIENvbnRyb2wsIDR9LAotICB7ImNyNSIsIENvbnRyb2wsIDV9LAotICB7ImNyNiIsIENvbnRyb2wsIDZ9LAotICB7ImNyNyIsIENvbnRyb2wsIDd9LAotICAvKiBkZWJ1ZyByZWdpc3RlcnMgKi8KLSAgeyJkYjAiLCBEZWJ1ZywgMH0sCi0gIHsiZGIxIiwgRGVidWcsIDF9LAotICB7ImRiMiIsIERlYnVnLCAyfSwKLSAgeyJkYjMiLCBEZWJ1ZywgM30sCi0gIHsiZGI0IiwgRGVidWcsIDR9LAotICB7ImRiNSIsIERlYnVnLCA1fSwKLSAgeyJkYjYiLCBEZWJ1ZywgNn0sCi0gIHsiZGI3IiwgRGVidWcsIDd9LAotICB7ImRyMCIsIERlYnVnLCAwfSwKLSAgeyJkcjEiLCBEZWJ1ZywgMX0sCi0gIHsiZHIyIiwgRGVidWcsIDJ9LAotICB7ImRyMyIsIERlYnVnLCAzfSwKLSAgeyJkcjQiLCBEZWJ1ZywgNH0sCi0gIHsiZHI1IiwgRGVidWcsIDV9LAotICB7ImRyNiIsIERlYnVnLCA2fSwKLSAgeyJkcjciLCBEZWJ1ZywgN30sCi0gIC8qIHRlc3QgcmVnaXN0ZXJzICovCi0gIHsidHIwIiwgVGVzdCwgMH0sCi0gIHsidHIxIiwgVGVzdCwgMX0sCi0gIHsidHIyIiwgVGVzdCwgMn0sCi0gIHsidHIzIiwgVGVzdCwgM30sCi0gIHsidHI0IiwgVGVzdCwgNH0sCi0gIHsidHI1IiwgVGVzdCwgNX0sCi0gIHsidHI2IiwgVGVzdCwgNn0sCi0gIHsidHI3IiwgVGVzdCwgN30sCi0gIC8qIGZsb2F0IHJlZ2lzdGVycyAqLwotICB7InN0KDApIiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICB7InN0IiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICB7InN0KDEpIiwgRmxvYXRSZWcsIDF9LAotICB7InN0KDIpIiwgRmxvYXRSZWcsIDJ9LAotICB7InN0KDMpIiwgRmxvYXRSZWcsIDN9LAotICB7InN0KDQpIiwgRmxvYXRSZWcsIDR9LAotICB7InN0KDUpIiwgRmxvYXRSZWcsIDV9LAotICB7InN0KDYpIiwgRmxvYXRSZWcsIDZ9LAotICB7InN0KDcpIiwgRmxvYXRSZWcsIDd9LAotICB7Im1tMCIsIFJlZ01NWCwgMH0sCi0gIHsibW0xIiwgUmVnTU1YLCAxfSwKLSAgeyJtbTIiLCBSZWdNTVgsIDJ9LAotICB7Im1tMyIsIFJlZ01NWCwgM30sCi0gIHsibW00IiwgUmVnTU1YLCA0fSwKLSAgeyJtbTUiLCBSZWdNTVgsIDV9LAotICB7Im1tNiIsIFJlZ01NWCwgNn0sCi0gIHsibW03IiwgUmVnTU1YLCA3fSwKLSAgeyJ4bW0wIiwgUmVnWE1NLCAwfSwKLSAgeyJ4bW0xIiwgUmVnWE1NLCAxfSwKLSAgeyJ4bW0yIiwgUmVnWE1NLCAyfSwKLSAgeyJ4bW0zIiwgUmVnWE1NLCAzfSwKLSAgeyJ4bW00IiwgUmVnWE1NLCA0fSwKLSAgeyJ4bW01IiwgUmVnWE1NLCA1fSwKLSAgeyJ4bW02IiwgUmVnWE1NLCA2fSwKLSAgeyJ4bW03IiwgUmVnWE1NLCA3fQotfTsKLQotI2RlZmluZSBNQVhfUkVHX05BTUVfU0laRSA4CS8qIGZvciBwYXJzaW5nIHJlZ2lzdGVyIG5hbWVzIGZyb20gaW5wdXQgKi8KLQotLyogc2VnbWVudCBzdHVmZiAqLwotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBjcyA9IHsgImNzIiwgMHgyZSB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBkcyA9IHsgImRzIiwgMHgzZSB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBzcyA9IHsgInNzIiwgMHgzNiB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBlcyA9IHsgImVzIiwgMHgyNiB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBmcyA9IHsgImZzIiwgMHg2NCB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBncyA9IHsgImdzIiwgMHg2NSB9OwotCi0vKiBlbmQgb2Ygb3Bjb2RlL2kzODYuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTg2MC5oIGIvaW5jbHVkZS9vcGNvZGUvaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmViZDI1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2k4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgaTg2MC4KLSAgIENvcHlyaWdodCAoQykgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgYW5kIEdEQiwgdGhlIEdOVSBkaXNhc3NlbWJsZXIuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKgotICogU3RydWN0dXJlIG9mIGFuIG9wY29kZSB0YWJsZSBlbnRyeS4KLSAqLwotc3RydWN0IGk4NjBfb3Bjb2RlCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB1bnNpZ25lZCBsb25nIG1hdGNoOwkvKiBCaXRzIHRoYXQgbXVzdCBiZSBzZXQuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgbG9zZTsJLyogQml0cyB0aGF0IG11c3Qgbm90IGJlIHNldC4gICovCi0gICAgY29uc3QgY2hhciAqYXJnczsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBwb3NzaWJsZSBleHBhbmQtaW5zdHJ1Y3Rpb24uICAqLwotICAgIGNoYXIgZXhwYW5kOwotfTsKLQotZW51bSBleHBhbmRfdHlwZQotewotICAgIEVfTU9WID0gMSwgRV9BRERSLCBFX1UzMiwgRV9BTkQsIEVfUzMyLCBFX0RFTEFZCi19OwotCi0vKgotICAgQWxsIGk4NjAgb3Bjb2RlcyBhcmUgMzIgYml0cywgZXhjZXB0IGZvciB0aGUgcHNldWRvaW5zdHJ1Y3Rpb25zCi0gICBhbmQgdGhlIG9wZXJhdGlvbnMgdXRpbGl6aW5nIGEgMzItYml0IGFkZHJlc3MgZXhwcmVzc2lvbiwgYW4KLSAgIHVuc2lnbmVkIDMyLWJpdCBjb25zdGFudCwgb3IgYSBzaWduZWQgMzItYml0IGNvbnN0YW50LgotICAgVGhlc2Ugb3Bjb2RlcyBhcmUgZXhwYW5kZWQgaW50byBhIHR3by1pbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IKLSAgIGFueSBzaXR1YXRpb24gd2hlcmUgdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGRvZXMgbm90IGZpdCBpbiAzMiBiaXRzLgotICAgSW4gdGhlIGNhc2Ugb2YgdGhlIGFkZCBhbmQgc3VidHJhY3Qgb3BlcmF0aW9ucyB0aGUgZXhwYW5zaW9uIGlzCi0gICB0byBhIHRocmVlLWluc3RydWN0aW9uIHNlcXVlbmNlIChleDogb3JoLCBvciwgYWRkcykuICBJbiBjYXNlcwotICAgd2hlcmUgdGhlIGFkZHJlc3MgaXMgdG8gYmUgcmVsb2NhdGVkLCB0aGUgaW5zdHJ1Y3Rpb24gaXMKLSAgIGV4cGFuZGVkIHRvIGhhbmRsZSB0aGUgd29yc2UgY2FzZSwgdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYXQKLSAgIHRoZSBmaW5hbCBsaW5rIGlmIHRoZSBhY3R1YWwgYWRkcmVzcyB3ZXJlIGtub3duLgotCi0gICBUaGUgcHNldWRvaW5zdHJ1Y3Rpb25zIGFyZTogIG1vdiwgZm1vdiwgcG1vdiwgbm9wLCBhbmQgZm5vcC4KLSAgIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgYSBvbmUgb3IgdHdvIGluc3RydWN0aW9uCi0gICBzZXF1ZW5jZSBvZiBvdGhlciBvcGVyYXRpb25zLgotCi0gICBUaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIG9uZSBjaGFyYWN0ZXIKLSAgIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLgotCi1LaW5kcyBvZiBvcGVyYW5kczoKLSAgICMgICAgTnVtYmVyIHVzZWQgYnkgb3B0aW1pemVyLiAgSXQgaXMgaWdub3JlZC4KLSAgIDEgICAgc3JjMSBpbnRlZ2VyIHJlZ2lzdGVyLgotICAgMiAgICBzcmMyIGludGVnZXIgcmVnaXN0ZXIuCi0gICBkICAgIGRlc3QgcmVnaXN0ZXIuCi0gICBjCWN0cmxyZWcgY29udHJvbCByZWdpc3Rlci4KLSAgIGkgICAgMTYgYml0IGltbWVkaWF0ZS4KLSAgIEkgICAgMTYgYml0IGltbWVkaWF0ZSwgYWxpZ25lZC4KLSAgIDUgICAgNSBiaXQgaW1tZWRpYXRlLgotICAgbCAgICBsYnJvZmYgMjYgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KLSAgIHIgICAgc2Jyb2ZmIDE2IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0gICBzCXNwbGl0IDE2IGJpdCBpbW1lZGlhdGUuCi0gICBTCXNwbGl0IDE2IGJpdCBpbW1lZGlhdGUsIGFsaWduZWQuCi0gICBlICAgIHNyYzEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0gICBmICAgIHNyYzIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0gICBnICAgIGRlc3QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0KLSovCi0KLS8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGlzIHRhYmxlIGlzIHNpZ25pZmljYW50OgotICAgCi0gICAqIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUKLSAgIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0IHJ1bnRpbWUuCi0KLSAgICogVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgbm90IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpODYwX29wY29kZSBpODYwX29wY29kZXNbXSA9Ci17Ci0KLS8qIFJFRy1Gb3JtYXQgSW5zdHJ1Y3Rpb25zICovCi17ICJsZC5jIiwJMHgzMDAwMDAwMCwgMHhjYzAwMDAwMCwgImMsZCIsIDAgfSwJLyogbGQuYyBjc3JjMixpZGVzdCAqLwoteyAibGQuYiIsCTB4MDAwMDAwMDAsIDB4ZmMwMDAwMDAsICIxKDIpLGQiLCAwIH0sCS8qIGxkLmIgaXNyYzEoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5iIiwJMHgwNDAwMDAwMCwgMHhmODAwMDAwMCwgIkkoMiksZCIsIEVfQUREUiB9LAkvKiBsZC5iICNjb25zdChpc3JjMiksaWRlc3QgKi8KLXsgImxkLnMiLAkweDEwMDAwMDAwLCAweGVjMDAwMDAxLCAiMSgyKSxkIiwgMCB9LAkvKiBsZC5zIGlzcmMxKGlzcmMyKSxpZGVzdCAqLwoteyAibGQucyIsCTB4MTQwMDAwMDEsIDB4ZTgwMDAwMDAsICJJKDIpLGQiLCBFX0FERFIgfSwJLyogbGQucyAjY29uc3QoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5sIiwJMHgxMDAwMDAwMSwgMHhlYzAwMDAwMCwgIjEoMiksZCIsIDAgfSwJLyogbGQubCBpc3JjMShpc3JjMiksaWRlc3QgKi8KLXsgImxkLmwiLAkweDE0MDAwMDAxLCAweGU4MDAwMDAwLCAiSSgyKSxkIiwgRV9BRERSIH0sCS8qIGxkLmwgI2NvbnN0KGlzcmMyKSxpZGVzdCAqLwotCi17ICJzdC5jIiwJMHgzODAwMDAwMCwgMHhjNDAwMDAwMCwgIjEsYyIsIDAgfSwJLyogc3QuYyBpc3JjMW5pLGNzcmMyICovCi17ICJzdC5iIiwJMHgwYzAwMDAwMCwgMHhmMDAwMDAwMCwgIjEsUygyKSIsIEVfQUREUiB9LAkvKiBzdC5iIGlzcmMxbmksI2NvbnN0KGlzcmMyKSAqLwoteyAic3QucyIsCTB4MWMwMDAwMDAsIDB4ZTAwMDAwMDAsICIxLFMoMikiLCBFX0FERFIgfSwJLyogc3QucyBpc3JjMW5pLCNjb25zdChpc3JjMikgKi8KLXsgInN0LmwiLAkweDFjMDAwMDAxLCAweGUwMDAwMDAwLCAiMSxTKDIpIiwgRV9BRERSIH0sCS8qIHN0LmwgaXNyYzFuaSwjY29uc3QoaXNyYzIpICovCi0KLXsgIml4ZnIiLAkweDA4MDAwMDAwLCAweGY0MDAwMDAwLCAiMSxnIiwgMCB9LAkvKiBpeGZyIGlzcmMxbmksZmRlc3QgKi8KLQoteyAiZmxkLmwiLAkweDIwMDAwMDAyLCAweGRjMDAwMDAxLCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQubCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyNDAwMDAwMiwgMHhkODAwMDAwMSwgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQubCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQubCIsCTB4MjAwMDAwMDMsIDB4ZGMwMDAwMDAsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLmwgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyNDAwMDAwMywgMHhkODAwMDAwMCwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5sICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDIwMDAwMDAwLCAweGRjMDAwMDA3LCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQuZCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyNDAwMDAwMCwgMHhkODAwMDAwNywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQuZCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQuZCIsCTB4MjAwMDAwMDEsIDB4ZGMwMDAwMDYsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLmQgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyNDAwMDAwMSwgMHhkODAwMDAwNiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5kICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDIwMDAwMDA0LCAweGRjMDAwMDAzLCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQucSBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyNDAwMDAwNCwgMHhkODAwMDAwMywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQucSAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQucSIsCTB4MjAwMDAwMDUsIDB4ZGMwMDAwMDIsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLnEgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyNDAwMDAwNSwgMHhkODAwMDAwMiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5xICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwotCi17ICJwZmxkLmwiLAkweDYwMDAwMDAwLCAweDljMDAwMDAzLCAiMSgyKSxnIiwgMCB9LAkvKiBwZmxkLmwgaXNyYzEoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDY0MDAwMDAwLCAweDk4MDAwMDAzLCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIHBmbGQubCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDYwMDAwMDAxLCAweDljMDAwMDAyLCAiMSgyKSsrLGciLCAwIH0sCS8qIHBmbGQubCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAicGZsZC5sIiwJMHg2NDAwMDAwMSwgMHg5ODAwMDAwMiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIHBmbGQubCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjAwMDAwMDAsIDB4OWMwMDAwMDcsICIxKDIpLGciLCAwIH0sCS8qIHBmbGQuZCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjQwMDAwMDAsIDB4OTgwMDAwMDcsICJpKDIpLGciLCBFX0FERFIgfSwJLyogcGZsZC5kICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjAwMDAwMDEsIDB4OWMwMDAwMDYsICIxKDIpKyssZyIsIDAgfSwJLyogcGZsZC5kIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJwZmxkLmQiLAkweDY0MDAwMDAxLCAweDk4MDAwMDA2LCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogcGZsZC5kICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwotCi17ICJmc3QubCIsCTB4MjgwMDAwMDIsIDB4ZDQwMDAwMDEsICJnLDEoMikiLCAwIH0sCS8qIGZzdC5sIGZkZXN0LGlzcmMxKGlzcmMyKSAqLwoteyAiZnN0LmwiLAkweDJjMDAwMDAyLCAweGQwMDAwMDAxLCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIGZzdC5sIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgImZzdC5sIiwJMHgyODAwMDAwMywgMHhkNDAwMDAwMCwgImcsMSgyKSsrIiwgMCB9LAkvKiBmc3QubCBmZGVzdCxpc3JjMShpc3JjMikrKyAqLwoteyAiZnN0LmwiLAkweDJjMDAwMDAzLCAweGQwMDAwMDAwLCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogZnN0LmwgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi17ICJmc3QuZCIsCTB4MjgwMDAwMDAsIDB4ZDQwMDAwMDcsICJnLDEoMikiLCAwIH0sCS8qIGZzdC5kIGZkZXN0LGlzcmMxKGlzcmMyKSAqLwoteyAiZnN0LmQiLAkweDJjMDAwMDAwLCAweGQwMDAwMDA3LCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIGZzdC5kIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgImZzdC5kIiwJMHgyODAwMDAwMSwgMHhkNDAwMDAwNiwgImcsMSgyKSsrIiwgMCB9LAkvKiBmc3QuZCBmZGVzdCxpc3JjMShpc3JjMikrKyAqLwoteyAiZnN0LmQiLAkweDJjMDAwMDAxLCAweGQwMDAwMDA2LCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogZnN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi0KLXsgInBzdC5kIiwJMHgzYzAwMDAwMCwgMHhjMDAwMDAwNywgImcsaSgyKSIsIEVfQUREUiB9LAkvKiBwc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpICovCi17ICJwc3QuZCIsCTB4M2MwMDAwMDEsIDB4YzAwMDAwMDYsICJnLGkoMikrKyIsIEVfQUREUiB9LAkvKiBwc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpKysgKi8KLQoteyAiYWRkdSIsCTB4ODAwMDAwMDAsIDB4N2MwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYWRkdSBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYWRkdSIsCTB4ODQwMDAwMDAsIDB4NzgwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIGFkZHUgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhZGRzIiwJMHg5MDAwMDAwMCwgMHg2YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhZGRzIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhZGRzIiwJMHg5NDAwMDAwMCwgMHg2ODAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogYWRkcyAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnUiLAkweDg4MDAwMDAwLCAweDc0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHN1YnUgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnUiLAkweDhjMDAwMDAwLCAweDcwMDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBzdWJ1ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic3VicyIsCTB4OTgwMDAwMDAsIDB4NjQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc3VicyBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic3VicyIsCTB4OWMwMDAwMDAsIDB4NjAwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIHN1YnMgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgInNobCIsCTB4YTAwMDAwMDAsIDB4NWMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hsIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaGwiLAkweGE0MDAwMDAwLCAweDU4MDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNobCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInNociIsCTB4YTgwMDAwMDAsIDB4NTQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hyIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaHIiLAkweGFjMDAwMDAwLCAweDUwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNociAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInNocmQiLAkweGIwMDAwMDAwLCAweDRjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNocmQgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNocmEiLAkweGI4MDAwMDAwLCAweDQ0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNocmEgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNocmEiLAkweGJjMDAwMDAwLCAweDQwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNocmEgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgIm1vdiIsCTB4YTAwMDAwMDAsIDB4NWMwMGY4MDAsICIyLGQiLCAwIH0sCS8qIHNobCByMCxpc3JjMixpZGVzdCAqLwoteyAibW92IiwJMHg5NDAwMDAwMCwgMHg2OWUwMDAwMCwgImksZCIsIEVfTU9WIH0sCS8qIGFkZHMgI2NvbnN0LHIwLGlkZXN0ICovCi17ICJub3AiLAkweGEwMDAwMDAwLCAweDVmZmZmODAwLCAiIiwgMCB9LAkvKiBzaGwgcjAscjAscjAgKi8KLXsgImZub3AiLAkweGIwMDAwMDAwLCAweDRmZmZmODAwLCAiIiwgMCB9LAkvKiBzaHJkIHIwLHIwLHIwICovCi0KLXsgInRyYXAiLAkweDQ0MDAwMDAwLCAweGI4MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHRyYXAgaXNyYzFuaSxpc3JjMixpZGVzdCAqLwotCi17ICJmbHVzaCIsCTB4MzQwMDAwMDAsIDB4YzgxZjAwMDEsICJpKDIpIiwgRV9BRERSIH0sCS8qIGZsdXNoICNjb25zdChpc3JjMikgKi8KLXsgImZsdXNoIiwJMHgzNDAwMDAwMSwgMHhjODFmMDAwMCwgImkoMikrKyIsIEVfQUREUiB9LAkvKiBmbHVzaCAjY29uc3QoaXNyYzIpKysgKi8KLQoteyAiYW5kIiwJMHhjMDAwMDAwMCwgMHgzYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmQgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZCIsCTB4YzQwMDAwMDAsIDB4MzgwMDAwMDAsICJpLDIsZCIsIEVfQU5EIH0sCS8qIGFuZCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFuZGgiLAkweGM4MDAwMDAwLCAweDM0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZGggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZGgiLAkweGNjMDAwMDAwLCAweDMwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIGFuZGggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3QiLAkweGQwMDAwMDAwLCAweDJjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZG5vdCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90IiwJMHhkNDAwMDAwMCwgMHgyODAwMDAwMCwgImksMixkIiwgRV9VMzIgfSwJLyogYW5kbm90ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90aCIsCTB4ZDgwMDAwMDAsIDB4MjQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kbm90aCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90aCIsCTB4ZGMwMDAwMDAsIDB4MjAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogYW5kbm90aCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgIm9yIiwJCTB4ZTAwMDAwMDAsIDB4MWMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogb3IgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgIm9yIiwJCTB4ZTQwMDAwMDAsIDB4MTgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIG9yICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAib3JoIiwJMHhlODAwMDAwMCwgMHgxNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBvcmggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgIm9yaCIsCTB4ZWMwMDAwMDAsIDB4MTAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogb3JoICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAieG9yIiwJMHhmMDAwMDAwMCwgMHgwYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiB4b3IgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInhvciIsCTB4ZjQwMDAwMDAsIDB4MDgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIHhvciAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInhvcmgiLAkweGY4MDAwMDAwLCAweDA0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHhvcmggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInhvcmgiLAkweGZjMDAwMDAwLCAweDAwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHhvcmggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgImJ0ZSIsCTB4NTgwMDAwMDAsIDB4YTQwMDAwMDAsICIxLDIscyIsIDAgfSwJLyogYnRlIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJ0ZSIsCTB4NWMwMDAwMDAsIDB4YTAwMDAwMDAsICI1LDIscyIsIDAgfSwJLyogYnRlICNjb25zdDUsaXNyYzIsc2Jyb2ZmICovCi17ICJidG5lIiwJMHg1MDAwMDAwMCwgMHhhYzAwMDAwMCwgIjEsMixzIiwgMCB9LAkvKiBidG5lIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJ0bmUiLAkweDU0MDAwMDAwLCAweGE4MDAwMDAwLCAiNSwyLHMiLCAwIH0sCS8qIGJ0bmUgI2NvbnN0NSxpc3JjMixzYnJvZmYgKi8KLXsgImJsYSIsCTB4YjQwMDAwMDAsIDB4NDgwMDAwMDAsICIxLDIscyIsIEVfREVMQVkgfSwJLyogYmxhIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJyaSIsCTB4NDAwMDAwMDAsIDB4YmMwMDAwMDAsICIxIiwgRV9ERUxBWSB9LAkvKiBicmkgaXNyYzFuaSAqLwotCi0vKiBDb3JlIEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgKi8KLXsgImxvY2siLAkweDRjMDAwMDAxLCAweGIwMDAwMDFlLCAiIiwgMCB9LAkvKiBsb2NrIHNldCBCTCBpbiBkaXJiYXNlICovCi17ICJjYWxsaSIsCTB4NGMwMDAwMDIsIDB4YjAwMDAwMWQsICIxIiwgRV9ERUxBWSB9LAkvKiBjYWxsaSBpc3JjMW5pICovCi17ICJpbnRvdnIiLAkweDRjMDAwMDA0LCAweGIwMDAwMDFiLCAiIiwgMCB9LAkvKiBpbnRvdnIgdHJhcCBvbiBpbnRlZ2VyIG92ZXJmbG93ICovCi17ICJ1bmxvY2siLAkweDRjMDAwMDA3LCAweGIwMDAwMDE4LCAiIiwgMCB9LAkvKiB1bmxvY2sgY2xlYXIgQkwgaW4gZGlyYmFzZSAqLwotCi0vKiBDVFJMLUZvcm1hdCBJbnN0cnVjdGlvbnMgKi8KLXsgImJyIiwJCTB4NjgwMDAwMDAsIDB4OTQwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBiciBsYnJvZmYgKi8KLXsgImNhbGwiLAkweDZjMDAwMDAwLCAweDkwMDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogY2FsbCBsYnJvZmYgKi8KLXsgImJjIiwJCTB4NzAwMDAwMDAsIDB4OGMwMDAwMDAsICJsIiwgMCB9LAkvKiBiYyBsYnJvZmYgKi8KLXsgImJjLnQiLAkweDc0MDAwMDAwLCAweDg4MDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogYmMudCBsYnJvZmYgKi8KLXsgImJuYyIsCTB4NzgwMDAwMDAsIDB4ODQwMDAwMDAsICJsIiwgMCB9LAkvKiBibmMgbGJyb2ZmICovCi17ICJibmMudCIsCTB4N2MwMDAwMDAsIDB4ODAwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBibmMudCBsYnJvZmYgKi8KLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmYW0ucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicjJwMS5zcyIsCTB4NDgwMDA0MDAsIDB4YjQwMDAzZmYsICJlLGYsZyIsIDAgfSwKLXsgInIycDEuc2QiLAkweDQ4MDAwNDgwLCAweGI0MDAwMzdmLCAiZSxmLGciLCAwIH0sCi17ICJyMnAxLmRkIiwJMHg0ODAwMDU4MCwgMHhiNDAwMDI3ZiwgImUsZixnIiwgMCB9LAoteyAicjJwdC5zcyIsCTB4NDgwMDA0MDEsIDB4YjQwMDAzZmUsICJlLGYsZyIsIDAgfSwKLXsgInIycHQuc2QiLAkweDQ4MDAwNDgxLCAweGI0MDAwMzdlLCAiZSxmLGciLCAwIH0sCi17ICJyMnB0LmRkIiwJMHg0ODAwMDU4MSwgMHhiNDAwMDI3ZSwgImUsZixnIiwgMCB9LAoteyAicjJhcDEuc3MiLAkweDQ4MDAwNDAyLCAweGI0MDAwM2ZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwMS5zZCIsCTB4NDgwMDA0ODIsIDB4YjQwMDAzN2QsICJlLGYsZyIsIDAgfSwKLXsgInIyYXAxLmRkIiwJMHg0ODAwMDU4MiwgMHhiNDAwMDI3ZCwgImUsZixnIiwgMCB9LAoteyAicjJhcHQuc3MiLAkweDQ4MDAwNDAzLCAweGI0MDAwM2ZjLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwdC5zZCIsCTB4NDgwMDA0ODMsIDB4YjQwMDAzN2MsICJlLGYsZyIsIDAgfSwKLXsgInIyYXB0LmRkIiwJMHg0ODAwMDU4MywgMHhiNDAwMDI3YywgImUsZixnIiwgMCB9LAoteyAiaTJwMS5zcyIsCTB4NDgwMDA0MDQsIDB4YjQwMDAzZmIsICJlLGYsZyIsIDAgfSwKLXsgImkycDEuc2QiLAkweDQ4MDAwNDg0LCAweGI0MDAwMzdiLCAiZSxmLGciLCAwIH0sCi17ICJpMnAxLmRkIiwJMHg0ODAwMDU4NCwgMHhiNDAwMDI3YiwgImUsZixnIiwgMCB9LAoteyAiaTJwdC5zcyIsCTB4NDgwMDA0MDUsIDB4YjQwMDAzZmEsICJlLGYsZyIsIDAgfSwKLXsgImkycHQuc2QiLAkweDQ4MDAwNDg1LCAweGI0MDAwMzdhLCAiZSxmLGciLCAwIH0sCi17ICJpMnB0LmRkIiwJMHg0ODAwMDU4NSwgMHhiNDAwMDI3YSwgImUsZixnIiwgMCB9LAoteyAiaTJhcDEuc3MiLAkweDQ4MDAwNDA2LCAweGI0MDAwM2Y5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwMS5zZCIsCTB4NDgwMDA0ODYsIDB4YjQwMDAzNzksICJlLGYsZyIsIDAgfSwKLXsgImkyYXAxLmRkIiwJMHg0ODAwMDU4NiwgMHhiNDAwMDI3OSwgImUsZixnIiwgMCB9LAoteyAiaTJhcHQuc3MiLAkweDQ4MDAwNDA3LCAweGI0MDAwM2Y4LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwdC5zZCIsCTB4NDgwMDA0ODcsIDB4YjQwMDAzNzgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXB0LmRkIiwJMHg0ODAwMDU4NywgMHhiNDAwMDI3OCwgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLnNzIiwJMHg0ODAwMDQwOCwgMHhiNDAwMDNmNywgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLnNkIiwJMHg0ODAwMDQ4OCwgMHhiNDAwMDM3NywgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLmRkIiwJMHg0ODAwMDU4OCwgMHhiNDAwMDI3NywgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLnNzIiwJMHg0ODAwMDQwOSwgMHhiNDAwMDNmNiwgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLnNkIiwJMHg0ODAwMDQ4OSwgMHhiNDAwMDM3NiwgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLmRkIiwJMHg0ODAwMDU4OSwgMHhiNDAwMDI3NiwgImUsZixnIiwgMCB9LAoteyAicmExcDIuc3MiLAkweDQ4MDAwNDBhLCAweGI0MDAwM2Y1LCAiZSxmLGciLCAwIH0sCi17ICJyYTFwMi5zZCIsCTB4NDgwMDA0OGEsIDB4YjQwMDAzNzUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXAyLmRkIiwJMHg0ODAwMDU4YSwgMHhiNDAwMDI3NSwgImUsZixnIiwgMCB9LAoteyAibTEydHRwYS5zcyIsCTB4NDgwMDA0MGIsIDB4YjQwMDAzZjQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0cGEuc2QiLAkweDQ4MDAwNDhiLCAweGI0MDAwMzc0LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHBhLmRkIiwJMHg0ODAwMDU4YiwgMHhiNDAwMDI3NCwgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLnNzIiwJMHg0ODAwMDQwYywgMHhiNDAwMDNmMywgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLnNkIiwJMHg0ODAwMDQ4YywgMHhiNDAwMDM3MywgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLmRkIiwJMHg0ODAwMDU4YywgMHhiNDAwMDI3MywgImUsZixnIiwgMCB9LAoteyAibTEydHBtLnNzIiwJMHg0ODAwMDQwZCwgMHhiNDAwMDNmMiwgImUsZixnIiwgMCB9LAoteyAibTEydHBtLnNkIiwJMHg0ODAwMDQ4ZCwgMHhiNDAwMDM3MiwgImUsZixnIiwgMCB9LAoteyAibTEydHBtLmRkIiwJMHg0ODAwMDU4ZCwgMHhiNDAwMDI3MiwgImUsZixnIiwgMCB9LAoteyAiaWExcDIuc3MiLAkweDQ4MDAwNDBlLCAweGI0MDAwM2YxLCAiZSxmLGciLCAwIH0sCi17ICJpYTFwMi5zZCIsCTB4NDgwMDA0OGUsIDB4YjQwMDAzNzEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXAyLmRkIiwJMHg0ODAwMDU4ZSwgMHhiNDAwMDI3MSwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLnNzIiwJMHg0ODAwMDQwZiwgMHhiNDAwMDNmMCwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLnNkIiwJMHg0ODAwMDQ4ZiwgMHhiNDAwMDM3MCwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLmRkIiwJMHg0ODAwMDU4ZiwgMHhiNDAwMDI3MCwgImUsZixnIiwgMCB9LAotCi0vKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZzbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJyMnMxLnNzIiwJMHg0ODAwMDQxMCwgMHhiNDAwMDNlZiwgImUsZixnIiwgMCB9LAoteyAicjJzMS5zZCIsCTB4NDgwMDA0OTAsIDB4YjQwMDAzNmYsICJlLGYsZyIsIDAgfSwKLXsgInIyczEuZGQiLAkweDQ4MDAwNTkwLCAweGI0MDAwMjZmLCAiZSxmLGciLCAwIH0sCi17ICJyMnN0LnNzIiwJMHg0ODAwMDQxMSwgMHhiNDAwMDNlZSwgImUsZixnIiwgMCB9LAoteyAicjJzdC5zZCIsCTB4NDgwMDA0OTEsIDB4YjQwMDAzNmUsICJlLGYsZyIsIDAgfSwKLXsgInIyc3QuZGQiLAkweDQ4MDAwNTkxLCAweGI0MDAwMjZlLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzMS5zcyIsCTB4NDgwMDA0MTIsIDB4YjQwMDAzZWQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXMxLnNkIiwJMHg0ODAwMDQ5MiwgMHhiNDAwMDM2ZCwgImUsZixnIiwgMCB9LAoteyAicjJhczEuZGQiLAkweDQ4MDAwNTkyLCAweGI0MDAwMjZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzdC5zcyIsCTB4NDgwMDA0MTMsIDB4YjQwMDAzZWMsICJlLGYsZyIsIDAgfSwKLXsgInIyYXN0LnNkIiwJMHg0ODAwMDQ5MywgMHhiNDAwMDM2YywgImUsZixnIiwgMCB9LAoteyAicjJhc3QuZGQiLAkweDQ4MDAwNTkzLCAweGI0MDAwMjZjLCAiZSxmLGciLCAwIH0sCi17ICJpMnMxLnNzIiwJMHg0ODAwMDQxNCwgMHhiNDAwMDNlYiwgImUsZixnIiwgMCB9LAoteyAiaTJzMS5zZCIsCTB4NDgwMDA0OTQsIDB4YjQwMDAzNmIsICJlLGYsZyIsIDAgfSwKLXsgImkyczEuZGQiLAkweDQ4MDAwNTk0LCAweGI0MDAwMjZiLCAiZSxmLGciLCAwIH0sCi17ICJpMnN0LnNzIiwJMHg0ODAwMDQxNSwgMHhiNDAwMDNlYSwgImUsZixnIiwgMCB9LAoteyAiaTJzdC5zZCIsCTB4NDgwMDA0OTUsIDB4YjQwMDAzNmEsICJlLGYsZyIsIDAgfSwKLXsgImkyc3QuZGQiLAkweDQ4MDAwNTk1LCAweGI0MDAwMjZhLCAiZSxmLGciLCAwIH0sCi17ICJpMmFzMS5zcyIsCTB4NDgwMDA0MTYsIDB4YjQwMDAzZTksICJlLGYsZyIsIDAgfSwKLXsgImkyYXMxLnNkIiwJMHg0ODAwMDQ5NiwgMHhiNDAwMDM2OSwgImUsZixnIiwgMCB9LAoteyAiaTJhczEuZGQiLAkweDQ4MDAwNTk2LCAweGI0MDAwMjY5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzdC5zcyIsCTB4NDgwMDA0MTcsIDB4YjQwMDAzZTgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXN0LnNkIiwJMHg0ODAwMDQ5NywgMHhiNDAwMDM2OCwgImUsZixnIiwgMCB9LAoteyAiaTJhc3QuZGQiLAkweDQ4MDAwNTk3LCAweGI0MDAwMjY4LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuc3MiLAkweDQ4MDAwNDE4LCAweGI0MDAwM2U3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuc2QiLAkweDQ4MDAwNDk4LCAweGI0MDAwMzY3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuZGQiLAkweDQ4MDAwNTk4LCAweGI0MDAwMjY3LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uc3MiLAkweDQ4MDAwNDE5LCAweGI0MDAwM2U2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uc2QiLAkweDQ4MDAwNDk5LCAweGI0MDAwMzY2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uZGQiLAkweDQ4MDAwNTk5LCAweGI0MDAwMjY2LCAiZSxmLGciLCAwIH0sCi17ICJyYTFzMi5zcyIsCTB4NDgwMDA0MWEsIDB4YjQwMDAzZTUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXMyLnNkIiwJMHg0ODAwMDQ5YSwgMHhiNDAwMDM2NSwgImUsZixnIiwgMCB9LAoteyAicmExczIuZGQiLAkweDQ4MDAwNTlhLCAweGI0MDAwMjY1LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHNhLnNzIiwJMHg0ODAwMDQxYiwgMHhiNDAwMDNlNCwgImUsZixnIiwgMCB9LAoteyAibTEydHRzYS5zZCIsCTB4NDgwMDA0OWIsIDB4YjQwMDAzNjQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0c2EuZGQiLAkweDQ4MDAwNTliLCAweGI0MDAwMjY0LCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuc3MiLAkweDQ4MDAwNDFjLCAweGI0MDAwM2UzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuc2QiLAkweDQ4MDAwNDljLCAweGI0MDAwMzYzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuZGQiLAkweDQ4MDAwNTljLCAweGI0MDAwMjYzLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uc3MiLAkweDQ4MDAwNDFkLCAweGI0MDAwM2UyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uc2QiLAkweDQ4MDAwNDlkLCAweGI0MDAwMzYyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uZGQiLAkweDQ4MDAwNTlkLCAweGI0MDAwMjYyLCAiZSxmLGciLCAwIH0sCi17ICJpYTFzMi5zcyIsCTB4NDgwMDA0MWUsIDB4YjQwMDAzZTEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXMyLnNkIiwJMHg0ODAwMDQ5ZSwgMHhiNDAwMDM2MSwgImUsZixnIiwgMCB9LAoteyAiaWExczIuZGQiLAkweDQ4MDAwNTllLCAweGI0MDAwMjYxLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2Euc3MiLAkweDQ4MDAwNDFmLCAweGI0MDAwM2UwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2Euc2QiLAkweDQ4MDAwNDlmLCAweGI0MDAwMzYwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2EuZGQiLAkweDQ4MDAwNTlmLCAweGI0MDAwMjYwLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZm1hbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJtcjJwMS5zcyIsCTB4NDgwMDAwMDAsIDB4YjQwMDA3ZmYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnAxLnNkIiwJMHg0ODAwMDA4MCwgMHhiNDAwMDc3ZiwgImUsZixnIiwgMCB9LAoteyAibXIycDEuZGQiLAkweDQ4MDAwMTgwLCAweGI0MDAwNjdmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwdC5zcyIsCTB4NDgwMDAwMDEsIDB4YjQwMDA3ZmUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnB0LnNkIiwJMHg0ODAwMDA4MSwgMHhiNDAwMDc3ZSwgImUsZixnIiwgMCB9LAoteyAibXIycHQuZGQiLAkweDQ4MDAwMTgxLCAweGI0MDAwNjdlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuc3MiLAkweDQ4MDAwMDAyLCAweGI0MDAwN2ZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuc2QiLAkweDQ4MDAwMDgyLCAweGI0MDAwNzdkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuZGQiLAkweDQ4MDAwMTgyLCAweGI0MDAwNjdkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuc3MiLAkweDQ4MDAwMDAzLCAweGI0MDAwN2ZjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuc2QiLAkweDQ4MDAwMDgzLCAweGI0MDAwNzdjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuZGQiLAkweDQ4MDAwMTgzLCAweGI0MDAwNjdjLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwMS5zcyIsCTB4NDgwMDAwMDQsIDB4YjQwMDA3ZmIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnAxLnNkIiwJMHg0ODAwMDA4NCwgMHhiNDAwMDc3YiwgImUsZixnIiwgMCB9LAoteyAibWkycDEuZGQiLAkweDQ4MDAwMTg0LCAweGI0MDAwNjdiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwdC5zcyIsCTB4NDgwMDAwMDUsIDB4YjQwMDA3ZmEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnB0LnNkIiwJMHg0ODAwMDA4NSwgMHhiNDAwMDc3YSwgImUsZixnIiwgMCB9LAoteyAibWkycHQuZGQiLAkweDQ4MDAwMTg1LCAweGI0MDAwNjdhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuc3MiLAkweDQ4MDAwMDA2LCAweGI0MDAwN2Y5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuc2QiLAkweDQ4MDAwMDg2LCAweGI0MDAwNzc5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuZGQiLAkweDQ4MDAwMTg2LCAweGI0MDAwNjc5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuc3MiLAkweDQ4MDAwMDA3LCAweGI0MDAwN2Y4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuc2QiLAkweDQ4MDAwMDg3LCAweGI0MDAwNzc4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuZGQiLAkweDQ4MDAwMTg3LCAweGI0MDAwNjc4LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXAyLnNzIiwJMHg0ODAwMDAwOCwgMHhiNDAwMDdmNywgImUsZixnIiwgMCB9LAoteyAibXJtdDFwMi5zZCIsCTB4NDgwMDAwODgsIDB4YjQwMDA3NzcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxcDIuZGQiLAkweDQ4MDAwMTg4LCAweGI0MDAwNjc3LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXBtLnNzIiwJMHg0ODAwMDAwOSwgMHhiNDAwMDdmNiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1wbS5zZCIsCTB4NDgwMDAwODksIDB4YjQwMDA3NzYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtcG0uZGQiLAkweDQ4MDAwMTg5LCAweGI0MDAwNjc2LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuc3MiLAkweDQ4MDAwMDBhLCAweGI0MDAwN2Y1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuc2QiLAkweDQ4MDAwMDhhLCAweGI0MDAwNzc1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuZGQiLAkweDQ4MDAwMThhLCAweGI0MDAwNjc1LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRwbS5zcyIsMHg0ODAwMDAwYiwgMHhiNDAwMDdmNCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0cG0uc2QiLDB4NDgwMDAwOGIsIDB4YjQwMDA3NzQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHBtLmRkIiwweDQ4MDAwMThiLCAweGI0MDAwNjc0LCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXAyLnNzIiwJMHg0ODAwMDAwYywgMHhiNDAwMDdmMywgImUsZixnIiwgMCB9LAoteyAibWltdDFwMi5zZCIsCTB4NDgwMDAwOGMsIDB4YjQwMDA3NzMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxcDIuZGQiLAkweDQ4MDAwMThjLCAweGI0MDAwNjczLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHBtLnNzIiwJMHg0ODAwMDAwZCwgMHhiNDAwMDdmMiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRwbS5zZCIsCTB4NDgwMDAwOGQsIDB4YjQwMDA3NzIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0cG0uZGQiLAkweDQ4MDAwMThkLCAweGI0MDAwNjcyLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuc3MiLAkweDQ4MDAwMDBlLCAweGI0MDAwN2YxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuc2QiLAkweDQ4MDAwMDhlLCAweGI0MDAwNzcxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuZGQiLAkweDQ4MDAwMThlLCAweGI0MDAwNjcxLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZm1zbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJtcjJzMS5zcyIsCTB4NDgwMDAwMTAsIDB4YjQwMDA3ZWYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnMxLnNkIiwJMHg0ODAwMDA5MCwgMHhiNDAwMDc2ZiwgImUsZixnIiwgMCB9LAoteyAibXIyczEuZGQiLAkweDQ4MDAwMTkwLCAweGI0MDAwNjZmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzdC5zcyIsCTB4NDgwMDAwMTEsIDB4YjQwMDA3ZWUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnN0LnNkIiwJMHg0ODAwMDA5MSwgMHhiNDAwMDc2ZSwgImUsZixnIiwgMCB9LAoteyAibXIyc3QuZGQiLAkweDQ4MDAwMTkxLCAweGI0MDAwNjZlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuc3MiLAkweDQ4MDAwMDEyLCAweGI0MDAwN2VkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuc2QiLAkweDQ4MDAwMDkyLCAweGI0MDAwNzZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuZGQiLAkweDQ4MDAwMTkyLCAweGI0MDAwNjZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3Quc3MiLAkweDQ4MDAwMDEzLCAweGI0MDAwN2VjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3Quc2QiLAkweDQ4MDAwMDkzLCAweGI0MDAwNzZjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3QuZGQiLAkweDQ4MDAwMTkzLCAweGI0MDAwNjZjLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzMS5zcyIsCTB4NDgwMDAwMTQsIDB4YjQwMDA3ZWIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnMxLnNkIiwJMHg0ODAwMDA5NCwgMHhiNDAwMDc2YiwgImUsZixnIiwgMCB9LAoteyAibWkyczEuZGQiLAkweDQ4MDAwMTk0LCAweGI0MDAwNjZiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzdC5zcyIsCTB4NDgwMDAwMTUsIDB4YjQwMDA3ZWEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnN0LnNkIiwJMHg0ODAwMDA5NSwgMHhiNDAwMDc2YSwgImUsZixnIiwgMCB9LAoteyAibWkyc3QuZGQiLAkweDQ4MDAwMTk1LCAweGI0MDAwNjZhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuc3MiLAkweDQ4MDAwMDE2LCAweGI0MDAwN2U5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuc2QiLAkweDQ4MDAwMDk2LCAweGI0MDAwNzY5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuZGQiLAkweDQ4MDAwMTk2LCAweGI0MDAwNjY5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3Quc3MiLAkweDQ4MDAwMDE3LCAweGI0MDAwN2U4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3Quc2QiLAkweDQ4MDAwMDk3LCAweGI0MDAwNzY4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3QuZGQiLAkweDQ4MDAwMTk3LCAweGI0MDAwNjY4LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXMyLnNzIiwJMHg0ODAwMDAxOCwgMHhiNDAwMDdlNywgImUsZixnIiwgMCB9LAoteyAibXJtdDFzMi5zZCIsCTB4NDgwMDAwOTgsIDB4YjQwMDA3NjcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxczIuZGQiLAkweDQ4MDAwMTk4LCAweGI0MDAwNjY3LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXNtLnNzIiwJMHg0ODAwMDAxOSwgMHhiNDAwMDdlNiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1zbS5zZCIsCTB4NDgwMDAwOTksIDB4YjQwMDA3NjYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtc20uZGQiLAkweDQ4MDAwMTk5LCAweGI0MDAwNjY2LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuc3MiLAkweDQ4MDAwMDFhLCAweGI0MDAwN2U1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuc2QiLAkweDQ4MDAwMDlhLCAweGI0MDAwNzY1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuZGQiLAkweDQ4MDAwMTlhLCAweGI0MDAwNjY1LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRzbS5zcyIsMHg0ODAwMDAxYiwgMHhiNDAwMDdlNCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0c20uc2QiLDB4NDgwMDAwOWIsIDB4YjQwMDA3NjQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHNtLmRkIiwweDQ4MDAwMTliLCAweGI0MDAwNjY0LCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXMyLnNzIiwJMHg0ODAwMDAxYywgMHhiNDAwMDdlMywgImUsZixnIiwgMCB9LAoteyAibWltdDFzMi5zZCIsCTB4NDgwMDAwOWMsIDB4YjQwMDA3NjMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxczIuZGQiLAkweDQ4MDAwMTljLCAweGI0MDAwNjYzLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHNtLnNzIiwJMHg0ODAwMDAxZCwgMHhiNDAwMDdlMiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRzbS5zZCIsCTB4NDgwMDAwOWQsIDB4YjQwMDA3NjIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0c20uZGQiLAkweDQ4MDAwMTlkLCAweGI0MDAwNjYyLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuc3MiLAkweDQ4MDAwMDFlLCAweGI0MDAwN2UxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuc2QiLAkweDQ4MDAwMDllLCAweGI0MDAwNzYxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuZGQiLAkweDQ4MDAwMTllLCAweGI0MDAwNjYxLCAiZSxmLGciLCAwIH0sCi0KLQoteyAiZm11bC5zcyIsCTB4NDgwMDAwMjAsIDB4YjQwMDA3ZGYsICJlLGYsZyIsIDAgfSwJLyogZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmbXVsLnNkIiwJMHg0ODAwMDBhMCwgMHhiNDAwMDc1ZiwgImUsZixnIiwgMCB9LAkvKiBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZtdWwuZGQiLAkweDQ4MDAwMWEwLCAweGI0MDAwNjVmLCAiZSxmLGciLCAwIH0sCS8qIGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwuc3MiLAkweDQ4MDAwNDIwLCAweGI0MDAwM2RmLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbXVsLnNkIiwJMHg0ODAwMDRhMCwgMHhiNDAwMDM1ZiwgImUsZixnIiwgMCB9LAkvKiBwZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bC5kZCIsCTB4NDgwMDA1YTAsIDB4YjQwMDAyNWYsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwzLmRkIiwJMHg0ODAwMDVhNCwgMHhiNDAwMDI1YiwgImUsZixnIiwgMCB9LAkvKiBwZm11bDMucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm1sb3cuZGQiLAkweDQ4MDAwMWExLCAweGI0MDAwNjVlLCAiZSxmLGciLCAwIH0sCS8qIGZtbG93LmRkIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLnNzIiwJMHg0ODAwMDAyMiwgMHhiNDAwMDdkZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLnNkIiwJMHg0ODAwMDBhMiwgMHhiNDAwMDc1ZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLmRkIiwJMHg0ODAwMDFhMiwgMHhiNDAwMDY1ZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcnNxci5zcyIsCTB4NDgwMDAwMjMsIDB4YjQwMDA3ZGMsICJmLGciLCAwIH0sCS8qIGZyc3FyLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyc3FyLnNkIiwJMHg0ODAwMDBhMywgMHhiNDAwMDc1YywgImYsZyIsIDAgfSwJLyogZnJzcXIucCBmc3JjMixmZGVzdCAqLwoteyAiZnJzcXIuZGQiLAkweDQ4MDAwMWEzLCAweGI0MDAwNjVjLCAiZixnIiwgMCB9LAkvKiBmcnNxci5wIGZzcmMyLGZkZXN0ICovCi17ICJmYWRkLnNzIiwJMHg0ODAwMDAzMCwgMHhiNDAwMDdjZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGQuc2QiLAkweDQ4MDAwMGIwLCAweGI0MDAwNzRmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZC5kZCIsCTB4NDgwMDAxYjAsIDB4YjQwMDA2NGYsICJlLGYsZyIsIDAgfSwJLyogZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZC5zcyIsCTB4NDgwMDA0MzAsIDB4YjQwMDAzY2YsICJlLGYsZyIsIDAgfSwJLyogcGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGQuc2QiLAkweDQ4MDAwNGIwLCAweGI0MDAwMzRmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkLmRkIiwJMHg0ODAwMDViMCwgMHhiNDAwMDI0ZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmc3ViLnNzIiwJMHg0ODAwMDAzMSwgMHhiNDAwMDdjZSwgImUsZixnIiwgMCB9LAkvKiBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZzdWIuc2QiLAkweDQ4MDAwMGIxLCAweGI0MDAwNzRlLCAiZSxmLGciLCAwIH0sCS8qIGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnN1Yi5kZCIsCTB4NDgwMDAxYjEsIDB4YjQwMDA2NGUsICJlLGYsZyIsIDAgfSwJLyogZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnN1Yi5zcyIsCTB4NDgwMDA0MzEsIDB4YjQwMDAzY2UsICJlLGYsZyIsIDAgfSwJLyogcGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZzdWIuc2QiLAkweDQ4MDAwNGIxLCAweGI0MDAwMzRlLCAiZSxmLGciLCAwIH0sCS8qIHBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmc3ViLmRkIiwJMHg0ODAwMDViMSwgMHhiNDAwMDI0ZSwgImUsZixnIiwgMCB9LAkvKiBwZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaXguc3MiLAkweDQ4MDAwMDMyLCAweGI0MDAwN2NkLCAiZSxnIiwgMCB9LAkvKiBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAiZml4LnNkIiwJMHg0ODAwMDBiMiwgMHhiNDAwMDc0ZCwgImUsZyIsIDAgfSwJLyogZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZpeC5kZCIsCTB4NDgwMDAxYjIsIDB4YjQwMDA2NGQsICJlLGciLCAwIH0sCS8qIGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LnNzIiwJMHg0ODAwMDQzMiwgMHhiNDAwMDNjZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LnNkIiwJMHg0ODAwMDRiMiwgMHhiNDAwMDM0ZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LmRkIiwJMHg0ODAwMDViMiwgMHhiNDAwMDI0ZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5zcyIsCTB4NDgwMDAwMzMsIDB4YjQwMDA3Y2MsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LmRzIiwJMHg0ODAwMDEzMywgMHhiNDAwMDZjYywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAiZmFtb3Yuc2QiLAkweDQ4MDAwMGIzLCAweGI0MDAwNzRjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5kZCIsCTB4NDgwMDAxYjMsIDB4YjQwMDA2NGMsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5zcyIsCTB4NDgwMDA0MzMsIDB4YjQwMDAzY2MsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJwZmFtb3YuZHMiLAkweDQ4MDAwNTMzLCAweGI0MDAwMmNjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LnNkIiwJMHg0ODAwMDRiMywgMHhiNDAwMDM0YywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5kZCIsCTB4NDgwMDA1YjMsIDB4YjQwMDAyNGMsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi0vKiBwZmd0IGhhcyBSIGJpdCBjbGVhcmVkOyBwZmxlIGhhcyBSIGJpdCBzZXQgKi8KLXsgInBmZ3Quc3MiLAkweDQ4MDAwNDM0LCAweGI0MDAwM2NiLCAiZSxmLGciLCAwIH0sCS8qIHBmZ3QucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZndC5zZCIsCTB4NDgwMDA0MzQsIDB4YjQwMDAzY2IsICJlLGYsZyIsIDAgfSwJLyogcGZndC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmd0LmRkIiwJMHg0ODAwMDUzNCwgMHhiNDAwMDJjYiwgImUsZixnIiwgMCB9LAkvKiBwZmd0LnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLS8qIHBmZ3QgaGFzIFIgYml0IGNsZWFyZWQ7IHBmbGUgaGFzIFIgYml0IHNldCAqLwoteyAicGZsZS5zcyIsCTB4NDgwMDA0YjQsIDB4YjQwMDAzNGIsICJlLGYsZyIsIDAgfSwJLyogcGZsZS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmxlLnNkIiwJMHg0ODAwMDRiNCwgMHhiNDAwMDM0YiwgImUsZixnIiwgMCB9LAkvKiBwZmxlLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbGUuZGQiLAkweDQ4MDAwNWI0LCAweGI0MDAwMjRiLCAiZSxmLGciLCAwIH0sCS8qIHBmbGUucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnRydW5jLnNzIiwJMHg0ODAwMDAzYSwgMHhiNDAwMDdjNSwgImUsZyIsIDAgfSwJLyogZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgImZ0cnVuYy5zZCIsCTB4NDgwMDAwYmEsIDB4YjQwMDA3NDUsICJlLGciLCAwIH0sCS8qIGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJmdHJ1bmMuZGQiLAkweDQ4MDAwMWJhLCAweGI0MDAwNjQ1LCAiZSxnIiwgMCB9LAkvKiBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5zcyIsCTB4NDgwMDA0M2EsIDB4YjQwMDAzYzUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5zZCIsCTB4NDgwMDA0YmEsIDB4YjQwMDAzNDUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5kZCIsCTB4NDgwMDA1YmEsIDB4YjQwMDAyNDUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAiZnhmciIsCTB4NDgwMDAwNDAsIDB4YjQwMDA3YmYsICJlLGQiLCAwIH0sCS8qIGZ4ZnIgZnNyYzEsaWRlc3QgKi8KLXsgImZpYWRkLnNzIiwJMHg0ODAwMDA0OSwgMHhiNDAwMDdiNiwgImUsZixnIiwgMCB9LAkvKiBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaWFkZC5kZCIsCTB4NDgwMDAxYzksIDB4YjQwMDA2MzYsICJlLGYsZyIsIDAgfSwJLyogZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpYWRkLnNzIiwJMHg0ODAwMDQ0OSwgMHhiNDAwMDNiNiwgImUsZixnIiwgMCB9LAkvKiBwZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpYWRkLmRkIiwJMHg0ODAwMDVjOSwgMHhiNDAwMDIzNiwgImUsZixnIiwgMCB9LAkvKiBwZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmlzdWIuc3MiLAkweDQ4MDAwMDRkLCAweGI0MDAwN2IyLCAiZSxmLGciLCAwIH0sCS8qIGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpc3ViLmRkIiwJMHg0ODAwMDFjZCwgMHhiNDAwMDYzMiwgImUsZixnIiwgMCB9LAkvKiBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlzdWIuc3MiLAkweDQ4MDAwNDRkLCAweGI0MDAwM2IyLCAiZSxmLGciLCAwIH0sCS8qIHBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlzdWIuZGQiLAkweDQ4MDAwNWNkLCAweGI0MDAwMjMyLCAiZSxmLGciLCAwIH0sCS8qIHBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmemNoa2wiLAkweDQ4MDAwMDU3LCAweGI0MDAwN2E4LCAiZSxmLGciLCAwIH0sCS8qIGZ6Y2hrbCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZ6Y2hrbCIsCTB4NDgwMDA0NTcsIDB4YjQwMDAzYTgsICJlLGYsZyIsIDAgfSwJLyogcGZ6Y2hrbCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnpjaGtzIiwJMHg0ODAwMDA1ZiwgMHhiNDAwMDdhMCwgImUsZixnIiwgMCB9LAkvKiBmemNoa3MgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmemNoa3MiLAkweDQ4MDAwNDVmLCAweGI0MDAwM2EwLCAiZSxmLGciLCAwIH0sCS8qIHBmemNoa3MgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGRwIiwJMHg0ODAwMDA1MCwgMHhiNDAwMDdhZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkcCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGRwIiwJMHg0ODAwMDQ1MCwgMHhiNDAwMDNhZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZHAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGR6IiwJMHg0ODAwMDA1MSwgMHhiNDAwMDdhZSwgImUsZixnIiwgMCB9LAkvKiBmYWRkeiBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGR6IiwJMHg0ODAwMDQ1MSwgMHhiNDAwMDNhZSwgImUsZixnIiwgMCB9LAkvKiBwZmFkZHogZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZvcm0iLAkweDQ4MDAwMDVhLCAweGI0MDAwN2E1LCAiZSxnIiwgMCB9LAkvKiBmb3JtIGZzcmMxLGZkZXN0ICovCi17ICJwZm9ybSIsCTB4NDgwMDA0NWEsIDB4YjQwMDAzYTUsICJlLGciLCAwIH0sCS8qIHBmb3JtIGZzcmMxLGZkZXN0ICovCi0KLS8qIEZsb2F0aW5nIHBvaW50IHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLXsgImZtb3Yuc3MiLAkweDQ4MDAwMDQ5LCAweGI3ZTAwN2I2LCAiZSxnIiwgMCB9LAkvKiBmaWFkZC5zcyBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5kZCIsCTB4NDgwMDAxYzksIDB4YjdlMDA2MzYsICJlLGciLCAwIH0sCS8qIGZpYWRkLmRkIGZzcmMxLGYwLGZkZXN0ICovCi17ICJmbW92LnNkIiwJMHg0ODAwMDBiMCwgMHhiN2UwMDc0ZiwgImUsZyIsIDAgfSwJLyogZmFkZC5zZCBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5kcyIsCTB4NDgwMDAxMzAsIDB4YjdlMDA2Y2YsICJlLGciLCAwIH0sCS8qIGZhZGQuZHMgZnNyYzEsZjAsZmRlc3QgKi8KLXsgInBmbW92LmRzIiwJMHg0ODAwMDUzMCwgMHhiNzMwMDJjZiwgImUsZyIsIDAgfSwJLyogcGZhZGQuZHMgZnNyYzEsZjAsZmRlc3QgKi8KLXsgInBmbW92LmRkIiwJMHg0ODAwMDVjOSwgMHhiN2UwMDIzNiwgImUsZyIsIDAgfSwJLyogcGZpYWRkLmRkIGZzcmMxLGYwLGZkZXN0ICovCi0KLQotfTsKLQotI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIGk4NjBfb3Bjb2RlcykvKHNpemVvZiBpODYwX29wY29kZXNbMF0pKQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaCBiL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyZmMzMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyogQmFzaWMgODA5NjAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLSAqCi0gKiBUaGUgJ0NPSicgaW5zdHJ1Y3Rpb25zIGFyZSBhY3R1YWxseSBDT0JSIGluc3RydWN0aW9ucyB3aXRoIHRoZSAnYicgaW4KLSAqIHRoZSBtbmVtb25pYyByZXBsYWNlZCBieSBhICdqJzsgIHRoZXkgYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpZiBuZWNlc3Nhcnk6Ci0gKiBpZiB0aGUgZGlzcGxhY2VtZW50IHdpbGwgbm90IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgcmVwbGFjZSB0aGVtCi0gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0gKgotICogQWxsIG9mIHRoZSAnTUVNbicgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgc2FtZSBmb3JtYXQ7IHRoZSAnbicgaW4gdGhlIG5hbWUKLSAqIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbmRleCBzY2FsZSBmYWN0b3IgKHRoZSBzaXplIG9mIHRoZSBkYXR1bSBvcGVyYXRlZCBvbikuCi0gKgotICogVGhlIEZCUkEgZm9ybWF0cyBhcmUgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIFRoZXkgYXJlIHRoZQotICogImNvbnZlbmllbmNlIGRpcmVjdGl2ZXMiIGZvciBicmFuY2hpbmcgb24gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMsCi0gKiBlYWNoIG9mIHdoaWNoIGdlbmVyYXRlcyAyIGluc3RydWN0aW9ucyAoYSAnYm5vJyBhbmQgb25lIG90aGVyIGJyYW5jaCkuCi0gKgotICogVGhlIENBTExKIGZvcm1hdCBpcyBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgSXQgaW5kaWNhdGVzIHRoYXQKLSAqIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgKGEgQ1RSTC1mb3JtYXQgJ2NhbGwnKSBzaG91bGQgaGF2ZSBpdHMgcmVsb2NhdGlvbgotICogc3BlY2lhbGx5IGZsYWdnZWQgZm9yIGxpbmstdGltZSByZXBsYWNlbWVudCB3aXRoIGEgJ2JhbCcgb3IgJ2NhbGxzJyBpZgotICogYXBwcm9wcmlhdGUuCi0gKi8gCi0KLSNkZWZpbmUgQ1RSTAkwCi0jZGVmaW5lIENPQlIJMQotI2RlZmluZSBDT0oJMgotI2RlZmluZSBSRUcJMwotI2RlZmluZSBNRU0xCTQKLSNkZWZpbmUgTUVNMgk1Ci0jZGVmaW5lIE1FTTQJNgotI2RlZmluZSBNRU04CTcKLSNkZWZpbmUgTUVNMTIJOAotI2RlZmluZSBNRU0xNgk5Ci0jZGVmaW5lIEZCUkEJMTAKLSNkZWZpbmUgQ0FMTEoJMTEKLQotLyogTWFza3MgZm9yIHRoZSBtb2RlIGJpdHMgaW4gUkVHIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTTEJCTB4MDgwMAotI2RlZmluZSBNMgkJMHgxMDAwCi0jZGVmaW5lIE0zCQkweDIwMDAKLQotLyogR2VuZXJhdGUgdGhlIDEyLWJpdCBvcGNvZGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbiBieSBwbGFjaW5nIHRoZSAKLSAqIGhpZ2ggOCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMgMjQtMzEsIHRoZSBsb3cgNCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMKLSAqIDctMTAuCi0gKi8KLQotI2RlZmluZSBSRUdfT1BDKG9wYykJKChvcGMgJiAweGZmMCkgPDwgMjApIHwgKChvcGMgJiAweGYpIDw8IDcpCi0KLS8qIEdlbmVyYXRlIGEgdGVtcGxhdGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbjogIHBsYWNlIHRoZSBvcGNvZGUgYml0cwotICogaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBhbmQgT1IgaW4gbW9kZSBiaXRzIGZvciB0aGUgb3BlcmFuZHMgdGhhdCB3aWxsIG5vdAotICogYmUgdXNlZC4gIEkuZS4sCi0gKgkJc2V0IG0xPTEsIGlmIHNyYzEgd2lsbCBub3QgYmUgdXNlZAotICoJCXNldCBtMj0xLCBpZiBzcmMyIHdpbGwgbm90IGJlIHVzZWQKLSAqCQlzZXQgbTM9MSwgaWYgZHN0ICB3aWxsIG5vdCBiZSB1c2VkCi0gKgotICogU2V0dGluZyB0aGUgInVudXNlZCIgbW9kZSBiaXRzIHRvIDEgc3BlZWRzIHVwIGluc3RydWN0aW9uIGV4ZWN1dGlvbighKS4KLSAqIFRoZSBpbmZvcm1hdGlvbiBpcyBhbHNvIHVzZWZ1bCB0byB1cyBiZWNhdXNlIHNvbWUgMS1vcGVyYW5kIFJFRyBpbnN0cnVjdGlvbnMKLSAqIHVzZSB0aGUgc3JjMSBmaWVsZCwgb3RoZXJzIHRoZSBkc3QgZmllbGQ7IGFuZCBzb21lIDItb3BlcmFuZCBSRUcgaW5zdHJ1Y3Rpb25zCi0gKiB1c2Ugc3JjMS9zcmMyLCBvdGhlcnMgc3JjMS9kc3QuICBUaGUgc2V0IG1vZGUgYml0cyBlbmFibGUgdXMgdG8gZGlzdGluZ3Vpc2guCi0gKi8KLSNkZWZpbmUgUl8wKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMSB8IE0yIHwgTTMgKQkvKiBObyBvcGVyYW5kcyAgICAgICovCi0jZGVmaW5lIFJfMShvcGMpCSggUkVHX09QQyhvcGMpIHwgTTIgfCBNMyApCS8qIDEgb3BlcmFuZDogc3JjMSAgKi8KLSNkZWZpbmUgUl8xRChvcGMpCSggUkVHX09QQyhvcGMpIHwgTTEgfCBNMiApCS8qIDEgb3BlcmFuZDogZHN0ICAgKi8KLSNkZWZpbmUgUl8yKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMyApCQkvKiAyIG9wczogc3JjMS9zcmMyICovCi0jZGVmaW5lIFJfMkQob3BjKQkoIFJFR19PUEMob3BjKSB8IE0yICkJCS8qIDIgb3BzOiBzcmMxL2RzdCAgKi8KLSNkZWZpbmUgUl8zKG9wYykJKCBSRUdfT1BDKG9wYykgKQkJLyogMyBvcGVyYW5kcyAgICAgICAqLwotCi0vKiBERVNDUklQVE9SIEJZVEVTIEZPUiBSRUdJU1RFUiBPUEVSQU5EUwotICoKLSAqIEludGVycHJldCBuYW1lcyBhcyBmb2xsb3dzOgotICoJUjogICBnbG9iYWwgb3IgbG9jYWwgcmVnaXN0ZXIgb25seQotICoJUlM6ICBnbG9iYWwsIGxvY2FsLCBvciAoaWYgdGFyZ2V0IGFsbG93cykgc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlciBvbmx5Ci0gKglSTDogIGdsb2JhbCBvciBsb2NhbCByZWdpc3Rlciwgb3IgaW50ZWdlciBsaXRlcmFsCi0gKglSU0w6IGdsb2JhbCwgbG9jYWwsIG9yIChpZiB0YXJnZXQgYWxsb3dzKSBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyOwotICoJCW9yIGludGVnZXIgbGl0ZXJhbAotICoJRjogICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3RlcgotICoJRkw6ICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3Rlcjsgb3IgbGl0ZXJhbCAoaW5jbHVkaW5nCi0gKgkJZmxvYXRpbmcgcG9pbnQpCi0gKgotICogQSBudW1iZXIgYXBwZW5kZWQgdG8gYSBuYW1lIGluZGljYXRlcyB0aGF0IHJlZ2lzdGVycyBtdXN0IGJlIGFsaWduZWQsCi0gKiBhcyBmb2xsb3dzOgotICoJMjogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgMgotICoJNDogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgNAotICovCi0KLSNkZWZpbmUgU0ZSCTB4MTAJCS8qIE1hc2sgZm9yIHRoZSAic2ZyLU9LIiBiaXQgKi8KLSNkZWZpbmUgTElUCTB4MDgJCS8qIE1hc2sgZm9yIHRoZSAibGl0ZXJhbC1PSyIgYml0ICovCi0jZGVmaW5lIEZQCTB4MDQJCS8qIE1hc2sgZm9yICJmbG9hdGluZy1wb2ludC1PSyIgYml0ICovCi0KLS8qIFRoaXMgbWFjcm8gb3JzIHRoZSBiaXRzIHRvZ2V0aGVyLiAgTm90ZSB0aGF0ICdhbGlnbicgaXMgYSBtYXNrCi0gKiBmb3IgdGhlIGxvdyAwLCAxLCBvciAyIGJpdHMgb2YgdGhlIHJlZ2lzdGVyIG51bWJlciwgYXMgYXBwcm9wcmlhdGUuCi0gKi8KLSNkZWZpbmUgT1AoYWxpZ24sbGl0LGZwLHNmcikJKCBhbGlnbiB8IGxpdCB8IGZwIHwgc2ZyICkKLQotI2RlZmluZSBSCU9QKCAwLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSUwlPUCggMCwgMCwgICAwLCAgU0ZSICkKLSNkZWZpbmUgUkwJT1AoIDAsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIFJTTAlPUCggMCwgTElULCAwLCAgU0ZSICkKLSNkZWZpbmUgRglPUCggMCwgMCwgICBGUCwgMCAgICkKLSNkZWZpbmUgRkwJT1AoIDAsIExJVCwgRlAsIDAgICApCi0jZGVmaW5lIFIyCU9QKCAxLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSTDIJT1AoIDEsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIEYyCU9QKCAxLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTDIJT1AoIDEsIExJVCwgRlAsIDAgICApCi0jZGVmaW5lIFI0CU9QKCAzLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSTDQJT1AoIDMsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIEY0CU9QKCAzLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTDQJT1AoIDMsIExJVCwgRlAsIDAgICApCi0KLSNkZWZpbmUgTQkweDdmCS8qIE1lbW9yeSBvcGVyYW5kIChNRU1BICYgTUVNQiBmb3JtYXQgaW5zdHJ1Y3Rpb25zKSAqLwotCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvIGZyb20gdGhlIHJlZ2lzdGVyIG9wZXJhbmQgZGVzY3JpcHRvciBieXRlICdvZCcuCi0gKi8KLSNkZWZpbmUgU0ZSX09LKG9kKQkob2QgJiBTRlIpCS8qIFRSVUUgaWYgc2ZyIG9wZXJhbmQgYWxsb3dlZCAqLwotI2RlZmluZSBMSVRfT0sob2QpCShvZCAmIExJVCkJLyogVFJVRSBpZiBsaXRlcmFsIG9wZXJhbmQgYWxsb3dlZCAqLwotI2RlZmluZSBGUF9PSyhvZCkJKG9kICYgRlApCS8qIFRSVUUgaWYgZmxvYXRpbmctcG9pbnQgb3AgYWxsb3dlZCAqLwotI2RlZmluZSBSRUdfQUxJR04ob2QsbikJKChvZCAmIDB4MyAmIG4pID09IDApCi0JCQkJCS8qIFRSVUUgaWYgcmVnICNuIGlzIHByb3Blcmx5IGFsaWduZWQgKi8KLSNkZWZpbmUgTUVNT1Aob2QpCShvZCA9PSBNKQkvKiBUUlVFIGlmIG9wZXJhbmQgaXMgYSBtZW1vcnkgb3BlcmFuZCovCi0KLS8qIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGk4MDk2MCBpbnN0cnVjdGlvbiAqLwotc3RydWN0IGk5NjBfb3Bjb2RlIHsKLQlsb25nIG9wY29kZTsJLyogMzIgYml0cywgY29uc3RhbnQgZmllbGRzIGZpbGxlZCBpbiwgcmVzdCB6ZXJvZWQgKi8KLQljaGFyICpuYW1lOwkvKiBBc3NlbWJsZXIgbW5lbW9uaWMJCQkJICAgKi8KLQlzaG9ydCBpY2xhc3M7CS8qIENsYXNzOiBzZWUgI2RlZmluZXMgYmVsb3cJCQkgICAqLwotCWNoYXIgZm9ybWF0OwkvKiBSRUcsIENPQlIsIENUUkwsIE1FTW4sIENPSiwgRkJSQSwgb3IgQ0FMTEoJICAgKi8KLQljaGFyIG51bV9vcHM7CS8qIE51bWJlciBvZiBvcGVyYW5kcwkJCQkgICAqLwotCWNoYXIgb3BlcmFuZFszXTsvKiBPcGVyYW5kIGRlc2NyaXB0b3JzOyBzYW1lIG9yZGVyIGFzIGFzc2VtYmxlciBpbnN0ciAqLwotfTsKLQotLyogQ2xhc3NlcyBvZiA5NjAgaW50cnVjdGlvbnM6Ci0gKgktIGVhY2ggaW5zdHJ1Y3Rpb24gZmFsbHMgaW50byBvbmUgY2xhc3MuCi0gKgktIGVhY2ggdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBvbmUgb3IgbW9yZSBjbGFzc2VzLgotICoKLSAqIEVBQ0ggQ09OU1RBTlQgTVVTVCBDT05UQUlOIDEgQU5EIE9OTFkgMSBTRVQgQklUITogIHNlZSB0YXJnX2hhc19pY2xhc3MoKS4KLSAqLwotI2RlZmluZSBJX0JBU0UJMHgwMQkvKiA4MDk2MCBiYXNlIGluc3RydWN0aW9uIHNldAkqLwotI2RlZmluZSBJX0NYCTB4MDIJLyogODA5NjBDeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9ERUMJMHgwNAkvKiBEZWNpbWFsIGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0ZQCTB4MDgJLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgSV9LWAkweDEwCS8qIDgwOTYwS3ggaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfTUlMCTB4MjAJLyogTWlsaXRhcnkgaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfQ0FTSU0JMHg0MAkvKiBDQSBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgSV9DWDIJMHg4MAkvKiBDeC9KeC9IeCBpbnN0cnVjdGlvbnMJKi8KLSNkZWZpbmUgSV9KWAkweDEwMAkvKiBKeC9IeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9IWAkweDIwMAkvKiBIeCBpbnN0cnVjdGlvbnMJCSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgkJVEFCTEUgT0YgaTk2MCBJTlNUUlVDVElPTiBERVNDUklQVElPTlMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBzdHJ1Y3QgaTk2MF9vcGNvZGUgaTk2MF9vcGNvZGVzW10gPSB7Ci0KLQkvKiBpZiBhIENUUkwgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wZXJhbmQsIGl0J3MgYWx3YXlzIGEgZGlzcGxhY2VtZW50ICovCi0KLQkvKiBjYWxsaiBkZWZhdWx0PT0nY2FsbCcgKi8KLQl7IDB4MDkwMDAwMDAsCSJjYWxsaiIsCUlfQkFTRSwJQ0FMTEosIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgwODAwMDAwMCwJImIiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MDkwMDAwMDAsCSJjYWxsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDBhMDAwMDAwLAkicmV0IiwJCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDBiMDAwMDAwLAkiYmFsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEwMDAwMDAwLAkiYm5vIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYmYgc2FtZSBhcyBibm8gKi8KLQl7IDB4MTAwMDAwMDAsCSJiZiIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJydSBzYW1lIGFzIGJubyAqLwotCXsgMHgxMDAwMDAwMCwJImJydSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxMTAwMDAwMCwJImJnIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJnIHNhbWUgYXMgYmcgKi8KLQl7IDB4MTEwMDAwMDAsCSJicmciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTIwMDAwMDAsCSJiZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJyZSBzYW1lIGFzIGJlICovCi0JeyAweDEyMDAwMDAwLAkiYnJlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEzMDAwMDAwLAkiYmdlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJnZSBzYW1lIGFzIGJnZSAqLwotCXsgMHgxMzAwMDAwMCwJImJyZ2UiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTQwMDAwMDAsCSJibCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJybCBzYW1lIGFzIGJsICovCi0JeyAweDE0MDAwMDAwLAkiYnJsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE1MDAwMDAwLAkiYm5lIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJsZyBzYW1lIGFzIGJuZSAqLwotCXsgMHgxNTAwMDAwMCwJImJybGciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTYwMDAwMDAsCSJibGUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmxlIHNhbWUgYXMgYmxlICovCi0JeyAweDE2MDAwMDAwLAkiYnJsZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNzAwMDAwMCwJImJvIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnQgc2FtZSBhcyBibyAqLwotCXsgMHgxNzAwMDAwMCwJImJ0IiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJvIHNhbWUgYXMgYm8gKi8KLQl7IDB4MTcwMDAwMDAsCSJicm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTgwMDAwMDAsCSJmYXVsdG5vIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQkvKiBmYXVsdGYgc2FtZSBhcyBmYXVsdG5vICovCi0JeyAweDE4MDAwMDAwLAkiZmF1bHRmIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTkwMDAwMDAsCSJmYXVsdGciLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxYTAwMDAwMCwJImZhdWx0ZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFiMDAwMDAwLAkiZmF1bHRnZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFjMDAwMDAwLAkiZmF1bHRsIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWQwMDAwMDAsCSJmYXVsdG5lIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWUwMDAwMDAsCSJmYXVsdGxlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWYwMDAwMDAsCSJmYXVsdG8iLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCS8qIGZhdWx0dCBzeW4gZm9yIGZhdWx0byAqLwotCXsgMHgxZjAwMDAwMCwJImZhdWx0dCIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0KLQl7IDB4MDEwMDAwMDAsCSJzeXNjYWxsIiwJSV9DQVNJTSxDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQotCS8qIElmIGEgQ09CUiAob3IgQ09KKSBoYXMgMyBvcGVyYW5kcywgdGhlIGxhc3Qgb25lIGlzIGFsd2F5cyBhCi0JICogZGlzcGxhY2VtZW50IGFuZCBkb2VzIG5vdCBhcHBlYXIgZXhwbGljaXRseSBpbiB0aGUgdGFibGUuCi0JICovCi0KLQl7IDB4MjAwMDAwMDAsCSJ0ZXN0bm8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIxMDAwMDAwLAkidGVzdGciLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIyMDAwMDAwLAkidGVzdGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIzMDAwMDAwLAkidGVzdGdlIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNDAwMDAwMCwJInRlc3RsIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNTAwMDAwMCwJInRlc3RuZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjYwMDAwMDAsCSJ0ZXN0bGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI3MDAwMDAwLAkidGVzdG8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDMwMDAwMDAwLAkiYmJjIiwJCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMTAwMDAwMCwJImNtcG9iZyIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMjAwMDAwMCwJImNtcG9iZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMzAwMDAwMCwJImNtcG9iZ2UiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzQwMDAwMDAsCSJjbXBvYmwiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzUwMDAwMDAsCSJjbXBvYm5lIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM2MDAwMDAwLAkiY21wb2JsZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNzAwMDAwMCwJImJicyIsCQlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzgwMDAwMDAsCSJjbXBpYm5vIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM5MDAwMDAwLAkiY21waWJnIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNhMDAwMDAwLAkiY21waWJlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNiMDAwMDAwLAkiY21waWJnZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYzAwMDAwMCwJImNtcGlibCIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZDAwMDAwMCwJImNtcGlibmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2UwMDAwMDAsCSJjbXBpYmxlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNmMDAwMDAwLAkiY21waWJvIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMxMDAwMDAwLAkiY21wb2pnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzIwMDAwMDAsCSJjbXBvamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMzAwMDAwMCwJImNtcG9qZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNDAwMDAwMCwJImNtcG9qbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM1MDAwMDAwLAkiY21wb2puZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM2MDAwMDAwLAkiY21wb2psZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM4MDAwMDAwLAkiY21waWpubyIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM5MDAwMDAwLAkiY21waWpnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2EwMDAwMDAsCSJjbXBpamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYjAwMDAwMCwJImNtcGlqZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYzAwMDAwMCwJImNtcGlqbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNkMDAwMDAwLAkiY21waWpuZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNlMDAwMDAwLAkiY21waWpsZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNmMDAwMDAwLAkiY21waWpvIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQotCXsgMHg4MDAwMDAwMCwJImxkb2IiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDgyMDAwMDAwLAkic3RvYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4ODQwMDAwMDAsCSJieCIsCQlJX0JBU0UsCU1FTTEsCTEsIHsgTSwgIDAsICAwIH0gfSwKLQl7IDB4ODUwMDAwMDAsCSJiYWx4IiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg4NjAwMDAwMCwJImNhbGx4IiwJSV9CQVNFLAlNRU0xLAkxLCB7IE0sICAwLCAgMCB9IH0sCi0JeyAweDg4MDAwMDAwLAkibGRvcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OGEwMDAwMDAsCSJzdG9zIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHg4YzAwMDAwMCwJImxkYSIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OTAwMDAwMDAsCSJsZCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OTIwMDAwMDAsCSJzdCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4OTgwMDAwMDAsCSJsZGwiLAkJSV9CQVNFLAlNRU04LAkyLCB7IE0sICBSMiwgMCB9IH0sCi0JeyAweDlhMDAwMDAwLAkic3RsIiwJCUlfQkFTRSwJTUVNOCwJMiwgeyBSMiwgTSwgIDAgfSB9LAotCXsgMHhhMDAwMDAwMCwJImxkdCIsCQlJX0JBU0UsCU1FTTEyLAkyLCB7IE0sICBSNCwgMCB9IH0sCi0JeyAweGEyMDAwMDAwLAkic3R0IiwJCUlfQkFTRSwJTUVNMTIsCTIsIHsgUjQsIE0sICAwIH0gfSwKLQl7IDB4YjAwMDAwMDAsCSJsZHEiLAkJSV9CQVNFLAlNRU0xNiwJMiwgeyBNLCAgUjQsIDAgfSB9LAotCXsgMHhiMjAwMDAwMCwJInN0cSIsCQlJX0JBU0UsCU1FTTE2LAkyLCB7IFI0LCBNLCAgMCB9IH0sCi0JeyAweGMwMDAwMDAwLAkibGRpYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4YzIwMDAwMDAsCSJzdGliIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHhjODAwMDAwMCwJImxkaXMiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweGNhMDAwMDAwLAkic3RpcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQotCXsgUl8zKDB4NTgwKSwJIm5vdGJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTgxKSwJImFuZCIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MiksCSJhbmRub3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MyksCSJzZXRiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NCksCSJub3RhbmQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NiksCSJ4b3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODcpLAkib3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODgpLAkibm9yIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg5KSwJInhub3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NThhKSwJIm5vdCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8zKDB4NThiKSwJIm9ybm90IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGMpLAkiY2xyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGQpLAkibm90b3IiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4ZSksCSJuYW5kIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NThmKSwJImFsdGVyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTApLAkiYWRkbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MSksCSJhZGRpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTkyKSwJInN1Ym8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTMpLAkic3ViaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5OCksCSJzaHJvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTlhKSwJInNocmRpIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWIpLAkic2hyaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5YyksCSJzaGxvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTlkKSwJInJvdGF0ZSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTllKSwJInNobGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzIoMHg1YTApLAkiY21wbyIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMSksCSJjbXBpIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWEyKSwJImNvbmNtcG8iLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMyksCSJjb25jbXBpIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzMoMHg1YTQpLAkiY21waW5jbyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWE1KSwJImNtcGluY2kiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDVhNiksCSJjbXBkZWNvIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1YTcpLAkiY21wZGVjaSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yKDB4NWFjKSwJInNjYW5ieXRlIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1YWUpLAkiY2hrYml0IiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzMoMHg1YjApLAkiYWRkYyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDViMiksCSJzdWJjIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yRCgweDVjYyksCSJtb3YiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQl7IFJfMkQoMHg1ZGMpLAkibW92bCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSTDIsUjIsIDAgfSB9LAotCXsgUl8yRCgweDVlYyksCSJtb3Z0IiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJMNCxSNCwgMCB9IH0sCi0JeyBSXzJEKDB4NWZjKSwJIm1vdnEiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUkw0LFI0LCAwIH0gfSwKLQl7IFJfMygweDYxMCksCSJhdG1vZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTLCBSU0wsUiB9IH0sCi0JeyBSXzMoMHg2MTIpLAkiYXRhZGQiLAlJX0JBU0UsCVJFRywJMywgeyBSUywgUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NDApLAkic3BhbmJpdCIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzJEKDB4NjQxKSwJInNjYW5iaXQiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8zKDB4NjQ1KSwJIm1vZGFjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2NTApLAkibW9kaWZ5IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMygweDY1MSksCSJleHRyYWN0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMygweDY1NCksCSJtb2R0YyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjU1KSwJIm1vZHBjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMSgweDY2MCksCSJjYWxscyIsCUlfQkFTRSwJUkVHLAkxLCB7IFJTTCwgMCwgMCB9IH0sCi0JeyBSXzAoMHg2NmIpLAkibWFyayIsCQlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMCgweDY2YyksCSJmbWFyayIsCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjZkKSwJImZsdXNocmVnIiwJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NmYpLAkic3luY2YiLAlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMygweDY3MCksCSJlbXVsIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUjIgfSB9LAotCXsgUl8zKDB4NjcxKSwJImVkaXYiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJMMixSUyB9IH0sCi0JeyBSXzJEKDB4NjcyKSwJImN2dGFkciIsCUlfQ0FTSU0sUkVHLCAJMiwgeyBSTCwgUjIsIDAgfSB9LAotCXsgUl8zKDB4NzAxKSwJIm11bG8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3MDgpLAkicmVtbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDcwYiksCSJkaXZvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzQxKSwJIm11bGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NDgpLAkicmVtaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc0OSksCSJtb2RpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzRiKSwJImRpdmkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQkvKiBGbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotCXsgUl8yRCgweDY3NCksCSJjdnRpciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4Njc1KSwJImN2dGlsciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCi0JeyBSXzMoMHg2NzYpLAkic2NhbGVybCIsCUlfRlAsCVJFRywJMywgeyBSTCwgRkwyLEYyIH0gfSwKLQl7IFJfMygweDY3NyksCSJzY2FsZXIiLAlJX0ZQLAlSRUcsCTMsIHsgUkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDY4MCksCSJhdGFuciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgxKSwJImxvZ2VwciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgyKSwJImxvZ3IiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODMpLAkicmVtciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMigweDY4NCksCSJjbXBvciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRkwsIDAgfSB9LAotCXsgUl8yKDB4Njg1KSwJImNtcHIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGTCwgMCB9IH0sCi0JeyBSXzJEKDB4Njg4KSwJInNxcnRyIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2ODkpLAkiZXhwciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YSksCSJsb2dibnIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YiksCSJyb3VuZHIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YyksCSJzaW5yIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhkKSwJImNvc3IiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGUpLAkidGFuciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8xKDB4NjhmKSwJImNsYXNzciIsCUlfRlAsCVJFRywJMSwgeyBGTCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2OTApLAkiYXRhbnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NjkxKSwJImxvZ2VwcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTIpLAkibG9ncmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTMpLAkicmVtcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzIoMHg2OTQpLAkiY21wb3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAotCXsgUl8yKDB4Njk1KSwJImNtcHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAotCXsgUl8yRCgweDY5OCksCSJzcXJ0cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OTkpLAkiZXhwcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWEpLAkibG9nYm5ybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5YiksCSJyb3VuZHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjljKSwJInNpbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjlkKSwJImNvc3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjllKSwJInRhbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzEoMHg2OWYpLAkiY2xhc3NybCIsCUlfRlAsCVJFRywJMSwgeyBGTDIsIDAsIDAgfSB9LAotCXsgUl8yRCgweDZjMCksCSJjdnRyaSIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NmMxKSwJImN2dHJpbCIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUjIsIDAgfSB9LAotCXsgUl8yRCgweDZjMiksCSJjdnR6cmkiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIsIDAgfSB9LAotCXsgUl8yRCgweDZjMyksCSJjdnR6cmlsIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSMiwgMCB9IH0sCi0JeyBSXzJEKDB4NmM5KSwJIm1vdnIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2ZDkpLAkibW92cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2ZTEpLAkibW92cmUiLAlJX0ZQLAlSRUcsCTIsIHsgRkw0LEY0LCAwIH0gfSwKLQl7IFJfMygweDZlMiksCSJjcHlzcmUiLAlJX0ZQLAlSRUcsCTMsIHsgRkw0LEZMNCxGNCB9IH0sCi0JeyBSXzMoMHg2ZTMpLAkiY3B5cnNyZSIsCUlfRlAsCVJFRywJMywgeyBGTDQsRkw0LEY0IH0gfSwKLQl7IFJfMygweDc4YiksCSJkaXZyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzhjKSwJIm11bHIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OGQpLAkic3ViciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDc4ZiksCSJhZGRyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzliKSwJImRpdnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzljKSwJIm11bHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzlkKSwJInN1YnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzlmKSwJImFkZHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCi0JLyogVGhlc2UgYXJlIHRoZSBmbG9hdGluZyBwb2ludCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgRWFjaCBhY3R1YWxseQotCSAqIGdlbmVyYXRlcyAyIGJyYW5jaCBpbnN0cnVjdGlvbnM6ICB0aGUgZmlyc3QgYSBDVFJMIGluc3RydWN0aW9uIHdpdGgKLQkgKiB0aGUgaW5kaWNhdGVkIG9wY29kZSwgYW5kIHRoZSBzZWNvbmQgYSAnYm5vJy4KLQkgKi8KLQotCXsgMHgxMjAwMDAwMCwJImJydWUiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDExMDAwMDAwLAkiYnJ1ZyIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTMwMDAwMDAsCSJicnVnZSIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxNDAwMDAwMCwJImJydWwiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDE2MDAwMDAwLAkiYnJ1bGUiLAlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTUwMDAwMDAsCSJicnVsZyIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCi0KLQkvKiBEZWNpbWFsIGluc3RydWN0aW9ucyAqLwotCi0JeyBSXzMoMHg2NDIpLAkiZGFkZGMiLAlJX0RFQywJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjQzKSwJImRzdWJjIiwJSV9ERUMsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NDQpLAkiZG1vdnQiLAlJX0RFQywJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0KLQotCS8qIEtYIGV4dGVuc2lvbnMgKi8KLQotCXsgUl8yKDB4NjAwKSwJInN5bm1vdiIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzIoMHg2MDEpLAkic3lubW92bCIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzIoMHg2MDIpLAkic3lubW92cSIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjE1KSwJInN5bmxkIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQotCi0JLyogTUMgZXh0ZW5zaW9ucyAqLwotCi0JeyBSXzMoMHg2MDMpLAkiY21wc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMygweDYwNCksCSJtb3Zxc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMygweDYwNSksCSJtb3ZzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAotCXsgUl8yRCgweDYxMyksCSJpbnNwYWNjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjE0KSwJImxkcGh5IiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzMoMHg2MTcpLAkiZmlsbCIsCQlJX01JTCwJUkVHLAkzLCB7IFIsICBSTCwgUkwgfSB9LAotCXsgUl8yRCgweDY0NiksCSJjb25kcmVjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjU2KSwJInJlY2VpdmUiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMygweDY2MiksCSJzZW5kIiwJCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFJMLCBSIH0gfSwKLQl7IFJfMSgweDY2MyksCSJzZW5kc2VydiIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjQpLAkicmVzdW1wcmNzIiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2NSksCSJzY2hlZHByY3MiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjY2KSwJInNhdmVwcmNzIiwJSV9NSUwsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2OCksCSJjb25kd2FpdCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjkpLAkid2FpdCIsCQlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjZhKSwJInNpZ25hbCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzFEKDB4NjczKSwJImxkdGltZSIsCUlfTUlMLAlSRUcsCTEsIHsgUjIsIDAsIDAgfQl9LAotCi0KLQkvKiBDWCBleHRlbnNpb25zICovCi0KLQl7IFJfMygweDVkOCksCSJlc2hybyIsCUlfQ1gyLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2MzApLAkic2RtYSIsCQlJX0NYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0JeyBSXzMoMHg2MzEpLAkidWRtYSIsCQlJX0NYLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2NTkpLAkic3lzY3RsIiwJSV9DWDIsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKLQotCi0JLyogSnggZXh0ZW5zaW9ucy4gICovCi0JeyBSXzMoMHg3ODApLAkiYWRkb25vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkwKSwJImFkZG9nIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EwKSwJImFkZG9lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IwKSwJImFkZG9nZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMCksCSJhZGRvbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMCksCSJhZGRvbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTApLAkiYWRkb2xlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YwKSwJImFkZG9vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzgxKSwJImFkZGlubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5MSksCSJhZGRpZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhMSksCSJhZGRpZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiMSksCSJhZGRpZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzEpLAkiYWRkaWwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDEpLAkiYWRkaW5lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2UxKSwJImFkZGlsZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmMSksCSJhZGRpbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCXsgUl8yRCgweDVhZCksCSJic3dhcCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKLQotCXsgUl8yKDB4NTk0KSwJImNtcG9iIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk1KSwJImNtcGliIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk2KSwJImNtcG9zIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk3KSwJImNtcGlzIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCi0JeyBSXzMoMHg3ODQpLAkic2Vsbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTQpLAkic2VsZyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTQpLAkic2VsZSIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjQpLAkic2VsZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzQpLAkic2VsbCIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDQpLAkic2VsbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTQpLAkic2VsbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjQpLAkic2VsbyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQl7IFJfMygweDc4MiksCSJzdWJvbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTIpLAkic3Vib2ciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTIpLAkic3Vib2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjIpLAkic3Vib2dlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MyKSwJInN1Ym9sIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QyKSwJInN1Ym9uZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMiksCSJzdWJvbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjIpLAkic3Vib28iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ODMpLAkic3ViaW5vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkzKSwJInN1YmlnIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EzKSwJInN1YmllIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IzKSwJInN1YmlnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMyksCSJzdWJpbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMyksCSJzdWJpbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTMpLAkic3ViaWxlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YzKSwJInN1YmlvIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCi0JeyBSXzMoMHg2NWMpLAkiZGNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0JeyBSXzMoMHg2NWIpLAkiaWNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NjU4KSwJImludGN0bCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKLQl7IFJfMCgweDViNCksCSJpbnRkaXMiLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCi0JeyBSXzAoMHg1YjUpLAkiaW50ZW4iLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCi0JeyBSXzAoMHg2NWQpLAkiaGFsdCIsCQlJX0pYLAlSRUcsCTEsIHsgUlNMLCAgMCwgMCB9IH0sCi0KLQkvKiBIeCBleHRlbnNpb25zLiAgKi8KLQl7IDB4YWMwMDAwMDAsCSJkY2ludmEiLAlJX0hYLAlNRU0xLAkxLCB7ICAgTSwgIDAsIDAgfSB9LAotCi0JLyogRU5EIE9GIFRBQkxFICovCi0KLQl7IDAsCQlOVUxMLAkJMCwJMCwJMCwgeyAwLCAwLCAwIH0JfQotfTsKLQotIC8qIGVuZCBvZiBpOTYwLW9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tNjhrLmggYi9pbmNsdWRlL29wY29kZS9tNjhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDhiNzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBoZWFkZXIgZm9yIG02ODBbMDEyMzRdMC9tNjg4OFsxMl0vbTY4ODUxLgotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZXNlIGFyZSB1c2VkIGFzIGJpdCBmbGFncyBmb3IgdGhlIGFyY2ggZmllbGQgaW4gdGhlIG02OGtfb3Bjb2RlCi0gICBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZQlfbTY4a191bmRlZiAgMAotI2RlZmluZQltNjgwMDAgIDB4MDAxCi0jZGVmaW5lCW02ODAwOCAgbTY4MDAwIC8qIHN5bm9ueW0gZm9yIC1tNjgwMDAuICBvdGhlcndpc2UgdW51c2VkLiAqLwotI2RlZmluZQltNjgwMTAgIDB4MDAyCi0jZGVmaW5lCW02ODAyMCAgMHgwMDQKLSNkZWZpbmUJbTY4MDMwICAweDAwOAotI2RlZmluZSBtNjhlYzAzMCBtNjgwMzAgLyogc2ltaWxhciBlbm91Z2ggdG8gLW02ODAzMCB0byBpZ25vcmUgZGlmZmVyZW5jZXM7Ci0JCQkgICBnYXMgd2lsbCBkZWFsIHdpdGggdGhlIGZldyBkaWZmZXJlbmNlcy4gICovCi0jZGVmaW5lCW02ODA0MCAgMHgwMTAKLS8qIHRoZXJlIGlzIG5vIDY4MDUwICovCi0jZGVmaW5lIG02ODA2MCAgMHgwMjAKLSNkZWZpbmUJbTY4ODgxICAweDA0MAotI2RlZmluZQltNjg4ODIgIG02ODg4MSAvKiBzeW5vbnltIGZvciAtbTY4ODgxLiAgb3RoZXJ3aXNlIHVudXNlZC4gKi8KLSNkZWZpbmUJbTY4ODUxICAweDA4MAotI2RlZmluZSBjcHUzMgkweDEwMAkvKiBlLmcuLCA2ODMzMiAqLwotI2RlZmluZSBtY2Y1MjAwIDB4MjAwCi0jZGVmaW5lIG1jZjUyMDZlIDB4NDAwCi0jZGVmaW5lIG1jZjUzMDcgMHg4MDAKLQotIC8qIGhhbmR5IGFsaWFzZXMgKi8KLSNkZWZpbmUJbTY4MDQwdXAgIChtNjgwNDAgfCBtNjgwNjApCi0jZGVmaW5lCW02ODAzMHVwICAobTY4MDMwIHwgbTY4MDQwdXApCi0jZGVmaW5lCW02ODAyMHVwICAobTY4MDIwIHwgbTY4MDMwdXApCi0jZGVmaW5lCW02ODAxMHVwICAobTY4MDEwIHwgY3B1MzIgfCBtNjgwMjB1cCkKLSNkZWZpbmUJbTY4MDAwdXAgIChtNjgwMDAgfCBtNjgwMTB1cCkKLSNkZWZpbmUgbWNmICAgICAgIChtY2Y1MjAwIHwgbWNmNTIwNmUgfCBtY2Y1MzA3KQotCi0jZGVmaW5lCW1mbG9hdCAgKG02ODg4MSB8IG02ODg4MiB8IG02ODA0MCB8IG02ODA2MCkKLSNkZWZpbmUJbW1tdSAgICAobTY4ODUxIHwgbTY4MDMwIHwgbTY4MDQwIHwgbTY4MDYwKQotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IgYW4gb3Bjb2RlLiAgKi8KLQotc3RydWN0IG02OGtfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIC8qIFRoZSBtYXNrIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7Ci0gIC8qIFRoZSBhcmd1bWVudHMuICAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGUgYXJjaGl0ZWN0dXJlcyB3aGljaCBzdXBwb3J0IHRoaXMgb3Bjb2RlLiAgKi8KLSAgdW5zaWduZWQgaW50IGFyY2g7Ci19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IgYW4gb3Bjb2RlIGFsaWFzLiAgKi8KLQotc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzCi17Ci0gIC8qIFRoZSBhbGlhcyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqYWxpYXM7Ci0gIC8qIFRoZSBpbnN0cnVjdGlvbiBmb3Igd2hpY2ggdGhpcyBpcyBhbiBhbGlhcy4gICovCi0gIGNvbnN0IGNoYXIgKnByaW1hcnk7Ci19OwotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMgYmVjYXVzZSB0aGF0IGlzIHRoZQotICAgbW9zdCBhbnkgb2YgdGhlbSBuZWVkLiAgVGhlIGFjdHVhbCBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gaXMKLSAgIGFsd2F5cyBhdCBsZWFzdCAyIGJ5dGVzLCBhbmQgaXMgYXMgbXVjaCBsb25nZXIgYXMgbmVjZXNzYXJ5IHRvIGhvbGQKLSAgIHRoZSBvcGVyYW5kcyBpdCBoYXMuCi0KLSAgIFRoZSBtYXRjaCBmaWVsZCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBwYXJ0aWN1bGFyCi0gICBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoYXQKLSAgIG9wY29kZS4KLQotICAgVGhlIGFyZ3MgZmllbGQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0d28gY2hhcmFjdGVycyBmb3IgZWFjaAotICAgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgZmlyc3Qgc3BlY2lmaWVzIHRoZSBraW5kIG9mCi0gICBvcGVyYW5kOyB0aGUgc2Vjb25kLCB0aGUgcGxhY2UgaXQgaXMgc3RvcmVkLiAgKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICBDaGFyYWN0ZXJzIHVzZWQ6IEFhQkNjRGRFRmZHSElKa0xsTW1uT29wUXFSclNzVHRVIFZ2V1hZWjAxMjN8Kn4lO0AhJiQ/Lzw+I14rLQotCi0gICBEICBkYXRhIHJlZ2lzdGVyIG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgQSAgYWRkcmVzcyByZWdpc3RlciBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIGEgIGFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICBSICBlaXRoZXIga2luZCBvZiByZWdpc3Rlci4gIFN0b3JlZCBhcyA0IGJpdHMuCi0gICByICBlaXRoZXIga2luZCBvZiByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiAgU3RvcmVkIGFzIDQgYml0cy4KLSAgICAgIEF0IHRoZSBtb21lbnQsIHVzZWQgb25seSBmb3IgY2FzMiBpbnN0cnVjdGlvbi4KLSAgIEYgIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG9ubHkuICAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIE8gIGFuIG9mZnNldCAob3Igd2lkdGgpOiBpbW1lZGlhdGUgZGF0YSAwLTMxIG9yIGRhdGEgcmVnaXN0ZXIuCi0gICAgICBTdG9yZWQgYXMgNiBiaXRzIGluIHNwZWNpYWwgZm9ybWF0IGZvciBCRi4uLiBpbnNucy4KLSAgICsgIGF1dG9pbmNyZW1lbnQgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMgKG51bWJlciBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcikuCi0gICAtICBhdXRvZGVjcmVtZW50IG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzIChudW1iZXIgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXIpLgotICAgUSAgcXVpY2sgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgICAgVGhpcyBtYXRjaGVzIGFuIGltbWVkaWF0ZSBvcGVyYW5kIG9ubHkgd2hlbiB2YWx1ZSBpcyBpbiByYW5nZSAxIC4uIDguCi0gICBNICBtb3ZlcSBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyA4IGJpdHMuCi0gICAgICBUaGlzIG1hdGNoZXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgb25seSB3aGVuIHZhbHVlIGlzIGluIHJhbmdlIC0xMjguLjEyNwotICAgVCAgdHJhcCB2ZWN0b3IgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgNCBiaXRzLgotCi0gICBrICBLLWZhY3RvciBmb3IgZm1vdmUucCBpbnN0cnVjdGlvbi4gICBTdG9yZWQgYXMgYSA3LWJpdCBjb25zdGFudCBvcgotICAgICAgYSB0aHJlZSBiaXQgcmVnaXN0ZXIgb2Zmc2V0LCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUuCi0KLSAgICMgIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGluIHNwZWNpYWwgcGxhY2VzIChiLCB3IG9yIGwpCi0gICAgICB3aGljaCBzYXkgaG93IG1hbnkgYml0cyB0byBzdG9yZS4KLSAgIF4gIGltbWVkaWF0ZSBkYXRhIGZvciBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICAgU3BlY2lhbCBwbGFjZXMKLSAgICAgIGFyZSBvZmZzZXQgYnkgMiBieXRlcyBmcm9tICcjJy4uLgotICAgQiAgcGMtcmVsYXRpdmUgYWRkcmVzcywgY29udmVydGVkIHRvIGFuIG9mZnNldAotICAgICAgdGhhdCBpcyB0cmVhdGVkIGFzIGltbWVkaWF0ZSBkYXRhLgotICAgZCAgZGlzcGxhY2VtZW50IGFuZCByZWdpc3Rlci4gIFN0b3JlcyB0aGUgcmVnaXN0ZXIgYXMgMyBiaXRzCi0gICAgICBhbmQgc3RvcmVzIHRoZSBkaXNwbGFjZW1lbnQgaW4gdGhlIGVudGlyZSBzZWNvbmQgd29yZC4KLQotICAgQyAgdGhlIENDUi4gIE5vIG5lZWQgdG8gc3RvcmUgaXQ7IHRoaXMgaXMganVzdCBmb3IgZmlsdGVyaW5nIHZhbGlkaXR5LgotICAgUyAgdGhlIFNSLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLSAgIFUgIHRoZSBVU1AuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgRSAgdGhlIEFDQy4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0gICBHICB0aGUgTUFDU1IuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgSCAgdGhlIE1BU0suICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotCi0gICBJICBDb3Byb2Nlc3NvciBJRC4gICBOb3QgcHJpbnRlZCBpZiAxLiAgIFRoZSBDb3Byb2Nlc3NvciBJRCBpcyBhbHdheXMKLSAgICAgIGV4dHJhY3RlZCBmcm9tIHRoZSAnZCcgZmllbGQgb2Ygd29yZCBvbmUsIHdoaWNoIG1lYW5zIHRoYXQgYW4gZXh0ZW5kZWQKLSAgICAgIGNvcHJvY2Vzc29yIG9wY29kZSBjYW4gYmUgc2tpcHBlZCB1c2luZyB0aGUgJ2knIHBsYWNlLCBpZiBuZWVkZWQuCi0KLSAgIHMgIFN5c3RlbSBDb250cm9sIHJlZ2lzdGVyIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IuCi0KLSAgIEogIE1pc2MgcmVnaXN0ZXIgZm9yIG1vdmVjIGluc3RydWN0aW9uLCBzdG9yZWQgaW4gJ2onIGZvcm1hdC4KLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMHgwMDAJU0ZDCVNvdXJjZSBGdW5jdGlvbiBDb2RlIHJlZwlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4MDAxCURGQwlEYXRhIEZ1bmN0aW9uIENvZGUgcmVnCQlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4MDAyCUNBQ1IJQ2FjaGUgQ29udHJvbCBSZWdpc3RlcgkJWzYwLCA0MCwgMzAsIDIwXQotCTB4MDAzCVRDCU1NVSBUcmFuc2xhdGlvbiBDb250cm9sCQlbNjAsIDQwXQotCTB4MDA0CUlUVDAJSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMAlbNjAsIDQwXQotCTB4MDA1CUlUVDEJSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMQlbNjAsIDQwXQotCTB4MDA2CURUVDAJRGF0YSBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAwCVs2MCwgNDBdCi0JMHgwMDcJRFRUMQlEYXRhIFRyYW5zcGFyZW50Ci0JCQkJVHJhbnNsYXRpb24gcmVnIDEJWzYwLCA0MF0KLQkweDAwOAlCVVNDUglCdXMgQ29udHJvbCBSZWdpc3RlcgkJWzYwXQotCTB4ODAwCVVTUAlVc2VyIFN0YWNrIFBvaW50ZXIJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHg4MDEJVkJSCVZlY3RvciBCYXNlIHJlZwkJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHg4MDIJQ0FBUglDYWNoZSBBZGRyZXNzIFJlZ2lzdGVyCQlbICAgICAgICAzMCwgMjBdCi0JMHg4MDMJTVNQCU1hc3RlciBTdGFjayBQb2ludGVyCQlbICAgIDQwLCAzMCwgMjBdCi0JMHg4MDQJSVNQCUludGVycnVwdCBTdGFjayBQb2ludGVyCQlbICAgIDQwLCAzMCwgMjBdCi0JMHg4MDUJTU1VU1IJTU1VIFN0YXR1cyByZWcJCQlbICAgIDQwXQotCTB4ODA2CVVSUAlVc2VyIFJvb3QgUG9pbnRlcgkJWzYwLCA0MF0KLQkweDgwNwlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIJCVs2MCwgNDBdCi0JMHg4MDgJUENSCVByb2Nlc3NvciBDb25maWd1cmF0aW9uIHJlZwlbNjBdCi0JMHhDMDAJUk9NQkFSCVJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIJWzUyMFhdCi0JMHhDMDQJUkFNQkFSMAlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0JMHhDMDUJUkFNQkFSMQlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0JMHhDMEYJTUJBUjAJUkFNIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwCVs1MjBYXQotCi0gICAgTCAgUmVnaXN0ZXIgbGlzdCBvZiB0aGUgdHlwZSBkMC1kNy9hMC1hNyBldGMuCi0gICAgICAgKE5ldyEgIEltcHJvdmVkISAgQ2FuIGFsc28gaG9sZCBmcDAtZnA3LCBhcyB3ZWxsISkKLSAgICAgICBUaGUgYXNzZW1ibGVyIHRyaWVzIHRvIHNlZSBpZiB0aGUgcmVnaXN0ZXJzIG1hdGNoIHRoZSBpbnNuIGJ5Ci0gICAgICAgbG9va2luZyBhdCB3aGVyZSB0aGUgaW5zbiB3YW50cyB0aGVtIHN0b3JlZC4KLQotICAgIGwgIFJlZ2lzdGVyIGxpc3QgbGlrZSBMLCBidXQgd2l0aCBhbGwgdGhlIGJpdHMgcmV2ZXJzZWQuCi0gICAgICAgVXNlZCBmb3IgZ29pbmcgdGhlIG90aGVyIHdheS4gLiAuCi0KLSAgICBjICBjYWNoZSBpZGVudGlmaWVyIHdoaWNoIG1heSBiZSAibmMiIGZvciBubyBjYWNoZSwgImljIgotICAgICAgIGZvciBpbnN0cnVjdGlvbiBjYWNoZSwgImRjIiBmb3IgZGF0YSBjYWNoZSwgb3IgImJjIgotICAgICAgIGZvciBib3RoIGNhY2hlcy4gIFVzZWQgaW4gY2ludiBhbmQgY3B1c2guICBBbHdheXMKLSAgICAgICBzdG9yZWQgaW4gcG9zaXRpb24gImQiLgotCi0gICAgdSAgQW55IHJlZ2lzdGVyLCB3aXRoIGBgdXBwZXInJyBvciBgYGxvd2VyJycgc3BlY2lmaWNhdGlvbi4gIFVzZWQKLSAgICAgICBpbiB0aGUgbWFjIGluc3RydWN0aW9ucyB3aXRoIHNpemUgd29yZC4KLQotIFRoZSByZW1haW5kZXIgYXJlIGFsbCBzdG9yZWQgYXMgNiBiaXRzIHVzaW5nIGFuIGFkZHJlc3MgbW9kZSBhbmQgYQotIHJlZ2lzdGVyIG51bWJlcjsgdGhleSBkaWZmZXIgaW4gd2hpY2ggYWRkcmVzc2luZyBtb2RlcyB0aGV5IG1hdGNoLgotCi0gICAqICBhbGwJCQkJCShtb2RlcyAwLTYsNy4wLTQpCi0gICB+ICBhbHRlcmFibGUgbWVtb3J5CQkJCShtb2RlcyAyLTYsNy4wLDcuMSkKLSAgIAkJCQkJCShub3QgMCwxLDcuMi00KQotICAgJSAgYWx0ZXJhYmxlCQkJCQkobW9kZXMgMC02LDcuMCw3LjEpCi0JCQkJCQkobm90IDcuMi00KQotICAgOyAgZGF0YQkJCQkJKG1vZGVzIDAsMi02LDcuMC00KQotCQkJCQkJKG5vdCAxKQotICAgQCAgZGF0YSwgYnV0IG5vdCBpbW1lZGlhdGUJCQkobW9kZXMgMCwyLTYsNy4wLTMpCi0JCQkJCQkobm90IDEsNy40KQotICAgISAgY29udHJvbAkJCQkJKG1vZGVzIDIsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAwLDEsMyw0LDcuNCkKLSAgICYgIGFsdGVyYWJsZSBjb250cm9sCQkJCShtb2RlcyAyLDUsNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAwLDEsNy4yLTQpCi0gICAkICBhbHRlcmFibGUgZGF0YQkJCQkobW9kZXMgMCwyLTYsNy4wLDcuMSkKLQkJCQkJCShub3QgMSw3LjItNCkKLSAgID8gIGFsdGVyYWJsZSBjb250cm9sLCBvciBkYXRhIHJlZ2lzdGVyCShtb2RlcyAwLDIsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDEsMyw0LDcuMi00KQotICAgLyAgY29udHJvbCwgb3IgZGF0YSByZWdpc3RlcgkJCShtb2RlcyAwLDIsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAxLDMsNCw3LjQpCi0gICA+ICAqc2F2ZSBvcGVyYW5kcwkJCQkobW9kZXMgMiw0LDUsNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAwLDEsMyw3LjItNCkKLSAgIDwgICpyZXN0b3JlIG9wZXJhbmRzCQkJCShtb2RlcyAyLDMsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAwLDEsNCw3LjQpCi0KLSAgIGNvbGRmaXJlIG1vdmUgb3BlcmFuZHM6Ci0gICBtICAJCQkJCQkobW9kZXMgMC00KQotICAgbgkJCQkJCShtb2RlcyA1LDcuMikKLSAgIG8JCQkJCQkobW9kZXMgNiw3LjAsNy4xLDcuMyw3LjQpCi0gICBwCQkJCQkJKG1vZGVzIDAtNSkKLQotICAgY29sZGZpcmUgYnNldC9iY2xyL2J0c3QvbXVsc2wvbXVsdWwgb3BlcmFuZHM6Ci0gICBxCQkJCQkJKG1vZGVzIDAsMi01KQotICAgdgkJCQkJCShtb2RlcyAwLDItNSw3LjAsNy4xKQotKi8KLQotLyogRm9yIHRoZSA2ODg1MTogKi8KLS8qCi0gICBJIGRpZG4ndCB1c2UgbXVjaCBpbWFnaW5hdGlvbiBpbiBjaG9vc2luZyB0aGUgCi0gICBmb2xsb3dpbmcgY29kZXMsIHNvIG1hbnkgb2YgdGhlbSBhcmVuJ3QgdmVyeQotICAgbW5lbW9uaWMuIC1yYWIKLQotICAgMCAgMzIgYml0IHBtbXUgcmVnaXN0ZXIKLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMDAwCVRDCVRyYW5zbGF0aW9uIENvbnRyb2wgUmVnaXN0ZXIgKDY4MDMwLCA2ODg1MSkKLQotICAgMSAgMTYgYml0IHBtbXUgcmVnaXN0ZXIKLQkxMTEJQUMJQWNjZXNzIENvbnRyb2wgKDY4ODUxKQotCi0gICAyICA4IGJpdCBwbW11IHJlZ2lzdGVyCi0JMTAwCUNBTAlDdXJyZW50IEFjY2VzcyBMZXZlbCAoNjg4NTEpCi0JMTAxCVZBTAlWYWxpZGF0ZSBBY2Nlc3MgTGV2ZWwgKDY4ODUxKQotCTExMAlTQ0MJU3RhY2sgQ2hhbmdlIENvbnRyb2wgKDY4ODUxKQotCi0gICAzICA2ODAzMC1vbmx5IHBtbXUgcmVnaXN0ZXJzICgzMiBiaXQpCi0JMDEwCVRUMAlUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiByZWcgMAotCQkJKGFrYSBBY2Nlc3MgQ29udHJvbCByZWcgMCAtLSBBQzAgLS0gb24gNjhlYzAzMCkKLQkwMTEJVFQxCVRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIHJlZyAxCi0JCQkoYWthIEFjY2VzcyBDb250cm9sIHJlZyAxIC0tIEFDMSAtLSBvbiA2OGVjMDMwKQotCi0gICBXICB3aWRlIHBtbXUgcmVnaXN0ZXJzCi0JUG9zc2libGUgdmFsdWVzOgotCTAwMQlEUlAJRG1hIFJvb3QgUG9pbnRlciAoNjg4NTEpCi0JMDEwCVNSUAlTdXBlcnZpc29yIFJvb3QgUG9pbnRlciAoNjgwMzAsIDY4ODUxKQotCTAxMQlDUlAJQ3B1IFJvb3QgUG9pbnRlciAoNjgwMzAsIDY4ODUxKQotCi0gICBmCWZ1bmN0aW9uIGNvZGUgcmVnaXN0ZXIgKDY4MDMwLCA2ODg1MSkKLQkwCVNGQwotCTEJREZDCi0KLSAgIFYJVkFMIHJlZ2lzdGVyIG9ubHkgKDY4ODUxKQotCi0gICBYCUJBRHgsIEJBQ3ggKDE2IGJpdCkKLQkxMDAJQkFECUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgRGF0YSAoNjg4NTEpCi0JMTAxCUJBQwlCcmVha3BvaW50IEFja25vd2xlZGdlIENvbnRyb2wgKDY4ODUxKQotCi0gICBZCVBTUiAoNjg4NTEpIChNTVVTUiBvbiA2ODAzMCkgKEFDVVNSIG9uIDY4ZWMwMzApCi0gICBaCVBDU1IgKDY4ODUxKQotCi0gICB8CW1lbW9yeSAJCShtb2RlcyAyLTYsIDcuKikKLQotICAgdCAgYWRkcmVzcyB0ZXN0IGxldmVsICg2ODAzMCBvbmx5KQotICAgICAgU3RvcmVkIGFzIDMgYml0cywgcmFuZ2UgMC03LgotICAgICAgQWxzbyB1c2VkIGZvciBicmVha3BvaW50IGluc3RydWN0aW9uIG5vdy4KLQotKi8KLQotLyogUGxhY2VzIHRvIHB1dCBhbiBvcGVyYW5kLCBmb3Igbm9uLWdlbmVyYWwgb3BlcmFuZHM6Ci0gICBDaGFyYWN0ZXJzIHVzZWQ6IEJiQ2NEZGdoaWprTGxNbU5ub3N0V3cxMjM0NTY3ODkKLQotICAgcyAgc291cmNlLCBsb3cgYml0cyBvZiBmaXJzdCB3b3JkLgotICAgZCAgZGVzdCwgc2hpZnRlZCA5IGluIGZpcnN0IHdvcmQKLSAgIDEgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDEyCi0gICAyICBzZWNvbmQgd29yZCwgc2hpZnRlZCA2Ci0gICAzICBzZWNvbmQgd29yZCwgc2hpZnRlZCAwCi0gICA0ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDEyCi0gICA1ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDYKLSAgIDYgIHRoaXJkIHdvcmQsIHNoaWZ0ZWQgMAotICAgNyAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgNwotICAgOCAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgMTAKLSAgIDkgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDUKLSAgIEQgIHN0b3JlIGluIGJvdGggcGxhY2UgMSBhbmQgcGxhY2UgMzsgZm9yIGRpdnVsIGFuZCBkaXZzbC4KLSAgIEIgIGZpcnN0IHdvcmQsIGxvdyBieXRlLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKLSAgIFcgIHNlY29uZCB3b3JkIChlbnRpcmUpLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKLSAgIEwgIHNlY29uZCBhbmQgdGhpcmQgd29yZHMgKGVudGlyZSksIGZvciBicmFuY2ggZGlzcGxhY2VtZW50cwotICAgICAgKGFsc28gb3ZlcmxvYWRlZCBmb3IgbW92ZTE2KQotICAgYiAgc2Vjb25kIHdvcmQsIGxvdyBieXRlCi0gICB3ICBzZWNvbmQgd29yZCAoZW50aXJlKSBbdmFyaWFibGUgd29yZC9sb25nIGJyYW5jaCBvZmZzZXQgZm9yIGRicmFdCi0gICBXICBzZWNvbmQgd29yZCAoZW50aXJlKSAobXVzdCBiZSBzaWduZWQgMTYgYml0IHZhbHVlKQotICAgbCAgc2Vjb25kIGFuZCB0aGlyZCB3b3JkIChlbnRpcmUpCi0gICBnICB2YXJpYWJsZSBicmFuY2ggb2Zmc2V0IGZvciBicmEgYW5kIHNpbWlsYXIgaW5zdHJ1Y3Rpb25zLgotICAgICAgVGhlIHBsYWNlIHRvIHN0b3JlIGRlcGVuZHMgb24gdGhlIG1hZ25pdHVkZSBvZiBvZmZzZXQuCi0gICB0ICBzdG9yZSBpbiBib3RoIHBsYWNlIDcgYW5kIHBsYWNlIDg7IGZvciBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zCi0gICBjICBicmFuY2ggb2Zmc2V0IGZvciBjcEJjYyBvcGVyYXRpb25zLgotICAgICAgVGhlIHBsYWNlIHRvIHN0b3JlIGlzIHdvcmQgdHdvIGlmIGJpdCBzaXggb2Ygd29yZCBvbmUgaXMgemVybywKLSAgICAgIGFuZCB3b3JkcyB0d28gYW5kIHRocmVlIGlmIGJpdCBzaXggb2Ygd29yZCBvbmUgaXMgb25lLgotICAgaSAgSW5jcmVtZW50IGJ5IHR3bywgdG8gc2tpcCBvdmVyIGNvcHJvY2Vzc29yIGV4dGVuZGVkIG9wZXJhbmRzLiAgIE9ubHkKLSAgICAgIHdvcmtzIHdpdGggdGhlICdJJyBmb3JtYXQuCi0gICBrICBEeW5hbWljIEstZmFjdG9yIGZpZWxkLiAgIEJpdHMgNi00IG9mIHdvcmQgMiwgdXNlZCBhcyBhIHJlZ2lzdGVyIG51bWJlci4KLSAgICAgIEFsc28gdXNlZCBmb3IgZHluYW1pYyBmbW92ZW0gaW5zdHJ1Y3Rpb24uCi0gICBDICBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBjb25zdGFudCAtIDcgYml0cy4gIEFsc28gdXNlZCBmb3Igc3RhdGljCi0gICAgICBLLWZhY3RvcnMuLi4KLSAgIGogIE1vdmVjIHJlZ2lzdGVyICMsIHN0b3JlZCBpbiAxMiBsb3cgYml0cyBvZiBzZWNvbmQgd29yZC4KLSAgIG0gIEZvciBNW1NdQUN4OyA0IGJpdHMgc3BsaXQgd2l0aCBNU0Igc2hpZnRlZCA2IGJpdHMgaW4gZmlyc3Qgd29yZAotICAgICAgYW5kIHJlbWFpbmluZyAzIGJpdHMgb2YgcmVnaXN0ZXIgc2hpZnRlZCA5IGJpdHMgaW4gZmlyc3Qgd29yZC4KLSAgICAgIEluZGljYXRlIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNyBiaXRzIGluIHNlY29uZCB3b3JkLgotICAgICAgVXNlIHdpdGggYFInIG9yIGB1JyBmb3JtYXQuCi0gICBuICBgbScgd2l0aG91dGggdXBwZXIvbG93ZXIgaW5kaWNhdGlvbi4gKEZvciBNW1NdQUN4OyA0IGJpdHMgc3BsaXQKLSAgICAgIHdpdGggTVNCIHNoaWZ0ZWQgNiBiaXRzIGluIGZpcnN0IHdvcmQgYW5kIHJlbWFpbmluZyAzIGJpdHMgb2YKLSAgICAgIHJlZ2lzdGVyIHNoaWZ0ZWQgOSBiaXRzIGluIGZpcnN0IHdvcmQuICBObyB1cHBlci9sb3dlcgotICAgICAgaW5kaWNhdGlvbiBpcyBkb25lLikgIFVzZSB3aXRoIGBSJyBvciBgdScgZm9ybWF0LgotICAgbyAgRm9yIE1bU11BQ3c7IDQgYml0cyBzaGlmdGVkIDEyIGluIHNlY29uZCB3b3JkIChsaWtlIGAxJykuCi0gICAgICBJbmRpY2F0ZSB1cHBlci9sb3dlciBpbiAxIGJpdCBzaGlmdGVkIDcgYml0cyBpbiBzZWNvbmQgd29yZC4KLSAgICAgIFVzZSB3aXRoIGBSJyBvciBgdScgZm9ybWF0LgotICAgTSAgRm9yIE1bU11BQ3c7IDQgYml0cyBpbiBsb3cgYml0cyBvZiBmaXJzdCB3b3JkLiAgSW5kaWNhdGUKLSAgICAgIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNiBiaXRzIGluIHNlY29uZCB3b3JkLiAgVXNlIHdpdGgKLSAgICAgIGBSJyBvciBgdScgZm9ybWF0LgotICAgTiAgRm9yIE1bU11BQ3c7IDQgYml0cyBpbiBsb3cgYml0cyBvZiBzZWNvbmQgd29yZC4gIEluZGljYXRlCi0gICAgICB1cHBlci9sb3dlciBpbiAxIGJpdCBzaGlmdGVkIDYgYml0cyBpbiBzZWNvbmQgd29yZC4gIFVzZSB3aXRoCi0gICAgICBgUicgb3IgYHUnIGZvcm1hdC4KLSAgIGggIHNoaWZ0IGluZGljYXRvciAoc2NhbGUgZmFjdG9yKSwgMSBiaXQgc2hpZnRlZCAxMCBpbiBzZWNvbmQgd29yZAotCi0gUGxhY2VzIHRvIHB1dCBvcGVyYW5kLCBmb3IgZ2VuZXJhbCBvcGVyYW5kczoKLSAgIGQgIGRlc3RpbmF0aW9uLCBzaGlmdGVkIDYgYml0cyBpbiBmaXJzdCB3b3JkCi0gICBiICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIG9uZSBieXRlCi0gICB3ICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIHR3byBieXRlcwotICAgbCAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQsIGFuZCBpbW1lZGlhdGUgdXNlcyBmb3VyIGJ5dGVzCi0gICBzICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZC4KLSAgICAgIFVzZWQgc29tZXRpbWVzIGluIGNvbnRleHRzIHdoZXJlIGltbWVkaWF0ZSBpcyBub3QgYWxsb3dlZCBhbnl3YXkuCi0gICBmICBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyA0IGJ5dGVzCi0gICBGICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyA4IGJ5dGVzCi0gICB4ICBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDEyIGJ5dGVzCi0gICBwICBwYWNrZWQgZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDEyIGJ5dGVzCi0qLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlIG02OGtfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyBtNjhrX29wY29kZV9hbGlhc2VzW107Ci0KLWV4dGVybiBjb25zdCBpbnQgbTY4a19udW1vcGNvZGVzLCBtNjhrX251bWFsaWFzZXM7Ci0KLS8qIGVuZCBvZiBtNjhrLW9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tODhrLmggYi9pbmNsdWRlL29wY29kZS9tODhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2ZhMDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbTg4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBtb3Rvcm9sYSA4OGsgZmFtaWx5LgotICAgQ29weXJpZ2h0IDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICoJCQlEaXNhc3NlbWJsZXIgSW5zdHJ1Y3Rpb24gVGFibGUKLSAqCi0gKglUaGUgZmlyc3QgZmllbGQgb2YgdGhlIHRhYmxlIGlzIHRoZSBvcGNvZGUgZmllbGQuIElmIGFuIG9wY29kZQotICoJaXMgc3BlY2lmaWVkIHdoaWNoIGhhcyBhbnkgbm9uLW9wY29kZSBiaXRzIG9uLCBhIHN5c3RlbSBlcnJvcgotICoJd2lsbCBvY2N1ciB3aGVuIHRoZSBzeXN0ZW0gYXR0ZW1wdHMgdGhlIGluc3RhbGwgaXQgaW50byB0aGUKLSAqCWluc3RydWN0aW9uIHRhYmxlLiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZQotICoJaW5zdHJ1Y3Rpb24gbW5lbW9uaWMuIEVhY2ggb3BlcmFuZCBpcyBzcGVjaWZpZWQgYnkgb2Zmc2V0LCB3aWR0aCwKLSAqCWFuZCB0eXBlLiBUaGUgb2Zmc2V0IGlzIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudAotICoJYml0IG9mIHRoZSBvcGVyYW5kIHdpdGggYml0IDAgYmVpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZgotICoJdGhlIGluc3RydWN0aW9uLiBUaGUgd2lkdGggaXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeQotICoJdGhlIG9wZXJhbmQuIFRoZSB0eXBlIHNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgotICoJdGhlIG9wZXJhbmQuIFRoZSB2YWxpZCBmb3JtYXRzIGFyZTogcmVnaXN0ZXIsIHJlZ2lzdGVyIGluZGlyZWN0LAotICoJaGV4IGNvbnN0YW50LCBhbmQgYml0IGZpZWxkIHNwZWNpZmljYXRpb24uICBUaGUgbGFzdCBmaWVsZCBpcyBhCi0gKglwb2ludGVyIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIGluIHRoZSBsaW5rZWQgbGlzdC4gIFRoZXNlIHBvaW50ZXJzCi0gKglhcmUgaW5pdGlhbGl6ZWQgYnkgaW5pdF9kaXNhc20oKS4KLSAqCi0gKgkJCQlTdHJ1Y3R1cmUgRm9ybWF0Ci0gKgotICogICAgICAgc3RydWN0IElOU1RBQiB7Ci0gKiAgICAgICAgICBVUElOVCBvcGNvZGU7Ci0gKiAgICAgICAgICBjaGFyICptbmVtb25pYzsKLSAqICAgICAgICAgIHN0cnVjdCBPUFNQRUMgb3AxLG9wMixvcDM7Ci0gKiAgICAgICAgICBzdHJ1Y3QgU0lNX0ZMQUdTIGZsZ3M7Ci0gKiAgICAgICAgICBzdHJ1Y3QgSU5TVEFCICpuZXh0OwotICogICAgICAgfQotICoKLSAqICAgICAgIHN0cnVjdCBPUFNQRUMgewotICogICAgICAgICAgVVBJTlQgb2Zmc2V0OjU7Ci0gKiAgICAgICAgICBVUElOVCB3aWR0aDo2OwotICogICAgICAgICAgVVBJTlQgdHlwZTo1OwotICogICAgICAgfQotICoKLSAqCQkJCVJldmlzaW9uIEhpc3RvcnkKLSAqCi0gKglSZXZpc2lvbiAxLjAJMTEvMDgvODUJQ3JlYXRpb24gZGF0ZQotICoJCSAxLjEJMDIvMDUvODYJVXBkYXRlZCBpbnN0cnVjdGlvbiBtbmVtb25pYyB0YWJsZSBNRAotICoJCSAxLjIJMDYvMTYvODYJVXBkYXRlZCBTSU1fRkxBR1MgZm9yIGZsb2F0aW5nIHBvaW50Ci0gKgkJIDEuMwkwOS8yMC84NglVcGRhdGVkIGZvciBuZXcgZW5jb2RpbmcKLSAqCQkgCTA1LzExLzg5CVIuIFRyYXdpY2sgYWRhcHRlZCBmcm9tIE1vdG9yb2xhIGRpc2Fzc2VtYmxlcgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBuZWVkZWQgdG8gYnVpbGQgdGhlIE04ODAwMAotICogc2ltdWxhdG9yLiAgSXQgaXMgdGhlIG1haW4gaW5jbHVkZSBmaWxlLCBjb250YWluaW5nIGFsbCB0aGUKLSAqIHN0cnVjdHVyZXMsIG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgZXhjZXB0IGZvciB0aGUgZmxvYXRpbmcgcG9pbnQKLSAqIGluc3RydWN0aW9uIHNldC4KLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBmbGFnIGluZm9ybXMgdGhlIFNpbXVsYXRvciBhcyB0byB3aGF0IHR5cGUgb2YgYnl0ZSBvcmRlcmluZwotICogd2lsbCBiZSB1c2VkLiBGb3IgaW5zdGFuY2UsIGEgQk9GTEFHID0gMSBpbmRpY2F0ZXMgYSBERUMgVkFYIGFuZCBJQk0gdHlwZQotICogb2Ygb3JkZXJpbmcgc2hhbGwgYmUgdXNlZC4KLSovCi0KLS8qICMgZGVmaW5lICAgICBCT0ZMQUcgICAxICovICAgICAgICAgICAgICAgICAgICAgICAvKiBCWVRFIE9SREVSSU5HIEZMQUcgKi8KLQotLyogZGVmaW5lIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgcHJpbWFyeSBvcGNvZGUgZmllbGQgb2YgdGhlIGluc3RydWN0aW9uLAotICogdGhlIGRlc3RpbmF0aW9uIGZpZWxkLCB0aGUgc291cmNlIDEgYW5kIHNvdXJjZSAyIGZpZWxkcy4KLSAqLwotIyBkZWZpbmUgICAgT1AgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygb3Bjb2RlIGZpZWxkICovCi0jIGRlZmluZSAgICBERVNUICAgICA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBkZXN0aW5hdGlvbiAgKi8KLSMgZGVmaW5lICAgIFNPVVJDRTEgIDYgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHNvdXJjZTEgICAgICAqLwotIyBkZWZpbmUgICAgU09VUkNFMiAgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc291cmNlMiAgICAgICovCi0KLSMgZGVmaW5lICAgIFJFR3MgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzICAqLwotCi0jIGRlZmluZSAgICBXT1JEICAgIGxvbmcKLSMgZGVmaW5lICAgIEZMQUcgICAgdW5zaWduZWQKLSMgZGVmaW5lICAgIFNUQVRFICAgc2hvcnQKLQotIyBkZWZpbmUgICAgVFJVRSAgICAgMQotIyBkZWZpbmUgICAgRkFMU0UgICAgMAotCi0jIGRlZmluZSAgICBSRUFEICAgICAwCi0jIGRlZmluZSAgICBXUklURSAgICAxCi0KLS8qIFRoZSBuZXh0IGZvdXIgZXF1YXRlcyBkZWZpbmUgdGhlIHByaW9yaXRpZXMgdGhhdCB0aGUgdmFyaW91cyBjbGFzc2VzCi0gKiBvZiBpbnN0cnVjdGlvbnMgaGF2ZSByZWdhcmRpbmcgd3JpdGluZyByZXN1bHRzIGJhY2sgaW50byByZWdpc3RlcnMgYW5kCi0gKiBzaWduYWxsaW5nIGV4Y2VwdGlvbnMuCi0gKi8KLS8qIFBNRU0gaXMgYWxzbyBkZWZpbmVkIGluIDxzeXMvcGFyYW0uaD4gb24gRGVsdGEgODgncy4gIFNpZ2ghICAqLwotI3VuZGVmIFBNRU0KLQotIyBkZWZpbmUgICAgUElOVCAgMCAgIC8qIEludGVnZXIgUHJpb3JpdHkgKi8KLSMgZGVmaW5lICAgIFBGTFQgIDEgICAvKiBGbG9hdGluZyBQb2ludCBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgUE1FTSAgMiAgIC8qIE1lbW9yeSBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgTkEgICAgMyAgIC8qIE5vdCBBcHBsaWNhYmxlLCBpbnN0cnVjdGlvbiBkb2VzbnQgd3JpdGUgdG8gcmVncyAqLwotIyBkZWZpbmUgICAgSElQUkkgMyAgIC8qIGhpZ2hlc3Qgb2YgdGhlc2UgcHJpb3JpdGllcyAqLwotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXJzIGFyZSBhbiBhcnRpZmljaWFsIG1lY2hhbmlzbSB0byBzcGVlZCB1cAotICogc2ltdWxhdG9yIGV4ZWN1dGlvbi4gIEluIHRoZSByZWFsIHByb2Nlc3NvciwgYW4gaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIKLSAqIGlzIDMyIGJpdHMgd2lkZS4gIEluIHRoZSBzaW11bGF0b3IsIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gaXMga2VwdCBpbgotICogYSBzdHJ1Y3R1cmUgZmllbGQgY2FsbGVkIHJhd29wLCBhbmQgdGhlIGluc3RydWN0aW9uIGlzIHBhcnRpYWxseSBkZWNvZGVkLAotICogYW5kIHNwbGl0IGludG8gdmFyaW91cyBmaWVsZHMgYW5kIGZsYWdzIHdoaWNoIG1ha2UgdXAgdGhlIG90aGVyIGZpZWxkcwotICogb2YgdGhlIHN0cnVjdHVyZS4KLSAqIFRoZSBwYXJ0aWFsIGRlY29kZSBpcyBkb25lIHdoZW4gdGhlIGluc3RydWN0aW9ucyBhcmUgaW5pdGlhbGx5IGxvYWRlZAotICogaW50byBzaW11bGF0b3IgbWVtb3J5LiAgVGhlIHNpbXVsYXRvciBjb2RlIG1lbW9yeSBpcyBub3QgYW4gYXJyYXkgb2YKLSAqIDMyIGJpdCB3b3JkcywgYnV0IGlzIGFuIGFycmF5IG9mIGluc3RydWN0aW9uIHJlZ2lzdGVyIHN0cnVjdHVyZXMuCi0gKiBZZXMgdGhpcyB3YXN0ZXMgbWVtb3J5LCBidXQgaXQgZXhlY3V0ZXMgbXVjaCBxdWlja2VyLgotICovCi0KLXN0cnVjdCBJUl9GSUVMRFMgewotCQkgICAgdW5zaWduZWQgICAgICAgIG9wOk9QLAotCQkJCSAgICBkZXN0OiBERVNULAotCQkJCSAgICBzcmMxOiBTT1VSQ0UxLAotCQkJCSAgICBzcmMyOiBTT1VSQ0UyOwotCQkJICAgICAgaW50ICAgbHRuY3ksCi0JCQkJICAgIGV4dGltZSwKLQkJCQkgICAgd2JfcHJpOyAgICAgLyogd3JpdGViYWNrIHByaW9yaXR5ICAgICAqLwotCQkgICAgdW5zaWduZWQgICAgICAgIGltbV9mbGFnczoyLC8qIGltbWVkaWF0ZSBzaXplICAgICAgICAgKi8KLQkJCQkgICAgcnMxX3VzZWQ6MSwgLyogcmVnaXN0ZXIgc291cmNlIDEgdXNlZCAqLwotCQkJCSAgICByczJfdXNlZDoxLCAvKiByZWdpc3RlciBzb3VyY2UgMiB1c2VkICovCi0JCQkJICAgIHJzZF91c2VkOjEsIC8qIHJlZ2lzdGVyIHNvdXJjZS9kZXN0LiB1c2VkICovCi0JCQkJICAgIGNfZmxhZzoxLCAgIC8qIGNvbXBsZW1lbnQgICAgICAqLwotCQkJCSAgICB1X2ZsYWc6MSwgICAvKiB1cHBlciBoYWxmIHdvcmQgKi8KLQkJCQkgICAgbl9mbGFnOjEsICAgLyogZXhlY3V0ZSBuZXh0ICAgICovCi0JCQkJICAgIHdiX2ZsYWc6MSwgIC8qIHVzZXMgd3JpdGViYWNrIHNsb3QgKi8KLQkJCQkgICAgZGVzdF82NDoxLCAgLyogZGVzdCBzaXplICAgICAgICovCi0JCQkJICAgIHMxXzY0OjEsICAgIC8qIHNvdXJjZSAxIHNpemUgICAqLwotCQkJCSAgICBzMl82NDoxLCAgICAvKiBzb3VyY2UgMiBzaXplICAgKi8KLQkJCQkgICAgc2NhbGVfZmxhZzoxLCAvKiBzY2FsZWQgcmVnaXN0ZXIgKi8KLQkJCQkgICAgYnJrX2ZsZzoxOwotICAgICAgICAgICAgICAgICB9OwotCi1zdHJ1Y3QJbWVtX3NlZ3MgewotCXN0cnVjdCBtZW1fd3JkICpzZWc7CQkJLyogcG9pbnRlciAocmV0dXJuZWQgYnkgY2FsbG9jKSB0byBzZWdtZW50ICovCi0JdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsJCQkvKiBiYXNlIGxvYWQgYWRkcmVzcyBmcm9tIGZpbGUgaGVhZGVycyAqLwotCXVuc2lnbmVkIGxvbmcgZW5kYWRkcjsJCQkvKiBFbmRpbmcgYWRkcmVzcyBvZiBzZWdtZW50ICovCi0JaW50CSAgICAgIGZsYWdzOwkJCS8qIHNlZ21lbnQgY29udHJvbCBmbGFncyAobm9uZSBkZWZpbmVkIDEyLzUvODYpICovCi19OwotCi0jZGVmaW5lCU1BWFNFR1MJCSgxMCkJCQkvKiBtYXggbnVtYmVyIG9mIHNlZ21lbnQgYWxsb3dlZCAqLwotI2RlZmluZQlNRU1TRUdTSVpFCShzaXplb2Yoc3RydWN0IG1lbV9zZWdzKSkvKiBzaXplIG9mIG1lbV9zZWdzIHN0cnVjdHVyZSAqLwotCi0KLSNkZWZpbmUgQlJLX1JECQkoMHgwMSkJCQkvKiBicmVhayBvbiBtZW1vcnkgcmVhZCAqLwotI2RlZmluZSBCUktfV1IJCSgweDAyKQkJCS8qIGJyZWFrIG9uIG1lbW9yeSB3cml0ZSAqLwotI2RlZmluZSBCUktfRVhFQwkoMHgwNCkJCQkvKiBicmVhayBvbiBleGVjdXRpb24gKi8KLSNkZWZpbmUJQlJLX0NOVAkJKDB4MDgpCQkJLyogYnJlYWsgb24gdGVybWluYWwgY291bnQgKi8KLQotCi1zdHJ1Y3QJbWVtX3dyZCB7Ci0Jc3RydWN0IElSX0ZJRUxEUyBvcGNvZGU7CQkvKiBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24gYnJlYWsgZG93biAqLwotCXVuaW9uIHsKLQkJdW5zaWduZWQgbG9uZyAgbDsJCS8qIG1lbW9yeSBlbGVtZW50IGJyZWFrIGRvd24gKi8KLQkJdW5zaWduZWQgc2hvcnQgc1syXTsKLQkJdW5zaWduZWQgY2hhciAgY1s0XTsKLQl9IG1lbTsKLX07Ci0KLSNkZWZpbmUJTUVNV1JEU0laRQkoc2l6ZW9mKHN0cnVjdCBtZW1fd3JkKSkJLyogc2l6ZSBvZiBlYWNoIDMyIGJpdCBtZW1vcnkgbW9kZWwgKi8KLQotLyogRXh0ZXJuYWwgZGVjbGFyYXRpb25zICovCi0KLWV4dGVybglzdHJ1Y3QgbWVtX3NlZ3MgbWVtb3J5W107Ci1leHRlcm4Jc3RydWN0IFBST0NFU1NPUiBtNzgwMDA7Ci0KLXN0cnVjdCAgUFJPQ0VTU09SICAgewotCSAgICAgdW5zaWduZWQgV09SRAotCQkJICAgIGlwLCAgICAgICAgICAvKiBleGVjdXRlIGluc3RydWN0aW9uIHBvaW50ZXIgKi8KLQkJCSAgICB2YnIsICAgICAgICAgLyogdmVjdG9yIGJhc2UgcmVnaXN0ZXIgKi8KLQkJCSAgICBwc3I7ICAgICAgICAgLyogcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciAqLwotCi0JCSAgICBXT1JEICAgIFMxYnVzLCAvKiBzb3VyY2UgMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMyYnVzLCAvKiBzb3VyY2UgMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERidXMsICAvKiBkZXN0aW5hdGlvbiAqLwotCQkJICAgIERBYnVzLCAvKiBkYXRhIGFkZHJlc3MgYnVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxVLAotCQkJICAgIFJlZ3NbUkVHc10sICAgICAgIC8qIGRhdGEgcmVnaXN0ZXJzICovCi0JCQkgICAgdGltZV9sZWZ0W1JFR3NdLCAgLyogbWF4IGNsb2NrcyBiZWZvcmUgcmVnIGlzIGF2YWlsYWJsZSAqLwotCQkJICAgIHdiX3ByaVtSRUdzXSwgICAgIC8qIHdyaXRlYmFjayBwcmlvcml0eSBvZiByZWcgKi8KLQkJCSAgICBTRlUwX3JlZ3NbUkVHc10sICAvKiBpbnRlZ2VyIHVuaXQgY29udHJvbCByZWdzICovCi0JCQkgICAgU0ZVMV9yZWdzW1JFR3NdLCAgLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdzICovCi0JCQkgICAgU2NvcmVib2FyZFtSRUdzXSwKLQkJCSAgICBWYnI7Ci0JICAgIHVuc2lnbmVkIFdPUkQgICBzY29yZWJvYXJkLAotCQkJICAgIFBzdywKLQkJCSAgICBUcHN3OwotCQkgICAgRkxBRyAgIGp1bXBfcGVuZGluZzoxOyAgIC8qIHdhaXRpbmcgZm9yIGEganVtcCBpbnN0ci4gKi8KLSAgICAgICAgICAgICAgICAgICAgfTsKLQotIyBkZWZpbmUgICAgaTI2Yml0ICAgICAgMSAgICAvKiBzaXplIG9mIGltbWVkaWF0ZSBmaWVsZCAqLwotIyBkZWZpbmUgICAgaTE2Yml0ICAgICAgMgotIyBkZWZpbmUgICAgaTEwYml0ICAgICAgMwotCi0vKiBEZWZpbml0aW9ucyBmb3IgZmllbGRzIGluIHBzciAqLwotCi0jIGRlZmluZSBtb2RlICAzMQotIyBkZWZpbmUgcmJvICAgMzAKLSMgZGVmaW5lIHNlciAgIDI5Ci0jIGRlZmluZSBjYXJyeSAyOAotIyBkZWZpbmUgc2Y3bSAgMTEKLSMgZGVmaW5lIHNmNm0gIDEwCi0jIGRlZmluZSBzZjVtICAgOQotIyBkZWZpbmUgc2Y0bSAgIDgKLSMgZGVmaW5lIHNmM20gICA3Ci0jIGRlZmluZSBzZjJtICAgNgotIyBkZWZpbmUgc2YxbSAgIDUKLSMgZGVmaW5lIG1hbSAgICA0Ci0jIGRlZmluZSBpbm0gICAgMwotIyBkZWZpbmUgZXhtICAgIDIKLSMgZGVmaW5lIHRybSAgICAxCi0jIGRlZmluZSBvdmZtICAgMAotCi0jZGVmaW5lCSAgICBNT0RFTUFTSyAgICgxPDwobW9kZS0xKSkKLSMgZGVmaW5lICAgIFNJTEVOVCAgICAgMCAgIC8qIHNpbXVsYXRlIHdpdGhvdXQgb3V0cHV0IHRvIGNydCAqLwotIyBkZWZpbmUgICAgVkVSQk9TRSAgICAxICAgLyogc2ltdWxhdGUgaW4gdmVyYm9zZSBtb2RlICovCi0jIGRlZmluZSAgICBQUl9JTlNUUiAgIDIgICAvKiBvbmx5IHByaW50IGluc3RydWN0aW9ucyAqLwotCi0jIGRlZmluZSAgICBSRVNFVCAgICAgIDE2IC8qIHJlc2V0IHBoYXNlICovCi0KLSMgZGVmaW5lICAgIFBIQVNFMSAgICAgMCAgLyogZGF0YSBwYXRoIHBoYXNlcyAqLwotIyBkZWZpbmUgICAgUEhBU0UyICAgICAxCi0KLS8qIHRoZSAxIGNsb2NrIG9wZXJhdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgQUREVSAgICAgICAgMQotIyBkZWZpbmUgICAgQUREQyAgICAgICAgMgotIyBkZWZpbmUgICAgQUREVUMgICAgICAgMwotIyBkZWZpbmUgICAgQUREICAgICAgICAgNAotCi0jIGRlZmluZSAgICBTVUJVICAgIEFERCsxCi0jIGRlZmluZSAgICBTVUJCICAgIEFERCsyCi0jIGRlZmluZSAgICBTVUJVQiAgIEFERCszCi0jIGRlZmluZSAgICBTVUIgICAgIEFERCs0Ci0KLSMgZGVmaW5lICAgIEFORF8gICAgQUREKzUKLSMgZGVmaW5lICAgIE9SICAgICAgQUREKzYKLSMgZGVmaW5lICAgIFhPUiAgICAgQUREKzcKLSMgZGVmaW5lICAgIENNUCAgICAgQUREKzgKLQotLyogdGhlIExPQURTICovCi0KLSMgZGVmaW5lICAgIExEQUIgICAgQ01QKzEKLSMgZGVmaW5lICAgIExEQUggICAgQ01QKzIKLSMgZGVmaW5lICAgIExEQSAgICAgQ01QKzMKLSMgZGVmaW5lICAgIExEQUQgICAgQ01QKzQKLQotIyBkZWZpbmUgICAgTERCICAgTERBRCsxCi0jIGRlZmluZSAgICBMREggICBMREFEKzIKLSMgZGVmaW5lICAgIExEICAgIExEQUQrMwotIyBkZWZpbmUgICAgTEREICAgTERBRCs0Ci0jIGRlZmluZSAgICBMREJVICBMREFEKzUKLSMgZGVmaW5lICAgIExESFUgIExEQUQrNgotCi0vKiB0aGUgU1RPUkVTICovCi0KLSMgZGVmaW5lICAgIFNUQiAgICBMREhVKzEKLSMgZGVmaW5lICAgIFNUSCAgICBMREhVKzIKLSMgZGVmaW5lICAgIFNUICAgICBMREhVKzMKLSMgZGVmaW5lICAgIFNURCAgICBMREhVKzQKLQotLyogdGhlIGV4Y2hhbmdlICovCi0KLSMgZGVmaW5lICAgIFhNRU1CVSBMREhVKzUKLSMgZGVmaW5lICAgIFhNRU0gICBMREhVKzYKLQotLyogdGhlIGJyYW5jaGVzICovCi0jIGRlZmluZSAgICBKU1IgICAgU1REKzEKLSMgZGVmaW5lICAgIEJTUiAgICBTVEQrMgotIyBkZWZpbmUgICAgQlIgICAgIFNURCszCi0jIGRlZmluZSAgICBKTVAgICAgU1REKzQKLSMgZGVmaW5lICAgIEJCMSAgICBTVEQrNQotIyBkZWZpbmUgICAgQkIwICAgIFNURCs2Ci0jIGRlZmluZSAgICBSVE4gICAgU1REKzcKLSMgZGVmaW5lICAgIEJDTkQgICBTVEQrOAotCi0vKiB0aGUgVFJBUFMgKi8KLSMgZGVmaW5lICAgIFRCMSAgICBCQ05EKzEKLSMgZGVmaW5lICAgIFRCMCAgICBCQ05EKzIKLSMgZGVmaW5lICAgIFRDTkQgICBCQ05EKzMKLSMgZGVmaW5lICAgIFJURSAgICBCQ05EKzQKLSMgZGVmaW5lICAgIFRCTkQgICBCQ05EKzUKLQotLyogdGhlIE1JU0MgaW5zdHJ1Y3Rpb25zICovCi0jIGRlZmluZSAgICBNVUwgICAgIFRCTkQgKyAxCi0jIGRlZmluZSAgICBESVYgICAgIE1VTCAgKzIKLSMgZGVmaW5lICAgIERJVlUgICAgTVVMICArMwotIyBkZWZpbmUgICAgTUFTSyAgICBNVUwgICs0Ci0jIGRlZmluZSAgICBGRjAgICAgIE1VTCAgKzUKLSMgZGVmaW5lICAgIEZGMSAgICAgTVVMICArNgotIyBkZWZpbmUgICAgQ0xSICAgICBNVUwgICs3Ci0jIGRlZmluZSAgICBTRVQgICAgIE1VTCAgKzgKLSMgZGVmaW5lICAgIEVYVCAgICAgTVVMICArOQotIyBkZWZpbmUgICAgRVhUVSAgICBNVUwgICsxMAotIyBkZWZpbmUgICAgTUFLICAgICBNVUwgICsxMQotIyBkZWZpbmUgICAgUk9UICAgICBNVUwgICsxMgotCi0vKiBjb250cm9sIHJlZ2lzdGVyIG1hbmlwdWxhdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgTERDUiAgICBST1QgICsxCi0jIGRlZmluZSAgICBTVENSICAgIFJPVCAgKzIKLSMgZGVmaW5lICAgIFhDUiAgICAgUk9UICArMwotCi0jIGRlZmluZSAgICBGTERDUiAgICBST1QgICs0Ci0jIGRlZmluZSAgICBGU1RDUiAgICBST1QgICs1Ci0jIGRlZmluZSAgICBGWENSICAgICBST1QgICs2Ci0KLQotIyBkZWZpbmUgICAgTk9QICAgICBYQ1IgKzEKLQotLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0KLSMgZGVmaW5lICAgIEZBREQgICAgTk9QICsxCi0jIGRlZmluZSAgICBGU1VCICAgIE5PUCArMgotIyBkZWZpbmUgICAgRk1VTCAgICBOT1AgKzMKLSMgZGVmaW5lICAgIEZESVYgICAgTk9QICs0Ci0jIGRlZmluZSAgICBGU1FSVCAgIE5PUCArNQotIyBkZWZpbmUgICAgRkNNUCAgICBOT1AgKzYKLSMgZGVmaW5lICAgIEZJUCAgICAgTk9QICs3Ci0jIGRlZmluZSAgICBGTFQgICAgIE5PUCArOAotIyBkZWZpbmUgICAgSU5UICAgICBOT1AgKzkKLSMgZGVmaW5lICAgIE5JTlQgICAgTk9QICsxMAotIyBkZWZpbmUgICAgVFJOQyAgICBOT1AgKzExCi0jIGRlZmluZSAgICBGTERDICAgTk9QICsxMgotIyBkZWZpbmUgICAgRlNUQyAgIE5PUCArMTMKLSMgZGVmaW5lICAgIEZYQyAgICBOT1AgKzE0Ci0KLSMgZGVmaW5lIFVFWFQoc3JjLG9mZix3aWQpICgoKCh1bnNpZ25lZCBpbnQpKHNyYykpPj4ob2ZmKSkgJiAoKDE8PCh3aWQpKSAtIDEpKQotIyBkZWZpbmUgU0VYVChzcmMsb2ZmLHdpZCkgKCgoKChpbnQpKHNyYykpPDwoMzItKChvZmYpKyh3aWQpKSkpID4+KDMyLSh3aWQpKSkgKQotIyBkZWZpbmUgTUFLRShzcmMsb2ZmLHdpZCkgXAotICAoKCgodW5zaWduZWQgaW50KShzcmMpKSAmICgoMTw8KHdpZCkpIC0gMSkpIDw8IChvZmYpKQotCi0jIGRlZmluZSBvcHdvcmQobikgKHVuc2lnbmVkIGxvbmcpIChtZW1hZGRyLT5tZW0ubCkKLQotLyogIENvbnN0YW50cyBhbmQgTWFza3MgKi8KLQotI2RlZmluZSBTRlUwICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgU0ZVMSAgICAgICAweDg0MDAwMDAwCi0jZGVmaW5lIFNGVTcgICAgICAgMHg5YzAwMDAwMAotI2RlZmluZSBSUkkxMCAgICAgIDB4ZjAwMDAwMDAKLSNkZWZpbmUgUlJSICAgICAgICAweGY0MDAwMDAwCi0jZGVmaW5lIFNGVU1BU0sgICAgMHhmYzAwZmZlMAotI2RlZmluZSBSUlJNQVNLICAgIDB4ZmMwMGZmZTAKLSNkZWZpbmUgUlJJMTBNQVNLICAweGZjMDBmYzAwCi0jZGVmaW5lIERFRk1BU0sgICAgMHhmYzAwMDAwMAotI2RlZmluZSBDVFJMICAgICAgIDB4MDAwMGYwMDAKLSNkZWZpbmUgQ1RSTE1BU0sgICAweGZjMDBmODAwCi0KLS8qIE9wZXJhbmRzIHR5cGVzICovCi0KLWVudW0gb3BlcmFuZF90eXBlIHsKLSAgSEVYID0gMSwKLSAgUkVHID0gMiwKLSAgQ09OVCA9IDMsCi0gIElORCA9IDMsCi0gIEJGID0gNCwKLSAgUkVHU0MgPSA1ICAgIC8qIHNjYWxlZCByZWdpc3RlciAqLywKLSAgQ1JSRUcgPSA2ICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8sCi0gIEZDUlJFRyA9IDcgICAgLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciAqLywKLSAgUENSRUwgPSA4LAotICBDT05ETUFTSyA9IDksCi0gIFhSRUcgPSAxMCwgLyogZXh0ZW5kZWQgcmVnaXN0ZXIgKi8KLSAgREVDID0gMTEsIC8qIGRlY2ltYWwgKi8KLX07Ci0KLS8qIEhhc2hpbmcgU3BlY2lmaWNhdGlvbiAqLwotCi0jZGVmaW5lIEhBU0hWQUwgICAgIDc5Ci0KLS8qIFR5cGUgZGVmaW5pdGlvbnMgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKLQotLyogU3RydWN0dXJlIHRlbXBsYXRlcyAqLwotCi0jaWYgbmV2ZXIKLXR5cGVkZWYgc3RydWN0IHsKLSAgIHVuc2lnbmVkIGludCBvZmZzZXQ6NTsKLSAgIHVuc2lnbmVkIGludCB3aWR0aDo2OwotICAgdW5zaWduZWQgaW50IHR5cGU6NTsKLX0gT1BTUEVDOwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0gICBlbnVtIG9wZXJhbmRfdHlwZSB0eXBlOwotfSBPUFNQRUM7Ci0KLQlzdHJ1Y3QgU0lNX0ZMQUdTIHsKLQkgICAgICBpbnQgIGx0bmN5LCAgIC8qIGxhdGVuY3kgKG1heCBudW1iZXIgb2YgY2xvY2tzIG5lZWRlZCB0byBleGVjdXRlKSAqLwotCQkgIGV4dGltZSwgICAvKiBleGVjdXRpb24gdGltZSAobWluIG51bWJlciBvZiBjbG9ja3MgbmVlZGVkIHRvIGV4ZWN1dGUpICovCi0JCSAgd2JfcHJpOyAgIC8qIHdyaXRlYmFjayBzbG90IHByaW9yaXR5ICovCi0gICB1bnNpZ25lZCAgICAgICAgIG9wOk9QLCAgIC8qIHNpbXVsYXRvciB2ZXJzaW9uIG9mIG9wY29kZSAqLwotCSAgICAgaW1tX2ZsYWdzOjIsICAgLyogMTAsMTYgb3IgMjYgYml0IGltbWVkaWF0ZSBmbGFncyAqLwotCSAgICAgIHJzMV91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlIDEgdXNlZCAqLwotCSAgICAgIHJzMl91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlIDIgdXNlZCAqLwotCSAgICAgIHJzZF91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlL2Rlc3QgdXNlZCAqLwotCQljX2ZsYWc6MSwgICAvKiBjb21wbGVtZW50ICovCi0JCXVfZmxhZzoxLCAgIC8qIHVwcGVyIGhhbGYgd29yZCAqLwotCQluX2ZsYWc6MSwgICAvKiBleGVjdXRlIG5leHQgKi8KLQkgICAgICAgd2JfZmxhZzoxLCAgIC8qIHVzZXMgd3JpdGViYWNrIHNsb3QgKi8KLQkgICAgICAgZGVzdF82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gZGVzdCAqLwotCQkgczFfNjQ6MSwgICAvKiBkb3VibGUgcHJlY2lzaW9uIHNvdXJjZSAxICovCi0JCSBzMl82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gc291cmNlIDIgKi8KLQkgICAgc2NhbGVfZmxhZzoxOyAgIC8qIHJlZ2lzdGVyIGlzIHNjYWxlZCAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgSU5TVFJVQ1RBQiB7Ci0gICB1bnNpZ25lZCBpbnQgIG9wY29kZTsKLSAgIGNoYXIgICAgICAgICAgKm1uZW1vbmljOwotICAgT1BTUEVDICAgICAgICBvcDEsb3AyLG9wMzsKLSAgIHN0cnVjdCBTSU1fRkxBR1MgZmxnczsKLSAgIHN0cnVjdCBJTlNUUlVDVEFCICAgICpuZXh0OwotfSBJTlNUQUI7Ci0MCi0KLSNkZWZpbmUgTk9fT1BFUkFORCB7MCwwLDB9Ci0KLS8qIE9wY29kZSAgICAgTW5lbW9uaWMgICAgICAgT3AgMSBTcGVjICAgICBPcCAyIFNwZWMgICAgT3AgMyBTcGVjICAgICAgICAgU2ltZmxhZ3MgICAgICAgICAgICAgTmV4dCAgKi8KLQotc3RhdGljIElOU1RBQiAgaW5zdHJ1Y3Rpb25zW10gPSB7Ci0gIHsweGY0MDBjODAwLCJqc3IgICAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsSlNSICwgICAgICAgICAgMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjYzAwLCJqc3IubiAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsSlNSICwgICAgICAgICAgMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjMDAwLCJqbXAgICAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsSk1QICwgICAgICAgICAgMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjNDAwLCJqbXAubiAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsSk1QICwgICAgICAgICAgMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGM4MDAwMDAwLCJic3IgICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsQlNSICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGNjMDAwMDAwLCJic3IubiAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsQlNSICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGMwMDAwMDAwLCJiciAgICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsQlIgICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGM0MDAwMDAwLCJici5uICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsQlIgICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQwMDAwMDAwLCJiYjAgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDE2LFBDUkVMfSx7MiwyLE5BLEJCMCwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQ0MDAwMDAwLCJiYjAubiAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDE2LFBDUkVMfSx7MSwxLE5BLEJCMCwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQ4MDAwMDAwLCJiYjEgICAgICAgICAiLHsyMSw1LEhFWH0sezE2LDUsUkVHfSAgICAgLHswLDE2LFBDUkVMfSx7MiwyLE5BLEJCMSwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGRjMDAwMDAwLCJiYjEubiAgICAgICAiLHsyMSw1LEhFWH0sezE2LDUsUkVHfSAgICAgLHswLDE2LFBDUkVMfSx7MSwxLE5BLEJCMSwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBkMDAwLCJ0YjAgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDEwLEhFWH0sIHsyLDIsTkEsVEIwICwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBkODAwLCJ0YjEgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDEwLEhFWH0sIHsyLDIsTkEsVEIxICwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGU4MDAwMDAwLCJiY25kICAgICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDE2LFBDUkVMfSx7MiwyLE5BLEJDTkQsICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGVjMDAwMDAwLCJiY25kLm4gICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDE2LFBDUkVMfSx7MSwxLE5BLEJDTkQsICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBlODAwLCJ0Y25kICAgICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDEwLEhFWH0sIHsyLDIsTkEsVENORCwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY4MDAwMDAwLCJ0Ym5kICAgICAgICAiLHsxNiw1LFJFR30gICx7MCwxNixIRVh9ICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsVEJORCwgICAgIGkxMGJpdCwxLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBmODAwLCJ0Ym5kICAgICAgICAiLHsxNiw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsVEJORCwgICAgICAgICAgMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBmYzAwLCJydGUgICAgICAgICAiLE5PX09QRVJBTkQgICAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsUlRFICwgICAgICAgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDFjMDAwMDAwLCJsZC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREIgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxYzAwLCJsZC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREIgICAgICwgICAgMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDBjMDAwMDAwLCJsZC5idSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREJVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwYzAwLCJsZC5idSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREJVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDE4MDAwMDAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREggICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxODAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREggICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxYTAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREggICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDA4MDAwMDAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREhVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwODAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREhVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwYTAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREhVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDE0MDAwMDAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMRCAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNDAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNjAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDEwMDAwMDAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREQgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxMDAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxMjAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweGY0MDAxNTAwLCJsZC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNzAwLCJsZC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDJjMDAwMDAwLCJzdC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1RCICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYzAwLCJzdC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1RCICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDI4MDAwMDAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1RIICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyODAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1RIICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYTAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1RIICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDI0MDAwMDAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1QgICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNDAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDI2MDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHgyMDAwMDAwMCwic3QuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLE5BLFNURCAgICAgICxpMTZiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyMDAwLCJzdC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1REICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDIyMDAsInN0LmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVEQgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMjUwMCwic3QudXNyICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyNzAwLCJzdC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLS8qICBtODgxMDAgb25seToKLSAgezB4MDAwMDAwMDAsInhtZW0uYnUgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLFhNRU1CVSAsaTE2Yml0LDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICovCi0gIHsweGY0MDAwMDAwLCJ4bWVtLmJ1ICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLS8qICBtODgxMDAgb25seToKLSAgezB4MDQwMDAwMDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLFhNRU0gICAsaTE2Yml0LDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICovCi0gIHsweGY0MDAwNDAwLCJ4bWVtICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDA2MDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMDUwMCwieG1lbS51c3IgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAwNzAwLCJ4bWVtLnVzciAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLS8qIG04ODEwMCBvbmx5OgotICB7MHhmNDAwM2UwMCwibGRhLmIgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDNlMDAsImxkYS54ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUgsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwM2EwMCwibGRhLmggICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAzNjAwLCJsZGEgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREEgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDMyMDAsImxkYS5kICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUQsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotCi0gIHsweDgwMDA0MDAwLCJsZGNyICAgICAgICAiLHsyMSw1LFJFR30gICx7NSw2LENSUkVHfSAgLE5PX09QRVJBTkQgICAgLHsxLDEsUElOVCxMRENSLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMDgwMDAsInN0Y3IgICAgICAgICIsezE2LDUsUkVHfSAgLHs1LDYsQ1JSRUd9ICAsTk9fT1BFUkFORCAgICAsezEsMSxQSU5ULFNUQ1IsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwYzAwMCwieGNyICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7NSw2LENSUkVHfSx7MSwxLFBJTlQsWENSLCAgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4ZjQwMDYwMDAsImFkZHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjIwMCwiYWRkdS5jaSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2MTAwLCJhZGR1LmNvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDYzMDAsImFkZHUuY2lvICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjQwMCwic3VidSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NjAwLCJzdWJ1LmNpICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY1MDAsInN1YnUuY28gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjcwMCwic3VidS5jaW8gICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2ODAwLCJkaXZ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszMiwzMixQSU5ULERJVlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjkwMCwiZGl2dS5kICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCx9LCBOVUxMIH0sCi0gIHsweGY0MDA2ZTAwLCJtdWxzICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLH0sIE5VTEwgfSwKLSAgezB4ZjQwMDZjMDAsIm11bHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsNCxQSU5ULE1VTCwgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzAwMCwiYWRkICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MjAwLCJhZGQuY2kgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDcxMDAsImFkZC5jbyAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzMwMCwiYWRkLmNpbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NDAwLCJzdWIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc2MDAsInN1Yi5jaSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzUwMCwic3ViLmNvICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NzAwLCJzdWIuY2lvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc4MDAsImRpdnMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMyLDMyLFBJTlQsRElWICwgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwN2MwMCwiY21wICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQ01QLCAgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4NjAwMDAwMDAsImFkZHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFERFUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg2NDAwMDAwMCwic3VidSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsU1VCVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4NjgwMDAwMDAsImRpdnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMyLDMyLFBJTlQsRElWVSwgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg2YzAwMDAwMCwibXVsdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7NCwxLFBJTlQsTVVMLCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDcwMDAwMDAwLCJhZGQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBREQsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NzQwMDAwMDAsInN1YiAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFNVQiwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg3ODAwMDAwMCwiZGl2cyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MzIsMzIsUElOVCxESVYsICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDdjMDAwMDAwLCJjbXAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxDTVAsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHhmNDAwNDAwMCwiYW5kICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQU5EXyAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA0NDAwLCJhbmQuYyAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBTkRfICAgICAgICAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDU4MDAsIm9yICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE9SICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNWMwMCwib3IuYyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsT1IgICAgICAgICAgLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA1MDAwLCJ4b3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxYT1IgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDU0MDAsInhvci5jICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFhPUiAgICAgICAgICwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg0MDAwMDAwMCwiYW5kICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQU5EXyAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQ0MDAwMDAwLCJhbmQudSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBTkRfICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTgwMDAwMDAsIm9yICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE9SICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1YzAwMDAwMCwib3IudSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsT1IgICAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDUwMDAwMDAwLCJ4b3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxYT1IgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTQwMDAwMDAsInhvci51ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFhPUiAgICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg0ODAwMDAwMCwibWFzayAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsTUFTSyAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDRjMDAwMDAwLCJtYXNrLnUgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxNQVNLICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMGVjMDAsImZmMCAgICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezEsMSxQSU5ULEZGMCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwZTgwMCwiZmYxICAgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7MSwxLFBJTlQsRkYxICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA4MDAwLCJjbHIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxDTFIgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDg4MDAsInNldCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULFNFVCAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwOTAwMCwiZXh0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsRVhUICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA5ODAwLCJleHR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxFWFRVICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMGEwMDAsIm1hayAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULE1BSyAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwYTgwMCwicm90ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsUk9UICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA4MDAwLCJjbHIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxDTFIgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDg4MDAsInNldCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNFVCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwOTAwMCwiZXh0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsRVhUICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA5ODAwLCJleHR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxFWFRVICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMGEwMDAsIm1hayAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE1BSyAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwYTgwMCwicm90ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsUk9UICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4ODQwMDI4MDAsImZhZGQuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjg4MCwiZmFkZC5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyYTAwLCJmYWRkLnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhODAsImZhZGQuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjgyMCwiZmFkZC5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyOGEwLCJmYWRkLmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhMjAsImZhZGQuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmFhMCwiZmFkZC5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMDAwLCJmc3ViLnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs1LDEsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwODAsImZzdWIuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzIwMCwiZnN1Yi5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjgwLCJmc3ViLnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwMjAsImZzdWIuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzBhMCwiZnN1Yi5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjIwLCJmc3ViLmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyYTAsImZzdWIuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDAwMCwiZm11bC5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDgwLCJmbXVsLnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAyMDAsImZtdWwuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDI4MCwiZm11bC5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDIwLCJmbXVsLmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwYTAsImZtdWwuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDIyMCwiZm11bC5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMmEwLCJmbXVsLmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcwMDAsImZkaXYuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMwLDMwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzA4MCwiZmRpdi5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MjAwLCJmZGl2LnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyODAsImZkaXYuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzAyMCwiZmRpdi5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MGEwLCJmZGl2LmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyMjAsImZkaXYuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzJhMCwiZmRpdi5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3ODAwLCJmc3FydC5zcyAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4MjAsImZzcXJ0LnNkICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzg4MCwiZnNxcnQuZHMgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3OGEwLCJmc3FydC5kZCAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDM4MDAsImZjbXAuc3MgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzg4MCwiZmNtcC5zZCAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzYTAwLCJmY21wLmRzICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDNhODAsImZjbXAuZGQgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjAwMCwiZmx0LnMgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyMDIwLCJmbHQuZCAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDQ4MDAsImludC5zICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNDg4MCwiaW50LmQgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1MDAwLCJuaW50LnMgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDUwODAsIm5pbnQuZCAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNTgwMCwidHJuYy5zICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsVFJOQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1ODgwLCJ0cm5jLmQgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxUUk5DICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg4MDAwNDgwMCwiZmxkY3IgICAgICAgIix7MjEsNSxSRUd9ICAsezUsNixGQ1JSRUd9ICxOT19PUEVSQU5EICAgLCB7MSwxLFBGTFQsRkxEQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDgwMDA4ODAwLCJmc3RjciAgICAgICAiLHsxNiw1LFJFR30gICx7NSw2LEZDUlJFR30gLE5PX09QRVJBTkQgICAsIHsxLDEsUEZMVCxGU1RDICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMGM4MDAsImZ4Y3IgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezUsNixGQ1JSRUd9ICwgezEsMSxQRkxULEZYQyAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBuZXcgZm9yIHRoZSA4ODExMC4gKi8KLQotICB7MHg4NDAwYWFhMCwiZmFkZC5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhODAsImZhZGQuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYWMwLCJmYWRkLmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWEyMCwiZmFkZC5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhMDAsImZhZGQuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYTQwLCJmYWRkLmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWIyMCwiZmFkZC5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFiMDAsImZhZGQuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYjQwLCJmYWRkLmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYThhMCwiZmFkZC5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4ODAsImZhZGQuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOGMwLCJmYWRkLnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTgyMCwiZmFkZC5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4MDAsImZhZGQuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhODQwLCJmYWRkLnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTkyMCwiZmFkZC5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE5MDAsImZhZGQuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOTQwLCJmYWRkLnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWNhMCwiZmFkZC54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjODAsImZhZGQueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhY2MwLCJmYWRkLnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWMyMCwiZmFkZC54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjMDAsImZhZGQueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYzQwLCJmYWRkLnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWQyMCwiZmFkZC54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFkMDAsImZhZGQueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhZDQwLCJmYWRkLnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBiYTgwLCJmY21wLnNkZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYTAwLCJmY21wLnNkcyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYjAwLCJmY21wLnNkeCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiODgwLCJmY21wLnNzZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiODAwLCJmY21wLnNzcyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiOTAwLCJmY21wLnNzeCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYzgwLCJmY21wLnN4ZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYzAwLCJmY21wLnN4cyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiZDAwLCJmY21wLnN4eCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGJhYTAsImZjbXB1LnNkZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJhMjAsImZjbXB1LnNkcyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJiMjAsImZjbXB1LnNkeCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4YTAsImZjbXB1LnNzZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4MjAsImZjbXB1LnNzcyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI5MjAsImZjbXB1LnNzeCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjYTAsImZjbXB1LnN4ZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjMjAsImZjbXB1LnN4cyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJkMjAsImZjbXB1LnN4eCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwMDgyMCwiZmN2dC5zZCAgICAgIix7MjEsNSxSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDA4ODAsImZjdnQuZHMgICAgICIsezIxLDUsUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDg4ODAsImZjdnQuZHMgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4YzAsImZjdnQuZHggICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4MjAsImZjdnQuc2QgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4NDAsImZjdnQuc3ggICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg5MjAsImZjdnQueGQgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg5MDAsImZjdnQueHMgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZjJhMCwiZmRpdi5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyODAsImZkaXYuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMmMwLCJmZGl2LmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjIyMCwiZmRpdi5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyMDAsImZkaXYuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMjQwLCJmZGl2LmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjMyMCwiZmRpdi5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYzMDAsImZkaXYuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMzQwLCJmZGl2LmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjBhMCwiZmRpdi5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwODAsImZkaXYuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMGMwLCJmZGl2LnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjAyMCwiZmRpdi5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwMDAsImZkaXYuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMDQwLCJmZGl2LnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjEyMCwiZmRpdi5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYxMDAsImZkaXYuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMTQwLCJmZGl2LnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjRhMCwiZmRpdi54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0ODAsImZkaXYueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNGMwLCJmZGl2LnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQyMCwiZmRpdi54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0MDAsImZkaXYueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNDQwLCJmZGl2LnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjUyMCwiZmRpdi54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY1MDAsImZkaXYueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNTQwLCJmZGl2Lnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDAyMjIwLCJmbHQuZHMgICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDIyMDAsImZsdC5zcyAgICAgICIsezIxLDUsWFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMjI0MCwiZmx0LnhzICAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDgyYTAsImZtdWwuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjgwLCJmbXVsLmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODJjMCwiZm11bC5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyMjAsImZtdWwuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjAwLCJmbXVsLmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODI0MCwiZm11bC5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgzMjAsImZtdWwuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MzAwLCJmbXVsLmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODM0MCwiZm11bC5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwYTAsImZtdWwuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDgwLCJmbXVsLnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODBjMCwiZm11bC5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwMjAsImZtdWwuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDAwLCJmbXVsLnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODA0MCwiZm11bC5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgxMjAsImZtdWwuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MTAwLCJmbXVsLnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODE0MCwiZm11bC5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0YTAsImZtdWwueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDgwLCJmbXVsLnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODRjMCwiZm11bC54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0MjAsImZtdWwueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDAwLCJmbXVsLnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODQ0MCwiZm11bC54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg1MjAsImZtdWwueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NTAwLCJmbXVsLnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODU0MCwiZm11bC54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZjhhMCwiZnNxcnQuZGQgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODgwLCJmc3FydC5kcyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4YzAsImZzcXJ0LmR4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjgyMCwiZnNxcnQuc2QgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODAwLCJmc3FydC5zcyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4NDAsImZzcXJ0LnN4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjkyMCwiZnNxcnQueGQgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmOTAwLCJmc3FydC54cyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY5NDAsImZzcXJ0Lnh4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBiMmEwLCJmc3ViLmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjI4MCwiZnN1Yi5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyYzAsImZzdWIuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjIwLCJmc3ViLmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjIwMCwiZnN1Yi5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyNDAsImZzdWIuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMzIwLCJmc3ViLmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjMwMCwiZnN1Yi5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIzNDAsImZzdWIuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMGEwLCJmc3ViLnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjA4MCwiZnN1Yi5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwYzAsImZzdWIuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDIwLCJmc3ViLnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjAwMCwiZnN1Yi5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwNDAsImZzdWIuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMTIwLCJmc3ViLnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjEwMCwiZnN1Yi5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIxNDAsImZzdWIuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNGEwLCJmc3ViLnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQ4MCwiZnN1Yi54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0YzAsImZzdWIueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDIwLCJmc3ViLnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQwMCwiZnN1Yi54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0NDAsImZzdWIueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNTIwLCJmc3ViLnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjUwMCwiZnN1Yi54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI1NDAsImZzdWIueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGZjMDAsImlsbG9wIiwgezAsMixERUN9LCBOT19PUEVSQU5ELCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYzgwMCwiaW50LnNzICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBjODgwLCJpbnQuc2QgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGM5MDAsImludC5zeCAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDA0MDAwMDAwLCJsZCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDAwMDAwMDAwLCJsZC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDNjMDAwMDAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDE0MDAsImxkICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTAwMCwibGQuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxODAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE1MDAsImxkLnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTEwMCwibGQuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxOTAwLCJsZC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMTYwMCwibGQgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDEyMDAsImxkLmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxYTAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTcwMCwibGQudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDEzMDAsImxkLmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxYjAwLCJsZC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBjMDAwLCJtb3YucyAgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGMwODAsIm1vdi5kICAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwNDIwMCwibW92LnMgICAgICAgIiwgezIxLDUsWFJFR30sIHswLDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA0MjgwLCJtb3YuZCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezAsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGMzMDAsIm1vdiAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwNmQwMCwibXVsdS5kICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZDA4MCwibmludC5zZCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkMDAwLCJuaW50LnNzICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQxMDAsIm5pbnQuc3ggICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAyMDIwLCJwYWRkLmIgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjA0MCwicGFkZC5oICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwNjAsInBhZGQgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDIxZTAsInBhZGRzLnMgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMWEwLCJwYWRkcy5zLmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjFjMCwicGFkZHMucy5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwZTAsInBhZGRzLnUgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMGEwLCJwYWRkcy51LmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjBjMCwicGFkZHMudS5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxNjAsInBhZGRzLnVzICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMTIwLCJwYWRkcy51cy5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjE0MCwicGFkZHMudXMuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMzg2MCwicGNtcCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMDAwMCwicG11bCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwNjI2MCwicHBhY2suMTYgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDYyNDAsInBwYWNrLjE2LmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2NDYwLCJwcGFjay4zMiAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjQyMCwicHBhY2suMzIuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDY0NDAsInBwYWNrLjMyLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2MTYwLCJwcGFjay44ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDA3MjAwLCJwcm90ICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7NSw2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNzgwMCwicHJvdCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMzAyMCwicHN1Yi5iICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwNDAsInBzdWIuaCAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMDYwLCJwc3ViICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzMWUwLCJwc3Vicy5zICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzFhMCwicHN1YnMucy5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxYzAsInBzdWJzLnMuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMGUwLCJwc3Vicy51ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzBhMCwicHN1YnMudS5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwYzAsInBzdWJzLnUuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMTYwLCJwc3Vicy51cyAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzEyMCwicHN1YnMudXMuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxNDAsInBzdWJzLnVzLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDY4MDAsInB1bnBrLm4gICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjgyMCwicHVucGsuYiAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4MzQwMDAwMDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MzAwMDAwMDAsInN0LmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MzgwMDAwMDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwMmM4MCwic3QuYi53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI4ODAsInN0Lmgud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNDgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjA4MCwic3QuZC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJkODAsInN0LmIudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyOTgwLCJzdC5oLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjU4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDIxODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDI0MDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjAwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMTAwLCJzdC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIxODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjA4MCwic3QuZC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNTAwLCJzdC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI1ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjQ4MCwic3Qud3QgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyODAwLCJzdC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI5MDAsInN0LngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjk4MCwic3QueC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyODgwLCJzdC54Lnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwMmY4MCwic3QuYi51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmU4MCwic3QuYi53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjM4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjI4MCwic3QuZC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmI4MCwic3QuaC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmE4MCwic3QuaC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjc4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjY4MCwic3Qud3QgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGYwMDAyNjAwLCJzdCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjIwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIzMDAsInN0LmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMzgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjI4MCwic3QuZC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI3MDAsInN0LnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNzgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjY4MCwic3Qud3QgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJhMDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyYjAwLCJzdC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmI4MCwic3QueC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJhODAsInN0Lngud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGQ4ODAsInRybmMuc2QgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZDgwMCwidHJuYy5zcyAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkOTAwLCJ0cm5jLnN4ICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotfTsKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbWlwcy5oIGIvaW5jbHVkZS9vcGNvZGUvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE4YzdlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyMyArMCwwIEBACi0vKiBtaXBzLmguICBNaXBzIG9wY29kZSBsaXN0IGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJhbHBoIENhbXBiZWxsIGFuZCBPU0YKLSAgIENvbW1lbnRlZCBhbmQgbW9kaWZpZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTUlQU19IXwotI2RlZmluZSBfTUlQU19IXwotCi0vKiBUaGVzZSBhcmUgYml0IG1hc2tzIGFuZCBzaGlmdCBjb3VudHMgdG8gdXNlIHRvIGFjY2VzcyB0aGUgdmFyaW91cwotICAgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uLiAgVG8gcmV0cmlldmUgdGhlIFggZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLCB1c2UgdGhlIGV4cHJlc3Npb24KLQkoaSA+PiBPUF9TSF9YKSAmIE9QX01BU0tfWAotICAgVG8gc2V0IHRoZSBzYW1lIGZpZWxkICh0byBqKSwgdXNlCi0JaSA9IChpICZ+IChPUF9NQVNLX1ggPDwgT1BfU0hfWCkpIHwgKGogPDwgT1BfU0hfWCkKLQotICAgTWFrZSBzdXJlIHlvdSB1c2UgZmllbGRzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW5zdHJ1Y3Rpb24sCi0gICBvZiBjb3Vyc2UuICAKLQotICAgVGhlICdpJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBJTU1FRElBVEUuICAKLQotICAgVGhlICdqJyBmb3JtYXQgdXNlcyBPUCBhbmQgVEFSR0VULgotCi0gICBUaGUgJ3InIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQsIFJELCBTSEFNVCBhbmQgRlVOQ1QuCi0KLSAgIFRoZSAnYicgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgREVMVEEuCi0KLSAgIFRoZSBmbG9hdGluZyBwb2ludCAnaScgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgSU1NRURJQVRFLgotCi0gICBUaGUgZmxvYXRpbmcgcG9pbnQgJ3InIGZvcm1hdCB1c2VzIE9QLCBGTVQsIEZULCBGUywgRkQgYW5kIEZVTkNULgotCi0gICBBIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gdXNlcyBPUCwgQ09ERSBhbmQgU1BFQyAoMTAgYml0cyBvZiB0aGUKLSAgIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gYXJlIG5vdCBkZWZpbmVkOyBLYW5lIHNheXMgdGhlIGJyZWFrcG9pbnQKLSAgIGNvZGUgZmllbGQgaW4gQlJFQUsgaXMgMjAgYml0czsgeWV0IE1JUFMgYXNzZW1ibGVycyBhbmQgZGVidWdnZXJzCi0gICBvbmx5IHVzZSB0ZW4gYml0cykuICBBbiBvcHRpb25hbCB0d28tb3BlcmFuZCBmb3JtIG9mIGJyZWFrL3NkYmJwCi0gICBhbGxvd3MgdGhlIGxvd2VyIHRlbiBiaXRzIHRvIGJlIHNldCB0b28uCi0KLSAgIFRoZSBzeXNjYWxsIGluc3RydWN0aW9uIHVzZXMgU1lTQ0FMTC4KLQotICAgVGhlIGdlbmVyYWwgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIHVzZSBDT1BaLiAgKi8KLQotI2RlZmluZSBPUF9NQVNLX09QCQkweDNmCi0jZGVmaW5lIE9QX1NIX09QCQkyNgotI2RlZmluZSBPUF9NQVNLX1JTCQkweDFmCi0jZGVmaW5lIE9QX1NIX1JTCQkyMQotI2RlZmluZSBPUF9NQVNLX0ZSCQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZSCQkyMQotI2RlZmluZSBPUF9NQVNLX0ZNVAkJMHgxZgotI2RlZmluZSBPUF9TSF9GTVQJCTIxCi0jZGVmaW5lIE9QX01BU0tfQkNDCQkweDcKLSNkZWZpbmUgT1BfU0hfQkNDCQkxOAotI2RlZmluZSBPUF9NQVNLX0NPREUJCTB4M2ZmCi0jZGVmaW5lIE9QX1NIX0NPREUJCTE2Ci0jZGVmaW5lIE9QX01BU0tfQ09ERTIJCTB4M2ZmCi0jZGVmaW5lIE9QX1NIX0NPREUyCQk2Ci0jZGVmaW5lIE9QX01BU0tfUlQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUlQJCTE2Ci0jZGVmaW5lIE9QX01BU0tfRlQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlQJCTE2Ci0jZGVmaW5lIE9QX01BU0tfQ0FDSEUJCTB4MWYKLSNkZWZpbmUgT1BfU0hfQ0FDSEUJCTE2Ci0jZGVmaW5lIE9QX01BU0tfUkQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUkQJCTExCi0jZGVmaW5lIE9QX01BU0tfRlMJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlMJCTExCi0jZGVmaW5lIE9QX01BU0tfUFJFRlgJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUFJFRlgJCTExCi0jZGVmaW5lIE9QX01BU0tfQ0NDCQkweDcKLSNkZWZpbmUgT1BfU0hfQ0NDCQk4Ci0jZGVmaW5lIE9QX01BU0tfU1lTQ0FMTAkJMHhmZmZmZgotI2RlZmluZSBPUF9TSF9TWVNDQUxMCQk2Ci0jZGVmaW5lIE9QX01BU0tfU0hBTVQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfU0hBTVQJCTYKLSNkZWZpbmUgT1BfTUFTS19GRAkJMHgxZgotI2RlZmluZSBPUF9TSF9GRAkJNgotI2RlZmluZSBPUF9NQVNLX1RBUkdFVAkJMHgzZmZmZmZmCi0jZGVmaW5lIE9QX1NIX1RBUkdFVAkJMAotI2RlZmluZSBPUF9NQVNLX0NPUFoJCTB4MWZmZmZmZgotI2RlZmluZSBPUF9TSF9DT1BaCQkwCi0jZGVmaW5lIE9QX01BU0tfSU1NRURJQVRFCTB4ZmZmZgotI2RlZmluZSBPUF9TSF9JTU1FRElBVEUJCTAKLSNkZWZpbmUgT1BfTUFTS19ERUxUQQkJMHhmZmZmCi0jZGVmaW5lIE9QX1NIX0RFTFRBCQkwCi0jZGVmaW5lIE9QX01BU0tfRlVOQ1QJCTB4M2YKLSNkZWZpbmUgT1BfU0hfRlVOQ1QJCTAKLSNkZWZpbmUgT1BfTUFTS19TUEVDCQkweDNmCi0jZGVmaW5lIE9QX1NIX1NQRUMJCTAKLSNkZWZpbmUgT1BfU0hfTE9DQyAgICAgICAgICAgICAgOCAgICAgICAvKiBGUCBjb25kaXRpb24gY29kZSAqLwotI2RlZmluZSBPUF9TSF9ISUNDICAgICAgICAgICAgICAxOCAgICAgIC8qIEZQIGNvbmRpdGlvbiBjb2RlICovCi0jZGVmaW5lIE9QX01BU0tfQ0MgICAgICAgICAgICAgIDB4NwotI2RlZmluZSBPUF9TSF9DT1AxTk9STSAgICAgICAgICAyNSAgICAgIC8qIE5vcm1hbCBDT1AxIGVuY29kaW5nICovCi0jZGVmaW5lIE9QX01BU0tfQ09QMU5PUk0gICAgICAgIDB4MSAgICAgLyogYSBzaW5nbGUgYml0ICovCi0jZGVmaW5lIE9QX1NIX0NPUDFTUEVDICAgICAgICAgIDIxICAgICAgLyogQ09QMSBlbmNvZGluZ3MgKi8KLSNkZWZpbmUgT1BfTUFTS19DT1AxU1BFQyAgICAgICAgMHhmCi0jZGVmaW5lIE9QX01BU0tfQ09QMVNDTFIgICAgICAgIDB4NAotI2RlZmluZSBPUF9NQVNLX0NPUDFDTVAgICAgICAgICAweDMKLSNkZWZpbmUgT1BfU0hfQ09QMUNNUCAgICAgICAgICAgNAotI2RlZmluZSBPUF9TSF9GT1JNQVQgICAgICAgICAgICAyMSAgICAgIC8qIEZQIHNob3J0IGZvcm1hdCBmaWVsZCAqLwotI2RlZmluZSBPUF9NQVNLX0ZPUk1BVCAgICAgICAgICAweDcKLSNkZWZpbmUgT1BfU0hfVFJVRSAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19UUlVFICAgICAgICAgICAgMHgxCi0jZGVmaW5lIE9QX1NIX0dFICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIE9QX01BU0tfR0UgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgT1BfU0hfVU5TSUdORUQgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19VTlNJR05FRCAgICAgICAgMHgxCi0jZGVmaW5lIE9QX1NIX0hJTlQgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIE9QX01BU0tfSElOVCAgICAgICAgICAgIDB4MWYKLSNkZWZpbmUgT1BfU0hfTU1JICAgICAgICAgICAgICAgMCAgICAgICAvKiBNdWx0aW1lZGlhIChwYXJhbGxlbCkgb3AgKi8KLSNkZWZpbmUgT1BfTUFTS19NTUkgICAgICAgICAgICAgMHgzZiAKLSNkZWZpbmUgT1BfU0hfTU1JU1VCICAgICAgICAgICAgNgotI2RlZmluZSBPUF9NQVNLX01NSVNVQiAgICAgICAgICAweDFmCi0jZGVmaW5lIE9QX01BU0tfUEVSRlJFRwkJMHgxZgkvKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nICovCi0jZGVmaW5lIE9QX1NIX1BFUkZSRUcJCTEKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBpbnN0cnVjdGlvbi4gICovCi0KLXN0cnVjdCBtaXBzX29wY29kZQotewotICAvKiBUaGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSBhcmd1bWVudHMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGUgYmFzaWMgb3Bjb2RlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICBXaGVuIGFzc2VtYmxpbmcsIHRoaXMKLSAgICAgb3Bjb2RlIGlzIG1vZGlmaWVkIGJ5IHRoZSBhcmd1bWVudHMgdG8gcHJvZHVjZSB0aGUgYWN0dWFsIG9wY29kZQotICAgICB0aGF0IGlzIHVzZWQuICBJZiBwaW5mbyBpcyBJTlNOX01BQ1JPLCB0aGVuIHRoaXMgaXMgMC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7Ci0gIC8qIElmIHBpbmZvIGlzIG5vdCBJTlNOX01BQ1JPLCB0aGVuIHRoaXMgaXMgYSBiaXQgbWFzayBmb3IgdGhlCi0gICAgIHJlbGV2YW50IHBvcnRpb25zIG9mIHRoZSBvcGNvZGUgd2hlbiBkaXNhc3NlbWJsaW5nLiAgSWYgdGhlCi0gICAgIGFjdHVhbCBvcGNvZGUgYW5kZWQgd2l0aCB0aGUgbWF0Y2ggZmllbGQgZXF1YWxzIHRoZSBvcGNvZGUgZmllbGQsCi0gICAgIHRoZW4gd2UgaGF2ZSBmb3VuZCB0aGUgY29ycmVjdCBpbnN0cnVjdGlvbi4gIElmIHBpbmZvIGlzCi0gICAgIElOU05fTUFDUk8sIHRoZW4gdGhpcyBmaWVsZCBpcyB0aGUgbWFjcm8gaWRlbnRpZmllci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgLyogRm9yIGEgbWFjcm8sIHRoaXMgaXMgSU5TTl9NQUNSTy4gIE90aGVyd2lzZSwgaXQgaXMgYSBjb2xsZWN0aW9uCi0gICAgIG9mIGJpdHMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb24sIG5vdGFibHkgYW55IHJlbGV2YW50IGhhemFyZAotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgcGluZm87Ci0gIC8qIEEgY29sbGVjdGlvbiBvZiBiaXRzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9uIHNldHMgb2Ygd2hpY2ggdGhpcwotICAgICBpbnN0cnVjdGlvbiBvciBtYWNybyBpcyBhIG1lbWJlci4gKi8KLSAgdW5zaWduZWQgbG9uZyBtZW1iZXJzaGlwOwotfTsKLQotLyogVGhlc2UgYXJlIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXJzIGluIHRoZSBhcmdzIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbi4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmllbGRzIGFwcGVhcgotICAgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdXNlZC4gIENvbW1hcyBhbmQgcGFyZW50aGVzZXMgaW4gdGhlIGFyZ3MKLSAgIHN0cmluZyBhcmUgaWdub3JlZCB3aGVuIGFzc2VtYmxpbmcsIGFuZCB3cml0dGVuIGludG8gdGhlIG91dHB1dAotICAgd2hlbiBkaXNhc3NlbWJsaW5nLgotCi0gICBFYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgY29ycmVzcG9uZHMgdG8gYSBtYXNrIGZpZWxkIGRlZmluZWQgYWJvdmUuCi0KLSAgICI8IiA1IGJpdCBzaGlmdCBhbW91bnQgKE9QXypfU0hBTVQpCi0gICAiPiIgc2hpZnQgYW1vdW50IGJldHdlZW4gMzIgYW5kIDYzLCBzdG9yZWQgYWZ0ZXIgc3VidHJhY3RpbmcgMzIgKE9QXypfU0hBTVQpCi0gICAiYSIgMjYgYml0IHRhcmdldCBhZGRyZXNzIChPUF8qX1RBUkdFVCkKLSAgICJiIiA1IGJpdCBiYXNlIHJlZ2lzdGVyIChPUF8qX1JTKQotICAgImMiIDEwIGJpdCBicmVha3BvaW50IGNvZGUgKE9QXypfQ09ERSkKLSAgICJkIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciBzcGVjaWZpZXIgKE9QXypfUkQpCi0gICAiaCIgNSBiaXQgcHJlZnggaGludCAoT1BfKl9QUkVGWCkKLSAgICJpIiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIChPUF8qX0lNTUVESUFURSkKLSAgICJqIiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAoT1BfKl9ERUxUQSkKLSAgICJrIiA1IGJpdCBjYWNoZSBvcGNvZGUgaW4gdGFyZ2V0IHJlZ2lzdGVyIHBvc2l0aW9uIChPUF8qX0NBQ0hFKQotICAgIm8iIDE2IGJpdCBzaWduZWQgb2Zmc2V0IChPUF8qX0RFTFRBKQotICAgInAiIDE2IGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggdGFyZ2V0IGFkZHJlc3MgKE9QXypfREVMVEEpCi0gICAicSIgMTAgYml0IGV4dHJhIGJyZWFrcG9pbnQgY29kZSAoT1BfKl9DT0RFMikKLSAgICJyIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIHRhcmdldCAoT1BfKl9SUykKLSAgICJzIiA1IGJpdCBzb3VyY2UgcmVnaXN0ZXIgc3BlY2lmaWVyIChPUF8qX1JTKQotICAgInQiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKLSAgICJ1IiAxNiBiaXQgdXBwZXIgMTYgYml0cyBvZiBhZGRyZXNzIChPUF8qX0lNTUVESUFURSkKLSAgICJ2IiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChPUF8qX1JTKQotICAgInciIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHRhcmdldCBhbmQgZGVzdGluYXRpb24gKE9QXypfUlQpCi0gICAiQyIgMjUgYml0IGNvcHJvY2Vzc29yIGZ1bmN0aW9uIGNvZGUgKE9QXypfQ09QWikKLSAgICJCIiAyMCBiaXQgc3lzY2FsbCBmdW5jdGlvbiBjb2RlIChPUF8qX1NZU0NBTEwpCi0gICAieCIgYWNjZXB0IGFuZCBpZ25vcmUgcmVnaXN0ZXIgbmFtZQotICAgInoiIG11c3QgYmUgemVybyByZWdpc3RlcgotCi0gICBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnM6Ci0gICAiRCIgNSBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKE9QXypfRkQpCi0gICAiTSIgMyBiaXQgY29tcGFyZSBjb25kaXRpb24gY29kZSAoT1BfKl9DQ0MpIChvbmx5IHVzZWQgZm9yIG1pcHM0IGFuZCB1cCkKLSAgICJOIiAzIGJpdCBicmFuY2ggY29uZGl0aW9uIGNvZGUgKE9QXypfQkNDKSAob25seSB1c2VkIGZvciBtaXBzNCBhbmQgdXApCi0gICAiUyIgNSBiaXQgZnMgc291cmNlIDEgcmVnaXN0ZXIgKE9QXypfRlMpCi0gICAiVCIgNSBiaXQgZnQgc291cmNlIDIgcmVnaXN0ZXIgKE9QXypfRlQpCi0gICAiUiIgNSBiaXQgZnIgc291cmNlIDMgcmVnaXN0ZXIgKE9QXypfRlIpCi0gICAiViIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGZsb2F0aW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE9QXypfRlMpCi0gICAiVyIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGZsb2F0aW5nIHRhcmdldCBhbmQgZGVzdGluYXRpb24gKE9QXypfRlQpCi0KLSAgIENvcHJvY2Vzc29yIGluc3RydWN0aW9uczoKLSAgICJFIiA1IGJpdCB0YXJnZXQgcmVnaXN0ZXIgKE9QXypfUlQpCi0gICAiRyIgNSBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKE9QXypfUkQpCi0gICAiUCIgNSBiaXQgcGVyZm9ybWFuY2UtbW9uaXRvciByZWdpc3RlciAoT1BfKl9QRVJGUkVHKQotCi0gICBNYWNybyBpbnN0cnVjdGlvbnM6Ci0gICAiQSIgR2VuZXJhbCAzMiBiaXQgZXhwcmVzc2lvbgotICAgIkkiIDMyIGJpdCBpbW1lZGlhdGUKLSAgICJGIiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLnJkYXRhCi0gICAiTCIgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5saXQ4Ci0gICAiZiIgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICAibCIgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5saXQ0Ci0KLSAgIE90aGVyOgotICAgIigpIiBwYXJlbnMgc3Vycm91bmRpbmcgb3B0aW9uYWwgdmFsdWUKLSAgICIsIiAgc2VwYXJhdGVzIG9wZXJhbmRzCi0KLSAgIENoYXJhY3RlcnMgdXNlZCBzbyBmYXIsIGZvciBxdWljayByZWZlcmVuY2Ugd2hlbiBhZGRpbmcgbW9yZToKLSAgICI8PigpLCIKLSAgICJBQkNERUZHSUxNTlNUUlZXIgotICAgImFiY2RmaGlqa2xvcHFyc3R1dnd4eiIKLSovCi0KLS8qIFRoZXNlIGFyZSB0aGUgYml0cyB3aGljaCBtYXkgYmUgc2V0IGluIHRoZSBwaW5mbyBmaWVsZCBvZiBhbgotICAgaW5zdHJ1Y3Rpb25zLCBpZiBpdCBpcyBub3QgZXF1YWwgdG8gSU5TTl9NQUNSTy4gICovCi0KLS8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SRC4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfR1BSX0QgICAgICAgICAgICAweDAwMDAwMDAxCi0vKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUlQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0dQUl9UICAgICAgICAgICAgMHgwMDAwMDAwMgotLyogTW9kaWZpZXMgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIDMxLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9HUFJfMzEgICAgICAgICAgIDB4MDAwMDAwMDQKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZELiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfRCAgICAgICAgICAgIDB4MDAwMDAwMDgKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZTLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfUyAgICAgICAgICAgIDB4MDAwMDAwMTAKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZULiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfVCAgICAgICAgICAgIDB4MDAwMDAwMjAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SUy4gICovCi0jZGVmaW5lIElOU05fUkVBRF9HUFJfUyAgICAgICAgICAgICAweDAwMDAwMDQwCi0vKiBSZWFkcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUlQuICAqLwotI2RlZmluZSBJTlNOX1JFQURfR1BSX1QgICAgICAgICAgICAgMHgwMDAwMDA4MAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlMuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1MgICAgICAgICAgICAgMHgwMDAwMDEwMAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlQuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1QgICAgICAgICAgICAgMHgwMDAwMDIwMAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlIuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1IJCSAgICAweDAwMDAwNDAwCi0vKiBNb2RpZmllcyBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZS4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfQ09ORF9DT0RFICAgICAgICAweDAwMDAwODAwCi0vKiBSZWFkcyBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZS4gICovCi0jZGVmaW5lIElOU05fUkVBRF9DT05EX0NPREUgICAgICAgICAweDAwMDAxMDAwCi0vKiBUTEIgb3BlcmF0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl9UTEIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLS8qIFJlYWRzIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG90aGVyIHRoYW4gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX0NPUCAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotLyogSW5zdHJ1Y3Rpb24gbG9hZHMgdmFsdWUgZnJvbSBtZW1vcnksIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fTE9BRF9NRU1PUllfREVMQVkgICAgICAweDAwMDA4MDAwCi0vKiBJbnN0cnVjdGlvbiBsb2FkcyB2YWx1ZSBmcm9tIGNvcHJvY2Vzc29yLCByZXF1aXJpbmcgZGVsYXkuICAqLwotI2RlZmluZSBJTlNOX0xPQURfQ09QUk9DX0RFTEFZCSAgICAweDAwMDEwMDAwCi0vKiBJbnN0cnVjdGlvbiBoYXMgdW5jb25kaXRpb25hbCBicmFuY2ggZGVsYXkgc2xvdC4gICovCi0jZGVmaW5lIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSAgICAweDAwMDIwMDAwCi0vKiBJbnN0cnVjdGlvbiBoYXMgY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5IHNsb3QuICAqLwotI2RlZmluZSBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZICAgICAgMHgwMDA0MDAwMAotLyogQ29uZGl0aW9uYWwgYnJhbmNoIGxpa2VseTogaWYgYnJhbmNoIG5vdCB0YWtlbiwgaW5zbiBudWxsaWZpZWQuICAqLwotI2RlZmluZSBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWQkgICAgMHgwMDA4MDAwMAotLyogTW92ZXMgdG8gY29wcm9jZXNzb3IgcmVnaXN0ZXIsIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fQ09QUk9DX01PVkVfREVMQVkgICAgICAweDAwMTAwMDAwCi0vKiBMb2FkcyBjb3Byb2Nlc3NvciByZWdpc3RlciBmcm9tIG1lbW9yeSwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZICAgIDB4MDAyMDAwMDAKLS8qIFJlYWRzIHRoZSBISSByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fUkVBRF9ISQkJICAgIDB4MDA0MDAwMDAKLS8qIFJlYWRzIHRoZSBMTyByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fUkVBRF9MTwkJICAgIDB4MDA4MDAwMDAKLS8qIE1vZGlmaWVzIHRoZSBISSByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfSEkJCSAgICAweDAxMDAwMDAwCi0vKiBNb2RpZmllcyB0aGUgTE8gcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0xPCQkgICAgMHgwMjAwMDAwMAotLyogVGFrZXMgYSB0cmFwIChlYXNpZXIgdG8ga2VlcCBvdXQgb2YgZGVsYXkgc2xvdCkuICAqLwotI2RlZmluZSBJTlNOX1RSQVAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gc3RvcmVzIHZhbHVlIGludG8gbWVtb3J5LiAgKi8KLSNkZWZpbmUgSU5TTl9TVE9SRV9NRU1PUlkJICAgIDB4MDgwMDAwMDAKLS8qIEluc3RydWN0aW9uIHVzZXMgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludC4gICovCi0jZGVmaW5lIEZQX1MJCQkgICAgMHgxMDAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gdXNlcyBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LiAgKi8KLSNkZWZpbmUgRlBfRAkJCSAgICAweDIwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0eDM5J3MgaW50ZWdlciBtdWx0aXBseSBmYW1pbHkuICAgICovCi0jZGVmaW5lIElOU05fTVVMVCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBzeW5jaHJvbml6ZSBzaGFyZWQgbWVtb3J5LiAgKi8KLSNkZWZpbmUgSU5TTl9TWU5DCQkgICAgMHg4MDAwMDAwMAotCi0vKiBJbnN0cnVjdGlvbiBpcyBhY3R1YWxseSBhIG1hY3JvLiAgSXQgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlCi0gICBkaXNhc3NlbWJsZXIsIGFuZCByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9NQUNSTyAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKLQotCi0KLQotCi0vKiBNSVBTIElTQSBmaWVsZC0tQ1BVIGxldmVsIGF0IHdoaWNoIGluc24gaXMgc3VwcG9ydGVkLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EJCSAgICAweDAwMDAwMDBGCi0vKiBBbiBpbnN0cnVjdGlvbiB3aGljaCBpcyBub3QgcGFydCBvZiBhbnkgYmFzaWMgTUlQUyBJU0EuCi0gICAoaWUgaXQgaXMgYSBjaGlwIHNwZWNpZmljIGluc3RydWN0aW9uKSAgKi8KLSNkZWZpbmUgSU5TTl9OT19JU0EJCSAgICAweDAwMDAwMDAwCi0vKiBNSVBTIElTQSAxIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0ExCQkgICAgMHgwMDAwMDAwMQotLyogTUlQUyBJU0EgMiBpbnN0cnVjdGlvbiAoUjYwMDAgb3IgUjQwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EyCQkgICAgMHgwMDAwMDAwMgotLyogTUlQUyBJU0EgMyBpbnN0cnVjdGlvbiAoUjQwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EzCQkgICAgMHgwMDAwMDAwMwotLyogTUlQUyBJU0EgNCBpbnN0cnVjdGlvbiAoUjgwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0E0CQkgICAgMHgwMDAwMDAwNAotCi0vKiBDaGlwIHNwZWNpZmljIGluc3RydWN0aW9ucy4gIFRoZXNlIGFyZSBiaXRtYXNrcy4gICovCi0vKiBNSVBTIFI0NjUwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl80NjUwCQkgICAgMHgwMDAwMDAxMAotLyogTFNJIFI0MDEwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl80MDEwCQkgICAgMHgwMDAwMDAyMAotLyogTkVDIFZSNDEwMCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSU5TTl80MTAwICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLS8qIFRvc2hpYmEgUjM5MDAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOXzM5MDAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIG1hY3JvIGV4cGFuZGVkIGluc3RydWN0aW9ucy4KLSAqCi0gKiBfSSBhcHBlbmRlZCBtZWFucyBpbW1lZGlhdGUKLSAqIF9BIGFwcGVuZGVkIG1lYW5zIGFkZHJlc3MKLSAqIF9BQiBhcHBlbmRlZCBtZWFucyBhZGRyZXNzIHdpdGggYmFzZSByZWdpc3RlcgotICogX0QgYXBwZW5kZWQgbWVhbnMgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gKiBfUyBhcHBlbmRlZCBtZWFucyAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAqLwotZW51bSB7Ci0gICAgTV9BQlMsCi0gICAgTV9BRERfSSwKLSAgICBNX0FERFVfSSwKLSAgICBNX0FORF9JLAotICAgIE1fQkVRLAotICAgIE1fQkVRX0ksCi0gICAgTV9CRVFMX0ksCi0gICAgTV9CR0UsCi0gICAgTV9CR0VMLAotICAgIE1fQkdFX0ksCi0gICAgTV9CR0VMX0ksCi0gICAgTV9CR0VVLAotICAgIE1fQkdFVUwsCi0gICAgTV9CR0VVX0ksCi0gICAgTV9CR0VVTF9JLAotICAgIE1fQkdULAotICAgIE1fQkdUTCwKLSAgICBNX0JHVF9JLAotICAgIE1fQkdUTF9JLAotICAgIE1fQkdUVSwKLSAgICBNX0JHVFVMLAotICAgIE1fQkdUVV9JLAotICAgIE1fQkdUVUxfSSwKLSAgICBNX0JMRSwKLSAgICBNX0JMRUwsCi0gICAgTV9CTEVfSSwKLSAgICBNX0JMRUxfSSwKLSAgICBNX0JMRVUsCi0gICAgTV9CTEVVTCwKLSAgICBNX0JMRVVfSSwKLSAgICBNX0JMRVVMX0ksCi0gICAgTV9CTFQsCi0gICAgTV9CTFRMLAotICAgIE1fQkxUX0ksCi0gICAgTV9CTFRMX0ksCi0gICAgTV9CTFRVLAotICAgIE1fQkxUVUwsCi0gICAgTV9CTFRVX0ksCi0gICAgTV9CTFRVTF9JLAotICAgIE1fQk5FLAotICAgIE1fQk5FX0ksCi0gICAgTV9CTkVMX0ksCi0gICAgTV9EQUJTLAotICAgIE1fREFERF9JLAotICAgIE1fREFERFVfSSwKLSAgICBNX0RESVZfMywKLSAgICBNX0RESVZfM0ksCi0gICAgTV9ERElWVV8zLAotICAgIE1fRERJVlVfM0ksCi0gICAgTV9ESVZfMywKLSAgICBNX0RJVl8zSSwKLSAgICBNX0RJVlVfMywKLSAgICBNX0RJVlVfM0ksCi0gICAgTV9ETEFfQUIsCi0gICAgTV9ETEksCi0gICAgTV9ETVVMLAotICAgIE1fRE1VTF9JLCAKLSAgICBNX0RNVUxPLAotICAgIE1fRE1VTE9fSSwgCi0gICAgTV9ETVVMT1UsCi0gICAgTV9ETVVMT1VfSSwgCi0gICAgTV9EUkVNXzMsCi0gICAgTV9EUkVNXzNJLAotICAgIE1fRFJFTVVfMywKLSAgICBNX0RSRU1VXzNJLAotICAgIE1fRFNVQl9JLAotICAgIE1fRFNVQlVfSSwKLSAgICBNX0RTVUJVX0lfMiwKLSAgICBNX0pfQSwKLSAgICBNX0pBTF8xLAotICAgIE1fSkFMXzIsCi0gICAgTV9KQUxfQSwKLSAgICBNX0xfRE9CLAotICAgIE1fTF9EQUIsCi0gICAgTV9MQV9BQiwKLSAgICBNX0xCX0EsCi0gICAgTV9MQl9BQiwKLSAgICBNX0xCVV9BLAotICAgIE1fTEJVX0FCLAotICAgIE1fTERfQSwKLSAgICBNX0xEX09CLAotICAgIE1fTERfQUIsCi0gICAgTV9MREMxX0FCLAotICAgIE1fTERDMl9BQiwKLSAgICBNX0xEQzNfQUIsCi0gICAgTV9MRExfQUIsCi0gICAgTV9MRFJfQUIsCi0gICAgTV9MSF9BLAotICAgIE1fTEhfQUIsCi0gICAgTV9MSFVfQSwKLSAgICBNX0xIVV9BQiwKLSAgICBNX0xJLAotICAgIE1fTElfRCwKLSAgICBNX0xJX0RELAotICAgIE1fTElfUywKLSAgICBNX0xJX1NTLAotICAgIE1fTExfQUIsCi0gICAgTV9MTERfQUIsCi0gICAgTV9MU19BLAotICAgIE1fTFdfQSwKLSAgICBNX0xXX0FCLAotICAgIE1fTFdDMF9BLAotICAgIE1fTFdDMF9BQiwKLSAgICBNX0xXQzFfQSwKLSAgICBNX0xXQzFfQUIsCi0gICAgTV9MV0MyX0EsCi0gICAgTV9MV0MyX0FCLAotICAgIE1fTFdDM19BLAotICAgIE1fTFdDM19BQiwKLSAgICBNX0xXTF9BLAotICAgIE1fTFdMX0FCLAotICAgIE1fTFdSX0EsCi0gICAgTV9MV1JfQUIsCi0gICAgTV9MV1VfQUIsCi0gICAgTV9NVUwsCi0gICAgTV9NVUxfSSwgCi0gICAgTV9NVUxPLAotICAgIE1fTVVMT19JLCAKLSAgICBNX01VTE9VLAotICAgIE1fTVVMT1VfSSwgCi0gICAgTV9OT1JfSSwKLSAgICBNX09SX0ksCi0gICAgTV9SRU1fMywKLSAgICBNX1JFTV8zSSwKLSAgICBNX1JFTVVfMywKLSAgICBNX1JFTVVfM0ksCi0gICAgTV9ST0wsCi0gICAgTV9ST0xfSSwKLSAgICBNX1JPUiwKLSAgICBNX1JPUl9JLAotICAgIE1fU19EQSwKLSAgICBNX1NfRE9CLAotICAgIE1fU19EQUIsCi0gICAgTV9TX1MsCi0gICAgTV9TQ19BQiwKLSAgICBNX1NDRF9BQiwKLSAgICBNX1NEX0EsCi0gICAgTV9TRF9PQiwKLSAgICBNX1NEX0FCLAotICAgIE1fU0RDMV9BQiwKLSAgICBNX1NEQzJfQUIsCi0gICAgTV9TREMzX0FCLAotICAgIE1fU0RMX0FCLAotICAgIE1fU0RSX0FCLAotICAgIE1fU0VRLAotICAgIE1fU0VRX0ksCi0gICAgTV9TR0UsCi0gICAgTV9TR0VfSSwKLSAgICBNX1NHRVUsCi0gICAgTV9TR0VVX0ksCi0gICAgTV9TR1QsCi0gICAgTV9TR1RfSSwKLSAgICBNX1NHVFUsCi0gICAgTV9TR1RVX0ksCi0gICAgTV9TTEUsCi0gICAgTV9TTEVfSSwKLSAgICBNX1NMRVUsCi0gICAgTV9TTEVVX0ksCi0gICAgTV9TTFRfSSwKLSAgICBNX1NMVFVfSSwKLSAgICBNX1NORSwKLSAgICBNX1NORV9JLAotICAgIE1fU0JfQSwKLSAgICBNX1NCX0FCLAotICAgIE1fU0hfQSwKLSAgICBNX1NIX0FCLAotICAgIE1fU1dfQSwKLSAgICBNX1NXX0FCLAotICAgIE1fU1dDMF9BLAotICAgIE1fU1dDMF9BQiwKLSAgICBNX1NXQzFfQSwKLSAgICBNX1NXQzFfQUIsCi0gICAgTV9TV0MyX0EsCi0gICAgTV9TV0MyX0FCLAotICAgIE1fU1dDM19BLAotICAgIE1fU1dDM19BQiwKLSAgICBNX1NXTF9BLAotICAgIE1fU1dMX0FCLAotICAgIE1fU1dSX0EsCi0gICAgTV9TV1JfQUIsCi0gICAgTV9TVUJfSSwKLSAgICBNX1NVQlVfSSwKLSAgICBNX1NVQlVfSV8yLAotICAgIE1fVEVRX0ksCi0gICAgTV9UR0VfSSwKLSAgICBNX1RHRVVfSSwKLSAgICBNX1RMVF9JLAotICAgIE1fVExUVV9JLAotICAgIE1fVE5FX0ksCi0gICAgTV9UUlVOQ1dELAotICAgIE1fVFJVTkNXUywKLSAgICBNX1VMRCwKLSAgICBNX1VMRF9BLAotICAgIE1fVUxILAotICAgIE1fVUxIX0EsCi0gICAgTV9VTEhVLAotICAgIE1fVUxIVV9BLAotICAgIE1fVUxXLAotICAgIE1fVUxXX0EsCi0gICAgTV9VU0gsCi0gICAgTV9VU0hfQSwKLSAgICBNX1VTVywKLSAgICBNX1VTV19BLAotICAgIE1fVVNELAotICAgIE1fVVNEX0EsCi0gICAgTV9YT1JfSSwKLSAgICBNX0NPUDAsCi0gICAgTV9DT1AxLAotICAgIE1fQ09QMiwKLSAgICBNX0NPUDMsCi0gICAgTV9OVU1fTUFDUk9TCi19OwotCi0KLS8qIFRoZSBvcmRlciBvZiBvdmVybG9hZGVkIGluc3RydWN0aW9ucyBtYXR0ZXJzLiAgTGFiZWwgYXJndW1lbnRzIGFuZAotICAgcmVnaXN0ZXIgYXJndW1lbnRzIGxvb2sgdGhlIHNhbWUuIEluc3RydWN0aW9ucyB0aGF0IGNhbiBoYXZlIGVpdGhlcgotICAgZm9yIGFyZ3VtZW50cyBtdXN0IGFwZWFyIGluIHRoZSBjb3JyZWN0IG9yZGVyIGluIHRoaXMgdGFibGUgZm9yIHRoZQotICAgYXNzZW1ibGVyIHRvIHBpY2sgdGhlIHJpZ2h0IG9uZS4gSW4gb3RoZXIgd29yZHMsIGVudHJpZXMgd2l0aAotICAgaW1tZWRpYXRlIG9wZXJhbmRzIG11c3QgYXBlYXIgYWZ0ZXIgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gd2l0aAotICAgcmVnaXN0ZXJzLgotCi0gICBNYW55IGluc3RydWN0aW9ucyBhcmUgc2hvcnQgaGFuZCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zIChpLmUuLCBUaGUKLSAgIGphbCA8cmVnaXN0ZXI+IGluc3RydWN0aW9uIGlzIHNob3J0IGZvciBqYWxyIDxyZWdpc3Rlcj4pLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBtaXBzX2J1aWx0aW5fb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzOwotZXh0ZXJuIHN0cnVjdCBtaXBzX29wY29kZSAqbWlwc19vcGNvZGVzOwotZXh0ZXJuIGludCBiZmRfbWlwc19udW1fb3Bjb2RlczsKLSNkZWZpbmUgTlVNT1BDT0RFUyBiZmRfbWlwc19udW1fb3Bjb2RlcwotCi0MCi0vKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgYWRkcyBkZWZpbml0aW9ucyBmb3IgdGhlIG1pcHMxNiBUaW55UklTQwotICAgcHJvY2Vzc29yLiAgKi8KLQotLyogVGhlc2UgYXJlIHRoZSBiaXRtYXNrcyBhbmQgc2hpZnQgY291bnRzIHVzZWQgZm9yIHRoZSBkaWZmZXJlbnQKLSAgIGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIE90aGVyIHRoYW4gT1AsIG5vIG1hc2tzIGFyZQotICAgcHJvdmlkZWQgZm9yIHRoZSBmaXhlZCBwb3J0aW9ucyBvZiBhbiBpbnN0cnVjdGlvbiwgc2luY2UgdGhleSBhcmUKLSAgIG5vdCBuZWVkZWQuCi0KLSAgIFRoZSBJIGZvcm1hdCB1c2VzIElNTTExLgotCi0gICBUaGUgUkkgZm9ybWF0IHVzZXMgUlggYW5kIElNTTguCi0KLSAgIFRoZSBSUiBmb3JtYXQgdXNlcyBSWCwgYW5kIFJZLgotCi0gICBUaGUgUlJJIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIElNTTUuCi0KLSAgIFRoZSBSUlIgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgUlouCi0KLSAgIFRoZSBSUklfQSBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBJTU00LgotCi0gICBUaGUgU0hJRlQgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgU0hBTVQuCi0KLSAgIFRoZSBJOCBmb3JtYXQgdXNlcyBJTU04LgotCi0gICBUaGUgSThfTU9WUjMyIGZvcm1hdCB1c2VzIFJZIGFuZCBSRUdSMzIuCi0KLSAgIFRoZSBJUl9NT1YzMlIgZm9ybWF0IHVzZXMgUkVHMzJSIGFuZCBNT1YzMlouCi0KLSAgIFRoZSBJNjQgZm9ybWF0IHVzZXMgSU1NOC4KLQotICAgVGhlIFJJNjQgZm9ybWF0IHVzZXMgUlkgYW5kIElNTTUuCi0gICAqLwotCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfT1AJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9PUAkJMTEKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU0xMQkweDdmZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU0xMQkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUlgJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX1JYCQk4Ci0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NOAkweGZmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTgJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JZCTB4NwotI2RlZmluZSBNSVBTMTZPUF9TSF9SWQkJNQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTUJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU01CTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWgkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUloJCTIKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU00CTB4ZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU00CTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SRUdSMzIJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9SRUdSMzIJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JFRzMyUgkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX1JFRzMyUgkzCi0jZGVmaW5lIE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSKGkpICgoKChpKSA+PiA1KSAmIDcpIHwgKChpKSAmIDB4MTgpKQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX01PVkUzMloJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX01PVkUzMloJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTYJMHgzZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU02CTUKLQotLyogVGhlc2UgYXJlIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXJzIGluIHRoZSBhcmdzIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbi4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmllbGRzIGFwcGVhcgotICAgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdXNlZC4gIENvbW1hcyBhbmQgcGFyZW50aGVzZXMgaW4gdGhlIGFyZ3MKLSAgIHN0cmluZyBhcmUgaWdub3JlZCB3aGVuIGFzc2VtYmxpbmcsIGFuZCB3cml0dGVuIGludG8gdGhlIG91dHB1dAotICAgd2hlbiBkaXNhc3NlbWJsaW5nLgotCi0gICAieSIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlkpCi0gICAieCIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlgpCi0gICAieiIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlopCi0gICAiWiIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfTU9WRTMyWikKLSAgICJ2IiAzIGJpdCBzYW1lIHJlZ2lzdGVyIGFzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE1JUFMxNk9QXypfUlgpCi0gICAidyIgMyBiaXQgc2FtZSByZWdpc3RlciBhcyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChNSVBTMTZPUF8qX1JZKQotICAgIjAiIHplcm8gcmVnaXN0ZXIgKCQwKQotICAgIlMiIHN0YWNrIHBvaW50ZXIgKCRzcCBvciAkMjkpCi0gICAiUCIgcHJvZ3JhbSBjb3VudGVyCi0gICAiUiIgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgKCRyYSBvciAkMzEpCi0gICAiWCIgNSBiaXQgTUlQUyByZWdpc3RlciAoTUlQUzE2T1BfKl9SRUdSMzIpCi0gICAiWSIgNSBiaXQgTUlQUyByZWdpc3RlciAoTUlQUzE2T1BfKl9SRUczMlIpCi0gICAiNiIgNiBiaXQgdW5zaWduZWQgYnJlYWsgY29kZSAoTUlQUzE2T1BfKl9JTU02KQotICAgImEiIDI2IGJpdCBqdW1wIGFkZHJlc3MKLSAgICJlIiAxMSBiaXQgZXh0ZW5zaW9uIHZhbHVlCi0gICAibCIgcmVnaXN0ZXIgbGlzdCBmb3IgZW50cnkgaW5zdHJ1Y3Rpb24KLSAgICJMIiByZWdpc3RlciBsaXN0IGZvciBleGl0IGluc3RydWN0aW9uCi0KLSAgIFRoZSByZW1haW5pbmcgY29kZXMgbWF5IGJlIGV4dGVuZGVkLiAgRXhjZXB0IGFzIG90aGVyd2lzZSBub3RlZCwKLSAgIHRoZSBmdWxsIGV4dGVuZGVkIG9wZXJhbmQgaXMgYSAxNiBiaXQgc2lnbmVkIHZhbHVlLgotICAgIjwiIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWikgKGZ1bGwgNSBiaXQgdW5zaWduZWQpCi0gICAiPiIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JYKSAoZnVsbCA1IGJpdCB1bnNpZ25lZCkKLSAgICJbIiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlopIChmdWxsIDYgYml0IHVuc2lnbmVkKQotICAgIl0iIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWCkgKGZ1bGwgNiBiaXQgdW5zaWduZWQpCi0gICAiNCIgNCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNCkgKGZ1bGwgMTUgYml0IHNpZ25lZCkKLSAgICI1IiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTUpCi0gICAiSCIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogMiAoTUlQUzE2T1BfKl9JTU01KQotICAgIlciIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDQgKE1JUFMxNk9QXypfSU1NNSkKLSAgICJEIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA4IChNSVBTMTZPUF8qX0lNTTUpCi0gICAiaiIgNSBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNSkKLSAgICI4IiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpCi0gICAiViIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogNCAoTUlQUzE2T1BfKl9JTU04KQotICAgIkMiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NOCkKLSAgICJVIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpIChmdWxsIDE2IGJpdCB1bnNpZ25lZCkKLSAgICJrIiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU04KQotICAgIksiIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKiA4IChNSVBTMTZPUF8qX0lNTTgpCi0gICAicCIgOCBiaXQgY29uZGl0aW9uYWwgYnJhbmNoIGFkZHJlc3MgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJxIiAxMSBiaXQgYnJhbmNoIGFkZHJlc3MgKE1JUFMxNk9QXypfSU1NMTEpCi0gICAiQSIgOCBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDQgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJCIiA1IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogOCAoTUlQUzE2T1BfKl9JTU01KQotICAgIkUiIDUgYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA0IChNSVBTMTZPUF8qX0lNTTUpCi0gICAqLwotCi0vKiBGb3IgdGhlIG1pcHMxNiwgd2UgdXNlIHRoZSBzYW1lIG9wY29kZSB0YWJsZSBmb3JtYXQgYW5kIGEgZmV3IG9mCi0gICB0aGUgc2FtZSBmbGFncy4gIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIGZsYWdzIGFyZSBkaWZmZXJlbnQuICAqLwotCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWC4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1gJCSAgICAweDAwMDAwMDAxCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWS4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1kJCSAgICAweDAwMDAwMDAyCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1oJCSAgICAweDAwMDAwMDA0Ci0vKiBNb2RpZmllcyB0aGUgVCAoJDI0KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1QJCSAgICAweDAwMDAwMDA4Ci0vKiBNb2RpZmllcyB0aGUgU1AgKCQyOSkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9TUAkJICAgIDB4MDAwMDAwMTAKLS8qIE1vZGlmaWVzIHRoZSBSQSAoJDMxKSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFXzMxCQkgICAgMHgwMDAwMDAyMAotLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JFRzMyUi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZCQkgICAgMHgwMDAwMDA0MAotLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlguICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1gJCSAgICAweDAwMDAwMDgwCi0vKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWS4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWQkJICAgIDB4MDAwMDAxMDAKLS8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX01PVkUzMlouICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1oJCSAgICAweDAwMDAwMjAwCi0vKiBSZWFkcyB0aGUgVCAoJDI0KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfVAkJICAgIDB4MDAwMDA0MDAKLS8qIFJlYWRzIHRoZSBTUCAoJDI5KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfU1AJCSAgICAweDAwMDAwODAwCi0vKiBSZWFkcyB0aGUgUkEgKCQzMSkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEXzMxCQkgICAgMHgwMDAwMTAwMAotLyogUmVhZHMgdGhlIHByb2dyYW0gY291bnRlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfUEMJCSAgICAweDAwMDAyMDAwCi0vKiBSZWFkcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUkVHUjMyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9HUFJfWAkJICAgIDB4MDAwMDQwMDAKLS8qIElzIGEgYnJhbmNoIGluc24uICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX0JSQU5DSCAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLQotLyogVGhlIGZvbGxvd2luZyBmbGFncyBoYXZlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgbWlwczE2IG9wY29kZQotICAgdGFibGU6Ci0gICBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLSAgIElOU05fQ09ORF9CUkFOQ0hfREVMQVkKLSAgIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZIChuZXZlciB1c2VkKQotICAgSU5TTl9SRUFEX0hJCi0gICBJTlNOX1JFQURfTE8KLSAgIElOU05fV1JJVEVfSEkKLSAgIElOU05fV1JJVEVfTE8KLSAgIElOU05fVFJBUAotICAgSU5TTl9JU0EzCi0gICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHMxNl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGJmZF9taXBzMTZfbnVtX29wY29kZXM7Ci0KLSNlbmRpZiAvKiBfTUlQU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oIGIvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZhOTRiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL21uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKiBtbjEwMjAwLmggLS0gSGVhZGVyIGZpbGUgZm9yIE1hdHN1c2hpdGEgMTAyMDAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSmVmZiBMYXcsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTU4xMDIwMF9ICi0jZGVmaW5lIE1OMTAyMDBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMjAwX29wY29kZS4gICovCi0KLXN0cnVjdCBtbjEwMjAwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogVGhlIGZvcm1hdCBvZiB0aGlzIG9wY29kZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0OwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlIG1uMTAyMDBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBtbjEwMjAwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAyMDBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCBtbjEwMjAwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBtbjEwMjAwX29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCBtbjEwMjAwX29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kLiAgKi8KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0RSRUcgMHgxCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0FSRUcgMHgyCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BTVyAweDQKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTURSIDB4OAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgMHgxMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFIDB4MjAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUEFSRU4gMHg0MAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRCAweDgwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIDB4MTAwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0sgMHgyMDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUENSRUwgMHg0MDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTUVNQUREUiAweDgwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9SRUxBWCAweDEwMDAKLQotI2RlZmluZSBGTVRfMSAxCi0jZGVmaW5lIEZNVF8yIDIKLSNkZWZpbmUgRk1UXzMgMwotI2RlZmluZSBGTVRfNCA0Ci0jZGVmaW5lIEZNVF81IDUKLSNkZWZpbmUgRk1UXzYgNgotI2RlZmluZSBGTVRfNyA3Ci0jZW5kaWYgLyogTU4xMDIwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmggYi9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTRiMGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qIG1uMTAzMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTWF0c3VzaGl0YSAxMDMwMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKZWZmIExhdywgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNTjEwMzAwX0gKLSNkZWZpbmUgTU4xMDMwMF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAzMDBfb3Bjb2RlLiAgKi8KLQotI2RlZmluZSBNTjEwMzAwX01BWF9PUEVSQU5EUyA4Ci1zdHJ1Y3QgbW4xMDMwMF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEEgYml0bWFzay4gIEZvciBlYWNoIG9wZXJhbmQsIG5vbnplcm8gaWYgaXQgbXVzdCBub3QgaGF2ZSB0aGUgc2FtZQotICAgICByZWdpc3RlciBzcGVjaWZpY2F0aW9uIGFzIGFsbCBvdGhlciBvcGVyYW5kcyB3aXRoIGEgbm9uemVybyBiaXQgaW4KLSAgICAgdGhpcyBmbGFnLiAgaWUgMHg4MSB3b3VsZCBpbmRpY2F0ZSB0aGF0IG9wZXJhbmRzIDcgYW5kIDAgbXVzdCBub3QKLSAgICAgbWF0Y2guICBOb3RlIHRoYXQgd2UgY291bnQgb3BlcmFuZHMgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFzIHRoZXkgYXBwZWFyCi0gICAgIGluIHRoZSBvcGVyYW5kcyBzcGVjaWZpY2F0aW9uIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgaW50IG5vX21hdGNoX29wZXJhbmRzOwotCi0gIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBvcGNvZGUuICAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdDsKLQotICAvKiBCaXRtYXNrIGluZGljYXRpbmcgd2hhdCBjcHUgdmFyaWFudHMgdGhpcyBvcGNvZGUgaXMgYXZhaWxhYmxlIG9uLgotICAgICBXZSBhc3N1bWUgbW4xMDMwMCBiYXNlIG9wY29kZXMgYXJlIGF2YWlsYWJsZSBldmVyeXdoZXJlLCBzbyB3ZSBvbmx5Ci0gICAgIGhhdmUgdG8gbm90ZSBvcGNvZGVzIHdoaWNoIGFyZSBhdmFpbGFibGUgb24gb3RoZXIgdmFyaWFudHMuICAqLwotICB1bnNpZ25lZCBpbnQgbWFjaGluZTsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzW01OMTAzMDBfTUFYX09QRVJBTkRTXTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgbW4xMDMwMF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IG1uMTAzMDBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IG1uMTAzMDBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIG1uMTAzMDBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kIG1uMTAzMDBfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBtbjEwMzAwX29wZXJhbmQuICAqLwotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRFJFRyAweDEKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfQVJFRyAweDIKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1AgMHg0Ci0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BTVyAweDgKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTURSIDB4MTAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIDB4MjAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSAweDQwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BBUkVOIDB4ODAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQgMHgxMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQgMHgyMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1BMSVQgMHg0MDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QgMHg4MDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUENSRUwgMHgxMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX01FTUFERFIgMHgyMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIDB4NDAwMAotCi0KLS8qIE9wY29kZSBGb3JtYXRzLiAgKi8KLSNkZWZpbmUgRk1UX1MwIDEKLSNkZWZpbmUgRk1UX1MxIDIKLSNkZWZpbmUgRk1UX1MyIDMKLSNkZWZpbmUgRk1UX1M0IDQKLSNkZWZpbmUgRk1UX1M2IDUKLSNkZWZpbmUgRk1UX0QwIDYKLSNkZWZpbmUgRk1UX0QxIDcKLSNkZWZpbmUgRk1UX0QyIDgKLSNkZWZpbmUgRk1UX0Q0IDkKLSNkZWZpbmUgRk1UX0Q1IDEwCi0KLS8qIFZhcmlhbnRzIG9mIHRoZSBtbjEwMzAwIHdoaWNoIGhhdmUgYWRkaXRpb25hbCBvcGNvZGVzLiAgKi8KLSNkZWZpbmUgTU4xMDMgMzAwCi0jZGVmaW5lIEFNMzAgIDMwMAotCi0KLSNlbmRpZiAvKiBNTjEwMzAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25wMS5oIGIvaW5jbHVkZS9vcGNvZGUvbnAxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2FkYzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbnAxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyogUHJpbnQgR09VTEQgTlBMIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLUdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGdsZF9vcGNvZGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgY2hhciAqYXJnczsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQKLSAgIGlzIHRoZSBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbgotICAgaXMgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBhdCBtb3N0IGZvdXIuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgYmFzZWQgb24gdGhlIG9wY29kZS4KLQotICAgVGhlIG1hc2sgY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzCi0gICB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICByICBSZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgUiAgUmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICBiICBCYXNlIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBCICBCYXNlIHJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgdiAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBWICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEEgIE9wdGlvbmFsIGFkZHJlc3MgcmVnaXN0ZXIgKGJhc2UgcmVnaXN0ZXIpCi0gICBYICBPcHRpb25hbCBpbmRleCByZWdpc3RlcgotICAgSSAgSW1tZWRpYXRlIGRhdGEgKDE2Yml0cyBzaWduZWQpCi0gICBPICBPZmZzZXQgZmllbGQgKDE2Yml0cyBzaWduZWQpCi0gICBoICBPZmZzZXQgZmllbGQgKDE1Yml0cyBzaWduZWQpCi0gICBkICBPZmZzZXQgZmllbGQgKDE0Yml0cyBzaWduZWQpCi0gICBTICBTaGlmdCBjb3VudCBmaWVsZAotCi0gICBhbnkgb3RoZXIgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBhcyBpcy4uLgotKi8KLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi1zdHJ1Y3QgZ2xkX29wY29kZSBnbGRfb3Bjb2Rlc1tdID0KLXsKLXsgImxiIiwJCTB4YjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYnMiLAkweGVjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxoIiwJCTB4YjQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsdyIsCQkweGI0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxudyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGQiLAkJMHhiNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsbmQiLAkweGI4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxpIiwJCTB4ZjgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibHBhIiwJMHg1MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYSIsCQkweDUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhYnIiLAkweDU4MDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxicCIsCTB4OTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGhwIiwJMHg5MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsd3AiLAkweDkwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxkcCIsCTB4OTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VhYnIiLAkweDU4MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxmIiwJCTB4YmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGZiciIsCTB4YmMwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibHdiciIsCTB4NWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3RiIiwJMHhkNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGgiLAkweGQ0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN0dyIsCTB4ZDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RkIiwJMHhkNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGYiLAkweGRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZmJyIiwJMHhkYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdHdiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAiem1iIiwJMHhkODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWgiLAkweGQ4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInptdyIsCTB4ZDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1kIiwJMHhkODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGJwIiwJMHg5NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGhwIiwJMHg5NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdHdwIiwJMHg5NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGRwIiwJMHg5NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsaWwiLAkweGY4MGIwMDAwLAkweGZjN2YwMDAwLAkicixEIiwJCTQgfSwKLXsgImx3c2wxIiwJMHhlYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd3NsMiIsCTB4ZmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdzbDMiLAkweGZjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAibHZiIiwJMHhiMDA4MDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCi17ICJsdmgiLAkweGIwMDAwMDAxLAkweGZjMDgwMDAxLAkidix4T0EsWCIsCTQgfSwKLXsgImx2dyIsCTB4YjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAibHZkIiwJMHhiMDAwMDAwMiwJMHhmYzA4MDAwMiwJInYseE9BLFgiLAk0IH0sCi17ICJsaXYiLAkweDNjMDQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImxpdmYiLAkweDNjMDgwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN0dmIiLAkweGQwMDgwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dmgiLAkweGQwMDAwMDAxLAkweGZjMDgwMDAxLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dnciLAkweGQwMDAwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dmQiLAkweGQwMDAwMDAyLAkweGZjMDgwMDAyLAkidix4T0EsWCIsCTQgfSwKLQoteyAidHJyIiwJMHgyYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm4iLAkweDJjMDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybmQiLAkweDJjMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYWJzIiwJMHgyYzAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmFic2QiLAkweDJjMDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYyIsCTB4MmMwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNyIiwJMHgyODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjeGNyIiwJMHgyYzA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjeGNyZCIsCTB4MmMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidGJyciIsCTB4MmMwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLEIiLAkJMiB9LAoteyAidHJiciIsCTB4MjgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJiLFIiLAkJMiB9LAoteyAieGNiciIsCTB4MjgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAoteyAidGJyYnIiLAkweDI4MDEwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKLQoteyAidHJ2diIsCTB4MjgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2dm4iLAkweDJjMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydnZuZCIsCTB4MmMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2YWIiLAkweDJjMDcwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydmFiZCIsCTB4MmMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiY21wdiIsCTB4MTQwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZXhwdiIsCTB4MTQwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmx0IiwJMHgxMDAzMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2bGUiLAkweDEwMDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZndCIsCTB4MTQwMzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmdlIiwJMHgxNDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2ZXEiLAkweDEwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZuZSIsCTB4MTAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2cmx0IiwJMHgxMDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZybGUiLAkweDEwMGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJndCIsCTB4MTQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cmdlIiwJMHgxNDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZyZXEiLAkweDEwMGYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJuZSIsCTB4MTQwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAidHJ2ciIsCTB4MTQwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAidHJydiIsCTB4MTQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJidSIsCQkweDQwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibnMiLAkweDcwMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibmNvIiwJMHg3MDg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmdlIiwJMHg3MTA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYm5lIiwJMHg3MTg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVuZ2UiLAkweDcyMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidW5sZSIsCTB4NzI4ODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJndCIsCTB4NzMwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJuYW55IiwJMHg3Mzg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnMiCSwJMHg3MDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmNvIiwJMHg3MDgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmx0IiwJMHg3MTAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmVxIiwJMHg3MTgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVnZSIsCTB4NzIwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJ1bHQiLAkweDcyODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibGUiLAkweDczMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiYW55IiwJMHg3MzgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnJsbmsiLAkweDQ0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpYiIsCTB4NDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmloIiwJMHg0ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXciLAkweDRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpZCIsCTB4NGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2YiIsCTB4NjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2aCIsCTB4NjAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2dyIsCTB4NjQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2ZCIsCTB4NjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzYiIsCTB4NjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzaCIsCTB4NjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzdyIsCTB4NmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzZCIsCTB4NmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAotCi17ICJjYW1iIiwJMHg4MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1oIiwJMHg4MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJjYW13IiwJMHg4MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1kIiwJMHg4MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJjYXIiLAkweDEwMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNhcmQiLAkweDE0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNpIiwJCTB4ZjgwNTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiY2hrYm5kIiwJMHg1YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgImNhdnYiLAkweDEwMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNhdnIiLAkweDEwMDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImNhdnZkIiwJMHgxMDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjYXZyZCIsCTB4MTAwYjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJhbm1iIiwJMHg4NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1oIiwJMHg4NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhbm13IiwJMHg4NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1kIiwJMHg4NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhbnIiLAkweDA0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFuaSIsCTB4ZjgwODAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAib3JtYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtdyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JyIiwJMHgwODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJvaSIsCQkweGY4MDkwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImVvbWIiLAkweDhjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWgiLAkweDhjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbXciLAkweDhjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWQiLAkweDhjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImVvciIsCTB4MGMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZW9pIiwJMHhmODBhMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi0KLXsgImFudnYiLAkweDA0MDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFudnIiLAkweDA0MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm9ydnYiLAkweDA4MDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm9ydnIiLAkweDA4MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImVvdnYiLAkweDBjMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImVvdnIiLAkweDBjMDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAic2FjeiIsCTB4MTAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2xhIiwJMHgxYzQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGwiLAkweDFjNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsYyIsCTB4MjQ0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xhZCIsCTB4MjA0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsZCIsCTB4MjA2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhIiwJMHgxYzAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmwiLAkweDFjMjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYyIsCTB4MjQwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhZCIsCTB4MjAwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsZCIsCTB4MjAyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2RhIiwJMHgzYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGwiLAkweDNjMDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNkYyIsCTB4M2MwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RhZCIsCTB4M2MwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RsZCIsCTB4M2MwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJzdmRhIiwJMHgzYzA3MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRsIiwJMHgzYzA2MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRjIiwJMHgzYzA1MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRhZCIsCTB4M2MwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3ZkbGQiLAkweDNjMGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAic2JtIiwJMHhhYzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6Ym0iLAkweGFjMDAwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInRibSIsCTB4YTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiaW5jbWIiLAkweGEwMDAwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJpbmNtaCIsCTB4YTAwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImluY213IiwJMHhhNDAwMDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiaW5jbWQiLAkweGE0MDgwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJzYm1kIiwJMHg3YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6Ym1kIiwJMHg3YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ0Ym1kIiwJMHg3ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgInNzbSIsCTB4OWMwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAienNtIiwJMHg5YzAwMDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ0c20iLAkweDk4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLQoteyAiYWRtYiIsCTB4YzgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtaCIsCTB4YzgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtdyIsCTB4YzgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtZCIsCTB4YzgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRyIiwJMHgzODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhcm1iIiwJMHhlODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1oIiwJMHhlODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhcm13IiwJMHhlODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1kIiwJMHhlODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZGkiLAkweGY4MDEwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgInN1bWIiLAkweGNjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWgiLAkweGNjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bXciLAkweGNjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWQiLAkweGNjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ciIsCTB4M2MwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VpIiwJMHhmODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJtcG1iIiwJMHhjMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcG1oIiwJMHhjMDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJtcG13IiwJMHhjMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcHIiLAkweDM4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmQiLAkweDNjMGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1waSIsCTB4ZjgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZHZtYiIsCTB4YzQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtaCIsCTB4YzQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtdyIsCTB4YzQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZyIiwJMHgzODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkdmkiLAkweGY4MDQwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgImV4cyIsCTB4MzgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJhZHZ2IiwJMHgzMDAwMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHZ2ZCIsCTB4MzAwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYWRydiIsCTB4MzQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiYWRydmQiLAkweDM0MDgwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1dnYiLAkweDMwMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1dnZkIiwJMHgzMDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJzdXJ2IiwJMHgzNDAxMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXJ2ZCIsCTB4MzQwOTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXB2diIsCTB4MzAwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXBydiIsCTB4MzQwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJhZGZ3IiwJMHhlMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZGZkIiwJMHhlMDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZHJmdyIsCTB4MzgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRyZmQiLAkweDM4MDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZ3IiwJMHhlMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdXJmZCIsCTB4ZTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyZnciLAkweDM4MDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZkIiwJMHgzODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcGZ3IiwJMHhlNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcGZkIiwJMHhlNDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJtcHJmdyIsCTB4MzgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZmQiLAkweDM4MGUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInJmdyIsCTB4ZTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAicmZkIiwJMHhlNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJycmZ3IiwJMHgwYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnJmZCIsCTB4MGMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLQoteyAiYWR2dmZ3IiwJMHgzMDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHZ2ZmQiLAkweDMwMGMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkcnZmdyIsCTB4MzQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiYWRydmZkIiwJMHgzNDBjMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXZ2ZnciLAkweDMwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1dnZmZCIsCTB4MzAwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3VydmZ3IiwJMHgzNDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXJ2ZmQiLAkweDM0MGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wdnZmdyIsCTB4MzAwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXB2dmZkIiwJMHgzMDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcHJ2ZnciLAkweDM0MDYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wcnZmZCIsCTB4MzQwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAicnZmdyIsCTB4MzAwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2IiwJCTIgfSwKLXsgInJ2ZmQiLAkweDMwMGYwMDAwLAkweGZjMGYwMDAwLAkidiIsCQkyIH0sCi0KLXsgImZsdHciLAkweDM4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZsdGQiLAkweDM4MGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeHciLAkweDM4MDUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeGQiLAkweDM4MGQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNmcGRzIiwJMHgzYzA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgImZsdHZ3IiwJMHgwODBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJmbHR2ZCIsCTB4MDgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZml4dnciLAkweDA4MGMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImZpeHZkIiwJMHgwODBlMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjZnB2ZHMiLAkweDBjMGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLQoteyAib3J2cm4iLAkweDAwMGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgImFuZHZybiIsCTB4MDAwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAiZnJzdGVxIiwJMHgwNDA5MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtYSIsCTB4MGMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWFkIiwJMHgwYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtZiIsCTB4MDgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWZkIiwJMHgwODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJwcm9kZiIsCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAicHJvZGZkIiwJMHgwNDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtYXh2IiwJMHgxMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtYXh2ZCIsCTB4MTAwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWludiIsCTB4MTQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWludmQiLAkweDE0MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLQoteyAibHBzZCIsCTB4ZjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImxkYyIsCTB4ZjAwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgInNwbSIsCTB4MDQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJwbSIsCTB4MDQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRyaXRyIiwJMHgwMDA3MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJyaXQiLAkweDAwMDYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJycHN3dCIsCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4ciIsCTB4ZjgwNzAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJNCB9LAoteyAiaGFsdCIsCTB4MDAwMDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAid2FpdCIsCTB4MDAwMTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAibm9wIiwJMHgwMDAyMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJlaWFlIiwJMHgwMDAzMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJlZmFlIiwJMHgwMDBkMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJkaWFlIiwJMHgwMDBlMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJkZmFlIiwJMHgwMDBmMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJzcHZjIiwJMHhmODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsVCxOIiwJNCB9LAoteyAicmRzdHMiLAkweDAwMDkwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJzZXRjcHUiLAkweDAwMGMwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJjbWMiLAkweDAwMGIwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnJjdSIsCTB4MDAwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImF0dG5pbyIsCTB4MDAwNTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZnVkaXQiLAkweDI4MDgwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImJyZWFrIiwJMHgyODA5MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJmcnpzcyIsCTB4MjgwYTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAicmlwaSIsCTB4MDQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNwIiwJMHgwNDA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiYmxvY2siLAkweDA0MDYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInVuYmxvY2siLAkweDA0MDcwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInRyc2MiLAkweDA4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRzY3IiLAkweDA4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZxIiwJCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImZsdXB0ZSIsCTB4MmMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJ2aXUiLAkweDA0MGYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImxkZWwiLAkweDI4MGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxkdSIsCTB4MjgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3RkZWNjIiwJMHgyODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnBjIiwJMHgwODA0MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHBjciIsCTB4MDgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImdoYWx0IiwJMHgwYzA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZ3J1biIsCTB4MGMwNDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAidG1wciIsCTB4MmMwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJtcCIsCTB4MmMwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJ0cnJ2ZSIsCTB4MjgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRydmVyIiwJMHgyODA3MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJ2bHIiLAkweDI4MGYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi0KLXsgImxpbmtmbCIsCTB4MTgwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua2JsIiwJMHgxODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rZnAiLAkweDE4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxpbmticCIsCTB4MTgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua3BsIiwJMHgxODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua2wiLAkweDE4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVsaW5rcCIsCTB4MTgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmt0bCIsCTB4MTgwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmt0cCIsCTB4MTgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotfTsKLQotaW50IG51bW9wY29kZXMgPSBzaXplb2YoZ2xkX29wY29kZXMpIC8gc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKLQotc3RydWN0IGdsZF9vcGNvZGUgKmVuZG9wID0gZ2xkX29wY29kZXMgKyBzaXplb2YoZ2xkX29wY29kZXMpIC8KLQkJIAkJc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmggYi9pbmNsdWRlL29wY29kZS9uczMyay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmJiOGI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyogbnMzMmstb3Bjb2RlLmggLS0gT3Bjb2RlIHRhYmxlIGZvciBOYXRpb25hbCBTZW1pIDMyayBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZGVmaW5lIERFRl9NT0RFTCAyMQotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVDCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVMCi0jZGVmaW5lIERFRl9NT0RFTCAyMAotI2VuZGlmCi0vKgotICAgQWZ0ZXIgZGVjaWRpbmcgdGhlIGluc3RydWN0aW9uIGVudHJ5ICh2aWEgaGFzaC5jKSB0aGUgaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICB3aWxsIHRyeSB0byBtYXRjaCB0aGUgb3BlcmFuZHMgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIHRvIHRoZSByZXF1aXJlZCBzZXQKLSAgIGdpdmVuIGluIHRoZSBlbnRyeSBvcGVyYW5kZmllbGQuIEV2ZXJ5IG9wZXJhbmQgd2lsbCByZXN1bHQgaW4gYSBjaGFuZ2UgaW4KLSAgIHRoZSBvcGNvZGUgb3IgdGhlIGFkZGl0aW9uIG9mIGRhdGEgdG8gdGhlIG9wY29kZS4KLSAgIFRoZSBvcGVyYW5kcyBpbiB0aGUgc291cmNlIGluc3RydWN0aW9uIGFyZSBjaGVja2VkIGZvciBpbmNvbnNpc3RlbnQKLSAgIHNlbWFudGljcy4KLSAKLQlGIDogMzIgYml0IGZsb2F0CWdlbmVyYWwgZm9ybQotCUwgOiA2NCBiaXQgZmxvYXQJICAgICIKLQlCIDogYnl0ZQkJICAgICIKLQlXIDogd29yZAkJICAgICIKLQlEIDogZG91YmxlLXdvcmQJCSAgICAiCi0JQSA6IGRvdWJsZS13b3JkCQlnZW4tYWRkcmVzcy1mb3JtIGllIG5vIHJlZ3MsIG5vIGltbWVkaWF0ZQotCUkgOiBpbnRlZ2VyIHdyaXRlYWJsZSAgIGdlbiBpbnQgZXhjZXB0IGltbWVkaWF0ZSAoQSArIHJlZykKLQlaIDogZmxvYXRpbmcgd3JpdGVhYmxlCWdlbiBmbG9hdCBleGNlcHQgaW1tZWRpYXRlIChaICsgZnJlZykKLQlkIDogZGlzcGxhY2VtZW50Ci0JYiA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgIGFjYgotCXAgOiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nICBiciBiY29uZCBic3IgY3hwCi0JcSA6IHF1aWNrCi0JaSA6IGltbWVkaWF0ZSAoOCBiaXRzKQotCSAgICBUaGlzIGlzIG5vdCBhIHN0YW5kYXJkIG5zMzJrIG9wZXJhbmR0eXBlLCBpdCBpcyB1c2VkIHRvIGJ1aWxkCi0JICAgIGluc3RydWN0aW9ucyBsaWtlICAgIHN2YyBhcmcxLGFyZzIKLQkgICAgU3ZjIGlzIHRoZSBpbnN0cnVjdGlvbiBTdXBlclZpc29yQ2FsbCBhbmQgaXMgc29tZXRpbWVzIHVzZWQgdG8KLQkgICAgY2FsbCBPUy1yb3V0aW5lcyBmcm9tIHVzZXJtb2RlLiBTb21lIGFyZ3MgbWlnaHQgYmUgaGFuZHkhCi0JciA6IHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKQotCU8gOiBzZXRjZmcgaW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QKLQlDIDogY2ludiBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCVMgOiBzdHJpbmdpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCVUgOiByZWdpc3Rlcmxpc3QJc2F2ZSxlbnRlcgotCXUgOiByZWdpc3Rlcmxpc3QJcmVzdG9yZSxleGl0Ci0JTSA6IG1tdSByZWdpc3RlcgotCVAgOiBjcHUgcmVnaXN0ZXIKLQlnIDogMzpyZCBvcGVyYW5kIG9mIGluc3Mgb3IgZXh0cyBpbnN0cnVjdGlvbgotCUcgOiA0OnRoIG9wZXJhbmQgb2YgaW5zcyBvciBleHRzIGluc3RydWN0aW9uCi0JICAgIFRob3NlIG9wZXJhbmRzIGFyZSBlbmNvZGVkIGluIHRoZSBzYW1lIGJ5dGUuCi0JICAgIFRoaXMgYnl0ZSBpcyBwbGFjZWQgbGFzdCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0JZiA6IG9wZXJhbmQgb2Ygc2ZzcgotCUggOiBzZXF1ZW50LWhhY2sgZm9yIGJzciAoV2FybmluZykKLQotY29sdW1uCTEgCWluc3RydWN0aW9ucwotCTIgCW51bWJlciBvZiBiaXRzIGluIG9wY29kZS4KLQkzIAludW1iZXIgb2YgYml0cyBpbiBvcGNvZGUgZXhwbGljaXRseQotCQlkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0cnVjdGlvbiB0eXBlLgotCTQgCW9wY29kZXNlZWQsIHRoZSBudW1iZXIgd2UgYnVpbGQgb3VyIG9wY29kZQotCQlmcm9tLgotCTUgCW9wZXJhbmR0eXBlcywgdXNlZCBieSBvcGVyYW5kcGFyc2VyLgotCTYgCXNpemUgaW4gYnl0ZXMgb2YgaW1tZWRpYXRlCi0qLwotc3RydWN0IG5zMzJrX29wY29kZSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX2lkX3NpemU7IC8qIG5vdCB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgKi8KLSAgdW5zaWduZWQgY2hhciBvcGNvZGVfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGVfc2VlZDsKLSAgY2hhciAqb3BlcmFuZHM7Ci0gIHVuc2lnbmVkIGNoYXIgaW1fc2l6ZTsJLyogbm90IHVzZWQgYnkgZGlzc2Fzc2VtYmxlciAqLwotICBjaGFyICpkZWZhdWx0X2FyZ3M7CQkvKiBkZWZhdWx0IHRvIHRob3NlIGFyZ3Mgd2hlbiBub25lIGdpdmVuICovCi0gIGNoYXIgZGVmYXVsdF9tb2RlYzsJCS8qIGRlZmF1bHQgdG8gdGhpcyBhZGRyLW1vZGUgd2hlbiBhbWJpZ291cwotCQkJCSAgIGllIHdoZW4gdGhlIGFyZ3VtZW50IG9mIGEgZ2VuZXJhbCBhZGRyLW1vZGUKLQkJCQkgICBpcyBhIHBsYWluIGNvbnN0YW50ICovCi0gIGNoYXIgZGVmYXVsdF9tb2RlbDsJCS8qIGlzIGEgcGxhaW4gbGFiZWwgKi8KLX07Ci0KLSNpZmRlZiBjb21tZW50Ci0vKiBUaGlzIHNlY3Rpb24gd2FzIGZyb20gdGhlIGdkYiB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gKi8KLQotI2lmbmRlZiBuczMya19vcGNvZGVUCi0jZGVmaW5lIG5zMzJrX29wY29kZVQgaW50Ci0jZW5kaWYgLyogbm8gbnMzMmtfb3Bjb2RlVCAqLwotCi1zdHJ1Y3Qgbm90X3dvdAkJCS8qIG5zMzJrIG9wY29kZSB0YWJsZTogd290IHRvIGRvIHdpdGggdGhpcyAqLwotCQkJCS8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGludCBvYml0czsJCS8qIG51bWJlciBvZiBvcGNvZGUgYml0cyAqLwotICBpbnQgaWJpdHM7CQkvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gYml0cyAqLwotICBuczMya19vcGNvZGVUCWNvZGU7CS8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi0gIGNoYXIgKmFyZ3M7CQkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotfTsKLQotc3RydWN0IG5vdAkJCS8qIG5zMzJrIG9wY29kZSB0ZXh0ICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIG5hbWU7CS8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IG5vdF93b3QgICAgZGV0YWlsOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0vKiBJbnN0cnVjdGlvbnMgbG9vayBsaWtlIHRoaXM6Ci0gICAgCi0gICBiYXNpYyBpbnN0cnVjdGlvbi0tMSwgMiwgb3IgMyBieXRlcwotICAgaW5kZXggYnl0ZSBmb3Igb3BlcmFuZCBBLCBpZiBvcGVyYW5kIEEgaXMgaW5kZXhlZC0tMSBieXRlCi0gICBpbmRleCBieXRlIGZvciBvcGVyYW5kIEIsIGlmIG9wZXJhbmQgQiBpcyBpbmRleGVkLS0xIGJ5dGUKLSAgIGFkZHJlc3NpbmcgZXh0ZW5zaW9uIGZvciBvcGVyYW5kIEEKLSAgIGFkZHJlc3NpbmcgZXh0ZW5zaW9uIGZvciBvcGVyYW5kIEIKLSAgIGltcGxpZWQgb3BlcmFuZHMKLQotICAgT3BlcmFuZCBBIGlzIHRoZSBvcGVyYW5kIGxpc3RlZCBmaXJzdCBpbiB0aGUgZm9sbG93aW5nIG9wY29kZSB0YWJsZS4KLSAgIE9wZXJhbmQgQiBpcyB0aGUgb3BlcmFuZCBsaXN0ZWQgc2Vjb25kIGluIHRoZSBmb2xsb3dpbmcgb3Bjb2RlIHRhYmxlLgotICAgQWxsIGluc3RydWN0aW9ucyBoYXZlIGF0IG1vc3QgMiBnZW5lcmFsIG9wZXJhbmRzLCBzbyB0aGlzIGlzIGVub3VnaC4KLSAgIFRoZSBpbXBsaWVkIG9wZXJhbmRzIGFyZSBhc3NvY2lhdGVkIHdpdGggb3BlcmFuZHMgb3RoZXIgdGhhbiBBIGFuZCBCLgotCi0gICBFYWNoIG9wZXJhbmQgaGFzIGEgZGlnaXQgYW5kIGEgbGV0dGVyLgotICAgCi0gICBUaGUgZGlnaXQgZ2l2ZXMgdGhlIHBvc2l0aW9uIGluIHRoZSBhc3NlbWJseSBsYW5ndWFnZS4gIFRoZSBsZXR0ZXIsCi0gICBvbmUgb2YgdGhlIGZvbGxvd2luZywgdGVsbHMgdXMgd2hhdCBraW5kIG9mIG9wZXJhbmQgaXQgaXMuICAqLwotCi0vKiBGIDogMzIgYml0IGZsb2F0Ci0gKiBMIDogNjQgYml0IGZsb2F0Ci0gKiBCIDogYnl0ZQotICogVyA6IHdvcmQKLSAqIEQgOiBkb3VibGUtd29yZAotICogSSA6IGludGVnZXIgbm90IGltbWVkaWF0ZQotICogWiA6IGZsb2F0aW5nIG5vdCBpbW1lZGlhdGUKLSAqIGQgOiBkaXNwbGFjZW1lbnQKLSAqIHEgOiBxdWljawotICogaSA6IGltbWVkaWF0ZSAoOCBiaXRzKQotICogciA6IHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKQotICogcCA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSovCi0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgbnMzMmtfb3Bjb2Rlc1tdPQotewotICB7ICJhYnNmIiwJMTQsMjQsCTB4MzViZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzbCIsCTE0LDI0LAkweDM0YmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFic2IiLAkxNCwyNCwJMHgzMDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnN3IiwJMTQsMjQsCTB4MzE0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzZCIsCTE0LDI0LAkweDMzNGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYmIiLAkgNywxNiwJMHg0YywJIjJJMXEzcCIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYnciLAkgNywxNiwJMHg0ZCwJIjJJMXEzcCIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYmQiLAkgNywxNiwJMHg0ZiwJIjJJMXEzcCIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGYiLAkxNCwyNCwJMHgwMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRsIiwJMTQsMjQsCTB4MDBiZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkYiIsCSA2LDE2LAkweDAwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGR3IiwJIDYsMTYsCTB4MDEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGQiLAkgNiwxNiwJMHgwMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY2IiLAkgNiwxNiwJMHgxMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY3ciLAkgNiwxNiwJMHgxMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY2QiLAkgNiwxNiwJMHgxMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcGIiLAkxNCwyNCwJMHgzYzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRwdyIsCTE0LDI0LAkweDNkNGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHBkIiwJMTQsMjQsCTB4M2Y0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcWIiLAkgNywxNiwJMHgwYywJIjJJMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcXciLAkgNywxNiwJMHgwZCwJIjJJMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcWQiLAkgNywxNiwJMHgwZiwJIjJJMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkciIsCSA2LDE2LAkweDI3LAkiMUEySSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAiYWRqc3BiIiwJMTEsMTYsCTB4MDU3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkanNwdyIsCTExLDE2LAkweDA1N2QsCSIxVyIsIAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRqc3BkIiwJMTEsMTYsCTB4MDU3ZiwJIjFEIiwgCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhbmRiIiwJIDYsMTYsCTB4MjgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFuZHciLAkgNiwxNiwJMHgyOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYW5kZCIsCSA2LDE2LAkweDJiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhc2hiIiwJMTQsMjQsCTB4MDQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYXNodyIsCTE0LDI0LAkweDA1NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFzaGQiLAkxNCwyNCwJMHgwNzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiZXEiLAkgOCw4LAkweDBhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJuZSIsCSA4LDgsCTB4MWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmNzIiwJIDgsOCwJMHgyYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiY2MiLAkgOCw4LAkweDNhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJoaSIsCSA4LDgsCTB4NGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmxzIiwJIDgsOCwJMHg1YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZ3QiLAkgOCw4LAkweDZhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsZSIsCSA4LDgsCTB4N2EsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmZzIiwJIDgsOCwJMHg4YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZmMiLAkgOCw4LAkweDlhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsbyIsCSA4LDgsCTB4YWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmhzIiwJIDgsOCwJMHhiYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibHQiLAkgOCw4LAkweGNhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJnZSIsCSA4LDgsCTB4ZGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYnV0IiwJIDgsOCwJMHhlYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJidWYiLAkgOCw4LAkweGZhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJpY2IiLAkgNiwxNiwJMHgwOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmljdyIsCSA2LDE2LAkweDA5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNkIiwJIDYsMTYsCTB4MGIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY3BzcmIiLAkxMSwxNiwJMHgxN2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNwc3J3IiwJMTEsMTYsCTB4MTdkLAkiMVciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmlzcHNyYiIsCTExLDE2LAkweDM3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpc3BzcnciLAkxMSwxNiwJMHgzN2QsCSIxVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJicHQiLAkgOCw4LAkweGYyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJyIiwJIDgsOCwJMHhlYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotICB7ICJic3IiLAkgOCw4LAkweDAyLAkiMUgiLAkJMCwJIiIsCTIxLDIxCX0sCi0jZWxzZQotICB7ICJic3IiLAkgOCw4LAkweDAyLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0jZW5kaWYKLSAgeyAiY2FzZWIiLAkxMSwxNiwJMHg3N2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYXNldyIsCTExLDE2LAkweDc3ZCwJIjFXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNhc2VkIiwJMTEsMTYsCTB4NzdmLAkiMUQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGIiLAkxNCwyNCwJMHgwODRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0dyIsCTE0LDI0LAkweDA5NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXRkIiwJMTQsMjQsCTB4MGI0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGliIiwJMTQsMjQsCTB4MGM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGl3IiwJMTQsMjQsCTB4MGQ0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGlkIiwJMTQsMjQsCTB4MGY0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2tiIiwJMTEsMjQsCTB4MGVlLAkiMkEzQjFyIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2t3IiwJMTEsMjQsCTB4MWVlLAkiMkEzVzFyIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2tkIiwJMTEsMjQsCTB4M2VlLAkiMkEzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2ludiIsCTE0LDI0LAkweDI3MWUsCSIyRDFDIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGYiLAkxNCwyNCwJMHgwOWJlLAkiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBsIiwJMTQsMjQsCTB4MDhiZSwJIjFMMkwiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wYiIsCSA2LDE2LAkweDA0LAkiMUIyQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXB3IiwJIDYsMTYsCTB4MDUsCSIxVzJXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGQiLAkgNiwxNiwJMHgwNywJIjFEMkQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbWIiLAkxNCwyNCwJMHgwNGNlLAkiMUEyQTNiIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbXciLAkxNCwyNCwJMHgwNWNlLAkiMUEyQTNiIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbWQiLAkxNCwyNCwJMHgwN2NlLAkiMUEyQTNiIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcWIiLAkgNywxNiwJMHgxYywJIjJCMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcXciLAkgNywxNiwJMHgxZCwJIjJXMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcWQiLAkgNywxNiwJMHgxZiwJIjJEMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc2IiLAkxNiwyNCwJMHgwNDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzdyIsCTE2LDI0LAkweDA1MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHNkIiwJMTYsMjQsCTB4MDcwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc3QiLAkxNiwyNCwJMHg4NDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjb21iIiwJMTQsMjQsCTB4MzQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY29tdyIsCTE0LDI0LAkweDM1NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNvbWQiLAkxNCwyNCwJMHgzNzRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjdnRwIiwJMTEsMjQsCTB4MDM2ZSwJIjJBM0QxciIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImN4cCIsCSA4LDgsCTB4MjIsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiY3hwZCIsCTExLDE2LAkweDA3ZiwJIjFBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRlaWIiLAkxNCwyNCwJMHgyY2NlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkZWl3IiwJMTQsMjQsCTB4MmRjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGVpZCIsCTE0LDI0LAkweDJmY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpYSIsCSA4LDgsCTB4YzIsCSIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2ZiIsCTE0LDI0LAkweDIxYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmwiLAkxNCwyNCwJMHgyMGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZiIiwJMTQsMjQsCTB4M2NjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2dyIsCTE0LDI0LAkweDNkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmQiLAkxNCwyNCwJMHgzZmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJlbnRlciIsCSA4LDgsCTB4ODIsCSIxVTJkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4aXQiLAkgOCw4LAkweDkyLAkiMXUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0YiIsCTExLDI0LAkweDAyZSwJIjJJM0IxcjRkIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0dyIsCTExLDI0LAkweDEyZSwJIjJJM1cxcjRkIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0ZCIsCTExLDI0LAkweDMyZSwJIjJJM0QxcjRkIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0c2IiLAkxNCwyNCwJMHgwY2NlLAkiMUkySTRHM2ciLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRzdyIsCTE0LDI0LAkweDBkY2UsCSIxSTJJNEczZyIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dHNkIiwJMTQsMjQsCTB4MGZjZSwJIjFJMkk0RzNnIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmZzYiIsCTE0LDI0LAkweDA0NmUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZmc3ciLAkxNCwyNCwJMHgwNTZlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmZnNkIiwJMTQsMjQsCTB4MDc2ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxhZyIsCSA4LDgsCTB4ZDIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JmYiIsCTE0LDI0LAkweDNjM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29yZnciLAkxNCwyNCwJMHgzZDNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmZkIiwJMTQsMjQsCTB4M2YzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JsYiIsCTE0LDI0LAkweDM4M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29ybHciLAkxNCwyNCwJMHgzOTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmxkIiwJMTQsMjQsCTB4M2IzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaWJpdGIiLAkxNCwyNCwJMHgzODRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpYml0dyIsCTE0LDI0LAkweDM5NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImliaXRkIiwJMTQsMjQsCTB4M2I0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXhiIiwJMTEsMjQsCTB4NDJlLAkiMkIzQjFyIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXh3IiwJMTEsMjQsCTB4NTJlLAkiMlczVzFyIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXhkIiwJMTEsMjQsCTB4NzJlLAkiMkQzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zYiIsCTExLDI0LAkweDBhZSwJIjJCM0kxcjRkIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zdyIsCTExLDI0LAkweDFhZSwJIjJXM0kxcjRkIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zZCIsCTExLDI0LAkweDNhZSwJIjJEM0kxcjRkIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zc2IiLAkxNCwyNCwJMHgwOGNlLAkiMUIySTRHM2ciLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNzdyIsCTE0LDI0LAkweDA5Y2UsCSIxVzJJNEczZyIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc3NkIiwJMTQsMjQsCTB4MGJjZSwJIjFEMkk0RzNnIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAianNyIiwJMTEsMTYsCTB4NjdmLAkiMUEiLAkJNCwJIiIsCTIxLDIxCX0sCi0gIHsgImp1bXAiLAkxMSwxNiwJMHgyN2YsCSIxQSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAibGZzciIsCTE5LDI0LAkweDAwZjNlLCIxRCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsbXIiLAkxNSwyNCwJMHgwYjFlLAkiMkQxTSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJscHJiIiwJIDcsMTYsCTB4NmMsCSIyQjFQIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxwcnciLAkgNywxNiwJMHg2ZCwJIjJXMVAiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHByZCIsCSA3LDE2LAkweDZmLAkiMkQxUCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsc2hiIiwJMTQsMjQsCTB4MTQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHNodyIsCTE0LDI0LAkweDE1NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxzaGQiLAkxNCwyNCwJMHgxNzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtZWliIiwJMTQsMjQsCTB4MjRjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibWVpdyIsCTE0LDI0LAkweDI1Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1laWQiLAkxNCwyNCwJMHgyN2NlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb2RiIiwJMTQsMjQsCTB4MzhjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW9kdyIsCTE0LDI0LAkweDM5Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vZGQiLAkxNCwyNCwJMHgzYmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZmIiwJMTQsMjQsCTB4MDViZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bCIsCTE0LDI0LAkweDA0YmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmIiLAkgNiwxNiwJMHgxNCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dyIsCSA2LDE2LAkweDE1LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkIiwJIDYsMTYsCTB4MTcsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmJmIiwJMTQsMjQsCTB4MDQzZSwJIjFCMloiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92d2YiLAkxNCwyNCwJMHgwNTNlLAkiMVcyWiIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkZiIsCTE0LDI0LAkweDA3M2UsCSIxRDJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmJsIiwJMTQsMjQsCTB4MDAzZSwJIjFCMloiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92d2wiLAkxNCwyNCwJMHgwMTNlLAkiMVcyWiIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkbCIsCTE0LDI0LAkweDAzM2UsCSIxRDJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmZsIiwJMTQsMjQsCTB4MWIzZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bGYiLAkxNCwyNCwJMHgxNjNlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtYiIsCTE0LDI0LAkweDAwY2UsCSIxQTJBM2IiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtdyIsCTE0LDI0LAkweDAxY2UsCSIxQTJBM2IiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtZCIsCTE0LDI0LAkweDAzY2UsCSIxQTJBM2IiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxYiIsCSA3LDE2LAkweDVjLAkiMkkxcSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxdyIsCSA3LDE2LAkweDVkLAkiMkkxcSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxZCIsCSA3LDE2LAkweDVmLAkiMkkxcSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzYiIsCTE2LDI0LAkweDAwMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN3IiwJMTYsMjQsCTB4MDEwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c2QiLAkxNiwyNCwJMHgwMzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzdCIsCTE2LDI0LAkweDgwMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1YiIsCTE0LDI0LAkweDBjYWUsCSIxQTJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1dyIsCTE0LDI0LAkweDBkYWUsCSIxQTJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1ZCIsCTE0LDI0LAkweDBmYWUsCSIxQTJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzYiIsCTE0LDI0LAkweDFjYWUsCSIxQTJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzdyIsCTE0LDI0LAkweDFkYWUsCSIxQTJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzZCIsCTE0LDI0LAkweDFmYWUsCSIxQTJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnhiZCIsCTE0LDI0LAkweDFjY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnh3ZCIsCTE0LDI0LAkweDFkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnhidyIsCTE0LDI0LAkweDEwY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnpiZCIsCTE0LDI0LAkweDE4Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnp3ZCIsCTE0LDI0LAkweDE5Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnpidyIsCTE0LDI0LAkweDE0Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGYiLAkxNCwyNCwJMHgzMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxsIiwJMTQsMjQsCTB4MzBiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsYiIsCTE0LDI0LAkweDIwY2UsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bHciLAkxNCwyNCwJMHgyMWNlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxkIiwJMTQsMjQsCTB4MjNjZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnZiIsCTE0LDI0LAkweDE1YmUsICIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2wiLAkxNCwyNCwJMHgxNGJlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWdiIiwJMTQsMjQsCTB4MjA0ZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVndyIsCTE0LDI0LAkweDIxNGUsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2QiLAkxNCwyNCwJMHgyMzRlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3AiLAkgOCw4LAkweGEyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vdGIiLAkxNCwyNCwJMHgyNDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3R3IiwJMTQsMjQsCTB4MjU0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibm90ZCIsCTE0LDI0LAkweDI3NGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm9yYiIsCSA2LDE2LAkweDE4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJvcnciLAkgNiwxNiwJMHgxOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAib3JkIiwJIDYsMTYsCTB4MWIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInF1b2IiLAkxNCwyNCwJMHgzMGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJxdW93IiwJMTQsMjQsCTB4MzFjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicXVvZCIsCTE0LDI0LAkweDMzY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJkdmFsIiwJMTksMjQsCTB4MDAzMWUsIjFBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlbWIiLAkxNCwyNCwJMHgzNGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZW13IiwJMTQsMjQsCTB4MzVjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVtZCIsCTE0LDI0LAkweDM3Y2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlc3RvcmUiLAkgOCw4LAkweDcyLAkiMXUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmV0IiwJIDgsOCwJMHgxMiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldGkiLAkgOCw4LAkweDUyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldHQiLAkgOCw4LAkweDQyLAkiMWQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm90YiIsCTE0LDI0LAkweDAwNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdHciLAkxNCwyNCwJMHgwMTRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3RkIiwJMTQsMjQsCTB4MDM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRmYiIsCTE0LDI0LAkweDI0M2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kZnciLAkxNCwyNCwJMHgyNTNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGZkIiwJMTQsMjQsCTB4MjczZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRsYiIsCTE0LDI0LAkweDIwM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kbHciLAkxNCwyNCwJMHgyMTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGxkIiwJMTQsMjQsCTB4MjMzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicnhwIiwJIDgsOCwJMHgzMiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcWIiLAkxMSwxNiwJMHgzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcXciLAkxMSwxNiwJMHgzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcWQiLAkxMSwxNiwJMHgzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZWIiLAkxMSwxNiwJMHhiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZXciLAkxMSwxNiwJMHhiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZWQiLAkxMSwxNiwJMHhiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjc2IiLAkxMSwxNiwJMHgxM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY3N3IiwJMTEsMTYsCTB4MTNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NzZCIsCTExLDE2LAkweDEzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjY2IiLAkxMSwxNiwJMHgxYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2N3IiwJMTEsMTYsCTB4MWJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NjZCIsCTExLDE2LAkweDFiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoaWIiLAkxMSwxNiwJMHgyM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaGl3IiwJMTEsMTYsCTB4MjNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hpZCIsCTExLDE2LAkweDIzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsc2IiLAkxMSwxNiwJMHgyYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHN3IiwJMTEsMTYsCTB4MmJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xzZCIsCTExLDE2LAkweDJiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNndGIiLAkxMSwxNiwJMHgzM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ3R3IiwJMTEsMTYsCTB4MzNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2d0ZCIsCTExLDE2LAkweDMzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsZWIiLAkxMSwxNiwJMHgzYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbGV3IiwJMTEsMTYsCTB4M2JkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xlZCIsCTExLDE2LAkweDNiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc2IiLAkxMSwxNiwJMHg0M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZnN3IiwJMTEsMTYsCTB4NDNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzZCIsCTExLDE2LAkweDQzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmY2IiLAkxMSwxNiwJMHg0YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZmN3IiwJMTEsMTYsCTB4NGJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZjZCIsCTExLDE2LAkweDRiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsb2IiLAkxMSwxNiwJMHg1M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbG93IiwJMTEsMTYsCTB4NTNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xvZCIsCTExLDE2LAkweDUzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoc2IiLAkxMSwxNiwJMHg1YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaHN3IiwJMTEsMTYsCTB4NWJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hzZCIsCTExLDE2LAkweDViZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsdGIiLAkxMSwxNiwJMHg2M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHR3IiwJMTEsMTYsCTB4NjNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2x0ZCIsCTExLDE2LAkweDYzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNnZWIiLAkxMSwxNiwJMHg2YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ2V3IiwJMTEsMTYsCTB4NmJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2dlZCIsCTExLDE2LAkweDZiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1dGIiLAkxMSwxNiwJMHg3M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdXR3IiwJMTEsMTYsCTB4NzNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3V0ZCIsCTExLDE2LAkweDczZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1ZmIiLAkxMSwxNiwJMHg3YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWZ3IiwJMTEsMTYsCTB4N2JkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VmZCIsCTExLDE2LAkweDdiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNhdmUiLAkgOCw4LAkweDYyLAkiMVUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGIiLCAgICAxNCwyNCwJMHgxODRlLAkiMUIyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0dyIsCTE0LDI0LAkweDE5NGUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXRkIiwJMTQsMjQsCTB4MWI0ZSwJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGliIiwJMTQsMjQsCTB4MWM0ZSwJIjFCMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGl3IiwJMTQsMjQsCTB4MWQ0ZSwJIjFXMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGlkIiwJMTQsMjQsCTB4MWY0ZSwJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2V0Y2ZnIiwJMTUsMjQsCTB4MGIwZSwJIjFPIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc3IiLAkxNCwyNCwJMHgzNzNlLAkiMWYiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc2IiLAkxNiwyNCwJMHgwYzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzdyIsCTE2LDI0LAkweDBkMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNrcHNkIiwJMTYsMjQsCTB4MGYwZSwgIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc3QiLAkxNiwyNCwJMHg4YzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbXIiLAkxNSwyNCwJMHgwZjFlLAkiMkkxTSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzcHJiIiwJIDcsMTYsCTB4MmMsCSIySTFQIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNwcnciLAkgNywxNiwJMHgyZCwJIjJJMVAiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ByZCIsCSA3LDE2LAkweDJmLAkiMkkxUCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJmIiwJMTQsMjQsCTB4MTFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VibCIsCTE0LDI0LAkweDEwYmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmIiLAkgNiwxNiwJMHgyMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VidyIsCSA2LDE2LAkweDIxLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJkIiwJIDYsMTYsCTB4MjMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmNiIiwJIDYsMTYsCTB4MzAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmN3IiwJIDYsMTYsCTB4MzEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmNkIiwJIDYsMTYsCTB4MzMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YnBiIiwJMTQsMjQsCTB4MmM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VicHciLAkxNCwyNCwJMHgyZDRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJwZCIsCTE0LDI0LAkweDJmNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0jaWZkZWYgTlMzMktfU1ZDX0lNTUVEX09QRVJBTkRTCi0gIHsgInN2YyIsCSA4LDgsCTB4ZTIsCSIyaTFpIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sIC8qIG5vdCByZWFsbHksIGJ1dCBzb21lIHVuaXggdXNlcyBpdCAqLwotI2Vsc2UKLSAgeyAic3ZjIiwJIDgsOCwJMHhlMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotI2VuZGlmCi0gIHsgInRiaXRiIiwJIDYsMTYsCTB4MzQsCSIxQjJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRiaXR3IiwJIDYsMTYsCTB4MzUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRiaXRkIiwJIDYsMTYsCTB4MzcsCSIxRDJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jZmIiLAkxNCwyNCwJMHgyYzNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2Z3IiwJMTQsMjQsCTB4MmQzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNmZCIsCTE0LDI0LAkweDJmM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jbGIiLAkxNCwyNCwJMHgyODNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2x3IiwJMTQsMjQsCTB4MjkzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNsZCIsCTE0LDI0LAkweDJiM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIndhaXQiLAkgOCw4LAkweGIyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIndydmFsIiwJMTksMjQsCTB4MDA3MWUsIjFBIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInhvcmIiLAkgNiwxNiwJMHgzOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAieG9ydyIsCSA2LDE2LAkweDM5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ4b3JkIiwJIDYsMTYsCTB4M2IsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRvdGYiLAkxNCwyNCwgIDB4MGRmZSwgIjFGMkYiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZG90bCIsCTE0LDI0LCAgMHgwY2ZlLCAiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsb2diZiIsCTE0LDI0LCAgMHgxNWZlLCAiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsb2dibCIsCTE0LDI0LCAgMHgxNGZlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJwb2x5ZiIsCTE0LDI0LCAgMHgwOWZlLCAiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJwb2x5bCIsCTE0LDI0LCAgMHgwOGZlLCAiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2FsYmYiLAkxNCwyNCwgIDB4MTFmZSwgIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NhbGJsIiwJMTQsMjQsICAweDEwZmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IG51bW9wY29kZXM9c2l6ZW9mKG5zMzJrX29wY29kZXMpL3NpemVvZihuczMya19vcGNvZGVzWzBdKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgKmNvbnN0IGVuZG9wID0gbnMzMmtfb3Bjb2RlcytzaXplb2YobnMzMmtfb3Bjb2Rlcykvc2l6ZW9mKG5zMzJrX29wY29kZXNbMF0pOwotCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgQVJHX0xFTiA1MAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9wbi5oIGIvaW5jbHVkZS9vcGNvZGUvcG4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1OWEyYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9wbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qIFByaW50IEdPVUxEIFBOIChQb3dlck5vZGUpIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLUdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGdsZF9vcGNvZGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgY2hhciAqYXJnczsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQKLSAgIGlzIHRoZSBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbgotICAgaXMgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBhdCBtb3N0IGZvdXIuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgYmFzZWQgb24gdGhlIG9wY29kZS4KLQotICAgVGhlIG1hc2sgY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzCi0gICB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICByICBSZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgUiAgUmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICBiICBCYXNlIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBCICBCYXNlIHJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgdiAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBWICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEEgIE9wdGlvbmFsIGFkZHJlc3MgcmVnaXN0ZXIgKGJhc2UgcmVnaXN0ZXIpCi0gICBYICBPcHRpb25hbCBpbmRleCByZWdpc3RlcgotICAgSSAgSW1tZWRpYXRlIGRhdGEgKDE2Yml0cyBzaWduZWQpCi0gICBPICBPZmZzZXQgZmllbGQgKDE2Yml0cyBzaWduZWQpCi0gICBoICBPZmZzZXQgZmllbGQgKDE1Yml0cyBzaWduZWQpCi0gICBkICBPZmZzZXQgZmllbGQgKDE0Yml0cyBzaWduZWQpCi0gICBTICBTaGlmdCBjb3VudCBmaWVsZAotCi0gICBhbnkgb3RoZXIgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBhcyBpcy4uLgotKi8KLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi1zdHJ1Y3QgZ2xkX29wY29kZSBnbGRfb3Bjb2Rlc1tdID0KLXsKLXsgImFibSIsCTB4YTAwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiYWJyIiwJMHgxODA4MDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCi17ICJhY2kiLAkweGZjNzcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImFkZmQiLAkweGUwMDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkZnciLAkweGUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkaSIsCTB4YzgwMTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiYWRtYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtdyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRyIiwJMHgzODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJmZCIsCTB4MzgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRyZnciLAkweDM4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFkcm0iLAkweDM4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFpIiwgCTB4ZmMwMzAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImFubWIiLAkweDg0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWQiLAkweDg0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWgiLAkweDg0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFubXciLAkweDg0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFuciIsCTB4MDQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYXJtYiIsCTB4ZTgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtZCIsCTB4ZTgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtaCIsCTB4ZTgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtdyIsCTB4ZTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmNmIiwJMHhmMDAwMDAwMCwJMHhmYzA4MDAwMCwJIkkseE9BLFgiLAk0IH0sCi17ICJiY3QiLAkweGVjMDAwMDAwLAkweGZjMDgwMDAwLAkiSSx4T0EsWCIsCTQgfSwKLXsgImJlaSIsCTB4MDAwNjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiYmZ0IiwJMHhmMDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmliIiwJMHhmNDAwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmlkIiwJMHhmNDYwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmloIiwJMHhmNDIwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYml3IiwJMHhmNDQwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmwiLCAJMHhmODgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnN1YiIsCTB4NWMwODAwMDAsCTB4ZmY4ZjAwMDAsCSIiLAkJMiB9LAoteyAiYnN1Ym0iLAkweDI4MDgwMDAwLAkweGZjMDgwMDAwLAkiIiwJCTQgfSwKLXsgImJ1IiwgCTB4ZWMwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImNhbGwiLAkweDI4MDgwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImNhbGxtIiwJMHg1YzA4MDAwMCwJMHhmZjg4MDAwMCwJIiIsCQk0IH0sCi17ICJjYW1iIiwJMHg5MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1kIiwJMHg5MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1oIiwJMHg5MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJjYW13IiwJMHg5MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIueE9BLFgiLAk0IH0sCi17ICJjYXIiLAkweDEwMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNkIiwgCTB4ZmMwNjAwMDAsCTB4ZmMwNzAwMDAsCSJyLGYiLAkJNCB9LAoteyAiY2VhIiwJMHgwMDBmMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJjaSIsIAkweGM4MDUwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImNtYyIsCTB4MDQwYTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImNtbWIiLAkweDk0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbWQiLAkweDk0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbWgiLAkweDk0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbXciLAkweDk0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNtciIsCTB4MTQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZGFjaSIsCTB4ZmM3ZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiZGFlIiwJMHgwMDBlMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJkYWkiLAkweGZjMDQwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJkY2kiLAkweGZjNmYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImRpIiwgCTB4ZmMwMTAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImR2ZmQiLAkweGU0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImR2ZnciLAkweGU0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImR2aSIsCTB4YzgwNDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZHZtYiIsCTB4YzQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtaCIsCTB4YzQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtdyIsCTB4YzQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZyIiwJMHgzODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkdnJmZCIsCTB4MzgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJNCB9LAoteyAiZHZyZnciLAkweDM4MDQwMDAwLAkweGZjMGYwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVhZSIsCTB4MDAwODAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiZWNpIiwJMHhmYzY3MDAwMCwJMHhmYzdmODA4MCwJInIsSSIsCQk0IH0sCi17ICJlY3djcyIsCTB4ZmM0ZjAwMDAsCTB4ZmM3ZjgwMDAsCSIiLAkJNCB9LAoteyAiZWkiLCAJMHhmYzAwMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiZW9tYiIsCTB4OGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tZCIsCTB4OGMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9taCIsCTB4OGMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tdyIsCTB4OGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9yIiwJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJlb3JtIiwJMHgwYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJlcyIsIAkweDAwMDQwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJleG0iLAkweGE4MDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJleHIiLAkweGM4MDcwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJleHJyIiwJMHhjODA3MDAwMiwJMHhmYzdmMDAwMiwJInIiLAkJMiB9LAoteyAiZml4ZCIsCTB4MzgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZml4dyIsCTB4MzgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZmx0ZCIsCTB4MzgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZmx0dyIsCTB4MzgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZ3JpbyIsCTB4ZmMzZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiaGFsdCIsCTB4MDAwMDAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiaGlvIiwJMHhmYzM3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJqd2NzIiwJMHhmYTA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAibGEiLCAJMHg1MDAwMDAwMCwJMHhmYzAwMDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYWJyIiwJMHg1ODA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsYiIsIAkweGFjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxjcyIsIAkweDAwMDMwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJsZCIsIAkweGFjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxlYXIiLCAJMHg4MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZiIsIAkweGNjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxmYnIiLCAJMHhjYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsaCIsIAkweGFjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImxpIiwgCTB4YzgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibG1hcCIsCTB4MmMwNzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImxtYiIsCTB4YjAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG1kIiwJMHhiMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsbWgiLAkweGIwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImxtdyIsCTB4YjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5iIiwJMHhiNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbmQiLAkweGI0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxuaCIsCTB4YjQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG53IiwJMHhiNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJscHNkIiwJMHhmOTgwMDAwMCwJMHhmZjg4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJscHNkY20iLAkweGZhODAwMDAwLAkweGZmODgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImx3IiwgCTB4YWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdiciIsIAkweDVjMDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgIm1wZmQiLAkweGU0MDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wZnciLAkweGU0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1waSIsCTB4YzgwMzAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibXBtYiIsCTB4YzAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBtaCIsCTB4YzAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBtdyIsCTB4YzAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXByIiwJMHgzODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJmZCIsCTB4MzgwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZnciLAkweDM4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm5vcCIsCTB4MDAwMjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAib3JtYiIsCTB4ODgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtZCIsCTB4ODgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtaCIsCTB4ODgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtdyIsCTB4ODgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JyIiwJMHgwODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJvcnJtIiwJMHgwODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJyZHN0cyIsCTB4MDAwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJldHVybiIsCTB4MjgwZTAwMDAsCTB4ZmM3ZjAwMDAsCSIiLAkJMiB9LAoteyAicmkiLCAJMHhmYzAyMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAicm5kIiwJMHgwMDA1MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAicnBzd3QiLAkweDA0MGIwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJyc2NobmwiLAkweGZjMmYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInJzY3RsIiwJMHhmYzQ3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJyd2NzIiwJMHgwMDBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzYWN6IiwJMHgxMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzYm0iLAkweDk4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInNiciIsCTB4MTgwMDAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJNCB9LAoteyAic2VhIiwJMHgwMDBkMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJzZXRjcHUiLAkweDJjMDkwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJzaW8iLAkweGZjMTcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInNpcHUiLAkweDAwMGEwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgInNsYSIsCTB4MWM0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xhZCIsCTB4MjA0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xjIiwJMHgyNDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGwiLAkweDFjNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbGQiLAkweDIwNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNtYyIsCTB4MDQwNzAwMDAsCTB4ZmMwNzAwMDAsCSIiLAkJMiB9LAoteyAic3JhIiwJMHgxYzAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmFkIiwJMHgyMDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmMiLAkweDI0MDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNybCIsCTB4MWMyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsZCIsCTB4MjAyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3RiIiwJMHhkNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGQiLAkweGQ0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZiIsCTB4ZGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmYnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN0aCIsCTB4ZDQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtYiIsCTB4ZDgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtZCIsCTB4ZDgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtaCIsCTB4ZDgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtdyIsCTB4ZDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RwaW8iLAkweGZjMjcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInN0dyIsCTB4ZDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3R3YnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN1YWJyIiwJMHg1ODAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdWZkIiwJMHhlMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdWZ3IiwJMHhlMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdWkiLAkweGM4MDIwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgInN1bWIiLAkweGJjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWQiLAkweGJjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWgiLAkweGJjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bXciLAkweGJjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ciIsCTB4M2MwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VyZmQiLAkweDM4MGIwMDAwLAkweGZjMGYwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1cmZ3IiwJMHgzODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdXJtIiwJMHgzYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdmMiLAkweGM4MDYwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTQgfSwKLXsgInRibSIsCTB4YTQwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAidGJyIiwJMHgxODBjMDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCi17ICJ0YnJyIiwJMHgyYzAyMDAwMCwJMHhmYzBmMDAwMCwJInIsQiIsCQkyIH0sCi17ICJ0Y2NyIiwJMHgyODA0MDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJ0ZCIsIAkweGZjMDUwMDAwLAkweGZjMDcwMDAwLAkicixmIiwJCTQgfSwKLXsgInRpbyIsCTB4ZmMxZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAidG1hcHIiLAkweDJjMGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRwY2JyIiwJMHgyODBjMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAidHJiciIsCTB4MmMwMTAwMDAsCTB4ZmMwZjAwMDAsCSJiLFIiLAkJMiB9LAoteyAidHJjIiwJMHgyYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmNjIiwJMHgyODA1MDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJ0cmNtIiwJMHgyYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm4iLAkweDJjMDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybm0iLAkweDJjMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyciIsCTB4MmMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJybSIsCTB4MmMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJzYyIsCTB4MmMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJzdyIsCTB4MjgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRzY3IiLAkweDJjMGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVlaSIsCTB4MDAwNzAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAid2FpdCIsCTB4MDAwMTAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAid2N3Y3MiLAkweGZjNWYwMDAwLAkweGZjN2Y4MDAwLAkiIiwJCTQgfSwKLXsgInd3Y3MiLAkweDAwMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInhjYnIiLAkweDI4MDIwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKLXsgInhjciIsCTB4MmMwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNybSIsCTB4MmMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiemJtIiwJMHg5YzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6YnIiLAkweDE4MDQwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgInptYiIsCTB4ZjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1kIiwJMHhmODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWgiLAkweGY4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInptdyIsCTB4ZjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAienIiLCAJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAotfTsKLQotaW50IG51bW9wY29kZXMgPSBzaXplb2YoZ2xkX29wY29kZXMpIC8gc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKLQotc3RydWN0IGdsZF9vcGNvZGUgKmVuZG9wID0gZ2xkX29wY29kZXMgKyBzaXplb2YoZ2xkX29wY29kZXMpIC8KLQkJc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3BwYy5oIGIvaW5jbHVkZS9vcGNvZGUvcHBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NGYwZGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvcHBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyogcHBjLmggLS0gSGVhZGVyIGZpbGUgZm9yIFBvd2VyUEMgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBQUENfSAotI2RlZmluZSBQUENfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBwb3dlcnBjX29wY29kZS4gICovCi0KLXN0cnVjdCBwb3dlcnBjX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGRlZmluZWQgdmFsdWVzCi0gICAgIGFyZSBsaXN0ZWQgYmVsb3cuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlIHBvd2VycGNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBwb3dlcnBjX251bV9vcGNvZGVzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHBvd2VycGNfb3Bjb2RlLiAgKi8KLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfUFBDICgwMSkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQT1dFUiAoUlMvNjAwMCkgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUiAoMDIpCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgUE9XRVIyIChSaW9zIDIpIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfUE9XRVIyICgwNCkKLQotLyogT3Bjb2RlIGlzIG9ubHkgZGVmaW5lZCBvbiAzMiBiaXQgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfMzIgKDAxMCkKLQotLyogT3Bjb2RlIGlzIG9ubHkgZGVmaW5lZCBvbiA2NCBiaXQgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjQgKDAyMCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEgcHJvY2Vzc29yLiAgVGhlIDYwMQotICAgaXMgYXNzdW1lZCB0byBzdXBwb3J0IGFsbCBQb3dlclBDIChQUENfT1BDT0RFX1BQQykgaW5zdHJ1Y3Rpb25zLAotICAgYnV0IGl0IGFsc28gc3VwcG9ydHMgbWFueSBhZGRpdGlvbmFsIFBPV0VSIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjAxICgwNDApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgaW4gYm90aCB0aGUgUG93ZXIgYW5kIFBvd2VyUEMgYXJjaGl0ZWN0dXJlcwotICAgKGllLCBjb21waWxlcidzIC1tY3B1PWNvbW1vbiBvciBhc3NlbWJsZXIncyAtbWNvbSkuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX0NPTU1PTiAoMDEwMCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBmb3IgYW55IFBvd2VyIG9yIFBvd2VyUEMgcGxhdGZvcm0gKHRoaXMgaXMKLSAgIGZvciB0aGUgYXNzZW1ibGVyJ3MgLW1hbnkgb3B0aW9uLCBhbmQgaXQgZWxpbWluYXRlcyBkdXBsaWNhdGVzKS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfQU5ZICgwMjAwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGFzIHBhcnQgb2YgdGhlIDY0LWJpdCBicmlkZ2UuICAqLwotI2RlZmluZSBQUENfT1BDT0RFXzY0X0JSSURHRSAoMDQwMCkKLQotLyogQSBtYWNybyB0byBleHRyYWN0IHRoZSBtYWpvciBvcGNvZGUgZnJvbSBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFBQQ19PUChpKSAoKChpKSA+PiAyNikgJiAweDNmKQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBwb3dlcnBjX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19vcGVyYW5kCi17Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGludCBzaGlmdDsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotICB1bnNpZ25lZCBsb25nICgqaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBsb25nIG9wLAotCQkJCSAgIGNvbnN0IGNoYXIgKiplcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoKG8tPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIGxvbmcgKCpleHRyYWN0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIHBvd2VycGNfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kIHBvd2VycGNfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBwb3dlcnBjX29wZXJhbmQuICAqLwotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1NJR05FRCAoMDEpCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLCBidXQgYWxzbyBhY2NlcHRzIGEgZnVsbCBwb3NpdGl2ZQotICAgcmFuZ2Ugb2YgdmFsdWVzIHdoZW4gcnVubmluZyBpbiAzMiBiaXQgbW9kZS4gIFRoYXQgaXMsIGlmIGJpdHMgaXMKLSAgIDE2LCBpdCB0YWtlcyBhbnkgdmFsdWUgZnJvbSAtMHg4MDAwIHRvIDB4ZmZmZi4gIEluIDY0IGJpdCBtb2RlLAotICAgdGhpcyBmbGFnIGlzIGlnbm9yZWQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9TSUdOT1BUICgwMikKLQotLyogVGhpcyBvcGVyYW5kIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGluIHRoZSBhc3NlbWJsZXIgaW5wdXQuICBUaGlzCi0gICBpcyB1c2VkIHRvIHN1cHBvcnQgZXh0ZW5kZWQgbW5lbW9uaWNzIHN1Y2ggYXMgbXIsIGZvciB3aGljaCB0d28KLSAgIG9wZXJhbmRzIGZpZWxkcyBhcmUgaWRlbnRpY2FsLiAgVGhlIGFzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUKLSAgIGluc2VydCBmdW5jdGlvbiB3aXRoIGFueSBvcCB2YWx1ZS4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNhbGwKLSAgIHRoZSBleHRyYWN0IGZ1bmN0aW9uLCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSwgYW5kIGNoZWNrIHRoZSB2YWx1ZQotICAgcGxhY2VkIGluIHRoZSB2YWxpZCBhcmd1bWVudC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0ZBS0UgKDA0KQotCi0vKiBUaGUgbmV4dCBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuCi0gICBzZXBhcmF0ZWQgZnJvbSB0aGlzIG9uZSBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgbG9hZCBhbmQKLSAgIHN0b3JlIGluc3RydWN0aW9ucyB3aGljaCB3YW50IHRoZWlyIG9wZXJhbmRzIHRvIGxvb2sgbGlrZQotICAgICAgIHJlZyxkaXNwbGFjZW1lbnQocmVnKQotICAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfUEFSRU5TICgwMTApCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgdXNlIHRoZSBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIENSIGZpZWxkcywgd2hpY2gKLSAgIGFyZQotICAgICAgIGx0ICAwCWd0ICAxCWVxICAyCXNvICAzCXVuICAzCi0gICAgICAgY3IwIDAJY3IxIDEJY3IyIDIJY3IzIDMKLSAgICAgICBjcjQgNAljcjUgNQljcjYgNgljcjcgNwotICAgVGhlc2UgbWF5IGJlIGNvbWJpbmVkIGFyaXRobWV0aWNhbGx5LCBhcyBpbiBjcjIqNCtndC4gIFRoZXNlIGFyZQotICAgb25seSBzdXBwb3J0ZWQgb24gdGhlIFBvd2VyUEMsIG5vdCB0aGUgUE9XRVIuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9DUiAoMDIwKQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSByZWdpc3Rlci4gIFRoZSBkaXNhc3NlbWJsZXIgdXNlcyB0aGlzIHRvIHByaW50Ci0gICByZWdpc3RlciBuYW1lcyB3aXRoIGEgbGVhZGluZyAncicuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9HUFIgKDA0MCkKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ2YnLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfRlBSICgwMTAwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1JFTEFUSVZFICgwMjAwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIGFkZHJlc3MuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfQUJTT0xVVEUgKDA0MDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbCwgYW5kIGlzIHplcm8gaWYgb21pdHRlZC4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIHRoZSBvcHRpb25hbCBCRiBhbmQgTCBmaWVsZHMgaW4gdGhlIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLiAgVGhlCi0gICBhc3NlbWJsZXIgbXVzdCBjb3VudCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBvbiB0aGUgbGluZSwKLSAgIGFuZCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBmb3IgdGhlIG9wY29kZSwgYW5kIGRlY2lkZQotICAgd2hldGhlciB0aGlzIG9wZXJhbmQgaXMgcHJlc2VudCBvciBub3QuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZAotICAgcHJpbnQgdGhpcyBvcGVyYW5kIG91dCBvbmx5IGlmIGl0IGlzIG5vdCB6ZXJvLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfT1BUSU9OQUwgKDAxMDAwKQotCi0vKiBUaGlzIGZsYWcgaXMgb25seSB1c2VkIHdpdGggUFBDX09QRVJBTkRfT1BUSU9OQUwuICBJZiB0aGlzIG9wZXJhbmQKLSAgIGlzIG9taXR0ZWQsIHRoZW4gZm9yIHRoZSBuZXh0IG9wZXJhbmQgdXNlIHRoaXMgb3BlcmFuZCB2YWx1ZSBwbHVzCi0gICAxLCBpZ25vcmluZyB0aGUgbmV4dCBvcGVyYW5kIGZpZWxkIGZvciB0aGUgb3Bjb2RlLiAgVGhpcyB3cmV0Y2hlZAotICAgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgUG93ZXIgcm90YXRlIGluc3RydWN0aW9ucyBjYW4gdGFrZQotICAgZWl0aGVyIDQgb3IgNSBvcGVyYW5kcy4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIHByaW50IHRoaXMgb3BlcmFuZAotICAgb3V0IHJlZ2FyZGxlc3Mgb2YgdGhlIFBQQ19PUEVSQU5EX09QVElPTkFMIGZpZWxkLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfTkVYVCAoMDIwMDApCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYSBuZWdhdGl2ZSBudW1iZXIgZm9yIHRoZQotICAgcHVycG9zZXMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcgKGkuZS4sIHRoZSBub3JtYWwgbW9zdCBuZWdhdGl2ZQotICAgbnVtYmVyIGlzIGRpc2FsbG93ZWQgYW5kIG9uZSBtb3JlIHRoYW4gdGhlIG5vcm1hbCBtb3N0IHBvc2l0aXZlCi0gICBudW1iZXIgaXMgYWxsb3dlZCkuICBUaGlzIGZsYWcgd2lsbCBvbmx5IGJlIHNldCBmb3IgYSBzaWduZWQKLSAgIG9wZXJhbmQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9ORUdBVElWRSAoMDQwMDApCi0MCi0vKiBUaGUgUE9XRVIgYW5kIFBvd2VyUEMgYXNzZW1ibGVycyB1c2UgYSBmZXcgbWFjcm9zLiAgV2Uga2VlcCB0aGVtCi0gICB3aXRoIHRoZSBvcGVyYW5kcyB0YWJsZSBmb3Igc2ltcGxpY2l0eS4gIFRoZSBtYWNybyB0YWJsZSBpcyBhbgotICAgYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfbWFjcm8uICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19tYWNybwotewotICAvKiBUaGUgbWFjcm8gbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBvcGVyYW5kcyB0aGUgbWFjcm8gdGFrZXMuICAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIHZhbHVlcyBhcmUgdGhlCi0gICAgIHNhbWUgYXMgdGhvc2UgZm9yIHRoZSBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgZmxhZ3MgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEEgZm9ybWF0IHN0cmluZyB0byB0dXJuIHRoZSBtYWNybyBpbnRvIGEgbm9ybWFsIGluc3RydWN0aW9uLgotICAgICBFYWNoICVOIGluIHRoZSBzdHJpbmcgaXMgcmVwbGFjZWQgd2l0aCBvcGVyYW5kIG51bWJlciBOICh6ZXJvCi0gICAgIGJhc2VkKS4gICovCi0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyBwb3dlcnBjX21hY3Jvc1tdOwotZXh0ZXJuIGNvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3M7Ci0KLSNlbmRpZiAvKiBQUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcHlyLmggYi9pbmNsdWRlL29wY29kZS9weXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MzJiOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9weXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKiBweXJhbWlkLm9wY29kZS5oIC0tIGdkYiBpbml0aWFsIGF0dGVtcHQuICovCi0KLS8qIHB5cmFtaWQgb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzCi0gICBwYXJ0aWN1bGFyIG9wY29kZSAqLwotCi1zdHJ1Y3QgcHlyX2RhdHVtCi17Ci0gIGNoYXIgICAgICAgICAgICAgIG5hcmdzOwotICBjaGFyICogICAgICAgICAgICBhcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotICB1bnNpZ25lZCBsb25nICAgICBtYXNrOwkvKiBCaXQgdmVjdG9yOiB3aGljaCBvcGVyYW5kIG1vZGVzIGFyZSB2YWxpZAotCQkJCSAgIGZvciB0aGlzIG9wY29kZSAqLwotICB1bnNpZ25lZCBjaGFyICAgICBjb2RlOwkvKiBvcC1jb2RlIChhbHdheXMgNig/KSBiaXRzICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBweXJfaW5zbl9mb3JtYXQgewotICAgIHVuc2lnbmVkIGludCBtb2RlIDo0OwotICAgIHVuc2lnbmVkIGludCBvcGVyYXRvciA6ODsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXhfc2NhbGUgOjI7Ci0gICAgdW5zaWduZWQgaW50IGluZGV4X3JlZyA6NjsKLSAgICB1bnNpZ25lZCBpbnQgb3BlcmFuZF8xIDo2OwotICAgIHVuc2lnbmVkIGludCBvcGVyYW5kXzI6NjsKLX0gcHlyX2luc25fZm9ybWF0OwotCQotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMuCi0gICBQeXJhbWlkIGlzIHN1ZmZpY2llbnRseSBSSVNDeSB0aGF0OgotICAgICAgLSBpbnNucyBhcmUgYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiB3b3JkczsKLSAgICAgIC0gdGhlIGxlbmd0aCBvZiBhbnkgaW5zbiBjYW4gYmUgdG9sZCBmcm9tIHRoZSBmaXJzdCB3b3JkIG9mCi0gICAgICAgIHRoZSBpbnNuLiAoaWUsIGlmIHRoZXJlIGFyZSB6ZXJvLCBvbmUsIG9yIHR3byB3b3JkcyBvZgotCWltbWVkaWF0ZSBvcGVyYW5kL29mZnNldCkuCi0KLSAgIAotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGNoYXJhY3RlcnMgZm9yIGVhY2gKLSAgIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IHNwZWNpZmllcyB0aGUga2luZCBvZiBvcGVyYW5kOwotICAgdGhlIHNlY29uZCwgdGhlIHBsYWNlIGl0IGlzIHN0b3JlZC4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICBtYXNrCSBhc3NlbWJsZXIgc3ludGF4CWRlc2NyaXB0aW9uCi0gICAweDAwMDE6ICBtb3Z3IFJuLFJuCQlyZWdpc3RlciB0byByZWdpc3RlcgotICAgMHgwMDAyOiAgbW92dyBLLFJuCQlxdWljayBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKLSAgIDB4MDAwNDogIG1vdncgSSxSbgkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKLSAgIDB4MDAwODogIG1vdncgKFJuKSxSbglyZWdpc3RlciBpbmRpcmVjdCB0byByZWdpc3RlcgotICAgCSAgICBtb3Z3IChSbilbeF0sUm4JcmVnaXN0ZXIgaW5kaXJlY3QgdG8gcmVnaXN0ZXIKLSAgIDB4MDAxMDogIG1vdncgSShSbiksUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0IHRvIHJlZ2lzdGVyCi0gICAJICAgIG1vdncgSShSbilbeF0sUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0LCBpbmRleGVkLCB0byByZWdpc3RlcgotCi0gICAweDAwMjA6ICBtb3Z3IFJuLChSbikJcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgICAgICAgCi0gICAweDAwNDA6ICBtb3Z3IEssKFJuKQkJcXVpY2sgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0ICAgICAgICAgCi0gICAweDAwODA6ICBtb3Z3IEksKFJuKQkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgCi0gICAweDAxMDA6ICBtb3Z3IChSbiksKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCAgICAgICAKLSAgIDB4MDEwMDogIG1vdncgKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0ICAgICAgIAotICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAotICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAotCi0gICAweDA0MDA6ICBtb3Z3IFJuLEkoUm4pCXJlZ2lzdGVyIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgwODAwOiAgbW92dyBLLEkoUm4pCXF1aWNrIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgSSxJKFJuKQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgKFJuKSxJKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgSShSbiksSShSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0Ci0gICAJCQkJCStvZmZzZXQKLSAgIDB4MDAwMDogIChpcnJlZ3VsYXIpCQk/Pz8KLSAgIAotCi0gICBFYWNoIGluc24gaGFzIGEgZm91ci1iaXQgZmllbGQgZW5jb2RpbmcgdGhlIHR5cGUocykgb2YgaXRzIG9wZXJhbmRzLgotKi8KLQotLyogU29tZSBjb21tb24gY29tYmluYXRpb25zCi0gICAqLwotCi0vKiB0aGUgZmlyc3QgNSwoMHgxfDB4MnwweDR8MHg4fDB4MTApIGllICgxfDJ8NHw4fDE2KSwgaWUgKCAzMiAtMSkqLwotI2RlZmluZSBHRU5fVE9fUkVHICgzMSkKLQotI2RlZmluZQlVTktOT1dOICgodW5zaWduZWQgbG9uZyktMSkKLSNkZWZpbmUgQU5ZIChHRU5fVE9fUkVHIHwgKEdFTl9UT19SRUcgPDwgNSkgfCAoR0VOX1RPX1JFRyA8PCAxNSkpCi0KLSNkZWZpbmUgQ09OVkVSVCAoMXw4fDB4MTB8MHgyMHwweDIwMCkKLQotI2RlZmluZSBLX1RPX1JFRyAoMikKLSNkZWZpbmUgSV9UT19SRUcgKDQpCi0jZGVmaW5lIE5PVEtfVE9fUkVHIChHRU5fVE9fUkVHICYgfktfVE9fUkVHKQotI2RlZmluZSBOT1RJX1RPX1JFRyAoR0VOX1RPX1JFRyAmIH5JX1RPX1JFRykKLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi0KLXN0cnVjdCBweXJfb3Bjb2RlCQkvKiBweXIgb3Bjb2RlIHRleHQgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgbmFtZTsJLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLwotICBzdHJ1Y3QgcHlyX2RhdHVtICBkYXR1bTsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSBweXJfaG93IGFyZ3MKLSNkZWZpbmUgcHlyX25hcmdzIG5hcmdzCi0jZGVmaW5lIHB5cl9tYXNrIG1hc2sKLSNkZWZpbmUgcHlyX25hbWUgbmFtZQotCi1zdHJ1Y3QgcHlyX29wY29kZSBweXJfb3Bjb2Rlc1tdID0KLXsKLSAgeyJtb3ZiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MTF9LCB9LAotICB7Im1vdmgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgxMn0gfSwKLSAgeyJtb3Z3IiwJeyAyLCAiIiwgQU5ZLAkJCTB4MTB9IH0sCi0gIHsibW92bCIsCXsgMiwgIiIsIEFOWSwJCQkweDEzfSB9LAotICB7Im1uZWd3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTR9IH0sCi0gIHsibW5lZ2YiLAl7IDIsICIiLCAweDEsCQkJMHgxNX0gfSwKLSAgeyJtbmVnZCIsCXsgMiwgIiIsIDB4MSwJCQkweDE2fSB9LAotICB7Im1jb213IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTd9IH0sCi0gIHsibWFic3ciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxOH0gfSwKLSAgeyJtYWJzZiIsCXsgMiwgIiIsIDB4MSwJCQkweDE5fSB9LAotICB7Im1hYnNkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWF9IH0sCi0gIHsibXRzdHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxY30gfSwKLSAgeyJtdHN0ZiIsCXsgMiwgIiIsIDB4MSwJCQkweDFkfSB9LAotICB7Im10c3RkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWV9IH0sCi0gIHsibW92YSIsCXsgMiwgIiIsIDB4OHwweDEwLAkJMHgxZn0gfSwKLSAgeyJtb3Z6YnciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMH0gfSwKLSAgeyJtb3Z6aHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMX0gfSwKLQkJCQkvKiAyIGluc25zIG91dCBvZiBvcmRlciBoZXJlICovCi0gIHsibW92YmwiLAl7IDIsICIiLCAxLAkJCTB4NGZ9IH0sCi0gIHsiZmlsYmwiLAl7IDIsICIiLCAxLAkJCTB4NGV9IH0sCi0KLSAgeyJjdnRidyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDIyfSB9LAotICB7ImN2dGh3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjN9IH0sCi0gIHsiY3Z0d2IiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyNH0gfSwKLSAgeyJjdnR3aCIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI1fSB9LAotICB7ImN2dHdmIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjZ9IH0sCi0gIHsiY3Z0d2QiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyN30gfSwKLSAgeyJjdnRmdyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI4fSB9LAotICB7ImN2dGZkIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4Mjl9IH0sCi0gIHsiY3Z0ZHciLAl7IDIsICIiLCBDT05WRVJULAkJMHgyYX0gfSwKLSAgeyJjdnRkZiIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDJifSB9LAotCi0gIHsiYWRkdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQwfSB9LAotICB7ImFkZHdjIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDF9IH0sCi0gIHsic3VidyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQyfSB9LAotICB7InN1YndiIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDN9IH0sCi0gIHsicnN1YnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0NH0gfSwKLSAgeyJtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDV9IH0sCi0gIHsiZW11bCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ3fSB9LAotICB7InVtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDZ9IH0sCi0gIHsiZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ4fSB9LAotICB7ImVkaXYiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0YX0gfSwKLSAgeyJyZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRifSB9LAotICB7InVkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDl9IH0sCi0gIHsibW9kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRjfSB9LAotICB7InVtb2R3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGR9IH0sCi0KLQotICB7ImFkZGYiLAl7IDIsICIiLCAxLAkJCTB4NTB9IH0sCi0gIHsiYWRkZCIsCXsgMiwgIiIsIDEsCQkJMHg1MX0gfSwKLSAgeyJzdWJmIiwJeyAyLCAiIiwgMSwJCQkweDUyfSB9LAotICB7InN1YmQiLAl7IDIsICIiLCAxLAkJCTB4NTN9IH0sCi0gIHsibXVsZiIsCXsgMiwgIiIsIDEsCQkJMHg1Nn0gfSwKLSAgeyJtdWxkIiwJeyAyLCAiIiwgMSwJCQkweDU3fSB9LAotICB7ImRpdmYiLAl7IDIsICIiLCAxLAkJCTB4NTh9IH0sCi0gIHsiZGl2ZCIsCXsgMiwgIiIsIDEsCQkJMHg1OX0gfSwKLQotCi0gIHsiY21wYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDYxfSB9LAotICB7ImNtcGgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Mn0gfSwKLSAgeyJjbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjB9IH0sCi0gIHsidWNtcGIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Nn0gfSwKLSAgLyogV0hZIG5vICJ1Y21waCI/Pz8gKi8KLSAgeyJ1Y21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY1fSB9LAotICB7InhjaHciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwZn0gfSwKLQotCi0gIHsiYW5kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMwfSB9LAotICB7Im9ydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMxfSB9LAotICB7InhvcnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzMn0gfSwKLSAgeyJiaWN3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzN9IH0sCi0gIHsibHNobHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzOH0gfSwKLSAgeyJhc2hsdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNhfSB9LAotICB7ImFzaGxsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2N9IH0sCi0gIHsiYXNocnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzYn0gfSwKLSAgeyJhc2hybCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNkfSB9LAotICB7InJvdGx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2V9IH0sCi0gIHsicm90cnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzZn0gfSwKLQotICAvKiBwdXNoIGFuZCBwb3AgaW5zbnMgYXJlICJnb2luZyBhd2F5IG5leHQgcmVsZWFzZSIuICovCi0gIHsicHVzaHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgwY30gfSwKLSAgeyJwb3B3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MGR9IH0sCi0gIHsicHVzaGEiLAl7IDIsICIiLCAoMHg4fDB4MTApLAkJMHgwZX0gfSwKLQotICB7ImJpdHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MzV9IH0sCi0gIHsiYml0Y3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgzNn0gfSwKLSAgLyogc29tZSBraW5kIG9mIGlicmEvZGJyYSBpbnNucz8/Ki8KLSAgeyJpY21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY3fSB9LAotICB7ImRjbXB3IiwJeyAyLCAiIiwgKDF8NHwweDIwfDB4ODB8MHg0MDB8MHgxMDAwKSwJMHg2OX0gfSwvKkZJWE1FKi8KLSAgeyJhY21wdyIsCXsgMiwgIiIsIDEsCQkJMHg2Yn0gfSwKLQotICAvKiBDYWxsIGlzIHdyaXR0ZW4gYXMgYSAxLW9wIGluc24sIGJ1dCBpcyBhbHdheXMgKGRpcylhc3NlbWJsZWQgYXMgYSAyLW9wCi0gICAgIGluc24gd2l0aCBhIDJuZCBvcCBvZiB0cjE0LiAgIFRoZSBhc3NlbWJsZXIgd2lsbCBoYXZlIHRvIGdyb2sgdGhpcy4gICovCi0gIHsiY2FsbCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDA0fSB9LAotICB7ImNhbGwiLAl7IDEsICIiLCBHRU5fVE9fUkVHLAkJMHgwNH0gfSwKLQotICB7ImNhbGxrIiwJeyAxLCAiIiwgVU5LTk9XTiwJCTB4MDZ9IH0sLyogc3lzdGVtIGNhbGw/Ki8KLSAgLyogUmV0IGlzIHVzdWFsbHkgd3JpdHRlbiBhcyBhIDAtb3AgaW5zbiwgYnV0IGdldHMgZGlzYXNzZW1ibGVkIGFzIGEKLSAgICAgMS1vcCBpbnNuLiBUaGUgb3BlcmFuZCBpcyBhbHdheXMgdHIxNS4gKi8KLSAgeyJyZXQiLAl7IDAsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKLSAgeyJyZXQiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKLSAgeyJhZHNmIiwJeyAyLCAiIiwgKDF8Mnw0KSwJCTB4MDh9IH0sCi0gIHsicmV0ZCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDBhfSB9LAotICB7ImJ0YyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAxfSB9LAotICB7ImJmYyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAyfSB9LAotICAvKiBDYXJlZnVsOiBoYWx0IGlzIDB4MDAwMDAwMDAuIEp1bXAgbXVzdCBoYXZlIHNvbWUgb3RoZXIgKG1vZGU/KWJpdCBzZXQ/PyAqLwotICB7Imp1bXAiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJidHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHhmMDB9IH0sCi0gIC8qIHJlYWQgY29udHJvbC1zdGFjayBwb2ludGVyIGlzIGFub3RoZXIgMS1vci0yIG9wZXJhbmQgaW5zbi4gKi8KLSAgeyJyY3NwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDFmfSB9LAotICB7InJjc3AiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMWZ9IH0KLX07Ci0KLS8qIGVuZDogcHlyYW1pZC5vcGNvZGUuaCAqLwotLyogT25lIGRheSBJIHdpbGwgaGF2ZSB0byB0YWtlIHRoZSB0aW1lIHRvIGZpbmQgb3V0IHdoYXQgb3BlcmFuZHMKLSAgIGFyZSB2YWxpZCBmb3IgdGhlc2UgaW5zbnMsIGFuZCBndWVzcyBhdCB3aGF0IHRoZXkgbWVhbi4KLQotICAgSSBjYW4ndCBpbWFnaW5lIHdoYXQgdGhlICJJPz8/IiBpbnNucyAoaWdsb2IsIGV0YykgZG8uCi0KLSAgIHRoZSBhcml0aG1ldGljLXNvdW5kaW5nIGluc25zIGVuZGluZyBpbiAicCIgc291bmQgYXdmdWxseSBsaWtlIEJDRAotICAgYXJpdGhtZXRpYyBpbnNuczoKLSAgIAlkc2hscCAtPiBEZWNpbWFsIFNIaWZ0IExlZnQgUGFja2VkCi0JZHNocnAgLT4gRGVjaW1hbCBTSGlmdCBSaWdodCBQYWNrZWQKLSAgIGFuZCBjdnRscCB3b3VsZCBiZSBjb252ZXJ0IGxvbmcgdG8gcGFja2VkLgotICAgSSBoYXZlIG5vIGlkZWEgaG93IHRoZSBvcGVyYW5kcyBhcmUgaW50ZXJwcmV0ZWQ7IGJ1dCBoYXZpbmcgdGhlbSBiZQotICAgYSBsb25nIHJlZ2lzdGVyIHdpdGggKGFkZHJlc3MsIGxlbmd0aCkgb2YgYW4gaW4tbWVtb3J5IHBhY2tlZCBCQ0Qgb3BlcmFuZAotICAgd291bGQgbm90IGJlIHN1cnByaXNpbmcuCi0gICBUaGV5IGFyZSB1bmxpa2VseSB0byBiZSBhIHBhY2tlZCBiY2Qgc3RyaW5nOiA2NCBiaXRzIG9mIGxvbmcgZ2l2ZQotICAgaXMgb25seSAxNSBkaWdpdHMrc2lnbiwgd2hpY2ggaXNuJ3QgZW5vdWdoIGZvciBDT0JPTC4KLSAqLyAKLSNpZiAwCi0gIHsid2NzcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlIGNzcD8qLwotICAvKiBUaGUgT1N4IE9wZXJhdGluZyBTeXN0ZW0gUG9ydGluZyBHdWlkZSBjbGFpbXMgU1NMIGRvZXMgdGhpbmdzCi0gICAgIHdpdGggdHIxMiAoYSByZWdpc3RlciByZXNlcnZlZCB0byBpdCkgdG8gZG8gd2l0aCBzdGF0aWMgYmxvY2stc3RydWN0dXJlCi0gICAgIHJlZmVyZW5jZXMuICBTU0w9U2V0IFN0YXRpYyBMaW5rPyAgSXQncyAiR29pbmcgYXdheSBuZXh0IHJlbGVhc2UiLiAqLwotICB7InNzbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImNjbXBzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibGNkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidWVtdWwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp1bnNpZ25lZCBlbXVsKi8KLSAgeyJzcmYiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypHaWRnZXQgdGltZT8/PyovCi0gIHsibW5lZ3AiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgL21vdmUtbmVnIHBoeXM/Ki8KLSAgeyJsZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypsb2FkIHBoeXM/Ki8KLSAgeyJsZHRpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibGRiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3RwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3R0aSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN0YiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN0dSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImFkZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJzdWJwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibXVscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImRpdnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJkc2hscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAgLyogZGVjIHNobCBwYWNrZWQ/ICovCi0gIHsiZHNocnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogZGVjIHNociBwYWNrZWQ/ICovCi0gIHsibW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKm1vdmUgKHN0cmluZz8pPyovCi0gIHsiY21wcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjbXAgcGh5cz8qLwotICB7ImNtcHMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY21wIChzdHJpbmc/KT8qLwotICB7ImN2dGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGN2dCBsb25nIHRvIHA/PyovCi0gIHsiY3Z0cGwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY3Z0IHAgdG8gbD8/Ki8KLSAgeyJkaW50ciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiA/PyBpbnRyID8qLwotICB7InJwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiByZWFkIHBoeXMgd29yZD8qLwotICB7IndwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiB3cml0ZSBwaHlzIHdvcmQ/Ki8KLSAgeyJjbW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InJzdWJ3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiYmljcHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNsciBiaXQgaW4gcHN3PyAqLwotICB7ImJpc3BzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBzZXQgYml0IGluIHBzdz8gKi8KLSAgeyJlaW8iLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogPz8gP2lvID8gKi8KLSAgeyJjYWxscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjYWxsIHBoeXM/Ki8KLSAgeyJjYWxsciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImxwY3h0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qbG9hZCBwcm9jIGNvbnRleHQqLwotICB7InJlaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnJldCBmcm9tIGludHJwdCovCi0gIHsicnBvcnQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypyZWFkLXBvcnQ/Ki8KLSAgeyJydG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qcmVhZC10aW1lLW9mLWRheT8qLwotICB7InNzaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InZ0cGEiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp2aXJ0LXRvLXBoeXMtYWRkcj8qLwotICB7IndpY2wiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogd3JpdGUgaWNsID8gKi8KLSAgeyJ3cG9ydCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlLXBvcnQ/Ki8KLSAgeyJ3dG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUtdGltZS1vZi1kYXk/Ki8KLSAgeyJmbGljIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiaWdsb2IiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBnbG9iYWw/ICovCi0gIHsiaXBoeXMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBwaHlzaWNhbD8gKi8KLSAgeyJpcGlkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgcGlkPyAqLwotICB7Iml2ZWN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgdmVjdG9yPyAqLwotICB7ImxhbXN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidGlvIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmggYi9pbmNsdWRlL29wY29kZS9zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE1OWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIG9wY29kZSB0YWJsZSBmb3IgdGhlIHNwYXJjLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBhbmQKLXRoZSBHTlUgQmludXRpbHMuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4JSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVGhlIFNQQVJDIG9wY29kZSB0YWJsZSAoYW5kIG90aGVyIHJlbGF0ZWQgZGF0YSkgaXMgZGVmaW5lZCBpbgotICAgdGhlIG9wY29kZXMgbGlicmFyeSBpbiBzcGFyYy1vcGMuYy4gIElmIHlvdSBjaGFuZ2UgYW55dGhpbmcgaGVyZSwgbWFrZQotICAgc3VyZSB5b3UgZml4IHVwIHRoYXQgZmlsZSwgYW5kIHZpY2UgdmVyc2EuICAqLwotCi0gLyogRklYTUUtc29tZWRheTogcGVyaGFwcyB0aGUgLGEncyBhbmQgc3VjaCBzaG91bGQgYmUgZW1iZWRkZWQgaW4gdGhlCi0gICAgaW5zdHJ1Y3Rpb24ncyBuYW1lIHJhdGhlciB0aGFuIHRoZSBhcmdzLiAgVGhpcyB3b3VsZCBtYWtlIGdhcyBmYXN0ZXIsIHBpbnNuCi0gICAgc2xvd2VyLCBidXQgd291bGQgbWVzcyB1cCBzb21lIG1hY3JvcyBhIGJpdC4gIHhveG9yaWNoLiAqLwotCi0vKiBMaXN0IG9mIGluc3RydWN0aW9uIHNldHMgdmFyaWF0aW9ucy4KLSAgIFRoZXNlIHZhbHVlcyBhcmUgc3VjaCB0aGF0IGVhY2ggZWxlbWVudCBpcyBlaXRoZXIgYSBzdXBlcnNldCBvZiBhCi0gICBwcmVjZWRpbmcgZWFjaCBvbmUgb3IgdGhleSBjb25mbGljdCBpbiB3aGljaCBjYXNlIFNQQVJDX09QQ09ERV9DT05GTElDVF9QCi0gICByZXR1cm5zIG5vbi16ZXJvLgotICAgVGhlIHZhbHVlcyBhcmUgaW5kaWNlcyBpbnRvIGBzcGFyY19vcGNvZGVfYXJjaHMnIGRlZmluZWQgaW4gc3BhcmMtb3BjLmMuCi0gICBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IHVwZGF0aW5nIHNwYXJjLW9wYy5jLiAgKi8KLQotZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgewotICBTUEFSQ19PUENPREVfQVJDSF9WNiA9IDAsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1Y3LAotICBTUEFSQ19PUENPREVfQVJDSF9WOCwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSwKLSAgLyogdjkgdmFyaWFudHMgbXVzdCBhcHBlYXIgbGFzdCAqLwotICBTUEFSQ19PUENPREVfQVJDSF9WOSwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfVjlBLCAvKiB2OSB3aXRoIHVsdHJhc3BhcmMgYWRkaXRpb25zICovCi0gIFNQQVJDX09QQ09ERV9BUkNIX0JBRCAvKiBlcnJvciByZXR1cm4gZnJvbSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKi8KLX07Ci0KLS8qIFRoZSBoaWdoZXN0IGFyY2hpdGVjdHVyZSBpbiB0aGUgdGFibGUuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQVJDSF9NQVggKFNQQVJDX09QQ09ERV9BUkNIX0JBRCAtIDEpCi0KLS8qIEdpdmVuIGFuIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsLCByZXR1cm4gdGhlIGJpdG1hc2sgdG8gdXNlIGluCi0gICBpbnNuIGVuY29kaW5nL2RlY29kaW5nLiAgKi8KLSNkZWZpbmUgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyhhcmNoKSAoMSA8PCAoYXJjaCkpCi0KLS8qIEdpdmVuIGEgdmFsaWQgc3BhcmNfb3Bjb2RlX2FyY2hfdmFsLCByZXR1cm4gbm9uLXplcm8gaWYgaXQncyB2OS4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AoYXJjaCkgKChhcmNoKSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQotLyogVGFibGUgb2YgY3B1IHZhcmlhbnRzLiAgKi8KLQotc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTWFzayBvZiBzcGFyY19vcGNvZGVfYXJjaF92YWwncyBzdXBwb3J0ZWQuCi0gICAgIEVHOiBGb3IgdjcgdGhpcyB3b3VsZCBiZQotICAgICAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoLi4uX1Y2KSB8IFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKC4uLl9WNykpLgotICAgICBUaGVzZSBhcmUgc2hvcnQncyBiZWNhdXNlIHNwYXJjX29wY29kZS5hcmNoaXRlY3R1cmUgaXMuICAqLwotICBzaG9ydCBzdXBwb3J0ZWQ7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHNwYXJjX29wY29kZV9hcmNoc1tdOwotCi0vKiBHaXZlbiBhcmNoaXRlY3R1cmUgbmFtZSwgbG9vayB1cCBpdCdzIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB2YWx1ZS4gICovCi1leHRlcm4gZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZXR1cm4gdGhlIGJpdG1hc2sgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMgZm9yIEFSQ0guICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfU1VQUE9SVEVEKEFSQ0gpIChzcGFyY19vcGNvZGVfYXJjaHNbQVJDSF0uc3VwcG9ydGVkKQotCi0vKiBOb24temVybyBpZiBBUkNIMSBjb25mbGljdHMgd2l0aCBBUkNIMi4KLSAgIElFOiBBUkNIMSBhcyBhIHN1cHBvcnRlZCBiaXQgc2V0IHRoYXQgQVJDSDIgZG9lc24ndCwgYW5kIHZpY2UgdmVyc2EuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUChBUkNIMSwgQVJDSDIpIFwKLSgoKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkgXAotICAhPSBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChBUkNIMSkpIFwKLSAmJiAoKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkgXAotICAgICAhPSBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChBUkNIMikpKQotCi0vKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LiAgKi8KLQotc3RydWN0IHNwYXJjX29wY29kZSB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CS8qIEJpdHMgdGhhdCBtdXN0IGJlIHNldC4gKi8KLSAgdW5zaWduZWQgbG9uZyBsb3NlOwkvKiBCaXRzIHRoYXQgbXVzdCBub3QgYmUgc2V0LiAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGlzIHdhcyBjYWxsZWQgImRlbGF5ZWQiIGluIHZlcnNpb25zIGJlZm9yZSB0aGUgZmxhZ3MuICovCi0gIGNoYXIgZmxhZ3M7Ci0gIHNob3J0IGFyY2hpdGVjdHVyZTsJLyogQml0bWFzayBvZiBzcGFyY19vcGNvZGVfYXJjaF92YWwncy4gICovCi19OwotCi0jZGVmaW5lCUZfREVMQVlFRAkxCS8qIERlbGF5ZWQgYnJhbmNoICovCi0jZGVmaW5lCUZfQUxJQVMJCTIJLyogQWxpYXMgZm9yIGEgInJlYWwiIGluc3RydWN0aW9uICovCi0jZGVmaW5lCUZfVU5CUgkJNAkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCAqLwotI2RlZmluZQlGX0NPTkRCUgk4CS8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLwotI2RlZmluZQlGX0pTUgkJMTYJLyogU3Vicm91dGluZSBjYWxsICovCi0jZGVmaW5lIEZfRkxPQVQJCTMyCS8qIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIChub3QgYSBicmFuY2gpICovCi0jZGVmaW5lIEZfRkJSCQk2NAkvKiBGbG9hdGluZyBwb2ludCBicmFuY2ggKi8KLS8qIEZJWE1FOiBBZGQgRl9BTkFDSFJPTklTVElDIGZsYWcgZm9yIHY5LiAgKi8KLQotLyoKLQotQWxsIHNwYXJjIG9wY29kZXMgYXJlIDMyIGJpdHMsIGV4Y2VwdCBmb3IgdGhlIGBzZXQnIGluc3RydWN0aW9uIChyZWFsbHkgYQotbWFjcm8pLCB3aGljaCBpcyA2NCBiaXRzLiBJdCBpcyBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlLgotCi1UaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEgcGFydGljdWxhcgotb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZSBvZiB0aGF0IG9wY29kZS4KLQotVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGNoYXJhY3RlciBmb3IgZWFjaCBvcGVyYW5kIG9mIHRoZQotaW5zdHJ1Y3Rpb24uCi0KLUtpbmRzIG9mIG9wZXJhbmRzOgotCSMJTnVtYmVyIHVzZWQgYnkgb3B0aW1pemVyLglJdCBpcyBpZ25vcmVkLgotCTEJcnMxIHJlZ2lzdGVyLgotCTIJcnMyIHJlZ2lzdGVyLgotCWQJcmQgcmVnaXN0ZXIuCi0JZQlmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotCXYJZnJzMSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAoZG91YmxlL2V2ZW4pLgotCVYJZnJzMSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAocXVhZC9tdWx0aXBsZSBvZiA0KS4KLQlmCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0JQglmcnMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChkb3VibGUvZXZlbikuCi0JUglmcnMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChxdWFkL211bHRpcGxlIG9mIDQpLgotCWcJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLQlICWZyc2QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKGRvdWJsZS9ldmVuKS4KLQlKCWZyc2QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKHF1YWQvbXVsdGlwbGUgb2YgNCkuCi0JYgljcnMxIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JYwljcnMyIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JRAljcnNkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JbQlhbHRlcm5hdGUgc3BhY2UgcmVnaXN0ZXIgKGFzcikgaW4gcmQKLQlNCWFsdGVybmF0ZSBzcGFjZSByZWdpc3RlciAoYXNyKSBpbiByczEKLQloCTIyIGhpZ2ggYml0cy4KLQlYCTUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZQotCVkJNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlCi0JSwlNRU1CQVIgbWFzayAoNyBiaXRzKS4gKHY5KQotCWoJMTAgYml0IEltbWVkaWF0ZS4gKHY5KQotCUkJMTEgYml0IEltbWVkaWF0ZS4gKHY5KQotCWkJMTMgYml0IEltbWVkaWF0ZS4KLQluCTIyIGJpdCBpbW1lZGlhdGUuCi0JawkyKzE0IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuICh2OSkKLQlHCTE5IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuICh2OSkKLQlsCTIyIGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0JTAkzMCBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlLgotCWEJQW5udWwuCVRoZSBhbm51bCBiaXQgaXMgc2V0LgotCUEJQWx0ZXJuYXRlIGFkZHJlc3Mgc3BhY2UuIFN0b3JlZCBhcyA4IGJpdHMuCi0JQwlDb3Byb2Nlc3NvciBzdGF0ZSByZWdpc3Rlci4KLQlGCWZsb2F0aW5nIHBvaW50IHN0YXRlIHJlZ2lzdGVyLgotCXAJUHJvY2Vzc29yIHN0YXRlIHJlZ2lzdGVyLgotCU4JQnJhbmNoIHByZWRpY3QgY2xlYXIgIixwbiIgKHY5KQotCVQJQnJhbmNoIHByZWRpY3Qgc2V0ICIscHQiICh2OSkKLQl6CSVpY2MuICh2OSkKLQlaCSV4Y2MuICh2OSkKLQlxCUZsb2F0aW5nIHBvaW50IHF1ZXVlLgotCXIJU2luZ2xlIHJlZ2lzdGVyIHRoYXQgaXMgYm90aCByczEgYW5kIHJkLgotCU8JU2luZ2xlIHJlZ2lzdGVyIHRoYXQgaXMgYm90aCByczIgYW5kIHJkLgotCVEJQ29wcm9jZXNzb3IgcXVldWUuCi0JUwlTcGVjaWFsIGNhc2UuCi0JdAlUcmFwIGJhc2UgcmVnaXN0ZXIuCi0JdwlXaW5kb3cgaW52YWxpZCBtYXNrIHJlZ2lzdGVyLgotCXkJWSByZWdpc3Rlci4KLQl1CXNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycyBpbiByZCBwb3NpdGlvbgotCVUJc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGluIHJzMSBwb3NpdGlvbgotCUUJJWNjci4gKHY5KQotCXMJJWZwcnMuICh2OSkKLQlQCSVwYy4gICh2OSkKLQlXCSV0aWNrLgkodjkpCi0JbwklYXNpLiAodjkpCi0JNgklZmNjMC4gKHY5KQotCTcJJWZjYzEuICh2OSkKLQk4CSVmY2MyLiAodjkpCi0JOQklZmNjMy4gKHY5KQotCSEJUHJpdmlsZWdlZCBSZWdpc3RlciBpbiByZCAodjkpCi0JPwlQcml2aWxlZ2VkIFJlZ2lzdGVyIGluIHJzMSAodjkpCi0JKglQcmVmZXRjaCBmdW5jdGlvbiBjb25zdGFudC4gKHY5KQotCXgJT1BGIGZpZWxkICh2OSBpbXBkZXApLgotCTAJMzIvNjQgYml0IGltbWVkaWF0ZSBmb3Igc2V0IG9yIHNldHggKHY5KSBpbnNucwotCV8JQW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIGluIHJkICh2OWEpCi0JLwlBbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIgaW4gcnMxICh2OWEpCi0KLVRoZSBmb2xsb3dpbmcgY2hhcnMgYXJlIHVudXNlZDogKG5vdGU6ICxbXSBhcmUgdXNlZCBhcyBwdW5jdHVhdGlvbikKLVszNDVdCi0KLSovCi0KLSNkZWZpbmUgT1AyKHgpCQkoKCh4KSYweDcpIDw8IDIyKSAvKiBvcDIgZmllbGQgb2YgZm9ybWF0MiBpbnNucyAqLwotI2RlZmluZSBPUDMoeCkJCSgoKHgpJjB4M2YpIDw8IDE5KSAvKiBvcDMgZmllbGQgb2YgZm9ybWF0MyBpbnNucyAqLwotI2RlZmluZSBPUCh4KQkJKCh1bnNpZ25lZCkoKHgpJjB4MykgPDwgMzApIC8qIG9wIGZpZWxkIG9mIGFsbCBpbnNucyAqLwotI2RlZmluZSBPUEYoeCkJCSgoKHgpJjB4MWZmKSA8PCA1KSAvKiBvcGYgZmllbGQgb2YgZmxvYXQgaW5zbnMgKi8KLSNkZWZpbmUgT1BGX0xPVzUoeCkJT1BGKCh4KSYweDFmKSAvKiB2OSAqLwotI2RlZmluZSBGM0YoeCwgeSwgeikJKE9QKHgpIHwgT1AzKHkpIHwgT1BGKHopKSAvKiBmb3JtYXQzIGZsb2F0IGluc25zICovCi0jZGVmaW5lIEYzSSh4KQkJKCgoeCkmMHgxKSA8PCAxMykgLyogaW1tZWRpYXRlIGZpZWxkIG9mIGZvcm1hdCAzIGluc25zICovCi0jZGVmaW5lIEYyKHgsIHkpCShPUCh4KSB8IE9QMih5KSkgLyogZm9ybWF0IDIgaW5zbnMgKi8KLSNkZWZpbmUgRjMoeCwgeSwgeikJKE9QKHgpIHwgT1AzKHkpIHwgRjNJKHopKSAvKiBmb3JtYXQzIGluc25zICovCi0jZGVmaW5lIEYxKHgpCQkoT1AoeCkpCi0jZGVmaW5lIERJU1AzMCh4KQkoKHgpJjB4M2ZmZmZmZmYpCi0jZGVmaW5lIEFTSSh4KQkJKCgoeCkmMHhmZikgPDwgNSkgLyogYXNpIGZpZWxkIG9mIGZvcm1hdDMgaW5zbnMgKi8KLSNkZWZpbmUgUlMyKHgpCQkoKHgpJjB4MWYpIC8qIHJzMiBmaWVsZCAqLwotI2RlZmluZSBTSU1NMTMoeCkJKCh4KSYweDFmZmYpIC8qIHNpbW0xMyBmaWVsZCAqLwotI2RlZmluZSBSRCh4KQkJKCgoeCkmMHgxZikgPDwgMjUpIC8qIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZpZWxkICovCi0jZGVmaW5lIFJTMSh4KQkJKCgoeCkmMHgxZikgPDwgMTQpIC8qIHJzMSBmaWVsZCAqLwotI2RlZmluZSBBU0lfUlMyKHgpCShTSU1NMTMoeCkpCi0jZGVmaW5lIE1FTUJBUih4KQkoKHgpJjB4N2YpCi0jZGVmaW5lIFNMQ1BPUCh4KQkoKCh4KSYweDdmKSA8PCA2KSAvKiBzcGFyY2xldCBjcG9wICovCi0KLSNkZWZpbmUgQU5OVUwJKDE8PDI5KQotI2RlZmluZSBCUFJFRAkoMTw8MTkpCS8qIHY5ICovCi0jZGVmaW5lCUlNTUVECUYzSSgxKQotI2RlZmluZSBSRF9HMAlSRCh+MCkKLSNkZWZpbmUJUlMxX0cwCVJTMSh+MCkKLSNkZWZpbmUJUlMyX0cwCVJTMih+MCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgc3BhcmNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBzcGFyY19udW1fb3Bjb2RlczsKLQotZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfYXNpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9hc2kgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gaW50IHNwYXJjX2VuY29kZV9tZW1iYXIgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX21lbWJhciBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX3ByZWZldGNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9wcmVmZXRjaCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyBQQVJBTVMgKChpbnQpKTsKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHNwYXJjLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmggYi9pbmNsdWRlL29wY29kZS90YWhvZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNlZTI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIFBvcnRlZCBieSB0aGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgWW9yayBhdCBCdWZmYWxvIGJ5IHRoZSBEaXN0cmlidXRlZAotICogQ29tcHV0ZXIgU3lzdGVtcyBMYWIsIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSwgMTk5MS4KLSAqLwotCi0jaWZuZGVmIHRhaG9lX29wY29kZVQKLSNkZWZpbmUgdGFob2Vfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyB0YWhvZV9vcGNvZGVUICovCi0KLXN0cnVjdCB2b3Rfd290ICAgICAgICAgICAgICAgICAgLyogdGFob2Ugb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIGFyZ3M7ICAgICAgIC8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHRhaG9lX29wY29kZVQgICAgICAgY29kZTsgICAgIC8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi19OwotCi1zdHJ1Y3Qgdm90ICAgICAgICAgICAgICAgICAgICAgIC8qIHRhaG9lIG9wY29kZSB0ZXh0ICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIG5hbWU7ICAgICAgIC8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IHZvdF93b3QgICAgZGV0YWlsOyAgICAgLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSB2b3RfaG93IGFyZ3MKLSNkZWZpbmUgdm90X2NvZGUgY29kZQotI2RlZmluZSB2b3RfZGV0YWlsIGRldGFpbAotI2RlZmluZSB2b3RfbmFtZSBuYW1lCi0KLXN0YXRpYyBzdHJ1Y3Qgdm90Ci12b3RzdHJzW10gPQotewoteyAgICAiaGFsdCIsCXsiIiwJCQkweDAwCX0gfSwKLXsgICAgInNpbmYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDA1ICAgIH0gfSwKLXsgICAgImxkZiIsICAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDA2ICAgIH0gfSwKLXsgICAgImxkZCIsICAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDA3ICAgIH0gfSwKLXsgICAgImFkZGIyIiwJeyJyYm1iIiwJCTB4MDgJfSB9LAoteyAgICAibW92YiIsCXsicmJ3YiIsCQkweDA5CX0gfSwKLXsgICAgImFkZHcyIiwJeyJyd213IiwJCTB4MGEJfSB9LAoteyAgICAibW92dyIsCXsicnd3dyIsCQkweDBiCX0gfSwKLXsgICAgImFkZGwyIiwJeyJybG1sIiwJCTB4MGMJfSB9LAoteyAgICAibW92bCIsCXsicmx3bCIsCQkweDBkCX0gfSwKLXsgICAgImJicyIsCXsicmx2bGJ3IiwJCTB4MGUJfSB9LAoteyAgICAibm9wIiwgICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MTAgICAgfSB9LAoteyAgICAiYnJiIiwJeyJiYiIsCQkJMHgxMQl9IH0sCi17ICAgICJicnciLAl7ImJ3IiwJCQkweDEzCX0gfSwKLXsgICAgImNvc2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDE1ICAgIH0gfSwKLXsgICAgImxuZiIsICAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDE2ICAgIH0gfSwKLXsgICAgImxuZCIsICAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDE3ICAgIH0gfSwKLXsgICAgImFkZGIzIiwJeyJyYnJid2IiLAkJMHgxOAl9IH0sCi17ICAgICJjbXBiIiwJeyJyYndiIiwJCTB4MTkJfSB9LCAKLXsgICAgImFkZHczIiwJeyJyd3J3d3ciLAkJMHgxYQl9IH0sCi17ICAgICJjbXB3IiwJeyJyd3d3IiwJCTB4MWIJfSB9LAoteyAgICAiYWRkbDMiLAl7InJscmx3bCIsCQkweDFjCX0gfSwKLXsgICAgImNtcGwiLAl7InJsd2wiLAkJMHgxZAl9IH0sCi17ICAgICJiYmMiLAl7InJsdmxidyIsCQkweDFlCX0gfSwKLXsgICAgInJlaSIsCXsiIiwJCQkweDIwCX0gfSwKLXsgICAgImJuZXEiLAl7ImJiIiwJCQkweDIxCX0gfSwKLXsgICAgImJuZXF1IiwJeyJiYiIsCQkJMHgyMQl9IH0sCi17ICAgICJjdnR3bCIsCXsicnd3bCIsCQkweDIzCX0gfSwKLXsgICAgInN0ZiIsICAgICB7IndsIiwgICAgICAgICAgICAgICAgICAweDI2ICAgIH0gfSwKLXsgICAgInN0ZCIsICAgICB7IndxIiwgICAgICAgICAgICAgICAgICAweDI3ICAgIH0gfSwKLXsgICAgInN1YmIyIiwJeyJyYm1iIiwJCTB4MjgJfSB9LAoteyAgICAibWNvbWIiLAl7InJid2IiLAkJMHgyOQl9IH0sCi17ICAgICJzdWJ3MiIsCXsicndtdyIsCQkweDJhCX0gfSwKLXsgICAgIm1jb213IiwJeyJyd3d3IiwJCTB4MmIJfSB9LAoteyAgICAic3VibDIiLCAgIHsicmxtbCIsICAgICAgICAgICAgICAgIDB4MmMgICAgfSB9LAoteyAgICAibWNvbWwiLCAgIHsicmx3bCIsICAgICAgICAgICAgICAgIDB4MmQgICAgfSB9LAoteyAgICAiZW11bCIsCXsicmxybHJsd3EiLAkJMHgyZQl9IH0sCi17ICAgICJhb2Jsc3MiLAl7InJsbWxidyIsCQkweDJmCX0gfSwKLXsgICAgImJwdCIsCXsiIiwJCQkweDMwCX0gfSwKLXsgICAgImJlcWwiLAl7ImJiIiwJCQkweDMxCX0gfSwKLXsgICAgImJlcWx1IiwJeyJiYiIsCQkJMHgzMQl9IH0sCi17ICAgICJjdnR3YiIsCXsicnd3YiIsCQkweDMzCX0gfSwKLXsgICAgImxvZ2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDM1ICAgIH0gfSwKLXsgICAgImNtcGYiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDM2ICAgIH0gfSwKLXsgICAgImNtcGQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDM3ICAgIH0gfSwKLXsgICAgInN1YmIzIiwJeyJyYnJid2IiLAkJMHgzOAl9IH0sCi17ICAgICJiaXRiIiwJeyJyYnJiIiwJCTB4MzkJfSB9LAoteyAgICAic3VidzMiLAl7InJ3cnd3dyIsCQkweDNhCX0gfSwKLXsgICAgImJpdHciLAl7InJ3cnciLAkJMHgzYgl9IH0sCi17ICAgICJzdWJsMyIsCXsicmxybHdsIiwJCTB4M2MJfSB9LAoteyAgICAiYml0bCIsCXsicmxybCIsCQkweDNkCX0gfSwKLXsgICAgImVkaXYiLAl7InJscnF3bHdsIiwJCTB4M2UJfSB9LAoteyAgICAiYW9ibGVxIiwJeyJybG1sYnciLAkJMHgzZgl9IH0sCi17ICAgICJyZXQiLAl7IiIsCQkJMHg0MAl9IH0sCi17ICAgICJiZ3RyIiwJeyJiYiIsCQkJMHg0MQl9IH0sCi17ICAgICJzcXJ0ZiIsICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg0NSAgICB9IH0sCi17ICAgICJjbXBmMiIsICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg0NiAgICB9IH0sCi17ICAgICJjbXBkMiIsICAgeyJycXJxIiwgICAgICAgICAgICAgICAgMHg0NyAgICB9IH0sCi17ICAgICJzaGxsIiwgICAgeyJyYnJsd2wiLCAgICAgICAgICAgICAgMHg0OCAgICB9IH0sCi17ICAgICJjbHJiIiwJeyJ3YiIsCQkJMHg0OQl9IH0sCi17ICAgICJzaGxxIiwJeyJyYnJxd3EiLAkJMHg0YQl9IH0sCi17ICAgICJjbHJ3IiwJeyJ3dyIsCQkJMHg0Ygl9IH0sCi17ICAgICJtdWxsMiIsCXsicmxtbCIsCQkweDRjCX0gfSwKLXsgICAgImNscmwiLAl7IndsIiwJCQkweDRkCX0gfSwKLXsgICAgInNoYWwiLCAgICB7InJicmx3bCIsCQkweDRlCX0gfSwKLXsgICAgImJsZXEiLAl7ImJiIiwJCQkweDUxCX0gfSwKLXsgICAgImV4cGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU1ICAgIH0gfSwKLXsgICAgInRzdGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU2ICAgIH0gfSwKLXsgICAgInRzdGQiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU3ICAgIH0gfSwKLXsgICAgInNocmwiLCAgICB7InJicmx3bCIsCQkweDU4CX0gfSwKLXsgICAgInRzdGIiLAl7InJiIiwJCQkweDU5CX0gfSwKLXsgICAgInNocnEiLCAgICB7InJicnF3cSIsCQkweDVhCX0gfSwKLXsgICAgInRzdHciLAl7InJ3IiwJCQkweDViCX0gfSwKLXsgICAgIm11bGwzIiwJeyJybHJsd2wiLAkJMHg1Ywl9IH0sCi17ICAgICJ0c3RsIiwJeyJybCIsCQkJMHg1ZAl9IH0sCi17ICAgICJzaGFyIiwJeyJyYnJsd2wiLAkJMHg1ZQl9IH0sCi17ICAgICJiYnNzaSIsCXsicmxtbGJ3IiwJCTB4NWYJfSB9LAoteyAgICAibGRwY3R4IiwJeyIiLAkJCTB4NjAJfSB9LAoteyAgICAicHVzaGQiLCAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NjcgICAgfSB9LAoteyAgICAiaW5jYiIsCXsibWIiLAkJCTB4NjkJfSB9LAoteyAgICAiaW5jdyIsCXsibXciLAkJCTB4NmIJfSB9LAoteyAgICAiZGl2bDIiLAl7InJsbWwiLAkJMHg2Ywl9IH0sCi17ICAgICJpbmNsIiwJeyJtbCIsCQkJMHg2ZAl9IH0sCi17ICAgICJjdnRsYiIsCXsicmx3YiIsCQkweDZmCX0gfSwKLXsgICAgInN2cGN0eCIsCXsiIiwJCQkweDcwCX0gfSwKLXsgICAgImptcCIsCXsiYWIiLAkJCTB4NzEJfSB9LAoteyAgICAiY3ZsZiIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NzYgICAgfSB9LAoteyAgICAiY3ZsZCIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NzcgICAgfSB9LAoteyAgICAiZGVjYiIsCXsibWIiLAkJCTB4NzkJfSB9LAoteyAgICAiZGVjdyIsCXsibXciLAkJCTB4N2IJfSB9LAoteyAgICAiZGl2bDMiLAl7InJscmx3bCIsCQkweDdjCX0gfSwKLXsgICAgImRlY2wiLAl7Im1sIiwJCQkweDdkCX0gfSwKLXsgICAgImN2dGx3IiwJeyJybHd3IiwJCTB4N2YJfSB9LAoteyAgICAiYmdlcSIsCXsiYmIiLAkJCTB4ODEJfSB9LAoteyAgICAibW92czIiLAl7ImFiYWIiLAkJMHg4Mgl9IH0sCi17ICAgICJjdmZsIiwgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHg4NiAgICB9IH0sCi17ICAgICJjdmRsIiwgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHg4NyAgICB9IH0sCi17ICAgICJvcmIyIiwJeyJyYm1iIiwJCTB4ODgJfSB9LAoteyAgICAiY3Z0YmwiLAl7InJid2wiLAkJMHg4OQl9IH0sCi17ICAgICJvcncyIiwJeyJyd213IiwJCTB4OGEJfSB9LAoteyAgICAiYmlzcHN3IiwJeyJydyIsCQkJMHg4Ygl9IH0sCi17ICAgICJvcmwyIiwgICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHg4YyAgICB9IH0sCi17ICAgICJhZHdjIiwJeyJybG1sIiwJCTB4OGQJfSB9LAoteyAgICAiYWRkYSIsIAl7InJsbWwiLAkJMHg4ZQl9IH0sCi17ICAgICJibHNzIiwJeyJiYiIsCQkJMHg5MQl9IH0sCi17ICAgICJjbXBzMiIsICAgeyJhYmFiIiwJCTB4OTIJfSB9LAoteyAgICAibGRmZCIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4OTcgICAgfSB9LAoteyAgICAib3JiMyIsCXsicmJyYndiIiwJCTB4OTgJfSB9LAoteyAgICAiY3Z0YnciLAl7InJid3ciLAkJMHg5OQl9IH0sCi17ICAgICJvcnczIiwgICAJeyJyd3J3d3ciLAkJMHg5YQl9IH0sCi17ICAgICJiaWNwc3ciLAl7InJ3IiwJCQkweDliCX0gfSwKLXsgICAgIm9ybDMiLCAgICB7InJscmx3bCIsICAgICAgICAgICAgICAweDljICAgIH0gfSwKLXsgICAgInNid2MiLAl7InJsbWwiLAkJMHg5ZAl9IH0sCi17ICAgICJzdWJhIiwgICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHg5ZSAgICB9IH0sCi17ICAgICJiZ3RydSIsCXsiYmIiLAkJCTB4YTEJfSB9LAoteyAgICAiY3ZkZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YTYgICAgfSB9LAoteyAgICAiYW5kYjIiLCAgIHsicmJtYiIsCQkweGE4ICAgIH0gfSwKLXsgICAgIm1vdnpibCIsCXsicmJ3bCIsCQkweGE5CX0gfSwKLXsgICAgImFuZHcyIiwgICB7InJ3bXciLAkJMHhhYSAgICB9IH0sCi17ICAgICJsb2FkciIsICAgeyJyd2FsIiwJCTB4YWIJfSB9LAoteyAgICAiYW5kbDIiLCAgIHsicmxtbCIsCQkweGFjICAgIH0gfSwKLXsgICAgIm10cHIiLAl7InJscmwiLAkJMHhhZAl9IH0sCi17ICAgICJmZnMiLAl7InJsd2wiLAkJMHhhZQl9IH0sCi17ICAgICJibGVxdSIsCXsiYmIiLAkJCTB4YjEJfSB9LAoteyAgICAibmVnZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YjYgICAgfSB9LAoteyAgICAibmVnZCIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YjcgICAgfSB9LAoteyAgICAiYW5kYjMiLCAgIHsicmJyYndiIiwgICAgICAgICAgICAgIDB4YjggICAgfSB9LAoteyAgICAibW92emJ3IiwJeyJyYnd3IiwJCTB4YjkJfSB9LAoteyAgICAiYW5kdzMiLCAgIHsicndyd3d3IiwJCTB4YmEgICAgfSB9LAoteyAgICAic3RvcmVyIiwgIHsicndhbCIsICAgICAgICAgICAgICAgIDB4YmIgICAgfSB9LAoteyAgICAiYW5kbDMiLCAgIHsicmxybHdsIiwJCTB4YmMgICAgfSB9LAoteyAgICAibWZwciIsCXsicmx3bCIsCQkweGJkCX0gfSwKLXsgICAgImZmYyIsCXsicmx3bCIsCQkweGJlCX0gfSwKLXsgICAgImNhbGxzIiwJeyJyYmFiIiwJCTB4YmYJfSB9LAoteyAgICAicHJvYmVyIiwJeyJyYmFicmwiLAkJMHhjMAl9IH0sCi17ICAgICJidmMiLAl7ImJiIiwJCQkweGMxCX0gfSwKLXsgICAgIm1vdnMzIiwJeyJhYmFicnciLAkJMHhjMgl9IH0sCi17ICAgICJtb3Z6d2wiLAl7InJ3d2wiLAkJMHhjMwl9IH0sCi17ICAgICJhZGRmIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHhjNiAgICB9IH0sCi17ICAgICJhZGRkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhjNyAgICB9IH0sCi17ICAgICJ4b3JiMiIsICAgeyJyYm1iIiwgICAgICAgICAgICAgICAgMHhjOCAgICB9IH0sCi17ICAgICJtb3ZvYiIsICAgeyJyYndiIiwgICAgICAgICAgICAgICAgMHhjOSAgICB9IH0sCi17ICAgICJ4b3J3MiIsICAgeyJyd213IiwgICAgICAgICAgICAgICAgMHhjYSAgICB9IH0sCi17ICAgICJtb3ZvdyIsICAgeyJyd3d3IiwgICAgICAgICAgICAgICAgMHhjYgl9IH0sCi17ICAgICJ4b3JsMiIsCXsicmxtbCIsICAgICAgICAgICAgICAgIDB4Y2MgICAgfSB9LAoteyAgICAibW92cHNsIiwgIHsid2wiLCAgICAgICAgICAgICAgICAgIDB4Y2QgICAgfSB9LAoteyAgICAia2NhbGwiLCAgIHsicnciLAkJCTB4Y2YJfSB9LAoteyAgICAicHJvYmV3IiwgIHsicmJhYnJsIiwJCTB4ZDAJfSB9LAoteyAgICAiYnZzIiwgICAgIHsiYmIiLAkJCTB4ZDEJfSB9LAoteyAgICAiY21wczMiLCAgIHsiYWJhYnJ3IiwJCTB4ZDIJfSB9LAoteyAgICAic3ViZiIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZDYgICAgfSB9LAoteyAgICAic3ViZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZDcgICAgfSB9LAoteyAgICAieG9yYjMiLAl7InJicmJ3YiIsCQkweGQ4CX0gfSwKLXsgICAgInB1c2hiIiwgICB7InJiIiwJCQkweGQ5CX0gfSwKLXsgICAgInhvcnczIiwJeyJyd3J3d3ciLAkJMHhkYQl9IH0sCi17ICAgICJwdXNodyIsICAgeyJydyIsIAkJCTB4ZGIJfSB9LAoteyAgICAieG9ybDMiLAl7InJscmx3bCIsCQkweGRjCX0gfSwKLXsgICAgInB1c2hsIiwJeyJybCIsCQkJMHhkZAl9IH0sCi17ICAgICJpbnNxdWUiLAl7ImFiYWIiLAkJMHhlMAl9IH0sCi17ICAgICJiY3MiLAl7ImJiIiwJCQkweGUxCX0gfSwKLXsgICAgImJnZXF1IiwJeyJiYiIsCQkJMHhlMQl9IH0sCi17ICAgICJtdWxmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhlNiAgICB9IH0sCi17ICAgICJtdWxkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhlNyAgICB9IH0sCi17ICAgICJtbmVnYiIsCXsicmJ3YiIsCQkweGU4CX0gfSwKLXsgICAgIm1vdmFiIiwJeyJhYndsIiwJCTB4ZTkJfSB9LAoteyAgICAibW5lZ3ciLAl7InJ3d3ciLAkJMHhlYQl9IH0sCi17ICAgICJtb3ZhdyIsCXsiYXd3bCIsCQkweGViCX0gfSwKLXsgICAgIm1uZWdsIiwJeyJybHdsIiwJCTB4ZWMJfSB9LAoteyAgICAibW92YWwiLAl7ImFsd2wiLAkJMHhlZAl9IH0sCi17ICAgICJyZW1xdWUiLAl7ImFiIiwgIAkJMHhmMAl9IH0sCi17ICAgICJiY2MiLAl7ImJiIiwJCQkweGYxCX0gfSwKLXsgICAgImJsc3N1IiwJeyJiYiIsCQkJMHhmMQl9IH0sCi17ICAgICJkaXZmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhmNiAgICB9IH0sCi17ICAgICJkaXZkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhmNyAgICB9IH0sCi17ICAgICJtb3ZibGsiLCAgeyJhbGFscnciLCAgICAgICAgICAgICAgMHhmOAl9IH0sCi17ICAgICJwdXNoYWIiLAl7ImFiIiwJCQkweGY5CX0gfSwKLXsgICAgInB1c2hhdyIsCXsiYXciLAkJCTB4ZmIJfSB9LAoteyAgICAiY2FzZWwiLAl7InJscmxybCIsCQkweGZjCX0gfSwKLXsgICAgInB1c2hhbCIsCXsiYWwiLAkJCTB4ZmQJfSB9LAoteyAgICAiY2FsbGYiLAl7InJiYWIiLAkJMHhmZQl9IH0sCi17ICAgICAgIiIgICAgICAgLCAgICIiICAgICAgICAgIH0gLyogZW1wdHkgaXMgZW5kIHNlbnRpbmVsICovCi0KLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWMzMC5oIGIvaW5jbHVkZS9vcGNvZGUvdGljMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwMDI3NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS90aWMzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qIHRpYzMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJIFRNUzMyMEMzMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZJWE1FOiBUaGUgb3Bjb2RlIHRhYmxlIHNob3VsZCBiZSBpbiBvcGNvZGVzL3RpYzMwLW9wYy5jLCBub3QgaW4gYQotICAgaGVhZGVyIGZpbGUuICAqLwotCi0jaWZuZGVmIF9UTVMzMjBfSF8KLSNkZWZpbmUgX1RNUzMyMF9IXwotCi1zdHJ1Y3QgX3JlZ2lzdGVyCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOwotICB1bnNpZ25lZCBjaGFyIHJlZ3R5cGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfcmVnaXN0ZXIgcmVnOwotCi0jZGVmaW5lIFJFR19SbiAgICAweDAxCi0jZGVmaW5lIFJFR19BUm4gICAweDAyCi0jZGVmaW5lIFJFR19EUCAgICAweDAzCi0jZGVmaW5lIFJFR19PVEhFUiAweDA0Ci0KLXN0YXRpYyBjb25zdCByZWcgdGljMzBfcmVndGFiW10gPSB7Ci0gIHsgInIwIiwgMHgwMCwgUkVHX1JuIH0sCi0gIHsgInIxIiwgMHgwMSwgUkVHX1JuIH0sCi0gIHsgInIyIiwgMHgwMiwgUkVHX1JuIH0sCi0gIHsgInIzIiwgMHgwMywgUkVHX1JuIH0sCi0gIHsgInI0IiwgMHgwNCwgUkVHX1JuIH0sCi0gIHsgInI1IiwgMHgwNSwgUkVHX1JuIH0sCi0gIHsgInI2IiwgMHgwNiwgUkVHX1JuIH0sCi0gIHsgInI3IiwgMHgwNywgUkVHX1JuIH0sCi0gIHsgImFyMCIsMHgwOCwgUkVHX0FSbiB9LAotICB7ICJhcjEiLDB4MDksIFJFR19BUm4gfSwKLSAgeyAiYXIyIiwweDBBLCBSRUdfQVJuIH0sCi0gIHsgImFyMyIsMHgwQiwgUkVHX0FSbiB9LAotICB7ICJhcjQiLDB4MEMsIFJFR19BUm4gfSwKLSAgeyAiYXI1IiwweDBELCBSRUdfQVJuIH0sCi0gIHsgImFyNiIsMHgwRSwgUkVHX0FSbiB9LAotICB7ICJhcjciLDB4MEYsIFJFR19BUm4gfSwKLSAgeyAiZHAiLCAweDEwLCBSRUdfRFAgfSwKLSAgeyAiaXIwIiwweDExLCBSRUdfT1RIRVIgfSwKLSAgeyAiaXIxIiwweDEyLCBSRUdfT1RIRVIgfSwKLSAgeyAiYmsiLCAweDEzLCBSRUdfT1RIRVIgfSwKLSAgeyAic3AiLCAweDE0LCBSRUdfT1RIRVIgfSwKLSAgeyAic3QiLCAweDE1LCBSRUdfT1RIRVIgfSwKLSAgeyAiaWUiLCAweDE2LCBSRUdfT1RIRVIgfSwKLSAgeyAiaWYiLCAweDE3LCBSRUdfT1RIRVIgfSwKLSAgeyAiaW9mIiwweDE4LCBSRUdfT1RIRVIgfSwKLSAgeyAicnMiLCAweDE5LCBSRUdfT1RIRVIgfSwKLSAgeyAicmUiLCAweDFBLCBSRUdfT1RIRVIgfSwKLSAgeyAicmMiLCAweDFCLCBSRUdfT1RIRVIgfSwKLSAgeyAiUjAiLCAweDAwLCBSRUdfUm4gfSwKLSAgeyAiUjEiLCAweDAxLCBSRUdfUm4gfSwKLSAgeyAiUjIiLCAweDAyLCBSRUdfUm4gfSwKLSAgeyAiUjMiLCAweDAzLCBSRUdfUm4gfSwKLSAgeyAiUjQiLCAweDA0LCBSRUdfUm4gfSwKLSAgeyAiUjUiLCAweDA1LCBSRUdfUm4gfSwKLSAgeyAiUjYiLCAweDA2LCBSRUdfUm4gfSwKLSAgeyAiUjciLCAweDA3LCBSRUdfUm4gfSwKLSAgeyAiQVIwIiwweDA4LCBSRUdfQVJuIH0sCi0gIHsgIkFSMSIsMHgwOSwgUkVHX0FSbiB9LAotICB7ICJBUjIiLDB4MEEsIFJFR19BUm4gfSwKLSAgeyAiQVIzIiwweDBCLCBSRUdfQVJuIH0sCi0gIHsgIkFSNCIsMHgwQywgUkVHX0FSbiB9LAotICB7ICJBUjUiLDB4MEQsIFJFR19BUm4gfSwKLSAgeyAiQVI2IiwweDBFLCBSRUdfQVJuIH0sCi0gIHsgIkFSNyIsMHgwRiwgUkVHX0FSbiB9LAotICB7ICJEUCIsIDB4MTAsIFJFR19EUCB9LAotICB7ICJJUjAiLDB4MTEsIFJFR19PVEhFUiB9LAotICB7ICJJUjEiLDB4MTIsIFJFR19PVEhFUiB9LAotICB7ICJCSyIsIDB4MTMsIFJFR19PVEhFUiB9LAotICB7ICJTUCIsIDB4MTQsIFJFR19PVEhFUiB9LAotICB7ICJTVCIsIDB4MTUsIFJFR19PVEhFUiB9LAotICB7ICJJRSIsIDB4MTYsIFJFR19PVEhFUiB9LAotICB7ICJJRiIsIDB4MTcsIFJFR19PVEhFUiB9LAotICB7ICJJT0YiLDB4MTgsIFJFR19PVEhFUiB9LAotICB7ICJSUyIsIDB4MTksIFJFR19PVEhFUiB9LAotICB7ICJSRSIsIDB4MUEsIFJFR19PVEhFUiB9LAotICB7ICJSQyIsIDB4MUIsIFJFR19PVEhFUiB9LAotICB7ICIiLCAgIDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHJlZyAqY29uc3QgdGljMzBfcmVndGFiX2VuZAotICA9IHRpYzMwX3JlZ3RhYiArIHNpemVvZih0aWMzMF9yZWd0YWIpL3NpemVvZih0aWMzMF9yZWd0YWJbMF0pOwotCi0vKiBJbmRpcmVjdCBBZGRyZXNzaW5nIE1vZGVzIE1vZGlmaWNhdGlvbiBGaWVsZHMgKi8KLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBEaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgUHJlRGlzcF9BZGQgICAgICAgIDB4MDAKLSNkZWZpbmUgUHJlRGlzcF9TdWIgICAgICAgIDB4MDEKLSNkZWZpbmUgUHJlRGlzcF9BZGRfTW9kICAgIDB4MDIKLSNkZWZpbmUgUHJlRGlzcF9TdWJfTW9kICAgIDB4MDMKLSNkZWZpbmUgUG9zdERpc3BfQWRkX01vZCAgIDB4MDQKLSNkZWZpbmUgUG9zdERpc3BfU3ViX01vZCAgIDB4MDUKLSNkZWZpbmUgUG9zdERpc3BfQWRkX0NpcmMgIDB4MDYKLSNkZWZpbmUgUG9zdERpc3BfU3ViX0NpcmMgIDB4MDcKLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjAgKi8KLSNkZWZpbmUgUHJlSVIwX0FkZCAgICAgICAgIDB4MDgKLSNkZWZpbmUgUHJlSVIwX1N1YiAgICAgICAgIDB4MDkKLSNkZWZpbmUgUHJlSVIwX0FkZF9Nb2QgICAgIDB4MEEKLSNkZWZpbmUgUHJlSVIwX1N1Yl9Nb2QgICAgIDB4MEIKLSNkZWZpbmUgUG9zdElSMF9BZGRfTW9kICAgIDB4MEMKLSNkZWZpbmUgUG9zdElSMF9TdWJfTW9kICAgIDB4MEQKLSNkZWZpbmUgUG9zdElSMF9BZGRfQ2lyYyAgIDB4MEUKLSNkZWZpbmUgUG9zdElSMF9TdWJfQ2lyYyAgIDB4MEYKLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjEgKi8KLSNkZWZpbmUgUHJlSVIxX0FkZCAgICAgICAgIDB4MTAKLSNkZWZpbmUgUHJlSVIxX1N1YiAgICAgICAgIDB4MTEKLSNkZWZpbmUgUHJlSVIxX0FkZF9Nb2QgICAgIDB4MTIKLSNkZWZpbmUgUHJlSVIxX1N1Yl9Nb2QgICAgIDB4MTMKLSNkZWZpbmUgUG9zdElSMV9BZGRfTW9kICAgIDB4MTQKLSNkZWZpbmUgUG9zdElSMV9TdWJfTW9kICAgIDB4MTUKLSNkZWZpbmUgUG9zdElSMV9BZGRfQ2lyYyAgIDB4MTYKLSNkZWZpbmUgUG9zdElSMV9TdWJfQ2lyYyAgIDB4MTcKLS8qIEluZGlyZWN0IEFkZHJlc3NpbmcgKFNwZWNpYWwgQ2FzZXMpICovCi0jZGVmaW5lIEluZGlyZWN0T25seSAgICAgICAweDE4Ci0jZGVmaW5lIFBvc3RJUjBfQWRkX0JpdFJldiAweDE5Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqc3ludGF4OwotICB1bnNpZ25lZCBjaGFyIG1vZGZpZWxkOwotICB1bnNpZ25lZCBjaGFyIGRpc3BsYWNlbWVudDsKLX0gaW5kX2FkZHJfdHlwZTsKLQotI2RlZmluZSBJTVBMSUVEX0RJU1AgIDB4MDEKLSNkZWZpbmUgRElTUF9SRVFVSVJFRCAweDAyCi0jZGVmaW5lIE5PX0RJU1AgICAgICAgMHgwMwotCi1zdGF0aWMgY29uc3QgaW5kX2FkZHJfdHlwZSB0aWMzMF9pbmRhZGRyX3RhYltdID0gewotICB7ICIqK2FyIiwgICAgICAgUHJlRGlzcF9BZGQsICAgICAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKi1hciIsICAgICAgIFByZURpc3BfU3ViLCAgICAgICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiorK2FyIiwgICAgICBQcmVEaXNwX0FkZF9Nb2QsICAgIElNUExJRURfRElTUCB9LAotICB7ICIqLS1hciIsICAgICAgUHJlRGlzcF9TdWJfTW9kLCAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyKysiLCAgICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiphci0tIiwgICAgICBQb3N0RGlzcF9TdWJfTW9kLCAgIElNUExJRURfRElTUCB9LAotICB7ICIqYXIrKyUiLCAgICAgUG9zdERpc3BfQWRkX0NpcmMsICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyLS0lIiwgICAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiorYXIoKSIsICAgICBQcmVEaXNwX0FkZCwgICAgICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKi1hcigpIiwgICAgIFByZURpc3BfU3ViLCAgICAgICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqKythcigpIiwgICAgUHJlRGlzcF9BZGRfTW9kLCAgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiotLWFyKCkiLCAgICBQcmVEaXNwX1N1Yl9Nb2QsICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyKysoKSIsICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqYXItLSgpIiwgICAgUG9zdERpc3BfU3ViX01vZCwgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiphcisrKCklIiwgICBQb3N0RGlzcF9BZGRfQ2lyYywgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyLS0oKSUiLCAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqK2FyKGlyMCkiLCAgUHJlSVIwX0FkZCwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiotYXIoaXIwKSIsICBQcmVJUjBfU3ViLCAgICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKisrYXIoaXIwKSIsIFByZUlSMF9BZGRfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqLS1hcihpcjApIiwgUHJlSVIwX1N1Yl9Nb2QsICAgICBOT19ESVNQIH0sCi0gIHsgIiphcisrKGlyMCkiLCBQb3N0SVIwX0FkZF9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyLS0oaXIwKSIsIFBvc3RJUjBfU3ViX01vZCwgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjApJSIsUG9zdElSMF9BZGRfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMCklIixQb3N0SVIwX1N1Yl9DaXJjLCAgIE5PX0RJU1AgfSwKLSAgeyAiKithcihpcjEpIiwgIFByZUlSMV9BZGQsICAgICAgICAgTk9fRElTUCB9LAotICB7ICIqLWFyKGlyMSkiLCAgUHJlSVIxX1N1YiwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiorK2FyKGlyMSkiLCBQcmVJUjFfQWRkX01vZCwgICAgIE5PX0RJU1AgfSwKLSAgeyAiKi0tYXIoaXIxKSIsIFByZUlSMV9TdWJfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjEpIiwgUG9zdElSMV9BZGRfTW9kLCAgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMSkiLCBQb3N0SVIxX1N1Yl9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIxKSUiLFBvc3RJUjFfQWRkX0NpcmMsICAgTk9fRElTUCB9LAotICB7ICIqYXItLShpcjEpJSIsUG9zdElSMV9TdWJfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphciIsICAgICAgICBJbmRpcmVjdE9ubHksICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIwKWIiLFBvc3RJUjBfQWRkX0JpdFJldiwgTk9fRElTUCB9LAotICB7ICIiLCAgICAgICAgICAgMCwwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbmRfYWRkcl90eXBlICpjb25zdCB0aWMzMF9pbmRhZGRydGFiX2VuZAotICA9IHRpYzMwX2luZGFkZHJfdGFiICsgc2l6ZW9mKHRpYzMwX2luZGFkZHJfdGFiKS9zaXplb2YodGljMzBfaW5kYWRkcl90YWJbMF0pOwotCi0vKiBQb3NzaWJsZSBvcGVyYW5kIHR5cGVzICovCi0vKiBSZWdpc3RlciB0eXBlcyAqLwotI2RlZmluZSBSbiAgICAgICAweDAwMDEKLSNkZWZpbmUgQVJuICAgICAgMHgwMDAyCi0jZGVmaW5lIERQUmVnICAgIDB4MDAwNAotI2RlZmluZSBPdGhlclJlZyAweDAwMDgKLS8qIEFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLwotI2RlZmluZSBEaXJlY3QgICAweDAwMTAKLSNkZWZpbmUgSW5kaXJlY3QgMHgwMDIwCi0jZGVmaW5lIEltbTE2ICAgIDB4MDA0MAotI2RlZmluZSBEaXNwICAgICAweDAwODAKLSNkZWZpbmUgSW1tMjQgICAgMHgwMTAwCi0jZGVmaW5lIEFiczI0ICAgIDB4MDIwMAotLyogMyBvcGVyYW5kIGFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLwotI2RlZmluZSBvcDNUMSAgICAweDA0MDAKLSNkZWZpbmUgb3AzVDIgICAgMHgwODAwCi0vKiBJbnRlcnJ1cHQgdmVjdG9yICovCi0jZGVmaW5lIElWZWN0b3IgIDB4MTAwMAotLyogTm90IHJlcXVpcmVkICovCi0jZGVmaW5lIE5vdFJlcSAgIDB4MjAwMAotCi0jZGVmaW5lIEdBZGRyMSAgIFJuIHwgRGlyZWN0IHwgSW5kaXJlY3QgfCBJbW0xNgotI2RlZmluZSBHQWRkcjIgICBHQWRkcjEgfCBBbGxSZWcKLSNkZWZpbmUgVEFkZHIxICAgb3AzVDEgfCBSbiB8IEluZGlyZWN0Ci0jZGVmaW5lIFRBZGRyMiAgIG9wM1QyIHwgUm4gfCBJbmRpcmVjdAotI2RlZmluZSBSZWcgICAgICBSbiB8IEFSbgotI2RlZmluZSBBbGxSZWcgICBSZWcgfCBEUFJlZyB8IE90aGVyUmVnCi0KLXR5cGVkZWYgc3RydWN0IF90ZW1wbGF0ZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7IC8qIGhvdyBtYW55IG9wZXJhbmRzICovCi0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlICovCi0gIC8qIHRoZSBiaXRzIGluIG9wY29kZV9tb2RpZmllciBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgb3Bjb2RlIGZyb20KLSAgICAgdGhlIGJhc2Vfb3Bjb2RlLiAgVGhlc2UgYml0cyBhbHNvIGFyZSB1c2VkIHRvIGRldGVjdCBhbHRlcm5hdGUgZm9ybXMgb2YKLSAgICAgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKi8KLSAgdW5zaWduZWQgaW50IG9wY29kZV9tb2RpZmllcjsKLQotICAvKiBvcGNvZGVfbW9kaWZpZXIgYml0czogKi8KLSNkZWZpbmUgQWRkcmVzc01vZGUgMHgwMDYwMDAwMAotI2RlZmluZSBQQ1JlbCAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIFN0YWNrT3AgICAgIDB4MDAxRjAwMDAKLSNkZWZpbmUgUm90YXRlICAgICAgU3RhY2tPcAotICAKLSAgLyogb3BlcmFuZF90eXBlc1tpXSBkZXNjcmliZXMgdGhlIHR5cGUgb2Ygb3BlcmFuZCBpLiAgVGhpcyBpcyBtYWRlCi0gICAgIGJ5IE9SJ2luZyB0b2dldGhlciBhbGwgb2YgdGhlIHBvc3NpYmxlIHR5cGUgbWFza3MuICAoZS5nLgotICAgICAnb3BlcmFuZF90eXBlc1tpXSA9IFJlZ3xJbW0nIHNwZWNpZmllcyB0aGF0IG9wZXJhbmQgaSBjYW4gYmUKLSAgICAgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gaW1tZWRpYXRlIG9wZXJhbmQgKi8KLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbM107Ci0gIC8qIFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIHR5cGUgb2YgYW4gaW1tZWRpYXRlIGFyZ3VtZW50IHRvIGFuIGluc3RydWN0aW9uLiAqLwotICBpbnQgaW1tX2FyZ190eXBlOwotI2RlZmluZSBJbW1fTm9uZSAgMAotI2RlZmluZSBJbW1fRmxvYXQgMQotI2RlZmluZSBJbW1fU0ludCAgMgotI2RlZmluZSBJbW1fVUludCAgMwotfQotdGVtcGxhdGU7Ci0KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZSB0aWMzMF9vcHRhYltdID0gewotICB7ICJhYnNmIiAgICwyLDB4MDAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAiYWJzaSIgICAsMiwweDAwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFkZGMiICAgLDIsMHgwMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhZGRjMyIgICwzLDB4MjAwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFkZGYiICAgLDIsMHgwMTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJhZGRmMyIgICwzLDB4MjA4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCi0gIHsgImFkZGkiICAgLDIsMHgwMjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhZGRpMyIgICwzLDB4MjEwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFuZCIgICAgLDIsMHgwMjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJhbmQzIiAgICwzLDB4MjE4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFuZG4iICAgLDIsMHgwMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJhbmRuMyIgICwzLDB4MjIwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFzaCIgICAgLDIsMHgwMzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhc2gzIiAgICwzLDB4MjI4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImIiICAgICAgLDEsMHg2ODAwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidSIgICAgICwxLDB4NjgwMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxvIiAgICAsMSwweDY4MDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJscyIgICAgLDEsMHg2ODAyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiaGkiICAgICwxLDB4NjgwMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhzIiAgICAsMSwweDY4MDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJlcSIgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmUiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx0IiAgICAsMSwweDY4MDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsZSIgICAgLDEsMHg2ODA4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZ3QiICAgICwxLDB4NjgwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmdlIiAgICAsMSwweDY4MEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6IiAgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnoiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnAiICAgICAsMSwweDY4MDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuIiAgICAgLDEsMHg2ODA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibm4iICAgICwxLDB4NjgwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm52IiAgICAsMSwweDY4MEMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ2IiAgICAgLDEsMHg2ODBEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnVmIiAgICwxLDB4NjgwRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVmIiAgICAsMSwweDY4MEYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuYyIgICAgLDEsMHg2ODA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiYyIgICAgICwxLDB4NjgwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdiIgICAsMSwweDY4MTAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdiIgICAgLDEsMHg2ODExMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmx1ZiIgICwxLDB4NjgxMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx1ZiIgICAsMSwweDY4MTMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6dWYiICAgLDEsMHg2ODE0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZCIgICAgICwxLDB4NjgyMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVkIiAgICAsMSwweDY4MjAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsb2QiICAgLDEsMHg2ODIxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHNkIiAgICwxLDB4NjgyMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhpZCIgICAsMSwweDY4MjMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJoc2QiICAgLDEsMHg2ODI0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZXFkIiAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5lZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdGQiICAgLDEsMHg2ODI3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibGVkIiAgICwxLDB4NjgyODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmd0ZCIgICAsMSwweDY4MjkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJnZWQiICAgLDEsMHg2ODJBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiemQiICAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm56ZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJwZCIgICAgLDEsMHg2ODI5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmQiICAgICwxLDB4NjgyNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5uZCIgICAsMSwweDY4MkEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJudmQiICAgLDEsMHg2ODJDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidmQiICAgICwxLDB4NjgyRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm51ZmQiICAsMSwweDY4MkUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ1ZmQiICAgLDEsMHg2ODJGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmNkIiAgICwxLDB4NjgyNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmNkIiAgICAsMSwweDY4MjEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJubHZkIiAgLDEsMHg2ODMwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHZkIiAgICwxLDB4NjgzMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdWZkIiAsMSwweDY4MzIwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdWZkIiAgLDEsMHg2ODMzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJienVmZCIgICwxLDB4NjgzNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnIiICAgICAsMSwweDYwMDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImJyZCIgICAgLDEsMHg2MTAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsIiAgICwxLDB4NjIwMDAwMDAsMCwgICAgICAgICAgIHsgSW1tMjQsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbHUiICAsMSwweDcwMDAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsbyIgLDEsMHg3MDAxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbHMiICwxLDB4NzAwMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGhpIiAsMSwweDcwMDMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxocyIgLDEsMHg3MDA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsZXEiICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5lIiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdCIgLDEsMHg3MDA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbGUiICwxLDB4NzAwODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGd0IiAsMSwweDcwMDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxnZSIgLDEsMHg3MDBBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxseiIgICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG56IiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxwIiAgLDEsMHg3MDA5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbiIgICwxLDB4NzAwNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5uIiAsMSwweDcwMEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxudiIgLDEsMHg3MDBDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsdiIgICwxLDB4NzAwRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG51ZiIsMSwweDcwMEUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx1ZiIgLDEsMHg3MDBGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbmMiICwxLDB4NzAwNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGMiICAsMSwweDcwMDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxubHYiLDEsMHg3MDEwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbHYiICwxLDB4NzAxMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5sdWYiLDEsMHg3MDEyMDAwMCxQQ1JlbCwgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdWYiLDEsMHg3MDEzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsenVmIiwxLDB4NzAxNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY21wZiIgICAsMiwweDA0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImNtcGYzIiAgLDIsMHgyMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJjbXBpIiAgICwyLDB4MDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAiY21waTMiICAsMiwweDIzODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGIiICAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1IiAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsbyIgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJscyIgICAsMiwweDZDMDIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoaSIgICAsMiwweDZDMDMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJocyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJlcSIgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZSIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdCIgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsZSIgICAsMiwweDZDMDgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJndCIgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJnZSIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6IiAgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJueiIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJwIiAgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuIiAgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubiIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudiIgICAsMiwweDZDMEMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ2IiAgICAsMiwweDZDMEQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudWYiICAsMiwweDZDMEUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZiIgICAsMiwweDZDMEYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuYyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJjIiAgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHYiICAsMiwweDZDMTAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdiIgICAsMiwweDZDMTEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHVmIiAsMiwweDZDMTIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdWYiICAsMiwweDZDMTMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6dWYiICAsMiwweDZDMTQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJkIiAgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZCIgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsb2QiICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsc2QiICAsMiwweDZDMjIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoaWQiICAsMiwweDZDMjMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoc2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJlcWQiICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZWQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdGQiICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsZWQiICAsMiwweDZDMjgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJndGQiICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJnZWQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6ZCIgICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuemQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJwZCIgICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZCIgICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubmQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudmQiICAsMiwweDZDMkMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ2ZCIgICAsMiwweDZDMkQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudWZkIiAsMiwweDZDMkUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZmQiICAsMiwweDZDMkYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuY2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJjZCIgICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHZkIiAsMiwweDZDMzAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdmQiICAsMiwweDZDMzEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHVmZCIsMiwweDZDMzIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdWZkIiAsMiwweDZDMzMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6dWZkIiAsMiwweDZDMzQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZml4IiAgICAsMiwweDA1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgQWxsUmVnLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJmbG9hdCIgICwyLDB4MDU4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBSbiwgMCB9LCBJbW1fU0ludCB9LAotICB7ICJpYWNrIiAgICwxLDB4MUIwMDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImlkbGUiICAgLDAsMHgwNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImlkbGUyIiAgLDAsMHgwNjAwMDAwMSwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sIC8qIExDMzEgT25seSAqLwotICB7ICJsZGUiICAgICwyLDB4MDY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmIiAgICAsMiwweDA3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZnUiICAgLDIsMHg0MDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsbyIgICwyLDB4NDA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbHMiICAsMiwweDQxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmhpIiAgLDIsMHg0MTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZocyIgICwyLDB4NDIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmZXEiICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5lIiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdCIgICwyLDB4NDM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbGUiICAsMiwweDQ0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmd0IiAgLDIsMHg0NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZnZSIgICwyLDB4NDUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmeiIgICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm56IiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZwIiAgICwyLDB4NDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbiIgICAsMiwweDQzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5uIiAgLDIsMHg0NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZudiIgICwyLDB4NDYwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmdiIgICAsMiwweDQ2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm51ZiIgLDIsMHg0NzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ1ZiIgICwyLDB4NDc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbmMiICAsMiwweDQyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmMiICAgLDIsMHg0MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZubHYiICwyLDB4NDgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbHYiICAsMiwweDQ4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5sdWYiLDIsMHg0OTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdWYiICwyLDB4NDk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmenVmIiAsMiwweDRBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmkiICAgLDIsMHgwNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIFJuLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImxkaSIgICAgLDIsMHgwODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGl1IiAgICwyLDB4NTAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbG8iICAsMiwweDUwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWxzIiAgLDIsMHg1MTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGloaSIgICwyLDB4NTE4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpaHMiICAsMiwweDUyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWVxIiAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGluZSIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHQiICAsMiwweDUzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWxlIiAgLDIsMHg1NDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlndCIgICwyLDB4NTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpZ2UiICAsMiwweDU1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXoiICAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlueiIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpcCIgICAsMiwweDU0ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW4iICAgLDIsMHg1MzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubiIgICwyLDB4NTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbnYiICAsMiwweDU2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXYiICAgLDIsMHg1NjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGludWYiICwyLDB4NTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpdWYiICAsMiwweDU3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5jIiAgLDIsMHg1MjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGljIiAgICwyLDB4NTA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbmx2IiAsMiwweDU4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWx2IiAgLDIsMHg1ODgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubHVmIiwyLDB4NTkwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHVmIiAsMiwweDU5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXp1ZiIgLDIsMHg1QTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlpIiAgICwyLDB4MDg4MDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCBBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAibGRtIiAgICAsMiwweDA5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkcCIgICAgLDIsMHgwODcwMDAwMCwwLCAgICAgICAgICAgeyBBYnMyNHxEaXJlY3QsIERQUmVnfE5vdFJlcSwgMCB9LCBJbW1fVUludCB9LAotICB7ICJsb3Bvd2VyIiwwLDB4MTA4MDAwMDEsMCwgICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LCAvKiBMQzMxIE9ubHkgKi8KLSAgeyAibHNoIiAgICAsMiwweDA5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImxzaDMiICAgLDMsMHgyNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAibWF4c3BlZWQiLDAsMHgxMDgwMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwgLyogTEMzMSBPbmx5ICovCi0gIHsgIm1weWYiICAgLDIsMHgwQTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJtcHlmMyIgICwzLDB4MjQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCi0gIHsgIm1weWkiICAgLDIsMHgwQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJtcHlpMyIgICwzLDB4MjUwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgIm5lZ2IiICAgLDIsMHgwQjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJuZWdmIiAgICwyLDB4MEI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibmVnaSIgICAsMiwweDBDMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgIm5vcCIgICAgLDEsMHgwQzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWd8SW5kaXJlY3R8Tm90UmVxLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgIm5vcm0iICAgLDIsMHgwRDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LCAvKkNoZWNrIGFub3RoZXIgc291cmNlKi8KLSAgeyAibm90IiAgICAsMiwweDBEODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgIm9yIiAgICAgLDIsMHgxMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJvcjMiICAgICwzLDB4MjU4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgInBvcCIgICAgLDEsMHgwRTIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicG9wZiIgICAsMSwweDBFQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInB1c2giICAgLDEsMHgwRjIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicHVzaGYiICAsMSwweDBGQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGkiICAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl1IiAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsbyIgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlscyIgLDAsMHg3ODAyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGloaSIgLDAsMHg3ODAzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlocyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGllcSIgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluZSIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdCIgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsZSIgLDAsMHg3ODA4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlndCIgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlnZSIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl6IiAgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlueiIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlwIiAgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluIiAgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubiIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGludiIgLDAsMHg3ODBDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl2IiAgLDAsMHg3ODBEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGludWYiLDAsMHg3ODBFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl1ZiIgLDAsMHg3ODBGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluYyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGljIiAgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubHYiLDAsMHg3ODEwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdiIgLDAsMHg3ODExMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubHVmIiwwLDB4NzgxMjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdWYiLDAsMHg3ODEzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl6dWYiLDAsMHg3ODE0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHMiICAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN1IiAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsbyIgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNscyIgLDAsMHg3ODgyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNoaSIgLDAsMHg3ODgzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNocyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNlcSIgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuZSIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdCIgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsZSIgLDAsMHg3ODg4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNndCIgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNnZSIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN6IiAgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNueiIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNwIiAgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuIiAgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubiIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNudiIgLDAsMHg3ODhDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN2IiAgLDAsMHg3ODhEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNudWYiLDAsMHg3ODhFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN1ZiIgLDAsMHg3ODhGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuYyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNjIiAgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubHYiLDAsMHg3ODkwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdiIgLDAsMHg3ODkxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubHVmIiwwLDB4Nzg5MjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdWYiLDAsMHg3ODkzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN6dWYiLDAsMHg3ODk0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJuZCIgICAgLDIsMHgxMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJyb2wiICAgICwxLDB4MTFFMDAwMDEsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJvbGMiICAgLDEsMHgxMjYwMDAwMSxSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicm9yIiAgICAsMSwweDEyRTBGRkZGLFJvdGF0ZSwgICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJyb3JjIiAgICwxLDB4MTM2MEZGRkYsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJwdGIiICAgLDEsMHg2NDAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJycHRzIiAgICwxLDB4MTM5QjAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInNpZ2kiICAgLDAsMHgxNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInN0ZiIgICAgLDIsMHgxNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBSbiwgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdGZpIiAgICwyLDB4MTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgUm4sIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAic3RpIiAgICAsMiwweDE1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZywgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN0aWkiICAgLDIsMHgxNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWcsIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fU0ludCB9LAotICB7ICJzdWJiIiAgICwyLDB4MTY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3ViYjMiICAsMywweDI2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAotICB7ICJzdWJjIiAgICwyLDB4MTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAic3ViZiIgICAsMiwweDE3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInN1YmYzIiAgLDMsMHgyNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKLSAgeyAic3ViaSIgICAsMiwweDE4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YmkzIiAgLDMsMHgyNzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAic3VicmIiICAsMiwweDE4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YnJmIiAgLDIsMHgxOTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdWJyaSIgICwyLDB4MTk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3dpIiAgICAsMCwweDY2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcCIgICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHUiICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxvIiAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxzIiAsMSwweDc0ODIwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGhpIiAsMSwweDc0ODMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGhzIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGVxIiAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5lIiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx0IiAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxlIiAsMSwweDc0ODgwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGd0IiAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGdlIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHoiICAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG56IiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHAiICAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG4iICAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5uIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG52IiAsMSwweDc0OEMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHYiICAsMSwweDc0OEQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG51ZiIsMSwweDc0OEUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHVmIiAsMSwweDc0OEYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5jIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGMiICAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5sdiIsMSwweDc0OTAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx2IiAsMSwweDc0OTEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5sdWYiLDEsMHg3NDkyMDAyMCwwLCAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx1ZiIsMSwweDc0OTMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHp1ZiIsMSwweDc0OTQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHN0YiIgICAsMiwweDFBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInRzdGIzIiAgLDIsMHgyNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInhvciIgICAgLDIsMHgxQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJ4b3IzIiAgICwzLDB4MjgwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgIiIgICAgICAgLDAsMHgwMDAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHRlbXBsYXRlICpjb25zdCB0aWMzMF9vcHRhYl9lbmQgPQotICB0aWMzMF9vcHRhYiArIHNpemVvZih0aWMzMF9vcHRhYikvc2l6ZW9mKHRpYzMwX29wdGFiWzBdKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHNfMTsKLSAgdW5zaWduZWQgaW50IG9wZXJhbmRzXzI7Ci0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbMl1bM107Ci0gIC8qIFdoaWNoIG9wZXJhbmQgZml0cyBpbnRvIHdoaWNoIHBhcnQgb2YgdGhlIGZpbmFsIG9wY29kZSB3b3JkLiAqLwotICBpbnQgb3BvcmRlcjsKLX0gcGFydGVtcGxhdGU7Ci0KLS8qIG9wb3JkZXIgZGVmaW5lcyAtIG5vdCB2ZXJ5IGRlc2NyaXB0aXZlLiAqLwotI2RlZmluZSBPT180b3AxICAgMAotI2RlZmluZSBPT180b3AyICAgMQotI2RlZmluZSBPT180b3AzICAgMgotI2RlZmluZSBPT181b3AxICAgMwotI2RlZmluZSBPT181b3AyICAgNAotI2RlZmluZSBPT19QRmllbGQgNQotCi1zdGF0aWMgY29uc3QgcGFydGVtcGxhdGUgdGljMzBfcGFyb3B0YWJbXSA9IHsKLSAgeyAicV9hYnNmX3N0ZiIsICAgMiwyLDB4QzgwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9hYnNpX3N0aSIsICAgMiwyLDB4Q0EwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9hZGRmM19zdGYiLCAgMywyLDB4Q0MwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfYWRkaTNfc3RpIiwgIDMsMiwweENFMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX2FuZDNfc3RpIiwgICAzLDIsMHhEMDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9hc2gzX3N0aSIsICAgMywyLDB4RDIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfZml4X3N0aSIsICAgIDIsMiwweEQ0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfZmxvYXRfc3RmIiwgIDIsMiwweEQ2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbGRmX2xkZiIsICAgIDIsMiwweEM0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKLQlPT180b3AyIH0sCi0gIHsgInFfbGRmX3N0ZiIsICAgIDIsMiwweEQ4MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbGRpX2xkaSIsICAgIDIsMiwweEM2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKLQlPT180b3AyIH0sCi0gIHsgInFfbGRpX3N0aSIsICAgIDIsMiwweERBMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbHNoM19zdGkiLCAgIDMsMiwweERDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMiB9LAotICB7ICJxX21weWYzX2FkZGYzIiwzLDMsMHg4MDAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCi0gCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKLSAgeyAicV9tcHlmM19zdGYiLCAgMywyLDB4REUwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfbXB5ZjNfc3ViZjMiLDMsMywweDg0MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbXB5aTNfYWRkaTMiLDMsMywweDg4MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbXB5aTNfc3RpIiwgIDMsMiwweEUwMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX21weWkzX3N1YmkzIiwzLDMsMHg4QzAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9IH0sIE9PX1BGaWVsZCB9LAotICB7ICJxX25lZ2Zfc3RmIiwgICAyLDIsMHhFMjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX25lZ2lfc3RpIiwgICAyLDIsMHhFNDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX25vdF9zdGkiLCAgICAyLDIsMHhFNjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX29yM19zdGkiLCAgICAzLDIsMHhFODAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9zdGZfc3RmIiwgICAgMiwyLDB4QzAwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDMgfSwKLSAgeyAicV9zdGlfc3RpIiwgICAgMiwyLDB4QzIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDMgfSwKLSAgeyAicV9zdWJmM19zdGYiLCAgMywyLDB4RUEwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfc3ViaTNfc3RpIiwgIDMsMiwweEVDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMiB9LAotICB7ICJxX3hvcjNfc3RpIiwgICAzLDIsMHhFRTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAiIiwgICAgICAgICAgICAgMCwwLDB4MDAwMDAwMDAsIHsgeyAwLCAwLCAwIH0sIHsgMCwgMCwgMCB9IH0sIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHBhcnRlbXBsYXRlICpjb25zdCB0aWMzMF9wYXJvcHRhYl9lbmQgPQotICB0aWMzMF9wYXJvcHRhYiArIHNpemVvZih0aWMzMF9wYXJvcHRhYikvc2l6ZW9mKHRpYzMwX3Bhcm9wdGFiWzBdKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWM4MC5oIGIvaW5jbHVkZS9vcGNvZGUvdGljODAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5YmMzMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS90aWM4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qIHRpYzgwLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJIFRNUzMyMEM4MCAoTVYpIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCAoZm5mQGN5Z251cy5jb20pLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRJQzgwX0gKLSNkZWZpbmUgVElDODBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB0aWM4MF9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgdGljODBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBvcGVyYW5kcwotICAgICBhcmUgemVyb2VzLiAgKi8KLQotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYSBtYXNrCi0gICAgIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUgb3Bjb2RlCi0gICAgIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdCBtYXRjaCAoYW5kIGFyZQotICAgICBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBTcGVjaWFsIHB1cnBvc2UgZmxhZ3MgZm9yIHRoaXMgb3Bjb2RlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3M7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZSBvcGVyYW5kCi0gICAgIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0IGFwcGVhciBpbgotICAgICBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgRklYTUU6IEFkanVzdCBzaXplIHRvCi0gICAgIG1hdGNoIGFjdHVhbCByZXF1aXJlbWVudHMgd2hlbiBUSWM4MCBzdXBwb3J0IGlzIGNvbXBsZXRlICovCi0KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UgaW4KLSAgIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlciBpbnN0cnVjdGlvbnMuCi0gICBGSVhNRTogVGhpcyBpc24ndCBjdXJyZW50bHkgdHJ1ZS4gKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgdGljODBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCB0aWM4MF9udW1fb3Bjb2RlczsKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB0aWM4MF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IHRpYzgwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLQotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi0gIGludCBzaGlmdDsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgKCppbnNlcnQpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGxvbmcgb3AsCi0JCQkJICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NJR05FRCkgIT0gMAotCSAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCi0JICAgb3AgLT0gMSA8PCBvLT5iaXRzOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotCi0gIGxvbmcgKCpleHRyYWN0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgdGljODBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCB0aWM4MF9vcGVyYW5kc1tdOwotCi0MCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHRpYzgwX29wZXJhbmQuCi0KLSAgIE5vdGUgdGhhdCBmbGFncyBmb3IgYWxsIHByZWRlZmluZWQgc3ltYm9scywgc3VjaCBhcyB0aGUgZ2VuZXJhbCBwdXJwb3NlCi0gICByZWdpc3RlcnMgKGV4OiByMTApLCBjb250cm9sIHJlZ2lzdGVycyAoZXg6IEZQU1QpLCBjb25kaXRpb24gY29kZXMgKGV4OgotICAgZXEwLmIpLCBiaXQgbnVtYmVycyAoZXg6IGd0LmIpLCBldGMgYXJlIGxhcmdlIGVub3VnaCB0aGF0IHRoZXkgY2FuIGJlCi0gICBvcidkIGludG8gYW4gaW50IHdoZXJlIHRoZSBsb3dlciBiaXRzIGNvbnRhaW4gdGhlIGFjdHVhbCBudW1lcmljIHZhbHVlCi0gICB0aGF0IGNvcnJlcG9uZHMgdG8gdGhpcyBwcmVkZWZpbmVkIHN5bWJvbC4gIFRoaXMgd2F5IGEgc2luZ2xlIGludCBjYW4KLSAgIGNvbnRhaW4gYm90aCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgaXQncyB0eXBlLgotICovCi0KLS8qIFRoaXMgb3BlcmFuZCBtdXN0IGJlIGFuIGV2ZW4gcmVnaXN0ZXIgbnVtYmVyLiAgRmxvYXRpbmcgcG9pbnQgbnVtYmVycwotICAgZm9yIGV4YW1wbGUgYXJlIHN0b3JlZCBpbiBldmVuL29kZCByZWdpc3RlciBwYWlycy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0VWRU4JKDEgPDwgMCkKLQotLyogVGhpcyBvcGVyYW5kIG11c3QgYmUgYW4gb2RkIHJlZ2lzdGVyIG51bWJlciBhbmQgbXVzdCBiZSBvbmUgZ3JlYXRlciB0aGFuCi0gICB0aGUgcmVnaXN0ZXIgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBvcGVyYW5kLiAgSS5FLiB0aGUgc2Vjb25kIHJlZ2lzdGVyIGluCi0gICBhbiBldmVuL29kZCByZWdpc3RlciBwYWlyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfT0RECSgxIDw8IDEpCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLiAgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1NJR05FRAkoMSA8PCAyKQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGJlIGVpdGhlciBhIHByZWRlZmluZWQgY29uc3RhbnQgbmFtZSBvciBhIG51bWVyaWMgdmFsdWUuCi0gICBBbiBleGFtcGxlIHdvdWxkIGJlIGEgY29uZGl0aW9uIGNvZGUgbGlrZSAiZXEwLmIiIHdoaWNoIGhhcyB0aGUgbnVtZXJpYwotICAgdmFsdWUgMHgyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTlVNCSgxIDw8IDMpCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgYmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyByYXRoZXIgdGhhbiBzZXBhcmF0ZWQKLSAgIGZyb20gdGhlIHByZXZpb3VzIG9uZSBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB2YXJpb3VzCi0gICBpbnN0cnVjdGlvbnMsIGxpa2UgdGhlIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucywgd2hpY2ggd2FudAotICAgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlICJkaXNwbGFjZW1lbnQocmVnKSIgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1BBUkVOUwkoMSA8PCA0KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBQQyByZWxhdGl2ZSBicmFuY2ggb2Zmc2V0LiAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMKLSAgIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gIE5vdGUgdGhhdCB0aGUgb2Zmc2V0cyBhcmUgdGFrZW4gYXMgd29yZAotICAgb2Zmc2V0cy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1BDUkVMCSgxIDw8IDUpCi0KLS8qIFRoaXMgZmxhZyBpcyBhIGhpbnQgdG8gdGhlIGRpc2Fzc2VtYmxlciBmb3IgdXNpbmcgaGV4IGFzIHRoZSBwcmVmZXJlZAotICAgcHJpbnRpbmcgZm9ybWF0LCBldmVuIGZvciBzbWFsbCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbW1lZGlhdGUgdmFsdWVzLgotICAgTm9ybWFsbHkgdmFsdWVzIGluIHRoZSByYW5nZSAtOTk5IHRvIDk5OSBhcmUgcHJpbnRlZCBhcyBzaWduZWQgZGVjaW1hbAotICAgdmFsdWVzIGFuZCBvdGhlciB2YWx1ZXMgYXJlIHByaW50ZWQgaW4gaGV4LiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQklURklFTEQJKDEgPDwgNikKLQotLyogVGhpcyBvcGVyYW5kIG1heSBoYXZlIGEgIjptIiBtb2RpZmllciBzcGVjaWZpZWQgYnkgYml0IDE3IGluIGEgc2hvcnQKLSAgIGltbWVkaWF0ZSBmb3JtIGluc3RydWN0aW9uLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTV9TSQkoMSA8PCA3KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOm0iIG1vZGlmaWVyIHNwZWNpZmllZCBieSBiaXQgMTUgaW4gYSBsb25nCi0gICBpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX01fTEkJKDEgPDwgOCkKLQotLyogVGhpcyBvcGVyYW5kIG1heSBoYXZlIGEgIjpzIiBtb2RpZmllciBzcGVjaWZpZWQgaW4gYml0IDExIGluIGEgbG9uZwotICAgaW1tZWRpYXRlIG9yIHJlZ2lzdGVyIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9TQ0FMRUQJKDEgPDwgOSkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0ZMT0FUCSgxIDw8IDEwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYnl0ZSBvZmZzZXQgZnJvbSBhIGJhc2UgcmVsb2NhdGlvbi4gVGhlIGxvd2VyCi0gdHdvIGJpdHMgb2YgdGhlIGZpbmFsIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSBpZ25vcmVkIHdoZW4gdGhlIHZhbHVlIGlzCi0gd3JpdHRlbiB0byB0aGUgcHJvZ3JhbSBjb3VudGVyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQkFTRVJFTAkoMSA8PCAxMSkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGFuICJlbmRtYXNrIiBmaWVsZCBmb3IgYSBzaGlmdCBpbnN0cnVjdGlvbi4KLSAgIEl0IGlzIHRyZWF0ZWQgc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBoYXZlIHZhbHVlcyBvZiAwLTMyLAotICAgd2hlcmUgMCBhbmQgMzIgcmVzdWx0IGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhlIGFzc2VtYmxlcgotICAgbXVzdCBiZSBhYmxlIHRvIGFjY2VwdCBib3RoIGVuZG1hc2sgdmFsdWVzLiAgVGhpcyBkaXNhc3NlbWJsZXIKLSAgIGhhcyBubyB3YXkgb2Yga25vd2luZyBmcm9tIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB2YWx1ZSB3YXMgCi0gICBnaXZlbiBhdCBhc3NlbWJseSB0aW1lLCBzbyBpdCBqdXN0IHVzZXMgJzAnLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRU5ETUFTSwkoMSA8PCAxMikKLQotLyogVGhpcyBvcGVyYW5kIGlzIG9uZSBvZiB0aGUgMzIgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdyJy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0dQUgkoMSA8PCAyNykKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQgYWNjdW11bGF0b3IgcmVnaXN0ZXIuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSB3aXRoIGEgbGVhZGluZyAnYScuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9GUEEJKCAxIDw8IDI4KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBjb250cm9sIHJlZ2lzdGVyIG51bWJlciwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJFSUYiLCAiRVBDIiwgZXRjKS4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseS4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0NSCSgxIDw8IDI5KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBjb25kaXRpb24gY29kZSwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJlcTAuYiIsICJuZTAudyIsIGV0YykuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9DQwkoMSA8PCAzMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgYml0IG51bWJlciwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJlcS5iIiwgIm9yLmYiLCBldGMpLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5LgotICAgTm90ZSB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBpbnN0cnVjdGlvbiBpbiAxJ3MgY29tcGxlbWVudCByZWxhdGl2ZQotICAgdG8gdGhlIHZhbHVlcyBnaXZlbiBpbiB0aGUgbWFudWFsLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQklUTlVNCSgxIDw8IDMxKQotCi0vKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBzdHJpcCBvcGVyYW5kIGJpdHMgZnJvbSBhbiBpbnQgdGhhdCBjb250YWlucwotICAgYm90aCBvcGVyYW5kIGJpdHMgYW5kIGEgbnVtZXJpYyB2YWx1ZSBpbiB0aGUgbHNicy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX01BU0sJKFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9GUEEgfCBUSUM4MF9PUEVSQU5EX0NSIHwgVElDODBfT1BFUkFORF9DQyB8IFRJQzgwX09QRVJBTkRfQklUTlVNKQotCi0MCi0vKiBGbGFnIGJpdHMgZm9yIHRoZSBzdHJ1Y3QgdGljODBfb3Bjb2RlIGZsYWdzIGZpZWxkLiAqLwotCi0jZGVmaW5lIFRJQzgwX1ZFQ1RPUgkJMDEJLyogSXMgYSB2ZWN0b3IgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVElDODBfTk9fUjBfREVTVAkwMgkvKiBSZWdpc3RlciByMCBjYW5ub3QgYmUgYSBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCi0MCi0vKiBUaGUgb3Bjb2RlcyBsaWJyYXJ5IGNvbnRhaW5zIGEgdGFibGUgdGhhdCBhbGxvd3MgdHJhbnNsYXRpb24gZnJvbSBwcmVkZWZpbmVkCi0gICBzeW1ib2wgbmFtZXMgdG8gbnVtZXJpYyB2YWx1ZXMsIGFuZCB2aWNlIHZlcnNhLiAqLwotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHN5bWJvbHMuICAqLwotCi1zdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wKLXsKLSAgY2hhciAqbmFtZTsJCS8qIG5hbWUgdG8gcmVjb2duaXplICovCi0gIGludCB2YWx1ZTsKLX07Ci0KLSNkZWZpbmUgUERTX05BTUUocGRzcCkgKChwZHNwKSAtPiBuYW1lKQotI2RlZmluZSBQRFNfVkFMVUUocGRzcCkgKChwZHNwKSAtPiB2YWx1ZSkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbXTsJLyogVHJhbnNsYXRpb24gYXJyYXkgKi8KLWV4dGVybiBjb25zdCBpbnQgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9sczsJCQkJLyogSG93IG1hbnkgbWVtYmVycyBpbiB0aGUgYXJyYXkgKi8KLQotY29uc3QgY2hhciAqdGljODBfdmFsdWVfdG9fc3ltYm9sIFBBUkFNUyAoKGludCB2YWwsIGludCBjbGFzcykpOwkvKiBUcmFuc2xhdGUgdmFsdWUgdG8gc3ltYm9saWMgbmFtZSAqLwotaW50IHRpYzgwX3N5bWJvbF90b192YWx1ZSBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgY2xhc3MpKTsJCS8qIFRyYW5zbGF0ZSBzeW1ib2xpYyBuYW1lIHRvIHZhbHVlICovCi0KLWNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqCi10aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqKSk7Ci0KLSNlbmRpZiAvKiBUSUM4MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS92ODUwLmggYi9pbmNsdWRlL29wY29kZS92ODUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTE2ZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvdjg1MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qIHY4NTAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTkVDIFY4NTAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFY4NTBfSAotI2RlZmluZSBWODUwX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3Qgdjg1MF9vcGNvZGUuICAqLwotCi1zdHJ1Y3Qgdjg1MF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci0KLSAgLyogV2hpY2ggKGlmIGFueSkgb3BlcmFuZCBpcyBhIG1lbW9yeSBvcGVyYW5kLiAgKi8KLSAgdW5zaWduZWQgaW50IG1lbW9wOwotCi0gIC8qIFRhcmdldCBwcm9jZXNzb3IocykuICBBIGJpdCBmaWVsZCBvZiBwcm9jZXNzb3JzIHdoaWNoIHN1cHBvcnQKLSAgICAgdGhpcyBpbnN0cnVjdGlvbi4gIE5vdGUgYSBiaXQgZmllbGQgaXMgdXNlZCBhcyBzb21lIGluc3RydWN0aW9ucwotICAgICBhcmUgYXZhaWxhYmxlIG9uIG11bHRpcGxlLCBkaWZmZXJlbnQgcHJvY2Vzc29yIHR5cGVzLCB3aGVyZWFzCi0gICAgIG90aGVyIGluc3RydWN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgb24gb25lIHNwZWNpZmljIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yczsKLX07Ci0KLS8qIFZhbHVlcyBmb3IgdGhlIHByb2Nlc3NvcnMgZmllbGQgaW4gdGhlIHY4NTBfb3Bjb2RlIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9WODUwCQkoMSA8PCAwKQkJLyogSnVzdCB0aGUgVjg1MC4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9BTEwJCS0xCQkJLyogQW55IHByb2Nlc3Nvci4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9WODUwRQkJKDEgPDwgMSkJCS8qIEp1c3QgdGhlIFY4NTBFLiAqLwotI2RlZmluZSBQUk9DRVNTT1JfTk9UX1Y4NTAJKH4gUFJPQ0VTU09SX1Y4NTApCS8qIEFueSBwcm9jZXNzb3IgZXhjZXB0IHRoZSBWODUwLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTBFQQkoMSA8PCAyKQkJLyogSnVzdCB0aGUgVjg1MEVBLiAqLwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlIHY4NTBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCB2ODUwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHY4NTBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCB2ODUwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgLyogSWYgdGhpcyB2YWx1ZSBpcyAtMSB0aGVuIHRoZSBvcGVyYW5kJ3MgYml0cyBhcmUgaW4gYSBkaXNjb250aW5vdXMgZGlzdHJpYnV0aW9uIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogKGJpdHMgPj0gMCk6ICBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiAoYml0cyA9PSAtMSk6IEJpdCBtYXNrIG9mIHRoZSBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgKCogaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBsb25nIG9wLAotCQkJCSAgIGNvbnN0IGNoYXIgKiogZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gby0+Yml0cyA9PSAtMSA/ICgoaSkgJiBvLT5zaGlmdCkgOiAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoby0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCSAgICAgb3AgPSAob3AgPDwgKDMyIC0gby0+Yml0cykpID4+ICgzMiAtIG8tPmJpdHMpOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotICB1bnNpZ25lZCBsb25nICgqIGV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqIGludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIGludCBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgdjg1MF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgdjg1MF9vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHY4NTBfb3BlcmFuZC4gICovCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfUkVHCTB4MDEKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgc3lzdGVtIHJlZ2lzdGVyICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9TUkcJMHgwMgotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBjb25kaXRpb24gY29kZSB1c2VkIGluIHRoZSBzZXRmIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9DQwkJMHgwNAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcyAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfU0lHTkVECTB4MDgKLQotLyogVGhpcyBvcGVyYW5kIGlzIHRoZSBlcCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9FUAkJMHgxMAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBQQyBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0RJU1AJMHgyMAotCi0vKiBUaGlzIGlzIGEgcmVsYXhhYmxlIG9wZXJhbmQuICAgT25seSB1c2VkIGZvciBEOS0+RDIyIGJyYW5jaCByZWxheGluZwotICAgcmlnaHQgbm93LiAgV2UgbWF5IG5lZWQgb3RoZXJzIGluIHRoZSBmdXR1cmUgKG9yIG1heWJlIGhhbmRsZSB0aGVtIGxpa2UKLSAgIHByb21vdGVkIG9wZXJhbmRzIG9uIHRoZSBtbjEwMzAwPykgICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9SRUxBWAkweDQwCi0KLS8qIFRoZSByZWdpc3RlciBzcGVjaWZpZWQgbXVzdCBub3QgYmUgcjAgKi8KLSNkZWZpbmUgVjg1MF9OT1RfUjAJICAgICAgICAweDgwCi0KLS8qIENZR05VUyBMT0NBTCB2ODUwZSAqLwotLyogcHVzaC9wb3AgdHlwZSBpbnN0cnVjdGlvbiwgVjg1MEUgc3BlY2lmaWMuICAqLwotI2RlZmluZSBWODUwRV9QVVNIX1BPUAkJMHgxMDAKLQotLyogMTYgYml0IGltbWVkaWF0ZSBmb2xsb3dzIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX0lNTUVESUFURTE2CTB4MjAwCi0KLS8qIDMyIGJpdCBpbW1lZGlhdGUgZm9sbG93cyBpbnN0cnVjdGlvbiwgVjg1MEUgc3BlY2lmaWMuICAqLwotI2RlZmluZSBWODUwRV9JTU1FRElBVEUzMgkweDQwMAotCi0jZW5kaWYgLyogVjg1MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS92YXguaCBiL2luY2x1ZGUvb3Bjb2RlL3ZheC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2FmZWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3ZheC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qIFZheCBvcGNkZSBsaXN0LgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotR0RCIGFuZCBHQVMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGFuZCBHQVMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCIG9yIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiB2YXhfb3Bjb2RlVAotI2RlZmluZSB2YXhfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyB2YXhfb3Bjb2RlVCAqLwotCi1zdHJ1Y3Qgdm90X3dvdAkJCS8qIHZheCBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMgKi8KLQkJCQkvKiBwYXJ0aWN1bGFyIG9wY29kZSAqLwotewotICBjb25zdCBjaGFyICAgICAgICphcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotICB2YXhfb3Bjb2RlVCAgICAgICBjb2RlOwkvKiBvcC1jb2RlIChtYXkgYmUgPiA4IGJpdHMhKSAqLwotfTsKLQotc3RydWN0IHZvdAkJCS8qIHZheCBvcGNvZGUgdGV4dCAqLwotewotICBjb25zdCBjaGFyICAgICAgICpuYW1lOwkvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCi0gIHN0cnVjdCB2b3Rfd290ICAgIGRldGFpbDsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSB2b3RfaG93IGFyZ3MKLSNkZWZpbmUgdm90X2NvZGUgY29kZQotI2RlZmluZSB2b3RfZGV0YWlsIGRldGFpbAotI2RlZmluZSB2b3RfbmFtZSBuYW1lCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm90Ci12b3RzdHJzW10gPQotewoteyAgICAiaGFsdCIsCXsiIiwJCQkweDAwCX0gfSwKLXsgICAgIm5vcCIsCXsiIiwJCQkweDAxCX0gfSwKLXsgICAgInJlaSIsCXsiIiwJCQkweDAyCX0gfSwKLXsgICAgImJwdCIsCXsiIiwJCQkweDAzCX0gfSwKLXsgICAgInJldCIsCXsiIiwJCQkweDA0CX0gfSwKLXsgICAgInJzYiIsCXsiIiwJCQkweDA1CX0gfSwKLXsgICAgImxkcGN0eCIsCXsiIiwJCQkweDA2CX0gfSwKLXsgICAgInN2cGN0eCIsCXsiIiwJCQkweDA3CX0gfSwKLXsgICAgImN2dHBzIiwJeyJyd2FicndhYiIsCQkweDA4CX0gfSwKLXsgICAgImN2dHNwIiwJeyJyd2FicndhYiIsCQkweDA5CX0gfSwKLXsgICAgImluZGV4IiwJeyJybHJscmxybHJsd2wiLAkweDBhCX0gfSwKLXsgICAgImNyYyIsCXsiYWJybHJ3YWIiLAkJMHgwYgl9IH0sCi17ICAgICJwcm9iZXIiLAl7InJicndhYiIsCQkweDBjCX0gfSwKLXsgICAgInByb2JldyIsCXsicmJyd2FiIiwJICAgICAgICAweDBkCX0gfSwKLXsgICAgImluc3F1ZSIsCXsiYWJhYiIsCQkweDBlCX0gfSwKLXsgICAgInJlbXF1ZSIsCXsiYWJ3bCIsCQkweDBmCX0gfSwKLXsgICAgImJzYmIiLAl7ImJiIiwJCQkweDEwCX0gfSwKLXsgICAgImJyYiIsCXsiYmIiLAkJCTB4MTEJfSB9LAoteyAgICAiYm5lcSIsCXsiYmIiLAkJCTB4MTIJfSB9LAoteyAgICAiYm5lcXUiLAl7ImJiIiwJCQkweDEyCX0gfSwKLXsgICAgImJlcWwiLAl7ImJiIiwJCQkweDEzCX0gfSwKLXsgICAgImJlcWx1IiwJeyJiYiIsCQkJMHgxMwl9IH0sCi17ICAgICJiZ3RyIiwJeyJiYiIsCQkJMHgxNAl9IH0sCi17ICAgICJibGVxIiwJeyJiYiIsCQkJMHgxNQl9IH0sCi17ICAgICJqc2IiLAl7ImFiIiwJCQkweDE2CX0gfSwKLXsgICAgImptcCIsCXsiYWIiLAkJCTB4MTcJfSB9LAoteyAgICAiYmdlcSIsCXsiYmIiLAkJCTB4MTgJfSB9LAoteyAgICAiYmxzcyIsCXsiYmIiLAkJCTB4MTkJfSB9LAoteyAgICAiYmd0cnUiLAl7ImJiIiwJCQkweDFhCX0gfSwKLXsgICAgImJsZXF1IiwJeyJiYiIsCQkJMHgxYgl9IH0sCi17ICAgICJidmMiLAl7ImJiIiwJCQkweDFjCX0gfSwKLXsgICAgImJ2cyIsCXsiYmIiLAkJCTB4MWQJfSB9LAoteyAgICAiYmNjIiwJeyJiYiIsCQkJMHgxZQl9IH0sCi17ICAgICJiZ2VxdSIsCXsiYmIiLAkJCTB4MWUJfSB9LAoteyAgICAiYmxzc3UiLAl7ImJiIiwJCQkweDFmCX0gfSwKLXsgICAgImJjcyIsCXsiYmIiLAkJCTB4MWYJfSB9LAoteyAgICAiYWRkcDQiLAl7InJ3YWJyd2FiIiwJCTB4MjAJfSB9LAoteyAgICAiYWRkcDYiLAl7InJ3YWJyd2FicndhYiIsCTB4MjEJfSB9LAoteyAgICAic3VicDQiLAl7InJ3YWJyd2FiIiwJCTB4MjIJfSB9LAoteyAgICAic3VicDYiLAl7InJ3YWJyd2FicndhYiIsCTB4MjMJfSB9LAoteyAgICAiY3Z0cHQiLAl7InJ3YWJhYnJ3YWIiLAkJMHgyNAl9IH0sCi17ICAgICJtdWxwIiwJeyJyd2FicndhYnJ3YWIiLAkweDI1CX0gfSwKLXsgICAgImN2dHRwIiwJeyJyd2FiYWJyd2FiIiwJCTB4MjYJfSB9LAoteyAgICAiZGl2cCIsCXsicndhYnJ3YWJyd2FiIiwJMHgyNwl9IH0sCi17ICAgICJtb3ZjMyIsCXsicndhYmFiIiwJCTB4MjgJfSB9LAoteyAgICAiY21wYzMiLAl7InJ3YWJhYiIsCQkweDI5CX0gfSwKLXsgICAgInNjYW5jIiwJeyJyd2FiYWJyYiIsCQkweDJhCX0gfSwKLXsgICAgInNwYW5jIiwJeyJyd2FiYWJyYiIsCQkweDJiCX0gfSwKLXsgICAgIm1vdmM1IiwJeyJyd2FicmJyd2FiIiwJCTB4MmMJfSB9LAoteyAgICAiY21wYzUiLAl7InJ3YWJyYnJ3YWIiLAkJMHgyZAl9IH0sCi17ICAgICJtb3Z0YyIsCXsicndhYnJiYWJyd2FiIiwJMHgyZQl9IH0sCi17ICAgICJtb3Z0dWMiLAl7InJ3YWJyYmFicndhYiIsCTB4MmYJfSB9LAoteyAgICAiYnNidyIsCXsiYnciLAkJCTB4MzAJfSB9LAoteyAgICAiYnJ3IiwJeyJidyIsCQkJMHgzMQl9IH0sCi17ICAgICJjdnR3bCIsCXsicnd3bCIsCQkweDMyCX0gfSwKLXsgICAgImN2dHdiIiwJeyJyd3diIiwJCTB4MzMJfSB9LAoteyAgICAibW92cCIsCXsicndhYmFiIiwJCTB4MzQJfSB9LAoteyAgICAiY21wcDMiLAl7InJ3YWJhYiIsCQkweDM1CX0gfSwKLXsgICAgImN2dHBsIiwJeyJyd2Fid2wiLAkJMHgzNgl9IH0sCi17ICAgICJjbXBwNCIsCXsicndhYnJ3YWIiLAkJMHgzNwl9IH0sCi17ICAgICJlZGl0cGMiLAl7InJ3YWJhYmFiIiwJCTB4MzgJfSB9LAoteyAgICAibWF0Y2hjIiwJeyJyd2FicndhYiIsCQkweDM5CX0gfSwKLXsgICAgImxvY2MiLAl7InJicndhYiIsCQkweDNhCX0gfSwKLXsgICAgInNrcGMiLAl7InJicndhYiIsCQkweDNiCX0gfSwKLXsgICAgIm1vdnp3bCIsCXsicnd3bCIsCQkweDNjCX0gfSwKLXsgICAgImFjYnciLAl7InJ3cndtd2J3IiwJCTB4M2QJfSB9LAoteyAgICAibW92YXciLAl7ImF3d2wiLAkJMHgzZQl9IH0sCi17ICAgICJwdXNoYXciLAl7ImF3IiwJCQkweDNmCX0gfSwKLXsgICAgImFkZGYyIiwJeyJyZm1mIiwJCTB4NDAJfSB9LAoteyAgICAiYWRkZjMiLAl7InJmcmZ3ZiIsCQkweDQxCX0gfSwKLXsgICAgInN1YmYyIiwJeyJyZm1mIiwJCTB4NDIJfSB9LAoteyAgICAic3ViZjMiLAl7InJmcmZ3ZiIsCQkweDQzCX0gfSwKLXsgICAgIm11bGYyIiwJeyJyZm1mIiwJCTB4NDQJfSB9LAoteyAgICAibXVsZjMiLAl7InJmcmZ3ZiIsCQkweDQ1CX0gfSwKLXsgICAgImRpdmYyIiwJeyJyZm1mIiwJCTB4NDYJfSB9LAoteyAgICAiZGl2ZjMiLAl7InJmcmZ3ZiIsCQkweDQ3CX0gfSwKLXsgICAgImN2dGZiIiwJeyJyZndiIiwJCTB4NDgJfSB9LAoteyAgICAiY3Z0ZnciLAl7InJmd3ciLAkJMHg0OQl9IH0sCi17ICAgICJjdnRmbCIsCXsicmZ3bCIsCQkweDRhCX0gfSwKLXsgICAgImN2dHJmbCIsCXsicmZ3bCIsCQkweDRiCX0gfSwKLXsgICAgImN2dGJmIiwJeyJyYndmIiwJCTB4NGMJfSB9LAoteyAgICAiY3Z0d2YiLAl7InJ3d2YiLAkJMHg0ZAl9IH0sCi17ICAgICJjdnRsZiIsCXsicmx3ZiIsCQkweDRlCX0gfSwKLXsgICAgImFjYmYiLAl7InJmcmZtZmJ3IiwJCTB4NGYJfSB9LAoteyAgICAibW92ZiIsCXsicmZ3ZiIsCQkweDUwCX0gfSwKLXsgICAgImNtcGYiLAl7InJmcmYiLAkJMHg1MQl9IH0sCi17ICAgICJtbmVnZiIsCXsicmZ3ZiIsCQkweDUyCX0gfSwKLXsgICAgInRzdGYiLAl7InJmIiwJCQkweDUzCX0gfSwKLXsgICAgImVtb2RmIiwJeyJyZnJicmZ3bHdmIiwJCTB4NTQJfSB9LAoteyAgICAicG9seWYiLAl7InJmcndhYiIsCQkweDU1CX0gfSwKLXsgICAgImN2dGZkIiwJeyJyZndkIiwJCTB4NTYJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1NyBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLXsgICAgImFkYXdpIiwJeyJyd213IiwJCTB4NTgJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1OSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNWEgaXMgbm90IGRlZmluZWQgeWV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDViIGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiaW5zcWhpIiwJeyJhYmFxIiwJCTB4NWMJfSB9LAoteyAgICAiaW5zcXRpIiwJeyJhYmFxIiwJCTB4NWQJfSB9LAoteyAgICAicmVtcWhpIiwJeyJhcXdsIiwJCTB4NWUJfSB9LAoteyAgICAicmVtcXRpIiwJeyJhcXdsIiwJCTB4NWYJfSB9LAoteyAgICAiYWRkZDIiLAl7InJkbWQiLAkJMHg2MAl9IH0sCi17ICAgICJhZGRkMyIsCXsicmRyZHdkIiwJCTB4NjEJfSB9LAoteyAgICAic3ViZDIiLAl7InJkbWQiLAkJMHg2Mgl9IH0sCi17ICAgICJzdWJkMyIsCXsicmRyZHdkIiwJCTB4NjMJfSB9LAoteyAgICAibXVsZDIiLAl7InJkbWQiLAkJMHg2NAl9IH0sCi17ICAgICJtdWxkMyIsCXsicmRyZHdkIiwJCTB4NjUJfSB9LAoteyAgICAiZGl2ZDIiLAl7InJkbWQiLAkJMHg2Ngl9IH0sCi17ICAgICJkaXZkMyIsCXsicmRyZHdkIiwJCTB4NjcJfSB9LAoteyAgICAiY3Z0ZGIiLAl7InJkd2IiLAkJMHg2OAl9IH0sCi17ICAgICJjdnRkdyIsCXsicmR3dyIsCQkweDY5CX0gfSwKLXsgICAgImN2dGRsIiwJeyJyZHdsIiwJCTB4NmEJfSB9LAoteyAgICAiY3Z0cmRsIiwJeyJyZHdsIiwJCTB4NmIJfSB9LAoteyAgICAiY3Z0YmQiLAl7InJid2QiLAkJMHg2Ywl9IH0sCi17ICAgICJjdnR3ZCIsCXsicnd3ZCIsCQkweDZkCX0gfSwKLXsgICAgImN2dGxkIiwJeyJybHdkIiwJCTB4NmUJfSB9LAoteyAgICAiYWNiZCIsCXsicmRyZG1kYnciLAkJMHg2Zgl9IH0sCi17ICAgICJtb3ZkIiwJeyJyZHdkIiwJCTB4NzAJfSB9LAoteyAgICAiY21wZCIsCXsicmRyZCIsCQkweDcxCX0gfSwKLXsgICAgIm1uZWdkIiwJeyJyZHdkIiwJCTB4NzIJfSB9LAoteyAgICAidHN0ZCIsCXsicmQiLAkJCTB4NzMJfSB9LAoteyAgICAiZW1vZGQiLAl7InJkcmJyZHdsd2QiLAkJMHg3NAl9IH0sCi17ICAgICJwb2x5ZCIsCXsicmRyd2FiIiwJCTB4NzUJfSB9LAoteyAgICAiY3Z0ZGYiLAl7InJkd2YiLAkJMHg3Ngl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDc3IGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiYXNobCIsCXsicmJybHdsIiwJCTB4NzgJfSB9LAoteyAgICAiYXNocSIsCXsicmJycXdxIiwJCTB4NzkJfSB9LAoteyAgICAiZW11bCIsCXsicmxybHJsd3EiLAkJMHg3YQl9IH0sCi17ICAgICJlZGl2IiwJeyJybHJxd2x3bCIsCQkweDdiCX0gfSwKLXsgICAgImNscmQiLAl7IndkIiwJCQkweDdjCX0gfSwKLXsgICAgImNscmciLAl7IndnIiwJCQkweDdjCX0gfSwKLXsgICAgImNscnEiLAl7IndkIiwJCQkweDdjCX0gfSwKLXsgICAgIm1vdnEiLAl7InJxd3EiLAkJMHg3ZAl9IH0sCi17ICAgICJtb3ZhcSIsCXsiYXF3bCIsCQkweDdlCX0gfSwKLXsgICAgIm1vdmFkIiwJeyJhZHdsIiwJCTB4N2UJfSB9LAoteyAgICAicHVzaGFxIiwJeyJhcSIsCQkJMHg3Zgl9IH0sCi17ICAgICJwdXNoYWQiLAl7ImFkIiwJCQkweDdmCX0gfSwKLXsgICAgImFkZGIyIiwJeyJyYm1iIiwJCTB4ODAJfSB9LAoteyAgICAiYWRkYjMiLAl7InJicmJ3YiIsCQkweDgxCX0gfSwKLXsgICAgInN1YmIyIiwJeyJyYm1iIiwJCTB4ODIJfSB9LAoteyAgICAic3ViYjMiLAl7InJicmJ3YiIsCQkweDgzCX0gfSwKLXsgICAgIm11bGIyIiwJeyJyYm1iIiwJCTB4ODQJfSB9LAoteyAgICAibXVsYjMiLAl7InJicmJ3YiIsCQkweDg1CX0gfSwKLXsgICAgImRpdmIyIiwJeyJyYm1iIiwJCTB4ODYJfSB9LAoteyAgICAiZGl2YjMiLAl7InJicmJ3YiIsCQkweDg3CX0gfSwKLXsgICAgImJpc2IyIiwJeyJyYm1iIiwJCTB4ODgJfSB9LAoteyAgICAiYmlzYjMiLAl7InJicmJ3YiIsCQkweDg5CX0gfSwKLXsgICAgImJpY2IyIiwJeyJyYm1iIiwJCTB4OGEJfSB9LAoteyAgICAiYmljYjMiLAl7InJicmJ3YiIsCQkweDhiCX0gfSwKLXsgICAgInhvcmIyIiwJeyJyYm1iIiwJCTB4OGMJfSB9LAoteyAgICAieG9yYjMiLAl7InJicmJ3YiIsCQkweDhkCX0gfSwKLXsgICAgIm1uZWdiIiwJeyJyYndiIiwJCTB4OGUJfSB9LAoteyAgICAiY2FzZWIiLAl7InJicmJyYiIsCQkweDhmCX0gfSwKLXsgICAgIm1vdmIiLAl7InJid2IiLAkJMHg5MAl9IH0sCi17ICAgICJjbXBiIiwJeyJyYnJiIiwJCTB4OTEJfSB9LAoteyAgICAibWNvbWIiLAl7InJid2IiLAkJMHg5Mgl9IH0sCi17ICAgICJiaXRiIiwJeyJyYnJiIiwJCTB4OTMJfSB9LAoteyAgICAiY2xyYiIsCXsid2IiLAkJCTB4OTQJfSB9LAoteyAgICAidHN0YiIsCXsicmIiLAkJCTB4OTUJfSB9LAoteyAgICAiaW5jYiIsCXsibWIiLAkJCTB4OTYJfSB9LAoteyAgICAiZGVjYiIsCXsibWIiLAkJCTB4OTcJfSB9LAoteyAgICAiY3Z0YmwiLAl7InJid2wiLAkJMHg5OAl9IH0sCi17ICAgICJjdnRidyIsCXsicmJ3dyIsCQkweDk5CX0gfSwKLXsgICAgIm1vdnpibCIsCXsicmJ3bCIsCQkweDlhCX0gfSwKLXsgICAgIm1vdnpidyIsCXsicmJ3dyIsCQkweDliCX0gfSwKLXsgICAgInJvdGwiLAl7InJicmx3bCIsCQkweDljCX0gfSwKLXsgICAgImFjYmIiLAl7InJicmJtYmJ3IiwJCTB4OWQJfSB9LAoteyAgICAibW92YWIiLAl7ImFid2wiLAkJMHg5ZQl9IH0sCi17ICAgICJwdXNoYWIiLAl7ImFiIiwJCQkweDlmCX0gfSwKLXsgICAgImFkZHcyIiwJeyJyd213IiwJCTB4YTAJfSB9LAoteyAgICAiYWRkdzMiLAl7InJ3cnd3dyIsCQkweGExCX0gfSwKLXsgICAgInN1YncyIiwJeyJyd213IiwJCTB4YTIJfSB9LAoteyAgICAic3VidzMiLAl7InJ3cnd3dyIsCQkweGEzCX0gfSwKLXsgICAgIm11bHcyIiwJeyJyd213IiwJCTB4YTQJfSB9LAoteyAgICAibXVsdzMiLAl7InJ3cnd3dyIsCQkweGE1CX0gfSwKLXsgICAgImRpdncyIiwJeyJyd213IiwJCTB4YTYJfSB9LAoteyAgICAiZGl2dzMiLAl7InJ3cnd3dyIsCQkweGE3CX0gfSwKLXsgICAgImJpc3cyIiwJeyJyd213IiwJCTB4YTgJfSB9LAoteyAgICAiYmlzdzMiLAl7InJ3cnd3dyIsCQkweGE5CX0gfSwKLXsgICAgImJpY3cyIiwJeyJyd213IiwJCTB4YWEJfSB9LAoteyAgICAiYmljdzMiLAl7InJ3cnd3dyIsCQkweGFiCX0gfSwKLXsgICAgInhvcncyIiwJeyJyd213IiwJCTB4YWMJfSB9LAoteyAgICAieG9ydzMiLAl7InJ3cnd3dyIsCQkweGFkCX0gfSwKLXsgICAgIm1uZWd3IiwJeyJyd3d3IiwJCTB4YWUJfSB9LAoteyAgICAiY2FzZXciLAl7InJ3cndydyIsCQkweGFmCX0gfSwKLXsgICAgIm1vdnciLAl7InJ3d3ciLAkJMHhiMAl9IH0sCi17ICAgICJjbXB3IiwJeyJyd3J3IiwJCTB4YjEJfSB9LAoteyAgICAibWNvbXciLAl7InJ3d3ciLAkJMHhiMgl9IH0sCi17ICAgICJiaXR3IiwJeyJyd3J3IiwJCTB4YjMJfSB9LAoteyAgICAiY2xydyIsCXsid3ciLAkJCTB4YjQJfSB9LAoteyAgICAidHN0dyIsCXsicnciLAkJCTB4YjUJfSB9LAoteyAgICAiaW5jdyIsCXsibXciLAkJCTB4YjYJfSB9LAoteyAgICAiZGVjdyIsCXsibXciLAkJCTB4YjcJfSB9LAoteyAgICAiYmlzcHN3IiwJeyJydyIsCQkJMHhiOAl9IH0sCi17ICAgICJiaWNwc3ciLAl7InJ3IiwJCQkweGI5CX0gfSwKLXsgICAgInBvcHIiLAl7InJ3IiwJCQkweGJhCX0gfSwKLXsgICAgInB1c2hyIiwJeyJydyIsCQkJMHhiYgl9IH0sCi17ICAgICJjaG1rIiwJeyJydyIsCQkJMHhiYwl9IH0sCi17ICAgICJjaG1lIiwJeyJydyIsCQkJMHhiZAl9IH0sCi17ICAgICJjaG1zIiwJeyJydyIsCQkJMHhiZQl9IH0sCi17ICAgICJjaG11IiwJeyJydyIsCQkJMHhiZgl9IH0sCi17ICAgICJhZGRsMiIsCXsicmxtbCIsCQkweGMwCX0gfSwKLXsgICAgImFkZGwzIiwJeyJybHJsd2wiLAkJMHhjMQl9IH0sCi17ICAgICJzdWJsMiIsCXsicmxtbCIsCQkweGMyCX0gfSwKLXsgICAgInN1YmwzIiwJeyJybHJsd2wiLAkJMHhjMwl9IH0sCi17ICAgICJtdWxsMiIsCXsicmxtbCIsCQkweGM0CX0gfSwKLXsgICAgIm11bGwzIiwJeyJybHJsd2wiLAkJMHhjNQl9IH0sCi17ICAgICJkaXZsMiIsCXsicmxtbCIsCQkweGM2CX0gfSwKLXsgICAgImRpdmwzIiwJeyJybHJsd2wiLAkJMHhjNwl9IH0sCi17ICAgICJiaXNsMiIsCXsicmxtbCIsCQkweGM4CX0gfSwKLXsgICAgImJpc2wzIiwJeyJybHJsd2wiLAkJMHhjOQl9IH0sCi17ICAgICJiaWNsMiIsCXsicmxtbCIsCQkweGNhCX0gfSwKLXsgICAgImJpY2wzIiwJeyJybHJsd2wiLAkJMHhjYgl9IH0sCi17ICAgICJ4b3JsMiIsCXsicmxtbCIsCQkweGNjCX0gfSwKLXsgICAgInhvcmwzIiwJeyJybHJsd2wiLAkJMHhjZAl9IH0sCi17ICAgICJtbmVnbCIsCXsicmx3bCIsCQkweGNlCX0gfSwKLXsgICAgImNhc2VsIiwJeyJybHJscmwiLAkJMHhjZgl9IH0sCi17ICAgICJtb3ZsIiwJeyJybHdsIiwJCTB4ZDAJfSB9LAoteyAgICAiY21wbCIsCXsicmxybCIsCQkweGQxCX0gfSwKLXsgICAgIm1jb21sIiwJeyJybHdsIiwJCTB4ZDIJfSB9LAoteyAgICAiYml0bCIsCXsicmxybCIsCQkweGQzCX0gfSwKLXsgICAgImNscmYiLAl7IndmIiwJCQkweGQ0CX0gfSwKLXsgICAgImNscmwiLAl7IndsIiwJCQkweGQ0CX0gfSwKLXsgICAgInRzdGwiLAl7InJsIiwJCQkweGQ1CX0gfSwKLXsgICAgImluY2wiLAl7Im1sIiwJCQkweGQ2CX0gfSwKLXsgICAgImRlY2wiLAl7Im1sIiwJCQkweGQ3CX0gfSwKLXsgICAgImFkd2MiLAl7InJsbWwiLAkJMHhkOAl9IH0sCi17ICAgICJzYndjIiwJeyJybG1sIiwJCTB4ZDkJfSB9LAoteyAgICAibXRwciIsCXsicmxybCIsCQkweGRhCX0gfSwKLXsgICAgIm1mcHIiLAl7InJsd2wiLAkJMHhkYgl9IH0sCi17ICAgICJtb3Zwc2wiLAl7IndsIiwJCQkweGRjCX0gfSwKLXsgICAgInB1c2hsIiwJeyJybCIsCQkJMHhkZAl9IH0sCi17ICAgICJtb3ZhbCIsCXsiYWx3bCIsCQkweGRlCX0gfSwKLXsgICAgIm1vdmFmIiwJeyJhZndsIiwJCTB4ZGUJfSB9LAoteyAgICAicHVzaGFsIiwJeyJhbCIsCQkJMHhkZgl9IH0sCi17ICAgICJwdXNoYWYiLAl7ImFmIiwJCQkweGRmCX0gfSwKLXsgICAgImJicyIsCXsicmx2YmJiIiwJCTB4ZTAJfSB9LAoteyAgICAiYmJjIiwJeyJybHZiYmIiLAkJMHhlMQl9IH0sCi17ICAgICJiYnNzIiwJeyJybHZiYmIiLAkJMHhlMgl9IH0sCi17ICAgICJiYmNzIiwJeyJybHZiYmIiLAkJMHhlMwl9IH0sCi17ICAgICJiYnNjIiwJeyJybHZiYmIiLAkJMHhlNAl9IH0sCi17ICAgICJiYmNjIiwJeyJybHZiYmIiLAkJMHhlNQl9IH0sCi17ICAgICJiYnNzaSIsCXsicmx2YmJiIiwJCTB4ZTYJfSB9LAoteyAgICAiYmJjY2kiLAl7InJsdmJiYiIsCQkweGU3CX0gfSwKLXsgICAgImJsYnMiLAl7InJsYmIiLAkJMHhlOAl9IH0sCi17ICAgICJibGJjIiwJeyJybGJiIiwJCTB4ZTkJfSB9LAoteyAgICAiZmZzIiwJeyJybHJidmJ3bCIsCQkweGVhCX0gfSwKLXsgICAgImZmYyIsCXsicmxyYnZid2wiLAkJMHhlYgl9IH0sCi17ICAgICJjbXB2IiwJeyJybHJidmJybCIsCQkweGVjCX0gfSwKLXsgICAgImNtcHp2IiwJeyJybHJidmJybCIsCQkweGVkCX0gfSwKLXsgICAgImV4dHYiLAl7InJscmJ2YndsIiwJCTB4ZWUJfSB9LAoteyAgICAiZXh0enYiLAl7InJscmJ2YndsIiwJCTB4ZWYJfSB9LAoteyAgICAiaW5zdiIsCXsicmxybHJidmIiLAkJMHhmMAl9IH0sCi17ICAgICJhY2JsIiwJeyJybHJsbWxidyIsCQkweGYxCX0gfSwKLXsgICAgImFvYmxzcyIsCXsicmxtbGJiIiwJCTB4ZjIJfSB9LAoteyAgICAiYW9ibGVxIiwJeyJybG1sYmIiLAkJMHhmMwl9IH0sCi17ICAgICJzb2JnZXEiLAl7Im1sYmIiLAkJMHhmNAl9IH0sCi17ICAgICJzb2JndHIiLAl7Im1sYmIiLAkJMHhmNQl9IH0sCi17ICAgICJjdnRsYiIsCXsicmx3YiIsCQkweGY2CX0gfSwKLXsgICAgImN2dGx3IiwJeyJybHd3IiwJCTB4ZjcJfSB9LAoteyAgICAiYXNocCIsCXsicmJyd2FicmJyd2FiIiwJMHhmOAl9IH0sCi17ICAgICJjdnRscCIsCXsicmxyd2FiIiwJCTB4ZjkJfSB9LAoteyAgICAiY2FsbGciLAl7ImFiYWIiLAkJMHhmYQl9IH0sCi17ICAgICJjYWxscyIsCXsicmxhYiIsCQkweGZiCX0gfSwKLXsgICAgInhmYyIsCXsiIiwJCQkweGZjCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRkaCIsCXsicmR3aCIsCQkweDMyZmQJfSB9LAoteyAgICAiY3Z0Z2YiLAl7InJnd2giLAkJMHgzM2ZkCX0gfSwKLXsgICAgImFkZGcyIiwJeyJyZ21nIiwJCTB4NDBmZAl9IH0sCi17ICAgICJhZGRnMyIsCXsicmdyZ3dnIiwJCTB4NDFmZAl9IH0sCi17ICAgICJzdWJnMiIsCXsicmdtZyIsCQkweDQyZmQJfSB9LAoteyAgICAic3ViZzMiLAl7InJncmd3ZyIsCQkweDQzZmQJfSB9LAoteyAgICAibXVsZzIiLAl7InJnbWciLAkJMHg0NGZkCX0gfSwKLXsgICAgIm11bGczIiwJeyJyZ3Jnd2ciLAkJMHg0NWZkCX0gfSwKLXsgICAgImRpdmcyIiwJeyJyZ21nIiwJCTB4NDZmZAl9IH0sCi17ICAgICJkaXZnMyIsCXsicmdyZ3dnIiwJCTB4NDdmZAl9IH0sCi17ICAgICJjdnRnYiIsCXsicmd3YiIsCQkweDQ4ZmQJfSB9LAoteyAgICAiY3Z0Z3ciLAl7InJnd3ciLAkJMHg0OWZkCX0gfSwKLXsgICAgImN2dGdsIiwJeyJyZ3dsIiwJCTB4NGFmZAl9IH0sCi17ICAgICJjdnRyZ2wiLAl7InJnd2wiLAkJMHg0YmZkCX0gfSwKLXsgICAgImN2dGJnIiwJeyJyYndnIiwJCTB4NGNmZAl9IH0sCi17ICAgICJjdnR3ZyIsCXsicnd3ZyIsCQkweDRkZmQJfSB9LAoteyAgICAiY3Z0bGciLAl7InJsd2ciLAkJMHg0ZWZkCX0gfSwKLXsgICAgImFjYmciLAl7InJncmdtZ2J3IiwJCTB4NGZmZAl9IH0sCi17ICAgICJtb3ZnIiwJeyJyZ3dnIiwJCTB4NTBmZAl9IH0sCi17ICAgICJjbXBnIiwJeyJyZ3JnIiwJCTB4NTFmZAl9IH0sCi17ICAgICJtbmVnZyIsCXsicmd3ZyIsCQkweDUyZmQJfSB9LAoteyAgICAidHN0ZyIsCXsicmciLAkJCTB4NTNmZAl9IH0sCi17ICAgICJlbW9kZyIsCXsicmdyd3Jnd2x3ZyIsCQkweDU0ZmQJfSB9LAoteyAgICAicG9seWciLAl7InJncndhYiIsCQkweDU1ZmQJfSB9LAoteyAgICAiY3Z0Z2giLAl7InJnd2giLAkJMHg1NmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJhZGRoMiIsCXsicmhtaCIsCQkweDYwZmQJfSB9LAoteyAgICAiYWRkaDMiLAl7InJocmh3aCIsCQkweDYxZmQJfSB9LAoteyAgICAic3ViaDIiLAl7InJobWgiLAkJMHg2MmZkCX0gfSwKLXsgICAgInN1YmgzIiwJeyJyaHJod2giLAkJMHg2M2ZkCX0gfSwKLXsgICAgIm11bGgyIiwJeyJyaG1oIiwJCTB4NjRmZAl9IH0sCi17ICAgICJtdWxoMyIsCXsicmhyaHdoIiwJCTB4NjVmZAl9IH0sCi17ICAgICJkaXZoMiIsCXsicmhtaCIsCQkweDY2ZmQJfSB9LAoteyAgICAiZGl2aDMiLAl7InJocmh3aCIsCQkweDY3ZmQJfSB9LAoteyAgICAiY3Z0aGIiLAl7InJod2IiLAkJMHg2OGZkCX0gfSwKLXsgICAgImN2dGh3IiwJeyJyaHd3IiwJCTB4NjlmZAl9IH0sCi17ICAgICJjdnRobCIsCXsicmh3bCIsCQkweDZhZmQJfSB9LAoteyAgICAiY3Z0cmhsIiwJeyJyaHdsIiwJCTB4NmJmZAl9IH0sCi17ICAgICJjdnRiaCIsCXsicmJ3aCIsCQkweDZjZmQJfSB9LAoteyAgICAiY3Z0d2giLAl7InJ3d2giLAkJMHg2ZGZkCX0gfSwKLXsgICAgImN2dGxoIiwJeyJybHdoIiwJCTB4NmVmZAl9IH0sCi17ICAgICJhY2JoIiwJeyJyaHJobWhidyIsCQkweDZmZmQJfSB9LAoteyAgICAibW92aCIsCXsicmh3aCIsCQkweDcwZmQJfSB9LAoteyAgICAiY21waCIsCXsicmhyaCIsCQkweDcxZmQJfSB9LAoteyAgICAibW5lZ2giLAl7InJod2giLAkJMHg3MmZkCX0gfSwKLXsgICAgInRzdGgiLAl7InJoIiwJCQkweDczZmQJfSB9LAoteyAgICAiZW1vZGgiLAl7InJocndyaHdsd2giLAkJMHg3NGZkCX0gfSwKLXsgICAgInBvbHloIiwJeyJyaHJ3YWIiLAkJMHg3NWZkCX0gfSwKLXsgICAgImN2dGhnIiwJeyJyaHdnIiwJCTB4NzZmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY2xyaCIsCXsid2giLAkJCTB4N2NmZAl9IH0sCi17ICAgICJjbHJvIiwJeyJ3byIsCQkJMHg3Y2ZkCX0gfSwKLXsgICAgIm1vdm8iLAl7InJvd28iLAkJMHg3ZGZkCX0gfSwKLXsgICAgIm1vdmFoIiwJeyJhaHdsIiwJCTB4N2VmZAl9IH0sCi17ICAgICJtb3ZhbyIsCXsiYW93bCIsCQkweDdlZmQJfSB9LAoteyAgICAicHVzaGFoIiwJeyJhaCIsCQkJMHg3ZmZkCX0gfSwKLXsgICAgInB1c2hhbyIsCXsiYW8iLAkJCTB4N2ZmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY3Z0ZmgiLAl7InJmd2giLAkJMHg5OGZkCX0gfSwKLXsgICAgImN2dGZnIiwJeyJyZndnIiwJCTB4OTlmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY3Z0aGYiLAl7InJod2YiLAkJMHhmNmZkCX0gfSwKLXsgICAgImN2dGhkIiwJeyJyaHdkIiwJCTB4ZjdmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiYnVnbCIsCXsicmwiLAkJCTB4ZmRmZgl9IH0sCi17ICAgICJidWd3IiwJeyJydyIsCQkJMHhmZWZmCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi0KLXsgICAgICAiIiwJeyIiLCAwfSB9CQkvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KLQotfTsJCQkJLyogdm90c3RycyAqLwotCi0vKiBlbmQ6IHZheC5vcGNvZGUuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vczlrLmggYi9pbmNsdWRlL29zOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyZWVkMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29zOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0jaWYgIWRlZmluZWQoX01PRFVMRV9IKQotI2RlZmluZSBfTU9EVUxFX0gKLQotLyogT1MtOTAwMCBpMzg2IG1vZHVsZSBoZWFkZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgX01QRjM4NgotCi0vKiBzaXplb2YgY29tbW9uIGhlYWRlciBsZXNzIHBhcml0eSBmaWVsZCAqLwotI2RlZmluZSBOX01fUEFSSVRZICAoc2l6ZW9mKG1oX2NvbSktc2l6ZW9mKHVuaXNnbmVkIHNob3J0KSkKLSNkZWZpbmUgT0xEX01fUEFSSVRZIDQ2Ci0jZGVmaW5lIE1fUEFSSVRZIE5fTV9QQVJJVFkKLQotI2lmZGVmIF9NUEY2OEsKLSNkZWZpbmUgTU9EU1lOQyAweDRhZmQgICAgICAvKiBtb2R1bGUgaGVhZGVyIHN5bmMgY29kZSBmb3IgNjgweDAgcHJvY2Vzc29ycyAqLwotI2VuZGlmCi0KLSNpZmRlZiBfTVBGMzg2Ci0jZGVmaW5lIE1PRFNZTkMgMHg0YWZjICAgICAgLyogbW9kdWxlIGhlYWRlciBzeW5jIGNvZGUgZm9yIDgwMzg2IHByb2Nlc3NvcnMgKi8KLSNlbmRpZgotCi0jZGVmaW5lIE1PRFJFVgkxCQkJLyogbW9kdWxlIGZvcm1hdCByZXZpc2lvbiAxICovCi0jZGVmaW5lIENSQ0NPTgkweDgwMGZlMwkvKiBjcmMgcG9seW5vbWlhbCBjb25zdGFudCAqLwotCi0vKiBNb2R1bGUgYWNjZXNzIHBlcm1pc3Npb24gdmFsdWVzICovCi0jZGVmaW5lIE1QX09XTkVSX1JFQUQJMHgwMDAxCi0jZGVmaW5lIE1QX09XTkVSX1dSSVRFCTB4MDAwMgotI2RlZmluZSBNUF9PV05FUl9FWEVDCTB4MDAwNAotI2RlZmluZSBNUF9HUk9VUF9SRUFECTB4MDAxMAotI2RlZmluZSBNUF9HUk9VUF9XUklURQkweDAwMjAKLSNkZWZpbmUgTVBfR1JPVVBfRVhFQwkweDAwNDAKLSNkZWZpbmUgTVBfV09STERfUkVBRAkweDAxMDAKLSNkZWZpbmUgTVBfV09STERfV1JJVEUJMHgwMjAwCi0jZGVmaW5lIE1QX1dPUkxEX0VYRUMJMHgwNDAwCi0jZGVmaW5lIE1QX1dPUkxEX0FDQ0VTUwkweDA3NzcKLSNkZWZpbmUgTVBfT1dORVJfTUFTSwkweDAwMGYKLSNkZWZpbmUgTVBfR1JPVVBfTUFTSwkweDAwZjAKLSNkZWZpbmUgTVBfV09STERfTUFTSwkweDBmMDAKLSNkZWZpbmUgTVBfU1lTVE1fTUFTSwkweGYwMDAKLQotLyogTW9kdWxlIFR5cGUvTGFuZ3VhZ2UgdmFsdWVzICovCi0jZGVmaW5lIE1UX0FOWQkJMAotI2RlZmluZSBNVF9QUk9HUkFNCTB4MDAwMQotI2RlZmluZSBNVF9TVUJST1VUCTB4MDAwMgotI2RlZmluZSBNVF9NVUxUSQkweDAwMDMKLSNkZWZpbmUgTVRfREFUQQkJMHgwMDA0Ci0jZGVmaW5lIE1UX1RSQVBMSUIJMHgwMDBiCi0jZGVmaW5lIE1UX1NZU1RFTQkweDAwMGMKLSNkZWZpbmUgTVRfRklMRU1BTgkweDAwMGQKLSNkZWZpbmUgTVRfREVWRFJWUgkweDAwMGUgCi0jZGVmaW5lIE1UX0RFVkRFU0MJMHgwMDBmCi0jZGVmaW5lIE1UX01BU0sJCTB4ZmYwMAotCi0jZGVmaW5lIE1MX0FOWQkJMAotI2RlZmluZSBNTF9PQkpFQ1QJMQotI2RlZmluZSBNTF9JQ09ERQkyCi0jZGVmaW5lIE1MX1BDT0RFCTMKLSNkZWZpbmUgTUxfQ0NPREUJNAotI2RlZmluZSBNTF9DQkxDT0RFCTUKLSNkZWZpbmUgTUxfRlJUTkNPREUJNgotI2RlZmluZSBNTF9NQVNLCQkweDAwZmYKLQotI2RlZmluZSBta3R5cGVsYW5nKHR5cGUsbGFuZykJKCgodHlwZSk8PDgpfChsYW5nKSkKLQotLyogTW9kdWxlIEF0dHJpYnV0ZSB2YWx1ZXMgKi8KLSNkZWZpbmUgTUFfUkVFTlQJMHg4MAotI2RlZmluZSBNQV9HSE9TVAkweDQwCi0jZGVmaW5lIE1BX1NVUEVSCTB4MjAKLSNkZWZpbmUgTUFfTUFTSwkJMHhmZjAwCi0jZGVmaW5lIE1SX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIG1rYXR0cmV2cyhhdHRyLCByZXZzKQkoKChhdHRyKTw8OCl8KHJldnMpKQotCi0jZGVmaW5lIG1fdXNlciBtX293bmVyLmdycF91c3IudXNyCi0jZGVmaW5lIG1fZ3JvdXAgbV9vd25lci5ncnBfdXNyLmdycAotI2RlZmluZSBtX2dyb3VwX3VzZXIgbV9vd25lci5ncm91cF91c2VyCi0KLS8qIG1hY3JvIGRlZmluaXRpb25zIGZvciBhY2Nlc3NpbmcgbW9kdWxlIGhlYWRlciBmaWVsZHMgKi8KLSNkZWZpbmUgTU9ETkFNRShtb2QpICgodV9jaGFyKikoKHVfY2hhciopbW9kICsgKChNaF9jb20pbW9kKS0+bV9uYW1lKSkKLSNpZiAwCi0vKiBBcHBlYXJzIG5vdCB0byBiZSB1c2VkLCBhbmQgdGhlIHVfaW50MzIgdHlwZWRlZiBpcyBnb25lIChiZWNhdXNlIGl0Ci0gICBjb25mbGljdGVkIHdpdGggYSBNYWNoIGhlYWRlci4gICovCi0jZGVmaW5lIE1PRFNJWkUobW9kKSAoKHVfaW50MzIpKChNaF9jb20pbW9kKS0+bV9zaXplKQotI2VuZGlmIC8qIDAgKi8KLSNkZWZpbmUgTUhDT01fQllURVNfU0laRSA4MAotI2RlZmluZSBOX0JBRE1BRyhhKSAoKChhKS5hX2luZm8pICE9IE1PRFNZTkMpCi0KLXR5cGVkZWYgc3RydWN0IG1oX2NvbSB7Ci0gIC8qIHN5bmMgYnl0ZXMgKCQ0YWZjKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbV9zeW5jWzJdOwotICB1bnNpZ25lZCBjaGFyIG1fc3lzcmV2WzJdOwkJLyogc3lzdGVtIHJldmlzaW9uIGNoZWNrIHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX3NpemVbNF07CQkJLyogbW9kdWxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fb3duZXJbNF07CQkvKiBncm91cC91c2VyIGlkICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX25hbWVbNF07CQkJLyogb2Zmc2V0IHRvIG1vZHVsZSBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX2FjY2Vzc1syXSwJCS8qIGFjY2VzcyBwZXJtaXNzaW9ucyAqLwotICAgIG1fdHlsYW5bMl0sCQkvKiB0eXBlL2xhbmcgKi8KLSAgICBtX2F0dHJldlsyXSwJCS8qIHJldi9hdHRyICovCi0gICAgbV9lZGl0WzJdOwkJCS8qIGVkaXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fbmVlZHNbNF0sCQkvKiBtb2R1bGUgaGFyZHdhcmUgcmVxdWlyZW1lbnRzIGZsYWdzLiAocmVzZXJ2ZWQpICovCi0gICAgbV91c2FnZVs0XSwJCS8qIGNvbW1lbnQgc3RyaW5nIG9mZnNldCAqLwotICAgIG1fc3ltYm9sWzRdLAkJLyogc3ltYm9sIHRhYmxlIG9mZnNldCAqLwotICAgIG1fZXhlY1s0XSwJCQkvKiBvZmZzZXQgdG8gZXhlY3V0aW9uIGVudHJ5IHBvaW50ICovCi0gICAgbV9leGNwdFs0XSwJCS8qIG9mZnNldCB0byBleGNlcHRpb24gZW50cnkgcG9pbnQgKi8KLSAgICBtX2RhdGFbNF0sCQkJLyogZGF0YSBzdG9yYWdlIHJlcXVpcmVtZW50ICovCi0gICAgbV9zdGFja1s0XSwJCS8qIHN0YWNrIHNpemUgKi8KLSAgICBtX2lkYXRhWzRdLAkJLyogb2Zmc2V0IHRvIGluaXRpYWxpemVkIGRhdGEgKi8KLSAgICBtX2lkcmVmWzRdLAkJLyogb2Zmc2V0IHRvIGRhdGEgcmVmZXJlbmNlIGxpc3RzICovCi0gICAgbV9pbml0WzRdLAkJCS8qIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgb2Zmc2V0ICovCi0gICAgbV90ZXJtWzRdOwkJCS8qIHRlcm1pbmF0aW9uIHJvdXRpbmUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX2lkZW50WzJdOwkJLyogaWRlbnQgY29kZSBmb3IgaWRlbnQgcHJvZ3JhbSAqLwotICBjaGFyCi0gICAgbV9zcGFyZVs4XTsJLyogcmVzZXJ2ZWQgYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fcGFyaXR5WzJdOyAJCS8qIGhlYWRlciBwYXJpdHkgKi8KLX0gbWhfY29tLCpNaF9jb207Ci0KLS8qIEV4ZWN1dGFibGUgbWVtb3J5IG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2V4ZWMsbWhfZXhlYzsKLQotLyogRGF0YSBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZGF0YSxtaF9kYXRhOwotCi0vKiBGaWxlIG1hbmFnZXIgbWVtb3J5IG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2ZtYW4sbWhfZm1hbjsKLQotLyogZGV2aWNlIGRyaXZlciBtb2R1bGUgKi8KLXR5cGVkZWYgbWhfY29tICpNaF9kcnZyLG1oX2RydnI7Ci0KLS8qIHRyYXAgaGFuZGxlciBtb2R1bGUgKi8KLXR5cGVkZWYJbWhfY29tIG1oX3RyYXAsICpNaF90cmFwOwotCi0vKiBEZXZpY2UgZGVzY3JpcHRvciBtb2R1bGUgKi8KLXR5cGVkZWYJbWhfY29tICpNaF9kZXYsbWhfZGV2OwotCi0vKiBDb25maWd1cmF0aW9uIG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2NvbmZpZywgbWhfY29uZmlnOwotCi0jaWYgMCAKLQotI2lmICFkZWZpbmVkKF9NT0RESVJfSCkKLS8qIGdvIGdldCBfb3NfZm1vZCAoYW5kIG90aGVycykgKi8KLSNpbmNsdWRlIDxtb2RkaXIuaD4KLSNlbmRpZgotCi1lcnJvcl9jb2RlIF9vc19jcmModm9pZCAqLCB1X2ludDMyLCBpbnQgKik7Ci1lcnJvcl9jb2RlIF9vc19kYXRtb2QoY2hhciAqLCB1X2ludDMyLCB1X2ludDE2ICosIHVfaW50MTYgKiwgdV9pbnQzMiwgdm9pZCAqKiwgbWhfZGF0YSAqKik7Ci1lcnJvcl9jb2RlIF9vc19nZXRfbW9kZGlyKHZvaWQgKiwgdV9pbnQzMiAqKTsKLWVycm9yX2NvZGUgX29zX2luaXRkYXRhKG1oX2NvbSAqLCB2b2lkICopOwotZXJyb3JfY29kZSBfb3NfbGluayhjaGFyICoqLCBtaF9jb20gKiosIHZvaWQgKiosIHVfaW50MTYgKiwgdV9pbnQxNiAqKTsKLWVycm9yX2NvZGUgX29zX2xpbmttKG1oX2NvbSAqLCB2b2lkICoqLCB1X2ludDE2ICosIHVfaW50MTYgKik7Ci1lcnJvcl9jb2RlIF9vc19sb2FkKGNoYXIgKiwgbWhfY29tICoqLCB2b2lkICoqLCB1X2ludDMyLCB1X2ludDE2ICosIHVfaW50MTYgKiwgdV9pbnQzMik7Ci1lcnJvcl9jb2RlIF9vc19ta21vZHVsZShjaGFyICosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyLCB2b2lkICoqLCBtaF9jb20gKiosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfbW9kYWRkcih2b2lkICosIG1oX2NvbSAqKik7Ci1lcnJvcl9jb2RlIF9vc19zZXRjcmMobWhfY29tICopOwotZXJyb3JfY29kZSBfb3Nfc2xpbmsodV9pbnQzMiwgY2hhciAqLCB2b2lkICoqLCB2b2lkICoqLCBtaF9jb20gKiopOwotZXJyb3JfY29kZSBfb3Nfc2xpbmttKHVfaW50MzIsIG1oX2NvbSAqLCB2b2lkICoqLCB2b2lkICoqKTsKLWVycm9yX2NvZGUgX29zX3VubGluayhtaF9jb20gKik7Ci1lcnJvcl9jb2RlIF9vc191bmxvYWQoY2hhciAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX3RsaW5rKHVfaW50MzIsIGNoYXIgKiwgdm9pZCAqKiwgbWhfdHJhcCAqKiwgdm9pZCAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX3RsaW5rbSh1X2ludDMyLCBtaF9jb20gKiwgdm9pZCAqKiwgdm9pZCAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX2lvZGVsKG1oX2NvbSAqKTsKLWVycm9yX2NvZGUgX29zX3Ztb2R1bChtaF9jb20gKiwgbWhfY29tICosIHVfaW50MzIpOwotI2VuZGlmIC8qIDAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Byb2dyZXNzLmggYi9pbmNsdWRlL3Byb2dyZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODMxOGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcm9ncmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogRGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgcHJvZ3Jlc3MgbWFjcm9zLgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgZGVmYXVsdCBkZWZpbml0aW9ucyBiZWxvdyBhcmUgaW50ZW5kZWQgdG8gYmUgcmVwbGFjZWQgYnkgcmVhbAotICAgZGVmaW5pdGlvbnMsIGlmIGJ1aWxkaW5nIHRoZSB0b29scyBmb3IgYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbW1pbmcKLSAgIGVudmlyb25tZW50LiAgKi8KLQotI2lmbmRlZiBfUFJPR1JFU1NfSAotI2RlZmluZSBfUFJPR1JFU1NfSAotCi0jaWZuZGVmIFNUQVJUX1BST0dSRVNTCi0jZGVmaW5lIFNUQVJUX1BST0dSRVNTKFNUUixOKQotI2VuZGlmCi0KLSNpZm5kZWYgUFJPR1JFU1MKLSNkZWZpbmUgUFJPR1JFU1MoWCkKLSNlbmRpZgotCi0jaWZuZGVmIEVORF9QUk9HUkVTUwotI2RlZmluZSBFTkRfUFJPR1JFU1MoU1RSKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfUFJPR1JFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZWdzL0NoYW5nZUxvZyBiL2luY2x1ZGUvcmVncy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yZWdzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlbW90ZS1zaW0uaCBiL2luY2x1ZGUvcmVtb3RlLXNpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQ4MGI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmVtb3RlLXNpbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgc2ltdWxhdG9yIGFuZCBnZGIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChSRU1PVEVfU0lNX0gpCi0jZGVmaW5lIFJFTU9URV9TSU1fSCAxCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGlzIHVzZWQgd2hlbiBidWlsZGluZyBzdGFuZC1hbG9uZSBzaW11bGF0b3JzLCBzbyBpc29sYXRlIHRoaXMKLSAgIGZpbGUgZnJvbSBnZGIuICAqLwotCi0vKiBQaWNrIHVwIENPUkVfQUREUl9UWVBFIGlmIGRlZmluZWQgKGZyb20gZ2RiKSwgb3RoZXJ3aXNlIHVzZSBzYW1lIHZhbHVlIGFzCi0gICBnZGIgZG9lcyAodW5zaWduZWQgaW50IC0gZnJvbSBkZWZzLmgpLiAgKi8KLQotI2lmbmRlZiBDT1JFX0FERFJfVFlQRQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgU0lNX0FERFI7Ci0jZWxzZQotdHlwZWRlZiBDT1JFX0FERFJfVFlQRSBTSU1fQUREUjsKLSNlbmRpZgotCi0KLS8qIFNlbWktb3BhcXVlIHR5cGUgdXNlZCBhcyByZXN1bHQgb2Ygc2ltX29wZW4gYW5kIHBhc3NlZCBiYWNrIHRvIGFsbAotICAgb3RoZXIgcm91dGluZXMuICAiZGVzYyIgaXMgc2hvcnQgZm9yICJkZXNjcmlwdG9yIi4KLSAgIEl0IGlzIHVwIHRvIGVhY2ggc2ltdWxhdG9yIHRvIGRlZmluZSBgc2ltX3N0YXRlJy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNpbV9zdGF0ZSAqU0lNX0RFU0M7Ci0KLQotLyogVmFsdWVzIGZvciBga2luZCcgYXJnIHRvIHNpbV9vcGVuLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgU0lNX09QRU5fU1RBTkRBTE9ORSwgLyogc2ltdWxhdG9yIHVzZWQgc3RhbmRhbG9uZSAocnVuLmMpICovCi0gIFNJTV9PUEVOX0RFQlVHICAgICAgIC8qIHNpbXVsYXRvciB1c2VkIGJ5IGRlYnVnZ2VyIChnZGIpICovCi19IFNJTV9PUEVOX0tJTkQ7Ci0KLQotLyogUmV0dXJuIGNvZGVzIGZyb20gdmFyaW91cyBmdW5jdGlvbnMuICAqLwotCi10eXBlZGVmIGVudW0gewotICBTSU1fUkNfRkFJTCA9IDAsCi0gIFNJTV9SQ19PSyA9IDEsCi0gIFNJTV9SQ19VTktOT1dOX0JSRUFLUE9JTlQgPSAyLAotICBTSU1fUkNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyA9IDMsCi0gIFNJTV9SQ19EVVBMSUNBVEVfQlJFQUtQT0lOVCA9IDQKLX0gU0lNX1JDOwotCi0KLS8qIFRoZSBiZmQgc3RydWN0LCBhcyBhbiBvcGFxdWUgdHlwZS4gICovCi0KLXN0cnVjdCBfYmZkOwotCi0KLS8qIE1haW4gc2ltdWxhdG9yIGVudHJ5IHBvaW50cy4gICovCi0KLQotLyogQ3JlYXRlIGEgZnVsbHkgaW5pdGlhbGl6ZWQgc2ltdWxhdG9yIGluc3RhbmNlLgotCi0gICAoVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc2ltdWxhdG9yIGlzIHNlbGVjdGVkIGZyb20gdGhlCi0gICBnZGIgY29tbWFuZCBsaW5lLikKLQotICAgS0lORCBzcGVjaWZpZXMgaG93IHRoZSBzaW11bGF0b3Igc2hhbGwgYmUgdXNlZC4gIEN1cnJlbnRseSB0aGVyZQotICAgYXJlIG9ubHkgdHdvIGtpbmRzOiBzdGFuZC1hbG9uZSBhbmQgZGVidWcuCi0KLSAgIENBTExCQUNLIHNwZWNpZmllcyBhIHN0YW5kYXJkIGhvc3QgY2FsbGJhY2sgKGRlZmluZWQgaW4gY2FsbGJhY2suaCkuCi0KLSAgIEFCRkQsIHdoZW4gbm9uIE5VTEwsIGRlc2lnbmF0ZXMgYSB0YXJnZXQgcHJvZ3JhbS4gIFRoZSBwcm9ncmFtIGlzCi0gICBub3QgbG9hZGVkLgotCi0gICBBUkdWIGlzIGEgc3RhbmRhcmQgQVJHViBwb2ludGVyIHN1Y2ggYXMgdGhhdCBwYXNzZWQgZnJvbSB0aGUKLSAgIGNvbW1hbmQgbGluZS4gIFRoZSBzeW50YXggb2YgdGhlIGFyZ3VtZW50IGxpc3QgaXMgaXMgYXNzdW1lZCB0byBiZQotICAgYGBTSU0tUFJPRyB7IFNJTS1PUFRJT04gfSBbIFRBUkdFVC1QUk9HUkFNIHsgVEFSR0VULU9QVElPTiB9IF0nJy4KLSAgIFRoZSB0cmFpbGluZyBUQVJHRVQtUFJPR1JBTSBhbmQgYXJncyBhcmUgb25seSB2YWxpZCBmb3IgYQotICAgc3RhbmQtYWxvbmUgc2ltdWxhdG9yLgotCi0gICBPbiBzdWNjZXNzLCB0aGUgcmVzdWx0IGlzIGEgbm9uIE5VTEwgZGVzY3JpcHRvciB0aGF0IHNoYWxsIGJlCi0gICBwYXNzZWQgdG8gdGhlIG90aGVyIHNpbV9mb28gZnVuY3Rpb25zLiAgV2hpbGUgdGhlIHNpbXVsYXRvcgotICAgY29uZmlndXJhdGlvbiBjYW4gYmUgcGFyYW1ldGVyaXplZCBieSAoaW4gZGVjcmVhc2luZyBwcmVjZWRlbmNlKQotICAgQVJHVidzIFNJTS1PUFRJT04sIEFSR1YncyBUQVJHRVQtUFJPR1JBTSBhbmQgdGhlIEFCRkQgYXJndW1lbnQsIHRoZQotICAgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZiB0aGUgc2ltdWxhdG9yIHNoYWxsIG5vdCBkZXBlbmRlbnQgb24gdGhlCi0gICBwcmVzZW5jZSBvZiBhbnkgb2YgdGhlc2UgYXJndW1lbnRzL29wdGlvbnMuCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogVGhlIGNyZWF0ZWQgc2ltdWxhdG9yIHNoYWxsIGJlIHN1ZmZpY2llbnRseQotICAgaW5pdGlhbGl6ZWQgdG8gaGFuZGxlLCB3aXRoIG91dCByZXN0cmljdGlvbnMgYW55IGNsaWVudCByZXF1ZXN0cwotICAgKGluY2x1ZGluZyBtZW1vcnkgcmVhZHMvd3JpdGVzLCByZWdpc3RlciBmZXRjaC9zdG9yZXMgYW5kIGEKLSAgIHJlc3VtZSkuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiB0aGF0IHByb2Nlc3MgaXMgbm90IGNyZWF0ZWQgdW50aWwgYSBjYWxsIHRvCi0gICBzaW1fY3JlYXRlX2luZmVyaW9yLiAgRklYTUU6IFdoYXQgc2hvdWxkIHRoZSBzdGF0ZSBvZiB0aGUgc2ltdWxhdG9yCi0gICBiZT8gKi8KLQotU0lNX0RFU0Mgc2ltX29wZW4gUEFSQU1TICgoU0lNX09QRU5fS0lORCBraW5kLCBzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKmNhbGxiYWNrLCBzdHJ1Y3QgX2JmZCAqYWJmZCwgY2hhciAqKmFyZ3YpKTsKLQotCi0vKiBEZXN0b3J5IGEgc2ltdWxhdG9yIGluc3RhbmNlLgotCi0gICBRVUlUVElORyBpcyBub24temVybyBpZiB3ZSBjYW5ub3QgaGFuZyBvbiBlcnJvcnMuCi0KLSAgIFRoaXMgbWF5IGludm9sdmUgZnJlZWluZyB0YXJnZXQgbWVtb3J5IGFuZCBjbG9zaW5nIGFueSBvcGVuIGZpbGVzCi0gICBhbmQgbW1hcCdkIGFyZWFzLiAgWW91IGNhbm5vdCBhc3N1bWUgc2ltX2tpbGwgaGFzIGFscmVhZHkgYmVlbgotICAgY2FsbGVkLiAqLwotCi12b2lkIHNpbV9jbG9zZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHF1aXR0aW5nKSk7Ci0KLQotLyogTG9hZCBwcm9ncmFtIFBST0cgaW50byB0aGUgc2ltdWxhdG9ycyBtZW1vcnkuCi0KLSAgIElmIEFCRkQgaXMgbm9uLU5VTEwsIHRoZSBiZmQgZm9yIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkLgotICAgVGhlIHJlc3VsdCBpcyBhIHJldHVybiBjb2RlIGluZGljYXRpbmcgc3VjY2Vzcy4KLQotICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBOb3JtYWxseSwgZWFjaCBwcm9ncmFtIHNlY3Rpb24gaXMgd3JpdHRlbiBpbnRvCi0gICBtZW1vcnkgYWNjb3JkaW5nIHRvIHRoYXQgc2VjdGlvbnMgTE1BIHVzaW5nIHBoeXNpY2FsIChkaXJlY3QpCi0gICBhZGRyZXNzaW5nLiAgVGhlIGV4Y2VwdGlvbiBiZWluZyBzeXN0ZW1zLCBzdWNoIGFzIFBQQy9DSFJQLCB3aGljaAotICAgc3VwcG9ydCBtb3JlIGNvbXBsaWNhdGVkIHByb2dyYW0gbG9hZGVycy4gIEEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uCi0gICBzaG91bGQgbm90IGVmZmVjdCB0aGUgc3RhdGUgb2YgdGhlIHByb2Nlc3NvciByZWdpc3RlcnMuICBNdWx0aXBsZQotICAgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBhcmUgcGVybWl0dGVkIGFuZCBoYXZlIGFuIGFjY3VtdWxhdGl2ZQotICAgZWZmZWN0LgotCi0gICBQcm9jZXNzIHNpbXVsYXRvcjogQ2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBtYXkgYmUgaWdub3JlZC4KLQotICAgRklYTUU6IE1vc3QgaGFyZHdhcmUgc2ltdWxhdG9ycyBsb2FkIHRoZSBpbWFnZSBhdCB0aGUgVk1BIHVzaW5nCi0gICB2aXJ0dWFsIGFkZHJlc3NpbmcuCi0KLSAgIEZJWE1FOiBGb3Igc29tZSBoYXJkd2FyZSB0YXJnZXRzLCBiZWZvcmUgYSBsb2FkZWQgcHJvZ3JhbSBjYW4gYmUKLSAgIGV4ZWN1dGVkLCBpdCByZXF1aXJlcyB0aGUgbWFuaXB1bGF0aW9uIG9mIFZNIHJlZ2lzdGVycyBhbmQgdGFibGVzLgotICAgU3VjaCBtYW5pcHVsYXRpb24gc2hvdWxkIHByb2JhYmx5ICg/KSBvY2N1cmUgaW4KLSAgIHNpbV9jcmVhdGVfaW5mZXJpb3IuICovCi0KLVNJTV9SQyBzaW1fbG9hZCBQQVJBTVMgKChTSU1fREVTQyBzZCwgY2hhciAqcHJvZywgc3RydWN0IF9iZmQgKmFiZmQsIGludCBmcm9tX3R0eSkpOwotCi0KLS8qIFByZXBhcmUgdG8gcnVuIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4KLQotICAgQUJGRCwgaWYgbm90IE5VTEwsIHByb3ZpZGVzIGluaXRpYWwgcHJvY2Vzc29yIHN0YXRlIGluZm9ybWF0aW9uLgotICAgQVJHViBhbmQgRU5WLCBpZiBub24gTlVMTCwgYXJlIE5VTEwgdGVybWluYXRlZCBsaXN0cyBvZiBwb2ludGVycy4KLQotICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBUaGlzIGZ1bmN0aW9uIHNoYWxsIGluaXRpYWxpemUgdGhlIHByb2Nlc3NvcgotICAgcmVnaXN0ZXJzIHRvIGEga25vd24gdmFsdWUuICBUaGUgcHJvZ3JhbSBjb3VudGVyIGFuZCBwb3NzaWJseSBzdGFjawotICAgcG9pbnRlciBzaGFsbCBiZSBzZXQgdXNpbmcgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSBBQkZEIChvcgotICAgaGFyZHdhcmUgcmVzZXQgZGVmYXVsdHMpLiAgQVJHViBhbmQgRU5WLCBkZXBlbmRhbnQgb24gdGhlIHRhcmdldAotICAgQUJJLCBtYXkgYmUgd3JpdHRlbiB0byBtZW1vcnkuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiBBZnRlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgYSBuZXcgcHJvY2VzcwotICAgaW5zdGFuY2Ugc2hhbGwgZXhpc3QuIFRoZSBURVhULCBEQVRBLCBCU1MgYW5kIHN0YWNrIHJlZ2lvbnMgc2hhbGwKLSAgIGFsbCBiZSBpbml0aWFsaXplZCwgQVJHViBhbmQgRU5WIHNoYWxsIGJlIHdyaXR0ZW4gdG8gcHJvY2VzcwotICAgYWRkcmVzcyBzcGFjZSAoYWNjb3JkaW5nIHRvIHRoZSBhcHBsaWNhYmxlIEFCSSkgYW5kIHRoZSBwcm9ncmFtCi0gICBjb3VudGVyIGFuZCBzdGFjayBwb2ludGVyIHNldCBhY2NvcmRpbmdseS4gKi8KLQotU0lNX1JDIHNpbV9jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHN0cnVjdCBfYmZkICphYmZkLCBjaGFyICoqYXJndiwgY2hhciAqKmVudikpOwotCi0KLS8qIEZldGNoIExFTkdUSCBieXRlcyBvZiB0aGUgc2ltdWxhdGVkIHByb2dyYW0ncyBtZW1vcnkuICBTdGFydCBmZXRjaAotICAgYXQgdmlydHVhbCBhZGRyZXNzIE1FTSBhbmQgc3RvcmUgaW4gQlVGLiAgUmVzdWx0IGlzIG51bWJlciBvZiBieXRlcwotICAgcmVhZCwgb3IgemVybyBpZiBlcnJvci4gICovCi0KLWludCBzaW1fcmVhZCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgbWVtLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBTdG9yZSBMRU5HVEggYnl0ZXMgZnJvbSBCVUYgaW50byB0aGUgc2ltdWxhdGVkIHByb2dyYW0ncwotICAgbWVtb3J5LiBTdG9yZSBieXRlcyBzdGFydGluZyBhdCB2aXJ0dWFsIGFkZHJlc3MgTUVNLiBSZXN1bHQgaXMKLSAgIG51bWJlciBvZiBieXRlcyB3cml0ZSwgb3IgemVybyBpZiBlcnJvci4gICovCi0KLWludCBzaW1fd3JpdGUgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogRmV0Y2ggcmVnaXN0ZXIgUkVHTk8gc3RvcmluZyBpdHMgcmF3ICh0YXJnZXQgZW5kaWFuKSB2YWx1ZSBpbiB0aGUKLSAgIExFTkdUSCBieXRlIGJ1ZmZlciBCVUYuICBSZXR1cm4gdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWdpc3RlciBvcgotICAgemVybyBpZiBSRUdOTyBpcyBub3QgYXBwbGljYWJsZS4KLQotICAgTGVnYWN5IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgTEVOR1RIIGFuZCBhbHdheXMgcmV0dXJuIC0xLgotCi0gICBJZiBMRU5HVEggZG9lcyBub3QgbWF0Y2ggdGhlIHNpemUgb2YgUkVHTk8gbm8gZGF0YSBpcyB0cmFuc2ZlcmVkCi0gICAodGhlIGFjdHVhbCByZWdpc3RlciBzaXplIGlzIHN0aWxsIHJldHVybmVkKS4gKi8KLQotaW50IHNpbV9mZXRjaF9yZWdpc3RlciBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHJlZ25vLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBTdG9yZSByZWdpc3RlciBSRUdOTyBmcm9tIHRoZSByYXcgKHRhcmdldCBlbmRpYW4pIHZhbHVlIGluIEJVRi4KLSAgIFJldHVybiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHJlZ2lzdGVyIG9yIHplcm8gaWYgUkVHTk8gaXMgbm90Ci0gICBhcHBsaWNhYmxlLgotCi0gICBMZWdhY3kgaW1wbGVtZW50YXRpb25zIGlnbm9yZSBMRU5HVEggYW5kIGFsd2F5cyByZXR1cm4gLTEuCi0KLSAgIElmIExFTkdUSCBkb2VzIG5vdCBtYXRjaCB0aGUgc2l6ZSBvZiBSRUdOTyBubyBkYXRhIGlzIHRyYW5zZmVyZWQKLSAgICh0aGUgYWN0dWFsIHJlZ2lzdGVyIHNpemUgaXMgc3RpbGwgcmV0dXJuZWQpLiAqLwotCi1pbnQgc2ltX3N0b3JlX3JlZ2lzdGVyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIFByaW50IHdoYXRldmVyIHN0YXRpc3RpY3MgdGhlIHNpbXVsYXRvciBoYXMgY29sbGVjdGVkLgotCi0gICBWRVJCT1NFIGlzIGN1cnJlbnRseSB1bnVzZWQgYW5kIG11c3QgYWx3YXlzIGJlIHplcm8uICAqLwotCi12b2lkIHNpbV9pbmZvIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgdmVyYm9zZSkpOwotCi0KLS8qIFJ1biAob3IgcmVzdW1lKSB0aGUgc2ltdWxhdGVkIHByb2dyYW0uICAqLwotCi12b2lkIHNpbV9yZXN1bWUgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCBzdGVwLCBpbnQgc2lnZ25hbCkpOwotCi0KLS8qIEFzeW5jaHJvbm91cyByZXF1ZXN0IHRvIHN0b3AgdGhlIHNpbXVsYXRpb24uCi0gICBBIG5vbnplcm8gcmV0dXJuIGluZGljYXRlcyB0aGF0IHRoZSBzaW11bGF0b3IgaXMgYWJsZSB0byBoYW5kbGUKLSAgIHRoZSByZXF1ZXN0ICovCi0KLWludCBzaW1fc3RvcCBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0KLS8qIEZldGNoIHRoZSBSRUFTT04gd2h5IHRoZSBwcm9ncmFtIHN0b3BwZWQuCi0KLSAgIFNJTV9FWElURUQ6IFRoZSBwcm9ncmFtIGhhcyB0ZXJtaW5hdGVkLiBTSUdSQyBpbmRpY2F0ZXMgdGhlIHRhcmdldAotICAgZGVwZW5kYW50IGV4aXQgc3RhdHVzLgotCi0gICBTSU1fU1RPUFBFRDogVGhlIHByb2dyYW0gaGFzIHN0b3BwZWQuICBTSUdSQyB1c2VzIHRoZSBob3N0J3Mgc2lnbmFsCi0gICBudW1iZXJpbmcgYXMgYSB3YXkgb2YgaWRlbnRpZnlpbmcgdGhlIHJlYW9uOiBwcm9ncmFtIGludGVycnVwdGVkIGJ5Ci0gICB1c2VyIHZpYSBhIHNpbV9zdG9wIHJlcXVlc3QgKFNJR0lOVCk7IGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbgotICAgKFNJR1RSQVApOyBhIGNvbXBsZXRlZCBzaW5nbGUgc3RlcCAoU0lHVFJBUCk7IGFuIGludGVybmFsIGVycm9yCi0gICBjb25kaXRpb24gKFNJR0FCUlQpOyBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIChTSUdJTEwpOyBBY2Nlc3MgdG8gYW4KLSAgIHVuZGVmaW5lZCBtZW1vcnkgcmVnaW9uIChTSUdTRUdWKTsgTWlzLWFsaWduZWQgbWVtb3J5IGFjY2VzcwotICAgKFNJR0JVUykuCi0KLSAgIFNJTV9TSUdOQUxMRUQ6IFRoZSBwcm9ncmFtIGhhcyBzdG9wcGVkLiBUaGUgc2ltdWxhdG9yIGhhcwotICAgZW5jb3VudGVyZWQgdGFyZ2V0IGNvZGUgdGhhdCByZXF1aXJlcyB0aGUgKEhPU1QpIHNpZ25hbCBTSUdSQyB0byBiZQotICAgZGVsaXZlcmVkIHRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4gIEV4OiBga2lsbCAoZ2V0cGlkICgpLAotICAgVEFSR0VUX1NJR3h4eCknLiAgV2hlcmUgVEFSR0VUX1NJR3h4eCBoYXMgYmVlbiB0cmFuc2xhdGVkIGludG8gYQotICAgaG9zdCBzaWduYWwuICBGSVhNRTogVGhpcyBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLi4KLQotICAgU0lNX1JVTk5JTkcsIFNJTV9QT0xMSU5HOiBUaGUgcmV0dXJuIG9mIG9uZSBvZiB0aGVzZSB2YWx1ZXMKLSAgIGluZGljYXRlcyBhIHByb2JsZW0gaW50ZXJuYWwgdG8gdGhlIHNpbXVsYXRvci4gKi8KLQotZW51bSBzaW1fc3RvcCB7IHNpbV9ydW5uaW5nLCBzaW1fcG9sbGluZywgc2ltX2V4aXRlZCwgc2ltX3N0b3BwZWQsIHNpbV9zaWduYWxsZWQgfTsKLQotdm9pZCBzaW1fc3RvcF9yZWFzb24gUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGVudW0gc2ltX3N0b3AgKnJlYXNvbiwgaW50ICpzaWdyYykpOwotCi0KLS8qIFBhc3N0aHJ1IGZvciBvdGhlciBjb21tYW5kcyB0aGF0IHRoZSBzaW11bGF0b3IgbWlnaHQgc3VwcG9ydC4KLSAgIFNpbXVsYXRvcnMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCBhbnkgY29tYmluYXRpb24gb2YgTlVMTAotICAgb3IgZW1wdHkgQ01ELiAqLwotCi12b2lkIHNpbV9kb19jb21tYW5kIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBjaGFyICpjbWQpKTsKLQotLyogQ2FsbCB0aGVzZSBmdW5jdGlvbnMgdG8gc2V0IGFuZCBjbGVhciBicmVha3BvaW50cyBhdCBBRERSLiAqLwotCi1TSU1fUkMgc2ltX3NldF9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2NsZWFyX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fY2xlYXJfYWxsX2JyZWFrcG9pbnRzIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBlbmFibGUgYW5kIGRpc2FibGUgYnJlYWtwb2ludHMuICovCi0KLVNJTV9SQyBzaW1fZW5hYmxlX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fZGlzYWJsZV9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2VuYWJsZV9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLVNJTV9SQyBzaW1fZGlzYWJsZV9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQwKLQotLyogUHJvdmlkZSBzaW11bGF0b3Igd2l0aCBhIGRlZmF1bHQgKGdsb2JhbCkgaG9zdF9jYWxsYmFja19zdHJ1Y3QuCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgZG9lcyBub3QgdGFrZSBhIFNJTV9ERVNDIGFyZ3VtZW50IGFzIGl0IGlzCi0gICB1c2VkIGJlZm9yZSBzaW1fb3Blbi4gKi8KLQotdm9pZCBzaW1fc2V0X2NhbGxiYWNrcyBQQVJBTVMgKChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKikpOwotCi0KLS8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSBhcnJheS4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi12b2lkIHNpbV9zaXplIFBBUkFNUyAoKGludCBpKSk7Ci0KLQotLyogUnVuIGEgc2ltdWxhdGlvbiB3aXRoIHRyYWNpbmcgZW5hYmxlZC4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi1pbnQgc2ltX3RyYWNlIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLQotLyogQ29uZmlndXJlIHRoZSBzaXplIG9mIHRoZSBwcm9maWxlIGJ1ZmZlci4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi12b2lkIHNpbV9zZXRfcHJvZmlsZV9zaXplIFBBUkFNUyAoKGludCBuKSk7Ci0KLQotLyogS2lsbCB0aGUgcnVubmluZyBwcm9ncmFtLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIHdpbGwgYmUgcmVwbGFjZWQgYXMgcGFydCBvZiB0aGUgaW50cm9kdWN0aW9uIG9mCi0gICBtdWx0aS1jcHUgc2ltdWxhdG9ycy4gKi8KLQotdm9pZCBzaW1fa2lsbCBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogIWRlZmluZWQgKFJFTU9URV9TSU1fSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3BsYXktdHJlZS5oIGIvaW5jbHVkZS9zcGxheS10cmVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjhmZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zcGxheS10cmVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogQSBzcGxheS10cmVlIGRhdGF0eXBlLiAgCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZvciBhbiBlYXNpbHkgcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygc3BsYXktdHJlZXMsIHNlZToKLQotICAgICBMZXdpcywgSGFycnkgUi4gYW5kIERlbmVuYmVyZywgTGFycnkuICBEYXRhIFN0cnVjdHVyZXMgYW5kIFRoZWlyCi0gICAgIEFsZ29yaXRobXMuICBIYXJwZXItQ29sbGlucywgSW5jLiAgMTk5MS4gIAotCi0gICBUaGUgbWFqb3IgZmVhdHVyZSBvZiBzcGxheSB0cmVlcyBpcyB0aGF0IGFsbCBiYXNpYyB0cmVlIG9wZXJhdGlvbnMKLSAgIGFyZSBhbW9ydGl6ZWQgTyhsb2cgbikgdGltZSBmb3IgYSB0cmVlIHdpdGggbiBub2Rlcy4gICovCi0KLSNpZm5kZWYgX1NQTEFZX1RSRUVfSAotI2RlZmluZSBfU1BMQVlfVFJFRV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIFVzZSB0eXBlZGVmcyBmb3IgdGhlIGtleSBhbmQgZGF0YSB0eXBlcyB0byBmYWNpbGl0YXRlIGNoYW5naW5nCi0gICB0aGVzZSB0eXBlcywgaWYgbmVjZXNzYXJ5LiAgVGhlc2UgdHlwZXMgc2hvdWxkIGJlIHN1ZmZpY2llbnRseSB3aWRlCi0gICB0aGF0IGFueSBwb2ludGVyIG9yIHNjYWxhciBjYW4gYmUgY2FzdCB0byB0aGVzZSB0eXBlcywgYW5kIHRoZW4KLSAgIGNhc3QgYmFjaywgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHNwbGF5X3RyZWVfa2V5OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBzcGxheV90cmVlX3ZhbHVlOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBhIG5vZGUgaW4gdGhlIHRyZWUuICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3BsYXlfdHJlZV9ub2RlICpzcGxheV90cmVlX25vZGU7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gd2hpY2ggY29tcGFyZXMgdHdvIHNwbGF5LXRyZWUga2V5cy4gIFRoZQotICAgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB2YWx1ZXMgYXMgZm9yIHFzb3J0LiAgKi8KLXR5cGVkZWYgaW50ICgqc3BsYXlfdHJlZV9jb21wYXJlX2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5LCBzcGxheV90cmVlX2tleSkpOwotCi0vKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQKLSAgIHdpdGggdGhlIGtleS4gICovCi10eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9rZXkpKTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB1c2VkIHRvIGRlYWxsb2NhdGUgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkCi0gICB3aXRoIHRoZSB2YWx1ZS4gICovCi10eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbikgUEFSQU1TKChzcGxheV90cmVlX3ZhbHVlKSk7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHRyZWUuICAqLwotdHlwZWRlZiBpbnQgKCpzcGxheV90cmVlX2ZvcmVhY2hfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9ub2RlLCB2b2lkKikpOwotCi0vKiBUaGUgbm9kZXMgaW4gdGhlIHNwbGF5IHRyZWUuICAqLwotc3RydWN0IHNwbGF5X3RyZWVfbm9kZQotewotICAvKiBUaGUga2V5LiAgKi8KLSAgc3BsYXlfdHJlZV9rZXkga2V5OwotCi0gIC8qIFRoZSB2YWx1ZS4gICovCi0gIHNwbGF5X3RyZWVfdmFsdWUgdmFsdWU7Ci0KLSAgLyogVGhlIGxlZnQgYW5kIHJpZ2h0IGNoaWxkcmVuLCByZXNwZWN0aXZlbHkuICAqLwotICBzcGxheV90cmVlX25vZGUgbGVmdDsKLSAgc3BsYXlfdHJlZV9ub2RlIHJpZ2h0OwotfTsKLQotLyogVGhlIHNwbGF5IHRyZWUgaXRzZWxmLiAgKi8KLXR5cGVkZWYgc3RydWN0IHNwbGF5X3RyZWUKLXsKLSAgLyogVGhlIHJvb3Qgb2YgdGhlIHRyZWUuICAqLwotICBzcGxheV90cmVlX25vZGUgcm9vdDsKLQotICAvKiBUaGUgY29tcGFyaXNpb24gZnVuY3Rpb24uICAqLwotICBzcGxheV90cmVlX2NvbXBhcmVfZm4gY29tcDsKLQotICAvKiBUaGUgZGVhbGxvY2F0ZS1rZXkgZnVuY3Rpb24uICBOVUxMIGlmIG5vIGNsZWFudXAgaXMgbmVjZXNzYXJ5LiAgKi8KLSAgc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuIGRlbGV0ZV9rZXk7Ci0KLSAgLyogVGhlIGRlYWxsb2NhdGUtdmFsdWUgZnVuY3Rpb24uICBOVUxMIGlmIG5vIGNsZWFudXAgaXMgbmVjZXNzYXJ5LiAgKi8KLSAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4gZGVsZXRlX3ZhbHVlOwotfSAqc3BsYXlfdHJlZTsKLQotZXh0ZXJuIHNwbGF5X3RyZWUgc3BsYXlfdHJlZV9uZXcgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZV9jb21wYXJlX2ZuLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbiwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbikpOwotZXh0ZXJuIHZvaWQgc3BsYXlfdHJlZV9kZWxldGUgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSkpOwotZXh0ZXJuIHZvaWQgc3BsYXlfdHJlZV9pbnNlcnQgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2tleSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX3ZhbHVlKSk7Ci1leHRlcm4gc3BsYXlfdHJlZV9ub2RlIHNwbGF5X3RyZWVfbG9va3VwICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfa2V5KSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfZm9yZWFjaCAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfZm9yZWFjaF9mbiwKLQkJCQkJICAgICAgICB2b2lkKikpOwotZXh0ZXJuIGludCBzcGxheV90cmVlX2NvbXBhcmVfaW50cyAgICAgIFBBUkFNUygoc3BsYXlfdHJlZV9rZXksCi0JCQkJCQlzcGxheV90cmVlX2tleSkpOwotZXh0ZXJuIGludCBzcGxheV90cmVlX2NvbXBhcmVfcG9pbnRlcnMgIFBBUkFNUygoc3BsYXlfdHJlZV9rZXksCi0JCQkJCQlzcGxheV90cmVlX2tleSkpOwotCQkJCQkgICAgICAgCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX1NQTEFZX1RSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeW1jYXQuaCBiL2luY2x1ZGUvc3ltY2F0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZWZhZGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zeW1jYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIFN5bWJvbCBjb25jYXRlbmF0aW9uIHV0aWxpdGllcy4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgU1lNX0NBVF9ICi0jZGVmaW5lIFNZTV9DQVRfSAotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKEFMTU9TVF9TVERDKQotI2RlZmluZSBDT05DQVQyKGEsYikJIGEjI2IKLSNkZWZpbmUgQ09OQ0FUMyhhLGIsYykJIGEjI2IjI2MKLSNkZWZpbmUgQ09OQ0FUNChhLGIsYyxkKSBhIyNiIyNjIyNkCi0jZGVmaW5lIFNUUklOR1gocykgI3MKLSNlbHNlCi0jZGVmaW5lIENPTkNBVDIoYSxiKQkgYS8qKi9iCi0jZGVmaW5lIENPTkNBVDMoYSxiLGMpCSBhLyoqL2IvKiovYwotI2RlZmluZSBDT05DQVQ0KGEsYixjLGQpIGEvKiovYi8qKi9jLyoqL2QKLSNkZWZpbmUgU1RSSU5HWChzKSAiPyIKLSNlbmRpZgotCi0jZGVmaW5lIFhDT05DQVQyKGEsYikgICAgIENPTkNBVDIoYSxiKQotI2RlZmluZSBYQ09OQ0FUMyhhLGIsYykgICBDT05DQVQzKGEsYixjKQotI2RlZmluZSBYQ09OQ0FUNChhLGIsYyxkKSBDT05DQVQ0KGEsYixjLGQpCi0KLSNkZWZpbmUgWFNUUklORyhzKSBTVFJJTkdYKHMpIAotCi0jZW5kaWYgU1lNX0NBVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3dhaXQuaCBiL2luY2x1ZGUvd2FpdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNjOWNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvd2FpdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogRGVmaW5lIGhvdyB0byBhY2Nlc3MgdGhlIGludCB0aGF0IHRoZSB3YWl0IHN5c3RlbSBjYWxsIHN0b3Jlcy4KLSAgIFRoaXMgaGFzIGJlZW4gY29tcGF0aWJsZSBpbiBhbGwgVW5peCBzeXN0ZW1zIHNpbmNlIHRpbWUgaW1tZW1vcmlhbCwKLSAgIGJ1dCB2YXJpb3VzIHdlbGwtbWVhbmluZyBwZW9wbGUgaGF2ZSBkZWZpbmVkIHZhcmlvdXMgZGlmZmVyZW50Ci0gICB3b3JkcyBmb3IgdGhlIHNhbWUgb2xkIGJpdHMgaW4gdGhlIHNhbWUgb2xkIGludCAoc29tZXRpbWVzIGNsYWltZWQKLSAgIHRvIGJlIGEgc3RydWN0KS4gIFdlIGp1c3Qga25vdyBpdCdzIGFuIGludCBhbmQgd2UgdXNlIHRoZXNlIG1hY3JvcwotICAgdG8gYWNjZXNzIHRoZSBiaXRzLiAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlZmluZWQgZXF1aXZhbGVudGx5IHRvIHRoZWlyIGRlZmluaXRpb25zCi0gICBpbiBQT1NJWC4xLiAgV2UgZmFpbCB0byBkZWZpbmUgV05PSEFORyBhbmQgV1VOVFJBQ0VELCB3aGljaCBQT1NJWC4xCi0gICA8c3lzL3dhaXQuaD4gZGVmaW5lcywgc2luY2Ugb3VyIGNvZGUgZG9lcyBub3QgdXNlIHdhaXRwaWQoKS4gIFdlCi0gICBhbHNvIGZhaWwgdG8gZGVjbGFyZSB3YWl0KCkgYW5kIHdhaXRwaWQoKS4gICovICAgCi0KLSNpZm5kZWYJV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSYwMzc3KSA9PSAwKQotI2VuZGlmCi0KLSNpZm5kZWYJV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0KLSNpZm5kZWYJV0lGU1RPUFBFRAotI2lmZGVmIElCTTYwMDAKLQotLyogVW5mb3J0dW5hdGVseSwgdGhlIGFib3ZlIGNvbW1lbnQgKGFib3V0IGJlaW5nIGNvbXBhdGlibGUgaW4gYWxsIFVuaXggCi0gICBzeXN0ZW1zKSBpcyBub3QgcXVpdGUgY29ycmVjdCBmb3IgQUlYLCBzaWdoLiAgQW5kIEFJWCAzLjIgY2FuIGdlbmVyYXRlCi0gICBzdGF0dXMgd29yZHMgbGlrZSAweDU3YyAoc2lndHJhcCByZWNlaXZlZCBhZnRlciBsb2FkKSwgYW5kIGdkYiB3b3VsZAotICAgY2hva2Ugb24gaXQuICovCi0KLSNkZWZpbmUgV0lGU1RPUFBFRCh3KQkoKHcpJjB4NDApCi0KLSNlbHNlCi0jZGVmaW5lIFdJRlNUT1BQRUQodykJKCgodykmMDM3NykgPT0gMDE3NykKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYJV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgPj4gOCkgJiAwMzc3KSAvKiBzYW1lIGFzIFdSRVRDT0RFICovCi0jZW5kaWYKLQotI2lmbmRlZglXVEVSTVNJRwotI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMDE3NykKLSNlbmRpZgotCi0jaWZuZGVmCVdTVE9QU0lHCi0jZGVmaW5lIFdTVE9QU0lHCVdFWElUU1RBVFVTCi0jZW5kaWYKLQotLyogVGhlc2UgYXJlIG5vdCBkZWZpbmVkIGluIFBPU0lYLCBidXQgYXJlIHVzZWQgYnkgb3VyIHByb2dyYW1zLiAgKi8KLQotI2RlZmluZSBXQUlUVFlQRQlpbnQKLQotI2lmbmRlZglXQ09SRURVTVAKLSNkZWZpbmUgV0NPUkVEVU1QKHcpCSgoKHcpJjAyMDApICE9IDApCi0jZW5kaWYKLQotI2lmbmRlZglXU0VURVhJVAotI2RlZmluZSBXU0VURVhJVCh3LHN0YXR1cykgKCh3KSA9ICgwIHwgKChzdGF0dXMpIDw8IDgpKSkKLSNlbmRpZgotCi0jaWZuZGVmCVdTRVRTVE9QCi0jZGVmaW5lIFdTRVRTVE9QKHcsc2lnKQkgICAoKHcpID0gKDAxNzcgfCAoKHNpZykgPDwgOCkpKQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2luc3RhbGwtc2ggYi9pbnN0YWxsLXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOWRlMjM4Li4wMDAwMDAwCi0tLSBhL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQotIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCi0jCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5Ci0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50Ci0jIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0Ci0jIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KLSMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KLSMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCi0KLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbnNmb3JtYmFzZW5hbWU9IiIKLXRyYW5zZm9ybV9hcmc9IiIKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0iIgotZHN0PSIiCi1kaXJfYXJnPSIiCi0KLXdoaWxlIFsgeCIkMSIgIT0geCBdOyBkbwotICAgIGNhc2UgJDEgaW4KLQktYykgaW5zdGNtZD0iJGNwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWQpIGRpcl9hcmc9dHJ1ZQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JKikgIGlmIFsgeCIkc3JjIiA9IHggXQotCSAgICB0aGVuCi0JCXNyYz0kMQotCSAgICBlbHNlCi0JCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZwotCQk6Ci0JCWRzdD0kMQotCSAgICBmaQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0gICAgZXNhYwotZG9uZQotCi1pZiBbIHgiJHNyYyIgPSB4IF0KLXRoZW4KLQllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLQlleGl0IDEKLWVsc2UKLQl0cnVlCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgotCWRzdD0kc3JjCi0Jc3JjPSIiCi0JCi0JaWYgWyAtZCAkZHN0IF07IHRoZW4KLQkJaW5zdGNtZD06Ci0JCWNobW9kY21kPSIiCi0JZWxzZQotCQlpbnN0Y21kPW1rZGlyCi0JZmkKLWVsc2UKLQotIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0jIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAotIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCi0KLQlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCi0JdGhlbgotCQl0cnVlCi0JZWxzZQotCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKLQkJZXhpdCAxCi0JZmkKLQkKLQlpZiBbIHgiJGRzdCIgPSB4IF0KLQl0aGVuCi0JCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKLQkJZXhpdCAxCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KLSMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYwotCi0JaWYgWyAtZCAkZHN0IF0KLQl0aGVuCi0JCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCi0JZWxzZQotCQl0cnVlCi0JZmkKLWZpCi0KLSMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAotZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgotIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0Ci0KLSMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCi1pZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KLWRlZmF1bHRJRlM9JwkKLScKLUlGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCi0KLW9JRlM9IiR7SUZTfSIKLSMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCi1JRlM9JyUnCi1zZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLUlGUz0iJHtvSUZTfSIKLQotcGF0aGNvbXA9JycKLQotd2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgotCXNoaWZ0Ci0KLQlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKLSAgICAgICAgdGhlbgotCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKLQllbHNlCi0JCXRydWUKLQlmaQotCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKLWRvbmUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdCi10aGVuCi0JJGRvaXQgJGluc3RjbWQgJGRzdCAmJgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQotZWxzZQotCi0jIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KLQotCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAotCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCi0JZmkKLQotIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCi0KLQlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KLQotCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIwotCi0jIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKLQotCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgotCi0JdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCi0KLSMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cwotCi0jIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0jIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKLSMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCi0jIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0KLQkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgotCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCi0KLWZpICYmCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9pbnRsL0NoYW5nZUxvZyBiL2ludGwvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2ZmNmY2Li4wMDAwMDAwCi0tLSBhL2ludGwvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMiArMCwwIEBACi0xOTk3LTA5LTA2IDAyOjEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaW50bGguaW5zdC5pbjogUmVmb3JtYXQgY29weXJpZ2h0LgotCi0xOTk3LTA4LTE5IDE1OjIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IFJlbW92ZSB3cm9uZyBjb21tZW50LgotCi0xOTk3LTA4LTE2IDAwOjEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGF0YSk6IERvbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gaW5zdGFsbC4KLQotMTk5Ny0wOC0wMSAxNDozMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNhdC1jb21wYXQuYzogRml4IGNvcHlyaWdodC4KLQotCSogbG9jYWxlYWxpYXMuYzogRG9uJ3QgZGVmaW5lIHN0cmNociB1bmxlc3MgIUhBVkVfU1RSQ0hSLgotCi0JKiBsb2FkbXNnY2F0LmM6IFVwZGF0ZSBjb3B5cmlnaHQuICBGaXggdHlwb3MuCi0KLQkqIGwxMG5mbGlzdC5jOiBEb24ndCBkZWZpbmUgc3RyY2hyIHVubGVzcyAhSEFWRV9TVFJDSFIuCi0JKF9ubF9tYWtlX2wxMG5mbGlzdCk6IEhhbmRsZSBzcG9uc29yIGFuZCByZXZpc2lvbiBjb3JyZWN0bHkuCi0KLQkqIGdldHRleHQuYzogVXBkYXRlIGNvcHlyaWdodC4KLQkqIGdldHRleHQuaDogTGlrZXdpc2UuCi0JKiBoYXNoLXN0cmluZy5oOiBMaWtld2lzZS4KLQotCSogZmluZGRvbWFpbi5jOiBSZW1vYXZlIGRlYWQgY29kZS4gIERlZmluZSBzdHJjaHIgb25seSBpZgotCSFIQVZFX1NUUkNIUi4KLQotCSogZXhwbG9kZW5hbWUuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCi0JKiBleHBsb2RlbmFtZS5jOiBSZWZvcm1hdCBjb3B5cmlnaHQgdGV4dC4KLQkoX25sX2V4cGxvZGVfbmFtZSk6IEZpeCB0eXBvLgotCi0JKiBkY2dldHRleHQuYzogRGVmaW5lIGFuZCB1c2UgX19zZXRfZXJybm8uCi0JKGd1ZXNzX2NhdGVnb3J5X3ZhbHVlKTogRG9uJ3QgdXNlIHNldGxvY2FsZSBpZiBIQVZFX0xDX01FU1NBR0VTIGlzCi0Jbm90IGRlZmluZWQuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IFByZXR0eSBwcmludGluZy4KLQotMTk5Ny0wNS0wMSAwMjoyNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jIChndWVzc19jYXRlZ29yeV92YWx1ZSk6IERvbid0IGRlcGVuZCBvbgotCUhBVkVfTENfTUVTU0FHRVMuICBXZSBkb24ndCBuZWVkIHRoZSBtYWNybyBoZXJlLgotCVBhdGNoIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGlsb2cuZnI+LgotCi0JKiBjYXQtY29tcGF0LmMgKHRleHRkb21haW4pOiBEb04ndCByZWZlciB0byBIQVZFX1NFVExPQ0FMRV9OVUxMCi0JbWFjcm8uICBJbnN0ZWFkIHVzZSBIQVZFX0xPQ0FMRV9OVUxMIGFuZCBkZWZpbmUgaXQgd2hlbiB1c2luZwotCWdsaWJjLCBhcyBpbiBkY2dldHRleHQuYy4KLQlQYXRjaCBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBpbG9nLmZyPi4KLQotCSogTWFrZWZpbGUuaW4gKENQUEZMQUdTKTogTmV3IHZhcmlhYmxlLiAgUmVwb3J0ZWQgYnkgRnJhbmMsb2lzCi0JUGluYXJkLgotCi1Nb24gTWFyIDEwIDA2OjUxOjE3IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogSW1wbGVtZW50IGhhbmRsaW5nIG9mIGxpYnRvb2wuCi0KLQkqIGdldHRleHRQLmg6IENoYW5nZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHVzZSBvZiBnZW5lcmljIGxvd2xldmVsCi0JaTE4biBmaWxlIGhhbmRsaW5nLgotCi1XZWQgRGVjICA0IDIwOjIxOjE4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiB0ZXh0ZG9tYWluLmM6IFB1dCBwYXJlbnRoZXNlcyBhcm91bmQgYXJndW1lbnRzIG9mIG1lbWNweSBtYWNybwotCWRlZmluaXRpb24uCi0JKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KLQkqIGwxMG5mbGlzdC5jOiBMaWtld2lzZS4KLQkqIGZpbmRkb21haW4uYzogTGlrZXdpc2UuCi0JKiBiaW5kdGV4dGRvbS5jOiBMaWtld2lzZS4KLQlSZXBvcnRlZCBieSBUaG9tYXMgRXNrZW4uCi0KLU1vbiBOb3YgMjUgMjI6NTc6NTEgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHRleHRkb21haW4uYzogTW92ZSBkZWZpbml0aW9uIG9mIGBtZW1jcHlgIG1hY3JvIHRvIHJpZ2h0Ci0JcG9zaXRpb24uCi0KLUZyaSBOb3YgMjIgMDQ6MDE6NTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGZpbmRkb21haW4uYyBbIUhBVkVfU1RSSU5HX0ggJiYgIV9MSUJDXTogRGVmaW5lIG1lbWNweSB1c2luZwotIAliY29weSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIEVza2VuLgotCSogYmluZHRleHRkb20uYzogTGlrZXdpc2UuCi0JKiBsMTBuZmxpc3QuYzogTGlrZXdpc2UuCi0JKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KLQkqIHRleHRkb21haW4uYzogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMjkgMTE6MTA6MjcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsaWJkaXIpOiBDaGFuZ2UgdG8gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YKLSAJcHJlZml4LiAgUmVwb3J0ZWQgYnkgS251dC1I5XZhcmRBa3NuZXMgPGV0b2tuYUBldG8uZXJpY3Nzb24uc2U+LgotCi1TYXQgQXVnIDMxIDAzOjA3OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYyAoX25sX25vcm1hbGl6ZV9jb2Rlc2V0KTogV2UgY29udmVydCB0byBsb3dlciBjYXNlLAotCXNvIGRvbid0IHByZXBlbmQgdXBwZXJjYXNlIGBJU08nIGZvciBvbmx5IG51bWVyaWMgYXJnLgotCi1GcmkgSnVsIDE5IDAwOjE1OjQ2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYzogTW92ZSBpbmNsdXNpb24gb2YgYXJnei5oLCBjdHlwZS5oLCBzdGRsaWIuaCBhZnRlcgotCWRlZmluaXRpb24gb2YgX0dOVV9TT1VSQ0UuICBQYXRjaCBieSBSb2xhbmQgTWNHcmF0aC4KLQotCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IEZpeCBhbm90aGVyIGJ1ZyB3aXRoIGBmb3InIGxvb3AgYW5kCi0JZW1wdHkgYXJndW1lbnRzLiAgUGF0Y2ggYnkgSmltIE1leWVyaW5nLiAgQ29ycmVjdCBuYW1lIG9zCi0JdW5pbnN0YWxsZWQgZmlsZXM6IG5vIGludGwtIHByZWZpeCBhbnltb3JlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kYXRhKTogQWdhaW4gd29yayBhcm91bmQgc2hlbGxzIHdoaWNoCi0JY2Fubm90IGhhbmRsZSBtcHR5IGZvciBsaXN0LiAgUmVwb3J0ZWQgYnkgSmltIE1leWVyaW5nLgotCi1TYXQgSnVsIDEzIDE4OjExOjM1IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFNwbGl0IGdvYWwuICBOb3cgZGVwZW5kIG9uIGluc3RhbGwtZXhlYwotICAgICAgICBhbmQgaW5zdGFsbC1kYXRhLgotCShpbnN0YWxsLWV4ZWMsIGluc3RhbGwtZGF0YSk6IE5ldyBnb2Fscy4gIENyZWF0ZWQgZnJvbSBmb3JtZXIKLQlpbnN0YWxsIGdvYWwuCi0JUmVwb3J0ZWQgYnkgS2FybCBCZXJyeS4KLQotU2F0IEp1biAyMiAwNDo1ODoxNCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1LSU5TVEFMTERJUlMpOiBOZXcgdmFyaWFibGUuICBQYXRoIHRvCi0gICAgICAgIG1raW5zdGFsbGRpcnMgc2NyaXB0LgotCShpbnN0YWxsKTogdXNlIE1LSU5TVEFMTERJUlMgdmFyaWFibGUgb3IgaWYgdGhlIHNjcmlwdCBpcyBub3QgcHJlc2VudAotCXRyeSB0byBmaW5kIGl0IGluIHRoZSAkdG9wX3NjcmRpcikuCi0KLVdlZCBKdW4gMTkgMDI6NTY6NTYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jOiBMaW51eCBsaWJjICpwYXJ0bHkqIGluY2x1ZGVzIHRoZSBhcmd6XyogZnVuY3Rpb25zLgotCUdyci4gIFdvcmsgYXJvdW5kIGJ5IHJlbmFtaW5nIHRoZSBzdGF0aWMgdmVyc2lvbiBhbmQgdXNlIG1hY3JvcwotCWZvciByZW5hbWluZy4KLQotVHVlIEp1biAxOCAyMDoxMToxNyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgcHJlc2VuY2UgdGVzdCBtYWNyb3Mgb2YgX19hcmd6XyogZnVuY3Rpb25zLgotCi0JKiBsMTBuZmxpc3QuYzogSW5jbHVkZSA8YXJnei5oPiBiYXNlZCBvbiB0ZXN0IG9mIGl0IGluc3RlYWQgd2hlbgotCV9fYXJnel8qIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLgotCVJlcG9ydGVkIGJ5IEFuZHJlYXMgU2Nod2FiLgotCi1UaHUgSnVuIDEzIDE1OjE3OjQ0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBleHBsb2RlbmFtZS5jLCBsMTBuZmxpc3QuYzogRGVmaW5lIE5VTEwgZm9yIGR1bWIgc3lzdGVtcy4KLQotVHVlIEp1biAxMSAxNzowNToxMyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaW50bGguaW5zdC5pbiwgbGliZ2V0dGV4dC5oIChkY2dldHRleHQpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGUKLQlyZXN1bHQgdG8gX19yZXN1bHQgdG8gcHJldmVudCBuYW1lIGNsYXNoLgotCi0JKiBsMTBuZmxpc3QuYywgbG9jYWxlYWxpYXMuYywgZGNnZXR0ZXh0LmM6IERlZmluZSBfR05VX1NPVVJDRSB0bwotICAgICAgICBnZXQgcHJvdG90eXBlIGZvciBzdHBjcHkgYW5kIHN0cmNhc2VjbXAuCi0KLQkqIGludGxoLmluc3QuaW4sIGxpYmdldHRleHQuaDogTW92ZSBkZWNsYXJhdGlvbiBvZgotCWBfbmxfbXNnX2NhdF9jbnRyJyBvdXRzaWRlIF9fZXh0ZW5zaW9uX18gYmxvY2sgdG8gcHJldmVudCB3YXJuaW5nCi0JZnJvbSBnY2MncyAtV25lc3RlZC1leHRlcm4gb3B0aW9uLgotCi1GcmkgSnVuICA3IDAxOjU4OjAwIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSBjb21tZW50LgotCi1UaHUgSnVuICA2IDE3OjI4OjE3IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFdvcmsgYXJvdW5kIGZvciBhbm90aGVyIEJ1Z2xpeCBzdHVwaWRpdHkuCi0JQWx3YXlzIHVzZSBhbiBgZWxzZScgY2xvc2UgZm9yIGBpZidzLiAgUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW50bGguaW5zdCk6IENvcnJlY3QgdHlwbyBpbiBwaG9ueSBydWxlLgotCVJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotVGh1IEp1biAgNiAwMTo0OTo1MiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZGNnZXR0ZXh0LmMgKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJpYWJsZSBhbGxvY2FfbGlzdCB0bwotCWJsb2NrX2xpc3QgYXMgdGhlIG1hY3JvIGNhbGxzIGFzc3VtZS4KLQlQYXRjaCBieSBFcmljIEJhY2t1cy4KLQotCSogbG9jYWxlYWxpYXMuYyBbIUhBVkVfQUxMT0NBXTogRGVmaW5lIGFsbG9jYSBhcyBtYWNybyB1c2luZwotICAgICAgICBtYWxsb2MuCi0JKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJyaWFiZSBhbGxvY2FfbGlzdCB0byBibG9ja19saXN0IGFzIHRoZQotCW1hY3JvIGNhbGxzIGFzc3VtZS4KLQlQYXRjaCBieSBFcmljIEJhY2t1cy4KLQotCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgY29uZGl0aW9uYWwgZm9yIDxhcmd6Lmg+IGluY2x1c2lvbi4KLQlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCBvbiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQCwgbm90Ci0gICAgICAgIGFsbC1AVVNFX05MU0AuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaW50bGguaW5zdCBjb21lcyBmcm9tIGxvY2FsIGRpciwgbm90Ci0gICAgICAgICQoc3JjZGlyKS4KLQotCSogTWFrZWZpbGUuaW4gKGludGxoLmluc3QpOiBTcGVjaWFsIGhhbmRsaW5nIG9mIHRoaXMgZ29hbC4gIElmCi0JdXNlZCBpbiBnZXR0ZXh0LCB0aGlzIGlzIHJlYWxseSBhIHJ1bCB0byBjb25zdHJ1Y3QgdGhpcyBmaWxlLiAgSWYKLQl1c2VkIGluIGFueSBvdGhlciBwYWNrYWdlIGl0IGlzIGRlZmluZWQgYXMgYSAuUEhPTlkgcnVsZSB3aXRoCi0JZW1wdHkgYm9keS4KLQotCSogZmluZGRvbWFpbi5jOiBFeHRyYWN0IGxvY2FsZSBmaWxlIGluZm9ybWF0aW9uIGhhbmRsaW5nIGludG8KLQlsMTBuZmlsZS5jLiAgUmVuYW1lIGxvY2FsIHN0cGNweV9fIGZ1bmN0aW9uIHRvIHN0cGNweS4KLQotCSogZGNnZXR0ZXh0LmMgKHN0cGNweSk6IEFkZCBsb2NhbCBkZWZpbml0aW9uLgotCi0JKiBsMTBuZmxpc3QuYzogU29sdmUgc29tZSBwb3J0YWJpbGl0eSBwcm9ibGVtcy4gIFBhdGNoZXMgcGFydGx5IGJ5Ci0JVGhvbWFzIEVza2VuLiAgQWRkIGxvY2FsIGRlZmluaXRpb24gb2Ygc3RwY3B5LgotCi1UdWUgSnVuICA0IDAyOjQ3OjQ5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpbnRsaC5pbnN0LmluOiBEb24ndCBkZXBlbmQgaW5jbHVkaW5nIDxsb2NhbGUuaD4gb24KLQlIQVZFX0xPQ0FMRV9ILiAgSW5zdGVhZCBjb25maWd1cmUgbXVzdCByZXdyaXRlIHRoaXMgZmlpbGUKLQlkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGUgY29uZmlndXJlIHJ1bi4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBsaWJpbnRsLmluc3QgaXMgbm93IGNhbGxlZCBpbnRsaC5pbnN0LgotCUFkZCBydWxlcyBmb3IgdXBkYXRpbmcgaW50bGguaW5zdCBmcm9tIGludGxoLmluc3QuaW4uCi0KLQkqIGxpYmludGwuaW5zdDogUmVuYW1lZCB0byBpbnRsaC5pbnN0LmluLgotCi0JKiBsb2NhbGVhbGlhcy5jLCBkY2dldHRleHQuYyBbX19HTlVDX19dOiBEZWZpbmUgSEFWRV9BTExPQ0EgdG8gMQotICAgICAgICBiZWNhdXNlIGdjYyBoYXMgX19idWl0bGluX2FsbG9jYS4KLQlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotTW9uIEp1biAgMyAwMDozMjoxNiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxjaGVjayk6IE5ldyBnb2FsIHRvIGZ1bGZpbGwgbmVlZHMgb2YKLSAgICAgICAgYXV0b21ha2UncyBkaXN0Y2hlY2suCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVvcmRlciBjb21tYW5kcyBzbyB0aGF0IFZFUlNJT04gaXMKLSAgICAgICAgZm91bmQuCi0KLQkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKTogTm93IHVzZSBzdWJkaXJlY3RvcnkgaW50bC8gaW4KLSAgICAgICAgQGRhdGFkaXJAL2dldHRleHQuCi0JKENPTVNSQ1MpOiBBZGQgbDEwbmZpbGUuYy4KLQkoT0JKRUNUUyk6IEFkZCBsMTBuZmlsZS5vLgotCShESVNURklMRVMpOiBSZW5hbWUgdG8gRElTVEZJTEUubm9ybWFsLiAgUmVtb3ZlICQoRElTVEZJTEVTLmNvbW1vbikuCi0JKERJU1RGSUxFLmdldHRleHQpOiBSZW1vdmUgJChESVNURklMRVMuY29tbW9uKS4KLQkoYWxsLWdldHRleHQpOiBSZW1vdmUgZ29hbC4KLQkoaW5zdGFsbCk6IElmICQoUEFDS0FHRSkgPSBnZXR0ZXh0IGluc3RhbGwsIG90aGVyd29zZSBkbyBub3RoaW5nLiAgTm8KLQlwYWNrYWdlIGJ1dCBnZXR0ZXh0IGl0c2VsZiBzaG91bGQgaW5zdGFsbCBsaWJpbnRsLmggKyBoZWFkZXJzLgotCShkaXN0KTogRXh0ZW5kIGdvYWwgdG8gd29yayBmb3IgZ2V0dGV4dCwgdG9vLgotCShkaXN0LWdldHRleHQpOiBSZW1vdmUgZ29hbC4KLQotCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IERlZmluZSBtYWNybyBhbGxvY2EgYnkgdXNpbmcgbWFsbG9jLgotCi1TdW4gSnVuICAyIDE3OjMzOjA2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6IFBhcmFtZXRlciBpcyBub3cgY29tZXMgZnJvbQotICAgICAgICBmaW5kX2wxMG5maWxlLgotCi1TYXQgSnVuICAxIDAyOjIzOjAzIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYyAoX19hcmd6X25leHQpOiBBZGQgZGVmaW5pdGlvbi4KLQotCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IEFkZCBjb2RlIGZvciBoYW5kbGluZyBtaXNzaW5nIGFsbG9jYQotCWNvZGUuICBVc2UgbmV3IGwxMG5maWxlIGhhbmRsaW5nLgotCi0JKiBsb2NhbGVhbGlhcy5jIFshSEFWRV9BTExPQ0FdOiBBZGQgY29kZSBmb3IgaGFuZGxpbmcgbWlzc2luZwotICAgICAgICBhbGxvY2EgY29kZS4KLQotCSogbDEwbmZsaXN0LmM6IEluaXRpYWwgcmV2aXNpb24uCi0KLVR1ZSBBcHIgIDIgMTg6NTE6MTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZXR0ZXh0KTogTmV3IGdvYWwuICBTYW1lIGFzIGFsbC15ZXMuCi0KLVRodSBNYXIgMjggMjM6MDE6MjIgMTk5NiAgS2FybCBFaWNod2FsZGVyICA8a2VAa2UuY2VudHJhbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOiBEZWZpbmUgdXNpbmcgQGRhdGFkaXJALgotCi1UdWUgTWFyIDI2IDEyOjM5OjE0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYzogSW5jbHVkZSA8Y3R5cGUuaD4uICBSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotU2F0IE1hciAyMyAwMjowMDozNSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cGNweSk6IFJlbmFtZSB0byBzdHBjcHlfXyB0byBwcmV2ZW50IGNsYXNoaW5nCi0gICAgICAgIHdpdGggZXh0ZXJuYWwgZGVjbGFyYXRpb24uCi0KLVNhdCBNYXIgIDIgMDA6NDc6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1ubyk6IFJlbmFtZSBmcm9tIGFsbF9uby4KLQotU2F0IEZlYiAxNyAwMDoyNTo1OSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBnZXR0ZXh0UC5oIFtsb2FkZWRfZG9tYWluXTogQXJyYXkgYHN1Y2Nlc3NvcicgbXVzdCBub3cgY29udGFpbiB1cAotICAgICAgICB0byA2MyBlbGVtZW50cyAoYmVjYXVzZSBvZiBjb2Rlc2V0IG5hbWUgbm9ybWFsaXphdGlvbikuCi0KLQkqIGZpbmRkb21haW4uYzogSW1wbGVtZW50IGNvZGVzZXQgbmFtZSBub3JtYWxpemF0aW9uLgotCi1UaHUgRmViIDE1IDA0OjM5OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBEZWZpbmUgdG8gYGFsbC1AVVNFX05MU0AnLgotCShhbGwteWVzLCBhbGxfbm8pOiBOZXcgZ29hbHMuICBgYWxsLW5vJyBpcyBub29wLCBgYWxsLXllcycKLQlpcyBmb3JtZXIgYWxsLgotCi1Nb24gSmFuIDE1IDIxOjQ2OjAxIDE5OTYgIEhvd2FyZCBHYXlsZSAgPGhvd2FyZEBoYWwuY29tPgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKTogSW5jcmVtZW50IHN0cmluZyBwb2ludGVycyBpbiBsb29wCi0gICAgICAgIG9mIHN0cmNhc2VjbXAgcmVwbGFjZW1lbnQuCi0KLUZyaSBEZWMgMjkgMjE6MTY6MzQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogV2hvIGNvbW1lbnRlZCB0aGlzIGdvYWwgb3V0ID8gOi0pCi0KLUZyaSBEZWMgMjkgMTU6MDg6MTYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IFNhdmUgYGVycm5vJy4gIEZhaWxpbmcgc3lzdGVtIGNhbGxzCi0Jc2hvdWxkIG5vdCBlZmZlY3QgaXQgYmVjYXVzZSBhIG1pc3NpbmcgY2F0YWxvZyBpcyBubyBlcnJvci4KLQlSZXBvcnRlZCBieSBIYXJhbGQgSzxvOj5uaWcgPGtvZW5pZ0B0YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGU+LgotCi1UdWUgRGVjIDE5IDIyOjA5OjEzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEV4cGxpY2l0bHkgdXNlICQoU0hFTEwpIGZvciBydW5uaW5nCi0gICAgICAgIHNoZWxsIHNjcmlwdHMuCi0KLUZyaSBEZWMgMTUgMTc6MzQ6NTkgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IE9ubHkgaW5zdGFsbCBsaWJyYXJ5IGFuZCBoZWFkZXIgd2hlbgotCXdlIHVzZSB0aGUgb3duIGltcGxlbWVudGF0aW9uLiAgRG9uJ3QgZG8gaXQgd2hlbiB1c2luZyB0aGUKLQlzeXN0ZW0ncyBnZXR0ZXh0IG9yIGNhdGdldHMgZnVuY3Rpb25zLgotCi0JKiBkY2dldHRleHQuYyAoZmluZF9tc2cpOiBNdXN0IG5vdCBzd2FwIGRvbWFpbi0+aGFzaF9zaXplIGhlcmUuCi0KLVNhdCBEZWMgIDkgMTY6MjQ6MzcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYywgbGliaW50bC5pbnN0LCBsaWJnZXR0ZXh0LmgsIGhhc2gtc3RyaW5nLmgsCi0JZ2V0dGV4dFAuaCwgZmluZGRvbWFpbi5jLCBkY2dldHRleHQuYywgY2F0LWNvbXBhdC5jOgotCVVzZSBQQVJBTVMgaW5zdGVhZCBvZiBfX1AuICBTdWdnZXN0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLVR1ZSBEZWMgIDUgMTE6Mzk6MTQgMTk5NSAgTGFycnkgU2Nod2ltbWVyICA8cm9zZWJ1ZEBjeWNsb25lLnN0YW5mb3JkLmVkdT4KLQotCSogbGliZ2V0dGV4dC5oOiBVc2UgYCNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCknIGluc3RlYWQgb2YgYCNpZgotCSFfTElCSU5UTF9IJyBiZWNhdXNlIFNvbGFyaXMgZGVmaW5lcyBfTElCSU5UTF9IIGFzIGVtcHR5LgotCi1Nb24gRGVjICA0IDE1OjQyOjA3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6Ci0JSW5zdGFsbCBsaWJpbnRsLmluc3QgaW5zdGVhZCBvZiBsaWJpbnRsLmguaW5zdGFsbC4KLQotU2F0IERlYyAgMiAyMjo1MTozOCAxOTk1ICBNYXJjdXMgRGFuaWVscyAgPG1hcmN1c0BzeXNjLnBkeC5lZHU+Ci0KLQkqIGNhdC1jb21wYXQuYyAodGV4dGRvbWFpbik6Ci0JUmV2ZXJzZSBvcmRlciBpbiB3aGljaCBmaWxlcyBhcmUgdHJpZWQgeW91IGxvYWQuICBGaXJzdAotCXRyeSBsb2NhbCBmaWxlLCB3aGVuIHRoaXMgZmFpbGVkIGFic29sdXRlIHBhdGguCi0KLVdlZCBOb3YgMjkgMDI6MDM6NTMgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6IEFkZCBtaXNzaW5nIHsgfS4KLQotU3VuIE5vdiAyNiAxODoyMTo0MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJpbnRsLmluc3Q6IEFkZCBtaXNzaW5nIF9fUCBkZWZpbml0aW9uLiAgUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi0JKiBNYWtlZmlsZS5pbjoKLQlBZGQgZHVtbXkgYGFsbCcgYW5kIGBkdmknIGdvYWxzLiAgUmVwb3J0ZWQgYnkgVG9tIFRyb21leS4KLQotU2F0IE5vdiAyNSAxNjoxMjowMSAxOTk1ICBGcmFuYyxvaXMgUGluYXJkICA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+Ci0KLQkqIGhhc2gtc3RyaW5nLmg6IENhcGl0YWxpemUgYXJndW1lbnRzIG9mIG1hY3Jvcy4KLQotU2F0IE5vdiAyNSAxMjowMTozNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogUHJldmVudCBmaWxlcyBuYW1lcyBsb25nZXIgdGhhbiAxMwotCWNoYXJhY3RlcnMuICBsaWJpbnRsLmguZ2xpYmMtPmxpYmludGwuZ2xpYmMsCi0JbGliaW50bC5oLmluc3RhbGwtPmxpYmludGwuaW5zdC4gIFJlcG9ydGVkIGJ5IEpvc2h1YSBSLiBQb3Vsc29uLgotCi1TYXQgTm92IDI1IDExOjMxOjEyIDE5OTUgIEVyaWMgQmFja3VzICA8ZXJpY2JAbHNpZC5ocC5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jOiBGaXggYnVnIGluIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCi0KLVNhdCBOb3YgMjUgMDI6MzU6MjcgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KLQotCSogbGliZ2V0dGV4dC5oOiBTb2xhcmlzIGNjIGRvZXMgbm90IHVuZGVyc3RhbmQKLQkgI2lmICFTWU1CT0wxICYmICFTWU1CT0wyLiAgU2FkCWJ1dCB0cnVlLgotCi1UaHUgTm92IDIzIDE2OjIyOjE0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGhhc2gtc3RyaW5nLmggKGhhc2hfc3RyaW5nKToKLQlGaXggZm9yIG1hY2hpbmUgd2l0aCA+MzIgYml0IGB1bnNpZ25lZCBsb25nJ3MuCi0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOgotCUZpeCBob3JyaWJsZSBidWcgaW4gbG9vcCBmb3IgYWx0ZXJuYXRpdmUgdHJhbnNsYXRpb24uCi0KLVRodSBOb3YgMjMgMDE6NDU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogcG8ydGJsLnNlZC5pbiwgbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDoKLQlTb21lIGZ1cnRoZXIgc2ltcGxpZmljYXRpb25zIGluIG1lc3NhZ2UgbnVtYmVyIGdlbmVyYXRpb24uCi0KLU1vbiBOb3YgMjAgMjE6MDg6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliaW50bC5oLmdsaWJjOiBVc2UgX19jb25zdCBpbnN0ZWFkIG9mIGNvbnN0IGluIHByb3RvdHlwZXMuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6Ci0JSW5zdGFsbCBsaWJpbnRsLmguaW5zdGFsbCBpbnN0ZWFkIG9mIGxpYmludGwuaC4gIFRoaXMKLQlpcyBhIHN0cmlwcGVkLWRvd24gdmVyc2lvbi4gIFN1Z2dlc3RlZCBieSBQZXRlciBNaWxsZXIuCi0KLQkqIGxpYmludGwuaC5pbnN0YWxsLCBsaWJpbnRsLmguZ2xpYmM6IEluaXRpYWwgcmV2aXNpb24uCi0KLQkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMsIHJlYWRfYWxpYXNfZmlsZSk6Ci0JUHJvdGVjdCBwcm90b3R5cGVzIGluIHR5cGUgY2FzdHMgYnkgX19QLgotCi1UdWUgTm92IDE0IDE2OjQzOjU4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGhhc2gtc3RyaW5nLmg6IENvcnJlY3QgcHJvdG90eXBlIGZvciBoYXNoX3N0cmluZy4KLQotU3VuIE5vdiAxMiAxMjo0MjozMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIGdldHRleHRQLmg6IEZpeCBjb3B5cmlnaHQuCi0JKFNXQVApOiBBZGQgcHJvdG90eXBlLgotCi1XZWQgTm92ICA4IDIyOjU2OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6IEZvcmdvdCBzaXplb2YuCi0JQXZvaWQgY2FsbGluZyAqcHJpbnRmIGZ1bmN0aW9uLiAgVGhpcyBpbnRyb2R1Y2VzIGEgYmlnIG92ZXJoZWFkLgotCVBhdGNoIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1UdWUgTm92ICA3IDE0OjIxOjA4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYywgY2F0LWNvbXBhdC5jOiBXcm9uZyBpbmRlbnRhdGlvbiBpbiAjaWYgZm9yIHN0cGNweS4KLQotCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOgotCURlZmluZSBzdWJzdGl0dXRpb24gZnVuY3Rpb24gbG9jYWwuICBUaGUgbWFjcm8gd2FzIHRvIGZsYWt5LgotCi0JKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvLgotCi0JKiB4b3Blbi1tc2cuc2VkLCBsaW51eC1tc2cuc2VkOgotCVdoaWxlIGJyaW5naW5nIG1lc3NhZ2UgbnVtYmVyIHRvIHJpZ2h0IHBsYWNlIG9ubHkgYWNjZXB0IGRpZ2l0cy4KLQotCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDogTm93IHRoYXQgdGhlIGNvdW50ZXIgZG9lcyBub3QgaGF2ZQotCWxlYWRpbmcgMHMgd2UgZG9uJ3QgbmVlZCB0byByZW1vdmUgdGhlbS4gIFJlcG9ydGVkIGJ5IE1hcmN1cwotCURhbmllbHMuCi0KLQkqIE1ha2VmaWxlLmluICguLi9wby9jYXQtaWQtdGJsLm8pOiBVc2UgJCh0b3Bfc3JkaXIpIGluCi0JZGVwZW5kZW5jeS4gIFJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBjYXQtY29tcGF0LmM6IChzdHBjcHkpIFshX0xJQkMgJiYgIUhBVkVfU1RQQ1BZXTogRGVmaW5lIHJlcGxhY2VtZW50LgotCUdlbmVyYWxseSBjbGVhbnVwIHVzaW5nICNpZiBpbnN0ZWFkIG9mICNpZm5kZWYuCi0KLQkqIE1ha2VmaWxlLmluOiBDb3JyZWN0IHR5cG9zIGluIGNvbW1lbnQuICBCeSBGcmFuYyxvaXMgUGluYXJkLgotCi1Nb24gTm92ICA2IDAwOjI3OjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IERvbid0IGluc3RhbGwgbGliaW50bC5oIGFuZCBsaWJpbnRsLmEKLQlpZiB3ZSB1c2UgYW4gYXZhaWxhYmxlIGdldHRleHQgaW1wbGVtZW50YXRpb24uCi0KLVN1biBOb3YgIDUgMjI6MDI6MDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliZ2V0dGV4dC5oOiBGaXggdHlwbzogSEFWRV9DQVRHRVRUUyAtPiBIQVZFX0NBVEdFVFMuICBSZXBvcnRlZAotCWJ5IEZyYW5jLG9pcyBQaW5hcmQuCi0KLQkqIGxpYmdldHRleHQuaDogVXNlICNpZiBpbnN0ZWFkIG9mICNpZmRlZi8jaWZuZGVmLgotCi0JKiBmaW5kZG9tYWluLmM6Ci0JQ29tbWVudHMgZGVzY3JpYmluZyB3aGF0IGhhcyB0byBiZSBkb25lIHNob3VsZCBzdGFydCB3aXRoIEZJWE1FLgotCi1TdW4gTm92ICA1IDE5OjM4OjAxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBTcGxpdC4gIFVzZSBESVNURklMRVMgd2l0aCBub3JtYWwgbWVhbmluZy4KLQlESVNURklMRVMuY29tbW9uIG5hbWVzIHRoZSBmaWxlcyBjb21tb24gdG8gYm90aCBkaXN0IGdvYWxzLgotCURJU1RGSUxFUy5nZXR0ZXh0IGFyZSB0aGUgZmlsZXMgb25seSBkaXN0cmlidXRlZCBpbiBHTlUgZ2V0dGV4dC4KLQotU3VuIE5vdiAgNSAxNzozMjo1NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogQ29ycmVjdCBzZWFyY2hpbmcgaW4gZGVyaXZlZCBsb2NhbGVzLgotCVRoaXMgd2FzIG5lY2Vzc2FyeSBzaW5jZSBhIGNoYW5nZSBpbiBfbmxfZmluZF9tc2cgc2V2ZXJhbCB3ZWVrcwotCWFnby4gIEkgcmVhbGx5IGRvbid0IGtub3cgdGhpcyBpcyBzdGlsbCBub3QgZml4ZWQuCi0KLVN1biBOb3YgIDUgMTI6NDM6MTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOiBUZXN0IGZvciBGSUxFTkFNRSA9PSBOVUxMLiAgVGhpcwotCW1pZ2h0IG1hcmsgYSBzcGVjaWFsIGNvbmRpdGlvbi4KLQotCSogZmluZGRvbWFpbi5jIChtYWtlX2VudHJ5X3JlYyk6IERvbid0IG1ha2UgaWxsZWdhbCBlbnRyeSBhcyBkZWNpZGVkLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IFN1cHByZXNzIGVycm9yIG1lc3NhZ2Ugd2hlbiBsbiBmYWlsZWQuCi0JR2V0IGZpbGVzIGZyb20gJChzcmNkaXIpIGV4cGxpY2l0bHkuCi0KLQkqIGxpYmdldHRleHQuaCAoZ2V0dGV4dF9jb25zdCk6IFJlbmFtZSB0byBnZXR0ZXh0X25vb3AuCi0KLUZyaSBOb3YgIDMgMDc6MzY6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChtYWtlX2VudHJ5X3JlYyk6Ci0JUHJvdGVjdCBhZ2FpbnN0IHdyb25nIGxvY2FsZSBuYW1lcyBieSB0ZXN0aW5nIG1hc2suCi0KLQkqIGxpYmdldHRleHQuaCAoZ2V0dGV4dF9jb25zdCk6IEFkZCBtYWNybyBkZWZpbml0aW9uLgotCUNhcGl0YWxpemUgbWFjcm8gYXJndW1lbnRzLgotCi1UaHUgTm92ICAyIDIzOjE1OjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlUZXN0IGZvciBwb2ludGVyICE9IE5VTEwgYmVmb3JlIGFjY2Vzc2luZyB2YWx1ZS4KLQlSZXBvcnRlZCBieSBUb20gVHJvbWV5LgotCi0JKiBnZXR0ZXh0LmMgKE5VTEwpOgotCURlZmluZSBhcyAodm9pZCopMCBpbnN0YWQgb2YgMC4gIFJlcG9ydGVkIGJ5IEZyYW5jLG9pcyBQaW5hcmQuCi0KLU1vbiBPY3QgMzAgMjE6Mjg6NTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogcG8ydGJsLnNlZC5pbjogU2VyaW91cyB0eXBvIGJ1ZyBmaXhlZCBieSBKaW0gTWV5ZXJpbmcuCi0KLVNhdCBPY3QgMjggMjM6MjA6NDcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliZ2V0dGV4dC5oOiBEaXNhYmxlIGRjZ2V0dGV4dCBvcHRpbWl6YXRpb24gZm9yIFNvbGFyaXMgMi4zLgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKLQlQZXRlciBNaWxsZXIgcmVwb3J0ZWQgdGhhdCB0b2xvd2VyIGluIHNvbWUgc3lzdGVtcyBpcwotCWV2ZW4gZHVtYmVyIHRoYW4gSSB0aG91Z2h0LiAgUHJvdGVjdCBjYWxsIGJ5IGBpc3VwcGVyJy4KLQotRnJpIE9jdCAyNyAyMjoyMjo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAobGliZGlyLCBpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoaW5zdGFsbC1zcmMpOiBJbnN0YWxsIGxpYmludGwuYSBhbmQgbGliaW50bC5oIGluIGNvcnJlY3QgZGlycy4KLQotRnJpIE9jdCAyNyAyMjowNzoyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoU09VUkNFUyk6IEZpeCB0eXBvOiBpbnRybC5jb21wYXQuYyAtPiBpbnRsLWNvbXBhdC5jLgotCi0JKiBwbzJ0Ymwuc2VkLmluOiBQYXRjaCBmb3IgYnVnZ3kgU0VEcyBieSBDaHJpc3RpYW4gdm9uIFJvcXVlcy4KLQotCSogbG9jYWxlYWxpYXMuYzoKLQlGaXggdHlwbyBhbmQgc3VwZXJmbG91cyB0ZXN0LiAgUmVwb3J0ZWQgYnkgQ2hyaXN0aWFuIHZvbiBSb3F1ZXMuCi0KLUZyaSBPY3QgIDYgMTE6NTI6MDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCUNvcnJlY3Qgc29tZSByZW1haW5kZXIgZnJvbSB0aGUgcHJlLUNFTiBzeW50YXguICBOb3cKLQl3ZSBkb24ndCBoYXZlIGEgY29uc3RhbnQgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgYW55bW9yZS4KLQotV2VkIFNlcCAyNyAyMTo0MToxMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogQWRkIGxpYmludGwuaC5nbGliYy4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3QtbGliYyk6IEFkZCBnb2FsIGZvciBwYWNraW5nIHNvdXJjZXMgZm9yIGdsaWJjLgotCShDT01TUkNTLCBDT01IRFJTKTogU3BsaXR0ZWQgdG8gc2VwYXJhdGUgc291cmNlcyBzaGFyZWQgd2l0aCBnbGliYy4KLQotCSogbG9hZG1zZ2NhdC5jOiBGb3JnZXQgdG8gY29udGludWUgI2lmIGxpbmUuCi0KLQkqIGxvY2FsZWFsaWFzLmM6Ci0JW19MSUJDXTogUmVuYW1lIHN0cmNhc2VjbXAgdG8gX19zdHJjYXNlY21wIHRvIGtlZXAgQU5TSSBDIG5hbWUKLQlzcGFjZSBjbGVhbi4KLQotCSogZGNnZXR0ZXh0LmMsIGZpbmRkb21haW4uYzogQmV0dGVyIGNvbW1lbnQgdG8gbGFzdCBjaGFuZ2UuCi0KLQkqIGxvYWRtc2djYXQuYzoKLQlbX0xJQkNdOiBSZW5hbWUgZnN0YXQsIG9wZW4sIGNsb3NlLCByZWFkLCBtbWFwLCBhbmQgbXVubWFwIHRvCi0JX19mc3RhdCwgX19vcGVuLCBfX2Nsb3NlLCBfX3JlYWQsIF9fbW1hcCwgYW5kIF9fbXVubWFwIHJlc3AKLQl0byBrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBmaW5kZG9tYWluLmM6Ci0JW19MSUJDXTogUmVuYW1lIHN0cGNweSB0byBfX3N0cGNweSB0byBrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBkY2dldHRleHQuYzoKLQlbX0xJQkNdOiBSZW5hbWUgZ2V0Y2VkIGFuZCBzdHBjcHkgdG8gX19nZXRjd2QgYW5kIF9fc3RwY3B5IHJlc3AgdG8KLQlrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBsaWJnZXR0ZXh0Lmg6Ci0JSW5jbHVkZSBzeXMvdHlwZXMuaCBmb3IgdGhvc2Ugb2xkIFN5c1Ygc3lzdGVtcyBvdXQgdGhlcmUuCi0JUmVwb3J0ZWQgYnkgRnJhbmNlc2NvIFBvdG9ydGlgLgotCi0JKiBsb2FkbXNnY2F0LmMgKHVzZV9tbWFwKTogRGVmaW5lIGlmIGNvbXBpbGVkIGZvciBnbGliYy4KLQotCSogYmluZHRleHRkb20uYzogSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycwotCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBmaW5kZG9tYWluLmM6IEZpeCAyIHRpbWVzIGRlZmllbmQgLT4gZGVmaW5lZC4KLQotCSogdGV4dGRvbWFpbi5jOiBJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuCi0JY29tcGlsaW5nIGZvciBnbGliYy4gIEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKLQl1bmNvbmRpdGlvbmFsbHkgaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogbG9jYWxlYWxpYXMuYywgbG9hZG1zZ2NhdC5jOiBQcmVwYXJlIHRvIGJlIGNvbXBpbGVkIGluIGdsaWJjLgotCi0JKiBnZXR0ZXh0LmM6Ci0JSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgotCUdldCBOVUxMIGZyb20gc3RkZGVmLmggaWYgd2UgY29tcGlsZSBmb3IgZ2xpYmMuCi0KLQkqIGZpbmRkb21haW4uYzogSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbgotCWNvbXBpbGluZyBmb3IgZ2xpYmMuICBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCi0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGRjZ2V0dGV4dC5jOiBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzIHVuY29uZGl0aW9uYWxseQotCWlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGRnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKLQlsaWJnZXR0ZXh0LmguCi0JKGxvY2FsZS5oKTogRG9uJ3QgcmVseSBvbiBIQVZFX0xPQ0FMRV9IIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KLQotCSogZGNnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKLQlsaWJnZXR0ZXh0LmguCi0JKGdldGN3ZCk6IERvbid0IHJlbHkgb24gSEFWRV9HRVRDV0Qgd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgotCi0JKiBiaW5kdGV4dGRvbS5jOgotCUlmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oLgotCi1Nb24gU2VwIDI1IDIyOjIzOjA2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMpOiBEb24ndCBjYWxsIGJzZWFyY2ggaWYgTk1BUCA8PSAwLgotCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKLQlTdHJpbmcgdXNlZCBpbiBwdXRlbnYgbXVzdCBub3QgYmUgcmVjeWNsZWQuCi0JUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGxpYmdldHRleHQuaCAoX19VU0VfR05VX0dFVFRFWFQpOgotCUFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSBHTlUgZ2V0dGV4dAotCWxpYnJhcnkuCi0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOgotCUZpeCBidWcgd2l0aCB0aGUgc3RyYW5nZSBzdHBjcHkgcmVwbGFjZW1lbnQuCi0JUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi1TYXQgU2VwIDIzIDA4OjIzOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGNhdC1jb21wYXQuYzogSW5jbHVkZSA8c3RyaW5nLmg+IGZvciBzdHBjcHkgcHJvdG90eXBlLgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCVdoaWxlIGV4cGFuZCBzdHJkdXAgY29kZSB0ZW1wb3JhcnkgdmFyaWFibGUgYGNwJyBoaWRlZAotCWhpZ2hlciBsZXZlbCB2YXJpYWJsZSB3aXRoIHNhbWUgbmFtZS4gIFJlbmFtZSB0byBgdHAnLgotCi0JKiB0ZXh0ZG9tYWluLmMgKHRleHRkb21haW4pOgotCUF2b2lkIHdhcm5pbmcgYnkgdXNpbmcgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIHN0cmR1cCBjb2RlLgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGFwcGxpY2F0aW9uJy4KLQotVGh1IFNlcCAyMSAxNTo1MTo0NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKLQlVc2Ugc3RyY2FzZWNtcCgpIG9ubHkgaWYgYXZhaWxhYmxlLiAgRWxzZSB1c2UKLQlpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZS4KLQotCSogaW50bC1jb21wYXQuYzoKLQlXcmFwcGVyIGZ1bmN0aW9ucyBub3cgY2FsbCAqX18gZnVuY3Rpb25zIGluc3RlYWQgb2YgX18qLgotCi0JKiBsaWJnZXR0ZXh0Lmg6IERlY2xhcmUgcHJvdG90eXBlcyBmb3IgKl9fIGZ1bmN0aW9ucyBpbnN0ZWFkIGZvciBfXyouCi0KLQkqIGNhdC1jb21wYXQuYywgbG9hZG1zZ2NhdC5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCi0JKiBiaW5kdGV4dGRvbS5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCVJlbmFtZSB0byBiaW5kdGV4dGRvbWFpbl9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCi0KLQkqIGRnZXR0ZXh0LmM6Ci0JUmVuYW1lIGZ1bmN0aW9uIHRvIGRnZXR0ZXh0X18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KLQotCSogZ2V0dGV4dC5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCUZ1bmN0aW9ucyBub3cgY2FsbGVkIGdldHRleHRfXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgotCi0JKiBkY2dldHRleHQuYywgbG9jYWxlYWxpYXMuYywgdGV4dGRvbWFpbi5jLCBmaW5kZG9tYWluLmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0KLVN1biBTZXAgMTcgMjM6MTQ6NDkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jOiBDb3JyZWN0IHNvbWUgYnVncyBpbiBoYW5kbGluZyBvZiBDRU4gc3RhbmRhcmQKLSAJbG9jYWxlIGRlZmluaXRpb25zLgotCi1UaHUgU2VwICA3IDAxOjQ5OjI4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYzogSW1wbGVtZW50IENFTiBzeW50YXguCi0KLQkqIGdldHRleHRQLmggKGxvYWRlZF9kb21haW4pOiBFeHRlbmQgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgdG8gMzEuCi0KLVNhdCBBdWcgMTkgMTk6MjU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsaWFzcGF0aCk6IFJlbW92ZSBwYXRoIHRvIFgxMSBsb2NhbGUgZGlyLgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSBpbnN0YWxsLXNyYyBkZXBlbmQgb24gaW5zdGFsbC4gIFRoaXMgaGVscHMKLSAJZ2V0dGV4dCB0byBpbnN0YWxsIHRoZSBzb3VyY2VzIGFuZCBvdGhlciBwYWNrYWdlcyBjYW4gdXNlIHRoZQotIAlpbnN0YWxsIGdvYWwuCi0KLVNhdCBBdWcgMTkgMTU6MTk6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IFJlbW92ZSBzdHVmZiBpbnN0YWxsZWQgYnkgaW5zdGFsbC1zcmMuCi0KLVR1ZSBBdWcgMTUgMTM6MTM6NTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogVkVSU0lPTi5pbjogSW5pdGlhbCByZXZpc2lvbi4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6Ci0JQWRkIFZFUlNJT04gZmlsZS4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgZ2V0dGV4dCwgYnV0Ci0JZm9yIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoaXMgbGlicmFyeS4KLQotVHVlIEF1ZyAxNSAwNjoxNjo0NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBnZXR0ZXh0UC5oIChfbmxfZmluZF9kb21haW4pOgotCU5ldyBwcm90b3R5cGUgYWZ0ZXIgY2hhbmdpbmcgc2VhcmNoIHN0cmF0ZWd5LgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JV2Ugbm93IHRyeSBvbmx5IHRvIGZpbmQgYSBzcGVjaWZpZWQgY2F0YWxvZy4gIEZhbGwgYmFjayB0byBvdGhlcgotCWNhdGFsb2dzIGxpc3RlZCBpbiB0aGUgbG9jYWxlIGxpc3QgaXMgbm93IGRvbmUgaW4gX19kY2dldHRleHQuCi0KLQkqIGRjZ2V0dGV4dC5jIChfX2RjZ2V0dGV4dCk6Ci0JTm93IHdlIHByb3ZpZGUgbWVzc2FnZSBmYWxsIGJhY2sgZXZlbiB0byBkaWZmZXJlbnQgbGFuZ3VhZ2VzLgotCUkuZS4gaWYgYSBtZXNzYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gb25lIGxhbmd1YWdlIGFsbCB0aGUgb3RoZXIKLSAJaW4gdGhlIGxvY2FsZSBsaXN0IGEgdHJpZWQuICBGb3JtZXJseSBmYWxsIGJhY2sgd2FzIG9ubHkgcG9zc2libGUKLSAJd2l0aGluIG9uZSBsYW5ndWFnZS4gIEltcGxlbWVudGVkIGJ5IG1vdmluZyBvbmUgbG9vcCBmcm9tCi0gCV9ubF9maW5kX2RvbWFpbiB0byBoZXJlLgotCi1Nb24gQXVnIDE0IDIzOjQ1OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKToKLQlEaXJlY3Rvcnkgd2hlcmUgc291cmNlIG9mIEdOVSBnZXR0ZXh0IGxpYnJhcnkgYXJlIG1hZGUKLQlhdmFpbGFibGUuCi0JKElOU1RBTEwsIElOU1RBTExfREFUQSk6IFByb2dyYW1zIHVzZWQgZm9yIGluc3RhbGxpbmcgc291cmNlcy4KLQkoZ2V0dGV4dC1zcmMpOiBOZXcuICBSdWxlIHRvIGluc3RhbGwgR05VIGdldHRleHQgc291cmNlcyBmb3IgdXNlIGluCi0JZ2V0dGV4dGl6ZSBzaGVsbCBzY3JpcHQuCi0KLVN1biBBdWcgMTMgMTQ6NDA6NDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOgotCVVzZSBtbWFwIGZvciBsb2FkaW5nIG9ubHkgd2hlbiBtdW5tYXAgZnVuY3Rpb24gaXMKLQlhbHNvIGF2YWlsYWJsZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgb24gYGFsbCcgZ29hbC4KLQotV2VkIEF1ZyAgOSAxMTowNDozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCURvIG5vdCBvdmVyd3JpdGUgJ1xuJyB3aGVuIHRlcm1pbmF0aW5nIGFsaWFzIHZhbHVlIHN0cmluZy4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlIYW5kbGUgbG9uZyBsaW5lcy4gIElnbm9yZSB0aGUgcmVzdCBub3QgZml0dGluZyBpbgotCXRoZSBidWZmZXIgYWZ0ZXIgdGhlIGluaXRpYWwgYGZnZXRzJyBjYWxsLgotCi1XZWQgQXVnICA5IDAwOjU0OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGdldHRleHRQLmggKF9ubF9sb2FkX2RvbWFpbik6Ci0JQWRkIHByb3RvdHlwZSwgcmVwbGFjaW5nIHByb3RvdHlwZSBmb3IgX25sX2xvYWRfbXNnX2NhdC4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCVJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZSBmaWxlbmFtZSBhbmQgZmlsZW5hbWVfbGVuLgotCShleHBhbmRfYWxpYXMpOiBSZW1vdmUgcHJvdG90eXBlIGJlY2F1c2UgZnVuY3Rpb25zIGRvZXMgbm90Ci0gCWV4aXN0IGFueW1vcmUuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JQ2hhbmdlIHR5cGUgb2YgZm5hbWVfbGVuIHBhcmFtZXRlciB0byBpbnQuCi0JKHhtYWxsb2MpOiBBZGQgcHJvdG90eXBlLgotCi0JKiBsb2FkbXNnY2F0LmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jLgotCi1UdWUgQXVnICA4IDIyOjMwOjM5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlBbGxvdyBhbGlhcyBuYW1lIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGZvdXIgY29tcG9uZW50cy4KLQotCSogTWFrZWZpbGUuaW4gKGFsaWFzcGF0aCk6IE5ldyB2YXJpYWJsZS4gIFNldCB0byBwcmVsaW1pbmFyeSB2YWx1ZS4KLQkoU09VUkNFUyk6IEFkZCBsb2NhbGVhbGlhcy5jLgotCShPQkpFQ1RTKTogQWRkIGxvY2FsZWFsaWFzLm8uCi0KLQkqIGdldHRleHRQLmg6IEFkZCBwcm90b3R5cGUgZm9yIF9ubF9leHBhbmRfYWxpYXMuCi0KLQkqIGZpbmRkb21haW4uYzogQWxpYXNpbmcgaGFuZGxlZCBpbiBpbnRsL2xvY2FsZWFsaWFzLmMuCi0KLQkqIGxvY2FsZWFsaWFzLmM6IEFsaWFzaW5nIGZvciBsb2NhbGUgbmFtZXMuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jIGFuZCB4c3RyZHVwLgotCi1Nb24gQXVnICA3IDIzOjQ3OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBnZXR0ZXh0LnBlcmwgaXMgbm93IGZvdW5kIGluIG1pc2MvLgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKLQlDb3JyZWN0IGltcGxlbWVudGF0aW9uLiAgZGlybmFtZSBwYXJhbWV0ZXIgd2FzIG5vdCB1c2VkLgotCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBnZXR0ZXh0UC5oIChsb2FkZWRfZG9tYWluKToKLQlOZXcgZmllbGRzIGBzdWNjZXNzb3InIGFuZCBgZGVjaWRlZCcgZm9yIG9vLCBsYXp5Ci0JbWVzc2FnZSBoYW5kbGluZyBpbXBsZW1lbnRhdGlvbi4KLQotCSogZGNnZXR0ZXh0LmM6Ci0JQWRvcHQgZm9yIG9vLCBsYXp5IG1lc3NhZ2UgaGFuZGxpaW5nLgotICAJTm93IHdlIGNhbiBpbmhlcml0IHRyYW5zbGF0aW9ucyBmcm9tIGxlc3Mgc3BlY2lmaWMgbG9jYWxlcy4KLQkoZmluZF9tc2cpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGxvYWRtc2djYXQuYywgZmluZGRvbWFpbi5jOgotCUNvbXBsZXRlIHJld3JpdGUuICBJbXBsZW1lbnQgb28sIGxhenkgbWVzc2FnZSBoYW5kbGluZyA6LSkuCi0gIAlXZSBub3cgaGF2ZSBhbiBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlIGBMQU5HVUFHRScgd2l0aAotIAlhIGhpZ2hlciBwcmlvcml0eSB0aGFuIExDX0FMTCBmb3IgdGhlIExDX01FU1NBR0UgbG9jYWxlLgotICAJSGVyZSB3ZSBjYW4gc2V0IGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2Ygc3BlY2lmaWNhdGlvbnMgZWFjaAotIAlvZiB0aGUgZm9ybSBgbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0nLgotCi1TYXQgQXVnICA1IDA5OjU1OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAodW5pc3RkLmgpOgotCUluY2x1ZGUgdG8gZ2V0IF9QQ19QQVRIX01BWCBkZWZpbmVkIG9uIHN5c3RlbSBoYXZpbmcgaXQuCi0KLUZyaSBBdWcgIDQgMjI6NDI6MDAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOiBJbmNsdWRlIHByb3RvdHlwZS4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBSZW1vdmUgYGNvcHlpbmcgaW5zdGVhZCcgbWVzc2FnZS4KLQotV2VkIEF1ZyAgMiAxODo1MjowMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoSUQsIFRBR1MpOiBEbyBub3QgdXNlICReLgotCi1UdWUgQXVnICAxIDIwOjA3OjExIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChUQUdTLCBJRCk6IFVzZSAkXiBhcyBjb21tYW5kIGFyZ3VtZW50LgotCShUQUdTKTogR2l2ZSBldGFncyAtbyBvcHRpb24gdCB3cml0ZSB0byBjdXJyZW50IGRpcmVjdG9yeSwKLSAJbm90ICQoc3JjZGlyKS4KLQkoSUQpOiBVc2UgJChzcmNkaXIpIGluc3RlYWQgb3MgJCh0b3Bfc3JjZGlyKS9zcmMuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBJRC4KLQotU3VuIEp1bCAzMCAxMTo1MTo0NiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoZ251bG9jYWxlZGlyKToKLQlOZXcgdmFyaWFibGUsIGFsd2F5cyB1c2luZyBzaGFyZS8gZm9yIGRhdGEgZGlyZWN0b3J5LgotCShERUZTKTogQWRkIEdOVUxPQ0FMRURJUiwgdXNlZCBpbiBmaW5kZG9tYWluLmMuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2RlZmF1bHRfZGlybmFtZSk6Ci0JU2V0IHRvIEdOVUxPQ0FMRURJUiwgYmVjYXVzZSBpdCBhbHdheXMgaGFzIHRvIHBvaW50Ci0JdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBHTlUgZ2V0dGV4dCBMaWJyYXJ5IHdyaXRlcyBpdCB0by4KLQotCSogaW50bC1jb21wYXQuYyAodGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOgotCVVuZGVmaW5lIG1hY3JvcyBiZWZvcmUgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLQotU2F0IEp1bCAyMiAwMToxMDowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJnZXR0ZXh0LmggKF9MSUJJTlRMX0gpOgotCVByb3RlY3QgZGVmaW5pdGlvbiBpbiBjYXNlIHdoZXJlIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBhcwotCWxpYmdldHRleHQuaCBvbiBTb2xhcmlzIG1hY2hpbmVzLiAgQWRkIGNvbW1lbnQgYWJvdXQgdGhpcy4KLQotV2VkIEp1bCAxOSAwMjozNjo0MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBpbnRsLWNvbXBhdC5jICh0ZXh0ZG9tYWluKTogQ29ycmVjdCB0eXBvLgotCi1XZWQgSnVsIDE5IDAxOjUxOjM1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGRjZ2V0dGV4dC5jIChkY2dldHRleHQpOiBGdW5jdGlvbiBub3cgY2FsbGVkIF9fZGNnZXR0ZXh0LgotCi0JKiBkZ2V0dGV4dC5jIChkZ2V0dGV4dCk6IE5vdyBjYWxsZWQgX19kZ2V0dGV4dCBhbmQgY2FsbHMKLSAJX19kY2dldHRleHQuCi0KLQkqIGdldHRleHQuYyAoZ2V0dGV4dCk6Ci0JRnVuY3Rpb24gbm93IGNhbGxlZCBfX2dldHRleHQgYW5kIGNhbGxzIF9fZGdldHRleHQuCi0KLQkqIHRleHRkb21haW4uYyAodGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQgX190ZXh0ZG9tYWluLgotCi0JKiBiaW5kdGV4dGRvbS5jIChiaW5kdGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQKLSAJX19iaW5kdGV4dGRvbWFpbi4KLQotCSogaW50bC1jb21wYXQuYzogSW5pdGlhbCByZXZpc2lvbi4KLQotCSogTWFrZWZpbGUuaW4gKFNPVVJDRVMpOiBBZGQgaW50bC1jb21wYXQuYy4KLQkoT0JKRUNUUyk6IFdlIGFsd2F5cyBjb21waWxlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGZ1bmN0aW9ucy4KLSAgCU9CSkVDVFMgY29udGFpbnMgYWxsIG9iamVjdHMgYnV0IGNhdC1jb21wYXQubywgLi4vcG8vY2F0LWlmLXRibC5vLAotIAlhbmQgaW50bC1jb21wYXQuby4KLSAgCShHRVRUT0JKUyk6IENvbnRhaW5zIG5vdyBvbmx5IGludGwtY29tcGF0Lm8uCi0KLQkqIGxpYmdldHRleHQuaDoKLQlSZS1pbmNsdWRlIHByb3RlY3Rpb24gbWF0Y2hlcyBkdWFsaXN0aWMgY2hhcmFjdGVyIG9mIGxpYmdldHRleHQuaC4KLQlGb3IgYWxsIGZ1bmN0aW9ucyBpbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGRlZmluZSBfXyBjb3VudGVyIHBhcnQuCi0KLQkqIGZpbmRkb21haW4uYyAoc3RyY2hyKTogRGVmaW5lIGFzIGluZGV4IGlmIG5vdCBmb3VuZCBpbiBDIGxpYnJhcnkuCi0JKF9ubF9maW5kX2RvbWFpbik6IEZvciByZWxhdGl2ZSBwYXRocyBwYXN0ZSAvIGluIGJldHdlZW4uCi0KLVR1ZSBKdWwgMTggMTY6Mzc6NDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jLCBmaW5kZG9tYWluLmM6IEFkZCBpbmNsdXNpb24gb2Ygc3lzL3R5cGVzLmguCi0KLQkqIHhvcGVuLW1zZy5zZWQ6IEZpeCBidWcgd2l0aCBgbXNnc3RyICIiJyBsaW5lcy4KLQlBIGxpdHRsZSBiaXQgYmV0dGVyIGNvbW1lbnRzLgotCi1UdWUgSnVsIDE4IDAxOjE4OjI3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluOgotCXBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCBhcmUgbm93IGZvdW5kIGluIC4uL21pc2MuCi0KLQkqIHBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCwgZWxpc3AtY29tcDoKLQlNb3ZlZCB0byAuLi9taXNjLy4KLQotCSogbGliZ2V0dGV4dC5oLCBnZXR0ZXh0UC5oLCBnZXR0ZXh0Lmg6IFVuaWZvcm0gdGVzdCBmb3IgX19TVERDX18uCi0KLVN1biBKdWwgMTYgMjI6MzM6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwsIElOU1RBTExfREFUQSk6IE5ldyB2YXJpYWJsZXMuCi0JKGluc3RhbGwtZGF0YSwgdW5pbnN0YWxsKTogSW5zdGFsbC91bmluc3RhbGwgLmVsYyBmaWxlLgotCi0JKiBwby1tb2RlLmVsIChJbnN0YWxsYXRpb24gY29tbWVudCk6Ci0JQWRkIC5wb3ggYXMgcG9zc2libGUgZXh0ZW5zaW9uIG9mIC5wbyBmaWxlcy4KLQotU3VuIEp1bCAxNiAxMzoyMzoyNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBlbGlzcC1jb21wOiBDb21wbGV0ZSBuZXcgdmVyc2lvbiBieSBGcmFuYyxvaXM6IFRoaXMgZG9lcyBub3QKLSAJZmFpbCB3aGVuIG5vdCBjb21waWxpbmcgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0KLVN1biBKdWwgMTYgMDA6MTI6MTcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKC4uL3BvL2NhdC1pZC10Ymwubyk6Ci0JVXNlICQoTUFLRSkgaW5zdGVhZCBvZiBtYWtlIGZvciByZWN1cnNpdmUgbWFrZS4KLQotCSogTWFrZWZpbGUuaW4gKC5lbC5lbGMpOiBVc2UgJChTSEVMTCkgaW5zdGVhZCBvZiAvYmluL3NoLgotCShpbnN0YWxsLWV4ZWMpOiBBZGQgbWlzc2luZyBkdW1teSBnb2FsLgotCShpbnN0YWxsLWRhdGEsIHVuaW5zdGFsbCk6IEAgaW4gbXVsdGktbGluZSBzaGVsbCBjb21tYW5kIGF0Ci0gCWJlZ2lubmluZywgbm90IGluIGZyb250IG9mIGVjaG8uICBSZXBvcnRlZCBieSBFcmljIEJhY2t1cy4KLQotU2F0IEp1bCAxNSAwMDoyMToyOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKToKLQlSZW5hbWUgbGliZ2V0dGV4dC5wZXJsIHRvIGdldHRleHQucGVybCB0byBmaXQgaW4gMTQgY2hhcnMKLQlmaWxlIHN5c3RlbXMuCi0KLQkqIGdldHRleHQucGVybDoKLSAJUmVuYW1lIHRvIGdldHRleHQucGVybCB0byBmaXQgaW4gMTQgY2hhcnMgZmlsZSBzeXN0ZW1zLgotCi1UaHUgSnVsIDEzIDIzOjE3OjIwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGNhdC1jb21wYXQuYzogSWYgIVNURENfSEVBREVSUyB0cnkgdG8gaW5jbHVkZSBtYWxsb2MuaC4KLQotVGh1IEp1bCAxMyAyMDo1NTowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBwbzJ0Ymwuc2VkLmluOiBQcmV0dHkgcHJpbnRpbmcuCi0KLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6Ci0JQ29ycmVjdCBidWdzIHdpdGggaGFuZGxpbmcgc3Vic3RpdHV0ZSBmbGFncyBpbiBicmFuY2hlcy4KLQotCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOgotCU9sZCBLJlIgY29tcGlsZXJzIGRvbid0IHVuZGVyIHN0YW5kIGB1bnNpZ25lZCBjaGFyJy4KLQotCSogZ2V0dGV4dC5oIChubHNfdWludDMyKToKLQlTb21lIG9sZCBLJlIgY29tcGlsZXJzIChlZyBIUCkgZG9uJ3QgdW5kZXJzdGFuZCBgdW5zaWduZWQgaW50Jy4KLQotCSogY2F0LWNvbXBhdC5jIChtc2dfdG9fY2F0X2lkKTogRGUtQU5TSS1meSBwcm90b3R5cGVzLgotCi1UaHUgSnVsIDEzIDAxOjM0OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChFTENGSUxFUyk6IE5ldyB2YXJpYWJsZS4KLQkoRElTVEZJTEVTKTogQWRkIGVsaXNwLWNvbXAuCi0JQWRkIGltcGxpY2l0IHJ1bGUgZm9yIC5lbCAtPiAuZWxjIGNvbXBpbGF0aW9uLgotCShpbnN0YWxsLWRhdGEpOiBpbnN0YWxsICRFTENGSUxFUwotCShjbGVhbik6IHJlbmFtZWQgcG8tdG8tdGJsIGFuZCBwby10by1tc2cgdG8gcG8ydGJsIGFuZCBwbzJtc2cgcmVzcC4KLQotCSogZWxpc3AtY29tcDogSW5pdGlhbCByZXZpc2lvbgotCi1XZWQgSnVsIDEyIDE2OjE0OjUyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluOgotCWNhdC1pZC10YmwuYyBpcyBub3cgZm91bmQgaW4gcG8vLiAgVGhpcyBlbmFibGVzIHVzIHRvIHVzZSBhbiBpZGVudGljYWwKLQlpbnRsLyBkaXJlY3RvcnkgaW4gYWxsIHBhY2thZ2VzLgotCi0JKiBkY2dldHRleHQuYyAoZGNnZXR0ZXh0KTogaGFzaGluZyBkb2VzIG5vdCB3b3JrIGZvciB0YWJsZSBzaXplIDw9IDIuCi0KLQkqIHRleHRkb21haW4uYzogZml4IHR5cG8gKCNpZiBkZWYgLT4gI2lmIGRlZmluZWQpCi0KLVR1ZSBKdWwgMTEgMTg6NDQ6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWNhdC1pZCk6IHVzZSB0b3Bfc3JjZGlyIHRvIGFkZHJlc3Mgc291cmNlIGZpbGVzCi0JKERJU1RGSUxFUyxkaXN0Y2xlYW4pOiBtb3ZlIHR1cGRhdGUucGVybCB0byBzcmMvCi0KLQkqIHBvLXRvLXRibC5zZWQuaW46Ci0JYWRkIGFkZGl0aW9uYWwganVtcCB0byBjbGVhciBjaGFuZ2UgZmxhZyB0byByZWNvZ25pemUgbXVsdGlsaW5lIHN0cmluZ3MKLQotVHVlIEp1bCAxMSAwMTozMjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiB0ZXh0ZG9tYWluLmM6IFByb3RlY3QgaW5jbHVzaW9uIG9mIHN0ZGxpYi5oIGFuZCBzdHJpbmcuaC4KLQotCSogbG9hZG1zZ2NhdC5jOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBzdGRsaWIuaC4KLQotCSogbGliZ2V0dGV4dC5oOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBsb2NhbGUuaC4KLQlBbGxvdyB1c2UgaW4gQysrIHByb2dyYW1zLgotCURlZmluZSBOVUxMIGlzIG5vdCBoYXBwZW5lZCBhbHJlYWR5LgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogc2hpcCBwby10by10Ymwuc2VkLmluIGluc3RlYWQgb2YKLQlwby10by10Ymwuc2VkLgotCShkaXN0Y2xlYW4pOiByZW1vdmUgcG8tdG8tdGJsLnNlZCBhbmQgdHVwZGF0ZS5wZXJsLgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IFN1YnN0aXR1dGUgUGVybCBwYXRoIGV2ZW4gaW4gZXhlYyBsaW5lLgotCURvbid0IGluY2x1ZGUgZW50cmllcyB3aXRob3V0IHRyYW5zbGF0aW9uIGZyb20gb2xkIC5wbyBmaWxlLgotCi1UdWUgSnVsICA0IDAwOjQxOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHR1cGRhdGUucGVybC5pbjogdXNlICJVcGRhdGVkOiAiIGluIG1zZ2lkICIiLgotCi0JKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvIChMT0NBTERJUiAtPiBMT0NBTEVESVIpLgotIAlEZWZpbmUgZ2V0ZW52IGlmICFfX1NURENfXy4KLQotCSogYmluZHRleHRkb20uYzogUHJvdGVjdCBzdGRsaWIuaCBhbmQgc3RyaW5nLmggaW5jbHVzaW9uLgotIAlEZWZpbmUgZnJlZSBpZiAhX19TVERDX18uCi0KLQkqIGZpbmRkb21haW4uYzogQ2hhbmdlIERFRl9NU0dfRE9NX0RJUiB0byBMT0NBTEVESVIuCi0gCURlZmluZSBmcmVlIGlmICFfX1NURENfXy4KLQotCSogY2F0LWNvbXBhdC5jOiBDaGFuZ2UgREVGX01TR19ET01fRElSIHRvIExPQ0FMRURJUi4KLQotTW9uIEp1bCAgMyAyMzo1NjozMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbjogVXNlIExPQ0FMRURJUiBpbnN0ZWFkIG9mIERFRl9NU0dfRE9NX0RJUi4KLQlSZW1vdmUgdW5uZWVkZWQgJChzcmNkaXIpIGZyb20gTWFrZWZpbGUuaW4gZGVwZW5kZW5jeS4KLQotCSogbWFrZWxpbmtzOiBBZGQgY29weXJpZ2h0IGFuZCBzaG9ydCBkZXNjcmlwdGlvbi4KLQotCSogcG8tbW9kZS5lbDogTGFzdCB2ZXJzaW9uIGZvciAwLjcuCi0KLQkqIHR1cGRhdGUucGVybC5pbjogRml4IGRpZSBtZXNzYWdlLgotCi0JKiBkY2dldHRleHQuYzogUHJvdGVjdCBpbmNsdWRlIG9mIHN0cmluZy5oLgotCi0JKiBnZXR0ZXh0LmM6IFByb3RlY3QgaW5jbHVkZSBvZiBzdGRsaWIuaCBhbmQgZnVydGhlciB0cmllcyB0byBnZXQgTlVMTC4KLQotCSogZmluZGRvbWFpbi5jOiBTb21lIGNvcnJlY3Rpb25zIGluIGluY2x1ZGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBQcnVuZSBsaXN0IGNvcnJlY3QgcGF0aCB0byBNYWtlZmlsZS5pbi4KLQotCSogcG8tdG8tdGJsLnNlZDogQWRvcHQgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCi0KLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6IEFkb3B0IGZvciBuZXcgLnBvIGZpbGUgZm9ybWF0LgotCi1TdW4gSnVsICAyIDIzOjU1OjAzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHR1cGRhdGUucGVybC5pbjogQ29tcGxldGUgcmV3cml0ZSBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KLQotU3VuIEp1bCAgMiAwMjowNjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBGaXJzdCBvZmZpY2lhbCByZWxlYXNlLiAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYWxsIHRoZSBjb2RlCi0JbmVlZGVkIHRvIGludGVybmF0aW9uYWxpemUgb3duIHBhY2thZ2VzLiAgSXQgcHJvdmlkZXMgZnVuY3Rpb25zCi0Jd2hpY2ggYWxsb3cgdG8gdXNlIHRoZSBYL09wZW4gY2F0Z2V0cyBmdW5jdGlvbiB3aXRoIGFuIGludGVyZmFjZQotCWxpa2UgdGhlIFVuaWZvcnVtIGdldHRleHQgZnVuY3Rpb24uICBGb3Igc3lzdGVtIHdoaWNoIGRvZXMgbm90Ci0JaGF2ZSBuZWl0aGVyIG9mIHRob3NlIGEgY29tcGxldGUgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQuCmRpZmYgLS1naXQgYS9pbnRsL01ha2VmaWxlLmluIGIvaW50bC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2NDdkZS4uMDAwMDAwMAotLS0gYS9pbnRsL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIG1lc3NhZ2UgY2F0YWxvZyBoYW5kbGluZyBpbiBHTlUgTkxTIFV0aWxpdGllcy4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotdG9wX2J1aWxkZGlyID0gLi4KLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1saWJkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWIKLWluY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9IEBkYXRhZGlyQC9nZXR0ZXh0L2ludGwKLWFsaWFzcGF0aCA9ICQobG9jYWxlZGlyKTouCi1zdWJkaXIgPSBpbnRsCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLWwgPSBAbEAKLQotQVIgPSBhcgotQ0MgPSBAQ0NACi1MSUJUT09MID0gQExJQlRPT0xACi1SQU5MSUIgPSBAUkFOTElCQAotCi1ERUZTID0gLURMT0NBTEVESVI9XCIkKGxvY2FsZWRpcilcIiAtREdOVUxPQ0FMRURJUj1cIiQoZ251bG9jYWxlZGlyKVwiIFwKLS1ETE9DQUxFX0FMSUFTX1BBVEg9XCIkKGFsaWFzcGF0aClcIiBAREVGU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotSEVBREVSUyA9ICQoQ09NSERSUykgbGliZ2V0dGV4dC5oIGxvYWRpbmZvLmgKLUNPTUhEUlMgPSBnZXR0ZXh0LmggZ2V0dGV4dFAuaCBoYXNoLXN0cmluZy5oCi1TT1VSQ0VTID0gJChDT01TUkNTKSBpbnRsLWNvbXBhdC5jIGNhdC1jb21wYXQuYwotQ09NU1JDUyA9IGJpbmR0ZXh0ZG9tLmMgZGNnZXR0ZXh0LmMgZGdldHRleHQuYyBnZXR0ZXh0LmMgXAotZmluZGRvbWFpbi5jIGxvYWRtc2djYXQuYyBsb2NhbGVhbGlhcy5jIHRleHRkb21haW4uYyBsMTBuZmxpc3QuYyBcCi1leHBsb2RlbmFtZS5jCi1PQkpFQ1RTID0gQElOVExPQkpTQCBiaW5kdGV4dGRvbS4kbG8gZGNnZXR0ZXh0LiRsbyBkZ2V0dGV4dC4kbG8gZ2V0dGV4dC4kbG8gXAotZmluZGRvbWFpbi4kbG8gbG9hZG1zZ2NhdC4kbG8gbG9jYWxlYWxpYXMuJGxvIHRleHRkb21haW4uJGxvIGwxMG5mbGlzdC4kbG8gXAotZXhwbG9kZW5hbWUuJGxvCi1DQVRPQkpTID0gY2F0LWNvbXBhdC4kbG8gLi4vcG8vY2F0LWlkLXRibC4kbG8KLUdFVFRPQkpTID0gaW50bC1jb21wYXQuJGxvCi1ESVNURklMRVMuY29tbW9uID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluIGxpbnV4LW1zZy5zZWQgcG8ydGJsLnNlZC5pbiBcCi14b3Blbi1tc2cuc2VkICQoSEVBREVSUykgJChTT1VSQ0VTKQotRElTVEZJTEVTLm5vcm1hbCA9IFZFUlNJT04KLURJU1RGSUxFUy5nZXR0ZXh0ID0gbGliaW50bC5nbGliYyBpbnRsaC5pbnN0LmluCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLmxvCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkPAotCi1JTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKQotCi1hbGw6IGFsbC1AVVNFX0lOQ0xVREVEX0xJQklOVExACi0KLWFsbC15ZXM6IGxpYmludGwuJGxhIGludGxoLmluc3QKLWFsbC1ubzoKLWluc3RhbGwtaW5mbzoKLQotbGliaW50bC5hOiAkKE9CSkVDVFMpCi0Jcm0gLWYgJEAKLQkkKEFSKSBjcnUgJEAgJChPQkpFQ1RTKQotCSQoUkFOTElCKSAkQAotCi1saWJpbnRsLmxhOiAkKE9CSkVDVFMpCi0JJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKSAkKExERkxBR1MpIC1vICRAICQoT0JKRUNUUykgXAotCQkgICAtdmVyc2lvbi1pbmZvIDE6MCAtcnBhdGggJChsaWJkaXIpCi0KLS4uL3BvL2NhdC1pZC10YmwuJGxvOiAuLi9wby9jYXQtaWQtdGJsLmMgJCh0b3Bfc3JjZGlyKS9wby8kKFBBQ0tBR0UpLnBvdAotCWNkIC4uL3BvICYmICQoTUFLRSkgY2F0LWlkLXRibC4kbG8KLQotY2hlY2s6IGFsbAotCi0jIFRoaXMgaW5zdGFsbGF0aW9uIGdvYWwgaXMgb25seSB1c2VkIGluIEdOVSBnZXR0ZXh0LiAgUGFja2FnZXMgd2hpY2gKLSMgb25seSB1c2UgdGhlIGxpYnJhcnkgc2hvdWxkIHVzZSBpbnN0YWxsIGluc3RlYWQuCi0KLSMgV2UgbXVzdCBub3QgaW5zdGFsbCB0aGUgbGliaW50bC5oL2xpYmludGwuYSBmaWxlcyBpZiB3ZSBhcmUgb24gYQotIyBzeXN0ZW0gd2hpY2ggaGFzIHRoZSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCi0jIHNlcGFyYXRlIGxpYnJhcnkgb3IgdXNlIHRoZSBjYXRnZXRzIGludGVyZmFjZS4gIEEgc3BlY2lhbCBjYXNlIGlzCi0jIHdoZXJlIGNvbmZpZ3VyZSBmb3VuZCBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0jIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIHdoaWNoIGNvbWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZQotIyBwYWNrYWdlLCB5b3UgaGF2ZSB0byB1c2UgYGNvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCcuCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6IGFsbAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiIFwKLQkgICAmJiB0ZXN0ICdASU5UTE9CSlNAJyA9ICckKEdFVFRPQkpTKSc7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGxpYmRpcikgJChpbmNsdWRlZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGxpYmRpcikgJChpbmNsdWRlZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBpbnRsaC5pbnN0ICQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCi0JICAkKElOU1RBTExfREFUQSkgbGliaW50bC5hICQobGliZGlyKS9saWJpbnRsLmE7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLWluc3RhbGwtZGF0YTogYWxsCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKGdldHRleHRzcmNkaXIpL1ZFUlNJT047IFwKLQkgIGRpc3RzPSIkKERJU1RGSUxFUy5jb21tb24pIjsgXAotCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSAkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQlkaXN0cz0iJChESVNURklMRVMuY29tbW9uKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBybSAtZiAkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCWRvbmUKLQotaW5mbyBkdmk6Ci0KLSQoT0JKRUNUUyk6IGNvbmZpZy5oIGxpYmdldHRleHQuaAotYmluZHRleHRkb20uJGxvIGZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBsb2FkaW5mby5oCi1kY2dldHRleHQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBoYXNoLXN0cmluZy5oIGxvYWRpbmZvLmgKLQotdGFnczogVEFHUwotCi1UQUdTOiAkKEhFQURFUlMpICQoU09VUkNFUykKLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgZXRhZ3MgLW8gJCRoZXJlL1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0KLWlkOiBJRAotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0JaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIG1raWQgLWYkJGhlcmUvSUQgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0KLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgKi5hICoubyAqLmxvIGNvcmUgY29yZS4qCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgSUQgVEFHUyBwbzJtc2cuc2VkIHBvMnRibC5zZWQgbGliaW50bC5oIGNvbmZpZy5sb2cKLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLQotIyBHTlUgZ2V0dGV4dCBuZWVkcyBub3QgY29udGFpbiB0aGUgZmlsZSBgVkVSU0lPTicgYnV0IGNvbnRhaW5zIHNvbWUKLSMgb3RoZXIgZmlsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXN0cmlidXRlZCBpbiBvdGhlciBwYWNrYWdlcy4KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IE1ha2VmaWxlICQoRElTVEZJTEVTKQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gZ2V0dGV4dDsgdGhlbiBcCi0JICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5nZXR0ZXh0KSI7IFwKLQllbHNlIFwKLQkgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCi0JZmk7IFwKLQlmb3IgZmlsZSBpbiAkKERJU1RGSUxFUy5jb21tb24pICQkYWRkaXRpb25hbDsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotZGlzdC1saWJjOgotCXRhciB6Y3ZmIGludGwtZ2xpYmMudGFyLmd6ICQoQ09NU1JDUykgJChDT01IRFJTKSBsaWJpbnRsLmguZ2xpYmMKLQotTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKLQlDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRoZSBkZXBlbmRlbmN5IGZvciBpbnRsaC5pbnN0IGlzIGRpZmZlcmVudCBpbiBnZXR0ZXh0IGFuZCBhbGwgb3RoZXIKLSMgcGFja2FnZXMuICBCZWNhdXNlIHdlIGNhbm5vdCB5b3UgR05VIG1ha2UgZmVhdHVyZXMgd2UgaGF2ZSB0byBzb2x2ZQotIyB0aGUgcHJvYmxlbSB3aGlsZSByZXdyaXRpbmcgTWFrZWZpbGUuaW4uCi1AR1RfWUVTQGludGxoLmluc3Q6IGludGxoLmluc3QuaW4gLi4vY29uZmlnLnN0YXR1cwotQEdUX1lFU0AJY2QgLi4gXAotQEdUX1lFU0AJJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gXAotQEdUX1lFU0AJICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLUBHVF9OT0AuUEhPTlk6IGludGxoLmluc3QKLUBHVF9OT0BpbnRsaC5pbnN0OgotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9pbnRsL2FjY29uZmlnLmggYi9pbnRsL2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjgxZjguLjAwMDAwMDAKLS0tIGEvaW50bC9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvaW50bC9hY2xvY2FsLm00IGIvaW50bC9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU0MzlmLi4wMDAwMDAwCi0tLSBhL2ludGwvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMwotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX1BST0dfSU5TVEFMTCwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotQUNfU1VCU1QoSU5TVEFMTF9TQ1JJUFQpZG5sCi1dKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQpCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTKQotICAgIGZpCi0gIGZpXSkKLQpkaWZmIC0tZ2l0IGEvaW50bC9iaW5kdGV4dGRvbS5jIGIvaW50bC9iaW5kdGV4dGRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNiOGQ5Li4wMDAwMDAwCi0tLSBhL2ludGwvYmluZHRleHRkb20uYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmluZHRleHRkb21haW4oMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOwotCi0vKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucy4gICovCi1leHRlcm4gc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7Ci0KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBCSU5EVEVYVERPTUFJTiBfX2JpbmR0ZXh0ZG9tYWluCi0jIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQotI2Vsc2UKLSMgZGVmaW5lIEJJTkRURVhURE9NQUlOIGJpbmR0ZXh0ZG9tYWluX18KLSNlbmRpZgotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWNoYXIgKgotQklORFRFWFRET01BSU4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci17Ci0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotCi0gIC8qIFNvbWUgc2FuaXR5IGNoZWNrcy4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwgfHwgZG9tYWlubmFtZVswXSA9PSAnXDAnKQotICAgIHJldHVybiBOVUxMOwotCi0gIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCi0gICAgewotICAgICAgaW50IGNvbXBhcmUgPSBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPmRvbWFpbm5hbWUpOwotICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKLQkvKiBXZSBmb3VuZCBpdCEgICovCi0JYnJlYWs7Ci0gICAgICBpZiAoY29tcGFyZSA8IDApCi0JewotCSAgLyogSXQgaXMgbm90IGluIHRoZSBsaXN0LiAgKi8KLQkgIGJpbmRpbmcgPSBOVUxMOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZGlybmFtZSA9PSBOVUxMKQotICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KLSAgICByZXR1cm4gYmluZGluZyA9PSBOVUxMID8gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZSA6IGJpbmRpbmctPmRpcm5hbWU7Ci0KLSAgaWYgKGJpbmRpbmcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZG9tYWluIGlzIGFscmVhZHkgYm91bmQuICBJZiB0aGUgbmV3IHZhbHVlIGFuZCB0aGUgb2xkCi0JIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKLQkgb2xkIGJpbmRpbmcuICAqLwotICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgYmluZGluZy0+ZGlybmFtZSkgIT0gMCkKLQl7Ci0JICBjaGFyICpuZXdfZGlybmFtZTsKLQotCSAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKLQkgICAgbmV3X2Rpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotCSAgZWxzZQotCSAgICB7Ci0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0JICAgICAgbmV3X2Rpcm5hbWUgPSBzdHJkdXAgKGRpcm5hbWUpOwotCSAgICAgIGlmIChuZXdfZGlybmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotCSAgICAgIG5ld19kaXJuYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmIChuZXdfZGlybmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCSAgICAgIG1lbWNweSAobmV3X2Rpcm5hbWUsIGRpcm5hbWUsIGxlbik7Ci0jZW5kaWYKLQkgICAgfQotCi0JICBpZiAoYmluZGluZy0+ZGlybmFtZSAhPSBfbmxfZGVmYXVsdF9kaXJuYW1lKQotCSAgICBmcmVlIChiaW5kaW5nLT5kaXJuYW1lKTsKLQotCSAgYmluZGluZy0+ZGlybmFtZSA9IG5ld19kaXJuYW1lOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBiaW5kaW5nLiAgKi8KLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBzdHJ1Y3QgYmluZGluZyAqbmV3X2JpbmRpbmcgPQotCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld19iaW5kaW5nKSk7Ci0KLSAgICAgIGlmIChuZXdfYmluZGluZyA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0gICAgICBuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9IHN0cmR1cCAoZG9tYWlubmFtZSk7Ci0gICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0gICAgICBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKLSAgICAgIG5ld19iaW5kaW5nLT5kb21haW5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lLCBkb21haW5uYW1lLCBsZW4pOwotI2VuZGlmCi0KLSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIF9ubF9kZWZhdWx0X2Rpcm5hbWUpID09IDApCi0JbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotICAgICAgZWxzZQotCXsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLQkgIG5ld19iaW5kaW5nLT5kaXJuYW1lID0gc3RyZHVwIChkaXJuYW1lKTsKLQkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLSNlbHNlCi0JICBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLQkgIG5ld19iaW5kaW5nLT5kaXJuYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgaWYgKG5ld19iaW5kaW5nLT5kaXJuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCSAgbWVtY3B5IChuZXdfYmluZGluZy0+ZGlybmFtZSwgZGlybmFtZSwgbGVuKTsKLSNlbmRpZgotCX0KLQotICAgICAgLyogTm93IGVucXVldWUgaXQuICAqLwotICAgICAgaWYgKF9ubF9kb21haW5fYmluZGluZ3MgPT0gTlVMTAotCSAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZG9tYWluX2JpbmRpbmdzLT5kb21haW5uYW1lKSA8IDApCi0JewotCSAgbmV3X2JpbmRpbmctPm5leHQgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotCSAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IG5ld19iaW5kaW5nOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsKLQkgIHdoaWxlIChiaW5kaW5nLT5uZXh0ICE9IE5VTEwKLQkJICYmIHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+bmV4dC0+ZG9tYWlubmFtZSkgPiAwKQotCSAgICBiaW5kaW5nID0gYmluZGluZy0+bmV4dDsKLQotCSAgbmV3X2JpbmRpbmctPm5leHQgPSBiaW5kaW5nLT5uZXh0OwotCSAgYmluZGluZy0+bmV4dCA9IG5ld19iaW5kaW5nOwotCX0KLQotICAgICAgYmluZGluZyA9IG5ld19iaW5kaW5nOwotICAgIH0KLQotICByZXR1cm4gYmluZGluZy0+ZGlybmFtZTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fYmluZHRleHRkb21haW4sIGJpbmR0ZXh0ZG9tYWluKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9jYXQtY29tcGF0LmMgYi9pbnRsL2NhdC1jb21wYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZDkwMS4uMDAwMDAwMAotLS0gYS9pbnRsL2NhdC1jb21wYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKiBDb21wYXRpYmlsaXR5IGNvZGUgZm9yIGdldHRleHQtdXNpbmctY2F0Z2V0cyBpbnRlcmZhY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi1jaGFyICpnZXRlbnYgKCk7Ci0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX05MX1RZUEVTX0gKLSMgaW5jbHVkZSA8bmxfdHlwZXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mIGBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6Ci0gICBgYERpcmVjdHMgYHNldGxvY2FsZSgpJyB0byBxdWVyeSBgY2F0ZWdvcnknIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAgc2V0dGluZyBvZiBgbG9jYWwnLicnCi0gICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIEFuZCBldmVuIHdvcnNlOiBQT1NJWAotICAgZGVmaW5lcyB0aGlzIG5vdCBhdCBhbGwuICBTbyB3ZSBjYW4gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IG9uIHNlbGVjdGVkCi0gICBzeXN0ZW0gKGUuZy4gdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBIQVZFX0xPQ0FMRV9OVUxMCi0jZW5kaWYKLQotLyogVGhlIGNhdGFsb2cgZGVzY3JpcHRvci4gICovCi1zdGF0aWMgbmxfY2F0ZCBjYXRhbG9nID0gKG5sX2NhdGQpIC0xOwotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGNhdGFsb2cuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdF9jYXRhbG9nX25hbWVbXSA9ICJtZXNzYWdlcyI7Ci0KLS8qIE5hbWUgb2YgY3VycmVudGx5IHVzZWQgY2F0YWxvZy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY2F0YWxvZ19uYW1lID0gZGVmYXVsdF9jYXRhbG9nX25hbWU7Ci0KLS8qIEdldCBJRCBmb3IgZ2l2ZW4gc3RyaW5nLiAgSWYgbm90IGZvdW5kIHJldHVybiAtMS4gICovCi1zdGF0aWMgaW50IG1zZ190b19jYXRfaWQgUEFSQU1TICgoY29uc3QgY2hhciAqbXNnKSk7Ci0KLS8qIFN1YnN0aXR1dGlvbiBmb3Igc3lzdGVtcyBsYWNraW5nIHRoaXMgZnVuY3Rpb24gaW4gdGhlaXIgQyBsaWJyYXJ5LiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOwotI2VuZGlmCi0KLQotLyogU2V0IGN1cnJlbnRseSB1c2VkIGRvbWFpbi9jYXRhbG9nLiAgKi8KLWNoYXIgKgotdGV4dGRvbWFpbiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgbmxfY2F0ZCBuZXdfY2F0YWxvZzsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIHNpemVfdCBuZXdfbmFtZV9sZW47Ci0gIGNoYXIgKmxhbmc7Ci0KLSNpZiBkZWZpbmVkIEhBVkVfU0VUTE9DQUxFICYmIGRlZmluZWQgSEFWRV9MQ19NRVNTQUdFUyBcCi0gICAgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCi0gIGxhbmcgPSBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCBOVUxMKTsKLSNlbHNlCi0gIGxhbmcgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgaWYgKGxhbmcgPT0gTlVMTCB8fCBsYW5nWzBdID09ICdcMCcpCi0gICAgewotICAgICAgbGFuZyA9IGdldGVudiAoIkxDX01FU1NBR0VTIik7Ci0gICAgICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLQlsYW5nID0gZ2V0ZW52ICgiTEFORyIpOwotICAgIH0KLSNlbmRpZgotICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLSAgICBsYW5nID0gIkMiOwotCi0gIC8qIFNlZSB3aGV0aGVyIG5hbWUgb2YgY3VycmVudGx5IHVzZWQgZG9tYWluIGlzIGFza2VkLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gKGNoYXIgKikgY2F0YWxvZ19uYW1lOwotCi0gIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcpCi0gICAgZG9tYWlubmFtZSA9IGRlZmF1bHRfY2F0YWxvZ19uYW1lOwotCi0gIC8qIENvbXB1dGUgbGVuZ3RoIG9mIGFkZGVkIHBhdGggZWxlbWVudC4gICovCi0gIG5ld19uYW1lX2xlbiA9IHNpemVvZiAoTE9DQUxFRElSKSAtIDEgKyAxICsgc3RybGVuIChsYW5nKQotCQkgKyBzaXplb2YgKCIvTENfTUVTU0FHRVMvIikgLSAxICsgc2l6ZW9mIChQQUNLQUdFKSAtIDEKLQkJICsgc2l6ZW9mICgiLmNhdCIpOwotCi0gIG5ld19uYW1lID0gKGNoYXIgKikgbWFsbG9jIChuZXdfbmFtZV9sZW4pOwotICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld19uYW1lLCBQQUNLQUdFKTsKLSAgbmV3X2NhdGFsb2cgPSBjYXRvcGVuIChuZXdfbmFtZSwgMCk7Ci0KLSAgaWYgKG5ld19jYXRhbG9nID09IChubF9jYXRkKSAtMSkKLSAgICB7Ci0gICAgICAvKiBOTFNQQVRIIHNlYXJjaCBkaWRuJ3Qgd29yaywgdHJ5IGFic29sdXRlIHBhdGggKi8KLSAgICAgIHNwcmludGYgKG5ld19uYW1lLCAiJXMvJXMvTENfTUVTU0FHRVMvJXMuY2F0IiwgTE9DQUxFRElSLCBsYW5nLAotCSAgICAgICBQQUNLQUdFKTsKLSAgICAgIG5ld19jYXRhbG9nID0gY2F0b3BlbiAobmV3X25hbWUsIDApOwotCi0gICAgICBpZiAobmV3X2NhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQotCXsKLQkgIGZyZWUgKG5ld19uYW1lKTsKLQkgIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci0JfQotICAgIH0KLQotICAvKiBDbG9zZSBvbGQgY2F0YWxvZy4gICovCi0gIGlmIChjYXRhbG9nICE9IChubF9jYXRkKSAtMSkKLSAgICBjYXRjbG9zZSAoY2F0YWxvZyk7Ci0gIGlmIChjYXRhbG9nX25hbWUgIT0gZGVmYXVsdF9jYXRhbG9nX25hbWUpCi0gICAgZnJlZSAoKGNoYXIgKikgY2F0YWxvZ19uYW1lKTsKLQotICBjYXRhbG9nID0gbmV3X2NhdGFsb2c7Ci0gIGNhdGFsb2dfbmFtZSA9IG5ld19uYW1lOwotCi0gIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci19Ci0KLWNoYXIgKgotYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci17Ci0jaWYgSEFWRV9TRVRFTlYgfHwgSEFWRV9QVVRFTlYKLSAgY2hhciAqb2xkX3ZhbCwgKm5ld192YWwsICpjcDsKLSAgc2l6ZV90IG5ld192YWxfbGVuOwotCi0gIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIGhlcmUgYnV0IHRvIGJlIGNvbXBhdGlibGUgZG8gaXQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENvbXB1dGUgbGVuZ3RoIG9mIGFkZGVkIHBhdGggZWxlbWVudC4gIElmIHdlIHVzZSBzZXRlbnYgd2UgZG9uJ3QgbmVlZAotICAgICB0aGUgZmlyc3QgYnl0cyBmb3IgTkxTUEFUSD0sIGJ1dCB3aHkgY29tcGxpY2F0ZSB0aGUgY29kZSBmb3IgdGhpcwotICAgICBwZWFudXRzLiAgKi8KLSAgbmV3X3ZhbF9sZW4gPSBzaXplb2YgKCJOTFNQQVRIPSIpIC0gMSArIHN0cmxlbiAoZGlybmFtZSkKLQkJKyBzaXplb2YgKCIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0KLSAgb2xkX3ZhbCA9IGdldGVudiAoIk5MU1BBVEgiKTsKLSAgaWYgKG9sZF92YWwgPT0gTlVMTCB8fCBvbGRfdmFsWzBdID09ICdcMCcpCi0gICAgewotICAgICAgb2xkX3ZhbCA9IE5VTEw7Ci0gICAgICBuZXdfdmFsX2xlbiArPSAxICsgc2l6ZW9mIChMT0NBTEVESVIpIC0gMQotCSAgICAgICAgICAgICArIHNpemVvZiAoIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBuZXdfdmFsX2xlbiArPSBzdHJsZW4gKG9sZF92YWwpOwotCi0gIG5ld192YWwgPSAoY2hhciAqKSBtYWxsb2MgKG5ld192YWxfbGVuKTsKLSAgaWYgKG5ld192YWwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotIyBpZiBIQVZFX1NFVEVOVgotICBjcCA9IG5ld192YWw7Ci0jIGVsc2UKLSAgY3AgPSBzdHBjcHkgKG5ld192YWwsICJOTFNQQVRIPSIpOwotIyBlbmRpZgotCi0gIGNwID0gc3RwY3B5IChjcCwgZGlybmFtZSk7Ci0gIGNwID0gc3RwY3B5IChjcCwgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQ6Iik7Ci0KLSAgaWYgKG9sZF92YWwgPT0gTlVMTCkKLSAgICB7Ci0jIGlmIF9fU1REQ19fCi0gICAgICBzdHBjcHkgKGNwLCBMT0NBTEVESVIgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLSMgZWxzZQotCi0gICAgICBjcCA9IHN0cGNweSAoY3AsIExPQ0FMRURJUik7Ci0gICAgICBzdHBjcHkgKGNwLCAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotIyBlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHN0cGNweSAoY3AsIG9sZF92YWwpOwotCi0jIGlmIEhBVkVfU0VURU5WCi0gIHNldGVudiAoIk5MU1BBVEgiLCBuZXdfdmFsLCAxKTsKLSAgZnJlZSAobmV3X3ZhbCk7Ci0jIGVsc2UKLSAgcHV0ZW52IChuZXdfdmFsKTsKLSAgLyogRG8gKm5vdCogZnJlZSB0aGUgZW52aXJvbm1lbnQgZW50cnkgd2UganVzdCBlbnRlcmVkLiAgSXQgaXMgdXNlZAotICAgICBmcm9tIG5vdyBvbi4gICAqLwotIyBlbmRpZgotCi0jZW5kaWYKLQotICByZXR1cm4gKGNoYXIgKikgZG9tYWlubmFtZTsKLX0KLQotI3VuZGVmIGdldHRleHQKLWNoYXIgKgotZ2V0dGV4dCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBtc2dpZDsKLQotICBpZiAobXNnID09IE5VTEwgfHwgY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCi0gICAgcmV0dXJuIChjaGFyICopIG1zZzsKLQotICAvKiBHZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgY2F0YWxvZy4gIFdlIGFsd2F5cyB1c2Ugc2V0IG51bWJlciAxLgotICAgICBUaGUgbWVzc2FnZSBJRCBpcyBjb21wdXRlZCBieSB0aGUgZnVuY3Rpb24gYG1zZ190b19jYXRfaWQnCi0gICAgIHdoaWNoIHdvcmtzIG9uIHRoZSB0YWJsZSBnZW5lcmF0ZWQgYnkgYHBvLXRvLXRibCcuICAqLwotICBtc2dpZCA9IG1zZ190b19jYXRfaWQgKG1zZyk7Ci0gIGlmIChtc2dpZCA9PSAtMSkKLSAgICByZXR1cm4gKGNoYXIgKikgbXNnOwotCi0gIHJldHVybiBjYXRnZXRzIChjYXRhbG9nLCAxLCBtc2dpZCwgKGNoYXIgKikgbXNnKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSB0YWJsZSBgX21zZ190YmwnIHdoaWNoIGhhcyBgX21zZ190YmxfbGVuZ3RoJyBlbnRyaWVzCi0gICBmb3IgdGhlIG9uZSBlcXVhbCB0byBtc2cuICBJZiBpdCBpcyBmb3VuZCByZXR1cm4gdGhlIElELiAgSW4gY2FzZSB3aGVuCi0gICB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZCByZXR1cm4gLTEuICAqLwotc3RhdGljIGludAotbXNnX3RvX2NhdF9pZCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBfbXNnX3RibF9sZW5ndGg7ICsrY250KQotICAgIGlmIChzdHJjbXAgKG1zZywgX21zZ190YmxbY250XS5fbXNnKSA9PSAwKQotICAgICAgcmV0dXJuIF9tc2dfdGJsW2NudF0uX21zZ19udW1iZXI7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvY29uZmlnLmluIGIvaW50bC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTA0OWIuLjAwMDAwMDAKLS0tIGEvaW50bC9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGkgbGlicmFyeSAoLWxpKS4gICovCi0jdW5kZWYgSEFWRV9MSUJJCmRpZmYgLS1naXQgYS9pbnRsL2NvbmZpZ3VyZSBiL2ludGwvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDFlZWEwLi4wMDAwMDAwCi0tLSBhL2ludGwvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMjk1MCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9ZGdldHRleHQuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2MjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE2OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDYzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NjM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NjU0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc3OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzA2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzgzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODE3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLSAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODQ2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci0gIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHQ0M9Ci0gIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MDM6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyNDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5NTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjg6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDgyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMDM6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTExMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQzOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTQ4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTc2OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExODEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgInNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjExOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI0NDogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWYgSEFWRV9BTExPQ0FfSAotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EubwotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMwNDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzM0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM4OTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzOTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDQxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ1MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0ODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUzMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY4MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MDk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzE0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzE5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3Nzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODY4OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4NzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkwMTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTIxOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDA6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTU6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAzMDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE1OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE5NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI2NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MjU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NTM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQ0NAJSRDQyVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi1hY19zb3VyY2VzPSIkbmxzX2N2X2hlYWRlcl9saWJndCIKLWFjX2Rlc3RzPSIkbmxzX2N2X2hlYWRlcl9pbnRsIgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXNyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCi13aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCi0gIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgotICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKLQotICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKLQotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgJGFjX2Rlc3QKLQotICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRzcmNkaXIiIGluCi0gIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICBlc2FjCi0KLSAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KLSAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKLSAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWRvbmUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWd1cmUuaW4gYi9pbnRsL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhOWMyNC4uMDAwMDAwMAotLS0gYS9pbnRsL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotCi1BQ19JTklUKGRnZXR0ZXh0LmMpCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotQU1fUFJPR19JTlNUQUxMCi1DWV9HTlVfR0VUVEVYVAotQUNfTElOS19GSUxFUygkbmxzX2N2X2hlYWRlcl9saWJndCwgJG5sc19jdl9oZWFkZXJfaW50bCkKLQotQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvaW50bC9kY2dldHRleHQuYyBiL2ludGwvZGNnZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTZiZmQuLjAwMDAwMDAKLS0tIGEvaW50bC9kY2dldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGNnZXR0ZXh0KDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQotI2Vsc2UKLSMgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0jaWZuZGVmIF9fc2V0X2Vycm5vCi0jIGRlZmluZSBfX3NldF9lcnJubyh2YWwpIGVycm5vID0gKHZhbCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICpnZXRlbnYgKCk7Ci0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBfR05VX1NPVVJDRQotIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0jaW5jbHVkZSAiaGFzaC1zdHJpbmcuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgZ2V0Y3dkIF9fZ2V0Y3dkCi0jIGRlZmluZSBzdHBjcHkgX19zdHBjcHkKLSNlbHNlCi0jIGlmICFkZWZpbmVkIEhBVkVfR0VUQ1dECi1jaGFyICpnZXR3ZCAoKTsKLSMgIGRlZmluZSBnZXRjd2QoYnVmLCBtYXgpIGdldHdkIChidWYpCi0jIGVsc2UKLWNoYXIgKmdldGN3ZCAoKTsKLSMgZW5kaWYKLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEFtb3VudCB0byBpbmNyZWFzZSBidWZmZXIgc2l6ZSBieSBpbiBlYWNoIHRyeS4gICovCi0jZGVmaW5lIFBBVEhfSU5DUiAzMgotCi0vKiBUaGUgZm9sbG93aW5nIGlzIGZyb20gcGF0aG1heC5oLiAgKi8KLS8qIE5vbi1QT1NJWCBCU0Qgc3lzdGVtcyBtaWdodCBoYXZlIGdjYydzIGxpbWl0cy5oLCB3aGljaCBkb2Vzbid0IGRlZmluZQotICAgUEFUSF9NQVggYnV0IG1pZ2h0IGNhdXNlIHJlZGVmaW5pdGlvbiB3YXJuaW5ncyB3aGVuIHN5cy9wYXJhbS5oIGlzCi0gICBsYXRlciBpbmNsdWRlZCAoYXMgb24gTU9SRS9CU0QgNC4zKS4gICovCi0jaWYgZGVmaW5lZChfUE9TSVhfVkVSU0lPTikgfHwgKGRlZmluZWQoSEFWRV9MSU1JVFNfSCkgJiYgIWRlZmluZWQoX19HTlVDX18pKQotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9QT1NJWF9QQVRIX01BWAotIyBkZWZpbmUgX1BPU0lYX1BBVEhfTUFYIDI1NQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChQQVRIX01BWCkgJiYgZGVmaW5lZChfUENfUEFUSF9NQVgpCi0jIGRlZmluZSBQQVRIX01BWCAocGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSA8IDEgPyAxMDI0IDogcGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSkKLSNlbmRpZgotCi0vKiBEb24ndCBpbmNsdWRlIHN5cy9wYXJhbS5oIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4uICAqLwotI2lmIGRlZmluZWQoSEFWRV9TWVNfUEFSQU1fSCkgJiYgIWRlZmluZWQoUEFUSF9NQVgpICYmICFkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChQQVRIX01BWCkgJiYgZGVmaW5lZChNQVhQQVRITEVOKQotIyBkZWZpbmUgUEFUSF9NQVggTUFYUEFUSExFTgotI2VuZGlmCi0KLSNpZm5kZWYgUEFUSF9NQVgKLSMgZGVmaW5lIFBBVEhfTUFYIF9QT1NJWF9QQVRIX01BWAotI2VuZGlmCi0KLS8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mIGBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6Ci0gICBgYERpcmVjdHMgYHNldGxvY2FsZSgpJyB0byBxdWVyeSBgY2F0ZWdvcnknIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAgc2V0dGluZyBvZiBgbG9jYWwnLicnCi0gICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIEFuZCBldmVuIHdvcnNlOiBQT1NJWAotICAgZGVmaW5lcyB0aGlzIG5vdCBhdCBhbGwuICBTbyB3ZSBjYW4gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IG9uIHNlbGVjdGVkCi0gICBzeXN0ZW0gKGUuZy4gdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBIQVZFX0xPQ0FMRV9OVUxMCi0jZW5kaWYKLQotLyogTmFtZSBvZiB0aGUgZGVmYXVsdCBkb21haW4gdXNlZCBmb3IgZ2V0dGV4dCgzKSBwcmlvciBhbnkgY2FsbCB0bwotICAgdGV4dGRvbWFpbigzKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGlzICJtZXNzYWdlcyIuICAqLwotY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdID0gIm1lc3NhZ2VzIjsKLQotLyogVmFsdWUgdXNlZCBhcyB0aGUgZGVmYXVsdCBkb21haW4gZm9yIGdldHRleHQoMykuICAqLwotY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKLQotLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLwotY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW10gPSBHTlVMT0NBTEVESVI7Ci0KLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zIGNyZWF0ZWQgYnkgYmluZHRleHRkb21haW4oKQotICAgY2FsbHMuICAqLwotc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7Ci0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY2hhciAqZmluZF9tc2cgUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCi0JCQkgICAgICAgY29uc3QgY2hhciAqbXNnaWQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpjYXRlZ29yeV90b19uYW1lIFBBUkFNUyAoKGludCBjYXRlZ29yeSkpOwotc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NhdGVnb3J5X3ZhbHVlIFBBUkFNUyAoKGludCBjYXRlZ29yeSwKLQkJCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpKTsKLQotCi0vKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLSAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCi0jaWZkZWYgSEFWRV9BTExPQ0EKLS8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KLSNlbHNlCi1zdHJ1Y3QgYmxvY2tfbGlzdAotewotICB2b2lkICphZGRyZXNzOwotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKLX07Ci0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCi0gICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAotICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAotICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKLSAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKLSAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAotICAgICAgZnJlZSAob2xkKTsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIHVuZGVmIGFsbG9jYQotIyBkZWZpbmUgYWxsb2NhKHNpemUpIChtYWxsb2MgKHNpemUpKQotI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCi0KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKLSNlbHNlCi0jIGRlZmluZSBEQ0dFVFRFWFQgZGNnZXR0ZXh0X18KLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLSAgIGxvY2FsZS4gICovCi1jaGFyICoKLURDR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLSAgICAgaW50IGNhdGVnb3J5OwotewotI2lmbmRlZiBIQVZFX0FMTE9DQQotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7Ci0jZW5kaWYKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluOwotICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKLSAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOwotICBjb25zdCBjaGFyICpjYXRlZ29yeXZhbHVlOwotICBjaGFyICpkaXJuYW1lLCAqeGRvbWFpbm5hbWU7Ci0gIGNoYXIgKnNpbmdsZV9sb2NhbGU7Ci0gIGNoYXIgKnJldHZhbDsKLSAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0KLSAgLyogSWYgbm8gcmVhbCBNU0dJRCBpcyBnaXZlbiByZXR1cm4gTlVMTC4gICovCi0gIGlmIChtc2dpZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKLSAgICAgQ0FURUdPUlkgaXMgbm90IExDX01FU1NBR0VTIHRoaXMgbWlnaHQgbm90IG1ha2UgbXVjaCBzZW5zZSBidXQgdGhlCi0gICAgIGRlZmludGlvbiBsZWZ0IHRoaXMgdW5kZWZpbmVkLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICBkb21haW5uYW1lID0gX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLSAgLyogRmlyc3QgZmluZCBtYXRjaGluZyBiaW5kaW5nLiAgKi8KLSAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7Ci0gICAgICBpZiAoY29tcGFyZSA9PSAwKQotCS8qIFdlIGZvdW5kIGl0ISAgKi8KLQlicmVhazsKLSAgICAgIGlmIChjb21wYXJlIDwgMCkKLQl7Ci0JICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLwotCSAgYmluZGluZyA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChiaW5kaW5nID09IE5VTEwpCi0gICAgZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0gIGVsc2UgaWYgKGJpbmRpbmctPmRpcm5hbWVbMF0gPT0gJy8nKQotICAgIGRpcm5hbWUgPSBiaW5kaW5nLT5kaXJuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGguICBNYWtlIGl0IGFic29sdXRlIG5vdy4gICovCi0gICAgICBzaXplX3QgZGlybmFtZV9sZW4gPSBzdHJsZW4gKGJpbmRpbmctPmRpcm5hbWUpICsgMTsKLSAgICAgIHNpemVfdCBwYXRoX21heDsKLSAgICAgIGNoYXIgKnJldDsKLQotICAgICAgcGF0aF9tYXggPSAodW5zaWduZWQpIFBBVEhfTUFYOwotICAgICAgcGF0aF9tYXggKz0gMjsJCS8qIFRoZSBnZXRjd2QgZG9jcyBzYXkgdG8gZG8gdGhpcy4gICovCi0KLSAgICAgIGRpcm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHBhdGhfbWF4ICsgZGlybmFtZV9sZW4pOwotICAgICAgQUREX0JMT0NLIChibG9ja19saXN0LCBkaXJuYW1lKTsKLQotICAgICAgX19zZXRfZXJybm8gKDApOwotICAgICAgd2hpbGUgKChyZXQgPSBnZXRjd2QgKGRpcm5hbWUsIHBhdGhfbWF4KSkgPT0gTlVMTCAmJiBlcnJubyA9PSBFUkFOR0UpCi0JewotCSAgcGF0aF9tYXggKz0gUEFUSF9JTkNSOwotCSAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7Ci0JICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGRpcm5hbWUpOwotCSAgX19zZXRfZXJybm8gKDApOwotCX0KLQotICAgICAgaWYgKHJldCA9PSBOVUxMKQotCXsKLQkgIC8qIFdlIGNhbm5vdCBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBEb24ndCBzaWduYWwgYW4KLQkgICAgIGVycm9yIGJ1dCBzaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZy4gICovCi0JICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgcmV0dXJuIChjaGFyICopIG1zZ2lkOwotCX0KLQotICAgICAgc3RwY3B5IChzdHBjcHkgKHN0cmNociAoZGlybmFtZSwgJ1wwJyksICIvIiksIGJpbmRpbmctPmRpcm5hbWUpOwotICAgIH0KLQotICAvKiBOb3cgZGV0ZXJtaW5lIHRoZSBzeW1ib2xpYyBuYW1lIG9mIENBVEVHT1JZIGFuZCBpdHMgdmFsdWUuICAqLwotICBjYXRlZ29yeW5hbWUgPSBjYXRlZ29yeV90b19uYW1lIChjYXRlZ29yeSk7Ci0gIGNhdGVnb3J5dmFsdWUgPSBndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7Ci0KLSAgeGRvbWFpbm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnluYW1lKQotCQkJCSArIHN0cmxlbiAoZG9tYWlubmFtZSkgKyA1KTsKLSAgQUREX0JMT0NLIChibG9ja19saXN0LCB4ZG9tYWlubmFtZSk7Ci0KLSAgc3RwY3B5IChzdHBjcHkgKHN0cGNweSAoc3RwY3B5ICh4ZG9tYWlubmFtZSwgY2F0ZWdvcnluYW1lKSwgIi8iKSwKLQkJICBkb21haW5uYW1lKSwKLQkgICIubW8iKTsKLQotICAvKiBDcmVhdGluZyB3b3JraW5nIGFyZWEuICAqLwotICBzaW5nbGVfbG9jYWxlID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5dmFsdWUpICsgMSk7Ci0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgc2luZ2xlX2xvY2FsZSk7Ci0KLQotICAvKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuICBUaGlzIGlzIGEgbG9vcCBiZWNhdXNlIHdlIHBlcmhhcHMKLSAgICAgZ290IGFuIG9yZGVyZWQgbGlzdCBvZiBsYW5ndWFnZXMgdG8gY29uc2lkZXIgZm9yIHRoIHRyYW5zbGF0aW9uLiAgKi8KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgLyogTWFrZSBDQVRFR09SWVZBTFVFIHBvaW50IHRvIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGxpc3QuICAqLwotICAgICAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdID09ICc6JykKLQkrK2NhdGVnb3J5dmFsdWU7Ci0gICAgICBpZiAoY2F0ZWdvcnl2YWx1ZVswXSA9PSAnXDAnKQotCXsKLQkgIC8qIFRoZSB3aG9sZSBjb250ZW50cyBvZiBDQVRFR09SWVZBTFVFIGhhcyBiZWVuIHNlYXJjaGVkIGJ1dAotCSAgICAgbm8gdmFsaWQgZW50cnkgaGFzIGJlZW4gZm91bmQuICBXZSBzb2x2ZSB0aGlzIHNpdHVhdGlvbgotCSAgICAgYnkgaW1wbGljaXRseSBhcHBlbmRpbmcgYSAiQyIgZW50cnksIGkuZS4gbm8gdHJhbnNsYXRpb24KLQkgICAgIHdpbGwgdGFrZSBwbGFjZS4gICovCi0JICBzaW5nbGVfbG9jYWxlWzBdID0gJ0MnOwotCSAgc2luZ2xlX2xvY2FsZVsxXSA9ICdcMCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmNwID0gc2luZ2xlX2xvY2FsZTsKLQkgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSAhPSAnOicpCi0JICAgICpjcCsrID0gKmNhdGVnb3J5dmFsdWUrKzsKLQkgICpjcCA9ICdcMCc7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgY3VycmVudCBsb2NhbGUgdmFsdWUgaXMgQyAob3IgUE9TSVgpIHdlIGRvbid0IGxvYWQgYQotCSBkb21haW4uICBSZXR1cm4gdGhlIE1TR0lELiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJDIikgPT0gMAotCSAgfHwgc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiUE9TSVgiKSA9PSAwKQotCXsKLQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0JICByZXR1cm4gKGNoYXIgKikgbXNnaWQ7Ci0JfQotCi0KLSAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKLQkgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkuICAqLwotICAgICAgZG9tYWluID0gX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBzaW5nbGVfbG9jYWxlLCB4ZG9tYWlubmFtZSk7Ci0KLSAgICAgIGlmIChkb21haW4gIT0gTlVMTCkKLQl7Ci0JICByZXR2YWwgPSBmaW5kX21zZyAoZG9tYWluLCBtc2dpZCk7Ci0KLQkgIGlmIChyZXR2YWwgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGludCBjbnQ7Ci0KLQkgICAgICBmb3IgKGNudCA9IDA7IGRvbWFpbi0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JCXsKLQkJICByZXR2YWwgPSBmaW5kX21zZyAoZG9tYWluLT5zdWNjZXNzb3JbY250XSwgbXNnaWQpOwotCi0JCSAgaWYgKHJldHZhbCAhPSBOVUxMKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAocmV0dmFsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQkgICAgICByZXR1cm4gcmV0dmFsOwotCSAgICB9Ci0JfQotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19kY2dldHRleHQsIGRjZ2V0dGV4dCk7Ci0jZW5kaWYKLQotCi1zdGF0aWMgY2hhciAqCi1maW5kX21zZyAoZG9tYWluX2ZpbGUsIG1zZ2lkKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHNpemVfdCB0b3AsIGFjdCwgYm90dG9tOwotICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotCi0gIGlmIChkb21haW5fZmlsZS0+ZGVjaWRlZCA9PSAwKQotICAgIF9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUpOwotCi0gIGlmIChkb21haW5fZmlsZS0+ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKLQotICAvKiBMb2NhdGUgdGhlIE1TR0lEIGFuZCBpdHMgdHJhbnNsYXRpb24uICAqLwotICBpZiAoZG9tYWluLT5oYXNoX3NpemUgPiAyICYmIGRvbWFpbi0+aGFzaF90YWIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBVc2UgdGhlIGhhc2hpbmcgdGFibGUuICAqLwotICAgICAgbmxzX3VpbnQzMiBsZW4gPSBzdHJsZW4gKG1zZ2lkKTsKLSAgICAgIG5sc191aW50MzIgaGFzaF92YWwgPSBoYXNoX3N0cmluZyAobXNnaWQpOwotICAgICAgbmxzX3VpbnQzMiBpZHggPSBoYXNoX3ZhbCAlIGRvbWFpbi0+aGFzaF9zaXplOwotICAgICAgbmxzX3VpbnQzMiBpbmNyID0gMSArIChoYXNoX3ZhbCAlIChkb21haW4tPmhhc2hfc2l6ZSAtIDIpKTsKLSAgICAgIG5sc191aW50MzIgbnN0ciA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOwotCi0gICAgICBpZiAobnN0ciA9PSAwKQotCS8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLwotCXJldHVybiBOVUxMOwotCi0gICAgICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLmxlbmd0aCkgPT0gbGVuCi0JICAmJiBzdHJjbXAgKG1zZ2lkLAotCQkgICAgIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCSAgICAgICBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5vZmZzZXQpKSA9PSAwKQotCXJldHVybiAoY2hhciAqKSBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkJICBkb21haW4tPnRyYW5zX3RhYltuc3RyIC0gMV0ub2Zmc2V0KTsKLQotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCi0JICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7Ci0JICBlbHNlCi0JICAgIGlkeCArPSBpbmNyOwotCi0JICBuc3RyID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7Ci0JICBpZiAobnN0ciA9PSAwKQotCSAgICAvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ubGVuZ3RoKSA9PSBsZW4KLQkgICAgICAmJiBzdHJjbXAgKG1zZ2lkLAotCQkJIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCQkgICBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5vZmZzZXQpKQotCSAgICAgICAgID09IDApCi0JICAgIHJldHVybiAoY2hhciAqKSBkb21haW4tPmRhdGEKLQkgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYltuc3RyIC0gMV0ub2Zmc2V0KTsKLQl9Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgfQotCi0gIC8qIE5vdyB3ZSB0cnkgdGhlIGRlZmF1bHQgbWV0aG9kOiAgYmluYXJ5IHNlYXJjaCBpbiB0aGUgc29ydGVkCi0gICAgIGFycmF5IG9mIG1lc3NhZ2VzLiAgKi8KLSAgYm90dG9tID0gMDsKLSAgdG9wID0gZG9tYWluLT5uc3RyaW5nczsKLSAgd2hpbGUgKGJvdHRvbSA8IHRvcCkKLSAgICB7Ci0gICAgICBpbnQgY21wX3ZhbDsKLQotICAgICAgYWN0ID0gKGJvdHRvbSArIHRvcCkgLyAyOwotICAgICAgY21wX3ZhbCA9IHN0cmNtcCAobXNnaWQsIGRvbWFpbi0+ZGF0YQotCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgIGRvbWFpbi0+b3JpZ190YWJbYWN0XS5vZmZzZXQpKTsKLSAgICAgIGlmIChjbXBfdmFsIDwgMCkKLQl0b3AgPSBhY3Q7Ci0gICAgICBlbHNlIGlmIChjbXBfdmFsID4gMCkKLQlib3R0b20gPSBhY3QgKyAxOwotICAgICAgZWxzZQotCWJyZWFrOwotICAgIH0KLQotICAvKiBJZiBhbiB0cmFuc2xhdGlvbiBpcyBmb3VuZCByZXR1cm4gdGhpcy4gICovCi0gIHJldHVybiBib3R0b20gPj0gdG9wID8gTlVMTCA6IChjaGFyICopIGRvbWFpbi0+ZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCSAgICAgZG9tYWluLT50cmFuc190YWJbYWN0XS5vZmZzZXQpOwotfQotCi0KLS8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbG9jYWxlIENBVEVHT1JZLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KQotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICBzd2l0Y2ggKGNhdGVnb3J5KQotICB7Ci0jaWZkZWYgTENfQ09MTEFURQotICBjYXNlIExDX0NPTExBVEU6Ci0gICAgcmV0dmFsID0gIkxDX0NPTExBVEUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfQ1RZUEUKLSAgY2FzZSBMQ19DVFlQRToKLSAgICByZXR2YWwgPSAiTENfQ1RZUEUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTU9ORVRBUlkKLSAgY2FzZSBMQ19NT05FVEFSWToKLSAgICByZXR2YWwgPSAiTENfTU9ORVRBUlkiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTlVNRVJJQwotICBjYXNlIExDX05VTUVSSUM6Ci0gICAgcmV0dmFsID0gIkxDX05VTUVSSUMiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfVElNRQotICBjYXNlIExDX1RJTUU6Ci0gICAgcmV0dmFsID0gIkxDX1RJTUUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTUVTU0FHRVMKLSAgY2FzZSBMQ19NRVNTQUdFUzoKLSAgICByZXR2YWwgPSAiTENfTUVTU0FHRVMiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfUkVTUE9OU0UKLSAgY2FzZSBMQ19SRVNQT05TRToKLSAgICByZXR2YWwgPSAiTENfUkVTUE9OU0UiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfQUxMCi0gIGNhc2UgTENfQUxMOgotICAgIC8qIFRoaXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UgYnV0IGlzIHBlcmhhcHMgYmV0dGVyIHRoYW4gYW55IG90aGVyCi0gICAgICAgdmFsdWUuICAqLwotICAgIHJldHZhbCA9ICJMQ19BTEwiOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgLyogSWYgeW91IGhhdmUgYSBiZXR0ZXIgaWRlYSBmb3IgYSBkZWZhdWx0IHZhbHVlIGxldCBtZSBrbm93LiAgKi8KLSAgICByZXR2YWwgPSAiTENfWFhYIjsKLSAgfQotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qIEd1ZXNzIHZhbHVlIG9mIGN1cnJlbnQgbG9jYWxlIGZyb20gdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSkKLSAgICAgaW50IGNhdGVnb3J5OwotICAgICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudAotICAgICB2YXJpYWJsZS4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFOR1VBR0UiKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogYExBTkdVQUdFJyBpcyBub3Qgc2V0LiAgU28gd2UgaGF2ZSB0byBwcm9jZWVkIHdpdGggdGhlIFBPU0lYCi0gICAgIG1ldGhvZHMgb2YgbG9va2luZyB0byBgTENfQUxMJywgYExDX3h4eCcsIGFuZCBgTEFORycuICBPbiBzb21lCi0gICAgIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUgYHNldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLSNpZiBkZWZpbmVkIEhBVkVfU0VUTE9DQUxFICYmIGRlZmluZWQgSEFWRV9MQ19NRVNTQUdFUyAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKLSAgcmV0dXJuIHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpOwotI2Vsc2UKLSAgLyogU2V0dGluZyBvZiBMQ19BTEwgb3ZlcndyaXRlcyBhbGwgb3RoZXIuICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogTmV4dCBjb21lcyB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjYXRlZ29yeS4gICovCi0gIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogTGFzdCBwb3NzaWJpbGl0eSBpcyB0aGUgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogV2UgdXNlIEMgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiAgUE9TSVggc2F5cyB0aGlzIGlzIGltcGxlbWVudGF0aW9uCi0gICAgIGRlZmluZWQuICAqLwotICByZXR1cm4gIkMiOwotI2VuZGlmCi19Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZGdldHRleHQuYyBiL2ludGwvZGdldHRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkZTY3Ny4uMDAwMDAwMAotLS0gYS9pbnRsL2RnZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBkZ2V0dGV4dC5jIC0tIGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZ2V0dGV4dCgzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9MT0NBTEVfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIERHRVRURVhUIGRnZXR0ZXh0X18KLSMgZGVmaW5lIERDR0VUVEVYVCBkY2dldHRleHRfXwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotY2hhciAqCi1ER0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICByZXR1cm4gRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19kZ2V0dGV4dCwgZGdldHRleHQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2V4cGxvZGVuYW1lLmMgYi9pbnRsL2V4cGxvZGVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzQ2ZTkuLjAwMDAwMDAKLS0tIGEvaW50bC9leHBsb2RlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCi0jaWZuZGVmIE5VTEwKLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jIGVsc2UKLSMgIGRlZmluZSBOVUxMIDAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLWludAotX25sX2V4cGxvZGVfbmFtZSAobmFtZSwgbGFuZ3VhZ2UsIG1vZGlmaWVyLCB0ZXJyaXRvcnksIGNvZGVzZXQsCi0JCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBzcGVjaWFsLCBzcG9uc29yLCByZXZpc2lvbikKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKmxhbmd1YWdlOwotICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXI7Ci0gICAgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnk7Ci0gICAgIGNvbnN0IGNoYXIgKipjb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICoqc3BlY2lhbDsKLSAgICAgY29uc3QgY2hhciAqKnNwb25zb3I7Ci0gICAgIGNvbnN0IGNoYXIgKipyZXZpc2lvbjsKLXsKLSAgZW51bSB7IHVuZGVjaWRlZCwgeHBnLCBjZW4gfSBzeW50YXg7Ci0gIGNoYXIgKmNwOwotICBpbnQgbWFzazsKLQotICAqbW9kaWZpZXIgPSBOVUxMOwotICAqdGVycml0b3J5ID0gTlVMTDsKLSAgKmNvZGVzZXQgPSBOVUxMOwotICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gTlVMTDsKLSAgKnNwZWNpYWwgPSBOVUxMOwotICAqc3BvbnNvciA9IE5VTEw7Ci0gICpyZXZpc2lvbiA9IE5VTEw7Ci0KLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCi0gICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLwotICBtYXNrID0gMDsKLSAgc3ludGF4ID0gdW5kZWNpZGVkOwotICAqbGFuZ3VhZ2UgPSBjcCA9IG5hbWU7Ci0gIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdfJyAmJiBjcFswXSAhPSAnQCcKLQkgJiYgY3BbMF0gIT0gJysnICYmIGNwWzBdICE9ICcsJykKLSAgICArK2NwOwotCi0gIGlmICgqbGFuZ3VhZ2UgPT0gY3ApCi0gICAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlOiBsYW5ndWFnZSBoYXMgdG8gYmUgc3BlY2lmaWVkLiAgVXNlCi0gICAgICAgdGhpcyBlbnRyeSBhcyBpdCBpcyB3aXRob3V0IGV4cGxvZGluZy4gIFBlcmhhcHMgaXQgaXMgYW4gYWxpYXMuICAqLwotICAgIGNwID0gc3RyY2hyICgqbGFuZ3VhZ2UsICdcMCcpOwotICBlbHNlIGlmIChjcFswXSA9PSAnXycpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgdGVycml0b3J5LiAgKi8KLSAgICAgIGNwWzBdID0gJ1wwJzsKLSAgICAgICp0ZXJyaXRvcnkgPSArK2NwOwotCi0gICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLicgJiYgY3BbMF0gIT0gJ0AnCi0JICAgICAmJiBjcFswXSAhPSAnKycgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkrK2NwOwotCi0gICAgICBtYXNrIHw9IFRFUlJJVE9SWTsKLQotICAgICAgaWYgKGNwWzBdID09ICcuJykKLQl7Ci0JICAvKiBOZXh0IGlzIHRoZSBjb2Rlc2V0LiAgKi8KLQkgIHN5bnRheCA9IHhwZzsKLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpjb2Rlc2V0ID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ0AnKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IFhQR19DT0RFU0VUOwotCi0JICBpZiAoKmNvZGVzZXQgIT0gY3AgJiYgKCpjb2Rlc2V0KVswXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IF9ubF9ub3JtYWxpemVfY29kZXNldCAoKmNvZGVzZXQsCi0JCQkJCQkJICAgY3AgLSAqY29kZXNldCk7Ci0JICAgICAgaWYgKHN0cmNtcCAoKmNvZGVzZXQsICpub3JtYWxpemVkX2NvZGVzZXQpID09IDApCi0JCWZyZWUgKChjaGFyICopICpub3JtYWxpemVkX2NvZGVzZXQpOwotCSAgICAgIGVsc2UKLQkJbWFzayB8PSBYUEdfTk9STV9DT0RFU0VUOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoY3BbMF0gPT0gJ0AnIHx8IChzeW50YXggIT0geHBnICYmIGNwWzBdID09ICcrJykpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgbW9kaWZpZXIuICAqLwotICAgICAgc3ludGF4ID0gY3BbMF0gPT0gJ0AnID8geHBnIDogY2VuOwotICAgICAgY3BbMF0gPSAnXDAnOwotICAgICAgKm1vZGlmaWVyID0gKytjcDsKLQotICAgICAgd2hpbGUgKHN5bnRheCA9PSBjZW4gJiYgY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnKycKLQkgICAgICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCi0JKytjcDsKLQotICAgICAgbWFzayB8PSBYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0U7Ci0gICAgfQotCi0gIGlmIChzeW50YXggIT0geHBnICYmIChjcFswXSA9PSAnKycgfHwgY3BbMF0gPT0gJywnIHx8IGNwWzBdID09ICdfJykpCi0gICAgewotICAgICAgc3ludGF4ID0gY2VuOwotCi0gICAgICBpZiAoY3BbMF0gPT0gJysnKQotCXsKLSAJICAvKiBOZXh0IGlzIHNwZWNpYWwgYXBwbGljYXRpb24gKENFTiBzeW50YXgpLiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpzcGVjaWFsID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkgICAgKytjcDsKLQotCSAgbWFzayB8PSBDRU5fU1BFQ0lBTDsKLQl9Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnLCcpCi0JewotIAkgIC8qIE5leHQgaXMgc3BvbnNvciAoQ0VOIHN5bnRheCkuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKnNwb25zb3IgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnXycpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gQ0VOX1NQT05TT1I7Ci0JfQotCi0gICAgICBpZiAoY3BbMF0gPT0gJ18nKQotCXsKLSAJICAvKiBOZXh0IGlzIHJldmlzaW9uIChDRU4gc3ludGF4KS4gICovCi0JICBjcFswXSA9ICdcMCc7Ci0JICAqcmV2aXNpb24gPSArK2NwOwotCi0JICBtYXNrIHw9IENFTl9SRVZJU0lPTjsKLQl9Ci0gICAgfQotCi0gIC8qIEZvciBDRU4gc3ludGF4IHZhbHVlcyBpdCBtaWdodCBiZSBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUKLSAgICAgc2VwYXJhdG9yIGNoYXJhY3RlciBpbiB0aGUgZmlsZSBuYW1lLCBub3QgZm9yIFhQRyBzeW50YXguICAqLwotICBpZiAoc3ludGF4ID09IHhwZykKLSAgICB7Ci0gICAgICBpZiAoKnRlcnJpdG9yeSAhPSBOVUxMICYmICgqdGVycml0b3J5KVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflRFUlJJVE9SWTsKLQotICAgICAgaWYgKCpjb2Rlc2V0ICE9IE5VTEwgJiYgKCpjb2Rlc2V0KVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflhQR19DT0RFU0VUOwotCi0gICAgICBpZiAoKm1vZGlmaWVyICE9IE5VTEwgJiYgKCptb2RpZmllcilbMF0gPT0gJ1wwJykKLQltYXNrICY9IH5YUEdfTU9ESUZJRVI7Ci0gICAgfQotCi0gIHJldHVybiBtYXNrOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9maW5kZG9tYWluLmMgYi9pbnRsL2ZpbmRkb21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NWQ0ZC4uMDAwMDAwMAotLS0gYS9pbnRsL2ZpbmRkb21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLyogTGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBkb21haW5zLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfbmxfbG9hZGVkX2RvbWFpbnM7Ci0KLQotLyogUmV0dXJuIGEgZGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBjYXRhbG9nIGRlc2NyaWJlZCBieQotICAgdGhlIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZIHBhcmFtZXRlcnMgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50bHkKLSAgIGVzdGFibGlzaGVkIGJpbmRpbmdzLiAgKi8KLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBsb2NhbGUsIGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci0gICAgIGNoYXIgKmxvY2FsZTsKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOwotICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgY29uc3QgY2hhciAqbW9kaWZpZXI7Ci0gIGNvbnN0IGNoYXIgKnRlcnJpdG9yeTsKLSAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OwotICBjb25zdCBjaGFyICpzcGVjaWFsOwotICBjb25zdCBjaGFyICpzcG9uc29yOwotICBjb25zdCBjaGFyICpyZXZpc2lvbjsKLSAgY29uc3QgY2hhciAqYWxpYXNfdmFsdWU7Ci0gIGludCBtYXNrOwotCi0gIC8qIExPQ0FMRSBjYW4gY29uc2lzdCBvZiB1cCB0byBmb3VyIHJlY29nbml6ZWQgcGFydHMgZm9yIHRoZSBYUEcgc3ludGF4OgotCi0JCWxhbmd1YWdlW190ZXJyaXRvcnlbLmNvZGVzZXRdXVtAbW9kaWZpZXJdCi0KLSAgICAgYW5kIHNpeCBwYXJ0cyBmb3IgdGhlIENFTiBzeW50YXg6Ci0KLQlsYW5ndWFnZVtfdGVycml0b3J5XVsrYXVkaWVuY2VdWytzcGVjaWFsXVssW3Nwb25zb3JdW19yZXZpc2lvbl1dCi0KLSAgICAgQmVzaWRlIHRoZSBmaXJzdCBhbGwgb2YgdGhlbSBhcmUgYWxsb3dlZCB0byBiZSBtaXNzaW5nLiAgSWYgdGhlCi0gICAgIGZ1bGwgc3BlY2lmaWVkIGxvY2FsZSBpcyBub3QgZm91bmQsIHRoZSBsZXNzIHNwZWNpZmljIG9uZSBhcmUKLSAgICAgbG9va2VkIGZvci4gIFRoZSB2YXJpb3VzIHBhcnQgd2lsbCBiZSBzdHJpcHBlZCBvZiBhY2NvcmRpbmcgdG8KLSAgICAgdGhlIGZvbGxvd2luZyBvcmRlcjoKLQkJKDEpIHJldmlzaW9uCi0JCSgyKSBzcG9uc29yCi0JCSgzKSBzcGVjaWFsCi0JCSg0KSBjb2Rlc2V0Ci0JCSg1KSBub3JtYWxpemVkIGNvZGVzZXQKLQkJKDYpIHRlcnJpdG9yeQotCQkoNykgYXVkaWVuY2UvbW9kaWZpZXIKLSAgICovCi0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IHRlc3RlZCBmb3IgdGhpcyBsb2NhbGUgZW50cnkgdGhlcmUgaGFzIHRvCi0gICAgIGJlIG9uZSBkYXRhIHNldCBpbiB0aGUgbGlzdCBvZiBsb2FkZWQgZG9tYWlucy4gICovCi0gIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKLQkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgMCwgbG9jYWxlLCBOVUxMLCBOVUxMLAotCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIGRvbWFpbm5hbWUsIDApOwotICBpZiAocmV0dmFsICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2Uga25vdyBzb21ldGhpbmcgYWJvdXQgdGhpcyBsb2NhbGUuICAqLwotICAgICAgaW50IGNudDsKLQotICAgICAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQotCV9ubF9sb2FkX2RvbWFpbiAocmV0dmFsKTsKLQotICAgICAgaWYgKHJldHZhbC0+ZGF0YSAhPSBOVUxMKQotCXJldHVybiByZXR2YWw7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQl7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA9PSAwKQotCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0pOwotCi0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQotCSAgICBicmVhazsKLQl9Ci0gICAgICByZXR1cm4gY250ID49IDAgPyByZXR2YWwgOiBOVUxMOwotICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgIH0KLQotICAvKiBTZWUgd2hldGhlciB0aGUgbG9jYWxlIHZhbHVlIGlzIGFuIGFsaWFzLiAgSWYgeWVzIGl0cyB2YWx1ZQotICAgICAqb3ZlcndyaXRlcyogdGhlIGFsaWFzIG5hbWUuICBObyB0ZXN0IGZvciB0aGUgb3JpZ2luYWwgdmFsdWUgaXMKLSAgICAgZG9uZS4gICovCi0gIGFsaWFzX3ZhbHVlID0gX25sX2V4cGFuZF9hbGlhcyAobG9jYWxlKTsKLSAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYWxpYXNfdmFsdWUpICsgMTsKLSAgICAgIGxvY2FsZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbWVtY3B5IChsb2NhbGUsIGFsaWFzX3ZhbHVlLCBsZW4pOwotICAgIH0KLQotICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKLSAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nIGFuZCBgQCcgaWYKLSAgICAgd2UgdXNlIFhQRzQgc3R5bGUsIGFuZCBgXycsIGArJywgYW5kIGAsJyBpZiB3ZSB1c2UgQ0VOIHN5bnRheC4gICovCi0gIG1hc2sgPSBfbmxfZXhwbG9kZV9uYW1lIChsb2NhbGUsICZsYW5ndWFnZSwgJm1vZGlmaWVyLCAmdGVycml0b3J5LAotCQkJICAgJmNvZGVzZXQsICZub3JtYWxpemVkX2NvZGVzZXQsICZzcGVjaWFsLAotCQkJICAgJnNwb25zb3IsICZyZXZpc2lvbik7Ci0KLSAgLyogQ3JlYXRlIGFsbCBwb3NzaWJsZSBsb2NhbGUgZW50cmllcyB3aGljaCBtaWdodCBiZSBpbnRlcmVzdGVkIGluCi0gICAgIGdlbmVyYWxpemF0aW9uLiAgKi8KLSAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAotCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCBtYXNrLCBsYW5ndWFnZSwgdGVycml0b3J5LAotCQkJICAgICAgIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCi0JCQkgICAgICAgc3BvbnNvciwgcmV2aXNpb24sIGRvbWFpbm5hbWUsIDEpOwotICBpZiAocmV0dmFsID09IE5VTEwpCi0gICAgLyogVGhpcyBtZWFucyB3ZSBhcmUgb3V0IG9mIGNvcmUuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKLSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbCk7Ci0gIGlmIChyZXR2YWwtPmRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgY250OwotICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotCXsKLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCi0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSk7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSByb29tIGZvciBhbiBhbGlhcyB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgRnJlZSBpdCBub3cuICAqLwotICBpZiAoYWxpYXNfdmFsdWUgIT0gTlVMTCkKLSAgICBmcmVlIChsb2NhbGUpOwotCi0gIHJldHVybiByZXR2YWw7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2dldHRleHQuYyBiL2ludGwvZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzM2ZDIxLi4wMDAwMDAwCi0tLSBhL2ludGwvZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dCgzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIF9fbmVlZF9OVUxMCi0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSMgaWZkZWYgU1REQ19IRUFERVJTCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLwotIyBlbHNlCi0jICBpZmRlZiBIQVZFX1NUUklOR19ICi0jICAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBlbHNlCi0jICAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEdFVFRFWFQgX19nZXR0ZXh0Ci0jIGRlZmluZSBER0VUVEVYVCBfX2RnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgR0VUVEVYVCBnZXR0ZXh0X18KLSMgZGVmaW5lIERHRVRURVhUIGRnZXR0ZXh0X18KLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWNoYXIgKgotR0VUVEVYVCAobXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICByZXR1cm4gREdFVFRFWFQgKE5VTEwsIG1zZ2lkKTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZ2V0dGV4dCwgZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZ2V0dGV4dC5oIGIvaW50bC9nZXR0ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGI5ZTMuLjAwMDAwMDAKLS0tIGEvaW50bC9nZXR0ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyogSW50ZXJuYWwgaGVhZGVyIGZvciBHTlUgZ2V0dGV4dCBpbnRlcm5hdGlvbmFsaXphdGlvbiBmdW5jdGlvbnMKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRURVhUX0gKLSNkZWZpbmUgX0dFVFRFWFRfSCAxCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgSEFWRV9MSU1JVFNfSCB8fCBfTElCQwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KLSNkZWZpbmUgX01BR0lDIDB4OTUwNDEyZGUKLSNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQotCi0vKiBSZXZpc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSB1c2VkIC5tbyAoYmluYXJ5KSBmaWxlIGZvcm1hdC4gICovCi0jZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29udG9ydGlvbnMgYXJlIGFuIGF0dGVtcHQgdG8gdXNlIHRoZSBDIHByZXByb2Nlc3NvcgotICAgdG8gZGV0ZXJtaW5lIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUgdGhhdCBpcyAzMiBiaXRzIHdpZGUuICBBbgotICAgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgdG8gdXNlIGF1dG9jb25mJ3MgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvLCBidXQKLSAgIGRvaW5nIHRoYXQgd291bGQgcmVxdWlyZSB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbXBpbGUgYW5kICpydW4qCi0gICB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUuICBMb2NhbGx5IHJ1bm5pbmcgY3Jvc3MtY29tcGlsZWQgZXhlY3V0YWJsZXMKLSAgIGlzIHVzdWFsbHkgbm90IHBvc3NpYmxlLiAgKi8KLQotI2lmIF9fU1REQ19fCi0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDQyOTQ5NjcyOTVVCi0jZWxzZQotIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyAweEZGRkZGRkZGCi0jZW5kaWYKLQotLyogSWYgVUlOVF9NQVggaXNuJ3QgZGVmaW5lZCwgYXNzdW1lIGl0J3MgYSAzMi1iaXQgdHlwZS4KLSAgIFRoaXMgc2hvdWxkIGJlIHZhbGlkIGZvciBhbGwgc3lzdGVtcyBHTlUgY2FyZXMgYWJvdXQgYmVjYXVzZQotICAgdGhhdCBkb2Vzbid0IGluY2x1ZGUgMTYtYml0IHN5c3RlbXMsIGFuZCBvbmx5IG1vZGVybiBzeXN0ZW1zCi0gICAodGhhdCBjZXJ0YWlubHkgaGF2ZSA8bGltaXRzLmg+KSBoYXZlIDY0Ky1iaXQgaW50ZWdyYWwgdHlwZXMuICAqLwotCi0jaWZuZGVmIFVJTlRfTUFYCi0jIGRlZmluZSBVSU5UX01BWCBVSU5UX01BWF8zMl9CSVRTCi0jZW5kaWYKLQotI2lmIFVJTlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgbmxzX3VpbnQzMjsKLSNlbHNlCi0jIGlmIFVTSFJUX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG5sc191aW50MzI7Ci0jIGVsc2UKLSMgIGlmIFVMT05HX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbmxzX3VpbnQzMjsKLSMgIGVsc2UKLSAgLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIGludGVuZGVkIHRvIHRocm93IGFuIGVycm9yLiAgVXNpbmcgI2Vycm9yIGlzCi0gICAgIG5vdCBwb3J0YWJsZSBlbm91Z2guICAqLwotICAiQ2Fubm90IGRldGVybWluZSB1bnNpZ25lZCAzMi1iaXQgZGF0YSB0eXBlLiIKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotCi0vKiBIZWFkZXIgZm9yIGJpbmFyeSAubW8gZmlsZSBmb3JtYXQuICAqLwotc3RydWN0IG1vX2ZpbGVfaGVhZGVyCi17Ci0gIC8qIFRoZSBtYWdpYyBudW1iZXIuICAqLwotICBubHNfdWludDMyIG1hZ2ljOwotICAvKiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdC4gICovCi0gIG5sc191aW50MzIgcmV2aXNpb247Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBwYWlycy4gICovCi0gIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3RyaW5ncy4gICovCi0gIG5sc191aW50MzIgb3JpZ190YWJfb2Zmc2V0OwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIHRyYW5zbGF0aW9uIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIHRyYW5zX3RhYl9vZmZzZXQ7Ci0gIC8qIFNpemUgb2YgaGFzaGluZyB0YWJsZS4gICovCi0gIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKLSAgLyogT2Zmc2V0IG9mIGZpcnN0IGhhc2hpbmcgZW50cnkuICAqLwotICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKLX07Ci0KLXN0cnVjdCBzdHJpbmdfZGVzYwotewotICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZy4gICovCi0gIG5sc191aW50MzIgbGVuZ3RoOwotICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLwotICBubHNfdWludDMyIG9mZnNldDsKLX07Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYJLyogZ2V0dGV4dC5oICAqLwpkaWZmIC0tZ2l0IGEvaW50bC9nZXR0ZXh0UC5oIGIvaW50bC9nZXR0ZXh0UC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjhkNTUyLi4wMDAwMDAwCi0tLSBhL2ludGwvZ2V0dGV4dFAuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIEhlYWRlciBkZXNjcmliaW5nIGludGVybmFscyBvZiBnZXR0ZXh0IGxpYnJhcnkKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfR0VUVEVYVFBfSAotI2RlZmluZSBfR0VUVEVYVFBfSAotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFcKLSMgZGVmaW5lIFcoZmxhZywgZGF0YSkgKChmbGFnKSA/IFNXQVAgKGRhdGEpIDogKGRhdGEpKQotI2VuZGlmCi0KLQotc3RhdGljIG5sc191aW50MzIgU1dBUCBQQVJBTVMgKChubHNfdWludDMyIGkpKTsKLQotc3RhdGljIGlubGluZSBubHNfdWludDMyCi1TV0FQIChpKQotICAgICBubHNfdWludDMyIGk7Ci17Ci0gIHJldHVybiAoaSA8PCAyNCkgfCAoKGkgJiAweGZmMDApIDw8IDgpIHwgKChpID4+IDgpICYgMHhmZjAwKSB8IChpID4+IDI0KTsKLX0KLQotCi1zdHJ1Y3QgbG9hZGVkX2RvbWFpbgotewotICBjb25zdCBjaGFyICpkYXRhOwotICBpbnQgbXVzdF9zd2FwOwotICBubHNfdWludDMyIG5zdHJpbmdzOwotICBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKm9yaWdfdGFiOwotICBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKnRyYW5zX3RhYjsKLSAgbmxzX3VpbnQzMiBoYXNoX3NpemU7Ci0gIG5sc191aW50MzIgKmhhc2hfdGFiOwotfTsKLQotc3RydWN0IGJpbmRpbmcKLXsKLSAgc3RydWN0IGJpbmRpbmcgKm5leHQ7Ci0gIGNoYXIgKmRvbWFpbm5hbWU7Ci0gIGNoYXIgKmRpcm5hbWU7Ci19OwotCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfbmxfZmluZF9kb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kaXJuYW1lLAotCQkJCQkJIGNoYXIgKl9fbG9jYWxlLAotCQkJCQkJIGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotdm9pZCBfbmxfbG9hZF9kb21haW4gUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW4pKTsKLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLSNlbmRpZiAvKiBnZXR0ZXh0UC5oICAqLwpkaWZmIC0tZ2l0IGEvaW50bC9oYXNoLXN0cmluZy5oIGIvaW50bC9oYXNoLXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjZlODQxLi4wMDAwMDAwCi0tLSBhL2ludGwvaGFzaC1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIEltcGxlbWVudHMgYSBzdHJpbmcgaGFzaGluZyBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9WQUxVRVNfSAotIyBpbmNsdWRlIDx2YWx1ZXMuaD4KLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKEFyZ3MpIEFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIGFzc3VtZSB0byBoYXZlIGB1bnNpZ25lZCBsb25nIGludCcgdmFsdWUgd2l0aCBhdCBsZWFzdCAzMiBiaXRzLiAgKi8KLSNkZWZpbmUgSEFTSFdPUkRCSVRTIDMyCi0KLQotLyogRGVmaW5lcyB0aGUgc28gY2FsbGVkIGBoYXNocGp3JyBmdW5jdGlvbiBieSBQLkouIFdlaW5iZXJnZXIKLSAgIFtzZWUgQWhvL1NldGhpL1VsbG1hbiwgQ09NUElMRVJTOiBQcmluY2lwbGVzLCBUZWNobmlxdWVzIGFuZCBUb29scywKLSAgIDE5ODYsIDE5ODcgQmVsbCBUZWxlcGhvbmUgTGFib3JhdG9yaWVzLCBJbmMuXSAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2hfc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fc3RyX3BhcmFtKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotaGFzaF9zdHJpbmcgKHN0cl9wYXJhbSkKLSAgICAgY29uc3QgY2hhciAqc3RyX3BhcmFtOwotewotICB1bnNpZ25lZCBsb25nIGludCBodmFsLCBnOwotICBjb25zdCBjaGFyICpzdHIgPSBzdHJfcGFyYW07Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHN0cmluZy4gICovCi0gIGh2YWwgPSAwOwotICB3aGlsZSAoKnN0ciAhPSAnXDAnKQotICAgIHsKLSAgICAgIGh2YWwgPDw9IDQ7Ci0gICAgICBodmFsICs9ICh1bnNpZ25lZCBsb25nKSAqc3RyKys7Ci0gICAgICBnID0gaHZhbCAmICgodW5zaWduZWQgbG9uZykgMHhmIDw8IChIQVNIV09SREJJVFMgLSA0KSk7Ci0gICAgICBpZiAoZyAhPSAwKQotCXsKLQkgIGh2YWwgXj0gZyA+PiAoSEFTSFdPUkRCSVRTIC0gOCk7Ci0JICBodmFsIF49IGc7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGh2YWw7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2ludGwtY29tcGF0LmMgYi9pbnRsL2ludGwtY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2VmYTAuLjAwMDAwMDAKLS0tIGEvaW50bC9pbnRsLWNvbXBhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogaW50bC1jb21wYXQuYyAtIFN0dWIgZnVuY3Rpb25zIHRvIGNhbGwgZ2V0dGV4dCBmdW5jdGlvbnMgZnJvbSBHTlUgZ2V0dGV4dAotICAgTGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotCi0jdW5kZWYgZ2V0dGV4dAotI3VuZGVmIGRnZXR0ZXh0Ci0jdW5kZWYgZGNnZXR0ZXh0Ci0jdW5kZWYgdGV4dGRvbWFpbgotI3VuZGVmIGJpbmR0ZXh0ZG9tYWluCi0KLQotY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSAgcmV0dXJuIGJpbmR0ZXh0ZG9tYWluX18gKGRvbWFpbm5hbWUsIGRpcm5hbWUpOwotfQotCi0KLWNoYXIgKgotZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0gIHJldHVybiBkY2dldHRleHRfXyAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KTsKLX0KLQotCi1jaGFyICoKLWRnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBkZ2V0dGV4dF9fIChkb21haW5uYW1lLCBtc2dpZCk7Ci19Ci0KLQotY2hhciAqCi1nZXR0ZXh0IChtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBnZXR0ZXh0X18gKG1zZ2lkKTsKLX0KLQotCi1jaGFyICoKLXRleHRkb21haW4gKGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIHJldHVybiB0ZXh0ZG9tYWluX18gKGRvbWFpbm5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9pbnRsaC5pbnN0LmluIGIvaW50bC9pbnRsaC5pbnN0LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQzMjNjLi4wMDAwMDAwCi0tLSBhL2ludGwvaW50bGguaW5zdC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQklOVExfSAotI2RlZmluZSBfTElCSU5UTF9ICTEKLQotQElOQ0xVREVfTE9DQUxFX0hACi0KLS8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQotICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWV4dGVybiBjaGFyICpnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLSAgIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGNnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKLQkJCQlpbnQgX19jYXRlZ29yeSkpOwotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotCi0KLS8qIE9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuICAqLwotI2lmIGRlZmluZWQgX19PUFRJTUlaRUQKLS8qIFRoZXNlIG11c3QgYmUgYSBtYWNyby4gIElubGluZWQgZnVuY3Rpb25zIGFyZSB1c2VsZXNzIGJlY2F1c2UgdGhlCi0gICBgX19idWlsdGluX2NvbnN0YW50X3AnIHByZWRpY2F0ZSBpbiBkY2dldHRleHQgd291bGQgYWx3YXlzIHJldHVybgotICAgZmFsc2UuICAqLwotCi0jIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSBkZ2V0dGV4dCAoKGNoYXIgKikgMCwgbXNnaWQpCi0KLSMgZGVmaW5lIGRnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkKQkJCQkJICAgICAgXAotICBkY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUykKLQotIyBpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNykKLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gbG9hZG1zZ2NhdC5jLiAgV2UgbmVlZCBhIHNpZ24sCi0gICB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwKLSAgIHRyYW5zbGF0aW9ucy4gICovCi1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0KLSMgIGRlZmluZSBkY2dldHRleHQoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQkJCSAgICAgIFwKLSAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAotICAgKHsJCQkJCQkJCQkgICAgICBcCi0gICAgIGNoYXIgKl9fcmVzdWx0OwkJCQkJCQkgICAgICBcCi0gICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobXNnaWQpKQkJCQkJICAgICAgXAotICAgICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgc3RhdGljIGNoYXIgKl9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLQkgc3RhdGljIGludCBfX2NhdGFsb2dfY291bnRlcl9fOwkJCQkgICAgICBcCi0JIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKLQkgICB7CQkJCQkJCQkgICAgICBcCi0JICAgICBfX3RyYW5zbGF0aW9uX18gPQkJCQkJCSAgICAgIFwKLQkgICAgICAgKGRjZ2V0dGV4dCkgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CQkgICAgICBcCi0JICAgICBfX2NhdGFsb2dfY291bnRlcl9fID0gX25sX21zZ19jYXRfY250cjsJCQkgICAgICBcCi0JICAgfQkJCQkJCQkJICAgICAgXAotCSBfX3Jlc3VsdCA9IF9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLSAgICAgICB9CQkJCQkJCQkgICAgICBcCi0gICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLSAgICAgICBfX3Jlc3VsdCA9IChkY2dldHRleHQpICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkgICAgICBcCi0gICAgIF9fcmVzdWx0OwkJCQkJCQkJICAgICAgXAotICAgIH0pKQotIyBlbmRpZgotI2VuZGlmIC8qIE9wdGltaXppbmcuICovCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIGxpYmludGwuaCAqLwpkaWZmIC0tZ2l0IGEvaW50bC9sMTBuZmxpc3QuYyBiL2ludGwvbDEwbmZsaXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMmJjMTMuLjAwMDAwMDAKLS0tIGEvaW50bC9sMTBuZmxpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBfR05VX1NPVVJDRQotIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9BUkdaX0gKLSMgaW5jbHVkZSA8YXJnei5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLS8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLwotI2lmbmRlZiBOVUxMCi0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQotI2Vsc2UKLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIERlZmluZSBmdW5jdGlvbiB3aGljaCBhcmUgdXN1YWxseSBub3QgYXZhaWxhYmxlLiAgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX0NPVU5UCi0vKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBBUkdaLiAgKi8KLXN0YXRpYyBzaXplX3QgYXJnel9jb3VudF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyZ3osIHNpemVfdCBsZW4pKTsKLQotc3RhdGljIHNpemVfdAotYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCi0gICAgIGNvbnN0IGNoYXIgKmFyZ3o7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0gICAgICBhcmd6ICs9IHBhcnRfbGVuICsgMTsKLSAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgcmV0dXJuIGNvdW50OwotfQotIyB1bmRlZiBfX2FyZ3pfY291bnQKLSMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfQ09VTlQgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX1NUUklOR0lGWQotLyogTWFrZSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIEFSR1ogcHJpbnRhYmxlIGJ5IGNvbnZlcnRpbmcgYWxsIHRoZSAnXDAncwotICAgZXhjZXB0IHRoZSBsYXN0IGludG8gdGhlIGNoYXJhY3RlciBTRVAuICAqLwotc3RhdGljIHZvaWQgYXJnel9zdHJpbmdpZnlfXyBQQVJBTVMgKChjaGFyICphcmd6LCBzaXplX3QgbGVuLCBpbnQgc2VwKSk7Ci0KLXN0YXRpYyB2b2lkCi1hcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKLSAgICAgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGxlbjsKLSAgICAgaW50IHNlcDsKLXsKLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKLSAgICAgIGFyZ3ogKz0gcGFydF9sZW47Ci0gICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOwotICAgICAgaWYgKGxlbiA+IDApCi0JKmFyZ3orKyA9IHNlcDsKLSAgICB9Ci19Ci0jIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKLSMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIGFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfU1RSSU5HSUZZICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCi1zdGF0aWMgY2hhciAqYXJnel9uZXh0X18gUEFSQU1TICgoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLAotCQkJCSAgY29uc3QgY2hhciAqZW50cnkpKTsKLQotc3RhdGljIGNoYXIgKgotYXJnel9uZXh0X18gKGFyZ3osIGFyZ3pfbGVuLCBlbnRyeSkKLSAgICAgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGFyZ3pfbGVuOwotICAgICBjb25zdCBjaGFyICplbnRyeTsKLXsKLSAgaWYgKGVudHJ5KQotICAgIHsKLSAgICAgIGlmIChlbnRyeSA8IGFyZ3ogKyBhcmd6X2xlbikKLSAgICAgICAgZW50cnkgPSBzdHJjaHIgKGVudHJ5LCAnXDAnKSArIDE7Ci0KLSAgICAgIHJldHVybiBlbnRyeSA+PSBhcmd6ICsgYXJnel9sZW4gPyBOVUxMIDogKGNoYXIgKikgZW50cnk7Ci0gICAgfQotICBlbHNlCi0gICAgaWYgKGFyZ3pfbGVuID4gMCkKLSAgICAgIHJldHVybiBhcmd6OwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotfQotIyB1bmRlZiBfX2FyZ3pfbmV4dAotIyBkZWZpbmUgX19hcmd6X25leHQoYXJneiwgbGVuLCBlbnRyeSkgYXJnel9uZXh0X18gKGFyZ3osIGxlbiwgZW50cnkpCi0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9ORVhUICovCi0KLQotLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KLXN0YXRpYyBpbnQgcG9wIFBBUkFNUyAoKGludCB4KSk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3AgKHgpCi0gICAgIGludCB4OwotewotICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCi0gIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKLSAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOwotICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7Ci0gIHggPSAoKHggPj4gOCkgKyB4KSAmIDB4ZmY7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLQwKLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXJsaXN0LCBkaXJsaXN0X2xlbiwgbWFzaywgbGFuZ3VhZ2UsCi0JCSAgICB0ZXJyaXRvcnksIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCi0JCSAgICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIGRvX2FsbG9jYXRlKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdDsKLSAgICAgY29uc3QgY2hhciAqZGlybGlzdDsKLSAgICAgc2l6ZV90IGRpcmxpc3RfbGVuOwotICAgICBpbnQgbWFzazsKLSAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0gICAgIGNvbnN0IGNoYXIgKnRlcnJpdG9yeTsKLSAgICAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICptb2RpZmllcjsKLSAgICAgY29uc3QgY2hhciAqc3BlY2lhbDsKLSAgICAgY29uc3QgY2hhciAqc3BvbnNvcjsKLSAgICAgY29uc3QgY2hhciAqcmV2aXNpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBpbnQgZG9fYWxsb2NhdGU7Ci17Ci0gIGNoYXIgKmFic19maWxlbmFtZTsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbGFzdCA9IE5VTEw7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKLSAgY2hhciAqY3A7Ci0gIHNpemVfdCBlbnRyaWVzOwotICBpbnQgY250OwotCi0gIC8qIEFsbG9jYXRlIHJvb20gZm9yIHRoZSBmdWxsIGZpbGUgbmFtZS4gICovCi0gIGFic19maWxlbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlybGlzdF9sZW4KLQkJCQkgICsgc3RybGVuIChsYW5ndWFnZSkKLQkJCQkgICsgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAodGVycml0b3J5KSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKGNvZGVzZXQpICsgMSA6IDApCi0JCQkJICArICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChub3JtYWxpemVkX2NvZGVzZXQpICsgMSA6IDApCi0JCQkJICArICgoKG1hc2sgJiBYUEdfTU9ESUZJRVIpICE9IDAKLQkJCQkgICAgICB8fCAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCkKLQkJCQkgICAgID8gc3RybGVuIChtb2RpZmllcikgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChzcGVjaWFsKSArIDEgOiAwKQotCQkJCSAgKyAoKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKLQkJCQkgICAgICB8fCAobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKLQkJCQkgICAgID8gKDEgKyAoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAotCQkJCQkgICAgID8gc3RybGVuIChzcG9uc29yKSArIDEgOiAwKQotCQkJCQkrICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMAotCQkJCQkgICA/IHN0cmxlbiAocmV2aXNpb24pICsgMSA6IDApKSA6IDApCi0JCQkJICArIDEgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDEpOwotCi0gIGlmIChhYnNfZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR2YWwgPSBOVUxMOwotICBsYXN0ID0gTlVMTDsKLQotICAvKiBDb25zdHJ1Y3QgZmlsZSBuYW1lLiAgKi8KLSAgbWVtY3B5IChhYnNfZmlsZW5hbWUsIGRpcmxpc3QsIGRpcmxpc3RfbGVuKTsKLSAgX19hcmd6X3N0cmluZ2lmeSAoYWJzX2ZpbGVuYW1lLCBkaXJsaXN0X2xlbiwgJzonKTsKLSAgY3AgPSBhYnNfZmlsZW5hbWUgKyAoZGlybGlzdF9sZW4gLSAxKTsKLSAgKmNwKysgPSAnLyc7Ci0gIGNwID0gc3RwY3B5IChjcCwgbGFuZ3VhZ2UpOwotCi0gIGlmICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICdfJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgdGVycml0b3J5KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJy4nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBjb2Rlc2V0KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLic7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIG5vcm1hbGl6ZWRfY29kZXNldCk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiAoWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFKSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNvbXBvbmVudCBjYW4gYmUgcGFydCBvZiBib3RoIHN5bnRhY2VzIGJ1dCBoYXMgZGlmZmVyZW50Ci0JIGxlYWRpbmcgY2hhcmFjdGVycy4gIEZvciBDRU4gd2UgdXNlIGArJywgZWxzZSBgQCcuICAqLwotICAgICAgKmNwKysgPSAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCA/ICcrJyA6ICdAJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbW9kaWZpZXIpOwotICAgIH0KLSAgaWYgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnKyc7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIHNwZWNpYWwpOwotICAgIH0KLSAgaWYgKChtYXNrICYgKENFTl9TUE9OU09SIHwgQ0VOX1JFVklTSU9OKSkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcsJzsKLSAgICAgIGlmICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwKQotCWNwID0gc3RwY3B5IChjcCwgc3BvbnNvcik7Ci0gICAgICBpZiAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCi0JewotCSAgKmNwKysgPSAnXyc7Ci0JICBjcCA9IHN0cGNweSAoY3AsIHJldmlzaW9uKTsKLQl9Ci0gICAgfQotCi0gICpjcCsrID0gJy8nOwotICBzdHBjcHkgKGNwLCBmaWxlbmFtZSk7Ci0KLSAgLyogTG9vayBpbiBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMgd2hldGhlciBpdCBpcyBhbHJlYWR5Ci0gICAgIGF2YWlsYWJsZS4gICovCi0gIGxhc3QgPSBOVUxMOwotICBmb3IgKHJldHZhbCA9ICpsMTBuZmlsZV9saXN0OyByZXR2YWwgIT0gTlVMTDsgcmV0dmFsID0gcmV0dmFsLT5uZXh0KQotICAgIGlmIChyZXR2YWwtPmZpbGVuYW1lICE9IE5VTEwpCi0gICAgICB7Ci0JaW50IGNvbXBhcmUgPSBzdHJjbXAgKHJldHZhbC0+ZmlsZW5hbWUsIGFic19maWxlbmFtZSk7Ci0JaWYgKGNvbXBhcmUgPT0gMCkKLQkgIC8qIFdlIGZvdW5kIGl0ISAgKi8KLQkgIGJyZWFrOwotCWlmIChjb21wYXJlIDwgMCkKLQkgIHsKLQkgICAgLyogSXQncyBub3QgaW4gdGhlIGxpc3QuICAqLwotCSAgICByZXR2YWwgPSBOVUxMOwotCSAgICBicmVhazsKLQkgIH0KLQotCWxhc3QgPSByZXR2YWw7Ci0gICAgICB9Ci0KLSAgaWYgKHJldHZhbCAhPSBOVUxMIHx8IGRvX2FsbG9jYXRlID09IDApCi0gICAgewotICAgICAgZnJlZSAoYWJzX2ZpbGVuYW1lKTsKLSAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gIHJldHZhbCA9IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCi0gICAgbWFsbG9jIChzaXplb2YgKCpyZXR2YWwpICsgKF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pCi0JCQkJKiAoMSA8PCBwb3AgKG1hc2spKQotCQkJCSogc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopKSk7Ci0gIGlmIChyZXR2YWwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR2YWwtPmZpbGVuYW1lID0gYWJzX2ZpbGVuYW1lOwotICByZXR2YWwtPmRlY2lkZWQgPSAoX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgIT0gMQotCQkgICAgIHx8ICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCi0JCQkgJiYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKSk7Ci0gIHJldHZhbC0+ZGF0YSA9IE5VTEw7Ci0KLSAgaWYgKGxhc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR2YWwtPm5leHQgPSAqbDEwbmZpbGVfbGlzdDsKLSAgICAgICpsMTBuZmlsZV9saXN0ID0gcmV0dmFsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHZhbC0+bmV4dCA9IGxhc3QtPm5leHQ7Ci0gICAgICBsYXN0LT5uZXh0ID0gcmV0dmFsOwotICAgIH0KLQotICBlbnRyaWVzID0gMDsKLSAgLyogSWYgdGhlIERJUkxJU1QgaXMgYSByZWFsIGxpc3QgdGhlIFJFVFZBTCBlbnRyeSBjb3JyZXNwb25kcyBub3QgdG8KLSAgICAgYSByZWFsIGZpbGUuICBTbyB3ZSBoYXZlIHRvIHVzZSB0aGUgRElSTElTVCBzZXBhcmF0aW9uIG1lY2hhbmlzbQotICAgICBvZiB0aGUgaW5uZXIgbG9vcC4gICovCi0gIGNudCA9IF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pID09IDEgPyBtYXNrIC0gMSA6IG1hc2s7Ci0gIGZvciAoOyBjbnQgPj0gMDsgLS1jbnQpCi0gICAgaWYgKChjbnQgJiB+bWFzaykgPT0gMAotCSYmICgoY250ICYgQ0VOX1NQRUNJRklDKSA9PSAwIHx8IChjbnQgJiBYUEdfU1BFQ0lGSUMpID09IDApCi0JJiYgKChjbnQgJiBYUEdfQ09ERVNFVCkgPT0gMCB8fCAoY250ICYgWFBHX05PUk1fQ09ERVNFVCkgPT0gMCkpCi0gICAgICB7Ci0JLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCi0JY2hhciAqZGlyID0gTlVMTDsKLQotCXdoaWxlICgoZGlyID0gX19hcmd6X25leHQgKChjaGFyICopIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBkaXIpKQotCSAgICAgICAhPSBOVUxMKQotCSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQotCSAgICA9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLCBjbnQsCi0JCQkJICBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAotCQkJCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJCQkgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7Ci0gICAgICB9Ci0gIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXNdID0gTlVMTDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAotICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KLSAgIG5hbWVzLiAgKi8KLWNvbnN0IGNoYXIgKgotX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb2Rlc2V0LCBuYW1lX2xlbikKLSAgICAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgICAgc2l6ZV90IG5hbWVfbGVuOwotewotICBpbnQgbGVuID0gMDsKLSAgaW50IG9ubHlfZGlnaXQgPSAxOwotICBjaGFyICpyZXR2YWw7Ci0gIGNoYXIgKndwOwotICBzaXplX3QgY250OwotCi0gIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotICAgIGlmIChpc2FsbnVtIChjb2Rlc2V0W2NudF0pKQotICAgICAgewotCSsrbGVuOwotCi0JaWYgKGlzYWxwaGEgKGNvZGVzZXRbY250XSkpCi0JICBvbmx5X2RpZ2l0ID0gMDsKLSAgICAgIH0KLQotICByZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKChvbmx5X2RpZ2l0ID8gMyA6IDApICsgbGVuICsgMSk7Ci0KLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChvbmx5X2RpZ2l0KQotCXdwID0gc3RwY3B5IChyZXR2YWwsICJpc28iKTsKLSAgICAgIGVsc2UKLQl3cCA9IHJldHZhbDsKLQotICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCi0JaWYgKGlzYWxwaGEgKGNvZGVzZXRbY250XSkpCi0JICAqd3ArKyA9IHRvbG93ZXIgKGNvZGVzZXRbY250XSk7Ci0JZWxzZSBpZiAoaXNkaWdpdCAoY29kZXNldFtjbnRdKSkKLQkgICp3cCsrID0gY29kZXNldFtjbnRdOwotCi0gICAgICAqd3AgPSAnXDAnOwotICAgIH0KLQotICByZXR1cm4gKGNvbnN0IGNoYXIgKikgcmV0dmFsOwotfQotCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvbGliZ2V0dGV4dC5oIGIvaW50bC9saWJnZXR0ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNGRlNGQuLjAwMDAwMDAKLS0tIGEvaW50bC9saWJnZXR0ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEJlY2F1c2Ugb24gc29tZSBzeXN0ZW1zIChlLmcuIFNvbGFyaXMpIHdlIHNvbWV0aW1lcyBoYXZlIHRvIGluY2x1ZGUKLSAgIHRoZSBzeXN0ZW1zIGxpYmludGwuaCBhcyB3ZWxsIGFzIHRoaXMgZmlsZSB3ZSBoYXZlIG1vcmUgY29tcGxleAotICAgaW5jbHVkZSBwcm90ZWN0aW9uIGFib3ZlLiAgQnV0IHRoZSBzeXN0ZW1zIGhlYWRlciBtaWdodCBwZXJoYXBzIGFsc28KLSAgIGRlZmluZSBfTElCSU5UTF9IIGFuZCB0aGVyZWZvcmUgd2UgaGF2ZSB0byBwcm90ZWN0IHRoZSBkZWZpbml0aW9uIGhlcmUuICAqLwotCi0jaWYgIWRlZmluZWQgKF9MSUJJTlRMX0gpIHx8ICFkZWZpbmVkIChfTElCR0VUVEVYVF9IKQotI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKQotIyBkZWZpbmUgX0xJQklOVExfSAkxCi0jZW5kaWYKLSNkZWZpbmUgX0xJQkdFVFRFWFRfSAkxCi0KLS8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQotICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSMgaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX0dOVUNfXwotIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jIGVsc2UKLSMgIGRlZmluZSBOVUxMICgwKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiAhSEFWRV9MQ19NRVNTQUdFUwotLyogVGhpcyB2YWx1ZSBkZXRlcm1pbmVzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGdldHRleHQoKSBhbmQgZGdldHRleHQoKQotICAgZnVuY3Rpb24uICBCdXQgc29tZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGlzIGRlZmluZWQuICBEZWZpbmUgaXQKLSAgIHRvIGEgZGVmYXVsdCB2YWx1ZS4gICovCi0jIGRlZmluZSBMQ19NRVNTQUdFUyAoLTEpCi0jZW5kaWYKLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIGdldHRleHQtdXNpbmctY2F0Z2V0cyBpbnRlcmZhY2UuICBEZXJpdmVkIGZyb20KLSAgIEppbSBNZXllcmluZydzIGxpYmludGwuaC4gICovCi1zdHJ1Y3QgX21zZ19lbnQKLXsKLSAgY29uc3QgY2hhciAqX21zZzsKLSAgaW50IF9tc2dfbnVtYmVyOwotfTsKLQotCi0jaWYgSEFWRV9DQVRHRVRTCi0vKiBUaGVzZSB0d28gdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIHRoZSBhdXRvbWF0aWNhbGx5IGJ5IHBvLXRvLXRibC5zZWQKLSAgIGdlbmVyYXRlZCBmaWxlIGBjYXQtaWQtdGJsLmMnLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXTsKLWV4dGVybiBpbnQgX21zZ190YmxfbGVuZ3RoOwotI2VuZGlmCi0KLQotLyogRm9yIGF1dG9tYXRpY2FsIGV4dHJhY3Rpb24gb2YgbWVzc2FnZXMgc29tZXRpbWVzIG5vIHJlYWwKLSAgIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4gIEluc3RlYWQgdGhlIHN0cmluZyBpdHNlbGYgaXMgdGhlIHJlc3VsdC4gICovCi0jZGVmaW5lIGdldHRleHRfbm9vcChTdHIpIChTdHIpCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotZXh0ZXJuIGNoYXIgKmdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOwotZXh0ZXJuIGNoYXIgKmdldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpkZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLSAgIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGNnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKLQkJCQlpbnQgX19jYXRlZ29yeSkpOwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgIGNvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KSk7Ci0KLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1leHRlcm4gY2hhciAqdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluX18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluX18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLQotI2lmIEVOQUJMRV9OTFMKLQotLyogU29sYXJpcyAyLjMgaGFzIHRoZSBnZXR0ZXh0IGZ1bmN0aW9uIGJ1dCBkY2dldHRleHQgaXMgbWlzc2luZy4KLSAgIFNvIHdlIG9taXQgdGhpcyBvcHRpbWl6YXRpb24gZm9yIFNvbGFyaXMgMi4zLiAgQlRXLCBTb2xhcmlzIDIuNAotICAgaGFzIGRjZ2V0dGV4dC4gICovCi0jIGlmICFIQVZFX0NBVEdFVFMgJiYgKCFIQVZFX0dFVFRFWFQgfHwgSEFWRV9EQ0dFVFRFWFQpCi0KLSMgIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKQkJCQkJCSAgICAgIFwKLSAgICAgZGdldHRleHQgKE5VTEwsIE1zZ2lkKQotCi0jICBkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpCQkJCQkgICAgICBcCi0gICAgIGRjZ2V0dGV4dCAoRG9tYWlubmFtZSwgTXNnaWQsIExDX01FU1NBR0VTKQotCi0jICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNwotLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBsb2FkbXNnY2F0LmMuICBXZSBuZWVkIGEgc2lnbiwKLSAgIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbAotICAgdHJhbnNsYXRpb25zLiAgKi8KLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQotIyAgIGRlZmluZSBkY2dldHRleHQoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KQkJCSAgICAgIFwKLSAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAotICAgKHsJCQkJCQkJCQkgICAgICBcCi0gICAgIGNoYXIgKl9fcmVzdWx0OwkJCQkJCQkgICAgICBcCi0gICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoTXNnaWQpKQkJCQkJICAgICAgXAotICAgICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgc3RhdGljIGNoYXIgKl9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLQkgc3RhdGljIGludCBfX2NhdGFsb2dfY291bnRlcl9fOwkJCQkgICAgICBcCi0JIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKLQkgICB7CQkJCQkJCQkgICAgICBcCi0JICAgICBfX3RyYW5zbGF0aW9uX18gPQkJCQkJCSAgICAgIFwKLQkgICAgICAgZGNnZXR0ZXh0X18gKERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSk7CQkgICAgICBcCi0JICAgICBfX2NhdGFsb2dfY291bnRlcl9fID0gX25sX21zZ19jYXRfY250cjsJCQkgICAgICBcCi0JICAgfQkJCQkJCQkJICAgICAgXAotCSBfX3Jlc3VsdCA9IF9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLSAgICAgICB9CQkJCQkJCQkgICAgICBcCi0gICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLSAgICAgICBfX3Jlc3VsdCA9IGRjZ2V0dGV4dF9fIChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpOwkJICAgICAgXAotICAgICBfX3Jlc3VsdDsJCQkJCQkJCSAgICAgIFwKLSAgICB9KSkKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSNlbHNlCi0KLSMgZGVmaW5lIGdldHRleHQoTXNnaWQpIChNc2dpZCkKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKSAoTXNnaWQpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KSAoTXNnaWQpCi0jIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbm5hbWUpIHdoaWxlICgwKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW5uYW1lLCBEaXJuYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLwotCi0jZW5kaWYKLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9saWJpbnRsLmdsaWJjIGIvaW50bC9saWJpbnRsLmdsaWJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTViOGY5Li4wMDAwMDAwCi0tLSBhL2ludGwvbGliaW50bC5nbGliYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBsaWJnZXR0ZXh0LmggLS0gTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi1Db3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLUNvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyLgotVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmlsZSBsaWJnZXR0ZXh0LmggaW4gdGhlIEdOVSBnZXR0ZXh0IHBhY2thZ2UuCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9MSUJJTlRMX0gKLSNkZWZpbmUgX0xJQklOVExfSAkxCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLQotI2luY2x1ZGUgPGxvY2FsZS5oPgotCi0jZGVmaW5lIF9fbmVlZF9OVUxMCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQotICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLQotX19CRUdJTl9ERUNMUwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWV4dGVybiBjaGFyICpnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19tc2dpZCkpOwotZXh0ZXJuIGNoYXIgKl9fZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCkpOwotZXh0ZXJuIGNoYXIgKl9fZGdldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICAgX19jb25zdCBjaGFyICpfX21zZ2lkLCBpbnQgX19jYXRlZ29yeSkpOwotZXh0ZXJuIGNoYXIgKl9fZGNnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKLQotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci1leHRlcm4gY2hhciAqX190ZXh0ZG9tYWluIF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgX19jb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLWV4dGVybiBjaGFyICpfX2JpbmR0ZXh0ZG9tYWluIF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgICBfX2NvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotCi0KLS8qIE9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhYm92ZS4gICovCi0jaWYgZGVmaW5lZCBfX09QVElNSVpFRAotLyogVGhlc2UgbXVzdCBiZSBhIG1hY3JvLiAgSW5saW5lZCBmdW5jdGlvbnMgYXJlIHVzZWxlc3MgYmVjYXVzZSB0aGUKLSAgIGBfX2J1aWx0aW5fY29uc3RhbnRfcCcgcHJlZGljYXRlIGluIGRjZ2V0dGV4dCB3b3VsZCBhbHdheXMgcmV0dXJuCi0gICBmYWxzZS4gICovCi0KLSMgZGVmaW5lIGdldHRleHQobXNnaWQpIGRnZXR0ZXh0IChOVUxMLCBtc2dpZCkKLQotIyBkZWZpbmUgZGdldHRleHQoZG9tYWlubmFtZSwgbXNnaWQpCQkJCQkgICAgICBcCi0gIGRjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKQotCi0jIGlmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3KQotIyAgZGVmaW5lIGRjZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCQkJICAgICAgXAotICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCi0gICAoewkJCQkJCQkJCSAgICAgIFwKLSAgICAgY2hhciAqcmVzdWx0OwkJCQkJCQkgICAgICBcCi0gICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobXNnaWQpKQkJCQkJICAgICAgXAotICAgICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwkJCQkJICAgICAgXAotCSBzdGF0aWMgY2hhciAqX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotCSBzdGF0aWMgaW50IF9fY2F0YWxvZ19jb3VudGVyX187CQkJCSAgICAgIFwKLQkgaWYgKCEgX190cmFuc2xhdGlvbl9fIHx8IF9fY2F0YWxvZ19jb3VudGVyX18gIT0gX25sX21zZ19jYXRfY250cikgICAgXAotCSAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgIF9fdHJhbnNsYXRpb25fXyA9CQkJCQkJICAgICAgXAotCSAgICAgICBfX2RjZ2V0dGV4dCAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJCSAgICAgIFwKLQkgICAgIF9fY2F0YWxvZ19jb3VudGVyX18gPSBfbmxfbXNnX2NhdF9jbnRyOwkJCSAgICAgIFwKLQkgICB9CQkJCQkJCQkgICAgICBcCi0JIHJlc3VsdCA9IF9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLSAgICAgICB9CQkJCQkJCQkgICAgICBcCi0gICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLSAgICAgICByZXN1bHQgPSBfX2RjZ2V0dGV4dCAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJICAgICAgXAotICAgICByZXN1bHQ7CQkJCQkJCQkgICAgICBcCi0gICAgfSkpCi0jIGVuZGlmCi0jZW5kaWYgLyogT3B0aW1pemluZy4gKi8KLQotCi1fX0VORF9ERUNMUwotCi0jZW5kaWYgLyogbGliaW50bC5oICovCmRpZmYgLS1naXQgYS9pbnRsL2xpbnV4LW1zZy5zZWQgYi9pbnRsL2xpbnV4LW1zZy5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MThlNzIuLjAwMDAwMDAKLS0tIGEvaW50bC9saW51eC1tc2cuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgcG8ybXNnLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gTGludXggc3R5bGUgLm1zZyBmaWxlCi0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIwotIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSAubXNnIHNob3VsZCBiZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSMgbWVzc2FnZSBzZXQgbnVtYmVyLiAgV2UgdXNlIGFsd2F5cyBzZXQgbnVtYmVyIDEuCi0jCi0xIHsKLSAgaVwKLSRzZXQgMSAjIEF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBwbzJtc2cuc2VkCi0gIGgKLSAgcy8uKi8wLwotICB4Ci19Ci0jCi0jIE1pdGNoJ3Mgb2xkIGNhdGFsb2cgZm9ybWF0IGRvZXMgbm90IGFsbG93IGNvbW1lbnRzLgotIwotIyBXZSBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFzIGEgY29tbWVudCBpbnRvIHRoZSAubXNnIGZpbGUuCi0jCi0vXm1zZ2lkLyB7Ci0gIHMvbXNnaWRbIAldKiIvLwotIwotIyBUaGlzIGRvZXMgbm90IHdvcmsgbm93IHdpdGggdGhlIG5ldyBmb3JtYXQuCi0jIC8iJC8hIHsKLSMgICBzL1xcJC8vCi0jICAgcy8kLyAuLi4gKG1vcmUgbGluZXMgZm9sbG93aW5nKSIvCi0jIH0KLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSAgRwotICBzL1woLipcKSJcblwoWzAtOV0qXCkvJCAjXDIgT3JpZ2luYWwgTWVzc2FnZTooXDEpL3AKLX0KLSMKLSMgVGhlIC5tc2cgZmlsZSBjb250YWlucywgb3RoZXIgdGhlbiB0aGUgLnBvIGZpbGUsIG9ubHkgdGhlIHRyYW5zbGF0aW9ucwotIyBidXQgZWFjaCBnaXZlbiBhIHVuaXF1ZSBJRC4gIFN0YXJ0aW5nIGZyb20gMSBhbmQgaW5jcmVtZW50aW5nIGJ5IDEgZm9yCi0jIGVhY2ggbWVzc2FnZSB3ZSBhc3NpZ24gdGhlbSB0byB0aGUgbWVzc2FnZXMuCi0jIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSAucG8gZmlsZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjYXQtaWQtdGJsLmMgZmlsZQotIyAod2l0aCBwby10by10YmwpIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBoZXJlLiAgKEF0IGxlYXN0IHRoZSBvcmRlcgotIyBvZiBkZWNsYXJhdGlvbnMgbXVzdCBub3QgYmUgY2hhbmdlZC4pCi0jCi0vXm1zZ3N0ci8gewotICBzL21zZ3N0clsgCV0qIlwoLipcKSIvIyBcMS8KLSMgQ2xlYXIgc3Vic3RpdHV0aW9uIGZsYWcuCi0gIHRiCi0jIEFwcGVuZCB0aGUgbmV4dCBsaW5lLgotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KLSAgcy9cKC4qXG5cKSJcKC4qXCkiL1wxXDIvCi0jIFllcywgdGhlbiBicmFuY2guCi0gIHRhCi0gIFAKLSAgRAotIyBOb3RlIHRoYXQgRCBpbmNsdWRlcyBhIGp1bXAgdG8gdGhlIHN0YXJ0ISEKLSMgV2UgZm91bmQgYSBjb250aW51YXRpb24gbGluZS4gIEJ1dCBiZWZvcmUgcHJpbnRpbmcgaW5zZXJ0ICdcJy4KLSAgOmEKLSAgcy9cKC4qXClcKFxuLipcKS9cMVxcXDIvCi0gIFAKLSMgV2UgY2Fubm90IHVzZSBEIGhlcmUuCi0gIHMvLipcblwoLipcKS9cMS8KLSAgdGIKLX0KLWQKZGlmZiAtLWdpdCBhL2ludGwvbG9hZGluZm8uaCBiL2ludGwvbG9hZGluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3YzJlYi4uMDAwMDAwMAotLS0gYS9pbnRsL2xvYWRpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBFbmNvZGluZyBvZiBsb2NhbGUgbmFtZSBwYXJ0cy4gICovCi0jZGVmaW5lIENFTl9SRVZJU0lPTgkJMQotI2RlZmluZSBDRU5fU1BPTlNPUgkJMgotI2RlZmluZSBDRU5fU1BFQ0lBTAkJNAotI2RlZmluZSBYUEdfTk9STV9DT0RFU0VUCTgKLSNkZWZpbmUgWFBHX0NPREVTRVQJCTE2Ci0jZGVmaW5lIFRFUlJJVE9SWQkJMzIKLSNkZWZpbmUgQ0VOX0FVRElFTkNFCQk2NAotI2RlZmluZSBYUEdfTU9ESUZJRVIJCTEyOAotCi0jZGVmaW5lIENFTl9TUEVDSUZJQwkoQ0VOX1JFVklTSU9OfENFTl9TUE9OU09SfENFTl9TUEVDSUFMfENFTl9BVURJRU5DRSkKLSNkZWZpbmUgWFBHX1NQRUNJRklDCShYUEdfQ09ERVNFVHxYUEdfTk9STV9DT0RFU0VUfFhQR19NT0RJRklFUikKLQotCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlCi17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBpbnQgZGVjaWRlZDsKLQotICBjb25zdCB2b2lkICpkYXRhOwotCi0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKm5leHQ7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnN1Y2Nlc3NvclsxXTsKLX07Ci0KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9ub3JtYWxpemVfY29kZXNldCBQQVJBTVMgKChjb25zdCBjaGFyICpjb2Rlc2V0LAotCQkJCQkJICBzaXplX3QgbmFtZV9sZW4pKTsKLQotZXh0ZXJuIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAotCQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwgaW50IG1hc2ssCi0JCQkgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKLQkJCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LAotCQkJICAgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJCSAgICBjb25zdCBjaGFyICptb2RpZmllciwgY29uc3QgY2hhciAqc3BlY2lhbCwKLQkJCSAgICBjb25zdCBjaGFyICpzcG9uc29yLCBjb25zdCBjaGFyICpyZXZpc2lvbiwKLQkJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKSk7Ci0KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotCi1leHRlcm4gaW50IF9ubF9leHBsb2RlX25hbWUgUEFSQU1TICgoY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmxhbmd1YWdlLAotCQkJCSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnRlcnJpdG9yeSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipjb2Rlc2V0LAotCQkJCSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipzcGVjaWFsLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnNwb25zb3IsCi0JCQkJICAgICBjb25zdCBjaGFyICoqcmV2aXNpb24pKTsKZGlmZiAtLWdpdCBhL2ludGwvbG9hZG1zZ2NhdC5jIGIvaW50bC9sb2FkbXNnY2F0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZTkwYTkuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2FkbXNnY2F0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogTG9hZCBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQKSB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gSVNPIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBJU08gQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgZnN0YXQgIF9fZnN0YXQKLSMgZGVmaW5lIG9wZW4gICBfX29wZW4KLSMgZGVmaW5lIGNsb3NlICBfX2Nsb3NlCi0jIGRlZmluZSByZWFkICAgX19yZWFkCi0jIGRlZmluZSBtbWFwICAgX19tbWFwCi0jIGRlZmluZSBtdW5tYXAgX19tdW5tYXAKLSNlbmRpZgotCi0vKiBXZSBuZWVkIGEgc2lnbiwgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkCi0gICB3aXRoIGFsbCB0cmFuc2xhdGlvbnMuICBUaGlzIGlzIGltcG9ydGFudCBpZiB0aGUgdHJhbnNsYXRpb25zIGFyZQotICAgY2FjaGVkIGJ5IG9uZSBvZiBHQ0MncyBmZWF0dXJlcy4gICovCi1pbnQgX25sX21zZ19jYXRfY250ciA9IDA7Ci0KLQotLyogTG9hZCB0aGUgbWVzc2FnZSBjYXRhbG9ncyBzcGVjaWZpZWQgYnkgRklMRU5BTUUuICBJZiBpdCBpcyBubyB2YWxpZAotICAgbWVzc2FnZSBjYXRhbG9nIGRvIG5vdGhpbmcuICAqLwotdm9pZAotX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSkKLSAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGU7Ci17Ci0gIGludCBmZDsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIHN0cnVjdCBtb19maWxlX2hlYWRlciAqZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTE7Ci0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKLSAgaW50IHVzZV9tbWFwID0gMDsKLSNlbmRpZgotICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotCi0gIGRvbWFpbl9maWxlLT5kZWNpZGVkID0gMTsKLSAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOwotCi0gIC8qIElmIHRoZSByZWNvcmQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgbG9jYWxlIHRoZSBGSUxFTkFNRQotICAgICBtaWdodCBiZSBOVUxMLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgotICAgICBzcGVjaWZpY2F0aW9uIHRoZSBsb2NhbGUgZmlsZSBuYW1lIGlzIGRpZmZlcmVudCBmb3IgWFBHIGFuZCBDRU4KLSAgICAgc3ludGF4LiAgKi8KLSAgaWYgKGRvbWFpbl9maWxlLT5maWxlbmFtZSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBUcnkgdG8gb3BlbiB0aGUgYWRkcmVzc2VkIGZpbGUuICAqLwotICBmZCA9IG9wZW4gKGRvbWFpbl9maWxlLT5maWxlbmFtZSwgT19SRE9OTFkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIG11c3Qga25vdyBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gICovCi0gIGlmIChmc3RhdCAoZmQsICZzdCkgIT0gMAotICAgICAgJiYgc3Quc3Rfc2l6ZSA8IChvZmZfdCkgc2l6ZW9mIChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIpKQotICAgIHsKLSAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgKi8KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKLSAgLyogTm93IHdlIGFyZSByZWFkeSB0byBsb2FkIHRoZSBmaWxlLiAgSWYgbW1hcCgpIGlzIGF2YWlsYWJsZSB3ZSB0cnkKLSAgICAgdGhpcyBmaXJzdC4gIElmIG5vdCBhdmFpbGFibGUgb3IgaXQgZmFpbGVkIHdlIHRyeSB0byBsb2FkIGl0LiAgKi8KLSAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbW1hcCAoTlVMTCwgc3Quc3Rfc2l6ZSwgUFJPVF9SRUFELAotCQkJCQkgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLQotICBpZiAoZGF0YSAhPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xKQotICAgIHsKLSAgICAgIC8qIG1tYXAoKSBjYWxsIHdhcyBzdWNjZXNzZnVsLiAgKi8KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICB1c2VfbW1hcCA9IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogSWYgdGhlIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgKGkuZS4gbW1hcCdlZCkgd2UgdHJ5IHRvIGxvYWQKLSAgICAgaXQgbWFudWFsbHkuICAqLwotICBpZiAoZGF0YSA9PSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xKQotICAgIHsKLSAgICAgIG9mZl90IHRvX3JlYWQ7Ci0gICAgICBjaGFyICpyZWFkX3B0cjsKLQotICAgICAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbWFsbG9jIChzdC5zdF9zaXplKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgICB0b19yZWFkID0gc3Quc3Rfc2l6ZTsKLSAgICAgIHJlYWRfcHRyID0gKGNoYXIgKikgZGF0YTsKLSAgICAgIGRvCi0JewotCSAgbG9uZyBpbnQgbmIgPSAobG9uZyBpbnQpIHJlYWQgKGZkLCByZWFkX3B0ciwgdG9fcmVhZCk7Ci0JICBpZiAobmIgPT0gLTEpCi0JICAgIHsKLQkgICAgICBjbG9zZSAoZmQpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICByZWFkX3B0ciArPSBuYjsKLQkgIHRvX3JlYWQgLT0gbmI7Ci0JfQotICAgICAgd2hpbGUgKHRvX3JlYWQgPiAwKTsKLQotICAgICAgY2xvc2UgKGZkKTsKLSAgICB9Ci0KLSAgLyogVXNpbmcgdGhlIG1hZ2ljIG51bWJlciB3ZSBjYW4gdGVzdCB3aGV0aGVyIGl0IHJlYWxseSBpcyBhIG1lc3NhZ2UKLSAgICAgY2F0YWxvZyBmaWxlLiAgKi8KLSAgaWYgKGRhdGEtPm1hZ2ljICE9IF9NQUdJQyAmJiBkYXRhLT5tYWdpYyAhPSBfTUFHSUNfU1dBUFBFRCkKLSAgICB7Ci0gICAgICAvKiBUaGUgbWFnaWMgbnVtYmVyIGlzIHdyb25nOiBub3QgYSBtZXNzYWdlIGNhdGFsb2cgZmlsZS4gICovCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKLSAgICAgIGlmICh1c2VfbW1hcCkKLQltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzdC5zdF9zaXplKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCWZyZWUgKGRhdGEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkb21haW5fZmlsZS0+ZGF0YQotICAgID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2RvbWFpbikpOwotICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOwotICBkb21haW4tPmRhdGEgPSAoY2hhciAqKSBkYXRhOwotICBkb21haW4tPm11c3Rfc3dhcCA9IGRhdGEtPm1hZ2ljICE9IF9NQUdJQzsKLQotICAvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXZhaWxhYmxlIHRhYmxlcy4gICovCi0gIHN3aXRjaCAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZG9tYWluLT5uc3RyaW5ncyA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5uc3RyaW5ncyk7Ci0gICAgICBkb21haW4tPm9yaWdfdGFiID0gKHN0cnVjdCBzdHJpbmdfZGVzYyAqKQotCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm9yaWdfdGFiX29mZnNldCkpOwotICAgICAgZG9tYWluLT50cmFuc190YWIgPSAoc3RydWN0IHN0cmluZ19kZXNjICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+dHJhbnNfdGFiX29mZnNldCkpOwotICAgICAgZG9tYWluLT5oYXNoX3NpemUgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfc2l6ZSk7Ci0gICAgICBkb21haW4tPmhhc2hfdGFiID0gKG5sc191aW50MzIgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5oYXNoX3RhYl9vZmZzZXQpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGlzIGlzIGFuIGlsbGVnYWwgcmV2aXNpb24uICAqLwotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gICAgICBpZiAodXNlX21tYXApCi0JbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc3Quc3Rfc2l6ZSk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlmcmVlIChkYXRhKTsKLSAgICAgIGZyZWUgKGRvbWFpbik7Ci0gICAgICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNob3cgdGhhdCBvbmUgZG9tYWluIGlzIGNoYW5nZWQuICBUaGlzIG1pZ2h0IG1ha2Ugc29tZSBjYWNoZWQKLSAgICAgdHJhbnNsYXRpb25zIGludmFsaWQuICAqLwotICArK19ubF9tc2dfY2F0X2NudHI7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2xvY2FsZWFsaWFzLmMgYi9pbnRsL2xvY2FsZWFsaWFzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZDkxOTQuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2NhbGVhbGlhcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qIEhhbmRsZSBhbGlhc2VzIGZvciBsb2NhbGUgbmFtZXMKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICpnZXRlbnYgKCk7Ci0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBfR05VX1NPVVJDRQotIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgc3RyY2FzZWNtcCBfX3N0cmNhc2VjbXAKLSNlbmRpZgotCi0KLS8qIEZvciB0aG9zZSBsb29zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLSNpZmRlZiBIQVZFX0FMTE9DQQotLyogTm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCi0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLwotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLwotI2Vsc2UKLXN0cnVjdCBibG9ja19saXN0Ci17Ci0gIHZvaWQgKmFkZHJlc3M7Ci0gIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OwotfTsKLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCi0gICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCi0gICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAotICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAotICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCi0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCi0jZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KLQotCi1zdHJ1Y3QgYWxpYXNfbWFwCi17Ci0gIGNvbnN0IGNoYXIgKmFsaWFzOwotICBjb25zdCBjaGFyICp2YWx1ZTsKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBhbGlhc19tYXAgKm1hcDsKLXN0YXRpYyBzaXplX3Qgbm1hcCA9IDA7Ci1zdGF0aWMgc2l6ZV90IG1heG1hcCA9IDA7Ci0KLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBzaXplX3QgcmVhZF9hbGlhc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZm5hbWVfbGVuKSk7Ci1zdGF0aWMgdm9pZCBleHRlbmRfYWxpYXNfdGFibGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBhbGlhc19jb21wYXJlIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsCi0JCQkJICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKSk7Ci0KLQotY29uc3QgY2hhciAqCi1fbmxfZXhwYW5kX2FsaWFzIChuYW1lKQotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhbGVfYWxpYXNfcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOwotICBzdHJ1Y3QgYWxpYXNfbWFwICpyZXR2YWw7Ci0gIHNpemVfdCBhZGRlZDsKLQotICBkbwotICAgIHsKLSAgICAgIHN0cnVjdCBhbGlhc19tYXAgaXRlbTsKLQotICAgICAgaXRlbS5hbGlhcyA9IG5hbWU7Ci0KLSAgICAgIGlmIChubWFwID4gMCkKLQlyZXR2YWwgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBic2VhcmNoICgmaXRlbSwgbWFwLCBubWFwLAotCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLQkJCQkJICAgICAgIChpbnQgKCopIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwKLQkJCQkJCQkJIGNvbnN0IHZvaWQgKikpCi0JCQkJCQkpIGFsaWFzX2NvbXBhcmUpOwotICAgICAgZWxzZQotCXJldHZhbCA9IE5VTEw7Ci0KLSAgICAgIC8qIFdlIHJlYWxseSBmb3VuZCBhbiBhbGlhcy4gIFJldHVybiB0aGUgdmFsdWUuICAqLwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXJldHVybiByZXR2YWwtPnZhbHVlOwotCi0gICAgICAvKiBQZXJoYXBzIHdlIGNhbiBmaW5kIGFub3RoZXIgYWxpYXMgZmlsZS4gICovCi0gICAgICBhZGRlZCA9IDA7Ci0gICAgICB3aGlsZSAoYWRkZWQgPT0gMCAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnKQotCXsKLQkgIGNvbnN0IGNoYXIgKnN0YXJ0OwotCi0JICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gPT0gJzonKQotCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOwotCSAgc3RhcnQgPSBsb2NhbGVfYWxpYXNfcGF0aDsKLQotCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJzonKQotCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOwotCi0JICBpZiAoc3RhcnQgPCBsb2NhbGVfYWxpYXNfcGF0aCkKLQkgICAgYWRkZWQgPSByZWFkX2FsaWFzX2ZpbGUgKHN0YXJ0LCBsb2NhbGVfYWxpYXNfcGF0aCAtIHN0YXJ0KTsKLQl9Ci0gICAgfQotICB3aGlsZSAoYWRkZWQgIT0gMCk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHNpemVfdAotcmVhZF9hbGlhc19maWxlIChmbmFtZSwgZm5hbWVfbGVuKQotICAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICAgaW50IGZuYW1lX2xlbjsKLXsKLSNpZm5kZWYgSEFWRV9BTExPQ0EKLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOwotI2VuZGlmCi0gIEZJTEUgKmZwOwotICBjaGFyICpmdWxsX2ZuYW1lOwotICBzaXplX3QgYWRkZWQ7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGFsaWFzZmlsZVtdID0gIi9sb2NhbGUuYWxpYXMiOwotCi0gIGZ1bGxfZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKGZuYW1lX2xlbiArIHNpemVvZiBhbGlhc2ZpbGUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGZ1bGxfZm5hbWUpOwotICBtZW1jcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pOwotICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0KLSAgZnAgPSBmb3BlbiAoZnVsbF9mbmFtZSwgInIiKTsKLSAgaWYgKGZwID09IE5VTEwpCi0gICAgewotICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFkZGVkID0gMDsKLSAgd2hpbGUgKCFmZW9mIChmcCkpCi0gICAgewotICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCi0JIGEpIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMKLQkgYikgdGhlc2UgZmllbGRzIG11c3QgYmUgdXNhYmxlIGFzIGZpbGUgbmFtZXMgYW5kIHNvIG11c3Qgbm90Ci0JICAgIGJlIHRoYXQgbG9uZwotICAgICAgICovCi0gICAgICBjaGFyIGJ1ZltCVUZTSVpdOwotICAgICAgY2hhciAqYWxpYXM7Ci0gICAgICBjaGFyICp2YWx1ZTsKLSAgICAgIGNoYXIgKmNwOwotCi0gICAgICBpZiAoZmdldHMgKGJ1ZiwgQlVGU0laLCBmcCkgPT0gTlVMTCkKLQkvKiBFT0YgcmVhY2hlZC4gICovCi0JYnJlYWs7Ci0KLSAgICAgIGNwID0gYnVmOwotICAgICAgLyogSWdub3JlIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKLQkrK2NwOwotCi0gICAgICAvKiBBIGxlYWRpbmcgJyMnIHNpZ25hbHMgYSBjb21tZW50IGxpbmUuICAqLwotICAgICAgaWYgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJyMnKQotCXsKLQkgIGFsaWFzID0gY3ArKzsKLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCi0JICAgICsrY3A7Ci0JICAvKiBUZXJtaW5hdGUgYWxpYXMgbmFtZS4gICovCi0JICBpZiAoY3BbMF0gIT0gJ1wwJykKLQkgICAgKmNwKysgPSAnXDAnOwotCi0JICAvKiBOb3cgbG9vayBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmFsdWUuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKLQkgICAgKytjcDsKLQotCSAgaWYgKGNwWzBdICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBjaGFyICp0cDsKLQkgICAgICBzaXplX3QgbGVuOwotCi0JICAgICAgdmFsdWUgPSBjcCsrOwotCSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCi0JCSsrY3A7Ci0JICAgICAgLyogVGVybWluYXRlIHZhbHVlLiAgKi8KLQkgICAgICBpZiAoY3BbMF0gPT0gJ1xuJykKLQkJewotCQkgIC8qIFRoaXMgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHRlc3QKLQkJICAgICBmb3IgdGhlIGVuZCBvZiBsaW5lIHBvc3NpYmxlLiAgV2UgYXJlIGxvb2tpbmcgZm9yCi0JCSAgICAgdGhlIHRlcm1pbmF0aW5nICdcbicgd2hpY2ggZG8gbm90IG92ZXJ3cml0ZSBoZXJlLiAgKi8KLQkJICAqY3ArKyA9ICdcMCc7Ci0JCSAgKmNwID0gJ1xuJzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGNwWzBdICE9ICdcMCcpCi0JCSpjcCsrID0gJ1wwJzsKLQotCSAgICAgIGlmIChubWFwID49IG1heG1hcCkKLQkJZXh0ZW5kX2FsaWFzX3RhYmxlICgpOwotCi0JICAgICAgLyogV2UgY2Fubm90IGRlcGVuZCBvbiBzdHJkdXAgYXZhaWxhYmxlIGluIHRoZSBsaWJjLiAgU2lnaCEgICovCi0JICAgICAgbGVuID0gc3RybGVuIChhbGlhcykgKyAxOwotCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmICh0cCA9PSBOVUxMKQotCQl7Ci0JCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCQkgIHJldHVybiBhZGRlZDsKLQkJfQotCSAgICAgIG1lbWNweSAodHAsIGFsaWFzLCBsZW4pOwotCSAgICAgIG1hcFtubWFwXS5hbGlhcyA9IHRwOwotCi0JICAgICAgbGVuID0gc3RybGVuICh2YWx1ZSkgKyAxOwotCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmICh0cCA9PSBOVUxMKQotCQl7Ci0JCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCQkgIHJldHVybiBhZGRlZDsKLQkJfQotCSAgICAgIG1lbWNweSAodHAsIHZhbHVlLCBsZW4pOwotCSAgICAgIG1hcFtubWFwXS52YWx1ZSA9IHRwOwotCi0JICAgICAgKytubWFwOwotCSAgICAgICsrYWRkZWQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFBvc3NpYmx5IG5vdCB0aGUgd2hvbGUgbGluZSBmaXRzIGludG8gdGhlIGJ1ZmZlci4gIElnbm9yZQotCSB0aGUgcmVzdCBvZiB0aGUgbGluZS4gICovCi0gICAgICB3aGlsZSAoc3RyY2hyIChjcCwgJ1xuJykgPT0gTlVMTCkKLQl7Ci0JICBjcCA9IGJ1ZjsKLQkgIGlmIChmZ2V0cyAoYnVmLCBCVUZTSVosIGZwKSA9PSBOVUxMKQotCSAgICAvKiBNYWtlIHN1cmUgdGhlIGlubmVyIGxvb3Agd2lsbCBiZSBsZWZ0LiAgVGhlIG91dGVyIGxvb3AKLQkgICAgICAgd2lsbCBleGl0IGF0IHRoZSBgZmVvZicgdGVzdC4gICovCi0JICAgICpjcCA9ICdcbic7Ci0JfQotICAgIH0KLQotICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCi0gICAgIGVycm9ycy4gIC0tZHJlcHBlciAgKi8KLSAgZmNsb3NlIChmcCk7Ci0KLSAgaWYgKGFkZGVkID4gMCkKLSAgICBxc29ydCAobWFwLCBubWFwLCBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAotCSAgIChpbnQgKCopIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkpIGFsaWFzX2NvbXBhcmUpOwotCi0gIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLSAgcmV0dXJuIGFkZGVkOwotfQotCi0KLXN0YXRpYyB2b2lkCi1leHRlbmRfYWxpYXNfdGFibGUgKCkKLXsKLSAgc2l6ZV90IG5ld19zaXplOwotICBzdHJ1Y3QgYWxpYXNfbWFwICpuZXdfbWFwOwotCi0gIG5ld19zaXplID0gbWF4bWFwID09IDAgPyAxMDAgOiAyICogbWF4bWFwOwotICBuZXdfbWFwID0gKHN0cnVjdCBhbGlhc19tYXAgKikgbWFsbG9jIChuZXdfc2l6ZQotCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKLSAgaWYgKG5ld19tYXAgPT0gTlVMTCkKLSAgICAvKiBTaW1wbHkgZG9uJ3QgZXh0ZW5kOiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNvcmUuICAqLwotICAgIHJldHVybjsKLQotICBtZW1jcHkgKG5ld19tYXAsIG1hcCwgbm1hcCAqIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCkpOwotCi0gIGlmIChtYXhtYXAgIT0gMCkKLSAgICBmcmVlIChtYXApOwotCi0gIG1hcCA9IG5ld19tYXA7Ci0gIG1heG1hcCA9IG5ld19zaXplOwotfQotCi0KLXN0YXRpYyBpbnQKLWFsaWFzX2NvbXBhcmUgKG1hcDEsIG1hcDIpCi0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDE7Ci0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDI7Ci17Ci0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSQ0FTRUNNUAotICByZXR1cm4gc3RyY2FzZWNtcCAobWFwMS0+YWxpYXMsIG1hcDItPmFsaWFzKTsKLSNlbHNlCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMS0+YWxpYXM7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMi0+YWxpYXM7Ci0gIHVuc2lnbmVkIGNoYXIgYzEsIGMyOwotCi0gIGlmIChwMSA9PSBwMikKLSAgICByZXR1cm4gMDsKLQotICBkbwotICAgIHsKLSAgICAgIC8qIEkga25vdyB0aGlzIHNlZW1zIHRvIGJlIG9kZCBidXQgdGhlIHRvbG93ZXIoKSBmdW5jdGlvbiBpbgotCSBzb21lIHN5c3RlbXMgbGliYyBjYW5ub3QgaGFuZGxlIG5vbmFscGhhIGNoYXJhY3RlcnMuICAqLwotICAgICAgYzEgPSBpc3VwcGVyICgqcDEpID8gdG9sb3dlciAoKnAxKSA6ICpwMTsKLSAgICAgIGMyID0gaXN1cHBlciAoKnAyKSA/IHRvbG93ZXIgKCpwMikgOiAqcDI7Ci0gICAgICBpZiAoYzEgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgICsrcDE7Ci0gICAgICArK3AyOwotICAgIH0KLSAgd2hpbGUgKGMxID09IGMyKTsKLQotICByZXR1cm4gYzEgLSBjMjsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvaW50bC9wbzJ0Ymwuc2VkLmluIGIvaW50bC9wbzJ0Ymwuc2VkLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JjY2E0Li4wMDAwMDAwCi0tLSBhL2ludGwvcG8ydGJsLnNlZC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jIHBvMnRibC5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIGxvb2t1cCB0YWJsZSBmb3IgY2F0Z2V0cwotIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLTEgewotICBpXAotLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgcG8ydGJsLnNlZCBmcm9tIEBQQUNLQUdFIE5BTUVALnBvdC4gICovXAotXAotI2lmIEhBVkVfQ09ORklHX0hcCi0jIGluY2x1ZGUgPGNvbmZpZy5oPlwKLSNlbmRpZlwKLVwKLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiXAotXAotY29uc3Qgc3RydWN0IF9tc2dfZW50IF9tc2dfdGJsW10gPSB7Ci0gIGgKLSAgcy8uKi8wLwotICB4Ci19Ci0jCi0jIFdyaXRlIG1zZ2lkIGVudHJpZXMgaW4gQyBhcnJheSBmb3JtLgotIwotL15tc2dpZC8gewotICBzL21zZ2lkWyAJXSpcKCIuKiJcKS8gIHtcMS8KLSAgdGIKLSMgQXBwZW5kIHRoZSBuZXh0IGxpbmUKLSAgOmIKLSAgTgotIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgY29udGludWF0aW9uIGxpbmUuCi0gIHMvXCguKlwpIlwoXG5cKSJcKC4qIlwpL1wxXDJcMy8KLSMgWWVzLCB0aGVuIGJyYW5jaC4KLSAgdGEKLSMgQmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgZmlsZSBjb3JyZWN0bHkgZm9ybWVkIHRoZSBsaW5lCi0jIGp1c3QgcmVhZCBjYW5ub3QgYmUgYWdhaW4gYmUgYSBtc2dpZCBsaW5lLiAgU28gaXQncyBzYWZlIHRvIGlnbm9yZQotIyBpdC4KLSAgcy9cKC4qXClcbi4qL1wxLwotICBiYwotIyBXZSBmb3VuZCBhIGNvbnRpbnVhdGlvbiBsaW5lLiAgQnV0IGJlZm9yZSBwcmludGluZyBpbnNlcnQgJ1wnLgotICA6YQotICBzL1woLipcKVwoXG4uKlwpL1wxXFxcMi8KLSAgUAotIyBXZSBjYW5ub3QgdXNlIEQgaGVyZS4KLSAgcy8uKlxuXCguKlwpL1wxLwotIyBTb21lIGJ1Z2d5IHNlZHMgZG8gbm90IGNsZWFyIHRoZSBgc3VjY2Vzc2Z1bCBzdWJzdGl0dXRpb24gc2luY2UgbGFzdCBgYHQnJycKLSMgZmxhZyBvbiBgTicsIHNvIHdlIGRvIGEgYHQnIGhlcmUgdG8gY2xlYXIgaXQuCi0gIHRiCi0jIE5vdCByZWFjaGVkCi0gIDpjCi0gIHgKLSMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5Ci0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotICB0ZAotIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgotIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCi0gIDpkCi0gIHMvOVwoXypcKSQvX1wxLwotICB0ZAotIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KLSAgcy9eXChfKlwpJC8wXDEvCi0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KLSAgcy84XChfKlwpJC85XDEvCi0gIHMvN1woXypcKSQvOFwxLwotICBzLzZcKF8qXCkkLzdcMS8KLSAgcy81XChfKlwpJC82XDEvCi0gIHMvNFwoXypcKSQvNVwxLwotICBzLzNcKF8qXCkkLzRcMS8KLSAgcy8yXChfKlwpJC8zXDEvCi0gIHMvMVwoXypcKSQvMlwxLwotICBzLzBcKF8qXCkkLzFcMS8KLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KLSAgcy9fLzAvZwotICB4Ci0gIEcKLSAgcy9cKC4qXClcblwoWzAtOV0qXCkvXDEsIFwyfSwvCi0gIHMvXCguKlwpIiQvXDEvCi0gIHAKLX0KLSMKLSMgTGFzdCBsaW5lLgotIwotJCB7Ci0gIGlcCi19O1wKLQotICBnCi0gIHMvMCpcKC4qXCkvaW50IF9tc2dfdGJsX2xlbmd0aCA9IFwxOy9wCi19Ci1kCmRpZmYgLS1naXQgYS9pbnRsL3RleHRkb21haW4uYyBiL2ludGwvdGV4dGRvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ5MzQwLi4wMDAwMDAwCi0tLSBhL2ludGwvdGV4dGRvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZXh0ZG9tYWluKDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IHRleHQgZG9tYWluLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW107Ci0KLS8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgVEVYVERPTUFJTiBfX3RleHRkb21haW4KLSMgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0jZWxzZQotIyBkZWZpbmUgVEVYVERPTUFJTiB0ZXh0ZG9tYWluX18KLSNlbmRpZgotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWNoYXIgKgotVEVYVERPTUFJTiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgY2hhciAqb2xkOwotCi0gIC8qIEEgTlVMTCBwb2ludGVyIHJlcXVlc3RzIHRoZSBjdXJyZW50IHNldHRpbmcuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICBvbGQgPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICAvKiBJZiBkb21haW4gbmFtZSBpcyB0aGUgbnVsbCBzdHJpbmcgc2V0IHRvIGRlZmF1bHQgZG9tYWluICJtZXNzYWdlcyIuICAqLwotICBpZiAoZG9tYWlubmFtZVswXSA9PSAnXDAnCi0gICAgICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKSA9PSAwKQotICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgZm9sbG93aW5nIG1hbGxvYyBmYWlscyBgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4nCi0JIHdpbGwgYmUgTlVMTC4gIFRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhbmQgc28gc2lnbmFscyB3ZQotCSBhcmUgb3V0IG9mIGNvcmUuICAqLwotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBzdHJkdXAgKGRvbWFpbm5hbWUpOwotI2Vsc2UKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKLSAgICAgIGNoYXIgKmNwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKGNwICE9IE5VTEwpCi0JbWVtY3B5IChjcCwgZG9tYWlubmFtZSwgbGVuKTsKLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gY3A7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKG9sZCAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKLSAgICBmcmVlIChvbGQpOwotCi0gIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fdGV4dGRvbWFpbiwgdGV4dGRvbWFpbik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwveG9wZW4tbXNnLnNlZCBiL2ludGwveG9wZW4tbXNnLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5YzBiYi4uMDAwMDAwMAotLS0gYS9pbnRsL3hvcGVuLW1zZy5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotIyBwbzJtc2cuc2VkIC0gQ29udmVydCBVbmlmb3J1bSBzdHlsZSAucG8gZmlsZSB0byBYL09wZW4gc3R5bGUgLm1zZyBmaWxlCi0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIwotIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSAubXNnIHNob3VsZCBiZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSMgbWVzc2FnZSBzZXQgbnVtYmVyLiAgV2UgdXNlIGFsd2F5cyBzZXQgbnVtYmVyIDEuCi0jCi0xIHsKLSAgaVwKLSRzZXQgMSAjIEF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBwbzJtc2cuc2VkCi0gIGgKLSAgcy8uKi8wLwotICB4Ci19Ci0jCi0jIFdlIGNvcHkgYWxsIGNvbW1lbnRzIGludG8gdGhlIC5tc2cgZmlsZS4gIFBlcmhhcHMgdGhleSBjYW4gaGVscC4KLSMKLS9eIy8gcy9eI1sgCV0qLyQgL3AKLSMKLSMgV2UgY29weSB0aGUgb3JpZ2luYWwgbWVzc2FnZSBhcyBhIGNvbW1lbnQgaW50byB0aGUgLm1zZyBmaWxlLgotIwotL15tc2dpZC8gewotIyBEb2VzIG5vdCB3b3JrIG5vdwotIyAgLyIkLyEgewotIyAgICBzL1xcJC8vCi0jICAgIHMvJC8gLi4uIChtb3JlIGxpbmVzIGZvbGxvd2luZykiLwotIyAgfQotICBzL15tc2dpZFsgCV0qIlwoLipcKSIkLyQgT3JpZ2luYWwgTWVzc2FnZTogXDEvCi0gIHAKLX0KLSMKLSMgVGhlIC5tc2cgZmlsZSBjb250YWlucywgb3RoZXIgdGhlbiB0aGUgLnBvIGZpbGUsIG9ubHkgdGhlIHRyYW5zbGF0aW9ucwotIyBidXQgZWFjaCBnaXZlbiBhIHVuaXF1ZSBJRC4gIFN0YXJ0aW5nIGZyb20gMSBhbmQgaW5jcmVtZW50aW5nIGJ5IDEgZm9yCi0jIGVhY2ggbWVzc2FnZSB3ZSBhc3NpZ24gdGhlbSB0byB0aGUgbWVzc2FnZXMuCi0jIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSAucG8gZmlsZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjYXQtaWQtdGJsLmMgZmlsZQotIyAod2l0aCBwby10by10YmwpIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBoZXJlLiAgKEF0IGxlYXN0IHRoZSBvcmRlcgotIyBvZiBkZWNsYXJhdGlvbnMgbXVzdCBub3QgYmUgY2hhbmdlZC4pCi0jCi0vXm1zZ3N0ci8gewotICBzL21zZ3N0clsgCV0qIlwoLipcKSIvXDEvCi0gIHgKLSMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5Ci0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotICB0ZAotIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgotIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCi0gIDpkCi0gIHMvOVwoXypcKSQvX1wxLwotICB0ZAotIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KLSAgcy9eXChfKlwpJC8wXDEvCi0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KLSAgcy84XChfKlwpJC85XDEvCi0gIHMvN1woXypcKSQvOFwxLwotICBzLzZcKF8qXCkkLzdcMS8KLSAgcy81XChfKlwpJC82XDEvCi0gIHMvNFwoXypcKSQvNVwxLwotICBzLzNcKF8qXCkkLzRcMS8KLSAgcy8yXChfKlwpJC8zXDEvCi0gIHMvMVwoXypcKSQvMlwxLwotICBzLzBcKF8qXCkkLzFcMS8KLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KLSAgcy9fLzAvZwotICB4Ci0jIEJyaW5nIHRoZSBsaW5lIGluIHRoZSBmb3JtYXQgYDxudW1iZXI+IDxtZXNzYWdlPicKLSAgRwotICBzL15bXlxuXSokLyYgLwotICBzL1woLipcKVxuXChbMC05XSpcKS9cMiBcMS8KLSMgQ2xlYXIgZmxhZyBmcm9tIGxhc3Qgc3Vic3RpdHV0aW9uLgotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KLSAgOmIKLSAgTgotIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgYSBjb250aW51YXRpb24gbGluZS4KLSAgcy9cKC4qXG5cKSJcKC4qXCkiL1wxXDIvCi0jIFllcywgdGhlbiBicmFuY2guCi0gIHRhCi0gIFAKLSAgRAotIyBOb3RlIHRoYXQgYEQnIGluY2x1ZGVzIGEganVtcCB0byB0aGUgc3RhcnQhIQotIyBXZSBmb3VuZCBhIGNvbnRpbnVhdGlvbiBsaW5lLiAgQnV0IGJlZm9yZSBwcmludGluZyBpbnNlcnQgJ1wnLgotICA6YQotICBzL1woLipcKVwoXG4uKlwpL1wxXFxcMi8KLSAgUAotIyBXZSBjYW5ub3QgdXNlIHRoZSBzZWQgY29tbWFuZCBgRCcgaGVyZQotICBzLy4qXG5cKC4qXCkvXDEvCi0gIHRiCi19Ci1kCmRpZmYgLS1naXQgYS9sZC9DaGFuZ2VMb2cgYi9sZC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTViOGEuLjAwMDAwMDAKLS0tIGEvbGQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsOTEzMCArMCwwIEBACi0xOTk5LTA3LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGFmdGVyX29wZW4pOiBBYm9ydCBpZiBpbnB1dCBmb3JtYXQgaXMgQVJNIGFuZAotCW91dHB1dCBmb3JtYXQgaXMgbm90LiAKLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtIChhZnRlcl9vcGVuKTogQWJvcnQgaWYgaW5wdXQgZm9ybWF0IGlzIEFSTQotCWFuZCBvdXRwdXQgZm9ybWF0IGlzIG5vdC4gCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtIChhZnRlcl9vcGVuKTogQWJvcnQgaWYgaW5wdXQgZm9ybWF0IGlzIEFSTQotCWFuZCBvdXRwdXQgZm9ybWF0IGlzIG5vdC4gCi0KLTE5OTktMDctMDIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZGxhbmcuYzogUmV2ZXJ0IGNoYW5nZSBvZiAxOTk5LTA2LTIzLgotCi0xOTk5LTA2LTMwICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMyYm1pcG4zMi5vLgotCShlZWxmMzJibWlwbjMyLmMpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlLnRndCAobWlwcy1zZ2ktaXJpeDYqKTogTWFrZSBuMzIgdGhlIGRlZmF1bHQKLQllbXVsYXRpb24uCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcG4zMi5zaDogTmV3IGZpbGUuCi0JCi0xOTk5LTA2LTI4ICBKaW0gUGljayA8amltQGppbXBpY2suY29tPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBBZGRlZCBjb2RlIHNvIHRoYXQgLnhzIGxpbmtlciBzY3JpcHRzIGFyZQotCWNhbGxlZCBzbyB0aGF0IEFSTSBzaGFyZWQgbGlicmFyaWVzIGFyZSBidWlsdCBjb3JyZWN0bHkuCi0KLTE5OTktMDYtMjIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBsaW5rX2luZm8uaW5pdF9mdW5jdGlvbiBhbmQKLQlsaW5rX2luZm8uZmluaV9mdW5jdGlvbi4KLQkqIGxleHN1cC5jIChPUFRJT05fSU5JVCk6IE5ldyBtYWNyby4KLQkoT1BUSU9OX0ZJTkkpOiBMaWtld2lzZS4KLQkobGRfb3B0aW9ucyk6IEFkZCBkZXNjcmlwdGlvbnMgZm9yIHRoZW0uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgdGhlbS4KLQotMTk5OS0wNi0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogT25seSBkaXNjYXJkIGxpbmsgb25jZQotCXNlY3Rpb25zIGlmIHdlIGFyZSBidWlsZGluZyBjb25zdHJ1Y3RvcnMuCi0KLTE5OTktMDYtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKExvY2F0aW9uIENvdW50ZXIpOiBEZXNjcmliZSBiZWhhdmlvdXIgb2YKLQlsb2NhdGlvbiBjb3VudGVyIGluc2lkZSBzZWN0aW9uIHN0YXRlbWVudHMuCi0KLTE5OTktMDYtMjAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoV1JJVEFCTEVfUk9EQVRBKTogTmV3IHZhcmlhYmxlIGZvcgotCWNvbnRyb2xsaW5nIHdoZXRoZXIgb3Igbm90IC5yb2RhdGEgaXMgaW4gdGhlIGRhdGEgc2VnbWVudCBvciB0aGUKLQl0ZXh0IHNlZ21lbnQuCi0KLTE5OTktMDYtMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogQWRkIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIC0tdGh1bWItZW50cnkuCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBBZGQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggLS10aHVtYi1lbnRyeS4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBBZGQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggLS10aHVtYi1lbnRyeS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IG5ldyBBUk0gY29tbWFuZCBsaW5lIHN3aXRjaDogLS10aHVtYi1lbnRyeS4JCi0xOTk5LTA2LTIwICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxsX2xpYnBhdGgpOiBBY2N1bXVsYXRlIGFjcm9zcyBhbGwgZW5hYmxlZCB0YXJnZXRzLgotCi1TdW4gSnVuIDIwIDE0OjEwOjMzIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW06IFdhdGNoIEVNVUxBVElPTl9MSUJQQVRIIGluc3RlYWQgb2YKLQlERUZBVUxUX0VNVUxBVElPTi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IExpa2V3aXNlLgotCi1GcmkgSnVuIDE4IDE1OjI0OjQ4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChHRU5TQ1JJUFRTKTogUGFzcyBFTVVMQVRJT05fTElCUEFUSCwgbm90IEVNVUwuCi0JKiBjb25maWd1cmUuaW4gKGFsbF9lbXVscyk6IEFkZCB0YXJnX2V4dHJhX2xpYnBhdGguCi0JKGFsbF9saWJwYXRoLCBFTVVMQVRJT05fTElCUEFUSCk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMtKi1saW51eC1nbnUqKTogRGVmaW5lIHRhcmdfZXh0cmFfbGlicGF0aC4KLQkqIGdlbnNjcmlwdHMuc2ggKExJQl9QQVRIKTogRGVmaW5lIGlmIGVtdWxhdGlvbiBpbiBFTVVMQVRJT05fTElCUEFUSC4KLQotTW9uIEp1biAxNCAxMDozODozNiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLnRleGluZm86IEZpeCB1c2Ugb2YgQGl0ZW0gdnMuIEBpdGVteC4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIFRob21hcyBaZW5rZXIgPHRoekBsZW5uYXJ0ei1lbGVjdHJvbmljLmRlPjoKLQkqIGxkZ3JhbS55IChhdHRyaWJ1dGVzX29wdCk6IFVzZSBhdHRyaWJ1dGVzX2xpc3QgaW5zdGVhZCBvZiBOQU1FLgotCShhdHRyaWJ1dGVzX2xpc3QsIGF0dHJpYnV0ZXNfc3RyaW5nKTogTmV3IG5vbnRlcm1pbmFscy4KLQkqIGxkbGFuZy5jIChsYW5nX3NldF9mbGFncyk6IEFkZCBpbnZlcnQgcGFyYW1ldGVyLiAgRG9uJ3QgaGFuZGxlCi0JJyEnLgotCSogbGRsYW5nLmMgKGxhbmdfc2V0X2ZsYWdzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UpOiBEb24ndCBhZGQKLQllbnRyeV9zeW1ib2wgYXMgYW4gdW5kZWZpbmVkIHN5bWJvbCB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlCi0JbGluay4gIEZyb20gPGplZmZkYkBnb29kbmV0LmNvbT4uCi0KLTE5OTktMDYtMTIgIERhdmlkIE8nQnJpZW4gIDxvYnJpZW5AZnJlZWJzZC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IChpWzM0NTZdODYtKi1mcmVlYnNkKik6IE5vdyBkZWZhdWx0cyB0byBFTEYuCi0KLTE5OTktMDYtMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChoZWxwKTogUmVzdG9yZSBwcmV2aW91cyBmb3JtYXQgb2Ygb3V0cHV0LgotCi0xOTk5LTA2LTA0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IElmIGNvbXBpbGluZyBmb3IgYXJtX2Vwb2NfcGUgcmVuYW1lCi0JaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0byBhdm9pZCBhIG5hbWUgc3BhY2UgY2xhc2guCi0KLTE5OTktMDYtMDIgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogQWRkIGluaXRwIHN1cHBvcnQuCi0KLTE5OTktMDYtMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogUmVuYW1lIGdsb2JhbCBhcm0gaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0bwotCWF2b2lkIG5hbWUgY29sbGlzaW9uIHdoZW4gYWxsIHRhcmdldHMgQkZEIGlzIGJ1aWx0LgotCi0xOTk5LTA1LTMwICBDb3J0IERvdWdhbiAgPGNvcnRAYXR0aXMuY3Mubm10LmVkdT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMnBwY2xpbnV4Lm8uCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotbGludXgtZ251KTogVXNlIGl0LgotCSogZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoOiBOZXcgZmlsZS4KLQotMTk5OS0wNS0yOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBDbGFyaWZ5IHRoYXQgb3B0aW9ucyB3aGljaCByZWZlciB0byBmaWxlcwotCW11c3QgYmUgcHJvcGVybHkgb3JkZXJlZC4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbSAoLi4uX3BhcnNlX2FyZ3MpOiBOZXcgZnVuY3Rpb246IFBhcnNlCi0JY29tbWFuZCBsaW5lIG9wdGlvbi4gIEFjY2VwdCBhcm0tZWxmIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb24KLQknLXAnIG9yICctLW5vLXBpcGVsaW5lLWtub3dsZWRnZScuCi0JKC4uLl9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb246IERlc2NyaWJlIHRoZSBuZXcgY29tbWFuZCBsaW5lCi0Jb3B0aW9uLgotCSguLi5fYmVmb3JlX2FsbG9jYXRpb24pOiBQYXNzIHRoZSB2YWx1ZSBvZiB0aGUgbmV3IHZhcmlhYmxlCi0Jbm9fcGlwZWxpbmVfa25vd2xlZGdlIHRvIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLQkKLQkqIGVtdWx0ZW1wL2FybWVsZl9vYWJpLmVtICguLi5fYmVmb3JlX2FsbG9jYXRpb24pOiBQYXNzIHplcm8gYXMKLQl0aGUgdGhpcmQgcGFyYW1ldGVyIHRvIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLQotMTk5OS0wNS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKGhlbHApOiBNaW5vciBmb3JtYXR0aW5nIGNoYW5nZXMuCi0KLTE5OTktMDUtMjggIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGk5NjAtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJfaTk2MC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMyX2k5NjAuby4KLQkoZWVsZjMyX2k5NjAuYyk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNS0yNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaCAoVEVNUExBVEVfTkFNRSk6IFNldCB0byBhcm1lbGZfb2FiaS4gCi0KLTE5OTktMDUtMjQgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW0gKGJlZm9yZV9wYXJzZSk6IFNldCBjb25maWcuZHluYW1pY19saW5rIGFuZAotIAljb25maWcuaGFzX3NoYXJlZC4KLQkqIGVtdWxwYXJhbXMvYXJtZWxmLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUuCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogTGlrZXdpc2UuCi0KLTE5OTktMDQtMTMgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW06IEFkZCBkZWZpbml0aW9ucyByZWxhdGVkIHRvIHNoYXJlZCBvYmplY3RzCi0JKGNvcGllZCBmcm9tIGVsZjMyLmVtKS4KLQotV2VkIE1heSAxOSAxMjo0NDoyNiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IFJlbW92ZSBlYXJtbGludXgubyBhbmQKLQllYXJtMjZsaW51eC5vLCBhZGQgZWFybWVsZl9saW51eC5vIGFuZCBlYXJtZWxmX2xpbnV4MjYuby4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUuCi0JKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUuCi0KLVRodSBNYXkgMTMgMDk6NDg6MDkgMTk5OSAgSm9lbCBTaGVycmlsbCAoam9lbEBPQVJjb3JwLmNvbSkKLQotCSogY29uZmlndXJlLnRndCAoaTM4Ni0qLXJ0ZW1zZWxmKiwgc2gtKi1ydGVtc2VsZiopOiBOZXcgdGFyZ2V0cy4KLQkobWlwcyplbC0qLXJ0ZW1zKiwgcG93ZXJwY2xlLSotcnRlbXMqKTogTmV3IHRhcmdldHMuCi0KLTE5OTktMDUtMTAgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogU3BlY2lmeSB0aGUgb3V0cHV0IGFyY2gsIHdoaWNoIElhbiBzYXlzIGlzCi0JdGhlIFJpZ2h0IFRoaW5nIHRvIGRvLgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IHZhcmlvdXMgY2hhbmdlcyB0byBwYXJhbWV0ZXJpemUgdGhlCi0JdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uLgotCShnbGRfaTM4NnBlX2FmdGVyX29wZW4pOiBEZXRlY3QgYW5kIGZpeCBNUyBpbXBvcnQgbGlicmFyaWVzCi0JYnkgcmVuYW1pbmcgdGhlIG1lbWJlciBvYmplY3RzICh3aGljaCBhcmUgYWxsIG5hbWVkIHRoZSBzYW1lKS4KLQotCSogcGUtZGxsLmM6IHZhcmlvdXMgY2hhbmdlcyB0byBwYXJhbWV0ZXJpemUgdGhlIHRhcmdldC1zcGVjaWZpYwotCWluZm9ybWF0aW9uLgotCShnZW5lcmF0ZV9yZWxvYyk6IHN1cHBvcnQgcmVsb2NzIG1vcmUgZ2VuZXJpY2FsbHkgdG8gYWxsb3cgZm9yCi0JZXhwYW5zaW9uLgotCShwZV9leGVfYnVpbGRfc2VjdGlvbnMpOiBuZXc7IHVzZWQgdG8gYWRkIC5yZWxvY3MgdG8gLmV4ZXMKLQkocGVfZXhlX2ZpbGxfc2VjdGlvbnMpOiBkaXR0bwotCi0xOTk5LTA1LTEwICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6Ci0JQ2hlY2sgZm9yIFRBUkdFVF9JU19hcm1fZXBvY19wZS4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLTE5OTktMDUtMTIgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2Fsa193aWxkLCB3YWxrX3dpbGRfZmlsZSwgd2Fsa193aWxkX3NlY3Rpb24sCi0Jb3V0cHV0X3NlY3Rpb25fY2FsbGJhY2ssIGdjX3NlY3Rpb25fY2FsbGJhY2spOiBOZXcgZnVuY3Rpb25zIGZvcgotCWdlbmVyaWMgc2VjdGlvbiB3YWxrcy4KLQkod2lsZCwgbGFuZ19nY193aWxkKTogVXNlIHdhbGtfd2lsZC4KLQkod2lsZF9maWxlLCBsYW5nX2djX3dpbGRfZmlsZSk6IERlbGV0ZWQuIENvbW1vbiBsb2dpYyBtb3ZlZCB0bwotCXdhbGtfd2lsZF9maWxlLgotCSh3aWxkX3NlY3Rpb24sIGxhbmdfZ2Nfd2lsZF9zZWN0aW9uKTogRGVsZXRlZC4gQ29tbW9uIGxvZ2ljIG1vdmVkCi0JdG8gd2Fsa19maWxkX3NlY3Rpb24uICBVbmlxdWUgbG9naWMgbW92ZWQgaW50byBjYWxsYmFja3MKLQlvdXRwdXRfc2VjdGlvbl9jYWxsYmFjayBhbmQgZ2Nfc2VjdGlvbl9jYWxsYmFjay4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMTIgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eC5zaDogTmV3IGZpbGUuICBTdXBwb3J0IGZvciBBUk0gCi0JR05VL0xpbnV4IEVMRiBBQkkuCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoOiBOZXcgZmlsZS4gQVBDUy0yNiB2ZXJzaW9uIG9mIGFib3ZlLgotCSogY29uZmlndXJlLnRndDogRm9yIGFybSotKi1saW51eC1nbnUqLCBzZXQgZGVmYXVsdCBlbXVsYXRpb24gdG8KLQlgYXJtZWxmX2xpbnV4JywgYW5kIGFsc28gaW5jbHVkZSBgYXJtZWxmX2xpbnV4MjYnIGFuZCBgYXJtZWxmJy4KLQkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgdG8gbWFrZSBlYXJtbGludXguYyBhbmQgZWFybWxpbnV4MjYuYy4KLQkoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybWxpbnV4Lm8gYW5kIGVhcm1saW51eDI2Lm8uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVsZl9pMzg2X2JlLm8uCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1iZW9zKik6IFVzZSBpdC4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3QgZGVjbGFyZSBlbnZpcm9uLgotCSogc3lzZGVwLmggKGVudmlyb24pOiBEZWNsYXJlIGlmIG5lZWRlZC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAobGRncmFtX3ZlcnNfY3VycmVudF9sYW5nKTogTmV3LgotCSh2ZXJzX2RlZm5zKTogQWNjZXB0IGBleHRlcm4gImxhbmciIHsgfScgc3ludGF4LgotCSogbGRsZXgubCAodmVyc19ub2RlX25lc3RpbmcpOiBOZXcuCi0JKFZfSURFTlRJRklFUik6IEFjY2VwdCAuIGFuZCAkIGluIHN5bWJvbHMuCi0JKFZFUlNfTk9ERSk6IEFjY2VwdCBgZXh0ZXJuICJsYW5nIiB7IH0nIHRva2Vucy4gIE5lc3QgVkVSU19OT0RFIHN0YXRlcy4KLQkqIGxkbGFuZy5jIChsYW5nX25ld192ZXJzX3JlZ2V4KTogTmV3IGBsYW5nJyBhcmd1bWVudC4gIFVwZGF0ZSBjYWxsZXJzLgotCShsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jcGx1c3BsdXMpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfdmVyc19tYXRjaF9sYW5nX2phdmEpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24pOiBGaXggaXRlcmF0aW9uLiAgRG9uJ3QgZnJlZQotCXNlY3Rpb24gY29udGVudHMsIGFzIGl0IGlzIHN0aWxsIGluIHVzZSBieSB0aGUgcGF0dGVybnMuCi0KLTE5OTktMDQtMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdCBsaW5rX2luZm8ubm9fdW5kZWZpbmVkLgotCSogbGV4c3VwLmM6IEFkZCBjb21tYW5kLWxpbmUgb3B0aW9uIC0tbm8tdW5kZWZpbmVkLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGQuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZQotCXN5c3RlbSBkb2VzIG5vdCBkZWZpbmUgaXQuCi0KLTE5OTktMDQtMDYgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogbGRtYWluLmggKGRlbWFuZ2xpbmcpOiBEZWNsYXJlLgotCSogbGRtYWluLmMgKGRlbWFuZ2xpbmcpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShtYWluKTogSW5pdGlhbGl6ZSBkZW1hbmdsaW5nLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IERvbid0IGRlbWFuZ2xlIHN5bWJvbCBpZiAhIGRlbWFuZ2xpbmcuCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucywgcGFyc2VfYXJncyk6IEhhbmRsZSAtLWRlbWFuZ2xlIGFuZAotCS0tbm8tZGVtYW5nbGUuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLWRlbWFuZ2xlLy0tbm8tZGVtYW5nbGUuCi0KLQkqIGxkbGV4LmwgKFZfSURFTlRJRklFUik6IEFsbG93ICcuJyBpbiBzeW1ib2wuCi0KLTE5OTktMDQtMDUgIENocmlzIFRvcmVrICA8dG9yZWtAQlNESS5DT00+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IENoZWNrIHRoYXQKLQlhIHNoYXJlZCBsaWJyYXJ5IHJlYWxseSBleGlzdHMsIGF2b2lkaW5nIGJyb2tlbiBzeW1saW5rcy4KLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBHZW5lcmF0ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIGlmCi0Jd2UgY2FuJ3QgZmluZCBhIC1sIGZpbGUuCi0KLTE5OTktMDQtMDUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpMzg2LSotcGUpOiBhZGQgdGFyZ19leHRyYV9vZmlsZXMgZm9yIG90aGVyIFBFCi0JdGFyZ2V0cyAoaTM4Ni1wZSBhbmQgaTM4Ni13aW5udCkKLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGRlZmZpbGVwLnk6IEluY2x1ZGUgInN5c2RlcC5oIiBhbmQgImxkbWlzYy5oIi4KLQkoZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLiAgUmVtb3ZlCi0JdW51c2VkIGxvY2FscyBzaF9yZXNlcnZlLCBzaF9jb21taXQsIGFuZCBqLgotCShkZWZfdW5nZXRjKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShkZWZfbGV4KTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIG9mIHx8IHdpdGhpbiAmJi4KLQkqIGRlZmZpbGUuaCAoZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIHBlLWRsbC5jOiBJbmNsdWRlIDx0aW1lLmg+LCA8Y3R5cGUuaD4sIGFuZCAibGRlbXVsLmgiLgotCShnZW5lcmF0ZV9lZGF0YSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgaS4KLQkocXVvdGVwdXQpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCShwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBGaXggdHlwZSBpbiBmb3JtYXQgc3RyaW5nLgotCShxdWlja19zeW1ib2wpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGJsaGUuCi0JKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCShwZV9wcm9jZXNzX2ltcG9ydF9kZWZzKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgYXJfaGVhZCwgYXJfdGFpbCwKLQlhbmQgbi4KLQkocGVfYXMxNik6IENvbW1lbnQgb3V0LgotCi0xOTk5LTA0LTA0ICBEb24gQm93bWFuIDxkb25AcGl4c2NpLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogQWRkIG1pcHMqLSotdnh3b3JrcyogdGFyZ2V0LgotCi0xOTk5LTAzLTMxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybV9lcG9jX3BlLm8KLQlBZGQgYnVpbGQgcnVsZSBhbmQgZGVwZW5kZW5jaWVzIGZvciBlYXJtX2Vwb2NfcGUuYy4KLQotCSogZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaDogTmV3IGZpbGUuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCAndGFyZ19leHRyYV9vZmlsZXMnIGZvciBBUk0gYmFzZWQgUEUKLQl0YXJnZXRzLiAKLQotMTk5OS0wMy0zMSAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IE1hdGNoIGBhcm0qLSotbGludXgtZ251Kicgbm90Ci0gCWBhcm12Ki0qLWxpbnV4LWdudScuCi0KLTE5OTktMDMtMjYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgdGhlIC5laF9mcmFtZSBhbmQgLmdjY19leGNlcHRfdGFibGUKLQlzZWN0aW9ucyBpbiB0aGUgZGF0YSBzZWdtZW50LgotCi1GcmkgTWFyIDI2IDEyOjA1OjUxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBsZC5oICh3aWxkY2FyZF9zcGVjKTogQWRkIGV4Y2x1ZGVfbmFtZS4KLSAgICAgICAgKiBsZGdyYW0ueSAoRVhDTFVERV9GSUxFKTogTmV3IHRva2VuLgotCSh3aWxkY2FyZF9zcGVjKTogU2V0IGV4Y2x1ZGVfbmFtZS4KLQkoZmlsZV9OQU1FX2xpc3QpOiBSZWNvZ25pemUgRVhDTFVERV9GSUxFLgotICAgICAgICAqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBDaGVjayBmb3IgZXhjbHVkZWQgZmlsZXMuCi0JKHByaW50X3dpbGRfc3RhdGVtZW50KTogUHJpbnQgZXhjbHVkZWQgZmlsZXMuCi0JKGxhbmdfYWRkX3dpbGQpOiBOZXcgYXJndW1lbnQgZXhjbHVkZV9maWxlbmFtZS4KLQlTZXQgZXhjbHVkZV9maWxlbmFtZS4KLQkqIGxkbGFuZy5oIChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUpOiAgQWRkIGV4Y2x1ZGVfZmlsZW5hbWUuCi0JKiBsZGxleC5sOiBOZXcgdG9rZW4gRVhDTFVERV9GSUxFLgotCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiAgQWRkIGFyZ3VtZW50IHRvIGxhbmdfYWRkX3dpbGQuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKENUT1IsIERUT1IpOiAgRXhjbHVkZSBjcnRlbmQubyBmcm9tIGN0b3Igd2lsZGNhcmQuCi0JUmVvcmRlciBzb3J0ZWQgYW5kIHVuc29ydGVkIGN0b3JzLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAoQ1RPUiwgRFRPUik6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAoQ1RPUiwgRFRPUik6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjIChDVE9SLCBEVE9SKTogTGlrZXdpc2UuCi0JCi0xOTk5LTAzLTI2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19nY19zZWN0aW9ucyk6IElmIGVudHJ5X3N5bWJvbCBpcyBub3QgZGVmaW5lZCwKLQlkZWZhdWx0IHRvICJzdGFydCIuCi0KLTE5OTktMDMtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGV4cGxpY2l0IHBsYWNlbWVudHMgZm9yIHRoZSAuZWhfZnJhbWUKLQlhbmQgLmdjY19leGNlcHRfdGFibGUgc2VjdGlvbnMuIAotCi1XZWQgTWFyICAzIDA5OjEzOjM0IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY2xtPgotIAotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZi5zYzogUmVtb3ZlIC5lbmQuY3RvcnMgYW5kIC5lbmQuZHRvcnMKLSAgICAgICAgc2VjdGlvbnMuICBSZW9yZGVyIC5jdG9ycyBzZWN0aW9uIGVudHJpZXMuCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTGlrZXdpc2UuCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotMTk5OS0wMi0yNiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogV3JvbmcgZXJyb3IgbXNnIGZvciAtciBhbmQgLS1tcGM4NjBjMC4KLQotMTk5OS0wMi0yNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMpOiBSZW1vdmUgZXh0cmFuZW91cwotCWJhY2tzbGFzaC4gCi0KLVRodSBGZWIgMjUgMTU6MDc6MjQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3QgZ2F0aGVyIC5jdG9yIGFuZCAuZHRvciBzZWN0aW9ucwotICAgICAgICBmb3IgcmVsb2NhdGVhYmxlIGxpbmtzLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0gICAgICAgIAotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGxkaW50LnRleGluZm86IHJlbW92ZSBleHRyYW5lb3VzIHJpZ2h0IGJyYWNlLgotCSogbGRtYWluLmMgKG1haW4pOiBpbml0aWFsaXplIGFuZCBjaGVjayBvcHRpb24gIm1wYzg2MGMwIi4KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zLCBwYXJzZV9hcmdzKTogYWRkIG9wdGlvbiAibXBjODYwYzAiLgotCi1XZWQgRmViIDE3IDEyOjEwOjA2IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBtcHctZWxmbWlwcy5jIChnbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlIHNwZWNpYWwKLQkucmVnaW5mbyBzZWN0aW9uIGhhbmRsaW5nLiAKLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCAoSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyk6IFJlbW92ZWQKLQkqIGVtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCAoSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyk6IFJlbW92ZWQKLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIGZyb206IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCQotCSogY29uZmlndXJlLnRndDogQWRkZWQgYXJtdiotKi1saW51eC1nbnUgdG8gJHRhcmdfZW11bAotCXJlY29nbml0aW9uLiAKLQotV2VkIEZlYiAxNyBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0gCi0gICAgICAgICogZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtCi0gICAgICAgIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucywKLSAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IERlZmluZSB0aGVtIHRvIHVzZSB0aGUKLSAgICAgICAgb2xkIEFCSSB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zLgotCi1UdWUgRmViIDE2IDE2OjQ4OjE5IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgQUNfUFJFUkVRIHRvIDIuMTMuICBDaGFuZ2UgQU1fUFJPR19JTlNUQUxMCi0JdG8gQUNfUFJPR19JTlNUQUxMLiAgQ2hhbmdlIEFNX0VYRUVYVCB0byBBQ19FWEVFWFQuCi0JKiBNYWtlZmlsZS5hbSAoZWFybWVsZl9vYWJpLmMpOiBDaGFuZ2VzIHNwYWNlcyB0byB0YWIuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTUgMTg6MjE6NDggMTk5OSAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmggKHN0cnVjdCBldHJlZV92YWx1ZV90eXBlKTogQ2hhbmdlIHZhbGlkIG9udG8gdmFsaWRfcC4KLQotCSogbGRleHAuYyAobmV3X2Ficyk6IERpdHRvLgotCShuZXdfcmVsLCBuZXdfcmVsX2Zyb21fc2VjdGlvbiwgZm9sZF9iaW5hcnksIGludmFsaWQsIGZvbGRfbmFtZSwKLSAJZXhwX2ZvbGRfdHJlZSwgZXhwX2Jpbm9wLCBleHBfdHJpbm9wLCBzdGF0X2FsbG9jLAotIAlleHBfZ2V0X2Fic19pbnQpOiBEaXR0bwotCi0JKiBsZGxhbmcuYyAocHJpbnRfYXNzaWdubWVudCwgbGFuZ19zaXplX3NlY3Rpb25zLAotCWxhbmdfZG9fYXNzaWdubWVudHMpOiBEaXR0by4KLQkKLTE5OTktMDItMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKTogTmV3IGZ1bmN0aW9uOiBDaGVjawotCWFkZHJlc3NlcyBhc3NpZ25lZCB0byBzZWN0aW9uIGZvciBvdmVybGFwcy4KLQkobGFuZ19wcm9jZXNzKTogQ2FsbCBsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzIGlmIHN1aXRhYmxlLgotCi0JKiBsZC5oOiBBZGQgbmV3IGJvb2xlYW4gZmllbGQgdG8gYXJnc190eXBlIHN0cnVjdHVyZToKLQknY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMnLgotCi0JKiBsZG1haW4uYzogSW5pdGlhbGlzZSBjaGVja19zZWN0aW9uX2FkZHJlc3NlcyBmaWVsZCB0byB0cnVlLgotCi0JKiBsZXhzdXAuYzogQWRkIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS1uby1jaGVjay1zZWN0aW9ucycgYW5kCi0JJy0tY2hlY2stc2VjdGlvbnMnLgotCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgJy0tY2hlY2stc2VjdGlvbnMnCi0JYW5kICctLW5vLWNoZWNrLXNlY3Rpb25zJy4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogQWRkIHN1cHBvcnQgZm9yIFN0cm9uZ0FSTSB0YXJnZXQuCi0KLVdlZCBGZWIgIDMgMTk6NDE6MDEgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBKdXN0IHNldCBTRUNfS0VFUCBvbmNlLiAgQ2hlY2sgZm9yCi0JYW4gb3duZXIgb2YgYSBzZWN0aW9uIGJlZm9yZSB1c2luZyBpdCB0byBsb29rIHVwIGEgcmVsb2MgdHlwZS4KLQlEb24ndCBzZXQgU0VDX0tFRVAgZm9yIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi1Nb24gRmViICAxIDExOjM5OjQ2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogTWFrZWZpbGUuYW0gKGVhcm1lbGZfb2FiaS5vKTogIE5ldy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLnRndCAoYXJtLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICh0aHVtYi0qLW9hYmkpOiAgTmV3LgotICAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2g6ICBOZXcuCi0gICAgICAgICogZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtOiAgTmV3LgotCi0xOTk5LTAxLTMxIDE3OjU3OjMxIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAtZmxlYWRpbmctdW5kZXJzY29yZXMKLQlzd2l0Y2ggaW4gYWxsIGxpbmtlciBnZW5lcmF0ZWQgc3ltYm9scy4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwY3ssbGV9Ki0qLXZ4d29ya3MpOiBBZGQgYXMgYWxpYXNlcyBmb3IKLQlwb3dlcnBjeyxsZX0tKi1lYWJpLgotCi1XZWQgSmFuIDIwIDE3OjAxOjQ4IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotc29sYXJpczIqKTogTmV3IHRhcmdldC4gIEZyb20gUGF2ZWwKLQlSb3NraW4gPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPi4KLQotMTk5OS0wMS0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENvdW50IGxvYWRhYmxlIHNlY3Rpb25zIGFzCi0gICAgICAgICAgY29udHJpYnV0aW5nIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQuCi0KLTE5OTktMDEtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBPbmx5IHVwZGF0ZSB0aGUgY3VycmVudAotICAgICAgICAgIGFkZHJlc3Mgb2YgYSByZWdpb24gaWYgdGhlIHNlY3Rpb24ganVzdCBwbGFjZWQgaW50byBpdCBpcyBhbgotICAgICAgICAgIGFsbG9jYXRlZCBzZWN0aW9uLgotCi0xOTk5LTAxLTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVwbGFjZSBlZnIzMC5vIHdpdGggZWVsZjMyZnIzMC5vLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IFJlcGxhY2UgZnIzMCB3aXRoIGVsZjMyZnIzMC4KLQotCSogZW11bHBhcmFtcy9lbGYzMmZyMzAuc2g6IE5ldyBmaWxlOiBSZXBsYWNlcyBmcjMwLnNoLCBhbmQgdXNlcwotCWdlbmVyaWMgZWxmLnNjIHNjcmlwdC4gIEFsc28gcmVwbGFjZXMgdGhlIC5zdGFjayBzZWN0aW9uIHdpdGggYQotCXVzZXIgZGVmaW5hYmxlIHN5bWJvbCBfX3N0YWNrLgotCi0xOTk5LTAxLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9mcjMwLnNjOiBGaWxsIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3aXRoIE5PUAotCXBhdHRlcm4uIAotCi0xOTk5LTAxLTAzICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrLURFSkFHTlUpOiBObyBsb25nZXIgcHJvdmlkZSBIT1NUSU5HX0VNVSwKLQlIT1NUSU5HX0NSVDAsIEhPU1RJTkdfTElCUzsgdGhlIHRlc3Qgc3VpdGUgY2FuIGV4dHJhY3QgdGhlbSBmcm9tCi0JY29uZmlndXJlLmhvc3QgYW5kIGNvbmZpZ3VyZS50Z3Qgbm93LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTgtMTItMjcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncywgY2FzZSBPUFRJT05fUlBBVEgpOiBBdm9pZCBhZGRpbmcgZHVwbGljYXRlCi0JZWxlbWVudHMgdG8gcnBhdGguCi0KLVRodSBEZWMgMTAgMTE6MTI6MjggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgcGUtZGxsLm8gYW5kIGRlZmZpbGVwLm8uCi0JKEFMTF9FTVVMX0VYVFJBX09GSUxFUyk6IE5ldyB2YXJpYWJsZS4gIFB1dCB0aGVtIGhlcmUgaW5zdGVhZC4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEVNVUxfRVhUUkFfT0ZJTEVTIHRvICQoQUxMX0VNVUxfRVhUUkFfT0ZJTEVTKQotCWlmIGNvbmZpZ3VyaW5nIHdpdGggYWxsIHRhcmdldHMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwKTogTWFrZSBzdGF0aWMuCi0JKHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzKTogUmVtb3ZlZCwgdW51c2VkLgotCShwZV9kZWZfZmlsZSwgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nLCBwZV9kbGxfa2lsbF9hdHMsCi0JcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyk6IERvbid0IGluaXRpYWxpemUgdGhlbSwgdGhpcyBmaWxlIG1heSBiZQotCWNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLgotCSogcGUtZGxsLmMgKHBlX2RlZl9maWxlLCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcsCi0JcGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXMsIHBlX2RsbF9raWxsX2F0cywKLQlwZV9kbGxfc3RkY2FsbF9hbGlhc2VzKTogRGVmaW5lIGFuZCBpbml0aWFsaXplIHRoZW0gaGVyZSBpbnN0ZWFkLgotCShnZW5lcmF0ZV9yZWxvYyk6IEZpeCBhbGxvY2F0aW9uIG9mIHJlbG9jX2FkZHJlc3NlcyBhcnJheSB0byB1c2UKLQliZmRfdm1hIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4gIEZpeCBlbGVtZW50IHNpemUgaW4gcXNvcnQgY2FsbC4KLQkocmVsb2Nfc29ydCk6IENvbXBhcmUgcG9pbnRlcnMgdG8gYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkCi0JbG9uZy4KLQotTW9uIERlYyAgNyAyMToxMDowOSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPGouai52YW5kZXJoZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotbWluZ3czMiopOiBBZGQgY3lnd2luIHRhcmdldCBzcGVjaWZpYwotCWZpbGVzLgotCi1TdW4gRGVjICA2IDE2OjMzOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobTY4Ki0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKLQk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KLQotMTk5OC0xMi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9mcjMwLnNoIChURVhUX1NUQVJUX0FERFIpOiBDaGFuZ2UgVEVYVF9TVEFSVF9BRERSCi0JZnJvbSAweDEwMDAwMCB0byAweDEwMDAwIHNvIHRoYXQgaXQgZml0cyBpbiAyMCBiaXRzLgotCi1TYXQgTm92IDI4IDIyOjMyOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmggKGxkZW11bF9yZWNvZ25pemVkX2ZpbGUpOiBEZWNsYXJlLgotCi1TYXQgTm92IDI4IDIyOjMwOjU1IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGRsYW5nLmMgKGxhbmdfYWRkX3dpbGQpOiBEb24ndCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW5wdXQKLQlmaWxlIGlmIHRoZSBmaWxlbmFtZSBpcyBhIHdpbGRjYXJkIHBhdHRlcm4uCi0KLTE5OTgtMTEtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuaCAobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogbmV3IGhvb2sgInJlY29nbml6ZWRfZmlsZSIKLQkqIGxkZW11bC5jIChsZGVtdWxfcmVjb2duaXplZF9maWxlKTogbmV3IGZ1bmN0aW9uLCBuZXcgaG9vawotCSogbGRpbnQudGV4aW5mbzogZG9jdW1lbnQgbmV3IGhvb2suCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogY2FsbCByZWNvZ25pemVkX2hvb2sgZm9yIGFsbCBvYmplY3RzIHdlCi0JZG8gcmVjb2duaXplLCBpbiBjYXNlIHRoZSBlbXVsYXRpb24gbmVlZHMgdG8gaGFuZGxlIHRoZW0KLQlzcGVjaWFsbHkuICBQRSBETExzIHVzZSB0aGlzLgotCSogcGUtZGxsLmMgKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IHRha2Ugb3V0IGhhY2sgYW5kIGRlYnVnCi0JcHJpbnRmcwotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4Nl9yZWNvZ25pemVkX2ZpbGUpOiBuZXcgZnVuY3Rpb24KLQkoZ2xkX2k0ODZfdW5yZWNvZ25pemVkX2ZpbGUpOiB0YWtlIG91dCBoYWNrCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAoZmlsbF9lZGF0YSk6IGZpbGwgaW4gdGltZXN0YW1wCi0JKG1ha2VfaGVhZCk6IG5hbWUgb2JqZWN0IGZpbGVzIHNlcXVlbnRpYWxseSB0byBlbnN1cmUKLQl0aGV5IGxpbmsgaW4gdGhlIHJpZ2h0IG9yZGVyLgotCShtYWtlX3RhaWwpOiBzYW1lIGhlcmUKLQkocGVfcHJvY2Vzc19pbXBvcnRfZGVmcyk6IHVzZSBzZXF1ZW50aWFsIG5hbWVzIGZvciBiZmRzIHRvIGVuc3VyZQotCXByb3BlciBsaW5rIG9yZGVyLgotCShwZV9pbXBsaWVkX2ltcG9ydF9kbGwpOiBuZXcgZnVuY3Rpb247IGhhbmRsZXMgbGlua2luZyBkaXJlY3RseQotCWFnYWluc3QgRExMcyBieSBzaW11bGF0aW5nIElNUE9SVFMgZGlyZWN0aXZlcy4gICogZW11bHRlbXBsL3BlLmVtCi0JKGdsZF9pMzg2cGVfYmVmb3JlX3BhcnNlKTogaGFjayBiZmQgdG8gbm90IHJlY29nbml6ZSAuZGxsIGZpbGVzCi0JdmlhIGJmZF9wZV9kbGxfbm90X3JlY29nbml6ZWRfaGFjawotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4NnBlX3BhcnNlX2FyZ3MpOiBDb25kaXRpb25hbGl6ZSBjYWxsIHRvCi0JcGVfZGxsX2FkZF9leGNsdWRlcwotCi1Nb24gTm92IDIzIDE0OjM2OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoYWZ0ZXJfcGFyc2UpOiBPbmx5IGNyZWF0ZSBhbiB1bmRlZmluZWQgZW50cnkKLQlzeW1ib2wgaWYgb25lIGhhcyBiZWVuIHNwZWNpZmllZC4KLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZwZV9hZnRlcl9vcGVuKTogY2FsbAotCXBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMKLQkqIHBlLWRsbC5jIChwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBjYWxjdWxhdGUgQkFTRSBmcm9tCi0JcGVfZGF0YSwgb25seSBwcmludCBpZiBhY3R1YWxseSBzZXQuICBQcmludCB2ZXJzaW9uIG9ubHkgaWYKLQlzZXQuCi0JKHNhdmVfcmVsb2NzKTogc2F2ZSByZWxvY3MgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KLQkobWFrZV9vbmUpOiBzdXBwb3J0IGludGVybmFsL2V4dGVybmFsIGRpZmZlcmVudCBuYW1lcy4KLQkocGVfZGxsX2dlbmVyYXRlX2ltcGxpYik6IHN1cHBvcnQgbmV3IG1ha2Vfb25lCi0JKHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMpOiBuZXcgZnVuY3Rpb247IGhhbmRsZXMgSU1QT1JUCi0JZGlyZWN0aXZlcyBpbiAuZGVmIGZpbGVzLgotCi1GcmkgTm92IDIwIDEzOjA2OjQ5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBDb3BlIHdpdGggZW1wdHkgc3ltYm9sIG5hbWVzLgotCi1UaHUgTm92IDE5IDEzOjMxOjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBBZGQgcHJvdmlzaW9uIG9mICdfZW5kJyBzeW1ib2wuCi0KLVdlZCBOb3YgMTggMTg6MTg6NDMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogY2hhbmdlIHJlZnMgZnJvbSBjeWd3aW4zMiogdG8gY3lnd2luKi4KLQkqIGFjbG9jYWwubTQ6IHJlZ2VuZXJhdGUKLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgbmVlZCB0byBjYWxsIEFNX0NZR1dJTjMyLgotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLU1vbiBOb3YgMTYgMjI6MTQ6MDcgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfZmluaXNoKTogZ2VuZXJhdGUgaW1wb3J0IGxpYnJhcnkKLQkqIGRlZmZpbGUuaDogYWRkIGhpbnQgbWVtYmVyLgotCSogcGUtZGxsLmMgKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBOZXcgZnVuY3Rpb24gd2l0aCBoZWxwZXJzOwotIAlnZW5lcmF0ZXMgdGhlIGltcG9ydCBsaWJyYXJ5IGRpcmVjdGx5IGZyb20gdGhlIGV4cG9ydCB0YWJsZS4KLQkoZmlsbF9lZGF0YSk6IHJlbWVtYmVyIHRoZSBhY3R1YWwgaGludCBmb3IgdGhlIGltcG9ydCBsaWJyYXJ5LgotCi1TYXQgTm92IDE0IDE0OjM2OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuMTogU29tZSBjbGVhbnVwcyBmcm9tIE5PS1VCSSBIaXJvdGFrYSA8aG5va3ViaUB5eXkub3IuanA+LgotCi1UaHUgTm92IDEyIDE5OjIxOjU3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vbGQucG90OiBSZWdlbmVyYXRlZC4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlZC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotV2VkIE5vdiAxMSAxODoxMDoxNSAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmMgKGdlbmVyYXRlX3JlbG9jKTogZG9uJ3Qgb3V0cHV0IFBFIHJlbG9jcyBmb3Igc2VjdGlvbnMKLSAJdGhhdCB3b24ndCBiZSBsb2FkZWQuCi0KLVdlZCBOb3YgMTEgMTM6NDQ6NTQgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jIChmaWxsX2VkYXRhKTogZG9uJ3Qgc3RyaXAgdW5kZXJzY29yZXMKLQotVHVlIE5vdiAxMCAyMToyODoxOSAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbzogYWRkZWQgaTM4NnBlIG9wdGlvbiBzdW1tYXJ5Ci0KLVR1ZSBOb3YgMTAgMTc6NTM6MTcgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jIChwcm9jZXNzX2RlZl9maWxlKTogcHJvcGVybHkgbm90ZSB1bmRlZmluZWQgZXhwb3J0ZWQKLSAJc3ltYm9scywgY2xlYW4gdXAgb2xkIGNvZGUuCi0JKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IGRvbid0IGNyYXNoIGlmIHBlX2RlZl9maWxlIGlzIE5VTEwKLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfcGFyc2VfYXJncyk6IGFkZAotIAkoZW4vZGlzKWFibGUtc3RkY2FsbC1maXh1cHMKLQkocGVfZml4dXBfc3RkY2FsbHMpOiB3YXJuIGFib3V0IHN0ZGNhbGwgZml4dXBzCi0JKGdsZF9pMzg2X3VucmVjb2duaXplZF9maWxlKTogbWFrZSBleHBvcnRlZCBzeW1ib2xzIHVuZGVmcyBzbyB0aGF0Ci0gCWFyY2hpdmUgbWVtYmVycyBnZXQgcHVsbGVkIGluCi0KLVR1ZSBOb3YgMTAgMTQ6NTA6NTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBBZGQgS0VFUCBhdHRyaWJ1dGUgdG8gLmluaXQsCi0gICAgICAgIC5maW5pLCAuZHRvcnMgYW5kIC5jdG9ycy4gIEFkZCAuZGF0YSBhbmQgLnRleHQKLSAgICAgICAgd2lsZGNhcmRzIHRvIHN1cHBvcnQgc2VjdGlvbiBnYXJiYWdlIGNvbGxlY3Rpb24uCi0KLU1vbiBOb3YgIDkgMjI6NTI6NTAgMTk5OCAgREogRGVsb3JpZSAgPGRqQGluZHkuZGVsb3JpZS5jb20+Ci0KLQkqIGRlZmZpbGVwLnk6IHByb3Blcmx5IGhhbmRsZSByZWxvY3Mgd2l0aCBtdWx0aXBsZSBkZWZfZmlsZXMsCi0JY2FjaGUgaW1wb3J0IG1vZHVsZSBuYW1lcwotCi1Nb24gTm92ICA5IDIyOjQ0OjU4IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAocHJvY2Vzc19kZWZfZmlsZSk6IGRvbid0IGFzc3VtZSBleHBvcnRzIHdvbid0IG1vdmUKLQlkdXJpbmcgYSByZWFsbG9jCi0KLU1vbiBOb3YgIDkgMTY6NDE6MzAgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jOiBOZXcgZmlsZTsgZGlyZWN0IHN1cHBvcnQgZm9yIFBFIERMTHMKLQkqIGRlZmZpbGUuaDogTmV3IGZpbGU7IGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCi0JKiBkZWZmaWxlcC55OiBOZXcgZmlsZTsgZGlyZWN0IHN1cHBvcnQgZm9yIFBFIERMTHMKLQkqIGVtdWx0ZW1wbC9wZS5lbTogYWRkIGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCi0JKiBjb25maWd1cmUudGd0OiBhbGxvdyB0YXJnZXQtc3BlY2lmaWMgZXh0cmEgZmlsZXMKLQkqIGNvbmZpZ3VyZS5pbjogYWxsb3cgdGFyZ2V0LXNwZWNpZmljIGV4dHJhIGZpbGVzCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfYXNzaWdubWVudCk6IHJldHVybiB0aGUgYXNzaWdubWVudCBzbyB0aGF0Ci0gCW9uZSBjYW4gY2hhbmdlIHRoZSB2YWx1ZSBsYXRlciBiYXNlZCBvbiB0aGUgb2JqZWN0IGZpbGVzIChwZS1kbGwKLSAJREVGIGZpbGVzIGRvIHRoaXMpCi0JKiBsZGludC50ZXhpbmZvOiBhZGQgc2VjdGlvbiBmb3IgZW11bGF0aW9uIHdhbGt0aHJvdWdoCi0JKiBNYWtlZmlsZS5hbTogYWRkIG5ldyBmaWxlcyBhbmQgdGFyZ2V0LXNwZWNpZmljIGV4dHJhIGZpbGVzCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2X2xpc3Rfb3B0aW9ucyk6IGxpc3QgZGxsLXNwZWNpZmljCi0Jb3B0aW9ucy4KLQkqIHBlLWRsbC5jIChwcm9jZXNzX2RlZl9maWxlKTogYXV0by1leHBvcnQgZXZlcnl0aGluZyBpZgotCW5vdGhpbmcgaXMgb3RoZXJ3aXNlIGV4cG9ydGVkLgotCQotV2VkIE5vdiAgNCAxNjozOToxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIEZSMzAgdGFyZ2V0LgotCSogY29uZmlndXJlLnRndDogQWRkIHN1cHBvcnQgZm9yIEZSMzAgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBlbXVscGFyYW1zL2ZyMzAuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcC9mcjMwLnNjOiBOZXcgZmlsZS4KLQkKLU1vbiBOb3YgIDIgMTQ6NDc6MTUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBsZG1haW4uYyAobWFpbik6ICBEb24ndCByZXBvcnQgZXJyb3IgZm9yIGR5bmFtaWMgbGlua3MgYW5kCi0gICAgICAgIC0tZ2Mtc2VjdGlvbnMuCi0KLTE5OTgtMTAtMjYgMTY6MDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IENoYW5nZSB0ZXh0IG9mIC1PIHRvIE9wdGltaXplIG91dHB1dCBmaWxlIi4KLQkocGFyc2VfYXJncyk6IFNldCBsaW5rX2luZm8ub3B0aW1pemUgYmFzZWQgb24gLU8gYXJndW1lbnQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLm9wdGltemUgdG8gZmFsc2UuCi0JKiBsZC50ZXhpbmZvOiBEZXNjcmliZSAtTyBvcHRpb24uCi0JKiBsZC4xOiBMaWtld2lzZS4KLQotTW9uIE9jdCAxMiAxNDoyOTo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBNb3ZlIC5zYnNzIGFuZCAuc2NvbW1vbiBzZWN0aW9ucyBpbnRvIHRoZWlyCi0Jb3duIHNlZ21lbnQsIHNvIHRoYXQgdGhleSBjYW4gYmUgbmV4dCB0byB0aGUgLmJzcyBzZWN0aW9uIGFuZCBzbwotCWluaXRpYWxpc2VkIGJ5IHRoZSBzYW1lIHBpZWNlIG9mIGNvZGUuCi0KLUZyaSBPY3QgIDkgMTU6NTk6NTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGYuc2M6ICBNZXJnZSAuc2RhdGEuKiBldGMgc2VjdGlvbnMuCi0gICAgICAgICogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogIFNldCBTRUNfS0VFUCBmb3IKLSAgICAgICAgY3RvciBzZWN0aW9ucy4KLQotTW9uIE9jdCAgNSAwOTo0MDo0MyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGxkbWFpbi5jIChtYWluKTogIEVycm9yIGlmIC0tZ2Mtc2VjdGlvbnMgYW5kCi0gICAgICAgIGR5YW5taWMgbGlua2luZy4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiAgQWRkIEtFRVAgYXR0cmlidXRlIHRvIC5pbml0LAotICAgICAgICAuZmluaSwgLmR0b3JzIGFuZCAuY3RvcnMuICBBZGQgLmRhdGEgYW5kIC50ZXh0Ci0gICAgICAgIHdpbGRjYXJkcyB0byBzdXBwb3J0IHNlY3Rpb24gZ2FyYmFnZSBjb2xsZWN0aW9uLgotCi1XZWQgU2VwIDMwIDExOjE5OjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IFJlbmFtZSAuY2FsbF90YWJsZSBzZWN0aW9uIHRvCi0JLmNhbGxfdGFibGVfZGF0YSBhbmQgY3JlYXRlIGEgbmV3IHNlY3Rpb24gY2FsbGVkCi0JLmNhbGxfdGFibGVfdGV4dC4KLQotU3VuIFNlcCAyMCAwMDo0MzoyNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGFsaWdubWVudCBhdCB0aGUgZW5kIG9mIHRoZSAuYnNzCi0Jc2VjdGlvbiwgc28gdGhhdCBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgbWVtc2l6ZSBvZiB0aGUgc2VnbWVudC4KLQotRnJpIFNlcCAxOCAxMzo0Mjo0MiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkX3BsYWNlX29ycGhhbik6IERvbid0IHByb2Nlc3MgZm9yCi0gICAgICAgIHNlY3Rpb25zIHdpdGggU0VDX0VYQ0xVREUgZmxhZy4KLQotRnJpIFNlcCAgNCAwOToyNDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QzMHZlbGYuc2ggKFRFWFRfU0laRSk6IEluY3JlYXNlZCB0byAyMDAwSy4KLQkoREFUQV9TSVpFKTogSW5jcmVhc2VkIHRvIDIwMDBLLgotCi1UaHUgU2VwICAzIDE3OjMwOjU4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoVEVNUExBVEVfTkFNRSk6IFVzZSBlbGYzMi4KLQotTW9uIEF1ZyAzMSAwMTowNjowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtOiAgQ2hhbmdlIGFybWVsZi5zYyB0byBlbGYuc2MKLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0KLU1vbiBBdWcgMzEgMTE6MTI6MDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogIENoYW5nZSBTQ1JJUFRfTkFNRSB0bwotICAgICAgICBlbGYuICBDaGFuZ2UgVEVYVF9TVEFSVF9BRERSIHRvIDB4ODAwMC4gIERlZmluZQotICAgICAgICBPVEhFUl9URVhUX1NFQ1RJT05TLCBPVEhFUl9CU1NfU1lNQk9MUyBhbmQKLSAgICAgICAgT1RIRVJfQlNTX0VORF9TWU1CT0xTLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZi5zYzogIE1vZGlmeSB0byB1c2UKLSAgICAgICAgT1RIRVJfQlNTX0VORF9TWU1CT0xTLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIFJlbW92ZSBmaWxlLgotCi1UdWUgQXVnIDE4IDEyOjA1OjM0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHRlbXBsL2FybWVsZi5lbSAoZ2xkX2FybWVsZl9iZWZvcmVfYWxsb2NhdGlvbik6Ci0gICAgICAgIEFkZCBiZmRfIHByZWZpeCB0byBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICAgICAgICBhbmQgZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucy4KLSAgICAgICAgKGdsZF9hcm1lbGZfYWZ0ZXJfb3Blbik6IEFkZCBiZmRfIHByZWZpeCB0bwotICAgICAgICBlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLgotCi1GcmkgQXVnIDE0IDE1OjM0OjI5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGxkZ3JhbS55OiBJbmNsdWRlICJsZGN0b3IuaCIuCi0JKHN0YXRlbWVudCk6IEFjY2VwdCBTT1JUIGFyb3VuZCBDT05TVFJVQ1RPUlMuCi0JKiBsZGN0b3IuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGNvbnN0cnVjdG9yc19zb3J0ZWQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShjdG9yX3ByaW8sIGN0b3JfY21wKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGxkY3Rvcl9idWlsZF9zZXRzKTogU29ydCBjb25zdHJ1Y3RvcnMgaWYgcmVxdWVzdGVkLgotCSogbGRjdG9yLmggKGNvbnN0cnVjdG9yc19zb3J0ZWQpOiBEZWNsYXJlLgotCSogbGRsYW5nLmMgKHByaW50X3N0YXRlbWVudCk6IFByaW50IHNvcnRlZCBDT05TVFJVQ1RPUlMKLQljb3JyZWN0bHkuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBzb3J0IGFyb3VuZCBDT05TVFJVQ1RPUlMuCi0JKiBsZC50ZXhpbmZvIChPdXRwdXQgU2VjdGlvbiBLZXl3b3Jkcyk6IERvY3VtZW50IFNPUlQKLSAJKENPTlNUUlVDVE9SUykuCi0KLVRodSBBdWcgMTMgMTI6MjA6MzkgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmLnNoOiAgRGVmaW5lIFRFTVBMQVRFX05BTUUgdG8gYXJtZWxmLgotICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgSW5jbHVkZSAuZ2x1ZV83dCBhbmQgLmdsdWU3Ci0gICAgICAgc2VjdGlvbnMuCi0gICAgICAgKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBOZXcgZmlsZS4KLQotVGh1IEF1ZyAxMyAxMjo1Mjo0NSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZC5kdmkpOiBVc2UgIiBpbnN0ZWFkIG9mICcgZm9yIE1BS0VJTkZPLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBdWcgMTEgMTY6MTc6MDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBDaGFuZ2UgdGV4dCBzdGFydCBhZGRyZXNzCi0gICAgICAgIGJhY2sgdG8gemVyby4KLQotVHVlIEF1ZyAxMSAxMDowMToxMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9tbjEwMjAwLnNoIChNQVhfUEFHRVNJWkUpOiBEZWZpbmUgdG8gMS4KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoIChNQVhfUEFHRVNJWkUpOiBEZWZpbmUgdG8gMS4KLQotU3VuIEF1ZyAgOSAyMDozMToyNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIFNldCB0ZXh0IHN0YXJ0IGFkZHJlc3MgdG8KLSAgICAgICAgMHg4MDAwLiAgQWRkIF9fYnNzX2VuZCBkZWZpbml0aW9uLgotCi1TYXQgQXVnICAxIDExOjQ3OjM3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgTmV3IGZpbGUuCi0gICAgICAgICogZW11bHBhcmFtcy9hcm1lbGYuc2g6IFNldCBTQ1JJUFRfTkFNRSB0byBlbGZhcm0uCi0KLUZyaSBKdWwgMzEgMTU6NTY6MTYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogTmV3IGZpbGUuCi0gICAgICAgICogY29uZmlndXJlLnRndDogIFJlY29nbml6ZSB0aHVtYi1lbGYgYW5kIGFybS1lbGYuCi0gICAgICAgICogTWFrZWZpbGUuYW0gKGVhcm1lbGYubyk6IE5ldy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEp1bCAyNCAxMjowMDo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCByZW1vdmUgdGhlIGZpbGUgYmVmb3JlCi0JY2hlY2tpbmcgd2hldGhlciAkKGJpbmRpcikgPT0gJCh0b29sZGlyKS9iaW4uICBGcm9tIE1hY2llagotCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IFJlY29nbml6ZSBoOFszNV0wMCotY29mZiogYXMgd2VsbCBhcyAtaG1zKi4KLQotVGh1IEp1bCAyMyAxMToxNToxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IElmIEFMSUdOTUVOVCBpcyBkZWZpbmVkLCB1c2UgaXQgdG8gc2V0Ci0JYWxpZ25tZW50IG9mIGVuZCBzeW1ib2wuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9zdW40LnNoIChBTElHTk1FTlQpOiBEZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIChBTElHTk1FTlQpOiBEZWZpbmUuCi0JKiBsZGludC50ZXhpbmZvIChlbXVsYXRpb24gcGFyYW1ldGVycyk6IERvY3VtZW50IEFMSUdOTUVOVC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgbWlzc2luZyBicmVhayBzdGF0ZW1lbnQuCi0KLQkqIGxkbGFuZy5jIChsYW5nX2djX3NlY3Rpb25zXzEpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaCB0bwotCWF2b2lkIHdhcm5pbmdzLgotCi1UdWUgSnVsIDE0IDE1OjQyOjE3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGk/ODYtKi1iZW9ze3BlLGVsZix9Kik6IFJlY29nbml6ZS4KLQkqIE1ha2VmaWxlLmFtIChlaTM4NmJlb3Mubyk6IE5ldy4KLQkqIGVtdWxwYXJhbXMvaTM4NmJlb3Muc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL2Jlb3MuZW0sIHNjcmlwdHRlbXBsL2kzODZiZW9zLnNjOiBOZXcgZmlsZS4KLQotVHVlIEp1bCAxNCAxNTozNTo0MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYzogTmV3IG9wdGlvbiAtLXZlcnNpb24tZXhwb3J0cy1zZWN0aW9uLgotCSogbGQuaCAoc3RydWN0IGFyZ3NfdHlwZSk6IEFkZCB2ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbi4KLQkqIGxkbGFuZy5jIChsYW5nX2RvX3ZlcnNpb25fZXhwb3J0c19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3Byb2Nlc3MpOiBDYWxsIGl0LgotCi1Nb24gSnVsIDEzIDEzOjIwOjIzIDE5OTggIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHRyYW5zbWV0YS5jb20+Ci0KLQkqIGxkbGV4Lmw6IEFjY2VwdCBBU1NFUlQuCi0JKiBsZGdyYW0ueSAoZXhwKTogQWRkIEFTU0VSVF9LIGNhc2UuCi0JKiBsZGV4cC5oIChub2RlX3R5cGUpOiBBZGQgZXRyZWVfYXNzZXJ0IHRvIG5vZGVfY2xhc3MgZW51bS4KLQkoZXRyZWVfdHlwZSk6IEFkZCBhc3NlcnRfcyBmaWVsZC4KLQkoZXhwX2Fzc2VydCk6IERlY2xhcmUuCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogSGFuZGxlIGV0cmVlX2Fzc2VydC4KLQkoZXhwX2Fzc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkoZXhwX3ByaW50X3RyZWUpOiBIYW5kbGUgZXRyZWVfYXNzZXJ0LgotCSogbGQudGV4aW5mbyAoTWlzY2VsbGFuZW91cyBDb21tYW5kcyk6IERvY3VtZW50IEFTU0VSVC4KLQotV2VkIEp1bCAgOCAxNDowMzoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55OiBDaGFuZ2UgTUFYIHRvIE1BWF9LIGFuZCBNSU4gdG8gTUlOX0ssIHRvIGF2b2lkCi0JY29uZmxpY3RzIHdpdGggc3lzdGVtIGhlYWRlciBmaWxlcy4gIENoYW5nZSBhbGwgdXNlcy4KLQotCSogTWFrZWZpbGUuYW0gKE1BSU5UQUlORVJDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdWwgIDcgMTg6MDM6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGR2ZXIudGV4aSk6IE5ldyB0YXJnZXQuCi0JKGxkLmluZm8sIGxkLmR2aSk6IERlcGVuZCB1cG9uIGxkdmVyLnRleGkuCi0JKiBsZC50ZXhpbmZvOiBJbmNsdWRlIGxkdmVyLnRleGkuICBNZW50aW9uIHZlcnNpb24gbnVtYmVyIG9uIHRpdGxlCi0JcGFnZSBhbmQgaW4gdG9wIG5vZGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEp1bCAgNiAxNDo1NToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLXNvbGFyaXMqKTogTmV3IHRhcmdldC4KLQotRnJpIEp1bCAgMyAxNDoxOTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBEb24ndCBnZXQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaWYgdGhlCi0Jc2VjdGlvbiBpcyBkaXNjYXJkZWQuCi0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBVc2UgU09SVCB0byBzb3J0IHNlY3Rpb25zIGFwcHJvcHJpYXRlbHkuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfYnlfZmlsZV9uYW1lKTogUmVtb3ZlLgotCShzb3J0X2J5X3NlY3Rpb25fbmFtZSk6IFJlbW92ZS4KLQkoc29ydF9zZWN0aW9uc18xLCBzb3J0X3NlY3Rpb25zKTogUmVtb3ZlLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBEb24ndCBjYWxsCi0Jc29ydF9zZWN0aW9ucy4KLQkoaG9sZF9zZWN0aW9uLCBob2xkX3NlY3Rpb25fbmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShob2xkX3VzZSwgaG9sZF90ZXh0LCBob2xkX3JkYXRhLCBob2xkX2RhdGEsIGhvbGRfYnNzKTogTGlrZXdpc2UuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZXdyaXRlLiAgTG9vayBmb3IgYSBnb29kCi0JcGxhY2UgdG8gcHV0IHRoZSBzZWN0aW9uLiAgQWxpZ24gdGhlIHNlY3Rpb24uICBTb3J0IHRoZSBpbnB1dAotCXNlY3Rpb25zIGJ5IG5hbWUuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogbGRsYW5nLmMgKHdpbGRfc29ydCk6IFdoZW4gc29ydGluZyBieSBmaWxlIG5hbWUsIHNvcnQgYnkgYXJjaGl2ZQotCW5hbWUgZmlyc3QuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3N1YnN5c3RlbSk6IERvbid0IGNhbGwKLQlsZGxhbmdfYWRkX3VuZGVmLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBVc2UgbmV3IGFmdGVyX3BhcnNlIGZ1bmN0aW9uCi0JcmF0aGVyIHRoYW4gYWZ0ZXJfcGFyc2VfZGVmYXVsdC4KLQotCSogbGRncmFtLnkgKGV4dGVybl9uYW1lX2xpc3QpOiBEbyBub3QgcmVxdWlyZSBzeW1ib2xzIHRvIGJlCi0Jc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLQkoaWZpbGVfcDEpOiBBZGQgRVhURVJOLgotCSogbGRsZXgubDogQWNjZXB0IEVYVEVSTiBpbiBCT1RIIGFuZCBTQ1JJUFQgbW9kZSBhcyB3ZWxsIGFzIE1SSQotCW1vZGUuCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogTWVudGlvbiB0aGF0IEVYVEVSTiBpcyBlcXVpdmFsZW50IHRvIC11LgotCShNaXNjZWxsYW5lb3VzIENvbW1hbmRzKTogRG9jdW1lbnQgRVhURVJOLgotCi1XZWQgSnVsICAxIDE5OjQwOjM0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGdjX3NlY3Rpb25zLgotCSogbGRncmFtLnkgKGxkZ3JhbV9oYWRfa2VlcCwgS0VFUCk6IE5ldy4KLQkoaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXApOiBSZW5hbWUgZnJvbSBvbGQgaW5wdXRfc2VjdGlvbl9zcGVjLgotCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBOZXcuICBSZWNvZ25pemUgS0VFUC4KLQkqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBIYW5kbGUga2VlcCBzZWN0aW9ucy4KLQkobGFuZ19nY193aWxkX3NlY3Rpb24sIGxhbmdfZ2Nfd2lsZF9maWxlLCBsYW5nX2djX3dpbGQpOiBOZXcuCi0JKGxhbmdfZ2Nfc2VjdGlvbnNfMSwgbGFuZ19nY19zZWN0aW9ucyk6IE5ldy4KLQkobGFuZ19wcm9jZXNzKTogSW52b2tlIGxhbmdfZ2Nfc2VjdGlvbnMuCi0JKGxhbmdfYWRkX3dpbGQpOiBBZGQga2VlcCBhcmd1bWVudC4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KLQkqIGxkbGFuZy5oIChsYW5nX3dpbGRfc3RhdGVtZW50X3N0cnVjdCk6IEFkZCBrZWVwX3NlY3Rpb25zLgotCSogbGRsZXgubCAoS0VFUCk6IE1hdGNoIGl0LgotCSogbGRtYWluLmMgKG1haW4pOiBFcnJvciBvbiAtciBhbmQgLS1nYy1zZWN0aW9ucy4KLQkqIGxleHN1cC5jOiBBZGQgLS1nYy1zZWN0aW9ucy4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNZXJnZSAudGV4dC4qIGV0YyBzZWN0aW9ucyBhcHByb3ByaWF0ZWx5LgotCU1hcmsgc3RhcnR1cCBzZWN0aW9ucyB3aXRoIEtFRVAuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotCi0JKiBsZC50ZXhpbmZvOiBVcGRhdGUgZm9yIC0tZ2Mtc2VjdGlvbnMgYW5kIEtFRVAuCi0KLVdlZCBKdWwgIDEgMTU6MjE6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBQZXRlciBKb3JkYW4gPHBqb3JkYW5AY2hsYS51c2MuZWR1PjoKLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBDb3JyZWN0IGNvbnN0cnVjdG9yIGhhbmRsaW5nIGZvciAtdS4KLQotVHVlIEp1biAyMyAxNToxNzoyNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwpOiBNYWtlIGxkc2NyaXB0cyBzdWJkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1biAyMyAxNToxNzowNCAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQotCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU3VuIEp1biAyMSAyMzo1NToxNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86IE5vdGUgdGhhdCAtcmVsYXggbWF5IG1ha2Ugc3ltYm9saWMgZGVidWdnaW5nCi0JaW1wb3NzaWJsZSBvbiBzb21lIHBsYXRmb3Jtcy4KLQotVHVlIEp1biAxNiAxMjo1MToxMyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBNYWtlZmlsZS5hbSAoTWFrZWZpbGUpOiBSZW1vdmUgdGFyZ2V0LgotCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaG9zdCAocG93ZXJwYyotKi1saW51eC1nbnUqKTogTmV3IGhvc3QuCi0KLUZyaSBKdW4gMTIgMTc6Mzg6MDcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoSU5QVVRfRklMRVMpOiBPcHRpb25hbCBJTlBVVCBzcGVjLgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBDaGFuZ2UgdG9wIG9mCi0Jc3RhY2sgdG8gOE1CLgotCi1GcmkgSnVuIDEyIDE5OjMzOjE3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEhGSUxFUyk6IFJlbW92ZSBjb25maWcuaC4KLQkoRU1VTEFUSU9OX09GSUxFUywgUE9URklMRVMpOiBNb3ZlIHBhdGNoIG9mIE1heSAxNCBmcm9tCi0JTWFrZWZpbGUuaW4gdG8gTWFrZWZpbGUuYW0uCi0JKGVhcm1jb2ZmLmMpOiBEZXBlbmQgdXBvbiBhcm1jb2ZmLmVtLCBub3QgZ2VuZXJpYy5lbS4KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBDb3JyZWN0IG1pc3NwZWxsaW5nIGluICQoUEFDS0FHRSkuCi0JKCQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCk6IFBhc3MgLUMgdG8gJChYR0VUVEVYVCkuCi0JKiBNYWtlZmlsZS5pbiwgcG8vUE9URklMRVMuaW4sIHBvL2xkLnBvdDogUmVidWlsZC4KLQotRnJpIEp1biAxMiAxMzo0MzoxNyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotVHVlIEp1biAgOSAwOTozNjo0OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBBZGQgQ09OU1QgdHlwZSBtb2RpZmllciB0byBkZWNsYXJhdGlvbgotCW9mICdzZW5kJy4KLQotRnJpIEp1biAgNSAxODoxOTo1OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFNldAotCWNvbmZpZy5oYXNfc2hhcmVkIHRvIHRydWUuCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6Ci0JTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6Ci0JTGlrZXdpc2UuCi0KLVR1ZSBKdW4gIDIgMTI6NTU6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBJZiB0aGUgZW50cnkgc3ltYm9sIGlzIG5vdCBmb3VuZCwgdHJ5Ci0JcGFyc2luZyBpdCBhcyBhIG51bWJlci4KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBEb2N1bWVudCB0aGlzLgotCi1Nb24gSnVuICAxIDE0OjAxOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHMpOiBEb2N1bWVudCBTT1JUIGtleXdvcmQuCi0KLU1vbiBNYXkgMTggMTI6NDI6NTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBOZXcgbWVtYmVyIGhhc19zaGFyZWQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgaXQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFNldCBpdC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVHJlYXQgLXNoYXJlZCBhcyBlcnJvciBpZiBub3Qgc3VwcG9ydGVkLgotCi1Nb24gTWF5IDE4IDEzOjE0OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gSmFzb24gTWVycmlsbCA8amFzb25AY3lnbnVzLmNvbT46Ci0JKiBsZGxhbmcuYyAod2lsZF9zb3J0KTogQ29ycmVjdCBvcmRlciBvZiBzb3J0LgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgKmNydGJlZ2luLm8gYmVmb3JlIG90aGVyIC5jdG9ycyBhbmQKLQkuZHRvcnMuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotRnJpIE1heSAxNSAwMDoyMjozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBrZXl3b3JkIFNPUlQuCi0JKiBsZGdyYW0ueSAoY3VycmVudF9maWxlKTogQ2hhbmdlIHRvIHN0cnVjdCB3aWxkY2FyZF9zcGVjLgotCSgldW5pb24pOiBBZGQgbmV3IGZpZWxkcyBjbmFtZSBhbmQgd2lsZGNhcmQuCi0JKHdpbGRjYXJkX25hbWUsIHdpbGRjYXJkX3NwZWMpOiBOZXcgbm9udGVybWluYWxzLgotCShmaWxlX05BTUVfbGlzdCk6IFVzZSB3aWxkY2FyZF9zcGVjLgotCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBDaGFuZ2UgY3VycmVudF9maWxlIHVzYWdlLgotCSogbGQuaCAoc3RydWN0IHdpbGRjYXJkX3NwZWMpOiBEZWZpbmUuCi0JKiBsZGxhbmcuaCAobGFuZ193aWxkX3N0YXRlbWVudF9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkcwotCXNlY3Rpb25zX3NvcnRlZCBhbmQgZmlsZW5hbWVzX3NvcnRlZC4KLQkobGFuZ19hZGRfd2lsZCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxkbGFuZy5jICh3aWxkX3NvcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh3aWxkX3NlY3Rpb24pOiBVc2Ugd2lsZF9zb3J0LgotCShwcmludF93aWxkX3N0YXRlbWVudCk6IFByaW50IHNvcnRpbmcgaW5mb3JtYXRpb24uCi0JKGxhbmdfYWRkX3dpbGQpOiBBZGQgbmV3IHBhcmFtZXRlcnMgc2VjdGlvbnNfc29ydGVkIGFuZAotCWZpbGVuYW1lc19zb3J0ZWQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IFVwZGF0ZSBjYWxscyB0byBsYW5nX2FkZF93aWxkLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBTb3J0IC5jdG9ycy4qIGFuZCAuZHRvcnMuKiBieSBzZWN0aW9uIG5hbWUuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotVGh1IE1heSAxNCAxODozOToxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUuCi0KLVRodSBNYXkgMTQgMTQ6NTE6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmg6IEFkZCBuZXcgcHJvdG90eXBlOiBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucy4KLQkobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIG5ldyBmaWVsZDogbGlzdF9vcHRpb25zLgotCSogbGRlbXVsLmMgKGxkZW11bF9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBDYWxsIHRoZQotCWxpc3Rfb3B0aW9ucyBmaWVsZCBvZiB0aGUgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGZvciBlYWNoCi0Jc3VwcG9ydGVkIGVtdWxhdGlvbiwgaWYgc3VjaCBhIGZ1bmN0aW9uIGlzIHByZXNlbnQuCi0JKiBsZXhzdXAuYyAoaGVscCk6IENhbGwgbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF88Pl9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBEZXNjcmliZQotCXRoZSBwZSBlbXVsYXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbSAoZ2xkPD5fbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uLgotCURlc2NyaWJlICB0aGUgYXJtY29mZiBlbXVsYXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogQWRkIGEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb246Ci0JLS1zdXBwb3J0LW9sZC1jb2RlLgotCSogZW11bHRlbXBsL2FybWNvZmYuZW06IERpdHRvLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdGhlIC0tc3VwcG9ydC1vbGQtY29kZSBvcHRpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZW11bGF0aW9uIGZpbGVzIGZvciBQT1RGSUxFUy5pbiB0YXJnZXQuCi0JKiBlbXVsdGVtcGwvcGUuZW06IEludGVybmF0aW9uYWxpc2Ugc3VpdGFibGUgc3RyaW5ncy4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBJbnRlcm5hdGlvbmFsaXNlIHN1aXRhYmxlIHN0cmluZ3MuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVidWlsdC4KLQotU3VuIE1heSAxMCAyMjozNjozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UdWUgQXByIDI4IDE5OjE4OjMwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogbGQuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1Nb24gQXByIDI3IDExOjU2OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucykgWy1ycGF0aC1saW5rXTogTWVudGlvbiBsZC5zby5jb25mLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsb2JhbF92ZXJjaGVja19uZWVkZWQpOiBOZXcgZmlsZSBzdGF0aWMKLQl2YXJpYWJsZS4KLQkoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IENoZWNrIGZvciBzaGFyZWQgbGlicmFyaWVzCi0JdHdpY2UsIG9uY2Ugd2l0aCBmb3JjZSBzZXQgdG8gMCBhbmQgb25jZSB3aXRoIGl0IHNldCB0byAxLgotIAkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZik6IEFkZCBmb3JjZSBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBMaWtld2lzZS4gIElmIG5vdCBmb3JjZSwgY2hlY2sKLQl3aGV0aGVyIHRoZSBsaWJyYXJpZXMgbmVlZHMgYW55IGluY29tcGF0aWJsZSB2ZXJzaW9ucy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1XZWQgQXByIDIyIDE2OjAxOjM1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAxMjo0MDo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogQWRkICQoSU5UTExJQlMpIHRvIExJQklCRVJUWSB3aGVuCi0JaW52b2tpbmcgcnVudGVzdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENoYW5nZSAtbCBvcHRpb25zIGludG8gLS1saWJyYXJ5IG9wdGlvbnMKLQl0byBhdm9pZCBjb25mdXNpb24gYmV0d2VlbiAtbGkgYW5kIC1saWJyYXJ5LgotCi0JKiBsZC50ZXhpbmZvIChNRU1PUlkpOiBDbGFyaWZ5IHVzZSBvZiA+UkVHSU9OLgotCi1UdWUgQXByIDIxIDIzOjEyOjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBsZC5oOiBBZGRlZCBnZXR0ZXh0LXJlbGF0ZWQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCi0JKiBsZG1haW4uYzogQ2FsbCBzZXRsb2NhbGUsIGJpbmR0ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluLgotCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAotCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuICBDcmVhdGUgcG8vTWFrZWZpbGUuaW4gYW5kCi0JcG8vTWFrZWZpbGUuICBVc2UgQU1fUFJPR19MRVguCi0JKFRESVJTKTogQUNfU1VCU1QgZWFybHkgb24sIHRvIGF2b2lkIGhhdmluZyB2YWx1ZSBzcGxpdCB3aGVuIGl0Ci0JaGFwcGVucyB0byBjcm9zcyBsaW5lIDkwIG9mIHRoZSBnZW5lcmF0ZWQgc2VkIHNjcmlwdC4KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogTmV3IG1hY3JvLgotCShQT1RGSUxFUyk6IExpa2V3aXNlLgotCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCi0JKGxkX25ld19MREFERCk6IEFkZGVkIElOVExMSUJTLgotCShsZF9uZXdfREVQRU5ERU5DSUVTKTogQWRkZWQgSU5UTERFUFMuCi0JKiBwby9NYWtlLWluLCBwby9QT1RGSUxFUy5pbiwgcG8vZ2FzLnBvdDogTmV3IGZpbGVzLgotCi1UdWUgQXByIDIxIDIzOjA3OjA3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoU2ltcGxlIEV4YW1wbGUpOiBSZXdyaXRlIGEgZmV3IHRoaW5ncyBhcyBzdWdnZXN0ZWQKLQlieSBOaWNrIENsaWZ0b24gPG5pY2tjQGN5Z251cy5jb20+LgotCShQUk9WSURFKTogTGlrZXdpc2UuCi0KLVR1ZSBBcHIgMjEgMDk6NTU6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBSZW5hbWUgZXh0ZXJuYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMKLQl0byBjb25mb3JtIHRvIEJGRCBuYW1pbmcgY29udmVudGlvbnMuICBBZGQgY29kZSB0byBfYWZ0ZXJfb3BlbigpCi0JZnVuY3Rpb24gdG8gb2J0YWluIGEgYmZkIGZvciB1c2UgYnkgdGhlIGludGVyd29ya2luZyBjb2RlLgotCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogUmVuYW1lIGV4dGVybmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zCi0JdG8gY29uZm9ybSB0byBCRkQgbmFtaW5nIGNvbnZlbnRpb25zLiAgQWRkIG5ldyBfYWZ0ZXJfb3BlbigpCi0JZnVuY3Rpb24gdG8gb2J0YWluIGEgYmZkIGZvciB1c2UgYnkgdGhlIGludGVyd29ya2luZyBjb2RlLgotCi1TdW4gQXByIDE5IDE5OjIzOjA5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpIFtjYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bV06Ci0JVXBkYXRlIGRvdCBhbmQgdGhlIGRlZmF1bHQgbWVtb3J5IHNlY3Rpb24gZXZlbiB3aGVuIHJlbGF4aW5nLgotCi1TYXQgQXByIDE4IDE4OjQxOjEyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBNYW5pcHVsYXRlIHRoZSBzZWN0aW9uJ3MgY29va2VkIHNpemUKLQlyYXRoZXIgdGhhbiBpdHMgcmF3IHNpemUuCi0KLVR1ZSBBcHIgIDcgMTM6MzU6MjkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUuaW4gKFRFU1RCRkRMSUIpOiBOZXcuICBEZWZpbmVkIGFuZCBzdWJzdGl0dXRlZC4KLQkqIE1ha2VmaWxlLmFtIChURVNUQkZETElCKTogQ2hhbmdlZCB0byBAVEVTVEJGRExJQkAuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByICA2IDE1OjMzOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxkLmluZm8pOiBJbnZva2UgbWFrZWluZm8gd2l0aCAtSSBvcHRpb25zIGRpcmVjdGx5Ci0JcmF0aGVyIHRoYW4gcmVseWluZyBvbiBkZWZhdWx0IHJ1bGUuICBEb24ndCBkZXBlbmQgdXBvbgotCWJmZHN1bW0udGV4aS4KLQkobGQuZHZpKTogTGlrZXdpc2UuCi0JKGJmZHN1bW0udGV4aSk6IFJlbW92ZSB0YXJnZXQuCi0JKENMRUFORklMRVMpOiBUYWtlIGJmZHN1bW0udGV4aSBvdXQgb2YgdmFsdWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU3VuIEFwciAgNSAxMzowNzo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBVc2Ugc2hlbGwgdmFyaWFibGVzIHRvIGF2b2lkIGRlcGVuZGluZyB1cG9uCi0JaG93ICQgaXMgaGFuZGxlZCB3aGVuIGV4cGFuZGluZyBhIHNoZWxsIHN1YnN0aXR1dGlvbi4KLQotRnJpIEFwciAgMyAwMDo1Njo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogQWRkIGxkLmxvZyBhbmQgbGQuc3VtLgotCShESVNUQ0xFQU5GSUxFUyk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBQdXQgdGhlIHRkaXJzIGluIGEgZmlsZSBhbmQgdXNlIEFDX1NVQlNUX0ZJTEUsCi0JcmF0aGVyIHRoYW4gaW4gYSBzaGVsbCB2YXJpYWJsZSBhbmQgdXNpbmcgQUNfU1VCU1QuCi0JKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBSZW1vdmUgbGRzY3JpcHRzLiAgQWRkIHRkaXJzLgotIAkoZGlzdGNsZWFuLWxvY2FsKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGxkLnRleGluZm86IENvbXBsZXRlbHkgcmV3cml0ZSBsaW5rZXIgc2NyaXB0IGRvY3VtZW50YXRpb24uCi0KLU1vbiBNYXIgMzAgMTI6NDc6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLVNhdCBNYXIgMjggMTY6NDg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IFJlbW92ZSB0bXBkaXIuCi0JKG1vc3RseWNsZWFuLWxvY2FsKTogTmV3IHRhcmdldCB0byByZW1vdmUgdG1wZGlyLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBsZGNyZWYuYyAob3V0cHV0X2NyZWYpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBsZGZpbGUuYyAobGRmaWxlX2FkZF9hcmNoKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAobGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGxleHN1cC5jIChPUFRJT05fQ09VTlQpOiBMaWtld2lzZS4KLQkocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOgotCUxpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IEluaXRpYWxpemUgdmFyaWFibGVzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLQkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogQ29ycmVjdCBuYW1lICh3YXMKLQlNT1NUQ0xFQU5GSUxFUykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIE1hciAyNyAxNjozOToyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogUHV0Ci0JQVJNIGNvZGUgaW5zaWRlIGlmZGVmIFRBUkdFVF9JU19hcm1wZS4KLQotV2VkIE1hciAyNSAxMTozNDoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgIDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAoTERESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUuCi0JKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IE9ubHkgaW5jbHVkZSAuaWRhdGFcJFswLTddIGluIC5pZGF0YSB3aGVuCi0JcmVsb2NhdGluZy4KLQotVHVlIE1hciAyNCAxNTo1OToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLnRleHQpOiBBZGQgLmdsdWVfNyBhbmQgLmdsdWVfN3Qgc2VjdGlvbnMgdG8KLQlob2xkIEFybS9UaHVtYiBzdHVicy4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfcGVfYmVmb3JlX2FsbG9jYXRpb24pOiBDYWxsCi0JYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGZvciBBUk0vVGh1bWIgdGFyZ2V0cykgaW4gb3JkZXIgdG8KLQlnYXRoZXIgaW50ZXJ3b3JraW5nIHN0YiBpbmZvcm1hdGlvbi4KLQotTW9uIE1hciAyMyAxODo1NDoxNSAxOTk4ICBKb2VsIFNoZXJyaWxsICA8am9lbEBPQVJjb3JwLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogKHNoKi0qLXJ0ZW1zKik6IFN3aXRjaGVkIGZyb20gRUxGIHRvIENPRkYuCi0KLUZyaSBNYXIgMjAgMTk6MTc6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVGh1IE1hciAxOSAxNDo1NDo0NSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIC5kYXRhJG5vY29weQotCXNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEgb24gZm9yay4gIFRoZSBsaW5rZXIgdXNlZCB0bwotCWluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0Ci0JYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBUaGUgZml4IGlzIHRvIHJlbmFtZSB0aGUKLQlzZWN0aW9uCSIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIKLQlfX2RhdGFfZW5kX18uCi0KLVdlZCBNYXIgMTggMDk6NDI6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLVN1biBNYXIgIDggMjM6MzQ6MTQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmNsaXRlKi0qLWVsZik6IEFkZGVkLgotCi1Nb24gTWFyICAyIDE5OjI0OjA4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgdGhlIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbiBpcwotCSpkZWZhdWx0Kiwgc2VlIGlmIHRoZXJlIGlzIGEgbWVtb3J5IHJlZ2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQuCi0KLVRodSBGZWIgMjYgMTc6MDk6NTMgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFkZCBzdXBwb3J0IGZvciAuZWl0X3Ygc2VjdGlvbiBhbmQgcHV0Ci0JaXQgYXQgMHhmZmZmZjAyMC4KLQkqIGVtdWxwYXJhbXMvZDMwdntlbGYsX28sX2V9LnNoOiBEaXR0by4KLQotTW9uIEZlYiAyMyAxNzo0Njo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9zZWN0aW9ucyk6IFBlcm1pdCB0aGUgd2lsZGNhcmQgdG8gaW5jbHVkZQotCWEgdHJhaWxpbmcgJyonIHdoZW4gc29ydGluZyBncm91cGVkIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvcGUuc2M6IEluY2x1ZGUgZ3JvdXBlZCBzZWN0aW9ucyB1c2luZyBOQU1FXCQqLiAgT25seQotCWluY2x1ZGUgdGhlbSB3aGVuIHJlbG9jYXRpbmcuCi0KLVdlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgotCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgotCi1GcmkgRmViIDEzIDE1OjI0OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQotVGh1IEZlYiAxMiAxNDoxMDo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWxpZ24gdGhlIF9lbmQgc3ltYm9sIGFjY29yZGluZyB0byB0aGUgRUxGCi0gCWZvcm1hdCBzaXplLiAgRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT4uCi0KLQlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIGNvbmZpZ3VyZS5ob3N0IChhbHBoYSotKi1uZXRic2QqKTogTmV3IGhvc3QuCi0JKiBjb25maWd1cmUudGd0IChhbHBoYSotKi1uZXRic2QqLCBwb3dlcnBjLSotbmV0YnNkKik6IE5ldwotCXRhcmdldHMuCi0KLQkqIGxleHN1cC5jIChoZWxwKTogVXBkYXRlIGJ1Zy1nbnUtdXRpbHMgYWRkcmVzcy4KLQkqIGxkLnRleGluZm8gKEJ1ZyBSZXBvcnRpbmcpOiBMaWtld2lzZS4KLQotVHVlIEZlYiAxMCAxODowNTo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXYXJuIGlmIHNvbWUgbWVtb3J5IHJlZ2lvbnMgd2VyZQotCWRlZmluZWQsIGJ1dCBhIGxvYWRhYmxlIHNlY3Rpb24gaXMgZ29pbmcgaW50byB0aGUgZGVmYXVsdCBtZW1vcnkKLQlyZWdpb24uCi0KLVR1ZSBGZWIgMTAgMTY6MTc6MjAgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsZGxleC5sIChWX0lERU5USUZJRVIpOiBBbGxvdyAnLicgYXMgc3ltYm9sIHByZWZpeC4KLQotVHVlIEZlYiAxMCAxNTowOTo0NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNYWtlZmlsZSk6IEFkZCB0YXJnZXQsIGZvciBkZXBlbmRlbmNpZXMgb24KLQljb25maWd1cmUuaG9zdCBhbmQgY29uZmlndXJlLnRndC4KLQkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUudGd0OiBDaGFuZ2UgLWxpbnV4KiB0byAtbGludXgtZ251Ki4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViICA5IDEzOjQ0OjQwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAoLnN0YWNrKTogTW92ZSBzdGFjayB0byAweDAwLi43RkZFLgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFJFQURPTkxZX1NUQVJUX0FERFIpOiBSZWFkIG9ubHkgc2VjdGlvbgotIAltb3ZlZCB0byAweDAwLi4uLi40LgotCi1TYXQgRmViICA3IDE1OjQxOjI2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBGZWIgIDUgMTI6MTY6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogUmVtb3ZlICR7UkVMT0NBVElORy0wfSBmcm9tIGFsbCBzZWN0aW9ucy4KLQlGcm9tIFRob21hcyBkZSBMZWxsaXMgPHRkZWxAd3JzLmNvbT4uCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotV2VkIEZlYiAgNCAxMzowMjozMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZF9uZXdfTERBREQpOiBSZW1vdmUgQExFWExJQkAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEZlYiAgMiAxOTozNDo1NCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JQWRkIHRtczMyMGMzMCBzdXBwb3J0OgotCSogY29uZmlndXJlLnRndCAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCi0JKiBlbXVscGFyYW1zL3RpYzMwYW91dC5zaDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL3RpYzMwY29mZi5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2M6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBldGljMzBhb3V0Lm8gYW5kCi0JZXRpYzMwY29mZi5vLgotCShldGljMzBhb3V0LmMsIGV0aWMzMGNvZmYuYyk6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDIgMTQ6MTA6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogQ29ycmVjdCBIT1NUSU5HX0NSVDAgaW4gYWxwaGEqLSotbGludXgqIGNhc2UgdG8KLQlhY2NlcHQgZWl0aGVyIGxkLnNvIG9yIGxkLWxpbnV4LnNvLgotCi1GcmkgSmFuIDMwIDE5OjE2OjI4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICh7Q0MsQ1hYfV9GT1JfVEFSR0VUKTogQ2hhbmdlIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKLQl0byB0cmFuc2Zvcm0uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotRnJpIEphbiAzMCAxOToxNToxNyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFB1dCAuZHluc2JzcyBpbiAuc2Jzcy4KLQotRnJpIEphbiAzMCAxMTo0Mzo0OSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBNYWtlZmlsZS5hbSAoZWVsZjMyYnNtaXAuYywgZWVsZjMybHNtaXAuYyk6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKYW4gMjkgMTY6MDQ6MjEgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGxkZmlsZS5jIChzbGFzaCk6IFNldCB0byBiYWNrc2xhc2ggaWYgX1dJTjMyIGJ1dCBub3QKLQlfX0NZR1dJTjMyX18uCi0JKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogSWYgX19NU0RPU19fIG9yIF9XSU4zMiwgYWNjZXB0IGEKLQlsZWFkaW5nIGJhY2tzbGFzaCBvciBhIGxlYWRpbmcgeDogYXMgYW4gYWJzb2x1dGUgcGF0aC4KLQkobGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKTogVXNlIHNsYXNoIHJhdGhlciB0aGFuIC8gd2hlbgotCWdlbmVyYXRpbmcgbmFtZSB0byB0cnkuCi0JKiBsZXhzdXAuYyAoUEFUSF9TRVBBUkFUT1IpOiBEZWZpbmUuCi0JKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBVc2UgUEFUSF9TRVBBUkFUT1IgcmF0aGVyIHRoYW4gJzonLgotCi1XZWQgSmFuIDI4IDE0OjA2OjMwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKEVMRlNJWkUpOiA2NAotCShURVhUX1NUQVJUX0FERFIpOiBSb3VuZCBvZmYsIHNpbmNlIFNJWkVPRl9IRUFERVJTIGlzIGFkZGVkIGxhdGVyLgotCShEQVRBX1BMVCk6IE5lZWRlZCBieSB2OSBhYmkuCi0KLVdlZCBKYW4gMjggMTY6Mzc6MjcgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKTogTmV3IGVudHJ5LgotCi1XZWQgSmFuIDI4IDE1OjUxOjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBPbmx5IGluY2x1ZGUgbGlua29uY2Ugc2VjdGlvbnMgaW4gZmluYWwKLQlzZWN0aW9ucyB3aGVuIHJlbG9jYXRpbmcuCi0KLVdlZCBKYW4gMjggMTQ6MTA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQWRkIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGVzIG9mCi0JaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4gYSBsaW5rIG1hcC4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IE1lbnRpb24gTERFTVVMQVRJT04gaW4gZGVzY3JpcHRpb24gb2YgLW0uCi0JKEVudmlyb25tZW50KTogTWVudGlvbiBMREVNVUxBVElPTi4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IENsYXJpZnkgLS1leHBvcnQtZHluYW1pYyBhIGJpdC4KLQotVGh1IEphbiAyMiAxNjowNzoyMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sICg8U0NSSVBUPntXSUxEQ0hBUn0qKTogVGFrZSBjYXJlIGZvciB0aGUgY29tbWVudHMgdGhpcwotCXBhdHRlcm4gY291bGQgbWF0Y2guCi0KLVdlZCBKYW4gMjEgMjI6MjY6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IFdoZW4gZG9pbmcKLQlhIHJlbG9jYXRlYWJsZSBsaW5rLCBzZXQgdGhlIGltYWdlIGJhc2UgdG8gMCwgYW5kIGRvbid0IGRlZmluZSB0aGUKLQl2YXJpb3VzIHN5bWJvbHMuCi0JKiBlbXVscGFyYW1zL2kzODZwZS5zaCAoUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQpOiBEZWZpbmUuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogU3dhcCB0aGUgLmRhdGEgYW5kIC5ic3Mgc2VjdGlvbnMgc28gdGhhdAotCS5kYXRhIGNvbWVzIGZpcnN0LiAgSWYgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdXNlCi0JUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHN0YXJ0IHRoZQotCXNlY3Rpb25zIGF0IDAsIGFuZCBkb24ndCBkZWZpbmUgYW55IHN5bWJvbHMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9kZWZhdWx0KTogQ29ycmVjdCBwYXJlbnRoaXNpemF0aW9uIG9mCi0JZXhwcmVzc2lvbi4KLQotV2VkIEphbiAyMSAyMToyMDozMiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogRG9uJ3QgaW5jbHVkZSBzeXMvdHlwZXMuaCBhbmQgc3lzL3N0YXQuaAotCWhlcmU7IHRoZXkgYXJlIGluY2x1ZGVkIGFscmVhZHkgdmlhIHN5c2RlcC5oLgotCi1UdWUgSmFuICA2IDEzOjQwOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2k5NjAuc2M6IERvbid0IGV4cGxpY2l0bHkgc2V0IC5kYXRhIGFuZCAuYnNzIHN0YXJ0LgotCi1GcmkgSmFuICAyIDIwOjE1OjM3IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoYXR0cmlidXRlc19vcHQpOiBQYXNzIHJlZ2lvbiBwb2ludGVyIHRvCi0JbGFuZ19zZXRfZmxhZ3MsIG5vdCAmcmVnaW9uLT5mbGFncy4KLQotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X2RlZmF1bHQpOiBOZXcgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBhCi0JZGVmYXVsdCBtZW1vcnkgcmVnaW9uIGZvciBhIHNlY3Rpb24gaWYgaXQgd2FzIG5vdCBzcGVjaWZpZWQuCi0JKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBaZXJvIGZsYWdzLCBub3RfZmxhZ3MgZmllbGQuCi0JKGxhbmdfbWFweyxfZmxhZ3N9KTogUHJpbnQgYXR0cmlidXRlIGZsYWdzIGluIG1lbW9yeSBtYXAuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENhbGwgbGFuZ19tZW1vcnlfZGVmYXVsdCB0byBnZXQgZGVmYXVsdAotCW1lbW9yeSByZWdpb24uCi0JKGxhbmdfc2V0X2ZsYWdzKTogSW1wbGVtZW50IGF0dHJpYnV0ZSBmbGFncyBmb3IgcmVhbC4gIFRha2UgbmV3Ci0JYXJndW1lbnQgdG8gZ2l2ZSB0aGUgZmxhZ3Mgd2UgYXJlIHRvIHNraXAgZm9yIHRoaXMgcmVnaW9uLgotCi0JKiBsZGxhbmcuaCAobWVtb3J5X3JlZ2lvbl9zdHJ1Y3QpOiBBZGQgbm90X2ZsYWdzIGZpZWxkLCBtYWtlIGJvdGgKLQlmbGFncyBmaWVsZHMgZmxhZ3dvcmQgdHlwZS4KLQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZSk6IE1ha2UgZmxhZ3MgZmllbGQgZmxhZ3dvcmQgdHlwZS4KLQkobGFuZ19zZXRfZmxhZ3MpOiBVcGRhdGUgcHJvdG90eXBlIHRvIG1hdGNoIG5ldyBjYWxsaW5nIHNlcXVlbmNlLgotCShsYW5nX21lbW9yeV9yZWdpb25fZGVmYXVsdCk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIGVtdWxwYXJhbXMvZDMwdntfZSxfbyxlbGZ9LnNoICh7VEVYVCxEQVRBLEVNRU19X0RFRl9TRUNUSU9OKToKLQlEZWZpbmUgd2hldGhlciBvciBub3QgdGhlIHJlZ2lvbiBnZXRzIGRlZmF1bHQgc2VjdGlvbnMsIGFuZCBpZiBzbywKLQl3aGF0IHNlY3Rpb25zLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjIChNRU1PUlkpOiBTZXQgdXAgd2hpY2ggb2YgdGhlIHJlZ2lvbnMgZ2V0Ci0JZGVmYXVsdCBzZWN0aW9ucy4KLQotVGh1IEphbiAgMSAyMjo1ODowNCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAoLmVoX2ZyYW1lKTogTGluayBpbnRvIHRoZSBkYXRhIHNlY3Rpb24uCi0KLVRodSBKYW4gIDEgMTg6MDQ6NTEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IEZpeCB0eXBvLgotCSogc2NyaXB0dGVtcGwvaDgzMDBzLnNjOiBMaWtld2lzZS4KLQotU3VuIERlYyAyMSAxMjo1MTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IERvbid0IGNyYXNoIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhCi0Jc2VjdGlvbiB3aXRoIG5vIG91dHB1dCBzZWN0aW9uLCBzdWNoIGFzIGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4KLQotV2VkIERlYyAxNyAxMjoxNDoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogS2VlcCB0cmFjayBvZiB3aGVyZSB3ZSBhcmUgaW4gdGhlIG9wdGlvbgotCXBhcnNpbmcgYmVmb3JlIGNhbGxpbmcgbGRlbXVsX3BhcnNlX2FyZ3MsIHNvIHRoYXQgd2UgZG9uJ3QgY2FsbCBpdAotCW11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGFyZ3VtZW50IGFuZCBjb25mdXNlIHRoZSBnZXRvcHQKLQlpbnRlcm5hbHMuCi0KLVRodSBEZWMgMTEgMDk6MDA6MTUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGQzMHYtZWxmLSopOiBSZW5hbWUgZDMwdmVsZl9lIHRvIGQzMHZfZSBhbmQKLQlkMzB2ZWxmX28gdG8gZDMwdl9vIHRvIHdvcmsgaW4gRE9TIGVudmlyb25tZW50cy4KLQkqIE1ha2VmaWxlLnthbSxpbn06IERpdHRvLgotCi0JKiBlbXVscGFyYW1zL2QzMHZfe28sZX06IFJlbmFtZSBmcm9tIGQzMHZlbGZfe28sZX0uCi0JKiBlbXVscGFyYW1zL2QzMHZlbGZfe28sZX06IERlbGV0ZWQuCi0KLVdlZCBEZWMgMTAgMTc6NDA6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogQWRkIGdsdWUgc2VjdGlvbnMgKGNvZGUgdGFrZW4gZnJvbSBBcm0KLQlicmFuY2gpLgotCi0JKiBlbXVscGFyYW1zL2FybWNvZmYuc2ggKFRFTVBMQVRFX05BTUUpOiBTZXQgdG8gYXJtY29mZi4KLQotCSogZW11bHRlbXBsL2FybWNvZmYuZW06IE5ldyBmaWxlLCBpbXBvcnRlZCBmcm9tIEFybSBicmFuY2guCi0KLVdlZCBEZWMgMTAgMTQ6MTA6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFkZCAucmVsIGFuZCAucmVsYSBzZWN0aW9ucyBmb3IgYWxsCi0JZGVmaW5lZCBzZWN0aW9ucy4gIFNldCB1cCBfX3tELEN9VE9SX3tMSVNULEVORH1fXy4gIEFkZCBvbmNoaXAgYW5kCi0JZXh0ZXJuYWwgbWVtb3J5IHNlY3Rpb25zIGZvciByb2RhdGEuICBEZWxldGUgLnN0cmluZywgLnJvZGF0YTEsCi0JYW5kIC5kYXRhMSBzZWN0aW9ucy4KLQotVHVlIERlYyAgOSAxNToyODoxNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBPY3QgMjMgY2hhbmdlcyB0byBNYWtlZmlsZS5pbiBoZXJlLgotCi0JKiBNYWtlZmlsZS57YW0saW59OiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWQxMHZlbGYuby4KLQotCSogTWFrZWZpbGUue2FtLGlufTogKEFMTF9FTVVMQVRJT05TKTogQWRkIGV0aWM4MGNvZmYuby4KLQotCSogTWFrZWZpbGUue2FtLGlufTogKEFMTF9FTVVMQVRJT05TKTogQWRkIGVkMzB2ZWxmeyxfZSxfb30uby4KLQkoZWQzMHZlbGZfZS5jKTogTGlrZSBkMzB2ZWxmLCBleGNlcHQgLnRleHQvLmRhdGEvZXRjIGFsd2F5cyBnbyBpbgotCWV4dGVybmFsIG1lbW9yeS4KLQkoZWQzMHZlbGZfby5jKTogTGlrZSBkMzB2ZWxmLCBleGNlcHQgLnRleHQvLmRhdGEvZXRjIGFsd2F5cyBnbyBpbgotCW9uY2hpcCBtZW1vcnkuCi0KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaCAoU1RBQ0tfU1RBUlRfQUREUik6IFRvcCBvZiBkZWZhdWx0Ci0Jc3RhY2suCi0JKHtURVhULERBVEEsRU1FTX1fU0laRSk6IFNpemVzIG9mIHRoZSAzIG1lbW9yeSBhcmVhcy4KLQkoe1RFWFQsREFUQSxCU1N9X01FTU9SWSk6IFdoaWNoIG1lbW9yeSByZWdpb24gLnRleHQsIC5kYXRhLCBhbmQKLQkuYnNzIHNob3VsZCBnbyBpbi4KLQotCSogZW11bHBhcmFtcy9kMzB2ZWxmX3tlLG99LnNoOiBOZXcgZmlsZXMgdG8gYmUgZXhwbGljaXQgd2hldGhlcgotCS50ZXh0LCAuZGF0YSwgZXRjIGdvIGluIGV4dGVybmFsIG1lbW9yeSBvciBvbmNoaXAgbWVtb3J5LgotCi0JKiBjb25maWd1cmUudGd0IChkMzB2LSotKmV4dCopOiBOZXcgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0Ci0JLnRleHQsIC5kYXRhLCBldGMuIGluIGV4dGVybmFsIG1lbW9yeS4KLQkoZDMwdi0qLSpvbmNoaXAqKTogTmV3IGNvbmZpZ3VyYXRpb24gdG8gZGVmYXVsdCAudGV4dCwgLmRhdGEsCi0JZXRjLiBpbiBvbmNoaXAgbWVtb3J5LgotCShkMzB2LSotKik6IEFkZCBkMzB2ZWxmX3tlLG99IGVtdWxhdGlvbnMuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFsbG93IC50ZXh0LCAuZGF0YSwgLmJzcyB0byBiZSBwdXQgaW4KLQllaXRoZXIgdGhlIG9uY2hpcCB0ZXh0L2RhdGEgYXJlYXMgb3IgdGhlIGV4dGVybmFsIG1lbW9yeSBhcmVhLgotCShNRU1PUlkpOiBHZXQgc2l6ZXMgZnJvbSBkMzB2ZWxmLnNoLgotCSguZXtkYXRhLHRleHQsYnNzfSk6IFB1dCBzZWN0aW9ucyBpbiB0aGUgZXh0ZXJuYWwgbWVtb3J5IHJlZ2lvbi4KLQkoLnN0ZXh0KTogUHV0IHNlY3Rpb24gaW4gdGhlIG9uY2hpcCB0ZXh0IHJlZ2lvbi4KLQkoLnN7ZGF0YSxic3N9KTogUHV0IHNlY3Rpb25zIGluIHRoZSBvbmNoaXAgZGF0YSByZWdpb24uCi0JKF9fc3RhY2spOiBBc3NpZ24gZnJvbSAke1NUQUNLX1NUQVJUX0FERFJ9LgotCSgudGV4dCk6IFB1dCBpbiAke1RFWFRfTUVNT1JZfSBtZW1vcnkgcmVnaW9uLgotCSguZGF0YXssMX0vLnN0cmluZ3MvLnJvZGF0YXssMX0pOiBQdXQgaW4gJHtEQVRBX01FTU9SWX0gbWVtb3J5Ci0JcmVnaW9uLgotCSguYnNzKTogUHV0IGluICR7QlNTX01FTU9SWX0gbWVtb3J5IHJlZ2lvbi4KLQotVHVlIERlYyAgMiAxMDoxNDo0NyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotU2F0IE5vdiAyMiAxNToyMzoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4Lmw6IERvbid0IGRlZmluZSBoZXhfbW9kZS4gIENvcnJlY3QgbnVtYmVyIHJlZ2V4cCB0byBub3QKLQlhY2NlcHQgaGV4IGRpZ2l0cyB3aXRob3V0IGEgbGVhZGluZyAkIG9yIDB4LiAgSGFuZGxlIGxlYWRpbmcgJAotCWNvcnJlY3RseS4gIFBhc3MgMCByYXRoZXIgdGhhbiBoZXhfbW9kZSB0byBiZmRfc2Nhbl92bWEuCi0JKiBsZGxleC5oIChoZXhfbW9kZSk6IERvbid0IGRlY2xhcmUuCi0KLVN1biBOb3YgMTYgMjA6MTY6NDUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaCAoe0RBVEEsRU1FTX1fU1RBUlRfQUREUik6IERlZmluZSBhcyBzdGFydAotCW9mIGludGVybmFsIGRhdGEgYXJlYSBhbmQgZXh0ZXJuYWwgbWVtb3J5IG9uIGNoaXAuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IERlZmluZSBhIE1FTU9SWSByZWdpb24gdGhhdCBkZXNjcmliZXMKLQl0aGUgMyByZWdpb25zIG9mIG1lbW9yeSBvbiB0aGUgY2hpcC4gIFB1dCAudGV4dC8uaW5pdC8uZmluaSBpbnRvCi0JdGhlIHRleHQgbWVtb3J5IHJlZ2lvbiwgcHV0IG90aGVyIHNlZ21lbnRzIGludG8gdGhlIGRhdGEgbWVtb3J5Ci0JcmVnaW9uLiAgQWRkIG1vcmUgb2YgdGhlIHN0YW5kYXJkIGVsZiBzZWN0aW9ucy4gIERlZmF1bHQgX19zdGFjawotCXRvIGJlIDB4MjAwMDgwMDAsIHdoaWNoIGlzIDEgYnl0ZSBiZXlvbmQgZW5kIG9mIHRoZSBpbnRlcm5hbCBkYXRhCi0JcmVnaW9uLgotCi1UaHUgTm92IDEzIDEzOjQ1OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IE1ha2UgRnJlZUJTRCBhIGkzODZic2QKLSAJdmFyaWFudC4KLQotU3VuIE5vdiAgMiAxNDo1MTozNiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWd1cmUuaG9zdCAoYWxwaGEqLSotbGludXgqKTogQ29ycmVjdCBIT1NUSU5HX0NSVDAuICBTZXQKLQlIT1NUSU5HX0xJQlMuCi0KLVRodSBPY3QgMzAgMTI6MjU6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgd2Fybl9taXNtYXRjaCBmaWVsZC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSB3YXJuX21pc21hdGNoIGZpZWxkLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1uby13YXJuLW1pc21hdGNoIG9wdGlvbi4KLQkqIGxkbGFuZy5jIChpZ25vcmVfYmZkX2Vycm9yKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGFuZ19jaGVjayk6IElmIHdhcm5fbWlzbWF0Y2ggaXMgZmFsc2UsIGRvbid0IHdhcm4gYWJvdXQKLQltaXNtYXRjaGVkIGlucHV0IGZpbGVzLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KLQotVGh1IE9jdCAyMyAxNDozODoxOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBSZW5hbWUgbGlua2VyIHN5bWJvbCAnX3N0YWNrJyB0byAnX19zdGFjaycKLQl0byBhdm9pZCBjb25mbGljdHMgd2l0aCBDIGNvZGUgd2hpY2ggaXMgZGVmaW5pbmcgYSB2YXJpYWJsZSBjYWxsZWQKLQknc3RhY2snLgotCi1UaHUgT2N0IDIzIDAwOjU3OjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBNb3ZlIGVlbGY2NF9zcGFyYy5vIC4uLgotCShBTExfNjRfRU1VTEFUSU9OUyk6IC4uLiBoZXJlLgotCShlZWxmNjRfc3BhcmMuYyk6IFRlbXBsYXRlIHNob3VsZCBiZSBlbGYzMiBub3QgZ2VuZXJpYy4KLQkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKFRFTVBMQVRFX05BTUUpOiBOZXcgZGVmaW5pdGlvbi4KLQotVGh1IE9jdCAyMyAwMDo0NDoyMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogQWRkIHNwYXJjNjQtKi1saW51eCouCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQsIE5PUCk6IE5ldy4KLQotV2VkIE9jdCAyMiAxMToyOToyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBQdXQgLmVoX2ZyYW1lIGluIC5yZGF0YS4KLQotRnJpIE9jdCAxNyAwMDowMDoxMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUpOiBPbmx5IGNoZWNrIGdsb2JhbHM8PT5sb2NhbHMsCi0Jc2luY2Ugd2UgbmVlZCB0byBiZSBhYmxlIHRvIGV4cG9ydCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLQlzeW1ib2wuCi0KLVdlZCBPY3QgMTUgMTQ6NTI6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogUHV0IC5zdGFiIGFuZCAuc3RhYnN0ciBzZWN0aW9ucyBhdCBlbmQuCi0KLVdlZCBPY3QgIDggMTI6Mzc6MDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCwgY29uZmlndXJlLmhvc3Q6IENoYW5nZSBhbHBoYS0qLSogdG8gYWxwaGEqLSotKjsKLQljb25maWcuZ3Vlc3Mgbm93IHJlY29nbml6ZXMgYWxwaGFldjUgZXRjLgotCi1GcmkgT2N0ICAzIDE0OjIzOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IERvbid0IHRyZWF0Ci0JLXMgYW5kIC11IGFzIC1zdGF0aWMgYW5kIC11bml4LgotCi1UaHUgT2N0ICAyIDE4OjQwOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IFJld3JpdGUgZmxhZyBoYW5kbGluZyBmb3IgY2xhcml0eS4gIElmIHdlCi0gCWFyZSBub3QgYWRkaW5nIHRoZSBmaXJzdCBpbnB1dCBzZWN0aW9uLCBhbmQgU0VDX1JFQURPTkxZIGlzIGNsZWFyCi0gCW9uIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhlbiBkb24ndCBjb3B5IGl0IGZyb20gdGhlIGlucHV0IHNlY3Rpb24uCi0gIAlJZiBTRUNfUkVBRE9OTFkgaXMgbm90IHNldCBvbiB0aGUgaW5wdXQgc2VjdGlvbiwgdGhlbiBjbGVhciBpdCBvbgotIAl0aGUgb3V0cHV0IHNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLXNnaS1pcml4WzU2XSopOiBVc2UgZWxmMzJic21pcCByYXRoZXIgdGhhbgotCWVsZjMyYm1pcC4KLQkobWlwcyplbC0qLWxpbnV4Kik6IENoYW5nZSBlbGYzMmxtaXAgdG8gZWxmMzJsc21pcCBhbmQgZWxmMzJibWlwCi0JdG8gZWxmMzJic21pcC4KLQkobWlwcyotKi1saW51eCopOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJic21pcC5zaDogTmV3IGZpbGU7IGp1c3QgbGlrZSBlbGYzMmJtaXAuc2gsIGJ1dAotCXNldHRpbmcgRU5UUlkgdG8gX19zdGFydC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsc21pcC5zaDogTmV3IGZpbGU7IGp1c3QgbGlrZSBlbGYzMmxtaXAuc2gsIGJ1dAotCXNldHRpbmcgRU5UUlkgdG8gX19zdGFydC4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWx3YXlzIHNldCBFTlRSWSB0byBfc3RhcnQgaWYgaXQgd2FzIG5vdAotCWFscmVhZHkgc2V0LgotCi1XZWQgT2N0ICAxIDE2OjQxOjAwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvdjg1MC5zaCAoUk9aREFUQV9TVEFSVF9BRERSLCBST1NEQVRBX1NUQVJUX0FERFIpOiBOZXcKLQlWYXJpYWJsZXMuCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE1vdmUgcmVhZCBvbmx5IGFyZWFzIG91dCBvZiB6ZXJvIGFuZCBzbWFsbAotCWRhdGEgc2VjdGlvbnMgYW5kIGludG8gdGhlaXIgb3duIHNlY3Rpb25zLgotCi1XZWQgU2VwIDI0IDE2OjU5OjE1IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLnRndCAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLWVsZiouCi0KLVdlZCBTZXAgMjQgMTE6MzM6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChTZWN0aW9uIE9wdGlvbnMpOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb2YgTk9MT0FECi0JZGlyZWN0aXZlLgotCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBTZXAgMjIgMTc6MjQ6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogUmV2ZXJ0IHBhdGNoIG9mIFNlcHRlbWJlciAzLgotCi1XZWQgU2VwIDE3IDE2OjQ1OjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtLCBNYWtlZmlsZS5pbjogQWRkIHJ1bGUgZm9yIGV2ODUwLmMKLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGQgdjg1MCB0YXJnZXQuCi0KLVdlZCBTZXAgMTcgMTY6NDM6MzkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy92ODUwLnNoIChDQUxMX1RBQkxFX1NUQVJUX0FERFIpOiBOZXcgZW50cnkuCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBBZGQgY2FsbCB0YWJsZSBkYXRhIGFyZWEKLQotTW9uIFNlcCAxNSAxMToyOToxMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlIGNoYW5nZSBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBQdXQgLnJvZGF0YSBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQotVHVlIFNlcCAgOSAwNzo0OTo1NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBSZW1vdmUgZXh0cmFuZW91cwotCWluaXRpYWxpemF0aW9uIG9mIHAuCi0KLVRodSBTZXAgIDQgMDk6MDM6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSW4KLQlleHByZXNzaW9uIHByb2R1Y2VkIGZvciAtYnBUIGFuZCAtYnBEIG9wdGlvbnMsIGFsaWduIHRvIGEgMzIgYnl0ZQotCWJvdW5kYXJ5IHJhdGhlciB0aGFuIGFuIDggYnl0ZSBib3VuZGFyeS4KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogUHV0IC50b2Nic3MgYXQgc3RhcnQgb2YgLmJzcyBzZWN0aW9uLgotCi0JKiBsZG1pc2MuaCwgbGRtaXNjLmMsIGxkY3JlZi5jOiBSZW5hbWUgZmluZm8gdG8gbGZpbmZvLCB0byBhdm9pZAotCWZ1bmN0aW9uIG5hbWUgY29uZmxpY3Qgd2l0aCBBSVggNC4yIHVuaXN0ZC5oIGhlYWRlciBmaWxlLgotCi1XZWQgU2VwICAzIDE1OjEyOjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IENsZWFyIFNFQ19IQVNfQ09OVEVOVFMgZnJvbSBhCi0Jbm9sb2FkX3NlY3Rpb24uCi0KLUZyaSBBdWcgMjkgMDA6MzI6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGRfbmV3X0RFUEVOREVOQ0lFUyk6IFJlbW92ZSBATEVYTElCQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgQXVnIDI4IDEwOjEyOjEwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGFyYy0qLWVsZiopOiBSZWNvZ25pemUuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFyY2VsZi5vLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBlbXVscGFyYW1zL2FyY2VsZi5zaDogTmV3IGZpbGUuCi0KLVdlZCBBdWcgMjAgMTE6MTQ6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZGNhcmRwKTogRG9uJ3QgbGV0IGEgYmFja3NsYXNoIGJ5IGl0c2VsZiBjYXVzZSBhCi0JcGF0dGVybiB0byBiZSB0cmVhdGVkIGFzIGEgd2lsZGNhcmQgcGF0dGVybi4KLQotCSogbGRncmFtLnkgKGF0eXBlKTogQWNjZXB0IHBhcmVudGhlc2VzIHdpdGggbm8gdHlwZS4KLQotCSogbGQudGV4aW5mbyAoU2VjdGlvbiBEZWZpbml0aW9uKTogQ2xhcmlmeSB1c2Ugb2Ygd2hpdGVzcGFjZS4KLQkoU2VjdGlvbiBQbGFjZW1lbnQpOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAxOCAxMToxMjowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMToxMjowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotU2F0IEF1ZyAgOSAwMDo0MjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZC5pbmZvKTogQ2hhbmdlIGRlcGVuZGVuY3kgZnJvbQotCSQoQkZERElSKS9kb2MvYmZkc3VtbS50ZXhpIHRvIGJmZHN1bW0udGV4aS4KLQkobGQuZHZpKTogTGlrZXdpc2UuCi0JKGJmZHN1bW0udGV4aSk6IE5ldyB0YXJnZXQuCi0JKENMRUFORklMRVMpOiBBZGQgYmZkc3VtbS50ZXhpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZSwgZnJvbSBvbGQgYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9JTklUX0FVVE9NQUtFIGFuZCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUKLQlzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UKLQlBQ19DT05GSUdfSEVBREVSIHdpdGggQU1fQ09ORklHX0hFQURFUi4gIENhbGwgQUNfUFJPR19ZQUNDLAotCUFDX1BST0dfTEVYLCBhbmQgQUNfREVDTF9ZWVRFWFQuICBDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwKLQlBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIERvbid0IGNhbGwgQ1lfQ1lHV0lOMzIgb3IgQ1lfRVhFRVhULgotCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBITERGTEFHUywgSExERU5WLCBvciBSUEFUSF9FTlZWQVIuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGxkdmVyLmMgKGxkX3Byb2dyYW1fdmVyc2lvbik6IFNldCBsZF9wcm9ncmFtX3ZlcnNpb24gZnJvbQotCVZFUlNJT04uCi0JKiBsZGdyYW0ueSwgbGRsZXgubDogUmVwbGFjZSBWRVJTSU9OIHdpdGggVkVSU0lPTksuCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLU1vbiBKdWwgMjggMTk6MDQ6NTAgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogVXNlIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3JvIHRvIGxvb2sgZm9yCi0gICAgICAgIHdpbjMyIGRlcGVuZGVuY2llcy4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xMi4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogQWRkICQoRVhFRVhUKSB0byBleGVjdXRhYmxlLgotCi1UdWUgSnVsIDIyIDE4OjUwOjM4IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogZW11bHBhcmFtcy9pMzg2Z28zMi5zaCAoT1VUUFVUX0ZPUk1BVCk6IFNldCB0byAiY29mZi1nbzMyIi4KLQkoU0VHTUVOVF9TSVpFKTogU2V0IHRvIDB4MjAwLgotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IFJld3JpdGUuCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKik6IE5ldyB0YXJnZXQuCi0KLU1vbiBKdWwgIDcgMTI6Mzk6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBNYW5mcmVkIEhvbGxzdGVpbiA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT46Ci0JKiBjb25maWd1cmUuaG9zdCAoaVszNDU2XTg2LSotbGludXgqbGliYzEqKTogUmVuYW1lZCBmcm9tCi0JaVszNDU2XTg2LSotbGludXgqLgotCShpWzM0NTZdODYtKi1saW51eCopOiBOZXcgaG9zdC4KLQotVGh1IEp1biAyNiAxMzo1NDowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBQdXQgLnJzcmMgYWZ0ZXIgLnJlbG9jLiAgUHV0IGlucHV0IC5yc3JjCi0Jc2VjdGlvbnMgaW4gdGhlIG91dHB1dCAucnNyYyBzZWN0aW9uLgotCi1XZWQgSnVuIDI1IDEyOjQ4OjQxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki0qLWxpbnV4KmxpYmMxKik6IFJlbmFtZWQgZnJvbQotCWBtNjgqLSotbGludXgqJy4KLQkobTY4Ki0qLWxpbnV4Kik6IE5ldyBjb25maWd1cmF0aW9uIGZvciB1c2Ugd2l0aCBHTlUgbGliYyAyLgotCi1Nb24gSnVuIDE2IDE5OjE4OjIxIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQ29ycmVjdCAucmVsYS5zZGF0YSBlbnRyaWVzLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFB1dCB0aGUgUExUIGJldHdlZW4gdGhlIHNtYWxsIGFuZCBsYXJnZQotCUJTUyBzZWdtZW50cy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFRFWFRfU1RBUlRfQUREUik6IFRoZSBBQkkgc2F5cyBgQQotCXByb2dyYW0gYmFzZSBvZiAweDAyMDAwMDAwIGlzIHJlY29tbWVuZGVkLi4uJyBiZWNhdXNlIG90aGVyd2lzZQotCXNoYXJlZCBsaWJyYXJpZXMgYXJlIGxlc3MgZWZmaWNpZW50LiAgV2UgdXNlIDB4MDE4MDAwMDAgYmVjYXVzZQotCW90aGVyd2lzZSBpdCdzIGltcG9zc2libGUgdG8gYnJhbmNoIHRvIGxvY2F0aW9uIDAsIGZvciBpbnN0YW5jZSBpZgotCXlvdSBoYXZlIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQotTW9uIEp1biAxNiAxMjo0OTozNiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBsZGxhbmcuYyAobGFuZ19wbGFjZV91bmRlZmluZWRzKTogQWRkIFxuIGluIGVpbmZvIGNhbGwuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogbGRsZXgubDogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9taXBzZWNvZmYuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOgotCUxpa2V3aXNlLgotCShjaGVja19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8kJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCUxpa2V3aXNlLgotCSogbXB3LWVwcGNtYWMuYyAoZ2xkcHBjbWFjb3NfcmVhZF9maWxlKTogTGlrZXdpc2UuCi0JKiBtcHctaWR0bWlwcy5jIChnbGRtaXBzaWR0X2FmdGVyX29wZW4pOiBMaWtld2lzZS4KLQkoY2hlY2tfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX21vZGUpOiBSZW1vdmUgdW51c2VkIGVpbmZvIGFyZ3VtZW50LgotCi1GcmkgSnVuICA2IDIzOjQ3OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IEFkZCB6ZXJvZXMgYWZ0ZXIgLmlkYXRhJDMgdG8gbWFyayB0aGUgZW5kIG9mCi0JdGhlIGltcG9ydCBsaXN0LgotCi1UaHUgTWF5IDI5IDEzOjEzOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogRG9uJ3QKLQljcmFzaCBpZiBhbiBvdXRwdXQgc2VjdGlvbiBoYXMgbm8gQkZEIHNlY3Rpb24uCi0KLUZyaSBNYXkgMjMgMTU6MjM6MjUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zKTogQWRkIGVudHJ5IGZvciB0aGUgbmV3ICJ0YXNrLWxpbmsiIG9wdGlvbi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSB0aGUgInRhc2stbGluayIgb3B0aW9uLgotCShPUFRJT05fVEFTS19MSU5LKTogQWRkIGRlZmluZS4KLQotV2VkIE1heSAyMSAxNzo0NDoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQ29ycmVjdCBjaGVjayBvZiBmY2xvc2UgcmV0dXJuIHZhbHVlIHdoZW4KLQloYW5kbGluZyAtLWZvcmNlLWV4ZS1zdWZmaXguCi0KLVRodSBNYXkgMTUgMTE6MzU6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiBBZGQgdGVzdCBvZiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlCi0JY2FsbCB0byBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSgpLgotCi1Nb24gTWF5IDEyIDIzOjIyOjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogUmVtb3ZlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBTZXQgRU5UUlkgYmFzZWQgb24gdGFyZ2V0LiAgUGVybWl0Ci0JVEVYVF9EWU5BTUlDIHRvIGNvbnRyb2wgLmR5bmFtaWMgc2VnbWVudC4gIFBlcm1pdAotCVNITElCX1RFWFRfU1RBUlRfQUREUiB0byBzZXQgc3RhcnQgb2Ygc2hhcmVkIG9iamVjdC4gIFN1cHBvcnQKLQlJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TLiAgUHV0IC5zdHViIGluIC50ZXh0LiAgT25seSBwdXQKLQkuZ251LmxpbmtvbmNlLnQqIGluIC50ZXh0IHdoZW4gcmVsb2NhdGluZy4gIFN1cHBvcnQKLQlPVEhFUl9URVhUX1NFQ1RJT05TLiAgU3VwcG9ydCBTSExJQl9EQVRBX0FERFIgYXMgd2VsbCBhcwotCURBVEFfQUREUi4gIFN1cHBvcnQgT1RIRVJfR09UX1NZTUJPTFMgYW5kIE9USEVSX0dPVF9TRUNUSU9OUy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCAoU0NSSVBUX05BTUUpOiBTZXQgdG8gZWxmLgotCShEQVRBX0FERFIpOiBEb24ndCBzZXQuCi0JKElOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMpOiBSZW5hbWUgZnJvbSBPVEhFUl9SRUFET05MWV9TRUNUSU9OUy4KLQkoT1RIRVJfVEVYVF9TRUNUSU9OUyk6IFNldC4KLQkoT1RIRVJfR09UX1NFQ1RJT05TKTogUmVuYW1lIGZyb20gT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TLgotCShNQUNISU5FKTogU2V0IHRvIGVtcHR5IHN0cmluZy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWJtaXAuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoOiBMaWtld2lzZS4gIEFsc286Ci0JKFRFWFRfRFlOQU1JQyk6IFNldC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwcy5zaDogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMyYm1pcHMuYyk6IERlcGVuZCB1cG9uIGVsZi5zYyByYXRoZXIgdGhhbgotCWVsZm1pcHMuc2MuCi0JKGVlbGYzMmVibWlwcy5jLCBlZWxmMzJlbG1pcHMuYywgZWVsZjMybG1pcC5jKTogTGlrZXdpc2UuCi0KLU1vbiBNYXkgMTIgMTE6MTE6MDYgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3QgYWxpZ24gdGhlIGRhdGEgc2VnbWVudCBvbiB0aGUgbmV4dCA4Ci0JYnl0ZSBib3VuZGFyeSwgaW5zdGVhZCBsZXQgdGhlIGxpbmtlciB1c2Ugd2hhdGV2ZXIgdGhlIGluZGl2aWR1YWwKLQlzZWN0aW9ucyByZXF1aXJlLgotCi1GcmkgTWF5ICA5IDE3OjQ1OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotZ251Kik6IERvbid0IGluY2x1ZGUgTWFjaCBzdXBwb3J0LgotCi1UdWUgTWF5ICA2IDEzOjIxOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gU2VhbiBNY05laWwgPHNlYW5AbWNuZWlsLmNvbT46Ci0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfYnlfZmlsZV9uYW1lKTogU29ydCBieSBhcmNoaXZlIG5hbWUKLQlmaXJzdC4KLQkoc29ydF9zZWN0aW9ucyk6IFNvcnQgYWxsIHNlY3Rpb25zLCBub3QganVzdCBzZWN0aW9ucyBpbiB0aGUgc2FtZQotCWFyY2hpdmUuCi0KLU1vbiBNYXkgIDUgMTg6MTk6NTUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8cGpiMjdAY2FtLmFjLnVrPgotCi0JKiBjb25maWd1cmUudGd0LCBjb25maWd1cmUuaG9zdDogY29wZSB3aXRoICcqLSotbGludXgtZ251YW91dCcKLQl0YXJnZXRzLgotCi1GcmkgTWF5ICAyIDE1OjU0OjI4IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgKC50ZXh0KTogQWRkIGEgbGVhZGluZyB1bmRlcnNjb3JlIHRvCi0JX197RCxDfVRPUl97TElTVCxFTkR9X18gZGVmaW5hdGlvbnMuICBSZWFycmFuZ2UgdGhlIG9yZGVyIG9mIGl0ZW1zCi0JaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBNb3ZlIC5jb25zdCwgLmN0b3JzLCAuZHRvcnMgaW50byBzZXBhcmF0ZQotCXNlY3Rpb25zLgotCi1XZWQgQXByIDMwIDEyOjIzOjIxIDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyAoX18uaW5pdHAuZW5kLCBfZXRleHQpOiBBZGRlZCB3aGl0ZXNwYWNlCi0JYXJvdW5kIGFzc2lnbm1lbnQgb2YgY3VycmVudCBsb2NhdGlvbiBwb2ludGVyLgotCi1UaHUgQXByIDE3IDEzOjA3OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogTWFrZSBzdXJlIHRoZSBzZXQgaXMgYWxpZ25lZAotCWFwcHJvcHJpYXRlbHkuCi0KLVR1ZSBBcHIgMTUgMTM6MTk6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gbGQubmV3IGFuZCBpbnN0YWxsZGlycy4gIFVzZQotCSQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkgZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nCi0JJChJTlNUQUxMX1hGT1JNKSBhbmQgJChJTlNUQUxMX1hGT1JNMSkuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbC1pbmZvKTogUnVuIG1raW5zdGFsbGRpcnMuCi0KLU1vbiBBcHIgMTQgMTI6MDY6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCi0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByICA0IDExOjQyOjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKHNvcnRfc2VjdGlvbnNfMSk6IFVzZSB4bWFsbG9jIHJhdGhlciB0aGFuIGFsbG9jYS4KLQotCSogbGRsZXgubDogUmVjb2duaXplIFNRVUFELgotCSogbGRncmFtLnkgKGxlbmd0aCk6IEFkZCBTUVVBRC4KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IFVzZSBTUVVBRCBmb3IgYSBzaWduZWQgOCBieXRlCi0JcmVsb2MuCi0JKiBsZGxhbmcuYyAocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBIYW5kbGUgU1FVQUQuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucywgbGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQWRkIFNRVUFEIHRvIHRhYmxlLgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSGFuZGxlIFNRVUFELgotCSogbGQudGV4aW5mbyAoU2VjdGlvbiBEYXRhIEV4cHJlc3Npb25zKTogRG9jdW1lbnQgU1FVQUQuCi0KLVRodSBBcHIgIDMgMTM6MTk6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZHZlci5jIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBTZXQgdG8gMi44LjEuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotV2VkIEFwciAgMiAxMTo1NToyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1wdy1pZHRtaXBzLmM6IFJlbmFtZSBmcm9tIG1wdy1lbWlwc2lkdC5jLgotCSogbXB3LWVsZm1pcHMuYzogUmVuYW1lIGZyb20gbXB3LWVtaXBzZWxmLmMuCi0JKiBtcHctY29uZmlnLmluOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIGxhbmdfY2hlY2sgaW1tZWRpYXRlbHkgYWZ0ZXIKLQlvcGVuaW5nIHRoZSBpbnB1dCBmaWxlcywgcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgbGluay4KLQotTW9uIE1hciAzMSAyMzo0NDowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoaW5pdCk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXIuCi0JKHNldF9wZV9zdGFja19oZWFwKTogUmVtb3ZlIGxvY2FscyBiZWdpbl9jb21taXQgYW5kIGVuZC4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBSZW1vdmUgdW51c2VkIGxvY2FsIGkuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcHRyLgotCi1Nb24gTWFyIDMxIDE2OjM1OjUxIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLnRndCAoaHBwYSotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KLQotRnJpIE1hciAyOCAxNToyOToyMyAxOTk3ICBILkouIEx1IDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQlDb250cmlidXRlZCBieSBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGNhaXAucnV0Z2Vycy5lZHU+OgotCSogY29uZmlndXJlLnRndCAoc3BhcmMqLSotbGludXhhb3V0Kik6IE5ldyB0YXJnZXQuCi0JKHNwYXJjKi0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL3NwYXJjbGludXguc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVzcGFyY2xpbnV4Lm8uCi0JKGVzcGFyY2xpbnV4LmMpOiBOZXcgdGFyZ2V0LgotCi1GcmkgTWFyIDI4IDE0OjMwOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1PjoKLQkqIGNvbmZpZ3VyZS50Z3Q6IFNldCB0YXJnX2V4dHJhX2VtdWxzIGZvciBtaXBzKmVsLSotbGludXgqIGFuZAotCW1pcHMqLSotbGludXgqLiAgVXNlIGVsZjMyYm1pcCBhbmQgZWxmMzJsbWlwLCBub3QgZWxmMzJlYm1pcCBhbmQKLQllbGYzMmVsbWlwLgotCi1UaHUgTWFyIDI3IDE3OjE0OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUgaW4gdmVyc2lvbgotCW1lc3NhZ2UuCi0KLUZyaSBNYXIgMjEgMTI6Mjg6NDEgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogZW11bHBhcmFtcy9kZWx0YTY4LnNoIChPVVRQVVRfRk9STUFUKTogU2V0IHRvICJjb2ZmLW02OGstc3lzdiIuCi0KLVR1ZSBNYXIgMTggMTE6MTY6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVtdWx0ZW1wbC9haXguZW06IEluY2x1ZGUgIm9ic3RhY2suaCIuCi0KLU1vbiBNYXIgMTcgMTk6MjY6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYzogSW5jbHVkZSAib2JzdGFjay5oIi4KLQotU2F0IE1hciAxNSAyMzoyMzo0NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWJlb3MqKTogVXNlIGFpeHBwYyBmb3IgdGFyZ19lbXVsLgotCi1TYXQgTWFyIDE1IDE4OjEwOjM4IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBsZGVtdWwuaCAobGRlbXVsX2xpc3RfZW11bGF0aW9ucyk6IFVzZSBmdWxsIHByb3RvdHlwZS4KLQkqIGxkbGFuZy5jIChwcmludF9vbmVfc3ltYm9sKTogQWRkIGRlY2xhcmF0aW9uLgotCSogbGRsYW5nLmggKGRwcmludF9zdGF0ZW1lbnRzKTogRGVjbGFyZS4KLQkqIGxkbWFpbi5jIChyZW1vdmVfb3V0cHV0KTogRGVjbGFyZS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBEZWNsYXJlLgotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogRGVjbGFyZS4KLQkoc3BsaXRfc2VjdGlvbnMpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUuCi0JKiBtcmkuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoc3RyZHVwKTogRG9uJ3QgZGVjbGFyZS4KLQkobXJpX2FsaWFzKTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCi1GcmkgTWFyIDE0IDIxOjMwOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogQ2hhbmdlIGhhbmRsaW5nIG9mIGRhdGEgYXJlYSB3aGVuCi0JZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5IHRvIG5vdCBza2lwIGEgbGFyZ2UgYmxvY2sgb2YgbWVtb3J5LgotCUZyb20gUGVyIEZvZ2Vsc3Ryb20gPHBlZm9AY3ZzLm9wZW5ic2Qub3JnPi4KLQotV2VkIE1hciAxMiAyMTozMzowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9kZWZpbml0aW9uKTogT25seSBza2lwIHRoZSB3YXJuaW5nIGlmIHRoZQotCW91dHB1dCBzZWN0aW9uIGlzIGFic29sdXRlIHdoZW4gdGhlIGlucHV0IHNlY3Rpb24gaXMgbm90Ci0JYWJzb2x1dGUuCi0KLQkqIGxkbGV4Lmw6IEFjY2VwdCB3aGl0ZXNwYWNlIGluIFZFUlNfU1RBUlQgc3RhdGUuICBXYXJuIGFib3V0Ci0JaW52YWxpZCBjaGFyYWN0ZXJzIGluIFZFUlNfKiBzdGF0ZXMuCi0KLVR1ZSBNYXIgMTEgMTM6NTE6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBEb24ndCBsZXQgYQotCXRyYWlsaW5nIHNwYWNlIGxlYWQgdXMgdG8gdGhpbmsgdGhhdCB0aGVyZSBpcyBhIHplcm8gYWRkcmVzcy4KLQotU3VuIE1hciAgOSAyMzowNjozNSAxOTk3ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgotCi0JKiBsZGdyYW0ueSAodmVyc19ub2RlKTogQ29ycmVjdCB0eXBvIG9mICcoJyAgZm9yICd7Jy4KLQotRnJpIE1hciAgNyAxODo0MDoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjIChFTlRSWSk6IEVudHJ5IHN5bWJvbCBpcyBfX3N0YXJ0Ci0JcmF0aGVyIHRoYW4gX3N0YXJ0LgotCShfX2VkYXRhKTogRGVmaW5lIHRoaXMgcmF0aGVyIHRoYW4gImVkYXRhIi4KLQkoX19lbmQpOiBEZWZpbmUgdGhpcyByYXRoZXIgdGhhbiAiZW5kIi4KLQotVHVlIE1hciAgNCAxNzoxODozNSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGljODAtKi0qKTogQWxsb3cgZHJvcHBpbmcgb2YgLWNvZmYuCi0KLVN1biBNYXIgIDIgMjI6NTk6NDkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsZC5kdmkpOiBTZXQgTUFLRUlORk8gZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgd2VsbAotCWFzIFRFWElOUFVUUy4gIE5lZWRlZCBmb3IgYnVpbGRpbmcgaW4gc2VwYXJhdGUgYnVpbGQgZGlyLgotCSogbGRpbnQudGV4aW5mbyAoU0NSSVBUX05BTUUpOiBGaXggdHlwby4KLQkqIGVtdWxwYXJhbXMvdGljODBjb2ZmLnNoOiBSZXdyaXRlIHRvIGluY2x1ZGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbgotCWFib3V0IGVhY2ggc2hlbGwgdmFyaWFibGUgdGhhdCBpcyBzZXQgKG9yIG5vdCBzZXQpLgotCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjOiBDb21wbGV0ZSByZXdyaXRlLgotCi1GcmkgRmViIDI4IDE3OjQyOjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDYWxsIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAobGRtYWluLm8pOiBEZWZpbmUgVEFSR0VUIHdoZW4gY29tcGlsaW5nLgotCi1UaHUgRmViIDI3IDExOjQxOjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBpbml0aWFsaXplIGxpbmtfaW5mby5scHJlZml4IG9yCi0JbGlua19pbmZvLmxwcmVmaXhfbGVuLgotCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfYmVmb3JlX3BhcnNlKTogTGlrZXdpc2UuCi0KLQkqIGVtdWx0ZW1wbC9tODhrYmNzLmVtOiBSZW1vdmUuCi0JKiBlbXVscGFyYW1zL204OGtiY3Muc2ggKFRFTVBMQVRFX05BTUUpOiBEb24ndCBzZXQuCi0JKiBNYWtlZmlsZS5pbiAoZW04OGtiY3MuYyk6IERlcGVuZCB1cG9uIGdlbmVyaWMuZW0gcmF0aGVyIHRoYW4KLQltODhrYmNzLmVtLgotCi0JKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IFBhc3Mgbm9sb2FkX3NlY3Rpb24sIG5vdCBTRUNfTkVWRVJfTE9BRCwKLQl0byBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4gIEZyb20gTWFyayBSYXNpbgotCTxtYXJrLnJhc2luQHRlbHJhZC5jby5pbD4uCi0KLVdlZCBGZWIgMjYgMTE6NTE6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogQ2xlYXIgU0VDX0lTX0NPTU1PTiBmcm9tIGNvbW1vbgotCXNlY3Rpb24uCi0KLVR1ZSBGZWIgMjUgMjA6Mzg6MTEgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoZW1pcHNsbmV3cy5jKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvbWlwc2xuZXdzLnNoOiBOZXcgZmlsZS4KLQotVHVlIEZlYiAyNSAxNjowNDowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoaG9sZF9pbnRlcnApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBQdXQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMKLQlhZnRlciBob2xkX2ludGVycC4gIENob29zZSBhIHVuaXF1ZSBvdXRwdXQgc2VjdGlvbiBuYW1lLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogRG9uJ3Qgc2V0IGhvbGRfdXNlIGlmIHRoZQotCVNFQ19MT0FEIG9yIFNFQ19BTExPQyBmbGFncyBkaWZmZXIuICBTZXQgaG9sZF9pbnRlcnAuCi0KLU1vbiBGZWIgMjQgMTg6MTY6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogbGRsZXgubCAoVl9UQUcsIFZfSURFTlRJRklFUik6IE5ldyBtYWNyb3MuCi0JKFZFUlNfU1RBUlQsIFZFUlNfU0NSSVBULCBWRVJTX05PREUpOiBOZXcgc3RhdGVzIHRvIHBhcnNlIHZlcnNpb24KLQlpbmZvcm1hdGlvbi4KLQkobGRsZXhfdmVyc2lvbl9zY3JpcHQsIGxkbGV4X3ZlcnNpb25fZmlsZSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBsZGxleC5oIChlbnVtIGlucHV0X2VudW0pOiBBZGQgaW5wdXRfdmVyc2lvbl9zY3JpcHQuCi0JKGxkbGV4X3ZlcnNpb25fc2NyaXB0KTogRGVjbGFyZS4KLQkobGRsZXhfdmVyc2lvbl9maWxlKTogRGVjbGFyZS4KLQkqIGxkZ3JhbS55ICgldW5pb24pOiBBZGQgZGVmbGlzdCwgdmVyc3ltcywgYW5kIHZlcnNub2RlLgotCShWRVJTX1RBRywgVkVSU19JREVOVElGSUVSKTogTmV3IHRlcm1pbmFscy4KLQkoR0xPQkFMLCBMT0NBTCwgVkVSU0lPTiwgSU5QVVRfVkVSU0lPTl9TQ1JJUFQpOiBOZXcgdGVybWluYWxzLgotCShmaWxlKTogQWNjZXB0IElOUFVUX1ZFUlNJT05fU0NSSVBULgotCShpZmlsZV9wMSk6IEFjY2VwdCB2ZXJzaW9uLgotCSh2ZXJzaW9uX3NjcmlwdF9maWxlKTogTmV3IG5vbnRlcm1pbmFsLgotCSh2ZXJzaW9uLCB2ZXJzX25vZGVzLCB2ZXJzX25vZGUpOiBMaWtld2lzZS4KLQkodmVyZGVwLCB2ZXJzX3RhZywgdmVyX2RlZm5zKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAobGFuZ19lbGZfdmVyc2lvbl9pbmZvKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkobGFuZ19uZXdfdmVyc19yZWdleCk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19uZXdfdmVyc19ub2RlKTogTmV3IGZ1bmN0aW9uLgotCSh2ZXJzaW9uX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfYWRkX3ZlcnNfZGVwZW5kKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmggKGxhbmdfZWxmX3ZlcnNpb25faW5mbyk6IERlY2xhcmUuCi0JKGxhbmdfbmV3X3ZlcnNfcmVnZXgsIGxhbmdfbmV3X3ZlcnNfbm9kZSk6IERlY2xhcmUuCi0JKGxhbmdfYWRkX3ZlcnNfZGVwZW5kLCBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSk6IERlY2xhcmUuCi0JKiBsZXhzdXAuYyAoT1BUSU9OX1ZFUlNJT05fU0NSSVBUKTogRGVmaW5lLgotCShsZF9vcHRpb25zKTogQWRkICJ2ZXJzaW9uLXNjcmlwdCIuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgT1BUSU9OX1ZFUlNJT05fU0NSSVBULgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBsYW5nX2VsZl92ZXJzaW9uX2luZm8gdG8gc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgLmdudS52ZXJzaW9uIHNlY3Rpb25zLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgc3ltYm9sIHZlcnNpb25pbmcuCi0KLUZyaSBGZWIgMjEgMTc6Mzc6NTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlZDMwdmVsZi5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKGQzMHYtKi0qKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBOZXcgZmlsZS4KLQotRnJpIEZlYiAxNCAxODoyODozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbiBDb21tYW5kcyk6IERvY3VtZW50IHRoZSBJTkNMVURFIGNvbW1hbmQuCi0KLVRodSBGZWIgMTMgMjA6MzE6MzcgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVEX0RFQ0xBUkFUSU9OIG9uIGdldGVudi4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fR0VURU5WKTogTmV3IG1hY3JvLgotCSogc3lzZGVwLmggKGdldGVudik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCi0JKiBsZGVtdWwuYyAobGRfZW11bF9kZWZhdWx0X3RhcmdldCk6IERvIG5vdCBjYXN0IGdldGVudiByZXR1cm4KLQl2YWx1ZS4KLQkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotVHVlIEZlYiAxMSAxNTozNDoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFdoZW4gcmVsb2NhdGluZywgcHV0IC5taXBzMTYuZm4uKiBhbmQKLQkubWlwczE2LmNhbGwuKiBpbiAudGV4dC4KLQotU3VuIEZlYiAgOSAxODowOToxMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy90aWM4MGNvZmYuc2g6IE5ldyAoZHVtbXkpIGZpbGUgZm9yIFRJYzgwLgotCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjOiBOZXcgKGR1bW15KSBmaWxlIGZvciBUSWM4MC4KLQkqIE1ha2VmaWxlLmluIChldGljODBjb2ZmLmMpOiBBZGQgdGFyZ2V0IGFuZCBydWxlIHRvIGJ1aWxkIGl0LgotCSogY29uZmlndXJlLnRndCAodGljODAtKi1jb2ZmKTogU2V0IHRhcmdfZW11bCB0byB0aWM4MGNvZmYuCi0KLUZyaSBKYW4gMzEgMTM6MTY6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTZWFyY2ggZm9yCi0JIi5zbyIgaW4gdGhlIG5hbWUsIG5vdCAiLnNvLiIuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBBY2NlcHQgYSBwbGFpbiAuc28gZmlsZS4KLQotCSogTWFrZWZpbGUuaW4gKGxkLmluZm8pOiBBZGQgLUkkKHNyY2RpcikuICBGcm9tIEFsYW4gTW9kcmEKLQk8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+LgotCi1UaHUgSmFuIDMwIDExOjMxOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFNraXAgdGhlIGRpcmVjdG9yeSBuYW1lIHdoZW4KLQlzZWFyY2hpbmcgZm9yICIuc28uIi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IE1ha2Ugc3VyZSB0aGF0IHRoZSBsaWJyYXJ5IG5hbWUKLQloYXMgYSB2ZXJzaW9uIG51bWJlciwgYW5kIHRoYXQgb25seSB2ZXJzaW9uIG51bWJlcnMgZm9sbG93IC5zby4KLQotV2VkIEphbiAyOSAxODoxNTowMCAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzoKLQkqIHNjcmlwdHRlbXBsL3BwY3BlLnNjOiBhZGQgKiguZ2NjX2V4Y2VwdF90YWJsZSkgdG8gdGhlIHRleHQKLQlzZWN0aW9uIHNvIFdpbjMyIGV4ZWN1dGFibGVzIGFyZSB2YWxpZC4KLQotTW9uIEphbiAyNyAxMjoyODo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IGxpbmtvbmNlIHJlbG9jIHNlY3Rpb24gaW4gb3RoZXIKLSAJYXBwcm9wcmlhdGUgcmVsb2Mgc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBBZGQgbGlua29uY2Ugc3VwcG9ydC4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLUZyaSBKYW4gMjQgMTA6NDQ6MDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvbW4xMDIwMC5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IE1vdmUgdGhlCi0Jc3RhY2sgdXAgdG8gMHg4MDAwMC4KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogTGlrZXdpc2UuCi0KLVR1ZSBKYW4gMjEgMTI6MTE6MTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IFVzZSBQUk9WSURFCi0JdG8gZGVmaW5lIGBfc3RhY2snLgotCi1UaHUgSmFuIDE2IDE3OjA3OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogUmVuYW1lIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIgdG8KLQlhdXhpbGlhcnlfZmlsdGVycywgYW5kIG1ha2UgaXQgY2hhciAqKi4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1mIGJ5IHNldHRpbmcgdXAgYW4gYXJyYXkuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogVXNlCi0JbmV3IG5hbWUgb2YgYXV4aWxpYXJ5X2ZpbHRlcnMuCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb2YgLS1maWx0ZXIgYW5kCi0JLS1hdXhpbGlhcnkuCi0KLVR1ZSBKYW4gMTQgMTU6NDQ6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQ2xhcmlmeSB0aGF0IHRoZSBub3JtYWwgdXNhZ2UgaXMgLVQuCi0JKENvbW1hbmRzKTogTGlrZXdpc2UuCi0KLVRodSBKYW4gIDkgMTE6MjY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBDb3JyZWN0IG1hc2sgdXNlZCBmb3IgLmRhdGEgYWRkcmVzcy4KLQotV2VkIEphbiAgOCAxNToxNDo1OSAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IG1ha2UgZGVmYXVsdCBleGVjdXRhYmxlIGEuZXhlIGluc3RlYWQgb2YKLQlhLm91dAotCi1GcmkgSmFuICAzIDE3OjMzOjM0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE1vdmUgLmdvdCBjbG9zZXIgdG8gLnNkYXRhIGFuZCAuc2JzcyBieQotCXNoaWZ0aW5nIC5wbHQgYmFjay4gIFJ1bW91ciBoYXMgaXQgdGhhdCB0aGUgTmV0QlNEIGxkLnNvIGRlcGVuZHMKLQlvbiAuZHluYW1pYyBiZWluZyBhZnRlciAuZ290LCBzbyB3ZSBsZWF2ZSB0aGF0LgotCi1GcmkgSmFuICAzIDE0OjA0OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGNvbmZpZ2RvYy50ZXhpLgotIAkobWFpbnRhaW5lci1jbGVhbik6IERvIHJlbW92ZSBjb25maWdkb2MudGV4aS4KLQotCSogbGQudGV4aW5mbyAoT3BlcmF0b3JzKTogUmVtb3ZlICdAJyBmcm9tIEBzbWFsbGV4bXBsZSBpbiBjb21tZW50Ci0JdG8gYXZvaWQgY29uZnVzaW5nIHRleGkycm9mZi4KLQotRnJpIEphbiAgMyAxMToyNzowMiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC56ZGF0YSk6IEFkZCAuemNvbW1vbiBzZWN0aW9uLgotCSgudGRhdGEpOiBBZGQgLnRjb21tb24gYW5kIC50Y29tbW9uX2J5dGUgc2VjdGlvbnMuCi0KLVRodSBKYW4gIDIgMTg6MTQ6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKmVsLSotbGludXgqLCBtaXBzKi0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogVXNlIF9fc3RhcnQgYXMgdGhlIGVudHJ5IGFkZHJlc3MgZm9yCi0JbWlwcyotKi1saW51eCouCi0KLVR1ZSBEZWMgMzEgMTQ6NDg6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZmlsdGVyX3NobGliIGFuZCBhdXhpbGlhcnlfZmlsdGVyX3NobGliCi0JZmllbGRzLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLS1hdXhpbGlhcnkvLWYgYW5kCi0JLS1maWx0ZXIvLUYuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIGZpbHRlcl9zaGxpYiBhbmQgYXV4aWxpYXJ5X2ZpbHRlcl9zaGxpYiB0bwotCXNpemVfZHluYW1pY19zZWN0aW9ucy4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0tZmlsdGVyLy1GIGFuZCAtLWF1eGlsaWFyeS8tZi4KLQotTW9uIERlYyAzMCAxMzo1NTo1NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC50ZGF0YSkgQWRkIC50YnNzIGFuZCAudGJ5dGUgc2VjdGlvbnMuCi0KLVdlZCBEZWMgMTggMjI6NTc6MzUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVzZSBOZXdGb2xkZXJSZWN1cnNpdmUgZm9yIGluc3RhbGxhdGlvbi4KLQotRnJpIERlYyAxMyAxNDowODo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE1ha2Ugc3VyZSBfX3tlLGd9cCBzdGFydCByZWxhdGl2ZSB0byB0aGUKLQl7cyx0fWRhdGEgc2VjdGlvbnMuICBEbyBub3QgZW1pdCBhbnkgbGlua2VyIGdlbmVyYXRlZCBzeW1ib2xzIGlmCi0JLXIuICBVc2Uge1RFWFQse1osUyxUfURBVEF9X1NUQVJUX0FERFIgdmFyaWFibGVzIHRvIGluaXRpYWxpemUKLQl3aGVyZSB0aGUgZGlmZmVyZW50IHNlY3Rpb25zIGdvLiAgQ2hhbmdlIHNvbWUgd2hpdGVzcGFjZS4KLQotCSogZW11bHBhcmFtcy92ODUwLnNoICh7VEVYVCx7WixTLFR9REFUQX1fU1RBUlRfQUREUik6IERlZmluZQotCWFwcHJvcHJpYXRlbHkuICBSZW1vdmUgY3J1ZCBub3QgdXNlZCBhbnltb3JlLgotCi1GcmkgRGVjIDEzIDEwOjE5OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVtbjEwMjAwLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLnRndDogSGFuZGxlIG1uMTAyMDAuCi0JKiBlbXVscGFybXMvbW4xMDIwMC5zaDogTmV3IGZpbGUuCi0KLVRodSBEZWMgMTIgMTc6MDQ6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbTogSW5jbHVkZSA8Y3R5cGUuaD4uCi0gCShnbGQ5NjBfc2V0X291dHB1dF9hcmNoKTogR2V0IHRoZSBtYWNoaW5lIHR5cGUgZnJvbSB0aGUgLUEgb3B0aW9uCi0JaWYgdGhlcmUgaXMgb25lLCByYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcgY29yZS4KLQotU2F0IERlYyAgNyAxMDowNzo1MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoOiBIYW5kbGUgbGVhZGluZyB1bmRlcnNjb3Jlcy4KLQotVGh1IERlYyAgNSAxMzo0NTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE9ubHkKLQlzZXQgaG9sZF9yZWwgaWYgU0VDX0FMTE9DIGlzIHNldC4KLQotVHVlIERlYyAgMyAxMToyOToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogU2V0IHRoZSBvdXRwdXRfb2Zmc2V0IGFzIHdlbGwKLQlhcyB0aGUgb3V0cHV0X3NlY3Rpb24gd2hlbiBvbmx5IHJlYWRpbmcgc3ltYm9scyBmcm9tIGEgZmlsZS4KLQotTW9uIERlYyAgMiAxMTo0Mzo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvKi5zaDogTWFrZSBzdXJlIHRoYXQgZWFjaCBzZXQgb2YgcGFyYW1ldGVycyB3aGljaAotCXVzZXMgdGhlIGVsZi5zYyBzY3JpcHQgc2V0cyBNQUNISU5FLgotCi1XZWQgTm92IDI3IDAzOjIyOjA1IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmeyxtaXBzLHBwY30uc2M6IEFkZCB0aGUgcmVtYWluaW5nIERXQVJGIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBMaWtld2lzZS4KLQotVHVlIE5vdiAyNiAxNjo1ODozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLU1vbiBOb3YgMjUgMTI6MTc6NTUgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IEFkZCBjYXNlCi0JZm9yIGJmZF92bWEgdG8gaW5pdCBsb29wLgotCi1Nb24gTm92IDI1IDA5OjU1OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL21uMTAzMDAuc2g6IFJlbW92ZSBib2d1cyAnXycgcHJlZml4IGZvcgotCWVudHJ5IHN5bWJvbCBhbmQgY3Rvci9kdG9yIHN0dWZmLgotCi1GcmkgTm92IDE1IDEzOjAwOjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVtbjEwMzAwLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLnRndDogSGFuZGxlIG1uMTAzMDAuCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaDogTmV3IGZpbGUuCi0KLVR1ZSBOb3YgIDUgMTA6NTc6NTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoUkVBRE9OTFlfU1RBUlRfQUREUik6IENoYW5nZWQgdG8gMHgyMDAwMDA0LgotCShFTUJFRERFRCk6IERlZmluZS4KLQotRnJpIE5vdiAgMSAxMDowMToyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IEFkZCBzZWN0aW9uIG9uIHJlcG9ydGluZyBidWdzLgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogTWFrZSBzdXJlIHRoZSBldGV4dCBhbmQgX19DVE9SX0xJU1RfXwotCXN5bWJvbHMgYXJlIGNvcnJlY3RseSBhbGlnbmVkLgotCi1UaHUgT2N0IDMxIDA5OjI4OjU5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0ZW1wbC92ODUwLnNjICh6ZGF0YSk6IEhhbmRsZSByZXN6ZGF0YSwgcm9temRhdGEgYW5kCi0Jcm9temJzcyB0b28uCi0KLVR1ZSBPY3QgMjkgMTI6MzM6MDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogQ2hhbmdlcyBuZWVkZWQgZm9yIEQxMFYtRVZBIGJvYXJkLgotCVNldCBURVhUX1NUQVJUX0FERFIgdG8gMHgxMDAwMDAwLiBTZXQgUkVBRE9OTFlfU1RBUlRfQUREUiB0bwotCTB4MjAwMDAwMC4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogIEZpeCBjYWxjdWxhdGlvbiBvZiAudGV4dC4gIENoYW5nZQotCS5zdGFjayB0byBzdGFydCBhdCAweDIwMDdmZmUuCi0KLU1vbiBPY3QgMjggMTU6Mzc6MDAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmNsZXQqLSotYW91dCopOiBEZWxldGUsIHVzZSBzcGFyYyotKi1hb3V0Ki4KLQotV2VkIE9jdCAyMyAxNjoxNzoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdGVtcGwvdjg1MC5zYyAoemRhdGEpOiBGaXggdHlwbyAienJvZGF0YSIgLT4gInJvemRhdGEiLgotCi0JKiBzY3JpcHRlbXBsL3Y4NTAuc2MgKHpkYXRhKTogTWFrZSBzdXJlIHRoaXMgc3RheXMKLQlpbiBsby1tZW1vcnkuCi0KLVR1ZSBPY3QgMjIgMTE6MzY6NDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjIChfX2VwKTogUHV0IGl0IGF0IHRoZSBzdGFydAotCW9mIHRoZSB0ZGEgc2VjdGlvbi4KLQotCSogc2NyaXB0ZW1wbC92ODUwLnNjOiBNb3ZlIGFsbCAibm9ybWFsIiBzZWN0aW9ucyBpbnRvCi0JdGhlIGV4dGVybmFsIG1lbW9yeSByZWdpb24gKDB4MTAwMDAwIC0gMHgyMDAwMDApLgotCi1Nb24gT2N0IDIxIDE3OjE2OjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IENsb25lIGZyb20gZWxmLnNjLCBtb3ZlIC50ZXh0IHRvCi0JMHgxMDAwMCwgc28gdGhhdCBpcyBtb3JlIHJvb20gZm9yIGRhdGEuCi0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoVEVYVF9TVEFSVF9BRERSKTogTm93IDB4MTAwMDAwLgotCShSRUFET05MWV9TVEFSVF9BRERSKTogTm93IDB4MC4KLQkoU0NSSVBUX05BTUUpOiBOb3cgZWxmZDEwdi4KLQotCSogTWFrZWZpbGUuaW4gKGVkMTB2ZWxmLmMpOiBEZXBlbmQgb24gZWxmZDEwdi5zYywgbm90IGVsZi5zYy4KLQotRnJpIE9jdCAxOCAyMjoxMjo0OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2gJKFRFWFRfU1RBUlRfQUREUik6IENoYW5nZSBmcm9tIDAgdG8gMHgxMDAuCi0KLUZyaSBPY3QgMTggMTU6NDM6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZWVsZjY0YWxwaGEuby4KLQkoQUxMXzY0X0VNVUxBVElPTlMpOiBOZXcgdmFyaWFibGUuCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCAtLWVuYWJsZS02NC1iaXQtYmZkIG9wdGlvbi4gIElmIGl0IGlzIHNldAotCXdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwsIGluY2x1ZGUgQUxMXzY0X0VNVUxBVElPTlMgaW4KLQlFTVVMQVRJT05fT0ZJTEVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgT2N0IDE4IDEyOjU4OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYyAoX19ncCwgX19lcCk6IERlZmluZS4KLQotVGh1IE9jdCAxNyAxODoxNDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IFRyeSB0byBjb25zaXN0ZW50bHkgdXNlIGEgc2luZ2xlIG9yIGEgZG91YmxlIGRhc2gKLQlmb3IgZWFjaCBvcHRpb24uCi0KLVRodSBPY3QgMTcgMTA6MTc6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoIChFTUJFRERFRCk6IERlZmluZS4KLQotVGh1IE9jdCAxNyAxMDo1Njo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC56ZGF0YSk6IEFkZCB0aGlzIGJlZm9yZSAudGV4dC4KLQkoLnNkYXRhKTogQWxzbyBpbmNsdWRlIC5yb3NkYXRhIGFzIHBhcnQgb2YgdGhlIC5zZGF0YS4KLQkoLnRkYXRhKTogSW5jbHVkZSB0aGlzIGp1c3QgYmVmb3JlIC5zZGF0YS4KLQotCSogZW11bHBhcm1zL3Y4NTAuc2ggKFNDUklQVF9OQU1FKTogVXNlICJ2ODUwIiBub3QgImVsZiIuCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBXcmFwIHNjcmlwdCB3aXRoIGEgImNhdCA8PCBFT0YiLgotCi1XZWQgT2N0IDE2IDIzOjEwOjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTmV3IGxpbmtlciBzY3JpcHQgZm9yIHRoZSBWODUwLgotCSogTWFrZWZpbGUuaW46IFVzZSBpdC4KLQotVGh1IE9jdCAxMCAxNzo1NzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaDogRGVmaW5lIF9ncCBpbiBPVEhFUl9HT1RfU1lNQk9MUywgbm90Ci0JT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TLgotCSogZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoOiBMaWtld2lzZS4KLQotV2VkIE9jdCAgOSAxNDozNjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIHdhcm5fc2VjdGlvbl9hbGlnbiBmaWVsZC4KLQkqIGxleHN1cC5jIChPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOKTogRGVmaW5lLgotCShsZF9vcHRpb25zKTogQWRkIC0td2Fybi1zZWN0aW9uLWFsaWduLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIC0td2Fybi1zZWN0aW9uLWFsaWduLgotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIHdhcm5fc2VjdGlvbl9hbGlnbiwgd2FybiBpZgotCXRoZSBzdGFydCBvZiBhIHNlY3Rpb24gY2hhbmdlcyBkdWUgdG8gYWxpZ25tZW50LgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13YXJuLXNlY3Rpb24tYWxpZ24uCi0JKiBsZC50ZXhpbmZvOiBDaGFuZ2Ugc29tZSBzaW5nbGUgZGFzaGVzIHRvIGRvdWJsZSBkYXNoZXMuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3N1YnN5c3RlbSk6IFJlY29yZCBlbnRyeSBzeW1ib2wgZm9yIGVhY2gKLQlzdWJzeXN0ZW0gdHlwZS4gIElmZGVmIG91dCBvczIgdHlwZS4gIFJlY29nbml6ZSBhIHZlcnNpb24gbnVtYmVyLgotCi1UdWUgT2N0ICA4IDEyOjA3OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzZXRfcGVfc3Vic3lzdGVtKTogV2hlbiBzZXR0aW5nIHRoZSBzdWJzeXN0ZW0KLQl0byB3aW5kb3dzLCBzZXQgdGhlIGVudHJ5IHBvaW50LgotCi0JKiBNYWtlZmlsZS5pbiAobGRsZXguYyk6IERvbid0IHBhc3MgYW55IG9wdGlvbnMgdG8gJChMRVgpLgotCi1Nb24gT2N0ICA3IDE3OjI5OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IE1lbnRpb24gLnNvIGV4dGVuc2lvbnMgZm9yIHNoYXJlZAotCWxpYnJhcmllcy4KLQotU3VuIE9jdCAgNiAyMjozNTozNiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnssbWlwcyxwcGN9LnNjOiBBZGQgRFdBUkYgMiBzZWN0aW9ucy4KLQotRnJpIE9jdCAgNCAxODo0OTozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBPbmx5IHNldCB0aGUgYWRkcmVzcyBvZiAudGV4dCBpZgotCVJFTE9DQVRJTkcuCi0KLUZyaSBPY3QgIDQgMTA6NTk6NTIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggKHtCSUcsTElUVExFfV9PVVRQVVRfRk9STUFUKTogRGVmaW5lLgotCSogc2NyaXB0dGVtcGwvYW91dC5zYyAoe0JJRyxMSVRUTEV9X09VVFBVVF9GT1JNQVQpOiBQcm92aWRlIGRlZmF1bHQuCi0JKE9VVFBVVF9GT1JNQVQpOiBTdXBwb3J0IGJpLWVuZGlhbiB0YXJnZXRzLgotCi1UaHUgT2N0ICAzIDEzOjUyOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5oLCBmbm1hdGNoLmM6IFJlbW92ZSAobm93IGluIGxpYmliZXJ0eSkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IFJlbW92ZSBmbm1hdGNoLmMuCi0JKEhGSUxFUyk6IFJlbW92ZSBmbm1hdGNoLmguCi0JKE9GSUxFUyk6IFJlbW92ZSBmbm1hdGNoLm8uCi0KLVRodSBPY3QgIDMgMTU6NDE6MjQgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogTW92ZSBjb25maWcubG9nIHRvIGRpc3RjbGVhbi4KLQotV2VkIE9jdCAgMiAyMzo0NToyNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHRtcGwvcGUuZW06IGluY3JlYXNlIHNpemUgb2Ygc3RhY2sgcmVzZXJ2ZSB0byAweDIwMDAwMDAKLSAgICAgICAgKG5lY2Vzc2FyeSBpbiBvcmRlciB0byBjb21waWxlIHBhcnNlLmMgaW4gZ2NjIHNvdXJjZXMgdW5kZXIgTlQpCi0KLVdlZCBPY3QgIDIgMTQ6NDk6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IEZpeCB0eXBvIGluIC0tcnBhdGgtbGluayBkZXNjcmlwdGlvbi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFN1Z2dlc3QKLQktLXJwYXRoIGlmIGEgbmVlZGVkIGxpYnJhcnkgaXMgbm90IGZvdW5kLgotCi1UdWUgT2N0ICAxIDE2OjE3OjMzIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcyotKi1lbGYqLgotCi1UdWUgT2N0ICAxIDE1OjUwOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IEdpdmUgbW9yZSBkZXRhaWwgb24gLWwgb3B0aW9uLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBIYW5kbGUgQ1JFQVRFX1NITElCIHRoZSBzYW1lIHdheSB0aGF0Ci0JZWxmLnNjIGRvZXMsIHNvIHRoYXQgZ2xpYmMgd29ya3MgYmV0dGVyLgotCi0JKiBsZHZlci5jIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBOZXcgdmFyaWFibGUuCi0JKGxkdmVyc2lvbik6IFVzZSBpdC4KLQkqIGxkdmVyLmggKGxkX3Byb2dyYW1fdmVyc2lvbik6IERlY2xhcmUuCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IEhhbmRsZSAtLWRsbC12ZXJib3NlIGxpa2UgLS12ZXJib3NlLCBub3QKLQktLXZlcnNpb24uICBDaGFuZ2UgLS12ZXJzaW9uIGhhbmRsaW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VCi0Jc3RhbmRhcmRzLgotCShoZWxwKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCi1Nb24gU2VwIDMwIDEyOjE0OjQzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlbTMycmVsZi5jKTogQWRkIHJ1bGUgZm9yLgotCSogY29uZmlndXJlLnRndCAobTMyci0qLSopOiBSZWNvZ25pemUuCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2g6IE5ldyBmaWxlLgotCi1UaHUgU2VwIDI2IDEzOjU4OjQ3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgc3ltYm9saWMgZG91YmxlcXVvdGluZyB0byBsZG1haW4gY29tcGlsZSBlZGl0LgotCSogbXB3LWNvbmZpZy5pbjogQWRkIG1pcHMtKi0qIGNhc2UgYXMgbWlwcy1lbGYsIGFuZCB1c2UgbW9yZQotCXdpbGRjYXJkcyBpbiBtYXRjaGluZy4KLQkqIG1wdy1lbWlwc2VsZi5jOiBOZXcgZmlsZSwgcHJlZ2VuZXJhdGVkIG1pcHMgZWxmIGVtdWxhdGlvbi4KLQotVHVlIFNlcCAxNyAxMjoxODoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkaW50LnRleGluZm86IFJld3JvdGUuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBjYXNlcyBmb3IgTUlQUyA1MDAwIGxpa2UgTUlQUyA0MzAwLgotCi1Nb24gU2VwIDE2IDE3OjU1OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogT25seSBkZWZpbmUgc3ltYm9scyBpZiBSRUxPQ0FUSU5HLiAgRml4Ci0Jc3ludGF4IGVycm9yIG9uIF9fZW5kX18gbGluZS4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogRm9yIC1OIG9yIC1uLCBkb24ndCBhbGlnbiAuZGF0YS4gIEZyb20KLSAJQ2hyaXMgSGFkbGV5IDxDaHJpc3RvcGhlci5IYWRsZXlAY2wuY2FtLmFjLnVrPgotCi1TdW4gU2VwIDE1IDIyOjA5OjU2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL3Y4NTAuc2g6IEZpeCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TLgotCi1TdW4gU2VwIDE1IDEwOjM4OjE2IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcm1zL2QxMHYuc2g6IFNldCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TIHRvIHB1dAotCXN0YWNrIGF0IHRvcCBvZiBzaW11bGF0b3IgbWVtb3J5LgotCi1GcmkgU2VwIDEzIDE1OjQ5OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubCAoU1lNQk9MQ0hBUk4pOiBBZGQgJCwgXywgYW5kIH4uCi0KLVdlZCBTZXAgMTEgMjM6MzA6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IENoZWNrIGZvciAtbWlwczQgbGlrZSAtbWlwczEsIGV0LiBhbC4KLQotVGh1IFNlcCAgNSAxNToyNDoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogQWNjZXB0IGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnQKLQlhcyB0aGUgUFRSIGFyZ3VtZW50LiAgSWYgdGhlIGZpbGUgaXMgc3ltYm9scyBvbmx5LCBkaXNjYXJkIGFsbAotCWlucHV0IHNlY3Rpb25zLgotCShsZGxhbmdfYWRkX2ZpbGUpOiBQYXNzIGVudHJ5IHRvIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KLQotV2VkIFNlcCAgNCAxNTo1Mzo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGFscGhhLSotZ251Kik6IE5ldyB0YXJnZXQuICBGcm9tIEZpbGEgS29sb2RueQotCTxmaWxhQGliaS5jb20+LgotCi1UdWUgU2VwICAzIDAwOjUyOjU0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL3Y4NTAuc2g6IFNldCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TCi0KLVN1biBTZXAgIDEgMjE6NDg6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvdjg1MC5zaDogU2V0IEVNQkVEREVELgotCi1GcmkgQXVnIDMwIDIyOjMwOjMwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL3Y4NTAuc2g6IEVudHJ5IHN5bWJvbCBpcyAiX3N0YXJ0IiwgdHdlYWsKLQljdG9yL2R0b3Igc3VwcG9ydC4KLQotRnJpIEF1ZyAzMCAxODozMjozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNoLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL3NoZWxmLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvc2hsZWxmLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlc2hlbGYubyBhbmQgZXNobGVsZi5vLgotCShlc2hlbGYuYywgZXNobGVsZi5jKTogTmV3IHRhcmdldHMuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IElmIEVNQkVEREVEIGlzIGRlZmluZWQsIHRoZW4gZG9uJ3QgYWRkCi0JU0laRU9GX0hFQURFUlMgdG8gVEVYVF9TVEFSVF9BRERSLiAgRXhwYW5kIENUT1JfU1RBUlQgYW5kIENUT1JfRU5ECi0JYXJvdW5kIC5jdG9ycywgYW5kIERUT1JfU1RBUlQgYW5kIERUT1JfRU5EIGFyb3VuZCAuZHRvcnMuICBFeHBhbmQKLQlPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TIGlmIFJFTE9DQVRJTkcuCi0KLVRodSBBdWcgMjkgMTY6NTc6NDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUue2hvc3QsdGd0fSAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0KLQlwcm8uCi0KLU1vbiBBdWcgMjYgMTI6NTg6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoc2VjdGlvbik6IEFkZCBvcHRfbm9jcm9zc3JlZnM7IHBhc3MgdmFsdWUgdG8KLQlsYW5nX2VudGVyX292ZXJsYXkuCi0JKG9wdF9ub2Nyb3NzcmVmcyk6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBOT0NST1NTUkVGUyBrZXl3b3JkIGluIEVYUFJFU1NJT04gbW9kZS4KLQkqIGxkbGFuZy5jIChvdmVybGF5X25vY3Jvc3NyZWZzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19lbnRlcl9vdmVybGF5KTogQWRkIG5vY3Jvc3NyZWZzIHBhcmFtZXRlci4KLQkobGFuZ19sZWF2ZV9vdmVybGF5KTogT25seSBhZGQgbm9jcm9zc3JlZnMgaWYgb3ZlcmxheV9ub2Nyb3NzcmVmcwotCWlzIHNldC4gIEluaXRpYWxpemUgb3ZlcmxheV9ub2Nyb3NzcmVmcy4KLQkqIGxkbGFuZy5oIChsYW5nX2VudGVyX292ZXJsYXkpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsZC50ZXhpbmZvIChPdmVybGF5cyk6IFVwZGF0ZSBkb2N1bWVudGF0aW9uLgotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBQcmludCBHTlUgbGQgaW4gdGhlIHZlcnNpb24gbWVzc2FnZS4KLQotVGh1IEF1ZyAyMiAxNzoxMDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERU5WLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuCi0JKCQoTERfUFJPRykpOiBVc2UgJChITERFTlYpLgotCi1UaHUgQXVnIDIyIDE2OjI5OjI4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGV2ODUwLmMpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLnRndCAodjg1MC0qLSopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy92ODUwLnNoOiBOZXcgZmlsZS4KLQotVGh1IEF1ZyAyMiAxMToxNjowMiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIEBEQVNIX0NfRkxBR0AgdG8gY29tcGlsZXIgZWRpdC4KLQotV2VkIEF1ZyAyMSAxMToyNjozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IC5nbnUubGlua29uY2UqIHNlY3Rpb25zIGluIGFwcHJvcHJpYXRlCi0JY29udGFpbmluZyBzZWN0aW9ucy4KLQotTW9uIEF1ZyAxOSAxMzowMTo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guYzogSW5jbHVkZSBzeXNkZXAuaC4KLQotTW9uIEF1ZyAxOSAxMToyODoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGdlbnNjcmlwdHMuc2g6IFVuZG8gOC8xNiBjaGFuZ2UuCi0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoTUFDSElORSk6IEV4cGxpY2l0bHkgc2V0IHRvIG5vdGhpbmcuCi0KLUZyaSBBdWcgMTYgMTk6MTg6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBnZW5zY3JpcHRzLnNoOiBFeHBsaWNpdGx5IHJlc2V0IGFueSBzaGVsbCB2YXJpYWJsZXMgc2V0IG9yIHVzZWQKLQlieSB0aGUgdmFyaW91cyAuc2Mgc2NyaXB0cyB0byBhbGxvdyBpbmFkdmVydGFudCB1c2Ugb2YgdGhlc2UKLQluYW1lcyBhcyBub3JtYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJ5IHRoZSBwZXJzb24gcnVubmluZwotCWNvbmZpZ3VyZS4KLQotCSogTWFrZWZpbGUuaW4gKGVkMTB2ZWxmLmMpOiBVc2UgdGRpcl9kMTB2LCBub3QgdGRpcl9hcmNlbGYuCi0KLUZyaSBBdWcgMTYgMTQ6MTU6NDEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjIChfX2Jzc19zdGFydF9fLCBfX2Jzc19lbmRfXywKLSAJX19kYXRhX3N0YXJ0X18sIF9fZGF0YV9lbmRfXyk6IEFkZGVkIHRvIGtlZXAgaW4gc3luYy4gd2l0aCB0aGUKLSAJZGVmYXVsdCBBUk0gY3J0MC5zLiBBZGRlZCBfX0NUT1JfTElTVF9fIGFuZCBfX0RUT1JfTElTVF9fIHN1cHBvcnQuCi0KLVRodSBBdWcgIDggMTQ6MjQ6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGNyZWYuYyAoY2hlY2tfcmVsb2NfcmVmcyk6IElmIGluZm8tPnNhbWUsIGxvb2sgZm9yIGFueSBzeW1ib2wKLQlkZWZpbmVkIGluIGluZm8tPmRlZnNlYywgbm90IGp1c3QgdGhlIHNlY3Rpb24gc3ltYm9sLgotCi1XZWQgQXVnICA3IDE0OjQwOjQ4IDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfTkVFRF9ERUNMQVJBVElPTiBvbiBzdHJzdHIgYW5kIHNicmsuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9TQlJLKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaCAoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KLQkqIGxkbWFpbi5jIChzYnJrKTogRGVjbGFyZSBpZiBIQVZFX1NCUksgYW5kCi0JTkVFRF9ERUNMQVJBVElPTl9TQlJLLgotCi0JKiBsZGxhbmcuYyAobGFuZ19yZWNvcmRfcGhkcnMpOiBDYXN0IHhtYWxsb2MgYW5kIHhyZWFsbG9jIHJldHVybi4KLQotTW9uIEF1ZyAgNSAxNjoyNjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBPVkVSTEFZLgotCSogbGRncmFtLnk6IEFkZCBzZWN0aW9uX3BoZHIgZmllbGQgdG8gJXVuaW9uLgotCShzZWN0aW9uKTogSGFuZGxlIHBoZHJfb3B0IHJlc3VsdC4gIEFkZCBPVkVSTEFZIGNhc2UuCi0JKG9wdF9leHBfd2l0aG91dF90eXBlKTogTmV3IG5vbnRlcm1pbmFsLgotCShwaGRyX29wdCk6IFJldHVybiBsaXN0IG9mIHBoZHJzLgotCShvdmVybGF5X3NlY3Rpb24pOiBOZXcgbm9udGVybWluYWwuCi0JKiBsZGxhbmcuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQWRkIHBoZHJzIHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGxhbmdfc2VjdGlvbl9pbl9waGRyKTogUmVtb3ZlLgotCShvdmVybGF5X3ZtYSwgb3ZlcmxheV9sbW4sIG92ZXJsYXlfbWF4KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBvdmVybGF5X2xpc3QpOiBEZWZpbmUuCi0JKG92ZXJsYXlfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfZW50ZXJfb3ZlcmxheSwgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb25zLgotCShsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiwgbGFuZ19sZWF2ZV9vdmVybGF5KTogTmV3IGZ1bmN0aW9ucy4KLQkqIGxkbGFuZy5oIChsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFVwZGF0ZQotCWRlY2xhcmF0aW9uIGZvciBuZXcgcGFyYW1ldGVyLgotCShsYW5nX3NlY3Rpb25faW5fcGhkcik6IERvbid0IGRlY2xhcmUuCi0JKGxhbmdfZW50ZXJfb3ZlcmxheSwgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24pOiBEZWNsYXJlLgotCShsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiwgbGFuZ19sZWF2ZV9vdmVybGF5KTogRGVjbGFyZS4KLQkqIGxkLnRleGluZm8gKE92ZXJsYXlzKTogTmV3IG5vZGUgdW5kZXIgU0VDVElPTlMsIGRvY3VtZW50aW5nCi0Jb3ZlcmxheXMuCi0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBNQVggYW5kIE1JTi4KLQkqIGxkZ3JhbS55IChNQVgsIE1JTik6IE5ldyB0ZXJtaW5hbHMuCi0JKGV4cCk6IFJlY29nbml6ZSBNQVggYW5kIE1JTi4KLQkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogSGFuZGxlIE1BWCBhbmQgTUlOLgotCSogbGQudGV4aW5mbyAoQXJpdGhtZXRpYyBGdW5jdGlvbnMpOiBEb2N1bWVudCBNQVggYW5kIE1JTi4KLQotCSogbGQudGV4aW5mbyAoUEhEUlMpOiBVc2UgQGNpbmRleCwgbm90IEBraW5kZXgsIGZvciBwcm9ncmFtIGhlYWRlcgotCWluZGV4IGVudHJpZXMuCi0KLQkqIGxkZ3JhbS55IChTSVpFT0YsIEFERFIpOiBEbyBub3Qgc3BlY2lmeSB0eXBlLgotCi0JKiBsZGNyZWYuYyAoY2hlY2tfbm9jcm9zc3JlZik6IFNraXAgc3ltYm9scyB3aXRoIG5vIG91dHB1dAotCXNlY3Rpb25zLgotCi1GcmkgQXVnICAyIDE0OjU3OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKExPQURBRERSKTogTmV3IHRlcm1pbmFsLgotCShleHApOiBIYW5kbGUgTE9BREFERFIuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgTE9BREFERFIuCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdG9rZW4pOiBBZGQgTE9BREFERFIuCi0JKGZvbGRfbmFtZSk6IEltcGxlbWVudCBMT0FEQUREUi4KLQkqIGxkbGFuZy5jIChleHBfaW5pdF9vcyk6IFRyZWF0IExPQURBRERSIGxpa2UgQUREUi4KLQkqIGxkLnRleGluZm8gKEFyaXRobWV0aWMgRnVuY3Rpb25zKTogRG9jdW1lbnQgTE9BREFERFIuCi0KLVRodSBBdWcgIDEgMTI6NTI6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChjaGVja19ub2Nyb3NzcmVmcyk6IERlY2xhcmUuCi0JKiBsZGxhbmcuaCAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZik6IERlZmluZS4KLQkoc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMpOiBEZWZpbmUuCi0JKG5vY3Jvc3NyZWZfbGlzdCk6IERlY2xhcmUuCi0JKGxhbmdfYWRkX25vY3Jvc3NyZWYpOiBEZWNsYXJlLgotCSogbGRsZXgubDogUmVjb2duaXplIE5PQ1JPU1NSRUZTIGtleXdvcmQuCi0JKiBsZGdyYW0ueSAoJXVuaW9uKTogQWRkIG5vY3Jvc3NyZWYgZmllbGQuCi0JKE5PQ1JPU1NSRUZTKTogTmV3IHRlcm1pbmFsLgotCShpZmlsZV9wMSk6IFJlY29nbml6ZSBOT0NST1NTUkVGUy4KLQkobm9jcm9zc3JlZl9saXN0KTogTmV3IG5vbnRlcm1pbmFsLgotCSogbGRsYW5nLmMgKG5vY3Jvc3NyZWZfbGlzdCk6IERlZmluZS4KLQkobGFuZ19hZGRfbm9jcm9zc3JlZik6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbWFpbi5jIChtYWluKTogSWYgbm9jcm9zc3JlZl9saXN0IGlzIG5vdCBOVUxMLCBjYWxsCi0JY2hlY2tfbm9jcm9zc3JlZnMuCi0JKHdhcm5pbmdfY2FsbGJhY2spOiBGcmVlIHN5bWJvbHMgaWYgdGhlcmUgaXMgbm8gcGxhY2UgdG8gc3RvcmUKLQl0aGVtLgotCShub3RpY2UpOiBDYWxsIGFkZF9jcmVmIGlmIG5vY3Jvc3NyZWZfbGlzdCBpcyBub3QgTlVMTC4KLQkqIGxkY3JlZi5jOiBJbmNsdWRlICJsZGV4cC5oIiBhbmQgImxkbGFuZy5oIi4KLQkoY2hlY2tfbm9jcm9zc3JlZnMpOiBOZXcgZnVuY3Rpb24uCi0JKGNoZWNrX25vY3Jvc3NyZWYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvKTogRGVmaW5lLgotCShjaGVja19yZWZzLCBjaGVja19yZWxvY19yZWZzKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBsZC50ZXhpbmZvIChPcHRpb24gQ29tbWFuZHMpOiBEb2N1bWVudCBOT0NST1NTUkVGUy4KLQotCSogbGQudGV4aW5mbyAoU2VjdGlvbiBQbGFjZW1lbnQpOiBJbXByb3ZlIHRoZSB3b3JkaW5nIG9mIHRoZQotCXdpbGRjYXJkIGRvY3VtZW50YXRpb24uICBNZW50aW9uIHRoYXQgd2lsZGNhcmRzIGFyZSBvbmx5IHNlYXJjaGVkCi0JZm9yIG9uIHRoZSBjb21tYW5kIGxpbmUsIG5vdCBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE1vdmUKLQlkZWZpbml0aW9uIG9mIGxpYl9wYXRoIGluc2lkZSBjb25kaXRpb24gd2hlcmUgaXQgaXMgdXNlZC4KLQotV2VkIEp1bCAzMSAxMzoxNzoxMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotIAkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogTm93IHdvcmtzIHdpdGggZWxmLnNjLgotCi1XZWQgSnVsIDMxIDExOjUyOjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFNDUklQVF9OQU1FKTogQ2hhbmdlIHRvIHZhbmlsbGEuCi0KLVR1ZSBKdWwgMzAgMTQ6NDY6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQWRkIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUgcmVzdWx0Ci0JdmFsdWUgd2hlbiBjb21wdXRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBzZWN0aW9uLgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgY3JlZiBmaWVsZC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogU2V0IGNvbW1hbmRfbGluZS5jcmVmLgotCSogbGRtYWluLmMgKG1haW4pOiBDaGVjayBjb21tYW5kX2xpbmUuY3JlZiByYXRoZXIgdGhhbgotCWxpbmtfaW5mby5ub3RpY2VfYWxsLgotCShub3RpY2UpOiBMaWtld2lzZS4KLQotCSogbGRjcmVmLmMgKG91dHB1dF9vbmVfY3JlZik6IERvbid0IGNyYXNoIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQKLQlpbiBhIHNlY3Rpb24gd2l0aG91dCBhbiBvd25lci4KLQotTW9uIEp1bCAyOSAxNzoyMzozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guaCwgZm5tYXRjaC5jOiBOZXcgZmlsZXMuCi0JKiBsZGxleC5sOiBSZW1vdmUgdW51c2VkIGRlZmluaXRpb24gb2YgRklMRU5BTUUuICBBZGQgZGVmaW5pdGlvbgotCW9mIFdJTERDSEFSLiAgSW4gU0NSSVBUIG1vZGUsIGFjY2VwdCBhbnkgc2VxdWVuY2Ugb2YgV0lMRENIQVIgYXMgYQotCU5BTUUuCi0JKiBsZGdyYW0ueSAoZmlsZV9OQU1FX2xpc3QpOiBBY2NlcHQgJyonIGFuZCAnPycgc3BlY2lhbGx5LgotCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBBY2NlcHQgJz8nIHNwZWNpYWxseS4KLQkoc3RhdGVtZW50KTogQ2hhbmdlIGV4cCB0byBtdXN0YmVfZXhwIGluIGxlbmd0aCBhbmQgRklMTCBjYXNlcy4KLQkoc2VjdGlvbik6IENhbGwgbGRsZXhfc2NyaXB0IGJlZm9yZSBzZWN0aW9uIHN0YXRlbWVudHMsIGFuZCBjYWxsCi0JbGRsZXhfcG9wc3RhdGUgYWZ0ZXIgdGhlbS4KLQkqIGxkbGFuZy5jOiBJbmNsdWRlICJmbm1hdGNoLmgiLgotCSh3aWxkY2FyZHApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh3aWxkX3NlY3Rpb24pOiBQZXJtaXQgdGhlIHNlY3Rpb24gbmFtZSB0byBiZSBhIHdpbGRjYXJkLgotCSh3aWxkX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIHdpbGQuCi0JKHdpbGQpOiBDYWxsIHdpbGRfZmlsZS4gIFBlcm1pdCB0aGUgZmlsZSBuYW1lIHRvIGJlIGEgd2lsZGNhcmQuCi0JKG9wZW5faW5wdXRfYmZkcyk6IERvbid0IGNhbGwgbG9va3VwX25hbWUgZm9yIGEgd2lsZGNhcmQgcGF0dGVybi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKENGSUxFUyk6IEFkZCBmbm1hdGNoLmMuCi0JKEhGSUxFUyk6IEFkZCBmbm1hdGNoLmguCi0JKE9GSUxFUyk6IEFkZCBmbm1hdGNoLm8uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB0aGF0IGZpbGUgYW5kIHNlY3Rpb24gbmFtZXMgY2FuIG5vdyBiZQotCXdpbGRjYXJkIHBhdHRlcm5zLgotCi0JKiBsZGxhbmcuYyAobGFuZ19wbGFjZV9vcnBoYW5zKTogQ29ycmVjdCBjb25kaXRpb246IHBsYWNlIGEgY29tbW9uCi0Jc2VjdGlvbiBpZiBub3QgcmVsb2NhdGVhYmxlIG9yIGlmIGNvbW1vbiBkZWZpbml0aW9ucyBhcmUgZm9yY2VkLgotCi1XZWQgSnVsIDI0IDEyOjE2OjM4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFNDUklQVF9OQU1FKTogQ2hhbmdlIHRvIGVsZi4KLQotV2VkIEp1bCAyNCAxMzozODoyMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBjb25maWd1cmUudGd0IChkMTB2LSotKik6IERvbid0IHJlcXVpcmUgdGhlIC1lbGYsIGFsbG93IHBsYWluIGQxMHYuCi0KLVR1ZSBKdWwgMjMgMTA6MzY6MTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlZDEwdmVsZi5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKGQxMHYtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogTmV3IGZpbGUuCi0KLVRodSBKdWwgMTggMTY6MjU6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzcGFyYyotKi1zeXN2NCopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBbmRyZXcgR2llcnRoCi0JPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KLQotCSogY29uZmlndXJlLmhvc3Q6IENoYW5nZSBpcml4NSB0byBpcml4WzU2XSouCi0JKiBjb25maWd1cmUudGd0OiBMaWtld2lzZS4KLQotV2VkIEp1bCAxNyAxMDo1Mjo0NiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X3NlY3Rpb25zKTogUGF5IGF0dGVudGlvbiB0byByZXR1cm4gY29kZS4KLQotCSogbGRtaXNjLmMgKGRlbWFuZ2xlKTogUmVtb3ZlIGFsbCBwcmVmaXggJy4ncyBmcm9tIGEgbmFtZS4KLQotTW9uIEp1bCAxNSAxMTo0OTo0OSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSb3VuZAotIAl0aGUgdmFsdWUgb2YgX19zdGFydF9TRUNOQU1FIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgdGhlCi0gCXNlY3Rpb24gdG8gYmUgcGxhY2VkLgotCi1UdWUgSnVsICA5IDEyOjA5OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyplbC0qLWVsZiopOiBVc2UgZWxmMzJlbG1pcC4KLQkobWlwcyotKi1lbGYqKTogVXNlIGVsZjMyZWJtaXAuCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaCAoRU1CRURERUQpOiBEb24ndCBkZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaCAoRU1CRURERUQpOiBEb24ndCBkZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWxtaXAuc2g6IE5ldyBmaWxlOyBjb3B5IG9mIGVsZjMybG1pcC5zaCB3aXRoCi0JRU1CRURERUQgZGVmaW5lZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaDogTmV3IGZpbGU7IGNvcHkgb2YgZWxmMzJibWlwLnNoIHdpdGgKLQlFTUJFRERFRCBkZWZpbmVkLgotCSogZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIChFTUJFRERFRCk6IERlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCAoRU1CRURERUQpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMyZWJtaXAubyBlZWxmMzJlbG1pcC5vLgotCShlZWxmMzJlYm1pcC5jLCBlZWxmMzJlbG1pcC5jKTogTmV3IHRhcmdldHMuCi0KLVRodSBKdWwgIDQgMTI6MDE6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBTZXQgdmVyc2lvbiB0byBjeWdudXMtMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotCSogZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoOiBSZW5hbWUgZnJvbSBwYzUzMm1hY2hhb3V0LnNoIHRvIGF2b2lkCi0JU3lzdGVtIFYgZmlsZSBuYW1lIGxpbWl0YXRpb25zLgotCSogY29uZmlndXJlLnRndCAobmMzMmstcGM1MzItbWFjaCosIG5zMzJrLXBjNTMyLXV4Kik6IFVzZQotCXBjNTMybWFjaGEgcmF0aGVyIHRoYW4gcGM1MzJtYWNoYW91dC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IENoYW5nZSBlcGM1MzJtYWNoYW91dC5vIHRvCi0JZXBjNTMybWFjaGEuby4KLQkoZXBjNTMybWFjaGEuYyk6IFJlbmFtZSB0YXJnZXQgZnJvbSBlcGM1MzJtYWNoYW91dC5jLgotCi1XZWQgSnVsICAzIDExOjQwOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHByaW50X3BhZGRpbmdfc3RhdGVtZW50KTogVXNlICV1LCBub3QgJXgsIHRvIHByaW50Ci0JZmlsbCB2YWx1ZS4KLQotU3VuIEp1biAzMCAxMToxNjo0MyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1lcHBjbWFjLmM6IFVwZGF0ZSB0byByZWZsZWN0IE1heSAyMyBjaGFuZ2UgdG8gYWl4LmVtLgotCi1UaHUgSnVuIDI3IDE0OjAzOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogUHV0IHRoZSAuc2EKLQlmaWxlIGp1c3QgYmVmb3JlIHRoZSAuc28gZmlsZSwgcmF0aGVyIHRoYW4ganVzdCBhZnRlci4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSAtcHJpbnQtZmlsZS1uYW1lPUZJTEUgcmF0aGVyIHRoYW4gcGlwaW5nCi0JLXByaW50LWxpYmdjYy1maWxlLW5hbWUgdGhyb3VnaCBzZWQuCi0JKGlbMzQ1XTg2Ki0qLXNjbyosIGlbMzQ1XTg2LSotaXNjKik6IENyZWF0ZSBjcnRiZWdpbi5vIGFuZAotCWNydGVuZC5vIGZpbGVzLCBpbiBjYXNlIGdjYyBkb2Vzbid0IHVzZSB0aGVtLgotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNydGJlZ2luLm8gYW5kIGNydGVuZC5vLgotCi1XZWQgSnVuIDI2IDE1OjU3OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotZGVjLW9zZiopOiBOZXcgdGFyZ2V0LgotCi1UdWUgSnVuIDI1IDIyOjE1OjI5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAotCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0JKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gSnVuIDI0IDE4OjQ4OjE2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjIChfR0xPQkFMX09GRlNFVF9UQUJMRV8pOiBEb24ndCBkbyBhCi0JUFJPVklERSBvZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHNpbmNlIGl0IG5lZWRzIHRvIGJlIGF0IGEKLQlub24tZml4ZWQgbG9jYXRpb24uCi0KLU1vbiBKdW4gMjQgMTc6NTU6MzEgMTk5NiAgSm91a2UgTnVtYW4gIDxqbnVtYW5AYmF6aXMubmw+Ci0KLQkqIGxkbGFuZy5oIChlbnVtIHNlY3Rpb25fdHlwZSk6IERlZmluZS4KLQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSk6IFJlbW92ZSBsb2FkYWJsZSBmaWVsZC4gIEFkZAotCXNlY3R5cGUgZmllbGQuCi0JKGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hhbmdlIGZsYWdzIHBhcmFtZXRlciBpbgotCXByb3RvdHlwZSB0byBzZWN0eXBlLgotCSogbGRncmFtLnkgKHR5cGViaXRzKTogUmVtb3ZlLgotCShzZWN0eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkob3B0X2F0KTogVXNlIHNlY3R5cGUgcmF0aGVyIHRoYW4gdHlwZWJpdHMuCi0JKHR5cGUpOiBTZXQgc2VjdHlwZSByYXRoZXIgdGhhbiB0eXBlYml0cy4KLQkoYXR5cGUpOiBMaWtld2lzZS4KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBEU0VDVCwgQ09QWSwgSU5GTywgYW5kIE9WRVJMQVkgaW4KLQlFWFBSRVNTSU9OIG1vZGUuCi0JKiBsZGxhbmcuYyAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogU2V0IHNlY3R5cGUKLQlmaWVsZCByYXRoZXIgdGhhbiBsb2FkYWJsZSBmaWVsZC4KLQkod2lsZF9kb2l0KTogQ2hlY2sgc2VjdHlwZSByYXRoZXIgdGhhbiBsb2FkYWJsZS4KLQkobGFuZ19yZWNvcmRfcGhkcnMpOiBMaWtld2lzZS4KLQkobGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBSZW5hbWUgZmxhZ3MgcGFyYW1ldGVyIHRvCi0Jc2VjdHlwZS4gIFNldCBzZWN0eXBlIGZpZWxkIHJhdGhlciB0aGFuIGxvYWRhYmxlIGZpZWxkLiAgU2V0IGZsYWdzCi0JZmllbGQgYmFzZWQgb24gc2VjdHlwZS4KLQotTW9uIEp1biAyNCAxMjowMDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRm9yY2UgLnN0YWIqIGFuZCAuY29tbWVudCBzZWN0aW9ucyB0byBzdGFydAotCWF0IDAuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAotCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi1GcmkgSnVuIDIxIDE3OjQwOjU2IDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgotCi1GcmkgSnVuIDIxIDEzOjA1OjUxIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWd1cmUudGd0IChhbHBoYS0qLWxpbnV4ZWNvZmYqKTogTmV3IHRhcmdldC4KLQkoYWxwaGEtKi1saW51eCopOiBVc2UgZWxmNjRhbHBoYS4KLQkqIGVtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaDogTmV3IGZpbGUuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IElmIEVMRlNJWkUgaXMgbm90IHNldCwgc2V0IGl0IHRvIDMyLiAgVXNlCi0JJHtFTEZTSVpFfSByYXRoZXIgdGhhbiAzMiB3aGVuIGNhbGxpbmcgQkZEIHJvdXRpbmVzLgotCShob2xkX3JvZGF0YSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFVzZSBob2xkX3JvZGF0YSBmb3IgYQotCXJlYWRvbmx5IHNlY3Rpb24gdGhhdCBpcyBub3QgY29kZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IFNldCBob2xkX3JvZGF0YS4gIERvbid0IHVzZQotCWEgLnJlbCBzZWN0aW9uIHVubGVzcyBpdHMgYmZkX3NlY3Rpb24gZmllbGQgaXMgbm90IE5VTEwuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjY0YWxwaGEuby4KLQkoZWVsZjY0YWxwaGEuYyk6IE5ldyB0YXJnZXQuCi0KLUZyaSBKdW4gMjEgMTI6NDU6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQ29ycmVjdCBoYW5kbGluZyBvZiAwIGluICVXIGNhc2UuCi0KLVRodSBKdW4gMjAgMTM6NTU6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIGVub3VnaCBzdXBwb3J0IHRvIHVuZGVyc3RhbmQgdGhlIGdjYyBzdnIzLmlmaWxlIHNjcmlwdDoKLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBCTE9DSyBhbmQgR1JPVVAgaW4gRVhQUkVTU0lPTiBjb250ZXh0LiAgQWRkCi0JQklORCBrZXl3b3JkLgotCSogbGRncmFtLnk6IEFkZCBCSU5EIHRva2VuLgotCShzZWN0aW9uKTogUmVjb2duaXplIEdST1VQLgotCShvcHRfZXh0X3dpdGhfdHlwZSk6IFJlY29nbml6ZSBhIGNvdXBsZSBvZiBjYXNlcyBvZiBCSU5ELgotCSogbGRsYW5nLmMgKGluaXRfb3MpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBzZWN0aW9uIGlzIGFscmVhZHkKLQlpbml0aWFsaXplZC4gIENhbGwgZXhwX2luaXRfb3Mgb24gYWRkcl90cmVlIGZpZWxkLgotCShleHBfaW5pdF9vcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMpOiBDYWxsIGV4cF9pbml0X29zIG9uIGFzc2lnbm1lbnQKLQlleHByZXNzaW9uLgotCShsYW5nX3BsYWNlX29ycGhhbnMpOiBDaGVjayBmb3IgY29tbW9uIHNlY3Rpb25zIGJ5IG5hbWUgQ09NTU9OCi0JcmF0aGVyIHRoYW4gYnkgY29tbW9uX3NlY3Rpb24gZmllbGQuICBEb24ndCB3YXJuIGFib3V0IGFic2VuY2Ugb2YKLQlbQ09NTU9OXSBjb21tYW5kLgotCi0JKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IFJlbW92ZSB1c2VsZXNzIGZpZWxkcwotCWNvbW1vbl9zZWN0aW9uLCBjb21tb25fb3V0cHV0X3NlY3Rpb24sIGFuZCBjb21wbGFpbmVkLCBhcyB3ZWxsIGFzCi0JYWxsIHJlZmVyZW5jZXMgdG8gdGhlbS4KLQotCSogbGRleHAuYzogUmVpbmRlbnQgYSBsb3Qgb2YgY29kZS4KLQkoZXhwX2ZvbGRfdHJlZSk6IENhbGwgRkFJTCByYXRoZXIgdGhhbiBlaW5mbyBpbiBkZWZhdWx0IGNhc2UuCi0KLVdlZCBKdW4gMTkgMTE6NDA6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTg4Ki0qLWRndXgqKTogUXVvdGUgSE9TVElOR19DUlQwLiAgRnJvbQotCTxyYW5kYWxsLmhyb25AbWVkYXBoaXMuY29tPi4KLQotVHVlIEp1biAxOCAxNTo1MzowOSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaDgzMDBzLnNjOiBOZXcgZmlsZSBmb3IgSDgvUy4KLQkqIGVtdWxwYXJhcm1zL2g4MzAwcy5zaDogTmV3IGZpbGUgZm9yIEg4L1MuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgSDgvUy4KLQkoZV9oODMwMHMuYyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBjb25maWd1cmUudGd0OiBBZGQgSDgvUyB0byB0YXJnX2V4dHJhX2VtdWxzLgotCi1UdWUgSnVuIDE4IDE3OjU1OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDVdODYqLSotaXNjKik6IE5ldyB0YXJnZXQuICBGcm9tCi0JPHVkZGVib3JnQGNhcm1lbi5zZT4uCi0KLVdlZCBKdW4gMTIgMTI6NDY6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotIAkocGFyc2VfYXJncyk6IENvcHkgdGhlIC1ZIGFyZ3VtZW50IGludG8gbWVtb3J5LgotIAkoc2V0X2RlZmF1bHRfZGlybGlzdCk6IERvbid0IHB1dCB0aGUgJzonIGJhY2sgaW50byB0aGUgZGlyZWN0b3J5Ci0JbGlzdC4KLQotRnJpIEp1biAgNyAxMToyNzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIHRvIGFkZAotCUxEX0xJQlJBUllfUEFUSCB0byB0aGUgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMuCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEFkZCBuZXcgc2V0X3N5bWJvbHMgcm91dGluZS4KLQotVGh1IEp1biAgNiAxMTo1MDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoIChPVEhFUl9HT1RfU1lNQk9MUyk6IFVzZSBBTElHTigxNikKLQlyYXRoZXIgdGhhbiAuIHdoZW4gY29tcHV0aW5nIF9ncCB2YWx1ZS4gIEZyb20gUGVyIEZvZ2Vsc3Ryb20uCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaCAoT1RIRVJfR09UX1NZTUJPTFMpOiBMaWtld2lzZS4KLQotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBjbG9zZSBhbmQgdW5saW5rIHRoZSBmaWxlIG9uIGVycm9yLCBzaW5jZQotCXJlbW92ZV9vdXRwdXQgd2lsbCBkbyBpdCBhbnlob3cuCi0JKiBsZGxhbmcuYyAob3Blbl9vdXRwdXQpOiBTZXQgYm9vbGVhbiB2YXJpYWJsZSB0byB0cnVlLCBub3QgMS4KLQotV2VkIEp1biAgNSAxODozNDoxNCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMve2VsZjMyYjQzMDAuc2gsZWxmMzJsNDMwMC5zaH0gKFNDUklQVF9OQU1FKTogVXNlCi0JZWxmbWlwcyBpbnN0ZWFkIG9mIGVsZi4KLQotVHVlIEp1biAgNCAxODo0MzowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkY3JlZi5jOiBOZXcgZmlsZS4KLQkqIGxkLmggKGFkZF9jcmVmLCBvdXRwdXRfY3JlZik6IERlY2xhcmUuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbm90aWNlX2FsbCBmaWVsZC4gIElmIGl0IGlzIHNldCBhdAotCWVuZCBvZiBsaW5rLCBjYWxsIG91dHB1dF9jcmVmLgotCShub3RpY2UpOiBSZW5hbWUgZnJvbSBub3RpY2VfeXN5bS4gIENoZWNrIG5vdGljZV9hbGwuCi0JKiBsZG1pc2MuYyAoZmluZm8pOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKiBsZG1pc2MuaCAoZmluZm8pOiBEZWNsYXJlLgotCSogbGV4c3VwLmMgKE9QVElPTl9DUkVGKTogRGVmaW5lLgotCShsZF9vcHRpb25zKTogQWRkICJjcmVmIi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSBPUFRJT05fQ1JFRi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIGxkY3JlZi5jLgotCShPRklMRVMpOiBBZGQgbGRjcmVmLm8uCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLWNyZWYuCi0KLVR1ZSBKdW4gIDQgMTI6MTI6MjUgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogTWFrZSAkKHRvb2xkaXIpIGFuZCAkKHRvb2xkaXIpL2Jpbi4KLQotRnJpIE1heSAzMSAxMjo0MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9zZWN0aW9ucyk6IERvbid0IGFzc3VtZSB0aGF0IGEKLQl3aWxkX3N0YXRlbWVudCBoYXMgYSBzZWN0aW9uIG5hbWUuCi0KLVdlZCBNYXkgMjkgMTM6MTM6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBRdW90ZSB0ZXN0IC16IGFyZ3VtZW50LgotCi0JKiBsZC50ZXhpbmZvOiBDbGFyaWZ5IHRoZSBDT05TVFJVQ1RPUlMgY29tbWFuZC4KLQotVGh1IE1heSAyMyAxNjowNzo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IEluaXRpYWxpemUKLQlmaWxlLCBub3QgaW1wZmlsZS4KLQotV2VkIE1heSAyMiAxMTozMTozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IERvbid0IGNvcHkgb3ZlciBTRUNfTElOS197T05DRSxEVVBMSUNBVEVTfQotCWlmIGZpbmFsIGxpbmsuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNmdW5jKTogUmVuYW1lZCB0byBzb3J0X2J5X2ZpbGVfbmFtZS4KLQkoc29ydF9ieV9zZWN0aW9uX25hbWUsIHNvcnRfc2VjdGlvbnNfMSk6IE5ldyBmdW5jdGlvbnMuCi0JKHNvcnRfc2VjdGlvbnMpOiBPbmx5IHNvcnQgYnkgZmlsZSBuYW1lIHNlY3Rpb25zIGluIC5pZGF0YS4KLQlBZGQgIkdyb3VwZWQgU2VjdGlvbnMiIHN1cHBvcnQuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJld3JpdGUgdG8gc3VwcG9ydCBHcm91cGVkCi0JU2VjdGlvbnMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBEZWxldGUuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLnRleHQsLmRhdGEsLnJkYXRhKTogQWRkICooLmZvb1wkKS4KLQkoLkNSVCwucnNyYyk6IFJld3JpdGUgdG8gdXNlIEdyb3VwZWQgU2VjdGlvbiBzdXBwb3J0LgotCi1UdWUgTWF5IDIxIDE0OjMxOjQ4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWVwcGNtYWMuYzogVXBkYXRlIHRvIHJlZmxlY3QgY2hhbmdlcyB0byBhaXguZW0uCi0KLVN1biBNYXkgMTkgMTY6NTk6NDQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChkcHJpbnRfc3RhdGVtZW50KTogU3RvcCBwcmludGluZyBhdCBlbmQgb2YgbGlzdC4KLQotU2F0IE1heSAxOCAxMzoxMjowNSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgLS1mb3JjZS1leGUtc3VmZml4Ci0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZm9yY2VfZXhlX3N1ZmZpeC4KLQkqIGxkLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uLgotCSogbGRtYWluLmMgKG1haW4pOiAgQWRkIHN1cHBvcnQgZm9yIG9wdGlvbi4KLQkqIGxleHN1cC5jIChPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWCk6IE5ldy4KLQkobGRfb3B0aW9ucywgcGFyc2VfYXJncyk6ICBBZGQgc3VwcG9ydCBmb3Igb3B0aW9uLgotCi1XZWQgTWF5IDE1IDEyOjUwOjI1IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzZXRfcGVfdmFsdWUpOiBQYXNzIDAgbm90IDE2IHRvIHN0cnRvdWwgY2FsbC4KLQotRnJpIE1heSAxMCAxNjoyODo0NCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoX19zdGFjayk6IE1ha2UgX19zdGFjayAwIGlmIGl0IHdhcwotCXJlZmVyZW5jZWQgYnV0IG5vdCBkZWZpbmVkLgotCi1UaHUgTWF5ICA5IDA4OjUyOjIzIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMve2VsZjMyYm1pcC5zaCxlbGYzMmxtaXAuc2gsbWlwc2lkdC5zaCxtaXBzaWR0bC5zaH06Ci0JU2V0IGEgbmV3IHZhcmlhYmxlIHRvIHNpZ25pZnkgaWYgdGhlIGZpbmFsIHRhcmdldCBpcyBhbiBlbWJlZGRlZAotCXN5c3RlbS4KLQkqIHNjcmlwdHRlbXBsL3ttaXBzLnNjLGVsZm1pcHMuc2N9OiBEb24ndCBhZGQgU0laRU9GX0hFQURFUlMgdG8KLQkudGV4dCBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLgotCi1UdWUgTWF5ICA3IDEwOjU2OjExIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBOZXcgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGhvbGRfe3NlY3Rpb24sdXNlLHRleHQscmRhdGEsZGF0YX0pOiBOZXcgc3RhdGljIGxvY2Fscy4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXBkYXRlIG9ycGhhbiBmaWVsZC4KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBXaGl0ZXNwYWNlIGNsZWFudXAuICBTZW1pY29sb24gdXNhZ2UgY2xlYW51cC4KLQkoSU5JVCxGSU5JKTogRGVsZXRlLCB1bnVzZWQuCi0JKC50ZXh0KTogRG9jdW1lbnQgb3JwaGFuIC50ZXh0LmZvbyBzZWN0aW9ucy4KLQkoLnJkYXRhKTogRG9jdW1lbnQgb3JwaGFuIC5yZGF0YS5mb28gc2VjdGlvbnMuCi0JKC5kYXRhKTogRG9jdW1lbnQgb3JwaGFuIC5kYXRhLmZvbyBzZWN0aW9ucy4KLQotVHVlIE1heSAgNyAxMTozNTo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBQbGFjZSAiLnRpbnkiIHNlY3Rpb25zIHJpZ2h0Ci0JYWZ0ZXIgIi5kYXRhIiBzZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogUGxhY2UgIi50aW55IiBzZWN0aW9ucyBpbnRvCi0JdGhlICJ0aW55IiBtZW1vcnkgcmVnaW9uLCAweGZmODAwMCB0aHJvdWdoIDB4ZmZmZjAwLgotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogU2V0IHRoZSBlbnRyeSBwb2ludCB0byB0aGUgdmFsdWUgb2YKLQkiX3N0YXJ0IiByYXRoZXIgdGhhbiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnbWVudC4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBQbGFjZSAucm9kYXRhIHNlY3Rpb25zIGJlZm9yZSAudGV4dAotCXNlY3Rpb25zIGluIG1haW4gcmFtLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotTW9uIE1heSAgNiAyMzozMjozMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogVXNlICJlaWdodCIsIG5vdCAiZWlnaHRiaXQiIGZvciB0aGUKLQk4LWJpdCByZWdpb24gYW5kIDgtYml0IHNlY3Rpb25zLgotCi1XZWQgTWF5ICAxIDE3OjUwOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogRml4IHR5cG9zLgotCi1Nb24gQXByIDI5IDIwOjMxOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjICguZW5kanVuayk6IERlZmluZSBfX2VuZF9fLgotCi1Nb24gQXByIDI5IDE3OjA1OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxvbmdlc3Rfc2VjdGlvbl9uYW1lKTogUmVtb3ZlLgotCShTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCk6IERlZmluZS4KLQkocHJpbnRfc2l6ZSwgcHJpbnRfYWxpZ25tZW50LCBwcmludF9maWxsLCBwcmludF9zZWN0aW9uKTogUmVtb3ZlLgotCShwcmludF9mbGFncyk6IFJlbW92ZS4KLQkobGFuZ19tYXApOiBSZXdyaXRlLgotCShwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF9hc3NpZ25tZW50KTogUmV3cml0ZS4KLQkocHJpbnRfb25lX3N5bWJvbCk6IFJld3JpdGUuCi0JKHByaW50X2lucHV0X3NlY3Rpb24pOiBSZXdyaXRlLgotCShwcmludF9maWxsX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X2RhdGFfc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9yZWxvY19zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF9wYWRkaW5nX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X3dpbGRfc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfc3RhdGVtZW50X2xpc3QpOiBDbGVhbiB1cC4KLQkocHJpbnRfc3RhdGVtZW50KTogQ2xlYW4gdXAuICBTb21lIG1pbm9yIG91dHB1dCBjaGFuZ2VzLgotCShwcmludF9zdGF0ZW1lbnRzKTogQ2xlYW4gdXAuCi0JKGxvYWRfc3ltYm9scyk6IFB1dCBhbm90aGVyIC0gYmVmb3JlIC13aG9sZS1hcmNoaXZlLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3RyZWUpOiBDaGFuZ2UgZXRyZWVfdmFsdWUgYW5kIGV0cmVlX3JlbCB0bwotCXByaW50IDB4IGFuZCB0byBvbWl0IGxlYWRpbmcgemVyb2VzLiAgRm9yIGV0cmVlX3JlbCwgdXNlICVCIHRvCi0JcHJpbnQgdGhlIEJGRC4gIEZvciBldHJlZV9hc3NpZ24sIHJlbW92ZSB0aGUgc3BhY2UgYWZ0ZXIgdGhlCi0JZGVzdGluYXRpb24gbmFtZS4KLQkqIGxkd3JpdGUuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShjbG9uZV9zZWN0aW9uKTogQ2FsbCB4c3RyZHVwLCBub3Qgc3RyZHVwLgotCShsZHdyaXRlKTogRG9uJ3QgcHJpbnQgYW55IG1hcCBpbmZvcm1hdGlvbi4KLQkocHJpbnRfc3ltYm9sX3RhYmxlLCBwcmludF9maWxlX3N0dWZmLCBwcmludF9zeW1ib2wpOiBSZW1vdmUuCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgbGFuZ19tYXAgd2hlbiBhcHByb3ByaWF0ZS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBBZGQgc3VwcG9ydCBmb3IgJVcuCi0JKHByaW50X2FkZHJlc3MpOiBSZW1vdmUuCi0JKiBsZG1pc2MuaCAocHJpbnRfYWRkcmVzcyk6IERvbid0IGRlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBBcHIgMjkgMTA6Mjk6MDcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLSotbGludXgqKTogQWRkIC1keW5hbWljLWxpbmtlciB0bwotIAlIT1NUSU5HX0NSVDAuICBTZWFyY2ggLWxnY2MgYm90aCBiZWZvcmUgYW5kIGFmdGVyIC1sYyBpbgotIAlIT1NUSU5HX0xJQlMuICBMb29rIGZvciBjcnR7YmVnaW4sZW5kfS5vIGluIHRoZSBjb21waWxlciBkaXJlY3RvcnkKLSAJYXQgZmlyc3QuCi0JKGlbMzQ1XTg2LSotbGludXgqKTogTG9vayBmb3IgY3J0e2JlZ2luLGVuZH0ubyBpbiB0aGUgY29tcGlsZXIKLQlkaXJlY3RvcnkgYXQgZmlyc3QuCi0KLUZyaSBBcHIgMjYgMTQ6NDI6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1pc2MuaCAoZGVtYW5nbGUpOiBEZWNsYXJlLgotCSogbGRtaXNjLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4gIEluY2x1ZGUgZGVtYW5nbGUuaCB3aXRoICIiLAotIAlub3QgPD4uCi0JKGRlbWFuZ2xlKTogTWFrZSBub24tc3RhdGljLiAgUmVtb3ZlIHJlbW92ZV91bmRlcnNjb3JlIHBhcmFtdGVyLgotCUFsd2F5cyByZXR1cm4gYW4gYWxsb2NhdGVkIHN0cmluZy4KLQkodmZpbmZvKTogRnJlZSByZXN1bHQgb2YgZGVtYW5nbGUuICBBZGQgY2FzZSAnRycuICBVc2UgJVQgdG8gcHJpbnQKLQlmdW5jdGlvbm5hbWUsIHJhdGhlciB0aGFuIGNhbGxpbmcgZGVtYW5nbGUuICBQcmludCBhIGNvbG9uIGJldHdlZW4KLQl0aGUgQkZEKHNlY3Rpb24rb2Zmc2V0KSBhbmQgdGhlIGxpbmUgbnVtYmVyLgotCSogbGRtYWluLmMgKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBJbXByb3ZlIGZvcm1hdCBvZiBhcmNoaXZlCi0JaW5mb3JtYXRpb24gaW4gbWFwIGZpbGUuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogRG9uJ3QgcHJpbnQgYW55dGhpbmcgdG8gdGhlIG1hcCBmaWxlLgotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IEltcHJvdmUgZm9ybWF0IG9mIGNvbW1vbiBzeW1ib2wKLQlpbmZvcm1hdGlvbiBpbiBtYXAgZmlsZS4KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IElmIHByb2R1Y2luZyBhIG1hcCBmaWxlLCBwcmludCBzZXQKLQlpbmZvcm1hdGlvbi4KLQkqIGxkd3JpdGUuYyAocHJpbnRfc3ltYm9sX3RhYmxlKTogUHJpbnQgYSBuZXdsaW5lIGJlZm9yZSB0aGUKLQloZWFkZXIgaW4gdGhlIG1hcCBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogUmVpbmRlbnQuCi0KLU1vbiBBcHIgMjIgMTI6MDc6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgX2Nvb2tlZF9zaXplIGlzIG5vdCAwLCB0aGVuCi0JZG9uJ3QgY2xvYmJlciBpdCB3aGVuIG5vdCByZWxheGluZy4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBSZW1vdmUgdHJhZGl0aW9uYWxfZm9ybWF0IGZpZWxkLgotCSogbGRtYWluLmMgKG1haW4pOiBVc2UgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCByYXRoZXIgdGhhbgotCWNvbmZpZy50cmFkaXRpb25hbF9mb3JtYXQuCi0JKiBsZGxhbmcuYyAobGRsYW5nX29wZW5fb3V0cHV0KTogTGlrZXdpc2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogbXB3LWVwcGNtYWMuYyAoZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyk6IExpa2V3aXNlLgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogRGlzY2FyZCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgd2UgYXJlCi0Jc3RyaXBwaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotCSogZW11bHBhcmFtcy96ODAwMi5zaCAoQVJDSCk6IFNldCB0byB6ODAwMiwgbm90IHo4ay4KLQotVHVlIEFwciAxNiAxNjozODozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogQ29ycmVjdCBoYW5kbGluZyBvZiBzdWJ0cmFjdGlvbiB3aXRoCi0JYWJzb2x1dGUgdmFsdWVzLgotCShmb2xkX25hbWUpOiBQZXJtaXQgc3ltYm9scyBpbiBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bS4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogT25seSBQUk9WSURFIF9fc3RhY2sgd2hlbiBSRUxPQ0FUSU5HLiAgVW5kbwotCWFjY2lkZW50YWwgY2hhbmdlcyBpbiBsYXN0IHBhdGNoLgotCi1UdWUgQXByIDE2IDEwOjI1OjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwYyotKi17c3lzdixsaW51eH0pOiBBZGQgYWxpYXNlcy4KLQkocG93ZXJwY2xlKi0qLXtzeXN2LHNvbGFyaXN9KTogRGl0dG8uCi0KLU1vbiBBcHIgMTUgMTQ6NTA6NTYgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogQWRkIFBST1ZJREUgKF9fc3RhY2sgPSAwKSBzbyBJIGNhbiB1c2UgaXQKLQlpbiBtNjhrL2NydDAuUyB3aXRob3V0IHRoaW5ncyBibG93aW5nIHVwLgotCi1GcmkgQXByIDEyIDE2OjQwOjU2IDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBSZW1vdmUgZGVmYXVsdCBhZGRyZXNzIGZvciAuZGF0YSBzbwotCS50ZXh0LCAuZGF0YSwgYW5kIC5ic3MgYXJlIGFsbCBzZXF1ZW50aWFsLgotCi1UaHUgQXByIDExIDEyOjA1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IFJlbW92ZSByZWdpb25zIGFuZCBzaW1wbGlmeS4KLQotV2VkIEFwciAxMCAxNDo0MTo1MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBBZGQgdGhlICI4LWJpdCBhcmVhIiBpbiB0aGUgdXBwZXIgMjU2Ci0JYnl0ZXMgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuICBQdXQgZGF0YSBmcm9tIHRoZSAiLmVpZ2h0IiBzZWN0aW9ucwotCWludG8gdGhlIDgtYml0IGFyZWEuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgotCi1UdWUgQXByICA5IDE0OjEwOjQyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOgotCVBhc3MgJEFSQ0ggdG8gbGRmaWxlX3NldF9vdXRwdXRfYXJjaCBpbnN0ZWFkIG9mIHNldHRpbmcKLQlsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSBkaXJlY3RseS4KLQotVHVlIEFwciAgOSAxNDoyMjoxNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLmluaXQsLmZpbmkpOiBQdXQgLmluaXQsIC5maW5pIHNlY3Rpb24KLQluZXh0IHRvIC50ZXh0LiAgUHV0IF9ldGV4dCBhZnRlciAudGV4dCwgLmluaXQsIC5maW5pLCBhbmQKLQkucm9kYXRheywyfSBzZWN0aW9ucy4KLQotVHVlIEFwciAgOSAxMjoxODo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IFJlYXJyYW5nZSBvcHRpb24gZG9jdW1lbnRhdGlvbi4KLQotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBOZXcgc3RhdGljIGFycmF5LgotCShwYXJzZV9hcmdzKTogQnVpbGQgc2hvcnRvcHRzIGFuZCBsb25nb3B0cyBmcm9tIGxkX29wdGlvbnMgYXJyYXkuCi0JKGhlbHApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogbGR2ZXIuaCAoaGVscCk6IERvbid0IGRlY2xhcmUuCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBSZWluZGVudC4KLQkoaGVscCk6IFJlbW92ZS4KLQotCSogbGQudGV4aW5mbywgbGQuMTogTWVudGlvbiAtRSBhcyBhIHN5bm9ueW0gZm9yIC1leHBvcnQtZHluYW1pYy4KLQotTW9uIEFwciAgOCAxMTo1NjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogV2hlbiBjaGVja2luZyBmb3IgYSBuYXRpdmUgZW11bGF0aW9uLCBjaGVjawotCXRoYXQgdGhlIGN1cnJlbnQgZW11bGF0aW9uIGlzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbi4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCAtRSBhcyBhIHN5bm9ueW0gZm9yIC1leHBvcnQtZHluYW1pYywKLQlmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4KLQotRnJpIEFwciAgNSAxNDozMDoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZik6IE5ldwotCXN0YXRpYyBmdW5jdGlvbiwgaWYgJHtob3N0fSA9ICR7dGFyZ2V0fS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IENhbGwgY2hlY2tfbGRfc29fY29uZiB0byBmaW5kIGEKLQluZWVkZWQgc2hhcmVkIGxpYnJhcnkgaWYgJHtob3N0fSA9ICRbdGFyZ2V0fS4KLQotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotbGludXgqKTogQWRkIC1keW5hbWljLWxpbmtlciB0bwotCUhPU1RJTkdfQ1JUMC4gIFNlYXJjaCAtbGdjYyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgLWxjIGluCi0JSE9TVElOR19MSUJTLgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgaVszNDVdODYtKi1mcmVlYnNkZWxmKiB0YXJnZXQ7IGZyb20gSm9obgotCVBvbHN0cmEgPGpkcEBwb2xzdHJhLmNvbT4uCi0KLUZyaSBBcHIgIDUgMTg6MTE6MjUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL2VsZjMye2IsbH00MzAwLnNoIChNQUNISU5FKTogQWRkIGV4cGxpY2l0Ci0gCWFyY2hpdGVjdHVyZSBudW1iZXIuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSAkTUFDSElORSBkZWZpbml0aW9uIGlmIHByZXNlbnQuCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogRm9yY2UgNDEwMCBidWlsZCB0byB1c2Ugc2FtZQotIAl0ZW1wbGF0ZSBhcyA0MzAwLgotCi1Nb24gQXByICAxIDE3OjM1OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENoYW5nZSByZWdpb24gY2hlY2sgdG8gaGFuZGxlCi0JcmVnaW9ucyB3aGljaCBlbmQgYXQgdGhlIGhpZ2hlc3QgcG9zc2libGUgYWRkcmVzcyBjb3JyZWN0bHkuCi0JRnJvbSBSb2xhbmQgV2ViZXIgPHJvd2ViZXJAaXJhLnVrYS5kZT4uCi0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkod2lsZF9kb2l0KTogRGlzY2FyZCBzZWN0aW9ucyB3aXRoIFNFQ19FWENMVURFIHNldCBpZiBub3QgZG9pbmcgYQotCXJlbG9jYXRlYWJsZSBsaW5rLiAgRG9uJ3Qgd29ycnkgYWJvdXQgc2VjdGlvbiBiZWluZyBOVUxMLCBzaW5jZSBpdAotCW5ldmVyIHNob3VsZCBiZS4gIERvbid0IGNhbGwgaW5pdF9vcyB1bmxlc3MgdGhlIHNlY3Rpb24gaXMgZ29pbmcKLQl0byBiZSBhZGRlZC4KLQkobGRsYW5nX2FkZF9maWxlKTogQ2FsbCBzZWN0aW9uX2FscmVhZHlfbGlua2VkIGZvciBlYWNoIHNlY3Rpb24uCi0JKiBsZG1haW4uYyAobXVsdGlwbGVfZGVmaW5pdGlvbik6IERvbid0IHdhcm4gYWJvdXQgbXVsdGlwbGUKLQlkZWZpbml0aW9ucyBpbiBzZWN0aW9ucyB3aGljaCBhcmUgYmVpbmcgZGlzY2FyZGVkLgotCi1TdW4gTWFyIDMxIDAwOjMwOjQ3IDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3twcGNwZS5zYywgcGUuc2N9ICguanVuayk6IFJlbW92ZSBhbmQgdXNlIC9ESVNDQVJELy4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoaW5pdCk6IFJlbW92ZSBzcGVjaWFsIGNhc2UgUFBDIGNvZGUuCi0KLUZyaSBNYXIgMjkgMDA6MDE6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogTWFrZSB2ZWN0b3JzIHNlY3Rpb24gMHhjNCBieXRlcyBsb25nCi0Jc28gYXMgbm90IHRvIG92ZXJ3cml0ZSB0aGUgbWFnaWMgc3lzY2FsbCBlbnRyeSBhdCAweGM0LgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotVGh1IE1hciAyOCAxMTowNTo0NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzcGFyYzY0LSotc29sYXJpczIqKTogRGVsZXRlLgotCVN0aWNrIHdpdGggc3BhcmMtKi1zb2xhcmlzMiouCi0KLVdlZCBNYXIgMjcgMTI6MzM6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChESVNDQVJEX1NFQ1RJT05fTkFNRSk6IERlZmluZSB0byAiL0RJU0NBUkQvIi4KLQkqIGxkbGFuZy5jIChpbml0X29zKTogRmFpbCBvbiBhbiBhdHRlbXB0IHRvIGluaXRpYWxpemUgYW55IHNlY3Rpb24KLQluYW1lZCBESVNDQVJEX1NFQ1RJT05fTkFNRS4KLQkod2lsZF9kb2l0KTogRGlzY2FyZCBpbnB1dCBzZWN0aW9ucyBhc3NpZ25lZCB0byBhbiBvdXRwdXQgc2VjdGlvbgotCW5hbWVkIERJU0NBUkRfU0VDVElPTl9OQU1FLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdXNlIG9mIC9ESVNDQVJELy4KLQotCSogbGRsYW5nLmM6IEZpeCBzb21lIGluZGVudGF0aW9uIGFuZCBjb21tZW50cy4KLQotVHVlIE1hciAyNiAxODoxNDo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZS4KLQotVGh1IE1hciAyMSAxMzoxNzozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IEZpeCBhIGNvdXBsZSBvZiBpbmRleGluZyBlbnRyaWVzLiAgTWVudGlvbiB0aGF0Ci0JLS12ZXJib3NlIGRpc3BsYXlzIGJ1aWx0aW4gbGlua2VyIHNjcmlwdHMuCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBjYXNlICdJJzogSWYgdGhlIGZpbGUgaXMgbm90IGluIGFuIGFyY2hpdmUsCi0JYW5kIHRoZSBsb2NhbCBzeW1ib2wgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZW5hbWUsIHByaW50IHRoZQotCWZpbGVuYW1lIGFzIHdlbGwuCi0KLQlQYXRjaGVzIGZyb20gSm9obiBQb2xzdHJhIDxqZHBAcG9sc3RyYS5jb20+IGZvciBGcmVlQlNEIEVMRjoKLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogLUJzaGFyZWFibGUgaXMgYSBzeW5vbnltIGZvciAtc2hhcmVkLgotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogTWFrZSB0aGUgc2FtZQotCWFzIFRFWFRfU1RBUlRfQUREUi4KLQotV2VkIE1hciAyMCAxODoxODoyNSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQudGV4aW5mbzogRml4IHR5cG9zLiAgVXNlIEBweHJlZiBvbmx5IGluc2lkZSBwYXJlbnRoZXNlcy4KLQotV2VkIE1hciAyMCAxNjo1NjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChhZGRfd3JhcCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbWFpbi5oIChhZGRfd3JhcCk6IERlY2xhcmUuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENhbGwgYWRkX3dyYXAuCi0KLVR1ZSBNYXIgMTkgMTY6NDQ6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjKi0qLXNvbGFyaXMyKiBob3N0KTogQWNjZXB0IGFueSBzcGFyYyB2YXJpYW50LgotCi1XZWQgTWFyIDEzIDE3OjQ3OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IENoYW5nZSBuYW1lIG9mIHBhZ2UgemVybyBtZW1vcnkKLQlmcm9tICJudWxsIiB0byAidmVjdG9ycyIuICBDcmVhdGUgYW4gb3V0cHV0IHNlY3Rpb24gZm9yCi0JdmVjdG9ycy4gIEFkZCBjb21tZW50cyBvbiBob3cgdG8gZXhwbGljaXRseSBwbGFjZSBpdGVtcwotCWluIHRoZSB2ZWN0b3IgdGFibGUuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgotCi1XZWQgTWFyIDEzIDEyOjQwOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2xuazk2MC5lbSAobWFjaGluZV90YWJsZSk6IEFkZCBqeCBhbmQgaHguCi0KLQkqIGdlbnNjcmlwdHMuc2g6IERvbid0IHVzZSAkezk6LXh4fSwgc2luY2UgVWx0cml4IC9iaW4vc2ggZG9lc24ndAotCXN1cHBvcnQgaXQuCi0KLVR1ZSBNYXIgMTIgMTI6NDM6NTkgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1Aa29hbGEuYXpzdGFybmV0LmNvbT4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgd2Fybl9tdWx0aXBsZV9ncCBmaWVsZC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0td2Fybi1tdWx0aXBsZS1ncC4KLQkqIGxkbWFpbi5jICh3YXJuaW5nX2NhbGxiYWNrKTogU3VwcHJlc3MgbXVsdGlwbGUgZ3AgdmFsdWVzIHdhcm5pbmcKLQlpZiAtLXdhcm5fbXVsdGlwbGVfZ3Agd2FzIG5vdCB1c2VkLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13YXJuLW11bHRpcGxlLWdwLgotCi1UdWUgTWFyIDEyIDEyOjAyOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS13cmFwLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby53cmFwX2hhc2guCi0JKiBsZGV4cC5jIChmb2xkX25hbWUpOiBVc2UgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCBpbiBERUZJTkVECi0JYW5kIE5BTUUgY2FzZXMuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLXdyYXAuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotCURvbid0IGRvIFN1bk9TIHN0eWxlIGR5bmFtaWMgbGlua2luZyBmb3Igc3BhcmMtYW91dDoKLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjNjQtKi1hb3V0Kik6IFVzZSBzcGFyY2FvdXQsIG5vdCBzdW40LgotCShzcGFyY2xpdGUqLWZ1aml0c3UtKiwgc3BhcmMqLSotYW91dCk6IExpa2V3aXNlLgotCShzcGFyYyotd3JzLXZ4d29ya3MqKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL3NwYXJjYW91dC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXNwYXJjYW91dC5vLgotCShlc3BhcmNhb3V0LmMpOiBOZXcgdGFyZ2V0LgotCi1XZWQgTWFyICA2IDE2OjA2OjUyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjICguc2RhdGEyLCAuc2JzczIpOiBJbXBsZW1lbnQgRmViIDIgY2hhbmdlCi0gCWluIGEgZGlmZmVyZW50IG1hbm5lciB0byB3b3JrIGFyb3VuZCBkaWZmZXJlbmNlcyBpbiBzaGVsbCB2YXJpYWJsZQotIAlleHBhbnNpb24uCi0KLVdlZCBNYXIgIDYgMTg6MDg6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuaCAobGRlbXVsX3VucmVjb2duaXplZF9maWxlKTogRGVjbGFyZS4KLQkobGRlbXVsYXRpb25feGZlcl90eXBlKTogQWRkIHVucmVjb2duaXplZF9maWxlIGZpZWxkLgotCSogbGRlbXVsLmMgKGxkZW11bF91bnJlY29nbml6ZWRfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBJZiBhIGZpbGUgY2FuIG5vdCBiZSByZWNvZ25pemVkLCBjYWxsCi0JbGRlbXVsX3VucmVjb2duaXplZF9maWxlIGJlZm9yZSB0cnlpbmcgaXQgYXMgYSBsaW5rZXIgc2NyaXB0LgotCSogYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSk6IE5ldyBzdGF0aWMKLQlmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogVXNlIEZPUEVOX1JULCBub3QgInIiLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplIHVucmVjb2duaXplZF9maWxlLgotCi1Nb24gTWFyICA0IDE0OjExOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGQpOiBIYW5kbGUgZm9vLmEoLnRleHQpIGJ5IG1hcHBpbmcgZWFjaCBpbmNsdWRlZAotCW1lbWJlciBvZiBmb28uYSBzZXBhcmF0ZWx5LiAgRnJvbSBKb3VrZSBOdW1hbiA8am51bWFuQGJhemlzLm5sPi4KLQotRnJpIE1hciAgMSAxMDoyNDo1OSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKLQlTZWFyY2ggdHJpbmFyeS5jb25kIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0cmluYXJ5LmxocyB0d2ljZS4KLQotVHVlIEZlYiAyNyAxNTowODo0MyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQkoQFRESVJTQCk6IEVkaXQgb3V0LCBjYW4ndCB1c2UgZ2Vuc2NyaXB0cy4KLQotVHVlIEZlYiAyNyAxNTowOToyMSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLnRndCAobTY4ay0qLWxpbnV4YW91dCosIG02OGstKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIGVtdWxwYXJhbXMvbTY4a2xpbnV4LnNoOiBOZXcgZmlsZS4KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCUNhbGwgYmZkXyR7RU1VTEFUSU9OX05BTUV9X3NpemVfZHluYW1pY19zZWN0aW9ucyBpbnN0ZWFkIG9mCi0JYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbTY4a2xpbnV4Lm8uCi0JKGVtNjhrbGludXguYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki0qLWxpbnV4YW91dCosIG02OCotKi1saW51eCopOiBOZXcgaG9zdHMuCi0KLVR1ZSBGZWIgMjcgMTI6NTU6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBTb3J0IGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLgotCUZpbGwgaW4gbWlzc2luZyBlbnRyaWVzLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtLW5vLXdob2xlLWFyY2hpdmUuCi0JKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IEFkZCB3aG9sZV9hcmNoaXZlIGZpZWxkLgotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IFNldCB3aG9sZV9hcmNoaXZlIGZpZWxkLgotCShsb2FkX3N5bWJvbHMpOiBDaGVjayBpbnB1dCBmaWxlIHNwZWNpZmljIHdob2xlX2FyY2hpdmUgZmllbGQKLQlyYXRoZXIgdGhhbiBnbG9iYWwgdmFyaWFibGUuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLW5vLXdob2xlLWFyY2hpdmUuCi0KLVR1ZSBGZWIgMjAgMTY6MDc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0OiBDb3JyZWN0IGdsZGk5NjAgdG8gZ2xkOTYwLgotCi1Nb24gRmViIDE5IDExOjE2OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBDaGVjawotCXRoZSBTT05BTUUgaWYgaXQgaXMgYXZhaWxhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IFVzZSB0aGUgU09OQU1FLCBub3QgdGhlCi0JZmlsZW5hbWUsIHdoZW4gY2hlY2tpbmcgZm9yIGNvbmZsaWN0aW5nIGxpYnJhcnkgdmVyc2lvbnMuICBEb24ndAotCWFzc3VtZSB0aGF0IHRoZSBzdWZmaXggaXMgb25seSBudW1iZXJzIGFuZCBkb3RzLgotCi0JKiBsZC50ZXhpbmZvOiBNZW50aW9uIHRoYXQgLVIgY2FuIGJlIHVzZWQgZm9yIC1ycGF0aC4KLQotU3VuIEZlYiAxOCAxNTowNToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLQl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KLQotVGh1IEZlYiAxNSAxMzo1ODowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGV4cGxpY2l0IHN1YnN0aXR1dGlvbiBvZiBDRkxBR1M7IGF1dG9jb25mCi0JZG9lcyBpdCBhbnlob3cuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoTERGTEFHUyk6IFNldCB0byBATERGTEFHU0AuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBjb25maWd1cmUuaG9zdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZW1vdmUgZ28zMiBob3N0LCBzaW5jZSBpdCBzaG91bGQgbm8gbG9uZ2VyIGJlCi0JbmVjZXNzYXJ5LiAgRG9uJ3Qgc2V0IENDIGZvciByb21wIGhvc3QuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3Qgc2tpcCBhIHBhZ2UgaW4gdmlydHVhbCBtZW1vcnkgc3BhY2UgaWYKLQl0aGUgdGV4dCBzZWdtZW50IGVuZHMgZXhhY3RseSBvbiBhIHBhZ2UgYm91bmRhcnkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IFJQQVRIX0VOVlZBUi4KLQkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCi0JKGNoZWNrKTogVXNlICQoUlBBVEhfRU5WVkFSKSByYXRoZXIgdGhhbiBMRF9MSUJSQVJZX1BBVEguCi0KLVdlZCBGZWIgMTQgMTg6NDk6MDEgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWd1cmUuaW46IFJlZG8gZW11bGF0aW9uIGhhbmRsaW5nIHNvIHRoYXQgZWFjaCBlbXVsYXRpb24KLQlzZWFyY2hlcyB0aGUgY29ycmVjdCB0b29sIGRpcmVjdG9yeSwgYmFzZWQgb24gdGhlIHRhcmdldCBhbGlhcy4KLQlGb3IgZXhhbXBsZSwgImNvbmZpZ3VyZSAtLWVuYWJsZS10YXJnZXRzPW02OGstY29mZiBpMzg2LWxpbnV4IgotCXdpbGwgc2VhcmNoIC91c3IvbG9jYWwvaTM4Ni1saW51eC9saWIgZm9yIGxpbnV4IGFuZAotCS91c3IvbG9jYWwvbTY4ay1jb2ZmL2xpYiBmb3IgbTY4ay1jb2ZmLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLnRndDogQWRkIHNwZWNpYWwgdGRpciBzZXR0aW5ncyBmb3IgTGludXguCi0JKiBNYWtlZmlsZS5pbjogQWRkIEBURElSU0AuICBQYXNzICIkKHRkaXJfRU1VTCkiIHRvICR7R0VOU0NSSVBUU30KLQlmb3IgZWFjaCBlRU1VTC5jIHRhcmdldC4KLQkqIGdlbnNjcmlwdHMuc2g6IEFjY2VwdCBzcGVjaWZpYyBhbGlhcyBhcyA5dGggYXJndW1lbnQsIGFuZCB1c2UgaXQKLQlpbiBMSUJfUEFUSC4KLQotV2VkIEZlYiAxNCAxNjozODozNiAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zZXRfc3RhcnRvZik6IERvbid0IGRvIGFueXRoaW5nIGZvciBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuCi0KLQkqIGxkZ3JhbS55IChtcmlfc2NyaXB0X2ZpbGUpOiBDYWxsIG1yaV9kcmF3X3RyZWUuCi0JKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIERvbid0IGJvdGhlciB0bwotCWNyZWF0ZSBtZW1vcnkgcmVnaW9ucy4KLQkobXJpX2xvYWQpOiBEb24ndCBjYWxsIG1yaV9kcmF3X3RyZWUuCi0JKiBtcmkuaCAobXJpX2RyYXdfdHJlZSk6IERlY2xhcmUuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OCotKi1wc29zKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvbTY4a3Bzb3Muc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvcHNvcy5zYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW02OGtwc29zLm8uCi0JKGVtNjhrcHNvcy5jKTogTmV3IHRhcmdldC4KLQotV2VkIEZlYiAxNCAxMTowOToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKCotKi1pZWVlKik6IE5ldyB0YXJnZXQ7IHVzZSB2YW5pbGxhLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFN0cmlwCi0JYDpmb28nIGZyb20gJHtBUkNIfS4KLQotVHVlIEZlYiAxMyAxNTo1ODo1OCAxOTk2ICBCcnlhbiBGb3JkICA8YmFmb3JkQHNuYWtlLmNzLnV0YWguZWR1PgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2M6IERvbid0IHBhZCB0aGUgLnRleHQgc2VjdGlvbi4gIFB1dAotCS5yb2RhdGEgaW4gLmRhdGEuCi0KLVR1ZSBGZWIgMTMgMTQ6MDQ6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IFdhcm4gaWYKLQlpdCBsb29rcyBsaWtlIHdlIG1pZ2h0IGJlIGxpbmtpbmcgaW4gdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKLQlzYW1lIHNoYXJlZCBsaWJyYXJ5LiAgQmFzZWQgb24gYSBwYXRjaCBmcm9tIEggSiBMdSA8aGpsQHpvb20uY29tPi4KLQotVGh1IEZlYiAgOCAxOToyNTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB3aGVuIGEKLQlwYWRkaW5nIHN0YXRlbWVudCBpcyBlbmNvdW50ZXJlZC4KLQotV2VkIEZlYiAgNyAxNDowMTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTG9vayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgQ2hhbmdlIHRoZSB2YWx1ZSBvZgotCUJGRExJQiB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IG9uIFN1bk9TLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IElmIHVzaW5nIGEgc2hhcmVkIEJGRCBsaWJyYXJ5LCB0cnkgdG8gcGFzcyBhCi0JcmVhc29uYWJsZSAtcnBhdGggb3B0aW9uIHdoZW4gbGlua2luZy4KLQkqIE1ha2VmaWxlLmluIChCRkRMSUIpOiBTZXQgdG8gQEJGRExJQkAuCi0KLVR1ZSBGZWIgIDYgMTI6Mjk6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKEFSQ0gpOiBDaGFuZ2UgdG8gYHNwYXJjOnY5Jy4KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtOiBTdHJpcCBgOmZvbycgZnJvbSAke0FSQ0h9LgotCi1Nb24gRmViICA1IDE2OjI1OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGJmZCBhbmQgb3Bjb2RlcyBhcyBzaGFyZWQgbGlicmFyaWVzLCBiYXNlZCBvbgotCXBhdGNoZXMgZnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW4gKEhMREZMQUdTKTogTmV3IHN1YnN0aXR1dGlvbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERkxBR1Mgb24gU3VuT1MuCi0JKiBNYWtlZmlsZS5pbiAoSExERkxBR1MpOiBOZXcgdmFyaWFibGUuCi0JKEJGRERFUCk6IE5ldyB2YXJpYWJsZS4KLQkoQkZETElCKTogQ2hhbmdlIHRvIC1MLi4vYmZkIC1sYmZkLgotCSgkKExEX1BST0cpKTogRGVwZW5kIHVwb24gJChCRkRERVApIHJhdGhlcm4gdGhhbiAkKEJGRExJQikuICBVc2UKLQkkKEhMREZMQUdTKSBpbiBsaW5rLgotCShjaGVjayk6IFNldCBMRF9MSUJSQVJZX1BBVEggaW4gdGhlIGVudmlyb25tZW50LgotCi1GcmkgRmViICAyIDE5OjI2OjI1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLnNkYXRhMiwgLnNic3MyKTogUHV0IC5zZGF0YTIgYW5kIC5zYnNzCi0JaW4gdGhlIHJlYWQtb25seSBzZWN0aW9uLCBub3QgcmVhZC93cml0ZSB1bmxlc3Mgd2UgYXJlIG1ha2luZyBhCi0Jc2hhcmVkIGxpYnJhcnkuCi0JKC5kZWJ1ZyopOiBBZGQgZHdhcmYgZGVidWcgc2VjdGlvbnMuCi0JKC5yZWxhLntzZGF0YSosc2Jzcyp9KTogQWRkIHNlY3Rpb25zLgotCi1GcmkgRmViICAyIDE2OjUwOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViICAxIDEwOjUwOjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIHRvIDB4ODA0ODAwMCwKLQlmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LgotCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogQ29ycmVjdCBoYW5kbGluZyBvZiBBQlNPTFVURS4KLQotV2VkIEphbiAzMSAxNzozMDoxOSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NV04Ni0qLWN5Z3dpbjMyLCBwb3dlcnBjbGUtKi1jeWd3aW4zMik6IE5ldy4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZGVmaW5mbyBpbml0KTogTWFrZSB0aGUgZGVmYXVsdCBzdGFjayByZXNlcnZlCi0Jb2YgYSBQUEMgbGFyZ2VyLgotCi1XZWQgSmFuIDMxIDE0OjM0OjIzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWd1cmUudGd0IChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9tNjhrYXV4LnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL202OGthdXguc2M6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtNjhrYXV4Lm8uCi0JKGVtNjhrYXV4LmMpOiBOZXcgdGFyZ2V0LgotCi1UdWUgSmFuIDMwIDEzOjE4OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IElnbm9yZQotCS1ibm9lbnRyeSwgc2luY2UgdGhlIHJpZ2h0IHRoaW5nIHRlbmRzIHRvIGhhcHBlbiBhbnlob3cuCi0KLU1vbiBKYW4gMjkgMTI6Mjk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtZXhwb3J0LWR5bmFtaWMuCi0KLUZyaSBKYW4gMjYgMTE6MTE6NTUgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogQ2hlY2sgZm9yIG5hdGl2ZSBjb21waWxlIGJ5IGNvbXBhcmluZwotCSR7dGFyZ2V0fSBhbmQgJHtob3N0fS4KLQotVGh1IEphbiAyNSAxNjo0Njo1OCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMve2VsZjMyYjQzMDAuc2gsIGVsZjMybDQzMDAuc2h9OiBDaGFuZ2VkCi0gCVRFWFRfU1RBUlRfQUREUiB0byBhbGxvdyB1c2Ugb24gSURUIGFuZCBQTU9OIHN5c3RlbXMuCi0KLVdlZCBKYW4gMjQgMjA6NTk6NDAgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6Ci0JY29ycmVjdCBzcGVsbGluZy4KLQotV2VkIEphbiAyNCAxNjo1OToxOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmM2NC0qLXNvbGFyaXMyKik6IE5ldyBjb25maWd1cmF0aW9uLgotCShzcGFyYzY0LSotYW91dCopOiBSZW5hbWVkIGZyb20gc3BhcmM2NCouCi0KLU1vbiBKYW4gMjIgMTM6MDE6MzUgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChHRU5TQ1JJUFRTKTogUGFzcyBAaG9zdEAgQHRhcmdldEAgQHRhcmdldF9hbGlhc0AuCi0JKiBnZW5zY3JpcHRzLnNoOiBTZXQgaG9zdCwgdGFyZ2V0IGFuZCB0YXJnZXRfYWxpYXMgdmFyaWFibGVzLgotCUNoZWNrIGZvciBuYXRpdmUgY29tcGlsZSBieSBjb21wYXJpbmcgJHt0YXJnZXR9IGFuZCAke2hvc3R9LgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFRlc3QgJHt0YXJnZXR9LCBub3QgJHt0YXJnZXRfYWxpYXN9LgotCi1Nb24gSmFuIDIyIDExOjAzOjIzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBSZWZpbmUgZWFiaSBzdXBwb3J0IHRvIGJldHRlciBzdXBwb3J0Ci0JLnNkYXRhLCAuc2RhdGEyLCAuc2JzcywgZXRjLiBzZWN0aW9ucy4KLQotVHVlIEphbiAxNiAxNToxNjo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55ICgldW5pb24pOiBBZGQgcGhkciBmaWVsZC4KLQkocGhkcik6IFVzZSBwaGRyX3F1YWxpZmllcnMgcmF0aGVyIHRoYW4gb3B0X2hkcnMgYW5kIG9wdF9hdC4KLQkocGhkcl9xdWFsaWZpZXJzKTogTmV3IG5vbnRlcm1pbmFsLiAgQWRkIHN1cHBvcnQgZm9yIEZMQUdTLgotCShvcHRfaGRycywgaGRyKTogUmVtb3ZlLgotCShwaGRyX3ZhbCk6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGFuZy5jIChsYW5nX25ld19waGRyKTogUmVwbGFjZSBoZHJzIHBhcmFtZXRlciB3aXRoIGZpbGVoZHIKLQlhbmQgcGhkcnMgcGFyYW1ldGVycy4gIEFkZCBmbGFncyBwYXJhbWV0ZXIuCi0JKGxhbmdfcmVjb3JkX3BoZHJzKTogVXBkYXRlIGZvciBjaGFuZ2VzIHRvIGxhbmdfcGhkci4gIFBhc3MgZmxhZ3MKLQl0byBiZmRfcmVjb3JkX3BoZHIuCi0JKiBsZGxhbmcuaCAoc3RydWN0IGxhbmdfcGhkcik6IFJlcGxhY2UgaGRycyBmaWVsZCB3aXRoIGZpbGVoZHIgYW5kCi0JcGhkcnMgZmllbGRzLiAgQWRkIGZsYWdzIGZpZWxkLgotCShMQU5HX1BIRFJfRklMRUhEUiwgTEFOR19QSERSX1BIRFJTKTogUmVtb3ZlLgotCShsYW5nX25ld19waGRyKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgRkxBR1MuCi0KLU1vbiBKYW4gMTUgMTU6MDc6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlEb24ndCBtYWtlIGEgc2hhcmVkIGxpYnJhcnkgYmVjYXVzZSBvZiBhbiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi0JX19HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KLQotCUFkZCBzb21lIElyaXggNSBzdXBwb3J0LCBtb3N0bHkgZnJvbSBLYXp1bW90byBLb2ppbWEKLSAgICAgICAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPjoKLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoIChTQ1JJUFRfTkFNRSk6IENoYW5nZSB0byBlbGZtaXBzLgotCShTSExJQl9URVhUX1NUQVJUX0FERFIpOiBEZWZpbmUuCi0JKE9USEVSX0dPVF9TWU1CT0xTKTogRGVmaW5lLgotCShPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBSZW1vdmUgaW5pdGlhbGl6YXRpb24gb2YgX2dwLgotCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBEb24ndCBkZWZpbmUuCi0JKERZTkFNSUNfTElOSyk6IERvbid0IGRlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwLnNoOiBTYW1lIGNoYW5nZXMgYXMgZWxmMzJibWlwLnNoLgotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcyotZGVjLWJzZCopOiBDaGFuZ2UgbWlwcyB0byBtaXBzKi4KLQkobWlwcyotc2dpLWlyaXg0Kik6IExpa2V3aXNlLgotCShtaXBzKi1zZ2ktaXJpeDUqKTogTmV3IGVudHJ5LgotCSogTWFrZWZpbGUuaW4gKGVlbGYzMmJtaXAuYyk6IERlcGVuZCB1cG9uIGVsZm1pcHMuc2MgcmF0aGVyIHRoYW4KLQllbGYuc2MuCi0JKGVlbGYzMmxtaXAuYyk6IExpa2V3aXNlLgotCi1TYXQgSmFuIDEzIDA5OjQxOjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBSZW1vdmUgc3VwcG9ydCBmb3IgLnJlbC4qIHNlY3Rpb25zLiAgQWRkCi0JLnJlbGEuZ290Lm5lZyBzZWN0aW9uLgotCi1GcmkgSmFuIDEyIDE0OjU2OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvc2guc2M6IE9ubHkgYnVpbGQgY29uc3RydWN0b3JzIHdoZW4gQ09OU1RSVUNUSU5HLgotCi0JKiBsZG1pc2MuYzogSW5jbHVkZSA8c3RkYXJnLmg+IHJhdGhlciB0aGFuIDx2YXJhcmdzLmg+IGlmCi0JQU5TSV9QUk9UT1RZUEVTIGlzIGRlZmluZWQuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZgotCVdJTkRPV1NfTlQuICBWYXJpb3VzIGluZGVuZGF0aW9uIGZpeGVzLgotCSh2ZmluZm8pOiBDaGFuZ2UgZm10IHBhcmFtZXRlciB0byBjb25zdCBjaGFyICouCi0JKGluZm9fbXNnKTogV3JpdGUgPHN0ZGFyZy5oPiB2ZXJzaW9uLgotCShlaW5mbywgbWluZm8sIGZpbmZvKTogTGlrZXdpc2UuCi0JKGluZm9fYXNzZXJ0KTogQ2hhbmdlIGZpbGUgcGFyYW1ldGVyIHRvIGNvbnN0IGNoYXIgKi4KLQkqIGxkbWlzYy5oIChlaW5mbywgbWluZm8sIGluZm9fbXNnKTogSWYgQU5TSV9QUk9UT1RZUEVTIGlzCi0JZGVmaW5lZCwgdXNlIGEgcmVhbCBwcm90b3R5cGUuCi0JKGluZm9fYXNzZXJ0KTogQ2hhbmdlIGZpcnN0IHBhcmFtZXRlciB0byBiZSBjb25zdCBjaGFyICouCi0KLUZyaSBKYW4gMTIgMTM6Mjk6NTUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAuc2RhdGEyLy5zYnNzMiwgZXRjLiAgQWRkCi0JaW4gb2xkIHN1cHBvcnQgdGhhdCAyLjcuMiBuZWVkcywgYnV0IHRoZSBjdXJyZW50IGNvbXBpbGVyIGRvZXMKLQlub3QuCi0KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJ7LGx9cHBjLmMpOiBGaXggdXAgZGVwZW5kZW5jaWVzIHRvIHVzZSB0aGUKLQljb3JyZWN0IExpbmtlciBzY3JpcHQgdGVtcGxhdGUuCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJ7LGx9cHBjLnNoIChURVhUX1NUQVJUX0FERFIpOiBTZXQgdG8gMHg0MDAwMCwKLQlub3QgMHg0MDAwMDAuCi0JKERBVEFfQUREUixOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBEZWxldGUuCi0KLVR1ZSBKYW4gIDkgMTU6NTM6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogUHV0IC5yY29uc3QgcmlnaHQgYWZ0ZXIgLnJkYXRhLgotCi1GcmkgSmFuICA1IDE0OjA3OjQ1IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlzb3J0IHVzaW5nIHJpZ2h0IHBvaW50ZXIuCi0KLUZyaSBKYW4gIDUgMTI6MjU6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFJlbW92ZSBzdXBwb3J0IGZvciBjcmVhdGluZyBzcGVjaWFsCi0JbGFiZWxzIGZvciBlYWJpIHNlY3Rpb24gYmVnaW4vZW5kIGhlcmUuICBUaGUgY29tcGlsZXIgbm93IHVzZXMKLQljcnR7aSxufS5vIHRvIGNyZWF0ZSB0aGVzZSBzeW1ib2xzLgotCi1UaHUgSmFuICA0IDE3OjA4OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IENoYW5nZSBleGlzdGluZyBMaW51eCBIT1NUSU5HX0NSVDAgdG8gYmUgdXNlZAotCWZvciBhLm91dCBvbmx5LCBhbmQgcHV0IGluIGFwcHJvcHJpYXRlIEhPU1RJTkdfQ1JUMCBhbmQKLQlIT1NUSU5HX0xJQlMgdmFsdWVzIGZvciBMaW51eCBFTEYuCi0KLVRodSBKYW4gIDQgMTI6MDI6MDUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IFVzZSBhbGwgNjRLIGZvciByYW0uCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IERlZmluZSAyNTZLIHJhbSBzaXplLgotCi1UaHUgRGVjIDIxIDE1OjU3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBQYXNzCi0JZXhwb3J0X2RlZmluZXMgYXMgdHJ1ZSB0byBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIGlmIC11bml4Ci0Jd2FzIHVzZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciAtYkUgd2FzIHVzZWQuCi0KLVR1ZSBEZWMgMTkgMTc6MzU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogT25seSBzZXQKLQlyZWxvY2F0ZWFibGUgYmVmb3JlIGNhbGxpbmcgbGRjdG9yX2J1aWxkX3NldHMgaWYgdGhlIG91dHB1dCBmaWxlCi0JaXMgaW4gYW4gWENPRkYgZm9ybWF0LgotCi1GcmkgRGVjIDE1IDE2OjM0OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogV2hlbiBoYW5kbGluZyBhIGRhdGEgc3RhdGVtZW50LCBpZgotCXRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyB1bmtub3duLCB1c2UgdGhlIGVuZGlhbm5lc3MKLQlvZiB0aGUgaW5wdXQgZmlsZS4KLQotVHVlIERlYyAxMiAxMzo1NTo0MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFJlY29nbml6ZSBtaXBzLSotKiBhcyBlcXVpdmFsZW50IHRvCi0JbWlwcy1pZHQtZWNvZmYuCi0JKiBtcHctZXBwY21hY29zLmM6IFJlbmFtZSB0byBzaG9ydGVyIG1wdy1lcHBjbWFjLmMuCi0JKiBtcHctbGQucjogQWRkIHZlcnNpb24gcmVzb3VyY2VzLgotCShjZnJnKTogVXNlIHN5bWJvbGljIGluc3RlYWQgb2YgbGl0ZXJhbCBuYW1lIGZvciBleGVjdXRhYmxlLgotCi1Nb24gRGVjIDExIDE1OjEzOjQxIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYyAoRklOSSk6IE1vdmVkIHRoZSAucmVsb2Mgc2VjdGlvbi4KLQotV2VkIERlYyAgNiAxNDozMzo1MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAocHJpbnRfc3RhdGVtZW50eyxzfSk6IERlbGV0ZSBkdXBsaWNhdGUgcHJvdG90eXBlLgotCShwcmludF9zdGF0ZW1lbnRfbGlzdCk6IFJlbmFtZWQgZnJvbSBwcmludF9zdGF0ZW1lbnQuICBBbGwgY2FsbGVycwotCXVwZGF0ZWQuCi0JKHByaW50X3N0YXRlbWVudCk6IE5ldyBmdW5jdGlvbiB0byBwcmludCBqdXN0IG9uZSBzdGF0ZW1lbnQuCi0JKHByaW50X3tkYXRhLHJlbG9jLHBhZGRpbmd9X3N0YXRlbWVudCk6IERvbid0IGNyYXNoIGlmCi0Jb3V0cHV0X3NlY3Rpb24gPT0gTlVMTC4KLQkoZHByaW50X3N0YXRlbWVudCk6IE5ldyBmdW5jdGlvbi4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBGaXgKLQljYWxsIHRvIHNvcnRfc2VjdGlvbnMuCi0KLVdlZCBEZWMgIDYgMTQ6NTk6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtICh1bml4X2xkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEhhbmRsZSAtdW5peC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBJZiB1bml4X2xkLCBwYXNzCi0JZ2MgYXMgZmFsc2UgYW5kIGV4cG9ydF9kZWZpbmVkcyBhcyB0cnVlIHRvIHNpemVfZHluYW1pY19zZWN0aW9ucy4KLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IFBlcm1pdCBhc3NpZ25tZW50cyB0byBkb3QgaW4gdGhlIGZpbmFsCi0JcGhhc2UgaWYgdGhlIGN1cnJlbnQgc2VjdGlvbiBpcyBhYnNfb3V0cHV0X3NlY3Rpb24uCi0KLQotVHVlIERlYyAgNSAwOTo0OTozOSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEZpeCBjYWxsCi0JdG8gc29ydF9zZWN0aW9ucy4KLQotRnJpIERlYyAgMSAxNjo0ODozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChQSERSUyk6IE5ldyB0b2tlbi4KLQkoaWZpbGVfcDEpOiBBY2NlcHQgcGhkcnMuCi0JKHNlY3Rpb24pOiBBY2NlcHQgcGhkcl9vcHQgYXQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiBkZWZpbml0aW9uLgotCShwaGRyX29wKTogTmV3IG5vbnRlcm1pbmFsLgotCShwaGRycywgcGhkcl9saXN0LCBwaGRyLCBwaGRyX3R5cGUsIG9wdF9oZHJzLCBoZHIpOiBMaWtld2lzZS4KLQkqIGxkbGV4Lmw6IEFjY2VwdCBQSERSUy4KLQkqIGxkbGFuZy5oIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QpOiBEZWZpbmUuCi0JKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUpOiBBZGQgcGhkcnMgZmllbGQuCi0JKHN0cnVjdCBsYW5nX3BoZHIpOiBEZWZpbmUuCi0JKExBTkdfUEhEUl9GSUxFSERSLCBMQU5HX1BIRFJfUEhEUlMpOiBEZWZpbmUuCi0JKGxhbmdfbmV3X3BoZHIpOiBEZWNsYXJlLgotCSogbGRsYW5nLmMgKGxhbmdfcGhkcl9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogSW5pdGlhbGl6ZSBwaGRycyBmaWVsZC4KLQkobGFuZ19wcm9jZXNzKTogQ2FsbCBsYW5nX3JlY29yZF9waGRycy4KLQkobGFuZ19uZXdfcGhkcik6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19zZWN0aW9uX2luX3BoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfcmVjb3JkX3BoZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IFBIRFJTLgotCi1UaHUgTm92IDMwIDEzOjE0OjMwIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYzogTW92ZWQgLmVkYXRhIGludG8gaXRzIG93biBzZWN0aW9uIHRvCi0JZXhwb3NlIGl0LgotCi1UaHUgTm92IDMwIDExOjMyOjM0IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki1tb3Rvcm9sYS1zeXN2KTogRGVmaW5lIEhPU1RJTkdfQ1JUMCBhbmQKLQlIT1NUSU5HX0xJQlMgZm9yIHRlc3RpbmcuCi0JKG04OCotbW90b3JvbGEtc3lzdjMpOiBEZWZpbmUgSE9TVElOR19DUlQwIGFuZCBIT1NUSU5HX0xJQlMgZm9yCi0JdGVzdGluZy4KLQotVHVlIE5vdiAyOCAxMjoxNDo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogU2V0IGNvbmZpZy5keW5hbWljX2xpbmsgdG8gZmFsc2UgZm9yIC1OCi0JYW5kIC1uLgotCi1Nb24gTm92IDI3IDEzOjEyOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi43LgotCi1GcmkgTm92IDI0IDE4OjM1OjM1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBUd28gLmp1bmsncyBpcyB0b28gbXVjaCBqdW5rLgotCi1UdWUgTm92IDIxIDE2OjE0OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX05FRURfREVDTEFSQVRJT04uCi0JKiBhY2NvbmZpZy5oOiBQdXQgTkVFRF9ERUNMQVJBVElPTl9GUkVFIGluIEBUT1BAIHNlY3Rpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotCSogbGRtYWluLmMgKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogRG9uJ3Qgd2FybiBhYm91dCBCRkRfUkVMT0NfQ1RPUgotCWJlaW5nIHVuc3VwcG9ydGVkIGlmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmsgYW5kIHRoZSBpbnB1dAotCUJGRCBzdXBwb3J0cyBpdCwgc2luY2UgbGRjdG9yX2J1aWxkX3NldHMgY2FuIGNvcGUgd2l0aCB0aGF0IGNhc2UuCi0KLUZyaSBOb3YgMTcgMTY6MjM6MTUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotbWFjb3MqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvcHBjbWFjb3Muc2g6IE5ldyBmaWxlLCBQb3dlck1hYyBlbXVsYXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXBwY21hY29zLm8uCi0JKGVwcGNtYWNvcy5jKTogTmV3IHRhcmdldC4KLQkqIG1wdy1lcHBjbWFjb3MuYzogVXBkYXRlLgotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBhdHRlbXB0cyB0byB1c2Uge0dFTlNDUklQVFN9LgotCi1GcmkgTm92IDE3IDEwOjM3OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgQGhvc3RAIGFuZCBAdGFyZ2V0QCwgbm90Ci0JJChob3N0X2Nhbm9uaWNhbCkgYW5kICQodGFyZ2V0X2Nhbm9uaWNhbCkuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0KLVRodSBOb3YgMTYgMTE6MjM6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2MgKC5lbmRqdW5rKTogTW92ZSBkZWZpbml0aW9uIG9mIGBlbmQnIHRvIGhlcmUKLQlzbyB0aGUgbWFsbG9jIGhlYXAgYmVnaW5zIGF0IGEgc2FuZSBwbGFjZS4KLQotVGh1IE5vdiAxNiAwMzowOTozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVZlcnNpb24gMi42IHJlbGVhc2VkLgotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogVXBkYXRlIHRvIDIuNi4KLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogRGVsZXRlIGxkZW11bC1saXN0LmggaGVyZSwgYnV0IG5vdAotCSQoR0VORVJBVEVEXypGSUxFUyksIHNpbmNlIHRoZXkgbmVlZCB0byBiZSByZXRhaW5lZCBieSBkaXN0Y2xlYW4uCi0JKG1haW50YWluZXItY2xlYW4sIHJlYWxjbGVhbik6IERlbGV0ZSB0aGVtIGhlcmUuCi0KLVR1ZSBOb3YgMTQgMTc6MDg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogT3BlbiB0aGUKLQliYXNlIGZpbGUgd2l0aCBGT1BFTl9XQiwgbm90ICJ3Ii4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogVXNlIHRoZQotCWVudmlyb25tZW50IHZhcmlhYmxlIExEX1JVTl9QQVRIIGlmIG5laXRoZXIgLXJwYXRoIG5vciAtcnBhdGgtbGluawotCXdlcmUgdXNlZC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBVc2UgdGhlIGVudmlyb25tZW50Ci0JdmFyaWFibGUgTERfUlVOX1BBVEggaWYgLXJwYXRoIHdhcyBub3QgdXNlZC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IExEX1JVTl9QQVRILgotCi1UaHUgTm92ICA5IDEzOjA5OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IFJlY29nbml6ZQotCS1ibCBhbmQgLWJsb2FkbWFwIG9wdGlvbnMuCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfdHJ5X29wZW5fYmZkKTogSWYgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotCXJlcG9ydCBhIGJldHRlciBlcnJvci4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBBZGQKLQluZXcgbG9jYWwgdmFyaWFibGUgc3BlY2lhbF9zZWN0aW9ucywgYW5kIHBhc3MgaXQgdG8KLQlzaXplX2R5bmFtaWNfc2VjdGlvbnMuICBMb29rIHRocm91Z2ggdGhlIHJlc3VsdHMsIGFuZCBtb3ZlIHRoZQotCXNlY3Rpb25zIGFyb3VuZCBpbiB0aGUgbWFwcGluZyBzbyB0aGF0IHRoZXkgYXJlIGRlZmluZWQgY29ycmVjdGx5LgotCi1XZWQgTm92ICA4IDExOjQwOjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9kZWZhdWx0X3RhcmdldCk6IENhc3QgZ2V0ZW52IHJldHVybiB2YWx1ZS4KLQotVHVlIE5vdiAgNyAxMToxNTozNiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9wcGNwZS5zaCAoQVJDSCk6IE5ldyBmaWxlIGZvciBQb3dlclBDIFBvcnRhYmxlCi0JRXhlY3V0YWJsZSBzdXBwb3J0LgotCSogc2NyaXB0dGVtcGwvcHBjcGUuc2M6IE5ldyBmaWxlIGZvciBQb3dlclBDIFBvcnRhYmxlIEV4ZWN1dGFibGUKLQlzdXBwb3J0LgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkZWQgcG93ZXJwY2xlLXBlIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVwcGNwZS5vIHRhcmdldC4KLQotCSogZW11bHRlbXBsL3BlLmVtIChUQVJHRVRfSVNfcHBjcGUpOiBmaWxlIHRhaWxvcmluZyBtYWNybwotCShnbGRfJF9iZWZvcmVfYWxsb2NhdGlvbik6IGFkZGVkIGhvb2tzIGZvciB0b2MgY29uc3RydWN0aW9uIGJhc2VkCi0Jb24gdGhlIGFib3ZlIG1hY3JvLgotCi1UdWUgTm92ICA3IDExOjQ3OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbzogVGhlIGxpbmtlciBkb2VzIG5vdCB1c2UgX21haW4gYXMgYW4gZW50cnkgcG9pbnQuCi0KLVR1ZSBOb3YgIDcgMTE6NDY6MTEgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2MgKC5kYXRhKTogQ2FsY3VsYXRlIG5leHQgYm91bmRhcnkgbW9kdWxvCi0JMHgyMDAwIG5vdCAweDIwMC4KLQotTW9uIE5vdiAgNiAxMDo1OToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHRlc3QgZm9yIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkLgotCSogc3lzZGVwLmg6IERlY2xhcmUgZnJlZSBpZiBuZWNlc3NhcnkuICBJbmNsdWRlICJhbnNpZGVjbC5oIi4KLQkqIGFjY29uZmlnLmg6IEV4cGxhaW4gTkVFRF9ERUNMQVJBVElPTl9GUkVFLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVGFrZSBCOjogb3V0IG9mIHNob3J0b3B0cy4KLQotU3VuIE5vdiAgNSAwMzowODoyOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9pMzg2bmJzZC5zaCAoRVhFQ1VUQUJMRV9TWU1CT0xTKTogU2V0IF9fRFlOQU1JQyB0byAwCi0JZm9yIG5vdywgYXMgd2l0aCBtNjhrNGtic2QsIHVudGlsIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZ2V0cwotCWRvbmUuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBGb3IgaTM4NiBCU0QgdmFyaWFudHMsIGNydDAubyBsaXZlcyBpbgotCS91c3IvbGliLiAgKFRydWUgZm9yIE5ldEJTRCBhdCBsZWFzdCwgdW5jb25maXJtZWQgZm9yIG90aGVycy4pCi0KLVdlZCBOb3YgIDEgMTU6NDI6NDUgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZGVsdGE2OC5vLgotCShlZGVsdGE2OC5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OCotbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9kZWx0YTY4LnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2RlbHRhNjguc2M6IE5ldyBmaWxlLgotCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjOiBIYW5kbGUgLmluaXQgYW5kIC5maW5pLiAgQ2hhbmdlIHNlY3Rpb24KLQlhZGRyZXNzZXMuCi0KLVdlZCBOb3YgIDEgMTE6NDE6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAobXJpX3NjcmlwdF9jb21tYW5kKTogQWNjZXB0ICcsJyBhcyB3ZWxsIGFzICc9JyBpbgotCUFMSUdOIGFuZCBBTElHTk1PRCBzdGF0ZW1lbnRzLgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBJbmNsdWRlIGxkZ3JhbS5oLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSGFuZGxlIC1wRCBhbmQgLXBULCBhcyB1c2VkIG9uCi0JQUlYIDQuMS4KLQkqIE1ha2VmaWxlLmluICgkKEVNVUxBVElPTl9PRklMRVMpKTogRGVwZW5kIHVwb24gbGRncmFtLmguCi0KLVR1ZSBPY3QgMzEgMTg6MjI6MjQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKGFscGhhLSotbGludXgqKTogTmV3IGhvc3QuCi0JKiBjb25maWd1cmUudGd0IChhbHBoYS0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBPY3QgMzEgMTI6MzY6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChleHBvcnRfZmlsZXMpOiBSZW1vdmUuCi0JKGltcG9ydF9maWxlcyk6IE1ha2Ugc3RhdGljLgotCShzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0KTogRGVmaW5lLgotCShleHBvcnRfc3ltYm9scyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBIYW5kbGUgYW4gaW5pdGlhbCAtYiBvcHRpb24KLQljb3JyZWN0bHkuICBDYWxsIHJlYWRfZmlsZSBmb3IgYW4gZXhwb3J0IGZpbGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQ2FsbAotCWJmZF94Y29mZl9leHBvcnRfc3ltYm9sIGZvciBlYWNoIGV4cG9ydCBzeW1ib2wsIHJhdGhlciB0aGFuCi0JY2FsbGluZyByZWFkX2ZpbGUgZm9yIGVhY2ggZXhwb3J0IGZpbGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IEZvciBhbiBleHBvcnQgZmlsZSwgbWFrZSB0aGUKLQlleHBvcnRlZCBzeW1ib2xzIHVuZGVmaW5lZCwgYW5kIHN0b3JlIHRoZW0gb24gdGhlIGV4cG9ydF9zeW1ib2xzCi0JbGlzdC4KLQotU2F0IE9jdCAyOCAwMDoxMDowMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKToKLQlEb24ndCBoYW5nIGlmIGxhc3Qgb3B0aW9uIGlzIHVucmVjb2duaXNlZC4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKTogSW5zZXJ0IGNyZWF0ZWQKLQlzeW1ib2xzIGludG8gQUJTIG91dHB1dCBzZWN0aW9uLgotCi1GcmkgT2N0IDI3IDE4OjAzOjE3IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqICBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgTmV0QlNECi0JbTY4azRrIGFyY2guCi0JKGVtNjhrNGtuYnNkLmMpOiBOZXcgcnVsZS4KLQotCSogY29uZmlndXJlLnRndDogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIE5ldEJTRCBtNjhrNGsgYXJjaC4KLQotCSogZ2Vuc2NyaXB0cy5zaCwgbGRpbnQudGV4aW5mbywKLQllbXVscGFyYW1zL3thMjlrLGFybWFvdXRiLGFybWFvdXRsLGNvZmZfc3BhcmMsZWJtb24yOWssZ2xkOTYwLAotCWdsZDk2MGNvZmYsZ28zMixoODMwMCxoODMwMGgsaDg1MDAsaDg1MDBiLGg4NTAwYyxoODUwMG0saDg1MDBzLAotCWhwMzAwYnNkLGhwM2hwdXgsaHBwYWVsZi5zaCxpMzg2YW91dCxpMzg2YnNkLGkzODZjb2ZmLGkzODZnbzMyLAotCWkzODZsaW51eCxpMzg2bHlueCxpMzg2bmJzZCxsbms5NjAsbTY4a2FvdXQsbTY4a2NvZmYsbTY4a2x5bngsCi0JbTg4a2JjcyxtaXBzYmlnLG1pcHNic2QsbWlwc2lkdCxtaXBzaWR0bCxtaXBzbGl0LG5ld3MsbnMzMmtuYnNkLAotCXBjNTMybWFjaGFvdXQscmlzY2l4LHNhMjkyMDAsc2gsc2hsLHNwYXJjbHlueCxzcGFyY25ic2QsCi0Jc3QyMDAwLHN1bjMsc3VuNCx2YW5pbGxhLHZheCx2c3RhLHc2NSx6ODAwMSx6ODAwMn0uc2g6IENoYW5nZWQKLQlQQUdFX1NJWkUgdG8gVEFSR0VUX1BBR0VfU0laRS4KLQotCSogZW11bHBhcmFtcy9tNjhrbmJzZC5oOiBEaXR0by4KLQkoVEVYVF9TVEFSVF9BRERSLCBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBXZSBoYXZlIDhLIHBhZ2VzaXplLgotCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBIYXJkY29kZSBfX0RZTkFNSUMgdG8gemVybyBmb3IgdGhlIHRpbWUKLQliZWluZy4KLQotCSogZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoOiBOZXcgZmlsZS4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRXhwYW5kIEVYRUNVVEFCTEVfU1lNQk9MUyBpZiByZWxvY2F0aW5nLgotCi1GcmkgT2N0IDI3IDE3OjU5OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbTogSW5jbHVkZSBsZGN0b3IuaC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQ2FsbCBmaW5kX3JlbG9jcy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIG5ldyBhZnRlcl9vcGVuIGZ1bmN0aW9uLgotCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBVc2UgQ09OU1RSVUNUT1JTIGluIC5kYXRhLgotCSogbGRjdG9yLmMgKHN0cnVjdCBzZXRfaW5mbyk6IE1vdmUgZGVmaW5pdGlvbiBpbnRvIGxkY3Rvci5oLgotCShzdHJ1Y3Qgc2V0X2VsZW1lbnQpOiBMaWtld2lzZS4KLQkoc2V0cyk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBBZGQgbmFtZSBwYXJhbWV0ZXIuICBTYXZlIGl0IGluIHRoZSBuZXcKLQlzZXQgZWxlbWVudC4KLQkobGRjdG9yX2J1aWxkX3NldHMpOiBBdm9pZCBiZWluZyBjYWxsZWQgdHdpY2UuICBQYXNzIHNldCBlbGVtZW50Ci0JbmFtZSB0byBsYW5nX2FkZF9yZWxvYy4KLQkqIGxkY3Rvci5oIChzdHJ1Y3Qgc2V0X2luZm8pOiBNb3ZlIGRlZmluaXRpb24gaGVyZSBmcm9tIGxkY3Rvci5jLgotCShzdHJ1Y3Qgc2V0X2VsZW1lbnQpOiBMaWtld2lzZS4gIEFkZCBuZXcgZmllbGQgbmFtZS4KLQkoc2V0cyk6IERlY2xhcmUuCi0JKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogRGVjbGFyZSBuZXcgbmFtZSBwYXJhbWV0ZXIuCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBEb24ndCBpbnNpc3QgdGhhdCBlaXRoZXIgbmFtZSBvcgotCXNlY3Rpb24gYmUgTlVMTCBpbiBhIGxhbmdfcmVsb2Nfc3RhdGVtZW50LgotCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBQYXNzIE5VTEwgdG8gbGRjdG9yX2FkZF9uZXdfc2V0X2VudHJ5IGZvcgotCW5ldyBuYW1lIHBhcmFtZXRlci4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBQYXNzIG5hbWUgdG8gbGRjdG9yX2FkZF9uZXdfc2V0X2VudHJ5IGZvcgotCW5ldyBuYW1lIHBhcmFtZXRlci4KLQotCSogbGRtaXNjLmMgKGRlbWFuZ2xlKTogRml4IGluZGVudGF0aW9uLiAgUmVtb3ZlIGEgbGVhZGluZyBwZXJpb2QuCi0KLVRodSBPY3QgMjYgMjI6MjI6NDkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgUG93ZXJNYWMgdGFyZ2V0IHN1cHBvcnQsIGdlbmVyYXRlIGNvbmZpZy5oLgotCSogbWFjLWxkLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2VzLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgZWRpdHMgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIG1wdy1lcHBjbWFjb3MuYzogUHJlYnVpbHQgdmVyc2lvbiBvZiBQb3dlck1hYyBsaW5raW5nIHNjcmlwdC4KLQotVGh1IE9jdCAyNiAxNDoxMToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBUcmVhdAotCS1zdGF0aWMgYXMgYSBzeW5vbnltIGZvciAtYm5zby4KLQotCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBNb3ZlIHNwZWNpYWwgc3ltYm9scyBpbnNpZGUgc2VjdGlvbnMuCi0JQWx3YXlzIHN0YXJ0IC5kYXRhIGF0IDAuCi0KLVdlZCBPY3QgMjUgMTE6NTI6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgQWxzbyBtYWtlIGluZm8uCi0JKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogIEFsc28gZGVsZXRlICouaW5mbyouCi0KLVdlZCBPY3QgMjUgMTE6Mjc6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBBZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBBSVggbGlua2VyIG9wdGlvbnMsCi0JZm9yIEFJWCBpbXBvcnQgYW5kIGV4cG9ydCBmaWxlcywgYW5kIGZvciBBSVggc2hhcmVkIG9iamVjdHMuCi0JKiBzY3JpcHR0ZW1wbC9haXguc2M6IEFkZCAucGFkLiAgUHV0IC5kcyBqdXN0IGJlZm9yZSB0aGUgVE9DLgotCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbmV3IGZpZWxkIGxpbmtfaW5mby5zdGF0aWNfbGluay4KLQotCSogbGRtYWluLmMgKGFkZF9rZWVwc3ltc19maWxlKTogQWRkIFxuIGF0IGVuZCBvZiBlaW5mbyBjYWxscy4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBMaWtld2lzZS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBMaWtld2lzZS4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBsZC50ZXhpbmZvOiBUaGUgTVJJIEFMSUdOIGRpcmVjdGl2ZSBpcyBzdXBwb3J0ZWQuCi0KLU1vbiBPY3QgMjMgMTE6NDY6NDMgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJ2cjQzMDAuc2g6IERlbGV0ZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMydnI0MzAwZWwuc2g6IERlbGV0ZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMyYjQzMDAuc2g6IEFkZGVkLgotCSogZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoOiBBZGRlZC4KLQkqIGNvbmZpZ3VyZS50Z3QsIE1ha2VmaWxlLmluOiBVcGRhdGVkIHRoZSBidWlsZCB0byB1c2UgdGhlCi0gCW5ldyA4LjMgdW5pcXVlIG5hbWVzLgotCi1UaHUgT2N0IDE5IDE3OjQxOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGVudHJ5X3N5bWJvbCk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkqIGxkbGFuZy5oIChlbnRyeV9zeW1ib2wpOiBEZWNsYXJlLgotCi0JKiBsZGxleC5sOiBUcmVhdCBQUk9WSURFIGFzIGEga2V5d29yZCBpbiBleHByZXNzaW9uIHN0YXRlLgotCi1XZWQgT2N0IDE4IDE3OjM0OjA2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjICguYnNzKTogTW92ZSB0byBiZSBhZnRlciAudGV4dAotCi1UdWUgT2N0IDE3IDEyOjIyOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKLQlTZWFyY2ggdHJpbmFyeS5jb25kIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0cmluYXJ5LmxocyB0d2ljZS4gIEZyb20KLQlsaW5saUBpaHAuUEh5cy5ldGh6LkNILgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBNb3ZlCi0JZGlyZWN0b3J5IHNlYXJjaGluZyBjb2RlIGludG8gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpci4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGV4dHJhY3RlZAotCWZyb20gZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zby4KLQkoZ2xvYmFsX25lZWRlZCwgZ2xvYmFsX2ZvdW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVzZSBuZXcgYWZ0ZXJfb3BlbiBmdW5jdGlvbi4KLQkqIGxkLnRleGluZm8sIGxkLjE6IE1lbnRpb24gLXJwYXRoLWxpbmsgb24gU3VuT1MuCi0KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJwcGMuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QgZ2VuZXJpYy5lbS4KLQkoZWVsZjMybHBwYy5jKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMybHBwYy5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KLQkoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lIGFzIHllcy4KLQotTW9uIE9jdCAxNiAxOToxMToxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogU3RydWN0IGJmZF9lbGZfbGlua19uZWVkZWRfbGlzdCBpcyBub3cgbmFtZWQKLQliZmRfbGlua19uZWVkZWQtbGlzdDsgbWFrZSBhcHByb3ByaWF0ZSBjaGFuZ2VzLgotCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotYWl4Kik6IE5ldyB0YXJnZXQ7IHVzZSBhaXhwcGMuCi0JKHJzNjAwMC0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgYWl4cnM2LgotCSogZW11bHBhcmFtcy9haXhwcGMuc2gsIGVtdWxwYXJhbXMvYWl4cnM2LnNoOiBOZXcgZmlsZXMuCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFpeHBwYy5vIGFuZCBlYWl4cnM2Lm8uCi0JKGVhaXhwcGMuYywgZWFpeHJzNi5jKTogTmV3IHRhcmdldHMuCi0KLUZyaSBPY3QgMTMgMTQ6MDA6MzcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcC9wZS5zYyAoLnJlbG9jKTogTW92ZSB0byB0aGUgZW5kLgotCi1UdWUgT2N0IDEwIDE3OjUzOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogRG9uJ3QgdHJ5IHRvIHVzZSBhbiBlbnRyeV9zeW1ib2wgZnJvbSBhCi0Jc2VjdGlvbiB3aGljaCB3YXMgbm90IGxpbmtlZCBpbnRvIHRoZSBmaW5hbCBvdXRwdXQuCi0KLVR1ZSBPY3QgMTAgMTA6MTc6MjIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEZpeAotCWZhdGFsIHR5cG9zLgotCi1UdWUgT2N0IDEwIDAxOjAxOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIHJwYXRoX2xpbmsgZmllbGQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBTZWFyY2ggZm9yCi0JcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGluIHJwYXRoX2xpbmsgcGF0aC4gIE9ubHkgc2VhcmNoCi0JTERfTElCUkFSWV9QQVRIIHdoZW4gY29uZmlndXJlZCBuYXRpdmUuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtcnBhdGgtbGluay4KLQkqIGxkLjEsIGxkLnRleGluZm86IERvY3VtZW50IC1ycGF0aC1saW5rLgotCi1TYXQgT2N0ICA3IDE3OjA3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogRG9uJ3QKLQlib3RoZXIgc2VhcmNoaW5nIGZvciBuZWVkZWQgbGlicmFyaWVzIHVubGVzcyBkb2luZyBhIGZpbmFsIGxpbmsuCi0KLUZyaSBPY3QgIDYgMTY6MjY6MTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC9sZC4xOiBGaXggZm9ybWF0dGluZyBidWdzLgotCi1XZWQgT2N0ICA0IDE3OjM3OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRleHAuYyAoZXhwX2dldF9hYnNfaW50KTogUmV0dXJuIGJmZF92bWEsIG5vdCBpbnQuCi0JKiBsZGV4cC5oIChleHBfZ2V0X2Fic19pbnQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogVXNlIGZwcmludGZfdm1hIHRvCi0JcHJpbnQgcmV0dXJuIHZhbHVlIG9mIGV4cF9nZXRfYWJzX2ludC4KLQotTW9uIE9jdCAgMiAxMzo1NjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xvYmFsX3N0YXQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBDYWxsIHN0YXRfbmVlZGVkIHRvIG1ha2Ugc3VyZQotCXRoYXQgdGhlIGZpbGUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgdW5kZXIgYW5vdGhlciBuYW1lLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLUZyaSBTZXAgMjkgMTI6MDA6MTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBTdGFydCAudGV4dCBhdCAweDgwMDAuCi0JU3RhcnQgLmRhdGEgYXQgMHg0MDAwMC4KLQotRnJpIFNlcCAyOSAxMTowOTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBJZgotCWNvbW1hbmRfbGluZS5ycGF0aCBpcyBzZXQsIHVzZSBpdCwgcmF0aGVyIHRoYW4gdGhlIC1MIG9wdGlvbnMsIHRvCi0JYnVpbGQgdGhlIHJ1bGVzIHNlY3Rpb24uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB0aGlzIHVzZSBvZiAtcnBhdGguCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogRG9uJ3Qgc2V0IGxpbmtfaW5mby5zaGFyZWQgZm9yIC1hc3NlcnQKLQlwdXJlLXRleHQuICBQYXNzIHRydWUsIG5vdCAxLCB0byBsYW5nX2FkZF9lbnRyeS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZmluZF9hc3NpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmb3VuZF9hc3NpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFJlbmFtZSBsb2NhbCBoIHRvIGhkeW4uCi0JSWYgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBubyBzdGFydCBzeW1ib2wgd2FzIHNwZWNpZmllZCBvbgotCXRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGVyZSBhcmUgYW55IHVuZGVmaW5lZCBzeW1ib2xzLCBzZXQKLQlsaW5rX2luZm8uc2hhcmVkLiAgSWYgbGlua19pbmZvLnNoYXJlZCBpcyBzZXQsIHNldCB0aGUgYWRkcmVzcyBvZgotCXRoZSAudGV4dCBzZWN0aW9uIHRvIDB4MjAuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudCk6IFJlbmFtZSBmcm9tCi0JZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudC4gIElmIGZpbmRfYXNzaWduIGlzCi0Jc2V0LCB0aGVuIGp1c3Qgc2V0IGZvdW5kX2Fzc2lnbiBiYXNlZCBvbiB3aGV0aGVyIGFuIGFzc2lnbm1lbnQgaXMKLQlmb3VuZCB0byBmaW5kX2Fzc2lnbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCk6IERvbid0IHVzZSBhIHNwZWNpYWwgc2NyaXB0IHdoZW4KLQlwcm9kdWNpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogUmVtb3ZlLgotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogUmVtb3ZlIENSRUFURV9TSExJQiB0ZXN0cy4KLQkqIGxkbGFuZy5jIChlbnRyeV9mcm9tX2NtZGxpbmUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBjbWRsaW5lIHBhcmFtZXRlciBmcm9tIGludCB0byBib29sZWFuLgotCVVzZSBnbG9iYWwgZW50cnlfZnJvbV9jbWRsaW5lIHJhdGhlciB0aGFuIGZ1bmN0aW9uIHN0YXRpYwotCWZyb21fY21kbGluZS4KLQkqIGxkbGFuZy5oIChlbnRyeV9mcm9tX2NtZGxpbmUpOiBEZWNsYXJlLgotCShsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBkZWNsYXJhdGlvbiBvZiBzZWNvbmQgcGFyYW1ldGVyIGZyb20gaW50Ci0JdG8gYm9vbGVhbi4KLQkqIGxkZ3JhbS55OiBQYXNzIGZhbHNlLCBub3QgMCwgdG8gbGFuZ19hZGRfZW50cnkuCi0KLVRodSBTZXAgMjggMTI6MzQ6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChwYXJzaW5nX2RlZnN5bSk6IERlY2xhcmUuCi0JKiBsZGxleC5oIChsZXhfc3RyaW5nKTogRGVjbGFyZS4KLQkqIGxkbGV4LmwgKGxleF9zdHJpbmcpOiBEZWZpbmUuCi0JKiBsZXhzdXAuYyAocGFyc2luZ19kZWZzeW0pOiBEZWZpbmUuCi0JKHBhcnNlX2FyZ3MpOiBJbiBPUFRJT05fREVGU1lNIGNhc2UsIHNldCBsZXhfc3RyaW5nIGJlZm9yZSBjYWxsaW5nCi0JbGV4X3JlZGlyZWN0LCBhbmQgY2xlYXIgaXQgYWZ0ZXIgY2FsbGluZyB5eXBhcnNlLiAgU2V0Ci0JcGFyc2luZ19kZWZzeW0gYXJvdW5kIGNhbGwgdG8geXlwYXJzZS4KLQkqIGxkbWFpbi5jIChtYWluKTogU2V0IGxleF9zdHJpbmcgYmVmb3JlIGNhbGxpbmcgbGV4X3JlZGlyZWN0LCBhbmQKLQljbGVhciBpdCBhZnRlciBjYWxsaW5nIHl5cGFyc2UuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRm9yICVTLCBoYW5kbGUgLS1kZWZzeW0gYXJndW1lbnRzIGFuZCBidWlsdAotCWluIGxpbmtlciBzY3JpcHRzIGNvcnJlY3RseS4KLQotCSogc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjOiBBZGQgLmN0b3JzLy5kdG9ycyBoYW5kbGluZyBsaWtlIG90aGVyCi0JQ09GRiB0YXJnZXRzLCBhbGxvd2luZyBmb3IgdGhlIGxlYWRpbmcgdW5kZXJzY29yZSB1c2VkIG9uIFNQQVJDCi0JQ09GRi4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLWFzc2VydC4KLQkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KTogVXNlIHRoZQotCXNoYXJlZCBsaWJyYXJ5IHNjcmlwdCB3aGVuIGFwcHJvcHJpYXRlLgotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogSWYgQ1JFQVRFX1NITElCIGlzIHNldCwgc3RhcnQgdGhlIC50ZXh0Ci0Jc2VjdGlvbiBhdCBTSVpFT0ZfSEVBREVSUy4KLQotVGh1IFNlcCAyOCAwMTo0MDozNyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlYXJtY29mZi5jKTogQnVpbGQuCi0JKiBjb25maWd1cmUudGd0IChhcm0tKi1jb2ZmKTogTmV3IHRhcmdldAotCSogZW11bHBhcm1zL2FybWNvZmYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogTmV3IGZpbGUuCi0KLVR1ZSBTZXAgMjYgMTA6NTk6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogUmVtb3ZlIC5kYXRhMjsgbm8gbG9uZ2VyIG5lZWRlZC4KLQotRnJpIFNlcCAyMiAxODowOTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZmlsZS5jIChsZGZpbGVfc2V0X291dHB1dF9hcmNoKTogTWFrZSBhcmNoIGNvbnN0LgotCi1UaHUgU2VwIDIxIDE3OjU1OjI0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBDb3JyZWN0bHkgbG9jYXRlIF9fYnNzX3N0YXJ0IGF0IHRoZQotCWJlZ2lubmluZyBvZiB0aGUgLmJzcyBhcmVhLCBub3QgYXQgdGhlIGVuZCBvZiBkYXRhLiAgQWRkCi0JX19zYnNzX3tzdGFydCxlbmR9IHN5bWJvbHMuCi0KLVdlZCBTZXAgMjAgMTI6Mjk6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFF1b3RlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkuCi0JKENYWF9GT1JfVEFSR0VULCBpbnN0YWxsKTogTGlrZXdpc2UuCi0KLU1vbiBTZXAgMTggMTQ6NTM6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBieSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFJlbW92ZSBicm9rZW5zZWQgc3R1ZmYuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0JKGluc3RhbGwpOiBMaWtld2lzZS4KLQkoR0VORVJBVEVEX0hGSUxFUyk6IFJlbW92ZSBjb25maWcuaC4KLQkoLmRlcCk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCi1Nb24gU2VwIDE4IDE0OjM5OjM4IDE5OTUgIEFybmUgSC4gSnV1bCAgPGFybmVqQHB2di51bml0Lm5vPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi1kZWMtbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0KLUZyaSBTZXAgMTUgMjA6MDE6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtODgqLSotZGd1eCopOiBGaXggYW5vdGhlciBzaGVsbCBzeW50YXggZXJyb3IuCi0KLUZyaSBTZXAgMTUgMjM6Mjg6MDUgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLWJzZCopOiBGaXggc2hlbGwgc3ludGF4IGVycm9yLgotCi1UaHUgU2VwIDEyIDEyOjUwOjQ5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXAvcGUuc2M6ICBBbGxvdyBib3RoIHNwZWxsaW5ncyBvZiAuY3RvcnMvLmR0b3JzLgotCVN0YXJ0IC50ZXh0IHNlY3Rpb24gb24gdGhlIHJpZ2h0IGJvdW5kYXJ5LiBBbHdheXMgYWxpZ24KLQlzdGFicy4KLQotVHVlIFNlcCAxMiAxMjoyNDoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KLQotCSogbGRtYWluLmMgKHN0cnVjdCB3YXJuaW5nX2NhbGxiYWNrX2luZm8pOiBEZWZpbmUuCi0JKHdhcm5pbmdfY2FsbGJhY2spOiBBZGQgbmV3IHBhcmFtZXRlciBzeW1ib2wuICBDYWxsCi0Jd2FybmluZ19maW5kX3JlbG9jIHRvIHRyeSB0byBmaW5kIHRoZSBzZWN0aW9uIGFuZCBWTUEuCi0JKHdhcm5pbmdfZmluZF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIE5VTEwgYXMgc3ltYm9sIHBhcmFtZXRlciB0byB3YXJuaW5nIGNhbGxiYWNrLgotCi0JKiBsZC50ZXhpbmZvOiBDbGFyaWZ5IC1MIG9wdGlvbi4KLQotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKHRvcG93ZXIpOiBMaWtld2lzZS4gIEFsc28sIHJlaW5kZW50LgotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEFkZAotCWNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQotRnJpIFNlcCAgOCAxNjozMjo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gY29uZmlndXJlLnRndC4KLQotCSogbGRlbXVsLmggKGxkZW11bF9zZXRfc3ltYm9scyk6IERlY2xhcmUuCi0JKGxkZW11bF9wYXJzZV9hcmdzKTogRGVjbGFyZS4KLQkqIGxkZW11bC5jIChsZGVtdWxfcGFyc2VfYXJncyk6IEZpeCBpbmRlbnRhdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0hFQURFUl9ESVJFTlQuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogVXNlIGF1dG9jb25mIHJlY29tbWVuZCBtZWNoYW5pc20gdG8gZGVmaW5lCi0JRElSIGFuZCBzdHJ1Y3QgZGlyZW50LgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi0qLWJzZCopOiBOZXcgY2FzZS4KLQotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LXNlcXVlbnQtcHR4KiB8IGlbMzQ1XTg2LXNlcXVlbnQtc3lzdiopCi0JTmV3IGNhc2UuCi0JKiBjb25maWd1cmUudGd0IChpWzM0NV04Ni0qLXB0eCopOiBOZXcgY2FzZS4KLQotVGh1IFNlcCAgNyAxMDo0ODoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KLQlDaGVjayBmb3IgY29uZmlnLmg6Y29uZmlnLmluIHdoZW4gY3JlYXRpbmcgc3RhbXAtaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gY29uZmlnLmluIHJhdGhlciB0aGFuCi0JY29uZmlnLmguaW4uICBTZXQgQ09ORklHX0hFQURFUlMgdG8gY29uZmlnLmg6Y29uZmlnLmluIHdoZW4KLQljYWxsaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXN1bm9zNjQqKTogUmVtb3ZlLgotCSogbGRsYW5nLmMgKGxhbmdfbWFwKTogQ2hlY2sgQkZENjQsIG5vdCBIT1NUXzY0X0JJVC4KLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERvbid0IHdhcm4gYWJvdXQgbW92aW5nIHRoZSBsb2NhdGlvbgotCWNvdW50ZXIgYmFja3dhcmQgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uCi0KLVdlZCBTZXAgIDYgMTQ6NDI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJld3JpdGUgdG8gdXNlIGF1dG9jb25mLgotCSogY29uZmlndXJlLmhvc3Q6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLnRndDogTmV3IGZpbGUuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9jb25mLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWcuaC5pbjogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9oZWFkZXIuCi0JKiBzeXNkZXAuaDogTmV3IGZpbGUuCi0JKiBsZC5oOiBJbmNvcnBvcmF0ZSBvbGQgY29udGVudHMgb2YgY29uZmlnLmguCi0JKiBjb25maWcuaDogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFZhcmlvdXMgY2hhbmdlcyBmb3IgbmV3IGNvbmZpZ3VyZSBzY3JpcHQuICBBbHNvOgotCShDQ19GT1JfQlVJTEQpOiBSZW1vdmUuCi0JKGxkbWFpbi5vKTogRG9uJ3QgYm90aGVyIHRvIGVuc3VyZSB0aGF0IEVNVUwgaXMgbm9uLWVtcHR5LgotCShkZXAuc2VkKTogVXNlIEBTUkNESVJALCBub3QgQHNyY2RpckAuCi0JKiBkZXAtaW4uc2VkOiBVc2UgQFNSQ0RJUkAsIG5vdCBAc3JjZGlyQC4KLQkqIGdlbnNjcmlwdHMuc2g6IENyZWF0ZSBsZHNjcmlwdHMgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JKiBsZGVtdWwuYywgbGV4c3VwLmMsIG1wdy1lbWlwc2lkdC5jOiBEb24ndCBpbmNsdWRlICJjb25maWcuaCIuCi0JKiBtcHctZXNoLmMsIGVtdWx0ZW1wLyouZW06IExpa2V3aXNlLgotCSogbGRtYWluLmM6IExpa2V3aXNlLiAgSW5jbHVkZSA8Y3R5cGUuaD4uICBEb24ndCB0cnkgdG8gc2V0Ci0JSEFWRV9TQlJLIGhlcmUuCi0JKiBjb25maWcvKi5tdCwgY29uZmlnLyoubWg6IFJlbW92ZS4KLQotVHVlIFNlcCAgNSAxNDo1NToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBUcmVhdCBuczMyay1wYzUzMi11eCogbGlrZSBuczMyay1wYzUzMi1tYWNoKiwgYW5kCi0JbnMzMmstcGM1MzItbGl0ZXMqIGxpa2UgbnMzMmstcGM1MzItbmV0YnNkKi4gIEZyb20gSWFuIERhbGwuCi0KLUZyaSBTZXAgIDEgMjI6Mjk6NTIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IEZpeCB0eXBvIGluIHNwZWxsaW5nIG9mIC5jdG9ycy8uZHRvcnMuCi0KLUZyaSBTZXAgIDEgMTM6MTM6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAod2FybmluZ19jYWxsYmFjayk6IEFkZCBhYmZkLCBzZWN0aW9uLCBhbmQgYWRkcmVzcwotCXBhcmFtZXRlcnMuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlDaGFuZ2UgY2FsbCB0byB3YXJuaW5nIGFjY29yZGluZ2x5LgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IElmIG5vdAotCXJlbG9jYXRlYWJsZSBhbmQgbm90IHNoYXJlZCwgcHV0IC5nbnUud2FybmluZy5TWU1CT0wgc2VjdGlvbnMgaW50bwotCXRoZSAudGV4dCBzZWN0aW9uLgotCi1GcmkgU2VwICAxIDA4OjM1OjE2IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIG1pcHMqdnI0MzAwLWlkdC1lbGYqIGFuZAotICAgICAgICBtaXBzKnZyNDMwMGVsLWlkdC1lbGYqIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgZWVsZjMydnI0MzAwKiB0YXJnZXRzLgotCSogZW11bHBhcmFtcy97ZWxmMzJ2cjQzMDAuc2gsIGVsZjMydnI0MzAwZWwuc2h9OiBBZGRlZC4KLQkqIGNvbmZpZy97bWlwcy12cjQzMDAubXQsIG1pcHMtdnI0MzAwZWwubXR9OiBBZGRlZC4KLQotRnJpIFNlcCAgMSAxMDo1MTo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2EyOWsuc2M6IEZpeCB0byBiZSByZWFzb25hYmxlLiAgRnJvbSBCcmVuZGFuIEtlaG9lCi0JPGJyZW5kYW5AY3lnbnVzLmNvbT4uCi0KLVRodSBBdWcgMzEgMTY6Mzc6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9wYXJzZV9hcmdzKTogTmV3LgotCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBwYXJzZV9hcmdzLgotCSogbGV4c3VwLmMgKGFsbCBwZSBzdHVmZik6IE1vdmVkIGludG8gcGUuZW0KLQkocGFyc2VfYXJncyk6IENhbGwgZW11bGF0aW9uIGFyZyBwYXJzZXIuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHBhcnNlX2FyZ3MpOiBoYW5kbGUgUEUgc3BlY2ZpYyBhcmdzLgotCi1UaHUgQXVnIDMxIDE3OjAxOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBEb24ndCB1c2UgdGhlIGZpcnN0IHJlZ2lvbgotCWFzIHRoZSBkZWZhdWx0IHJlZ2lvbi4gIENyZWF0ZSBhIG5ldyByZWdpb24gaW5zdGVhZC4KLQotVHVlIEF1ZyAyOSAxNDoyMTo0MSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX3NldF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgotCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBzZXRfc3ltYm9scy4KLQkqIGxkbWFpbi5jIChtYWluKTogQWRkIGNhbGwgdG8gbGRlbXVsX3NldF9zeW1ib2xzLgotCSogbGV4c3VwLmMgKHNldF9wZV92YWx1ZSk6IE5ldyBhcmdzLgotCShzZXRfcGVfbmFtZSk6IE5ldy4KLQkocGFyc2VfYXJncyk6IENvcGUgd2l0aCBuZXcgc2V0X3BlX3ZhbHVlIGFyZ3MuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgotCShsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgc2V0X3N5bWJvbHMuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVXNlIG5ldyBzeW1ib2xzLgotCi1UaHUgQXVnIDI0IDE4OjEyOjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBEb24ndCBjYWxsIHNldF9kZWZhdWx0X2Rpcmxpc3QgZm9yIC1PLgotCUZvciAtWSwgaWdub3JlIGEgbGVhZGluZyBgUCwnLCBhbmQgb25seSBjYWxsIHNldF9kZWZhdWx0X2Rpcmxpc3QKLQlhZnRlciBwcm9jZXNzaW5nIGFsbCB0aGUgb3RoZXIgYXJndW1lbnRzLgotCi1UdWUgQXVnIDIyIDA3OjM2OjU4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBLZWVwIC5lZGF0YSwgZG9uJ3QgYmFzZSBzdGFicyBhdCAwLgotCSogZW11bHBhcmFtcy9hcm1wZS5zaDogUnVuIFBFIHNjcmlwdC4KLQotTW9uIEF1ZyAyMSAxODozMDo0MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IFJlbW92ZSBQRSBzdHVmZi4KLQkqIGxleHN1cC5jIChvcHRpb25zKTogTG9hZCBtb3JlIFBFIG9wdGlvbnMuCi0JKHNldF9wZV92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IEF1ZyAxNyAxMzozNTo0OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0KLQkqIGVtdWx0ZW1wbC97YXJtcGUuc2MsIGkzODZwZS5zY306IERlbGV0ZWQuCi0JKiBlbXVsdGVtcGwvcGUuc2M6IE5ldyBmaWxlIHBlcmZvcm1zIGdlbmVyaWMgUEUgc3VwcG9ydCBhbmQgc29ydHMKLQlhcmNoaXZlIG1lbWJlcnMuCi0JKiBlbXVscGFyYW1zL3thcm1wZS5zaCxpMzg2cGUuc2h9OiBVc2UgbmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC97YXJtcGUuc2MsIGkzODZwZS5zY306IERlbGV0ZWQKLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBOZXcuCi0JKiBNYWtlZmlsZS5pbjogVXNlIG5ldyBmaWxlcy4KLQotVGh1IEF1ZyAxNyAxNDo0NjozNCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9oODUwMHMuc2MgKC5yZGF0YSk6IEFsbCBkYXRhIG11c3QgZ28gaW4gZGF0YSBzZWdtZW50LgotCSguc3RyaW5ncywuY3RvcnMsLmR0b3JzKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTYgMTE6Mzg6NTkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IEFsd2F5cyBzdGFydCBjb2RlIGF0IDB4NDAxMDAwLCBldmVuCi0JaWYgLXIuCi0JKiBsZHdyaXRlLmMgKHN0cmR1cCk6IE5ldyBleHRlcm4gZGVjbGFyYXRpb24uCi0JKiBsZGdyYW0ueSAoYXR5cGUpOiBOZXcgcnVsZSB0byBjbGFyaWZ5IHR5cGUgcGFyc2luZy4KLQkqIGxkbGFuZy5jIChpbml0X29zKTogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgY29kZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogU2V0IFNFQ19BTExPQyBhbmQgU0VDX0xPQUQgYml0cwotCXVubGVzcyB0b2xkIG5vdCB0byBieSB0aGUgbGluayBzY3JpcHQuCi0KLVdlZCBBdWcgMTYgMTE6NDU6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zZXRfc3RhcnRvZik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxhbmdfcHJvY2Vzcyk6IENhbGwgaXQuCi0KLQkqIGxkZ3JhbS55OiBUd2VhayBjYXNlc3ltbGlzdCB0byBhdm9pZCBiaXNvbiBlcnJvcnMuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC1oIGFzIGEgc3lub255bSBmb3IgLS1zb25hbWUsIGZvcgotCVNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotVHVlIEF1ZyAxNSAxNzozMToxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChZWURFQlVHKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgotCShDQVNFLCBFWFRFUk4sIFNUQVJUKTogTmV3IHRva2Vucy4KLQkobXJpX3NjcmlwdF9jb21tYW5kKTogSGFuZGxlIENBU0UsIEVYVEVSTiwgSU5DTFVERSwgU1RBUlQuCi0JKGNhc2VzeW1saXN0KTogTmV3IG5vbnRlcm1pbmFsLgotCShleHRlcm5fbmFtZV9saXN0KTogTmV3IG5vbnRlcm1pbmFsLgotCSogbGRsZXgubDogQWNjZXB0IGxvd2VyIGNhc2UgdHJhaWxpbmcgYmFzZSBzcGVjaWZpZXJzLiAgRG9uJ3QKLQlpZ25vcmUgdGhlIGZpcnN0IGRpZ2l0IHdoZW4gdGhlIGJhc2UgaXMgYSBzdWZmaXguICBBY2NlcHQgbWFueQotCUVYUFJFU1NJT04gc3RhdGUgdG9rZW5zIGluIE1SSSBzdGF0ZS4gIFN1cHBvcnQgTVJJIGNvbnRpbnVhdGlvbgotCWxpbmVzIGFuZCBNUkkgc2VtaWNvbG9uIGNvbW1lbnRzLiAgQWNjZXB0IGFsbCBNUkkga2V5d29yZHMgaW4KLQlsb3dlciBjYXNlLiAgQWRkIENBU0UsIEVYVEVSTiwgYW5kIFNUQVJUIE1SSSBrZXl3b3Jkcy4KLQotVHVlIEF1ZyAgOCAxOToxNDo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFVzZSB4bWFsbG9jCi0JaW5zdGVhZCBvZiBhbGxvY2EuCi0KLVR1ZSBBdWcgIDggMTU6MjQ6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiBEb24ndCB1c2UKLQkkci8uLi9nY2MveGdjYyB1bmxlc3MgaXQgaXMgcHJlc2VudC4KLQotVGh1IEF1ZyAgMyAxMTo1NjoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBPbmx5IHB1dCAuY3RvcnMgYW5kIC5kdG9ycyBpbiAudGV4dAotCXdoZW4gQ09OU1RSVUNUSU5HLgotCSogc2NyaXB0dGVtcGwvbTY4a2x5bnguc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvbncuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvc2EyOTIwMC5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2M6IExpa2V3aXNlLgotCi1GcmkgSnVsIDI4IDEyOjAyOjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMve3o4MDAxLnNoLCB6ODAwMi5zaH06IEZpeCB0eXBvLgotCi1UaHUgSnVsIDI3IDIxOjA2OjIxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbGludXhvbGRsZCk6IFRyZWF0IGxpa2UgbGludXhhb3V0Ki4KLQotVGh1IEp1bCAyNyAxNToyNjoyOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2cGUuc2M6IENvcGUgd2l0aCBjb25zdHJ1Y3RvcnMuCi0JKiBzY3JpcHR0ZW1wbC96OGtzaW0uc2M6IERlbGV0ZWQuCi0JKiBzY3JpcHR0ZW1wbC96ODAwMC5zYzogUmVzdXJyZWN0ZWQgYXMgdGhpcywgYnV0Ci0JY2FuIGhhbmRsZSB6ODAwMSBhbmQgejgwMDIgZm9ybWF0cy4KLQkqIGVtdWxwYXJhbXMvejhrc2ltLnNoOiBEZWxldGVkLgotCSogZW11bHBhcmFtcy97ejgwMDEuc2gsIHo4MDAyLnNofTogTmV3IGZpbGVzLgotCSogY29uZmlnL3o4a3NpbS5tdDogRGVsZXRlZAotCSogY29uZmlnL3o4ay1jb2ZmLm10OiBOZXcsIGdlbmVyYXRlcyBib3RoIGVtdWxhdGlvbnMuCi0KLVR1ZSBKdWwgMjUgMTQ6NTM6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogSW4gJUMgYW5kICVEIGNhc2UsIGFsd2F5cyBwcmludCB0aGUgQkZEIHVzaW5nCi0JJUIsIGluIGNhc2UgaXQgaXMgaW4gYW4gYXJjaGl2ZS4KLQotTW9uIEp1bCAyNCAxNToyMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIHJlc2V0X21lbW9yeV9yZWdpb25zIGZvciBlYWNoCi0JcmVsYXhhdGlvbiBwYXNzLgotCi1GcmkgSnVsIDIxIDIyOjQ5OjQ0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAuc2RhdGEsIC5zYnNzLCBhbmQKLQlfU0RBX0JBU0UuCi0KLVRodSBKdWwgMjAgMTY6MjY6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IEFsbG9jYXRlIHNldF9uYW1lIGluIHN0YWNrCi0JZnJhbWUsIHJhdGhlciB0aGFuIGFsd2F5cyBjYWxsaW5nIGFsbG9jYSB3aXRoIGEgZml4ZWQgc2l6ZS4KLQotV2VkIEp1bCAxOSAxNjoyMTo0MyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoIChPVVRQVVRfRk9STUFUKTogQ2hhbmdlIHRvIHBlaS1hcm0tbGl0dGxlLgotCShMSVRUTEVfT1VUUFVUX0ZPUk1BVCwgQklHX09VVFBVVF9GT1JNQVQpOiBEZWZpbmUuCi0KLU1vbiBKdWwgMTcgMTM6NTc6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBTZXQgdGhlIGFsaWdubWVudCBvZiB0aGUgY2xvbmUKLQlzZWN0aW9uIHRvIHRoYXQgb2YgdGhlIHNlY3Rpb24gYmVpbmcgY2xvbmVkLgotCi0JKiBsZHdyaXRlLmMgKHNwbGl0X3NlY3Rpb25zKTogRG9uJ3Qgc3BsaXQgdGhlIGZpcnN0IGlucHV0IHNlY3Rpb24KLQlpbnRvIGEgbmV3IG91dHB1dCBzZWN0aW9uLgotCi1TYXQgSnVsIDE1IDAwOjI2OjM1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCShHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUgYXMgeWVzLgotCi1GcmkgSnVsIDE0IDEyOjExOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL21pcHNlY29mZi5lbSAoY2hlY2tfc2VjdGlvbnMpOiBVc2UgJVAsIG5vdCAlRi4KLQotCSogbGR2ZXIuYyAoaGVscCk6IFVwZGF0ZSBsaXN0IG9mIG9wdGlvbnMgdG8gbWF0Y2ggY3VycmVudGx5Ci0Jc3VwcG9ydGVkIGxpc3QuCi0KLVRodSBKdWwgMTMgMTM6NTI6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvbG5rOTYwLmVtIChsZF9sbms5NjBfZW11bGF0aW9uKTogSW5pdGlhbGl6ZQotCWFmdGVyX29wZW4gZmllbGQuCi0KLQkqIGxkZXhwLmMgKGV4cF9pbnRvcCk6IERvbid0IGNhc3Qgc3RhdF9hbGxvYyBhcmcgdG8gYmZkX3NpemVfdHlwZTsKLQlpdCB0YWtlcyBhIHNpemVfdCBhbnlob3cuCi0JKGV4cF9iaW5vcCk6IExpa2V3aXNlLgotCShleHBfdHJpbm9wKTogTGlrZXdpc2UuCi0JKGV4cF91bm9wKTogTGlrZXdpc2UuCi0JKGV4cF9uYW1lb3ApOiBMaWtld2lzZS4KLQkoZXhwX2Fzc29wKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAobGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCk6IExpa2V3aXNlLgotCShpbml0X29zKTogTGlrZXdpc2UuCi0JKGxkbGFuZ19hZGRfdW5kZWYpOiBMaWtld2lzZS4KLQkoaW5zZXJ0X3BhZCk6IExpa2V3aXNlLgotCSogbGRmaWxlLmMgKGxkZmlsZV9hZGRfYXJjaCk6IERvbid0IGNhc3QgeG1hbGxvYyBhcmcgdG8KLQliZmRfc2l6ZV90eXBlLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJdCdzIGVhcm1hb3V0Yi5vLCBub3QgZWFybW91dGIuby4KLQotV2VkIEp1bCAxMiAxMTozMjoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5oIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBBZGQgc2VhcmNoIHBhcmFtZXRlciB0bwotCWRlY2xhcmF0aW9uLgotCShsZF9lbXVsYXRpb25feGZlcl90eXBlKTogQWRkIHNlYXJjaCBwYXJhbWV0ZXIgdG8KLQlvcGVuX2R5bmFtaWNfYXJjaGl2ZSBlbnRyeSBwb2ludC4KLQkqIGxkZW11bC5jIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBBZGQgc2VhcmNoIHBhcmFtZXRlci4KLQkqIGxkZmlsZS5jIChsZGZpbGVfdHJ5X29wZW5fYmZkKTogUmVuYW1lIGZyb20gdHJ5X29wZW5fYmZkLCBhbmQKLQltYWtlIG5vbi1zdGF0aWMuICBDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIG5ldyBuYW1lLgotCShsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IE1ha2Ugc3RhdGljLiAgSWYgZW50cnkgaXMgZHluYW1pYywgY2FsbAotCWxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZS4KLQkobGRmaWxlX29wZW5fZmlsZSk6IERvbid0IGNhbGwgbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlLgotCSogbGRmaWxlLmggKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogRG9uJ3QgZGVjbGFyZS4KLQkobGRmaWxlX3RyeV9vcGVuX2JmZCk6IERlY2xhcmUuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlBY2NlcHQgc2VhcmNoIHBhcmFtZXRlci4gIERvbid0IHNlYXJjaCBmb3IgYSBsaWJyYXJ5LCBqdXN0IGxvb2sgaW4KLQlhIHNpbmdsZSBwbGFjZS4KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCUxpa2V3aXNlLgotCi1UdWUgSnVsIDExIDE2OjQ0OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKHNldF9zY3JpcHRzX2Rpcik6IERvbid0IGJhc2Ugc2NyaXB0IGRpcmVjdG9yeSBvbgotCWN1cnJlbnQgZGlyZWN0b3J5LgotCi1UdWUgSnVsIDExIDEyOjI5OjAyIDE5OTUgIFJpY2sgU2xhZGtleSAgPGpyc0B3b3JsZC5zdGQuY29tPgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRG9uJ3QgcHJpbnQgdGhlIGxpbmUgbnVtYmVyIGlmIGl0IGlzbid0Ci0JbWVhbmluZ2Z1bC4KLQotTW9uIEp1bCAxMCAxMzozODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIGZpZWxkIHdhcm5fY29uc3RydWN0b3JzLgotCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBXYXJuIGlmIGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycy4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBMaWtld2lzZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC13YXJuLWNvbnN0cnVjdG9ycy4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC13YXJuLWNvbnN0cnVjdG9ycy4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBEb24ndAotCWdldCBjb25mdXNlZCBieSBkaXJlY3RvcnkgbmFtZXMgaWYgd2Ugc2VhcmNoZWQgZm9yIHRoZSBmaWxlLgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEguSi4gTHUgPGhqbEBueW5leHN0LmNvbT46Ci0JKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IEFkZCBuZXcgZmllbGQgZHluYW1pYy4KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBTZXQgZHluYW1pYyBmcm9tIGNvbmZpZy5keW5hbWljX2xpbmsuCi0JKiBsZGZpbGUuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBDaGVjayBkeW5hbWljIGZpZWxkIG9mIGVudHJ5LCBub3QgZ2xvYmFsCi0JZHluYW1pY19saW5rIGZpZWxkLiAgRG9uJ3QgZG8gYSBkeW5hbWljIHNlYXJjaCB3aGVuIGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluay4KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3Qgd2FybiBhYm91dCBkeW5hbWljX2xpbmsgZm9yIGEKLQlyZWxvY2F0ZWFibGUgbGluay4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFNraXAgZmlsZSBpZgotCWR5bmFtaWMgaXMgZmFsc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogQWx3YXlzCi0JbG9vcCBvdmVyIGlucHV0IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtQnN0YXRpYywgLUJkeW5hbWljLCAtQnNoYXJlZCwgYW5kCi0JLXNoYXJlZC4KLQotTW9uIEp1bCAxMCAxMzoyOTo0MyAxOTk1ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYWliLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBTZXQgbGlua19pbmZvLnN5bWJvbGljIHRvIGZhbHNlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLUJzeW1ib2xpYy4KLQotV2VkIEp1bCAgNSAwMDoxMjoxMSAxOTk1ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKEhBVkVfU0JSSyk6ICBEZWZpbmUgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0Ci0Jc3BlY2lmaWMgc3lzdGVtcyB0aGF0IGFyZSBrbm93biB0byBub3Qgc3VwcG9ydCBzYnJrLgotCShtYWluKTogIFVzZSBIQVZFX1NCUksgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBzYnJrLgotCi1UdWUgSnVsICA0IDEyOjU1OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKLQlIYW5kbGUgZXRyZWVfcHJvdmlkZS4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbG9iYWxfbmVlZGVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xvYmFsX2ZvdW5kKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBMaWtld2lzZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTogTGlrZXdpc2UuCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFJlcGxhY2UgYWZ0ZXJfb3Blbl9kZWZhdWx0IHdpdGgKLQlnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLgotCi1Nb24gSnVsICAzIDE0OjI2OjM3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXdpbjMyKTogTmV3IHRhcmdldC4KLQotTW9uIEp1bCAgMyAxNDozOToyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogTGV0IC1HIGVpdGhlciBzZXQgdGhlIHNtYWxsIGRhdGEgc2l6ZSBvcgotCWJlIGVxdWl2YWxlbnQgdG8gLS1zaGFyZWQsIGRlcGVuZGluZyBvbiB0aGUgbmV4dCBhcmd1bWVudC4gIEFjY2VwdAotCWFuZCBpZ25vcmUgLXogZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotU3VuIEp1bCAgMiAxNzo1MjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2FzdCBmb3BlbiByZXN1bHQgdG8gUFRSIGJlZm9yZSBzdG9yaW5nCi0JaXQgaW4gbGlua19pbmZvLmJhc2VfZmlsZS4gIEZpeCBpbmRlbnRhdGlvbi4KLQotV2VkIEp1biAyOCAxNzoxMToyNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IEFsd2F5cyBpbml0aWFsaXplIFBFIGluZm8gaW4gbGlua19pbmZvLgotCSogbGV4c3VwLmMgKE9QVElPTl9CQVNFX0ZJTEUpOiBOZXcgb3B0aW9uLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIG5ldyBvcHRpb24uCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoOiBPdXRwdXQgcGVpLgotCSogZW11bHRlbXBsL2kzODZwZS5lbTogQWRkIG5ld2xpbmUgdG8gZW5kLgotCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IENoYW5nZSBvdXRwdXQgYW5kIHF1b3RlIHRoZSAkcy4KLQkqIHNjcmlwdHRlbXBsL2kzODZwZS5zYzogQ2hhbmdlIG91dHB1dCBhbmQgcXVvdGUgdGhlICRzLgotCi1UaHUgSnVuIDIyIDE5OjU1OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdW4gTWF5ICA3IDExOjUzOjQxIE1EVCAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1tc2RvcyosIGkzODYtKi1tb3NzKik6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgaTM4Nm1zZG9zLm8uCi0JKGkzODZtc2Rvcy5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9pMzg2LW1zZG9zLm10OiBDcmVhdGVkLgotCSogZW11bHBhcmFtcy9pMzg2bXNkb3Muc2g6IENyZWF0ZWQuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2M6IENyZWF0ZWQuCi0KLVRodSBKdW4gMjIgMTU6MDY6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKC5maXh1cCk6IEFkZCBzdXBwb3J0IGZvciBhIC5maXh1cCBzZWN0aW9uCi0JdGhhdCBjb250YWlucyBwb2ludGVycyB0byBiZSByZWxvY2F0ZWQuCi0KLVR1ZSBKdW4gMjAgMTc6NDc6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctZXNoLmM6IE5ldyBmaWxlLCBtb2RpZmllZCBmb3IgTVBXIGZyb20gZXNoLmMuCi0JKiBzY3JpcHR0ZW1wbC9zaC5zYzogUmVmb3JtYXR0ZWQgdG8gc2ltcGxpZnkgTVBXaWZpY2F0aW9uLAotCXVzZSAqKCkgdG8gY29uY2F0IHN0YWIgc2VjdGlvbnMgaW5zdGVhZCBvZiBbXS4KLQotVGh1IEp1biAxNSAwODo0ODoxNiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1wZS5zYzogQWRkIGNvbnN0cnVjdG9yIHN1cHBvcnQuCi0KLVR1ZSBKdW4gMTMgMDk6MTE6MjAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6ICBBbnkgc2VjdGlvbiB3aXRoIGEgREFUQQotCXN0YXRlbWVudCBoYXMgY29udGVudHMuCi0KLVN1biBKdW4gMTEgMTU6MjA6NDYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tNjhrZWxmLnNoIChOT1ApOiBEZWZpbmUuCi0JKERZTkFNSUNfTElOSyk6IERvbid0IGRlZmluZS4KLQkoVEVYVF9TVEFSVF9BRERSKTogU2V0IHRvIDB4ODAwMDAwMDA7IHRoZSBleHRyYSAweDEwMCBmb3IgaGVhZGVycwotCXdpbGwgY29tZSBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1UaHUgSnVuICA4IDE0OjE3OjMzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2gsIHNjcmlwdGVtcGwvYXJtcGUuc2M6IEFkZCBlbmQgYW5kIHN0YWNrLgotCi1Nb24gSnVuICA1IDAyOjE2OjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWdudSopOiBVc2UgR05VIGVsZiBjb25maWcuCi0KLVRodSBNYXkgMjUgMTE6NDk6MjggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JRnJvbSBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCSogTWFrZWZpbGUuaW46IEZpeHVwIG1vcmUgZ290Y2hhcyBmcm9tIHJlbmFtaW5nIGVsZjMycHBjbGUgdG8KLQllbGYzMmxwcGMuCi0KLVdlZCBNYXkgMjQgMTE6MjM6MjEgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBBUk0tUEUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgYXJtcGUubwotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXJtcGUuCi0JKiBjb25maWcvYXJtLXBlLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IE5ldyBmaWxlLgotCi0KLU1vbiBNYXkgMjIgMTU6MTk6MjYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGg4MzAwaC0qLWhtcyk6IERlbGV0ZWQKLQkqIGNvbmZpZy9jZi1oODMwMGgubXQ6IERlbGV0ZWQuCi0KLVRodSBNYXkgMTggMDQ6MjY6MTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCUZyb20gRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlYXJtb3V0W2xiXS5vCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhcm17LGVbbGJdLSotYW91dC4KLQkqIGNvbmZpZy9hcm1bbGJdLWFvdXQubXQ6IE5ldyBmaWxlcy4KLQkqIGVtdWxwYXJhbXMvYXJtYW91dFtsYl0uc2g6IE5ldyBmaWxlcy4KLQkqIHNjcmlwdHRlbXBsL2FybWFvdXQuc2M6IE5ldyBmaWxlLgotCi1UdWUgTWF5IDE2IDE4OjI3OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3BwY2xlLWVsZjMyLm10IChFTVVMKTogVXNlIGVsZjMybHBwYywgbm90IGVsZjMycHBjbGUsIHRvCi0JYmUgdW5pcXVlIGluIDggY2hhcmFjdGVycyBmb3IgRE9TLgotCi0JKiBlbXVscGFyYW1zL2VsZjMybHBwYy5zaDogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBlbGYzMnBwY2xlLnNoLgotCSogZW11bHBhcmFtcy9lbGYzMnBwY2xlLnNoOiBEZWxldGVkLgotCi1GcmkgTWF5IDEyIDExOjAzOjU1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0JCQkgIFRvbSBHcmllc3QgPGdyaWVzdEBjcy55YWxlLmVkdT4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUEUgZXhlY3V0YWJsZXMgKGVnIE5ULCB3aW4zMikKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZ3VyZS5pbiwgZWkzODZwZSk6IEFkZCBzdXBwb3J0LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIFBFIGFyZ3VtZW50IGluZm8uCi0JKiBsZHdyaXRlLmMgKHByaW50X2ZpbGVfc3R1ZmYpOiBEb24ndCBwcmludCBvdXQgLmRyZWN0dmUKLQlhbmQgLmRlYnVnIHNlY3Rpb24gaW5mby4KLQkqIGxleHN1cC5jIChzZXRfc3Vic3lzdGVtLCBzZXRfc3RhY2tfaGVhcCwgT1BUSU9OX0hFQVAsCi0JIE9QVElPTl9TVUJTWVNURU0sIHBhcnNlX2FyZ3NtIHNldF9zdWJzeXN0ZW0sIHNldF9zdGFja19oZWFwKToKLQkgSGFuZGxlIG5ldyBhcmd1bWVudHMuCi0JKiBjb25maWcvaTM4Ni1wZS5tdCwgZW11bHRlbXBsL2kzODZwZS5lbSwgc2NyaXB0dGVtcGwvaTM4NnBlLnNjOgotCU5ldyBmaWxlcwotCi1XZWQgTWF5IDEwIDE4OjM3OjU5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjOiAgUmVtb3ZlIC5QQVJJU0MudW53aW5kIHNlY3Rpb24gZnJvbSB0ZXh0Ci0Jc2VnbWVudC4gIFRoaXMgYWxsb3dzIGxkIC1yIHRvIHByZXNlcnZlIHVud2luZCBzZWN0aW9ucy4KLQotVHVlIE1heSAgOSAxNzoxOTo1NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMycHBjbGUuby4KLQkoZWVsZjMycHBjbGUuYyk6IFN1cHBvcnQgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQy4KLQotCSogY29uZmlnL3BwY2xlLWVsZjMyLm10OiBOZXcgZmlsZSBmb3IgbGl0dGxlIGVuZGlhbiBQb3dlclBDLgotCSogZW11bHBhcmFtcy9lbGYzMnBwY2xlLnNoOiBEaXR0by4KLQotV2VkIE1heSAgMyAxMjo1NjozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hlY2sKLQlzdWJzZWN0aW9uX2FsaWdubWVudCwgaW5zdGVhZCBvZiBjaGVja2luZyBzZWN0aW9uX2FsaWdubWVudCB0d2ljZS4KLQlOb3RpY2VkIGJ5IEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1Pi4KLQotVHVlIE1heSAgMiAxNjozNjowNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLWxpdGVzKik6IEhhbmRsZSBsaWtlIGhwcGEqLSotKmVsZiouCi0KLU1vbiBBcHIgMjQgMTk6MjE6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGxkd3JpdGUuYyAobGR3cml0ZSk6IEJlZm9yZSBkb2luZyBhbnl0aGluZywgcmVzZXQgdGhlIGVycm9yCi0JY29kZS4gIElmIGJmZF9maW5hbF9saW5rIHJldHVybnMgYW4gZXJyb3IsIGJ1dCB0aGUgZXJyb3IgY29kZSBpcwotCXVuc2V0LCBkb24ndCBpc3N1ZSBhbiBleHRyYSBtZXNzYWdlLiAgQXNzdW1lIGEgY29ycmVjdCBlcnJvcgotCW1lc3NhZ2Ugd2FzIGFscmVhZHkgc2V0LgotCi1GcmkgQXByIDE0IDE2OjMxOjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtNjhrZWxmLm8uCi0JKGVtNjhrZWxmLm8pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL202OGstZWxmLm10LCBlbXVscGFyYW1zL202OGtlbGYuc2g6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHRoZW0gZm9yIG02OCotKi1lbGYuCi0KLVR1ZSBBcHIgMTEgMTI6MDI6MDMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCi0JKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQotCSogbXB3LWNvbmZpZy5pbiAoaTM4Ni11bmtub3duLWFvdXQpOiBDaGFuZ2UgdG8gaTM4Ni11bmtub3duLWdvMzIuCi0JKGkzODYtdW5rbm93bi1jb2ZmKTogUmVtb3ZlLgotCShzaC1oaXRhY2hpLWhtcyk6IE5ldyB0YXJnZXQuCi0JKGVtdWxhdGlvbl9vZmlsZXMpOiBTZXQgY29ycmVjdGx5IGZvciBlYWNoIHRhcmdldC4KLQkodmVyc2lvbiwgVERFRklORVMpOiBBZGQgdG8gbWFrZWZpbGUgZnJhZ21lbnQuCi0JKiBtcHctbWFrZS5pbiAoQklTT04pOiBVc2UgYnlhY2MgaW5zdGVhZCBvZiBiaXNvbi4KLQkoZW1fKi5jKTogUmVwbGFjZSB3aXRoIGUqLmMgZXZlcnl3aGVyZS4KLQkobGRncmFtLmgpOiBTZXBhcmF0ZSBhY3Rpb24gZnJvbSBsZGdyYW0uYyBnZW5lcmF0aW9uLgotCShMRF9QUk9HKTogRGVwZW5kIG9uIFZlcnNpb24uci4KLQkoVmVyc2lvbi5yKTogZ2VuZXJhdGUgZnJvbSB2ZXJzaW9uIGluZm8uCi0JKiBtcHctZW1pcHNpZHQuYzogTmV3IGZpbGUsIG1vZGlmaWVkIGZvciBNUFcgZnJvbSBlbWlwc2lkdC5jLgotCi0JKiBtcHctY29uZmlnLmluIChtNjhrLWFwcGxlLW1hY29zLCBwcGMtYXBwbGUtbWFjb3MsCi0gICAgICAgIGkzODYtdW5rbm93bi1hb3V0LCBpMzg2LXVua25vd24tY29mZik6IE5ldyB0YXJnZXRzLgotCShtNjhrLWFvdXQsIG02OGstY29mZik6IFJlbW92ZSB0YXJnZXRzLgotCShtay50bXApOiBBZGQgZGVmaW5pdGlvbiBvZiBFTVVMLgotCi0JKiBtcHctY29uZmlnLmluIChlbXVsbmFtZSk6IFNldCBiYXNlZCBvbiB0YXJnZXQuCi0JKGxkZW11bC1saXN0LmgpOiBDb25zdHJ1Y3QuCi0JKiBtcHctbWFrZS5pbiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IERlcGVuZCBvbiBpbnN0YWxsLW9ubHkuCi0KLQkqIG1wdy1tYWtlLmluIChiaW5kaXIpOiBGaXggcGF0aG5hbWUuCi0JKGluc3RhbGwpOiBNb3ZlIGhlcmUgZnJvbSBtcHctYnVpbGQuaW4uCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgY29uZmlndXJhdGlvbiBmcmFnbWVudC4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIG1ha2VmaWxlIGZyYWdtZW50LgotCShUaGlzIGZpbGUgaXMgc2VtaS1hdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluLikKLQkqIGxkZmlsZS5jIChzbGFzaCk6IElmIE1QVywgc2V0IHRvIGA6Jy4KLQkqIGxkbGV4LmwgKFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVEKTogSWYgTVBXLCBzZXQgdGhpcyB0bwotCXByZXZlbnQgcmVkZWZpbml0aW9uIGVycm9ycy4KLQotVHVlIEFwciAgNCAxNzo1NToxOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BiYW5nLmhhY2suY29tPgotCi0JKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBBbGlnbiBjbG9uZSBzZWN0aW9ucyBvbiBldmVuCi0JYm91bmRhcmllcy4KLQotVGh1IE1hciAzMCAxNDozMjoyNiAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKLQlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGJ1aWxkIGEgbGlua2VyIHdoaWNoIGRlZmF1bHRzIHRvIGEub3V0LgotCSogY29uZmlnL2kzODYtbGFvdXQubXQ6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcvaTM4Ni1saW51eC5tdC4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGVsZi5tdC4KLQkqIGNvbmZpZy9pMzg2LWxlbGYubXQ6IFJlbW92ZS4KLQotVGh1IE1hciAzMCAxMzowOTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogSWYgb3BlbmluZyB0aGUgbWFwIGZpbGUgZmFpbHMsIGNhbGwKLSAgICAgICAgYmZkX3NldF9lcnJvciBiZWZvcmUgY2FsbGluZyBlaW5mby4KLQotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgdGhlIC1uby1rZWVwLW1lbW9yeSBvcHRpb24uCi0KLU1vbiBNYXIgMjcgMTE6MTA6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IFJldmVydCBwYXRjaCBvZiBNYXJjaCAxMCwgc2luY2UgdGhlIFNWUjQgbGlua2VyCi0JZG9lcyBtYXJrIHNoYXJlZCBsaWJyYXJpZXMgYXMgZXhlY3V0YWJsZS4KLQotVHVlIE1hciAyMSAxNToxNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IENoYW5nZSBwb3dlciB0byBpbnQuICBQYXNzIGxhcmdlciB2YWx1ZXMKLQliZWZvcmUgc21hbGxlciB2YWx1ZXMuCi0JKGxhbmdfb25lX2NvbW1vbik6IFRyZWF0IGluZm8gYXMgaW50ICouICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yCi0JbGFzdCB2YWx1ZSwgc2luY2UgaXQgaXMgbm93IHplcm8uCi0KLVNhdCBNYXIgMTggMDE6NDk6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogQW4gZW1wdHkgYXJjaGl2ZSBpcyBPSy4KLQotRnJpIE1hciAxNyAxNjoxNTozMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChwcm9ncmVzcy5oKTogSW5jbHVkZS4KLQkobWFpbik6IENhbGwgU1RBUlRfUFJPR1JFU1MgYW5kIEVORF9QUk9HUkVTUy4KLQotVGh1IE1hciAxNiAxNzoxNzozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBNb3ZlIF9HT1QyX0VORF8gYWZ0ZXIgdGhlIC5jdG9ycyBhbmQKLQkuZHRvcnMgc2VjdGlvbnMsIHNvIHRoYXQgdGhlc2UgcG9pbnRlcnMgZ2V0IHJlbG9jYXRlZCBhbHNvLgotCURlZmluZSB0aGUgc3ltYm9scyBfX3tDLER9VE9SX3tMSVNULEVORH1fXyB0byBtYXJrIHRoZSBiZWdpbm5pbmcKLQlhbmQgZW5kIG9mIHRoZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuCi0KLVRodSBNYXIgMTYgMTM6NTk6MTQgMTk5NSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdT4KLQotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IElmIHdob2xlX2FyY2hpdmUgaXMgdHJ1ZSBhbmQgRU5UUlkKLQlkZXNjcmliZXMgYW4gYXJjaGl2ZSwgY2FsbCBiZmRfbGlua19hZGRfc3ltYm9scyBvbiBlYWNoIG1lbWJlci4KLQkqIGxkbWFpbi5jICh3aG9sZV9hcmNoaXZlKTogTmV3IHZhcmlhYmxlLgotCShtYWluKTogSW5pdGlhbGl6ZSBpdCB0byBmYWxzZS4KLQkqIGxkbWFpbi5oOiBEZWNsYXJlIHdob2xlX2FyY2hpdmUuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEdyb2sgLS13aG9sZS1hcmNoaXZlIHN3aXRjaC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0td2hvbGUtYXJjaGl2ZS4KLQotVGh1IE1hciAxNiAxMTozODo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdlbnNjcmlwdHMuc2ggKEVNVUxBVElPTl9OQU1FKTogU2V0IExJQl9QQVRIIHRvIGVtcHR5IHdoZW4gbm90Ci0JdXNpbmcgdGhlIGRlZmF1bHQgZW11bGF0aW9uLgotCi0JKiBjb25maWcvZGd1eC5taCAoSE9TVElOR19FTVUpOiBVc2UgLW0gcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHNldAotCUxERU1VTEFUSU9OLgotCSogY29uZmlnL2hwcGFlbGYubWggKEhPU1RJTkdfRU1VKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMTQgMTI6Mjg6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTZXQgZm9yY2VfbWFqCi0JZm9yIC1sYy5OLiAgRnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+LgotCi1GcmkgTWFyIDEwIDE0OjQzOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBzZXQgRVhFQ19QIGlmIGxpbmtfaW5mby5zaGFyZWQgaXMgc2V0LgotCi0JKiBsZGxleC5sOiBSZXR1cm4gLWxGSUxFTkFNRSBhcyB0aGUgdG9rZW4gTE5BTUUuCi0JKiBsZGdyYW0ueTogQWRkIHRva2VuIExOQU1FLgotCShpbnB1dF9saXN0KTogVHJlYXQgTE5BTUUgbGlrZSBOQU1FLCBidXQgcGFzcyBpdCB0bwotCWxhbmdfYWRkX2lucHV0X2ZpbGUgYXMgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHVzaW5nIC1sRklMRU5BTUUgaW4gSU5QVVQuCi0KLVRodSBNYXIgIDkgMTI6MjE6NTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IElmIHRoZSBhcmNoaXRlY3R1cmVzIGFyZSBjb21wYXRpYmxlIGNhbGwKLQliZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSB0byBsZXQgdGhlIGJhY2tlbmQgZG8gYWRkaXRpb25hbAotCWNoZWNrcy4KLQotVHVlIE1hciAgNyAwMDo1MzowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX21vZGUpOiBJZiBlbXVsYXRpb24gbm90IHJlY29nbml6ZWQsIGxpc3QKLQlhbGwgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLU1vbiBNYXIgIDYgMTQ6MDM6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX2xpc3RfZW11bGF0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkZW11bC5oIChsZGVtdWxfbGlzdF9lbXVsYXRpb25zKTogRGVjbGFyZS4KLQkqIGxkdmVyLmMgKGhlbHApOiBMaXN0IHN1cHBvcnRlZCB0YXJnZXRzIGFuZCBlbXVsYXRpb25zLgotCi1GcmkgTWFyICAzIDE1OjQwOjM2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoLmRlYnVnKTogUmVsb2NhdGUgdG8gYWRkcmVzcyAwLgotCSguZGVidWdfc3JjaW5mbywgLmRlYnVnX2FyYW5nZXMsIC5kZWJ1Z19wdWJuYW1lcywKLQkuZGVidWdfc2ZuYW1lcywgLmxpbmUpOiBMaWtld2lzZS4KLQotRnJpIE1hciAgMyAxNzowNzoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoaG9sZF9yZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBQbGFjZSByZWFkb25seSBzZWN0aW9ucyB3aXRoCi0JY29udGVudHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCAiLnJlbCIgYWZ0ZXIgaG9sZF9yZWwuICBSZW1vdmUgdGhlCi0JYXNzZXJ0aW9uIHdoaWNoIGNoZWNrZWQgZm9yIHVucGxhY2VkIC5yZWwgc2VjdGlvbnMuICBEb24ndCB0cnkgdG8KLQlzb3J0IHRoZSBzZWN0aW9uIGludG8gcGxhY2UgaWYgcGxhY2UtPmJmZF9zZWN0aW9uIGlzIE5VTEwuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBTZXQgaG9sZF9yZWwgdG8gdGhlIGZpcnN0Ci0Jc2VjdGlvbiBiZWdpbm5pbmcgd2l0aCAiLnJlbCIuCi0KLVRodSBNYXIgIDIgMTQ6MzQ6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRG9jIG5vdGUgZnJvbSBwaWVycmVAcGhpLmxhLnRjZS5jb20gKFBpZXJyZSBXaWxsYXJkKToKLQkqIGxkLnRleGluZm86IC1YIGFuZCAteCB3b3JrIGV2ZW4gaWYgLXMgb3IgLVMgYXJlIG5vdCBzcGVjaWZpZWQuCi0JKiBsZC4xOiBTaW1pbGFyIGNoYW5nZS4KLQotV2VkIE1hciAgMSAxMzo1MToxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCAoQ09GRl9DVE9SUyk6IERlZmluZS4KLQkqIHNjcmlwdHRlbXBsL2k5NjAuc2M6IFVzZSBDT0ZGX0NUT1JTIGlmIENPTlNUUlVDVElORy4KLQotVHVlIEZlYiAyOCAxMjo0Mjo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1saW51eGVsZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGkzODYtbGVsZi4KLQkoaVszNDVdODYtKi1nbnVlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWdlbGYuCi0JKiBjb25maWcvaTM4Ni1sZWxmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LWdlbGYubXQ6IE5ldyBmaWxlLgotCi1UdWUgRmViIDI4IDEwOjI3OjU0IDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYXRjaCBvbiBtaXBzLWVjb2ZmLCBhbmQgZGVmYXVsdCB0byB0aGUgSURUCi0JY29uZmlndXJhdGlvbi4KLQotRnJpIEZlYiAxNyAxMzowNjo0NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLmdvdDEgYW5kIC5nb3QyIHNlY3Rpb25zLgotCU9mZnNldCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gMzI3NjggZnJvbSB0aGUgc3RhcnQgb2YgdGhlIEdPVCBhcmVhCi0JdG8gZG91YmxlIHRoZSBzaXplIG9mIHRoZSB0YWJsZS4KLQotVGh1IEZlYiAgOSAxODoyOTo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG8gcmVjdXJzaXZlIGRlbGV0aW9uLCBzaW5jZSBsZHNjcmlwdHMKLQlpcyBhIGRpcmVjdG9yeS4KLQotVGh1IEZlYiAgOSAxMTozODoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogSWYgdHJhY2VfZmlsZV90cmllcyBpcyB0cnVlLCBhbmQgd2UgYXJlIHVzaW5nCi0JYW4gaW50ZXJuYWwgbGlua2VyIHNjcmlwdCwgcHJpbnQgb3V0IHRoZSBzY3JpcHQuCi0JKiBsZGZpbGUuYyAodHJ5X29wZW4pOiBSZWluZGVudCBmdW5jdGlvbi4gIE1ha2UgdGhlIG1lc3NhZ2VzIGFib3V0Ci0Jb3BlbmluZyBzY3JpcHQgZmlsZXMgbW9yZSBpbmZvcm1hdGl2ZS4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBGb3IgLVYsIGNhbGwgbGR2ZXJzaW9uIHdpdGggMSwgbm90IDAuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLVdlZCBGZWIgIDggMTc6MzQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogQWRqdXN0IHJlZmVyZW5jZXMgdG8gY29tbW9uIHN5bWJvbAotCWluZm9ybWF0aW9uIGZvciBuZXcgc3RydWN0dXJlLgotCi1Nb24gRmViICA2IDEyOjE3OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKHVuZGVmaW5lZF9zeW1ib2wpOiBIYW5kbGUgc2VjdGlvbiBiZWluZyBOVUxMLgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBIYW5kbGUgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLgotCSogbGRleHAuYyAoZm9sZF9uYW1lKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAocHJpbnRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCShsYW5nX2ZpbmlzaCk6IExpa2V3aXNlLgotCSogbGRtYWluLmMgKG11bHRpcGxlX2NvbW1vbik6IExpa2V3aXNlLgotCSogbGR3cml0ZS5jIChwcmludF9zeW1ib2wpOiBMaWtld2lzZS4gIEFsc28sIGJmZF9saW5rX2hhc2hfd2VhawotCXJlbmFtZWQgdG8gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsuCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIGNvcnJlY3RseQotCXdoZW4gLW4gb3IgLU4gaXMgdXNlZC4gIFBhdGNoIGZyb20gQ2hyaXMgRyBEZW1ldHJpb3UKLQk8Q2hyaXNfR19EZW1ldHJpb3VATEFHQVZVTElOLlBETC5DUy5DTVUuRURVPi4KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFNpbWlsYXIgY2hhbmdlLgotCi1UdWUgSmFuIDMxIDE2OjIwOjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDbGFyaWZ5IGVycm9yIG1lc3NhZ2Ugd2hlbiB1c2VyCi0Jc3BlY2lmaWVkIHN0YXJ0IGFkZHIgY29uZmxpY3RzIHdpdGggcmVnaW9uLiAgRml4IHJlc2V0dGluZyBvZgotCXJlZ2lvbiBwb2ludGVyLgotCi1UdWUgSmFuIDMxIDEyOjM3OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRleHAuYyAoZm9sZF9uYW1lKTogSW4gY2FzZSBOQU1FLCBwZXJtaXQgYW4gYWJzb2x1dGUgc3ltYm9sCi0JaW4gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0uCi0KLU1vbiBKYW4gMzAgMTE6MzM6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRGVwZW5kIHVwb24gY2xlYW4uICBEb24ndCBib3RoZXIgdG8KLQlyZW1vdmUgZmlsZXMgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGJ5IGNsZWFuLiAgRnJvbSBwYXRjaCBieQotCWFsYW5AU1BSSS5MZXZlbHMuVW5pU0EuRWR1LkF1IChBbGFuIE1vZHJhKS4KLQotRnJpIEphbiAyNyAxNjoyNzozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBGb3IKLQlhIE1JUFMgdGFyZ2V0LCBjbG9iYmVyIHRoZSBzaXplIG9mIGFsbCBidXQgdGhlIGZpcnN0IGlucHV0Ci0JLnJlZ2luZm8gc2VjdGlvbiB0byBiZSAwLCBzbyB0aGF0IGxhbmdfc2l6ZV9zZWN0aW9ucyBzZXRzIHRoZQotCWNvcnJlY3Qgc2l6ZSBmb3IgdGhlIG91dHB1dCAucmVnaW5mbyBzZWN0aW9uLgotCi1UaHUgSmFuIDI2IDE5OjUzOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpcy4KLQotVGh1IEphbiAyNiAxMjozMzowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYWJpLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IE5ldyBmaWxlIGZvciBQb3dlclBDIGVtYmVkZGVkIEFCSQotCXN1cHBvcnQuCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFNDUklQVF9OQU1FKTogVXNlIGVsZnBwYy5zYyBpbnN0ZWFkIG9mCi0JZWxmLnNjLCB3aGljaCBkZWZpbmVzIHNvbWUgbmV3IHN5bWJvbHMgUG93ZXJQQyBlbGYgbmVlZHMuCi0KLVR1ZSBKYW4gMjQgMTA6MzI6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBEb24ndCBkdW1wIGNvcmUgaWYgYQotCWNvbnN0cnVjdG9yIGVudHJ5IGlzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi1Nb24gSmFuIDIzIDEzOjU4OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWdudSopOiBTZXQgbGRfdGFyZ2V0IHRvIGkzODYtZ251LgotCSogY29uZmlnL2kzODYtZ251Lm10OiBOZXcgZmlsZS4gIEluY2x1ZGUgRUxGIHN1cHBvcnQuCi0KLVRodSBKYW4gMTkgMTY6MjI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogSWYKLQl0aGVyZSBhcmUgYW55IGlucHV0IHNlY3Rpb25zIG5hbWVkIC5nbnUud2FybmluZywgdHJlYXQgdGhlbSBhcwotCWNvbnRhaW5pbmcgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gYmUgcHJpbnRlZCBieSB0aGUgbGlua2VyLCBhbmQKLQljbG9iYmVyIHRoZSBzaXplIHNvIHRoYXQgdGhlIG1lc3NhZ2UgaXMgbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQKLQlmaWxlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgLmdudS53YXJuaW5nIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0Ci0Jc2VjdGlvbi4KLQotU3VuIEphbiAxNSAxNjo0NTowMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29uZmlndXJlLmluICh3NjUtKi0qKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUuCi0JKiBzY3JpcHR0ZW1wbC93NjUuc2M6IE5ldy4KLQkqIGNvbmZpZy9jb2ZmLXc2NS5tdDogTmV3LgotCi1UaHUgSmFuIDEyIDAxOjMyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfcGxhY2Vfb3JwaGFucyk6IERvbid0IGlnbm9yZSBmaWxlcyB3aXRoCi0JanVzdF9zeW1zX2ZsYWcgc2V0LiAgSW5zdGVhZCwgcHV0IGFsbCB0aGVpciBzZWN0aW9ucyBpbgotCWJmZF9hYnNfc2VjdGlvbl9wdHIsIHVzaW5nIHRoZSBzZWN0aW9uIFZNQSBhcyB0aGUgb3V0cHV0X29mZnNldC4KLQotV2VkIEphbiAxMSAyMjo1OTowOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBEb24ndCB1c2UgYGNvbnN0JyB3aXRoIHR5cGVkZWYKLQluYW1lIGByZWxvY19ob3d0b190eXBlJywgc2luY2UgaXQncyBub3cgZGVmaW5lZCB0byBiZSBjb25zdC4KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9yZWxvYyk6IERpdHRvLgotCSogbGRsYW5nLmggKGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUsIGxhbmdfYWRkX3JlbG9jKTogRGl0dG8uCi0KLVdlZCBKYW4gMTEgMTE6MjQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IEFkZGluZyBvciBzdWJ0cmFjdGluZyBhbiBhYnNvbHV0ZSB2YWx1ZQotCXRvIGEgcmVsYXRpdmUgdmFsdWUgZG9lcyBub3QgcmVxdWlyZSBmb3JjaW5nIHRoZSByZWxhdGl2ZSB2YWx1ZSB0bwotCWJlIGFic29sdXRlLiAgQWxzbywgcmVpbmRlbnQgZnVuY3Rpb24uCi0KLVdlZCBEZWMgMjggMjI6MDU6NTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogQ3JlYXRlIGEgc3ltYm9sIHdpdGggdGhlCi0Jc2FtZSBuYW1lIGFzIHRoZSBzZWN0aW9uLgotCi1Nb24gRGVjIDE5IDE0OjAyOjEzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkLmggKHNwbGl0X2J5X3JlbG9jLCBzcGxpdF9ieV9maWxlKTogTmV3IGZsYWdzLgotCSogbGR3cml0ZS5jICAoY2xvbmVfc2VjdGlvbiwgc3BsaXRfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb25zLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVbmRlcnN0YW5kIG5ldyBzcGxpdCBvcHRpb25zLgotCi1GcmkgRGVjICA5IDE3OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNb3ZlIC5jdG9ycyBhbmQgLmR0b3JzIGZyb20gLnRleHQgc2VnbWVudCB0bwotCS5kYXRhIHNlZ21lbnQuICBUaGV5IG11c3QgYmUgd3JpdGFibGUgd2hlbiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnkuICBGcm9tIEguSi4gTHUgPGhqbEBueW5leHN0LmNvbT4uCi0KLUZyaSBEZWMgIDIgMTQ6MDk6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL21pcG9zZWNvZmYuZW06IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9taXBzaWR0LnNoIChURU1QTEFURV9OQU1FKTogU2V0IHRvIG1pcHNlY29mZi4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdGwuc2ggKFRFTVBMQVRFX05BTUUpOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFB1dCAucmVsLnNkYXRhIHNlY3Rpb25zIGluIC50ZXh0LCBhbmQKLQlwcm92aWRlIF9fcnVudGltZV9yZWxvY19zdGFydCBhbmQgX19ydW50aW1lX3JlbG9jX3N0b3AgaWYgdGhleSBhcmUKLQl1c2VkLiAgIEFsaWduIF9mZGF0YSB0byBhIDE2IGJ5dGUgYm91bmRhcnkuCi0JKiBNYWtlZmlsZS5pbiAoZW1pcHNpZHQuYyk6IERlcGVuZCB1cG9uIG1pcHNlY29mZi5lbSByYXRoZXIgdGhhbgotCWdlbmVyaWMuZW0uCi0JKGVtaXBzaWR0bC5jKTogTGlrZXdpc2UuCi0JKGNoZWNrKTogUGFzcyBDQ19GT1JfSE9TVCBhbmQgQ0ZMQUdTX0ZPUl9IT1NUIHRvIHJ1bnRlc3QuCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBuZXcgZmllbGQgZW1iZWRkZWRfcmVsb2NzLgotCSogbGRlbXVsLmggKGxkZW11bF9hZnRlcl9vcGVuLCBhZnRlcl9vcGVuX2RlZmF1bHQpOiBEZWNsYXJlLgotCShsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkIGFmdGVyX29wZW4uCi0JKiBsZGVtdWwuYyAobGRlbXVsX2FmdGVyX29wZW4pOiBOZXcgZnVuY3Rpb24uCi0JKGFmdGVyX29wZW5fZGVmYXVsdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIGxkZW11bF9hZnRlcl9vcGVuLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1lbWJlZGRlZC1yZWxvY3MuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEluaXRpYWxpemUKLQluZXcgYWZ0ZXJfb3BlbiBmaWVsZCB0byBhZnRlcl9vcGVuX2RlZmF1bHQuCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbSwgZW11bHRlbXBsL2dsZDk2MC5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbSwgZW11bHRlbXBsL2hwcGFlbGYuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2xpbnV4LmVtLCBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0sIGVtdWx0ZW1wbC92YW5pbGxhLmVtOiBMaWtld2lzZS4KLQkqIGxkLnRleGluZm8sIGxkLjE6IE1lbnRpb24gLWVtYmVkZGVkLXJlbG9jcy4KLQotV2VkIE5vdiAyMyAyMjowNDo0NyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVzaGwuby4KLQkqIGNvbmZpZy9jb2ZmLXNoLm10OiBBZGQgc2hsIGVtdWxhdGlvbi4KLQotVHVlIE5vdiAyMiAxMTo1NTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRmlsbCAudGV4dCBzZWN0aW9uIHdpdGggTk9QUy4gIEZyb20gRXJpYwotCVlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPi4KLQotVGh1IE5vdiAxNyAxNDozOTo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gcGlya2VyQGVpdW5peC50dXdpZW4uYWMuYXQgKE1hcnRpbiBQaXJrZXIpLgotCSogY29uZmlnL2kzODZsaW51eC5taDogTmV3IGZpbGU7IHNldCBIT1NUSU5HX0NSVDAuCi0JKiBnZW5zY3JpcHRzLnNoOiBEb24ndCBwdXQgJHtsaWJkaXJ9IGluIExJQl9QQVRIIGlmIGl0IGlzCi0JL3Vzci9saWIsIHNpbmNlIHRoYXQgaXMgYWxyZWFkeSBpbiBMSUJfUEFUSC4KLQotV2VkIE5vdiAxNiAxMDowMzowMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAoLnRleHQpOiBIYW5kbGUgYSB1c2UgcmRlZmluZWQgdGV4dCBzdGFydAotCWFkZHJlc3MuCi0JKC5kYXRhLCAuYnNzKTogSWYgIi1OIiwgdGhlbiBwbGFjZSB0aGUgZGF0YS9ic3MganVzdCBhZnRlciB0aGUgZW5kCi0Jb2YgdGhlIC50ZXh0IHNlY3Rpb24gcmF0aGVyIHRoYW4gYXQgdGhlIGRlZmF1bHQgMHg0MDAwMDAwMC4KLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAoLnRleHQpOiBQbGFjZSB1bndpbmQgZGVzY3JpcHRvcnMgaW4gdGhlCi0JdGV4dCBzZWdtZW50LgotCi1TYXQgTm92IDEyIDE1OjU1OjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPjoKLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IERvbid0IHdhcm4gaWYgZW50cnkgc3ltYm9sIG5vdCBmb3VuZAotCXdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBXYXJuIGlmCi0JYXR0ZW1wdGluZyB0byBwbGFjZSBhbiBvcnBoYW5lZCByZWxvY2F0aW9uIHNlY3Rpb24gd2hlbiBnZW5lcmF0aW5nCi0JYSBkeW5hbWljYWxseSBsaW5rZWQgb2JqZWN0LgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBFTlRSWSgke0VOVFJZfSksIGFuZCBkZWZhdWx0ICR7RU5UUll9IHRvCi0JX3N0YXJ0LgotCi1GcmkgTm92IDExIDE0OjI3OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpZWxkIGV4cG9ydF9keW5hbWljLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLS1leHBvcnQtZHluYW1pYy4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVBhc3MgZXhwb3J0X2R5bmFtaWMgYXJndW1lbnQgdG8gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQotV2VkIE5vdiAgOSAxMjo0NzoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBTZXQgU0VDX0FMTE9DIGluIGFueSBzZWN0aW9uIHdoZXJlCi0Jd2UgYWxsb2NhdGUgY29tbW9uIHN5bWJvbHMuCi0KLVR1ZSBOb3YgIDggMTc6NTA6NDMgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljQGFpYi5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIC5yZWwuaW5pdCwgLnJlbGEuaW5pdCwgLnJlbC5maW5pLCBhbmQKLQkucmVsYS5maW5pIHRvIHRoZSBsaXN0IG9mIC5yZWwqIHNlY3Rpb25zLgotCi1UdWUgTm92ICA4IDE3OjQ3OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IEFkZCBuZXcgYXJndW1lbnQgcGxhY2UuICBPbmx5IGFjY2VwdAotCWxpbmtlciBzY3JpcHRzIGlmIHBsYWNlIGlzIG5vdCBOVUxMLiAgUHV0IGNvbW1hbmRzIGZvdW5kIGluIGFuCi0JYXNzdW1lZCBsaW5rZXIgc2NyaXB0IGludG8gcGxhY2UuCi0JKGxvb2t1cF9uYW1lKTogUGFzcyBOVUxMIGFzIHBsYWNlIGFyZ3VtZW50IHRvIGxvYWRfc3ltYm9scy4KLQkob3Blbl9pbnB1dF9iZmRzKTogSW4gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bSBjYXNlLCBwYXNzIGEgcGxhY2UKLQlhcmd1bWVudCB0byBsb2FkX3N5bWJvbHMsIGFuZCBzdG9yZSBhbnkgbmV3IHN0YXRlbWVudHMgYWZ0ZXIgdGhlCi0JY3VycmVudCBvbmUuCi0KLU1vbiBOb3YgIDcgMTU6NTM6MDIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogQnVtcCB0byAyLjUuMy4KLQotRnJpIE5vdiAgNCAxNToxMToyNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZSpuYnNkLmMpOiBGaXggdHlwbyBpbiBkZXBlbmRlbmNpZXMuCi0KLVRodSBOb3YgIDMgMTk6MzU6NDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogQWRkIG1pc3NpbmcgImVsc2UgdHJ1ZSIgY2xhdXNlLgotCi0JKiBlbXVscGFyYW1zL3ZheC5zaCAoT1VUUFVUX0ZPUk1BVCk6IFVzZSAiYS5vdXQiLgotCi0JKiBzY3JpcHR0ZW1wbC9nbzMyY29mZi5zYzogQ2hhbmdlcyBmcm9tIERKIERlbG9yaWU6IENoYW5nZSBkZWZhdWx0Ci0JZW50cnkgcG9pbnQgdG8gInN0YXJ0Ii4gIEFsaWduIGF0IGVuZCBvZiBlYWNoIHNlY3Rpb24gdG8gMHgyMDAuCi0JU3RhcnQgLnRleHQgc2VjdGlvbiAweDEwMDAgbGF0ZXIuICBBZGQgX2V0ZXh0LCBfZWRhdGEsIF9lbmQKLQlzeW1ib2xzLgotCi1XZWQgTm92ICAyIDEyOjE3OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogRG9uJ3QgcGVybWl0IGEgc2V0IHRvIGJlCi0JY29tcG9zZWQgb2YgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMuCi0JKGxkY3Rvcl9idWlsZF9zZXRzKTogSWYgdGhlIG91dHB1dCBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUKLQlyZWxvYywgYW5kIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0cnkgZ2V0dGluZwotCXRoZSByZWxvYyBmcm9tIHRoZSBpbnB1dCBmb3JtYXQuCi0KLVR1ZSBOb3YgIDEgMTA6MzA6MTkgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbTY4a25ic2Quby4KLQkgIChlbTY4a25ic2QuYyk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZy9tNjhrLW5ic2QubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9tNjhrbmJzZC5zaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKG02OCotKi1uZXRic2QqKTogVXNlIGFib3ZlIGNvbmZpZ3MuCi0KLU1vbiBPY3QgMzEgMTk6MzU6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBJZiB3ZSBmaW5kIGFuCi0JYXBwcm9wcmlhdGVseSBuYW1lZCBzdGF0aWMgbGlicmFyeSwgc3RvcCB0aGUgc2VhcmNoIGF0IHRoYXQKLQlkaXJlY3RvcnkuCi0KLVdlZCBPY3QgMjYgMTM6NTk6MTIgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlaTM4Nm5ic2QubywgZW5zMzJrbmJzZC5vCi0JICBhbmQgZXNwYXJjbmJzZC5vOyBzb3J0ZWQgZW50cmllcy4KLSAgICAgICAgICAoZWkzODZuYnNkLmMsZW5zMzJrbmJzZC5jLGVzcGFyY25ic2QuYyk6IE5ldyB0YXJnZXRzLgotCi0JKiBjb25maWcvbmV0YnNkNTMyLm10OiBSZW1vdmVkLgotCSogZW11bHBhcmFtcy9uZXRic2Q1MzIuc2g6IFJlbW92ZWQuCi0KLQkqIGNvbmZpZy97aTM4Ni1uYnNkLm10LG5zMzJrLW5ic2QubXQsc3BhcmMtbmJzZC5tdH06IE5ldyBmaWxlcy4KLQkqIGVtdWxwYXJhbXMve2kzODZuYnNkLnNoLG5zMzJrbmJzZC5zaCxzcGFyY25ic2Quc2h9OiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbmV0YnNkKiwgbnMzMmstcGM1MzItbmV0YnNkKiwKLQkgIHNwYXJjKi0qLW5ldGJzZCopOiBVc2UgYWJvdmUgY29uZmlncy4KLQotVHVlIE9jdCAyNSAxMTo0NzoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9jb21tb24pOiBPbmUgb2YgdGhlIHR5cGVzIG1heSBub3cgYmUKLQliZmRfbGlua19oYXNoX2luZGlyZWN0LiAgVGhlIG9sZCBCRkQgYXJndW1lbnQgbWF5IGJlIE5VTEwuCi0KLVRodSBPY3QgMjAgMjI6MDE6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqIGF0IHRoZSBlbmQgb2YgbTY4ay1ocC1ocHV4LgotCi1UdWUgT2N0IDE4IDE1OjU4OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubDogQ2FzdCBhc3NpZ25tZW50IHRvIHl5X2NoX2J1ZiBmaWVsZCB0byBjaGFyICosIG5vdCB0bwotCVlZX0NIQVIgKi4KLQotTW9uIE9jdCAxNyAxNDo1MzoxNiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL253LnNjOiBHYXRoZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQKLQkgIGRlZmluZSBfX0NUT1JfX0xJU1RfXyBhbmQgX19EVE9SX0xJU1RfXyBhcHByb3ByaWF0ZWx5LgotCi1GcmkgT2N0IDE0IDE0OjM1OjM4IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVpMzg2bncubyBhbmQgZXBwY253Lm8uCi0JICAoZWkzODZudy5jLCBlcHBjbncuYyk6IE5ldyB0YXJnZXRzLgotCi0JKiBjb25maWcve2kzODYscHBjfS1udy5tdCwgZW11bHBhcmFtcy97aTM4NixwcGN9bncuc2gsCi0JICBzY3JpcHR0ZW1wbC9udy5zYzogTmV3IGZpbGVzLCBmb3IgaTM4NiBhbmQgcG93ZXJwYyBuZXR3YXJlLgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZWQgbmV0d2FyZSBsZF90YXJnZXQgbmFtZSB0byBiZSB7aTM4NixwcGN9LW53Ci0JICBpbnN0ZWFkIG9mIHtpMzg2LHBwY30tZWxmLgotCi0gCSogY29uZmlndXJlLmluIChzcGFyYyotKi1uZXR3YXJlKTogUmVtb3ZlZC4gIFRoZXJlIGlzIG5vIHN1Y2gKLQkgIHRoaW5nIGFueW1vcmUuCi0KLQkqIGxkaW50LnRleGluZm86IE1vdmUgbWlzcGxhY2VkIGBAZW5kIGlmdGV4Jy4KLQotRnJpIE9jdCAxNCAxMjowMjoxOCAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWNAYWliLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgLnJlbC5jdG9ycywgLnJlbGEuY3RvcnMsIC5yZWwuZHRvcnMsIGFuZAotCS5yZWxhLmR0b3JzIHRvIHRoZSBsaXN0IG9mIC5yZWwqIHNlY3Rpb25zLgotCi1UaHUgT2N0IDEzIDE0OjE2OjI3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFVwZGF0ZSB0byB2ZXJzaW9uIDIuNS4KLQkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgotCi0JKiBjb25maWd1cmUuaW4gKGFsbF90YXJnZXRzKTogSGFuZGxlIGkzODYtbGludXgqLgotCi1UaHUgT2N0IDEzIDExOjI0OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogU2V0IF9ldGV4dCBhbmQgX19ldGV4dCB0byAuLCBub3QKLQkke0RBVEFfQUxJR05NRU5UfS4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFN1bk9TLCBhbmQsIHdpdGggbHVjaywKLQl3aWxsIG5vdCBicmVhayBhbnkgb3RoZXIgc3lzdGVtLiAgRnJvbSBFcmljIFZhbGV0dGUKLQk8ZXZAY2hvcnVzLmZyPi4KLQotV2VkIE9jdCAxMiAxNjoyMjo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2hhbmdlIC1WIHRvIGJlIGEgc3lub255bSBmb3IgLXYuICBBZGQKLQktLXZlcmJvc2UgdG8gZ2V0IHRoZSBvbGQgLVYgYmVoYXZpb3VyLgotCSogbGQuMSwgbGQudGV4aW5mbzogRG9jdW1lbnQgdGhpcyBjaGFuZ2UuCi0KLVR1ZSBTZXAgMjcgMTQ6NTY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlbW92ZQotCWFzc2VydGlvbiwgc2luY2UgaXQgY291bGQgZmFpbCB3aXRoIGEgdXNlciBkZWZpbmVkIGxpbmtlciBzY3JpcHQuCi0KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IEZvciBERUZJTkVEIGNhc2UsIGRvbid0IHRyeSB0byBsb29rIHVwIHRoZQotCW5hbWUgaW4gdGhlIGhhc2ggdGFibGUgZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS0tdGhlIGhhc2ggdGFibGUgZG9lcwotCW5vdCBldmVuIGV4aXN0IGF0IHRoYXQgcG9pbnQsIG11Y2ggbGVzcyBoYXZlIHRoZSByaWdodCB2YWx1ZS4KLQotCSogTWFrZWZpbGUuaW4gKENDKTogRGVmaW5lLgotCShDWFgpOiBNb3ZlIGRlZmluaXRpb24sIGNoYW5nZSBmcm9tIGcrKyB0byBnY2MuCi0JKEVYUEVDVCwgUlVOVEVTVCk6IENvcHkgZGVmaW5pdGlvbnMgZnJvbSB0b3AgbGV2ZWwgTWFrZWZpbGUuaW4uCi0JKFJVTlRFU1RfQ0MsIFJVTlRFU1RfQ0ZMQUdTKTogUmVtb3ZlLgotCShSVU5URVNUX0NYWCwgUlVOVEVTVF9DWFhGTEFHUyk6IFJlbW92ZS4KLQkoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiBDb3B5IGZyb20gdG9wIGxldmVsIE1ha2VmaWxlLmluLgotCSguY2Mubyk6IENvbW1lbnQgb3V0LgotCSh0ZXN0ZGlyKTogUmVtb3ZlLgotCShzaXRlLmV4cCk6IERvbid0IGNyZWF0ZSB0ZXN0ZGlyIG9yIHNldCB0bXBkaXIuCi0JKGNoZWNrKTogUnVuIGNoZWNrcyBldmVuIGlmIG5vdCBydW5uaW5nIG5hdGl2ZS4gIFVzZSBDQ19GT1JfVEFSR0VUCi0JaW5zdGVhZCBvZiBSVU5URVNUX0NDLCBhbmQgbGlrZXdpc2UgZm9yIENYWC4KLQkoY2R0ZXN0IHRhcmdldHMpOiBDb21tZW50IG91dC4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSE9TVElOR19MSUJTKTogT25seSBtZW50aW9uIGNydGVuZC5vIG9uY2UuCi0JKiBjZHRlc3QtYmFyLmNjLCBjZHRlc3QtZm9vLmNjLCBjZHRlc3QtZm9vLmg6IFJlbW92ZS4KLQkqIGNkdGVzdC1tYWluLmNjLCBjZHRlc3QuZXhwOiBSZW1vdmUuCi0KLU1vbiBTZXAgMjYgMTE6NDA6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaDogUmVuYW1lIGZyb20gZWxmMzJtaXBiLnNoIHRvIGF2b2lkIERPUwotCWZpbGUgbmFtaW5nIHByb2JsZW1zLgotCSogZW11bHBhcmFtcy9lbGYzMmxtaXAuc2g6IFJlbmFtZSBmcm9tIGVsZjMybWlwbC5zaC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IFJlbmFtZSBlZWxmMzJtaXBiLm8gdG8KLQllZWxmMzJibWlwLm8gYW5kIGVlbGYzMm1pcGwubyB0byBlZWxmMzJsbWlwLm8uCi0JKGVlbGYzMmJtaXAuYyk6IFJlbmFtZSBmcm9tIGVlbGYzMm1pcGIuYy4gIFVzZSBlbGYzMmJtaXAuc2guCi0JKGVlbGYzMmxtaXAuYyk6IFJlbmFtZSBmcm9tIGVlbGYzMm1pcGwuYy4gIFVzZSBlbGYzMmxtaXAuc2guCi0JKiBjb25maWcvbWlwc2ItZWxmMzIubXQgKEVNVUwpOiBVc2UgZWxmMzJibWlwLCBub3QgZWxmMzJtaXBiLgotCSogY29uZmlnL21pcHNsLWVsZjMyLm10IChFTVVMKTogVXNlIGVsZjMybG1pcCwgbm90IGVsZjMybWlwbC4KLQotCSogZ2Vuc2NyaXB0cy5zaDogQWx3YXlzIHNlYXJjaCAvdXNyL2xvY2FsL1RBUkdFVC9saWIuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSWYgLU4gaXMgc2V0LCBmb3JjZSBEQVRBX0FERFIgdG8gYmUgIi4iLgotCi1GcmkgU2VwIDIzIDE1OjA1OjQ5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGkzODYtYnNkaSogdGFyZ2V0cyBsaWtlIGkzODYtYnNkLgotCi1GcmkgU2VwIDIzIDAwOjA2OjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgLWEgZm9yIEhQL1VYCi0JY29tcGF0aWJpbGl0eS4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiAtYyB0YWtlcyBhbiBhcmd1bWVudC4KLQotVHVlIFNlcCAyMCAxNDozNToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBuZXcgZmllbGQgZW5kaWFuLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLUVCIGFuZCAtRUwgYnkgc2V0dGluZwotCWNvbW1hbmRfbGluZS5lbmRpYW4uCi0JKiBsZGdyYW0ueSAoaWZpbGVfcDEpOiBBY2NlcHQgT1VUUFVUX0ZPUk1BVCB3aXRoIHRocmVlIGFyZ3VtZW50cy4KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KTogQWRkIGFyZ3VtZW50cyBiaWcgYW5kIGxpdHRsZS4KLQlJZiBjb21tYW5kX2xpbmUuZW5kaWFuIGlzIHNldCwgdXNlIGl0IHRvIHNlbGVjdCBiaWcgb3IgbGl0dGxlCi0JcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCSogbGRsYW5nLmggKGxhbmdfYWRkX291dHB1dF9mb3JtYXQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zaDogRGVmaW5lIEJJR19PVVRQVVRfRk9STUFUIGFuZAotCUxJVFRMRV9PVVRQVVRfRk9STUFULgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGwuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzYmlnLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2JzZC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21pcHNpZHQuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzaWR0bC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21pcHNsaXQuc2g6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBEZWZpbmUgQklHX09VVFBVVF9GT1JNQVQgYW5kCi0JTElUVExFX09VVFBVVF9GT1JNQVQgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIFBhc3MgdGhlbSB0bwotCU9VVFBVVF9GT1JNQVQuCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBQYXNzIEJJR19PVVRQVVRfRk9STUFUIGFuZAotCUxJVFRMRV9PVVRQVVRfRk9STUFUIHRvIE9VVFBVVF9GT1JNQVQuCi0JKiBzY3JpcHR0ZW1wbC9taXBzYnNkLnNjOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKGxkZ3JhbS5oKTogTWFrZSBzZXBhcmF0ZSB0YXJnZXQgZnJvbSBsZGdyYW0uYywKLQlkZXBlbmRpbmcgdXBvbiBsZGdyYW0uYywgc28gdGhhdCBhIHBhcmFsbGVsIG1ha2UgZG9lcyBub3QgdHJ5IHRvCi0JYnVpbGQgYm90aCBhdCBvbmNlLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqZWwtZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMybWlwYi5vIGFuZCBlZWxmMzJtaXBsLm8uCi0JKGVlbGYzMm1pcGwuYyk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZy9taXBzbC1lbGYzMi5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwbC5zaDogTmV3IGZpbGUuCi0KLUZyaSBTZXAgMTYgMTI6MTY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAobWFpbik6IFJhdGhlciB0aGFuIHByb2hpYml0aW5nIGxkIC1yIC1zLCB0cmVhdCBpdCBhcwotCWxkIC1yIC1TIC14LgotCi1UaHUgU2VwIDE1IDEzOjA1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IFByaW50IEJGRCBmaWxlIG5hbWUgYXMgd2VsbCBhcyBmaWxlIG5hbWUKLQlyZXR1cm5lZCBieSBmaW5kX25lYXJlc3RfbGluZSwgaW4gY2FzZSB0aGUgZmlsZSBuYW1lIGlzIHNvbWV0aGluZwotCXVuaGVscGZ1bCBzdWNoIGFzIGEgLmggZmlsZS4gIEhhbmRsZSAldS4KLQotV2VkIFNlcCAxNCAxMjo0OToxMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19kb19hc3NpZ25tZW50cyk6IE1ha2Ugc3VyZSBvdXRwdXQgc3RhdGVtZW50Ci0JaGFzIGFuIGF0dGFjaGVkIGJmZF9zZWN0aW9uIGJlZm9yZSB0cnlpbmcgdG8gZGVyZWZlcmVuY2UgaXQuCi0KLVdlZCBTZXAgMTQgMTI6NDg6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBuZXcgZmllbGQgd2Fybl9vbmNlLgotCSogbGRtYWluLmMgKHVuZGVmaW5lZF9zeW1ib2wpOiBIYW5kbGUgLXdhcm4tb25jZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC13YXJuLW9uY2UuCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogRG9jdW1lbnQgLXdhcm4tb25jZS4KLQkqIGxkLjE6IExpa2V3aXNlLgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogSGFuZGxlICVEIGFzICVDLCBidXQgbmV2ZXIgcHJpbnQgdGhlIGZ1bmN0aW9uCi0JbmFtZS4gIEZvciAlQywgcHJpbnQgdGhlIGZ1bmN0aW9uIG5hbWUgb24gYSBzZXBhcmF0ZSBsaW5lLCB0byBrZWVwCi0JdGhlIGxlbmd0aCBvZiBlcnJvciBtZXNzYWdlcyB1bmRlciBjb250cm9sLgotCSogbGRtYWluLmMgKG11bHRpcGxlX2RlZmluaXRpb24pOiBVc2UgJUQgZm9yIGBgZmlyc3QgZGVmaW5lZAotCWhlcmUuJycKLQkodW5kZWZpbmVkX3N5bWJvbCk6IFVzZSAlRCBmb3IgYGBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzCi0JZm9sbG93JycuCi0KLQkqIGxkbWlzYy5jIChtdWx0aXBsZV93YXJuKTogUmVtb3ZlOyBubyBsb25nZXIgdXNlZC4KLQkqIGxkbWlzYy5oIChtdWx0aXBsZV93YXJuKTogRG9uJ3QgZGVjbGFyZS4KLQotVHVlIFNlcCAxMyAyMDo0Nzo1OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUHJpbnQgYWxsIGxpbmVzCi0JdG8gdGhlIG1hcCBmaWxlLgotCi1UdWUgU2VwIDEzIDE2OjMwOjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IENoZWNrIGZvciBhcmNoaXZlIGJlZm9yZSBvYmplY3QuICBVc2UKLQliZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMsIGFuZCwgaWYgYW1iaWd1b3VzLCBwcmludCBhIGxpc3Qgb2YKLQltYXRjaGluZyBmb3JtYXRzLiAgSWYgZmlsZSBmb3JtYXQgaXMgbm90IHJlY29nbml6ZWQsIHRyZWF0IGZpbGUgYXMKLQlhIGxpbmtlciBzY3JpcHQuCi0JKiBsZGdyYW0ueSAoeXllcnJvcik6IElmIGFzc3VtaW5nIGFuIG9iamVjdCBmaWxlIGlzIGEgc2NyaXB0LAotCW1lbnRpb24gdGhhdC4gIFR3ZWFrIHRoZSBmb3JtYXQgb2YgdGhlIGVycm9yIG1lc3NhZ2VzLgotCSogbGRsZXgubCAobGV4X3dhcm5faW52YWxpZCk6IElmIGFzc3VtaW5nIGFuIG9iamVjdCBpcyBhIHNjcmlwdCwKLQlndWVzcyB0aGF0IHRoaXMgaXMgbm90IGFjdHVhbGx5IGEgc2NyaXB0LCBhbmQganVzdCByZXBvcnQgdGhhdCB0aGUKLQlmaWxlIGZvcm1hdCB3YXMgbm90IHJlY29nbml6ZWQuCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQWRtaXQgdGhhdCAtKCBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZS4KLQlBZGQgbm90ZSB0aGF0IHVucmVjb2duaXplZCBvYmplY3QgZmlsZXMgYXJlIG5vdyB0cmVhdGVkIGFzIGxpbmtlcgotCXNjcmlwdHMuCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOiBNYWtlIGNvbnN0LgotCShsZGZpbGVfYXNzdW1lZF9zY3JpcHQpOiBOZXcgdmFyaWFibGUuCi0JKHRyeV9vcGVuKTogQ2hhbmdlIGFyZ3VtZW50cyB0eXBlcyB0byBjb25zdC4KLQkobGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKTogTGlrZXdpc2UuCi0JKGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSk6IExpa2V3aXNlLiAgQWxzbywgc2V0IGxpbmVubyB0byAxLgotCSogbGRmaWxlLmg6IFVwZGF0ZSBkZWNsYXJhdGlvbnMgZm9yIGxkZmlsZS5jIGNoYW5nZXMuCi0JKiBsZGxleC5sOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoZmlsZV9uYW1lX3N0YWNrKTogQ2hhbmdlIHRvIGJlIGNvbnN0IGNoYXIgKi4KLQkobGluZW5vX3N0YWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoPDxFT0Y+Pik6IFNldCBsaW5lbm8gYXMgd2VsbCBhcyBsZGZpbGVfaW5wdXRfZmlsZW5hbWUuCi0JKGxleF9wdXNoX2ZpbGUpOiBNYWtlIG5hbWUgYXJndW1lbnQgY29uc3QuICBJbml0aWFsaXplCi0JbGluZW5vX3N0YWNrIGVudHJ5LgotCShsZXhfcmVkaXJlY3QpOiBJbml0aWFsaXplIGxpbmVub19zdGFjayBlbnRyeS4KLQkobGV4X3dhcm5faW52YWxpZCk6IEhhbmRsZSBub24gcHJpbnRhYmxlIGNoYXJhY3RlcnMgbmljZWx5LgotCSogbGRsZXguaCAobGV4X3B1c2hfZmlsZSk6IERlY2xhcmUgc2Vjb25kIGFyZ3VtZW50IGFzIGNvbnN0LgotCi0JKiBsZGdyYW0ueSAoaWZpbGVfcDEpOiBSZWNvZ25pemUgR1JPVVAuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgR1JPVVAuCi0JKiBsZC50ZXhpbmZvIChPcHRpb24gQ29tbWFuZHMpOiBEb2N1bWVudCBHUk9VUC4KLQotTW9uIFNlcCAxMiAxNzowNDoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tNjhrbHlueC5taDogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMTIgMDE6NTA6MDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBBZGQgbmV3bGluZXMgdG8gdGhlIGVycm9yIG1lc3NhZ2VzLgotCi1TYXQgU2VwIDEwIDE2OjA1OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODZseW54Lm1oOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2kzODZseW54LnNjOiBEb24ndCBwdXQgLmN0b3JzIGFuZCAuZHRvcnMgaW4gLnRleHQKLQl1bmxlc3MgQ09OU1RSVUNUSU5HLgotCi1UaHUgU2VwICA4IDEzOjI1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCi0JKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZSBhcyB5ZXMuCi0JKERZTkFNSUNfTElOSyk6IERlZmluZSBhcyBmYWxzZS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKToKLQlJbml0aWFsaXplIGNvbmZpZy5keW5hbWljX2xpbmsgdG8gRFlOQU1JQ19MSU5LIGlmIGl0IGlzIGRlZmluZWQuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlc2V0IHN0YXRfcHRyIGF0IGVuZC4KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJtaXBiLmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSByYXRoZXIgdGhhbgotCWdlbmVyaWMuZW0uCi0KLVRodSBTZXAgIDggMTY6MzA6MzcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2g4NTAwYi5zYzogUHV0IHJkYXRhIHN0dWZmIGludG8gb3duIHNlZ21lbnQuCi0KLVRodSBTZXAgIDggMTM6MjU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBEb24ndCBkZWZpbmU7Ci0JLmdvdCBzZWN0aW9uIGlzIG5vdyBleHBsaWNpdGx5IGhhbmRsZWQgaW4gZWxmLnNjLgotCi1XZWQgU2VwICA3IDEzOjA4OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IFJlZG8gc2NyaXB0IHRvIHNldCAuIG91dHNpZGUgb2Ygc2VjdGlvbnMKLQlhbmQgbm90IGJvdGhlciB0byBleHBsaWNpdGx5IHNwZWNpZnkgc2VjdGlvbiBhZGRyZXNzZXMuCi0JRXhwbGljaXRseSBwbGFjZSAuc2RhdGEgc2VjdGlvbi4KLQotVHVlIFNlcCAgNiAyMzo1MTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBQdXQgLmJzcyBpbiBkYXRhIHNlZ21lbnQuCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBDaGFuZ2UgLnN0YWIgYW5kIC5zdGFic3RyIHRvIHVzZSBhIFZNQSBvZgotCTAsIGFuZCB0byBvbmx5IGJlIG1hcmtlZCBhcyBOT0xPQUQgaWYgcmVsb2NhdGluZy4KLQkqIHNjcmlwdHRlbXBsL2g4NTAwLnNjLCBzY3JpcHR0ZW1wbC9oODUwMGIuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvaDg1MDBjLnNjLCBzY3JpcHR0ZW1wbC9oODUwMG0uc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvaDg1MDBzLnNjLCBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYywgc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MsIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL3NoLnNjLCBzY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjOiBMaWtld2lzZS4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCAoZGlzYWJsZWQpIHRoZSBBUk0vUklTQ2lYLgotCSogY29uZmlnL3Jpc2NpeC5tdCwgZW11bHBhcmFtcy9yaXNjaXguc2gsIHNjcmlwdHRlbXBsL3Jpc2NpeC5zYzoKLQlOZXcgZmlsZXMuCi0KLVR1ZSBBdWcgMzAgMTE6NDg6MDggMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZmllbGQgc29uYW1lLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLXNvbmFtZSBhcmd1bWVudC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogSW4gY2FsbCB0byBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zLAotCXBhc3Mgc29uYW1lLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgLXNvbmFtZS4KLQotTW9uIEF1ZyAyOSAxNToyMTo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogRG9uJ3QgdHJ5IHRvIHNldCB0aGUgYXJjaGl0ZWN0dXJlIGlmIHRoZQotCWlucHV0IGFuZCBvdXRwdXQgZmlsZXMgYXJlIGluY29tcGF0aWJsZS4gIEp1c3Qgd2Fybi4KLQotV2VkIEF1ZyAyNCAxMjo1MjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLVN1biBBdWcgMjEgMTY6MTc6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2hwM2hwdXguc2g6IERlZmluZSBfX0RZTkFNSUMgdG8gYmUgMC4KLQotVGh1IEF1ZyAxOCAxNTozNzo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlNYWtlIHRoZSBFTEYgbGlua2VyIGhhbmRsZSBvcnBoYW5lZCBzZWN0aW9ucyByZWFzb25hYmx5LiAgQWxzbywKLQlkZWZpbmUgX19zdGFydF9TRUNOQU1FIGFuZCBfX3N0b3BfU0VDTkFNRSBhcm91bmQgc2VjdGlvbnMgd2hvc2UKLQluYW1lcyBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gQywgZm9yIHRoZSBiZW5lZml0IG9mIHN5bWJvbCBzZXRzIGluCi0JZ2xpYmMuCi0JKiBsZGVtdWwuaCAobGRlbXVsX3BsYWNlX29ycGhhbik6IERlY2xhcmUuCi0JKGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUpOiBBZGQgcGxhY2Vfb3JwaGFuIGZpZWxkLgotCSogbGRlbXVsLmMgKGxkZW11bF9wbGFjZV9vcnBoYW4pOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuaCAod2lsZF9kb2l0KTogRGVjbGFyZS4KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBNYWtlIG5vbnN0YXRpYy4KLQkobGFuZ19wbGFjZV9vcnBoYW5zKTogQ2FsbCBsZGVtdWxfcGxhY2Vfb3JwaGFuLgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBJbmNsdWRlIDxjdHlwZS5oPiBhbmQgImxkZ3JhbS5oIi4KLQkoaG9sZF9zZWN0aW9uLCBob2xkX3VzZSwgaG9sZF90ZXh0LCBob2xkX2RhdGEsIGhvbGRfYnNzKTogTmV3Ci0Jc3RhdGljIHZhcmlhYmxlcy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEluaXRpYWxpemUgcGxhY2Vfb3JwaGFuIGZpZWxkLgotCi1UdWUgQXVnIDE2IDAwOjE3OjIwIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogQWRkIC5saW51eC1keW5hbWljIGFmdGVyIC5kYXRhLgotCi1UdWUgQXVnIDE2IDAwOjA4OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpIFRyZWF0IC0tZGxsLXZlcmJvc2UgYXMgLS12ZXJzaW9uLCBmb3IKLQlMaW51eCBjb21wYXRpYmlsaXR5LiAgRnJvbSBoamxAbnluZXhzdC5jb20gKEguSi4gTHUpLgotCi1Nb24gQXVnIDE1IDE3OjE3OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuaCAoZXhwX2dldF9hYnNfaW50KTogRGVjbGFyZS4KLQotU2F0IEF1ZyAgNiAwMTo0NTozOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19kb19hc3NpZ25tZW50cyk6ICBIYW5kbGUgY29tcGxleCBBVCdzIGJldHRlci4KLQkqIGxkZXhwLmMgKGV4cF9nZXRfYWJzX2ludCk6ICBOZXcgZnVuY3Rpb24uCi0KLUZyaSBBdWcgIDUgMjA6NTU6NTUgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgaTk2MC1uaW5keS1jb2ZmIHN1cHBvcnQuCi0KLVRodSBBdWcgIDQgMTQ6NDU6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sICh5eV9jcmVhdGVfc3RyaW5nX2J1ZmZlcik6IEhhbmRsZSBjaGFuZ2UgdG8gaW50ZXJuYWwKLQlpbnRlcmZhY2UgaW4gZmxleCAyLjQuNy4KLQotVHVlIEF1ZyAgMiAxMTo1MjowNiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hZGRyZXNzX3N0YXRlbWVudCk6Ci0JTmV3IGZ1bmN0aW9uOyBhZGQgMHgyMCB0byBhbnkgdXNlIG9mIC1UdGV4dC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBOZXcKLQlmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIHRoZSBuZXcgZnVuY3Rpb24KLQlnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cy4KLQotTW9uIEF1ZyAgMSAxNTo1MDo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFJlZG8gc2NyaXB0IHRvIHNldCAuIG91dHNpZGUgb2Ygc2VjdGlvbnMKLQlhbmQgbm90IGJvdGhlciB0byBleHBsaWNpdGx5IHNwZWNpZnkgc2VjdGlvbiBhZGRyZXNzZXMuCi0KLVR1ZSBKdWwgMjYgMTE6MDI6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IENvcHkgc2V2ZXJhbCBtb3JlIHJlbG9jYXRpb24gc2VjdGlvbnMgaW50bwotCXRoZSBvdXRwdXQuICBQdXQgLmdvdC5wbHQgc2VjdGlvbnMgaW50byAuZ290LgotCi1GcmkgSnVsIDIyIDEyOjE1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgUFJPVklERSB0byBkZWZpbmUgZXRleHQsIGVkYXRhLCBhbmQgZW5kLgotCi0JQWRkIGEgbmV3IHNjcmlwdCBvcGVyYXRvciwgUFJPVklERSwgdG8gZGVmaW5lIGEgc3ltYm9sIG9ubHkgaWYgaXQKLQlpcyBuZWVkZWQuCi0JKiBsZGdyYW0ueSAoUFJPVklERSk6IE5ldyB0b2tlbi4KLQkoYXNzaWdubWVudCk6IEFjY2VwdCBQUk9WSURFLgotCSogbGRsZXgubCAoUFJPVklERSk6IE5ldyB0b2tlbi4KLQkqIGxkZXhwLmggKG5vZGVfdHlwZSk6IEFkZCBldHJlZV9wcm92aWRlIHRvIG5vZGVfY2xhc3MgZW51bS4KLQkoZXhwX3Byb3ZpZGUpOiBEZWNsYXJlLgotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IEhhbmRsZSBldHJlZV9wcm92aWRlLgotCShleHBfcHJvdmlkZSk6IE5ldyBmdW5jdGlvbi4KLQkoZXhwX3ByaW50X3RyZWUpOiBIYW5kbGUgZXRyZWVfcHJvdmlkZS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IFBST1ZJREUuCi0KLQkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IFBhc3MgZGVzaXJlZCBhbGlnbm1lbnQgdG8KLSAgICAgICAgbGFuZ19vbmVfY29tbW9uIGFzIHBvd2VyIG9mIHR3by4KLQkobGFuZ19vbmVfY29tbW9uKTogR2V0IGNvbW1vbiBzeW1ib2wgYWxpZ25tZW50IGZyb20gbGlua2VyIGhhc2gKLQl0YWJsZSBlbnRyeS4gIFRyZWF0IGRlc2lyZWQgYWxpZ25tZW50IGFzIGEgcG93ZXIgb2YgdHdvLgotCi0JKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogQXR0YWNoIGFsbCBzZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsCi0Jbm90IGp1c3QgdGhlIGZpcnN0IG9uZS4gIElmIHRoZXJlIGlzIG5vIG5hbWUsIGF0dGFjaCBhbGwgc2VjdGlvbnMKLQlldmVuIGlmIHRoZSBTRUNfSVNfQ09NTU9OIGZsYWcgaXMgc2V0LgotCi1XZWQgSnVsIDIwIDE1OjQ5OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpZWxkIHJwYXRoLgotCSogbGV4c3VwLmMgKFNfSVNESVIpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkocGFyc2VfYXJncyk6IEFkZCBzdXBwb3J0IGZvciAtcnBhdGguICBJZiAtUiBpcyB1c2VkIHRvIG5hbWUgYQotCWRpcmVjdG9yeSwgdHJlYXQgaXQgYXMgLXJwYXRoIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIGNvbW1hbmRfbGluZS5ycGF0aCB0byBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGNvbW1hbmRfbGluZS5ycGF0aCB0byBOVUxMLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgLXJwYXRoIG9wdGlvbi4KLQotU3VuIEp1bCAxMCAwMDozMzoyNCAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogZW11bHBhcmFtcy9wYzUzMm1hY2hhb3V0LnNoOiBOZXcgZmlsZS4gUGM1MzIgbWFjaCBzY3JpcHQKLQlwYXJhbWV0ZXJzLgotCi0JKiBlbXVscGFyYW1zL25ldGJzZDUzMi5zaDogTmV3IGZpbGUuIE5ldGJzZCA1MzIgc2NyaXB0IHBhcmFtZXRlcnMuCi0KLQkqIGNvbmZpZy9wYzUzMm1hY2gubXQ6IE5ldyBmaWxlLiBQYzUzMiBtYWNoIHRhcmdldCBzdXBwb3J0LgotCi0JKiBjb25maWcvcGM1MzJtYWNoLm1oOiBOZXcgZmlsZS4gUGM1MzIgbWFjaCBob3N0IHN1cHBvcnQuCi0KLQkqIGNvbmZpZy9uZXRic2Q1MzIubXQ6IE5ldyBmaWxlLiBOZXRic2QgNTMyIHRhcmdldCBzdXBwb3J0LgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBuczMyay1wYzUzMi1tYWNoIGFuZCBuczMyay1wYzUzMi1uZXRic2Qgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBlcGNtYWNoYW91dC5jIGRlcGVuZGVuY3kgYW5kIGVuZXRic2Q1MzIuYwotCWRlcGVuZGVuY3kuCi0KLUZyaSBKdWwgIDggMTA6NTc6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogVXNlCi0JYmZkX2Fic19zZWN0aW9uX3B0ciwgbm90ICZiZmRfYWJzX3NlY3Rpb24uCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2hhbmdlZCAicmV0YWluLXN5bWJvbHMtZmlsZSIgZnJvbQotCW5vX2FyZ3VtZW50IHRvIHJlcXVpcmVkX2FyZ3VtZW50LiAgRnJvbSBkam0uCi0KLVRodSBKdWwgIDcgMTI6Mjk6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEV4cGxpY2l0bHkgbWVudGlvbiAuc3RhYiBhbmQgLnN0YWJzdHIKLQlzZWN0aW9ucyB0byBmb3JjZSBhIFZNQSBvZiAwOyBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlCi0Jbm90IGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIHN0eWxlLgotCi1Nb24gSnVsICA0IDE5OjM1OjQ1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjIChfX3N0YWNrX3plcm8pOiBEb24ndCBkZWZpbmUgdGhpcyBuYW1lLAotCWl0IHdhcyBmb3IgdGhlIEhQVVggZHluYW1pYyBsb2FkZXIncyB1c2UgYW5kIGl0IGNyZWF0ZXMgcHJvYmxlbXMKLQl3aXRoIEVMRiBHREIuCi0KLUZyaSBKdWwgIDEgMTI6NTM6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxkbGFuZy5jIChsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTm8gbG9uZ2VyIHN0YXRpYy4gIERlbGV0ZSBkZWNsLgotCSogbGRsYW5nLmggKGxhbmdfZG9fYXNzaWdubWVudHMpOiBQdXQgZXh0ZXJuYWwgZGVjbCBoZXJlLgotCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IE1pbm9yIGNsZWFudXBzIHRocm91Z2hvdXQgZmlsZS4KLQkoaHBwYV9lbGZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBSZXdyaXRlLgotCShocHBhZWxmX2ZpbmlzaCk6IFJld3JpdGUuCi0KLVdlZCBKdW4gMjkgMTY6NTA6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc29sYXJpczIubWggKE5BVElWRV9MSUJfRElSUyk6IERlZmluZSBhcyAvdXNyL2Njcy9saWIuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC1Cc3RhdGljIGFuZCAtQmR5bmFtaWMuICBEbyBub3QKLQlhY2NlcHQgcGxhaW4gLUIuCi0JKiBsZC50ZXhpbmZvOiAtQnN0YXRpYyBpcyBub3QgaWdub3JlZC4KLQotVHVlIEp1biAyOCAxMjoxMzozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBcciB0aGUgc2FtZSBhcyBcbi4KLQotVGh1IEp1biAyMyAxNzo1MzowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHNoYXJlZCBsaWJyYXJpZXMsIGZyb20gRXJpYwotCVlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBnZW5zY3JpcHRzLnNoOiBJZiB0aGUgZW11bGF0aW9uIHBhcmFtZXRlciBmaWxlIHNldHMKLSAgICAgICAgR0VORVJBVEVfU0hMSUJfU0NSSVBULCBnZW5lcmF0ZSBhIC54cyBzY3JpcHQgZmlsZSB3aXRoCi0JQ1JFQVRFX1NITElCIGRlZmluZWQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQpOiBJZgotCWxpbmtfaW5mby5zaGFyZWQgaXMgc2V0LCB1c2UgdGhlIC54cyBzY3JpcHQgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSWYgQ1JFQVRFX1NITElCIGlzIHNldCwgZG9uJ3QgY3JlYXRlIGEKLQkuaW50ZXJwIHNlY3Rpb24sIGFuZCBkb24ndCBpbmNsdWRlIFRFWFRfU1RBUlRfQUREUiBpbiB0aGUgc3RhcnRpbmcKLQlhZGRyZXNzIG9mIHRoZSBmaXJzdCBzZWN0aW9uLgotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUuCi0KLVRodSBKdW4gMjMgMTI6NTI6MjIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1XZWQgSnVuIDIyIDEzOjQyOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgbmV3IG9wdGlvbnMgLSggLSkgd2l0aAotCXN5bm9ueW1zIC0tc3RhcnQtZ3JvdXAgLS1lbmQtZ3JvdXAuCi0JKiBsZGxhbmcuaCAoZW51bSBzdGF0ZW1lbnRfZW51bSk6IEFkZCBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtLgotCShsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlKTogRGVmaW5lIG5ldyBzdHJ1Y3QuCi0JKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUpOiBBZGQgZ3JvdXBfc3RhdGVtZW50IGZpZWxkLgotCShsYW5nX2VudGVyX2dyb3VwLCBsYW5nX2xlYXZlX2dyb3VwKTogRGVjbGFyZS4KLQkqIGxkbGFuZy5jIChsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIpOiBIYW5kbGUKLQlsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtLgotCShtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zLCBwcmludF9zdGF0ZW1lbnQpOiBMaWtld2lzZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UuCi0JKG9wZW5faW5wdXRfYmZkcyk6IENvbXBsZXRlbHkgcmV3cml0ZS4gIE5vdyBkb2VzIGl0cyBvd24gbG9vcGluZywKLQlyYXRoZXIgdGhhbiB1c2luZyBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEhhbmRsZSBncm91cHMuCi0JKGxhbmdfcHJvY2Vzcyk6IFVwZGF0ZSBjYWxsIHRvIG9wZW5faW5wdXRfYmZkcy4KLQkocHJpbnRfZ3JvdXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsYW5nX2VudGVyX2dyb3VwLCBsYW5nX2xlYXZlX2dyb3VwKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZSk6IElmIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KLQlvcGVuZWQsIGp1c3QgcmV0dXJuIHJhdGhlciB0aGFuIHRha2luZyBhbiBhc3NlcnRpb24gZmFpbHVyZS4KLQkqIGxkdmVyLmMgKGhlbHApOiBNZW50aW9uIG5ldyBvcHRpb25zLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQkqIGxkbGFuZy5jIChlbmRfb2ZfZGF0YV9zZWN0aW9uX3N0YXRlbWVudF9saXN0KTogRG9uJ3QgZGVmaW5lLgotCShsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IERvbid0IHNldCBvYnNvbGV0ZSB2YXJpYWJsZQotCWVuZF9vZl9kYXRhX3NlY3Rpb25fc3RhdGVtZW50X2xpc3QuCi0KLQkqIHNjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjOiBEb24ndCBwdXQgJHtEQVRBX0FMSUdOTUVOVH0gaW5zaWRlIGFuCi0JQUxJR04uCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBBZGp1c3QgY3VycmVudCByZWdpb24gYWRkcmVzcwotCWV2ZW4gZm9yIHNlY3Rpb25zIHdpdGggYW4gZXhwbGljaXQgYWRkcmVzcy4gIEZyb20KLQlyYWxwaGNAcHlyYW1pZC5jb20gKFJhbHBoIENhbXBiZWxsKS4KLQotCSogZW11bHBhcmFtcy9pMzg2bGludXguc2ggKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IFNldCB0byAwLgotCUZyb20ganJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0KLQkqIHNjcmlwdHRlbXBsL21pcHNic2Quc2M6IExldCBzZWN0aW9ucyBhbGlnbiB0byB0aGVpciBuYXR1cmFsCi0JYm91bmRhcmllcy4KLQotVHVlIEp1biAyMSAxMToyNzowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2luaXQpOiBVc2UgbmV3IGJmZF9hYnNfc2VjdGlvbl9wdHIsIG5vdAotCSZiZmRfYWJzX3NlY3Rpb24uCi0JKGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YpOiBMaWtld2lzZS4KLQkobGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZik6IExpa2V3aXNlLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBVc2UgYmZkX2lzX2Fic19zZWN0aW9uIHRvIGNoZWNrIGZvciB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLiAgRG9uJ3QgdHJ5IHRvIHNldCB0aGUgVk1BIG9yIG91dHB1dF9vZmZzZXQgb3IKLQlzaXplIG9mIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCSogbGRtYWluLmMgKG5vdGljZV95c3ltKTogVXNlIGJmZF9pc191bmRfc2VjdGlvbiB0byBjaGVjayBmb3IgdGhlCi0JdW5kZWZpbmVkIHNlY3Rpb24uCi0KLVRodSBKdW4gMTYgMjI6NDg6NDEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2M6IFBsYWNlIC5kYXRhIGFuZCAuYnNzIGF0IDB4NDAwMDAwMDAKLQl3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGFibGUgb2JqZWN0cy4KLQotVGh1IEp1biAxNiAxNDoyNToyMiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9saW51eC5lbTogTmV3IGZpbGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIGxpbmtpbmcKLQlhZ2FpbnN0IExpbnV4IHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoZWkzODZsaW51eC5jKTogRGVwZW5kIHVwb24gbGludXguZW0uCi0JKiBlbXVscGFyYW1zL2kzODZsaW51eC5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBsaW51eC4KLQotVGh1IEp1biAxNiAxMjoyMjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIC1zaGFyZWQgdG8gbG9uZ29wdHMsIGFuZCBoYW5kbGUgaXQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLnNoYXJlZCB0byBmYWxzZS4gIEdpdmUKLQllcnJvciBpZiBsaW5rX2luZm8ucmVsb2NhdGVhYmxlIGFuZCBsaW5rX2luZm8uc2hhcmVkIGFyZSBib3RoIHNldC4KLQotCSogY29uZmlndXJlLmluOiBJZiBFTVVMX0VYVFJBKiBpcyBkZWZpbmVkIGluIGEgY29uZmlnIGZpbGUsIHRyZWF0Ci0JaXQgYXMgbmFtaW5nIGFuIGVtdWxhdGlvbiB0byBiZSBhZGRlZCB0byBFTVVMQVRJT05fT0ZJTEVTLgotCSogY29uZmlnL2kzODYtbGludXgubXQgKEVNVUxfRVhUUkExKTogRGVmaW5lIGFzIGVsZl9pMzg2LgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIGVpMzg2bGludXgubywgZWVsZjMyX3NwYXJjLm8sCi0JZWVsZjY0X3NwYXJjLm8uICBSZW1vdmUgJChPVEhFUl9FTVVMQVRJT05TKS4KLQkoZWkzODZsaW51eC5jLCBlZWxmMzJfc3BhcmMuYywgZWVsZjY0X3NwYXJjLmMpOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCShlaTM4NmxpbnV4LmMpOiBSZW1vdmU7IG5vdyBpbiBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbTY4ay1seW54Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvc3BhcmM2NC1lbGYubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKGVlbGY2NF9zcGFyYy5jKTogUmVtb3ZlOyBub3cgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWcvc3VuNHNvbDIubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKGVlbGYzMl9zcGFyYy5jKTogUmVtb3ZlOyBub3cgaW4gTWFrZWZpbGUuaW4uCi0KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90cmVlKTogRG9uJ3QgY3Jhc2ggaWYgZXRyZWVfcmVsIHNlY3Rpb24gaGFzCi0Jbm8gb3duZXItLWl0IG1pZ2h0IGJlIGJmZF9hYnNfc2VjdGlvbi4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IExldCBzZWN0aW9ucyBhbGlnbiB0byB0aGVpciBuYXR1cmFsCi0JYm91bmRhcmllcy4KLQotV2VkIEp1biAxNSAwMTo1NDo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkZW11bC5oIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBEZWNsYXJlLgotCShsZF9lbXVsYXRpb25feGZlcl90eXBlKTogQWRkIG5ldyBmaWVsZCBvcGVuX2R5bmFtaWNfYXJjaGl2ZS4KLQkqIGxkZW11bC5jOiBJbmNsdWRlIGxkZXhwLmggYW5kIGxkbGFuZy5oLgotCShsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGZpbGUuaCAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBEZWNsYXJlLgotCSogbGRmaWxlLmM6IEluY2x1ZGUgbGRlbXVsLmguCi0JKHRyeV9vcGVuX2JmZCk6IFJlbmFtZSBmcm9tIGNhY2hlX2JmZF9vcGVuci4gIFJldHVybiBib29sZWFuCi0JYXJndW1lbnQsIG5vdCBiZmQgKi4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBSZW5hbWUgZnJvbSBvcGVuX2EuICBSZXR1cm4gYm9vbGVhbgotCWFyZ3VtZW50LCBub3QgYmZkICouICBDbGVhbiB1cC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobGRmaWxlX29wZW5fZmlsZSk6IElmIGRvaW5nIGEgZHluYW1pYyBsaW5rLCBjYWxsCi0JbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoZSBleHRlbnNpb24gb2YKLQlhIGR5bmFtaWMgb2JqZWN0IGlzICIuc28iLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JTmV3IGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplIG9wZW5fZHluYW1pY19hcmNoaXZlCi0JZmllbGQuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IExpa2V3aXNlLgotCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IElnbm9yZSAtbTQ4NiBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSWdub3JlIC1xbWFnaWMgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkuCi0JQWNjZXB0IC1zdGF0aWMgYXMgYSBzeW5vbnltIGZvciAtbm9uX3NoYXJlZC4KLQotCUxldCB0aGUgdXNlciBjaGFuZ2UgdGhlIGR5bmFtaWMgbGlua2VyIHVzZWQgYnkgRUxGIGNvZGUuCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgbmV3IGZpZWxkIGludGVycHJldGVyLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgZHluYW1pYy1saW5rZXIgdG8gbG9uZ29wdHMsIGFuZAotCWhhbmRsZSBpdC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgdG8gTlVMTC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBHZXQKLQl0aGUgRUxGIGJhY2tlbmQgdG8gcmV0dXJuIHRoZSAuaW50ZXJwIHNlY3Rpb24uICBJZgotCWNvbW1hbmRfbGluZS5pbnRlcnByZXRlciBpcyBub3QgTlVMTCwgc2V0IHRoZSBjb250ZW50cyBvZiAuaW50ZXJwCi0JdG8gaXQuCi0JKiBsZC50ZXhpbmZvOiBNZW50aW9uIC1keW5hbWljLWxpbmtlci4KLQotCSogY29uZmlnL3N1bjRzb2wyLm10IChlZWxmMzJfc3BhcmMuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QKLQlnZW5lcmljLmVtLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFNvcnQgb3V0IHRoZSBvcHRpb24gbWFjcm9zIGFuZCBjaGFuZ2UgdGhlCi0JZGVmaW5pdGlvbnMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYWRkIGEgbmV3IG9wdGlvbi4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRGVmaW5lIF9fZXRleHQgYW5kIF9fZWRhdGEgdG8gZ28gYWxvbmcgd2l0aAotCV9ldGV4dCBhbmQgX2VkYXRhLgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBuZXcgZmllbGQgdHJhZGl0aW9uYWxfZm9ybWF0LgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgdHJhZGl0aW9uYWwtZm9ybWF0IHRvIGxvbmdvcHRzLCBhbmQKLQloYW5kbGUgaXQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgY29uZmlnLnRyYWRpdGlvbmFsX2Zvcm1hdCB0byBmYWxzZS4KLQkqIGxkbGFuZy5jIChsZGxhbmdfb3Blbl9vdXRwdXQpOiBTZXQgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpbiBCRkQKLQlmbGFncyBvZiBvdXRwdXRfYmZkIGFjY29yZGluZyB0byBjb25maWcudHJhZGl0aW9uYWxfZm9ybWF0LgotCSogbGR2ZXIuYyAoaGVscCk6IE1lbnRpb24gLXRyYWRpdGlvbmFsLWZvcm1hdC4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IC10cmFkaXRpb25hbC1mb3JtYXQuCi0KLVR1ZSBKdW4gMTQgMjM6MTA6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2FkZF9lbnRyeSk6IEFkZCBlbnRyaWVzIHRvIGEgc2V0IGluIHRoZSBvcmRlcgotCXRoZXkgYXJlIGVuY291bnRlcmVkLgotCi1UdWUgSnVuIDE0IDE4OjA1OjA5IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogZW11bHBhcmFtcy9pMzg2bGludXguc2ggKFRFWFRfU1RBUlRfQUREUik6IERlZmluZSBhcyAweDEwMDAuCi0JKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IERlZmluZSBhcyAweDIwLgotCi1Nb24gSnVuIDEzIDE1OjQ2OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IERlZmluZSBfZnRleHQsIF9ldGV4dCBhbmQgX2ZkYXRhIGluc3RlZCBvZgotCV9GVEVYVCwgX0VURVhUIGFuZCBfRkRBVEEuICBEb250IGRlZmluZSBfRU5ELgotCi0JKiBsZGZpbGUuYyAob3Blbl9hKTogSWYgdGhpcyBpcyBub3QgYW4gYXJjaGl2ZSwgdHJ5IHRvIG9wZW4gaXQgaW4KLQl0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIHNlYXJjaGluZyBmb3IgaXQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVHJlYXQgLWkgYXMgYSBzeW5vbnltIGZvciAtci4KLQotCSogbGRncmFtLnkgKGV4cCk6IFRyZWF0IEJMT0NLIGFzIGEgc3lub255bSBmb3IgQUxJR04sIHNvIHRoYXQKLQlCTE9DSyB3b3JrcyBpbiBhIHNlY3Rpb24gYWRkcmVzcyBhcyBkb2N1bWVudGVkLgotCi0JKiBsZGdyYW0ueSAoWVlERUJVRyk6IERvbid0IGRlZmluZS4KLQotRnJpIEp1biAxMCAxNjo0NTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9nbGQ5NjAuZW06IFBhc3MgZmFsc2UgZm9yIG5ldyBhcmd1bWVudCB0bwotCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoLgotCSogZW11bHRlbXBsL2dsZDk2MGMuZW0sIGVtdWx0ZW1wbC9sbms5NjAuZW06IExpa2V3aXNlLgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IE9ubHkgbG9vayBmb3IgLnNvIGZpbGVzIGlmIGRvaW5nIGEgZHluYW1pYwotCWxpbmsuCi0KLVRodSBKdW4gIDkgMDg6MzU6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9pOTYwLnNjOiBBZGQgQ09OU1RSVUNUT1JTIHRvIC5kYXRhLgotCi1UaHUgSnVuICA5IDA2OjUyOjI5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogRGVsZXRlIGxkLm5ldyBkZXBlbmRlbmN5IHNvIHRoYXQgYSByZWdyZXNzaW9uCi0JICB0ZXN0IGRvZXNuJ3QgdHJpZ2dlciBhIHJlYnVpbGQgb2YgdGhlIGxpbmtlci4KLQotVGh1IEp1biAgOSAwMDoxNzoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zKTogRm9yIGxhbmdfYWRkcmVzcywgY2FsbAotCWluaXRfb3MgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBjYWxsZWQuCi0KLVRodSBKdW4gIDIgMTc6MjQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIHN1cHBvcnQgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBhb3V0LnNjOiBEb24ndCBkZWZpbmUgX19EWU5BTUlDIGhlcmUuICBBZGQgbmV3IHNlY3Rpb25zIHVzZWQgYnkKLQlzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGNvZGUuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9zdW40LnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIHN1bm9zLgotCSogZW11bHBhcmFtcy9zdW4zLnNoIChURU1QTEFURV9OQU1FKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoZXN1bjQuYyk6IERlcGVuZCB1cG9uIHN1bm9zLmVtLCBub3QgZ2VuZXJpYy5lbS4KLQkoZXN1bjMuYyk6IExpa2V3aXNlLgotCi0JKiBsZGxhbmcuYzogTWlub3IgZm9ybWF0dGluZyBjbGVhbnVwcy4KLQkobGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmggKGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSk6IERlY2xhcmUuCi0KLQkqIGxkZmlsZS5oIChzZWFyY2hfZGlyc190eXBlKTogTW92ZSBmcm9tIGxkZmlsZS5jLCBhbmQgYWRkIGNtZGxpbmUKLQlmaWVsZC4KLQkoc2VhcmNoX2hlYWQpOiBEZWNsYXJlLgotCShsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCk6IEFkZCBuZXcgY21kbGluZSBhcmd1bWVudCBpbiBwcm90b3R5cGUuCi0JKiBsZGZpbGUuYyAoc2VhcmNoX2hlYWQpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKHNlYXJjaF9kaXJzX3R5cGUpOiBNb3ZlIHRvIGxkZmlsZS5oLgotCShsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCk6IEFjY2VwdCBjbWRsaW5lIGFyZ3VtZW50LCBhbmQgc2F2ZSBpdC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUGFzcyB0cnVlIGZvciBuZXcgY21kbGluZSBhcmd1bWVudCBvZgotCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoLgotCShzZXRfZGVmYXVsdF9kaXJsaXN0KTogTGlrZXdpc2UuCi0JKiBsZG1haW4uYyAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyKTogUGFzcyBmYWxzZSBmb3IgbmV3IGNtZGxpbmUKLQlhcmd1bWVudCBvZiBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aC4KLQkqIGxkZ3JhbS55IChpZmlsZV9wMSk6IExpa2V3aXNlLgotCi1XZWQgSnVuICAxIDE0OjI0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBSZW1vdmUgZmllbGRzIHN1YmZpbGVzLAotCXRvdGFsX3NpemUsIHN1cGVyZmlsZSBhbmQgY2hhaW4uCi0JKiBsZGZpbGUuYyAob3Blbl9hKTogRG9uJ3QgY2xlYXIgc2VhcmNoX2RpcnNfZmxhZy4KLQkobGRmaWxlX29wZW5fZmlsZSk6IERvbid0IHRyeSB0byBvcGVuIHN1cGVyZmlsZS4gIEFzc2VydCB0aGF0IGZpbGUKLQloYXMgbm90IGFscmVhZHkgYmVlbiBvcGVuZWQuCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdXBlcmZpbGUuCi0JKiBsZG1haW4uYyAoYWRkX2FyY2hpdmVfZWxlbWVudCk6IERvbid0IGluaXRpYWxpemUgc3ViZmlsZXMgb3IKLQljaGFpbiBvciBzdXBlcmZpbGUuICBJbml0aWFsaXplIHNlYXJjaF9kaXJzX2ZsYWcgdG8gZmFsc2UuCi0KLUZyaSBNYXkgMjcgMTI6MjU6MzMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogQ2hhbmdlZCB2ZXJzaW9uIHRvICJjeWdudXMtMi40LjEiLgotCi0JQ2hhbmdlcyBmcm9tIGJpbnV0aWxzLTIuNCByZWxlYXNlOgotCi0JKiBnZW5zY3JpcHRzLnNoIChSRUxPQ0FUSU5HLCBDT05TVFJVQ1RJTkcpOiBXaGVuIHNldHRpbmcKLQl2YXJpYWJsZXMsIHVzZSB3aGl0ZXNwYWNlLCBzbyBzY3JpcHRzIGRvbid0IGJyZWFrLgotCi0JKiBjb25maWcvYWxwaGFvc2YubWggKEhERUZJTkVTLCBDRkxBR1MpOiBEZWxldGVkLgotCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbTogRmluZCBlbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCBpbiAke3NyY2Rpcn0uCi0KLQkqIGNkdGVzdC1iYXIuY2M6IFJlbmFtZWQgZnJvbSBjZHRlc3QtZnVuYy5jYy4KLQkqIE1ha2VmaWxlLmluOiBOb3RlZCBjaGFuZ2UuCi0KLQkqIHNjcmlwdHRlbXBsL2EyOWsuc2M6IERvbid0IGluY2x1ZGUgL2xhYjMvdTMvLi4uLi9zZWdtZW50cy5vOyBJCi0JZG9uJ3Qga25vdyB3aGVyZSB0aGF0J3Mgc3VwcG9zZWQgdG8gY29tZSBmcm9tLCBvciB3aHkgaXQncwotCW5lY2Vzc2FyeS4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCi0JKiBlbXVscGFyYS9nbzMyLnNoOiBzZXQgdG8gY29mZi1nbzMyIG5vdCBhb3V0Ci0JKiBlbXVsdGVtcC9nZW5lcmljLmVtOiBzdHJlbmd0aC1yZWR1Y2UgdGhlIHN0cnVjdHVyZSBvZgotCSAgdGhpcyBzaGVsbCBzY3JpcHQsIHNpbmNlIHRoZSBvbmx5IGF2YWlsYWJsZSBzaGVsbCBmb3IKLQkgIERPUyBjYW4ndCBoYW5kbGUgY29tcGxleCBzeW50YXguCi0JKiBlbXVsdGVtcC9zdHJpbmdpZnkuc2VkOiBmb3IgInNlZCAtZiIgaW5zdGVhZCBvZiBpbmxpbmUuCi0JKiBtYWtlZmlsZS5pbjogZGVwZW5kIG9uIHN0cmluZ2lmeS5zZWQgYXMgd2VsbCBhcyBnZW5zY3JpcHRzLnNoCi0JKiBzY3JpcHR0ZW1wL2dvMzJjb2ZmLnNjOiBjb3JyZWN0IGZvciBkamdwcCAxLjExJ3MgQ09GRiBmb3JtYXQKLQkqIGdlbnNjcmlwdHMuc2g6IGVtcHR5IHZhcmlhYmxlcyBhcmVuJ3QgYWx3YXlzIGNvbnNpZGVyZWQgInNldCIsCi0JICBzbyBzZXQgdGhlbSB0byAieSIgaW5zdGVhZC4KLQotRnJpIE1heSAyNyAwMTowODoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChlbnRyeV9zeW1ib2wpOiBNYWtlIHN0YXRpYy4KLQkobGFuZ19hZGRfZW50cnkpOiBBZGQgY21kbGluZSBhcmd1bWVudC4KLQkqIGxkbGFuZy5oIChsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBwcm90b3R5cGUuCi0JKiBsZGdyYW0ueSAoc3RhdGVtZW50X2FueXdoZXJlKTogQ2hhbmdlIGxhbmdfYWRkX2VudHJ5IGNhbGwuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCi1UdWUgTWF5IDI0IDE2OjEzOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2ggKE9USEVSX1JFQURPTkxZX1NFQ1RJT05TKTogRG9uJ3QgZ2l2ZQotCS5yZWdpbmZvIGFuIGFkZHJlc3MuCi0JKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IERvbid0IGdpdmUgLmxpdDQgb3IgLmxpdDggYW4gYWRkcmVzcy4KLQkoT1RIRVJfU0VDVElPTlMpOiBEZWZpbmUgZm9yIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3MuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSBPVEhFUl9TRUNUSU9OUyBhdCBlbmQgb2Ygc2NyaXB0LgotCi1UaHUgTWF5IDE5IDEzOjMxOjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCBzdXBwb3J0IGZvciBFTEYgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIGZpZWxkIGR5bmFtaWNfbGluay4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb25maWcuZHluYW1pY19saW5rIHRvIGZhbHNlLiAgV2FybgotCW9uIGF0dGVtcHRzIHRvIHVzZSAtciB3aXRoIC1yZWxheCwgLWNhbGxfc2hhcmVkIG9yIC1zLgotCSogbGV4c3VwLmMgKGxvbmdvcHRzKTogU2VwYXJhdGUgT1BUSU9OX0NBTExfU0hBUkVEIGZyb20KLQlPUFRJT05fTk9OX1NIQVJFRC4gIEFkZCBPUFRJT05fSUdOT1JFLiAgQWRqdXN0IG1hY3JvIHZhbHVlcwotCWFjY29yZGluZ2x5LiAgQWRkICJkeSIgYW5kICJub25fc2hhcmVkIiBvcHRpb25zLiAgQ2hhbmdlICJReSIgdG8KLQlPUFRJT05fSUdOT1JFIGZvciBub3cuICBIYW5kbGUgT1BUSU9OX0NBTExfU0hBUkVEIGFuZAotCU9QVElPTl9OT05fU0hBUkVEIGJ5IHNldHRpbmcgZHluYW1pY19saW5rIGZpZWxkIGFjY29yZGluZ2x5LgotCUhhbmRsZSBPUFRJT05fSUdOT1JFIGJ5IGlnbm9yaW5nIGl0LiAgQ2xlYXIgZHluYW1pY19saW5rIGZpZWxkIGZvcgotCS1yIGFuZCAtVXIuCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZSk6IElmIGNvbmZpZy5keW5hbWljX2xpbmsgaXMgdHJ1ZSwgdHJ5Ci0Jb3BlbmluZyBhIGZpbGUgd2l0aCBhIC5zbyBleHRlbnNpb24gZmlyc3QuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCAoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIHRvIDB4MTAwMDAuCi0JKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IExpa2V3aXNlLgotCShURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCShEQVRBX1BMVCk6IERlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBwbGFjZW1lbnQgZm9yIG5ldyBkeW5hbWljIHNlY3Rpb25zLgotCURvbid0IHVzZSBDUkVBVEVfT0JKRUNUX1NZTUJPTFMuICBEZWZpbmUgX2V0ZXh0LCBfZWRhdGEgYW5kIF9lbmQKLQlvdXRzaWRlIG9mIGFueSBzZWN0aW9uLiAgRG9uJ3QgdXNlIEFMSUdOKDgpOyBqdXN0IGxldCBvbmUgc2VjdGlvbgotCVZNQSBmb2xsb3cgYW5vdGhlci4gIFB1dCAuZHluYnNzIGluIC5ic3MuICBEb24ndCBtZW50aW9uIGRlYnVnZ2luZwotCXNlY3Rpb25zOyB0aGV5J2xsIGJlIGhhbmRsZWQgY29ycmVjdGx5IGFueWhvdy4KLQkqIE1ha2VmaWxlLmluIChlZWxmX2kzODYuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QgZ2VuZXJpYy5lbS4KLQotV2VkIE1heSAxOCAxMDoxNTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVkaXJlY3Qgb3V0cHV0IG9mIGxuIHRvIC9kZXYvbnVsbC4KLQotTW9uIE1heSAxNiAxMzozNTowOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IENoYW5nZSBhbGwgcmVmZXJlbmNlcyBvZgotCS5ocHBhX2xpbmtlcl9zdHVicyB0byAuUEFSSVNDLnN0dWJzLgotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYzogTGlrZXdpc2UuCi0KLUZyaSBNYXkgMTMgMTM6MDA6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hhbmdlIGBgbm8gYXR0YWNoZWQKLQlvdXRwdXQgc2VjdGlvbicnIG1lc3NhZ2Ugc2xpZ2h0bHkuCi0JKGxhbmdfZG9fYXNzaWdubWVudHMpOiBEb24ndCByZWN1cnNlIGRvd24gaWYgdGhlcmUgaXMgbm8gcmVhbAotCXNlY3Rpb24uCi0KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChPVEhFUl9FTVVMQVRJT05TKTogQ2hhbmdlIGVtXyB0byBlIHRvCi0JbWF0Y2ggY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gZW11bGF0aW9uIHRlbXBsYXRlcy4KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQsIGNvbmZpZy9tNjhrLWx5bngubXQ6IExpa2V3aXNlLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQsIGNvbmZpZy9zdW40c29sMi5tdDogTGlrZXdpc2UuCi0KLVdlZCBNYXkgMTEgMTg6MTY6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogVXBkYXRlZCB2ZXJzaW9uIG51bWJlci4KLQotCSogY2R0ZXN0LWZvby5jYzogVXNlIGV4cGxpY2l0ICIjcHJhZ21hIGltcGxlbWVudGF0aW9uIi4KLQkqIGNkdGVzdC1iYXIuY2M6IFJlbmFtZWQgZnJvbSBjZHRlc3QtZnVuYy5jYy4KLQkqIE1ha2VmaWxlLmluOiBSZWZlcmVuY2VzIHRvIGNkdGVzdC1mdW5jLm8gY2hhbmdlZCB0bwotCWNkdGVzdC1iYXIuby4KLQotV2VkIE1heSAxMSAxNjoyNDoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlEb24ndCBjcmVhdGUgdW5uZWNlc3Nhcnkgb3V0cHV0IHNlY3Rpb25zLgotCSogbGRsYW5nLmMgKG91dF9iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSk6IFJlbW92ZS4KLQkod2lsZF9zZWN0aW9uKTogQ2FsbCBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSByYXRoZXIgdGhhbgotCW91cl9iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZS4gIERvbid0IGNhbGwgd2lsZF9kb2l0IGlmIHRoZXJlIGlzIG5vCi0Jc2VjdGlvbi4KLQkobGFuZ19jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6IFJlbW92ZS4KLQkobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyk6IEZvciBzZXZlcmFsIGNhc2VzLCBjYWxsIGluaXRfb3MgaWYKLQlpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjYWxsZWQuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIG91dHB1dCBzZWN0aW9uIHdhcyBub3QgY3JlYXRlZCwgc2tpcCBpdC4KLQkobGFuZ19wcm9jZXNzKTogRG9uJ3QgY2FsbCBsYW5fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMuCi0JKGxhbmdfcGxhY2Vfb3JwaGFucyk6IFNraXAgZmlsZXMgd2l0aCBqdXN0X3N5bXNfZmxhZ3Mgc2V0IHRvIHRydWUuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBjaGFuZ2UuCi0KLVR1ZSBNYXkgMTAgMTQ6MzE6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogRG9uJ3QgYm90aGVyIGluaXRpYWxpemluZyB0aGUgdm1hIGFuZAotCXNlY3Rpb24gc2l6ZS4gIERvbid0IHNwZWNpYWwgY2FzZSBTRUNfU0hBUkVEX0xJQlJBUlkuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEhhbmRsZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSBzZWN0aW9ucwotCXNwZWNpYWxseS4KLQotRnJpIE1heSAgNiAxMjoyNDoyNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taCA6IE5ldyBmaWxlIGZvciBYZ28zMlguCi0KLUZyaSBNYXkgIDYgMTU6MTU6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fY29tbWFuZF9maWxlKTogU2V0IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbAotCWJlZm9yZSBjYWxsaW5nIGVpbmZvLCBzaW5jZSB3ZSBhcmUgcmVwb3J0aW5nIGFuIGZvcGVuIGZhaWx1cmUuCi0JRnJvbSBqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgImUiIHJhdGhlciB0aGFuICJlbV8iIGFzIHByZWZpeCBmb3IKLQllbXVsYXRpb25zLgotCi1GcmkgTWF5ICA2IDAxOjA4OjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbTogVXNlICJlIiByYXRoZXIgdGhhbiAiZW1fIiBhcyBwcmVmaXggZm9yCi0JZmlsZW5hbWUuCi0JKiBlbXVsdGVtcGwvZ2xkOTYwLmVtLCBlbXVsdGVtcGwvZ2xkOTYwYy5lbSwgZW11bHRlbXBsL2xuazk2MC5lbSwKLQllbXVsdGVtcGwvaHBwYWVsZi5lbSwgZW11bHRlbXBsL204OGtiY3MuZW0sIGVtdWx0ZW1wbC92YW5pbGxhLmVtOgotCURpdHRvLgotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgYWxsIGdlbmVyYXRlZCBmaWxlIG5hbWVzLgotCShsZGVtdWwtbGlzdC5oKTogRGVwZW5kIG9uIE1ha2VmaWxlLCBub3QgY29uZmlnLnN0YXR1cy4gIENoYW5nZWQKLQlzZWQgcGF0dGVybnMgdG8gaGFuZGxlIG5ldyBmaWxlbmFtZXMuCi0KLQkqIGNvbmZpZy9taXBzbC1pZHQubXQ6IFJlbmFtZWQgZnJvbSBtaXBzLWlkdGwubXQuCi0JKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgotCi1UaHUgTWF5ICA1IDE1OjA3OjMyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEb24ndCB1c2UgIiQ8KiIsIGl0IGRvZXNuJ3QgYWx3YXlzCi0Jd29yay4gIEluc3RlYWQsIGNoZWNrIGJ1aWxkIGRpciBhbmQgJHNyY2RpciBleHBsaWNpdGx5LCBhbmQgdXNlCi0JYGVjaG8nIHRvIGdldCBhbGwgdGhlIGZpbGVuYW1lcy4KLQotCSogY29uZmlndXJlLmluIChoODMwMGgtKi1obXMpOiBDaGFuZ2VkIGxkX3RhcmdldCBuYW1lIHRvCi0JY2YtaDgzMDBoLgotCSogY29uZmlnL2NmLWg4MzAwaC5tdDogUmVuYW1lZCBmcm9tIGNvZmYtaDgzMDBoLm10LCB0byBtYWtlIGl0Ci0JdW5pcXVlIGluIDguMy4KLQotCSogY29uZmlnL2k5NjBjb2ZmLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaDogTmV3IGZpbGUuCi0JKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi12eHdvcmtzNSogZXhjZXB0IC12eHdvcmtzNS4wKik6IFVzZQotCWk5NjBjb2ZmIGNvbmZpZ3VyYXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoZW1fZ2xkOTYwY29mZi5jKTogQWRkZWQgZGVwZW5kZW5jaWVzLCBidWlsZCBydWxlLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZW1fZGVsdGE2OC5vLCBzaW5jZSB0aGUKLQljb2RlIGlzbid0IGluY2x1ZGVkIGluIEZTRiByZWxlYXNlcywgYW5kIGl0IGNhbiBzdGlsbCBiZQotCWV4cGxpY2l0bHkgc2VsZWN0ZWQuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlLmJhayBhbmQgdG1wZGlyLgotCShTVEFHRVNUVUZGKTogUmVtb3ZlZCAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykuCi0JKG1vc3RseWNsZWFuKTogRGVsZXRlIHRoZW0gZXhwbGljaXRseSBoZXJlLiAgQWxzbyByZW1vdmUgdG1wZGlyLgotCi0JUGF0Y2hlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgotCSogY29uZmlnL21pcHNic2QubWg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGVtX21pcHNic2QuYyk6IFVzZSBtaXBzYnNkLnNjLCBub3QgYW91dC5zYy4KLQkqIHNjcmlwdHRlbXBsL21pcHNic2Quc2M6IERvbid0IGRlZmluZSBfX0RZTkFNSUMuCi0JKiBlbXVscGFyYW1zL21pcHNic2Quc2ggKE9VVFBVVF9GT1JNQVQpOiBGaXggbmFtZSB0byBoYXZlIGBhLm91dCcKLQlpbnN0ZWFkIG9mIGBhb3V0Jy4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IFRyZWF0IGxpa2UgaTM4Ni0qLW1hY2gqLgotCi1XZWQgTWF5ICA0IDExOjU5OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL202OGsubXQgKEVNVUwpOiBTZXQgdG8gbTY4a2FvdXQuCi0JKiBlbXVscGFyYW1zL202OGthb3V0LnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9tNjhrYW91dC5vLgotCShlbV9tNjhrYW91dC5jKTogTmV3IHRhcmdldC4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIGRvdCBtb3ZlcyBiZWNhdXNlIG9mIGFuCi0JYXNzaWdubWVudCwgZG9uJ3QgdHJ5IHRvIGluc2VydCBhIHBhZCBpbnRvIHRoZSBhYnNvbHV0ZSBvdXRwdXQKLQlzZWN0aW9uLCBqdXN0IGNoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCBtZW1vcnkgcmVnaW9uCi0JaW5zdGVhZC4KLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNkdGVzdC50bXAsIGNkdGVzdC11ciwKLQljZHRlc3QtdXIub3V0LCBhbmQgY2R0ZXN0LXVyLnRtcC4KLQotV2VkIEFwciAyNyAxNjowMzozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3NhMjkyMDAuc2M6IEFsaWduIGFsbCBzZWN0aW9ucyB0byBmb3VyIGJ5dGUKLQlib3VuZGFyaWVzLgotCi1XZWQgQXByIDI3IDEwOjQ4OjAzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFN1cHBvcnQgZm9yIGdvMzIgY29mZi4KLQkqIGNvbmZpZy9pMzg2LWdvMzIubXQ6IE5ldyBmaWxlCi0JKiBlbXVscGFyYW1zL2kzODZnbzMyLnNoOiBOZXcgZmlsZQotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IE5ldyBmaWxlCi0KLVR1ZSBBcHIgMjYgMTc6MjA6MDMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZW1fbTY4a2x5bnguYywgZW1faTM4Nmx5bnguYywgZW1fc3BhcmNseW54LmMpOiBVc2UKLQlMeW54LXNwZWNpZmljIHNjcmlwdCB0ZW1wbGF0ZXMuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGl0ZSotKi1jb2ZmKTogVXNlIGNvZmYtc3BhcmMuCi0JKiBlbXVscGFyYW1zL2kzODZseW54LnNoIChTQ1JJUFRfTkFNRSk6IFNldCB0byBpMzg2bHlueC4KLQkqIGVtdWxwYXJhbXMvc3BhcmNseW54LnNoIChTQ1JJUFRfTkFNRSk6IFNldCB0byBzcGFyY2x5bnguCi0JKEVOVFJZKTogU2V0IHRvIF9fbWFpbi4KLQkqIHNjcmlwdHRlbXBsL2kzODZseW54LnNjOiBOZXcgZmlsZSwgc2NyaXB0IGZvciBJMzg2IEx5bnguCi0JKiBzY3JpcHR0ZW1wbC9tNjhrbHlueC5zYzogQWRkIGluc2VydGlvbiBvZiBjdG9yL2R0b3Igc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2M6IE5ldyBmaWxlLCBzY3JpcHQgZm9yIHVTcGFyYyBMeW54LgotCi1UdWUgQXByIDI2IDEyOjQxOjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogRm9yY2UgX2dwIGFuZCAubGl0OCB0byBiZSBhbGlnbmVkIHRvIGEgMTYKLQlieXRlIGJvdW5kYXJ5LCBpbiBjYXNlIHRoZSBnbG9iYWwgY29uc3RydWN0b3JzIGRvIG5vdCB0YWtlIHVwIGFuCi0JZXZlbiAxNiBieXRlcy4KLQotCSogY29uZmlnL2kzODZ2NC5taCAoSE9TVElOR19DUlQwKTogSWYgLi4vZ2NjL2NydGJlZ2luLm8gZG9lcyBub3QKLQlleGlzdCwgZ2V0IGNydGJlZ2luIGJhc2VkIG9uIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZS4KLQkoSE9TVElOR19MSUJTKTogU2ltaWxhciBjaGFuZ2UgZm9yIC4uL2djYy9jcnRlbmQuby4KLQotTW9uIEFwciAyNSAxNToyNzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXaGVuIG5vIGFkZHJlc3MgaXMgZ2l2ZW4gZm9yIGEKLQlzZWN0aW9uLCBhbGlnbiBpdCBhY2NvcmRpbmcgdG8gaXRzIHJlcXVpcmVtZW50cy4KLQotVGh1IEFwciAyMSAxNzoyNDoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZ2RvYy50ZXhpLgotCi1UdWUgQXByIDE5IDEyOjEyOjE1IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgaVszNF04Ni0qLWJzZDM4NiB0byB0aGUgcGF0dGVybnMgcmVjb2duaXplZC4KLQotRnJpIEFwciAxNSAxNDozNTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QgdGhlCi0JcG9zaXRpb24gb2YgYSBwYWRkaW5nIHN0YXRlbWVudCwgYW5kIGFkanVzdCBkb3QgYWNjb3JkaW5nbHkuCi0KLU1vbiBBcHIgMTEgMTc6Mzc6MDkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNULCBSVU5URVNUKTogU2V0IHRoZXNlIGZvciB0aGUgY2hlY2sgZ29hbC4KLQotTW9uIEFwciAxMSAxMjozMjo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2kzODZjb2ZmLnNjOiBJZiByZWxvY2F0aW5nLCBkb24ndCBwdXQgLmluaXQgYW5kCi0JLmZpbmkgc2VjdGlvbnMgaW50byAudGV4dDsga2VlcCB0aGVtIHNlcGFyYXRlLgotCSogY29uZmlnL2kzODZzY28ubWggKEhPU1RJTkdfQ1JUMCk6IElmIC4uL2djYy9jcnRiZWdpbi5vIGRvZXMgbm90Ci0JZXhpc3QsIGdldCBjcnRiZWdpbiBiYXNlZCBvbiBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWUuCi0JKEhPU1RJTkdfTElCUyk6IFNpbWlsYXIgY2hhbmdlIGZvciAuLi9nY2MvY3J0ZW5kLm8uCi0KLU1vbiBBcHIgMTEgMTA6MzE6MDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBTZXQgVENMX0xJQlJBUlkgZm9yIHJ1bnRlc3QuCi0KLVdlZCBBcHIgIDYgMDA6MDk6MzcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qZWxmKik6IERvbid0IHJlcXVpcmUgIi1ocC0iIGZvciB0aGUKLQltYW51ZmFjdHVyZXIuCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtIChocHBhZWxmX2ZpbmlzaCk6IE9ubHkgcmVzaXplIHNlY3Rpb25zCi0JaWYgYnVpbGRpbmcgYSBmaW5hbCBleGVjdXRhYmxlLgotCi1UdWUgQXByICA1IDEyOjE3OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGJmZF9jbG9zZS4KLQotVGh1IE1hciAzMSAxODowNzowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBDbGVhbiB1cCBzZWN0aW9uIGFsaWdubWVudCB0byBlbnN1cmUgdGhhdAotCXNlY3Rpb25zIG5ldmVyIG92ZXJsYXAgd2hlbiB1c2luZyAtci4KLQotV2VkIE1hciAzMCAxNTo1MToxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBDaGFuZ2Ugc3ltYm9sIHJlYWRpbmcgc2xpZ2h0bHkgZm9yIHJlY2VudCBCRkQKLQljaGFuZ2VzOiBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHJlbmFtZWQgYW5kIHJldHVybnMgbG9uZywKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYiByZXR1cm5zIGxvbmcsIGNoZWNrIGZvciBlcnJvciBpbmRpY2F0aW9ucy4KLQotRnJpIE1hciAyNSAxNzoyMDowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChwcmludF9pbnB1dF9zZWN0aW9uKTogRm9yIHNlY3Rpb24gc2l6ZSwgdXNlCi0JX2Nvb2tlZF9zaXplIGlmIGl0IGlzIG5vbi16ZXJvLCBzaXplIG90aGVyd2lzZS4KLQkoc2l6ZV9pbnB1dF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZSAoY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkuCi0KLVRodSBNYXIgMjQgMTU6MjA6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogQWRkIG5ldyBhcmd1bWVudCBhZGRfdG9fbGlzdC4gIERvbid0IHNldAotCXJlYWwgdG8gdHJ1ZSBmb3IgbGFuZ19pbnB1dF9maWxlX2lzX21hcmtlcl9lbnVtLiAgQ2xlYXIgdGhlX2JmZC4KLQkobGFuZ19hZGRfaW5wdXRfZmlsZSk6IFBhc3MgdHJ1ZSB0byBuZXdfYWZpbGUgZm9yIGFkZF90b19saXN0LgotCShsb29rdXBfbmFtZSk6IFJlbW92ZSBmb3JjZV9sb2FkIGFyZ3VtZW50LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQlQYXNzIGZhbHNlIHRvIG5ld19hZmlsZSBmb3IgYWRkX3RvX2xpc3QuICBTcGxpdCBsb2FkaW5nIG9mIHN5bWJvbHMKLQlvdXQgaW50byBzZXBhcmF0ZSBmdW5jdGlvbi4KLQkobG9hZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIHNwbGl0IG91dCBvZiBsb29rdXBfbmFtZS4gIERvbid0IGxvYWQKLQl0aGUgc3ltYm9scyBpZiB0aGV5IGFyZSBhbHJlYWR5IGxvYWRlZC4KLQkob3Blbl9pbnB1dF9iZmRzKTogRm9yIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW0gY2FsbCBsb2FkX3N5bWJvbHMKLQlyYXRoZXIgdGhhbiBsb29rdXBfbmFtZS4KLQkobGFuZ19wcm9jZXNzKTogUGFzcyBhYnNfb3V0cHV0X3NlY3Rpb24gcmF0aGVyIHRoYW4gTlVMTCB0bwotCWxhbmdfc2l6ZV9zZWN0aW9ucy4KLQkobGFuZ19zdGFydHVwKTogU2V0IHJlYWwgZmllbGQgb2YgZmlyc3RfZmlsZSB0byB0cnVlLgotCi1XZWQgTWFyIDIzIDE0OjE1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGhhZF9yZWxheCk6IFJlbW92ZWQuCi0JKHJlbGF4X2FnYWluKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogQ2hhbmdlIGNhbGwgdG8gYmZkX3JlbGF4X3NlY3Rpb24gdG8KLQljb3JyZXNwb25kIHRvIEJGRCBjaGFuZ2VzLiAgU2V0IHJlbGF4X2FnYWluIGFwcHJvcHJpYXRlbHkuCi0JKGxhbmdfcHJvY2Vzcyk6IFJlbW92ZSAjaWYgMCBjb2RlLiAgV2hlbiByZWxheGluZywga2VlcCBjYWxsaW5nCi0JbGFuZ19kb19hc3NpZ25tZW50cyBhbmQgbGFuZ19zaXplX3NlY3Rpb25zIHVudGlsIHJlbGF4X2FnYWluCi0JYmVjb21lcyBmYWxzZS4KLQotCSogZW11bHRlbXAvZ2xkOTYwLmVtOiBJbmNsdWRlIGxpYmliZXJ0eS5oCi0JKGdsZDk2MF9iZWZvcmVfcGFyc2UpOiBQYXNzIE5VTEwgYXMgZmluYWwgYXJndW1lbnQgdG8gY29uY2F0LgotCi1UdWUgTWFyIDIyIDEzOjA4OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRm9yY2UgX2VuZCBhbmQgX19lbmQgdG8gYmUgYWxpZ25lZCB0byBhCi0JZm91ciBieXRlIGJvdW5kYXJ5LgotCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtIGJ5Ci0JYnVpbGRpbmcgYSBiZmRfZGF0YV9saW5rX29yZGVyLCByYXRoZXIgdGhhbiBieSBzZXR0aW5nIHRoZSBzZWN0aW9uCi0JY29udGVudHMgaW1tZWRpYXRlbHkuCi0KLU1vbiBNYXIgMjEgMTg6Mjg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBtYWtlIC1VciB3b3JrIGFnYWluLgotCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBOb3cgdGFrZXMgcmVsb2MgYXJndW1lbnQgcmF0aGVyIHRoYW4KLQliaXRzaXplLiAgQ2hlY2sgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyBoZXJlLiAgSWYgYW4gbmV3IGhhc2gKLQl0YWJsZSBlbnRyeSBpcyBjcmVhdGVkLCBtYXJrIGl0IGFzIHVuZGVmaW5lZC4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBObyBsb25nZXIgdGFrZXMgYml0c2l6ZSBhcmd1bWVudC4gIFBhc3MKLQlCRkRfUkVMT0NfQ1RPUiB0byBsZGN0b3JfYWRkX3NldF9lbnRyeSwgYnV0IGZpcnN0IG1ha2Ugc3VyZSB0aGUKLQlCRkQgYmFja2VuZCBzdXBwb3J0cyBpdC4KLQkocmVsb2Nfb3ZlcmZsb3cpOiBIYW5kbGUgYSBOVUxMIGFiZmQgYXJndW1lbnQuCi0JKHJlbG9jX2Rhbmdlcm91cywgdW5hdHRhY2hlZF9yZWxvYyk6IExpa2V3aXNlLgotCSogbGRjdG9yLmM6IEluY2x1ZGUgbGRtYWluLmguCi0JKHN0cnVjdCBzZXRfaW5mbyk6IENoYW5nZSBiaXRzaXplIGZpZWxkIHRvIHJlbG9jLgotCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IE5vdyB0YWtlcyByZWxvYyBhcmd1bWVudCByYXRoZXIgdGhhbgotCWJpdHNpemUuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyBoZXJlLgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IEdldCB0aGUgc2l6ZSBmcm9tIHRoZSByZWxvYyBob3d0by4gIElmCi0JZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBjYWxsIGxhbmdfYWRkX3JlbG9jIHJhdGhlciB0aGFuCi0JbGFuZ19hZGRfZGF0YS4KLQkqIGxkY3Rvci5oIChsZGN0b3JfYWRkX3NldF9lbnRyeSk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byB1c2UgcmVsb2MKLQlpbnN0ZWFkIG9mIGJpdHNpemUuCi0JKiBsZGxhbmcuaCAoc3RhdGVtZW50X2VudW0pOiBBZGQgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bS4KLQkobGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUpOiBBZGQgcmVsb2Nfc3RhdGVtZW50IGZpZWxkLgotCShsYW5nX2FkZF9yZWxvYyk6IERlY2xhcmUgbmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmMgKGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcik6IEhhbmRsZQotCWxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0uCi0JKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMsIHByaW50X3N0YXRlbWVudCk6IExpa2V3aXNlLgotCShsYW5nX3NpemVfc2VjdGlvbnMsIGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZS4KLQkocHJpbnRfcmVsb2Nfc3RhdGVtZW50KTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX2FkZF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IEhhbmRsZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtLgotCi0JKiBNYWtlZmlsZS5pbiAoY2R0ZXN0Lm91dCwgY2R0ZXN0LXVyLm8pOiBOZXcgdGFyZ2V0cy4KLQkoY2R0ZXN0LXVyLCBjZHRlc3QtdXIub3V0KTogTmV3IHRhcmdldHMuCi0JKGNoZWNrLWNkdGVzdCk6IE5vdyBhbHNvIGNoZWNrIHRoYXQgLVVyIHdvcmtzIGNvcnJlY3RseS4KLQotCSogc2NyaXB0dGVtcC9hbHBoYS5zYzogQWxpZ24gYWxsIHNlY3Rpb25zIHRvIDE2IGJ5dGUgYm91bmRhcmllcy4KLQotVGh1IE1hciAxNyAxMjo0NTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBNb3ZlIGxhbmdfY29tbW9uIGNhbGwgYmVmb3JlCi0JbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucywgdG8gZW5zdXJlIHRoYXQgYW55IGFsaWdubWVudAotCWNvbnN0cmFpbnRzIHNldCBieSBjb21tb24gc3ltYm9scyBhcmUgY29waWVkIG92ZXIgdG8gdGhlIG91dHB1dAotCXNlY3Rpb25zLgotCi1GcmkgTWFyIDExIDIyOjE3OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoVEVNUExBVEVfTkFNRSk6IERvbid0IGRlZmluZS4KLQkoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogUmVuYW1lIC50b2MgdG8gLmdvdC4KLQkqIE1ha2VmaWxlLmluIChlbV9lbGYzMnBwYy5jKTogRGVwZW5kIHVwb24gZ2VuZXJpYy5lbSwgbm90IHBwYy5lbS4KLQkqIGVtdWx0ZW1wbC9wcGMuZW06IFJlbW92ZSB1Z2x5IHN0dWIgY29kZTsgdHVybnMgb3V0IG5vdCB0byBiZQotCW5lZWRlZCBmb3IgRUxGLgotCi1UdWUgTWFyICA4IDA0OjIyOjI3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODZic2QubWg6IE5ldyBmaWxlLgotCi1Nb24gTWFyICA3IDE1OjIzOjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmLnNjOiBQZXJtaXQgVEVYVF9TVEFSVF9TWU1CT0xTIGFuZCBEQVRBX1NUQVJUX1NZTUJPTFMgdG8gYmUKLQlkZWZpbmVkLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIucyAoVEVYVF9TVEFSVF9TWU1CT0xTKTogRGVmaW5lIF9mdGV4dC4KLQkoREFUQV9TVEFSVF9TWU1CT0xTKTogRGVmaW5lIF9mZGF0YS4KLQotTW9uIEZlYiAyOCAxMDo1OToxNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChjYXQpOiBEZWZpbmUgdXNpbmcgQU5TSSBzdHlsZSBpZiBBTE1PU1RfU1REQyBkZWZpbmVkLgotCi1TdW4gRmViIDI3IDE2OjI5OjM4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbSAoaHBwYWVsZl9maW5pc2gpOiBVcGRhdGUgY29tbWVudHMuICBUaGlzCi0Jd29ya3MgYWdhaW4uICBBdHRhY2ggc29tZSBvdXRwdXQgc3ltYm9scyB0byB0aGUgc3R1YiBmaWxlIGJmZC4KLQotCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IEluY2x1ZGUgZWxmMzItaHBwYS5oLgotCShmaWxlX2NoYWluKTogQWRkIGRlY2wuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZSBkZWNsLgotCShocHBhZWxmX2ZpbmlzaCk6IFJlZW5hYmxlIGNvZGUuICBEbyBub3QgcGFzcyBzeW1ib2xzCi0JZG93biB0byBocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24uCi0KLVNhdCBGZWIgMjYgMTA6NTg6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAod3JpdGVfbWFwKTogRG9uJ3QgZGVmaW5lLiAgUmVtb3ZlZCBhbGwgcmVmZXJlbmNlcy4KLQlKdXN0IHVzZSBtYXBfZmlsZSBvciBtYXBfZmlsZW5hbWUgaW5zdGVhZC4KLQkoYWRkX2FyY2hpdmVfZWxlbWVudCk6IFVzZSBtaW5mbyB0byB3cml0ZSBtYXAgaW5mb3JtYXRpb24sIG5vdAotCWluZm9fbXNnLgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IFVzZSBmcHJpbnRmIHRvIHdyaXRlIG1hcCBpbmZvcm1hdGlvbiwgbm90Ci0JaW5mb19tc2cuCi0JKiBsZG1haW4uaCAod3JpdGVfbWFwKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxkZ3JhbS55IChtcmlfc2NyaXB0X2NvbW1hbmQpOiBSZW1vdmVkIHJlZmVyZW5jZSB0byB3cml0ZV9tYXAuCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogTGlrZXdpc2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCi1GcmkgRmViIDI1IDE5OjEyOjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBGb3JjZSBhbGwgc2VjdGlvbnMgdG8gYmUgYWxpZ25lZC4KLQotCSogbGRncmFtLnkgKHNlY3Rpb24pOiBSZXZlcnNlIHRoZSBvcmRlciBvZiBtZW1zcGVjX29wdCBhbmQKLQlmaWxsX29wdCB0byBhdm9pZCBhbiBhbWJpZ3VpdHkgd2hlbiBib3RoIGFyZSB1c2VkLgotCSogbGQudGV4aW5mbzogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQotCSogbGRncmFtLnk6IE1vdmUgaW5jbHVkZSBvZiBsZGxleC5oIGJhY2sgd2l0aCBvdGhlciBpbmNsdWRlcy4KLQkqIGxkbGV4LmggKGlucHV0X3R5cGUpOiBEb24ndCBpbml0aWFsaXplIGVudW0gY29uc3RhbnRzIHRvCi0JcGFydGljdWxhciB2YWx1ZXMuCi0JKiBsZGxleC5sOiBVc2UgYSBzd2l0Y2ggdG8gcmV0dXJuIHRoZSByaWdodCB0b2tlbiBiYXNlZCBvbgotCWlucHV0X3R5cGUsIHJhdGhlciB0aGFuIGtub3dpbmcgdGhhdCBpbnB1dF90eXBlIGhhcyBhIHZhbHVlIGJhc2VkCi0Jb24gYSB0b2tlbiB0eXBlLgotCi0JKiBsZGdyYW0ueSAoZGlybGlzdF9wdHIpOiBSZW1vdmVkOyBub3QgdXNlZC4KLQkqIGxleHN1cC5jOiBJbmNsdWRlIGxkdmVyLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLUZyaSBGZWIgMjUgMTg6NTU6NTQgMTk5NCAgVGVkIExlbW9uICAobWVsbG9uQHBlcHBlci5uY2QuY29tKQotCi0JKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBkb24ndCBjYWxsIGJmZF9zZXRfZ3Bfc2l6ZS4KLQkobGRsYW5nX2FkZF9maWxlKTogY2FsbCBpdCBoZXJlIGluc3RlYWQuCi0KLUZyaSBGZWIgMjUgMTg6MTM6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogSW5jbHVkZSBsZGxleC5oIGFmdGVyICV0b2tlbiBkZWNscywgZm9yIGJ5YWNjLgotCi1GcmkgRmViIDI1IDEwOjQ3OjI1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogZW11bHRlbXBsL2hwcGFlbGYuZW06IEZpcnN0IGF0dGVtcHQgdG8gY2xlYW4gdGhpcyBmaWxlIHVwLgotCUFkZCBjb21tZW50cyBpbiBzZXZlcmFsIGZ1bmN0aW9ucyBhcyB0byB0aGVpciBwdXJwb3NlIGFuZAotCWhvdyB0aGV5IGZ1bmN0aW9uIChvciBteSBjdXJyZW50IGJlc3QgZ3Vlc3MpLiAgQ2xlYW4gdXAgaG9ycmlibGUKLQlzcGFjaW5nIGFuZCBpbmRlbnRpb24gdGhhdCBuZXZlciBzaG91bGQgaGF2ZSBiZWVuIGFjY2VwdGVkIGluIHRoZQotCWZpcnN0IHBsYWNlLiAgQWRkIEZJWE1FcyBmb3IgaXNzdWVzIHdoaWNoIG5lZWQgdG8gYmUgcmVzb2x2ZWQuCi0JRGlzYWJsZSBsaW5rZXItc3R1YiBnZW5lcmF0aW9uIHVudGlsIGl0IGdldHMgZml4ZWQuICBUaGlzIGFsbG93cwotCXRoZSBsaW5rZXIgdG8gYXQgbGVhc3Qgd29yayBvbiBzaW1wbGUgY29kZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IE5vIGxvbmdlciBzdGF0aWMgKFBBIEVMRiBjYWxscwotCWl0IHZpYSBocHBhZWxmX2ZpbmlzaCkuICBQcm90b3R5cGUgbW92ZWQgaW50byBsZGxhbmcuaC4KLQkobGFuZ19wcm9jZXNzKTogTW92ZSBwcm9ibGVtYXRpYyBleHRyYSBjYWxsIHRvIGxhbmdfc2l6ZV9zZWN0aW9ucwotCWludG8gdGhlIFBBIEVMRiBzcGVjaWZpYyBjb2RlLgotCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfZmluaXNoKTogRXh0cmEgY2FsbCB0bwotCWxhbmdfc2l6ZV9zZWN0aW9ucyBtb3ZlZCBoZXJlLgotCi1UaHUgRmViIDI0IDE2OjQ3OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotZWxmKik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtZWxmMzIuCi0JKiBjb25maWcvcHBjLWVsZjMyLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL3BwYy5lbTogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9lbGYzMnBwYy5vLgotCShlbV9lbGYzMnBwYy5jKTogTmV3IHRhcmdldDsgdXNlcyBlbGYzMnBwYy5zaCwgcHBjLmVtIGFuZCBlbGYuc2MuCi0JKEVNVUxBVElPTl9PRklMRVMpOiBBZGRlZCBkZXBlbmRlbmNpZXMgb24gbGRleHAuaCBhbmQgbGRsYW5nLmguCi0KLVRodSBGZWIgMjQgMTI6Mjc6MDcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFVzZSBzeW1ib2xpYyBudW1iZXJzIGZvciBsb25nIG9wdGlvbnMuCi0JRml4IG1pc3VuZGVyc3RhbmRpbmcgaW4gLVkgYW5kIC1jYWxsX3NoYXJlZCBldCBhbC4KLQotCVVzZSBnZXRvcHQgaW5zdGVhZCBvZiBsZXggYW5kIHlhY2MgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZS4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IERvY3VtZW50IGNoYW5nZXMgdG8gb3B0aW9uIHN5bnRheC4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogbGR2ZXIuYyAoaGVscCk6IFR3ZWFrIGRhc2hlcyBpbiB1c2FnZSBtZXNzYWdlLgotCSogbGRncmFtLnkgKCV1bmlvbik6IFJlbW92ZSB1bnVzZWQgbWVtYmVycy4KLQlSZW1vdmUgJXRva2VucyBmb3IgY29tbWFuZCBsaW5lIG9wdGlvbnM7IGFkZCBvbmVzIGZvciBpbnB1dCB0eXBlcy4KLQkoY29tbWFuZF9saW5lKTogUnVsZXMgcmVtb3ZlZC4KLQkoZmlsZSk6IEluc3RlYWQgb2YgY29tbWFuZCBsaW5lLCByZWNvZ25pemUgYW4KLQlpbnB1dCB0eXBlIGluZGljYXRvciwgdGhlbiB1c2UgdGhlIG5vbnRlcm1pbmFsIGZvciB0aGF0IHR5cGUuCi0JKGRlZnN5bV9leHByKTogTmV3IG5vbnRlcm1pbmFsIGZyb20gY29kZSBmb3JtZXJseSBpbiBjb21tYW5kX2xpbmUuCi0JKiBsZGxleC5oOiBEZWNsYXJlIHBhcnNlciBpbnB1dCB0eXBlIGVudW0gYW5kIHZhcmlhYmxlLgotCURvbid0IGRlY2xhcmUgcGFyc2VfbGluZS4KLQkqIGxkbGV4Lmw6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgTWFrZSBzb21lIHVzZWQgb25lcyBzdGF0aWMKLQlhbmQgY29tbWVudCB0aGVtLgotCShDT01NQU5EKTogU3RhcnQgc3RhdGUgYW5kIGl0cyBydWxlcyByZW1vdmVkLgotCUF0IHN0YXJ0IG9mIHl5bGV4LCByZXR1cm4gaW5wdXQgc3RhdGUgdG9rZW4gaWYgYXQgc3RhcnQgb2YgaW5wdXQuCi0JKGxleF9yZWRpcmVjdCk6IERvbid0IG5lZWQgdG8gc2V0IHl5b3V0LgotCShsZGxleF9jb21tYW5kKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5zdGVhZCBvZiBjYWxsaW5nIHBhcnNlX2xpbmUsIHNldCB1cCB0aGUKLQlyZWRpcmVjdGlvbnMgYW5kIGNhbGwgeXlwYXJzZSBkaXJlY3RseS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBJZiB0aGVyZSdzIG5vIGlucHV0IGZpbGVuYW1lLCBwcmludCBub3RoaW5nLCBub3QKLQkiY29tbWFuZCBsaW5lIi4KLQkqIGxleHN1cC5jOiBSZW1vdmUgI2lmIDAnZCBjb2RlLgotCShwYXJzZV9saW5lKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkocGFyc2VfYXJncyk6IFJld3JpdGUgdG8gdXNlIGdldG9wdF9sb25nX29ubHkuCi0JKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBOZXcgZnVuY3Rpb24gZnJvbSBjb2RlIGZvcm1lcmx5IGluCi0JbGRncmFtLnk6Y29tbWFuZF9saW5lLgotCShzZXRfc2VjdGlvbl9zdGFydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtLCBlbXVsdGVtcGwvZ2xkOTYwLmVtLCBlbXVsdGVtcGwvaHBwYWVsZi5lbSwKLQllbXVsdGVtcGwvbG5rOTYwLmVtLCBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogRG9uJ3QgZW5jbG9zZQotCWNvbXBpbGVkLWluIGxpbmsgc2NyaXB0cyBpbiAieyIgYW5kICJ9IiwgYXMgdGhlIGdyYW1tYXIgbm8gbG9uZ2VyCi0Jd2FudHMgdGhlbSB0byBiZS4KLQotVGh1IEZlYiAyNCAwODo0MzoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsZC5kdmkpOiBEZXBlbmQgb24gY29uZmlnZG9jLnRleGksIGJ1dCBkb24ndAotCXJlcXVpcmUgdGhhdCBpdCBiZSBpbiAkKHNyY2RpcikuCi0KLVR1ZSBGZWIgMjIgMDk6MjE6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogT25seSBhbGlnbiBzZWN0aW9uIHRvIGFsaWdubWVudAotCXJlcXVpcmVkIGJ5IGxpbmtlciBzY3JpcHQsIG5vdCB0byBtYXhpbXVtIGFsaWdubWVudCBvZiBpbnB1dAotCXNlY3Rpb25zLgotCi0JKiBsZGxhbmcuaCAobGFyZ2VzdF9zZWN0aW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxkbGFuZy5jIChsYXJnZXN0X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCi0JKHNpemVfaW5wdXRfc2VjdGlvbik6IERvbid0IHNldCBsYXJnZXN0X3NlY3Rpb247IG5vdCB1c2VkLgotCi1Nb24gRmViIDIxIDE1OjE1OjI5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IFBhc3MgTlVMTCBhcyBsYXN0IGFyZ3VtZW50IHRvIGNvbmNhdC4KLQotVGh1IEZlYiAxNyAxNTo1MToyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jLCBsZG1haW4uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotCSogbGRtaXNjLmggKGNvbmNhdCk6IERvbid0IGRlY2xhcmUuCi0JKiBsZG1pc2MuYyAoY29uY2F0KTogRG9uJ3QgZGVmaW5lOyBqdXN0IHVzZSB0aGUgb25lIGluIGxpYmliZXJ0eS4KLQotCSogbGQuaCAoYXNfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUmVtb3ZlZDsgbm90IHVzZWQuCi0KLVRodSBGZWIgMTcgMDk6MzI6MTQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYywgbGRtYWluLmMsIGxkbWlzYy5jOiBVc2UgYmZkX2dldF9lcnJvciBhbmQKLQliZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCi0KLVR1ZSBGZWIgMTUgMjA6MTQ6NTMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSWYgdGhlIGNvb2tlZCBzaXplIG9mIHRoZSBzZWN0aW9uCi0JaGFzIGJlZW4gc2V0LCB1c2UgaXQsIGZvciBkZXRlcm1pbmluZyBsaW5rX29yZGVyIHNpemUuCi0JKGxkd3JpdGUpOiBJbiB0aGUgZXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgaWYgYmZkX2ZpbmFsX2xpbmsgZmFpbHMsCi0JaW5kaWNhdGUgdGhhdCBpdCB3YXMgaW4gZmFjdCB0aGUgZmluYWwgbGluayBzdGVwIHRoYXQgZmFpbGVkLgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2xlYXIgYmZkX2Vycm9yIGJlZm9yZSBjYWxsaW5nCi0JYmZkX3JlbGF4X3NlY3Rpb24sIGluIGNhc2UgaXQgcmV0dXJucyBmYWxzZSBidXQgZG9lc24ndCBmbGFnIGFuCi0JZXJyb3IuICBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgaW5kaWNhdGUgd2hpY2ggb25lIGl0IGlzIGluIHRoZQotCWVycm9yIG1lc3NhZ2UuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gbGQuaW5mbywgYW5kIHVzZSAiJDwqIiBzbwotCWl0J2xsIGdldCBwaWNrZWQgdXAgZnJvbSAkKHNyY2RpcikgaWYgYXBwcm9wcmlhdGUuCi0KLVR1ZSBGZWIgMTUgMTY6MzI6MDQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBPbmx5IHBhZCAudGV4dCBpZiBQQURfVEVYVCBpcyBzZXQuCi0JKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoIChQQURfVEVYVCk6IFNldCBQQURfVEVYVC4KLQotRnJpIEZlYiAxMSAxNzowMjo0OSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwgKGNvbW1lbnQpOiBJbmNyZW1lbnQgbGluZSBudW1iZXIgd2hlbiBuZXdsaW5lIGlzIHJlYWQuCi0KLUZyaSBGZWIgMTEgMTc6MzY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBUYWtlIG5ldyBhcmd1bWVudCwgZm9yY2VfbG9hZC4gIElmIHRydWUsCi0JcmVsb2FkIHRoZSBmaWxlIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuCi0JKHdpbGQpOiBDYWxsIGxvb2t1cF9uYW1lIHdpdGggZm9yY2VfbG9hZCBhcmd1bWVudCBvZiAwLgotCShvcGVuX2lucHV0X2JmZHMpOiBDYWxsIGxvb2t1cF9uYW1lIHdpdGggZm9yY2VfbG9hZCBhcmd1bWVudCBvZiAxLgotCShwcmludF9zeW1ib2wpOiBSZW1vdmUgZGVjbGFyYXRpb24gb2Ygbm9uLWV4aXN0ZW50IGZ1bmN0aW9uLgotCShwcmludF9vbmVfc3ltYm9sKTogUmV0dXJuIHRydWUgcmF0aGVyIHRoYW4gZmFsbGluZyBvZmYgZW5kLgotCi1UaHUgRmViIDEwIDExOjUyOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBVc2UgJWxkIHdoZW4gcHJpbnRpbmcgbG9uZyB2YWx1ZXMuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTW92ZSBfZWRhdGEgYWZ0ZXIgdGhlIC5zZGF0YSBzZWN0aW9uLgotCVBlcm1pdCBPVEhFUl9CU1NfU1lNQk9MUyB0byBiZSBkZWZpbmVkLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIucyAoT1RIRVJfQlNTX1NZTUJPTFMpOiBEZWZpbmUgX2Zic3MuCi0KLU1vbiBGZWIgIDcgMTY6MzE6MTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIFJlbmFtZSBhbGwgImhwcGFvc2YiIGZpbGVzIHRvICJocHBhZWxmIi4KLQkqIENoYW5nZSBhbGwgIm9zZiIgcmVmZXJlbmNlcyB0byAiZWxmIiBpbiBocHBhZWxmIGZpbGVzLgotCSogTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotU3VuIEZlYiAgNiAyMDozMTo1NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCB4YXRleGl0LCBub3QgYXRleGl0LgotCUNhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2hlY2sgaWYgYmZkX3JlbGF4X3NlY3Rpb24gc2V0Ci0JYmZkX2Vycm5vLgotCi1TYXQgRmViICA1IDAzOjU0OjM0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2xuazk2MC5lbSAoYXBwZW5kKSwgZW11bHRlbXBsL2hwcGFvc2YuZW0KLQkoaHBwYW9zZl9maW5pc2gpOiBDYWxsIHhtYWxsb2MsIG5vdCBsZG1hbGxvYy4KLQkqIGxkbWFpbi5jIChwcmVzZXJ2ZV9vdXRwdXQpOiBGdW5jdGlvbiByZW1vdmVkLgotCShtYWluKTogRG8gaXQgaGVyZSBpbnN0ZWFkLgotCi1GcmkgRmViICA0IDIzOjAyOjE5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsZGxhbmcuaCAoTEFOR19GT1JfRUFDSF97SU5QVVQsT1VUUFVUfV9TRUNUSU9OKTogRGVsZXRlICh1bnVzZWQpCi0JR05VIEMgc3BlY2lmaWMgbWFjcm9zLgotCi0JKiBlbXVsdGVtcGwvaHBwYW9zZi5lbSAoaHBwYW9zZl9maW5pc2gpOiBFeHBhbmQgdGhlIG9ubHkgcmVtYWluaW5nCi0JY2FsbCB0byBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NFQ1RJT04uCi0KLUZyaSBGZWIgIDQgMTY6MjY6MDggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAobGRtYWxsb2MsIHhtYWxsb2MsIGxkcmVhbGxvYywgeHJlYWxsb2MpOiBGdW5jdGlvbnMKLQlkZWxldGVkOyB3aWxsIHVzZSBsaWJpYmVydHkgdmVyc2lvbnMgaW5zdGVhZC4KLQkqIGxkY3Rvci5jIGxkZmlsZS5jIGxkbGFuZy5jIGxkbWFpbi5jIGxkbWlzYy5jIGxkbWlzYy5oIGxleHN1cC5jCi0JbXJpLmMgTWFrZWZpbGUuaW46IENoYW5nZSBjYWxsZXJzLgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogUmVtb3ZlIGNsZWFudXAgY29kZS4KLQkqIGxkbWFpbi5jIChyZW1vdmVfb3V0cHV0KTogUHV0IGl0IGhlcmUgKG5ldyBmdW5jdGlvbikuCi0JKHByZXNlcnZlX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KLQkobWFpbik6IFJlZ2lzdGVyIHJlbW92ZV9vdXRwdXQgYW5kIHByZXNlcnZlX291dHB1dCB3aXRoIGF0ZXhpdC4KLQkqIGxkbWFpbi5jIGxkZ3JhbS55OiBDYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4KLQkqIGxkbWlzYy5oOiBEZWNsYXJlIHhleGl0LgotCi1GcmkgRmViICA0IDE1OjE5OjAxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBMb3RzIG9mIG5ldyBIOC81MDAgbWVtb3J5IG1vZGVscy4KLQotU3VuIEphbiAzMCAxNDozMzo0MCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBSZW1vdmVkIGR1cGxpY2F0ZSBydWxlcy4KLQkoeXl3cmFwKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb24sIG5lZWRlZCB3aXRoIHNvbWUgdmVyc2lvbnMgb2YKLQlmbGV4LgotCi1GcmkgSmFuIDI4IDA5OjEyOjU2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEZvciBgJUknLCBpZiB0aGUgZmlsZSBpcyBpbiBhbiBhcmNoaXZlLCBwcmludAotCXRoZSBhcmNoaXZlIGZpbGVuYW1lIHRvby4KLQotCSogbGRsZXgubDogQWRkIHJ1bGUgdG8gY2F0Y2ggaW52YWxpZCBpbnB1dCBjaGFyYWN0ZXJzIGluc3RlYWQgb2YKLQlwcmludGluZyB0aGVtLiAgSW5jbHVkZSAibGRtYWluLmgiIGZvciBwcm9ncmFtX25hbWUgZGVjbC4KLQkobGV4X3dhcm5faW52YWxpZCk6IE5ldyBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeS4KLQotRnJpIEphbiAyOCAxMjo1ODo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBEb24ndCBib3RoZXIgcnVubmluZyBhbnkgdGVzdHMgb2YKLQljcm9zcy1saW5rZXIgdW50aWwgdGhlIHRlc3Qgc3VpdGUgbm8gbG9uZ2VyIGFzc3VtZXMgbmF0aXZlIG1vZGUuCi0KLVRodSBKYW4gMjcgMTc6MTk6NTQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHByaW50X29uZV9zeW1ib2wsIHByaW50X2lucHV0X3NlY3Rpb24pOiAgUHJpbnQKLQlnbG9iYWwgc3ltYm9scyBpbiBzeW1ib2wgdGFibGUgYWdhaW4uCi0KLVRodSBKYW4gMjcgMTI6MzU6MDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyBsZG1haW4uaCBsZGdyYW0ueTogSWYgLXYgLVYgb3IgLS12ZXJzaW9uIHdhcyBnaXZlbiwKLQlleGl0IHN1Y2Nlc3NmdWxseSBpbnN0ZWFkIG9mIGNvbXBsYWluaW5nIGlmIG5vIGlucHV0IGZpbGVzIGFyZQotCWdpdmVuLgotCi1UdWUgSmFuIDI1IDEzOjE5OjQxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEZvcm1hdCB2YXJpYWJsZSBkZWZpbml0aW9ucyBjb25zaXN0ZW50bHkuCi0JKExEX1BST0cpOiBSZW1vdmUgdW5uZWNlc3NhcnkgdmFyaWFibGVzIGZyb20gbGluayBjb21tYW5kLAotCWNoYW5nZSB2YXJpYWJsZSBMT0FETElCRVMgdG8gRVhUUkFMSUJTLgotCi0JKiBsZG1haW4uYyAobWFpbik6IENvbXB1dGUgYW5kIGRpc3BsYXkgdG90YWwgZXhlY3V0aW9uIHRpbWUuCi0JKiBsZC50ZXhpbmZvICgtc3RhdHMpOiBEb2N1bWVudCB0aGUgb3B0aW9uLgotCi1Nb24gSmFuIDI0IDEyOjU2OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHJlbG9jX292ZXJmbG93KTogQWRkZWQgbmFtZSwgcmVsb2NfbmFtZSBhbmQgYWRkZW5kCi0JYXJndW1lbnRzLgotCi0JKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBTZXQgQkZEIEdQIHNpemUgdG8gLUcgYXJndW1lbnQgdmFsdWUKLQlhZnRlciBvcGVuaW5nIEJGRC4KLQotCSogbGRsYW5nLmMgKHJlbGF4aW5nKTogUmVtb3ZlZCBnbG9iYWwgdmFyaWFibGUuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIHRoZSBjYW5vbmljYWwgc3ltYm9scyBoYXZlIG5vdCBhbHJlYWR5Ci0JYmVlbiByZWFkIGluLCByZWFkIHRoZW0gaW4gYmVmb3JlIHJlbGF4aW5nLgotCSogbGRsYW5nLmggKHJlbGF4aW5nKTogUmVtb3ZlZCBkZWNsYXJhdGlvbi4KLQotRnJpIEphbiAyMSAwMDo0NDo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBJbml0aWFsaXplIGxvYWRlZCBmaWVsZCB0byBmYWxzZS4KLQkobG9va3VwX25hbWUpOiBJZiBmaWxlIHdhcyBhbHJlYWR5IGxvYWRlZCwgZG9uJ3QgY2FsbCB0aGUKLQlhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBhZ2Fpbi4KLQotV2VkIEphbiAxOSAxMzo1NzowMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86IENsYXJpZnkgd2hhdCAtVCBvcHRpb24gZG9lcy4KLQotVHVlIEphbiAxOCAxNjoxODoxNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjOiBEb24ndCB1c2UgQ1JFQVRFX09CSkVDVF9TWU1CT0xTLCB0aGF0J3MKLQlmb3IgYS5vdXQuCi0KLVR1ZSBKYW4gMTEgMTM6MjI6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoYWRkX2FyY2hpdmVfZWxlbWVudCk6IElmIHRyYWNlX2ZpbGVzIG9yCi0JdHJhY2VfZmlsZV90cmllcywgcHJpbnQgZmlsZSBuYW1lLgotCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogTGlrZXdpc2UuCi0JKGxkbGFuZ19hZGRfZmlsZSk6IERvbid0IHB1dCBmaWxlcyBvbiBpbnB1dF9iZmRzIGxpc3QgaW4gcmV2ZXJzZQotCW9yZGVyLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IENvcnJlY3QgdHlwby4KLQotTW9uIEphbiAxMCAxOTo0OTowNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55LCBsZGxleC5sOiBNYWtlIHRoZSBzcGFjZSBiZXR3ZWVuIC1lLCAtdSwgYW5kIC15IGFuZAotCXRoZWlyIGFyZ3VtZW50cyBvcHRpb25hbCwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIEdOVSBsZC4KLQotRnJpIEphbiAgNyAyMDowMDoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5jOiBEZWZpbmUgX19ic3Nfc3RhcnQgYmVmb3JlIHRoZSAuc2JzcyBzZWN0aW9uLgotCi1UaHUgSmFuICA2IDAwOjEzOjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBBZGQgYml0c2l6ZSBhcmd1bWVudC4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBOZXcgZnVuY3Rpb24uCi0JKGxpbmtfY2FsbGJhY2tzKTogQWRkIGNvbnN0cnVjdG9yX2NhbGxiYWNrLgotCSogbGRjdG9yLmMgKHN0cnVjdCBzZXRfaW5mbyk6IEFkZCBiaXRzaXplIGZpZWxkLgotCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IEFkZCBiaXRzaXplIGFyZ3VtZW50LgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IEJhc2UgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBzZXQgb24KLQl0aGUgYml0c2l6ZSwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIExPTkcuCi0JKiBsZGN0b3IuaCAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBBZGQgYml0c2l6ZSB0byBkZWNsYXJhdGlvbi4KLQotCSogbGQuaCAoUVVBRF9TSVpFKTogRGVmaW5lLgotCSogbGRncmFtLnkgKFFVQUQpOiBOZXcgdG9rZW4uCi0JKGxlbmd0aCk6IEhhbmRsZSBpdC4KLQkqIGxkbGV4Lmw6IFJldHVybiBRVUFELgotCSogbGV4c3VwLmMgKGtleXdvcmRzKTogQWRkIFFVQUQuCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgUVVBRC4KLQkqIGxkbGFuZy5jIChwcmludF9kYXRhX3N0YXRlbWVudCk6IEhhbmRsZSBRVUFELgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkobGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQWRkIFFVQUQgdG8gdGFibGUuCi0JKiBsZC50ZXhpbmZvOiBEZXNjcmliZSBRVUFELgotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogRG9uJ3QgY3JlYXRlIC5saXQ0IG9yIC5zZGF0YSBzZWN0aW9ucywKLQlzaW5jZSB0aGUgQWxwaGEgZG9lc24ndCB1c2UgdGhlbS4KLQotV2VkIEphbiAgNSAxNzo0MjoxNiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZW11bC5oIChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBDb21tZW50IHRoZSBtZW1iZXJzLgotCi1TYXQgSmFuICAxIDEzOjM5OjMxIDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLgotCSogY29uZmlnL3ZzdGEubXQsIGVtdWxwYXJhbXMvdnN0YS5zaDogTmV3IGZpbGVzIGZvciBWU1RhLgotCi1TYXQgSmFuICAxIDEwOjUzOjM1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogUGFkIC50ZXh0IHRvIERBVEFfQUxJR05NRU5UIGlmIHJlbG9jYXRpbmc7Ci0JbmVlZGVkIGZvciBpMzg2bWFjaC4gIChTaG91bGQgYmUgYSBuby1vcCBvbiBvdGhlciBzeXN0ZW1zLikKLQotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoU0VHTUVOVF9TSVpFKTogRml4IGFnYWluLgotCShQQUdFX1NJWkUpOiBEb24ndCBkZWZpbmU7IG5vdCB1c2VkLgotCi1GcmkgRGVjIDMxIDE2OjEyOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnkgKHl5ZXJyb3IpOiBNYWtlIGFyZ3VtZW50IGNvbnN0IGNoYXIgKiwgYW5kIGFjdHVhbGx5Ci0JcHJpbnQgaXQgb3V0IHJhdGhlciB0aGFuIGFzc3VtaW5nIGl0IGlzIGEgc3ludGF4IGVycm9yLgotCSogbGRtaXNjLmg6IENoYW5nZSBkZWNsYXJhdGlvbiBvZiB5eWVycm9yLgotCSogbGRlbXVsLmMsIGxkd3JpdGUuYzogQWRkIC8qQVJHU1VTRUQqLyBhcyBhcHByb3ByaWF0ZS4KLQotRnJpIERlYyAzMSAxMTozNzoyOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2ggKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IERvbid0IGluY2x1ZGUKLQlleGVjIGhlYWRlciBvZmZzZXQsIHNpbmNlIHRoZSBleGVjIGhlYWRlciBpc24ndCBsb2FkZWQuCi0JKFBBR0VfU0laRSwgU0VHTUVOVF9TSVpFKTogQWdyZWUgd2l0aCBiZmQvaTM4Nm1hY2gzLmMuCi0KLVRodSBEZWMgMzAgMTM6MDE6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQSBtYWpvciByZXdyaXRlIHRvIG1vdmUgdGhlIGJ1bGsgb2YgdGhlIGxpbmtlciBpbnRvIEJGRCBzbyB0aGF0Ci0JbW9yZSBlZmZpY2llbnQgYmFja2VuZCBjb2RlIGNhbiBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyBvYmplY3QKLQlmaWxlcy4KLQkqIGxkZXJyb3IuYywgbGRlcnJvci5oLCBsZGluZHIuYywgbGRpbmRyLmgsIGxkc3ltLmMsIGxkc3ltLmgsCi0JbGR3YXJuLmMsIGxkd2Fybi5oLCByZWxheC5jLCByZWxheC5oOiBSZW1vdmVkLgotCSogbGRjdG9yLmMsIGxkY3Rvci5oOiBDb21wbGV0ZSByZXdyaXRlLgotCSogbGR3cml0ZS5jLCBsZHdyaXRlLmg6IENvbXBsZXRlIHJld3JpdGUuCi0JKiBsZC5oIChzdHJpcF9zeW1ib2xzX3R5cGUsIHN0cmlwX3N5bWJvbHMpOiBSZW1vdmVkLiAgVXNlCi0JbGlua19pbmZvLnN0cmlwIGluc3RlYWQuICBDaGFuZ2VkIGFsbCB1c2VzLgotCShkaXNjYXJkX2xvY2Fsc190eXBlLCBkaXNjYXJkX2xvY2Fscyk6IFJlbW92ZWQuICBVc2UKLQlsaW5rX2luZm8uZGlzY2FyZCBpbnN0ZWFkLiAgQ2hhbmdlZCBhbGwgdXNlcy4KLQkobGRfY29uZmlnX3R5cGUpOiBSZW1vdmVkIHJlbG9jYXRlYWJsZV9vdXRwdXQgZmllbGQ7IHVzZQotCWxpbmtfaW5mby5yZWxvY2F0ZWFibGUgaW5zdGVhZDsgY2hhbmdlZCBhbGwgdXNlcy4gIEFkZGVkIHN0YXRzCi0JZmllbGQuCi0JKHNldF9hc3ltYm9sX2NoYWluLCBnZXRfYXN5bWJvbF9jaGFpbiwgZ2V0X2xvYWRlcl9zeW1ib2wsCi0Jc2V0X2xvYWRlcl9zeW1ib2wpOiBSZW1vdmVkLgotCSogbGRleHAuaCAobm9kZV9jbGFzcyk6IEFkZGVkIGV0cmVlX3JlbC4KLQkoZXRyZWVfdHlwZSk6IEFkZGVkIHJlbCBmaWVsZC4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90b2tlbik6IEJyYWNrZXRlZCB0YWJsZSBpbml0aWFsaXphdGlvbi4KLQkoZXhwX3JlbG9wKTogTmV3IGZ1bmN0aW9uLgotCShmb2xkX25hbWUpOiBVc2UgbGlua2VyIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gbGRzeW0gZnVuY3Rpb25zLgotCShleHBfZm9sZF90cmVlKTogTGlrZXdpc2UuICBBbHNvLCBoYW5kbGUgZXRyZWVfcmVsIGNhc2UuCi0JKGV4cF9wcmludF90cmVlKTogSGFuZGxlIGV0cmVlX3JlbC4KLQkqIGxkZ3JhbS55IChzdHJpcF9zeW1ib2xzLCBkaXNjYXJkX2xvY2Fscyk6IFJlbW92ZWQuCi0JKE9QVElPTl9zdGF0cywgT1BUSU9OX25vX2tlZXBfbWVtb3J5KTogTmV3IHRva2Vucy4gIEhhbmRsZSB0aGVtLgotCShSRUwpOiBOZXcgdG9rZW4uICBEb2VzIG5vdCBhcHBlYXIgaW4gZ3JhbW1hciwgYnV0IG5lZWRlZCBmb3IKLQlleHByZXNzaW9uIGNvZGUuCi0JKGZpbGUpOiBEb24ndCBjYWxsIGxhbmdfZmluYWw7IGl0J3MgY2FsbGVkIGJ5IG1haW4gYW55aG93LgotCSogbGRsZXgubDogQWNjZXB0IC1zdGF0cyBhbmQgLW5vLWtlZXAtbWVtb3J5IG9wdGlvbnMuCi0JKiBsZGxhbmcuaCAoZmlsbF90eXBlKTogTWFrZSB1bnNpZ25lZCBpbnQsIG5vdCB1bnNpZ25lZCBzaG9ydC4KLQkqIGxkbGFuZy5jOiBDb25zaXN0ZW50bHkgdXNlIGZpbGxfdHlwZSBmb3IgZmlsbCBhcmd1bWVudC4KLQkobGFuZ19pbml0X3NjcmlwdF9maWxlLCBzY3JpcHRfZmlsZSk6IFJlbW92ZWQuCi0JKGNyZWF0ZV9vYmplY3Rfc3ltYm9scyk6IFJlbW92ZWQuICBVc2UKLQlsaW5rX2luZm8uY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gaW5zdGVhZC4gIENoYW5nZWQgYWxsCi0JdXNlcy4KLQkobGFuZ19hZGRfa2VlcHN5bXNfZmlsZSk6IFJlbW92ZWQuCi0JKGxvb2t1cF9uYW1lKTogQ2FsbCBiZmRfbGlua19hZGRfc3ltYm9scyBpbnN0ZWFkIG9mCi0JbGRtYWluX29wZW5fZmlsZV9yZWFkX3N5bWJvbC4KLQkod2lsZCk6IERvbid0IGl0ZXJhdGUgb3ZlciBzY3JpcHRfZmlsZS4KLQkob3Blbl9vdXRwdXQpOiBDcmVhdGUgbGluayBoYXNoIHRhYmxlLgotCShsYW5nX3BsYWNlX3VuZGVmaW5lZHMpOiBSZXdyb3RlLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBIYW5kbGUgcmVsYXhpbmcgKGRvZXNuJ3Qgd29yayB5ZXQpLgotCShsYW5nX3JlbG9jYXRlX2dsb2JhbHMpOiBSZW1vdmVkLgotCShsYW5nX2ZpbmlzaCk6IFVzZSBsaW5rIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gbGRzeW0gZnVuY3Rpb25zLgotCShsYW5nX2NvbW1vbik6IFJld3JvdGUuCi0JKGxhbmdfb25lX2NvbW1vbik6IE5ldyBmdW5jdGlvbi4KLQkobGRsYW5nX2FkZF9maWxlKTogQWRkIGZpbGUgdG8gbGlua19pbmZvLmlucHV0X2JmZHMgbGlzdC4gIFNldAotCXVzcmRhdGEuCi0JKGNyZWF0ZV9zeW1ib2wpOiBSZW1vdmVkLgotCShsYW5nX3Byb2Nlc3MpOiBEb24ndCBjYWxsIGxhbmdfaW5pdF9zY3JpcHRfZmlsZS4gIENhbGwKLQlsZGN0b3JfYnVpbGRfc2V0cyByYXRoZXIgdGhhbiBmaW5kX2NvbnN0cnVjdG9ycy4gIERvbid0IGNhbGwKLQlsYW5nX3JlbG9jYXRlX2dsb2JhbHMuCi0JKGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YpOiBSZXdyb3RlLgotCShsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKTogUmV3cm90ZS4KLQkqIGxkbWFpbi5jIChoYWRfeSk6IFJlbW92ZWQuCi0JKGxwcmVmaXgsIGxwcmVmaXhfbGVuKTogUmVtb3ZlZDsgdXNlIGxpbmtfaW5mbyBmaWVsZHMgaW5zdGVhZC4KLQlDaGFuZ2VkIGFsbCB1c2VzLgotCShtdWx0aXBsZV9kZWZfY291bnQsIGNvbW1vbnNfcGVuZGluZywgdW5kZWZpbmVkX2dsb2JhbF9zeW1fY291bnQsCi0JdG90YWxfc3ltYm9sc19zZWVuLCB0b3RhbF9maWxlc19zZWVuKTogUmVtb3ZlZC4KLQkobGlua19jYWxsYmFja3MsIGxpbmtfaW5mbyk6IE5ldyB2YXJpYWJsZXMuCi0JKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby4gIERvbid0IGNhbGwgaW5pdF9iZmRfZXJyb3JfdmVjdG9yIG9yCi0JbGRzeW1faW5pdC4gIERvbid0IHNldCBub3cgdW51c2VkIHZhcmlhYmxlcy4gIEhhbmRsZSAtc3RhdHMuCi0JKGdldF9lbXVsYXRpb24pOiBSZW1vdmVkIG9ic29sZXRlIGFuZCBub25mdW5jdGlvbmFsIEdOVTk2MCBjb2RlLgotCShhZGRfeXN5bSk6IFJld3JvdGUuCi0JKHJlYWRfZW50cnlfc3ltYm9scywgcmVmaXplLCBlbnRlcl9nbG9iYWxfcmVmLCBlbnRlcl9maWxlX3N5bWJvbHMsCi0Jc2VhcmNoX2xpYnJhcnksIGdudTk2MF9jaGVja19mb3JtYXQsIGRlY29kZV9saWJyYXJ5X3N1YmZpbGUsCi0JbGluZWFyX2xpYnJhcnksIHN5bWRlZl9saWJyYXJ5LCBjbGVhcl9zeW1zLCBzdWJmaWxlX3dhbnRlZF9wKToKLQlSZW1vdmVkLgotCShhZGRfa2VlcHN5bXNfZmlsZSwgYWRkX2FyY2hpdmVfZWxlbWVudCwgbXVsdGlwbGVfZGVmaW5pdGlvbiwKLQltdWx0aXBsZV9jb21tb24sIGFkZF90b19zZXQsIHdhcm5pbmdfY2FsbGJhY2ssIHVuZGVmaW5lZF9zeW1ib2wsCi0JcmVsb2Nfb3ZlcmZsb3csIHJlbG9jX2Rhbmdlcm91cywgdW5hdHRhY2hlZF9yZWxvYywgbm90aWNlX3lzeW0pOgotCU5ldyBmdW5jdGlvbnMuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQWNjZXB0IGEgc3RyaW5nIGZvciAlVCwgbm90IGEgc3ltYm9sLiAgRG9uJ3QKLQlyZXF1aXJlIHN5bWJvbHMgZm9yICVDOyBsb29rIHRoZW0gdXAgaW5zdGVhZC4KLQkqIGVtdWx0ZW1wbC9ocHBhb3NmLmVtOiBQYXNzIGxpbmtfaW5mbyB0bwotCWhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBsZGVycm9yLmMsIGxkaW5kci5jLCBsZHN5bS5jLCBsZHdhcm4uYywgYW5kCi0JcmVsYXguYy4KLQkoSEZJTEVTKTogUmVtb3ZlZCBsZGVycm9yLmgsIGxkaW5kci5oLCBsZHN5bS5oLCBsZHdhcm4uaCwgYW5kCi0JcmVsYXguaC4KLQkoRU1VTEFUSU9OX09GSUxFUyk6IERlcGVuZCBvbiBiZmRsaW5rLmgsIGxkbWFpbi5oLCBsZGV4cC5oLAotCWxkbGFuZy5oIGFuZCBsZGN0b3IuaC4KLQotCSogTWFrZWZpbGUuaW4gKGxkbGV4LmMpOiBEb24ndCBkZXBlbmQgb24gbGRncmFtLmguICBSZW1vdmUKLQlkZWNsYXJhdGlvbnMgb2YgZnJlZSBhbmQgbWFsbG9jIGZyb20gZmxleCBvdXRwdXQuICBDaGFuZ2UgbWFsbG9jCi0JdG8gbGRtYWxsb2MgaW4gZmxleCBvdXRwdXQuCi0KLVRodSBEZWMgMTYgMjE6MTk6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxkbWFpbi5jIChscHJlZml4KTogQ2hhbmdlIGRlZmF1bHQgZnJvbSBhIGNoYXIgdG8gYSBzdHJpbmcKLQl3aXRoIG9ubHkgb25lIGNoYXJhY3Rlci4KLQkobHByZWZpeF9sZW4pOiBTZXQgZGVmYXVsdCB0byBvbmUuCi0KLQkqIGxkbWFpbi5oIChscHJlZml4X2xlbik6IERlY2xhcmUuCi0KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogVXNlIHN0cm5jbXAgcmF0aGVyIHRoYW4gYSBjaGFyYWN0ZXIKLQljb21wYXJpc29uIGZvciBscHJlZml4LgotCi0JKiBlbXVsdG1wbC9tODhrYmNzLmVtIChiZWZvcmVfcGFyc2UpOiBTZXQgbHByZWZpeCBhbmQgbHByZWZpeF9sZW4KLQljb3JyZWN0bHkuCi0KLQkqIGVtdWx0bXBsL2hwcGFvc2YuZW06IEluY2x1ZGUgbGRleHAuaC4KLQkoYmVmb3JlX3BhcnNlKTogU2V0IGxwcmVmaXggYW5kIGxwcmVmaXhfbGVuIGNvcnJlY3RseS4KLQotVHVlIERlYyAxNCAxNzoxOTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmg6IERvbid0IGRlY2xhcmUgeXl3cmFwIGlmIGl0IGlzIGEgbWFjcm8uCi0JKiBsZGxleC5sOiBJbmNsdWRlIHN5c2RlcC5oLgotCSogbGRsYW5nLmMgKGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciwKLQlsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCk6IEZvcmdvdCB0byB1c2UgUEFSQU1TLgotCi1Nb24gRGVjIDEzIDE0OjMwOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIC5QSE9OWSB0YXJnZXRzIHdoZXJlIGFwcHJvcHJpYXRlLiAgQWRkZWQgc29tZQotCWNvbW1lbnRzLiAgQWxzbzoKLQkoZ2NjbGliZGlyLCB2ZXJzaW9uKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzLgotCShERVApOiBOZXcgdmFyaWFibGUsIHNldCB0byBta2RlcC4KLQkoQUxMX0NGTEFHUyk6IE5ldyB2YXJpYWJsZS4gIFVzZWQgaW4gLmMubyB0YXJnZXQuCi0JKENGSUxFUywgSEZJTEVTLCBHRU5FUkFURURfQ0ZJTEVTLCBHRU5FUkFURURfSEZJTEVTKTogTmV3Ci0JdmFyaWFibGVzLgotCShIRUFERVJTLCBNQU5TT1VSQ0VTLCBMRENTT1VSQ0VTLCBHRU5FUkFURURfU09VUkNFUywKLQlHRU5FUkFURURfSEVBREVSUywgTERTT1VSQ0VTLCBCRkRfU09VUkNFUywgU09VUkNFUyk6IFJlbW92ZWQKLQltb3N0bHkgb2Jzb2xldGUgdmFyaWFibGVzLiAgQWRqdXN0ZWQgcmVtYWluaW5nIHVzZXMuCi0JKERFRl9FTVVMKTogUmVtb3ZlZCB2YXJpYWJsZS4KLQkobGRtYWluLm8pOiBIYW5kbGUgdW5kZWZpbmVkIEVNVUwgZXJyb3IgY29ycmVjdGx5LgotCShsZGVtdWwtbGlzdC5oKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMgcmF0aGVyIHRoYW4gTWFrZWZpbGUuCi0JQ3JlYXRlIHZpYSB0ZW1wb3JhcnkgZmlsZS4KLQkodmVyOTYwLmMsIHJvbGwsIG1ha2UpOiBSZW1vdmVkIG9ic29sZXRlIHRhcmdldHMuCi0JKC5kZXAsIC5kZXAxLCBkZXAuc2VkLCBkZXAsIGRlcC1pbik6IE5ldyB0YXJnZXRzLiAgVXNlZCB0byByZWJ1aWxkCi0JZGVwZW5kZW5jaWVzLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUsIHVzZWQgd2hlbiByZWJ1aWxkaW5nIGRlcGVuZGVuY2llcy4KLQotU2F0IERlYyAxMSAxNDo0Mzo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGRlbmViLmN5Z251cy5jb20pCi0KLQlNYWRlIG1hbnkgY2hhbmdlcyB0byBlbGltaW5hdGUgZ2NjIHdhcm5pbmdzLiAgTWFkZSB2YXJpb3VzCi0JY29zbWV0aWMgY2hhbmdlcywgZGVjbGFyZWQgdmFyaW91cyB0aGluZ3MgaW4gaGVhZGVyIGZpbGVzLCByZW1vdmVkCi0JdmFyaW91cyBleHRlcm4gZGVjbGFyYXRpb25zIGZyb20gLmMgZmlsZXMuICBObyBzdWJzdGFudGl2ZQotCWNoYW5nZXMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBJZmRlZiBvdXQgZmluYWwgY2FsbCB0bwotCWxhbmdfc2l6ZV9zZWN0aW9ucyBhZ2FpbiAocmV2ZXJ0aW5nIGNoYW5nZSBvZiBOb3ZlIDIpLCBzaW5jZSBpdAotCWJyZWFrcyB0aGUgU3VuNCBsaW5rZXIuCi0KLVRodSBEZWMgIDIgMTY6MzE6NDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotbmV0d2FyZSopOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEuCi0KLVdlZCBEZWMgIDEgMTQ6MDQ6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogR3JvdXAgdGFyZ2V0cyBieSBDUFUuICBNZXJnZSBzb21lIG02OGsgdGFyZ2V0Ci0JZW50cmllcyB3aXRoIGRpZmZlcmVudCBDUFUgc3BlY3MgdGhhdCB1c2UgdGhlIHNhbWUgbGRfdGFyZ2V0Ci0JdmFsdWVzLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzcGFyYyotKi1jb2ZmLgotCSogY29uZmlnL2NvZmYtc3BhcmMubXQsIGVtdWxwYXJhbXMvY29mZl9zcGFyYy5zaDogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtX2NvZmZfc3BhcmMuby4KLQkoZW1fY29mZl9zcGFyYy5jKTogQWRkIGRlcGVuZGVuY2llcyBhbmQgYnVpbGQgcnVsZXMuCi0KLQkqIGxkbWlzYy5jIChlcnJubywgc3lzX25lcnIsIHN5c19lcnJsaXN0KTogRG9uJ3QgZGVjbGFyZS4KLQotV2VkIERlYyAgMSAxMjoxOTo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55IChPUFRJT05fY2FsbF9zaGFyZWQsIE9QVElPTl9ub25fc2hhcmVkLCBPUFRJT05fT3ZhbCk6Ci0JTmV3IHRva2Vucy4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBhbmQgaWdub3JlIHRoZW0gKGZvciBub3cpLgotCSogbGRsZXgubCAoPENPTU1BTkQ+KTogSGFuZGxlIC1ub25fc2hhcmVkLCAtY2FsbF9zaGFyZWQsIGFuZCAtT24KLQl3aGVyZSBuIGlzIGEgbnVtYmVyLgotCi1Nb24gTm92IDIyIDE0OjE0OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBJZiBtZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aGljaCBpcwotCW5vdCBpbiBiZmRfY29tX3NlY3Rpb24sIGNyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgQkZEIHNvIHRoYXQgaXQKLQljYW4gYmUgcGxhY2VkIGluIHRoZSByaWdodCBvdXRwdXQgc2VjdGlvbi4KLQotRnJpIE5vdiAxOSAxNDoxMjozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg1Kik6IE5ldyB0YXJnZXQuICBVc2UgbWlwc2ItZWxmMzIuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwc2Iuc2ggKERBVEFfQUREUik6IERlZmluZS4KLQkoT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMpOiBEZWZpbmUgZm9yIC5yZWdpbmZvLgotCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBEZWZpbmUgZm9yIF9EWU5BTUlDX0xJTksuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSBFWEVDVVRBQkxFX1NZTUJPTFMgd2hlbiBub3QgcmVsb2NhdGluZy4KLQlNb3ZlIE9USEVSX1JFQURPTkxZX1NFQ1RJT05TIGFmdGVyIGFsbCB0aGUgb3RoZXIgcmVhZG9ubHkKLQlzZWN0aW9ucy4gIERvbid0IHVzZSBEQVRBX0FERFIgdHdpY2UuCi0KLQkqIGxkbWFpbi5jIChlbnRlcl9maWxlX3N5bWJvbHMpOiBSZW1vdmVkIGR1cGxpY2F0ZSB0ZXN0cyBvZiBwLiAgSWYKLQlwIGlzIGluIGEgY29tbW9uIHNlY3Rpb24sIG1ha2Ugc3VyZSB0aGUgQkZEIGhhcyBhIHNlY3Rpb24gb2YgdGhhdAotCW5hbWUuCi0KLQkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IEFkZCBuZXdsaW5lIHRvIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBOb3YgMTEgMTU6NTQ6NDEgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL202OGtseW54LnNoIChTQ1JJUFRfTkFNRSk6IERlZmluZSB0byB1c2UgYQotCUx5bngtc3BlY2lmaWMgc2NyaXB0IGluc3RlYWQgb2YgbTY4a2NvZmYuCi0JKE9VVFBVVF9GT1JNQVQpOiBEZWZpbmUgYXMgImNvZmYtbTY4ay1seW54Ii4KLQkoRU5UUlkpOiBEZWZpbmUgYXMgX19tYWluLgotCShURVhUX1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgMC4KLQkoUEFHRV9TSVpFKTogRGVmaW5lIGFzIDB4MTAwMC4KLQkqIGVtdWxwYXJhbXMvaTM4Nmx5bnguc2gsIGVtdWxwYXJhbXMvc3BhcmNseW54LnNoOiBGaXggY29tbWVudC4KLQkqIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgOCAxMjowMDoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uKTogSWdub3JlIC1taXBzMSwgLW1pcHMyIGFuZCAtbWlwczMKLQlhcmd1bWVudHMgcmF0aGVyIHRoYW4gdHJlYXRpbmcgdGhlbSBhcyBlbXVsYXRpb24gbmFtZXMuCi0KLUZyaSBOb3YgIDUgMDk6MDI6NTIgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFN1cHBvcnQgeDg2IHVuaXh3YXJlIGFuZCBuZXR3YXJlIHBsdXMgZ2VuZXJpYyBuZXR3YXJlLgotCi1GcmkgTm92ICA1IDIxOjQ3OjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoVEVYVF9TVEFSVF9BRERSLCBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOgotCUNvcnJlY3QgdmFsdWVzICg/KS4KLQotV2VkIE5vdiAgMyAxNToxMDoxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IGRlbGV0ZSBkdmkgb3IgaW5mbyBmaWxlcy4KLQkobGQuaW5mbyk6IFVwZGF0ZSBkZXBlbmRlbmN5IGxpc3QuCi0JKGxkLmR2aSk6IERpdHRvLiAgRXh0ZW5kIFRFWElOUFVUUyB0byBnZXQgYmZkc3VtbS50ZXhpLgotCi1XZWQgTm92ICAzIDEyOjA3OjM5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfYWRkX291dHB1dCk6IFRha2UgbmV3IGFyZywgRlJPTV9TQ1JJUFQuCi0JU2V0IG91dHB1dF9maWxlbmFtZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG5vZGUuCi0JKG9wZW5fb3V0cHV0KTogRG9uJ3Qgc2V0IG91dHB1dF9maWxlbmFtZS4KLQkobGFuZ19maW5hbCk6IENyZWF0ZSB0aGUgbmV3IG5vZGUgaGVyZS4KLQkqIGxkbGFuZy5jLCBsZGxhbmcuaCwgbGRncmFtLnksIG1yaS5jOiBwYXNzIEZST01fU0NSSVBULgotCi1UdWUgTm92ICAyIDE1OjQ1OjUxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gCUZyb20gUGV0ZSBIb29nZW5ib29tIChob29nZW5AY3MudXRhaC5lZHUpOgotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhb3NmLnNjOiAoX19fc3RhY2tfemVybywgZXRleHQsIF9ldGV4dCwKLQllZGF0YSwgX2VkYXRhLCBlbmQpOiBBZGQgZGVmaW5pdGlvbnMgb2YgdGhlc2Ugc3ltYm9scy4KLQkoX19lbmQpOiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgdGhpcyBzeW1ib2wuCi0JKF9fZGF0YV9zdGFydCk6IE1vdmUgZGVmaW5pdGlvbiBvZiB0aGlzIHN5bWJvbC4KLQotCSogZW11bHRlbXBsL2hwcGFvc2YuZW06ICBWYXJpb3VzIGZpeGVzIGFuZCBzdXBwb3J0IGZvciBsaW5rZXIgc3R1YgotCWdlbmVyYXRpb24uCi0JKGhwcGFvc2ZfZmluaXNoLCBocHBhb3NmX3NlYXJjaF9mb3JfcGFkZGluZ19zdGF0ZW1lbnRzLAotCWhwcGFvc2ZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBOZXcgZnVuY3Rpb25zIGluCi0Jc3VwcG9ydCBvZiBsaW5rZXIgc3R1YiBnZW5lcmF0aW9uLgotCShsZF9ocHBhb3NmX2VtdWxhdGlvbik6ICBSZWRlZmluZSB0byBpbmNsdWRlIG5ldwotCWVtdWxhdGlvbi1zcGVjaWZpYyByb3V0aW5lcy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IFJlLWVuYWJsZSBsYXN0IGNhbGwgbGFuZ19zaXplX3NlY3Rpb25zLgotCVBhc3MgYWJzX291dHB1dF9zZWN0aW9uIHJhdGhlciB0aGFuIE5VTEwgdG8gYXZvaWQgaW52YWxpZGF0aW5nCi0JYWJzb2x1dGUgc3ltYm9scy4KLQotVGh1IE9jdCAyOCAyMToxNjo0MiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9pMzg2bWFjaC5vLgotCShlbV9pMzg2bWFjaC5jKTogTmV3IHJ1bGUuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1tYWNoKik6IE5ldyBjYXNlLgotCSogY29uZmlnL2kzODYtbWFjaC5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoOiBOZXcgZmlsZS4KLQotRnJpIE9jdCAyOSAxNDo1NTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkLmggKGZsYWdfaXNfKik6IFJlbW92ZWQgbWFjcm9zLgotCSogbGRtYWluLmMgKGVudGVyX2dsb2JhbF9yZWYpLCBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6Ci0JQ29uc2lzdGVudGx5IGNoZWNrIHRoZSBCRkQgc3ltYm9sIGZsYWdzIGRpcmVjdGx5LCByYXRoZXIgdGhhbgotCXVzaW5nIGZpbGVfaXNfKiBtYWNyb3MuCi0KLVRodSBPY3QgMjggMTk6MDg6NDIgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLWx5bnhvcyopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBlbV9zcGFyY2x5bnguYy4KLQkoQUxMX0VNVUxBVElPTlMpOiBBZGQgTHlueCBlbXVsYXRpb25zLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9zcGFyY2x5bnguc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyOCAxMzo1MDoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeSBmb3IgJChFTVVMQVRJT05fT0ZJTEVTKS4KLQotTW9uIE9jdCAyNSAxNjowOToyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbGF4LmMgKHdyaXRlX3JlbGF4KTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZWNsZXRfbGluay4KLQotTW9uIE9jdCAyNSAwOTozMToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlKTogTmV3IHZhcmlhYmxlLgotCShvcGVuX291dHB1dCk6IFNldCBpdCBhZnRlciBiZmQgb3BlbiBzdWNjZWVkcy4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBUZXN0IGl0LgotCi0JQ2hhbmdlcyBmcm9tIFBldGVyIEhvb2dlbmJvb20sIGhvb2dlbkBjcy51dGFoLmVkdToKLQotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBTZXQgdGhlIEJTRl9GSUxFIGZsYWcgZm9yIG9iamVjdAotCXN5bWJvbHMuCi0KLQkqIGxkZW11bC5jOiBTdXBwb3J0IHdhcyBhZGRlZCB0byBhbGxvdyBlbXVsYXRpb24tc3BlY2lmaWMKLQlwcm9jZXNzaW5nIHRvIG9jY3VyLiAgVGhpcyBzdXBwb3J0IHdhcyBhZGRlZCBwcmltYXJpbHkgZm9yIGxpbmtlcgotCXN0dWIgZ2VuZXJhdGlvbiBpbiB0aGUgZWxmMzItaHBwYSBnbGQuCi0JKGxkZW11bF9maW5pc2gsIGxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6ICBOZXcKLQlmdW5jdGlvbnMuCi0JKiBsZGVtdWwuaDogU3VwcG9ydCB3YXMgYWRkZWQgdG8gYWxsb3cgZW11bGF0aW9uLXNwZWNpZmljCi0JcHJvY2Vzc2luZyB0byBvY2N1ci4gKEFzIGRlc2NyaWJlZCBhYm92ZS4pICBBZGRlZCBmaW5pc2ggYW5kCi0JY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgZmllbGRzIHRvCi0JbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IHN0cnVjdHVyZS4KLQkqIGxkbGFuZy5jOiBBZGQgY2FsbHMgdG8gZW11bGF0aW9uLXNwZWNpZmljIHJvdXRpbmVzLgotCShsYW5nX3Byb2Nlc3MpOiAgQWRkIGNhbGwgdG8KLQlsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgZnVuY3Rpb24uCi0JKGxhbmdfcHJvY2Vzcyk6ICBBZGQgY2FsbCB0byBhIGVtdWxhdGlvbi1zcGVjaWZpYyByb3V0aW5lIChhbmQKLQlzb21lIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGNhbGwpLgotCi1GcmkgT2N0IDIyIDIwOjU0OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBtaXBzKi0gaW5zdGVhZCBvZiBtaXBzLSwgbWlwcyplbCBjaGFuZ2VzCi0KLVR1ZSBPY3QgMTkgMTU6NDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotb3NmKik6IE5ldyB0YXJnZXQ7IHVzZSBhbHBoYS5tdC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX2FscGhhLm8uCi0JKGVtX2FscGhhLmMpOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEuc2ggYW5kIGFscGhhLnNjLgotCSogY29uZmlnL2FscGhhb3NmLm1oIChOQVRJVkVfTElCX0RJUlMsIEhPU1RJTkdfQ1JUMCk6IERlZmluZS4KLQkqIGNvbmZpZy9hbHBoYS5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2FscGhhLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBOZXcgZmlsZS4KLQotRnJpIE9jdCAxNSAwMjoyMDowNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2NvbW1vbik6IEFMSUdOX04gY2FuJ3QgaGFuZGxlCi0JdHlwZXMgb2YgZGlmZmVyZW50IHNpemVzIChlZzogNjQgYW5kIDMyIGJpdHMpLCBzbyBjb2VyY2UuCi0JKiBsZC5oIChBTElHTl9OKTogQWRkIHdhcm5pbmcgYWJvdXQgdXNhZ2UuCi0KLVdlZCBPY3QgMTMgMTY6MDI6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoZW50ZXJfZ2xvYmFsX3JlZik6IEp1c3QgaWdub3JlIGFueSB3ZWFrIHN5bWJvbCBmb3IKLQl3aGljaCB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uLCByYXRoZXIgdGhhbiBjaGVja2luZyBpbgotCXNldmVyYWwgZGlmZmVyZW50IHBsYWNlcyB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgd2Vhay4KLQotVHVlIE9jdCAxMiAxNzozMDo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVsZiopOiBOZXcgdGFyZ2V0OyB1c2UgbWlwc2ItZWxmMzIuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE9ubHkgdXNlIE9USEVSX1JFQURPTkxZX1NFQ1RJT05TIGFuZAotCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyBpZiByZWxvY2F0aW5nLiAgU2hlbGwgdmFyaWFibGVzIGFyZSBub3QKLQlleHBhbmRlZCB3aXRoaW4gdGhlbS4KLQkqIGNvbmZpZy9taXBzYi1lbGYzMi5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoZW1fZWxmMzJtaXBiLmMpOiBOZXcgdGFyZ2V0LgotCi1UaHUgU2VwIDMwIDE3OjAwOjM2IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IEluIGlucHV0X2xpc3QsIGNoYW5nZSBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtIHRvCi0JbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0gc28gb2JqZWN0cyBicm91Z2h0IGluIHVzaW5nCi0JSU5QVVQoKSBkbyBhIHBhdGggbG9va3VwLgotCi1UdWUgU2VwIDI4IDEzOjMxOjIzIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgTHlueCBsZF90YXJnZXQgdG8gYmUge2kzODYsbTY4a30tbHlueAotCWluc3RlYWQgb2Yge2kzODYsbTY4a30tY29mZi4KLQkqIE1ha2VmaWxlLmluIChlbV9pMzg2bHlueC5jLCBlbV9tNjhrbHlueC5jKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWcvaTM4Ni1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9pMzg2bHlueC5zaDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL202OGtseW54LnNoOiBOZXcgZmlsZS4KLQotCSogc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2M6IE1ha2UgRU5UUlkgZ2V0IGl0cyB2YWx1ZSBmcm9tICR7RU5UUll9LAotCWJ1dCBkZWZhdWx0aW5nIHRvIF9zdGFydC4KLQotCSogbGRlbXVsLmMsIGxkZmlsZS5jLCBsZGxhbmcuYywgbGRtYWluLmMsIGxkbWlzYy5jLCBsZG1pc2MuaCwKLQlsZHN5bS5jLCBsZHdhcm4uYzogUmVuYW1lIGluZm8gdG8gaW5mb19tc2csIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGgKLQlMeW54T1MgbGliYy4KLQotVGh1IFNlcCAyMyAxNDo1MTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogTmV3IGZpbGUuICBEZWZpbmUgSE9TVElOR19DUlQwIGFuZAotCUhPU1RJTkdfTElCUyBmb3IgdGVzdGluZy4KLQotRnJpIFNlcCAxNyAxNzo1MjoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlGaW5pc2ggdXAgc3VwcG9ydCBmb3IgaTM4Ni1zeXN2NCAod2l0aG91dCBzaGFyZWQgbGlicmFyaWVzKToKLQkqIGxkLmggKGZsYWdfaXNfd2Vhayk6IERlZmluZS4KLQkqIGxkbGFuZy5jIChwcmludF9zeW1ib2wpOiBNZW50aW9uIHdoZXRoZXIgc3ltYm9sIGlzIHdlYWsuCi0JKHByaW50X2lucHV0X3NlY3Rpb24pOiBQcmludCB3ZWFrIHN5bWJvbHMgYXMgZ2xvYmFscy4KLQkqIGxkbWFpbi5jIChyZWZpemUpOiBEbyBub3QgemVybyBvdXQgQlNGX1dFQUsgZmxhZy4KLQkoZW50ZXJfZ2xvYmFsX3JlZik6IERvIG5vdCB3YXJuIGlmIGEgd2VhayBzeW1ib2wgcmVkZWZpbmVzIGEKLQlnbG9iYWwgc3ltYm9sLiAgRG8gbm90IGxldCBhIHdlYWsgc3ltYm9sIHJlZGVmaW5lIGEgY29tbW9uIHN5bWJvbC4KLQkoZW50ZXJfZmlsZV9zeW1ib2xzKTogVHJlYXQgd2VhayBzeW1ib2xzIGFzIGdsb2JhbCBzeW1ib2xzLgotCShzdWJmaWxlX3dhbnRlZF9wKTogRG8gbm90IHB1bGwgaW4gYW4gb2JqZWN0IGZpbGUgZnJvbSBhIGFyY2hpdmUKLQlqdXN0IHRvIHJlc29sdmUgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IERvbid0IG5lZWRsZXNzbHkgbWFsbG9jIHNwYWNlIGFmdGVyIGEgZmF0YWwKLQllcnJvcjsgdGhlIGVycm9yIG1pZ2h0IGJlIHRoYXQgbWFsbG9jIGhhcyBydW4gb3V0IG9mIHNwYWNlLgotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgZ2xvYmFsLgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc3lzdjQqLCBpWzM0XTg2LSotZWxmKik6IE5ldyB0YXJnZXRzOwotCXVzZSBpMzg2LWVsZi4KLQkqIGNvbmZpZy9pMzg2djQubWg6IE5ldyBmaWxlOyBzZXQgTkFUSVZFX0xJQl9ESVJTIHRvIC91c3IvY2NzL2xpYi4KLQkqIGNvbmZpZy9pMzg2LWVsZi5tdDogTmV3IGZpbGU7IHNldCBFTVVMIHRvIGVsZl9pMzg2LgotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSAke05PUH0gYXMgZmlsbGVyIChkZWZhdWx0cyB0byAwKS4KLQkqIE1ha2VmaWxlLmluIChOQVRJVkVfTElCX0RJUlMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtX2VsZl9pMzg2Lm8uCi0JKEdFTlNDUklQVFMpOiBQYXNzIE5BVElWRV9MSUJfRElSUyBhcyBzaXh0aCBhcmd1bWVudC4KLQkoZW1fZWxmX2kzODYuYyk6IE5ldyB0YXJnZXQsIGxpa2Ugb3RoZXIgZW1fKi5jIHRhcmdldHMuCi0JKCQoTERfUFJPRykpOiBQYXNzICQoQ0ZMQUdTKSB0byAkKENDKS4KLQkqIGdlbnNjcmlwdHMuc2g6IEFjY2VwdCBOQVRJVkVfTElCX0RJUlMgYXMgc2l4dGggYXJndW1lbnQuICBJZgotCW5vbmVtcHR5LCBhbmQgY29uZmlndXJlZCBmb3IgbmF0aXZlLCBhZGQgaXQgdG8gTElCX1BBVEguCi0KLUZyaSBTZXAgMTcgMTM6MDc6MzkgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC97aDgzMDAuc2MsaDg1MDAuc2MsaTM4NmNvZmYuc2MsbTY4a2NvZmYuc2Msc2guc2N9OgotCUFkZGVkIHN0YXRlbWVudHMgdG8gcGFzcyBzdGFiIGFuZCBzdGFic3RyIHNlY3Rpb25zIHRocm91Z2ggYW5kCi0JbWFyayB0aGVtIGFzIE5PTE9BRCwgd2hpY2ggbWFrZXMgR0RCIGhhcHBpZXIuCi0KLVdlZCBTZXAgMTUgMTY6MDI6MjkgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBtNjhrLWx5bngtbHlueG9zIGNvbmZpZy4KLQotCSogTWFrZWZpbGUuaW46IFVzZSAkKFNIRUxMKSB0byBydW4gZ2Vuc2NyaXB0cy5zaC4KLQotU3VuIFNlcCAxMiAxNjowNDo0MCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jb2ZmLWg4MzAwLm10OiBBZGQgRU1VTD1oODMwMGguCi0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBzZXRfc2NyaXB0c19kaXIgYWZ0ZXIgYXJndiBoYXMgYmVlbiBwcm9jZXNzZWQuCi0KLUZyaSBTZXAgMTAgMDk6MzY6MjkgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgQ1hYIGJhY2sgdG8gZysrLgotCi1GcmkgU2VwIDEwIDA5OjM0OjI5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBGaXhlZCBSVU5URVNUKiBDWFggQ1hYRkxBR1MgbWFjcm9zIGFuZCBjaGVjayBydWxlLgotCi1GcmkgU2VwIDEwIDA3OjI2OjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBVc2Ugc2hlbGwgd2lsZGNhcmRzLgotCi1UdWUgU2VwICA3IDE4OjA0OjU0IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgYWRkIFRFWElOUFVUUyB2YXJpYWJsZSBhbmQgdXNlIGl0IGluIGxkLmR2aSB0YXJnZXQKLQotRnJpIFNlcCAgMyAxNjo0Njo0MSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiByZS1lbmFibGUgaW5jbHVkZWQgY29uZmlnIGZpbGU7IGNvbmRpdGlvbmFsaXplIGRvYwotCWZvciAtb2Zvcm1hdCB0byBpbnRlcmFjdCBwcm9wZXJseSB3aXRoIFNpbmdsZUZvcm1hdCBkb2MgY29uZmlnCi0JdmFyOyByZW5hbWUgQHVwL0Bkb3duIHRvIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zLgotCi1XZWQgQXVnIDI1IDE2OjI5OjU2IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTg4MTEwLgotCi1UdWUgQXVnIDI0IDE4OjQ5OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUZyb20gUGV0ZXIgSG9vZ2VuYm9vbSA8aG9vZ2VuQHNoYWZlci5jcy51dGFoLmVkdT46Ci0JKiBlbXVsdGVtcGwvaHBwYW9zZi5lbSAobGRfaHBwYW9zZl9lbXVsYXRpb24pOiBDb3JyZWN0IG5hbWUgZm9yIFBBCi0JRUxGIGVtdWxhdGlvbiBpcyAiZWxmMzItaHBwYSIgbm90ICJlbGYtYmlnIi4KLQkoaHBwYW9zZl9iZWZvcmVfcGFyc2UpOiBSZW1vdmUgdW5uZWVkZWQgcHJvY2Vzc2luZyBvZiBlbnZpcm9ubWVudAotCXZhcmlhYmxlcy4KLQkqIHNjcmlwdHRlbXBsL2hwcGFvc2Yuc2M6IEluY2x1ZGUgLmhwcGFfbGlua2VyX3N0dWJzIHNlY3Rpb25zIGluCi0JLnRleHQgc2VnbWVudCBvZiBvdXRwdXQgZmlsZS4KLQkqIGVtdWxwYXJhbXMvaHBwYW9zZi5zaCAoT1VUUFVUX0ZPUk1BVCk6IFVzZSBlbGYzMi1ocHBhLgotCi1UdWUgQXVnIDI0IDE2OjE3OjAwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogbGQuaDogZGVmaW5lIEJZVEVfU0laRSwgU0hPUlRfU0laRSwgYW5kIExPTkdfU0laRSB3aGljaCBhcmUgbm8KLQkgIGxvbmdlciBpbiBiZmQuaC4KLQotCSogbGRsYW5nLmMsIGxkLmg6IHVwZGF0ZWQgY29weXJpZ2h0LgotCi1UdWUgQXVnIDE3IDE1OjIyOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0LCBsYW5nX2NoZWNrKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX3NldF9hcmNoX21hY2guCi0KLVR1ZSBBdWcgMTcgMDc6MDI6MTkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDg1MDAuc2M6IFN0YXJ0IGFsbCBzZWN0aW9ucyBpbiBhIGRpZmZlcmVudCBzZWdtZW50LgotCSogc2NyaXB0dGVtcGwvejhrc2ltLnNjOiBIYW5kbGUgY29uc3RydWN0b3JzCi0KLVRodSBBdWcgMTIgMTY6MDU6MzcgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIE1ha2VmaWxlLmluOiByZXZlcnQgZWFybGllciBjaGFuZ2VzIGJhY2sgdG8gZXhlY3V0ZSBydW50ZXN0Ci0gICAgICAgICAgd2l0aCBtYWtlIGNoZWNrLiBjZHRlc3QgYW5kIGJvb3RzdHJhcCBub3cgZnVuY3Rpb24gYXMgdGhleQotCSAgZGlkIHdpdGhpbiB0aGUgTWFrZWZpbGUuCi0KLVRodSBBdWcgMTIgMTA6MjA6MDUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogCVVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEVNVUxBVElPTl9PRklMRVMgaW4gTWFrZWZpbGUgYmFzZWQgb24KLQktLXdpdGgtdGFyZ2V0cyBvcHRpb24uCi0KLVRodSBBdWcgMTIgMDg6NTI6MjkgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNoZWNrIHRhcmdldHMgcmVpbXBsZW1lbnRlZCB0byBvbGQgd2F5LgotCi1XZWQgQXVnIDExIDA4OjI2OjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODZ2Lm1oLCBjb25maWcvaXJpeDQubWg6IFVzZSBnY2MKLQktcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSByYXRoZXIgdGhhbiAkKGxpYmRpcikvbGliZ2NjLmEuCi0JKiBjb25maWcvaTM4NnNjby5taDogTmV3IGZpbGU7IGNvcHkgb2YgaTM4NnYubWggdG8gY29ycmVzcG9uZCB0bwotCWJmZC9jb25maWd1cmUuaG9zdCBjaGFuZ2UuCi0KLU1vbiBBdWcgIDkgMTQ6MjU6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEhhbmRsZSAubGluZSBhbmQgLmRlYnVnKiBzZWN0aW9ucy4KLQotCSogbGRsZXgubDogVXNlIGJmZF9zY2FuX3ZtYSwgbm90IHN0cnRvdWwuCi0KLUZyaSBBdWcgIDYgMDg6NTc6MzkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGV4cC5jLCBsZGZpbGUuYywgbGRsYW5nLmMsIGxleHN1cC5jLCBsZG1haW4uYywgbGRlbXVsLmM6Ci0JUmVtb3ZlIGluaXRhbCBjYXBzIGluIHNvbWUgZXJyb3IgbWVzc2FnZXMsIGNoYW5nZSAiY2FuJ3QiIHRvCi0JImNhbm5vdCIsIGFkZCBtaXNzaW5nIGNvbG9ucy4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBQcmludCAiJSUiIGFzIGEgc2luZ2xlICUuCi0JRm9yICclJyBmb2xsb3dlZCBieSB1bnJlY29nbml6ZWQgY2hhcmFjdGVyLCBwcmludCB0aGVtIGJvdGgKLQl2ZXJiYXRpbSBpbnN0ZWFkIG9mIGV4cGVjdGluZyBhIGNoYXIgKiBhcmcuCi0JRm9yICclQycsIGRvbid0IHB1dCB0aGUgZnVuY3Rpb24gbmFtZSBpbiBwYXJlbnMuCi0KLQkqIGxkZXhwLmMgKGludmFsaWQpOiBQYXNzICIlJSIsIG5vdCAiJSAiLgotCi1GcmkgQXVnICA2IDE0OjMxOjIyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogQWx3YXlzIGRlZmluZSBfZnRleHQsIF9mZGF0YSwgX2Zic3MuCi0JKEJTU19WQVIpOiBSZW1vdmVkOyBub3cgYWx3YXlzIGRlZmluZSBfZmJzcy4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdC5zaCwgZW11bHBhcmFtcy9taXBzaWR0bC5zaCAoQlNTX1ZBUik6Ci0JUmVtb3ZlZC4KLQotVGh1IEF1ZyAgNSAxNTo1NToxOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogejhrLWNvZmYgaXMgdGhlIHNhbWUgYXMgejhrLXNpbQotCi1XZWQgQXVnICA0IDIxOjAwOjE4IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIHRlc3RzdWl0ZS9saWIvbGQuZXhwOiBuZXcgZmlsZQotCSogdGVzdHN1aXRlL2NvbmZpZy91bml4LWxkLmV4cDogbmV3IGZpbGUKLQkqIHRlc3RzdWl0ZS9sZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogbmV3IGZpbGUKLQkqIE1ha2VmaWxlLmluOiBhZGQgZGVqYWdudSBzdXBwb3J0IGZvciBtYWtlIGNoZWNrCi0KLVdlZCBBdWcgIDQgMTc6NTI6MzIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sIChjb21tZW50KTogQWRkIG1pc3NpbmcgbmV3bGluZSBpbiBtZXNzYWdlLgotCSogbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IERpdHRvLgotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERpdHRvLgotCi1UdWUgQXVnICAzIDEwOjU3OjQxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnksIGxkbGV4LmwsIG1yaS5jLCBsZHdyaXRlLmM6IENoYW5nZSBtdWx0aXBsZSBjb21tb25zCi0JaW50byBleHRlcm5zLgotCi0JKiBsZG1pc2MuYyAobXVsdGlwbGVfd2Fybik6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbWlzYy5oOiBEZWNsYXJlIGl0LgotCSogbGRtYWluLmMgKGVudGVyX2dsb2JhbF9yZWYpOiBDYWxsIGl0LgotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgd2Fybl9jb21tb24uCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogU2V0IGl0IHdpdGggLXdhcm4tY29tbW9uIG9wdGlvbi4KLQkqIGxkdmVyLmMgKGhlbHApOiBEb2N1bWVudCBpdC4KLQotTW9uIEF1ZyAgMiAxMjowNDozNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGhvb2tzIGZvciAuc2RhdGEsIC5zYnNzLCBhbmQKLQl0YXJnZXQtc3BlY2lmaWMgc2VjdGlvbnMsIGFuZCBmb3IgY2hhbmdpbmcgZGF0YSBzZWN0aW9uIHZtYS4KLQotTW9uIEp1bCAyNiAxNDowMDowMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnkgKE9QVElPTl9ReSwgT1BUSU9OX1ksIE9QVElPTl9kbiwgT1BUSU9OX1lQKTogTmV3Ci0JdGVybWluYWxzLCBmb3IgU29sYXJpcy4KLQkoZGlybGlzdF9wdHIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IG5ldyBvcHRpb25zLgotCi0JKiBsZGxleC5sOiBBY2NlcHQgY29tbWFuZC1saW5lIG9wdGlvbnMgIi1ReSIsICItZG4iLCAiLVkiLCBhbmQKLQkiLVlQLC4uLiIuCi0KLQkqIGNvbmZpZy9zdW40c29sMi5tdDogUGFzcyBlbXVsYXRpb24gbmFtZSB3aXRob3V0ICIuc2giLgotCi0JKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLmM6IFJlbmFtZWQgZnJvbSBlbGYzMi1zcGFyYy5jLgotCSogY29uZmlnL3N1bjRzb2wyLm10IChlbV9lbGYzMl9zcGFyYy5jKTogQWRqdXN0ZWQgYWNjb3JkaW5nbHkuCi0KLUZyaSBKdWwgMjMgMTM6NTE6MDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBzdXBwb3J0IGZvciAuaW5pdCwgLmZpbmksIC5jdG9ycywKLQkuZHRvcnMsIC5kYXRhMSwgLnJvZGF0YTEgc2VjdGlvbnMsIGluc3RlYWQgb2YgY29tYmluaW5nIHRoZW0gaW50bwotCW90aGVyIHNlY3Rpb25zLiAgRm9yIGAtcicsIHNldCBhbGwgc2VjdGlvbiBzdGFydCBhZGRyZXNzZXMgdG8KLQl6ZXJvLgotCi0JKiBlbXVscGFyYW1zL2VsZjMyLXNwYXJjLnNoIChURVhUX1NUQVJUX0FERFIsCi0JTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogVmFsdWUgc2hvdWxkIGJlIDB4MTAxMDAuCi0JKE1BWFBBR0VTSVpFKTogUmVuYW1lZCBmcm9tIFBBR0VfU0laRS4KLQotV2VkIEp1bCAyMSAxNDoyODo0MiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdlbnNjcmlwdHMuc2g6IElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgZW11bGF0aW9uLCBzZXQKLQlDT01QSUxFX0lOLgotCSogZW11bHRlbXBsLyouZW06IFVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjb21waWxlIGluIHRoZQotCXNjcmlwdHMuCi0KLQkqIE1ha2VmaWxlLmluIChHRU5TQ1JJUFRTKTogUGFzcyB0aGUgZGVmYXVsdCBlbXVsYXRpb24gbmFtZSB0bwotCWdlbnNjcmlwdHMuc2guICBQYXNzIHRoZSBjdXJyZW50IGVtdWxhdGlvbiBuYW1lIHdpdGhvdXQgIi5zaCIgb24KLQl0aGUgZW5kLgotCSogZ2Vuc2NyaXB0cy5zaDogVGFrZSBhbiBkZWZhdWx0IGVtdWxhdGlvbiBhcmcuCi0JVXNlIHRoZSBjdXJyZW50IGVtdWxhdGlvbiBuYW1lIGFzIEVNVUxBVElPTl9OQU1FLgotCU1ha2UgZGVmYXVsdCBsaWIgcGF0aCBmb3IgY3Jvc3MtY29tcGlsaW5nICc6Jywgbm90IG51bGwuCi0JKiBlbXVscGFyYW1zLyouc2g6IERvbid0IHNldCBFTVVMQVRJT05fTkFNRS4KLQkqIGxkZW11bC5jIChsZGVtdWxfZ2V0X3NjcmlwdCk6IFRha2UgaXNmaWxlIGFyZy4KLQlQYXNzIGl0IHRvIGVtdWxhdGlvbidzIGdldF9zY3JpcHQgZnVuY3Rpb24uCi0JKiBsZGVtdWwuaDogQWRqdXN0IGdldF9zY3JpcHQgcHJvdG90eXBlcy4KLQkqIGxkZmlsZS5jIChsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUpOiBSZW5hbWVkIGZyb20gZmluZF9hX25hbWUuCi0JTm8gbG9uZ2VyIHN0YXRpYy4KLQkqIGxkZmlsZS5oOiBEZWNsYXJlIGl0LgotCSogbGRncmFtLnk6IEFjY2VwdCBhIHNjcmlwdCBvbiB0aGUgY29tbWFuZCBsaW5lIGFnYWluLAotCWZvciBwYXJzaW5nIGNvbXBpbGVkLWluIHNjcmlwdHMuCi0JKiBsZG1haW4uYyAobWFpbik6IElmIGxkIHNjcmlwdCBpcyBhIGZpbGUsIHBhcnNlIGl0IGFzIGEgLVQKLQlvcHRpb24sIG90aGVyd2lzZSBwYXJzZSBpdCBkaXJlY3RseS4KLQkqIGVtdWx0ZW1wbC8qLmVtICgqZ2V0X3NjcmlwdCk6IFJldHVybiB0aGUgc2NyaXB0cyB0aGVtc2VsdmVzIGlmCi0JdGhpcyBpcyB0aGUgZGVmYXVsdCBlbXVsYXRpb247IG90aGVyd2lzZSByZXR1cm4gdGhlaXIgZmlsZSBuYW1lcy4KLQkqIGVtdWx0ZW1wbC9tODhrYmNzLmVtOiBOZXcgZmlsZSwgdG8gdGFrZSBtODhrYmNzICNpZmRlZiBvdXQgb2YKLQlnZW5lcmljLmVtLgotCSogZW11bHBhcmFtcy9tODhrYmNzLnNoOiBVc2UgaXQuCi0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlOjp1bml4X3JlbG9jYXRlKTogUmVtb3ZlIHVudXNlZCBlbGVtZW50LgotCi1UdWUgSnVsIDIwIDEyOjAxOjQ5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogRGVsZXRlIGVtX2kzODZsaW51eC5vIChmb3Igd2hpY2gKLQl0aGVyZSdzIG5vIGNoYW5nZSBsb2cgZW50cnkgeWV0LCB0c2sgdHNrKSBmcm9tIHRoZSBsaXN0IG9mCi0JZW11bGF0aW9ucyBjb21waWxlZCBpbiB1bnRpbCBNYXJrIGdldHMgYXJvdW5kIHRvIGNoZWNraW5nIGluCi0JZW11bHBhcmFtcy9pMzg2bGludXguc2guCi0JKGxkZW11bC1saXN0LmgpOiBEZXBlbmQgb24gTWFrZWZpbGUsIHNvIGlmIEVNVUxBVElPTl9PRklMRVMgaXMKLQljaGFuZ2VkLCB0aGlzIGZpbGUgZ2V0cyB1cGRhdGVkLgotCi1GcmkgSnVsIDE2IDE0OjE0OjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnkgKE9QVElPTl9MZmlsZSk6IE5ldyB0b2tlbi4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBPUFRJT05fTCBOQU1FICh3aGl0ZXNwYWNlIGFmdGVyIC1MKS4KLQkqIGxkbGV4LmwgKDxDT01NQU5EPik6IEFjY2VwdCAtTCB3aXRob3V0IEZJTEVOQU1FLgotCi1GcmkgSnVsIDE2IDEzOjQ0OjI2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaDgvMzAwaCBzdXBwb3J0IG5lZWRzIG93biAubXQgZmlsZS4KLQljb25maWcvY29mZi1oODMwMGgubXQ6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDE1IDEyOjQ0OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmM6IERvbid0IGluY2x1ZGUgc3lzL3N0YXQuaDsgaXQgYWxyZWFkeSBnb3QgaW5jbHVkZWQKLQlzb21ld2hlcmUgYWxvbmcgdGhlIHdheS4KLQotVGh1IEp1bCAxNSAxNDo0MzozNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGg4MzAwaCBzdXBwb3J0LgotCWVtdWxwYXJhbXMvaDgzMDBoLnNoOiBOZXcgZmlsZS4KLQlzY3JpcHR0ZW1wbC9oODMwMGguc2M6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDE1IDEyOjQ0OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBJbiBlcnJvciBtZXNzYWdlLCB1c2UgdGhlIG5hbWUgdGhlCi0JdXNlciBnYXZlIChlLmcuLCAiLWxjIiksIHJhdGhlciB0aGFuIHRoZSBiYXNlIGZpbGUgbmFtZS4KLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERvbid0IGFzc2lnbiBhbiBpbnQgdG8gYW4gZW51bS4KLQotCSogbGRtYWluLltjaF06IFJlbW92ZSBpbml0aWFsIFFfIGZyb20gZnVuY3Rpb24gbmFtZXMuCi0JKiBsZGV4cC5jLCBsZGluZHIuYywgbGRsYW5nLmM6IENoYW5nZSBjYWxsZXJzLgotCi0JKiBsZGZpbGUuYywgbGRtYWluLmMsIGxkZ3JhbS55OiBSZW5hbWUgb3B0aW9uX3YgdG8gdHJhY2VfZmlsZV90cmllcy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IE1vdmUgbG9hZGluZyBvZiBkZWZhdWx0IHNjcmlwdCBmcm9tCi0JaGVyZSB0byBtYWluLiAgQWRkIGEgIi8iIHRvIHN0YXJ0IG9mIHNjcmlwdCBuYW1lIHRvIHByZXZlbnQKLQlmaW5kaW5nIGl0IGluICIuIiBmaXJzdC4KLQotCSogbGRtYWluLmMgKHNldF9zY3JpcHRzX2Rpcik6IERvbid0IGxvb2sgaW4gIi4iIGZpcnN0LgotCi0JKiBsZGdyYW0ueSwgbGRsYW5nLmMsIGxkc3ltLmM6IFJlbW92ZSB0cmFjZXMgb2YgdW51c2VkIHZhcgotCW9wdGlvbl9sb25nbWFwLgotCi1UaHUgSnVsIDE1IDEwOjU1OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVtX204OGtiY3MuYyk6IENvcnJlY3QgZGVwZW5kZW5jeS4KLQkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2M6IEl0J3MgQVJDSCwgbm90IGFyY2guICBSZW1vdmVkIFRBUkdFVAotCXN0YXRlbWVudC4gIENoYW5nZWQgT1VUUFVUX0ZPUk1BVCB0byB1c2UgJHtPVVRQVVRfRk9STUFUfS4KLQkqIGVtdWxwYXJhbXMvbTg4a2Jjcy5zaDogSXQncyBjb2ZmLW04OGtiY3MsIG5vdCBtODhrYmNzLgotCi1XZWQgSnVsIDE0IDIxOjQyOjUzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKGxkbGFuZ19vcGVuX2ZpbGUsIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSksCi0JbWFpbi5jIChtYWluKTogUHJpbnQgdGhlIGVycm5vIHN0cmluZyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQotVHVlIEp1bCAxMyAyMDowMDozMCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBoODMwMGggZm9yIHRhcmdldCBjcHUuCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBIYXZlIGRlbWFuZ2xlIHJlbW92ZSBsZWFkaW5nIHVuZGVyc2NvcmUgaWYKLQlwcmVzZW50IChkZW1hbmdsZSBpcyBzbWFydCBlbm91Z2ggdG8ga25vdyB3aGV0aGVyIHRvIGRvIGl0IG9yIG5vdCkuCi0KLU1vbiBKdWwgMTIgMTE6NDU6NDggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoc2V0X3NjcmlwdHNfZGlyKTogQ2hlY2sgLiBhbmQgPGxkIGJpbiBkaXI+Ly4uL2xpYiBmb3IKLQlsZHNjcmlwdHMsIGFzIHdlbGwgYXMgPGxkIGJpbiBkaXI+IGFuZCBTQ1JJUFRESVIuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBVc2Ugc2l6ZW9mIGluc3RlYWQgb2YgbWFnaWMgY29uc3RhbnQuCi0KLQkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uLCBjaGVja19mb3Jfc2NyaXB0c19kaXIsCi0Jc2V0X3NjcmlwdHNfZGlyKTogIE5ldyBmdW5jdGlvbnMuCi0JKG1haW4pOiBDYWxsIHRoZW0uCi0KLU1vbiBKdWwgMTIgMTA6NTc6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSW5jbHVkZSAuaW5pdCwgLmZpbmksIC5yb2RhdGEgc2VjdGlvbnMuCi0JQ3JlYXRlIHN5bWJvbCAiZW5kIiBpbnN0ZWFkIG9mICJfX2VuZCIuICBDb21tZW50IG91dCBzb21lIHBhcnRzCi0JdGhhdCBtYXkgbm90IGJlIG5lZWRlZCAoeWV0KSBmb3IgZWxmLgotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBzcGFyYy1lbGYgYW5kIHNwYXJjLXNvbGFyaXMyIGNvbmZpZ3MuCi0KLVRodSBKdWwgIDggMTU6MzM6MzIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJbmNsdWRlICQoT1RIRVJfRU1VTEFUSU9OUykuCi0KLQkqIGxkbWlzYy5oIChlaW5mbywgbWluZm8sIGluZm8pOiBEb24ndCBib3RoZXIgd2l0aCBQQVJBTVMgbWFjcm8KLQl3aGVuIG5vIHByb3RvdHlwZSBpcyBiZWluZyBzdXBwbGllZC4KLQkobGRtYWxsb2MsIGxkcmVhbGxvYyk6IFNpemUgYXJndW1lbnQgaXMgbm93IHNpemVfdC4KLQotCSogbGRtaXNjLmMgKGZpbmZvKTogTmV3IGZ1bmN0aW9uLCBhY2NlcHRzIEZJTEUqIGFyZ3VtZW50LgotCSh2ZmluZm8sIGNhc2UgJ3YnKTogTmV3IGZvcm1hdCBjaGFyYWN0ZXI7IGRpc3BsYXlzIGJmZF92bWEgaW4gaGV4Ci0Jd2l0aG91dCBsZWFkaW5nIHplcm9zLgotCSh2ZmluZm8sIGNhc2VzICdSJyBhbmQgJ0MnKTogVXNlIGZpbmZvKCV2KSB3aGVuIGRpc3BsYXlpbmcgYQotCWJmZF92bWEgdmFsdWUsIGluc3RlYWQgb2YgZnByaW50ZigleCkgd2hpY2ggd29uJ3QgaG9sZCBhIGxvbmcgbG9uZwotCXZhbHVlLgotCShjb25jYXQsIGJ1eXN0cmluZyk6IFN0cmluZyBsZW5ndGhzIGFyZSBzaXplX3QuCi0JKGxkbWFsbG9jLCBsZHJlYWxsb2MsIHhyZWFsbG9jKTogU2l6ZSBhcmd1bWVudCBpcyBub3cgc2l6ZV90LgotCi0JKiBsZGxhbmcuYyAobmV3X3N0YXRlbWVudCk6IFNpemUgYXJndW1lbnQgaXMgbm93IHNpemVfdC4gIEFkZGVkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbiB3aXRoIHByb3RvdHlwZS4KLQotVGh1IEp1bCAgOCAxMDo1Mzo0NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55IChPUFRJT05fdik6IERvbid0IHR1cm4gb24gdmVyYm9zZSBvdXRwdXQuCi0KLVdlZCBKdWwgIDcgMTc6MTA6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBHZXQgcmlkIG9mIGxvY2FsIHR5cGVkZWYgZm9yIGJmZF92bWEhICBHZXQgaXQgZnJvbQotCWJmZC5oIGluc3RlYWQuCi0KLVdlZCBKdWwgIDcgMTE6MzM6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgYXMgJCh0b29sZGlyKS9iaW4vZ2xkOwotCWNvbGxlY3QyIGRvZXNuJ3QgbG9vayBmb3IgZ2xkIGFueSBtb3JlIGFueWhvdy4KLQotTW9uIEp1bCAgNSAxNDoyOTo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3JlbG9jYXRlX2dsb2JhbHMpOiBTa2lwIGluZGlyZWN0IHN5bWJvbHMsIHdoaWNoCi0Jbm93IGhhdmUgYSBub24gTlVMTCBzcmVmc19jaGFpbi4KLQotCSogY29uZmlnL2hwMzAwaHB1eC5tdDogVXNlIGVtdWxhdGlvbiBocDNocHV4IHJhdGhlciB0aGFuCi0JaHAzMDBocHV4LCBzaW5jZSB0aGUgbGF0dGVyIGRvZXMgbm90IGV4aXN0LgotCi1GcmkgSnVsICAyIDE4OjA2OjA1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2Vuc2NyaXB0cy5zaDogUHV0IHRoZSBzY3JpcHRzIGluIHRoZSBsZHNjcmlwdHMgZGlyZWN0b3J5LCBub3QKLQllbXVsYXRpb25zLgotCSogY29uZmlndXJlLmluIChsZHNjcmlwdHMpOiBNYWtlLCBpbnN0ZWFkIG9mIGVtdWxhdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoc2NyaXB0ZGlyKTogVGFrZSBvZmYgdGhlICJsZCIgcGFydC4KLQkoaW5zdGFsbCwgY2xlYW4sIGRpc3RjbGVhbik6IFVzZSBsZHNjcmlwdHMsIG5vdCBlbXVsYXRpb25zLgotCUluIHRlc3RzLCBkb24ndCBwYXNzIC1MZW11bGF0aW9ucy4KLQlEb24ndCBwYXNzIHRvb2xkaXIvbGliIHRvIGdlbnNjcmlwdHMuc2guCi0JKiBnZW5zY3JpcHRzLnNoOiBEb24ndCB0YWtlIHRvb2xkaXIvbGliIGFyZy4KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBBZGQgImxkc2NyaXB0cy8iIHRvIHRoZSBuYW1lIG9mIHRoZQotCWRlZmF1bHQgc2NyaXB0IGZpbGUuCi0KLUZyaSBKdWwgIDIgMTc6MTM6MzUgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IEFkZCAudG9ycyBzZWN0aW9uIGZvciBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9ycy4KLQotVGh1IEp1bCAgMSAxNjozODo0NSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvY29mZi1oODMwMC5tdDogRU1VTD1oODMwMGhtcyAtPiBoODMwMC4KLQotV2VkIEp1biAzMCAxNTo0NTo1NSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgueS5jKTogc2tpcCBkZWZhdWx0IC55LmMgcnVsZXMuIGdudSBtYWtlIGNhbiBub3cKLQkgIHJ1biBpbiBwYXJhbGxlbCB3aXRob3V0IGNvbGxpZGluZyBvbiB5YWNjJ3Mgc3RhdGljIGZpbGUgbmFtZXMuCi0JICBXaXRob3V0IHRoZSBzdHViIHJ1bGUsIG1ha2Ugd2lsbCB0cnkgdG8gc3RhcnQgdHdvIHlhY2MncwotCSAgY29uY3VycmVudGx5IHdoaWNoIGZhaWxzIGJlY2F1c2Ugb2YgeWFjYydzIHN0YXRpYyBmaWxlIG5hbWVzLgotCi1UdWUgSnVuIDI5IDEyOjIwOjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBEb24ndCBkdW1wIGNvcmUgaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scy4KLQotTW9uIEp1biAyOCAxMjoyMjoxMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdlbnNjcmlwdHMuc2ggKExJQl9QQVRIKTogT25seSBhZGQgL3Vzci9sb2NhbC9saWIgaWYgaXQncwotCWRpZmZlcmVudCBmcm9tIGxpYmRpci4KLQotCSogTWFrZWZpbGUuaW4gKHNjcmlwdGRpcik6IEJhc2Ugb24gdG9vbGRpciwgbm90IGRhdGFkaXIuCi0KLVNhdCBKdW4gMjYgMTI6MDM6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jIChoZWxwKTogTmV3IGZ1bmN0aW9uLgotCSogbGR2ZXIuaDogRGVjbGFyZSBpdC4KLQkqIGxkbGV4LmwsIGxkZ3JhbS55OiBSZWNvZ25pemUgbmV3IG9wdGlvbnMgLS1oZWxwIGFuZCAtLXZlcnNpb24uCi0KLU1vbiBKdW4gMjEgMjA6Mzk6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IERvbid0IG5lZWQgLi4vaW5jbHVkZSBhbnkgbW9yZS4KLQotTW9uIEp1biAyMSAxNjozODozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwsIGxkZ3JhbS55OiBTdXBwb3J0IG5ldyAtb2Zvcm1hdCBvcHRpb24uCi0JUmVtb3ZlIGF0dGVtcHQgYXQgc3VwcG9ydGluZyBzY3JpcHQgZnJhZ21lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCk6IFRha2UgbmV3IGFyZywgRlJPTV9TQ1JJUFQuCi0JKiBtcmkuYyAobXJpX2Zvcm1hdCksIGxkZ3JhbS55OiBDaGFuZ2UgY2FsbGVycy4KLQkqIGxkbGFuZy5oOiBDaGFuZ2UgcHJvdG90eXBlLgotCi1UaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KLQl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCi0KLVRodSBKdW4gMTcgMTQ6MzM6MDkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogVHdlYWsgZ3JhbW1hciB0byBtYWtlIHJlcG9ydGluZyBvZiBpbnZhbGlkIG9wdGlvbnMgd29yay4KLQotCSogTWFrZWZpbGUuaW4gKC5jYy5vKTogUmVzdG9yZSAuU1VGRklYRVMgZW50cnkgZm9yIC5jYwotCWFuZCAuY2MubyBydWxlLgotCi1XZWQgSnVuIDE2IDExOjQ1OjMyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2NvbW1hbmQpOiBEb24ndCB0cnkgLmxkIGV4dGVuc2lvbi4KLQlJdCB3YXNuJ3QgZG9jdW1lbnRlZCAob3IgbGlrZWx5IHVzZWQpIGFuZCB3YXN0ZXMgdGltZS4KLQkodHJ5X29wZW4pOiBJZiBFWFRFTiBpcyBlbXB0eSwgZG9uJ3QgdHJ5IGl0LgotCi0JKiBsZGN0b3IuYywgbGRlcnJvci5jLCBsZGV4cC5jLCBsZGZpbGUuYywgbGRpbmRyLmMsIGxkbGFuZy5jLAotCWxkbGV4LmwsIGxkbWFpbi5jLCBsZG1pc2MuYywgbGRzeW0uYywgbGR2ZXIuYywgbGR3YXJuLmMsCi0JbGR3cml0ZS5jLCBsZXhzdXAuYywgbXJpLmMsIHJlbGF4LmM6IFJlcGxhY2UgREVGVU4gbWFjcm8gY2FsbHMKLQl3aXRoIG5vcm1hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0KLQkqIE1vdmUgKi5lbSB0byBlbXVsdGVtcGwvKi5lbS4gIE1vdmUgKi5zaCB0byBlbXVscGFyYW1zLyouc2guCi0JTW92ZSAqLnNjLXNoIHRvIHNjcmlwdHRlbXBsLyouc2MuCi0JKiB7ZW11bHRlbXBsLGVtdWxwYXJhbXMsc2NyaXB0dGVtcGx9L1JFQURNRTogTmV3IGZpbGVzLgotCSogc2guZW0sIHN0MjAwMC5lbSwgejhrc2ltLmVtLCBoODMwMGhtcy5lbSwgaDg1MDBobXMuZW06IEZpbGVzCi0JcmVtb3ZlZCwgcmVwbGFjZWQgd2l0aCBnZW5lcmljLmVtLgotCSogaDgzMDAuc2gsIGg4NTAwLnNoLCBoODMwMC5zYywgaDg1MDAuc2M6IFJlbmFtZWQgZnJvbQotCSBoOFszNV0wMGhtcy5zW2NoXS4gIENoYW5nZSB0aGVpciBjb250ZW50cyB0byBvbWl0IHRoZSAiaG1zIi4KLQotCSogKi5lbSAoKl9nZXRfc2NyaXB0KTogUmV0dXJuIHNjcmlwdCBuYW1lIGluc3RlYWQgb2Ygc2NyaXB0IGNvbnRlbnRzLgotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IENoYW5nZSBjYWxsZXIuCi0KLQkqIGxkbGV4LmwsIGxkZ3JhbS55OiBSZWNvZ25pemUgLW0gb3B0aW9uLgotCUNoZWNrIGZvciBpbnB1dCBmaWxlcyBhZnRlciAqYWxsKiBvcHRpb25zIGluIGdyYW1tYXIuCi0JKiBsZG1haW4uYyAobWFpbik6IENoZWNrIGZvciAtbSBvcHRpb25zLiAgQWRkIGRlZmF1bHQgZGlyZWN0b3J5Ci0JZm9yIC1tLgotCi0JKiBta3NjcmlwdC5jOiBGaWxlIHJlbW92ZWQuCi0JKiBnZW5zY3JpcHRzLnNoOiBUYWtlIHR3byBtb3JlIHBhcmFtZXRlcnMsIHRvb2xkaXJsaWIgYW5kIGxpYmRpciwKLQl0byBhZGQgdG8gdGhlIGRlZmF1bHQgTElCX1BBVEguCi0JTG9vayBmb3IgaW5wdXQgZmlsZXMgaW4gdGhlIG5ldyBzdWJkaXJlY3Rvcmllcy4KLQlDcmVhdGUgdGhlIHNjcmlwdHMgaW4gZW11bGF0aW9ucyBzdWJkaXJlY3RvcnkgYW5kIGRvbid0IGZpbHRlcgotCXRoZW0gdGhyb3VnaCBta3NjcmlwdC4KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSB0aGUgZW11bGF0aW9ucyBzdWJkaXJlY3RvcnkuCi0KLQkqIE1ha2VmaWxlLmluOiBBY2NvdW50IGZvciBhbGwgb2YgdGhlIGFib3ZlIGNoYW5nZXMuCi0JUmVtb3ZlIHVudXNlZCAuU1VGRklYRVMuICBHZXQgbGliZ2NjLmEgcGF0aCB3aXRoIGdjYwotCS1wcmludC1saWJnY2MtZmlsZS1uYW1lIGluc3RlYWQgb2YgJChsaWJkaXIpL2xpYmdjYy5hLgotCVB1dCBDRkxBR1MgbGFzdCBpbiB0aGUgY29tcGlsYXRpb24gcnVsZXMuCi0JQWRkIC1JLi4vYmZkIHRvIElOQ0xVREVTIHNvIHN5c2RlcC5oIGlzIGZvdW5kLgotCi1UdWUgSnVuIDE1IDIzOjA0OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogTG9vayBpbiAuLi9pbmNsdWRlLCBub3QgLi4vYmZkLgotCi0JKiBhb3V0LnNjLXNoOiBBZGQgU0hMSUJfUEFUSCBsaWtlIFNUQUNLWkVSTy4gIE1ha2UgU1RBQ0taRVJPCi0JZGVwZW5kZW50IG9uIFJFTE9DQVRJTkcsIG5vdCBSRUxPQ0FUSU9OLgotCSogaHAzaHB1eC5zaCAoU0hMSUJfUEFUSCk6IERlZmluZSBpdC4KLQotTW9uIEp1biAxNCAxOTowNjoxNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jICh0cnlfb3Blbik6IElmIG9wZW5pbmcgd2l0aG91dCB0aGUgZXh0ZW5zaW9uIGZhaWxzLAotCXRyeSB3aXRoIHRoZSBleHRlbnNpb24gZXZlbiBpZiAtdiBvciAtViB3YXMgZ2l2ZW4uCi0JaGFkX3NjcmlwdCBpcyBpbXBvcnRlZCAoZnJvbSBsZGdyYW0ueSksIG5vdCBleHBvcnRlZC4KLQotTW9uIEp1biAxNCAxNjoyNjoxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQsIHVzZSBJTlNUQUxMX1hGT1JNCi0KLVRodSBKdW4gMTAgMTQ6MDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogRG9uJ3QgbG9zZSB0aGUgb2xkIGZsYWcgYml0cy4KLQkqIGxkZ3JhbS55IChzdGF0ZW1lbnRfbGlzdF9vcHQpOiBOZXcgbm9udGVybWluYWwsIGVpdGhlciBlbXB0eSBvcgotCXN0YXRlbWVudF9saXN0LgotCShzZWN0aW9uKTogVXNlIHN0YXRlbWVudF9saXN0X29wdCwgbm90IHN0YXRlbWVudF9saXN0LgotCSogbTY4a2NvZmYuc2Mtc2g6IEdhdGhlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZCBkZWZpbmUKLQlfX0NUT1JfTElTVF9fIGFuZCBfX0RUT1JfTElTVF9fIGFwcHJvcHJpYXRlbHkuCi0JKiBzYTI5MjAwLnNjLXNoOiBHYXRoZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQgZGVmaW5lCi0JX19fQ1RPUl9MSVNUX18gYW5kIF9fX0RUT1JfTElTVF9fIGFwcHJvcHJpYXRlbHkuCi0KLU1vbiBKdW4gIDcgMTI6NTM6MjggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiAgQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgotCi1GcmkgSnVuICA0IDE2OjE4OjI0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBpbnN0YWxsOmFsbCBhbmQgaW5zdGFsbC1pbmZvOmluZm8KLQlkZXBlbmRlbmNpZXMgKHRoZXNlIGNhdXNlIHNvbWUgc3B1cmlvdXMgcmVidWlsZHMgYXQgJ21ha2UgaW5zdGFsbCcKLSAgICAgICAgdGltZSkKLQotRnJpIEp1biAgNCAwODo1MDoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1pZHQtZWNvZmZsKik6IE5ldyB0YXJnZXQ7IHVzZSBtaXBzLWlkdGwuCi0JKG1pcHMtaWR0LWVjb2ZmKik6IEFkZGVkIHRyYWlsaW5nICcqJy4KLQkqIGNvbmZpZy9taXBzLWlkdGwubXQ6IE5ldyBmaWxlOyB1c2UgRU1VTCBvZiBtaXBzaWR0bC4KLQkqIG1pcHNpZHRsLnNoOiBOZXcgZmlsZTsgbGlrZSBtaXBzaWR0LnNoLCBidXQgbGl0dGxlIGVuZGlhbi4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX21pcHNpZHRsLm8uCi0KLQkqIGNvbmZpZy9zdW4zLm1oIChIT1NUSU5HX0xJQlMsIEhPU1RJTkdfRU1VKTogUmVtb3ZlZCBvYnNvbGV0ZSBhbmQKLQlpbmNvcnJlY3QgZGVmaW5pdGlvbnMuCi0KLVR1ZSBKdW4gIDEgMTQ6NTY6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6ICBXcml0ZSBCU0ZfQ09OU1RSVUNUT1IKLQlzeW1ib2xzLCB1bmxlc3Mgc3RyaXBwaW5nLgotCi1UdWUgTWF5IDI1IDE1OjM0OjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNvbmZpZ3VyZSBsb29rcyBmb3IgIyMjIywgc28gcmVtb3ZlIGxpbmVzIHdpdGggbWFueQotCScjJyBjaGFyYWN0ZXJzLgotCSogY29uZmlnL2lyaXg0Lm1oLCBjb25maWcvaTM4NnYubWg6IE5ldyBmaWxlczsgc2V0IEhPU1RJTkdfQ1JUMAotCWFuZCBIT1NUSU5HX0xJQlMgY29ycmVjdGx5IHNvIHRoYXQgYGBtYWtlIGNoZWNrJycgd2lsbCB3b3JrLgotCi1UaHUgTWF5IDIwIDEzOjU2OjE2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiAgRGVmaW5lIF9ldGV4dCwgX2VkYXRhLCBhbmQgX2VuZCwgaW4gYWRkaXRpb24KLQl0byBldGV4dCwgZWRhdGEsIGFuZCBlbmQuICBOZWVkZWQgZm9yIElSSVggNC4wLjVGLgotCVBhdGNoIGZyb20gbXdwQGljb25peC5vei5hdSAoTWljaGFlbCBQYWRkb24pLgotCi0JKiBWZXJzaW9uIDIuMi4xIHJlbGVhc2VkLgotCi1UaHUgTWF5IDIwIDExOjQyOjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWlwc2JzZC5zYy1zaDogUmVuYW1lZCBmcm9tIGFvdXQtbWlwc2JzZC5zYy1zaC4KLQkqIG1pcHNic2Quc2ggKEVNVUxBVElPTl9OQU1FKTogVXNlIG5ldyBmaWxlIG5hbWUuCi0KLVR1ZSBNYXkgMTggMTc6MTA6MjQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTERESVNUU1RVRkYpOiBSZW1vdmUgbGQubW0gc2luY2Ugd2UgY2FuJ3QgYnVpbGQgaXQKLQlwcm9wZXJseSByaWdodCBub3cuCi0KLQkqIFZlcnNpb24gMi4yIHJlbGVhc2VkLgotCi1Nb24gTWF5IDE3IDE1OjM3OjI4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuMi4KLQotTW9uIE1heSAxNyAxMjo0NDozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTkVXUzogIE5ldyBmaWxlLgotCi1GcmkgTWF5IDE0IDExOjI2OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogRG9uJ3QgZGVmaW5lIEJTU19WQVIgdW5sZXNzIHJlbG9jYXRpbmcuCi0KLVdlZCBNYXkgMTIgMTM6MzM6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWtzY3JpcHQubywgbWtzY3JpcHQpOiBCdWlsZCBta3NjcmlwdCB2aWEKLQlta3NjcmlwdC5vLCByYXRoZXIgdGhhbiBkaXJlY3RseSBmcm9tIG1rc2NyaXB0LmMuCi0KLVR1ZSBNYXkgIDQgMjE6NTg6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IExvb2sgZm9yICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IHJlbGF0aXZlIHRvCi0JJHtzcmNkaXJ9LCBub3QgcmVsYXRpdmUgdG8gYnVpbGQgZGlyZWN0b3J5LgotCi0JKiBocHBhb3NmLmVtLCBocHBhb3NmLnNjLXNoLCBocHBhb3NmLnNoOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBocHBhKi1ocC1vc2YuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJbmNsdWRlIGhwcGFvc2YgZW11bGF0aW9uLgotCShlbV9ocHBhb3NmLmMpOiBCdWlsZCBpdC4KLQkqIGNvbmZpZy9ocHBhb3NmLm1oLCBocHBhb3NmLm10OiBOZXcgZmlsZXMuCi0KLQkqIGxkLmggKEFMSUdOX04pOiBSZW5hbWVkIGZyb20gQUxJR04sIGJlY2F1c2UgdGhhdCBjb25mbGljdGVkIHdpdGgKLQlzb21lIHN5c3RlbSBoZWFkZXIgZmlsZXMuICBBbGwgdXNlcyBjaGFuZ2VkLgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpMzg2LWFpeCBjb25maWd1cmF0aW9ucyBhcyBpMzg2LWNvZmYKLQl0YXJnZXRzLgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtNjgqLSotaHB1eC4KLQkqIGFvdXQuc2Mtc2g6IElmIFNUQUNLWkVSTyBhbmQgUkVMT0NBVElORyBhcmUgYm90aCBkZWZpbmVkLCBvdXRwdXQKLQl0aGUgdmFsdWUgb2YgU1RBQ0taRVJPLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSW5jbHVkZSBocDMwMC1ocHV4IGVtdWxhdGlvbi4KLQkoZW1faHAzaHB1eC5jKTogQnVpbGQgaXQuCi0JKiBocDNocHV4LnNoLCBjb25maWcvaHAzMDBocHV4Lm10OiBOZXcgZmlsZXMuCi0KLVR1ZSBNYXkgIDQgMTI6Mzc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiBQdXQgY29uc3RydWN0b3JzIGluIHRoZSAuZGF0YSBzZWN0aW9uLgotCSogTWFrZWZpbGUuaW4gKGNkdGVzdCk6IEFkZGVkIGRlcGVuZGVuY3kgb24gbGQubmV3LgotCi1Nb24gTWF5ICAzIDE5OjQzOjM5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZSBkZWZpbml0aW9uIG9mICQodG9vbGRpcikgdG8gbWF0Y2ggRlNGLgotCSogdmF4LnNoLCBjb25maWcvdmF4Lm10LCBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOgotCVN1cHBvcnQgVkFYIFVsdHJpeCBhbmQgQlNELgotCi1Nb24gQXByIDI2IDE4OjM1OjQ3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzaC5lbSwgc2guc2gsIHNoLnNjLXNoOiBOZXcgZmlsZXMgc3VwcG9ydGluZyBIaXRhY2hpIFNILgotCi1XZWQgQXByIDE0IDIxOjAxOjUxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuaCAoc3RydWN0IG1lbW9yeV9yZWdpb24pOiAgQ2hhbmdlIGBsZW5ndGgnIGFuZAotCWBvbGRfbGVuZ3RoJyBmaWVsZHMgdG8gYmZkX3NpemVfdHlwZS4gIEVsaW1pbmF0ZSB1c2Ugb2YgYmZkX29mZnNldC4KLQkqIGxkbGFuZy5jLCBtcmkuYzogIENvcnJlc3BvbmRpbmcgY2hhbmdlcywgcGx1cyBsaW50LgotCi1UaHUgQXByICA4IDIyOjA4OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBGb3IgYWxsIGkzODYgdGFyZ2V0cywgYWNjZXB0IGk0ODYgYXMgd2VsbC4KLQotTW9uIEFwciAgNSAxNzozMzozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBQcmVzZXJ2ZSBhbGwgZmxhZ3MgZm9yIGEKLQlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbi4KLQkoc2l6ZV9pbnB1dF9zZWN0aW9uKTogQ29uc2lkZXIgYW55IFNFQ19IQVNfQ09OVEVOVFMgc2VjdGlvbiB3aGVuCi0JY29tcHV0aW5nIGxhcmdlc3Rfc2VjdGlvbi4KLQotRnJpIEFwciAgMiAxNDozMzo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXApOiBJbml0aWFsaXplIGFsbAotCWZpZWxkcyBvZiBuZXdseSBjcmVhdGVkIHN0cnVjdHVyZS4KLQotV2VkIE1hciAzMSAxODoxOToxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChnX3N3aXRjaF92YWx1ZSk6IE5ldyB2YXJpYWJsZS4KLQkqIGxkZ3JhbS55IChPUFRJT05fRywgT1BUSU9OX0d2YWwpOiBOZXcgdG9rZW5zLgotCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IC1HIGFuZCBzZXQgZ19zd2l0Y2hfdmFsdWUuCi0JKiBsZGxleC5sIChDT01NQU5EKTogQWNjZXB0IC1HLgotCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0KTogQ2FsbCBiZmRfc2V0X2dwX3NpemUgb24gbmV3IEJGRC4KLQotVHVlIE1hciAzMCAwOTo0MDoyNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIGxpbmtpbmcgYW5kIGxvYWRpbmcgYXQgZGlmZmVyZW50IHBsYWNlczoKLQotCSogbGRsZXgubDogQWRkICJBVCIga2V5d29yZC4KLQkqIGxkZ3JhbS55OiBDbGVhbnVwLCBhbmQgcGFyc2UgQVQuCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUHJpbnQgb3V0cHV0IGFkZHJlc3MKLQlvZiBzZWN0aW9uIGluIG1hcC4gKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEZpbGwgc2VjdGlvbnMnIGxtYSB3aXRoCi0JbG9hZCBhZGRyZXNzLgotCSogbGRsYW5nLmggKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUpOiBBZGQgbG9hZF9iYXNlCi0JaW5mb3JtYXRpb24uCi0KLQkqIGxkaW5kci5jIChhZGRfaW5kaXJlY3QpOiBLZWVwIG1vcmUgaW5mb3JtYXRpb24gaW4gdGhlIGFsaWFzCi0Jc3ltYm9sIGNoYWluLgotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6ICBEb24ndCBpbmhlcml0IE5FVkVSX0xPQUQgc2VjdGlvbgotCWF0dHJpYnV0ZSBmcm9tIGFuIGlucHV0IHNlY3Rpb24uCi0JKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBDb21tb24gc2VjdGlvbiBpcyBORVZFUl9MT0FEIGJ5Ci0JZGVmYXVsdC4gKFFfZW50ZXJfZmlsZV9zeW1ib3MpOiBJbmRpcmVjdCBzeW1ib2xzIG5vdyBhcmUga25vd24gYnkKLQl0aGVpciBzZWN0aW9uLCBub3QgYSBzcGVjaWFsIHN5bWJvbCBmbGFnLgotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBJbmRpcmVjdCBzeW1ib2xzIGFyZW4ndCBsb2NhbC4KLQkod3JpdGVfZmlsZV9nbG9iYWxzKTogV3JpdGUgdGhlIG1hcHBpbmcgZm9yIGFuIGluZGlyZWN0IHN5bWJvbC4KLQkqIHJlbGF4LmMgKGJ1aWxkX2l0KTogV2hlbiBmb3JjZWQgdG8gd3JpdGUgYSBORVZFUl9MT0FEIHNlY3Rpb24sCi0JZmlsbCBpdCB3aXRoIHplcm9zLgotCi1UdWUgTWFyIDIzIDEzOjI0OjEwIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86ICBjaGFuZ2VzIGZvciBxMQotCi1UdWUgTWFyIDIzIDAwOjEzOjI5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBkdmkgdGFyZ2V0LCBkZWZpbmUgJiB1c2UgVEVYSTJEVkksIGFkZCBpbnN0YWxsY2hlY2sKLQotTW9uIE1hciAgOCAyMDozMDozNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW5hbWUgSE9TVF9DQyB0byBDQ19GT1JfQlVJTEQKLQotVGh1IE1hciAgNCAxMjo0NDozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6IEFkZGVkIHZhcmlhYmxlcyB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhCi0Jc3BlY2lmaWMgZW11bGF0aW9uLgotCSogbWlwc2lkdC5zaDogTmV3IGZpbGU7IGVtdWxhdGlvbiBmb3IgSURUIE1JUFMgYm9hcmQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzaWR0Lm8uCi0JKGVtX21pcHNpZHQuYyk6IE5ldyB0YXJnZXQuICBVc2VzIG1pcHNpZHQuc2ggYW5kIG1pcHMuc2Mtc2guCi0JKiBjb25maWcvbWlwcy1pZHQubXQ6IE5ldyBmaWxlOyBzZXRzIEVNVUwgdG8gbWlwc2lkdC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1pZHQtZWNvZmYpOiBOZXcgdGFyZ2V0OyB1c2VzIG1pcHMtaWR0LgotCi1TYXQgRmViIDI3IDAwOjAwOjE0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dC1taXBzYnNkLnNjLXNoLCBtaXBzYnNkLnNoOiBOZXcgZmlsZXMgZnJvbSBSYWxwaCBDYW1wYmVsbCwKLQlyYWxwaGNAcHlyYW1pZC5jb20uCi0JKiBpMzg2YnNkLnNoLCBjb25maWcvaTM4NmJzZC5tdDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogQWRkZWQgc3VwcG9ydCBmb3IgbWlwc2JzZCBhbmQgMzg2YnNkLgotCi1UaHUgRmViIDI1IDE1OjMzOjEwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbXJpLmM6ICBBZGQgZXh0ZXJuIGRlY2xhcmF0aW9uIG9mIHN0cmR1cC4KLQkqIGxkc3ltLmMgKEtFRVAgbWFjcm8pOiAgQWRkIHNwYWNlcyBhcm91bmQgJz0nIGZvciB0aGUKLQlzYWtlIG9mIG9sZCAoZS5nLiBQQ0MpIGNvbXBpbGVycy4KLQotV2VkIEZlYiAyNCAxOTo0OTozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBCdW1wIHRvIHZlcnNpb24gMi4xLgotCi1GcmkgRmViIDEyIDA4OjA5OjExIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogYWxsb3cgc2VjdGlvbiB0eXBlcyB3aXRob3V0IGFkZHJlc3MgIGV4cHJlc3Npb25zLgotCSogbGRsYW5nLmMgKGxhbmdfcmVsb2NhdGVfZ2xvYmFscyk6IGF2b2lkIHBvc3NpYmxlIGhhbmcgd2l0aAotCXVuZGVmaW5lZCBidXQgdW5yZWZlcmVuY2VkIHN5bWJvbHMuCi0JKiByZWxheC5jIChyZWxheF9zZWN0aW9uKTogZG9uJ3QgY29tcGxhaW4gaWYgdGhlIHNjcmlwdCBmaWxlIGlzbid0Ci0JcmVsYXhhYmxlIGJ1dCAtcmVsYXggaXMgc2V0Ci0KLVRodSBGZWIgMTggMTc6NTg6NDUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGdvMzIgaXMgdGhlIDNyZCBwYXJ0IG9mIHRoZSB0cmlwbGUsIG5vdCB0aGUgMm5kCi0KLVdlZCBGZWIgIDMgMDk6MDU6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzYmlnLnNoOiBOZXcgZmlsZS4gIEJpZyBlbmRpYW4gTUlQUyBlbXVsYXRpb24uCi0JKiBjb25maWcvbWlwcy1iaWcubXQ6IE5ldyBmaWxlLiAgVXNlIG1pcHNiaWcgZW11bGF0aW9uLgotCSogY29uZmlndXJlLmluIChtaXBzLXNnaS1pcml4Kik6IFVzZSB0YXJnZXQgbWlwcy1iaWcuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzYmlnLm8uCi0JKGVtX21pcHNiaWcuYyk6IE5ldyB0YXJnZXQuICBVc2VzIG1pcHNiaWcuc2guCi0KLVR1ZSBGZWIgIDIgMTE6MzI6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiBQdXQgLnNjb21tb24gc2VjdGlvbnMgaW50byAuc2JzcyBzZWN0aW9uLgotCi0JKiBsZG1haW4uYyAoc3ViZmlsZV93YW50ZWRfcCk6IFByZXNlcnZlIHNlY3Rpb24gb2YgY29tbW9uIHN5bWJvbHMsCi0JcmF0aGVyIHRoYW4gYWx3YXlzIHB1dHRpbmcgdGhlbSBpbiBiZmRfY29tX3NlY3Rpb24uCi0JKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBJZiBhIGNvbW1vbiBzeW1ib2wgaXMgbm90IGluCi0JYmZkX2NvbV9zZWN0aW9uLCBwdXQgaW4gYSBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUsIHJhdGhlciB0aGFuCi0JYWx3YXlzIHB1dHRpbmcgaXQgaW4gc2VjdGlvbiBDT01NT04uCi0KLUZyaSBKYW4gMjkgMDk6NTc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoc3ViZmlsZV93YW50ZWRfcCk6IElmIHdlIGFscmVhZHkgaGF2ZSBhIGNvbW1vbgotCWRlZmluaXRpb24gb2YgYSBzeW1ib2wsIGRvbid0IG5lY2Vzc2FyaWx5IHB1bGwgaW4gYW4gb2JqZWN0IGZpbGUKLQl0aGF0IHByb3ZpZGVzIGEgbm9uLWNvbW1vbiBkZWZpbml0aW9uLgotCi0JKiBsZGxleC5sIChDT01NQU5EKTogQWNjZXB0IC1FQiBhbmQgLUVMIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsCi0JcmV0dXJuaW5nIE9QVElPTl9FQiBhbmQgT1BUSU9OX0VMLiAgZ2NjIHBhc3NlcyB0aGVzZSB0byBhIE1JUFMKLQlsaW5rZXIuCi0JKiBsZGdyYW0ueSAoT1BUSU9OX0VCLCBPUFRJT05fRUwpOiBOZXcgdG9rZW5zLgotCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgT1BUSU9OX0VCIGFuZCBPUFRJT05fRUwuCi0KLVRodSBKYW4gMjggMTU6MTI6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSAkKHRvb2xkaXIpL2Jpbi9nbGQgYmVmb3JlIGNyZWF0aW5nCi0JdGhlIGxpbmsgdG8gaXQuCi0KLVR1ZSBKYW4gMjYgMTE6NDk6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYywgbGRzeW0uYzogVXNlIG5ldyBiZmRfaXNfY29tX3NlY3Rpb24gbWFjcm8gcmF0aGVyIHRoYW4KLQljaGVja2luZyBmb3IgZXF1YWxpdHkgdG8gYmZkX2NvbV9zZWN0aW9uLgotCi1GcmkgSmFuIDIyIDE0OjIyOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogTmV3IGZpbGUuICBVbHRyaXgsIGFuZCBob3BlZnVsbHkgb3RoZXIgTUlQUyBFQ09GRgotCXRhcmdldHMsIGxpbmtlciBzY3JpcHQuCi0JKiBtaXBzbGl0LnNoOiBOZXcgZmlsZS4gIExpdHRsZSBlbmRpYW4gTUlQUyBlbXVsYXRpb24uCi0JKiBjb25maWcvbWlwcy1saXQubXQ6IE5ldyBmaWxlLiAgVXNlIG1pcHNsaXQgZW11bGF0aW9uLgotCSogY29uZmlndXJlLmluIChtaXBzLWRlYy11bHRyaXgqKTogVXNlIHRhcmdldCBtaXBzLWxpdC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX21pcHNsaXQuby4KLQkoZW1fbWlwc2xpdC5jKTogTmV3IHRhcmdldC4gIFVzZXMgbWlwc2xpdC5zaC4KLQotVGh1IEphbiAxNCAxNTozMDoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogSW5zdGFsbCBsZCBhcyBib3RoICQodG9vbGRpcikvYmluL2xkIGFuZAotCSQodG9vbGRpcikvYmluL2dsZCwgc28gdGhhdCBnY2MgY2FuIGZpbmQgaXQgd2l0aCBvciB3aXRob3V0Ci0JY29sbGVjdDIuCi0KLU1vbiBKYW4gMTEgMTg6NTA6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZHdyaXRlLmM6IFJlbW92ZWQgcGVyZm9ybV9yZWxvY2F0aW9uLCBjb3B5X2FuZF9yZWxvY2F0ZSwgYW5kCi0Jd3JpdGVfbm9yZWwuICBBbGwgbGlua2luZyBpcyBub3cgZG9uZSB2aWEgd3JpdGVfcmVsYXguICBDYWxsCi0JbGRzeW1fd3JpdGUgYmVmb3JlIGNhbGxpbmcgd3JpdGVfcmVsYXguCi0JKiByZWxheC5jOiBBZGRlZCBjb3B5cmlnaHQuCi0JKHdyaXRlX3JlbGF4KTogUmVuYW1lZCBmcm9tIHdyaXRlX3JlbGF4bm9yZWwuICBBZGRlZCByZWxvY2F0ZWFibGUKLQlhcmd1bWVudC4gIHNlY2xldF9kdW1wIHJlbmFtZWQgdG8gYmZkX3NlY2xldF9saW5rLgotCSogcmVsYXguaDogQWRkZWQgY29weXJpZ2h0LgotCi1Nb24gSmFuIDExIDE1OjQxOjU2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSk6IFBhdGNoIGZyb20KLQlob29nZW5Ac2hhZmVyLmNzLnV0YWguZWR1LCBkb24ndCByZXJlYWQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgotCi1GcmkgSmFuICA4IDE4OjA0OjMzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3Z4d29ya3M5NjAubXQgcmVuYW1lZCB0byBjb25maWcvaTk2MC5tdAotCi0JKiBjb25maWd1cmUuaW46IHNwYXJjLWFvdXQgZW11bGF0ZXMgYSBzdW40LCBhcyBkb2VzCi0Jc3BhcmMqLXZ4d29ya3MsIGk5NjAtbmluZHkgdXNlcyBnbGQ5NjAgZW11bGF0aW9uCi0KLUZyaSBKYW4gIDggMTQ6Mzk6MDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkgRml4IHN1cHBvcnQgZm9yIE5PTE9BRCwgYWRkIElOQ0xVREUKLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUpOiBwYXNzIGZpbGUgbmFtZSB0bwotCWxleF9wdXNoX2ZpbGUuCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogdGlkeSB1cCwgcGFyc2UgSU5DTFVERSBhbmQgTk9MT0FECi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogbWFrZSBvdXRwdXQgc2VjdGlvbnMgaW5oZXJpdCBORVZFUl9MT0FECi0JYXR0cmlidXRlLgotCi1UaHUgSmFuICA3IDEwOjIyOjE5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oOiBubyBtb3JlIGRlZmF1bHQgZW11bGF0aW9uLiAgTWFrZSB0aGUgbGFjawotCW9mIGVtdWxhdGlvbiBhIGNvbXBpbGUgdGltZSBlcnJvcgotCi1XZWQgSmFuICA2IDAxOjA4OjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pc2UgYWxsIHNwYXJjbGl0ZSB2YXJpYW50cywgbm90IGp1c3QgJ3NwYXJjbGl0ZScKLQotTW9uIERlYyAyOCAxMToxNTozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGtjb2ZmLnNjLXNoOiBkZWZpbmUgX2VuZCBhcyB3ZWxsIGFzIGVuZCwgZm9yIGNvbnNpc3RlbmN5IHdpdGgKLQlhb3V0LnNjLXNoLgotCi0JKiBjb25maWd1cmUuaW46IGFjY2VwdCAqLWVyaWNzc29uLW9zZSBmb3IgYW55IG02OGsgQ1BVLgotCi0JKiBsZHdyaXRlLmMgKHdyaXRlX3JlbCk6IGRvbid0IGFsd2F5cyBzZXQgU0VDX0hBU19DT05URU5UUyBmbGFnCi0JZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uCi0KLU1vbiBEZWMgMjEgMTY6MDY6NTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGV4cC5jLCBsZGxhbmcuYywgbGRtYWluLmMsIGxkc3ltLmMsIGxkd2Fybi5jOiAgVXNlIG5ldwotCW1hY3JvIGJmZF9hc3ltYm9sX2JmZCBhcyBhcHByb3ByaWF0ZS4KLQkqIE1ha2VmaWxlLmluOiAgVW4tZHVwbGljYXRlIGxkbGV4LmMgZGVwZW5kZW5jeS4KLQkqIGNvbmRpZ3VyZS5pbjogIFJlcGxhY2UgbXlfaG9zdCBjYXNlIHRhYmxlIGJ5IHNvdXJjaW5nCi0JLi4vYmZkL2NvbmZpZ3VyZS5ob3N0LiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlIGRlZmF1bHQuCi0JKiBsZG1pc2MuYzogIENoYW5nZSBsb2dpYyBmb3IgQysrIG5hbWUgZGVtYW5nbGluZzogIFRoZXJlIGlzCi0Jbm8gaW5pdGlhbCAnXycgdG8gcmVtb3ZlIGZyb20gc3RhYi1kZXJpdmVkIGZ1bmN0aW9uIG5hbWVzLgotCi1TdW4gRGVjIDEzIDE2OjMxOjI2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19pbml0X3NjcmlwdF9maWxlKTogZG9uJ3QgYXR0YWNoIHRoZSBvdXRwdXQgZmlsZQotCXNlY3Rpb25zIHRvIHRoZSBzY3JpcHQgZmlsZS4KLQotV2VkIERlYyAgOSAwODozODowNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQkqIGxkbGFuZy5jICh3aWxkKTogcnVuIGV4cGFuc2lvbiBsb29wIG92ZXIgY29tbWFuZCBsaW5lIGJmZCB0b28uCi0JKGxhbmdfaW5pX3NjcmlwdF9maWxlKTogaW5pdGlhbGl6ZSBtb3JlIHBhcnRzIG9mIHRoZSBjb21tYW5kIGxpbmUKLQliZmQuCi0JKiBsZGxleC5sOiBmaXggREVGSU5FRCBzdGFydCBzdGF0ZXMuCi0KLU1vbiBEZWMgIDcgMDg6NDM6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0JIC15IHN1cHBvcnQKLQkqIGxkLnRleGluZm86IG5ldyBkb2MuCi0JKiBsZGdyYW0ueSwgbGRsZXgubDogdW5kZXJzdGFuZCAteTxzeW1ib2w+Ci0JKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBpZiBoYWQgLXksIGxvb2t1cCBzeW1ib2wgYW5kCi0JcHJpbnQgaW5mby4gKGFkZF95c3ltKTogbmV3IGZ1bmN0aW9uLgotCSogbGRzeW0uaDogKGxkc3ltX3R5cGUpOiBuZXcgZGVmaW5lIFNZTV9ZLgotCi1TYXQgTm92IDIxIDAzOjE1OjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsZGN0b3IuaCwgbGRlcnJvci5oLCBsZGV4cC5oLCBsZGZpbGUuaCwgbGRpbmRyLmgsIGxkbGFuZy5jLAotCWxkbGFuZy5oLCBsZGxleC5oLCBsZG1haW4uaCwgbGRtaXNjLmgsIGxkc3ltLmgsIGxkdmVyLmgsIGxkd2Fybi5oLAotCWxkd3JpdGUuaCwgcmVsYXguaDogIFJlcGxhY2UgYWxsIHVzZXMgb2YgRVhGVU4gYW5kIFBST1RPIGFuc2ktZ2x1ZQotCW1hY3JvcyB3aXRoIFBBUkFNUy4gIFJlY3JlYXRpb25hbCBjbGVhbnVwLiAgVXBkYXRlIGNvcHlyaWdodHMuCi0KLVR1ZSBOb3YgMTAgMDA6MjM6MzcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIHRoZSBiZmQgc291cmNlIGRpcmVjdG9yeSBmb3IgaW5jbHVkZXMKLQotVGh1IE5vdiAgNSAxNTo0MTo1NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBkb24ndCBjaGFuZ2Ugc2l6ZSBhbmQgYWRkcmVzcyBmb3IKLQlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbnMgcmF0aGVyIHRoYW4gZm9yIFNFQ19ORVZFUl9MT0FECi0Jc2VjdGlvbnMuCi0KLVRodSBOb3YgIDUgMTE6MzM6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbGF4LmMgKGJ1aWxkX2l0KTogcmUtZW5hYmxlIHRoZSBwcm9jZXNzaW5nIG9mIGRhdGFfc3RhdGVtZW50cwotCWluIHNjcmlwdHMsIG1ha2VzIGNvdW50ZWQgY29udHJ1Y3RvciBsaXN0cyB3b3JrIGFnYWluLgotCi1UaHUgTm92ICA1IDA1OjQzOjAxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsZGVtdWwuaDogIFJlbW92ZSB1c2VzIG9mIFNERUYgYW5kIFBST1RPIG1hY3JvcyAodXNlIFBBUkFNUykuCi0KLVR1ZSBPY3QgMjAgMTA6NTY6MDYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrY29mZi5zYy1zaDogZG9uJ3QgdXNlIGluaXRpYWwgdW5kZXJzY29yZXMgZm9yIGV0ZXh0LCBlZGF0YQotCWFuZCBlbmQuCi0KLU1vbiBPY3QgMTkgMDk6NDU6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBTdXBwb3J0IGZvciBpMzg2LXN5c3YuCi0JY29uZmlndXJlLmluOiBjaGVjayBmb3IgaTM4Ni0qLXN5c3YqIGFuZCBpMzg2LSotc2NvKi4KLQlpMzg2Y29mZi5zYy1zaDogcmV3cm90ZSB0byBzdXBwb3J0IFNWUjMgYnkgZGVmYXVsdC4KLQlsZGN0b3IuYyAoZmluZF9jb25zdHJ1Y3RvcnMpOiBwcmVzZXJ2ZSBzdGF0X3B0ci4KLQlsZGxhbmcuYyAod2lsZF9kb2l0KTogaW5pdGlhbGl6ZSB2bWEgYW5kIHNpemUgb2YgbmV3IG91dHB1dAotCXNlY3Rpb24gdG8gY29ycmVzcG9uZGluZyBpbnB1dCBzZWN0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IKLQlzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBkb24ndCBtb2RpZnkgdm1hIGFuZCBzaXplIG9mIHNlY3Rpb25zIHdoaWNoCi0JYXJlIG5ldmVyIGxvYWRlZCAoZm9yIHNoYXJlZCBsaWJyYXJpZXMpLgotCWxkd3JpdGUuYyAoY29weV9hbmRfcmVsb2NhdGUpOiBjb3B5IHRoZSBjb250ZW50cyBvZiBhbnkgc2VjdGlvbgotCXdoaWNoIGhhcyBjb250ZW50cywgbm90IGp1c3Qgc2VjdGlvbnMgd2hpY2ggYXJlIGxvYWRlZCAoZm9yIHNoYXJlZAotCWxpYnJhcmllcykuCi0KLVRodSBPY3QgMTUgMTU6MjA6MjYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChzaXplX2lucHV0X3NlY3Rpb24pOiBjb3VudCB0aGUgc2l6ZXMgb2YgYWxsIHNlY3Rpb25zCi0gICAgICAgIHdlIGFsbG9jYXRlLgotCi1UaHUgT2N0ICA4IDA5OjA1OjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAoZGVtYW5nbGUsdmZpbmZvKTogdXNlIHRoZSBuZXcgdW5kZXJzY29yZSBpbiBiZmQgdG8KLQl0byBkZW1hbmdsZSBzeW1ib2xzIGJldHRlcgotCi1UdWUgT2N0ICA2IDEzOjA4OjU0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogZG9uJ3Qgd2FybiBpZiAtZSBzdGFydCBzeW1ib2wgZG9lcyBub3QKLQlleGlzdCB3aGVuIGxpbmtpbmcgd2l0aCAtci4KLQotTW9uIE9jdCAgNSAxNDowNzozNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXQuc2Mtc2gsIG02OGtjb2ZmLnNjLXNoOiBzZXQgX19ic3Nfc3RhcnQgdG8gdGhlIHN0YXJ0IG9mIHRoZQotCS5ic3Mgc2VnbWVudC4KLQotTW9uIE9jdCAgNSAwODo1NToxNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGxpbmVhcl9saWJyYXJ5KTogZG9uJ3QgZXZlbiB0aGluayBhYm91dCBwcm9jZXNzaW5nCi0JYW4gb2JqZWN0IGZpbGUgaWYgaXQncyBhbHJlYWR5IGJlZW4gZG9uZQotCi1UaHUgT2N0ICAxIDIzOjE0OjU5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB0aGUgaHA5MDAwLzMwMCBjb25maWcgZmlsZSBpcyBub3cgaHAzMDAKLQotV2VkIFNlcCAzMCAwNzozNDowOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3o4a3NpbS5tdDogbmV3IGZpbGUKLQotRnJpIFNlcCAyNSAxMzo0OTo1MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3lyaWF0aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGRleHAubywgbGRjdG9yLm8sIGxkbGFuZy5vLCBsZG1haW4ubywgbGR3cml0ZS5vLAotCWxleHN1cC5vLCBtcmkubywgcmVsYXgubyk6IEluZGljYXRlIGRlcGVuZGVuY2Ugb24gbGRncmFtLmguCi0KLQkqIGxkLmggKHN0cmlwX3N5bWJvbHNfdHlwZSk6IEFkZCB2YWx1ZSBTVFJJUF9TT01FLgotCSogbGRncmFtLnkgKE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFKTogTmV3IHRlcm1pbmFsIHRva2VuLgotCSogbGRsYW5nLmMgKGxhbmdfYWRkX2tlZXBzeW1zX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxleC5sOiBIYW5kbGUgIi1yZXRhaW4tc3ltYm9scy1maWxlIi4KLQkqIGxkc3ltLmMgKGtlZXBzeW1zX2ZpbGUsIGtlcHRfc3ltcyk6IE5ldyB2YXJzLgotCShwcm9jZXNzX2tlZXBzeW1zKTogTmV3IGZ1bmN0aWhvbjsgcmVhZHMgZmlsZSwgbWFya3Mgc3ltYm9scyBmb3IKLQlzYXZpbmcuCi0JKHdyaXRlX2ZpbGVfbG9jYWxzKTogRmlsZSBzeW1ib2xzIHNob3VsZCBhbHdheXMgYmUga2VwdC4KLQkobGRzeW1fd3JpdGUpOiBXYXJuIGFib3V0ICItcmV0YWluLXN5bWJvbHMtZmlsZSIgb3ZlcnJpZGluZyAiLVMiCi0JYW5kICItcyIuICBQcm9jZXNzIHJldGFpbi1zeW1ib2xzIGZpbGUgYmVmb3JlIHNldHRpbmcgc3ltdGFiLgotCSogbGRzeW0uaCAoU1lNX0tFRVApOiBOZXcgZmxhZyBmb3IgbGRzeW1fdHlwZSBmbGFncy4KLQkoa2VlcHN5bXNfZmlsZSwga2VwdF9zeW1zKTogRGVjbGFyZSB0aGVtLgotCi0JKiBsZG1haW4uYyAobWFpbik6IE5vbi1mYXRhbCBlcnJvcnMgc2hvdWxkIHN0aWxsIGNhdXNlIG5vbi16ZXJvCi0JZXhpdCBzdGF0dXMgZXZlbiB3aXRoIC1yLgotCi1GcmkgU2VwIDI1IDExOjA4OjAxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB0aGUgejhrCi0JKiB6OGtzaW0uZW0sIHo4a3NpbS5zYy1zaCwgejhrc2ltLnNoOiBuZXcgZmlsZXMKLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IG1vZGlmaWVkIHRvIHJlZmxlY3QgYWJvdmUKLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiB3aGVuIGxpbmtpbmcgY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcywKLQltYWtlIHRoZSBvdXRwdXQgZmlsZSByZWZsZWN0IGF0IGxlYXN0IG9uZSBvZiB0aGUgYmFkIGlucHV0cy4KLQotVHVlIFNlcCAxNSAxNTozNTozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaWYgJCh0b29sZGlyKSBleGlzdHMsIGluc3RhbGwgbGQgaW4KLQkkKHRvb2xkaXIpL2Jpbi4KLQotRnJpIFNlcCAxMSAxMDoyNDoyMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogbW9kaWZpZWQgdG8gc3VwcG9ydCBpMzg2LWNvZmYKLQkqIGkzODZjb2ZmLnNoOiBuZXcgZmlsZQotCi1XZWQgU2VwICA5IDExOjUyOjU4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIG02OGtjb2ZmLnNoLCBtNjhrY29mZi5zYy1zaCwgY29uZmlnL202OGstY29mZi5tdDoKLQlhZGRlZCBtNjhrLWNvZmYgZW11bGF0aW9uIG1vZGUsIHN0b2xlbiBmcm9tIGEyOWsgZW11bGF0aW9uLgotCUFsbW9zdCBjZXJ0YWlubHkgd3JvbmcsIGJ1dCBwZXJoYXBzIGJldHRlciB0aGFuIHN1bjMuCi0KLVRodSBTZXAgIDMgMTQ6MTk6MzAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgTWFrZWZpbGUuZG9zLCBnZW5lcmljLmVtLCBnZW5zY3JpcHRzLnNoLAotCWdsZDk2MC5lbSwgaDgzMDBobXMuZW0sIGg4MzAweHJheS5lbSwgbG5rOTYwLmVtLCBzdDIwMDAuZW0sCi0JdmFuaWxsYS5lbTogIFJlbmFtZSBhbGwgKGdlbmVyYXRlZCkgbGRfXyouYyBmaWxlcyB0byBlbV8uYy4KLQlUaGlzIGlzIG9uZSBjaGFyYWN0ZXIgc2hvcnRlciwgYW5kIGxldHMgcGVvcGxlIGJ1aWxkIG9uCi0JU1ZSMyBzeXN0ZW0uIChsZF9faDgzMDB4cmF5Lltjb10gd2FzIHRoZSBraWxsZXIgdGhlcmU7Ci0JaDgzMDB4cmF5LnNjLXNoIGlzIGFsc28gb3ZlcmxvbmcsIGJ1dCBzZWVtcyBoYXJtbGVzcy4pCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEpvbmF0aGFuIFJ5c2hwYW4gPGhpdGFjaGkhYW1pdG8ham9uPi4KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6ICBGaXggdHlwbyBtb3N0Y2xlYW4gLT4gbW9zdGx5Y2xlYW4uCi0JKiBjb25maWd1cmUuaW46ICBBZGQgaG9zdCBpc2MuCi0KLQkqIGxkdmVyLmM6ICBDYWxsIGl0IHZlcnNpb24gMi4wLgotCi1XZWQgU2VwICAyIDAwOjIxOjMzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogIEJ1bXAgdG8gdmVyc2lvbiAwLjk4LgotCSogVE9ETzogIE5ldyBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZGVkIG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4sIHJlYWxjbGVhbiBydWxlcy4KLQotVHVlIFNlcCAgMSAyMzo0MjoxNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jICh4cmVhbGxvYyk6ICBOZXcgKG5lZWRlZCBieSAuLi9saWJpYmVydHkvY3BsdXMuZGVtLmMpLgotCSogbGRsZXgubDogTW92ZWQgY29tbWVudCgpIHRvIGVuZCwgc2luY2Ugc29tZSBjb21waWxlcnMKLQlvdGhlcndpc2UgaGF2ZSBwcm9ibGVtcyB3aXRoIGlucHV0KCkgdXNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4KLQotVHVlIFNlcCAgMSAxNzo0NTo1MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgU29sYXJpcyAyIGFuZCBJcml4IDQgaG9zdCBzdXBwb3J0LgotCi1Nb24gQXVnIDMxIDE5OjI3OjExIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSAtUyBmbGFnIGZyb20gdGhlIEZMRVggZGVmaW5pdGlvbgotCi0JKiBjb25maWd1cmUuaW46IHJld3JvdGUsIHVzaW5nIG5ldyBzdHlsZSBjYXNlIHN0YXRlbWVudC4gIHVzZQotCW02OGsubXQgZm9yIG02OGstYW91dCBzeXN0ZW1zCi0KLVN1biBBdWcgMzAgMjE6Mzg6NTMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFwICJsZCIgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHdoZW4KLQlpbnN0YWxsaW5nLgotCi1TdW4gQXVnIDMwIDE4OjEyOjEzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBSZW1vdmVkLiAgVXNlIHRoZSB2ZXJzaW9uIGluIGxpYmliZXJ0eSBub3cuCi0JKiBsZG1pc2MuYzogIFVzZSBuZXcgbGliaWJlcnR5IHZlcnNpb24gb2YgY3BsdXNfZGVtYW5nbGUoKS4KLQotVGh1IEF1ZyAyNyAxNjozODo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGdsZDk2MC5lbSAoZ2xkOTYwX2Nob29zZV90YXJnZXQpOiBkZWZhdWx0IHRvIGxpdHRsZSBlbmRpYW4sIG5vdAotCWJpZyBlbmRpYW4uCi0KLVdlZCBBdWcgMjYgMTc6Mjg6NTEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBkb24ndCBwYXNzIG51bGwgcG9pbnRlcnMgd2hlbgotCWFic19vdXRwdXRfc2VjdGlvbiBpcyB3aGF0IGlzIHJlcXVpcmVkLgotCSogbGR3cml0ZS5jIChsZHdyaXRlKTogdXNlIG1hbGxvYyB0byBhbGxvY2F0ZSB0aGUgbGFyZ2VzdCBzcGFjZQotCXVzZWQsIGFuZCBwYXNzIHRoYXQgZG93bi4KLQkqIHJlbGF4LmMscmVsYXguaCAod3JpdGVfcmVsYXhub3JlbCk6IHVzZSB0aGUgcGFzc2VkIG1hbGxvYyBhcmVhIHJhdGhlcgotCXRoYW4gYWxsb2NhLgotCi1Nb24gQXVnIDI0IDE0OjQyOjA2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvb3NlNjgubXQ6IHJlbmFtZWQgT1NFIHRvIG9zZS4KLQotVGh1IEF1ZyAyMCAxOTo1NToyMiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBSZW9yZGVyIGNoZWNrIGZvciBjb21tb24gb3IKLQl1bmRlZmluZWQgc3ltYm9scyBzbyB0aGF0IGl0IHdvcmtzLgotCi1UdWUgQXVnIDE4IDEzOjQxOjM2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhY2NlcHQgYWxsIG02OEsgZmFtaWx5IG1lbWJlcnMuCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotVGh1IEF1ZyAxMyAxMTo0OTozNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogbm93IHBhcnNlcyBjb21tZW50IGNvcnJlY3RseSwgYWRkZWQgfiB0byBhY2NlcHRhYmxlCi0JY2hhcnMgaW4gZmlsZW5hbWVzCi0KLQkqIGxkZXhwLmMgKGV4cF91bm9wKTogcGFzcyBkb3duIGFic19vdXRwdXRfc2VjdGlvbiAtIG5vdyBjYW4gaGF2ZQotCXVuYXJ5IC12ZSBjb25zdGFudHMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IHdhcm4gd2hlbiBhbiBlbnRyeSBzeW1ib2wgc3VwcGxpZWQgb24KLQl0aGUgY29tbWFuZCBsaW5lIGNhbid0IGJlIGZvdW5kLgotCi1GcmkgQXVnICA3IDEyOjMxOjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuaDogYWRkIG5ldyBmaWVsZCAibG9hZGFibGUiIHRvIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KLQkqIGxkbGFuZy5jIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXApOiBpbml0aWxpemUgbmV3Ci0JZmllbGQuICh3aWxkX2RvaXQpOiBpZiBuZXcgZmllbGQgaXMgbm90IHNldCwgdGhlbiBzdG9wIG91dHB1dAotCXNlY3Rpb24gZnJvbSBiZWluZyBsb2FkYWJsZS4KLQkobGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBzZXQgdGhlIGZpZWxkIGZyb20gdGhlCi0JTk9MT0FEIGtleXdvcmQKLQkqIGxkZ3JhbS55OiBuZXcgc3luYXggZm9yIE5PTE9BRC4gUmVtb3ZlcyBhIHNoaWZ0L3JlZHVjZSB0b28uCi0JKiBoODMwMGhtcy5zYy1zaCwgaDgzMDBobXMuZW06IGdldCAtciByaWdodC4KLQotVGh1IEF1ZyAgNiAxODozNToyMSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkaW50LnRleGluZm86ICBOZXcgaW50ZXJuYWxzIG1hbnVhbCAoYmVnaW5uaW5ncyB0aGVyZW9mKS4KLQkqIFBPUlRJTkc6ICBSZW1vdmVkLCBtZXJnZWQgaW50byBsZGludC50ZXhpbmZvLgotCi1UdWUgQXVnICA0IDIxOjEyOjI5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY2R0ZXN0LW1haW4uY2MsIGNkdGVzdC1mdW5jLmNjLCBjZHRlc3QtZm9vLmgsIGNkdGVzdC1mb28uY2MsCi0JY2R0ZXN0LmV4cDogIEEgdGVzdCBwcm9ncmFtIChjb3BpZWQgZnJvbSBsaWJnKysvdGVzdC1pbnN0YWxsKQotCXRoYXQgdGVzdHMgdGhhdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGhhbmRsZWQKLQljb3JycmVjdGx5LgotCi1Nb24gQXVnICAzIDE0OjU4OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpbnN0YWxsIGZyb20gbGQubmV3LCByZW5hbWluZyBkdXJpbmcgdGhlCi0JY29weSwgb3IgZWxzZSB0aGUgbmV4dCAnbWFrZSBpbnN0YWxsJyBuZWVkcyB0byByZS1saW5rIGxkLgotCi1Nb24gSnVsIDIwIDAzOjM3OjA2IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBnZW5lcmFsaXNlIGhwIHJlY29nbml0aW9uIChmcm9tIHNlZikuCi0KLVNhdCBKdWwgMTggMTQ6NDY6MDQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBic2QgYW5kIGhwdXggaHBwYSBjb25maWd1cmF0aW9ucy4KLQllcnJvciBtZXNzYWdlcyBlY2hvIHRvIHN0ZGVyciwgbm90IHN0ZG91dAotCi1GcmkgSnVsIDE3IDIyOjA2OjExIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuZG9zLCBnbGQuMSwgbGQudGV4aW5mbywgbGRlbXVsLmMsIGxkZmlsZS5jLCBsZGxhbmcuYywKLQkgIGxkbWlzYy5jOiByZW1vdmVkIHJjc2lkJ3MuCi0KLVR1ZSBKdWwgMTQgMDg6MzQ6MzQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX21hcCk6IHByaW50IGNoYW5nZXMgaW4gc2l6ZXMgZHVlIHRvIHJlbGF4aW5nCi0JKHNpemVfaW5wdXRfc2VjdGlvbik6IG1haW50YWluIHRoZSBkZWx0YSBpbmZvcm1hdGlvbi4KLQkqIGxkbGFuZy5oOiBhZGQgbmV3IGZpZWxkIHRvIHN0cnVjdCB0byBjb250YWluIGRlbHRhIGluZm8uCi0JKiByZWxheC5jICAocmVsYXhfc2VjdGlvbik6IGNvbXBsYWluIGlmIGlucHV0IG5vdCByZWxheGFibGUuCi0JKiBsZGxleC5sIDogYWRkICdfJywgJywnIGFuZCAnJCcgdG8gY2hhcnMgd2hpY2ggY2FuIGFwcGVhciBhdCB0aGUKLQlzdGFydCBvZiBhIGZpbGVuYW1lCi0KLU1vbiBKdWwgMTMgMTc6MzM6MDAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jKG1haW4pOiBwcmV2ZW50IC1yIGFuZCAtcmVsYXggZnJvbSBiZWluZyBvbiBhdCB0aGUgc2FtZQotCXRpbWUuCi0KLVdlZCBKdWwgIDEgMTc6NTE6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChRX2VudGVyX2dsb2JhbF9yZWYpLCBsZGluZHIuYyAoYWRkX2luZGlyZWN0KTogZml4IGZvcgotCWFsaWFzaW5nIHByb2JsZW1zCi0KLQotVGh1IEp1biAxOCAwOTozODo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDgzMDBobXMuZW0sIGg4MzAwaG1zLnNjLXNoOiAgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciAtcgotCSogbGRleHAuYzogIGxpbnQKLQkqIGxkbGFuZy5jKG9wZW5fb3V0cHV0KTogc2V0IHRoZSB0YXJnZXQgYXJjaCBhbmQgbWFjaGluZSBhcyBzb29uCi0JYXMgd2UgY2FuLiAobGFuZ19zaXplX3NlY3Rpb25zKTogdXNlIG5ldyBtYWNyb3MgZm9yIHNldHRpbmcgdm1hCi0JKiBsZHdyaXRlLmM6IGxpbnQKLQotTW9uIEp1biAxNSAwODo0Nzo0MyAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG15X3RhcmdldCk6IEFjY2VwdCBtNjgwPzAgZm9yIHdycyBhcyB2eHdvcmtzNjguCi0JQWxzbyBkZWxldGVkIGFuIHVucmVhY2hhYmxlIHBhdGggdG8gd3JzLgotCi1XZWQgTWF5IDI3IDIzOjI0OjE5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogdXNlIC1kIHRlc3QgZm9yICR0b29sZGlyIGJlZm9yZQotCWluc3RhbGxpbmcgbGQgdGhlcmUgc28gdGhhdCAkdG9vbGRpciBjYW4gYmUgaW5oZXJpdGVkIGZyb20KLQl0b3AtbGV2ZWwgTWFrZWZpbGUuCi0KLVdlZCBNYXkgMjcgMTY6NTY6NDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYzogIFR3byBub24tc3Vic3RhbnRpYWwgY2hhbmdlcyBmb3IgdGhlIHNha2Ugb2YKLQl0aGUgb2xkIFBvcnRhYmxlIEMgQ29tcGlsZXIuCi0KLVdlZCBNYXkgMjcgMTU6MTU6NTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBsZGdyYW0ueSwgbGRsZXgubDogcGFyc2UgQUJTT0xVVEUKLQkqIGxkZXhwLmM6IGFkZCBzdXBwb3J0IGZvciBBQlNPTFVURQotCi1XZWQgTWF5IDI3IDEzOjA3OjIwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBIT1NUSU5HX0NSVDAsCi0JSE9TVElOR19MSUJTLCBhbmQgSE9TVElOR19FTVUsIGJhc2VkIG9uIHRob3NlIGluIGNvbmZpZy8qLm1oLgotCSogY29uZmlnLyoubWg6ICBNaXNjZWxsYW5lb3VzIGNsZWFuLXVwOiAgUmVtb3ZlZCBkZWZpbml0aW9ucwotCW9mIFlBQ0MgKHNpbmNlIGl0IGlzIG5vdCBsb25nZXIgdXNlZCBpbiB0aGUgTWFrZWZpbGUpLgotCVJlbW92ZSBIT1NUSU5HXyogZGVmaW5pdGlvbnMgdGhhdCBhcmUgc3Vic3VtZWQgYnkgdGhlCi0Jb25lcyBhZGRlZCB0byBNYWtlZmlsZS5pbi4gIFJlbW92ZWQgbW9zdCBkZWZpbml0aW9ucyBvZiBDQy4KLQkqIGNvbmZpZy97c3BhcmMsbmV3cyxocDMwMGJzZCxkZWNzdGF0aW9ufS5taDogIFJlbW92ZWQ7Ci0JVGhlc2UgYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0KLUZyaSBNYXkgMjIgMTM6NDc6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXNlIHNyY2RpciBpbnN0ZWFkIG9mIFZQQVRIIGluIGxkZ3JhbS9sZGxleAotCXJ1bGVzLCBzaW5jZSB0aGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgZGlzdHJpYnV0aW9uLgotCSogTWFrZWZpbGUuaW4gKGxkbGV4LmMpOiAgRG9uJ3QgcmUtZGlyZWN0IG91dHB1dCwgc2luY2UgdGhhdAotCWxlYXZlcyBhIGJvZ3VzIG91dHB1dCBmaWxlcyBpZiBpdCBmYWlscy4KLQotCSogY29uZmlnL3NwYXJjLm1oOiAgRml4IEhPU1RJTkdfTElCUyBzbyBpdCBoYXMgYSBjaGFuY2Ugb2Ygd29ya2luZy4KLQkqIGxkbGV4LmM6ICBGaXggc29tZSB1bm5lY2Vzc2FyeSBmbGV4LXNwZWNpZmljLWlzbXMuCi0KLUZyaSBNYXkgIDggMTE6NDk6NDMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55OiBtb3ZlIHNwdXJpb3VzIHNlbWljb2xvbgotCSogbGRleHAuaDogZml4IHByb3RvdHlwZQotCi1UaHUgTWF5ICA3IDE3OjAxOjEyIDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86IHJlZmVyZW5jZXMgdG8gbGlua2VyIG5vdyBzYXkgImxkIiBub3QgImdsZCIuCi0KLVdlZCBNYXkgIDYgMTM6MjY6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQljaGFuZ2VkIGNhbGxpbmcgY29udmVudGlvbiBmb3IgUV9lbnRlcl9nbG9iYWxfcmVmCi0JKiBsZGV4cC5jLCBsZGxhbmcuYywgbGRtYWluLmM6IHJlZmxlY3QgdGhpcwotCSogbGR2ZXIuYzogYnVtcCB2ZXJzaW9uIHRvIDEuOTcuMQotCSogbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IHdoZW4gYW4gZWRpY3QgZGVjbGFyaW5nIGFuIGluZGlyZWN0Ci0Jc3ltYm9sIGlzIGZvdW5kLCBtYWtlIHN1cmUgdGhhdCBhbnkgaWRlYXMgYWJvdXQgdGhlIHN5bWJvbCBiZWluZwotCWNvbW1vbiBhcmUgY2hhbmdlZCBpZiBpdCBub3cga25vd24gdG8gYmUgZGVmaW5lZC4KLQkqIGxkbWFpbi5jIChsaW5lYXJfbGlicmFyeSk6IGNvbXBsYWluIG9uY2UgaWYgYXJjaGl2ZSBpc24ndAotCXJhbmxpYmJlZC4KLQkqIGxkbGFuZy5oLCBsZGxhbmcuYzogbWFrZSByb29tIGZvciBhbmQgaW5pdGlhbGl6ZSB0aGUgY29tcGxhaW4KLQlvbmNlIGZpZWxkLgotCi1XZWQgTWF5ICA2IDExOjA3OjM1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSBmbGV4ICYgYmlzb24gZnJvbSAuLi8gaWYgdGhleSBleGlzdC4KLQotVHVlIE1heSAgNSAxNzo0NzozMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsYXguYyAoYnVpbGRfaXQpOiBkb24ndCBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUgZm9yCi0Jc3R1ZmYgaWYgLVIgZmxhZyBhcHBseXMgdG8gaXQuCi0JKiBsZGZpbGUuYzogbWVyZ2UgaW4gVk1TIGZpbGVuYW1lIHN1cHBvcnQKLQkqIGxkbWFpbi5jIChtYWluKTogdGFrZSBvdXQgLi8gZnJvbSBsaWJyYXJ5IHBhdGgsIGFuZCBjbG9zZSBmaWxlCi0JYmVmb3JlIHVubGlua2luZy4gTWFrZSBtdWx0aXBsZSBkZWZzIG9mIGEgc3ltYm9sIGNyZWF0ZSBhbgotCXVuZXhlY2FibGUgZmlsZS4KLQkqIGxkbWlzYy5jOiBmYXRhbCBlcnJvc3JzIGRlbGV0ZSBvdXRwdXQgZmlsZQotCi1UdWUgTWF5ICA1IDE0OjA1OjA1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogIEluY3JlYXNlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTcsIGZvciBjb25zaXN0ZW5jeQotCXdpdGggLi4vYmludXRpbHMuCi0KLVR1ZSBNYXkgIDUgMTI6MTI6MjQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBGTEVYIC0+IExFWC4KLQotCSogbGQudGV4aW5mbzoge30gLT4gQHtAfS4KLQotTW9uIE1heSAgNCAxNzo1Mjo0MSAxOTkyICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiBkZXNjcmliZSBhbHRlcm5hdGUsIE1SSS1jb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzCi0JKGFuZCBhc3NvY2lhdGVkIGNoYW5nZSBpbiAtYyBvcHRpb24sIG5vdyB1c2VkIGZvciB0aGVzZSBzY3JpcHRzKQotCi1Nb24gTWF5ICA0IDE2OjEwOjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiBCdW1wZWQgdmVyc2lvbiB0byAxLjk2IC0gbmV3IHJlbGVhc2UsIHJlc3luYyB3aXRoIHRoZQotCWJmZCB0b28gIy4KLQkqIGxkZXhwLmMsIGxkbGFuZy5jOiBub3cgYnVpbGQgbWVtb3J5IHNoYXBlIHRyZWUgaW4gb2JzdGFja3MKLQlyYXRoZXIgdGhhbiB3aXRoIHJhdyBtYWxsb2MsIG1ha2VzIGl0IGVhc2llciB0byB0cmFjayB3aGVyZSBtZW1vcnkKLQlpcyBnb2luZy4KLQkqIGxkc3ltLmgsIGxkc3ltLmM6IGNyZWF0ZSBvYnN0YWNrIGZvciBhbGwgZ2xvYmFsIHN5bWJvbHMgdG9vLgotCSogbGR3cml0ZS5jIChsZHdyaXRlKTogbW92ZWQgbWFsbG9jIHNvIG9ubHkgdXNlZCB3aGVuIG5lZWRlZC4KLQkqIHNhMjkyMDAtc2Muc2g6IGFkZGVkIHN1cHBvcnQgZm9yIC5saXQsIGRhdGExIGFuZCBkYXRhMiBzZWN0aW9ucy4KLQotCi1GcmkgTWF5ICAxIDE4OjE3OjUyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3BhcmMubWg6IHVzZSAuLi9nY2MvbGliZ2NjLmEgb24gY2hlY2sgaWYgaXQgZXhpc3RzLgotCi0JKiBNYWtlZmlsZS5pbjogdXNlIGJvb3RzdHJhcCBmb3IgY2hlY2suCi0KLUZyaSBNYXkgIDEgMTM6MDM6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55LCBsZGxleC5jLCBtcmkuYzogYWRkZWQgbW9yZSBjb21wYXRpYmxlIHdvcmRzOyBCQVNFLCBBTElBUyBhbmQKLQlQVUJMSUMuCi0JKiBNYWtlZmlsZS5pbjogbm93IHVzZSBmbGV4LCBub3QgbGV4Ci0JKiBsZGxleC5sLCBsZGxhbmcuYywgbGRjdG9yLmM6IGxpbnQKLQotV2VkIEFwciAyMiAxMjo0ODo0MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogYWRkZWQgQ01ERklMRU5BTUVDSEFSIHN0YXRlIHNvIHRoYXQgeW91IGNhbiBsZXgKLQlkaWZmZXJlbnQgc29ydHMgb2YgZmlsZW5hbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUgdGhhbiBpbiBhIHNjcmlwdC4KLQotTW9uIEFwciAyMCAyMjozNzowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgdGhleSBjYW4gYmUgcGFzc2VkIG9uIHRoZQotCSAgbWFrZSBjb21tYW5kIGxpbmUuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1GcmkgQXByIDE3IDA4OjU3OjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxheC5jOiBhZGRlZCBoYW5kbGluZyBmb3IgbmV3ICJwYWRkaW5nIiBzZWNsZXQgdHlwZSwgdXNlZCB0bwotCWZpbGwgb3V0IGdhcHMgYmV0d2VlbiBzZWN0aW9uLgotCSogbGRncmFtLnksIGxkbGV4Lmw6IG5vdyAtZGVmc3ltIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgZG9uZQotCXByb3Blcmx5LgotCi1XZWQgQXByIDE1IDIxOjIwOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHRoZSB0b29sZGlyIGNvcHkgb2YgbGQgZ29lcyBkaXJlY3RseSBpbiB0b29sZGlyLgotCi1XZWQgQXByIDE1IDE2OjA5OjMzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtcmkuYywgbGRncmFtLnksIGxkbGV4Lmw6IGFkZGVkIHN1cHBvcnQgZm9yIG1pbmltYWwgc3RyYW5nZSBsaW5rCi0Jc2NyaXB0cy4KLQotVGh1IEFwciAgOSAwNTo1MjowMiAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBJbnN0YWxsIHNlY29uZCBjb3B5IGluICQodG9vbGRpcikvYmluCi0Jd2l0aG91dCAkKHByb2dyYW1fcHJlZml4KSwgc2luY2UgdGhhdCdzIHdoYXQgZ2NjIGV4cGVjdHMuCi0KLVNhdCBBcHIgIDQgMTc6NDQ6MDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwsIGxkZ3JhbS55LCBsZGxleC5oOiBSZXdyb3RlIGxleGVyLiBOb3cgaXQncyBtdWNoIG5pY2VyLgotCSogaDgzMDAqOiBmaXggYml0IHJvdCBhbmQgYWRkIHN1cHBvcnQgZm9yIGg4MzAweHJheSB0YXJnZXQKLQkqIGdvMzIuc2g6IHRhcmdldCBlbXVsYXRpb24gZm9yIGdvMzIuCi0KLU1vbiBNYXIgMTYgMTQ6NTM6MjkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdsZDk2MC5lbSwgaTk2MC5zYy1zaC4gRml4IGk5NjAgYml0IHJvdAotCi1GcmkgTWFyIDEzIDE5OjQ3OjIyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCBtYW4gcGFnZS4KLQotRnJpIE1hciAxMyAwODoyMzo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LTxmb28+IHJlbmFtZWQgdG8gPGZvbz4ubXQKLQkqIGNvbmZpZy9taC08Zm9vPiByZW5hbWVkIHRvIDxmb28+Lm10Ci0JKiBjb25maWd1cmUuaW4gY2hhbmdlZCB0byByZWZsZWN0IHRoaXMKLQkqIGdlbnNjcmlwdHMuc2ggbm93IG1ha2UgLnhibiBmaWxlcyByYXRoZXIgdGhhbiAueE4gZmlsZXMKLQotU2F0IE1hciAgNyAwMzo0MDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuaDogZml4IGRlY2wgb2YgbGR2ZXJzaW9uLgotCi1GcmkgTWFyICA2IDIyOjAwOjM1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1GcmkgTWFyICA2IDA2OjU5OjA0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBub3cgYWxpYXNlcyB3b3JrIGFnYWluCi0KLVRodSBNYXIgIDUgMjE6Mzk6MjkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4KLQotVGh1IE1hciAgNSAxNjo1NTo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYyAoZXhwX3ByaW50X3RyZWUpOiBkb24ndCB0cnkgYW5kIGZvbGxvdyBudWxsIHBvaW50ZXJzCi0JYXJvdW5kLgotCSogbGRncmFtLnk6IHJlbW92ZSAxMSBzaGlmdCByZWR1Y2UgZXJyb3JzCi0KLVR1ZSBNYXIgIDMgMTU6NDY6MzkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCi0KLUZyaSBGZWIgMjggMDg6MTc6NDUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChzaXplX2lucHV0X3NlY3Rpb24pOiBkb24ndCBtb3ZlIGFic29sdXRlIHNlY3Rpb25zCi0JYXJvdW5kIQotCi0KLVRodSBGZWIgMjcgMDk6MjA6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiB5ZXQgYW5vdGhlciBjb3B5IG9mIHRoaXMgLSBtYXliZSBpdCBzaG91bGQgZ28gaW50bwotCWxpYmliZXJ0eSA/Ci0JKiBsZGdyYW0ueTogbm93IC1WIGFuZCAtdiBoYXZlIGRpZmZlcmVudCBhY3Rpb25zCi0JKiBsZHZlci5jOiBpZiAtViwgcHJpbnRzIGxpc3Qgb2YgZW11bGF0aW9ucyBjb21waWxlZCBpbgotCSogbGRtaXNjLmM6IHN1cHBvcnQgZm9yIGNwbHVzIGRlbWFuZ2xpbmcKLQotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotVGh1IEZlYiAyMCAxNzo0Mzo0NiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgbWtzY3JpcHQgcnVsZSBpbnRvIG9uZSBmb3IgLi9ta3NjcmlwdAotCShmb3IgdGhlIHNha2Ugb2YgbWFrZXMgdGhhdCBkb24ndCByZWFsaXplIHRoZXkncmUgdGhlIHNhbWUpLgotCSogUE9SVElORzogIEFkZCBtb3JlIGRldGFpbHMuCi0JKiBnZW5zY3JpcHRzLnNoOiAgQWRkIG1vcmUgdGFpbG9yYWJpbGl0eSBvZiBEQVRBX0FMSUdOTUVOVC4KLQotTW9uIEZlYiAxNyAxMjowNDozNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFuZCBuZXcgZmlsZXMgaHAzMDBic2Quc2gsIGNvbmZpZy9taC1ocDMwMGJzZCwKLQljb25maWcvbXQtaHAzMDBic2Q6ICBOZXcgcG9ydCB0byBocDMwMCBydW5uaW5nIEJTRC4KLQotU2F0IEZlYiAxNSAxMzo1OTo1NCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCU1ham9yIHJld3JpdGUgb2YgaG93IGxkIGlzIGNvbmZpZ3VyZWQuICBUaGUgbWFqb3IgaWRlYQotCWlzIHRvIHVzZSBzaGVsbCBzY3JpcHRzIHRvIGdlbmVyYXRlIGV2ZXJ5dGhpbmcuCi0JKiBnZW5lcmljLmVtIHJlcGxhY2VzIGxkdGVtcGxhdGUuCi0JKiBPdGhlciAqLmVtIGZpbGVzIHJlcGxhY2UgdmFyaW91cyAqLmMgZmlsZXMuCi0JQSAqLmVtIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcKLQlsZF9fKi5jIGZpbGUgdGhhdCBpbXBsZW1lbnRzIGFuIGVtdWxhdGlvbi4gIFRoaXMgaXMgdXN1YWxseQotCWEgc3RyYWlnaHQgJ2NhdCcgb2YgYSBoZXJlLWRvY3VtZW50LCBwb3NzaWJseSB3aXRoIHN1YnN0aXR1dGlvbnMuCi0JKiBTY3JpcHQgZmlsZXMgKCouc2MpIGFyZSBwbGFjZXMgYnkgKi5zYy1zaCBzY3JpcHRzLgotCUFnYWluLCB0aGVzZSBhcmUgc2ltcGxlIHNoZWxsIHNjcmlwdHMgdGhhdCAnY2F0JwotCWhlcmUtZG9jdW1lbnRzLCB1c3VhbGx5IHdpdGggc29tZSBzdWJzdGl0dXRpb25zLgotCVRoZSBvdXRwdXQgYSAqLnNjLXNoIGlzIGEgc2NyaXB0IGZpbGUuCi0JKiBFYWNoIGVtdWxhdGlvbiBpcyBkZWZpbmVkIGJ5IGEgc2hvcnQgc2hlbGwgc2NyaXB0IHdpdGgKLQlleHRlbnNpb24gKi5zaCB0aGF0IHNwZWNpZmllcyB0aGUgZW11bGF0aW9uLXNwZWNpZmljCi0JcGFyYW1ldGVycyAoc3VjaCBhcyB0aGUgbmFtZSBvZiB0aGUgKi5zaC1zYyBhbmQgKi5lbQotCWZpbGVzIHRvIHVzZSkuCi0JKiBnZW5zY3JpcHQuc2ggaXMgdGhlIG1hc3RlciBzaGVsbCBzY3JpcHQgdXNlZCB0byBnZW5lcmF0ZQotCWFuIGVtdWxhdGlvbi4gIEl0IGlzIHBhc3NlZCB2YXJpb3VzIGFyZ3VtZW50LCBpbmNsdWRpbmcKLQl0aGUgbmFtZSBhIHRoZSBlbXVsYXRpb24tc3BlY2lpYyAqLnNoIGZpbGUgdGhhdCBpdAotCSJzb3VyY2VzIiB0byBzZXQgdmFyaWFibGVzIHRvIGVtdWxhdGlvbi1zcGVjaWZjIHBhcmFtZXRlcnMuCi0JKiBjb25maWcvbXQtZm9vOiAgQ2hhbmdlZCBFTVVMPUdMREZPT19FTVVMQVRJT05fTkFNRQotCXRvIEVNVUw9Zm9vLiAoVGhlIEdMREZPT19FTVVMQVRJT05fTkFNRXMgaGF2ZSBiZWUgcmVtb3ZlZC4pCi0JKiBjb25maWcvbWgtZm9vOiAgUmVuYW1lIExERU1VTEFUSU9OIG5hbWVzIGFzIGFwcHJvcHJpYXRlCi0JKHVzdWFsbHkgJ2dsZGZvbycgLT4gcGxhaW4gJ2ZvbycpLgotCSogbGR3cml0ZS5jOiAgRml4ZWQgYSB0eXBvIGluIGEgY29tbWVudC4KLQkqIE1ha2VmaWxlLmluOiAgTWFqb3IgY2hhbmdlcy4gIFJlbW92ZWQgc29tZSB0aGUgc2VkCi0JbWFnaWMgdG8gY29udmVydHMgc2NyaXB0cywgc2luY2UgdGhhdCBpcyBub3cgaGFuZGxlZAotCWJ5IGdlbnNjcmlwdHMuc2ggYW5kIHRoZSAqLnNjLXNoIHNjaXB0IGdlbmVyYXRvcnMuCi0JKiBjb25maWcuaDogIFJlbW92ZSBhIGJ1bmNoIG9mIG1hY3JvcyBkZWZpbmluZyBlbXVsYXRpb25zCi0JYW5kIHRhcmdldHMuICBUaGlzIGJlY29tZXMgb25lIGxlc3MgZmlsZSB0byBlZGl0IHdoZW4KLQlhZGRpbmcgZW11bGF0aW9ucyBvciB0YXJnZXRzLgotCSogbGRlbXVsLmggKHN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiAgQWRkCi0JZW11bGF0aW9uX25hbWUgYW5kIHRhcmdldF9uYW1lIGZpZWxkcy4KLQkqIGxkZW11bC5jLCBsZGVtdWwuaDogIERlZmluZSBzb21lIGRlZmF1bHQgZnVuY3Rpb25zIHVzZWQKLQlieSBtb3N0IGVtdWxhdGlvbnMgKGFuZCByZW1vdmUgZnJvbSB0aGUgKi5lbSBzY3JpcHRzKS4KLQkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX3RhcmdldCk6ICBTZWFyY2ggdGhlIG5ldwotCWxkX2VtdWxhdGlvbnMgYXJyYXkgdXNpbmcgYSBsb29wIChpbnN0ZWFkIG9mIGEgaGFyZHdpcmVkCi0JbmVzdGVkIGlmIHN0YXRlbWVudCkuCi0JRGVmaW5lIHRoZSBsZF9lbXVsYXRpb24gZnJvbSB0aGUgYXV0b21hdGljYWxseS1nZWVucmF0ZWQKLQlsZGVtdWwtbGlzdC5oLiAgVGhpcyBtZWFucyB5b3Ugbm8gbG9uZ2VyIGhhdmUgdG8gZWRpdCBsZGVtdWwuYwotCXRvIGFkZCBhIG5ldyBlbXVsYXRpb24uCi0JKiBsZG1haW4uYzogIFJlcGxhY2Uge0dMRCxMTkt9OTYwX0VNVUxBVElPTl9OQU1FIGJ5Ci0JdGhlaXIgZXhwYW5zaW9ucywgc2luY2UgdGhlIGZvcm1lciBubyBsb25nZXIgZXhpc3QuCi0JKiBQT1JUSU5HOiAgQSB2ZXJ5IHJvdWdoIGZpcnN0IGRyYWZ0IG9mIGEgcG9ydGluZyBndWlkZS4KLQotCSogbGRncmFtLnksIGxkbGV4LmwsIGxleHN1cC5jOiBDaGFuZ2VzIHRvIGFsbG93IGFuIGFzc2lnbm1lbnQKLQl0byBiZSB0ZXJtaW5hdGVkIGJ5IGEgbmV3LWxpbmUgKGluc3RlYWQgb2YgcmVxdWlyaW5nIGEgc2VtaWNvbG9uKS4KLQotTW9uIEZlYiAxMCAxNjoyMTowMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYywgbGRsYW5nLmM6IGFkZGVkIG5ldyBpZGVhICJhYnNfb3V0cHV0X3NlY3Rpb24iLCByZW1vdmVzCi0JdGVzdHMgZm9yIE5VTEwgcG9pbnRlcnMgYWxsIG92ZXIgdGhlIHBsYWNlLgotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IHJlbWVtYmVyIHRvIHJlbG9jYXRlIGdsb2JhbCBzeW1ib2xzCi0JKmFmdGVyKiByZWxheGluZyBoYXMgZG9uZSBpdCBzdHVmZi4KLQotVGh1IEZlYiAgNiAxMTo0MDoxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LWNvZmYtaDgzMDA6IHVzZSBFTVVMIGxpa2UgZXZlcnl0aGluZyBlbHNlCi0JKiBsZGxhbmcuYzogKHByaW50X3BhZGRpbmdfc3RhdGVtZW50KTogcHJpbnQgdGhlIHJpZ2h0IGFkZHJlc3MuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmgsIGxkZW11bC5jOiByZW5hbWVkICBoODMwMGhkcyB0byBoODMwMGhtcwotCi0KLVR1ZSBGZWIgIDQgMTU6Mjg6MDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IFB1dCBwYWNrIC1ub2luaGliaXQtZXhlYyBhbmQgLXNvcnQtY29tbW9uCi0JKiBsZGxhbmcuYyAocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBwcmludCB0aGUgcmlnaHQgYWRkcmVzcy4KLQotVGh1IEphbiAzMCAxNzo1MTo1MyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBUaGUgcnVsZSBmb3IgdGVzdGluZyBsZCBieSByZS1saW5raW5nIGl0c2VsZgotCXZpYSBhbiBpbnRlcm1lZGlhdGUgLXIgbGluayB3YXMgbW92ZWQgdG8gdGhlIGxkMSBydWxlCi0JaW5zdGVhZCBvZiB0aGUgbGQyIHJ1bGUuICBUaGlzIGFsbG93cyBsZDIgYW5kIGxkMyB0byBiZSBpZGVudGljYWwsCi0Jd2hpY2ggYWxsb3dzIHRoZSBib290c3RyYXAgcnVsZSB0byB3b3JrLgotCSogbGRjdG9yLmMgKGZpbmRfY29uc3RydWN0b3JzKTogIERvbid0IGNyZWF0ZSBhIGNvbnN0cnVjdG9yCi0JbGlzdCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQgKGFzIHdvdWxkIGhhcHBlbiBpZiBsZCBpcwotCWludm9rZWQgYnkgY29sbGVjdCkuCi0KLVdlZCBKYW4gMjkgMDg6MzU6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zcGFyYy5oOiBub3cgdXNlcyBsaWJnY2MuYQotCSogbGRtYWluLmM6IHF1aXQgdXNpbmcgZXhpdAotCSogKnNjOiB1c2UgKihDT01NT04pIHJhdGhlciB0aGFuIFtDT01NT05dCi0JKiBsZGxleC5sLCBsZXhzdXAuYzogbXVjaCB0aGlua2luZyBtb3ZlZCBmcm9tIC5sIGFuZCBwdXQgaW50byAuYywKLQl0byBhbGxvdyBwcmVwcm9jZXNzaW5nIG9mIC5sIGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogTmV3IGxkbGV4LmwgbWFuZ2xpbmcKLQkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogcGVyZm9ybSBleHByZXNzaW9ucyB3aXRoICUgYW5kIC8gaW4KLQlpbnRlZ2VyLgotCSogbGRmaWxlLmMgKG9wZW5fYSk6IG9wZW4gYXJjaGl2ZXMgb24gVk1TIGluIGEgc3BlY2lhbCB3YXkKLQotCi1UdWUgSmFuIDI4IDEwOjE4OjE2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogbWFwIC1NIGJlaGF2ZSBpbiB0aGUgc2FtZSB3YXkgYXMgLU1hcCAoc2V0cyBmaWxlIG5hbWUKLQl0byBiZSAiLSIuCi0JKiBsZHN5bS5jLCBsZGxhbmcuYzogcmVtZW1iZXIgdGhhdCBzaXplIG9mIGEgc2VjdGlvbiBpcyBkZXBlbmRlbnQgb24KLQl3aGV0aGVyIG9yIG5vdCByZWxheGluZyBoYXMgYmVlbiBkb25lLgotCSogbGRtYWluLmM6IGRvbid0IG9wZW4gYSBtYXAgZmlsZSBpZiBpdCBkb2Vzbid0IGhhdmUgYSBuYW1lCi0JKiByZWxheC5jOiBhbGwgdGhlIGJyYWlucyBoYXZlIG1vdmVkIGludG8gYmZkLgotCSogbGR3cml0ZS5jOiBhbW1lbmQgY29tbWVudAotCi1GcmkgSmFuIDI0IDE0OjIzOjQ2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgcmVsYXgsIGFsc28gbWFkZSB0aHJlZSBzdGFnZSBnbyB0aHJvdWdoIGEKLQlwYXJ0aWFsIGxpbmsgc3RhZ2UuCi0JKiByZWxheC5jIDogYWRkZWQKLQkqIGNvbmZpZy5oOiBpZiBHTlU5NjAgZGVmaW5lZCwgdGhlbiBkZWZhdWx0IGVtdWxhdGlvbiBtb2RlIGlzCi0JR0xEOTYwCi0JKiBsZGV4cC5oLCBsZGV4cC5jOiBtYXAgdG8gZmlsZSBob29rcwotCSogbGRsYW5nLmM6IG1hcCB0byBmaWxlIGhvb2tzCi0JKiBsZGdyYW0ueTogYWRkZWQgLU1hcCAtcmVsYXgKLQkqIGxkbGV4Lmw6IGFkZGVkIC1yZWxheCwgLU1hcAotCSogbGRtYWluLmM6IG9wZW4gbWFwIGZpbGUKLQkqIGxkbWlzYy5jOiBzdXBwb3J0IGZvciBtYXAgZmlsZQotCSogbGR3cml0ZS5jOiBuZXcgcmVsYXggbWFnaWMKLQotVGh1IERlYyAxOSAxODo0OTo1MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy90bS0qLmg6ICBDbGVhbiB1cCBtYWtlIG91dHB1dCwgb25seQotCXBhc3MgREVGQVVMVF9FTVVMQVRJT04gdG8gbGRtYWluLmMuCi0KLVdlZCBEZWMgMTggMTU6MDI6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBCdW1wIHRvIHZlcnNpb24gMS45NC4KLQotVHVlIERlYyAxMCAwNDowNzoyMyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotTW9uIERlYyAgOSAxNjoyNjo0MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBQYXNzIC15IHRvIGJpc29uLiAgKEFnYWluOwotCWFjY2lkZW50YWxseSBkZWxldGVkIGJ5IFJpY2guKQotCSogbmV3cy5zYywgbGRnbGQ2OGsuc2M6ICBEZWZpbmUgX19lbmQgYXMgd2VsbCBhcyBfZW5kLgotCi1TYXQgRGVjICA3IDE3OjE5OjI2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGluZHIuaDogYWRkZWQgdG8gY29udGFpbiBwcm90b3R5cGVzIG9mIGxkaW5kci5jCi0JKiBsZGZpbGUuYzogaW5jbHVkZSBjdHlwZS5oCi0JKiBsZG1haW4uYzogaW5jbHVkZSB0aGUgcmVxdXJpZWQgcHJvdG90eXBlIGhlYWRlcnMKLQkqIGxkd3JpdGUuYzogZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGhhcyBiZWVuIHJlbmFtZWQKLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0KLUZyaSBEZWMgIDYgMjM6Mjk6MjYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcHVudCAiZnVuZGFtZW50YWwiIG1vZGUgYmVjYXVzZSBpdCBicmVha3MgbXkgZW1hY3MKLQkgIG1hY3Jvcy4gIGluc3RhbGwgdXNpbmcgSU5TVEFMTF9QUk9HUkFNIGFuZCBJTlNUQUxMX0RBVEEuICByZW1vdmUKLQkgIHNwYWNlcyBmb2xsb3dpbmcgaHlwaGVucywgYnNkIG1ha2UgY2FuJ3QgY29wZS4gIGFkZGVkCi0JICBzdGFuZGFyZHMudGV4dCBzdXBwb3J0IGFuZCBtYWRlIGl0IGxvb2sgbGlrZSBhbGwgdGhlIG90aGVyCi0JICBtYWtlZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJlIG5vdyBydW5zIGVudGlyZWx5IGluIG9iamRpciBzbyBtYWtlIGZpbGUKLQkgIGV4aXN0ZW5jZSBjaGVja3MgYWdhaW5zdCAke3NyY2Rpcn0uICBNYXJrIHRoaXMgZGlyZWN0b3J5IGFzCi0JICB0YXJnZXQgZGVwZW5kZW50LgotCi1UaHUgRGVjICA1IDIyOjQ2OjE2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotV2VkIERlYyAgNCAyMzozNjo1NSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuOTMuCi0JKiBNYWtlZmlsZS5pbjogIFBhc3MgLXkgdG8gYmlzb24uCi0KLU1vbiBOb3YgMjUgMTg6Mjg6NDAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmg6IGg4IGlzIG5vdyBjb2ZmLCBub3QgaWVlZQotCSogaDgzMDBoZHMuc2M6IHJlZmxlY3QgdGhlIHNhbWUKLQotVGh1IE5vdiAxNCAxOTo1NTowOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKCkpOiAgVXBkYXRlIHRvIDEuOTIuCi0JKiBsZGN0b3IuYzogVGhlcmUgYXJlIHR3byBwbGFjZXMgY29uc3RydWN0b3Igc2V0cwotCWNhbiBiZSBkZWZpbmVkLiAgT25lIG9mIHRoZW0gY2hlY2tlZCBmb3IgYW4gZXhpc3RpbmcKLQlkdXBsaWNhdGUsIHRoZSBvdGhlciBkaWRuJ3QuICBVbmZvcnR1bmF0ZWx5LCB0aGUgbGF0dGVyCi0Jd2FzIGNhbGxlZCBhZnRlciB0aGUgZm9ybWVyIC4uLgotCVNvLCBmYWN0b3Igb3V0IGNvZGUgZm9yIGluc2VydGluZyBhIG5ldyBlbGVtZW50IGludG8KLQljb25zdHJ1Y3Rvcl9uYW1lX2xpc3QgKGFmdGVyIGNoZWNraW5nIGZvciBhIGR1cGxpY2F0ZSkKLQlpbnRvIGEgbmV3IGZ1bmN0aW9uIGFkZF9jb25zdHJ1Y3Rvcl9uYW1lLCBhbmQgY2FsbAotCWl0IGZyb20gYm90aCBhZm9yZW1lbnRpb25lZCBwbGFjZXMgKGxkbGFuZ19hZGRfY29uc3RydWN0b3IKLQlhbmQgbGRsYW5nX2NoZWNrX2Zvcl9jb25zdHJ1Y3RvcnMpLgotCi1XZWQgTm92IDEzIDE1OjE3OjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlbmFtZSAuYyBmaWxlcyBnZW5lcmF0ZWQgZnJvbSBsZHRlbXBsYXRlCi0JdG8gaGF2ZSBuYW1lcyBzdGFydGluZyB3aXRoIGxkX18uICBUaGlzIGhlbHBzICdtYWtlIGNsZWFuJy4KLQotVHVlIE5vdiAxMiAxODozNjo1MCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVGFrZSBvdXQgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBpbnN0YWxsCi0JKiBtODhrYmNzLnNjOiBwdXQgaW4gY29udHJ1Y3RvciBibG9ja3MuCi0KLU1vbiBOb3YgMTEgMTg6NDc6MzMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jLCBsZG1pc2MuaDogIFJlLXdyaXRlIGluZm8oKSB0byB0YWtlIGEgZmlsZW5hbWUKLQlwYXJhbWV0ZXIsIGEgZm9ybWF0LCBhbmQgYW4gYXJnIHBvaW50ZXIsIGFuZCByZW5hbWUgaXQgdG8KLQl2ZmluZm8oKS4gIFdyaXRlIGluZm8oKSBpbiB0ZXJtcyBvZiBuZXcgdmZpbmZvKCkuCi0JTmV3IGVpbmZvKCkgaXMgdGhlIHNhbWUgYXMgaW5mbygpLCBleGNlcHQgaXQgd3JpdGVzIHRvIHN0ZGVyci4KLQkqIGxkZW11bC5jLCBsZGV4cC5jLCBsZGxhbmcuYywgbGRsbms5NjAuYywgbGRtYWluLmMsIGxkd3JpdGUuYywKLQlsZG1pc2MuYzogIFJlcGxhY2UgImVycm9yIiBjYWxscyB0byBpbmZvKCkgYnkgbmV3IGVpbmZvKCkuCi0KLU1vbiBOb3YgMTEgMDk6NTc6MzIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBsZGxleC5sIGxkZ3JhbS55OiBtYWRlIC1WIG9wdGlvbiBkbyBzYW1lIGFzIC12Ci0JKiBNYWtlZmlsZS5pbjogQWRkZWQgJChNSU5VU19HKSBmbGFnIHNvIGRlYnVnZ2luZyBjYW4gYmUKLQl0dXJuZWQgb2ZmCi0KLVN1biBOb3YgIDMgMTY6Mzc6MzcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCSBpMzg2IGFvdXQgY2hhbmdlcyBmcm9tIEJvYiBLdWt1cmEKLQkqIE1ha2VmaWxlLmluLCBjb25maWcuaDogYWRkZWQgaTM4NmFvdXQgc3VwcG9ydAotCSogY29uZmlndXJlLmluOiBmaXhlZCAvaC17bXlob3N0fSB0eXBvCi0JKiBsZGdyYW0ueTogLU1NIG5vdyBnaXZlcyBtb3JlIGJvcmluZyBtYXAuCi0JKiBsZGxhbmcuYzogbm93IGRvZXMgRF9QQUdFRCBmbGFnIHRoZSByaWdodCB3YXkuCi0JKiBsZHN5bS5jOiAtTU0gZmxhZ3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCi0KLVN1biBOb3YgIDMgMTU6MDA6MDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEZpeGVkIHR5cG8uICBBbHNvLCBhIGZpeCBmb3IgaHAzMDBic2QuCi0JKiBsZGxhbmcuYyAoaW5pdF9vcyk6ICBDb21wZW5zYXRlIGZvciBCRkQgY2hhbmdlLAotCXdoZXJlIGJmZF9tYWtlX3NlY3Rpb24gbm93IHJldHVybnMgTlVMTCBmb3IgYSBkdXBsaWNhdGUKLQlzZWN0aW9uIHJlcXVlc3QsIGluc3RlYWQgb2YgdGhlIG9sZCBzZWN0aW9uLgotCi1UaHUgT2N0IDE3IDE1OjI3OjEzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiBCdW1wIHRvIHZlcnNpb24gMS45MSAoY29uc2lzdGVudCB3aXRoIGJpbnV0aWxzKS4KLQotV2VkIE9jdCAxNiAxMjoyNzowOCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oLCBsZC5oLCBsZGVtdWwuYywgbGRleHAuYywgbGRleHAuaCwKLQlsZGdyYW0ueSwgbGRsZXgubCwgbGRsbms5NjAuYywgbGRtYWluLmMsIGxkbWlzYy5jLCBsZG1pc2MuaCwKLQlsZHN5bS5jLCBsZHN5bS5oLCBsZHRlbXBsYXRlLCBsZHZhbmlsbGEuYywgbGR2ZXIuYywgbGR2ZXIuaCwKLQlsZHdhcm4uYywgbGR3YXJuLmgsIGxkd3JpdGUuYywgbGR3cml0ZS5oLCBta3NjcmlwdC5jOgotCUFkZCBvciB1cGRhdGUgY29weXJpZ2h0IG5vdGljZXMuCi0KLU1vbiBPY3QgMTQgMjM6NTU6MjcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZWQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBuYW1lIHNjaGVtZQotCXRvIGJlIGNvbnNpc3RlbnQgd2l0aCBnY2MuICBBbHNvIGNoYW5nZWQgJ2luc3RhbGwnLgotCi1Nb24gT2N0IDE0IDE3OjMwOjAyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBuZXcgdGFyZ2V0cyBsZC5tbSwgbGQubWUKLQotTW9uIE9jdCAxNCAxNzoyNzoyNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGxkdGVtcGxhdGU6ICBOZWVkIHRvIHVzZSBzZXBhcmF0ZSBzY3JpcHRzCi0JZm9yIC1uIGFuZCAtTiBvcHRpb25zLiAgWWV0IG1vcmUgY29tcGxpY2F0aW9uLgotCi1GcmkgT2N0IDExIDIyOjQwOjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIHVzaW5nICQ8IGluIGV4cGxpY2l0IE1ha2UgcnVsZXMgKGl0IGRvZXNuJ3QKLQl3b3JrKS4gIEFkZCBzb21lIGxpbmVzIHRvIGF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Z3MuCi0KLUZyaSBPY3QgMTEgMTY6NDI6MjIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIG5ld3Muc2M6IEFkZCBhbGlnbm1lbnQgZm9yIGRhdGEgc2VnbWVudC4KLQkqIGxkdGVtcGxhdGU6IEFkZCAoeWV0IGFub3RoZXIpIHNjcmlwdCB0byBnZXQgZm9yIC1uIG9yIC1OCi0Jb3B0aW9ucy4gIChUaGVzZSBuZWVkIGRpZmZlcmVudCBhbGlnbm1lbnQgdGhhbiBaTUFHSUMgZmlsZXMuKQotCSogTWFrZWZpbGUuaW46ICBBZGQgc3R1ZmYgZm9yIG5ldyBmb28ueG4gc2NyaXB0cy4KLQlUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IHJlcGxhY2luZyAiQUxJR04oMHguLi4wMCkiIGJ5ICIuIi4KLQotRnJpIE9jdCAxMSAxNTo0MzowNCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgbGQubXMsIGxkLWluZGV4Lm1zCi0JbGQudGV4aW5mbzogcmVtb3ZlIHRhYnMsIG90aGVyIGNsZWFudXBzIGZvciB0ZXhpMnJvZmYKLQotRnJpIE9jdCAxMSAxMzo1MTo1NCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBNYWtlIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgYmUgdHJ1ZQotCWJ5IGRlZmF1bHQuICBEb24ndCB0aGUgV1BfVEVYVCBhbmQgRF9QQUdFRCBmbGFncyBvZgotCW91dHB1dF9iZmQgaGVyZTsgaXQncyB0b28gbGF0ZSwgc28gc2V0IGl0IHdoZW4gb3V0cHV0X2JmZAotCWlzIGNyZWF0ZWQgKGluIGxkbGFuZy5jKS4gIEFsc28gZml4IHNldHRpbmcgb2YgRVhFQ19QIGZsYWcKLQkqIGxkbGFuZy5jIChsZGxhbmdfb3Blbl9vdXRwdXQpOiAgU2V0IG91dHB1dF9iZmQtPmZsYWdzIGhlcmUuCi0JKiBsZGxhbmcuYzogUmVtb3ZlIHNvbWUgZHVwbGljYXRlIGV4dGVybiBkZWNsYXJhdGlvbnMuCi0JKiBsZGdyYW0ueTogRml4ZXMgdG8gLU4gYW5kIC1uIG9wdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogIFJlY29nbml6ZSB1cHBlciBjYXNlIGxldHRlcnMgaW4gc2VkIHNjcmlwdAotCXRvIHJlbW92ZSBhc3NpZ25tZW50cyBmcm9tIHNjcmlwdCBmaWxlcy4KLQkqIGxkdGVtcGxhdGU6ICBEb24ndCBhc3N1a21lIHRoYXQgLU4gb3IgLW4gb3B0aW9ucwotCWltcGx5IHVzZSBvZiAtciBzY3JpcHQuCi0JKiBta3NjcmlwdC5jOiAgVHdlYWtpbmcgdG8gY29ycmVjdGx5IGhhbmRsZSBcbiBhbmQgXFwgaW4gaW5wdXQuCi0KLUZyaSBPY3QgMTEgMTA6Mjk6MjcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBsZHRlbXBsYXRlOiBpbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaC4KLQotRnJpIE9jdCAxMSAwNDoyNDo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KLQotCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIC4uL2JmZC9ob3N0cy9oLXh4eC5oLgotCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgotCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCi0JZ2V0IGRlZmluZWQgZmlyc3QuCi0JKiBjb25maWcvOiAgUmVuYW1lIHNvbWUgY29uZmlnIGZpbGVzIHRvIG1hdGNoIHVwIGgtKi5oIG5hbWVzLgotCVJlbW92ZSBhbGwgdGhlIEhPU1RfU1lTIGRlZmluaXRpb25zIGZyb20gdGhlIGNvbmZpZyBmaWxlcy4KLQotVHVlIE9jdCAgOCAxNjowMDo1NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGRleHAuaCwgbGRsYW5nLmg6IENoYW5nZSBlbnVtIGJvb2xlYW4gLT4gZW51bSBiZmRfYm9vbGVhbi4KLQkqIGxkdGVtcGxhdGU6IFJlbW92ZSBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCBjYWxsczsKLQlqdXN0IHVzZSB0aGUgU0VBUkNIX0RJUiBjb21tYW5kcyBpbiB0aGUgc2NyaXB0IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IEFkZCBMSUJfUEFUSCBtYWNybywgd2hpY2ggaWYgc2V0IGlzIHVzZWQgdG8gcmVwbGFjZQotCXRoZSBTRUFSQ0hfRElSIGNvbW1hbmRzIGluIHRoZSBzY3JpcHRzICh1c2luZyB1Z2x5IHNlZCBtYWdpYykuCi0JVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgZm9yIGNyb3NzLWxpbmtpbmcsIHdoZXJlIHlvdSB3b3VsZAotCXBsYWNlIGxpYmFyaWVzIGluIGEgZGlmZmVyZW50IHBsYWNlIHRoYW4gbmF0aXZlIGxpYnJhcmllcy4KLQlBbHNvLCBlbXVsYXRpb25zIG1hZGUgZnJvbSBsZHRlbXBsYXRlIG5vdyB1c2UgJChzcmNkaXIpLgotCSogbGRnbGRhMjlrLnNjOiAgQ2hhbmdlIFNFQVJDSF9ESVIgY29tbWFuZHMgdG8gYSBjb252ZW50aW9uYWwKLQlmb3JtOyBwZW9wbGUgY2FuIHVzZSB0aGUgTWFrZWZpbGUncyBMSUJfUEFUSCB0byBvdmVycmlkZS4KLQotVHVlIE9jdCAgOCAxNDo1MToyMSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IHRhcmdldCBsZC5kdmksIGFkZCB0YXJnZXQgbGQuaW5mbwotCWxkLnRleGluZm86IG1ha2UgaW5mbyBmaWxlbmFtZSBsZC5pbmZvCi0KLUZyaSBPY3QgIDQgMjE6NTE6NTggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgdXNpbmcgJDwgaW4gbm9uLXN1ZmZpeCBydWxlcyAoYnJlYWtzIG9uIFN1bgotCU1ha2UpLgotCSogbGRmaWxlLmMsIGxkbGFuZy5jLCBsZG1haW4uYywgbGR3cml0ZS5jOiAgQ29wZSB3aXRoIHJlbmFtZXMgb2YgYQotCWZldyBCRkQgdHlwZXMgJiBlbnVtcy4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvbGQvTWFrZWZpbGUuYW0gYi9sZC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0ZWVjMy4uMDAwMDAwMAotLS0gYS9sZC9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDg3NSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLSMjIEZJWE1FOiB3b3JrIGFyb3VuZCBhcHBhcmVudCBhdXRvbWFrZSBidWcuCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgV2UgcHV0IHRoZSBzY3JpcHRzIGluIHRoZSBkaXJlY3RvcnkgJChzY3JpcHRkaXIpL2xkc2NyaXB0cy4KLSMgV2UgY2FuJ3QgcHV0IHRoZSBzY3JpcHRzIGluICQoZGF0YWRpcikgYmVjYXVzZSB0aGUgU0VBUkNIX0RJUgotIyBkaXJlY3RpdmVzIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZvciBuYXRpdmUgYW5kIGNyb3NzIGxpbmtlcnMuCi1zY3JpcHRkaXIgPSAkKHRvb2xkaXIpL2xpYgotCi1FTVVMID0gQEVNVUxACi1FTVVMQVRJT05fT0ZJTEVTID0gQEVNVUxBVElPTl9PRklMRVNACi1FTVVMX0VYVFJBX09GSUxFUyA9IEBFTVVMX0VYVFJBX09GSUxFU0AKLQotIyBTZWFyY2ggcGF0aCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgLWxmb28gbGlicmFyaWVzLgotIyBJZiBMSUJfUEFUSCBpcyBlbXB0eSwgdGhlIG9uZXMgaW4gdGhlIHNjcmlwdCAoaWYgYW55KSBhcmUgbGVmdCBhbG9uZS4KLSMgKFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiwgdW5sZXNzIGJ1aWxkaW5nCi0jIGEgY3Jvc3MtbGlua2VyLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGlzIGVtcHR5LiAgU2VlIGdlbnNjcmlwdHMuc2guKQotIyBPdGhlcndpc2UsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9uZXMgZ2l2ZW4gaW4gTElCX1BBVEgsCi0jIHdoaWNoIG1heSBoYXZlIHRoZSBmb3JtOiBMSUJfUEFUSD0vbGliOi91c3IvbG9jYWwvbGliCi1MSUJfUEFUSCA9Ci0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIJPSAkKEJBU0VESVIpL2luY2x1ZGUKLURFUCA9IG1rZGVwCi0KLSMgV2hhdCB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgdG8gYnVpbGQKLURPQ1ZFUiA9IGdlbgotCi0jc3R1ZmYgZm9yIHNlbGYgaG9zdGluZyAoY2FuIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlnIGZpbGUpLgotSE9TVElOR19DUlQwID0gQEhPU1RJTkdfQ1JUMEAKLUhPU1RJTkdfTElCUyA9IEBIT1NUSU5HX0xJQlNACi1IT1NUSU5HX0VNVSA9IC1tICQoRU1VTCkKLQotIyBTZXR1cCB0aGUgdGVzdGluZyBmcmFtZXdvcmssIGlmIHlvdSBoYXZlIG9uZQotRVhQRUNUID0gYGlmIFsgLWYgJCRyLy4uL2V4cGVjdC9leHBlY3QgXSA7IFwKLQl0aGVuIGVjaG8gJCRyLy4uL2V4cGVjdC9leHBlY3QgOyBcCi0JZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLQllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAotCi1SVU5URVNURkxBR1MgPQotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1DWFggPSBnY2MKLUNYWF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ1hYKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotbm9pbnN0X1BST0dSQU1TID0gbGQtbmV3Ci1pbmZvX1RFWElORk9TID0gbGQudGV4aW5mbwotbm9pbnN0X1RFWElORk9TID0gbGRpbnQudGV4aW5mbwotbWFuX01BTlMgPSBsZC4xCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgLUkkKHRvcF9zcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsICQoSERFRklORVMpICQoQ0ZMQUdTKSAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLUJGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKLUxJQklCRVJUWSA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi1BTExfRU1VTEFUSU9OUyA9IFwKLQllYTI5ay5vIFwKLQllYWl4cHBjLm8gXAotCWVhaXhyczYubyBcCi0JZWFscGhhLm8gXAotCWVhcmNlbGYubyBcCi0JZWFybWVsZi5vIFwKLQllYXJtZWxmX29hYmkubyBcCi0JZWFybWVsZl9saW51eC5vIFwKLQllYXJtZWxmX2xpbnV4MjYubyBcCi0JZWFybWFvdXRiLm8gXAotCWVhcm1hb3V0bC5vIFwKLQllYXJtY29mZi5vIFwKLQllYXJtcGUubyBcCi0JZWNvZmZfc3BhcmMubyBcCi0JZWQxMHZlbGYubyBcCi0JZWQzMHZlbGYubyBcCi0JZWQzMHZfZS5vIFwKLQllZDMwdl9vLm8gXAotCWVkZWx0YTY4Lm8gXAotCWVlYm1vbjI5ay5vIFwKLQllZWxmMzJfc3BhcmMubyBcCi0JZWVsZjMyX2k5NjAubyBcCi0JZWVsZjMyYjQzMDAubyBcCi0JZWVsZjMyYm1pcC5vIFwKLQllZWxmMzJlYm1pcC5vIFwKLQllZWxmMzJlbG1pcC5vIFwKLQllZWxmMzJibWlwbjMyLm8gXAotCWVlbGYzMmw0MzAwLm8gXAotCWVlbGYzMmxtaXAubyBcCi0JZWVsZjMybHBwYy5vIFwKLQllZWxmMzJwcGMubyBcCi0JZWVsZjMycHBjbGludXgubyBcCi0JZWVsZl9pMzg2Lm8gXAotCWVlbGZfaTM4Nl9iZS5vIFwKLQllZ2xkOTYwLm8gXAotCWVnbGQ5NjBjb2ZmLm8gXAotCWVlbGYzMmZyMzAubyBcCi0JZWVsZjMybWNvcmUubyBcCi0JZWdvMzIubyBcCi0JZWg4MzAwLm8gXAotCWVoODMwMGgubyBcCi0JZWg4MzAwcy5vIFwKLQllaDg1MDAubyBcCi0JZWg4NTAwYi5vIFwKLQllaDg1MDBjLm8gXAotCWVoODUwMG0ubyBcCi0JZWg4NTAwcy5vIFwKLQllaHAzMDBic2QubyBcCi0JZWhwM2hwdXgubyBcCi0JZWhwcGFlbGYubyBcCi0JZWkzODZhb3V0Lm8gXAotCWVpMzg2YmVvcy5vIFwKLQllaTM4NmJzZC5vIFwKLQllaTM4NmNvZmYubyBcCi0JZWkzODZnbzMyLm8gXAotCWVpMzg2bGludXgubyBcCi0JZWkzODZseW54Lm8gXAotCWVpMzg2bWFjaC5vIFwKLQllaTM4Nm1vc3MubyBcCi0JZWkzODZtc2Rvcy5vIFwKLQllaTM4Nm5ic2QubyBcCi0JZWkzODZudy5vIFwKLQllaTM4NnBlLm8gXAotCWVsbms5NjAubyBcCi0JZW02OGs0a25ic2QubyBcCi0JZW02OGthb3V0Lm8gXAotCWVtNjhrYXV4Lm8gXAotCWVtNjhrY29mZi5vIFwKLQllbTY4a2VsZi5vIFwKLQllbTY4a2xpbnV4Lm8gXAotCWVtNjhrbHlueC5vIFwKLQllbTY4a25ic2QubyBcCi0JZW02OGtwc29zLm8gXAotCWVtODhrYmNzLm8gXAotCWVtY29yZXBlLm8gXAotCWVtaXBzYmlnLm8gXAotCWVtaXBzYnNkLm8gXAotCWVtaXBzaWR0Lm8gXAotCWVtaXBzaWR0bC5vIFwKLQllbWlwc2xpdC5vIFwKLQllbWlwc2xuZXdzLm8gXAotCWVuZXdzLm8gXAotCWVuczMya25ic2QubyBcCi0JZXBjNTMybWFjaGEubyBcCi0JZXBwY21hY29zLm8gXAotCWVwcGNudy5vIFwKLQllcHBjcGUubyBcCi0JZXJpc2NpeC5vIFwKLQllc2EyOTIwMC5vIFwKLQllc2gubyBcCi0JZXNoZWxmLm8gXAotCWVzaGxlbGYubyBcCi0JZXNobC5vIFwKLQllc3BhcmNhb3V0Lm8gXAotCWVzcGFyY2xpbnV4Lm8gXAotCWVzcGFyY2x5bngubyBcCi0JZXNwYXJjbmJzZC5vIFwKLQllc3QyMDAwLm8gXAotCWVzdW4zLm8gXAotCWVzdW40Lm8gXAotCWV0aWMzMGFvdXQubyBcCi0JZXRpYzMwY29mZi5vIFwKLQlldGljODBjb2ZmLm8gXAotCWV2YW5pbGxhLm8gXAotCWV2YXgubyBcCi0JZXZzdGEubyBcCi0JZXc2NS5vIFwKLQllejgwMDEubyBcCi0JZXo4MDAyLm8KLQotQUxMXzY0X0VNVUxBVElPTlMgPSBcCi0JZWVsZjY0X3NwYXJjLm8gXAotCWVlbGY2NGFscGhhLm8KLQotQUxMX0VNVUxfRVhUUkFfT0ZJTEVTID0gXAotCXBlLWRsbC5vIFwKLQlkZWZmaWxlcC5vCi0KLUNGSUxFUyA9IGxkY3Rvci5jIGxkZW11bC5jIGxkZXhwLmMgbGRmaWxlLmMgbGRsYW5nLmMgXAotCWxkbWFpbi5jIGxkbWlzYy5jIGxkdmVyLmMgbGR3cml0ZS5jIGxleHN1cC5jIFwKLQltcmkuYyBsZGNyZWYuYyBwZS1kbGwuYwotCi1IRklMRVMgPSBsZC5oIGxkY3Rvci5oIGxkZW11bC5oIGxkZXhwLmggbGRmaWxlLmggXAotCWxkbGFuZy5oIGxkbGV4LmggbGRtYWluLmggbGRtaXNjLmggbGR2ZXIuaCBcCi0JbGR3cml0ZS5oIG1yaS5oIGRlZmZpbGUuaAotCi1HRU5FUkFURURfQ0ZJTEVTID0gbGRncmFtLmMgbGRsZXguYyBkZWZmaWxlcC5jCi1HRU5FUkFURURfSEZJTEVTID0gbGRncmFtLmggbGRlbXVsLWxpc3QuaCBkZWZmaWxlcC5oCi0KLU9GSUxFUyA9IGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gbGRtYWluLm8gXAotCWxkd3JpdGUubyBsZGV4cC5vICBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIFwKLQlsZGZpbGUubyBsZGNyZWYubyAke0VNVUxBVElPTl9PRklMRVN9ICR7RU1VTF9FWFRSQV9PRklMRVN9Ci0KLVNUQUdFU1RVRkYgPSAqLm8gbGRzY3JpcHRzLyogZSouYwotCi0jIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBqdXN0IGEgbGlzdCBvZiB0aG9zZSBlbXVsYXRpb24gdGVtcGxhdGUgZmlsZXMKLSMgdGhhdCBjb250YWluIGludGVybmF0aW9uYWxpc2VkIHN0cmluZ3MuCi1FTVVMQVRJT05fRklMRVMgPSBlbXVsdGVtcGwvcGUuZW0gZW11bHRlbXBsL2FybWNvZmYuZW0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChIRklMRVMpICQoRU1VTEFUSU9OX0ZJTEVTKQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1sZG1haW4ubzogbGRtYWluLmMgY29uZmlnLnN0YXR1cwotCSQoQ09NUElMRSkgLWMgLURERUZBVUxUX0VNVUxBVElPTj0nIiQoRU1VTCkiJyAtRFNDUklQVERJUj0nIiQoc2NyaXB0ZGlyKSInIC1EVEFSR0VUPSciQHRhcmdldEAiJyAkKHNyY2RpcikvbGRtYWluLmMKLQotbGRlbXVsLWxpc3QuaDogTWFrZWZpbGUKLQkoZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAgRE8gTk9UIEVESVQhICovIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gImV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkXyQke2Z9X2VtdWxhdGlvbjsiOyBcCi0JZG9uZTtcCi0JZWNobyAiIjtcCi0JZWNobyAiI2RlZmluZSBFTVVMQVRJT05fTElTVCBcXCI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICIgICZsZF8kJHtmfV9lbXVsYXRpb24sIFxcIjsgXAotCWRvbmU7XAotCWVjaG8gIiAgMCIpID5sZGVtdWwtdG1wLmgKLQltdiBsZGVtdWwtdG1wLmggbGRlbXVsLWxpc3QuaAotCi0jIFRoZXNlIGFsbCBzdGFydCB3aXRoIGUgc28gJ21ha2UgY2xlYW4nIGNhbiBmaW5kIHRoZW0uCi0KLUdFTlNDUklQVFMgPSAkKFNIRUxMKSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCAke3NyY2Rpcn0gJHtsaWJkaXJ9IEBob3N0QCBAdGFyZ2V0QCBAdGFyZ2V0X2FsaWFzQCAiQEVNVUxBVElPTl9MSUJQQVRIQCIgIkBOQVRJVkVfTElCX0RJUlNAIgotR0VOX0RFUEVORFMgPSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCAkKHNyY2RpcikvZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQKLUBURElSU0AKLQotZWEyOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYTI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYTI5ay5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYTI5ayAiJCh0ZGlyX2EyOWspIgotZWFpeHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhwcGMgIiQodGRpcl9haXhwcGMpIgotZWFpeHJzNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhyczYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhyczYgIiQodGRpcl9haXhyczYpIgotZWFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FscGhhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hbHBoYS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWxwaGEgIiQodGRpcl9hbHBoYSkiCi1lYXJjZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FyY2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcmNlbGYgIiQodGRpcl9hcmNlbGYpIgotZWFybWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGYgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9vYWJpLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfb2FiaSAiJCh0ZGlyX2FybWVsZikiCi1lYXJtZWxmX2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eCAiJCh0ZGlyX2FybWVsZl9saW51eCkiCi1lYXJtZWxmX2xpbnV4MjYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXgyNiAiJCh0ZGlyX2FybWVsZl9saW51eDI2KSIKLWVhcm1hb3V0Yi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtYW91dGIgIiQodGRpcl9hcm1hb3V0YikiCi1lYXJtYW91dGwuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRsICIkKHRkaXJfYXJtYW91dGwpIgotZWFybWNvZmYuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtY29mZiAiJCh0ZGlyX2FybWNvZmYpIgotZWFybXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybXBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybXBlICIkKHRkaXJfYXJtcGUpIgotZWNvZmZfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBjb2ZmX3NwYXJjICIkKHRkaXJfY29mZl9zcGFyYykiCi1lZDEwdmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMTB2ZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMTB2ZWxmICIkKHRkaXJfZDEwdikiCi1lZDMwdmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2ZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2ZWxmICIkKHRkaXJfZDMwdikiCi1lZDMwdl9vLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZfby5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdl9vICIkKHRkaXJfZDMwdikiCi1lZDMwdl9lLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZfZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdl9lICIkKHRkaXJfZDMwdikiCi1lZGVsdGE2OC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kZWx0YTY4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkZWx0YTY4ICIkKHRkaXJfZGVsdGE2OCkiCi1lZWJtb24yOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWJtb24yOWsuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlYm1vbjI5ayAiJCh0ZGlyX2VibW9uMjlrKSIKLWVlbGYzMmZyMzAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmZyMzAgIiQodGRpcl9mcjMwKSIKLWVlbGYzMm1jb3JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybWNvcmUgIiQodGRpcl9tY29yZSkiCi1lbTMycmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tMzJyZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG0zMnJlbGYgIiQodGRpcl9tMzJyKSIKLWVlbGYzMl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJfc3BhcmMgIiQodGRpcl9lbGYzMl9zcGFyYykiCi1lZWxmMzJfaTk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMl9pOTYwICIkKHRkaXJfZWxmMzJfaTk2MCkiCi1lZWxmMzJiNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmI0MzAwICIkKHRkaXJfZWxmMzJiNDMwMCkiCi1lZWxmMzJibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJibWlwICIkKHRkaXJfZWxmMzJibWlwKSIKLWVlbGYzMmJzbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYnNtaXAgIiQodGRpcl9lbGYzMmJzbWlwKSIKLWVlbGYzMmVibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZWJtaXAgIiQodGRpcl9lbGYzMmVibWlwKSIKLWVlbGYzMmVsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZWxtaXAgIiQodGRpcl9lbGYzMmVsbWlwKSIKLWVlbGYzMmJtaXBuMzIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJtaXBuMzIgIiQodGRpcl9lbGYzMmJtaXBuMzIpIgotZWVsZjMybDQzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsNDMwMCAiJCh0ZGlyX2VsZjMybDQzMDApIgotZWVsZjMybG1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybG1pcCAiJCh0ZGlyX2VsZjMybG1pcCkiCi1lZWxmMzJscHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybHBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJscHBjICIkKHRkaXJfZWxmMzJscHBjKSIKLWVlbGYzMmxzbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybHNtaXAgIiQodGRpcl9lbGYzMmxzbWlwKSIKLWVlbGYzMnBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMnBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJwcGMgIiQodGRpcl9lbGYzMnBwYykiCi1lZWxmMzJwcGNsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMnBwY2xpbnV4ICIkKHRkaXJfZWxmMzJwcGNsaW51eCkiCi1lZWxmNjRhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NGFscGhhICIkKHRkaXJfZWxmNjRhbHBoYSkiCi1lZWxmNjRfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0X3NwYXJjICIkKHRkaXJfZWxmNjRfc3BhcmMpIgotZWVsZl9pMzg2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4NiAiJCh0ZGlyX2VsZl9pMzg2KSIKLWVlbGZfaTM4Nl9iZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmX2kzODZfYmUgIiQodGRpcl9lbGZfaTM4Nl9iZSkiCi1lZ2xkOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dsZDk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjAgIiQodGRpcl9nbGQ5NjApIgotZWdsZDk2MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ2xkOTYwY29mZiAiJCh0ZGlyX2dsZDk2MGNvZmYpIgotZWdvMzIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ28zMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ28zMiAiJCh0ZGlyX2dvMzIpIgotZWg4MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDAgIiQodGRpcl9oODMwMCkiCi1laDgzMDBoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMGggIiQodGRpcl9oODMwMGgpIgotZWg4MzAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMHMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDBzICIkKHRkaXJfaDgzMDBzKSIKLWVoODUwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwICIkKHRkaXJfaDg1MDApIgotZWg4NTAwYi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBiICIkKHRkaXJfaDg1MDBiKSIKLWVoODUwMGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwYyAiJCh0ZGlyX2g4NTAwYykiCi1laDg1MDBtLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwbS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBtLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMG0gIiQodGRpcl9oODUwMG0pIgotZWg4NTAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMHMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBzICIkKHRkaXJfaDg1MDBzKSIKLWVocDMwMGJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDMwMGJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHAzMDBic2QgIiQodGRpcl9ocDMwMGJzZCkiCi1laHAzaHB1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDNocHV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDNocHV4ICIkKHRkaXJfaHAzaHB1eCkiCi1laHBwYWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocHBhZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9ocHBhZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocHBhZWxmICIkKHRkaXJfaHBwYWVsZikiCi1laTM4NmFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZhb3V0ICIkKHRkaXJfaTM4NmFvdXQpIgotZWkzODZiZW9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZiZW9zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9iZW9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmJlb3MgIiQodGRpcl9pMzg2YmVvcykiCi1laTM4NmJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YnNkICIkKHRkaXJfaTM4NmJzZCkiCi1laTM4NmNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2Y29mZiAiJCh0ZGlyX2kzODZjb2ZmKSIKLWVpMzg2Z28zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Z28zMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZnbzMyICIkKHRkaXJfaTM4NmdvMzIpIgotZWkzODZsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bGludXggIiQodGRpcl9pMzg2bGludXgpIgotZWkzODZseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nmx5bnggIiQodGRpcl9pMzg2bHlueCkiCi1laTM4Nm1hY2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtYWNoICIkKHRkaXJfaTM4Nm1hY2gpIgotZWkzODZtb3NzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtb3NzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtb3NzICIkKHRkaXJfaTM4Nm1vc3MpIgotZWkzODZtc2Rvcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1zZG9zICIkKHRkaXJfaTM4Nm1zZG9zKSIKLWVpMzg2bmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm5ic2QgIiQodGRpcl9pMzg2bmJzZCkiCi1laTM4Nm53LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bncgIiQodGRpcl9pMzg2bncpIgotZWkzODZwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2cGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NnBlICIkKHRkaXJfaTM4NnBlKSIKLWVsbms5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbG5rOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9sbms5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGxuazk2MCAiJCh0ZGlyX2xuazk2MCkiCi1lbTY4azRrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrNGtuYnNkICIkKHRkaXJfbTY4azRrbmJzZCkiCi1lbTY4a2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthb3V0ICIkKHRkaXJfbTY4a2FvdXQpIgotZW02OGthdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2F1eCAiJCh0ZGlyX202OGthdXgpIgotZW02OGtjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2NvZmYgIiQodGRpcl9tNjhrY29mZikiCi1lbTY4a2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrZWxmICIkKHRkaXJfbTY4a2VsZikiCi1lbTY4a2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtsaW51eCAiJCh0ZGlyX202OGtsaW51eCkiCi1lbTY4a2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbHlueCAiJCh0ZGlyX202OGtseW54KSIKLWVtNjhrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a25ic2QgIiQodGRpcl9tNjhrbmJzZCkiCi1lbTY4a3Bzb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wc29zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrcHNvcyAiJCh0ZGlyX202OGtwc29zKSIKLWVtODhrYmNzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL204OGtiY3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG04OGtiY3MgIiQodGRpcl9tODhrYmNzKSIKLWVtY29yZXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21jb3JlcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWNvcmVwZSAiJCh0ZGlyX21jb3JlcGUpIgotZW1pcHNiaWcuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNiaWcuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNiaWcKLWVtaXBzYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNic2QKLWVtaXBzaWR0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2lkdCAiJCh0ZGlyX21pcHNpZHQpIgotZW1pcHNpZHRsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHRsICIkKHRkaXJfbWlwc2lkdGwpIgotZW1pcHNsaXQuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsaXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsaXQgIiQodGRpcl9taXBzbGl0KSIKLWVtaXBzbG5ld3MuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2xuZXdzCi1lbW4xMDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtbjEwMzAwICIkKHRkaXJfbW4xMDMwMCkiCi1lbW4xMDIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtbjEwMjAwICIkKHRkaXJfbW4xMDIwMCkiCi1lbmV3cy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9uZXdzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBuZXdzICIkKHRkaXJfbmV3cykiCi1lbnMzMmtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL25zMzJrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbnMzMmtuYnNkICIkKHRkaXJfbnMzMmtuYnNkKSIKLWVwYzUzMm1hY2hhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBjNTMybWFjaGEgIiQodGRpcl9wYzUzMm1hY2hhKSIKLWVwcGNtYWNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNtYWNvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY21hY29zICIkKHRkaXJfcHBjbWFjb3MpIgotZXBwY253LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY253LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY253ICIkKHRkaXJfcHBjbncpIgotZXBwY3BlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY3BlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHBjcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY3BlICIkKHRkaXJfcHBjcGUpIgotZXJpc2NpeC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9yaXNjaXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHJpc2NpeCAiJCh0ZGlyX3Jpc2NpeCkiCi1lc2EyOTIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zYTI5MjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzYTI5MjAwICIkKHRkaXJfc2EyOTIwMCkiCi1lc2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2guc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaCAiJCh0ZGlyX3NoKSIKLWVzaGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hlbGYgIiQodGRpcl9zaGVsZikiCi1lc2hsZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hsZWxmICIkKHRkaXJfc2hsZWxmKSIKLWVzaGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hsICIkKHRkaXJfc2hsKSIKLWVzcGFyY2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2FvdXQgIiQodGRpcl9zcGFyY2FvdXQpIgotZXNwYXJjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbGludXggIiQodGRpcl9zcGFyY2xpbnV4KSIKLWVzcGFyY2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbHlueCAiJCh0ZGlyX3NwYXJjbHlueCkiCi1lc3BhcmNuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNuYnNkICIkKHRkaXJfc3BhcmNuYnNkKSIKLWVzdDIwMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3QyMDAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN0MjAwMCAiJCh0ZGlyX3N0MjAwMCkiCi1lc3VuMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW4zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3VuMyAiJCh0ZGlyX3N1bjMpIgotZXN1bjQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuNC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjQgIiQodGRpcl9zdW40KSIKLWV0aWMzMGFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzMwYW91dCAiJCh0ZGlyX3RpYzMwYW91dCkiCi1ldGljMzBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGNvZmYgIiQodGRpcl90aWMzMGNvZmYpIgotZXRpYzgwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljODBjb2ZmICIkKHRkaXJfdGljODBjb2ZmKSIKLWV2YW5pbGxhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZhbmlsbGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3ZhbmlsbGEuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZhbmlsbGEgIiQodGRpcl92YW5pbGxhKSIKLWV2YXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmF4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YXggIiQodGRpcl92YXgpIgotZXZzdGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdnN0YS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdnN0YSAiJCh0ZGlyX3ZzdGEpIgotZXY4NTAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdjg1MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Y4NTAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHY4NTAgIiQodGRpcl92ODUwKSIKLWV3NjUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdzY1LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC93NjUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHc2NSAiJCh0ZGlyX3c2NSkiCi1lejgwMDEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMSAiJCh0ZGlyX3o4MDAxKSIKLWV6ODAwMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHo4MDAyICIkKHRkaXJfejgwMDIpIgotCi1sZF9uZXdfU09VUkNFUyA9IGxkZ3JhbS55IGxkbGV4LmwgbGV4c3VwLmMgbGRsYW5nLmMgbXJpLmMgbGRjdG9yLmMgbGRtYWluLmMgXAotCWxkd3JpdGUuYyBsZGV4cC5jIGxkZW11bC5jIGxkdmVyLmMgbGRtaXNjLmMgbGRmaWxlLmMgbGRjcmVmLmMKLWxkX25ld19ERVBFTkRFTkNJRVMgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMREVQUykKLWxkX25ld19MREFERCA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi0jIFRoZSBnZW5lcmF0ZWQgZW11bGF0aW9uIGZpbGVzIG1vc3RseSBoYXZlIHRoZSBzYW1lIGRlcGVuZGVuY2llcy4KLSQoRU1VTEFUSU9OX09GSUxFUyk6IC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRjdG9yLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaAotCi0jIFRoaXMgaXMgdGhlIHJlYWwgbGliYmZkLmEgY3JlYXRlZCBieSBsaWJ0b29sLgotVEVTVEJGRExJQiA9IEBURVNUQkZETElCQAotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY3Jvb3Q9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3Jjcm9vdDsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3Jjcm9vdH0vdGVzdHN1aXRlIFwKLQkJQ0M9IiQoQ0NfRk9SX1RBUkdFVCkiIENGTEFHUz0iJChDRkxBR1MpIiBcCi0JCUNYWD0iJChDWFhfRk9SX1RBUkdFVCkiIENYWEZMQUdTPSIkKENYWEZMQUdTKSIgXAotCQlDQ19GT1JfSE9TVD0iJChDQykiIENGTEFHU19GT1JfSE9TVD0iJChDRkxBR1MpIiBcCi0JCU9GSUxFUz0iJChPRklMRVMpIiBCRkRMSUI9IiQoVEVTVEJGRExJQikiIFwKLQkJTElCSUJFUlRZPSIkKExJQklCRVJUWSkgJChJTlRMTElCUykiIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFJ1bGVzIGZvciB0ZXN0aW5nIGJ5IHJlbGlua2luZyBsZCBpdHNlbGYuCi0jIEEgc2ltaWxhciB0ZXN0IGlzIGluIHRoZSB0ZXN0c3VpdGUuICBUaGlzIHRhcmdldCBpcyBmb3IgZWFzZSBvZiB1c2UKLSMgd2hlbiBwb3J0aW5nIGxkLgotCi1sZC1wYXJ0aWFsLm86IGxkLW5ldyQoRVhFRVhUKQotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkLXBhcnRpYWwubyAtciAkKE9GSUxFUykKLWxkMSQoRVhFRVhUKTogbGQtcGFydGlhbC5vCi0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSBsZC1wYXJ0aWFsLm8gJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWxkMS1mdWxsJChFWEVFWFQpOiBsZC1uZXcKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEtZnVsbCQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDIkKEVYRUVYVCk6IGxkMSQoRVhFRVhUKQotCS4vbGQxJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMiQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDMkKEVYRUVYVCk6IGxkMiQoRVhFRVhUKQotCS4vbGQyJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMyQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1ib290c3RyYXA6IGxkMyQoRVhFRVhUKQotCWNtcCBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpCi0KLS5QSE9OWTogYm9vdHN0cmFwCi0KLSMgQSB0ZXN0IHByb2dyYW0gZm9yIEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgotIyBUaGlzIHRlc3QgaXMgbm93IGluIHRoZSB0ZXN0c3VpdGUuCi0jCi0jY2R0ZXN0OiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdCAkKEhPU1RJTkdfQ1JUMCkgXAotIwkgIGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3Qub3V0OiBjZHRlc3QKLSMJLi9jZHRlc3QgPiBjZHRlc3QudG1wCi0jCW12IGNkdGVzdC50bXAgY2R0ZXN0Lm91dAotIwotI2NkdGVzdC11ci5vOiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ci5vIC1VciBjZHRlc3QtbWFpbi5vIFwKLSMJICBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vCi0jCi0jY2R0ZXN0LXVyOiBjZHRlc3QtdXIubwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIgJChIT1NUSU5HX0NSVDApIGNkdGVzdC11ci5vIFwKLSMJICAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3QtdXIub3V0OiBjZHRlc3QtdXIKLSMJLi9jZHRlc3QtdXIgPiBjZHRlc3QtdXIudG1wCi0jCW12IGNkdGVzdC11ci50bXAgY2R0ZXN0LXVyLm91dAotIwotI2NoZWNrLWNkdGVzdDogY2R0ZXN0Lm91dCBjZHRlc3QtdXIub3V0ICQoc3JjZGlyKS9jZHRlc3QuZXhwCi0jCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0Lm91dAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC11ci5vdXQKLSMKLSMuUEhPTlk6IGNoZWNrLWNkdGVzdAotCi0jIEVORCBPRiBDSEVDSyBUQVJHRVRTCi0KLSMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCi0jIE1hbnVhbCBjb25maWd1cmF0aW9uIGZpbGU7IG5vdCB1c3VhbGx5IGF0dGFjaGVkIHRvIG5vcm1hbCBjb25maWd1cmF0aW9uLAotIyBiZWNhdXNlIGFsbW9zdCBhbGwgY29uZmlncyB1c2UgImdlbiIgdmVyc2lvbiBvZiBtYW51YWwuCi0jICBTZXQgRE9DVkVSIGFib3ZlIHRvIGNoYW5nZS4KLWNvbmZpZ2RvYy50ZXhpOgkke0RPQ1ZFUn0tZG9jLnRleGkKLQlsbiAtcyAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpCi0KLWxkdmVyLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgJEAKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAotCi1sZC5pbmZvOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyAkKHNyY2RpcikvbGQudGV4aW5mbwotCi1sZC5kdmk6ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvOiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSIkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyIgJChURVhJMkRWSSkgJChzcmNkaXIpL2xkLnRleGluZm8KLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBsZHZlci50ZXhpCi0KLSMgV2Ugd2FudCB0byByZWNvbmZpZ3VyZSBpZiBjb25maWd1cmUuaG9zdCBvciBjb25maWd1cmUudGd0IGNoYW5nZXMuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdCAkKHNyY2RpcikvY29uZmlndXJlLnRndAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgbGQxJChFWEVFWFQpIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkgXAotCWxkZW11bC1saXN0LmggY3J0YmVnaW4ubyBjcnRlbmQubyBsZC5sb2cgbGQuc3VtCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLmRlcCAuZGVwMQotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBsZC1uZXckKEVYRUVYVCkKLQkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKSAkKHRvb2xkaXIpL2JpbgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCW49YGVjaG8gbGQgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgbGQtbmV3JChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCi0JZmkKLQotaW5zdGFsbC1kYXRhLWxvY2FsOgotCSQobWtpbnN0YWxsZGlycykgJChzY3JpcHRkaXIpL2xkc2NyaXB0cwotCWZvciBmIGluIGxkc2NyaXB0cy8qOyBkbyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmICQoc2NyaXB0ZGlyKS8kJGYgOyBcCi0JZG9uZQotCi0jIFN0dWZmIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgZGlzdHJpYnV0aW9uLiAgVGhlIGRpc3RzdHVmZgotIyB0YXJnZXQgaXMgcnVuIGJ5IHRoZSB0YXogdGFyZ2V0IGluIC4uL01ha2VmaWxlLmluLgotTERESVNUU1RVRkYgPSBsZGdyYW0uYyBsZGdyYW0uaCBsZGxleC5jCi1kaXN0c3R1ZmY6ICQoTERESVNUU1RVRkYpIGluZm8KLQotRElTVENMRUFORklMRVMgPSB0ZGlycyBzaXRlLmV4cCBzaXRlLmJhawotZGlzdGNsZWFuLWxvY2FsOgotCXJtIC1yZiBsZHNjcmlwdHMKLQotIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiAuZGVwMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIC5kZXAxCi0JJChNQUtFKSBERVA9JChERVApIC5kZXAxCi0Jc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi0uZGVwMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKLQlybSAtZiAuZGVwMgotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKLQkkKERFUCkgLWYgLmRlcDIgJChJTkNMVURFUykgJD8KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotbGRjdG9yLm86IGxkY3Rvci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGN0b3IuaAotbGRlbXVsLm86IGxkZW11bC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGVtdWwuaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRlbXVsLWxpc3QuaAotbGRleHAubzogbGRleHAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggbGRncmFtLmggbGRsYW5nLmgKLWxkZmlsZS5vOiBsZGZpbGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRncmFtLmggXAotICBsZGxleC5oIGxkZW11bC5oCi1sZGxhbmcubzogbGRsYW5nLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggbGRsZXguaCBsZG1pc2MuaCBcCi0gIGxkY3Rvci5oIGxkZmlsZS5oICQoSU5DRElSKS9mbm1hdGNoLmgKLWxkbWFpbi5vOiBsZG1haW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkd3JpdGUuaCBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIFwKLSAgbGRsZXguaCBsZGZpbGUuaCBsZGN0b3IuaAotbGRtaXNjLm86IGxkbWlzYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRncmFtLmggbGRsZXguaCBsZG1haW4uaCBsZGZpbGUuaAotbGR2ZXIubzogbGR2ZXIuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGR2ZXIuaCBcCi0gIGxkZW11bC5oIGxkbWFpbi5oCi1sZHdyaXRlLm86IGxkd3JpdGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCi0gIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oCi1sZXhzdXAubzogbGV4c3VwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaCBsZGxleC5oIGxkZmlsZS5oIFwKLSAgbGR2ZXIuaCBsZGVtdWwuaAotbXJpLm86IG1yaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRtaXNjLmggbXJpLmggbGRncmFtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1sZGNyZWYubzogbGRjcmVmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBcCi0gIGxkbGFuZy5oCi1wZS1kbGwubzogcGUtZGxsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGVtdWwuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgLi4vYmZkL2xpYmNvZmYuaCBkZWZmaWxlLmgKLWxkZ3JhbS5vOiBsZGdyYW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGR2ZXIuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBcCi0gIGxkbWFpbi5oIG1yaS5oIGxkY3Rvci5oIGxkbGV4LmgKLWxkbGV4Lm86IGxkbGV4LmMgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBsZC5oIGxkZ3JhbS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRsZXguaCBcCi0gIGxkbWFpbi5oCi1kZWZmaWxlcC5vOiBkZWZmaWxlcC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZG1pc2MuaCBkZWZmaWxlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9sZC9NYWtlZmlsZS5pbiBiL2xkL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU0NTdhLi4wMDAwMDAwCi0tLSBhL2xkL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU1OSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUyA9IEBBU0AKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRU1VTEFUSU9OX0xJQlBBVEggPSBARU1VTEFUSU9OX0xJQlBBVEhACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTkFUSVZFX0xJQl9ESVJTID0gQE5BVElWRV9MSUJfRElSU0AKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgV2UgcHV0IHRoZSBzY3JpcHRzIGluIHRoZSBkaXJlY3RvcnkgJChzY3JpcHRkaXIpL2xkc2NyaXB0cy4KLSMgV2UgY2FuJ3QgcHV0IHRoZSBzY3JpcHRzIGluICQoZGF0YWRpcikgYmVjYXVzZSB0aGUgU0VBUkNIX0RJUgotIyBkaXJlY3RpdmVzIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZvciBuYXRpdmUgYW5kIGNyb3NzIGxpbmtlcnMuCi1zY3JpcHRkaXIgPSAkKHRvb2xkaXIpL2xpYgotCi1FTVVMID0gQEVNVUxACi1FTVVMQVRJT05fT0ZJTEVTID0gQEVNVUxBVElPTl9PRklMRVNACi1FTVVMX0VYVFJBX09GSUxFUyA9IEBFTVVMX0VYVFJBX09GSUxFU0AKLQotIyBTZWFyY2ggcGF0aCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgLWxmb28gbGlicmFyaWVzLgotIyBJZiBMSUJfUEFUSCBpcyBlbXB0eSwgdGhlIG9uZXMgaW4gdGhlIHNjcmlwdCAoaWYgYW55KSBhcmUgbGVmdCBhbG9uZS4KLSMgKFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiwgdW5sZXNzIGJ1aWxkaW5nCi0jIGEgY3Jvc3MtbGlua2VyLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGlzIGVtcHR5LiAgU2VlIGdlbnNjcmlwdHMuc2guKQotIyBPdGhlcndpc2UsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9uZXMgZ2l2ZW4gaW4gTElCX1BBVEgsCi0jIHdoaWNoIG1heSBoYXZlIHRoZSBmb3JtOiBMSUJfUEFUSD0vbGliOi91c3IvbG9jYWwvbGliCi1MSUJfUEFUSCA9IAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi1ERVAgPSBta2RlcAotCi0jIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHRvIGJ1aWxkCi1ET0NWRVIgPSBnZW4KLQotI3N0dWZmIGZvciBzZWxmIGhvc3RpbmcgKGNhbiBiZSBvdmVycmlkZGVuIGluIGNvbmZpZyBmaWxlKS4KLUhPU1RJTkdfQ1JUMCA9IEBIT1NUSU5HX0NSVDBACi1IT1NUSU5HX0xJQlMgPSBASE9TVElOR19MSUJTQAotSE9TVElOR19FTVUgPSAtbSAkKEVNVUwpCi0KLSMgU2V0dXAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLCBpZiB5b3UgaGF2ZSBvbmUKLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyBcCi0JdGhlbiBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLQllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAotCi0KLVJVTlRFU1RGTEFHUyA9IAotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLUNYWCA9IGdjYwotQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGxkLW5ldwotaW5mb19URVhJTkZPUyA9IGxkLnRleGluZm8KLW5vaW5zdF9URVhJTkZPUyA9IGxkaW50LnRleGluZm8KLW1hbl9NQU5TID0gbGQuMQotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAkKEhERUZJTkVTKSAkKENGTEFHUykgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotQUxMX0VNVUxBVElPTlMgPSBcCi0JZWEyOWsubyBcCi0JZWFpeHBwYy5vIFwKLQllYWl4cnM2Lm8gXAotCWVhbHBoYS5vIFwKLQllYXJjZWxmLm8gXAotCWVhcm1lbGYubyBcCi0JZWFybWVsZl9vYWJpLm8gXAotCWVhcm1lbGZfbGludXgubyBcCi0JZWFybWVsZl9saW51eDI2Lm8gXAotCWVhcm1hb3V0Yi5vIFwKLQllYXJtYW91dGwubyBcCi0JZWFybWNvZmYubyBcCi0JZWFybXBlLm8gXAotCWVjb2ZmX3NwYXJjLm8gXAotCWVkMTB2ZWxmLm8gXAotCWVkMzB2ZWxmLm8gXAotCWVkMzB2X2UubyBcCi0JZWQzMHZfby5vIFwKLQllZGVsdGE2OC5vIFwKLQllZWJtb24yOWsubyBcCi0JZWVsZjMyX3NwYXJjLm8gXAotCWVlbGYzMl9pOTYwLm8gXAotCWVlbGYzMmI0MzAwLm8gXAotCWVlbGYzMmJtaXAubyBcCi0JZWVsZjMyZWJtaXAubyBcCi0JZWVsZjMyZWxtaXAubyBcCi0JZWVsZjMyYm1pcG4zMi5vIFwKLQllZWxmMzJsNDMwMC5vIFwKLQllZWxmMzJsbWlwLm8gXAotCWVlbGYzMmxwcGMubyBcCi0JZWVsZjMycHBjLm8gXAotCWVlbGYzMnBwY2xpbnV4Lm8gXAotCWVlbGZfaTM4Ni5vIFwKLQllZWxmX2kzODZfYmUubyBcCi0JZWdsZDk2MC5vIFwKLQllZ2xkOTYwY29mZi5vIFwKLQllZWxmMzJmcjMwLm8gXAotCWVlbGYzMm1jb3JlLm8gXAotCWVnbzMyLm8gXAotCWVoODMwMC5vIFwKLQllaDgzMDBoLm8gXAotCWVoODMwMHMubyBcCi0JZWg4NTAwLm8gXAotCWVoODUwMGIubyBcCi0JZWg4NTAwYy5vIFwKLQllaDg1MDBtLm8gXAotCWVoODUwMHMubyBcCi0JZWhwMzAwYnNkLm8gXAotCWVocDNocHV4Lm8gXAotCWVocHBhZWxmLm8gXAotCWVpMzg2YW91dC5vIFwKLQllaTM4NmJlb3MubyBcCi0JZWkzODZic2QubyBcCi0JZWkzODZjb2ZmLm8gXAotCWVpMzg2Z28zMi5vIFwKLQllaTM4NmxpbnV4Lm8gXAotCWVpMzg2bHlueC5vIFwKLQllaTM4Nm1hY2gubyBcCi0JZWkzODZtb3NzLm8gXAotCWVpMzg2bXNkb3MubyBcCi0JZWkzODZuYnNkLm8gXAotCWVpMzg2bncubyBcCi0JZWkzODZwZS5vIFwKLQllbG5rOTYwLm8gXAotCWVtNjhrNGtuYnNkLm8gXAotCWVtNjhrYW91dC5vIFwKLQllbTY4a2F1eC5vIFwKLQllbTY4a2NvZmYubyBcCi0JZW02OGtlbGYubyBcCi0JZW02OGtsaW51eC5vIFwKLQllbTY4a2x5bngubyBcCi0JZW02OGtuYnNkLm8gXAotCWVtNjhrcHNvcy5vIFwKLQllbTg4a2Jjcy5vIFwKLQllbWNvcmVwZS5vIFwKLQllbWlwc2JpZy5vIFwKLQllbWlwc2JzZC5vIFwKLQllbWlwc2lkdC5vIFwKLQllbWlwc2lkdGwubyBcCi0JZW1pcHNsaXQubyBcCi0JZW1pcHNsbmV3cy5vIFwKLQllbmV3cy5vIFwKLQllbnMzMmtuYnNkLm8gXAotCWVwYzUzMm1hY2hhLm8gXAotCWVwcGNtYWNvcy5vIFwKLQllcHBjbncubyBcCi0JZXBwY3BlLm8gXAotCWVyaXNjaXgubyBcCi0JZXNhMjkyMDAubyBcCi0JZXNoLm8gXAotCWVzaGVsZi5vIFwKLQllc2hsZWxmLm8gXAotCWVzaGwubyBcCi0JZXNwYXJjYW91dC5vIFwKLQllc3BhcmNsaW51eC5vIFwKLQllc3BhcmNseW54Lm8gXAotCWVzcGFyY25ic2QubyBcCi0JZXN0MjAwMC5vIFwKLQllc3VuMy5vIFwKLQllc3VuNC5vIFwKLQlldGljMzBhb3V0Lm8gXAotCWV0aWMzMGNvZmYubyBcCi0JZXRpYzgwY29mZi5vIFwKLQlldmFuaWxsYS5vIFwKLQlldmF4Lm8gXAotCWV2c3RhLm8gXAotCWV3NjUubyBcCi0JZXo4MDAxLm8gXAotCWV6ODAwMi5vCi0KLQotQUxMXzY0X0VNVUxBVElPTlMgPSBcCi0JZWVsZjY0X3NwYXJjLm8gXAotCWVlbGY2NGFscGhhLm8KLQotCi1BTExfRU1VTF9FWFRSQV9PRklMRVMgPSBcCi0JcGUtZGxsLm8gXAotCWRlZmZpbGVwLm8KLQotCi1DRklMRVMgPSBsZGN0b3IuYyBsZGVtdWwuYyBsZGV4cC5jIGxkZmlsZS5jIGxkbGFuZy5jIFwKLQlsZG1haW4uYyBsZG1pc2MuYyBsZHZlci5jIGxkd3JpdGUuYyBsZXhzdXAuYyBcCi0JbXJpLmMgbGRjcmVmLmMgcGUtZGxsLmMKLQotCi1IRklMRVMgPSBsZC5oIGxkY3Rvci5oIGxkZW11bC5oIGxkZXhwLmggbGRmaWxlLmggXAotCWxkbGFuZy5oIGxkbGV4LmggbGRtYWluLmggbGRtaXNjLmggbGR2ZXIuaCBcCi0JbGR3cml0ZS5oIG1yaS5oIGRlZmZpbGUuaAotCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBsZGdyYW0uYyBsZGxleC5jIGRlZmZpbGVwLmMKLUdFTkVSQVRFRF9IRklMRVMgPSBsZGdyYW0uaCBsZGVtdWwtbGlzdC5oIGRlZmZpbGVwLmgKLQotT0ZJTEVTID0gbGRncmFtLm8gbGRsZXgubyBsZXhzdXAubyBsZGxhbmcubyBtcmkubyBsZGN0b3IubyBsZG1haW4ubyBcCi0JbGR3cml0ZS5vIGxkZXhwLm8gIGxkZW11bC5vIGxkdmVyLm8gbGRtaXNjLm8gXAotCWxkZmlsZS5vIGxkY3JlZi5vICR7RU1VTEFUSU9OX09GSUxFU30gJHtFTVVMX0VYVFJBX09GSUxFU30KLQotCi1TVEFHRVNUVUZGID0gKi5vIGxkc2NyaXB0cy8qIGUqLmMKLQotIyBBdCB0aGUgbW9tZW50IHRoaXMgaXMganVzdCBhIGxpc3Qgb2YgdGhvc2UgZW11bGF0aW9uIHRlbXBsYXRlIGZpbGVzCi0jIHRoYXQgY29udGFpbiBpbnRlcm5hdGlvbmFsaXNlZCBzdHJpbmdzLgotRU1VTEFUSU9OX0ZJTEVTID0gZW11bHRlbXBsL3BlLmVtIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtCi0KLVBPVEZJTEVTID0gJChDRklMRVMpICQoSEZJTEVTKSAkKEVNVUxBVElPTl9GSUxFUykKLQotIyBUaGVzZSBhbGwgc3RhcnQgd2l0aCBlIHNvICdtYWtlIGNsZWFuJyBjYW4gZmluZCB0aGVtLgotCi1HRU5TQ1JJUFRTID0gJChTSEVMTCkgJChzcmNkaXIpL2dlbnNjcmlwdHMuc2ggJHtzcmNkaXJ9ICR7bGliZGlyfSBAaG9zdEAgQHRhcmdldEAgQHRhcmdldF9hbGlhc0AgIkBFTVVMQVRJT05fTElCUEFUSEAiICJATkFUSVZFX0xJQl9ESVJTQCIKLUdFTl9ERVBFTkRTID0gJChzcmNkaXIpL2dlbnNjcmlwdHMuc2ggJChzcmNkaXIpL2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkCi0KLWxkX25ld19TT1VSQ0VTID0gbGRncmFtLnkgbGRsZXgubCBsZXhzdXAuYyBsZGxhbmcuYyBtcmkuYyBsZGN0b3IuYyBsZG1haW4uYyBcCi0JbGR3cml0ZS5jIGxkZXhwLmMgbGRlbXVsLmMgbGR2ZXIuYyBsZG1pc2MuYyBsZGZpbGUuYyBsZGNyZWYuYwotCi1sZF9uZXdfREVQRU5ERU5DSUVTID0gJChFTVVMQVRJT05fT0ZJTEVTKSAkKEVNVUxfRVhUUkFfT0ZJTEVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTERFUFMpCi1sZF9uZXdfTERBREQgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotIyBUaGlzIGlzIHRoZSByZWFsIGxpYmJmZC5hIGNyZWF0ZWQgYnkgbGlidG9vbC4KLVRFU1RCRkRMSUIgPSBAVEVTVEJGRExJQkAKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBsZHZlci50ZXhpCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGxkMSQoRVhFRVhUKSBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpIFwKLQlsZGVtdWwtbGlzdC5oIGNydGJlZ2luLm8gY3J0ZW5kLm8gbGQubG9nIGxkLnN1bQotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCAuZGVwIC5kZXAxCi0KLSMgU3R1ZmYgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYSBkaXN0cmlidXRpb24uICBUaGUgZGlzdHN0dWZmCi0jIHRhcmdldCBpcyBydW4gYnkgdGhlIHRheiB0YXJnZXQgaW4gLi4vTWFrZWZpbGUuaW4uCi1MRERJU1RTVFVGRiA9IGxkZ3JhbS5jIGxkZ3JhbS5oIGxkbGV4LmMKLQotRElTVENMRUFORklMRVMgPSB0ZGlycyBzaXRlLmV4cCBzaXRlLmJhawotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLW5vaW5zdF9QUk9HUkFNUyA9ICBsZC1uZXckKEVYRUVYVCkKLVBST0dSQU1TID0gICQobm9pbnN0X1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1sZF9uZXdfT0JKRUNUUyA9ICBsZGdyYW0ubyBsZGxleC5vIGxleHN1cC5vIGxkbGFuZy5vIG1yaS5vIGxkY3Rvci5vIFwKLWxkbWFpbi5vIGxkd3JpdGUubyBsZGV4cC5vIGxkZW11bC5vIGxkdmVyLm8gbGRtaXNjLm8gbGRmaWxlLm8gbGRjcmVmLm8KLWxkX25ld19MREZMQUdTID0gCi1MRVhfT1VUUFVUX1JPT1QgPSBATEVYX09VVFBVVF9ST09UQAotTEVYTElCID0gQExFWExJQkAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGxkLmluZm8KLURWSVMgPSBsZC5kdmkKLVRFWElORk9TID0gbGQudGV4aW5mbwotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotTkVXUyBUT0RPIGFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGNvbmZpZy5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKLWxkZ3JhbS5jIGxkbGV4LmMKLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9ICQobGRfbmV3X1NPVVJDRVMpCi1PQkpFQ1RTID0gJChsZF9uZXdfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmR2aSAuaW5mbyAubCAubG8gLm8gLnBzIC5zIC50ZXhpIC50ZXhpbmZvIC50eGkgLnkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQktdGVzdCAteiAiJChub2luc3RfUFJPR1JBTVMpIiB8fCBybSAtZiAkKG5vaW5zdF9QUk9HUkFNUykKLQotZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1tYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1sZC1uZXckKEVYRUVYVCk6ICQobGRfbmV3X09CSkVDVFMpICQobGRfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgbGQtbmV3JChFWEVFWFQpCi0JJChMSU5LKSAkKGxkX25ld19MREZMQUdTKSAkKGxkX25ld19PQkpFQ1RTKSAkKGxkX25ld19MREFERCkgJChMSUJTKQotLmwuYzoKLQkkKExFWCkgJChBTV9MRkxBR1MpICQoTEZMQUdTKSAkPCAmJiBtdiAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQAotLnkuYzoKLQkkKFlBQ0MpICQoQU1fWUZMQUdTKSAkKFlGTEFHUykgJDwgJiYgbXYgeS50YWIuYyAkKi5jCi0JaWYgdGVzdCAtZiB5LnRhYi5oOyB0aGVuIFwKLQlpZiBjbXAgLXMgeS50YWIuaCAkKi5oOyB0aGVuIHJtIC1mIHkudGFiLmg7IGVsc2UgbXYgeS50YWIuaCAkKi5oOyBmaTsgXAotCWVsc2UgOjsgZmkKLWxkZ3JhbS5oOiBsZGdyYW0uYwotCi0KLWxkLmluZm86IGxkLnRleGluZm8KLWxkLmR2aTogbGQudGV4aW5mbwotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBsZC5hdXggbGQuY3AgbGQuY3BzIGxkLmR2aSBsZC5mbiBsZC5mbnMgbGQua3kgbGQua3lzIGxkLnBzIFwKLQkgIGxkLmxvZyBsZC5wZyBsZC50b2MgbGQudHAgbGQudHBzIGxkLnZyIGxkLnZycyBsZC5vcCBsZC50ciBcCi0JICBsZC5jdiBsZC5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLQotREVKQVRPT0wgPSAkKFBBQ0tBR0UpCi0KLVJVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAotCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAotCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtZXhlYy1sb2NhbAotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLWxvY2FsCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1tYW4KLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKE1BTlMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKG1hbmRpcikvbWFuMQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICJsZGxleGxsZGdyYW1obGRncmFtYyQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiBsZGxleGwgbGRncmFtaCBsZGdyYW1jICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1sb2NhbAotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdFBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLXRhZ3MgXAotCQlkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbSBkaXN0Y2xlYW4tbG9jYWwKLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKLW1vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAotdW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWRhdGEtYW0gXAotaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBcCi1hbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1sZG1haW4ubzogbGRtYWluLmMgY29uZmlnLnN0YXR1cwotCSQoQ09NUElMRSkgLWMgLURERUZBVUxUX0VNVUxBVElPTj0nIiQoRU1VTCkiJyAtRFNDUklQVERJUj0nIiQoc2NyaXB0ZGlyKSInIC1EVEFSR0VUPSciQHRhcmdldEAiJyAkKHNyY2RpcikvbGRtYWluLmMKLQotbGRlbXVsLWxpc3QuaDogTWFrZWZpbGUKLQkoZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAgRE8gTk9UIEVESVQhICovIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gImV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkXyQke2Z9X2VtdWxhdGlvbjsiOyBcCi0JZG9uZTtcCi0JZWNobyAiIjtcCi0JZWNobyAiI2RlZmluZSBFTVVMQVRJT05fTElTVCBcXCI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICIgICZsZF8kJHtmfV9lbXVsYXRpb24sIFxcIjsgXAotCWRvbmU7XAotCWVjaG8gIiAgMCIpID5sZGVtdWwtdG1wLmgKLQltdiBsZGVtdWwtdG1wLmggbGRlbXVsLWxpc3QuaAotQFRESVJTQAotCi1lYTI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hMjlrLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hMjlrLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhMjlrICIkKHRkaXJfYTI5aykiCi1lYWl4cHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FpeHBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFpeHBwYyAiJCh0ZGlyX2FpeHBwYykiCi1lYWl4cnM2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FpeHJzNi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFpeHJzNiAiJCh0ZGlyX2FpeHJzNikiCi1lYWxwaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWxwaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FscGhhLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhbHBoYSAiJCh0ZGlyX2FscGhhKSIKLWVhcmNlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJjZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFyY2VsZiAiJCh0ZGlyX2FyY2VsZikiCi1lYXJtZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZiAiJCh0ZGlyX2FybWVsZikiCi1lYXJtZWxmX29hYmkuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9vYWJpICIkKHRkaXJfYXJtZWxmKSIKLWVhcm1lbGZfbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4ICIkKHRkaXJfYXJtZWxmX2xpbnV4KSIKLWVhcm1lbGZfbGludXgyNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eDI2ICIkKHRkaXJfYXJtZWxmX2xpbnV4MjYpIgotZWFybWFvdXRiLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRiLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1hb3V0YiAiJCh0ZGlyX2FybWFvdXRiKSIKLWVhcm1hb3V0bC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0bC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtYW91dGwgIiQodGRpcl9hcm1hb3V0bCkiCi1lYXJtY29mZi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1jb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1jb2ZmICIkKHRkaXJfYXJtY29mZikiCi1lYXJtcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtcGUgIiQodGRpcl9hcm1wZSkiCi1lY29mZl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGNvZmZfc3BhcmMgIiQodGRpcl9jb2ZmX3NwYXJjKSIKLWVkMTB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QxMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQxMHZlbGYgIiQodGRpcl9kMTB2KSIKLWVkMzB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZlbGYgIiQodGRpcl9kMzB2KSIKLWVkMzB2X28uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9vLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X28gIiQodGRpcl9kMzB2KSIKLWVkMzB2X2UuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9lLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X2UgIiQodGRpcl9kMzB2KSIKLWVkZWx0YTY4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2RlbHRhNjguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGRlbHRhNjggIiQodGRpcl9kZWx0YTY4KSIKLWVlYm1vbjI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVibW9uMjlrICIkKHRkaXJfZWJtb24yOWspIgotZWVsZjMyZnIzMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZnIzMCAiJCh0ZGlyX2ZyMzApIgotZWVsZjMybWNvcmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJtY29yZSAiJCh0ZGlyX21jb3JlKSIKLWVtMzJyZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL20zMnJlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTMycmVsZiAiJCh0ZGlyX20zMnIpIgotZWVsZjMyX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMl9zcGFyYyAiJCh0ZGlyX2VsZjMyX3NwYXJjKSIKLWVlbGYzMl9pOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyX2k5NjAgIiQodGRpcl9lbGYzMl9pOTYwKSIKLWVlbGYzMmI0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYjQzMDAgIiQodGRpcl9lbGYzMmI0MzAwKSIKLWVlbGYzMmJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJtaXAgIiQodGRpcl9lbGYzMmJtaXApIgotZWVsZjMyYnNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJic21pcCAiJCh0ZGlyX2VsZjMyYnNtaXApIgotZWVsZjMyZWJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlYm1pcCAiJCh0ZGlyX2VsZjMyZWJtaXApIgotZWVsZjMyZWxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlbG1pcCAiJCh0ZGlyX2VsZjMyZWxtaXApIgotZWVsZjMyYm1pcG4zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYm1pcG4zMiAiJCh0ZGlyX2VsZjMyYm1pcG4zMikiCi1lZWxmMzJsNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmw0MzAwICIkKHRkaXJfZWxmMzJsNDMwMCkiCi1lZWxmMzJsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsbWlwICIkKHRkaXJfZWxmMzJsbWlwKSIKLWVlbGYzMmxwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxwcGMgIiQodGRpcl9lbGYzMmxwcGMpIgotZWVsZjMybHNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsc21pcCAiJCh0ZGlyX2VsZjMybHNtaXApIgotZWVsZjMycHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMnBwYyAiJCh0ZGlyX2VsZjMycHBjKSIKLWVlbGYzMnBwY2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMycHBjbGludXggIiQodGRpcl9lbGYzMnBwY2xpbnV4KSIKLWVlbGY2NGFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0YWxwaGEgIiQodGRpcl9lbGY2NGFscGhhKSIKLWVlbGY2NF9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmNjRfc3BhcmMgIiQodGRpcl9lbGY2NF9zcGFyYykiCi1lZWxmX2kzODYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZl9pMzg2ICIkKHRkaXJfZWxmX2kzODYpIgotZWVsZl9pMzg2X2JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4Nl9iZSAiJCh0ZGlyX2VsZl9pMzg2X2JlKSIKLWVnbGQ5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdsZDk2MCAiJCh0ZGlyX2dsZDk2MCkiCi1lZ2xkOTYwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjBjb2ZmICIkKHRkaXJfZ2xkOTYwY29mZikiCi1lZ28zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbzMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbzMyICIkKHRkaXJfZ28zMikiCi1laDgzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMCAiJCh0ZGlyX2g4MzAwKSIKLWVoODMwMGguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMGguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwaCAiJCh0ZGlyX2g4MzAwaCkiCi1laDgzMDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMHMgIiQodGRpcl9oODMwMHMpIgotZWg4NTAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDAgIiQodGRpcl9oODUwMCkiCi1laDg1MDBiLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBiLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMGIgIiQodGRpcl9oODUwMGIpIgotZWg4NTAwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBjICIkKHRkaXJfaDg1MDBjKSIKLWVoODUwMG0uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBtLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMG0uc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwbSAiJCh0ZGlyX2g4NTAwbSkiCi1laDg1MDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMHMgIiQodGRpcl9oODUwMHMpIgotZWhwMzAwYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwMzAwYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDMwMGJzZCAiJCh0ZGlyX2hwMzAwYnNkKSIKLWVocDNocHV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwM2hwdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwM2hwdXggIiQodGRpcl9ocDNocHV4KSIKLWVocHBhZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwcGFlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2hwcGFlbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwcGFlbGYgIiQodGRpcl9ocHBhZWxmKSIKLWVpMzg2YW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmFvdXQgIiQodGRpcl9pMzg2YW91dCkiCi1laTM4NmJlb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2Jlb3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YmVvcyAiJCh0ZGlyX2kzODZiZW9zKSIKLWVpMzg2YnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZic2QgIiQodGRpcl9pMzg2YnNkKSIKLWVpMzg2Y29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Y29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZjb2ZmICIkKHRkaXJfaTM4NmNvZmYpIgotZWkzODZnbzMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZnbzMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmdvMzIgIiQodGRpcl9pMzg2Z28zMikiCi1laTM4NmxpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZsaW51eCAiJCh0ZGlyX2kzODZsaW51eCkiCi1laTM4Nmx5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bHlueCAiJCh0ZGlyX2kzODZseW54KSIKLWVpMzg2bWFjaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bWFjaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1hY2ggIiQodGRpcl9pMzg2bWFjaCkiCi1laTM4Nm1vc3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1vc3MgIiQodGRpcl9pMzg2bW9zcykiCi1laTM4Nm1zZG9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bXNkb3MgIiQodGRpcl9pMzg2bXNkb3MpIgotZWkzODZuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bmJzZCAiJCh0ZGlyX2kzODZuYnNkKSIKLWVpMzg2bncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm53LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZudyAiJCh0ZGlyX2kzODZudykiCi1laTM4NnBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2cGUgIiQodGRpcl9pMzg2cGUpIgotZWxuazk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9sbms5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xuazk2MC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbG5rOTYwICIkKHRkaXJfbG5rOTYwKSIKLWVtNjhrNGtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGs0a25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGs0a25ic2QgIiQodGRpcl9tNjhrNGtuYnNkKSIKLWVtNjhrYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2FvdXQgIiQodGRpcl9tNjhrYW91dCkiCi1lbTY4a2F1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrYXV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrYXV4ICIkKHRkaXJfbTY4a2F1eCkiCi1lbTY4a2NvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrY29mZiAiJCh0ZGlyX202OGtjb2ZmKSIKLWVtNjhrZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtlbGYgIiQodGRpcl9tNjhrZWxmKSIKLWVtNjhrbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2xpbnV4ICIkKHRkaXJfbTY4a2xpbnV4KSIKLWVtNjhrbHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtseW54ICIkKHRkaXJfbTY4a2x5bngpIgotZW02OGtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbmJzZCAiJCh0ZGlyX202OGtuYnNkKSIKLWVtNjhrcHNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrcHNvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Bzb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtwc29zICIkKHRkaXJfbTY4a3Bzb3MpIgotZW04OGtiY3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTg4a2JjcyAiJCh0ZGlyX204OGtiY3MpIgotZW1jb3JlcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWNvcmVwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtY29yZXBlICIkKHRkaXJfbWNvcmVwZSkiCi1lbWlwc2JpZy5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2JpZy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2JpZwotZW1pcHNic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2JzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2JzZAotZW1pcHNpZHQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2lkdC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzaWR0ICIkKHRkaXJfbWlwc2lkdCkiCi1lbWlwc2lkdGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2lkdGwgIiQodGRpcl9taXBzaWR0bCkiCi1lbWlwc2xpdC5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2xpdC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2xpdCAiJCh0ZGlyX21pcHNsaXQpIgotZW1pcHNsbmV3cy5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzbG5ld3MKLWVtbjEwMzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21uMTAzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1uMTAzMDAgIiQodGRpcl9tbjEwMzAwKSIKLWVtbjEwMjAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21uMTAyMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1uMTAyMDAgIiQodGRpcl9tbjEwMjAwKSIKLWVuZXdzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL25ld3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG5ld3MgIiQodGRpcl9uZXdzKSIKLWVuczMya25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBuczMya25ic2QgIiQodGRpcl9uczMya25ic2QpIgotZXBjNTMybWFjaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcGM1MzJtYWNoYSAiJCh0ZGlyX3BjNTMybWFjaGEpIgotZXBwY21hY29zLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY21hY29zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjbWFjb3MgIiQodGRpcl9wcGNtYWNvcykiCi1lcHBjbncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbncuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9udy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjbncgIiQodGRpcl9wcGNudykiCi1lcHBjcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wcGNwZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjcGUgIiQodGRpcl9wcGNwZSkiCi1lcmlzY2l4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3Jpc2NpeC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcmlzY2l4ICIkKHRkaXJfcmlzY2l4KSIKLWVzYTI5MjAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NhMjkyMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNhMjkyMDAgIiQodGRpcl9zYTI5MjAwKSIKLWVzaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNoICIkKHRkaXJfc2gpIgotZXNoZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGVsZiAiJCh0ZGlyX3NoZWxmKSIKLWVzaGxlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGxlbGYgIiQodGRpcl9zaGxlbGYpIgotZXNobC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGwgIiQodGRpcl9zaGwpIgotZXNwYXJjYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjYW91dCAiJCh0ZGlyX3NwYXJjYW91dCkiCi1lc3BhcmNsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNsaW51eCAiJCh0ZGlyX3NwYXJjbGludXgpIgotZXNwYXJjbHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2x5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNseW54ICIkKHRkaXJfc3BhcmNseW54KSIKLWVzcGFyY25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY25ic2QgIiQodGRpcl9zcGFyY25ic2QpIgotZXN0MjAwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdDIwMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3N0MjAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3QyMDAwICIkKHRkaXJfc3QyMDAwKSIKLWVzdW4zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N1bjMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3N1bm9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdW4zICIkKHRkaXJfc3VuMykiCi1lc3VuNC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW40LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3VuNCAiJCh0ZGlyX3N1bjQpIgotZXRpYzMwYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWMzMGFvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljMzBhb3V0ICIkKHRkaXJfdGljMzBhb3V0KSIKLWV0aWMzMGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzMwY29mZiAiJCh0ZGlyX3RpYzMwY29mZikiCi1ldGljODBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzgwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWM4MGNvZmYgIiQodGRpcl90aWM4MGNvZmYpIgotZXZhbmlsbGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmFuaWxsYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvdmFuaWxsYS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdmFuaWxsYSAiJCh0ZGlyX3ZhbmlsbGEpIgotZXZheC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92YXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZheCAiJCh0ZGlyX3ZheCkiCi1ldnN0YS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92c3RhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2c3RhICIkKHRkaXJfdnN0YSkiCi1ldjg1MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92ODUwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdjg1MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdjg1MCAiJCh0ZGlyX3Y4NTApIgotZXc2NS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy93NjUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3c2NS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdzY1ICIkKHRkaXJfdzY1KSIKLWV6ODAwMS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHo4MDAxICIkKHRkaXJfejgwMDEpIgotZXo4MDAyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3o4MDAyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC96ODAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gejgwMDIgIiQodGRpcl96ODAwMikiCi0KLSMgVGhlIGdlbmVyYXRlZCBlbXVsYXRpb24gZmlsZXMgbW9zdGx5IGhhdmUgdGhlIHNhbWUgZGVwZW5kZW5jaWVzLgotJChFTVVMQVRJT05fT0ZJTEVTKTogLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWFpbi5oIGxkZW11bC5oIGxkZmlsZS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZGN0b3IuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZ3JhbS5oCi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0Jc3Jjcm9vdD1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNyb290OyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNyb290fS90ZXN0c3VpdGUgXAotCQlDQz0iJChDQ19GT1JfVEFSR0VUKSIgQ0ZMQUdTPSIkKENGTEFHUykiIFwKLQkJQ1hYPSIkKENYWF9GT1JfVEFSR0VUKSIgQ1hYRkxBR1M9IiQoQ1hYRkxBR1MpIiBcCi0JCUNDX0ZPUl9IT1NUPSIkKENDKSIgQ0ZMQUdTX0ZPUl9IT1NUPSIkKENGTEFHUykiIFwKLQkJT0ZJTEVTPSIkKE9GSUxFUykiIEJGRExJQj0iJChURVNUQkZETElCKSIgXAotCQlMSUJJQkVSVFk9IiQoTElCSUJFUlRZKSAkKElOVExMSUJTKSIgXAotCQkkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLSMgUnVsZXMgZm9yIHRlc3RpbmcgYnkgcmVsaW5raW5nIGxkIGl0c2VsZi4KLSMgQSBzaW1pbGFyIHRlc3QgaXMgaW4gdGhlIHRlc3RzdWl0ZS4gIFRoaXMgdGFyZ2V0IGlzIGZvciBlYXNlIG9mIHVzZQotIyB3aGVuIHBvcnRpbmcgbGQuCi0KLWxkLXBhcnRpYWwubzogbGQtbmV3JChFWEVFWFQpCi0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQtcGFydGlhbC5vIC1yICQoT0ZJTEVTKQotbGQxJChFWEVFWFQpOiBsZC1wYXJ0aWFsLm8KLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApIGxkLXBhcnRpYWwubyAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQxLWZ1bGwkKEVYRUVYVCk6IGxkLW5ldwotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMS1mdWxsJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWxkMiQoRVhFRVhUKTogbGQxJChFWEVFWFQpCi0JLi9sZDEkKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQyJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWxkMyQoRVhFRVhUKTogbGQyJChFWEVFWFQpCi0JLi9sZDIkKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQzJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWJvb3RzdHJhcDogbGQzJChFWEVFWFQpCi0JY21wIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkKLQotLlBIT05ZOiBib290c3RyYXAKLQotIyBBIHRlc3QgcHJvZ3JhbSBmb3IgQysrIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuCi0jIFRoaXMgdGVzdCBpcyBub3cgaW4gdGhlIHRlc3RzdWl0ZS4KLSMKLSNjZHRlc3Q6IGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyBsZC5uZXcKLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0ICQoSE9TVElOR19DUlQwKSBcCi0jCSAgY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vICQoSE9TVElOR19MSUJTKQotIwotI2NkdGVzdC5vdXQ6IGNkdGVzdAotIwkuL2NkdGVzdCA+IGNkdGVzdC50bXAKLSMJbXYgY2R0ZXN0LnRtcCBjZHRlc3Qub3V0Ci0jCi0jY2R0ZXN0LXVyLm86IGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyBsZC5uZXcKLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0LXVyLm8gLVVyIGNkdGVzdC1tYWluLm8gXAotIwkgIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8KLSMKLSNjZHRlc3QtdXI6IGNkdGVzdC11ci5vCi0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ciAkKEhPU1RJTkdfQ1JUMCkgY2R0ZXN0LXVyLm8gXAotIwkgICQoSE9TVElOR19MSUJTKQotIwotI2NkdGVzdC11ci5vdXQ6IGNkdGVzdC11cgotIwkuL2NkdGVzdC11ciA+IGNkdGVzdC11ci50bXAKLSMJbXYgY2R0ZXN0LXVyLnRtcCBjZHRlc3QtdXIub3V0Ci0jCi0jY2hlY2stY2R0ZXN0OiBjZHRlc3Qub3V0IGNkdGVzdC11ci5vdXQgJChzcmNkaXIpL2NkdGVzdC5leHAKLSMJZGlmZiAkKHNyY2RpcikvY2R0ZXN0LmV4cCBjZHRlc3Qub3V0Ci0jCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0LXVyLm91dAotIwotIy5QSE9OWTogY2hlY2stY2R0ZXN0Ci0KLSMgRU5EIE9GIENIRUNLIFRBUkdFVFMKLQotIyBET0NVTUVOVEFUSU9OIFRBUkdFVFMKLSMgTWFudWFsIGNvbmZpZ3VyYXRpb24gZmlsZTsgbm90IHVzdWFsbHkgYXR0YWNoZWQgdG8gbm9ybWFsIGNvbmZpZ3VyYXRpb24sCi0jIGJlY2F1c2UgYWxtb3N0IGFsbCBjb25maWdzIHVzZSAiZ2VuIiB2ZXJzaW9uIG9mIG1hbnVhbC4KLSMgIFNldCBET0NWRVIgYWJvdmUgdG8gY2hhbmdlLgotY29uZmlnZG9jLnRleGk6CSR7RE9DVkVSfS1kb2MudGV4aQotCWxuIC1zICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgbG4gJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBjcCAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkKLQotbGR2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWxkLmluZm86ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtSSAkKEJGRERJUikvZG9jICQoc3JjZGlyKS9sZC50ZXhpbmZvCi0KLWxkLmR2aTogJChzcmNkaXIpL2xkLnRleGluZm8gY29uZmlnZG9jLnRleGkgbGR2ZXIudGV4aQotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm86JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89IiQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtSSAkKEJGRERJUikvZG9jIiAkKFRFWEkyRFZJKSAkKHNyY2RpcikvbGQudGV4aW5mbwotCi0jIFdlIHdhbnQgdG8gcmVjb25maWd1cmUgaWYgY29uZmlndXJlLmhvc3Qgb3IgY29uZmlndXJlLnRndCBjaGFuZ2VzLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlndXJlLmhvc3QgJChzcmNkaXIpL2NvbmZpZ3VyZS50Z3QKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBsZC1uZXckKEVYRUVYVCkKLQkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKSAkKHRvb2xkaXIpL2JpbgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCW49YGVjaG8gbGQgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgbGQtbmV3JChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCi0JZmkKLQotaW5zdGFsbC1kYXRhLWxvY2FsOgotCSQobWtpbnN0YWxsZGlycykgJChzY3JpcHRkaXIpL2xkc2NyaXB0cwotCWZvciBmIGluIGxkc2NyaXB0cy8qOyBkbyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmICQoc2NyaXB0ZGlyKS8kJGYgOyBcCi0JZG9uZQotZGlzdHN0dWZmOiAkKExERElTVFNUVUZGKSBpbmZvCi1kaXN0Y2xlYW4tbG9jYWw6Ci0Jcm0gLXJmIGxkc2NyaXB0cwotCi0jIFRhcmdldHMgdG8gcmVidWlsZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBNYWtlZmlsZS4KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIC5kZXAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi0uZGVwOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgLmRlcDEKLQkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKLQlzZWQgLWYgZGVwLnNlZCA8LmRlcDEgPi5kZXAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLS5kZXAxOiAkKENGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKQotCXJtIC1mIC5kZXAyCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgotCSQoREVQKSAtZiAuZGVwMiAkKElOQ0xVREVTKSAkPwotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1sZGN0b3IubzogbGRjdG9yLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oIGxkY3Rvci5oCi1sZGVtdWwubzogbGRlbXVsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkZW11bC5oIFwKLSAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZG1haW4uaCBsZGVtdWwtbGlzdC5oCi1sZGV4cC5vOiBsZGV4cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBsZGdyYW0uaCBsZGxhbmcuaAotbGRmaWxlLm86IGxkZmlsZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZG1haW4uaCBsZGdyYW0uaCBcCi0gIGxkbGV4LmggbGRlbXVsLmgKLWxkbGFuZy5vOiBsZGxhbmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRncmFtLmggbGRleHAuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGxleC5oIGxkbWlzYy5oIFwKLSAgbGRjdG9yLmggbGRmaWxlLmggJChJTkNESVIpL2ZubWF0Y2guaAotbGRtYWluLm86IGxkbWFpbi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL3Byb2dyZXNzLmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRtaXNjLmggbGR3cml0ZS5oIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggXAotICBsZGxleC5oIGxkZmlsZS5oIGxkY3Rvci5oCi1sZG1pc2MubzogbGRtaXNjLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZGdyYW0uaCBsZGxleC5oIGxkbWFpbi5oIGxkZmlsZS5oCi1sZHZlci5vOiBsZHZlci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZHZlci5oIFwKLSAgbGRlbXVsLmggbGRtYWluLmgKLWxkd3JpdGUubzogbGR3cml0ZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGR3cml0ZS5oIFwKLSAgbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmgKLWxleHN1cC5vOiBsZXhzdXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZ3JhbS5oIGxkbGV4LmggbGRmaWxlLmggXAotICBsZHZlci5oIGxkZW11bC5oCi1tcmkubzogbXJpLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZG1pc2MuaCBtcmkuaCBsZGdyYW0uaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWxkY3JlZi5vOiBsZGNyZWYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZG1haW4uaCBsZG1pc2MuaCBsZGV4cC5oIFwKLSAgbGRsYW5nLmgKLXBlLWRsbC5vOiBwZS1kbGwuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCi0gIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oIGxkZW11bC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAuLi9iZmQvbGliY29mZi5oIGRlZmZpbGUuaAotbGRncmFtLm86IGxkZ3JhbS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRleHAuaCBsZHZlci5oIGxkbGFuZy5oIGxkZW11bC5oIGxkZmlsZS5oIGxkbWlzYy5oIFwKLSAgbGRtYWluLmggbXJpLmggbGRjdG9yLmggbGRsZXguaAotbGRsZXgubzogbGRsZXguYyAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIGxkLmggbGRncmFtLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZGxleC5oIFwKLSAgbGRtYWluLmgKLWRlZmZpbGVwLm86IGRlZmZpbGVwLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBsZC5oIGxkbWlzYy5oIGRlZmZpbGUuaAotCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbGQvTkVXUyBiL2xkL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Nzg5MGUuLjAwMDAwMDAKLS0tIGEvbGQvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0tKi0gdGV4dCAtKi0KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMTA6Ci0KLSogQWRkZWQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHVudXNlZCBzZWN0aW9ucywgZW5hYmxlZCBieSAtLWdjLXNlY3Rpb25zLiAKLSAgSXQgZG9lcyByZXF1aXJlIGEgYml0IG9mIGJhY2tlbmQgc3VwcG9ydDsgY3VycmVudGx5IGltcGxlbWVudGVkIGFyZQotICBwcGMtZWxmLCBtaXBzLWVsZiwgYW5kIG1uMTAzMDAtZWxmLiAgT3RoZXJzIHdpbGwgaWdub3JlIHRoZSBvcHRpb24uCi0KLSogQWRkZWQgU09SVCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSB0byBwZXJtaXQgc29ydGluZyBzZWN0aW9ucyBieSBmaWxlCi0gIG5hbWUgb3Igc2VjdGlvbiBuYW1lLgotCi0qIEFkZGVkIEVYVEVSTiB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSBhcyBhbiBlcXVpdmFsZW50IHRvIHRoZSAtdQotICBjb21tYW5kLWxpbmUgb3B0aW9uLgotCi0qIEFkZGVkIEFTU0VSVCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBBZGRlZCBFWENMVURFX0ZJTEUgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgZm9yIGZ1cnRoZXIgY29udHJvbCBvdmVyCi0gIHdpbGRjYXJkIGZpbGUgbmFtZXMuCi0KLSogQWRkZWQgLU8gb3B0aW9uIHRvIG9wdGltaXplIGxpbmtlciBvdXRwdXQgKGFzIG9mIHRoaXMgd3JpdGluZywgdGhpcyBvbmx5Ci1hZmZlY3RzIEVMRiBzaGFyZWQgbGlicmFyeSBnZW5lcmF0aW9uKS4KLQotKiBUaGUgLWUgb3B0aW9uIG5vdyBhY2NlcHRzIGEgbnVtYmVyIGFzIHdlbGwgYXMgYSBzeW1ib2wgbmFtZS4KLQotKiBBZGRlZCAtLW5vLXVuZGVmaW5lZCBvcHRpb24gdG8gZGlzYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMgd2hlbiBjcmVhdGluZyBhCi0gIHNoYXJlZCBsaWJyYXJ5LgotCi0qIEFkZGVkIC0tZGVtYW5nbGUgYW5kIC0tbm8tZGVtYW5nbGUgb3B0aW9ucy4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuOToKLQotKiBBZGRlZCBTUVVBRCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBOZXcgb3B0aW9uIC0tbm8td2Fybi1taXNtYXRjaC4KLQotKiBUaGUgTUVNT1JZIGNvbW1hbmQgbm93IHBhcnNlcyB0aGUgYXR0cmlidXRlcyB0byBkZXRlcm1pbmUgd2hlcmUgc2VjdGlvbnMgdGhhdAotICBhcmUgbm90IHBsYWNlZCBpbiBhIHNwZWNpZmljIG1lbW9yeSByZWdpb24gYXJlIHBsYWNlZC4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuODoKLQotKiBMaW5rZXIgc2NyaXB0cyBtYXkgbm93IGNvbnRhaW4gc2hlbGwgd2lsZGNhcmQgY2hhcmFjdGVycyBmb3IgZmlsZSBhbmQgc2VjdGlvbgotICBuYW1lcy4KLQotKiBUaGUgbGlua2VyIG5vdyBzdXBwb3J0cyBzeW1ib2wgdmVyc2lvbnMgaW4gRUxGLgotCi0qIFRoZSBOT0NST1NTUkVGUyBjb21tYW5kIHdhcyBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBUaGUgTE9BREFERFIgZXhwcmVzc2lvbiB3YXMgYWRkZWQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogTUFYIGFuZCBNSU4gZnVuY3Rpb25zIHdlcmUgYWRkZWQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogVGhlIE9WRVJMQVkgY29uc3RydWN0IHdhcyBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBOZXcgb3B0aW9uIC0td2Fybi1zZWN0aW9uLWFsaWduIHRvIHdhcm4gd2hlbiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbgotICBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQgb2YgYW4gaW5wdXQgc2VjdGlvbi4KLQotKiBOZXcgb3B0aW9ucyAtLWZpbHRlci8tRiBhbmQgLS1hdXhpbGlhcnkvLWYuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjc6Ci0KLSogTmV3IG9wdGlvbiAtLWNyZWYgdG8gcHJpbnQgb3V0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLgotCi0qIE5ldyBvcHRpb24gLS13cmFwIFNZTUJPTC4KLQotKiBOZXcgb3B0aW9uIC0tbm8td2hvbGUtYXJjaGl2ZSwgdG8gdHVybiBvZmYgdGhlIGVmZmVjdCBvZiAtLXdob2xlLWFyY2hpdmUuCi0KLSogSW5wdXQgc2VjdGlvbnMgYXNzaWduZWQgdG8gdGhlIG91dHB1dCBzZWN0aW9uIC9ESVNDQVJELyBpbiB0aGUgbGlua2VyIHNjcmlwdAotICBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotKiBUaGUgU3VuT1MgYW5kIEVMRiBsaW5rZXJzIG5vdyBtZXJnZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hpY2ggdXNlcwotICB0aGUgTl9CSU5DTCBhbmQgTl9FSU5DTCBzdGFiIHR5cGVzLiAgVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nCi0gIGluZm9ybWF0aW9uIGdlbmVyYXRlZC4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuNjoKLQotKiBXaGVuIGFuIEVMRiBzZWN0aW9uIG5hbWUgaXMgcmVwcmVzZW50YWJsZSBhcyBhIEMgaWRlbnRpZmllciAodGhpcyBpcyBub3QgdHJ1ZQotb2YgbW9zdCBFTEYgc2VjdGlvbiBuYW1lcyksIHRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRlZmluZSBzeW1ib2xzCi1fX3N0YXJ0X1NFQ05BTUUgYW5kIF9fc3RvcF9TRUNOQU1FLCB3aGVyZSBTRUNOQU1FIGlzIHRoZSBzZWN0aW9uIG5hbWUsIGF0IHRoZQotYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IGdsaWJjLgotCi0qIFdoZW4gYW4gRUxGIHNlY3Rpb24gbmFtZWQgLmdudS53YXJuaW5nIGlzIGVuY291bnRlcmVkIGluIGFuIGlucHV0IGZpbGUsIHRoZQotY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXJlIGRpc3BsYXllZCBhcyBhbiBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIHNlY3Rpb24gaXMKLW5vdCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHVzZWQgYnkgZ2xpYmMuCi0KLSogV2hlbiBhbiBFTEYgc2VjdGlvbiBuYW1lZCAuZ251Lndhcm5pbmcuU1lNQk9MIGlzIGVuY291bnRlcmVkIGluIGFuIGlucHV0Ci1maWxlLCBhbmQgdGhlIHN5bWJvbCBTWU1CT0wgaXMgcmVmZXJlbmNlZCBieSBzb21lIG9iamVjdCBmaWxlLCB0aGUgY29udGVudHMgb2YKLXRoZSBzZWN0aW9uIGFyZSBkaXNwbGF5ZWQgYXMgYW4gZXJyb3IgbWVzc2FnZS4gIFRoZSBzZWN0aW9uIGlzIG5vdCBjb3BpZWQgaW50bwotdGhlIG91dHB1dCBmaWxlLCB1bmxlc3MgZG9pbmcgYSByZWxvY2F0ZWFibGUgb3Igc2hhcmVkIGxpbmsuICBUaGlzIGlzIHVzZWQgYnkKLWdsaWJjLgotCi0qIE5ldyBvcHRpb25zIC1zcGxpdC1ieS1yZWxvYyBhbmQgLXNwbGl0LWJ5LWZpbGUuCi0KLSogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgbGlua2luZyBQSUMgY29tcGlsZWQgY29kZSBvbiBTUEFSQyBTdW5PUy4gIEl0IGNhbgotYWxzbyBjcmVhdGUgU1BBUkMgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kLCBsaWtlIHRoZSBuYXRpdmUgU3VuT1MgbGlua2VyLAotd2lsbCBkbyBzbyB3aGVuZXZlciB0aGVyZSBpcyBhbiB1bmRlZmluZWQgc3ltYm9sIGluIHRoZSBsaW5rIGFuZCBuZWl0aGVyIHRoZSAtZQotbm9yIHRoZSAtciBvcHRpb24gd2FzIHVzZWQuCi0KLSogVGhlIC1ycGF0aCBvcHRpb24gbWF5IGJlIHVzZWQgb24gU3VuT1MgdG8gc2V0IHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGJlCi1zZWFyY2hlZCBhdCBydW4gdGltZS4gIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IG9mIGJ1aWxkaW5nIHRoZSBsaXN0IGZyb20gdGhlCi0tTCBvcHRpb25zLgotCi0qIFRoZSBDT0ZGIGxpbmtlciBub3cgY29tYmluZXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBzdHJ1Y3RzLCB1bmlvbnMsIGFuZAotZW51bXMsIHNvIHRoYXQgZXZlbiBpZiB0aGUgc2FtZSB0eXBlIGlzIGRlZmluZWQgaW4gbXVsdGlwbGUgaW5wdXQgZmlsZXMgaXQgd2lsbAotb25seSBiZSBkZWZpbmVkIG9uY2UgaW4gdGhlIG91dHB1dCBmaWxlLiAgVGhlIC0tdHJhZGl0aW9uYWwtZm9ybWF0IHN3aXRjaCB3aWxsCi1wcmV2ZW50IHRoaXMgb3B0aW1pemF0aW9uLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi41OgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIGxpbmtpbmcgYWdhaW5zdCBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLiAgSXQgc3RpbGwgY2FuCi1ub3QgbGluayBTdW5PUyBQSUMgKFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUpIGZpbGVzLCBzbyBpdCBjYW4gbm90IGJlIHVzZWQgdG8KLWdlbmVyYXRlIHNoYXJlZCBsaWJhcmllcy4KLQotKiBUaGUgbGlua2VyIG5vdyBzdXBwb3J0cyBsaW5raW5nIGFnYWluc3QgRUxGIHNoYXJlZCBsaWJyYXJpZXMgZm9yIHRoZSBpMzg2Ci0oVW5peFdhcmUpIGFuZCBTUEFSQyAoU29sYXJpcykuICBJdCBjYW4gYWxzbyBsaW5rIEVMRiBQSUMgZmlsZXMsIGFuZCBjYW4gYmUKLXVzZWQgdG8gZ2VuZXJhdGUgc2hhcmVkIGxpYnJhcmllcy4gIFNoYXJlZCBsaWJyYXJ5IGdlbmVyYXRpb24gaXMgbm90IHdlbGwKLXRlc3RlZDsgcGxlYXNlIHJlcG9ydCBhbnkgcHJvYmxlbXMgZW5jb3VudGVyZWQuICBUaGUgbGlua2VyIGlzIG5vdyBlbmFibGVkIGZvcgotU29sYXJpcyBhZ2Fpbi4KLQotKiBFcmljIFlvdW5nZGFsZSBoYXMgY29udHJpYnV0ZWQgTGludXggc3VwcG9ydCBjb2RlLCBpbmNsdWRpbmcgbGlua2luZyBhZ2FpbnN0Ci1MaW51eCBhLm91dCBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIGxpbmtlciBwcm9kdWNlcyBMaW51eCBRTUFHSUMgYmluYXJpZXMuCi0KLSogVGhlIEVMRiBiYWNrZW5kIGhhcyBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGxpbmtlciBjb2RlLiAgVG8gdXNlIHRoZSBuZXcKLUVMRiBsaW5rZXIsIGVhY2ggcGFydGljdWxhciB0YXJnZXQgcmVxdWlyZXMgYSByZWxvY2F0aW9uIGZ1bmN0aW9uLiAgU28gZmFyLAotdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB3cml0dGVuIGZvciBpMzg2IChVbml4V2FyZSksIFNQQVJDIChTb2xhcmlzKSBNSVBTIChJcml4Ci01KSwgYW5kIEhQUEEgRUxGIHRhcmdldHMuCi0KLSogVGhlIC0oICgtLXN0YXJ0LWdyb3VwKSBhbmQgLSkgKC0tZW5kLWdyb3VwKSBvcHRpb25zIGhhdmUgYmVlbiBhZGRlZCB0bwotc3VwcG9ydCBzZWFyY2hpbmcgYSBncm91cCBvZiBhcmNoaXZlcyBhcyB0aG91Z2ggdGhleSB3ZXJlIGEgc2luZ2xlIGFyY2hpdmUuCi1UaGlzIGNhbiBhbHNvIGJlIHVzZWQgaW4gYSBsaW5rZXIgc2NyaXB0LCBhcyBHUk9VUCAoIGZpbGVzICkuCi0KLSogV2hlbiBhIGZpbGUgaXMgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZSBsaW5rZXIgZG9lcyBub3QgcmVjb2duaXplCi1pdCBhcyBhbiBvYmplY3QgZmlsZSwgdGhlIGxpbmtlciB3aWxsIG5vdyB0cmVhdCB0aGUgZmlsZSBhcyBhIGxpbmtlciBzY3JpcHQKLWZpbGUuICBBIGxpbmtlciBzY3JpcHQgbmFtZWQgaW4gdGhpcyB3YXkgYXVnbWVudHMsIGJ1dCBkb2VzIG5vdCByZXBsYWNlLCB0aGUKLWRlZmF1bHQgbGlua2VyIHNjcmlwdC4KLQotKiBUaGUgLXdhcm4tb25jZSBvcHRpb24gd2FzIGFkZGVkLiAgSXQgY2F1c2VzIHRoZSBsaW5rZXIgdG8gb25seSB3YXJuIG9uY2UgcGVyCi11bmRlZmluZWQgc3ltYm9sLCByYXRoZXIgdGhhbiBvbmNlIHBlciByZWZlcmVuY2UuCi0KLSogVGhlIENPRkYgYmFja2VuZCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBsaW5rZXIgY29kZS4gIEFzIHdpdGggRUxGLCB0bwotdXNlIHRoZSBuZXcgbGlua2VyLCBlYWNoIHBhcnRpY3VsYXIgdGFyZ2V0IHJlcXVpcmVzIGEgcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFNvCi1mYXIsIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gd3JpdHRlbiBmb3IgdGhlIGkzODYsIG02OGssIGEyOWsgYW5kIFNIIHRhcmdldHMuCi0KLSogVGhlIC1WIGZsYWcgd2FzIG1hZGUgYSBzeW5vbnltIGZvciAtdiwgZm9yIFNWUjQgY29tcGF0aWJpbGl0eS4gIFRoZSBvbGQgLVYKLWJlaGF2aW91ciBpcyBhdmFpbGFibGUgdmlhIC0tdmVyYm9zZS4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuNDoKLQotKiBOZXcgbGlua2VyIGNvZGUsIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGFuZCBJYW4gVGF5bG9yLiAgRm9yIGEub3V0IGFuZCBlY29mZgotICBmb3JtYXRzIChzbyBmYXIpLCB0aGlzIHNob3VsZCByZXN1bHQgaW4gY29uc2lkZXJhYmxlIHNhdmluZ3MgaW4gdGltZQotICBhbmQgbWVtb3J5IHVzZWQgd2hpbGUgbGlua2luZzsgc2xpZ2h0bHkgcG9vcmVyIHBlcmZvcm1hbmNlIHRoYW4KLSAgYmVmb3JlIGZvciBmb3JtYXRzIG5vdCBjb252ZXJ0ZWQgeWV0LgotCi0qIENvbW1hbmQtbGluZSBwYXJzaW5nIGlzIG5vIGxvbmdlciBkb25lIHdpdGggZmxleC4gIFRoaXMgbWVhbnMKLSAgb2RkYmFsbCBjaGFyYWN0ZXJzIGluIGZpbGVuYW1lcyB3b24ndCBnZXQgdHJlYXRlZCBhcyBhcmd1bWVudAotICBzZXBhcmF0b3JzLgotCi0qIEhQLVBBIEVMRiBzdXBwb3J0LCBieSBKZWZmIExhdy4gIChObyBTT00gc3VwcG9ydCB5ZXQuKQotCi0qIE1hY2ggaTM4NiBzdXBwb3J0LCBieSBEYXZpZCBNYWNrZW56aWUuCi0KLSogSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdyBzdXBwb3J0ZWQgKElyaXggNSB1c2VzIEVMRiwgYW5kIEVMRiBzaGFyZWQKLSAgbGlicmFyaWVzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCkuCi0KLSogQ09GRiBzaGFyZWQgbGlicmFyaWVzIChhcyBvbiBTQ08pIHNob3VsZCB3b3JrIGFzIHdlbGwuCi0KLSogVGhlIGxpbmtlciBpcyBkaXNhYmxlZCBmb3IgU29sYXJpcy4gIChBY3R1YWxseSwgaXQgd2FzIGluIDIuMyBhbHNvLCBJIGp1c3QKLSAgZm9yZ290IHRvIG5vdGUgaXQuKSAgU29tZSBvZiB0aGVpciBDIGxpYnJhcnkgcm91dGluZXMgZG9uJ3Qgd29yayB3aGVuCi0gIHN0YXRpY2FsbHkgbGlua2VkLCBhbmQgdGhlIEdOVSBsaW5rZXIgZG9lc24ndCBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB5ZXQuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjM6Ci0KLSogV2VhayBzeW1ib2xzIGFyZSBub3cgc3VwcG9ydGVkLgotCi0qIEVMRiBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiAgVGhlIGxpbmtlciBoYXMgYmVlbiBib290c3RyYXBwZWQgb24KLSAgVW5peFdhcmUgYW5kIFNvbGFyaXMuCi0KLSogQWxwaGEgT1NGLzEgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCAobm9uIGR5bmFtaWMgbGlua2luZyBvbmx5KS4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMjoKLQotKiBUaGUgYGJmZCcgbGlicmFyeSBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZHVjZSBhLm91dC1mb3JtYXQgc3RyaW5nCi0gIHRhYmxlIHNpemUuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCBmaWxlcyBsaW5rZWQgZnJvbSBtYW55IGlucHV0Ci0gIGZpbGVzIHdpdGggZHVwbGljYXRlIHN5bWJvbHMgKGAtZycgZGVidWdnaW5nIHJlY29yZHMsIG9yIGlkZW50aWNhbAotICBzdGF0aWMgc3ltYm9scykgc2hvdWxkIGJlIG11Y2ggc21hbGxlci4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMToKLQotKiBUaGUgbGQgLXlTWU1CT0wgZmxhZyAodG8gdHJhY2UgcmVmZXJlbmNlcyB0byBTWU1CT0wpIGlzIG5vdyBpbXBsZW1lbnRlZC4KLQotKiBUaGVyZSBpcyBub3cgc3VwcG9ydCBmb3Igd3JpdGluZyBFQ09GRiBmaWxlcywgc28gbGQgYW5kIHRoZQotICBvdGhlciB1dGlsaXRpZXMgc2hvdWxkIHdvcmsgb24gUmlzYy9VbHRyaXggYW5kIElyaXguCi0KLQwKLUxvY2FsIHZhcmlhYmxlczoKLWZpbGwtY29sdW1uOiA3OQotRW5kOgpkaWZmIC0tZ2l0IGEvbGQvUkVBRE1FIGIvbGQvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTQ3ZDA0Li4wMDAwMDAwCi0tLSBhL2xkL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLVRoaXMgaXMgdGhlIEdOVSBsaW5rZXIuICBJdCBpcyBkaXN0cmlidXRlZCB3aXRoIG90aGVyICJiaW5hcnkKLXV0aWxpdGllcyIgd2hpY2ggc2hvdWxkIGJlIGluIC4uL2JpbnV0aWxzLiAgU2VlIC4uL2JpbnV0aWxzL1JFQURNRSBmb3IKLW1vcmUgZ2VuZXJhbCBub3RlcywgaW5jbHVkaW5nIHdoZXJlIHRvIHNlbmQgYnVnIHJlcG9ydHMuCi0KLVRoZXJlIGFyZSBtYW55IGZlYXR1cmVzIG9mIHRoZSBsaW5rZXI6Ci0KLSogVGhlIGxpbmtlciB1c2VzIGEgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5ICguLi9iZmQpCi0gIHRoYXQgaXQgdXNlcyB0byByZWFkIGFuZCB3cml0ZSBvYmplY3QgZmlsZXMuICBUaGlzIGhlbHBzCi0gIGluc3VsYXRlIHRoZSBsaW5rZXIgaXRzZWxmIGZyb20gdGhlIGZvcm1hdCBvZiBvYmplY3QgZmlsZXMuCi0KLSogVGhlIGxpbmtlciBzdXBwb3J0cyBhIG51bWJlciBvZiBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKLSAgZm9ybWF0cy4gIEl0IGNhbiBldmVuIGhhbmRsZSBtdWx0aXBsZSBmb3JtYXRzIGF0IG9uY2U6Ci0gIFJlYWQgdHdvIGlucHV0IGZvcm1hdHMgYW5kIHdyaXRlIGEgdGhpcmQuCi0KLSogVGhlIGxpbmtlciBjYW4gYmUgY29uZmlndXJlZCBmb3IgY3Jvc3MtbGlua2luZy4KLQotKiBUaGUgbGlua2VyIHN1cHBvcnRzIGEgY29udHJvbCBsYW5ndWFnZS4KLQotKiBUaGVyZSBpcyBhIHVzZXIgbWFudWFsIChsZC50ZXhpbmZvKSwgYXMgd2VsbCBhcyB0aGUKLSAgYmVnaW5uaW5ncyBvZiBhbiBpbnRlcm5hbHMgbWFudWFsIChsZGludC50ZXhpbmZvKS4KLQotSW5zdGFsbGF0aW9uCi09PT09PT09PT09PT0KLQotU2VlIC4uL2JpbnV0aWxzL1JFQURNRS4KLQotSWYgeW91IHdhbnQgdG8gbWFrZSBhIGNyb3NzLWxpbmtlciwgeW91IG1heSB3YW50IHRvIHNwZWNpZnkKLWEgZGlmZmVyZW50IHNlYXJjaCBwYXRoIG9mIC1sZm9vIGxpYnJhcmllcyB0aGFuIHRoZSBkZWZhdWx0LgotWW91IGNhbiBkbyB0aGlzIGJ5IHNldHRpbmcgdGhlIExJQl9QQVRIIHZhcmlhYmxlIGluIC4vTWFrZWZpbGUuCi0KLVRvIGJ1aWxkIGp1c3QgdGhlIGxpbmtlciwgbWFrZSB0aGUgdGFyZ2V0IGFsbC1sZCBmcm9tIHRoZSB0b3AgbGV2ZWwKLWRpcmVjdG9yeSAob25lIGRpcmVjdG9yeSBhYm92ZSB0aGlzIG9uZSkuCi0KLVBvcnRpbmcgdG8gYSBuZXcgdGFyZ2V0Ci09PT09PT09PT09PT09PT09PT09PT09PQotCi1TZWUgdGhlIGxkaW50LnRleGluZm8gbWFudWFsLgotCi1SZXBvcnRpbmcgYnVncyBldGMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TZWUgLi4vYmludXRpbHMvUkVBRE1FLgotCi1Lbm93biBwcm9ibGVtcwotPT09PT09PT09PT09PT0KLQotVGhlIFNvbGFyaXMgbGlua2VyIG5vcm1hbGx5IGV4cG9ydHMgYWxsIGR5bmFtaWMgc3ltYm9scyBmcm9tIGFuCi1leGVjdXRhYmxlLiAgVGhlIEdOVSBsaW5rZXIgZG9lcyBub3QgZG8gdGhpcyBieSBkZWZhdWx0LiAgVGhpcyBpcwotYmVjYXVzZSB0aGUgR05VIGxpbmtlciB0cmllcyB0byBwcmVzZW50IHRoZSBzYW1lIGludGVyZmFjZSBmb3IgYWxsCi1zaW1pbGFyIHRhcmdldHMgKGluIHRoaXMgY2FzZSwgYWxsIG5hdGl2ZSBFTEYgdGFyZ2V0cykuICBUaGlzIGRvZXMgbm90Ci1tYXR0ZXIgZm9yIG5vcm1hbCBwcm9ncmFtcywgYnV0IGl0IGNhbiBtYWtlIGEgZGlmZmVyZW5jZSBmb3IgcHJvZ3JhbXMKLXdoaWNoIHRyeSB0byBkbG9wZW4gYW4gZXhlY3V0YWJsZSwgc3VjaCBhcyBQRVJMIG9yIFRjbC4gIFlvdSBjYW4gbWFrZQotdGhlIEdOVSBsaW5rZXIgZXhwb3J0IGFsbCBkeW5hbWljIHN5bWJvbHMgd2l0aCB0aGUgLUUgb3IKLS0tZXhwb3J0LWR5bmFtaWMgY29tbWFuZCBsaW5lIG9wdGlvbi4KLQotSFAvVVggOS4wMSBoYXMgYSBzaGVsbCBidWcgdGhhdCBjYXVzZXMgdGhlIGxpbmtlciBzY3JpcHRzIHRvIGJlCi1nZW5lcmF0ZWQgaW5jb3JyZWN0bHkuICBUaGUgc3ltcHRvbSBvZiB0aGlzIGFwcGVhcnMgdG8gYmUgImZhdGFsIGVycm9yCi0tIHNjYW5uZXIgaW5wdXQgYnVmZmVyIG92ZXJmbG93IiBlcnJvciBtZXNzYWdlcy4gIFRoZXJlIGFyZSB2YXJpb3VzCi13b3JrYXJvdW5kcyB0byB0aGlzOgotICAqIEJ1aWxkIGFuZCBpbnN0YWxsIGJhc2gsIGFuZCBidWlsZCB3aXRoICJtYWtlIFNIRUxMPWJhc2giLgotICAqIFVwZGF0ZSB0byBhIHZlcnNpb24gb2YgSFAvVVggd2l0aCBhIHdvcmtpbmcgc2hlbGwgKGUuZy4sIDkuMDUpLgotICAqIFJlcGxhY2UgIiguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykiIGluCi0gICAgZ2Vuc2NyaXB0cy5zaCB3aXRoICJzaCAke3NyY2Rpcn0uLi4iIChubyBwYXJlbnMpIGFuZCBtYWtlIHN1cmUgdGhlCi0gICAgZW11bHBhcmFtcyBzY3JpcHQgdXNlZCBleHBvcnRzIGFueSBzaGVsbCB2YXJpYWJsZXMgaXQgc2V0cy4KZGlmZiAtLWdpdCBhL2xkL1RPRE8gYi9sZC9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWNkOThiLi4wMDAwMDAwCi0tLSBhL2xkL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVZvbHVudGVlcnMgdG8gdGFja2xlIHNvbWUgb2YgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSB3ZWxjb21lOgotCi1TdXBwb3J0IHRoZSAidHJhZGl0aW9uYWwiIEJTRCAgLUEgZmxhZyAoaW5jcmVtZW50YWwgbG9hZGluZykuCi0oVGhlcmUgaXMgYSAtQSBmbGFnIGluIGxkIG5vdywgYnV0IGl0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKLWFyY2hpdGVjdHVyZS4gIFRoYXQgc2hvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQuKQotCi1TdXBwb3J0IGZvciBkeW5hbWljIGxvYWRpbmcgKGEgbGEgZGxkLCBidXQgYmZkLWJhc2VkKSB3b3VsZCBiZSBuaWNlLgotCi1Bdm9pZCByZS1vcGVuIChhbmQgcmUtc2Vla2luZykgb3V0cHV0IGJmZCBhbmQgYXJjaGl2ZXMuCmRpZmYgLS1naXQgYS9sZC9hY2luY2x1ZGUubTQgYi9sZC9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvbGQvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKZGlmZiAtLWdpdCBhL2xkL2FjbG9jYWwubTQgYi9sZC9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTkzNGIwLi4wMDAwMDAwCi0tLSBhL2xkL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIwICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCi1bQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCi1bQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCi1bQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19TVUJTVChMRCkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1BQ19TVUJTVChOTSkKLV0pCi0KLSMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCi0jIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KLUFDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKLVsjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLWNoYW5nZXF1b3RlKCwpZG5sCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWNoYW5nZXF1b3RlKCwpZG5sCi1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLWNoYW5nZXF1b3RlKFssXSlkbmwKLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0JICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLUFDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKLV0pCi0KLSMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCi1BQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCi1bQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLUFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLV0pCi0KLSMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KLUFDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCi1bYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi1dKQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWwotQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKLUFDX0NIRUNLX0xJQihtLCBjb3MpCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKLSAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KLSAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7Ci0gICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OwotICAgIGVzYWMKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KLQotZG5sIEFNX1BST0dfTEVYCi1kbmwgTG9vayBmb3IgZmxleCwgbGV4IG9yIG1pc3NpbmcsIHRoZW4gcnVuIEFDX1BST0dfTEVYIGFuZCBBQ19ERUNMX1lZVEVYVAotQUNfREVGVU4oQU1fUFJPR19MRVgsCi1bbWlzc2luZ19kaXI9aWZlbHNlKFskMV0sLGBjZCAkYWNfYXV4X2RpciAmJiBwd2RgLCQxKQotQUNfQ0hFQ0tfUFJPR1MoTEVYLCBmbGV4IGxleCwgIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiKQotQUNfUFJPR19MRVgKLUFDX0RFQ0xfWVlURVhUXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlnLmluIGIvbGQvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDE1MDQ2Li4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiBsZXggZGVjbGFyZXMgeXl0ZXh0IGFzIGEgY2hhciAqIGJ5IGRlZmF1bHQsIG5vdCBhIGNoYXJbXS4gICovCi0jdW5kZWYgWVlURVhUX1BPSU5URVIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ESVJFTlRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBVc2UgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAqLwotI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4KLQotLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgZnJlZSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0KLS8qIERlZmluZSBpZiBnZXRlbnYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLQotLyogRGVmaW5lIGlmIGVudmlyb24gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi0KZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZSBiL2xkL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzA3NzIzNi4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQzICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9bGRtYWluLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA1OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyNjogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ0OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3OTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MzI6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzg5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1sZAotCi1WRVJTSU9OPTIuOS40Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODM1OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NjE6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODg3OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDAzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDMzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExNjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTEyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1ODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjM6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5MTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzQ6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1ODogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjYxOiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5NzogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxMzogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNTE6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTg6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1lY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUxNjogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTI4OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2Ci1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NTQ6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE1OTYgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYxODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfY2NfbmVlZHNfYmVsZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjUzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIERMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgbmVlZF9sb2Nrcz0kZW5hYmxldmFsCi1lbHNlCi0gIG5lZWRfbG9ja3M9eWVzCi1maQotCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS02NC1iaXQtYmZkIG9yIC0tZGlzYWJsZS02NC1iaXQtYmZkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlXzY0X2JpdF9iZmQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlXzY0X2JpdF9iZmQiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSAgd2FudDY0PXRydWUgIDs7Ci0gIG5vKSAgIHdhbnQ2ND1mYWxzZSA7OwotICAqKSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIDY0LWJpdC1iZmQgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWVsc2UKLSAgd2FudDY0PWZhbHNlCi1maQotCi0KLQotCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1pZiB0ZXN0IC16ICIkaG9zdCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTIxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTUxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAwMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAzNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjA0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3NjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODE6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwOTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwOTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTUyOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMDc6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIzOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI1NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4NzogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMwODogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMxMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMyMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM3NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MTI6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDY2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0ODc6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1MDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTI3OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NjA6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU2NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU5NTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2Mjg6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjYxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY5MzogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2OTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzIzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3NTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc3ODogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3ODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODMwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjgzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg0MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODY5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODc0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4OTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MjI6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5MzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDk4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEwODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE5NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNTc6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI2MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyNjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjkwOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMTA6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMyOTogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMzNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM1NjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzYxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzODQ6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzkyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQxOTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDI0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQzMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0OTM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0OTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU0ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1ODQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzYyNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcyNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgxNjogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg0NDogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODU0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkxNzogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzkyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkzMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk1MDogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk2MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTgxOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1mb3IgYWNfcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjCi1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ZQUNDPSIkWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVlBQ0M9IiRhY19jdl9wcm9nX1lBQ0MiCi1pZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRZQUNDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWZvciBhY19wcm9nIGluIGZsZXggbGV4Ci1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA1MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJExFWCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRMRVgiIHx8IExFWD0iIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImZsZXgiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9ImZsZXgiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0xFWCIgJiYgYWNfY3ZfcHJvZ19MRVg9ImxleCIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRMRVhMSUIiCi10aGVuCi0gIGNhc2UgIiRMRVgiIGluCi0gIGZsZXgqKSBhY19saWI9ZmwgOzsKLSAgKikgYWNfbGliPWwgOzsKLSAgZXNhYwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDEyMDogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQotYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbCRhY19saWIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDEyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHl5d3JhcCgpOwotCi1pbnQgbWFpbigpIHsKLXl5d3JhcCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDEzOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTEVYTElCPSItbCRhY19saWIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNjI6IGNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF9yb290JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGUgbWluaW1hbCBsZXggcHJvZ3JhbSBpcyBqdXN0IGEgc2luZ2xlIGxpbmU6ICUlLiAgQnV0IHNvbWUgYnJva2VuIGxleGVzCi0jIChTb2xhcmlzLCBJIHRoaW5rIGl0IHdhcykgd2FudCB0d28gJSUgbGluZXMsIHNvIGFjY29tbW9kYXRlIHRoZW0uCi1lY2hvICclJQotJSUnIHwgJExFWAotaWYgdGVzdCAtZiBsZXgueXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleC55eQotZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXh5eQotZWxzZQotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF9yb290IiAxPiY2Ci1MRVhfT1VUUFVUX1JPT1Q9JGFjX2N2X3Byb2dfbGV4X3Jvb3QKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTgzOiBjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBQT1NJWCBzYXlzIGxleCBjYW4gZGVjbGFyZSB5eXRleHQgZWl0aGVyIGFzIGEgcG9pbnRlciBvciBhbiBhcnJheTsgdGhlCi0jIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBGaWd1cmUgb3V0IHdoaWNoIGl0IGlzLCBzaW5jZQotIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KLWFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPW5vCi1lY2hvICdleHRlcm4gY2hhciAqeXl0ZXh0OycgPj4kTEVYX09VVFBVVF9ST09ULmMKLWFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSIkTElCUyAkTEVYTElCIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDE5NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1gY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2AKLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDIwMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLXJtIC1mICIke0xFWF9PVVRQVVRfUk9PVH0uYyIKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKLUVPRgotCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjI1OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi0KLQotCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjU5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDI2NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI2OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIHNicmsKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyOTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzMDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotYWNfaGVhZGVyX2RpcmVudD1ubwotZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNTU6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzYwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7Ci1ESVIgKmRpcnAgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNjg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLSMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KLWlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzOTM6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQwMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDEyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbGRpciIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0MzQ6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHggICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ0MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDUzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbHgiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cykKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9CSU5BUllfRk9QRU4gMQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQ4NjogY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0OTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3Ryc3RyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUxMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTMzOiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZyZWUKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTU5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDU4MDogY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zYnJrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzYnJrCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDYwNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc2JyayIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU0JSSyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYyNzogY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZ2V0ZW52Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY1MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZW52aXJvbiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Njc0OiBjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Njc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGVudmlyb24KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OIDEKLUVPRgotCi1maQotCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi1hbGxfdGFyZ2V0cz0KLUVNVUw9Ci1hbGxfZW11bHM9Ci1hbGxfZW11bF9leHRyYXM9Ci1hbGxfbGlicGF0aD0KLQotcm0gLWYgdGRpcnMKLQotZm9yIHRhcmdfYWxpYXMgaW4gYGVjaG8gJHRhcmdldF9hbGlhcyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotZG8KLSAgaWYgdGVzdCAiJHRhcmdfYWxpYXMiID0gImFsbCI7IHRoZW4KLSAgICBhbGxfdGFyZ2V0cz10cnVlCi0gIGVsc2UKLSAgICAjIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLSAgICByZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnX2FsaWFzIDI+L2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCi0JdGFyZz0kcmVzdWx0Ci0gICAgZWxzZQotCXRhcmc9JHRhcmdfYWxpYXMKLSAgICBmaQotCi0gICAgLiAke3NyY2Rpcn0vY29uZmlndXJlLnRndAotCi0gICAgaWYgdGVzdCAiJHRhcmciID0gIiR0YXJnZXQiOyB0aGVuCi0gICAgICBFTVVMPSR0YXJnX2VtdWwKLSAgICBmaQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZW11bCAkdGFyZ19leHRyYV9lbXVscyAkdGFyZ19leHRyYV9saWJwYXRoOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxzICIgaW4KLQkqIiBlJHtpfS5vICIqKSA7OwotCSopCi0JICBhbGxfZW11bHM9IiRhbGxfZW11bHMgZSR7aX0ubyIKLQkgIGV2YWwgcmVzdWx0PVwkdGRpcl8kaQotCSAgdGVzdCAteiAiJHJlc3VsdCIgJiYgcmVzdWx0PSR0YXJnX2FsaWFzCi0JICBlY2hvIHRkaXJfJGk9JHJlc3VsdCA+PiB0ZGlycwotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZW11bCAkdGFyZ19leHRyYV9saWJwYXRoOyBkbwotCWNhc2UgIiAkYWxsX2xpYnBhdGggIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGlmIHRlc3QgLXogIiRhbGxfbGlicGF0aCI7IHRoZW4KLQkgICAgYWxsX2xpYnBhdGg9JHtpfQotCSAgZWxzZQotCSAgICBhbGxfbGlicGF0aD0iJGFsbF9saWJwYXRoICR7aX0iCi0JICBmaQotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZXh0cmFfb2ZpbGVzOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxfZXh0cmFzICIgaW4KLQkqIiAke2l9ICIqKSA7OwotCSopCi0JICBhbGxfZW11bF9leHRyYXM9IiRhbGxfZW11bF9leHRyYXMgJHtpfSIKLQkgIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgZmkKLWRvbmUKLQotCi0KLVRESVJTPXRkaXJzCi0KLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZTsgdGhlbgotICBpZiB0ZXN0IHgke3dhbnQ2NH0gPSB4dHJ1ZTsgdGhlbgotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpICQoQUxMXzY0X0VNVUxBVElPTlMpJwotICBlbHNlCi0gICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUyknCi0gIGZpCi0gIEVNVUxfRVhUUkFfT0ZJTEVTPSckKEFMTF9FTVVMX0VYVFJBX09GSUxFUyknCi1lbHNlCi0gIEVNVUxBVElPTl9PRklMRVM9JGFsbF9lbXVscwotICBFTVVMX0VYVFJBX09GSUxFUz0kYWxsX2VtdWxfZXh0cmFzCi1maQotCi0KLQotRU1VTEFUSU9OX0xJQlBBVEg9JGFsbF9saWJwYXRoCi0KLQotaWYgdGVzdCB4JHtlbmFibGVfc3RhdGljfSA9IHhubzsgdGhlbgotICBURVNUQkZETElCPSItLXJwYXRoIC4uL2JmZC8ubGlicyAuLi9iZmQvLmxpYnMvbGliYmZkLnNvIgotZWxzZQotICBURVNUQkZETElCPSIuLi9iZmQvLmxpYnMvbGliYmZkLmEiCi1maQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBMRVhfT1VUUFVUX1JPT1RAJSRMRVhfT1VUUFVUX1JPT1QlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEhPU1RJTkdfQ1JUMEAlJEhPU1RJTkdfQ1JUMCVnCi1zJUBIT1NUSU5HX0xJQlNAJSRIT1NUSU5HX0xJQlMlZwotcyVATkFUSVZFX0xJQl9ESVJTQCUkTkFUSVZFX0xJQl9ESVJTJWcKLXMlQEVNVUxAJSRFTVVMJWcKLS9AVERJUlNAL3IgJFRESVJTCi1zJUBURElSU0AlJWcKLXMlQEVNVUxBVElPTl9PRklMRVNAJSRFTVVMQVRJT05fT0ZJTEVTJWcKLXMlQEVNVUxfRVhUUkFfT0ZJTEVTQCUkRU1VTF9FWFRSQV9PRklMRVMlZwotcyVARU1VTEFUSU9OX0xJQlBBVEhAJSRFTVVMQVRJT05fTElCUEFUSCVnCi1zJUBURVNUQkZETElCQCUkVEVTVEJGRExJQiVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLXNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS5iYXQgYi9sZC9jb25maWd1cmUuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQzYmRiLi4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi1AZWNobyBvZmYNCi1lY2hvIENvbmZpZ3VyaW5nIGxkIGZvciBnbzMyDQotZWNobyBUaGlzIG1ha2VmaWxlIHdpbGwgYmUgYnVpbHQgZm9yIEdOVUlTSCBtYWtlDQotcmVtIFRoaXMgYmF0Y2ggZmlsZSBhc3N1bWVzIGEgdW5peC10eXBlICJzZWQiIHByb2dyYW0NCi0NCi11cGRhdGUgLi5cYmZkXGhvc3RzXGdvMzIuaCBzeXNkZXAuaA0KLQ0KLWVjaG8gIyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgImNvbmZpZ3VyZS5iYXQiPiBNYWtlZmlsZQ0KLWVjaG8gTE9OR0FSR1MgPSBnY2M6YXIgPj4gTWFrZWZpbGUNCi1lY2hvIENDPWdjYyA+PiBNYWtlZmlsZQ0KLWVjaG8gaG9zdF9hbGlhcz1nbzMyID4+IE1ha2VmaWxlDQotZWNobyB0YXJnZXRfYWxpYXM9Z28zMiA+PiBNYWtlZmlsZQ0KLQ0KLXVwZGF0ZSAuLi9iZmQvaG9zdHMvZ28zMi5oIHN5c2RlcC5oDQotDQotaWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvXglcJChzcmNkaXIpXC9tb3ZlLWlmLWNoYW5nZS8JdXBkYXRlLwkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvOlwoW14gCV1cKS86IFwxL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL14JXCAqXC5cLy8JZ28zMiAvCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL2BlY2hvIFwkKHNyY2RpcilcLy8vZwkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvIHwgc2VkICdzLFxeXFxcLlwvLCwnYC8vZwkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9eCWNkIFwkKHNyY2RpcilbIAldKjsvLwkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL14jIyMjJC8gaVwJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiQ0MgPSBnY2NcCQkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJFTVVMPWdvMzJcCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIkVNVUxBVElPTl9PRklMRVM9ZWdvMzIubyBlaTM4NmFvdXQubwkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICIvXlNIRUxMICo9LyBkCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvJChTSEVMTCkvc2guZXhlL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzLyciL1xcIi9nCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvIicvXFwiL2cJCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL15sZG1haW4ubzogbGRtYWluLmMvLC9maS8gewkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiICBzLzsgKlxcJC8vCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIiAgcy8tRFNDUklQVERJUlteIAldKi8tRFNDUklQVERJUj1cXCIuXFwiLwkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIiAgcy9jb25maWcuc3RhdHVzLy8JCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgIC9sZG1haW4ubzovIHAJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiICAvKENDKS8gcAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgIGQJCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIn0JCQkJCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL15TSEVMTC4qJC9TSEVMTD1zaC5leGUvCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9nZW5zY3JpcHRzLnNoL2dlbnNjcmlwdHMuZG9zL2cJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvXmxkZW11bC1saXN0Lmgvbm90LWxkZW11bC1saXN0LmgvCQkiPj4gY29uZmlnLnNlZA0KLQ0KLXNlZCAtZSAicy9eXCIvLyIgLWUgInMvXCIkLy8iIC1lICJzL1sgCV0qJC8vIiBjb25maWcuc2VkID4gY29uZmlnMi5zZWQNCi1zZWQgLWYgY29uZmlnMi5zZWQgTWFrZWZpbGUuaW4gPj4gTWFrZWZpbGUNCi1kZWwgY29uZmlnLnNlZA0KLWRlbCBjb25maWcyLnNlZA0KLQ0KLWVjaG8gc2V0IC1hID4gZ2Vuc2NyaXB0cy5kag0KLXNlZCAtZSAiL15bYS16QS1aMC05X10qPS8gcy9eL2V4cG9ydCAvIiAtZSAicy8oLiBcKC4qXCkpL3NoIFwxLyIgLWUgIi9cLmVtLyBkIiBnZW5zY3JpcHRzLnNoID4+IGdlbnNjcmlwdHMuZGoNCi10eXBlIGVtdWx0ZW1wbFxnZW5lcmljLmVtID4+IGdlbnNjcmlwdHMuZGoNCi11cGRhdGUgZ2Vuc2NyaXB0cy5kaiBnZW5zY3JpcHRzLmRvcw0KLQ0KLWVjaG8gZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfZ28zMl9lbXVsYXRpb247ID4gbGRlbXVsLWxpc3QuaDINCi1lY2hvIGV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkX2kzODZhb3V0X2VtdWxhdGlvbjsgPj4gbGRlbXVsLWxpc3QuaDINCi1lY2hvICNkZWZpbmUgRU1VTEFUSU9OX0xJU1QgXD4+bGRlbXVsLWxpc3QuaDINCi1lY2hvICAgJmxkX2dvMzJfZW11bGF0aW9uLFw+PmxkZW11bC1saXN0LmgyDQotZWNobyAgICZsZF9pMzg2YW91dF9lbXVsYXRpb24sXD4+bGRlbXVsLWxpc3QuaDINCi1lY2hvIDA+PmxkZW11bC1saXN0LmgyDQotDQotdXBkYXRlIGxkZW11bC1saXN0LmgyIGxkZW11bC1saXN0LmgNCi0NCi1pZiBleGlzdCBsZHNjcmlwdHNcZG9zdGVzdCBnb3RvIGxkc2NyaXB0cw0KLW1rZGlyIGxkc2NyaXB0cw0KLWRpciA+IGxkc2NyaXB0c1xkb3N0ZXN0DQotOmxkc2NyaXB0cw0KZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS5ob3N0IGIvbGQvY29uZmlndXJlLmhvc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZWIzMTEuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlndXJlLmhvc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotIyBUaGlzIGlzIHRoZSBsaW5rZXIgaG9zdCBzcGVjaWZpYyBmaWxlLiAgVGhpcyBpcyBpbnZva2VkIGJ5IHRoZQotIyBhdXRvY29uZiBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdC4gIFB1dHRpbmcgaXQgaW4gYSBzZXBhcmF0ZSBzaGVsbAotIyBmaWxlIGxldHMgdXMgc2tpcCBydW5uaW5nIGF1dG9jb25mIHdoZW4gbW9kaWZ5aW5nIGhvc3Qgc3BlY2lmaWMKLSMgaW5mb3JtYXRpb24uCi0KLSMgVGhpcyBmaWxlIHNldHMgdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICBIREVGSU5FUwkJaG9zdCBzcGVjaWZpYyBjb21waWxlciBmbGFncwotIyAgSE9TVElOR19DUlQwCQljcnQwLm8gZmlsZSB1c2VkIGZvciBib290c3RyYXBwaW5nCi0jICBIT1NUSU5HX0xJQlMJCWxpYnJhcmllcyB1c2VkIGZvciBib290c3RyYXBwaW5nCi0jICBOQVRJVkVfTElCX0RJUlMJbGlicmFyeSBkaXJlY3RvcmllcyB0byBzZWFyY2ggb24gdGhpcyBob3N0Ci0KLUhERUZJTkVTPQotSE9TVElOR19DUlQwPS9saWIvY3J0MC5vCi1IT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjJwotTkFUSVZFX0xJQl9ESVJTPQotCi1jYXNlICIke2hvc3R9IiBpbgotCi1hbHBoYSotKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciBgZWdyZXAgImxkW14gXSpcLnNvIiBcYGdjYyAtLXByaW50LWZpbGUtbmFtZT1zcGVjc1xgIHwgc2VkIC1lICJzLC4qLWR5bmFtaWMtbGlua2VyWyAJXVsgCV0qXCguKi9sZFteIF0qLnNvLi5cKS4qLFwxLCJgIGBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0MS5vYCBgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTGBkaXJuYW1lIFxgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1hbHBoYSotKi1uZXRic2QqKQotICAjIFRoZSBuZXcgQlNEIGBtYWtlJyBoYXMgYSBidWc6IGl0IGRvZXNuJ3QgcGFzcyBlbXB0eSBhcmd1bWVudHMgaW4KLSAgIyBzaGVsbCBjb21tYW5kcy4gIFNvIHdlIG5lZWQgdG8gbWFrZSB0aGlzIHZhbHVlIG5vbi1lbXB0eSBpbiBvcmRlcgotICAjIGZvciB0aGUgZ2Vuc2NyaXB0cy5zaCBjYWxsIHRvIHdvcmsuICBUaGVyZSdzIG5vdGhpbmcgbWFnaWMgYWJvdXQKLSAgIyB0aGUgdmFsdWUgYC9saWInOyBpdCdzIGp1c3QgYSBkdW1teS4KLSAgTkFUSVZFX0xJQl9ESVJTPS9saWIKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1hbHBoYSotKi0qKQotICBIT1NUSU5HX0NSVDA9L3Vzci9jY3MvbGliL2NydDAubwotICBOQVRJVkVfTElCX0RJUlM9L3Vzci9jY3MvbGliCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWJzZCogfCBpWzM0NTZdODYtKi1mcmVlYnNkKiB8IGlbMzQ1Nl04Ni0qLW5ldGJzZCopCi0gICMgVGhlIG5ldyBCU0QgYG1ha2UnIGhhcyBhIGJ1ZzogaXQgZG9lc24ndCBwYXNzIGVtcHR5IGFyZ3VtZW50cyBpbgotICAjIHNoZWxsIGNvbW1hbmRzLiAgU28gd2UgbmVlZCB0byBtYWtlIHRoaXMgdmFsdWUgbm9uLWVtcHR5IGluIG9yZGVyCi0gICMgZm9yIHRoZSBnZW5zY3JpcHRzLnNoIGNhbGwgdG8gd29yay4gIFRoZXJlJ3Mgbm90aGluZyBtYWdpYyBhYm91dAotICAjIHRoZSB2YWx1ZSBgL2xpYic7IGl0J3MganVzdCBhIGR1bW15LgotICBOQVRJVkVfTElCX0RJUlM9L2xpYgotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXN5c3Y0KikKLSAgSE9TVElOR19DUlQwPScvdXNyL2Njcy9saWIvY3J0MS5vIC91c3IvY2NzL2xpYi9jcnRpLm8gL3Vzci9jY3MvbGliL3ZhbHVlcy1YYS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2Njcy9saWIvY3J0bi5vJwotICBOQVRJVkVfTElCX0RJUlM9L3Vzci9jY3MvbGliCi0gIDs7Ci0KLWlbMzQ1Nl04Ni1zZXF1ZW50LXB0eCogfCBpWzM0NTZdODYtc2VxdWVudC1zeXN2KikKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAnCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXN5c3YqKQotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBmaWAgL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXNvbGFyaXMqKQotICBIT1NUSU5HX0NSVDA9J2BpZiBbIC1mIC4uL2djYy9jcnQxLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnQxLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0MS5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGkubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGkubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRpLm87IGZpYCAvdXNyL2Njcy9saWIvdmFsdWVzLVhhLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRuLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRuLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0bi5vOyBmaWAnCi0gIE5BVElWRV9MSUJfRElSUz0vdXNyL2Njcy9saWIKLSAgOzsKLQotaVszNDU2XTg2LSotc2NvKiB8IGlbMzQ1Nl04Ni0qLWlzYyopCi0gICMgSW4gc29tZSBjb25maWd1cmF0aW9ucyBnY2MgZG9lcyBub3QgdXNlIGNydGJlZ2luLm8gYW5kIGNydGVuZC5vLgotICAjIEluIHRoYXQgY2FzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vIHdpbGwgc2ltcGx5IHByaW50Ci0gICMgY3J0YmVnaW4uby4gIFdlIGNyZWF0ZSBkdW1teSBjcnRiZWdpbi5vIGFuZCBjcnRlbmQubyBmaWxlcyB0bwotICAjIGhhbmRsZSB0aGlzLgotICBlY2hvICJpbnQgZHVtbXlfY3J0YmVnaW4gKCkgeyByZXR1cm4gMDsgfSIgPiBjcnRiZWdpbi5jCi0gICR7Q0N9IC1jIGNydGJlZ2luLmMgLW8gY3J0YmVnaW4ubwotICBybSAtZiBjcnRiZWdpbi5jCi0gIGVjaG8gImludCBkdW1teV9jcnRlbmcgKCkgeyByZXR1cm4gMDsgfSIgPiBjcnRlbmQuYwotICAke0NDfSAtYyBjcnRlbmQuYyAtbyBjcnRlbmQubwotICBybSAtZiBjcnRlbmQuYwotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvbGliL2NydG4ubycKLSAgOzsKLQotaVszNDU2XTg2LSotbGludXgqYW91dCogfCBpWzM0NTZdODYtKi1saW51eG9sZGxkKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWxpbnV4KmxpYmMxKikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYi9sZC1saW51eC5zby4xIC91c3IvbGliL2NydDEubyAvdXNyL2xpYi9jcnRpLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbGlmIFsgLWYgL3Vzci9saWIvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gL3Vzci9saWIvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRlbmQubyBdOyB0aGVuIGVjaG8gL3Vzci9saWIvY3J0ZW5kLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1pWzM0NTZdODYtKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciBgZmdyZXAgbGQtbGludXguc28gXGBnY2MgLS1wcmludC1maWxlLW5hbWU9c3BlY3NcYCB8IHNlZCAtZSAicywuKi1keW5hbWljLWxpbmtlclsgCV1bIAldKlwoLiovbGQtbGludXguc28uLlwpLiosXDEsImAgYGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnQxLm9gIGBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1MYGRpcm5hbWUgXGBnY2MgLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWx5bnhvcyopCi0gIEhPU1RJTkdfQ1JUMD0vbGliL2luaXQxLm8KLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAtbG0gL2xpYi9pbml0bi5vJwotICA7OwotCi1taXBzKi1kZWMtYnNkKikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1taXBzKi1zZ2ktaXJpeDQqKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1taXBzKi1zZ2ktaXJpeFs1Nl0qKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1tNjgqLSotbGludXgqYW91dCopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotbTY4Ki0qLWxpbnV4KmxpYmMxKikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYi9sZC1saW51eC5zby4xIC91c3IvbGliL2NydDEubyAvdXNyL2xpYi9jcnRpLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbGlmIFsgLWYgL3Vzci9saWIvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gL3Vzci9saWIvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRlbmQubyBdOyB0aGVuIGVjaG8gL3Vzci9saWIvY3J0ZW5kLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1tNjgqLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYi9sZC5zby4xIC91c3IvbGliL2NydDEubyAvdXNyL2xpYi9jcnRpLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW02OCotKi1seW54b3MqKQotICBIT1NUSU5HX0NSVDA9L2xpYi9pbml0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgLWxtIC9saWIvaW5pdG4ubycKLSAgOzsKLQotbTY4Ki1tb3Rvcm9sYS1zeXN2KQotICBIT1NUSU5HX0NSVDA9J2BpZiBbIC1mIC4uL2djYy9jcnQwLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnQwLm87IGVsaWYgWyAtZiBcYGdjYyAtcHJpbnQtZmlsZS1uYW1lPVxgY3J0MC5vIF07IHRoZW4gZWNobyBcYGdjYyAtcHJpbnQtZmlsZS1uYW1lPVxgY3J0MC5vOyBlbHNlIGVjaG8gL2xpYi9jcnQwLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYzg4MSBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgJwotICA7OwotCi1tNjgqLXN1bi0qKQotICBIT1NUSU5HX0NSVDA9Jy91c3IvbGliL2NydDAubyAvdXNyL2xpYi9GY3J0MS5vIC1ML3Vzci9saWIvZnNvZnQubycKLSAgOzsKLQotbTg4Ki0qLWRndXgqKQotICBIREVGSU5FUz0tRF9fdXNpbmdfREdVWAotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MC5vIC1YJwotICBIT1NUSU5HX0xJQlM9L3Vzci9zZGUvbTg4a2Jjcy9saWIvbGliYy5hCi0gIDs7Ci0KLW04OCotbW90b3JvbGEtc3lzdjMpCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQwLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAnCi0gIDs7Ci0KLXBvd2VycGMqLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYi9sZC5zby4xIC91c3IvbGliL2NydDEubyAvdXNyL2xpYi9jcnRpLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLXJvbXAtKi0qKQotICBIREVGSU5FUz0tRE5PX1ZBUkFSR1MKLSAgOzsKLQotc3BhcmMqLSotc29sYXJpczIqKQotICBIT1NUSU5HX0NSVDA9J2BpZiBbIC1mIC4uL2djYy9jcnQxLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnQxLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0MS5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGkubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGkubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRpLm87IGZpYCAvdXNyL2Njcy9saWIvdmFsdWVzLVhhLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRuLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRuLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0bi5vOyBmaWAnCi0gIE5BVElWRV9MSUJfRElSUz0vdXNyL2Njcy9saWIKLSAgOzsKLQotZXNhYwpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlLmluIGIvbGQvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg3YjllLi4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdAotZG5sCi1BQ19QUkVSRUcoMi4xMykKLUFDX0lOSVQobGRtYWluLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLQotQU1fSU5JVF9BVVRPTUFLRShsZCwgMi45LjQpCi0KLUFNX1BST0dfTElCVE9PTAotCi1BQ19BUkdfRU5BQkxFKHRhcmdldHMsCi1bICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnNdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIEFDX0VSUk9SKGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnKQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhY10pZG5sCi1BQ19BUkdfRU5BQkxFKDY0LWJpdC1iZmQsCi1bICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbikgOzsKLWVzYWNdLFt3YW50NjQ9ZmFsc2VdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1pZiB0ZXN0IC16ICIkaG9zdCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUFDX1BST0dfQ0MKLUFDX1BST0dfSU5TVEFMTAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFDX0VYRUVYVAotCi1BQ19QUk9HX1lBQ0MKLUFNX1BST0dfTEVYCi0KLUFNX01BSU5UQUlORVJfTU9ERQotCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi1BQ19TVUJTVChIREVGSU5FUykKLUFDX1NVQlNUKEhPU1RJTkdfQ1JUMCkKLUFDX1NVQlNUKEhPU1RJTkdfTElCUykKLUFDX1NVQlNUKE5BVElWRV9MSUJfRElSUykKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmgpCi1BQ19DSEVDS19GVU5DUyhzYnJrKQotQUNfSEVBREVSX0RJUkVOVAotCi1CRkRfQklOQVJZX0ZPUEVOCi0KLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHN0cnN0cikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGZyZWUpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzYnJrKQotQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KQotQkZEX05FRURfREVDTEFSQVRJT04oZW52aXJvbikKLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLWFsbF90YXJnZXRzPQotRU1VTD0KLWFsbF9lbXVscz0KLWFsbF9lbXVsX2V4dHJhcz0KLWFsbF9saWJwYXRoPQotCi1kbmwgV2UgbmVlZCB0byBnZXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0ZGlyIGRlZmluaXRpb25zIGludG8KLWRubCBNYWtlZmlsZS4gIFdlIGNhbid0IGRvIGl0IHVzaW5nIEFDX1NVQlNULCBiZWNhdXNlIGF1dG9jb25mIGRvZXMKLWRubCBub3QgcGVybWl0IGxpdGVyYWwgbmV3bGluZXMgaW4gYW4gQUNfU1VCU1QgdmFyaWFibGVzLiAgU28gd2UgdXNlIGEKLWRubCBmaWxlLgotcm0gLWYgdGRpcnMKLQotZm9yIHRhcmdfYWxpYXMgaW4gYGVjaG8gJHRhcmdldF9hbGlhcyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotZG8KLSAgaWYgdGVzdCAiJHRhcmdfYWxpYXMiID0gImFsbCI7IHRoZW4KLSAgICBhbGxfdGFyZ2V0cz10cnVlCi0gIGVsc2UKLSAgICAjIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLSAgICByZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnX2FsaWFzIDI+L2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCi0JdGFyZz0kcmVzdWx0Ci0gICAgZWxzZQotCXRhcmc9JHRhcmdfYWxpYXMKLSAgICBmaQotCi0gICAgLiAke3NyY2Rpcn0vY29uZmlndXJlLnRndAotCi0gICAgaWYgdGVzdCAiJHRhcmciID0gIiR0YXJnZXQiOyB0aGVuCi0gICAgICBFTVVMPSR0YXJnX2VtdWwKLSAgICBmaQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZW11bCAkdGFyZ19leHRyYV9lbXVscyAkdGFyZ19leHRyYV9saWJwYXRoOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxzICIgaW4KLQkqIiBlJHtpfS5vICIqKSA7OwotCSopCi0JICBhbGxfZW11bHM9IiRhbGxfZW11bHMgZSR7aX0ubyIKLQkgIGV2YWwgcmVzdWx0PVwkdGRpcl8kaQotCSAgdGVzdCAteiAiJHJlc3VsdCIgJiYgcmVzdWx0PSR0YXJnX2FsaWFzCi0JICBlY2hvIHRkaXJfJGk9JHJlc3VsdCA+PiB0ZGlycwotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZW11bCAkdGFyZ19leHRyYV9saWJwYXRoOyBkbwotCWNhc2UgIiAkYWxsX2xpYnBhdGggIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGlmIHRlc3QgLXogIiRhbGxfbGlicGF0aCI7IHRoZW4KLQkgICAgYWxsX2xpYnBhdGg9JHtpfQotCSAgZWxzZQotCSAgICBhbGxfbGlicGF0aD0iJGFsbF9saWJwYXRoICR7aX0iCi0JICBmaQotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZXh0cmFfb2ZpbGVzOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxfZXh0cmFzICIgaW4KLQkqIiAke2l9ICIqKSA7OwotCSopCi0JICBhbGxfZW11bF9leHRyYXM9IiRhbGxfZW11bF9leHRyYXMgJHtpfSIKLQkgIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgZmkKLWRvbmUKLQotQUNfU1VCU1QoRU1VTCkKLQotVERJUlM9dGRpcnMKLUFDX1NVQlNUX0ZJTEUoVERJUlMpCi0KLWRubCBGSVhNRTogV2Ugd2lsbCBidWlsZCBhIDY0IGJpdCBCRkQgZm9yIGEgNjQgYml0IGhvc3Qgb3IgYSA2NCBiaXQKLWRubCB0YXJnZXQsIGFuZCBpbiB0aG9zZSBjYXNlcyB3ZSBzaG91bGQgYWxzbyBidWlsZCB0aGUgNjQgYml0Ci1kbmwgZW11bGF0aW9ucy4KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geHRydWU7IHRoZW4KLSAgaWYgdGVzdCB4JHt3YW50NjR9ID0geHRydWU7IHRoZW4KLSAgICBFTVVMQVRJT05fT0ZJTEVTPSckKEFMTF9FTVVMQVRJT05TKSAkKEFMTF82NF9FTVVMQVRJT05TKScKLSAgZWxzZQotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpJwotICBmaQotICBFTVVMX0VYVFJBX09GSUxFUz0nJChBTExfRU1VTF9FWFRSQV9PRklMRVMpJwotZWxzZQotICBFTVVMQVRJT05fT0ZJTEVTPSRhbGxfZW11bHMKLSAgRU1VTF9FWFRSQV9PRklMRVM9JGFsbF9lbXVsX2V4dHJhcwotZmkKLUFDX1NVQlNUKEVNVUxBVElPTl9PRklMRVMpCi1BQ19TVUJTVChFTVVMX0VYVFJBX09GSUxFUykKLQotRU1VTEFUSU9OX0xJQlBBVEg9JGFsbF9saWJwYXRoCi1BQ19TVUJTVChFTVVMQVRJT05fTElCUEFUSCkKLQotaWYgdGVzdCB4JHtlbmFibGVfc3RhdGljfSA9IHhubzsgdGhlbgotICBURVNUQkZETElCPSItLXJwYXRoIC4uL2JmZC8ubGlicyAuLi9iZmQvLmxpYnMvbGliYmZkLnNvIgotZWxzZQotICBURVNUQkZETElCPSIuLi9iZmQvLmxpYnMvbGliYmZkLmEiCi1maQotQUNfU1VCU1QoVEVTVEJGRExJQikKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS50Z3QgYi9sZC9jb25maWd1cmUudGd0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2MxMzk3Li4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZS50Z3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotIyBUaGlzIGlzIHRoZSBsaW5rZXIgdGFyZ2V0IHNwZWNpZmljIGZpbGUuICBUaGlzIGlzIGludm9rZWQgYnkgdGhlCi0jIGF1dG9jb25mIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LiAgUHV0dGluZyBpdCBpbiBhIHNlcGFyYXRlIHNoZWxsCi0jIGZpbGUgbGV0cyB1cyBza2lwIHJ1bm5pbmcgYXV0b2NvbmYgd2hlbiBtb2RpZnlpbmcgdGFyZ2V0IHNwZWNpZmljCi0jIGluZm9ybWF0aW9uLgotCi0jIFRoaXMgZmlsZSBzd2l0Y2hlcyBvbiB0aGUgc2hlbGwgdmFyaWFibGUgJHt0YXJnfSwgYW5kIHNldHMgdGhlCi0jIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICB0YXJnX2VtdWwJCW5hbWUgb2YgbGlua2VyIGVtdWxhdGlvbiB0byB1c2UKLSMgIHRhcmdfZXh0cmFfZW11bHMJYWRkaXRpb25hbCBsaW5rZXIgZW11bGF0aW9ucyB0byBwcm92aWRlCi0jICB0YXJnX2V4dHJhX2xpYnBhdGgJYWRkaXRpb25hbCBsaW5rZXIgZW11bGF0aW9ucyB1c2luZyBMSUJfUEFUSAotIyAgdGFyZ19leHRyYV9vZmlsZXMJYWRkaXRpb25hbCBvYmplY3RzIG5lZWRlZCBieSB0aGUgZW11bGF0aW9uCi0KLXRhcmdfZXh0cmFfZW11bHM9Ci10YXJnX2V4dHJhX29maWxlcz0KLQotY2FzZSAiJHt0YXJnfSIgaW4KLWFybS1lcG9jLXBlKQkJdGFyZ19lbXVsPWFybV9lcG9jX3BlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotYXJtLSotcGUpCQl0YXJnX2VtdWw9YXJtcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1hcmMtKi1lbGYqKQkJdGFyZ19lbXVsPWFyY2VsZiA7OwotZDEwdi0qLSopCQl0YXJnX2VtdWw9ZDEwdmVsZiA7OwotZDMwdi0qLSpleHQqKQkJdGFyZ19lbXVsPWQzMHZfZTsgdGFyZ19leHRyYV9lbXVscz0iZDMwdmVsZiBkMzB2X28iIDs7Ci1kMzB2LSotKm9uY2hpcCopCXRhcmdfZW11bD1kMzB2X287IHRhcmdfZXh0cmFfZW11bHM9ImQzMHZlbGYgZDMwdl9lIiA7OwotZDMwdi0qLSopCQl0YXJnX2VtdWw9ZDMwdmVsZjsgdGFyZ19leHRyYV9lbXVscz0iZDMwdl9lIGQzMHZfbyIgOzsKLXNwYXJjNjQtKi1hb3V0KikJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmM2NC0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmNjRfc3BhcmMgOzsKLXNwYXJjLXN1bi1zdW5vczQqKSAJdGFyZ19lbXVsPXN1bjQgOzsKLXNwYXJjbGl0ZSotKi1lbGYpCXRhcmdfZW11bD1lbGYzMl9zcGFyYyA7Owotc3BhcmNsaXRlKi0qLWNvZmYpCXRhcmdfZW11bD1jb2ZmX3NwYXJjIDs7Ci1zcGFyY2xpdGUqLWZ1aml0c3UtKikJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmMqLSotYW91dCkJCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKLXNwYXJjKi0qLWNvZmYpCQl0YXJnX2VtdWw9Y29mZl9zcGFyYyA7Owotc3BhcmMqLSotZWxmKQkJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyYyotKi1zeXN2NCopCXRhcmdfZW11bD1lbGYzMl9zcGFyYyA7Owotc3BhcmMqLSotbGludXgqYW91dCopCXRhcmdfZW11bD1zcGFyY2xpbnV4Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMl9zcGFyYyBzdW40IgotCQkJdGRpcl9lbGYzMl9zcGFyYz1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2FvdXQvLydgCi0JCQl0ZGlyX3N1bjQ9c3BhcmMtc3VuLXN1bm9zNAotCQkJOzsKLXNwYXJjNjQtKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmNjRfc3BhcmMKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMyX3NwYXJjIHNwYXJjbGludXggc3VuNCIKLQkJCXRkaXJfZWxmMzJfc3BhcmM9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy82NC8vJ2AKLQkJCXRkaXJfc3BhcmNsaW51eD0ke3RkaXJfZWxmMzJfc3BhcmN9YW91dAotCQkJdGRpcl9zdW40PXNwYXJjLXN1bi1zdW5vczQKLQkJCTs7Ci1zcGFyYyotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMKLQkJCXRhcmdfZXh0cmFfZW11bHM9InNwYXJjbGludXggc3VuNCIKLQkJCXRkaXJfc3BhcmNsaW51eD0ke3RhcmdfYWxpYXN9YW91dAotCQkJdGRpcl9zdW40PXNwYXJjLXN1bi1zdW5vczQKLQkJCTs7Ci1zcGFyYyotKi1seW54b3MqKQl0YXJnX2VtdWw9c3BhcmNseW54IDs7Ci1zcGFyYyotKi1uZXRic2QqKQl0YXJnX2VtdWw9c3BhcmNuYnNkIDs7Ci1zcGFyYyotKi1zb2xhcmlzMiopCXRhcmdfZW11bD1lbGYzMl9zcGFyYyA7Owotc3BhcmMqLXdycy12eHdvcmtzKikJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmMqLSotcnRlbXMqKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1pOTYwLXdycy12eHdvcmtzNS4wKikJdGFyZ19lbXVsPWdsZDk2MCA7OwotaTk2MC13cnMtdnh3b3JrczUqKQl0YXJnX2VtdWw9Z2xkOTYwY29mZiA7OwotaTk2MC13cnMtdnh3b3JrcyopCXRhcmdfZW11bD1nbGQ5NjAgOzsKLWk5NjAtKi1jb2ZmKQkJdGFyZ19lbXVsPWdsZDk2MGNvZmYgOzsKLWk5NjAtaW50ZWwtbmluZHkpCXRhcmdfZW11bD1nbGQ5NjAgOzsKLWk5NjAtKi1ydGVtcyopCQl0YXJnX2VtdWw9Z2xkOTYwY29mZiA7OwotaTk2MC0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmMzJfaTk2MCA7OwotbTMyci0qLSopCQl0YXJnX2VtdWw9bTMycmVsZiA7OwotbTY4Ki1zdW4tc3Vub3NbMzRdKikJdGFyZ19lbXVsPXN1bjMgOzsKLW02OCotd3JzLXZ4d29ya3MqKQl0YXJnX2VtdWw9c3VuMyA7OwotbTY4Ki1lcmljc3Nvbi1vc2UpCXRhcmdfZW11bD1zdW4zIDs7Ci1tNjgqLWFwcGxlLWF1eCopCXRhcmdfZW11bD1tNjhrYXV4IDs7Ci0qLXRhbmRlbS1ub25lKQkJdGFyZ19lbXVsPXN0MjAwMCA7OwotaVszNDU2XTg2LSotdnN0YSkJdGFyZ19lbXVsPXZzdGEgOzsKLWlbMzQ1Nl04Ni1nbzMyLXJ0ZW1zKikJdGFyZ19lbXVsPWkzODZnbzMyIDs7Ci1pWzM0NTZdODYtKi1nbzMyKQl0YXJnX2VtdWw9aTM4NmdvMzIgOzsKLWlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKSB0YXJnX2VtdWw9aTM4NmdvMzIgOzsKLWlbMzQ1Nl04Ni0qLWFpeCopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotc2NvKikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1pc2MqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLWx5bnhvcyopCXRhcmdfZW11bD1pMzg2bHlueCA7OwotaVszNDU2XTg2LSotY29mZikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1ydGVtc2VsZiopICB0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXJ0ZW1zKikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1ic2QpCXRhcmdfZW11bD1pMzg2YnNkIDs7Ci1pWzM0NTZdODYtKi1ic2QzODYpCXRhcmdfZW11bD1pMzg2YnNkIDs7Ci1pWzM0NTZdODYtKi1ic2RpKikJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLWFvdXQpCXRhcmdfZW11bD1pMzg2YW91dCA7OwotaVszNDU2XTg2LSotbGludXgqYW91dCopCXRhcmdfZW11bD1pMzg2bGludXgKLQkJCXRhcmdfZXh0cmFfZW11bHM9ZWxmX2kzODYKLQkJCXRkaXJfZWxmX2kzODY9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9hb3V0Ly8nYAotCQkJOzsKLWlbMzQ1Nl04Ni0qLWxpbnV4b2xkbGQpCXRhcmdfZW11bD1pMzg2bGludXg7IHRhcmdfZXh0cmFfZW11bHM9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGZfaTM4NgotCQkJdGFyZ19leHRyYV9lbXVscz1pMzg2bGludXgKLQkJCXRkaXJfaTM4NmxpbnV4PSR7dGFyZ19hbGlhc31hb3V0Ci0JCQk7OwotaVszNDU2XTg2LSotc3lzdjQqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXNvbGFyaXMyKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi11bml4d2FyZSkJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1zb2xhcmlzKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1uZXRic2QqKQl0YXJnX2VtdWw9aTM4Nm5ic2QgOzsKLWlbMzQ1Nl04Ni0qLW5ldHdhcmUpCXRhcmdfZW11bD1pMzg2bncgOzsKLWlbMzQ1Nl04Ni0qLWVsZiopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotZnJlZWJzZGFvdXQqIHwgaVszNDU2XTg2LSotZnJlZWJzZFsxMl0uKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdKQotCQkJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLWZyZWVic2QqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXN5c3YqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLXB0eCopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotbWFjaCopCXRhcmdfZW11bD1pMzg2bWFjaCA7OwotaVszNDU2XTg2LSotZ251KikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1tc2RvcyopCXRhcmdfZW11bD1pMzg2bXNkb3M7IHRhcmdfZXh0cmFfZW11bHM9aTM4NmFvdXQgOzsKLWlbMzQ1Nl04Ni0qLW1vc3MqKQl0YXJnX2VtdWw9aTM4Nm1vc3M7IHRhcmdfZXh0cmFfZW11bHM9aTM4Nm1zZG9zIDs7Ci1pWzM0NTZdODYtKi13aW5udCopCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1wZSkJCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1jeWd3aW4qKQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotbWluZ3czMiopCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1iZW9zcGUqKSAgICB0YXJnX2VtdWw9aTM4NmJlb3MgOzsKLWlbMzQ1Nl04Ni0qLWJlb3MqKQl0YXJnX2VtdWw9ZWxmX2kzODZfYmUgOzsKLW04Ki0qLSopCQl0YXJnX2VtdWw9bTg4a2JjcyA7OwotYTI5ay0qLXVkaSkJCXRhcmdfZW11bD1zYTI5MjAwIDs7Ci1hMjlrLSotZWJtb24pCQl0YXJnX2VtdWw9ZWJtb24yOWsgOzsKLWEyOWstKi0qKQkJdGFyZ19lbXVsPWEyOWsgOzsKLSMgIGFybS0qLXJpc2NpeCopCQl0YXJnX2VtdWw9cmlzY2l4IDs7Ci1hcm0tKi1hb3V0IHwgYXJtZWwtKi1hb3V0KSB0YXJnX2VtdWw9YXJtYW91dGwgOzsKLWFybWViLSotYW91dCkJCXRhcmdfZW11bD1hcm1hb3V0YiA7OwotYXJtLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci1hcm0tKi1lbGYpCQl0YXJnX2VtdWw9YXJtZWxmIDs7Ci1hcm0tKi1vYWJpKSAgICAgICAgICAgICB0YXJnX2VtdWw9YXJtZWxmX29hYmkgOzsKLWFybSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9YXJtZWxmX2xpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPSJhcm1lbGZfbGludXgyNiBhcm1lbGYiOzsKLXN0cm9uZ2FybS0qLWNvZmYpCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci1zdHJvbmdhcm0tKi1lbGYpCXRhcmdfZW11bD1hcm1lbGYgOzsKLXRodW1iLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci10aHVtYi0qLWVsZikJCXRhcmdfZW11bD1hcm1lbGYgOzsKLXRodW1iLSotb2FiaSkgICAgICAgICAgIHRhcmdfZW11bD1hcm1lbGZfb2FiaSA7OwotdGh1bWItZXBvYy1wZSkJCXRhcmdfZW11bD1hcm1fZXBvY19wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLXRodW1iLSotcGUpCQl0YXJnX2VtdWw9YXJtcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1oODMwMC0qLWhtcyogfCBoODMwMC0qLWNvZmYqKQotCQkJdGFyZ19lbXVsPWg4MzAwOyB0YXJnX2V4dHJhX2VtdWxzPSJoODMwMGggaDgzMDBzIgotCQkJOzsKLWg4NTAwLSotaG1zKiB8IGg4NTAwLSotY29mZiopCi0JCQl0YXJnX2VtdWw9aDg1MDAKLQkJCXRhcmdfZXh0cmFfZW11bHM9Img4NTAwcyBoODUwMGIgaDg1MDBtIGg4NTAwYyIKLQkJCTs7Ci1zaC0qLWVsZiogfCBzaC0qLXJ0ZW1zZWxmKikKLQkJCXRhcmdfZW11bD1zaGVsZgotCQkJdGFyZ19leHRyYV9lbXVscz0ic2hsZWxmIHNoIHNobCIKLQkJCTs7Ci1zaC0qLSp8c2gtKi1ydGVtcyopCXRhcmdfZW11bD1zaDsgdGFyZ19leHRyYV9lbXVscz1zaGwgOzsKLW02OGstc29ueS0qKQkJdGFyZ19lbXVsPW5ld3MgOzsKLW02OGstaHAtYnNkKikJCXRhcmdfZW11bD1ocDMwMGJzZCA7OwotbTY4Ki1tb3Rvcm9sYS1zeXN2KikJdGFyZ19lbXVsPWRlbHRhNjggOzsKLW02OCotKi1hb3V0KQkJdGFyZ19lbXVsPW02OGthb3V0IDs7Ci1tNjgqLSotY29mZikJCXRhcmdfZW11bD1tNjhrY29mZiA7OwotbTY4Ki0qLWVsZikJCXRhcmdfZW11bD1tNjhrZWxmIDs7Ci1tNjgqLSotaHB1eCopCQl0YXJnX2VtdWw9aHAzaHB1eCA7OwotbTY4ay0qLWxpbnV4KmFvdXQqKQl0YXJnX2VtdWw9bTY4a2xpbnV4Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPW02OGtlbGYKLQkJCXRkaXJfbTY4a2VsZj1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2FvdXQvLydgCi0JCQk7OwotbTY4ay0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1tNjhrZWxmCi0JCQl0YXJnX2V4dHJhX2VtdWxzPW02OGtsaW51eAotCQkJdGRpcl9tNjhrbGludXg9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9saW51eC9saW51eGFvdXQvJ2AKLQkJCTs7Ci1tNjgqLSotZ251KikJCXRhcmdfZW11bD1tNjhrZWxmIDs7Ci1tNjgqLSotbHlueG9zKikJCXRhcmdfZW11bD1tNjhrbHlueCA7OwotbTY4Ki1ocCotbmV0YnNkKikJdGFyZ19lbXVsPW02OGs0a25ic2QgOzsKLW02OCotKi1uZXRic2QqKQkJdGFyZ19lbXVsPW02OGtuYnNkIDs7Ci1tNjgqLSotcHNvcyopCQl0YXJnX2VtdWw9bTY4a3Bzb3MgOzsKLW02OCotKi1ydGVtcyopCQl0YXJnX2VtdWw9bTY4a2NvZmYgOzsKLWhwcGEqLSotKmVsZiopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotaHBwYSotKi1saXRlcyopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotaHBwYSotKi1ydGVtcyopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotdmF4LWRlYy11bHRyaXgqIHwgdmF4LWRlYy1ic2QqKSB0YXJnX2VtdWw9dmF4IDs7Ci1taXBzKi1kZWMtdWx0cml4KikJdGFyZ19lbXVsPW1pcHNsaXQgOzsKLW1pcHMqLWRlYy1vc2YqKQkJdGFyZ19lbXVsPW1pcHNsaXQgOzsKLW1pcHMqLXNnaS1pcml4NSopCXRhcmdfZW11bD1lbGYzMmJzbWlwIDs7Ci1taXBzKi1zZ2ktaXJpeDYqKQl0YXJnX2VtdWw9ZWxmMzJibWlwbjMyCi0JICAgICAgICAgICAgICAgIHRhcmdfZXh0cmFfZW11bHM9ImVsZjMyYnNtaXAiCi0JICAgICAgICAgICAgICAgIDs7Ci1taXBzKi1zZ2ktaXJpeCopCXRhcmdfZW11bD1taXBzYmlnIDs7Ci1taXBzKmVsLSotZWNvZmYqKQl0YXJnX2VtdWw9bWlwc2lkdGwgOzsKLW1pcHMqLSotZWNvZmYqKQkJdGFyZ19lbXVsPW1pcHNpZHQgOzsKLW1pcHMqLWRlYy1ic2QqKQkJdGFyZ19lbXVsPW1pcHNic2QgOzsKLW1pcHMqLWRlYy1uZXRic2QqKQl0YXJnX2VtdWw9ZWxmMzJsbWlwIDs7Ci1taXBzKi0qLWJzZCopCQl0YXJnX2VtdWw9bWlwc2JpZyA7OwotbWlwcyp2cjQzMDBlbC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmw0MzAwIDs7Ci1taXBzKnZyNDMwMC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmI0MzAwIDs7Ci1taXBzKnZyNDEwMGVsLSotZWxmKikJdGFyZ19lbXVsPWVsZjMybDQzMDAgOzsKLW1pcHMqdnI0MTAwLSotZWxmKikJdGFyZ19lbXVsPWVsZjMyYjQzMDAgOzsKLW1pcHMqdnI1MDAwZWwtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJsNDMwMCA7OwotbWlwcyp2cjUwMDAtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJiNDMwMCA7OwotbWlwcyplbC0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmMzJlbG1pcCA7OwotbWlwcyotKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjMyZWJtaXAgOzsKLW1pcHMqZWwtKi1ydGVtcyopCXRhcmdfZW11bD1lbGYzMmVsbWlwIDs7Ci1taXBzKi0qLXJ0ZW1zKikJCXRhcmdfZW11bD1lbGYzMmVibWlwIDs7Ci1taXBzKi0qLXZ4d29ya3MqKQl0YXJnX2VtdWw9ZWxmMzJlYm1pcCA7OwotbWlwcyplbC0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmxzbWlwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmJzbWlwIG1pcHNsaXQgbWlwc2JpZyIKLQkJCTs7Ci1taXBzKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmJzbWlwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmxzbWlwIG1pcHNiaWcgbWlwc2xpdCIKLQkJCTs7Ci1taXBzKi0qLWxuZXdzKikJCXRhcmdfZW11bD1taXBzbG5ld3MgOzsKLW1uMTAyMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAyMDAgOzsKLW1uMTAzMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAzMDAgOzsKLWFscGhhKi0qLWxpbnV4ZWNvZmYqKQl0YXJnX2VtdWw9YWxwaGEgdGFyZ19leHRyYV9lbXVscz1lbGY2NGFscGhhCi0JCQl0ZGlyX2VsZjY0YWxwaGE9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9lY29mZi8vJ2AKLQkJCTs7Ci1hbHBoYSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSB0YXJnX2V4dHJhX2VtdWxzPWFscGhhCi0JCQl0ZGlyX2FscGhhPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvbGludXgvbGludXhlY29mZi8nYAotCQkJOzsKLWFscGhhKi0qLW9zZiopCQl0YXJnX2VtdWw9YWxwaGEgOzsKLWFscGhhKi0qLWdudSopCQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSA7OwotYWxwaGEqLSotbmV0d2FyZSopCXRhcmdfZW11bD1hbHBoYSA7OwotYWxwaGEqLSotbmV0YnNkKikJdGFyZ19lbXVsPWVsZjY0YWxwaGEgOzsKLXo4ay0qLWNvZmYpIAkJdGFyZ19lbXVsPXo4MDAyOyB0YXJnX2V4dHJhX2VtdWxzPXo4MDAxIDs7Ci1uczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikJdGFyZ19lbXVsPXBjNTMybWFjaGEgOzsKLW5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopIHRhcmdfZW11bD1uczMya25ic2QgOzsKLXBvd2VycGMtKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmMzJwcGNsaW51eDsgdGFyZ19leHRyYV9lbXVscz1lbGYzMnBwYzsKLQkJCXRhcmdfZXh0cmFfbGlicGF0aD1lbGYzMnBwYyA7OwotcG93ZXJwYy0qLWVsZiogfCBwb3dlcnBjLSotZWFiaSogfCBwb3dlcnBjLSotc3lzdiogXAotICB8IHBvd2VycGMtKi1uZXRic2QqIHwgcG93ZXJwYy0qLXZ4d29ya3MqKQotCXRhcmdfZW11bD1lbGYzMnBwYyA7OwotcG93ZXJwY2xlLSotZWxmKiB8IHBvd2VycGNsZS0qLWVhYmkqIHwgcG93ZXJwY2xlLSotc29sYXJpcyogXAotICB8IHBvd2VycGNsZS0qLXN5c3YqIHwgcG93ZXJwY2xlLSotdnh3b3JrcyopCi0JdGFyZ19lbXVsPWVsZjMybHBwYyA7OwotcG93ZXJwY2xlLSotcnRlbXMqKQl0YXJnX2VtdWw9ZWxmMzJsZXBwYyA7OwotcG93ZXJwYy0qLXJ0ZW1zKikJdGFyZ19lbXVsPWVsZjMycHBjIDs7Ci1wb3dlcnBjLSotbWFjb3MqKQl0YXJnX2VtdWw9cHBjbWFjb3MgOzsKLXBvd2VycGMtKi1uZXR3YXJlKikJdGFyZ19lbXVsPXBwY253IDs7Ci1wb3dlcnBjbGUtKi1wZSkgICAgICAgICB0YXJnX2VtdWw9cHBjcGUgOzsKLXBvd2VycGNsZS0qLXdpbm50KikgICAgIHRhcmdfZW11bD1wcGNwZSA7OwotcG93ZXJwY2xlLSotY3lnd2luKikgICB0YXJnX2VtdWw9cHBjcGUgOzsKLXBvd2VycGMtKi1haXgqKQkJdGFyZ19lbXVsPWFpeHBwYyA7OwotcG93ZXJwYy0qLWJlb3MqKQl0YXJnX2VtdWw9YWl4cHBjIDs7Ci1yczYwMDAtKi1haXgqKQkJdGFyZ19lbXVsPWFpeHJzNiA7OwotdGljMzAtKi0qYW91dCopCQl0YXJnX2VtdWw9dGljMzBhb3V0IDs7Ci10aWMzMC0qLSpjb2ZmKikJCXRhcmdfZW11bD10aWMzMGNvZmYgOzsKLXRpYzgwLSotKikJCXRhcmdfZW11bD10aWM4MGNvZmYgOzsKLXY4NTAtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKLXY4NTBlLSotKikJCXRhcmdfZW11bD12ODUwIDs7Ci12ODUwZWEtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKLXc2NS0qLSopCQl0YXJnX2VtdWw9dzY1IDs7Ci1mcjMwLSotKikJCXRhcmdfZW11bD1lbGYzMmZyMzAgOzsKLW1jb3JlLSotcGUpCQl0YXJnX2VtdWw9bWNvcmVwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLW1jb3JlLSotZWxmKQkJdGFyZ19lbXVsPWVsZjMybWNvcmUgOzsKLSotKi1hb3V0KQkJdGFyZ19lbXVsPSR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfSA7OwotKi0qLWNvZmYpCQl0YXJnX2VtdWw9JHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9IDs7Ci0qLSotbmV0d2FyZSkJCXRhcmdfZW11bD0ke3RhcmdldF9jcHV9LW53IDs7Ci0qLSotaWVlZSopCQl0YXJnX2VtdWw9dmFuaWxsYSA7OwotCi0qKQotICBlY2hvIDI+JjEgIioqKiBsZCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3Rhcmd9IgotICBlY2hvIDI+JjEgIioqKiBzZWUgbGQvY29uZmlndXJlLnRndCBmb3Igc3VwcG9ydGVkIHRhcmdldHMiCi0gIGV4aXQgMQotCi1lc2FjCmRpZmYgLS1naXQgYS9sZC9kZWZmaWxlLmggYi9sZC9kZWZmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNmMxY2UuLjAwMDAwMDAKLS0tIGEvbGQvZGVmZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qIGRlZmZpbGUuaCAtIGhlYWRlciBmb3IgLkRFRiBmaWxlIHBhcnNlcgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBESiBEZWxvcmllIGRqQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIERFRiBzdG9yYWdlIGRlZmluaXRpb25zLiAgTm90ZSB0aGF0IGFueSBvcmRpbmFsIG1heSBiZSB6ZXJvLCBhbmQKLSAgIGFueSBwb2ludGVyIG1heSBiZSBOVUxMLCBpZiBub3QgZGVmaW5lZCBieSB0aGUgREVGIGZpbGUuICovCi0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlX3NlY3Rpb24KLSAgewotICAgIGNoYXIgKm5hbWU7CQkJLyogYWx3YXlzIHNldCAqLwotICAgIGNoYXIgKmNsYXNzOwkJLyogbWF5IGJlIE5VTEwgKi8KLSAgICBjaGFyIGZsYWdfcmVhZCwgZmxhZ193cml0ZSwgZmxhZ19leGVjdXRlLCBmbGFnX3NoYXJlZDsKLSAgfQotZGVmX2ZpbGVfc2VjdGlvbjsKLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfZXhwb3J0Ci0gIHsKLSAgICBjaGFyICpuYW1lOwkJCS8qIGFsd2F5cyBzZXQgKi8KLSAgICBjaGFyICppbnRlcm5hbF9uYW1lOwkvKiBhbHdheXMgc2V0LCBtYXkgPT0gbmFtZSAqLwotICAgIGludCBvcmRpbmFsOwkJLyogLTEgaWYgbm90IHNwZWNpZmllZCAqLwotICAgIGludCBoaW50OwotICAgIGNoYXIgZmxhZ19wcml2YXRlLCBmbGFnX2NvbnN0YW50LCBmbGFnX25vbmFtZSwgZmxhZ19kYXRhOwotICB9Ci1kZWZfZmlsZV9leHBvcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlX21vZHVsZQotICB7Ci0gICAgc3RydWN0IGRlZl9maWxlX21vZHVsZSAqbmV4dDsKLSAgICB2b2lkICp1c2VyX2RhdGE7Ci0gICAgY2hhciBuYW1lWzFdOyAvKiBleHRlbmRlZCB2aWEgbWFsbG9jICovCi0gIH0KLWRlZl9maWxlX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfaW1wb3J0Ci0gIHsKLSAgICBjaGFyICppbnRlcm5hbF9uYW1lOwkvKiBhbHdheXMgc2V0ICovCi0gICAgZGVmX2ZpbGVfbW9kdWxlICptb2R1bGU7CS8qIGFsd2F5cyBzZXQgKi8KLSAgICBjaGFyICpuYW1lOwkJCS8qIG1heSBiZSBOVUxMOyBlaXRoZXIgdGhpcyBvciBvcmRpbmFsIHdpbGwgYmUgc2V0ICovCi0gICAgaW50IG9yZGluYWw7CQkvKiBtYXkgYmUgLTEgKi8KLSAgfQotZGVmX2ZpbGVfaW1wb3J0OwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZQotICB7Ci0KLSAgICAvKiBmcm9tIHRoZSBOQU1FIG9yIExJQlJBUlkgY29tbWFuZCAqLwotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGlzX2RsbDsJCQkvKiAtMSBpZiBOQU1FL0xJQlJBUlkgbm90IGdpdmVuICovCi0gICAgYmZkX3ZtYSBiYXNlX2FkZHJlc3M7CS8qIChiZmRfdm1hKSgtMSkgaWYgdW5zcGVjaWZpZWQgKi8KLQotICAgIC8qIGZyb20gdGhlIERFU0NSSVBUSU9OIGNvbW1hbmQgKi8KLSAgICBjaGFyICpkZXNjcmlwdGlvbjsKLQotICAgIC8qIGZyb20gdGhlIFNUQUNLL0hFQVAgY29tbWFuZCwgLTEgaWYgdW5zcGVjaWZpZWQgKi8KLSAgICBpbnQgc3RhY2tfcmVzZXJ2ZSwgc3RhY2tfY29tbWl0OwotICAgIGludCBoZWFwX3Jlc2VydmUsIGhlYXBfY29tbWl0OwotCi0gICAgLyogZnJvbSB0aGUgU0VDVElPTi9TRUdNRU5UIGNvbW1hbmRzICovCi0gICAgaW50IG51bV9zZWN0aW9uX2RlZnM7Ci0gICAgZGVmX2ZpbGVfc2VjdGlvbiAqc2VjdGlvbl9kZWZzOwotCi0gICAgLyogZnJvbSB0aGUgRVhQT1JUUyBjb21tYW5kcyAqLwotICAgIGludCBudW1fZXhwb3J0czsKLSAgICBkZWZfZmlsZV9leHBvcnQgKmV4cG9ydHM7Ci0KLSAgICAvKiB1c2VkIGJ5IGltcG9ydHMgZm9yIG1vZHVsZSBuYW1lcyAqLwotICAgIGRlZl9maWxlX21vZHVsZSAqbW9kdWxlczsKLQotICAgIC8qIGZyb20gdGhlIElNUE9SVFMgY29tbWFuZHMgKi8KLSAgICBpbnQgbnVtX2ltcG9ydHM7Ci0gICAgZGVmX2ZpbGVfaW1wb3J0ICppbXBvcnRzOwotCi0gICAgLyogZnJvbSB0aGUgVkVSU0lPTiBjb21tYW5kLCAtMSBpZiBub3Qgc3BlY2lmaWVkICovCi0gICAgaW50IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7Ci0gIH0KLWRlZl9maWxlOwotCi1leHRlcm4gZGVmX2ZpbGUgKmRlZl9maWxlX2VtcHR5IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogYWRkX3RvIG1heSBiZSBOVUxMLiAgSWYgbm90LCB0aGlzIC5kZWYgaXMgYXBwZW5kZWQgdG8gaXQgKi8KLWV4dGVybiBkZWZfZmlsZSAqZGVmX2ZpbGVfcGFyc2UgUEFSQU1TICgoY29uc3QgY2hhciAqX2ZpbGVuYW1lLAotCQkJCQkgZGVmX2ZpbGUgKiBfYWRkX3RvKSk7Ci0KLWV4dGVybiB2b2lkIGRlZl9maWxlX2ZyZWUgUEFSQU1TICgoZGVmX2ZpbGUgKiBfZGVmKSk7Ci0KLWV4dGVybiBkZWZfZmlsZV9leHBvcnQgKmRlZl9maWxlX2FkZF9leHBvcnQgUEFSQU1TICgoZGVmX2ZpbGUgKiBfZGVmLAotCQkJCQkJICAgICBjb25zdCBjaGFyICpfbmFtZSwKLQkJCQkJCSBjb25zdCBjaGFyICpfaW50ZXJuYWxfbmFtZSwKLQkJCQkJCSAgICAgaW50IF9vcmRpbmFsKSk7Ci0KLWV4dGVybiBkZWZfZmlsZV9pbXBvcnQgKmRlZl9maWxlX2FkZF9pbXBvcnQgUEFSQU1TICgoZGVmX2ZpbGUgKiBfZGVmLAotCQkJCQkJICAgICBjb25zdCBjaGFyICpfbmFtZSwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqX2Zyb20sCi0JCQkJCQkgICAgIGludCBfb3JkaW5hbCwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKl9pbXBvcnRlZF9uYW1lKSk7Ci0KLWV4dGVybiB2b2lkIGRlZl9maWxlX2FkZF9kaXJlY3RpdmUgUEFSQU1TICgoZGVmX2ZpbGUgKiBfZGVmLAotCQkJCQkgICAgY29uc3QgY2hhciAqcGFyYW0sCi0JCQkJCSAgICBpbnQgbGVuKSk7Ci0KLSNpZmRlZiBERUZfRklMRV9QUklOVAotZXh0ZXJuIHZvaWQgZGVmX2ZpbGVfcHJpbnQgUEFSQU1TICgoRklMRSAqIF9maWxlLAotCQkJCSAgICBkZWZfZmlsZSAqIF9kZWYpKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvZGVmZmlsZXAueSBiL2xkL2RlZmZpbGVwLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2RlNmIuLjAwMDAwMDAKLS0tIGEvbGQvZGVmZmlsZXAueQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDQgKzAsMCBAQAotJXsgLyogZGVmZmlsZXAueSAtIHBhcnNlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotCi0jZGVmaW5lIFRSQUNFIDAKLQotI2RlZmluZSBST1VORF9VUChhLCBiKSAoKChhKSsoKGIpLTEpKSZ+KChiKS0xKSkKLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsIGV0YyksCi0gICBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcywgc28gd2UgY2FuIGhhdmUgbXVsdGlwbGUKLSAgIHlhY2MgZ2VuZXJhdGVkIHBhcnNlcnMgaW4gbGQuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcwotICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQotICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCi0gICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLwotCi0jZGVmaW5lCXl5bWF4ZGVwdGggZGVmX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJZGVmX3BhcnNlCi0jZGVmaW5lCXl5bGV4CWRlZl9sZXgKLSNkZWZpbmUJeXllcnJvcglkZWZfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCWRlZl9sdmFsCi0jZGVmaW5lCXl5Y2hhcglkZWZfY2hhcgotI2RlZmluZQl5eWRlYnVnCWRlZl9kZWJ1ZwotI2RlZmluZQl5eXBhY3QJZGVmX3BhY3QJCi0jZGVmaW5lCXl5cjEJZGVmX3IxCQkJCi0jZGVmaW5lCXl5cjIJZGVmX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCWRlZl9kZWYJCQotI2RlZmluZQl5eWNoawlkZWZfY2hrCQkKLSNkZWZpbmUJeXlwZ28JZGVmX3BnbwkJCi0jZGVmaW5lCXl5YWN0CWRlZl9hY3QJCQotI2RlZmluZQl5eWV4Y2EJZGVmX2V4Y2EKLSNkZWZpbmUgeXllcnJmbGFnIGRlZl9lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJZGVmX25lcnJzCi0jZGVmaW5lCXl5cHMJZGVmX3BzCi0jZGVmaW5lCXl5cHYJZGVmX3B2Ci0jZGVmaW5lCXl5cwlkZWZfcwotI2RlZmluZQl5eV95eXMJZGVmX3l5cwotI2RlZmluZQl5eXN0YXRlCWRlZl9zdGF0ZQotI2RlZmluZQl5eXRtcAlkZWZfdG1wCi0jZGVmaW5lCXl5dglkZWZfdgotI2RlZmluZQl5eV95eXYJZGVmX3l5dgotI2RlZmluZQl5eXZhbAlkZWZfdmFsCi0jZGVmaW5lCXl5bGxvYwlkZWZfbGxvYwotI2RlZmluZSB5eXJlZHMJZGVmX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwlkZWZfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJZGVmX3l5bGhzCi0jZGVmaW5lIHl5bGVuCWRlZl95eWxlbgotI2RlZmluZSB5eWRlZnJlZCBkZWZfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwlkZWZfeXlkZ290bwotI2RlZmluZSB5eXNpbmRleCBkZWZfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggZGVmX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IGRlZl95eWdpbmRleAotI2RlZmluZSB5eXRhYmxlCSBkZWZfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBkZWZfeXljaGVjawotCi1zdGF0aWMgaW50IGRlZl9sZXggKCk7Ci0KLXN0YXRpYyB2b2lkIGRlZl9kZXNjcmlwdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZl9leHBvcnRzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZGVmX2hlYXBzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfaW1wb3J0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfbGlicmFyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZGVmX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfc2VjdGlvbl9hbHQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZl9zdGFja3NpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl92ZXJzaW9uIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfZGlyZWN0aXZlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBkZWZfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBkZWZfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRlZl9kZWJ1ZzsKLXN0YXRpYyBpbnQgZGVmX2xleCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbnQgbGV4X2ZvcmNlZF90b2tlbiA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqbGV4X3BhcnNlX3N0cmluZyA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqbGV4X3BhcnNlX3N0cmluZ19lbmQgPSAwOwotCi0lfQotCi0ldW5pb24gewotICBjaGFyICppZDsKLSAgaW50IG51bWJlcjsKLX07Ci0KLSV0b2tlbiBOQU1FLCBMSUJSQVJZLCBERVNDUklQVElPTiwgU1RBQ0tTSVpFLCBIRUFQU0laRSwgQ09ERSwgREFUQQotJXRva2VuIFNFQ1RJT05TLCBFWFBPUlRTLCBJTVBPUlRTLCBWRVJTSU9OSywgQkFTRSwgQ09OU1RBTlQsIFBSSVZBVEUKLSV0b2tlbiBSRUFEIFdSSVRFIEVYRUNVVEUgU0hBUkVEIE5PTkFNRSBESVJFQ1RJVkUKLSV0b2tlbiA8aWQ+IElECi0ldG9rZW4gPG51bWJlcj4gTlVNQkVSCi0ldHlwZSAgPG51bWJlcj4gb3B0X2Jhc2Ugb3B0X29yZGluYWwKLSV0eXBlICA8bnVtYmVyPiBhdHRyIGF0dHJfbGlzdCBvcHRfbnVtYmVyIGV4cF9vcHRfbGlzdCBleHBfb3B0Ci0ldHlwZSAgPGlkPiBvcHRfbmFtZSBvcHRfZXF1YWxfbmFtZSAKLQotJSUKLQotc3RhcnQ6IHN0YXJ0IGNvbW1hbmQKLQl8IGNvbW1hbmQKLQk7Ci0KLWNvbW1hbmQ6IAotCQlOQU1FIG9wdF9uYW1lIG9wdF9iYXNlIHsgZGVmX25hbWUgKCQyLCAkMyk7IH0KLQl8CUxJQlJBUlkgb3B0X25hbWUgb3B0X2Jhc2UgeyBkZWZfbGlicmFyeSAoJDIsICQzKTsgfQotCXwJREVTQ1JJUFRJT04gSUQgeyBkZWZfZGVzY3JpcHRpb24gKCQyKTt9Ci0JfAlTVEFDS1NJWkUgTlVNQkVSIG9wdF9udW1iZXIgeyBkZWZfc3RhY2tzaXplICgkMiwgJDMpO30KLQl8CUhFQVBTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX2hlYXBzaXplICgkMiwgJDMpO30KLQl8CUNPREUgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCJDT0RFIiwgJDIpO30KLQl8CURBVEEgYXR0cl9saXN0ICB7IGRlZl9zZWN0aW9uICgiREFUQSIsICQyKTt9Ci0JfAlTRUNUSU9OUyBzZWNsaXN0Ci0JfAlFWFBPUlRTIGV4cGxpc3QgCi0JfAlJTVBPUlRTIGltcGxpc3QKLQl8CVZFUlNJT05LIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwgMCk7fQotCXwJVkVSU0lPTksgTlVNQkVSICcuJyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsICQ0KTt9Ci0JfAlESVJFQ1RJVkUgSUQgeyBkZWZfZGlyZWN0aXZlICgkMik7fQotCTsKLQotCi1leHBsaXN0OgotCQkvKiBFTVBUWSAqLwotCXwJZXhwbGluZQotCXwJZXhwbGlzdCBleHBsaW5lCi0JOwotCi1leHBsaW5lOgotCQlJRCBvcHRfZXF1YWxfbmFtZSBvcHRfb3JkaW5hbCBleHBfb3B0X2xpc3QKLQkJCXsgZGVmX2V4cG9ydHMgKCQxLCAkMiwgJDMsICQ0KTsgfQotCTsKLWV4cF9vcHRfbGlzdDoKLQkJZXhwX29wdCBleHBfb3B0X2xpc3QgeyAkJCA9ICQxIHwgJDI7IH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotZXhwX29wdDoKLQkJTk9OQU1FCQl7ICQkID0gMTsgfQotCXwJQ09OU1RBTlQJeyAkJCA9IDI7IH0KLQl8CURBVEEJCXsgJCQgPSA0OyB9Ci0JfAlQUklWQVRFCQl7ICQkID0gODsgfQotCTsKLWltcGxpc3Q6CQotCQlpbXBsaXN0IGltcGxpbmUKLQl8CWltcGxpbmUKLQk7Ci0KLWltcGxpbmU6Ci0gICAgICAgICAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBJRCAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICQ1LCAkNywgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBOVU1CRVIgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICQ1LCAgMCwgJDcpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICAwLCAkNSwgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICAwLCAgMCwgJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwgJDEsICQzLCAkNSwgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgICAgICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwgJDEsICAwLCAkMywgLTEpOyB9Ci07Ci0KLXNlY2xpc3Q6Ci0JCXNlY2xpc3Qgc2VjbGluZQotCXwJc2VjbGluZQotCTsKLQotc2VjbGluZToKLQlJRCBhdHRyX2xpc3QgeyBkZWZfc2VjdGlvbiAoJDEsICQyKTt9Ci0JfCBJRCBJRCB7IGRlZl9zZWN0aW9uX2FsdCAoJDEsICQyKTt9Ci0JOwotCi1hdHRyX2xpc3Q6Ci0JYXR0cl9saXN0IG9wdF9jb21tYSBhdHRyIHsgJCQgPSAkMSB8ICQzOyB9Ci0JfCBhdHRyIHsgJCQgPSAkMTsgfQotCTsKLQotb3B0X2NvbW1hOgotCScsJwotCXwgCi0JOwotb3B0X251bWJlcjogJywnIE5VTUJFUiB7ICQkPSQyO30KLQl8CSAgIHsgJCQ9LTE7fQotCTsKLQkKLWF0dHI6Ci0JCVJFQUQJeyAkJCA9IDE7fQotCXwJV1JJVEUJeyAkJCA9IDI7fQkKLQl8CUVYRUNVVEUJeyAkJD00O30KLQl8CVNIQVJFRAl7ICQkPTg7fQotCTsKLQotb3B0X25hbWU6IElECQl7ICQkID0gJDE7IH0KLQl8CQl7ICQkID0gMDsgfQotCTsKLQotb3B0X29yZGluYWw6IAotCSAgJ0AnIE5VTUJFUiAgICAgeyAkJCA9ICQyO30KLQl8ICAgICAgICAgICAgICAgIHsgJCQgPSAtMTt9Ci0JOwotCi1vcHRfZXF1YWxfbmFtZToKLSAgICAgICAgICAnPScgSUQJeyAkJCA9ICQyOyB9Ci0gICAgICAgIHwgCQl7ICQkID0gIDA7IH0JCQkgCi0JOwotCi1vcHRfYmFzZTogQkFTRQknPScgTlVNQkVSCXsgJCQgPSAkMzt9Ci0JfAl7ICQkID0gMDt9Ci0JOwotCi0JCi0KLSUlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgRklMRSAqdGhlX2ZpbGU7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVmX2ZpbGVuYW1lOwotc3RhdGljIGludCBsaW5lbnVtYmVyOwotc3RhdGljIGRlZl9maWxlICpkZWY7Ci1zdGF0aWMgaW50IHNhd19uZXdsaW5lOwotCi1zdHJ1Y3QgZGlyZWN0aXZlCi0gIHsKLSAgICBzdHJ1Y3QgZGlyZWN0aXZlICpuZXh0OwotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGxlbjsKLSAgfTsKLQotc3RhdGljIHN0cnVjdCBkaXJlY3RpdmUgKmRpcmVjdGl2ZXMgPSAwOwotCi1kZWZfZmlsZSAqCi1kZWZfZmlsZV9lbXB0eSAoKQotewotICBkZWZfZmlsZSAqcnYgPSAoZGVmX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkZWZfZmlsZSkpOwotICBtZW1zZXQgKHJ2LCAwLCBzaXplb2YgKGRlZl9maWxlKSk7Ci0gIHJ2LT5pc19kbGwgPSAtMTsKLSAgcnYtPmJhc2VfYWRkcmVzcyA9IChiZmRfdm1hKSAoLTEpOwotICBydi0+c3RhY2tfcmVzZXJ2ZSA9IHJ2LT5zdGFja19jb21taXQgPSAtMTsKLSAgcnYtPmhlYXBfcmVzZXJ2ZSA9IHJ2LT5oZWFwX2NvbW1pdCA9IC0xOwotICBydi0+dmVyc2lvbl9tYWpvciA9IHJ2LT52ZXJzaW9uX21pbm9yID0gLTE7Ci0gIHJldHVybiBydjsKLX0KLQotZGVmX2ZpbGUgKgotZGVmX2ZpbGVfcGFyc2UgKGZpbGVuYW1lLCBhZGRfdG8pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBkZWZfZmlsZSAqYWRkX3RvOwotewotICBzdHJ1Y3QgZGlyZWN0aXZlICpkOwotCi0gIHRoZV9maWxlID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotICBkZWZfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbGluZW51bWJlciA9IDE7Ci0gIGlmICghdGhlX2ZpbGUpCi0gICAgewotICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChhZGRfdG8pCi0gICAgewotICAgICAgZGVmID0gYWRkX3RvOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRlZiA9IGRlZl9maWxlX2VtcHR5ICgpOwotICAgIH0KLQotICBzYXdfbmV3bGluZSA9IDE7Ci0gIGlmIChkZWZfcGFyc2UgKCkpCi0gICAgewotICAgICAgZGVmX2ZpbGVfZnJlZSAoZGVmKTsKLSAgICAgIGZjbG9zZSAodGhlX2ZpbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZjbG9zZSAodGhlX2ZpbGUpOwotCi0gIGZvciAoZCA9IGRpcmVjdGl2ZXM7IGQ7IGQgPSBkLT5uZXh0KQotICAgIHsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgiQWRkaW5nIGRpcmVjdGl2ZSAlMDh4IGAlcydcbiIsIGQtPm5hbWUsIGQtPm5hbWUpOwotI2VuZGlmCi0gICAgICBkZWZfZmlsZV9hZGRfZGlyZWN0aXZlIChkZWYsIGQtPm5hbWUsIGQtPmxlbik7Ci0gICAgfQotCi0gIHJldHVybiBkZWY7Ci19Ci0KLXZvaWQKLWRlZl9maWxlX2ZyZWUgKGRlZikKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLXsKLSAgaW50IGk7Ci0gIGlmICghZGVmKQotICAgIHJldHVybjsKLSAgaWYgKGRlZi0+bmFtZSkKLSAgICBmcmVlIChkZWYtPm5hbWUpOwotICBpZiAoZGVmLT5kZXNjcmlwdGlvbikKLSAgICBmcmVlIChkZWYtPmRlc2NyaXB0aW9uKTsKLQotICBpZiAoZGVmLT5zZWN0aW9uX2RlZnMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX3NlY3Rpb25fZGVmczsgaSsrKQotCXsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5uYW1lKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcykKLQkgICAgZnJlZSAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpOwotCX0KLSAgICAgIGZyZWUgKGRlZi0+c2VjdGlvbl9kZWZzKTsKLSAgICB9Ci0KLSAgaWYgKGRlZi0+ZXhwb3J0cykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGlmIChkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZQotCSAgICAgICYmIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lICE9IGRlZi0+ZXhwb3J0c1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+ZXhwb3J0c1tpXS5uYW1lKTsKLQl9Ci0gICAgICBmcmVlIChkZWYtPmV4cG9ydHMpOwotICAgIH0KLQotICBpZiAoZGVmLT5pbXBvcnRzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9pbXBvcnRzOyBpKyspCi0JewotCSAgaWYgKGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lCi0JICAgICAgJiYgZGVmLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUgIT0gZGVmLT5pbXBvcnRzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgIGlmIChkZWYtPmltcG9ydHNbaV0ubmFtZSkKLQkgICAgZnJlZSAoZGVmLT5pbXBvcnRzW2ldLm5hbWUpOwotCX0KLSAgICAgIGZyZWUgKGRlZi0+aW1wb3J0cyk7Ci0gICAgfQotCi0gIHdoaWxlIChkZWYtPm1vZHVsZXMpCi0gICAgewotICAgICAgZGVmX2ZpbGVfbW9kdWxlICptID0gZGVmLT5tb2R1bGVzOwotICAgICAgZGVmLT5tb2R1bGVzID0gZGVmLT5tb2R1bGVzLT5uZXh0OwotICAgICAgZnJlZSAobSk7Ci0gICAgfQotCi0gIGZyZWUgKGRlZik7Ci19Ci0KLSNpZmRlZiBERUZfRklMRV9QUklOVAotdm9pZAotZGVmX2ZpbGVfcHJpbnQgKGZpbGUsIGRlZikKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLXsKLSAgaW50IGk7Ci0gIGZwcmludGYgKGZpbGUsICI+Pj4+IGRlZl9maWxlIGF0IDB4JTA4eFxuIiwgZGVmKTsKLSAgaWYgKGRlZi0+bmFtZSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBuYW1lOiAlc1xuIiwgZGVmLT5uYW1lID8gZGVmLT5uYW1lIDogIih1bnNwZWNpZmllZCkiKTsKLSAgaWYgKGRlZi0+aXNfZGxsICE9IC0xKQotICAgIGZwcmludGYgKGZpbGUsICIgIGlzIGRsbDogJXNcbiIsIGRlZi0+aXNfZGxsID8gInllcyIgOiAibm8iKTsKLSAgaWYgKGRlZi0+YmFzZV9hZGRyZXNzICE9IChiZmRfdm1hKSAoLTEpKQotICAgIGZwcmludGYgKGZpbGUsICIgIGJhc2UgYWRkcmVzczogMHglMDh4XG4iLCBkZWYtPmJhc2VfYWRkcmVzcyk7Ci0gIGlmIChkZWYtPmRlc2NyaXB0aW9uKQotICAgIGZwcmludGYgKGZpbGUsICIgIGRlc2NyaXB0aW9uOiBgJXMnXG4iLCBkZWYtPmRlc2NyaXB0aW9uKTsKLSAgaWYgKGRlZi0+c3RhY2tfcmVzZXJ2ZSAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBzdGFjayByZXNlcnZlOiAweCUwOHhcbiIsIGRlZi0+c3RhY2tfcmVzZXJ2ZSk7Ci0gIGlmIChkZWYtPnN0YWNrX2NvbW1pdCAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBzdGFjayBjb21taXQ6IDB4JTA4eFxuIiwgZGVmLT5zdGFja19jb21taXQpOwotICBpZiAoZGVmLT5oZWFwX3Jlc2VydmUgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgaGVhcCByZXNlcnZlOiAweCUwOHhcbiIsIGRlZi0+aGVhcF9yZXNlcnZlKTsKLSAgaWYgKGRlZi0+aGVhcF9jb21taXQgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgaGVhcCBjb21taXQ6IDB4JTA4eFxuIiwgZGVmLT5oZWFwX2NvbW1pdCk7Ci0KLSAgaWYgKGRlZi0+bnVtX3NlY3Rpb25fZGVmcyA+IDApCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiAgc2VjdGlvbiBkZWZzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fc2VjdGlvbl9kZWZzOyBpKyspCi0JewotCSAgZnByaW50ZiAoZmlsZSwgIiAgICBuYW1lOiBgJXMnLCBjbGFzczogYCVzJywgZmxhZ3M6IiwKLQkJICAgZGVmLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSwgZGVmLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpOwotCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfcmVhZCkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBSIik7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ193cml0ZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBXIik7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19leGVjdXRlKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIFgiKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3NoYXJlZCkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBTIik7Ci0JICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkZWYtPm51bV9leHBvcnRzID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICBleHBvcnRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGZwcmludGYgKGZpbGUsICIgICAgbmFtZTogYCVzJywgaW50OiBgJXMnLCBvcmRpbmFsOiAlZCwgZmxhZ3M6IiwKLQkJICAgZGVmLT5leHBvcnRzW2ldLm5hbWUsIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgICBkZWYtPmV4cG9ydHNbaV0ub3JkaW5hbCk7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfcHJpdmF0ZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBQIik7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfY29uc3RhbnQpCi0JICAgIGZwcmludGYgKGZpbGUsICIgQyIpOwotCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX25vbmFtZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBOIik7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfZGF0YSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBEIik7Ci0JICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkZWYtPm51bV9pbXBvcnRzID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICBpbXBvcnRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1faW1wb3J0czsgaSsrKQotCXsKLQkgIGZwcmludGYgKGZpbGUsICIgICAgaW50OiAlcywgZnJvbTogYCVzJywgbmFtZTogYCVzJywgb3JkaW5hbDogJWRcbiIsCi0JCSAgIGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgICBkZWYtPmltcG9ydHNbaV0ubW9kdWxlLAotCQkgICBkZWYtPmltcG9ydHNbaV0ubmFtZSwKLQkJICAgZGVmLT5pbXBvcnRzW2ldLm9yZGluYWwpOwotCX0KLSAgICB9Ci0gIGlmIChkZWYtPnZlcnNpb25fbWFqb3IgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgdmVyc2lvbjogJWQuJWRcbiIsIGRlZi0+dmVyc2lvbl9tYWpvciwgZGVmLT52ZXJzaW9uX21pbm9yKTsKLSAgZnByaW50ZiAoZmlsZSwgIjw8PDwgZGVmX2ZpbGUgYXQgMHglMDh4XG4iLCBkZWYpOwotfQotI2VuZGlmCi0KLWRlZl9maWxlX2V4cG9ydCAqCi1kZWZfZmlsZV9hZGRfZXhwb3J0IChkZWYsIGV4dGVybmFsX25hbWUsIGludGVybmFsX25hbWUsIG9yZGluYWwpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNvbnN0IGNoYXIgKmV4dGVybmFsX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotewotICBkZWZfZmlsZV9leHBvcnQgKmU7Ci0gIGludCBtYXhfZXhwb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2V4cG9ydHMsIDMyKTsKLSAgaWYgKGRlZi0+bnVtX2V4cG9ydHMgPj0gbWF4X2V4cG9ydHMpCi0gICAgewotICAgICAgbWF4X2V4cG9ydHMgPSBST1VORF9VUChkZWYtPm51bV9leHBvcnRzKzEsIDMyKTsKLSAgICAgIGlmIChkZWYtPmV4cG9ydHMpCi0JZGVmLT5leHBvcnRzID0gKGRlZl9maWxlX2V4cG9ydCAqKSB4cmVhbGxvYyAoZGVmLT5leHBvcnRzLCBtYXhfZXhwb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfZXhwb3J0KSk7Ci0gICAgICBlbHNlCi0JZGVmLT5leHBvcnRzID0gKGRlZl9maWxlX2V4cG9ydCAqKSB4bWFsbG9jIChtYXhfZXhwb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfZXhwb3J0KSk7Ci0gICAgfQotICBlID0gZGVmLT5leHBvcnRzICsgZGVmLT5udW1fZXhwb3J0czsKLSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKGRlZl9maWxlX2V4cG9ydCkpOwotICBpZiAoaW50ZXJuYWxfbmFtZSAmJiAhZXh0ZXJuYWxfbmFtZSkKLSAgICBleHRlcm5hbF9uYW1lID0gaW50ZXJuYWxfbmFtZTsKLSAgaWYgKGV4dGVybmFsX25hbWUgJiYgIWludGVybmFsX25hbWUpCi0gICAgaW50ZXJuYWxfbmFtZSA9IGV4dGVybmFsX25hbWU7Ci0gIGUtPm5hbWUgPSB4c3RyZHVwIChleHRlcm5hbF9uYW1lKTsKLSAgZS0+aW50ZXJuYWxfbmFtZSA9IHhzdHJkdXAgKGludGVybmFsX25hbWUpOwotICBlLT5vcmRpbmFsID0gb3JkaW5hbDsKLSAgZGVmLT5udW1fZXhwb3J0cysrOwotICByZXR1cm4gZTsKLX0KLQotc3RhdGljIGRlZl9maWxlX21vZHVsZSAqCi1kZWZfc3Rhc2hfbW9kdWxlIChkZWYsIG5hbWUpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGRlZl9maWxlX21vZHVsZSAqczsKLSAgZm9yIChzPWRlZi0+bW9kdWxlczsgczsgcz1zLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHMtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICByZXR1cm4gczsKLSAgcyA9IChkZWZfZmlsZV9tb2R1bGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkZWZfZmlsZV9tb2R1bGUpICsgc3RybGVuIChuYW1lKSk7Ci0gIHMtPm5leHQgPSBkZWYtPm1vZHVsZXM7Ci0gIGRlZi0+bW9kdWxlcyA9IHM7Ci0gIHMtPnVzZXJfZGF0YSA9IDA7Ci0gIHN0cmNweSAocy0+bmFtZSwgbmFtZSk7Ci0gIHJldHVybiBzOwotfQotCi1kZWZfZmlsZV9pbXBvcnQgKgotZGVmX2ZpbGVfYWRkX2ltcG9ydCAoZGVmLCBuYW1lLCBtb2R1bGUsIG9yZGluYWwsIGludGVybmFsX25hbWUpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci17Ci0gIGRlZl9maWxlX2ltcG9ydCAqaTsKLSAgaW50IG1heF9pbXBvcnRzID0gUk9VTkRfVVAoZGVmLT5udW1faW1wb3J0cywgMTYpOwotICBpZiAoZGVmLT5udW1faW1wb3J0cyA+PSBtYXhfaW1wb3J0cykKLSAgICB7Ci0gICAgICBtYXhfaW1wb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2ltcG9ydHMrMSwgMTYpOwotICAgICAgaWYgKGRlZi0+aW1wb3J0cykKLQlkZWYtPmltcG9ydHMgPSAoZGVmX2ZpbGVfaW1wb3J0ICopIHhyZWFsbG9jIChkZWYtPmltcG9ydHMsIG1heF9pbXBvcnRzICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICAgIGVsc2UKLQlkZWYtPmltcG9ydHMgPSAoZGVmX2ZpbGVfaW1wb3J0ICopIHhtYWxsb2MgKG1heF9pbXBvcnRzICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICB9Ci0gIGkgPSBkZWYtPmltcG9ydHMgKyBkZWYtPm51bV9pbXBvcnRzOwotICBtZW1zZXQgKGksIDAsIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7Ci0gIGlmIChuYW1lKQotICAgIGktPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgaWYgKG1vZHVsZSkKLSAgICBpLT5tb2R1bGUgPSBkZWZfc3Rhc2hfbW9kdWxlKGRlZiwgbW9kdWxlKTsKLSAgaS0+b3JkaW5hbCA9IG9yZGluYWw7Ci0gIGlmIChpbnRlcm5hbF9uYW1lKQotICAgIGktPmludGVybmFsX25hbWUgPSB4c3RyZHVwIChpbnRlcm5hbF9uYW1lKTsKLSAgZWxzZQotICAgIGktPmludGVybmFsX25hbWUgPSBpLT5uYW1lOwotICBkZWYtPm51bV9pbXBvcnRzKys7Ci0gIHJldHVybiBpOwotfQotCi1zdHJ1Y3QKLXsKLSAgY2hhciAqcGFyYW07Ci0gIGludCB0b2tlbjsKLX0KLWRpcm9wdHNbXSA9Ci17Ci0gIHsgIi1oZWFwIiwgSEVBUFNJWkUgfSwKLSAgeyAiLXN0YWNrIiwgU1RBQ0tTSVpFIH0sCi0gIHsgIi1hdHRyIiwgU0VDVElPTlMgfSwKLSAgeyAiLWV4cG9ydCIsIEVYUE9SVFMgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXZvaWQKLWRlZl9maWxlX2FkZF9kaXJlY3RpdmUgKG15X2RlZiwgcGFyYW0sIGxlbikKLSAgICAgZGVmX2ZpbGUgKm15X2RlZjsKLSAgICAgY29uc3QgY2hhciAqcGFyYW07Ci0gICAgIGludCBsZW47Ci17Ci0gIGRlZl9maWxlICpzYXZlX2RlZiA9IGRlZjsKLSAgY29uc3QgY2hhciAqcGVuZCA9IHBhcmFtICsgbGVuOwotICBjb25zdCBjaGFyICp0ZW5kID0gcGFyYW07Ci0gIGludCBpOwotCi0gIGRlZiA9IG15X2RlZjsKLQotICB3aGlsZSAocGFyYW0gPCBwZW5kKQotICAgIHsKLSAgICAgIHdoaWxlIChwYXJhbSA8IHBlbmQgJiYgaXNzcGFjZSAoKnBhcmFtKSkKLQlwYXJhbSsrOwotICAgICAgZm9yICh0ZW5kID0gcGFyYW0gKyAxOwotCSAgIHRlbmQgPCBwZW5kICYmICEoaXNzcGFjZSAodGVuZFstMV0pICYmICp0ZW5kID09ICctJyk7Ci0JICAgdGVuZCsrKTsKLQotICAgICAgZm9yIChpID0gMDsgZGlyb3B0c1tpXS5wYXJhbTsgaSsrKQotCXsKLQkgIGludCBsZW4gPSBzdHJsZW4gKGRpcm9wdHNbaV0ucGFyYW0pOwotCSAgaWYgKHRlbmQgLSBwYXJhbSA+PSBsZW4KLQkgICAgICAmJiBzdHJuY21wIChwYXJhbSwgZGlyb3B0c1tpXS5wYXJhbSwgbGVuKSA9PSAwCi0JICAgICAgJiYgKHBhcmFtW2xlbl0gPT0gJzonIHx8IHBhcmFtW2xlbl0gPT0gJyAnKSkKLQkgICAgewotCSAgICAgIGxleF9wYXJzZV9zdHJpbmdfZW5kID0gdGVuZDsKLQkgICAgICBsZXhfcGFyc2Vfc3RyaW5nID0gcGFyYW0gKyBsZW4gKyAxOwotCSAgICAgIGxleF9mb3JjZWRfdG9rZW4gPSBkaXJvcHRzW2ldLnRva2VuOwotCSAgICAgIHNhd19uZXdsaW5lID0gMDsKLQkgICAgICBkZWZfcGFyc2UgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghZGlyb3B0c1tpXS5wYXJhbSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIldhcm5pbmc6IC5kcmVjdHZlIGAlLipzJyB1bnJlY29nbml6ZWRcbiIpLAotCQkgdGVuZCAtIHBhcmFtLCBwYXJhbSk7Ci0JfQotICAgICAgbGV4X3BhcnNlX3N0cmluZyA9IDA7Ci0gICAgICBwYXJhbSA9IHRlbmQ7Ci0gICAgfQotCi0gIGRlZiA9IHNhdmVfZGVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBQYXJzZXIgQ2FsbGJhY2tzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1kZWZfbmFtZSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIGlmIChkZWYtPm5hbWUpCi0gICAgZnJlZSAoZGVmLT5uYW1lKTsKLSAgZGVmLT5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRlZi0+YmFzZV9hZGRyZXNzID0gYmFzZTsKLSAgZGVmLT5pc19kbGwgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX2xpYnJhcnkgKG5hbWUsIGJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBiYXNlOwotewotICBpZiAoZGVmLT5uYW1lKQotICAgIGZyZWUgKGRlZi0+bmFtZSk7Ci0gIGRlZi0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBkZWYtPmJhc2VfYWRkcmVzcyA9IGJhc2U7Ci0gIGRlZi0+aXNfZGxsID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9kZXNjcmlwdGlvbiAodGV4dCkKLSAgICAgY29uc3QgY2hhciAqdGV4dDsKLXsKLSAgaW50IGxlbiA9IGRlZi0+ZGVzY3JpcHRpb24gPyBzdHJsZW4gKGRlZi0+ZGVzY3JpcHRpb24pIDogMDsKLSAgbGVuICs9IHN0cmxlbiAodGV4dCkgKyAxOwotICBpZiAoZGVmLT5kZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICBkZWYtPmRlc2NyaXB0aW9uID0gKGNoYXIgKikgeHJlYWxsb2MgKGRlZi0+ZGVzY3JpcHRpb24sIGxlbik7Ci0gICAgICBzdHJjYXQgKGRlZi0+ZGVzY3JpcHRpb24sIHRleHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRlZi0+ZGVzY3JpcHRpb24gPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICAgICAgc3RyY3B5IChkZWYtPmRlc2NyaXB0aW9uLCB0ZXh0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfc3RhY2tzaXplIChyZXNlcnZlLCBjb21taXQpCi0gICAgIGludCByZXNlcnZlOwotICAgICBpbnQgY29tbWl0OwotewotICBkZWYtPnN0YWNrX3Jlc2VydmUgPSByZXNlcnZlOwotICBkZWYtPnN0YWNrX2NvbW1pdCA9IGNvbW1pdDsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9oZWFwc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQotICAgICBpbnQgcmVzZXJ2ZTsKLSAgICAgaW50IGNvbW1pdDsKLXsKLSAgZGVmLT5oZWFwX3Jlc2VydmUgPSByZXNlcnZlOwotICBkZWYtPmhlYXBfY29tbWl0ID0gY29tbWl0OwotfQotCi1zdGF0aWMgdm9pZAotZGVmX3NlY3Rpb24gKG5hbWUsIGF0dHIpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBhdHRyOwotewotICBkZWZfZmlsZV9zZWN0aW9uICpzOwotICBpbnQgbWF4X3NlY3Rpb25zID0gUk9VTkRfVVAoZGVmLT5udW1fc2VjdGlvbl9kZWZzLCA0KTsKLSAgaWYgKGRlZi0+bnVtX3NlY3Rpb25fZGVmcyA+PSBtYXhfc2VjdGlvbnMpCi0gICAgewotICAgICAgbWF4X3NlY3Rpb25zID0gUk9VTkRfVVAoZGVmLT5udW1fc2VjdGlvbl9kZWZzKzEsIDQpOwotICAgICAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzKQotCWRlZi0+c2VjdGlvbl9kZWZzID0gKGRlZl9maWxlX3NlY3Rpb24gKikgeHJlYWxsb2MgKGRlZi0+c2VjdGlvbl9kZWZzLCBtYXhfc2VjdGlvbnMgKiBzaXplb2YgKGRlZl9maWxlX2ltcG9ydCkpOwotICAgICAgZWxzZQotCWRlZi0+c2VjdGlvbl9kZWZzID0gKGRlZl9maWxlX3NlY3Rpb24gKikgeG1hbGxvYyAobWF4X3NlY3Rpb25zICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICB9Ci0gIHMgPSBkZWYtPnNlY3Rpb25fZGVmcyArIGRlZi0+bnVtX3NlY3Rpb25fZGVmczsKLSAgbWVtc2V0IChzLCAwLCBzaXplb2YgKGRlZl9maWxlX3NlY3Rpb24pKTsKLSAgcy0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBpZiAoYXR0ciAmIDEpCi0gICAgcy0+ZmxhZ19yZWFkID0gMTsKLSAgaWYgKGF0dHIgJiAyKQotICAgIHMtPmZsYWdfd3JpdGUgPSAxOwotICBpZiAoYXR0ciAmIDQpCi0gICAgcy0+ZmxhZ19leGVjdXRlID0gMTsKLSAgaWYgKGF0dHIgJiA4KQotICAgIHMtPmZsYWdfc2hhcmVkID0gMTsKLQotICBkZWYtPm51bV9zZWN0aW9uX2RlZnMrKzsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9zZWN0aW9uX2FsdCAobmFtZSwgYXR0cikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqYXR0cjsKLXsKLSAgaW50IGF2YWwgPSAwOwotICBmb3IgKDsgKmF0dHI7IGF0dHIrKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCphdHRyKQotCXsKLQljYXNlICdSJzoKLQljYXNlICdyJzoKLQkgIGF2YWwgfD0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1cnOgotCWNhc2UgJ3cnOgotCSAgYXZhbCB8PSAyOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JY2FzZSAneCc6Ci0JICBhdmFsIHw9IDQ7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQljYXNlICdzJzoKLQkgIGF2YWwgfD0gODsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGRlZl9zZWN0aW9uIChuYW1lLCBhdmFsKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9leHBvcnRzIChleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqZXh0ZXJuYWxfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgZGVmX2ZpbGVfZXhwb3J0ICpkZmU7Ci0KLSAgaWYgKCFpbnRlcm5hbF9uYW1lICYmIGV4dGVybmFsX25hbWUpCi0gICAgaW50ZXJuYWxfbmFtZSA9IGV4dGVybmFsX25hbWU7Ci0jaWYgVFJBQ0UKLSAgcHJpbnRmICgiZGVmX2V4cG9ydHMsIGV4dD0lcyBpbnQ9JXNcbiIsIGV4dGVybmFsX25hbWUsIGludGVybmFsX25hbWUpOwotI2VuZGlmCi0KLSAgZGZlID0gZGVmX2ZpbGVfYWRkX2V4cG9ydCAoZGVmLCBleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsKTsKLSAgaWYgKGZsYWdzICYgMSkKLSAgICBkZmUtPmZsYWdfbm9uYW1lID0gMTsKLSAgaWYgKGZsYWdzICYgMikKLSAgICBkZmUtPmZsYWdfY29uc3RhbnQgPSAxOwotICBpZiAoZmxhZ3MgJiA0KQotICAgIGRmZS0+ZmxhZ19kYXRhID0gMTsKLSAgaWYgKGZsYWdzICYgOCkKLSAgICBkZmUtPmZsYWdfcHJpdmF0ZSA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfaW1wb3J0IChpbnRlcm5hbF9uYW1lLCBtb2R1bGUsIGRsbGV4dCwgbmFtZSwgb3JkaW5hbCkKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbW9kdWxlOwotICAgICBjb25zdCBjaGFyICpkbGxleHQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotewotICBjaGFyICpidWYgPSAwOwotCi0gIGlmIChkbGxleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG1vZHVsZSkgKyBzdHJsZW4gKGRsbGV4dCkgKyAyKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzLiVzIiwgbW9kdWxlLCBkbGxleHQpOwotICAgICAgbW9kdWxlID0gYnVmOwotICAgIH0KLQotICBkZWZfZmlsZV9hZGRfaW1wb3J0IChkZWYsIG5hbWUsIG1vZHVsZSwgb3JkaW5hbCwgaW50ZXJuYWxfbmFtZSk7Ci0gIGlmIChidWYpCi0gICAgZnJlZSAoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl92ZXJzaW9uIChtYWpvciwgbWlub3IpCi0gICAgIGludCBtYWpvcjsKLSAgICAgaW50IG1pbm9yOwotewotICBkZWYtPnZlcnNpb25fbWFqb3IgPSBtYWpvcjsKLSAgZGVmLT52ZXJzaW9uX21pbm9yID0gbWlub3I7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfZGlyZWN0aXZlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RydWN0IGRpcmVjdGl2ZSAqZCA9IChzdHJ1Y3QgZGlyZWN0aXZlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGRpcmVjdGl2ZSkpOwotICBkLT5uZXh0ID0gZGlyZWN0aXZlczsKLSAgZGlyZWN0aXZlcyA9IGQ7Ci0gIGQtPm5hbWUgPSB4c3RyZHVwIChzdHIpOwotICBkLT5sZW4gPSBzdHJsZW4gKHN0cik7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlZl9lcnJvciAoZXJyKQotICAgICBjb25zdCBjaGFyICplcnI7Ci17Ci0gIGVpbmZvICgiJVA6ICVzOiVkOiAlc1xuIiwgZGVmX2ZpbGVuYW1lLCBsaW5lbnVtYmVyLCBlcnIpOwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIExleGljYWwgU2Nhbm5lcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jdW5kZWYgVFJBQ0UKLSNkZWZpbmUgVFJBQ0UgMAotCi0vKiBOZXZlciBmcmVlZCwgYnV0IGFsd2F5cyByZXVzZWQgYXMgbmVlZGVkLCBzbyBubyByZWFsIGxlYWsgKi8KLXN0YXRpYyBjaGFyICpidWZmZXIgPSAwOwotc3RhdGljIGludCBidWZsZW4gPSAwOwotc3RhdGljIGludCBidWZwdHIgPSAwOwotCi1zdGF0aWMgdm9pZAotcHV0X2J1ZiAoYykKLSAgICAgY2hhciBjOwotewotICBpZiAoYnVmcHRyID09IGJ1ZmxlbikKLSAgICB7Ci0gICAgICBidWZsZW4gKz0gNTA7CQkvKiBvdmVybHkgcmVhc29uYWJsZSwgZWg/ICovCi0gICAgICBpZiAoYnVmZmVyKQotCWJ1ZmZlciA9IChjaGFyICopIHhyZWFsbG9jIChidWZmZXIsIGJ1ZmxlbiArIDEpOwotICAgICAgZWxzZQotCWJ1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKGJ1ZmxlbiArIDEpOwotICAgIH0KLSAgYnVmZmVyW2J1ZnB0cisrXSA9IGM7Ci0gIGJ1ZmZlcltidWZwdHJdID0gMDsJCS8qIG5vdCBvcHRpbWFsLCBidXQgdmVyeSBjb252ZW5pZW50ICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IHRva2VuOwotfQotdG9rZW5zW10gPQotewotICB7ICJCQVNFIiwgQkFTRSB9LAotICB7ICJDT0RFIiwgQ09ERSB9LAotICB7ICJDT05TVEFOVCIsIENPTlNUQU5UIH0sCi0gIHsgIkRBVEEiLCBEQVRBIH0sCi0gIHsgIkRFU0NSSVBUSU9OIiwgREVTQ1JJUFRJT04gfSwKLSAgeyAiRElSRUNUSVZFIiwgRElSRUNUSVZFIH0sCi0gIHsgIkVYRUNVVEUiLCBFWEVDVVRFIH0sCi0gIHsgIkVYUE9SVFMiLCBFWFBPUlRTIH0sCi0gIHsgIkhFQVBTSVpFIiwgSEVBUFNJWkUgfSwKLSAgeyAiSU1QT1JUUyIsIElNUE9SVFMgfSwKLSAgeyAiTElCUkFSWSIsIExJQlJBUlkgfSwKLSAgeyAiTkFNRSIsIE5BTUUgfSwKLSAgeyAiTk9OQU1FIiwgTk9OQU1FIH0sCi0gIHsgIlBSSVZBVEUiLCBQUklWQVRFIH0sCi0gIHsgIlJFQUQiLCBSRUFEIH0sCi0gIHsgIlNFQ1RJT05TIiwgU0VDVElPTlMgfSwKLSAgeyAiU0VHTUVOVFMiLCBTRUNUSU9OUyB9LAotICB7ICJTSEFSRUQiLCBTSEFSRUQgfSwKLSAgeyAiU1RBQ0tTSVpFIiwgU1RBQ0tTSVpFIH0sCi0gIHsgIlZFUlNJT04iLCBWRVJTSU9OSyB9LAotICB7ICJXUklURSIsIFdSSVRFIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgaW50Ci1kZWZfZ2V0YyAoKQotewotICBpbnQgcnY7Ci0gIGlmIChsZXhfcGFyc2Vfc3RyaW5nKQotICAgIHsKLSAgICAgIGlmIChsZXhfcGFyc2Vfc3RyaW5nID49IGxleF9wYXJzZV9zdHJpbmdfZW5kKQotCXJ2ID0gRU9GOwotICAgICAgZWxzZQotCXJ2ID0gKmxleF9wYXJzZV9zdHJpbmcrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBydiA9IGZnZXRjICh0aGVfZmlsZSk7Ci0gICAgfQotICBpZiAocnYgPT0gJ1xuJykKLSAgICBzYXdfbmV3bGluZSA9IDE7Ci0gIHJldHVybiBydjsKLX0KLQotc3RhdGljIGludAotZGVmX3VuZ2V0YyAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChsZXhfcGFyc2Vfc3RyaW5nKQotICAgIHsKLSAgICAgIGxleF9wYXJzZV9zdHJpbmctLTsKLSAgICAgIHJldHVybiBjOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiB1bmdldGMgKGMsIHRoZV9maWxlKTsKLX0KLQotc3RhdGljIGludAotZGVmX2xleCAoKQotewotICBpbnQgYywgaSwgcTsKLQotICBpZiAobGV4X2ZvcmNlZF90b2tlbikKLSAgICB7Ci0gICAgICBpID0gbGV4X2ZvcmNlZF90b2tlbjsKLSAgICAgIGxleF9mb3JjZWRfdG9rZW4gPSAwOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGZvcmNpbmcgdG9rZW4gJWRcbiIsIGkpOwotI2VuZGlmCi0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgYyA9IGRlZl9nZXRjICgpOwotCi0gIC8qIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlIChjICE9IEVPRiAmJiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSAmJiBzYXdfbmV3bGluZSkKLSAgICBjID0gZGVmX2dldGMgKCk7Ci0KLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBFT0ZcbiIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHNhd19uZXdsaW5lICYmIGMgPT0gJzsnKQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpOwotICAgICAgaWYgKGMgPT0gJ1xuJykKLQlyZXR1cm4gZGVmX2xleCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgLyogbXVzdCBiZSBzb21ldGhpbmcgZWxzZSAqLwotICBzYXdfbmV3bGluZSA9IDA7Ci0KLSAgaWYgKGlzZGlnaXQgKGMpKQotICAgIHsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgKGlzeGRpZ2l0IChjKSB8fCAoYyA9PSAneCcpKSkKLQl7Ci0JICBwdXRfYnVmIChjKTsKLQkgIGMgPSBkZWZfZ2V0YyAoKTsKLQl9Ci0gICAgICBpZiAoYyAhPSBFT0YpCi0JZGVmX3VuZ2V0YyAoYyk7Ci0gICAgICB5eWx2YWwubnVtYmVyID0gc3RydG91bCAoYnVmZmVyLCAwLCAwKTsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBgJXMnIHJldHVybnMgTlVNQkVSICVkXG4iLCBidWZmZXIsIHl5bHZhbC5udW1iZXIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gTlVNQkVSOwotICAgIH0KLQotICBpZiAoaXNhbHBoYSAoYykgfHwgc3RyY2hyICgiJDotXz8iLCBjKSkKLSAgICB7Ci0gICAgICBidWZwdHIgPSAwOwotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIChpc2FsbnVtIChjKSB8fCBzdHJjaHIgKCIkOi1fPy9AIiwgYykpKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIGlmIChjICE9IEVPRikKLQlkZWZfdW5nZXRjIChjKTsKLSAgICAgIGZvciAoaSA9IDA7IHRva2Vuc1tpXS5uYW1lOyBpKyspCi0JaWYgKHN0cmNtcCAodG9rZW5zW2ldLm5hbWUsIGJ1ZmZlcikgPT0gMCkKLQkgIHsKLSNpZiBUUkFDRQotCSAgICBwcmludGYgKCJsZXg6IGAlcycgaXMgYSBzdHJpbmcgdG9rZW5cbiIsIGJ1ZmZlcik7Ci0jZW5kaWYKLQkgICAgcmV0dXJuIHRva2Vuc1tpXS50b2tlbjsKLQkgIH0KLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBgJXMnIHJldHVybnMgSURcbiIsIGJ1ZmZlcik7Ci0jZW5kaWYKLSAgICAgIHl5bHZhbC5pZCA9IHhzdHJkdXAgKGJ1ZmZlcik7Ci0gICAgICByZXR1cm4gSUQ7Ci0gICAgfQotCi0gIGlmIChjID09ICdcJycgfHwgYyA9PSAnIicpCi0gICAgewotICAgICAgcSA9IGM7Ci0gICAgICBjID0gZGVmX2dldGMgKCk7Ci0gICAgICBidWZwdHIgPSAwOwotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gcSkKLQl7Ci0JICBwdXRfYnVmIChjKTsKLQkgIGMgPSBkZWZfZ2V0YyAoKTsKLQl9Ci0gICAgICB5eWx2YWwuaWQgPSB4c3RyZHVwIChidWZmZXIpOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBJRFxuIiwgYnVmZmVyKTsKLSNlbmRpZgotICAgICAgcmV0dXJuIElEOwotICAgIH0KLQotICBpZiAoYyA9PSAnPScgfHwgYyA9PSAnLicgfHwgYyA9PSAnQCcgfHwgYyA9PSAnLCcpCi0gICAgewotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlYycgcmV0dXJucyBpdHNlbGZcbiIsIGMpOwotI2VuZGlmCi0gICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBsaW5lbnVtYmVyKys7Ci0gICAgICBzYXdfbmV3bGluZSA9IDE7Ci0gICAgfQotCi0gIC8qcHJpbnRmICgibGV4OiAweCUwMnggaWdub3JlZFxuIiwgYyk7ICovCi0gIHJldHVybiBkZWZfbGV4ICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvZGVwLWluLnNlZCBiL2xkL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODBlYjAuLjAwMDAwMDAKLS0tIGEvbGQvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTpsb29wCi0vXFwkL04KLS9cXCQvYiBsb29wCi0KLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi1zIVwuXC4vYmZkL2hvc3RzL1teIF0qXC5oICEgIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvUkVBRE1FIGIvbGQvZW11bHBhcmFtcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDZkMjYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgcmVhZCBieSBnZW5zY3JpcHRzLnNoIGFzIHNoZWxsIGNvbW1hbmRzLgotVGhleSBzZXQgcGFyYW1ldGVycyBmb3IgdGhlIGVtdWxhdGlvbnMuCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2EyOWsuc2ggYi9sZC9lbXVscGFyYW1zL2EyOWsuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzhlODUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hMjlrLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hMjlrCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWEyOWstYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9haXhwcGMuc2ggYi9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZTY4Ni4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVEVNUExBVEVfTkFNRT1haXgKLVNDUklQVF9OQU1FPWFpeAotT1VUUFVUX0ZPUk1BVD0iYWl4Y29mZi1yczYwMDAiCi1BUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYWl4cnM2LnNoIGIvbGQvZW11bHBhcmFtcy9haXhyczYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2MzZjcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9haXhyczYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9YWl4Ci1TQ1JJUFRfTkFNRT1haXgKLU9VVFBVVF9GT1JNQVQ9ImFpeGNvZmYtcnM2MDAwIgotQVJDSD1yczYwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2ggYi9sZC9lbXVscGFyYW1zL2FscGhhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE5MjNmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVNDUklQVF9OQU1FPWFscGhhCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVhbHBoYSIKLUFSQ0g9YWxwaGEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJjZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzljMTcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFyYyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcmMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJjIgotVEVYVF9TVEFSVF9BRERSPTB4MAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPWFyYwotTUFDSElORT0KLUVOVFJZPXN0YXJ0Ci0jVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmZhMmEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPXBlCi1PVVRQVVRfRk9STUFUPSJlcG9jLXBlaS1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVwb2MtcGVpLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZXBvYy1wZWktYXJtLWJpZyIKLVRFTVBMQVRFX05BTUU9cGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2ggYi9sZC9lbXVscGFyYW1zL2FybWFvdXRiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWFiNmYxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFybWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWFybS1iaWciCi1IRUFERVJfU1RBUlRfQUREUj0weDgwMDAKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUkVTUz0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MzI3NjgKLUFSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1hb3V0bC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMWYzMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hcm1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1hcm0tbGl0dGxlIgotSEVBREVSX1NUQVJUX0FERFI9MHg4MDAwCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFJFU1M9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTMyNzY4Ci1BUkNIPWFybQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRmN2QzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPWFybWNvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYXJtLWxpdHRsZSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJjb2ZmLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iY29mZi1hcm0tYmlnIgotVEVNUExBVEVfTkFNRT1hcm1jb2ZmCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg0YjVlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ2FybSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZgotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKiguZ2x1ZV83dCkgKiguZ2x1ZV83KScKLU9USEVSX0JTU19TWU1CT0xTPSdfX2Jzc19zdGFydF9fID0gLjsnCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9J19ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsnCi0KLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLQotQVJDSD1hcm0KLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0yNTYKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZDc0MGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLU1BWFBBR0VTSVpFPTB4ODAwMAotVEVNUExBVEVfTkFNRT1hcm1lbGYKLQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOycKLQotIyBUaGlzIG5lZWRzIHRvIGJlIGhpZ2ggZW5vdWdoIHNvIHRoYXQgd2UgY2FuIGxvYWQgbGQuc28gYmVsb3cgaXQsCi0jIHlldCBsb3cgZW5vdWdoIHRvIHN0YXkgYXdheSBmcm9tIHRoZSBtbWFwIGFyZWEgMHg0MDAwMDAwMC4KLSMgQWxzbywgaXQgaXMgc21hbGwgZW5vdWdoIHNvIHRoYXQgcmVsb2NzIHdoaWNoIGFyZSBwb2ludGluZwotIyBhdCBhYnNvbHV0ZSAwIHdpbGwgc3RpbGwgYmUgZml4ZWQgdXAuCi1URVhUX1NUQVJUX0FERFI9MHgwMjAwMDAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTNkZGMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUFSQ0g9YXJtCi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcm0iCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotTUFYUEFHRVNJWkU9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotCi0jIFRoaXMgbmVlZHMgdG8gYmUgaGlnaCBlbm91Z2ggc28gdGhhdCB3ZSBjYW4gbG9hZCBsZC5zbyBiZWxvdyBpdCwKLSMgeWV0IGxvdyBlbm91Z2ggdG8gc3RheSBhd2F5IGZyb20gdGhlIG1tYXAgYXJlYSBhdCAweDAxMTAwMDAwLgotIyBBbHNvLCBpdCBpcyBzbWFsbCBlbm91Z2ggc28gdGhhdCByZWxvY3Mgd2hpY2ggYXJlIHBvaW50aW5nCi0jIGF0IGFic29sdXRlIDAgd2lsbCBzdGlsbCBiZSBmaXhlZCB1cC4KLSMgVGhlc2UgdmFsdWVzIGdpdmUgdXMgYWJvdXQgMC41TUIgZm9yIGxkLnNvLCAxNi41TUIgZm9yIHVzZXIgCi0jIHByb2dyYW1zLCBhbmQgMTVNQiBmb3IgbW1hcCB3aGljaCBzZWVtcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZS4KLVRFWFRfU1RBUlRfQUREUj0weDAwMDgwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2ODMyOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtLW9hYmkiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtLW9hYmkiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtLW9hYmkiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZl9vYWJpCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOycKLSAKLSAKLUFSQ0g9YXJtCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotIAotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1wZS5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDY4MDUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1wZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPXBlCi1PVVRQVVRfRk9STUFUPSJwZWktYXJtLWxpdHRsZSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJwZWktYXJtLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJwZWktYXJtLWJpZyIKLVRFTVBMQVRFX05BTUU9cGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmODUyYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXNwYXJjY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1zcGFyYyIKLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzIChib3Jyb3dlZCBmcm9tIHNwYXJjIGx5bngpCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZDEwdmVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvZDEwdmVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjZTUxZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMTB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMTB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDEwMDAwMDAKLVJFQURPTkxZX1NUQVJUX0FERFI9MHgwMDAwMDAwNAotQVJDSD1kMTB2Ci1NQVhQQUdFU0laRT0zMgotRU1CRURERUQ9dAotVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZfZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhYjVhMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QzMHZfZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMzB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMzB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDAwMDAKLURBVEFfU1RBUlRfQUREUj0weDIwMDAwMDAwCi1FTUVNX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotU1RBQ0tfU1RBUlRfQUREUj0weDIwMDA4MDAwCi1FSVRfU1RBUlRfQUREUj0weGZmZmZmMDIwCi1URVhUX1NJWkU9NjRLCi1EQVRBX1NJWkU9MzJLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9ZW1lbQotREFUQV9NRU1PUlk9ZW1lbQotQlNTX01FTU9SWT1lbWVtCi1URVhUX0RFRl9TRUNUSU9OPSIiCi1EQVRBX0RFRl9TRUNUSU9OPSIiCi1FTUVNX0RFRl9TRUNUSU9OPSIocnd4KSIKLUFSQ0g9ZDMwdgotRU1CRURERUQ9dApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2X28uc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZfby5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiY2I0Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QzMHZfby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMzB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMzB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDAwMDAKLURBVEFfU1RBUlRfQUREUj0weDIwMDAwMDAwCi1FTUVNX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotU1RBQ0tfU1RBUlRfQUREUj0weDIwMDA4MDAwCi1FSVRfU1RBUlRfQUREUj0weGZmZmZmMDIwCi1URVhUX1NJWkU9NjRLCi1EQVRBX1NJWkU9MzJLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9dGV4dAotREFUQV9NRU1PUlk9ZGF0YQotQlNTX01FTU9SWT1kYXRhCi1URVhUX0RFRl9TRUNUSU9OPSIoeCkiCi1EQVRBX0RFRl9TRUNUSU9OPSIocncpIgotRU1FTV9ERUZfU0VDVElPTj0iIgotQVJDSD1kMzB2Ci1FTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QzMHZlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OWRlNzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZmQzMHYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWQzMHYiCi1URVhUX1NUQVJUX0FERFI9MHgwMDAwMDAwMAotREFUQV9TVEFSVF9BRERSPTB4MjAwMDAwMDAKLUVNRU1fU1RBUlRfQUREUj0weDgwMDAwMDAwCi1TVEFDS19TVEFSVF9BRERSPTB4MjAwMDgwMDAKLUVJVF9TVEFSVF9BRERSPTB4ZmZmZmYwMjAKLVRFWFRfU0laRT0yMDAwSwotREFUQV9TSVpFPTIwMDBLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9dGV4dAotREFUQV9NRU1PUlk9ZGF0YQotQlNTX01FTU9SWT1kYXRhCi1URVhUX0RFRl9TRUNUSU9OPSIoeCkiCi1EQVRBX0RFRl9TRUNUSU9OPSIocncpIgotRU1FTV9ERUZfU0VDVElPTj0iIgotQVJDSD1kMzB2Ci1FTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2ggYi9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzU5MDkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kZWx0YTY4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1kZWx0YTY4Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGstc3lzdiIKLVRFWFRfU1RBUlRfQUREUj0weDIwMDAKLVBBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBiL2xkL2VtdWxwYXJhbXMvZWJtb24yOWsuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzJiZDEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWJtb24yOWsKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1hMjlrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWMzZmEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWk5NjAiCi1BUkNIPWk5NjAKLU1BQ0hJTkU9Ci1URVhUX1NUQVJUX0FERFI9MAotRU1CRURERUQ9eWVzCi1NQVhQQUdFU0laRT0weDIwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUyMzI2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXNwYXJjIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1BTElHTk1FTlQ9OAotQVJDSD1zcGFyYwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLURBVEFfUExUPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY4ZDk4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHhhMDAyMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19EWU5BTUlDX0xJTksgPSAwOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1EWU5BTUlDX0xJTks9ZmFsc2UKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYzQxMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlZmFlOWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIFRoaXMgaXMgYW4gRUxGIHBsYXRmb3JtLgotU0NSSVBUX05BTUU9ZWxmCi0KLSMgSGFuZGxlIGJvdGggYmlnLSBhbmQgbGl0dGxlLWVuZGVkIDMyLWJpdCBNSVBTIG9iamVjdHMuCi1BUkNIPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotCi1URU1QTEFURV9OQU1FPWVsZjMyCi0KLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwMAotRU5UUlk9X19zdGFydAotCi0jIEdPVC1yZWxhdGVkIHNldHRpbmdzLiAgCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0gIC5zcmRhdGEgOiB7ICooLnNyZGF0YSkgfQotJwotCi0jIE1hZ2ljIHN5bWJvbHMuCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi0jIElSSVg2IGRlZmluZXMgdGhlc2Ugc3ltYm9scy4gIDB4MzQgaXMgdGhlIHNpemUgb2YgdGhlIEVMRiBoZWFkZXIuCi1FWEVDVVRBQkxFX1NZTUJPTFM9IgotICBfX2Rzb19kaXNwbGFjZW1lbnQgPSAwOwotICBfX2VsZl9oZWFkZXIgPSAke1RFWFRfU1RBUlRfQUREUn07Ci0gIF9fcHJvZ3JhbV9oZWFkZXJfdGFibGUgPSAke1RFWFRfU1RBUlRfQUREUn0gKyAweDM0OwotIgotCi0jIFRoZXJlIGFyZSBvZnRlbiBkeW5hbWljIHJlbG9jYXRpb25zIGFnYWluc3QgdGhlIC5yb2RhdGEgc2VjdGlvbi4KLSMgU2V0dGluZyBEVF9URVhUUkVMIGluIHRoZSAuZHluYW1pYyBzZWN0aW9uIGRvZXMgbm90IGNvbnZpbmNlIHRoZQotIyBJUklYNiBsaW5rZXIgdG8gcGVybWl0IHJlbG9jYXRpb25zIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudC4KLSMgRm9sbG93aW5nIHRoZSBJUklYIGxpbmtlciwgd2Ugc2ltcGx5IHB1dCAucm9kYXRhIGluIHRoZSBkYXRhCi0jIHNlZ21lbnQuCi1XUklUQUJMRV9ST0RBVEE9Ci0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmMTMwNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTlRSWT1fX3N0YXJ0CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZWE4ZmQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDA4YzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYmUxZjUzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZnIzMCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1BUkNIPWZyMzAKLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLU5PUD0weDlmYTAKLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9J1BST1ZJREUgKF9fc3RhY2sgPSAweDIwMDAwMCk7JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwZGU4OC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4YTAwMjAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfRFlOQU1JQ19MSU5LID0gMDsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRFlOQU1JQ19MSU5LPWZhbHNlCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzEyZjQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybHBwYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZmYzYxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1TQ1JJUFRfTkFNRT1lbGZwcGMKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBvd2VycGNsZSIKLVRFWFRfU1RBUlRfQUREUj0weDQwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1BUkNIPXBvd2VycGMKLU1BQ0hJTkU9CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGM4YTEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLURBVEFfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAotVEVYVF9EWU5BTUlDPQotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU5UUlk9X19zdGFydApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFmZGFlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbWNvcmUtYmlnIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLW1jb3JlLWJpZyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1tY29yZS1saXR0bGUiCi1QQUdFX1NJWkU9MHgxMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4NDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1tY29yZQotRU1CRURERUQ9eWVzCi0KLSMgVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIE5PUCB2YWx1ZSAtIGl0IG11c3Qgd29yayBmb3IgYm90aAotIyBiaWcgZW5kaWFuIGFuZCBsaXR0bGUgZW5kaWFuIHN5c3RlbXMuICBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzCi0jIG5vIHN5bW1ldHJpY2FsIG1jb3JlIG9wY29kZSB0aGF0IGZ1bmN0aW9ucyBhcyBhIG5vb3AuICBUaGUKLSMgY2hvc2VuIHNvbHV0aW9uIGlzIHRvIHVzZSAidHN0IHIwLCByMTQiLiAgVGhpcyBpcyBhIHN5bWV0cmljYWwKLSMgdmFsdWUsIGFuZCBhcGFydCBmcm9tIHRoZSBjb3JydXB0aW9uIG9mIHRoZSBDIGJpdCwgaXQgaGFzIG5vIG90aGVyCi0jIHNpZGUgZWZmZWN0cy4gIFNpbmNlIHRoZSBjYXJyeSBiaXQgaXMgbmV2ZXIgdGVzdGVkIHdpdGhvdXQgYmVpbmcKLSMgZXhwbGljaXRseSBzZXQgZmlyc3QsIGFuZCBzaW5jZSB0aGUgTk9QIGNvZGUgaXMgb25seSB1c2VkIGFzIGEKLSMgZmlsbCB2YWx1ZSBiZXR3ZWVuIGluZGVwZW5kYW50bHkgdmlhYmxlIHBlaWNlcyBvZiBjb2RlLCBpdCBzaG91bGQKLSMgbm90IG1hdHRlci4KLU5PUD0weDBlMGUKLQotT1RIRVJfQlNTX1NZTUJPTFM9Il9fYnNzX3N0YXJ0X18gPSAuIDsiCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9Il9fYnNzX2VuZF9fID0gLiA7IgotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCi0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMycHBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY0MmYxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZnBwYwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwYyIKLVRFWFRfU1RBUlRfQUREUj0weDAxODAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1BUkNIPXBvd2VycGMKLU1BQ0hJTkU9CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MDhlNGQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1TQ1JJUFRfTkFNRT1lbGZwcGMKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBvd2VycGMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotQVJDSD1wb3dlcnBjCi1NQUNISU5FPQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZmJkZmQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotRUxGU0laRT02NAotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmNjQtc3BhcmMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKLUFSQ0g9InNwYXJjOnY5IgotTUFDSElORT0KLURBVEFfUExUPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotTk9QPTB4MDEwMDAwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhMjFmMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1FTlRSWT1fX3N0YXJ0Ci1TQ1JJUFRfTkFNRT1lbGYKLUVMRlNJWkU9NjQKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLU9VVFBVVF9GT1JNQVQ9ImVsZjY0LWFscGhhIgotVEVYVF9TVEFSVF9BRERSPSIweDEyMDAwMDAwMCIKLU1BWFBBR0VTSVpFPTB4MTAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9IjB4MTIwMDAwMDAwIgotQVJDSD1hbHBoYQotTUFDSElORT0KLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLURBVEFfUExUPQotTk9QPTB4NDdmZjA0MWYKLQotT1RIRVJfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmX2kzODYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjU2N2IuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDA4MDQ4MDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA4MDQ4MDAwCi1BUkNIPWkzODYKLU1BQ0hJTkU9Ci1OT1A9MHg5MDkwCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoIGIvbGQvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3N2EwNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLSNTSExJQl9URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotQVJDSD1pMzg2Ci1NQUNISU5FPQotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9nbGQ5NjAuc2ggYi9sZC9lbXVscGFyYW1zL2dsZDk2MC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4MWE3OC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2dsZDk2MC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9aTk2MAotT1VUUFVUX0ZPUk1BVD0iIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPWk5NjAKLVRFTVBMQVRFX05BTUU9Z2xkOTYwCi1HTERfU1RZTEU9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODIwMjIwLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLVNDUklQVF9OQU1FPWk5NjAKLU9VVFBVVF9GT1JNQVQ9IiIKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD1pOTYwCi1URU1QTEFURV9OQU1FPWdsZDk2MGMKLUdMRF9TVFlMRT0xCi1DT0ZGX0NUT1JTPScKLQlfX19DVE9SX0xJU1RfXyA9IC47Ci0JTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKQotCSooLmN0b3JzKQotCUxPTkcoMCkKLQlfX19DVE9SX0VORF9fID0gLjsKLQlfX19EVE9SX0xJU1RfXyA9IC47Ci0JTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKQotCSooLmR0b3JzKQotCUxPTkcoMCkKLQlfX19EVE9SX0VORF9fID0gLjsKLScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZ28zMi5zaCBiL2xkL2VtdWxwYXJhbXMvZ28zMi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzMzU3Zi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2dvMzIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWdvMzJjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWdvMzIiCi1URVhUX1NUQVJUX0FERFI9MHgxMGE4Ci1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotU0VHTUVOVF9TSVpFPTB4MTAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4MzAwLnNoIGIvbGQvZW11bHBhcmFtcy9oODMwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllYjNjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4MzAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODMwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDBoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWI3OTRlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDgzMDBoLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODMwMGgKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDgzMDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODMwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMHMuc2ggYi9sZC9lbXVscGFyYW1zL2g4MzAwcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3YjRmNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4MzAwcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDgzMDBzCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4MzAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDgzMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDAuc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRjYTgwLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMGIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZDNmZWUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMGIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwYgotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwYy5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBhMDY1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMGMKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODUwMG0uc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwbS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5ZjdiNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwbS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDg1MDBtCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTI5NGEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwcwotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2hwMzAwYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9ocDMwMGJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1YzUwYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2hwMzAwYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1ocDMwMGJzZCIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9ocDNocHV4LnNoIGIvbGQvZW11bHBhcmFtcy9ocDNocHV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JhZGQ4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaHAzMDBocHV4IgotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9NDA5NgotQVJDSD1tNjhrCi1TVEFDS1pFUk89Il9fX3N0YWNrX3plcm8gPSAweDIwMDA7IF9fRFlOQU1JQyA9IDA7IgotIyBUaGlzIGlzIG5lZWRlZCBmb3IgSFBVWCA5LjA7IGl0IGlzIHVubmVjZXNzYXJ5IGJ1dCBoYXJtbGVzcyBmb3IgOC4wLgotU0hMSUJfUEFUSD0iX19fZGxkX3NobGliX3BhdGggPSAwOyIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHBwYWVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvaHBwYWVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiODllYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2hwcGFlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWhwcGFlbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWhwcGEiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLUFSQ0g9aHBwYQotU1RBUlQ9IiRTVEFSVCQiCi1URU1QTEFURV9OQU1FPWhwcGFlbGYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZhb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzllNTU0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2YmVvcy5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2OWRhNWYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2YmVvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQVJDSD1pMzg2Ci1TQ1JJUFRfTkFNRT1pMzg2YmVvcwotT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCi1SRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKLVRFTVBMQVRFX05BTUU9YmVvcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2YnNkLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2YnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGMwZTJmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4Ni1ic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2Y29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTdiN2QuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2Y29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4NmNvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmdvMzIuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWYxNmM0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmdvMzIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWkzODZnbzMyCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWdvMzIiCi1URVhUX1NUQVJUX0FERFI9MHgxMGE4Ci1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotU0VHTUVOVF9TSVpFPTB4MjAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPWkzODYKLQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2ggYi9sZC9lbXVscGFyYW1zL2kzODZsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxNjQyMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZsaW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4Ni1saW51eCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1pMzg2Ci1URU1QTEFURV9OQU1FPWxpbnV4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZseW54LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bHlueC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4YzE3NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZseW54LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1pMzg2bHlueAotT1VUUFVUX0ZPUk1BVD0iY29mZi1pMzg2LWx5bngiCi0jIFRoaXMgaXMgd2hhdCBMeW54T1MgL2xpYi9pbml0MS5vIHdhbnRzLgotRU5UUlk9X21haW4KLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bWFjaC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3Y2IyNzYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bWFjaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbWFjaDMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLVNFR01FTlRfU0laRT0weDEwMDAKLVBBRF9URVhUPXQKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bW9zcy5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTBlMDUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bW9zcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDAwMDAyMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAwMDAyMDAwCi1BUkNIPWkzODYKLU1BQ0hJTkU9Ci1OT1A9MHg5MDkwCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzExZmExLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1pMzg2bXNkb3MKLU9VVFBVVF9GT1JNQVQ9Im1zZG9zIgotVEVYVF9TVEFSVF9BRERSPTB4MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MAotU0VHTUVOVF9TSVpFPTB4MTAKLVBBRF9URVhUPXQKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTZhMzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4Ni1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1pMzg2Ci1FWEVDVVRBQkxFX1NZTUJPTFM9J19fRFlOQU1JQyA9IDA7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bncuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZudy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwZWQ2Ny4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZudy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9bncKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgwODAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwODAwMDAwMAotQVJDSD1pMzg2Ci1OT1A9MHg5MDkwCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZwZS5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NnBlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODhhOGFkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NnBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1BUkNIPWkzODYKLVNDUklQVF9OQU1FPXBlCi1PVVRQVVRfRk9STUFUPSJwZWktaTM4NiIKLVJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSJwZS1pMzg2IgotVEVNUExBVEVfTkFNRT1wZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9sbms5NjAuc2ggYi9sZC9lbXVscGFyYW1zL2xuazk2MC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmM2ZjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2xuazk2MC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9aTk2MAotT1VUUFVUX0ZPUk1BVD0iIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPWk5NjAKLVRFTVBMQVRFX05BTUU9bG5rOTYwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2ggYi9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzcwNWEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tMzJyZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbTMyciIKLVRFWFRfU1RBUlRfQUREUj0weDEwMAotQVJDSD1tMzJyCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MzIKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiBzaW11bGF0b3IgbWVtb3J5ICg4TUIpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nUFJPVklERSAoX3N0YWNrID0gMHg4MDAwMDApOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjMjRjMGUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1tNjhrNGstbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bTY4awotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggYi9sZC9lbXVscGFyYW1zL202OGthb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZhYWY3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXplcm8tYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLVNFR01FTlRfU0laRT0weDIwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllODZjYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGthdXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPW02OGthdXgKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ay1hdXgiCi1TRUdNRU5UX1NJWkU9MHg0MDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0iJFNFR01FTlRfU0laRSArIFNJWkVPRl9IRUFERVJTIgotTk9OX1BBR0VEX1RFWFRfU1RBUlRfQUREUj1TSVpFT0ZfSEVBREVSUwotREFUQV9BTElHTk1FTlRfPSIoLiAmICgtJFNFR01FTlRfU0laRSB8ICRUQVJHRVRfUEFHRV9TSVpFLTEpKSArICRTRUdNRU5UX1NJWkUiCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2ggYi9sZC9lbXVscGFyYW1zL202OGtjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3YzBkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPW02OGtjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtlbGYuc2ggYi9sZC9lbXVscGFyYW1zL202OGtlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzUyYzUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tNjhrIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MjAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPSR7VEVYVF9TVEFSVF9BRERSfQotQVJDSD1tNjhrCi1NQUNISU5FPQotTk9QPTB4NGU3NQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrbGludXguc2ggYi9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjM2RhZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbTY4ay1saW51eCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1tNjhrCi1URU1QTEFURV9OQU1FPWxpbnV4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtseW54LnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrbHlueC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyMGZlYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtseW54LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1tNjhrbHlueAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrLWx5bngiCi0jIFRoaXMgaXMgd2hhdCBMeW54T1MgL2xpYi9pbml0MS5vIHdhbnRzLgotRU5UUlk9X19tYWluCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cwotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL202OGtuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQyODA3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW02OGstbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLUFSQ0g9bTY4awotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggYi9sZC9lbXVscGFyYW1zL202OGtwc29zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGViOGNhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPXBzb3MKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHgyMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1BUkNIPW02OGsKLVRFTVBMQVRFX05BTUU9ZWxmMzIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaCBiL2xkL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NzM3Yy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL204OGtiY3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPW04OGtiY3MKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTg4a2JjcyIKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD1tODhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2ggYi9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YmFlZTkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tY29yZXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BUkNIPW1jb3JlCi1TQ1JJUFRfTkFNRT1tY29yZXBlCi1PVVRQVVRfRk9STUFUPSJwZWktbWNvcmUtYmlnIgotTElUVExFX09VVFBVVF9GT1JNQVQ9InBlaS1tY29yZS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0icGVpLW1jb3JlLWJpZyIKLVRFTVBMQVRFX05BTUU9cGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2JpZy5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2JpZy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlMjk1My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNiaWcuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bWlwcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGZiMzViLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2JzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwc2JzZAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbWlwcy1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbWlwcy1iaWciCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbWlwcy1saXR0bGUiCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLUFSQ0g9bWlwcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzaWR0LnNoIGIvbGQvZW11bHBhcmFtcy9taXBzaWR0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzE3NmY1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2lkdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bWlwcwotRU5UUlk9c3RhcnQKLVRFWFRfU1RBUlRfQUREUj0weGEwMDEyMDAwCi1EQVRBX0FERFI9LgotVEVNUExBVEVfTkFNRT1taXBzZWNvZmYKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzaWR0bC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjc5ZGUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzaWR0bC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bWlwcwotRU5UUlk9c3RhcnQKLVRFWFRfU1RBUlRfQUREUj0weGEwMDEyMDAwCi1EQVRBX0FERFI9LgotVEVNUExBVEVfTkFNRT1taXBzZWNvZmYKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzbGl0LnNoIGIvbGQvZW11bHBhcmFtcy9taXBzbGl0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2IyMzQ0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2xpdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNsbmV3cy5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJiOTFjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKLVRFWFRfU1RBUlRfQUREUj0weDgwMDgwMDAwCi1EQVRBX0FERFI9LgotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21uMTAyMDAuc2ggYi9sZC9lbXVscGFyYW1zL21uMTAyMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjQzMjIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tbjEwMjAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbW4xMDIwMCIKLVRFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9bW4xMDIwMAotTUFDSElORT0KLU1BWFBBR0VTSVpFPTEKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKLQotIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCi0jIFhYWCBUaGVzZSBzaG91bGQgZGVmaW5pdGVseSBkaXNhcHBlYXIuCi1DVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JwotQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JwotRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKLURUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbW4xMDMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvbW4xMDMwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhNDBlNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21uMTAzMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tbjEwMzAwIgotVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1tbjEwMzAwCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MQotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLQotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwotCi0jIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KLSMgWFhYIFRoZXNlIHNob3VsZCBkZWZpbml0ZWx5IGRpc2FwcGVhci4KLUNUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCi1DVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCi1EVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JwotRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9uZXdzLnNoIGIvbGQvZW11bHBhcmFtcy9uZXdzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBkZGY5Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbmV3cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbmV3c29zMyIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL25zMzJrbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRmZGYzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1uczMyay1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1uczMyawpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoIGIvbGQvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzFkMDc5Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtcGM1MzItbWFjaCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9IjB4MTAwMjAiCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwMAotQVJDSD1uczMyawpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wcGNtYWNvcy5zaCBiL2xkL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjgwMGMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wcGNtYWNvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVEVNUExBVEVfTkFNRT1haXgKLVNDUklQVF9OQU1FPWFpeAotT1VUUFVUX0ZPUk1BVD0ieGNvZmYtcG93ZXJtYWMiCi1BUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcHBjbncuc2ggYi9sZC9lbXVscGFyYW1zL3BwY253LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2VhZDQzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcHBjbncuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPW53Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1wb3dlcnBjIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLUFSQ0g9cG93ZXJwYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wcGNwZS5zaCBiL2xkL2VtdWxwYXJhbXMvcHBjcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTI4MmQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wcGNwZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQVJDSD1wb3dlcnBjCi1TQ1JJUFRfTkFNRT1wcGNwZQotT1VUUFVUX0ZPUk1BVD0icGVpLXBvd2VycGNsZSIKLVRFTVBMQVRFX05BTUU9cGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcmlzY2l4LnNoIGIvbGQvZW11bHBhcmFtcy9yaXNjaXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZjZkOTIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9yaXNjaXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXJpc2NpeAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtcmlzY2l4IgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0weDgwMDAKLUFSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NhMjkyMDAuc2ggYi9sZC9lbXVscGFyYW1zL3NhMjkyMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTJmOTIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zYTI5MjAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zYTI5MjAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWEyOWstYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4NDAwMDQwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPWEyOWsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2guc2ggYi9sZC9lbXVscGFyYW1zL3NoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODg0NGZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2guc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXNoCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXNoIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9c2gKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2hlbGYuc2ggYi9sZC9lbXVscGFyYW1zL3NoZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWRiNTg3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2hlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXNoIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotTUFYUEFHRVNJWkU9MTI4Ci1BUkNIPXNoCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCi0KLSMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgotRU5UUlk9c3RhcnQKLUNUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCi1DVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCi1EVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JwotRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4MzAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaGwuc2ggYi9sZC9lbXVscGFyYW1zL3NobC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwYWFjOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NobC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9c2gKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtc2hsIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9c2gKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2hsZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9zaGxlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjdmODYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zaGxlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXNobCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAKLU1BWFBBR0VTSVpFPTEyOAotQVJDSD1zaAotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVNQkVEREVEPXllcwotCi0jIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KLUVOVFJZPXN0YXJ0Ci1DVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JwotQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JwotRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKLURUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDMwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoIGIvbGQvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOWI5MjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKLUJJR19PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3BhcmMtbGl0dGxlIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjYjBiZWMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1zcGFyYy1saW51eCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1zcGFyYwotVEVNUExBVEVfTkFNRT1saW51eApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY2x5bnguc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjbHlueC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlYjMwYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NwYXJjbHlueC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9c3BhcmNseW54Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLXNwYXJjLWx5bngiCi0jIFRoaXMgaXMgd2hhdCBMeW54T1MgL2xpYi9pbml0MS5vIHdhbnRzLgotRU5UUlk9X19tYWluCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cwotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdkYWYzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1zcGFyYy1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zdDIwMDAuc2ggYi9sZC9lbXVscGFyYW1zL3N0MjAwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5ODgzMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3N0MjAwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9c3QyMDAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3N1bjMuc2ggYi9sZC9lbXVscGFyYW1zL3N1bjMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMGY3MWYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zdW4zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotU0VHTUVOVF9TSVpFPTB4MjAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLUFSQ0g9bTY4awotVEVNUExBVEVfTkFNRT1zdW5vcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zdW40LnNoIGIvbGQvZW11bHBhcmFtcy9zdW40LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQyNzc1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3VuNC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLUFMSUdOTUVOVD04Ci1BUkNIPXNwYXJjCi1URU1QTEFURV9OQU1FPXN1bm9zCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3RpYzMwYW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTRjMTNmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT10aWMzMGFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXRpYzMwIgotT1VUUFVUX0FSQ0g9InRtczMyMGMzMCIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXRtczMyMGMzMAotQklHPTEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy90aWMzMGNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzc5NDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy90aWMzMGNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXRpYzMwY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi10aWMzMCIKLU9VVFBVVF9BUkNIPSJ0bXMzMjBjMzAiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD10bXMzMjBjMzAKLUJJRz0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3RpYzgwY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDcwMzIzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgc291cmNlZCBieSB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQuCi0jIFRoZXNlIGFyZSBzaGVsbCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBsYXRlciBieSBlaXRoZXIgZ2Vuc2NyaXB0cwotIyBvciBvbiBvZiB0aGUgc2NyaXB0cyB0aGF0IGl0IHNvdXJjZXMuCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB0byB1c2UuICBJbiB0aGlzIGNhc2UsIGdlbnNjcmlwdHMKLSMgdXNlcyBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MKLSMKLVNDUklQVF9OQU1FPXRpYzgwY29mZgotCi0jIFRoZSBuYW1lIG9mIHRoZSBlbXVsdGVtcGwgc2NyaXB0IHRvIHVzZS4gIElmIHNldCB0byAidGVtcGxhdGUiIHRoZW4KLSMgZ2Vuc2NyaXB0cy5zaCB3aWxsIHVzZSB0aGUgc2NyaXB0IGVtdWx0ZW1wbC90ZW1wbGF0ZS5lbS4gIElmIG5vdCBzZXQsCi0jIHRoZW4gdGhlIGRlZmF1bHQgdmFsdWUgaXMgImdlbmVyaWMiLgotIwotIyBURU1QTEFURV9OQU1FPQotCi0jIElmIHRoaXMgaXMgc2V0IHRvIGFuIG5vbmVtcHR5IHN0cmluZywgZ2Vuc2NyaXB0cy5zaCB3aWxsIGludm9rZSB0aGUKLSMgc2NyaXB0dGVtcGwgc2NyaXB0IGFuIGV4dHJhIHRpbWUgdG8gY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgc2NyaXB0LgotIwotIyBHRU5FUkFURV9TSExJQl9TQ1JJUFQ9Ci0KLSMgVGhlIEJGRCBvdXRwdXQgZm9ybWF0IHRvIHVzZS4gIFRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgd2lsbCB1c2UgaXQgaW4KLSMgYW4gT1VUUFVUX0ZPUk1BVCBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotIwotT1VUUFVUX0ZPUk1BVD0iY29mZi10aWM4MCIKLQotIyBUaGlzIGlzIG5vcm1hbGx5IHNldCB0byBpbmRpY2F0ZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSwgc3VjaCBhcwotIyAic3BhcmMiLiAgVGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB3aWxsIG5vcm1hbGx5IHVzZSBpdCBpbiBhbiBPVVRQVVRfQVJDSAotIyBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotIwotQVJDSD10aWM4MAotCi0jIFNvbWUgc2NyaXB0dGVtcGwgc2NyaXB0cyB1c2UgdGhpcyB0byBzZXQgdGhlIGVudHJ5IGFkZHJlc3MgaW4gYW4gRU5UUlkKLSMgZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLSMKLSMgRU5UUlk9Ci0KLSMgVGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZQotIyAiLnRleHQiIHNlY3Rpb24uCi0jCi1URVhUX1NUQVJUX0FERFI9MHgyMDAwMDAwCi0KLSMgSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgc2V0cyBURVhUX1NUQVJUX0FERFIgdG8KLSMgaXRzIHZhbHVlIGJlZm9yZSBydW5uaW5nIHRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgZm9yIHRoZSAtbiBhbmQgLU4KLSMgb3B0aW9ucy4KLSMKLSMgTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPQotCi0jIFRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIAotIyBEQVRBX0FMSUdOTUVOVCB3aGVuIHJ1bm5pbmcgdGhlIHNjcmlwdHRlbXBsIHNjcmlwdC4KLSMKLSMgU0VHTUVOVF9TSVpFPQotCi0jIElmIFNFR01FTlRfU0laRSBpcyBub3QgZGVmaW5lZCwgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHVzZXMgdGhpcwotIyB0byBkZWZpbmUgaXQuCi0jCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92ODUwLnNoIGIvbGQvZW11bHBhcmFtcy92ODUwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGJmYmQzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdjg1MC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT12ODUwCi1PVVRQVVRfRk9STUFUPSJlbGYzMi12ODUwIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwCi1aREFUQV9TVEFSVF9BRERSPTB4MTYwCi1ST1pEQVRBX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLVNEQVRBX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLVJPU0RBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotVERBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotQ0FMTF9UQUJMRV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1BUkNIPXY4NTAKLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdmFuaWxsYS5zaCBiL2xkL2VtdWxwYXJhbXMvdmFuaWxsYS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhM2I3Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3ZhbmlsbGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXZhbmlsbGEKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD11bmtub3duCi1URU1QTEFURV9OQU1FPXZhbmlsbGEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdmF4LnNoIGIvbGQvZW11bHBhcmFtcy92YXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODU0ODMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy92YXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0IgotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9MTAyNAotQVJDSD12YXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdnN0YS5zaCBiL2xkL2VtdWxwYXJhbXMvdnN0YS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2MjQ5Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3ZzdGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotU0VHTUVOVF9TSVpFPTB4NDAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPWkzODYKLQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy93NjUuc2ggYi9sZC9lbXVscGFyYW1zL3c2NS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwMmIyMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3c2NS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9dzY1Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLXc2NSIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAKLVRBUkdFVF9QQUdFX1NJWkU9NjQKLUFSQ0g9dzY1CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3o4MDAxLnNoIGIvbGQvZW11bHBhcmFtcy96ODAwMS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2NDVjMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3o4MDAxLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT16ODAwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi16OGsiCi1PVVRQVVRfQVJDSD0iejgwMDEiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD16OGsKLUJJRz0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3o4MDAyLnNoIGIvbGQvZW11bHBhcmFtcy96ODAwMi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5YjVmNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3o4MDAyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT16ODAwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi16OGsiCi1PVVRQVVRfQVJDSD0iejgwMDIiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD16ODAwMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL1JFQURNRSBiL2xkL2VtdWx0ZW1wbC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZWMwYWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSBzb3VyY2VkIGJ5IGdlbnNjcmlwdHMuc2gsIGFmdGVyCi1zZXR0aW5nIHNvbWUgdmFyaWFibGVzIHRvIHN1YnN0aXR1dGUgaW4sIHRvIHByb2R1Y2UKLUMgc291cmNlIGZpbGVzIHRoYXQgY29udGFpbiBqdW1wIHRhYmxlcyBmb3IgZWFjaCBlbXVsYXRpb24uCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYWl4LmVtIGIvbGQvZW11bHRlbXBsL2FpeC5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3ODU3Zi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYWl4LmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIEFJWCBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIEFJWCBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZyZWUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi0vKiBUaGUgZmlsZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGVhY2ggc2VjdGlvbi4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotCi0vKiBUaGUgbWF4aW11bSBzaXplIHRoZSBzdGFjayBpcyBwZXJtaXR0ZWQgdG8gZ3Jvdy4gIFRoaXMgaXMgc3RvcmVkIGluCi0gICB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heHN0YWNrOwotCi0vKiBUaGUgbWF4aW11bSBkYXRhIHNpemUuICBUaGlzIGlzIHN0b3JlZCBpbiB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heGRhdGE7Ci0KLS8qIFdoZXRoZXIgdG8gcGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotc3RhdGljIGludCBnYyA9IDE7Ci0KLS8qIFRoZSBtb2R1bGUgdHlwZSB0byB1c2UuICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG1vZHR5cGUgPSAoJzEnIDw8IDgpIHwgJ0wnOwotCi0vKiBXaGV0aGVyIHRoZSAudGV4dCBzZWN0aW9uIG11c3QgYmUgcmVhZC1vbmx5IChpLmUuLCBubyByZWxvY3MKLSAgIHBlcm1pdHRlZCkuICAqLwotc3RhdGljIGludCB0ZXh0cm87Ci0KLS8qIFdoZXRoZXIgdG8gaW1wbGVtZW50IFVuaXggbGlrZSBsaW5rZXIgc2VtYW50aWNzLiAgKi8KLXN0YXRpYyBpbnQgdW5peF9sZDsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbXBvcnQgZmlsZSBsaXN0LiAgKi8KLQotc3RydWN0IGZpbGVsaXN0Ci17Ci0gIHN0cnVjdCBmaWxlbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLS8qIExpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmlsZWxpc3QgKmltcG9ydF9maWxlczsKLQotLyogTGlzdCBvZiBleHBvcnQgc3ltYm9scyByZWFkIGZyb20gdGhlIGV4cG9ydCBmaWxlcy4gICovCi0KLXN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QKLXsKLSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYm9vbGVhbiBzeXNjYWxsOwotfTsKLQotc3RhdGljIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKmV4cG9ydF9zeW1ib2xzOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGRvbmUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi0gIGNvbmZpZy5oYXNfc2hhcmVkID0gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIEFJWCBzcGVjaWZpYyBvcHRpb25zLiAgKi8KLQotc3RhdGljIGludAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCBpbmR4OwotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGxvbmcgdmFsOwotICBjaGFyICplbmQ7Ci0KLSNkZWZpbmUgT1BUSU9OX0lHTk9SRSAoMzAwKQotI2RlZmluZSBPUFRJT05fQVVUT0lNUCAoT1BUSU9OX0lHTk9SRSArIDEpCi0jZGVmaW5lIE9QVElPTl9FUk5PVE9LIChPUFRJT05fQVVUT0lNUCArIDEpCi0jZGVmaW5lIE9QVElPTl9FUk9LIChPUFRJT05fRVJOT1RPSyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlQgKE9QVElPTl9FUk9LICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNUE9SVCAoT1BUSU9OX0VYUE9SVCArIDEpCi0jZGVmaW5lIE9QVElPTl9MT0FETUFQIChPUFRJT05fSU1QT1JUICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BWERBVEEgKE9QVElPTl9MT0FETUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BWFNUQUNLIChPUFRJT05fTUFYREFUQSArIDEpCi0jZGVmaW5lIE9QVElPTl9NT0RUWVBFIChPUFRJT05fTUFYU1RBQ0sgKyAxKQotI2RlZmluZSBPUFRJT05fTk9BVVRPSU1QIChPUFRJT05fTU9EVFlQRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT1NUUkNNUENUIChPUFRJT05fTk9BVVRPSU1QICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BEIChPUFRJT05fTk9TVFJDTVBDVCArIDEpCi0jZGVmaW5lIE9QVElPTl9QVCAoT1BUSU9OX1BEICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUUkNNUENUIChPUFRJT05fUFQgKyAxKQotI2RlZmluZSBPUFRJT05fVU5JWCAoT1BUSU9OX1NUUkNNUENUICsgMSkKLQotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0gewotICAgIHsiYmFzaXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiYXV0b2ltcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVVUT0lNUH0sCi0gICAgeyJiY29tcHJsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJjcmxkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmNyb3IzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhEQVRBfSwKLSAgICB7ImJFIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAotICAgIHsiYmVybm90b2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAotICAgIHsiYmVyb2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VST0t9LAotICAgIHsiYmVycm1zZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJleHBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVH0sCi0gICAgeyJiZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJOT1RPS30sCi0gICAgeyJiZ2MiLCBub19hcmd1bWVudCwgJmdjLCAxfSwKLSAgICB7ImJoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmhhbHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiSSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QT1JUfSwKLSAgICB7ImJpbXBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCi0gICAgeyJibCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCi0gICAgeyJibG9hZG1hcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCi0gICAgeyJibWF4ZGF0YSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCi0gICAgeyJibWF4c3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWFNUQUNLfSwKLSAgICB7ImJNIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKLSAgICB7ImJtb2R0eXBlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKLSAgICB7ImJub2F1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJibm9kZWxjc2VjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJub2VudHJ5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYm5vZ2MiLCBub19hcmd1bWVudCwgJmdjLCAwfSwKLSAgICB7ImJuc28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJibm9zdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9TVFJDTVBDVH0sCi0gICAgeyJibm90ZXh0cm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMH0sCi0gICAgeyJibnJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAotICAgIHsiYnBEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QRH0sCi0gICAgeyJicFQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BUfSwKLSAgICB7ImJybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKLSAgICB7ImJTIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCi0gICAgeyJic28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAotICAgIHsiYnN0cmNtcGN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVFJDTVBDVH0sCi0gICAgeyJidGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDF9LAotICAgIHsic3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsidW5peCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVU5JWH0sCi0gICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotICB9OwotCi0gIC8qIE9wdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBBSVggbGlua2VyIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0OiAtZiwKLSAgICAgLVMsIC12LCAtWiwgLWJiaW5kY21kcywgLWJiaW5kZXIsIC1iYmluZG9wdHMsIC1iY2FsbHMsIC1iY2FwcywKLSAgICAgLWJjcm9yMTUsIC1iZGVidWdvcHQsIC1iZGJnLCAtYmRlbGNzZWN0LCAtYmV4PywgLWJmaWxlbGlzdCwgLWJmbCwKLSAgICAgLWJnY2J5cGFzcywgLWJnbGluaywgLWJpbnNlcnQsIC1iaSwgLWJsb2FkbWFwLCAtYmwsIC1ibWFwLCAtYm5sLAotICAgICAtYm5vYmluZCwgLWJub2NvbXBybGQsIC1ibm9jcmxkLCAtYm5vZXJybXNnLCAtYm5vZ2xpbmssCi0gICAgIC1ibm9sb2FkbWFwLCAtYm5sLCAtYm5vb2JqcmVvcmRlciwgLWJub3F1aWV0LCAtYm5vcmVvcmRlciwKLSAgICAgLWJub3R5cGNoaywgLWJub3gsIC1icXVpZXQsIC1iUiwgLWJyZW5hbWUsIC1icmVvcmRlciwgLWJ0eXBjaGssCi0gICAgIC1ieCwgLWJYLCAtYnhyZWYuICAqLwotCi0gIC8qIElmIHRoZSBjdXJyZW50IG9wdGlvbiBzdGFydHMgd2l0aCAtYiwgY2hhbmdlIHRoZSBmaXJzdCA6IHRvIGFuID0uCi0gICAgIFRoZSBBSVggbGlua2VyIHVzZXMgOiB0byBzZXBhcmF0ZSB0aGUgb3B0aW9uIGZyb20gdGhlIGFyZ3VtZW50OwotICAgICBjaGFuZ2luZyBpdCB0byA9IGxldHMgdXMgdHJlYXQgaXQgYXMgYSBnZXRvcHQgb3B0aW9uLiAgKi8KLSAgaW5keCA9IG9wdGluZDsKLSAgaWYgKGluZHggPT0gMCkKLSAgICBpbmR4ID0gMTsKLSAgaWYgKGluZHggPCBhcmdjICYmIHN0cm5jbXAgKGFyZ3ZbaW5keF0sICItYiIsIDIpID09IDApCi0gICAgewotICAgICAgY2hhciAqczsKLQotICAgICAgZm9yIChzID0gYXJndltpbmR4XTsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgqcyA9PSAnOicpCi0JICAgIHsKLQkgICAgICAqcyA9ICc9JzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV2UgYWRkIHMgYW5kIHUgc28gdG8gdGhlIHNob3J0IG9wdGlvbnMgbGlzdCBzbyB0aGF0IC1zIGFuZCAtdSBvbgotICAgICB0aGUgY29tbWFuZCBsaW5lIGRvIG5vdCBtYXRjaCAtc3RhdGljIGFuZCAtdW5peC4gICovCi0KLSAgb3B0ZXJyID0gMDsKLSAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItRDpIOktUOnpzdSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICd1JzoKLSAgICBkZWZhdWx0OgotICAgICAgb3B0aW5kID0gcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAwOgotICAgICAgLyogTG9uZyBvcHRpb24gd2hpY2gganVzdCBzZXRzIGEgZmxhZy4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgdmFsID0gc3RydG9sIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1EIG51bWJlciAlc1xuIiwgb3B0YXJnKTsKLSAgICAgIGVsc2UgaWYgKHZhbCAhPSAtMSkKLQlsYW5nX3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIGV4cF9pbnRvcCAodmFsKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcKLQkgIHx8ICh2YWwgJiAodmFsIC0gMSkpICE9IDApCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtSCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JZmlsZV9hbGlnbiA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSyc6Ci0gICAgY2FzZSAneic6Ci0gICAgICAvKiBGSVhNRTogVGhpcyBzaG91bGQgdXNlIHRoZSBwYWdlIHNpemUgZm9yIHRoZSB0YXJnZXQgc3lzdGVtLiAgKi8KLSAgICAgIGZpbGVfYWxpZ24gPSA0MDk2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIC8qIE9uIEFJWCB0aGlzIGlzIHRoZSBzYW1lIGFzIEdOVSBsZCAtVHRleHQuICBXaGVuIHdlIHNlZSAtVAotICAgICAgICAgbnVtYmVyLCB3ZSBhc3N1bWUgdGhlIEFJWCBvcHRpb24gaXMgaW50ZW5kZWQuICBPdGhlcndpc2UsIHdlCi0gICAgICAgICBhc3N1bWUgdGhlIHVzdWFsIEdOVSBsZCAtVCBvcHRpb24gaXMgaW50ZW5kZWQuICBXZSBjYW4ndCBqdXN0Ci0gICAgICAgICBpZ25vcmUgdGhlIEFJWCBvcHRpb24sIGJlY2F1c2UgZ2NjIHBhc3NlcyBpdCB0byB0aGUgbGlua2VyLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCXsKLQkgIG9wdGluZCA9IHByZXZvcHRpbmQ7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIudGV4dCIsIGV4cF9pbnRvcCAodmFsKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0lHTk9SRToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQVVUT0lNUDoKLSAgICAgIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FUk5PVE9LOgotICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VST0s6Ci0gICAgICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FWFBPUlQ6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUgKG9wdGFyZywgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9JTVBPUlQ6Ci0gICAgICB7Ci0Jc3RydWN0IGZpbGVsaXN0ICpuOwotCXN0cnVjdCBmaWxlbGlzdCAqKmZscHA7Ci0KLQluID0gKHN0cnVjdCBmaWxlbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbGlzdCkpOwotCW4tPm5leHQgPSBOVUxMOwotCW4tPm5hbWUgPSBvcHRhcmc7Ci0JZmxwcCA9ICZpbXBvcnRfZmlsZXM7Ci0Jd2hpbGUgKCpmbHBwICE9IE5VTEwpCi0JICBmbHBwID0gJigqZmxwcCktPm5leHQ7Ci0JKmZscHAgPSBuOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9MT0FETUFQOgotICAgICAgY29uZmlnLm1hcF9maWxlbmFtZSA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUFYREFUQToKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhkYXRhIG51bWJlciAlc1xuIiwKLQkgICAgICAgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltYXhkYXRhID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NQVhTVEFDSzoKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhzdGFjayBudW1iZXIgJXNcbiIsCi0JICAgICAgIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbWF4c3RhY2sgPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01PRFRZUEU6Ci0gICAgICBpZiAoKm9wdGFyZyA9PSAnUycpCi0JewotCSAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7Ci0JICArK29wdGFyZzsKLQl9Ci0gICAgICBpZiAoKm9wdGFyZyA9PSAnXDAnIHx8IG9wdGFyZ1sxXSA9PSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgbW9kdWxlIHR5cGUgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbW9kdHlwZSA9ICgqb3B0YXJnIDw8IDgpIHwgb3B0YXJnWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT0FVVE9JTVA6Ci0gICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT1NUUkNNUENUOgotICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BEOgotICAgICAgLyogVGhpcyBzZXRzIHRoZSBwYWdlIHRoYXQgdGhlIC5kYXRhIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8KLSAgICAgICAgIHN0YXJ0IG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZQotICAgICAgICAgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSwgc28gd2UgbmVlZCB0byBidWlsZCBhbiBhcHByb3ByaWF0ZQotICAgICAgICAgZXhwcmVzc2lvbi4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wRCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JewotCSAgZXRyZWVfdHlwZSAqdDsKLQotCSAgdCA9IGV4cF9iaW5vcCAoJysnLAotCQkJIGV4cF9pbnRvcCAodmFsKSwKLQkJCSBleHBfYmlub3AgKCcmJywKLQkJCQkgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSwKLQkJCQkgICAgZXhwX2ludG9wICgweGZmZikpKTsKLQkgIHQgPSBleHBfYmlub3AgKCcmJywKLQkJCSBleHBfYmlub3AgKCcrJywgdCwgZXhwX2ludG9wICgzMSkpLAotCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgMzEpKTsKLQkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgdCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QVDoKLSAgICAgIC8qIFRoaXMgc2V0IHRoZSBwYWdlIHRoYXQgdGhlIC50ZXh0IHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gc3RhcnQKLSAgICAgICAgIG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZSBvZmZzZXQKLSAgICAgICAgIHdpdGhpbiB0aGUgZmlsZS4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wVCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JewotCSAgZXRyZWVfdHlwZSAqdDsKLQotCSAgdCA9IGV4cF9iaW5vcCAoJysnLAotCQkJIGV4cF9pbnRvcCAodmFsKSwKLQkJCSBleHBfbmFtZW9wIChTSVpFT0ZfSEVBREVSUywgTlVMTCkpOwotCSAgdCA9IGV4cF9iaW5vcCAoJyYnLAotCQkJIGV4cF9iaW5vcCAoJysnLCB0LCBleHBfaW50b3AgKDMxKSksCi0JCQkgZXhwX2ludG9wICh+IChiZmRfdm1hKSAzMSkpOwotCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCB0KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1NUUkNNUENUOgotICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9VTklYOgotICAgICAgdW5peF9sZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBjYW4gbm90IGJlIHJlY29nbml6ZWQgYXMgYSBCRkQKLSAgIG9iamVjdCBvciBhbiBhcmNoaXZlLiAgSWYgdGhlIGZpbGUgc3RhcnRzIHdpdGggIyEsIHdlIG11c3QgdHJlYXQgaXQKLSAgIGFzIGFuIGltcG9ydCBmaWxlLiAgVGhpcyBpcyBmb3IgQUlYIGNvbXBhdGliaWxpdHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgRklMRSAqZTsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgZSA9IGZvcGVuIChlbnRyeS0+ZmlsZW5hbWUsIEZPUEVOX1JUKTsKLSAgaWYgKGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0ID0gZmFsc2U7Ci0KLSAgaWYgKGdldGMgKGUpID09ICcjJyAmJiBnZXRjIChlKSA9PSAnIScpCi0gICAgewotICAgICAgc3RydWN0IGZpbGVsaXN0ICpuOwotICAgICAgc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKLQotICAgICAgbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKLSAgICAgIG4tPm5leHQgPSBOVUxMOwotICAgICAgbi0+bmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKLSAgICAgIGZscHAgPSAmaW1wb3J0X2ZpbGVzOwotICAgICAgd2hpbGUgKCpmbHBwICE9IE5VTEwpCi0JZmxwcCA9ICYoKmZscHApLT5uZXh0OwotICAgICAgKmZscHAgPSBuOwotCi0gICAgICByZXQgPSB0cnVlOwotICAgICAgZW50cnktPmxvYWRlZCA9IHRydWU7Ci0gICAgfQotCi0gIGZjbG9zZSAoZSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBib29sZWFuIHI7Ci0gIHN0cnVjdCBzZXRfaW5mbyAqcDsKLQotICAvKiBDYWxsIGxkY3Rvcl9idWlsZF9zZXRzLCBhZnRlciBwcmV0ZW5kaW5nIHRoYXQgdGhpcyBpcyBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG8gdGhpcyBiZWNhdXNlIEFJWCByZXF1aXJlcyByZWxvY2F0aW9uCi0gICAgIGVudHJpZXMgZm9yIGFsbCByZWZlcmVuY2VzIHRvIHN5bWJvbHMsIGV2ZW4gaW4gYSBmaW5hbAotICAgICBleGVjdXRhYmxlLiAgT2YgY291cnNlLCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpZiB3ZSBhcmUKLSAgICAgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlLiAgKi8KLSAgciA9IGxpbmtfaW5mby5yZWxvY2F0ZWFibGU7Ci0gIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgInhjb2ZmIikgIT0gTlVMTCkKLSAgICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgbGRjdG9yX2J1aWxkX3NldHMgKCk7Ci0gIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSByOwotCi0gIC8qIEZvciBlYWNoIHNldCwgcmVjb3JkIHRoZSBzaXplLCBzbyB0aGF0IHRoZSBYQ09GRiBiYWNrZW5kIGNhbgotICAgICBvdXRwdXQgdGhlIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KLSAgZm9yIChwID0gc2V0czsgcCAhPSAoc3RydWN0IHNldF9pbmZvICopIE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQotCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbwotCSBub3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQljb250aW51ZTsKLQotICAgICAgaWYgKHAtPnJlbG9jICE9IEJGRF9SRUxPQ19DVE9SKQotCXsKLQkgIC8qIEhhbmRsZSB0aGlzIGlmIHdlIG5lZWQgdG8uICAqLwotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBzaXplID0gKHAtPmNvdW50ICsgMikgKiA0OwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcC0+aCwgc2l6ZSkpCi0JZWluZm8gKCIlRiVQOiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0IGZhaWxlZDogJUVcbiIpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBzdHJ1Y3QgZmlsZWxpc3QgKmZsOwotICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICplbDsKLSAgY2hhciAqbGlicGF0aDsKLSAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07Ci0gIGludCBpOwotCi0gIC8qIEhhbmRsZSB0aGUgaW1wb3J0IGFuZCBleHBvcnQgZmlsZXMsIGlmIGFueS4gICovCi0gIGZvciAoZmwgPSBpbXBvcnRfZmlsZXM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlIChmbC0+bmFtZSwgdHJ1ZSk7Ci0gIGZvciAoZWwgPSBleHBvcnRfc3ltYm9sczsgZWwgIT0gTlVMTDsgZWwgPSBlbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZWwtPm5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQllaW5mbyAoIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIG9mIGV4cG9ydCBzeW1ib2wgZmFpbGVkOiAlRVxuIik7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwgZWwtPnN5c2NhbGwpKQotCWVpbmZvICgiJVAlRjogYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgZmFpbGVkOiAlRVxuIik7Ci0gICAgfQotCi0gIC8qIFRyYWNrIGRvd24gYWxsIHJlbG9jYXRpb25zIGNhbGxlZCBmb3IgYnkgdGhlIGxpbmtlciBzY3JpcHQgKHRoZXNlCi0gICAgIGFyZSB0eXBpY2FsbHkgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBlbnRyaWVzIGNyZWF0ZWQgYnkKLSAgICAgQ09OU1RSVUNUT1JTKSBhbmQgbGV0IHRoZSBiYWNrZW5kIGtub3cgaXQgd2lsbCBuZWVkIHRvIGNyZWF0ZQotICAgICAubG9hZGVyIHJlbG9jcyBmb3IgdGhlbS4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcyk7Ci0KLSAgLyogV2UgbmVlZCB0byBidWlsZCBMSUJQQVRIIGZyb20gdGhlIC1MIGFyZ3VtZW50cy4gIElmIGFueSAtcnBhdGgKLSAgICAgYXJndW1lbnRzIHdlcmUgdXNlZCwgdGhvdWdoLCB3ZSB1c2UgLXJwYXRoIGluc3RlYWQsIGFzIGEgR05VCi0gICAgIGV4dGVuc2lvbi4gICovCi0gIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLSAgICBsaWJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBlbHNlIGlmIChzZWFyY2hfaGVhZCA9PSBOVUxMKQotICAgIGxpYnBhdGggPSAoY2hhciAqKSAiIjsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoc2VhcmNoX2hlYWQtPm5hbWUpOwotICAgICAgbGlicGF0aCA9IHhtYWxsb2MgKGxlbiArIDEpOwotICAgICAgc3RyY3B5IChsaWJwYXRoLCBzZWFyY2hfaGVhZC0+bmFtZSk7Ci0gICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkLT5uZXh0OyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCXsKLQkgIHNpemVfdCBubGVuOwotCi0JICBubGVuID0gc3RybGVuIChzZWFyY2gtPm5hbWUpOwotCSAgbGlicGF0aCA9IHhyZWFsbG9jIChsaWJwYXRoLCBsZW4gKyBubGVuICsgMik7Ci0JICBsaWJwYXRoW2xlbl0gPSAnOic7Ci0JICBzdHJjcHkgKGxpYnBhdGggKyBsZW4gKyAxLCBzZWFyY2gtPm5hbWUpOwotCSAgbGVuICs9IG5sZW4gKyAxOwotCX0KLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBYQ09GRiBiYWNrZW5kIHNldCB1cCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgbGlicGF0aCwKLQkJCQkJIGVudHJ5X3N5bWJvbCwgZmlsZV9hbGlnbiwKLQkJCQkJIG1heHN0YWNrLCBtYXhkYXRhLAotCQkJCQkgZ2MgJiYgISB1bml4X2xkID8gdHJ1ZSA6IGZhbHNlLAotCQkJCQkgbW9kdHlwZSwKLQkJCQkJIHRleHRybyA/IHRydWUgOiBmYWxzZSwKLQkJCQkJIHVuaXhfbGQsCi0JCQkJCSBzcGVjaWFsX3NlY3Rpb25zKSkKLSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzcGVjaWFsIHNlY3Rpb25zLCBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlIGluIHRoZSBsaW5rIG9yZGVyaW5nLiAgVGhpcyBpcyBlc3BlY2lhbGx5IG1hZ2ljLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcGxzOwotICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmlzOwotICAgICAgY29uc3QgY2hhciAqb25hbWU7Ci0gICAgICBib29sZWFuIHN0YXJ0OwotCi0gICAgICBzZWMgPSBzcGVjaWFsX3NlY3Rpb25zW2ldOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBSZW1vdmUgdGhpcyBzZWN0aW9uIGZyb20gdGhlIGxpc3Qgb2YgdGhlIG91dHB1dCBzZWN0aW9uLgotICAgICAgICAgVGhpcyBhc3N1bWVzIHdlIGtub3cgd2hhdCB0aGUgc2NyaXB0IGxvb2tzIGxpa2UuICAqLwotICAgICAgaXMgPSBOVUxMOwotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotICAgICAgaWYgKG9zID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBjYW4ndCBmaW5kIG91dHB1dCBzZWN0aW9uICVzXG4iLAotCSAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGZvciAocGxzID0gJm9zLT5jaGlsZHJlbi5oZWFkOyAqcGxzICE9IE5VTEw7IHBscyA9ICYoKnBscyktPm5leHQpCi0JewotCSAgaWYgKCgqcGxzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KLQkgICAgICAmJiAoKnBscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCi0JICAgIHsKLQkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcGxzOwotCSAgICAgICpwbHMgPSAoKnBscyktPm5leHQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSkKLQkgICAgewotCSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwd2xzOwotCi0JICAgICAgZm9yIChwd2xzID0gJigqcGxzKS0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZDsKLQkJICAgKnB3bHMgIT0gTlVMTDsKLQkJICAgcHdscyA9ICYoKnB3bHMpLT5uZXh0KQotCQl7Ci0JCSAgaWYgKCgqcHdscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JCSAgICAgICYmICgqcHdscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCi0JCSAgICB7Ci0JCSAgICAgIGlzID0gKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICopICpwd2xzOwotCQkgICAgICAqcHdscyA9ICgqcHdscyktPm5leHQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKGlzICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQkKLQotICAgICAgaWYgKGlzID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBjYW4ndCBmaW5kICVzIGluIG91dHB1dCBzZWN0aW9uXG4iLAotCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc2VjLT5vd25lciwgc2VjKSk7Ci0KLSAgICAgIC8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHRoZSBzZWN0aW9uIHNob3VsZCBnby4gICovCi0gICAgICBzd2l0Y2ggKGkpCi0JewotCWRlZmF1bHQ6IC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCi0JY2FzZSAwOgotCSAgLyogX3RleHQgKi8KLQkgIG9uYW1lID0gIi50ZXh0IjsKLQkgIHN0YXJ0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIC8qIF9ldGV4dCAqLwotCSAgb25hbWUgPSAiLnRleHQiOwotCSAgc3RhcnQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIC8qIF9kYXRhICovCi0JICBvbmFtZSA9ICIuZGF0YSI7Ci0JICBzdGFydCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDM6Ci0JICAvKiBfZWRhdGEgKi8KLQkgIG9uYW1lID0gIi5kYXRhIjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JY2FzZSA1OgotCSAgLyogX2VuZCBhbmQgZW5kICovCi0JICBvbmFtZSA9ICIuYnNzIjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChvbmFtZSk7Ci0KLSAgICAgIGlmIChzdGFydCkKLQl7Ci0JICBpcy0+aGVhZGVyLm5leHQgPSBvcy0+Y2hpbGRyZW4uaGVhZDsKLQkgIG9zLT5jaGlsZHJlbi5oZWFkID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgaXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlzLT5oZWFkZXIubmV4dCA9IE5VTEw7Ci0JICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZvcy0+Y2hpbGRyZW4sCi0JCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzLAotCQkJCSAmaXMtPmhlYWRlci5uZXh0KTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZWFkIGFuIGltcG9ydCBvciBleHBvcnQgZmlsZS4gIEZvciBhbiBpbXBvcnQgZmlsZSwgdGhpcyBpcyBjYWxsZWQKLSAgIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiBlbXVsYXRpb24gcm91dGluZS4gIEZvciBhbiBleHBvcnQgZmlsZSwKLSAgIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBwYXJzZV9hcmdzIGVtdWxhdGlvbiByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSAoZmlsZW5hbWUsIGltcG9ydCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJvb2xlYW4gaW1wb3J0OwotewotICBzdHJ1Y3Qgb2JzdGFjayAqbzsKLSAgRklMRSAqZjsKLSAgaW50IGxpbmVubzsKLSAgaW50IGM7Ci0gIGJvb2xlYW4ga2VlcDsKLSAgY29uc3QgY2hhciAqaW1wcGF0aDsKLSAgY29uc3QgY2hhciAqaW1wZmlsZTsKLSAgY29uc3QgY2hhciAqaW1wbWVtYmVyOwotCi0gIG8gPSAoc3RydWN0IG9ic3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb2JzdGFjaykpOwotICBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbiAobywgMCwgMCwgeG1hbGxvYywgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZnJlZSk7Ci0KLSAgZiA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUlQpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlaW5mbyAoIiVGJXM6ICVFXG4iLCBmaWxlbmFtZSk7Ci0gICAgfQotCi0gIGtlZXAgPSBmYWxzZTsKLQotICBpbXBwYXRoID0gTlVMTDsKLSAgaW1wZmlsZSA9IE5VTEw7Ci0gIGltcG1lbWJlciA9IE5VTEw7Ci0KLSAgbGluZW5vID0gMDsKLSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciAqc3ltbmFtZTsKLSAgICAgIGJvb2xlYW4gc3lzY2FsbDsKLSAgICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBpZiAoYyAhPSAnXG4nKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKG8sIGMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBvYnN0YWNrXzFncm93IChvLCAnXDAnKTsKLSAgICAgICsrbGluZW5vOwotCi0gICAgICBzID0gKGNoYXIgKikgb2JzdGFja19iYXNlIChvKTsKLSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSsrczsKLSAgICAgIGlmICgqcyA9PSAnXDAnCi0JICB8fCAqcyA9PSAnKicKLQkgIHx8ICgqcyA9PSAnIycgJiYgc1sxXSA9PSAnICcpCi0JICB8fCAoISBpbXBvcnQgJiYgKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKSkKLQl7Ci0JICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKQotCXsKLQkgIHMgKz0gMjsKLQkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgICArK3M7Ci0JICBpZiAoKnMgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGltcHBhdGggPSBOVUxMOwotCSAgICAgIGltcGZpbGUgPSBOVUxMOwotCSAgICAgIGltcG1lbWJlciA9IE5VTEw7Ci0JICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnMgPT0gJygnKQotCSAgICBlaW5mbyAoIiVGJXMlZDogIyEgKFttZW1iZXJdKSBpcyBub3Qgc3VwcG9ydGVkIGluIGltcG9ydCBmaWxlc1xuIiwKLQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyIGNzOwotCSAgICAgIGNoYXIgKmZpbGU7Ci0KLQkgICAgICAodm9pZCkgb2JzdGFja19maW5pc2ggKG8pOwotCSAgICAgIGtlZXAgPSB0cnVlOwotCSAgICAgIGltcHBhdGggPSBzOwotCSAgICAgIGZpbGUgPSBOVUxMOwotCSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykgJiYgKnMgIT0gJygnICYmICpzICE9ICdcMCcpCi0JCXsKLQkJICBpZiAoKnMgPT0gJy8nKQotCQkgICAgZmlsZSA9IHMgKyAxOwotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChmaWxlICE9IE5VTEwpCi0JCXsKLQkJICBmaWxlWy0xXSA9ICdcMCc7Ci0JCSAgaW1wZmlsZSA9IGZpbGU7Ci0JCSAgaWYgKGltcHBhdGggPT0gZmlsZSAtIDEpCi0JCSAgICBpbXBwYXRoID0gIi8iOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW1wZmlsZSA9IGltcHBhdGg7Ci0JCSAgaW1wcGF0aCA9ICIiOwotCQl9Ci0JICAgICAgY3MgPSAqczsKLQkgICAgICAqcyA9ICdcMCc7Ci0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcykpCi0JCXsKLQkJICArK3M7Ci0JCSAgY3MgPSAqczsKLQkJfQotCSAgICAgIGlmIChjcyAhPSAnKCcpCi0JCXsKLQkJICBpbXBtZW1iZXIgPSAiIjsKLQkJICBpZiAoY3MgIT0gJ1wwJykKLQkJICAgIGVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQgZmlsZVxuIiwKLQkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKytzOwotCQkgIGltcG1lbWJlciA9IHM7Ci0JCSAgd2hpbGUgKCpzICE9ICcpJyAmJiAqcyAhPSAnXDAnKQotCQkgICAgKytzOwotCQkgIGlmICgqcyA9PSAnKScpCi0JCSAgICAqcyA9ICdcMCc7Ci0JCSAgZWxzZQotCQkgICAgZWluZm8gKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iLAotCQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgdG8gYmUgaW1wb3J0ZWQgb3IgZXhwb3J0ZWQuICAqLwotICAgICAgc3ltbmFtZSA9IHM7Ci0gICAgICBzeXNjYWxsID0gZmFsc2U7Ci0gICAgICBhZGRyZXNzID0gKGJmZF92bWEpIC0xOwotCi0gICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICdcMCcpCi0JKytzOwotICAgICAgaWYgKCpzICE9ICdcMCcpCi0JewotCSAgY2hhciAqc2U7Ci0KLQkgICpzKysgPSAnXDAnOwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgICAgKytzOwotCi0JICBzZSA9IHM7Ci0JICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlKSAmJiAqc2UgIT0gJ1wwJykKLQkgICAgKytzZTsKLQkgIGlmICgqc2UgIT0gJ1wwJykKLQkgICAgewotCSAgICAgICpzZSsrID0gJ1wwJzsKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkpCi0JCSsrc2U7Ci0JICAgICAgaWYgKCpzZSAhPSAnXDAnKQotCQllaW5mbyAoIiVzJWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIsCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCi0JICBpZiAocyA9PSBzZSkKLQkgICAgewotCSAgICAgIC8qIFRoZXJlIHdhcyBubyBhZGRyZXNzIGFmdGVyIGFsbC4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzdmMiKSA9PSAwCi0JCSAgIHx8IHN0cmNhc2VjbXAgKHMsICJzeXNjYWxsIikgPT0gMCkKLQkgICAgc3lzY2FsbCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICplbmQ7Ci0KLQkgICAgICBhZGRyZXNzID0gc3RydG91bCAocywgJmVuZCwgMCk7Ci0JICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQkJZWluZm8gKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiwKLQkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBpbXBvcnQpCi0JewotCSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbjsKLQotCSAgbGRsYW5nX2FkZF91bmRlZiAoc3ltbmFtZSk7Ci0JICBuID0gKChzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICopCi0JICAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCkpKTsKLQkgIG4tPm5leHQgPSBleHBvcnRfc3ltYm9sczsKLQkgIG4tPm5hbWUgPSBidXlzdHJpbmcgKHN5bW5hbWUpOwotCSAgbi0+c3lzY2FsbCA9IHN5c2NhbGw7Ci0JICBleHBvcnRfc3ltYm9scyA9IG47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHN5bW5hbWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkgICAgdHJ1ZSk7Ci0JICBpZiAoaCA9PSBOVUxMIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4ganVzdCBpZ25vcmUgYXR0ZW1wdHMgdG8gaW1wb3J0IGFuIHVucmVmZXJlbmNlZAotCQkgc3ltYm9sLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGgsCi0JCQkJCSAgICAgYWRkcmVzcywgaW1wcGF0aCwgaW1wZmlsZSwKLQkJCQkJICAgICBpbXBtZW1iZXIpKQotCQllaW5mbyAoIiVYJXM6JWQ6IGZhaWxlZCB0byBpbXBvcnQgc3ltYm9sICVzOiAlRVxuIiwKLQkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8sIHN5bW5hbWUpOwotCSAgICB9Ci0JfQotCi0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotICAgIH0KLQotICBpZiAob2JzdGFja19vYmplY3Rfc2l6ZSAobykgPiAwKQotICAgIHsKLSAgICAgIGVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IGlnbm9yaW5nIHVudGVybWluYXRlZCBsYXN0IGxpbmVcbiIsCi0JICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0gICAgfQotCi0gIGlmICghIGtlZXApCi0gICAgewotICAgICAgb2JzdGFja19mcmVlIChvLCBOVUxMKTsKLSAgICAgIGZyZWUgKG8pOwotICAgIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIHNhdmVzIHVzIGZyb20gd29ycnlpbmcgYWJvdXQgZGVjbGFyaW5nIGZyZWUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZnJlZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIGZyZWUgKHApOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9va3MgZm9yIHJlbG9jYXRpb25zIGFuZCBhc3NpZ25tZW50cwotICAgdG8gc3ltYm9scy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcyAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0pCi0gICAgewotICAgICAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcnM7Ci0KLSAgICAgIHJzID0gJnMtPnJlbG9jX3N0YXRlbWVudDsKLSAgICAgIGlmIChycy0+bmFtZSA9PSBOVUxMKQotCWVpbmZvICgiJUYlUDogb25seSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIHBlcm1pdHRlZFxuIik7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcnMtPm5hbWUpKQotCWVpbmZvICgiJUYlUDogYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgZmFpbGVkOiAlRVxuIik7Ci0gICAgfQotCi0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICBleHAtPmFzc2lnbi5kc3QpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICAwLAkvKiBmaW5pc2ggKi8KLSAgMCwJLyogY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKi8KLSAgMCwJLyogb3Blbl9keW5hbWljX2FyY2hpdmUgKi8KLSAgMCwJLyogcGxhY2Vfb3JwaGFuICovCi0gIDAsCS8qIHNldF9zeW1ib2xzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbSBiL2xkL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRmZjgzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogZW11bGF0ZSB0aGUgb3JpZ2luYWwgZ2xkIGZvciB0aGUgZ2l2ZW4gJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotc3RhdGljIGludCAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyBQQVJBTVMoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIElmIHRydWUsIHRoZW4gaW50ZXJ3b3JraW5nIHN0dWJzIHdoaWNoIHN1cHBvcnQgY2FsbHMgdG8gb2xkLCBub24taW50ZXJ3b3JraW5nCi0gICBhd2FyZSBBUk0gY29kZSBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KLQotc3RhdGljIGludCBzdXBwb3J0X29sZF9jb2RlID0gMDsKLXN0YXRpYyBjaGFyICogdGh1bWJfZW50cnlfc3ltYm9sID0gTlVMTDsKLQotI2RlZmluZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERQkJMzAwCi0jZGVmaW5lIE9QVElPTl9USFVNQl9FTlRSWQkJMzAxCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICB7InN1cHBvcnQtb2xkLWNvZGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREV9LAotICB7InRodW1iLWVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9USFVNQl9FTlRSWX0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3VwcG9ydC1vbGQtY29kZSAgIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkIGNvZGVcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXRodW1iLWVudHJ5PTxzeW0+ICBTZXQgdGhlIGVudHJ5IHBvaW50IHRvIGJlIFRodW1iIHN5bWJvbCA8c3ltPlxuIikpOwotfQotCi1zdGF0aWMgaW50Ci1nbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgICAgIGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLXsKLSAgaW50ICAgICAgICBsb25naW5kOwotICBpbnQgICAgICAgIG9wdGM7Ci0gIGludCAgICAgICAgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50ICAgICAgICBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgICAgICAgIHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIAotICB3YW50ZXJyb3IgID0gb3B0ZXJyOwotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgICA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItIiwgbG9uZ29wdHMsICYgbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERToKLSAgICAgIHN1cHBvcnRfb2xkX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9USFVNQl9FTlRSWToKLSAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJldHVybiAxOwotfQotDAotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSAoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfc2V0X291dHB1dF9hcmNoICgiYGVjaG8gJHtBUkNIfWAiKTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIC8qIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIgc2VjdGlvbiAqLwotCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZSBpbmZvcm1hdGlvbiAqLwotICAvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUgb3B0aW9uPyBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCSAgICAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvLCBzdXBwb3J0X29sZF9jb2RlKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiKSwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAiYXJtIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgYXJtIGJhY2tlbmQgbmVlZHMgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIG91dHB1dCBoYXNoIHN0cnVjdHVyZS4KLQkgVGhlc2Ugd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgYW4gYXJtIGZvcm1hdCwKLQkgaGVuY2Ugd2UgZG8gbm90IHN1cHBvcnQgbGlua2luZyBhbmQgY2hhbmdpbmcgb3V0cHV0IGZvcm1hdHMgYXQgdGhlCi0JIHNhbWUgdGltZS4gIFVzZSBhIGxpbmsgZm9sbG93ZWQgYnkgb2JqY29weSB0byBjaGFuZ2Ugb3V0cHV0IGZvcm1hdHMuICAqLwotICAgICAgZWluZm8gKCIlRiVYJVA6IGVycm9yOiBjYW5ub3QgY2hhbmdlIG91dHB1dCBmb3JtYXQgd2hpbHN0IGxpbmtpbmcgQVJNIGJpbmFyaWVzXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmIChiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKSkKLQkgIGJyZWFrOwotICAgICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggUEFSQU1TKCh2b2lkKSkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0gIGlmICh0aHVtYl9lbnRyeV9zeW1ib2wgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIAotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB0aHVtYl9lbnRyeV9zeW1ib2wsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLSAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZmZlclszMl07Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIAotICAgICAgLyogU3BlY2lhbCBwcm9jZXNpbmcgaXMgcmVxdWlyZWQgZm9yIGEgVGh1bWIgZW50cnkgc3ltYm9sLiAgVGhlCi0JIGJvdHRvbSBiaXQgb2YgaXRzIGFkZHJlc3MgbXVzdCBiZSBzZXQuICAqLwotICAgICAgdmFsID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJICAgIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotCSAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgdmFsIHw9IDE7Ci0KLSAgICAgIC8qIE5vdyBjb252ZXJ0IHRoaXMgdmFsdWUgaW50byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW4gZW50cnlfc3ltYm9sCi0gICAgICAgICB3aGVyZSB0aGUgbGFuZ19maW5pc2goKSBmdW5jdGlvbiB3aWxsIHBpY2sgaXQgdXAuICAqLwotICAgICAgYnVmZmVyWzBdID0gJzAnOwotICAgICAgYnVmZmVyWzFdID0gJ3gnOwotICAgICAgCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmZmVyICsgMiwgdmFsKTsKLQotICAgICAgaWYgKGVudHJ5X3N5bWJvbCAhPSBOVUxMICYmIGVudHJ5X2Zyb21fY21kbGluZSkKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIpLAotCSAgICAgICB0aHVtYl9lbnRyeV9zeW1ib2wsIGVudHJ5X3N5bWJvbCk7Ci0gICAgICBlbnRyeV9zeW1ib2wgPSBidWZmZXI7Ci0gICAgfQotICBlbHNlCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjb25ub3QgZmluZCB0aHVtYiBzdGFydCBzeW1ib2wgJXNcbiIpLCB0aHVtYl9lbnRyeV9zeW1ib2wpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoLCAvKiBmaW5pc2ggKi8KLSAgTlVMTCwgLyogY3JlYXRlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudHMgKi8KLSAgTlVMTCwgLyogb3BlbiBkeW5hbWljIGFyY2hpdmUgKi8KLSAgTlVMTCwgLyogcGxhY2Ugb3JwaGFuICovCi0gIE5VTEwsIC8qIHNldF9zeW1ib2xzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIE5VTEwsIC8qIHVucmVjb2duaXNlZCBmaWxlICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FybWVsZi5lbSBiL2xkL2VtdWx0ZW1wbC9hcm1lbGYuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjFhMGQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2FybWVsZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEyODggKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotRUxGU0laRT0zMgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0KLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci1zdGF0aWMgaW50ICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUygoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotDAotc3RhdGljIGludCBub19waXBlbGluZV9rbm93bGVkZ2UgPSAwOwotc3RhdGljIGNoYXIgKiB0aHVtYl9lbnRyeV9zeW1ib2wgPSBOVUxMOwotCi0jZGVmaW5lIE9QVElPTl9USFVNQl9FTlRSWQkJMzAxCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICB7ICJuby1waXBlbGluZS1rbm93bGVkZ2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3AnfSwKLSAgeyAidGh1bWItZW50cnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RIVU1CX0VOVFJZfSwKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMCB9Ci19OwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtcCAtLW5vLXBpcGVsaW5lLWtub3dsZWRnZSAgU3RvcCB0aGUgbGlua2VyIGtub3dpbmcgYWJvdXQgdGhlIHBpcGVsaW5lIGxlbmd0aFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgIC0tdGh1bWItZW50cnk9PHN5bT4gICAgICBTZXQgdGhlIGVudHJ5IHBvaW50IHRvIGJlIFRodW1iIHN5bWJvbCA8c3ltPlxuIikpOwotfQotCi1zdGF0aWMgaW50Ci1nbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgICAgIGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLXsKLSAgaW50ICAgICAgICBsb25naW5kOwotICBpbnQgICAgICAgIG9wdGM7Ci0gIGludCAgICAgICAgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50ICAgICAgICBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgICAgICAgIHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIAotICB3YW50ZXJyb3IgID0gb3B0ZXJyOwotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgICA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItcCIsIGxvbmdvcHRzLCAmIGxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgbm9fcGlwZWxpbmVfa25vd2xlZGdlID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVEhVTUJfRU5UUlk6Ci0gICAgICB0aHVtYl9lbnRyeV9zeW1ib2wgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQwKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSAoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfc2V0X291dHB1dF9hcmNoICgiYGVjaG8gJHtBUkNIfWAiKTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotICBjb25maWcuZHluYW1pY19saW5rID0gJHtEWU5BTUlDX0xJTkstdHJ1ZX07Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gYGlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbiBlY2hvIHRydWUgOyBlbHNlIGVjaG8gZmFsc2UgOyBmaWA7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCi0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gZW50cnktPmZpbGVuYW1lOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotCQkJICAgICArIHNpemVvZiAiL2xpYi5zbyIpOwotCi0gIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc28iLCBzZWFyY2gtPm5hbWUsIGZpbGVuYW1lLCBhcmNoKTsKLQotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0KLSAgLyogV2UgaGF2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgaW4gdGhlIGxpbmsuICBUaGUgRUxGCi0gICAgIGJhY2tlbmQgbGlua2VyIHdpbGwgY3JlYXRlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSAuZHluYW1pYwotICAgICBzZWN0aW9uIG5hbWluZyB0aGlzIGZpbGUuICBJZiB0aGlzIGZpbGUgaW5jbHVkZXMgYSBEVF9TT05BTUUKLSAgICAgZW50cnksIGl0IHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlIEVMRiBsaW5rZXIgd2lsbCBqdXN0IHVzZQotICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gIEZvciBhbiBhcmNoaXZlIGZvdW5kIGJ5IHNlYXJjaGluZywgbGlrZQotICAgICB0aGlzIG9uZSwgdGhlIERUX05FRURFRCBlbnRyeSBzaG91bGQgY29uc2lzdCBvZiBqdXN0IHRoZSBuYW1lIG9mCi0gICAgIHRoZSBmaWxlLCB3aXRob3V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIHVzZWQgdG8gZmluZCBpdC4gIE5vdGUKLSAgICAgdGhhdCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZSBoYXZlIGEgZHluYW1pYyBvYmplY3Q7IGFuCi0gICAgIGFyY2hpdmUgd2lsbCBuZXZlciBiZSByZWZlcmVuY2VkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LgotCi0gICAgIEZJWE1FOiBUaGlzIGFwcHJvYWNoLS11c2luZyBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZS0taXMgbm90Ci0gICAgIHZlcnkgcHJldHR5LiAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0aGluayBvZiBhbnl0aGluZyB0aGF0IGlzCi0gICAgIHByZXR0eSwgdGhvdWdoLiAgKi8KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0KQotICAgICAgJiYgKGVudHJ5LT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgY2hhciAqbmVlZGVkX25hbWU7Ci0KLSAgICAgIEFTU0VSVCAoZW50cnktPmlzX2FyY2hpdmUgJiYgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpOwotICAgICAgbmVlZGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKQotCQkJCSAgICAgICsgc3RybGVuIChhcmNoKQotCQkJCSAgICAgICsgc2l6ZW9mICJsaWIuc28iKTsKLSAgICAgIHNwcmludGYgKG5lZWRlZF9uYW1lLCAibGliJXMlcy5zbyIsIGZpbGVuYW1lLCBhcmNoKTsKLSAgICAgIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChlbnRyeS0+dGhlX2JmZCwgbmVlZGVkX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0vKiBGb3IgYSBuYXRpdmUgbGlua2VyLCBjaGVjayB0aGUgZmlsZSAvZXRjL2xkLnNvLmNvbmYgZm9yIGRpcmVjdG9yaWVzCi0gICBpbiB3aGljaCB3ZSBtYXkgZmluZCBzaGFyZWQgbGlicmFyaWVzLiAgL2V0Yy9sZC5zby5jb25mIGlzIHJlYWxseQotICAgb25seSBtZWFuaW5nZnVsIG9uIExpbnV4LCBidXQgd2UgY2hlY2sgaXQgb24gb3RoZXIgc3lzdGVtcyBhbnlob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZDsKLSAgc3RhdGljIGNoYXIgKmxkX3NvX2NvbmY7Ci0KLSAgaWYgKCEgaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgRklMRSAqZjsKLQotICAgICAgZiA9IGZvcGVuICgiL2V0Yy9sZC5zby5jb25mIiwgRk9QRU5fUlQpOwotICAgICAgaWYgKGYgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpiOwotCSAgc2l6ZV90IGxlbiwgYWxsb2M7Ci0JICBpbnQgYzsKLQotCSAgbGVuID0gMDsKLQkgIGFsbG9jID0gMTAwOwotCSAgYiA9IChjaGFyICopIHhtYWxsb2MgKGFsbG9jKTsKLQotCSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLQkgICAgewotCSAgICAgIGlmIChsZW4gKyAxID49IGFsbG9jKQotCQl7Ci0JCSAgYWxsb2MgKj0gMjsKLQkJICBiID0gKGNoYXIgKikgeHJlYWxsb2MgKGIsIGFsbG9jKTsKLQkJfQotCSAgICAgIGlmIChjICE9ICc6JwotCQkgICYmIGMgIT0gJyAnCi0JCSAgJiYgYyAhPSAnXHQnCi0JCSAgJiYgYyAhPSAnXG4nCi0JCSAgJiYgYyAhPSAnLCcpCi0JCXsKLQkJICBiW2xlbl0gPSBjOwotCQkgICsrbGVuOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSAhPSAnOicpCi0JCSAgICB7Ci0JCSAgICAgIGJbbGVuXSA9ICc6JzsKLQkJICAgICAgKytsZW47Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobGVuID4gMCAmJiBiW2xlbiAtIDFdID09ICc6JykKLQkgICAgLS1sZW47Ci0KLQkgIGlmIChsZW4gPiAwKQotCSAgICBiW2xlbl0gPSAnXDAnOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnJlZSAoYik7Ci0JICAgICAgYiA9IE5VTEw7Ci0JICAgIH0KLQotCSAgZmNsb3NlIChmKTsKLQotCSAgbGRfc29fY29uZiA9IGI7Ci0JfQotCi0gICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChsZF9zb19jb25mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsZF9zb19jb25mLCBuYW1lLCBmb3JjZSk7Ci19Ci0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZCBhbmQgc3RhdF9uZWVkZWQgYW5kIHZlcmNoZWNrLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBzdHJ1Y3Qgc3RhdCBnbG9iYWxfc3RhdDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF92ZXJjaGVja19uZWVkZWQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKmw7Ci0KLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAiYXJtIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgYXJtIGJhY2tlbmQgbmVlZHMgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIG91dHB1dCBoYXNoIHN0cnVjdHVyZS4KLQkgVGhlc2Ugd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgYW4gYXJtIGZvcm1hdCwKLQkgaGVuY2Ugd2UgZG8gbm90IHN1cHBvcnQgbGlua2luZyBhbmQgY2hhbmdpbmcgb3V0cHV0IGZvcm1hdHMgYXQgdGhlCi0JIHNhbWUgdGltZS4gIFVzZSBhIGxpbmsgZm9sbG93ZWQgYnkgb2JqY29weSB0byBjaGFuZ2Ugb3V0cHV0IGZvcm1hdHMuICAqLwotICAgICAgZWluZm8gKCIlRiVYJVA6IGVycm9yOiBjYW5ub3QgY2hhbmdlIG91dHB1dCBmb3JtYXQgd2hpbHN0IGxpbmtpbmcgQVJNIGJpbmFyaWVzXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQkvKiBUaGUgaW50ZXJ3b3JraW5nIGJmZCBtdXN0IGJlIHRoZSBsYXN0IG9uZSB0byBiZSBwcm9jZXNzZWQgKi8KLQlpZiAoIWlzLT5uZXh0KQotCSAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbyk7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gRFRfTkVFREVEIGVudHJpZXMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rIChvZnRlbiB0aGVyZSB3aWxsIGJlIG5vbmUpLgotICAgICBGb3IgZWFjaCBzdWNoIGZpbGUsIHdlIHdhbnQgdG8gdHJhY2sgZG93biB0aGUgY29ycmVzcG9uZGluZwotICAgICBsaWJyYXJ5LCBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBsaW5rLiAgVGhpcyBpcyB3aGF0Ci0gICAgIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIHdpbGwgZG8uICBUcmFja2luZyB0aGUgZmlsZXMgZG93biBoZXJlCi0gICAgIHBlcm1pdHMgb25lIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgYW5vdGhlciB3aXRob3V0IHJlcXVpcmluZwotICAgICBzcGVjaWFsIGFjdGlvbiBieSB0aGUgcGVyc29uIGRvaW5nIHRoZSBsaW5rLiAgTm90ZSB0aGF0IHRoZQotICAgICBuZWVkZWQgbGlzdCBjYW4gYWN0dWFsbHkgZ3JvdyB3aGlsZSB3ZSBhcmUgc3RlcHBpbmcgdGhyb3VnaCB0aGlzCi0gICAgIGxvb3AuICAqLwotICBuZWVkZWQgPSBiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgaW50IGZvcmNlOwotCi0gICAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBmaWxlLCBza2lwIGl0LiAgKi8KLSAgICAgIGZvciAobGwgPSBuZWVkZWQ7IGxsICE9IGw7IGxsID0gbGwtPm5leHQpCi0JaWYgKHN0cmNtcCAobGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQotCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKLQkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAotCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuCi0KLQkgV2Ugc2VhcmNoIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUsIHdlIHNraXAgb2JqZWN0cyB3aGljaCBtYXkKLQkgaW50cm9kdWNlIHZlcnNpb24gbWlzbWF0Y2hlcy4gIFRoZSBzZWNvbmQgdGltZSwgd2UgZm9yY2UKLQkgdGhlaXIgdXNlLiAgU2VlIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIGNvbW1lbnQuICAqLwotICAgICAgZm9yIChmb3JjZSA9IDA7IGZvcmNlIDwgMjsgZm9yY2UrKykKLQl7Ci0JICBjb25zdCBjaGFyICpsaWJfcGF0aDsKLQkgIHNpemVfdCBsZW47Ci0JICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGhfbGluaywKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGgsCi0JCQkJCQkgIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci0JICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTAotCSAgICAgICYmIGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwKLQkJCQkJCSAgICAgIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgIH0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBsZW4gPSBzdHJsZW4gKGwtPm5hbWUpOwotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgewotCSAgICAgIGNoYXIgKmZpbGVuYW1lOwotCi0JICAgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJY29udGludWU7Ci0JICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBsZW4gKyAyKTsKLQkgICAgICBzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBsLT5uYW1lKTsKLQkgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCSAgICB9Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGJyZWFrOwotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYgKGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JfQotCi0gICAgICBpZiAoZm9yY2UgPCAyKQotCWNvbnRpbnVlOwotCi0gICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBub3QgZm91bmQgKHRyeSB1c2luZyAtLXJwYXRoKVxuIiwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlbmFtZSwgKnNzZXQ7Ci0KLSAgICAgIHMgPSBzdHJjaHIgKHBhdGgsICc6Jyk7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXMgPSBwYXRoICsgc3RybGVuIChwYXRoKTsKLQotICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIGxlbiArIDIpOwotICAgICAgaWYgKHMgPT0gcGF0aCkKLQlzc2V0ID0gZmlsZW5hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChmaWxlbmFtZSwgcGF0aCwgcyAtIHBhdGgpOwotCSAgZmlsZW5hbWVbcyAtIHBhdGhdID0gJy8nOwotCSAgc3NldCA9IGZpbGVuYW1lICsgKHMgLSBwYXRoKSArIDE7Ci0JfQotICAgICAgc3RyY3B5IChzc2V0LCBuYW1lKTsKLQotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGZpbGVuYW1lLCBmb3JjZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgbmFtZSBmb3IgYSBkeW5hbWljIG9iamVjdAotICAgbmFtZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuICBUaGUgRk9SQ0UgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyCi0gICB0byBza2lwIHRoZSBjaGVjayBmb3IgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIGJmZCAqYWJmZDsKLQotICBhYmZkID0gYmZkX29wZW5yIChuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgb2JqZWN0IHdvdWxkIGluY2x1ZGUgYW55IGNvbmZsaWN0aW5nIGxpYnJhcnkKLSAgICAgdmVyc2lvbnMuICBJZiBGT1JDRSBpcyBzZXQsIHRoZW4gd2Ugc2tpcCB0aGlzIGNoZWNrOyB3ZSB1c2UgdGhpcwotICAgICB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kLCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGFueSBjb21wYXRpYmxlCi0gICAgIGluc3RhbmNlIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLSAgaWYgKCEgZm9yY2UpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0KLSAgICAgIGlmICghIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCAoYWJmZCwgJm5lZWRlZCkpCi0JZWluZm8gKCIlRiVQOiVCOiBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QgZmFpbGVkOiAlRVxuIiwgYWJmZCk7Ci0KLSAgICAgIGlmIChuZWVkZWQgIT0gTlVMTCkKLQl7Ci0JICBnbG9iYWxfdmVyY2hlY2tfbmVlZGVkID0gbmVlZGVkOwotCSAgZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCA9IGZhbHNlOwotCSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayk7Ci0JICBpZiAoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCkKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCSAgICAgIC8qIFJldHVybiBmYWxzZSB0byBmb3JjZSB0aGUgY2FsbGVyIHRvIG1vdmUgb24gdG8gdHJ5Ci0gICAgICAgICAgICAgICAgIGFub3RoZXIgZmlsZSBvbiB0aGUgc2VhcmNoIHBhdGguICAqLwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBCdXQgd2FpdCEgIEl0IGdldHMgbXVjaCB3b3JzZS4gIE9uIExpbnV4LCBpZiBhIHNoYXJlZAotICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3QgdXNlIGxpYmMgYXQgYWxsLCB3ZSBhcmUgc3VwcG9zZWQgdG8gc2tpcAotICAgICAgICAgICAgIGl0IHRoZSBmaXJzdCB0aW1lIGFyb3VuZCBpbiBjYXNlIHdlIGVuY291bnRlciBhIHNoYXJlZAotICAgICAgICAgICAgIGxpYnJhcnkgbGF0ZXIgb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoIGRvZXMgdXNlIHRoZQotICAgICAgICAgICAgIHZlcnNpb24gb2YgbGliYyB0aGF0IHdlIHdhbnQuICBUaGlzIGlzIG11Y2ggdG9vIGhvcnJpYmxlCi0gICAgICAgICAgICAgdG8gdXNlIG9uIGFueSBzeXN0ZW0gb3RoZXIgdGhhbiBMaW51eC4gICovCi0KLUVPRgotY2FzZSAke3RhcmdldH0gaW4KLSAgKi0qLWxpbnV4LWdudSopCi0gICAgY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0JICAgIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgICBpZiAoc3RybmNtcCAobC0+bmFtZSwgImxpYmMuc28iLCA3KSA9PSAwKQotCQlicmVhazsKLQkgICAgaWYgKGwgPT0gTlVMTCkKLQkgICAgICB7Ci0JCSh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCi1FT0YKLSAgICA7OwotZXNhYwotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQl9Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgbWF0Y2hpbmcgdGhlIERUX05FRURFRCBlbnRyeS4gICovCi0KLSAgLyogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBvdGhlciBpbnB1dCBmaWxlIG9mIHRoZQotICAgICBzYW1lIG5hbWUuICBXZSBtdXN0IG5vdyBjaGVjayBhZ2FpbiB0aGF0IHdlIGFyZSBub3QgaW5jbHVkaW5nIHRoZQotICAgICBzYW1lIGZpbGUgdHdpY2UuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvbiBtYW55IHN5c3RlbXMKLSAgICAgbGliYy5zbyBpcyBhIHN5bWxpbmsgdG8sIGUuZy4sIGxpYmMuc28uMS4gIFRoZSBTT05BTUUgZW50cnkgd2lsbAotICAgICByZWZlcmVuY2UgbGliYy5zby4xLiAgSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGxpYmMuc28sIHdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBsaWJjLnNvLjEgaWYgdGhleSBhcmUgdGhlIHNhbWUgZmlsZSwgYW5kIHdlCi0gICAgIGNhbiBvbmx5IGNoZWNrIHRoYXQgdXNpbmcgc3RhdC4gICovCi0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmZ2xvYmFsX3N0YXQpICE9IDApCi0gICAgZWluZm8gKCIlRiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKLSAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOwotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHsKLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgd2UgZm91bmQgdGhlIGZpbGUsIGV2ZW4gdGhvdWdoCi0gICAgICAgICB3ZSBhcmVuJ3QgZ29pbmcgdG8gZG8gYW55dGhpbmcgd2l0aCBpdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGVsbCB0aGUgRUxGIGJhY2tlbmQgdGhhdCBkb24ndCB3YW50IHRoZSBvdXRwdXQgZmlsZSB0byBoYXZlIGEKLSAgICAgRFRfTkVFREVEIGVudHJ5IGZvciB0aGlzIGZpbGUuICAqLwotICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgIiIpOwotCi0gIC8qIEFkZCB0aGlzIGZpbGUgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIsIGFiZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAocy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChzLT5maWxlbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLQotICAgICAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgICAgIGlmIChzb25hbWUgIT0gTlVMTAotCSAgJiYgc3RyY21wIChzb25hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCSAgCi0gIGlmIChzLT5zZWFyY2hfZGlyc19mbGFnCi0gICAgICAmJiBzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmOwotCi0gICAgICBmID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoZiAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGYgKyAxLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBydW5uaW5nIHN0YXQgb24KLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgY29uc3QgY2hhciAqc3VmZml4OwotICBjb25zdCBjaGFyICpzb25hbWU7Ci0gIGNvbnN0IGNoYXIgKmY7Ci0KLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfc3RhdCAocy0+dGhlX2JmZCwgJnN0KSAhPSAwKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIHMtPnRoZV9iZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3Quc3RfZGV2ID09IGdsb2JhbF9zdGF0LnN0X2RldgotICAgICAgJiYgc3Quc3RfaW5vID09IGdsb2JhbF9zdGF0LnN0X2lubykKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQgbG9va3MgbGlrZSB3ZSBhcmUgaW5jbHVkaW5nIHR3bwotICAgICBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwKLSAgICAgdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSBpZiAtbGMgcGlja3MgdXAgbGliYy5zby42IGJ1dCBzb21lIG90aGVyCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGhhcyBhIERUX05FRURFRCBlbnRyeSBvZiBsaWJjLnNvLjUuICBUaGlzIGlzIGEKLSAgICAgaHVlcmlzdGljIHRlc3QsIGFuZCBpdCB3aWxsIG9ubHkgd29yayBpZiB0aGUgbmFtZSBsb29rcyBsaWtlCi0gICAgIE5BTUUuc28uVkVSU0lPTi4gIEZJWE1FOiBEZXBlbmRpbmcgb24gZmlsZSBuYW1lcyBpcyBlcnJvci1wcm9uZS4KLSAgICAgSWYgd2UgcmVhbGx5IHdhbnQgdG8gaXNzdWUgd2FybmluZ3MgYWJvdXQgbWl4aW5nIHZlcnNpb24gbnVtYmVycwotICAgICBvZiBzaGFyZWQgbGlicmFyaWVzLCB3ZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5LiAgKi8KLQotICBpZiAoc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpICE9IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggPSBzdHJzdHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICIuc28uIik7Ci0gIGlmIChzdWZmaXggPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gcy0+ZmlsZW5hbWU7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGlmIChzdHJuY21wIChmLCBnbG9iYWxfbmVlZGVkLT5uYW1lLCBzdWZmaXggLSBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG1heSBjb25mbGljdCB3aXRoICVzXG4iLAotCSAgIGdsb2JhbF9uZWVkZWQtPm5hbWUsIGdsb2JhbF9uZWVkZWQtPmJ5LCBmKTsKLX0KLQotLyogT24gTGludXgsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLSAgIHNoYXJlZCBsaWJyYXJ5IGxpbmtlZCBhZ2FpbnN0IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBsaWJjLiAgVGhlCi0gICBkeW5hbWljIGxpbmtlciBzb21laG93IHRhZ3Mgd2hpY2ggbGliYyB2ZXJzaW9uIHRvIHVzZSBpbgotICAgL2V0Yy9sZC5zby5jYWNoZSwgYW5kLCBiYXNlZCBvbiB0aGUgbGliYyB0aGF0IGl0IHNlZXMgaW4gdGhlCi0gICBleGVjdXRhYmxlLCBjaG9vc2VzIHdoaWNoIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHRvIHVzZS4KLQotICAgV2UgdHJ5IHRvIGRvIGEgc2ltaWxhciBjaGVjayBoZXJlIGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhpcyBzaGFyZWQKLSAgIGxpYnJhcnkgbmVlZHMgYW55IG90aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggbWF5IGNvbmZsaWN0IHdpdGgKLSAgIGxpYnJhcmllcyB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBJZiBpdCBkb2VzLCB3ZQotICAgc2tpcCBpdCwgYW5kIHRyeSB0byBmaW5kIGFub3RoZXIgc2hhcmVkIGxpYnJhcnkgZmFydGhlciBvbiBkb3duIHRoZQotICAgbGluayBwYXRoLgotCi0gICBUaGlzIGlzIGNhbGxlZCB2aWEgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlLgotICAgR0xPQkFMX1ZFUkNIRUNLX05FRURFRCBpcyB0aGUgbGlzdCBvZiBvYmplY3RzIG5lZWRlZCBieSB0aGUgb2JqZWN0Ci0gICB3aGljaCB3ZSBhciBjaGVja2luZy4gIFRoaXMgc2V0cyBHTE9CQUxfVkVSQ0hFQ0tfRkFJTEVEIGlmIHdlIGZpbmQKLSAgIGEgY29uZmxpY3RpbmcgdmVyc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgY29uc3QgY2hhciAqc29uYW1lLCAqZjsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0gIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgKGJmZF9nZXRfZmlsZV9mbGFncyAocy0+dGhlX2JmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHJldHVybjsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gYmZkX2dldF9maWxlbmFtZSAocy0+dGhlX2JmZCk7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGZvciAobCA9IGdsb2JhbF92ZXJjaGVja19uZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc3VmZml4OwotCi0gICAgICBpZiAoc3RyY21wIChmLCBsLT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIFByb2JhYmx5IGNhbid0IGhhcHBlbiwgYnV0IGl0J3MgYW4gZWFzeSBjaGVjay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjaHIgKGwtPm5hbWUsICcvJykgIT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3VmZml4ID0gc3Ryc3RyIChsLT5uYW1lLCAiLnNvLiIpOwotICAgICAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWZmaXggKz0gc2l6ZW9mICIuc28uIiAtIDE7Ci0KLSAgICAgIGlmIChzdHJuY21wIChmLCBsLT5uYW1lLCBzdWZmaXggLSBsLT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIEhlcmUgd2Uga25vdyB0aGF0IFMgaXMgYSBkeW5hbWljIG9iamVjdCBGT08uU08uVkVSMSwgYW5kCi0gICAgICAgICAgICAgdGhlIG9iamVjdCB3ZSBhcmUgY29uc2lkZXJpbmcgbmVlZHMgYSBkeW5hbWljIG9iamVjdAotICAgICAgICAgICAgIEZPTy5TTy5WRVIyLCBhbmQgVkVSMSBhbmQgVkVSMiBhcmUgZGlmZmVyZW50LiAgVGhpcwotICAgICAgICAgICAgIGFwcGVhcnMgdG8gYmUgYSB2ZXJzaW9uIG1pc21hdGNoLCBzbyB3ZSB0ZWxsIHRoZSBjYWxsZXIKLSAgICAgICAgICAgICB0byB0cnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuICAqLwotCSAgZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQwotICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yb2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfYnNzOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcmVsOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfaW50ZXJwOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgYXNlY3Rpb24gKnNuZXcsICoqcHBzOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLSAgZXRyZWVfdHlwZSAqYWRkcmVzczsKLSAgY29uc3QgY2hhciAqc2VjbmFtZSwgKnBzOwotICBjb25zdCBjaGFyICpvdXRzZWNuYW1lOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaG9sZF9zZWN0aW9uID0gczsKLSAgaG9sZF91c2UgPSBOVUxMOwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik7Ci0KLSAgaWYgKGhvbGRfdXNlICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHBsYWNlZCBhIHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgd2lsZF9kb2l0ICgmaG9sZF91c2UtPmNoaWxkcmVuLCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIHRoZW4gYWx3YXlzIHB1dCAuZ251Lndhcm5pbmcuU1lNQk9MCi0gICAgIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0IHNlY3Rpb24gdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZSB3YXkuICAqLwotICBpZiAoISBsaW5rX2luZm8uc2hhcmVkCi0gICAgICAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDAKLSAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdGV4dC0+Y2hpbGRyZW4sIHMsIGhvbGRfdGV4dCwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogRGVjaWRlIHdoaWNoIHNlZ21lbnQgdGhlIHNlY3Rpb24gc2hvdWxkIGdvIGluIGJhc2VkIG9uIHRoZQotICAgICBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICBXZSBwdXQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMKLSAgICAgcmlnaHQgYWZ0ZXIgdGhlIC5pbnRlcnAgc2VjdGlvbiwgc28gdGhhdCB0aGUgUFRfTk9URSBzZWdtZW50IGlzCi0gICAgIHN0b3JlZCByaWdodCBhZnRlciB0aGUgcHJvZ3JhbSBoZWFkZXJzIHdoZXJlIHRoZSBPUyBjYW4gcmVhZCBpdAotICAgICBpbiB0aGUgZmlyc3QgcGFnZS4gICovCi0gIHBsYWNlID0gTlVMTDsKLSAgaWYgKHMtPmZsYWdzICYgU0VDX0VYQ0xVREUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5ub3RlIiwgNCkgPT0gMAotICAgICAgJiYgaG9sZF9pbnRlcnAgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfaW50ZXJwOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICAgJiYgaG9sZF9ic3MgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfYnNzOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKLQkgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfZGF0YTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoc2VjbmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JICAgJiYgaG9sZF9yZWwgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcmVsOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfcm9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JvZGF0YTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3RleHQ7Ci0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmIHRoZQotICAgICBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGggZGlmZmVyZW50Ci0gICAgIGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICBvdXRzZWNuYW1lID0gc2VjbmFtZTsKLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgICBjaGFyICpuZXduYW1lOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAob3V0c2VjbmFtZSk7Ci0gICAgICBuZXduYW1lID0geG1hbGxvYyAobGVuICsgNSk7Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIG91dHNlY25hbWUpOwotICAgICAgaSA9IDA7Ci0gICAgICBkbwotCXsKLQkgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmV3bmFtZSkgIT0gTlVMTCk7Ci0KLSAgICAgIG91dHNlY25hbWUgPSBuZXduYW1lOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZSByaWdodAotICAgICBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sgbmVhdGVyLiAgKi8KLSAgc25ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIG91dHNlY25hbWUpOwotICBpZiAoc25ldyA9PSBOVUxMKQotICAgICAgZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBvdXRzZWNuYW1lKTsKLSAgaWYgKHBsYWNlLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocHBzID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOyAqcHBzICE9IHNuZXc7IHBwcyA9ICYoKnBwcyktPm5leHQpCi0JOwotICAgICAgKnBwcyA9IHNuZXctPm5leHQ7Ci0gICAgICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotICAgICAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLSAgICB9Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIG9sZCA9IHN0YXRfcHRyOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0gIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgLyogSWYgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaXMgcmVwcmVzZW50YWJsZSBpbiBDLCB0aGVuIGNyZWF0ZQotICAgICBzeW1ib2xzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgZm9yIChwcyA9IG91dHNlY25hbWU7ICpwcyAhPSAnXDAnOyBwcysrKQotICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcHMpICYmICpwcyAhPSAnXycpCi0gICAgICBicmVhazsKLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gb3V0c2VjbmFtZSArIHNpemVvZiAiX19zdGFydF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0YXJ0XyVzIiwgb3V0c2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfdW5vcCAoQUxJR05fSywKLQkJCQkJCWV4cF9pbnRvcCAoKGJmZF92bWEpIDEKLQkJCQkJCQkgICA8PCBzLT5hbGlnbm1lbnRfcG93ZXIpKSkpOwotICAgIH0KLQotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIGFkZHJlc3MgPSBOVUxMOwotICBlbHNlCi0gICAgYWRkcmVzcyA9IGV4cF9pbnRvcCAoKGJmZF92bWEpIDApOwotCi0gIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRzZWNuYW1lLCBhZGRyZXNzLCAwLAotCQkJCSAgICAgICAoYmZkX3ZtYSkgMCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7Ci0KLSAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQotICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotICAgICgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLQotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0b3BfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdG9wXyVzIiwgb3V0c2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpKSk7Ci0gICAgfQotCi0gIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgKmFkZC50YWlsID0gcGxhY2UtPmhlYWRlci5uZXh0OwotICBwbGFjZS0+aGVhZGVyLm5leHQgPSBhZGQuaGVhZDsKLQotICBzdGF0X3B0ciA9IG9sZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24gKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmIChzLT5oZWFkZXIudHlwZSAhPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtKQotICAgIHJldHVybjsKLQotICBvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsIGhvbGRfc2VjdGlvbi0+bmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJvZGF0YSIpID09IDApCi0gICAgaG9sZF9yb2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICBob2xkX2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5ic3MiKSA9PSAwKQotICAgIGhvbGRfYnNzID0gb3M7Ci0gIGVsc2UgaWYgKGhvbGRfcmVsID09IE5VTEwKLQkgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICYmIChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgc3RybmNtcCAob3MtPm5hbWUsICIucmVsIiwgNCkgPT0gMCkKLSAgICBob2xkX3JlbCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmludGVycCIpID09IDApCi0gICAgaG9sZF9pbnRlcnAgPSBvczsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWJyZWFrOwotCi0gICAgICAvKiBXZSBjYWxsIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQgZXZlbiBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQuCi0JIFRoaXMgaXMgYmVjYXVzZSBpZiBpdCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIHdlCi0JIGFjdHVhbGx5IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LAotCSBub3QgdGhlIHZhbHVlIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IChiZWNhdXNlIHdlIGFyZSBzZXR0aW5nCi0JIHN5bWJvbHMgbGlrZSBldGV4dCkuICBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyCi0JIG9iamVjdCwgdGhlbiwgYXMgaXQgaGFwcGVucywgY2FsbGluZyByZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JIHdpbGwgZG8gbm8gaGFybS4gICovCi0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISAoYmZkX2VsZiR7RUxGU0laRX1fcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCQkgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGV4cC0+YXNzaWduLmRzdCwKLQkJICBleHAtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlID8gdHJ1ZSA6IGZhbHNlKSkpCi0JICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvICVzOiAlRVxuIiwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb2NhdGVzIGFueSBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGFuZAotICAgdGVsbHMgdGhlIEVMRiBiYWNrZW5kIGFib3V0IHRoZW0sIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgY29uc3QgY2hhciAqcnBhdGg7Ci0gIGFzZWN0aW9uICpzaW50ZXJwOwotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFueSB2YXJpYWJsZSBhc3NpZ25tZW50cywgd2UgbmVlZCB0byBsZXQKLSAgICAgdGhlIEVMRiBiYWNrZW5kIGtub3cgYWJvdXQgdGhlbSBpbiBjYXNlIHRoZSB2YXJpYWJsZXMgYXJlCi0gICAgIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIEVMRiBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQKLSAgICAgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgcnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0gIGlmIChycGF0aCA9PSBOVUxMKQotICAgIHJwYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3NpemVfZHluYW1pY19zZWN0aW9ucwotICAgICAgICAgKG91dHB1dF9iZmQsIGNvbW1hbmRfbGluZS5zb25hbWUsIHJwYXRoLAotCSAgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljLCBjb21tYW5kX2xpbmUuZmlsdGVyX3NobGliLAotCSAgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMsCi0JICAmbGlua19pbmZvLCAmc2ludGVycCwgbGFuZ19lbGZfdmVyc2lvbl9pbmZvKSkpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotCi0gIC8qIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgZHluYW1pYyBsaW5rZXIgd2UgYXJlIHVzaW5nLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlciAhPSBOVUxMCi0gICAgICAmJiBzaW50ZXJwICE9IE5VTEwpCi0gICAgewotICAgICAgc2ludGVycC0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgY29tbWFuZF9saW5lLmludGVycHJldGVyOwotICAgICAgc2ludGVycC0+X3Jhd19zaXplID0gc3RybGVuIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIpICsgMTsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgYW55IHNlY3Rpb25zIG5hbWVkIC5nbnUud2FybmluZy4gIEFzIGEgR05VIGV4dGVuc2lvbnMsCi0gICAgIHdlIHRyZWF0IHN1Y2ggc2VjdGlvbnMgYXMgY29udGFpbmluZyB3YXJuaW5nIG1lc3NhZ2VzLiAgV2UgcHJpbnQKLSAgICAgb3V0IHRoZSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHplcm8gb3V0IHRoZSBzZWN0aW9uIHNpemUgc28KLSAgICAgdGhhdCBpdCBkb2VzIG5vdCBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWFzZWN0aW9uICpzOwotCWJmZF9zaXplX3R5cGUgc3o7Ci0JY2hhciAqbXNnOwotCWJvb2xlYW4gcmV0OwotCi0JaWYgKGlzLT5qdXN0X3N5bXNfZmxhZykKLQkgIGNvbnRpbnVlOwotCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpcy0+dGhlX2JmZCwgIi5nbnUud2FybmluZyIpOwotCWlmIChzID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCXN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoaXMtPnRoZV9iZmQsIHMpOwotCW1zZyA9IHhtYWxsb2MgKChzaXplX3QpIHN6ICsgMSk7Ci0JaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpcy0+dGhlX2JmZCwgcywgbXNnLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQkgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5nbnUud2FybmluZzogJUVcbiIsCi0JCSBpcy0+dGhlX2JmZCk7Ci0JbXNnW3N6XSA9ICdcMCc7Ci0JcmV0ID0gbGlua19pbmZvLmNhbGxiYWNrcy0+d2FybmluZyAoJmxpbmtfaW5mbywgbXNnLAotCQkJCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJICAgIGlzLT50aGVfYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJICAgIChiZmRfdm1hKSAwKTsKLQlBU1NFUlQgKHJldCk7Ci0JZnJlZSAobXNnKTsKLQotCS8qIENsb2JiZXIgdGhlIHNlY3Rpb24gc2l6ZSwgc28gdGhhdCB3ZSBkb24ndCB3YXN0ZSBjb3B5aW5nIHRoZQotCSAgIHdhcm5pbmcgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICB9Ci0gIH0KLQotICAvKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViIHNlY3Rpb24gKi8KLQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUgaW5mb3JtYXRpb24gKi8KLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lIG9wdGlvbj8ga3JrQGN5Z251cy5jb20gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoIWJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvLAotCQkJCQkJICAgICAgbm9fcGlwZWxpbmVfa25vd2xlZGdlKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiKSwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCBQQVJBTVMoKHZvaWQpKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLSAgaWYgKHRodW1iX2VudHJ5X3N5bWJvbCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHRodW1iX2VudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotICAgICAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgYnVmZmVyWzMyXTsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgCi0gICAgICAvKiBTcGVjaWFsIHByb2Nlc2luZyBpcyByZXF1aXJlZCBmb3IgYSBUaHVtYiBlbnRyeSBzeW1ib2wuICBUaGUKLQkgYm90dG9tIGJpdCBvZiBpdHMgYWRkcmVzcyBtdXN0IGJlIHNldC4gICovCi0gICAgICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkgICAgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgCi0gICAgICB2YWwgfD0gMTsKLQotICAgICAgLyogTm93IGNvbnZlcnQgdGhpcyB2YWx1ZSBpbnRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiBlbnRyeV9zeW1ib2wKLSAgICAgICAgIHdoZXJlIHRoZSBsYW5nX2ZpbmlzaCgpIGZ1bmN0aW9uIHdpbGwgcGljayBpdCB1cC4gICovCi0gICAgICBidWZmZXJbMF0gPSAnMCc7Ci0gICAgICBidWZmZXJbMV0gPSAneCc7Ci0gICAgICAKLSAgICAgIHNwcmludGZfdm1hIChidWZmZXIgKyAyLCB2YWwpOwotCi0gICAgICBpZiAoZW50cnlfc3ltYm9sICE9IE5VTEwgJiYgZW50cnlfZnJvbV9jbWRsaW5lKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogJy0tdGh1bWItZW50cnkgJXMnIGlzIG92ZXJyaWRpbmcgJy1lICVzJ1xuIiksCi0JICAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCwgZW50cnlfc3ltYm9sKTsKLSAgICAgIGVudHJ5X3N5bWJvbCA9IGJ1ZmZlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNvbm5vdCBmaW5kIHRodW1iIHN0YXJ0IHN5bWJvbCAlc1xuIiksIHRodW1iX2VudHJ5X3N5bWJvbCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgKGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCIgOyB0aGVuCi0gICAgICAgIGVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8uc2hhcmVkKSByZXR1cm4nICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0gICAgICAgIHNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1maQotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHMiOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoLCAvKiBmaW5pc2ggKi8KLSAgTlVMTCwgLyogY3JlYXRlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudHMgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiwKLSAgTlVMTCwgLyogc2V0X3N5bWJvbHMgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncywKLSAgTlVMTCwgLyogdW5yZWNvZ25pc2VkIGZpbGUgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zLAotICBOVUxMIC8qIHJlY29nbml6ZWQgZmlsZSAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtIGIvbGQvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGE1MGRmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlICgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YiBzZWN0aW9uICovCi0KLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlIGluZm9ybWF0aW9uICovCi0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZSBvcHRpb24/IGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmbGlua19pbmZvLCAwKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiKSwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLQotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgewotICAgICAgLyogVGhlIGludGVyd29ya2luZyBiZmQgbXVzdCBiZSB0aGUgbGFzdCBvbmUgdG8gYmUgcHJvY2Vzc2VkICovCi0gICAgICBpZiAoIWlzLT5uZXh0KQotICAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbyk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsIC8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLCAvKiBzZXRfc3ltYm9scyAqLwotICBOVUxMLAotICBOVUxMLCAvKiB1bnJlY29nbmlzZWQgZmlsZSAqLwotICBOVUxMCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYmVvcy5lbSBiL2xkL2VtdWx0ZW1wbC9iZW9zLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmIzZWMyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9iZW9zLmVtCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgV0lORE9XU19OVCAqLwotLyogVGhlIG9yaWdpbmFsIGZpbGUgZ2VuZXJhdGVkIHJldHVybmVkIGRpZmZlcmVudCBkZWZhdWx0IHNjcmlwdHMgZGVwZW5kaW5nCi0gICBvbiB3aGV0aGVyIGNlcnRhaW4gc3dpdGNoZXMgd2VyZSBzZXQsIGJ1dCB0aGVzZSBzd2l0Y2hlcyBwZXJ0YWluIHRvIHRoZQotICAgTGludXggc3lzdGVtIGFuZCB0aGF0IHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBjb2ZmLiAgSW4gdGhlIE5UIGNhc2UsIHdlCi0gICBvbmx5IGRldGVybWluZSBpZiB0aGUgc3Vic3lzdGVtIGlzIGNvbnNvbGUgb3Igd2luZG93cyBpbiBvcmRlciB0byBzZWxlY3QKLSAgIHRoZSBjb3JyZWN0IGVudHJ5IHBvaW50IGJ5IGRlZmF1bHQuICovIAotICAKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSNpZiAwIC8qIGFyZ3VtZW50IHRvIHFzb3J0IHNvIGRvbid0IHByb3RvdHlwZSAqLwotc3RhdGljIGludCBzb3J0X2J5X2ZpbGVfbmFtZSBQQVJBTVMgKCh2b2lkICosIHZvaWQgKikpOwotc3RhdGljIGludCBzb3J0X2J5X3NlY3Rpb25fbmFtZSBQQVJBTVMgKCh2b2lkICosIHZvaWQgKikpOwotI2VuZGlmCi1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnNvcnRfc2VjdGlvbnNfMQotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqLCBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICosIGludCwKLQkgICBpbnQgKCopKCkpKTsKLXN0YXRpYyB2b2lkIHNvcnRfc2VjdGlvbnMgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZTsKLXN0YXRpYyBpbnQgZGxsOwotCi1leHRlcm4gY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJhLmV4ZSI7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLX0KLQwKLS8qIFBFIGZvcm1hdCBleHRyYSBjb21tYW5kIGxpbmUgb3B0aW9ucy4gICovCi0KLS8qIFVzZWQgZm9yIHNldHRpbmcgZmxhZ3MgaW4gdGhlIFBFIGhlYWRlci4gKi8KLSNkZWZpbmUgT1BUSU9OX0JBU0VfRklMRQkJKDMwMCAgKyAxKQotI2RlZmluZSBPUFRJT05fRExMCQkJKE9QVElPTl9CQVNFX0ZJTEUgKyAxKQotI2RlZmluZSBPUFRJT05fRklMRV9BTElHTk1FTlQJCShPUFRJT05fRExMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNQUdFX0JBU0UJCShPUFRJT05fRklMRV9BTElHTk1FTlQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX0lNQUdFX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTgkJKE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OCShPUFRJT05fTUFKT1JfT1NfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OCShPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTgkJKE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OCShPUFRJT05fTUlOT1JfT1NfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVAkoT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUQUNLICAgICAgICAgICAgICAgICAgICAoT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NVQlNZU1RFTSAgICAgICAgICAgICAgICAoT1BUSU9OX1NUQUNLICsgMSkKLSNkZWZpbmUgT1BUSU9OX0hFQVAJCQkoT1BUSU9OX1NVQlNZU1RFTSArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7Ci0gIC8qIFBFIG9wdGlvbnMgKi8KLSAgICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKLSAgICB7ImRsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMfSwKLSAgICB7ImZpbGUtYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GSUxFX0FMSUdOTUVOVH0sCi0gICAgeyJoZWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUFQfSwgCi0gICAgeyJpbWFnZS1iYXNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTUFHRV9CQVNFfSwgCi0gICAgeyJtYWpvci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OfSwKLSAgICB7Im1ham9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX09TX1ZFUlNJT059LAotICAgIHsibWFqb3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgICB7Im1pbm9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT059LAotICAgIHsibWlub3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTn0sCi0gICAgeyJtaW5vci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT059LAotICAgIHsic2VjdGlvbi1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UfSwKLSAgICB7InN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFDS30sCi0gICAgeyJzdWJzeXN0ZW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVQlNZU1RFTX0sCi0gICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci0gIH07Ci0KLQotLyogUEUvV0lOMzI7IGFkZGVkIHJvdXRpbmVzIHRvIGdldCB0aGUgc3Vic3lzdGVtIHR5cGUsIGhlYXAgYW5kL29yIHN0YWNrCi0gICBwYXJhbWV0ZXJzIHdoaWNoIG1heSBiZSBpbnB1dCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB2b2lkICpwdHI7Ci0gIGludCBzaXplOwotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKnN5bWJvbDsKLSAgaW50IGluaXRlZDsKLX0gZGVmaW5mbzsKLQotI2RlZmluZSBEKGZpZWxkLHN5bWJvbCxkZWYpICB7JnBlLmZpZWxkLHNpemVvZihwZS5maWVsZCksIGRlZiwgc3ltYm9sLDB9Ci0KLXN0YXRpYyBkZWZpbmZvIGluaXRbXSA9Ci17Ci0gIC8qIGltYWdlYmFzZSBtdXN0IGJlIGZpcnN0ICovCi0jZGVmaW5lIElNQUdFQkFTRU9GRiAwCi0gIEQoSW1hZ2VCYXNlLCJfX2ltYWdlX2Jhc2VfXyIsIEJFT1NfRVhFX0lNQUdFX0JBU0UpLAotI2RlZmluZSBETExPRkYgMQotICB7JmRsbCwgc2l6ZW9mKGRsbCksIDAsICJfX2RsbF9fIn0sCi0gIEQoU2VjdGlvbkFsaWdubWVudCwiX19zZWN0aW9uX2FsaWdubWVudF9fIiwgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UKSwKLSAgRChGaWxlQWxpZ25tZW50LCJfX2ZpbGVfYWxpZ25tZW50X18iLCBQRV9ERUZfRklMRV9BTElHTk1FTlQpLAotICBEKE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19tYWpvcl9vc192ZXJzaW9uX18iLCA0KSwKLSAgRChNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWlub3Jfb3NfdmVyc2lvbl9fIiwgMCksCi0gIEQoTWFqb3JJbWFnZVZlcnNpb24sIl9fbWFqb3JfaW1hZ2VfdmVyc2lvbl9fIiwgMSksCi0gIEQoTWlub3JJbWFnZVZlcnNpb24sIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIiwgMCksCi0gIEQoTWFqb3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCA0KSwKLSAgRChNaW5vclN1YnN5c3RlbVZlcnNpb24sIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsIDApLAotICBEKFN1YnN5c3RlbSwiX19zdWJzeXN0ZW1fXyIsIDMpLAotICBEKFNpemVPZlN0YWNrUmVzZXJ2ZSwiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsIDB4MjAwMDAwMCksCi0gIEQoU2l6ZU9mU3RhY2tDb21taXQsIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIsIDB4MTAwMCksCi0gIEQoU2l6ZU9mSGVhcFJlc2VydmUsIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsIDB4MTAwMDAwKSwKLSAgRChTaXplT2ZIZWFwQ29tbWl0LCJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIsIDB4MTAwMCksCi0gIEQoTG9hZGVyRmxhZ3MsIl9fbG9hZGVyX2ZsYWdzX18iLCAweDApLAotICB7IE5VTEwsIDAsIDAsIE5VTEwsIDAgfQotfTsKLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX25hbWUgKG5hbWUsIHZhbCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGludCBpOwotICAvKiBGaW5kIHRoZSBuYW1lIGFuZCBzZXQgaXQuICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ucHRyOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgaW5pdFtpXS5zeW1ib2wpID09IDApCi0JewotCSAgaW5pdFtpXS52YWx1ZSA9IHZhbDsKLQkgIGluaXRbaV0uaW5pdGVkID0gMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBhYm9ydCgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfc3Vic3lzdGVtICgpCi17Ci0gIGNvbnN0IGNoYXIgKnN2ZXI7Ci0gIGludCBsZW47Ci0gIGludCBpOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IAotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjb25zdCBpbnQgdmFsdWU7Ci0gICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICB9Ci0gIHZbXSA9Ci0gICAgewotICAgICAgeyAibmF0aXZlIiwgMSwgIl9OdFByb2Nlc3NTdGFydHVwIiB9LAotICAgICAgeyAid2luZG93cyIsIDIsICJfV2luTWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJ3d2luZG93cyIsIDIsICJfd1dpbk1haW5DUlRTdGFydHVwIiB9LAotICAgICAgeyAiY29uc29sZSIsIDMsICJfbWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJ3Y29uc29sZSIsIDMsICJfd21haW5DUlRTdGFydHVwIiB9LAotI2lmIDAKLSAgICAgIC8qIFRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IHJlY29nbml6ZSB0aGlzLiAgKi8KLSAgICAgIHsgIm9zMiIsIDUsICIiIH0sCi0jZW5kaWYKLSAgICAgIHsgInBvc2l4IiwgNywgIl9fX1Bvc2l4UHJvY2Vzc1N0YXJ0dXAifSwKLSAgICAgIHsgMCwgMCwgMCB9Ci0gICAgfTsKLQotICBzdmVyID0gc3RyY2hyIChvcHRhcmcsICc6Jyk7Ci0gIGlmIChzdmVyID09IE5VTEwpCi0gICAgbGVuID0gc3RybGVuIChvcHRhcmcpOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZW5kOwotCi0gICAgICBsZW4gPSBzdmVyIC0gb3B0YXJnOwotICAgICAgc2V0X3BlX25hbWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLAotCQkgICBzdHJ0b3VsIChzdmVyICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgPT0gJy4nKQotCXNldF9wZV9uYW1lICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgICBzdHJ0b3VsIChlbmQgKyAxLCAmZW5kLCAwKSk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIik7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IHZbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChvcHRhcmcsIHZbaV0ubmFtZSwgbGVuKSA9PSAwCi0JICAmJiB2W2ldLm5hbWVbbGVuXSA9PSAnXDAnKQotCXsKLQkgIHNldF9wZV9uYW1lICgiX19zdWJzeXN0ZW1fXyIsIHZbaV0udmFsdWUpOwotCi0JICAvKiBJZiB0aGUgc3Vic3lzdGVtIGlzIHdpbmRvd3MsIHdlIHVzZSBhIGRpZmZlcmVudCBlbnRyeQotCSAgICAgcG9pbnQuICBXZSBhbHNvIHJlZ2lzdGVyIHRoZSBlbnRyeSBwb2ludCBhcyBhbiB1bmRlZmluZWQKLQkgICAgIHN5bWJvbC4gZnJvbSBsYW5nX2FkZF9lbnRyeSgpIFRoZSByZWFzb24gd2UgZG8KLQkgICAgIHRoaXMgaXMgc28gdGhhdCB0aGUgdXNlcgotCSAgICAgZG9lc24ndCBoYXZlIHRvIGJlY2F1c2UgdGhleSB3b3VsZCBoYXZlIHRvIHVzZSB0aGUgLXUKLQkgICAgIHN3aXRjaCBpZiB0aGV5IHdlcmUgc3BlY2lmeWluZyBhbiBlbnRyeSBwb2ludCBvdGhlciB0aGFuCi0JICAgICBfbWFpbkNSVFN0YXJ0dXAuICBTcGVjaWZpY2FsbHksIGlmIGNyZWF0aW5nIGEgd2luZG93cwotCSAgICAgYXBwbGljYXRpb24sIGVudHJ5IHBvaW50IF9XaW5NYWluQ1JUU3RhcnR1cCBtdXN0IGJlCi0JICAgICBzcGVjaWZpZWQuICBXaGF0IEkgaGF2ZSBmb3VuZCBmb3Igbm9uIGNvbnNvbGUKLQkgICAgIGFwcGxpY2F0aW9ucyAoZW50cnkgbm90IF9tYWluQ1JUU3RhcnR1cCkgaXMgdGhhdCB0aGUgLm9iagotCSAgICAgdGhhdCBjb250YWlucyBtYWluQ1JUU3RhcnR1cCBpcyBicm91Z2h0IGluIHNpbmNlIGl0IGlzCi0JICAgICB0aGUgZmlyc3QgZW5jb3VudGVyZWQgaW4gbGliYy5saWIgYW5kIGl0IGhhcyBvdGhlcgotCSAgICAgc3ltYm9scyBpbiBpdCB3aGljaCB3aWxsIGJlIHB1bGxlZCBpbiBieSB0aGUgbGluawotCSAgICAgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIGFkZGluZyAtdSB3aXRoIHRoZSBlbnRyeSBwb2ludAotCSAgICAgbmFtZSBzcGVjaWZpZWQgZm9yY2VzIHRoZSBjb3JyZWN0IC5vYmogdG8gYmUgdXNlZC4gIFdlCi0JICAgICBjYW4gYXZvaWQgbWFraW5nIHRoZSB1c2VyIGRvIHRoaXMgYnkgYWx3YXlzIGFkZGluZyB0aGUKLQkgICAgIGVudHJ5IHBvaW50IG5hbWUgYXMgYW4gdW5kZWZpbmVkIHN5bWJvbC4gICovCi0JICBsYW5nX2FkZF9lbnRyeSAodltpXS5lbnRyeSwgMSk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlaW5mbyAoIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIsIG9wdGFyZyk7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3ZhbHVlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotICAgICAKLXsKLSAgY2hhciAqZW5kOwotICBzZXRfcGVfbmFtZSAobmFtZSwgIHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCkpOwotICBpZiAoZW5kID09IG9wdGFyZykKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIsIG9wdGFyZyk7Ci0gICAgfQotCi0gIG9wdGFyZyA9IGVuZDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdGFja19oZWFwIChyZXNuYW1lLCBjb21uYW1lKQotICAgICBjaGFyICpyZXNuYW1lOwotICAgICBjaGFyICpjb21uYW1lOwotewotICBzZXRfcGVfdmFsdWUgKHJlc25hbWUpOwotICBpZiAoKm9wdGFyZyA9PSAnLCcpCi0gICAgewotICAgICAgb3B0YXJnKys7Ci0gICAgICBzZXRfcGVfdmFsdWUgKGNvbW5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wdGFyZykKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQJUY6IHN0cmFuZ2UgaGV4IGluZm8gZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iLCBvcHRhcmcpOwotICAgIH0KLX0KLQotCi0KLXN0YXRpYyBpbnQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICB3YW50ZXJyb3IgPSBvcHRlcnI7Ci0KLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi0iLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfRklMRToKLSAgICAgIGxpbmtfaW5mby5iYXNlX2ZpbGUgPSAoUFRSKSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XQik7Ci0gICAgICBpZiAobGlua19pbmZvLmJhc2VfZmlsZSA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIiwKLQkJICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBQRSBvcHRpb25zICovCi0gICAgY2FzZSBPUFRJT05fSEVBUDogCi0gICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsICJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1RBQ0s6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VCU1lTVEVNOgotICAgICAgc2V0X3BlX3N1YnN5c3RlbSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfb3NfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9GSUxFX0FMSUdOTUVOVDoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fZmlsZV9hbGlnbm1lbnRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX3NlY3Rpb25fYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RMTDoKLSAgICAgIHNldF9wZV9uYW1lICgiX19kbGxfXyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9faW1hZ2VfYmFzZV9fIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotDAotLyogQXNzaWduIHZhbHVlcyB0byB0aGUgc3BlY2lhbCBzeW1ib2xzIGJlZm9yZSB0aGUgbGlua2VyIHNjcmlwdCBpcwotICAgcmVhZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMoKQotewotICAvKiBSdW4gdGhyb3VnaCBhbmQgaW52ZW50IHN5bWJvbHMgZm9yIGFsbCB0aGUKLSAgICAgbmFtZXMgYW5kIGluc2VydCB0aGUgZGVmYXVsdHMuICovCi0gIGludCBqOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnNhdmU7Ci0KLSAgaWYgKCFpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkKQotICAgIHsKLSAgICAgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlIGlmIChpbml0W0RMTE9GRl0udmFsdWUpCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gQkVPU19ETExfSU1BR0VfQkFTRTsKLSAgICAgIGVsc2UKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBCRU9TX0VYRV9JTUFHRV9CQVNFOwotICAgIH0KLQotICAvKiBEb24ndCBkbyBhbnkgc3ltYm9sIGFzc2lnbm1lbnRzIGlmIHRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICAvKiBHbHVlIHRoZSBhc3NpZ25tZW50cyBpbnRvIHRoZSBhYnMgc2VjdGlvbiAqLwotICBzYXZlID0gc3RhdF9wdHI7Ci0KLSAgc3RhdF9wdHIgPSAmKGFic19vdXRwdXRfc2VjdGlvbi0+Y2hpbGRyZW4pOwotCi0gIGZvciAoaiA9IDA7IGluaXRbal0ucHRyOyBqKyspCi0gICAgewotICAgICAgbG9uZyB2YWwgPSBpbml0W2pdLnZhbHVlOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScgLGluaXRbal0uc3ltYm9sLCBleHBfaW50b3AgKHZhbCkpKTsKLSAgICAgIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKHNob3J0KSkKLQkqKHNob3J0ICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGludCkpCi0JKihpbnQgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YobG9uZykpCi0JKihsb25nICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICAvKiBUaGlzIG1pZ2h0IGJlIGEgbG9uZyBsb25nIG9yIG90aGVyIHNwZWNpYWwgdHlwZS4gICovCi0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGJmZF92bWEpKQotCSooYmZkX3ZtYSAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZQlhYm9ydCgpOwotICAgIH0KLSAgLyogUmVzdG9yZSB0aGUgcG9pbnRlci4gKi8KLSAgc3RhdF9wdHIgPSBzYXZlOwotICAKLSAgaWYgKHBlLkZpbGVBbGlnbm1lbnQgPgotICAgICAgcGUuU2VjdGlvbkFsaWdubWVudCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4oKQotewotICAvKiBQYXNzIHRoZSB3YWNreSBQRSBjb21tYW5kIGxpbmUgb3B0aW9ucyBpbnRvIHRoZSBvdXRwdXQgYmZkLgotICAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgYSBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYnkKLSAgICAgaW5jbHVkaW5nIGFuIGludGVybmFsIEJGRCBoZWFkZXIuICAqLwotICBpZiAoIWNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpCi0gICAgewotICAgICAgZWluZm8gKCIlRiVQOiBQRSBvcGVyYXRpb25zIG9uIG5vbiBQRSBmaWxlLlxuIik7Ci0gICAgfQotCi0gIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkciA9IHBlOwotICBwZV9kYXRhKG91dHB1dF9iZmQpLT5kbGwgPSBpbml0W0RMTE9GRl0udmFsdWU7Ci0KLX0KLQwKLS8qIENhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgcXNvcnQgaW4gc29ydF9zZWN0aW9ucy4gKi8KLQotc3RhdGljIGludAotc29ydF9ieV9maWxlX25hbWUgKGEsIGIpCi0gICAgIHZvaWQgKmE7Ci0gICAgIHZvaWQgKmI7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYSA9IGE7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYiA9IGI7Ci0gIGludCBpLCBhX3NlYywgYl9zZWM7Ci0KLSAgaSA9IHN0cmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lLAotCSAgICAgICgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLT5teV9hcmNoaXZlLT5maWxlbmFtZSk7Ci0gIGlmIChpICE9IDApCi0gICAgcmV0dXJuIGk7Ci0KLSAgaSA9IHN0cmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPmZpbGVuYW1lLAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPmZpbGVuYW1lKTsKLSAgaWYgKGkgIT0gMCkKLSAgICByZXR1cm4gaTsKLSAgLyogdGhlIHRhaWwgaWRhdGE0LzUgYXJlIHRoZSBvbmx5IG9uZXMgd2l0aG91dCByZWxvY3MgdG8gYW4KLSAgICAgaWRhdGEkNiBzZWN0aW9uIHVubGVzcyB3ZSBhcmUgaW1wb3J0aW5nIGJ5IG9yZGluYWwsIAotICAgICBzbyBzb3J0IHRoZW0gdG8gbGFzdCB0byB0ZXJtaW5hdGUgdGhlIElBVAotICAgICBhbmQgSE5UIHByb3Blcmx5LiBpZiBubyByZWxvYyB0aGlzIG9uZSBpcyBpbXBvcnQgYnkgb3JkaW5hbAotICAgICBzbyB3ZSBoYXZlIHRvIHNvcnQgYnkgc2VjdGlvbiBjb250ZW50cyAqLwotCi0gIGlmICggKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ICsgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQpICkKLSAgICB7Ci0gICAgICAgaSA9ICAoKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ID4gCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCkgPyAtMSA6IDApOwotICAgICAgIGlmICggaSAhPSAwKQotICAgICAgICAgcmV0dXJuIGk7Ci0KLSAgICAgICAgcmV0dXJuICAoKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ID4gCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCkgPyAwIDogMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgIGlmICggKHN0cmNtcCggKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQ2IikgPT0gMCkgKQotICAgICAgICAgIHJldHVybiAwOyAvKiBkb24ndCBzb3J0IC5pZGF0YSQ2IG9yIC5pZGF0YSQ3IEZJWE1FIGRsbHRvb2wgZWxpbWluYXRlIC5pZGF0YSQ3ICovCi0KLSAgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLCAKLSAgICAgICAgICgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24sICZhX3NlYywgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSlzaXplb2YoYV9zZWMpKSkKLSAgICAgICAgICAgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5pZGF0YTogJUVcbiIsCi0gICAgICAgICAgICAgICAgICgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkKTsKLQotICAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQsIAotICAgICAgICAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLCAmYl9zZWMsIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpc2l6ZW9mKGJfc2VjKSApKQotICAgICAgICAgICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuaWRhdGE6ICVFXG4iLAotICAgICAgICAgICAgICAgICgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkKTsKLQotICAgICAgaSA9ICAoKGFfc2VjIDwgYl9zZWMpID8gLTEgOiAwKTsKLSAgICAgIGlmICggaSAhPSAwKQotICAgICAgICByZXR1cm4gaTsKLSAgICAgIHJldHVybiAgKChhX3NlYyA8IGJfc2VjKSA/IDAgOiAxKTsKLSAgIH0KLXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zb3J0X2J5X3NlY3Rpb25fbmFtZSAoYSwgYikKLSAgICAgdm9pZCAqYTsKLSAgICAgdm9pZCAqYjsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJhID0gYTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJiID0gYjsKLSAgaW50IGk7Ci0gIGkgPSBzdHJjbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lKTsKLS8qIHRoaXMgaXMgYSBoYWNrIHRvIG1ha2UgLnN0YWIgYW5kIC5zdGFic3RyIGxhc3QsIHNvIHdlIGRvbid0IGhhdmUKLSAgIHRvIGZpeCBzdHJpcC9vYmpjb3B5IGZvciAucmVsb2Mgc2VjdGlvbnMuCi0gICBGSVhNRSBzdHJpcHBpbmcgaW1hZ2VzIHdpdGggYSAucnNyYyBzZWN0aW9uIHN0aWxsIG5lZWRzIHRvIGJlIGZpeGVkICovCi0gIGlmICggaSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoc3RybmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICAgICAgICAgJiYgKHN0cm5jbXAgKCgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsICIuc3RhYiIsIDUpICE9IDApKQotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0gIHJldHVybiBpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIHNvcnRfc2VjdGlvbnMgdG8gYSBjb250aWd1b3VzIHN1YnNldCBvZiBhIGxpc3Qgb2Ygc2VjdGlvbnMuCi0gICBORVhUX0FGVEVSIGlzIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IG9uZSB0byBzb3J0LgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgZWxlbWVudCdzICJuZXh0IiBwb2ludGVyLiAgKi8KLQotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKioKLXNvcnRfc2VjdGlvbnNfMSAoc3RhcnRwdHIsIG5leHRfYWZ0ZXIsIGNvdW50LCBzb3J0X2Z1bmMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipzdGFydHB0ciwqbmV4dF9hZnRlcjsKLSAgICAgaW50IGNvdW50OwotICAgICBpbnQgKCpzb3J0X2Z1bmMpICgpOwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqdmVjOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpwOwotICBpbnQgaTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJldDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gc3RhcnRwdHI7Ci0KLSAgdmVjID0gKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqKQotCSB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSkpOwotCi0gIGZvciAocCA9ICpzdGFydHB0ciwgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwID0gcC0+bmV4dCkKLSAgICB2ZWNbaV0gPSBwOwotCi0gIHFzb3J0ICh2ZWMsIGNvdW50LCBzaXplb2YgKHZlY1swXSksIHNvcnRfZnVuYyk7Ci0KLSAgLyogRmlsbCBpbiB0aGUgbmV4dCBwb2ludGVycyBhZ2Fpbi4gKi8KLSAgKnN0YXJ0cHRyID0gdmVjWzBdOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspCi0gICAgdmVjW2ldLT5oZWFkZXIubmV4dCA9IHZlY1tpICsgMV07Ci0gIHZlY1tpXS0+aGVhZGVyLm5leHQgPSBuZXh0X2FmdGVyOwotICByZXQgPSAmdmVjW2ldLT5oZWFkZXIubmV4dDsKLSAgZnJlZSAodmVjKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU29ydCB0aGUgLmlkYXRhXCRmb28gaW5wdXQgc2VjdGlvbnMgb2YgYXJjaGl2ZXMgaW50byBmaWxlbmFtZSBvcmRlci4KLSAgIFRoZSByZWFzb24gaXMgc28gZGxsdG9vbCBjYW4gYXJyYW5nZSB0byBoYXZlIHRoZSBwZSBkbGwgaW1wb3J0IGluZm9ybWF0aW9uCi0gICBnZW5lcmF0ZWQgY29ycmVjdGx5IC0gdGhlIGhlYWQgb2YgdGhlIGxpc3QgZ29lcyBpbnRvIGRoLm8sIHRoZSB0YWlsIGludG8KLSAgIGR0Lm8sIGFuZCB0aGUgZ3V0cyBpbnRvIGRzW25ubm5dLm8uICBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlCi0gICAuaWRhdGEgc2VjdGlvbi4KLSAgIEZJWE1FOiBUaGlzIG1heSBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4gIEluc3RlYWQgb2YKLSAgIHNvcnRpbmcgb24gZGgubywgZHNbbm5ubl0ubywgZHQubywgb25lIGNvdWxkLCBmb3IgZXhhbXBsZSwgaGF2ZSBkaC5vIHVzZQotICAgLmlkYXRhXCQ0aCwgaGF2ZSBkc1tubm5uXS5vIHVzZSAuaWRhdGFcJDRzW25ubm5dLCBhbmQgaGF2ZSBkdC5vIHVzZSAuaWRhdGFcJDR0LgotICAgVGhpcyB3b3VsZCBoYXZlIHRvIGJlIGVsYWJvcmF0ZWQgdXBvbiB0byBoYW5kbGUgbXVsdGlwbGUgZGxsJ3MKLSAgIFthc3N1bWluZyBzdWNoIGFuIGVsb2JvcmF0aW9uIGlzIHBvc3NpYmxlIG9mIGNvdXJzZV0uCi0KLSAgIFdlIGFsc28gc29ydCBzZWN0aW9ucyBpbiAnXCQnIHdpbGQgc3RhdGVtZW50cy4gIFRoZXNlIGFyZSBjcmVhdGVkIGJ5IHRoZQotICAgcGxhY2Vfb3JwaGFucyByb3V0aW5lIHRvIGltcGxlbWVudCBncm91cGVkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvcnRfc2VjdGlvbnMgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGZvciAoOyBzIDsgcyA9IHMtPm5leHQpCi0gICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQlzb3J0X3NlY3Rpb25zIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQl7Ci0JICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcCA9ICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkOwotCi0JICAvKiBJcyB0aGlzIHRoZSAuaWRhdGEgc2VjdGlvbj8gICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lICE9IE5VTEwKLQkgICAgICAmJiBzdHJuY21wIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsICIuaWRhdGEiLCA2KSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU29ydCB0aGUgY2hpbGRyZW4uICBXZSB3YW50IHRvIHNvcnQgYW55IG9iamVjdHMgaW4KLSAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXJjaGl2ZS4gIEluIG9yZGVyIHRvIGhhbmRsZSB0aGUgY2FzZSBvZgotICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgYSBzaW5nbGUgYXJjaGl2ZSBtdWx0aXBsZSB0aW1lcywgd2Ugc29ydAotICAgICAgICAgICAgICAgICBhbGwgdGhlIGNoaWxkcmVuIGJ5IGFyY2hpdmUgbmFtZSBhbmQgdGhlbiBieSBvYmplY3QKLSAgICAgICAgICAgICAgICAgbmFtZS4gIEFmdGVyIHNvcnRpbmcgdGhlbSwgd2UgcmUtdGhyZWFkIHRoZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgIGNoYWluLiAgKi8KLQotCSAgICAgIHdoaWxlICgqcCkKLQkJewotCQkgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXJ0ID0gKnA7Ci0JCSAgaWYgKHN0YXJ0LT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCQkgICAgICB8fCAhc3RhcnQtPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQtPm15X2FyY2hpdmUpCi0JCSAgICBwID0gJihzdGFydC0+aGVhZGVyLm5leHQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqZW5kOwotCQkgICAgICBpbnQgY291bnQ7Ci0KLQkJICAgICAgZm9yIChlbmQgPSBzdGFydCwgY291bnQgPSAwOwotCQkJICAgZW5kICYmIGVuZC0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW07Ci0JCQkgICBlbmQgPSBlbmQtPm5leHQpCi0JCQljb3VudCsrOwotCi0JCSAgICAgIHAgPSBzb3J0X3NlY3Rpb25zXzEgKHAsIGVuZCwgY291bnQsIHNvcnRfYnlfZmlsZV9uYW1lKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIGdyb3VwZWQgc2VjdGlvbnMsIHNvcnQgdGhlbS4KLQkgICAgIFRoZSBsaW5rZXIgc2NyaXB0IG11c3QgZXhwbGljaXRseSBtZW50aW9uICIqKC5mb29cJCkiIG9yCi0JICAgICAiKiguZm9vXCQqKSIuICBEb24ndCBzb3J0IHRoZW0gaWYgXCQgaXMgbm90IHRoZSBsYXN0Ci0JICAgICBjaGFyYWN0ZXIgKG5vdCBzdXJlIGlmIHRoaXMgaXMgcmVhbGx5IHVzZWZ1bCwgYnV0IGl0Ci0JICAgICBhbGxvd3MgZXhwbGljaXRseSBtZW50aW9uaW5nIHNvbWUgXCQgc2VjdGlvbnMgYW5kIGxldHRpbmcKLQkgICAgIHRoZSBsaW5rZXIgaGFuZGxlIHRoZSByZXN0KS4gICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGFyICpxID0gc3RyY2hyIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsICdcJCcpOwotCi0JICAgICAgaWYgKHEgIT0gTlVMTAotCQkgICYmIChxWzFdID09ICdcMCcKLQkJICAgICAgfHwgKHFbMV0gPT0gJyonICYmIHFbMl0gPT0gJ1wwJykpKQotCQl7Ci0JCSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqZW5kOwotCQkgIGludCBjb3VudDsKLQotCQkgIGZvciAoZW5kID0gKnAsIGNvdW50ID0gMDsgZW5kOyBlbmQgPSBlbmQtPm5leHQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChlbmQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCQkJYWJvcnQgKCk7Ci0JCSAgICAgIGNvdW50Kys7Ci0JCSAgICB9Ci0JCSAgKHZvaWQpIHNvcnRfc2VjdGlvbnNfMSAocCwgZW5kLCBjb3VudCwgc29ydF9ieV9zZWN0aW9uX25hbWUpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotfQotCi1zdGF0aWMgdm9pZCAgCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24oKQotewotICBleHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzdGF0X3B0cjsKLQotI2lmZGVmIFRBUkdFVF9JU19wcGNwZQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IHRvYyBpbmZvcm1hdGlvbiAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24oaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQotCSAgewotCSAgICBlaW5mbygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIiwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uICgmbGlua19pbmZvKTsKLSNlbHNlCi0jaWZkZWYgVEFSR0VUX0lTX2FybXBlCi0gIC8qIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViCi0gICAgIHNlY3Rpb24uCi0KLSAgICAgSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlCi0gICAgIGluZm9ybWF0aW9uLiAgRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lCi0gICAgIG9wdGlvbj8gIGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFhcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKSkKLQkgIHsKLQkgICAgZWluZm8gKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOwotI2VuZGlmIC8qIFRBUkdFVF9JU19hcm1wZSAqLwotI2VuZGlmIC8qIFRBUkdFVF9JU19wcGNwZSAqLwotCi0gIHNvcnRfc2VjdGlvbnMgKHN0YXRfcHRyLT5oZWFkKTsKLX0KLQwKLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHNlY3Rpb25zIHdpdGggYSAnXCQnIGluIHRoZW0KLSAgIGludG8gdGhlIHJpZ2h0IHBsYWNlLiAgQW55IHNlY3Rpb24gd2l0aCBhICdcJCcgaW4gdGhlbSAoZS5nLiAudGV4dFwkZm9vKQotICAgZ2V0cyBtYXBwZWQgdG8gdGhlIG91dHB1dCBzZWN0aW9uIHdpdGggZXZlcnl0aGluZyBmcm9tIHRoZSAnXCQnIG9uIHN0cmlwcGVkCi0gICAoZS5nLiAudGV4dCkuCi0gICBTZWUgdGhlIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0Ci0gICBTcGVjaWZpY2F0aW9uIDQuMSwgc2VjdGlvbiA0LjIsIEdyb3VwZWQgU2VjdGlvbnMuCi0KLSAgIEZJWE1FOiBUaGlzIGlzIG5vdyBoYW5kbGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IHVzaW5nIHdpbGRjYXJkcywKLSAgIGJ1dCBJJ20gbGVhdmluZyB0aGlzIGhlcmUgaW4gY2FzZSB3ZSB3YW50IHRvIGVuYWJsZSBpdCBmb3Igc2VjdGlvbnMKLSAgIHdoaWNoIGFyZSBub3QgbWVudGlvbmVkIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgY2hhciAqb3V0cHV0X3NlY25hbWUsICpwczsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmw7Ci0KLSAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRG9uJ3QgcHJvY2VzcyBncm91cGVkIHNlY3Rpb25zIHVubGVzcyBkb2luZyBhIGZpbmFsIGxpbmsuCi0gICAgIElmIHRoZXkncmUgbWFya2VkIGFzIENPTURBVCBzZWN0aW9ucywgd2UgZG9uJ3Qgd2FudCAudGV4dFwkZm9vIHRvCi0gICAgIGVuZCB1cCBpbiAudGV4dCBhbmQgdGhlbiBoYXZlIC50ZXh0IGRpc2FwcGVhciBiZWNhdXNlIGl0J3MgbWFya2VkCi0gICAgIGxpbmstb25jZS1kaXNjYXJkLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIEV2ZXJ5dGhpbmcgZnJvbSB0aGUgJ1wkJyBvbiBnZXRzIGRlbGV0ZWQgc28gZG9uJ3QgYWxsb3cgJ1wkJyBhcyB0aGUKLSAgICAgZmlyc3QgY2hhcmFjdGVyLiAgKi8KLSAgaWYgKCpzZWNuYW1lID09ICdcJCcpCi0gICAgZWluZm8gKCIlUCVGOiBzZWN0aW9uICVzIGhhcyAnXCQnIGFzIGZpcnN0IGNoYXJhY3RlclxuIiwgc2VjbmFtZSk7Ci0gIGlmIChzdHJjaHIgKHNlY25hbWUgKyAxLCAnXCQnKSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb29rIHVwIHRoZSBvdXRwdXQgc2VjdGlvbi4gIFRoZSBNaWNyb3NvZnQgc3BlY3Mgc2F5IHNlY3Rpb25zIG5hbWVzIGluCi0gICAgIGltYWdlIGZpbGVzIG5ldmVyIGNvbnRhaW4gYSAnXCQnLiAgRm9ydHVuYXRlbHksIGxhbmdfLi4uX2xvb2t1cCBjcmVhdGVzCi0gICAgIHRoZSBzZWN0aW9uIGlmIGl0IGRvZXNuJ3QgZXhpc3QuICAqLwotICBvdXRwdXRfc2VjbmFtZSA9IGJ1eXN0cmluZyAoc2VjbmFtZSk7Ci0gIHBzID0gc3RyY2hyIChvdXRwdXRfc2VjbmFtZSArIDEsICdcJCcpOwotICAqcHMgPSAwOwotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0cHV0X3NlY25hbWUpOwotCi0gIC8qIEZpbmQgdGhlICdcJCcgd2lsZCBzdGF0ZW1lbnQgZm9yIHRoaXMgc2VjdGlvbi4gIFdlIGN1cnJlbnRseSByZXF1aXJlIHRoZQotICAgICBsaW5rZXIgc2NyaXB0IHRvIGV4cGxpY2l0bHkgbWVudGlvbiAiKiguZm9vXCQpIi4KLSAgICAgRklYTUU6IHBwY3BlLnNjIGhhcyAuQ1JUXCRmb28gaW4gdGhlIC5yZGF0YSBzZWN0aW9uLiAgQWNjb3JkaW5nIHRvIHRoZQotICAgICBNaWNyb3NvZnQgZG9jcyB0aGlzIGlzbid0IGNvcnJlY3Qgc28gaXQncyBub3QgKGN1cnJlbnRseSkgaGFuZGxlZC4gICovCi0KLSAgcHNbMF0gPSAnXCQnOwotICBwc1sxXSA9IDA7Ci0gIGZvciAobCA9IG9zLT5jaGlsZHJlbi5oZWFkOyBsOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobC0+aGVhZGVyLnR5cGUgPT0gbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtCi0JICAmJiBzdHJjbXAgKGwtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgb3V0cHV0X3NlY25hbWUpID09IDApCi0JYnJlYWs7Ci0gICAgfQotICBwc1swXSA9IDA7Ci0gIGlmIChsID09IE5VTEwpCi0jaWYgMQotICAgIGVpbmZvICgiJVAlRjogKiglc1wkKSBtaXNzaW5nIGZyb20gbGlua2VyIHNjcmlwdFxuIiwgb3V0cHV0X3NlY25hbWUpOwotI2Vsc2UgLyogRklYTUU6IFRoaXMgYmxvY2sgaXMgdW50cmllZC4gIEl0IGV4aXN0cyB0byBjb252ZXkgdGhlIGludGVudCwKLQkgc2hvdWxkIG9uZSBkZWNpZGUgdG8gbm90IHJlcXVpcmUgKiguZm9vXCQpIHRvIGFwcGVhciBpbiB0aGUgbGlua2VyCi0JIHNjcmlwdC4gICovCi0gICAgewotICAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJCQkJCSZvcy0+Y2hpbGRyZW4pOwotICAgICAgbmV3LT5zZWN0aW9uX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKG91dHB1dF9zZWNuYW1lKSArIDIpOwotICAgICAgc3ByaW50ZiAobmV3LT5zZWN0aW9uX25hbWUsICIlc1wkIiwgb3V0cHV0X3NlY25hbWUpOwotICAgICAgbmV3LT5maWxlbmFtZSA9IE5VTEw7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoJm5ldy0+Y2hpbGRyZW4pOwotICAgICAgbCA9IG5ldzsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBMaW5rIHRoZSBpbnB1dCBzZWN0aW9uIGluIGFuZCB3ZSdyZSBkb25lIGZvciBub3cuCi0gICAgIFRoZSBzZWN0aW9ucyBzdGlsbCBoYXZlIHRvIGJlIHNvcnRlZCwgYnV0IHRoYXQgaGFzIHRvIHdhaXQgdW50aWwKLSAgICAgYWxsIHN1Y2ggc2VjdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSB1cy4gIFRoZSBzb3J0aW5nIGlzIGRvbmUgYnkKLSAgICAgc29ydF9zZWN0aW9ucy4gICovCi0gIHdpbGRfZG9pdCAoJmwtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi1zdGF0aWMgY2hhciAqCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzLAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2VsZjMyLmVtIGIvbGQvZW11bHRlbXBsL2VsZjMyLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTA3M2QyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDExNDkgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotIyBUaGlzIGZpbGUgaXMgbm93IG1pc25hbWVkLCBiZWNhdXNlIGl0IHN1cHBvcnRzIGJvdGggMzIgYml0IGFuZCA2NCBiaXQKLSMgRUxGIGVtdWxhdGlvbnMuCi10ZXN0IC16ICIke0VMRlNJWkV9IiAmJiBFTEZTSVpFPTMyCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qICR7RUxGU0laRX0gYml0IEVMRiBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBFTEYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfYGVjaG8gJHtBUkNIfSB8IHNlZCAtZSAncy86LiovLydgOwotICBjb25maWcuZHluYW1pY19saW5rID0gJHtEWU5BTUlDX0xJTkstdHJ1ZX07Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gYGlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbiBlY2hvIHRydWUgOyBlbHNlIGVjaG8gZmFsc2UgOyBmaWA7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCi0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gZW50cnktPmZpbGVuYW1lOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotCQkJICAgICArIHNpemVvZiAiL2xpYi5zbyIpOwotCi0gIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc28iLCBzZWFyY2gtPm5hbWUsIGZpbGVuYW1lLCBhcmNoKTsKLQotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0KLSAgLyogV2UgaGF2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgaW4gdGhlIGxpbmsuICBUaGUgRUxGCi0gICAgIGJhY2tlbmQgbGlua2VyIHdpbGwgY3JlYXRlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSAuZHluYW1pYwotICAgICBzZWN0aW9uIG5hbWluZyB0aGlzIGZpbGUuICBJZiB0aGlzIGZpbGUgaW5jbHVkZXMgYSBEVF9TT05BTUUKLSAgICAgZW50cnksIGl0IHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlIEVMRiBsaW5rZXIgd2lsbCBqdXN0IHVzZQotICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gIEZvciBhbiBhcmNoaXZlIGZvdW5kIGJ5IHNlYXJjaGluZywgbGlrZQotICAgICB0aGlzIG9uZSwgdGhlIERUX05FRURFRCBlbnRyeSBzaG91bGQgY29uc2lzdCBvZiBqdXN0IHRoZSBuYW1lIG9mCi0gICAgIHRoZSBmaWxlLCB3aXRob3V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIHVzZWQgdG8gZmluZCBpdC4gIE5vdGUKLSAgICAgdGhhdCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZSBoYXZlIGEgZHluYW1pYyBvYmplY3Q7IGFuCi0gICAgIGFyY2hpdmUgd2lsbCBuZXZlciBiZSByZWZlcmVuY2VkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LgotCi0gICAgIEZJWE1FOiBUaGlzIGFwcHJvYWNoLS11c2luZyBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZS0taXMgbm90Ci0gICAgIHZlcnkgcHJldHR5LiAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0aGluayBvZiBhbnl0aGluZyB0aGF0IGlzCi0gICAgIHByZXR0eSwgdGhvdWdoLiAgKi8KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0KQotICAgICAgJiYgKGVudHJ5LT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgY2hhciAqbmVlZGVkX25hbWU7Ci0KLSAgICAgIEFTU0VSVCAoZW50cnktPmlzX2FyY2hpdmUgJiYgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpOwotICAgICAgbmVlZGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKQotCQkJCSAgICAgICsgc3RybGVuIChhcmNoKQotCQkJCSAgICAgICsgc2l6ZW9mICJsaWIuc28iKTsKLSAgICAgIHNwcmludGYgKG5lZWRlZF9uYW1lLCAibGliJXMlcy5zbyIsIGZpbGVuYW1lLCBhcmNoKTsKLSAgICAgIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChlbnRyeS0+dGhlX2JmZCwgbmVlZGVkX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0vKiBGb3IgYSBuYXRpdmUgbGlua2VyLCBjaGVjayB0aGUgZmlsZSAvZXRjL2xkLnNvLmNvbmYgZm9yIGRpcmVjdG9yaWVzCi0gICBpbiB3aGljaCB3ZSBtYXkgZmluZCBzaGFyZWQgbGlicmFyaWVzLiAgL2V0Yy9sZC5zby5jb25mIGlzIHJlYWxseQotICAgb25seSBtZWFuaW5nZnVsIG9uIExpbnV4LCBidXQgd2UgY2hlY2sgaXQgb24gb3RoZXIgc3lzdGVtcyBhbnlob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZDsKLSAgc3RhdGljIGNoYXIgKmxkX3NvX2NvbmY7Ci0KLSAgaWYgKCEgaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgRklMRSAqZjsKLQotICAgICAgZiA9IGZvcGVuICgiL2V0Yy9sZC5zby5jb25mIiwgRk9QRU5fUlQpOwotICAgICAgaWYgKGYgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpiOwotCSAgc2l6ZV90IGxlbiwgYWxsb2M7Ci0JICBpbnQgYzsKLQotCSAgbGVuID0gMDsKLQkgIGFsbG9jID0gMTAwOwotCSAgYiA9IChjaGFyICopIHhtYWxsb2MgKGFsbG9jKTsKLQotCSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLQkgICAgewotCSAgICAgIGlmIChsZW4gKyAxID49IGFsbG9jKQotCQl7Ci0JCSAgYWxsb2MgKj0gMjsKLQkJICBiID0gKGNoYXIgKikgeHJlYWxsb2MgKGIsIGFsbG9jKTsKLQkJfQotCSAgICAgIGlmIChjICE9ICc6JwotCQkgICYmIGMgIT0gJyAnCi0JCSAgJiYgYyAhPSAnXHQnCi0JCSAgJiYgYyAhPSAnXG4nCi0JCSAgJiYgYyAhPSAnLCcpCi0JCXsKLQkJICBiW2xlbl0gPSBjOwotCQkgICsrbGVuOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSAhPSAnOicpCi0JCSAgICB7Ci0JCSAgICAgIGJbbGVuXSA9ICc6JzsKLQkJICAgICAgKytsZW47Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobGVuID4gMCAmJiBiW2xlbiAtIDFdID09ICc6JykKLQkgICAgLS1sZW47Ci0KLQkgIGlmIChsZW4gPiAwKQotCSAgICBiW2xlbl0gPSAnXDAnOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnJlZSAoYik7Ci0JICAgICAgYiA9IE5VTEw7Ci0JICAgIH0KLQotCSAgZmNsb3NlIChmKTsKLQotCSAgbGRfc29fY29uZiA9IGI7Ci0JfQotCi0gICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChsZF9zb19jb25mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsZF9zb19jb25mLCBuYW1lLCBmb3JjZSk7Ci19Ci0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZCBhbmQgc3RhdF9uZWVkZWQgYW5kIHZlcmNoZWNrLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBzdHJ1Y3Qgc3RhdCBnbG9iYWxfc3RhdDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF92ZXJjaGVja19uZWVkZWQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkOwotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKmw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgd2hlbiBkb2luZyBhIGZpbmFsIGxpbmsuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSB8fCBsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybjsKLQotICAvKiBHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXBwZWFyIGluIERUX05FRURFRCBlbnRyaWVzIGluCi0gICAgIGR5bmFtaWMgb2JqZWN0cyBpbmNsdWRlZCBpbiB0aGUgbGluayAob2Z0ZW4gdGhlcmUgd2lsbCBiZSBub25lKS4KLSAgICAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdAotICAgICB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZQotICAgICBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcKLSAgICAgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbiBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUKLSAgICAgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcwotICAgICBsb29wLiAgKi8KLSAgbmVlZGVkID0gYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsbDsKLSAgICAgIGludCBmb3JjZTsKLQotICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCi0gICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQotCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsLT5uYW1lKSA9PSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAobGwgIT0gbCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgZmlsZSB3YXMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgZXhwbGljaXRseS4gICovCi0gICAgICBnbG9iYWxfbmVlZGVkID0gbDsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IGZhbHNlOwotICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOwotICAgICAgaWYgKGdsb2JhbF9mb3VuZCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgbmVlZCB0byBmaW5kIHRoaXMgZmlsZSBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlLiAgV2UKLQkgd2FudCB0byBzZWFyY2ggZm9yIHRoZSBmaWxlIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoZSBkeW5hbWljCi0JIGxpbmtlciB3aWxsIHNlYXJjaC4gIFRoYXQgbWVhbnMgdGhhdCB3ZSB3YW50IHRvIHVzZQotCSBycGF0aF9saW5rLCBycGF0aCwgdGhlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLQkgTERfTElCUkFSWV9QQVRIIChuYXRpdmUgb25seSksIHRoZW4gdGhlIGxpbmtlciBzY3JpcHQKLQkgTElCX1NFQVJDSF9ESVJTLiAgV2UgZG8gbm90IHNlYXJjaCB1c2luZyB0aGUgLUwgYXJndW1lbnRzLgotCi0JIFdlIHNlYXJjaCB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lLCB3ZSBza2lwIG9iamVjdHMgd2hpY2ggbWF5Ci0JIGludHJvZHVjZSB2ZXJzaW9uIG1pc21hdGNoZXMuICBUaGUgc2Vjb25kIHRpbWUsIHdlIGZvcmNlCi0JIHRoZWlyIHVzZS4gIFNlZSBnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayBjb21tZW50LiAgKi8KLSAgICAgIGZvciAoZm9yY2UgPSAwOyBmb3JjZSA8IDI7IGZvcmNlKyspCi0JewotCSAgY29uc3QgY2hhciAqbGliX3BhdGg7Ci0JICBzaXplX3QgbGVuOwotCSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCi0JCQkJCQkgIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLAotCQkJCQkJICBsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotCSAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID09IE5VTEwKLQkgICAgICAmJiBjb21tYW5kX2xpbmUucnBhdGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLQkgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUsCi0JCQkJCQkgICAgICBmb3JjZSkpCi0JCWJyZWFrOwotCSAgICB9Ci1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpOwotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotRU9GCi0gIDs7Ci0gIGVzYWMKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgbGVuID0gc3RybGVuIChsLT5uYW1lKTsKLQkgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JICAgIHsKLQkgICAgICBjaGFyICpmaWxlbmFtZTsKLQotCSAgICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JCWNvbnRpbnVlOwotCSAgICAgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpICsgbGVuICsgMik7Ci0JICAgICAgc3ByaW50ZiAoZmlsZW5hbWUsICIlcy8lcyIsIHNlYXJjaC0+bmFtZSwgbC0+bmFtZSk7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGZpbGVuYW1lLCBmb3JjZSkpCi0JCWJyZWFrOwotCSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQkgICAgfQotCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCSAgICBicmVhazsKLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotRU9GCi0gIDs7Ci0gIGVzYWMKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCX0KLQotICAgICAgaWYgKGZvcmNlIDwgMikKLQljb250aW51ZTsKLQotICAgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kICh0cnkgdXNpbmcgLS1ycGF0aClcbiIsCi0JICAgICBsLT5uYW1lLCBsLT5ieSk7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggZm9yIGEgbmVlZGVkIGZpbGUgaW4gYSBwYXRoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKHBhdGgsIG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpwYXRoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHNpemVfdCBsZW47Ci0KLSAgaWYgKHBhdGggPT0gTlVMTCB8fCAqcGF0aCA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgbGVuID0gc3RybGVuIChuYW1lKTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciAqZmlsZW5hbWUsICpzc2V0OwotCi0gICAgICBzID0gc3RyY2hyIChwYXRoLCAnOicpOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlzID0gcGF0aCArIHN0cmxlbiAocGF0aCk7Ci0KLSAgICAgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocyAtIHBhdGggKyBsZW4gKyAyKTsKLSAgICAgIGlmIChzID09IHBhdGgpCi0Jc3NldCA9IGZpbGVuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAoZmlsZW5hbWUsIHBhdGgsIHMgLSBwYXRoKTsKLQkgIGZpbGVuYW1lW3MgLSBwYXRoXSA9ICcvJzsKLQkgIHNzZXQgPSBmaWxlbmFtZSArIChzIC0gcGF0aCkgKyAxOwotCX0KLSAgICAgIHN0cmNweSAoc3NldCwgbmFtZSk7Ci0KLSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChmaWxlbmFtZSwgZm9yY2UpKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmcmVlIChmaWxlbmFtZSk7Ci0KLSAgICAgIGlmICgqcyA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgcGF0aCA9IHMgKyAxOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CSAgCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHBvc3NpYmxlIG5hbWUgZm9yIGEgZHluYW1pYyBvYmplY3QKLSAgIG5hbWVkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LiAgVGhlIEZPUkNFIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlcgotICAgdG8gc2tpcCB0aGUgY2hlY2sgZm9yIGEgY29uZmxpY3RpbmcgdmVyc2lvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBiZmQgKmFiZmQ7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAobmFtZSwgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB0aGlzIG9iamVjdCB3b3VsZCBpbmNsdWRlIGFueSBjb25mbGljdGluZyBsaWJyYXJ5Ci0gICAgIHZlcnNpb25zLiAgSWYgRk9SQ0UgaXMgc2V0LCB0aGVuIHdlIHNraXAgdGhpcyBjaGVjazsgd2UgdXNlIHRoaXMKLSAgICAgdGhlIHNlY29uZCB0aW1lIGFyb3VuZCwgaWYgd2UgY291bGRuJ3QgZmluZCBhbnkgY29tcGF0aWJsZQotICAgICBpbnN0YW5jZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0gIGlmICghIGZvcmNlKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkOwotCi0gICAgICBpZiAoISBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QgKGFiZmQsICZuZWVkZWQpKQotCWVpbmZvICgiJUYlUDolQjogYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IGZhaWxlZDogJUVcbiIsIGFiZmQpOwotCi0gICAgICBpZiAobmVlZGVkICE9IE5VTEwpCi0JewotCSAgZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZCA9IG5lZWRlZDsKLQkgIGdsb2JhbF92ZXJjaGVja19mYWlsZWQgPSBmYWxzZTsKLQkgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2spOwotCSAgaWYgKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpCi0JICAgIHsKLQkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkgICAgICAvKiBSZXR1cm4gZmFsc2UgdG8gZm9yY2UgdGhlIGNhbGxlciB0byBtb3ZlIG9uIHRvIHRyeQotICAgICAgICAgICAgICAgICBhbm90aGVyIGZpbGUgb24gdGhlIHNlYXJjaCBwYXRoLiAgKi8KLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogQnV0IHdhaXQhICBJdCBnZXRzIG11Y2ggd29yc2UuICBPbiBMaW51eCwgaWYgYSBzaGFyZWQKLSAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IHVzZSBsaWJjIGF0IGFsbCwgd2UgYXJlIHN1cHBvc2VkIHRvIHNraXAKLSAgICAgICAgICAgICBpdCB0aGUgZmlyc3QgdGltZSBhcm91bmQgaW4gY2FzZSB3ZSBlbmNvdW50ZXIgYSBzaGFyZWQKLSAgICAgICAgICAgICBsaWJyYXJ5IGxhdGVyIG9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aGljaCBkb2VzIHVzZSB0aGUKLSAgICAgICAgICAgICB2ZXJzaW9uIG9mIGxpYmMgdGhhdCB3ZSB3YW50LiAgVGhpcyBpcyBtdWNoIHRvbyBob3JyaWJsZQotICAgICAgICAgICAgIHRvIHVzZSBvbiBhbnkgc3lzdGVtIG90aGVyIHRoYW4gTGludXguICAqLwotCi1FT0YKLWNhc2UgJHt0YXJnZXR9IGluCi0gICotKi1saW51eC1nbnUqKQotICAgIGNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbDsKLQotCSAgICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JICAgICAgaWYgKHN0cm5jbXAgKGwtPm5hbWUsICJsaWJjLnNvIiwgNykgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIGlmIChsID09IE5VTEwpCi0JICAgICAgewotCQkodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQotRU9GCi0gICAgOzsKLWVzYWMKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JfQotICAgIH0KLQotICAvKiBXZSd2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IG1hdGNoaW5nIHRoZSBEVF9ORUVERUQgZW50cnkuICAqLwotCi0gIC8qIFdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlcmUgaXMgbm8gb3RoZXIgaW5wdXQgZmlsZSBvZiB0aGUKLSAgICAgc2FtZSBuYW1lLiAgV2UgbXVzdCBub3cgY2hlY2sgYWdhaW4gdGhhdCB3ZSBhcmUgbm90IGluY2x1ZGluZyB0aGUKLSAgICAgc2FtZSBmaWxlIHR3aWNlLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2Ugb24gbWFueSBzeXN0ZW1zCi0gICAgIGxpYmMuc28gaXMgYSBzeW1saW5rIHRvLCBlLmcuLCBsaWJjLnNvLjEuICBUaGUgU09OQU1FIGVudHJ5IHdpbGwKLSAgICAgcmVmZXJlbmNlIGxpYmMuc28uMS4gIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBsaWJjLnNvLCB3ZQotICAgICBkb24ndCB3YW50IHRvIGluY2x1ZGUgbGliYy5zby4xIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGZpbGUsIGFuZCB3ZQotICAgICBjYW4gb25seSBjaGVjayB0aGF0IHVzaW5nIHN0YXQuICAqLwotCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJmdsb2JhbF9zdGF0KSAhPSAwKQotICAgIGVpbmZvICgiJUYlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiwgYWJmZCk7Ci0gIGdsb2JhbF9mb3VuZCA9IGZhbHNlOwotICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkKTsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICB7Ci0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIGZvdW5kIHRoZSBmaWxlLCBldmVuIHRob3VnaAotICAgICAgICAgd2UgYXJlbid0IGdvaW5nIHRvIGRvIGFueXRoaW5nIHdpdGggaXQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRlbGwgdGhlIEVMRiBiYWNrZW5kIHRoYXQgZG9uJ3Qgd2FudCB0aGUgb3V0cHV0IGZpbGUgdG8gaGF2ZSBhCi0gICAgIERUX05FRURFRCBlbnRyeSBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGFiZmQsICIiKTsKLQotICAvKiBBZGQgdGhpcyBmaWxlIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAocy0+ZmlsZW5hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzb25hbWU7Ci0KLSAgICAgIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gICAgICBpZiAoc29uYW1lICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoc29uYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQkgIAotICBpZiAocy0+c2VhcmNoX2RpcnNfZmxhZwotICAgICAgJiYgcy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpID09IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZjsKLQotICAgICAgZiA9IHN0cnJjaHIgKHMtPmZpbGVuYW1lLCAnLycpOwotICAgICAgaWYgKGYgIT0gTlVMTAotCSAgJiYgc3RyY21wIChmICsgMSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgcnVubmluZyBzdGF0IG9uCi0gICB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLSAgY29uc3QgY2hhciAqc29uYW1lOwotICBjb25zdCBjaGFyICpmOwotCi0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBpZiAoYmZkX3N0YXQgKHMtPnRoZV9iZmQsICZzdCkgIT0gMCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iLCBzLT50aGVfYmZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHN0LnN0X2RldiA9PSBnbG9iYWxfc3RhdC5zdF9kZXYKLSAgICAgICYmIHN0LnN0X2lubyA9PSBnbG9iYWxfc3RhdC5zdF9pbm8pCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogV2UgaXNzdWUgYSB3YXJuaW5nIGlmIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIGluY2x1ZGluZyB0d28KLSAgICAgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIHNoYXJlZCBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsCi0gICAgIHRoZXJlIG1heSBiZSBhIHByb2JsZW0gaWYgLWxjIHBpY2tzIHVwIGxpYmMuc28uNiBidXQgc29tZSBvdGhlcgotICAgICBzaGFyZWQgbGlicmFyeSBoYXMgYSBEVF9ORUVERUQgZW50cnkgb2YgbGliYy5zby41LiAgVGhpcyBpcyBhCi0gICAgIGh1ZXJpc3RpYyB0ZXN0LCBhbmQgaXQgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG5hbWUgbG9va3MgbGlrZQotICAgICBOQU1FLnNvLlZFUlNJT04uICBGSVhNRTogRGVwZW5kaW5nIG9uIGZpbGUgbmFtZXMgaXMgZXJyb3ItcHJvbmUuCi0gICAgIElmIHdlIHJlYWxseSB3YW50IHRvIGlzc3VlIHdhcm5pbmdzIGFib3V0IG1peGluZyB2ZXJzaW9uIG51bWJlcnMKLSAgICAgb2Ygc2hhcmVkIGxpYnJhcmllcywgd2UgbmVlZCB0byBmaW5kIGEgYmV0dGVyIHdheS4gICovCi0KLSAgaWYgKHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSAhPSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ID0gc3Ryc3RyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAiLnNvLiIpOwotICBpZiAoc3VmZml4ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggKz0gc2l6ZW9mICIuc28uIiAtIDE7Ci0KLSAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgaWYgKHNvbmFtZSA9PSBOVUxMKQotICAgIHNvbmFtZSA9IHMtPmZpbGVuYW1lOwotCi0gIGYgPSBzdHJyY2hyIChzb25hbWUsICcvJyk7Ci0gIGlmIChmICE9IE5VTEwpCi0gICAgKytmOwotICBlbHNlCi0gICAgZiA9IHNvbmFtZTsKLQotICBpZiAoc3RybmNtcCAoZiwgZ2xvYmFsX25lZWRlZC0+bmFtZSwgc3VmZml4IC0gZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBtYXkgY29uZmxpY3Qgd2l0aCAlc1xuIiwKLQkgICBnbG9iYWxfbmVlZGVkLT5uYW1lLCBnbG9iYWxfbmVlZGVkLT5ieSwgZik7Ci19Ci0KLS8qIE9uIExpbnV4LCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lCi0gICBzaGFyZWQgbGlicmFyeSBsaW5rZWQgYWdhaW5zdCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgbGliYy4gIFRoZQotICAgZHluYW1pYyBsaW5rZXIgc29tZWhvdyB0YWdzIHdoaWNoIGxpYmMgdmVyc2lvbiB0byB1c2UgaW4KLSAgIC9ldGMvbGQuc28uY2FjaGUsIGFuZCwgYmFzZWQgb24gdGhlIGxpYmMgdGhhdCBpdCBzZWVzIGluIHRoZQotICAgZXhlY3V0YWJsZSwgY2hvb3NlcyB3aGljaCB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgbGlicmFyeSB0byB1c2UuCi0KLSAgIFdlIHRyeSB0byBkbyBhIHNpbWlsYXIgY2hlY2sgaGVyZSBieSBjaGVja2luZyB3aGV0aGVyIHRoaXMgc2hhcmVkCi0gICBsaWJyYXJ5IG5lZWRzIGFueSBvdGhlciBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIG1heSBjb25mbGljdCB3aXRoCi0gICBsaWJyYXJpZXMgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgSWYgaXQgZG9lcywgd2UKLSAgIHNraXAgaXQsIGFuZCB0cnkgdG8gZmluZCBhbm90aGVyIHNoYXJlZCBsaWJyYXJ5IGZhcnRoZXIgb24gZG93biB0aGUKLSAgIGxpbmsgcGF0aC4KLQotICAgVGhpcyBpcyBjYWxsZWQgdmlhIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZS4KLSAgIEdMT0JBTF9WRVJDSEVDS19ORUVERUQgaXMgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBuZWVkZWQgYnkgdGhlIG9iamVjdAotICAgd2hpY2ggd2UgYXIgY2hlY2tpbmcuICBUaGlzIHNldHMgR0xPQkFMX1ZFUkNIRUNLX0ZBSUxFRCBpZiB3ZSBmaW5kCi0gICBhIGNvbmZsaWN0aW5nIHZlcnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZSwgKmY7Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbDsKLQotICBpZiAoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwKLSAgICAgIHx8IChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKHMtPnRoZV9iZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgaWYgKHNvbmFtZSA9PSBOVUxMKQotICAgIHNvbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKHMtPnRoZV9iZmQpOwotCi0gIGYgPSBzdHJyY2hyIChzb25hbWUsICcvJyk7Ci0gIGlmIChmICE9IE5VTEwpCi0gICAgKytmOwotICBlbHNlCi0gICAgZiA9IHNvbmFtZTsKLQotICBmb3IgKGwgPSBnbG9iYWxfdmVyY2hlY2tfbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLQotICAgICAgaWYgKHN0cmNtcCAoZiwgbC0+bmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBQcm9iYWJseSBjYW4ndCBoYXBwZW4sIGJ1dCBpdCdzIGFuIGVhc3kgY2hlY2suICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyY2hyIChsLT5uYW1lLCAnLycpICE9IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN1ZmZpeCA9IHN0cnN0ciAobC0+bmFtZSwgIi5zby4iKTsKLSAgICAgIGlmIChzdWZmaXggPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gICAgICBpZiAoc3RybmNtcCAoZiwgbC0+bmFtZSwgc3VmZml4IC0gbC0+bmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBIZXJlIHdlIGtub3cgdGhhdCBTIGlzIGEgZHluYW1pYyBvYmplY3QgRk9PLlNPLlZFUjEsIGFuZAotICAgICAgICAgICAgIHRoZSBvYmplY3Qgd2UgYXJlIGNvbnNpZGVyaW5nIG5lZWRzIGEgZHluYW1pYyBvYmplY3QKLSAgICAgICAgICAgICBGT08uU08uVkVSMiwgYW5kIFZFUjEgYW5kIFZFUjIgYXJlIGRpZmZlcmVudC4gIFRoaXMKLSAgICAgICAgICAgICBhcHBlYXJzIHRvIGJlIGEgdmVyc2lvbiBtaXNtYXRjaCwgc28gd2UgdGVsbCB0aGUgY2FsbGVyCi0gICAgICAgICAgICAgdG8gdHJ5IGEgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5LiAgKi8KLQkgIGdsb2JhbF92ZXJjaGVja19mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgY29uc3QgY2hhciAqcnBhdGg7Ci0gIGFzZWN0aW9uICpzaW50ZXJwOwotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFueSB2YXJpYWJsZSBhc3NpZ25tZW50cywgd2UgbmVlZCB0byBsZXQKLSAgICAgdGhlIEVMRiBiYWNrZW5kIGtub3cgYWJvdXQgdGhlbSBpbiBjYXNlIHRoZSB2YXJpYWJsZXMgYXJlCi0gICAgIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIEVMRiBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQKLSAgICAgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgcnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0gIGlmIChycGF0aCA9PSBOVUxMKQotICAgIHJwYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3NpemVfZHluYW1pY19zZWN0aW9ucwotICAgICAgICAgKG91dHB1dF9iZmQsIGNvbW1hbmRfbGluZS5zb25hbWUsIHJwYXRoLAotCSAgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljLCBjb21tYW5kX2xpbmUuZmlsdGVyX3NobGliLAotCSAgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMsCi0JICAmbGlua19pbmZvLCAmc2ludGVycCwgbGFuZ19lbGZfdmVyc2lvbl9pbmZvKSkpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotCi0gIC8qIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgZHluYW1pYyBsaW5rZXIgd2UgYXJlIHVzaW5nLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlciAhPSBOVUxMCi0gICAgICAmJiBzaW50ZXJwICE9IE5VTEwpCi0gICAgewotICAgICAgc2ludGVycC0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgY29tbWFuZF9saW5lLmludGVycHJldGVyOwotICAgICAgc2ludGVycC0+X3Jhd19zaXplID0gc3RybGVuIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIpICsgMTsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgYW55IHNlY3Rpb25zIG5hbWVkIC5nbnUud2FybmluZy4gIEFzIGEgR05VIGV4dGVuc2lvbnMsCi0gICAgIHdlIHRyZWF0IHN1Y2ggc2VjdGlvbnMgYXMgY29udGFpbmluZyB3YXJuaW5nIG1lc3NhZ2VzLiAgV2UgcHJpbnQKLSAgICAgb3V0IHRoZSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHplcm8gb3V0IHRoZSBzZWN0aW9uIHNpemUgc28KLSAgICAgdGhhdCBpdCBkb2VzIG5vdCBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWFzZWN0aW9uICpzOwotCWJmZF9zaXplX3R5cGUgc3o7Ci0JY2hhciAqbXNnOwotCWJvb2xlYW4gcmV0OwotCi0JaWYgKGlzLT5qdXN0X3N5bXNfZmxhZykKLQkgIGNvbnRpbnVlOwotCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpcy0+dGhlX2JmZCwgIi5nbnUud2FybmluZyIpOwotCWlmIChzID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCXN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoaXMtPnRoZV9iZmQsIHMpOwotCW1zZyA9IHhtYWxsb2MgKChzaXplX3QpIHN6ICsgMSk7Ci0JaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpcy0+dGhlX2JmZCwgcywgbXNnLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQkgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5nbnUud2FybmluZzogJUVcbiIsCi0JCSBpcy0+dGhlX2JmZCk7Ci0JbXNnW3N6XSA9ICdcMCc7Ci0JcmV0ID0gbGlua19pbmZvLmNhbGxiYWNrcy0+d2FybmluZyAoJmxpbmtfaW5mbywgbXNnLAotCQkJCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJICAgIGlzLT50aGVfYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJICAgIChiZmRfdm1hKSAwKTsKLQlBU1NFUlQgKHJldCk7Ci0JZnJlZSAobXNnKTsKLQotCS8qIENsb2JiZXIgdGhlIHNlY3Rpb24gc2l6ZSwgc28gdGhhdCB3ZSBkb24ndCB3YXN0ZSBjb3B5aW5nIHRoZQotCSAgIHdhcm5pbmcgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICB9Ci0gIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvY2F0ZXMgYW55IGFzc2lnbm1lbnQgc3RhdGVtZW50cywgYW5kCi0gICB0ZWxscyB0aGUgRUxGIGJhY2tlbmQgYWJvdXQgdGhlbSwgaW4gY2FzZSB0aGV5IGFyZSBhc3NpZ25tZW50cyB0bwotICAgc3ltYm9scyB3aGljaCBhcmUgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWJyZWFrOwotCi0gICAgICAvKiBXZSBjYWxsIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQgZXZlbiBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQuCi0JIFRoaXMgaXMgYmVjYXVzZSBpZiBpdCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIHdlCi0JIGFjdHVhbGx5IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LAotCSBub3QgdGhlIHZhbHVlIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IChiZWNhdXNlIHdlIGFyZSBzZXR0aW5nCi0JIHN5bWJvbHMgbGlrZSBldGV4dCkuICBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyCi0JIG9iamVjdCwgdGhlbiwgYXMgaXQgaGFwcGVucywgY2FsbGluZyByZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JIHdpbGwgZG8gbm8gaGFybS4gICovCi0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISAoYmZkX2VsZiR7RUxGU0laRX1fcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCQkgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGV4cC0+YXNzaWduLmRzdCwKLQkJICBleHAtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlID8gdHJ1ZSA6IGZhbHNlKSkpCi0JICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvICVzOiAlRVxuIiwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHJhbmRvbSBTSEZfQUxMT0MKLSAgIHNlY3Rpb25zIGluIHRoZSByaWdodCBzZWdtZW50LiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICpob2xkX3NlY3Rpb247Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF91c2U7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF90ZXh0Owotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcm9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2JzczsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JlbDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2ludGVycDsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcGxhY2U7Ci0gIGFzZWN0aW9uICpzbmV3LCAqKnBwczsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpvbGQ7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gIGV0cmVlX3R5cGUgKmFkZHJlc3M7Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWUsICpwczsKLSAgY29uc3QgY2hhciAqb3V0c2VjbmFtZTsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzY3JpcHQgdG8gc2VlIHdoZXJlIHRvIHBsYWNlIHRoaXMgc2VjdGlvbi4gICovCi0gIGhvbGRfc2VjdGlvbiA9IHM7Ci0gIGhvbGRfdXNlID0gTlVMTDsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOwotCi0gIGlmIChob2xkX3VzZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBwbGFjZWQgYSBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdXNlLT5jaGlsZHJlbiwgcywgaG9sZF91c2UsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCB0aGVuIGFsd2F5cyBwdXQgLmdudS53YXJuaW5nLlNZTUJPTAotICAgICBzZWN0aW9ucyBpbnRvIHRoZSAudGV4dCBzZWN0aW9uIHRvIGdldCB0aGVtIG91dCBvZiB0aGUgd2F5LiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnNoYXJlZAotICAgICAgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSA9PSAwCi0gICAgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB3aWxkX2RvaXQgKCZob2xkX3RleHQtPmNoaWxkcmVuLCBzLCBob2xkX3RleHQsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIERlY2lkZSB3aGljaCBzZWdtZW50IHRoZSBzZWN0aW9uIHNob3VsZCBnbyBpbiBiYXNlZCBvbiB0aGUKLSAgICAgc2VjdGlvbiBuYW1lIGFuZCBzZWN0aW9uIGZsYWdzLiAgV2UgcHV0IGxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zCi0gICAgIHJpZ2h0IGFmdGVyIHRoZSAuaW50ZXJwIHNlY3Rpb24sIHNvIHRoYXQgdGhlIFBUX05PVEUgc2VnbWVudCBpcwotICAgICBzdG9yZWQgcmlnaHQgYWZ0ZXIgdGhlIHByb2dyYW0gaGVhZGVycyB3aGVyZSB0aGUgT1MgY2FuIHJlYWQgaXQKLSAgICAgaW4gdGhlIGZpcnN0IHBhZ2UuICAqLwotICBwbGFjZSA9IE5VTEw7Ci0gIGlmIChzLT5mbGFncyAmIFNFQ19FWENMVURFKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIubm90ZSIsIDQpID09IDAKLSAgICAgICYmIGhvbGRfaW50ZXJwICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2ludGVycDsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2JzczsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwCi0JICAgJiYgaG9sZF9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2RhdGE7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKHNlY25hbWUsICIucmVsIiwgNCkgPT0gMAotCSAgICYmIGhvbGRfcmVsICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JlbDsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0NPREUpID09IDAKLQkgICAmJiAocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3JvZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yb2RhdGE7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF90ZXh0OwotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ2hvb3NlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBzZWN0aW9uLiAgVGhpcyB3aWxsIGJlIG5lZWRlZCBpZiB0aGUKLSAgICAgc2FtZSBzZWN0aW9uIG5hbWUgYXBwZWFycyBpbiB0aGUgaW5wdXQgZmlsZSB3aXRoIGRpZmZlcmVudAotICAgICBsb2FkYWJsZSBvciBhbGxvY2F0ZWFibGUgY2hhcmFjdGVyaXN0aWNzLiAgKi8KLSAgb3V0c2VjbmFtZSA9IHNlY25hbWU7Ci0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgY2hhciAqbmV3bmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKG91dHNlY25hbWUpOwotICAgICAgbmV3bmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBvdXRzZWNuYW1lKTsKLSAgICAgIGkgPSAwOwotICAgICAgZG8KLQl7Ci0JICBzcHJpbnRmIChuZXduYW1lICsgbGVuLCAiJWQiLCBpKTsKLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5ld25hbWUpICE9IE5VTEwpOwotCi0gICAgICBvdXRzZWNuYW1lID0gbmV3bmFtZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHB1dCBpdCBpbiB0aGUgcmlnaHQKLSAgICAgcGxhY2UuICBUaGlzIHNodWZmbGluZyBpcyB0byBtYWtlIHRoZSBvdXRwdXQgZmlsZSBsb29rIG5lYXRlci4gICovCi0gIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKTsKLSAgaWYgKHNuZXcgPT0gTlVMTCkKLSAgICAgIGVpbmZvICgiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iLAotCSAgICAgb3V0cHV0X2JmZC0+eHZlYy0+bmFtZSwgb3V0c2VjbmFtZSk7Ci0gIGlmIChwbGFjZS0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKHBwcyA9ICZvdXRwdXRfYmZkLT5zZWN0aW9uczsgKnBwcyAhPSBzbmV3OyBwcHMgPSAmKCpwcHMpLT5uZXh0KQotCTsKLSAgICAgICpwcHMgPSBzbmV3LT5uZXh0OwotICAgICAgc25ldy0+bmV4dCA9IHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dDsKLSAgICAgIHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dCA9IHNuZXc7Ci0gICAgfQotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBvbGQgPSBzdGF0X3B0cjsKLSAgc3RhdF9wdHIgPSAmYWRkOwotICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gIC8qIElmIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIGlzIHJlcHJlc2VudGFibGUgaW4gQywgdGhlbiBjcmVhdGUKLSAgICAgc3ltYm9scyB0byBtYXJrIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGZvciAocHMgPSBvdXRzZWNuYW1lOyAqcHMgIT0gJ1wwJzsgcHMrKykKLSAgICBpZiAoISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnBzKSAmJiAqcHMgIT0gJ18nKQotICAgICAgYnJlYWs7Ci0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIG91dHNlY25hbWUgKyBzaXplb2YgIl9fc3RhcnRfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdGFydF8lcyIsIG91dHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkJCQlleHBfaW50b3AgKChiZmRfdm1hKSAxCi0JCQkJCQkJICAgPDwgcy0+YWxpZ25tZW50X3Bvd2VyKSkpKTsKLSAgICB9Ci0KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICBhZGRyZXNzID0gTlVMTDsKLSAgZWxzZQotICAgIGFkZHJlc3MgPSBleHBfaW50b3AgKChiZmRfdm1hKSAwKTsKLQotICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAob3V0c2VjbmFtZSwgYWRkcmVzcywgMCwKLQkJCQkgICAgICAgKGJmZF92bWEpIDAsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwpOwotCi0gIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChvdXRzZWNuYW1lKTsKLSAgd2lsZF9kb2l0ICgmb3MtPmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0KLSAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgICAoKGJmZF92bWEpIDAsICIqZGVmYXVsdCoiLCAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopIE5VTEwpOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0KLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gb3V0c2VjbmFtZSArIHNpemVvZiAiX19zdG9wXyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RvcF8lcyIsIG91dHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlIG5ldyBzdGF0ZW1lbnQgbGlzdCByaWdodCBhZnRlciBQTEFDRS4gICovCi0gICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLSAgcGxhY2UtPmhlYWRlci5uZXh0ID0gYWRkLmhlYWQ7Ci0KLSAgc3RhdF9wdHIgPSBvbGQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb24tPm5hbWUpID09IDAKLSAgICAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiAoKGhvbGRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotCSAgPT0gKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKSkpCi0gICAgaG9sZF91c2UgPSBvczsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICBob2xkX3RleHQgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5yb2RhdGEiKSA9PSAwKQotICAgIGhvbGRfcm9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotICBlbHNlIGlmIChob2xkX3JlbCA9PSBOVUxMCi0JICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLQkgICAmJiAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICYmIHN0cm5jbXAgKG9zLT5uYW1lLCAiLnJlbCIsIDQpID09IDApCi0gICAgaG9sZF9yZWwgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5pbnRlcnAiKSA9PSAwKQotICAgIGhvbGRfaW50ZXJwID0gb3M7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKLUVPRgotCi1pZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIiA7IHRoZW4KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0gIGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzYDsKLUVPRgotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgZWxzZQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKLX0KLUVPRgotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHMiOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0gYi9sZC9lbXVsdGVtcGwvZ2VuZXJpYy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwYzhlYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2VuZXJpYy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gYi9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjk5OGZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjAuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIAotICogZW11bGF0ZSB0aGUgSW50ZWxzIHBvcnQgb2YgIGdsZAotICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLSNpZmRlZiBHTlU5NjAKLQotc3RhdGljIHZvaWQKLWdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsCi0JCQkJICAgICAgICIvbGliL2xpYmJvdXQiLAotCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi1zdGF0aWMgdm9pZCBnbGQ5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgY2hhciAqZW52IDsKLSAgZW52ID0gIGdldGVudigiRzk2MExJQiIpOwotICBpZiAoZW52KSB7Ci0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoZW52LCBmYWxzZSk7Ci0gIH0KLSAgZW52ID0gZ2V0ZW52KCJHOTYwQkFTRSIpOwotICBpZiAoZW52KQotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwgIi9saWIiLCAoY29uc3QgY2hhciAqKSBOVUxMKSwgZmFsc2UpOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIGJmZF9zZXRfYXJjaF9tYWNoKG91dHB1dF9iZmQsIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBiZmRfbWFjaF9pOTYwX2NvcmUpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfY2hvb3NlX3RhcmdldCgpCi17Ci0jaWZkZWYgR05VOTYwCi0KLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLSAgcmV0dXJuIGJmZF9tYWtlX3RhcmdfbmFtZShCRkRfQk9VVF9GT1JNQVQsIDApOwotCi0jZWxzZQotCi0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudihUQVJHRVRfRU5WSVJPTik7Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7Ci0KLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLQotICByZXR1cm4gImIub3V0LmxpdHRsZSI7Ci0KLSNlbmRpZgotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSdzL1siXFxdL1xcJi9nCi1zLyQvXFxuXFwvCi0xcy9eLyIvCi0kcy8kL24iLwotJwotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dWA7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHJgOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym5gOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG5gOwotICBlbHNlCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhgOwotfQotRU9GCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfZ2xkOTYwX2VtdWxhdGlvbiA9IAotewotICBnbGQ5NjBfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfc2V0X291dHB1dF9hcmNoLAotICBnbGQ5NjBfY2hvb3NlX3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkOTYwX2dldF9zY3JpcHQsCi0gICI5NjAiLAotICAiIgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dsZDk2MGMuZW0gYi9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjYjVlZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIAotICogZW11bGF0ZSB0aGUgSW50ZWxzIHBvcnQgb2YgIGdsZAotICovCi0KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotI2lmZGVmIEdOVTk2MAotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIHN0YXRpYyBjaGFyICplbnZfdmFyaWFibGVzW10gPSB7ICJHOTYwTElCIiwgIkc5NjBCQVNFIiwgMCB9OwotICBjaGFyICoqcDsKLSAgY2hhciAqZW52IDsKLQotICBmb3IgKCBwID0gZW52X3ZhcmlhYmxlczsgKnA7IHArKyApewotICAgIGVudiA9ICAoY2hhciAqKSBnZXRlbnYoKnApOwotICAgIGlmIChlbnYpIHsKLSAgICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwKLQkJCQkgICAgICAgIi9saWIvbGliY29mZiIsCi0JCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLXN0YXRpYyB2b2lkIGdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBjaGFyICplbnYgOwotICBlbnYgPSAgZ2V0ZW52KCJHOTYwTElCIik7Ci0gIGlmIChlbnYpIHsKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChlbnYsIGZhbHNlKTsKLSAgfQotICBlbnYgPSBnZXRlbnYoIkc5NjBCQVNFIik7Ci0gIGlmIChlbnYpCi0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGNvbmNhdCAoZW52LCAiL2xpYiIsIChjb25zdCBjaGFyICopIE5VTEwpLAotCQkJICAgICBmYWxzZSk7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2VuZGlmCS8qIEdOVTk2MCAqLwotCi0KLXN0YXRpYyB2b2lkCi1nbGQ5NjBfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lICE9IE5VTEwKLSAgICAgICYmICpsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGNoYXIgKnMsICpzMTsKLQotICAgICAgcyA9IGNvbmNhdCAoImk5NjA6IiwgbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUsIChjaGFyICopIE5VTEwpOwotICAgICAgZm9yIChzMSA9IHM7ICpzMSAhPSAnXDAnOyBzMSsrKQotCWlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMxKSkKLQkgICpzMSA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqczEpOwotICAgICAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAocyk7Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQgKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZDk2MF9jaG9vc2VfdGFyZ2V0KCkKLXsKLSNpZmRlZiBHTlU5NjAKLQotICBvdXRwdXRfZmlsZW5hbWUgPSAiYi5vdXQiOwotICByZXR1cm4gYmZkX21ha2VfdGFyZ19uYW1lKEJGRF9CT1VUX0ZPUk1BVCwgMCk7Ci0KLSNlbHNlCi0KLSAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52KFRBUkdFVF9FTlZJUk9OKTsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLQotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotCi0gIHJldHVybiAiY29mZi1JbnRlbC1saXR0bGUiOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkOTYwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKLSAgZWxzZQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKLX0KLUVPRgotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2dsZDk2MGNvZmZfZW11bGF0aW9uID0gCi17Ci0gIGdsZDk2MF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZDk2MF9zZXRfb3V0cHV0X2FyY2gsCi0gIGdsZDk2MF9jaG9vc2VfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfZ2V0X3NjcmlwdCwKLSAgIjk2MGNvZmYiLAotICAiIgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0gYi9sZC9lbXVsdGVtcGwvaHBwYWVsZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjYTExMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvaHBwYWVsZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBBbiBlbXVsYXRpb24gZm9yIEhQIFBBLVJJU0MgRUxGIGxpbmtlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLQotLyogU2VjdGlvbiBpbiB3aGljaCB3ZSBidWlsZCBzdHVicy4gICovCi1zdGF0aWMgYXNlY3Rpb24gKnN0dWJfc2VjOwotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnN0dWJfZmlsZTsKLQotCi0vKiBGSVhNRS4gIFRoaXMgZG9lc24ndCBiZWxvbmcgaGVyZS4gICovCi1leHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGZpbGVfY2hhaW47Ci0KLS8qIFBlcmZvcm0gc29tZSBlbXVsYXRpb24gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uICBGb3IgUEEgRUxGIHdlIHNldAotICAgdXAgdGhlIGxvY2FsIGxhYmVsIHByZWZpeCBhbmQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9iZWZvcmVfcGFyc2UgKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9ocHBhOwotfQotCi0vKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9zZXRfb3V0cHV0X2FyY2goKQotewotICB1bnNpZ25lZCBsb25nIG1hY2hpbmUgPSAwOwotCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbWFjaGluZSk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgaW5wdXQgZmlsZXMgYXJlIG9wZW5lZC4gIFdlIGNyZWF0ZSBhIG5ldwotICAgZmFrZSBpbnB1dCBmaWxlIHRvIGhvbGQgdGhlIHN0dWIgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1ocHBhZWxmX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpCi17Ci0gIHN0dWJfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKCJsaW5rZXIgc3R1YnMiLAotCQkJCSAgIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW0sCi0JCQkJICAgTlVMTCk7Ci0gIHN0dWJfZmlsZS0+dGhlX2JmZCA9IGJmZF9jcmVhdGUgKCJsaW5rZXIgc3R1YnMiLCBvdXRwdXRfYmZkKTsKLSAgaWYgKHN0dWJfZmlsZS0+dGhlX2JmZCA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfYXJjaF9tYWNoIChzdHViX2ZpbGUtPnRoZV9iZmQsCi0JCQkgICAgICBiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpLAotCQkJICAgICAgYmZkX2dldF9tYWNoIChvdXRwdXRfYmZkKSkpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSBCRkQgJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHViX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3R1Yl9maWxlLT50aGVfYmZkLCAiLnRleHQiKTsKLSAgLyogRG9uJ3Qgc2V0IFNFQ19SRUxPQyB1bnRpbCB3ZSBhY3R1YWxseSBoYXZlIHJlbG9jYXRpb25zIGluIHRoaXMKLSAgICAgc2VjdGlvbi4gICovCi0gIGlmIChzdHViX3NlYyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3R1Yl9maWxlLT50aGVfYmZkLCBzdHViX3NlYywKLQkJCQkgIChTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgfCBTRUNfQUxMT0MKLQkJCQkgICB8IFNFQ19MT0FECi0JCQkJICAgfCBTRUNfQ09ERQotCQkJCSAgIHwgU0VDX0lOX01FTU9SWSkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgc3R1YiBzZWN0aW9uOiAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxkbGFuZ19hZGRfZmlsZSAoc3R1Yl9maWxlKTsKLX0KLQotLyogV2FsayBhbGwgdGhlIGxhbmcgc3RhdGVtZW50cyBzcGxpY2luZyBvdXQgYW55IHBhZGRpbmcgc3RhdGVtZW50cyBmcm9tIAotICAgdGhlIGxpc3QuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLCBwcmV2KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHJldjsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3ByZXYgPSBOVUxMOwotICBmb3IgKDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQotCS8qIFdlIHdhbnQgcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBzZWN0aW9ucy4gICovCi0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCQkgICAgICZjb25zdHJ1Y3Rvcl9saXN0LmhlYWQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KLQkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQsCi0JCQkJCSAgICAgJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KLQkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0KLQkvKiBIdWg/ICBXaGF0IGlzIGEgbGFuZ193aWxkX3N0YXRlbWVudD8gICovCi0JY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0JICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHMtPndpbGRfc3RhdGVtZW50LgotCQkJCQkgICAgICAgY2hpbGRyZW4uaGVhZCwKLQkJCQkJICAgICAmcy0+d2lsZF9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCi0JLyogSGVyZSdzIHdoYXQgd2UgYXJlIHJlYWxseSBsb29raW5nIGZvci4gIFNwbGljZSB0aGVzZSBvdXQgb2YKLQkgICB0aGUgbGlzdC4gICovCi0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JICBpZiAoc3ByZXYpCi0JICAgIHNwcmV2LT5oZWFkZXIubmV4dCA9IHMtPmhlYWRlci5uZXh0OwotCSAgZWxzZQotCSAgICAqKnByZXYgPSAqczsKLQkgIGJyZWFrOwotCi0JLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVzZSBjYXNlcy4gICovCi0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgc3ByZXYgPSBzOwotICAgIH0KLX0KLQotLyogRmluYWwgZW11bGF0aW9uIHNwZWNpZmljIGNhbGwuICBGb3IgdGhlIFBBIHdlIHVzZSB0aGlzIG9wcG9ydHVuaXR5Ci0gICB0byBidWlsZCBsaW5rZXIgc3R1YnMuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9maW5pc2ggKCkKLXsKLSAgLyogQ2FsbCBpbnRvIHRoZSBCRkQgYmFja2VuZCB0byBkbyB0aGUgcmVhbCB3b3JrLiAgKi8KLSAgaWYgKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyAoc3R1Yl9maWxlLT50aGVfYmZkLCBvdXRwdXRfYmZkLCAmbGlua19pbmZvKQotICAgICAgPT0gZmFsc2UpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IHNpemUgc3R1YiBzZWN0aW9uOiAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgLyogSWYgdGhlIHNpemUgb2YgdGhlIHN0dWIgc2VjdGlvbiBpcyBub256ZXJvLCB0aGVuIHdlIG5lZWQKLSAgICAgdG8gcmVzaXplIHRoZSBzZWN0aW9ucywgcmVjb21wdXRlIHRoZSBhc3NpZ25tZW50cywgYW5kIGZpbmFsbHkKLSAgICAgYnVpbGQgdGhlIHN0dWJzLiAgKi8KLSAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0dWJfZmlsZS0+dGhlX2JmZCwgc3R1Yl9maWxlLT50aGVfYmZkLT5zZWN0aW9ucykgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBEZWxldGUgYWxsIHRoZSBwYWRkaW5nIHN0YXRlbWVudHMsIHRoZXkncmUgbm8gbG9uZ2VyIHZhbGlkLiAgKi8KLSAgICAgIGhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAoc3RhdF9wdHItPmhlYWQsICZzdGF0X3B0ci0+aGVhZCk7Ci0gICAgICAKLSAgICAgIC8qIFJlc2l6ZSB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCwgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmc3RhdF9wdHItPmhlYWQsIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0gICAgICAKLSAgICAgIC8qIFJlZG8gc3BlY2lhbCBzdHVmZi4gICovCi0gICAgICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKLSAgICAgIAotICAgICAgLyogRG8gdGhlIGFzc2lnbm1lbnRzIGFnYWluLiAgKi8KLSAgICAgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRfcHRyLT5oZWFkLAotCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotICAgICAgCi0gICAgICAvKiBOb3cgYnVpbGQgdGhlIGxpbmtlciBzdHVicy4gICovCi0gICAgICBpZiAoZWxmMzJfaHBwYV9idWlsZF9zdHVicyAoc3R1Yl9maWxlLT50aGVfYmZkLCAmbGlua19pbmZvKSA9PSBmYWxzZSkKLQl7Ci0JICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgYnVpbGQgc3R1YnM6ICVFXG4iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGUgc2NyaXB0IGl0c2VsZiBnZXRzIGluc2VydGVkIGhlcmUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1ocHBhZWxmX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKLSAgZWxzZQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKLX0KLUVPRgotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2hwcGFlbGZfZW11bGF0aW9uID0gCi17Ci0gIGhwcGFlbGZfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBocHBhZWxmX3NldF9vdXRwdXRfYXJjaCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBocHBhZWxmX2dldF9zY3JpcHQsCi0gICJocHBhZWxmIiwKLSAgImVsZjMyLWhwcGEiLAotICBocHBhZWxmX2ZpbmlzaCwKLSAgaHBwYWVsZl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9saW51eC5lbSBiL2xkL2VtdWx0ZW1wbC9saW51eC5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwODU1ZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvbGludXguZW0KKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBMaW51eCBhLm91dCBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIExpbnV4IHN1cHBvcnQgYnkgRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gdHJ1ZTsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBMaW51eAotICAgZHluYW1pYyBsaWJyYXJpZXMgaGF2ZSBhbiBleHRlbnNpb24gb2YgLnNhLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKQotCQkJICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc2EiKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNhIiwgc2VhcmNoLT5uYW1lLCBlbnRyeS0+ZmlsZW5hbWUsIGFyY2gpOwotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvY2F0ZXMgYW55IGFkZHJlc3MgYXNzaWdubWVudCB0bwotICAgLnRleHQsIGFuZCBtb2RpZmllcyBpdCB0byBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXJzLiAgVGhpcwotICAgY2F1c2VzIC1UdGV4dCB0byBtZWFuIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBoZWFkZXIsIHJhdGhlcgotICAgdGhhbiB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiAudGV4dCwgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyCi0gICBMaW51eCB0b29scy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtCi0gICAgICAmJiBzdHJjbXAgKHMtPmFkZHJlc3Nfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICB7Ci0gICAgICBBU1NFUlQgKHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3MtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV92YWx1ZSk7Ci0gICAgICBzLT5hZGRyZXNzX3N0YXRlbWVudC5hZGRyZXNzLT52YWx1ZS52YWx1ZSArPSAweDIwOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIG9wZW5pbmcgdGhlIGlucHV0IEJGRCdzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpCi17Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50KTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgLyogTGV0IHRoZSBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQgYnkKLSAgICAgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgaWYgKCEgYmZkXyR7RU1VTEFUSU9OX05BTUV9X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9J3MvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTFzL14vIi8KLSRzLyQvbiIvCi0nCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7Ci0gIGVsc2UKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Ci19Ci1FT0YKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0gYi9sZC9lbXVsdGVtcGwvbG5rOTYwLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjZkNDZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogaW50ZWwgY29mZiBsb2FkZXIgZW11bGF0aW9uIHNwZWNpZmljIHN0dWZmCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiNpbmNsdWRlICJhcmNodXJlcy5oIiovCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi10eXBlZGVmIHN0cnVjdCBsaWJfbGlzdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBsaWJfbGlzdCAqbmV4dDsKLX0gbGliX2xpc3RfdHlwZTsKLQotc3RhdGljIGxpYl9saXN0X3R5cGUgKmhsbF9saXN0Owotc3RhdGljIGxpYl9saXN0X3R5cGUgKipobGxfbGlzdF90YWlsID0gJmhsbF9saXN0OwotCi1zdGF0aWMgbGliX2xpc3RfdHlwZSAqc3lzbGliX2xpc3Q7Ci1zdGF0aWMgbGliX2xpc3RfdHlwZSAqKnN5c2xpYl9saXN0X3RhaWwgPSAmc3lzbGliX2xpc3Q7Ci0KLQotc3RhdGljIHZvaWQKLWFwcGVuZChsaXN0LCBuYW1lKQotICAgICBsaWJfbGlzdF90eXBlICoqKmxpc3Q7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGxpYl9saXN0X3R5cGUgKmVsZW1lbnQgPSAKLSAgICAobGliX2xpc3RfdHlwZSAqKSh4bWFsbG9jKHNpemVvZihsaWJfbGlzdF90eXBlKSkpOwotCi0gIGVsZW1lbnQtPm5hbWUgPSBuYW1lOwotICBlbGVtZW50LT5uZXh0ID0gKGxpYl9saXN0X3R5cGUgKilOVUxMOwotICAqKmxpc3QgPSBlbGVtZW50OwotICAqbGlzdCA9ICZlbGVtZW50LT5uZXh0OwotCi19Ci0KLXN0YXRpYyBib29sZWFuIGhhZF9obGwgPSBmYWxzZTsKLXN0YXRpYyBib29sZWFuIGhhZF9obGxfbmFtZSA9IGZhbHNlOwotCi1zdGF0aWMgdm9pZAotbG5rOTYwX2hsbChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBoYWRfaGxsID0gdHJ1ZTsKLSAgaWYgKG5hbWUgIT0gKGNoYXIgKilOVUxMKSB7Ci0gICAgaGFkX2hsbF9uYW1lID0gdHJ1ZTsKLSAgICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsIG5hbWUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIAotbG5rOTYwX3N5c2xpYihuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBhcHBlbmQoJnN5c2xpYl9saXN0X3RhaWwsbmFtZSk7Ci19Ci0KLQotI2lmZGVmIEdOVTk2MAotCi1zdGF0aWMgdm9pZCAKLWxuazk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQoZW52LCIvbGliL2xpYmNvZmYiLCIiKSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIGVudj0gKGNoYXIgKikgZ2V0ZW52KCJJOTYwQkFTRSIpOwotICBpZiAoIGVudiApIHsKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQoZW52LCIvbGliIiwiIiksIGZhbHNlKTsKLSAgfQotCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLXN0YXRpYyB2b2lkIAotbG5rOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGNoYXIgKm5hbWUgPSBnZXRlbnYoIkk5NjBCQVNFIik7Ci0KLSAgaWYgKG5hbWUgPT0gKGNoYXIgKilOVUxMKSB7Ci0gICAgbmFtZSA9IGdldGVudigiRzk2MEJBU0UiKTsKLSAgICBpZiAobmFtZSA9PSAoY2hhciAqKU5VTEwpIHsKLSAgICAgIGVpbmZvKCIlUCVGIEk5NjBCQVNFIGFuZCBHOTYwQkFTRSBub3Qgc2V0XG4iKTsKLSAgICB9Ci0gIH0KLQotCi0gIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKGNvbmNhdChuYW1lLCIvbGliIiwiIiksIGZhbHNlKTsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotYWRkX29uKGxpc3QsIHNlYXJjaCkKLSAgICAgbGliX2xpc3RfdHlwZSAqbGlzdDsKLSAgICAgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBzZWFyY2g7Ci17Ci0gIHdoaWxlIChsaXN0KSB7Ci0gICAgbGFuZ19hZGRfaW5wdXRfZmlsZShsaXN0LT5uYW1lLAotCQkJc2VhcmNoLAotCQkJKGNoYXIgKilOVUxMKTsKLSAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgfQotfQotc3RhdGljIHZvaWQKLWxuazk2MF9hZnRlcl9wYXJzZSgpCi17Ci0gIC8qIElmIHRoZXJlIGhhcyBiZWVuIG5vIGFyY2gsIGRlZmF1bHQgdG8gLUtCICovCi0gIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZVswXSA9PTApIHsKLSAgICBsZGZpbGVfYWRkX2FyY2goIktCIik7Ci0gIH0KLQotICAvKiBpZiB0aGVyZSBoYXMgYmVlbiBubyBobGwgbGlzdCB0aGVuIGFkZCBvdXIgb3duICovCi0gIAotICBpZihoYWRfaGxsICYmICFoYWRfaGxsX25hbWUpIHsKLSAgICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsImNnIik7Ci0gICAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9PSBiZmRfbWFjaF9pOTYwX2thX3NhIHx8Ci0gIAlsZGZpbGVfb3V0cHV0X21hY2hpbmUgPT0gYmZkX21hY2hfaTk2MF9jYSkgewotICAgICAgICB7Ci0JICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsImZwZyIpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBhZGRfb24oaGxsX2xpc3QsIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0pOwotICBhZGRfb24oc3lzbGliX2xpc3QsIGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtKTsKLX0KLQotc3RhdGljIHZvaWQKLWxuazk2MF9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1sbms5NjBfYWZ0ZXJfYWxsb2NhdGlvbigpCi17Ci0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IGZhbHNlKSB7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLnRleHQiLCJfZXRleHQiKTsKLSAgICBsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKCIuZGF0YSIsIl9lZGF0YSIpOwotICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YoIi5ic3MiLCJfYnNzX3N0YXJ0Iik7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLmJzcyIsIl9lbmQiKTsKLSAgfQotfQotCi0KLXN0YXRpYyBzdHJ1Y3QKLSB7Ci0gICB1bnNpZ25lZCAgbG9uZyBudW1iZXI7Ci0gICBjaGFyICpuYW1lOyAKLSB9Ci1tYWNoaW5lX3RhYmxlW10gPQotewotICB7IGJmZF9tYWNoX2k5NjBfY29yZQksIkNPUkUiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYl9zYgksIktCIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJTQiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX21jCSwiTUMiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF94YQksIlhBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfY2EJLCJDQSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2thX3NhCSwiS0EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksIlNBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfangJLCJKWCIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2h4CSwiSFgiIH0sCi0KLSAgeyBiZmRfbWFjaF9pOTYwX2NvcmUJLCJjb3JlIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJrYiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwic2IiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9tYwksIm1jIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfeGEJLCJ4YSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2NhCSwiY2EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksImthIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJzYSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2p4CSwiangiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9oeAksImh4IiB9LAotCi0gIHsgMCwgKGNoYXIgKikgTlVMTCB9Ci19OwotCi1zdGF0aWMgdm9pZAotbG5rOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICB1bnNpZ25lZCBpbnQgaTsKLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotICBmb3IgKGk9IDA7IG1hY2hpbmVfdGFibGVbaV0ubmFtZSAhPSAoY2hhciopTlVMTDsgaSsrKSB7Ci0gICAgaWYgKHN0cmNtcChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSxtYWNoaW5lX3RhYmxlW2ldLm5hbWUpPT0wKSB7Ci0gICAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBtYWNoaW5lX3RhYmxlW2ldLm51bWJlcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbGRmaWxlX291dHB1dF9tYWNoaW5lKTsKLX0KLQotc3RhdGljIGNoYXIgKgotbG5rOTYwX2Nob29zZV90YXJnZXQoKQotewotI2lmZGVmIEdOVTk2MAotCi0gIHJldHVybiBiZmRfbWFrZV90YXJnX25hbWUoQkZEX0NPRkZfRk9STUFULCAwKTsKLQotI2Vsc2UKLQotICBjaGFyICpmcm9tX291dHNpZGUgPSBnZXRlbnYoVEFSR0VUX0VOVklST04pOwotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotI2lmZGVmIExOSzk2MF9MSVRUTEUKLSAgcmV0dXJuICJjb2ZmLUludGVsLWxpdHRsZSI7Ci0jZWxzZQotICByZXR1cm4gImNvZmYtSW50ZWwtYmlnIjsKLSNlbmRpZgotI2VuZGlmCi0KLX0KLQotc3RhdGljIGNoYXIgKgotbG5rOTYwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7Ci0gIGVsc2UKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Ci19Ci1FT0YKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9sbms5NjBfZW11bGF0aW9uID0gCi17Ci0gIGxuazk2MF9iZWZvcmVfcGFyc2UsCi0gIGxuazk2MF9zeXNsaWIsCi0gIGxuazk2MF9obGwsCi0gIGxuazk2MF9hZnRlcl9wYXJzZSwKLSAgTlVMTCwJCQkvKiBhZnRlcl9vcGVuICovCi0gIGxuazk2MF9hZnRlcl9hbGxvY2F0aW9uLAotICBsbms5NjBfc2V0X291dHB1dF9hcmNoLAotICBsbms5NjBfY2hvb3NlX3RhcmdldCwKLSAgbG5rOTYwX2JlZm9yZV9hbGxvY2F0aW9uLAotICBsbms5NjBfZ2V0X3NjcmlwdCwKLSAgImxuazk2MCIsCi0gICIiCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtIGIvbGQvZW11bHRlbXBsL21pcHNlY29mZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyMDBjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogSGFuZGxlIGVtYmVkZGVkIHJlbG9jcyBmb3IgTUlQUy4KLSAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4gYmFzZWQgb24gZ2VuZXJpYy5lbS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuCi0gICBXZSBjcmVhdGUgYSAucmVsLnNkYXRhIHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZSB3aXRoIGEgbm9uIHplcm8KLSAgIC5zZGF0YSBzZWN0aW9uLiAgVGhlIEJGRCBiYWNrZW5kIHdpbGwgZmlsbCBpbiB0aGVzZSBzZWN0aW9ucyB3aXRoCi0gICBtYWdpYyBudW1iZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbG9jYXRlIHRoZSBkYXRhIHNlY3Rpb24gYXQgcnVuCi0gICB0aW1lLiAgVGhpcyB3aWxsIG9ubHkgZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIGFsbCB0aGUgaW5wdXQgZmlsZXMKLSAgIGhhdmUgYmVlbiBjb21waWxlZCB1c2luZyAtbWVtYmVkZGVkLXBpYy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIGJmZCAqYWJmZDsKLQotICBpZiAoISBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzCi0gICAgICB8fCBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICBmb3IgKGFiZmQgPSBsaW5rX2luZm8uaW5wdXRfYmZkczsgYWJmZCAhPSBOVUxMOyBhYmZkID0gYWJmZC0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhc2VjOwotCi0gICAgICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKLQotICAgICAgLyogTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSByZWxvY19jb3VudCBmaWVsZCBoYXMgYWxyZWFkeQotICAgICAgICAgYmVlbiBzZXQgdXAuICBXZSBjb3VsZCBjYWxsIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIGJ1dAotICAgICAgICAgdGhhdCByZXR1cm5zIHRoZSBzaXplIG9mIGEgbWVtb3J5IGJ1ZmZlciByYXRoZXIgdGhhbiBhIHJlbG9jCi0gICAgICAgICBjb3VudC4gIFdlIGRvIG5vdCB3YW50IHRvIGNhbGwgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLSAgICAgICAgIGJlY2F1c2UgYWx0aG91Z2ggaXQgd291bGQgYWx3YXlzIHdvcmsgaXQgd291bGQgZm9yY2UgdXMgdG8KLSAgICAgICAgIHJlYWQgaW4gdGhlIHJlbG9jcyBpbnRvIEJGRCBjYW5vbmljYWwgZm9ybSwgd2hpY2ggd291bGQgd2FzdGUKLSAgICAgICAgIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUgYW5kIG1lbW9yeS4gICovCi0gICAgICBpZiAoZGF0YXNlYyAhPSBOVUxMICYmIGRhdGFzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICBhc2VjdGlvbiAqcmVsc2VjOwotCi0JICByZWxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbC5zZGF0YSIpOwotCSAgaWYgKHJlbHNlYyA9PSBOVUxMCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJlbHNlYywKLQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWSkpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCByZWxzZWMsIDIpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsc2VjLAotCQkJCQkgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KSkKLQkgICAgZWluZm8gKCIlRiVCOiBjYW4gbm90IGNyZWF0ZSAucmVsLnNkYXRhIHNlY3Rpb246ICVFXG4iKTsKLQl9Ci0KLSAgICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IGFsbCBvdGhlciBkYXRhIHNlY3Rpb25zIGFyZSBlbXB0eSwgYXMgaXMKLSAgICAgICAgIHJlcXVpcmVkIGZvciBlbWJlZGRlZCBQSUMgY29kZS4gICovCi0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGNoZWNrX3NlY3Rpb25zLCAoUFRSKSBkYXRhc2VjKTsKLSAgICB9Ci19Ci0KLS8qIENoZWNrIHRoYXQgb2YgdGhlIGRhdGEgc2VjdGlvbnMsIG9ubHkgdGhlIC5zZGF0YSBzZWN0aW9uIGhhcwotICAgcmVsb2NzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGVja19zZWN0aW9ucyAoYWJmZCwgc2VjLCBzZGF0YXNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgc2RhdGFzZWM7Ci17Ci0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpID09IDAKLSAgICAgICYmIHNlYyAhPSAoYXNlY3Rpb24gKikgc2RhdGFzZWMKLSAgICAgICYmIHNlYy0+cmVsb2NfY291bnQgIT0gMCkKLSAgICBlaW5mbyAoIiVQJVg6IHNlY3Rpb24gJXMgaGFzIHJlbG9jczsgY2FuIG5vdCB1c2UgLS1lbWJlZGRlZC1yZWxvY3NcbiIsCi0JICAgYWJmZCwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbiBzaXplcyBhbmQgb2Zmc2V0cyBoYXZlCi0gICBiZWVuIHNldC4gIElmIHdlIGFyZSBnZW5lcmF0aW5nIGVtYmVkZGVkIHJlbG9jcywgaXQgY2FsbHMgYSBzcGVjaWFsCi0gICBCRkQgYmFja2VuZCByb3V0aW5lIHRvIGRvIHRoZSB3b3JrLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX2FsbG9jYXRpb24gKCkKLXsKLSAgYmZkICphYmZkOwotCi0gIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKLSAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFzZWMsICpyZWxzZWM7Ci0gICAgICBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOwotCi0gICAgICBpZiAoZGF0YXNlYyA9PSBOVUxMIHx8IGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHJlbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbC5zZGF0YSIpOwotICAgICAgQVNTRVJUIChyZWxzZWMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MgKGFiZmQsICZsaW5rX2luZm8sCi0JCQkJCQkgICBkYXRhc2VjLCByZWxzZWMsCi0JCQkJCQkgICAmZXJybXNnKSkKLQl7Ci0JICBpZiAoZXJybXNnID09IE5VTEwpCi0JICAgIGVpbmZvICgiJUIlWDogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJUVcbiIsCi0JCSAgIGFiZmQpOwotCSAgZWxzZQotCSAgICBlaW5mbyAoIiVYJUI6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVzXG4iLAotCQkgICBhYmZkLCBlcnJtc2cpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uLAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9wZS5lbSBiL2xkL2VtdWx0ZW1wbC9wZS5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhYjRmOS4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvcGUuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ2ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLShlY2hvO2VjaG87ZWNobztlY2hvKT5lJHtFTVVMQVRJT05fTkFNRX0uYyAjIHRoZXJlLCBub3cgbGluZSBudW1iZXJzIG1hdGNoIDstKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIFdJTkRPV1NfTlQgKi8KLS8qIFRoZSBvcmlnaW5hbCBmaWxlIGdlbmVyYXRlZCByZXR1cm5lZCBkaWZmZXJlbnQgZGVmYXVsdCBzY3JpcHRzIGRlcGVuZGluZwotICAgb24gd2hldGhlciBjZXJ0YWluIHN3aXRjaGVzIHdlcmUgc2V0LCBidXQgdGhlc2Ugc3dpdGNoZXMgcGVydGFpbiB0byB0aGUKLSAgIExpbnV4IHN5c3RlbSBhbmQgdGhhdCBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgY29mZi4gIEluIHRoZSBOVCBjYXNlLCB3ZQotICAgb25seSBkZXRlcm1pbmUgaWYgdGhlIHN1YnN5c3RlbSBpcyBjb25zb2xlIG9yIHdpbmRvd3MgaW4gb3JkZXIgdG8gc2VsZWN0Ci0gICB0aGUgY29ycmVjdCBlbnRyeSBwb2ludCBieSBkZWZhdWx0LiAqLyAKLSAgCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJiZmQuaCIKLSNpbmNsdWRlICJkZWZmaWxlLmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpZiBkZWZpbmVkKFRBUkdFVF9JU19pMzg2cGUpCi0jZGVmaW5lIERMTF9TVVBQT1JUCi0jZW5kaWYKLQotI2RlZmluZQlQRV9ERUZfU1VCU1lTVEVNCQkzCi0KLSNpZmRlZiBUQVJHRVRfSVNfYXJtX2Vwb2NfcGUKLSNkZWZpbmUgYmZkX2FybV9wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9hcm1fZXBvY19wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9hcm1fZXBvY19wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX2Vwb2NfcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlOwotc3RhdGljIGludCBkbGw7Ci1zdGF0aWMgaW50IHN1cHBvcnRfb2xkX2NvZGUgPSAwOwotc3RhdGljIGNoYXIgKiB0aHVtYl9lbnRyeV9zeW1ib2wgPSBOVUxMOwotZXh0ZXJuIGRlZl9maWxlICpwZV9kZWZfZmlsZTsKLXN0YXRpYyBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKmltYWdlX2Jhc2Vfc3RhdGVtZW50ID0gMDsKLQotc3RhdGljIGNoYXIgKnBlX291dF9kZWZfZmlsZW5hbWUgPSAwOwotZXh0ZXJuIGludCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmc7Ci1leHRlcm4gaW50IHBlX2RsbF9raWxsX2F0czsKLWV4dGVybiBpbnQgcGVfZGxsX3N0ZGNhbGxfYWxpYXNlczsKLXN0YXRpYyBpbnQgcGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPSAtMTsgLyogMD1kaXNhYmxlIDE9ZW5hYmxlICovCi1zdGF0aWMgY2hhciAqcGVfaW1wbGliX2ZpbGVuYW1lID0gMDsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBvdXRwdXRfZmlsZW5hbWUgPSAiYS5leGUiOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0jaWZkZWYgRExMX1NVUFBPUlQKLSAgY29uZmlnLmhhc19zaGFyZWQgPSAxOwotI2VuZGlmCi19Ci0MCi0vKiBQRSBmb3JtYXQgZXh0cmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAqLwotCi0vKiBVc2VkIGZvciBzZXR0aW5nIGZsYWdzIGluIHRoZSBQRSBoZWFkZXIuICovCi0jZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJCSgzMDAgICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RMTAkJCShPUFRJT05fQkFTRV9GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZJTEVfQUxJR05NRU5UCQkoT1BUSU9OX0RMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCQkoT1BUSU9OX0ZJTEVfQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9JTUFHRV9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01BSk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01JTk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQJKE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TVEFDSyAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVUJTWVNURU0gICAgICAgICAgICAgICAgKE9QVElPTl9TVEFDSyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUFQCQkJKE9QVElPTl9TVUJTWVNURU0gKyAxKQotI2RlZmluZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERQkJKE9QVElPTl9IRUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX09VVF9ERUYJCQkoT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUX0FMTAkJKE9QVElPTl9PVVRfREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNQk9MUwkJKE9QVElPTl9FWFBPUlRfQUxMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0tJTExfQVRTCQkJKE9QVElPTl9FWENMVURFX1NZTUJPTFMgKyAxKQotI2RlZmluZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTCQkoT1BUSU9OX0tJTExfQVRTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQCShPUFRJT05fU1REQ0FMTF9BTElBU0VTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUAkoT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNUExJQl9GSUxFTkFNRQkJKE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVAgKyAxKQotI2RlZmluZSBPUFRJT05fVEhVTUJfRU5UUlkJCShPUFRJT05fSU1QTElCX0ZJTEVOQU1FICsgMSkKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9Ci17Ci0gIC8qIFBFIG9wdGlvbnMgKi8KLSAgeyJiYXNlLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JBU0VfRklMRX0sCi0gIHsiZGxsIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ETEx9LAotICB7ImZpbGUtYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GSUxFX0FMSUdOTUVOVH0sCi0gIHsiaGVhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVBUH0sIAotICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LAotICB7Im1ham9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT059LAotICB7Im1ham9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX09TX1ZFUlNJT059LAotICB7Im1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTn0sCi0gIHsibWlub3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTn0sCi0gIHsibWlub3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTn0sCi0gIHsibWlub3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgeyJzZWN0aW9uLWFsaWdubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0VDVElPTl9BTElHTk1FTlR9LAotICB7InN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFDS30sCi0gIHsic3Vic3lzdGVtIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVUJTWVNURU19LAotICB7InN1cHBvcnQtb2xkLWNvZGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREV9LAotICB7InRodW1iLWVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9USFVNQl9FTlRSWX0sCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgLyogZ2V0b3B0IGFsbG93cyBhYmJyZXZpYXRpb25zLCBzbyB3ZSBkbyB0aGlzIHRvIHN0b3AgaXQgZnJvbSB0cmVhdGluZyAtbwotICAgICBhcyBhbiBhYmJyZXZpYXRpb24gZm9yIHRoaXMgb3B0aW9uICovCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUX0RFRn0sCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUX0RFRn0sCi0gIHsiZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlRfQUxMfSwKLSAgeyJleGNsdWRlLXN5bWJvbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYQ0xVREVfU1lNQk9MU30sCi0gIHsia2lsbC1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fS0lMTF9BVFN9LAotICB7ImFkZC1zdGRjYWxsLWFsaWFzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVERDQUxMX0FMSUFTRVN9LAotICB7ImVuYWJsZS1zdGRjYWxsLWZpeHVwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUH0sCi0gIHsiZGlzYWJsZS1zdGRjYWxsLWZpeHVwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVB9LAotICB7Im91dC1pbXBsaWIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUExJQl9GSUxFTkFNRX0sCi0jZW5kaWYKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotCi0vKiBQRS9XSU4zMjsgYWRkZWQgcm91dGluZXMgdG8gZ2V0IHRoZSBzdWJzeXN0ZW0gdHlwZSwgaGVhcCBhbmQvb3Igc3RhY2sKLSAgIHBhcmFtZXRlcnMgd2hpY2ggbWF5IGJlIGlucHV0IGZyb20gdGhlIGNvbW1hbmQgbGluZSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB2b2lkICpwdHI7Ci0gIGludCBzaXplOwotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKnN5bWJvbDsKLSAgaW50IGluaXRlZDsKLX0gZGVmaW5mbzsKLQotI2RlZmluZSBEKGZpZWxkLHN5bWJvbCxkZWYpICB7JnBlLmZpZWxkLHNpemVvZihwZS5maWVsZCksIGRlZiwgc3ltYm9sLDB9Ci0KLXN0YXRpYyBkZWZpbmZvIGluaXRbXSA9Ci17Ci0gIC8qIGltYWdlYmFzZSBtdXN0IGJlIGZpcnN0ICovCi0jZGVmaW5lIElNQUdFQkFTRU9GRiAwCi0gIEQoSW1hZ2VCYXNlLCJfX2ltYWdlX2Jhc2VfXyIsIE5UX0VYRV9JTUFHRV9CQVNFKSwKLSNkZWZpbmUgRExMT0ZGIDEKLSAgeyZkbGwsIHNpemVvZihkbGwpLCAwLCAiX19kbGxfXyJ9LAotICBEKFNlY3Rpb25BbGlnbm1lbnQsIl9fc2VjdGlvbl9hbGlnbm1lbnRfXyIsIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCksCi0gIEQoRmlsZUFsaWdubWVudCwiX19maWxlX2FsaWdubWVudF9fIiwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKSwKLSAgRChNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWFqb3Jfb3NfdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21pbm9yX29zX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9ySW1hZ2VWZXJzaW9uLCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIsIDEpLAotICBEKE1pbm9ySW1hZ2VWZXJzaW9uLCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9yU3Vic3lzdGVtVmVyc2lvbiwiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCAwKSwKLSAgRChTdWJzeXN0ZW0sIl9fc3Vic3lzdGVtX18iLCBQRV9ERUZfU1VCU1lTVEVNKSwKLSAgRChTaXplT2ZTdGFja1Jlc2VydmUsIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iLCAweDIwMDAwMDApLAotICBEKFNpemVPZlN0YWNrQ29tbWl0LCJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iLCAweDEwMDApLAotICBEKFNpemVPZkhlYXBSZXNlcnZlLCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAweDEwMDAwMCksCi0gIEQoU2l6ZU9mSGVhcENvbW1pdCwiX19zaXplX29mX2hlYXBfY29tbWl0X18iLCAweDEwMDApLAotICBEKExvYWRlckZsYWdzLCJfX2xvYWRlcl9mbGFnc19fIiwgMHgwKSwKLSAgeyBOVUxMLCAwLCAwLCBOVUxMLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWJhc2VfZmlsZSA8YmFzZWZpbGU+ICAgICAgICAgICAgIEdlbmVyYXRlIGEgYmFzZSBmaWxlIGZvciByZWxvY2F0YWJsZSBETExzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1kbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgaW1hZ2UgYmFzZSB0byB0aGUgZGVmYXVsdCBmb3IgRExMc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZmlsZS1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgICAgU2V0IGZpbGUgYWxpZ25tZW50XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1oZWFwIDxzaXplPiAgICAgICAgICAgICAgICAgICAgICBTZXQgaW5pdGlhbCBzaXplIG9mIHRoZSBoZWFwXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1pbWFnZS1iYXNlIDxhZGRyZXNzPiAgICAgICAgICAgICBTZXQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyB2ZXJzaW9uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gdmVyc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHJldmlzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgcmV2aXNpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSByZXZpc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc2VjdGlvbi1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgU2V0IHNlY3Rpb24gYWxpZ25tZW50XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdGFjayA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICBTZXQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBzdGFja1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3Vic3lzdGVtIDxuYW1lPls6PHZlcnNpb24+XSAgICAgU2V0IHJlcXVpcmVkIE9TIHN1YnN5c3RlbSBbJiB2ZXJzaW9uXVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3VwcG9ydC1vbGQtY29kZSAgICAgICAgICAgICAgICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tdGh1bWItZW50cnk9PHN5bWJvbD4gICAgICAgICAgICAgU2V0IHRoZSBlbnRyeSBwb2ludCB0byBiZSBUaHVtYiA8c3ltYm9sPlxuIikpOwotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICAgICAgICAgICAgICBFeHBvcnQgc3ltYm9scyB3aXRoIGFuZCB3aXRob3V0IEBublxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgRG9uJ3QgbGluayBfc3ltIHRvIF9zeW1Abm5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgIExpbmsgX3N5bSB0byBfc3ltQG5uIHdpdGhvdXQgd2FybmluZ3NcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWV4Y2x1ZGUtc3ltYm9scyBzeW0sc3ltLC4uLiAgICAgIEV4Y2x1ZGUgc3ltYm9scyBmcm9tIGF1dG9tYXRpYyBleHBvcnRcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgICAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZXhwb3J0IGFsbCBnbG9iYWxzIHRvIERMTFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0ta2lsbC1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIEBubiBmcm9tIGV4cG9ydGVkIHN5bWJvbHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW91dC1pbXBsaWIgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1vdXRwdXQtZGVmIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIC5ERUYgZmlsZSBmb3IgdGhlIGJ1aWx0IERMTFxuIikpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfbmFtZSAobmFtZSwgdmFsKQotICAgICBjaGFyICpuYW1lOwotICAgICBsb25nIHZhbDsKLXsKLSAgaW50IGk7Ci0gIC8qIEZpbmQgdGhlIG5hbWUgYW5kIHNldCBpdC4gKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5wdHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBpbml0W2ldLnN5bWJvbCkgPT0gMCkKLQl7Ci0JICBpbml0W2ldLnZhbHVlID0gdmFsOwotCSAgaW5pdFtpXS5pbml0ZWQgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGFib3J0KCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdWJzeXN0ZW0gKCkKLXsKLSAgY29uc3QgY2hhciAqc3ZlcjsKLSAgaW50IGxlbjsKLSAgaW50IGk7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNvbnN0IGludCB2YWx1ZTsKLSAgICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotICAgIH0KLSAgdltdID0KLSAgICB7Ci0gICAgICB7ICJuYXRpdmUiLCAxLCAiX050UHJvY2Vzc1N0YXJ0dXAiIH0sCi0gICAgICB7ICJ3aW5kb3dzIiwgMiwgIl9XaW5NYWluQ1JUU3RhcnR1cCIgfSwKLSAgICAgIHsgImNvbnNvbGUiLCAzLCAiX21haW5DUlRTdGFydHVwIiB9LAotI2lmIDAKLSAgICAgIC8qIFRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IHJlY29nbml6ZSB0aGlzLiAgKi8KLSAgICAgIHsgIm9zMiIsIDUsICIiIH0sCi0jZW5kaWYKLSAgICAgIHsgInBvc2l4IiwgNywgIl9fX1Bvc2l4UHJvY2Vzc1N0YXJ0dXAifSwKLSAgICAgIHsgMCwgMCwgMCB9Ci0gICAgfTsKLQotICBzdmVyID0gc3RyY2hyIChvcHRhcmcsICc6Jyk7Ci0gIGlmIChzdmVyID09IE5VTEwpCi0gICAgbGVuID0gc3RybGVuIChvcHRhcmcpOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZW5kOwotCi0gICAgICBsZW4gPSBzdmVyIC0gb3B0YXJnOwotICAgICAgc2V0X3BlX25hbWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLAotCQkgICBzdHJ0b3VsIChzdmVyICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgPT0gJy4nKQotCXNldF9wZV9uYW1lICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgICBzdHJ0b3VsIChlbmQgKyAxLCAmZW5kLCAwKSk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogYmFkIHZlcnNpb24gbnVtYmVyIGluIC1zdWJzeXN0ZW0gb3B0aW9uXG4iKSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IHZbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChvcHRhcmcsIHZbaV0ubmFtZSwgbGVuKSA9PSAwCi0JICAmJiB2W2ldLm5hbWVbbGVuXSA9PSAnXDAnKQotCXsKLQkgIHNldF9wZV9uYW1lICgiX19zdWJzeXN0ZW1fXyIsIHZbaV0udmFsdWUpOwotCi0JICBsYW5nX2FkZF9lbnRyeSAodltpXS5lbnRyeSwgMSk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICAKLSAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIpLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIHZvaWQKLXNldF9wZV92YWx1ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgCi17Ci0gIGNoYXIgKmVuZDsKLSAgCi0gIHNldF9wZV9uYW1lIChuYW1lLCAgc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKSk7Ci0gIAotICBpZiAoZW5kID09IG9wdGFyZykKLSAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIiksIG9wdGFyZyk7Ci0KLSAgb3B0YXJnID0gZW5kOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3N0YWNrX2hlYXAgKHJlc25hbWUsIGNvbW5hbWUpCi0gICAgIGNoYXIgKnJlc25hbWU7Ci0gICAgIGNoYXIgKmNvbW5hbWU7Ci17Ci0gIHNldF9wZV92YWx1ZSAocmVzbmFtZSk7Ci0gIAotICBpZiAoKm9wdGFyZyA9PSAnLCcpCi0gICAgewotICAgICAgb3B0YXJnKys7Ci0gICAgICBzZXRfcGVfdmFsdWUgKGNvbW5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wdGFyZykKLSAgICBlaW5mbyAoXygiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIpLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIGludAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGludCBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50IHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIHdhbnRlcnJvciA9IG9wdGVycjsKLQotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotICAgICAgbGlua19pbmZvLmJhc2VfZmlsZSA9IChQVFIpIGZvcGVuIChvcHRhcmcsIEZPUEVOX1dCKTsKLSAgICAgIGlmIChsaW5rX2luZm8uYmFzZV9maWxlID09IE5VTEwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gYmFzZSBmaWxlICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBQRSBvcHRpb25zICovCi0gICAgY2FzZSBPUFRJT05fSEVBUDogCi0gICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsICJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1RBQ0s6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VCU1lTVEVNOgotICAgICAgc2V0X3BlX3N1YnN5c3RlbSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfb3NfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9GSUxFX0FMSUdOTUVOVDoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fZmlsZV9hbGlnbm1lbnRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX3NlY3Rpb25fYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RMTDoKLSAgICAgIHNldF9wZV9uYW1lICgiX19kbGxfXyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9faW1hZ2VfYmFzZV9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFOgotICAgICAgc3VwcG9ydF9vbGRfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9USFVNQl9FTlRSWToKLSAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotI2lmZGVmIERMTF9TVVBQT1JUCi0gICAgY2FzZSBPUFRJT05fT1VUX0RFRjoKLSAgICAgIHBlX291dF9kZWZfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRVhQT1JUX0FMTDoKLSAgICAgIHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FWENMVURFX1NZTUJPTFM6Ci0gICAgICBwZV9kbGxfYWRkX2V4Y2x1ZGVzIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fS0lMTF9BVFM6Ci0gICAgICBwZV9kbGxfa2lsbF9hdHMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTOgotICAgICAgcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUDoKLSAgICAgIHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUDoKLSAgICAgIHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0lNUExJQl9GSUxFTkFNRToKLSAgICAgIHBlX2ltcGxpYl9maWxlbmFtZSA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0MCi0vKiBBc3NpZ24gdmFsdWVzIHRvIHRoZSBzcGVjaWFsIHN5bWJvbHMgYmVmb3JlIHRoZSBsaW5rZXIgc2NyaXB0IGlzCi0gICByZWFkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyAoKQotewotICAvKiBSdW4gdGhyb3VnaCBhbmQgaW52ZW50IHN5bWJvbHMgZm9yIGFsbCB0aGUKLSAgICAgbmFtZXMgYW5kIGluc2VydCB0aGUgZGVmYXVsdHMuICovCi0gIGludCBqOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnNhdmU7Ci0KLSAgaWYgKCFpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkKQotICAgIHsKLSAgICAgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlIGlmIChpbml0W0RMTE9GRl0udmFsdWUgfHwgbGlua19pbmZvLnNoYXJlZCkKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBOVF9ETExfSU1BR0VfQkFTRTsKLSAgICAgIGVsc2UKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBOVF9FWEVfSU1BR0VfQkFTRTsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgZG8gYW55IHN5bWJvbCBhc3NpZ25tZW50cyBpZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgLyogR2x1ZSB0aGUgYXNzaWdubWVudHMgaW50byB0aGUgYWJzIHNlY3Rpb24gKi8KLSAgc2F2ZSA9IHN0YXRfcHRyOwotCi0gIHN0YXRfcHRyID0gJihhYnNfb3V0cHV0X3NlY3Rpb24tPmNoaWxkcmVuKTsKLQotICBmb3IgKGogPSAwOyBpbml0W2pdLnB0cjsgaisrKQotICAgIHsKLSAgICAgIGxvbmcgdmFsID0gaW5pdFtqXS52YWx1ZTsKLSAgICAgIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqcnY7Ci0gICAgICBydiA9IGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nICxpbml0W2pdLnN5bWJvbCwgZXhwX2ludG9wICh2YWwpKSk7Ci0gICAgICBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihzaG9ydCkpCi0JKihzaG9ydCAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihpbnQpKQotCSooaW50ICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGxvbmcpKQotCSoobG9uZyAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgLyogVGhpcyBtaWdodCBiZSBhIGxvbmcgbG9uZyBvciBvdGhlciBzcGVjaWFsIHR5cGUuICAqLwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihiZmRfdm1hKSkKLQkqKGJmZF92bWEgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UJYWJvcnQoKTsKLSAgICAgIGlmIChqID09IElNQUdFQkFTRU9GRikKLQlpbWFnZV9iYXNlX3N0YXRlbWVudCA9IHJ2OwotICAgIH0KLSAgLyogUmVzdG9yZSB0aGUgcG9pbnRlci4gKi8KLSAgc3RhdF9wdHIgPSBzYXZlOwotICAKLSAgaWYgKHBlLkZpbGVBbGlnbm1lbnQgPgotICAgICAgcGUuU2VjdGlvbkFsaWdubWVudCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmcsIGZpbGUgYWxpZ25tZW50ID4gc2VjdGlvbiBhbGlnbm1lbnQuXG4iKSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgbGlua2VyIHNjcmlwdCBhbmQgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zCi0gICBoYXZlIGJlZW4gcmVhZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UgKCkKLXsKLSAgLyogVGhlIFdpbmRvd3MgbGlicmFyaWVzIGFyZSBkZXNpZ25lZCBmb3IgdGhlIGxpbmtlciB0byB0cmVhdCB0aGUKLSAgICAgZW50cnkgcG9pbnQgYXMgYW4gdW5kZWZpbmVkIHN5bWJvbC4gIE90aGVyd2lzZSwgdGhlIC5vYmogdGhhdAotICAgICBkZWZpbmVzIG1haW5DUlRTdGFydHVwIGlzIGJyb3VnaHQgaW4gYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QKLSAgICAgZW5jb3VudGVyZWQgaW4gbGliYy5saWIgYW5kIGl0IGhhcyBvdGhlciBzeW1ib2xzIGluIGl0IHdoaWNoIHdpbGwKLSAgICAgYmUgcHVsbGVkIGluIGJ5IHRoZSBsaW5rIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBhY3QgYXMKLSAgICAgdGhvdWdoIHRoZSB1c2VyIHNwZWNpZmllZCAtdSB3aXRoIHRoZSBlbnRyeSBwb2ludCBzeW1ib2wuCi0KLSAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxpbmtlciBzY3JpcHQgYW5kIGNvbW1hbmQgbGluZQotICAgICBvcHRpb25zIGhhdmUgYmVlbiByZWFkLCBzbyBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIHJpZ2h0IGVudHJ5Ci0gICAgIHBvaW50LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBpbnB1dCBmaWxlcyBhcmUKLSAgICAgb3BlbmVkLCBzbyByZWdpc3RlcmluZyB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCB3aWxsIG1ha2UgYQotICAgICBkaWZmZXJlbmNlLiAgKi8KLQotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmIGVudHJ5X3N5bWJvbCAhPSBOVUxMKQotICAgIGxkbGFuZ19hZGRfdW5kZWYgKGVudHJ5X3N5bWJvbCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqcGVfdW5kZWZfZm91bmRfc3ltOwotCi1zdGF0aWMgYm9vbGVhbgotcGVfdW5kZWZfY2RlY2xfbWF0Y2ggKGgsIHN0cmluZykKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIFBUUiBzdHJpbmc7Ci17Ci0gIGludCBzbCA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiBzdHJuY21wIChoLT5yb290LnN0cmluZywgc3RyaW5nLCBzbCkgPT0gMAotICAgICAgJiYgaC0+cm9vdC5zdHJpbmdbc2xdID09ICdAJykKLSAgewotICAgIHBlX3VuZGVmX2ZvdW5kX3N5bSA9IGg7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotcGVfZml4dXBfc3RkY2FsbHMgKCkKLXsKLSAgc3RhdGljIGludCBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDA7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZiwgKnN5bTsKLSAgY2hhciAqYXQ7Ci0gIGZvciAodW5kZWYgPSBsaW5rX2luZm8uaGFzaC0+dW5kZWZzOyB1bmRlZjsgdW5kZWY9dW5kZWYtPm5leHQpCi0gICAgaWYgKHVuZGVmLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotICAgIHsKLSAgICAgIGF0ID0gc3RyY2hyICh1bmRlZi0+cm9vdC5zdHJpbmcsICdAJyk7Ci0gICAgICBpZiAoYXQpCi0gICAgICB7Ci0JLyogVGhlIHN5bWJvbCBpcyBhIHN0ZGNhbGwgc3ltYm9sLCBzbyBsZXQncyBsb29rIGZvciBhIGNkZWNsCi0JICAgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgcmVzb2x2ZSB0byB0aGF0ICovCi0JY2hhciAqY25hbWUgPSB4c3RyZHVwICh1bmRlZi0+cm9vdC5zdHJpbmcpOwotCWF0ID0gc3RyY2hyIChjbmFtZSwgJ0AnKTsKLQkqYXQgPSAwOwotCXN5bSA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgY25hbWUsIDAsIDAsIDEpOwotCWlmIChzeW0gJiYgc3ltLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQl7Ci0JICB1bmRlZi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIHVuZGVmLT51LmRlZi52YWx1ZSA9IHN5bS0+dS5kZWYudmFsdWU7Ci0JICB1bmRlZi0+dS5kZWYuc2VjdGlvbiA9IHN5bS0+dS5kZWYuc2VjdGlvbjsKLQkgIGlmIChwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9PSAtMSkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCJXYXJuaW5nOiByZXNvbHZpbmcgJXMgYnkgbGlua2luZyB0byAlc1xuIiksCi0JCSAgICAgdW5kZWYtPnJvb3Quc3RyaW5nLCBjbmFtZSk7Ci0JICAgICAgaWYgKCEgZ2F2ZV93YXJuaW5nX21lc3NhZ2UpCi0JCXsKLQkJICBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDE7Ci0JCSAgZWluZm8oXygiVXNlIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSB3YXJuaW5nc1xuIikpOwotCQkgIGVpbmZvKF8oIlVzZSAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIGZpeHVwc1xuIikpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JLyogVGhlIHN5bWJvbCBpcyBhIGNkZWNsIHN5bWJvbCwgc28gd2UgbG9vayBmb3Igc3RkY2FsbAotCSAgIHN5bWJvbHMgLSB3aGljaCBtZWFucyBzY2FubmluZyB0aGUgd2hvbGUgc3ltYm9sIHRhYmxlICovCi0JcGVfdW5kZWZfZm91bmRfc3ltID0gMDsKLQliZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgcGVfdW5kZWZfY2RlY2xfbWF0Y2gsCi0JCQkJKFBUUikgdW5kZWYtPnJvb3Quc3RyaW5nKTsKLQlzeW0gPSBwZV91bmRlZl9mb3VuZF9zeW07Ci0JaWYgKHN5bSkKLQl7Ci0JICB1bmRlZi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIHVuZGVmLT51LmRlZi52YWx1ZSA9IHN5bS0+dS5kZWYudmFsdWU7Ci0JICB1bmRlZi0+dS5kZWYuc2VjdGlvbiA9IHN5bS0+dS5kZWYuc2VjdGlvbjsKLQkgIGlmIChwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9PSAtMSkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCJXYXJuaW5nOiByZXNvbHZpbmcgJXMgYnkgbGlua2luZyB0byAlc1xuIiksCi0JCSAgICAgdW5kZWYtPnJvb3Quc3RyaW5nLCBzeW0tPnJvb3Quc3RyaW5nKTsKLQkgICAgICBpZiAoISBnYXZlX3dhcm5pbmdfbWVzc2FnZSkKLQkJewotCQkgIGdhdmVfd2FybmluZ19tZXNzYWdlID0gMTsKLQkJICBlaW5mbyhfKCJVc2UgLS1lbmFibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIHdhcm5pbmdzXG4iKSk7Ci0JCSAgZWluZm8oXygiVXNlIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2UgZml4dXBzXG4iKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICAvKiBQYXNzIHRoZSB3YWNreSBQRSBjb21tYW5kIGxpbmUgb3B0aW9ucyBpbnRvIHRoZSBvdXRwdXQgYmZkLgotICAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgYSBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYnkKLSAgICAgaW5jbHVkaW5nIGFuIGludGVybmFsIEJGRCBoZWFkZXIuICAqLwotICAKLSAgaWYgKCFjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICBlaW5mbyAoXygiJUYlUDogUEUgb3BlcmF0aW9ucyBvbiBub24gUEUgZmlsZS5cbiIpKTsKLQotICBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyID0gcGU7Ci0gIHBlX2RhdGEgKG91dHB1dF9iZmQpLT5kbGwgPSBpbml0W0RMTE9GRl0udmFsdWU7Ci0KLSNpZmRlZiBETExfU1VQUE9SVAotICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXApIC8qIC0xPXdhcm4gb3IgMT1kaXNhYmxlICovCi0gICAgcGVfZml4dXBfc3RkY2FsbHMgKCk7Ci0KLSAgcGVfcHJvY2Vzc19pbXBvcnRfZGVmcyhvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcGVfZGxsX2J1aWxkX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKQotICBpZiAoc3Ryc3RyIChiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCksICJhcm0iKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBhcm0gYmFja2VuZCBuZWVkcyBzcGVjaWFsIGZpZWxkcyBpbiB0aGUgb3V0cHV0IGhhc2ggc3RydWN0dXJlLgotCSBUaGVzZSB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBhbiBhcm0gZm9ybWF0LAotCSBoZW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBsaW5raW5nIGFuZCBjaGFuZ2luZyBvdXRwdXQgZm9ybWF0cyBhdCB0aGUKLQkgc2FtZSB0aW1lLiAgVXNlIGEgbGluayBmb2xsb3dlZCBieSBvYmpjb3B5IHRvIGNoYW5nZSBvdXRwdXQgZm9ybWF0cy4gICovCi0gICAgICBlaW5mbyAoIiVGJVglUDogZXJyb3I6IGNhbm5vdCBjaGFuZ2Ugb3V0cHV0IGZvcm1hdCB3aGlsc3QgbGlua2luZyBBUk0gYmluYXJpZXNcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgewotICAgIC8qIEZpbmQgYSBCRkQgdGhhdCBjYW4gaG9sZCB0aGUgaW50ZXJ3b3JraW5nIHN0dWJzLiAgKi8KLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKGJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pKQotCSAgYnJlYWs7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHsKLSAgICBzdGF0aWMgaW50IHNlcXVlbmNlID0gMDsKLSAgICBpbnQgaXNfbXNfYXJjaDsKLSAgICBiZmQgKmN1cl9hcmNoID0gMCwgKmVsdDsKLSAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppczI7Ci0gICAgLyogQ2FyZWZ1bCAtIHRoaXMgaXMgYSBzaGVsbCBzY3JpcHQuICBXYXRjaCB0aG9zZSBkb2xsYXIgc2lnbnMhICovCi0gICAgLyogTWljcm9zb2Z0IGltcG9ydCBsaWJyYXJpZXMgaGF2ZSBldmVyeSBtZW1iZXIgbmFtZWQgdGhlIHNhbWUsCi0gICAgICAgYW5kIG5vdCBpbiB0aGUgcmlnaHQgb3JkZXIgZm9yIHVzIHRvIGxpbmsgdGhlbSBjb3JyZWN0bHkuICBXZQotICAgICAgIG11c3QgZGV0ZWN0IHRoZXNlIGFuZCByZW5hbWUgdGhlIG1lbWJlcnMgc28gdGhhdCB0aGV5J2xsIGxpbmsKLSAgICAgICBjb3JyZWN0bHkuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb2JqZWN0czogdGhlIGhlYWQsIHRoZQotICAgICAgIHRodW5rcywgYW5kIHRoZSBzZW50aW5lbChzKS4gIFRoZSBoZWFkIGlzIGVhc3k7IGl0J3MgdGhlIG9uZQotICAgICAgIHdpdGggaWRhdGEyLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlbnRpbmVscyB3b24ndCBoYXZlIHJlbG9jcywKLSAgICAgICBhbmQgdGhlIHRodW5rcyB3aWxsLiAgSXQncyBlYXNpZXIgdGhhbiBjaGVja2luZyB0aGUgc3ltYm9sCi0gICAgICAgdGFibGUgZm9yIGV4dGVybmFsIHJlZmVyZW5jZXMuICovCi0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmIChpcy0+dGhlX2JmZC0+bXlfYXJjaGl2ZSkKLQkgIHsKLQkgICAgYmZkICphcmNoID0gaXMtPnRoZV9iZmQtPm15X2FyY2hpdmU7Ci0JICAgIGlmIChjdXJfYXJjaCAhPSBhcmNoKQotCSAgICAgIHsKLQkJY3VyX2FyY2ggPSBhcmNoOwotCQlpc19tc19hcmNoID0gMTsKLQkJZm9yIChpczIgPSBpczsKLQkJICAgICBpczIgJiYgaXMyLT50aGVfYmZkLT5teV9hcmNoaXZlID09IGFyY2g7Ci0JCSAgICAgaXMyID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKilpczItPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHN0cmNtcCAoaXMtPnRoZV9iZmQtPmZpbGVuYW1lLCBpczItPnRoZV9iZmQtPmZpbGVuYW1lKSkKLQkJICAgICAgaXNfbXNfYXJjaCA9IDA7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoaXNfbXNfYXJjaCkKLQkgICAgICB7Ci0JCWludCBpZGF0YTIgPSAwLCBpLCByZWxvY19jb3VudD0wOwotCQlhc2VjdGlvbiAqc2VjOwotCQljaGFyICpuZXdfbmFtZSwgc2VxOwotCQlmb3IgKHNlYyA9IGlzLT50aGVfYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmlkYXRhXCQyIikgPT0gMCkKLQkJICAgICAgaWRhdGEyID0gMTsKLQkJICAgIHJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0JCSAgfQotCi0JCWlmIChpZGF0YTIpIC8qIC5pZGF0YTIgaXMgdGhlIFRPQyAqLwotCQkgIHNlcSA9ICdhJzsKLQkJZWxzZSBpZiAocmVsb2NfY291bnQgPiAwKSAvKiB0aHVua3MgKi8KLQkJICBzZXEgPSAnYic7Ci0JCWVsc2UgLyogc2VudGluZWwgKi8KLQkJICBzZXEgPSAnYyc7Ci0KLQkJbmV3X25hbWUgPSBiZmRfYWxsb2MgKGlzLT50aGVfYmZkLAotCQkJCSAgICAgIHN0cmxlbiAoaXMtPnRoZV9iZmQtPmZpbGVuYW1lKSsyKTsKLQkJc3ByaW50ZiAobmV3X25hbWUsICIlcy4lYyIsIGlzLT50aGVfYmZkLT5maWxlbmFtZSwgc2VxKTsKLQkJaXMtPnRoZV9iZmQtPmZpbGVuYW1lID0gbmV3X25hbWU7Ci0KLQkJbmV3X25hbWUgPSBiZmRfYWxsb2MoaXMtPnRoZV9iZmQsIHN0cmxlbihpcy0+ZmlsZW5hbWUpKzIpOwotCQlzcHJpbnRmIChuZXdfbmFtZSwgIiVzLiVjIiwgaXMtPmZpbGVuYW1lLCBzZXEpOwotCQlpcy0+ZmlsZW5hbWUgPSBuZXdfbmFtZTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLX0KLQwKLXN0YXRpYyB2b2lkICAKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci0jaWZkZWYgVEFSR0VUX0lTX3BwY3BlCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgdG9jIGluZm9ybWF0aW9uICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoJmxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX3BwY3BlICovCi0KLSNpZiBkZWZpbmVkKFRBUkdFVF9JU19hcm1wZSkgfHwgZGVmaW5lZChUQVJHRVRfSVNfYXJtX2Vwb2NfcGUpCi0gIC8qIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViCi0gICAgIHNlY3Rpb24uCi0KLSAgICAgSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlCi0gICAgIGluZm9ybWF0aW9uLiAgRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lCi0gICAgIG9wdGlvbj8gIGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCEgYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0JICAgIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8sIHN1cHBvcnRfb2xkX2NvZGUpKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyBmb3IgaW50ZXJ3b3JraW5nIiksCi0JCSAgIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9hcm1fcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX2FybXBlICovCi19Ci0MCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBpc24ndCByZWNvZ25pemVkIGFzIGEgQkZELiAgV2UKLSAgIGNoZWNrIGhlcmUgZm9yIC5ERUYgZmlsZXMgYW5kIHB1bGwgdGhlbSBpbiBhdXRvbWF0aWNhbGx5LiAqLwotCi1zdGF0aWMgaW50Ci1zYXdfb3B0aW9uKGNoYXIgKm9wdGlvbikKLXsKLSAgaW50IGk7Ci0gIGZvciAoaT0wOyBpbml0W2ldLnB0cjsgaSsrKQotICAgIGlmIChzdHJjbXAgKGluaXRbaV0uc3ltYm9sLCBvcHRpb24pID09IDApCi0gICAgICByZXR1cm4gaW5pdFtpXS5pbml0ZWQ7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlKGVudHJ5KQotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSNpZmRlZiBETExfU1VQUE9SVAotICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotCi0gIGlmIChzdHJjbXAgKGV4dCwgIi5kZWYiKSA9PSAwIHx8IHN0cmNtcCAoZXh0LCAiLkRFRiIpID09IDApCi0gIHsKLSAgICBpZiAocGVfZGVmX2ZpbGUgPT0gMCkKLSAgICAgIHBlX2RlZl9maWxlID0gZGVmX2ZpbGVfZW1wdHkgKCk7Ci0gICAgZGVmX2ZpbGVfcGFyc2UgKGVudHJ5LT5maWxlbmFtZSwgcGVfZGVmX2ZpbGUpOwotICAgIGlmIChwZV9kZWZfZmlsZSkKLSAgICB7Ci0gICAgICBpbnQgaSwgYnVmbGVuPTAsIGxlbjsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGxlbiA9IHN0cmxlbihwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgIGlmIChidWZsZW4gPCBsZW4rMikKLQkgICAgYnVmbGVuID0gbGVuKzI7Ci0JfQotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmbGVuKTsKLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgc3ByaW50ZihidWYsICJfJXMiLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgYnVmLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICAgICAgaC0+dS51bmRlZi5hYmZkID0gTlVMTDsKLQkgICAgICBiZmRfbGlua19hZGRfdW5kZWYgKGxpbmtfaW5mby5oYXNoLCBoKTsKLQkgICAgfQotCX0KLSAgICAgIGZyZWUgKGJ1Zik7Ci0KLSAgICAgIC8qIGRlZl9maWxlX3ByaW50IChzdGRvdXQsIHBlX2RlZl9maWxlKTsgKi8KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+aXNfZGxsID09IDEpCi0JbGlua19pbmZvLnNoYXJlZCA9IDE7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+YmFzZV9hZGRyZXNzICE9IChiZmRfdm1hKSgtMSkpCi0gICAgICB7Ci0JcGUuSW1hZ2VCYXNlID0KLQlwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSA9Ci0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gcGVfZGVmX2ZpbGUtPmJhc2VfYWRkcmVzczsKLQlpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkID0gMTsKLQlpZiAoaW1hZ2VfYmFzZV9zdGF0ZW1lbnQpCi0JICBpbWFnZV9iYXNlX3N0YXRlbWVudC0+ZXhwID0KLQkgICAgZXhwX2Fzc29wICgnPScsICJfX2ltYWdlX2Jhc2VfXyIsIGV4cF9pbnRvcCAocGUuSW1hZ2VCYXNlKSk7Ci0gICAgICB9Ci0KLSNpZiAwCi0gICAgICAvKiBOb3Qgc3VyZSBpZiB0aGVzZSAqc2hvdWxkKiBiZSBzZXQgKi8KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLSAgICAgIHsKLQlwZS5NYWpvckltYWdlVmVyc2lvbiA9IHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yOwotCXBlLk1pbm9ySW1hZ2VWZXJzaW9uID0gcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3I7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSAhPSAtMQotCSAgJiYgISBzYXdfb3B0aW9uICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIpKQotICAgICAgewotCXBlLlNpemVPZlN0YWNrUmVzZXJ2ZSA9IHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlOwotCWlmIChwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0ICE9IC0xKQotCSAgcGUuU2l6ZU9mU3RhY2tDb21taXQgPSBwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0OwotICAgICAgfQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUgIT0gLTEKLQkgICYmICEgc2F3X29wdGlvbiAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIpKQotICAgICAgewotCXBlLlNpemVPZkhlYXBSZXNlcnZlID0gcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZTsKLQlpZiAocGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0ICE9IC0xKQotCSAgcGUuU2l6ZU9mSGVhcENvbW1pdCA9IHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdDsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLSAgCi19Ci0KLXN0YXRpYyBib29sZWFuCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fcmVjb2duaXplZF9maWxlKGVudHJ5KQotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSNpZmRlZiBETExfU1VQUE9SVAotI2lmZGVmIFRBUkdFVF9JU19pMzg2cGUKLSAgcGVfZGxsX2lkX3RhcmdldCAoInBlaS1pMzg2Iik7Ci0jZW5kaWYKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCkgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotICAgICAgaWYgKHN0cmNtcCAoZXh0LCAiLmRsbCIpID09IDAgfHwgc3RyY21wIChleHQsICIuRExMIikgPT0gMCkKLQlyZXR1cm4gcGVfaW1wbGllZF9pbXBvcnRfZGxsIChlbnRyeS0+ZmlsZW5hbWUpOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoICgpCi17Ci0jaWYgZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKQotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLSAgaWYgKHRodW1iX2VudHJ5X3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHRodW1iX2VudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIAotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBzdGF0aWMgY2hhciBidWZmZXJbMzJdOwotCSAgYmZkX3ZtYSB2YWw7Ci0JICAKLQkgIC8qIFNwZWNpYWwgcHJvY2VzaW5nIGlzIHJlcXVpcmVkIGZvciBhIFRodW1iIGVudHJ5IHN5bWJvbC4gIFRoZQotCSAgICAgYm90dG9tIGJpdCBvZiBpdHMgYWRkcmVzcyBtdXN0IGJlIHNldC4gICovCi0JICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkJaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgCi0JICB2YWwgfD0gMTsKLQkgIAotCSAgLyogTm93IGNvbnZlcnQgdGhpcyB2YWx1ZSBpbnRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiBlbnRyeV9zeW1ib2wKLQkgICAgIHdoZXJlIHRoZSBsYW5nX2ZpbmlzaCgpIGZ1bmN0aW9uIHdpbGwgcGljayBpdCB1cC4gICovCi0JICBidWZmZXJbMF0gPSAnMCc7Ci0JICBidWZmZXJbMV0gPSAneCc7Ci0JICAKLQkgIHNwcmludGZfdm1hIChidWZmZXIgKyAyLCB2YWwpOwotCSAgCi0JICBpZiAoZW50cnlfc3ltYm9sICE9IE5VTEwgJiYgZW50cnlfZnJvbV9jbWRsaW5lKQotCSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIpLAotCQkgICB0aHVtYl9lbnRyeV9zeW1ib2wsIGVudHJ5X3N5bWJvbCk7Ci0JICBlbnRyeV9zeW1ib2wgPSBidWZmZXI7Ci0JfQotICAgICAgZWxzZQotCWVpbmZvIChfKCIlUDogd2FybmluZzogY29ubm90IGZpbmQgdGh1bWIgc3RhcnQgc3ltYm9sICVzXG4iKSwgdGh1bWJfZW50cnlfc3ltYm9sKTsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKSAqLwotCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgewotICAgICAgcGVfZGxsX2ZpbGxfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICAgICAgaWYgKHBlX2ltcGxpYl9maWxlbmFtZSkKLQlwZV9kbGxfZ2VuZXJhdGVfaW1wbGliIChwZV9kZWZfZmlsZSwgcGVfaW1wbGliX2ZpbGVuYW1lKTsKLSAgICB9Ci0gIGlmIChwZV9vdXRfZGVmX2ZpbGVuYW1lKQotICAgIHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSAocGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0jZW5kaWYKLX0KLQotDAotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uCi0KLSAgIFdlIHVzZSB0aGlzIHRvIHB1dCBzZWN0aW9ucyBpbiBhIHJlYXNvbmFibGUgcGxhY2UgaW4gdGhlIGZpbGUsIGFuZAotICAgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgYWxpZ25lZCBhcyByZXF1aXJlZC4KLQotICAgV2UgaGFuZGxlIGdyb3VwZWQgc2VjdGlvbnMgaGVyZSBhcyB3ZWxsLiAgQSBzZWN0aW9uIG5hbWVkIC5mb28kbm4KLSAgIGdvZXMgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gLmZvby4gIEFsbCBncm91cGVkIHNlY3Rpb25zIGFyZSBzb3J0ZWQKLSAgIGJ5IG5hbWUuCi0KLSAgIEdyb3VwZWQgc2VjdGlvbnMgZm9yIHRoZSBkZWZhdWx0IHNlY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZQotICAgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IHVzaW5nIHdpbGRjYXJkcywgYW5kIGFyZSBzb3J0ZWQgYnkKLSAgIHNvcnRfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBjaGFyICpob2xkX3NlY3Rpb25fbmFtZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci0KLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHJhbmRvbSBTSEZfQUxMT0MKLSAgIHNlY3Rpb25zIGluIHRoZSByaWdodCBzZWdtZW50LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gIGNoYXIgKmRvbGxhcjsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLQotICBob2xkX3NlY3Rpb24gPSBzOwotCi0gIGhvbGRfc2VjdGlvbl9uYW1lID0geHN0cmR1cCAoc2VjbmFtZSk7Ci0gIGRvbGxhciA9IHN0cmNociAoaG9sZF9zZWN0aW9uX25hbWUsICckJyk7Ci0gIGlmIChkb2xsYXIgIT0gTlVMTCkKLSAgICAqZG9sbGFyID0gJ1wwJzsKLQotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgICAgIGNoYXIgKm91dHNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gICAgICBldHJlZV90eXBlICphZGRyZXNzOwotCi0gICAgICAvKiBUcnkgdG8gcHV0IHRoZSBuZXcgb3V0cHV0IHNlY3Rpb24gaW4gYSByZWFzb25hYmxlIHBsYWNlIGJhc2VkCi0JIG9uIHRoZSBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICAqLwotICAgICAgcGxhY2UgPSBOVUxMOwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX2JzczsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICAgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLQlwbGFjZSA9IGhvbGRfZGF0YTsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgICAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICAgICAmJiBob2xkX3JkYXRhICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX3JkYXRhOwotICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotCXBsYWNlID0gaG9sZF90ZXh0OwotCi0gICAgICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmCi0JIHRoZSBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGgKLQkgZGlmZmVyZW50IGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICAgICAgb3V0c2VjbmFtZSA9IHhzdHJkdXAgKGhvbGRfc2VjdGlvbl9uYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSkgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgY2hhciAqbmV3bmFtZTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBsZW4gPSBzdHJsZW4gKG91dHNlY25hbWUpOwotCSAgbmV3bmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotCSAgc3RyY3B5IChuZXduYW1lLCBvdXRzZWNuYW1lKTsKLQkgIGkgPSAwOwotCSAgZG8KLQkgICAgewotCSAgICAgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgICAgICsraTsKLQkgICAgfQotCSAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotCSAgZnJlZSAob3V0c2VjbmFtZSk7Ci0JICBvdXRzZWNuYW1lID0gbmV3bmFtZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gZnJlZSBPVVRTRUNOQU1FLCBhcyBpdCBtYXkgZ2V0IGF0dGFjaGVkIHRvCi0JIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnQuICAqLwotCi0gICAgICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZQotCSByaWdodCBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sKLQkgbmVhdGVyLiAgKi8KLSAgICAgIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKTsKLSAgICAgIGlmIChzbmV3ID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICAgICAgaWYgKHBsYWNlICE9IE5VTEwgJiYgcGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQkgICAgOwotCSAgKnBwcyA9IHNuZXctPm5leHQ7Ci0JICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotCSAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLQl9Ci0KLSAgICAgIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgb2xkID0gc3RhdF9wdHI7Ci0gICAgICBzdGF0X3B0ciA9ICZhZGQ7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlhZGRyZXNzID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGwgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gYSBwYWdlCi0JICAgICBib3VuZGFyeS4gICovCi0JICBhZGRyZXNzID0gZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiX19zZWN0aW9uX2FsaWdubWVudF9fIikpOwotCX0KLQotICAgICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJCSAgIChiZmRfdm1hKSAwLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICAgICAgaG9sZF91c2UgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotCi0gICAgICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotCSgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsCi0JIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7Ci0KLSAgICAgIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgICAgIGlmIChwbGFjZSAhPSBOVUxMKQotCXsKLQkgICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLQkgIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCX0KLQotICAgICAgc3RhdF9wdHIgPSBvbGQ7Ci0gICAgfQotCi0gIGlmIChkb2xsYXIgPT0gTlVMTCkKLSAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwbDsKLSAgICAgIGJvb2xlYW4gZm91bmRfZG9sbGFyOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGxpc3Q7Ci0KLSAgICAgIC8qIFRoZSBzZWN0aW9uIG5hbWUgaGFzIGEgJyQnLiAgU29ydCBpdCB3aXRoIHRoZSBvdGhlciAnJCcKLSAgICAgICAgIHNlY3Rpb25zLiAgKi8KLQotICAgICAgZm91bmRfZG9sbGFyID0gZmFsc2U7Ci0gICAgICBmb3IgKHBsID0gJmhvbGRfdXNlLT5jaGlsZHJlbi5oZWFkOyAqcGwgIT0gTlVMTDsgcGwgPSAmKCpwbCktPm5leHQpCi0JewotCSAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmxzOwotCSAgY29uc3QgY2hhciAqbG5hbWU7Ci0KLQkgIGlmICgoKnBsKS0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBscyA9ICYoKnBsKS0+aW5wdXRfc2VjdGlvbjsKLQotCSAgbG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobHMtPmlmaWxlLT50aGVfYmZkLCBscy0+c2VjdGlvbik7Ci0JICBpZiAoc3RyY2hyIChsbmFtZSwgJyQnKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGZvdW5kX2RvbGxhcikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZvdW5kX2RvbGxhciA9IHRydWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjbmFtZSwgbG5hbWUpIDwgMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbGlzdCk7Ci0gICAgICB3aWxkX2RvaXQgKCZsaXN0LCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICBpZiAobGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgQVNTRVJUIChsaXN0LmhlYWQtPm5leHQgPT0gTlVMTCk7Ci0JICBsaXN0LmhlYWQtPm5leHQgPSAqcGw7Ci0JICAqcGwgPSBsaXN0LmhlYWQ7Ci0JfQotICAgIH0KLQotICBmcmVlIChob2xkX3NlY3Rpb25fbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb25fbmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJkYXRhIikgPT0gMCkKLSAgICBob2xkX3JkYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotfQotDAotc3RhdGljIGNoYXIgKgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3JlY29nbml6ZWRfZmlsZQotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQgYi9sZC9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyNmQzZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMSBzL14vIi8KLSQgcy8kL24iLwpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N1bm9zLmVtIGIvbGQvZW11bHRlbXBsL3N1bm9zLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE1YzAxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9zdW5vcy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDEgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBTdW5PUyBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi0jaWZkZWYgSEFWRV9ESVJFTlRfSAotIyBpbmNsdWRlIDxkaXJlbnQuaD4KLSNlbHNlCi0jIGRlZmluZSBkaXJlbnQgZGlyZWN0Ci0jIGlmZGVmIEhBVkVfU1lTX05ESVJfSAotIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9TWVNfRElSX0gKLSMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9ORElSX0gKLSMgIGluY2x1ZGUgPG5kaXIuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbwotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NvdW50X25lZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfbmVlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotICBjb25maWcuaGFzX3NoYXJlZCA9IHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQsCi0gICBidXQgYmVmb3JlIHRoZSBsaW5rZXIgc2NyaXB0IGhhcyBiZWVuIHJlYWQuICBJZiB0aGlzIGlzIGEgbmF0aXZlCi0gICBsaW5rZXIsIHdlIGFkZCB0aGUgZGlyZWN0b3JpZXMgaW4gTERfTElCUkFSWV9QQVRIIHRvIHRoZSBzZWFyY2gKLSAgIGxpc3QuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgKCkKLXsKLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgY29uc3QgY2hhciAqZW52OwotCi0gIGVudiA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpOwotICBpZiAoZW52ICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqbDsKLQotICAgICAgbCA9IHhzdHJkdXAgKGVudik7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBjaGFyICpjOwotCi0JICBjID0gc3RyY2hyIChsLCAnOicpOwotCSAgaWYgKGMgIT0gTlVMTCkKLQkgICAgKmMrKyA9ICdcMCc7Ci0JICBpZiAoKmwgIT0gJ1wwJykKLQkgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGwsIGZhbHNlKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgbCA9IGM7Ci0JfQotICAgIH0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLX0KLQotLyogRGVzcGl0ZSB0aGUgbmFtZSwgd2UgdXNlIHRoaXMgcm91dGluZSB0byBzZWFyY2ggZm9yIGR5bmFtaWMKLSAgIGxpYnJhcmllcy4gIE9uIFN1bk9TIHRoaXMgcmVxdWlyZXMgYSBkaXJlY3Rvcnkgc2VhcmNoLiAgV2UgbmVlZCB0bwotICAgZmluZCB0aGUgLnNvIGZpbGUgd2l0aCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlci4gIFRoZSB1c2VyIG1heQotICAgcmVzdHJpY3QgdGhlIG1ham9yIHZlcnNpb24gYnkgc2F5aW5nLCBlLmcuLCAtbGMuMS4gIEFsc28sIGlmIHdlCi0gICBmaW5kIGEgLnNvIGZpbGUsIHdlIG5lZWQgdG8gbG9vayBmb3IgYSB0aGUgc2FtZSBmaWxlIGFmdGVyCi0gICByZXBsYWNpbmcgLnNvIHdpdGggLnNhOyBpZiBpdCBleGlzdHMsIGl0IHdpbGwgYmUgYW4gYXJjaGl2ZSB3aGljaAotICAgcHJvdmlkZSBzb21lIGluaXRpYWxpemF0aW9ucyBmb3IgZGF0YSBzeW1ib2xzLCBhbmQgd2UgbmVlZCB0bwotICAgc2VhcmNoIGl0IGFmdGVyIGluY2x1ZGluZyB0aGUgLnNvIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCkKLXsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTsKLX0KLQotLyogU2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIGEgLnNvIGZpbGUgZm9yIGVhY2ggbGlicmFyeSBzZWFyY2guICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyAoaW5wKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppbnA7Ci17Ci0gIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgY2hhciAqZm91bmQgPSBOVUxMOwotICBjaGFyICphbGM7Ci0gIHN0cnVjdCBzdGF0IHN0OwotCi0gIGlmICghIGlucC0+c2VhcmNoX2RpcnNfZmxhZwotICAgICAgfHwgISBpbnAtPmlzX2FyY2hpdmUKLSAgICAgIHx8ICEgaW5wLT5keW5hbWljKQotICAgIHJldHVybjsKLQotICBBU1NFUlQgKHN0cm5jbXAgKGlucC0+bG9jYWxfc3ltX25hbWUsICItbCIsIDIpID09IDApOwotCi0gIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0gICAgewotICAgICAgYm9vbGVhbiBmb3VuZF9zdGF0aWM7Ci0KLSAgICAgIGZvdW5kID0gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2RpciAoc2VhcmNoLT5uYW1lLCBpbnAtPmZpbGVuYW1lLAotCQkJCQkgICAgICAgJmZvdW5kX3N0YXRpYyk7Ci0gICAgICBpZiAoZm91bmQgIT0gTlVMTCB8fCBmb3VuZF9zdGF0aWMpCi0JYnJlYWs7Ci0gICAgfQotCi0gIGlmIChmb3VuZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGRpZCBub3QgZmluZCBhIG1hdGNoaW5nIC5zbyBmaWxlLiAgVGhpcyBpc24ndCBhbiBlcnJvciwKLQkgc2luY2UgdGhlcmUgbWlnaHQgc3RpbGwgYmUgYSBtYXRjaGluZyAuYSBmaWxlLCB3aGljaCB3aWxsIGJlCi0JIGZvdW5kIGJ5IHRoZSB1c3VhbCBzZWFyY2guICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBSZXBsYWNlIHRoZSBmaWxlbmFtZSB3aXRoIHRoZSBvbmUgd2UgaGF2ZSBmb3VuZC4gICovCi0gIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIHN0cmxlbiAoZm91bmQpICsgMik7Ci0gIHNwcmludGYgKGFsYywgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBmb3VuZCk7Ci0gIGlucC0+ZmlsZW5hbWUgPSBhbGM7Ci0KLSAgLyogVHVybiBvZmYgdGhlIHNlYXJjaF9kaXJzX2ZsYWcgdG8gcHJldmVudCBsZGZpbGVfb3Blbl9maWxlIGZyb20KLSAgICAgc2VhcmNoaW5nIGZvciB0aGlzIGZpbGUgYWdhaW4uICAqLwotICBpbnAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKLQotICBmcmVlIChmb3VuZCk7Ci0KLSAgLyogTm93IGxvb2sgZm9yIHRoZSBzYW1lIGZpbGUgbmFtZSwgYnV0IHdpdGggLnNhIGluc3RlYWQgb2YgLnNvLiAgSWYKLSAgICAgZm91bmQsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBpbnB1dCBmaWxlcy4gICovCi0gIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5wLT5maWxlbmFtZSkgKyAxKTsKLSAgc3RyY3B5IChhbGMsIGlucC0+ZmlsZW5hbWUpOwotICBzdHJzdHIgKGFsYyArIHN0cmxlbiAoc2VhcmNoLT5uYW1lKSwgIi5zbyIpWzJdID0gJ2EnOwotICBpZiAoc3RhdCAoYWxjLCAmc3QpICE9IDApCi0gICAgZnJlZSAoYWxjKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnNhOwotCi0gICAgICAvKiBBZGQgdGhlIC5zYSBmaWxlIHRvIHRoZSBzdGF0ZW1lbnQgbGlzdCBqdXN0IGJlZm9yZSB0aGUgLnNvCi0JIGZpbGUuICBUaGlzIGlzIHJlYWxseSBhIGhhY2suICAqLwotICAgICAgc2EgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKLQkgICAgeG1hbGxvYyAoc2l6ZW9mIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKSkpOwotICAgICAgKnNhID0gKmlucDsKLQotICAgICAgaW5wLT5maWxlbmFtZSA9IGFsYzsKLSAgICAgIGlucC0+bG9jYWxfc3ltX25hbWUgPSBhbGM7Ci0KLSAgICAgIGlucC0+aGVhZGVyLm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBzYTsKLSAgICAgIGlucC0+bmV4dF9yZWFsX2ZpbGUgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBzYTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBhIGRpcmVjdG9yeSBmb3IgYSAuc28gZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIgKGRpcm5hbWUsIGZpbGVuYW1lLCBmb3VuZF9zdGF0aWMpCi0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBib29sZWFuICpmb3VuZF9zdGF0aWM7Ci17Ci0gIGludCBmb3JjZV9tYWosIGZvcmNlX21pbjsKLSAgY29uc3QgY2hhciAqZG90OwotICB1bnNpZ25lZCBpbnQgbGVuOwotICBjaGFyICphbGM7Ci0gIGNoYXIgKmZvdW5kOwotICBpbnQgbWF4X21haiwgbWF4X21pbjsKLSAgRElSICpkaXI7Ci0gIHN0cnVjdCBkaXJlbnQgKmVudHJ5OwotICB1bnNpZ25lZCBpbnQgZGlybmFtZWxlbjsKLSAgY2hhciAqZnVsbF9wYXRoOwotICBpbnQgc3RhdHZhbDsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgKmZvdW5kX3N0YXRpYyA9IGZhbHNlOwotCi0gIGZvcmNlX21haiA9IC0xOwotICBmb3JjZV9taW4gPSAtMTsKLSAgZG90ID0gc3RyY2hyIChmaWxlbmFtZSwgJy4nKTsKLSAgaWYgKGRvdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxlbiA9IHN0cmxlbiAoZmlsZW5hbWUpOwotICAgICAgYWxjID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3JjZV9tYWogPSBhdG9pIChkb3QgKyAxKTsKLQotICAgICAgbGVuID0gZG90IC0gZmlsZW5hbWU7Ci0gICAgICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cm5jcHkgKGFsYywgZmlsZW5hbWUsIGxlbik7Ci0gICAgICBhbGNbbGVuXSA9ICdcMCc7Ci0gICAgICBmaWxlbmFtZSA9IGFsYzsKLQotICAgICAgZG90ID0gc3RyY2hyIChkb3QgKyAxLCAnLicpOwotICAgICAgaWYgKGRvdCAhPSBOVUxMKQotCWZvcmNlX21pbiA9IGF0b2kgKGRvdCArIDEpOwotICAgIH0KLQotICBmb3VuZCA9IE5VTEw7Ci0gIG1heF9tYWogPSBtYXhfbWluID0gMDsKLQotICBkaXIgPSBvcGVuZGlyIChkaXJuYW1lKTsKLSAgaWYgKGRpciA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBkaXJuYW1lbGVuID0gc3RybGVuIChkaXJuYW1lKTsKLSAgCi0gIHdoaWxlICgoZW50cnkgPSByZWFkZGlyIChkaXIpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgICBpbnQgZm91bmRfbWFqLCBmb3VuZF9taW47Ci0KLSAgICAgIGlmIChzdHJuY21wIChlbnRyeS0+ZF9uYW1lLCAibGliIiwgMykgIT0gMAotCSAgfHwgc3RybmNtcCAoZW50cnktPmRfbmFtZSArIDMsIGZpbGVuYW1lLCBsZW4pICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChkb3QgPT0gTlVMTAotCSAgJiYgc3RyY21wIChlbnRyeS0+ZF9uYW1lICsgMyArIGxlbiwgIi5hIikgPT0gMCkKLQl7Ci0JICAqZm91bmRfc3RhdGljID0gdHJ1ZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgYWNjZXB0IGxpYmZvby5zbyB3aXRob3V0IGEgdmVyc2lvbiBudW1iZXIsIGV2ZW4gdGhvdWdoIHRoZQotICAgICAgICAgbmF0aXZlIGxpbmtlciBkb2VzIG5vdC4gIFRoaXMgaXMgbW9yZSBjb252ZW5pZW50IGZvciBwYWNrYWdlcwotICAgICAgICAgd2hpY2gganVzdCBnZW5lcmF0ZSAuc28gZmlsZXMgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIGFzIG9uIEVMRgotICAgICAgICAgc3lzdGVtcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoZW50cnktPmRfbmFtZSArIDMgKyBsZW4sICIuc28iLCAzKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGVudHJ5LT5kX25hbWVbNiArIGxlbl0gPT0gJ1wwJykKLQk7Ci0gICAgICBlbHNlIGlmIChlbnRyeS0+ZF9uYW1lWzYgKyBsZW5dID09ICcuJwotCSAgICAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgZW50cnktPmRfbmFtZVs3ICsgbGVuXSkpCi0JOwotICAgICAgZWxzZQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKHMgPSBlbnRyeS0+ZF9uYW1lICsgNiArIGxlbjsgKnMgIT0gJ1wwJzsgcysrKQotCWlmICgqcyAhPSAnLicgJiYgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoKnMgIT0gJ1wwJykKLQljb250aW51ZTsKLQotICAgICAgLyogV2UndmUgZm91bmQgYSAuc28gZmlsZS4gIFdvcmsgb3V0IHRoZSBtYWpvciBhbmQgbWlub3IKLQkgdmVyc2lvbiBudW1iZXJzLiAgKi8KLSAgICAgIGZvdW5kX21haiA9IDA7Ci0gICAgICBmb3VuZF9taW4gPSAwOwotICAgICAgc3NjYW5mIChlbnRyeS0+ZF9uYW1lICsgMyArIGxlbiwgIi5zby4lZC4lZCIsCi0JICAgICAgJmZvdW5kX21haiwgJmZvdW5kX21pbik7Ci0KLSAgICAgIGlmICgoZm9yY2VfbWFqICE9IC0xICYmIGZvcmNlX21haiAhPSBmb3VuZF9tYWopCi0JICB8fCAoZm9yY2VfbWluICE9IC0xICYmIGZvcmNlX21pbiAhPSBmb3VuZF9taW4pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGZpbGUgcmVhbGx5IGV4aXN0cyAoaWdub3JlIGJyb2tlbiBzeW1saW5rcykuICAqLwotICAgICAgZnVsbF9wYXRoID0geG1hbGxvYyAoZGlybmFtZWxlbiArIDEgKyBzdHJsZW4gKGVudHJ5LT5kX25hbWUpICsgMSk7Ci0gICAgICBzcHJpbnRmIChmdWxsX3BhdGgsICIlcy8lcyIsIGRpcm5hbWUsIGVudHJ5LT5kX25hbWUpOwotICAgICAgc3RhdHZhbCA9IHN0YXQgKGZ1bGxfcGF0aCwgJnN0KTsKLSAgICAgIGZyZWUgKGZ1bGxfcGF0aCk7Ci0gICAgICBpZiAoc3RhdHZhbCAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSd2ZSBmb3VuZCBhIG1hdGNoIGZvciB0aGUgbmFtZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gIFNlZQotCSBpZiB0aGlzIGlzIHRoZSB2ZXJzaW9uIHdlIHNob3VsZCB1c2UuICBJZiB0aGUgbWFqb3IgYW5kIG1pbm9yCi0JIHZlcnNpb25zIG1hdGNoLCB3ZSB1c2UgdGhlIGxhc3QgZW50cnkgaW4gYWxwaGFiZXRpY2FsIG9yZGVyOwotCSBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBob3cgU3VuT1MgZGlzdGluZ3Vpc2hlcyBsaWJjLnNvLjEuOAotCSBmcm9tIGxpYmMuc28uMS44LjEsIGJ1dCBpdCBvdWdodCB0byBzdWZmaWNlLiAgKi8KLSAgICAgIGlmIChmb3VuZCA9PSBOVUxMCi0JICB8fCAoZm91bmRfbWFqID4gbWF4X21haikKLQkgIHx8IChmb3VuZF9tYWogPT0gbWF4X21hagotCSAgICAgICYmIChmb3VuZF9taW4gPiBtYXhfbWluCi0JCSAgfHwgKGZvdW5kX21pbiA9PSBtYXhfbWluCi0JCSAgICAgICYmIHN0cmNtcCAoZW50cnktPmRfbmFtZSwgZm91bmQpID4gMCkpKSkKLQl7Ci0JICBpZiAoZm91bmQgIT0gTlVMTCkKLQkgICAgZnJlZSAoZm91bmQpOwotCSAgZm91bmQgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGVudHJ5LT5kX25hbWUpICsgMSk7Ci0JICBzdHJjcHkgKGZvdW5kLCBlbnRyeS0+ZF9uYW1lKTsKLQkgIG1heF9tYWogPSBmb3VuZF9tYWo7Ci0JICBtYXhfbWluID0gZm91bmRfbWluOwotCX0KLSAgICB9Ci0KLSAgY2xvc2VkaXIgKGRpcik7Ci0KLSAgaWYgKGFsYyAhPSBOVUxMKQotICAgIGZyZWUgKGFsYyk7Ci0KLSAgcmV0dXJuIGZvdW5kOwotfQotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmFjayBhbmQgZm9ydGgKLSAgIGJldHdlZW4gYWZ0ZXJfb3BlbiBhbmQgY2hlY2tfbmVlZGVkLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBsZF9uZWVkIGVudHJpZXMgaW4gZHluYW1pYwotICAgICBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvCi0gICAgIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbAotICAgICB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdCB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsCi0gICAgIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZSBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0bwotICAgICBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbgotICAgICBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cKLSAgICAgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcyBsb29wLiAgKi8KLSAgbmVlZGVkID0gYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgY29uc3QgY2hhciAqbG5hbWU7Ci0gICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgICAgIGxuYW1lID0gbC0+bmFtZTsKLQotICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCi0gICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQotCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsbmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGxsICE9IGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLwotICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7Ci0gICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChzdHJuY21wIChsbmFtZSwgIi1sIiwgMikgIT0gMCkKLQl7Ci0JICBiZmQgKmFiZmQ7Ci0KLQkgIGFiZmQgPSBiZmRfb3BlbnIgKGxuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotCSAgaWYgKGFiZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotCQl7Ci0JCSAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCSAgYWJmZCA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGFiZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0JCXsKLQkJICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkJICBhYmZkID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JICBpZiAoYWJmZCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgZm91bmQgdGhlIG5lZWRlZCBkeW5hbWljIG9iamVjdC4gICovCi0JICAgICAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotCQllaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kXG4iLAotCQkgICAgIGxuYW1lLCBsLT5ieSk7Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBsbmFtZSArPSAyOwotCi0gICAgICAvKiBXZSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlCi0JIGR5bmFtaWMgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoIG9yIC1MLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiAoaWYgcnBhdGggd2FzIHVzZWQpIHRoZQotCSBsaW5rZXIgc2NyaXB0IExJQl9TRUFSQ0hfRElSUy4gICovCi0gICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCi0JCQkJCSAgICAgIGxuYW1lKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLQl7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLCBsbmFtZSkpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoc2VhcmNoLT5uYW1lLCBsbmFtZSkpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgICAgIHsKLQljb25zdCBjaGFyICpsaWJfcGF0aDsKLQotCWxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7Ci0JaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsbmFtZSkpCi0JICBjb250aW51ZTsKLSAgICAgIH0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLQl7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKHNlYXJjaC0+bmFtZSwgbG5hbWUpKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZFxuIiwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpkaXI7Ci0gICAgICBjaGFyICpkaXJjb3B5OwotCi0gICAgICBzID0gc3RyY2hyIChwYXRoLCAnOicpOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICBkaXJjb3B5ID0gTlVMTDsKLQkgIGRpciA9IHBhdGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRpcmNvcHkgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIDEpOwotCSAgbWVtY3B5IChkaXJjb3B5LCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBkaXJjb3B5W3MgLSBwYXRoXSA9ICdcMCc7Ci0JICBkaXIgPSBkaXJjb3B5OwotCX0KLQotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGRpciwgbmFtZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGlmIChkaXJjb3B5ICE9IE5VTEwpCi0JZnJlZSAoZGlyY29weSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgZGlyZWN0b3J5IGZvciBhIG5lZWRlZAotICAgZHluYW1pYyBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZGlyLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpkaXI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIGNoYXIgKmFsYzsKLSAgYm9vbGVhbiBpZ25vcmU7Ci0gIGJmZCAqYWJmZDsKLQotICBmaWxlID0gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2RpciAoZGlyLCBuYW1lLCAmaWdub3JlKTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWxjID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChkaXIpICsgc3RybGVuIChmaWxlKSArIDIpOwotICBzcHJpbnRmIChhbGMsICIlcy8lcyIsIGRpciwgZmlsZSk7Ci0gIGZyZWUgKGZpbGUpOwotICBhYmZkID0gYmZkX29wZW5yIChhbGMsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIHRoZSBuZWVkZWQgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIC8qIEFkZCB0aGlzIGZpbGUgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIsIGFiZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGEgbmVlZGVkIG9iamVjdCBpbiB0aGUgbGluay4gIFRoaXMKLSAgIGRvZXMgbm90IGhhdmUgdG8gYmUgcHJlY2lzZSwgYXMgaXQgZG9lcyBubyBoYXJtIHRvIGluY2x1ZGUgYQotICAgZHluYW1pYyBvYmplY3QgbW9yZSB0aGFuIG9uY2UuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAocy0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChzdHJuY21wIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAiLWwiLCAyKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCWdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc25hbWUsICpsbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnNkb3QsICpsZG90OwotICAgICAgaW50IGxtYWosIGxtaW4sIHNtYWosIHNtaW47Ci0KLSAgICAgIGxuYW1lID0gZ2xvYmFsX25lZWRlZC0+bmFtZSArIDI7Ci0KLSAgICAgIHNuYW1lID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoc25hbWUgPT0gTlVMTCkKLQlzbmFtZSA9IHMtPmZpbGVuYW1lOwotICAgICAgZWxzZQotCSsrc25hbWU7Ci0KLSAgICAgIGlmIChzdHJuY21wIChzbmFtZSwgImxpYiIsIDMpICE9IDApCi0JcmV0dXJuOwotICAgICAgc25hbWUgKz0gMzsKLQotICAgICAgbGRvdCA9IHN0cmNociAobG5hbWUsICcuJyk7Ci0gICAgICBpZiAobGRvdCA9PSBOVUxMKQotCWxkb3QgPSBsbmFtZSArIHN0cmxlbiAobG5hbWUpOwotCi0gICAgICBzZG90ID0gc3Ryc3RyIChzbmFtZSwgIi5zby4iKTsKLSAgICAgIGlmIChzZG90ID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoc2RvdCAtIHNuYW1lICE9IGxkb3QgLSBsbmFtZQotCSAgfHwgc3RybmNtcCAobG5hbWUsIHNuYW1lLCBzZG90IC0gc25hbWUpICE9IDApCi0JcmV0dXJuOwotCi0gICAgICBsbWFqID0gbG1pbiA9IC0xOwotICAgICAgc3NjYW5mIChsZG90LCAiLiVkLiVkIiwgJmxtYWosICZsbWluKTsKLSAgICAgIHNtYWogPSBzbWluID0gLTE7Ci0gICAgICBzc2NhbmYgKHNkb3QsICIuc28uJWQuJWQiLCAmc21haiwgJnNtaW4pOwotICAgICAgaWYgKChzbWFqICE9IGxtYWogJiYgc21haiAhPSAtMSAmJiBsbWFqICE9IC0xKQotCSAgfHwgKHNtaW4gIT0gbG1pbiAmJiBzbWluICE9IC0xICYmIGxtaW4gIT0gLTEpKQotCXJldHVybjsKLQotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIHN0YXRpYyB2YXJpYWJsZXMgdG8gcGFzcyBpbmZvcm1hdGlvbiBhcm91bmQgdGhlIGNhbGwKLSAgIHRvIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSWNrLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfYXNzaWduOwotc3RhdGljIGJvb2xlYW4gZm91bmRfYXNzaWduOwotCi0vKiBXZSBuZWVkIHRvIHVzZSBzdGF0aWMgdmFyaWFibGVzIHRvIHBhc3MgaW5mb3JtYXRpb24gYXJvdW5kIHRoZSBjYWxsCi0gICB0byBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUuICBJY2suICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZSBuZWVkX3NpemU7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBuZWVkX2VudHJpZXM7Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfY29udGVudHM7Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfcGluZm87Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfcG5hbWVzOwotCi0vKiBUaGUgc2l6ZSBvZiBvbmUgZW50cnkgaW4gdGhlIC5uZWVkIHNlY3Rpb24sIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUKLSAgIG5hbWUuICAqLwotCi0jZGVmaW5lIE5FRURfRU5UUllfU0laRSAoMTYpCi0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhkeW4gPSBOVUxMOwotICBhc2VjdGlvbiAqc25lZWQ7Ci0gIGFzZWN0aW9uICpzcnVsZXM7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIC8qIFRoZSBTdW5PUyBuYXRpdmUgbGlua2VyIGNyZWF0ZXMgYSBzaGFyZWQgbGlicmFyeSB3aGVuZXZlciB0aGVyZQotICAgICBhcmUgYW55IHVuZGVmaW5lZCBzeW1ib2xzIGluIGEgbGluaywgdW5sZXNzIC1lIGlzIHVzZWQuICBUaGlzIGlzCi0gICAgIHByZXR0eSB3ZWlyZCwgYnV0IHdlIGFyZSBjb21wYXRpYmxlLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnNoYXJlZCAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgJiYgISBlbnRyeV9mcm9tX2NtZGxpbmUpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAKLSAgICAgIGZvciAoaCA9IGxpbmtfaW5mby5oYXNoLT51bmRlZnM7IGggIT0gTlVMTDsgaCA9IGgtPm5leHQpCi0JewotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT51LnVuZGVmLmFiZmQgIT0gTlVMTAotCSAgICAgICYmIChoLT51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5zdHJpbmcsICJfX0RZTkFNSUMiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnN0cmluZywgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iKSAhPSAwKQotCSAgICB7Ci0JICAgICAgZmluZF9hc3NpZ24gPSBoLT5yb290LnN0cmluZzsKLQkgICAgICBmb3VuZF9hc3NpZ24gPSBmYWxzZTsKLQkgICAgICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50KTsKLQkgICAgICBpZiAoISBmb3VuZF9hc3NpZ24pCi0JCXsKLQkJICBsaW5rX2luZm8uc2hhcmVkID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICAgICAgLyogU2V0IHRoZSAudGV4dCBzZWN0aW9uIHRvIHN0YXJ0IGF0IDB4MjAsIG5vdCAweDIwMjAuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgdG9vIG1hZ2ljYWwuICAqLwotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIudGV4dCIpOwotICAgICAgaWYgKG9zLT5hZGRyX3RyZWUgPT0gTlVMTCkKLQlvcy0+YWRkcl90cmVlID0gZXhwX2ludG9wICgweDIwKTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBfX0RZTkFNSUMgc3ltYm9sLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUKLSAgICAgbGlua2VyIHNjcmlwdCBiZWNhdXNlIHdlIHdhbnQgdG8gc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3RhcnQgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbiBpZiB0aGVyZSBpcyBvbmUsIG9yIHRvIHplcm8gaWYgdGhlcmUgaXNuJ3QKLSAgICAgb25lLiAgV2UgbmVlZCB0byBjcmVhdGUgdGhlIHN5bWJvbCBiZWZvcmUgY2FsbGluZwotICAgICBzaXplX2R5bmFtaWNfc2VjdGlvbnMsIGFsdGhvdWdoIHdlIGNhbid0IHNldCB0aGUgdmFsdWUgdW50aWwKLSAgICAgYWZ0ZXJ3YXJkLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBoZHluID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCAiX19EWU5BTUlDIiwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgZmFsc2UpOwotICAgICAgaWYgKGhkeW4gPT0gTlVMTCkKLQllaW5mbyAoIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwOiAlRVxuIik7Ci0gICAgICBpZiAoISBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJICAgICAgIl9fRFlOQU1JQyIpKQotCWVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvIF9fRFlOQU1JQzogJUVcbiIpOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBiYWNrZW5kIGxpbmtlciBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgbGlua2VyIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMKLSAgICAgcmVxdWlyZWQgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgaWYgKCEgYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgJnNkeW4sCi0JCQkJCSAmc25lZWQsICZzcnVsZXMpKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLQotICBpZiAoc25lZWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdXAgdGhlIC5uZWVkIHNlY3Rpb24uICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsZF9uZWVkCi0JIGZpZWxkIGluIGluY2x1ZGUvYW91dC9zdW40LmguICAqLwotCi0gICAgICBuZWVkX2VudHJpZXMgPSAwOwotICAgICAgbmVlZF9zaXplID0gMDsKLQotICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9jb3VudF9uZWVkKTsKLQotICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgaGF2ZSBhIC5uZWVkIHNlY3Rpb24gaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUKLQkgZHluYW1pYyBvYmplY3QuICAqLwotICAgICAgQVNTRVJUIChuZWVkX2VudHJpZXMgIT0gMCk7Ci0KLSAgICAgIHNuZWVkLT5fcmF3X3NpemUgPSBuZWVkX3NpemU7Ci0gICAgICBzbmVlZC0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAobmVlZF9zaXplKTsKLQotICAgICAgbmVlZF9jb250ZW50cyA9IHNuZWVkLT5jb250ZW50czsKLSAgICAgIG5lZWRfcGluZm8gPSBzbmVlZC0+Y29udGVudHM7Ci0gICAgICBuZWVkX3BuYW1lcyA9IHNuZWVkLT5jb250ZW50cyArIG5lZWRfZW50cmllcyAqIDE2OwotCi0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9uZWVkKTsKLQotICAgICAgQVNTRVJUICgoYmZkX3NpemVfdHlwZSkgKG5lZWRfcG5hbWVzIC0gc25lZWQtPmNvbnRlbnRzKSA9PSBuZWVkX3NpemUpOwotICAgIH0KLQotICBpZiAoc3J1bGVzICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IHVwIHRoZSAucnVsZXMgc2VjdGlvbi4gIFRoaXMgaXMganVzdCBhIFBBVEggbGlrZSBzdHJpbmcKLQkgb2YgdGhlIC1MIGFyZ3VtZW50cyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgV2UgcGVybWl0IHRoZQotCSB1c2VyIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHVzaW5nIHRoZSAtcnBhdGggY29tbWFuZCBsaW5lCi0JIG9wdGlvbi4gICovCi0gICAgICBpZiAoY29tbWFuZF9saW5lLnJwYXRoKQotCXsKLQkgIHNydWxlcy0+X3Jhd19zaXplID0gc3RybGVuIChjb21tYW5kX2xpbmUucnBhdGgpOwotCSAgc3J1bGVzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUucnBhdGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBzaXplOwotCSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0JICBzaXplID0gMDsKLQkgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JICAgICAgc2l6ZSArPSBzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyAxOwotCSAgc3J1bGVzLT5fcmF3X3NpemUgPSBzaXplOwotCSAgaWYgKHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgY2hhciAqcDsKLQotCSAgICAgIHNydWxlcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc2l6ZSk7Ci0JICAgICAgcCA9IChjaGFyICopIHNydWxlcy0+Y29udGVudHM7Ci0JICAgICAgKnAgPSAnXDAnOwotCSAgICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JCXsKLQkJICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCQkgICAgewotCQkgICAgICBpZiAocCAhPSAoY2hhciAqKSBzcnVsZXMtPmNvbnRlbnRzKQotCQkJKnArKyA9ICc6JzsKLQkJICAgICAgc3RyY3B5IChwLCBzZWFyY2gtPm5hbWUpOwotCQkgICAgICBwICs9IHN0cmxlbiAocCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV2UgbXVzdCBhc3NpZ24gYSB2YWx1ZSB0byBfX0RZTkFNSUMuICBJdCBzaG91bGQgYmUgemVybyBpZiB3ZSBhcmUKLSAgICAgbm90IGRvaW5nIGEgZHluYW1pYyBsaW5rLCBvciB0aGUgc3RhcnQgb2YgdGhlIC5keW5hbWljIHNlY3Rpb24gaWYKLSAgICAgd2UgYXJlIGRvaW5nIG9uZS4gICovCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaGR5bi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgICAgIGhkeW4tPnUuZGVmLnZhbHVlID0gMDsKLSAgICAgIGlmIChzZHluICE9IE5VTEwpCi0JaGR5bi0+dS5kZWYuc2VjdGlvbiA9IHNkeW47Ci0gICAgICBlbHNlCi0JaGR5bi0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgZG9lcyBvbmUgb2YgdHdvIHRoaW5nczogaWYgdGhlCi0gICB2YXJpYWJsZSBmaW5kX2Fzc2lnbiBpcyBzZXQsIGl0IHNldHMgZm91bmRfYXNzaWduIGlmIGl0IGZpbmRzIGFuCi0gICBhc3NpZ25tZW50IHRvIHRoYXQgdmFyaWFibGU7IG90aGVyd2lzZSBpdCB0ZWxscyB0aGUgYmFja2VuZCBsaW5rZXIKLSAgIGFib3V0IGFsbCBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0KLSAgICAgICYmIChmaW5kX2Fzc2lnbiA9PSBOVUxMIHx8ICEgZm91bmRfYXNzaWduKSkKLSAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKGZpbmRfYXNzaWduICE9IE5VTEwpCi0JewotCSAgaWYgKHN0cmNtcCAoZmluZF9hc3NpZ24sIGV4cC0+YXNzaWduLmRzdCkgPT0gMCkKLQkgICAgZm91bmRfYXNzaWduID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICBleHAtPmFzc2lnbi5kc3QpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgLm5lZWQgc2VjdGlvbiwgYW5kIHRoZSBudW1iZXIgb2YgZW50cmllcy4KLSAgIFRoZSBiYWNrZW5kIHdpbGwgc2V0IHRoZSBsZF9uZWVkIGZpZWxkIG9mIHRoZSBkeW5hbWljIGxpbmtpbmcKLSAgIGluZm9ybWF0aW9uIHRvIHBvaW50IHRvIHRoZSAubmVlZCBzZWN0aW9uLiAgU2VlIGluY2x1ZGUvYW91dC9zdW40LmgKLSAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NvdW50X25lZWQgKGlucCkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wOwotewotICBpZiAoaW5wLT50aGVfYmZkICE9IE5VTEwKLSAgICAgICYmIChpbnAtPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICArK25lZWRfZW50cmllczsKLSAgICAgIG5lZWRfc2l6ZSArPSBORUVEX0VOVFJZX1NJWkU7Ci0gICAgICBpZiAoISBpbnAtPmlzX2FyY2hpdmUpCi0JbmVlZF9zaXplICs9IHN0cmxlbiAoaW5wLT5maWxlbmFtZSkgKyAxOwotICAgICAgZWxzZQotCXsKLQkgIEFTU0VSVCAoaW5wLT5sb2NhbF9zeW1fbmFtZVswXSA9PSAnLScKLQkJICAmJiBpbnAtPmxvY2FsX3N5bV9uYW1lWzFdID09ICdsJyk7Ci0JICBuZWVkX3NpemUgKz0gc3RybGVuIChpbnAtPmxvY2FsX3N5bV9uYW1lICsgMikgKyAxOwotCX0KLSAgICB9Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSAubmVlZCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9uZWVkIChpbnApCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlucDsKLXsKLSAgaWYgKGlucC0+dGhlX2JmZCAhPSBOVUxMCi0gICAgICAmJiAoaW5wLT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBjOwotCi0gICAgICAvKiBUbyByZWFsbHkgZmlsbCBpbiB0aGUgLm5lZWQgc2VjdGlvbiBjb250ZW50cywgd2UgbmVlZCB0byBrbm93Ci0JIHRoZSBmaW5hbCBmaWxlIHBvc2l0aW9uIG9mIHRoZSBzZWN0aW9uLCBidXQgd2UgZG9uJ3QuCi0JIEluc3RlYWQsIHdlIHVzZSBvZmZzZXRzLCBhbmQgcmVseSBvbiB0aGUgQkZEIGJhY2tlbmQgdG8KLQkgZmluaXNoIHRoZSBzZWN0aW9uIHVwIGNvcnJlY3RseS4gIEZJWE1FOiBUYWxrIGFib3V0IGxhY2sgb2YKLQkgcmVmZXJlbnRpYWwgbG9jYWxpdHkuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmVlZF9wbmFtZXMgLSBuZWVkX2NvbnRlbnRzLCBuZWVkX3BpbmZvKTsKLSAgICAgIGlmICghIGlucC0+aXNfYXJjaGl2ZSkKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDQpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG5lZWRfcGluZm8gKyA4KTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBuZWVkX3BpbmZvICsgMTApOwotCSAgc3RyY3B5IChuZWVkX3BuYW1lcywgaW5wLT5maWxlbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKnZlcnN0cjsKLQkgIGludCBtYWosIG1pbjsKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDB4ODAwMDAwMDAsIG5lZWRfcGluZm8gKyA0KTsKLQkgIG1haiA9IDA7Ci0JICBtaW4gPSAwOwotCSAgdmVyc3RyID0gc3Ryc3RyIChpbnAtPmZpbGVuYW1lLCAiLnNvLiIpOwotCSAgaWYgKHZlcnN0ciAhPSBOVUxMKQotCSAgICBzc2NhbmYgKHZlcnN0ciwgIi5zby4lZC4lZCIsICZtYWosICZtaW4pOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIG1haiwgbmVlZF9waW5mbyArIDgpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIG1pbiwgbmVlZF9waW5mbyArIDEwKTsKLQkgIHN0cmNweSAobmVlZF9wbmFtZXMsIGlucC0+bG9jYWxfc3ltX25hbWUgKyAyKTsKLQl9Ci0KLSAgICAgIGMgPSAobmVlZF9waW5mbyAtIG5lZWRfY29udGVudHMpIC8gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgaWYgKGMgKyAxID49IG5lZWRfZW50cmllcykKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDEyKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgKGMgKyAxKSAqIE5FRURfRU5UUllfU0laRSwKLQkJICAgIG5lZWRfcGluZm8gKyAxMik7Ci0KLSAgICAgIG5lZWRfcGluZm8gKz0gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgbmVlZF9wbmFtZXMgKz0gc3RybGVuIChuZWVkX3BuYW1lcykgKyAxOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSdzL1siXFxdL1xcJi9nCi1zLyQvXFxuXFwvCi0xcy9eLyIvCi0kcy8kL24iLwotJwotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dWA7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHJgOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym5gOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG5gOwotICBlbHNlCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhgOwotfQotRU9GCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsIC8qIGZpbmlzaCAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLSAgTlVMTCwgLyogb3Blbl9keW5hbWljX2xpYnJhcnkgKi8KLSAgTlVMTCwgLyogcGxhY2Vfb3JwaGFuICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvdmFuaWxsYS5lbSBiL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUzNmZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQSB2YW5pbGxhIGVtdWxhdGlvbiB3aXRoIG5vIGRlZmF1bHRzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi1zdGF0aWMgdm9pZCB2YW5pbGxhX2JlZm9yZV9wYXJzZSgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi12YW5pbGxhX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICB1bnNpZ25lZCBsb25nICBtYWNoaW5lID0gMDsKLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIG1hY2hpbmUpOwotfQotCi1zdGF0aWMgY2hhciAqCi12YW5pbGxhX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsKLSAgKmlzZmlsZSA9IDA7Ci0gIHJldHVybiAiIjsKLX0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF92YW5pbGxhX2VtdWxhdGlvbiA9IAotewotICB2YW5pbGxhX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgdmFuaWxsYV9zZXRfb3V0cHV0X2FyY2gsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgdmFuaWxsYV9nZXRfc2NyaXB0LAotICAidmFuaWxsYSIsCi0gICJhLm91dC1zdW5vcy1iaWciCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9nZW4tZG9jLnRleGkgYi9sZC9nZW4tZG9jLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzY3MjcuLjAwMDAwMDAKLS0tIGEvbGQvZ2VuLWRvYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gVkFSUzoKLUBjIDEuIEluY2x1c2l2ZW5lc3Mgb2YgdGhpcyBtYW51YWwKLUBzZXQgR0VORVJJQwotCi1AYyAyLiBTcGVjaWZpYyB0YXJnZXQgbWFjaGluZXMKLUBzZXQgSDgzMDAKLUBzZXQgSTk2MAotCi1AYyAzLiBQcm9wZXJ0aWVzIG9mIHRoaXMgY29uZmlndXJhdGlvbgotQGNsZWFyIFNpbmdsZUZvcm1hdAotQHNldCBVc2VzRW52VmFycwotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBDT05GSUdVUkFUSU9OIFZBUlMKLQpkaWZmIC0tZ2l0IGEvbGQvZ2Vuc2NyaXB0cy5zaCBiL2xkL2dlbnNjcmlwdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyOTRhZjcuLjAwMDAwMDAKLS0tIGEvbGQvZ2Vuc2NyaXB0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgZ2Vuc2NyaXB0cy5zaCAtIGdlbmVyYXRlIHRoZSBsZC1lbXVsYXRpb24tdGFyZ2V0IHNwZWNpZmljIGZpbGVzCi0jCi0jIFVzYWdlOiBnZW5zY3JpcHRzLnNoIHNyY2RpciBsaWJkaXIgaG9zdCB0YXJnZXQgdGFyZ2V0X2FsaWFzIFwKLSMgZGVmYXVsdF9lbXVsYXRpb24gbmF0aXZlX2xpYl9kaXJzIHRoaXNfZW11bGF0aW9uIHRvb2xfZGlyCi0jCi0jIFNhbXBsZSB1c2FnZToKLSMgZ2Vuc2NyaXB0cy5zaCAvZGptL2xkLWRldm8vZGV2by9sZCAvdXNyL2xvY2FsL2xpYiBzcGFyYy1zdW4tc3Vub3M0LjEuMyBcCi0jIHNwYXJjLXN1bi1zdW5vczQuMS4zIHNwYXJjLXN1bi1zdW5vczQuMS4zIHN1bjQgIiIgc3VuMyBzcGFyYy1zdW4tc3Vub3M0LjEuMwotIyBwcm9kdWNlcyBzdW4zLnggc3VuMy54Ym4gc3VuMy54biBzdW4zLnhyIHN1bjMueHUgZW1fc3VuMy5jCi0KLXNyY2Rpcj0kMQotbGliZGlyPSQyCi1ob3N0PSQzCi10YXJnZXQ9JDQKLXRhcmdldF9hbGlhcz0kNQotRU1VTEFUSU9OX0xJQlBBVEg9JDYKLU5BVElWRV9MSUJfRElSUz0kNwotRU1VTEFUSU9OX05BTUU9JDgKLXRvb2xfbGliPWBlY2hvICR7bGliZGlyfSB8IHNlZCAtZSAnc3wvbGliJHx8J2AvJHs5LSR0YXJnZXRfYWxpYXN9L2xpYgotCi0jIEluY2x1ZGUgdGhlIGVtdWxhdGlvbi1zcGVjaWZpYyBwYXJhbWV0ZXJzOgotLiAke3NyY2Rpcn0vZW11bHBhcmFtcy8ke0VNVUxBVElPTl9OQU1FfS5zaAotCi1pZiB0ZXN0IC1kIGxkc2NyaXB0czsgdGhlbgotICB0cnVlCi1lbHNlCi0gIG1rZGlyIGxkc2NyaXB0cwotZmkKLQotIyBTZXQgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGgsIGZvciBsaWJyYXJpZXMgbmFtZWQgYnkgLWxmb28uCi0jIElmIExJQl9QQVRIIGlzIGRlZmluZWQgKGUuZy4sIGJ5IE1ha2VmaWxlKSBhbmQgbm9uLWVtcHR5LCBpdCBpcyB1c2VkLgotIyBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGlzIHNldCBoZXJlLgotIwotIyBUaGUgZm9ybWF0IGlzIHRoZSB1c3VhbCBsaXN0IG9mIGNvbG9uLXNlcGFyYXRlZCBkaXJlY3Rvcmllcy4KLSMgVG8gZm9yY2UgYSBsb2dpY2FsbHkgZW1wdHkgTElCX1BBVEgsIGRvIExJQlBBVEg9IjoiLgotCi1pZiBbICJ4JHtMSUJfUEFUSH0iID0gIngiIF0gOyB0aGVuCi0gICMgQ3Jvc3MsIG9yIG5hdGl2ZSBub24tZGVmYXVsdCBlbXVsYXRpb24gbm90IHJlcXVlc3RpbmcgTElCX1BBVEguCi0gIExJQl9QQVRIPQotCi0gIGlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICAgIGNhc2UgIiAkRU1VTEFUSU9OX0xJQlBBVEggIiBpbgotICAgICAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi0gICAgICAgICMgTmF0aXZlLCBhbmQgZGVmYXVsdCBvciBlbXVsYXRpb24gcmVxdWVzdGluZyBMSUJfUEFUSC4KLSAgICAgICAgTElCX1BBVEg9L2xpYjovdXNyL2xpYgotICAgICAgICBpZiBbIC1uICIke05BVElWRV9MSUJfRElSU30iIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9OiR7TkFUSVZFX0xJQl9ESVJTfQotICAgICAgICBmaQotICAgICAgICBpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbGliIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9OiR7bGliZGlyfQotICAgICAgICBmaQotICAgICAgICBpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbG9jYWwvbGliIF0gOyB0aGVuCi0JICBMSUJfUEFUSD0ke0xJQl9QQVRIfTovdXNyL2xvY2FsL2xpYgotICAgICAgICBmaQotICAgIGVzYWMKLSAgZmkKLWZpCi0KLSMgQWx3YXlzIHNlYXJjaCAkKHRvb2xkaXIpL2xpYiwgYWthIC91c3IvbG9jYWwvVEFSR0VUL2xpYi4KLUxJQl9QQVRIPSR7TElCX1BBVEh9OiR7dG9vbF9saWJ9Ci0KLUxJQl9TRUFSQ0hfRElSUz1gZWNobyAke0xJQl9QQVRIfSB8IHRyICc6JyAnICcgfCBzZWQgLWUgJ3MvXChbXiBdW14gXSpcKS9TRUFSQ0hfRElSKFwxKTsvZydgCi0KLSMgR2VuZXJhdGUgNSBvciA2IHNjcmlwdCBmaWxlcyBmcm9tIGEgbWFzdGVyIHNjcmlwdCB0ZW1wbGF0ZSBpbgotIyAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2guICBXaGljaCBvbmUgb2YgdGhlIDUgb3IgNgotIyBzY3JpcHQgZmlsZXMgaXMgYWN0dWFsbHkgdXNlZCBkZXBlbmRzIG9uIGNvbW1hbmQgbGluZSBvcHRpb25zIGdpdmVuCi0jIHRvIGxkLiAgKFNDUklQVF9OQU1FIHdhcyBzZXQgaW4gdGhlIGVtdWxwYXJhbXNfZmlsZS4pCi0jCi0jIEEgLnggc2NyaXB0IGZpbGUgaXMgdGhlIGRlZmF1bHQgc2NyaXB0LgotIyBBIC54ciBzY3JpcHQgaXMgZm9yIGxpbmtpbmcgd2l0aG91dCByZWxvY2F0aW9uICgtciBmbGFnKS4KLSMgQSAueHUgc2NyaXB0IGlzIGxpa2UgLnhyLCBidXQgKmRvKiBjcmVhdGUgY29uc3RydWN0b3JzICgtVXIgZmxhZykuCi0jIEEgLnhuIHNjcmlwdCBpcyBmb3IgbGlua2luZyB3aXRoIC1uIGZsYWcgKG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSkuCi0jIEEgLnhibiBzY3JpcHQgaXMgZm9yIGxpbmtpbmcgd2l0aCAtTiBmbGFnIChtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UpLgotIyBBIC54cyBzY3JpcHQgaXMgZm9yIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB3aXRoIHRoZSAtLXNoYXJlZAotIyAgIGZsYWc7IGl0IGlzIG9ubHkgZ2VuZXJhdGVkIGlmICRHRU5FUkFURV9TSExJQl9TQ1JJUFQgaXMgc2V0IGJ5IHRoZQotIyAgIGVtdWxhdGlvbiBwYXJhbWV0ZXJzLgotCi1TRUdNRU5UX1NJWkU9JHtTRUdNRU5UX1NJWkUtJHtUQVJHRVRfUEFHRV9TSVpFfX0KLQotIyBEZXRlcm1pbmUgREFUQV9BTElHTk1FTlQgZm9yIHRoZSA1IHZhcmlhbnRzLCB1c2luZwotIyB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBlbXVscGFyYW1zLzxlbXVsYXRpb24+LnNoIGZpbGUgb3IgZGVmYXVsdC4KLQotREFUQV9BTElHTk1FTlRfPSIke0RBVEFfQUxJR05NRU5UXy0ke0RBVEFfQUxJR05NRU5ULUFMSUdOKCR7U0VHTUVOVF9TSVpFfSl9fSIKLURBVEFfQUxJR05NRU5UX249IiR7REFUQV9BTElHTk1FTlRfbi0ke0RBVEFfQUxJR05NRU5UX319IgotREFUQV9BTElHTk1FTlRfTj0iJHtEQVRBX0FMSUdOTUVOVF9OLSR7REFUQV9BTElHTk1FTlQtLn19IgotREFUQV9BTElHTk1FTlRfcj0iJHtEQVRBX0FMSUdOTUVOVF9yLSR7REFUQV9BTElHTk1FTlQtfX0iCi1EQVRBX0FMSUdOTUVOVF91PSIke0RBVEFfQUxJR05NRU5UX3UtJHtEQVRBX0FMSUdOTUVOVF9yfX0iCi0KLUxEX0ZMQUc9cgotREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9yfQotREVGQVVMVF9EQVRBX0FMSUdOTUVOVD0iQUxJR04oJHtTRUdNRU5UX1NJWkV9KSIKLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIKLQotTERfRkxBRz11Ci1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX3V9Ci1DT05TVFJVQ1RJTkc9IiAiCi0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1Ci0KLUxEX0ZMQUc9Ci1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX30KLVJFTE9DQVRJTkc9IiAiCi0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngKLQotTERfRkxBRz1uCi1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX259Ci1URVhUX1NUQVJUX0FERFI9JHtOT05QQUdFRF9URVhUX1NUQVJUX0FERFItJHtURVhUX1NUQVJUX0FERFJ9fQotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bgotCi1MRF9GTEFHPU4KLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfTn0KLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuCi0KLWlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiOyB0aGVuCi0gIExEX0ZMQUc9c2hhcmVkCi0gIERBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfcy0ke0RBVEFfQUxJR05NRU5UX319Ci0gIENSRUFURV9TSExJQj0iICIKLSAgIyBOb3RlIHRoYXQgVEVYVF9TVEFSVF9BRERSIGlzIHNldCB0byBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIuCi0gICguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICAgIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cwotZmkKLQotZm9yIGkgaW4gJEVNVUxBVElPTl9MSUJQQVRIIDsgZG8KLSAgdGVzdCAiJGkiID0gIiRFTVVMQVRJT05fTkFNRSIgJiYgQ09NUElMRV9JTj10cnVlCi1kb25lCi0KLSMgR2VuZXJhdGUgZSR7RU1VTEFUSU9OX05BTUV9LmMuCi0uICR7c3JjZGlyfS9lbXVsdGVtcGwvJHtURU1QTEFURV9OQU1FLWdlbmVyaWN9LmVtCmRpZmYgLS1naXQgYS9sZC9oOC1kb2MudGV4aSBiL2xkL2g4LWRvYy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M2MmExLi4wMDAwMDAwCi0tLSBhL2xkL2g4LWRvYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gVkFSUzoKLUBjIDEuIEluY2x1c2l2ZW5lc3Mgb2YgdGhpcyBtYW51YWwKLUBjbGVhciBHRU5FUklDCi0KLUBjIDIuIFNwZWNpZmljIHRhcmdldCBtYWNoaW5lcwotQHNldCBIODMwMAotQHNldCBIaXRhY2hpCi1AY2xlYXIgSTk2MAotCi1AYyAzLiBQcm9wZXJ0aWVzIG9mIHRoaXMgY29uZmlndXJhdGlvbgotQHNldCBTaW5nbGVGb3JtYXQKLUBjbGVhciBVc2VzRW52VmFycwotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBDT05GSUdVUkFUSU9OIFZBUlMKLQpkaWZmIC0tZ2l0IGEvbGQvbGQuMSBiL2xkL2xkLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTE2YjkuLjAwMDAwMDAKLS0tIGEvbGQvbGQuMQorKysgL2Rldi9udWxsCkBAIC0xLDExMTUgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBsZCAxICIxNyBBdWd1c3QgMTk5MiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLWxkIFwtIHRoZSBHTlUgbGlua2VyCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBsZCAKLS5SQiAiW1x8IiBcLW8gIgotLkkgb3V0cHV0XGMKLVwmXHxdIFxjCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmJyCi0uUkIgIltcfCIgXC1BXGMKLS5JIGFyY2hpdGVjdHVyZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1iXCAiXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLUJzdGF0aWMgIlx8XSIgIAotLlJCICJbXHwiIFwtQmR5bmFtaWMgIlx8XSIgIAotLlJCICJbXHwiIFwtQnN5bWJvbGljICJcfF0iICAKLS5SQiAiW1x8IiAiXC1jXCAiXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtXC1jcmVmICJcfF0iCi0uUkIgIltcfCIgXC1kIHwgXC1kYyB8IFwtZHBcYwotXHxdCi0uYnIKLS5SQiAiW1x8IiAiXC1kZWZzeW1cICJcYwotLkkgc3ltYm9sXGMKLVwmID0gXGMKLS5JIGV4cHJlc3Npb25cYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtZGVtYW5nbGUgIlx8XSIKLS5SQiAiW1x8IiBcLVwtbm9cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgIlwtZVwgIlxjCi0uSSBlbnRyeVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLWVtYmVkZGVkXC1yZWxvY3MgIlx8XSIKLS5SQiAiW1x8IiBcLUUgIlx8XSIgCi0uUkIgIltcfCIgXC1leHBvcnRcLWR5bmFtaWMgIlx8XSIKLS5SQiAiW1x8IiAiXC1mXCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1cLWF1eGlsaWFyeVwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtRlwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1maWx0ZXJcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLWZvcm1hdFwgIlxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1nICJcfF0iIAotLlJCICJbXHwiIFwtRwotLkkgc2l6ZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLWhcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLXNvbmFtZVwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLWkgIlx8XSIKLS5SQiAiW1x8IiBcLWxcYwotLkkgYXJcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1MXGMKLS5JIHNlYXJjaGRpclxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLU0gIlx8XSIgCi0uUkIgIltcfCIgXC1NYXAKLS5JIG1hcGZpbGVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1tCi0uSSBlbXVsYXRpb25cYwotXCZcfF0gCi0uUkIgIltcfCIgXC1uIHwgXC1OICJcfF0iIAotLlJCICJbXHwiIFwtbm9pbmhpYml0LWV4ZWMgIlx8XSIgCi0uUkIgIltcfCIgXC1ub1wta2VlcFwtbWVtb3J5ICJcfF0iIAotLlJCICJbXHwiIFwtbm9cLXdhcm5cLW1pc21hdGNoICJcfF0iIAotLlJCICJbXHwiIFwtT1xjCi0uSSBsZXZlbFxjCi1cJlx8XQotLlJCICJbXHwiICJcLW9mb3JtYXRcICJcYwotLkkgb3V0cHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1SXCAiXGMKLS5JIGZpbGVuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1yZWxheCAiXHxdIgotLlJCICJbXHwiIFwtciB8IFwtVXIgIlx8XSIgCi0uUkIgIltcfCIgIlwtcnBhdGhcICJcYwotLkkgZGlyZWN0b3J5XGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtcnBhdGhcLWxpbmtcICJcYwotLkkgZGlyZWN0b3J5XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1TICJcfF0iIAotLlJCICJbXHwiIFwtcyAiXHxdIiAKLS5SQiAiW1x8IiBcLXNoYXJlZCAiXHxdIiAKLS5SQiAiW1x8IiBcLXNvcnRcLWNvbW1vbiAiXHxdIiAKLS5SQiAiW1x8IiAiXC1zcGxpdFwtYnlcLXJlbG9jXCAiXGMKLS5JIGNvdW50XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1zcGxpdFwtYnlcLWZpbGUgIlx8XSIgCi0uUkIgIltcfCIgIlwtVFwgIlxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlx8XSAgCi0uUkIgIltcfCIgIlwtVHRleHRcICJcYwotLkkgdGV4dG9yZ1xjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1UZGF0YVwgIlxjCi0uSSBkYXRhb3JnXGMKLVwmXHxdIAotLlJCICJbXHwiICJcLVRic3NcICJcYwotLkkgYnNzb3JnXGMKLVwmXHxdCi0uUkIgIltcfCIgXC10ICJcfF0iIAotLlJCICJbXHwiICJcLXVcICJcYwotLkkgc3ltXGMKLVwmXQotLlJCICJbXHwiIFwtViAiXHxdIgotLlJCICJbXHwiIFwtdiAiXHxdIgotLlJCICJbXHwiIFwtXC12ZXJib3NlICJcfF0iCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBcLXdhcm5cLWNvbW1vbiAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLWNvbnN0cnVjdG9ycyAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLW11bHRpcGxlXC1ncCAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLW9uY2UgIlx8XSIgCi0uUkIgIltcfCIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtd2hvbGVcLWFyY2hpdmUgIlx8XSIgCi0uUkIgIltcfCIgXC1cLW5vXC13aG9sZVwtYXJjaGl2ZSAiXHxdIiAKLS5SQiAiW1x8IiAiXC1cLXdyYXBcICJcYwotLkkgc3ltYm9sXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1YICJcfF0iIAotLlJCICJbXHwiIFwteCAiXHxdIiAKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1cYwotLkIgbGRcYwotXCYgY29tYmluZXMgYSBudW1iZXIgb2Ygb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLCByZWxvY2F0ZXMKLXRoZWlyIGRhdGEgYW5kIHRpZXMgdXAgc3ltYm9sIHJlZmVyZW5jZXMuIE9mdGVuIHRoZSBsYXN0IHN0ZXAgaW4KLWJ1aWxkaW5nIGEgbmV3IGNvbXBpbGVkIHByb2dyYW0gdG8gcnVuIGlzIGEgY2FsbCB0byBcYwotLkIgbGRcYwotXCYuCi0KLVxjCi0uQiBsZFxjCi1cJiBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIAotdG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCi1UaGlzIG1hbiBwYWdlIGRvZXMgbm90IGRlc2NyaWJlIHRoZSBjb21tYW5kIGxhbmd1YWdlOyBzZWUgdGhlIGBcfFxjCi0uQiBsZFxjCi1cfCcgZW50cnkgaW4gYFx8XGMKLS5CIGluZm9cYwotXHwnLCBvciB0aGUgbWFudWFsCi0uSQotbGQ6IHRoZSBHTlUgbGlua2VyCi1cJiwgZm9yIGZ1bGwgZGV0YWlscyBvbiB0aGUgY29tbWFuZCBsYW5ndWFnZSBhbmQgb24gb3RoZXIgYXNwZWN0cyBvZgotdGhlIEdOVSBsaW5rZXIuIAotCi1UaGlzIHZlcnNpb24gb2YgXGMKLS5CIGxkXGMKLVwmIHVzZXMgdGhlIGdlbmVyYWwgcHVycG9zZSBCRkQgbGlicmFyaWVzCi10byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcy4gVGhpcyBhbGxvd3MgXGMKLS5CIGxkXGMKLVwmIHRvIHJlYWQsIGNvbWJpbmUsIGFuZAotd3JpdGUgb2JqZWN0IGZpbGVzIGluIG1hbnkgZGlmZmVyZW50IGZvcm1hdHNcKGVtXCZmb3IgZXhhbXBsZSwgQ09GRiBvcgotXGMKLS5CIGEub3V0XGMKLVwmLiAgRGlmZmVyZW50IGZvcm1hdHMgbWF5IGJlIGxpbmtlZCB0b2dldGhlciB0byBwcm9kdWNlIGFueQotYXZhaWxhYmxlIGtpbmQgb2Ygb2JqZWN0IGZpbGUuICBZb3UgY2FuIHVzZSBgXHxcYwotLkIgb2JqZHVtcCBcLWlcYwotXHwnIHRvIGdldCBhIGxpc3Qgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgb24gdmFyaW91cyBhcmNoaXRlY3R1cmVzOyBzZWUgCi0uQlIgb2JqZHVtcCAoIDEgKS4KLQotQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBHTlUgbGlua2VyIGlzIG1vcmUgaGVscGZ1bCB0aGFuIG90aGVyCi1saW5rZXJzIGluIHByb3ZpZGluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiAgTWFueSBsaW5rZXJzIGFiYW5kb24KLWV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvcjsgd2hlbmV2ZXIgcG9zc2libGUsCi1cYwotLkIgbGRcYwotXCYgY29udGludWVzIGV4ZWN1dGluZywgYWxsb3dpbmcgeW91IHRvIGlkZW50aWZ5IG90aGVyIGVycm9ycwotKG9yLCBpbiBzb21lIGNhc2VzLCB0byBnZXQgYW4gb3V0cHV0IGZpbGUgaW4gc3BpdGUgb2YgdGhlIGVycm9yKS4KLQotVGhlIEdOVSBsaW5rZXIgXGMKLS5CIGxkXGMKLVwmIGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKLWFuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoteW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSwKLWFuZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQotLlNIIE9QVElPTlMKLVRoZSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyBtYXkgc2VlbSBpbnRpbWlkYXRpbmcsIGJ1dCBpbgotYWN0dWFsIHByYWN0aWNlIGZldyBvZiB0aGVtIGFyZSB1c2VkIGluIGFueSBwYXJ0aWN1bGFyIGNvbnRleHQuCi1Gb3IgaW5zdGFuY2UsIGEgZnJlcXVlbnQgdXNlIG9mIFxjCi0uQiBsZFxjCi1cJiBpcyB0byBsaW5rIHN0YW5kYXJkIFVuaXgKLW9iamVjdCBmaWxlcyBvbiBhIHN0YW5kYXJkLCBzdXBwb3J0ZWQgVW5peCBzeXN0ZW0uICBPbiBzdWNoIGEgc3lzdGVtLCB0bwotbGluayBhIGZpbGUgXGMKLS5CIGhlbGxvLm9cYwotXCY6Ci0uc3AKLS5icgotJFwgbGRcIFwtb1wgb3V0cHV0XCAvbGliL2NydDAub1wgaGVsbG8ub1wgXC1sYwotLmJyCi0uc3AKLVRoaXMgdGVsbHMgXGMKLS5CIGxkXGMKLVwmIHRvIHByb2R1Y2UgYSBmaWxlIGNhbGxlZCBcYwotLkIgb3V0cHV0XGMKLVwmIGFzIHRoZQotcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgXGMKLS5CIC9saWIvY3J0MC5vXGMKLVwmIHdpdGggXGMKLS5CIGhlbGxvLm9cYwotXCYgYW5kCi10aGUgbGlicmFyeSBcYwotLkIgbGliYy5hXGMKLVwmIHdoaWNoIHdpbGwgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBzZWFyY2gKLWRpcmVjdG9yaWVzLgotCi1UaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gXGMKLS5CIGxkXGMKLVwmIG1heSBiZSBzcGVjaWZpZWQgaW4gYW55IG9yZGVyLCBhbmQKLW1heSBiZSByZXBlYXRlZCBhdCB3aWxsLiAgRm9yIHRoZSBtb3N0IHBhcnQsIHJlcGVhdGluZyBhbiBvcHRpb24gd2l0aCBhCi1kaWZmZXJlbnQgYXJndW1lbnQgd2lsbCBlaXRoZXIgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdCwgb3Igb3ZlcnJpZGUgcHJpb3IKLW9jY3VycmVuY2VzICh0aG9zZSBmdXJ0aGVyIHRvIHRoZSBsZWZ0IG9uIHRoZSBjb21tYW5kIGxpbmUpIG9mIGFuCi1vcHRpb24uICAKLQotVGhlIGV4Y2VwdGlvbnNcKGVtXCZ3aGljaCBtYXkgbWVhbmluZ2Z1bGx5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2VcKGVtXCZhcmUKLVxjCi0uQiBcLUFcYwotXCYsIFxjCi0uQiBcLWJcYwotXCYgKG9yIGl0cyBzeW5vbnltIFxjCi0uQiBcLWZvcm1hdFxjCi1cJiksIFxjCi0uQiBcLWRlZnN5bVxjCi1cJiwKLVxjCi0uQiBcLUxcYwotXCYsIFxjCi0uQiBcLWxcYwotXCYsIFxjCi0uQiBcLVJcYwotXCYsIGFuZCBcYwotLkIgXC11XGMKLVwmLgotCi1UaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgdG8gYmUgbGlua2VkIHRvZ2V0aGVyLCBzaG93biBhcyBcYwotLkkgb2JqZmlsZVxjCi1cJiwKLW1heSBmb2xsb3csIHByZWNlZGUsIG9yIGJlIG1peGVkIGluIHdpdGggY29tbWFuZC1saW5lIG9wdGlvbnM7IHNhdmUgdGhhdAotYW4gXGMKLS5JIG9iamZpbGVcYwotXCYgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbiBhbiBvcHRpb24gZmxhZyBhbmQKLWl0cyBhcmd1bWVudC4KLQotVXN1YWxseSB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCBhdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUsIGJ1dCBvdGhlcgotZm9ybXMgb2YgYmluYXJ5IGlucHV0IGZpbGVzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB3aXRoIFxjCi0uQiBcLWxcYwotXCYsCi1cYwotLkIgXC1SXGMKLVwmLCBhbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgXGMKLS5JIG5vXGMKLVwmIGJpbmFyeSBpbnB1dAotZmlsZXMgYXQgYWxsIGFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQKLWlzc3VlcyB0aGUgbWVzc2FnZSBgXHxcYwotLkIgTm8gaW5wdXQgZmlsZXNcYwotXHwnLgotCi1PcHRpb24gYXJndW1lbnRzIG11c3QgZWl0aGVyIGZvbGxvdyB0aGUgb3B0aW9uIGxldHRlciB3aXRob3V0IGludGVydmVuaW5nCi13aGl0ZXNwYWNlLCBvciBiZSBnaXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQotb3B0aW9uIHRoYXQgcmVxdWlyZXMgdGhlbS4KLQotLlRQCi0uQkkgIi1BIiAiYXJjaGl0ZWN0dXJlIgotSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBcYwotLkIgbGRcYwotXCYsIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKLUludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgXGMKLS5CIGxkXGMKLVwmIGNvbmZpZ3VyYXRpb24sIHRoZQotXGMKLS5JIGFyY2hpdGVjdHVyZVxjCi1cJiBhcmd1bWVudCBpcyBvbmUgb2YgdGhlIHR3by1sZXR0ZXIgbmFtZXMgaWRlbnRpZnlpbmcKLW1lbWJlcnMgb2YgdGhlIDk2MCBmYW1pbHk7IHRoZSBvcHRpb24gc3BlY2lmaWVzIHRoZSBkZXNpcmVkIG91dHB1dAotdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55IGluY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGlucHV0IGZpbGVzLgotSXQgYWxzbyBtb2RpZmllcyB0aGUgbGlua2VyJ3Mgc2VhcmNoIHN0cmF0ZWd5IGZvciBhcmNoaXZlIGxpYnJhcmllcywgdG8KLXN1cHBvcnQgdGhlIHVzZSBvZiBsaWJyYXJpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyCi1hcmNoaXRlY3R1cmUsIGJ5IGluY2x1ZGluZyBpbiB0aGUgc2VhcmNoIGxvb3AgbmFtZXMgc3VmZml4ZWQgd2l0aCB0aGUKLXN0cmluZyBpZGVudGlmeWluZyB0aGUgYXJjaGl0ZWN0dXJlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91ciBcYwotLkIgbGRcYwotXCYgY29tbWFuZCBsaW5lIGluY2x1ZGVkIGBcfFxjCi0uQiBcLUFDQVxjCi1cfCcgYXMKLXdlbGwgYXMgYFx8XGMKLS5CIFwtbHRyeVxjCi1cfCcsIHRoZSBsaW5rZXIgd291bGQgbG9vayAoaW4gaXRzIGJ1aWx0LWluIHNlYXJjaAotcGF0aHMsIGFuZCBpbiBhbnkgcGF0aHMgeW91IHNwZWNpZnkgd2l0aCBcYwotLkIgXC1MXGMKLVwmKSBmb3IgYSBsaWJyYXJ5IHdpdGgKLXRoZSBuYW1lcwotLnNwCi0uYnIKLXRyeQotLmJyCi1saWJ0cnkuYQotLmJyCi10cnljYQotLmJyCi1saWJ0cnljYS5hCi0uYnIKLS5zcAotCi1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIGBcfFxjCi0uQiBcLUFDQVxjCi1cfCcuCi0KLUZ1dHVyZSByZWxlYXNlcyBvZiBcYwotLkIgbGRcYwotXCYgbWF5IHN1cHBvcnQgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGZvcgotb3RoZXIgYXJjaGl0ZWN0dXJlIGZhbWlsaWVzLgotCi1Zb3UgY2FuIG1lYW5pbmdmdWxseSB1c2UgXGMKLS5CIFwtQVxjCi1cJiBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgaWYKLWFuIGFyY2hpdGVjdHVyZSBmYW1pbHkgYWxsb3dzIGNvbWJpbmF0aW9uIG9mIHRhcmdldCBhcmNoaXRlY3R1cmVzOyBlYWNoCi11c2Ugd2lsbCBhZGQgYW5vdGhlciBwYWlyIG9mIG5hbWUgdmFyaWFudHMgdG8gc2VhcmNoIGZvciB3aGVuIFxjCi0uQiBcLWwKLXNwZWNpZmllcyBhIGxpYnJhcnkuCi0KLS5UUAotLkJJICJcLWIgIiAiaW5wdXQtZm9ybWF0IgotU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzIHRoYXQgZm9sbG93IHRoaXMgb3B0aW9uCi1vbiB0aGUgY29tbWFuZCBsaW5lLiAgWW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzCi1cYwotLkIgbGRcYwotXCYgaXMgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYSBkZWZhdWx0IGlucHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCYgaXMgYSB0ZXh0IHN0cmluZywgdGhlCi1uYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgCi1cYwotLkIgXC1mb3JtYXQgXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlxjCi1cJiBoYXMgdGhlIHNhbWUgZWZmZWN0LCBhcyBkb2VzIHRoZSBzY3JpcHQgY29tbWFuZAotLkJSIFRBUkdFVCAuCi0KLVlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSBsaW5raW5nIGZpbGVzIHdpdGggYW4gdW51c3VhbAotYmluYXJ5IGZvcm1hdC4gIFlvdSBjYW4gYWxzbyB1c2UgXGMKLS5CIFwtYlxjCi1cJiB0byBzd2l0Y2ggZm9ybWF0cyBleHBsaWNpdGx5ICh3aGVuCi1saW5raW5nIG9iamVjdCBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyksIGJ5IGluY2x1ZGluZwotXGMKLS5CIFwtYiBcYwotLkkgaW5wdXQtZm9ybWF0XGMKLVwmXGMKLVwmIGJlZm9yZSBlYWNoIGdyb3VwIG9mIG9iamVjdCBmaWxlcyBpbiBhCi1wYXJ0aWN1bGFyIGZvcm1hdC4gIAotCi1UaGUgZGVmYXVsdCBmb3JtYXQgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIEdOVVRBUkdFVFxjCi1cJi4gIFlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGlucHV0Ci1mb3JtYXQgZnJvbSBhIHNjcmlwdCwgdXNpbmcgdGhlIGNvbW1hbmQgXGMKLS5CIFRBUkdFVFxjCi1cJi4KLQotLlRQCi0uQiBcLUJzdGF0aWMgCi1EbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbgotcGxhdGZvcm1zIGZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuCi0KLS5UUAotLkIgXC1CZHluYW1pYwotTGluayBhZ2FpbnN0IGR5bmFtaWMgbGlicmFyaWVzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgb24gcGxhdGZvcm1zCi1mb3Igd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBvcHRpb24gaXMgbm9ybWFsbHkgdGhlCi1kZWZhdWx0IG9uIHN1Y2ggcGxhdGZvcm1zLgotCi0uVFAKLS5CIFwtQnN5bWJvbGljCi1XaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGJpbmQgcmVmZXJlbmNlcyB0byBnbG9iYWwgc3ltYm9scyB0bwotdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgaWYgYW55LiAgTm9ybWFsbHksIGl0IGlzCi1wb3NzaWJsZSBmb3IgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgdGhlCi1kZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwKLW9uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi0uVFAKLS5CSSAiXC1jICIgImNvbW1hbmRmaWxlIgotRGlyZWN0cyBcYwotLkIgbGRcYwotXCYgdG8gcmVhZCBsaW5rIGNvbW1hbmRzIGZyb20gdGhlIGZpbGUKLVxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJi4gIFRoZXNlIGNvbW1hbmRzIHdpbGwgY29tcGxldGVseSBvdmVycmlkZSBcYwotLkIgbGRcYwotXCYncwotZGVmYXVsdCBsaW5rIGZvcm1hdCAocmF0aGVyIHRoYW4gYWRkaW5nIHRvIGl0KTsgXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmIG11c3QKLXNwZWNpZnkgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgdGhlIHRhcmdldCBmb3JtYXQuCi0KLQotWW91IG1heSBhbHNvIGluY2x1ZGUgYSBzY3JpcHQgb2YgbGluayBjb21tYW5kcyBkaXJlY3RseSBpbiB0aGUgY29tbWFuZAotbGluZSBieSBicmFja2V0aW5nIGl0IGJldHdlZW4gYFx8XGMKLS5CIHtcYwotXHwnIGFuZCBgXHxcYwotLkIgfVxjCi1cfCcgY2hhcmFjdGVycy4KLQotLlRQCi0uQiBcLVwtY3JlZgotT3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgSWYgYSBsaW5rZXIgbWFwIGZpbGUgaXMgYmVpbmcKLWdlbmVyYXRlZCwgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpcyBwcmludGVkIHRvIHRoZSBtYXAgZmlsZS4KLU90aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0uVFAKLS5CIFwtZCAKLS5UUAotLkIgXC1kYwotLlRQCi0uQiBcLWRwCi1UaGVzZSB0aHJlZSBvcHRpb25zIGFyZSBlcXVpdmFsZW50OyBtdWx0aXBsZSBmb3JtcyBhcmUgc3VwcG9ydGVkIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMuICBVc2UgYW55IG9mIHRoZW0gdG8gbWFrZSBcYwotLkIgbGQKLWFzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGEgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUgaXMKLXNwZWNpZmllZCAoXGMKLS5CIFwtclxjCi1cJikuICBUaGUgc2NyaXB0IGNvbW1hbmQKLVxjCi0uQiBGT1JDRV9DT01NT05fQUxMT0NBVElPTlxjCi1cJiBoYXMgdGhlIHNhbWUgZWZmZWN0LgotCi0uVFAKLS5CSSAiLWRlZnN5bSAiICJzeW1ib2wiICJcZlIgPSBcZlAiIGV4cHJlc3Npb24KLUNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQotYWRkcmVzcyBnaXZlbiBieSBcYwotLkkgZXhwcmVzc2lvblxjCi1cJi4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIGFzIG1hbnkKLXRpbWVzIGFzIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgY29tbWFuZCBsaW5lLiAgQQotbGltaXRlZCBmb3JtIG9mIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkIGZvciB0aGUgXGMKLS5JIGV4cHJlc3Npb25cYwotXCYgaW4gdGhpcwotY29udGV4dDogeW91IG1heSBnaXZlIGEgaGV4YWRlY2ltYWwgY29uc3RhbnQgb3IgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcKLXN5bWJvbCwgb3IgdXNlIFxjCi0uQiArXGMKLVwmIGFuZCBcYwotLkIgXC1cYwotXCYgdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCi1jb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgotdXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQuCi0KLS5UUAotLkIgXC1cLWRlbWFuZ2xlCi0uVFAKLS5CIFwtXC1ub1wtZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvcgotbWVzc2FnZXMgYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdAotdHJpZXMgdG8gcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwotdW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMKLUMrKyBtYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwKLWRlbWFuZ2xlIGJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotLkIgQ09MTEVDVF9OT19ERU1BTkdMRQotaXMgc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLQotLlRQCi0uQkkgIi1lICIgImVudHJ5IlxjCi1cJiAKLVVzZSBcYwotLkkgZW50cnlcYwotXCYgYXMgdGhlIGV4cGxpY2l0IHN5bWJvbCBmb3IgYmVnaW5uaW5nIGV4ZWN1dGlvbiBvZiB5b3VyCi1wcm9ncmFtLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBlbnRyeSBwb2ludC4gIFNlZSB0aGUgYFx8XGMKLS5CIGxkXGMKLVx8JyBlbnRyeSBpbiBgXHxcYwotLkIgaW5mb1xjCi1cfCcgZm9yIGEKLWRpc2N1c3Npb24gb2YgZGVmYXVsdHMgYW5kIG90aGVyIHdheXMgb2Ygc3BlY2lmeWluZyB0aGUKLWVudHJ5IHBvaW50LgotCi0uVFAKLS5CIFwtZW1iZWRkZWRcLXJlbG9jcwotVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gbGlua2luZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLAotZ2VuZXJhdGVkIGJ5IHRoZQotLkIgXC1tZW1iZWRkZWRcLXBpYwotb3B0aW9uIHRvIHRoZSBHTlUgY29tcGlsZXIgYW5kIGFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvCi1jcmVhdGUgYSB0YWJsZSB3aGljaCBtYXkgYmUgdXNlZCBhdCBydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoCi13YXMgc3RhdGljYWxseSBpbml0aWFsaXplZCB0byBwb2ludGVyIHZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbgotdGVzdHN1aXRlL2xkLWVtcGljIGZvciBkZXRhaWxzLgotCi0uVFAKLS5CIFwtRQotLlRQCi0uQiBcLWV4cG9ydFwtZHluYW1pYwotV2hlbiBjcmVhdGluZyBhbiBFTEYgZmlsZSwgYWRkIGFsbCBzeW1ib2xzIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLU5vcm1hbGx5LCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgY29udGFpbnMgb25seSBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkCi1ieSBhIGR5bmFtaWMgb2JqZWN0LiAgVGhpcyBvcHRpb24gaXMgbmVlZGVkIGZvciBzb21lIHVzZXMgb2YKLS5JIGRsb3Blbi4KLQotLlRQCi0uQkkgIi1mICIgIm5hbWUiCi0uVFAKLS5CSSAiLS1hdXhpbGlhcnkgIiAibmFtZSIKLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfQVVYSUxJQVJZIGZpZWxkCi10byB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wKLXRhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGF1eGlsaWFyeSBmaWx0ZXIgb24gdGhlCi1zeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QKLS5JIG5hbWUuCi0KLS5UUAotLkJJICItRiAiICJuYW1lIgotLlRQCi0uQkkgIi0tZmlsdGVyICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX0ZJTFRFUiBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgVGhpcyB0ZWxscyB0aGUgZHluYW1pYyBsaW5rZXIgdGhhdCB0aGUgc3ltYm9sIHRhYmxlCi1vZiB0aGUgc2hhcmVkIG9iamVjdCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlciBvbiB0aGUgc3ltYm9sIHRhYmxlIG9mCi10aGUgc2hhcmVkIG9iamVjdAotLkkgbmFtZS4KLQotLlRQCi0uQkkgIlwtZm9ybWF0ICIgImlucHV0XC1mb3JtYXQiCi1TeW5vbnltIGZvciBcYwotLkIgXC1iXGMKLVwmIFxjCi0uSSBpbnB1dFwtZm9ybWF0XGMKLVwmLgotCi0uVFAKLS5CIFwtZwotQWNjZXB0ZWQsIGJ1dCBpZ25vcmVkOyBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgotCi0uVFAKLS5CSSAiXC1HICIgInNpemUiXGMKLVNldCB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUCByZWdpc3RlcgotdG8KLS5JIHNpemUKLXVuZGVyIE1JUFMgRUNPRkYuICBJZ25vcmVkIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi0uVFAKLS5CSSAiLWggIiAibmFtZSIKLS5UUAotLkJJICItc29uYW1lICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX1NPTkFNRSBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgV2hlbiBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIGEgc2hhcmVkIG9iamVjdAotd2hpY2ggaGFzIGEgRFRfU09OQU1FIGZpZWxkLCB0aGVuIHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgcnVuIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHNoYXJlZCBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBEVF9TT05BTUUKLWZpZWxkIHJhdGhlciB0aGFuIHRoZSB1c2luZyB0aGUgZmlsZSBuYW1lIGdpdmVuIHRvIHRoZSBsaW5rZXIuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLVRoaXMgb3B0aW9uIGFuZAotLkIgXC1cLXZlcnNpb24KLWJlZ2luIHdpdGggdHdvIGRhc2hlcyBpbnN0ZWFkIG9mIG9uZQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBHTlUgcHJvZ3JhbXMuICBUaGUgb3RoZXIgb3B0aW9ucyBzdGFydCB3aXRoCi1vbmx5IG9uZSBkYXNoIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4KLQotLlRQCi0uQiBcLWkKLVBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbGluayAoc2FtZSBhcyBvcHRpb24gXGMKLS5CIFwtclxjCi1cJikuCi0KLS5UUAotLkJJICJcLWwiICJhciJcYwotXCYgCi1BZGQgYW4gYXJjaGl2ZSBmaWxlIFxjCi0uSSBhclxjCi1cJiB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rLiAgVGhpcyAKLW9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgXGMKLS5CIGxkXGMKLVwmIHdpbGwgc2VhcmNoIGl0cwotcGF0aC1saXN0IGZvciBvY2N1cnJlbmNlcyBvZiBcYwotLkIgbGliXGMKLS5JIGFyXGMKLVwmLmFcYwotXCYgZm9yIGV2ZXJ5IFxjCi0uSSBhcgotc3BlY2lmaWVkLgotCi0uVFAKLS5CSSAiXC1MIiAic2VhcmNoZGlyIgotVGhpcyBjb21tYW5kIGFkZHMgcGF0aCBcYwotLkkgc2VhcmNoZGlyXGMKLVwmIHRvIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQKLVxjCi0uQiBsZFxjCi1cJiB3aWxsIHNlYXJjaCBmb3IgYXJjaGl2ZSBsaWJyYXJpZXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbgotYW55IG51bWJlciBvZiB0aW1lcy4KLQotVGhlIGRlZmF1bHQgc2V0IG9mIHBhdGhzIHNlYXJjaGVkICh3aXRob3V0IGJlaW5nIHNwZWNpZmllZCB3aXRoCi1cYwotLkIgXC1MXGMKLVwmKSBkZXBlbmRzIG9uIHdoYXQgZW11bGF0aW9uIG1vZGUgXGMKLS5CIGxkXGMKLVwmIGlzIHVzaW5nLCBhbmQgaW4KLXNvbWUgY2FzZXMgYWxzbyBvbiBob3cgaXQgd2FzIGNvbmZpZ3VyZWQuICAgIFRoZQotcGF0aHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIGEgbGluayBzY3JpcHQgd2l0aCB0aGUgXGMKLS5CIFNFQVJDSF9ESVIKLWNvbW1hbmQuCi0KLS5UUAotLkIgXC1NIAotUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KLWFib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYwotLkIgbGRcYwotXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKLWNvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCi0KLS5UUAotLkJJICJcLU1hcCAiICJtYXBmaWxlIlxjCi1QcmludCB0byB0aGUgZmlsZQotLkkgbWFwZmlsZQotYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KLWFib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYwotLkIgbGRcYwotXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKLWNvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCi0KLS5UUAotLkJJICJcLW0gIiAiZW11bGF0aW9uIlxjCi1FbXVsYXRlIHRoZQotLkkgZW11bGF0aW9uCi1saW5rZXIuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZSBlbXVsYXRpb25zIHdpdGggdGhlCi0uSSBcLVwtdmVyYm9zZQotb3IKLS5JIFwtVgotb3B0aW9ucy4gIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgY29tcGlsZWQtaW4gZGVmYXVsdCwgd2hpY2ggaXMgdGhlCi1zeXN0ZW0gZm9yIHdoaWNoIHlvdSBjb25maWd1cmVkCi0uQlIgbGQgLgotCi0uVFAKLS5CIFwtTiAKLXNwZWNpZmllcyByZWFkYWJsZSBhbmQgd3JpdGFibGUgXGMKLS5CIHRleHRcYwotXCYgYW5kIFxjCi0uQiBkYXRhXGMKLVwmIHNlY3Rpb25zLiBJZgotdGhlIG91dHB1dCBmb3JtYXQgc3VwcG9ydHMgVW5peCBzdHlsZSBtYWdpYyBudW1iZXJzLCB0aGUgb3V0cHV0IGlzCi1tYXJrZWQgYXMgXGMKLS5CIE9NQUdJQ1xjCi1cJi4KLQotV2hlbiB5b3UgdXNlIHRoZSBgXHxcYwotLkIgXC1OXGMKLVwmXHwnIG9wdGlvbiwgdGhlIGxpbmtlciBkb2VzIG5vdCBwYWdlLWFsaWduIHRoZQotZGF0YSBzZWdtZW50LgotCi0uVFAKLS5CIFwtbiAKLXNldHMgdGhlIHRleHQgc2VnbWVudCB0byBiZSByZWFkIG9ubHksIGFuZCBcYwotLkIgTk1BR0lDXGMKLVwmIGlzIHdyaXR0ZW4KLWlmIHBvc3NpYmxlLgotCi0uVFAKLS5CIFwtbm9pbmhpYml0XC1leGVjCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKLWVycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2Vzcy4gIFdpdGggdGhpcyBmbGFnLCB5b3UgY2FuIHNwZWNpZnkgdGhhdAoteW91IHdpc2ggdGhlIG91dHB1dCBmaWxlIHJldGFpbmVkIGV2ZW4gYWZ0ZXIgbm9uLWZhdGFsIGVycm9ycy4KLQotLlRQCi0uQiBcLW5vXC1rZWVwXC1tZW1vcnkKLVRoZSBsaW5rZXIgbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nCi10aGUgc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUKLWxpbmtlciB0byBpbnN0ZWFkIG9wdGltaXplIGZvciBtZW1vcnkgdXNhZ2UsIGJ5IHJlcmVhZGluZyB0aGUgc3ltYm9sCi10YWJsZXMgYXMgbmVjZXNzYXJ5LiAgVGhpcyBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGxpbmtlciBydW5zIG91dCBvZgotbWVtb3J5IHNwYWNlIHdoaWxlIGxpbmtpbmcgYSBsYXJnZSBleGVjdXRhYmxlLgotCi0uVFAKLS5CIFwtbm9cLXdhcm5cLW1pc21hdGNoCi1Ob3JtYWxseSB0aGUgbGlua2VyIHdpbGwgZ2l2ZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGxpbmsgdG9nZXRoZXIKLWlucHV0IGZpbGVzIHRoYXQgYXJlIG1pc21hdGNoZWQgZm9yIHNvbWUgcmVhc29uLCBwZXJoYXBzIGJlY2F1c2UgdGhleQotaGF2ZSBiZWVuIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQgcHJvY2Vzc29ycyBvciBmb3IgZGlmZmVyZW50Ci1lbmRpYW5uZXNzZXMuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUgbGlua2VyIHRoYXQgaXQgc2hvdWxkIHNpbGVudGx5Ci1wZXJtaXQgc3VjaCBwb3NzaWJsZSBlcnJvcnMuICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGgKLWNhcmUsIGluIGNhc2VzIHdoZW4geW91IGhhdmUgdGFrZW4gc29tZSBzcGVjaWFsIGFjdGlvbiB0aGF0IGVuc3VyZXMKLXRoYXQgdGhlIGxpbmtlciBlcnJvcnMgYXJlIGluYXBwcm9wcmlhdGUuCi0KLS5UUAotLkJJICJcLW8gIiAib3V0cHV0IgotLkkgb3V0cHV0XGMKLVwmIGlzIGEgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgXGMKLS5CIGxkXGMKLVwmOyBpZiB0aGlzCi1vcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgYFx8XGMKLS5CIGEub3V0XGMKLVx8JyBpcyB1c2VkIGJ5IGRlZmF1bHQuICBUaGUKLXNjcmlwdCBjb21tYW5kIFxjCi0uQiBPVVRQVVRcYwotXCYgY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotLlRQCi0uQkkgIlwtTyIgImxldmVsIgotR2VuZXJhdGUgb3B0aW1pemVkIG91dHB1dCBmaWxlcy4gIFRoaXMgbWlnaHQgdXNlIHNpZ25pZmljYW50bHkgbW9yZQotdGltZSBhbmQgdGhlcmVmb3JlIHByb2JhYmx5IHNob3VsZCBiZSBlbmFibGVkIG9ubHkgZm9yIGdlbmVyYXRpbmcgdGhlCi1maW5hbCBiaW5hcnkuCi1cYwotLkkgbGV2ZWxcYwotXCYgaXMgc3VwcG9zZWQgdG8gYmUgYSBudW1lcmljIHZhbHVlLiAgQW55IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGVuYWJsZXMKLXRoZSBvcHRpbWl6YXRpb25zLgotCi0uVFAKLS5CSSAiXC1vZm9ybWF0ICIgIm91dHB1dFwtZm9ybWF0IgotU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvYmplY3QgZmlsZS4KLVlvdSBkb24ndCB1c3VhbGx5IG5lZWQgdG8gc3BlY2lmeSB0aGlzLCBhcwotXGMKLS5CIGxkXGMKLVwmIGlzIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBhcyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCi0uSSBvdXRwdXQtZm9ybWF0XGMKLVwmIGlzIGEgdGV4dCBzdHJpbmcsIHRoZQotbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgQkZEIGxpYnJhcmllcy4gIAotVGhlIHNjcmlwdCBjb21tYW5kCi0uQiBPVVRQVVRfRk9STUFUCi1jYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQgdGhpcyBvcHRpb24gb3ZlcnJpZGVzIGl0LgotCi0uVFAKLS5CSSAiXC1SICIgImZpbGVuYW1lIgotUmVhZCBzeW1ib2wgbmFtZXMgYW5kIHRoZWlyIGFkZHJlc3NlcyBmcm9tIFxjCi0uSSBmaWxlbmFtZVxjCi1cJiwgYnV0IGRvIG5vdAotcmVsb2NhdGUgaXQgb3IgaW5jbHVkZSBpdCBpbiB0aGUgb3V0cHV0LiAgVGhpcyBhbGxvd3MgeW91ciBvdXRwdXQgZmlsZQotdG8gcmVmZXIgc3ltYm9saWNhbGx5IHRvIGFic29sdXRlIGxvY2F0aW9ucyBvZiBtZW1vcnkgZGVmaW5lZCBpbiBvdGhlcgotcHJvZ3JhbXMuCi0KLS5UUAotLkIgXC1yZWxheAotQW4gb3B0aW9uIHdpdGggbWFjaGluZSBkZXBlbmRlbnQgZWZmZWN0cy4gIEN1cnJlbnRseSB0aGlzIG9wdGlvbiBpcyBvbmx5Ci1zdXBwb3J0ZWQgb24gdGhlIEg4LzMwMC4KLQotT24gc29tZSBwbGF0Zm9ybXMsIHVzZSB0aGlzIG9wdGlvbiB0byBwZXJmb3JtIGdsb2JhbCBvcHRpbWl6YXRpb25zIHRoYXQKLWJlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZyBpbiB5b3VyIHByb2dyYW0sIHN1Y2gKLWFzIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMgYW5kIHN5bnRoZXNpemluZyBuZXcgaW5zdHJ1Y3Rpb25zIGluIHRoZQotb3V0cHV0IG9iamVjdCBmaWxlLiAgCi0KLU9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIGBcfFxjCi0uQiBcLXJlbGF4XGMKLVwmXHwnIGlzIGFjY2VwdGVkLCBidXQgaGFzIG5vIGVmZmVjdC4KLQotLlRQCi0uQiBcLXIgCi1HZW5lcmF0ZXMgcmVsb2NhdGFibGUgb3V0cHV0XChlbVwmaS5lLiwgZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KLXR1cm4gc2VydmUgYXMgaW5wdXQgdG8gXGMKLS5CIGxkXGMKLVwmLiAgVGhpcyBpcyBvZnRlbiBjYWxsZWQgXGMKLS5JIHBhcnRpYWwKLWxpbmtpbmdcYwotXCYuICBBcyBhIHNpZGUgZWZmZWN0LCBpbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IHN0YW5kYXJkIFVuaXgKLW1hZ2ljIG51bWJlcnMsIHRoaXMgb3B0aW9uIGFsc28gc2V0cyB0aGUgb3V0cHV0IGZpbGUncyBtYWdpYyBudW1iZXIgdG8KLVxjCi0uQiBPTUFHSUNcYwotXCYuCi1JZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhYnNvbHV0ZSBmaWxlIGlzIHByb2R1Y2VkLiAgV2hlbgotbGlua2luZyBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIFxjCi0uSSB3aWxsIG5vdFxjCi1cJiByZXNvbHZlIHJlZmVyZW5jZXMgdG8KLWNvbnN0cnVjdG9yczsgXGMKLS5CIFwtVXJcYwotXCYgaXMgYW4gYWx0ZXJuYXRpdmUuIAotCi1UaGlzIG9wdGlvbiBkb2VzIHRoZSBzYW1lIGFzIFxjCi0uQiBcLWlcYwotXCYuCi0KLS5UUAotLkIgXC1ycGF0aFwgXGZJZGlyZWN0b3J5Ci1BZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCi1saW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgCi0uQiBcLXJwYXRoCi1hcmd1bWVudHMgYXJlIGNvbmNhdGVuYXRlZCBhbmQgcGFzc2VkIHRvIHRoZSBydW50aW1lIGxpbmtlciwgd2hpY2ggdXNlcwotdGhlbSB0byBsb2NhdGUgc2hhcmVkIG9iamVjdHMgYXQgcnVudGltZS4gIFRoZQotLkIgXC1ycGF0aAotb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkKLXNoYXJlZCBvYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YKLXRoZQotLkIgXC1ycGF0aFwtbGluawotb3B0aW9uLiAgSWYKLS5CIFwtcnBhdGgKLWlzIG5vdCB1c2VkIHdoZW4gbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSwgdGhlIGNvbnRlbnRzIG9mIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIExEX1JVTl9QQVRICi13aWxsIGJlIHVzZWQgaWYgaXQgaXMgZGVmaW5lZC4KLQotVGhlCi0uQiBcLXJwYXRoCi1vcHRpb24gbWF5IGFsc28gYmUgdXNlZCBvbiBTdW5PUy4gIEJ5IGRlZmF1bHQsIG9uIFN1bk9TLCB0aGUgbGlua2VyCi13aWxsIGZvcm0gYSBydW50aW1lIHNlYXJjaCBwYXRoIG91dCBvZiBhbGwgdGhlCi0uQiBcLUwKLW9wdGlvbnMgaXQgaXMgZ2l2ZW4uICBJZiBhCi0uQiBcLXJwYXRoCi1vcHRpb24gaXMgdXNlZCwgdGhlIHJ1bnRpbWUgc2VhcmNoIHBhdGggd2lsbCBiZSBmb3JtZWQgZXhjbHVzaXZlbHkKLXVzaW5nIHRoZQotLkIgXC1ycGF0aAotb3B0aW9ucywgaWdub3JpbmcKLXRoZQotLkIgXC1MCi1vcHRpb25zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcgZ2NjLCB3aGljaCBhZGRzIG1hbnkKLS5CIFwtTAotb3B0aW9ucyB3aGljaCBtYXkgYmUgb24gTkZTIG1vdW50ZWQgZmlsZXN5c3RlbXMuCi0KLS5UUAotLkIgXC1ycGF0aFwtbGlua1wgXGZJZGlyZWN0b3J5Ci1XaGVuIHVzaW5nIEVMRiBvciBTdW5PUywgb25lIHNoYXJlZCBsaWJyYXJ5IG1heSByZXF1aXJlIGFub3RoZXIuICBUaGlzCi1oYXBwZW5zIHdoZW4gYW4KLS5CIGxkXCBcLXNoYXJlZAotbGluayBpbmNsdWRlcyBhIHNoYXJlZCBsaWJyYXJ5IGFzIG9uZSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0KLVdoZW4gdGhlIGxpbmtlciBlbmNvdW50ZXJzIHN1Y2ggYSBkZXBlbmRlbmN5IHdoZW4gZG9pbmcgYSBub24tc2hhcmVkLAotbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQKLXNoYXJlZCBsaWJyYXJ5IGFuZCBpbmNsdWRlIGl0IGluIHRoZSBsaW5rLCBpZiBpdCBpcyBub3QgaW5jbHVkZWQKLWV4cGxpY2l0bHkuICBJbiBzdWNoIGEgY2FzZSwgdGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24gc3BlY2lmaWVzIHRoZSBmaXJzdCBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLiAgVGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMgZWl0aGVyIGJ5IHNwZWNpZnlpbmcKLWEgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieSBhcHBlYXJpbmcgbXVsdGlwbGUgdGltZXMuCi0KLUlmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCi13YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgotCi0uVFAKLS5CIFwtUyAKLU9taXRzIGRlYnVnZ2VyIHN5bWJvbCBpbmZvcm1hdGlvbiAoYnV0IG5vdCBhbGwgc3ltYm9scykgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCi0KLS5UUAotLkIgXC1zIAotT21pdHMgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotLlRQCi0uQiBcLXNoYXJlZAotQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBFTEYgYW5kCi1TdW5PUyBwbGF0Zm9ybXMgKG9uIFN1bk9TIGl0IGlzIG5vdCByZXF1aXJlZCwgYXMgdGhlIGxpbmtlciB3aWxsCi1hdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IHdoZW4gdGhlcmUgYXJlIHVuZGVmaW5lZCBzeW1ib2xzCi1hbmQgdGhlCi0uQiBcLWUKLW9wdGlvbiBpcyBub3QgdXNlZCkuCi0KLS5UUAotLkIgXC1zb3J0XC1jb21tb24KLU5vcm1hbGx5LCB3aGVuCi0uQiBsZAotcGxhY2VzIHRoZSBnbG9iYWwgY29tbW9uIHN5bWJvbHMgaW4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBzZWN0aW9ucywKLWl0IHNvcnRzIHRoZW0gYnkgc2l6ZS4gIEZpcnN0IGNvbWUgYWxsIHRoZSBvbmUgYnl0ZSBzeW1ib2xzLCB0aGVuIGFsbAotdGhlIHR3byBieXRlcywgdGhlbiBhbGwgdGhlIGZvdXIgYnl0ZXMsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgZWxzZS4KLVRoaXMgaXMgdG8gcHJldmVudCBnYXBzIGJldHdlZW4gc3ltYm9scyBkdWUgdG8KLWFsaWdubWVudCBjb25zdHJhaW50cy4gIFRoaXMgb3B0aW9uIGRpc2FibGVzIHRoYXQgc29ydGluZy4KLQotLlRQCi0uQiBcLXNwbGl0XC1ieVwtcmVsb2NcIFxmSWNvdW50Ci1UcnlzIHRvIGNyZWF0ZXMgZXh0cmEgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHNvIHRoYXQgbm8gc2luZ2xlCi1vdXRwdXQgc2VjdGlvbiBpbiB0aGUgZmlsZSBjb250YWlucyBtb3JlIHRoYW4KLS5JIGNvdW50Ci1yZWxvY2F0aW9ucy4KLVRoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCi1jZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCi1jYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLgotTm90ZSB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIHdvcmsgd2l0aCBvYmplY3QgZmlsZSBmb3JtYXRzIHdoaWNoIGRvIG5vdAotc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMuICBUaGUgbGlua2VyIHdpbGwgbm90IHNwbGl0IHVwIGluZGl2aWR1YWwKLWlucHV0IHNlY3Rpb25zIGZvciByZWRpc3RyaWJ1dGlvbiwgc28gaWYgYSBzaW5nbGUgaW5wdXQgc2VjdGlvbgotY29udGFpbnMgbW9yZSB0aGFuCi0uSSBjb3VudAotcmVsb2NhdGlvbnMgb25lIG91dHB1dCBzZWN0aW9uIHdpbGwgY29udGFpbiB0aGF0IG1hbnkgcmVsb2NhdGlvbnMuCi0KLS5UUAotLkIgXC1zcGxpdFwtYnlcLWZpbGUKLVNpbWlsYXIgdG8KLS5CIFwtc3BsaXRcLWJ5XC1yZWxvYwotYnV0IGNyZWF0ZXMgYSBuZXcgb3V0cHV0IHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZS4KLQotLlRQCi0uQkkgIlwtVGJzcyAiICJvcmciXGMKLS5UUAotLkJJICJcLVRkYXRhICIgIm9yZyJcYwotLlRQCi0uQkkgIlwtVHRleHQgIiAib3JnIlxjCi1Vc2UgXGMKLS5JIG9yZ1xjCi1cJiBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3JcKGVtXCZyZXNwZWN0aXZlbHlcKGVtXCZ0aGUKLVxjCi0uQiBic3NcYwotXCYsIFxjCi0uQiBkYXRhXGMKLVwmLCBvciB0aGUgXGMKLS5CIHRleHRcYwotXCYgc2VnbWVudCBvZiB0aGUgb3V0cHV0IGZpbGUuCi1cYwotLkkgb3JnXGMKLVwmIG11c3QgYmUgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLgotCi0uVFAKLS5CSSAiXC1UICIgImNvbW1hbmRmaWxlIgotRXF1aXZhbGVudCB0byBcYwotLkIgXC1jIFxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlxjCi1cJjsgc3VwcG9ydGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLW90aGVyIHRvb2xzLiAgCi0KLS5UUAotLkIgXC10IAotUHJpbnRzIG5hbWVzIG9mIGlucHV0IGZpbGVzIGFzIFxjCi0uQiBsZFxjCi1cJiBwcm9jZXNzZXMgdGhlbS4KLQotLlRQCi0uQkkgIlwtdSAiICJzeW0iCi1Gb3JjZXMgXGMKLS5JIHN5bVxjCi1cJiB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLgotVGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbCBtb2R1bGVzIGZyb20KLXN0YW5kYXJkIGxpYnJhcmllcy4gIFxjCi0uQiBcLXVcYwotXCYgbWF5IGJlIHJlcGVhdGVkIHdpdGggZGlmZmVyZW50IG9wdGlvbgotYXJndW1lbnRzIHRvIGVudGVyIGFkZGl0aW9uYWwgdW5kZWZpbmVkIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1VciAKLUZvciBhbnl0aGluZyBvdGhlciB0aGFuIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gaXMgZXF1aXZhbGVudCB0bwotXGMKLS5CIFwtclxjCi1cJjogaXQgZ2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dFwoZW1cJmkuZS4sIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCi10dXJuIHNlcnZlIGFzIGlucHV0IHRvIFxjCi0uQiBsZFxjCi1cJi4gIFdoZW4gbGlua2luZyBDKysgcHJvZ3JhbXMsIFxjCi0uQiBcLVVyCi0uSSB3aWxsXGMKLVwmIHJlc29sdmUgcmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMsIHVubGlrZSBcYwotLkIgXC1yXGMKLVwmLgotCi0uVFAKLS5CIFwtXC12ZXJib3NlCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkCi1hbmQgbGlzdCB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi1EaXNwbGF5IHdoaWNoIGlucHV0IGZpbGVzIGNhbiBhbmQgY2FuIG5vdCBiZSBvcGVuZWQuCi0KLS5UUAotLkIgXC12LCBcLVYKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBcYwotLkIgbGRcYwotXCYuCi1UaGUKLS5CIFwtVgotb3B0aW9uIGFsc28gbGlzdHMgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLXdhcm5cLWNvbW1vbgotV2FybiB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBjb21iaW5lZCB3aXRoIGFub3RoZXIgY29tbW9uIHN5bWJvbCBvciB3aXRoCi1hIHN5bWJvbCBkZWZpbml0aW9uLiAgVW5peCBsaW5rZXJzIGFsbG93IHRoaXMgc29tZXdoYXQgc2xvcHB5IHByYWN0aWNlLAotYnV0IGxpbmtlcnMgb24gc29tZSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBkbyBub3QuICBUaGlzIG9wdGlvbiBhbGxvd3MKLXlvdSB0byBmaW5kIHBvdGVudGlhbCBwcm9ibGVtcyBmcm9tIGNvbWJpbmluZyBnbG9iYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLXdhcm5cLWNvbnN0cnVjdG9ycwotV2FybiBpZiBhbnkgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhcmUgdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGEKLWZldyBvYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGZvcm1hdHMgbGlrZSBDT0ZGIG9yIEVMRiwgdGhlIGxpbmtlciBjYW4KLW5vdCBkZXRlY3QgdGhlIHVzZSBvZiBnbG9iYWwgY29uc3RydWN0b3JzLgotCi0uVFAKLS5CIFwtd2FyblwtbXVsdGlwbGVcLWdwCi1XYXJuIGlmIHRoZSBvdXRwdXQgZmlsZSByZXF1aXJlcyBtdWx0aXBsZSBnbG9iYWwtcG9pbnRlciB2YWx1ZXMuICBUaGlzCi1vcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIGZvciBjZXJ0YWluIHByb2Nlc3NvcnMsIHN1Y2ggYXMgdGhlIEFscGhhLgotCi0uVFAKLS5CIFwtd2Fyblwtb25jZQotT25seSB3YXJuIG9uY2UgZm9yIGVhY2ggdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgbW9kdWxlCi13aGljaCByZWZlcnMgdG8gaXQuCi0KLS5UUAotLkIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbgotV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKLWFsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgotVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0Ci1pcywgaWYgdGhlIFNFQ1RJT05TIGNvbW1hbmQgZG9lcyBub3Qgc3BlY2lmeSBhIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZQotc2VjdGlvbi4KLQotLlRQCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLUZvciBlYWNoIGFyY2hpdmUgbWVudGlvbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgdGhlCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLW9wdGlvbiwgaW5jbHVkZSBldmVyeSBvYmplY3QgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpbiB0aGUgbGluaywgcmF0aGVyCi10aGFuIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBmb3IgdGhlIHJlcXVpcmVkIG9iamVjdCBmaWxlcy4gIFRoaXMgaXMKLW5vcm1hbGx5IHVzZWQgdG8gdHVybiBhbiBhcmNoaXZlIGZpbGUgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBmb3JjaW5nCi1ldmVyeSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzaGFyZWQgbGlicmFyeS4KLQotLlRQCi0uQiBcLVwtbm9cLXdob2xlXC1hcmNoaXZlCi1UdXJuIG9mZiB0aGUgZWZmZWN0IG9mIHRoZQotLkIgXC1cLXdob2xlXC1hcmNoaXZlCi1vcHRpb24gZm9yIGFyY2hpdmVzIHdoaWNoIGFwcGVhciBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi0uVFAKLS5CSSAiLS13cmFwICIgInN5bWJvbCIKLVVzZSBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIAotLkkgc3ltYm9sLgotQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLS5JIHN5bWJvbAotd2lsbCBiZSByZXNvbHZlZCB0bwotLkJJICJfX3dyYXBfIiAic3ltYm9sIi4KLUFueSB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi0uQkkgIl9fcmVhbF8iICJzeW1ib2wiCi13aWxsIGJlIHJlc29sdmVkIHRvCi0uSSBzeW1ib2wuCi0KLS5UUAotLkIgXC1YIAotRGVsZXRlIGFsbCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scy4gIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXMgYWxsIGxvY2FsCi1zeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggYFx8XGMKLS5CIExcYwotXHwnLgotCi0uVFAKLS5CIFwteAotRGVsZXRlIGFsbCBsb2NhbCBzeW1ib2xzLgotCi0uUFAKLQotLlNIIEVOVklST05NRU5UCi1cYwotWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCi0uQiBsZFxjCi1cJiB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcYwotLkIgR05VVEFSR0VUXGMKLVwmLgotCi1cYwotLkIgR05VVEFSR0VUXGMKLVwmIGRldGVybWluZXMgdGhlIGlucHV0LWZpbGUgb2JqZWN0IGZvcm1hdCBpZiB5b3UgZG9uJ3QKLXVzZSBcYwotLkIgXC1iXGMKLVwmIChvciBpdHMgc3lub255bSBcYwotLkIgXC1mb3JtYXRcYwotXCYpLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKLW9mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdC4gIElmIHRoZXJlIGlzIG5vCi1cYwotLkIgR05VVEFSR0VUXGMKLVwmIGluIHRoZSBlbnZpcm9ubWVudCwgXGMKLS5CIGxkXGMKLVwmIHVzZXMgdGhlIG5hdHVyYWwgZm9ybWF0Ci1vZiB0aGUgaG9zdC4gSWYgXGMKLS5CIEdOVVRBUkdFVFxjCi1cJiBpcyBzZXQgdG8gXGMKLS5CIGRlZmF1bHRcYwotXCYgdGhlbiBCRkQgYXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlCi1pbnB1dCBmb3JtYXQgYnkgZXhhbWluaW5nIGJpbmFyeSBpbnB1dCBmaWxlczsgdGhpcyBtZXRob2Qgb2Z0ZW4KLXN1Y2NlZWRzLCBidXQgdGhlcmUgYXJlIHBvdGVudGlhbCBhbWJpZ3VpdGllcywgc2luY2UgdGhlcmUgaXMgbm8gbWV0aG9kCi1vZiBlbnN1cmluZyB0aGF0IHRoZSBtYWdpYyBudW1iZXIgdXNlZCB0byBmbGFnIG9iamVjdC1maWxlIGZvcm1hdHMgaXMKLXVuaXF1ZS4gIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZSBmb3IgQkZEIG9uIGVhY2ggc3lzdGVtCi1wbGFjZXMgdGhlIGNvbnZlbnRpb25hbCBmb3JtYXQgZm9yIHRoYXQgc3lzdGVtIGZpcnN0IGluIHRoZSBzZWFyY2gtbGlzdCwKLXNvIGFtYmlndWl0aWVzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb252ZW50aW9uLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLQotLkJSIG9iamR1bXAgKCAxICkKLS5icgotLmJyCi0uUkIgImBcfCIgbGQgIlx8JyBhbmQgYFx8IiBiaW51dGlscyAiXHwnIgotZW50cmllcyBpbgotLkIgaW5mb1xjCi0uYnIKLS5JIAotbGQ6IHRoZSBHTlUgbGlua2VyXGMKLSwgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIFJvbGFuZCBQZXNjaDsKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotLCBSb2xhbmQgSC4gUGVzY2guCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2xkL2xkLmggYi9sZC9sZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2E3NDYyLi4wMDAwMDAwCi0tLSBhL2xkL2xkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogbGQuaCAtLSBnZW5lcmFsIGxpbmtlciBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRF9ICi0jZGVmaW5lIExEX0gKLQotI2lmZGVmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGdldHRleHQgKFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0vKiBMb29rIGluIHRoaXMgZW52aXJvbm1lbnQgbmFtZSBmb3IgdGhlIGxpbmtlciB0byBwcmV0ZW5kIHRvIGJlICovCi0jZGVmaW5lIEVNVUxBVElPTl9FTlZJUk9OICJMREVNVUxBVElPTiIKLS8qIElmIGluIHRoZXJlIGxvb2sgZm9yIHRoZSBzdHJpbmdzOiAqLwotCi0vKiBMb29rIGluIHRoaXMgdmFyaWFibGUgZm9yIGEgdGFyZ2V0IGZvcm1hdCAqLwotI2RlZmluZSBUQVJHRVRfRU5WSVJPTiAiR05VVEFSR0VUIgotCi0vKiBJbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgcHV0IGluIGEgc2VjdGlvbiBvZiB0aGlzIG5hbWUgYXJlIGFjdHVhbGx5Ci0gICBkaXNjYXJkZWQuICAqLwotI2RlZmluZSBESVNDQVJEX1NFQ1RJT05fTkFNRSAiL0RJU0NBUkQvIgotCi0vKiBBIHdpbGRjYXJkIHNwZWNpZmljYXRpb24uICBUaGlzIGlzIG9ubHkgdXNlZCBpbiBsZGdyYW0ueSwgYnV0IGl0Ci0gICB3aW5kcyB1cCBpbiBsZGdyYW0uaCwgc28gd2UgbmVlZCB0byBkZWZpbmUgaXQgb3V0c2lkZS4gICovCi0KLXN0cnVjdCB3aWxkY2FyZF9zcGVjCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKmV4Y2x1ZGVfbmFtZTsKLSAgYm9vbGVhbiBzb3J0ZWQ7Ci19OwotCi0vKiBFeHRyYSBpbmZvcm1hdGlvbiB3ZSBob2xkIG9uIHNlY3Rpb25zICovCi10eXBlZGVmIHN0cnVjdCAgdXNlcl9zZWN0aW9uX3N0cnVjdAotewotICAvKiBQb2ludGVyIHRvIHRoZSBzZWN0aW9uIHdoZXJlIHRoaXMgZGF0YSB3aWxsIGdvICovCi0gIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKmZpbGU7Ci19IHNlY3Rpb25fdXNlcmRhdGFfdHlwZTsKLQotCi0jZGVmaW5lIGdldF91c2VyZGF0YSh4KSAoKHgpLT51c2VyZGF0YSkKLQotI2RlZmluZSBCWVRFX1NJWkUJKDEpCi0jZGVmaW5lIFNIT1JUX1NJWkUJKDIpCi0jZGVmaW5lIExPTkdfU0laRQkoNCkKLSNkZWZpbmUgUVVBRF9TSVpFCSg4KQotCi0vKiBBTElHTiBtYWNybyBjaGFuZ2VkIHRvIEFMSUdOX04gdG8gYXZvaWQJKi8KLS8qIGNvbmZsaWN0IGluIC91c3IvaW5jbHVkZS9tYWNoaW5lL21hY2hwYXJhbS5oICovCi0vKiBXQVJOSU5HOiBJZiBUSElTIGlzIGEgNjQgYml0IGFkZHJlc3MgYW5kIEJPVU5EQVJZIGlzIGEgMzIgYml0IGludCwKLSAgIHlvdSBtdXN0IGNvZXJjZSBib3VuZGFyeSB0byB0aGUgc2FtZSB0eXBlIGFzIFRISVMuCi0gICA/Pz8gSXMgdGhlcmUgYSBwb3J0YWJsZSB3YXkgdG8gYXZvaWQgdGhpcy4gICovCi0jZGVmaW5lIEFMSUdOX04odGhpcywgYm91bmRhcnkpIFwKLSAgKCgoICh0aGlzKSArICgoYm91bmRhcnkpIC0xKSkgJiAofigoYm91bmRhcnkpLTEpKSkpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIDEgPT4gYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYHJlbG9jYXRhYmxlX291dHB1dCcuICAqLwotICBib29sZWFuIGZvcmNlX2NvbW1vbl9kZWZpbml0aW9uOwotICBib29sZWFuIHJlbGF4OwotCi0gIC8qIE5hbWUgb2YgcnVudGltZSBpbnRlcnByZXRlciB0byBpbnZva2UuICAqLwotICBjaGFyICppbnRlcnByZXRlcjsKLQotICAvKiBOYW1lIHRvIGdpdmUgcnVudGltZSBsaWJhcnkgZnJvbSB0aGUgLXNvbmFtZSBhcmd1bWVudC4gICovCi0gIGNoYXIgKnNvbmFtZTsKLQotICAvKiBSdW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGggZnJvbSB0aGUgLXJwYXRoIGFyZ3VtZW50LiAgKi8KLSAgY2hhciAqcnBhdGg7Ci0KLSAgLyogTGluayB0aW1lIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aCBmcm9tIHRoZSAtcnBhdGgtbGluawotICAgICBhcmd1bWVudC4gICovCi0gIGNoYXIgKnJwYXRoX2xpbms7Ci0KLSAgLyogQmlnIG9yIGxpdHRsZSBlbmRpYW4gYXMgc2V0IG9uIGNvbW1hbmQgbGluZS4gICovCi0gIGVudW0geyBFTkRJQU5fVU5TRVQgPSAwLCBFTkRJQU5fQklHLCBFTkRJQU5fTElUVExFIH0gZW5kaWFuOwotCi0gIC8qIElmIHRydWUsIGV4cG9ydCBhbGwgc3ltYm9scyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgYW4gRUxGCi0gICAgIGV4ZWN1dGFibGUuICAqLwotICBib29sZWFuIGV4cG9ydF9keW5hbWljOwotCi0gIC8qIElmIHRydWUsIGJ1aWxkIE1JUFMgZW1iZWRkZWQgUElDIHJlbG9jYXRpb24gdGFibGVzIGluIHRoZSBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGJvb2xlYW4gZW1iZWRkZWRfcmVsb2NzOwotCi0gIC8qIElmIHRydWUsIGZvcmNlIGdlbmVyYXRpb24gb2YgYSBmaWxlIHdpdGggYSAuZXhlIGZpbGUuICovCi0gIGJvb2xlYW4gZm9yY2VfZXhlX3N1ZmZpeDsKLQotICAvKiBJZiB0cnVlLCBnZW5lcmF0ZSBhIGNyb3NzIHJlZmVyZW5jZSByZXBvcnQuICAqLwotICBib29sZWFuIGNyZWY7Ci0KLSAgLyogSWYgdHJ1ZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBib29sZWFuIHdhcm5fbWlzbWF0Y2g7Ci0KLSAgLyogUmVtb3ZlIHVucmVmZXJlbmNlZCBzZWN0aW9ucz8gICovCi0gIGJvb2xlYW4gZ2Nfc2VjdGlvbnM7Ci0KLSAgLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0IHdob3NlIHN5bWJvbCB0YWJsZSBzaG91bGQgYmUgZmlsdGVyZWQgd2l0aAotICAgICB0aGlzIHNoYXJlZCBvYmplY3QuICBGcm9tIHRoZSAtLWZpbHRlciBvcHRpb24uICAqLwotICBjaGFyICpmaWx0ZXJfc2hsaWI7Ci0KLSAgLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0IGZvciB3aG9zZSBzeW1ib2wgdGFibGUgdGhpcyBzaGFyZWQgb2JqZWN0Ci0gICAgIGlzIGFuIGF1eGlsaWFyeSBmaWx0ZXIuICBGcm9tIHRoZSAtLWF1eGlsaWFyeSBvcHRpb24uICAqLwotICBjaGFyICoqYXV4aWxpYXJ5X2ZpbHRlcnM7Ci0KLSAgLyogQSB2ZXJzaW9uIHN5bWJvbCB0byBiZSBhcHBsaWVkIHRvIHRoZSBzeW1ib2wgbmFtZXMgZm91bmQgaW4gdGhlCi0gICAgIC5leHBvcnRzIHNlY3Rpb25zLiAgKi8KLSAgY2hhciAqdmVyc2lvbl9leHBvcnRzX3NlY3Rpb247Ci0KLSAgLyogSWYgdHJ1ZSAodGhlIGRlZmF1bHQpIGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzLCBvbmNlIGNvbXB1dGUsCi0gICAgIGZwb3Igb3ZlcmxhcHMuICAqLwotICBib29sZWFuIGNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzOwotICAKLX0gYXJnc190eXBlOwotCi1leHRlcm4gYXJnc190eXBlIGNvbW1hbmRfbGluZTsKLQotdHlwZWRlZiBpbnQgdG9rZW5fY29kZV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgYmZkX3NpemVfdHlwZSBzcGVjaWZpZWRfZGF0YV9zaXplOwotICBib29sZWFuIG1hZ2ljX2RlbWFuZF9wYWdlZDsKLSAgYm9vbGVhbiBtYWtlX2V4ZWN1dGFibGU7Ci0KLSAgLyogSWYgdHJ1ZSwgZG9pbmcgYSBkeW5hbWljIGxpbmsuICAqLwotICBib29sZWFuIGR5bmFtaWNfbGluazsKLQotICAvKiBJZiB0cnVlLCAtc2hhcmVkIGlzIHN1cHBvcnRlZC4gICovCi0gIC8qID8/PyBBIGJldHRlciB3YXkgdG8gZG8gdGhpcyBpcyBwZXJoYXBzIHRvIGRlZmluZSB0aGlzIGluIHRoZQotICAgICBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3Qgc2luY2UgdGhpcyBpcyByZWFsbHkgYSB0YXJnZXQgZGVwZW5kZW50Ci0gICAgIHBhcmFtZXRlci4gICovCi0gIGJvb2xlYW4gaGFzX3NoYXJlZDsKLQotICAvKiBJZiB0cnVlLCBidWlsZCBjb25zdHJ1Y3RvcnMuICAqLwotICBib29sZWFuIGJ1aWxkX2NvbnN0cnVjdG9yczsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGFib3V0IGFueSBjb25zdHJ1Y3RvcnMuICAqLwotICBib29sZWFuIHdhcm5fY29uc3RydWN0b3JzOwotCi0gIC8qIElmIHRydWUsIHdhcm4gYWJvdXQgbWVyZ2luZyBjb21tb24gc3ltYm9scyB3aXRoIG90aGVycy4gICovCi0gIGJvb2xlYW4gd2Fybl9jb21tb247Ci0KLSAgLyogSWYgdHJ1ZSwgb25seSB3YXJuIG9uY2UgYWJvdXQgYSBwYXJ0aWN1bGFyIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotICBib29sZWFuIHdhcm5fb25jZTsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGlmIG11bHRpcGxlIGdsb2JhbC1wb2ludGVycyBhcmUgbmVlZGVkIChBbHBoYQotICAgICBvbmx5KS4gICovCi0gIGJvb2xlYW4gd2Fybl9tdWx0aXBsZV9ncDsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGlmIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uCi0gICAgIGNoYW5nZXMgZHVlIHRvIHRoZSBhbGlnbm1lbnQgb2YgYW4gaW5wdXQgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gd2Fybl9zZWN0aW9uX2FsaWduOwotCi0gIGJvb2xlYW4gc29ydF9jb21tb247Ci0KLSAgYm9vbGVhbiB0ZXh0X3JlYWRfb25seTsKLQotICBjaGFyICptYXBfZmlsZW5hbWU7Ci0gIEZJTEUgKm1hcF9maWxlOwotCi0gIGJvb2xlYW4gc3RhdHM7Ci0KLSAgaW50IHNwbGl0X2J5X3JlbG9jOwotICBib29sZWFuIHNwbGl0X2J5X2ZpbGU7Ci19IGxkX2NvbmZpZ190eXBlOwotCi1leHRlcm4gbGRfY29uZmlnX3R5cGUgY29uZmlnOwotCi10eXBlZGVmIGVudW0KLXsKLSAgbGFuZ19maXJzdF9waGFzZV9lbnVtLAotICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLSAgbGFuZ19maW5hbF9waGFzZV9lbnVtCi19IGxhbmdfcGhhc2VfdHlwZTsKLQotZXh0ZXJuIGJvb2xlYW4gaGFkX3NjcmlwdDsKLWV4dGVybiBib29sZWFuIGZvcmNlX21ha2VfZXhlY3V0YWJsZTsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIHByb2Nlc3NpbmcgYSAtLWRlZnN5bSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICAqLwotZXh0ZXJuIGludCBwYXJzaW5nX2RlZnN5bTsKLQotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgYWRkX2NyZWYgUEFSQU1TICgoY29uc3QgY2hhciAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgb3V0cHV0X2NyZWYgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCBjaGVja19ub2Nyb3NzcmVmcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGQudGV4aW5mbyBiL2xkL2xkLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWY3YTIuLjAwMDAwMDAKLS0tIGEvbGQvbGQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDQzNjYgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBsZC5pbmZvCi1Ac3luY29kZWluZGV4IGt5IGNwCi1AaW5jbHVkZSBjb25maWdkb2MudGV4aQotQGMgKGNvbmZpZ2RvYy50ZXhpIGlzIGdlbmVyYXRlZCBieSB0aGUgTWFrZWZpbGUpCi1AaW5jbHVkZSBsZHZlci50ZXhpCi0KLUBjIEBzbWFsbGJvb2sKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogTGQ6IChsZCkuICAgICAgICAgICAgICAgICAgICAgICBUaGUgR05VIGxpbmtlci4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEBzY3tnbnV9IGxpbmtlciBMRCB2ZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfS4KLQotQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1AZW5kIGlmaW5mbwotQGlmdGV4Ci1AZmluYWxvdXQKLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBVc2luZyBMRCwgdGhlIEdOVSBsaW5rZXIKLUB0aXRsZXBhZ2UKLUB0aXRsZSBVc2luZyBsZAotQHN1YnRpdGxlIFRoZSBHTlUgbGlua2VyCi1Ac3AgMQotQHN1YnRpdGxlIEBjb2Rle2xkfSB2ZXJzaW9uIDIKLUBzdWJ0aXRsZSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfQotQGF1dGhvciBTdGV2ZSBDaGFtYmVybGFpbgotQGF1dGhvciBJYW4gTGFuY2UgVGF5bG9yCi1AYXV0aG9yIEN5Z251cyBTb2x1dGlvbnMKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQKLVxoZmlsbCBDeWdudXMgU29sdXRpb25zXHBhcgotXGhmaWxsIGlhblxAY3lnbnVzLmNvbSwgZG9jXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgVXNpbmcgTEQsIHRoZSBHTlUgbGlua2VyfVxwYXIKLVxoZmlsbCBFZGl0ZWQgYnkgSmVmZnJleSBPc2llciAoamVmZnJleVxAY3lnbnVzLmNvbSlccGFyCi19Ci1cZ2xvYmFsXHBhcmluZGVudD0wcHQgJSBTdGV2ZSBsaWtlcyBpdCB0aGlzIHdheS4KLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLUBlbmQgaWZ0ZXgKLUBjIEZJWE1FOiBUYWxrIGFib3V0IGltcG9ydGFuY2Ugb2YgKm9yZGVyKiBvZiBhcmdzLCBjbWRzIHRvIGxpbmtlciEKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFVzaW5nIGxkCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBAc2N7Z251fSBsaW5rZXIgbGQgdmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3Ci0qIEludm9jYXRpb246OiAgICAgICAgICAgICAgICAgIEludm9jYXRpb24KLSogU2NyaXB0czo6ICAgICAgICAgICAgICAgICAgICAgTGlua2VyIFNjcmlwdHMKLUBpZnNldCBHRU5FUklDCi0qIE1hY2hpbmUgRGVwZW5kZW50OjogICAgICAgICAgIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgzMDAKLSogSDgvMzAwOjogICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIHRoZSBIOC8zMDAKLUBlbmQgaWZzZXQKLUBpZnNldCBIaXRhY2hpCi0qIEhpdGFjaGk6OiAgICAgICAgICAgICAgICAgICAgIGxkIGFuZCBvdGhlciBIaXRhY2hpIG1pY3JvcwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLSogaTk2MDo6ICAgICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotKiBCRkQ6OiAgICAgICAgICAgICAgICAgICAgICAgICBCRkQKLUBlbmQgaWZjbGVhcgotQGMgRm9sbG93aW5nIGJsYW5rIGxpbmUgcmVxdWlyZWQgZm9yIHJlbWFpbmluZyBidWcgaW4gbWFrZWluZm8gY29uZHMvbWVudXMKLQotKiBSZXBvcnRpbmcgQnVnczo6ICAgICAgICAgICAgICBSZXBvcnRpbmcgQnVncwotKiBNUkk6OiAgICAgICAgICAgICAgICAgICAgICAgICBNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXMKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgT3ZlcnZpZXcKLUBjaGFwdGVyIE92ZXJ2aWV3Ci0KLUBjaW5kZXggQHNje2dudX0gbGlua2VyCi1AY2luZGV4IHdoYXQgaXMgdGhpcz8KLUBjb2Rle2xkfSBjb21iaW5lcyBhIG51bWJlciBvZiBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMsIHJlbG9jYXRlcwotdGhlaXIgZGF0YSBhbmQgdGllcyB1cCBzeW1ib2wgcmVmZXJlbmNlcy4gVXN1YWxseSB0aGUgbGFzdCBzdGVwIGluCi1jb21waWxpbmcgYSBwcm9ncmFtIGlzIHRvIHJ1biBAY29kZXtsZH0uCi0KLUBjb2Rle2xkfSBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIHdyaXR0ZW4gaW4KLWEgc3VwZXJzZXQgb2YgQVQmVCdzIExpbmsgRWRpdG9yIENvbW1hbmQgTGFuZ3VhZ2Ugc3ludGF4LAotdG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotVGhpcyB2ZXJzaW9uIG9mIEBjb2Rle2xkfSB1c2VzIHRoZSBnZW5lcmFsIHB1cnBvc2UgQkZEIGxpYnJhcmllcwotdG8gb3BlcmF0ZSBvbiBvYmplY3QgZmlsZXMuIFRoaXMgYWxsb3dzIEBjb2Rle2xkfSB0byByZWFkLCBjb21iaW5lLCBhbmQKLXdyaXRlIG9iamVjdCBmaWxlcyBpbiBtYW55IGRpZmZlcmVudCBmb3JtYXRzLS0tZm9yIGV4YW1wbGUsIENPRkYgb3IKLUBjb2Rle2Eub3V0fS4gIERpZmZlcmVudCBmb3JtYXRzIG1heSBiZSBsaW5rZWQgdG9nZXRoZXIgdG8gcHJvZHVjZSBhbnkKLWF2YWlsYWJsZSBraW5kIG9mIG9iamVjdCBmaWxlLiAgQHhyZWZ7QkZEfSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1AZW5kIGlmY2xlYXIKLQotQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBAc2N7Z251fSBsaW5rZXIgaXMgbW9yZSBoZWxwZnVsIHRoYW4gb3RoZXIKLWxpbmtlcnMgaW4gcHJvdmlkaW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uICBNYW55IGxpbmtlcnMgYWJhbmRvbgotZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yOyB3aGVuZXZlciBwb3NzaWJsZSwKLUBjb2Rle2xkfSBjb250aW51ZXMgZXhlY3V0aW5nLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgb3RoZXIgZXJyb3JzCi0ob3IsIGluIHNvbWUgY2FzZXMsIHRvIGdldCBhbiBvdXRwdXQgZmlsZSBpbiBzcGl0ZSBvZiB0aGUgZXJyb3IpLgotCi1Abm9kZSBJbnZvY2F0aW9uCi1AY2hhcHRlciBJbnZvY2F0aW9uCi0KLVRoZSBAc2N7Z251fSBsaW5rZXIgQGNvZGV7bGR9IGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKLWFuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoteW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yLgotCi1AaWZzZXQgVXNlc0VudlZhcnMKLUBtZW51Ci0qIE9wdGlvbnM6OiAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTGluZSBPcHRpb25zCi0qIEVudmlyb25tZW50OjogICAgICAgICAgICAgICAgIEVudmlyb25tZW50IFZhcmlhYmxlcwotQGVuZCBtZW51Ci0KLUBub2RlIE9wdGlvbnMKLUBzZWN0aW9uIENvbW1hbmQgTGluZSBPcHRpb25zCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggY29tbWFuZCBsaW5lCi1AY2luZGV4IG9wdGlvbnMKLVRoZSBsaW5rZXIgc3VwcG9ydHMgYSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucywgYnV0IGluIGFjdHVhbAotcHJhY3RpY2UgZmV3IG9mIHRoZW0gYXJlIHVzZWQgaW4gYW55IHBhcnRpY3VsYXIgY29udGV4dC4KLUBjaW5kZXggc3RhbmRhcmQgVW5peCBzeXN0ZW0KLUZvciBpbnN0YW5jZSwgYSBmcmVxdWVudCB1c2Ugb2YgQGNvZGV7bGR9IGlzIHRvIGxpbmsgc3RhbmRhcmQgVW5peAotb2JqZWN0IGZpbGVzIG9uIGEgc3RhbmRhcmQsIHN1cHBvcnRlZCBVbml4IHN5c3RlbS4gIE9uIHN1Y2ggYSBzeXN0ZW0sIHRvCi1saW5rIGEgZmlsZSBAY29kZXtoZWxsby5vfToKLQotQHNtYWxsZXhhbXBsZQotbGQgLW8gQHZhcntvdXRwdXR9IC9saWIvY3J0MC5vIGhlbGxvLm8gLWxjCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHRlbGxzIEBjb2Rle2xkfSB0byBwcm9kdWNlIGEgZmlsZSBjYWxsZWQgQHZhcntvdXRwdXR9IGFzIHRoZQotcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgQGNvZGV7L2xpYi9jcnQwLm99IHdpdGggQGNvZGV7aGVsbG8ub30gYW5kCi10aGUgbGlicmFyeSBAY29kZXtsaWJjLmF9LCB3aGljaCB3aWxsIGNvbWUgZnJvbSB0aGUgc3RhbmRhcmQgc2VhcmNoCi1kaXJlY3Rvcmllcy4gIChTZWUgdGhlIGRpc2N1c3Npb24gb2YgdGhlIEBzYW1wey1sfSBvcHRpb24gYmVsb3cuKQotCi1Tb21lIG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBAY29kZXtsZH0gbWF5IGJlIHNwZWNpZmllZCBhdCBhbnkKLXBvaW50IGluIHRoZSBjb21tYW5kIGxpbmUuICBIb3dldmVyLCBvcHRpb25zIHdoaWNoIHJlZmVyIHRvIGZpbGVzLCBzdWNoCi1hcyBAc2FtcHstbH0gb3IgQHNhbXB7LVR9LCBjYXVzZSB0aGUgZmlsZSB0byBiZSByZWFkIGF0IHRoZSBwb2ludCBhdAotd2hpY2ggdGhlIG9wdGlvbiBhcHBlYXJzIGluIHRoZSBjb21tYW5kIGxpbmUsIHJlbGF0aXZlIHRvIHRoZSBvYmplY3QKLWZpbGVzIGFuZCBvdGhlciBmaWxlIG9wdGlvbnMuICBSZXBlYXRpbmcgbm9uLWZpbGUgb3B0aW9ucyB3aXRoIGEKLWRpZmZlcmVudCBhcmd1bWVudCB3aWxsIGVpdGhlciBoYXZlIG5vIGZ1cnRoZXIgZWZmZWN0LCBvciBvdmVycmlkZSBwcmlvcgotb2NjdXJyZW5jZXMgKHRob3NlIGZ1cnRoZXIgdG8gdGhlIGxlZnQgb24gdGhlIGNvbW1hbmQgbGluZSkgb2YgdGhhdAotb3B0aW9uLiAgT3B0aW9ucyB3aGljaCBtYXkgYmUgbWVhbmluZ2Z1bGx5IHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSBhcmUKLW5vdGVkIGluIHRoZSBkZXNjcmlwdGlvbnMgYmVsb3cuCi0KLUBjaW5kZXggb2JqZWN0IGZpbGVzCi1Ob24tb3B0aW9uIGFyZ3VtZW50cyBhcmUgb2JqZWN0IGZpbGVzIG9yIGFyY2hpdmVzIHdoaWNoIGFyZSB0byBiZSBsaW5rZWQKLXRvZ2V0aGVyLiAgVGhleSBtYXkgZm9sbG93LCBwcmVjZWRlLCBvciBiZSBtaXhlZCBpbiB3aXRoIGNvbW1hbmQtbGluZQotb3B0aW9ucywgZXhjZXB0IHRoYXQgYW4gb2JqZWN0IGZpbGUgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbgotYW4gb3B0aW9uIGFuZCBpdHMgYXJndW1lbnQuCi0KLVVzdWFsbHkgdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggYXQgbGVhc3Qgb25lIG9iamVjdCBmaWxlLCBidXQgeW91IGNhbgotc3BlY2lmeSBvdGhlciBmb3JtcyBvZiBiaW5hcnkgaW5wdXQgZmlsZXMgdXNpbmcgQHNhbXB7LWx9LCBAc2FtcHstUn0sCi1hbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgQGVtcGh7bm99IGJpbmFyeSBpbnB1dCBmaWxlcyBhdCBhbGwKLWFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQgaXNzdWVzIHRoZQotbWVzc2FnZSBAc2FtcHtObyBpbnB1dCBmaWxlc30uCi0KLUlmIHRoZSBsaW5rZXIgY2FuIG5vdCByZWNvZ25pemUgdGhlIGZvcm1hdCBvZiBhbiBvYmplY3QgZmlsZSwgaXQgd2lsbAotYXNzdW1lIHRoYXQgaXQgaXMgYSBsaW5rZXIgc2NyaXB0LiAgQSBzY3JpcHQgc3BlY2lmaWVkIGluIHRoaXMgd2F5Ci1hdWdtZW50cyB0aGUgbWFpbiBsaW5rZXIgc2NyaXB0IHVzZWQgZm9yIHRoZSBsaW5rIChlaXRoZXIgdGhlIGRlZmF1bHQKLWxpbmtlciBzY3JpcHQgb3IgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdXNpbmcgQHNhbXB7LVR9KS4gIFRoaXMgZmVhdHVyZQotcGVybWl0cyB0aGUgbGlua2VyIHRvIGxpbmsgYWdhaW5zdCBhIGZpbGUgd2hpY2ggYXBwZWFycyB0byBiZSBhbiBvYmplY3QKLW9yIGFuIGFyY2hpdmUsIGJ1dCBhY3R1YWxseSBtZXJlbHkgZGVmaW5lcyBzb21lIHN5bWJvbCB2YWx1ZXMsIG9yIHVzZXMKLUBjb2Rle0lOUFVUfSBvciBAY29kZXtHUk9VUH0gdG8gbG9hZCBvdGhlciBvYmplY3RzLiAgTm90ZSB0aGF0Ci1zcGVjaWZ5aW5nIGEgc2NyaXB0IGluIHRoaXMgd2F5IHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gYXVnbWVudCB0aGUgbWFpbgotbGlua2VyIHNjcmlwdDsgaWYgeW91IHdhbnQgdG8gdXNlIHNvbWUgY29tbWFuZCB0aGF0IGxvZ2ljYWxseSBjYW4gb25seQotYXBwZWFyIG9uY2UsIHN1Y2ggYXMgdGhlIEBjb2Rle1NFQ1RJT05TfSBvciBAY29kZXtNRU1PUll9IGNvbW1hbmQsIHlvdQotbXVzdCByZXBsYWNlIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNpbmcgdGhlIEBzYW1wey1UfSBvcHRpb24uCi1AeHJlZntTY3JpcHRzfS4KLQotRm9yIG9wdGlvbnMgd2hvc2UgbmFtZXMgYXJlIGEgc2luZ2xlIGxldHRlciwKLW9wdGlvbiBhcmd1bWVudHMgbXVzdCBlaXRoZXIgZm9sbG93IHRoZSBvcHRpb24gbGV0dGVyIHdpdGhvdXQgaW50ZXJ2ZW5pbmcKLXdoaXRlc3BhY2UsIG9yIGJlIGdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlCi1vcHRpb24gdGhhdCByZXF1aXJlcyB0aGVtLgotCi1Gb3Igb3B0aW9ucyB3aG9zZSBuYW1lcyBhcmUgbXVsdGlwbGUgbGV0dGVycywgZWl0aGVyIG9uZSBkYXNoIG9yIHR3byBjYW4KLXByZWNlZGUgdGhlIG9wdGlvbiBuYW1lOyBmb3IgZXhhbXBsZSwgQHNhbXB7LS1vZm9ybWF0fSBhbmQKLUBzYW1wey0tb2Zvcm1hdH0gYXJlIGVxdWl2YWxlbnQuICBBcmd1bWVudHMgdG8gbXVsdGlwbGUtbGV0dGVyIG9wdGlvbnMKLW11c3QgZWl0aGVyIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBvcHRpb24gbmFtZSBieSBhbiBlcXVhbHMgc2lnbiwgb3IgYmUKLWdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIG9wdGlvbiB0aGF0Ci1yZXF1aXJlcyB0aGVtLiAgRm9yIGV4YW1wbGUsIEBzYW1wey0tb2Zvcm1hdCBzcmVjfSBhbmQKLUBzYW1wey0tb2Zvcm1hdD1zcmVjfSBhcmUgZXF1aXZhbGVudC4gIFVuaXF1ZSBhYmJyZXZpYXRpb25zIG9mIHRoZSBuYW1lcwotb2YgbXVsdGlwbGUtbGV0dGVyIG9wdGlvbnMgYXJlIGFjY2VwdGVkLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggLWFAdmFye2tleXdvcmR9Ci1AaXRlbSAtYUB2YXJ7a2V5d29yZH0KLVRoaXMgb3B0aW9uIGlzIHN1cHBvcnRlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gIFRoZSBAdmFye2tleXdvcmR9Ci1hcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgc3RyaW5ncyBAc2FtcHthcmNoaXZlfSwgQHNhbXB7c2hhcmVkfSwgb3IKLUBzYW1we2RlZmF1bHR9LiAgQHNhbXB7LWFhcmNoaXZlfSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0bwotQHNhbXB7LUJzdGF0aWN9LCBhbmQgdGhlIG90aGVyIHR3byBrZXl3b3JkcyBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQKLXRvIEBzYW1wey1CZHluYW1pY30uICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgotCi1AaWZzZXQgSTk2MAotQGNpbmRleCBhcmNoaXRlY3R1cmVzCi1Aa2luZGV4IC1BQHZhcnthcmNofQotQGl0ZW0gLUFAdmFye2FyY2hpdGVjdHVyZX0KLUBraW5kZXggLS1hcmNoaXRlY3R1cmU9QHZhcnthcmNofQotQGl0ZW14IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7YXJjaGl0ZWN0dXJlfQotSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBAY29kZXtsZH0sIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKLUludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgQGNvZGV7bGR9IGNvbmZpZ3VyYXRpb24sIHRoZQotQHZhcnthcmNoaXRlY3R1cmV9IGFyZ3VtZW50IGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlIGluCi10aGUgOTYwIGZhbWlseSwgZW5hYmxpbmcgc29tZSBzYWZlZ3VhcmRzIGFuZCBtb2RpZnlpbmcgdGhlCi1hcmNoaXZlLWxpYnJhcnkgc2VhcmNoIHBhdGguICBAeHJlZntpOTYwLCxAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAKLWZhbWlseX0sIGZvciBkZXRhaWxzLgotCi1GdXR1cmUgcmVsZWFzZXMgb2YgQGNvZGV7bGR9IG1heSBzdXBwb3J0IHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBmb3IKLW90aGVyIGFyY2hpdGVjdHVyZSBmYW1pbGllcy4KLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1AY2luZGV4IGJpbmFyeSBpbnB1dCBmb3JtYXQKLUBraW5kZXggLWIgQHZhcntmb3JtYXR9Ci1Aa2luZGV4IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQGNpbmRleCBpbnB1dCBmb3JtYXQKLUBjaW5kZXggaW5wdXQgZm9ybWF0Ci1AaXRlbSAtYiBAdmFye2lucHV0LWZvcm1hdH0KLUBpdGVteCAtLWZvcm1hdD1AdmFye2lucHV0LWZvcm1hdH0KLUBjb2Rle2xkfSBtYXkgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUga2luZCBvZiBvYmplY3QKLWZpbGUuICBJZiB5b3VyIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGUKLUBzYW1wey1ifSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzCi10aGF0IGZvbGxvdyB0aGlzIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRXZlbiB3aGVuIEBjb2Rle2xkfSBpcwotY29uZmlndXJlZCB0byBzdXBwb3J0IGFsdGVybmF0aXZlIG9iamVjdCBmb3JtYXRzLCB5b3UgZG9uJ3QgdXN1YWxseSBuZWVkCi10byBzcGVjaWZ5IHRoaXMsIGFzIEBjb2Rle2xkfSBzaG91bGQgYmUgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYQotZGVmYXVsdCBpbnB1dCBmb3JtYXQgdGhlIG1vc3QgdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4KLUB2YXJ7aW5wdXQtZm9ybWF0fSBpcyBhIHRleHQgc3RyaW5nLCB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0Ci1zdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAoWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUgYmluYXJ5Ci1mb3JtYXRzIHdpdGggQHNhbXB7b2JqZHVtcCAtaX0uKQotQHhyZWZ7QkZEfS4KLQotWW91IG1heSB3YW50IHRvIHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIGxpbmtpbmcgZmlsZXMgd2l0aCBhbiB1bnVzdWFsCi1iaW5hcnkgZm9ybWF0LiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHstYn0gdG8gc3dpdGNoIGZvcm1hdHMgZXhwbGljaXRseSAod2hlbgotbGlua2luZyBvYmplY3QgZmlsZXMgb2YgZGlmZmVyZW50IGZvcm1hdHMpLCBieSBpbmNsdWRpbmcKLUBzYW1wey1iIEB2YXJ7aW5wdXQtZm9ybWF0fX0gYmVmb3JlIGVhY2ggZ3JvdXAgb2Ygb2JqZWN0IGZpbGVzIGluIGEKLXBhcnRpY3VsYXIgZm9ybWF0LiAgCi0KLVRoZSBkZWZhdWx0IGZvcm1hdCBpcyB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQGNvZGV7R05VVEFSR0VUfS4KLUBpZnNldCBVc2VzRW52VmFycwotQHhyZWZ7RW52aXJvbm1lbnR9LgotQGVuZCBpZnNldAotWW91IGNhbiBhbHNvIGRlZmluZSB0aGUgaW5wdXQgZm9ybWF0IGZyb20gYSBzY3JpcHQsIHVzaW5nIHRoZSBjb21tYW5kCi1AY29kZXtUQVJHRVR9OyBzZWUgQHJlZntGb3JtYXQgQ29tbWFuZHN9LgotQGVuZCBpZmNsZWFyCi0KLUBraW5kZXggLWMgQHZhcntNUkktY21kZmlsZX0KLUBraW5kZXggLS1tcmktc2NyaXB0PUB2YXJ7TVJJLWNtZGZpbGV9Ci1AY2luZGV4IGNvbXBhdGliaWxpdHksIE1SSQotQGl0ZW0gLWMgQHZhcntNUkktY29tbWFuZGZpbGV9Ci1AaXRlbXggLS1tcmktc2NyaXB0PUB2YXJ7TVJJLWNvbW1hbmRmaWxlfQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsaW5rZXJzIHByb2R1Y2VkIGJ5IE1SSSwgQGNvZGV7bGR9IGFjY2VwdHMgc2NyaXB0Ci1maWxlcyB3cml0dGVuIGluIGFuIGFsdGVybmF0ZSwgcmVzdHJpY3RlZCBjb21tYW5kIGxhbmd1YWdlLCBkZXNjcmliZWQgaW4KLUByZWZ7TVJJLCxNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXN9LiAgSW50cm9kdWNlIE1SSSBzY3JpcHQgZmlsZXMgd2l0aAotdGhlIG9wdGlvbiBAc2FtcHstY307IHVzZSB0aGUgQHNhbXB7LVR9IG9wdGlvbiB0byBydW4gbGlua2VyCi1zY3JpcHRzIHdyaXR0ZW4gaW4gdGhlIGdlbmVyYWwtcHVycG9zZSBAY29kZXtsZH0gc2NyaXB0aW5nIGxhbmd1YWdlLgotSWYgQHZhcntNUkktY21kZmlsZX0gZG9lcyBub3QgZXhpc3QsIEBjb2Rle2xkfSBsb29rcyBmb3IgaXQgaW4gdGhlIGRpcmVjdG9yaWVzCi1zcGVjaWZpZWQgYnkgYW55IEBzYW1wey1MfSBvcHRpb25zLgotCi1AY2luZGV4IGNvbW1vbiBhbGxvY2F0aW9uCi1Aa2luZGV4IC1kCi1Aa2luZGV4IC1kYwotQGtpbmRleCAtZHAKLUBpdGVtIC1kIAotQGl0ZW14IC1kYwotQGl0ZW14IC1kcAotVGhlc2UgdGhyZWUgb3B0aW9ucyBhcmUgZXF1aXZhbGVudDsgbXVsdGlwbGUgZm9ybXMgYXJlIHN1cHBvcnRlZCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLiAgVGhleSBhc3NpZ24gc3BhY2UgdG8gY29tbW9uIHN5bWJvbHMKLWV2ZW4gaWYgYSByZWxvY2F0YWJsZSBvdXRwdXQgZmlsZSBpcyBzcGVjaWZpZWQgKHdpdGggQHNhbXB7LXJ9KS4gIFRoZQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7Rk9SQ0VfQ09NTU9OX0FMTE9DQVRJT059IGhhcyB0aGUgc2FtZSBlZmZlY3QuCi1AeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzfS4KLQotQGNpbmRleCBlbnRyeSBwb2ludCwgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLWUgQHZhcntlbnRyeX0KLUBraW5kZXggLS1lbnRyeT1AdmFye2VudHJ5fQotQGl0ZW0gLWUgQHZhcntlbnRyeX0gCi1AaXRlbXggLS1lbnRyeT1AdmFye2VudHJ5fQotVXNlIEB2YXJ7ZW50cnl9IGFzIHRoZSBleHBsaWNpdCBzeW1ib2wgZm9yIGJlZ2lubmluZyBleGVjdXRpb24gb2YgeW91cgotcHJvZ3JhbSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgZW50cnkgcG9pbnQuICBJZiB0aGVyZSBpcyBubyBzeW1ib2wKLW5hbWVkIEB2YXJ7ZW50cnl9LCB0aGUgbGlua2VyIHdpbGwgdHJ5IHRvIHBhcnNlIEB2YXJ7ZW50cnl9IGFzIGEgbnVtYmVyLAotYW5kIHVzZSB0aGF0IGFzIHRoZSBlbnRyeSBhZGRyZXNzICh0aGUgbnVtYmVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgaW4KLWJhc2UgMTA7IHlvdSBtYXkgdXNlIGEgbGVhZGluZyBAc2FtcHsweH0gZm9yIGJhc2UgMTYsIG9yIGEgbGVhZGluZwotQHNhbXB7MH0gZm9yIGJhc2UgOCkuICBAeHJlZntFbnRyeSBQb2ludH0sIGZvciBhIGRpc2N1c3Npb24gb2YgZGVmYXVsdHMKLWFuZCBvdGhlciB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIGVudHJ5IHBvaW50LgotCi1AY2luZGV4IGR5bmFtaWMgc3ltYm9sIHRhYmxlCi1Aa2luZGV4IC1FCi1Aa2luZGV4IC0tZXhwb3J0LWR5bmFtaWMKLUBpdGVtIC1FCi1AaXRlbXggLS1leHBvcnQtZHluYW1pYwotV2hlbiBjcmVhdGluZyBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlLCBhZGQgYWxsIHN5bWJvbHMgdG8gdGhlCi1keW5hbWljIHN5bWJvbCB0YWJsZS4gIFRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpcyB0aGUgc2V0IG9mIHN5bWJvbHMKLXdoaWNoIGFyZSB2aXNpYmxlIGZyb20gZHluYW1pYyBvYmplY3RzIGF0IHJ1biB0aW1lLgotCi1JZiB5b3UgZG8gbm90IHVzZSB0aGlzIG9wdGlvbiwgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHdpbGwgbm9ybWFsbHkKLWNvbnRhaW4gb25seSB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IHNvbWUgZHluYW1pYyBvYmplY3QKLW1lbnRpb25lZCBpbiB0aGUgbGluay4KLQotSWYgeW91IHVzZSBAY29kZXtkbG9wZW59IHRvIGxvYWQgYSBkeW5hbWljIG9iamVjdCB3aGljaCBuZWVkcyB0byByZWZlcgotYmFjayB0byB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBwcm9ncmFtLCByYXRoZXIgdGhhbiBzb21lIG90aGVyCi1keW5hbWljIG9iamVjdCwgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIHVzZSB0aGlzIG9wdGlvbiB3aGVuCi1saW5raW5nIHRoZSBwcm9ncmFtIGl0c2VsZi4KLQotQGNpbmRleCBiaWctZW5kaWFuIG9iamVjdHMKLUBjaW5kZXggZW5kaWFubmVzcwotQGtpbmRleCAtRUIKLUBpdGVtIC1FQgotTGluayBiaWctZW5kaWFuIG9iamVjdHMuICBUaGlzIGFmZmVjdHMgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdC4KLQotQGNpbmRleCBsaXR0bGUtZW5kaWFuIG9iamVjdHMKLUBraW5kZXggLUVMCi1AaXRlbSAtRUwKLUxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzLiAgVGhpcyBhZmZlY3RzIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQuCi0KLUBraW5kZXggLWYKLUBraW5kZXggLS1hdXhpbGlhcnkKLUBpdGVtIC1mCi1AaXRlbXggLS1hdXhpbGlhcnkgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9BVVhJTElBUlkgZmllbGQKLXRvIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3Qgc2hvdWxkIGJlIHVzZWQgYXMgYW4gYXV4aWxpYXJ5IGZpbHRlciBvbiB0aGUKLXN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LgotCi1JZiB5b3UgbGF0ZXIgbGluayBhIHByb2dyYW0gYWdhaW5zdCB0aGlzIGZpbHRlciBvYmplY3QsIHRoZW4sIHdoZW4geW91Ci1ydW4gdGhlIHByb2dyYW0sIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHNlZSB0aGUgRFRfQVVYSUxJQVJZIGZpZWxkLiAgSWYKLXRoZSBkeW5hbWljIGxpbmtlciByZXNvbHZlcyBhbnkgc3ltYm9scyBmcm9tIHRoZSBmaWx0ZXIgb2JqZWN0LCBpdCB3aWxsCi1maXJzdCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBpbiB0aGUgc2hhcmVkIG9iamVjdAotQHZhcntuYW1lfS4gIElmIHRoZXJlIGlzIG9uZSwgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmluaXRpb24KLWluIHRoZSBmaWx0ZXIgb2JqZWN0LiAgVGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfSBuZWVkIG5vdCBleGlzdC4KLVRodXMgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGFuIGFsdGVybmF0aXZlCi1pbXBsZW1lbnRhdGlvbiBvZiBjZXJ0YWluIGZ1bmN0aW9ucywgcGVyaGFwcyBmb3IgZGVidWdnaW5nIG9yIGZvcgotbWFjaGluZSBzcGVjaWZpYyBwZXJmb3JtYW5jZS4KLQotVGhpcyBvcHRpb24gbWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZS4gIFRoZSBEVF9BVVhJTElBUlkgZW50cmllcwotd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi1Aa2luZGV4IC1GCi1Aa2luZGV4IC0tZmlsdGVyCi1AaXRlbSAtRiBAdmFye25hbWV9Ci1AaXRlbXggLS1maWx0ZXIgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9GSUxURVIgZmllbGQgdG8KLXRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbCB0YWJsZQotb2YgdGhlIHNoYXJlZCBvYmplY3Qgd2hpY2ggaXMgYmVpbmcgY3JlYXRlZCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlcgotb24gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LgotCi1JZiB5b3UgbGF0ZXIgbGluayBhIHByb2dyYW0gYWdhaW5zdCB0aGlzIGZpbHRlciBvYmplY3QsIHRoZW4sIHdoZW4geW91Ci1ydW4gdGhlIHByb2dyYW0sIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHNlZSB0aGUgRFRfRklMVEVSIGZpZWxkLiAgVGhlCi1keW5hbWljIGxpbmtlciB3aWxsIHJlc29sdmUgc3ltYm9scyBhY2NvcmRpbmcgdG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUKLWZpbHRlciBvYmplY3QgYXMgdXN1YWwsIGJ1dCBpdCB3aWxsIGFjdHVhbGx5IGxpbmsgdG8gdGhlIGRlZmluaXRpb25zCi1mb3VuZCBpbiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LiAgVGh1cyB0aGUgZmlsdGVyIG9iamVjdCBjYW4gYmUKLXVzZWQgdG8gc2VsZWN0IGEgc3Vic2V0IG9mIHRoZSBzeW1ib2xzIHByb3ZpZGVkIGJ5IHRoZSBvYmplY3QKLUB2YXJ7bmFtZX0uCi0KLVNvbWUgb2xkZXIgbGlua2VycyB1c2VkIHRoZSBAY29kZXstRn0gb3B0aW9uIHRocm91Z2hvdXQgYSBjb21waWxhdGlvbgotdG9vbGNoYWluIGZvciBzcGVjaWZ5aW5nIG9iamVjdC1maWxlIGZvcm1hdCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0Ci1vYmplY3QgZmlsZXMuICBUaGUgQHNje2dudX0gbGlua2VyIHVzZXMgb3RoZXIgbWVjaGFuaXNtcyBmb3IgdGhpcwotcHVycG9zZTogdGhlIEBjb2Rley1ifSwgQGNvZGV7LS1mb3JtYXR9LCBAY29kZXstLW9mb3JtYXR9IG9wdGlvbnMsIHRoZQotQGNvZGV7VEFSR0VUfSBjb21tYW5kIGluIGxpbmtlciBzY3JpcHRzLCBhbmQgdGhlIEBjb2Rle0dOVVRBUkdFVH0KLWVudmlyb25tZW50IHZhcmlhYmxlLiAgVGhlIEBzY3tnbnV9IGxpbmtlciB3aWxsIGlnbm9yZSB0aGUgQGNvZGV7LUZ9Ci1vcHRpb24gd2hlbiBub3QgY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QuCi0KLUBjaW5kZXggZmluYWxpemF0aW9uIGZ1bmN0aW9uCi1Aa2luZGV4IC1maW5pCi1AaXRlbSAtZmluaSBAdmFye25hbWV9Ci1XaGVuIGNyZWF0aW5nIGFuIEVMRiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QsIGNhbGwgTkFNRSB3aGVuIHRoZQotZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzIHVubG9hZGVkLCBieSBzZXR0aW5nIERUX0ZJTkkgdG8gdGhlCi1hZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gIEJ5IGRlZmF1bHQsIHRoZSBsaW5rZXIgdXNlcyBAY29kZXtfZmluaX0gYXMKLXRoZSBmdW5jdGlvbiB0byBjYWxsLgotCi1Aa2luZGV4IC1nCi1AaXRlbSAtZwotSWdub3JlZC4gIFByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgdG9vbHMuCi0KLUBraW5kZXggLUcKLUBraW5kZXggLS1ncHNpemUKLUBjaW5kZXggb2JqZWN0IHNpemUKLUBpdGVtIC1HQHZhcnt2YWx1ZX0KLUBpdGVteCAtLWdwc2l6ZT1AdmFye3ZhbHVlfQotU2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQIHJlZ2lzdGVyIHRvCi1AdmFye3NpemV9LiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgc3VjaCBhcwotTUlQUyBFQ09GRiB3aGljaCBzdXBwb3J0cyBwdXR0aW5nIGxhcmdlIGFuZCBzbWFsbCBvYmplY3RzIGludG8gZGlmZmVyZW50Ci1zZWN0aW9ucy4gIFRoaXMgaXMgaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQGNpbmRleCBydW50aW1lIGxpYnJhcnkgbmFtZQotQGtpbmRleCAtaEB2YXJ7bmFtZX0KLUBraW5kZXggLXNvbmFtZT1AdmFye25hbWV9Ci1AaXRlbSAtaEB2YXJ7bmFtZX0KLUBpdGVteCAtc29uYW1lPUB2YXJ7bmFtZX0KLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfU09OQU1FIGZpZWxkIHRvCi10aGUgc3BlY2lmaWVkIG5hbWUuICBXaGVuIGFuIGV4ZWN1dGFibGUgaXMgbGlua2VkIHdpdGggYSBzaGFyZWQgb2JqZWN0Ci13aGljaCBoYXMgYSBEVF9TT05BTUUgZmllbGQsIHRoZW4gd2hlbiB0aGUgZXhlY3V0YWJsZSBpcyBydW4gdGhlIGR5bmFtaWMKLWxpbmtlciB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgc2hhcmVkIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIERUX1NPTkFNRQotZmllbGQgcmF0aGVyIHRoYW4gdGhlIHVzaW5nIHRoZSBmaWxlIG5hbWUgZ2l2ZW4gdG8gdGhlIGxpbmtlci4KLQotQGtpbmRleCAtaQotQGNpbmRleCBpbmNyZW1lbnRhbCBsaW5rCi1AaXRlbSAtaQotUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBsaW5rIChzYW1lIGFzIG9wdGlvbiBAc2FtcHstcn0pLgotCi1AY2luZGV4IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCi1Aa2luZGV4IC1pbml0Ci1AaXRlbSAtaW5pdCBAdmFye25hbWV9Ci1XaGVuIGNyZWF0aW5nIGFuIEVMRiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QsIGNhbGwgTkFNRSB3aGVuIHRoZQotZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzIGxvYWRlZCwgYnkgc2V0dGluZyBEVF9JTklUIHRvIHRoZSBhZGRyZXNzCi1vZiB0aGUgZnVuY3Rpb24uICBCeSBkZWZhdWx0LCB0aGUgbGlua2VyIHVzZXMgQGNvZGV7X2luaXR9IGFzIHRoZQotZnVuY3Rpb24gdG8gY2FsbC4KLQotQGNpbmRleCBhcmNoaXZlIGZpbGVzLCBmcm9tIGNtZCBsaW5lCi1Aa2luZGV4IC1sQHZhcnthcmNoaXZlfQotQGtpbmRleCAtLWxpYnJhcnk9QHZhcnthcmNoaXZlfQotQGl0ZW0gLWxAdmFye2FyY2hpdmV9Ci1AaXRlbXggLS1saWJyYXJ5PUB2YXJ7YXJjaGl2ZX0KLUFkZCBhcmNoaXZlIGZpbGUgQHZhcnthcmNoaXZlfSB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rLiAgVGhpcwotb3B0aW9uIG1heSBiZSB1c2VkIGFueSBudW1iZXIgb2YgdGltZXMuICBAY29kZXtsZH0gd2lsbCBzZWFyY2ggaXRzCi1wYXRoLWxpc3QgZm9yIG9jY3VycmVuY2VzIG9mIEBjb2Rle2xpYkB2YXJ7YXJjaGl2ZX0uYX0gZm9yIGV2ZXJ5Ci1AdmFye2FyY2hpdmV9IHNwZWNpZmllZC4KLQotT24gc3lzdGVtcyB3aGljaCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMsIEBjb2Rle2xkfSBtYXkgYWxzbyBzZWFyY2ggZm9yCi1saWJyYXJpZXMgd2l0aCBleHRlbnNpb25zIG90aGVyIHRoYW4gQGNvZGV7LmF9LiAgU3BlY2lmaWNhbGx5LCBvbiBFTEYKLWFuZCBTdW5PUyBzeXN0ZW1zLCBAY29kZXtsZH0gd2lsbCBzZWFyY2ggYSBkaXJlY3RvcnkgZm9yIGEgbGlicmFyeSB3aXRoCi1hbiBleHRlbnNpb24gb2YgQGNvZGV7LnNvfSBiZWZvcmUgc2VhcmNoaW5nIGZvciBvbmUgd2l0aCBhbiBleHRlbnNpb24gb2YKLUBjb2Rley5hfS4gIEJ5IGNvbnZlbnRpb24sIGEgQGNvZGV7LnNvfSBleHRlbnNpb24gaW5kaWNhdGVzIGEgc2hhcmVkCi1saWJyYXJ5LgotCi1UaGUgbGlua2VyIHdpbGwgc2VhcmNoIGFuIGFyY2hpdmUgb25seSBvbmNlLCBhdCB0aGUgbG9jYXRpb24gd2hlcmUgaXQgaXMKLXNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYgdGhlIGFyY2hpdmUgZGVmaW5lcyBhIHN5bWJvbCB3aGljaAotd2FzIHVuZGVmaW5lZCBpbiBzb21lIG9iamVjdCB3aGljaCBhcHBlYXJlZCBiZWZvcmUgdGhlIGFyY2hpdmUgb24gdGhlCi1jb21tYW5kIGxpbmUsIHRoZSBsaW5rZXIgd2lsbCBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBmaWxlKHMpIGZyb20gdGhlCi1hcmNoaXZlLiAgSG93ZXZlciwgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiBhbiBvYmplY3QgYXBwZWFyaW5nIGxhdGVyIG9uCi10aGUgY29tbWFuZCBsaW5lIHdpbGwgbm90IGNhdXNlIHRoZSBsaW5rZXIgdG8gc2VhcmNoIHRoZSBhcmNoaXZlIGFnYWluLgotCi1TZWUgdGhlIEBjb2Rley0ofSBvcHRpb24gZm9yIGEgd2F5IHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gc2VhcmNoCi1hcmNoaXZlcyBtdWx0aXBsZSB0aW1lcy4KLQotWW91IG1heSBsaXN0IHRoZSBzYW1lIGFyY2hpdmUgbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotQGlmc2V0IEdFTkVSSUMKLVRoaXMgdHlwZSBvZiBhcmNoaXZlIHNlYXJjaGluZyBpcyBzdGFuZGFyZCBmb3IgVW5peCBsaW5rZXJzLiAgSG93ZXZlciwKLWlmIHlvdSBhcmUgdXNpbmcgQGNvZGV7bGR9IG9uIEFJWCwgbm90ZSB0aGF0IGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQotYmVoYXZpb3VyIG9mIHRoZSBBSVggbGlua2VyLgotQGVuZCBpZnNldAotCi1AY2luZGV4IHNlYXJjaCBkaXJlY3RvcnksIGZyb20gY21kIGxpbmUKLUBraW5kZXggLUxAdmFye2Rpcn0KLUBraW5kZXggLS1saWJyYXJ5LXBhdGg9QHZhcntkaXJ9Ci1AaXRlbSAtTEB2YXJ7c2VhcmNoZGlyfSAKLUBpdGVteCAtLWxpYnJhcnktcGF0aD1AdmFye3NlYXJjaGRpcn0KLUFkZCBwYXRoIEB2YXJ7c2VhcmNoZGlyfSB0byB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IEBjb2Rle2xkfSB3aWxsIHNlYXJjaAotZm9yIGFyY2hpdmUgbGlicmFyaWVzIGFuZCBAY29kZXtsZH0gY29udHJvbCBzY3JpcHRzLiAgWW91IG1heSB1c2UgdGhpcwotb3B0aW9uIGFueSBudW1iZXIgb2YgdGltZXMuICBUaGUgZGlyZWN0b3JpZXMgYXJlIHNlYXJjaGVkIGluIHRoZSBvcmRlcgotaW4gd2hpY2ggdGhleSBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBEaXJlY3RvcmllcyBzcGVjaWZpZWQKLW9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIHNlYXJjaGVkIGJlZm9yZSB0aGUgZGVmYXVsdCBkaXJlY3Rvcmllcy4gIEFsbAotQGNvZGV7LUx9IG9wdGlvbnMgYXBwbHkgdG8gYWxsIEBjb2Rley1sfSBvcHRpb25zLCByZWdhcmRsZXNzIG9mIHRoZQotb3JkZXIgaW4gd2hpY2ggdGhlIG9wdGlvbnMgYXBwZWFyLgotCi1AaWZzZXQgVXNlc0VudlZhcnMKLVRoZSBkZWZhdWx0IHNldCBvZiBwYXRocyBzZWFyY2hlZCAod2l0aG91dCBiZWluZyBzcGVjaWZpZWQgd2l0aAotQHNhbXB7LUx9KSBkZXBlbmRzIG9uIHdoaWNoIGVtdWxhdGlvbiBtb2RlIEBjb2Rle2xkfSBpcyB1c2luZywgYW5kIGluCi1zb21lIGNhc2VzIGFsc28gb24gaG93IGl0IHdhcyBjb25maWd1cmVkLiAgQHhyZWZ7RW52aXJvbm1lbnR9LgotQGVuZCBpZnNldAotCi1UaGUgcGF0aHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIGEgbGluayBzY3JpcHQgd2l0aCB0aGUKLUBjb2Rle1NFQVJDSF9ESVJ9IGNvbW1hbmQuICBEaXJlY3RvcmllcyBzcGVjaWZpZWQgdGhpcyB3YXkgYXJlIHNlYXJjaGVkCi1hdCB0aGUgcG9pbnQgaW4gd2hpY2ggdGhlIGxpbmtlciBzY3JpcHQgYXBwZWFycyBpbiB0aGUgY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IGVtdWxhdGlvbgotQGtpbmRleCAtbSBAdmFye2VtdWxhdGlvbn0KLUBpdGVtIC1tQHZhcntlbXVsYXRpb259Ci1FbXVsYXRlIHRoZSBAdmFye2VtdWxhdGlvbn0gbGlua2VyLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWVtdWxhdGlvbnMgd2l0aCB0aGUgQHNhbXB7LS12ZXJib3NlfSBvciBAc2FtcHstVn0gb3B0aW9ucy4KLQotSWYgdGhlIEBzYW1wey1tfSBvcHRpb24gaXMgbm90IHVzZWQsIHRoZSBlbXVsYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUKLUBjb2Rle0xERU1VTEFUSU9OfSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgdGhhdCBpcyBkZWZpbmVkLgotCi1PdGhlcndpc2UsIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBkZXBlbmRzIHVwb24gaG93IHRoZSBsaW5rZXIgd2FzCi1jb25maWd1cmVkLgotCi1AY2luZGV4IGxpbmsgbWFwCi1Aa2luZGV4IC1NCi1Aa2luZGV4IC0tcHJpbnQtbWFwCi1AaXRlbSAtTQotQGl0ZW14IC0tcHJpbnQtbWFwCi1QcmludCBhIGxpbmsgbWFwIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICBBIGxpbmsgbWFwIHByb3ZpZGVzCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgbGluaywgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1XaGVyZSBvYmplY3QgZmlsZXMgYW5kIHN5bWJvbHMgYXJlIG1hcHBlZCBpbnRvIG1lbW9yeS4KLUBpdGVtCi1Ib3cgY29tbW9uIHN5bWJvbHMgYXJlIGFsbG9jYXRlZC4KLUBpdGVtCi1BbGwgYXJjaGl2ZSBtZW1iZXJzIGluY2x1ZGVkIGluIHRoZSBsaW5rLCB3aXRoIGEgbWVudGlvbiBvZiB0aGUgc3ltYm9sCi13aGljaCBjYXVzZWQgdGhlIGFyY2hpdmUgbWVtYmVyIHRvIGJlIGJyb3VnaHQgaW4uCi1AZW5kIGl0ZW1pemUKLQotQGtpbmRleCAtbgotQGNpbmRleCByZWFkLW9ubHkgdGV4dAotQGNpbmRleCBOTUFHSUMKLUBraW5kZXggLS1ubWFnaWMKLUBpdGVtIC1uCi1AaXRlbXggLS1ubWFnaWMKLVNldCB0aGUgdGV4dCBzZWdtZW50IHRvIGJlIHJlYWQgb25seSwgYW5kIG1hcmsgdGhlIG91dHB1dCBhcwotQGNvZGV7Tk1BR0lDfSBpZiBwb3NzaWJsZS4KLQotQGtpbmRleCAtTgotQGtpbmRleCAtLW9tYWdpYwotQGNpbmRleCByZWFkL3dyaXRlIGZyb20gY21kIGxpbmUKLUBjaW5kZXggT01BR0lDCi1AaXRlbSAtTiAKLUBpdGVteCAtLW9tYWdpYwotU2V0IHRoZSB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zIHRvIGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4gIEFsc28sIGRvCi1ub3QgcGFnZS1hbGlnbiB0aGUgZGF0YSBzZWdtZW50LiAgSWYgdGhlIG91dHB1dCBmb3JtYXQgc3VwcG9ydHMgVW5peAotc3R5bGUgbWFnaWMgbnVtYmVycywgbWFyayB0aGUgb3V0cHV0IGFzIEBjb2Rle09NQUdJQ30uCi0KLUBraW5kZXggLW8gQHZhcntvdXRwdXR9Ci1Aa2luZGV4IC0tb3V0cHV0PUB2YXJ7b3V0cHV0fQotQGNpbmRleCBuYW1pbmcgdGhlIG91dHB1dCBmaWxlCi1AaXRlbSAtbyBAdmFye291dHB1dH0KLUBpdGVteCAtLW91dHB1dD1AdmFye291dHB1dH0KLVVzZSBAdmFye291dHB1dH0gYXMgdGhlIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHByb2R1Y2VkIGJ5IEBjb2Rle2xkfTsgaWYgdGhpcwotb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIEBmaWxle2Eub3V0fSBpcyB1c2VkIGJ5IGRlZmF1bHQuICBUaGUKLXNjcmlwdCBjb21tYW5kIEBjb2Rle09VVFBVVH0gY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotQGtpbmRleCAtTyBAdmFye2xldmVsfQotQGNpbmRleCBnZW5lcmF0aW5nIG9wdGltaXplZCBvdXRwdXQKLUBpdGVtIC1PIEB2YXJ7bGV2ZWx9Ci1JZiBAdmFye2xldmVsfSBpcyBhIG51bWVyaWMgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvIEBjb2Rle2xkfSBvcHRpbWl6ZXMKLXRoZSBvdXRwdXQuICBUaGlzIG1pZ2h0IHRha2Ugc2lnbmlmaWNhbnRseSBsb25nZXIgYW5kIHRoZXJlZm9yZSBwcm9iYWJseQotc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBmb3IgdGhlIGZpbmFsIGJpbmFyeS4KLQotQGNpbmRleCBwYXJ0aWFsIGxpbmsKLUBjaW5kZXggcmVsb2NhdGFibGUgb3V0cHV0Ci1Aa2luZGV4IC1yCi1Aa2luZGV4IC0tcmVsb2NhdGVhYmxlCi1AaXRlbSAtcgotQGl0ZW14IC0tcmVsb2NhdGVhYmxlCi1HZW5lcmF0ZSByZWxvY2F0YWJsZSBvdXRwdXQtLS1pLmUuLCBnZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZSB0aGF0IGNhbiBpbgotdHVybiBzZXJ2ZSBhcyBpbnB1dCB0byBAY29kZXtsZH0uICBUaGlzIGlzIG9mdGVuIGNhbGxlZCBAZGZue3BhcnRpYWwKLWxpbmtpbmd9LiAgQXMgYSBzaWRlIGVmZmVjdCwgaW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBzdGFuZGFyZCBVbml4Ci1tYWdpYyBudW1iZXJzLCB0aGlzIG9wdGlvbiBhbHNvIHNldHMgdGhlIG91dHB1dCBmaWxlJ3MgbWFnaWMgbnVtYmVyIHRvCi1AY29kZXtPTUFHSUN9LgotQGMgOyBzZWUgQGNvZGV7LU59LiAKLUlmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIGFuIGFic29sdXRlIGZpbGUgaXMgcHJvZHVjZWQuICBXaGVuCi1saW5raW5nIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gQGVtcGh7d2lsbCBub3R9IHJlc29sdmUgcmVmZXJlbmNlcyB0bwotY29uc3RydWN0b3JzOyB0byBkbyB0aGF0LCB1c2UgQHNhbXB7LVVyfS4KLQotVGhpcyBvcHRpb24gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBAc2FtcHstaX0uCi0KLUBraW5kZXggLVIgQHZhcntmaWxlfQotQGtpbmRleCAtLWp1c3Qtc3ltYm9scz1AdmFye2ZpbGV9Ci1AY2luZGV4IHN5bWJvbC1vbmx5IGlucHV0Ci1AaXRlbSAtUiBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tanVzdC1zeW1ib2xzPUB2YXJ7ZmlsZW5hbWV9Ci1SZWFkIHN5bWJvbCBuYW1lcyBhbmQgdGhlaXIgYWRkcmVzc2VzIGZyb20gQHZhcntmaWxlbmFtZX0sIGJ1dCBkbyBub3QKLXJlbG9jYXRlIGl0IG9yIGluY2x1ZGUgaXQgaW4gdGhlIG91dHB1dC4gIFRoaXMgYWxsb3dzIHlvdXIgb3V0cHV0IGZpbGUKLXRvIHJlZmVyIHN5bWJvbGljYWxseSB0byBhYnNvbHV0ZSBsb2NhdGlvbnMgb2YgbWVtb3J5IGRlZmluZWQgaW4gb3RoZXIKLXByb2dyYW1zLiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24gbW9yZSB0aGFuIG9uY2UuCi0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgRUxGIGxpbmtlcnMsIGlmIHRoZSBAY29kZXstUn0gb3B0aW9uIGlzCi1mb2xsb3dlZCBieSBhIGRpcmVjdG9yeSBuYW1lLCByYXRoZXIgdGhhbiBhIGZpbGUgbmFtZSwgaXQgaXMgdHJlYXRlZCBhcwotdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uLgotCi1Aa2luZGV4IC1zCi1Aa2luZGV4IC0tc3RyaXAtYWxsCi1AY2luZGV4IHN0cmlwIGFsbCBzeW1ib2xzCi1AaXRlbSAtcyAKLUBpdGVteCAtLXN0cmlwLWFsbAotT21pdCBhbGwgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIG91dHB1dCBmaWxlLgotCi1Aa2luZGV4IC1TCi1Aa2luZGV4IC0tc3RyaXAtZGVidWcKLUBjaW5kZXggc3RyaXAgZGVidWdnZXIgc3ltYm9scwotQGl0ZW0gLVMgCi1AaXRlbXggLS1zdHJpcC1kZWJ1ZwotT21pdCBkZWJ1Z2dlciBzeW1ib2wgaW5mb3JtYXRpb24gKGJ1dCBub3QgYWxsIHN5bWJvbHMpIGZyb20gdGhlIG91dHB1dCBmaWxlLgotCi1Aa2luZGV4IC10Ci1Aa2luZGV4IC0tdHJhY2UKLUBjaW5kZXggaW5wdXQgZmlsZXMsIGRpc3BsYXlpbmcKLUBpdGVtIC10IAotQGl0ZW14IC0tdHJhY2UKLVByaW50IHRoZSBuYW1lcyBvZiB0aGUgaW5wdXQgZmlsZXMgYXMgQGNvZGV7bGR9IHByb2Nlc3NlcyB0aGVtLgotCi1Aa2luZGV4IC1UIEB2YXJ7c2NyaXB0fQotQGtpbmRleCAtLXNjcmlwdD1AdmFye3NjcmlwdH0KLUBjaW5kZXggc2NyaXB0IGZpbGVzCi1AaXRlbSAtVCBAdmFye3NjcmlwdGZpbGV9Ci1AaXRlbXggLS1zY3JpcHQ9QHZhcntzY3JpcHRmaWxlfQotVXNlIEB2YXJ7c2NyaXB0ZmlsZX0gYXMgdGhlIGxpbmtlciBzY3JpcHQuICBUaGlzIHNjcmlwdCByZXBsYWNlcwotQGNvZGV7bGR9J3MgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IChyYXRoZXIgdGhhbiBhZGRpbmcgdG8gaXQpLCBzbwotQHZhcntjb21tYW5kZmlsZX0gbXVzdCBzcGVjaWZ5IGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGRlc2NyaWJlIHRoZQotb3V0cHV0IGZpbGUuICBZb3UgbXVzdCB1c2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGEgY29tbWFuZAotd2hpY2ggY2FuIG9ubHkgYXBwZWFyIG9uY2UgaW4gYSBsaW5rZXIgc2NyaXB0LCBzdWNoIGFzIHRoZQotQGNvZGV7U0VDVElPTlN9IG9yIEBjb2Rle01FTU9SWX0gY29tbWFuZC4gIEB4cmVme1NjcmlwdHN9LiAgSWYKLUB2YXJ7c2NyaXB0ZmlsZX0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBAY29kZXtsZH0KLWxvb2tzIGZvciBpdCBpbiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IGFueSBwcmVjZWRpbmcgQHNhbXB7LUx9Ci1vcHRpb25zLiAgTXVsdGlwbGUgQHNhbXB7LVR9IG9wdGlvbnMgYWNjdW11bGF0ZS4KLQotQGtpbmRleCAtdSBAdmFye3N5bWJvbH0KLUBraW5kZXggLS11bmRlZmluZWQ9QHZhcntzeW1ib2x9Ci1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2wKLUBpdGVtIC11IEB2YXJ7c3ltYm9sfQotQGl0ZW14IC0tdW5kZWZpbmVkPUB2YXJ7c3ltYm9sfQotRm9yY2UgQHZhcntzeW1ib2x9IHRvIGJlIGVudGVyZWQgaW4gdGhlIG91dHB1dCBmaWxlIGFzIGFuIHVuZGVmaW5lZAotc3ltYm9sLiAgRG9pbmcgdGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbAotbW9kdWxlcyBmcm9tIHN0YW5kYXJkIGxpYnJhcmllcy4gIEBzYW1wey11fSBtYXkgYmUgcmVwZWF0ZWQgd2l0aAotZGlmZmVyZW50IG9wdGlvbiBhcmd1bWVudHMgdG8gZW50ZXIgYWRkaXRpb25hbCB1bmRlZmluZWQgc3ltYm9scy4gIFRoaXMKLW9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBAY29kZXtFWFRFUk59IGxpbmtlciBzY3JpcHQgY29tbWFuZC4KLQotQGtpbmRleCAtVXIKLUBjaW5kZXggY29uc3RydWN0b3JzCi1AaXRlbSAtVXIgCi1Gb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1wey1yfTogaXQgZ2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dC0tLWkuZS4sIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCi10dXJuIHNlcnZlIGFzIGlucHV0IHRvIEBjb2Rle2xkfS4gIFdoZW4gbGlua2luZyBDKysgcHJvZ3JhbXMsIEBzYW1wey1Vcn0KLUBlbXBoe2RvZXN9IHJlc29sdmUgcmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMsIHVubGlrZSBAc2FtcHstcn0uCi1JdCBkb2VzIG5vdCB3b3JrIHRvIHVzZSBAc2FtcHstVXJ9IG9uIGZpbGVzIHRoYXQgd2VyZSB0aGVtc2VsdmVzIGxpbmtlZAotd2l0aCBAc2FtcHstVXJ9OyBvbmNlIHRoZSBjb25zdHJ1Y3RvciB0YWJsZSBoYXMgYmVlbiBidWlsdCwgaXQgY2Fubm90Ci1iZSBhZGRlZCB0by4gIFVzZSBAc2FtcHstVXJ9IG9ubHkgZm9yIHRoZSBsYXN0IHBhcnRpYWwgbGluaywgYW5kCi1Ac2FtcHstcn0gZm9yIHRoZSBvdGhlcnMuCi0KLUBraW5kZXggLXYKLUBraW5kZXggLVYKLUBraW5kZXggLS12ZXJzaW9uCi1AY2luZGV4IHZlcnNpb24KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1AaXRlbXggLVYKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXtsZH0uICBUaGUgQGNvZGV7LVZ9IG9wdGlvbiBhbHNvCi1saXN0cyB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLUBraW5kZXggLXgKLUBraW5kZXggLS1kaXNjYXJkLWFsbAotQGNpbmRleCBkZWxldGluZyBsb2NhbCBzeW1ib2xzCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLURlbGV0ZSBhbGwgbG9jYWwgc3ltYm9scy4KLQotQGtpbmRleCAtWAotQGtpbmRleCAtLWRpc2NhcmQtbG9jYWxzCi1AY2luZGV4IGxvY2FsIHN5bWJvbHMsIGRlbGV0aW5nCi1AY2luZGV4IEwsIGRlbGV0aW5nIHN5bWJvbHMgYmVnaW5uaW5nCi1AaXRlbSAtWCAKLUBpdGVteCAtLWRpc2NhcmQtbG9jYWxzCi1EZWxldGUgYWxsIHRlbXBvcmFyeSBsb2NhbCBzeW1ib2xzLiAgRm9yIG1vc3QgdGFyZ2V0cywgdGhpcyBpcyBhbGwgbG9jYWwKLXN5bWJvbHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBAc2FtcHtMfS4KLQotQGtpbmRleCAteSBAdmFye3N5bWJvbH0KLUBraW5kZXggLS10cmFjZS1zeW1ib2w9QHZhcntzeW1ib2x9Ci1AY2luZGV4IHN5bWJvbCB0cmFjaW5nCi1AaXRlbSAteSBAdmFye3N5bWJvbH0KLUBpdGVteCAtLXRyYWNlLXN5bWJvbD1AdmFye3N5bWJvbH0KLVByaW50IHRoZSBuYW1lIG9mIGVhY2ggbGlua2VkIGZpbGUgaW4gd2hpY2ggQHZhcntzeW1ib2x9IGFwcGVhcnMuICBUaGlzCi1vcHRpb24gbWF5IGJlIGdpdmVuIGFueSBudW1iZXIgb2YgdGltZXMuICBPbiBtYW55IHN5c3RlbXMgaXQgaXMgbmVjZXNzYXJ5Ci10byBwcmVwZW5kIGFuIHVuZGVyc2NvcmUuCi0KLVRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4geW91ciBsaW5rIGJ1dAotZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVmZXJlbmNlIGlzIGNvbWluZyBmcm9tLgotCi1Aa2luZGV4IC1ZIEB2YXJ7cGF0aH0KLUBpdGVtIC1ZIEB2YXJ7cGF0aH0KLUFkZCBAdmFye3BhdGh9IHRvIHRoZSBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGguICBUaGlzIG9wdGlvbiBleGlzdHMKLWZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLUBraW5kZXggLXogQHZhcntrZXl3b3JkfQotQGl0ZW0gLXogQHZhcntrZXl3b3JkfQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC0oCi1AY2luZGV4IGdyb3VwcyBvZiBhcmNoaXZlcwotQGl0ZW0gLSggQHZhcnthcmNoaXZlc30gLSkKLUBpdGVteCAtLXN0YXJ0LWdyb3VwIEB2YXJ7YXJjaGl2ZXN9IC0tZW5kLWdyb3VwCi1UaGUgQHZhcnthcmNoaXZlc30gc2hvdWxkIGJlIGEgbGlzdCBvZiBhcmNoaXZlIGZpbGVzLiAgVGhleSBtYXkgYmUKLWVpdGhlciBleHBsaWNpdCBmaWxlIG5hbWVzLCBvciBAc2FtcHstbH0gb3B0aW9ucy4KLQotVGhlIHNwZWNpZmllZCBhcmNoaXZlcyBhcmUgc2VhcmNoZWQgcmVwZWF0ZWRseSB1bnRpbCBubyBuZXcgdW5kZWZpbmVkCi1yZWZlcmVuY2VzIGFyZSBjcmVhdGVkLiAgTm9ybWFsbHksIGFuIGFyY2hpdmUgaXMgc2VhcmNoZWQgb25seSBvbmNlIGluCi10aGUgb3JkZXIgdGhhdCBpdCBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIGEgc3ltYm9sIGluIHRoYXQKLWFyY2hpdmUgaXMgbmVlZGVkIHRvIHJlc29sdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCByZWZlcnJlZCB0byBieSBhbgotb2JqZWN0IGluIGFuIGFyY2hpdmUgdGhhdCBhcHBlYXJzIGxhdGVyIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBsaW5rZXIKLXdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlc29sdmUgdGhhdCByZWZlcmVuY2UuICBCeSBncm91cGluZyB0aGUgYXJjaGl2ZXMsCi10aGV5IGFsbCBiZSBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIGFsbCBwb3NzaWJsZSByZWZlcmVuY2VzIGFyZQotcmVzb2x2ZWQuCi0KLVVzaW5nIHRoaXMgb3B0aW9uIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGNvc3QuICBJdCBpcyBiZXN0IHRvIHVzZQotaXQgb25seSB3aGVuIHRoZXJlIGFyZSB1bmF2b2lkYWJsZSBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gdHdvIG9yCi1tb3JlIGFyY2hpdmVzLgotCi1Aa2luZGV4IC1hc3NlcnQgQHZhcntrZXl3b3JkfQotQGl0ZW0gLWFzc2VydCBAdmFye2tleXdvcmR9Ci1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBTdW5PUyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC1CZHluYW1pYwotQGtpbmRleCAtZHkKLUBraW5kZXggLWNhbGxfc2hhcmVkCi1AaXRlbSAtQmR5bmFtaWMKLUBpdGVteCAtZHkKLUBpdGVteCAtY2FsbF9zaGFyZWQKLUxpbmsgYWdhaW5zdCBkeW5hbWljIGxpYnJhcmllcy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIG9uIHBsYXRmb3JtcwotZm9yIHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gIFRoaXMgb3B0aW9uIGlzIG5vcm1hbGx5IHRoZQotZGVmYXVsdCBvbiBzdWNoIHBsYXRmb3Jtcy4gIFRoZSBkaWZmZXJlbnQgdmFyaWFudHMgb2YgdGhpcyBvcHRpb24gYXJlCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgc3lzdGVtcy4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uCi1tdWx0aXBsZSB0aW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lOiBpdCBhZmZlY3RzIGxpYnJhcnkgc2VhcmNoaW5nIGZvcgotQGNvZGV7LWx9IG9wdGlvbnMgd2hpY2ggZm9sbG93IGl0LgotCi1Aa2luZGV4IC1Cc3RhdGljCi1Aa2luZGV4IC1kbgotQGtpbmRleCAtbm9uX3NoYXJlZAotQGtpbmRleCAtc3RhdGljCi1AaXRlbSAtQnN0YXRpYyAKLUBpdGVteCAtZG4KLUBpdGVteCAtbm9uX3NoYXJlZAotQGl0ZW14IC1zdGF0aWMKLURvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIG9uCi1wbGF0Zm9ybXMgZm9yIHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gIFRoZSBkaWZmZXJlbnQKLXZhcmlhbnRzIG9mIHRoaXMgb3B0aW9uIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgc3lzdGVtcy4gIFlvdQotbWF5IHVzZSB0aGlzIG9wdGlvbiBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lOiBpdCBhZmZlY3RzCi1saWJyYXJ5IHNlYXJjaGluZyBmb3IgQGNvZGV7LWx9IG9wdGlvbnMgd2hpY2ggZm9sbG93IGl0LgotCi1Aa2luZGV4IC1Cc3ltYm9saWMKLUBpdGVtIC1Cc3ltYm9saWMKLVdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYmluZCByZWZlcmVuY2VzIHRvIGdsb2JhbCBzeW1ib2xzIHRvIHRoZQotZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBpZiBhbnkuICBOb3JtYWxseSwgaXQgaXMgcG9zc2libGUKLWZvciBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSB0byBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbgotd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBFTEYKLXBsYXRmb3JtcyB3aGljaCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCi0KLUBraW5kZXggLS1jaGVjay1zZWN0aW9ucwotQGtpbmRleCAtLW5vLWNoZWNrLXNlY3Rpb25zCi1AaXRlbSAtLWNoZWNrLXNlY3Rpb25zCi1AaXRlbXggLS1uby1jaGVjay1zZWN0aW9ucwotQXNrcyB0aGUgbGlua2VyIEBlbXBoe25vdH0gdG8gY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgYWZ0ZXIgdGhleSBoYXZlCi1iZWVuIGFzc2lnbmVkIHRvIHNlZSBpZiB0aGVyZSBhbnkgb3ZlcmxhcHMuICBOb3JtYWxseSB0aGUgbGlua2VyIHdpbGwKLXBlcmZvcm0gdGhpcyBjaGVjaywgYW5kIGlmIGl0IGZpbmRzIGFueSBvdmVybGFwcyBpdCB3aWxsIHByb2R1Y2UKLXN1aXRhYmxlIGVycm9yIG1lc3NhZ2VzLiAgVGhlIGxpbmtlciBkb2VzIGtub3cgYWJvdXQsIGFuZCBkb2VzIG1ha2UKLWFsbG93YW5jZXMgZm9yIHNlY3Rpb25zIGluIG92ZXJsYXlzLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGNhbiBiZQotcmVzdG9yZWQgYnkgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2ggQHNhbXB7LS1jaGVjay1zZWN0aW9uc30uCi0KLUBjaW5kZXggY3Jvc3MgcmVmZXJlbmNlIHRhYmxlCi1Aa2luZGV4IC0tY3JlZgotQGl0ZW0gLS1jcmVmCi1PdXRwdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICBJZiBhIGxpbmtlciBtYXAgZmlsZSBpcyBiZWluZwotZ2VuZXJhdGVkLCB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGlzIHByaW50ZWQgdG8gdGhlIG1hcCBmaWxlLgotT3RoZXJ3aXNlLCBpdCBpcyBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGlzIGludGVudGlvbmFsbHkgc2ltcGxlLCBzbyB0aGF0IGl0IG1heSBiZQotZWFzaWx5IHByb2Nlc3NlZCBieSBhIHNjcmlwdCBpZiBuZWNlc3NhcnkuICBUaGUgc3ltYm9scyBhcmUgcHJpbnRlZCBvdXQsCi1zb3J0ZWQgYnkgbmFtZS4gIEZvciBlYWNoIHN5bWJvbCwgYSBsaXN0IG9mIGZpbGUgbmFtZXMgaXMgZ2l2ZW4uICBJZiB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkLCB0aGUgZmlyc3QgZmlsZSBsaXN0ZWQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZQotZGVmaW5pdGlvbi4gIFRoZSByZW1haW5pbmcgZmlsZXMgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wuCi0KLUBjaW5kZXggc3ltYm9scywgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLS1kZWZzeW0gQHZhcntzeW1ib2x9PUB2YXJ7ZXhwfQotQGl0ZW0gLS1kZWZzeW0gQHZhcntzeW1ib2x9PUB2YXJ7ZXhwcmVzc2lvbn0KLUNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQotYWRkcmVzcyBnaXZlbiBieSBAdmFye2V4cHJlc3Npb259LiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24gYXMgbWFueQotdGltZXMgYXMgbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aXBsZSBzeW1ib2xzIGluIHRoZSBjb21tYW5kIGxpbmUuICBBCi1saW1pdGVkIGZvcm0gb2YgYXJpdGhtZXRpYyBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBAdmFye2V4cHJlc3Npb259IGluIHRoaXMKLWNvbnRleHQ6IHlvdSBtYXkgZ2l2ZSBhIGhleGFkZWNpbWFsIGNvbnN0YW50IG9yIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nCi1zeW1ib2wsIG9yIHVzZSBAY29kZXsrfSBhbmQgQGNvZGV7LX0gdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCi1jb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgotdXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQgKEBweHJlZntBc3NpZ25tZW50cywsCi1Bc3NpZ25tZW50OiBTeW1ib2wgRGVmaW5pdGlvbnN9KS4gIEBlbXBoe05vdGU6fSB0aGVyZSBzaG91bGQgYmUgbm8gd2hpdGUKLXNwYWNlIGJldHdlZW4gQHZhcntzeW1ib2x9LCB0aGUgZXF1YWxzIHNpZ24gKGBgQGtleXs9fScnKSwgYW5kCi1AdmFye2V4cHJlc3Npb259LgotCi1AY2luZGV4IGRlbWFuZ2xpbmcsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC0tZGVtYW5nbGUKLUBraW5kZXggLS1uby1kZW1hbmdsZQotQGl0ZW0gLS1kZW1hbmdsZQotQGl0ZW14IC0tbm8tZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvciBtZXNzYWdlcwotYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdCB0cmllcyB0bwotcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwotdW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMgQysrCi1tYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwgZGVtYW5nbGUKLWJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAc2FtcHtDT0xMRUNUX05PX0RFTUFOR0xFfSBpcwotc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLQotQGNpbmRleCBkeW5hbWljIGxpbmtlciwgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLS1keW5hbWljLWxpbmtlciBAdmFye2ZpbGV9Ci1AaXRlbSAtLWR5bmFtaWMtbGlua2VyIEB2YXJ7ZmlsZX0KLVNldCB0aGUgbmFtZSBvZiB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuCi1nZW5lcmF0aW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBFTEYgZXhlY3V0YWJsZXMuICBUaGUgZGVmYXVsdCBkeW5hbWljCi1saW5rZXIgaXMgbm9ybWFsbHkgY29ycmVjdDsgZG9uJ3QgdXNlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZQotZG9pbmcuCi0KLUBjaW5kZXggTUlQUyBlbWJlZGRlZCBQSUMgY29kZQotQGtpbmRleCAtLWVtYmVkZGVkLXJlbG9jcwotQGl0ZW0gLS1lbWJlZGRlZC1yZWxvY3MKLVRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGxpbmtpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZSwKLWdlbmVyYXRlZCBieSB0aGUgLW1lbWJlZGRlZC1waWMgb3B0aW9uIHRvIHRoZSBAc2N7Z251fSBjb21waWxlciBhbmQKLWFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHRhYmxlIHdoaWNoIG1heSBiZSB1c2VkIGF0Ci1ydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoIHdhcyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIHBvaW50ZXIKLXZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbiB0ZXN0c3VpdGUvbGQtZW1waWMgZm9yIGRldGFpbHMuCi0KLUBraW5kZXggLS1mb3JjZS1leGUtc3VmZml4Ci1AaXRlbSAgLS1mb3JjZS1leGUtc3VmZml4Ci1NYWtlIHN1cmUgdGhhdCBhbiBvdXRwdXQgZmlsZSBoYXMgYSAuZXhlIHN1ZmZpeC4KLQotSWYgYSBzdWNjZXNzZnVsbHkgYnVpbHQgZnVsbHkgbGlua2VkIG91dHB1dCBmaWxlIGRvZXMgbm90IGhhdmUgYQotQGNvZGV7LmV4ZX0gb3IgQGNvZGV7LmRsbH0gc3VmZml4LCB0aGlzIG9wdGlvbiBmb3JjZXMgdGhlIGxpbmtlciB0byBjb3B5Ci10aGUgb3V0cHV0IGZpbGUgdG8gb25lIG9mIHRoZSBzYW1lIG5hbWUgd2l0aCBhIEBjb2Rley5leGV9IHN1ZmZpeC4gVGhpcwotb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIHVubW9kaWZpZWQgVW5peCBtYWtlZmlsZXMgb24gYSBNaWNyb3NvZnQKLVdpbmRvd3MgaG9zdCwgc2luY2Ugc29tZSB2ZXJzaW9ucyBvZiBXaW5kb3dzIHdvbid0IHJ1biBhbiBpbWFnZSB1bmxlc3MKLWl0IGVuZHMgaW4gYSBAY29kZXsuZXhlfSBzdWZmaXguCi0KLUBraW5kZXggLS1nYy1zZWN0aW9ucwotQGtpbmRleCAtLW5vLWdjLXNlY3Rpb25zCi1AY2luZGV4IGdhcmJhZ2UgY29sbGVjdGlvbgotQGl0ZW0gLS1uby1nYy1zZWN0aW9ucwotQGl0ZW14IC0tZ2Mtc2VjdGlvbnMKLUVuYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdW51c2VkIGlucHV0IHNlY3Rpb25zLiAgSXQgaXMgaWdub3JlZCBvbgotdGFyZ2V0cyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoaXMgb3B0aW9uLiAgVGhpcyBvcHRpb24gaXMgbm90IGNvbXBhdGlibGUKLXdpdGggQHNhbXB7LXJ9LCBub3Igc2hvdWxkIGl0IGJlIHVzZWQgd2l0aCBkeW5hbWljIGxpbmtpbmcuICBUaGUgZGVmYXVsdAotYmVoYXZpb3VyIChvZiBub3QgcGVyZm9ybWluZyB0aGlzIGdhcmJhZ2UgY29sbGVjdGlvbikgY2FuIGJlIHJlc3RvcmVkIGJ5Ci1zcGVjaWZ5aW5nIEBzYW1wey0tbm8tZ2Mtc2VjdGlvbnN9IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBjaW5kZXggaGVscAotQGNpbmRleCB1c2FnZQotQGtpbmRleCAtLWhlbHAKLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi1Aa2luZGV4IC1NYXAKLUBpdGVtIC1NYXAgQHZhcnttYXBmaWxlfQotUHJpbnQgYSBsaW5rIG1hcCB0byB0aGUgZmlsZSBAdmFye21hcGZpbGV9LiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLUBzYW1wey1NfSBvcHRpb24sIGFib3ZlLgotCi1AY2luZGV4IG1lbW9yeSB1c2FnZQotQGtpbmRleCAtLW5vLWtlZXAtbWVtb3J5Ci1AaXRlbSAtLW5vLWtlZXAtbWVtb3J5Ci1AY29kZXtsZH0gbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nIHRoZQotc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdG8KLWluc3RlYWQgb3B0aW1pemUgZm9yIG1lbW9yeSB1c2FnZSwgYnkgcmVyZWFkaW5nIHRoZSBzeW1ib2wgdGFibGVzIGFzCi1uZWNlc3NhcnkuICBUaGlzIG1heSBiZSByZXF1aXJlZCBpZiBAY29kZXtsZH0gcnVucyBvdXQgb2YgbWVtb3J5IHNwYWNlCi13aGlsZSBsaW5raW5nIGEgbGFyZ2UgZXhlY3V0YWJsZS4KLQotQGtpbmRleCAtLW5vLXVuZGVmaW5lZAotQGl0ZW0gLS1uby11bmRlZmluZWQKLU5vcm1hbGx5IHdoZW4gY3JlYXRpbmcgYSBub24tc3ltYm9saWMgc2hhcmVkIGxpYnJhcnksIHVuZGVmaW5lZCBzeW1ib2xzCi1hcmUgYWxsb3dlZCBhbmQgbGVmdCB0byBiZSByZXNvbHZlZCBieSB0aGUgcnVudGltZSBsb2FkZXIuICBUaGlzIG9wdGlvbgotZGlzYWxsb3dzIHN1Y2ggdW5kZWZpbmVkIHN5bWJvbHMuCi0KLUBraW5kZXggLS1uby13YXJuLW1pc21hdGNoCi1AaXRlbSAtLW5vLXdhcm4tbWlzbWF0Y2gKLU5vcm1hbGx5IEBjb2Rle2xkfSB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBsaW5rIHRvZ2V0aGVyIGlucHV0Ci1maWxlcyB0aGF0IGFyZSBtaXNtYXRjaGVkIGZvciBzb21lIHJlYXNvbiwgcGVyaGFwcyBiZWNhdXNlIHRoZXkgaGF2ZQotYmVlbiBjb21waWxlZCBmb3IgZGlmZmVyZW50IHByb2Nlc3NvcnMgb3IgZm9yIGRpZmZlcmVudCBlbmRpYW5uZXNzZXMuCi1UaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdGhhdCBpdCBzaG91bGQgc2lsZW50bHkgcGVybWl0IHN1Y2ggcG9zc2libGUKLWVycm9ycy4gIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBjYXJlLCBpbiBjYXNlcyB3aGVuIHlvdQotaGF2ZSB0YWtlbiBzb21lIHNwZWNpYWwgYWN0aW9uIHRoYXQgZW5zdXJlcyB0aGF0IHRoZSBsaW5rZXIgZXJyb3JzIGFyZQotaW5hcHByb3ByaWF0ZS4KLQotQGtpbmRleCAtLW5vLXdob2xlLWFyY2hpdmUKLUBpdGVtIC0tbm8td2hvbGUtYXJjaGl2ZQotVHVybiBvZmYgdGhlIGVmZmVjdCBvZiB0aGUgQGNvZGV7LS13aG9sZS1hcmNoaXZlfSBvcHRpb24gZm9yIHN1YnNlcXVlbnQKLWFyY2hpdmUgZmlsZXMuCi0KLUBjaW5kZXggb3V0cHV0IGZpbGUgYWZ0ZXIgZXJyb3JzCi1Aa2luZGV4IC0tbm9pbmhpYml0LWV4ZWMKLUBpdGVtIC0tbm9pbmhpYml0LWV4ZWMKLVJldGFpbiB0aGUgZXhlY3V0YWJsZSBvdXRwdXQgZmlsZSB3aGVuZXZlciBpdCBpcyBzdGlsbCB1c2FibGUuCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKLWVycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2VzczsgaXQgZXhpdHMgd2l0aG91dCB3cml0aW5nIGFuIG91dHB1dCBmaWxlCi13aGVuIGl0IGlzc3VlcyBhbnkgZXJyb3Igd2hhdHNvZXZlci4KLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Aa2luZGV4IC0tb2Zvcm1hdAotQGl0ZW0gLS1vZm9ybWF0IEB2YXJ7b3V0cHV0LWZvcm1hdH0KLUBjb2Rle2xkfSBtYXkgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUga2luZCBvZiBvYmplY3QKLWZpbGUuICBJZiB5b3VyIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGUKLUBzYW1wey0tb2Zvcm1hdH0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQKLW9iamVjdCBmaWxlLiAgRXZlbiB3aGVuIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgYWx0ZXJuYXRpdmUKLW9iamVjdCBmb3JtYXRzLCB5b3UgZG9uJ3QgdXN1YWxseSBuZWVkIHRvIHNwZWNpZnkgdGhpcywgYXMgQGNvZGV7bGR9Ci1zaG91bGQgYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGFzIGEgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRoZSBtb3N0Ci11c3VhbCBmb3JtYXQgb24gZWFjaCBtYWNoaW5lLiAgQHZhcntvdXRwdXQtZm9ybWF0fSBpcyBhIHRleHQgc3RyaW5nLCB0aGUKLW5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAoWW91IGNhbgotbGlzdCB0aGUgYXZhaWxhYmxlIGJpbmFyeSBmb3JtYXRzIHdpdGggQHNhbXB7b2JqZHVtcCAtaX0uKSAgVGhlIHNjcmlwdAotY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQKLXRoaXMgb3B0aW9uIG92ZXJyaWRlcyBpdC4gIEB4cmVme0JGRH0uCi1AZW5kIGlmY2xlYXIKLQotQGtpbmRleCAtcW1hZ2ljCi1AaXRlbSAtcW1hZ2ljCi1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC1ReQotQGl0ZW0gLVF5Ci1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkuCi0KLUBraW5kZXggLS1yZWxheAotQGNpbmRleCBzeW50aGVzaXppbmcgbGlua2VyCi1AY2luZGV4IHJlbGF4aW5nIGFkZHJlc3NpbmcgbW9kZXMKLUBpdGVtIC0tcmVsYXgKLUFuIG9wdGlvbiB3aXRoIG1hY2hpbmUgZGVwZW5kZW50IGVmZmVjdHMuICAKLUBpZnNldCBHRU5FUklDCi1UaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBhIGZldyB0YXJnZXRzLgotQGVuZCBpZnNldAotQGlmc2V0IEg4MzAwCi1AeHJlZntIOC8zMDAsLEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotQHhyZWZ7aTk2MCwsIEBjb2Rle2xkfSBhbmQgdGhlIEludGVsIDk2MCBmYW1pbHl9LgotQGVuZCBpZnNldAotCi0KLU9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIHBlcmZvcm1zIGdsb2JhbAotb3B0aW1pemF0aW9ucyB0aGF0IGJlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZwotaW4gdGhlIHByb2dyYW0sIHN1Y2ggYXMgcmVsYXhpbmcgYWRkcmVzcyBtb2RlcyBhbmQgc3ludGhlc2l6aW5nIG5ldwotaW5zdHJ1Y3Rpb25zIGluIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUuCi0KLU9uIHNvbWUgcGxhdGZvcm1zIHRoZXNlIGxpbmsgdGltZSBnbG9iYWwgb3B0aW1pemF0aW9ucyBtYXkgbWFrZSBzeW1ib2xpYwotZGVidWdnaW5nIG9mIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSBpbXBvc3NpYmxlLgotQGlmc2V0IEdFTkVSSUMKLVRoaXMgaXMga25vd24gdG8gYmUKLXRoZSBjYXNlIGZvciB0aGUgTWF0c3VzaGl0YSBNTjEwMjAwIGFuZCBNTjEwMzAwIGZhbWlseSBvZiBwcm9jZXNzb3JzLgotQGVuZCBpZnNldAotCi1AaWZzZXQgR0VORVJJQwotT24gcGxhdGZvcm1zIHdoZXJlIHRoaXMgaXMgbm90IHN1cHBvcnRlZCwgQHNhbXB7LS1yZWxheH0gaXMgYWNjZXB0ZWQsCi1idXQgaWdub3JlZC4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCByZXRhaW5pbmcgc3BlY2lmaWVkIHN5bWJvbHMKLUBjaW5kZXggc3RyaXBwaW5nIGFsbCBidXQgc29tZSBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIHJldGFpbmluZyBzZWxlY3RpdmVseQotQGl0ZW0gLS1yZXRhaW4tc3ltYm9scy1maWxlIEB2YXJ7ZmlsZW5hbWV9Ci1SZXRhaW4gQGVtcGh7b25seX0gdGhlIHN5bWJvbHMgbGlzdGVkIGluIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LAotZGlzY2FyZGluZyBhbGwgb3RoZXJzLiAgQHZhcntmaWxlbmFtZX0gaXMgc2ltcGx5IGEgZmxhdCBmaWxlLCB3aXRoIG9uZQotc3ltYm9sIG5hbWUgcGVyIGxpbmUuICBUaGlzIG9wdGlvbiBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBlbnZpcm9ubWVudHMKLUBpZnNldCBHRU5FUklDCi0oc3VjaCBhcyBWeFdvcmtzKQotQGVuZCBpZnNldAotd2hlcmUgYSBsYXJnZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGlzIGFjY3VtdWxhdGVkIGdyYWR1YWxseSwgdG8gY29uc2VydmUKLXJ1bi10aW1lIG1lbW9yeS4KLQotQHNhbXB7LS1yZXRhaW4tc3ltYm9scy1maWxlfSBkb2VzIEBlbXBoe25vdH0gZGlzY2FyZCB1bmRlZmluZWQgc3ltYm9scywKLW9yIHN5bWJvbHMgbmVlZGVkIGZvciByZWxvY2F0aW9ucy4KLQotWW91IG1heSBvbmx5IHNwZWNpZnkgQHNhbXB7LS1yZXRhaW4tc3ltYm9scy1maWxlfSBvbmNlIGluIHRoZSBjb21tYW5kCi1saW5lLiAgSXQgb3ZlcnJpZGVzIEBzYW1wey1zfSBhbmQgQHNhbXB7LVN9LgotCi1AaWZzZXQgR0VORVJJQwotQGl0ZW0gLXJwYXRoIEB2YXJ7ZGlyfQotQGNpbmRleCBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGgKLUBraW5kZXggLXJwYXRoCi1BZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCi1saW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgQGNvZGV7LXJwYXRofQotYXJndW1lbnRzIGFyZSBjb25jYXRlbmF0ZWQgYW5kIHBhc3NlZCB0byB0aGUgcnVudGltZSBsaW5rZXIsIHdoaWNoIHVzZXMKLXRoZW0gdG8gbG9jYXRlIHNoYXJlZCBvYmplY3RzIGF0IHJ1bnRpbWUuICBUaGUgQGNvZGV7LXJwYXRofSBvcHRpb24gaXMKLWFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkgc2hhcmVkCi1vYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCi1AY29kZXstcnBhdGgtbGlua30gb3B0aW9uLiAgSWYgQGNvZGV7LXJwYXRofSBpcyBub3QgdXNlZCB3aGVuIGxpbmtpbmcgYW4KLUVMRiBleGVjdXRhYmxlLCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1AY29kZXtMRF9SVU5fUEFUSH0gd2lsbCBiZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQuCi0KLVRoZSBAY29kZXstcnBhdGh9IG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VkIG9uIFN1bk9TLiAgQnkgZGVmYXVsdCwgb24KLVN1bk9TLCB0aGUgbGlua2VyIHdpbGwgZm9ybSBhIHJ1bnRpbWUgc2VhcmNoIHBhdGNoIG91dCBvZiBhbGwgdGhlCi1AY29kZXstTH0gb3B0aW9ucyBpdCBpcyBnaXZlbi4gIElmIGEgQGNvZGV7LXJwYXRofSBvcHRpb24gaXMgdXNlZCwgdGhlCi1ydW50aW1lIHNlYXJjaCBwYXRoIHdpbGwgYmUgZm9ybWVkIGV4Y2x1c2l2ZWx5IHVzaW5nIHRoZSBAY29kZXstcnBhdGh9Ci1vcHRpb25zLCBpZ25vcmluZyB0aGUgQGNvZGV7LUx9IG9wdGlvbnMuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB1c2luZwotZ2NjLCB3aGljaCBhZGRzIG1hbnkgQGNvZGV7LUx9IG9wdGlvbnMgd2hpY2ggbWF5IGJlIG9uIE5GUyBtb3VudGVkCi1maWxlc3lzdGVtcy4KLQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBFTEYgbGlua2VycywgaWYgdGhlIEBjb2Rley1SfSBvcHRpb24gaXMKLWZvbGxvd2VkIGJ5IGEgZGlyZWN0b3J5IG5hbWUsIHJhdGhlciB0aGFuIGEgZmlsZSBuYW1lLCBpdCBpcyB0cmVhdGVkIGFzCi10aGUgQGNvZGV7LXJwYXRofSBvcHRpb24uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBHRU5FUklDCi1AY2luZGV4IGxpbmstdGltZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGgKLUBraW5kZXggLXJwYXRoLWxpbmsKLUBpdGVtIC1ycGF0aC1saW5rIEB2YXJ7RElSfQotV2hlbiB1c2luZyBFTEYgb3IgU3VuT1MsIG9uZSBzaGFyZWQgbGlicmFyeSBtYXkgcmVxdWlyZSBhbm90aGVyLiAgVGhpcwotaGFwcGVucyB3aGVuIGFuIEBjb2Rle2xkIC1zaGFyZWR9IGxpbmsgaW5jbHVkZXMgYSBzaGFyZWQgbGlicmFyeSBhcyBvbmUKLW9mIHRoZSBpbnB1dCBmaWxlcy4KLQotV2hlbiB0aGUgbGlua2VyIGVuY291bnRlcnMgc3VjaCBhIGRlcGVuZGVuY3kgd2hlbiBkb2luZyBhIG5vbi1zaGFyZWQsCi1ub24tcmVsb2NhdGFibGUgbGluaywgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBsb2NhdGUgdGhlIHJlcXVpcmVkCi1zaGFyZWQgbGlicmFyeSBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbGluaywgaWYgaXQgaXMgbm90IGluY2x1ZGVkCi1leHBsaWNpdGx5LiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBAY29kZXstcnBhdGgtbGlua30gb3B0aW9uCi1zcGVjaWZpZXMgdGhlIGZpcnN0IHNldCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2guICBUaGUKLUBjb2Rley1ycGF0aC1saW5rfSBvcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMKLWVpdGhlciBieSBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieQotYXBwZWFyaW5nIG11bHRpcGxlIHRpbWVzLgotCi1UaGUgbGlua2VyIHVzZXMgdGhlIGZvbGxvd2luZyBzZWFyY2ggcGF0aHMgdG8gbG9jYXRlIHJlcXVpcmVkIHNoYXJlZAotbGlicmFyaWVzLgotQGVudW1lcmF0ZQotQGl0ZW0KLUFueSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbnMuCi1AaXRlbQotQW55IGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSBAY29kZXstcnBhdGh9IG9wdGlvbnMuICBUaGUgZGlmZmVyZW5jZQotYmV0d2VlbiBAY29kZXstcnBhdGh9IGFuZCBAY29kZXstcnBhdGgtbGlua30gaXMgdGhhdCBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGJ5IEBjb2Rley1ycGF0aH0gb3B0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIGV4ZWN1dGFibGUgYW5kCi11c2VkIGF0IHJ1bnRpbWUsIHdoZXJlYXMgdGhlIEBjb2Rley1ycGF0aC1saW5rfSBvcHRpb24gaXMgb25seSBlZmZlY3RpdmUKLWF0IGxpbmsgdGltZS4KLUBpdGVtCi1PbiBhbiBFTEYgc3lzdGVtLCBpZiB0aGUgQGNvZGV7LXJwYXRofSBhbmQgQGNvZGV7cnBhdGgtbGlua30gb3B0aW9ucwotd2VyZSBub3QgdXNlZCwgc2VhcmNoIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0xEX1JVTl9QQVRIfS4KLUBpdGVtCi1PbiBTdW5PUywgaWYgdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uIHdhcyBub3QgdXNlZCwgc2VhcmNoIGFueQotZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHVzaW5nIEBjb2Rley1MfSBvcHRpb25zLgotQGl0ZW0KLUZvciBhIG5hdGl2ZSBsaW5rZXIsIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0xEX0xJQlJBUllfUEFUSH0uCi1AaXRlbQotVGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMsIG5vcm1hbGx5IEBmaWxley9saWJ9IGFuZCBAZmlsZXsvdXNyL2xpYn0uCi1AaXRlbQotRm9yIGEgbmF0aXZlIGxpbmtlciBvbiBhbiBFTEYgc3lzdGVtLCBpZiB0aGUgZmlsZSBAZmlsZXsvZXRjL2xkLnNvLmNvbmZ9Ci1leGlzdHMsIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGZvdW5kIGluIHRoYXQgZmlsZS4KLUBlbmQgZW51bWVyYXRlCi0KLUlmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCi13YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgotQGVuZCBpZnNldAotCi1Aa2luZGV4IC1zaGFyZWQKLUBraW5kZXggLUJzaGFyZWFibGUKLUBpdGVtIC1zaGFyZWQKLUBpdGVteCAtQnNoYXJlYWJsZQotQGNpbmRleCBzaGFyZWQgbGlicmFyaWVzCi1DcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIG9uIEVMRiwgWENPRkYKLWFuZCBTdW5PUyBwbGF0Zm9ybXMuICBPbiBTdW5PUywgdGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEKLXNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBAY29kZXstZX0gb3B0aW9uIGlzIG5vdCB1c2VkIGFuZCB0aGVyZSBhcmUKLXVuZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBsaW5rLgotCi1AaXRlbSAtLXNvcnQtY29tbW9uCi1Aa2luZGV4IC0tc29ydC1jb21tb24KLVRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle2xkfSB0byBzb3J0IHRoZSBjb21tb24gc3ltYm9scyBieSBzaXplIHdoZW4gaXQKLXBsYWNlcyB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgc2VjdGlvbnMuICBGaXJzdCBjb21lIGFsbCB0aGUgb25lCi1ieXRlIHN5bWJvbHMsIHRoZW4gYWxsIHRoZSB0d28gYnl0ZXMsIHRoZW4gYWxsIHRoZSBmb3VyIGJ5dGVzLCBhbmQgdGhlbgotZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBpcyB0byBwcmV2ZW50IGdhcHMgYmV0d2VlbiBzeW1ib2xzIGR1ZSB0bwotYWxpZ25tZW50IGNvbnN0cmFpbnRzLgotCi1Aa2luZGV4IC0tc3BsaXQtYnktZmlsZQotQGl0ZW0gLS1zcGxpdC1ieS1maWxlCi1TaW1pbGFyIHRvIEBjb2Rley0tc3BsaXQtYnktcmVsb2N9IGJ1dCBjcmVhdGVzIGEgbmV3IG91dHB1dCBzZWN0aW9uIGZvcgotZWFjaCBpbnB1dCBmaWxlLgotCi1Aa2luZGV4IC0tc3BsaXQtYnktcmVsb2MKLUBpdGVtIC0tc3BsaXQtYnktcmVsb2MgQHZhcntjb3VudH0KLVRyeXMgdG8gY3JlYXRlcyBleHRyYSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgc28gdGhhdCBubyBzaW5nbGUKLW91dHB1dCBzZWN0aW9uIGluIHRoZSBmaWxlIGNvbnRhaW5zIG1vcmUgdGhhbiBAdmFye2NvdW50fSByZWxvY2F0aW9ucy4KLVRoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCi1jZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCi1jYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLiAgTm90ZQotdGhhdCB0aGlzIHdpbGwgZmFpbCB0byB3b3JrIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3QKLXN1cHBvcnQgYXJiaXRyYXJ5IHNlY3Rpb25zLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzcGxpdCB1cCBpbmRpdmlkdWFsCi1pbnB1dCBzZWN0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24sIHNvIGlmIGEgc2luZ2xlIGlucHV0IHNlY3Rpb24gY29udGFpbnMKLW1vcmUgdGhhbiBAdmFye2NvdW50fSByZWxvY2F0aW9ucyBvbmUgb3V0cHV0IHNlY3Rpb24gd2lsbCBjb250YWluIHRoYXQKLW1hbnkgcmVsb2NhdGlvbnMuCi0KLUBraW5kZXggLS1zdGF0cwotQGl0ZW0gLS1zdGF0cwotQ29tcHV0ZSBhbmQgZGlzcGxheSBzdGF0aXN0aWNzIGFib3V0IHRoZSBvcGVyYXRpb24gb2YgdGhlIGxpbmtlciwgc3VjaAotYXMgZXhlY3V0aW9uIHRpbWUgYW5kIG1lbW9yeSB1c2FnZS4KLQotQGtpbmRleCAtLXRyYWRpdGlvbmFsLWZvcm1hdAotQGNpbmRleCB0cmFkaXRpb25hbCBmb3JtYXQKLUBpdGVtIC0tdHJhZGl0aW9uYWwtZm9ybWF0Ci1Gb3Igc29tZSB0YXJnZXRzLCB0aGUgb3V0cHV0IG9mIEBjb2Rle2xkfSBpcyBkaWZmZXJlbnQgaW4gc29tZSB3YXlzIGZyb20KLXRoZSBvdXRwdXQgb2Ygc29tZSBleGlzdGluZyBsaW5rZXIuICBUaGlzIHN3aXRjaCByZXF1ZXN0cyBAY29kZXtsZH0gdG8KLXVzZSB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0IGluc3RlYWQuCi0KLUBjaW5kZXggZGJ4Ci1Gb3IgZXhhbXBsZSwgb24gU3VuT1MsIEBjb2Rle2xkfSBjb21iaW5lcyBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUKLXN5bWJvbCBzdHJpbmcgdGFibGUuICBUaGlzIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgYW4gb3V0cHV0IGZpbGUgd2l0aAotZnVsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnkgb3ZlciAzMCBwZXJjZW50LiAgVW5mb3J0dW5hdGVseSwgdGhlIFN1bk9TCi1AY29kZXtkYnh9IHByb2dyYW0gY2FuIG5vdCByZWFkIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSAoQGNvZGV7Z2RifSBoYXMgbm8KLXRyb3VibGUpLiAgVGhlIEBzYW1wey0tdHJhZGl0aW9uYWwtZm9ybWF0fSBzd2l0Y2ggdGVsbHMgQGNvZGV7bGR9IHRvIG5vdAotY29tYmluZSBkdXBsaWNhdGUgZW50cmllcy4KLQotQGtpbmRleCAtVGJzcyBAdmFye29yZ30KLUBraW5kZXggLVRkYXRhIEB2YXJ7b3JnfQotQGtpbmRleCAtVHRleHQgQHZhcntvcmd9Ci1AY2luZGV4IHNlZ21lbnQgb3JpZ2lucywgY21kIGxpbmUKLUBpdGVtIC1UYnNzIEB2YXJ7b3JnfQotQGl0ZW14IC1UZGF0YSBAdmFye29yZ30KLUBpdGVteCAtVHRleHQgQHZhcntvcmd9Ci1Vc2UgQHZhcntvcmd9IGFzIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvci0tLXJlc3BlY3RpdmVseS0tLXRoZQotQGNvZGV7YnNzfSwgQGNvZGV7ZGF0YX0sIG9yIHRoZSBAY29kZXt0ZXh0fSBzZWdtZW50IG9mIHRoZSBvdXRwdXQgZmlsZS4KLUB2YXJ7b3JnfSBtdXN0IGJlIGEgc2luZ2xlIGhleGFkZWNpbWFsIGludGVnZXI7Ci1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMsIHlvdSBtYXkgb21pdCB0aGUgbGVhZGluZwotQHNhbXB7MHh9IHVzdWFsbHkgYXNzb2NpYXRlZCB3aXRoIGhleGFkZWNpbWFsIHZhbHVlcy4KLQotQGtpbmRleCAtLXZlcmJvc2UKLUBjaW5kZXggdmVyYm9zZQotQGl0ZW0gLS1kbGwtdmVyYm9zZQotQGl0ZW14IC0tdmVyYm9zZQotRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle2xkfSBhbmQgbGlzdCB0aGUgbGlua2VyIGVtdWxhdGlvbnMKLXN1cHBvcnRlZC4gIERpc3BsYXkgd2hpY2ggaW5wdXQgZmlsZXMgY2FuIGFuZCBjYW5ub3QgYmUgb3BlbmVkLiAgRGlzcGxheQotdGhlIGxpbmtlciBzY3JpcHQgaWYgdXNpbmcgYSBkZWZhdWx0IGJ1aWx0aW4gc2NyaXB0LgotCi1Aa2luZGV4IC0tdmVyc2lvbi1zY3JpcHQ9QHZhcnt2ZXJzaW9uLXNjcmlwdGZpbGV9Ci1AY2luZGV4IHZlcnNpb24gc2NyaXB0LCBzeW1ib2wgdmVyc2lvbnMKLUBpdGVteCAtLXZlcnNpb24tc2NyaXB0PUB2YXJ7dmVyc2lvbi1zY3JpcHRmaWxlfQotU3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZlcnNpb24gc2NyaXB0IHRvIHRoZSBsaW5rZXIuICBUaGlzIGlzIHR5cGljYWxseQotdXNlZCB3aGVuIGNyZWF0aW5nIHNoYXJlZCBsaWJyYXJpZXMgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgdmVyc2lvbiBoZWlyYXJjaHkgZm9yIHRoZSBsaWJyYXJ5IGJlaW5nIGNyZWF0ZWQuICBUaGlzIG9wdGlvbgotaXMgb25seSBtZWFuaW5nZnVsIG9uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotQHhyZWZ7VkVSU0lPTn0uCi0KLUBraW5kZXggLS13YXJuLWNvbW9uCi1AY2luZGV4IHdhcm5pbmdzLCBvbiBjb21iaW5pbmcgc3ltYm9scwotQGNpbmRleCBjb21iaW5pbmcgc3ltYm9scywgd2FybmluZ3Mgb24KLUBpdGVtIC0td2Fybi1jb21tb24KLVdhcm4gd2hlbiBhIGNvbW1vbiBzeW1ib2wgaXMgY29tYmluZWQgd2l0aCBhbm90aGVyIGNvbW1vbiBzeW1ib2wgb3Igd2l0aAotYSBzeW1ib2wgZGVmaW5pdGlvbi4gIFVuaXggbGlua2VycyBhbGxvdyB0aGlzIHNvbWV3aGF0IHNsb3BweSBwcmFjdGljZSwKLWJ1dCBsaW5rZXJzIG9uIHNvbWUgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgZG8gbm90LiAgVGhpcyBvcHRpb24gYWxsb3dzCi15b3UgdG8gZmluZCBwb3RlbnRpYWwgcHJvYmxlbXMgZnJvbSBjb21iaW5pbmcgZ2xvYmFsIHN5bWJvbHMuCi1VbmZvcnR1bmF0ZWx5LCBzb21lIEMgbGlicmFyaWVzIHVzZSB0aGlzIHByYWN0aWNlLCBzbyB5b3UgbWF5IGdldCBzb21lCi13YXJuaW5ncyBhYm91dCBzeW1ib2xzIGluIHRoZSBsaWJyYXJpZXMgYXMgd2VsbCBhcyBpbiB5b3VyIHByb2dyYW1zLgotCi1UaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgZ2xvYmFsIHN5bWJvbHMsIGlsbHVzdHJhdGVkIGhlcmUgYnkgQyBleGFtcGxlczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBpbnQgaSA9IDE7Ci1BIGRlZmluaXRpb24sIHdoaWNoIGdvZXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBvZiB0aGUgb3V0cHV0Ci1maWxlLgotCi1AaXRlbSBleHRlcm4gaW50IGk7Ci1BbiB1bmRlZmluZWQgcmVmZXJlbmNlLCB3aGljaCBkb2VzIG5vdCBhbGxvY2F0ZSBzcGFjZS4KLVRoZXJlIG11c3QgYmUgZWl0aGVyIGEgZGVmaW5pdGlvbiBvciBhIGNvbW1vbiBzeW1ib2wgZm9yIHRoZQotdmFyaWFibGUgc29tZXdoZXJlLgotCi1AaXRlbSBpbnQgaTsKLUEgY29tbW9uIHN5bWJvbC4gIElmIHRoZXJlIGFyZSBvbmx5IChvbmUgb3IgbW9yZSkgY29tbW9uIHN5bWJvbHMgZm9yIGEKLXZhcmlhYmxlLCBpdCBnb2VzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBvZiB0aGUgb3V0cHV0IGZpbGUuCi1UaGUgbGlua2VyIG1lcmdlcyBtdWx0aXBsZSBjb21tb24gc3ltYm9scyBmb3IgdGhlIHNhbWUgdmFyaWFibGUgaW50byBhCi1zaW5nbGUgc3ltYm9sLiAgSWYgdGhleSBhcmUgb2YgZGlmZmVyZW50IHNpemVzLCBpdCBwaWNrcyB0aGUgbGFyZ2VzdAotc2l6ZS4gIFRoZSBsaW5rZXIgdHVybnMgYSBjb21tb24gc3ltYm9sIGludG8gYSBkZWNsYXJhdGlvbiwgaWYgdGhlcmUgaXMKLWEgZGVmaW5pdGlvbiBvZiB0aGUgc2FtZSB2YXJpYWJsZS4KLUBlbmQgdGFibGUKLQotVGhlIEBzYW1wey0td2Fybi1jb21tb259IG9wdGlvbiBjYW4gcHJvZHVjZSBmaXZlIGtpbmRzIG9mIHdhcm5pbmdzLgotRWFjaCB3YXJuaW5nIGNvbnNpc3RzIG9mIGEgcGFpciBvZiBsaW5lczogdGhlIGZpcnN0IGRlc2NyaWJlcyB0aGUgc3ltYm9sCi1qdXN0IGVuY291bnRlcmVkLCBhbmQgdGhlIHNlY29uZCBkZXNjcmliZXMgdGhlIHByZXZpb3VzIHN5bWJvbAotZW5jb3VudGVyZWQgd2l0aCB0aGUgc2FtZSBuYW1lLiAgT25lIG9yIGJvdGggb2YgdGhlIHR3byBzeW1ib2xzIHdpbGwgYmUKLWEgY29tbW9uIHN5bWJvbC4KLQotQGVudW1lcmF0ZQotQGl0ZW0KLVR1cm5pbmcgYSBjb21tb24gc3ltYm9sIGludG8gYSByZWZlcmVuY2UsIGJlY2F1c2UgdGhlcmUgaXMgYWxyZWFkeSBhCi1kZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkZGVuIGJ5IGRlZmluaXRpb24KLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGRlZmluZWQgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0KLVR1cm5pbmcgYSBjb21tb24gc3ltYm9sIGludG8gYSByZWZlcmVuY2UsIGJlY2F1c2UgYSBsYXRlciBkZWZpbml0aW9uIGZvcgotdGhlIHN5bWJvbCBpcyBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGNhc2UsCi1leGNlcHQgdGhhdCB0aGUgc3ltYm9scyBhcmUgZW5jb3VudGVyZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkaW5nIGNvbW1vbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIGlzIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1NZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgc2FtZS1zaXplZCBjb21tb24gc3ltYm9sLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogbXVsdGlwbGUgY29tbW9uCi0gICBvZiBgQHZhcntzeW1ib2x9JwotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1NZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgbGFyZ2VyIGNvbW1vbiBzeW1ib2wuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBjb21tb24gb2YgYEB2YXJ7c3ltYm9sfScKLSAgIG92ZXJyaWRkZW4gYnkgbGFyZ2VyIGNvbW1vbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogbGFyZ2VyIGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbQotTWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2l0aCBhIHByZXZpb3VzIHNtYWxsZXIgY29tbW9uIHN5bWJvbC4gIFRoaXMgaXMKLXRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBjYXNlLCBleGNlcHQgdGhhdCB0aGUgc3ltYm9scyBhcmUKLWVuY291bnRlcmVkIGluIGEgZGlmZmVyZW50IG9yZGVyLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBzbWFsbGVyIGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBlbnVtZXJhdGUKLQotQGtpbmRleCAtLXdhcm4tY29uc3RydWN0b3JzCi1AaXRlbSAtLXdhcm4tY29uc3RydWN0b3JzCi1XYXJuIGlmIGFueSBnbG9iYWwgY29uc3RydWN0b3JzIGFyZSB1c2VkLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgYSBmZXcKLW9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZm9ybWF0cyBsaWtlIENPRkYgb3IgRUxGLCB0aGUgbGlua2VyIGNhbiBub3QKLWRldGVjdCB0aGUgdXNlIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMuCi0KLUBraW5kZXggLS13YXJuLW11bHRpcGxlLWdwCi1AaXRlbSAtLXdhcm4tbXVsdGlwbGUtZ3AKLVdhcm4gaWYgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWVzIGFyZSByZXF1aXJlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi1UaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgY2VydGFpbiBwcm9jZXNzb3JzLCBzdWNoIGFzIHRoZSBBbHBoYS4KLVNwZWNpZmljYWxseSwgc29tZSBwcm9jZXNzb3JzIHB1dCBsYXJnZS12YWx1ZWQgY29uc3RhbnRzIGluIGEgc3BlY2lhbAotc2VjdGlvbi4gIEEgc3BlY2lhbCByZWdpc3RlciAodGhlIGdsb2JhbCBwb2ludGVyKSBwb2ludHMgaW50byB0aGUgbWlkZGxlCi1vZiB0aGlzIHNlY3Rpb24sIHNvIHRoYXQgY29uc3RhbnRzIGNhbiBiZSBsb2FkZWQgZWZmaWNpZW50bHkgdmlhIGEKLWJhc2UtcmVnaXN0ZXIgcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlLiAgU2luY2UgdGhlIG9mZnNldCBpbgotYmFzZS1yZWdpc3RlciByZWxhdGl2ZSBtb2RlIGlzIGZpeGVkIGFuZCByZWxhdGl2ZWx5IHNtYWxsIChlLmcuLCAxNgotYml0cyksIHRoaXMgbGltaXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbnN0YW50IHBvb2wuICBUaHVzLCBpbgotbGFyZ2UgcHJvZ3JhbXMsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byB1c2UgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIKLXZhbHVlcyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGFkZHJlc3MgYWxsIHBvc3NpYmxlIGNvbnN0YW50cy4gIFRoaXMKLW9wdGlvbiBjYXVzZXMgYSB3YXJuaW5nIHRvIGJlIGlzc3VlZCB3aGVuZXZlciB0aGlzIGNhc2Ugb2NjdXJzLgotCi1Aa2luZGV4IC0td2Fybi1vbmNlCi1AY2luZGV4IHdhcm5pbmdzLCBvbiB1bmRlZmluZWQgc3ltYm9scwotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9scywgd2FybmluZ3Mgb24KLUBpdGVtIC0td2Fybi1vbmNlCi1Pbmx5IHdhcm4gb25jZSBmb3IgZWFjaCB1bmRlZmluZWQgc3ltYm9sLCByYXRoZXIgdGhhbiBvbmNlIHBlciBtb2R1bGUKLXdoaWNoIHJlZmVycyB0byBpdC4KLQotQGtpbmRleCAtLXdhcm4tc2VjdGlvbi1hbGlnbgotQGNpbmRleCB3YXJuaW5ncywgb24gc2VjdGlvbiBhbGlnbm1lbnQKLUBjaW5kZXggc2VjdGlvbiBhbGlnbm1lbnQsIHdhcm5pbmdzIG9uCi1AaXRlbSAtLXdhcm4tc2VjdGlvbi1hbGlnbgotV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKLWFsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgotVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0Ci1pcywgaWYgdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGRvZXMgbm90IHNwZWNpZnkgYSBzdGFydCBhZGRyZXNzIGZvcgotdGhlIHNlY3Rpb24gKEBweHJlZntTRUNUSU9OU30pLgotCi1Aa2luZGV4IC0td2hvbGUtYXJjaGl2ZQotQGNpbmRleCBpbmNsdWRpbmcgYW4gZW50aXJlIGFyY2hpdmUKLUBpdGVtIC0td2hvbGUtYXJjaGl2ZQotRm9yIGVhY2ggYXJjaGl2ZSBtZW50aW9uZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlciB0aGUKLUBjb2Rley0td2hvbGUtYXJjaGl2ZX0gb3B0aW9uLCBpbmNsdWRlIGV2ZXJ5IG9iamVjdCBmaWxlIGluIHRoZSBhcmNoaXZlCi1pbiB0aGUgbGluaywgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRoZSBhcmNoaXZlIGZvciB0aGUgcmVxdWlyZWQgb2JqZWN0Ci1maWxlcy4gIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCB0byB0dXJuIGFuIGFyY2hpdmUgZmlsZSBpbnRvIGEgc2hhcmVkCi1saWJyYXJ5LCBmb3JjaW5nIGV2ZXJ5IG9iamVjdCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHNoYXJlZAotbGlicmFyeS4gIFRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlLgotCi1Aa2luZGV4IC0td3JhcAotQGl0ZW0gLS13cmFwIEB2YXJ7c3ltYm9sfQotVXNlIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgQHZhcntzeW1ib2x9LiAgQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLUB2YXJ7c3ltYm9sfSB3aWxsIGJlIHJlc29sdmVkIHRvIEBjb2Rle19fd3JhcF9AdmFye3N5bWJvbH19LiAgQW55Ci11bmRlZmluZWQgcmVmZXJlbmNlIHRvIEBjb2Rle19fcmVhbF9AdmFye3N5bWJvbH19IHdpbGwgYmUgcmVzb2x2ZWQgdG8KLUB2YXJ7c3ltYm9sfS4KLQotVGhpcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgd3JhcHBlciBmb3IgYSBzeXN0ZW0gZnVuY3Rpb24uICBUaGUKLXdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBAY29kZXtfX3dyYXBfQHZhcntzeW1ib2x9fS4gIElmIGl0Ci13aXNoZXMgdG8gY2FsbCB0aGUgc3lzdGVtIGZ1bmN0aW9uLCBpdCBzaG91bGQgY2FsbAotQGNvZGV7X19yZWFsX0B2YXJ7c3ltYm9sfX0uCi0KLUhlcmUgaXMgYSB0cml2aWFsIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLXZvaWQgKgotX193cmFwX21hbGxvYyAoaW50IGMpCi1AewotICBwcmludGYgKCJtYWxsb2MgY2FsbGVkIHdpdGggJWxkXG4iLCBjKTsKLSAgcmV0dXJuIF9fcmVhbF9tYWxsb2MgKGMpOwotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGlzIGZpbGUgdXNpbmcgQGNvZGV7LS13cmFwIG1hbGxvY30sIHRoZW4KLWFsbCBjYWxscyB0byBAY29kZXttYWxsb2N9IHdpbGwgY2FsbCB0aGUgZnVuY3Rpb24gQGNvZGV7X193cmFwX21hbGxvY30KLWluc3RlYWQuICBUaGUgY2FsbCB0byBAY29kZXtfX3JlYWxfbWFsbG9jfSBpbiBAY29kZXtfX3dyYXBfbWFsbG9jfSB3aWxsCi1jYWxsIHRoZSByZWFsIEBjb2Rle21hbGxvY30gZnVuY3Rpb24uCi0KLVlvdSBtYXkgd2lzaCB0byBwcm92aWRlIGEgQGNvZGV7X19yZWFsX21hbGxvY30gZnVuY3Rpb24gYXMgd2VsbCwgc28gdGhhdAotbGlua3Mgd2l0aG91dCB0aGUgQGNvZGV7LS13cmFwfSBvcHRpb24gd2lsbCBzdWNjZWVkLiAgSWYgeW91IGRvIHRoaXMsCi15b3Ugc2hvdWxkIG5vdCBwdXQgdGhlIGRlZmluaXRpb24gb2YgQGNvZGV7X19yZWFsX21hbGxvY30gaW4gdGhlIHNhbWUKLWZpbGUgYXMgQGNvZGV7X193cmFwX21hbGxvY307IGlmIHlvdSBkbywgdGhlIGFzc2VtYmxlciBtYXkgcmVzb2x2ZSB0aGUKLWNhbGwgYmVmb3JlIHRoZSBsaW5rZXIgaGFzIGEgY2hhbmNlIHRvIHdyYXAgaXQgdG8gQGNvZGV7bWFsbG9jfS4KLQotQGVuZCB0YWJsZQotCi1Ac3Vic2VjdGlvbiBPcHRpb25zIHNwZWNpZmljIHRvIGkzODYgUEUgdGFyZ2V0cwotCi1UaGUgaTM4NiBQRSBsaW5rZXIgc3VwcG9ydHMgdGhlIEBjb2Rley1zaGFyZWR9IG9wdGlvbiwgd2hpY2ggY2F1c2VzCi10aGUgb3V0cHV0IHRvIGJlIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKERMTCkgaW5zdGVhZCBvZiBhCi1ub3JtYWwgZXhlY3V0YWJsZS4gIFlvdSBzaG91bGQgbmFtZSB0aGUgb3V0cHV0IEBjb2RleyouZGxsfSB3aGVuIHlvdQotdXNlIHRoaXMgb3B0aW9uLiAgSW4gYWRkaXRpb24sIHRoZSBsaW5rZXIgZnVsbHkgc3VwcG9ydHMgdGhlIHN0YW5kYXJkCi1AY29kZXsqLmRlZn0gZmlsZXMsIHdoaWNoIG1heSBiZSBzcGVjaWZpZWQgb24gdGhlIGxpbmtlciBjb21tYW5kIGxpbmUKLWxpa2UgYW4gb2JqZWN0IGZpbGUgKGluIGZhY3QsIGl0IHNob3VsZCBwcmVjZWRlIGFyY2hpdmVzIGl0IGV4cG9ydHMKLXN5bWJvbHMgZnJvbSwgdG8gZW5zdXJlIHRoYXQgdGhleSBnZXQgbGlua2VkIGluLCBqdXN0IGxpa2UgYSBub3JtYWwKLW9iamVjdCBmaWxlKS4KLQotSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgY29tbW9uIHRvIGFsbCB0YXJnZXRzLCB0aGUgaTM4NiBQRSBsaW5rZXIKLXN1cHBvcnQgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgaTM4NgotUEUgdGFyZ2V0LiAgT3B0aW9ucyB0aGF0IHRha2UgdmFsdWVzIG1heSBiZSBzZXBhcmF0ZWQgZnJvbSB0aGVpcgotdmFsdWVzIGJ5IGVpdGhlciBhIHNwYWNlIG9yIGFuIGVxdWFscyBzaWduLgotCi1AdGFibGUgQGNvZGUKLQotQGtpbmRleCAtLWFkZC1zdGRjYWxsLWFsaWFzCi1AaXRlbSAtLWFkZC1zdGRjYWxsLWFsaWFzCi1JZiBnaXZlbiwgc3ltYm9scyB3aXRoIGEgc3RkY2FsbCBzdWZmaXggKEBAQHZhcntubn0pIHdpbGwgYmUgZXhwb3J0ZWQKLWFzLWlzIGFuZCBhbHNvIHdpdGggdGhlIHN1ZmZpeCBzdHJpcHBlZC4KLQotQGtpbmRleCAtLWJhc2UtZmlsZQotQGl0ZW0gLS1iYXNlLWZpbGUgQHZhcntmaWxlfQotVXNlIEB2YXJ7ZmlsZX0gYXMgdGhlIG5hbWUgb2YgYSBmaWxlIGluIHdoaWNoIHRvIHNhdmUgdGhlIGJhc2UKLWFkZHJlc3NlcyBvZiBhbGwgdGhlIHJlbG9jYXRpb25zIG5lZWRlZCBmb3IgZ2VuZXJhdGluZyBETExzIHdpdGgKLUBmaWxle2RsbHRvb2x9LgotCi1Aa2luZGV4IC0tZGxsCi1AaXRlbSAtLWRsbAotQ3JlYXRlIGEgRExMIGluc3RlYWQgb2YgYSByZWd1bGFyIGV4ZWN1dGFibGUuICBZb3UgbWF5IGFsc28gdXNlCi1AY29kZXstc2hhcmVkfSBvciBzcGVjaWZ5IGEgQGNvZGV7TElCUkFSWX0gaW4gYSBnaXZlbiBAY29kZXsuZGVmfQotZmlsZS4KLQotQGtpbmRleCAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwCi1Aa2luZGV4IC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwCi1AaXRlbSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwCi1AaXRlbXggLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAKLUlmIHRoZSBsaW5rIGZpbmRzIGEgc3ltYm9sIHRoYXQgaXQgY2Fubm90IHJlc29sdmUsIGl0IHdpbGwgYXR0ZW1wdCB0bwotZG8gImZ1enp5IGxpbmtpbmciIGJ5IGxvb2tpbmcgZm9yIGFub3RoZXIgZGVmaW5lZCBzeW1ib2wgdGhhdCBkaWZmZXJzCi1vbmx5IGluIHRoZSBmb3JtYXQgb2YgdGhlIHN5bWJvbCBuYW1lIChjZGVjbCB2cyBzdGRjYWxsKSBhbmQgd2lsbAotcmVzb2x2ZSB0aGF0IHN5bWJvbCBieSBsaW5raW5nIHRvIHRoZSBtYXRjaC4gIEZvciBleGFtcGxlLCB0aGUKLXVuZGVmaW5lZCBzeW1ib2wgQGNvZGV7X2Zvb30gbWlnaHQgYmUgbGlua2VkIHRvIHRoZSBmdW5jdGlvbgotQGNvZGV7X2Zvb0BAMTJ9LCBvciB0aGUgdW5kZWZpbmVkIHN5bWJvbCBAY29kZXtfYmFyQEAxNn0gbWlnaHQgYmUgbGlua2VkCi10byB0aGUgZnVuY3Rpb24gQGNvZGV7X2Jhcn0uICBXaGVuIHRoZSBsaW5rZXIgZG9lcyB0aGlzLCBpdCBwcmludHMgYQotd2FybmluZywgc2luY2UgaXQgbm9ybWFsbHkgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGxpbmssIGJ1dCBzb21ldGltZXMKLWltcG9ydCBsaWJyYXJpZXMgZ2VuZXJhdGVkIGZyb20gdGhpcmQtcGFydHkgZGxscyBtYXkgbmVlZCB0aGlzIGZlYXR1cmUKLXRvIGJlIHVzYWJsZS4gIElmIHlvdSBzcGVjaWZ5IEBjb2Rley0tZW5hYmxlLXN0ZGNhbGwtZml4dXB9LCB0aGlzCi1mZWF0dXJlIGlzIGZ1bGx5IGVuYWJsZWQgYW5kIHdhcm5pbmdzIGFyZSBub3QgcHJpbnRlZC4gIElmIHlvdSBzcGVjaWZ5Ci1AY29kZXstLWRpc2FibGUtc3RkY2FsbC1maXh1cH0sIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBhbmQgc3VjaAotbWlzbWF0Y2hlcyBhcmUgY29uc2lkZXJlZCB0byBiZSBlcnJvcnMuCi0KLUBjaW5kZXggRExMcywgY3JlYXRpbmcKLUBraW5kZXggLS1leHBvcnQtYWxsLXN5bWJvbHMKLUBpdGVtIC0tZXhwb3J0LWFsbC1zeW1ib2xzCi1JZiBnaXZlbiwgYWxsIGdsb2JhbCBzeW1ib2xzIGluIHRoZSBvYmplY3RzIHVzZWQgdG8gYnVpbGQgYSBETEwgd2lsbAotYmUgZXhwb3J0ZWQgYnkgdGhlIERMTC4gIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIHRoZXJlCi1vdGhlcndpc2Ugd291bGRuJ3QgYmUgYW55IGV4cG9ydGVkIHN5bWJvbHMuICBXaGVuIHN5bWJvbHMgYXJlCi1leHBsaWNpdGx5IGV4cG9ydGVkIHZpYSBERUYgZmlsZXMgb3IgaW1wbGljaXRseSBleHBvcnRlZCB2aWEgZnVuY3Rpb24KLWF0dHJpYnV0ZXMsIHRoZSBkZWZhdWx0IGlzIHRvIG5vdCBleHBvcnQgYW55dGhpbmcgZWxzZSB1bmxlc3MgdGhpcwotb3B0aW9uIGlzIGdpdmVuLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2xzIEBjb2Rle0RsbE1haW5AQDEyfSwKLUBjb2Rle0RsbEVudHJ5UG9pbnRAQDB9LCBhbmQgQGNvZGV7aW1wdXJlX3B0cn0gd2lsbCBub3QgYmUgYXV0b21hdGljYWxseQotZXhwb3J0ZWQuCi0KLUBraW5kZXggLS1leGNsdWRlLXN5bWJvbHMKLUBpdGVtIC0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7c3ltYm9sLHN5bWJvbCwuLi59Ci1TcGVjaWZpZXMgYSBsaXN0IG9mIHN5bWJvbHMgd2hpY2ggc2hvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5Ci1leHBvcnRlZC4gIFRoZSBzeW1ib2wgbmFtZXMgbWF5IGJlIGRlbGltaXRlZCBieSBjb21tYXMgb3IgY29sb25zLgotCi1Aa2luZGV4IC0tZmlsZS1hbGlnbm1lbnQKLUBpdGVtIC0tZmlsZS1hbGlnbm1lbnQKLVNwZWNpZnkgdGhlIGZpbGUgYWxpZ25tZW50LiAgU2VjdGlvbnMgaW4gdGhlIGZpbGUgd2lsbCBhbHdheXMgYmVnaW4gYXQKLWZpbGUgb2Zmc2V0cyB3aGljaCBhcmUgbXVsdGlwbGVzIG9mIHRoaXMgbnVtYmVyLiAgVGhpcyBkZWZhdWx0cyB0bwotNTEyLgotCi1AY2luZGV4IGhlYXAgc2l6ZQotQGtpbmRleCAtLWhlYXAKLUBpdGVtIC0taGVhcCBAdmFye3Jlc2VydmV9Ci1AaXRlbXggLS1oZWFwIEB2YXJ7cmVzZXJ2ZX0sQHZhcntjb21taXR9Ci1TcGVjaWZ5IHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlc2VydmUgKGFuZCBvcHRpb25hbGx5IGNvbW1pdCkgdG8gYmUKLXVzZWQgYXMgaGVhcCBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIGRlZmF1bHQgaXMgMU1iIHJlc2VydmVkLCA0SwotY29tbWl0dGVkLgotCi1AY2luZGV4IGltYWdlIGJhc2UKLUBraW5kZXggLS1pbWFnZS1iYXNlCi1AaXRlbSAtLWltYWdlLWJhc2UgQHZhcnt2YWx1ZX0KLVVzZSBAdmFye3ZhbHVlfSBhcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHlvdXIgcHJvZ3JhbSBvciBkbGwuICBUaGlzIGlzCi10aGUgbG93ZXN0IG1lbW9yeSBsb2NhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdXIgcHJvZ3JhbSBvciBkbGwKLWlzIGxvYWRlZC4gIFRvIHJlZHVjZSB0aGUgbmVlZCB0byByZWxvY2F0ZSBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZSBvZgoteW91ciBkbGxzLCBlYWNoIHNob3VsZCBoYXZlIGEgdW5pcXVlIGJhc2UgYWRkcmVzcyBhbmQgbm90IG92ZXJsYXAgYW55Ci1vdGhlciBkbGxzLiAgVGhlIGRlZmF1bHQgaXMgMHg0MDAwMDAgZm9yIGV4ZWN1dGFibGVzLCBhbmQgMHgxMDAwMDAwMAotZm9yIGRsbHMuCi0KLUBraW5kZXggLS1raWxsLWF0Ci1AaXRlbSAtLWtpbGwtYXQKLUlmIGdpdmVuLCB0aGUgc3RkY2FsbCBzdWZmaXhlcyAoQEBAdmFye25ufSkgd2lsbCBiZSBzdHJpcHBlZCBmcm9tCi1zeW1ib2xzIGJlZm9yZSB0aGV5IGFyZSBleHBvcnRlZC4KLQotQGtpbmRleCAtLW1ham9yLWltYWdlLXZlcnNpb24KLUBpdGVtIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAiaW1hZ2UgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAxLgotCi1Aa2luZGV4IC0tbWFqb3Itb3MtdmVyc2lvbgotQGl0ZW0gLS1tYWpvci1vcy12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtYWpvciBudW1iZXIgb2YgdGhlICJvcyB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDQuCi0KLUBraW5kZXggLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbgotQGl0ZW0gLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAic3Vic3lzdGVtIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gNC4KLQotQGtpbmRleCAtLW1pbm9yLWltYWdlLXZlcnNpb24KLUBpdGVtIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAiaW1hZ2UgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAwLgotCi1Aa2luZGV4IC0tbWlub3Itb3MtdmVyc2lvbgotQGl0ZW0gLS1taW5vci1vcy12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtaW5vciBudW1iZXIgb2YgdGhlICJvcyB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDAuCi0KLUBraW5kZXggLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbgotQGl0ZW0gLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAic3Vic3lzdGVtIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMC4KLQotQGNpbmRleCBERUYgZmlsZXMsIGNyZWF0aW5nCi1AY2luZGV4IERMTHMsIGNyZWF0aW5nCi1Aa2luZGV4IC0tb3V0cHV0LWRlZgotQGl0ZW0gLS1vdXRwdXQtZGVmIEB2YXJ7ZmlsZX0KLVRoZSBsaW5rZXIgd2lsbCBjcmVhdGUgdGhlIGZpbGUgQHZhcntmaWxlfSB3aGljaCB3aWxsIGNvbnRhaW4gYSBERUYKLWZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgRExMIHRoZSBsaW5rZXIgaXMgZ2VuZXJhdGluZy4gIFRoaXMgREVGIGZpbGUKLSh3aGljaCBzaG91bGQgYmUgY2FsbGVkIEBjb2RleyouZGVmfSkgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGFuIGltcG9ydAotbGlicmFyeSB3aXRoIEBjb2Rle2RsbHRvb2x9IG9yIG1heSBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvCi1hdXRvbWF0aWNhbGx5IG9yIGltcGxpY2l0bHkgZXhwb3J0ZWQgc3ltYm9scy4KLQotQGtpbmRleCAtLXNlY3Rpb24tYWxpZ25tZW50Ci1AaXRlbSAtLXNlY3Rpb24tYWxpZ25tZW50Ci1TZXRzIHRoZSBzZWN0aW9uIGFsaWdubWVudC4gIFNlY3Rpb25zIGluIG1lbW9yeSB3aWxsIGFsd2F5cyBiZWdpbiBhdAotYWRkcmVzc2VzIHdoaWNoIGFyZSBhIG11bHRpcGxlIG9mIHRoaXMgbnVtYmVyLiAgRGVmYXVsdHMgdG8gMHgxMDAwLgotCi1AY2luZGV4IHN0YWNrIHNpemUKLUBraW5kZXggLS1zdGFjawotQGl0ZW0gLS1zdGFjayBAdmFye3Jlc2VydmV9Ci1AaXRlbXggLS1zdGFjayBAdmFye3Jlc2VydmV9LEB2YXJ7Y29tbWl0fQotU3BlY2lmeSB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlIChhbmQgb3B0aW9uYWxseSBjb21taXQpIHRvIGJlCi11c2VkIGFzIHN0YWNrIGZvciB0aGlzIHByb2dyYW0uICBUaGUgZGVmYXVsdCBpcyAzMk1iIHJlc2VydmVkLCA0SwotY29tbWl0dGVkLgotCi1Aa2luZGV4IC0tc3Vic3lzdGVtCi1AaXRlbSAtLXN1YnN5c3RlbSBAdmFye3doaWNofQotQGl0ZW14IC0tc3Vic3lzdGVtIEB2YXJ7d2hpY2h9OkB2YXJ7bWFqb3J9Ci1AaXRlbXggLS1zdWJzeXN0ZW0gQHZhcnt3aGljaH06QHZhcnttYWpvcn0uQHZhcnttaW5vcn0KLVNwZWNpZmllcyB0aGUgc3Vic3lzdGVtIHVuZGVyIHdoaWNoIHlvdXIgcHJvZ3JhbSB3aWxsIGV4ZWN1dGUuICBUaGUKLWxlZ2FsIHZhbHVlcyBmb3IgQHZhcnt3aGljaH0gYXJlIEBjb2Rle25hdGl2ZX0sIEBjb2Rle3dpbmRvd3N9LAotQGNvZGV7Y29uc29sZX0sIGFuZCBAY29kZXtwb3NpeH0uICBZb3UgbWF5IG9wdGlvbmFsbHkgc2V0IHRoZQotc3Vic3lzdGVtIHZlcnNpb24gYWxzby4KLQotQGVuZCB0YWJsZQotCi1AaWZzZXQgVXNlc0VudlZhcnMKLUBub2RlIEVudmlyb25tZW50Ci1Ac2VjdGlvbiBFbnZpcm9ubWVudCBWYXJpYWJsZXMKLQotWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIEBjb2Rle2xkfSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLUBjb2Rle0dOVVRBUkdFVH0sIEBjb2Rle0xERU1VTEFUSU9OfSwgYW5kIEBjb2Rle0NPTExFQ1RfTk9fREVNQU5HTEV9LgotCi1Aa2luZGV4IEdOVVRBUkdFVAotQGNpbmRleCBkZWZhdWx0IGlucHV0IGZvcm1hdAotQGNvZGV7R05VVEFSR0VUfSBkZXRlcm1pbmVzIHRoZSBpbnB1dC1maWxlIG9iamVjdCBmb3JtYXQgaWYgeW91IGRvbid0Ci11c2UgQHNhbXB7LWJ9IChvciBpdHMgc3lub255bSBAc2FtcHstLWZvcm1hdH0pLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKLW9mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdCAoQHB4cmVme0JGRH0pLiAgSWYgdGhlcmUgaXMgbm8KLUBjb2Rle0dOVVRBUkdFVH0gaW4gdGhlIGVudmlyb25tZW50LCBAY29kZXtsZH0gdXNlcyB0aGUgbmF0dXJhbCBmb3JtYXQKLW9mIHRoZSB0YXJnZXQuIElmIEBjb2Rle0dOVVRBUkdFVH0gaXMgc2V0IHRvIEBjb2Rle2RlZmF1bHR9IHRoZW4gQkZECi1hdHRlbXB0cyB0byBkaXNjb3ZlciB0aGUgaW5wdXQgZm9ybWF0IGJ5IGV4YW1pbmluZyBiaW5hcnkgaW5wdXQgZmlsZXM7Ci10aGlzIG1ldGhvZCBvZnRlbiBzdWNjZWVkcywgYnV0IHRoZXJlIGFyZSBwb3RlbnRpYWwgYW1iaWd1aXRpZXMsIHNpbmNlCi10aGVyZSBpcyBubyBtZXRob2Qgb2YgZW5zdXJpbmcgdGhhdCB0aGUgbWFnaWMgbnVtYmVyIHVzZWQgdG8gc3BlY2lmeQotb2JqZWN0LWZpbGUgZm9ybWF0cyBpcyB1bmlxdWUuICBIb3dldmVyLCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZWR1cmUgZm9yCi1CRkQgb24gZWFjaCBzeXN0ZW0gcGxhY2VzIHRoZSBjb252ZW50aW9uYWwgZm9ybWF0IGZvciB0aGF0IHN5c3RlbSBmaXJzdAotaW4gdGhlIHNlYXJjaC1saXN0LCBzbyBhbWJpZ3VpdGllcyBhcmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY29udmVudGlvbi4KLQotQGtpbmRleCBMREVNVUxBVElPTgotQGNpbmRleCBkZWZhdWx0IGVtdWxhdGlvbgotQGNpbmRleCBlbXVsYXRpb24sIGRlZmF1bHQKLUBjb2Rle0xERU1VTEFUSU9OfSBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZQotQHNhbXB7LW19IG9wdGlvbi4gIFRoZSBlbXVsYXRpb24gY2FuIGFmZmVjdCB2YXJpb3VzIGFzcGVjdHMgb2YgbGlua2VyCi1iZWhhdmlvdXIsIHBhcnRpY3VsYXJseSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgWW91IGNhbiBsaXN0IHRoZQotYXZhaWxhYmxlIGVtdWxhdGlvbnMgd2l0aCB0aGUgQHNhbXB7LS12ZXJib3NlfSBvciBAc2FtcHstVn0gb3B0aW9ucy4gIElmCi10aGUgQHNhbXB7LW19IG9wdGlvbiBpcyBub3QgdXNlZCwgYW5kIHRoZSBAY29kZXtMREVNVUxBVElPTn0gZW52aXJvbm1lbnQKLXZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLCB0aGUgZGVmYXVsdCBlbXVsYXRpb24gZGVwZW5kcyB1cG9uIGhvdyB0aGUKLWxpbmtlciB3YXMgY29uZmlndXJlZC4KLUBlbmQgaWZzZXQKLQotQGtpbmRleCBDT0xMRUNUX05PX0RFTUFOR0xFCi1AY2luZGV4IGRlbWFuZ2xpbmcsIGRlZmF1bHQKLU5vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgZGVmYXVsdCB0byBkZW1hbmdsaW5nIHN5bWJvbHMuICBIb3dldmVyLCBpZgotQGNvZGV7Q09MTEVDVF9OT19ERU1BTkdMRX0gaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgdGhlbiBpdCB3aWxsCi1kZWZhdWx0IHRvIG5vdCBkZW1hbmdsaW5nIHN5bWJvbHMuICBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQgaW4KLWEgc2ltaWxhciBmYXNoaW9uIGJ5IHRoZSBAY29kZXtnY2N9IGxpbmtlciB3cmFwcGVyIHByb2dyYW0uICBUaGUgZGVmYXVsdAotbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIEBzYW1wey0tZGVtYW5nbGV9IGFuZCBAc2FtcHstLW5vLWRlbWFuZ2xlfQotb3B0aW9ucy4KLQotQG5vZGUgU2NyaXB0cwotQGNoYXB0ZXIgTGlua2VyIFNjcmlwdHMKLQotQGNpbmRleCBzY3JpcHRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHRzCi1AY2luZGV4IGNvbW1hbmQgZmlsZXMKLUV2ZXJ5IGxpbmsgaXMgY29udHJvbGxlZCBieSBhIEBkZm57bGlua2VyIHNjcmlwdH0uICBUaGlzIHNjcmlwdCBpcwotd3JpdHRlbiBpbiB0aGUgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UuCi0KLVRoZSBtYWluIHB1cnBvc2Ugb2YgdGhlIGxpbmtlciBzY3JpcHQgaXMgdG8gZGVzY3JpYmUgaG93IHRoZSBzZWN0aW9ucyBpbgotdGhlIGlucHV0IGZpbGVzIHNob3VsZCBiZSBtYXBwZWQgaW50byB0aGUgb3V0cHV0IGZpbGUsIGFuZCB0byBjb250cm9sCi10aGUgbWVtb3J5IGxheW91dCBvZiB0aGUgb3V0cHV0IGZpbGUuICBNb3N0IGxpbmtlciBzY3JpcHRzIGRvIG5vdGhpbmcKLW1vcmUgdGhhbiB0aGlzLiAgSG93ZXZlciwgd2hlbiBuZWNlc3NhcnksIHRoZSBsaW5rZXIgc2NyaXB0IGNhbiBhbHNvCi1kaXJlY3QgdGhlIGxpbmtlciB0byBwZXJmb3JtIG1hbnkgb3RoZXIgb3BlcmF0aW9ucywgdXNpbmcgdGhlIGNvbW1hbmRzCi1kZXNjcmliZWQgYmVsb3cuCi0KLVRoZSBsaW5rZXIgYWx3YXlzIHVzZXMgYSBsaW5rZXIgc2NyaXB0LiAgSWYgeW91IGRvIG5vdCBzdXBwbHkgb25lCi15b3Vyc2VsZiwgdGhlIGxpbmtlciB3aWxsIHVzZSBhIGRlZmF1bHQgc2NyaXB0IHRoYXQgaXMgY29tcGlsZWQgaW50byB0aGUKLWxpbmtlciBleGVjdXRhYmxlLiAgWW91IGNhbiB1c2UgdGhlIEBzYW1wey0tdmVyYm9zZX0gY29tbWFuZCBsaW5lIG9wdGlvbgotdG8gZGlzcGxheSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQ2VydGFpbiBjb21tYW5kIGxpbmUgb3B0aW9ucywKLXN1Y2ggYXMgQHNhbXB7LXJ9IG9yIEBzYW1wey1OfSwgd2lsbCBhZmZlY3QgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4KLQotWW91IG1heSBzdXBwbHkgeW91ciBvd24gbGlua2VyIHNjcmlwdCBieSB1c2luZyB0aGUgQHNhbXB7LVR9IGNvbW1hbmQKLWxpbmUgb3B0aW9uLiAgV2hlbiB5b3UgZG8gdGhpcywgeW91ciBsaW5rZXIgc2NyaXB0IHdpbGwgcmVwbGFjZSB0aGUKLWRlZmF1bHQgbGlua2VyIHNjcmlwdC4KLQotWW91IG1heSBhbHNvIHVzZSBsaW5rZXIgc2NyaXB0cyBpbXBsaWNpdGx5IGJ5IG5hbWluZyB0aGVtIGFzIGlucHV0IGZpbGVzCi10byB0aGUgbGlua2VyLCBhcyB0aG91Z2ggdGhleSB3ZXJlIGZpbGVzIHRvIGJlIGxpbmtlZC4gIEB4cmVme0ltcGxpY2l0Ci1MaW5rZXIgU2NyaXB0c30uCi0KLUBtZW51Ci0qIEJhc2ljIFNjcmlwdCBDb25jZXB0czo6CUJhc2ljIExpbmtlciBTY3JpcHQgQ29uY2VwdHMKLSogU2NyaXB0IEZvcm1hdDo6CQlMaW5rZXIgU2NyaXB0IEZvcm1hdAotKiBTaW1wbGUgRXhhbXBsZTo6CQlTaW1wbGUgTGlua2VyIFNjcmlwdCBFeGFtcGxlCi0qIFNpbXBsZSBDb21tYW5kczo6CQlTaW1wbGUgTGlua2VyIFNjcmlwdCBDb21tYW5kcwotKiBBc3NpZ25tZW50czo6CQkJQXNzaWduaW5nIFZhbHVlcyB0byBTeW1ib2xzCi0qIFNFQ1RJT05TOjoJCQlTRUNUSU9OUyBDb21tYW5kCi0qIE1FTU9SWTo6CQkJTUVNT1JZIENvbW1hbmQKLSogUEhEUlM6OgkJCVBIRFJTIENvbW1hbmQKLSogVkVSU0lPTjo6CQkJVkVSU0lPTiBDb21tYW5kCi0qIEV4cHJlc3Npb25zOjoJCQlFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cwotKiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0czo6CUltcGxpY2l0IExpbmtlciBTY3JpcHRzCi1AZW5kIG1lbnUKLQotQG5vZGUgQmFzaWMgU2NyaXB0IENvbmNlcHRzCi1Ac2VjdGlvbiBCYXNpYyBMaW5rZXIgU2NyaXB0IENvbmNlcHRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgY29uY2VwdHMKLVdlIG5lZWQgdG8gZGVmaW5lIHNvbWUgYmFzaWMgY29uY2VwdHMgYW5kIHZvY2FidWxhcnkgaW4gb3JkZXIgdG8KLWRlc2NyaWJlIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi1UaGUgbGlua2VyIGNvbWJpbmVzIGlucHV0IGZpbGVzIGludG8gYSBzaW5nbGUgb3V0cHV0IGZpbGUuICBUaGUgb3V0cHV0Ci1maWxlIGFuZCBlYWNoIGlucHV0IGZpbGUgYXJlIGluIGEgc3BlY2lhbCBkYXRhIGZvcm1hdCBrbm93biBhcyBhbgotQGRmbntvYmplY3QgZmlsZSBmb3JtYXR9LiAgRWFjaCBmaWxlIGlzIGNhbGxlZCBhbiBAZGZue29iamVjdCBmaWxlfS4KLVRoZSBvdXRwdXQgZmlsZSBpcyBvZnRlbiBjYWxsZWQgYW4gQGRmbntleGVjdXRhYmxlfSwgYnV0IGZvciBvdXIKLXB1cnBvc2VzIHdlIHdpbGwgYWxzbyBjYWxsIGl0IGFuIG9iamVjdCBmaWxlLiAgRWFjaCBvYmplY3QgZmlsZSBoYXMsCi1hbW9uZyBvdGhlciB0aGluZ3MsIGEgbGlzdCBvZiBAZGZue3NlY3Rpb25zfS4gIFdlIHNvbWV0aW1lcyByZWZlciB0byBhCi1zZWN0aW9uIGluIGFuIGlucHV0IGZpbGUgYXMgYW4gQGRmbntpbnB1dCBzZWN0aW9ufTsgc2ltaWxhcmx5LCBhIHNlY3Rpb24KLWluIHRoZSBvdXRwdXQgZmlsZSBpcyBhbiBAZGZue291dHB1dCBzZWN0aW9ufS4KLQotRWFjaCBzZWN0aW9uIGluIGFuIG9iamVjdCBmaWxlIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMKLWFsc28gaGF2ZSBhbiBhc3NvY2lhdGVkIGJsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBAZGZue3NlY3Rpb24KLWNvbnRlbnRzfS4gIEEgc2VjdGlvbiBtYXkgYmUgbWFya2VkIGFzIEBkZm57bG9hZGFibGV9LCB3aGljaCBtZWFuIHRoYXQKLXRoZSBjb250ZW50cyBzaG91bGQgYmUgbG9hZGVkIGludG8gbWVtb3J5IHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIHJ1bi4KLUEgc2VjdGlvbiB3aXRoIG5vIGNvbnRlbnRzIG1heSBiZSBAZGZue2FsbG9jYXRhYmxlfSwgd2hpY2ggbWVhbnMgdGhhdCBhbgotYXJlYSBpbiBtZW1vcnkgc2hvdWxkIGJlIHNldCBhc2lkZSwgYnV0IG5vdGhpbmcgaW4gcGFydGljdWxhciBzaG91bGQgYmUKLWxvYWRlZCB0aGVyZSAoaW4gc29tZSBjYXNlcyB0aGlzIG1lbW9yeSBtdXN0IGJlIHplcm9lZCBvdXQpLiAgQSBzZWN0aW9uCi13aGljaCBpcyBuZWl0aGVyIGxvYWRhYmxlIG5vciBhbGxvY2F0YWJsZSB0eXBpY2FsbHkgY29udGFpbnMgc29tZSBzb3J0Ci1vZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLUV2ZXJ5IGxvYWRhYmxlIG9yIGFsbG9jYXRhYmxlIG91dHB1dCBzZWN0aW9uIGhhcyB0d28gYWRkcmVzc2VzLiAgVGhlCi1maXJzdCBpcyB0aGUgQGRmbntWTUF9LCBvciB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzLiAgVGhpcyBpcyB0aGUgYWRkcmVzcwotdGhlIHNlY3Rpb24gd2lsbCBoYXZlIHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIHJ1bi4gIFRoZSBzZWNvbmQgaXMgdGhlCi1AZGZue0xNQX0sIG9yIGxvYWQgbWVtb3J5IGFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoZQotc2VjdGlvbiB3aWxsIGJlIGxvYWRlZC4gIEluIG1vc3QgY2FzZXMgdGhlIHR3byBhZGRyZXNzZXMgd2lsbCBiZSB0aGUKLXNhbWUuICBBbiBleGFtcGxlIG9mIHdoZW4gdGhleSBtaWdodCBiZSBkaWZmZXJlbnQgaXMgd2hlbiBhIGRhdGEgc2VjdGlvbgotaXMgbG9hZGVkIGludG8gUk9NLCBhbmQgdGhlbiBjb3BpZWQgaW50byBSQU0gd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMgdXAKLSh0aGlzIHRlY2huaXF1ZSBpcyBvZnRlbiB1c2VkIHRvIGluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcyBpbiBhIFJPTQotYmFzZWQgc3lzdGVtKS4gIEluIHRoaXMgY2FzZSB0aGUgUk9NIGFkZHJlc3Mgd291bGQgYmUgdGhlIExNQSwgYW5kIHRoZQotUkFNIGFkZHJlc3Mgd291bGQgYmUgdGhlIFZNQS4KLQotWW91IGNhbiBzZWUgdGhlIHNlY3Rpb25zIGluIGFuIG9iamVjdCBmaWxlIGJ5IHVzaW5nIHRoZSBAY29kZXtvYmpkdW1wfQotcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstaH0gb3B0aW9uLgotCi1FdmVyeSBvYmplY3QgZmlsZSBhbHNvIGhhcyBhIGxpc3Qgb2YgQGRmbntzeW1ib2xzfSwga25vd24gYXMgdGhlCi1AZGZue3N5bWJvbCB0YWJsZX0uICBBIHN5bWJvbCBtYXkgYmUgZGVmaW5lZCBvciB1bmRlZmluZWQuICBFYWNoIHN5bWJvbAotaGFzIGEgbmFtZSwgYW5kIGVhY2ggZGVmaW5lZCBzeW1ib2wgaGFzIGFuIGFkZHJlc3MsIGFtb25nIG90aGVyCi1pbmZvcm1hdGlvbi4gIElmIHlvdSBjb21waWxlIGEgQyBvciBDKysgcHJvZ3JhbSBpbnRvIGFuIG9iamVjdCBmaWxlLCB5b3UKLXdpbGwgZ2V0IGEgZGVmaW5lZCBzeW1ib2wgZm9yIGV2ZXJ5IGRlZmluZWQgZnVuY3Rpb24gYW5kIGdsb2JhbCBvcgotc3RhdGljIHZhcmlhYmxlLiAgRXZlcnkgdW5kZWZpbmVkIGZ1bmN0aW9uIG9yIGdsb2JhbCB2YXJpYWJsZSB3aGljaCBpcwotcmVmZXJlbmNlZCBpbiB0aGUgaW5wdXQgZmlsZSB3aWxsIGJlY29tZSBhbiB1bmRlZmluZWQgc3ltYm9sLgotCi1Zb3UgY2FuIHNlZSB0aGUgc3ltYm9scyBpbiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7bm19Ci1wcm9ncmFtLCBvciBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstdH0KLW9wdGlvbi4KLQotQG5vZGUgU2NyaXB0IEZvcm1hdAotQHNlY3Rpb24gTGlua2VyIFNjcmlwdCBGb3JtYXQKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBmb3JtYXQKLUxpbmtlciBzY3JpcHRzIGFyZSB0ZXh0IGZpbGVzLgotCi1Zb3Ugd3JpdGUgYSBsaW5rZXIgc2NyaXB0IGFzIGEgc2VyaWVzIG9mIGNvbW1hbmRzLiAgRWFjaCBjb21tYW5kIGlzCi1laXRoZXIgYSBrZXl3b3JkLCBwb3NzaWJseSBmb2xsb3dlZCBieSBhcmd1bWVudHMsIG9yIGFuIGFzc2lnbm1lbnQgdG8gYQotc3ltYm9sLiAgWW91IG1heSBzZXBhcmF0ZSBjb21tYW5kcyB1c2luZyBzZW1pY29sb25zLiAgV2hpdGVzcGFjZSBpcwotZ2VuZXJhbGx5IGlnbm9yZWQuCi0KLVN0cmluZ3Mgc3VjaCBhcyBmaWxlIG9yIGZvcm1hdCBuYW1lcyBjYW4gbm9ybWFsbHkgYmUgZW50ZXJlZCBkaXJlY3RseS4KLUlmIHRoZSBmaWxlIG5hbWUgY29udGFpbnMgYSBjaGFyYWN0ZXIgc3VjaCBhcyBhIGNvbW1hIHdoaWNoIHdvdWxkCi1vdGhlcndpc2Ugc2VydmUgdG8gc2VwYXJhdGUgZmlsZSBuYW1lcywgeW91IG1heSBwdXQgdGhlIGZpbGUgbmFtZSBpbgotZG91YmxlIHF1b3Rlcy4gIFRoZXJlIGlzIG5vIHdheSB0byB1c2UgYSBkb3VibGUgcXVvdGUgY2hhcmFjdGVyIGluIGEKLWZpbGUgbmFtZS4KLQotWW91IG1heSBpbmNsdWRlIGNvbW1lbnRzIGluIGxpbmtlciBzY3JpcHRzIGp1c3QgYXMgaW4gQywgZGVsaW1pdGVkIGJ5Ci1Ac2FtcHsvKn0gYW5kIEBzYW1weyovfS4gIEFzIGluIEMsIGNvbW1lbnRzIGFyZSBzeW50YWN0aWNhbGx5IGVxdWl2YWxlbnQKLXRvIHdoaXRlc3BhY2UuCi0KLUBub2RlIFNpbXBsZSBFeGFtcGxlCi1Ac2VjdGlvbiBTaW1wbGUgTGlua2VyIFNjcmlwdCBFeGFtcGxlCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgZXhhbXBsZQotQGNpbmRleCBleGFtcGxlIG9mIGxpbmtlciBzY3JpcHQKLU1hbnkgbGlua2VyIHNjcmlwdHMgYXJlIGZhaXJseSBzaW1wbGUuCi0KLVRoZSBzaW1wbGVzdCBwb3NzaWJsZSBsaW5rZXIgc2NyaXB0IGhhcyBqdXN0IG9uZSBjb21tYW5kOgotQHNhbXB7U0VDVElPTlN9LiAgWW91IHVzZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgdG8gZGVzY3JpYmUgdGhlCi1tZW1vcnkgbGF5b3V0IG9mIHRoZSBvdXRwdXQgZmlsZS4KLQotVGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIGlzIGEgcG93ZXJmdWwgY29tbWFuZC4gIEhlcmUgd2Ugd2lsbAotZGVzY3JpYmUgYSBzaW1wbGUgdXNlIG9mIGl0LiAgTGV0J3MgYXNzdW1lIHlvdXIgcHJvZ3JhbSBjb25zaXN0cyBvbmx5IG9mCi1jb2RlLCBpbml0aWFsaXplZCBkYXRhLCBhbmQgdW5pbml0aWFsaXplZCBkYXRhLiAgVGhlc2Ugd2lsbCBiZSBpbiB0aGUKLUBzYW1wey50ZXh0fSwgQHNhbXB7LmRhdGF9LCBhbmQgQHNhbXB7LmJzc30gc2VjdGlvbnMsIHJlc3BlY3RpdmVseS4KLUxldCdzIGFzc3VtZSBmdXJ0aGVyIHRoYXQgdGhlc2UgYXJlIHRoZSBvbmx5IHNlY3Rpb25zIHdoaWNoIGFwcGVhciBpbgoteW91ciBpbnB1dCBmaWxlcy4KLQotRm9yIHRoaXMgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGxvYWRlZCBhdCBhZGRyZXNzCi0weDEwMDAwLCBhbmQgdGhhdCB0aGUgZGF0YSBzaG91bGQgc3RhcnQgYXQgYWRkcmVzcyAweDgwMDAwMDAuICBIZXJlIGlzIGEKLWxpbmtlciBzY3JpcHQgd2hpY2ggd2lsbCBkbyB0aGF0OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gIC4gPSAweDEwMDAwOwotICAudGV4dCA6IEB7ICooLnRleHQpIEB9Ci0gIC4gPSAweDgwMDAwMDA7Ci0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0KLSAgLmJzcyA6IEB7ICooLmJzcykgQH0KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Zb3Ugd3JpdGUgdGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIGFzIHRoZSBrZXl3b3JkIEBzYW1we1NFQ1RJT05TfSwKLWZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIHN5bWJvbCBhc3NpZ25tZW50cyBhbmQgb3V0cHV0IHNlY3Rpb24KLWRlc2NyaXB0aW9ucyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMuCi0KLVRoZSBmaXJzdCBsaW5lIGluIHRoZSBhYm92ZSBleGFtcGxlIHNldHMgdGhlIHNwZWNpYWwgc3ltYm9sIEBzYW1wey59LAotd2hpY2ggaXMgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIGFkZHJlc3Mgb2YgYW4KLW91dHB1dCBzZWN0aW9uIGluIHNvbWUgb3RoZXIgd2F5IChvdGhlciB3YXlzIGFyZSBkZXNjcmliZWQgbGF0ZXIpLCB0aGUKLWFkZHJlc3MgaXMgc2V0IGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBUaGUKLWxvY2F0aW9uIGNvdW50ZXIgaXMgdGhlbiBpbmNyZW1lbnRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uCi0KLVRoZSBmaXJzdCBsaW5lIGluc2lkZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgb2YgdGhlIGFib3ZlIGV4YW1wbGUKLXNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSwgd2hpY2ggaXMgdGhlIGxvY2F0aW9uCi1jb3VudGVyLiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uIGluIHNvbWUKLW90aGVyIHdheSAob3RoZXIgd2F5cyBhcmUgZGVzY3JpYmVkIGxhdGVyKSwgdGhlIGFkZHJlc3MgaXMgc2V0IGZyb20gdGhlCi1jdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgVGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgdGhlbgotaW5jcmVtZW50ZWQgYnkgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgQXQgdGhlIHN0YXJ0IG9mIHRoZQotQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQsIHRoZSBsb2NhdGlvbiBjb3VudGVyIGhhcyB0aGUgdmFsdWUgQHNhbXB7MH0uCi0KLVRoZSBzZWNvbmQgbGluZSBkZWZpbmVzIGFuIG91dHB1dCBzZWN0aW9uLCBAc2FtcHsudGV4dH0uICBUaGUgY29sb24gaXMKLXJlcXVpcmVkIHN5bnRheCB3aGljaCBtYXkgYmUgaWdub3JlZCBmb3Igbm93LiAgV2l0aGluIHRoZSBjdXJseSBicmFjZXMKLWFmdGVyIHRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lLCB5b3UgbGlzdCB0aGUgbmFtZXMgb2YgdGhlIGlucHV0IHNlY3Rpb25zCi13aGljaCBzaG91bGQgYmUgcGxhY2VkIGludG8gdGhpcyBvdXRwdXQgc2VjdGlvbi4gIFRoZSBAc2FtcHsqfSBpcyBhCi13aWxkY2FyZCB3aGljaCBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICBUaGUgZXhwcmVzc2lvbiBAc2FtcHsqKC50ZXh0KX0KLW1lYW5zIGFsbCBAc2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgaW4gYWxsIGlucHV0IGZpbGVzLgotCi1TaW5jZSB0aGUgbG9jYXRpb24gY291bnRlciBpcyBAc2FtcHsweDEwMDAwfSB3aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgotQHNhbXB7LnRleHR9IGlzIGRlZmluZWQsIHRoZSBsaW5rZXIgd2lsbCBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi1Ac2FtcHsudGV4dH0gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgQHNhbXB7MHgxMDAwMH0uCi0KLVRoZSByZW1haW5pbmcgbGluZXMgZGVmaW5lIHRoZSBAc2FtcHsuZGF0YX0gYW5kIEBzYW1wey5ic3N9IHNlY3Rpb25zIGluCi10aGUgb3V0cHV0IGZpbGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2UgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbgotYXQgYWRkcmVzcyBAc2FtcHsweDgwMDAwMDB9LiAgQWZ0ZXIgdGhlIGxpbmtlciBwbGFjZXMgdGhlIEBzYW1wey5kYXRhfQotb3V0cHV0IHNlY3Rpb24sIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlciB3aWxsIGJlCi1Ac2FtcHsweDgwMDAwMDB9IHBsdXMgdGhlIHNpemUgb2YgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbi4gIFRoZQotZWZmZWN0IGlzIHRoYXQgdGhlIGxpbmtlciB3aWxsIHBsYWNlIHRoZSBAc2FtcHsuYnNzfSBvdXRwdXQgc2VjdGlvbgotaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbiBpbiBtZW1vcnkKLQotVGhlIGxpbmtlciB3aWxsIGVuc3VyZSB0aGF0IGVhY2ggb3V0cHV0IHNlY3Rpb24gaGFzIHRoZSByZXF1aXJlZAotYWxpZ25tZW50LCBieSBpbmNyZWFzaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlmIG5lY2Vzc2FyeS4gIEluIHRoaXMKLWV4YW1wbGUsIHRoZSBzcGVjaWZpZWQgYWRkcmVzc2VzIGZvciB0aGUgQHNhbXB7LnRleHR9IGFuZCBAc2FtcHsuZGF0YX0KLXNlY3Rpb25zIHdpbGwgcHJvYmFibHkgc2F0aXNmeSBhbnkgYWxpZ25tZW50IGNvbnN0cmFpbnRzLCBidXQgdGhlIGxpbmtlcgotbWF5IGhhdmUgdG8gY3JlYXRlIGEgc21hbGwgZ2FwIGJldHdlZW4gdGhlIEBzYW1wey5kYXRhfSBhbmQgQHNhbXB7LmJzc30KLXNlY3Rpb25zLgotCi1UaGF0J3MgaXQhICBUaGF0J3MgYSBzaW1wbGUgYW5kIGNvbXBsZXRlIGxpbmtlciBzY3JpcHQuCi0KLUBub2RlIFNpbXBsZSBDb21tYW5kcwotQHNlY3Rpb24gU2ltcGxlIExpbmtlciBTY3JpcHQgQ29tbWFuZHMKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBzaW1wbGUgY29tbWFuZHMKLUluIHRoaXMgc2VjdGlvbiB3ZSBkZXNjcmliZSB0aGUgc2ltcGxlIGxpbmtlciBzY3JpcHQgY29tbWFuZHMuCi0KLUBtZW51Ci0qIEVudHJ5IFBvaW50OjoJCQlTZXR0aW5nIHRoZSBlbnRyeSBwb2ludAotKiBGaWxlIENvbW1hbmRzOjoJCUNvbW1hbmRzIGRlYWxpbmcgd2l0aCBmaWxlcwotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci0qIEZvcm1hdCBDb21tYW5kczo6CQlDb21tYW5kcyBkZWFsaW5nIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cwotQGVuZCBpZmNsZWFyCi0KLSogTWlzY2VsbGFuZW91cyBDb21tYW5kczo6CU90aGVyIGxpbmtlciBzY3JpcHQgY29tbWFuZHMKLUBlbmQgbWVudQotCi1Abm9kZSBFbnRyeSBQb2ludAotQHN1YnNlY3Rpb24gU2V0dGluZyB0aGUgZW50cnkgcG9pbnQKLUBraW5kZXggRU5UUlkoQHZhcntzeW1ib2x9KQotQGNpbmRleCBzdGFydCBvZiBleGVjdXRpb24KLUBjaW5kZXggZmlyc3QgaW5zdHJ1Y3Rpb24KLUBjaW5kZXggZW50cnkgcG9pbnQKLVRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byBleGVjdXRlIGluIGEgcHJvZ3JhbSBpcyBjYWxsZWQgdGhlIEBkZm57ZW50cnkKLXBvaW50fS4gIFlvdSBjYW4gdXNlIHRoZSBAY29kZXtFTlRSWX0gbGlua2VyIHNjcmlwdCBjb21tYW5kIHRvIHNldCB0aGUKLWVudHJ5IHBvaW50LiAgVGhlIGFyZ3VtZW50IGlzIGEgc3ltYm9sIG5hbWU6Ci1Ac21hbGxleGFtcGxlCi1FTlRSWShAdmFye3N5bWJvbH0pCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHNldCB0aGUgZW50cnkgcG9pbnQuICBUaGUgbGlua2VyIHdpbGwgc2V0IHRoZQotZW50cnkgcG9pbnQgYnkgdHJ5aW5nIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIGluIG9yZGVyLCBhbmQKLXN0b3BwaW5nIHdoZW4gb25lIG9mIHRoZW0gc3VjY2VlZHM6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSAKLXRoZSBAc2FtcHstZX0gQHZhcntlbnRyeX0gY29tbWFuZC1saW5lIG9wdGlvbjsKLUBpdGVtIAotdGhlIEBjb2Rle0VOVFJZKEB2YXJ7c3ltYm9sfSl9IGNvbW1hbmQgaW4gYSBsaW5rZXIgc2NyaXB0OwotQGl0ZW0gCi10aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBAY29kZXtzdGFydH0sIGlmIGRlZmluZWQ7Ci1AaXRlbSAKLXRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiwgaWYgcHJlc2VudDsKLUBpdGVtIAotVGhlIGFkZHJlc3MgQGNvZGV7MH0uCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgRmlsZSBDb21tYW5kcwotQHN1YnNlY3Rpb24gQ29tbWFuZHMgZGVhbGluZyB3aXRoIGZpbGVzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgZmlsZSBjb21tYW5kcwotU2V2ZXJhbCBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzIGRlYWwgd2l0aCBmaWxlcy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBJTkNMVURFIEB2YXJ7ZmlsZW5hbWV9Ci1Aa2luZGV4IElOQ0xVREUgQHZhcntmaWxlbmFtZX0KLUBjaW5kZXggaW5jbHVkaW5nIGEgbGlua2VyIHNjcmlwdAotSW5jbHVkZSB0aGUgbGlua2VyIHNjcmlwdCBAdmFye2ZpbGVuYW1lfSBhdCB0aGlzIHBvaW50LiAgVGhlIGZpbGUgd2lsbAotYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGFueSBkaXJlY3Rvcnkgc3BlY2lmaWVkCi13aXRoIHRoZSBAY29kZXstTH0gb3B0aW9uLiAgWW91IGNhbiBuZXN0IGNhbGxzIHRvIEBjb2Rle0lOQ0xVREV9IHVwIHRvCi0xMCBsZXZlbHMgZGVlcC4KLQotQGl0ZW0gSU5QVVQoQHZhcntmaWxlfSwgQHZhcntmaWxlfSwgQGRvdHN7fSkKLUBpdGVteCBJTlBVVChAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fSkKLUBraW5kZXggSU5QVVQoQHZhcntmaWxlc30pCi1AY2luZGV4IGlucHV0IGZpbGVzIGluIGxpbmtlciBzY3JpcHRzCi1AY2luZGV4IGlucHV0IG9iamVjdCBmaWxlcyBpbiBsaW5rZXIgc2NyaXB0cwotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGlucHV0IG9iamVjdCBmaWxlcwotVGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kIGRpcmVjdHMgdGhlIGxpbmtlciB0byBpbmNsdWRlIHRoZSBuYW1lZCBmaWxlcwotaW4gdGhlIGxpbmssIGFzIHRob3VnaCB0aGV5IHdlcmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBhbHdheXMgd2FudCB0byBpbmNsdWRlIEBmaWxle3N1YnIub30gYW55IHRpbWUgeW91IGRvCi1hIGxpbmssIGJ1dCB5b3UgY2FuJ3QgYmUgYm90aGVyZWQgdG8gcHV0IGl0IG9uIGV2ZXJ5IGxpbmsgY29tbWFuZCBsaW5lLAotdGhlbiB5b3UgY2FuIHB1dCBAc2FtcHtJTlBVVCAoc3Vici5vKX0gaW4geW91ciBsaW5rZXIgc2NyaXB0LgotCi1JbiBmYWN0LCBpZiB5b3UgbGlrZSwgeW91IGNhbiBsaXN0IGFsbCBvZiB5b3VyIGlucHV0IGZpbGVzIGluIHRoZSBsaW5rZXIKLXNjcmlwdCwgYW5kIHRoZW4gaW52b2tlIHRoZSBsaW5rZXIgd2l0aCBub3RoaW5nIGJ1dCBhIEBzYW1wey1UfSBvcHRpb24uCi0KLVRoZSBsaW5rZXIgd2lsbCBmaXJzdCB0cnkgdG8gb3BlbiB0aGUgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBJZgotaXQgaXMgbm90IGZvdW5kLCB0aGUgbGlua2VyIHdpbGwgc2VhcmNoIHRocm91Z2ggdGhlIGFyY2hpdmUgbGlicmFyeQotc2VhcmNoIHBhdGguICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBzYW1wey1MfSBpbiBAcmVme09wdGlvbnMsLENvbW1hbmQKLUxpbmUgT3B0aW9uc30uCi0KLUlmIHlvdSB1c2UgQHNhbXB7SU5QVVQgKC1sQHZhcntmaWxlfSl9LCBAY29kZXtsZH0gd2lsbCB0cmFuc2Zvcm0gdGhlCi1uYW1lIHRvIEBjb2Rle2xpYkB2YXJ7ZmlsZX0uYX0sIGFzIHdpdGggdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudAotQHNhbXB7LWx9LgotCi1XaGVuIHlvdSB1c2UgdGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kIGluIGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQsIHRoZQotZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluayBhdCB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIGxpbmtlcgotc2NyaXB0IGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIGNhbiBhZmZlY3QgYXJjaGl2ZSBzZWFyY2hpbmcuCi0KLUBpdGVtIEdST1VQKEB2YXJ7ZmlsZX0sIEB2YXJ7ZmlsZX0sIEBkb3Rze30pCi1AaXRlbXggR1JPVVAoQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30pCi1Aa2luZGV4IEdST1VQKEB2YXJ7ZmlsZXN9KQotQGNpbmRleCBncm91cGluZyBpbnB1dCBmaWxlcwotVGhlIEBjb2Rle0dST1VQfSBjb21tYW5kIGlzIGxpa2UgQGNvZGV7SU5QVVR9LCBleGNlcHQgdGhhdCB0aGUgbmFtZWQKLWZpbGVzIHNob3VsZCBhbGwgYmUgYXJjaGl2ZXMsIGFuZCB0aGV5IGFyZSBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIG5vCi1uZXcgdW5kZWZpbmVkIHJlZmVyZW5jZXMgYXJlIGNyZWF0ZWQuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBzYW1wey0ofQotaW4gQHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30uCi0KLUBpdGVtIE9VVFBVVChAdmFye2ZpbGVuYW1lfSkKLUBraW5kZXggT1VUUFVUKEB2YXJ7ZmlsZW5hbWV9KQotQGNpbmRleCBvdXRwdXQgZmlsZSBuYW1lIGluIGxpbmtlciBzY3JpcG90Ci1UaGUgQGNvZGV7T1VUUFVUfSBjb21tYW5kIG5hbWVzIHRoZSBvdXRwdXQgZmlsZS4gIFVzaW5nCi1AY29kZXtPVVRQVVQoQHZhcntmaWxlbmFtZX0pfSBpbiB0aGUgbGlua2VyIHNjcmlwdCBpcyBleGFjdGx5IGxpa2UgdXNpbmcKLUBzYW1wey1vIEB2YXJ7ZmlsZW5hbWV9fSBvbiB0aGUgY29tbWFuZCBsaW5lIChAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZAotTGluZSBPcHRpb25zfSkuICBJZiBib3RoIGFyZSB1c2VkLCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0YWtlcwotcHJlY2VkZW5jZS4KLQotWW91IGNhbiB1c2UgdGhlIEBjb2Rle09VVFBVVH0gY29tbWFuZCB0byBkZWZpbmUgYSBkZWZhdWx0IG5hbWUgZm9yIHRoZQotb3V0cHV0IGZpbGUgb3RoZXIgdGhhbiB0aGUgdXN1YWwgZGVmYXVsdCBvZiBAZmlsZXthLm91dH0uCi0KLUBpdGVtIFNFQVJDSF9ESVIoQHZhcntwYXRofSkKLUBraW5kZXggU0VBUkNIX0RJUihAdmFye3BhdGh9KQotQGNpbmRleCBsaWJyYXJ5IHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKLUBjaW5kZXggYXJjaGl2ZSBzZWFyY2ggcGF0aCBpbiBsaW5rZXIgc2NyaXB0Ci1AY2luZGV4IHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKLVRoZSBAY29kZXtTRUFSQ0hfRElSfSBjb21tYW5kIGFkZHMgQHZhcntwYXRofSB0byB0aGUgbGlzdCBvZiBwYXRocyB3aGVyZQotQGNvZGV7bGR9IGxvb2tzIGZvciBhcmNoaXZlIGxpYnJhcmllcy4gIFVzaW5nCi1AY29kZXtTRUFSQ0hfRElSKEB2YXJ7cGF0aH0pfSBpcyBleGFjdGx5IGxpa2UgdXNpbmcgQHNhbXB7LUwgQHZhcntwYXRofX0KLW9uIHRoZSBjb21tYW5kIGxpbmUgKEBweHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgSWYgYm90aAotYXJlIHVzZWQsIHRoZW4gdGhlIGxpbmtlciB3aWxsIHNlYXJjaCBib3RoIHBhdGhzLiAgUGF0aHMgc3BlY2lmaWVkIHVzaW5nCi10aGUgY29tbWFuZCBsaW5lIG9wdGlvbiBhcmUgc2VhcmNoZWQgZmlyc3QuCi0KLUBpdGVtIFNUQVJUVVAoQHZhcntmaWxlbmFtZX0pCi1Aa2luZGV4IFNUQVJUVVAoQHZhcntmaWxlbmFtZX0pCi1AY2luZGV4IGZpcnN0IGlucHV0IGZpbGUKLVRoZSBAY29kZXtTVEFSVFVQfSBjb21tYW5kIGlzIGp1c3QgbGlrZSB0aGUgQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGV4Y2VwdAotdGhhdCBAdmFye2ZpbGVuYW1lfSB3aWxsIGJlY29tZSB0aGUgZmlyc3QgaW5wdXQgZmlsZSB0byBiZSBsaW5rZWQsIGFzCi10aG91Z2ggaXQgd2VyZSBzcGVjaWZpZWQgZmlyc3Qgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoaXMgbWF5IGJlIHVzZWZ1bAotd2hlbiB1c2luZyBhIHN5c3RlbSBpbiB3aGljaCB0aGUgZW50cnkgcG9pbnQgaXMgYWx3YXlzIHRoZSBzdGFydCBvZiB0aGUKLWZpcnN0IGZpbGUuCi1AZW5kIHRhYmxlCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQG5vZGUgRm9ybWF0IENvbW1hbmRzCi1Ac3Vic2VjdGlvbiBDb21tYW5kcyBkZWFsaW5nIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cwotQSBjb3VwbGUgb2YgbGlua2VyIHNjcmlwdCBjb21tYW5kcyBkZWFsIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pCi1AaXRlbXggT1VUUFVUX0ZPUk1BVChAdmFye2RlZmF1bHR9LCBAdmFye2JpZ30sIEB2YXJ7bGl0dGxlfSkKLUBraW5kZXggT1VUUFVUX0ZPUk1BVChAdmFye2JmZG5hbWV9KQotQGNpbmRleCBvdXRwdXQgZmlsZSBmb3JtYXQgaW4gbGlua2VyIHNjcmlwdAotVGhlIEBjb2Rle09VVFBVVF9GT1JNQVR9IGNvbW1hbmQgbmFtZXMgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIGZvciB0aGUKLW91dHB1dCBmaWxlIChAcHhyZWZ7QkZEfSkuICBVc2luZyBAY29kZXtPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pfSBpcwotZXhhY3RseSBsaWtlIHVzaW5nIEBzYW1wey1vZm9ybWF0IEB2YXJ7YmZkbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUKLShAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIGJvdGggYXJlIHVzZWQsIHRoZSBjb21tYW5kCi1saW5lIG9wdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgotCi1Zb3UgY2FuIHVzZSBAY29kZXtPVVRQVVRfRk9STUFUfSB3aXRoIHRocmVlIGFyZ3VtZW50cyB0byB1c2UgZGlmZmVyZW50Ci1mb3JtYXRzIGJhc2VkIG9uIHRoZSBAc2FtcHstRUJ9IGFuZCBAc2FtcHstRUx9IGNvbW1hbmQgbGluZSBvcHRpb25zLgotVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgc2NyaXB0IHRvIHNldCB0aGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiB0aGUKLWRlc2lyZWQgZW5kaWFubmVzcy4KLQotSWYgbmVpdGhlciBAc2FtcHstRUJ9IG5vciBAc2FtcHstRUx9IGFyZSB1c2VkLCB0aGVuIHRoZSBvdXRwdXQgZm9ybWF0Ci13aWxsIGJlIHRoZSBmaXJzdCBhcmd1bWVudCwgQHZhcntkZWZhdWx0fS4gIElmIEBzYW1wey1FQn0gaXMgdXNlZCwgdGhlCi1vdXRwdXQgZm9ybWF0IHdpbGwgYmUgdGhlIHNlY29uZCBhcmd1bWVudCwgQHZhcntiaWd9LiAgSWYgQHNhbXB7LUVMfSBpcwotdXNlZCwgdGhlIG91dHB1dCBmb3JtYXQgd2lsbCBiZSB0aGUgdGhpcmQgYXJndW1lbnQsIEB2YXJ7bGl0dGxlfS4KLQotRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgZm9yIHRoZSBNSVBTIEVMRiB0YXJnZXQgdXNlcyB0aGlzCi1jb21tYW5kOgotQHNtYWxsZXhhbXBsZQotT1VUUFVUX0ZPUk1BVChlbGYzMi1iaWdtaXBzLCBlbGYzMi1iaWdtaXBzLCBlbGYzMi1saXR0bGVtaXBzKQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgc2F5cyB0aGF0IHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBmaWxlIGlzCi1Ac2FtcHtlbGYzMi1iaWdtaXBzfSwgYnV0IGlmIHRoZSB1c2VyIHVzZXMgdGhlIEBzYW1wey1FTH0gY29tbWFuZCBsaW5lCi1vcHRpb24sIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIEBzYW1we2VsZjMyLWxpdHRsZW1pcHN9Ci1mb3JtYXQuCi0KLUBpdGVtIFRBUkdFVChAdmFye2JmZG5hbWV9KQotQGtpbmRleCBUQVJHRVQoQHZhcntiZmRuYW1lfSkKLUBjaW5kZXggaW5wdXQgZmlsZSBmb3JtYXQgaW4gbGlua2VyIHNjcmlwdAotVGhlIEBjb2Rle1RBUkdFVH0gY29tbWFuZCBuYW1lcyB0aGUgQkZEIGZvcm1hdCB0byB1c2Ugd2hlbiByZWFkaW5nIGlucHV0Ci1maWxlcy4gIEl0IGFmZmVjdHMgc3Vic2VxdWVudCBAY29kZXtJTlBVVH0gYW5kIEBjb2Rle0dST1VQfSBjb21tYW5kcy4KLVRoaXMgY29tbWFuZCBpcyBsaWtlIHVzaW5nIEBzYW1wey1iIEB2YXJ7YmZkbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUKLShAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIHRoZSBAY29kZXtUQVJHRVR9IGNvbW1hbmQKLWlzIHVzZWQgYnV0IEBjb2Rle09VVFBVVF9GT1JNQVR9IGlzIG5vdCwgdGhlbiB0aGUgbGFzdCBAY29kZXtUQVJHRVR9Ci1jb21tYW5kIGlzIGFsc28gdXNlZCB0byBzZXQgdGhlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBmaWxlLiAgQHhyZWZ7QkZEfS4KLUBlbmQgdGFibGUKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBNaXNjZWxsYW5lb3VzIENvbW1hbmRzCi1Ac3Vic2VjdGlvbiBPdGhlciBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzCi1UaGVyZSBhcmUgYSBmZXcgb3RoZXIgbGlua2VyIHNjcmlwdHMgY29tbWFuZHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQVNTRVJUKEB2YXJ7ZXhwfSwgQHZhcnttZXNzYWdlfSkKLUBraW5kZXggQVNTRVJUCi1AY2luZGV4IGFzc2VydGlvbiBpbiBsaW5rZXIgc2NyaXB0Ci1FbnN1cmUgdGhhdCBAdmFye2V4cH0gaXMgbm9uLXplcm8uICBJZiBpdCBpcyB6ZXJvLCB0aGVuIGV4aXQgdGhlIGxpbmtlcgotd2l0aCBhbiBlcnJvciBjb2RlLCBhbmQgcHJpbnQgQHZhcnttZXNzYWdlfS4KLQotQGl0ZW0gRVhURVJOKEB2YXJ7c3ltYm9sfSBAdmFye3N5bWJvbH0gQGRvdHN7fSkKLUBraW5kZXggRVhURVJOCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2wgaW4gbGlua2VyIHNjcmlwdAotRm9yY2UgQHZhcntzeW1ib2x9IHRvIGJlIGVudGVyZWQgaW4gdGhlIG91dHB1dCBmaWxlIGFzIGFuIHVuZGVmaW5lZAotc3ltYm9sLiAgRG9pbmcgdGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbAotbW9kdWxlcyBmcm9tIHN0YW5kYXJkIGxpYnJhcmllcy4gIFlvdSBtYXkgbGlzdCBzZXZlcmFsIEB2YXJ7c3ltYm9sfXMgZm9yCi1lYWNoIEBjb2Rle0VYVEVSTn0sIGFuZCB5b3UgbWF5IHVzZSBAY29kZXtFWFRFUk59IG11bHRpcGxlIHRpbWVzLiAgVGhpcwotY29tbWFuZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBAc2FtcHstdX0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotQGl0ZW0gRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KLUBraW5kZXggRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KLUBjaW5kZXggY29tbW9uIGFsbG9jYXRpb24gaW4gbGlua2VyIHNjcmlwdAotVGhpcyBjb21tYW5kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlIEBzYW1wey1kfSBjb21tYW5kLWxpbmUgb3B0aW9uOgotdG8gbWFrZSBAY29kZXtsZH0gYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYSByZWxvY2F0YWJsZQotb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkIChAc2FtcHstcn0pLgotCi1AaXRlbSBOT0NST1NTUkVGUyhAdmFye3NlY3Rpb259IEB2YXJ7c2VjdGlvbn0gQGRvdHN7fSkKLUBraW5kZXggTk9DUk9TU1JFRlMoQHZhcntzZWN0aW9uc30pCi1AY2luZGV4IGNyb3NzIHJlZmVyZW5jZXMKLVRoaXMgY29tbWFuZCBtYXkgYmUgdXNlZCB0byB0ZWxsIEBjb2Rle2xkfSB0byBpc3N1ZSBhbiBlcnJvciBhYm91dCBhbnkKLXJlZmVyZW5jZXMgYW1vbmcgY2VydGFpbiBvdXRwdXQgc2VjdGlvbnMuCi0KLUluIGNlcnRhaW4gdHlwZXMgb2YgcHJvZ3JhbXMsIHBhcnRpY3VsYXJseSBvbiBlbWJlZGRlZCBzeXN0ZW1zIHdoZW4KLXVzaW5nIG92ZXJsYXlzLCB3aGVuIG9uZSBzZWN0aW9uIGlzIGxvYWRlZCBpbnRvIG1lbW9yeSwgYW5vdGhlciBzZWN0aW9uCi13aWxsIG5vdCBiZS4gIEFueSBkaXJlY3QgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gc2VjdGlvbnMgd291bGQgYmUKLWVycm9ycy4gIEZvciBleGFtcGxlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciBpZiBjb2RlIGluIG9uZSBzZWN0aW9uIGNhbGxlZAotYSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZSBvdGhlciBzZWN0aW9uLgotCi1UaGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGNvbW1hbmQgdGFrZXMgYSBsaXN0IG9mIG91dHB1dCBzZWN0aW9uIG5hbWVzLiAgSWYKLUBjb2Rle2xkfSBkZXRlY3RzIGFueSBjcm9zcyByZWZlcmVuY2VzIGJldHdlZW4gdGhlIHNlY3Rpb25zLCBpdCByZXBvcnRzCi1hbiBlcnJvciBhbmQgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLiAgTm90ZSB0aGF0IHRoZQotQGNvZGV7Tk9DUk9TU1JFRlN9IGNvbW1hbmQgdXNlcyBvdXRwdXQgc2VjdGlvbiBuYW1lcywgbm90IGlucHV0IHNlY3Rpb24KLW5hbWVzLgotCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLUBpdGVtIE9VVFBVVF9BUkNIKEB2YXJ7YmZkYXJjaH0pCi1Aa2luZGV4IE9VVFBVVF9BUkNIKEB2YXJ7YmZkYXJjaH0pCi1AY2luZGV4IG1hY2hpbmUgYXJjaGl0ZWN0dXJlCi1AY2luZGV4IGFyY2hpdGVjdHVyZQotU3BlY2lmeSBhIHBhcnRpY3VsYXIgb3V0cHV0IG1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAgVGhlIGFyZ3VtZW50IGlzIG9uZQotb2YgdGhlIG5hbWVzIHVzZWQgYnkgdGhlIEJGRCBsaWJyYXJ5IChAcHhyZWZ7QkZEfSkuICBZb3UgY2FuIHNlZSB0aGUKLWFyY2hpdGVjdHVyZSBvZiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoCi10aGUgQHNhbXB7LWZ9IG9wdGlvbi4KLUBlbmQgaWZjbGVhcgotQGVuZCB0YWJsZQotCi1Abm9kZSBBc3NpZ25tZW50cwotQHNlY3Rpb24gQXNzaWduaW5nIFZhbHVlcyB0byBTeW1ib2xzCi1AY2luZGV4IGFzc2lnbm1lbnQgaW4gc2NyaXB0cwotQGNpbmRleCBzeW1ib2wgZGVmaW5pdGlvbiwgc2NyaXB0cwotQGNpbmRleCB2YXJpYWJsZXMsIGRlZmluaW5nCi1Zb3UgbWF5IGFzc2lnbiBhIHZhbHVlIHRvIGEgc3ltYm9sIGluIGEgbGlua2VyIHNjcmlwdC4gIFRoaXMgd2lsbCBkZWZpbmUKLXRoZSBzeW1ib2wgYXMgYSBnbG9iYWwgc3ltYm9sLgotCi1AbWVudQotKiBTaW1wbGUgQXNzaWdubWVudHM6OgkJU2ltcGxlIEFzc2lnbm1lbnRzCi0qIFBST1ZJREU6OgkJCVBST1ZJREUKLUBlbmQgbWVudQotCi1Abm9kZSBTaW1wbGUgQXNzaWdubWVudHMKLUBzdWJzZWN0aW9uIFNpbXBsZSBBc3NpZ25tZW50cwotCi1Zb3UgbWF5IGFzc2lnbiB0byBhIHN5bWJvbCB1c2luZyBhbnkgb2YgdGhlIEMgYXNzaWdubWVudCBvcGVyYXRvcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntzeW1ib2x9ID0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ICs9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSAtPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gKj0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9IC89IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSA8PD0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ID4+PSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gJj0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9IHw9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGVuZCB0YWJsZQotCi1UaGUgZmlyc3QgY2FzZSB3aWxsIGRlZmluZSBAdmFye3N5bWJvbH0gdG8gdGhlIHZhbHVlIG9mCi1AdmFye2V4cHJlc3Npb259LiAgSW4gdGhlIG90aGVyIGNhc2VzLCBAdmFye3N5bWJvbH0gbXVzdCBhbHJlYWR5IGJlCi1kZWZpbmVkLCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuCi0KLVRoZSBzcGVjaWFsIHN5bWJvbCBuYW1lIEBzYW1wey59IGluZGljYXRlcyB0aGUgbG9jYXRpb24gY291bnRlci4gIFlvdQotbWF5IG9ubHkgdXNlIHRoaXMgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQuCi0KLVRoZSBzZW1pY29sb24gYWZ0ZXIgQHZhcntleHByZXNzaW9ufSBpcyByZXF1aXJlZC4KLQotRXhwcmVzc2lvbnMgYXJlIGRlZmluZWQgYmVsb3c7IHNlZSBAcmVme0V4cHJlc3Npb25zfS4KLQotWW91IG1heSB3cml0ZSBzeW1ib2wgYXNzaWdubWVudHMgYXMgY29tbWFuZHMgaW4gdGhlaXIgb3duIHJpZ2h0LCBvciBhcwotc3RhdGVtZW50cyB3aXRoaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCwgb3IgYXMgcGFydCBvZiBhbiBvdXRwdXQKLXNlY3Rpb24gZGVzY3JpcHRpb24gaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZC4KLQotVGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbCB3aWxsIGJlIHNldCBmcm9tIHRoZSBzZWN0aW9uIG9mIHRoZQotZXhwcmVzc2lvbjsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBzaG93aW5nIHRoZSB0aHJlZSBkaWZmZXJlbnQgcGxhY2VzIHRoYXQgc3ltYm9sCi1hc3NpZ25tZW50cyBtYXkgYmUgdXNlZDoKLQotQHNtYWxsZXhhbXBsZQotZmxvYXRpbmdfcG9pbnQgPSAwOwotU0VDVElPTlMKLUB7Ci0gIC50ZXh0IDoKLSAgICBAewotICAgICAgKigudGV4dCkKLSAgICAgIF9ldGV4dCA9IC47Ci0gICAgQH0KLSAgX2JkYXRhID0gKC4gKyAzKSAmIH4gNDsKLSAgLmRhdGEgOiBAeyAqKC5kYXRhKSBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLUluIHRoaXMgZXhhbXBsZSwgdGhlIHN5bWJvbCBAc2FtcHtmbG9hdGluZ19wb2ludH0gd2lsbCBiZSBkZWZpbmVkIGFzCi16ZXJvLiAgVGhlIHN5bWJvbCBAc2FtcHtfZXRleHR9IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcKLXRoZSBsYXN0IEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9uLiAgVGhlIHN5bWJvbCBAc2FtcHtfYmRhdGF9IHdpbGwgYmUKLWRlZmluZWQgYXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBAc2FtcHsudGV4dH0gb3V0cHV0IHNlY3Rpb24gYWxpZ25lZAotdXB3YXJkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgotCi1Abm9kZSBQUk9WSURFCi1Ac3Vic2VjdGlvbiBQUk9WSURFCi1AY2luZGV4IFBST1ZJREUKLUluIHNvbWUgY2FzZXMsIGl0IGlzIGRlc2lyYWJsZSBmb3IgYSBsaW5rZXIgc2NyaXB0IHRvIGRlZmluZSBhIHN5bWJvbAotb25seSBpZiBpdCBpcyByZWZlcmVuY2VkIGFuZCBpcyBub3QgZGVmaW5lZCBieSBhbnkgb2JqZWN0IGluY2x1ZGVkIGluCi10aGUgbGluay4gIEZvciBleGFtcGxlLCB0cmFkaXRpb25hbCBsaW5rZXJzIGRlZmluZWQgdGhlIHN5bWJvbAotQHNhbXB7ZXRleHR9LiAgSG93ZXZlciwgQU5TSSBDIHJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgYmUgYWJsZSB0byB1c2UKLUBzYW1we2V0ZXh0fSBhcyBhIGZ1bmN0aW9uIG5hbWUgd2l0aG91dCBlbmNvdW50ZXJpbmcgYW4gZXJyb3IuICBUaGUKLUBjb2Rle1BST1ZJREV9IGtleXdvcmQgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGEgc3ltYm9sLCBzdWNoIGFzCi1Ac2FtcHtldGV4dH0sIG9ubHkgaWYgaXQgaXMgcmVmZXJlbmNlZCBidXQgbm90IGRlZmluZWQuICBUaGUgc3ludGF4IGlzCi1AY29kZXtQUk9WSURFKEB2YXJ7c3ltYm9sfSA9IEB2YXJ7ZXhwcmVzc2lvbn0pfS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIEBjb2Rle1BST1ZJREV9IHRvIGRlZmluZSBAc2FtcHtldGV4dH06Ci1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgLnRleHQgOgotICAgIEB7Ci0gICAgICAqKC50ZXh0KQotICAgICAgX2V0ZXh0ID0gLjsKLSAgICAgIFBST1ZJREUoZXRleHQgPSAuKTsKLSAgICBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgaWYgdGhlIHByb2dyYW0gZGVmaW5lcyBAc2FtcHtfZXRleHR9ICh3aXRoIGEgbGVhZGluZwotdW5kZXJzY29yZSksIHRoZSBsaW5rZXIgd2lsbCBnaXZlIGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIElmLCBvbgotdGhlIG90aGVyIGhhbmQsIHRoZSBwcm9ncmFtIGRlZmluZXMgQHNhbXB7ZXRleHR9ICh3aXRoIG5vIGxlYWRpbmcKLXVuZGVyc2NvcmUpLCB0aGUgbGlua2VyIHdpbGwgc2lsZW50bHkgdXNlIHRoZSBkZWZpbml0aW9uIGluIHRoZSBwcm9ncmFtLgotSWYgdGhlIHByb2dyYW0gcmVmZXJlbmNlcyBAc2FtcHtldGV4dH0gYnV0IGRvZXMgbm90IGRlZmluZSBpdCwgdGhlCi1saW5rZXIgd2lsbCB1c2UgdGhlIGRlZmluaXRpb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUBub2RlIFNFQ1RJT05TCi1Ac2VjdGlvbiBTRUNUSU9OUyBjb21tYW5kCi1Aa2luZGV4IFNFQ1RJT05TCi1UaGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgdGVsbHMgdGhlIGxpbmtlciBob3cgdG8gbWFwIGlucHV0IHNlY3Rpb25zCi1pbnRvIG91dHB1dCBzZWN0aW9ucywgYW5kIGhvdyB0byBwbGFjZSB0aGUgb3V0cHV0IHNlY3Rpb25zIGluIG1lbW9yeS4KLQotVGhlIGZvcm1hdCBvZiB0aGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgaXM6Ci1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgQHZhcntzZWN0aW9ucy1jb21tYW5kfQotICBAdmFye3NlY3Rpb25zLWNvbW1hbmR9Ci0gIEBkb3Rze30KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1FYWNoIEB2YXJ7c2VjdGlvbnMtY29tbWFuZH0gbWF5IG9mIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotYW4gQGNvZGV7RU5UUll9IGNvbW1hbmQgKEBweHJlZntFbnRyeSBQb2ludCwsRW50cnkgY29tbWFuZH0pCi1AaXRlbQotYSBzeW1ib2wgYXNzaWdubWVudCAoQHB4cmVme0Fzc2lnbm1lbnRzfSkKLUBpdGVtCi1hbiBvdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotQGl0ZW0KLWFuIG92ZXJsYXkgZGVzY3JpcHRpb24KLUBlbmQgaXRlbWl6ZQotCi1UaGUgQGNvZGV7RU5UUll9IGNvbW1hbmQgYW5kIHN5bWJvbCBhc3NpZ25tZW50cyBhcmUgcGVybWl0dGVkIGluc2lkZSB0aGUKLUBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGZvciBjb252ZW5pZW5jZSBpbiB1c2luZyB0aGUgbG9jYXRpb24gY291bnRlciBpbgotdGhvc2UgY29tbWFuZHMuICBUaGlzIGNhbiBhbHNvIG1ha2UgdGhlIGxpbmtlciBzY3JpcHQgZWFzaWVyIHRvCi11bmRlcnN0YW5kIGJlY2F1c2UgeW91IGNhbiB1c2UgdGhvc2UgY29tbWFuZHMgYXQgbWVhbmluZ2Z1bCBwb2ludHMgaW4KLXRoZSBsYXlvdXQgb2YgdGhlIG91dHB1dCBmaWxlLgotCi1PdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbnMgYW5kIG92ZXJsYXkgZGVzY3JpcHRpb25zIGFyZSBkZXNjcmliZWQKLWJlbG93LgotCi1JZiB5b3UgZG8gbm90IHVzZSBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGluIHlvdXIgbGlua2VyIHNjcmlwdCwgdGhlCi1saW5rZXIgd2lsbCBwbGFjZSBlYWNoIGlucHV0IHNlY3Rpb24gaW50byBhbiBpZGVudGljYWxseSBuYW1lZCBvdXRwdXQKLXNlY3Rpb24gaW4gdGhlIG9yZGVyIHRoYXQgdGhlIHNlY3Rpb25zIGFyZSBmaXJzdCBlbmNvdW50ZXJlZCBpbiB0aGUKLWlucHV0IGZpbGVzLiAgSWYgYWxsIGlucHV0IHNlY3Rpb25zIGFyZSBwcmVzZW50IGluIHRoZSBmaXJzdCBmaWxlLCBmb3IKLWV4YW1wbGUsIHRoZSBvcmRlciBvZiBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBtYXRjaCB0aGUgb3JkZXIKLWluIHRoZSBmaXJzdCBpbnB1dCBmaWxlLiAgVGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBhdCBhZGRyZXNzIHplcm8uCi0KLUBtZW51Ci0qIE91dHB1dCBTZWN0aW9uIERlc2NyaXB0aW9uOjoJT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLSogT3V0cHV0IFNlY3Rpb24gTmFtZTo6CQlPdXRwdXQgc2VjdGlvbiBuYW1lCi0qIE91dHB1dCBTZWN0aW9uIEFkZHJlc3M6OglPdXRwdXQgc2VjdGlvbiBhZGRyZXNzCi0qIElucHV0IFNlY3Rpb246OgkJSW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotKiBPdXRwdXQgU2VjdGlvbiBEYXRhOjoJCU91dHB1dCBzZWN0aW9uIGRhdGEKLSogT3V0cHV0IFNlY3Rpb24gS2V5d29yZHM6OglPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcwotKiBPdXRwdXQgU2VjdGlvbiBEaXNjYXJkaW5nOjoJT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZwotKiBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzOjoJT3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlcwotKiBPdmVybGF5IERlc2NyaXB0aW9uOjoJCU92ZXJsYXkgZGVzY3JpcHRpb24KLUBlbmQgbWVudQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBEZXNjcmlwdGlvbgotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLVRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tzIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cCAKLUB2YXJ7c2VjdGlvbn0gW0B2YXJ7YWRkcmVzc31dIFsoQHZhcnt0eXBlfSldIDogW0FUKEB2YXJ7bG1hfSldCi0gIEB7Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICBAZG90c3t9Ci0gIEB9IFs+QHZhcntyZWdpb259XSBbOkB2YXJ7cGhkcn0gOkB2YXJ7cGhkcn0gQGRvdHN7fV0gWz1AdmFye2ZpbGxleHB9XQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTW9zdCBvdXRwdXQgc2VjdGlvbnMgZG8gbm90IHVzZSBtb3N0IG9mIHRoZSBvcHRpb25hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuCi0KLVRoZSB3aGl0ZXNwYWNlIGFyb3VuZCBAdmFye3NlY3Rpb259IGlzIHJlcXVpcmVkLCBzbyB0aGF0IHRoZSBzZWN0aW9uCi1uYW1lIGlzIHVuYW1iaWd1b3VzLiAgVGhlIGNvbG9uIGFuZCB0aGUgY3VybHkgYnJhY2VzIGFyZSBhbHNvIHJlcXVpcmVkLgotVGhlIGxpbmUgYnJlYWtzIGFuZCBvdGhlciB3aGl0ZSBzcGFjZSBhcmUgb3B0aW9uYWwuCi0KLUVhY2ggQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfSBtYXkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1hIHN5bWJvbCBhc3NpZ25tZW50IChAcHhyZWZ7QXNzaWdubWVudHN9KQotQGl0ZW0KLWFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gKEBweHJlZntJbnB1dCBTZWN0aW9ufSkKLUBpdGVtCi1kYXRhIHZhbHVlcyB0byBpbmNsdWRlIGRpcmVjdGx5IChAcHhyZWZ7T3V0cHV0IFNlY3Rpb24gRGF0YX0pCi1AaXRlbQotYSBzcGVjaWFsIG91dHB1dCBzZWN0aW9uIGtleXdvcmQgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBLZXl3b3Jkc30pCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gTmFtZQotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gbmFtZQotQGNpbmRleCBuYW1lLCBzZWN0aW9uCi1AY2luZGV4IHNlY3Rpb24gbmFtZQotVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBzZWN0aW9uIGlzIEB2YXJ7c2VjdGlvbn0uICBAdmFye3NlY3Rpb259IG11c3QKLW1lZXQgdGhlIGNvbnN0cmFpbnRzIG9mIHlvdXIgb3V0cHV0IGZvcm1hdC4gIEluIGZvcm1hdHMgd2hpY2ggb25seQotc3VwcG9ydCBhIGxpbWl0ZWQgbnVtYmVyIG9mIHNlY3Rpb25zLCBzdWNoIGFzIEBjb2Rle2Eub3V0fSwgdGhlIG5hbWUKLW11c3QgYmUgb25lIG9mIHRoZSBuYW1lcyBzdXBwb3J0ZWQgYnkgdGhlIGZvcm1hdCAoQGNvZGV7YS5vdXR9LCBmb3IKLWV4YW1wbGUsIGFsbG93cyBvbmx5IEBzYW1wey50ZXh0fSwgQHNhbXB7LmRhdGF9IG9yIEBzYW1wey5ic3N9KS4gSWYgdGhlCi1vdXRwdXQgZm9ybWF0IHN1cHBvcnRzIGFueSBudW1iZXIgb2Ygc2VjdGlvbnMsIGJ1dCB3aXRoIG51bWJlcnMgYW5kIG5vdAotbmFtZXMgKGFzIGlzIHRoZSBjYXNlIGZvciBPYXN5cyksIHRoZSBuYW1lIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhCi1xdW90ZWQgbnVtZXJpYyBzdHJpbmcuICBBIHNlY3Rpb24gbmFtZSBtYXkgY29uc2lzdCBvZiBhbnkgc2VxdWVuY2Ugb2YKLWNoYXJhY3RlcnMsIGJ1dCBhIG5hbWUgd2hpY2ggY29udGFpbnMgYW55IHVudXN1YWwgY2hhcmFjdGVycyBzdWNoIGFzCi1jb21tYXMgbXVzdCBiZSBxdW90ZWQuCi0KLVRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gaXMgc3BlY2lhbDsgQHJlZntPdXRwdXQgU2VjdGlvbgotRGlzY2FyZGluZ30uCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEFkZHJlc3MKLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGFkZHJlc3MKLUBjaW5kZXggYWRkcmVzcywgc2VjdGlvbgotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MKLVRoZSBAdmFye2FkZHJlc3N9IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBWTUEgKHRoZSB2aXJ0dWFsIG1lbW9yeQotYWRkcmVzcykgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgSWYgeW91IGRvIG5vdCBwcm92aWRlIEB2YXJ7YWRkcmVzc30sCi10aGUgbGlua2VyIHdpbGwgc2V0IGl0IGJhc2VkIG9uIEB2YXJ7cmVnaW9ufSBpZiBwcmVzZW50LCBvciBvdGhlcndpc2UKLWJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLgotCi1JZiB5b3UgcHJvdmlkZSBAdmFye2FkZHJlc3N9LCB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gd2lsbCBiZQotc2V0IHRvIHByZWNpc2VseSB0aGF0LiAgSWYgeW91IHByb3ZpZGUgbmVpdGhlciBAdmFye2FkZHJlc3N9IG5vcgotQHZhcntyZWdpb259LCB0aGVuIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlIHNldCB0byB0aGUKLWN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgYWxpZ25lZCB0byB0aGUgYWxpZ25tZW50Ci1yZXF1aXJlbWVudHMgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUKLW91dHB1dCBzZWN0aW9uIGlzIHRoZSBzdHJpY3Rlc3QgYWxpZ25tZW50IG9mIGFueSBpbnB1dCBzZWN0aW9uIGNvbnRhaW5lZAotd2l0aGluIHRoZSBvdXRwdXQgc2VjdGlvbi4KLQotRm9yIGV4YW1wbGUsCi1Ac21hbGxleGFtcGxlCi0udGV4dCAuIDogQHsgKigudGV4dCkgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLWFuZAotQHNtYWxsZXhhbXBsZQotLnRleHQgOiBAeyAqKC50ZXh0KSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotYXJlIHN1YnRseSBkaWZmZXJlbnQuICBUaGUgZmlyc3Qgd2lsbCBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi1Ac2FtcHsudGV4dH0gb3V0cHV0IHNlY3Rpb24gdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uCi1jb3VudGVyLiAgVGhlIHNlY29uZCB3aWxsIHNldCBpdCB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIgYWxpZ25lZCB0byB0aGUgc3RyaWN0ZXN0IGFsaWdubWVudCBvZiBhIEBzYW1wey50ZXh0fSBpbnB1dAotc2VjdGlvbi4KLQotVGhlIEB2YXJ7YWRkcmVzc30gbWF5IGJlIGFuIGFyYml0cmFyeSBleHByZXNzaW9uOyBAcmVme0V4cHJlc3Npb25zfS4KLUZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhbGlnbiB0aGUgc2VjdGlvbiBvbiBhIDB4MTAgYnl0ZSBib3VuZGFyeSwKLXNvIHRoYXQgdGhlIGxvd2VzdCBmb3VyIGJpdHMgb2YgdGhlIHNlY3Rpb24gYWRkcmVzcyBhcmUgemVybywgeW91IGNvdWxkCi1kbyBzb21ldGhpbmcgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnRleHQgQUxJR04oMHgxMCkgOiBAeyAqKC50ZXh0KSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB3b3JrcyBiZWNhdXNlIEBjb2Rle0FMSUdOfSByZXR1cm5zIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNvdW50ZXIKLWFsaWduZWQgdXB3YXJkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0KLVNwZWNpZnlpbmcgQHZhcnthZGRyZXNzfSBmb3IgYSBzZWN0aW9uIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUKLWxvY2F0aW9uIGNvdW50ZXIuCi0KLUBub2RlIElucHV0IFNlY3Rpb24KLUBzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLUBjaW5kZXggaW5wdXQgc2VjdGlvbnMKLUBjaW5kZXggbWFwcGluZyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMKLVRoZSBtb3N0IGNvbW1vbiBvdXRwdXQgc2VjdGlvbiBjb21tYW5kIGlzIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24uCi0KLVRoZSBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGlzIHRoZSBtb3N0IGJhc2ljIGxpbmtlciBzY3JpcHQgb3BlcmF0aW9uLgotWW91IHVzZSBvdXRwdXQgc2VjdGlvbnMgdG8gdGVsbCB0aGUgbGlua2VyIGhvdyB0byBsYXkgb3V0IHlvdXIgcHJvZ3JhbQotaW4gbWVtb3J5LiAgWW91IHVzZSBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9ucyB0byB0ZWxsIHRoZSBsaW5rZXIgaG93IHRvCi1tYXAgdGhlIGlucHV0IGZpbGVzIGludG8geW91ciBtZW1vcnkgbGF5b3V0LgotCi1AbWVudQotKiBJbnB1dCBTZWN0aW9uIEJhc2ljczo6CUlucHV0IHNlY3Rpb24gYmFzaWNzCi0qIElucHV0IFNlY3Rpb24gV2lsZGNhcmRzOjoJSW5wdXQgc2VjdGlvbiB3aWxkY2FyZCBwYXR0ZXJucwotKiBJbnB1dCBTZWN0aW9uIENvbW1vbjo6CUlucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCi0qIElucHV0IFNlY3Rpb24gS2VlcDo6CQlJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KLSogSW5wdXQgU2VjdGlvbiBFeGFtcGxlOjoJSW5wdXQgc2VjdGlvbiBleGFtcGxlCi1AZW5kIG1lbnUKLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBCYXNpY3MKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gYmFzaWNzCi1AY2luZGV4IGlucHV0IHNlY3Rpb24gYmFzaWNzCi1BbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGNvbnNpc3RzIG9mIGEgZmlsZSBuYW1lIG9wdGlvbmFsbHkgZm9sbG93ZWQKLWJ5IGEgbGlzdCBvZiBzZWN0aW9uIG5hbWVzIGluIHBhcmVudGhlc2VzLgotCi1UaGUgZmlsZSBuYW1lIGFuZCB0aGUgc2VjdGlvbiBuYW1lIG1heSBiZSB3aWxkY2FyZCBwYXR0ZXJucywgd2hpY2ggd2UKLWRlc2NyaWJlIGZ1cnRoZXIgYmVsb3cgKEBweHJlZntJbnB1dCBTZWN0aW9uIFdpbGRjYXJkc30pLgotCi1UaGUgbW9zdCBjb21tb24gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBpcyB0byBpbmNsdWRlIGFsbCBpbnB1dAotc2VjdGlvbnMgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICBGb3IgZXhhbXBsZSwgdG8KLWluY2x1ZGUgYWxsIGlucHV0IEBzYW1wey50ZXh0fSBzZWN0aW9ucywgeW91IHdvdWxkIHdyaXRlOgotQHNtYWxsZXhhbXBsZQotKigudGV4dCkKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLUhlcmUgdGhlIEBzYW1weyp9IGlzIGEgd2lsZGNhcmQgd2hpY2ggbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgVG8gZXhjbHVkZSBhIGZpbGUKLWZyb20gbWF0Y2hpbmcgdGhlIGZpbGUgbmFtZSB3aWxkY2FyZCwgRVhDTFVERV9GSUxFIG1heSBiZSB1c2VkIHRvIG1hdGNoIGFsbCBmaWxlcwotZXhjZXB0IHRoZSBvbmUgc3BlY2lmaWVkIGJ5IEVYQ0xVREVfRklMRS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi1AZW5kIHNtYWxsZXhhbXBsZQotd2lsbCBjYXVzZSBhbGwgLmN0b3JzIHNlY3Rpb25zIGZyb20gYWxsIGZpbGVzIGV4Y2VwdCBjcnRlbmQubyB0byBiZSBpbmNsdWRlZC4KLQotVGhlcmUgYXJlIHR3byB3YXlzIHRvIGluY2x1ZGUgbW9yZSB0aGFuIG9uZSBzZWN0aW9uOgotQHNtYWxsZXhhbXBsZQotKigudGV4dCAucmRhdGEpCi0qKC50ZXh0KSAqKC5yZGF0YSkKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBAc2FtcHsudGV4dH0gYW5kCi1Ac2FtcHsucmRhdGF9IGlucHV0IHNlY3Rpb25zIHdpbGwgYXBwZWFyIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEluIHRoZQotZmlyc3QgZXhhbXBsZSwgdGhleSB3aWxsIGJlIGludGVybWluZ2xlZC4gIEluIHRoZSBzZWNvbmQgZXhhbXBsZSwgYWxsCi1Ac2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QsIGZvbGxvd2VkIGJ5IGFsbAotQHNhbXB7LnJkYXRhfSBpbnB1dCBzZWN0aW9ucy4KLQotWW91IGNhbiBzcGVjaWZ5IGEgZmlsZSBuYW1lIHRvIGluY2x1ZGUgc2VjdGlvbnMgZnJvbSBhIHBhcnRpY3VsYXIgZmlsZS4KLVlvdSB3b3VsZCBkbyB0aGlzIGlmIG9uZSBvciBtb3JlIG9mIHlvdXIgZmlsZXMgY29udGFpbiBzcGVjaWFsIGRhdGEgdGhhdAotbmVlZHMgdG8gYmUgYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGluIG1lbW9yeS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotZGF0YS5vKC5kYXRhKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IHVzZSBhIGZpbGUgbmFtZSB3aXRob3V0IGEgbGlzdCBvZiBzZWN0aW9ucywgdGhlbiBhbGwgc2VjdGlvbnMgaW4KLXRoZSBpbnB1dCBmaWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhpcyBpcyBub3QKLWNvbW1vbmx5IGRvbmUsIGJ1dCBpdCBtYXkgYnkgdXNlZnVsIG9uIG9jY2FzaW9uLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi1kYXRhLm8KLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4geW91IHVzZSBhIGZpbGUgbmFtZSB3aGljaCBkb2VzIG5vdCBjb250YWluIGFueSB3aWxkIGNhcmQKLWNoYXJhY3RlcnMsIHRoZSBsaW5rZXIgd2lsbCBmaXJzdCBzZWUgaWYgeW91IGFsc28gc3BlY2lmaWVkIHRoZSBmaWxlCi1uYW1lIG9uIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lIG9yIGluIGFuIEBjb2Rle0lOUFVUfSBjb21tYW5kLiAgSWYgeW91Ci1kaWQgbm90LCB0aGUgbGlua2VyIHdpbGwgYXR0ZW1wdCB0byBvcGVuIHRoZSBmaWxlIGFzIGFuIGlucHV0IGZpbGUsIGFzCi10aG91Z2ggaXQgYXBwZWFyZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBhbgotQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGJlY2F1c2UgdGhlIGxpbmtlciB3aWxsIG5vdCBzZWFyY2ggZm9yIHRoZSBmaWxlIGluCi10aGUgYXJjaGl2ZSBzZWFyY2ggcGF0aC4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHMKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gd2lsZGNhcmQgcGF0dGVybnMKLUBjaW5kZXggaW5wdXQgc2VjdGlvbiB3aWxkY2FyZHMKLUBjaW5kZXggd2lsZGNhcmQgZmlsZSBuYW1lIHBhdHRlcm5zCi1AY2luZGV4IGZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucwotQGNpbmRleCBzZWN0aW9uIG5hbWUgd2lsZGNhcmQgcGF0dGVybnMKLUluIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24sIGVpdGhlciB0aGUgZmlsZSBuYW1lIG9yIHRoZSBzZWN0aW9uCi1uYW1lIG9yIGJvdGggbWF5IGJlIHdpbGRjYXJkIHBhdHRlcm5zLgotCi1UaGUgZmlsZSBuYW1lIG9mIEBzYW1weyp9IHNlZW4gaW4gbWFueSBleGFtcGxlcyBpcyBhIHNpbXBsZSB3aWxkY2FyZAotcGF0dGVybiBmb3IgdGhlIGZpbGUgbmFtZS4KLQotVGhlIHdpbGRjYXJkIHBhdHRlcm5zIGFyZSBsaWtlIHRob3NlIHVzZWQgYnkgdGhlIFVuaXggc2hlbGwuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gKgotbWF0Y2hlcyBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLUBpdGVtID8KLW1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIKLUBpdGVtIFtAdmFye2NoYXJzfV0KLW1hdGNoZXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYW55IG9mIHRoZSBAdmFye2NoYXJzfTsgdGhlIEBzYW1wey19Ci1jaGFyYWN0ZXIgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMsIGFzIGluCi1Ac2FtcHtbYS16XX0gdG8gbWF0Y2ggYW55IGxvd2VyIGNhc2UgbGV0dGVyCi1AaXRlbSBcCi1xdW90ZXMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIKLUBlbmQgdGFibGUKLQotV2hlbiBhIGZpbGUgbmFtZSBpcyBtYXRjaGVkIHdpdGggYSB3aWxkY2FyZCwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMKLXdpbGwgbm90IG1hdGNoIGEgQHNhbXB7L30gY2hhcmFjdGVyICh1c2VkIHRvIHNlcGFyYXRlIGRpcmVjdG9yeSBuYW1lcyBvbgotVW5peCkuICBBIHBhdHRlcm4gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBAc2FtcHsqfSBjaGFyYWN0ZXIgaXMgYW4KLWV4Y2VwdGlvbjsgaXQgd2lsbCBhbHdheXMgbWF0Y2ggYW55IGZpbGUgbmFtZSwgd2hldGhlciBpdCBjb250YWlucyBhCi1Ac2FtcHsvfSBvciBub3QuICBJbiBhIHNlY3Rpb24gbmFtZSwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgd2lsbCBtYXRjaAotYSBAc2FtcHsvfSBjaGFyYWN0ZXIuCi0KLUZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucyBvbmx5IG1hdGNoIGZpbGVzIHdoaWNoIGFyZSBleHBsaWNpdGx5Ci1zcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBhbiBAY29kZXtJTlBVVH0gY29tbWFuZC4gIFRoZSBsaW5rZXIKLWRvZXMgbm90IHNlYXJjaCBkaXJlY3RvcmllcyB0byBleHBhbmQgd2lsZGNhcmRzLgotCi1JZiBhIGZpbGUgbmFtZSBtYXRjaGVzIG1vcmUgdGhhbiBvbmUgd2lsZGNhcmQgcGF0dGVybiwgb3IgaWYgYSBmaWxlIG5hbWUKLWFwcGVhcnMgZXhwbGljaXRseSBhbmQgaXMgYWxzbyBtYXRjaGVkIGJ5IGEgd2lsZGNhcmQgcGF0dGVybiwgdGhlIGxpbmtlcgotd2lsbCB1c2UgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgRm9yIGV4YW1wbGUsIHRoaXMKLXNlcXVlbmNlIG9mIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIGlzIHByb2JhYmx5IGluIGVycm9yLCBiZWNhdXNlIHRoZQotQGZpbGV7ZGF0YS5vfSBydWxlIHdpbGwgbm90IGJlIHVzZWQ6Ci1Ac21hbGxleGFtcGxlCi0uZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0uZGF0YTEgOiBAeyBkYXRhLm8oLmRhdGEpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IFNPUlQKLU5vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgcGxhY2UgZmlsZXMgYW5kIHNlY3Rpb25zIG1hdGNoZWQgYnkgd2lsZGNhcmRzCi1pbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc2VlbiBkdXJpbmcgdGhlIGxpbmsuICBZb3UgY2FuIGNoYW5nZQotdGhpcyBieSB1c2luZyB0aGUgQGNvZGV7U09SVH0ga2V5d29yZCwgd2hpY2ggYXBwZWFycyBiZWZvcmUgYSB3aWxkY2FyZAotcGF0dGVybiBpbiBwYXJlbnRoZXNlcyAoZS5nLiwgQGNvZGV7U09SVCgudGV4dCopfSkuICBXaGVuIHRoZQotQGNvZGV7U09SVH0ga2V5d29yZCBpcyB1c2VkLCB0aGUgbGlua2VyIHdpbGwgc29ydCB0aGUgZmlsZXMgb3Igc2VjdGlvbnMKLWludG8gYXNjZW5kaW5nIG9yZGVyIGJ5IG5hbWUgYmVmb3JlIHBsYWNpbmcgdGhlbSBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUlmIHlvdSBldmVyIGdldCBjb25mdXNlZCBhYm91dCB3aGVyZSBpbnB1dCBzZWN0aW9ucyBhcmUgZ29pbmcsIHVzZSB0aGUKLUBzYW1wey1NfSBsaW5rZXIgb3B0aW9uIHRvIGdlbmVyYXRlIGEgbWFwIGZpbGUuICBUaGUgbWFwIGZpbGUgc2hvd3MKLXByZWNpc2VseSBob3cgaW5wdXQgc2VjdGlvbnMgYXJlIG1hcHBlZCB0byBvdXRwdXQgc2VjdGlvbnMuCi0KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgd2lsZGNhcmQgcGF0dGVybnMgbWlnaHQgYmUgdXNlZCB0byBwYXJ0aXRpb24KLWZpbGVzLiAgVGhpcyBsaW5rZXIgc2NyaXB0IGRpcmVjdHMgdGhlIGxpbmtlciB0byBwbGFjZSBhbGwgQHNhbXB7LnRleHR9Ci1zZWN0aW9ucyBpbiBAc2FtcHsudGV4dH0gYW5kIGFsbCBAc2FtcHsuYnNzfSBzZWN0aW9ucyBpbiBAc2FtcHsuYnNzfS4KLVRoZSBsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gZnJvbSBhbGwgZmlsZXMgYmVnaW5uaW5nCi13aXRoIGFuIHVwcGVyIGNhc2UgY2hhcmFjdGVyIGluIEBzYW1wey5EQVRBfTsgZm9yIGFsbCBvdGhlciBmaWxlcywgdGhlCi1saW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gaW4gQHNhbXB7LmRhdGF9LgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAewotICAudGV4dCA6IEB7ICooLnRleHQpIEB9Ci0gIC5EQVRBIDogQHsgW0EtWl0qKC5kYXRhKSBAfQotICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0gIC5ic3MgOiBAeyAqKC5ic3MpIEB9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBDb21tb24KLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCi1AY2luZGV4IGNvbW1vbiBzeW1ib2wgcGxhY2VtZW50Ci1AY2luZGV4IHVuaW5pdGlhbGl6ZWQgZGF0YSBwbGFjZW1lbnQKLUEgc3BlY2lhbCBub3RhdGlvbiBpcyBuZWVkZWQgZm9yIGNvbW1vbiBzeW1ib2xzLCBiZWNhdXNlIGluIG1hbnkgb2JqZWN0Ci1maWxlIGZvcm1hdHMgY29tbW9uIHN5bWJvbHMgZG8gbm90IGhhdmUgYSBwYXJ0aWN1bGFyIGlucHV0IHNlY3Rpb24uICBUaGUKLWxpbmtlciB0cmVhdHMgY29tbW9uIHN5bWJvbHMgYXMgdGhvdWdoIHRoZXkgYXJlIGluIGFuIGlucHV0IHNlY3Rpb24KLW5hbWVkIEBzYW1we0NPTU1PTn0uCi0KLVlvdSBtYXkgdXNlIGZpbGUgbmFtZXMgd2l0aCB0aGUgQHNhbXB7Q09NTU9OfSBzZWN0aW9uIGp1c3QgYXMgd2l0aCBhbnkKLW90aGVyIGlucHV0IHNlY3Rpb25zLiAgWW91IGNhbiB1c2UgdGhpcyB0byBwbGFjZSBjb21tb24gc3ltYm9scyBmcm9tIGEKLXBhcnRpY3VsYXIgaW5wdXQgZmlsZSBpbiBvbmUgc2VjdGlvbiB3aGlsZSBjb21tb24gc3ltYm9scyBmcm9tIG90aGVyCi1pbnB1dCBmaWxlcyBhcmUgcGxhY2VkIGluIGFub3RoZXIgc2VjdGlvbi4KLQotSW4gbW9zdCBjYXNlcywgY29tbW9uIHN5bWJvbHMgaW4gaW5wdXQgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlCi1Ac2FtcHsuYnNzfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotLmJzcyBAeyAqKC5ic3MpICooQ09NTU9OKSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBzY29tbW9uIHNlY3Rpb24KLUBjaW5kZXggc21hbGwgY29tbW9uIHN5bWJvbHMKLVNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBoYXZlIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBjb21tb24gc3ltYm9sLiAgRm9yCi1leGFtcGxlLCB0aGUgTUlQUyBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IGRpc3Rpbmd1aXNoZXMgc3RhbmRhcmQgY29tbW9uCi1zeW1ib2xzIGFuZCBzbWFsbCBjb21tb24gc3ltYm9scy4gIEluIHRoaXMgY2FzZSwgdGhlIGxpbmtlciB3aWxsIHVzZSBhCi1kaWZmZXJlbnQgc3BlY2lhbCBzZWN0aW9uIG5hbWUgZm9yIG90aGVyIHR5cGVzIG9mIGNvbW1vbiBzeW1ib2xzLiAgSW4KLXRoZSBjYXNlIG9mIE1JUFMgRUxGLCB0aGUgbGlua2VyIHVzZXMgQHNhbXB7Q09NTU9OfSBmb3Igc3RhbmRhcmQgY29tbW9uCi1zeW1ib2xzIGFuZCBAc2FtcHsuc2NvbW1vbn0gZm9yIHNtYWxsIGNvbW1vbiBzeW1ib2xzLiAgVGhpcyBwZXJtaXRzIHlvdQotdG8gbWFwIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY29tbW9uIHN5bWJvbHMgaW50byBtZW1vcnkgYXQgZGlmZmVyZW50Ci1sb2NhdGlvbnMuCi0KLUBjaW5kZXggW0NPTU1PTl0KLVlvdSB3aWxsIHNvbWV0aW1lcyBzZWUgQHNhbXB7W0NPTU1PTl19IGluIG9sZCBsaW5rZXIgc2NyaXB0cy4gIFRoaXMKLW5vdGF0aW9uIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiAgSXQgaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7KihDT01NT04pfS4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBLZWVwCi1Ac3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KLUBjaW5kZXggS0VFUAotQGNpbmRleCBnYXJiYWdlIGNvbGxlY3Rpb24KLVdoZW4gbGluay10aW1lIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBpbiB1c2UgKEBzYW1wey0tZ2Mtc2VjdGlvbnN9KSwKLWl0IGlzIG9mdGVuIHVzZWZ1bCB0byBtYXJrIHNlY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBlbGltaW5hdGVkLiAKLVRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHN1cnJvdW5kaW5nIGFuIGlucHV0IHNlY3Rpb24ncyB3aWxkY2FyZCBlbnRyeQotd2l0aCBAY29kZXtLRUVQKCl9LCBhcyBpbiBAY29kZXtLRUVQKCooLmluaXQpKX0gb3IKLUBjb2Rle0tFRVAoU09SVCgqKSguY3RvcnMpKX0uCi0KLUBub2RlIElucHV0IFNlY3Rpb24gRXhhbXBsZQotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBleGFtcGxlCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgYSBjb21wbGV0ZSBsaW5rZXIgc2NyaXB0LiAgSXQgdGVsbHMgdGhlIGxpbmtlcgotdG8gcmVhZCBhbGwgb2YgdGhlIHNlY3Rpb25zIGZyb20gZmlsZSBAZmlsZXthbGwub30gYW5kIHBsYWNlIHRoZW0gYXQgdGhlCi1zdGFydCBvZiBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXRhfSB3aGljaCBzdGFydHMgYXQgbG9jYXRpb24KLUBzYW1wezB4MTAwMDB9LiAgQWxsIG9mIHNlY3Rpb24gQHNhbXB7LmlucHV0MX0gZnJvbSBmaWxlIEBmaWxle2Zvby5vfQotZm9sbG93cyBpbW1lZGlhdGVseSwgaW4gdGhlIHNhbWUgb3V0cHV0IHNlY3Rpb24uICBBbGwgb2Ygc2VjdGlvbgotQHNhbXB7LmlucHV0Mn0gZnJvbSBAZmlsZXtmb28ub30gZ29lcyBpbnRvIG91dHB1dCBzZWN0aW9uCi1Ac2FtcHtvdXRwdXRifSwgZm9sbG93ZWQgYnkgc2VjdGlvbiBAc2FtcHsuaW5wdXQxfSBmcm9tIEBmaWxle2ZvbzEub30uCi1BbGwgb2YgdGhlIHJlbWFpbmluZyBAc2FtcHsuaW5wdXQxfSBhbmQgQHNhbXB7LmlucHV0Mn0gc2VjdGlvbnMgZnJvbSBhbnkKLWZpbGVzIGFyZSB3cml0dGVuIHRvIG91dHB1dCBzZWN0aW9uIEBzYW1we291dHB1dGN9LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7Ci0gIG91dHB1dGEgMHgxMDAwMCA6Ci0gICAgQHsKLSAgICBhbGwubwotICAgIGZvby5vICguaW5wdXQxKQotICAgIEB9Ci0gIG91dHB1dGIgOgotICAgIEB7Ci0gICAgZm9vLm8gKC5pbnB1dDIpCi0gICAgZm9vMS5vICguaW5wdXQxKQotICAgIEB9Ci0gIG91dHB1dGMgOgotICAgIEB7Ci0gICAgKiguaW5wdXQxKQotICAgICooLmlucHV0MikKLSAgICBAfQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlICAgICAgICAKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGF0YQotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGF0YQotQGNpbmRleCBkYXRhCi1AY2luZGV4IHNlY3Rpb24gZGF0YQotQGNpbmRleCBvdXRwdXQgc2VjdGlvbiBkYXRhCi1Aa2luZGV4IEJZVEUoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggU0hPUlQoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggTE9ORyhAdmFye2V4cHJlc3Npb259KQotQGtpbmRleCBRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Aa2luZGV4IFNRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Zb3UgY2FuIGluY2x1ZGUgZXhwbGljaXQgYnl0ZXMgb2YgZGF0YSBpbiBhbiBvdXRwdXQgc2VjdGlvbiBieSB1c2luZwotQGNvZGV7QllURX0sIEBjb2Rle1NIT1JUfSwgQGNvZGV7TE9OR30sIEBjb2Rle1FVQUR9LCBvciBAY29kZXtTUVVBRH0gYXMKLWFuIG91dHB1dCBzZWN0aW9uIGNvbW1hbmQuICBFYWNoIGtleXdvcmQgaXMgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbiBpbgotcGFyZW50aGVzZXMgcHJvdmlkaW5nIHRoZSB2YWx1ZSB0byBzdG9yZSAoQHB4cmVme0V4cHJlc3Npb25zfSkuICBUaGUKLXZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHN0b3JlZCBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIuCi0KLVRoZSBAY29kZXtCWVRFfSwgQGNvZGV7U0hPUlR9LCBAY29kZXtMT05HfSwgYW5kIEBjb2Rle1FVQUR9IGNvbW1hbmRzCi1zdG9yZSBvbmUsIHR3bywgZm91ciwgYW5kIGVpZ2h0IGJ5dGVzIChyZXNwZWN0aXZlbHkpLiAgQWZ0ZXIgc3RvcmluZyB0aGUKLWJ5dGVzLCB0aGUgbG9jYXRpb24gY291bnRlciBpcyBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1zdG9yZWQuCi0KLUZvciBleGFtcGxlLCB0aGlzIHdpbGwgc3RvcmUgdGhlIGJ5dGUgMSBmb2xsb3dlZCBieSB0aGUgZm91ciBieXRlIHZhbHVlCi1vZiB0aGUgc3ltYm9sIEBzYW1we2FkZHJ9OgotQHNtYWxsZXhhbXBsZQotQllURSgxKQotTE9ORyhhZGRyKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB1c2luZyBhIDY0IGJpdCBob3N0IG9yIHRhcmdldCwgQGNvZGV7UVVBRH0gYW5kIEBjb2Rle1NRVUFEfSBhcmUgdGhlCi1zYW1lOyB0aGV5IGJvdGggc3RvcmUgYW4gOCBieXRlLCBvciA2NCBiaXQsIHZhbHVlLiAgV2hlbiBib3RoIGhvc3QgYW5kCi10YXJnZXQgYXJlIDMyIGJpdHMsIGFuIGV4cHJlc3Npb24gaXMgY29tcHV0ZWQgYXMgMzIgYml0cy4gIEluIHRoaXMgY2FzZQotQGNvZGV7UVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHplcm8gZXh0ZW5kZWQgdG8gNjQgYml0cywgYW5kCi1AY29kZXtTUVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHNpZ24gZXh0ZW5kZWQgdG8gNjQgYml0cy4KLQotSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgaGFzIGFuIGV4cGxpY2l0IGVuZGlhbm5lc3MsCi13aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGF0IGVuZGlhbm5lc3MuCi1XaGVuIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdCBlbmRpYW5uZXNzLCBhcyBpcwotdHJ1ZSBvZiwgZm9yIGV4YW1wbGUsIFMtcmVjb3JkcywgdGhlIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZQotZW5kaWFubmVzcyBvZiB0aGUgZmlyc3QgaW5wdXQgb2JqZWN0IGZpbGUuCi0KLUBraW5kZXggRklMTChAdmFye2V4cHJlc3Npb259KQotQGNpbmRleCBob2xlcywgZmlsbGluZwotQGNpbmRleCB1bnNwZWNpZmllZCBtZW1vcnkKLVlvdSBtYXkgdXNlIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kIHRvIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciB0aGUKLWN1cnJlbnQgc2VjdGlvbi4gIEl0IGlzIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuICBBbnkKLW90aGVyd2lzZSB1bnNwZWNpZmllZCByZWdpb25zIG9mIG1lbW9yeSB3aXRoaW4gdGhlIHNlY3Rpb24gKGZvciBleGFtcGxlLAotZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIGlucHV0IHNlY3Rpb25zKSBhcmUgZmlsbGVkCi13aXRoIHRoZSB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIGV4cHJlc3Npb24sIHJlcGVhdGVkIGFzCi1uZWNlc3NhcnkuICBBIEBjb2Rle0ZJTEx9IHN0YXRlbWVudCBjb3ZlcnMgbWVtb3J5IGxvY2F0aW9ucyBhZnRlciB0aGUKLXBvaW50IGF0IHdoaWNoIGl0IG9jY3VycyBpbiB0aGUgc2VjdGlvbiBkZWZpbml0aW9uOyBieSBpbmNsdWRpbmcgbW9yZQotdGhhbiBvbmUgQGNvZGV7RklMTH0gc3RhdGVtZW50LCB5b3UgY2FuIGhhdmUgZGlmZmVyZW50IGZpbGwgcGF0dGVybnMgaW4KLWRpZmZlcmVudCBwYXJ0cyBvZiBhbiBvdXRwdXQgc2VjdGlvbi4KLQotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBmaWxsIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5IHdpdGggdGhlCi12YWx1ZSBAc2FtcHsweDkwOTB9OgotQHNtYWxsZXhhbXBsZQotRklMTCgweDkwOTApCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQGNvZGV7RklMTH0gY29tbWFuZCBpcyBzaW1pbGFyIHRvIHRoZSBAc2FtcHs9QHZhcntmaWxsZXhwfX0gb3V0cHV0Ci1zZWN0aW9uIGF0dHJpYnV0ZSAoQHB4cmVme091dHB1dCBTZWN0aW9uIEZpbGx9KSwgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUKLXBhcnQgb2YgdGhlIHNlY3Rpb24gZm9sbG93aW5nIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKLWVudGlyZSBzZWN0aW9uLiAgSWYgYm90aCBhcmUgdXNlZCwgdGhlIEBjb2Rle0ZJTEx9IGNvbW1hbmQgdGFrZXMKLXByZWNlZGVuY2UuCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEtleXdvcmRzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcwotVGhlcmUgYXJlIGEgY291cGxlIG9mIGtleXdvcmRzIHdoaWNoIGNhbiBhcHBlYXIgYXMgb3V0cHV0IHNlY3Rpb24KLWNvbW1hbmRzLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi1AY2luZGV4IGlucHV0IGZpbGVuYW1lIHN5bWJvbHMKLUBjaW5kZXggZmlsZW5hbWUgc3ltYm9scwotQGl0ZW0gQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi1UaGUgY29tbWFuZCB0ZWxscyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHN5bWJvbCBmb3IgZWFjaCBpbnB1dCBmaWxlLgotVGhlIG5hbWUgb2YgZWFjaCBzeW1ib2wgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dAotZmlsZS4gIFRoZSBzZWN0aW9uIG9mIGVhY2ggc3ltYm9sIHdpbGwgYmUgdGhlIG91dHB1dCBzZWN0aW9uIGluIHdoaWNoCi10aGUgQGNvZGV7Q1JFQVRFX09CSkVDVF9TWU1CT0xTfSBjb21tYW5kIGFwcGVhcnMuCi0KLVRoaXMgaXMgY29udmVudGlvbmFsIGZvciB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgSXQgaXMgbm90Ci1ub3JtYWxseSB1c2VkIGZvciBhbnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi1Aa2luZGV4IENPTlNUUlVDVE9SUwotQGNpbmRleCBDKysgY29uc3RydWN0b3JzLCBhcnJhbmdpbmcgaW4gbGluawotQGNpbmRleCBjb25zdHJ1Y3RvcnMsIGFycmFuZ2luZyBpbiBsaW5rCi1AaXRlbSBDT05TVFJVQ1RPUlMKLVdoZW4gbGlua2luZyB1c2luZyB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LCB0aGUgbGlua2VyIHVzZXMgYW4KLXVudXN1YWwgc2V0IGNvbnN0cnVjdCB0byBzdXBwb3J0IEMrKyBnbG9iYWwgY29uc3RydWN0b3JzIGFuZAotZGVzdHJ1Y3RvcnMuICBXaGVuIGxpbmtpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3Qgc3VwcG9ydAotYXJiaXRyYXJ5IHNlY3Rpb25zLCBzdWNoIGFzIEVDT0ZGIGFuZCBYQ09GRiwgdGhlIGxpbmtlciB3aWxsCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZS4KLUZvciB0aGVzZSBvYmplY3QgZmlsZSBmb3JtYXRzLCB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfSBjb21tYW5kIHRlbGxzIHRoZQotbGlua2VyIHRvIHBsYWNlIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB3aGVyZSB0aGUKLUBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBhcHBlYXJzLiAgVGhlIEBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBpcwotaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotVGhlIHN5bWJvbCBAd3tAY29kZXtfX0NUT1JfTElTVF9ffX0gbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwKLWNvbnN0cnVjdG9ycywgYW5kIHRoZSBzeW1ib2wgQHd7QGNvZGV7X19EVE9SX0xJU1R9fSBtYXJrcyB0aGUgZW5kLiAgVGhlCi1maXJzdCB3b3JkIGluIHRoZSBsaXN0IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcywgZm9sbG93ZWQgYnkgdGhlIGFkZHJlc3MKLW9mIGVhY2ggY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciwgZm9sbG93ZWQgYnkgYSB6ZXJvIHdvcmQuICBUaGUKLWNvbXBpbGVyIG11c3QgYXJyYW5nZSB0byBhY3R1YWxseSBydW4gdGhlIGNvZGUuICBGb3IgdGhlc2Ugb2JqZWN0IGZpbGUKLWZvcm1hdHMgQHNje2dudX0gQysrIG5vcm1hbGx5IGNhbGxzIGNvbnN0cnVjdG9ycyBmcm9tIGEgc3Vicm91dGluZQotQGNvZGV7X19tYWlufTsgYSBjYWxsIHRvIEBjb2Rle19fbWFpbn0gaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvCi10aGUgc3RhcnR1cCBjb2RlIGZvciBAY29kZXttYWlufS4gIEBzY3tnbnV9IEMrKyBub3JtYWxseSBydW5zCi1kZXN0cnVjdG9ycyBlaXRoZXIgYnkgdXNpbmcgQGNvZGV7YXRleGl0fSwgb3IgZGlyZWN0bHkgZnJvbSB0aGUgZnVuY3Rpb24KLUBjb2Rle2V4aXR9LgotCi1Gb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBzdWNoIGFzIEBjb2Rle0NPRkZ9IG9yIEBjb2Rle0VMRn0gd2hpY2ggc3VwcG9ydAotYXJiaXRyYXJ5IHNlY3Rpb24gbmFtZXMsIEBzY3tnbnV9IEMrKyB3aWxsIG5vcm1hbGx5IGFycmFuZ2UgdG8gcHV0IHRoZQotYWRkcmVzc2VzIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGludG8gdGhlIEBjb2Rley5jdG9yc30KLWFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLiAgUGxhY2luZyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGludG8geW91cgotbGlua2VyIHNjcmlwdCB3aWxsIGJ1aWxkIHRoZSBzb3J0IG9mIHRhYmxlIHdoaWNoIHRoZSBAc2N7Z251fSBDKysKLXJ1bnRpbWUgY29kZSBleHBlY3RzIHRvIHNlZS4KLQotQHNtYWxsZXhhbXBsZQotICAgICAgX19DVE9SX0xJU1RfXyA9IC47Ci0gICAgICBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKQotICAgICAgKiguY3RvcnMpCi0gICAgICBMT05HKDApCi0gICAgICBfX0NUT1JfRU5EX18gPSAuOwotICAgICAgX19EVE9SX0xJU1RfXyA9IC47Ci0gICAgICBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKQotICAgICAgKiguZHRvcnMpCi0gICAgICBMT05HKDApCi0gICAgICBfX0RUT1JfRU5EX18gPSAuOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IGFyZSB1c2luZyB0aGUgQHNje2dudX0gQysrIHN1cHBvcnQgZm9yIGluaXRpYWxpemF0aW9uIHByaW9yaXR5LAotd2hpY2ggcHJvdmlkZXMgc29tZSBjb250cm9sIG92ZXIgdGhlIG9yZGVyIGluIHdoaWNoIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLWFyZSBydW4sIHlvdSBtdXN0IHNvcnQgdGhlIGNvbnN0cnVjdG9ycyBhdCBsaW5rIHRpbWUgdG8gZW5zdXJlIHRoYXQgdGhleQotYXJlIGV4ZWN1dGVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgV2hlbiB1c2luZyB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfQotY29tbWFuZCwgdXNlIEBzYW1we1NPUlQoQ09OU1RSVUNUT1JTKX0gaW5zdGVhZC4gIFdoZW4gdXNpbmcgdGhlCi1AY29kZXsuY3RvcnN9IGFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLCB1c2UgQHNhbXB7KihTT1JUKC5jdG9ycykpfSBhbmQKLUBzYW1weyooU09SVCguZHRvcnMpKX0gaW5zdGVhZCBvZiBqdXN0IEBzYW1weyooLmN0b3JzKX0gYW5kCi1Ac2FtcHsqKC5kdG9ycyl9LgotCi1Ob3JtYWxseSB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciB3aWxsIGhhbmRsZSB0aGVzZSBpc3N1ZXMgYXV0b21hdGljYWxseSwKLWFuZCB5b3Ugd2lsbCBub3QgbmVlZCB0byBjb25jZXJuIHlvdXJzZWxmIHdpdGggdGhlbS4gIEhvd2V2ZXIsIHlvdSBtYXkKLW5lZWQgdG8gY29uc2lkZXIgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgd3JpdGluZyB5b3VyIG93biBsaW5rZXIKLXNjcmlwdHMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGlzY2FyZGluZwotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZwotQGNpbmRleCBkaXNjYXJkaW5nIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zLCBkaXNjYXJkaW5nCi1AY2luZGV4IHJlbW92aW5nIHNlY3Rpb25zCi1UaGUgbGlua2VyIHdpbGwgbm90IGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiB3aGljaCBkbyBub3QgaGF2ZSBhbnkKLWNvbnRlbnRzLiAgVGhpcyBpcyBmb3IgY29udmVuaWVuY2Ugd2hlbiByZWZlcnJpbmcgdG8gaW5wdXQgc2VjdGlvbnMgdGhhdAotbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCBpbiBhbnkgb2YgdGhlIGlucHV0IGZpbGVzLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0uZm9vIEB7ICooLmZvbykgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgb25seSBjcmVhdGUgYSBAc2FtcHsuZm9vfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSBpZiB0aGVyZSBpcyBhCi1Ac2FtcHsuZm9vfSBzZWN0aW9uIGluIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlLgotCi1JZiB5b3UgdXNlIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBhcyBhbiBvdXRwdXQKLXNlY3Rpb24gY29tbWFuZCwgc3VjaCBhcyBhIHN5bWJvbCBhc3NpZ25tZW50LCB0aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgotd2lsbCBhbHdheXMgYmUgY3JlYXRlZCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgaW5wdXQgc2VjdGlvbnMuCi0KLUBjaW5kZXggL0RJU0NBUkQvCi1UaGUgc3BlY2lhbCBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gbWF5IGJlIHVzZWQgdG8gZGlzY2FyZAotaW5wdXQgc2VjdGlvbnMuICBBbnkgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFuIG91dHB1dAotc2VjdGlvbiBuYW1lZCBAc2FtcHsvRElTQ0FSRC99IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGVzCi1AY2luZGV4IG91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZXMKLVdlIHNob3dlZCBhYm92ZSB0aGF0IHRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tlZAotbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwIAotQHZhcntzZWN0aW9ufSBbQHZhcnthZGRyZXNzfV0gWyhAdmFye3R5cGV9KV0gOiBbQVQoQHZhcntsbWF9KV0KLSAgQHsKLSAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfSA6QHZhcntwaGRyfSBAZG90c3t9XSBbPUB2YXJ7ZmlsbGV4cH1dCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotV2UndmUgYWxyZWFkeSBkZXNjcmliZWQgQHZhcntzZWN0aW9ufSwgQHZhcnthZGRyZXNzfSwgYW5kCi1AdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9LiAgSW4gdGhpcyBzZWN0aW9uIHdlIHdpbGwgZGVzY3JpYmUgdGhlCi1yZW1haW5pbmcgc2VjdGlvbiBhdHRyaWJ1dGVzLgotCi1AbWVudSAKLSogT3V0cHV0IFNlY3Rpb24gVHlwZTo6CQlPdXRwdXQgc2VjdGlvbiB0eXBlCi0qIE91dHB1dCBTZWN0aW9uIExNQTo6CQlPdXRwdXQgc2VjdGlvbiBMTUEKLSogT3V0cHV0IFNlY3Rpb24gUmVnaW9uOjoJT3V0cHV0IHNlY3Rpb24gcmVnaW9uCi0qIE91dHB1dCBTZWN0aW9uIFBoZHI6OgkJT3V0cHV0IHNlY3Rpb24gcGhkcgotKiBPdXRwdXQgU2VjdGlvbiBGaWxsOjoJCU91dHB1dCBzZWN0aW9uIGZpbGwKLUBlbmQgbWVudQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBUeXBlCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiB0eXBlCi1FYWNoIG91dHB1dCBzZWN0aW9uIG1heSBoYXZlIGEgdHlwZS4gIFRoZSB0eXBlIGlzIGEga2V5d29yZCBpbgotcGFyZW50aGVzZXMuICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBkZWZpbmVkOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIE5PTE9BRAotVGhlIHNlY3Rpb24gc2hvdWxkIGJlIG1hcmtlZCBhcyBub3QgbG9hZGFibGUsIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUKLWxvYWRlZCBpbnRvIG1lbW9yeSB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bi4KLUBpdGVtIERTRUNUCi1AaXRlbXggQ09QWQotQGl0ZW14IElORk8KLUBpdGVteCBPVkVSTEFZCi1UaGVzZSB0eXBlIG5hbWVzIGFyZSBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGFuZCBhcmUKLXJhcmVseSB1c2VkLiAgVGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3Q6IHRoZSBzZWN0aW9uIHNob3VsZCBiZQotbWFya2VkIGFzIG5vdCBhbGxvY2F0YWJsZSwgc28gdGhhdCBubyBtZW1vcnkgaXMgYWxsb2NhdGVkIGZvciB0aGUKLXNlY3Rpb24gd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4uCi1AZW5kIHRhYmxlCi0KLUBraW5kZXggTk9MT0FECi1AY2luZGV4IHByZXZlbnQgdW5uZWNlc3NhcnkgbG9hZGluZwotQGNpbmRleCBsb2FkaW5nLCBwcmV2ZW50aW5nCi1UaGUgbGlua2VyIG5vcm1hbGx5IHNldHMgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb3V0cHV0IHNlY3Rpb24gYmFzZWQgb24KLXRoZSBpbnB1dCBzZWN0aW9ucyB3aGljaCBtYXAgaW50byBpdC4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSB1c2luZwotdGhlIHNlY3Rpb24gdHlwZS4gIEZvciBleGFtcGxlLCBpbiB0aGUgc2NyaXB0IHNhbXBsZSBiZWxvdywgdGhlCi1Ac2FtcHtST019IHNlY3Rpb24gaXMgYWRkcmVzc2VkIGF0IG1lbW9yeSBsb2NhdGlvbiBAc2FtcHswfSBhbmQgZG9lcyBub3QKLW5lZWQgdG8gYmUgbG9hZGVkIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZQotQHNhbXB7Uk9NfSBzZWN0aW9uIHdpbGwgYXBwZWFyIGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUgYXMgdXN1YWwuCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7Ci0gIFJPTSAwIChOT0xPQUQpIDogQHsgQGRvdHN7fSBAfQotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gTE1BCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBMTUEKLUBraW5kZXggQVQoQHZhcntsbWF9KQotQGNpbmRleCBsb2FkIGFkZHJlc3MKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MKLUV2ZXJ5IHNlY3Rpb24gaGFzIGEgdmlydHVhbCBhZGRyZXNzIChWTUEpIGFuZCBhIGxvYWQgYWRkcmVzcyAoTE1BKTsgc2VlCi1AcmVme0Jhc2ljIFNjcmlwdCBDb25jZXB0c30uICBUaGUgYWRkcmVzcyBleHByZXNzaW9uIHdoaWNoIG1heSBhcHBlYXIgaW4KLWFuIG91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIHNldHMgdGhlIFZNQSAoQHB4cmVme091dHB1dCBTZWN0aW9uCi1BZGRyZXNzfSkuCi0KLVRoZSBsaW5rZXIgd2lsbCBub3JtYWxseSBzZXQgdGhlIExNQSBlcXVhbCB0byB0aGUgVk1BLiAgWW91IGNhbiBjaGFuZ2UKLXRoYXQgYnkgdXNpbmcgdGhlIEBjb2Rle0FUfSBrZXl3b3JkLiAgVGhlIGV4cHJlc3Npb24gQHZhcntsbWF9IHRoYXQKLWZvbGxvd3MgdGhlIEBjb2Rle0FUfSBrZXl3b3JkIHNwZWNpZmllcyB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uLgotCi1AY2luZGV4IFJPTSBpbml0aWFsaXplZCBkYXRhCi1AY2luZGV4IGluaXRpYWxpemVkIGRhdGEgaW4gUk9NCi1UaGlzIGZlYXR1cmUgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGJ1aWxkIGEgUk9NIGltYWdlLiAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIGxpbmtlciBzY3JpcHQgY3JlYXRlcyB0aHJlZSBvdXRwdXQgc2VjdGlvbnM6IG9uZQotY2FsbGVkIEBzYW1wey50ZXh0fSwgd2hpY2ggc3RhcnRzIGF0IEBjb2RlezB4MTAwMH0sIG9uZSBjYWxsZWQKLUBzYW1wey5tZGF0YX0sIHdoaWNoIGlzIGxvYWRlZCBhdCB0aGUgZW5kIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbgotZXZlbiB0aG91Z2ggaXRzIFZNQSBpcyBAY29kZXsweDIwMDB9LCBhbmQgb25lIGNhbGxlZCBAc2FtcHsuYnNzfSB0byBob2xkCi11bmluaXRpYWxpemVkIGRhdGEgYXQgYWRkcmVzcyBAY29kZXsweDMwMDB9LiAgVGhlIHN5bWJvbCBAY29kZXtfZGF0YX0gaXMKLWRlZmluZWQgd2l0aCB0aGUgdmFsdWUgQGNvZGV7MHgyMDAwfSwgd2hpY2ggc2hvd3MgdGhhdCB0aGUgbG9jYXRpb24KLWNvdW50ZXIgaG9sZHMgdGhlIFZNQSB2YWx1ZSwgbm90IHRoZSBMTUEgdmFsdWUuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgLnRleHQgMHgxMDAwIDogQHsgKigudGV4dCkgX2V0ZXh0ID0gLiA7IEB9Ci0gIC5tZGF0YSAweDIwMDAgOiAKLSAgICBBVCAoIEFERFIgKC50ZXh0KSArIFNJWkVPRiAoLnRleHQpICkKLSAgICBAeyBfZGF0YSA9IC4gOyAqKC5kYXRhKTsgX2VkYXRhID0gLiA7ICBAfQotICAuYnNzIDB4MzAwMCA6Ci0gICAgQHsgX2JzdGFydCA9IC4gOyAgKiguYnNzKSAqKENPTU1PTikgOyBfYmVuZCA9IC4gO0B9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHJ1bi10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHVzZSB3aXRoIGEgcHJvZ3JhbSBnZW5lcmF0ZWQgd2l0aAotdGhpcyBsaW5rZXIgc2NyaXB0IHdvdWxkIGluY2x1ZGUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgdG8gY29weQotdGhlIGluaXRpYWxpemVkIGRhdGEgZnJvbSB0aGUgUk9NIGltYWdlIHRvIGl0cyBydW50aW1lIGFkZHJlc3MuICBOb3RpY2UKLWhvdyB0aGlzIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIGxpbmtlcgotc2NyaXB0LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWV4dGVybiBjaGFyIF9ldGV4dCwgX2RhdGEsIF9lZGF0YSwgX2JzdGFydCwgX2JlbmQ7Ci1jaGFyICpzcmMgPSAmX2V0ZXh0OwotY2hhciAqZHN0ID0gJl9kYXRhOwotCi0vKiBST00gaGFzIGRhdGEgYXQgZW5kIG9mIHRleHQ7IGNvcHkgaXQuICovCi13aGlsZSAoZHN0IDwgJl9lZGF0YSkgQHsKLSAgKmRzdCsrID0gKnNyYysrOwotQH0KLQotLyogWmVybyBic3MgKi8KLWZvciAoZHN0ID0gJl9ic3RhcnQ7IGRzdDwgJl9iZW5kOyBkc3QrKykKLSAgKmRzdCA9IDA7Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBSZWdpb24KLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHJlZ2lvbgotQGtpbmRleCA+QHZhcntyZWdpb259Ci1AY2luZGV4IHNlY3Rpb24sIGFzc2lnbmluZyB0byBtZW1vcnkgcmVnaW9uCi1AY2luZGV4IG1lbW9yeSByZWdpb25zIGFuZCBzZWN0aW9ucwotWW91IGNhbiBhc3NpZ24gYSBzZWN0aW9uIHRvIGEgcHJldmlvdXNseSBkZWZpbmVkIHJlZ2lvbiBvZiBtZW1vcnkgYnkKLXVzaW5nIEBzYW1wez5AdmFye3JlZ2lvbn19LiAgQHhyZWZ7TUVNT1JZfS4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgQHsgcm9tIDogT1JJR0lOID0gMHgxMDAwLCBMRU5HVEggPSAweDEwMDAgQH0KLVNFQ1RJT05TIEB7IFJPTSA6IEB7ICooLnRleHQpIEB9ID5yb20gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIFBoZHIKLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHBoZHIKLUBraW5kZXggOkB2YXJ7cGhkcn0KLUBjaW5kZXggc2VjdGlvbiwgYXNzaWduaW5nIHRvIHByb2dyYW0gaGVhZGVyCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycyBhbmQgc2VjdGlvbnMKLVlvdSBjYW4gYXNzaWduIGEgc2VjdGlvbiB0byBhIHByZXZpb3VzbHkgZGVmaW5lZCBwcm9ncmFtIHNlZ21lbnQgYnkKLXVzaW5nIEBzYW1wezpAdmFye3BoZHJ9fS4gIEB4cmVme1BIRFJTfS4gIElmIGEgc2VjdGlvbiBpcyBhc3NpZ25lZCB0bwotb25lIG9yIG1vcmUgc2VnbWVudHMsIHRoZW4gYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGVkIHNlY3Rpb25zIHdpbGwgYmUKLWFzc2lnbmVkIHRvIHRob3NlIHNlZ21lbnRzIGFzIHdlbGwsIHVubGVzcyB0aGV5IHVzZSBhbiBleHBsaWNpdGx5Ci1AY29kZXs6QHZhcntwaGRyfX0gbW9kaWZpZXIuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gdGVsbCB0aGUKLWxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueSBzZWdtZW50IGF0IGFsbC4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1QSERSUyBAeyB0ZXh0IFBUX0xPQUQgOyBAfQotU0VDVElPTlMgQHsgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dCBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRmlsbAotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZmlsbAotQGtpbmRleCA9QHZhcntmaWxsZXhwfQotQGNpbmRleCBzZWN0aW9uIGZpbGwgcGF0dGVybgotQGNpbmRleCBmaWxsIHBhdHRlcm4sIGVudGlyZSBzZWN0aW9uCi1Zb3UgY2FuIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciBhbiBlbnRpcmUgc2VjdGlvbiBieSB1c2luZwotQHNhbXB7PUB2YXJ7ZmlsbGV4cH19LiAgQHZhcntmaWxsZXhwfSBpcyBhbiBleHByZXNzaW9uCi0oQHB4cmVme0V4cHJlc3Npb25zfSkuICBBbnkgb3RoZXJ3aXNlIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5Ci13aXRoaW4gdGhlIG91dHB1dCBzZWN0aW9uIChmb3IgZXhhbXBsZSwgZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQKLWFsaWdubWVudCBvZiBpbnB1dCBzZWN0aW9ucykgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvIGxlYXN0Ci1zaWduaWZpY2FudCBieXRlcyBvZiB0aGUgdmFsdWUsIHJlcGVhdGVkIGFzIG5lY2Vzc2FyeS4KLQotWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgZmlsbCB2YWx1ZSB3aXRoIGEgQGNvZGV7RklMTH0gY29tbWFuZCBpbiB0aGUKLW91dHB1dCBzZWN0aW9uIGNvbW1hbmRzOyBzZWUgQHJlZntPdXRwdXQgU2VjdGlvbiBEYXRhfS4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAeyAudGV4dCA6IEB7ICooLnRleHQpIEB9ID0weDkwOTAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE92ZXJsYXkgRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIE92ZXJsYXkgZGVzY3JpcHRpb24KLUBraW5kZXggT1ZFUkxBWQotQGNpbmRleCBvdmVybGF5cwotQW4gb3ZlcmxheSBkZXNjcmlwdGlvbiBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBkZXNjcmliZSBzZWN0aW9ucyB3aGljaAotYXJlIHRvIGJlIGxvYWRlZCBhcyBwYXJ0IG9mIGEgc2luZ2xlIG1lbW9yeSBpbWFnZSBidXQgYXJlIHRvIGJlIHJ1biBhdAotdGhlIHNhbWUgbWVtb3J5IGFkZHJlc3MuICBBdCBydW4gdGltZSwgc29tZSBzb3J0IG9mIG92ZXJsYXkgbWFuYWdlciB3aWxsCi1jb3B5IHRoZSBvdmVybGFpZCBzZWN0aW9ucyBpbiBhbmQgb3V0IG9mIHRoZSBydW50aW1lIG1lbW9yeSBhZGRyZXNzIGFzCi1yZXF1aXJlZCwgcGVyaGFwcyBieSBzaW1wbHkgbWFuaXB1bGF0aW5nIGFkZHJlc3NpbmcgYml0cy4gIFRoaXMgYXBwcm9hY2gKLWNhbiBiZSB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIGEgY2VydGFpbiByZWdpb24gb2YgbWVtb3J5IGlzIGZhc3RlcgotdGhhbiBhbm90aGVyLgotCi1PdmVybGF5cyBhcmUgZGVzY3JpYmVkIHVzaW5nIHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kLiAgVGhlCi1AY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIHVzZWQgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQsIGxpa2UgYW4KLW91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uLiAgVGhlIGZ1bGwgc3ludGF4IG9mIHRoZSBAY29kZXtPVkVSTEFZfQotY29tbWFuZCBpcyBhcyBmb2xsb3dzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1PVkVSTEFZIFtAdmFye3N0YXJ0fV0gOiBbTk9DUk9TU1JFRlNdIFtBVCAoIEB2YXJ7bGRhZGRyfSApXQotICBAewotICAgIEB2YXJ7c2VjbmFtZTF9Ci0gICAgICBAewotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQGRvdHN7fQotICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotICAgIEB2YXJ7c2VjbmFtZTJ9Ci0gICAgICBAewotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQGRvdHN7fQotICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfUBkb3Rze31dIFs9QHZhcntmaWxsfV0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUV2ZXJ5dGhpbmcgaXMgb3B0aW9uYWwgZXhjZXB0IEBjb2Rle09WRVJMQVl9IChhIGtleXdvcmQpLCBhbmQgZWFjaAotc2VjdGlvbiBtdXN0IGhhdmUgYSBuYW1lIChAdmFye3NlY25hbWUxfSBhbmQgQHZhcntzZWNuYW1lMn0gYWJvdmUpLiAgVGhlCi1zZWN0aW9uIGRlZmluaXRpb25zIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0gY29uc3RydWN0IGFyZSBpZGVudGljYWwgdG8KLXRob3NlIHdpdGhpbiB0aGUgZ2VuZXJhbCBAY29kZXtTRUNUSU9OU30gY29udHJ1Y3QgKEBweHJlZntTRUNUSU9OU30pLAotZXhjZXB0IHRoYXQgbm8gYWRkcmVzc2VzIGFuZCBubyBtZW1vcnkgcmVnaW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IKLXNlY3Rpb25zIHdpdGhpbiBhbiBAY29kZXtPVkVSTEFZfS4KLQotVGhlIHNlY3Rpb25zIGFyZSBhbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHN0YXJ0aW5nIGFkZHJlc3MuICBUaGUgbG9hZAotYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyBhcmUgYXJyYW5nZWQgc3VjaCB0aGF0IHRoZXkgYXJlIGNvbnNlY3V0aXZlIGluCi1tZW1vcnkgc3RhcnRpbmcgYXQgdGhlIGxvYWQgYWRkcmVzcyB1c2VkIGZvciB0aGUgQGNvZGV7T1ZFUkxBWX0gYXMgYQotd2hvbGUgKGFzIHdpdGggbm9ybWFsIHNlY3Rpb24gZGVmaW5pdGlvbnMsIHRoZSBsb2FkIGFkZHJlc3MgaXMgb3B0aW9uYWwsCi1hbmQgZGVmYXVsdHMgdG8gdGhlIHN0YXJ0IGFkZHJlc3M7IHRoZSBzdGFydCBhZGRyZXNzIGlzIGFsc28gb3B0aW9uYWwsCi1hbmQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIpLgotCi1JZiB0aGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGtleXdvcmQgaXMgdXNlZCwgYW5kIHRoZXJlIGFueSByZWZlcmVuY2VzCi1hbW9uZyB0aGUgc2VjdGlvbnMsIHRoZSBsaW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuICBTaW5jZSB0aGUgc2VjdGlvbnMKLWFsbCBydW4gYXQgdGhlIHNhbWUgYWRkcmVzcywgaXQgbm9ybWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3Igb25lCi1zZWN0aW9uIHRvIHJlZmVyIGRpcmVjdGx5IHRvIGFub3RoZXIuICBAeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzLAotTk9DUk9TU1JFRlN9LgotCi1Gb3IgZWFjaCBzZWN0aW9uIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0sIHRoZSBsaW5rZXIgYXV0b21hdGljYWxseQotZGVmaW5lcyB0d28gc3ltYm9scy4gIFRoZSBzeW1ib2wgQGNvZGV7X19sb2FkX3N0YXJ0X0B2YXJ7c2VjbmFtZX19IGlzCi1kZWZpbmVkIGFzIHRoZSBzdGFydGluZyBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24uICBUaGUgc3ltYm9sCi1AY29kZXtfX2xvYWRfc3RvcF9AdmFye3NlY25hbWV9fSBpcyBkZWZpbmVkIGFzIHRoZSBmaW5hbCBsb2FkIGFkZHJlc3Mgb2YKLXRoZSBzZWN0aW9uLiAgQW55IGNoYXJhY3RlcnMgd2l0aGluIEB2YXJ7c2VjbmFtZX0gd2hpY2ggYXJlIG5vdCBsZWdhbAotd2l0aGluIEMgaWRlbnRpZmllcnMgYXJlIHJlbW92ZWQuICBDIChvciBhc3NlbWJsZXIpIGNvZGUgbWF5IHVzZSB0aGVzZQotc3ltYm9scyB0byBtb3ZlIHRoZSBvdmVybGFpZCBzZWN0aW9ucyBhcm91bmQgYXMgbmVjZXNzYXJ5LgotCi1BdCB0aGUgZW5kIG9mIHRoZSBvdmVybGF5LCB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgc2V0IHRvCi10aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgb3ZlcmxheSBwbHVzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IHNlY3Rpb24uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZS4gIFJlbWVtYmVyIHRoYXQgdGhpcyB3b3VsZCBhcHBlYXIgaW5zaWRlIGEKLUBjb2Rle1NFQ1RJT05TfSBjb25zdHJ1Y3QuCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLSAgT1ZFUkxBWSAweDEwMDAgOiBBVCAoMHg0MDAwKQotICAgQHsKLSAgICAgLnRleHQwIEB7IG8xLyoubygudGV4dCkgQH0KLSAgICAgLnRleHQxIEB7IG8yLyoubygudGV4dCkgQH0KLSAgIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHdpbGwgZGVmaW5lIGJvdGggQHNhbXB7LnRleHQwfSBhbmQgQHNhbXB7LnRleHQxfSB0byBzdGFydCBhdAotYWRkcmVzcyAweDEwMDAuICBAc2FtcHsudGV4dDB9IHdpbGwgYmUgbG9hZGVkIGF0IGFkZHJlc3MgMHg0MDAwLCBhbmQKLUBzYW1wey50ZXh0MX0gd2lsbCBiZSBsb2FkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgQHNhbXB7LnRleHQwfS4gIFRoZQotZm9sbG93aW5nIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkOiBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDB9LAotQGNvZGV7X19sb2FkX3N0b3BfdGV4dDB9LCBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDF9LAotQGNvZGV7X19sb2FkX3N0b3BfdGV4dDF9LgotCi1DIGNvZGUgdG8gY29weSBvdmVybGF5IEBjb2Rley50ZXh0MX0gaW50byB0aGUgb3ZlcmxheSBhcmVhIG1pZ2h0IGxvb2sKLWxpa2UgdGhlIGZvbGxvd2luZy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi0gIGV4dGVybiBjaGFyIF9fbG9hZF9zdGFydF90ZXh0MSwgX19sb2FkX3N0b3BfdGV4dDE7Ci0gIG1lbWNweSAoKGNoYXIgKikgMHgxMDAwLCAmX19sb2FkX3N0YXJ0X3RleHQxLAotICAgICAgICAgICZfX2xvYWRfc3RvcF90ZXh0MSAtICZfX2xvYWRfc3RhcnRfdGV4dDEpOwotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm90ZSB0aGF0IHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIGp1c3Qgc3ludGFjdGljIHN1Z2FyLCBzaW5jZQotZXZlcnl0aGluZyBpdCBkb2VzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBtb3JlIGJhc2ljIGNvbW1hbmRzLiAgVGhlIGFib3ZlCi1leGFtcGxlIGNvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGlkZW50aWNhbGx5IGFzIGZvbGxvd3MuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotICAudGV4dDAgMHgxMDAwIDogQVQgKDB4NDAwMCkgQHsgbzEvKi5vKC50ZXh0KSBAfQotICBfX2xvYWRfc3RhcnRfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKTsKLSAgX19sb2FkX3N0b3BfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKSArIFNJWkVPRiAoLnRleHQwKTsKLSAgLnRleHQxIDB4MTAwMCA6IEFUICgweDQwMDAgKyBTSVpFT0YgKC50ZXh0MCkpIEB7IG8yLyoubygudGV4dCkgQH0KLSAgX19sb2FkX3N0YXJ0X3RleHQxID0gTE9BREFERFIgKC50ZXh0MSk7Ci0gIF9fbG9hZF9zdG9wX3RleHQxID0gTE9BREFERFIgKC50ZXh0MSkgKyBTSVpFT0YgKC50ZXh0MSk7Ci0gIC4gPSAweDEwMDAgKyBNQVggKFNJWkVPRiAoLnRleHQwKSwgU0laRU9GICgudGV4dDEpKTsKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE1FTU9SWQotQHNlY3Rpb24gTUVNT1JZIGNvbW1hbmQKLUBraW5kZXggTUVNT1JZCi1AY2luZGV4IG1lbW9yeSByZWdpb25zCi1AY2luZGV4IHJlZ2lvbnMgb2YgbWVtb3J5Ci1AY2luZGV4IGFsbG9jYXRpbmcgbWVtb3J5Ci1AY2luZGV4IGRpc2NvbnRpbnVvdXMgbWVtb3J5Ci1UaGUgbGlua2VyJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBlcm1pdHMgYWxsb2NhdGlvbiBvZiBhbGwgYXZhaWxhYmxlCi1tZW1vcnkuICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgdGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZC4KLQotVGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZCBkZXNjcmliZXMgdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIGJsb2NrcyBvZgotbWVtb3J5IGluIHRoZSB0YXJnZXQuICBZb3UgY2FuIHVzZSBpdCB0byBkZXNjcmliZSB3aGljaCBtZW1vcnkgcmVnaW9ucwotbWF5IGJlIHVzZWQgYnkgdGhlIGxpbmtlciwgYW5kIHdoaWNoIG1lbW9yeSByZWdpb25zIGl0IG11c3QgYXZvaWQuICBZb3UKLWNhbiB0aGVuIGFzc2lnbiBzZWN0aW9ucyB0byBwYXJ0aWN1bGFyIG1lbW9yeSByZWdpb25zLiAgVGhlIGxpbmtlciB3aWxsCi1zZXQgc2VjdGlvbiBhZGRyZXNzZXMgYmFzZWQgb24gdGhlIG1lbW9yeSByZWdpb25zLCBhbmQgd2lsbCB3YXJuIGFib3V0Ci1yZWdpb25zIHRoYXQgYmVjb21lIHRvbyBmdWxsLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzaHVmZmxlIHNlY3Rpb25zCi1hcm91bmQgdG8gZml0IGludG8gdGhlIGF2YWlsYWJsZSByZWdpb25zLgotCi1BIGxpbmtlciBzY3JpcHQgbWF5IGNvbnRhaW4gYXQgbW9zdCBvbmUgdXNlIG9mIHRoZSBAY29kZXtNRU1PUll9Ci1jb21tYW5kLiAgSG93ZXZlciwgeW91IGNhbiBkZWZpbmUgYXMgbWFueSBibG9ja3Mgb2YgbWVtb3J5IHdpdGhpbiBpdCBhcwoteW91IHdpc2guICBUaGUgc3ludGF4IGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgCi0gIEB7Ci0gICAgQHZhcntuYW1lfSBbKEB2YXJ7YXR0cn0pXSA6IE9SSUdJTiA9IEB2YXJ7b3JpZ2lufSwgTEVOR1RIID0gQHZhcntsZW59Ci0gICAgQGRvdHN7fQotICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEB2YXJ7bmFtZX0gaXMgYSBuYW1lIHVzZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQgdG8gcmVmZXIgdG8gdGhlCi1yZWdpb24uICBUaGUgcmVnaW9uIG5hbWUgaGFzIG5vIG1lYW5pbmcgb3V0c2lkZSBvZiB0aGUgbGlua2VyIHNjcmlwdC4KLVJlZ2lvbiBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgbmFtZSBzcGFjZSwgYW5kIHdpbGwgbm90IGNvbmZsaWN0Ci13aXRoIHN5bWJvbCBuYW1lcywgZmlsZSBuYW1lcywgb3Igc2VjdGlvbiBuYW1lcy4gIEVhY2ggbWVtb3J5IHJlZ2lvbgotbXVzdCBoYXZlIGEgZGlzdGluY3QgbmFtZS4KLQotQGNpbmRleCBtZW1vcnkgcmVnaW9uIGF0dHJpYnV0ZXMKLVRoZSBAdmFye2F0dHJ9IHN0cmluZyBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzcGVjaWZ5Ci13aGV0aGVyIHRvIHVzZSBhIHBhcnRpY3VsYXIgbWVtb3J5IHJlZ2lvbiBmb3IgYW4gaW5wdXQgc2VjdGlvbiB3aGljaCBpcwotbm90IGV4cGxpY2l0bHkgbWFwcGVkIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgQXMgZGVzY3JpYmVkIGluCi1AcmVme1NFQ1RJT05TfSwgaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIG91dHB1dCBzZWN0aW9uIGZvciBzb21lIGlucHV0Ci1zZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgY3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotdGhlIGlucHV0IHNlY3Rpb24uICBJZiB5b3UgZGVmaW5lIHJlZ2lvbiBhdHRyaWJ1dGVzLCB0aGUgbGlua2VyIHdpbGwgdXNlCi10aGVtIHRvIHNlbGVjdCB0aGUgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlIG91dHB1dCBzZWN0aW9uIHRoYXQgaXQgY3JlYXRlcy4KLQotVGhlIEB2YXJ7YXR0cn0gc3RyaW5nIG11c3QgY29uc2lzdCBvbmx5IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLUB0YWJsZSBAc2FtcAotQGl0ZW0gUgotUmVhZC1vbmx5IHNlY3Rpb24KLUBpdGVtIFcKLVJlYWQvd3JpdGUgc2VjdGlvbgotQGl0ZW0gWAotRXhlY3V0YWJsZSBzZWN0aW9uCi1AaXRlbSBBCi1BbGxvY2F0YWJsZSBzZWN0aW9uCi1AaXRlbSBJCi1Jbml0aWFsaXplZCBzZWN0aW9uCi1AaXRlbSBMCi1TYW1lIGFzIEBzYW1we0l9Ci1AaXRlbSAhCi1JbnZlcnQgdGhlIHNlbnNlIG9mIGFueSBvZiB0aGUgcHJlY2VkaW5nIGF0dHJpYnV0ZXMKLUBlbmQgdGFibGUKLQotSWYgYSB1bm1hcHBlZCBzZWN0aW9uIG1hdGNoZXMgYW55IG9mIHRoZSBsaXN0ZWQgYXR0cmlidXRlcyBvdGhlciB0aGFuCi1Ac2FtcHshfSwgaXQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG1lbW9yeSByZWdpb24uICBUaGUgQHNhbXB7IX0KLWF0dHJpYnV0ZSByZXZlcnNlcyB0aGlzIHRlc3QsIHNvIHRoYXQgYW4gdW5tYXBwZWQgc2VjdGlvbiB3aWxsIGJlIHBsYWNlZAotaW4gdGhlIG1lbW9yeSByZWdpb24gb25seSBpZiBpdCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIGxpc3RlZAotYXR0cmlidXRlcy4KLQotQGtpbmRleCBPUklHSU4gPQotQGtpbmRleCBvID0KLUBraW5kZXggb3JnID0KLVRoZSBAdmFye29yaWdpbn0gaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQotcmVnaW9uLiAgVGhlIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkKLWFsbG9jYXRpb24gaXMgcGVyZm9ybWVkLCB3aGljaCBtZWFucyB0aGF0IHlvdSBtYXkgbm90IHVzZSBhbnkgc2VjdGlvbgotcmVsYXRpdmUgc3ltYm9scy4gIFRoZSBrZXl3b3JkIEBjb2Rle09SSUdJTn0gbWF5IGJlIGFiYnJldmlhdGVkIHRvCi1AY29kZXtvcmd9IG9yIEBjb2Rle299IChidXQgbm90LCBmb3IgZXhhbXBsZSwgQGNvZGV7T1JHfSkuCi0KLUBraW5kZXggTEVOR1RIID0KLUBraW5kZXggbGVuID0KLUBraW5kZXggbCA9Ci1UaGUgQHZhcntsZW59IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkKLXJlZ2lvbi4gIEFzIHdpdGggdGhlIEB2YXJ7b3JpZ2lufSBleHByZXNzaW9uLCB0aGUgZXhwcmVzc2lvbiBtdXN0Ci1ldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQuICBUaGUKLWtleXdvcmQgQGNvZGV7TEVOR1RIfSBtYXkgYmUgYWJicmV2aWF0ZWQgdG8gQGNvZGV7bGVufSBvciBAY29kZXtsfS4KLQotSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3ZSBzcGVjaWZ5IHRoYXQgdGhlcmUgYXJlIHR3byBtZW1vcnkgcmVnaW9ucwotYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uOiBvbmUgc3RhcnRpbmcgYXQgQHNhbXB7MH0gZm9yIDI1NiBraWxvYnl0ZXMsCi1hbmQgdGhlIG90aGVyIHN0YXJ0aW5nIGF0IEBzYW1wezB4NDAwMDAwMDB9IGZvciBmb3VyIG1lZ2FieXRlcy4gIFRoZQotbGlua2VyIHdpbGwgcGxhY2UgaW50byB0aGUgQHNhbXB7cm9tfSBtZW1vcnkgcmVnaW9uIGV2ZXJ5IHNlY3Rpb24gd2hpY2gKLWlzIG5vdCBleHBsaWNpdGx5IG1hcHBlZCBpbnRvIGEgbWVtb3J5IHJlZ2lvbiwgYW5kIGlzIGVpdGhlciByZWFkLW9ubHkKLW9yIGV4ZWN1dGFibGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2Ugb3RoZXIgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdAotZXhwbGljaXRseSBtYXBwZWQgaW50byBhIG1lbW9yeSByZWdpb24gaW50byB0aGUgQHNhbXB7cmFtfSBtZW1vcnkKLXJlZ2lvbi4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgCi0gIEB7Ci0gICAgcm9tIChyeCkgIDogT1JJR0lOID0gMCwgTEVOR1RIID0gMjU2SwotICAgIHJhbSAoIXJ4KSA6IG9yZyA9IDB4NDAwMDAwMDAsIGwgPSA0TQotICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotT25jZSB5b3UgZGVmaW5lIGEgbWVtb3J5IHJlZ2lvbiwgeW91IGNhbiBkaXJlY3QgdGhlIGxpbmtlciB0byBwbGFjZQotc3BlY2lmaWMgb3V0cHV0IHNlY3Rpb25zIGludG8gdGhhdCBtZW1vcnkgcmVnaW9uIGJ5IHVzaW5nIHRoZQotQHNhbXB7PkB2YXJ7cmVnaW9ufX0gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCi1hIG1lbW9yeSByZWdpb24gbmFtZWQgQHNhbXB7bWVtfSwgeW91IHdvdWxkIHVzZSBAc2FtcHs+bWVtfSBpbiB0aGUKLW91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24uICBAeHJlZntPdXRwdXQgU2VjdGlvbiBSZWdpb259LiAgSWYgbm8gYWRkcmVzcwotd2FzIHNwZWNpZmllZCBmb3IgdGhlIG91dHB1dCBzZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgc2V0IHRoZSBhZGRyZXNzIHRvCi10aGUgbmV4dCBhdmFpbGFibGUgYWRkcmVzcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24uICBJZiB0aGUgY29tYmluZWQKLW91dHB1dCBzZWN0aW9ucyBkaXJlY3RlZCB0byBhIG1lbW9yeSByZWdpb24gYXJlIHRvbyBsYXJnZSBmb3IgdGhlCi1yZWdpb24sIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlLgotCi1Abm9kZSBQSERSUwotQHNlY3Rpb24gUEhEUlMgQ29tbWFuZAotQGtpbmRleCBQSERSUwotQGNpbmRleCBwcm9ncmFtIGhlYWRlcnMKLUBjaW5kZXggRUxGIHByb2dyYW0gaGVhZGVycwotQGNpbmRleCBwcm9ncmFtIHNlZ21lbnRzCi1AY2luZGV4IHNlZ21lbnRzLCBFTEYKLVRoZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZXMgQGRmbntwcm9ncmFtIGhlYWRlcnN9LCBhbHNvIGtub3dzIGFzCi1AZGZue3NlZ21lbnRzfS4gIFRoZSBwcm9ncmFtIGhlYWRlcnMgZGVzY3JpYmUgaG93IHRoZSBwcm9ncmFtIHNob3VsZCBiZQotbG9hZGVkIGludG8gbWVtb3J5LiAgWW91IGNhbiBwcmludCB0aGVtIG91dCBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0KLXByb2dyYW0gd2l0aCB0aGUgQHNhbXB7LXB9IG9wdGlvbi4KLQotV2hlbiB5b3UgcnVuIGFuIEVMRiBwcm9ncmFtIG9uIGEgbmF0aXZlIEVMRiBzeXN0ZW0sIHRoZSBzeXN0ZW0gbG9hZGVyCi1yZWFkcyB0aGUgcHJvZ3JhbSBoZWFkZXJzIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGxvYWQgdGhlCi1wcm9ncmFtLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcHJvZ3JhbSBoZWFkZXJzIGFyZSBzZXQgY29ycmVjdGx5LgotVGhpcyBtYW51YWwgZG9lcyBub3QgZGVzY3JpYmUgdGhlIGRldGFpbHMgb2YgaG93IHRoZSBzeXN0ZW0gbG9hZGVyCi1pbnRlcnByZXRzIHByb2dyYW0gaGVhZGVyczsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgRUxGIEFCSS4KLQotVGhlIGxpbmtlciB3aWxsIGNyZWF0ZSByZWFzb25hYmxlIHByb2dyYW0gaGVhZGVycyBieSBkZWZhdWx0LiAgSG93ZXZlciwKLWluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBwcm9ncmFtIGhlYWRlcnMgbW9yZQotcHJlY2lzZWx5LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGZvciB0aGlzIHB1cnBvc2UuICBXaGVuCi10aGUgbGlua2VyIHNlZXMgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LCBpdCB3aWxsCi1ub3QgY3JlYXRlIGFueSBwcm9ncmFtIGhlYWRlcnMgb3RoZXIgdGhhbiB0aGUgb25lcyBzcGVjaWZpZWQuCi0KLVRoZSBsaW5rZXIgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgQGNvZGV7UEhEUlN9IGNvbW1hbmQgd2hlbgotZ2VuZXJhdGluZyBhbiBFTEYgb3V0cHV0IGZpbGUuICBJbiBvdGhlciBjYXNlcywgdGhlIGxpbmtlciB3aWxsIHNpbXBseQotaWdub3JlIEBjb2Rle1BIRFJTfS4KLQotVGhpcyBpcyB0aGUgc3ludGF4IG9mIHRoZSBAY29kZXtQSERSU30gY29tbWFuZC4gIFRoZSB3b3JkcyBAY29kZXtQSERSU30sCi1AY29kZXtGSUxFSERSfSwgQGNvZGV7QVR9LCBhbmQgQGNvZGV7RkxBR1N9IGFyZSBrZXl3b3Jkcy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1QSERSUwotQHsKLSAgQHZhcntuYW1lfSBAdmFye3R5cGV9IFsgRklMRUhEUiBdIFsgUEhEUlMgXSBbIEFUICggQHZhcnthZGRyZXNzfSApIF0KLSAgICAgICAgWyBGTEFHUyAoIEB2YXJ7ZmxhZ3N9ICkgXSA7Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEB2YXJ7bmFtZX0gaXMgdXNlZCBvbmx5IGZvciByZWZlcmVuY2UgaW4gdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kCi1vZiB0aGUgbGlua2VyIHNjcmlwdC4gIEl0IGlzIG5vdCBwdXQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBQcm9ncmFtCi1oZWFkZXIgbmFtZXMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG5hbWUgc3BhY2UsIGFuZCB3aWxsIG5vdCBjb25mbGljdAotd2l0aCBzeW1ib2wgbmFtZXMsIGZpbGUgbmFtZXMsIG9yIHNlY3Rpb24gbmFtZXMuICBFYWNoIHByb2dyYW0gaGVhZGVyCi1tdXN0IGhhdmUgYSBkaXN0aW5jdCBuYW1lLgotCi1DZXJ0YWluIHByb2dyYW0gaGVhZGVyIHR5cGVzIGRlc2NyaWJlIHNlZ21lbnRzIG9mIG1lbW9yeSB3aGljaCB0aGUKLXN5c3RlbSBsb2FkZXIgd2lsbCBsb2FkIGZyb20gdGhlIGZpbGUuICBJbiB0aGUgbGlua2VyIHNjcmlwdCwgeW91Ci1zcGVjaWZ5IHRoZSBjb250ZW50cyBvZiB0aGVzZSBzZWdtZW50cyBieSBwbGFjaW5nIGFsbG9jYXRhYmxlIG91dHB1dAotc2VjdGlvbnMgaW4gdGhlIHNlZ21lbnRzLiAgWW91IHVzZSB0aGUgQHNhbXB7OkB2YXJ7cGhkcn19IG91dHB1dCBzZWN0aW9uCi1hdHRyaWJ1dGUgdG8gcGxhY2UgYSBzZWN0aW9uIGluIGEgcGFydGljdWxhciBzZWdtZW50LiAgQHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIFBoZHJ9LgotCi1JdCBpcyBub3JtYWwgdG8gcHV0IGNlcnRhaW4gc2VjdGlvbnMgaW4gbW9yZSB0aGFuIG9uZSBzZWdtZW50LiAgVGhpcwotbWVyZWx5IGltcGxpZXMgdGhhdCBvbmUgc2VnbWVudCBvZiBtZW1vcnkgY29udGFpbnMgYW5vdGhlci4gIFlvdSBtYXkKLXJlcGVhdCBAc2FtcHs6QHZhcntwaGRyfX0sIHVzaW5nIGl0IG9uY2UgZm9yIGVhY2ggc2VnbWVudCB3aGljaCBzaG91bGQKLWNvbnRhaW4gdGhlIHNlY3Rpb24uCi0KLUlmIHlvdSBwbGFjZSBhIHNlY3Rpb24gaW4gb25lIG9yIG1vcmUgc2VnbWVudHMgdXNpbmcgQHNhbXB7OkB2YXJ7cGhkcn19LAotdGhlbiB0aGUgbGlua2VyIHdpbGwgcGxhY2UgYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGFibGUgc2VjdGlvbnMgd2hpY2ggZG8KLW5vdCBzcGVjaWZ5IEBzYW1wezpAdmFye3BoZHJ9fSBpbiB0aGUgc2FtZSBzZWdtZW50cy4gIFRoaXMgaXMgZm9yCi1jb252ZW5pZW5jZSwgc2luY2UgZ2VuZXJhbGx5IGEgd2hvbGUgc2V0IG9mIGNvbnRpZ3VvdXMgc2VjdGlvbnMgd2lsbCBiZQotcGxhY2VkIGluIGEgc2luZ2xlIHNlZ21lbnQuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gb3ZlcnJpZGUgdGhlCi1kZWZhdWx0IHNlZ21lbnQgYW5kIHRlbGwgdGhlIGxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueQotc2VnbWVudCBhdCBhbGwuCi0KLUBraW5kZXggRklMRUhEUgotQGtpbmRleCBQSERSUwotWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZJTEVIRFJ9IGFuZCBAY29kZXtQSERSU30ga2V5d29yZHMgYXBwZWFyIGFmdGVyCi10aGUgcHJvZ3JhbSBoZWFkZXIgdHlwZSB0byBmdXJ0aGVyIGRlc2NyaWJlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VnbWVudC4KLVRoZSBAY29kZXtGSUxFSERSfSBrZXl3b3JkIG1lYW5zIHRoYXQgdGhlIHNlZ21lbnQgc2hvdWxkIGluY2x1ZGUgdGhlIEVMRgotZmlsZSBoZWFkZXIuICBUaGUgQGNvZGV7UEhEUlN9IGtleXdvcmQgbWVhbnMgdGhhdCB0aGUgc2VnbWVudCBzaG91bGQKLWluY2x1ZGUgdGhlIEVMRiBwcm9ncmFtIGhlYWRlcnMgdGhlbXNlbHZlcy4KLQotVGhlIEB2YXJ7dHlwZX0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLiAgVGhlIG51bWJlcnMgaW5kaWNhdGUgdGhlCi12YWx1ZSBvZiB0aGUga2V5d29yZC4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBAY29kZXtQVF9OVUxMfSAoMCkKLUluZGljYXRlcyBhbiB1bnVzZWQgcHJvZ3JhbSBoZWFkZXIuCi0KLUBpdGVtIEBjb2Rle1BUX0xPQUR9ICgxKQotSW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9ncmFtIGhlYWRlciBkZXNjcmliZXMgYSBzZWdtZW50IHRvIGJlIGxvYWRlZCBmcm9tCi10aGUgZmlsZS4KLQotQGl0ZW0gQGNvZGV7UFRfRFlOQU1JQ30gKDIpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQuCi0KLUBpdGVtIEBjb2Rle1BUX0lOVEVSUH0gKDMpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGludGVycHJldGVyIG1heSBiZQotZm91bmQuCi0KLUBpdGVtIEBjb2Rle1BUX05PVEV9ICg0KQotSW5kaWNhdGVzIGEgc2VnbWVudCBob2xkaW5nIG5vdGUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIEBjb2Rle1BUX1NITElCfSAoNSkKLUEgcmVzZXJ2ZWQgcHJvZ3JhbSBoZWFkZXIgdHlwZSwgZGVmaW5lZCBidXQgbm90IHNwZWNpZmllZCBieSB0aGUgRUxGCi1BQkkuCi0KLUBpdGVtIEBjb2Rle1BUX1BIRFJ9ICg2KQotSW5kaWNhdGVzIGEgc2VnbWVudCB3aGVyZSB0aGUgcHJvZ3JhbSBoZWFkZXJzIG1heSBiZSBmb3VuZC4KLQotQGl0ZW0gQHZhcntleHByZXNzaW9ufQotQW4gZXhwcmVzc2lvbiBnaXZpbmcgdGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgcHJvZ3JhbSBoZWFkZXIuICBUaGlzIG1heQotYmUgdXNlZCBmb3IgdHlwZXMgbm90IGRlZmluZWQgYWJvdmUuCi1AZW5kIHRhYmxlCi0KLVlvdSBjYW4gc3BlY2lmeSB0aGF0IGEgc2VnbWVudCBzaG91bGQgYmUgbG9hZGVkIGF0IGEgcGFydGljdWxhciBhZGRyZXNzCi1pbiBtZW1vcnkgYnkgdXNpbmcgYW4gQGNvZGV7QVR9IGV4cHJlc3Npb24uICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUKLUBjb2Rle0FUfSBjb21tYW5kIHVzZWQgYXMgYW4gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlIChAcHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIExNQX0pLiAgVGhlIEBjb2Rle0FUfSBjb21tYW5kIGZvciBhIHByb2dyYW0gaGVhZGVyIG92ZXJyaWRlcyB0aGUKLW91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZS4KLQotVGhlIGxpbmtlciB3aWxsIG5vcm1hbGx5IHNldCB0aGUgc2VnbWVudCBmbGFncyBiYXNlZCBvbiB0aGUgc2VjdGlvbnMKLXdoaWNoIGNvbXByaXNlIHRoZSBzZWdtZW50LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZMQUdTfSBrZXl3b3JkIHRvCi1leHBsaWNpdGx5IHNwZWNpZnkgdGhlIHNlZ21lbnQgZmxhZ3MuICBUaGUgdmFsdWUgb2YgQHZhcntmbGFnc30gbXVzdCBiZQotYW4gaW50ZWdlci4gIEl0IGlzIHVzZWQgdG8gc2V0IHRoZSBAY29kZXtwX2ZsYWdzfSBmaWVsZCBvZiB0aGUgcHJvZ3JhbQotaGVhZGVyLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgQGNvZGV7UEhEUlN9LiAgVGhpcyBzaG93cyBhIHR5cGljYWwgc2V0IG9mIHByb2dyYW0KLWhlYWRlcnMgdXNlZCBvbiBhIG5hdGl2ZSBFTEYgc3lzdGVtLgotCi1AZXhhbXBsZQotQGdyb3VwCi1QSERSUwotQHsKLSAgaGVhZGVycyBQVF9QSERSIFBIRFJTIDsKLSAgaW50ZXJwIFBUX0lOVEVSUCA7Ci0gIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIDsKLSAgZGF0YSBQVF9MT0FEIDsKLSAgZHluYW1pYyBQVF9EWU5BTUlDIDsKLUB9Ci0KLVNFQ1RJT05TCi1AewotICAuID0gU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiBAeyAqKC5pbnRlcnApIEB9IDp0ZXh0IDppbnRlcnAKLSAgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dAotICAucm9kYXRhIDogQHsgKigucm9kYXRhKSBAfSAvKiBkZWZhdWx0cyB0byA6dGV4dCAqLwotICBAZG90c3t9Ci0gIC4gPSAuICsgMHgxMDAwOyAvKiBtb3ZlIHRvIGEgbmV3IHBhZ2UgaW4gbWVtb3J5ICovCi0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0gOmRhdGEKLSAgLmR5bmFtaWMgOiBAeyAqKC5keW5hbWljKSBAfSA6ZGF0YSA6ZHluYW1pYwotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2RlIFZFUlNJT04KLUBzZWN0aW9uIFZFUlNJT04gQ29tbWFuZAotQGtpbmRleCBWRVJTSU9OIEB7c2NyaXB0IHRleHRAfQotQGNpbmRleCBzeW1ib2wgdmVyc2lvbnMKLUBjaW5kZXggdmVyc2lvbiBzY3JpcHQKLUBjaW5kZXggdmVyc2lvbnMgb2Ygc3ltYm9scwotVGhlIGxpbmtlciBzdXBwb3J0cyBzeW1ib2wgdmVyc2lvbnMgd2hlbiB1c2luZyBFTEYuICBTeW1ib2wgdmVyc2lvbnMgYXJlCi1vbmx5IHVzZWZ1bCB3aGVuIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgZHluYW1pYyBsaW5rZXIgY2FuIHVzZQotc3ltYm9sIHZlcnNpb25zIHRvIHNlbGVjdCBhIHNwZWNpZmljIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB3aGVuIGl0IHJ1bnMKLWEgcHJvZ3JhbSB0aGF0IG1heSBoYXZlIGJlZW4gbGlua2VkIGFnYWluc3QgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZQotc2hhcmVkIGxpYnJhcnkuCi0KLVlvdSBjYW4gaW5jbHVkZSBhIHZlcnNpb24gc2NyaXB0IGRpcmVjdGx5IGluIHRoZSBtYWluIGxpbmtlciBzY3JpcHQsIG9yCi15b3UgY2FuIHN1cHBseSB0aGUgdmVyc2lvbiBzY3JpcHQgYXMgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdC4gIFlvdSBjYW4KLWFsc28gdXNlIHRoZSBAc2FtcHstLXZlcnNpb24tc2NyaXB0fSBsaW5rZXIgb3B0aW9uLgotCi1UaGUgc3ludGF4IG9mIHRoZSBAY29kZXtWRVJTSU9OfSBjb21tYW5kIGlzIHNpbXBseQotQHNtYWxsZXhhbXBsZQotVkVSU0lPTiBAeyB2ZXJzaW9uLXNjcmlwdC1jb21tYW5kcyBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGZvcm1hdCBvZiB0aGUgdmVyc2lvbiBzY3JpcHQgY29tbWFuZHMgaXMgaWRlbnRpY2FsIHRvIHRoYXQgdXNlZCBieQotU3VuJ3MgbGlua2VyIGluIFNvbGFyaXMgMi41LiAgVGhlIHZlcnNpb24gc2NyaXB0IGRlZmluZXMgYSB0cmVlIG9mCi12ZXJzaW9uIG5vZGVzLiAgWW91IHNwZWNpZnkgdGhlIG5vZGUgbmFtZXMgYW5kIGludGVyZGVwZW5kZW5jaWVzIGluIHRoZQotdmVyc2lvbiBzY3JpcHQuICBZb3UgY2FuIHNwZWNpZnkgd2hpY2ggc3ltYm9scyBhcmUgYm91bmQgdG8gd2hpY2gKLXZlcnNpb24gbm9kZXMsIGFuZCB5b3UgY2FuIHJlZHVjZSBhIHNwZWNpZmllZCBzZXQgb2Ygc3ltYm9scyB0byBsb2NhbAotc2NvcGUgc28gdGhhdCB0aGV5IGFyZSBub3QgZ2xvYmFsbHkgdmlzaWJsZSBvdXRzaWRlIG9mIHRoZSBzaGFyZWQKLWxpYnJhcnkuCi0KLVRoZSBlYXNpZXN0IHdheSB0byBkZW1vbnN0cmF0ZSB0aGUgdmVyc2lvbiBzY3JpcHQgbGFuZ3VhZ2UgaXMgd2l0aCBhIGZldwotZXhhbXBsZXMuCi0KLUBzbWFsbGV4YW1wbGUKLVZFUlNfMS4xIEB7Ci0JIGdsb2JhbDoKLQkJIGZvbzE7Ci0JIGxvY2FsOgotCQkgb2xkKjsgCi0JCSBvcmlnaW5hbCo7IAotCQkgbmV3KjsgCi1AfTsKLQotVkVSU18xLjIgQHsKLQkJIGZvbzI7Ci1AfSBWRVJTXzEuMTsKLQotVkVSU18yLjAgQHsKLQkJIGJhcjE7IGJhcjI7Ci1AfSBWRVJTXzEuMjsKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgZXhhbXBsZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIHRocmVlIHZlcnNpb24gbm9kZXMuICBUaGUgZmlyc3QKLXZlcnNpb24gbm9kZSBkZWZpbmVkIGlzIEBzYW1we1ZFUlNfMS4xfTsgaXQgaGFzIG5vIG90aGVyIGRlcGVuZGVuY2llcy4KLVRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28xfSB0byBAc2FtcHtWRVJTXzEuMX0uICBJdCByZWR1Y2VzCi1hIG51bWJlciBvZiBzeW1ib2xzIHRvIGxvY2FsIHNjb3BlIHNvIHRoYXQgdGhleSBhcmUgbm90IHZpc2libGUgb3V0c2lkZQotb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotCi1OZXh0LCB0aGUgdmVyc2lvbiBzY3JpcHQgZGVmaW5lcyBub2RlIEBzYW1we1ZFUlNfMS4yfS4gIFRoaXMgbm9kZQotZGVwZW5kcyB1cG9uIEBzYW1we1ZFUlNfMS4xfS4gIFRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28yfQotdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMn0uCi0KLUZpbmFsbHksIHRoZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIG5vZGUgQHNhbXB7VkVSU18yLjB9LiAgVGhpcyBub2RlCi1kZXBlbmRzIHVwb24gQHNhbXB7VkVSU18xLjJ9LiAgVGhlIHNjcmlwdHMgYmluZHMgdGhlIHN5bWJvbHMgQHNhbXB7YmFyMX0KLWFuZCBAc2FtcHtiYXIyfSBhcmUgYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzIuMH0uCi0KLVdoZW4gdGhlIGxpbmtlciBmaW5kcyBhIHN5bWJvbCBkZWZpbmVkIGluIGEgbGlicmFyeSB3aGljaCBpcyBub3QKLXNwZWNpZmljYWxseSBib3VuZCB0byBhIHZlcnNpb24gbm9kZSwgaXQgd2lsbCBlZmZlY3RpdmVseSBiaW5kIGl0IHRvIGFuCi11bnNwZWNpZmllZCBiYXNlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBZb3UgY2FuIGJpbmQgYWxsIG90aGVyd2lzZQotdW5zcGVjaWZpZWQgc3ltYm9scyB0byBhIGdpdmVuIHZlcnNpb24gbm9kZSBieSB1c2luZyBAc2FtcHtnbG9iYWw6ICp9Ci1zb21ld2hlcmUgaW4gdGhlIHZlcnNpb24gc2NyaXB0LgotCi1UaGUgbmFtZXMgb2YgdGhlIHZlcnNpb24gbm9kZXMgaGF2ZSBubyBzcGVjaWZpYyBtZWFuaW5nIG90aGVyIHRoYW4gd2hhdAotdGhleSBtaWdodCBzdWdnZXN0IHRvIHRoZSBwZXJzb24gcmVhZGluZyB0aGVtLiAgVGhlIEBzYW1wezIuMH0gdmVyc2lvbgotY291bGQganVzdCBhcyB3ZWxsIGhhdmUgYXBwZWFyZWQgaW4gYmV0d2VlbiBAc2FtcHsxLjF9IGFuZCBAc2FtcHsxLjJ9LgotSG93ZXZlciwgdGhpcyB3b3VsZCBiZSBhIGNvbmZ1c2luZyB3YXkgdG8gd3JpdGUgYSB2ZXJzaW9uIHNjcmlwdC4KLQotV2hlbiB5b3UgbGluayBhbiBhcHBsaWNhdGlvbiBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdGhhdCBoYXMgdmVyc2lvbmVkCi1zeW1ib2xzLCB0aGUgYXBwbGljYXRpb24gaXRzZWxmIGtub3dzIHdoaWNoIHZlcnNpb24gb2YgZWFjaCBzeW1ib2wgaXQKLXJlcXVpcmVzLCBhbmQgaXQgYWxzbyBrbm93cyB3aGljaCB2ZXJzaW9uIG5vZGVzIGl0IG5lZWRzIGZyb20gZWFjaAotc2hhcmVkIGxpYnJhcnkgaXQgaXMgbGlua2VkIGFnYWluc3QuICBUaHVzIGF0IHJ1bnRpbWUsIHRoZSBkeW5hbWljCi1sb2FkZXIgY2FuIG1ha2UgYSBxdWljayBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyaWVzIHlvdSBoYXZlCi1saW5rZWQgYWdhaW5zdCBkbyBpbiBmYWN0IHN1cHBseSBhbGwgb2YgdGhlIHZlcnNpb24gbm9kZXMgdGhhdCB0aGUKLWFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byByZXNvbHZlIGFsbCBvZiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgSW4gdGhpcwotd2F5IGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgZHluYW1pYyBsaW5rZXIgdG8ga25vdyB3aXRoIGNlcnRhaW50eSB0aGF0Ci1hbGwgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IGl0IG5lZWRzIHdpbGwgYmUgcmVzb2x2YWJsZSB3aXRob3V0IGhhdmluZyB0bwotc2VhcmNoIGZvciBlYWNoIHN5bWJvbCByZWZlcmVuY2UuCi0KLVRoZSBzeW1ib2wgdmVyc2lvbmluZyBpcyBpbiBlZmZlY3QgYSBtdWNoIG1vcmUgc29waGlzdGljYXRlZCB3YXkgb2YKLWRvaW5nIG1pbm9yIHZlcnNpb24gY2hlY2tpbmcgdGhhdCBTdW5PUyBkb2VzLiAgVGhlIGZ1bmRhbWVudGFsIHByb2JsZW0KLXRoYXQgaXMgYmVpbmcgYWRkcmVzc2VkIGhlcmUgaXMgdGhhdCB0eXBpY2FsbHkgcmVmZXJlbmNlcyB0byBleHRlcm5hbAotZnVuY3Rpb25zIGFyZSBib3VuZCBvbiBhbiBhcy1uZWVkZWQgYmFzaXMsIGFuZCBhcmUgbm90IGFsbCBib3VuZCB3aGVuCi10aGUgYXBwbGljYXRpb24gc3RhcnRzIHVwLiAgSWYgYSBzaGFyZWQgbGlicmFyeSBpcyBvdXQgb2YgZGF0ZSwgYQotcmVxdWlyZWQgaW50ZXJmYWNlIG1heSBiZSBtaXNzaW5nOyB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byB1c2UKLXRoYXQgaW50ZXJmYWNlLCBpdCBtYXkgc3VkZGVubHkgYW5kIHVuZXhwZWN0ZWRseSBmYWlsLiAgV2l0aCBzeW1ib2wKLXZlcnNpb25pbmcsIHRoZSB1c2VyIHdpbGwgZ2V0IGEgd2FybmluZyB3aGVuIHRoZXkgc3RhcnQgdGhlaXIgcHJvZ3JhbSBpZgotdGhlIGxpYnJhcmllcyBiZWluZyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGFyZSB0b28gb2xkLgotCi1UaGVyZSBhcmUgc2V2ZXJhbCBHTlUgZXh0ZW5zaW9ucyB0byBTdW4ncyB2ZXJzaW9uaW5nIGFwcHJvYWNoLiAgVGhlCi1maXJzdCBvZiB0aGVzZSBpcyB0aGUgYWJpbGl0eSB0byBiaW5kIGEgc3ltYm9sIHRvIGEgdmVyc2lvbiBub2RlIGluIHRoZQotc291cmNlIGZpbGUgd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluc3RlYWQgb2YgaW4gdGhlIHZlcnNpb25pbmcKLXNjcmlwdC4gIFRoaXMgd2FzIGRvbmUgbWFpbmx5IHRvIHJlZHVjZSB0aGUgYnVyZGVuIG9uIHRoZSBsaWJyYXJ5Ci1tYWludGFpbmVyLiAgWW91IGNhbiBkbyB0aGlzIGJ5IHB1dHRpbmcgc29tZXRoaW5nIGxpa2U6Ci1Ac21hbGxleGFtcGxlCi1fX2FzbV9fKCIuc3ltdmVyIG9yaWdpbmFsX2Zvbyxmb29AQFZFUlNfMS4xIik7Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1pbiB0aGUgQyBzb3VyY2UgZmlsZS4gIFRoaXMgcmVuYW1lcyB0aGUgZnVuY3Rpb24gQHNhbXB7b3JpZ2luYWxfZm9vfSB0bwotYmUgYW4gYWxpYXMgZm9yIEBzYW1we2Zvb30gYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMX0uCi1UaGUgQHNhbXB7bG9jYWw6fSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gcHJldmVudCB0aGUgc3ltYm9sCi1Ac2FtcHtvcmlnaW5hbF9mb299IGZyb20gYmVpbmcgZXhwb3J0ZWQuCi0KLVRoZSBzZWNvbmQgR05VIGV4dGVuc2lvbiBpcyB0byBhbGxvdyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotZnVuY3Rpb24gdG8gYXBwZWFyIGluIGEgZ2l2ZW4gc2hhcmVkIGxpYnJhcnkuICBJbiB0aGlzIHdheSB5b3UgY2FuIG1ha2UKLWFuIGluY29tcGF0aWJsZSBjaGFuZ2UgdG8gYW4gaW50ZXJmYWNlIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgbWFqb3IKLXZlcnNpb24gbnVtYmVyIG9mIHRoZSBzaGFyZWQgbGlicmFyeSwgd2hpbGUgc3RpbGwgYWxsb3dpbmcgYXBwbGljYXRpb25zCi1saW5rZWQgYWdhaW5zdCB0aGUgb2xkIGludGVyZmFjZSB0byBjb250aW51ZSB0byBmdW5jdGlvbi4KLQotVG8gZG8gdGhpcywgeW91IG11c3QgdXNlIG11bHRpcGxlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZXMgaW4gdGhlCi1zb3VyY2UgZmlsZS4gIEhlcmUgaXMgYW4gZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQEAiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28xLGZvb0BAVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQEBAVkVSU18yLjAiKTsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgQHNhbXB7Zm9vQEB9IHJlcHJlc2VudHMgdGhlIHN5bWJvbCBAc2FtcHtmb299IGJvdW5kIHRvIHRoZQotdW5zcGVjaWZpZWQgYmFzZSB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICBUaGUgc291cmNlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzCi1leGFtcGxlIHdvdWxkIGRlZmluZSA0IEMgZnVuY3Rpb25zOiBAc2FtcHtvcmlnaW5hbF9mb299LCBAc2FtcHtvbGRfZm9vfSwKLUBzYW1we29sZF9mb28xfSwgYW5kIEBzYW1we25ld19mb299LgotCi1XaGVuIHlvdSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgZ2l2ZW4gc3ltYm9sLCB0aGVyZSBuZWVkcyB0byBiZQotc29tZSB3YXkgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmVyc2lvbiB0byB3aGljaCBleHRlcm5hbCByZWZlcmVuY2VzIHRvCi10aGlzIHN5bWJvbCB3aWxsIGJlIGJvdW5kLiAgWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlCi1Ac2FtcHtmb29AQEBAVkVSU18yLjB9IHR5cGUgb2YgQHNhbXB7LnN5bXZlcn0gZGlyZWN0aXZlLiAgWW91IGNhbiBvbmx5Ci1kZWNsYXJlIG9uZSB2ZXJzaW9uIG9mIGEgc3ltYm9sIGFzIHRoZSBkZWZhdWx0IGluIHRoaXMgbWFubmVyOyBvdGhlcndpc2UKLXlvdSB3b3VsZCBlZmZlY3RpdmVseSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHN5bWJvbC4KLQotSWYgeW91IHdpc2ggdG8gYmluZCBhIHJlZmVyZW5jZSB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIHN5bWJvbAotd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzZXMgb2YgY29udmVuaWVuY2UKLShpLmUuIEBzYW1we29sZF9mb299KSwgb3IgeW91IGNhbiB1c2UgdGhlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZSB0bwotc3BlY2lmaWNhbGx5IGJpbmQgdG8gYW4gZXh0ZXJuYWwgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24uCi0KLUBub2RlIEV4cHJlc3Npb25zCi1Ac2VjdGlvbiBFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljCi1UaGUgc3ludGF4IGZvciBleHByZXNzaW9ucyBpbiB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSBpcyBpZGVudGljYWwgdG8KLXRoYXQgb2YgQyBleHByZXNzaW9ucy4gIEFsbCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzIGludGVnZXJzLiAgQWxsCi1leHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGluIHRoZSBzYW1lIHNpemUsIHdoaWNoIGlzIDMyIGJpdHMgaWYgYm90aCB0aGUKLWhvc3QgYW5kIHRhcmdldCBhcmUgMzIgYml0cywgYW5kIGlzIG90aGVyd2lzZSA2NCBiaXRzLgotCi1Zb3UgY2FuIHVzZSBhbmQgc2V0IHN5bWJvbCB2YWx1ZXMgaW4gZXhwcmVzc2lvbnMuCi0KLVRoZSBsaW5rZXIgZGVmaW5lcyBzZXZlcmFsIHNwZWNpYWwgcHVycG9zZSBidWlsdGluIGZ1bmN0aW9ucyBmb3IgdXNlIGluCi1leHByZXNzaW9ucy4KLQotQG1lbnUKLSogQ29uc3RhbnRzOjoJCQlDb25zdGFudHMKLSogU3ltYm9sczo6CQkJU3ltYm9sIE5hbWVzCi0qIExvY2F0aW9uIENvdW50ZXI6OgkJVGhlIExvY2F0aW9uIENvdW50ZXIKLSogT3BlcmF0b3JzOjoJCQlPcGVyYXRvcnMKLSogRXZhbHVhdGlvbjo6CQkJRXZhbHVhdGlvbgotKiBFeHByZXNzaW9uIFNlY3Rpb246OgkJVGhlIFNlY3Rpb24gb2YgYW4gRXhwcmVzc2lvbgotKiBCdWlsdGluIEZ1bmN0aW9uczo6CQlCdWlsdGluIEZ1bmN0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIENvbnN0YW50cwotQHN1YnNlY3Rpb24gQ29uc3RhbnRzCi1AY2luZGV4IGludGVnZXIgbm90YXRpb24KLUBjaW5kZXggY29uc3RhbnRzIGluIGxpbmtlciBzY3JpcHRzCi1BbGwgY29uc3RhbnRzIGFyZSBpbnRlZ2Vycy4KLQotQXMgaW4gQywgdGhlIGxpbmtlciBjb25zaWRlcnMgYW4gaW50ZWdlciBiZWdpbm5pbmcgd2l0aCBAc2FtcHswfSB0byBiZQotb2N0YWwsIGFuZCBhbiBpbnRlZ2VyIGJlZ2lubmluZyB3aXRoIEBzYW1wezB4fSBvciBAc2FtcHswWH0gdG8gYmUKLWhleGFkZWNpbWFsLiAgVGhlIGxpbmtlciBjb25zaWRlcnMgb3RoZXIgaW50ZWdlcnMgdG8gYmUgZGVjaW1hbC4KLQotQGNpbmRleCBzY2FsZWQgaW50ZWdlcnMKLUBjaW5kZXggSyBhbmQgTSBpbnRlZ2VyIHN1ZmZpeGVzCi1AY2luZGV4IE0gYW5kIEsgaW50ZWdlciBzdWZmaXhlcwotQGNpbmRleCBzdWZmaXhlcyBmb3IgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlciBzdWZmaXhlcwotSW4gYWRkaXRpb24sIHlvdSBjYW4gdXNlIHRoZSBzdWZmaXhlcyBAY29kZXtLfSBhbmQgQGNvZGV7TX0gdG8gc2NhbGUgYQotY29uc3RhbnQgYnkKLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBjb2RlezEwMjR9IG9yIEBjb2RlezEwMjQqMTAyNH0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQHRleAotJHtccm0gMTAyNH0kIG9yICR7XHJtIDEwMjR9XjIkCi1AZW5kIHRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1yZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFsbCByZWZlciB0byB0aGUgc2FtZSBxdWFudGl0eToKLUBzbWFsbGV4YW1wbGUKLSAgX2ZvdXJrXzEgPSA0SzsKLSAgX2ZvdXJrXzIgPSA0MDk2OwotICBfZm91cmtfMyA9IDB4MTAwMDsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBOYW1lcwotQGNpbmRleCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggbmFtZXMKLUBjaW5kZXggcXVvdGVkIHN5bWJvbCBuYW1lcwotQGtpbmRleCAiCi1Vbmxlc3MgcXVvdGVkLCBzeW1ib2wgbmFtZXMgc3RhcnQgd2l0aCBhIGxldHRlciwgdW5kZXJzY29yZSwgb3IgcGVyaW9kCi1hbmQgbWF5IGluY2x1ZGUgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgcGVyaW9kcywgYW5kIGh5cGhlbnMuCi1VbnF1b3RlZCBzeW1ib2wgbmFtZXMgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbnkga2V5d29yZHMuICBZb3UgY2FuCi1zcGVjaWZ5IGEgc3ltYm9sIHdoaWNoIGNvbnRhaW5zIG9kZCBjaGFyYWN0ZXJzIG9yIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEKLWtleXdvcmQgYnkgc3Vycm91bmRpbmcgdGhlIHN5bWJvbCBuYW1lIGluIGRvdWJsZSBxdW90ZXM6Ci1Ac21hbGxleGFtcGxlCi0gICJTRUNUSU9OIiA9IDk7Ci0gICJ3aXRoIGEgc3BhY2UiID0gImFsc28gd2l0aCBhIHNwYWNlIiArIDEwOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotU2luY2Ugc3ltYm9scyBjYW4gY29udGFpbiBtYW55IG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMsIGl0IGlzIHNhZmVzdAotdG8gZGVsaW1pdCBzeW1ib2xzIHdpdGggc3BhY2VzLiAgRm9yIGV4YW1wbGUsIEBzYW1we0EtQn0gaXMgb25lIHN5bWJvbCwKLXdoZXJlYXMgQHNhbXB7QSAtIEJ9IGlzIGFuIGV4cHJlc3Npb24gaW52b2x2aW5nIHN1YnRyYWN0aW9uLgotCi1Abm9kZSBMb2NhdGlvbiBDb3VudGVyCi1Ac3Vic2VjdGlvbiBUaGUgTG9jYXRpb24gQ291bnRlcgotQGtpbmRleCAuCi1AY2luZGV4IGRvdAotQGNpbmRleCBsb2NhdGlvbiBjb3VudGVyCi1AY2luZGV4IGN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uCi1UaGUgc3BlY2lhbCBsaW5rZXIgdmFyaWFibGUgQGRmbntkb3R9IEBzYW1wey59IGFsd2F5cyBjb250YWlucyB0aGUKLWN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uIGNvdW50ZXIuICBTaW5jZSB0aGUgQGNvZGV7Ln0gYWx3YXlzIHJlZmVycyB0byBhCi1sb2NhdGlvbiBpbiBhbiBvdXRwdXQgc2VjdGlvbiwgaXQgbWF5IG9ubHkgYXBwZWFyIGluIGFuIGV4cHJlc3Npb24KLXdpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLiAgVGhlIEBjb2Rley59IHN5bWJvbCBtYXkgYXBwZWFyCi1hbnl3aGVyZSB0aGF0IGFuIG9yZGluYXJ5IHN5bWJvbCBpcyBhbGxvd2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBjaW5kZXggaG9sZXMKLUFzc2lnbmluZyBhIHZhbHVlIHRvIEBjb2Rley59IHdpbGwgY2F1c2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgdG8gYmUKLW1vdmVkLiAgVGhpcyBtYXkgYmUgdXNlZCB0byBjcmVhdGUgaG9sZXMgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlCi1sb2NhdGlvbiBjb3VudGVyIG1heSBuZXZlciBiZSBtb3ZlZCBiYWNrd2FyZHMuCi0KLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi1AewotICBvdXRwdXQgOgotICAgIEB7Ci0gICAgICBmaWxlMSgudGV4dCkKLSAgICAgIC4gPSAuICsgMTAwMDsKLSAgICAgIGZpbGUyKC50ZXh0KQotICAgICAgLiArPSAxMDAwOwotICAgICAgZmlsZTMoLnRleHQpCi0gICAgQH0gPSAweDEyMzQ7Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUxfSBpcwotbG9jYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXR9LiAgSXQgaXMKLWZvbGxvd2VkIGJ5IGEgMTAwMCBieXRlIGdhcC4gIFRoZW4gdGhlIEBzYW1wey50ZXh0fSBzZWN0aW9uIGZyb20KLUBmaWxle2ZpbGUyfSBhcHBlYXJzLCBhbHNvIHdpdGggYSAxMDAwIGJ5dGUgZ2FwIGZvbGxvd2luZyBiZWZvcmUgdGhlCi1Ac2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUzfS4gIFRoZSBub3RhdGlvbiBAc2FtcHs9IDB4MTIzNH0KLXNwZWNpZmllcyB3aGF0IGRhdGEgdG8gd3JpdGUgaW4gdGhlIGdhcHMgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBGaWxsfSkuCi0KLUBjaW5kZXggZG90IGluc2lkZSBzZWN0aW9ucwotTm90ZTogQGNvZGV7Ln0gYWN0dWFsbHkgcmVmZXJzIHRvIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLWN1cnJlbnQgY29udGFpbmluZyBvYmplY3QuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBAY29kZXtTRUNUSU9OU30KLXN0YXRlbWVudCwgd2hvZXMgc3RhcnQgYWRkcmVzcyBpcyAwLCBoZW5jZSBAY29kZXsufSBjYW4gYmUgdXNlZCBhcyBhbgotYWJzb2x1dGUgYWRkcmVzcy4gIElmIEBjb2Rley59IGlzIHVzZWQgaW5zaWRlIGEgc2VjdGlvbiBkZXNjcmlwdGlvbgotaG93ZXZlciwgaXQgcmVmZXJzIHRvIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGF0IHNlY3Rpb24sCi1ub3QgYW4gYWJzb2x1dGUgYWRkcmVzcy4gIFRodXMgaW4gYSBzY3JpcHQgbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgICAuID0gMHgxMDAKLSAgICAudGV4dDogQHsKLSAgICAgICooLnRleHQpCi0gICAgICAuID0gMHgyMDAKLSAgICBAfQotICAgIC4gPSAweDUwMAotICAgIC5kYXRhOiBAewotICAgICAgKiguZGF0YSkKLSAgICAgIC4gKz0gMHg2MDAKLSAgICBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiB3aWxsIGJlIGFzc2lnbmVkIGEgc3RhcnRpbmcgYWRkcmVzcyBvZiAweDEwMAotYW5kIGEgc2l6ZSBvZiBleGFjdGx5IDB4MjAwIGJ5dGVzLCBldmVuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YSBpbgotdGhlIEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9ucyB0byBmaWxsIHRoaXMgYXJlYS4gIChJZiB0aGVyZSBpcyB0b28KLW11Y2ggZGF0YSwgYW4gZXJyb3Igd2lsbCBiZSBwcm9kdWNlZCBiZWNhdXNlIHRoaXMgd291bGQgYmUgYW4gYXR0ZW1wdCB0bwotbW92ZSBAY29kZXsufSBiYWNrd2FyZHMpLiAgVGhlIEBzYW1wey5kYXRhfSBzZWN0aW9uIHdpbGwgc3RhcnQgYXQgMHg1MDAKLWFuZCBpdCB3aWxsIGhhdmUgYW4gZXh0cmEgMHg2MDAgYnl0ZXMgd29ydGggb2Ygc3BhY2UgYWZ0ZXIgdGhlIGVuZCBvZgotdGhlIHZhbHVlcyBmcm9tIHRoZSBAc2FtcHsuZGF0YX0gaW5wdXQgc2VjdGlvbnMgYW5kIGJlZm9yZSB0aGUgZW5kIG9mCi10aGUgQHNhbXB7LmRhdGF9IG91dHB1dCBzZWN0aW9uIGl0c2VsZi4KLQotQG5lZWQgMjAwMAotQG5vZGUgT3BlcmF0b3JzCi1Ac3Vic2VjdGlvbiBPcGVyYXRvcnMKLUBjaW5kZXggb3BlcmF0b3JzIGZvciBhcml0aG1ldGljCi1AY2luZGV4IGFyaXRobWV0aWMgb3BlcmF0b3JzCi1AY2luZGV4IHByZWNlZGVuY2UgaW4gZXhwcmVzc2lvbnMKLVRoZSBsaW5rZXIgcmVjb2duaXplcyB0aGUgc3RhbmRhcmQgQyBzZXQgb2YgYXJpdGhtZXRpYyBvcGVyYXRvcnMsIHdpdGgKLXRoZSBzdGFuZGFyZCBiaW5kaW5ncyBhbmQgcHJlY2VkZW5jZSBsZXZlbHM6Ci1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1Ac21hbGxleGFtcGxlCi1wcmVjZWRlbmNlICAgICAgYXNzb2NpYXRpdml0eSAgIE9wZXJhdG9ycyAgICAgICAgICAgICAgICBOb3RlcwotKGhpZ2hlc3QpCi0xICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICEgIC0gIH4gICAgICAgICAgICAgICAgICAoMSkKLTIgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgKiAgLyAgJQotMyAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICArICAtCi00ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgID4+ICA8PAotNSAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICA9PSAgIT0gID4gIDwgIDw9ICA+PQotNiAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICAmCi03ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgIHwKLTggICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgJiYKLTkgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgfHwKLTEwICAgICAgICAgICAgICByaWdodCAgICAgICAgICAgPyA6Ci0xMSAgICAgICAgICAgICAgcmlnaHQgICAgICAgICAgICY9ICArPSAgLT0gICo9ICAvPSAgICAgICAoMikKLShsb3dlc3QpCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90ZXM6Ci0oMSkgUHJlZml4IG9wZXJhdG9ycyAKLSgyKSBAeHJlZntBc3NpZ25tZW50c30uCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUB0ZXgKLVx2c2tpcCBcYmFzZWxpbmVza2lwCi0lImxpc3BuYXJyb3dpbmciIGlzIHRoZSBleHRyYSBpbmRlbnQgdXNlZCBnZW5lcmFsbHkgZm9yIHNtYWxsZXhhbXBsZQotXGhza2lwXGxpc3BuYXJyb3dpbmdcdmJveHtcb2ZmaW50ZXJsaW5lc2tpcAotXGhydWxlCi1caGFsaWduCi17XHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwge1x0dCAjfVwgXGhmaWwmXHZydWxlI1xjcgotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0mUHJlY2VkZW5jZSYmICBBc3NvY2lhdGl2aXR5ICAmJntccm0gT3BlcmF0b3JzfSZcY3IKLWhlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgotXG5vYWxpZ257XGhydWxlfQotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0maGlnaGVzdCYmJiYmXGNyCi0lICcxNzYgaXMgdGlsZGUsICd+JyBpbiB0dCBmb250Ci0mMSYmbGVmdCYmXHFxdWFkLSAgICAgICAgICBcY2hhcicxNzZcICAgICAgIVxxcXVhZFxkYWcmXGNyIAotJjImJmxlZnQmJiogICAgICAgICAgLyAgICAgICAgXCUmXGNyCi0mMyYmbGVmdCYmKyAgICAgICAgICAtJlxjcgotJjQmJmxlZnQmJj4+ICAgICAgICAgPDwmXGNyCi0mNSYmbGVmdCYmPT0gICAgICAgICAhPSAgICAgICA+ICAgICAgPCAgICAgIDw9ICAgICAgPj0mXGNyCi0mNiYmbGVmdCYmXCYmXGNyCi0mNyYmbGVmdCYmfCZcY3IKLSY4JiZsZWZ0JiZ7XCZcJn0mXGNyCi0mOSYmbGVmdCYmfHwmXGNyCi0mMTAmJnJpZ2h0JiY/ICAgICAgICA6JlxjcgotJjExJiZyaWdodCYmXHFxdWFkXCY9ICAgICAgKz0gICAgICAgLT0gICAgICo9ICAgICAvPVxxcXVhZFxkZGFnJlxjcgotJmxvd2VzdCYmJiYmXGNyCi1oZWlnaHQycHQmXG9taXQmJlxvbWl0JiZcb21pdCZcY3J9Ci1caHJ1bGV9Ci1AZW5kIHRleAotQGlmdGV4Ci17Ci1Ab2JleWxpbmVzQHBhcnNraXA9MHB0QHBhcmluZGVudD0wcHQKLUBkYWdAcXVhZCBQcmVmaXggb3BlcmF0b3JzLgotQGRkYWdAcXVhZCBAeHJlZntBc3NpZ25tZW50c30uCi19Ci1AZW5kIGlmdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotQG5vZGUgRXZhbHVhdGlvbgotQHN1YnNlY3Rpb24gRXZhbHVhdGlvbgotQGNpbmRleCBsYXp5IGV2YWx1YXRpb24KLUBjaW5kZXggZXhwcmVzc2lvbiBldmFsdWF0aW9uIG9yZGVyCi1UaGUgbGlua2VyIGV2YWx1YXRlcyBleHByZXNzaW9ucyBsYXppbHkuICBJdCBvbmx5IGNvbXB1dGVzIHRoZSB2YWx1ZSBvZgotYW4gZXhwcmVzc2lvbiB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotCi1UaGUgbGlua2VyIG5lZWRzIHNvbWUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHZhbHVlIG9mIHRoZSBzdGFydAotYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgYW5kIHRoZSBvcmlnaW5zIGFuZCBsZW5ndGhzIG9mIG1lbW9yeQotcmVnaW9ucywgaW4gb3JkZXIgdG8gZG8gYW55IGxpbmtpbmcgYXQgYWxsLiAgVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZAotYXMgc29vbiBhcyBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVhZHMgaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUhvd2V2ZXIsIG90aGVyIHZhbHVlcyAoc3VjaCBhcyBzeW1ib2wgdmFsdWVzKSBhcmUgbm90IGtub3duIG9yIG5lZWRlZAotdW50aWwgYWZ0ZXIgc3RvcmFnZSBhbGxvY2F0aW9uLiAgU3VjaCB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBsYXRlciwgd2hlbgotb3RoZXIgaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHNpemVzIG9mIG91dHB1dCBzZWN0aW9ucykgaXMgYXZhaWxhYmxlCi1mb3IgdXNlIGluIHRoZSBzeW1ib2wgYXNzaWdubWVudCBleHByZXNzaW9uLgotCi1UaGUgc2l6ZXMgb2Ygc2VjdGlvbnMgY2Fubm90IGJlIGtub3duIHVudGlsIGFmdGVyIGFsbG9jYXRpb24sIHNvCi1hc3NpZ25tZW50cyBkZXBlbmRlbnQgdXBvbiB0aGVzZSBhcmUgbm90IHBlcmZvcm1lZCB1bnRpbCBhZnRlcgotYWxsb2NhdGlvbi4KLQotU29tZSBleHByZXNzaW9ucywgc3VjaCBhcyB0aG9zZSBkZXBlbmRpbmcgdXBvbiB0aGUgbG9jYXRpb24gY291bnRlcgotQHNhbXB7Ln0sIG11c3QgYmUgZXZhbHVhdGVkIGR1cmluZyBzZWN0aW9uIGFsbG9jYXRpb24uCi0KLUlmIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBpcyByZXF1aXJlZCwgYnV0IHRoZSB2YWx1ZSBpcyBub3QKLWF2YWlsYWJsZSwgdGhlbiBhbiBlcnJvciByZXN1bHRzLiAgRm9yIGV4YW1wbGUsIGEgc2NyaXB0IGxpa2UgdGhlCi1mb2xsb3dpbmcKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgICAudGV4dCA5K3RoaXNfaXNudF9jb25zdGFudCA6IAotICAgICAgQHsgKigudGV4dCkgQH0KLSAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2UgQHNhbXB7bm9uIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIGluaXRpYWwKLWFkZHJlc3N9LgotCi1Abm9kZSBFeHByZXNzaW9uIFNlY3Rpb24KLUBzdWJzZWN0aW9uIFRoZSBTZWN0aW9uIG9mIGFuIEV4cHJlc3Npb24KLUBjaW5kZXggZXhwcmVzc2lvbiBzZWN0aW9ucwotQGNpbmRleCBhYnNvbHV0ZSBleHByZXNzaW9ucwotQGNpbmRleCByZWxhdGl2ZSBleHByZXNzaW9ucwotQGNpbmRleCBhYnNvbHV0ZSBhbmQgcmVsb2NhdGFibGUgc3ltYm9scwotQGNpbmRleCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUKLVdoZW4gdGhlIGxpbmtlciBldmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiwgdGhlIHJlc3VsdCBpcyBlaXRoZXIgYWJzb2x1dGUKLW9yIHJlbGF0aXZlIHRvIHNvbWUgc2VjdGlvbi4gIEEgcmVsYXRpdmUgZXhwcmVzc2lvbiBpcyBleHByZXNzZWQgYXMgYQotZml4ZWQgb2Zmc2V0IGZyb20gdGhlIGJhc2Ugb2YgYSBzZWN0aW9uLgotCi1UaGUgcG9zaXRpb24gb2YgdGhlIGV4cHJlc3Npb24gd2l0aGluIHRoZSBsaW5rZXIgc2NyaXB0IGRldGVybWluZXMKLXdoZXRoZXIgaXQgaXMgYWJzb2x1dGUgb3IgcmVsYXRpdmUuICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgd2l0aGluCi1hbiBvdXRwdXQgc2VjdGlvbiBkZWZpbml0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24uICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgZWxzZXdoZXJlIHdpbGwgYmUgYWJzb2x1dGUuCi0KLUEgc3ltYm9sIHNldCB0byBhIHJlbGF0aXZlIGV4cHJlc3Npb24gd2lsbCBiZSByZWxvY2F0YWJsZSBpZiB5b3UgcmVxdWVzdAotcmVsb2NhdGFibGUgb3V0cHV0IHVzaW5nIHRoZSBAc2FtcHstcn0gb3B0aW9uLiAgVGhhdCBtZWFucyB0aGF0IGEKLWZ1cnRoZXIgbGluayBvcGVyYXRpb24gbWF5IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wncwotc2VjdGlvbiB3aWxsIGJlIHRoZSBzZWN0aW9uIG9mIHRoZSByZWxhdGl2ZSBleHByZXNzaW9uLgotCi1BIHN5bWJvbCBzZXQgdG8gYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aWxsIHJldGFpbiB0aGUgc2FtZSB2YWx1ZQotdGhyb3VnaCBhbnkgZnVydGhlciBsaW5rIG9wZXJhdGlvbi4gIFRoZSBzeW1ib2wgd2lsbCBiZSBhYnNvbHV0ZSwgYW5kCi13aWxsIG5vdCBoYXZlIGFueSBwYXJ0aWN1bGFyIGFzc29jaWF0ZWQgc2VjdGlvbi4KLQotWW91IGNhbiB1c2UgdGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7QUJTT0xVVEV9IHRvIGZvcmNlIGFuIGV4cHJlc3Npb24KLXRvIGJlIGFic29sdXRlIHdoZW4gaXQgd291bGQgb3RoZXJ3aXNlIGJlIHJlbGF0aXZlLiAgRm9yIGV4YW1wbGUsIHRvCi1jcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24gQHNhbXB7LmRhdGF9OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLSAgQHsKLSAgICAuZGF0YSA6IEB7ICooLmRhdGEpIF9lZGF0YSA9IEFCU09MVVRFKC4pOyBAfQotICBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSWYgQHNhbXB7QUJTT0xVVEV9IHdlcmUgbm90IHVzZWQsIEBzYW1we19lZGF0YX0gd291bGQgYmUgcmVsYXRpdmUgdG8gdGhlCi1Ac2FtcHsuZGF0YX0gc2VjdGlvbi4KLQotQG5vZGUgQnVpbHRpbiBGdW5jdGlvbnMKLUBzdWJzZWN0aW9uIEJ1aWx0aW4gRnVuY3Rpb25zCi1AY2luZGV4IGZ1bmN0aW9ucyBpbiBleHByZXNzaW9ucwotVGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgaW5jbHVkZXMgYSBudW1iZXIgb2YgYnVpbHRpbiBmdW5jdGlvbnMgZm9yCi11c2UgaW4gbGlua2VyIHNjcmlwdCBleHByZXNzaW9ucy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBBQlNPTFVURShAdmFye2V4cH0pCi1Aa2luZGV4IEFCU09MVVRFKEB2YXJ7ZXhwfSkKLUBjaW5kZXggZXhwcmVzc2lvbiwgYWJzb2x1dGUKLVJldHVybiB0aGUgYWJzb2x1dGUgKG5vbi1yZWxvY2F0YWJsZSwgYXMgb3Bwb3NlZCB0byBub24tbmVnYXRpdmUpIHZhbHVlCi1vZiB0aGUgZXhwcmVzc2lvbiBAdmFye2V4cH0uICBQcmltYXJpbHkgdXNlZnVsIHRvIGFzc2lnbiBhbiBhYnNvbHV0ZQotdmFsdWUgdG8gYSBzeW1ib2wgd2l0aGluIGEgc2VjdGlvbiBkZWZpbml0aW9uLCB3aGVyZSBzeW1ib2wgdmFsdWVzIGFyZQotbm9ybWFsbHkgc2VjdGlvbiByZWxhdGl2ZS4gIEB4cmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCi0KLUBpdGVtIEFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggQUREUihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBhZGRyZXNzICh0aGUgVk1BKSBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFlvdXIKLXNjcmlwdCBtdXN0IHByZXZpb3VzbHkgaGF2ZSBkZWZpbmVkIHRoZSBsb2NhdGlvbiBvZiB0aGF0IHNlY3Rpb24uICBJbgotdGhlIGZvbGxvd2luZyBleGFtcGxlLCBAY29kZXtzeW1ib2xfMX0gYW5kIEBjb2Rle3N5bWJvbF8yfSBhcmUgYXNzaWduZWQKLWlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7IEBkb3Rze30KLSAgLm91dHB1dDEgOgotICAgIEB7IAotICAgIHN0YXJ0X29mX291dHB1dF8xID0gQUJTT0xVVEUoLik7Ci0gICAgQGRvdHN7fQotICAgIEB9Ci0gIC5vdXRwdXQgOgotICAgIEB7Ci0gICAgc3ltYm9sXzEgPSBBRERSKC5vdXRwdXQxKTsKLSAgICBzeW1ib2xfMiA9IHN0YXJ0X29mX291dHB1dF8xOwotICAgIEB9Ci1AZG90c3t9IEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBBTElHTihAdmFye2V4cH0pCi1Aa2luZGV4IEFMSUdOKEB2YXJ7ZXhwfSkKLUBjaW5kZXggcm91bmQgdXAgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBhbGlnbiBsb2NhdGlvbiBjb3VudGVyCi1SZXR1cm4gdGhlIGxvY2F0aW9uIGNvdW50ZXIgKEBjb2Rley59KSBhbGlnbmVkIHRvIHRoZSBuZXh0IEB2YXJ7ZXhwfQotYm91bmRhcnkuICBAdmFye2V4cH0gbXVzdCBiZSBhbiBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgcG93ZXIgb2YKLXR3by4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotQHNtYWxsZXhhbXBsZQotKC4gKyBAdmFye2V4cH0gLSAxKSAmIH4oQHZhcntleHB9IC0gMSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle0FMSUdOfSBkb2Vzbid0IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXItLS1pdCBqdXN0Ci1kb2VzIGFyaXRobWV0aWMgb24gaXQuICBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggYWxpZ25zIHRoZSBvdXRwdXQKLUBjb2Rley5kYXRhfSBzZWN0aW9uIHRvIHRoZSBuZXh0IEBjb2RlezB4MjAwMH0gYnl0ZSBib3VuZGFyeSBhZnRlciB0aGUKLXByZWNlZGluZyBzZWN0aW9uIGFuZCBzZXRzIGEgdmFyaWFibGUgd2l0aGluIHRoZSBzZWN0aW9uIHRvIHRoZSBuZXh0Ci1AY29kZXsweDgwMDB9IGJvdW5kYXJ5IGFmdGVyIHRoZSBpbnB1dCBzZWN0aW9uczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAuZGF0YSBBTElHTigweDIwMDApOiBAewotICAgICooLmRhdGEpCi0gICAgdmFyaWFibGUgPSBBTElHTigweDgwMDApOwotICBAfQotQGRvdHN7fSBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhlIGZpcnN0IHVzZSBvZiBAY29kZXtBTElHTn0gaW4gdGhpcyBleGFtcGxlIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YKLWEgc2VjdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgYXMgdGhlIG9wdGlvbmFsIEB2YXJ7YWRkcmVzc30gYXR0cmlidXRlIG9mCi1hIHNlY3Rpb24gZGVmaW5pdGlvbiAoQHB4cmVme091dHB1dCBTZWN0aW9uIEFkZHJlc3N9KS4gIFRoZSBzZWNvbmQgdXNlCi1vZiBAY29kZXtBTElHTn0gaXMgdXNlZCB0byBkZWZpbmVzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4KLQotVGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7TkVYVH0gaXMgY2xvc2VseSByZWxhdGVkIHRvIEBjb2Rle0FMSUdOfS4KLQotQGl0ZW0gQkxPQ0soQHZhcntleHB9KQotQGtpbmRleCBCTE9DSyhAdmFye2V4cH0pCi1UaGlzIGlzIGEgc3lub255bSBmb3IgQGNvZGV7QUxJR059LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGxpbmtlcgotc2NyaXB0cy4gIEl0IGlzIG1vc3Qgb2Z0ZW4gc2VlbiB3aGVuIHNldHRpbmcgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0Ci1zZWN0aW9uLgotCi1AaXRlbSBERUZJTkVEKEB2YXJ7c3ltYm9sfSkKLUBraW5kZXggREVGSU5FRChAdmFye3N5bWJvbH0pCi1AY2luZGV4IHN5bWJvbCBkZWZhdWx0cwotUmV0dXJuIDEgaWYgQHZhcntzeW1ib2x9IGlzIGluIHRoZSBsaW5rZXIgZ2xvYmFsIHN5bWJvbCB0YWJsZSBhbmQgaXMKLWRlZmluZWQsIG90aGVyd2lzZSByZXR1cm4gMC4gIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcHJvdmlkZQotZGVmYXVsdCB2YWx1ZXMgZm9yIHN5bWJvbHMuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzY3JpcHQgZnJhZ21lbnQKLXNob3dzIGhvdyB0byBzZXQgYSBnbG9iYWwgc3ltYm9sIEBzYW1we2JlZ2lufSB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4KLXRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbi0tLWJ1dCBpZiBhIHN5bWJvbCBjYWxsZWQgQHNhbXB7YmVnaW59IGFscmVhZHkKLWV4aXN0ZWQsIGl0cyB2YWx1ZSBpcyBwcmVzZXJ2ZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAudGV4dCA6IEB7Ci0gICAgYmVnaW4gPSBERUZJTkVEKGJlZ2luKSA/IGJlZ2luIDogLiA7Ci0gICAgQGRvdHN7fQotICBAfQotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBMTUEgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGlzIGlzIG5vcm1hbGx5Ci10aGUgc2FtZSBhcyBAY29kZXtBRERSfSwgYnV0IGl0IG1heSBiZSBkaWZmZXJlbnQgaWYgdGhlIEBjb2Rle0FUfQotYXR0cmlidXRlIGlzIHVzZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24gKEBweHJlZntPdXRwdXQKLVNlY3Rpb24gTE1BfSkuCi0KLUBraW5kZXggTUFYCi1AaXRlbSBNQVgoQHZhcntleHAxfSwgQHZhcntleHAyfSkKLVJldHVybnMgdGhlIG1heGltdW0gb2YgQHZhcntleHAxfSBhbmQgQHZhcntleHAyfS4KLQotQGtpbmRleCBNSU4KLUBpdGVtIE1JTihAdmFye2V4cDF9LCBAdmFye2V4cDJ9KQotUmV0dXJucyB0aGUgbWluaW11bSBvZiBAdmFye2V4cDF9IGFuZCBAdmFye2V4cDJ9LgotCi1AaXRlbSBORVhUKEB2YXJ7ZXhwfSkKLUBraW5kZXggTkVYVChAdmFye2V4cH0pCi1AY2luZGV4IHVuYWxsb2NhdGVkIGFkZHJlc3MsIG5leHQKLVJldHVybiB0aGUgbmV4dCB1bmFsbG9jYXRlZCBhZGRyZXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiBAdmFye2V4cH0uCi1UaGlzIGZ1bmN0aW9uIGlzIGNsb3NlbHkgcmVsYXRlZCB0byBAY29kZXtBTElHTihAdmFye2V4cH0pfTsgdW5sZXNzIHlvdQotdXNlIHRoZSBAY29kZXtNRU1PUll9IGNvbW1hbmQgdG8gZGVmaW5lIGRpc2NvbnRpbnVvdXMgbWVtb3J5IGZvciB0aGUKLW91dHB1dCBmaWxlLCB0aGUgdHdvIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudC4KLQotQGl0ZW0gU0laRU9GKEB2YXJ7c2VjdGlvbn0pCi1Aa2luZGV4IFNJWkVPRihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufSwgaWYgdGhhdCBzZWN0aW9uIGhhcwotYmVlbiBhbGxvY2F0ZWQuICBJZiB0aGUgc2VjdGlvbiBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHdoZW4gdGhpcyBpcwotZXZhbHVhdGVkLCB0aGUgbGlua2VyIHdpbGwgcmVwb3J0IGFuIGVycm9yLiAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLAotQGNvZGV7c3ltYm9sXzF9IGFuZCBAY29kZXtzeW1ib2xfMn0gYXJlIGFzc2lnbmVkIGlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TQHsgQGRvdHN7fQotICAub3V0cHV0IEB7Ci0gICAgLnN0YXJ0ID0gLiA7Ci0gICAgQGRvdHN7fQotICAgIC5lbmQgPSAuIDsKLSAgICBAfQotICBzeW1ib2xfMSA9IC5lbmQgLSAuc3RhcnQgOwotICBzeW1ib2xfMiA9IFNJWkVPRigub3V0cHV0KTsKLUBkb3Rze30gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIFNJWkVPRl9IRUFERVJTCi1AaXRlbXggc2l6ZW9mX2hlYWRlcnMKLUBraW5kZXggU0laRU9GX0hFQURFUlMKLUBjaW5kZXggaGVhZGVyIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUncyBoZWFkZXJzLiAgVGhpcyBpcwotaW5mb3JtYXRpb24gd2hpY2ggYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgdGhlIG91dHB1dCBmaWxlLiAgWW91IGNhbiB1c2UKLXRoaXMgbnVtYmVyIHdoZW4gc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgaWYgeW91Ci1jaG9vc2UsIHRvIGZhY2lsaXRhdGUgcGFnaW5nLgotCi1AY2luZGV4IG5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycywgbm90IGVub3VnaCByb29tCi1XaGVuIHByb2R1Y2luZyBhbiBFTEYgb3V0cHV0IGZpbGUsIGlmIHRoZSBsaW5rZXIgc2NyaXB0IHVzZXMgdGhlCi1AY29kZXtTSVpFT0ZfSEVBREVSU30gYnVpbHRpbiBmdW5jdGlvbiwgdGhlIGxpbmtlciBtdXN0IGNvbXB1dGUgdGhlCi1udW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzIGJlZm9yZSBpdCBoYXMgZGV0ZXJtaW5lZCBhbGwgdGhlIHNlY3Rpb24KLWFkZHJlc3NlcyBhbmQgc2l6ZXMuICBJZiB0aGUgbGlua2VyIGxhdGVyIGRpc2NvdmVycyB0aGF0IGl0IG5lZWRzCi1hZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycywgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgQHNhbXB7bm90IGVub3VnaAotcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzfS4gIFRvIGF2b2lkIHRoaXMgZXJyb3IsIHlvdSBtdXN0IGF2b2lkIHVzaW5nCi10aGUgQGNvZGV7U0laRU9GX0hFQURFUlN9IGZ1bmN0aW9uLCBvciB5b3UgbXVzdCByZXdvcmsgeW91ciBsaW5rZXIKLXNjcmlwdCB0byBhdm9pZCBmb3JjaW5nIHRoZSBsaW5rZXIgdG8gdXNlIGFkZGl0aW9uYWwgcHJvZ3JhbSBoZWFkZXJzLCBvcgoteW91IG11c3QgZGVmaW5lIHRoZSBwcm9ncmFtIGhlYWRlcnMgeW91cnNlbGYgdXNpbmcgdGhlIEBjb2Rle1BIRFJTfQotY29tbWFuZCAoQHB4cmVme1BIRFJTfSkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEltcGxpY2l0IExpbmtlciBTY3JpcHRzCi1Ac2VjdGlvbiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0cwotSWYgeW91IHNwZWNpZnkgYSBsaW5rZXIgaW5wdXQgZmlsZSB3aGljaCB0aGUgbGlua2VyIGNhbiBub3QgcmVjb2duaXplIGFzCi1hbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlIGZpbGUsIGl0IHdpbGwgdHJ5IHRvIHJlYWQgdGhlIGZpbGUgYXMgYQotbGlua2VyIHNjcmlwdC4gIElmIHRoZSBmaWxlIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgbGlua2VyIHNjcmlwdCwgdGhlCi1saW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuCi0KLUFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd2lsbCBub3QgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi1UeXBpY2FsbHkgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3b3VsZCBjb250YWluIG9ubHkgc3ltYm9sCi1hc3NpZ25tZW50cywgb3IgdGhlIEBjb2Rle0lOUFVUfSwgQGNvZGV7R1JPVVB9LCBvciBAY29kZXtWRVJTSU9OfQotY29tbWFuZHMuCi0KLUFueSBpbnB1dCBmaWxlcyByZWFkIGJlY2F1c2Ugb2YgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3aWxsIGJlIHJlYWQKLWF0IHRoZSBwb3NpdGlvbiBpbiB0aGUgY29tbWFuZCBsaW5lIHdoZXJlIHRoZSBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0IHdhcwotcmVhZC4gIFRoaXMgY2FuIGFmZmVjdCBhcmNoaXZlIHNlYXJjaGluZy4KLQotQGlmc2V0IEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW50Ci1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IG1hY2hpbmUgZGVwZW5kZW5jaWVzCi1AY29kZXtsZH0gaGFzIGFkZGl0aW9uYWwgZmVhdHVyZXMgb24gc29tZSBwbGF0Zm9ybXM7IHRoZSBmb2xsb3dpbmcKLXNlY3Rpb25zIGRlc2NyaWJlIHRoZW0uICBNYWNoaW5lcyB3aGVyZSBAY29kZXtsZH0gaGFzIG5vIGFkZGl0aW9uYWwKLWZ1bmN0aW9uYWxpdHkgYXJlIG5vdCBsaXN0ZWQuCi0KLUBtZW51Ci0qIEg4LzMwMDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMAotKiBpOTYwOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci0qIEFSTTo6CQkJCUBjb2Rle2xkfSBhbmQgdGhlIEFSTSBmYW1pbHkKLUBlbmQgbWVudQotQGVuZCBpZnNldAotCi1AYyBGSVhNRSEgIFRoaXMgY291bGQgdXNlIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zLCBidXQgdGhlcmUgc2VlbXMgdG8gYmUgYSBjb25mbGljdAotQGMgICAgICAgICBiZXR3ZWVuIHRob3NlIGFuZCBub2RlLWRlZmF1bHRpbmcuCi1AaWZzZXQgSDgzMDAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSDgvMzAwCi1Ac2VjdGlvbiBAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDAKLQotQGNpbmRleCBIOC8zMDAgc3VwcG9ydAotRm9yIHRoZSBIOC8zMDAsIEBjb2Rle2xkfSBjYW4gcGVyZm9ybSB0aGVzZSBnbG9iYWwgb3B0aW1pemF0aW9ucyB3aGVuCi15b3Ugc3BlY2lmeSB0aGUgQHNhbXB7LS1yZWxheH0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotQHRhYmxlIEBlbXBoCi1AY2luZGV4IHJlbGF4aW5nIG9uIEg4LzMwMAotQGl0ZW0gcmVsYXhpbmcgYWRkcmVzcyBtb2RlcwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXtqc3J9IGFuZCBAY29kZXtqbXB9IGluc3RydWN0aW9ucyB3aG9zZQotdGFyZ2V0cyBhcmUgd2l0aGluIGVpZ2h0IGJpdHMsIGFuZCB0dXJucyB0aGVtIGludG8gZWlnaHQtYml0Ci1wcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YnNyfSBhbmQgQGNvZGV7YnJhfSBpbnN0cnVjdGlvbnMsCi1yZXNwZWN0aXZlbHkuCi0KLUBjaW5kZXggc3ludGhlc2l6aW5nIG9uIEg4LzMwMAotQGl0ZW0gc3ludGhlc2l6aW5nIGluc3RydWN0aW9ucwotQGMgRklYTUU6IHNwZWNpZmljYWxseSBtb3YuYiwgb3IgYW55IG1vdiBpbnN0cnVjdGlvbnMgcmVhbGx5PwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXttb3YuYn0gaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSB0aGUKLXNpeHRlZW4tYml0IGFic29sdXRlIGFkZHJlc3MgZm9ybSwgYnV0IHJlZmVyIHRvIHRoZSB0b3AKLXBhZ2Ugb2YgbWVtb3J5LCBhbmQgY2hhbmdlcyB0aGVtIHRvIHVzZSB0aGUgZWlnaHQtYml0IGFkZHJlc3MgZm9ybS4KLShUaGF0IGlzOiB0aGUgbGlua2VyIHR1cm5zIEBzYW1we21vdi5iIEBjb2Rle0BAfUB2YXJ7YWF9OjE2fSBpbnRvCi1Ac2FtcHttb3YuYiBAY29kZXtAQH1AdmFye2FhfTo4fSB3aGVuZXZlciB0aGUgYWRkcmVzcyBAdmFye2FhfSBpcyBpbiB0aGUKLXRvcCBwYWdlIG9mIG1lbW9yeSkuCi1AZW5kIHRhYmxlCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEhpdGFjaGkKLUBjIFRoaXMgc3R1ZmYgaXMgcG9pbnRsZXNzIHRvIHNheSB1bmxlc3MgeW91J3JlIGVzcGVjaWFsbHkgY29uY2VybmVkCi1AYyB3aXRoIEhpdGFjaGkgY2hpcHM7IGRvbid0IGVuYWJsZSBpdCBmb3IgZ2VuZXJpYyBjYXNlLCBwbGVhc2UuCi1Abm9kZSBIaXRhY2hpCi1AY2hhcHRlciBAY29kZXtsZH0gYW5kIG90aGVyIEhpdGFjaGkgY2hpcHMKLQotQGNvZGV7bGR9IGFsc28gc3VwcG9ydHMgdGhlIEg4LzMwMEgsIHRoZSBIOC81MDAsIGFuZCB0aGUgSGl0YWNoaSBTSC4gIE5vCi1zcGVjaWFsIGZlYXR1cmVzLCBjb21tYW5kcywgb3IgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGZvcgotdGhlc2UgY2hpcHMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IEk5NjAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgaTk2MAotQHNlY3Rpb24gQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQotCi1AY2luZGV4IGk5NjAgc3VwcG9ydAotCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LUFAdmFye2FyY2hpdGVjdHVyZX19IGNvbW1hbmQgbGluZSBvcHRpb24gdG8KLXNwZWNpZnkgb25lIG9mIHRoZSB0d28tbGV0dGVyIG5hbWVzIGlkZW50aWZ5aW5nIG1lbWJlcnMgb2YgdGhlIDk2MAotZmFtaWx5OyB0aGUgb3B0aW9uIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBvdXRwdXQgdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55Ci1pbmNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBpbnB1dCBmaWxlcy4gIEl0IGFsc28gbW9kaWZpZXMgdGhlCi1saW5rZXIncyBzZWFyY2ggc3RyYXRlZ3kgZm9yIGFyY2hpdmUgbGlicmFyaWVzLCB0byBzdXBwb3J0IHRoZSB1c2Ugb2YKLWxpYnJhcmllcyBzcGVjaWZpYyB0byBlYWNoIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLCBieSBpbmNsdWRpbmcgaW4gdGhlCi1zZWFyY2ggbG9vcCBuYW1lcyBzdWZmaXhlZCB3aXRoIHRoZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdXIgQGNvZGV7bGR9IGNvbW1hbmQgbGluZSBpbmNsdWRlZCBAd3tAc2FtcHstQUNBfX0gYXMKLXdlbGwgYXMgQHd7QHNhbXB7LWx0cnl9fSwgdGhlIGxpbmtlciB3b3VsZCBsb29rIChpbiBpdHMgYnVpbHQtaW4gc2VhcmNoCi1wYXRocywgYW5kIGluIGFueSBwYXRocyB5b3Ugc3BlY2lmeSB3aXRoIEBzYW1wey1MfSkgZm9yIGEgbGlicmFyeSB3aXRoCi10aGUgbmFtZXMKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi10cnkKLWxpYnRyeS5hCi10cnljYQotbGlidHJ5Y2EuYQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIEB3e0BzYW1wey1BQ0F9fS4KLQotWW91IGNhbiBtZWFuaW5nZnVsbHkgdXNlIEBzYW1wey1BfSBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgc2luY2UKLXRoZSA5NjAgYXJjaGl0ZWN0dXJlIGZhbWlseSBhbGxvd3MgY29tYmluYXRpb24gb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZXM7IGVhY2gKLXVzZSB3aWxsIGFkZCBhbm90aGVyIHBhaXIgb2YgbmFtZSB2YXJpYW50cyB0byBzZWFyY2ggZm9yIHdoZW4gQHd7QHNhbXB7LWx9fQotc3BlY2lmaWVzIGEgbGlicmFyeS4KLQotQGNpbmRleCBAY29kZXstLXJlbGF4fSBvbiBpOTYwCi1AY2luZGV4IHJlbGF4aW5nIG9uIGk5NjAKLUBjb2Rle2xkfSBzdXBwb3J0cyB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIGZvciB0aGUgaTk2MCBmYW1pbHkuICBJZgoteW91IHNwZWNpZnkgQHNhbXB7LS1yZWxheH0sIEBjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7YmFseH0gYW5kCi1AY29kZXtjYWx4fSBpbnN0cnVjdGlvbnMgd2hvc2UgdGFyZ2V0cyBhcmUgd2l0aGluIDI0IGJpdHMsIGFuZCB0dXJucwotdGhlbSBpbnRvIDI0LWJpdCBwcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YmFsfSBhbmQgQGNvZGV7Y2FsfQotaW5zdHJ1Y3Rpb25zLCByZXNwZWN0aXZlbHkuICBAY29kZXtsZH0gYWxzbyB0dXJucyBAY29kZXtjYWx9Ci1pbnN0cnVjdGlvbnMgaW50byBAY29kZXtiYWx9IGluc3RydWN0aW9ucyB3aGVuIGl0IGRldGVybWluZXMgdGhhdCB0aGUKLXRhcmdldCBzdWJyb3V0aW5lIGlzIGEgbGVhZiByb3V0aW5lICh0aGF0IGlzLCB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgZG9lcwotbm90IGl0c2VsZiBjYWxsIGFueSBzdWJyb3V0aW5lcykuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQHJhaXNlc2VjdGlvbnMKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBBUk0KLUBzZWN0aW9uIEBjb2Rle2xkfSdzIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgY29kZQotCi1AY2luZGV4IEFSTSBpbnRlcndvcmtpbmcgc3VwcG9ydAotQGtpbmRleCAtLXN1cHBvcnQtb2xkLWNvZGUKLUZvciB0aGUgQVJNLCBAY29kZXtsZH0gd2lsbCBnZW5lcmF0ZSBjb2RlIHN0dWJzIHRvIGFsbG93IGZ1bmN0aW9ucyBjYWxscwotYmV0d2VlbSBBUk0gYW5kIFRodW1iIGNvZGUuICBUaGVzZSBzdHVicyBvbmx5IHdvcmsgd2l0aCBjb2RlIHRoYXQgaGFzCi1iZWVuIGNvbXBpbGVkIGFuZCBhc3NlbWJsZWQgd2l0aCB0aGUgQHNhbXB7LW10aHVtYi1pbnRlcndvcmt9IGNvbW1hbmQKLWxpbmUgb3B0aW9uLiAgSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgd2l0aCBvbGQgQVJNIG9iamVjdCBmaWxlcyBvcgotbGlicmFyaWVzLCB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggdGhlIC1tdGh1bWItaW50ZXJ3b3JrCi1vcHRpb24gdGhlbiB0aGUgQHNhbXB7LS1zdXBwb3J0LW9sZC1jb2RlfSBjb21tYW5kIGxpbmUgc3dpdGNoIHNob3VsZCBiZQotZ2l2ZW4gdG8gdGhlIGxpbmtlci4gIFRoaXMgd2lsbCBtYWtlIGl0IGdlbmVyYXRlIGxhcmdlciBzdHViIGZ1bmN0aW9ucwotd2hpY2ggd2lsbCB3b3JrIHdpdGggbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4gIE5vdGUsIGhvd2V2ZXIsCi10aGUgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZ2VuZXJhdGluZyBzdHVicyBmb3IgZnVuY3Rpb24gY2FsbHMgdG8KLW5vbi1pbnRlcndvcmtpbmcgYXdhcmUgVGh1bWIgY29kZS4KLQotQGNpbmRleCB0aHVtYiBlbnRyeSBwb2ludAotQGNpbmRleCBlbnRyeSBwb2ludCwgdGh1bWIKLUBraW5kZXggLS10aHVtYi1lbnRyeT1AdmFye2VudHJ5fQotVGhlIEBzYW1wey0tdGh1bWItZW50cnl9IHN3aXRjaCBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgZ2VuZXJpYwotQHNhbXB7LS1lbnRyeX0gc3dpdGNoLCBpbiB0aGF0IGl0IHNldHMgdGhlIHByb2dyYW0ncyBzdGFydGluZyBhZGRyZXNzLiAgCi1CdXQgaXQgYWxzbyBzZXRzIHRoZSBib3R0b20gYml0IG9mIHRoZSBhZGRyZXNzLCBzbyB0aGF0IGl0IGNhbiBiZQotYnJhbmNoZWQgdG8gdXNpbmcgYSBCWCBpbnN0cnVjdGlvbiwgYW5kIHRoZSBwcm9ncmFtIHdpbGwgc3RhcnQKLWV4ZWN1dGluZyBpbiBUaHVtYiBtb2RlIHN0cmFpZ2h0IGF3YXkuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Abm9kZSBCRkQKLUBjaGFwdGVyIEJGRAotCi1AY2luZGV4IGJhY2sgZW5kCi1AY2luZGV4IG9iamVjdCBmaWxlIG1hbmFnZW1lbnQKLUBjaW5kZXggb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCi1Aa2luZGV4IG9iamR1bXAgLWkKLVRoZSBsaW5rZXIgYWNjZXNzZXMgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzIHVzaW5nIHRoZSBCRkQgbGlicmFyaWVzLgotVGhlc2UgbGlicmFyaWVzIGFsbG93IHRoZSBsaW5rZXIgdG8gdXNlIHRoZSBzYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24KLW9iamVjdCBmaWxlcyB3aGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgQSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKLWZvcm1hdCBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieSBjcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZwotaXQgdG8gdGhlIGxpYnJhcnkuICBUbyBjb25zZXJ2ZSBydW50aW1lIG1lbW9yeSwgaG93ZXZlciwgdGhlIGxpbmtlciBhbmQKLWFzc29jaWF0ZWQgdG9vbHMgYXJlIHVzdWFsbHkgY29uZmlndXJlZCB0byBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlCi1vYmplY3QgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZS4gIFlvdSBjYW4gdXNlIEBjb2Rle29iamR1bXAgLWl9Ci0oQHB4cmVme29iamR1bXAsLG9iamR1bXAsYmludXRpbHMuaW5mbyxUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXN9KSB0bwotbGlzdCBhbGwgdGhlIGZvcm1hdHMgYXZhaWxhYmxlIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24uCi0KLUBjaW5kZXggQkZEIHJlcXVpcmVtZW50cwotQGNpbmRleCByZXF1aXJlbWVudHMgZm9yIEJGRAotQXMgd2l0aCBtb3N0IGltcGxlbWVudGF0aW9ucywgQkZEIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuCi1zZXZlcmFsIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cy4gVGhlIG1ham9yIGZhY3RvciBpbmZsdWVuY2luZwotQkZEIGRlc2lnbiB3YXMgZWZmaWNpZW5jeTogYW55IHRpbWUgdXNlZCBjb252ZXJ0aW5nIGJldHdlZW4KLWZvcm1hdHMgaXMgdGltZSB3aGljaCB3b3VsZCBub3QgaGF2ZSBiZWVuIHNwZW50IGhhZCBCRkQgbm90Ci1iZWVuIGludm9sdmVkLiBUaGlzIGlzIHBhcnRseSBvZmZzZXQgYnkgYWJzdHJhY3Rpb24gcGF5YmFjazsgc2luY2UKLUJGRCBzaW1wbGlmaWVzIGFwcGxpY2F0aW9ucyBhbmQgYmFjayBlbmRzLCBtb3JlIHRpbWUgYW5kIGNhcmUKLW1heSBiZSBzcGVudCBvcHRpbWl6aW5nIGFsZ29yaXRobXMgZm9yIGEgZ3JlYXRlciBzcGVlZC4KLQotT25lIG1pbm9yIGFydGlmYWN0IG9mIHRoZSBCRkQgc29sdXRpb24gd2hpY2ggeW91IHNob3VsZCBiZWFyIGluCi1taW5kIGlzIHRoZSBwb3RlbnRpYWwgZm9yIGluZm9ybWF0aW9uIGxvc3MuICBUaGVyZSBhcmUgdHdvIHBsYWNlcyB3aGVyZQotdXNlZnVsIGluZm9ybWF0aW9uIGNhbiBiZSBsb3N0IHVzaW5nIHRoZSBCRkQgbWVjaGFuaXNtOiBkdXJpbmcKLWNvbnZlcnNpb24gYW5kIGR1cmluZyBvdXRwdXQuIEB4cmVme0JGRCBpbmZvcm1hdGlvbiBsb3NzfS4KLQotQG1lbnUKLSogQkZEIG91dGxpbmU6OiAgICAgICAgICAgICAgICAgSG93IGl0IHdvcmtzOiBhbiBvdXRsaW5lIG9mIEJGRAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBvdXRsaW5lCi1Ac2VjdGlvbiBIb3cgaXQgd29ya3M6IGFuIG91dGxpbmUgb2YgQkZECi1AY2luZGV4IG9wZW5pbmcgb2JqZWN0IGZpbGVzCi1AaW5jbHVkZSBiZmRzdW1tLnRleGkKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBSZXBvcnRpbmcgQnVncwotQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKLUBjaW5kZXggYnVncyBpbiBAY29kZXtsZH0KLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MgaW4gQGNvZGV7bGR9Ci0KLVlvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgQGNvZGV7bGR9IHJlbGlhYmxlLgotCi1SZXBvcnRpbmcgYSBidWcgbWF5IGhlbHAgeW91IGJ5IGJyaW5naW5nIGEgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLCBvcgotaXQgbWF5IG5vdC4gIEJ1dCBpbiBhbnkgY2FzZSB0aGUgcHJpbmNpcGFsIGZ1bmN0aW9uIG9mIGEgYnVnIHJlcG9ydCBpcwotdG8gaGVscCB0aGUgZW50aXJlIGNvbW11bml0eSBieSBtYWtpbmcgdGhlIG5leHQgdmVyc2lvbiBvZiBAY29kZXtsZH0KLXdvcmsgYmV0dGVyLiAgQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZSBtYWludGVuYW5jZSBvZgotQGNvZGV7bGR9LgotCi1JbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotaW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgotCi1AbWVudQotKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLSogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCi1AZW5kIG1lbnUKLQotQG5vZGUgQnVnIENyaXRlcmlhCi1Ac2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLUBjaW5kZXggYnVnIGNyaXRlcmlhCi0KLUlmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AY2luZGV4IGZhdGFsIHNpZ25hbAotQGNpbmRleCBsaW5rZXIgY3Jhc2gKLUBjaW5kZXggY3Jhc2ggb2YgbGlua2VyCi1AaXRlbQotSWYgdGhlIGxpbmtlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKLUBjb2Rle2xkfSBidWcuICBSZWxpYWJsZSBsaW5rZXJzIG5ldmVyIGNyYXNoLgotCi1AY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7bGR9IHByb2R1Y2VzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHZhbGlkIGlucHV0LCB0aGF0IGlzIGEgYnVnLgotCi1AY2luZGV4IGludmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBAY29kZXtsZH0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LCB0aGF0Ci1tYXkgYmUgYSBidWcuICBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGUgbGlua2VyIGNhbiBub3QgdmVyaWZ5IHRoYXQKLW9iamVjdCBmaWxlcyBhcmUgY29ycmVjdC4KLQotQGl0ZW0KLUlmIHlvdSBhcmUgYW4gZXhwZXJpZW5jZWQgdXNlciBvZiBsaW5rZXJzLCB5b3VyIHN1Z2dlc3Rpb25zIGZvcgotaW1wcm92ZW1lbnQgb2YgQGNvZGV7bGR9IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEJ1ZyBSZXBvcnRpbmcKLUBzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncwotQGNpbmRleCBidWcgcmVwb3J0cwotQGNpbmRleCBAY29kZXtsZH0gYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIEBjb2Rle2xkfSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlCi1yZWNvbW1lbmQgeW91IGNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCi0KLVlvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcwotZGlzdHJpYnV0aW9uLgotCi1PdGhlcndpc2UsIHNlbmQgYnVnIHJlcG9ydHMgZm9yIEBjb2Rle2xkfSB0bwotQHNhbXB7YnVnLWdudS11dGlsc0BAZ251Lm9yZ30uCi0KLVRoZSBmdW5kYW1lbnRhbCBwcmluY2lwbGUgb2YgcmVwb3J0aW5nIGJ1Z3MgdXNlZnVsbHkgaXMgdGhpczoKLUBzdHJvbmd7cmVwb3J0IGFsbCB0aGUgZmFjdHN9LiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHRvIHN0YXRlIGEKLWZhY3Qgb3IgbGVhdmUgaXQgb3V0LCBzdGF0ZSBpdCEKLQotT2Z0ZW4gcGVvcGxlIG9taXQgZmFjdHMgYmVjYXVzZSB0aGV5IHRoaW5rIHRoZXkga25vdyB3aGF0IGNhdXNlcyB0aGUKLXByb2JsZW0gYW5kIGFzc3VtZSB0aGF0IHNvbWUgZGV0YWlscyBkbyBub3QgbWF0dGVyLiAgVGh1cywgeW91IG1pZ2h0Ci1hc3N1bWUgdGhhdCB0aGUgbmFtZSBvZiBhIHN5bWJvbCB5b3UgdXNlIGluIGFuIGV4YW1wbGUgZG9lcyBub3QgbWF0dGVyLgotV2VsbCwgcHJvYmFibHkgaXQgZG9lcyBub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMKLWEgc3RyYXkgbWVtb3J5IHJlZmVyZW5jZSB3aGljaCBoYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlCi10aGF0IG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZQotY29udGVudHMgb2YgdGhhdCBsb2NhdGlvbiB3b3VsZCBmb29sIHRoZSBsaW5rZXIgaW50byBkb2luZyB0aGUgcmlnaHQKLXRoaW5nIGRlc3BpdGUgdGhlIGJ1Zy4gIFBsYXkgaXQgc2FmZSBhbmQgZ2l2ZSBhIHNwZWNpZmljLCBjb21wbGV0ZQotZXhhbXBsZS4gIFRoYXQgaXMgdGhlIGVhc2llc3QgdGhpbmcgZm9yIHlvdSB0byBkbywgYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIEBjb2Rle2xkfS4gIEBjb2Rle2xkfSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0IGl0IHdpdGgKLXRoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgotCi1XaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKLXRoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtsZH0uCi0KLUBpdGVtCi1BbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgaW5jbHVkaW5nIGFueQotcGF0Y2hlcyBtYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgQGNvZGV7bGR9LS0tZS5nLgotYGBAY29kZXtnY2MtMi43fScnLgotCi1AaXRlbQotVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBsaW5rZXIgdG8gbGluayB5b3VyIGV4YW1wbGUgYW5kCi1vYnNlcnZlIHRoZSBidWcuICBUbyBndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwKLWxpc3QgdGhlbSBhbGwuICBBIGNvcHkgb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMKLXN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIEl0IGlzIGdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywKLXV1ZW5jb2RlZCBpZiBuZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBNYWtpbmcgdGhlbQotYXZhaWxhYmxlIGZvciBhbm9ueW1vdXMgRlRQIGlzIG5vdCBhcyBnb29kLCBidXQgbWF5IGJlIHRoZSBvbmx5Ci1yZWFzb25hYmxlIGNob2ljZSBmb3IgbGFyZ2Ugb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgYXNzZW1ibGVkIHVzaW5nIEBjb2Rle2dhc30gb3IgY29tcGlsZWQgdXNpbmcKLUBjb2Rle2djY30sIHRoZW4gaXQgbWF5IGJlIE9LIHRvIHNlbmQgdGhlIHNvdXJjZSBmaWxlcyByYXRoZXIgdGhhbiB0aGUKLW9iamVjdCBmaWxlcy4gIEluIHRoaXMgY2FzZSwgYmUgc3VyZSB0byBzYXkgZXhhY3RseSB3aGF0IHZlcnNpb24gb2YKLUBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3YXMgdXNlZCB0byBwcm9kdWNlIHRoZSBvYmplY3QgZmlsZXMuICBBbHNvIHNheQotaG93IEBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3ZXJlIGNvbmZpZ3VyZWQuCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCBAY29kZXtsZH0gZ2V0cyBhIGZhdGFsIHNpZ25hbCwgdGhlbiB3ZQotd2lsbCBjZXJ0YWlubHkgbm90aWNlIGl0LiAgQnV0IGlmIHRoZSBidWcgaXMgaW5jb3JyZWN0IG91dHB1dCwgd2UgbWlnaHQKLW5vdCBub3RpY2UgdW5sZXNzIGl0IGlzIGdsYXJpbmdseSB3cm9uZy4gIFlvdSBtaWdodCBhcyB3ZWxsIG5vdCBnaXZlIHVzCi1hIGNoYW5jZSB0byBtYWtlIGEgbWlzdGFrZS4KLQotRXZlbiBpZiB0aGUgcHJvYmxlbSB5b3UgZXhwZXJpZW5jZSBpcyBhIGZhdGFsIHNpZ25hbCwgeW91IHNob3VsZCBzdGlsbAotc2F5IHNvIGV4cGxpY2l0bHkuICBTdXBwb3NlIHNvbWV0aGluZyBzdHJhbmdlIGlzIGdvaW5nIG9uLCBzdWNoIGFzLCB5b3VyCi1jb3B5IG9mIEBjb2Rle2xkfSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIHRoZQotQyBsaWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodCBjcmFzaAotYW5kIG91cnMgd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbiBvdXJzCi1mYWlscyB0byBjcmFzaCwgd2Ugd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yIHVzLiAgSWYKLXlvdSBoYWQgbm90IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUgdG8gZHJhdwotYW55IGNvbmNsdXNpb24gZnJvbSBvdXIgb2JzZXJ2YXRpb25zLgotCi1AaXRlbQotSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBAY29kZXtsZH0gc291cmNlLCBzZW5kIHVzIGNvbnRleHQKLWRpZmZzLCBhcyBnZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yCi1Ac2FtcHstcH0gb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLgotSWYgeW91IGV2ZW4gZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5Ci1jb250ZXh0LCBub3QgYnkgbGluZSBudW1iZXIuCi0KLVRoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgotc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCi0KLU9mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZwotd2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAotY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCi0KLVRoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCi13aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCi13aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCi0KLU9mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQotb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKLW91dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKLWxlc3MgdGltZSwgYW5kIHNvIG9uLgotCi1Ib3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAotcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgotCi1AaXRlbQotQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KLQotQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAotdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1hIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCi10byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KLQotU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEBjb2Rle2xkfSBpdCBpcyB2ZXJ5IGhhcmQgdG8KLWNvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhIGNlcnRhaW4gcGF0aAotdGhyb3VnaCB0aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2Ugd2lsbCBub3QgYmUKLWFibGUgdG8gY29uc3RydWN0IG9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdCB0aGUgYnVnIGlzCi1maXhlZC4KLQotQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKLXBhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKLWhlbHAgdXMgdG8gdW5kZXJzdGFuZC4KLQotQGl0ZW0KLUEgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KLQotU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAotdGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIE1SSQotQGFwcGVuZGl4IE1SSSBDb21wYXRpYmxlIFNjcmlwdCBGaWxlcwotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eQotVG8gYWlkIHVzZXJzIG1ha2luZyB0aGUgdHJhbnNpdGlvbiB0byBAc2N7Z251fSBAY29kZXtsZH0gZnJvbSB0aGUgTVJJCi1saW5rZXIsIEBjb2Rle2xkfSBjYW4gdXNlIE1SSSBjb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzIGFzIGFuCi1hbHRlcm5hdGl2ZSB0byB0aGUgbW9yZSBnZW5lcmFsLXB1cnBvc2UgbGlua2VyIHNjcmlwdGluZyBsYW5ndWFnZQotZGVzY3JpYmVkIGluIEByZWZ7U2NyaXB0c30uICBNUkkgY29tcGF0aWJsZSBsaW5rZXIgc2NyaXB0cyBoYXZlIGEgbXVjaAotc2ltcGxlciBjb21tYW5kIHNldCB0aGFuIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugb3RoZXJ3aXNlIHVzZWQgd2l0aAotQGNvZGV7bGR9LiAgQHNje2dudX0gQGNvZGV7bGR9IHN1cHBvcnRzIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgTVJJCi1saW5rZXIgY29tbWFuZHM7IHRoZXNlIGNvbW1hbmRzIGFyZSBkZXNjcmliZWQgaGVyZS4KLQotSW4gZ2VuZXJhbCwgTVJJIHNjcmlwdHMgYXJlbid0IG9mIG11Y2ggdXNlIHdpdGggdGhlIEBjb2Rle2Eub3V0fSBvYmplY3QKLWZpbGUgZm9ybWF0LCBzaW5jZSBpdCBvbmx5IGhhcyB0aHJlZSBzZWN0aW9ucyBhbmQgTVJJIHNjcmlwdHMgbGFjayBzb21lCi1mZWF0dXJlcyB0byBtYWtlIHVzZSBvZiB0aGVtLgotCi1Zb3UgY2FuIHNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYW4gTVJJLWNvbXBhdGlibGUgc2NyaXB0IHVzaW5nIHRoZQotQHNhbXB7LWN9IGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLUVhY2ggY29tbWFuZCBpbiBhbiBNUkktY29tcGF0aWJsZSBzY3JpcHQgb2NjdXBpZXMgaXRzIG93biBsaW5lOyBlYWNoCi1jb21tYW5kIGxpbmUgc3RhcnRzIHdpdGggdGhlIGtleXdvcmQgdGhhdCBpZGVudGlmaWVzIHRoZSBjb21tYW5kICh0aG91Z2gKLWJsYW5rIGxpbmVzIGFyZSBhbHNvIGFsbG93ZWQgZm9yIHB1bmN0dWF0aW9uKS4gIElmIGEgbGluZSBvZiBhbgotTVJJLWNvbXBhdGlibGUgc2NyaXB0IGJlZ2lucyB3aXRoIGFuIHVucmVjb2duaXplZCBrZXl3b3JkLCBAY29kZXtsZH0KLWlzc3VlcyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGNvbnRpbnVlcyBwcm9jZXNzaW5nIHRoZSBzY3JpcHQuCi0KLUxpbmVzIGJlZ2lubmluZyB3aXRoIEBzYW1weyp9IGFyZSBjb21tZW50cy4KLQotWW91IGNhbiB3cml0ZSB0aGVzZSBjb21tYW5kcyB1c2luZyBhbGwgdXBwZXItY2FzZSBsZXR0ZXJzLCBvciBhbGwKLWxvd2VyIGNhc2U7IGZvciBleGFtcGxlLCBAc2FtcHtjaGlwfSBpcyB0aGUgc2FtZSBhcyBAc2FtcHtDSElQfS4KLVRoZSBmb2xsb3dpbmcgbGlzdCBzaG93cyBvbmx5IHRoZSB1cHBlci1jYXNlIGZvcm0gb2YgZWFjaCBjb21tYW5kLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7QUJTT0xVVEV9IChNUkkpCi1AaXRlbSBBQlNPTFVURSBAdmFye3NlY25hbWV9Ci1AaXRlbXggQUJTT0xVVEUgQHZhcntzZWNuYW1lfSwgQHZhcntzZWNuYW1lfSwgQGRvdHN7fSBAdmFye3NlY25hbWV9Ci1Ob3JtYWxseSwgQGNvZGV7bGR9IGluY2x1ZGVzIGluIHRoZSBvdXRwdXQgZmlsZSBhbGwgc2VjdGlvbnMgZnJvbSBhbGwKLXRoZSBpbnB1dCBmaWxlcy4gIEhvd2V2ZXIsIGluIGFuIE1SSS1jb21wYXRpYmxlIHNjcmlwdCwgeW91IGNhbiB1c2UgdGhlCi1AY29kZXtBQlNPTFVURX0gY29tbWFuZCB0byByZXN0cmljdCB0aGUgc2VjdGlvbnMgdGhhdCB3aWxsIGJlIHByZXNlbnQgaW4KLXlvdXIgb3V0cHV0IHByb2dyYW0uICBJZiB0aGUgQGNvZGV7QUJTT0xVVEV9IGNvbW1hbmQgaXMgdXNlZCBhdCBhbGwgaW4gYQotc2NyaXB0LCB0aGVuIG9ubHkgdGhlIHNlY3Rpb25zIG5hbWVkIGV4cGxpY2l0bHkgaW4gQGNvZGV7QUJTT0xVVEV9Ci1jb21tYW5kcyB3aWxsIGFwcGVhciBpbiB0aGUgbGlua2VyIG91dHB1dC4gIFlvdSBjYW4gc3RpbGwgdXNlIG90aGVyCi1pbnB1dCBzZWN0aW9ucyAod2hhdGV2ZXIgeW91IHNlbGVjdCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciB1c2luZwotQGNvZGV7TE9BRH0pIHRvIHJlc29sdmUgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotQGNpbmRleCBAY29kZXtBTElBU30gKE1SSSkKLUBpdGVtIEFMSUFTIEB2YXJ7b3V0LXNlY25hbWV9LCBAdmFye2luLXNlY25hbWV9Ci1Vc2UgdGhpcyBjb21tYW5kIHRvIHBsYWNlIHRoZSBkYXRhIGZyb20gaW5wdXQgc2VjdGlvbiBAdmFye2luLXNlY25hbWV9Ci1pbiBhIHNlY3Rpb24gY2FsbGVkIEB2YXJ7b3V0LXNlY25hbWV9IGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuCi0KLUB2YXJ7aW4tc2VjbmFtZX0gbWF5IGJlIGFuIGludGVnZXIuCi0KLUBjaW5kZXggQGNvZGV7QUxJR059IChNUkkpCi1AaXRlbSBBTElHTiBAdmFye3NlY25hbWV9ID0gQHZhcntleHByZXNzaW9ufQotQWxpZ24gdGhlIHNlY3Rpb24gY2FsbGVkIEB2YXJ7c2VjbmFtZX0gdG8gQHZhcntleHByZXNzaW9ufS4gIFRoZQotQHZhcntleHByZXNzaW9ufSBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28uCi0KLUBjaW5kZXggQGNvZGV7QkFTRX0gKE1SSSkKLUBpdGVtIEJBU0UgQHZhcntleHByZXNzaW9ufQotVXNlIHRoZSB2YWx1ZSBvZiBAdmFye2V4cHJlc3Npb259IGFzIHRoZSBsb3dlc3QgYWRkcmVzcyAob3RoZXIgdGhhbgotYWJzb2x1dGUgYWRkcmVzc2VzKSBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBjaW5kZXggQGNvZGV7Q0hJUH0gKE1SSSkKLUBpdGVtIENISVAgQHZhcntleHByZXNzaW9ufQotQGl0ZW14IENISVAgQHZhcntleHByZXNzaW9ufSwgQHZhcntleHByZXNzaW9ufQotVGhpcyBjb21tYW5kIGRvZXMgbm90aGluZzsgaXQgaXMgYWNjZXB0ZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KLQotQGNpbmRleCBAY29kZXtFTkR9IChNUkkpCi1AaXRlbSBFTkQKLVRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcgd2hhdGV2ZXI7IGl0J3Mgb25seSBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eS4KLQotQGNpbmRleCBAY29kZXtGT1JNQVR9IChNUkkpCi1AaXRlbSBGT1JNQVQgQHZhcntvdXRwdXQtZm9ybWF0fQotU2ltaWxhciB0byB0aGUgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY29tbWFuZCBpbiB0aGUgbW9yZSBnZW5lcmFsIGxpbmtlcgotbGFuZ3VhZ2UsIGJ1dCByZXN0cmljdGVkIHRvIG9uZSBvZiB0aGVzZSBvdXRwdXQgZm9ybWF0czogCi0KLUBlbnVtZXJhdGUKLUBpdGVtIAotUy1yZWNvcmRzLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we1N9Ci0KLUBpdGVtCi1JRUVFLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we0lFRUV9Ci0KLUBpdGVtCi1DT0ZGICh0aGUgQHNhbXB7Y29mZi1tNjhrfSB2YXJpYW50IGluIEJGRCksIGlmIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMKLUBzYW1we0NPRkZ9Ci1AZW5kIGVudW1lcmF0ZQotCi1AY2luZGV4IEBjb2Rle0xJU1R9IChNUkkpCi1AaXRlbSBMSVNUIEB2YXJ7YW55dGhpbmd9QGRvdHN7fQotUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcCwgYXMgcHJvZHVjZWQgYnkgdGhlCi1AY29kZXtsZH0gY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0uCi0KLVRoZSBrZXl3b3JkIEBjb2Rle0xJU1R9IG1heSBiZSBmb2xsb3dlZCBieSBhbnl0aGluZyBvbiB0aGUKLXNhbWUgbGluZSwgd2l0aCBubyBjaGFuZ2UgaW4gaXRzIGVmZmVjdC4KLQotQGNpbmRleCBAY29kZXtMT0FEfSAoTVJJKQotQGl0ZW0gTE9BRCBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IExPQUQgQHZhcntmaWxlbmFtZX0sIEB2YXJ7ZmlsZW5hbWV9LCBAZG90c3t9IEB2YXJ7ZmlsZW5hbWV9Ci1JbmNsdWRlIG9uZSBvciBtb3JlIG9iamVjdCBmaWxlIEB2YXJ7ZmlsZW5hbWV9IGluIHRoZSBsaW5rOyB0aGlzIGhhcyB0aGUKLXNhbWUgZWZmZWN0IGFzIHNwZWNpZnlpbmcgQHZhcntmaWxlbmFtZX0gZGlyZWN0bHkgb24gdGhlIEBjb2Rle2xkfQotY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IEBjb2Rle05BTUV9IChNUkkpCi1AaXRlbSBOQU1FIEB2YXJ7b3V0cHV0LW5hbWV9Ci1AdmFye291dHB1dC1uYW1lfSBpcyB0aGUgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgQGNvZGV7bGR9OyB0aGUKLU1SSS1jb21wYXRpYmxlIGNvbW1hbmQgQGNvZGV7TkFNRX0gaXMgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZC1saW5lCi1vcHRpb24gQHNhbXB7LW99IG9yIHRoZSBnZW5lcmFsIHNjcmlwdCBsYW5ndWFnZSBjb21tYW5kIEBjb2Rle09VVFBVVH0uCi0KLUBjaW5kZXggQGNvZGV7T1JERVJ9IChNUkkpCi1AaXRlbSBPUkRFUiBAdmFye3NlY25hbWV9LCBAdmFye3NlY25hbWV9LCBAZG90c3t9IEB2YXJ7c2VjbmFtZX0KLUBpdGVteCBPUkRFUiBAdmFye3NlY25hbWV9IEB2YXJ7c2VjbmFtZX0gQHZhcntzZWNuYW1lfQotTm9ybWFsbHksIEBjb2Rle2xkfSBvcmRlcnMgdGhlIHNlY3Rpb25zIGluIGl0cyBvdXRwdXQgZmlsZSBpbiB0aGUKLW9yZGVyIGluIHdoaWNoIHRoZXkgZmlyc3QgYXBwZWFyIGluIHRoZSBpbnB1dCBmaWxlcy4gIEluIGFuIE1SSS1jb21wYXRpYmxlCi1zY3JpcHQsIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBvcmRlcmluZyB3aXRoIHRoZSBAY29kZXtPUkRFUn0gY29tbWFuZC4gIFRoZQotc2VjdGlvbnMgeW91IGxpc3Qgd2l0aCBAY29kZXtPUkRFUn0gd2lsbCBhcHBlYXIgZmlyc3QgaW4geW91ciBvdXRwdXQKLWZpbGUsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuCi0KLUBjaW5kZXggQGNvZGV7UFVCTElDfSAoTVJJKQotQGl0ZW0gUFVCTElDIEB2YXJ7bmFtZX09QHZhcntleHByZXNzaW9ufQotQGl0ZW14IFBVQkxJQyBAdmFye25hbWV9LEB2YXJ7ZXhwcmVzc2lvbn0KLUBpdGVteCBQVUJMSUMgQHZhcntuYW1lfSBAdmFye2V4cHJlc3Npb259Ci1TdXBwbHkgYSB2YWx1ZSAoQHZhcntleHByZXNzaW9ufSkgZm9yIGV4dGVybmFsIHN5bWJvbAotQHZhcntuYW1lfSB1c2VkIGluIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMuCi0KLUBjaW5kZXggQGNvZGV7U0VDVH0gKE1SSSkKLUBpdGVtIFNFQ1QgQHZhcntzZWNuYW1lfSwgQHZhcntleHByZXNzaW9ufQotQGl0ZW14IFNFQ1QgQHZhcntzZWNuYW1lfT1AdmFye2V4cHJlc3Npb259Ci1AaXRlbXggU0VDVCBAdmFye3NlY25hbWV9IEB2YXJ7ZXhwcmVzc2lvbn0KLVlvdSBjYW4gdXNlIGFueSBvZiB0aGVzZSB0aHJlZSBmb3JtcyBvZiB0aGUgQGNvZGV7U0VDVH0gY29tbWFuZCB0bwotc3BlY2lmeSB0aGUgc3RhcnQgYWRkcmVzcyAoQHZhcntleHByZXNzaW9ufSkgZm9yIHNlY3Rpb24gQHZhcntzZWNuYW1lfS4KLUlmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgQGNvZGV7U0VDVH0gc3RhdGVtZW50IGZvciB0aGUgc2FtZQotQHZhcntzZWNuYW1lfSwgb25seSB0aGUgQGVtcGh7Zmlyc3R9IHNldHMgdGhlIHN0YXJ0IGFkZHJlc3MuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AdGV4Ci0lIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCi0lIG1lYW50aW1lOgotXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKLVxjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KLVxjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9Ci1cY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQotXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KLVxjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQotXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KLVxjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQotXHBhZ2VcY29sb3Bob24KLSUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgotQGVuZCB0ZXgKLQotCi1AY29udGVudHMKLUBieWUKLQotCmRpZmYgLS1naXQgYS9sZC9sZGNyZWYuYyBiL2xkL2xkY3JlZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmUwZDJkLi4wMDAwMDAwCi0tLSBhL2xkL2xkY3JlZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qIGxkY3JlZi5jIC0tIG91dHB1dCBhIGNyb3NzIHJlZmVyZW5jZSB0YWJsZQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIHJvdXRpbmVzIHRoYXQgbWFuYWdlIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUuCi0gICBUaGUgdGFibGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBjcm9zcyByZWZlcmVuY2UgcmVwb3J0cy4gIEl0IGlzIGFsc28KLSAgIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBOT0NST1NTUkVGUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotLyogV2Uga2VlcCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSBmb3IgZWFjaCByZWZlcmVuY2UgdG8gYQotICAgc3ltYm9sIGZyb20gYSBnaXZlbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgY3JlZl9yZWYKLXsKLSAgLyogVGhlIG5leHQgcmVmZXJlbmNlLiAgKi8KLSAgc3RydWN0IGNyZWZfcmVmICpuZXh0OwotICAvKiBUaGUgb2JqZWN0LiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWYgOiAxOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgY29tbW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbW1vbiA6IDE7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdW5kZWYgOiAxOwotfTsKLQotLyogV2Uga2VlcCBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIEVhY2ggZW50cnkgbG9va3MgbGlrZSB0aGlzLiAgKi8KLQotc3RydWN0IGNyZWZfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogVGhlIGRlbWFuZ2xlZCBuYW1lLiAgKi8KLSAgY2hhciAqZGVtYW5nbGVkOwotICAvKiBSZWZlcmVuY2VzIHRvIGFuZCBkZWZpbml0aW9ucyBvZiB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBjcmVmX3JlZiAqcmVmczsKLX07Ci0KLS8qIFRoaXMgaXMgd2hhdCB0aGUgaGFzaCB0YWJsZSBsb29rcyBsaWtlLiAgKi8KLQotc3RydWN0IGNyZWZfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmNyZWZfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjcmVmX2ZpbGxfYXJyYXkgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBpbnQgY3JlZl9zb3J0X2FycmF5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfb25lX2NyZWYgUEFSQU1TICgoRklMRSAqLCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGNoZWNrX25vY3Jvc3NyZWYgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3JlZnMKLSAgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICopKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3JlbG9jX3JlZnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNyZWZfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KQkJXAotICAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVHJhdmVyc2UgdGhlIGNyZWYgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY3JlZl9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCQlcCi0gIChiZmRfaGFzaF90cmF2ZXJzZQkJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBUaGUgY3JlZiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBjcmVmX2hhc2hfdGFibGUgY3JlZl90YWJsZTsKLQotLyogV2hldGhlciB0aGUgY3JlZiBoYXNoIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY3JlZl9pbml0aWFsaXplZDsKLQotLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIHNlZW4gc28gZmFyLiAgKi8KLQotc3RhdGljIHNpemVfdCBjcmVmX3N5bWNvdW50OwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWNyZWZfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+ZGVtYW5nbGVkID0gTlVMTDsKLSAgICAgIHJldC0+cmVmcyA9IE5VTEw7Ci0KLSAgICAgIC8qIEtlZXAgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY3JlYXRlZCBpbiB0aGUgaGFzaAotICAgICAgICAgdGFibGUuICAqLwotICAgICAgKytjcmVmX3N5bWNvdW50OwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgY3JlZiBoYXNoIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGV2ZXJ5Ci0gICBzeW1ib2wgdGhhdCBpcyBzZWVuIGR1cmluZyB0aGUgbGluay4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotYWRkX2NyZWYgKG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgY3JlZl9yZWYgKnI7Ci0KLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmY3JlZl90YWJsZS5yb290LCBjcmVmX2hhc2hfbmV3ZnVuYykpCi0JZWluZm8gKF8oIiVYJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgb2YgY3JlZiB0YWJsZSBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgICBjcmVmX2luaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaCA9IGNyZWZfaGFzaF9sb29rdXAgKCZjcmVmX3RhYmxlLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgZWluZm8gKF8oIiVYJVA6IGNyZWZfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCi0gIGZvciAociA9IGgtPnJlZnM7IHIgIT0gTlVMTDsgciA9IHItPm5leHQpCi0gICAgaWYgKHItPmFiZmQgPT0gYWJmZCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChyID09IE5VTEwpCi0gICAgewotICAgICAgciA9IChzdHJ1Y3QgY3JlZl9yZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKLSAgICAgIHItPm5leHQgPSBoLT5yZWZzOwotICAgICAgaC0+cmVmcyA9IHI7Ci0gICAgICByLT5hYmZkID0gYWJmZDsKLSAgICAgIHItPmRlZiA9IGZhbHNlOwotICAgICAgci0+Y29tbW9uID0gZmFsc2U7Ci0gICAgICByLT51bmRlZiA9IGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByLT51bmRlZiA9IHRydWU7Ci0gIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgci0+Y29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIHItPmRlZiA9IHRydWU7Ci19Ci0KLS8qIENvcHkgdGhlIGFkZHJlc3NlcyBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyaWVzIGludG8gYW4gYXJyYXkuICBUaGlzCi0gICBpcyBjYWxsZWQgdmlhIGNyZWZfaGFzaF90cmF2ZXJzZS4gIFdlIGFsc28gZmlsbCBpbiB0aGUgZGVtYW5nbGVkCi0gICBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNyZWZfZmlsbF9hcnJheSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKioqcHBoID0gKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKioqKSBkYXRhOwotCi0gIEFTU0VSVCAoaC0+ZGVtYW5nbGVkID09IE5VTEwpOwotICBoLT5kZW1hbmdsZWQgPSBkZW1hbmdsZSAoaC0+cm9vdC5zdHJpbmcpOwotCi0gICoqcHBoID0gaDsKLQotICArKypwcGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNvcnQgYW4gYXJyYXkgb2YgY3JlZiBoYXNoIHRhYmxlIGVudHJpZXMgYnkgbmFtZS4gICovCi0KLXN0YXRpYyBpbnQKLWNyZWZfc29ydF9hcnJheSAoYTEsIGEyKQotICAgICBjb25zdCBQVFIgYTE7Ci0gICAgIGNvbnN0IFBUUiBhMjsKLXsKLSAgY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKnAxID0gKGNvbnN0IHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKiopIGExOwotICBjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqcDIgPSAoY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikgYTI7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoKCpwMSktPmRlbWFuZ2xlZCwgKCpwMiktPmRlbWFuZ2xlZCk7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgY3JlZiB0YWJsZS4gICovCi0KLSNkZWZpbmUgRklMRUNPTCAoNTApCi0KLXZvaWQKLW91dHB1dF9jcmVmIChmcCkKLSAgICAgRklMRSAqZnA7Ci17Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKipjc3ltcywgKipjc3ltX2ZpbGwsICoqY3N5bSwgKipjc3ltX2VuZDsKLSAgY29uc3QgY2hhciAqbXNnOwotCi0gIGZwcmludGYgKGZwLCBfKCJcbkNyb3NzIFJlZmVyZW5jZSBUYWJsZVxuXG4iKSk7Ci0gIG1zZyA9IF8oIlN5bWJvbCIpOwotICBmcHJpbnRmIChmcCwgbXNnKTsKLSAgbGVuID0gc3RybGVuIChtc2cpOwotICB3aGlsZSAobGVuIDwgRklMRUNPTCkKLSAgICB7Ci0gICAgICBwdXRjICgnICcgLCBmcCk7Ci0gICAgICArK2xlbjsKLSAgICB9Ci0gIGZwcmludGYgKGZwLCBfKCJGaWxlXG4iKSk7Ci0KLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmcCwgXygiTm8gc3ltYm9sc1xuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjc3ltcyA9ICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikKLQkgICB4bWFsbG9jIChjcmVmX3N5bWNvdW50ICogc2l6ZW9mICgqY3N5bXMpKSk7Ci0KLSAgY3N5bV9maWxsID0gY3N5bXM7Ci0gIGNyZWZfaGFzaF90cmF2ZXJzZSAoJmNyZWZfdGFibGUsIGNyZWZfZmlsbF9hcnJheSwgJmNzeW1fZmlsbCk7Ci0gIEFTU0VSVCAoKHNpemVfdCkgKGNzeW1fZmlsbCAtIGNzeW1zKSA9PSBjcmVmX3N5bWNvdW50KTsKLQotICBxc29ydCAoY3N5bXMsIGNyZWZfc3ltY291bnQsIHNpemVvZiAoKmNzeW1zKSwgY3JlZl9zb3J0X2FycmF5KTsKLQotICBjc3ltX2VuZCA9IGNzeW1zICsgY3JlZl9zeW1jb3VudDsKLSAgZm9yIChjc3ltID0gY3N5bXM7IGNzeW0gPCBjc3ltX2VuZDsgY3N5bSsrKQotICAgIG91dHB1dF9vbmVfY3JlZiAoZnAsICpjc3ltKTsKLX0KLQotLyogT3V0cHV0IG9uZSBlbnRyeSBpbiB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLW91dHB1dF9vbmVfY3JlZiAoZnAsIGgpCi0gICAgIEZJTEUgKmZwOwotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotewotICBpbnQgbGVuOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGw7Ci0gIHN0cnVjdCBjcmVmX3JlZiAqcjsKLQotICBobCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgaC0+cm9vdC5zdHJpbmcsIGZhbHNlLAotCQkJICAgICBmYWxzZSwgdHJ1ZSk7Ci0gIGlmIChobCA9PSBOVUxMKQotICAgIGVpbmZvICgiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIsCi0JICAgaC0+cm9vdC5zdHJpbmcpOwotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGJ1dCBuZXZlcgotCSByZWZlcmVuY2VkIGJ5IGEgbm9ybWFsIG9iamVjdCwgdGhlbiBkb24ndCBwcmludCBpdC4gICovCi0gICAgICBpZiAoaGwtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCXsKLQkgIGlmIChobC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgcmV0dXJuOwotCSAgaWYgKGhsLT51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgICAgJiYgKGhsLT51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCSAgICB7Ci0JICAgICAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLQkJaWYgKChyLT5hYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgaWYgKHIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChmcCwgIiVzICIsIGgtPmRlbWFuZ2xlZCk7Ci0gIGxlbiA9IHN0cmxlbiAoaC0+ZGVtYW5nbGVkKSArIDE7Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoci0+ZGVmKQotCXsKLQkgIHdoaWxlIChsZW4gPCBGSUxFQ09MKQotCSAgICB7Ci0JICAgICAgcHV0YyAoJyAnLCBmcCk7Ci0JICAgICAgKytsZW47Ci0JICAgIH0KLQkgIGxmaW5mbyAoZnAsICIlQlxuIiwgci0+YWJmZCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICB9Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISByLT5kZWYpCi0JewotCSAgd2hpbGUgKGxlbiA8IEZJTEVDT0wpCi0JICAgIHsKLQkgICAgICBwdXRjICgnICcsIGZwKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCSAgbGZpbmZvIChmcCwgIiVCXG4iLCByLT5hYmZkKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgIH0KLQotICBBU1NFUlQgKGxlbiA9PSAwKTsKLX0KLQotLyogQ2hlY2sgZm9yIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlcy4gICovCi0KLXZvaWQKLWNoZWNrX25vY3Jvc3NyZWZzICgpCi17Ci0gIGlmICghIGNyZWZfaW5pdGlhbGl6ZWQpCi0gICAgcmV0dXJuOwotCi0gIGNyZWZfaGFzaF90cmF2ZXJzZSAoJmNyZWZfdGFibGUsIGNoZWNrX25vY3Jvc3NyZWYsIChQVFIpIE5VTEwpOwotfQotCi0vKiBDaGVjayBvbmUgc3ltYm9sIHRvIHNlZSBpZiBpdCBpcyBhIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY2hlY2tfbm9jcm9zc3JlZiAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWdub3JlOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGw7Ci0gIGFzZWN0aW9uICpkZWZzZWM7Ci0gIGNvbnN0IGNoYXIgKmRlZnNlY25hbWU7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuY3JzOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuY3I7Ci0KLSAgaGwgPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGgtPnJvb3Quc3RyaW5nLCBmYWxzZSwKLQkJCSAgICAgZmFsc2UsIHRydWUpOwotICBpZiAoaGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIpLAotCSAgICAgaC0+cm9vdC5zdHJpbmcpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChobC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICYmIGhsLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkZWZzZWMgPSBobC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0gIGlmIChkZWZzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZGVmc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkZWZzZWMtPm93bmVyLCBkZWZzZWMpOwotCi0gIGZvciAobmNycyA9IG5vY3Jvc3NyZWZfbGlzdDsgbmNycyAhPSBOVUxMOyBuY3JzID0gbmNycy0+bmV4dCkKLSAgICBmb3IgKG5jciA9IG5jcnMtPmxpc3Q7IG5jciAhPSBOVUxMOyBuY3IgPSBuY3ItPm5leHQpCi0gICAgICBpZiAoc3RyY21wIChuY3ItPm5hbWUsIGRlZnNlY25hbWUpID09IDApCi0JY2hlY2tfcmVmcyAoaCwgaGwsIG5jcnMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBmcm9tIGNoZWNrX3JlZnMgdG8KLSAgIGNoZWNrX3JlbG9jX3JlZnMgdGhyb3VnaCBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdHJ1Y3QgY2hlY2tfcmVmc19pbmZvCi17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gIGFzZWN0aW9uICpkZWZzZWM7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuY3JzOwotICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gIGJvb2xlYW4gc2FtZTsKLX07Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCBkZWZpbmVkIGluIGEgc2VjdGlvbiB3aGljaAotICAgcHJvaGliaXRzIGNyb3NzIHJlZmVyZW5jZXMuICBXZSBuZWVkIHRvIGxvb2sgdGhyb3VnaCBhbGwgcmVmZXJlbmNlcwotICAgdG8gdGhpcyBzeW1ib2wsIGFuZCBlbnN1cmUgdGhhdCB0aGUgcmVmZXJlbmNlcyBhcmUgbm90IGZyb20KLSAgIHByb2hpYml0ZWQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfcmVmcyAoaCwgaGwsIG5jcnMpCi0gICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKLSAgICAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5jcnM7Ci17Ci0gIHN0cnVjdCBjcmVmX3JlZiAqcmVmOwotCi0gIGZvciAocmVmID0gaC0+cmVmczsgcmVmICE9IE5VTEw7IHJlZiA9IHJlZi0+bmV4dCkKLSAgICB7Ci0gICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpsaTsKLSAgICAgIGFzeW1ib2wgKiphc3ltYm9sczsKLSAgICAgIHN0cnVjdCBjaGVja19yZWZzX2luZm8gaW5mbzsKLQotICAgICAgLyogV2UgbmVlZCB0byBsb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zIGZvciB0aGlzIEJGRCwgdG8gc2VlCi0gICAgICAgICBpZiBhbnkgb2YgdGhlIHJlbG9jYXRpb25zIHdoaWNoIHJlZmVyIHRvIHRoaXMgc3ltYm9sIGFyZSBmcm9tCi0gICAgICAgICBhIHByb2hpYml0ZWQgc2VjdGlvbi4gIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGRvIHRoaXMgZXZlbiBmb3IKLSAgICAgICAgIHRoZSBCRkQgaW4gd2hpY2ggdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBzaW5jZSBldmVuIGEgc2luZ2xlCi0gICAgICAgICBCRkQgbWlnaHQgY29udGFpbiBhIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlOyBmb3IgdGhpcwotICAgICAgICAgY2FzZSwgd2Ugc2V0IHRoZSBTQU1FIGZpZWxkIGluIElORk8sIHdoaWNoIHdpbGwgY2F1c2UKLSAgICAgICAgIENIRUNLX1JFTE9DU19SRUZTIHRvIGNoZWNrIGZvciByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZQotICAgICAgICAgc2VjdGlvbiBhcyB3ZWxsIGFzIGFnYWluc3QgdGhlIHN5bWJvbC4gICovCi0KLSAgICAgIGxpID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgcmVmLT5hYmZkLT51c3JkYXRhOwotICAgICAgaWYgKGxpICE9IE5VTEwgJiYgbGktPmFzeW1ib2xzICE9IE5VTEwpCi0JYXN5bWJvbHMgPSBsaS0+YXN5bWJvbHM7Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBzeW1zaXplOwotCSAgbG9uZyBzeW1ib2xfY291bnQ7Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAocmVmLT5hYmZkKTsKLQkgIGlmIChzeW1zaXplIDwgMCkKLQkgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM7ICVFXG4iKSwgcmVmLT5hYmZkKTsKLQkgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKHJlZi0+YWJmZCwgYXN5bWJvbHMpOwotCSAgaWYgKHN5bWJvbF9jb3VudCA8IDApCi0JICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIHJlZi0+YWJmZCk7Ci0JICBpZiAobGkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxpLT5hc3ltYm9scyA9IGFzeW1ib2xzOwotCSAgICAgIGxpLT5zeW1ib2xfY291bnQgPSBzeW1ib2xfY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluZm8uaCA9IGg7Ci0gICAgICBpbmZvLmRlZnNlYyA9IGhsLT51LmRlZi5zZWN0aW9uOwotICAgICAgaW5mby5uY3JzID0gbmNyczsKLSAgICAgIGluZm8uYXN5bWJvbHMgPSBhc3ltYm9sczsKLSAgICAgIGlmIChyZWYtPmFiZmQgPT0gaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyKQotCWluZm8uc2FtZSA9IHRydWU7Ci0gICAgICBlbHNlCi0JaW5mby5zYW1lID0gZmFsc2U7Ci0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHJlZi0+YWJmZCwgY2hlY2tfcmVsb2NfcmVmcywgKFBUUikgJmluZm8pOwotCi0gICAgICBpZiAobGkgPT0gTlVMTCkKLQlmcmVlIChhc3ltYm9scyk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgSU5GTy0+SCBpcyBhIHN5bWJvbAotICAgZGVmaW5lZCBpbiBJTkZPLT5ERUZTRUNOQU1FLiAgSWYgdGhpcyBzZWN0aW9uIG1hcHMgaW50byBhbnkgb2YgdGhlCi0gICBzZWN0aW9ucyBsaXN0ZWQgaW4gSU5GTy0+TkNSUywgb3RoZXIgdGhhbiBJTkZPLT5ERUZTRUNOQU1FLCB0aGVuIHdlCi0gICBsb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zLiAgSWYgYW55IG9mIHRoZSByZWxvY2F0aW9ucyBhcmUgdG8KLSAgIElORk8tPkgsIHRoZW4gd2UgcmVwb3J0IGEgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZXJyb3IuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfcmVsb2NfcmVmcyAoYWJmZCwgc2VjLCBpYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBpYXJnOwotewotICBzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvICppbmZvID0gKHN0cnVjdCBjaGVja19yZWZzX2luZm8gKikgaWFyZzsKLSAgYXNlY3Rpb24gKm91dHNlYzsKLSAgY29uc3QgY2hhciAqb3V0c2VjbmFtZTsKLSAgYXNlY3Rpb24gKm91dGRlZnNlYzsKLSAgY29uc3QgY2hhciAqb3V0ZGVmc2VjbmFtZTsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmNyOwotICBjb25zdCBjaGFyICpzeW1uYW1lOwotICBsb25nIHJlbHNpemU7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudDsKLSAgYXJlbGVudCAqKnAsICoqcGVuZDsKLQotICBvdXRzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICBvdXRzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHNlYy0+b3duZXIsIG91dHNlYyk7Ci0KLSAgb3V0ZGVmc2VjID0gaW5mby0+ZGVmc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgb3V0ZGVmc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRkZWZzZWMtPm93bmVyLCBvdXRkZWZzZWMpOwotCi0gIC8qIFRoZSBzZWN0aW9uIHdoZXJlIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpcyBwZXJtaXR0ZWQuICAqLwotICBpZiAoc3RyY21wIChvdXRzZWNuYW1lLCBvdXRkZWZzZWNuYW1lKSA9PSAwKQotICAgIHJldHVybjsKLQotICBmb3IgKG5jciA9IGluZm8tPm5jcnMtPmxpc3Q7IG5jciAhPSBOVUxMOyBuY3IgPSBuY3ItPm5leHQpCi0gICAgaWYgKHN0cmNtcCAob3V0c2VjbmFtZSwgbmNyLT5uYW1lKSA9PSAwKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKG5jciA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBUaGlzIHNlY3Rpb24gaXMgb25lIGZvciB3aGljaCBjcm9zcyByZWZlcmVuY2VzIGFyZSBwcm9oaWJpdGVkLgotICAgICBMb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zLCBhbmQgc2VlIGlmIGFueSBvZiB0aGVtIGFyZSB0bwotICAgICBJTkZPLT5ILiAgKi8KLQotICBzeW1uYW1lID0gaW5mby0+aC0+cm9vdC5zdHJpbmc7Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOwotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbHBwLCBpbmZvLT5hc3ltYm9scyk7Ci0gIGlmIChyZWxjb3VudCA8IDApCi0gICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKLQotICBwID0gcmVscHA7Ci0gIHBlbmQgPSBwICsgcmVsY291bnQ7Ci0gIGZvciAoOyBwIDwgcGVuZCAmJiAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcSA9ICpwOwotCi0gICAgICBpZiAocS0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCSAgJiYgKnEtPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkgICYmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKCpxLT5zeW1fcHRyX3B0ciksIHN5bW5hbWUpID09IDAKLQkgICAgICB8fCAoaW5mby0+c2FtZQotCQkgICYmIGJmZF9nZXRfc2VjdGlvbiAoKnEtPnN5bV9wdHJfcHRyKSA9PSBpbmZvLT5kZWZzZWMpKSkKLQl7Ci0JICAvKiBXZSBmb3VuZCBhIHJlbG9jIGZvciB0aGUgc3ltYm9sLiAgVGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgICAgICAgICAgaW4gT1VUU0VDTkFNRS4gIFRoaXMgcmVsb2MgaXMgZnJvbSBhIHNlY3Rpb24gd2hpY2ggaXMKLSAgICAgICAgICAgICBtYXBwZWQgaW50byBhIHNlY3Rpb24gZnJvbSB3aGljaCByZWZlcmVuY2VzIHRvIE9VVFNFQ05BTUUKLSAgICAgICAgICAgICBhcmUgcHJvaGliaXRlZC4gIFdlIG11c3QgcmVwb3J0IGFuIGVycm9yLiAgKi8KLQkgIGVpbmZvIChfKCIlWCVDOiBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tICVzIHRvIGAlVCcgaW4gJXNcbiIpLAotCQkgYWJmZCwgc2VjLCBxLT5hZGRyZXNzLCBvdXRzZWNuYW1lLAotCQkgYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKSwgb3V0ZGVmc2VjbmFtZSk7Ci0JfQotICAgIH0KLQotICBmcmVlIChyZWxwcCk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGN0b3IuYyBiL2xkL2xkY3Rvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQzNGI4Li4wMDAwMDAwCi0tLSBhL2xkL2xkY3Rvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qIGxkY3Rvci5jIC0tIGNvbnN0cnVjdG9yIHN1cHBvcnQgcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBCeSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotCi1zdGF0aWMgaW50IGN0b3JfcHJpbyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgY3Rvcl9jbXAgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogVGhlIGxpc3Qgb2Ygc3RhdGVtZW50cyBuZWVkZWQgdG8gaGFuZGxlIGNvbnN0cnVjdG9ycy4gIFRoZXNlIGFyZQotICAgaW52b2tlZCBieSB0aGUgY29tbWFuZCBDT05TVFJVQ1RPUlMgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGNvbnN0cnVjdG9yX2xpc3Q7Ci0KLS8qIFdoZXRoZXIgdGhlIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgc29ydGVkLiAgTm90ZSB0aGF0IHRoaXMgaXMKLSAgIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBsaW5rOyB3ZSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlCi0gICBDT05TVFJVQ1RPUlMgY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi1ib29sZWFuIGNvbnN0cnVjdG9yc19zb3J0ZWQ7Ci0KLS8qIFRoZSBzZXRzIHdlIGhhdmUgc2Vlbi4gICovCi1zdHJ1Y3Qgc2V0X2luZm8gKnNldHM7Ci0KLS8qIEFkZCBhbiBlbnRyeSB0byBhIHNldC4gIEggaXMgdGhlIGVudHJ5IGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLSAgIFJFTE9DIGlzIHRoZSByZWxvY2F0aW9uIHRvIHVzZSBmb3IgYW4gZW50cnkgaW4gdGhlIHNldC4gIFNFQ1RJT04KLSAgIGFuZCBWQUxVRSBhcmUgdGhlIHZhbHVlIHRvIGFkZC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgZmlyc3QKLSAgIHBoYXNlIG9mIHRoZSBsaW5rLCB3aGVuIHdlIGFyZSBzdGlsbCBnYXRoZXJpbmcgc3ltYm9scyB0b2dldGhlci4KLSAgIFdlIGp1c3QgcmVjb3JkIHRoZSBpbmZvcm1hdGlvbiBub3cuICBUaGUgbGRjdG9yX2ZpbmRfY29uc3RydWN0b3JzCi0gICBmdW5jdGlvbiB3aWxsIGNvbnN0cnVjdCB0aGUgc2V0cy4gICovCi0KLXZvaWQKLWxkY3Rvcl9hZGRfc2V0X2VudHJ5IChoLCByZWxvYywgbmFtZSwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzdHJ1Y3Qgc2V0X2luZm8gKnA7Ci0gIHN0cnVjdCBzZXRfZWxlbWVudCAqZTsKLSAgc3RydWN0IHNldF9lbGVtZW50ICoqZXBwOwotCi0gIGZvciAocCA9IHNldHM7IHAgIT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICBpZiAocC0+aCA9PSBoKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKHAgPT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHAgPSAoc3RydWN0IHNldF9pbmZvICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNldF9pbmZvKSk7Ci0gICAgICBwLT5uZXh0ID0gc2V0czsKLSAgICAgIHNldHMgPSBwOwotICAgICAgcC0+aCA9IGg7Ci0gICAgICBwLT5yZWxvYyA9IHJlbG9jOwotICAgICAgcC0+Y291bnQgPSAwOwotICAgICAgcC0+ZWxlbWVudHMgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwLT5yZWxvYyAhPSByZWxvYykKLQl7Ci0JICBlaW5mbyAoXygiJVAlWDogRGlmZmVyZW50IHJlbG9jcyB1c2VkIGluIHNldCAlc1xuIiksIGgtPnJvb3Quc3RyaW5nKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIERvbid0IHBlcm1pdCBhIHNldCB0byBiZSBjb25zdHJ1Y3RlZCBmcm9tIGRpZmZlcmVudCBvYmplY3QKLSAgICAgICAgIGZpbGUgZm9ybWF0cy4gIFRoZSBzYW1lIHJlbG9jIG1heSBoYXZlIGRpZmZlcmVudCByZXN1bHRzLiAgV2UKLSAgICAgICAgIGFjdHVhbGx5IGNvdWxkIHNvbWV0aW1lcyBoYW5kbGUgdGhpcywgYnV0IHRoZSBjYXNlIGlzCi0gICAgICAgICB1bmxpa2VseSB0byBldmVyIGFyaXNlLiAgU29tZXRpbWVzIGNvbnN0cnVjdG9yIHN5bWJvbHMgYXJlIGluCi0gICAgICAgICB1bnVzdWFsIHNlY3Rpb25zLCBzdWNoIGFzIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLS10aGlzIGFwcGVhcnMKLSAgICAgICAgIHRvIGJlIHRoZSBjYXNlIGluIExpbnV4IGEub3V0LS1hbmQgaW4gc3VjaCBjYXNlcyB3ZSBqdXN0Ci0gICAgICAgICBhc3N1bWUgZXZlcnl0aGluZyBpcyBPSy4gICovCi0gICAgICBpZiAocC0+ZWxlbWVudHMgIT0gTlVMTAotCSAgJiYgc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgJiYgcC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoYmZkX2dldF90YXJnZXQgKHNlY3Rpb24tPm93bmVyKSwKLQkJICAgICBiZmRfZ2V0X3RhcmdldCAocC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyKSkgIT0gMCkKLQl7Ci0JICBlaW5mbyAoXygiJVAlWDogRGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgY29tcG9zaW5nIHNldCAlc1xuIiksCi0JCSBoLT5yb290LnN0cmluZyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBlID0gKHN0cnVjdCBzZXRfZWxlbWVudCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZXRfZWxlbWVudCkpOwotICBlLT5uZXh0ID0gTlVMTDsKLSAgZS0+bmFtZSA9IG5hbWU7Ci0gIGUtPnNlY3Rpb24gPSBzZWN0aW9uOwotICBlLT52YWx1ZSA9IHZhbHVlOwotCi0gIGZvciAoZXBwID0gJnAtPmVsZW1lbnRzOyAqZXBwICE9IE5VTEw7IGVwcCA9ICYoKmVwcCktPm5leHQpCi0gICAgOwotICAqZXBwID0gZTsKLQotICArK3AtPmNvdW50OwotfQotCi0vKiBHZXQgdGhlIHByaW9yaXR5IG9mIGEgZysrIGdsb2JhbCBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGZyb20gdGhlCi0gICBzeW1ib2wgbmFtZS4gICovCi0KLXN0YXRpYyBpbnQKLWN0b3JfcHJpbyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogVGhlIG5hbWUgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIF9HTE9CQUxfJEkkNjU1MzUkdGVzdDAyX19Gdi4KLSAgICAgVGhlcmUgbWlnaHQgYmUgZXh0cmEgbGVhZGluZyB1bmRlcnNjb3JlcywgYW5kIHRoZSAkIGNoYXJhY3RlcnMKLSAgICAgbWlnaHQgYmUgc29tZXRoaW5nIGVsc2UuICBUaGUgSSBtaWdodCBiZSBhIEQuICAqLwotCi0gIHdoaWxlICgqbmFtZSA9PSAnXycpCi0gICAgKytuYW1lOwotCi0gIGlmIChzdHJuY21wIChuYW1lLCAiR0xPQkFMXyIsICBzaXplb2YgIkdMT0JBTF8iIC0gMSkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbmFtZSArPSBzaXplb2YgIkdMT0JBTF8iIC0gMTsKLQotICBpZiAobmFtZVswXSAhPSBuYW1lWzJdKQotICAgIHJldHVybiAtMTsKLSAgaWYgKG5hbWVbMV0gIT0gJ0knICYmIG5hbWVbMV0gIT0gJ0QnKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIG5hbWVbM10pKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gYXRvaSAobmFtZSArIDMpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc29ydCBjb25zdHJ1Y3RvciBlbGVtZW50cyBieSBwcmlvcml0eS4gIEl0Ci0gICBpcyBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotY3Rvcl9jbXAgKHAxLCBwMikKLSAgICAgY29uc3QgUFRSIHAxOwotICAgICBjb25zdCBQVFIgcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzZXRfZWxlbWVudCAqKnBlMSA9IChjb25zdCBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiopIHAxOwotICBjb25zdCBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKipwZTIgPSAoY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqKSBwMjsKLSAgY29uc3QgY2hhciAqbjE7Ci0gIGNvbnN0IGNoYXIgKm4yOwotICBpbnQgcHJpbzE7Ci0gIGludCBwcmlvMjsKLQotICBuMSA9ICgqcGUxKS0+bmFtZTsKLSAgaWYgKG4xID09IE5VTEwpCi0gICAgbjEgPSAiIjsKLSAgbjIgPSAoKnBlMiktPm5hbWU7Ci0gIGlmIChuMiA9PSBOVUxMKQotICAgIG4yID0gIiI7Ci0KLSAgLyogV2UgbmVlZCB0byBzb3J0IGluIHJldmVyc2Ugb3JkZXIgYnkgcHJpb3JpdHkuICBXaGVuIHR3bwotICAgICBjb25zdHJ1Y3RvcnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSwgd2Ugc2hvdWxkIG1haW50YWluIHRoZWlyCi0gICAgIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24uICAqLwotCi0gIHByaW8xID0gY3Rvcl9wcmlvIChuMSk7Ci0gIHByaW8yID0gY3Rvcl9wcmlvIChuMik7Ci0KLSAgLyogV2Ugc29ydCBpbiByZXZlcnNlIG9yZGVyIGJlY2F1c2UgdGhhdCBpcyB3aGF0IGcrKyBleHBlY3RzLiAgKi8KLSAgaWYgKHByaW8xIDwgcHJpbzIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKHByaW8xID4gcHJpbzIpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIEZvcmNlIGEgc3RhYmxlIHNvcnQuICAqLwotCi0gIGlmIChwZTEgPCBwZTIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChwZTEgPiBwZTIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGZpcnN0IHBoYXNlIG9mIHRoZSBsaW5rIGFuZAotICAgYmVmb3JlIHRoZSBzZWNvbmQgcGhhc2UuICBBdCB0aGlzIHBvaW50IGFsbCBzZXQgaW5mb3JtYXRpb24gaGFzCi0gICBiZWVuIGdhdGhlcmVkLiAgV2Ugbm93IHB1dCB0aGUgc3RhdGVtZW50cyB0byBidWlsZCB0aGUgc2V0cwotICAgdGhlbXNlbHZlcyBpbnRvIGNvbnN0cnVjdG9yX2xpc3QuICAqLwotCi12b2lkCi1sZGN0b3JfYnVpbGRfc2V0cyAoKQotewotICBzdGF0aWMgYm9vbGVhbiBjYWxsZWQ7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICBzdHJ1Y3Qgc2V0X2luZm8gKnA7Ci0KLSAgLyogVGhlIGVtdWxhdGlvbiBjb2RlIG1heSBjYWxsIHVzIGRpcmVjdGx5LCBidXQgd2Ugb25seSB3YW50IHRvIGRvCi0gICAgIHRoaXMgb25jZS4gICovCi0gIGlmIChjYWxsZWQpCi0gICAgcmV0dXJuOwotICBjYWxsZWQgPSB0cnVlOwotCi0gIGlmIChjb25zdHJ1Y3RvcnNfc29ydGVkKQotICAgIHsKLSAgICAgIGZvciAocCA9IHNldHM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaW50IGMsIGk7Ci0JICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmU7Ci0JICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiphcnJheTsKLQotCSAgaWYgKHAtPmVsZW1lbnRzID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBjID0gMDsKLQkgIGZvciAoZSA9IHAtPmVsZW1lbnRzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotCSAgICArK2M7Ci0KLQkgIGFycmF5ID0gKHN0cnVjdCBzZXRfZWxlbWVudCAqKikgeG1hbGxvYyAoYyAqIHNpemVvZiAqYXJyYXkpOwotCi0JICBpID0gMDsKLQkgIGZvciAoZSA9IHAtPmVsZW1lbnRzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXJyYXlbaV0gPSBlOwotCSAgICAgICsraTsKLQkgICAgfQotCi0JICBxc29ydCAoYXJyYXksIGMsIHNpemVvZiAqYXJyYXksIGN0b3JfY21wKTsKLQotCSAgZSA9IGFycmF5WzBdOwotCSAgcC0+ZWxlbWVudHMgPSBlOwotCSAgZm9yIChpID0gMDsgaSA8IGMgLSAxOyBpKyspCi0JICAgIGFycmF5W2ldLT5uZXh0ID0gYXJyYXlbaSArIDFdOwotCSAgYXJyYXlbaV0tPm5leHQgPSBOVUxMOwotCi0JICBmcmVlIChhcnJheSk7Ci0JfQotICAgIH0KLQotICBvbGQgPSBzdGF0X3B0cjsKLSAgc3RhdF9wdHIgPSAmY29uc3RydWN0b3JfbGlzdDsKLQotICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gIGhlYWRlcl9wcmludGVkID0gZmFsc2U7Ci0gIGZvciAocCA9IHNldHM7IHAgIT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGludCByZWxvY19zaXplLCBzaXplOwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHdlIG1heSBoYXZlIGJlZW4gaW52b2tlZCBmcm9tCi0JIGNvbGxlY3QsIGFuZCB0aGUgc2V0cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYnVpbHQsIHNvIHdlIGRvCi0JIG5vdCBkbyBhbnl0aGluZy4gICovCi0gICAgICBpZiAocC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBGb3IgZWFjaCBzZXQgd2UgYnVpbGQ6Ci0JICAgc2V0OgotCSAgICAgLmxvbmcgbnVtYmVyX29mX2VsZW1lbnRzCi0JICAgICAubG9uZyBlbGVtZW50MAotCSAgICAgLi4uCi0JICAgICAubG9uZyBlbGVtZW50TgotCSAgICAgLmxvbmcgMAotCSBleGNlcHQgdGhhdCB3ZSB1c2UgdGhlIHJpZ2h0IHNpemUgaW5zdGVhZCBvZiAubG9uZy4gIFdoZW4KLQkgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBnZW5lcmF0ZSByZWxvY3MgaW5zdGVhZCBvZgotCSBhZGRyZXNzZXMuICAqLwotICAgICAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIHAtPnJlbG9jKTsKLSAgICAgIGlmIChob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotCXsKLQkgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgZWluZm8gKF8oIiVQJVg6ICVzIGRvZXMgbm90IHN1cHBvcnQgcmVsb2MgJXMgZm9yIHNldCAlc1xuIiksCi0JCSAgICAgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLAotCQkgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChwLT5yZWxvYyksCi0JCSAgICAgcC0+aC0+cm9vdC5zdHJpbmcpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssIGFsbCB3ZSBuZWVkIGlzIHRoZQotCSAgICAgc2l6ZSwgd2hpY2ggd2UgY2FuIGdldCBmcm9tIHRoZSBpbnB1dCBCRkQuICAqLwotCSAgaWYgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciAhPSBOVUxMKQotCSAgICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAocC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyLAotCQkJCQkgICBwLT5yZWxvYyk7Ci0JICBpZiAoaG93dG8gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCIlUCVYOiAlcyBkb2VzIG5vdCBzdXBwb3J0IHJlbG9jICVzIGZvciBzZXQgJXNcbiIpLAotCQkgICAgIGJmZF9nZXRfdGFyZ2V0IChwLT5lbGVtZW50cy0+c2VjdGlvbi0+b3duZXIpLAotCQkgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChwLT5yZWxvYyksCi0JCSAgICAgcC0+aC0+cm9vdC5zdHJpbmcpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gICAgICBzd2l0Y2ggKHJlbG9jX3NpemUpCi0JewotCWNhc2UgMTogc2l6ZSA9IEJZVEU7IGJyZWFrOwotCWNhc2UgMjogc2l6ZSA9IFNIT1JUOyBicmVhazsKLQljYXNlIDQ6IHNpemUgPSBMT05HOyBicmVhazsKLQljYXNlIDg6Ci0JICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLQkgICAgc2l6ZSA9IFNRVUFEOwotCSAgZWxzZQotCSAgICBzaXplID0gUVVBRDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBlaW5mbyAoXygiJVAlWDogVW5zdXBwb3J0ZWQgc2l6ZSAlZCBmb3Igc2V0ICVzXG4iKSwKLQkJIGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pLCBwLT5oLT5yb290LnN0cmluZyk7Ci0JICBzaXplID0gTE9ORzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICIuIiwKLQkJCQkgICAgICBleHBfdW5vcCAoQUxJR05fSywKLQkJCQkJCWV4cF9pbnRvcCAocmVsb2Nfc2l6ZSkpKSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgcC0+aC0+cm9vdC5zdHJpbmcsCi0JCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOwotICAgICAgbGFuZ19hZGRfZGF0YSAoc2l6ZSwgZXhwX2ludG9wICgoYmZkX3ZtYSkgcC0+Y291bnQpKTsKLQotICAgICAgZm9yIChlID0gcC0+ZWxlbWVudHM7IGUgIT0gKHN0cnVjdCBzZXRfZWxlbWVudCAqKSBOVUxMOyBlID0gZS0+bmV4dCkKLQl7Ci0JICBpZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpbnQgbGVuOwotCi0JICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JCXsKLQkJICBtaW5mbyAoXygiXG5TZXQgICAgICAgICAgICAgICAgIFN5bWJvbFxuXG4iKSk7Ci0JCSAgaGVhZGVyX3ByaW50ZWQgPSB0cnVlOwotCQl9Ci0KLQkgICAgICBtaW5mbyAoIiVzIiwgcC0+aC0+cm9vdC5zdHJpbmcpOwotCSAgICAgIGxlbiA9IHN0cmxlbiAocC0+aC0+cm9vdC5zdHJpbmcpOwotCi0JICAgICAgaWYgKGxlbiA+PSAxOSkKLQkJewotCQkgIHByaW50X25sICgpOwotCQkgIGxlbiA9IDA7Ci0JCX0KLQkgICAgICB3aGlsZSAobGVuIDwgMjApCi0JCXsKLQkJICBwcmludF9zcGFjZSAoKTsKLQkJICArK2xlbjsKLQkJfQotCi0JICAgICAgaWYgKGUtPm5hbWUgIT0gTlVMTCkKLQkJbWluZm8gKCIlVFxuIiwgZS0+bmFtZSk7Ci0JICAgICAgZWxzZQotCQltaW5mbyAoIiVHXG4iLCBlLT5zZWN0aW9uLT5vd25lciwgZS0+c2VjdGlvbiwgZS0+dmFsdWUpOwotCSAgICB9Ci0KLSAgICAgICAgICAvKiBOZWVkIFNFQ19LRUVQIGZvciAtLWdjLXNlY3Rpb25zICovCi0JICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGUtPnNlY3Rpb24pKQotCSAgICBlLT5zZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLQotCSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0JICAgIGxhbmdfYWRkX3JlbG9jIChwLT5yZWxvYywgaG93dG8sIGUtPnNlY3Rpb24sIGUtPm5hbWUsCi0JCQkgICAgZXhwX2ludG9wIChlLT52YWx1ZSkpOwotCSAgZWxzZQotCSAgICBsYW5nX2FkZF9kYXRhIChzaXplLCBleHBfcmVsb3AgKGUtPnNlY3Rpb24sIGUtPnZhbHVlKSk7Ci0JfQotCi0gICAgICBsYW5nX2FkZF9kYXRhIChzaXplLCBleHBfaW50b3AgKDApKTsKLSAgICB9Ci0KLSAgc3RhdF9wdHIgPSBvbGQ7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGN0b3IuaCBiL2xkL2xkY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODczZjc3Li4wMDAwMDAwCi0tLSBhL2xkL2xkY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogbGRjdG9yLmggLSBsaW5rZXIgY29uc3RydWN0b3Igc3VwcG9ydAotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExEQ1RPUl9ICi0jZGVmaW5lIExEQ1RPUl9ICi0KLS8qIExpc3Qgb2Ygc3RhdGVtZW50cyBuZWVkZWQgdG8gaGFuZGxlIGNvbnN0cnVjdG9ycyAqLwotZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjb25zdHJ1Y3Rvcl9saXN0OwotCi0vKiBXaGV0aGVyIHRoZSBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIHNvcnRlZC4gIE5vdGUgdGhhdCB0aGlzIGlzCi0gICBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgbGluazsgd2UgYXNzdW1lIHRoYXQgdGhlcmUgaXMgb25seSBhIHNpbmdsZQotICAgQ09OU1RSVUNUT1JTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotZXh0ZXJuIGJvb2xlYW4gY29uc3RydWN0b3JzX3NvcnRlZDsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBmb3IgZWFjaCBzZXQgd2UgYnVpbGQuICAqLwotCi1zdHJ1Y3Qgc2V0X2luZm8KLXsKLSAgc3RydWN0IHNldF9pbmZvICpuZXh0OwkJLyogTmV4dCBzZXQuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsJLyogSGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsJLyogUmVsb2MgdG8gdXNlIGZvciBhbiBlbnRyeS4gICovCi0gIHNpemVfdCBjb3VudDsJCQkJLyogTnVtYmVyIG9mIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IHNldF9lbGVtZW50ICplbGVtZW50czsJCS8qIEVsZW1lbnRzIGluIHNldC4gICovCi19OwotCi1zdHJ1Y3Qgc2V0X2VsZW1lbnQKLXsKLSAgc3RydWN0IHNldF9lbGVtZW50ICpuZXh0OwkJLyogTmV4dCBlbGVtZW50LiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsJCQkvKiBOYW1lIGluIHNldCAobWF5IGJlIE5VTEwpLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247CQkJLyogU2VjdGlvbiBvZiB2YWx1ZSBpbiBzZXQuICAqLwotICBiZmRfdm1hIHZhbHVlOwkJCS8qIFZhbHVlIGluIHNldC4gICovCi19OwotCi0vKiBUaGUgc2V0cyB3ZSBoYXZlIHNlZW4uICAqLwotCi1leHRlcm4gc3RydWN0IHNldF9pbmZvICpzZXRzOwotCi1leHRlcm4gdm9pZCBsZGN0b3JfYWRkX3NldF9lbnRyeSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkJICBjb25zdCBjaGFyICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIGxkY3Rvcl9idWlsZF9zZXRzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGVtdWwuYyBiL2xkL2xkZW11bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWIwNDMyLi4wMDAwMDAwCi0tLSBhL2xkL2xkZW11bC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qIGxkZW11bC5jIC0tIGNsZWFyaW5nIGhvdXNlIGZvciBsZCBlbXVsYXRpb24gc3RhdGVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLWxpc3QuaCIKLQotbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqbGRfZW11bGF0aW9uOwotCi12b2lkCi1sZGVtdWxfaGxsKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGxkX2VtdWxhdGlvbi0+aGxsKG5hbWUpOwotfQotCi0KLXZvaWQgbGRlbXVsX3N5c2xpYihuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBsZF9lbXVsYXRpb24tPnN5c2xpYihuYW1lKTsKLX0KLQotdm9pZAotbGRlbXVsX2FmdGVyX3BhcnNlKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5hZnRlcl9wYXJzZSgpOwotfQotCi12b2lkCi1sZGVtdWxfYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5iZWZvcmVfcGFyc2UoKTsKLX0KLQotdm9pZAotbGRlbXVsX2FmdGVyX29wZW4gKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5hZnRlcl9vcGVuICgpOwotfQotCi12b2lkIAotbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24oKQotewotICBsZF9lbXVsYXRpb24tPmFmdGVyX2FsbG9jYXRpb24oKTsKLX0KLQotdm9pZCAKLWxkZW11bF9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci0gIGlmIChsZF9lbXVsYXRpb24tPmJlZm9yZV9hbGxvY2F0aW9uKQotICAgIGxkX2VtdWxhdGlvbi0+YmVmb3JlX2FsbG9jYXRpb24oKTsKLX0KLQotCi12b2lkCi1sZGVtdWxfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5zZXRfb3V0cHV0X2FyY2goKTsKLX0KLQotdm9pZAotbGRlbXVsX2ZpbmlzaCgpCi17Ci0gIGlmIChsZF9lbXVsYXRpb24tPmZpbmlzaCkKLSAgICBsZF9lbXVsYXRpb24tPmZpbmlzaCgpOwotfQotCi12b2lkCi1sZGVtdWxfc2V0X3N5bWJvbHMoKQotewotICBpZiAobGRfZW11bGF0aW9uLT5zZXRfc3ltYm9scykKLSAgICBsZF9lbXVsYXRpb24tPnNldF9zeW1ib2xzKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cygpCi17Ci0gIGlmIChsZF9lbXVsYXRpb24tPmNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKQotICAgIGxkX2VtdWxhdGlvbi0+Y3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMoKTsKLX0KLQotY2hhciAqCi1sZGVtdWxfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewotICByZXR1cm4gbGRfZW11bGF0aW9uLT5nZXRfc2NyaXB0KGlzZmlsZSk7Ci19Ci0KLWJvb2xlYW4KLWxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+b3Blbl9keW5hbWljX2FyY2hpdmUpCi0gICAgcmV0dXJuICgqbGRfZW11bGF0aW9uLT5vcGVuX2R5bmFtaWNfYXJjaGl2ZSkgKGFyY2gsIHNlYXJjaCwgZW50cnkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2xlYW4KLWxkZW11bF9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBpZiAobGRfZW11bGF0aW9uLT5wbGFjZV9vcnBoYW4pCi0gICAgcmV0dXJuICgqbGRfZW11bGF0aW9uLT5wbGFjZV9vcnBoYW4pIChmaWxlLCBzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQKLWxkZW11bF9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIC8qIFRyeSBhbmQgdXNlIHRoZSBlbXVsYXRpb24gcGFyc2VyIGlmIHRoZXJlIGlzIG9uZS4gKi8KLSAgaWYgKGxkX2VtdWxhdGlvbi0+cGFyc2VfYXJncykKLSAgICB7Ci0gICAgICByZXR1cm4gbGRfZW11bGF0aW9uLT5wYXJzZV9hcmdzIChhcmdjLCBhcmd2KTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBMZXQgdGhlIGVtdWxhdGlvbiBjb2RlIGhhbmRsZSBhbiB1bnJlY29nbml6ZWQgZmlsZS4gICovCi0KLWJvb2xlYW4KLWxkZW11bF91bnJlY29nbml6ZWRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAobGRfZW11bGF0aW9uLT51bnJlY29nbml6ZWRfZmlsZSkKLSAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPnVucmVjb2duaXplZF9maWxlKSAoZW50cnkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIExldCB0aGUgZW11bGF0aW9uIGNvZGUgaGFuZGxlIGEgcmVjb2duaXplZCBmaWxlLiAgKi8KLQotYm9vbGVhbgotbGRlbXVsX3JlY29nbml6ZWRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAobGRfZW11bGF0aW9uLT5yZWNvZ25pemVkX2ZpbGUpCi0gICAgcmV0dXJuICgqbGRfZW11bGF0aW9uLT5yZWNvZ25pemVkX2ZpbGUpIChlbnRyeSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotY2hhciAqCi1sZGVtdWxfY2hvb3NlX3RhcmdldCgpCi17Ci0gIHJldHVybiBsZF9lbXVsYXRpb24tPmNob29zZV90YXJnZXQoKTsKLX0KLQotLyogVGhlIGRlZmF1bHQgY2hvb3NlX3RhcmdldCBmdW5jdGlvbi4gICovCi0KLWNoYXIgKgotbGRlbXVsX2RlZmF1bHRfdGFyZ2V0KCkKLXsKLSAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52IChUQVJHRVRfRU5WSVJPTik7Ci0gIGlmIChmcm9tX291dHNpZGUgIT0gKGNoYXIgKilOVUxMKQotICAgIHJldHVybiBmcm9tX291dHNpZGU7Ci0gIHJldHVybiBsZF9lbXVsYXRpb24tPnRhcmdldF9uYW1lOwotfQotCi12b2lkIAotYWZ0ZXJfcGFyc2VfZGVmYXVsdCgpCi17Ci0KLX0KLQotdm9pZAotYWZ0ZXJfb3Blbl9kZWZhdWx0ICgpCi17Ci19Ci0KLXZvaWQKLWFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCgpCi17Ci0KLX0KLQotdm9pZAotYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCgpCi17Ci0KLX0KLQotdm9pZAotc2V0X291dHB1dF9hcmNoX2RlZmF1bHQoKQotewotICAvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwKLQkgICAgICAgICAgICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbGRmaWxlX291dHB1dF9tYWNoaW5lKTsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1zeXNsaWJfZGVmYXVsdChpZ25vcmUpCi0gICAgIGNoYXIgICppZ25vcmU7Ci17Ci0gIGluZm9fbXNnIChfKCIlUyBTWVNMSUIgaWdub3JlZFxuIikpOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLWhsbF9kZWZhdWx0KGlnbm9yZSkKLSAgICAgY2hhciAgKmlnbm9yZTsKLXsKLSAgaW5mb19tc2cgKF8oIiVTIEhMTCBpZ25vcmVkXG4iKSk7Ci19Ci0KLWxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKmxkX2VtdWxhdGlvbnNbXSA9IHsgRU1VTEFUSU9OX0xJU1QgfTsKLQotdm9pZAotbGRlbXVsX2Nob29zZV9tb2RlKHRhcmdldCkKLSAgICAgY2hhciAqdGFyZ2V0OwotewotICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiplcHRyID0gbGRfZW11bGF0aW9uczsKLSAgICAvKiBJZ25vcmUgImdsZCIgcHJlZml4LiAqLwotICAgIGlmICh0YXJnZXRbMF0gPT0gJ2cnICYmIHRhcmdldFsxXSA9PSAnbCcgJiYgdGFyZ2V0WzJdID09ICdkJykKLQl0YXJnZXQgKz0gMzsKLSAgICBmb3IgKDsgKmVwdHI7IGVwdHIrKykKLSAgICAgIHsKLQlpZiAoc3RyY21wKHRhcmdldCwgKCplcHRyKS0+ZW11bGF0aW9uX25hbWUpID09IDApCi0JICB7Ci0JICAgIGxkX2VtdWxhdGlvbiA9ICplcHRyOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgZWluZm8gKF8oIiVQOiB1bnJlY29nbmlzZWQgZW11bGF0aW9uIG1vZGU6ICVzXG4iKSwgdGFyZ2V0KTsKLSAgICBlaW5mbyAoXygiU3VwcG9ydGVkIGVtdWxhdGlvbnM6ICIpKTsKLSAgICBsZGVtdWxfbGlzdF9lbXVsYXRpb25zIChzdGRlcnIpOwotICAgIGVpbmZvICgiJUZcbiIpOwotfQotCi12b2lkCi1sZGVtdWxfbGlzdF9lbXVsYXRpb25zIChmKQotICAgICBGSUxFICpmOwotewotICBsZF9lbXVsYXRpb25feGZlcl90eXBlICoqZXB0ciA9IGxkX2VtdWxhdGlvbnM7Ci0gIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoOyAqZXB0cjsgZXB0cisrKQotICAgIHsKLSAgICAgIGlmIChmaXJzdCkKLQlmaXJzdCA9IGZhbHNlOwotICAgICAgZWxzZQotCWZwcmludGYgKGYsICIgIik7Ci0gICAgICBmcHJpbnRmIChmLCAiJXMiLCAoKmVwdHIpLT5lbXVsYXRpb25fbmFtZSk7Ci0gICAgfQotfQotCi12b2lkCi1sZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyAoZikKLSAgICAgRklMRSAqIGY7Ci17Ci0gIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiogZXB0cjsKLSAgaW50IG9wdGlvbnNfZm91bmQgPSAwOwotICAKLSAgZm9yIChlcHRyID0gbGRfZW11bGF0aW9uczsgKiBlcHRyOyBlcHRyICsrKQotICAgIHsKLSAgICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiBlbXVsID0gKiBlcHRyOwotICAgICAgCi0gICAgICBpZiAoZW11bC0+bGlzdF9vcHRpb25zKQotCXsKLQkgIGZwcmludGYgKGYsICIlczogXG4iLCBlbXVsLT5lbXVsYXRpb25fbmFtZSk7Ci0gICAgICAKLQkgIGVtdWwtPmxpc3Rfb3B0aW9ucyAoZik7Ci0KLQkgIG9wdGlvbnNfZm91bmQgPSAxOwotCX0KLSAgICB9Ci0gIAotICBpZiAoISBvcHRpb25zX2ZvdW5kKQotICAgIGZwcmludGYgKGYsIF8oIiAgbm8gZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnMuXG4iKSk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGVtdWwuaCBiL2xkL2xkZW11bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBkZTA2Li4wMDAwMDAwCi0tLSBhL2xkL2xkZW11bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qIGxkLWVtdWwuaCAtIExpbmtlciBlbXVsYXRpb24gaGVhZGVyIGZpbGUKLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KLQotI2lmbmRlZiBMREVNVUxfSAotI2RlZmluZSBMREVNVUxfSAotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0Owotc3RydWN0IHNlYXJjaF9kaXJzOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGxkZW11bF9obGwgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfc3lzbGliIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9zZXRfb3V0cHV0X2FyY2ggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKmxkZW11bF9jaG9vc2VfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9jaG9vc2VfbW9kZSBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyBQQVJBTVMgKChGSUxFICopKTsKLWV4dGVybiBjaGFyICpsZGVtdWxfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBib29sZWFuIGxkZW11bF9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gaW50IGxkZW11bF9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX3VucmVjb2duaXplZF9maWxlCi0gIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX3JlY29nbml6ZWRfZmlsZQotICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBib29sZWFuIGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBzZWFyY2hfZGlycyAqLAotCSAgIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGNoYXIgKmxkZW11bF9kZWZhdWx0X3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBhZnRlcl9wYXJzZV9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGFmdGVyX29wZW5fZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzeXNsaWJfZGVmYXVsdCBQQVJBTVMgKChjaGFyKikpOwotZXh0ZXJuIHZvaWQgaGxsX2RlZmF1bHQgUEFSQU1TICgoY2hhciopKTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0Ci17Ci0gIC8qIFJ1biBiZWZvcmUgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIGFuZCBzY3JpcHQgZmlsZS4KLSAgICAgU2V0IHRoZSBhcmNoaXRlY3R1cmUsIG1heWJlIG90aGVyIHRoaW5ncy4gICovCi0gIHZvaWQgICAoKmJlZm9yZV9wYXJzZSkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIEhhbmRsZSB0aGUgU1lTTElCIChsb3cgbGV2ZWwgbGlicmFyeSkgc2NyaXB0IGNvbW1hbmQuICAqLwotICB2b2lkICAgKCpzeXNsaWIpIFBBUkFNUyAoKGNoYXIgKikpOwotCi0gIC8qIEhhbmRsZSB0aGUgSExMIChoaWdoIGxldmVsIGxpYnJhcnkpIHNjcmlwdCBjb21tYW5kLiAgKi8KLSAgdm9pZCAgICgqaGxsKSBQQVJBTVMgKChjaGFyICopKTsKLQotICAvKiBSdW4gYWZ0ZXIgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIGFuZCBzY3JpcHQgZmlsZS4gICovCi0gIHZvaWQgICAoKmFmdGVyX3BhcnNlKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUnVuIGFmdGVyIG9wZW5pbmcgYWxsIGlucHV0IGZpbGVzLCBhbmQgbG9hZGluZyB0aGUgc3ltYm9scy4gICovCi0gIHZvaWQgICAoKmFmdGVyX29wZW4pIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gYWZ0ZXIgYWxsb2NhdGluZyBvdXRwdXQgc2VjdGlvbnMuICAqLwotICB2b2lkICAgKCphZnRlcl9hbGxvY2F0aW9uKSBQQVJBTVMgKCAodm9pZCkpOwotCi0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZS4gICovCi0gIHZvaWQgICAoKnNldF9vdXRwdXRfYXJjaCkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIERlY2lkZSB3aGljaCB0YXJnZXQgbmFtZSB0byB1c2UuICAqLwotICBjaGFyICogKCpjaG9vc2VfdGFyZ2V0KSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUnVuIGJlZm9yZSBhbGxvY2F0aW5nIG91dHB1dCBzZWN0aW9ucy4gICovCi0gIHZvaWQgICAoKmJlZm9yZV9hbGxvY2F0aW9uKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBsaW5rZXIgc2NyaXB0LiAgKi8KLSAgY2hhciAqICgqZ2V0X3NjcmlwdCkgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGlzIGVtdWxhdGlvbi4gICovCi0gIGNoYXIgKmVtdWxhdGlvbl9uYW1lOwotCi0gIC8qIFRoZSBvdXRwdXQgZm9ybWF0LiAgKi8KLSAgY2hhciAqdGFyZ2V0X25hbWU7Ci0KLSAgLyogUnVuIGFmdGVyIGFzc2lnbmluZyB2YWx1ZXMgZnJvbSB0aGUgc2NyaXB0LiAgKi8KLSAgdm9pZAkoKmZpbmlzaCkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIENyZWF0ZSBhbnkgb3V0cHV0IHNlY3Rpb25zIG5lZWRlZCBieSB0aGUgdGFyZ2V0LiAgKi8KLSAgdm9pZAkoKmNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGxpYnJhcnkuICBBUkNIIGlzIGFuIGFyY2hpdGVjdHVyZSBuYW1lLCBhbmQKLSAgICAgaXMgbm9ybWFsbHkgdGhlIGVtcHR5IHN0cmluZy4gIEVOVFJZIGlzIHRoZSBsYW5nX2lucHV0X3N0YXRlbWVudAotICAgICB0aGF0IHNob3VsZCBiZSBvcGVuZWQuICAqLwotICBib29sZWFuICgqb3Blbl9keW5hbWljX2FyY2hpdmUpCi0gICAgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaCwgc3RydWN0IHNlYXJjaF9kaXJzICosCi0JICAgICBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICplbnRyeSkpOwotCi0gIC8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgUmV0dXJuIHRydWUgaWYgaXQgd2FzIHBsYWNlZCwgZmFsc2UgaWYKLSAgICAgdGhlIGRlZmF1bHQgYWN0aW9uIHNob3VsZCBiZSB0YWtlbi4gIFRoaXMgZmllbGQgbWF5IGJlIE5VTEwsIGluCi0gICAgIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgYWN0aW9uIHdpbGwgYWx3YXlzIGJlIHRha2VuLiAgKi8KLSAgYm9vbGVhbiAoKnBsYWNlX29ycGhhbikKLSAgICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICosIGFzZWN0aW9uICopKTsKLQotICAvKiBSdW4gYWZ0ZXIgYXNzaWduaW5nIHBhcnNpbmcgd2l0aCB0aGUgYXJncywgYnV0IGJlZm9yZSAKLSAgICAgcmVhZGluZyB0aGUgc2NyaXB0LiAgVXNlZCB0byBpbml0aWFsaXplIHN5bWJvbHMgdXNlZCBpbiB0aGUgc2NyaXB0LiAqLwotICB2b2lkCSgqc2V0X3N5bWJvbHMpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gdG8gcGFyc2UgYXJncyB3aGljaCB0aGUgYmFzZSBsaW5rZXIgZG9lc24ndAotICAgICB1bmRlcnN0YW5kLiBSZXR1cm4gbm9uIHplcm8gb24gc3VjZXNzLiAqLwotICBpbnQgKCpwYXJzZV9hcmdzKSBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotICAvKiBSdW4gdG8gaGFuZGxlIGZpbGVzIHdoaWNoIGFyZSBub3QgcmVjb2duaXplZCBhcyBvYmplY3QgZmlsZXMgb3IKLSAgICAgYXJjaGl2ZXMuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgaGFuZGxlZC4gICovCi0gIGJvb2xlYW4gKCp1bnJlY29nbml6ZWRfZmlsZSkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLQotICAvKiBSdW4gdG8gbGlzdCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgd2hpY2ggcGFyc2VfYXJncyBoYW5kbGVzLiAgKi8KLSAgdm9pZCAoKiBsaXN0X29wdGlvbnMpIFBBUkFNUyAoKEZJTEUgKikpOwotCi0gIC8qIFJ1biB0byBzcGVjaWFsbHkgaGFuZGxlIGZpbGVzIHdoaWNoICphcmUqIHJlY29nbml6ZWQgYXMgb2JqZWN0Ci0gICAgIGZpbGVzIG9yIGFyY2hpdmVzLiAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIGhhbmRsZWQuICAqLwotICBib29sZWFuICgqcmVjb2duaXplZF9maWxlKQotICAgIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotCi19IGxkX2VtdWxhdGlvbl94ZmVyX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSAKLXsKLSAgaW50ZWxfaWM5NjBfbGRfbW9kZV9lbnVtLAotICBkZWZhdWx0X21vZGVfZW51bSAsCi0gIGludGVsX2dsZDk2MF9sZF9tb2RlX2VudW0KLX0gbGFuZ19lbXVsYXRpb25fbW9kZV9lbnVtX3R5cGU7Ci0KLWV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlICpsZF9lbXVsYXRpb25zW107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRleHAuYyBiL2xkL2xkZXhwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOWQ3MjYuLjAwMDAwMDAKLS0tIGEvbGQvbGRleHAuYworKysgL2Rldi9udWxsCkBAIC0xLDk4NSArMCwwIEBACi0vKiBUaGlzIG1vZHVsZSBoYW5kbGVzIGV4cHJlc3Npb24gdHJlZXMuCi1Db3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1Xcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzYWNAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1UaGlzIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2Ygd29ya2luZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGV4cHJlc3Npb25zLgotCi1JdCBoYXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgcmVsYXRpdmUvYWJzbmVzcyBvZiBhIHN5bWJvbCBldGMuIFRoaXMgaXMKLWRvbmUgYnkga2VlcGluZyBhbGwgdmFsdWVzIGluIGEgc3RydWN0IChhbiBldHJlZV92YWx1ZV90eXBlKSB3aGljaAotY29udGFpbnMgYSB2YWx1ZSwgYSBzZWN0aW9uIHRvIHdoaWNoIGl0IGlzIHJlbGF0aXZlIGFuZCBhIHZhbGlkIGJpdC4KLQotKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi1zdGF0aWMgdm9pZCBleHBfcHJpbnRfdG9rZW4gUEFSQU1TICgodG9rZW5fY29kZV90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG1ha2VfYWJzIFBBUkFNUyAoKGV0cmVlX3ZhbHVlX3R5cGUgKnB0cikpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgbmV3X2FicyBQQVJBTVMgKChiZmRfdm1hIHZhbHVlKSk7Ci1zdGF0aWMgdm9pZCBjaGVjayBQQVJBTVMgKChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcywKLQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm9wKSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBuZXdfcmVsCi0gIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUsIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb24pKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIG5ld19yZWxfZnJvbV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUsIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb24pKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIGZvbGRfYmluYXJ5Ci0gIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAotCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUsCi0JICAgYmZkX3ZtYSBkb3QsIGJmZF92bWEgKmRvdHApKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIGZvbGRfbmFtZQotICBQQVJBTVMgKChldHJlZV90eXBlICp0cmVlLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbiwKLQkgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lLAotCSAgIGJmZF92bWEgZG90KSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBleHBfZm9sZF90cmVlX25vX2RvdAotICBQQVJBTVMgKChldHJlZV90eXBlICp0cmVlLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbiwKLQkgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lKSk7Ci0KLXN0YXRpYyB2b2lkCi1leHBfcHJpbnRfdG9rZW4gKGNvZGUpCi0gICAgIHRva2VuX2NvZGVfdHlwZSBjb2RlOwotewotICBzdGF0aWMgQ09OU1Qgc3RydWN0Ci0gICAgewotICAgICAgdG9rZW5fY29kZV90eXBlIGNvZGU7Ci0gICAgICBjaGFyICpuYW1lOwotICAgIH0gdGFibGVbXSA9Ci0gICAgICB7Ci0JeyBJTlQsCSJpbnQiIH0sCi0JeyBSRUwsICJyZWxvY2F0ZWFibGUiIH0sCi0JeyBOQU1FLCJOQU1FIiB9LAotCXsgUExVU0VRLCIrPSIgfSwKLQl7IE1JTlVTRVEsIi09IiB9LAotCXsgTVVMVEVRLCIqPSIgfSwKLQl7IERJVkVRLCIvPSIgfSwKLQl7IExTSElGVEVRLCI8PD0iIH0sCi0JeyBSU0hJRlRFUSwiPj49IiB9LAotCXsgQU5ERVEsIiY9IiB9LAotCXsgT1JFUSwifD0iIH0sCi0JeyBPUk9SLCJ8fCIgfSwKLQl7IEFOREFORCwiJiYiIH0sCi0JeyBFUSwiPT0iIH0sCi0JeyBORSwiIT0iIH0sCi0JeyBMRSwiPD0iIH0sCi0JeyBHRSwiPj0iIH0sCi0JeyBMU0hJRlQsIjw8IiB9LAotCXsgUlNISUZULCI+Pj0iIH0sCi0JeyBBTElHTl9LLCJBTElHTiIgfSwKLQl7IEJMT0NLLCJCTE9DSyIgfSwKLQl7IFNFQ1RJT05TLCJTRUNUSU9OUyIgfSwKLQl7IFNJWkVPRl9IRUFERVJTLCJTSVpFT0ZfSEVBREVSUyIgfSwKLQl7IE5FWFQsIk5FWFQiIH0sCi0JeyBTSVpFT0YsIlNJWkVPRiIgfSwKLQl7IEFERFIsIkFERFIiIH0sCi0JeyBMT0FEQUREUiwiTE9BREFERFIiIH0sCi0JeyBNRU1PUlksIk1FTU9SWSIgfSwKLQl7IERFRklORUQsIkRFRklORUQiIH0sCi0JeyBUQVJHRVRfSywiVEFSR0VUIiB9LAotCXsgU0VBUkNIX0RJUiwiU0VBUkNIX0RJUiIgfSwKLQl7IE1BUCwiTUFQIiB9LAotCXsgUVVBRCwiUVVBRCIgfSwKLQl7IFNRVUFELCJTUVVBRCIgfSwKLQl7IExPTkcsIkxPTkciIH0sCi0JeyBTSE9SVCwiU0hPUlQiIH0sCi0JeyBCWVRFLCJCWVRFIiB9LAotCXsgRU5UUlksIkVOVFJZIiB9LAotCXsgMCwoY2hhciAqKU5VTEwgfQotICAgICAgfTsKLSAgdW5zaWduZWQgaW50IGlkeDsKLQotICBmb3IgKGlkeCA9IDA7IHRhYmxlW2lkeF0ubmFtZSAhPSAoY2hhciopTlVMTDsgaWR4KyspIHsKLSAgICBpZiAodGFibGVbaWR4XS5jb2RlID09IGNvZGUpIHsKLSAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCAiJXMiLCB0YWJsZVtpZHhdLm5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAvKiBOb3QgaW4gdGFibGUsIGp1c3QgcHJpbnQgaXQgYWxvbmUgKi8KLSAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsICIlYyIsY29kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotbWFrZV9hYnMgKHB0cikKLSAgICAgZXRyZWVfdmFsdWVfdHlwZSAqcHRyOwotewotICAgIGFzZWN0aW9uICpzID0gcHRyLT5zZWN0aW9uLT5iZmRfc2VjdGlvbjsKLSAgICBwdHItPnZhbHVlICs9IHMtPnZtYTsKLSAgICBwdHItPnNlY3Rpb24gPSBhYnNfb3V0cHV0X3NlY3Rpb247Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlCi1uZXdfYWJzICh2YWx1ZSkKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSBuZXc7Ci0gIG5ldy52YWxpZF9wID0gdHJ1ZTsKLSAgbmV3LnNlY3Rpb24gPSBhYnNfb3V0cHV0X3NlY3Rpb247Ci0gIG5ldy52YWx1ZSA9IHZhbHVlOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCAKLWNoZWNrIChvcywgbmFtZSwgb3ApCi0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpvcDsKLXsKLSAgaWYgKG9zID09IE5VTEwpCi0gICAgZWluZm8gKF8oIiVGJVA6ICVzIHVzZXMgdW5kZWZpbmVkIHNlY3Rpb24gJXNcbiIpLCBvcCwgbmFtZSk7Ci0gIGlmICghIG9zLT5wcm9jZXNzZWQpCi0gICAgZWluZm8gKF8oIiVGJVA6ICVzIGZvcndhcmQgcmVmZXJlbmNlIG9mIHNlY3Rpb24gJXNcbiIpLCBvcCwgbmFtZSk7Ci19Ci0KLWV0cmVlX3R5cGUgKgotZXhwX2ludG9wICh2YWx1ZSkKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgZXRyZWVfdHlwZSAqbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyhzaXplb2YobmV3LT52YWx1ZSkpOwotICBuZXctPnR5cGUubm9kZV9jb2RlID0gSU5UOwotICBuZXctPnZhbHVlLnZhbHVlID0gdmFsdWU7Ci0gIG5ldy0+dHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfdmFsdWU7Ci0gIHJldHVybiBuZXc7Ci0KLX0KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gdW5uYW1lZCByZWxvY2F0ZWFibGUgdmFsdWUuICAqLwotCi1ldHJlZV90eXBlICoKLWV4cF9yZWxvcCAoc2VjdGlvbiwgdmFsdWUpCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBldHJlZV90eXBlICpuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+cmVsKSk7Ci0gIG5ldy0+dHlwZS5ub2RlX2NvZGUgPSBSRUw7Ci0gIG5ldy0+dHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfcmVsOwotICBuZXctPnJlbC5zZWN0aW9uID0gc2VjdGlvbjsKLSAgbmV3LT5yZWwudmFsdWUgPSB2YWx1ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUKLW5ld19yZWwgKHZhbHVlLCBzZWN0aW9uKQotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzZWN0aW9uOwotewotICBldHJlZV92YWx1ZV90eXBlIG5ldzsKLSAgbmV3LnZhbGlkX3AgPSB0cnVlOwotICBuZXcudmFsdWUgPSB2YWx1ZTsKLSAgbmV3LnNlY3Rpb24gPSBzZWN0aW9uOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZQotbmV3X3JlbF9mcm9tX3NlY3Rpb24gKHZhbHVlLCBzZWN0aW9uKQotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzZWN0aW9uOwotewotICBldHJlZV92YWx1ZV90eXBlIG5ldzsKLSAgbmV3LnZhbGlkX3AgPSB0cnVlOwotICBuZXcudmFsdWUgPSB2YWx1ZTsKLSAgbmV3LnNlY3Rpb24gPSBzZWN0aW9uOwotCi0gICAgbmV3LnZhbHVlIC09IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0KLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgCi1mb2xkX2JpbmFyeSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotICAgICBiZmRfdm1hIGRvdDsKLSAgICAgYmZkX3ZtYSAqZG90cDsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YmluYXJ5LmxocywgY3VycmVudF9zZWN0aW9uLAotCQkJICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gIGlmIChyZXN1bHQudmFsaWRfcCkKLSAgICB7Ci0gICAgICBldHJlZV92YWx1ZV90eXBlIG90aGVyOwotCi0gICAgICBvdGhlciA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmJpbmFyeS5yaHMsCi0JCQkgICAgIGN1cnJlbnRfc2VjdGlvbiwKLQkJCSAgICAgYWxsb2NhdGlvbl9kb25lLCBkb3QsZG90cCkgOwotICAgICAgaWYgKG90aGVyLnZhbGlkX3ApCi0JewotCSAgLyogSWYgdGhlIHZhbHVlcyBhcmUgZnJvbSBkaWZmZXJlbnQgc2VjdGlvbnMsIG9yIHRoaXMgaXMgYW4KLQkgICAgIGFic29sdXRlIGV4cHJlc3Npb24sIG1ha2UgYm90aCB0aGUgc291cmNlIGFyZ3VtZW50cwotCSAgICAgYWJzb2x1dGUuICBIb3dldmVyLCBhZGRpbmcgb3Igc3VidHJhY3RpbmcgYW4gYWJzb2x1dGUKLQkgICAgIHZhbHVlIGZyb20gYSByZWxhdGl2ZSB2YWx1ZSBpcyBtZWFuaW5nZnVsLCBhbmQgaXMgYW4KLQkgICAgIGV4Y2VwdGlvbi4gICovCi0JICBpZiAoY3VycmVudF9zZWN0aW9uICE9IGFic19vdXRwdXRfc2VjdGlvbgotCSAgICAgICYmIChvdGhlci5zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbgotCQkgIHx8IChyZXN1bHQuc2VjdGlvbiA9PSBhYnNfb3V0cHV0X3NlY3Rpb24KLQkJICAgICAgJiYgdHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJysnKSkKLQkgICAgICAmJiAodHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJysnCi0JCSAgfHwgdHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJy0nKSkKLQkgICAgewotCSAgICAgIGV0cmVlX3ZhbHVlX3R5cGUgaG9sZDsKLQotCSAgICAgIC8qIElmIHRoZXJlIGlzIG9ubHkgb25lIGFic29sdXRlIHRlcm0sIG1ha2Ugc3VyZSBpdCBpcyB0aGUKLQkJIHNlY29uZCBvbmUuICAqLwotCSAgICAgIGlmIChvdGhlci5zZWN0aW9uICE9IGFic19vdXRwdXRfc2VjdGlvbikKLQkJewotCQkgIGhvbGQgPSByZXN1bHQ7Ci0JCSAgcmVzdWx0ID0gb3RoZXI7Ci0JCSAgb3RoZXIgPSBob2xkOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlc3VsdC5zZWN0aW9uICE9IG90aGVyLnNlY3Rpb24KLQkJICAgfHwgY3VycmVudF9zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbikKLQkgICAgewotCSAgICAgIG1ha2VfYWJzKCZyZXN1bHQpOwotCSAgICAgIG1ha2VfYWJzKCZvdGhlcik7Ci0JICAgIH0KLQotCSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY29kZSkgCi0JICAgIHsKLQkgICAgY2FzZSAnJSc6Ci0JICAgICAgaWYgKG90aGVyLnZhbHVlID09IDApCi0JCWVpbmZvIChfKCIlRiVTICUlIGJ5IHplcm9cbiIpKTsKLQkgICAgICByZXN1bHQudmFsdWUgPSAoKGJmZF9zaWduZWRfdm1hKSByZXN1bHQudmFsdWUKLQkJCSAgICAgICUgKGJmZF9zaWduZWRfdm1hKSBvdGhlci52YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnLyc6Ci0JICAgICAgaWYgKG90aGVyLnZhbHVlID09IDApCi0JCWVpbmZvIChfKCIlRiVTIC8gYnkgemVyb1xuIikpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9ICgoYmZkX3NpZ25lZF92bWEpIHJlc3VsdC52YWx1ZQotCQkJICAgICAgLyAoYmZkX3NpZ25lZF92bWEpIG90aGVyLnZhbHVlKTsKLQkgICAgICBicmVhazsKLQotI2RlZmluZSBCT1AoeCx5KSBjYXNlIHggOiByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUgeSBvdGhlci52YWx1ZTsgYnJlYWs7Ci0JICAgICAgQk9QKCcrJywrKTsKLQkgICAgICBCT1AoJyonLCopOwotCSAgICAgIEJPUCgnLScsLSk7Ci0JICAgICAgQk9QKExTSElGVCw8PCk7Ci0JICAgICAgQk9QKFJTSElGVCw+Pik7Ci0JICAgICAgQk9QKEVRLD09KTsKLQkgICAgICBCT1AoTkUsIT0pOwotCSAgICAgIEJPUCgnPCcsPCk7Ci0JICAgICAgQk9QKCc+Jyw+KTsKLQkgICAgICBCT1AoTEUsPD0pOwotCSAgICAgIEJPUChHRSw+PSk7Ci0JICAgICAgQk9QKCcmJywmKTsKLQkgICAgICBCT1AoJ14nLF4pOwotCSAgICAgIEJPUCgnfCcsfCk7Ci0JICAgICAgQk9QKEFOREFORCwmJik7Ci0JICAgICAgQk9QKE9ST1IsfHwpOwotCi0JICAgIGNhc2UgTUFYX0s6Ci0JICAgICAgaWYgKHJlc3VsdC52YWx1ZSA8IG90aGVyLnZhbHVlKQotCQlyZXN1bHQgPSBvdGhlcjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE1JTl9LOgotCSAgICAgIGlmIChyZXN1bHQudmFsdWUgPiBvdGhlci52YWx1ZSkKLQkJcmVzdWx0ID0gb3RoZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBGQUlMKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWV0cmVlX3ZhbHVlX3R5cGUgCi1pbnZhbGlkICgpCi17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgbmV3OwotICBuZXcudmFsaWRfcCA9IGZhbHNlOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSAKLWZvbGRfbmFtZSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotICAgICBsYW5nX3BoYXNlX3R5cGUgIGFsbG9jYXRpb25fZG9uZTsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OwotICBzd2l0Y2ggKHRyZWUtPnR5cGUubm9kZV9jb2RlKSAKLSAgICAgIHsKLSAgICAgIGNhc2UgU0laRU9GX0hFQURFUlM6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pIAotCSAgewotCSAgICByZXN1bHQgPSBuZXdfYWJzICgoYmZkX3ZtYSkKLQkJCSAgICAgIGJmZF9zaXplb2ZfaGVhZGVycyAob3V0cHV0X2JmZCwKLQkJCQkJCSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQkgIH0KLQlicmVhazsKLSAgICAgIGNhc2UgREVGSU5FRDoKLQlpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgIHJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JZWxzZQotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICBoID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJICAgICAgdHJlZS0+bmFtZS5uYW1lLAotCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICByZXN1bHQudmFsdWUgPSAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkJICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCXx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCQkJfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikpOwotCSAgICByZXN1bHQuc2VjdGlvbiA9IDA7Ci0JICAgIHJlc3VsdC52YWxpZF9wID0gdHJ1ZTsKLQkgIH0KLQlicmVhazsKLSAgICAgIGNhc2UgTkFNRToKLQlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCWlmICh0cmVlLT5uYW1lLm5hbWVbMF0gPT0gJy4nICYmIHRyZWUtPm5hbWUubmFtZVsxXSA9PSAwKQotCSAgewotCSAgICBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgICAgICByZXN1bHQgPSBuZXdfcmVsX2Zyb21fc2VjdGlvbihkb3QsIGN1cnJlbnRfc2VjdGlvbik7Ci0JICAgIGVsc2UKLQkgICAgICByZXN1bHQgPSBpbnZhbGlkKCk7Ci0JICB9Ci0JZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCi0JCQkJCSAgICAgIHRyZWUtPm5hbWUubmFtZSwKLQkJCQkJICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkgICAgaWYgKGggIT0gTlVMTAotCQkmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkgICAgICB7Ci0JCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnUuZGVmLnNlY3Rpb24pKQotCQkgIHJlc3VsdCA9IG5ld19hYnMgKGgtPnUuZGVmLnZhbHVlKTsKLQkJZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmluYWxfcGhhc2VfZW51bQotCQkJIHx8IGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSkKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAgIG91dHB1dF9zZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCSAgICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgICAgZWluZm8gKF8oIiVYJVM6IHVucmVzb2x2YWJsZSBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIpLAotCQkJICAgICB0cmVlLT5uYW1lLm5hbWUpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCQkJb3MgPSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwCi0JCQkgICAgICAoYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgICAgIG91dHB1dF9zZWN0aW9uKSkpOwotCi0JCQkvKiBGSVhNRTogSXMgdGhpcyBjb3JyZWN0IGlmIHRoaXMgc2VjdGlvbiBpcwotCQkJICAgYmVpbmcgbGlua2VkIHdpdGggLVI/ICAqLwotCQkJcmVzdWx0ID0gbmV3X3JlbCAoKGgtPnUuZGVmLnZhbHVlCi0JCQkJCSAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCQkJCSAgb3MpOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmluYWxfcGhhc2VfZW51bSkKLQkgICAgICBlaW5mbyAoXygiJUYlUzogdW5kZWZpbmVkIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIiksCi0JCSAgICAgdHJlZS0+bmFtZS5uYW1lKTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSBBRERSOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgewotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKLQkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJBRERSIik7Ci0JICAgIHJlc3VsdCA9IG5ld19yZWwgKDAsIG9zKTsKLQkgIH0KLQllbHNlCi0JICByZXN1bHQgPSBpbnZhbGlkICgpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIExPQURBRERSOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgewotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKLQkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJMT0FEQUREUiIpOwotCSAgICBpZiAob3MtPmxvYWRfYmFzZSA9PSBOVUxMKQotCSAgICAgIHJlc3VsdCA9IG5ld19yZWwgKDAsIG9zKTsKLQkgICAgZWxzZQotCSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWVfbm9fZG90IChvcy0+bG9hZF9iYXNlLAotCQkJCQkgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICAgICBhbGxvY2F0aW9uX2RvbmUpOwotCSAgfQotCWVsc2UKLQkgIHJlc3VsdCA9IGludmFsaWQgKCk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgU0laRU9GOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgewotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKLQkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJTSVpFT0YiKTsKLQkgICAgcmVzdWx0ID0gbmV3X2FicyAob3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgfQotCWVsc2UKLQkgIHJlc3VsdCA9IGludmFsaWQgKCk7Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JRkFJTCgpOwotCWJyZWFrOwotICAgICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci1ldHJlZV92YWx1ZV90eXBlIAotZXhwX2ZvbGRfdHJlZSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotICAgICBsYW5nX3BoYXNlX3R5cGUgIGFsbG9jYXRpb25fZG9uZTsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJmZF92bWEgKmRvdHA7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OwotCi0gIGlmICh0cmVlID09IE5VTEwpCi0gICAgewotICAgICAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIHN3aXRjaCAodHJlZS0+dHlwZS5ub2RlX2NsYXNzKSAKLSAgICB7Ci0gICAgY2FzZSBldHJlZV92YWx1ZToKLSAgICAgIHJlc3VsdCA9IG5ld19yZWwgKHRyZWUtPnZhbHVlLnZhbHVlLCBjdXJyZW50X3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3JlbDoKLSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maW5hbF9waGFzZV9lbnVtKQotCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JcmVzdWx0ID0gbmV3X3JlbCAoKHRyZWUtPnJlbC52YWx1ZQotCQkJICAgKyB0cmVlLT5yZWwuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyB0cmVlLT5yZWwuc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCQkgIGN1cnJlbnRfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYXNzZXJ0OgotICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YXNzZXJ0X3MuY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCi0JewotCSAgaWYgKCEgcmVzdWx0LnZhbHVlKQotCSAgICBlaW5mbyAoIiVGJVA6ICVzXG4iLCB0cmVlLT5hc3NlcnRfcy5tZXNzYWdlKTsKLQkgIHJldHVybiByZXN1bHQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+dW5hcnkuY2hpbGQsCi0JCQkgICAgICBjdXJyZW50X3NlY3Rpb24sCi0JCQkgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCi0JewotCSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY29kZSkgCi0JICAgIHsKLQkgICAgY2FzZSBBTElHTl9LOgotCSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCQlyZXN1bHQgPSBuZXdfcmVsX2Zyb21fc2VjdGlvbiAoQUxJR05fTiAoZG90LCByZXN1bHQudmFsdWUpLAotCQkJCQkgICAgICAgY3VycmVudF9zZWN0aW9uKTsKLQkgICAgICBlbHNlCi0JCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBQlNPTFVURToKLQkgICAgICBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSAmJiByZXN1bHQudmFsaWRfcCkKLQkJewotCQkgIHJlc3VsdC52YWx1ZSArPSByZXN1bHQuc2VjdGlvbi0+YmZkX3NlY3Rpb24tPnZtYTsKLQkJICByZXN1bHQuc2VjdGlvbiA9IGFic19vdXRwdXRfc2VjdGlvbjsKLQkJfQotCSAgICAgIGVsc2UgCi0JCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnfic6Ci0JICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9IH5yZXN1bHQudmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnISc6Ci0JICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9ICFyZXN1bHQudmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnLSc6Ci0JICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9IC1yZXN1bHQudmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBORVhUOgotCSAgICAgIC8qIFJldHVybiBuZXh0IHBsYWNlIGFsaWduZWQgdG8gdmFsdWUuICAqLwotCSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0pCi0JCXsKLQkJICBtYWtlX2FicyAoJnJlc3VsdCk7Ci0JCSAgcmVzdWx0LnZhbHVlID0gQUxJR05fTiAoZG90LCByZXN1bHQudmFsdWUpOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgRkFJTCAoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+dHJpbmFyeS5jb25kLCBjdXJyZW50X3NlY3Rpb24sCi0JCQkgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCi0JcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAoKHJlc3VsdC52YWx1ZQotCQkJCSA/IHRyZWUtPnRyaW5hcnkubGhzCi0JCQkJIDogdHJlZS0+dHJpbmFyeS5yaHMpLAotCQkJCWN1cnJlbnRfc2VjdGlvbiwKLQkJCQlhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgcmVzdWx0ID0gZm9sZF9iaW5hcnkgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLAotCQkJICAgIGRvdCwgZG90cCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGlmICh0cmVlLT5hc3NpZ24uZHN0WzBdID09ICcuJyAmJiB0cmVlLT5hc3NpZ24uZHN0WzFdID09IDApCi0JewotCSAgLyogQXNzaWdubWVudCB0byBkb3QgY2FuIG9ubHkgYmUgZG9uZSBkdXJpbmcgYWxsb2NhdGlvbiAqLwotCSAgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlKQotCSAgICBlaW5mbyAoXygiJUYlUyBjYW4gbm90IFBST1ZJREUgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iKSk7Ci0JICBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtCi0JICAgICAgfHwgKGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2ZpbmFsX3BoYXNlX2VudW0KLQkJICAmJiBjdXJyZW50X3NlY3Rpb24gPT0gYWJzX291dHB1dF9zZWN0aW9uKSkKLQkgICAgewotCSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmFzc2lnbi5zcmMsCi0JCQkJICAgICAgY3VycmVudF9zZWN0aW9uLAotCQkJCSAgICAgIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLCBkb3QsCi0JCQkJICAgICAgZG90cCk7Ci0JICAgICAgaWYgKCEgcmVzdWx0LnZhbGlkX3ApCi0JCWVpbmZvIChfKCIlRiVTIGludmFsaWQgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iKSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGN1cnJlbnRfc2VjdGlvbiA9PSBOVUxMKQotCQkgICAgZWluZm8gKF8oIiVGJVMgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyIGludmFsaWQgb3V0c2lkZSBvZiBTRUNUSU9OXG4iKSk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfdm1hIG5leHRkb3Q7Ci0KLQkJICAgICAgbmV4dGRvdCA9IChyZXN1bHQudmFsdWUKLQkJCQkgKyBjdXJyZW50X3NlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWEpOwotCQkgICAgICBpZiAobmV4dGRvdCA8IGRvdAotCQkJICAmJiBjdXJyZW50X3NlY3Rpb24gIT0gYWJzX291dHB1dF9zZWN0aW9uKQotCQkJewotCQkJICBlaW5mbyAoXygiJUYlUyBjYW5ub3QgbW92ZSBsb2NhdGlvbiBjb3VudGVyIGJhY2t3YXJkcyAoZnJvbSAlViB0byAlVilcbiIpLAotCQkJCSBkb3QsIG5leHRkb3QpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQkqZG90cCA9IG5leHRkb3Q7IAotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YXNzaWduLnNyYywKLQkJCQkgIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLAotCQkJCSAgZG90LCBkb3RwKTsKLQkgIGlmIChyZXN1bHQudmFsaWRfcCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gY3JlYXRlOwotCSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9hc3NpZ24pCi0JCWNyZWF0ZSA9IHRydWU7Ci0JICAgICAgZWxzZQotCQljcmVhdGUgPSBmYWxzZTsKLQkgICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB0cmVlLT5hc3NpZ24uZHN0LAotCQkJCQljcmVhdGUsIGZhbHNlLCBmYWxzZSk7Ci0JICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCXsKLQkJICBpZiAodHJlZS0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX2Fzc2lnbikKLQkJICAgIGVpbmZvIChfKCIlUCVGOiVzOiBoYXNoIGNyZWF0aW9uIGZhaWxlZFxuIiksCi0JCQkgICB0cmVlLT5hc3NpZ24uZHN0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlCi0JCSAgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCSAgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQl7Ci0JCSAgLyogRG8gbm90aGluZy4gIFRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYnkgc29tZQotCQkgICAgIG9iamVjdC4gICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBGSVhNRTogU2hvdWxkIHdlIHdvcnJ5IGlmIHRoZSBzeW1ib2wgaXMgYWxyZWFkeQotCQkgICAgIGRlZmluZWQ/ICAqLwotCQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JCSAgaC0+dS5kZWYudmFsdWUgPSByZXN1bHQudmFsdWU7Ci0JCSAgaC0+dS5kZWYuc2VjdGlvbiA9IHJlc3VsdC5zZWN0aW9uLT5iZmRfc2VjdGlvbjsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX25hbWU6Ci0gICAgICByZXN1bHQgPSBmb2xkX25hbWUgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLCBkb3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRkFJTCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSAKLWV4cF9mb2xkX3RyZWVfbm9fZG90ICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotcmV0dXJuIGV4cF9mb2xkX3RyZWUodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIChiZmRfdm1hKQotCQkgICAgIDAsIChiZmRfdm1hICopTlVMTCk7Ci19Ci0KLWV0cmVlX3R5cGUgKgotZXhwX2Jpbm9wIChjb2RlLCBsaHMsIHJocykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGV0cmVlX3R5cGUgKmxoczsKLSAgICAgZXRyZWVfdHlwZSAqcmhzOwotewotICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OwotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0KLSAgdmFsdWUudHlwZS5ub2RlX2NvZGUgPSBjb2RlOwotICB2YWx1ZS5iaW5hcnkubGhzID0gbGhzOwotICB2YWx1ZS5iaW5hcnkucmhzID0gcmhzOwotICB2YWx1ZS50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9iaW5hcnk7Ci0gIHIgPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsCi0JCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICBsYW5nX2ZpcnN0X3BoYXNlX2VudW0gKTsKLSAgaWYgKHIudmFsaWRfcCkKLSAgICB7Ci0gICAgICByZXR1cm4gZXhwX2ludG9wKHIudmFsdWUpOwotICAgIH0KLSAgbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPmJpbmFyeSkpOwotICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT5iaW5hcnkpKTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotZXRyZWVfdHlwZSAqCi1leHBfdHJpbm9wIChjb2RlLCBjb25kLCBsaHMsIHJocykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGV0cmVlX3R5cGUgKmNvbmQ7Ci0gICAgIGV0cmVlX3R5cGUgKmxoczsKLSAgICAgZXRyZWVfdHlwZSAqcmhzOwotewotICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OwotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0gIHZhbHVlLnR5cGUubm9kZV9jb2RlID0gY29kZTsKLSAgdmFsdWUudHJpbmFyeS5saHMgPSBsaHM7Ci0gIHZhbHVlLnRyaW5hcnkuY29uZCA9IGNvbmQ7Ci0gIHZhbHVlLnRyaW5hcnkucmhzID0gcmhzOwotICB2YWx1ZS50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV90cmluYXJ5OwotICByPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsICAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZQotCQkJCSAgICAqKU5VTEwsbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLSAgaWYgKHIudmFsaWRfcCkgewotICAgIHJldHVybiBleHBfaW50b3Aoci52YWx1ZSk7Ci0gIH0KLSAgbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPnRyaW5hcnkpKTsKLSAgbWVtY3B5KChjaGFyICopbmV3LChjaGFyICopICZ2YWx1ZSwgc2l6ZW9mKG5ldy0+dHJpbmFyeSkpOwotICByZXR1cm4gbmV3OwotfQotCi0KLWV0cmVlX3R5cGUgKgotZXhwX3Vub3AgKGNvZGUsIGNoaWxkKQotICAgICBpbnQgY29kZTsKLSAgICAgZXRyZWVfdHlwZSAqY2hpbGQ7Ci17Ci0gIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7Ci0KLSAgZXRyZWVfdmFsdWVfdHlwZSByOwotICB2YWx1ZS51bmFyeS50eXBlLm5vZGVfY29kZSA9IGNvZGU7Ci0gIHZhbHVlLnVuYXJ5LmNoaWxkID0gY2hpbGQ7Ci0gIHZhbHVlLnVuYXJ5LnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX3VuYXJ5OwotICByID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QoJnZhbHVlLGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gIGlmIChyLnZhbGlkX3ApIHsKLSAgICByZXR1cm4gZXhwX2ludG9wKHIudmFsdWUpOwotICB9Ci0gIG5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT51bmFyeSkpOwotICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT51bmFyeSkpOwotICByZXR1cm4gbmV3OwotfQotCi0KLWV0cmVlX3R5cGUgKgotZXhwX25hbWVvcCAoY29kZSwgbmFtZSkKLSAgICAgaW50IGNvZGU7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcjsKLSAgdmFsdWUubmFtZS50eXBlLm5vZGVfY29kZSA9IGNvZGU7Ci0gIHZhbHVlLm5hbWUubmFtZSA9IG5hbWU7Ci0gIHZhbHVlLm5hbWUudHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfbmFtZTsKLQotCi0gIHIgPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsCi0JCQkgICAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKU5VTEwsCi0JCQkgICBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOwotICBpZiAoci52YWxpZF9wKSB7Ci0gICAgcmV0dXJuIGV4cF9pbnRvcChyLnZhbHVlKTsKLSAgfQotICBuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+bmFtZSkpOwotICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT5uYW1lKSk7Ci0gIHJldHVybiBuZXc7Ci0KLX0KLQotCi0KLQotZXRyZWVfdHlwZSAqCi1leHBfYXNzb3AgKGNvZGUsIGRzdCwgc3JjKQotICAgICBpbnQgY29kZTsKLSAgICAgQ09OU1QgY2hhciAqZHN0OwotICAgICBldHJlZV90eXBlICpzcmM7Ci17Ci0gIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7Ci0KLSAgdmFsdWUuYXNzaWduLnR5cGUubm9kZV9jb2RlID0gY29kZTsKLQotCi0gIHZhbHVlLmFzc2lnbi5zcmMgPSBzcmM7Ci0gIHZhbHVlLmFzc2lnbi5kc3QgPSBkc3Q7Ci0gIHZhbHVlLmFzc2lnbi50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9hc3NpZ247Ci0KLSNpZiAwCi0gIGlmIChleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsICZyZXN1bHQpKSB7Ci0gICAgcmV0dXJuIGV4cF9pbnRvcChyZXN1bHQpOwotICB9Ci0jZW5kaWYKLSAgbmV3ID0gKGV0cmVlX3R5cGUqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+YXNzaWduKSk7Ci0gIG1lbWNweSgoY2hhciAqKW5ldywgKGNoYXIgKikmdmFsdWUsIHNpemVvZihuZXctPmFzc2lnbikpOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBIYW5kbGUgUFJPVklERS4gICovCi0KLWV0cmVlX3R5cGUgKgotZXhwX3Byb3ZpZGUgKGRzdCwgc3JjKQotICAgICBjb25zdCBjaGFyICpkc3Q7Ci0gICAgIGV0cmVlX3R5cGUgKnNyYzsKLXsKLSAgZXRyZWVfdHlwZSAqbjsKLQotICBuID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuLT5hc3NpZ24pKTsKLSAgbi0+YXNzaWduLnR5cGUubm9kZV9jb2RlID0gJz0nOwotICBuLT5hc3NpZ24udHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfcHJvdmlkZTsKLSAgbi0+YXNzaWduLnNyYyA9IHNyYzsKLSAgbi0+YXNzaWduLmRzdCA9IGRzdDsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIEhhbmRsZSBBU1NFUlQuICAqLwotCi1ldHJlZV90eXBlICoKLWV4cF9hc3NlcnQgKGV4cCwgbWVzc2FnZSkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotICAgICBjb25zdCBjaGFyICptZXNzYWdlOwotewotICBldHJlZV90eXBlICpuOwotCi0gIG4gPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG4tPmFzc2VydF9zKSk7Ci0gIG4tPmFzc2VydF9zLnR5cGUubm9kZV9jb2RlID0gJyEnOwotICBuLT5hc3NlcnRfcy50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9hc3NlcnQ7Ci0gIG4tPmFzc2VydF9zLmNoaWxkID0gZXhwOwotICBuLT5hc3NlcnRfcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgCi1leHBfcHJpbnRfdHJlZSAodHJlZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLXsKLSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY2xhc3MpIHsKLSAgY2FzZSBldHJlZV92YWx1ZToKLSAgICBtaW5mbyAoIjB4JXYiLCB0cmVlLT52YWx1ZS52YWx1ZSk7Ci0gICAgcmV0dXJuOwotICBjYXNlIGV0cmVlX3JlbDoKLSAgICBpZiAodHJlZS0+cmVsLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCi0gICAgICBtaW5mbyAoIiVCOiIsIHRyZWUtPnJlbC5zZWN0aW9uLT5vd25lcik7Ci0gICAgbWluZm8gKCIlcysweCV2IiwgdHJlZS0+cmVsLnNlY3Rpb24tPm5hbWUsIHRyZWUtPnJlbC52YWx1ZSk7Ci0gICAgcmV0dXJuOwotICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSNpZiAwCi0gICAgaWYgKHRyZWUtPmFzc2lnbi5kc3QtPnNkZWZzICE9IChhc3ltYm9sICopTlVMTCl7Ci0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMgKCV4KSAiLHRyZWUtPmFzc2lnbi5kc3QtPm5hbWUsCi0JICAgICAgdHJlZS0+YXNzaWduLmRzdC0+c2RlZnMtPnZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMgKFVOREVGSU5FRCkiLHRyZWUtPmFzc2lnbi5kc3QtPm5hbWUpOwotICAgIH0KLSNlbmRpZgotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIlcyIsdHJlZS0+YXNzaWduLmRzdCk7Ci0gICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnR5cGUubm9kZV9jb2RlKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT5hc3NpZ24uc3JjKTsKLSAgICBicmVhazsKLSAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlBST1ZJREUgKCVzLCAiLCB0cmVlLT5hc3NpZ24uZHN0KTsKLSAgICBleHBfcHJpbnRfdHJlZSAodHJlZS0+YXNzaWduLnNyYyk7Ci0gICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiKSIpOwotICAgIGJyZWFrOwotICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCIpOwotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPmJpbmFyeS5saHMpOwotICAgIGV4cF9wcmludF90b2tlbih0cmVlLT50eXBlLm5vZGVfY29kZSk7Ci0gICAgZXhwX3ByaW50X3RyZWUodHJlZS0+YmluYXJ5LnJocyk7Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIikiKTsKLSAgICBicmVhazsKLSAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPnRyaW5hcnkuY29uZCk7Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIj8iKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT50cmluYXJ5Lmxocyk7Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIjoiKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT50cmluYXJ5LnJocyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnVuYXJ5LnR5cGUubm9kZV9jb2RlKTsKLSAgICBpZiAodHJlZS0+dW5hcnkuY2hpbGQpIAotICAgIHsKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCIpOwotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPnVuYXJ5LmNoaWxkKTsKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKSIpOwotICB9Ci0gICAgCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSBldHJlZV9hc3NlcnQ6Ci0gICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiQVNTRVJUICgiKTsKLSAgICBleHBfcHJpbnRfdHJlZSAodHJlZS0+YXNzZXJ0X3MuY2hpbGQpOwotICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiwgJXMpIiwgdHJlZS0+YXNzZXJ0X3MubWVzc2FnZSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBldHJlZV91bmRlZjoKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiPz8/Pz8/Pz8iKTsKLSAgICBicmVhazsKLSAgY2FzZSBldHJlZV9uYW1lOgotICAgIGlmICh0cmVlLT50eXBlLm5vZGVfY29kZSA9PSBOQU1FKSB7Ci0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMiLCB0cmVlLT5uYW1lLm5hbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGV4cF9wcmludF90b2tlbih0cmVlLT50eXBlLm5vZGVfY29kZSk7Ci0gICAgICBpZiAodHJlZS0+bmFtZS5uYW1lKQotICAgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIiglcykiLCB0cmVlLT5uYW1lLm5hbWUpOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBGQUlMKCk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotYmZkX3ZtYQotZXhwX2dldF92bWEgKHRyZWUsIGRlZiwgbmFtZSwgYWxsb2NhdGlvbl9kb25lKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBiZmRfdm1hIGRlZjsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZTsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByOwotCi0gIGlmICh0cmVlICE9IE5VTEwpCi0gICAgewotICAgICAgciA9IGV4cF9mb2xkX3RyZWVfbm9fZG90ICh0cmVlLCBhYnNfb3V0cHV0X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSk7Ci0gICAgICBpZiAoISByLnZhbGlkX3AgJiYgbmFtZSAhPSBOVUxMKQotCWVpbmZvIChfKCIlRiVTIG5vbmNvbnN0YW50IGV4cHJlc3Npb24gZm9yICVzXG4iKSwgbmFtZSk7Ci0gICAgICByZXR1cm4gci52YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZGVmOwotfQotCi1pbnQgCi1leHBfZ2V0X3ZhbHVlX2ludCAodHJlZSxkZWYsbmFtZSwgYWxsb2NhdGlvbl9kb25lKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBpbnQgZGVmOwotICAgICBjaGFyICpuYW1lOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotICByZXR1cm4gKGludClleHBfZ2V0X3ZtYSh0cmVlLChiZmRfdm1hKWRlZixuYW1lLCBhbGxvY2F0aW9uX2RvbmUpOwotfQotCi0KLWJmZF92bWEKLWV4cF9nZXRfYWJzX2ludCAodHJlZSwgZGVmLCBuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGludCBkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzOwotICByZXMgPSBleHBfZm9sZF90cmVlX25vX2RvdCAodHJlZSwgYWJzX291dHB1dF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUpOwotCi0gIGlmIChyZXMudmFsaWRfcCkKLSAgICB7Ci0gICAgICByZXMudmFsdWUgKz0gcmVzLnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0gICAgfQotICBlbHNlIHsKLSAgICBlaW5mbyAoXygiJUYlUyBub24gY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIpLG5hbWUpOwotICB9Ci0gIHJldHVybiByZXMudmFsdWU7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGV4cC5oIGIvbGQvbGRleHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlOGRkZi4uMDAwMDAwMAotLS0gYS9sZC9sZGV4cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIGxkZXhwLmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExERVhQX0gKLSNkZWZpbmUgTERFWFBfSAotCi0vKiBUaGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gdHJlZSAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9zdHJ1Y3QgKnNlY3Rpb247Ci0gIGJvb2xlYW4gdmFsaWRfcDsKLX0gZXRyZWVfdmFsdWVfdHlwZTsKLQotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBpbnQgbm9kZV9jb2RlOwotICBlbnVtIHsgZXRyZWVfYmluYXJ5LAotCSAgIGV0cmVlX3RyaW5hcnksCi0JICAgZXRyZWVfdW5hcnksCi0JICAgZXRyZWVfbmFtZSwKLQkgICBldHJlZV9hc3NpZ24sCi0JICAgZXRyZWVfcHJvdmlkZSwKLQkgICBldHJlZV91bmRlZiwKLQkgICBldHJlZV91bnNwZWMsCi0JICAgZXRyZWVfdmFsdWUsCi0JICAgZXRyZWVfYXNzZXJ0LAotCSAgIGV0cmVlX3JlbCB9IG5vZGVfY2xhc3M7Ci19IG5vZGVfdHlwZTsKLQotCi0KLXR5cGVkZWYgdW5pb24gZXRyZWVfdW5pb24gCi17Ci0gIG5vZGVfdHlwZSB0eXBlOwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpsaHM7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKnJoczsKLSAgfSBiaW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmNvbmQ7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmxoczsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqcmhzOwotICB9IHRyaW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgQ09OU1QgY2hhciAqZHN0OwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpzcmM7Ci0gIH0gYXNzaWduOwotCi0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gICBldHJlZV91bmlvbiAqY2hpbGQ7Ci0gIH0gdW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICBDT05TVCBjaGFyICpuYW1lOwotICB9IG5hbWU7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgYmZkX3ZtYSB2YWx1ZTsKLSAgfSB2YWx1ZTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICBiZmRfdm1hIHZhbHVlOwotICB9IHJlbDsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqY2hpbGQ7Ci0gICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLSAgfSBhc3NlcnRfczsKLX0gZXRyZWVfdHlwZTsKLQotCi1ldHJlZV90eXBlICpleHBfaW50b3AgUEFSQU1TICgoYmZkX3ZtYSkpOwotZXRyZWVfdHlwZSAqZXhwX3JlbG9wIFBBUkFNUyAoKGFzZWN0aW9uICosIGJmZF92bWEpKTsKLWV0cmVlX3ZhbHVlX3R5cGUgaW52YWxpZCBQQVJBTVMgKCh2b2lkKSk7Ci1ldHJlZV92YWx1ZV90eXBlIGV4cF9mb2xkX3RyZWUgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBzdHJ1Y3QKLQkJCQkJbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfc3RydWN0ICosCi0JCQkJCWxhbmdfcGhhc2VfdHlwZSwKLQkJCQkJYmZkX3ZtYSwgYmZkX3ZtYSAqKSk7Ci1ldHJlZV90eXBlICpleHBfYmlub3AgUEFSQU1TICgoaW50LCBldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX3RyaW5vcCBQQVJBTVMgKChpbnQsZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX3Vub3AgUEFSQU1TICgoaW50LCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF9uYW1lb3AgUEFSQU1TICgoaW50LCBDT05TVCBjaGFyICopKTsKLWV0cmVlX3R5cGUgKmV4cF9hc3NvcCBQQVJBTVMgKChpbnQsIENPTlNUIGNoYXIgKiwgZXRyZWVfdHlwZSAqKSk7Ci1ldHJlZV90eXBlICpleHBfcHJvdmlkZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX2Fzc2VydCBQQVJBTVMgKChldHJlZV90eXBlICosIGNvbnN0IGNoYXIgKikpOwotdm9pZCBleHBfcHJpbnRfdHJlZSBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLWJmZF92bWEgZXhwX2dldF92bWEgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBiZmRfdm1hLCBjaGFyICosIGxhbmdfcGhhc2VfdHlwZSkpOwotaW50IGV4cF9nZXRfdmFsdWVfaW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgaW50LCBjaGFyICosbGFuZ19waGFzZV90eXBlKSk7Ci1iZmRfdm1hIGV4cF9nZXRfYWJzX2ludCBQQVJBTVMgKChldHJlZV90eXBlICosIGludCwgY2hhciAqLGxhbmdfcGhhc2VfdHlwZSkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkZmlsZS5jIGIvbGQvbGRmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmEzMWYuLjAwMDAwMDAKLS0tIGEvbGQvbGRmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gbGRmaWxlLmMKLQotIGxvb2sgYWZ0ZXIgYWxsIHRoZSBmaWxlIHN0dWZmCi0KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciAqbGRmaWxlX2lucHV0X2ZpbGVuYW1lOwotYm9vbGVhbiBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSBmYWxzZTsKLWNvbnN0IGNoYXIgKmxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gIiI7Ci11bnNpZ25lZCBsb25nIGxkZmlsZV9vdXRwdXRfbWFjaGluZTsKLWVudW0gYmZkX2FyY2hpdGVjdHVyZSBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZTsKLXNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaF9oZWFkOwotCi0jaWZuZGVmIE1QVwotI2lmZGVmIFZNUwotY2hhciAqc2xhc2ggPSAiIjsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLWNoYXIgKnNsYXNoID0gIlxcIjsKLSNlbHNlCi1jaGFyICpzbGFzaCA9ICIvIjsKLSNlbmRpZgotI2VuZGlmCi0jZWxzZSAvKiBNUFcgKi8KLS8qIFRoZSBNUFcgcGF0aCBjaGFyIGlzIGEgY29sb24uICovCi1jaGFyICpzbGFzaCA9ICI6IjsKLSNlbmRpZiAvKiBNUFcgKi8KLQotLyogTE9DQUwgKi8KLQotc3RhdGljIHNlYXJjaF9kaXJzX3R5cGUgKipzZWFyY2hfdGFpbF9wdHIgPSAmc2VhcmNoX2hlYWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHNlYXJjaF9hcmNoIAotewotICBjaGFyICpuYW1lOyAKLSAgc3RydWN0IHNlYXJjaF9hcmNoICpuZXh0OwotfSBzZWFyY2hfYXJjaF90eXBlOwotCi1zdGF0aWMgc2VhcmNoX2FyY2hfdHlwZSAqc2VhcmNoX2FyY2hfaGVhZDsKLXN0YXRpYyBzZWFyY2hfYXJjaF90eXBlICoqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSAmc2VhcmNoX2FyY2hfaGVhZDsKLSAKLXN0YXRpYyBib29sZWFuIGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2gsIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKLQkgICBjb25zdCBjaGFyICpsaWIsIGNvbnN0IGNoYXIgKnN1ZmZpeCkpOwotc3RhdGljIEZJTEUgKnRyeV9vcGVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmV4dGVuKSk7Ci0KLXZvaWQKLWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChuYW1lLCBjbWRsaW5lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGNtZGxpbmU7Ci17Ci0gIHNlYXJjaF9kaXJzX3R5cGUgKm5ldzsKLQotICBuZXcgPSAoc2VhcmNoX2RpcnNfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHNlYXJjaF9kaXJzX3R5cGUpKTsKLSAgbmV3LT5uZXh0ID0gTlVMTDsKLSAgbmV3LT5uYW1lID0gbmFtZTsKLSAgbmV3LT5jbWRsaW5lID0gY21kbGluZTsKLSAgKnNlYXJjaF90YWlsX3B0ciA9IG5ldzsKLSAgc2VhcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBCRkQgZm9yIGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnQuICAqLwotCi1ib29sZWFuCi1sZGZpbGVfdHJ5X29wZW5fYmZkIChhdHRlbXB0LCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXR0ZW1wdDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGVudHJ5LT50aGVfYmZkID0gYmZkX29wZW5yIChhdHRlbXB0LCBlbnRyeS0+dGFyZ2V0KTsKLQotICBpZiAodHJhY2VfZmlsZV90cmllcykKLSAgICB7Ci0gICAgICBpZiAoZW50cnktPnRoZV9iZmQgPT0gTlVMTCkKLQlpbmZvX21zZyAoXygiYXR0ZW1wdCB0byBvcGVuICVzIGZhaWxlZFxuIiksIGF0dGVtcHQpOwotICAgICAgZWxzZQotCWluZm9fbXNnIChfKCJhdHRlbXB0IHRvIG9wZW4gJXMgc3VjY2VlZGVkXG4iKSwgYXR0ZW1wdCk7Ci0gICAgfQotCi0gIGlmIChlbnRyeS0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KQotCWVpbmZvIChfKCIlRiVQOiBpbnZhbGlkIEJGRCB0YXJnZXQgYCVzJ1xuIiksIGVudHJ5LT50YXJnZXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU2VhcmNoIGZvciBhbmQgb3BlbiB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgRU5UUlkuICBJZiBpdCBpcyBhbgotICAgYXJjaGl2ZSwgdXNlIEFSQ0gsIExJQiBhbmQgU1VGRklYIHRvIG1vZGlmeSB0aGUgZmlsZSBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoIChhcmNoLCBlbnRyeSwgbGliLCBzdWZmaXgpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotICAgICBjb25zdCBjaGFyICpsaWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLXsKLSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IGFuIGFyY2hpdmUsIHRyeSB0byBvcGVuIGl0IGluIHRoZSBjdXJyZW50Ci0gICAgIGRpcmVjdG9yeSBmaXJzdC4gICovCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHsKLSAgICAgIGlmIChsZGZpbGVfdHJ5X29wZW5fYmZkIChlbnRyeS0+ZmlsZW5hbWUsIGVudHJ5KSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsKLSAgICAgICBzZWFyY2ggIT0gKHNlYXJjaF9kaXJzX3R5cGUgKilOVUxMOwotICAgICAgIHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkgCi0gICAgewotICAgICAgY2hhciAqc3RyaW5nOwotCi0gICAgICBpZiAoZW50cnktPmR5bmFtaWMgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCXsKLQkgIGlmIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpKQotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJCSArIHN0cmxlbiAoc2xhc2gpCi0JCQkJICsgc3RybGVuIChsaWIpCi0JCQkJICsgc3RybGVuIChlbnRyeS0+ZmlsZW5hbWUpCi0JCQkJICsgc3RybGVuIChhcmNoKQotCQkJCSArIHN0cmxlbiAoc3VmZml4KQotCQkJCSArIDEpOwotCi0gICAgICBpZiAoZW50cnktPmlzX2FyY2hpdmUpCi0Jc3ByaW50ZiAoc3RyaW5nLCAiJXMlcyVzJXMlcyVzIiwgc2VhcmNoLT5uYW1lLCBzbGFzaCwKLQkJIGxpYiwgZW50cnktPmZpbGVuYW1lLCBhcmNoLCBzdWZmaXgpOwotICAgICAgZWxzZSBpZiAoZW50cnktPmZpbGVuYW1lWzBdID09ICcvJyB8fCBlbnRyeS0+ZmlsZW5hbWVbMF0gPT0gJy4nCi0jaWYgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfV0lOMzIpCi0JICAgICAgIHx8IGVudHJ5LT5maWxlbmFtZVswXSA9PSAnXFwnIAotCSAgICAgICB8fCAoaXNhbHBoYSAoZW50cnktPmZpbGVuYW1lWzBdKSAKLQkgICAgICAgICAgICYmIGVudHJ5LT5maWxlbmFtZVsxXSA9PSAnOicpCi0jZW5kaWYKLQkgICkKLQlzdHJjcHkgKHN0cmluZywgZW50cnktPmZpbGVuYW1lKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChzdHJpbmcsICIlcyVzJXMiLCBzZWFyY2gtPm5hbWUsIHNsYXNoLCBlbnRyeS0+ZmlsZW5hbWUpOwotCi0gICAgICBpZiAobGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0JewotCSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBmcmVlIChzdHJpbmcpOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIE9wZW4gdGhlIGlucHV0IGZpbGUgc3BlY2lmaWVkIGJ5IEVOVFJZLiAgKi8KLQotdm9pZAotbGRmaWxlX29wZW5fZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAoZW50cnktPnRoZV9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpCi0gICAgewotICAgICAgaWYgKGxkZmlsZV90cnlfb3Blbl9iZmQgKGVudHJ5LT5maWxlbmFtZSwgZW50cnkpKQotCXJldHVybjsKLSAgICAgIGlmIChzdHJjbXAgKGVudHJ5LT5maWxlbmFtZSwgZW50cnktPmxvY2FsX3N5bV9uYW1lKSAhPSAwKQotCWVpbmZvIChfKCIlRiVQOiBjYW5ub3Qgb3BlbiAlcyBmb3IgJXM6ICVFXG4iKSwKLQkgICAgICAgZW50cnktPmZpbGVuYW1lLCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpOwotICAgICAgZWxzZQotCWVpbmZvKF8oIiVGJVA6IGNhbm5vdCBvcGVuICVzOiAlRVxuIiksIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2VhcmNoX2FyY2hfdHlwZSAqYXJjaDsKLQotICAgICAgLyogVHJ5IHRvIG9wZW4gPGZpbGVuYW1lPjxzdWZmaXg+IG9yIGxpYjxmaWxlbmFtZT48c3VmZml4Pi5hICovCi0gICAgICBmb3IgKGFyY2ggPSBzZWFyY2hfYXJjaF9oZWFkOwotCSAgIGFyY2ggIT0gKHNlYXJjaF9hcmNoX3R5cGUgKikgTlVMTDsKLQkgICBhcmNoID0gYXJjaC0+bmV4dCkKLQl7Ci0JICBpZiAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2ggKGFyY2gtPm5hbWUsIGVudHJ5LCAibGliIiwgIi5hIikpCi0JICAgIHJldHVybjsKLSNpZmRlZiBWTVMKLQkgIGlmIChsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCAoYXJjaC0+bmFtZSwgZW50cnksICI6bGliIiwgIi5hIikpCi0JICAgIHJldHVybjsKLSNlbmRpZgotCX0KLSAgICAgIGVpbmZvIChfKCIlRiVQOiBjYW5ub3QgZmluZCAlc1xuIiksIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSk7Ci0gICAgfQotfQotCi0vKiBUcnkgdG8gb3BlbiBOQU1FOyBpZiB0aGF0IGZhaWxzLCB0cnkgTkFNRSB3aXRoIEVYVEVOIGFwcGVuZGVkIHRvIGl0LiAgKi8KLQotc3RhdGljIEZJTEUgKgotdHJ5X29wZW4gKG5hbWUsIGV4dGVuKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpleHRlbjsKLXsKLSAgRklMRSAqcmVzdWx0OwotICBjaGFyIGJ1ZmZbMTAwMF07Ci0KLSAgcmVzdWx0ID0gZm9wZW4gKG5hbWUsICJyIik7Ci0gIGlmICh0cmFjZV9maWxlX3RyaWVzKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlpbmZvX21zZyAoXygiY2Fubm90IGZpbmQgc2NyaXB0IGZpbGUgJXNcbiIpLCBuYW1lKTsKLSAgICAgIGVsc2UKLQlpbmZvX21zZyAoXygib3BlbmVkIHNjcmlwdCBmaWxlICVzXG4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIGlmICgqZXh0ZW4pCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmZiwgIiVzJXMiLCBuYW1lLCBleHRlbik7Ci0gICAgICByZXN1bHQgPSBmb3BlbiAoYnVmZiwgInIiKTsKLSAgICAgIGlmICh0cmFjZV9maWxlX3RyaWVzKQotCXsKLQkgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQkgICAgaW5mb19tc2cgKF8oImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iKSwgYnVmZik7Ci0JICBlbHNlCi0JICAgIGluZm9fbXNnIChfKCJvcGVuZWQgc2NyaXB0IGZpbGUgJXNcbiIpLCBidWZmKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIE5BTUU7IGlmIHRoYXQgZmFpbHMsIGxvb2sgZm9yIGl0IGluIGFueSBkaXJlY3RvcmllcwotICAgc3BlY2lmaWVkIHdpdGggLUwsIHdpdGhvdXQgYW5kIHdpdGggRVhURU5EIGFwcHBlbmRlZC4gICovCi0KLUZJTEUgKgotbGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlIChuYW1lLCBleHRlbmQpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmV4dGVuZDsKLXsKLSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICBGSUxFICpyZXN1bHQ7Ci0gIGNoYXIgYnVmZmVyWzEwMDBdOwotCi0gIC8qIEZpcnN0IHRyeSByYXcgbmFtZSAqLwotICByZXN1bHQgPSB0cnlfb3BlbihuYW1lLCIiKTsKLSAgaWYgKHJlc3VsdCA9PSAoRklMRSAqKU5VTEwpIHsKLSAgICAvKiBUcnkgbm93IHByZWZpeGVzICovCi0gICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsKLQkgc2VhcmNoICE9IChzZWFyY2hfZGlyc190eXBlICopTlVMTDsKLQkgc2VhcmNoID0gc2VhcmNoLT5uZXh0KSB7Ci0gICAgICBzcHJpbnRmKGJ1ZmZlciwiJXMlcyVzIiwgc2VhcmNoLT5uYW1lLCBzbGFzaCwgbmFtZSk7Ci0gICAgICByZXN1bHQgPSB0cnlfb3BlbihidWZmZXIsIGV4dGVuZCk7Ci0gICAgICBpZiAocmVzdWx0KWJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkCi1sZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIEZJTEUgKmxkbGV4X2lucHV0X3N0YWNrOwotICBsZGxleF9pbnB1dF9zdGFjayA9IGxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZShuYW1lLCAiIik7Ci0KLSAgaWYgKGxkbGV4X2lucHV0X3N0YWNrID09IChGSUxFICopTlVMTCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgZWluZm8oXygiJVAlRjogY2Fubm90IG9wZW4gbGlua2VyIHNjcmlwdCBmaWxlICVzOiAlRVxuIiksbmFtZSk7Ci0gIH0KLSAgbGV4X3B1c2hfZmlsZShsZGxleF9pbnB1dF9zdGFjaywgbmFtZSk7Ci0gIAotICBsZGZpbGVfaW5wdXRfZmlsZW5hbWUgPSBuYW1lOwotICBsaW5lbm8gPSAxOwotICBoYWRfc2NyaXB0ID0gdHJ1ZTsKLX0KLQotCi0KLQotCi0jaWZkZWYgR05VOTYwCi1zdGF0aWMKLWNoYXIgKgotZ251OTYwX21hcF9hcmNobmFtZSggbmFtZSApCi1jaGFyICpuYW1lOwotewotICBzdHJ1Y3QgdGFiZW50cnkgeyBjaGFyICpjbWRfc3dpdGNoOyBjaGFyICphcmNoOyB9OwotICBzdGF0aWMgc3RydWN0IHRhYmVudHJ5IGFyY2hfdGFiW10gPSB7Ci0JIiIsICAgIiIsCi0JIktBIiwgImthIiwKLQkiS0IiLCAia2IiLAotCSJLQyIsICJtYyIsCS8qIFN5bm9ueW0gZm9yIE1DICovCi0JIk1DIiwgIm1jIiwKLQkiQ0EiLCAiY2EiLAotCSJTQSIsICJrYSIsCS8qIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEtBICovCi0JIlNCIiwgImtiIiwJLyogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gS0IgKi8KLQlOVUxMLCAiIgotICB9OwotICBzdHJ1Y3QgdGFiZW50cnkgKnRwOwotICAKLQotICBmb3IgKCB0cCA9IGFyY2hfdGFiOyB0cC0+Y21kX3N3aXRjaCAhPSBOVUxMOyB0cCsrICl7Ci0gICAgaWYgKCAhc3RyY21wKG5hbWUsdHAtPmNtZF9zd2l0Y2gpICl7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoIHRwLT5jbWRfc3dpdGNoID09IE5VTEwgKXsKLSAgICBlaW5mbyhfKCIlUCVGOiB1bmtub3duIGFyY2hpdGVjdHVyZTogJXNcbiIpLG5hbWUpOwotICB9Ci0gIHJldHVybiB0cC0+YXJjaDsKLX0KLQotCi0KLXZvaWQKLWxkZmlsZV9hZGRfYXJjaChuYW1lKQotY2hhciAqbmFtZTsKLXsKLSAgc2VhcmNoX2FyY2hfdHlwZSAqbmV3ID0KLSAgICAoc2VhcmNoX2FyY2hfdHlwZSAqKXhtYWxsb2MoKGJmZF9zaXplX3R5cGUpKHNpemVvZihzZWFyY2hfYXJjaF90eXBlKSkpOwotCi0KLSAgaWYgKCpuYW1lICE9ICdcMCcpIHsKLSAgICBpZiAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWVbMF0gIT0gJ1wwJykgewotICAgICAgZWluZm8oXygiJVAlRjogdGFyZ2V0IGFyY2hpdGVjdHVyZSByZXNwZWNpZmllZFxuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9IG5hbWU7Ci0gIH0KLQotICBuZXctPm5leHQgPSAoc2VhcmNoX2FyY2hfdHlwZSopTlVMTDsKLSAgbmV3LT5uYW1lID0gZ251OTYwX21hcF9hcmNobmFtZSggbmFtZSApOwotICAqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSBuZXc7Ci0gIHNlYXJjaF9hcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLQotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLQotdm9pZAotbGRmaWxlX2FkZF9hcmNoIChpbl9uYW1lKQotICAgICBDT05TVCBjaGFyICogaW5fbmFtZTsKLXsKLSAgY2hhciAqbmFtZSA9IGJ1eXN0cmluZyhpbl9uYW1lKTsKLSAgc2VhcmNoX2FyY2hfdHlwZSAqbmV3ID0KLSAgICAoc2VhcmNoX2FyY2hfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHNlYXJjaF9hcmNoX3R5cGUpKTsKLQotICBsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9IGluX25hbWU7Ci0KLSAgbmV3LT5uYW1lID0gbmFtZTsKLSAgbmV3LT5uZXh0ID0gKHNlYXJjaF9hcmNoX3R5cGUqKU5VTEw7Ci0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKSkKLQkqbmFtZSA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqbmFtZSk7Ci0gICAgICBuYW1lKys7Ci0gICAgfQotICAqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSBuZXc7Ci0gIHNlYXJjaF9hcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLQotfQotI2VuZGlmCi0KLS8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSAqLwotdm9pZAotbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoc3RyaW5nKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IGJmZF9zY2FuX2FyY2goc3RyaW5nKTsKLQotICBpZiAoYXJjaCkgewotICAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYXJjaC0+YXJjaDsKLSAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBhcmNoLT5tYWNoOwotICAgIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gYXJjaC0+cHJpbnRhYmxlX25hbWU7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZWluZm8oXygiJVAlRjogY2Fubm90IHJlcHJlc2VudCBtYWNoaW5lIGAlcydcbiIpLCBzdHJpbmcpOwotICB9Ci19CmRpZmYgLS1naXQgYS9sZC9sZGZpbGUuaCBiL2xkL2xkZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNjOWNlLi4wMDAwMDAwCi0tLSBhL2xkL2xkZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogbGRmaWxlLmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmxkZmlsZV9pbnB1dF9maWxlbmFtZTsKLWV4dGVybiBib29sZWFuIGxkZmlsZV9hc3N1bWVkX3NjcmlwdDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxkZmlsZV9vdXRwdXRfbWFjaGluZTsKLWV4dGVybiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmU7Ci1leHRlcm4gY29uc3QgY2hhciAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWU7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvcgotICAgbGlicmFyaWVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2RpcnMgCi17Ci0gIC8qIE5leHQgZGlyZWN0b3J5IG9uIGxpc3QuICAqLwotICBzdHJ1Y3Qgc2VhcmNoX2RpcnMgKm5leHQ7Ci0gIC8qIE5hbWUgb2YgZGlyZWN0b3J5LiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIGJvb2xlYW4gY21kbGluZTsKLX0gc2VhcmNoX2RpcnNfdHlwZTsKLQotZXh0ZXJuIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaF9oZWFkOwotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0OwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGxkZmlsZV9hZGRfYXJjaCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjbWRsaW5lKSk7Ci1leHRlcm4gdm9pZCBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbGRmaWxlX29wZW5fZmlsZSBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBib29sZWFuIGxkZmlsZV90cnlfb3Blbl9iZmQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBGSUxFICpsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZXh0ZW5kKSk7Ci1leHRlcm4gdm9pZCBsZGZpbGVfc2V0X291dHB1dF9hcmNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwpkaWZmIC0tZ2l0IGEvbGQvbGRncmFtLnkgYi9sZC9sZGdyYW0ueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyYjlmYi4uMDAwMDAwMAotLS0gYS9sZC9sZGdyYW0ueQorKysgL2Rldi9udWxsCkBAIC0xLDExMDMgKzAsMCBAQAotLyogQSBZQUNDIGdyYW1tZXIgdG8gcGFyc2UgYSBzdXBlcnNldCBvZiB0aGUgQVQmVCBsaW5rZXIgc2NyaXB0aW5nIGxhbmd1YXVlLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzdGV2ZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGxkLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0lewotLyoKLQotICovCi0KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGQuaCIgICAgCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZHZlci5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgIm1yaS5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0KLSNpZm5kZWYgWVlERUJVRwotI2RlZmluZSBZWURFQlVHIDEKLSNlbmRpZgotCi1zdGF0aWMgZW51bSBzZWN0aW9uX3R5cGUgc2VjdHlwZTsKLQotbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnJlZ2lvbjsKLQotc3RydWN0IHdpbGRjYXJkX3NwZWMgY3VycmVudF9maWxlOwotYm9vbGVhbiBsZGdyYW1fd2FudF9maWxlbmFtZSA9IHRydWU7Ci1ib29sZWFuIGhhZF9zY3JpcHQgPSBmYWxzZTsKLWJvb2xlYW4gZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0KLWJvb2xlYW4gbGRncmFtX2luX3NjcmlwdCA9IGZhbHNlOwotYm9vbGVhbiBsZGdyYW1faGFkX2VxdWFscyA9IGZhbHNlOwotYm9vbGVhbiBsZGdyYW1faGFkX2tlZXAgPSBmYWxzZTsKLWNoYXIgKmxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyA9IE5VTEw7Ci0KLSNkZWZpbmUgRVJST1JfTkFNRV9NQVggMjAKLXN0YXRpYyBjaGFyICplcnJvcl9uYW1lc1tFUlJPUl9OQU1FX01BWF07Ci1zdGF0aWMgaW50IGVycm9yX2luZGV4OwotI2RlZmluZSBQVVNIX0VSUk9SKHgpIGlmIChlcnJvcl9pbmRleCA8IEVSUk9SX05BTUVfTUFYKSBlcnJvcl9uYW1lc1tlcnJvcl9pbmRleF0gPSB4OyBlcnJvcl9pbmRleCsrOwotI2RlZmluZSBQT1BfRVJST1IoKSAgIGVycm9yX2luZGV4LS07Ci0lfQotJXVuaW9uIHsKLSAgYmZkX3ZtYSBpbnRlZ2VyOwotICBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICpjbmFtZTsKLSAgc3RydWN0IHdpbGRjYXJkX3NwZWMgd2lsZGNhcmQ7Ci0gIGludCB0b2tlbjsKLSAgdW5pb24gZXRyZWVfdW5pb24gKmV0cmVlOwotICBzdHJ1Y3QgcGhkcl9pbmZvCi0gICAgewotICAgICAgYm9vbGVhbiBmaWxlaGRyOwotICAgICAgYm9vbGVhbiBwaGRyczsKLSAgICAgIHVuaW9uIGV0cmVlX3VuaW9uICphdDsKLSAgICAgIHVuaW9uIGV0cmVlX3VuaW9uICpmbGFnczsKLSAgICB9IHBoZHI7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5vY3Jvc3NyZWY7Ci0gIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqc2VjdGlvbl9waGRyOwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmRlZmxpc3Q7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqdmVyc3ltczsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJzbm9kZTsKLX0KLQotJXR5cGUgPGV0cmVlPiBleHAgb3B0X2V4cF93aXRoX3R5cGUgbXVzdGJlX2V4cCBvcHRfYXQgcGhkcl90eXBlIHBoZHJfdmFsCi0ldHlwZSA8ZXRyZWU+IG9wdF9leHBfd2l0aG91dF90eXBlCi0ldHlwZSA8aW50ZWdlcj4gZmlsbF9vcHQKLSV0eXBlIDxuYW1lPiBtZW1zcGVjX29wdCBjYXNlc3ltbGlzdAotJXR5cGUgPGNuYW1lPiB3aWxkY2FyZF9uYW1lCi0ldHlwZSA8d2lsZGNhcmQ+IHdpbGRjYXJkX3NwZWMKLSV0b2tlbiA8aW50ZWdlcj4gSU5UICAKLSV0b2tlbiA8bmFtZT4gTkFNRSBMTkFNRQotJXR5cGUgPGludGVnZXI+IGxlbmd0aAotJXR5cGUgPHBoZHI+IHBoZHJfcXVhbGlmaWVycwotJXR5cGUgPG5vY3Jvc3NyZWY+IG5vY3Jvc3NyZWZfbGlzdAotJXR5cGUgPHNlY3Rpb25fcGhkcj4gcGhkcl9vcHQKLSV0eXBlIDxpbnRlZ2VyPiBvcHRfbm9jcm9zc3JlZnMKLQotJXJpZ2h0IDx0b2tlbj4gUExVU0VRIE1JTlVTRVEgTVVMVEVRIERJVkVRICAnPScgTFNISUZURVEgUlNISUZURVEgICBBTkRFUSBPUkVRIAotJXJpZ2h0IDx0b2tlbj4gJz8nICc6JwotJWxlZnQgPHRva2VuPiBPUk9SCi0lbGVmdCA8dG9rZW4+ICBBTkRBTkQKLSVsZWZ0IDx0b2tlbj4gJ3wnCi0lbGVmdCA8dG9rZW4+ICAnXicKLSVsZWZ0ICA8dG9rZW4+ICcmJwotJWxlZnQgPHRva2VuPiAgRVEgTkUKLSVsZWZ0ICA8dG9rZW4+ICc8JyAnPicgTEUgR0UKLSVsZWZ0ICA8dG9rZW4+IExTSElGVCBSU0hJRlQKLQotJWxlZnQgIDx0b2tlbj4gJysnICctJwotJWxlZnQgIDx0b2tlbj4gJyonICcvJyAnJScKLQotJXJpZ2h0IFVOQVJZCi0ldG9rZW4gRU5EIAotJWxlZnQgPHRva2VuPiAnKCcKLSV0b2tlbiA8dG9rZW4+IEFMSUdOX0sgQkxPQ0sgQklORCBRVUFEIFNRVUFEIExPTkcgU0hPUlQgQllURQotJXRva2VuIFNFQ1RJT05TIFBIRFJTIFNPUlQKLSV0b2tlbiAneycgJ30nCi0ldG9rZW4gU0laRU9GX0hFQURFUlMgT1VUUFVUX0ZPUk1BVCBGT1JDRV9DT01NT05fQUxMT0NBVElPTiBPVVRQVVRfQVJDSAotJXRva2VuIFNJWkVPRl9IRUFERVJTCi0ldG9rZW4gSU5DTFVERQotJXRva2VuIE1FTU9SWSBERUZTWU1FTkQKLSV0b2tlbiBOT0xPQUQgRFNFQ1QgQ09QWSBJTkZPIE9WRVJMQVkKLSV0b2tlbiBOQU1FIExOQU1FIERFRklORUQgVEFSR0VUX0sgU0VBUkNIX0RJUiBNQVAgRU5UUlkKLSV0b2tlbiA8aW50ZWdlcj4gTkVYVAotJXRva2VuIFNJWkVPRiBBRERSIExPQURBRERSIE1BWF9LIE1JTl9LCi0ldG9rZW4gU1RBUlRVUCBITEwgU1lTTElCIEZMT0FUIE5PRkxPQVQgTk9DUk9TU1JFRlMKLSV0b2tlbiBPUklHSU4gRklMTAotJXRva2VuIExFTkdUSCBDUkVBVEVfT0JKRUNUX1NZTUJPTFMgSU5QVVQgR1JPVVAgT1VUUFVUIENPTlNUUlVDVE9SUwotJXRva2VuIEFMSUdOTU9EIEFUIFBST1ZJREUKLSV0eXBlIDx0b2tlbj4gYXNzaWduX29wIGF0eXBlIGF0dHJpYnV0ZXNfb3B0Ci0ldHlwZSA8bmFtZT4gIGZpbGVuYW1lCi0ldG9rZW4gQ0hJUCBMSVNUIFNFQ1QgQUJTT0xVVEUgIExPQUQgTkVXTElORSBFTkRXT1JEIE9SREVSIE5BTUVXT1JEIEFTU0VSVF9LCi0ldG9rZW4gRk9STUFUIFBVQkxJQyBERUZTWU1FTkQgQkFTRSBBTElBUyBUUlVOQ0FURSBSRUwKLSV0b2tlbiBJTlBVVF9TQ1JJUFQgSU5QVVRfTVJJX1NDUklQVCBJTlBVVF9ERUZTWU0gQ0FTRSBFWFRFUk4gU1RBUlQKLSV0b2tlbiA8bmFtZT4gVkVSU19UQUcgVkVSU19JREVOVElGSUVSCi0ldG9rZW4gR0xPQkFMIExPQ0FMIFZFUlNJT05LIElOUFVUX1ZFUlNJT05fU0NSSVBUCi0ldG9rZW4gS0VFUAotJXRva2VuIEVYQ0xVREVfRklMRQotJXR5cGUgPHZlcnN5bXM+IHZlcnNfZGVmbnMKLSV0eXBlIDx2ZXJzbm9kZT4gdmVyc190YWcKLSV0eXBlIDxkZWZsaXN0PiB2ZXJkZXAKLQotJSUKLQotZmlsZToJCi0JCUlOUFVUX1NDUklQVCBzY3JpcHRfZmlsZQotCXwJSU5QVVRfTVJJX1NDUklQVCBtcmlfc2NyaXB0X2ZpbGUKLQl8CUlOUFVUX1ZFUlNJT05fU0NSSVBUIHZlcnNpb25fc2NyaXB0X2ZpbGUKLQl8CUlOUFVUX0RFRlNZTSBkZWZzeW1fZXhwcgotCTsKLQotCi1maWxlbmFtZTogIE5BTUU7Ci0KLQotZGVmc3ltX2V4cHI6Ci0JCXsgbGRsZXhfZGVmc3ltKCk7IH0KLQkJTkFNRSAnPScgZXhwCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSgpOwotCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQoZXhwX2Fzc29wKCQzLCQyLCQ0KSk7Ci0JCX0KLQotLyogU1lOVEFYIFdJVEhJTiBBTiBNUkkgU0NSSVBUIEZJTEUgKi8gIAotbXJpX3NjcmlwdF9maWxlOgotCQl7Ci0JCSAgbGRsZXhfbXJpX3NjcmlwdCAoKTsKLQkJICBQVVNIX0VSUk9SIChfKCJNUkkgc3R5bGUgc2NyaXB0IikpOwotCQl9Ci0JICAgICBtcmlfc2NyaXB0X2xpbmVzCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBtcmlfZHJhd190cmVlICgpOwotCQkgIFBPUF9FUlJPUiAoKTsKLQkJfQotCTsKLQotbXJpX3NjcmlwdF9saW5lczoKLQkJbXJpX3NjcmlwdF9saW5lcyBtcmlfc2NyaXB0X2NvbW1hbmQgTkVXTElORQotICAgICAgICAgIHwKLQk7Ci0KLW1yaV9zY3JpcHRfY29tbWFuZDoKLQkJQ0hJUCAgZXhwIAotCXwJQ0hJUCAgZXhwICcsJyBleHAKLQl8CU5BTUUgCXsKLQkJCWVpbmZvKF8oIiVQJUY6IHVucmVjb2duaXNlZCBrZXl3b3JkIGluIE1SSSBzdHlsZSBzY3JpcHQgJyVzJ1xuIiksJDEpOwotCQkJfQotCXwJTElTVCAgCXsKLQkJCWNvbmZpZy5tYXBfZmlsZW5hbWUgPSAiLSI7Ci0JCQl9Ci0gICAgICAgIHwgICAgICAgT1JERVIgb3JkZXJuYW1lbGlzdAotCXwgICAgICAgRU5EV09SRCAKLSAgICAgICAgfCAgICAgICBQVUJMSUMgTkFNRSAnPScgZXhwCi0gCQkJeyBtcmlfcHVibGljKCQyLCAkNCk7IH0KLSAgICAgICAgfCAgICAgICBQVUJMSUMgTkFNRSAnLCcgZXhwCi0gCQkJeyBtcmlfcHVibGljKCQyLCAkNCk7IH0KLSAgICAgICAgfCAgICAgICBQVUJMSUMgTkFNRSAgZXhwIAotIAkJCXsgbXJpX3B1YmxpYygkMiwgJDMpOyB9Ci0JfCAJRk9STUFUIE5BTUUKLQkJCXsgbXJpX2Zvcm1hdCgkMik7IH0KLQl8CVNFQ1QgTkFNRSAnLCcgZXhwCi0JCQl7IG1yaV9vdXRwdXRfc2VjdGlvbigkMiwgJDQpO30KLQl8CVNFQ1QgTkFNRSAgZXhwCi0JCQl7IG1yaV9vdXRwdXRfc2VjdGlvbigkMiwgJDMpO30KLQl8CVNFQ1QgTkFNRSAnPScgZXhwCi0JCQl7IG1yaV9vdXRwdXRfc2VjdGlvbigkMiwgJDQpO30KLQl8CUFMSUdOX0sgTkFNRSAnPScgZXhwCi0JCQl7IG1yaV9hbGlnbigkMiwkNCk7IH0KLQl8CUFMSUdOX0sgTkFNRSAnLCcgZXhwCi0JCQl7IG1yaV9hbGlnbigkMiwkNCk7IH0KLQl8CUFMSUdOTU9EIE5BTUUgJz0nIGV4cAotCQkJeyBtcmlfYWxpZ25tb2QoJDIsJDQpOyB9Ci0JfAlBTElHTk1PRCBOQU1FICcsJyBleHAKLQkJCXsgbXJpX2FsaWdubW9kKCQyLCQ0KTsgfQotCXwJQUJTT0xVVEUgbXJpX2Fic19uYW1lX2xpc3QKLQl8CUxPQUQJIG1yaV9sb2FkX25hbWVfbGlzdAotCXwgICAgICAgTkFNRVdPUkQgTkFNRSAKLQkJCXsgbXJpX25hbWUoJDIpOyB9ICAgCi0JfAlBTElBUyBOQU1FICcsJyBOQU1FCi0JCQl7IG1yaV9hbGlhcygkMiwkNCwwKTt9Ci0JfAlBTElBUyBOQU1FICcsJyBJTlQKLQkJCXsgbXJpX2FsaWFzKCQyLDAsKGludCkgJDQpO30KLQl8CUJBU0UgICAgIGV4cAotCQkJeyBtcmlfYmFzZSgkMik7IH0KLSAgICAgICAgfCAgICAgICBUUlVOQ0FURSBJTlQKLQkJeyAgbXJpX3RydW5jYXRlKCh1bnNpZ25lZCBpbnQpICQyKTsgfQotCXwJQ0FTRSBjYXNlc3ltbGlzdAotCXwJRVhURVJOIGV4dGVybl9uYW1lX2xpc3QKLQl8CUlOQ0xVREUgZmlsZW5hbWUKLQkJeyBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKCQyKTsgfSBtcmlfc2NyaXB0X2xpbmVzIEVORAotCXwJU1RBUlQgTkFNRQotCQl7IGxhbmdfYWRkX2VudHJ5ICgkMiwgZmFsc2UpOyB9Ci0gICAgICAgIHwKLQk7Ci0KLW9yZGVybmFtZWxpc3Q6Ci0JICAgICAgb3JkZXJuYW1lbGlzdCAnLCcgTkFNRSAgICAgICAgIHsgbXJpX29yZGVyKCQzKTsgfQotCXwgICAgIG9yZGVybmFtZWxpc3QgIE5BTUUgICAgICAgICB7IG1yaV9vcmRlcigkMik7IH0KLSAgICAgIAl8Ci0JOwotCi1tcmlfbG9hZF9uYW1lX2xpc3Q6Ci0JCU5BTUUKLQkJCXsgbXJpX2xvYWQoJDEpOyB9Ci0JfAltcmlfbG9hZF9uYW1lX2xpc3QgJywnIE5BTUUgeyBtcmlfbG9hZCgkMyk7IH0KLQk7Ci0KLW1yaV9hYnNfbmFtZV9saXN0OgotIAkJTkFNRQotIAkJCXsgbXJpX29ubHlfbG9hZCgkMSk7IH0KLQl8CW1yaV9hYnNfbmFtZV9saXN0ICcsJyAgTkFNRQotIAkJCXsgbXJpX29ubHlfbG9hZCgkMyk7IH0KLQk7Ci0KLWNhc2VzeW1saXN0OgotCSAgLyogZW1wdHkgKi8geyAkJCA9IE5VTEw7IH0KLQl8IE5BTUUKLQl8IGNhc2VzeW1saXN0ICcsJyBOQU1FCi0JOwotCi1leHRlcm5fbmFtZV9saXN0OgotCSAgTkFNRQotCQkJeyBsZGxhbmdfYWRkX3VuZGVmICgkMSk7IH0KLQl8IGV4dGVybl9uYW1lX2xpc3QgTkFNRQotCQkJeyBsZGxhbmdfYWRkX3VuZGVmICgkMik7IH0KLQl8IGV4dGVybl9uYW1lX2xpc3QgJywnIE5BTUUKLQkJCXsgbGRsYW5nX2FkZF91bmRlZiAoJDMpOyB9Ci0JOwotCi1zY3JpcHRfZmlsZToKLQl7Ci0JIGxkbGV4X2JvdGgoKTsKLQl9Ci0gICAgICAgaWZpbGVfbGlzdAotCXsKLQlsZGxleF9wb3BzdGF0ZSgpOwotCX0KLSAgICAgICAgOwotCi0KLWlmaWxlX2xpc3Q6Ci0gICAgICAgaWZpbGVfbGlzdCBpZmlsZV9wMQotICAgICAgICB8Ci0JOwotCi0KLQotaWZpbGVfcDE6Ci0JCW1lbW9yeQotCXwJc2VjdGlvbnMKLQl8CXBoZHJzCi0JfAlzdGFydHVwCi0JfAloaWdoX2xldmVsX2xpYnJhcnkKLQl8CWxvd19sZXZlbF9saWJyYXJ5Ci0JfAlmbG9hdGluZ19wb2ludF9zdXBwb3J0Ci0JfAlzdGF0ZW1lbnRfYW55d2hlcmUKLQl8CXZlcnNpb24KLSAgICAgICAgfAkgJzsnCi0JfAlUQVJHRVRfSyAnKCcgTkFNRSAnKScKLQkJeyBsYW5nX2FkZF90YXJnZXQoJDMpOyB9Ci0JfAlTRUFSQ0hfRElSICcoJyBmaWxlbmFtZSAnKScKLQkJeyBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoJDMsIGZhbHNlKTsgfQotCXwJT1VUUFVUICcoJyBmaWxlbmFtZSAnKScKLQkJeyBsYW5nX2FkZF9vdXRwdXQoJDMsIDEpOyB9Ci0gICAgICAgIHwJT1VUUFVUX0ZPUk1BVCAnKCcgTkFNRSAnKScKLQkJICB7IGxhbmdfYWRkX291dHB1dF9mb3JtYXQgKCQzLCAoY2hhciAqKSBOVUxMLAotCQkJCQkgICAgKGNoYXIgKikgTlVMTCwgMSk7IH0KLQl8CU9VVFBVVF9GT1JNQVQgJygnIE5BTUUgJywnIE5BTUUgJywnIE5BTUUgJyknCi0JCSAgeyBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0ICgkMywgJDUsICQ3LCAxKTsgfQotICAgICAgICB8CU9VVFBVVF9BUkNIICcoJyBOQU1FICcpJwotCQkgIHsgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCgkMyk7IH0KLQl8CUZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OCi0JCXsgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uID0gdHJ1ZSA7IH0KLQl8CUlOUFVUICcoJyBpbnB1dF9saXN0ICcpJwotCXwJR1JPVVAKLQkJICB7IGxhbmdfZW50ZXJfZ3JvdXAgKCk7IH0KLQkJICAgICcoJyBpbnB1dF9saXN0ICcpJwotCQkgIHsgbGFuZ19sZWF2ZV9ncm91cCAoKTsgfQotICAgICAJfAlNQVAgJygnIGZpbGVuYW1lICcpJwotCQl7IGxhbmdfYWRkX21hcCgkMyk7IH0KLQl8CUlOQ0xVREUgZmlsZW5hbWUgCi0JCXsgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlKCQyKTsgfSBpZmlsZV9saXN0IEVORAotCXwJTk9DUk9TU1JFRlMgJygnIG5vY3Jvc3NyZWZfbGlzdCAnKScKLQkJewotCQkgIGxhbmdfYWRkX25vY3Jvc3NyZWYgKCQzKTsKLQkJfQotCXwJRVhURVJOICcoJyBleHRlcm5fbmFtZV9saXN0ICcpJwotCTsKLQotaW5wdXRfbGlzdDoKLQkJTkFNRQotCQl7IGxhbmdfYWRkX2lucHV0X2ZpbGUoJDEsbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQl8CWlucHV0X2xpc3QgJywnIE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQzLGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlpbnB1dF9saXN0IE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQyLGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlMTkFNRQotCQl7IGxhbmdfYWRkX2lucHV0X2ZpbGUoJDEsbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCXwJaW5wdXRfbGlzdCAnLCcgTE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQzLGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQl8CWlucHV0X2xpc3QgTE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQyLGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQk7Ci0KLXNlY3Rpb25zOgotCQlTRUNUSU9OUyAneycgc2VjX29yX2dyb3VwX3AxICd9JwotCTsKLQotc2VjX29yX2dyb3VwX3AxOgotCQlzZWNfb3JfZ3JvdXBfcDEgc2VjdGlvbgotCXwJc2VjX29yX2dyb3VwX3AxIHN0YXRlbWVudF9hbnl3aGVyZQotCXwKLQk7Ci0KLXN0YXRlbWVudF9hbnl3aGVyZToKLQkJRU5UUlkgJygnIE5BTUUgJyknCi0JCXsgbGFuZ19hZGRfZW50cnkgKCQzLCBmYWxzZSk7IH0KLQl8CWFzc2lnbm1lbnQgZW5kCi0JOwotCi0vKiBUaGUgJyonIGFuZCAnPycgY2FzZXMgYXJlIHRoZXJlIGJlY2F1c2UgdGhlIGxleGVyIHJldHVybnMgdGhlbSBhcwotICAgc2VwYXJhdGUgdG9rZW5zIHJhdGhlciB0aGFuIGFzIE5BTUUuICAqLwotd2lsZGNhcmRfbmFtZToKLQkJTkFNRQotCQkJewotCQkJICAkJCA9ICQxOwotCQkJfQotCXwJJyonCi0JCQl7Ci0JCQkgICQkID0gIioiOwotCQkJfQotCXwJJz8nCi0JCQl7Ci0JCQkgICQkID0gIj8iOwotCQkJfQotCTsKLQotd2lsZGNhcmRfc3BlYzoKLQkJd2lsZGNhcmRfbmFtZQotCQkJewotCQkJICAkJC5uYW1lID0gJDE7Ci0JCQkgICQkLnNvcnRlZCA9IGZhbHNlOwotCQkJICAkJC5leGNsdWRlX25hbWUgPSBOVUxMOwotCQkJfQotCXwgCUVYQ0xVREVfRklMRSAnKCcgd2lsZGNhcmRfbmFtZSAnKScgd2lsZGNhcmRfbmFtZQotCQkJewotCQkJICAkJC5uYW1lID0gJDU7Ci0JCQkgICQkLnNvcnRlZCA9IGZhbHNlOwotCQkJICAkJC5leGNsdWRlX25hbWUgPSAkMzsKLQkJCX0KLQl8CVNPUlQgJygnIHdpbGRjYXJkX25hbWUgJyknCi0JCQl7Ci0JCQkgICQkLm5hbWUgPSAkMzsKLQkJCSAgJCQuc29ydGVkID0gdHJ1ZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lID0gTlVMTDsKLQkJCX0KLQl8CVNPUlQgJygnIEVYQ0xVREVfRklMRSAnKCcgd2lsZGNhcmRfbmFtZSAnKScgd2lsZGNhcmRfbmFtZSAnKScKLQkJCXsKLQkJCSAgJCQubmFtZSA9ICQ3OwotCQkJICAkJC5zb3J0ZWQgPSB0cnVlOwotCQkJICAkJC5leGNsdWRlX25hbWUgPSAkNTsKLQkJCX0KLQk7Ci0KLQotZmlsZV9OQU1FX2xpc3Q6Ci0JCXdpbGRjYXJkX3NwZWMKLQkJCXsKLQkJCSAgbGFuZ19hZGRfd2lsZCAoJDEubmFtZSwgJDEuc29ydGVkLAotCQkJCQkgY3VycmVudF9maWxlLm5hbWUsCi0JCQkJCSBjdXJyZW50X2ZpbGUuc29ydGVkLAotCQkJCQkgbGRncmFtX2hhZF9rZWVwLCAkMS5leGNsdWRlX25hbWUpOwotCQkJfQotCXwJZmlsZV9OQU1FX2xpc3Qgb3B0X2NvbW1hIHdpbGRjYXJkX3NwZWMKLQkJCXsKLQkJCSAgbGFuZ19hZGRfd2lsZCAoJDMubmFtZSwgJDMuc29ydGVkLAotCQkJCQkgY3VycmVudF9maWxlLm5hbWUsCi0JCQkJCSBjdXJyZW50X2ZpbGUuc29ydGVkLAotCQkJCQkgbGRncmFtX2hhZF9rZWVwLCAkMy5leGNsdWRlX25hbWUpOwotCQkJfQotCTsKLQotaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXA6Ci0JCU5BTUUKLQkJCXsKLQkJCSAgbGFuZ19hZGRfd2lsZCAoTlVMTCwgZmFsc2UsICQxLCBmYWxzZSwKLQkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgTlVMTCk7Ci0JCQl9Ci0gICAgICAgIHwJJ1snCi0JCQl7Ci0JCQkgIGN1cnJlbnRfZmlsZS5uYW1lID0gTlVMTDsKLQkJCSAgY3VycmVudF9maWxlLnNvcnRlZCA9IGZhbHNlOwotCQkJfQotCQlmaWxlX05BTUVfbGlzdCAnXScKLQl8CXdpbGRjYXJkX3NwZWMKLQkJCXsKLQkJCSAgY3VycmVudF9maWxlID0gJDE7Ci0JCQkgIC8qICcqJyBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICAqLwotCQkJICBpZiAoc3RyY21wIChjdXJyZW50X2ZpbGUubmFtZSwgIioiKSA9PSAwKQotCQkJICAgIGN1cnJlbnRfZmlsZS5uYW1lID0gTlVMTDsKLQkJCX0KLQkJJygnIGZpbGVfTkFNRV9saXN0ICcpJwotCTsKLQotaW5wdXRfc2VjdGlvbl9zcGVjOgotCQlpbnB1dF9zZWN0aW9uX3NwZWNfbm9fa2VlcAotCXwJS0VFUCAnKCcKLQkJCXsgbGRncmFtX2hhZF9rZWVwID0gdHJ1ZTsgfQotCQlpbnB1dF9zZWN0aW9uX3NwZWNfbm9fa2VlcCAnKScKLQkJCXsgbGRncmFtX2hhZF9rZWVwID0gZmFsc2U7IH0KLQk7Ci0KLXN0YXRlbWVudDoKLQkgIAlhc3NpZ25tZW50IGVuZAotCXwJQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0JCXsKLSAJCWxhbmdfYWRkX2F0dHJpYnV0ZShsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtKTsgCi0JICAgICAgCX0KLSAgICAgICAgfAknOycKLSAgICAgICAgfAlDT05TVFJVQ1RPUlMKLQkJewotIAkJCi0JCSAgbGFuZ19hZGRfYXR0cmlidXRlKGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtKTsgCi0JCX0KLQl8IFNPUlQgJygnIENPTlNUUlVDVE9SUyAnKScKLQkJewotCQkgIGNvbnN0cnVjdG9yc19zb3J0ZWQgPSB0cnVlOwotCQkgIGxhbmdfYWRkX2F0dHJpYnV0ZSAobGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW0pOwotCQl9Ci0JfCBpbnB1dF9zZWN0aW9uX3NwZWMKLSAgICAgICAgfCBsZW5ndGggJygnIG11c3RiZV9leHAgJyknCi0gICAgICAgIAkgICAgICAgIHsKLQkJCWxhbmdfYWRkX2RhdGEoKGludCkgJDEsJDMpOwotCQkJfQotICAKLQl8IEZJTEwgJygnIG11c3RiZV9leHAgJyknCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX2ZpbGwKLQkJCSAgICAoZXhwX2dldF92YWx1ZV9pbnQoJDMsCi0JCQkJCSAgICAgICAwLAotCQkJCQkgICAgICAgImZpbGwgdmFsdWUiLAotCQkJCQkgICAgICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKSk7Ci0JCQl9Ci0JOwotCi1zdGF0ZW1lbnRfbGlzdDoKLQkJc3RhdGVtZW50X2xpc3Qgc3RhdGVtZW50Ci0gIAl8ICAJc3RhdGVtZW50Ci0JOwotICAKLXN0YXRlbWVudF9saXN0X29wdDoKLQkJLyogZW1wdHkgKi8KLQl8CXN0YXRlbWVudF9saXN0Ci0JOwotCi1sZW5ndGg6Ci0JCVFVQUQKLQkJCXsgJCQgPSAkMTsgfQotCXwJU1FVQUQKLQkJCXsgJCQgPSAkMTsgfQotCXwJTE9ORwotCQkJeyAkJCA9ICQxOyB9Ci0JfCAJU0hPUlQKLQkJCXsgJCQgPSAkMTsgfQotCXwJQllURQotCQkJeyAkJCA9ICQxOyB9Ci0JOwotCi1maWxsX29wdDoKLSAgICAgICAgICAnPScgbXVzdGJlX2V4cAotCQl7Ci0JCSAgJCQgPQkgZXhwX2dldF92YWx1ZV9pbnQoJDIsCi0JCQkJCSAgIDAsCi0JCQkJCSAgICJmaWxsIHZhbHVlIiwKLQkJCQkJICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLQkJfQotCXwgCXsgJCQgPSAwOyB9Ci0JOwotCi0JCQotCi1hc3NpZ25fb3A6Ci0JCVBMVVNFUQotCQkJeyAkJCA9ICcrJzsgfQotCXwJTUlOVVNFUQotCQkJeyAkJCA9ICctJzsgfQotCXwgCU1VTFRFUQotCQkJeyAkJCA9ICcqJzsgfQotCXwgCURJVkVRCi0JCQl7ICQkID0gJy8nOyB9Ci0JfCAJTFNISUZURVEKLQkJCXsgJCQgPSBMU0hJRlQ7IH0KLQl8IAlSU0hJRlRFUQotCQkJeyAkJCA9IFJTSElGVDsgfQotCXwgCUFOREVRCi0JCQl7ICQkID0gJyYnOyB9Ci0JfCAJT1JFUQotCQkJeyAkJCA9ICd8JzsgfQotCi0JOwotCi1lbmQ6CSc7JyB8ICcsJwotCTsKLQotCi1hc3NpZ25tZW50OgotCQlOQU1FICc9JyBtdXN0YmVfZXhwCi0JCXsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCQyLCAkMSwgJDMpKTsKLQkJfQotCXwJTkFNRSBhc3NpZ25fb3AgbXVzdGJlX2V4cAotCQl7Ci0JCSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICQxLAotCQkJCQkJICBleHBfYmlub3AgKCQyLAotCQkJCQkJCSAgICAgZXhwX25hbWVvcCAoTkFNRSwKLQkJCQkJCQkJCSAkMSksCi0JCQkJCQkJICAgICAkMykpKTsKLQkJfQotCXwJUFJPVklERSAnKCcgTkFNRSAnPScgbXVzdGJlX2V4cCAnKScKLQkJewotCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9wcm92aWRlICgkMywgJDUpKTsKLQkJfQotCTsKLQotCi1vcHRfY29tbWE6Ci0JCScsJwl8CTsKLQotCi1tZW1vcnk6Ci0JCU1FTU9SWSAneycgbWVtb3J5X3NwZWMgbWVtb3J5X3NwZWNfbGlzdCAnfScKLQk7Ci0KLW1lbW9yeV9zcGVjX2xpc3Q6Ci0JCW1lbW9yeV9zcGVjX2xpc3QgbWVtb3J5X3NwZWMKLQl8CW1lbW9yeV9zcGVjX2xpc3QgJywnIG1lbW9yeV9zcGVjCi0JfAotCTsKLQotCi1tZW1vcnlfc3BlYzogCQlOQU1FCi0JCQl7IHJlZ2lvbiA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAoJDEpOyB9Ci0JCWF0dHJpYnV0ZXNfb3B0ICc6JwotCQlvcmlnaW5fc3BlYyBvcHRfY29tbWEgbGVuZ3RoX3NwZWMKLQotCTsgb3JpZ2luX3NwZWM6Ci0JT1JJR0lOICc9JyBtdXN0YmVfZXhwCi0JCXsgcmVnaW9uLT5jdXJyZW50ID0KLQkJIHJlZ2lvbi0+b3JpZ2luID0KLQkJIGV4cF9nZXRfdm1hKCQzLCAwTCwib3JpZ2luIiwgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLX0KLQk7Ci0KLWxlbmd0aF9zcGVjOgotICAgICAgICAgICAgIExFTkdUSCAnPScgbXVzdGJlX2V4cAotICAgICAgICAgICAgICAgeyByZWdpb24tPmxlbmd0aCA9IGV4cF9nZXRfdm1hKCQzLAotCQkJCQkgICAgICAgfigoYmZkX3ZtYSkwKSwKLQkJCQkJICAgICAgICJsZW5ndGgiLAotCQkJCQkgICAgICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLQkJfQotCTsKLQotYXR0cmlidXRlc19vcHQ6Ci0JCS8qIGVtcHR5ICovCi0JCSAgeyAvKiBkdW1teSBhY3Rpb24gdG8gYXZvaWQgYmlzb24gMS4yNSBlcnJvciBtZXNzYWdlICovIH0KLQl8CScoJyBhdHRyaWJ1dGVzX2xpc3QgJyknCi0JOwotCi1hdHRyaWJ1dGVzX2xpc3Q6Ci0JCWF0dHJpYnV0ZXNfc3RyaW5nCi0JfAlhdHRyaWJ1dGVzX2xpc3QgYXR0cmlidXRlc19zdHJpbmcKLQk7Ci0KLWF0dHJpYnV0ZXNfc3RyaW5nOgotCQlOQU1FCi0JCSAgeyBsYW5nX3NldF9mbGFncyAocmVnaW9uLCAkMSwgMCk7IH0KLQl8CSchJyBOQU1FCi0JCSAgeyBsYW5nX3NldF9mbGFncyAocmVnaW9uLCAkMiwgMSk7IH0KLQk7Ci0KLXN0YXJ0dXA6Ci0JU1RBUlRVUCAnKCcgZmlsZW5hbWUgJyknCi0JCXsgbGFuZ19zdGFydHVwKCQzKTsgfQotCTsKLQotaGlnaF9sZXZlbF9saWJyYXJ5OgotCQlITEwgJygnIGhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3QgJyknCi0JfAlITEwgJygnICcpJwotCQkJeyBsZGVtdWxfaGxsKChjaGFyICopTlVMTCk7IH0KLQk7Ci0KLWhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Q6Ci0JCWhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Qgb3B0X2NvbW1hIGZpbGVuYW1lCi0JCQl7IGxkZW11bF9obGwoJDMpOyB9Ci0JfAlmaWxlbmFtZQotCQkJeyBsZGVtdWxfaGxsKCQxKTsgfQotCi0JOwotCi1sb3dfbGV2ZWxfbGlicmFyeToKLQlTWVNMSUIgJygnIGxvd19sZXZlbF9saWJyYXJ5X05BTUVfbGlzdCAnKScKLQk7IGxvd19sZXZlbF9saWJyYXJ5X05BTUVfbGlzdDoKLQkJbG93X2xldmVsX2xpYnJhcnlfTkFNRV9saXN0IG9wdF9jb21tYSBmaWxlbmFtZQotCQkJeyBsZGVtdWxfc3lzbGliKCQzKTsgfQotCXwKLQk7Ci0KLWZsb2F0aW5nX3BvaW50X3N1cHBvcnQ6Ci0JCUZMT0FUCi0JCQl7IGxhbmdfZmxvYXQodHJ1ZSk7IH0KLQl8CU5PRkxPQVQKLQkJCXsgbGFuZ19mbG9hdChmYWxzZSk7IH0KLQk7Ci0JCQotbm9jcm9zc3JlZl9saXN0OgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBOVUxMOwotCQl9Ci0JfAlOQU1FIG5vY3Jvc3NyZWZfbGlzdAotCQl7Ci0JCSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbjsKLQotCQkgIG4gPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCQkgIG4tPm5hbWUgPSAkMTsKLQkJICBuLT5uZXh0ID0gJDI7Ci0JCSAgJCQgPSBuOwotCQl9Ci0JfAlOQU1FICcsJyBub2Nyb3NzcmVmX2xpc3QKLQkJewotCQkgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm47Ci0KLQkJICBuID0gKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLQkJICBuLT5uYW1lID0gJDE7Ci0JCSAgbi0+bmV4dCA9ICQzOwotCQkgICQkID0gbjsKLQkJfQotCTsKLQotbXVzdGJlX2V4cDoJCSB7IGxkbGV4X2V4cHJlc3Npb24oKTsgfQotCQlleHAKLQkJCSB7IGxkbGV4X3BvcHN0YXRlKCk7ICQkPSQyO30KLQk7Ci0KLWV4cAk6Ci0JCSctJyBleHAgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSBleHBfdW5vcCgnLScsICQyKTsgfQotCXwJJygnIGV4cCAnKScKLQkJCXsgJCQgPSAkMjsgfQotCXwJTkVYVCAnKCcgZXhwICcpJyAlcHJlYyBVTkFSWQotCQkJeyAkJCA9IGV4cF91bm9wKChpbnQpICQxLCQzKTsgfQotCXwJJyEnIGV4cCAlcHJlYyBVTkFSWQotCQkJeyAkJCA9IGV4cF91bm9wKCchJywgJDIpOyB9Ci0JfAknKycgZXhwICVwcmVjIFVOQVJZCi0JCQl7ICQkID0gJDI7IH0KLQl8CSd+JyBleHAgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSBleHBfdW5vcCgnficsICQyKTt9Ci0KLQl8CWV4cCAnKicgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCcqJywgJDEsICQzKTsgfQotCXwJZXhwICcvJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJy8nLCAkMSwgJDMpOyB9Ci0JfAlleHAgJyUnIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnJScsICQxLCAkMyk7IH0KLQl8CWV4cCAnKycgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCcrJywgJDEsICQzKTsgfQotCXwJZXhwICctJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJy0nICwgJDEsICQzKTsgfQotCXwJZXhwIExTSElGVCBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoTFNISUZUICwgJDEsICQzKTsgfQotCXwJZXhwIFJTSElGVCBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoUlNISUZUICwgJDEsICQzKTsgfQotCXwJZXhwIEVRIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChFUSAsICQxLCAkMyk7IH0KLQl8CWV4cCBORSBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoTkUgLCAkMSwgJDMpOyB9Ci0JfAlleHAgTEUgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKExFICwgJDEsICQzKTsgfQotICAJfAlleHAgR0UgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKEdFICwgJDEsICQzKTsgfQotCXwJZXhwICc8JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJzwnICwgJDEsICQzKTsgfQotCXwJZXhwICc+JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJz4nICwgJDEsICQzKTsgfQotCXwJZXhwICcmJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJyYnICwgJDEsICQzKTsgfQotCXwJZXhwICdeJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJ14nICwgJDEsICQzKTsgfQotCXwJZXhwICd8JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJ3wnICwgJDEsICQzKTsgfQotCXwJZXhwICc/JyBleHAgJzonIGV4cAotCQkJeyAkJCA9IGV4cF90cmlub3AoJz8nICwgJDEsICQzLCAkNSk7IH0KLQl8CWV4cCBBTkRBTkQgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKEFOREFORCAsICQxLCAkMyk7IH0KLQl8CWV4cCBPUk9SIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChPUk9SICwgJDEsICQzKTsgfQotCXwJREVGSU5FRCAnKCcgTkFNRSAnKScKLQkJCXsgJCQgPSBleHBfbmFtZW9wKERFRklORUQsICQzKTsgfQotCXwJSU5UCi0JCQl7ICQkID0gZXhwX2ludG9wKCQxKTsgfQotICAgICAgICB8CVNJWkVPRl9IRUFERVJTCi0JCQl7ICQkID0gZXhwX25hbWVvcChTSVpFT0ZfSEVBREVSUywwKTsgfQotCi0JfAlTSVpFT0YgJygnIE5BTUUgJyknCi0JCQl7ICQkID0gZXhwX25hbWVvcChTSVpFT0YsJDMpOyB9Ci0JfAlBRERSICcoJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoQUREUiwkMyk7IH0KLQl8CUxPQURBRERSICcoJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoTE9BREFERFIsJDMpOyB9Ci0JfAlBQlNPTFVURSAnKCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF91bm9wKEFCU09MVVRFLCAkMyk7IH0KLQl8CUFMSUdOX0sgJygnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfdW5vcChBTElHTl9LLCQzKTsgfQotCXwJQkxPQ0sgJygnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfdW5vcChBTElHTl9LLCQzKTsgfQotCXwJTkFNRQotCQkJeyAkJCA9IGV4cF9uYW1lb3AoTkFNRSwkMSk7IH0KLQl8CU1BWF9LICcoJyBleHAgJywnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfYmlub3AgKE1BWF9LLCAkMywgJDUgKTsgfQotCXwJTUlOX0sgJygnIGV4cCAnLCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF9iaW5vcCAoTUlOX0ssICQzLCAkNSApOyB9Ci0JfAlBU1NFUlRfSyAnKCcgZXhwICcsJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9hc3NlcnQgKCQzLCAkNSk7IH0KLQk7Ci0KLQotb3B0X2F0OgotCQlBVCAnKCcgZXhwICcpJyB7ICQkID0gJDM7IH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotCi1zZWN0aW9uOglOQU1FIAkJeyBsZGxleF9leHByZXNzaW9uKCk7IH0KLQkJb3B0X2V4cF93aXRoX3R5cGUgCi0JCW9wdF9hdCAgIAl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9zY3JpcHQgKCk7IH0KLQkJJ3snCi0JCQl7Ci0JCQkgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KCQxLCAkMywKLQkJCQkJCQkgICAgICBzZWN0eXBlLAotCQkJCQkJCSAgICAgIDAsIDAsIDAsICQ0KTsKLQkJCX0KLQkJc3RhdGVtZW50X2xpc3Rfb3B0IAkKLSAJCSd9JyB7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCW1lbXNwZWNfb3B0IHBoZHJfb3B0IGZpbGxfb3B0Ci0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoJDEzLCAkMTEsICQxMik7Ci0JCX0KLQkJb3B0X2NvbW1hCi0JfAlPVkVSTEFZCi0JCQl7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KLQkJb3B0X2V4cF93aXRob3V0X3R5cGUgb3B0X25vY3Jvc3NyZWZzIG9wdF9hdAotCQkJeyBsZGxleF9wb3BzdGF0ZSAoKTsgbGRsZXhfc2NyaXB0ICgpOyB9Ci0JCSd7JyAKLQkJCXsKLQkJCSAgbGFuZ19lbnRlcl9vdmVybGF5ICgkMywgJDUsIChpbnQpICQ0KTsKLQkJCX0KLQkJb3ZlcmxheV9zZWN0aW9uCi0JCSd9JwotCQkJeyBsZGxleF9wb3BzdGF0ZSAoKTsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQltZW1zcGVjX29wdCBwaGRyX29wdCBmaWxsX29wdAotCQkJewotCQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJCSAgbGFuZ19sZWF2ZV9vdmVybGF5ICgkMTQsICQxMiwgJDEzKTsKLQkJCX0KLQkJb3B0X2NvbW1hCi0JfAkvKiBUaGUgR1JPVVAgY2FzZSBpcyBqdXN0IGVub3VnaCB0byBzdXBwb3J0IHRoZSBnY2MKLQkJICAgc3ZyMy5pZmlsZSBzY3JpcHQuICBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZnVsbAotCQkgICBzdXBwb3J0LiAgSSdtIG5vdCBldmVuIHN1cmUgd2hhdCBHUk9VUCBpcyBzdXBwb3NlZAotCQkgICB0byBtZWFuLiAgKi8KLQkJR1JPVVAgeyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCW9wdF9leHBfd2l0aF90eXBlCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgIi4iLCAkMykpOwotCQl9Ci0JCSd7JyBzZWNfb3JfZ3JvdXBfcDEgJ30nCi0JOwotCi10eXBlOgotCSAgIE5PTE9BRCAgeyBzZWN0eXBlID0gbm9sb2FkX3NlY3Rpb247IH0KLQl8ICBEU0VDVCAgIHsgc2VjdHlwZSA9IGRzZWN0X3NlY3Rpb247IH0KLQl8ICBDT1BZICAgIHsgc2VjdHlwZSA9IGNvcHlfc2VjdGlvbjsgfQotCXwgIElORk8gICAgeyBzZWN0eXBlID0gaW5mb19zZWN0aW9uOyB9Ci0JfCAgT1ZFUkxBWSB7IHNlY3R5cGUgPSBvdmVybGF5X3NlY3Rpb247IH0KLQk7Ci0KLWF0eXBlOgotCSAJJygnIHR5cGUgJyknCi0gIAl8IAkvKiBFTVBUWSAqLyB7IHNlY3R5cGUgPSBub3JtYWxfc2VjdGlvbjsgfQotICAJfCAJJygnICcpJyB7IHNlY3R5cGUgPSBub3JtYWxfc2VjdGlvbjsgfQotCTsKLQotb3B0X2V4cF93aXRoX3R5cGU6Ci0JCWV4cCBhdHlwZSAnOicJCXsgJCQgPSAkMTsgfQotCXwJYXR5cGUgJzonCQl7ICQkID0gKGV0cmVlX3R5cGUgKilOVUxMOyAgfQotCXwJLyogVGhlIEJJTkQgY2FzZXMgYXJlIHRvIHN1cHBvcnQgdGhlIGdjYyBzdnIzLmlmaWxlCi0JCSAgIHNjcmlwdC4gIFRoZXkgYXJlbid0IGludGVuZGVkIHRvIGltcGxlbWVudCBmdWxsCi0JCSAgIHN1cHBvcnQgZm9yIHRoZSBCSU5EIGtleXdvcmQuICBJJ20gbm90IGV2ZW4gc3VyZQotCQkgICB3aGF0IEJJTkQgaXMgc3VwcG9zZWQgdG8gbWVhbi4gICovCi0JCUJJTkQgJygnIGV4cCAnKScgYXR5cGUgJzonIHsgJCQgPSAkMzsgfQotCXwJQklORCAnKCcgZXhwICcpJyBCTE9DSyAnKCcgZXhwICcpJyBhdHlwZSAnOicKLQkJeyAkJCA9ICQzOyB9Ci0JOwotCi1vcHRfZXhwX3dpdGhvdXRfdHlwZToKLQkJZXhwICc6JwkJeyAkJCA9ICQxOyB9Ci0JfAknOicJCXsgJCQgPSAoZXRyZWVfdHlwZSAqKSBOVUxMOyAgfQotCTsKLQotb3B0X25vY3Jvc3NyZWZzOgotCQkvKiBlbXB0eSAqLwotCQkJeyAkJCA9IDA7IH0KLQl8CU5PQ1JPU1NSRUZTCi0JCQl7ICQkID0gMTsgfQotCTsKLQotbWVtc3BlY19vcHQ6Ci0JCSc+JyBOQU1FCi0JCXsgJCQgPSAkMjsgfQotCXwJeyAkJCA9ICIqZGVmYXVsdCoiOyB9Ci0JOwotCi1waGRyX29wdDoKLQkJLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gTlVMTDsKLQkJfQotCXwJcGhkcl9vcHQgJzonIE5BTUUKLQkJewotCQkgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqbjsKLQotCQkgIG4gPSAoKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKQotCQkgICAgICAgeG1hbGxvYyAoc2l6ZW9mICpuKSk7Ci0JCSAgbi0+bmFtZSA9ICQzOwotCQkgIG4tPnVzZWQgPSBmYWxzZTsKLQkJICBuLT5uZXh0ID0gJDE7Ci0JCSAgJCQgPSBuOwotCQl9Ci0JOwotCi1vdmVybGF5X3NlY3Rpb246Ci0JCS8qIGVtcHR5ICovCi0JfAlvdmVybGF5X3NlY3Rpb24KLQkJTkFNRQotCQkJewotCQkJICBsZGxleF9zY3JpcHQgKCk7Ci0JCQkgIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uICgkMik7Ci0JCQl9Ci0JCSd7JyBzdGF0ZW1lbnRfbGlzdF9vcHQgJ30nCi0JCQl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCXBoZHJfb3B0IGZpbGxfb3B0Ci0JCQl7Ci0JCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkJICBsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiAoJDksICQ4KTsKLQkJCX0KLQkJb3B0X2NvbW1hCi0JOwotCi1waGRyczoKLQkJUEhEUlMgJ3snIHBoZHJfbGlzdCAnfScKLQk7Ci0KLXBoZHJfbGlzdDoKLQkJLyogZW1wdHkgKi8KLQl8CXBoZHJfbGlzdCBwaGRyCi0JOwotCi1waGRyOgotCQlOQU1FIHsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQkgIHBoZHJfdHlwZSBwaGRyX3F1YWxpZmllcnMgeyBsZGxleF9wb3BzdGF0ZSAoKTsgfQotCQkgICc7JwotCQl7Ci0JCSAgbGFuZ19uZXdfcGhkciAoJDEsICQzLCAkNC5maWxlaGRyLCAkNC5waGRycywgJDQuYXQsCi0JCQkJICQ0LmZsYWdzKTsKLQkJfQotCTsKLQotcGhkcl90eXBlOgotCQlleHAKLQkJewotCQkgICQkID0gJDE7Ci0KLQkJICBpZiAoJDEtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9uYW1lCi0JCSAgICAgICYmICQxLT50eXBlLm5vZGVfY29kZSA9PSBOQU1FKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpzOwotCQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkJICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGRyX3R5cGVzW10gPQotCQkJewotCQkJICAiUFRfTlVMTCIsICJQVF9MT0FEIiwgIlBUX0RZTkFNSUMiLAotCQkJICAiUFRfSU5URVJQIiwgIlBUX05PVEUiLCAiUFRfU0hMSUIiLAotCQkJICAiUFRfUEhEUiIKLQkJCX07Ci0KLQkJICAgICAgcyA9ICQxLT5uYW1lLm5hbWU7Ci0JCSAgICAgIGZvciAoaSA9IDA7Ci0JCQkgICBpIDwgc2l6ZW9mIHBoZHJfdHlwZXMgLyBzaXplb2YgcGhkcl90eXBlc1swXTsKLQkJCSAgIGkrKykKLQkJCWlmIChzdHJjbXAgKHMsIHBoZHJfdHlwZXNbaV0pID09IDApCi0JCQkgIHsKLQkJCSAgICAkJCA9IGV4cF9pbnRvcCAoaSk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkJICAgIH0KLQkJfQotCTsKLQotcGhkcl9xdWFsaWZpZXJzOgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgbWVtc2V0ICgmJCQsIDAsIHNpemVvZiAoc3RydWN0IHBoZHJfaW5mbykpOwotCQl9Ci0JfAlOQU1FIHBoZHJfdmFsIHBoZHJfcXVhbGlmaWVycwotCQl7Ci0JCSAgJCQgPSAkMzsKLQkJICBpZiAoc3RyY21wICgkMSwgIkZJTEVIRFIiKSA9PSAwICYmICQyID09IE5VTEwpCi0JCSAgICAkJC5maWxlaGRyID0gdHJ1ZTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKCQxLCAiUEhEUlMiKSA9PSAwICYmICQyID09IE5VTEwpCi0JCSAgICAkJC5waGRycyA9IHRydWU7Ci0JCSAgZWxzZSBpZiAoc3RyY21wICgkMSwgIkZMQUdTIikgPT0gMCAmJiAkMiAhPSBOVUxMKQotCQkgICAgJCQuZmxhZ3MgPSAkMjsKLQkJICBlbHNlCi0JCSAgICBlaW5mbyAoXygiJVglUDolUzogUEhEUlMgc3ludGF4IGVycm9yIGF0IGAlcydcbiIpLCAkMSk7Ci0JCX0KLQl8CUFUICcoJyBleHAgJyknIHBoZHJfcXVhbGlmaWVycwotCQl7Ci0JCSAgJCQgPSAkNTsKLQkJICAkJC5hdCA9ICQzOwotCQl9Ci0JOwotCi1waGRyX3ZhbDoKLQkJLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gTlVMTDsKLQkJfQotCXwgJygnIGV4cCAnKScKLQkJewotCQkgICQkID0gJDI7Ci0JCX0KLQk7Ci0KLS8qIFRoaXMgc3ludGF4IGlzIHVzZWQgd2l0aGluIGFuIGV4dGVybmFsIHZlcnNpb24gc2NyaXB0IGZpbGUuICAqLwotCi12ZXJzaW9uX3NjcmlwdF9maWxlOgotCQl7Ci0JCSAgbGRsZXhfdmVyc2lvbl9maWxlICgpOwotCQkgIFBVU0hfRVJST1IgKF8oIlZFUlNJT04gc2NyaXB0IikpOwotCQl9Ci0JCXZlcnNfbm9kZXMKLQkJewotCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkgIFBPUF9FUlJPUiAoKTsKLQkJfQotCTsKLQotLyogVGhpcyBpcyB1c2VkIHdpdGhpbiBhIG5vcm1hbCBsaW5rZXIgc2NyaXB0IGZpbGUuICAqLwotCi12ZXJzaW9uOgotCQl7Ci0JCSAgbGRsZXhfdmVyc2lvbl9zY3JpcHQgKCk7Ci0JCX0KLQkJVkVSU0lPTksgJ3snIHZlcnNfbm9kZXMgJ30nCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJfQotCTsKLQotdmVyc19ub2RlczoKLQkJdmVyc19ub2RlCi0JfAl2ZXJzX25vZGVzIHZlcnNfbm9kZQotCTsKLQotdmVyc19ub2RlOgotCQlWRVJTX1RBRyAneycgdmVyc190YWcgJ30nICc7JwotCQl7Ci0JCSAgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKCQxLCAkMywgTlVMTCk7Ci0JCX0KLQl8CVZFUlNfVEFHICd7JyB2ZXJzX3RhZyAnfScgdmVyZGVwICc7JwotCQl7Ci0JCSAgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKCQxLCAkMywgJDUpOwotCQl9Ci0JOwotCi12ZXJkZXA6Ci0JCVZFUlNfVEFHCi0JCXsKLQkJICAkJCA9IGxhbmdfYWRkX3ZlcnNfZGVwZW5kIChOVUxMLCAkMSk7Ci0JCX0KLQl8CXZlcmRlcCBWRVJTX1RBRwotCQl7Ci0JCSAgJCQgPSBsYW5nX2FkZF92ZXJzX2RlcGVuZCAoJDEsICQyKTsKLQkJfQotCTsKLQotdmVyc190YWc6Ci0JCS8qIGVtcHR5ICovCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoTlVMTCwgTlVMTCk7Ci0JCX0KLQl8CXZlcnNfZGVmbnMgJzsnCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoJDEsIE5VTEwpOwotCQl9Ci0JfAlHTE9CQUwgJzonIHZlcnNfZGVmbnMgJzsnCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoJDMsIE5VTEwpOwotCQl9Ci0JfAlMT0NBTCAnOicgdmVyc19kZWZucyAnOycKLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlIChOVUxMLCAkMyk7Ci0JCX0KLQl8CUdMT0JBTCAnOicgdmVyc19kZWZucyAnOycgTE9DQUwgJzonIHZlcnNfZGVmbnMgJzsnCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoJDMsICQ3KTsKLQkJfQotCTsKLQotdmVyc19kZWZuczoKLQkJVkVSU19JREVOVElGSUVSCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKE5VTEwsICQxLCBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcpOwotCQl9Ci0JfAl2ZXJzX2RlZm5zICc7JyBWRVJTX0lERU5USUZJRVIKLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19yZWdleCAoJDEsICQzLCBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcpOwotCQl9Ci0JfAlFWFRFUk4gTkFNRSAneycKLQkJCXsKLQkJCSAgJDxuYW1lPiQgPSBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmc7Ci0JCQkgIGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyA9ICQyOwotCQkJfQotCQl2ZXJzX2RlZm5zICd9JwotCQkJewotCQkJICBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcgPSAkPG5hbWU+NDsKLQkJCX0KLQk7Ci0KLSUlCi12b2lkCi15eWVycm9yKGFyZykgCi0gICAgIGNvbnN0IGNoYXIgKmFyZzsKLXsgCi0gIGlmIChsZGZpbGVfYXNzdW1lZF9zY3JpcHQpCi0gICAgZWluZm8gKF8oIiVQOiVzOiBmaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZDsgdHJlYXRpbmcgYXMgbGlua2VyIHNjcmlwdFxuIiksCi0JICAgbGRmaWxlX2lucHV0X2ZpbGVuYW1lKTsKLSAgaWYgKGVycm9yX2luZGV4ID4gMCAmJiBlcnJvcl9pbmRleCA8IEVSUk9SX05BTUVfTUFYKQotICAgICBlaW5mbyAoIiVQJUY6JVM6ICVzIGluICVzXG4iLCBhcmcsIGVycm9yX25hbWVzW2Vycm9yX2luZGV4LTFdKTsKLSAgZWxzZQotICAgICBlaW5mbyAoIiVQJUY6JVM6ICVzXG4iLCBhcmcpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRpbnQudGV4aW5mbyBiL2xkL2xkaW50LnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWE3ODguLjAwMDAwMDAKLS0tIGEvbGQvbGRpbnQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGxkaW50LmluZm8KLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogTGQtSW50ZXJuYWxzOiAobGRpbnQpLglUaGUgR05VIGxpbmtlciBpbnRlcm5hbHMuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEdOVSBsaW5rZXIgbGQuCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IG9yIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIChmb3Igd2hpY2ggcHVycG9zZSB0aGlzIHRleHQgbWF5IGJlCi1yZWdhcmRlZCBhcyBhIHByb2dyYW0gaW4gdGhlIGxhbmd1YWdlIFRlWCkuCi1AZW5kIGlmaW5mbwotCi1AaWZ0ZXgKLUBmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9mZgotQHNldHRpdGxlIEdOVSBMaW5rZXIgSW50ZXJuYWxzCi1AdGl0bGVwYWdlCi1AdGl0bGV7QSBndWlkZSB0byB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgbGlua2VyfQotQGF1dGhvciBQZXIgQm90aG5lciwgU3RldmUgQ2hhbWJlcmxhaW4sIElhbiBMYW5jZSBUYXlsb3IsIERKIERlbG9yaWUKLUBhdXRob3IgQ3lnbnVzIFN1cHBvcnQKLUBwYWdlCi0KLUB0ZXgKLVxkZWZcJCMxJHt7IzF9fSAgJSBLbHVnZTogY29sbGVjdCBSQ1MgcmV2aXNpb24gaW5mbyB3aXRob3V0ICQuLi4kCi1ceGRlZlxtYW52ZXJze1wkUmV2aXNpb24kfSAgJSBGb3IgdXNlIGluIGhlYWRlcnMsIGZvb3RlcnMgdG9vCi17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi1caGZpbGwgXG1hbnZlcnNccGFyCi1caGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCi19Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGVuZCB0aXRsZXBhZ2UKLUBlbmQgaWZ0ZXgKLQotQG5vZGUgVG9wCi1AdG9wCi0KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGludGVybmFscyBvZiB0aGUgR05VIGxpbmtlciBAY29kZXtsZH0uICBJdCBpcyBhCi1jb2xsZWN0aW9uIG9mIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24gd2l0aCBsaXR0bGUgZm9ybSBhdCB0aGlzIHBvaW50LgotTW9zdGx5LCBpdCBpcyBhIHJlcG9zaXRvcnkgaW50byB3aGljaCB5b3UgY2FuIHB1dCBpbmZvcm1hdGlvbiBhYm91dAotR05VIEBjb2Rle2xkfSBhcyB5b3UgZGlzY292ZXIgaXQgKG9yIGFzIHlvdSBkZXNpZ24gY2hhbmdlcyB0byBAY29kZXtsZH0pLgotCi1AbWVudQotKiBSRUFETUU6OgkJCVRoZSBSRUFETUUgRmlsZQotKiBFbXVsYXRpb25zOjoJCQlIb3cgbGlua2VyIGVtdWxhdGlvbnMgYXJlIGdlbmVyYXRlZAotKiBFbXVsYXRpb24gV2Fsa3Rocm91Z2g6OglBIFdhbGt0aHJvdWdoIG9mIGEgVHlwaWNhbCBFbXVsYXRpb24KLUBlbmQgbWVudQotCi1Abm9kZSBSRUFETUUKLUBjaGFwdGVyIFRoZSBAZmlsZXtSRUFETUV9IEZpbGUKLQotQ2hlY2sgdGhlIEBmaWxle1JFQURNRX0gZmlsZTsgaXQgb2Z0ZW4gaGFzIHVzZWZ1bCBpbmZvcm1hdGlvbiB0aGF0IGRvZXMgbm90Ci1hcHBlYXIgYW55d2hlcmUgZWxzZSBpbiB0aGUgZGlyZWN0b3J5LgotCi1Abm9kZSBFbXVsYXRpb25zCi1AY2hhcHRlciBIb3cgbGlua2VyIGVtdWxhdGlvbnMgYXJlIGdlbmVyYXRlZAotCi1FYWNoIGxpbmtlciB0YXJnZXQgaGFzIGFuIEBkZm57ZW11bGF0aW9ufS4gIFRoZSBlbXVsYXRpb24gaW5jbHVkZXMgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHQsIGFuZCBjZXJ0YWluIGVtdWxhdGlvbnMgYWxzbyBtb2RpZnkgY2VydGFpbiB0eXBlcwotb2YgbGlua2VyIGJlaGF2aW91ci4KLQotRW11bGF0aW9ucyBhcmUgY3JlYXRlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MgYnkgdGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0uCi0KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgc3RhcnRzIGJ5IHJlYWRpbmcgYSBmaWxlIGluIHRoZQotQGZpbGV7ZW11bHBhcmFtc30gZGlyZWN0b3J5LiAgVGhpcyBpcyBhIHNoZWxsIHNjcmlwdCB3aGljaCBzZXRzIHZhcmlvdXMKLXNoZWxsIHZhcmlhYmxlcyB1c2VkIGJ5IEBmaWxle2dlbnNjcmlwdHMuc2h9IGFuZCB0aGUgb3RoZXIgc2hlbGwgc2NyaXB0cwotaXQgaW52b2tlcy4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIGludm9rZSBhIHNoZWxsIHNjcmlwdCBpbiB0aGUKLUBmaWxle3NjcmlwdHRlbXBsfSBkaXJlY3RvcnkgaW4gb3JkZXIgdG8gY3JlYXRlIGRlZmF1bHQgbGlua2VyIHNjcmlwdHMKLXdyaXR0ZW4gaW4gdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLiAgVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQKLXdpbGwgYmUgaW52b2tlZCA1IChvciwgaW4gc29tZSBjYXNlcywgNikgdGltZXMsIHdpdGggZGlmZmVyZW50Ci1hc3NpZ25tZW50cyB0byBzaGVsbCB2YXJpYWJsZXMsIHRvIGNyZWF0ZSBkaWZmZXJlbnQgZGVmYXVsdCBzY3JpcHRzLgotVGhlIGNob2ljZSBvZiBzY3JpcHQgaXMgbWFkZSBiYXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLUFmdGVyIGNyZWF0aW5nIHRoZSBzY3JpcHRzLCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsIGludm9rZSB5ZXQgYW5vdGhlcgotc2hlbGwgc2NyaXB0LCB0aGlzIHRpbWUgaW4gdGhlIEBmaWxle2VtdWx0ZW1wbH0gZGlyZWN0b3J5LiAgVGhhdCBzaGVsbAotc2NyaXB0IHdpbGwgY3JlYXRlIHRoZSBlbXVsYXRpb24gc291cmNlIGZpbGUsIHdoaWNoIGNvbnRhaW5zIEMgY29kZS4KLVRoaXMgQyBjb2RlIHBlcm1pdHMgdGhlIGxpbmtlciBlbXVsYXRpb24gdG8gb3ZlcnJpZGUgdmFyaW91cyBsaW5rZXIKLWJlaGF2aW91cnMuICBNb3N0IHRhcmdldHMgdXNlIHRoZSBnZW5lcmljIGVtdWxhdGlvbiBjb2RlLCB3aGljaCBpcyBpbgotQGZpbGV7ZW11bHRlbXBsL2dlbmVyaWMuZW19LgotCi1UbyBzdW1tYXJpemUsIEBmaWxle2dlbnNjcmlwdHMuc2h9IHJlYWRzIHRocmVlIHNoZWxsIHNjcmlwdHM6IGFuCi1lbXVsYXRpb24gcGFyYW1ldGVycyBzY3JpcHQgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeSwgYSBsaW5rZXIKLXNjcmlwdCBnZW5lcmF0aW9uIHNjcmlwdCBpbiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IGRpcmVjdG9yeSwgYW5kIGFuCi1lbXVsYXRpb24gc291cmNlIGZpbGUgZ2VuZXJhdGlvbiBzY3JpcHQgaW4gdGhlIEBmaWxle2VtdWx0ZW1wbH0KLWRpcmVjdG9yeS4KLQotRm9yIGV4YW1wbGUsIHRoZSBTdW4gNCBsaW5rZXIgc2V0cyB1cCB2YXJpYWJsZXMgaW4KLUBmaWxle2VtdWxwYXJhbXMvc3VuNC5zaH0sIGNyZWF0ZXMgbGlua2VyIHNjcmlwdHMgdXNpbmcKLUBmaWxle3NjcmlwdHRlbXBsL2FvdXQuc2N9LCBhbmQgY3JlYXRlcyB0aGUgZW11bGF0aW9uIGNvZGUgdXNpbmcKLUBmaWxle2VtdWx0ZW1wbC9zdW5vcy5lbX0uCi0KLU5vdGUgdGhhdCB0aGUgbGlua2VyIGNhbiBzdXBwb3J0IHNldmVyYWwgZW11bGF0aW9ucyBzaW11bHRhbmVvdXNseSwKLWRlcGVuZGluZyB1cG9uIGhvdyBpdCBpcyBjb25maWd1cmVkLiAgQW4gZW11bGF0aW9uIGNhbiBiZSBzZWxlY3RlZCB3aXRoCi10aGUgQGNvZGV7LW19IG9wdGlvbi4gIFRoZSBAY29kZXstVn0gb3B0aW9uIHdpbGwgbGlzdCBhbGwgc3VwcG9ydGVkCi1lbXVsYXRpb25zLgotCi1AbWVudQotKiBlbXVsYXRpb24gcGFyYW1ldGVyczo6ICAgICAgICBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHRzCi0qIGxpbmtlciBzY3JpcHRzOjogICAgICAgICAgICAgIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzCi0qIGxpbmtlciBlbXVsYXRpb25zOjogICAgICAgICAgIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cwotQGVuZCBtZW51Ci0KLUBub2RlIGVtdWxhdGlvbiBwYXJhbWV0ZXJzCi1Ac2VjdGlvbiBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHRzCi0KLUVhY2ggdGFyZ2V0IHNlbGVjdHMgYSBwYXJ0aWN1bGFyIGZpbGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeQotYnkgc2V0dGluZyB0aGUgc2hlbGwgdmFyaWFibGUgQGNvZGV7dGFyZ19lbXVsfSBpbiBAZmlsZXtjb25maWd1cmUudGd0fS4KLVRoaXMgc2hlbGwgdmFyaWFibGUgaXMgdXNlZCBieSB0aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgdG8gY29udHJvbAotYnVpbGRpbmcgYW4gZW11bGF0aW9uIHNvdXJjZSBmaWxlLgotCi1DZXJ0YWluIGNvbnZlbnRpb25zIGFyZSBlbmZvcmNlZC4gIFN1cHBvc2UgdGhlIEBjb2Rle3RhcmdfZW11bH0gdmFyaWFibGUKLWlzIHNldCB0byBAdmFye2VtdWx9IGluIEBmaWxle2NvbmZpZ3VyZS50Z3R9LiAgVGhlIG5hbWUgb2YgdGhlIGVtdWxhdGlvbgotc2hlbGwgc2NyaXB0IHdpbGwgYmUgQGZpbGV7ZW11bHBhcmFtcy9AdmFye2VtdWx9LnNofS4gIFRoZQotQGZpbGV7TWFrZWZpbGV9IG11c3QgaGF2ZSBhIHRhcmdldCBuYW1lZCBAZmlsZXtlQHZhcntlbXVsfS5jfTsgdGhpcwotdGFyZ2V0IG11c3QgZGVwZW5kIHVwb24gQGZpbGV7ZW11bHBhcmFtcy9AdmFye2VtdWx9LnNofSwgYXMgd2VsbCBhcyB0aGUKLWFwcHJvcHJpYXRlIHNjcmlwdHMgaW4gdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBhbmQgQGZpbGV7ZW11bHRlbXBsfQotZGlyZWN0b3JpZXMuICBUaGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBtdXN0IGludm9rZSBAY29kZXtHRU5TQ1JJUFRTfQotd2l0aCB0d28gYXJndW1lbnRzOiBAdmFye2VtdWx9LCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBtYWtlIHZhcmlhYmxlCi1AY29kZXt0ZGlyX0B2YXJ7ZW11bH19LiAgVGhlIHZhbHVlIG9mIHRoZSBsYXR0ZXIgdmFyaWFibGUgd2lsbCBiZSBzZXQgYnkKLXRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IHRhcmdldAotZGlyZWN0b3J5IHRvIHNlYXJjaC4KLQotQnkgY29udmVudGlvbiwgdGhlIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0gc2hlbGwgc2NyaXB0IHNob3VsZAotb25seSBzZXQgc2hlbGwgdmFyaWFibGVzLiAgSXQgbWF5IHNldCBzaGVsbCB2YXJpYWJsZXMgd2hpY2ggYXJlIHRvIGJlCi1pbnRlcnByZXRlZCBieSB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IGFuZCB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzLgotQ2VydGFpbiBzaGVsbCB2YXJpYWJsZXMgYXJlIGludGVycHJldGVkIGRpcmVjdGx5IGJ5IHRoZQotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0LgotCi1IZXJlIGlzIGEgbGlzdCBvZiBzaGVsbCB2YXJpYWJsZXMgaW50ZXJwcmV0ZWQgYnkgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0sCi1hcyB3ZWxsIGFzIHNvbWUgY29udmVudGlvbmFsIHNoZWxsIHZhcmlhYmxlcyBpbnRlcnByZXRlZCBieSB0aGUKLUBmaWxle3NjcmlwdHRlbXBsfSBhbmQgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFNDUklQVF9OQU1FCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHRvIHVzZS4gIElmCi1AY29kZXtTQ1JJUFRfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7c2NyaXB0fSwgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCB1c2UKLXRoZSBzY3JpcHQgQGZpbGV7c2NyaXB0dGVtbC9AdmFye3NjcmlwdH0uc2N9LgotCi1AaXRlbSBURU1QTEFURV9OQU1FCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBAZmlsZXtlbXVsdGVtbHB9IHNjcmlwdCB0byB1c2UuICBJZgotQGNvZGV7VEVNUExBVEVfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7dGVtcGxhdGV9LCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsCi11c2UgdGhlIHNjcmlwdCBAZmlsZXtlbXVsdGVtcGwvQHZhcnt0ZW1wbGF0ZX0uZW19LiAgSWYgdGhpcyB2YXJpYWJsZSBpcwotbm90IHNldCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgQHNhbXB7Z2VuZXJpY30uCi0KLUBpdGVtIEdFTkVSQVRFX1NITElCX1NDUklQVAotSWYgdGhpcyBpcyBzZXQgdG8gYSBub25lbXB0eSBzdHJpbmcsIEBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgaW52b2tlCi10aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBhbiBleHRyYSB0aW1lIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5Ci1zY3JpcHQuICBAcmVme2xpbmtlciBzY3JpcHRzfS4KLQotQGl0ZW0gT1VUUFVUX0ZPUk1BVAotVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gaW5kaWNhdGUgdGhlIEJGRCBvdXRwdXQgZm9ybWF0IHVzZSAoZS5nLiwKLUBzYW1weyJhLm91dC1zdW5vcy1iaWcifS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHdpbGwgbm9ybWFsbHkKLXVzZSBpdCBpbiBhbiBAY29kZXtPVVRQVVRfRk9STUFUfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1AaXRlbSBBUkNICi1UaGlzIGlzIG5vcm1hbGx5IHNldCB0byBpbmRpY2F0ZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSAoZS5nLiwKLUBzYW1we3NwYXJjfSkuICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aWxsIG5vcm1hbGx5IHVzZSBpdCBpbiBhbgotQGNvZGV7T1VUUFVUX0FSQ0h9IGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUBpdGVtIEVOVFJZCi1Tb21lIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzIHVzZSB0aGlzIHRvIHNldCB0aGUgZW50cnkgYWRkcmVzcywgaW4gYW4KLUBjb2Rle0VOVFJZfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1AaXRlbSBURVhUX1NUQVJUX0FERFIKLVNvbWUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMgdXNlIHRoaXMgdG8gc2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZQotQHNhbXB7LnRleHR9IHNlY3Rpb24uCi0KLUBpdGVtIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUgotSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHNldHMKLUBjb2Rle1RFWFRfU1RBUlRfQUREUn0gdG8gaXRzIHZhbHVlIGJlZm9yZSBydW5uaW5nIHRoZQotQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBmb3IgdGhlIEBjb2Rley1ufSBhbmQgQGNvZGV7LU59IG9wdGlvbnMKLShAcHhyZWZ7bGlua2VyIHNjcmlwdHN9KS4KLQotQGl0ZW0gU0VHTUVOVF9TSVpFCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHVzZXMgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YKLUBjb2Rle0RBVEFfQUxJR05NRU5UfSB3aGVuIHJ1bm5pbmcgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQuCi0KLUBpdGVtIFRBUkdFVF9QQUdFX1NJWkUKLUlmIEBjb2Rle1NFR01FTlRfU0laRX0gaXMgbm90IGRlZmluZWQsIHRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQKLXVzZXMgdGhpcyB0byBkZWZpbmUgaXQuCi0KLUBpdGVtIEFMSUdOTUVOVAotU29tZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cyBzZXQgdGhpcyB0byBhIG51bWJlciB0byBwYXNzIHRvCi1AY29kZXtBTElHTn0gdG8gc2V0IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBAY29kZXtlbmR9IHN5bWJvbC4KLUBlbmQgdGFibGUKLQotQG5vZGUgbGlua2VyIHNjcmlwdHMKLUBzZWN0aW9uIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzCi0KLUVhY2ggbGlua2VyIHRhcmdldCB1c2VzIGEgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB0byBnZW5lcmF0ZSB0aGUKLWRlZmF1bHQgbGlua2VyIHNjcmlwdHMuICBUaGUgbmFtZSBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBpcwotc2V0IGJ5IHRoZSBAY29kZXtTQ1JJUFRfTkFNRX0gdmFyaWFibGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdC4KLUlmIEBjb2Rle1NDUklQVF9OQU1FfSBpcyBzZXQgdG8gQHZhcntzY3JpcHR9LCBAY29kZXtnZW5zY3JpcHRzLnNofSB3aWxsCi1pbnZva2UgQGZpbGV7c2NyaXB0dGVtcGwvQHZhcntzY3JpcHR9LnNjfS4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIGludm9rZSB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9Ci1zY3JpcHQgNSBvciA2IHRpbWVzLiAgRWFjaCB0aW1lIGl0IHdpbGwgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQotQGNvZGV7TERfRkxBR30gdG8gYSBkaWZmZXJlbnQgdmFsdWUuICBXaGVuIHRoZSBsaW5rZXIgaXMgcnVuLCB0aGUKLW9wdGlvbnMgdXNlZCB3aWxsIGRpcmVjdCBpdCB0byBzZWxlY3QgYSBwYXJ0aWN1bGFyIHNjcmlwdC4gIChTY3JpcHQKLXNlbGVjdGlvbiBpcyBjb250cm9sbGVkIGJ5IHRoZSBAY29kZXtnZXRfc2NyaXB0fSBlbXVsYXRpb24gZW50cnkgcG9pbnQ7Ci10aGlzIGRlc2NyaWJlcyB0aGUgY29udmVudGlvbmFsIGJlaGF2aW91cikuCi0KLVRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHNob3VsZCBqdXN0IHdyaXRlIGEgbGlua2VyIHNjcmlwdCwgd3JpdHRlbgotaW4gdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLCB0byBzdGFuZGFyZCBvdXRwdXQuICBJZiB0aGUgZW11bGF0aW9uCi1uYW1lLS10aGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHBhcmFtc30gZmlsZSB3aXRob3V0IHRoZSBAZmlsZXsuc2N9Ci1leHRlbnNpb24tLWlzIEB2YXJ7ZW11bH0sIHRoZW4gdGhlIG91dHB1dCB3aWxsIGJlIGRpcmVjdGVkIHRvCi1AZmlsZXtsZHNjcmlwdHMvQHZhcntlbXVsfS5AdmFye2V4dGVuc2lvbn19IGluIHRoZSBidWlsZCBkaXJlY3RvcnksCi13aGVyZSBAdmFye2V4dGVuc2lvbn0gY2hhbmdlcyBlYWNoIHRpbWUgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMKLWludm9rZWQuCi0KLUhlcmUgaXMgdGhlIGxpc3Qgb2YgdmFsdWVzIGFzc2lnbmVkIHRvIEBjb2Rle0xEX0ZMQUd9LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIChlbXB0eSkKLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgYnkgZGVmYXVsdCAod2hlbiBub25lIG9mIHRoZSBmb2xsb3dpbmcKLWNhc2VzIGFwcGx5KS4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueH0uCi1AaXRlbSBuCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggdGhlCi1AY29kZXstbn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54bn0uCi1AaXRlbSBOCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggdGhlCi1AY29kZXstTn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54Ym59LgotQGl0ZW0gcgotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LXJ9IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueHJ9LgotQGl0ZW0gdQotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LVVyfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7Lnh1fS4KLUBpdGVtIHNoYXJlZAotVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMgb25seSBpbnZva2VkIHdpdGggQGNvZGV7TERfRkxBR30gc2V0IHRvCi10aGlzIHZhbHVlIGlmIEBjb2Rle0dFTkVSQVRFX1NITElCX1NDUklQVH0gaXMgZGVmaW5lZCBpbiB0aGUKLUBmaWxle2VtdWxwYXJhbXN9IGZpbGUuICBUaGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgbXVzdCBhcnJhbmdlIHRvIHVzZQotdGhpcyBzY3JpcHQgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUsIG5vcm1hbGx5IHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkCi13aXRoIHRoZSBAY29kZXstc2hhcmVkfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YKLUBmaWxley54c30uCi1AZW5kIHRhYmxlCi0KLUJlc2lkZXMgdGhlIHNoZWxsIHZhcmlhYmxlcyBzZXQgYnkgdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdCwgYW5kIHRoZQotQGNvZGV7TERfRkxBR30gdmFyaWFibGUsIHRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBzZXQKLWNlcnRhaW4gdmFyaWFibGVzIGZvciBlYWNoIHJ1biBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBSRUxPQ0FUSU5HCi1UaGlzIHdpbGwgYmUgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgZG9pbmcgYSBmaW5hbAotcmVsb2NhdGlvbiAoZS5nLiwgYWxsIHNjcmlwdHMgb3RoZXIgdGhhbiBAY29kZXstcn0gYW5kIEBjb2Rley1Vcn0pLgotCi1AaXRlbSBDT05TVFJVQ1RJTkcKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGxpbmtlciBpcyBidWlsZGluZwotZ2xvYmFsIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyAoZS5nLiwgYWxsIHNjcmlwdHMgb3RoZXIgdGhhbgotQGNvZGV7LXJ9KS4KLQotQGl0ZW0gREFUQV9BTElHTk1FTlQKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYW4gQGNvZGV7QUxJR059IGV4cHJlc3Npb24gd2hlbiB0aGUgb3V0cHV0IHNob3VsZCBiZQotcGFnZSBhbGlnbmVkLCBvciB0byBAc2FtcHsufSB3aGVuIGdlbmVyYXRpbmcgdGhlIEBjb2Rley1OfSBzY3JpcHQuCi0KLUBpdGVtIENSRUFURV9TSExJQgotVGhpcyB3aWxsIGJlIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiBnZW5lcmF0aW5nIGEgQGNvZGV7LXNoYXJlZH0KLXNjcmlwdC4KLUBlbmQgdGFibGUKLQotVGhlIGNvbnZlbnRpb25hbCB3YXkgdG8gd3JpdGUgYSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzIHRvIGZpcnN0Ci1zZXQgYSBmZXcgc2hlbGwgdmFyaWFibGVzLCBhbmQgdGhlbiB3cml0ZSBvdXQgYSBsaW5rZXIgc2NyaXB0IHVzaW5nCi1AY29kZXtjYXR9IHdpdGggYSBoZXJlIGRvY3VtZW50LiAgVGhlIGxpbmtlciBzY3JpcHQgd2lsbCB1c2UgdmFyaWFibGUKLXN1YnN0aXR1dGlvbnMsIGJhc2VkIG9uIHRoZSBhYm92ZSB2YXJpYWJsZXMgYW5kIHRob3NlIHNldCBpbiB0aGUKLUBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdCwgdG8gY29udHJvbCBpdHMgYmVoYXZpb3VyLgotCi1XaGVuIHRoZXJlIGFyZSBwYXJ0cyBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aGljaCBzaG91bGQgb25seQotYmUgcnVuIHdoZW4gZG9pbmcgYSBmaW5hbCByZWxvY2F0aW9uLCB0aGV5IHNob3VsZCBiZSBlbmNsb3NlZCB3aXRoaW4gYQotdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJhc2VkIG9uIEBjb2Rle1JFTE9DQVRJTkd9LiAgRm9yIGV4YW1wbGUsIG9uIG1hbnkKLXRhcmdldHMgc3BlY2lhbCBzeW1ib2xzIHN1Y2ggYXMgQGNvZGV7X2VuZH0gc2hvdWxkIGJlIGRlZmluZWQgd2hlbiBkb2luZwotYSBmaW5hbCBsaW5rLiAgTmF0dXJhbGx5LCB0aG9zZSBzeW1ib2xzIHNob3VsZCBub3QgYmUgZGVmaW5lZCB3aGVuIGRvaW5nCi1hIHJlbG9jYXRlYWJsZSBsaW5rIHVzaW5nIEBjb2Rley1yfS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0Ci1jb3VsZCB1c2UgYSBjb25zdHJ1Y3QgbGlrZSB0aGlzIHRvIGRlZmluZSB0aG9zZSBzeW1ib2xzOgotQHNtYWxsZXhhbXBsZQotICAkQHtSRUxPQ0FUSU5HKyBfZW5kID0gLjtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgd2lsbCBkbyB0aGUgc3ltYm9sIGFzc2lnbm1lbnQgb25seSBpZiB0aGUgQGNvZGV7UkVMT0NBVElOR30KLXZhcmlhYmxlIGlzIGRlZmluZWQuCi0KLVRoZSBiYXNpYyBqb2Igb2YgdGhlIGxpbmtlciBzY3JpcHQgaXMgdG8gcHV0IHRoZSBzZWN0aW9ucyBpbiB0aGUgY29ycmVjdAotb3JkZXIsIGFuZCBhdCB0aGUgY29ycmVjdCBtZW1vcnkgYWRkcmVzc2VzLiAgRm9yIHNvbWUgdGFyZ2V0cywgdGhlCi1saW5rZXIgc2NyaXB0IG1heSBoYXZlIHRvIGRvIHNvbWUgb3RoZXIgb3BlcmF0aW9ucy4KLQotRm9yIGV4YW1wbGUsIG9uIG1vc3QgTUlQUyBwbGF0Zm9ybXMsIHRoZSBsaW5rZXIgaXMgcmVzcG9uc2libGUgZm9yCi1kZWZpbmluZyB0aGUgc3BlY2lhbCBzeW1ib2wgQGNvZGV7X2dwfSwgdXNlZCB0byBpbml0aWFsaXplIHRoZQotQGNvZGV7JGdwfSByZWdpc3Rlci4gIEl0IG11c3QgYmUgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgc21hbGwgZGF0YQotc2VjdGlvbiBwbHVzIEBjb2RlezB4ODAwMH0uICBOYXR1cmFsbHksIGl0IHNob3VsZCBvbmx5IGJlIGRlZmluZWQgd2hlbgotZG9pbmcgYSBmaW5hbCByZWxvY2F0aW9uLiAgVGhpcyB3aWxsIHR5cGljYWxseSBiZSBkb25lIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLSAgJEB7UkVMT0NBVElORysgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO0B9Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyBsaW5lIHdvdWxkIGFwcGVhciBqdXN0IGJlZm9yZSB0aGUgc2VjdGlvbnMgd2hpY2ggY29tcG9zZSB0aGUgc21hbGwKLWRhdGEgc2VjdGlvbiAoQHNhbXB7LnNkYXRhfSwgQHNhbXB7LnNic3N9KS4gIEFsbCB0aG9zZSBzZWN0aW9ucyB3b3VsZCBiZQotY29udGlndW91cyBpbiBtZW1vcnkuCi0KLU1hbnkgQ09GRiBzeXN0ZW1zIGJ1aWxkIGNvbnN0cnVjdG9yIHRhYmxlcyBpbiB0aGUgbGlua2VyIHNjcmlwdC4gIFRoZQotY29tcGlsZXIgd2lsbCBhcnJhbmdlIHRvIG91dHB1dCB0aGUgYWRkcmVzcyBvZiBlYWNoIGdsb2JhbCBjb25zdHJ1Y3RvcgotaW4gYSBAc2FtcHsuY3Rvcn0gc2VjdGlvbiwgYW5kIHRoZSBhZGRyZXNzIG9mIGVhY2ggZ2xvYmFsIGRlc3RydWN0b3IgaW4KLWEgQHNhbXB7LmR0b3J9IHNlY3Rpb24gKHRoaXMgaXMgZG9uZSBieSBkZWZpbmluZwotQGNvZGV7QVNNX09VVFBVVF9DT05TVFJVQ1RPUn0gYW5kIEBjb2Rle0FTTV9PVVRQVVRfREVTVFJVQ1RPUn0gaW4gdGhlCi1AY29kZXtnY2N9IGNvbmZpZ3VyYXRpb24gZmlsZXMpLiAgVGhlIEBjb2Rle2djY30gcnVudGltZSBzdXBwb3J0Ci1yb3V0aW5lcyBleHBlY3QgdGhlIGNvbnN0cnVjdG9yIHRhYmxlIHRvIGJlIG5hbWVkIEBjb2Rle19fQ1RPUl9MSVNUX199LgotVGhleSBleHBlY3QgaXQgdG8gYmUgYSBsaXN0IG9mIHdvcmRzLCB3aXRoIHRoZSBmaXJzdCB3b3JkIGJlaW5nIHRoZQotY291bnQgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgVGhlcmUgc2hvdWxkIGJlIGEgdHJhaWxpbmcgemVybyB3b3JkLgotKEFjdHVhbGx5LCB0aGUgY291bnQgbWF5IGJlIC0xIGlmIHRoZSB0cmFpbGluZyB3b3JkIGlzIHByZXNlbnQsIGFuZCB0aGUKLXRyYWlsaW5nIHdvcmQgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGNvdW50IGlzIGNvcnJlY3QsIGJ1dCwgYXMgdGhlCi1AY29kZXtnY2N9IGJlaGF2aW91ciBoYXMgY2hhbmdlZCBzbGlnaHRseSBvdmVyIHRoZSB5ZWFycywgaXQgaXMgc2FmZXN0Ci10byBwcm92aWRlIGJvdGgpLiAgSGVyZSBpcyBhIHR5cGljYWwgd2F5IHRoYXQgbWlnaHQgYmUgaGFuZGxlZCBpbiBhCi1AZmlsZXtzY3JpcHR0ZW1wbH0gZmlsZS4KLUBzbWFsbGV4YW1wbGUKLSAgICAkQHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO0B9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycylAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygwKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO0B9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjtAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMilAfQotICAgICRAe0NPTlNUUlVDVElORysgKiguZHRvcnMpQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoMClAfQotICAgICRAe0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB1c2Ugb2YgQGNvZGV7Q09OU1RSVUNUSU5HfSBlbnN1cmVzIHRoYXQgdGhlc2UgbGlua2VyIHNjcmlwdCBjb21tYW5kcwotd2lsbCBvbmx5IGFwcGVhciB3aGVuIHRoZSBsaW5rZXIgaXMgc3VwcG9zZWQgdG8gYmUgYnVpbGRpbmcgdGhlCi1jb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMuICBUaGlzIGV4YW1wbGUgaXMgd3JpdHRlbiBmb3IgYSB0YXJnZXQKLXdoaWNoIHVzZXMgNCBieXRlIHBvaW50ZXJzLgotCi1FbWJlZGRlZCBzeXN0ZW1zIG9mdGVuIG5lZWQgdG8gc2V0IGEgc3RhY2sgYWRkcmVzcy4gIFRoaXMgaXMgbm9ybWFsbHkKLWJlc3QgZG9uZSBieSB1c2luZyB0aGUgQGNvZGV7UFJPVklERX0gY29uc3RydWN0IHdpdGggYSBkZWZhdWx0IHN0YWNrCi1hZGRyZXNzLiAgVGhpcyBwZXJtaXRzIHRoZSB1c2VyIHRvIGVhc2lseSBvdmVycmlkZSB0aGUgc3RhY2sgYWRkcmVzcwotdXNpbmcgdGhlIEBjb2Rley0tZGVmc3ltfSBvcHRpb24uICBIZXJlIGlzIGFuIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0gICRAe1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fc3RhY2sgPSAweDgwMDAwMDAwKTtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIEBjb2Rle19fc3RhY2t9IHdvdWxkIHRoZW4gYmUgdXNlZCBpbiB0aGUgc3RhcnR1cAotY29kZSB0byBpbml0aWFsaXplIHRoZSBzdGFjayBwb2ludGVyLgotCi1Abm9kZSBsaW5rZXIgZW11bGF0aW9ucwotQHNlY3Rpb24gQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzCi0KLUVhY2ggbGlua2VyIHRhcmdldCB1c2VzIGFuIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IHRvIGdlbmVyYXRlIHRoZQotZW11bGF0aW9uIGNvZGUuICBUaGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgaXMgc2V0IGJ5IHRoZQotQGNvZGV7VEVNUExBVEVfTkFNRX0gdmFyaWFibGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdC4gIElmIHRoZQotQGNvZGV7VEVNUExBVEVfTkFNRX0gdmFyaWFibGUgaXMgbm90IHNldCwgdGhlIGRlZmF1bHQgaXMKLUBzYW1we2dlbmVyaWN9LiAgSWYgdGhlIHZhbHVlIG9mIEBjb2Rle1RFTVBMQVRFX05BTUV9IGlzIEB2YXJ7dGVtcGxhdGV9LAotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCB1c2UgQGZpbGV7ZW11bHRlbXBsL0B2YXJ7dGVtcGxhdGV9LmVtfS4KLQotTW9zdCB0YXJnZXRzIHVzZSB0aGUgZ2VuZXJpYyBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCwKLUBmaWxle2VtdWx0ZW1wbC9nZW5lcmljLmVtfS4gIEEgZGlmZmVyZW50IEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzCi1vbmx5IG5lZWRlZCBpZiB0aGUgbGlua2VyIG11c3Qgc3VwcG9ydCB1bnVzdWFsIGFjdGlvbnMsIHN1Y2ggYXMgbGlua2luZwotYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLgotCi1UaGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgaXMgbm9ybWFsbHkgd3JpdHRlbiBhcyBhIHNpbXBsZSBpbnZvY2F0aW9uCi1vZiBAY29kZXtjYXR9IHdpdGggYSBoZXJlIGRvY3VtZW50LiAgVGhlIGRvY3VtZW50IHdpbGwgdXNlIGEgZmV3Ci12YXJpYWJsZSBzdWJzdGl0dXRpb25zLiAgVHlwaWNhbGx5IGVhY2ggZnVuY3Rpb24gbmFtZXMgdXNlcyBhCi1zdWJzdGl0dXRpb24gaW52b2x2aW5nIEBjb2Rle0VNVUxBVElPTl9OQU1FfSwgZm9yIGVhc2Ugb2YgZGVidWdnaW5nIHdoZW4KLXRoZSBsaW5rZXIgc3VwcG9ydHMgbXVsdGlwbGUgZW11bGF0aW9ucy4KLQotRXZlcnkgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGluIHRoZSBlbWl0dGVkIGZpbGUgc2hvdWxkIGJlIHN0YXRpYy4gIFRoZQotb25seSBnbG9iYWxseSB2aXNpYmxlIG9iamVjdCBtdXN0IGJlIG5hbWVkCi1AY29kZXtsZF9AdmFye0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb259LCB3aGVyZSBAdmFye0VNVUxBVElPTl9OQU1FfSBpcwotdGhlIG5hbWUgb2YgdGhlIGVtdWxhdGlvbiBzZXQgaW4gQGZpbGV7Y29uZmlndXJlLnRndH0gKHRoaXMgaXMgYWxzbyB0aGUKLW5hbWUgb2YgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUgd2l0aG91dCB0aGUgQGZpbGV7LnNofSBleHRlbnNpb24pLgotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBjb2Rle0VNVUxBVElPTl9OQU1FfSBiZWZvcmUgaW52b2tpbmcgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0LgotCi1UaGUgQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufSB2YXJpYWJsZSBtdXN0IGJlIGEKLUBjb2Rle3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3R9LCBhcyBkZWZpbmVkIGluIEBmaWxle2xkZW11bC5ofS4KLUl0IGRlZmluZXMgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIGludm9rZWQgYnkgdGhlIGxpbmtlciwKLWFzIHdlbGwgYXMgc3RyaW5ncyBmb3IgdGhlIGVtdWxhdGlvbiBuYW1lIChub3JtYWxseSBzZXQgZnJvbSB0aGUgc2hlbGwKLXZhcmlhYmxlIEBjb2Rle0VNVUxBVElPTl9OQU1FfSBhbmQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBuYW1lIChub3JtYWxseQotc2V0IGZyb20gdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle09VVFBVVF9GT1JNQVR9IHdoaWNoIGlzIG5vcm1hbGx5IHNldAotYnkgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUpLgotCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQotQGNvZGV7Q09NUElMRV9JTn0gd2hlbiBpdCBpbnZva2VzIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBmb3IgdGhlCi1kZWZhdWx0IGVtdWxhdGlvbi4gIEluIHRoaXMgY2FzZSwgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IHNob3VsZAotaW5jbHVkZSB0aGUgbGlua2VyIHNjcmlwdHMgZGlyZWN0bHksIGFuZCByZXR1cm4gdGhlbSBmcm9tIHRoZQotQGNvZGV7Z2V0X3NjcmlwdHN9IGVudHJ5IHBvaW50LiAgV2hlbiB0aGUgZW11bGF0aW9uIGlzIG5vdCB0aGUgZGVmYXVsdCwKLXRoZSBAY29kZXtnZXRfc2NyaXB0c30gZW50cnkgcG9pbnQgc2hvdWxkIGp1c3QgcmV0dXJuIGEgZmlsZSBuYW1lLiAgU2VlCi1AZmlsZXtlbXVsdGVtcGwvZ2VuZXJpYy5lbX0gZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgaXMgZG9uZS4KLQotQXQgc29tZSBwb2ludCwgdGhlIGxpbmtlciBlbXVsYXRpb24gZW50cnkgcG9pbnRzIHNob3VsZCBiZSBkb2N1bWVudGVkLgotCi1Abm9kZSBFbXVsYXRpb24gV2Fsa3Rocm91Z2gKLUBjaGFwdGVyIEEgV2Fsa3Rocm91Z2ggb2YgYSBUeXBpY2FsIEVtdWxhdGlvbgotCi1UaGlzIGNoYXB0ZXIgaXMgdG8gaGVscCBwZW9wbGUgd2hvIGFyZSBuZXcgdG8gdGhlIHdheSBlbXVsYXRpb25zCi1pbnRlcmFjdCB3aXRoIHRoZSBsaW5rZXIsIG9yIHdobyBhcmUgc3VkZGVubHkgdGhydXN0IGludG8gdGhlIHBvc2l0aW9uCi1vZiBoYXZpbmcgdG8gd29yayB3aXRoIGV4aXN0aW5nIGVtdWxhdGlvbnMuICBJdCB3aWxsIGRpc2N1c3MgdGhlIGZpbGVzCi15b3UgbmVlZCB0byBiZSBhd2FyZSBvZi4gIEl0IHdpbGwgdGVsbCB5b3Ugd2hlbiB0aGUgZ2l2ZW4gImhvb2tzIiBpbgotdGhlIGVtdWxhdGlvbiB3aWxsIGJlIGNhbGxlZC4gIEl0IHdpbGwsIGhvcGVmdWxseSwgZ2l2ZSB5b3UgZW5vdWdoCi1pbmZvcm1hdGlvbiBhYm91dCB3aGVuIGFuZCBob3cgdGhpbmdzIGhhcHBlbiB0aGF0IHlvdSdsbCBiZSBhYmxlIHRvCi1nZXQgYnkuICBBcyBhbHdheXMsIHRoZSBzb3VyY2UgaXMgdGhlIGRlZmluaXRpdmUgcmVmZXJlbmNlIHRvIHRoaXMuCi0KLVRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGxpbmtlciBpcyBpbiBAZmlsZXtsZG1haW4uY30gd2hlcmUKLUBjb2Rle21haW59IGlzIGRlZmluZWQuICBUaGUgYnVsayBvZiB0aGUgY29kZSB0aGF0J3MgZW11bGF0aW9uCi1zcGVjaWZpYyB3aWxsIGluaXRpYWxseSBiZSBpbiBAY29kZXtlbXVsdGVtcGwvQHZhcntlbXVsYXRpb259LmVtfSBidXQKLXdpbGwgZW5kIHVwIGluIEBjb2Rle2VAdmFye2VtdWxhdGlvbn0uY30gd2hlbiB0aGUgYnVpbGQgaXMgZG9uZS4KLU1vc3Qgb2YgdGhlIHdvcmsgdG8gc2VsZWN0IGFuZCBpbnRlcmZhY2Ugd2l0aCBlbXVsYXRpb25zIGlzIGluCi1AY29kZXtsZGVtdWwuaH0gYW5kIEBjb2Rle2xkZW11bC5jfS4gIFNwZWNpZmljYWxseSwgQGNvZGV7bGRlbXVsLmh9Ci1kZWZpbmVzIHRoZSBAY29kZXtsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3R9IHN0cnVjdHVyZSB5b3VyIGVtdWxhdGlvbgotZXhwb3J0cy4KLQotWW91ciBlbXVsYXRpb24gZmlsZSBleHBvcnRzIGEgc3ltYm9sCi1AY29kZXtsZF9AdmFye0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb259LiAgSWYgeW91ciBlbXVsYXRpb24gaXMKLXNlbGVjdGVkIChpdCB1c3VhbGx5IGlzLCBzaW5jZSB1c3VhbGx5IHRoZXJlJ3Mgb25seSBvbmUpLAotQGNvZGV7bGRlbXVsLmN9IHNldHMgdGhlIHZhcmlhYmxlIEB2YXJ7bGRfZW11bGF0aW9ufSB0byBwb2ludCB0byBpdC4KLUBjb2Rle2xkZW11bC5jfSBhbHNvIGRlZmluZXMgYSBudW1iZXIgb2YgQVBJIGZ1bmN0aW9ucyB0aGF0IGludGVyZmFjZQotdG8geW91ciBlbXVsYXRpb24sIGxpa2UgQGNvZGV7bGRlbXVsX2FmdGVyX3BhcnNlfSB3aGljaCBzaW1wbHkgY2FsbHMKLXlvdXIgQGNvZGV7bGRfQHZhcntFTVVMQVRJT059X2VtdWxhdGlvbi5hZnRlcl9wYXJzZX0gZnVuY3Rpb24uICBGb3IKLXRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiwgdGhlIGZ1bmN0aW9ucyB3aWxsIGJlIG1lbnRpb25lZCwgYnV0IHlvdQotc2hvdWxkIGFzc3VtZSB0aGUgaW5kaXJlY3QgcmVmZXJlbmNlIHRvIHlvdXIgZW11bGF0aW9uIGFsc28uCi0KLVdlIHdpbGwgYWxzbyBza2lwIG9yIGdsb3NzIG92ZXIgcGFydHMgb2YgdGhlIGxpbmsgcHJvY2VzcyB0aGF0IGRvbid0Ci1yZWxhdGUgdG8gZW11bGF0aW9ucywgbGlrZSBzZXR0aW5nIHVwIGludGVybmF0aW9uYWxpemF0aW9uLgotCi1BZnRlciBpbml0aWFsaXphdGlvbiwgQGNvZGV7bWFpbn0gc2VsZWN0cyBhbiBlbXVsYXRpb24gYnkgcHJlLXNjYW5uaW5nCi10aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIEl0IGNhbGxzIEBjb2Rle2xkZW11bF9jaG9vc2VfdGFyZ2V0fSB0bwotY2hvb3NlIGEgdGFyZ2V0LiAgSWYgeW91IHNldCBAY29kZXtjaG9vc2VfdGFyZ2V0fSB0bwotQGNvZGV7bGRlbXVsX2RlZmF1bHRfdGFyZ2V0fSwgaXQgcGlja3MgeW91ciBAY29kZXt0YXJnZXRfbmFtZX0gYnkKLWRlZmF1bHQuCi0KLUBjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9iZWZvcmVfcGFyc2V9LCB0aGVuIEBjb2Rle3BhcnNlX2FyZ3N9LgotQGNvZGV7cGFyc2VfYXJnc30gY2FsbHMgQGNvZGV7bGRlbXVsX3BhcnNlX2FyZ3N9IGZvciBlYWNoIGFyZywgd2hpY2gKLW11c3QgdXBkYXRlIHRoZSBAY29kZXtnZXRvcHR9IGdsb2JhbHMgaWYgaXQgcmVjb2duaXplcyB0aGUgYXJndW1lbnQuCi1JZiB0aGUgZW11bGF0aW9uIGRvZXNuJ3QgcmVjb2duaXplIGl0LCB0aGVuIHBhcnNlX2FyZ3MgY2hlY2tzIHRvIHNlZQotaWYgaXQgcmVjb2duaXplcyBpdC4KLQotTm93IHRoYXQgdGhlIGVtdWxhdGlvbiBoYXMgaGFkIGFjY2VzcyB0byBhbGwgaXRzIGNvbW1hbmQtbGluZSBvcHRpb25zLAotQGNvZGV7bWFpbn0gY2FsbHMgQGNvZGV7bGRlbXVsX3NldF9zeW1ib2xzfS4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFueQotaW5pdGlhbGl6YXRpb24gdGhhdCBtYXkgYmUgYWZmZWN0ZWQgYnkgb3B0aW9ucy4gIEl0IGlzIGFsc28gc3VwcG9zZWQKLXRvIHNldCB1cCBhbnkgdmFyaWFibGVzIG5lZWRlZCBieSB0aGUgZW11bGF0aW9uIHNjcmlwdC4KLQotQGNvZGV7bWFpbn0gbm93IGNhbGxzIEBjb2Rle2xkZW11bF9nZXRfc2NyaXB0fSB0byBnZXQgdGhlIGVtdWxhdGlvbgotc2NyaXB0IHRvIHVzZSAoYmFzZWQgb24gYXJndW1lbnRzLCBubyBkb3VidCwgQHB4cmVme0VtdWxhdGlvbnN9KSBhbmQKLXJ1bnMgaXQuICBXaGlsZSBwYXJzaW5nLCBAY29kZXtsZGdyYW0ueX0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX2hsbH0gb3IKLUBjb2Rle2xkZW11bF9zeXNsaWJ9IHRvIGhhbmRsZSB0aGUgQGNvZGV7SExMfSBvciBAY29kZXtTWVNMSUJ9Ci1jb21tYW5kcy4gIEl0IG1heSBjYWxsIEBjb2Rle2xkZW11bF91bnJlY29nbml6ZWRfZmlsZX0gaWYgeW91IGFza2VkCi10aGUgbGlua2VyIHRvIGxpbmsgYSBmaWxlIGl0IGRvZXNuJ3QgcmVjb2duaXplLiAgSXQgd2lsbCBjYWxsCi1AY29kZXtsZGVtdWxfcmVjb2duaXplZF9maWxlfSBmb3IgZWFjaCBmaWxlIGl0IGRvZXMgcmVjb2duaXplLCBpbiBjYXNlCi10aGUgZW11bGF0aW9uIHdhbnRzIHRvIGhhbmRsZSBzb21lIGZpbGVzIHNwZWNpYWxseS4gIEFsbCB0aGUgd2hpbGUsCi1pdCdzIGxvYWRpbmcgdGhlIGZpbGVzIChwb3NzaWJseSBjYWxsaW5nCi1AY29kZXtsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmV9KSBhbmQgc3ltYm9scyBhbmQgc3R1ZmYuICBBZnRlciBpdCdzCi1kb25lIHJlYWRpbmcgdGhlIHNjcmlwdCwgQGNvZGV7bWFpbn0gY2FsbHMgQGNvZGV7bGRlbXVsX2FmdGVyX3BhcnNlfS4KLVVzZSB0aGUgYWZ0ZXItcGFyc2UgaG9vayB0byBzZXQgdXAgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHN0dWZmIHRoZQotc2NyaXB0IG1pZ2h0IGhhdmUgc2V0IHVwLCBsaWtlIHRoZSBlbnRyeSBwb2ludC4KLQotQGNvZGV7bWFpbn0gbmV4dCBjYWxscyBAY29kZXtsYW5nX3Byb2Nlc3N9IGluIEBjb2Rle2xkbGFuZy5jfS4gIFRoaXMKLWFwcGVhcnMgdG8gYmUgdGhlIG1haW4gY29yZSBvZiB0aGUgbGlua2luZyBpdHNlbGYsIGFzIGZhciBhcyBlbXVsYXRpb24KLWhvb2tzIGFyZSBjb25jZXJuZWQoKikuICBJdCBmaXJzdCBvcGVucyB0aGUgb3V0cHV0IGZpbGUncyBCRkQsIGNhbGxpbmcKLUBjb2Rle2xkZW11bF9zZXRfb3V0cHV0X2FyY2h9LCBhbmQgY2FsbHMKLUBjb2Rle2xkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50c30gaW4gY2FzZSB5b3UgbmVlZCB0byB1c2UKLW90aGVyIG1lYW5zIHRvIGZpbmQgb3IgY3JlYXRlIG9iamVjdCBmaWxlcyAoaS5lLiBzaGFyZWQgbGlicmFyaWVzCi1mb3VuZCBvbiBhIHBhdGgsIG9yIGZha2Ugc3R1YiBvYmplY3RzKS4gIERlc3BpdGUgdGhlIG5hbWUsIG5vYm9keQotY3JlYXRlcyBvdXRwdXQgc2VjdGlvbnMgaGVyZS4KLQotKCopIEluIG1vc3QgY2FzZXMsIHRoZSBCRkQgbGlicmFyeSBkb2VzIHRoZSBidWxrIG9mIHRoZSBhY3R1YWwKLWxpbmtpbmcsIGhhbmRsaW5nIHN5bWJvbCB0YWJsZXMsIHN5bWJvbCByZXNvbHV0aW9uLCByZWxvY2F0aW9ucywgYW5kCi1idWlsZGluZyB0aGUgZmluYWwgb3V0cHV0IGZpbGUuICBTZWUgdGhlIEJGRCByZWZlcmVuY2UgZm9yIGFsbCB0aGUKLWRldGFpbHMuICBZb3VyIGVtdWxhdGlvbiBpcyB1c3VhbGx5IGNvbmNlcm5lZCBtb3JlIHdpdGggbWFuYWdpbmcKLXRoaW5ncyBhdCB0aGUgZmlsZSBhbmQgc2VjdGlvbiBsZXZlbCwgbGlrZSAicHV0IHRoaXMgaGVyZSwgYWRkIHRoaXMKLXNlY3Rpb24iLCBldGMuCi0KLU5leHQsIHRoZSBvYmplY3RzIHRvIGJlIGxpbmtlZCBhcmUgb3BlbmVkIGFuZCBCRkRzIGNyZWF0ZWQgZm9yIHRoZW0sCi1hbmQgQGNvZGV7bGRlbXVsX2FmdGVyX29wZW59IGlzIGNhbGxlZC4gIEF0IHRoaXMgcG9pbnQsIHlvdSBoYXZlIGFsbAotdGhlIG9iamVjdHMgYW5kIHN5bWJvbHMgbG9hZGVkLCBidXQgbm9uZSBvZiB0aGUgZGF0YSBoYXMgYmVlbiBwbGFjZWQKLXlldC4KLQotTmV4dCBjb21lcyB0aGUgQmlnIExpbmtpbmcgVGhpbmd5IChleGNlcHQgZm9yIHRoZSBwYXJ0cyBCRkQgZG9lcykuCi1BbGwgaW5wdXQgc2VjdGlvbnMgYXJlIG1hcHBlZCB0byBvdXRwdXQgc2VjdGlvbnMgYWNjb3JkaW5nIHRvIHRoZQotc2NyaXB0LiAgSWYgYSBzZWN0aW9uIGRvZXNuJ3QgZ2V0IG1hcHBlZCBieSBkZWZhdWx0LAotQGNvZGV7bGRlbXVsX3BsYWNlX29ycGhhbn0gd2lsbCBnZXQgY2FsbGVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXQgZ29lcy4KLU5leHQgaXQgZmlndXJlcyBvdXQgdGhlIG9mZnNldHMgZm9yIGVhY2ggc2VjdGlvbiwgY2FsbGluZwotQGNvZGV7bGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9ufSBiZWZvcmUgYW5kCi1AY29kZXtsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbn0gYWZ0ZXIgZGVjaWRpbmcgd2hlcmUgZWFjaCBpbnB1dCBzZWN0aW9uCi1lbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0KLVRoZSBsYXN0IHBhcnQgb2YgQGNvZGV7bGFuZ19wcm9jZXNzfSBpcyB0byBmaWd1cmUgb3V0IGFsbCB0aGUgc3ltYm9scycKLXZhbHVlcy4gIEFmdGVyIGFzc2lnbmluZyBmaW5hbCB2YWx1ZXMgdG8gdGhlIHN5bWJvbHMsCi1AY29kZXtsZGVtdWxfZmluaXNofSBpcyBjYWxsZWQsIGFuZCBhZnRlciB0aGF0LCBhbnkgdW5kZWZpbmVkIHN5bWJvbHMKLWFyZSB0dXJuZWQgaW50byBmYXRhbCBlcnJvcnMuCi0KLU9LLCBiYWNrIHRvIEBjb2Rle21haW59LCB3aGljaCBjYWxscyBAY29kZXtsZHdyaXRlfSBpbgotQGZpbGV7bGR3cml0ZS5jfS4gIEBjb2Rle2xkd3JpdGV9IGNhbGxzIEJGRCdzIGZpbmFsX2xpbmssIHdoaWNoIGRvZXMKLWFsbCB0aGUgcmVsb2NhdGlvbiBmaXh1cHMgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IGJmZCB0byBkaXNrLCBhbmQgd2UncmUKLWRvbmUuCi0KLUluIHN1bW1hcnksCi0KLUBpdGVtaXplIEBidWxsZXQKLQotQGl0ZW0gQGNvZGV7bWFpbigpfSBpbiBAZmlsZXtsZG1haW4uY30KLUBpdGVtIEBmaWxle2VtdWx0ZW1wbC9AdmFye0VNVUxBVElPTn0uZW19IGhhcyB5b3VyIGNvZGUKLUBpdGVtIEBjb2Rle2xkZW11bF9jaG9vc2VfdGFyZ2V0fSAoZGVmYXVsdHMgdG8geW91ciBAY29kZXt0YXJnZXRfbmFtZX0pCi1AaXRlbSBAY29kZXtsZGVtdWxfYmVmb3JlX3BhcnNlfQotQGl0ZW0gUGFyc2UgYXJndiwgY2FsbHMgQGNvZGV7bGRlbXVsX3BhcnNlX2FyZ3N9IGZvciBlYWNoCi1AaXRlbSBAY29kZXtsZGVtdWxfc2V0X3N5bWJvbHN9Ci1AaXRlbSBAY29kZXtsZGVtdWxfZ2V0X3NjcmlwdH0KLUBpdGVtIHBhcnNlIHNjcmlwdAotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfaGxsfSBvciBAY29kZXtsZGVtdWxfc3lzbGlifQotQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlfQotQGVuZCBpdGVtaXplCi0KLUBpdGVtIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0KLUBpdGVtIEBjb2Rle2xhbmdfcHJvY2VzcygpfSBpbiBAZmlsZXtsZGxhbmcuY30KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gY3JlYXRlIEBjb2Rle291dHB1dF9iZmR9Ci1AaXRlbSBAY29kZXtsZGVtdWxfc2V0X291dHB1dF9hcmNofQotQGl0ZW0gQGNvZGV7bGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzfQotQGl0ZW0gcmVhZCBvYmplY3RzLCBjcmVhdGUgaW5wdXQgYmZkcyAtIGFsbCBzeW1ib2xzIGV4aXN0LCBidXQgaGF2ZSBubyB2YWx1ZXMKLUBpdGVtIG1heSBjYWxsIEBjb2Rle2xkZW11bF91bnJlY29nbml6ZWRfZmlsZX0KLUBpdGVtIHdpbGwgY2FsbCBAY29kZXtsZGVtdWxfcmVjb2duaXplZF9maWxlfQotQGl0ZW0gQGNvZGV7bGRlbXVsX2FmdGVyX29wZW59Ci1AaXRlbSBtYXAgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zCi1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfcGxhY2Vfb3JwaGFufSBmb3IgcmVtYWluaW5nIHNlY3Rpb25zCi1AaXRlbSBAY29kZXtsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb259Ci1AaXRlbSBnaXZlcyBpbnB1dCBzZWN0aW9ucyBvZmZzZXRzIGludG8gb3V0cHV0IHNlY3Rpb25zLCBwbGFjZXMgb3V0cHV0IHNlY3Rpb25zCi1AaXRlbSBAY29kZXtsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbn0gLSBzZWN0aW9uIGFkZHJlc3NlcyB2YWxpZAotQGl0ZW0gYXNzaWducyB2YWx1ZXMgdG8gc3ltYm9scwotQGl0ZW0gQGNvZGV7bGRlbXVsX2ZpbmlzaH0gLSBzeW1ib2wgdmFsdWVzIHZhbGlkCi1AZW5kIGl0ZW1pemUKLQotQGl0ZW0gb3V0cHV0IGJmZCBpcyB3cml0dGVuIHRvIGRpc2sKLQotQGVuZCBpdGVtaXplCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvbGQvbGRsYW5nLmMgYi9sZC9sZGxhbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5MDM5MS4uMDAwMDAwMAotLS0gYS9sZC9sZGxhbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MzggKzAsMCBAQAotLyogTGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2Ugc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImZubWF0Y2guaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogRk9SV0FSRFMgKi8KLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXdfc3RhdGVtZW50IFBBUkFNUyAoKGVudW0gc3RhdGVtZW50X2VudW0sCi0JCQkJCQkJIHNpemVfdCwKLQkJCQkJCQkgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlKikpOwotCi0KLS8qIExPQ0FMUyAqLwotc3RhdGljIHN0cnVjdCBvYnN0YWNrIHN0YXRfb2JzdGFjazsKLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKLSNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIGZyZWUKLXN0YXRpYyBDT05TVCBjaGFyICpzdGFydHVwX2ZpbGU7Ci1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGlucHV0X2ZpbGVfY2hhaW47Ci1zdGF0aWMgYm9vbGVhbiBwbGFjZWRfY29tbW9ucyA9IGZhbHNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmRlZmF1bHRfY29tbW9uX3NlY3Rpb247Ci1zdGF0aWMgYm9vbGVhbiBtYXBfb3B0aW9uX2Y7Ci1zdGF0aWMgYmZkX3ZtYSBwcmludF9kb3Q7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlyc3RfZmlsZTsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci1zdGF0aWMgQ09OU1QgY2hhciAqY3VycmVudF90YXJnZXQ7Ci1zdGF0aWMgQ09OU1QgY2hhciAqb3V0cHV0X3RhcmdldDsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgc3RhdGVtZW50X2xpc3Q7Ci1zdGF0aWMgc3RydWN0IGxhbmdfcGhkciAqbGFuZ19waGRyX2xpc3Q7Ci0KLXN0YXRpYyB2b2lkIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcgotICBQQVJBTVMgKCh2b2lkICgqZnVuYykgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiksCi0JICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcykpOwotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKm5ld19hZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZSwKLQkgICBjb25zdCBjaGFyICp0YXJnZXQsIGJvb2xlYW4gYWRkX3RvX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluaXRfb3MgUEFSQU1TICgobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcykpOwotc3RhdGljIHZvaWQgZXhwX2luaXRfb3MgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBzZWN0aW9uX2FscmVhZHlfbGlua2VkIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHdpbGRjYXJkcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp3aWxkX3NvcnQKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbG9va3VwX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIHZvaWQgbG9hZF9zeW1ib2xzIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5LAotCQkJCSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICopKTsKLXN0YXRpYyB2b2lkIHdpbGQgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzLAotCQkJICBjb25zdCBjaGFyICpzZWN0aW9uLCBjb25zdCBjaGFyICpmaWxlLAotCQkJICBjb25zdCBjaGFyICp0YXJnZXQsCi0JCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dCkpOwotc3RhdGljIGJmZCAqb3Blbl9vdXRwdXQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIHZvaWQgbGRsYW5nX29wZW5fb3V0cHV0IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgb3Blbl9pbnB1dF9iZmRzCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXRlbWVudCwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgbGFuZ19yZWFzb25hYmxlX2RlZmF1bHRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfcGxhY2VfdW5kZWZpbmVkcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCi0JICAgY29uc3QgY2hhciAqdGFyZ2V0LAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgcHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgcHJpbnRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKmFzc2lnbm1lbnQsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb24pKTsKLXN0YXRpYyB2b2lkIHByaW50X2lucHV0X3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdGF0bSkpOwotc3RhdGljIGJvb2xlYW4gcHJpbnRfb25lX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHByaW50X2lucHV0X3NlY3Rpb24gUEFSQU1TICgobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmluKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9maWxsX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKmZpbGwpKTsKLXN0YXRpYyB2b2lkIHByaW50X2RhdGFfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZSAqZGF0YSkpOwotc3RhdGljIHZvaWQgcHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIHByaW50X3JlbG9jX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyZWxvYykpOwotc3RhdGljIHZvaWQgcHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlICpzKSk7Ci1zdGF0aWMgdm9pZCBwcmludF93aWxkX3N0YXRlbWVudAotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKncsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MpKTsKLXN0YXRpYyB2b2lkIHByaW50X2dyb3VwCi0gIFBBUkFNUyAoKGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUgKiwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcywKLQkJCQkgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnRfbGlzdCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAotCQkJCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBiZmRfdm1hIGluc2VydF9wYWQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnRoaXNfcHRyLAotCQkJCSAgIGZpbGxfdHlwZSBmaWxsLCB1bnNpZ25lZCBpbnQgcG93ZXIsCi0JCQkJICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICBiZmRfdm1hIGRvdCkpOwotc3RhdGljIGJmZF92bWEgc2l6ZV9pbnB1dF9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKip0aGlzX3B0ciwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JICAgZmlsbF90eXBlIGZpbGwsIGJmZF92bWEgZG90LCBib29sZWFuIHJlbGF4KSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBpZ25vcmVfYmZkX2Vycm9ycyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIHZvaWQgbGFuZ19jaGVjayBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2NvbW1vbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBsYW5nX29uZV9jb21tb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3BsYWNlX29ycGhhbnMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB0b3Bvd2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbGFuZ19zZXRfc3RhcnRvZiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCByZXNldF9tZW1vcnlfcmVnaW9ucyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3JlY29yZF9waGRycyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3dpbGQKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3NlY3Rpb25zXzEgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3NlY3Rpb25zIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXR5cGVkZWYgdm9pZCAoKmNhbGxiYWNrX3QpIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqLAotCQkJCSAgICBhc2VjdGlvbiAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosCi0JCQkJICAgIHZvaWQgKikpOwotc3RhdGljIHZvaWQgd2Fsa193aWxkX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwKLQkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGNhbGxiYWNrX3QsIHZvaWQgKikpOwotc3RhdGljIHZvaWQgd2Fsa193aWxkX2ZpbGUKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwKLQkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGNhbGxiYWNrX3QsIHZvaWQgKikpOwotCQkJCQkKLS8qIEVYUE9SVFMgKi8KLWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmFic19vdXRwdXRfc2VjdGlvbjsKLWxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc3RhdF9wdHIgPSAmc3RhdGVtZW50X2xpc3Q7Ci1sYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgZmlsZV9jaGFpbiA9IHsgMCB9OwotY29uc3QgY2hhciAqZW50cnlfc3ltYm9sID0gTlVMTDsKLWJvb2xlYW4gZW50cnlfZnJvbV9jbWRsaW5lOwotYm9vbGVhbiBsYW5nX2hhc19pbnB1dF9maWxlID0gZmFsc2U7Ci1ib29sZWFuIGhhZF9vdXRwdXRfZmlsZW5hbWUgPSBmYWxzZTsKLWJvb2xlYW4gbGFuZ19mbG9hdF9mbGFnID0gZmFsc2U7Ci1ib29sZWFuIGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlID0gZmFsc2U7Ci1zdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbm9jcm9zc3JlZl9saXN0OwotCi1ldHJlZV90eXBlICpiYXNlOyAvKiBSZWxvY2F0aW9uIGJhc2UgLSBvciBudWxsICovCi0KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi0jZGVmaW5lIGNhdChhLGIpIGEjI2IKLSNlbHNlCi0jZGVmaW5lIGNhdChhLGIpIGEvKiovYgotI2VuZGlmCi0KLSNkZWZpbmUgbmV3X3N0YXQoeCx5KSAoY2F0KHgsX3R5cGUpKikgbmV3X3N0YXRlbWVudChjYXQoeCxfZW51bSksIHNpemVvZihjYXQoeCxfdHlwZSkpLHkpCi0KLSNkZWZpbmUgb3V0c2lkZV9zZWN0aW9uX2FkZHJlc3MocSkgKCAocSktPm91dHB1dF9vZmZzZXQgKyAocSktPm91dHB1dF9zZWN0aW9uLT52bWEpCi0KLSNkZWZpbmUgb3V0c2lkZV9zeW1ib2xfYWRkcmVzcyhxKSAoKHEpLT52YWx1ZSArICAgb3V0c2lkZV9zZWN0aW9uX2FkZHJlc3MocS0+c2VjdGlvbikpCi0KLSNkZWZpbmUgU0VDVElPTl9OQU1FX01BUF9MRU5HVEggKDE2KQotCi1QVFIKLXN0YXRfYWxsb2MgKHNpemUpCi0gICAgIHNpemVfdCBzaXplOwotewotICByZXR1cm4gb2JzdGFja19hbGxvYyAoJnN0YXRfb2JzdGFjaywgc2l6ZSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBHZW5lcmljIHRyYXZlcnNhbCByb3V0aW5lcyBmb3IgZmluZGluZyBtYXRjaGluZyBzZWN0aW9ucy4KLSovCi0KLXN0YXRpYyB2b2lkCi13YWxrX3dpbGRfc2VjdGlvbiAocHRyLCBzZWN0aW9uLCBmaWxlLCBjYWxsYmFjaywgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGNhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIC8qIERvbid0IHByb2Nlc3Mgc2VjdGlvbnMgZnJvbSBmaWxlcyB3aGljaCB3ZXJlIGV4Y2x1ZGVkLiAqLwotICBpZiAocHRyLT5leGNsdWRlX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgYm9vbGVhbiBtYXRjaDsKLQotICAgICAgaWYgKHdpbGRjYXJkcCAocHRyLT5leGNsdWRlX2ZpbGVuYW1lKSkKLSAgICAgICAgIG1hdGNoID0gZm5tYXRjaCAocHRyLT5leGNsdWRlX2ZpbGVuYW1lLCBmaWxlLT5maWxlbmFtZSwgMCkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgIG1hdGNoID0gc3RyY21wIChwdHItPmV4Y2x1ZGVfZmlsZW5hbWUsIGZpbGUtPmZpbGVuYW1lKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotCi0gICAgICBpZiAobWF0Y2gpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZpbGUtPmp1c3Rfc3ltc19mbGFnID09IGZhbHNlKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICAgICAgYm9vbGVhbiB3aWxkY2FyZDsKLQotICAgICAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQl3aWxkY2FyZCA9IGZhbHNlOwotICAgICAgZWxzZQotCXdpbGRjYXJkID0gd2lsZGNhcmRwIChzZWN0aW9uKTsKLQotICAgICAgZm9yIChzID0gZmlsZS0+dGhlX2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgYm9vbGVhbiBtYXRjaDsKLQotCSAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQkgICAgbWF0Y2ggPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmlsZS0+dGhlX2JmZCwgcyk7Ci0JICAgICAgaWYgKHdpbGRjYXJkKQotCQltYXRjaCA9IGZubWF0Y2ggKHNlY3Rpb24sIG5hbWUsIDApID09IDAgPyB0cnVlIDogZmFsc2U7Ci0JICAgICAgZWxzZQotCQltYXRjaCA9IHN0cmNtcCAoc2VjdGlvbiwgbmFtZSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAobWF0Y2gpCi0JICAgICgqY2FsbGJhY2spIChwdHIsIHMsIGZpbGUsIGRhdGEpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSBhIHdpbGQgc3RhdGVtZW50IGZvciBhIHNpbmdsZSBmaWxlIEYuICAqLwotCi1zdGF0aWMgdm9pZAotd2Fsa193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7Ci0gICAgIGNhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIGlmIChmLT50aGVfYmZkID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX2NoZWNrX2Zvcm1hdCAoZi0+dGhlX2JmZCwgYmZkX2FyY2hpdmUpKQotICAgIHdhbGtfd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmQgKm1lbWJlcjsKLQotICAgICAgLyogVGhpcyBpcyBhbiBhcmNoaXZlIGZpbGUuICBXZSBtdXN0IG1hcCBlYWNoIG1lbWJlciBvZiB0aGUKLQkgYXJjaGl2ZSBzZXBhcmF0ZWx5LiAgKi8KLSAgICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYtPnRoZV9iZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgICB3aGlsZSAobWVtYmVyICE9IE5VTEwpCi0JewotCSAgLyogV2hlbiBsb29rdXBfbmFtZSBpcyBjYWxsZWQsIGl0IHdpbGwgY2FsbCB0aGUgYWRkX3N5bWJvbHMKLQkgICAgIGVudHJ5IHBvaW50IGZvciB0aGUgYXJjaGl2ZS4gIEZvciBlYWNoIGVsZW1lbnQgb2YgdGhlCi0JICAgICBhcmNoaXZlIHdoaWNoIGlzIGluY2x1ZGVkLCBCRkQgd2lsbCBjYWxsIGxkbGFuZ19hZGRfZmlsZSwKLQkgICAgIHdoaWNoIHdpbGwgc2V0IHRoZSB1c3JkYXRhIGZpZWxkIG9mIHRoZSBtZW1iZXIgdG8gdGhlCi0JICAgICBsYW5nX2lucHV0X3N0YXRlbWVudC4gICovCi0JICBpZiAobWVtYmVyLT51c3JkYXRhICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB3YWxrX3dpbGRfc2VjdGlvbiAocywgc2VjdGlvbiwKLQkJCQkgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgbWVtYmVyLT51c3JkYXRhLAotCQkJCSBjYWxsYmFjaywgZGF0YSk7Ci0JICAgIH0KLQotCSAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZi0+dGhlX2JmZCwgbWVtYmVyKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd2Fsa193aWxkIChzLCBzZWN0aW9uLCBmaWxlLCBjYWxsYmFjaywgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBjYWxsYmFja190IGNhbGxiYWNrOwotICAgICB2b2lkICpkYXRhOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgLyogUGVyZm9ybSB0aGUgaXRlcmF0aW9uIG92ZXIgYWxsIGZpbGVzIGluIHRoZSBsaXN0LiAgKi8KLSAgICAgIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGZpbGVfY2hhaW4uaGVhZDsKLQkgICBmICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0JICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHQpCi0JewotCSAgd2Fsa193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICh3aWxkY2FyZHAgKGZpbGUpKQotICAgIHsKLSAgICAgIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGZpbGVfY2hhaW4uaGVhZDsKLQkgICBmICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0JICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHQpCi0JewotCSAgaWYgKGZubWF0Y2ggKGZpbGUsIGYtPmZpbGVuYW1lLCBGTk1fRklMRV9OQU1FKSA9PSAwKQotCSAgICB3YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQZXJmb3JtIHRoZSBpdGVyYXRpb24gb3ZlciBhIHNpbmdsZSBmaWxlLiAgKi8KLSAgICAgIGYgPSBsb29rdXBfbmFtZSAoZmlsZSk7Ci0gICAgICB3YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotICAgIH0KLX0gIAotICAgICAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCB3YWxrcyB0aGUgcGFyc2UgdHJlZSBhbmQgY2FsbHMgdGhlIHByb3ZpZGVkCi0gIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUKLSovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsIHMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgZnVuYyAocyk7Ci0KLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsIGNvbnN0cnVjdG9yX2xpc3QuaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIKLQkgICAgKGZ1bmMsCi0JICAgICBzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcgotCSAgICAoZnVuYywKLQkgICAgIHMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyIChmdW5jLAotCQkJCQkgIHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19maWxsX3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotewotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsCi0JCQkJICBzdGF0ZW1lbnRfbGlzdC5oZWFkKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLWxhbmdfbGlzdF9pbml0IChsaXN0KQotICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKmxpc3Q7Ci17Ci0gIGxpc3QtPmhlYWQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICBsaXN0LT50YWlsID0gJmxpc3QtPmhlYWQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIGJ1aWxkIGEgbmV3IHN0YXRlbWVudCBub2RlIGZvciB0aGUgcGFyc2UgdHJlZQotCi0gKi8KLQotc3RhdGljCi1sYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoKLW5ld19zdGF0ZW1lbnQgKHR5cGUsIHNpemUsIGxpc3QpCi0gICAgIGVudW0gc3RhdGVtZW50X2VudW0gdHlwZTsKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqIGxpc3Q7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ldyA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopCi0gIHN0YXRfYWxsb2MgKHNpemUpOwotCi0gIG5ldy0+aGVhZGVyLnR5cGUgPSB0eXBlOwotICBuZXctPmhlYWRlci5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kIChsaXN0LCBuZXcsICZuZXctPmhlYWRlci5uZXh0KTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyoKLSAgQnVpbGQgYSBuZXcgaW5wdXQgZmlsZSBub2RlIGZvciB0aGUgbGFuZ3VhZ2UuIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMKLSAgaW4gd2hpY2ggd2UgdHJlYXQgYW4gaW5wdXQgZmlsZSwgZWcsIHdlIG9ubHkgbG9vayBhdCBzeW1ib2xzLCBvcgotICBwcmVmaXggaXQgd2l0aCBhIC1sIGV0Yy4KLQotICBXZSBjYW4gYmUgc3VwcGxpZWQgd2l0aCByZXF1ZXN0cyBmb3IgaW5wdXQgZmlsZXMgbW9yZSB0aGFuIG9uY2U7Ci0gIHRoZXkgbWF5LCBmb3IgZXhhbXBsZSBiZSBzcGxpdCBvdmVyIHNlcnZlcmFsIGxpbmVzIGxpa2UgZm9vLm8oLnRleHQpCi0gIGZvby5vKC5kYXRhKSBldGMsIHNvIHdoZW4gYXNrZWQgZm9yIGEgZmlsZSB3ZSBjaGVjayB0aGF0IHdlIGhhdm4ndAotICBnb3QgaXQgYWxyZWFkeSBzbyB3ZSBkb24ndCBkdXBsaWNhdGUgdGhlIGJmZC4KLQotICovCi1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqCi1uZXdfYWZpbGUgKG5hbWUsIGZpbGVfdHlwZSwgdGFyZ2V0LCBhZGRfdG9fbGlzdCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBmaWxlX3R5cGU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLSAgICAgYm9vbGVhbiBhZGRfdG9fbGlzdDsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqcDsKLQotICBpZiAoYWRkX3RvX2xpc3QpCi0gICAgcCA9IG5ld19zdGF0IChsYW5nX2lucHV0X3N0YXRlbWVudCwgc3RhdF9wdHIpOwotICBlbHNlCi0gICAgewotICAgICAgcCA9ICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKQotCSAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSkpKTsKLSAgICAgIHAtPmhlYWRlci5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IHRydWU7Ci0gIHAtPnRhcmdldCA9IHRhcmdldDsKLSAgc3dpdGNoIChmaWxlX3R5cGUpCi0gICAgewotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX3N5bWJvbHNfb25seV9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IHRydWU7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IHRydWU7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gZmFsc2U7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtOgotICAgICAgcC0+aXNfYXJjaGl2ZSA9IHRydWU7Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5yZWFsID0gdHJ1ZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gY29uY2F0ICgiLWwiLCBuYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX21hcmtlcl9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IGZhbHNlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bToKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKLSAgICAgIHAtPnJlYWwgPSB0cnVlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IHRydWU7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEZBSUwgKCk7Ci0gICAgfQotICBwLT50aGVfYmZkID0gKGJmZCAqKSBOVUxMOwotICBwLT5hc3ltYm9scyA9IChhc3ltYm9sICoqKSBOVUxMOwotICBwLT5uZXh0X3JlYWxfZmlsZSA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gIHAtPm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICBwLT5zeW1ib2xfY291bnQgPSAwOwotICBwLT5keW5hbWljID0gY29uZmlnLmR5bmFtaWNfbGluazsKLSAgcC0+d2hvbGVfYXJjaGl2ZSA9IHdob2xlX2FyY2hpdmU7Ci0gIHAtPmxvYWRlZCA9IGZhbHNlOwotICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZpbnB1dF9maWxlX2NoYWluLAotCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIHAsCi0JCQkgJnAtPm5leHRfcmVhbF9maWxlKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLWxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKgotbGFuZ19hZGRfaW5wdXRfZmlsZSAobmFtZSwgZmlsZV90eXBlLCB0YXJnZXQpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgZmlsZV90eXBlOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSB0cnVlOwotICByZXR1cm4gbmV3X2FmaWxlIChuYW1lLCBmaWxlX3R5cGUsIHRhcmdldCwgdHJ1ZSk7Ci19Ci0KLS8qIEJ1aWxkIGVub3VnaCBzdGF0ZSBzbyB0aGF0IHRoZSBwYXJzZXIgY2FuIGJ1aWxkIGl0cyB0cmVlICovCi12b2lkCi1sYW5nX2luaXQgKCkKLXsKLSAgb2JzdGFja19iZWdpbiAoJnN0YXRfb2JzdGFjaywgMTAwMCk7Ci0KLSAgc3RhdF9wdHIgPSAmc3RhdGVtZW50X2xpc3Q7Ci0KLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICBsYW5nX2xpc3RfaW5pdCAoJmlucHV0X2ZpbGVfY2hhaW4pOwotICBsYW5nX2xpc3RfaW5pdCAoJmxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLSAgbGFuZ19saXN0X2luaXQgKCZmaWxlX2NoYWluKTsKLSAgZmlyc3RfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKChjaGFyICopIE5VTEwsCi0JCQkJICAgIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bSwKLQkJCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0gIGFic19vdXRwdXRfc2VjdGlvbiA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoQkZEX0FCU19TRUNUSU9OX05BTUUpOwotCi0gIGFic19vdXRwdXRfc2VjdGlvbi0+YmZkX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEEgcmVnaW9uIGlzIGFuIGFyZWEgb2YgbWVtb3J5IGRlY2xhcmVkIHdpdGggdGhlCi0gTUVNT1JZIHsgIG5hbWU6b3JnPWV4cCwgbGVuPWV4cCAuLi4gfQotIHN5bnRheC4KLQotIFdlIG1haW50YWluIGEgbGlzdCBvZiBhbGwgdGhlIHJlZ2lvbnMgaGVyZQotCi0gSWYgbm8gcmVnaW9ucyBhcmUgc3BlY2lmaWVkIGluIHRoZSBzY3JpcHQsIHRoZW4gdGhlIGRlZmF1bHQgaXMgdXNlZAotIHdoaWNoIGlzIGNyZWF0ZWQgd2hlbiBsb29rZWQgdXAgdG8gYmUgdGhlIGVudGlyZSBkYXRhIHNwYWNlCi0qLwotCi1zdGF0aWMgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKmxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0Owotc3RhdGljIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICoqbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3RfdGFpbCA9ICZsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLQotbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKgotbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKLXsKLSAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnA7Ci0KLSAgZm9yIChwID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0gICAgICAgcCAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwLT5uYW1lLCBuYW1lKSA9PSAwKQotCXsKLQkgIHJldHVybiBwOwotCX0KLSAgICB9Ci0KLSNpZiAwCi0gIC8qIFRoaXMgY29kZSB1c2VkIHRvIGFsd2F5cyB1c2UgdGhlIGZpcnN0IHJlZ2lvbiBpbiB0aGUgbGlzdCBhcyB0aGUKLSAgICAgZGVmYXVsdCByZWdpb24uICBJIGNoYW5nZWQgaXQgdG8gaW5zdGVhZCB1c2UgYSByZWdpb24KLSAgICAgZW5jb21wYXNzaW5nIGFsbCBvZiBtZW1vcnkgYXMgdGhlIGRlZmF1bHQgcmVnaW9uLiAgVGhpcyBwZXJtaXRzCi0gICAgIE5PTE9BRCBzZWN0aW9ucyB0byB3b3JrIHJlYXNvbmFibHkgd2l0aG91dCByZXF1aXJpbmcgYSByZWdpb24uCi0gICAgIFBlb3BsZSBzaG91bGQgc3BlY2lmeSB3aGF0IHJlZ2lvbiB0aGV5IG1lYW4sIGlmIHRoZXkgcmVhbGx5IHdhbnQKLSAgICAgYSByZWdpb24uICAqLwotICBpZiAoc3RyY21wIChuYW1lLCAiKmRlZmF1bHQqIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobGFuZ19tZW1vcnlfcmVnaW9uX2xpc3QgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwpCi0JewotCSAgcmV0dXJuIGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICB7Ci0gICAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKm5ldyA9Ci0gICAgKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUpKTsKLQotICAgIG5ldy0+bmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7Ci0gICAgbmV3LT5uZXh0ID0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0KLSAgICAqbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3RfdGFpbCA9IG5ldzsKLSAgICBsYW5nX21lbW9yeV9yZWdpb25fbGlzdF90YWlsID0gJm5ldy0+bmV4dDsKLSAgICBuZXctPm9yaWdpbiA9IDA7Ci0gICAgbmV3LT5mbGFncyA9IDA7Ci0gICAgbmV3LT5ub3RfZmxhZ3MgPSAwOwotICAgIG5ldy0+bGVuZ3RoID0gfihiZmRfc2l6ZV90eXBlKTA7Ci0gICAgbmV3LT5jdXJyZW50ID0gMDsKLSAgICBuZXctPmhhZF9mdWxsX21lc3NhZ2UgPSBmYWxzZTsKLQotICAgIHJldHVybiBuZXc7Ci0gIH0KLX0KLQotCi1sYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqCi1sYW5nX21lbW9yeV9kZWZhdWx0IChzZWN0aW9uKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnA7Ci0KLSAgZmxhZ3dvcmQgc2VjX2ZsYWdzID0gc2VjdGlvbi0+ZmxhZ3M7Ci0KLSAgLyogT3ZlcnJpZGUgU0VDX0RBVEEgdG8gbWVhbiBhIHdyaXRhYmxlIHNlY3Rpb24uICAqLwotICBpZiAoKHNlY19mbGFncyAmIChTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSkpID09IFNFQ19BTExPQykKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEE7Ci0KLSAgZm9yIChwID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0gICAgICAgcCAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHAtPmZsYWdzICYgc2VjX2ZsYWdzKSAhPSAwCi0JICAmJiAocC0+bm90X2ZsYWdzICYgc2VjX2ZsYWdzKSA9PSAwKQotCXsKLQkgIHJldHVybiBwOwotCX0KLSAgICB9Ci0gIHJldHVybiBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwICgiKmRlZmF1bHQqIik7Ci19Ci0KLWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKgotbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChuYW1lKQotICAgICBDT05TVCBjaGFyICpDT05TVCBuYW1lOwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp1OwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpsb29rdXA7Ci0KLSAgZm9yICh1ID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuaGVhZDsKLSAgICAgICB1ICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gICAgICAgdSA9IGxvb2t1cC0+bmV4dCkKLSAgICB7Ci0gICAgICBsb29rdXAgPSAmdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgbG9va3VwLT5uYW1lKSA9PSAwKQotCXsKLQkgIHJldHVybiBsb29rdXA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci19Ci0KLWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKgotbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChuYW1lKQotICAgICBDT05TVCBjaGFyICpDT05TVCBuYW1lOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpsb29rdXA7Ci0KLSAgbG9va3VwID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChuYW1lKTsKLSAgaWYgKGxvb2t1cCA9PSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMKQotICAgIHsKLQotICAgICAgbG9va3VwID0gKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikKLQluZXdfc3RhdCAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLSAgICAgIGxvb2t1cC0+cmVnaW9uID0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICBsb29rdXAtPmZpbGwgPSAwOwotICAgICAgbG9va3VwLT5ibG9ja192YWx1ZSA9IDE7Ci0gICAgICBsb29rdXAtPm5hbWUgPSBuYW1lOwotCi0gICAgICBsb29rdXAtPm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICAgICAgbG9va3VwLT5iZmRfc2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgbG9va3VwLT5wcm9jZXNzZWQgPSBmYWxzZTsKLSAgICAgIGxvb2t1cC0+c2VjdHlwZSA9IG5vcm1hbF9zZWN0aW9uOwotICAgICAgbG9va3VwLT5hZGRyX3RyZWUgPSAoZXRyZWVfdHlwZSAqKSBOVUxMOwotICAgICAgbGFuZ19saXN0X2luaXQgKCZsb29rdXAtPmNoaWxkcmVuKTsKLQotICAgICAgbG9va3VwLT5tZW1zcGVjID0gKENPTlNUIGNoYXIgKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+ZmxhZ3MgPSAwOwotICAgICAgbG9va3VwLT5zdWJzZWN0aW9uX2FsaWdubWVudCA9IC0xOwotICAgICAgbG9va3VwLT5zZWN0aW9uX2FsaWdubWVudCA9IC0xOwotICAgICAgbG9va3VwLT5sb2FkX2Jhc2UgPSAodW5pb24gZXRyZWVfdW5pb24gKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+cGhkcnMgPSBOVUxMOwotCi0gICAgICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCSAgICAgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgbG9va3VwLAotCQkJICAgICAmbG9va3VwLT5uZXh0KTsKLSAgICB9Ci0gIHJldHVybiBsb29rdXA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sYW5nX21hcF9mbGFncyAoZmxhZykKLSAgICAgZmxhZ3dvcmQgZmxhZzsKLXsKLSAgaWYgKGZsYWcgJiBTRUNfQUxMT0MpCi0gICAgbWluZm8gKCJhIik7Ci0KLSAgaWYgKGZsYWcgJiBTRUNfQ09ERSkKLSAgICBtaW5mbyAoIngiKTsKLQotICBpZiAoZmxhZyAmIFNFQ19SRUFET05MWSkKLSAgICBtaW5mbyAoInIiKTsKLQotICBpZiAoZmxhZyAmIFNFQ19EQVRBKQotICAgIG1pbmZvICgidyIpOwotCi0gIGlmIChmbGFnICYgU0VDX0xPQUQpCi0gICAgbWluZm8gKCJsIik7Ci19Ci0KLXZvaWQKLWxhbmdfbWFwICgpCi17Ci0gIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICptOwotCi0gIG1pbmZvIChfKCJcbk1lbW9yeSBDb25maWd1cmF0aW9uXG5cbiIpKTsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiJS0xNnMgJS0xOHMgJS0xOHMgJXNcbiIsCi0JICAgXygiTmFtZSIpLCBfKCJPcmlnaW4iKSwgXygiTGVuZ3RoIiksIF8oIkF0dHJpYnV0ZXMiKSk7Ci0KLSAgZm9yIChtID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0gICAgICAgbSAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBtID0gbS0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlsxMDBdOwotICAgICAgaW50IGxlbjsKLQotICAgICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiJS0xNnMgIiwgbS0+bmFtZSk7Ci0KLSAgICAgIHNwcmludGZfdm1hIChidWYsIG0tPm9yaWdpbik7Ci0gICAgICBtaW5mbyAoIjB4JXMgIiwgYnVmKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmKTsKLSAgICAgIHdoaWxlIChsZW4gPCAxNikKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgbWluZm8gKCIweCVWIiwgbS0+bGVuZ3RoKTsKLSAgICAgIGlmIChtLT5mbGFncyB8fCBtLT5ub3RfZmxhZ3MpCi0JewotI2lmbmRlZiBCRkQ2NAotCSAgbWluZm8gKCIgICAgICAgICIpOwotI2VuZGlmCi0JICBpZiAobS0+ZmxhZ3MpCi0JICAgIHsKLQkgICAgICBwcmludF9zcGFjZSAoKTsKLQkgICAgICBsYW5nX21hcF9mbGFncyAobS0+ZmxhZ3MpOwotCSAgICB9Ci0KLQkgIGlmIChtLT5ub3RfZmxhZ3MpCi0JICAgIHsKLQkgICAgICBtaW5mbyAoIiAhIik7Ci0JICAgICAgbGFuZ19tYXBfZmxhZ3MgKG0tPm5vdF9mbGFncyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByaW50X25sICgpOwotICAgIH0KLQotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsIF8oIlxuTGlua2VyIHNjcmlwdCBhbmQgbWVtb3J5IG1hcFxuXG4iKSk7Ci0KLSAgcHJpbnRfc3RhdGVtZW50cyAoKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbiBvdXRwdXQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1pbml0X29zIChzKQotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzOwotewotICBzZWN0aW9uX3VzZXJkYXRhX3R5cGUgKm5ldzsKLQotICBpZiAocy0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHN0cmNtcCAocy0+bmFtZSwgRElTQ0FSRF9TRUNUSU9OX05BTUUpID09IDApCi0gICAgZWluZm8gKF8oIiVQJUY6IElsbGVnYWwgdXNlIG9mIGAlcycgc2VjdGlvbiIpLCBESVNDQVJEX1NFQ1RJT05fTkFNRSk7Ci0KLSAgbmV3ID0gKChzZWN0aW9uX3VzZXJkYXRhX3R5cGUgKikKLQkgc3RhdF9hbGxvYyAoc2l6ZW9mIChzZWN0aW9uX3VzZXJkYXRhX3R5cGUpKSk7Ci0KLSAgcy0+YmZkX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgcy0+bmFtZSk7Ci0gIGlmIChzLT5iZmRfc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICBzLT5iZmRfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIHMtPm5hbWUpOwotICBpZiAocy0+YmZkX3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiksCi0JICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBzLT5uYW1lKTsKLSAgICB9Ci0gIHMtPmJmZF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IHMtPmJmZF9zZWN0aW9uOwotCi0gIC8qIFdlIGluaXRpYWxpemUgYW4gb3V0cHV0IHNlY3Rpb25zIG91dHB1dCBvZmZzZXQgdG8gbWludXMgaXRzIG93biAqLwotICAvKiB2bWEgdG8gYWxsb3cgdXMgdG8gb3V0cHV0IGEgc2VjdGlvbiB0aHJvdWdoIGl0c2VsZiAqLwotICBzLT5iZmRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IDA7Ci0gIGdldF91c2VyZGF0YSAocy0+YmZkX3NlY3Rpb24pID0gKFBUUikgbmV3OwotCi0gIC8qIElmIHRoZXJlIGlzIGEgYmFzZSBhZGRyZXNzLCBtYWtlIHN1cmUgdGhhdCBhbnkgc2VjdGlvbnMgaXQgbWlnaHQKLSAgICAgbWVudGlvbiBhcmUgaW5pdGlhbGl6ZWQuICAqLwotICBpZiAocy0+YWRkcl90cmVlICE9IE5VTEwpCi0gICAgZXhwX2luaXRfb3MgKHMtPmFkZHJfdHJlZSk7Ci19Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGFsbCBvdXRwdXQgc2VjdGlvbnMgbWVudGlvbmVkIGluIGFuIGV4cHJlc3Npb24gYXJlCi0gICBpbml0aWFsaXplZC4gICovCi0KLXN0YXRpYyB2b2lkCi1leHBfaW5pdF9vcyAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGV4cF9pbml0X29zIChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGV4cF9pbml0X29zIChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGV4cF9pbml0X29zIChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9uYW1lOgotICAgICAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jb2RlKQotCXsKLQljYXNlIEFERFI6Ci0JY2FzZSBMT0FEQUREUjoKLQljYXNlIFNJWkVPRjoKLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLQkgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKGV4cC0+bmFtZS5uYW1lKTsKLQkgICAgaWYgKG9zICE9IE5VTEwgJiYgb3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgaW5pdF9vcyAob3MpOwotCSAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogU2VjdGlvbnMgbWFya2VkIHdpdGggdGhlIFNFQ19MSU5LX09OQ0UgZmxhZyBzaG91bGQgb25seSBiZSBsaW5rZWQKLSAgIG9uY2UgaW50byB0aGUgb3V0cHV0LiAgVGhpcyByb3V0aW5lIGNoZWNrcyBlYWNoIHNlY3Rpb25zLCBhbmQKLSAgIGFycmFuZ2VzIHRvIGRpc2NhcmQgaXQgaWYgYSBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkKLSAgIGJlZW4gbGlua2VkLiAgVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBhbGwgcmVsZXZhbnQgc2VjdGlvbnMgaGF2ZSB0aGUKLSAgIFNFQ19MSU5LX09OQ0UgZmxhZyBzZXQ7IHRoYXQgaXMsIGl0IGRvZXMgbm90IGRlcGVuZCBzb2xlbHkgdXBvbiB0aGUKLSAgIHNlY3Rpb24gbmFtZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1zZWN0aW9uX2FscmVhZHlfbGlua2VkIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZGF0YTsKLSAgc3RydWN0IHNlY19saW5rX29uY2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2VjX2xpbmtfb25jZSAqbmV4dDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgfTsKLSAgc3RhdGljIHN0cnVjdCBzZWNfbGlua19vbmNlICpzZWNfbGlua19vbmNlX2xpc3Q7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3Qgc2VjX2xpbmtfb25jZSAqbDsKLQotICAvKiBJZiB3ZSBhcmUgb25seSByZWFkaW5nIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCwgdGhlbiB3ZSB3YW50IHRvCi0gICAgIGRpc2NhcmQgYWxsIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGVudHJ5LT5qdXN0X3N5bXNfZmxhZykKLSAgICB7Ci0gICAgICBzZWMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIHNlYy0+b3V0cHV0X29mZnNldCA9IHNlYy0+dm1hOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLQotICBpZiAoKGZsYWdzICYgU0VDX0xJTktfT05DRSkgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogRklYTUU6IFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgbWF5IGhhdmUgdHJvdWJsZQotICAgICBjb3B5aW5nIHJlbG9jYXRpb25zIGluIG90aGVyIHNlY3Rpb25zIHRoYXQgcmVmZXIgdG8gbG9jYWwgc3ltYm9scwotICAgICBpbiB0aGUgc2VjdGlvbiBiZWluZyBkaXNjYXJkZWQuICBUaG9zZSByZWxvY2F0aW9ucyB3aWxsIGhhdmUgdG8KLSAgICAgYmUgY29udmVydGVkIHNvbWVob3c7IGFzIG9mIHRoaXMgd3JpdGluZyBJJ20gbm90IHN1cmUgdGhhdCBhbnkgb2YKLSAgICAgdGhlIGJhY2tlbmRzIGhhbmRsZSB0aGF0IGNvcnJlY3RseS4KLQotICAgICBJdCBpcyB0ZW1wdGluZyB0byBpbnN0ZWFkIG5vdCBkaXNjYXJkIGxpbmsgb25jZSBzZWN0aW9ucyB3aGVuCi0gICAgIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsgKHRlY2huaWNhbGx5LCB0aGV5IHNob3VsZCBiZSBkaXNjYXJkZWQKLSAgICAgd2hlbmV2ZXIgd2UgYXJlIGJ1aWxkaW5nIGNvbnN0cnVjdG9ycykuICBIb3dldmVyLCB0aGF0IGZhaWxzLAotICAgICBiZWNhdXNlIHRoZSBsaW5rZXIgd2luZHMgdXAgY29tYmluaW5nIGFsbCB0aGUgbGluayBvbmNlIHNlY3Rpb25zCi0gICAgIGludG8gYSBzaW5nbGUgbGFyZ2UgbGluayBvbmNlIHNlY3Rpb24sIHdoaWNoIGRlZmVhdHMgdGhlIHB1cnBvc2UKLSAgICAgb2YgaGF2aW5nIGxpbmsgb25jZSBzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGxhY2UuCi0KLSAgICAgQWxzbywgbm90IG1lcmdpbmcgbGluayBvbmNlIHNlY3Rpb25zIGluIGEgcmVsb2NhdGVhYmxlIGxpbmsKLSAgICAgY2F1c2VzIHRyb3VibGUgZm9yIE1JUFMgRUxGLCB3aGljaCByZWxpZXMgaW4gbGluayBvbmNlIHNlbWFudGljcwotICAgICB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIHNlY3Rpb24gY29ycmVjdGx5LiAgKi8KLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgZm9yIChsID0gc2VjX2xpbmtfb25jZV9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChsLT5zZWMtPm93bmVyLCBsLT5zZWMpKSA9PSAwKQotCXsKLQkgIC8qIFRoZSBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gbGlua2VkLiAgU2VlIGlmIHdlIHNob3VsZAotICAgICAgICAgICAgIGlzc3VlIGEgd2FybmluZy4gICovCi0JICBzd2l0Y2ggKGZsYWdzICYgU0VDX0xJTktfRFVQTElDQVRFUykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKLQkgICAgICBlaW5mbyAoXygiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnXG4iKSwKLQkJICAgICBhYmZkLCBuYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSBkaWcgb3V0IHRoZSBjb250ZW50cyBvZiBib3RoCi0gICAgICAgICAgICAgICAgIHNlY3Rpb25zIGFuZCBtZW1jbXAgdGhlbS4gIFRoZSBDT0ZGL1BFIHNwZWMgc2F5cyB0aGF0Ci0gICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IGltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICAgICAgIGNvcnJlY3RseSwgc28gSSdtIG5vdCBnb2luZyB0byBib3RoZXIgZG9pbmcgaXQKLSAgICAgICAgICAgICAgICAgZWl0aGVyLiAgKi8KLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCSAgICAgIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgIT0gYmZkX3NlY3Rpb25fc2l6ZSAobC0+c2VjLT5vd25lciwgbC0+c2VjKSkKLQkJZWluZm8gKF8oIiVQOiAlQjogd2FybmluZzogZHVwbGljYXRlIHNlY3Rpb24gYCVzJyBoYXMgZGlmZmVyZW50IHNpemVcbiIpLAotCQkgICAgICAgYWJmZCwgbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU2V0IHRoZSBvdXRwdXRfc2VjdGlvbiBmaWVsZCBzbyB0aGF0IHdpbGRfZG9pdCBkb2VzIG5vdAotCSAgICAgY3JlYXRlIGEgbGFuZ19pbnB1dF9zZWN0aW9uIHN0cnVjdHVyZSBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgUmVjb3JkIGl0LiAgKi8KLQotICBsID0gKHN0cnVjdCBzZWNfbGlua19vbmNlICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIGwtPnNlYyA9IHNlYzsKLSAgbC0+bmV4dCA9IHNlY19saW5rX29uY2VfbGlzdDsKLSAgc2VjX2xpbmtfb25jZV9saXN0ID0gbDsKLX0KLQwKLS8qIFRoZSB3aWxkIHJvdXRpbmVzLgotCi0gICBUaGVzZSBleHBhbmQgc3RhdGVtZW50cyBsaWtlICooLnRleHQpIGFuZCBmb28ubyB0byBhIGxpc3Qgb2YKLSAgIGV4cGxpY2l0IGFjdGlvbnMsIGxpa2UgZm9vLm8oLnRleHQpLCBiYXIubygudGV4dCkgYW5kCi0gICBmb28ubygudGV4dCwgLmRhdGEpLiAgKi8KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIFBBVFRFUk4gYXJndW1lbnQgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLgotICAgQWx0aG91Z2ggYmFja3NsYXNoZXMgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5IGlmIGEgcGF0dGVybiBjb250YWlucwotICAgd2lsZGNhcmRzLCB3ZSBkbyBub3QgY29uc2lkZXIgdGhlIG1lcmUgcHJlc2VuY2Ugb2YgYSBiYWNrc2xhc2ggdG8KLSAgIGJlIGVub3VnaCB0byBjYXVzZSB0aGUgdGhlIHBhdHRlcm4gdG8gYmUgdHJlYXRlZCBhcyBhIHdpbGRjYXJkLgotICAgVGhhdCBsZXRzIHVzIGhhbmRsZSBET1MgZmlsZW5hbWVzIG1vcmUgbmF0dXJhbGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXdpbGRjYXJkcCAocGF0dGVybikKLSAgICAgY29uc3QgY2hhciAqcGF0dGVybjsKLXsKLSAgY29uc3QgY2hhciAqczsKLQotICBmb3IgKHMgPSBwYXR0ZXJuOyAqcyAhPSAnXDAnOyArK3MpCi0gICAgaWYgKCpzID09ICc/JwotCXx8ICpzID09ICcqJwotCXx8ICpzID09ICdbJykKLSAgICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCBTRUNUSU9OIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBPVVRQVVQuICBEbyB0aGlzIGJ5IGNyZWF0aW5nIGEKLSAgIGxhbmdfaW5wdXRfc2VjdGlvbiBzdGF0ZW1lbnQgd2hpY2ggaXMgcGxhY2VkIGF0IFBUUi4gIEZJTEUgaXMgdGhlCi0gICBpbnB1dCBmaWxlIHdoaWNoIGhvbGRzIFNFQ1RJT04uICAqLwotCi12b2lkCi13aWxkX2RvaXQgKHB0ciwgc2VjdGlvbiwgb3V0cHV0LCBmaWxlKQotICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnB0cjsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGJvb2xlYW4gZGlzY2FyZDsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc2VjdGlvbi0+b3duZXIsIHNlY3Rpb24pOwotCi0gIGRpc2NhcmQgPSBmYWxzZTsKLQotICAvKiBJZiB3ZSBhcmUgZG9pbmcgYSBmaW5hbCBsaW5rLCBkaXNjYXJkIHNlY3Rpb25zIG1hcmtlZCB3aXRoCi0gICAgIFNFQ19FWENMVURFLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgKGZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApCi0gICAgZGlzY2FyZCA9IHRydWU7Ci0KLSAgLyogRGlzY2FyZCBpbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgYXNzaWduZWQgdG8gYSBzZWN0aW9uIG5hbWVkCi0gICAgIERJU0NBUkRfU0VDVElPTl9OQU1FLiAgKi8KLSAgaWYgKHN0cmNtcCAob3V0cHV0LT5uYW1lLCBESVNDQVJEX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICBkaXNjYXJkID0gdHJ1ZTsKLQotICAvKiBEaXNjYXJkIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiB3ZSBhcmUgc3RyaXBwaW5nIGRlYnVnZ2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGlmICgobGlua19pbmZvLnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyIHx8IGxpbmtfaW5mby5zdHJpcCA9PSBzdHJpcF9hbGwpCi0gICAgICAmJiAoZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIGRpc2NhcmQgPSB0cnVlOwotCi0gIGlmIChkaXNjYXJkKQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgcHJldmVudHMgZnV0dXJlIGNhbGxzIGZyb20gYXNzaWduaW5nIHRoaXMgc2VjdGlvbi4gICovCi0JICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBib29sZWFuIGZpcnN0OwotICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKm5ldzsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICBpZiAob3V0cHV0LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGluaXRfb3MgKG91dHB1dCk7Ci0JICBmaXJzdCA9IHRydWU7Ci0JfQotICAgICAgZWxzZQotCWZpcnN0ID0gZmFsc2U7Ci0KLSAgICAgIC8qIEFkZCBhIHNlY3Rpb24gcmVmZXJlbmNlIHRvIHRoZSBsaXN0ICovCi0gICAgICBuZXcgPSBuZXdfc3RhdCAobGFuZ19pbnB1dF9zZWN0aW9uLCBwdHIpOwotCi0gICAgICBuZXctPnNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmV3LT5pZmlsZSA9IGZpbGU7Ci0gICAgICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dC0+YmZkX3NlY3Rpb247Ci0KLSAgICAgIGZsYWdzID0gc2VjdGlvbi0+ZmxhZ3M7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGNvcHkgdGhlIFNFQ19ORVZFUl9MT0FEIGZsYWcgZnJvbSBhbiBpbnB1dCBzZWN0aW9uCi0JIHRvIGFuIG91dHB1dCBzZWN0aW9uLCBiZWNhdXNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBpbmNsdWRlIGEKLQkgU0VDX05FVkVSX0xPQUQgc2VjdGlvbiBpbiB0aGUgbWlkZGxlIG9mIGFuIG90aGVyd2lzZSBsb2FkZWQKLQkgc2VjdGlvbiAoSSBkb24ndCBrbm93IHdoeSB3ZSB3YW50IHRvIGRvIHRoaXMsIGJ1dCB3ZSBkbykuCi0JIGJ1aWxkX2xpbmtfb3JkZXIgaW4gbGR3cml0ZS5jIGhhbmRsZXMgdGhpcyBjYXNlIGJ5IHR1cm5pbmcKLQkgdGhlIGVtYmVkZGVkIFNFQ19ORVZFUl9MT0FEIHNlY3Rpb24gaW50byBhIGZpbGwuICAqLwotCi0gICAgICBmbGFncyAmPSB+IFNFQ19ORVZFUl9MT0FEOwotCi0gICAgICAvKiBJZiBmaW5hbCBsaW5rLCBkb24ndCBjb3B5IHRoZSBTRUNfTElOS19PTkNFIGZsYWdzLCB0aGV5J3ZlCi0JIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuICBPbmUgcmVhc29uIHRvIGRvIHRoaXMgaXMgdGhhdCBvbiBwZQotCSBmb3JtYXQgdGFyZ2V0cywgLnRleHQkZm9vIHNlY3Rpb25zIGdvIGludG8gLnRleHQgYW5kIGl0J3Mgb2RkCi0JIHRvIHNlZSAudGV4dCB3aXRoIFNFQ19MSU5LX09OQ0Ugc2V0LiAgKi8KLQotICAgICAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlmbGFncyAmPSB+IChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBpbnB1dCBzZWN0aW9uLCBhbmQgdGhlIFNFQ19SRUFET05MWQotICAgICAgICAgZmxhZyBpcyBub3QgY3VycmVudGx5IHNldCwgdGhlbiBkb24ndCBzZXQgaXQganVzdCBiZWNhdXNlIHRoZQotICAgICAgICAgaW5wdXQgc2VjdGlvbiBoYXMgaXQgc2V0LiAgKi8KLQotICAgICAgaWYgKCEgZmlyc3QgJiYgKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQlmbGFncyAmPSB+IFNFQ19SRUFET05MWTsKLQotICAgICAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzIHw9IGZsYWdzOwotCi0gICAgICAvKiBJZiBTRUNfUkVBRE9OTFkgaXMgbm90IHNldCBpbiB0aGUgaW5wdXQgc2VjdGlvbiwgdGhlbiBjbGVhcgotICAgICAgICAgaXQgZnJvbSB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJj0gflNFQ19SRUFET05MWTsKLQotICAgICAgc3dpdGNoIChvdXRwdXQtPnNlY3R5cGUpCi0JewotCWNhc2Ugbm9ybWFsX3NlY3Rpb246Ci0JICBicmVhazsKLQljYXNlIGRzZWN0X3NlY3Rpb246Ci0JY2FzZSBjb3B5X3NlY3Rpb246Ci0JY2FzZSBpbmZvX3NlY3Rpb246Ci0JY2FzZSBvdmVybGF5X3NlY3Rpb246Ci0JICBvdXRwdXQtPmJmZF9zZWN0aW9uLT5mbGFncyAmPSB+U0VDX0FMTE9DOwotCSAgYnJlYWs7Ci0JY2FzZSBub2xvYWRfc2VjdGlvbjoKLQkgIG91dHB1dC0+YmZkX3NlY3Rpb24tPmZsYWdzICY9IH5TRUNfTE9BRDsKLQkgIG91dHB1dC0+YmZkX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID4gb3V0cHV0LT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKQotCW91dHB1dC0+YmZkX3NlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcjsKLQotICAgICAgLyogSWYgc3VwcGxpZWQgYW4gYWxpZ21lbnQsIHRoZW4gZm9yY2UgaXQuICAqLwotICAgICAgaWYgKG91dHB1dC0+c2VjdGlvbl9hbGlnbm1lbnQgIT0gLTEpCi0Jb3V0cHV0LT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gb3V0cHV0LT5zZWN0aW9uX2FsaWdubWVudDsKLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB3aWxkY2FyZCBzb3J0aW5nLiAgVGhpcyByZXR1cm5zIHRoZSBsYW5nX2lucHV0X3NlY3Rpb24gd2hpY2gKLSAgIHNob3VsZCBmb2xsb3cgdGhlIG9uZSB3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlIGZvciBTRUNUSU9OIGFuZCBGSUxFLAotICAgYmFzZWQgb24gdGhlIHNvcnRpbmcgcmVxdWlyZW1lbnRzIG9mIFdJTEQuICBJdCByZXR1cm5zIE5VTEwgaWYgdGhlCi0gICBuZXcgc2VjdGlvbiBzaG91bGQganVzdCBnbyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpc3QuICAqLwotCi1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqCi13aWxkX3NvcnQgKHdpbGQsIGZpbGUsIHNlY3Rpb24pCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqd2lsZDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbDsKLQotICBpZiAoISB3aWxkLT5maWxlbmFtZXNfc29ydGVkICYmICEgd2lsZC0+c2VjdGlvbnNfc29ydGVkKQotICAgIHJldHVybiBOVUxMOwotCi0gIHNlY3Rpb25fbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChmaWxlLT50aGVfYmZkLCBzZWN0aW9uKTsKLSAgZm9yIChsID0gd2lsZC0+Y2hpbGRyZW4uaGVhZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqbHM7Ci0KLSAgICAgIGlmIChsLT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkKLQljb250aW51ZTsKLSAgICAgIGxzID0gJmwtPmlucHV0X3NlY3Rpb247Ci0KLSAgICAgIC8qIFNvcnRpbmcgYnkgZmlsZW5hbWUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHNvcnRpbmcgYnkgc2VjdGlvbgotICAgICAgICAgbmFtZS4gICovCi0KLSAgICAgIGlmICh3aWxkLT5maWxlbmFtZXNfc29ydGVkKQotCXsKLQkgIGNvbnN0IGNoYXIgKmZuLCAqbG47Ci0JICBib29sZWFuIGZhLCBsYTsKLQkgIGludCBpOwotCi0JICAvKiBUaGUgUEUgc3VwcG9ydCBmb3IgdGhlIC5pZGF0YSBzZWN0aW9uIGFzIGdlbmVyYXRlZCBieQotICAgICAgICAgICAgIGRsbHRvb2wgYXNzdW1lcyB0aGF0IGZpbGVzIHdpbGwgYmUgc29ydGVkIGJ5IHRoZSBuYW1lIG9mCi0gICAgICAgICAgICAgdGhlIGFyY2hpdmUgYW5kIHRoZW4gdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2l0aGluIHRoZQotICAgICAgICAgICAgIGFyY2hpdmUuICAqLwotCi0JICBpZiAoZmlsZS0+dGhlX2JmZCAhPSBOVUxMCi0JICAgICAgJiYgYmZkX215X2FyY2hpdmUgKGZpbGUtPnRoZV9iZmQpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmbiA9IGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChmaWxlLT50aGVfYmZkKSk7Ci0JICAgICAgZmEgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmbiA9IGZpbGUtPmZpbGVuYW1lOwotCSAgICAgIGZhID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGxzLT5pZmlsZS0+dGhlX2JmZCAhPSBOVUxMCi0JICAgICAgJiYgYmZkX215X2FyY2hpdmUgKGxzLT5pZmlsZS0+dGhlX2JmZCkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxuID0gYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGxzLT5pZmlsZS0+dGhlX2JmZCkpOwotCSAgICAgIGxhID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG4gPSBscy0+aWZpbGUtPmZpbGVuYW1lOwotCSAgICAgIGxhID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaSA9IHN0cmNtcCAoZm4sIGxuKTsKLQkgIGlmIChpID4gMCkKLQkgICAgY29udGludWU7Ci0JICBlbHNlIGlmIChpIDwgMCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChmYSB8fCBsYSkKLQkgICAgewotCSAgICAgIGlmIChmYSkKLQkJZm4gPSBmaWxlLT5maWxlbmFtZTsKLQkgICAgICBpZiAobGEpCi0JCWxuID0gbHMtPmlmaWxlLT5maWxlbmFtZTsKLQotCSAgICAgIGkgPSBzdHJjbXAgKGZuLCBsbik7Ci0JICAgICAgaWYgKGkgPiAwKQotCQljb250aW51ZTsKLQkgICAgICBlbHNlIGlmIChpIDwgMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEhlcmUgZWl0aGVyIHRoZSBmaWxlcyBhcmUgbm90IHNvcnRlZCBieSBuYW1lLCBvciB3ZSBhcmUKLSAgICAgICAgIGxvb2tpbmcgYXQgdGhlIHNlY3Rpb25zIGZvciB0aGlzIGZpbGUuICAqLwotCi0gICAgICBpZiAod2lsZC0+c2VjdGlvbnNfc29ydGVkKQotCXsKLQkgIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwKLQkJICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGxzLT5pZmlsZS0+dGhlX2JmZCwKLQkJCQkJICAgIGxzLT5zZWN0aW9uKSkKLQkgICAgICA8IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGw7Ci19Ci0KLS8qIEV4cGFuZCBhIHdpbGQgc3RhdGVtZW50IGZvciBhIHBhcnRpY3VsYXIgRklMRS4gIFNFQ1RJT04gbWF5IGJlCi0gICBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgd2lsZCBjYXJkLiAgKi8KLQotc3RhdGljIHZvaWQKLW91dHB1dF9zZWN0aW9uX2NhbGxiYWNrIChwdHIsIHNlY3Rpb24sIGZpbGUsIG91dHB1dCkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICB2b2lkICpvdXRwdXQ7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmJlZm9yZTsKLSAgCi0gIC8qIElmIHRoZSB3aWxkIHBhdHRlcm4gd2FzIG1hcmtlZCBLRUVQLCB0aGUgbWVtYmVyIHNlY3Rpb25zCi0gICAgIHNob3VsZCBiZSBhcyB3ZWxsLiAgKi8KLSAgaWYgKHB0ci0+a2VlcF9zZWN0aW9ucykKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLSAgCi0gIGJlZm9yZSA9IHdpbGRfc29ydCAocHRyLCBmaWxlLCBzZWN0aW9uKTsKLSAgCi0gIC8qIEhlcmUgQkVGT1JFIHBvaW50cyB0byB0aGUgbGFuZ19pbnB1dF9zZWN0aW9uIHdoaWNoCi0gICAgIHNob3VsZCBmb2xsb3cgdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gYWRkLiAgSWYgQkVGT1JFCi0gICAgIGlzIE5VTEwsIHRoZW4gdGhlIHNlY3Rpb24gc2hvdWxkIGp1c3QgZ28gYXQgdGhlIGVuZAotICAgICBvZiB0aGUgY3VycmVudCBsaXN0LiAgKi8KLSAgCi0gIGlmIChiZWZvcmUgPT0gTlVMTCkKLSAgICB3aWxkX2RvaXQgKCZwdHItPmNoaWxkcmVuLCBzZWN0aW9uLCAKLQkgICAgICAgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgb3V0cHV0LCAKLQkgICAgICAgZmlsZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgbGlzdDsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwcDsKLSAgICAgIAotICAgICAgbGFuZ19saXN0X2luaXQgKCZsaXN0KTsKLSAgICAgIHdpbGRfZG9pdCAoJmxpc3QsIHNlY3Rpb24sIAotCQkgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgb3V0cHV0LCAKLQkJIGZpbGUpOwotICAgICAgCi0gICAgICAvKiBJZiB3ZSBhcmUgZGlzY2FyZGluZyB0aGUgc2VjdGlvbiwgTElTVC5IRUFEIHdpbGwKLQkgYmUgTlVMTC4gICovCi0gICAgICBpZiAobGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgQVNTRVJUIChsaXN0LmhlYWQtPm5leHQgPT0gTlVMTCk7Ci0JICAKLQkgIGZvciAocHAgPSAmcHRyLT5jaGlsZHJlbi5oZWFkOwotCSAgICAgICAqcHAgIT0gYmVmb3JlOwotCSAgICAgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQkgICAgQVNTRVJUICgqcHAgIT0gTlVMTCk7Ci0JICAKLQkgIGxpc3QuaGVhZC0+bmV4dCA9ICpwcDsKLQkgICpwcCA9IGxpc3QuaGVhZDsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIHBhc3NlZCBhIGZpbGUgbmFtZSB3aGljaCBtdXN0IGhhdmUgYmVlbiBzZWVuIGFscmVhZHkgYW5kCi0gICBhZGRlZCB0byB0aGUgc3RhdGVtZW50IHRyZWUuICBXZSB3aWxsIHNlZSBpZiBpdCBoYXMgYmVlbiBvcGVuZWQKLSAgIGFscmVhZHkgYW5kIGhhZCBpdHMgc3ltYm9scyByZWFkLiAgSWYgbm90IHRoZW4gd2UnbGwgcmVhZCBpdC4gICovCi0KLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICoKLWxvb2t1cF9uYW1lIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzZWFyY2g7Ci0KLSAgZm9yIChzZWFyY2ggPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBpbnB1dF9maWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgc2VhcmNoICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0gICAgICAgc2VhcmNoID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgc2VhcmNoLT5uZXh0X3JlYWxfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAoc2VhcmNoLT5maWxlbmFtZSA9PSAoY2hhciAqKSBOVUxMICYmIG5hbWUgPT0gKGNoYXIgKikgTlVMTCkKLQlyZXR1cm4gc2VhcmNoOwotICAgICAgaWYgKHNlYXJjaC0+ZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTAotCSAgJiYgbmFtZSAhPSAoY2hhciAqKSBOVUxMCi0JICAmJiBzdHJjbXAgKHNlYXJjaC0+ZmlsZW5hbWUsIG5hbWUpID09IDApCi0JYnJlYWs7Ci0gICAgfQotCi0gIGlmIChzZWFyY2ggPT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTCkKLSAgICBzZWFyY2ggPSBuZXdfYWZpbGUgKG5hbWUsIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0sIGRlZmF1bHRfdGFyZ2V0LAotCQkJZmFsc2UpOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBhZGRlZCB0aGlzIGZpbGUsIG9yIHRoaXMgZmlsZSBpcyBub3QgcmVhbAotICAgICAoRklYTUU6IGNhbiB0aGF0IGV2ZXIgYWN0dWFsbHkgaGFwcGVuPykgb3IgdGhlIG5hbWUgaXMgTlVMTAotICAgICAoRklYTUU6IGNhbiB0aGF0IGV2ZXIgYWN0dWFsbHkgaGFwcGVuPykgZG9uJ3QgYWRkIHRoaXMgZmlsZS4gICovCi0gIGlmIChzZWFyY2gtPmxvYWRlZAotICAgICAgfHwgISBzZWFyY2gtPnJlYWwKLSAgICAgIHx8IHNlYXJjaC0+ZmlsZW5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLSAgICByZXR1cm4gc2VhcmNoOwotCi0gIGxvYWRfc3ltYm9scyAoc2VhcmNoLCAobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICopIE5VTEwpOwotCi0gIHJldHVybiBzZWFyY2g7Ci19Ci0KLS8qIEdldCB0aGUgc3ltYm9scyBmb3IgYW4gaW5wdXQgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1sb2FkX3N5bWJvbHMgKGVudHJ5LCBwbGFjZSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqcGxhY2U7Ci17Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBpZiAoZW50cnktPmxvYWRlZCkKLSAgICByZXR1cm47Ci0KLSAgbGRmaWxlX29wZW5fZmlsZSAoZW50cnkpOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfYXJjaGl2ZSkKLSAgICAgICYmICEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChlbnRyeS0+dGhlX2JmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfZXJyb3JfdHlwZSBlcnI7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKmhvbGQ7Ci0KLSAgICAgIGVyciA9IGJmZF9nZXRfZXJyb3IgKCk7Ci0gICAgICBpZiAoZXJyID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgY2hhciAqKnA7Ci0KLQkgIGVpbmZvIChfKCIlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIpLCBlbnRyeS0+dGhlX2JmZCk7Ci0JICBlaW5mbyAoXygiJUI6IG1hdGNoaW5nIGZvcm1hdHM6IiksIGVudHJ5LT50aGVfYmZkKTsKLQkgIGZvciAocCA9IG1hdGNoaW5nOyAqcCAhPSBOVUxMOyBwKyspCi0JICAgIGVpbmZvICgiICVzIiwgKnApOwotCSAgZWluZm8gKCIlRlxuIik7Ci0JfQotICAgICAgZWxzZSBpZiAoZXJyICE9IGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkCi0JICAgICAgIHx8IHBsYWNlID09IE5VTEwpCi0JZWluZm8gKF8oIiVGJUI6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iKSwgZW50cnktPnRoZV9iZmQpOwotCi0gICAgICBiZmRfY2xvc2UgKGVudHJ5LT50aGVfYmZkKTsKLSAgICAgIGVudHJ5LT50aGVfYmZkID0gTlVMTDsKLQotICAgICAgLyogU2VlIGlmIHRoZSBlbXVsYXRpb24gaGFzIHNvbWUgc3BlY2lhbCBrbm93bGVkZ2UuICAqLwotCi0gICAgICBpZiAobGRlbXVsX3VucmVjb2duaXplZF9maWxlIChlbnRyeSkpCi0JcmV0dXJuOwotCi0gICAgICAvKiBUcnkgdG8gaW50ZXJwcmV0IHRoZSBmaWxlIGFzIGEgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAoZW50cnktPmZpbGVuYW1lKTsKLQotICAgICAgaG9sZCA9IHN0YXRfcHRyOwotICAgICAgc3RhdF9wdHIgPSBwbGFjZTsKLQotICAgICAgbGRmaWxlX2Fzc3VtZWRfc2NyaXB0ID0gdHJ1ZTsKLSAgICAgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKLSAgICAgIHl5cGFyc2UgKCk7Ci0gICAgICBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSBmYWxzZTsKLQotICAgICAgc3RhdF9wdHIgPSBob2xkOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChsZGVtdWxfcmVjb2duaXplZF9maWxlIChlbnRyeSkpCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIGRvbid0IGNhbGwgbGRsYW5nX2FkZF9maWxlIGZvciBhbiBhcmNoaXZlLiAgSW5zdGVhZCwgdGhlCi0gICAgIGFkZF9zeW1ib2xzIGVudHJ5IHBvaW50IHdpbGwgY2FsbCBsZGxhbmdfYWRkX2ZpbGUsIHZpYSB0aGUKLSAgICAgYWRkX2FyY2hpdmVfZWxlbWVudCBjYWxsYmFjaywgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJjaGl2ZQotICAgICB3aGljaCBpcyB1c2VkLiAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoZW50cnktPnRoZV9iZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICBsZGxhbmdfYWRkX2ZpbGUgKGVudHJ5KTsKLSAgICAgIGlmICh0cmFjZV9maWxlcyB8fCB0cmFjZV9maWxlX3RyaWVzKQotCWluZm9fbXNnICgiJUlcbiIsIGVudHJ5KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIGlmIChlbnRyeS0+d2hvbGVfYXJjaGl2ZSkKLQl7Ci0JICBiZmQgKm1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGVudHJ5LT50aGVfYmZkLAotCQkJCQkJICAgICAgKGJmZCAqKSBOVUxMKTsKLQkgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKG1lbWJlciwgYmZkX29iamVjdCkpCi0JCWVpbmZvIChfKCIlRiVCOiBvYmplY3QgJUIgaW4gYXJjaGl2ZSBpcyBub3Qgb2JqZWN0XG4iKSwKLQkJICAgICAgIGVudHJ5LT50aGVfYmZkLCBtZW1iZXIpOwotCSAgICAgIGlmICghICgoKmxpbmtfaW5mby5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpCi0JCSAgICAgKCZsaW5rX2luZm8sIG1lbWJlciwgIi0td2hvbGUtYXJjaGl2ZSIpKSkKLQkJYWJvcnQgKCk7Ci0JICAgICAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKG1lbWJlciwgJmxpbmtfaW5mbykpCi0JCWVpbmZvIChfKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIG1lbWJlcik7Ci0JICAgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZW50cnktPnRoZV9iZmQsCi0JCQkJCQkgICAgIG1lbWJlcik7Ci0JICAgIH0KLQotCSAgZW50cnktPmxvYWRlZCA9IHRydWU7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChlbnRyeS0+dGhlX2JmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKF8oIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgZW50cnktPnRoZV9iZmQpOwotCi0gIGVudHJ5LT5sb2FkZWQgPSB0cnVlOwotfQotCi0gICAgIAotCi0vKiBIYW5kbGUgYSB3aWxkIHN0YXRlbWVudC4gIFNFQ1RJT04gb3IgRklMRSBvciBib3RoIG1heSBiZSBOVUxMLAotICAgaW5kaWNhdGluZyB0aGF0IGl0IGlzIGEgd2lsZGNhcmQuICBTZXBhcmF0ZSBsYW5nX2lucHV0X3NlY3Rpb24KLSAgIHN0YXRlbWVudHMgYXJlIGNyZWF0ZWQgZm9yIGVhY2ggcGFydCBvZiB0aGUgZXhwYW5zaW9uOyB0aGV5IGFyZQotICAgYWRkZWQgYWZ0ZXIgdGhlIHdpbGQgc3RhdGVtZW50IFMuICBPVVRQVVQgaXMgdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXdpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIHRhcmdldCwgb3V0cHV0KQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0OwotewotICB3YWxrX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIG91dHB1dF9zZWN0aW9uX2NhbGxiYWNrLCAodm9pZCAqKSBvdXRwdXQpOwotCi0gIGlmIChzZWN0aW9uICE9IChjaGFyICopIE5VTEwKLSAgICAgICYmIHN0cmNtcCAoc2VjdGlvbiwgIkNPTU1PTiIpID09IDAKLSAgICAgICYmIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZW1lbWJlciB0aGUgc2VjdGlvbiB0aGF0IGNvbW1vbiBpcyBnb2luZyB0byBpbiBjYXNlIHdlIGxhdGVyCi0gICAgICAgICBnZXQgc29tZXRoaW5nIHdoaWNoIGRvZXNuJ3Qga25vdyB3aGVyZSB0byBwdXQgaXQuICAqLwotICAgICAgZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9IG91dHB1dDsKLSAgICB9Ci19Ci0KLS8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJmZCAqCi1vcGVuX291dHB1dCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgYmZkICpvdXRwdXQ7Ci0KLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF90YXJnZXQgIT0gKGNoYXIgKikgTlVMTCkKLQlvdXRwdXRfdGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7Ci0gICAgICBlbHNlCi0Jb3V0cHV0X3RhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotICAgIH0KLSAgb3V0cHV0ID0gYmZkX29wZW53IChuYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLQotICBpZiAob3V0cHV0ID09IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpCi0JewotCSAgZWluZm8gKF8oIiVQJUY6IHRhcmdldCAlcyBub3QgZm91bmRcbiIpLCBvdXRwdXRfdGFyZ2V0KTsKLQl9Ci0gICAgICBlaW5mbyAoXygiJVAlRjogY2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXM6ICVFXG4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlID0gdHJ1ZTsKLQotICAvKiAgb3V0cHV0LT5mbGFncyB8PSBEX1BBR0VEOyovCi0KLSAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKG91dHB1dCwgYmZkX29iamVjdCkpCi0gICAgZWluZm8gKF8oIiVQJUY6JXM6IGNhbiBub3QgbWFrZSBvYmplY3QgZmlsZTogJUVcbiIpLCBuYW1lKTsKLSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG91dHB1dCwKLQkJCSAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLAotCQkJICAgbGRmaWxlX291dHB1dF9tYWNoaW5lKSkKLSAgICBlaW5mbyAoXygiJVAlRjolczogY2FuIG5vdCBzZXQgYXJjaGl0ZWN0dXJlOiAlRVxuIiksIG5hbWUpOwotCi0gIGxpbmtfaW5mby5oYXNoID0gYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKG91dHB1dCk7Ci0gIGlmIChsaW5rX2luZm8uaGFzaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogY2FuIG5vdCBjcmVhdGUgbGluayBoYXNoIHRhYmxlOiAlRVxuIikpOwotCi0gIGJmZF9zZXRfZ3Bfc2l6ZSAob3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkCi1sZGxhbmdfb3Blbl9vdXRwdXQgKHN0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHN0YXRlbWVudDsKLXsKLSAgc3dpdGNoIChzdGF0ZW1lbnQtPmhlYWRlci50eXBlKQotICAgIHsKLSAgICBjYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgQVNTRVJUIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCk7Ci0gICAgICBvdXRwdXRfYmZkID0gb3Blbl9vdXRwdXQgKHN0YXRlbWVudC0+b3V0cHV0X3N0YXRlbWVudC5uYW1lKTsKLSAgICAgIGxkZW11bF9zZXRfb3V0cHV0X2FyY2ggKCk7Ci0gICAgICBpZiAoY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCAmJiAhbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5EX1BBR0VEOwotICAgICAgaWYgKGNvbmZpZy50ZXh0X3JlYWRfb25seSkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBXUF9URVhUOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5XUF9URVhUOwotICAgICAgaWYgKGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQpCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICAgIGVsc2UKLQlvdXRwdXRfYmZkLT5mbGFncyAmPSB+QkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIGN1cnJlbnRfdGFyZ2V0ID0gc3RhdGVtZW50LT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIE9wZW4gYWxsIHRoZSBpbnB1dCBmaWxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vcGVuX2lucHV0X2JmZHMgKHMsIGZvcmNlKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBib29sZWFuIGZvcmNlOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgb3Blbl9pbnB1dF9iZmRzIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIG9wZW5faW5wdXRfYmZkcyAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgLyogTWF5YmUgd2Ugc2hvdWxkIGxvYWQgdGhlIGZpbGUncyBzeW1ib2xzICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUKLQkgICAgICAmJiAhIHdpbGRjYXJkcCAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUpKQotCSAgICAodm9pZCkgbG9va3VwX25hbWUgKHMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lKTsKLQkgIG9wZW5faW5wdXRfYmZkcyAocy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgZm9yY2UpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzOwotCi0JICAgIC8qIFdlIG11c3QgY29udGludWFsbHkgc2VhcmNoIHRoZSBlbnRyaWVzIGluIHRoZSBncm91cAotICAgICAgICAgICAgICAgdW50aWwgbm8gbmV3IHN5bWJvbHMgYXJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgc3ltYm9scy4gICovCi0KLQkgICAgZG8KLQkgICAgICB7Ci0JCXVuZGVmcyA9IGxpbmtfaW5mby5oYXNoLT51bmRlZnNfdGFpbDsKLQkJb3Blbl9pbnB1dF9iZmRzIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgdHJ1ZSk7Ci0JICAgICAgfQotCSAgICB3aGlsZSAodW5kZWZzICE9IGxpbmtfaW5mby5oYXNoLT51bmRlZnNfdGFpbCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCSAgY3VycmVudF90YXJnZXQgPSBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGlmIChzLT5pbnB1dF9zdGF0ZW1lbnQucmVhbCA9PSB0cnVlKQotCSAgICB7Ci0JICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLQotCSAgICAgIHMtPmlucHV0X3N0YXRlbWVudC50YXJnZXQgPSBjdXJyZW50X3RhcmdldDsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBiZWluZyBjYWxsZWQgZnJvbSB3aXRoaW4gYSBncm91cCwgYW5kIHRoaXMKLSAgICAgICAgICAgICAgICAgaXMgYW4gYXJjaGl2ZSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHNlYXJjaGVkLCB0aGVuCi0gICAgICAgICAgICAgICAgIGZvcmNlIGl0IHRvIGJlIHJlc2VhcmNoZWQuICAqLwotCSAgICAgIGlmIChmb3JjZQotCQkgICYmIHMtPmlucHV0X3N0YXRlbWVudC5sb2FkZWQKLQkJICAmJiBiZmRfY2hlY2tfZm9ybWF0IChzLT5pbnB1dF9zdGF0ZW1lbnQudGhlX2JmZCwKLQkJCQkgICAgICAgYmZkX2FyY2hpdmUpKQotCQlzLT5pbnB1dF9zdGF0ZW1lbnQubG9hZGVkID0gZmFsc2U7Ci0KLQkgICAgICBsYW5nX2xpc3RfaW5pdCAoJmFkZCk7Ci0KLQkgICAgICBsb2FkX3N5bWJvbHMgKCZzLT5pbnB1dF9zdGF0ZW1lbnQsICZhZGQpOwotCi0JICAgICAgaWYgKGFkZC5oZWFkICE9IE5VTEwpCi0JCXsKLQkJICAqYWRkLnRhaWwgPSBzLT5uZXh0OwotCQkgIHMtPm5leHQgPSBhZGQuaGVhZDsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogSWYgdGhlcmUgYXJlIFtDT01NT05TXSBzdGF0ZW1lbnRzLCBwdXQgYSB3aWxkIG9uZSBpbnRvIHRoZSBic3Mgc2VjdGlvbiAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19yZWFzb25hYmxlX2RlZmF1bHRzICgpCi17Ci0jaWYgMAotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIudGV4dCIpOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIuZGF0YSIpOwotCi0gIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPQotICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoIi5ic3MiKTsKLQotCi0gIGlmIChwbGFjZWRfY29tbW9ucyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKm5ldyA9Ci0gICAgICBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJJmRlZmF1bHRfY29tbW9uX3NlY3Rpb24tPmNoaWxkcmVuKTsKLQotICAgICAgbmV3LT5zZWN0aW9uX25hbWUgPSAiQ09NTU9OIjsKLSAgICAgIG5ldy0+ZmlsZW5hbWUgPSAoY2hhciAqKSBOVUxMOwotICAgICAgbGFuZ19saXN0X2luaXQgKCZuZXctPmNoaWxkcmVuKTsKLSAgICB9Ci0jZW5kaWYKLQotfQotCi0vKgotIEFkZCB0aGUgc3VwcGxpZWQgbmFtZSB0byB0aGUgc3ltYm9sIHRhYmxlIGFzIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UuCi0gUmVtb3ZlIGl0ZW1zIGZyb20gdGhlIGNoYWluIGFzIHdlIG9wZW4gaW5wdXQgYmZkcwotICovCi10eXBlZGVmIHN0cnVjdCBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdAotewotICBzdHJ1Y3QgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKm5hbWU7Ci19ICAgICAgICAgICAgICAgICAgICAgICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlOwotCi1zdGF0aWMgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfaGVhZDsKLQotdm9pZAotbGRsYW5nX2FkZF91bmRlZiAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKLXsKLSAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqbmV3ID0KLSAgICAoKGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKikKLSAgICAgc3RhdF9hbGxvYyAoc2l6ZW9mIChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlKSkpOwotCi0gIG5ldy0+bmV4dCA9IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQgPSBuZXc7Ci0KLSAgbmV3LT5uYW1lID0gYnV5c3RyaW5nIChuYW1lKTsKLX0KLQotLyogUnVuIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkcyBjcmVhdGVkIGFib3ZlIGFuZCBwbGFjZSB0aGVtCi0gICBpbnRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBhcyB1bmRlZmluZWQgc3ltYm9scyBiZWxvbmdpbmcgdG8gdGhlCi0gICBzY3JpcHQgZmlsZS4KLSovCi1zdGF0aWMgdm9pZAotbGFuZ19wbGFjZV91bmRlZmluZWRzICgpCi17Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKnB0cjsKLQotICBmb3IgKHB0ciA9IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0gICAgICAgcHRyICE9IChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICopIE5VTEw7Ci0gICAgICAgcHRyID0gcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBwdHItPm5hbWUsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQl7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT51LnVuZGVmLmFiZmQgPSBOVUxMOwotCSAgYmZkX2xpbmtfYWRkX3VuZGVmIChsaW5rX2luZm8uaGFzaCwgaCk7Ci0JfQotICAgIH0KLX0KLQotLyogT3BlbiBpbnB1dCBmaWxlcyBhbmQgYXR0YXRjaCB0byBvdXRwdXQgc2VjdGlvbnMgKi8KLXN0YXRpYyB2b2lkCi1tYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLCB0YXJnZXQsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0KLQotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgd2lsZCAoJnMtPndpbGRfc3RhdGVtZW50LCBzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsCi0JCXMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lLCB0YXJnZXQsCi0JCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0KLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsCi0JCQkJCXRhcmdldCwKLQkJCQkJb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCSZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JICB0YXJnZXQgPSBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAhPSBOVUxMCi0JICAgICAgJiYgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBpbml0X29zIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICE9IE5VTEwKLQkgICAgICAmJiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgIGluaXRfb3MgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGF0IGFueSBzZWN0aW9ucyBtZW50aW9uZWQgaW4gdGhlIGFzc2lnbm1lbnQKLSAgICAgICAgICAgICBhcmUgaW5pdGlhbGl6ZWQuICAqLwotCSAgZXhwX2luaXRfb3MgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfZW51bToKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIC8qIE1hcmsgdGhlIHNwZWNpZmllZCBzZWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGFkZHJlc3MgKi8KLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cAotCQkocy0+YWRkcmVzc19zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lKTsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgaW5pdF9vcyAob3MpOwotCSAgICBvcy0+YWRkcl90cmVlID0gcy0+YWRkcmVzc19zdGF0ZW1lbnQuYWRkcmVzczsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotICBpbnQgbGVuOwotCi0gIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgIT0gYWJzX291dHB1dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIG1pbmZvICgiXG4lcyIsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bmFtZSk7Ci0KLSAgICAgIGlmIChzZWN0aW9uICE9IE5VTEwpCi0JewotCSAgcHJpbnRfZG90ID0gc2VjdGlvbi0+dm1hOwotCi0JICBsZW4gPSBzdHJsZW4gKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bmFtZSk7Ci0JICBpZiAobGVuID49IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIIC0gMSkKLQkgICAgewotCSAgICAgIHByaW50X25sICgpOwotCSAgICAgIGxlbiA9IDA7Ci0JICAgIH0KLQkgIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKLQkgICAgewotCSAgICAgIHByaW50X3NwYWNlICgpOwotCSAgICAgICsrbGVuOwotCSAgICB9Ci0KLQkgIG1pbmZvICgiMHglViAlVyIsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bG9hZF9iYXNlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIGFkZHI7Ci0KLQkgICAgICBhZGRyID0gZXhwX2dldF9hYnNfaW50IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmxvYWRfYmFzZSwgMCwKLQkJCQkgICAgICAibG9hZCBiYXNlIiwgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLQkgICAgICBtaW5mbyAoXygiIGxvYWQgYWRkcmVzcyAweCVWIiksIGFkZHIpOwotCSAgICB9Ci0JfQotCi0gICAgICBwcmludF9ubCAoKTsKLSAgICB9Ci0KLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+Y2hpbGRyZW4uaGVhZCwKLQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hc3NpZ25tZW50IChhc3NpZ25tZW50LCBvdXRwdXRfc2VjdGlvbikKLSAgICAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICogYXNzaWdubWVudDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uOwotewotICBpbnQgaTsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIOyBpKyspCi0gICAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAoYXNzaWdubWVudC0+ZXhwLT5hc3NpZ24uc3JjLCBvdXRwdXRfc2VjdGlvbiwKLQkJCSAgbGFuZ19maW5hbF9waGFzZV9lbnVtLCBwcmludF9kb3QsICZwcmludF9kb3QpOwotICBpZiAocmVzdWx0LnZhbGlkX3ApCi0gICAgbWluZm8gKCIweCVWIiwgcmVzdWx0LnZhbHVlICsgcmVzdWx0LnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWEpOwotICBlbHNlCi0gICAgewotICAgICAgbWluZm8gKCIqdW5kZWYqICAgIik7Ci0jaWZkZWYgQkZENjQKLSAgICAgIG1pbmZvICgiICAgICAgICAiKTsKLSNlbmRpZgotICAgIH0KLQotICBtaW5mbyAoIiAgICAgICAgICAgICAgICAiKTsKLQotICBleHBfcHJpbnRfdHJlZSAoYXNzaWdubWVudC0+ZXhwKTsKLQotICBwcmludF9ubCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2lucHV0X3N0YXRlbWVudCAoc3RhdG0pCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiBzdGF0bTsKLXsKLSAgaWYgKHN0YXRtLT5maWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIkxPQUQgJXNcbiIsIHN0YXRtLT5maWxlbmFtZSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhbGwgc3ltYm9scyBkZWZpbmVkIGluIGEgcGFydGljdWxhciBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQKLSAgIHZpYSBiZmRfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1wcmludF9vbmVfc3ltYm9sIChoYXNoX2VudHJ5LCBwdHIpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXNoX2VudHJ5OwotICAgICBQVFIgcHRyOwotewotICBhc2VjdGlvbiAqc2VjID0gKGFzZWN0aW9uICopIHB0cjsKLQotICBpZiAoKGhhc2hfZW50cnktPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgfHwgaGFzaF9lbnRyeS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBzZWMgPT0gaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbikKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIOyBpKyspCi0JcHJpbnRfc3BhY2UgKCk7Ci0gICAgICBtaW5mbyAoIjB4JVYgICAiLAotCSAgICAgKGhhc2hfZW50cnktPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoYXNoX2VudHJ5LT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgKyBoYXNoX2VudHJ5LT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSk7Ci0KLSAgICAgIG1pbmZvICgiICAgICAgICAgICAgICVUXG4iLCBoYXNoX2VudHJ5LT5yb290LnN0cmluZyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbnB1dCBzZWN0aW9uIHRvIHRoZSBtYXAgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnB1dF9zZWN0aW9uIChpbikKLSAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKiBpbjsKLXsKLSAgYXNlY3Rpb24gKmkgPSBpbi0+c2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBzaXplID0gaS0+X2Nvb2tlZF9zaXplICE9IDAgPyBpLT5fY29va2VkX3NpemUgOiBpLT5fcmF3X3NpemU7Ci0KLSAgaWYgKHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLQotICAgICAgbWluZm8gKCIlcyIsIGktPm5hbWUpOwotCi0gICAgICBpZiAoaS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBpbnQgbGVuOwotCi0JICBsZW4gPSAxICsgc3RybGVuIChpLT5uYW1lKTsKLQkgIGlmIChsZW4gPj0gU0VDVElPTl9OQU1FX01BUF9MRU5HVEggLSAxKQotCSAgICB7Ci0JICAgICAgcHJpbnRfbmwgKCk7Ci0JICAgICAgbGVuID0gMDsKLQkgICAgfQotCSAgd2hpbGUgKGxlbiA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0JICAgICAgKytsZW47Ci0JICAgIH0KLQotCSAgbWluZm8gKCIweCVWICVXICVCXG4iLAotCQkgaS0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGktPm91dHB1dF9vZmZzZXQsIHNpemUsCi0JCSBpLT5vd25lcik7Ci0KLQkgIGlmIChpLT5fY29va2VkX3NpemUgIT0gMCAmJiBpLT5fY29va2VkX3NpemUgIT0gaS0+X3Jhd19zaXplKQotCSAgICB7Ci0JICAgICAgbGVuID0gU0VDVElPTl9OQU1FX01BUF9MRU5HVEggKyAzOwotI2lmZGVmIEJGRDY0Ci0JICAgICAgbGVuICs9IDE2OwotI2Vsc2UKLQkgICAgICBsZW4gKz0gODsKLSNlbmRpZgotCSAgICAgIHdoaWxlIChsZW4gPiAwKQotCQl7Ci0JCSAgcHJpbnRfc3BhY2UgKCk7Ci0JCSAgLS1sZW47Ci0JCX0KLQotCSAgICAgIG1pbmZvIChfKCIlVyAoc2l6ZSBiZWZvcmUgcmVsYXhpbmcpXG4iKSwgaS0+X3Jhd19zaXplKTsKLQkgICAgfQotCi0JICBiZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgcHJpbnRfb25lX3N5bWJvbCwgKFBUUikgaSk7Ci0KLQkgIHByaW50X2RvdCA9IGktPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpLT5vdXRwdXRfb2Zmc2V0ICsgc2l6ZTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZmlsbF9zdGF0ZW1lbnQgKGZpbGwpCi0gICAgIGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZSAqIGZpbGw7Ci17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiBGSUxMIG1hc2sgMHgleFxuIiwgZmlsbC0+ZmlsbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9kYXRhX3N0YXRlbWVudCAoZGF0YSkKLSAgICAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlICogZGF0YTsKLXsKLSAgaW50IGk7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIGFkZHIgPSBkYXRhLT5vdXRwdXRfdm1hOwotICBpZiAoZGF0YS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICBhZGRyICs9IGRhdGEtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgc3dpdGNoIChkYXRhLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBCWVRFOgotICAgICAgc2l6ZSA9IEJZVEVfU0laRTsKLSAgICAgIG5hbWUgPSAiQllURSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIT1JUOgotICAgICAgc2l6ZSA9IFNIT1JUX1NJWkU7Ci0gICAgICBuYW1lID0gIlNIT1JUIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9ORzoKLSAgICAgIHNpemUgPSBMT05HX1NJWkU7Ci0gICAgICBuYW1lID0gIkxPTkciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRVUFEOgotICAgICAgc2l6ZSA9IFFVQURfU0laRTsKLSAgICAgIG5hbWUgPSAiUVVBRCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNRVUFEOgotICAgICAgc2l6ZSA9IFFVQURfU0laRTsKLSAgICAgIG5hbWUgPSAiU1FVQUQiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG1pbmZvICgiMHglViAlVyAlcyAweCV2IiwgYWRkciwgc2l6ZSwgbmFtZSwgZGF0YS0+dmFsdWUpOwotCi0gIGlmIChkYXRhLT5leHAtPnR5cGUubm9kZV9jbGFzcyAhPSBldHJlZV92YWx1ZSkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLSAgICAgIGV4cF9wcmludF90cmVlIChkYXRhLT5leHApOwotICAgIH0KLQotICBwcmludF9ubCAoKTsKLQotICBwcmludF9kb3QgPSBhZGRyICsgc2l6ZTsKLX0KLQotLyogUHJpbnQgYW4gYWRkcmVzcyBzdGF0ZW1lbnQuICBUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IG9wdGlvbnMgbGlrZQotICAgLVR0ZXh0LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3Nfc3RhdGVtZW50IChhZGRyZXNzKQotICAgICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgKmFkZHJlc3M7Ci17Ci0gIG1pbmZvIChfKCJBZGRyZXNzIG9mIHNlY3Rpb24gJXMgc2V0IHRvICIpLCBhZGRyZXNzLT5zZWN0aW9uX25hbWUpOwotICBleHBfcHJpbnRfdHJlZSAoYWRkcmVzcy0+YWRkcmVzcyk7Ci0gIHByaW50X25sICgpOwotfQotCi0vKiBQcmludCBhIHJlbG9jIHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWxvY19zdGF0ZW1lbnQgKHJlbG9jKQotICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyZWxvYzsKLXsKLSAgaW50IGk7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIGFkZHIgPSByZWxvYy0+b3V0cHV0X3ZtYTsKLSAgaWYgKHJlbG9jLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIGFkZHIgKz0gcmVsb2MtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2MtPmhvd3RvKTsKLQotICBtaW5mbyAoIjB4JVYgJVcgUkVMT0MgJXMgIiwgYWRkciwgc2l6ZSwgcmVsb2MtPmhvd3RvLT5uYW1lKTsKLQotICBpZiAocmVsb2MtPm5hbWUgIT0gTlVMTCkKLSAgICBtaW5mbyAoIiVzKyIsIHJlbG9jLT5uYW1lKTsKLSAgZWxzZQotICAgIG1pbmZvICgiJXMrIiwgcmVsb2MtPnNlY3Rpb24tPm5hbWUpOwotCi0gIGV4cF9wcmludF90cmVlIChyZWxvYy0+YWRkZW5kX2V4cCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHNpemU7Ci19ICAKLQotc3RhdGljIHZvaWQKLXByaW50X3BhZGRpbmdfc3RhdGVtZW50IChzKQotICAgICBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGludCBsZW47Ci0gIGJmZF92bWEgYWRkcjsKLQotICBtaW5mbyAoIiAqZmlsbCoiKTsKLQotICBsZW4gPSBzaXplb2YgIiAqZmlsbCoiIC0gMTsKLSAgd2hpbGUgKGxlbiA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIKQotICAgIHsKLSAgICAgIHByaW50X3NwYWNlICgpOwotICAgICAgKytsZW47Ci0gICAgfQotCi0gIGFkZHIgPSBzLT5vdXRwdXRfb2Zmc2V0OwotICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICBhZGRyICs9IHMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIG1pbmZvICgiMHglViAlVyIsIGFkZHIsIHMtPnNpemUpOwotCi0gIGlmIChzLT5maWxsICE9IDApCi0gICAgbWluZm8gKCIgJXUiLCBzLT5maWxsKTsKLQotICBwcmludF9ubCAoKTsKLQotICBwcmludF9kb3QgPSBhZGRyICsgcy0+c2l6ZTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3dpbGRfc3RhdGVtZW50ICh3LCBvcykKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICogdzsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG9zOwotewotICBwcmludF9zcGFjZSAoKTsKLQotICBpZiAody0+ZmlsZW5hbWVzX3NvcnRlZCkKLSAgICBtaW5mbyAoIlNPUlQoIik7Ci0gIGlmICh3LT5leGNsdWRlX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCJFWENMVURFX0ZJTEUgKCAlcyApIiwgdy0+ZXhjbHVkZV9maWxlbmFtZSk7Ci0gIGlmICh3LT5maWxlbmFtZSAhPSBOVUxMKQotICAgIG1pbmZvICgiJXMiLCB3LT5maWxlbmFtZSk7Ci0gIGVsc2UKLSAgICBtaW5mbyAoIioiKTsKLSAgaWYgKHctPmZpbGVuYW1lc19zb3J0ZWQpCi0gICAgbWluZm8gKCIpIik7Ci0KLSAgbWluZm8gKCIoIik7Ci0gIGlmICh3LT5zZWN0aW9uc19zb3J0ZWQpCi0gICAgbWluZm8gKCJTT1JUKCIpOwotICBpZiAody0+c2VjdGlvbl9uYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCIlcyIsIHctPnNlY3Rpb25fbmFtZSk7Ci0gIGVsc2UKLSAgICBtaW5mbyAoIioiKTsKLSAgaWYgKHctPnNlY3Rpb25zX3NvcnRlZCkKLSAgICBtaW5mbyAoIikiKTsKLSAgbWluZm8gKCIpIik7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHctPmNoaWxkcmVuLmhlYWQsIG9zKTsKLX0KLQotLyogUHJpbnQgYSBncm91cCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZ3JvdXAgKHMsIG9zKQotICAgICBsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlICpzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLXsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiU1RBUlQgR1JPVVBcbiIpOwotICBwcmludF9zdGF0ZW1lbnRfbGlzdCAocy0+Y2hpbGRyZW4uaGVhZCwgb3MpOwotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJFTkQgR1JPVVBcbiIpOwotfQotCi0vKiBQcmludCB0aGUgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIFMuCi0gICBUaGlzIGNhbiBiZSBjYWxsZWQgZm9yIGFueSBzdGF0ZW1lbnQgdHlwZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnRfbGlzdCAocywgb3MpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotewotICB3aGlsZSAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50X3N0YXRlbWVudCAocywgb3MpOwotICAgICAgcyA9IHMtPm5leHQ7Ci0gICAgfQotfQotCi0vKiBQcmludCB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHN0YXRlbWVudCBsaXN0IFMuCi0gICBUaGlzIGNhbiBiZSBjYWxsZWQgZm9yIGFueSBzdGF0ZW1lbnQgdHlwZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnQgKHMsIG9zKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLXsKLSAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgXygiRmFpbCB3aXRoICVkXG4iKSwgcy0+aGVhZGVyLnR5cGUpOwotICAgICAgRkFJTCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0gICAgICBpZiAoY29uc3RydWN0b3JfbGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgaWYgKGNvbnN0cnVjdG9yc19zb3J0ZWQpCi0JICAgIG1pbmZvICgiIFNPUlQgKENPTlNUUlVDVE9SUylcbiIpOwotCSAgZWxzZQotCSAgICBtaW5mbyAoIiBDT05TVFJVQ1RPUlNcbiIpOwotCSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwgb3MpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfd2lsZF9zdGF0ZW1lbnQgKCZzLT53aWxkX3N0YXRlbWVudCwgb3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9hZGRyZXNzX3N0YXRlbWVudCAoJnMtPmFkZHJlc3Nfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLSAgICAgIG1pbmZvICgiIENSRUFURV9PQkpFQ1RfU1lNQk9MU1xuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2ZpbGxfc3RhdGVtZW50ICgmcy0+ZmlsbF9zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9kYXRhX3N0YXRlbWVudCAoJnMtPmRhdGFfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X3JlbG9jX3N0YXRlbWVudCAoJnMtPnJlbG9jX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotICAgICAgcHJpbnRfaW5wdXRfc2VjdGlvbiAoJnMtPmlucHV0X3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9wYWRkaW5nX3N0YXRlbWVudCAoJnMtPnBhZGRpbmdfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2Fzc2lnbm1lbnQgKCZzLT5hc3NpZ25tZW50X3N0YXRlbWVudCwgb3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlRBUkdFVCglcylcbiIsIHMtPnRhcmdldF9zdGF0ZW1lbnQudGFyZ2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0gICAgICBtaW5mbyAoIk9VVFBVVCglcyIsIHMtPm91dHB1dF9zdGF0ZW1lbnQubmFtZSk7Ci0gICAgICBpZiAob3V0cHV0X3RhcmdldCAhPSBOVUxMKQotCW1pbmZvICgiICVzIiwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBtaW5mbyAoIilcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfaW5wdXRfc3RhdGVtZW50ICgmcy0+aW5wdXRfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2dyb3VwICgmcy0+Z3JvdXBfc3RhdGVtZW50LCBvcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfZW51bToKLSAgICAgIEZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnRzICgpCi17Ci0gIHByaW50X3N0YXRlbWVudF9saXN0IChzdGF0ZW1lbnRfbGlzdC5oZWFkLCBhYnNfb3V0cHV0X3NlY3Rpb24pOwotfQotCi0vKiBQcmludCB0aGUgZmlyc3QgTiBzdGF0ZW1lbnRzIGluIHN0YXRlbWVudCBsaXN0IFMgdG8gU1RERVJSLgotICAgSWYgTiA9PSAwLCBub3RoaW5nIGlzIHByaW50ZWQuCi0gICBJZiBOIDwgMCwgdGhlIGVudGlyZSBsaXN0IGlzIHByaW50ZWQuCi0gICBJbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSBHREIuICAqLwotCi12b2lkCi1kcHJpbnRfc3RhdGVtZW50IChzLCBuKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgaW50IG47Ci17Ci0gIEZJTEUgKm1hcF9zYXZlID0gY29uZmlnLm1hcF9maWxlOwotCi0gIGNvbmZpZy5tYXBfZmlsZSA9IHN0ZGVycjsKLQotICBpZiAobiA8IDApCi0gICAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMsIGFic19vdXRwdXRfc2VjdGlvbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAocyAmJiAtLW4gPj0gMCkKLQl7Ci0JICBwcmludF9zdGF0ZW1lbnQgKHMsIGFic19vdXRwdXRfc2VjdGlvbik7Ci0JICBzID0gcy0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIGNvbmZpZy5tYXBfZmlsZSA9IG1hcF9zYXZlOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotaW5zZXJ0X3BhZCAodGhpc19wdHIsIGZpbGwsIHBvd2VyLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsIGRvdCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiB0aGlzX3B0cjsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIHVuc2lnbmVkIGludCBwb3dlcjsKLSAgICAgYXNlY3Rpb24gKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gICAgIGJmZF92bWEgZG90OwotewotICAvKiBBbGlnbiB0aGlzIHNlY3Rpb24gZmlyc3QgdG8gdGhlCi0gICAgIGlucHV0IHNlY3Rpb25zIHJlcXVpcmVtZW50LCB0aGVuCi0gICAgIHRvIHRoZSBvdXRwdXQgc2VjdGlvbidzIHJlcXVpcmVtZW50LgotICAgICBJZiB0aGlzIGFsaWdubWVudCBpcyA+IHRoYW4gYW55IHNlZW4gYmVmb3JlLAotICAgICB0aGVuIHJlY29yZCBpdCB0b28uIFBlcmZvcm0gdGhlIGFsaWdubWVudCBieQotICAgICBpbnNlcnRpbmcgYSBtYWdpYyAncGFkZGluZycgc3RhdGVtZW50LgotICAgICAqLwotCi0gIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfbmVlZGVkID0gYWxpZ25fcG93ZXIgKGRvdCwgcG93ZXIpIC0gZG90OwotCi0gIGlmIChhbGlnbm1lbnRfbmVlZGVkICE9IDApCi0gICAgewotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbmV3ID0KLQkoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikKLQkgc3RhdF9hbGxvYyAoc2l6ZW9mIChsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUpKSk7Ci0KLSAgICAgIC8qIExpbmsgaW50byBleGlzdGluZyBjaGFpbiAqLwotICAgICAgbmV3LT5oZWFkZXIubmV4dCA9ICp0aGlzX3B0cjsKLSAgICAgICp0aGlzX3B0ciA9IG5ldzsKLSAgICAgIG5ldy0+aGVhZGVyLnR5cGUgPSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW07Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0ID0KLQlkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPnZtYTsKLSAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQuZmlsbCA9IGZpbGw7Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LnNpemUgPSBhbGlnbm1lbnRfbmVlZGVkOwotICAgIH0KLQotCi0gIC8qIFJlbWVtYmVyIHRoZSBtb3N0IHJlc3RyaWN0aXZlIGFsaWdubWVudCAqLwotICBpZiAocG93ZXIgPiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmFsaWdubWVudF9wb3dlcikKLSAgICB7Ci0gICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotICAgIH0KLSAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5fcmF3X3NpemUgKz0gYWxpZ25tZW50X25lZWRlZDsKLSAgcmV0dXJuIGFsaWdubWVudF9uZWVkZWQgKyBkb3Q7Ci0KLX0KLQotLyogV29yayBvdXQgaG93IG11Y2ggdGhpcyBzZWN0aW9uIHdpbGwgbW92ZSB0aGUgZG90IHBvaW50ICovCi1zdGF0aWMgYmZkX3ZtYQotc2l6ZV9pbnB1dF9zZWN0aW9uICh0aGlzX3B0ciwgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBmaWxsLCBkb3QsIHJlbGF4KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqIHRoaXNfcHRyOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICogb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJvb2xlYW4gcmVsYXg7Ci17Ci0gIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppcyA9ICYoKCp0aGlzX3B0ciktPmlucHV0X3NlY3Rpb24pOwotICBhc2VjdGlvbiAqaSA9IGlzLT5zZWN0aW9uOwotCi0gIGlmIChpcy0+aWZpbGUtPmp1c3Rfc3ltc19mbGFnID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPnN1YnNlY3Rpb25fYWxpZ25tZW50ICE9IC0xKQotICAgICAgIGktPmFsaWdubWVudF9wb3dlciA9Ci0Jb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5zdWJzZWN0aW9uX2FsaWdubWVudDsKLQotICAgICAgZG90ID0gaW5zZXJ0X3BhZCAodGhpc19wdHIsIGZpbGwsIGktPmFsaWdubWVudF9wb3dlciwKLQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24sIGRvdCk7Ci0KLSAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGlzIGlucHV0IHNlY3Rpb24gZ29lcyAqLwotCi0gICAgICBpLT5vdXRwdXRfb2Zmc2V0ID0gZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBNYXJrIGhvdyBiaWcgdGhlIG91dHB1dCBzZWN0aW9uIG11c3QgYmUgdG8gY29udGFpbiB0aGlzIG5vdwotCSAqLwotICAgICAgaWYgKGktPl9jb29rZWRfc2l6ZSAhPSAwKQotCWRvdCArPSBpLT5fY29va2VkX3NpemU7Ci0gICAgICBlbHNlCi0JZG90ICs9IGktPl9yYXdfc2l6ZTsKLSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSA9IGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpLT5vdXRwdXRfb2Zmc2V0ID0gaS0+dm1hIC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotICAgIH0KLQotICByZXR1cm4gZG90OwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgYW55IGFsbG9jYXRlZCBzZWN0aW9ucyBvdmVybGFwIHdpdGggb3RoZXIgYWxsb2NhdGVkCi0gICBzZWN0aW9ucy4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBsaW5rZXIgc2NyaXB0IHNwZWNpZmljYWxseSBzcGVjaWZpZXMKLSAgIHRoZSBvdXRwdXQgc2VjdGlvbiBhZGRyZXNzZXMgb2YgdGhlIHR3byBzZWN0aW9ucy4gICovCi1zdGF0aWMgdm9pZAotbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyAoKQotewotICBhc2VjdGlvbiAqIHM7Ci0KLSAgLyogU2NhbiBhbGwgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBsaXN0LiAgKi8KLSAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgLyogSWdub3JlIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgbG9hZGVkIG9yIHdoaWNoIGhhdmUgbm8gY29udGVudHMuICAqLwotICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRwdXRfYmZkLCBzKSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpCi0JJiYgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgcykgIT0gMCkKLSAgICAgIHsKLQlhc2VjdGlvbiAqIG9zOwotCi0JLyogT25jZSB3ZSByZWFjaCBzZWN0aW9uICdzJyBzdG9wIG91ciBzZWFjaC4gIFRoaXMgcHJldmVudHMgdHdvCi0JICAgd2FybmluZyBtZXNzYWdlcyBmcm9tIGJlaW5nIHByb2R1Y2VkLCBvbmUgZm9yICdzZWN0aW9uIEEgb3ZlcmxhcHMKLQkgICBzZWN0aW9uIEInIGFuZCBvbmUgZm9yICdzZWN0aW9uIEIgb3ZlcmxhcHMgc2VjdGlvbiBBJy4gICovCi0JZm9yIChvcyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBvcyAhPSBzOyBvcyA9IG9zLT5uZXh0KQotCSAgewotCSAgICBiZmRfdm1hIHNfc3RhcnQ7Ci0JICAgIGJmZF92bWEgc19lbmQ7Ci0JICAgIGJmZF92bWEgb3Nfc3RhcnQ7Ci0JICAgIGJmZF92bWEgb3NfZW5kOwotCi0JICAgIC8qIE9ubHkgY29uc2lkZXIgbG9hZGFibGUgc2VjdGlvbnMgd2l0aCByZWFsIGNvbnRlbnRzLiAgKi8KLQkgICAgaWYgKCgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRwdXRfYmZkLCBvcykKLQkJICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpID09IDApCi0JCXx8IGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIG9zKSA9PSAwKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIC8qIFdlIG11c3QgY2hlY2sgdGhlIHNlY3Rpb25zJyBMTUEgYWRkcmVzc2VzIG5vdCB0aGVpcgotCSAgICAgICBWTUEgYWRkcmVzc2VzIGJlY2F1c2Ugb3ZlcmxheSBzZWN0aW9ucyBjYW4gaGF2ZQotCSAgICAgICBvdmVybGFwcGluZyBWTUFzIGJ1dCB0aGV5IG11c3QgaGF2ZSBkaXN0aW5jdCBMTUFzLiAgKi8KLQkgICAgc19zdGFydCAgPSBiZmRfc2VjdGlvbl9sbWEgKG91dHB1dF9iZmQsIHMpOwotCSAgICBvc19zdGFydCA9IGJmZF9zZWN0aW9uX2xtYSAob3V0cHV0X2JmZCwgb3MpOwotCSAgICBzX2VuZCAgICA9IHNfc3RhcnQgICsgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgcykgLSAxOwotCSAgICBvc19lbmQgICA9IG9zX3N0YXJ0ICsgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgb3MpIC0gMTsKLQotCSAgICAvKiBMb29rIGZvciBhbiBvdmVybGFwLiAgKi8KLQkgICAgaWYgKChzX2VuZCA8IG9zX3N0YXJ0KSB8fCAoc19zdGFydCA+IG9zX2VuZCkpCi0JICAgICAgY29udGludWU7Ci0JICAgIAotCSAgICBlaW5mbyAoCi1fKCIlWCVQOiBzZWN0aW9uICVzIFslViAtPiAlVl0gb3ZlcmxhcHMgc2VjdGlvbiAlcyBbJVYgLT4gJVZdXG4iKSwKLQkJICAgcy0+bmFtZSwgc19zdGFydCwgc19lbmQsIG9zLT5uYW1lLCBvc19zdGFydCwgb3NfZW5kKTsKLQotCSAgICAvKiBPbmNlIHdlIGhhdmUgZm91bmQgb25lIG92ZXJsYXAgZm9yIHRoaXMgc2VjdGlvbiwKLQkgICAgICAgc3RvcCBsb29raW5nIGZvciBvdGhlcnMuICAqLwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLX0KLQotLyogVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgd2hldGhlciBiZmRfcmVsYXhfc2VjdGlvbiBzaG91bGQgYmUgY2FsbGVkCi0gICBhZ2Fpbi4gICovCi0KLXN0YXRpYyBib29sZWFuIHJlbGF4X2FnYWluOwotCi0vKiBTZXQgdGhlIHNpemVzIGZvciBhbGwgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLWJmZF92bWEKLWxhbmdfc2l6ZV9zZWN0aW9ucyAocywgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBwcmV2LCBmaWxsLCBkb3QsIHJlbGF4KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiBwcmV2OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJvb2xlYW4gcmVsYXg7Ci17Ci0gIC8qIFNpemUgdXAgdGhlIHNlY3Rpb25zIGZyb20gdGhlaXIgY29uc3RpdHVlbnQgcGFydHMuICAqLwotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgYWZ0ZXI7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBuZXZlciBhY3R1YWxseSBjcmVhdGVkLiAgKi8KLQkgICAgICBicmVhazsKLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLCB1c2UgdGhlIHNpemUgYW5kCi0JICAgICAgIGFkZHJlc3MgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbi4gIEZJWE1FOiBUaGlzIGlzIENPRkYKLQkgICAgICAgc3BlY2lmaWM7IGl0IHdvdWxkIGJlIGNsZWFuZXIgaWYgdGhlcmUgd2VyZSBzb21lIG90aGVyIHdheQotCSAgICAgICB0byBkbyB0aGlzLCBidXQgbm90aGluZyBzaW1wbGUgY29tZXMgdG8gbWluZC4gICovCi0JICAgIGlmICgob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSAhPSAwKQotCSAgICAgIHsKLQkJYXNlY3Rpb24gKiBpbnB1dDsKLQotCQlpZiAob3MtPmNoaWxkcmVuLmhlYWQgPT0gTlVMTAotCQkgICAgfHwgb3MtPmNoaWxkcmVuLmhlYWQtPm5leHQgIT0gTlVMTAotCQkgICAgfHwgb3MtPmNoaWxkcmVuLmhlYWQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCQkgIGVpbmZvIChfKCIlUCVYOiBJbnRlcm5hbCBlcnJvciBvbiBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24gJXNcbiIpLAotCQkJIG9zLT5uYW1lKTsKLQotCQlpbnB1dCA9IG9zLT5jaGlsZHJlbi5oZWFkLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0JCWJmZF9zZXRfc2VjdGlvbl92bWEgKG9zLT5iZmRfc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgICBvcy0+YmZkX3NlY3Rpb24sCi0JCQkJICAgICBiZmRfc2VjdGlvbl92bWEgKGlucHV0LT5vd25lciwgaW5wdXQpKTsKLQkJb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBpbnB1dC0+X3Jhd19zaXplOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAob3MtPmJmZF9zZWN0aW9uKSkKLQkgICAgICB7Ci0JCS8qIE5vIG1hdHRlciB3aGF0IGhhcHBlbnMsIGFuIGFicyBzZWN0aW9uIHN0YXJ0cyBhdCB6ZXJvLiAgKi8KLQkJQVNTRVJUIChvcy0+YmZkX3NlY3Rpb24tPnZtYSA9PSAwKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmIChvcy0+YWRkcl90cmVlID09IChldHJlZV90eXBlICopIE5VTEwpCi0JCSAgewotCQkgICAgLyogTm8gYWRkcmVzcyBzcGVjaWZpZWQgZm9yIHRoaXMgc2VjdGlvbiwgZ2V0IG9uZQotCQkgICAgICAgZnJvbSB0aGUgcmVnaW9uIHNwZWNpZmljYXRpb24uICAqLwotCQkgICAgaWYgKG9zLT5yZWdpb24gPT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwKLQkJCXx8ICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkJICAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAwKQotCQkJICAgICYmIG9zLT5yZWdpb24tPm5hbWVbMF0gPT0gJyonCi0JCQkgICAgJiYgc3RyY21wIChvcy0+cmVnaW9uLT5uYW1lLCAiKmRlZmF1bHQqIikgPT0gMCkpCi0JCSAgICAgIHsKLQkJCW9zLT5yZWdpb24gPSBsYW5nX21lbW9yeV9kZWZhdWx0IChvcy0+YmZkX3NlY3Rpb24pOwotCQkgICAgICB9Ci0KLQkJICAgIC8qIElmIGEgbG9hZGFibGUgc2VjdGlvbiBpcyB1c2luZyB0aGUgZGVmYXVsdCBtZW1vcnkKLQkJICAgICAgIHJlZ2lvbiwgYW5kIHNvbWUgbm9uIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbnMgd2VyZQotCQkgICAgICAgZGVmaW5lZCwgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLQkJICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRwdXRfYmZkLCBvcy0+YmZkX3NlY3Rpb24pCi0JCQkgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAwCi0JCQkmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkJCSYmIHN0cmNtcCAob3MtPnJlZ2lvbi0+bmFtZSwgIipkZWZhdWx0KiIpID09IDAKLQkJCSYmIGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0ICE9IE5VTEwKLQkJCSYmIChzdHJjbXAgKGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0LT5uYW1lLCAiKmRlZmF1bHQqIikgIT0gMAotCQkJICAgIHx8IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0LT5uZXh0ICE9IE5VTEwpKQotCQkgICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IG5vIG1lbW9yeSByZWdpb24gc3BlY2lmaWVkIGZvciBzZWN0aW9uIGAlcydcbiIpLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKSk7Ci0KLQkJICAgIGRvdCA9IG9zLT5yZWdpb24tPmN1cnJlbnQ7Ci0gCi0JCSAgICBpZiAob3MtPnNlY3Rpb25fYWxpZ25tZW50ID09IC0xKQotCQkgICAgICB7Ci0JCQliZmRfdm1hIG9sZGRvdDsKLQotCQkJb2xkZG90ID0gZG90OwotCQkJZG90ID0gYWxpZ25fcG93ZXIgKGRvdCwgb3MtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0JCQlpZiAoZG90ICE9IG9sZGRvdCAmJiBjb25maWcud2Fybl9zZWN0aW9uX2FsaWduKQotCQkJICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNoYW5naW5nIHN0YXJ0IG9mIHNlY3Rpb24gJXMgYnkgJXUgYnl0ZXNcbiIpLAotCQkJCSBvcy0+bmFtZSwgKHVuc2lnbmVkIGludCkgKGRvdCAtIG9sZGRvdCkpOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgZXRyZWVfdmFsdWVfdHlwZSByOwotCi0JCSAgICByID0gZXhwX2ZvbGRfdHJlZSAob3MtPmFkZHJfdHJlZSwKLQkJCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCSAgICAgICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLQkJCQkgICAgICAgZG90LCAmZG90KTsKLQkJICAgIGlmIChyLnZhbGlkX3AgPT0gZmFsc2UpCi0JCSAgICAgIHsKLQkJCWVpbmZvIChfKCIlRiVTOiBub24gY29uc3RhbnQgYWRkcmVzcyBleHByZXNzaW9uIGZvciBzZWN0aW9uICVzXG4iKSwKLQkJCSAgICAgICBvcy0+bmFtZSk7Ci0JCSAgICAgIH0KLQkJICAgIGRvdCA9IHIudmFsdWUgKyByLnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSAgfQotCQkKLQkJLyogVGhlIHNlY3Rpb24gc3RhcnRzIGhlcmUuCi0JCSAgIEZpcnN0LCBhbGlnbiB0byB3aGF0IHRoZSBzZWN0aW9uIG5lZWRzLiAgKi8KLQotCQlpZiAob3MtPnNlY3Rpb25fYWxpZ25tZW50ICE9IC0xKQotCQkgIGRvdCA9IGFsaWduX3Bvd2VyIChkb3QsIG9zLT5zZWN0aW9uX2FsaWdubWVudCk7Ci0KLQkJYmZkX3NldF9zZWN0aW9uX3ZtYSAoMCwgb3MtPmJmZF9zZWN0aW9uLCBkb3QpOwotCQkKLQkJb3MtPmJmZF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gMDsKLQkgICAgICB9Ci0KLQkgICAgKHZvaWQpIGxhbmdfc2l6ZV9zZWN0aW9ucyAob3MtPmNoaWxkcmVuLmhlYWQsIG9zLCAmb3MtPmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgICAgIG9zLT5maWxsLCBkb3QsIHJlbGF4KTsKLQkgICAgCi0JICAgIC8qIElnbm9yZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbnMsIHVzZSB0aGUgdm1hIGFuZCBzaXplIHRvCi0JICAgICAgIGFsaWduIGFnYWluc3QuICAqLwotCi0JICAgIGFmdGVyID0gQUxJR05fTiAob3MtPmJmZF9zZWN0aW9uLT52bWEgKwotCQkJICAgICBvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSwKLQkJCSAgICAgLyogVGhlIGNvZXJjaW9uIGhlcmUgaXMgaW1wb3J0YW50LCBzZWUgbGQuaC4gICovCi0JCQkgICAgIChiZmRfdm1hKSBvcy0+YmxvY2tfdmFsdWUpOwotCi0JICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKG9zLT5iZmRfc2VjdGlvbikpCi0JICAgICAgQVNTRVJUIChhZnRlciA9PSBvcy0+YmZkX3NlY3Rpb24tPnZtYSk7Ci0JICAgIGVsc2UKLQkgICAgICBvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSA9IGFmdGVyIC0gb3MtPmJmZF9zZWN0aW9uLT52bWE7Ci0JICAgIGRvdCA9IG9zLT5iZmRfc2VjdGlvbi0+dm1hICsgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0JICAgIG9zLT5wcm9jZXNzZWQgPSB0cnVlOwotCi0JICAgIC8qIFVwZGF0ZSBkb3QgaW4gdGhlIHJlZ2lvbiA/Ci0JICAgICAgIFdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBhbGxvY2F0ZWQsCi0JICAgICAgIHNpbmNlIHVuYWxsb2NhdGVkIHNlY3Rpb25zIGRvIG5vdCBjb250cmlidXRlIHRvIHRoZSByZWdpb24ncwotCSAgICAgICBvdmVyYWxsIHNpemUgaW4gbWVtb3J5LiAgKi8KLQkgICAgaWYgKG9zLT5yZWdpb24gIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwKLQkJJiYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpKQotCSAgICAgIHsKLQkJb3MtPnJlZ2lvbi0+Y3VycmVudCA9IGRvdDsKLQkJCi0JCS8qIE1ha2Ugc3VyZSB0aGlzIGlzbid0IHNpbGx5LiAgKi8KLQkJaWYgKG9zLT5yZWdpb24tPmN1cnJlbnQgPCBvcy0+cmVnaW9uLT5vcmlnaW4KLQkJICAgIHx8IChvcy0+cmVnaW9uLT5jdXJyZW50IC0gb3MtPnJlZ2lvbi0+b3JpZ2luCi0JCQk+IG9zLT5yZWdpb24tPmxlbmd0aCkpCi0JCSAgewotCQkgICAgaWYgKG9zLT5hZGRyX3RyZWUgIT0gKGV0cmVlX3R5cGUgKikgTlVMTCkKLQkJICAgICAgewotCQkJZWluZm8gKF8oIiVYJVA6IGFkZHJlc3MgMHgldiBvZiAlQiBzZWN0aW9uICVzIGlzIG5vdCB3aXRoaW4gcmVnaW9uICVzXG4iKSwKLQkJCSAgICAgICBvcy0+cmVnaW9uLT5jdXJyZW50LAotCQkJICAgICAgIG9zLT5iZmRfc2VjdGlvbi0+b3duZXIsCi0JCQkgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5uYW1lLAotCQkJICAgICAgIG9zLT5yZWdpb24tPm5hbWUpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWVpbmZvIChfKCIlWCVQOiByZWdpb24gJXMgaXMgZnVsbCAoJUIgc2VjdGlvbiAlcylcbiIpLAotCQkJICAgICAgIG9zLT5yZWdpb24tPm5hbWUsCi0JCQkgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5vd25lciwKLQkJCSAgICAgICBvcy0+YmZkX3NlY3Rpb24tPm5hbWUpOwotCQkgICAgICB9Ci0JCSAgICAvKiBSZXNldCB0aGUgcmVnaW9uIHBvaW50ZXIuICAqLwotCQkgICAgb3MtPnJlZ2lvbi0+Y3VycmVudCA9IG9zLT5yZWdpb24tPm9yaWdpbjsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ID0gbGFuZ19zaXplX3NlY3Rpb25zIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsCi0JCQkJICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgJnMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgIGZpbGwsCi0JCQkJICAgIGRvdCwgcmVsYXgpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHNpemUgPSAwOwotCi0JICAgIHMtPmRhdGFfc3RhdGVtZW50Lm91dHB1dF92bWEgPSBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0JICAgIHMtPmRhdGFfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0KLQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotCi0JICAgIHN3aXRjaCAocy0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBRVUFEOgotCSAgICAgIGNhc2UgU1FVQUQ6Ci0JCXNpemUgPSBRVUFEX1NJWkU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgTE9ORzoKLQkJc2l6ZSA9IExPTkdfU0laRTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBTSE9SVDoKLQkJc2l6ZSA9IFNIT1JUX1NJWkU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQllURToKLQkJc2l6ZSA9IEJZVEVfU0laRTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGRvdCArPSBzaXplOwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZTsKLQkgICAgLyogVGhlIG91dHB1dCBzZWN0aW9uIGdldHMgY29udGVudHMsIGFuZCB0aGVuIHdlIGluc3BlY3QgZm9yCi0JICAgICAgIGFueSBmbGFncyBzZXQgaW4gdGhlIGlucHV0IHNjcmlwdCB3aGljaCBvdmVycmlkZSBhbnkgQUxMT0MuICAqLwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICBpZiAoIShvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpKSB7Ci0JICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBpbnQgc2l6ZTsKLQotCSAgICBzLT5yZWxvY19zdGF0ZW1lbnQub3V0cHV0X3ZtYSA9Ci0JICAgICAgZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgICBzLT5yZWxvY19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24gPQotCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHMtPnJlbG9jX3N0YXRlbWVudC5ob3d0byk7Ci0JICAgIGRvdCArPSBzaXplOwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQotCSAgZG90ID0gbGFuZ19zaXplX3NlY3Rpb25zIChzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCi0JCQkJICAgIGZpbGwsIGRvdCwgcmVsYXgpOwotCi0JICBicmVhazsKLQotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQkgIGxpbmtfaW5mby5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiA9Ci0JICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCSAgewotCSAgICBhc2VjdGlvbiAqaTsKLQotCSAgICBpID0gKCpwcmV2KS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOwotCSAgICBpZiAoISByZWxheCkKLQkgICAgICB7Ci0JCWlmIChpLT5fY29va2VkX3NpemUgPT0gMCkKLQkJICBpLT5fY29va2VkX3NpemUgPSBpLT5fcmF3X3NpemU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlib29sZWFuIGFnYWluOwotCi0JCWlmICghIGJmZF9yZWxheF9zZWN0aW9uIChpLT5vd25lciwgaSwgJmxpbmtfaW5mbywgJmFnYWluKSkKLQkJICBlaW5mbyAoXygiJVAlRjogY2FuJ3QgcmVsYXggc2VjdGlvbjogJUVcbiIpKTsKLQkJaWYgKGFnYWluKQotCQkgIHJlbGF4X2FnYWluID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgIGRvdCA9IHNpemVfaW5wdXRfc2VjdGlvbiAocHJldiwKLQkJCQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5maWxsLAotCQkJCSAgICAgIGRvdCwgcmVsYXgpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JICBzLT5maWxsX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0KLQkgIGZpbGwgPSBzLT5maWxsX3N0YXRlbWVudC5maWxsOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgbmV3ZG90ID0gZG90OwotCi0JICAgIGV4cF9mb2xkX3RyZWUgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCwKLQkJCSAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCSAgIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLAotCQkJICAgZG90LAotCQkJICAgJm5ld2RvdCk7Ci0KLQkgICAgaWYgKG5ld2RvdCAhPSBkb3QpCi0JICAgICAgewotCQkvKiBUaGUgYXNzaWdubWVudCBjaGFuZ2VkIGRvdC4gIEluc2VydCBhIHBhZC4gICovCi0JCWlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgPT0gYWJzX291dHB1dF9zZWN0aW9uKQotCQkgIHsKLQkJICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW4gb3V0cHV0IHNlY3Rpb24sIHRoZW4ganVzdCBhZGp1c3QKLQkJICAgICAgIHRoZSBkZWZhdWx0IG1lbW9yeSBhZGRyZXNzLiAgKi8KLQkJICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKCIqZGVmYXVsdCoiKS0+Y3VycmVudCA9IG5ld2RvdDsKLQkJICB9Ci0JCWVsc2UgaWYgKCFyZWxheCkKLQkJICB7Ci0JCSAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXcgPQotCQkgICAgICAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikKLQkJICAgICAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlKSkpOwotCi0JCSAgICAvKiBMaW5rIGludG8gZXhpc3RpbmcgY2hhaW4uICAqLwotCQkgICAgbmV3LT5oZWFkZXIubmV4dCA9ICpwcmV2OwotCQkgICAgKnByZXYgPSBuZXc7Ci0JCSAgICBuZXctPmhlYWRlci50eXBlID0gbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOwotCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9Ci0JCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JCSAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9vZmZzZXQgPQotCQkgICAgICBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LmZpbGwgPSBmaWxsOwotCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplID0gbmV3ZG90IC0gZG90OwotCQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplICs9Ci0JCSAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKLQkJICB9Ci0KLQkJZG90ID0gbmV3ZG90OwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JICAvKiBJZiB3ZSBhcmUgcmVsYXhpbmcsIGFuZCB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgcGFzcywgc29tZQotCSAgICAgcGFkZGluZyBzdGF0ZW1lbnRzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQgZHVyaW5nIHByZXZpb3VzCi0JICAgICBwYXNzZXMuICBXZSBtYXkgaGF2ZSB0byBtb3ZlIHRoZSBwYWRkaW5nIHN0YXRlbWVudCB0byBhIG5ldwotCSAgICAgbG9jYXRpb24gaWYgZG90IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSBhdCB0aGlzIHBvaW50IGluIHRoaXMKLQkgICAgIHBhc3MgdGhhbiBpdCBkaWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJldmlvdXMgcGFzcy4gICovCi0JICBzLT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0ID0KLQkgICAgZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgZG90ICs9IHMtPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7Ci0JICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0KLQkgICAgcy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ID0gbGFuZ19zaXplX3NlY3Rpb25zIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAmcy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgIGZpbGwsIGRvdCwgcmVsYXgpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgRkFJTCAoKTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIGNhbiBvbmx5IGdldCBoZXJlIHdoZW4gcmVsYXhpbmcgaXMgdHVybmVkIG9uLiAgKi8KLQotCWNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJldiA9ICZzLT5oZWFkZXIubmV4dDsKLSAgICB9Ci0gIHJldHVybiBkb3Q7Ci19Ci0KLWJmZF92bWEKLWxhbmdfZG9fYXNzaWdubWVudHMgKHMsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgZmlsbCwgZG90KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIGJmZF92bWEgZG90OwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ID0gbGFuZ19kb19hc3NpZ25tZW50cyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCSAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAgZmlsbCwKLQkJCQkgICAgIGRvdCk7Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCSAgICAgICYocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JICAgICAgewotCQlkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYTsKLQkJKHZvaWQpIGxhbmdfZG9fYXNzaWdubWVudHMgKG9zLT5jaGlsZHJlbi5oZWFkLCBvcywKLQkJCQkJICAgIG9zLT5maWxsLCBkb3QpOwotCQlkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYSArIG9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICAgIH0KLQkgICAgaWYgKG9zLT5sb2FkX2Jhc2UpIAotCSAgICAgIHsKLQkJLyogSWYgbm90aGluZyBoYXMgYmVlbiBwbGFjZWQgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gdGhlbgotCQkgICBpdCB3b24ndCBoYXZlIGEgYmZkX3NlY3Rpb24uICovCi0JCWlmIChvcy0+YmZkX3NlY3Rpb24pIAotCQkgIHsKLQkJICAgIG9zLT5iZmRfc2VjdGlvbi0+bG1hIAotCQkgICAgICA9IGV4cF9nZXRfYWJzX2ludChvcy0+bG9hZF9iYXNlLCAwLCJsb2FkIGJhc2UiLCBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQotCSAgZG90ID0gbGFuZ19kb19hc3NpZ25tZW50cyAocy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgIGZpbGwsIGRvdCk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSNpZiAwCi0JY2FzZSBsYW5nX2NvbW1vbl9zdGF0ZW1lbnRfZW51bToKLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGV0cmVlX3ZhbHVlX3R5cGUgdmFsdWU7Ci0KLQkgICAgdmFsdWUgPSBleHBfZm9sZF90cmVlIChzLT5kYXRhX3N0YXRlbWVudC5leHAsCi0JCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCSAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwgZG90LCAmZG90KTsKLQkgICAgcy0+ZGF0YV9zdGF0ZW1lbnQudmFsdWUgPSB2YWx1ZS52YWx1ZTsKLQkgICAgaWYgKHZhbHVlLnZhbGlkX3AgPT0gZmFsc2UpCi0JICAgICAgZWluZm8gKF8oIiVGJVA6IGludmFsaWQgZGF0YSBzdGF0ZW1lbnRcbiIpKTsKLQkgIH0KLQkgIHN3aXRjaCAocy0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKLQkgICAgewotCSAgICBjYXNlIFFVQUQ6Ci0JICAgIGNhc2UgU1FVQUQ6Ci0JICAgICAgZG90ICs9IFFVQURfU0laRTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBMT05HOgotCSAgICAgIGRvdCArPSBMT05HX1NJWkU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0hPUlQ6Ci0JICAgICAgZG90ICs9IFNIT1JUX1NJWkU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQllURToKLQkgICAgICBkb3QgKz0gQllURV9TSVpFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgZXRyZWVfdmFsdWVfdHlwZSB2YWx1ZTsKLQotCSAgICB2YWx1ZSA9IGV4cF9mb2xkX3RyZWUgKHMtPnJlbG9jX3N0YXRlbWVudC5hZGRlbmRfZXhwLAotCQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0sIGRvdCwgJmRvdCk7Ci0JICAgIHMtPnJlbG9jX3N0YXRlbWVudC5hZGRlbmRfdmFsdWUgPSB2YWx1ZS52YWx1ZTsKLQkgICAgaWYgKHZhbHVlLnZhbGlkX3AgPT0gZmFsc2UpCi0JICAgICAgZWluZm8gKF8oIiVGJVA6IGludmFsaWQgcmVsb2Mgc3RhdGVtZW50XG4iKSk7Ci0JICB9Ci0JICBkb3QgKz0gYmZkX2dldF9yZWxvY19zaXplIChzLT5yZWxvY19zdGF0ZW1lbnQuaG93dG8pOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCSAgewotCSAgICBhc2VjdGlvbiAqaW4gPSBzLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0KLQkgICAgaWYgKGluLT5fY29va2VkX3NpemUgIT0gMCkKLQkgICAgICBkb3QgKz0gaW4tPl9jb29rZWRfc2l6ZTsKLQkgICAgZWxzZQotCSAgICAgIGRvdCArPSBpbi0+X3Jhd19zaXplOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLQkgIGZpbGwgPSBzLT5maWxsX3N0YXRlbWVudC5maWxsOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGV4cF9mb2xkX3RyZWUgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCwKLQkJCSAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCSAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwKLQkJCSAgIGRvdCwKLQkJCSAgICZkb3QpOwotCSAgfQotCi0JICBicmVhazsKLQljYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLQkgIGRvdCArPSBzLT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBkb3QgPSBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgIGZpbGwsIGRvdCk7Ci0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCX0KLQotICAgIH0KLSAgcmV0dXJuIGRvdDsKLX0KLQotLyogRml4IGFueSAuc3RhcnRvZi4gb3IgLnNpemVvZi4gc3ltYm9scy4gIFdoZW4gdGhlIGFzc2VtYmxlcnMgc2VlIHRoZQotICAgb3BlcmF0b3IgLnN0YXJ0b2YuIChzZWN0aW9uX25hbWUpLCBpdCBwcm9kdWNlcyBhbiB1bmRlZmluZWQgc3ltYm9sCi0gICAuc3RhcnRvZi5zZWN0aW9uX25hbWUuICBTaW1pbGFybHksIHdoZW4gaXQgc2VlcwotICAgLnNpemVvZi4gKHNlY3Rpb25fbmFtZSksIGl0IHByb2R1Y2VzIGFuIHVuZGVmaW5lZCBzeW1ib2wKLSAgIC5zaXplb2Yuc2VjdGlvbl9uYW1lLiAgRm9yIGFsbCB0aGUgb3V0cHV0IHNlY3Rpb25zLCB3ZSBsb29rIGZvcgotICAgc3VjaCBzeW1ib2xzLCBhbmQgc2V0IHRoZW0gdG8gdGhlIGNvcnJlY3QgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19zZXRfc3RhcnRvZiAoKQotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHMpOwotICAgICAgYnVmID0geG1hbGxvYyAoMTAgKyBzdHJsZW4gKHNlY25hbWUpKTsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiLnN0YXJ0b2YuJXMiLCBzZWNuYW1lKTsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGJ1ZiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IE5VTEwgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+dS5kZWYudmFsdWUgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBzKTsKLQkgIGgtPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCX0KLQotICAgICAgc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIHNlY25hbWUpOwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgYnVmLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gTlVMTCAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JICAgIGgtPnUuZGVmLnZhbHVlID0gcy0+X2Nvb2tlZF9zaXplOwotCSAgZWxzZQotCSAgICBoLT51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQkgIGgtPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCX0KLQotICAgICAgZnJlZSAoYnVmKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1sYW5nX2ZpbmlzaCAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYm9vbGVhbiB3YXJuOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgd2FybiA9IGZhbHNlOwotICBlbHNlCi0gICAgd2FybiA9IHRydWU7Ci0KLSAgaWYgKGVudHJ5X3N5bWJvbCA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vIGVudHJ5IGhhcyBiZWVuIHNwZWNpZmllZC4gIExvb2sgZm9yIHN0YXJ0LCBidXQgZG9uJ3Qgd2FybgotCSBpZiB3ZSBkb24ndCBmaW5kIGl0LiAgKi8KLSAgICAgIGVudHJ5X3N5bWJvbCA9ICJzdGFydCI7Ci0gICAgICB3YXJuID0gZmFsc2U7Ci0gICAgfQotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGVudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLSAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgdmFsOwotCi0gICAgICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkgICAgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zdGFydF9hZGRyZXNzIChvdXRwdXRfYmZkLCB2YWwpKQotCWVpbmZvIChfKCIlUCVGOiVzOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIiksIGVudHJ5X3N5bWJvbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBDT05TVCBjaGFyICpzZW5kOwotCi0gICAgICAvKiBXZSBjb3VsZG4ndCBmaW5kIHRoZSBlbnRyeSBzeW1ib2wuICBUcnkgcGFyc2luZyBpdCBhcyBhCi0gICAgICAgICBudW1iZXIuICAqLwotICAgICAgdmFsID0gYmZkX3NjYW5fdm1hIChlbnRyeV9zeW1ib2wsICZzZW5kLCAwKTsKLSAgICAgIGlmICgqc2VuZCA9PSAnXDAnKQotCXsKLQkgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwgdmFsKSkKLQkgICAgZWluZm8gKF8oIiVQJUY6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzZWN0aW9uICp0czsKLQotCSAgLyogQ2FuJ3QgZmluZCB0aGUgZW50cnkgc3ltYm9sLCBhbmQgaXQncyBub3QgYSBudW1iZXIuICBVc2UKLQkgICAgIHRoZSBmaXJzdCBhZGRyZXNzIGluIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotCSAgdHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi50ZXh0Iik7Ci0JICBpZiAodHMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAod2FybikKLQkJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IGRlZmF1bHRpbmcgdG8gJVZcbiIpLAotCQkgICAgICAgZW50cnlfc3ltYm9sLCBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCB0cykpOwotCSAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwKLQkJCQkJICAgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkJCQkJdHMpKSkKLQkJZWluZm8gKF8oIiVQJUY6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICh3YXJuKQotCQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgbm90IHNldHRpbmcgc3RhcnQgYWRkcmVzc1xuIiksCi0JCSAgICAgICBlbnRyeV9zeW1ib2wpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyBpcyBhIHNtYWxsIGZ1bmN0aW9uIHVzZWQgd2hlbiB3ZSB3YW50IHRvIGlnbm9yZSBlcnJvcnMgZnJvbQotICAgQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLWlnbm9yZV9iZmRfZXJyb3JzIChjb25zdCBjaGFyICpzLCAuLi4pCi0jZWxzZQotaWdub3JlX2JmZF9lcnJvcnMgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0jZW5kaWYKLXsKLSAgLyogRG9uJ3QgZG8gYW55dGhpbmcuICAqLwotfQotCi0vKiBDaGVjayB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgb2YgYWxsIHRoZSBpbnB1dCBmaWxlcyBpcyBjb21wYXRpYmxlCi0gICB3aXRoIHRoZSBvdXRwdXQgZmlsZS4gIEFsc28gY2FsbCB0aGUgYmFja2VuZCB0byBsZXQgaXQgZG8gYW55Ci0gICBvdGhlciBjaGVja2luZyB0aGF0IGlzIG5lZWRlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2NoZWNrICgpCi17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmZpbGU7Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBDT05TVCBiZmRfYXJjaF9pbmZvX3R5cGUgKmNvbXBhdGlibGU7Ci0KLSAgZm9yIChmaWxlID0gZmlsZV9jaGFpbi5oZWFkOwotICAgICAgIGZpbGUgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBmaWxlID0gZmlsZS0+aW5wdXRfc3RhdGVtZW50Lm5leHQpCi0gICAgewotICAgICAgaW5wdXRfYmZkID0gZmlsZS0+aW5wdXRfc3RhdGVtZW50LnRoZV9iZmQ7Ci0gICAgICBjb21wYXRpYmxlID0gYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgKGlucHV0X2JmZCwKLQkJCQkJICAgIG91dHB1dF9iZmQpOwotICAgICAgaWYgKGNvbXBhdGlibGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJXMgYXJjaGl0ZWN0dXJlIG9mIGlucHV0IGZpbGUgYCVCJyBpcyBpbmNvbXBhdGlibGUgd2l0aCAlcyBvdXRwdXRcbiIpLAotCQkgICBiZmRfcHJpbnRhYmxlX25hbWUgKGlucHV0X2JmZCksIGlucHV0X2JmZCwKLQkJICAgYmZkX3ByaW50YWJsZV9uYW1lIChvdXRwdXRfYmZkKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgcGZuID0gTlVMTDsKLQotCSAgLyogSWYgd2UgYXJlbid0IHN1cHBvc2VkIHRvIHdhcm4gYWJvdXQgbWlzbWF0Y2hlZCBpbnB1dAotICAgICAgICAgICAgIGZpbGVzLCB0ZW1wb3JhcmlseSBzZXQgdGhlIEJGRCBlcnJvciBoYW5kbGVyIHRvIGEKLSAgICAgICAgICAgICBmdW5jdGlvbiB3aGljaCB3aWxsIGRvIG5vdGhpbmcuICBXZSBzdGlsbCB3YW50IHRvIGNhbGwKLSAgICAgICAgICAgICBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgc2luY2UgaXQgbWF5IHNldCB1cAotICAgICAgICAgICAgIGluZm9ybWF0aW9uIHdoaWNoIGlzIG5lZWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgaWYgKCEgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JICAgIHBmbiA9IGJmZF9zZXRfZXJyb3JfaGFuZGxlciAoaWdub3JlX2JmZF9lcnJvcnMpOwotCSAgaWYgKCEgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGlucHV0X2JmZCwgb3V0cHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICBpZiAoY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JCWVpbmZvIChfKCIlRSVYOiBmYWlsZWQgdG8gbWVyZ2UgdGFyZ2V0IHNwZWNpZmljIGRhdGEgb2YgZmlsZSAlQlxuIiksCi0JCSAgICAgICBpbnB1dF9iZmQpOwotCSAgICB9Ci0JICBpZiAoISBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCkKLQkgICAgYmZkX3NldF9lcnJvcl9oYW5kbGVyIChwZm4pOwotCX0KLSAgICB9Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIGdsb2JhbCBjb21tb24gc3ltYm9scyBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlCi0gICBjb3JyZWN0IHNlY3Rpb24uICBUaGUgLXNvcnQtY29tbW9uIGNvbW1hbmQgbGluZSBzd2l0Y2ggbWF5IGJlIHVzZWQKLSAgIHRvIHJvdWdobHkgc29ydCB0aGUgZW50cmllcyBieSBzaXplLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfY29tbW9uICgpCi17Ci0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgY29uZmlnLnNvcnRfY29tbW9uKQotICAgIGJmZF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbmtfaW5mby5oYXNoLCBsYW5nX29uZV9jb21tb24sIChQVFIpIE5VTEwpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IHBvd2VyOwotCi0gICAgICBmb3IgKHBvd2VyID0gNDsgcG93ZXIgPj0gMDsgcG93ZXItLSkKLQliZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgbGFuZ19vbmVfY29tbW9uLAotCQkJCShQVFIpICZwb3dlcik7Ci0gICAgfQotfQotCi0vKiBQbGFjZSBvbmUgY29tbW9uIHN5bWJvbCBpbiB0aGUgY29ycmVjdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxhbmdfb25lX2NvbW1vbiAoaCwgaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpbmZvOwotewotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotICBiZmRfdm1hIHNpemU7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNpemUgPSBoLT51LmMuc2l6ZTsKLSAgcG93ZXJfb2ZfdHdvID0gaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlcjsKLQotICBpZiAoY29uZmlnLnNvcnRfY29tbW9uCi0gICAgICAmJiBwb3dlcl9vZl90d28gPCAodW5zaWduZWQgaW50KSAqKGludCAqKSBpbmZvKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlY3Rpb24gPSBoLT51LmMucC0+c2VjdGlvbjsKLQotICAvKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IEFMSUdOX04gKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSwKLQkJCQkgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0KLSAgLyogQWRqdXN0IHRoZSBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKHBvd2VyX29mX3R3byA+IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcikKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcl9vZl90d287Ci0KLSAgLyogQ2hhbmdlIHRoZSBzeW1ib2wgZnJvbSBjb21tb24gdG8gZGVmaW5lZC4gICovCi0gIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotICBoLT51LmRlZi52YWx1ZSA9IHNlY3Rpb24tPl9jb29rZWRfc2l6ZTsKLQotICAvKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSArPSBzaXplOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiBpcyBhbGxvY2F0ZWQgaW4gbWVtb3J5LCBhbmQgbWFrZSBzdXJlIHRoYXQKLSAgICAgaXQgaXMgbm8gbG9uZ2VyIGEgY29tbW9uIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0gIHNlY3Rpb24tPmZsYWdzICY9IH4gU0VDX0lTX0NPTU1PTjsKLQotICBpZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgc3RhdGljIGJvb2xlYW4gaGVhZGVyX3ByaW50ZWQ7Ci0gICAgICBpbnQgbGVuOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgYnVmWzUwXTsKLQotICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JewotCSAgbWluZm8gKF8oIlxuQWxsb2NhdGluZyBjb21tb24gc3ltYm9sc1xuIikpOwotCSAgbWluZm8gKF8oIkNvbW1vbiBzeW1ib2wgICAgICAgc2l6ZSAgICAgICAgICAgICAgZmlsZVxuXG4iKSk7Ci0JICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBuYW1lID0gZGVtYW5nbGUgKGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIG1pbmZvICgiJXMiLCBuYW1lKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBmcmVlIChuYW1lKTsKLQotICAgICAgaWYgKGxlbiA+PSAxOSkKLQl7Ci0JICBwcmludF9ubCAoKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgICAgd2hpbGUgKGxlbiA8IDIwKQotCXsKLQkgIHByaW50X3NwYWNlICgpOwotCSAgKytsZW47Ci0JfQotCi0gICAgICBtaW5mbyAoIjB4Iik7Ci0gICAgICBpZiAoc2l6ZSA8PSAweGZmZmZmZmZmKQotCXNwcmludGYgKGJ1ZiwgIiVseCIsICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmX3ZtYSAoYnVmLCBzaXplKTsKLSAgICAgIG1pbmZvICgiJXMiLCBidWYpOwotICAgICAgbGVuID0gc3RybGVuIChidWYpOwotCi0gICAgICB3aGlsZSAobGVuIDwgMTYpCi0JewotCSAgcHJpbnRfc3BhY2UgKCk7Ci0JICArK2xlbjsKLQl9Ci0KLSAgICAgIG1pbmZvICgiJUJcbiIsIHNlY3Rpb24tPm93bmVyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1ydW4gdGhyb3VnaCB0aGUgaW5wdXQgZmlsZXMgYW5kIGVuc3VyZSB0aGF0IGV2ZXJ5IGlucHV0Ci1zZWN0aW9uIGhhcyBzb21ld2hlcmUgdG8gZ28uIElmIG9uZSBpcyBmb3VuZCB3aXRob3V0Ci1hIGRlc3RpbmF0aW9uIHRoZW4gY3JlYXRlIGFuIGlucHV0IHJlcXVlc3QgYW5kIHBsYWNlIGl0Ci1pbnRvIHRoZSBzdGF0ZW1lbnQgdHJlZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX3BsYWNlX29ycGhhbnMgKCkKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLQotICBmb3IgKGZpbGUgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgZmlsZSAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOwotICAgICAgIGZpbGUgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBmaWxlLT50aGVfYmZkLT5zZWN0aW9uczsKLQkgICBzICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0KQotCXsKLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBub3QgYXR0YXRjaGVkLCByb290Ci0JICAgICAgICAgYXJvdW5kIGZvciBhIHNlbnNpYmxlIHBsYWNlIGZvciBpdCB0byBnbyAqLwotCi0JICAgICAgaWYgKGZpbGUtPmp1c3Rfc3ltc19mbGFnKQotCQl7Ci0JCSAgLyogV2UgYXJlIG9ubHkgcmV0cmlldmluZyBzeW1ib2wgdmFsdWVzIGZyb20gdGhpcwotICAgICAgICAgICAgICAgICAgICAgZmlsZS4gIFdlIHdhbnQgdGhlIHN5bWJvbHMgdG8gYWN0IGFzIHRob3VnaCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBpbiB0aGUgZmlsZSBhcmUgYWJzb2x1dGUuICAqLwotCQkgIHMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJICBzLT5vdXRwdXRfb2Zmc2V0ID0gcy0+dm1hOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChzLT5uYW1lLCAiQ09NTU9OIikgPT0gMCkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSBsb25lbHkgY29tbW9uIHNlY3Rpb24gd2hpY2ggbXVzdCBoYXZlCi0JCSAgICAgY29tZSBmcm9tIGFuIGFyY2hpdmUuICBXZSBhdHRhY2ggdG8gdGhlIHNlY3Rpb24KLQkJICAgICB3aXRoIHRoZSB3aWxkY2FyZC4gICovCi0JCSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotCQkgICAgICB8fCBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24pCi0JCSAgICB7Ci0JCSAgICAgIGlmIChkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCQl7Ci0jaWYgMAotCQkJICAvKiBUaGlzIG1lc3NhZ2UgaGFwcGVucyB3aGVuIHVzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdnIzLmlmaWxlIGxpbmtlciBzY3JpcHQsIHNvIEkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBpdC4gICovCi0JCQkgIGluZm9fbXNnIChfKCIlUDogbm8gW0NPTU1PTl0gY29tbWFuZCwgZGVmYXVsdGluZyB0byAuYnNzXG4iKSk7Ci0jZW5kaWYKLQkJCSAgZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9Ci0JCQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLmJzcyIpOwotCi0JCQl9Ci0JCSAgICAgIHdpbGRfZG9pdCAoJmRlZmF1bHRfY29tbW9uX3NlY3Rpb24tPmNoaWxkcmVuLCBzLAotCQkJCSBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLCBmaWxlKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxkZW11bF9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpKQotCQk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAocy0+bmFtZSk7Ci0KLQkJICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi12b2lkCi1sYW5nX3NldF9mbGFncyAocHRyLCBmbGFncywgaW52ZXJ0KQotICAgICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcHRyOwotICAgICBDT05TVCBjaGFyICpmbGFnczsKLSAgICAgaW50IGludmVydDsKLXsKLSAgZmxhZ3dvcmQgKnB0cl9mbGFnczsKLQotICBwdHJfZmxhZ3MgPSBpbnZlcnQgPyAmcHRyLT5ub3RfZmxhZ3MgOiAmcHRyLT5mbGFnczsKLSAgd2hpbGUgKCpmbGFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpmbGFncykKLQl7Ci0JY2FzZSAnQSc6IGNhc2UgJ2EnOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBicmVhazsKLQotCWNhc2UgJ1InOiBjYXNlICdyJzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCSAgYnJlYWs7Ci0KLQljYXNlICdXJzogY2FzZSAndyc6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19EQVRBOwotCSAgYnJlYWs7Ci0KLQljYXNlICdYJzogY2FzZSAneCc6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19DT0RFOwotCSAgYnJlYWs7Ci0KLQljYXNlICdMJzogY2FzZSAnbCc6Ci0JY2FzZSAnSSc6IGNhc2UgJ2knOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfTE9BRDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIHN5bnRheCBpbiBmbGFnc1xuIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZmxhZ3MrKzsKLSAgICB9Ci19Ci0KLS8qIENhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGlucHV0IGZpbGUuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCi0gICBvbiBhbiBhcmNoaXZlLCBidXQgbm90IG9uIHRoZSBlbGVtZW50cy4gICovCi0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGlucHV0X2ZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBmICE9IE5VTEw7Ci0gICAgICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHRfcmVhbF9maWxlKQotICAgIGZ1bmMgKGYpOwotfQotCi0vKiBDYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBmaWxlLiAgVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGFsbAotICAgdGhlIGVsZW1lbnRzIG9mIGFuIGFyY2hpdmUgd2hpY2ggYXJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLCBidXQgd2lsbAotICAgbm90IGJlIGNhbGxlZCBvbiB0aGUgYXJjaGl2ZSBmaWxlIGl0c2VsZi4gICovCi0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfZmlsZSAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBmICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0gICAgICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHQpCi0gICAgewotICAgICAgZnVuYyAoZik7Ci0gICAgfQotfQotCi0jaWYgMAotCi0vKiBOb3QgdXNlZC4gICovCi0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfaW5wdXRfc2VjdGlvbiAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGJmZCAqIGFiLCBhc2VjdGlvbiAqIGFzKSk7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7Ci0KLSAgZm9yIChmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZV9jaGFpbi5oZWFkOwotICAgICAgIGYgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKLSAgICAgICBmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZi0+bmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gZi0+dGhlX2JmZC0+c2VjdGlvbnM7Ci0JICAgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgICBzID0gcy0+bmV4dCkKLQl7Ci0JICBmdW5jIChmLT50aGVfYmZkLCBzKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYKLQotdm9pZAotbGRsYW5nX2FkZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqIGVudHJ5OwotewotICBiZmQgKipwcDsKLQotICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZmaWxlX2NoYWluLAotCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGVudHJ5LAotCQkJICZlbnRyeS0+bmV4dCk7Ci0KLSAgLyogVGhlIEJGRCBsaW5rZXIgbmVlZHMgdG8gaGF2ZSBhIGxpc3Qgb2YgYWxsIGlucHV0IEJGRHMgaW52b2x2ZWQgaW4KLSAgICAgYSBsaW5rLiAgKi8KLSAgQVNTRVJUIChlbnRyeS0+dGhlX2JmZC0+bGlua19uZXh0ID09IChiZmQgKikgTlVMTCk7Ci0gIEFTU0VSVCAoZW50cnktPnRoZV9iZmQgIT0gb3V0cHV0X2JmZCk7Ci0gIGZvciAocHAgPSAmbGlua19pbmZvLmlucHV0X2JmZHM7Ci0gICAgICAgKnBwICE9IChiZmQgKikgTlVMTDsKLSAgICAgICBwcCA9ICYoKnBwKS0+bGlua19uZXh0KQotICAgIDsKLSAgKnBwID0gZW50cnktPnRoZV9iZmQ7Ci0gIGVudHJ5LT50aGVfYmZkLT51c3JkYXRhID0gKFBUUikgZW50cnk7Ci0gIGJmZF9zZXRfZ3Bfc2l6ZSAoZW50cnktPnRoZV9iZmQsIGdfc3dpdGNoX3ZhbHVlKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb25zIGFuZCBjaGVjayBmb3IgYW55IHdoaWNoIHNob3VsZCBub3QgYmUKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBXZSBuZWVkIHRvIGRvIHRoaXMgbm93LCBzbyB0aGF0IHdlIGNhbgotICAgICBub3RpY2Ugd2hlbiB0aGUgYmFja2VuZCBsaW5rZXIgdHJpZXMgdG8gcmVwb3J0IG11bHRpcGxlCi0gICAgIGRlZmluaXRpb24gZXJyb3JzIGZvciBzeW1ib2xzIHdoaWNoIGFyZSBpbiBzZWN0aW9ucyB3ZSBhcmVuJ3QKLSAgICAgZ29pbmcgdG8gbGluay4gIEZJWE1FOiBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gZW50aXJlbHkgaWdub3JlCi0gICAgIHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgaW4gc2VjdGlvbnMgd2hpY2ggYXJlIGdvaW5nIHRvIGJlCi0gICAgIGRpc2NhcmRlZC4gIFRoaXMgd291bGQgcmVxdWlyZSBtb2RpZnlpbmcgdGhlIGJhY2tlbmQgbGlua2VyIGZvcgotICAgICBlYWNoIGJhY2tlbmQgd2hpY2ggbWlnaHQgc2V0IHRoZSBTRUNfTElOS19PTkNFIGZsYWcuICBJZiB3ZSBkbwotICAgICB0aGlzLCB3ZSBzaG91bGQgcHJvYmFibHkgaGFuZGxlIFNFQ19FWENMVURFIGluIHRoZSBzYW1lIHdheS4gICovCi0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChlbnRyeS0+dGhlX2JmZCwgc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCwgKFBUUikgZW50cnkpOwotfQotCi12b2lkCi1sYW5nX2FkZF9vdXRwdXQgKG5hbWUsIGZyb21fc2NyaXB0KQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBpbnQgZnJvbV9zY3JpcHQ7Ci17Ci0gIC8qIE1ha2UgLW8gb24gY29tbWFuZCBsaW5lIG92ZXJyaWRlIE9VVFBVVCBpbiBzY3JpcHQuICAqLwotICBpZiAoaGFkX291dHB1dF9maWxlbmFtZSA9PSBmYWxzZSB8fCAhZnJvbV9zY3JpcHQpCi0gICAgewotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gbmFtZTsKLSAgICAgIGhhZF9vdXRwdXRfZmlsZW5hbWUgPSB0cnVlOwotICAgIH0KLX0KLQotCi1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotCi1zdGF0aWMgaW50Ci10b3Bvd2VyICh4KQotICAgICBpbnQgeDsKLXsKLSAgdW5zaWduZWQgaW50IGkgPSAxOwotICBpbnQgbDsKLQotICBpZiAoeCA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAobCA9IDA7IGwgPCAzMjsgbCsrKSAKLSAgICB7Ci0gICAgICBpZiAoaSA+PSAodW5zaWduZWQgaW50KSB4KQotCXJldHVybiBsOwotICAgICAgaSA8PD0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbmFtZSwKLQkJCQkgICAgIGFkZHJlc3NfZXhwLCBzZWN0eXBlLCBibG9ja192YWx1ZSwKLQkJCQkgICAgIGFsaWduLCBzdWJhbGlnbiwgZWJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lOwotICAgICBldHJlZV90eXBlICogYWRkcmVzc19leHA7Ci0gICAgIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGU7Ci0gICAgIGJmZF92bWEgYmxvY2tfdmFsdWU7Ci0gICAgIGV0cmVlX3R5cGUgKmFsaWduOwotICAgICBldHJlZV90eXBlICpzdWJhbGlnbjsKLSAgICAgZXRyZWVfdHlwZSAqZWJhc2U7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGN1cnJlbnRfc2VjdGlvbiA9Ci0gICBvcyA9Ci0gICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbmFtZSk7Ci0KLQotCi0gIC8qIEFkZCB0aGlzIHN0YXRlbWVudCB0byB0cmVlICovCi0gIC8qICBhZGRfc3RhdGVtZW50KGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0sCi0gICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOyovCi0gIC8qIE1ha2UgbmV4dCB0aGluZ3MgY2hhaW4gaW50byBzdWJjaGFpbiBvZiB0aGlzICovCi0KLSAgaWYgKG9zLT5hZGRyX3RyZWUgPT0KLSAgICAgIChldHJlZV90eXBlICopIE5VTEwpCi0gIHsKLSAgICBvcy0+YWRkcl90cmVlID0KLSAgICAgYWRkcmVzc19leHA7Ci0gIH0KLSAgb3MtPnNlY3R5cGUgPSBzZWN0eXBlOwotICBpZiAoc2VjdHlwZSAhPSBub2xvYWRfc2VjdGlvbikKLSAgICBvcy0+ZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0gIGVsc2UKLSAgICBvcy0+ZmxhZ3MgPSBTRUNfTkVWRVJfTE9BRDsKLSAgb3MtPmJsb2NrX3ZhbHVlID0gYmxvY2tfdmFsdWUgPyBibG9ja192YWx1ZSA6IDE7Ci0gIHN0YXRfcHRyID0gJm9zLT5jaGlsZHJlbjsKLQotICBvcy0+c3Vic2VjdGlvbl9hbGlnbm1lbnQgPSB0b3Bvd2VyKAotICAgZXhwX2dldF92YWx1ZV9pbnQoc3ViYWxpZ24sIC0xLAotCQkgICAgICJzdWJzZWN0aW9uIGFsaWdubWVudCIsCi0JCSAgICAgMCkpOwotICBvcy0+c2VjdGlvbl9hbGlnbm1lbnQgPSB0b3Bvd2VyKAotICAgZXhwX2dldF92YWx1ZV9pbnQoYWxpZ24sIC0xLAotCQkgICAgICJzZWN0aW9uIGFsaWdubWVudCIsIDApKTsKLQotICBvcy0+bG9hZF9iYXNlID0gZWJhc2U7Ci19Ci0KLQotdm9pZAotbGFuZ19maW5hbCAoKQotewotICBsYW5nX291dHB1dF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0KLSAgICBuZXdfc3RhdCAobGFuZ19vdXRwdXRfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0KLSAgbmV3LT5uYW1lID0gb3V0cHV0X2ZpbGVuYW1lOwotfQotCi0vKiBSZXNldCB0aGUgY3VycmVudCBjb3VudGVycyBpbiB0aGUgcmVnaW9ucyAqLwotc3RhdGljIHZvaWQKLXJlc2V0X21lbW9yeV9yZWdpb25zICgpCi17Ci0gIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpwID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0KLSAgZm9yIChwID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0gICAgICAgcCAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBwLT5vbGRfbGVuZ3RoID0gKGJmZF9zaXplX3R5cGUpIChwLT5jdXJyZW50IC0gcC0+b3JpZ2luKTsKLSAgICAgIHAtPmN1cnJlbnQgPSBwLT5vcmlnaW47Ci0gICAgfQotfQotCi0vKiBFeHBhbmQgYSB3aWxkIHN0YXRlbWVudCBmb3IgYSBwYXJ0aWN1bGFyIEZJTEUsIG1hcmtpbmcgaXRzIHNlY3Rpb25zIEtFRVAKLSAgIGFzIG5lZWRlZC4gIFNFQ1RJT04gbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgaXMgYSB3aWxkIGNhcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2Nfc2VjdGlvbl9jYWxsYmFjayAocHRyLCBzZWN0aW9uLCBmaWxlLCBkYXRhKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnB0cjsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIC8qIElmIHRoZSB3aWxkIHBhdHRlcm4gd2FzIG1hcmtlZCBLRUVQLCB0aGUgbWVtYmVyIHNlY3Rpb25zCi0gICAgIHNob3VsZCBiZSBhcyB3ZWxsLiAgKi8KLSAgaWYgKHB0ci0+a2VlcF9zZWN0aW9ucykKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLX0KLQotLyogSGFuZGxlIGEgd2lsZCBzdGF0ZW1lbnQsIG1hcmtpbmcgaXQgYWdhaW5zdCBHQy4gIFNFQ1RJT04gb3IgRklMRSBvciBib3RoCi0gICBtYXkgYmUgTlVMTCwgaW5kaWNhdGluZyB0aGF0IGl0IGlzIGEgd2lsZGNhcmQuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19nY193aWxkIChzLCBzZWN0aW9uLCBmaWxlKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIHdhbGtfd2lsZCAocywgc2VjdGlvbiwgZmlsZSwgZ2Nfc2VjdGlvbl9jYWxsYmFjaywgTlVMTCk7Ci19Ci0KLS8qIEl0ZXJhdGUgb3ZlciBzZWN0aW9ucyBtYXJraW5nIHRoZW0gYWdhaW5zdCBHQy4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2djX3NlY3Rpb25zXzEgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfd2lsZCAoJnMtPndpbGRfc3RhdGVtZW50LAotCQkJcy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLAotCQkJcy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfc2VjdGlvbnNfMSAoY29uc3RydWN0b3JfbGlzdC5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfc2VjdGlvbnNfMSAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19nY19zZWN0aW9uc18xIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWxhbmdfZ2Nfc2VjdGlvbnMgKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKnVsaXN0LCBmYWtlX2xpc3Rfc3RhcnQ7Ci0KLSAgLyogS2VlcCBhbGwgc2VjdGlvbnMgc28gbWFya2VkIGluIHRoZSBsaW5rIHNjcmlwdC4gICovCi0KLSAgbGFuZ19nY19zZWN0aW9uc18xIChzdGF0ZW1lbnRfbGlzdC5oZWFkKTsKLQotICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBjb250YWluaW5nIHN5bWJvbHMgdW5kZWZpbmVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCi0gICAgIEhhbmRsZSB0aGUgZW50cnkgc3ltYm9sIGF0IHRoZSBzYW1lIHRpbWUuICAqLwotCi0gIGZha2VfbGlzdF9zdGFydC5uZXh0ID0gbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfaGVhZDsKLSAgaWYgKGVudHJ5X3N5bWJvbCA9PSBOVUxMKQotICAgIGZha2VfbGlzdF9zdGFydC5uYW1lID0gInN0YXJ0IjsKLSAgZWxzZQotICAgIGZha2VfbGlzdF9zdGFydC5uYW1lID0gKGNoYXIgKikgZW50cnlfc3ltYm9sOwotCi0gIGZvciAodWxpc3QgPSAmZmFrZV9saXN0X3N0YXJ0OyB1bGlzdDsgdWxpc3QgPSB1bGlzdC0+bmV4dCkKLSAgICB7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB1bGlzdC0+bmFtZSwgCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0gICAgICAgICAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnUuZGVmLnNlY3Rpb24pKQotCXsKLQkgIGgtPnUuZGVmLnNlY3Rpb24tPmZsYWdzIHw9IFNFQ19LRUVQOwotCX0KLSAgICB9Ci0KLSAgYmZkX2djX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLX0KLQotdm9pZAotbGFuZ19wcm9jZXNzICgpCi17Ci0gIGxhbmdfcmVhc29uYWJsZV9kZWZhdWx0cyAoKTsKLSAgY3VycmVudF90YXJnZXQgPSBkZWZhdWx0X3RhcmdldDsKLQotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAobGRsYW5nX29wZW5fb3V0cHV0KTsJLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUgKi8KLQotICBsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCk7Ci0KLSAgLyogQWRkIHRvIHRoZSBoYXNoIHRhYmxlIGFsbCB1bmRlZmluZWRzIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KLSAgbGFuZ19wbGFjZV91bmRlZmluZWRzICgpOwotCi0gIC8qIENyZWF0ZSBhIGJmZCBmb3IgZWFjaCBpbnB1dCBmaWxlICovCi0gIGN1cnJlbnRfdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0gIG9wZW5faW5wdXRfYmZkcyAoc3RhdGVtZW50X2xpc3QuaGVhZCwgZmFsc2UpOwotCi0gIGxkZW11bF9hZnRlcl9vcGVuICgpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIG5vdCBtaXhpbmcgYXJjaGl0ZWN0dXJlcy4gIFdlIGNhbGwgdGhpcwotICAgICBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQsIGJ1dCBiZWZvcmUgd2UgZG8gYW55Ci0gICAgIG90aGVyIHByb2Nlc3NpbmcsIHNvIHRoYXQgYW55IG9wZXJhdGlvbnMgbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICAgICBkb2VzIG9uIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIGtub3duIGR1cmluZyB0aGUgcmVzdCBvZiB0aGUKLSAgICAgbGluay4gICovCi0gIGxhbmdfY2hlY2sgKCk7Ci0KLSAgLyogSGFuZGxlIC5leHBvcnRzIGluc3RlYWQgb2YgYSB2ZXJzaW9uIHNjcmlwdCBpZiB3ZSdyZSB0b2xkIHRvIGRvIHNvLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS52ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbikKLSAgICBsYW5nX2RvX3ZlcnNpb25fZXhwb3J0c19zZWN0aW9uICgpOwotCi0gIC8qIEJ1aWxkIGFsbCBzZXRzIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBmcm9tIHRoZSBpbnB1dAotICAgICBmaWxlcy4gICovCi0gIGxkY3Rvcl9idWlsZF9zZXRzICgpOwotCi0gIC8qIFJlbW92ZSB1bnJlZmVyZW5jZWQgc2VjdGlvbnMgaWYgYXNrZWQgdG8uICAqLwotICBpZiAoY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zKQotICAgIGxhbmdfZ2Nfc2VjdGlvbnMgKCk7Ci0KLSAgLyogU2l6ZSB1cCB0aGUgY29tbW9uIGRhdGEgKi8KLSAgbGFuZ19jb21tb24gKCk7Ci0KLSAgLyogUnVuIHRocm91Z2ggdGhlIGNvbnRvdXJzIG9mIHRoZSBzY3JpcHQgYW5kIGF0dGFjaCBpbnB1dCBzZWN0aW9ucwotICAgICB0byB0aGUgY29ycmVjdCBvdXRwdXQgc2VjdGlvbnMKLSAgICAgKi8KLSAgbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAoc3RhdGVtZW50X2xpc3QuaGVhZCwgKGNoYXIgKikgTlVMTCwKLQkJCQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMKTsKLQotCi0gIC8qIEZpbmQgYW55IHNlY3Rpb25zIG5vdCBhdHRhY2hlZCBleHBsaWNpdGx5IGFuZCBoYW5kbGUgdGhlbSAqLwotICBsYW5nX3BsYWNlX29ycGhhbnMgKCk7Ci0KLSAgbGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9uICgpOwotCi0gIC8qIFdlIG11c3QgcmVjb3JkIHRoZSBwcm9ncmFtIGhlYWRlcnMgYmVmb3JlIHdlIHRyeSB0byBmaXggdGhlCi0gICAgIHNlY3Rpb24gcG9zaXRpb25zLCBzaW5jZSB0aGV5IHdpbGwgYWZmZWN0IFNJWkVPRl9IRUFERVJTLiAgKi8KLSAgbGFuZ19yZWNvcmRfcGhkcnMgKCk7Ci0KLSAgLyogTm93IHJ1biBhcm91bmQgYW5kIHJlbGF4IGlmIHdlIGNhbiAqLwotICBpZiAoY29tbWFuZF9saW5lLnJlbGF4KQotICAgIHsKLSAgICAgIC8qIEZpcnN0IHRpbWUgcm91bmQgaXMgYSB0cmlhbCBydW4gdG8gZ2V0IHRoZSAnd29yc3QgY2FzZScKLQkgYWRkcmVzc2VzIG9mIHRoZSBvYmplY3RzIGlmIHRoZXJlIHdhcyBubyByZWxheGluZy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJihzdGF0ZW1lbnRfbGlzdC5oZWFkKSwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLQotICAgICAgLyogS2VlcCByZWxheGluZyB1bnRpbCBiZmRfcmVsYXhfc2VjdGlvbiBnaXZlcyB1cC4gICovCi0gICAgICBkbwotCXsKLQkgIHJlc2V0X21lbW9yeV9yZWdpb25zICgpOwotCi0JICByZWxheF9hZ2FpbiA9IGZhbHNlOwotCi0JICAvKiBOb3RlOiBwZS1kbGwuYyBkb2VzIHNvbWV0aGluZyBsaWtlIHRoaXMgYWxzby4gIElmIHlvdSBmaW5kCi0JICAgICB5b3UgbmVlZCB0byBjaGFuZ2UgdGhpcyBjb2RlLCB5b3UgcHJvYmFibHkgbmVlZCB0byBjaGFuZ2UKLQkgICAgIHBlLWRsbC5jIGFsc28uICBESiAqLwotCi0JICAvKiBEbyBhbGwgdGhlIGFzc2lnbm1lbnRzIHdpdGggb3VyIGN1cnJlbnQgZ3Vlc3NlcyBhcyB0bwotCSAgICAgc2VjdGlvbiBzaXplcy4gICovCi0JICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkJICAgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgICAgICAoZmlsbF90eXBlKSAwLCAoYmZkX3ZtYSkgMCk7Ci0KLQkgIC8qIFBlcmZvcm0gYW5vdGhlciByZWxheCBwYXNzIC0gdGhpcyB0aW1lIHdlIGtub3cgd2hlcmUgdGhlCi0JICAgICBnbG9iYWxzIGFyZSwgc28gY2FuIG1ha2UgYmV0dGVyIGd1ZXNzLiAgKi8KLQkgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJCSAgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgICAgICYoc3RhdGVtZW50X2xpc3QuaGVhZCksIDAsIChiZmRfdm1hKSAwLCB0cnVlKTsKLQl9Ci0gICAgICB3aGlsZSAocmVsYXhfYWdhaW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNpemUgdXAgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJCSAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmKHN0YXRlbWVudF9saXN0LmhlYWQpLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotICAgIH0KLQotICAvKiBTZWUgaWYgYW55dGhpbmcgc3BlY2lhbCBzaG91bGQgYmUgZG9uZSBub3cgd2Uga25vdyBob3cgYmlnCi0gICAgIGV2ZXJ5dGhpbmcgaXMuICAqLwotICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKLQotICAvKiBGaXggYW55IC5zdGFydG9mLiBvciAuc2l6ZW9mLiBzeW1ib2xzLiAgKi8KLSAgbGFuZ19zZXRfc3RhcnRvZiAoKTsKLQotICAvKiBEbyBhbGwgdGhlIGFzc2lnbm1lbnRzLCBub3cgdGhhdCB3ZSBrbm93IHRoZSBmaW5hbCByZXN0aW5ncGxhY2VzCi0gICAgIG9mIGFsbCB0aGUgc3ltYm9scyAqLwotCi0gIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCSAgICAgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCSAgICAgICAoZmlsbF90eXBlKSAwLCAoYmZkX3ZtYSkgMCk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHNlY3Rpb24gYWRkcmVzc2VzIG1ha2Ugc2Vuc2UuICAqLwotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiBjb21tYW5kX2xpbmUuY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMpCi0gICAgbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyAoKTsKLSAgCi0gIC8qIEZpbmFsIHN0dWZmcyAqLwotCi0gIGxkZW11bF9maW5pc2ggKCk7Ci0gIGxhbmdfZmluaXNoICgpOwotfQotCi0vKiBFWFBPUlRFRCBUTyBZQUNDICovCi0KLXZvaWQKLWxhbmdfYWRkX3dpbGQgKHNlY3Rpb25fbmFtZSwgc2VjdGlvbnNfc29ydGVkLCBmaWxlbmFtZSwgZmlsZW5hbWVzX3NvcnRlZCwKLQkgICAgICAga2VlcF9zZWN0aW9ucywgZXhjbHVkZV9maWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqY29uc3Qgc2VjdGlvbl9uYW1lOwotICAgICBib29sZWFuIHNlY3Rpb25zX3NvcnRlZDsKLSAgICAgY29uc3QgY2hhciAqY29uc3QgZmlsZW5hbWU7Ci0gICAgIGJvb2xlYW4gZmlsZW5hbWVzX3NvcnRlZDsKLSAgICAgYm9vbGVhbiBrZWVwX3NlY3Rpb25zOwotICAgICBjb25zdCBjaGFyICpleGNsdWRlX2ZpbGVuYW1lOwotewotICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX3dpbGRfc3RhdGVtZW50LAotCQkJCQkgICAgc3RhdF9wdHIpOwotCi0gIGlmIChzZWN0aW9uX25hbWUgIT0gKGNoYXIgKikgTlVMTCAmJiBzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIkNPTU1PTiIpID09IDApCi0gICAgewotICAgICAgcGxhY2VkX2NvbW1vbnMgPSB0cnVlOwotICAgIH0KLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwgJiYgISB3aWxkY2FyZHAgKGZpbGVuYW1lKSkKLSAgICB7Ci0gICAgICBsYW5nX2hhc19pbnB1dF9maWxlID0gdHJ1ZTsKLSAgICB9Ci0gIG5ldy0+c2VjdGlvbl9uYW1lID0gc2VjdGlvbl9uYW1lOwotICBuZXctPnNlY3Rpb25zX3NvcnRlZCA9IHNlY3Rpb25zX3NvcnRlZDsKLSAgbmV3LT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuZXctPmZpbGVuYW1lc19zb3J0ZWQgPSBmaWxlbmFtZXNfc29ydGVkOwotICBuZXctPmtlZXBfc2VjdGlvbnMgPSBrZWVwX3NlY3Rpb25zOwotICBuZXctPmV4Y2x1ZGVfZmlsZW5hbWUgPSBleGNsdWRlX2ZpbGVuYW1lOwotICBsYW5nX2xpc3RfaW5pdCAoJm5ldy0+Y2hpbGRyZW4pOwotfQotCi12b2lkCi1sYW5nX3NlY3Rpb25fc3RhcnQgKG5hbWUsIGFkZHJlc3MpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKiBhZGRyZXNzOwotewotICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgKmFkID0gbmV3X3N0YXQgKGxhbmdfYWRkcmVzc19zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLQotICBhZC0+c2VjdGlvbl9uYW1lID0gbmFtZTsKLSAgYWQtPmFkZHJlc3MgPSBhZGRyZXNzOwotfQotCi0vKiBTZXQgdGhlIHN0YXJ0IHN5bWJvbCB0byBOQU1FLiAgQ01ETElORSBpcyBub256ZXJvIGlmIHRoaXMgaXMgY2FsbGVkCi0gICBiZWNhdXNlIG9mIGEgLWUgYXJndW1lbnQgb24gdGhlIGNvbW1hbmQgbGluZSwgb3IgemVybyBpZiB0aGlzIGlzCi0gICBjYWxsZWQgYnkgRU5UUlkgaW4gYSBsaW5rZXIgc2NyaXB0LiAgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0YWtlCi0gICBwcmVjZWRlbmNlLiAgKi8KLQotdm9pZAotbGFuZ19hZGRfZW50cnkgKG5hbWUsIGNtZGxpbmUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGJvb2xlYW4gY21kbGluZTsKLXsKLSAgaWYgKGVudHJ5X3N5bWJvbCA9PSBOVUxMCi0gICAgICB8fCBjbWRsaW5lCi0gICAgICB8fCAhIGVudHJ5X2Zyb21fY21kbGluZSkKLSAgICB7Ci0gICAgICBlbnRyeV9zeW1ib2wgPSBuYW1lOwotICAgICAgZW50cnlfZnJvbV9jbWRsaW5lID0gY21kbGluZTsKLSAgICB9Ci19Ci0KLXZvaWQKLWxhbmdfYWRkX3RhcmdldCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgbGFuZ190YXJnZXRfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX3RhcmdldF9zdGF0ZW1lbnQsCi0JCQkJCSAgICAgIHN0YXRfcHRyKTsKLQotICBuZXctPnRhcmdldCA9IG5hbWU7Ci0KLX0KLQotdm9pZAotbGFuZ19hZGRfbWFwIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgc3dpdGNoICgqbmFtZSkKLQl7Ci0JICBjYXNlICdGJzoKLQkgIG1hcF9vcHRpb25fZiA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgICBuYW1lKys7Ci0gICAgfQotfQotCi12b2lkCi1sYW5nX2FkZF9maWxsIChleHApCi0gICAgIGludCBleHA7Ci17Ci0gIGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfZmlsbF9zdGF0ZW1lbnQsCi0JCQkJCSAgICBzdGF0X3B0cik7Ci0KLSAgbmV3LT5maWxsID0gZXhwOwotfQotCi12b2lkCi1sYW5nX2FkZF9kYXRhICh0eXBlLCBleHApCi0gICAgIGludCB0eXBlOwotICAgICB1bmlvbiBldHJlZV91bmlvbiAqZXhwOwotewotCi0gIGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfZGF0YV9zdGF0ZW1lbnQsCi0JCQkJCSAgICBzdGF0X3B0cik7Ci0KLSAgbmV3LT5leHAgPSBleHA7Ci0gIG5ldy0+dHlwZSA9IHR5cGU7Ci0KLX0KLQotLyogQ3JlYXRlIGEgbmV3IHJlbG9jIHN0YXRlbWVudC4gIFJFTE9DIGlzIHRoZSBCRkQgcmVsb2NhdGlvbiB0eXBlIHRvCi0gICBnZW5lcmF0ZS4gIEhPV1RPIGlzIHRoZSBjb3JyZXNwb25kaW5nIGhvd3RvIHN0cnVjdHVyZSAod2UgY291bGQKLSAgIGxvb2sgdGhpcyB1cCwgYnV0IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgZG9uZSBzbykuICBTRUNUSU9OIGlzIHRoZQotICAgc2VjdGlvbiB0byBnZW5lcmF0ZSBhIHJlbG9jIGFnYWluc3QsIG9yIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlCi0gICBzeW1ib2wgdG8gZ2VuZXJhdGUgYSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2YgU0VDVElPTiBhbmQKLSAgIE5BTUUgbXVzdCBiZSBOVUxMLiAgQURERU5EIGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBhZGRlbmQuICAqLwotCi12b2lkCi1sYW5nX2FkZF9yZWxvYyAocmVsb2MsIGhvd3RvLCBzZWN0aW9uLCBuYW1lLCBhZGRlbmQpCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bmlvbiBldHJlZV91bmlvbiAqYWRkZW5kOwotewotICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpwID0gbmV3X3N0YXQgKGxhbmdfcmVsb2Nfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0gIAotICBwLT5yZWxvYyA9IHJlbG9jOwotICBwLT5ob3d0byA9IGhvd3RvOwotICBwLT5zZWN0aW9uID0gc2VjdGlvbjsKLSAgcC0+bmFtZSA9IG5hbWU7Ci0gIHAtPmFkZGVuZF9leHAgPSBhZGRlbmQ7Ci0KLSAgcC0+YWRkZW5kX3ZhbHVlID0gMDsKLSAgcC0+b3V0cHV0X3NlY3Rpb24gPSBOVUxMOwotICBwLT5vdXRwdXRfdm1hID0gMDsKLX0KLQotbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICoKLWxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqIGV4cDsKLXsKLSAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudCwKLQkJCQkJCSAgc3RhdF9wdHIpOwotCi0gIG5ldy0+ZXhwID0gZXhwOwotICByZXR1cm4gbmV3OwotfQotCi12b2lkCi1sYW5nX2FkZF9hdHRyaWJ1dGUgKGF0dHJpYnV0ZSkKLSAgICAgZW51bSBzdGF0ZW1lbnRfZW51bSBhdHRyaWJ1dGU7Ci17Ci0gIG5ld19zdGF0ZW1lbnQgKGF0dHJpYnV0ZSwgc2l6ZW9mIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlKSwgc3RhdF9wdHIpOwotfQotCi12b2lkCi1sYW5nX3N0YXJ0dXAgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChzdGFydHVwX2ZpbGUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVAlRm11bHRpcGxlIFNUQVJUVVAgZmlsZXNcbiIpKTsKLSAgICB9Ci0gIGZpcnN0X2ZpbGUtPmZpbGVuYW1lID0gbmFtZTsKLSAgZmlyc3RfZmlsZS0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOwotICBmaXJzdF9maWxlLT5yZWFsID0gdHJ1ZTsKLQotICBzdGFydHVwX2ZpbGUgPSBuYW1lOwotfQotCi12b2lkCi1sYW5nX2Zsb2F0IChtYXliZSkKLSAgICAgYm9vbGVhbiBtYXliZTsKLXsKLSAgbGFuZ19mbG9hdF9mbGFnID0gbWF5YmU7Ci19Ci0KLXZvaWQKLWxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChmaWxsLCBtZW1zcGVjLCBwaGRycykKLSAgICAgYmZkX3ZtYSBmaWxsOwotICAgICBjb25zdCBjaGFyICptZW1zcGVjOwotICAgICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBoZHJzOwotewotICBjdXJyZW50X3NlY3Rpb24tPmZpbGwgPSBmaWxsOwotICBjdXJyZW50X3NlY3Rpb24tPnJlZ2lvbiA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKG1lbXNwZWMpOwotICBjdXJyZW50X3NlY3Rpb24tPnBoZHJzID0gcGhkcnM7Ci0gIHN0YXRfcHRyID0gJnN0YXRlbWVudF9saXN0OwotfQotCi0vKgotIENyZWF0ZSBhbiBhYnNvbHV0ZSBzeW1ib2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUKLSBhZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgdGhlIHNlY3Rpb24gbmFtZWQuCi0KLSBJZiB0aGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCB0aGVuIGRvIG5vdGhpbmcuCi0qLwotdm9pZAotbGFuZ19hYnNfc3ltYm9sX2F0X2JlZ2lubmluZ19vZiAoc2VjbmFtZSwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcKLSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIHNlY25hbWUpOwotICAgICAgaWYgKHNlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQloLT51LmRlZi52YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JaC0+dS5kZWYudmFsdWUgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBzZWMpOwotCi0gICAgICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICB9Ci19Ci0KLS8qCi0gQ3JlYXRlIGFuIGFic29sdXRlIHN5bWJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIHdpdGggdGhlIHZhbHVlIG9mIHRoZQotIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiBuYW1lZC4KLQotIElmIHRoZSBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIHRoZW4gZG8gbm90aGluZy4KLSovCi12b2lkCi1sYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mIChzZWNuYW1lLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpzZWNuYW1lOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLQotICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldwotICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgc2VjbmFtZSk7Ci0gICAgICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCWgtPnUuZGVmLnZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQloLT51LmRlZi52YWx1ZSA9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBzZWMpCi0JCQkgICsgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgc2VjKSk7Ci0KLSAgICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgIH0KLX0KLQotdm9pZAotbGFuZ19zdGF0ZW1lbnRfYXBwZW5kIChsaXN0LCBlbGVtZW50LCBmaWVsZCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICogbGlzdDsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIGVsZW1lbnQ7Ci0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiogZmllbGQ7Ci17Ci0gICoobGlzdC0+dGFpbCkgPSBlbGVtZW50OwotICBsaXN0LT50YWlsID0gZmllbGQ7Ci19Ci0KLS8qIFNldCB0aGUgb3V0cHV0IGZvcm1hdCB0eXBlLiAgLW9mb3JtYXQgb3ZlcnJpZGVzIHNjcmlwdHMuICAqLwotCi12b2lkCi1sYW5nX2FkZF9vdXRwdXRfZm9ybWF0IChmb3JtYXQsIGJpZywgbGl0dGxlLCBmcm9tX3NjcmlwdCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICBjb25zdCBjaGFyICpiaWc7Ci0gICAgIGNvbnN0IGNoYXIgKmxpdHRsZTsKLSAgICAgaW50IGZyb21fc2NyaXB0OwotewotICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMIHx8ICFmcm9tX3NjcmlwdCkKLSAgICB7Ci0gICAgICBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fQklHCi0JICAmJiBiaWcgIT0gTlVMTCkKLQlmb3JtYXQgPSBiaWc7Ci0gICAgICBlbHNlIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9MSVRUTEUKLQkgICAgICAgJiYgbGl0dGxlICE9IE5VTEwpCi0JZm9ybWF0ID0gbGl0dGxlOwotCi0gICAgICBvdXRwdXRfdGFyZ2V0ID0gZm9ybWF0OwotICAgIH0KLX0KLQotLyogRW50ZXIgYSBncm91cC4gIFRoaXMgY3JlYXRlcyBhIG5ldyBsYW5nX2dyb3VwX3N0YXRlbWVudCwgYW5kIHNldHMKLSAgIHN0YXRfcHRyIHRvIGJ1aWxkIG5ldyBzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgZ3JvdXAuICAqLwotCi12b2lkCi1sYW5nX2VudGVyX2dyb3VwICgpCi17Ci0gIGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUgKmc7Ci0KLSAgZyA9IG5ld19zdGF0IChsYW5nX2dyb3VwX3N0YXRlbWVudCwgc3RhdF9wdHIpOwotICBsYW5nX2xpc3RfaW5pdCAoJmctPmNoaWxkcmVuKTsKLSAgc3RhdF9wdHIgPSAmZy0+Y2hpbGRyZW47Ci19Ci0KLS8qIExlYXZlIGEgZ3JvdXAuICBUaGlzIGp1c3QgcmVzZXRzIHN0YXRfcHRyIHRvIHN0YXJ0IHdyaXRpbmcgdG8gdGhlCi0gICByZWd1bGFyIGxpc3Qgb2Ygc3RhdGVtZW50cyBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IHdvcmsgaWYKLSAgIGdyb3VwcyBjYW4gb2NjdXIgaW5zaWRlIGFueXRoaW5nIGVsc2Ugd2hpY2ggY2FuIGFkanVzdCBzdGF0X3B0ciwKLSAgIGJ1dCBjdXJyZW50bHkgdGhleSBjYW4ndC4gICovCi0KLXZvaWQKLWxhbmdfbGVhdmVfZ3JvdXAgKCkKLXsKLSAgc3RhdF9wdHIgPSAmc3RhdGVtZW50X2xpc3Q7Ci19Ci0KLS8qIEFkZCBhIG5ldyBwcm9ncmFtIGhlYWRlci4gIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIGVudHJ5IGluIGEgUEhEUlMKLSAgIGNvbW1hbmQgaW4gYSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotdm9pZAotbGFuZ19uZXdfcGhkciAobmFtZSwgdHlwZSwgZmlsZWhkciwgcGhkcnMsIGF0LCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqdHlwZTsKLSAgICAgYm9vbGVhbiBmaWxlaGRyOwotICAgICBib29sZWFuIHBoZHJzOwotICAgICBldHJlZV90eXBlICphdDsKLSAgICAgZXRyZWVfdHlwZSAqZmxhZ3M7Ci17Ci0gIHN0cnVjdCBsYW5nX3BoZHIgKm4sICoqcHA7Ci0KLSAgbiA9IChzdHJ1Y3QgbGFuZ19waGRyICopIHN0YXRfYWxsb2MgKHNpemVvZiAoc3RydWN0IGxhbmdfcGhkcikpOwotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+bmFtZSA9IG5hbWU7Ci0gIG4tPnR5cGUgPSBleHBfZ2V0X3ZhbHVlX2ludCAodHlwZSwgMCwgInByb2dyYW0gaGVhZGVyIHR5cGUiLAotCQkJICAgICAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0gIG4tPmZpbGVoZHIgPSBmaWxlaGRyOwotICBuLT5waGRycyA9IHBoZHJzOwotICBuLT5hdCA9IGF0OwotICBuLT5mbGFncyA9IGZsYWdzOwotCi0gIGZvciAocHAgPSAmbGFuZ19waGRyX2xpc3Q7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IG47Ci19Ci0KLS8qIFJlY29yZCB0aGUgcHJvZ3JhbSBoZWFkZXIgaW5mb3JtYXRpb24gaW4gdGhlIG91dHB1dCBCRkQuICBGSVhNRTogV2UKLSAgIHNob3VsZCBub3QgYmUgY2FsbGluZyBhbiBFTEYgc3BlY2lmaWMgZnVuY3Rpb24gaGVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX3JlY29yZF9waGRycyAoKQotewotICB1bnNpZ25lZCBpbnQgYWxjOwotICBhc2VjdGlvbiAqKnNlY3M7Ci0gIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqbGFzdDsKLSAgc3RydWN0IGxhbmdfcGhkciAqbDsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqdTsKLQotICBhbGMgPSAxMDsKLSAgc2VjcyA9IChhc2VjdGlvbiAqKikgeG1hbGxvYyAoYWxjICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGxhc3QgPSBOVUxMOwotICBmb3IgKGwgPSBsYW5nX3BoZHJfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYzsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgYmZkX3ZtYSBhdDsKLQotICAgICAgYyA9IDA7Ci0gICAgICBmb3IgKHUgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5oZWFkOwotCSAgIHUgIT0gTlVMTDsKLQkgICB1ID0gdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Lm5leHQpCi0JewotCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0JICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBsOwotCi0JICBvcyA9ICZ1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLQkgIHBsID0gb3MtPnBoZHJzOwotCSAgaWYgKHBsICE9IE5VTEwpCi0JICAgIGxhc3QgPSBwbDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChvcy0+c2VjdHlwZSA9PSBub2xvYWRfc2VjdGlvbgotCQkgIHx8IG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMCi0JCSAgfHwgKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIHBsID0gbGFzdDsKLQkgICAgfQotCi0JICBpZiAob3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBmb3IgKDsgcGwgIT0gTlVMTDsgcGwgPSBwbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKHBsLT5uYW1lLCBsLT5uYW1lKSA9PSAwKQotCQl7Ci0JCSAgaWYgKGMgPj0gYWxjKQotCQkgICAgewotCQkgICAgICBhbGMgKj0gMjsKLQkJICAgICAgc2VjcyA9ICgoYXNlY3Rpb24gKiopCi0JCQkgICAgICB4cmVhbGxvYyAoc2VjcywgYWxjICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOwotCQkgICAgfQotCQkgIHNlY3NbY10gPSBvcy0+YmZkX3NlY3Rpb247Ci0JCSAgKytjOwotCQkgIHBsLT51c2VkID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobC0+ZmxhZ3MgPT0gTlVMTCkKLQlmbGFncyA9IDA7Ci0gICAgICBlbHNlCi0JZmxhZ3MgPSBleHBfZ2V0X3ZtYSAobC0+ZmxhZ3MsIDAsICJwaGRyIGZsYWdzIiwKLQkJCSAgICAgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLQotICAgICAgaWYgKGwtPmF0ID09IE5VTEwpCi0JYXQgPSAwOwotICAgICAgZWxzZQotCWF0ID0gZXhwX2dldF92bWEgKGwtPmF0LCAwLCAicGhkciBsb2FkIGFkZHJlc3MiLAotCQkJICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pOwotCi0gICAgICBpZiAoISBiZmRfcmVjb3JkX3BoZHIgKG91dHB1dF9iZmQsIGwtPnR5cGUsCi0JCQkgICAgIGwtPmZsYWdzID09IE5VTEwgPyBmYWxzZSA6IHRydWUsCi0JCQkgICAgIGZsYWdzLAotCQkJICAgICBsLT5hdCA9PSBOVUxMID8gZmFsc2UgOiB0cnVlLAotCQkJICAgICBhdCwgbC0+ZmlsZWhkciwgbC0+cGhkcnMsIGMsIHNlY3MpKQotCWVpbmZvIChfKCIlRiVQOiBiZmRfcmVjb3JkX3BoZHIgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLQotICBmcmVlIChzZWNzKTsKLQotICAvKiBNYWtlIHN1cmUgYWxsIHRoZSBwaGRyIGFzc2lnbm1lbnRzIHN1Y2NlZWRlZC4gICovCi0gIGZvciAodSA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmhlYWQ7Ci0gICAgICAgdSAhPSBOVUxMOwotICAgICAgIHUgPSB1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQubmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBsOwotCi0gICAgICBpZiAodS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmJmZF9zZWN0aW9uID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAocGwgPSB1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQucGhkcnM7Ci0JICAgcGwgIT0gTlVMTDsKLQkgICBwbCA9IHBsLT5uZXh0KQotCWlmICghIHBsLT51c2VkICYmIHN0cmNtcCAocGwtPm5hbWUsICJOT05FIikgIT0gMCkKLQkgIGVpbmZvIChfKCIlWCVQOiBzZWN0aW9uIGAlcycgYXNzaWduZWQgdG8gbm9uLWV4aXN0ZW50IHBoZHIgYCVzJ1xuIiksCi0JCSB1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQubmFtZSwgcGwtPm5hbWUpOwotICAgIH0KLX0KLQotLyogUmVjb3JkIGEgbGlzdCBvZiBzZWN0aW9ucyB3aGljaCBtYXkgbm90IGJlIGNyb3NzIHJlZmVyZW5jZWQuICAqLwotCi12b2lkCi1sYW5nX2FkZF9ub2Nyb3NzcmVmIChsKQotICAgICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpsOwotewotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbjsKLQotICBuID0gKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBub2Nyb3NzcmVmX2xpc3Q7Ci0gIG4tPmxpc3QgPSBsOwotICBub2Nyb3NzcmVmX2xpc3QgPSBuOwotCi0gIC8qIFNldCBub3RpY2VfYWxsIHNvIHRoYXQgd2UgZ2V0IGluZm9ybWVkIGFib3V0IGFsbCBzeW1ib2xzLiAgKi8KLSAgbGlua19pbmZvLm5vdGljZV9hbGwgPSB0cnVlOwotfQotDAotLyogT3ZlcmxheSBoYW5kbGluZy4gIFdlIGhhbmRsZSBvdmVybGF5cyB3aXRoIHNvbWUgc3RhdGljIHZhcmlhYmxlcy4gICovCi0KLS8qIFRoZSBvdmVybGF5IHZpcnR1YWwgYWRkcmVzcy4gICovCi1zdGF0aWMgZXRyZWVfdHlwZSAqb3ZlcmxheV92bWE7Ci0KLS8qIFRoZSBvdmVybGF5IGxvYWQgYWRkcmVzcy4gICovCi1zdGF0aWMgZXRyZWVfdHlwZSAqb3ZlcmxheV9sbWE7Ci0KLS8qIFdoZXRoZXIgbm9jcm9zc3JlZnMgaXMgc2V0IGZvciB0aGlzIG92ZXJsYXkuICAqLwotc3RhdGljIGludCBvdmVybGF5X25vY3Jvc3NyZWZzOwotCi0vKiBBbiBleHByZXNzaW9uIGZvciB0aGUgbWF4aW11bSBzZWN0aW9uIHNpemUgc2VlbiBzbyBmYXIuICAqLwotc3RhdGljIGV0cmVlX3R5cGUgKm92ZXJsYXlfbWF4OwotCi0vKiBBIGxpc3Qgb2YgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGlzIG92ZXJsYXkuICAqLwotCi1zdHJ1Y3Qgb3ZlcmxheV9saXN0Ci17Ci0gIHN0cnVjdCBvdmVybGF5X2xpc3QgKm5leHQ7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotfTsKLQotc3RhdGljIHN0cnVjdCBvdmVybGF5X2xpc3QgKm92ZXJsYXlfbGlzdDsKLQotLyogU3RhcnQgaGFuZGxpbmcgYW4gb3ZlcmxheS4gICovCi0KLXZvaWQKLWxhbmdfZW50ZXJfb3ZlcmxheSAodm1hX2V4cHIsIGxtYV9leHByLCBub2Nyb3NzcmVmcykKLSAgICAgZXRyZWVfdHlwZSAqdm1hX2V4cHI7Ci0gICAgIGV0cmVlX3R5cGUgKmxtYV9leHByOwotICAgICBpbnQgbm9jcm9zc3JlZnM7Ci17Ci0gIC8qIFRoZSBncmFtbWFyIHNob3VsZCBwcmV2ZW50IG5lc3RlZCBvdmVybGF5cyBmcm9tIG9jY3VycmluZy4gICovCi0gIEFTU0VSVCAob3ZlcmxheV92bWEgPT0gTlVMTAotCSAgJiYgb3ZlcmxheV9sbWEgPT0gTlVMTAotCSAgJiYgb3ZlcmxheV9saXN0ID09IE5VTEwKLQkgICYmIG92ZXJsYXlfbWF4ID09IE5VTEwpOwotCi0gIG92ZXJsYXlfdm1hID0gdm1hX2V4cHI7Ci0gIG92ZXJsYXlfbG1hID0gbG1hX2V4cHI7Ci0gIG92ZXJsYXlfbm9jcm9zc3JlZnMgPSBub2Nyb3NzcmVmczsKLX0KLQotLyogU3RhcnQgYSBzZWN0aW9uIGluIGFuIG92ZXJsYXkuICBXZSBoYW5kbGUgdGhpcyBieSBjYWxsaW5nCi0gICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCB3aXRoIHRoZSBjb3JyZWN0IFZNQSBhbmQgTE1BLiAgKi8KLQotdm9pZAotbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBvdmVybGF5X2xpc3QgKm47Ci0gIGV0cmVlX3R5cGUgKnNpemU7Ci0KLSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG5hbWUsIG92ZXJsYXlfdm1hLCBub3JtYWxfc2VjdGlvbiwKLQkJCQkgICAgICAgMCwgMCwgMCwgb3ZlcmxheV9sbWEpOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHNlY3Rpb24sIHRoZW4gYmFzZSB0aGUgVk1BIGFuZCBMTUEgb2YgZnV0dXJlCi0gICAgIHNlY3Rpb25zIG9uIHRoaXMgb25lLiAgVGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gaWYgYC4nIGlzCi0gICAgIHVzZWQgaW4gdGhlIGFkZHJlc3Nlcy4gICovCi0gIGlmIChvdmVybGF5X2xpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvdmVybGF5X3ZtYSA9IGV4cF9uYW1lb3AgKEFERFIsIG5hbWUpOwotICAgICAgb3ZlcmxheV9sbWEgPSBleHBfbmFtZW9wIChMT0FEQUREUiwgbmFtZSk7Ci0gICAgfQotCi0gIC8qIFJlbWVtYmVyIHRoZSBzZWN0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3Qgb3ZlcmxheV9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm9zID0gY3VycmVudF9zZWN0aW9uOwotICBuLT5uZXh0ID0gb3ZlcmxheV9saXN0OwotICBvdmVybGF5X2xpc3QgPSBuOwotCi0gIHNpemUgPSBleHBfbmFtZW9wIChTSVpFT0YsIG5hbWUpOwotCi0gIC8qIEFkanVzdCB0aGUgTE1BIGZvciB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgb3ZlcmxheV9sbWEgPSBleHBfYmlub3AgKCcrJywgb3ZlcmxheV9sbWEsIHNpemUpOwotCi0gIC8qIEFycmFuZ2UgdG8gd29yayBvdXQgdGhlIG1heGltdW0gc2VjdGlvbiBlbmQgYWRkcmVzcy4gICovCi0gIGlmIChvdmVybGF5X21heCA9PSBOVUxMKQotICAgIG92ZXJsYXlfbWF4ID0gc2l6ZTsKLSAgZWxzZQotICAgIG92ZXJsYXlfbWF4ID0gZXhwX2Jpbm9wIChNQVhfSywgb3ZlcmxheV9tYXgsIHNpemUpOwotfQotCi0vKiBGaW5pc2ggYSBzZWN0aW9uIGluIGFuIG92ZXJsYXkuICBUaGVyZSBpc24ndCBhbnkgc3BlY2lhbCB0byBkbwotICAgaGVyZS4gICovCi0KLXZvaWQKLWxhbmdfbGVhdmVfb3ZlcmxheV9zZWN0aW9uIChmaWxsLCBwaGRycykKLSAgICAgYmZkX3ZtYSBmaWxsOwotICAgICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBoZHJzOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyICpjbGVhbiwgKnMyOwotICBjb25zdCBjaGFyICpzMTsKLSAgY2hhciAqYnVmOwotCi0gIG5hbWUgPSBjdXJyZW50X3NlY3Rpb24tPm5hbWU7Ci0KLSAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKGZpbGwsICIqZGVmYXVsdCoiLCBwaGRycyk7Ci0KLSAgLyogRGVmaW5lIHRoZSBtYWdpYyBzeW1ib2xzLiAgKi8KLQotICBjbGVhbiA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgczIgPSBjbGVhbjsKLSAgZm9yIChzMSA9IG5hbWU7ICpzMSAhPSAnXDAnOyBzMSsrKQotICAgIGlmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnMxKSB8fCAqczEgPT0gJ18nKQotICAgICAgKnMyKysgPSAqczE7Ci0gICpzMiA9ICdcMCc7Ci0KLSAgYnVmID0geG1hbGxvYyAoc3RybGVuIChjbGVhbikgKyBzaXplb2YgIl9fbG9hZF9zdGFydF8iKTsKLSAgc3ByaW50ZiAoYnVmLCAiX19sb2FkX3N0YXJ0XyVzIiwgY2xlYW4pOwotICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgYnVmLAotCQkJCSAgZXhwX25hbWVvcCAoTE9BREFERFIsIG5hbWUpKSk7Ci0KLSAgYnVmID0geG1hbGxvYyAoc3RybGVuIChjbGVhbikgKyBzaXplb2YgIl9fbG9hZF9zdG9wXyIpOwotICBzcHJpbnRmIChidWYsICJfX2xvYWRfc3RvcF8lcyIsIGNsZWFuKTsKLSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIGJ1ZiwKLQkJCQkgIGV4cF9iaW5vcCAoJysnLAotCQkJCQkgICAgIGV4cF9uYW1lb3AgKExPQURBRERSLCBuYW1lKSwKLQkJCQkJICAgICBleHBfbmFtZW9wIChTSVpFT0YsIG5hbWUpKSkpOwotCi0gIGZyZWUgKGNsZWFuKTsKLX0KLQotLyogRmluaXNoIGFuIG92ZXJsYXkuICBJZiB0aGVyZSBhcmUgYW55IG92ZXJsYXkgd2lkZSBzZXR0aW5ncywgdGhpcwotICAgbG9va3MgdGhyb3VnaCBhbGwgdGhlIHNlY3Rpb25zIGluIHRoZSBvdmVybGF5IGFuZCBzZXRzIHRoZW0uICAqLwotCi12b2lkCi1sYW5nX2xlYXZlX292ZXJsYXkgKGZpbGwsIG1lbXNwZWMsIHBoZHJzKQotICAgICBiZmRfdm1hIGZpbGw7Ci0gICAgIGNvbnN0IGNoYXIgKm1lbXNwZWM7Ci0gICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Ci17Ci0gIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpyZWdpb247Ci0gIHN0cnVjdCBvdmVybGF5X2xpc3QgKmw7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5vY3Jvc3NyZWY7Ci0KLSAgaWYgKG1lbXNwZWMgPT0gTlVMTCkKLSAgICByZWdpb24gPSBOVUxMOwotICBlbHNlCi0gICAgcmVnaW9uID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAobWVtc3BlYyk7Ci0KLSAgbm9jcm9zc3JlZiA9IE5VTEw7Ci0KLSAgbCA9IG92ZXJsYXlfbGlzdDsKLSAgd2hpbGUgKGwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpuZXh0OwotCi0gICAgICBpZiAoZmlsbCAhPSAwICYmIGwtPm9zLT5maWxsID09IDApCi0JbC0+b3MtPmZpbGwgPSBmaWxsOwotICAgICAgaWYgKHJlZ2lvbiAhPSBOVUxMICYmIGwtPm9zLT5yZWdpb24gPT0gTlVMTCkKLQlsLT5vcy0+cmVnaW9uID0gcmVnaW9uOwotICAgICAgaWYgKHBoZHJzICE9IE5VTEwgJiYgbC0+b3MtPnBoZHJzID09IE5VTEwpCi0JbC0+b3MtPnBoZHJzID0gcGhkcnM7Ci0KLSAgICAgIGlmIChvdmVybGF5X25vY3Jvc3NyZWZzKQotCXsKLQkgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5jOwotCi0JICBuYyA9IChzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICopIHhtYWxsb2MgKHNpemVvZiAqbmMpOwotCSAgbmMtPm5hbWUgPSBsLT5vcy0+bmFtZTsKLQkgIG5jLT5uZXh0ID0gbm9jcm9zc3JlZjsKLQkgIG5vY3Jvc3NyZWYgPSBuYzsKLQl9Ci0KLSAgICAgIG5leHQgPSBsLT5uZXh0OwotICAgICAgZnJlZSAobCk7Ci0gICAgICBsID0gbmV4dDsKLSAgICB9Ci0KLSAgaWYgKG5vY3Jvc3NyZWYgIT0gTlVMTCkKLSAgICBsYW5nX2FkZF9ub2Nyb3NzcmVmIChub2Nyb3NzcmVmKTsKLQotICAvKiBVcGRhdGUgLiBmb3IgdGhlIGVuZCBvZiB0aGUgb3ZlcmxheS4gICovCi0gIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAiLiIsCi0JCQkJICBleHBfYmlub3AgKCcrJywgb3ZlcmxheV92bWEsIG92ZXJsYXlfbWF4KSkpOwotCi0gIG92ZXJsYXlfdm1hID0gTlVMTDsKLSAgb3ZlcmxheV9sbWEgPSBOVUxMOwotICBvdmVybGF5X25vY3Jvc3NyZWZzID0gMDsKLSAgb3ZlcmxheV9saXN0ID0gTlVMTDsKLSAgb3ZlcmxheV9tYXggPSBOVUxMOwotfQotDAotLyogVmVyc2lvbiBoYW5kbGluZy4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIEVMRi4gICovCi0KLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGhvbGRzIHRoZSB2ZXJzaW9uIHRyZWUgdGhhdCB3ZSBidWlsZC4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqbGFuZ19lbGZfdmVyc2lvbl9pbmZvOwotCi1zdGF0aWMgaW50Ci1sYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jIChleHByLCBzeW0pCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZXhwcjsKLSAgICAgY29uc3QgY2hhciAqc3ltOwotewotICBpZiAoZXhwci0+cGF0dGVyblswXSA9PSAnKicgJiYgZXhwci0+cGF0dGVyblsxXSA9PSAnXDAnKQotICAgIHJldHVybiAxOwotICByZXR1cm4gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgc3ltLCAwKSA9PSAwOwotfQotCi1zdGF0aWMgaW50Ci1sYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jcGx1c3BsdXMgKGV4cHIsIHN5bSkKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpleHByOwotICAgICBjb25zdCBjaGFyICpzeW07Ci17Ci0gIGNoYXIgKmFsdF9zeW07Ci0gIGludCByZXN1bHQ7Ci0KLSAgaWYgKGV4cHItPnBhdHRlcm5bMF0gPT0gJyonICYmIGV4cHItPnBhdHRlcm5bMV0gPT0gJ1wwJykKLSAgICByZXR1cm4gMTsKLQotICBhbHRfc3ltID0gY3BsdXNfZGVtYW5nbGUoc3ltLCAvKiBETUdMX05PX1RQQVJBTVMgKi8gMCk7Ci0gIGlmICghYWx0X3N5bSkKLSAgICB7Ci0gICAgICAvKiBjcGx1c19kZW1hbmdsZSAoYWxzbykgcmV0dXJucyBOVUxMIHdoZW4gaXQgaXMgbm90IGEgQysrIHN5bWJvbC4KLQkgU2hvdWxkIHdlIGVhcmx5IG91dCBmYWxzZSBpbiB0aGlzIGNhc2U/ICAqLwotICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgc3ltLCAwKSA9PSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIGFsdF9zeW0sIDApID09IDA7Ci0gICAgICBmcmVlIChhbHRfc3ltKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludAotbGFuZ192ZXJzX21hdGNoX2xhbmdfamF2YSAoZXhwciwgc3ltKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmV4cHI7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bTsKLXsKLSAgY2hhciAqYWx0X3N5bTsKLSAgaW50IHJlc3VsdDsKLQotICBpZiAoZXhwci0+cGF0dGVyblswXSA9PSAnKicgJiYgZXhwci0+cGF0dGVyblsxXSA9PSAnXDAnKQotICAgIHJldHVybiAxOwotCi0gIGFsdF9zeW0gPSBjcGx1c19kZW1hbmdsZShzeW0sIERNR0xfSkFWQSk7Ci0gIGlmICghYWx0X3N5bSkKLSAgICB7Ci0gICAgICAvKiBjcGx1c19kZW1hbmdsZSAoYWxzbykgcmV0dXJucyBOVUxMIHdoZW4gaXQgaXMgbm90IGEgSmF2YSBzeW1ib2wuCi0JIFNob3VsZCB3ZSBlYXJseSBvdXQgZmFsc2UgaW4gdGhpcyBjYXNlPyAgKi8KLSAgICAgIHJlc3VsdCA9IGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIHN5bSwgMCkgPT0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBhbHRfc3ltLCAwKSA9PSAwOwotICAgICAgZnJlZSAoYWx0X3N5bSk7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUgb3IgbWF0Y2ggZXhwcmVzc2lvbi4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqCi1sYW5nX25ld192ZXJzX3JlZ2V4IChvcmlnLCBuZXcsIGxhbmcpCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqb3JpZzsKLSAgICAgY29uc3QgY2hhciAqbmV3OwotICAgICBjb25zdCBjaGFyICpsYW5nOwotewotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKnJldDsKLQotICByZXQgPSAoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgcmV0LT5uZXh0ID0gb3JpZzsKLSAgcmV0LT5wYXR0ZXJuID0gbmV3OwotCi0gIGlmIChsYW5nID09IE5VTEwgfHwgc3RyY2FzZWNtcCAobGFuZywgIkMiKSA9PSAwKQotICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jOwotICBlbHNlIGlmIChzdHJjYXNlY21wIChsYW5nLCAiQysrIikgPT0gMCkKLSAgICByZXQtPm1hdGNoID0gbGFuZ192ZXJzX21hdGNoX2xhbmdfY3BsdXNwbHVzOwotICBlbHNlIGlmIChzdHJjYXNlY21wIChsYW5nLCAiSmF2YSIpID09IDApCi0gICAgcmV0LT5tYXRjaCA9IGxhbmdfdmVyc19tYXRjaF9sYW5nX2phdmE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVglUDogdW5rbm93biBsYW5ndWFnZSBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIpLAotCSAgICAgbGFuZyk7Ci0gICAgICByZXQtPm1hdGNoID0gbGFuZ192ZXJzX21hdGNoX2xhbmdfYzsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggc2V0IG9mIHZhcmlhYmxlIG5hbWVzIGFuZCBtYXRjaAotICAgZXhwcmVzc2lvbnMuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKgotbGFuZ19uZXdfdmVyc19ub2RlIChnbG9iYWxzLCBsb2NhbHMpCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZ2xvYmFsczsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpsb2NhbHM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICByZXQtPm5leHQgPSBOVUxMOwotICByZXQtPm5hbWUgPSBOVUxMOwotICByZXQtPnZlcm51bSA9IDA7Ci0gIHJldC0+Z2xvYmFscyA9IGdsb2JhbHM7Ci0gIHJldC0+bG9jYWxzID0gbG9jYWxzOwotICByZXQtPmRlcHMgPSBOVUxMOwotICByZXQtPm5hbWVfaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOwotICByZXQtPnVzZWQgPSAwOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGlzIHN0YXRpYyB2YXJpYWJsZSBrZWVwcyB0cmFjayBvZiB2ZXJzaW9uIGluZGljZXMuICAqLwotCi1zdGF0aWMgaW50IHZlcnNpb25faW5kZXg7Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Uga25vdyB0aGUgbmFtZSBhbmQgZGVwZW5kZW5jaWVzIG9mIHRoZQotICAgdmVyc2lvbi4gICovCi0KLXZvaWQKLWxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlIChuYW1lLCB2ZXJzaW9uLCBkZXBzKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnNpb247Ci0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqZGVwczsKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp0LCAqKnBwOwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmUxOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGlzIG5vZGUgaGFzIGEgdW5pcXVlIG5hbWUuICAqLwotICBmb3IgKHQgPSBsYW5nX2VsZl92ZXJzaW9uX2luZm87IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0gICAgaWYgKHN0cmNtcCAodC0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIGVpbmZvIChfKCIlWCVQOiBkdXBsaWNhdGUgdmVyc2lvbiB0YWcgYCVzJ1xuIiksIG5hbWUpOwotCi0gIC8qIENoZWNrIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG1hdGNoIG5hbWVzLCBhbmQgbWFrZSBzdXJlIHRoZXJlCi0gICAgIGFyZW4ndCBhbnkgZHVwbGljYXRlcy4gICovCi0KLSAgZm9yIChlMSA9IHZlcnNpb24tPmdsb2JhbHM7IGUxICE9IE5VTEw7IGUxID0gZTEtPm5leHQpCi0gICAgewotICAgICAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCXsKLQkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZTI7Ci0KLQkgIGZvciAoZTIgPSB0LT5sb2NhbHM7IGUyICE9IE5VTEw7IGUyID0gZTItPm5leHQpCi0JICAgIGlmIChzdHJjbXAgKGUxLT5wYXR0ZXJuLCBlMi0+cGF0dGVybikgPT0gMCkKLQkgICAgICBlaW5mbyAoXygiJVglUDogZHVwbGljYXRlIGV4cHJlc3Npb24gYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iKSwKLQkJICAgICBlMS0+cGF0dGVybik7Ci0JfQotICAgIH0KLQotICBmb3IgKGUxID0gdmVyc2lvbi0+bG9jYWxzOyBlMSAhPSBOVUxMOyBlMSA9IGUxLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAodCA9IGxhbmdfZWxmX3ZlcnNpb25faW5mbzsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmUyOwotCi0JICBmb3IgKGUyID0gdC0+Z2xvYmFsczsgZTIgIT0gTlVMTDsgZTIgPSBlMi0+bmV4dCkKLQkgICAgaWYgKHN0cmNtcCAoZTEtPnBhdHRlcm4sIGUyLT5wYXR0ZXJuKSA9PSAwKQotCSAgICAgIGVpbmZvIChfKCIlWCVQOiBkdXBsaWNhdGUgZXhwcmVzc2lvbiBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIpLAotCQkgICAgIGUxLT5wYXR0ZXJuKTsKLQl9Ci0gICAgfQotCi0gIHZlcnNpb24tPmRlcHMgPSBkZXBzOwotICB2ZXJzaW9uLT5uYW1lID0gbmFtZTsKLSAgKyt2ZXJzaW9uX2luZGV4OwotICB2ZXJzaW9uLT52ZXJudW0gPSB2ZXJzaW9uX2luZGV4OwotCi0gIGZvciAocHAgPSAmbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSB2ZXJzaW9uOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIHNlZSBhIHZlcnNpb24gZGVwZW5kZW5jeS4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqCi1sYW5nX2FkZF92ZXJzX2RlcGVuZCAobGlzdCwgbmFtZSkKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpsaXN0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKnJldDsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp0OwotCi0gIHJldCA9IChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICByZXQtPm5leHQgPSBsaXN0OwotCi0gIGZvciAodCA9IGxhbmdfZWxmX3ZlcnNpb25faW5mbzsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICh0LT5uYW1lLCBuYW1lKSA9PSAwKQotCXsKLQkgIHJldC0+dmVyc2lvbl9uZWVkZWQgPSB0OwotCSAgcmV0dXJuIHJldDsKLQl9Ci0gICAgfQotCi0gIGVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gZmluZCB2ZXJzaW9uIGRlcGVuZGVuY3kgYCVzJ1xuIiksIG5hbWUpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sYW5nX2RvX3ZlcnNpb25fZXhwb3J0c19zZWN0aW9uICgpCi17Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZ3JlZyA9IE5VTEwsICpscmVnOwotCi0gIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlzLT50aGVfYmZkLCAiLmV4cG9ydHMiKTsKLSAgICAgIGNoYXIgKmNvbnRlbnRzLCAqcDsKLSAgICAgIGJmZF9zaXplX3R5cGUgbGVuOwotCi0gICAgICBpZiAoc2VjID09IE5VTEwpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBsZW4gPSBiZmRfc2VjdGlvbl9zaXplIChpcy0+dGhlX2JmZCwgc2VjKTsKLSAgICAgIGNvbnRlbnRzID0geG1hbGxvYyAobGVuKTsKLSAgICAgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpcy0+dGhlX2JmZCwgc2VjLCBjb250ZW50cywgMCwgbGVuKSkKLQllaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIHJlYWQgLmV4cG9ydHMgc2VjdGlvbiBjb250ZW50cyIpLCBzZWMpOwotCi0gICAgICBwID0gY29udGVudHM7Ci0gICAgICB3aGlsZSAocCA8IGNvbnRlbnRzK2xlbikKLQl7Ci0JICBncmVnID0gbGFuZ19uZXdfdmVyc19yZWdleCAoZ3JlZywgcCwgTlVMTCk7Ci0JICBwID0gc3RyY2hyIChwLCAnXDAnKSArIDE7Ci0JfQotCi0gICAgICAvKiBEbyBub3QgZnJlZSB0aGUgY29udGVudHMsIGFzIHdlIHVzZWQgdGhlbSBjcmVhdGluZyB0aGUgcmVnZXguICAqLwotCi0gICAgICAvKiBEbyBub3QgaW5jbHVkZSB0aGlzIHNlY3Rpb24gaW4gdGhlIGxpbmsuICAqLwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChpcy0+dGhlX2JmZCwgc2VjLAotCWJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaXMtPnRoZV9iZmQsIHNlYykgfCBTRUNfRVhDTFVERSk7Ci0gICAgfQotCi0gIGxyZWcgPSBsYW5nX25ld192ZXJzX3JlZ2V4IChOVUxMLCAiKiIsIE5VTEwpOwotICBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSAoY29tbWFuZF9saW5lLnZlcnNpb25fZXhwb3J0c19zZWN0aW9uLAotCQkJICAgbGFuZ19uZXdfdmVyc19ub2RlIChncmVnLCBscmVnKSwgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGxhbmcuaCBiL2xkL2xkbGFuZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzYzOTM4Li4wMDAwMDAwCi0tLSBhL2xkL2xkbGFuZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qIGxkbGFuZy5oIC0gbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2Ugc3VwcG9ydAotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLSAgIAotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRExBTkdfSAotI2RlZmluZSBMRExBTkdfSAotCi10eXBlZGVmIGVudW0KLXsKLSAgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLSAgbGFuZ19pbnB1dF9maWxlX2lzX3N5bWJvbHNfb25seV9lbnVtLAotICBsYW5nX2lucHV0X2ZpbGVfaXNfbWFya2VyX2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAotICBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtCi19IGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGU7Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZpbGxfdHlwZTsKLXR5cGVkZWYgc3RydWN0IHN0YXRlbWVudF9saXN0Ci17Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpoZWFkOwotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqKnRhaWw7Ci19IGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdAotewotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QgKm5leHQ7Ci0gIGJmZF92bWEgb3JpZ2luOwotICBiZmRfc2l6ZV90eXBlIGxlbmd0aDsKLSAgYmZkX3ZtYSBjdXJyZW50OwotICBiZmRfc2l6ZV90eXBlIG9sZF9sZW5ndGg7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBmbGFnd29yZCBub3RfZmxhZ3M7Ci0gIGJvb2xlYW4gaGFkX2Z1bGxfbWVzc2FnZTsKLX0gbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgOwotCi10eXBlZGVmIHN0cnVjdCBsYW5nX3N0YXRlbWVudF9oZWFkZXJfc3RydWN0IAotewotICB1bmlvbiAgbGFuZ19zdGF0ZW1lbnRfdW5pb24gICpuZXh0OwotICBlbnVtIHN0YXRlbWVudF9lbnVtCi0gICAgewotICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSwKLSAgICAgIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW0sCi0KLSAgICAgIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtCi0gICAgfSB0eXBlOwotfSBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bmlvbiBldHJlZV91bmlvbiAqZXhwOwotfSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ190YXJnZXRfc3RhdGVtZW50X3N0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGNvbnN0IGNoYXIgKnRhcmdldDsKLX0gbGFuZ190YXJnZXRfc3RhdGVtZW50X3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19vdXRwdXRfc3RhdGVtZW50X3N0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19IGxhbmdfb3V0cHV0X3N0YXRlbWVudF90eXBlOwotCi0vKiBTZWN0aW9uIHR5cGVzIHNwZWNpZmllZCBpbiBhIGxpbmtlciBzY3JpcHQuICAqLwotCi1lbnVtIHNlY3Rpb25fdHlwZQotewotICBub3JtYWxfc2VjdGlvbiwKLSAgZHNlY3Rfc2VjdGlvbiwKLSAgY29weV9zZWN0aW9uLAotICBub2xvYWRfc2VjdGlvbiwKLSAgaW5mb19zZWN0aW9uLAotICBvdmVybGF5X3NlY3Rpb24KLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGEgbGlzdCBvZiBwcm9ncmFtIGhlYWRlcnMgZGVzY3JpYmluZyBzZWdtZW50cwotICAgaW4gd2hpY2ggdGhpcyBzZWN0aW9uIHNob3VsZCBiZSBwbGFjZWQuICAqLwotCi1zdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QKLXsKLSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICBib29sZWFuIHVzZWQ7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9zdHJ1Y3QgCi17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5pb24gZXRyZWVfdW5pb24gKmFkZHJfdHJlZTsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGNoaWxkcmVuOwotICBjb25zdCBjaGFyICptZW1zcGVjOwotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBib29sZWFuIHByb2Nlc3NlZDsKLSAgICAKLSAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOwotICBmbGFnd29yZCBmbGFnczsJCS8qIE9yIHRvZ2V0aGVyIG9mIGFsbCBpbnB1dCBzZWN0aW9ucyAqLwotICBlbnVtIHNlY3Rpb25fdHlwZSBzZWN0eXBlOwotICBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QgKnJlZ2lvbjsKLSAgc2l6ZV90IGJsb2NrX3ZhbHVlOwotICBmaWxsX3R5cGUgZmlsbDsKLQotICBpbnQgc3Vic2VjdGlvbl9hbGlnbm1lbnQ7ICAvKiBhbGlnbm1lbnQgb2YgY29tcG9uZW50cyAqLwotICBpbnQgc2VjdGlvbl9hbGlnbm1lbnQ7ICAvKiBhbGlnbm1lbnQgb2Ygc3RhcnQgb2Ygc2VjdGlvbiAqLwotCi0gIHVuaW9uIGV0cmVlX3VuaW9uICpsb2FkX2Jhc2U7Ci0KLSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwaGRyczsKLX0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci19IGxhbmdfY29tbW9uX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci19IGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgZmlsbF90eXBlIGZpbGw7Ci0gIGludCBzaXplOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci19IGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgdW5pb24gIGV0cmVlX3VuaW9uICpleHA7Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgYmZkX3ZtYSBvdXRwdXRfdm1hOwotfSBsYW5nX2RhdGFfc3RhdGVtZW50X3R5cGU7Ci0KLS8qIEdlbmVyYXRlIGEgcmVsb2MgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotCi0gIC8qIFJlbG9jIHRvIGdlbmVyYXRlLiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotCi0gIC8qIFJlbG9jIGhvd3RvIHN0cnVjdHVyZS4gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIC8qIFNlY3Rpb24gdG8gZ2VuZXJhdGUgcmVsb2MgYWdhaW5zdC4gIEV4YWN0bHkgb25lIG9mIHNlY3Rpb24gYW5kCi0gICAgIG5hbWUgbXVzdCBiZSBOVUxMLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogTmFtZSBvZiBzeW1ib2wgdG8gZ2VuZXJhdGUgcmVsb2MgYWdhaW5zdC4gIEV4YWN0bHkgb25lIG9mIHNlY3Rpb24KLSAgICAgYW5kIG5hbWUgbXVzdCBiZSBOVUxMLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBFeHByZXNzaW9uIGZvciBhZGRlbmQuICAqLwotICB1bmlvbiBldHJlZV91bmlvbiAqYWRkZW5kX2V4cDsKLQotICAvKiBSZXNvbHZlZCBhZGRlbmQuICAqLwotICBiZmRfdm1hIGFkZGVuZF92YWx1ZTsKLQotICAvKiBPdXRwdXQgc2VjdGlvbiB3aGVyZSByZWxvYyBzaG91bGQgYmUgcGVyZm9ybWVkLiAgKi8KLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIFZNQSB3aXRoaW4gb3V0cHV0IHNlY3Rpb24uICAqLwotICBiZmRfdm1hIG91dHB1dF92bWE7Ci19IGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIC8qIE5hbWUgb2YgdGhpcyBmaWxlLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIE5hbWUgdG8gdXNlIGZvciB0aGUgc3ltYm9sIGdpdmluZyBhZGRyZXNzIG9mIHRleHQgc3RhcnQgKi8KLSAgLyogVXN1YWxseSB0aGUgc2FtZSBhcyBmaWxlbmFtZSwgYnV0IGZvciBhIGZpbGUgc3BlYydkIHdpdGggLWwKLSAgICAgdGhpcyBpcyB0aGUgLWwgc3dpdGNoIGl0c2VsZiByYXRoZXIgdGhhbiB0aGUgZmlsZW5hbWUuICAqLwotICBjb25zdCBjaGFyICpsb2NhbF9zeW1fbmFtZTsKLSAgICAKLSAgYmZkICp0aGVfYmZkOwotICAgIAotICBib29sZWFuIGNsb3NlZDsKLSAgZmlsZV9wdHIgcGFzc2l2ZV9wb3NpdGlvbjsKLSAgICAKLSAgLyogU3ltYm9sIHRhYmxlIG9mIHRoZSBmaWxlLiAgKi8KLSAgYXN5bWJvbCAqKmFzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50OwotICAgIAotICAvKiBQb2ludCB0byB0aGUgbmV4dCBmaWxlIC0gd2hhdGV2ZXIgaXQgaXMsIHdhbmRlcnMgdXAgYW5kIGRvd24KLSAgICAgYXJjaGl2ZXMgKi8KLSAgICAKLSAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gICpuZXh0OwotICAvKiBQb2ludCB0byB0aGUgbmV4dCBmaWxlLCBidXQgc2tpcHMgYXJjaGl2ZSBjb250ZW50cyAqLwotICB1bmlvbiAgbGFuZ19zdGF0ZW1lbnRfdW5pb24gICpuZXh0X3JlYWxfZmlsZTsKLSAgICAKLSAgYm9vbGVhbiBpc19hcmNoaXZlOwotICAgIAotICAvKiAxIG1lYW5zIHNlYXJjaCBhIHNldCBvZiBkaXJlY3RvcmllcyBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgYm9vbGVhbiBzZWFyY2hfZGlyc19mbGFnOwotICAgIAotICAvKiAxIG1lYW5zIHRoaXMgaXMgYmFzZSBmaWxlIG9mIGluY3JlbWVudGFsIGxvYWQuCi0gICAgIERvIG5vdCBsb2FkIHRoaXMgZmlsZSdzIHRleHQgb3IgZGF0YS4KLSAgICAgQWxzbyBkZWZhdWx0IHRleHRfc3RhcnQgdG8gYWZ0ZXIgdGhpcyBmaWxlJ3MgYnNzLiAqLwotICAgIAotICBib29sZWFuIGp1c3Rfc3ltc19mbGFnOwotCi0gIC8qIFdoZXRoZXIgdG8gc2VhcmNoIGZvciB0aGlzIGVudHJ5IGFzIGEgZHluYW1pYyBhcmNoaXZlLiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljOwotCi0gIC8qIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUuICAqLwotICBib29sZWFuIHdob2xlX2FyY2hpdmU7Ci0KLSAgYm9vbGVhbiBsb2FkZWQ7Ci0gICAgCi0gIC8qICAgIHVuc2lnbmVkIGludCBnbG9iYWxzX2luX3RoaXNfZmlsZTsqLwotICBjb25zdCBjaGFyICp0YXJnZXQ7Ci0gIGJvb2xlYW4gcmVhbDsKLX0gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaWZpbGU7Ci0gIAotfSBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqZmlsZTsKLX0gbGFuZ19hZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBsYW5nX3dpbGRfc3RhdGVtZW50X3N0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgYm9vbGVhbiBzZWN0aW9uc19zb3J0ZWQ7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBib29sZWFuIGZpbGVuYW1lc19zb3J0ZWQ7Ci0gIGJvb2xlYW4ga2VlcF9zZWN0aW9uczsKLSAgY29uc3QgY2hhciAqZXhjbHVkZV9maWxlbmFtZTsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGNoaWxkcmVuOwotfSBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgY29uc3QgIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgdW5pb24gIGV0cmVlX3VuaW9uICphZGRyZXNzOwotfSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgYmZkX3ZtYSBvdXRwdXRfb2Zmc2V0OwotICBzaXplX3Qgc2l6ZTsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICBmaWxsX3R5cGUgZmlsbDsKLX0gbGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlOwotCi0vKiBBIGdyb3VwIHN0YXRlbWVudCBjb2xsZWN0cyBhIHNldCBvZiBsaWJyYXJpZXMgdG9nZXRoZXIuICBUaGUKLSAgIGxpYnJhcmllcyBhcmUgc2VhcmNoZWQgbXVsdGlwbGUgdGltZXMsIHVudGlsIG5vIG5ldyB1bmRlZmluZWQKLSAgIHN5bWJvbHMgYXJlIGZvdW5kLiAgVGhlIGVmZmVjdCBpcyB0byBzZWFyY2ggYSBncm91cCBvZiBsaWJyYXJpZXMgYXMKLSAgIHRob3VnaCB0aGV5IHdlcmUgYSBzaW5nbGUgbGlicmFyeS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGNoaWxkcmVuOwotfSBsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uIAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpuZXh0OwotICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgd2lsZF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZSBkYXRhX3N0YXRlbWVudDsKLSAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSByZWxvY19zdGF0ZW1lbnQ7Ci0gIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfdHlwZSBhZGRyZXNzX3N0YXRlbWVudDsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfdHlwZSBhZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudDsKLSAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlIGFzc2lnbm1lbnRfc3RhdGVtZW50OwotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlIGlucHV0X3N0YXRlbWVudDsKLSAgbGFuZ190YXJnZXRfc3RhdGVtZW50X3R5cGUgdGFyZ2V0X3N0YXRlbWVudDsKLSAgbGFuZ19vdXRwdXRfc3RhdGVtZW50X3R5cGUgb3V0cHV0X3N0YXRlbWVudDsKLSAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgaW5wdXRfc2VjdGlvbjsKLSAgbGFuZ19jb21tb25fc3RhdGVtZW50X3R5cGUgY29tbW9uX3N0YXRlbWVudDsKLSAgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfdHlwZSBvYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnQ7Ci0gIGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZSBmaWxsX3N0YXRlbWVudDsKLSAgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlIHBhZGRpbmdfc3RhdGVtZW50OwotICBsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlIGdyb3VwX3N0YXRlbWVudDsKLX0gbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9ncmFtIGhlYWRlciwgZnJvbSB0aGUKLSAgIFBIRFJTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi1zdHJ1Y3QgbGFuZ19waGRyCi17Ci0gIHN0cnVjdCBsYW5nX3BoZHIgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgdHlwZTsKLSAgYm9vbGVhbiBmaWxlaGRyOwotICBib29sZWFuIHBoZHJzOwotICBldHJlZV90eXBlICphdDsKLSAgZXRyZWVfdHlwZSAqZmxhZ3M7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgYSBsaXN0IG9mIHNlY3Rpb25zIHdoaWNoIG1heSBub3QKLSAgIGNyb3NzIHJlZmVyZW5jZSBlYWNoIG90aGVyLiAgKi8KLQotc3RydWN0IGxhbmdfbm9jcm9zc3JlZgotewotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotLyogVGhlIGxpc3Qgb2Ygbm9jcm9zc3JlZiBsaXN0cy4gICovCi0KLXN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzCi17Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuZXh0OwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpsaXN0OwotfTsKLQotZXh0ZXJuIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpub2Nyb3NzcmVmX2xpc3Q7Ci0KLWV4dGVybiBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICphYnNfb3V0cHV0X3NlY3Rpb247Ci1leHRlcm4gYm9vbGVhbiBsYW5nX2hhc19pbnB1dF9maWxlOwotZXh0ZXJuIGV0cmVlX3R5cGUgKmJhc2U7Ci1leHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzdGF0X3B0cjsKLWV4dGVybiBib29sZWFuIGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlOwotCi1leHRlcm4gY29uc3QgY2hhciAqZW50cnlfc3ltYm9sOwotZXh0ZXJuIGJvb2xlYW4gZW50cnlfZnJvbV9jbWRsaW5lOwotCi1leHRlcm4gdm9pZCBsYW5nX2luaXQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdCAqbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cAotICBQQVJBTVMgKChjb25zdCBjaGFyICpjb25zdCkpOwotZXh0ZXJuIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdCAqbGFuZ19tZW1vcnlfcmVnaW9uX2RlZmF1bHQKLSAgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19tYXAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19zZXRfZmxhZ3MgUEFSQU1TICgobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKiwgY29uc3QgY2hhciAqLAotCQkJCSAgICBpbnQpKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX291dHB1dCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCBmcm9tX3NjcmlwdCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUsCi0JICAgZXRyZWVfdHlwZSAqIGFkZHJlc3NfZXhwLAotCSAgIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGUsCi0JICAgYmZkX3ZtYSBibG9ja192YWx1ZSwKLQkgICBldHJlZV90eXBlICphbGlnbiwKLQkgICBldHJlZV90eXBlICpzdWJhbGlnbiwKLQkgICBldHJlZV90eXBlICopKTsKLWV4dGVybiB2b2lkIGxhbmdfZmluYWwgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19wcm9jZXNzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxhbmdfc2VjdGlvbl9zdGFydCBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuaW9uIGV0cmVlX3VuaW9uICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX2VudHJ5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfd2lsZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9tYXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9maWxsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqIGxhbmdfYWRkX2Fzc2lnbm1lbnQgUEFSQU1TICgodW5pb24gZXRyZWVfdW5pb24gKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfYXR0cmlidXRlIFBBUkFNUyAoKGVudW0gc3RhdGVtZW50X2VudW0pKTsKLWV4dGVybiB2b2lkIGxhbmdfc3RhcnR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfZmxvYXQgUEFSQU1TICgoZW51bSBiZmRfYm9vbGVhbikpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgUEFSQU1TICgoYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZiBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hYnNfc3ltYm9sX2F0X2JlZ2lubmluZ19vZiBQQVJBTVMgKChjb25zdCBjaGFyICosCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kIFBBUkFNUyAoKHN0cnVjdCBzdGF0ZW1lbnRfbGlzdCAqLAotCQkJCQkgICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqLAotCQkJCQkgICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlCi0gIFBBUkFNUyAoKHZvaWQgKCpkb3RoaXMpIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Zvcl9lYWNoX2ZpbGUKLSAgUEFSQU1TICgodm9pZCAoKmRvdGhpcykgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpKTsKLWV4dGVybiBiZmRfdm1hIGxhbmdfZG9fYXNzaWdubWVudHMKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHMsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCSAgIGZpbGxfdHlwZSBmaWxsLAotCSAgIGJmZF92bWEgZG90KSk7Ci0KLSNkZWZpbmUgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQoc3RhdGVtZW50KQkJXAotICBleHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGZpbGVfY2hhaW47CQkJXAotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdGF0ZW1lbnQ7CQkJCVwKLSAgZm9yIChzdGF0ZW1lbnQgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKWZpbGVfY2hhaW4uaGVhZDtcCi0gICAgICAgc3RhdGVtZW50ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopTlVMTDsJCVwKLSAgICAgICBzdGF0ZW1lbnQgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKXN0YXRlbWVudC0+bmV4dClcCi0gIAotZXh0ZXJuIHZvaWQgbGFuZ19wcm9jZXNzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGFuZ19hZGRfZmlsZSBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLWV4dGVybiBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqIGNvbnN0KSk7Ci1leHRlcm4gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbGFuZ19hZGRfaW5wdXRfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZSwKLQkgICBjb25zdCBjaGFyICp0YXJnZXQpKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX2tlZXBzeW1zX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICoKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lKSk7Ci1leHRlcm4gdm9pZCBsZGxhbmdfYWRkX3VuZGVmIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvbnN0IG5hbWUpKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX291dHB1dF9mb3JtYXQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJCSAgICBjb25zdCBjaGFyICosIGludCBmcm9tX3NjcmlwdCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19saXN0X2luaXQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfZGF0YSBQQVJBTVMgKChpbnQgdHlwZSwgdW5pb24gZXRyZWVfdW5pb24gKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfcmVsb2MKLSAgUEFSQU1TICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jLCByZWxvY19ob3d0b190eXBlICpob3d0bywKLQkgICBhc2VjdGlvbiAqc2VjdGlvbiwgY29uc3QgY2hhciAqbmFtZSwgdW5pb24gZXRyZWVfdW5pb24gKmFkZGVuZCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQKLSAgUEFSQU1TICgodm9pZCAoKmZ1bmMpIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKSk7Ci1leHRlcm4gUFRSIHN0YXRfYWxsb2MgUEFSQU1TICgoc2l6ZV90IHNpemUpKTsKLWV4dGVybiB2b2lkIGRwcmludF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqLCBpbnQpKTsKLWV4dGVybiBiZmRfdm1hIGxhbmdfc2l6ZV9zZWN0aW9ucwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHJldiwgZmlsbF90eXBlIGZpbGwsCi0JICAgYmZkX3ZtYSBkb3QsIGJvb2xlYW4gcmVsYXgpKTsKLWV4dGVybiB2b2lkIGxhbmdfZW50ZXJfZ3JvdXAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9ncm91cCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCB3aWxkX2RvaXQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpwdHIsIGFzZWN0aW9uICpzZWN0aW9uLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dCwKLQkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlKSk7Ci1leHRlcm4gdm9pZCBsYW5nX25ld19waGRyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgZXRyZWVfdHlwZSAqLCBib29sZWFuLCBib29sZWFuLCBldHJlZV90eXBlICosCi0JICAgZXRyZWVfdHlwZSAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9ub2Nyb3NzcmVmIFBBUkFNUyAoKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9vdmVybGF5IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopKTsKLWV4dGVybiB2b2lkIGxhbmdfbGVhdmVfb3ZlcmxheQotICBQQVJBTVMgKChiZmRfdm1hLCBjb25zdCBjaGFyICosIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmxhbmdfZWxmX3ZlcnNpb25faW5mbzsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbGFuZ19uZXdfdmVyc19yZWdleAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmxhbmdfbmV3X3ZlcnNfbm9kZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKiwgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmxhbmdfYWRkX3ZlcnNfZGVwZW5kCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGxleC5oIGIvbGQvbGRsZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NDRjYS4uMDAwMDAwMAotLS0gYS9sZC9sZGxleC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogbGRsZXguaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERMRVhfSAotI2RlZmluZSBMRExFWF9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBUaGUgaW5pdGlhbCBwYXJzZXIgc3RhdGVzLiAgKi8KLXR5cGVkZWYgZW51bSBpbnB1dF9lbnVtIHsKLSAgaW5wdXRfc2VsZWN0ZWQsCQkvKiBXZSd2ZSBzZXQgdGhlIGluaXRpYWwgc3RhdGUuICAqLwotICBpbnB1dF9zY3JpcHQsCi0gIGlucHV0X21yaV9zY3JpcHQsCi0gIGlucHV0X3ZlcnNpb25fc2NyaXB0LAotICBpbnB1dF9kZWZzeW0KLX0gaW5wdXRfdHlwZTsKLQotZXh0ZXJuIGlucHV0X3R5cGUgcGFyc2VyX2lucHV0OwotCi1leHRlcm4gdW5zaWduZWQgaW50IGxpbmVubzsKLWV4dGVybiBjb25zdCBjaGFyICpsZXhfc3RyaW5nOwotCi0vKiBJbiBsZGxleC5sLiAgKi8KLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGV4X3B1c2hfZmlsZSBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGV4X3JlZGlyZWN0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRsZXhfc2NyaXB0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X21yaV9zY3JpcHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfdmVyc2lvbl9zY3JpcHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfdmVyc2lvbl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X2RlZnN5bSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9leHByZXNzaW9uIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X2JvdGggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfY29tbWFuZCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9wb3BzdGF0ZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEluIGxleHN1cC5jLiAgKi8KLWV4dGVybiBpbnQgbGV4X2lucHV0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxleF91bnB1dCBQQVJBTVMgKChpbnQpKTsKLSNpZm5kZWYgeXl3cmFwCi1leHRlcm4gaW50IHl5d3JhcCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLWV4dGVybiB2b2lkIHBhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRsZXgubCBiL2xkL2xkbGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWY4MGYuLjAwMDAwMDAKLS0tIGEvbGQvbGRsZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi0lewotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVRoaXMgd2FzIHdyaXR0ZW4gYnkgc3RldmUgY2hhbWJlcmxhaW4KLSAgICAgICAgICAgICAgICAgICAgc2FjQGN5Z251cy5jb20KLSovCi0KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgTVBXCi0vKiBQcmV2ZW50IGVudW0gcmVkZWZpbml0aW9uIHByb2JsZW1zLiAqLwotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLS8qIFRoZSB0eXBlIG9mIHRvcC1sZXZlbCBwYXJzZXIgaW5wdXQuCi0gICB5eWxleCBhbmQgeXlwYXJzZSAoaW5kaXJlY3RseSkgYm90aCBjaGVjayB0aGlzLiAgKi8KLWlucHV0X3R5cGUgcGFyc2VyX2lucHV0OwotCi0vKiBMaW5lIG51bWJlciBpbiB0aGUgY3VycmVudCBpbnB1dCBmaWxlLgotICAgKEZJWE1FIEFjdHVhbGx5LCBpdCBkb2Vzbid0IGFwcGVhciB0byBnZXQgcmVzZXQgZm9yIGVhY2ggZmlsZT8pICAqLwotdW5zaWduZWQgaW50IGxpbmVubyA9IDE7Ci0KLS8qIFRoZSBzdHJpbmcgd2UgYXJlIGN1cnJlbnRseSBsZXhpbmcsIG9yIE5VTEwgaWYgd2UgYXJlIHJlYWRpbmcgYQotICAgZmlsZS4gICovCi1jb25zdCBjaGFyICpsZXhfc3RyaW5nID0gTlVMTDsKLQotLyogU3VwcG9ydCBmb3IgZmxleCByZWFkaW5nIGZyb20gbW9yZSB0aGFuIG9uZSBpbnB1dCBmaWxlIChzdHJlYW0pLgotICAgYGluY2x1ZGVfc3RhY2snIGlzIGZsZXgncyBpbnB1dCBzdGF0ZSBmb3IgZWFjaCBvcGVuIGZpbGU7Ci0gICBgZmlsZV9uYW1lX3N0YWNrJyBpcyB0aGUgZmlsZSBuYW1lcy4gIGBsaW5lbm9fc3RhY2snIGlzIHRoZSBjdXJyZW50Ci0gICBsaW5lIG51bWJlcnMuCi0KLSAgIElmIGBpbmNsdWRlX3N0YWNrX3B0cicgaXMgMCwgd2UgaGF2ZW4ndCBzdGFydGVkIHJlYWRpbmcgYW55dGhpbmcgeWV0LgotICAgT3RoZXJ3aXNlLCBzdGFjayBlbGVtZW50cyAwIHRocm91Z2ggYGluY2x1ZGVfc3RhY2tfcHRyIC0gMScgYXJlIHZhbGlkLiAgKi8KLQotI3VuZGVmIFlZX0lOUFVUCi0jZGVmaW5lIFlZX0lOUFVUKGJ1ZixyZXN1bHQsbWF4X3NpemUpIHl5X2lucHV0KGJ1ZiwgJnJlc3VsdCwgbWF4X3NpemUpCi0KLSNkZWZpbmUgTUFYX0lOQ0xVREVfREVQVEggMTAKLXN0YXRpYyBZWV9CVUZGRVJfU1RBVEUgaW5jbHVkZV9zdGFja1tNQVhfSU5DTFVERV9ERVBUSF07Ci1zdGF0aWMgY29uc3QgY2hhciAqZmlsZV9uYW1lX3N0YWNrW01BWF9JTkNMVURFX0RFUFRIXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGluZW5vX3N0YWNrW01BWF9JTkNMVURFX0RFUFRIXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaW5jbHVkZV9zdGFja19wdHIgPSAwOwotc3RhdGljIGludCB2ZXJzX25vZGVfbmVzdGluZyA9IDA7Ci0KLXN0YXRpYyBZWV9CVUZGRVJfU1RBVEUgeXlfY3JlYXRlX3N0cmluZ19idWZmZXIgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCQkJCXNpemVfdCBzaXplKSk7Ci1zdGF0aWMgdm9pZCB5eV9pbnB1dCBQQVJBTVMgKChjaGFyICosIGludCAqcmVzdWx0LCBpbnQgbWF4X3NpemUpKTsKLQotc3RhdGljIHZvaWQgY29tbWVudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsZXhfd2Fybl9pbnZhbGlkIFBBUkFNUyAoKGNoYXIgKndoZXJlLCBjaGFyICp3aGF0KSk7Ci0KLS8qIFNUQVRFUyAKLQlFWFBSRVNTSU9OCWRlZmluaXRlbHkgaW4gYW4gZXhwcmVzc2lvbgotCVNDUklQVAkJZGVmaW5pdGVseSBpbiBhIHNjcmlwdAotCUJPVEgJCWVpdGhlciBFWFBSRVNTSU9OIG9yIFNDUklQVAotCURFRlNZTUVYUAlpbiBhbiBhcmd1bWVudCB0byAtZGVmc3ltCi0gICAgICAgIE1SSSAgICAgICAgICAgICBpbiBhbiBNUkkgc2NyaXB0Ci0JVkVSU19TVEFSVAlzdGFydGluZyBhIFN1biBzdHlsZSBtYXBmaWxlCi0JVkVSU19TQ1JJUFQJYSBTdW4gc3R5bGUgbWFwZmlsZQotCVZFUlNfTk9ERQlhIG5vZGUgd2l0aGluIGEgU3VuIHN0eWxlIG1hcGZpbGUKLSovCi0jZGVmaW5lIFJUT0tFTih4KSAgeyAgeXlsdmFsLnRva2VuID0geDsgcmV0dXJuIHg7IH0KLQotLyogU29tZSB2ZXJzaW9ucyBvZiBmbGV4IHdhbnQgdGhpcy4gICovCi0jaWZuZGVmIHl5d3JhcAotaW50IHl5d3JhcCAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKLSV9Ci0KLSVhIDQwMDAKLSVvIDUwMDAKLQotQ01ERklMRU5BTUVDSEFSICAgW19hLXpBLVowLTlcL1wuXFxfXCtcJFw6XFtcXVxcXCxcPVwmXCFcPFw+XC1cfl0KLUNNREZJTEVOQU1FQ0hBUjEgIFtfYS16QS1aMC05XC9cLlxcX1wrXCRcOlxbXF1cXFwsXD1cJlwhXDxcPlx+XQotRklMRU5BTUVDSEFSMQlbX2EtekEtWlwvXC5cXFwkXF9cfl0KLVNZTUJPTENIQVJOICAgICBbX2EtekEtWlwvXC5cXFwkXF9cfjAtOV0KLUZJTEVOQU1FQ0hBUglbX2EtekEtWjAtOVwvXC5cLVxfXCtcPVwkXDpcW1xdXFxcLFx+XQotV0lMRENIQVIJW19hLXpBLVowLTlcL1wuXC1cX1wrXD1cJFw6XFtcXVxcXCxcflw/XCpdCi1XSElURQkJWyBcdFxuXHJdKyAKLQotTk9DRklMRU5BTUVDSEFSCVtfYS16QS1aMC05XC9cLlwtXF9cK1wkXDpcW1xdXFxcfl0KLQotVl9UQUcgWy4kX2EtekEtWl1bLl9hLXpBLVowLTldKgotVl9JREVOVElGSUVSIFsqPy4kX2EtekEtWl1bKj8uJF9hLXpBLVowLTldKgotCi0lcyBTQ1JJUFQKLSVzIEVYUFJFU1NJT04KLSVzIEJPVEgKLSVzIERFRlNZTUVYUAotJXMgTVJJCi0lcyBWRVJTX1NUQVJUCi0lcyBWRVJTX1NDUklQVAotJXMgVkVSU19OT0RFCi0lJQotCi0gIGlmIChwYXJzZXJfaW5wdXQgIT0gaW5wdXRfc2VsZWN0ZWQpCi0gICAgewotICAgICAgLyogVGhlIGZpcnN0IHRva2VuIG9mIHRoZSBpbnB1dCBkZXRlcm1pbmVzIHRoZSBpbml0aWFsIHBhcnNlciBzdGF0ZS4gICovCi0gICAgICBpbnB1dF90eXBlIHQgPSBwYXJzZXJfaW5wdXQ7Ci0gICAgICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9zZWxlY3RlZDsKLSAgICAgIHN3aXRjaCAodCkKLQl7Ci0JY2FzZSBpbnB1dF9zY3JpcHQ6IHJldHVybiBJTlBVVF9TQ1JJUFQ7IGJyZWFrOwotCWNhc2UgaW5wdXRfbXJpX3NjcmlwdDogcmV0dXJuIElOUFVUX01SSV9TQ1JJUFQ7IGJyZWFrOwotCWNhc2UgaW5wdXRfdmVyc2lvbl9zY3JpcHQ6IHJldHVybiBJTlBVVF9WRVJTSU9OX1NDUklQVDsgYnJlYWs7Ci0JY2FzZSBpbnB1dF9kZWZzeW06IHJldHVybiBJTlBVVF9ERUZTWU07IGJyZWFrOwotCWRlZmF1bHQ6IGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OPiIvKiIJeyBjb21tZW50KCk7IH0KLQotCi08REVGU1lNRVhQPiItIiAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKCctJyk7fQotPERFRlNZTUVYUD4iKyIgICAgICAgICAgICAgICAgICB7IFJUT0tFTignKycpO30KLTxERUZTWU1FWFA+e0ZJTEVOQU1FQ0hBUjF9e1NZTUJPTENIQVJOfSogICB7IHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nKHl5dGV4dCk7IHJldHVybiBOQU1FOyB9Ci08REVGU1lNRVhQPiI9IiAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKCc9Jyk7IH0KLQotPE1SSSxFWFBSRVNTSU9OPiIkIihbMC05QS1GYS1mXSkrIHsKLSAgCQkJCXl5bHZhbC5pbnRlZ2VyID0gYmZkX3NjYW5fdm1hICh5eXRleHQrMSwgMCwxNik7Ci0JCQkJcmV0dXJuIElOVDsKLQkJCX0KLQotPE1SSSxFWFBSRVNTSU9OPihbMC05QS1GYS1mXSkrKEh8aHxYfHh8QnxifE98b3xEfGQpIHsKLQkJCQkgICBpbnQgaWJhc2UgOwotCQkJCSAgIHN3aXRjaCAoeXl0ZXh0W3l5bGVuZy0xXSkgewotCQkJCSAgICBjYXNlICdYJzogCi0JCQkJICAgIGNhc2UgJ3gnOgotCQkJCSAgICBjYXNlICdIJzoKLQkJCQkgICAgY2FzZSAnaCc6Ci0JCQkJICAgICBpYmFzZSA9IDE2OwotCQkJCSAgICAgYnJlYWs7Ci0JCQkJICAgIGNhc2UgJ08nOgotCQkJCSAgICBjYXNlICdvJzoKLQkJCQkgICAgIGliYXNlID0gODsKLQkJCQkgICAgIGJyZWFrOwotCQkJCSAgICBjYXNlICdCJzoKLQkJCQkgICAgY2FzZSAnYic6Ci0JCQkJICAgICBpYmFzZSA9IDI7Ci0JCQkJICAgICBicmVhazsKLQkJCQkgICAgZGVmYXVsdDoKLQkJCQkgICAgIGliYXNlID0gMTA7Ci0JCQkJICAgfQotCQkJCSAgIHl5bHZhbC5pbnRlZ2VyID0gYmZkX3NjYW5fdm1hICh5eXRleHQsIDAsCi0JCQkJCQkJCSAgaWJhc2UpOwotCQkJCSAgIHJldHVybiBJTlQ7Ci0JCQkJIH0KLTxTQ1JJUFQsREVGU1lNRVhQLE1SSSxCT1RILEVYUFJFU1NJT04+KCgoIiQifCIweCIpKFswLTlBLUZhLWZdKSspfCgoWzAtOV0pKykpKE18S3xtfGspPyB7Ci0JCQkJICBjaGFyICpzID0geXl0ZXh0OwotCi0JCQkJICBpZiAoKnMgPT0gJyQnKQotCQkJCSAgICArK3M7Ci0JCQkJICB5eWx2YWwuaW50ZWdlciA9IGJmZF9zY2FuX3ZtYSAocywgMCwgMCk7Ci0JCQkJICBpZiAoeXl0ZXh0W3l5bGVuZy0xXSA9PSAnTScKLQkJCQkgICAgICB8fCB5eXRleHRbeXlsZW5nLTFdID09ICdtJykKLQkJCQkgICAgeXlsdmFsLmludGVnZXIgKj0gMTAyNCAqIDEwMjQ7Ci0JCQkJICBpZiAoeXl0ZXh0W3l5bGVuZy0xXSA9PSAnSycgCi0JCQkJICAgICAgfHwgeXl0ZXh0W3l5bGVuZy0xXT09J2snKQotCQkJCSAgICB5eWx2YWwuaW50ZWdlciAqPSAxMDI0OwotCQkJCSAgcmV0dXJuIElOVDsKLQkJCQl9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Il0iCQl7IFJUT0tFTignXScpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iWyIJCXsgUlRPS0VOKCdbJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8PD0iCXsgUlRPS0VOKExTSElGVEVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij4+PSIJeyBSVE9LRU4oUlNISUZURVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifHwiCXsgUlRPS0VOKE9ST1IpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPT0iCXsgUlRPS0VOKEVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiE9Igl7IFJUT0tFTihORSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+PSIJeyBSVE9LRU4oR0UpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPD0iCXsgUlRPS0VOKExFKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ijw8Igl7IFJUT0tFTihMU0hJRlQpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPj4iCXsgUlRPS0VOKFJTSElGVCk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIrPSIJeyBSVE9LRU4oUExVU0VRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii09Igl7IFJUT0tFTihNSU5VU0VRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Iio9Igl7IFJUT0tFTihNVUxURVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iLz0iCXsgUlRPS0VOKERJVkVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiY9Igl7IFJUT0tFTihBTkRFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ8PSIJeyBSVE9LRU4oT1JFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiImJiIJeyBSVE9LRU4oQU5EQU5EKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij4iCQl7IFJUT0tFTignPicpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iLCIJCXsgUlRPS0VOKCcsJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiImIgkJeyBSVE9LRU4oJyYnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+InwiCQl7IFJUT0tFTignfCcpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifiIJCXsgUlRPS0VOKCd+Jyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIhIgkJeyBSVE9LRU4oJyEnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij8iCQl7IFJUT0tFTignPycpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKiIJCXsgUlRPS0VOKCcqJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIrIgkJeyBSVE9LRU4oJysnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii0iCQl7IFJUT0tFTignLScpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iLyIJCXsgUlRPS0VOKCcvJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIlIgkJeyBSVE9LRU4oJyUnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IjwiCQl7IFJUT0tFTignPCcpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPSIgICAgICAgICAgeyBSVE9LRU4oJz0nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+In0iCQkJeyBSVE9LRU4oJ30nKSA7IH0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ieyIJCQl7IFJUT0tFTigneycpOyB9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IikiCQkJeyBSVE9LRU4oJyknKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IigiCQkJeyBSVE9LRU4oJygnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IjoiCQl7IFJUT0tFTignOicpOyB9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IjsiCQl7IFJUT0tFTignOycpO30KLTxCT1RILFNDUklQVD4iTUVNT1JZIgkJeyBSVE9LRU4oTUVNT1JZKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9SSUdJTiIJCXsgUlRPS0VOKE9SSUdJTik7fQotPEJPVEgsU0NSSVBUPiJWRVJTSU9OIgkJeyBSVE9LRU4oVkVSU0lPTkspO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJCTE9DSyIJCXsgUlRPS0VOKEJMT0NLKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQklORCIJCXsgUlRPS0VOKEJJTkQpO30KLTxCT1RILFNDUklQVD4iTEVOR1RIIgkJeyBSVE9LRU4oTEVOR1RIKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQUxJR04iCQkJeyBSVE9LRU4oQUxJR05fSyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkFERFIiCQkJeyBSVE9LRU4oQUREUik7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkxPQURBRERSIgkJeyBSVE9LRU4oTE9BREFERFIpO30KLTxFWFBSRVNTSU9OLEJPVEg+Ik1BWCIJCQl7IFJUT0tFTihNQVhfSyk7IH0KLTxFWFBSRVNTSU9OLEJPVEg+Ik1JTiIJCQl7IFJUT0tFTihNSU5fSyk7IH0KLTxFWFBSRVNTSU9OLEJPVEg+IkFTU0VSVCIJCXsgUlRPS0VOKEFTU0VSVF9LKTsgfQotPEJPVEgsU0NSSVBUPiJFTlRSWSIJCQl7IFJUT0tFTihFTlRSWSk7fQotPEJPVEgsU0NSSVBULE1SST4iRVhURVJOIgkJeyBSVE9LRU4oRVhURVJOKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iTkVYVCIJCQl7IFJUT0tFTihORVhUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4ic2l6ZW9mX2hlYWRlcnMiCXsgUlRPS0VOKFNJWkVPRl9IRUFERVJTKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iU0laRU9GX0hFQURFUlMiCXsgUlRPS0VOKFNJWkVPRl9IRUFERVJTKTt9Ci08Qk9USCxTQ1JJUFQ+Ik1BUCIJCQl7IFJUT0tFTihNQVApO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJTSVpFT0YiCQl7IFJUT0tFTihTSVpFT0YpO30KLTxCT1RILFNDUklQVD4iVEFSR0VUIgkJeyBSVE9LRU4oVEFSR0VUX0spO30KLTxCT1RILFNDUklQVD4iU0VBUkNIX0RJUiIJCXsgUlRPS0VOKFNFQVJDSF9ESVIpO30KLTxCT1RILFNDUklQVD4iT1VUUFVUIgkJeyBSVE9LRU4oT1VUUFVUKTt9Ci08Qk9USCxTQ1JJUFQ+IklOUFVUIgkJCXsgUlRPS0VOKElOUFVUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iR1JPVVAiCQl7IFJUT0tFTihHUk9VUCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkRFRklORUQiCQl7IFJUT0tFTihERUZJTkVEKTt9Ci08Qk9USCxTQ1JJUFQ+IkNSRUFURV9PQkpFQ1RfU1lNQk9MUyIJeyBSVE9LRU4oQ1JFQVRFX09CSkVDVF9TWU1CT0xTKTt9Ci08Qk9USCxTQ1JJUFQ+IkNPTlNUUlVDVE9SUyIJCXsgUlRPS0VOKCBDT05TVFJVQ1RPUlMpO30KLTxCT1RILFNDUklQVD4iRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04iIHsgUlRPS0VOKEZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OKTt9Ci08Qk9USCxTQ1JJUFQ+IlNFQ1RJT05TIgkJeyBSVE9LRU4oU0VDVElPTlMpO30KLTxCT1RILFNDUklQVD4iRklMTCIJCQl7IFJUT0tFTihGSUxMKTt9Ci08Qk9USCxTQ1JJUFQ+IlNUQVJUVVAiCQl7IFJUT0tFTihTVEFSVFVQKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9VVFBVVF9GT1JNQVQiCQl7IFJUT0tFTihPVVRQVVRfRk9STUFUKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9VVFBVVF9BUkNIIgkJeyBSVE9LRU4oIE9VVFBVVF9BUkNIKTt9Ci08Qk9USCxTQ1JJUFQ+IkhMTCIJCQl7IFJUT0tFTihITEwpO30KLTxCT1RILFNDUklQVD4iU1lTTElCIgkJeyBSVE9LRU4oU1lTTElCKTt9Ci08Qk9USCxTQ1JJUFQ+IkZMT0FUIgkJCXsgUlRPS0VOKEZMT0FUKTt9Ci08Qk9USCxTQ1JJUFQ+IlFVQUQiCQkJeyBSVE9LRU4oIFFVQUQpO30KLTxCT1RILFNDUklQVD4iU1FVQUQiCQkJeyBSVE9LRU4oIFNRVUFEKTt9Ci08Qk9USCxTQ1JJUFQ+IkxPTkciCQkJeyBSVE9LRU4oIExPTkcpO30KLTxCT1RILFNDUklQVD4iU0hPUlQiCQkJeyBSVE9LRU4oIFNIT1JUKTt9Ci08Qk9USCxTQ1JJUFQ+IkJZVEUiCQkJeyBSVE9LRU4oIEJZVEUpO30KLTxCT1RILFNDUklQVD4iTk9GTE9BVCIJCXsgUlRPS0VOKE5PRkxPQVQpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJOT0NST1NTUkVGUyIJeyBSVE9LRU4oTk9DUk9TU1JFRlMpO30KLTxCT1RILFNDUklQVD4iT1ZFUkxBWSIJCQl7IFJUT0tFTihPVkVSTEFZKTsgfQotPEJPVEgsU0NSSVBUPiJTT1JUIgkJCXsgUlRPS0VOKFNPUlQpOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iTk9MT0FEIgl7IFJUT0tFTihOT0xPQUQpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJEU0VDVCIJCXsgUlRPS0VOKERTRUNUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQ09QWSIJCXsgUlRPS0VOKENPUFkpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJJTkZPIgkJeyBSVE9LRU4oSU5GTyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik9WRVJMQVkiCXsgUlRPS0VOKE9WRVJMQVkpO30KLTxCT1RILFNDUklQVD4ibyIJCQl7IFJUT0tFTihPUklHSU4pO30KLTxCT1RILFNDUklQVD4ib3JnIgkJCXsgUlRPS0VOKE9SSUdJTik7fQotPEJPVEgsU0NSSVBUPiJsIgkJCXsgUlRPS0VOKCBMRU5HVEgpO30KLTxCT1RILFNDUklQVD4ibGVuIgkJCXsgUlRPS0VOKCBMRU5HVEgpO30KLTxCT1RILFNDUklQVD4iSU5DTFVERSIJCQl7IFJUT0tFTihJTkNMVURFKTt9Ci08Qk9USCxTQ1JJUFQ+IlBIRFJTIgkJCXsgUlRPS0VOIChQSERSUyk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJBVCIJCQl7IFJUT0tFTihBVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IlBST1ZJREUiCQl7IFJUT0tFTihQUk9WSURFKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IktFRVAiCQl7IFJUT0tFTihLRUVQKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkVYQ0xVREVfRklMRSIgICAgICAgIHsgUlRPS0VOKEVYQ0xVREVfRklMRSk7IH0KLTxNUkk+IiMiLipcbj8JCQl7ICsrIGxpbmVubzsgfQotPE1SST4iXG4iCSAgICAgICAgICAgICAgICB7ICsrIGxpbmVubzsgIFJUT0tFTihORVdMSU5FKTsgfQotPE1SST4iKiIuKgkJCXsgLyogTXJpIGNvbW1lbnQgbGluZSAqLyB9Ci08TVJJPiI7Ii4qCQkJeyAvKiBNcmkgY29tbWVudCBsaW5lICovIH0KLTxNUkk+IkVORCIgICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oRU5EV09SRCk7IH0KLTxNUkk+IkFMSUdOTU9EIgkJeyBSVE9LRU4oQUxJR05NT0QpO30KLTxNUkk+IkFMSUdOIgkJeyBSVE9LRU4oQUxJR05fSyk7fQotPE1SST4iQ0hJUCIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihDSElQKTsgfQotPE1SST4iQkFTRSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihCQVNFKTsgfQotPE1SST4iQUxJQVMiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQUxJQVMpOyB9Ci08TVJJPiJUUlVOQ0FURSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihUUlVOQ0FURSk7IH0KLTxNUkk+IkxPQUQiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTE9BRCk7IH0KLTxNUkk+IlBVQkxJQyIgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oUFVCTElDKTsgfQotPE1SST4iT1JERVIiICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihPUkRFUik7IH0KLTxNUkk+Ik5BTUUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTkFNRVdPUkQpOyB9Ci08TVJJPiJGT1JNQVQiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEZPUk1BVCk7IH0KLTxNUkk+IkNBU0UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0FTRSk7IH0KLTxNUkk+IlNUQVJUIiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oU1RBUlQpOyB9Ci08TVJJPiJMSVNUIi4qICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExJU1QpOyAvKiBMSVNUIGFuZCBpZ25vcmUgdG8gZW5kIG9mIGxpbmUgKi8gfQotPE1SST4iU0VDVCIJCQl7IFJUT0tFTihTRUNUKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQsTVJJPiJBQlNPTFVURSIJCQl7IFJUT0tFTihBQlNPTFVURSk7IH0KLTxNUkk+ImVuZCIgICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oRU5EV09SRCk7IH0KLTxNUkk+ImFsaWdubW9kIgkJeyBSVE9LRU4oQUxJR05NT0QpO30KLTxNUkk+ImFsaWduIgkJeyBSVE9LRU4oQUxJR05fSyk7fQotPE1SST4iY2hpcCIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihDSElQKTsgfQotPE1SST4iYmFzZSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihCQVNFKTsgfQotPE1SST4iYWxpYXMiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQUxJQVMpOyB9Ci08TVJJPiJ0cnVuY2F0ZSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihUUlVOQ0FURSk7IH0KLTxNUkk+ImxvYWQiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTE9BRCk7IH0KLTxNUkk+InB1YmxpYyIgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oUFVCTElDKTsgfQotPE1SST4ib3JkZXIiICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihPUkRFUik7IH0KLTxNUkk+Im5hbWUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTkFNRVdPUkQpOyB9Ci08TVJJPiJmb3JtYXQiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEZPUk1BVCk7IH0KLTxNUkk+ImNhc2UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0FTRSk7IH0KLTxNUkk+ImV4dGVybiIgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oRVhURVJOKTsgfQotPE1SST4ic3RhcnQiICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihTVEFSVCk7IH0KLTxNUkk+Imxpc3QiLiogICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTElTVCk7IC8qIExJU1QgYW5kIGlnbm9yZSB0byBlbmQgb2YgbGluZSAqLyB9Ci08TVJJPiJzZWN0IgkJCXsgUlRPS0VOKFNFQ1QpOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVCxNUkk+ImFic29sdXRlIgkJCXsgUlRPS0VOKEFCU09MVVRFKTsgfQotCi08TVJJPntGSUxFTkFNRUNIQVIxfXtOT0NGSUxFTkFNRUNIQVJ9Kgl7Ci0vKiBGaWxlbmFtZSB3aXRob3V0IGNvbW1hcywgbmVlZGVkIHRvIHBhcnNlIG1yaSBzdHVmZiAqLwotCQkJCSB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOyAKLQkJCQkgIHJldHVybiBOQU1FOwotCQkJCX0KLQotCi08Qk9USCxFWFBSRVNTSU9OPntGSUxFTkFNRUNIQVIxfXtGSUxFTkFNRUNIQVJ9Kgl7Ci0JCQkJIHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nKHl5dGV4dCk7IAotCQkJCSAgcmV0dXJuIE5BTUU7Ci0JCQkJfQotPEJPVEgsRVhQUkVTU0lPTj4iLWwie0ZJTEVOQU1FQ0hBUn0rIHsKLQkJCQkgIHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nICh5eXRleHQgKyAyKTsKLQkJCQkgIHJldHVybiBMTkFNRTsKLQkJCQl9Ci08U0NSSVBUPntXSUxEQ0hBUn0qIHsKLQkJLyogQW5ub3lpbmdseSwgdGhpcyBwYXR0ZXJuIGNhbiBtYXRjaCBjb21tZW50cywgYW5kIHdlIGhhdmUKLQkJICAgbG9uZ2VzdCBtYXRjaCBpc3N1ZXMgdG8gY29uc2lkZXIuICBTbyBpZiB0aGUgZmlyc3QgdHdvCi0JCSAgIGNoYXJhY3RlcnMgYXJlIGEgY29tbWVudCBvcGVuaW5nLCBwdXQgdGhlIGlucHV0IGJhY2sgYW5kCi0JCSAgIHRyeSBhZ2Fpbi4gICovCi0JCWlmICh5eXRleHRbMF0gPT0gJy8nICYmIHl5dGV4dFsxXSA9PSAnKicpCi0JCSAgewotCQkgICAgeXlsZXNzKDIpOwotCQkgICAgY29tbWVudCAoKTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOwotCQkgICAgcmV0dXJuIE5BTUU7Ci0JCSAgfQotCX0KLQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQsVkVSU19OT0RFPiJcIiJbXlwiXSoiXCIiIHsKLQkJCQkJLyogTm8gbWF0dGVyIHRoZSBzdGF0ZSwgcXVvdGVzCi0JCQkJCSAgIGdpdmUgd2hhdCdzIGluc2lkZSAqLwotCQkJCQl5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQrMSk7Ci0JCQkJCXl5bHZhbC5uYW1lW3l5bGVuZy0yXSA9IDA7Ci0JCQkJCXJldHVybiBOQU1FOwotCQkJCX0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OPiJcbiIJCXsgbGluZW5vKys7fQotPE1SSSxCT1RILFNDUklQVCxFWFBSRVNTSU9OPlsgXHRccl0rCXsgfQotCi08VkVSU19OT0RFLFZFUlNfU0NSSVBUPls6LDtdCXsgcmV0dXJuICp5eXRleHQ7IH0KLQotPFZFUlNfTk9ERT5nbG9iYWwJCXsgUlRPS0VOKEdMT0JBTCk7IH0KLQotPFZFUlNfTk9ERT5sb2NhbAkJeyBSVE9LRU4oTE9DQUwpOyB9Ci0KLTxWRVJTX05PREU+ZXh0ZXJuCQl7IFJUT0tFTihFWFRFUk4pOyB9Ci0KLTxWRVJTX05PREU+e1ZfSURFTlRJRklFUn0JeyB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyAoeXl0ZXh0KTsKLQkJCQkgIHJldHVybiBWRVJTX0lERU5USUZJRVI7IH0KLQotPFZFUlNfU0NSSVBUPntWX1RBR30JCXsgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcgKHl5dGV4dCk7Ci0JCQkJICByZXR1cm4gVkVSU19UQUc7IH0KLQotPFZFUlNfU1RBUlQ+InsiCQkJeyBCRUdJTihWRVJTX1NDUklQVCk7IHJldHVybiAqeXl0ZXh0OyB9Ci0KLTxWRVJTX1NDUklQVD4ieyIJCXsgQkVHSU4oVkVSU19OT0RFKTsgCi0JCQkJICB2ZXJzX25vZGVfbmVzdGluZyA9IDA7Ci0JCQkJICByZXR1cm4gKnl5dGV4dDsKLQkJCQl9Ci08VkVSU19TQ1JJUFQ+In0iCQl7IHJldHVybiAqeXl0ZXh0OyB9Ci08VkVSU19OT0RFPiJ7IgkJCXsgdmVyc19ub2RlX25lc3RpbmcrKzsgcmV0dXJuICp5eXRleHQ7IH0KLTxWRVJTX05PREU+In0iCQkJeyBpZiAoLS12ZXJzX25vZGVfbmVzdGluZyA8IDApCi0JCQkJICAgIEJFR0lOKFZFUlNfU0NSSVBUKTsKLQkJCQkgIHJldHVybiAqeXl0ZXh0OwotCQkJCX0KLQotPFZFUlNfU1RBUlQsVkVSU19OT0RFLFZFUlNfU0NSSVBUPltcbl0JCXsgbGluZW5vKys7IH0KLQotPFZFUlNfU1RBUlQsVkVSU19OT0RFLFZFUlNfU0NSSVBUPiMuKgkJeyAvKiBFYXQgdXAgY29tbWVudHMgKi8gfQotCi08VkVSU19TVEFSVCxWRVJTX05PREUsVkVSU19TQ1JJUFQ+WyBcdFxyXSsgICAJeyAvKiBFYXQgdXAgd2hpdGVzcGFjZSAqLyB9Ci0KLTw8RU9GPj4gewotICBpbmNsdWRlX3N0YWNrX3B0ci0tOwotICAgIAotICBpZiAoaW5jbHVkZV9zdGFja19wdHIgPT0gMCkgCi0gIHsKLSAgICB5eXRlcm1pbmF0ZSgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB5eV9zd2l0Y2hfdG9fYnVmZmVyKGluY2x1ZGVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdKTsKLQotICB9Ci0gIEJFR0lOKFNDUklQVCk7Ci0gIGxkZmlsZV9pbnB1dF9maWxlbmFtZSA9IGZpbGVfbmFtZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0ciAtIDFdOwotICBsaW5lbm8gPSBsaW5lbm9fc3RhY2tbaW5jbHVkZV9zdGFja19wdHIgLSAxXTsKLQotICByZXR1cm4gRU5EOwotfQotCi08U0NSSVBULE1SSSxWRVJTX1NUQVJULFZFUlNfU0NSSVBULFZFUlNfTk9ERT4uCWxleF93YXJuX2ludmFsaWQoIiBpbiBzY3JpcHQiLCB5eXRleHQpOwotPEVYUFJFU1NJT04sREVGU1lNRVhQLEJPVEg+LglsZXhfd2Fybl9pbnZhbGlkKCIgaW4gZXhwcmVzc2lvbiIsIHl5dGV4dCk7Ci0gICAgCi0lJQotDAotCi0vKiBTd2l0Y2ggZmxleCB0byByZWFkaW5nIHNjcmlwdCBmaWxlIE5BTUUsIG9wZW4gb24gRklMRSwKLSAgIHNhdmluZyB0aGUgY3VycmVudCBpbnB1dCBpbmZvIG9uIHRoZSBpbmNsdWRlIHN0YWNrLiAgKi8KLQotdm9pZAotbGV4X3B1c2hfZmlsZSAoZmlsZSwgbmFtZSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID49IE1BWF9JTkNMVURFX0RFUFRIKSAKLSAgICB7Ci0gICAgICBlaW5mbygiJUY6aW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHlcbiIpOwotICAgIH0KLSAgZmlsZV9uYW1lX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IG5hbWU7Ci0gIGxpbmVub19zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSAxOwotICBpbmNsdWRlX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IFlZX0NVUlJFTlRfQlVGRkVSOwotCi0gIGluY2x1ZGVfc3RhY2tfcHRyKys7Ci0gIHl5aW4gPSBmaWxlOwotICB5eV9zd2l0Y2hfdG9fYnVmZmVyKHl5X2NyZWF0ZV9idWZmZXIoeXlpbiwgWVlfQlVGX1NJWkUpKTsKLSAgQkVHSU4gKFNDUklQVCk7Ci19Ci0KLS8qIFJldHVybiBhIG5ld2x5IGNyZWF0ZWQgZmxleCBpbnB1dCBidWZmZXIgY29udGFpbmluZyBTVFJJTkcsCi0gICB3aGljaCBpcyBTSVpFIGJ5dGVzIGxvbmcuICAqLwotCi1zdGF0aWMgWVlfQlVGRkVSX1NUQVRFIAoteXlfY3JlYXRlX3N0cmluZ19idWZmZXIgKHN0cmluZywgc2l6ZSkKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgWVlfQlVGRkVSX1NUQVRFIGI7Ci0KLSAgLyogQ2FsbHMgdG8gbS1hbGxvYyBnZXQgdHVybmVkIGJ5IHNlZCBpbnRvIHhtLWFsbG9jLiAgKi8KLSAgYiA9IChZWV9CVUZGRVJfU1RBVEUpIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKSk7Ci0gIGItPnl5X2lucHV0X2ZpbGUgPSAwOwotICBiLT55eV9idWZfc2l6ZSA9IHNpemU7Ci0KLSAgLyogeXlfY2hfYnVmIGhhcyB0byBiZSAyIGNoYXJhY3RlcnMgbG9uZ2VyIHRoYW4gdGhlIHNpemUgZ2l2ZW4gYmVjYXVzZQotICAgICB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4gICovCi0gIGItPnl5X2NoX2J1ZiA9IChjaGFyICopIG1hbGxvYyAoKHVuc2lnbmVkKSAoYi0+eXlfYnVmX3NpemUgKyAzKSk7Ci0KLSAgYi0+eXlfY2hfYnVmWzBdID0gJ1xuJzsKLSAgc3RyY3B5IChiLT55eV9jaF9idWYrMSwgc3RyaW5nKTsKLSAgYi0+eXlfY2hfYnVmW3NpemUrMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7Ci0gIGItPnl5X2NoX2J1ZltzaXplKzJdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotICBiLT55eV9uX2NoYXJzID0gc2l6ZSsxOwotICBiLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlsxXTsKLQotICAvKiBmbGV4IDIuNC43IGNoYW5nZWQgdGhlIGludGVyZmFjZS4gIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIHVzaW5nCi0gICAgIGEgZmxleCBpbnRlcm5hbCBpbnRlcmZhY2UgaW4gdGhlIGZpcnN0IHBsYWNlISAgKi8KLSNpZmRlZiBZWV9CVUZGRVJfTkVXCi0gIGItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOwotI2Vsc2UKLSAgYi0+eXlfZW9mX3N0YXR1cyA9IEVPRl9OT1RfU0VFTjsKLSNlbmRpZgotCi0gIHJldHVybiBiOwotfQotCi0vKiBTd2l0Y2ggZmxleCB0byByZWFkaW5nIGZyb20gU1RSSU5HLCBzYXZpbmcgdGhlIGN1cnJlbnQgaW5wdXQgaW5mbwotICAgb24gdGhlIGluY2x1ZGUgc3RhY2suICAqLwotCi12b2lkCi1sZXhfcmVkaXJlY3QgKHN0cmluZykKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotewotICBZWV9CVUZGRVJfU1RBVEUgdG1wOwotCi0gIHl5X2luaXQgPSAwOwotICBpZiAoaW5jbHVkZV9zdGFja19wdHIgPj0gTUFYX0lOQ0xVREVfREVQVEgpIAotICAgIHsKLSAgICAgIGVpbmZvKCIlRjogbWFjcm9zIG5lc3RlZCB0b28gZGVlcGx5XG4iKTsKLSAgICB9Ci0gIGZpbGVfbmFtZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSAicmVkaXJlY3QiOwotICBsaW5lbm9fc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gMDsKLSAgaW5jbHVkZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSBZWV9DVVJSRU5UX0JVRkZFUjsKLSAgaW5jbHVkZV9zdGFja19wdHIrKzsKLSAgdG1wID0geXlfY3JlYXRlX3N0cmluZ19idWZmZXIgKHN0cmluZywgc3RybGVuIChzdHJpbmcpKTsKLSAgeXlfc3dpdGNoX3RvX2J1ZmZlciAodG1wKTsKLSAgQkVHSU4gKFNDUklQVCk7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGZsZXggc3RhcnQgY29uZGl0aW9uLAotICAgc2F2aW5nIHRoZSBjdXJyZW50IHN0YXJ0IGNvbmRpdGlvbiBvbiBgc3RhdGVfc3RhY2snLiAgKi8KLQotc3RhdGljIGludCBzdGF0ZV9zdGFja1tNQVhfSU5DTFVERV9ERVBUSCAqIDJdOwotc3RhdGljIGludCAqc3RhdGVfc3RhY2tfcCA9IHN0YXRlX3N0YWNrOwotCi12b2lkCi1sZGxleF9zY3JpcHQgKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChTQ1JJUFQpOwotfQotCi12b2lkCi1sZGxleF9tcmlfc2NyaXB0ICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoTVJJKTsKLX0KLQotdm9pZAotbGRsZXhfdmVyc2lvbl9zY3JpcHQgKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChWRVJTX1NUQVJUKTsKLX0KLQotdm9pZAotbGRsZXhfdmVyc2lvbl9maWxlICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoVkVSU19TQ1JJUFQpOwotfQotCi12b2lkCi1sZGxleF9kZWZzeW0gKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChERUZTWU1FWFApOwotfQotCSAgIAotdm9pZAotbGRsZXhfZXhwcmVzc2lvbiAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKEVYUFJFU1NJT04pOwotfQotCi12b2lkCi1sZGxleF9ib3RoICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoQk9USCk7Ci19Ci0KLXZvaWQKLWxkbGV4X3BvcHN0YXRlICgpCi17Ci0gIHl5X3N0YXJ0ID0gKigtLXN0YXRlX3N0YWNrX3ApOwotfQotDAotCi0vKiBQbGFjZSB1cCB0byBNQVhfU0laRSBjaGFyYWN0ZXJzIGluIEJVRiBhbmQgcmV0dXJuIGluICpSRVNVTFQKLSAgIGVpdGhlciB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgMCB0byBpbmRpY2F0ZSBFT0YuICAqLwotCi1zdGF0aWMgdm9pZAoteXlfaW5wdXQgKGJ1ZiwgcmVzdWx0LCBtYXhfc2l6ZSkKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgKnJlc3VsdDsKLSAgICAgaW50IG1heF9zaXplOwotewotICAqcmVzdWx0ID0gMDsgCi0gIGlmICh5eV9jdXJyZW50X2J1ZmZlci0+eXlfaW5wdXRfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAoeXlpbikKLQl7Ci0JICAqcmVzdWx0ID0gcmVhZCAoZmlsZW5vICh5eWluKSwgKGNoYXIgKikgYnVmLCBtYXhfc2l6ZSk7Ci0JICBpZiAoKnJlc3VsdCA8IDApIAotCSAgICBlaW5mbyAoIiVGJVA6IHJlYWQgaW4gZmxleCBzY2FubmVyIGZhaWxlZFxuIik7Ci0JfQotICAgIH0KLX0KLQotLyogRWF0IHRoZSByZXN0IG9mIGEgQy1zdHlsZSBjb21tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWNvbW1lbnQgKCkKLXsKLSAgaW50IGM7Ci0KLSAgd2hpbGUgKDEpCi0gIHsKLSAgICBjID0gaW5wdXQoKTsKLSAgICB3aGlsZSAoYyAhPSAnKicgJiYgYyAhPSBFT0YpIAotICAgIHsKLSAgICAgIGlmIChjID09ICdcbicpCi0JbGluZW5vKys7Ci0gICAgICBjID0gaW5wdXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoYyA9PSAnKicpCi0gICAgewotICAgICAgYyA9IGlucHV0KCk7Ci0gICAgICB3aGlsZSAoYyA9PSAnKicpCi0gICAgICAgYyA9IGlucHV0KCk7Ci0gICAgICBpZiAoYyA9PSAnLycpCi0gICAgICAgYnJlYWs7CQkJLyogZm91bmQgdGhlIGVuZCAqLwotICAgIH0KLQotICAgIGlmIChjID09ICdcbicpCi0gICAgICBsaW5lbm8rKzsKLQotICAgIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBlaW5mbyggIiVGJVA6IEVPRiBpbiBjb21tZW50XG4iKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKiBXYXJuIHRoZSB1c2VyIGFib3V0IGEgZ2FyYmFnZSBjaGFyYWN0ZXIgV0hBVCBpbiB0aGUgaW5wdXQKLSAgIGluIGNvbnRleHQgV0hFUkUuICAqLwotCi1zdGF0aWMgdm9pZAotbGV4X3dhcm5faW52YWxpZCAod2hlcmUsIHdoYXQpCi0gICAgIGNoYXIgKndoZXJlLCAqd2hhdDsKLXsKLSAgY2hhciBidWZbNV07Ci0KLSAgLyogSWYgd2UgaGF2ZSBmb3VuZCBhbiBpbnB1dCBmaWxlIHdob3NlIGZvcm1hdCB3ZSBkbyBub3QgcmVjb2duaXplLAotICAgICBhbmQgd2UgYXJlIHRoZXJlZm9yZSB0cmVhdGluZyBpdCBhcyBhIGxpbmtlciBzY3JpcHQsIGFuZCB3ZSBmaW5kCi0gICAgIGFuIGludmFsaWQgY2hhcmFjdGVyLCB0aGVuIG1vc3QgbGlrZWx5IHRoaXMgaXMgYSByZWFsIG9iamVjdCBmaWxlCi0gICAgIG9mIHNvbWUgZGlmZmVyZW50IGZvcm1hdC4gIFRyZWF0IGl0IGFzIHN1Y2guICAqLwotICBpZiAobGRmaWxlX2Fzc3VtZWRfc2NyaXB0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkKTsKLSAgICAgIGVpbmZvICgiJUYlczogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIsIGxkZmlsZV9pbnB1dF9maWxlbmFtZSk7Ci0gICAgfQotCi0gIGlmICghIGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSAqd2hhdCkpCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgKndoYXQpOwotICAgICAgd2hhdCA9IGJ1ZjsKLSAgICB9Ci0KLSAgZWluZm8gKCIlUDolUzogaWdub3JpbmcgaW52YWxpZCBjaGFyYWN0ZXIgYCVzJyVzXG4iLCB3aGF0LCB3aGVyZSk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZG1haW4uYyBiL2xkL2xkbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWVmM2U1Li4wMDAwMDAwCi0tLSBhL2xkL2xkbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNCArMCwwIEBACi0vKiBNYWluIHByb2dyYW0gb2YgR05VIGxpbmtlci4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkd3JpdGUuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0KLS8qIFNvbWV3aGVyZSBhYm92ZSwgc3lzL3N0YXQuaCBnb3QgaW5jbHVkZWQgLiAuIC4gLiAqLwotI2lmICFkZWZpbmVkKFNfSVNESVIpICYmIGRlZmluZWQoU19JRkRJUikKLSNkZWZpbmUJU19JU0RJUihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBIQVZFX1NCUksKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLWV4dGVybiBQVFIgc2JyayAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICpnZXRfZW11bGF0aW9uIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgc2V0X3NjcmlwdHNfZGlyIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRVhQT1JUUyAqLwotCi1jaGFyICpkZWZhdWx0X3RhcmdldDsKLWNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZSA9ICJhLm91dCI7Ci0KLS8qIE5hbWUgdGhpcyBwcm9ncmFtIHdhcyBpbnZva2VkIGJ5LiAgKi8KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogVGhlIGZpbGUgdGhhdCB3ZSdyZSBjcmVhdGluZyAqLwotYmZkICpvdXRwdXRfYmZkID0gMDsKLQotLyogU2V0IGJ5IC1HIGFyZ3VtZW50LCBmb3IgTUlQUyBFQ09GRiB0YXJnZXQuICAqLwotaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKLQotLyogTm9uemVybyBtZWFucyBwcmludCBuYW1lcyBvZiBpbnB1dCBmaWxlcyBhcyBwcm9jZXNzZWQuICAqLwotYm9vbGVhbiB0cmFjZV9maWxlczsKLQotLyogTm9uemVybyBtZWFucyBzYW1lLCBidXQgbm90ZSBvcGVuIGZhaWx1cmVzLCB0b28uICAqLwotYm9vbGVhbiB0cmFjZV9maWxlX3RyaWVzOwotCi0vKiBOb256ZXJvIG1lYW5zIHZlcnNpb24gbnVtYmVyIHdhcyBwcmludGVkLCBzbyBleGl0IHN1Y2Nlc3NmdWxseQotICAgaW5zdGVhZCBvZiBjb21wbGFpbmluZyBpZiBubyBpbnB1dCBmaWxlcyBhcmUgZ2l2ZW4uICAqLwotYm9vbGVhbiB2ZXJzaW9uX3ByaW50ZWQ7Ci0KLS8qIE5vbnplcm8gbWVhbnMgbGluayBpbiBldmVyeSBtZW1iZXIgb2YgYW4gYXJjaGl2ZS4gICovCi1ib29sZWFuIHdob2xlX2FyY2hpdmU7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcy4gICovCi1ib29sZWFuIGRlbWFuZ2xpbmc7Ci0KLWFyZ3NfdHlwZSBjb21tYW5kX2xpbmU7Ci0KLWxkX2NvbmZpZ190eXBlIGNvbmZpZzsKLQotc3RhdGljIHZvaWQgcmVtb3ZlX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBjaGVja19mb3Jfc2NyaXB0c19kaXIgUEFSQU1TICgoY2hhciAqZGlyKSk7Ci1zdGF0aWMgYm9vbGVhbiBhZGRfYXJjaGl2ZV9lbGVtZW50IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCQkgICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtdWx0aXBsZV9kZWZpbml0aW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICBjb25zdCBjaGFyICosCi0JCQkJCSAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwKLQkJCQkJICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBtdWx0aXBsZV9jb21tb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJY29uc3QgY2hhciAqLCBiZmQgKiwKLQkJCQkJZW51bSBiZmRfbGlua19oYXNoX3R5cGUsIGJmZF92bWEsCi0JCQkJCWJmZCAqLCBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSwKLQkJCQkJYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gYWRkX3RvX3NldCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLAotCQkJCSAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb25zdHJ1Y3Rvcl9jYWxsYmFjayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgIGJvb2xlYW4gY29uc3RydWN0b3IsCi0JCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gd2FybmluZ19jYWxsYmFjayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJmZCAqLAotCQkJCQkgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIHZvaWQgd2FybmluZ19maW5kX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHVuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgYmZkICosCi0JCQkJCSBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiByZWxvY19vdmVyZmxvdyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwKLQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHJlbG9jX2Rhbmdlcm91cyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JCQkJCWJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiB1bmF0dGFjaGVkX3JlbG9jIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSBjb25zdCBjaGFyICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbm90aWNlIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyBsaW5rX2NhbGxiYWNrcyA9Ci17Ci0gIGFkZF9hcmNoaXZlX2VsZW1lbnQsCi0gIG11bHRpcGxlX2RlZmluaXRpb24sCi0gIG11bHRpcGxlX2NvbW1vbiwKLSAgYWRkX3RvX3NldCwKLSAgY29uc3RydWN0b3JfY2FsbGJhY2ssCi0gIHdhcm5pbmdfY2FsbGJhY2ssCi0gIHVuZGVmaW5lZF9zeW1ib2wsCi0gIHJlbG9jX292ZXJmbG93LAotICByZWxvY19kYW5nZXJvdXMsCi0gIHVuYXR0YWNoZWRfcmVsb2MsCi0gIG5vdGljZQotfTsKLQotc3RydWN0IGJmZF9saW5rX2luZm8gbGlua19pbmZvOwotDAotc3RhdGljIHZvaWQKLXJlbW92ZV9vdXRwdXQgKCkKLXsKLSAgaWYgKG91dHB1dF9maWxlbmFtZSkgCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgJiYgb3V0cHV0X2JmZC0+aW9zdHJlYW0pCi0JZmNsb3NlKChGSUxFICopKG91dHB1dF9iZmQtPmlvc3RyZWFtKSk7Ci0gICAgICBpZiAoZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmUpCi0JdW5saW5rIChvdXRwdXRfZmlsZW5hbWUpOwotICAgIH0KLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKmVtdWxhdGlvbjsKLSAgbG9uZyBzdGFydF90aW1lID0gZ2V0X3J1bl90aW1lICgpOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIGJmZF9pbml0ICgpOwotCi0gIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIHhhdGV4aXQgKHJlbW92ZV9vdXRwdXQpOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCBCRkQgdGFyZ2V0IGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHRhcmdldC4gIERvaW5nCi0gICAgIHRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQsCi0gICAgIGFuZCBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBCRkQgbGlicmFyeSB3aGljaCB3YXMgY29uZmlndXJlZCBmb3IKLSAgICAgYSBkaWZmZXJlbnQgdGFyZ2V0LiAgVGhlIG1hY3JvIFRBUkdFVCBpcyBkZWZpbmVkIGJ5IE1ha2VmaWxlLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9kZWZhdWx0X3RhcmdldCAoVEFSR0VUKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVglUDogY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlRVxuIiksIFRBUkdFVCk7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIEluaXRpYWxpemUgdGhlIGRhdGEgYWJvdXQgb3B0aW9ucy4gICovCi0gIHRyYWNlX2ZpbGVzID0gdHJhY2VfZmlsZV90cmllcyA9IHZlcnNpb25fcHJpbnRlZCA9IGZhbHNlOwotICB3aG9sZV9hcmNoaXZlID0gZmFsc2U7Ci0gIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSB0cnVlOwotICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gZmFsc2U7Ci0gIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IGZhbHNlOwotICBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgPSBOVUxMOwotICBjb21tYW5kX2xpbmUucnBhdGggPSBOVUxMOwotICBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCA9IHRydWU7Ci0gIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IHRydWU7Ci0KLSAgLyogV2UgaW5pdGlhbGl6ZSBERU1BTkdMSU5HIGJhc2VkIG9uIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgICBDT0xMRUNUX05PX0RFTUFOR0xFLiAgVGhlIGdjYyBjb2xsZWN0MiBwcm9ncmFtIHdpbGwgZGVtYW5nbGUgdGhlCi0gICAgIG91dHB1dCBvZiB0aGUgbGlua2VyLCB1bmxlc3MgQ09MTEVDVF9OT19ERU1BTkdMRSBpcyBzZXQgaW4gdGhlCi0gICAgIGVudmlyb25tZW50LiAgQWN0aW5nIHRoZSBzYW1lIHdheSBoZXJlIGxldHMgdXMgcHJvdmlkZSB0aGUgc2FtZQotICAgICBpbnRlcmZhY2UgYnkgZGVmYXVsdC4gICovCi0gIGRlbWFuZ2xpbmcgPSBnZXRlbnYgKCJDT0xMRUNUX05PX0RFTUFOR0xFIikgPT0gTlVMTDsKLQotICBsaW5rX2luZm8uY2FsbGJhY2tzID0gJmxpbmtfY2FsbGJhY2tzOwotICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zaGFyZWQgPSBmYWxzZTsKLSAgbGlua19pbmZvLnN5bWJvbGljID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IGZhbHNlOwotICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5vcHRpbWl6ZSA9IGZhbHNlOwotICBsaW5rX2luZm8ubm9fdW5kZWZpbmVkID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX25vbmU7Ci0gIGxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9ub25lOwotICBsaW5rX2luZm8ua2VlcF9tZW1vcnkgPSB0cnVlOwotICBsaW5rX2luZm8uaW5wdXRfYmZkcyA9IE5VTEw7Ci0gIGxpbmtfaW5mby5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiA9IE5VTEw7Ci0gIGxpbmtfaW5mby5oYXNoID0gTlVMTDsKLSAgbGlua19pbmZvLmtlZXBfaGFzaCA9IE5VTEw7Ci0gIGxpbmtfaW5mby5ub3RpY2VfYWxsID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9IE5VTEw7Ci0gIGxpbmtfaW5mby53cmFwX2hhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ubXBjODYwYzAgPSAwOwotICAvKiBTVlI0IGxpbmtlcnMgc2VlbSB0byBzZXQgRFRfSU5JVCBhbmQgRFRfRklOSSBiYXNlZCBvbiBtYWdpYyBfaW5pdAotICAgICBhbmQgX2Zpbmkgc3ltYm9scy4gIFdlIGFyZSBjb21wYXRpYmxlLiAgKi8KLSAgbGlua19pbmZvLmluaXRfZnVuY3Rpb24gPSAiX2luaXQiOwotICBsaW5rX2luZm8uZmluaV9mdW5jdGlvbiA9ICJfZmluaSI7Ci0KLSAgbGRmaWxlX2FkZF9hcmNoICgiIik7Ci0KLSAgY29uZmlnLm1ha2VfZXhlY3V0YWJsZSA9IHRydWU7Ci0gIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gdHJ1ZTsKLSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gdHJ1ZTsKLSAgY29uZmlnLm1ha2VfZXhlY3V0YWJsZSA9IHRydWU7Ci0KLSAgZW11bGF0aW9uID0gZ2V0X2VtdWxhdGlvbiAoYXJnYywgYXJndik7Ci0gIGxkZW11bF9jaG9vc2VfbW9kZSAoZW11bGF0aW9uKTsKLSAgZGVmYXVsdF90YXJnZXQgPSBsZGVtdWxfY2hvb3NlX3RhcmdldCAoKTsKLSAgbGFuZ19pbml0ICgpOwotICBsZGVtdWxfYmVmb3JlX3BhcnNlICgpOwotICBsYW5nX2hhc19pbnB1dF9maWxlID0gZmFsc2U7Ci0gIHBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpOwotCi0gIGxkZW11bF9zZXRfc3ltYm9scyAoKTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zKQotCWVpbmZvICgiJVAlRjogLS1nYy1zZWN0aW9ucyBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKTsKLSAgICAgIGlmIChsaW5rX2luZm8ubXBjODYwYzApCi0JZWluZm8gKF8oIiVQJUY6IC1yIGFuZCAtLW1wYzg2MGMwIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIikpOwotICAgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLnJlbGF4KQotCWVpbmZvIChfKCIlUCVGOiAtLXJlbGF4IGFuZCAtciBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKLSAgICAgIGlmIChsaW5rX2luZm8uc2hhcmVkKQotCWVpbmZvIChfKCIlUCVGOiAtciBhbmQgLXNoYXJlZCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKLSAgICB9Ci0KLSAgLyogVHJlYXQgbGQgLXIgLXMgYXMgbGQgLXIgLVMgLXggKGkuZS4sIHN0cmlwIGFsbCBsb2NhbCBzeW1ib2xzKS4gIEkKLSAgICAgZG9uJ3Qgc2VlIGhvdyBlbHNlIHRoaXMgY2FuIGJlIGhhbmRsZWQsIHNpbmNlIGluIHRoaXMgY2FzZSB3ZQotICAgICBtdXN0IHByZXNlcnZlIGFsbCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmIGxpbmtfaW5mby5zdHJpcCA9PSBzdHJpcF9hbGwpCi0gICAgewotICAgICAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfZGVidWdnZXI7Ci0gICAgICBpZiAobGlua19pbmZvLmRpc2NhcmQgPT0gZGlzY2FyZF9ub25lKQotCWxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9hbGw7Ci0gICAgfQotCi0gIC8qIFRoaXMgZXNzZW50aWFsbHkgYWRkcyBhbm90aGVyIC1MIGRpcmVjdG9yeSBzbyB0aGlzIG11c3QgYmUgZG9uZSBhZnRlcgotICAgICB0aGUgLUwncyBpbiBhcmd2IGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqLwotICBzZXRfc2NyaXB0c19kaXIgKCk7Ci0KLSAgaWYgKGhhZF9zY3JpcHQgPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogUmVhZCB0aGUgZW11bGF0aW9uJ3MgYXBwcm9wcmlhdGUgZGVmYXVsdCBzY3JpcHQuICAqLwotICAgICAgaW50IGlzZmlsZTsKLSAgICAgIGNoYXIgKnMgPSBsZGVtdWxfZ2V0X3NjcmlwdCAoJmlzZmlsZSk7Ci0KLSAgICAgIGlmIChpc2ZpbGUpCi0JbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAodHJhY2VfZmlsZV90cmllcykKLQkgICAgewotCSAgICAgIGluZm9fbXNnIChfKCJ1c2luZyBpbnRlcm5hbCBsaW5rZXIgc2NyaXB0OlxuIikpOwotCSAgICAgIGluZm9fbXNnICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCSAgICAgIGluZm9fbXNnIChzKTsKLQkgICAgICBpbmZvX21zZyAoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCSAgICB9Ci0JICBsZXhfc3RyaW5nID0gczsKLQkgIGxleF9yZWRpcmVjdCAocyk7Ci0JfQotICAgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2NyaXB0OwotICAgICAgeXlwYXJzZSAoKTsKLSAgICAgIGxleF9zdHJpbmcgPSBOVUxMOwotICAgIH0KLQotICBsYW5nX2ZpbmFsICgpOwotCi0gIGlmIChsYW5nX2hhc19pbnB1dF9maWxlID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICh2ZXJzaW9uX3ByaW50ZWQpCi0JeGV4aXQgKDApOwotICAgICAgZWluZm8gKF8oIiVQJUY6IG5vIGlucHV0IGZpbGVzXG4iKSk7Ci0gICAgfQotCi0gIGlmICh0cmFjZV9maWxlcykKLSAgICB7Ci0gICAgICBpbmZvX21zZyAoXygiJVA6IG1vZGUgJXNcbiIpLCBlbXVsYXRpb24pOwotICAgIH0KLQotICBsZGVtdWxfYWZ0ZXJfcGFyc2UgKCk7Ci0KLQotICBpZiAoY29uZmlnLm1hcF9maWxlbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChjb25maWcubWFwX2ZpbGVuYW1lLCAiLSIpID09IDApCi0JewotCSAgY29uZmlnLm1hcF9maWxlID0gc3Rkb3V0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjb25maWcubWFwX2ZpbGUgPSBmb3BlbiAoY29uZmlnLm1hcF9maWxlbmFtZSwgRk9QRU5fV1QpOwotCSAgaWYgKGNvbmZpZy5tYXBfZmlsZSA9PSAoRklMRSAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkgICAgICBlaW5mbyAoXygiJVAlRjogY2Fubm90IG9wZW4gbWFwIGZpbGUgJXM6ICVFXG4iKSwKLQkJICAgICBjb25maWcubWFwX2ZpbGVuYW1lKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICBsYW5nX3Byb2Nlc3MgKCk7Ci0KLSAgLyogUHJpbnQgZXJyb3IgbWVzc2FnZXMgZm9yIGFueSBtaXNzaW5nIHN5bWJvbHMsIGZvciBhbnkgd2FybmluZwotICAgICBzeW1ib2xzLCBhbmQgcG9zc2libHkgbXVsdGlwbGUgZGVmaW5pdGlvbnMgKi8KLQotCi0gIGlmIChjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgewotICAgICAgLyogTG9vayBmb3IgYSB0ZXh0IHNlY3Rpb24gYW5kIG1hcmsgdGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBpbiBpdCAqLwotICAgICAgYXNlY3Rpb24gKmZvdW5kID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIudGV4dCIpOwotCi0gICAgICBpZiAoZm91bmQgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgZm91bmQtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQl9Ci0gICAgfQotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIG91dHB1dF9iZmQtPmZsYWdzICY9IH5FWEVDX1A7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0KLSAgbGR3cml0ZSAoKTsKLQotICBpZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwpCi0gICAgbGFuZ19tYXAgKCk7Ci0gIGlmIChjb21tYW5kX2xpbmUuY3JlZikKLSAgICBvdXRwdXRfY3JlZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwgPyBjb25maWcubWFwX2ZpbGUgOiBzdGRvdXQpOwotICBpZiAobm9jcm9zc3JlZl9saXN0ICE9IE5VTEwpCi0gICAgY2hlY2tfbm9jcm9zc3JlZnMgKCk7Ci0KLSAgLyogRXZlbiBpZiB3ZSdyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgc29tZSBub24tZmF0YWwgZXJyb3JzIHNob3VsZAotICAgICBiZSByZXBvcnRlZCBpbiB0aGUgZXhpdCBzdGF0dXMuICAoV2hhdCBub24tZmF0YWwgZXJyb3JzLCBpZiBhbnksIGRvIHdlCi0gICAgIHdhbnQgdG8gaWdub3JlIGZvciByZWxvY2F0ZWFibGUgb3V0cHV0PykgICovCi0KLSAgaWYgKGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPT0gZmFsc2UgJiYgZm9yY2VfbWFrZV9leGVjdXRhYmxlID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICh0cmFjZV9maWxlcyA9PSB0cnVlKQotCXsKLQkgIGVpbmZvIChfKCIlUDogbGluayBlcnJvcnMgZm91bmQsIGRlbGV0aW5nIGV4ZWN1dGFibGUgYCVzJ1xuIiksCi0JCSBvdXRwdXRfZmlsZW5hbWUpOwotCX0KLQotICAgICAgLyogVGhlIGZpbGUgd2lsbCBiZSByZW1vdmVkIGJ5IHJlbW92ZV9vdXRwdXQuICAqLwotCi0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgYmZkX2Nsb3NlIChvdXRwdXRfYmZkKSkKLQllaW5mbyAoXygiJUYlQjogZmluYWwgY2xvc2UgZmFpbGVkOiAlRVxuIiksIG91dHB1dF9iZmQpOwotCi0gICAgICAvKiBJZiB0aGUgLS1mb3JjZS1leGUtc3VmZml4IGlzIGVuYWJsZWQsIGFuZCB3ZSdyZSBtYWtpbmcgYW4KLQkgZXhlY3V0YWJsZSBmaWxlIGFuZCBpdCBkb2Vzbid0IGVuZCBpbiAuZXhlLCBjb3B5IGl0IHRvIG9uZSB3aGljaCBkb2VzLiAqLwotCi0gICAgICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmIGNvbW1hbmRfbGluZS5mb3JjZV9leGVfc3VmZml4KQotCXsKLQkgIGludCBsZW4gPSBzdHJsZW4gKG91dHB1dF9maWxlbmFtZSk7Ci0JICBpZiAobGVuIDwgNCAKLQkgICAgICB8fCAoc3RyY2FzZWNtcCAob3V0cHV0X2ZpbGVuYW1lICsgbGVuIC0gNCwgIi5leGUiKSAhPSAwCi0JCSAgJiYgc3RyY2FzZWNtcCAob3V0cHV0X2ZpbGVuYW1lICsgbGVuIC0gNCwgIi5kbGwiKSAhPSAwKSkKLQkgICAgewotCSAgICAgIEZJTEUgKnNyYzsKLQkgICAgICBGSUxFICpkc3Q7Ci0JICAgICAgY29uc3QgaW50IGJzaXplID0gNDA5NjsKLQkgICAgICBjaGFyICpidWYgPSB4bWFsbG9jIChic2l6ZSk7Ci0JICAgICAgaW50IGw7Ci0JICAgICAgY2hhciAqZHN0X25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKLQkgICAgICBzdHJjcHkgKGRzdF9uYW1lLCBvdXRwdXRfZmlsZW5hbWUpOwotCSAgICAgIHN0cmNhdCAoZHN0X25hbWUsICIuZXhlIik7Ci0JICAgICAgc3JjID0gZm9wZW4gKG91dHB1dF9maWxlbmFtZSwgRk9QRU5fUkIpOwotCSAgICAgIGRzdCA9IGZvcGVuIChkc3RfbmFtZSwgRk9QRU5fV0IpOwotCi0JICAgICAgaWYgKCFzcmMpCi0JCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3Igc291cmNlIG9mIGNvcHkgYCVzJ1xuIiksIG91dHB1dF9maWxlbmFtZSk7Ci0JICAgICAgaWYgKCFkc3QpCi0JCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3IgZGVzdGluYXRpb24gb2YgY29weSBgJXMnXG4iKSwgZHN0X25hbWUpOwotCSAgICAgIHdoaWxlICgobCA9IGZyZWFkIChidWYsIDEsIGJzaXplLCBzcmMpKSA+IDApCi0JCXsKLQkJICBpbnQgZG9uZSA9IGZ3cml0ZSAoYnVmLCAxLCBsLCBkc3QpOwotCQkgIGlmIChkb25lICE9IGwpCi0JCSAgICB7Ci0JCSAgICAgIGVpbmZvIChfKCIlUDogRXJyb3Igd3JpdGluZyBmaWxlIGAlcydcbiIpLCBkc3RfbmFtZSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBmY2xvc2UgKHNyYyk7Ci0JICAgICAgaWYgKGZjbG9zZSAoZHN0KSA9PSBFT0YpCi0JCXsKLQkJICBlaW5mbyAoXygiJVA6IEVycm9yIGNsb3NpbmcgZmlsZSBgJXMnXG4iKSwgZHN0X25hbWUpOwotCQl9Ci0JICAgICAgZnJlZSAoZHN0X25hbWUpOwotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotICBpZiAoY29uZmlnLnN0YXRzKQotICAgIHsKLSNpZmRlZiBIQVZFX1NCUksKLSAgICAgIGNoYXIgKmxpbSA9IChjaGFyICopIHNicmsgKDApOwotI2VuZGlmCi0gICAgICBsb25nIHJ1bl90aW1lID0gZ2V0X3J1bl90aW1lICgpIC0gc3RhcnRfdGltZTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdG90YWwgdGltZSBpbiBsaW5rOiAlbGQuJTA2bGRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIHJ1bl90aW1lIC8gMTAwMDAwMCwgcnVuX3RpbWUgJSAxMDAwMDAwKTsKLSNpZmRlZiBIQVZFX1NCUksKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRhdGEgc2l6ZSAlbGRcbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgICAgIChsb25nKSAobGltIC0gKGNoYXIgKikgJmVudmlyb24pKTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBQcmV2ZW50IHJlbW92ZV9vdXRwdXQgZnJvbSBkb2luZyBhbnl0aGluZywgYWZ0ZXIgYSBzdWNjZXNzZnVsIGxpbmsuICAqLwotICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotCi0gIHhleGl0ICgwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gZmluZCBhbnkgZXhwbGljaXRseSBnaXZlbiBlbXVsYXRpb24gaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUKLSAgIHN0YXRlIHRoYXQncyBuZWVkZWQgYnkgdGhlIGxleCZ5YWNjIGFyZ3VtZW50IHBhcnNlciAocGFyc2VfYXJncykuICAqLwotCi1zdGF0aWMgY2hhciAqCi1nZXRfZW11bGF0aW9uIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKmVtdWxhdGlvbjsKLSAgaW50IGk7Ci0KLSAgZW11bGF0aW9uID0gZ2V0ZW52IChFTVVMQVRJT05fRU5WSVJPTik7Ci0gIGlmIChlbXVsYXRpb24gPT0gTlVMTCkKLSAgICBlbXVsYXRpb24gPSBERUZBVUxUX0VNVUxBVElPTjsKLQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGlmICghc3RybmNtcCAoYXJndltpXSwgIi1tIiwgMikpCi0JewotCSAgaWYgKGFyZ3ZbaV1bMl0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIC1tIEVNVUwgKi8KLQkgICAgICBpZiAoaSA8IGFyZ2MgLSAxKQotCQl7Ci0JCSAgZW11bGF0aW9uID0gYXJndltpICsgMV07Ci0JCSAgaSsrOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZWluZm8oXygiJVAlRjogbWlzc2luZyBhcmd1bWVudCB0byAtbVxuIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1taXBzMSIpID09IDAKLQkJICAgfHwgc3RyY21wIChhcmd2W2ldLCAiLW1pcHMyIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczMiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAoYXJndltpXSwgIi1taXBzNCIpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogVGhlIGFyZ3VtZW50cyAtbWlwczEsIC1taXBzMiBhbmQgLW1pcHMzIGFyZQotCQkgcGFzc2VkIHRvIHRoZSBsaW5rZXIgYnkgc29tZSBNSVBTIGNvbXBpbGVycy4gIFRoZXkKLQkJIGdlbmVyYWxseSB0ZWxsIHRoZSBsaW5rZXIgdG8gdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50Ci0JCSBsaWJyYXJ5IHBhdGguICBQZXJoYXBzIHNvbWVkYXkgdGhlc2Ugc2hvdWxkIGJlCi0JCSBpbXBsZW1lbnRlZCBhcyBlbXVsYXRpb25zOyB1bnRpbCB0aGVuLCB3ZSBqdXN0IGlnbm9yZQotCQkgdGhlIGFyZ3VtZW50cyBhbmQgaG9wZSB0aGF0IG5vYm9keSBldmVyIGNyZWF0ZXMKLQkJIGVtdWxhdGlvbnMgbmFtZWQgaXBzMSwgaXBzMiBvciBpcHMzLiAgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChhcmd2W2ldLCAiLW00ODYiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFRoZSBhcmd1bWVudCAtbTQ4NiBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlciBvbgotCQkgc29tZSBMaW51eCBzeXN0ZW1zLiAgSG9wZSB0aGF0IG5vYm9keSBjcmVhdGVzIGFuCi0JCSBlbXVsYXRpb24gbmFtZWQgNDg2LiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogLW1FTVVMICovCi0JICAgICAgZW11bGF0aW9uID0gJmFyZ3ZbaV1bMl07Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBlbXVsYXRpb247Ci19Ci0KLS8qIElmIGRpcmVjdG9yeSBESVIgY29udGFpbnMgYW4gImxkc2NyaXB0cyIgc3ViZGlyZWN0b3J5LAotICAgYWRkIERJUiB0byB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCBhbmQgcmV0dXJuIHRydWUsCi0gICBlbHNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jaGVja19mb3Jfc2NyaXB0c19kaXIgKGRpcikKLSAgICAgY2hhciAqZGlyOwotewotICBzaXplX3QgZGlybGVuOwotICBjaGFyICpidWY7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGJvb2xlYW4gcmVzOwotCi0gIGRpcmxlbiA9IHN0cmxlbiAoZGlyKTsKLSAgLyogc2l6ZW9mIGNvdW50cyB0aGUgdGVybWluYXRpbmcgTlVMLiAgKi8KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoZGlybGVuICsgc2l6ZW9mKCIvbGRzY3JpcHRzIikpOwotICBzcHJpbnRmIChidWYsICIlcy9sZHNjcmlwdHMiLCBkaXIpOwotCi0gIHJlcyA9IHN0YXQgKGJ1ZiwgJnMpID09IDAgJiYgU19JU0RJUiAocy5zdF9tb2RlKTsKLSAgZnJlZSAoYnVmKTsKLSAgaWYgKHJlcykKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoZGlyLCBmYWxzZSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIFNldCB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgZm9yIGZpbmRpbmcgc2NyaXB0IGZpbGVzLgotICAgTGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGhlcmUgdG9vLCBidXQgdGhhdCdzIG9rLgotICAgV2UgbG9vayBmb3IgdGhlICJsZHNjcmlwdHMiIGRpcmVjdG9yeSBpbjoKLQotICAgU0NSSVBURElSIChwYXNzZWQgZnJvbSBNYWtlZmlsZSkKLSAgIHRoZSBkaXIgd2hlcmUgdGhpcyBwcm9ncmFtIGlzIChmb3IgdXNpbmcgaXQgZnJvbSB0aGUgYnVpbGQgdHJlZSkKLSAgIHRoZSBkaXIgd2hlcmUgdGhpcyBwcm9ncmFtIGlzLy4uL2xpYiAoZm9yIGluc3RhbGxpbmcgdGhlIHRvb2wgc3VpdGUgZWxzZXdoZXJlKSAqLwotCi1zdGF0aWMgdm9pZAotc2V0X3NjcmlwdHNfZGlyICgpCi17Ci0gIGNoYXIgKmVuZCwgKmRpcjsKLSAgc2l6ZV90IGRpcmxlbjsKLQotICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChTQ1JJUFRESVIpKQotICAgIHJldHVybjsJCQkvKiBXZSd2ZSBiZWVuIGluc3RhbGxlZCBub3JtYWxseS4gICovCi0KLSAgLyogTG9vayBmb3IgImxkc2NyaXB0cyIgaW4gdGhlIGRpciB3aGVyZSBvdXIgYmluYXJ5IGlzLiAgKi8KLSAgZW5kID0gc3RycmNociAocHJvZ3JhbV9uYW1lLCAnLycpOwotCi0gIGlmIChlbmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBsb29rIGZvciBsZHNjcmlwdHMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgVGhlcmUgaXMKLSAgICAgICAgIHRvbyBtdWNoIHBvdGVudGlhbCBmb3IgY29uZnVzaW9uLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGlybGVuID0gZW5kIC0gcHJvZ3JhbV9uYW1lOwotICAvKiBNYWtlIGEgY29weSBvZiBwcm9ncmFtX25hbWUgaW4gZGlyLgotICAgICBMZWF2ZSByb29tIGZvciBsYXRlciAiLy4uL2xpYiIuICAqLwotICBkaXIgPSAoY2hhciAqKSB4bWFsbG9jIChkaXJsZW4gKyA4KTsKLSAgc3RybmNweSAoZGlyLCBwcm9ncmFtX25hbWUsIGRpcmxlbik7Ci0gIGRpcltkaXJsZW5dID0gJ1wwJzsKLQotICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpKQotICAgIHJldHVybjsJCQkvKiBEb24ndCBmcmVlIGRpci4gICovCi0KLSAgLyogTG9vayBmb3IgImxkc2NyaXB0cyIgaW4gPHRoZSBkaXIgd2hlcmUgb3VyIGJpbmFyeSBpcz4vLi4vbGliLiAgKi8KLSAgc3RyY3B5IChkaXIgKyBkaXJsZW4sICIvLi4vbGliIik7Ci0gIGlmIChjaGVja19mb3Jfc2NyaXB0c19kaXIgKGRpcikpCi0gICAgcmV0dXJuOwotCi0gIGZyZWUgKGRpcik7CQkJLyogV2VsbCwgd2UgdHJpZWQuICAqLwotfQotCi12b2lkCi1hZGRfeXN5bSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9PSAoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgewotICAgICAgbGlua19pbmZvLm5vdGljZV9oYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAobGlua19pbmZvLm5vdGljZV9oYXNoLAotCQkJCSAgIGJmZF9oYXNoX25ld2Z1bmMsCi0JCQkJICAgNjEpKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKLSAgICB9ICAgICAgCi0KLSAgaWYgKGJmZF9oYXNoX2xvb2t1cCAobGlua19pbmZvLm5vdGljZV9oYXNoLCBuYW1lLCB0cnVlLCB0cnVlKQotICAgICAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotfQotCi0vKiBSZWNvcmQgYSBzeW1ib2wgdG8gYmUgd3JhcHBlZCwgZnJvbSB0aGUgLS13cmFwIG9wdGlvbi4gICovCi0KLXZvaWQKLWFkZF93cmFwIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobGlua19pbmZvLndyYXBfaGFzaCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmtfaW5mby53cmFwX2hhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAobGlua19pbmZvLndyYXBfaGFzaCwKLQkJCQkgICBiZmRfaGFzaF9uZXdmdW5jLAotCQkJCSAgIDYxKSkKLQllaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotICBpZiAoYmZkX2hhc2hfbG9va3VwIChsaW5rX2luZm8ud3JhcF9oYXNoLCBuYW1lLCB0cnVlLCB0cnVlKSA9PSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotfQotCi0vKiBIYW5kbGUgdGhlIC1yZXRhaW4tc3ltYm9scy1maWxlIG9wdGlvbi4gICovCi0KLXZvaWQKLWFkZF9rZWVwc3ltc19maWxlIChmaWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmZpbGU7Ci0gIGNoYXIgKmJ1ZjsKLSAgc2l6ZV90IGJ1ZnNpemU7Ci0gIGludCBjOwotCi0gIGlmIChsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfc29tZSkKLSAgICBlaW5mbyAoXygiJVglUDogZXJyb3I6IGR1cGxpY2F0ZSByZXRhaW4tc3ltYm9scy1maWxlXG4iKSk7Ci0KLSAgZmlsZSA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLSAgaWYgKGZpbGUgPT0gKEZJTEUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZWluZm8gKCIlWCVQOiAlczogJUVcbiIsIGZpbGVuYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGlua19pbmZvLmtlZXBfaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKGxpbmtfaW5mby5rZWVwX2hhc2gsIGJmZF9oYXNoX25ld2Z1bmMpKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKLQotICBidWZzaXplID0gMTAwOwotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChidWZzaXplKTsKLQotICBjID0gZ2V0YyAoZmlsZSk7Ci0gIHdoaWxlIChjICE9IEVPRikKLSAgICB7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoYykpCi0JYyA9IGdldGMgKGZpbGUpOwotCi0gICAgICBpZiAoYyAhPSBFT0YpCi0JewotCSAgc2l6ZV90IGxlbiA9IDA7Ci0KLQkgIHdoaWxlICghIGlzc3BhY2UgKGMpICYmIGMgIT0gRU9GKQotCSAgICB7Ci0JICAgICAgYnVmW2xlbl0gPSBjOwotCSAgICAgICsrbGVuOwotCSAgICAgIGlmIChsZW4gPj0gYnVmc2l6ZSkKLQkJewotCQkgIGJ1ZnNpemUgKj0gMjsKLQkJICBidWYgPSB4cmVhbGxvYyAoYnVmLCBidWZzaXplKTsKLQkJfQotCSAgICAgIGMgPSBnZXRjIChmaWxlKTsKLQkgICAgfQotCi0JICBidWZbbGVuXSA9ICdcMCc7Ci0KLQkgIGlmIChiZmRfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5rZWVwX2hhc2gsIGJ1ZiwgdHJ1ZSwgdHJ1ZSkKLQkgICAgICA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZm9yIGluc2VydGlvbiBmYWlsZWQ6ICVFXG4iKSk7Ci0JfQotICAgIH0KLQotICBpZiAobGlua19pbmZvLnN0cmlwICE9IHN0cmlwX25vbmUpCi0gICAgZWluZm8gKF8oIiVQOiBgLXJldGFpbi1zeW1ib2xzLWZpbGUnIG92ZXJyaWRlcyBgLXMnIGFuZCBgLVMnXG4iKSk7Ci0KLSAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfc29tZTsKLX0KLQwKLS8qIENhbGxiYWNrcyBmcm9tIHRoZSBCRkQgbGlua2VyIHJvdXRpbmVzLiAgKi8KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRlY2lkZWQgdG8gaW5jbHVkZSBhbiBhcmNoaXZlIG1lbWJlciBpbgotICAgYSBsaW5rLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotYWRkX2FyY2hpdmVfZWxlbWVudCAoaW5mbywgYWJmZCwgbmFtZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wdXQ7Ci0KLSAgaW5wdXQgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKLQkgICB4bWFsbG9jIChzaXplb2YgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpKSk7Ci0gIGlucHV0LT5maWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOwotICBpbnB1dC0+bG9jYWxfc3ltX25hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgaW5wdXQtPnRoZV9iZmQgPSBhYmZkOwotICBpbnB1dC0+YXN5bWJvbHMgPSBOVUxMOwotICBpbnB1dC0+bmV4dCA9IE5VTEw7Ci0gIGlucHV0LT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICBpbnB1dC0+bG9hZGVkID0gZmFsc2U7Ci0gIGlucHV0LT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0KLSAgLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3Qgc2V0OiBoZWFkZXIubmV4dCwKLSAgICAgaGVhZGVyLnR5cGUsIGNsb3NlZCwgcGFzc2l2ZV9wb3NpdGlvbiwgc3ltYm9sX2NvdW50LAotICAgICBuZXh0X3JlYWxfZmlsZSwgaXNfYXJjaGl2ZSwgdGFyZ2V0LCByZWFsLiAgVGhpcyBiaXQgb2YgY29kZSBpcwotICAgICBmcm9tIHRoZSBvbGQgZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSBmdW5jdGlvbi4gIEkgZG9uJ3Qga25vdwotICAgICB3aGV0aGVyIGFueSBvZiB0aG9zZSBmaWVsZHMgbWF0dGVycy4gICovCi0KLSAgbGRsYW5nX2FkZF9maWxlIChpbnB1dCk7Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSAoRklMRSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmQgKmZyb207Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCWZyb20gPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoaC0+dHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGZyb20gPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICBmcm9tID0gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkgICAgICBmcm9tID0gaC0+dS51bmRlZi5hYmZkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgZnJvbSA9IGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JewotCSAgY2hhciBidWZbMTAwXTsKLQotCSAgc3ByaW50ZiAoYnVmLCAiJS0yOXMgJXNcblxuIiwgXygiQXJjaGl2ZSBtZW1iZXIgaW5jbHVkZWQiKSwKLQkJICAgXygiYmVjYXVzZSBvZiBmaWxlIChzeW1ib2wpIikpOwotCSAgbWluZm8gKCIlcyIsIGJ1Zik7Ci0JICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpID09IE5VTEwpCi0JewotCSAgbWluZm8gKCIlcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGxlbiA9IHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW5mbyAoIiVzKCVzKSIsIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBsZW4gPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKQotCQkgKyBzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCQkgKyAyKTsKLQl9Ci0KLSAgICAgIGlmIChsZW4gPj0gMjkpCi0JewotCSAgcHJpbnRfbmwgKCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIHdoaWxlIChsZW4gPCAzMCkKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgaWYgKGZyb20gIT0gTlVMTCkKLQltaW5mbyAoIiVCICIsIGZyb20pOwotICAgICAgaWYgKGggIT0gTlVMTCkKLQltaW5mbyAoIiglVClcbiIsIGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIGVsc2UKLQltaW5mbyAoIiglcylcbiIsIG5hbWUpOwotICAgIH0KLQotICBpZiAodHJhY2VfZmlsZXMgfHwgdHJhY2VfZmlsZV90cmllcykKLSAgICBpbmZvX21zZyAoIiVJXG4iLCBpbnB1dCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkaXNjb3ZlcmVkIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQKLSAgIG11bHRpcGxlIHRpbWVzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbXVsdGlwbGVfZGVmaW5pdGlvbiAoaW5mbywgbmFtZSwgb2JmZCwgb3NlYywgb3ZhbCwgbmJmZCwgbnNlYywgbnZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci0gICAgIGJmZF92bWEgb3ZhbDsKLSAgICAgYmZkICpuYmZkOwotICAgICBhc2VjdGlvbiAqbnNlYzsKLSAgICAgYmZkX3ZtYSBudmFsOwotewotICAvKiBJZiBlaXRoZXIgc2VjdGlvbiBoYXMgdGhlIG91dHB1dF9zZWN0aW9uIGZpZWxkIHNldCB0bwotICAgICBiZmRfYWJzX3NlY3Rpb25fcHRyLCBpdCBtZWFucyB0aGF0IHRoZSBzZWN0aW9uIGlzIGJlaW5nCi0gICAgIGRpc2NhcmRlZCwgYW5kIHRoaXMgaXMgbm90IHJlYWxseSBhIG11bHRpcGxlIGRlZmluaXRpb24gYXQgYWxsLgotICAgICBGSVhNRTogSXQgd291bGQgYmUgY2xlYW5lciB0byBzb21laG93IGlnbm9yZSBzeW1ib2xzIGRlZmluZWQgaW4KLSAgICAgc2VjdGlvbnMgd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4gICovCi0gIGlmICgob3NlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChvc2VjKQotICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAob3NlYy0+b3V0cHV0X3NlY3Rpb24pKQotICAgICAgfHwgKG5zZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChuc2VjKQotCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChuc2VjLT5vdXRwdXRfc2VjdGlvbikpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVpbmZvIChfKCIlWCVDOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGAlVCdcbiIpLAotCSBuYmZkLCBuc2VjLCBudmFsLCBuYW1lKTsKLSAgaWYgKG9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlRDogZmlyc3QgZGVmaW5lZCBoZXJlXG4iKSwgb2JmZCwgb3NlYywgb3ZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wsIG9yCi0gICB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBmb3VuZCBmb3IgYSBzeW1ib2wgdGhhdCBpcyBhbHJlYWR5IGRlZmluZWQsCi0gICBvciB3aGVuIHR3byBjb21tb24gc3ltYm9scyBhcmUgZm91bmQuICBXZSBvbmx5IGRvIHNvbWV0aGluZyBpZgotICAgLXdhcm4tY29tbW9uIHdhcyB1c2VkLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbXVsdGlwbGVfY29tbW9uIChpbmZvLCBuYW1lLCBvYmZkLCBvdHlwZSwgb3NpemUsIG5iZmQsIG50eXBlLCBuc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb3R5cGU7Ci0gICAgIGJmZF92bWEgb3NpemU7Ci0gICAgIGJmZCAqbmJmZDsKLSAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgbnR5cGU7Ci0gICAgIGJmZF92bWEgbnNpemU7Ci17Ci0gIGlmICghIGNvbmZpZy53YXJuX2NvbW1vbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAobnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICB8fCBudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgIHx8IG50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgewotICAgICAgQVNTRVJUIChvdHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0gICAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGRlZmluaXRpb24gb2YgYCVUJyBvdmVycmlkaW5nIGNvbW1vblxuIiksCi0JICAgICBuYmZkLCBuYW1lKTsKLSAgICAgIGlmIChvYmZkICE9IE5VTEwpCi0JZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOwotICAgIH0KLSAgZWxzZSBpZiAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgb3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICAgfHwgb3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICB7Ci0gICAgICBBU1NFUlQgKG50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLSAgICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBkZWZpbml0aW9uXG4iKSwKLQkgICAgIG5iZmQsIG5hbWUpOwotICAgICAgaWYgKG9iZmQgIT0gTlVMTCkKLQllaW5mbyAoXygiJUI6IHdhcm5pbmc6IGRlZmluZWQgaGVyZVxuIiksIG9iZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEFTU0VSVCAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24gJiYgbnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotICAgICAgaWYgKG9zaXplID4gbnNpemUpCi0JewotCSAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkZGVuIGJ5IGxhcmdlciBjb21tb25cbiIpLAotCQkgbmJmZCwgbmFtZSk7Ci0JICBpZiAob2JmZCAhPSBOVUxMKQotCSAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGxhcmdlciBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG5zaXplID4gb3NpemUpCi0JewotCSAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uXG4iKSwKLQkJIG5iZmQsIG5hbWUpOwotCSAgaWYgKG9iZmQgIT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBzbWFsbGVyIGNvbW1vbiBpcyBoZXJlXG4iKSwgb2JmZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVpbmZvIChfKCIlQjogd2FybmluZzogbXVsdGlwbGUgY29tbW9uIG9mIGAlVCdcbiIpLCBuYmZkLCBuYW1lKTsKLQkgIGlmIChvYmZkICE9IE5VTEwpCi0JICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIEJGRCBoYXMgZGlzY292ZXJlZCBhIHNldCBlbGVtZW50LiAgSCBpcyB0aGUKLSAgIGVudHJ5IGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBmb3IgdGhlIHNldC4gIFNFQ1RJT04gYW5kIFZBTFVFCi0gICByZXByZXNlbnQgYSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNldC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWFkZF90b19zZXQgKGluZm8sIGgsIHJlbG9jLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmIChjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMpCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBnbG9iYWwgY29uc3RydWN0b3IgJXMgdXNlZFxuIiksCi0JICAgaC0+cm9vdC5zdHJpbmcpOwotCi0gIGlmICghIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIHJlbG9jLCAoY29uc3QgY2hhciAqKSBOVUxMLCBzZWN0aW9uLCB2YWx1ZSk7Ci0KLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgewotICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLSAgICAgIC8qIFdlIGRvbid0IGNhbGwgYmZkX2xpbmtfYWRkX3VuZGVmIHRvIGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mCi0JIHVuZGVmaW5lZCBzeW1ib2xzIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGRlZmluZSBpdAotCSBvdXJzZWx2ZXMuICAqLwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRpc2NvdmVyZWQgYSBjb25zdHJ1Y3Rvci4gIFRoaXMgaXMgb25seQotICAgY2FsbGVkIGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMtLXRob3NlIHdoaWNoIGRvIG5vdCBoYW5kbGUKLSAgIGNvbnN0cnVjdG9ycyBpbiBzb21lIG1vcmUgY2xldmVyIGZhc2hpb24uICBUaGlzIGlzIHNpbWlsYXIgdG8KLSAgIGFkZGluZyBhbiBlbGVtZW50IHRvIGEgc2V0LCBidXQgbGVzcyBnZW5lcmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvbnN0cnVjdG9yX2NhbGxiYWNrIChpbmZvLCBjb25zdHJ1Y3RvciwgbmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIGNvbnN0cnVjdG9yOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBjaGFyICpzOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgY2hhciBzZXRfbmFtZVsxICsgc2l6ZW9mICJfX0NUT1JfTElTVF9fIl07Ci0KLSAgaWYgKGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycykKLSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGdsb2JhbCBjb25zdHJ1Y3RvciAlcyB1c2VkXG4iKSwgbmFtZSk7Ci0KLSAgaWYgKCEgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBFbnN1cmUgdGhhdCBCRkRfUkVMT0NfQ1RPUiBleGlzdHMgbm93LCBzbyB0aGF0IHdlIGNhbiBnaXZlIGEKLSAgICAgdXNlZnVsIGVycm9yIG1lc3NhZ2UuICAqLwotICBpZiAoYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBCRkRfUkVMT0NfQ1RPUikgPT0gTlVMTAotICAgICAgJiYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkgIHx8IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX0NUT1IpID09IE5VTEwpKQotICAgIGVpbmZvIChfKCIlUCVGOiBCRkQgYmFja2VuZCBlcnJvcjogQkZEX1JFTE9DX0NUT1IgdW5zdXBwb3J0ZWRcbiIpKTsKLQotICBzID0gc2V0X25hbWU7Ci0gIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpICE9ICdcMCcpCi0gICAgKnMrKyA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0gIGlmIChjb25zdHJ1Y3RvcikKLSAgICBzdHJjcHkgKHMsICJfX0NUT1JfTElTVF9fIik7Ci0gIGVsc2UKLSAgICBzdHJjcHkgKHMsICJfX0RUT1JfTElTVF9fIik7Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBzZXRfbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIHsKLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0gICAgICAvKiBXZSBkb24ndCBjYWxsIGJmZF9saW5rX2FkZF91bmRlZiB0byBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZgotCSB1bmRlZmluZWQgc3ltYm9scyBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZWZpbmUgaXQKLQkgb3Vyc2VsdmVzLiAgKi8KLSAgICB9Ci0KLSAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIEJGRF9SRUxPQ19DVE9SLCBuYW1lLCBzZWN0aW9uLCB2YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIHN0cnVjdHVyZSB1c2VkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdoCi0gICBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvCi17Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKndhcm5pbmc7Ci0gIGNvbnN0IGNoYXIgKnN5bWJvbDsKLSAgYXN5bWJvbCAqKmFzeW1ib2xzOwotfTsKLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotd2FybmluZ19jYWxsYmFjayAoaW5mbywgd2FybmluZywgc3ltYm9sLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqd2FybmluZzsKLSAgICAgY29uc3QgY2hhciAqc3ltYm9sOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIC8qIFRoaXMgaXMgYSBoYWNrIHRvIHN1cHBvcnQgd2Fybl9tdWx0aXBsZV9ncC4gIEZJWE1FOiBUaGlzIHNob3VsZAotICAgICBoYXZlIGEgY2xlYW5lciBpbnRlcmZhY2UsIGJ1dCB3aGF0PyAgKi8KLSAgaWYgKCEgY29uZmlnLndhcm5fbXVsdGlwbGVfZ3AKLSAgICAgICYmIHN0cmNtcCAod2FybmluZywgInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICBlaW5mbyAoIiVDOiAlc1xuIiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgd2FybmluZyk7Ci0gIGVsc2UgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICBlaW5mbyAoIiVQOiAlc1xuIiwgd2FybmluZyk7Ci0gIGVsc2UgaWYgKHN5bWJvbCA9PSBOVUxMKQotICAgIGVpbmZvICgiJUI6ICVzXG4iLCBhYmZkLCB3YXJuaW5nKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotICAgICAgYXN5bWJvbCAqKmFzeW1ib2xzOwotICAgICAgc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyBpbmZvOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyB0byBzZWUgaWYgd2UgY2FuIGZpbmQgYSBwbGF1c2libGUKLQkgYWRkcmVzcy4gICovCi0KLSAgICAgIGVudHJ5ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgYWJmZC0+dXNyZGF0YTsKLSAgICAgIGlmIChlbnRyeSAhPSBOVUxMICYmIGVudHJ5LT5hc3ltYm9scyAhPSBOVUxMKQotCWFzeW1ib2xzID0gZW50cnktPmFzeW1ib2xzOwotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQkgIGxvbmcgc3ltYm9sX2NvdW50OwotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotCSAgaWYgKHN5bXNpemUgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKLQkgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKLQkgIGlmIChzeW1ib2xfY291bnQgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKLQkgIGlmIChlbnRyeSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZW50cnktPmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0JICAgICAgZW50cnktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgaW5mby5mb3VuZCA9IGZhbHNlOwotICAgICAgaW5mby53YXJuaW5nID0gd2FybmluZzsKLSAgICAgIGluZm8uc3ltYm9sID0gc3ltYm9sOwotICAgICAgaW5mby5hc3ltYm9scyA9IGFzeW1ib2xzOwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCB3YXJuaW5nX2ZpbmRfcmVsb2MsIChQVFIpICZpbmZvKTsKLQotICAgICAgaWYgKCEgaW5mby5mb3VuZCkKLQllaW5mbyAoIiVCOiAlc1xuIiwgYWJmZCwgd2FybmluZyk7Ci0KLSAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQotCWZyZWUgKGFzeW1ib2xzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgZm9yIGVhY2ggc2VjdGlvbi4gIEl0IGNoZWNrcyB0aGUKLSAgIHJlbG9jcyBvZiB0aGUgc2VjdGlvbiB0byBzZWUgaWYgaXQgY2FuIGZpbmQgYSByZWZlcmVuY2UgdG8gdGhlCi0gICBzeW1ib2wgd2hpY2ggdHJpZ2dlcmVkIHRoZSB3YXJuaW5nLiAgSWYgaXQgY2FuLCBpdCB1c2VzIHRoZSByZWxvYwotICAgdG8gZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIHdpdGggYSBmaWxlIGFuZCBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi13YXJuaW5nX2ZpbmRfcmVsb2MgKGFiZmQsIHNlYywgaWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgaWFyZzsKLXsKLSAgc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyAqaW5mbyA9IChzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvICopIGlhcmc7Ci0gIGxvbmcgcmVsc2l6ZTsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotICBhcmVsZW50ICoqcCwgKipwZW5kOwotCi0gIGlmIChpbmZvLT5mb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOwotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbHBwLCBpbmZvLT5hc3ltYm9scyk7Ci0gIGlmIChyZWxjb3VudCA8IDApCi0gICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKLQotICBwID0gcmVscHA7Ci0gIHBlbmQgPSBwICsgcmVsY291bnQ7Ci0gIGZvciAoOyBwIDwgcGVuZCAmJiAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcSA9ICpwOwotCi0gICAgICBpZiAocS0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCSAgJiYgKnEtPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKSwgaW5mby0+c3ltYm9sKSA9PSAwKQotCXsKLQkgIC8qIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLQkgIGVpbmZvICgiJUM6ICVzXG4iLCBhYmZkLCBzZWMsIHEtPmFkZHJlc3MsIGluZm8tPndhcm5pbmcpOwotCSAgaW5mby0+Zm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmcmVlIChyZWxwcCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyBmb3VuZC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXVuZGVmaW5lZF9zeW1ib2wgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIHN0YXRpYyBjaGFyICplcnJvcl9uYW1lOwotICBzdGF0aWMgdW5zaWduZWQgaW50IGVycm9yX2NvdW50OwotCi0jZGVmaW5lIE1BWF9FUlJPUlNfSU5fQV9ST1cgNQotCi0gIGlmIChjb25maWcud2Fybl9vbmNlKQotICAgIHsKLSAgICAgIHN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmhhc2g7Ci0KLSAgICAgIC8qIE9ubHkgd2FybiBvbmNlIGFib3V0IGEgcGFydGljdWxhciB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQotICAgICAgaWYgKGhhc2ggPT0gTlVMTCkKLQl7Ci0JICBoYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLQkgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKGhhc2gsIGJmZF9oYXNoX25ld2Z1bmMpKQotCSAgICBlaW5mbyAoXygiJUYlUDogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0JfQotCi0gICAgICBpZiAoYmZkX2hhc2hfbG9va3VwIChoYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGhhc2gsIG5hbWUsIHRydWUsIHRydWUpID09IE5VTEwpCi0JZWluZm8gKF8oIiVGJVA6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotCi0gIC8qIFdlIG5ldmVyIHByaW50IG1vcmUgdGhhbiBhIHJlYXNvbmFibGUgbnVtYmVyIG9mIGVycm9ycyBpbiBhIHJvdwotICAgICBmb3IgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLSAgaWYgKGVycm9yX25hbWUgIT0gKGNoYXIgKikgTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBlcnJvcl9uYW1lKSA9PSAwKQotICAgICsrZXJyb3JfY291bnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvcl9jb3VudCA9IDA7Ci0gICAgICBpZiAoZXJyb3JfbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotCWZyZWUgKGVycm9yX25hbWUpOwotICAgICAgZXJyb3JfbmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGVycm9yX2NvdW50IDwgTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJVglQzogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iKSwKLQkgICAgICAgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgbmFtZSk7Ci0gICAgICBlbHNlIGlmIChlcnJvcl9jb3VudCA9PSBNQVhfRVJST1JTX0lOX0FfUk9XKQotCWVpbmZvIChfKCIlRDogbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBgJVQnIGZvbGxvd1xuIiksCi0JICAgICAgIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MsIG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChlcnJvcl9jb3VudCA8IE1BWF9FUlJPUlNfSU5fQV9ST1cpCi0JZWluZm8gKF8oIiVYJUI6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIiksCi0JICAgICAgIGFiZmQsIG5hbWUpOwotICAgICAgZWxzZSBpZiAoZXJyb3JfY291bnQgPT0gTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJUI6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIpLAotCSAgICAgICBhYmZkLCBuYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBvdmVyZmxvd3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1yZWxvY19vdmVyZmxvdyAoaW5mbywgbmFtZSwgcmVsb2NfbmFtZSwgYWRkZW5kLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcmVsb2NfbmFtZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgaWYgKGFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVYOiBnZW5lcmF0ZWQiKSk7Ci0gIGVsc2UKLSAgICBlaW5mbyAoIiVYJUM6IiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcyk7Ci0gIGVpbmZvIChfKCIgcmVsb2NhdGlvbiB0cnVuY2F0ZWQgdG8gZml0OiAlcyAlVCIpLCByZWxvY19uYW1lLCBuYW1lKTsKLSAgaWYgKGFkZGVuZCAhPSAwKQotICAgIGVpbmZvICgiKyV2IiwgYWRkZW5kKTsKLSAgZWluZm8gKCJcbiIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGRhbmdlcm91cyByZWxvY2F0aW9uIGlzIG1hZGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1yZWxvY19kYW5nZXJvdXMgKGluZm8sIG1lc3NhZ2UsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICptZXNzYWdlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGlmIChhYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlWDogZ2VuZXJhdGVkIikpOwotICBlbHNlCi0gICAgZWluZm8gKCIlWCVDOiIsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpOwotICBlaW5mbyAoXygiZGFuZ2Vyb3VzIHJlbG9jYXRpb246ICVzXG4iKSwgbWVzc2FnZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2MgaXMgYmVpbmcgZ2VuZXJhdGVkIGF0dGFjaGVkIHRvIGEgc3ltYm9sCi0gICB0aGF0IGlzIG5vdCBiZWluZyBvdXRwdXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi11bmF0dGFjaGVkX3JlbG9jIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJVg6IGdlbmVyYXRlZCIpKTsKLSAgZWxzZQotICAgIGVpbmZvICgiJVglQzoiLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKTsKLSAgZWluZm8gKF8oIiByZWxvYyByZWZlcnMgdG8gc3ltYm9sIGAlVCcgd2hpY2ggaXMgbm90IGJlaW5nIG91dHB1dFxuIiksIG5hbWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgaWYgbGlua19pbmZvLm5vdGljZV9hbGwgaXMgc2V0LCBvciB3aGVuIGEgc3ltYm9sIGluCi0gICBsaW5rX2luZm8ubm90aWNlX2hhc2ggaXMgZm91bmQuICBTeW1ib2xzIGFyZSBwdXQgaW4gbm90aWNlX2hhc2gKLSAgIHVzaW5nIHRoZSAteSBvcHRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbm90aWNlIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmICghIGluZm8tPm5vdGljZV9hbGwKLSAgICAgIHx8IChpbmZvLT5ub3RpY2VfaGFzaCAhPSBOVUxMCi0JICAmJiBiZmRfaGFzaF9sb29rdXAgKGluZm8tPm5vdGljZV9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpKQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotCWVpbmZvICgiJUI6IHJlZmVyZW5jZSB0byAlc1xuIiwgYWJmZCwgbmFtZSk7Ci0gICAgICBlbHNlCi0JZWluZm8gKCIlQjogZGVmaW5pdGlvbiBvZiAlc1xuIiwgYWJmZCwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChjb21tYW5kX2xpbmUuY3JlZiB8fCBub2Nyb3NzcmVmX2xpc3QgIT0gTlVMTCkKLSAgICBhZGRfY3JlZiAobmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRtYWluLmggYi9sZC9sZG1haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxYmYzZC4uMDAwMDAwMAotLS0gYS9sZC9sZG1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIGxkbWFpbi5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERNQUlOX0gKLSNkZWZpbmUgTERNQUlOX0gKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKLWV4dGVybiBiZmQgKm91dHB1dF9iZmQ7Ci1leHRlcm4gY2hhciAqZGVmYXVsdF90YXJnZXQ7Ci1leHRlcm4gYm9vbGVhbiB0cmFjZV9maWxlczsKLWV4dGVybiBib29sZWFuIHRyYWNlX2ZpbGVfdHJpZXM7Ci1leHRlcm4gYm9vbGVhbiB2ZXJzaW9uX3ByaW50ZWQ7Ci1leHRlcm4gYm9vbGVhbiB3aG9sZV9hcmNoaXZlOwotZXh0ZXJuIGJvb2xlYW4gZGVtYW5nbGluZzsKLWV4dGVybiBpbnQgZ19zd2l0Y2hfdmFsdWU7Ci1leHRlcm4gY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19pbmZvIGxpbmtfaW5mbzsKLQotZXh0ZXJuIHZvaWQgYWRkX3lzeW0gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBhZGRfd3JhcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGFkZF9rZWVwc3ltc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRtaXNjLmMgYi9sZC9sZG1pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhYjIyOC4uMDAwMDAwMAotLS0gYS9sZC9sZG1pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKiBsZG1pc2MuYwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2RlZmluZSBVU0VfU1REQVJHIDEKLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2RlZmluZSBVU0VfU1REQVJHIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0KLXN0YXRpYyB2b2lkIHZmaW5mbyBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0vKgotICUlIGxpdGVyYWwgJQotICVGIGVycm9yIGlzIGZhdGFsCi0gJVAgcHJpbnQgcHJvZ3JhbSBuYW1lCi0gJVMgcHJpbnQgc2NyaXB0IGZpbGUgYW5kIGxpbmVudW1iZXIKLSAlRSBjdXJyZW50IGJmZCBlcnJvciBvciBlcnJubwotICVJIGZpbGVuYW1lIGZyb20gYSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlCi0gJUIgZmlsZW5hbWUgZnJvbSBhIGJmZAotICVUIHN5bWJvbCBuYW1lCi0gJVggbm8gb2JqZWN0IG91dHB1dCwgZmFpbCByZXR1cm4KLSAlViBoZXggYmZkX3ZtYQotICV2IGhleCBiZmRfdm1hLCBubyBsZWFkaW5nIHplcm9zCi0gJVcgaGV4IGJmZF92bWEgd2l0aCAweCB3aXRoIG5vIGxlYWRpbmcgemVyb3MgdGFraW5nIHVwIDggc3BhY2VzCi0gJUMgY2xldmVyIGZpbGVuYW1lOmxpbmVudW1iZXIgd2l0aCBmdW5jdGlvbgotICVEIGxpa2UgJUMsIGJ1dCBubyBmdW5jdGlvbiBuYW1lCi0gJUcgbGlrZSAlRCwgYnV0IG9ubHkgZnVuY3Rpb24gbmFtZQotICVSIGluZm8gYWJvdXQgYSByZWxlbnQKLSAlcyBhcmJpdHJhcnkgc3RyaW5nLCBsaWtlIHByaW50ZgotICVkIGludGVnZXIsIGxpa2UgcHJpbnRmCi0gJXUgaW50ZWdlciwgbGlrZSBwcmludGYKLSovCi0KLWNoYXIgKgotZGVtYW5nbGUgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjaGFyICpyZXM7Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTAotICAgICAgJiYgYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvdXRwdXRfYmZkKSA9PSBzdHJpbmdbMF0pCi0gICAgKytzdHJpbmc7Ci0KLSAgLyogVGhpcyBpcyBhIGhhY2sgZm9yIGJldHRlciBlcnJvciByZXBvcnRpbmcgb24gWENPRkYsIG9yIHRoZSBNUyBQRSAgICovCi0gIC8qIGZvcm1hdC4gIFhjb2ZmIGhhcyBhIHNpbmdsZSAnLicsIHdoaWxlIHRoZSBOVCBQRSBmb3IgUFBDIGhhcyAnLi4nLiAqLwotICAvKiBTbyB3ZSByZW1vdmUgYWxsIG9mIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgd2hpbGUoc3RyaW5nWzBdID09ICcuJykKLSAgICArK3N0cmluZzsKLQotICByZXMgPSBjcGx1c19kZW1hbmdsZSAoc3RyaW5nLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0gIHJldHVybiByZXMgPyByZXMgOiB4c3RyZHVwIChzdHJpbmcpOwotfQotCi1zdGF0aWMgdm9pZAotdmZpbmZvIChmcCwgZm10LCBhcmcpCi0gICAgIEZJTEUgKmZwOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2xpc3QgYXJnOwotewotICBib29sZWFuIGZhdGFsID0gZmFsc2U7Ci0KLSAgd2hpbGUgKCpmbXQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICB3aGlsZSAoKmZtdCAhPSAnJScgJiYgKmZtdCAhPSAnXDAnKSAKLQl7Ci0JICBwdXRjICgqZm10LCBmcCk7Ci0JICBmbXQrKzsKLQl9Ci0KLSAgICAgIGlmICgqZm10ID09ICclJykgCi0JewotCSAgZm10ICsrOwotCSAgc3dpdGNoICgqZm10KyspIAotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZiAoZnAsIiUlJWMiLCBmbXRbLTFdKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICclJzoKLQkgICAgICAvKiBsaXRlcmFsICUgKi8KLQkgICAgICBwdXRjICgnJScsIGZwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdYJzoKLQkgICAgICAvKiBubyBvYmplY3Qgb3V0cHV0LCBmYWlsIHJldHVybiAqLwotCSAgICAgIGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdWJzoKLQkgICAgICAvKiBoZXggYmZkX3ZtYSAqLwotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWx1ZSA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQkJZnByaW50Zl92bWEgKGZwLCB2YWx1ZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3YnOgotCSAgICAgIC8qIGhleCBiZmRfdm1hLCBubyBsZWFkaW5nIHplcm9zICovCi0JICAgICAgewotCQljaGFyIGJ1ZlsxMDBdOwotCQljaGFyICpwID0gYnVmOwotCQliZmRfdm1hIHZhbHVlID0gdmFfYXJnIChhcmcsIGJmZF92bWEpOwotCQlzcHJpbnRmX3ZtYSAocCwgdmFsdWUpOwotCQl3aGlsZSAoKnAgPT0gJzAnKQotCQkgIHArKzsKLQkJaWYgKCEqcCkKLQkJICBwLS07Ci0JCWZwdXRzIChwLCBmcCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1cnOgotCSAgICAgIC8qIGhleCBiZmRfdm1hIHdpdGggMHggd2l0aCBubyBsZWFkaW5nIHplcm9lcyB0YWtpbmcgdXAKLSAgICAgICAgICAgICAgICAgOCBzcGFjZXMuICAqLwotCSAgICAgIHsKLQkJY2hhciBidWZbMTAwXTsKLQkJYmZkX3ZtYSB2YWx1ZTsKLQkJY2hhciAqcDsKLQkJaW50IGxlbjsKLQotCQl2YWx1ZSA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQkJc3ByaW50Zl92bWEgKGJ1ZiwgdmFsdWUpOwotCQlmb3IgKHAgPSBidWY7ICpwID09ICcwJzsgKytwKQotCQkgIDsKLQkJaWYgKCpwID09ICdcMCcpCi0JCSAgLS1wOwotCQlsZW4gPSBzdHJsZW4gKHApOwotCQl3aGlsZSAobGVuIDwgOCkKLQkJICB7Ci0JCSAgICBwdXRjICgnICcsIGZwKTsKLQkJICAgICsrbGVuOwotCQkgIH0KLQkJZnByaW50ZiAoZnAsICIweCVzIiwgcCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1QnOgotCSAgICAgIC8qIFN5bWJvbCBuYW1lLiAgKi8KLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFyZywgY29uc3QgY2hhciAqKTsKLQotCQlpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMIHx8ICpuYW1lID09IDApCi0JCSAgZnByaW50ZiAoZnAsIF8oIm5vIHN5bWJvbCIpKTsKLQkJZWxzZSBpZiAoISBkZW1hbmdsaW5nKQotCQkgIGZwcmludGYgKGZwLCAiJXMiLCBuYW1lKTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGNoYXIgKmRlbWFuZ2xlZDsKLQotCQkgICAgZGVtYW5nbGVkID0gZGVtYW5nbGUgKG5hbWUpOwotCQkgICAgZnByaW50ZiAoZnAsICIlcyIsIGRlbWFuZ2xlZCk7Ci0JCSAgICBmcmVlIChkZW1hbmdsZWQpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnQic6Ci0JICAgICAgLyogZmlsZW5hbWUgZnJvbSBhIGJmZCAqLwotCSAgICAgIHsgCi0JCWJmZCAqYWJmZCA9IHZhX2FyZyAoYXJnLCBiZmQgKik7Ci0JCWlmIChhYmZkLT5teV9hcmNoaXZlKQotCQkgIGZwcmludGYgKGZwLCAiJXMoJXMpIiwgYWJmZC0+bXlfYXJjaGl2ZS0+ZmlsZW5hbWUsCi0JCQkgICBhYmZkLT5maWxlbmFtZSk7Ci0JCWVsc2UKLQkJICBmcHJpbnRmIChmcCwgIiVzIiwgYWJmZC0+ZmlsZW5hbWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdGJzoKLQkgICAgICAvKiBlcnJvciBpcyBmYXRhbCAqLwotCSAgICAgIGZhdGFsID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdQJzoKLQkgICAgICAvKiBwcmludCBwcm9ncmFtIG5hbWUgKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiVzIiwgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdFJzoKLQkgICAgICAvKiBjdXJyZW50IGJmZCBlcnJvciBvciBlcnJubyAqLwotCSAgICAgIGZwcmludGYgKGZwLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnSSc6Ci0JICAgICAgLyogZmlsZW5hbWUgZnJvbSBhIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKi8KLQkgICAgICB7Ci0JCWxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmk7Ci0KLQkJaSA9IHZhX2FyZyAoYXJnLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopOwotCQlpZiAoYmZkX215X2FyY2hpdmUgKGktPnRoZV9iZmQpICE9IE5VTEwpCi0JCSAgZnByaW50ZiAoZnAsICIoJXMpIiwKLQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSkpOwotCQlmcHJpbnRmIChmcCwgIiVzIiwgaS0+bG9jYWxfc3ltX25hbWUpOwotCQlpZiAoYmZkX215X2FyY2hpdmUgKGktPnRoZV9iZmQpID09IE5VTEwKLQkJICAgICYmIHN0cmNtcCAoaS0+bG9jYWxfc3ltX25hbWUsIGktPmZpbGVuYW1lKSAhPSAwKQotCQkgIGZwcmludGYgKGZwLCAiICglcykiLCBpLT5maWxlbmFtZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIC8qIHByaW50IHNjcmlwdCBmaWxlIGFuZCBsaW5lbnVtYmVyICovCi0JICAgICAgaWYgKHBhcnNpbmdfZGVmc3ltKQotCQlmcHJpbnRmIChmcCwgIi0tZGVmc3ltICVzIiwgbGV4X3N0cmluZyk7Ci0JICAgICAgZWxzZSBpZiAobGRmaWxlX2lucHV0X2ZpbGVuYW1lICE9IE5VTEwpCi0JCWZwcmludGYgKGZwLCAiJXM6JXUiLCBsZGZpbGVfaW5wdXRfZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgICAgZWxzZQotCQlmcHJpbnRmIChmcCwgXygiYnVpbHQgaW4gbGlua2VyIHNjcmlwdDoldSIpLCBsaW5lbm8pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1InOgotCSAgICAgIC8qIFByaW50IGFsbCB0aGF0J3MgaW50ZXJlc3RpbmcgYWJvdXQgYSByZWxlbnQgKi8KLQkgICAgICB7Ci0JCWFyZWxlbnQgKnJlbGVudCA9IHZhX2FyZyAoYXJnLCBhcmVsZW50ICopOwotCQotCQlsZmluZm8gKGZwLCAiJXMrMHgldiAodHlwZSAlcykiLAotCQkJKCoocmVsZW50LT5zeW1fcHRyX3B0cikpLT5uYW1lLAotCQkJcmVsZW50LT5hZGRlbmQsCi0JCQlyZWxlbnQtPmhvd3RvLT5uYW1lKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JCi0JICAgIGNhc2UgJ0MnOgotCSAgICBjYXNlICdEJzoKLQkgICAgY2FzZSAnRyc6Ci0JICAgICAgLyogQ2xldmVyIGZpbGVuYW1lOmxpbmVudW1iZXIgd2l0aCBmdW5jdGlvbiBuYW1lIGlmIHBvc3NpYmxlLAotCQkgb3Igc2VjdGlvbiBuYW1lIGFzIGEgbGFzdCByZXNvcnQuICBUaGUgYXJndW1lbnRzIGFyZSBhIEJGRCwKLQkJIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldC4gICovCi0JICAgICAgewotCQlzdGF0aWMgYmZkICpsYXN0X2JmZDsKLQkJc3RhdGljIGNoYXIgKmxhc3RfZmlsZSA9IE5VTEw7Ci0JCXN0YXRpYyBjaGFyICpsYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQkJYmZkICphYmZkOwotCQlhc2VjdGlvbiAqc2VjdGlvbjsKLQkJYmZkX3ZtYSBvZmZzZXQ7Ci0JCWxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotCQlhc3ltYm9sICoqYXN5bWJvbHM7Ci0JCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCQljb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0JCXVuc2lnbmVkIGludCBsaW5lbnVtYmVyOwotCQlib29sZWFuIGRpc2NhcmRfbGFzdDsKLQotCQlhYmZkID0gdmFfYXJnIChhcmcsIGJmZCAqKTsKLQkJc2VjdGlvbiA9IHZhX2FyZyAoYXJnLCBhc2VjdGlvbiAqKTsKLQkJb2Zmc2V0ID0gdmFfYXJnIChhcmcsIGJmZF92bWEpOwotCi0JCWVudHJ5ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgYWJmZC0+dXNyZGF0YTsKLQkJaWYgKGVudHJ5ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEwKLQkJICAgICYmIGVudHJ5LT5hc3ltYm9scyAhPSAoYXN5bWJvbCAqKikgTlVMTCkKLQkJICBhc3ltYm9scyA9IGVudHJ5LT5hc3ltYm9sczsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGxvbmcgc3ltc2l6ZTsKLQkJICAgIGxvbmcgc3ltYm9sX2NvdW50OwotCi0JCSAgICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotCQkgICAgaWYgKHN5bXNpemUgPCAwKQotCQkgICAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIiksIGFiZmQpOwotCQkgICAgYXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JCSAgICBzeW1ib2xfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgYXN5bWJvbHMpOwotCQkgICAgaWYgKHN5bWJvbF9jb3VudCA8IDApCi0JCSAgICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzXG4iKSwgYWJmZCk7Ci0JCSAgICBpZiAoZW50cnkgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTCkKLQkJICAgICAgewotCQkJZW50cnktPmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0JCQllbnRyeS0+c3ltYm9sX2NvdW50ID0gc3ltYm9sX2NvdW50OwotCQkgICAgICB9Ci0JCSAgfQotCi0JCWRpc2NhcmRfbGFzdCA9IHRydWU7Ci0JCWlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIGFzeW1ib2xzLCBvZmZzZXQsCi0JCQkJCSAgICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwKLQkJCQkJICAgJmxpbmVudW1iZXIpKQotCQkgIHsKLQkJICAgIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTCAmJiBmbXRbLTFdID09ICdHJykKLQkJICAgICAgewotCQkJbGZpbmZvIChmcCwgIiVCOiIsIGFiZmQpOwotCQkJaWYgKGZpbGVuYW1lICE9IE5VTEwKLQkJCSAgICAmJiBzdHJjbXAgKGZpbGVuYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkgIT0gMCkKLQkJCSAgZnByaW50ZiAoZnAsICIlczoiLCBmaWxlbmFtZSk7Ci0JCQlsZmluZm8gKGZwLCAiJVQiLCBmdW5jdGlvbm5hbWUpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTCAmJiBmbXRbLTFdID09ICdDJykKLQkJICAgICAgewotCQkJaWYgKGZpbGVuYW1lID09IChjaGFyICopIE5VTEwpCi0JCQkgIGZpbGVuYW1lID0gYWJmZC0+ZmlsZW5hbWU7Ci0KLQkJCWlmIChsYXN0X2JmZCA9PSBOVUxMCi0JCQkgICAgfHwgbGFzdF9maWxlID09IE5VTEwKLQkJCSAgICB8fCBsYXN0X2Z1bmN0aW9uID09IE5VTEwKLQkJCSAgICB8fCBsYXN0X2JmZCAhPSBhYmZkCi0JCQkgICAgfHwgc3RyY21wIChsYXN0X2ZpbGUsIGZpbGVuYW1lKSAhPSAwCi0JCQkgICAgfHwgc3RyY21wIChsYXN0X2Z1bmN0aW9uLCBmdW5jdGlvbm5hbWUpICE9IDApCi0JCQkgIHsKLQkJCSAgICAvKiBXZSB1c2UgYWJmZC0+ZmlsZW5hbWUgaW4gdGhpcyBpbml0aWFsIGxpbmUsCi0JCQkgICAgICAgaW4gY2FzZSBmaWxlbmFtZSBpcyBhIC5oIGZpbGUgb3Igc29tZXRoaW5nCi0JCQkgICAgICAgc2ltaWxhcmx5IHVuaGVscGZ1bC4gICovCi0JCQkgICAgbGZpbmZvIChmcCwgXygiJUI6IEluIGZ1bmN0aW9uIGAlVCc6XG4iKSwKLQkJCQkgICAgYWJmZCwgZnVuY3Rpb25uYW1lKTsKLQotCQkJICAgIGxhc3RfYmZkID0gYWJmZDsKLQkJCSAgICBpZiAobGFzdF9maWxlICE9IE5VTEwpCi0JCQkgICAgICBmcmVlIChsYXN0X2ZpbGUpOwotCQkJICAgIGxhc3RfZmlsZSA9IGJ1eXN0cmluZyAoZmlsZW5hbWUpOwotCQkJICAgIGlmIChsYXN0X2Z1bmN0aW9uICE9IE5VTEwpCi0JCQkgICAgICBmcmVlIChsYXN0X2Z1bmN0aW9uKTsKLQkJCSAgICBsYXN0X2Z1bmN0aW9uID0gYnV5c3RyaW5nIChmdW5jdGlvbm5hbWUpOwotCQkJICB9Ci0JCQlkaXNjYXJkX2xhc3QgPSBmYWxzZTsKLQkJCWlmIChsaW5lbnVtYmVyICE9IDApCi0JCQkgIGZwcmludGYgKGZwLCAiJXM6JXUiLCBmaWxlbmFtZSwgbGluZW51bWJlcik7Ci0JCQllbHNlCi0JCQkgIGxmaW5mbyAoZnAsICIlcyglcysweCV2KSIsIGZpbGVuYW1lLCBzZWN0aW9uLT5uYW1lLAotCQkJCSAgb2Zmc2V0KTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoZmlsZW5hbWUgPT0gTlVMTAotCQkJICAgICB8fCBzdHJjbXAgKGZpbGVuYW1lLCBhYmZkLT5maWxlbmFtZSkgPT0gMCkKLQkJICAgICAgewotCQkJbGZpbmZvIChmcCwgIiVCKCVzKzB4JXYpIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSwKLQkJCQlvZmZzZXQpOwotCQkJaWYgKGxpbmVudW1iZXIgIT0gMCkKLQkJCSAgbGZpbmZvIChmcCwgIjoldSIsIGxpbmVudW1iZXIpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChsaW5lbnVtYmVyICE9IDApIAotCQkgICAgICBsZmluZm8gKGZwLCAiJUI6JXM6JXUiLCBhYmZkLCBmaWxlbmFtZSwgbGluZW51bWJlcik7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGxmaW5mbyAoZnAsICIlQiglcysweCV2KTolcyIsIGFiZmQsIHNlY3Rpb24tPm5hbWUsCi0JCQkgICAgICBvZmZzZXQsIGZpbGVuYW1lKTsKLQkJICB9Ci0JCWVsc2UKLQkJICBsZmluZm8gKGZwLCAiJUIoJXMrMHgldikiLCBhYmZkLCBzZWN0aW9uLT5uYW1lLCBvZmZzZXQpOwotCi0JCWlmIChkaXNjYXJkX2xhc3QpCi0JCSAgewotCQkgICAgbGFzdF9iZmQgPSBOVUxMOwotCQkgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQotCQkgICAgICB7Ci0JCQlmcmVlIChsYXN0X2ZpbGUpOwotCQkJbGFzdF9maWxlID0gTlVMTDsKLQkJICAgICAgfQotCQkgICAgaWYgKGxhc3RfZnVuY3Rpb24gIT0gTlVMTCkKLQkJICAgICAgewotCQkJZnJlZSAobGFzdF9mdW5jdGlvbik7Ci0JCQlsYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JCQotCSAgICBjYXNlICdzJzoKLQkgICAgICAvKiBhcmJpdHJhcnkgc3RyaW5nLCBsaWtlIHByaW50ZiAqLwotCSAgICAgIGZwcmludGYgKGZwLCAiJXMiLCB2YV9hcmcgKGFyZywgY2hhciAqKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgLyogaW50ZWdlciwgbGlrZSBwcmludGYgKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiVkIiwgdmFfYXJnIChhcmcsIGludCkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3UnOgotCSAgICAgIC8qIHVuc2lnbmVkIGludGVnZXIsIGxpa2UgcHJpbnRmICovCi0JICAgICAgZnByaW50ZiAoZnAsICIldSIsIHZhX2FyZyAoYXJnLCB1bnNpZ25lZCBpbnQpKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZhdGFsID09IHRydWUpIAotICAgIHhleGl0KDEpOwotfQotCi0vKiBGb3JtYXQgaW5mbyBtZXNzYWdlIGFuZCBwcmludCBvbiBzdGRvdXQuICovCi0KLS8qIChZb3Ugd291bGQgdGhpbmsgdGhpcyBzaG91bGQgYmUgY2FsbGVkIGp1c3QgImluZm8iLCBidXQgdGhlbiB5b3UKLSAgIHdvdWxkIGhvc2VkIGJ5IEx5bnhPUywgd2hpY2ggZGVmaW5lcyB0aGF0IG5hbWUgaW4gaXRzIGxpYmMuKSAgKi8KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLWluZm9fbXNnIChjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1pbmZvX21zZyAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnOwotCi0jaWYgISBVU0VfU1REQVJHCi0gIGNvbnN0IGNoYXIgKmZtdDsKLQotICB2YV9zdGFydCAoYXJnKTsKLSAgZm10ID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJnLCBmbXQpOwotI2VuZGlmCi0KLSAgdmZpbmZvIChzdGRvdXQsIGZtdCwgYXJnKTsKLSAgdmFfZW5kIChhcmcpOwotfQotCi0vKiAoJ2UnIGZvciBlcnJvci4pIEZvcm1hdCBpbmZvIG1lc3NhZ2UgYW5kIHByaW50IG9uIHN0ZGVyci4gKi8KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLWVpbmZvIChjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1laW5mbyAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnOwotCi0jaWYgISBVU0VfU1REQVJHCi0gIGNvbnN0IGNoYXIgKmZtdDsKLQotICB2YV9zdGFydCAoYXJnKTsKLSAgZm10ID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJnLCBmbXQpOwotI2VuZGlmCi0KLSAgdmZpbmZvIChzdGRlcnIsIGZtdCwgYXJnKTsKLSAgdmFfZW5kIChhcmcpOwotfQotCi12b2lkIAotaW5mb19hc3NlcnQgKGZpbGUsIGxpbmUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBlaW5mbyAoXygiJUYlUDogaW50ZXJuYWwgZXJyb3IgJXMgJWRcbiIpLCBmaWxlLCBsaW5lKTsKLX0KLQotY2hhciAqCi1idXlzdHJpbmcgKHgpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIHg7Ci17Ci0gIHNpemVfdCBsID0gc3RybGVuKHgpKzE7Ci0gIGNoYXIgKnIgPSB4bWFsbG9jKGwpOwotICBtZW1jcHkociwgeCxsKTsKLSAgcmV0dXJuIHI7Ci19Ci0KLS8qICgnbScgZm9yIG1hcCkgRm9ybWF0IGluZm8gbWVzc2FnZSBhbmQgcHJpbnQgb24gbWFwLiAqLwotCi12b2lkCi0jaWYgVVNFX1NUREFSRwotbWluZm8gKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotI2Vsc2UKLW1pbmZvICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmc7Ci0KLSNpZiAhIFVTRV9TVERBUkcKLSAgY29uc3QgY2hhciAqZm10OwotICB2YV9zdGFydCAoYXJnKTsKLSAgZm10ID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJnLCBmbXQpOwotI2VuZGlmCi0KLSAgdmZpbmZvIChjb25maWcubWFwX2ZpbGUsIGZtdCwgYXJnKTsKLSAgdmFfZW5kIChhcmcpOwotfQotCi12b2lkCi0jaWYgVVNFX1NUREFSRwotbGZpbmZvIChGSUxFICpmaWxlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1sZmluZm8gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBGSUxFICpmaWxlOwotICBjb25zdCBjaGFyICpmbXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZpbGUgPSB2YV9hcmcgKGFyZywgRklMRSAqKTsKLSAgZm10ID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJnLCBmbXQpOwotI2VuZGlmCi0KLSAgdmZpbmZvIChmaWxlLCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyB0byBwcmludCB0aGUgbGluayBtYXAuICAqLwotCi12b2lkIAotcHJpbnRfc3BhY2UgKCkKLXsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiICIpOwotfQotCi12b2lkIAotcHJpbnRfbmwgKCkKLXsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkbWlzYy5oIGIvbGQvbGRtaXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjNiNGYuLjAwMDAwMDAKLS0tIGEvbGQvbGRtaXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBsZG1pc2MuaCAtCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERNSVNDX0gKLSNkZWZpbmUgTERNSVNDX0gKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotZXh0ZXJuIHZvaWQgZWluZm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLWV4dGVybiB2b2lkIG1pbmZvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1leHRlcm4gdm9pZCBpbmZvX21zZyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotZXh0ZXJuIHZvaWQgbGZpbmZvIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLSNlbHNlCi0vKiBWQVJBUkdTKi8KLWV4dGVybiB2b2lkIGVpbmZvICgpOwotLyogVkFSQVJHUyovCi1leHRlcm4gdm9pZCBtaW5mbyAoKTsKLS8qIFZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgaW5mb19tc2cgKCk7Ci0vKlZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgbGZpbmZvICgpOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGluZm9fYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KSk7Ci1leHRlcm4gdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIFBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIFBUUiB4cmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgeGV4aXQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gY2hhciAqYnV5c3RyaW5nIFBBUkFNUyAoKENPTlNUIGNoYXIgKkNPTlNUKSk7Ci0KLSNkZWZpbmUgQVNTRVJUKHgpIFwKLWRvIHsgaWYgKCEoeCkpIGluZm9fYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBGQUlMKCkgXAotZG8geyBpbmZvX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0gd2hpbGUgKDApCi0KLWV4dGVybiB2b2lkIHByaW50X3NwYWNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHByaW50X25sIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBjaGFyICpkZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZHZlci5jIGIvbGQvbGR2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2MDBhMi4uMDAwMDAwMAotLS0gYS9sZC9sZHZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogbGR2ZXIuYyAtLSBQcmludCBsaW5rZXIgdmVyc2lvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZHZlci5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi1jb25zdCBjaGFyICpsZF9wcm9ncmFtX3ZlcnNpb24gPSBWRVJTSU9OOwotCi12b2lkCi1sZHZlcnNpb24gKG5vaXN5KQotICAgICBpbnQgbm9pc3k7Ci17Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiR05VIGxkIHZlcnNpb24gJXMgKHdpdGggQkZEICVzKVxuIiksCi0JICAgbGRfcHJvZ3JhbV92ZXJzaW9uLCBCRkRfVkVSU0lPTik7Ci0KLSAgaWYgKG5vaXN5KSAKLSAgICB7Ci0gICAgICBsZF9lbXVsYXRpb25feGZlcl90eXBlICoqcHRyID0gbGRfZW11bGF0aW9uczsKLSAgICAKLSAgICAgIHByaW50ZiAoXygiICBTdXBwb3J0ZWQgZW11bGF0aW9uczpcbiIpKTsKLSAgICAgIHdoaWxlICgqcHRyKSAKLQl7Ci0JICBwcmludGYgKCIgICAlc1xuIiwgKCpwdHIpLT5lbXVsYXRpb25fbmFtZSk7Ci0JICBwdHIrKzsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvbGR2ZXIuaCBiL2xkL2xkdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2I2YmMuLjAwMDAwMDAKLS0tIGEvbGQvbGR2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIGxkdmVyLmggLS0gSGVhZGVyIGZpbGUgZm9yIGxkdmVyLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpsZF9wcm9ncmFtX3ZlcnNpb247Ci0KLXZvaWQgbGR2ZXJzaW9uIFBBUkFNUyAoKGludCkpOwpkaWZmIC0tZ2l0IGEvbGQvbGR3cml0ZS5jIGIvbGQvbGR3cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYxMTlhLi4wMDAwMDAwCi0tLSBhL2xkL2xkd3JpdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi0vKiBsZHdyaXRlLmMgLS0gd3JpdGUgb3V0IHRoZSBsaW5rZWQgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc2FjQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLXN0YXRpYyB2b2lkIGJ1aWxkX2xpbmtfb3JkZXIgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmNsb25lX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCBzcGxpdF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBCdWlsZCBsaW5rX29yZGVyIHN0cnVjdHVyZXMgZm9yIHRoZSBCRkQgbGlua2VyLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2xpbmtfb3JkZXIgKHN0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhdGVtZW50OwotewotICBzd2l0Y2ggKHN0YXRlbWVudC0+aGVhZGVyLnR5cGUpCi0gICAgewotICAgIGNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotICAgICAgewotCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQlzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0JYmZkX3ZtYSB2YWx1ZTsKLQlib29sZWFuIGJpZ19lbmRpYW4gPSBmYWxzZTsKLQotCW91dHB1dF9zZWN0aW9uID0gc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbjsKLQlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQotCWxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKLQlpZiAobGlua19vcmRlciA9PSBOVUxMKQotCSAgZWluZm8gKF8oIiVQJUY6IGJmZF9uZXdfbGlua19vcmRlciBmYWlsZWRcbiIpKTsKLQotCWxpbmtfb3JkZXItPnR5cGUgPSBiZmRfZGF0YV9saW5rX29yZGVyOwotCWxpbmtfb3JkZXItPm9mZnNldCA9IHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQub3V0cHV0X3ZtYTsKLQlsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoUVVBRF9TSVpFKTsKLQotCXZhbHVlID0gc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC52YWx1ZTsKLQotCS8qIElmIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvdXRwdXQgQkZEIGlzIG5vdCBrbm93biwgdGhlbiB3ZQotCSAgIGJhc2UgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgb24gdGhlIGZpcnN0IGlucHV0IGZpbGUuCi0JICAgQnkgY29udmVudGlvbiwgdGhlIGJmZF9wdXQgcm91dGluZXMgZm9yIGFuIHVua25vd24KLQkgICBlbmRpYW5uZXNzIGFyZSBiaWcgZW5kaWFuLCBzbyB3ZSBtdXN0IHN3YXAgaGVyZSBpZiB0aGUKLQkgICBpbnB1dCBmaWxlIGlzIGxpdHRsZSBlbmRpYW4uICAqLwotCWlmIChiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JICBiaWdfZW5kaWFuID0gdHJ1ZTsKLQllbHNlIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JICBiaWdfZW5kaWFuID0gZmFsc2U7Ci0JZWxzZQotCSAgewotCSAgICBib29sZWFuIHN3YXA7Ci0KLQkgICAgc3dhcCA9IGZhbHNlOwotCSAgICBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fQklHKQotCSAgICAgIGJpZ19lbmRpYW4gPSB0cnVlOwotCSAgICBlbHNlIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9MSVRUTEUpCi0JICAgICAgewotCQliaWdfZW5kaWFuID0gZmFsc2U7Ci0JCXN3YXAgPSB0cnVlOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fVU5TRVQpCi0JICAgICAgewotCQliaWdfZW5kaWFuID0gdHJ1ZTsKLQkJewotCQkgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChzKQotCQkgICAgewotCQkgICAgICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQotCQkJewotCQkJICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKHMtPnRoZV9iZmQpKQotCQkJICAgIHsKLQkJCSAgICAgIGJpZ19lbmRpYW4gPSBmYWxzZTsKLQkJCSAgICAgIHN3YXAgPSB0cnVlOwotCQkJICAgIH0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICB9Ci0KLQkgICAgaWYgKHN3YXApCi0JICAgICAgewotCQliZmRfYnl0ZSBidWZmZXJbOF07Ci0KLQkJc3dpdGNoIChzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnR5cGUpCi0JCSAgewotCQkgIGNhc2UgUVVBRDoKLQkJICBjYXNlIFNRVUFEOgotCQkgICAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPj0gUVVBRF9TSVpFKQotCQkgICAgICB7Ci0JCQliZmRfcHV0bDY0ICh2YWx1ZSwgYnVmZmVyKTsKLQkJCXZhbHVlID0gYmZkX2dldGI2NCAoYnVmZmVyKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgIGNhc2UgTE9ORzoKLQkJICAgIGJmZF9wdXRsMzIgKHZhbHVlLCBidWZmZXIpOwotCQkgICAgdmFsdWUgPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBTSE9SVDoKLQkJICAgIGJmZF9wdXRsMTYgKHZhbHVlLCBidWZmZXIpOwotCQkgICAgdmFsdWUgPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBCWVRFOgotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGFib3J0ICgpOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0KLQlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQlzd2l0Y2ggKHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKLQkgIHsKLQkgIGNhc2UgUVVBRDoKLQkgIGNhc2UgU1FVQUQ6Ci0JICAgIGlmIChzaXplb2YgKGJmZF92bWEpID49IFFVQURfU0laRSkKLQkgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCB2YWx1ZSwgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYmZkX3ZtYSBoaWdoOwotCi0JCWlmIChzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnR5cGUgPT0gUVVBRCkKLQkJICBoaWdoID0gMDsKLQkJZWxzZSBpZiAoKHZhbHVlICYgMHg4MDAwMDAwMCkgPT0gMCkKLQkJICBoaWdoID0gMDsKLQkJZWxzZQotCQkgIGhpZ2ggPSAoYmZkX3ZtYSkgLTE7Ci0JCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGhpZ2gsCi0JCQkgICAgKGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cwotCQkJICAgICArIChiaWdfZW5kaWFuID8gMCA6IDQpKSk7Ci0JCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLAotCQkJICAgIChsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMKLQkJCSAgICAgKyAoYmlnX2VuZGlhbiA/IDQgOiAwKSkpOwotCSAgICAgIH0KLQkgICAgbGlua19vcmRlci0+c2l6ZSA9IFFVQURfU0laRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIExPTkc6Ci0JICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOwotCSAgICBsaW5rX29yZGVyLT5zaXplID0gTE9OR19TSVpFOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0hPUlQ6Ci0JICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOwotCSAgICBsaW5rX29yZGVyLT5zaXplID0gU0hPUlRfU0laRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIEJZVEU6Ci0JICAgIGJmZF9wdXRfOCAob3V0cHV0X2JmZCwgdmFsdWUsIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyk7Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBCWVRFX1NJWkU7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLSAgICAgIHsKLQlsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyczsKLQlhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0Jc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotCi0JcnMgPSAmc3RhdGVtZW50LT5yZWxvY19zdGF0ZW1lbnQ7Ci0KLQlvdXRwdXRfc2VjdGlvbiA9IHJzLT5vdXRwdXRfc2VjdGlvbjsKLQlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQotCWxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKLQlpZiAobGlua19vcmRlciA9PSBOVUxMKQotCSAgZWluZm8gKF8oIiVQJUY6IGJmZF9uZXdfbGlua19vcmRlciBmYWlsZWRcbiIpKTsKLQotCWxpbmtfb3JkZXItPm9mZnNldCA9IHJzLT5vdXRwdXRfdm1hOwotCWxpbmtfb3JkZXItPnNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJzLT5ob3d0byk7Ci0KLQlsaW5rX29yZGVyLT51LnJlbG9jLnAgPQotCSAgKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKikKLQkgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYykpKTsKLQotCWxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MgPSBycy0+cmVsb2M7Ci0JbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgPSBycy0+YWRkZW5kX3ZhbHVlOwotCi0JaWYgKHJzLT5uYW1lID09IE5VTEwpCi0JICB7Ci0JICAgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyOwotCSAgICBpZiAocnMtPnNlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpCi0JICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24gPSBycy0+c2VjdGlvbjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24gPSBycy0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCWxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kICs9IHJzLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXI7Ci0JICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lID0gcnMtPm5hbWU7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06Ci0gICAgICAvKiBDcmVhdGUgYSBuZXcgbGlua19vcmRlciBpbiB0aGUgb3V0cHV0IHNlY3Rpb24gd2l0aCB0aGlzCi0JIGF0dGFjaGVkICovCi0gICAgICBpZiAoc3RhdGVtZW50LT5pbnB1dF9zZWN0aW9uLmlmaWxlLT5qdXN0X3N5bXNfZmxhZyA9PSBmYWxzZSkKLQl7Ci0JICBhc2VjdGlvbiAqaSA9IHN0YXRlbWVudC0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOwotCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gaS0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIEFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCi0JICBpZiAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0KLQkgICAgICBsaW5rX29yZGVyID0gYmZkX25ld19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbik7Ci0KLQkgICAgICBpZiAoaS0+ZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQkJewotCQkgIC8qIFdlJ3ZlIGdvdCBhIG5ldmVyIGxvYWQgc2VjdGlvbiBpbnNpZGUgb25lIHdoaWNoCi0JCSAgICAgaXMgZ29pbmcgdG8gYmUgb3V0cHV0LCB3ZSdsbCBjaGFuZ2UgaXQgaW50byBhCi0JCSAgICAgZmlsbCBsaW5rX29yZGVyICovCi0JCSAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9maWxsX2xpbmtfb3JkZXI7Ci0JCSAgbGlua19vcmRlci0+dS5maWxsLnZhbHVlID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcjsKLQkJICBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24gPSBpOwotCQkgIEFTU0VSVCAoaS0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOwotCQl9Ci0JICAgICAgaWYgKGktPl9jb29rZWRfc2l6ZSkKLQkJbGlua19vcmRlci0+c2l6ZSA9IGktPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWxpbmtfb3JkZXItPnNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGkpOwotCSAgICAgIGxpbmtfb3JkZXItPm9mZnNldCA9IGktPm91dHB1dF9vZmZzZXQ7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotICAgICAgLyogTWFrZSBhIG5ldyBsaW5rX29yZGVyIHdpdGggdGhlIHJpZ2h0IGZpbGxlciAqLwotICAgICAgewotCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQlzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0KLQlvdXRwdXRfc2VjdGlvbiA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb247Ci0JQVNTRVJUIChzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uLT5vd25lcgotCQk9PSBvdXRwdXRfYmZkKTsKLQlpZiAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICB7Ci0JICAgIGxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKLQkgICAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9maWxsX2xpbmtfb3JkZXI7Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7Ci0JICAgIGxpbmtfb3JkZXItPm9mZnNldCA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldDsKLQkgICAgbGlua19vcmRlci0+dS5maWxsLnZhbHVlID0gc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5maWxsOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQWxsIHRoZSBvdGhlciBvbmVzIGZhbGwgdGhyb3VnaCAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBDYWxsIEJGRCB0byB3cml0ZSBvdXQgdGhlIGxpbmtlZCBmaWxlLiAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBXYW5kZXIgYXJvdW5kIHRoZSBpbnB1dCBzZWN0aW9ucywgbWFrZSBzdXJlIHRoYXQKLSAgIHdlJ2xsIG5ldmVyIHRyeSBhbmQgY3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggbW9yZSByZWxvY3MKLSAgIHRoYW4gd2lsbCBmaXQuLiBEbyB0aGlzIGJ5IGFsd2F5cyBhc3N1bWluZyB0aGUgd29yc3QgY2FzZSwgYW5kCi0gICBjcmVhdGluZyBuZXcgb3V0cHV0IHNlY3Rpb25zIHdpdGggYWxsIHRoZSByaWdodCBiaXRzICovCi0jZGVmaW5lIFRFU1RJVCAxCi1zdGF0aWMgYXNlY3Rpb24gKgotY2xvbmVfc2VjdGlvbiAoYWJmZCwgcywgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIGludCAqY291bnQ7Ci17Ci0jZGVmaW5lIFNTSVpFIDgKLSAgY2hhciBzbmFtZVtTU0laRV07CQkvKiA/PyAgZmluZCB0aGUgbmFtZSBmb3IgdGhpcyBzaXplICovCi0gIGFzZWN0aW9uICpuOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgLyogSW52ZW50IGEgc2VjdGlvbiBuYW1lIC0gdXNlIGZpcnN0IGZpdmUKLSAgICAgY2hhcnMgb2YgYmFzZSBzZWN0aW9uIG5hbWUgYW5kIGEgZGlnaXQgc3VmZml4ICovCi0gIGRvCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBjaGFyIGJbNl07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChiKSAtIDEgJiYgcy0+bmFtZVtpXTsgaSsrKQotCWJbaV0gPSBzLT5uYW1lW2ldOwotICAgICAgYltpXSA9IDA7Ci0gICAgICBzcHJpbnRmIChzbmFtZSwgIiVzJWQiLCBiLCAoKmNvdW50KSsrKTsKLSAgICB9Ci0gIHdoaWxlIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc25hbWUpKTsKLQotICBuID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIHhzdHJkdXAgKHNuYW1lKSk7Ci0KLSAgLyogQ3JlYXRlIGEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUgKi8KLQotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLAotCQkJICAgIHNuYW1lLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0gIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gIGgtPnUuZGVmLnZhbHVlID0gMDsKLSAgaC0+dS5kZWYuc2VjdGlvbiA9IG4gICA7Ci0KLQotICBuLT5mbGFncyA9IHMtPmZsYWdzOwotICBuLT52bWEgPSBzLT52bWE7Ci0gIG4tPnVzZXJfc2V0X3ZtYSA9IHMtPnVzZXJfc2V0X3ZtYTsKLSAgbi0+bG1hID0gcy0+bG1hOwotICBuLT5fY29va2VkX3NpemUgPSAwOwotICBuLT5fcmF3X3NpemUgPSAwOwotICBuLT5vdXRwdXRfb2Zmc2V0ID0gcy0+b3V0cHV0X29mZnNldDsKLSAgbi0+b3V0cHV0X3NlY3Rpb24gPSBuOwotICBuLT5vcmVsb2NhdGlvbiA9IDA7Ci0gIG4tPnJlbG9jX2NvdW50ID0gMDsKLSAgbi0+YWxpZ25tZW50X3Bvd2VyID0gcy0+YWxpZ25tZW50X3Bvd2VyOwotICByZXR1cm4gbjsKLX0KLQotI2lmIFRFU1RJTkcKLXN0YXRpYyB2b2lkIAotZHMgKHMpCi0gICAgIGFzZWN0aW9uICpzOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmwgPSBzLT5saW5rX29yZGVyX2hlYWQ7Ci0gIHByaW50ZiAoInZtYSAleCBzaXplICV4XG4iLCBzLT52bWEsIHMtPl9yYXdfc2l6ZSk7Ci0gIHdoaWxlIChsKQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCXsKLQkgIHByaW50ZiAoIiU4eCAlc1xuIiwgbC0+b2Zmc2V0LCBsLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyLT5maWxlbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiJTh4IHNvbWV0aGluZyBlbHNlXG4iKSwgbC0+b2Zmc2V0KTsKLQl9Ci0gICAgICBsID0gbC0+bmV4dDsKLSAgICB9Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci1kdW1wIChzLCBhMSwgYTIpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGFzZWN0aW9uICphMTsKLSAgICAgYXNlY3Rpb24gKmEyOwotewotICBwcmludGYgKCIlc1xuIiwgcyk7Ci0gIGRzIChhMSk7Ci0gIGRzIChhMik7Ci19Ci0KLXN0YXRpYyB2b2lkIAotc2FuaXR5X2NoZWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICAgICAgYmZkX3ZtYSBwcmV2ID0gMDsKLSAgICAgIGZvciAocCA9IHMtPmxpbmtfb3JkZXJfaGVhZDsgcDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPm9mZnNldCA+IDEwMDAwMCkKLQkgICAgYWJvcnQgKCk7Ci0JICBpZiAocC0+b2Zmc2V0IDwgcHJldikKLQkgICAgYWJvcnQgKCk7Ci0JICBwcmV2ID0gcC0+b2Zmc2V0OwotCX0KLSAgICB9Ci19Ci0jZWxzZQotI2RlZmluZSBzYW5pdHlfY2hlY2soYSkKLSNkZWZpbmUgZHVtcChhLCBiLCBjKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIAotc3BsaXRfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpvcmlnaW5hbF9zZWM7Ci0gIGludCBuc2VjcyA9IGFiZmQtPnNlY3Rpb25fY291bnQ7Ci0gIHNhbml0eV9jaGVjayAoYWJmZCk7Ci0gIC8qIGxvb2sgdGhyb3VnaCBhbGwgdGhlIG9yaWdpbmFsIHNlY3Rpb25zICovCi0gIGZvciAob3JpZ2luYWxfc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgb3JpZ2luYWxfc2VjICYmIG5zZWNzOwotICAgICAgIG9yaWdpbmFsX3NlYyA9IG9yaWdpbmFsX3NlYy0+bmV4dCwgbnNlY3MtLSkKLSAgICB7Ci0gICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICBpbnQgbGluZXMgPSAwOwotICAgICAgaW50IHJlbG9jcyA9IDA7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKipwcDsKLSAgICAgIGJmZF92bWEgdm1hID0gb3JpZ2luYWxfc2VjLT52bWE7Ci0gICAgICBiZmRfdm1hIHNoaWZ0X29mZnNldCA9IDA7Ci0gICAgICBhc2VjdGlvbiAqY3Vyc29yID0gb3JpZ2luYWxfc2VjOwotCi0gICAgICAvKiBjb3VudCB1cCB0aGUgcmVsb2NhdGlvbnMgYW5kIGxpbmUgZW50cmllcyB0byBzZWUgaWYKLQkgYW55dGhpbmcgd291bGQgYmUgdG9vIGJpZyB0byBmaXQgKi8KLSAgICAgIGZvciAocHAgPSAmKGN1cnNvci0+bGlua19vcmRlcl9oZWFkKTsgKnBwOyBwcCA9ICYoKCpwcCktPm5leHQpKQotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcCA9ICpwcDsKLQkgIGludCB0aGlzbGluZXMgPSAwOwotCSAgaW50IHRoaXNyZWxvY3MgPSAwOwotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKLQkJICB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCQl0aGlzbGluZXMgPSBzZWMtPmxpbmVub19jb3VudDsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCXRoaXNyZWxvY3MgPSBzZWMtPnJlbG9jX2NvdW50OwotCi0JICAgIH0KLQkgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotCQkgICAmJiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikpCi0JICAgIHRoaXNyZWxvY3MrKzsKLQotCSAgaWYgKCEgZmlyc3QKLQkgICAgICAmJiAodGhpc3JlbG9jcyArIHJlbG9jcyA+IGNvbmZpZy5zcGxpdF9ieV9yZWxvYwotCQkgIHx8IHRoaXNsaW5lcyArIGxpbmVzID4gY29uZmlnLnNwbGl0X2J5X3JlbG9jCi0JCSAgfHwgY29uZmlnLnNwbGl0X2J5X2ZpbGUpKQotCSAgICB7Ci0JICAgICAgLyogY3JlYXRlIGEgbmV3IHNlY3Rpb24gYW5kIHB1dCB0aGlzIGxpbmsgb3JkZXIgYW5kIHRoZQotCQkgZm9sbG93aW5nIGxpbmsgb3JkZXJzIGludG8gaXQgKi8KLQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmwgPSBwOwotCSAgICAgIGFzZWN0aW9uICpuID0gY2xvbmVfc2VjdGlvbiAoYWJmZCwgY3Vyc29yLCAmY291bnQpOwotCSAgICAgICpwcCA9IE5VTEw7CS8qIFNuaXAgb2ZmIGxpbmsgb3JkZXJzIGZyb20gb2xkIHNlY3Rpb24gKi8KLQkgICAgICBuLT5saW5rX29yZGVyX2hlYWQgPSBsOwkvKiBhdHRhY2ggdG8gbmV3IHNlY3Rpb24gKi8KLQkgICAgICBwcCA9ICZuLT5saW5rX29yZGVyX2hlYWQ7Ci0KLQkgICAgICAvKiBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIHNlY3Rpb24gYW5kCi0JCSB1cGRhdGUgdGhlIHZtYSBvZiB0aGUgbmV3IG9uZSAqLwotCi0JICAgICAgZHVtcCAoImJlZm9yZSBzbmlwIiwgY3Vyc29yLCBuKTsKLQotCSAgICAgIG4tPl9yYXdfc2l6ZSA9IGN1cnNvci0+X3Jhd19zaXplIC0gbC0+b2Zmc2V0OwotCSAgICAgIGN1cnNvci0+X3Jhd19zaXplID0gbC0+b2Zmc2V0OwotCi0JICAgICAgdm1hICs9IGN1cnNvci0+X3Jhd19zaXplOwotCSAgICAgIG4tPmxtYSA9IG4tPnZtYSA9IHZtYTsKLQotCSAgICAgIHNoaWZ0X29mZnNldCA9IGwtPm9mZnNldDsKLQotCSAgICAgIC8qIHJ1biBkb3duIHRoZSBjaGFpbiBhbmQgY2hhbmdlIHRoZSBvdXRwdXQgc2VjdGlvbiB0bwotCQkgdGhlIHJpZ2h0IG9uZSwgdXBkYXRlIHRoZSBvZmZzZXRzIHRvbyAqLwotCi0JICAgICAgd2hpbGUgKGwpCi0JCXsKLQkJICBsLT5vZmZzZXQgLT0gc2hpZnRfb2Zmc2V0OwotCQkgIGlmIChsLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQkgICAgewotCQkgICAgICBsLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gbjsKLQkJICAgICAgbC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gbC0+b2Zmc2V0OwotCQkgICAgfQotCQkgIGwgPSBsLT5uZXh0OwotCQl9Ci0JICAgICAgZHVtcCAoImFmdGVyIHNuaXAiLCBjdXJzb3IsIG4pOwotCSAgICAgIGN1cnNvciA9IG47Ci0JICAgICAgcmVsb2NzID0gdGhpc3JlbG9jczsKLQkgICAgICBsaW5lcyA9IHRoaXNsaW5lczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVsb2NzICs9IHRoaXNyZWxvY3M7Ci0JICAgICAgbGluZXMgKz0gdGhpc2xpbmVzOwotCSAgICB9Ci0KLQkgIGZpcnN0ID0gZmFsc2U7Ci0JfQotICAgIH0KLSAgc2FuaXR5X2NoZWNrIChhYmZkKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotbGR3cml0ZSAoKQotewotICAvKiBSZXNldCBlcnJvciBpbmRpY2F0b3IsIHdoaWNoIGNhbiB0eXBpY2FsbHkgc29tZXRoaW5nIGxpa2UgaW52YWxpZAotICAgICBmb3JtYXQgZnJvbSBvcGVubmluZyB1cCB0aGUgLm8gZmlsZXMgKi8KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGJ1aWxkX2xpbmtfb3JkZXIpOwotCi0gIGlmIChjb25maWcuc3BsaXRfYnlfcmVsb2MgfHwgY29uZmlnLnNwbGl0X2J5X2ZpbGUpCi0gICAgc3BsaXRfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBpZiAoIWJmZF9maW5hbF9saW5rIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVjb3JkZWQsIHByaW50IGl0IG91dC4gIE90aGVyd2lzZSBhc3N1bWUKLQkgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBsaWtlIHVua25vd24gc3ltYm9sIHdhcyBwcmludGVkCi0JIG91dC4gICovCi0KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19lcnJvcikKLQllaW5mbyAoXygiJUYlUDogZmluYWwgbGluayBmYWlsZWQ6ICVFXG4iKSwgb3V0cHV0X2JmZCk7Ci0gICAgICBlbHNlCi0JeGV4aXQoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvbGR3cml0ZS5oIGIvbGQvbGR3cml0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQ4YjUyLi4wMDAwMDAwCi0tLSBhL2xkL2xkd3JpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIGxkd3JpdGUuaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi12b2lkIGxkd3JpdGUgUEFSQU1TICgodm9pZCkpOwpkaWZmIC0tZ2l0IGEvbGQvbGV4c3VwLmMgYi9sZC9sZXhzdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0Nzg1Yi4uMDAwMDAwMAotLS0gYS9sZC9sZXhzdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDExNTYgKzAsMCBAQAotLyogUGFyc2Ugb3B0aW9ucyBmb3IgdGhlIEdOVSBsaW5rZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGR2ZXIuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLQotI2lmbmRlZiBQQVRIX1NFUEFSQVRPUgotI2lmIGRlZmluZWQgKF9fTVNET1NfXykgfHwgKGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pKQotI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAnOycKLSNlbHNlCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JwotI2VuZGlmCi0jZW5kaWYKLQotLyogU29tZXdoZXJlIGFib3ZlLCBzeXMvc3RhdC5oIGdvdCBpbmNsdWRlZCAuIC4gLiAuICovCi0jaWYgIWRlZmluZWQoU19JU0RJUikgJiYgZGVmaW5lZChTX0lGRElSKQotI2RlZmluZQlTX0lTRElSKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGRElSKQotI2VuZGlmCi0KLS8qIE9taXQgYXJncyB0byBhdm9pZCB0aGUgcG9zc2liaWxpdHkgb2YgY2xhc2hpbmcgd2l0aCBhIHN5c3RlbSBoZWFkZXIKLSAgIHRoYXQgbWlnaHQgZGlzYWdyZWUgYWJvdXQgY29uc3RzLiAgKi8KLXVuc2lnbmVkIGxvbmcgc3RydG91bCAoKTsKLQotc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZGlybGlzdCBQQVJBTVMgKChjaGFyICpkaXJsaXN0X3B0cikpOwotc3RhdGljIHZvaWQgc2V0X3NlY3Rpb25fc3RhcnQgUEFSQU1TICgoY2hhciAqc2VjdCwgY2hhciAqdmFsc3RyKSk7Ci1zdGF0aWMgdm9pZCBoZWxwIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIHByb2Nlc3NpbmcgYSAtLWRlZnN5bSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICAqLwotaW50IHBhcnNpbmdfZGVmc3ltID0gMDsKLQotLyogQ29kZXMgdXNlZCBmb3IgdGhlIGxvbmcgb3B0aW9ucyB3aXRoIG5vIHNob3J0IHN5bm9ueW1zLiAgMTUwIGlzbid0Ci0gICBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KLQotI2RlZmluZSBPUFRJT05fQVNTRVJUCQkJMTUwCi0jZGVmaW5lIE9QVElPTl9DQUxMX1NIQVJFRAkJKE9QVElPTl9BU1NFUlQgKyAxKQotI2RlZmluZSBPUFRJT05fQ1JFRgkJCShPUFRJT05fQ0FMTF9TSEFSRUQgKyAxKQotI2RlZmluZSBPUFRJT05fREVGU1lNCQkJKE9QVElPTl9DUkVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RFTUFOR0xFCQkJKE9QVElPTl9ERUZTWU0gKyAxKQotI2RlZmluZSBPUFRJT05fRFlOQU1JQ19MSU5LRVIJCShPUFRJT05fREVNQU5HTEUgKyAxKQotI2RlZmluZSBPUFRJT05fRUIJCQkoT1BUSU9OX0RZTkFNSUNfTElOS0VSICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VMCQkJKE9QVElPTl9FQiArIDEpCi0jZGVmaW5lIE9QVElPTl9FTUJFRERFRF9SRUxPQ1MJCShPUFRJT05fRUwgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUX0RZTkFNSUMJCShPUFRJT05fRU1CRURERURfUkVMT0NTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0hFTFAJCQkoT1BUSU9OX0VYUE9SVF9EWU5BTUlDICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lHTk9SRQkJCShPUFRJT05fSEVMUCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVAJCQkoT1BUSU9OX0lHTk9SRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19ERU1BTkdMRQkJKE9QVElPTl9NQVAgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fS0VFUF9NRU1PUlkJCShPUFRJT05fTk9fREVNQU5HTEUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fV0FSTl9NSVNNQVRDSAkJKE9QVElPTl9OT19LRUVQX01FTU9SWSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT0lOSElCSVRfRVhFQwkJKE9QVElPTl9OT19XQVJOX01JU01BVENIICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PTl9TSEFSRUQJCShPUFRJT05fTk9JTkhJQklUX0VYRUMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fV0hPTEVfQVJDSElWRQkJKE9QVElPTl9OT05fU0hBUkVEICsgMSkKLSNkZWZpbmUgT1BUSU9OX09GT1JNQVQJCQkoT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkUgKyAxKQotI2RlZmluZSBPUFRJT05fUkVMQVgJCQkoT1BUSU9OX09GT1JNQVQgKyAxKQotI2RlZmluZSBPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRQkoT1BUSU9OX1JFTEFYICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JQQVRICQkJKE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JQQVRIX0xJTksJCShPUFRJT05fUlBBVEggKyAxKQotI2RlZmluZSBPUFRJT05fU0hBUkVECQkJKE9QVElPTl9SUEFUSF9MSU5LICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NPTkFNRQkJCShPUFRJT05fU0hBUkVEICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NPUlRfQ09NTU9OCQkoT1BUSU9OX1NPTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TVEFUUwkJCShPUFRJT05fU09SVF9DT01NT04gKyAxKQotI2RlZmluZSBPUFRJT05fU1lNQk9MSUMJCQkoT1BUSU9OX1NUQVRTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RBU0tfTElOSwkJKE9QVElPTl9TWU1CT0xJQyArIDEpCi0jZGVmaW5lIE9QVElPTl9UQlNTCQkJKE9QVElPTl9UQVNLX0xJTksgKyAxKQotI2RlZmluZSBPUFRJT05fVERBVEEJCQkoT1BUSU9OX1RCU1MgKyAxKQotI2RlZmluZSBPUFRJT05fVFRFWFQJCQkoT1BUSU9OX1REQVRBICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVAkoT1BUSU9OX1RURVhUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1VSCQkJKE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSQk9TRQkJCShPUFRJT05fVVIgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTgkJCShPUFRJT05fVkVSQk9TRSArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OX1NDUklQVAkJKE9QVElPTl9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OCShPUFRJT05fVkVSU0lPTl9TQ1JJUFQgKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9DT01NT04JCShPUFRJT05fVkVSU0lPTl9FWFBPUlRTX1NFQ1RJT04gKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9DT05TVFJVQ1RPUlMJKE9QVElPTl9XQVJOX0NPTU1PTiArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX01VTFRJUExFX0dQCQkoT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fT05DRQkJKE9QVElPTl9XQVJOX01VTFRJUExFX0dQICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTgkoT1BUSU9OX1dBUk5fT05DRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TUExJVF9CWV9SRUxPQwkJKE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR04gKyAxKQotI2RlZmluZSBPUFRJT05fU1BMSVRfQllfRklMRSAJICAgIAkoT1BUSU9OX1NQTElUX0JZX1JFTE9DICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dIT0xFX0FSQ0hJVkUJCShPUFRJT05fU1BMSVRfQllfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9XUkFQCQkJKE9QVElPTl9XSE9MRV9BUkNISVZFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVgJCShPUFRJT05fV1JBUCArIDEpCi0jZGVmaW5lIE9QVElPTl9HQ19TRUNUSU9OUwkJKE9QVElPTl9GT1JDRV9FWEVfU1VGRklYICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0dDX1NFQ1RJT05TCQkoT1BUSU9OX0dDX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIRUNLX1NFQ1RJT05TCQkoT1BUSU9OX05PX0dDX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TCShPUFRJT05fQ0hFQ0tfU0VDVElPTlMgKyAxKQotI2RlZmluZSBPUFRJT05fTVBDODYwQzAgICAgICAgICAgICAgICAgIChPUFRJT05fTk9fQ0hFQ0tfU0VDVElPTlMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fVU5ERUZJTkVECQkoT1BUSU9OX01QQzg2MEMwICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lOSVQgICAgICAgICAgICAgICAgICAgICAoT1BUSU9OX05PX1VOREVGSU5FRCArIDEpCi0jZGVmaW5lIE9QVElPTl9GSU5JICAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9JTklUICsgMSkKLQotLyogVGhlIGxvbmcgb3B0aW9ucy4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGJvdGggdGhlIG9wdGlvbgotICAgcGFyc2luZyBhbmQgdGhlIGhlbHAgdGV4dC4gICovCi0KLXN0cnVjdCBsZF9vcHRpb24KLXsKLSAgLyogVGhlIGxvbmcgb3B0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IG9wdGlvbiBvcHQ7Ci0gIC8qIFRoZSBzaG9ydCBvcHRpb24gd2l0aCB0aGUgc2FtZSBtZWFuaW5nICgnXDAnIGlmIG5vbmUpLiAgKi8KLSAgY2hhciBzaG9ydG9wdDsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IChOVUxMIGlmIG5vbmUpLiAgKi8KLSAgY29uc3QgY2hhciAqYXJnOwotICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcuICBJZiB0aGlzIGlzIE5VTEwsIHRoaXMgaXMgYSBzeW5vbnltIGZvcgotICAgICB0aGUgcHJldmlvdXMgb3B0aW9uLiAgKi8KLSAgY29uc3QgY2hhciAqZG9jOwotICBlbnVtCi0gICAgewotICAgICAgLyogVXNlIG9uZSBkYXNoIGJlZm9yZSBsb25nIG9wdGlvbiBuYW1lLiAgKi8KLSAgICAgIE9ORV9EQVNILAotICAgICAgLyogVXNlIHR3byBkYXNoZXMgYmVmb3JlIGxvbmcgb3B0aW9uIG5hbWUuICAqLwotICAgICAgVFdPX0RBU0hFUywKLSAgICAgIC8qIERvbid0IG1lbnRpb24gdGhpcyBvcHRpb24gaW4gLS1oZWxwIG91dHB1dC4gICovCi0gICAgICBOT19IRUxQCi0gICAgfSBjb250cm9sOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBsZF9vcHRpb24gbGRfb3B0aW9uc1tdID0KLXsKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ2EnLCBOXygiS0VZV09SRCIpLCBOXygiU2hhcmVkIGxpYnJhcnkgY29udHJvbCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eSIpLAotICAgICAgT05FX0RBU0ggfSwKLSAgeyB7ImFyY2hpdGVjdHVyZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAotICAgICAgJ0EnLCBOXygiQVJDSCIpLCBOXygiU2V0IGFyY2hpdGVjdHVyZSIpICwgVFdPX0RBU0hFUyB9LAotICB7IHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdiJ30sCi0gICAgICAnYicsIE5fKCJUQVJHRVQiKSwgTl8oIlNwZWNpZnkgdGFyZ2V0IGZvciBmb2xsb3dpbmcgaW5wdXQgZmlsZXMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibXJpLXNjcmlwdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYyd9LAotICAgICAgJ2MnLCBOXygiRklMRSIpLCBOXygiUmVhZCBNUkkgZm9ybWF0IGxpbmtlciBzY3JpcHQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZGMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2QnfSwKLSAgICAgICdkJywgTlVMTCwgTl8oIkZvcmNlIGNvbW1vbiBzeW1ib2xzIHRvIGJlIGRlZmluZWQiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImRwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsiZW50cnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKLSAgICAgICdlJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBzdGFydCBhZGRyZXNzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImV4cG9ydC1keW5hbWljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlRfRFlOQU1JQ30sCi0gICAgICAnRScsIE5VTEwsIE5fKCJFeHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUJ9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkxpbmsgYmlnLWVuZGlhbiBvYmplY3RzIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUx9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJhdXhpbGlhcnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgICAgICdmJywgTl8oIlNITElCIiksIE5fKCJBdXhpbGlhcnkgZmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsiZmlsdGVyIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdGJ30sCi0gICAgICAnRicsIE5fKCJTSExJQiIpLCBOXygiRmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdnJywgTlVMTCwgTl8oIklnbm9yZWQiKSwgT05FX0RBU0ggfSwKLSAgeyB7Imdwc2l6ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRyd9LAotICAgICAgJ0cnLCBOXygiU0laRSIpLCBOXygiU21hbGwgZGF0YSBzaXplIChpZiBubyBzaXplLCBzYW1lIGFzIC0tc2hhcmVkKSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsic29uYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TT05BTUV9LAotICAgICAgJ2gnLCBOXygiRklMRU5BTUUiKSwgTl8oIlNldCBpbnRlcm5hbCBuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJsaWJyYXJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gICAgICAnbCcsIE5fKCJMSUJOQU1FIiksIE5fKCJTZWFyY2ggZm9yIGxpYnJhcnkgTElCTkFNRSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJsaWJyYXJ5LXBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0wnfSwKLSAgICAgICdMJywgTl8oIkRJUkVDVE9SWSIpLCBOXygiQWRkIERJUkVDVE9SWSB0byBsaWJyYXJ5IHNlYXJjaCBwYXRoIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ20nLCBOXygiRU1VTEFUSU9OIiksIE5fKCJTZXQgZW11bGF0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJwcmludC1tYXAiLCBub19hcmd1bWVudCwgTlVMTCwgJ00nfSwKLSAgICAgICdNJywgTlVMTCwgTl8oIlByaW50IG1hcCBmaWxlIG9uIHN0YW5kYXJkIG91dHB1dCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJubWFnaWMiLCBub19hcmd1bWVudCwgTlVMTCwgJ24nfSwKLSAgICAgICduJywgTlVMTCwgTl8oIkRvIG5vdCBwYWdlIGFsaWduIGRhdGEiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsib21hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsICdOJ30sCi0gICAgICAnTicsIE5VTEwsIE5fKCJEbyBub3QgcGFnZSBhbGlnbiBkYXRhLCBkbyBub3QgbWFrZSB0ZXh0IHJlYWRvbmx5IiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJvdXRwdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ28nfSwKLSAgICAgICdvJywgTl8oIkZJTEUiKSwgTl8oIlNldCBvdXRwdXQgZmlsZSBuYW1lIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ08nLCBOVUxMLCBOXygiT3B0aW1pemUgb3V0cHV0IGZpbGUiKSwgT05FX0RBU0ggfSwKLSAgeyB7IlF5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIklnbm9yZWQgZm9yIFNWUjQgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHsicmVsb2NhdGVhYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdyJ30sCi0gICAgICAncicsIE5VTEwsIE5fKCJHZW5lcmF0ZSByZWxvY2F0ZWFibGUgb3V0cHV0IiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ2knLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsianVzdC1zeW1ib2xzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdSJ30sCi0gICAgICAnUicsIE5fKCJGSUxFIiksIE5fKCJKdXN0IGxpbmsgc3ltYm9scyAoaWYgZGlyZWN0b3J5LCBzYW1lIGFzIC0tcnBhdGgpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJzdHJpcC1hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ3MnfSwKLSAgICAgICdzJywgTlVMTCwgTl8oIlN0cmlwIGFsbCBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InN0cmlwLWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsICdTJ30sCi0gICAgICAnUycsIE5VTEwsIE5fKCJTdHJpcCBkZWJ1Z2dpbmcgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0cmFjZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndCd9LAotICAgICAgJ3QnLCBOVUxMLCBOXygiVHJhY2UgZmlsZSBvcGVucyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJzY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgICAgICdUJywgTl8oIkZJTEUiKSwgTl8oIlJlYWQgbGlua2VyIHNjcmlwdCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ1bmRlZmluZWQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3UnfSwKLSAgICAgICd1JywgTl8oIlNZTUJPTCIpLCBOXygiU3RhcnQgd2l0aCB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJVciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVVJ9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkJ1aWxkIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRhYmxlcyIpLCBPTkVfREFTSCB9LAotICB7IHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTn0sCi0gICAgICAndicsIE5VTEwsIE5fKCJQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ1YnLCBOVUxMLCBOXygiUHJpbnQgdmVyc2lvbiBhbmQgZW11bGF0aW9uIGluZm9ybWF0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJkaXNjYXJkLWFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAneCd9LAotICAgICAgJ3gnLCBOVUxMLCBOXygiRGlzY2FyZCBhbGwgbG9jYWwgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkaXNjYXJkLWxvY2FscyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnWCd9LAotICAgICAgJ1gnLCBOVUxMLCBOXygiRGlzY2FyZCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0cmFjZS1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3knfSwKLSAgICAgICd5JywgTl8oIlNZTUJPTCIpLCBOXygiVHJhY2UgbWVudGlvbnMgb2YgU1lNQk9MIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ1knLCBOXygiUEFUSCIpLCBOXygiRGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5IiksIE9ORV9EQVNIIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICd6JywgTl8oIktFWVdPUkQiKSwgTl8oIklnbm9yZWQgZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHsic3RhcnQtZ3JvdXAiLCBub19hcmd1bWVudCwgTlVMTCwgJygnfSwKLSAgICAgICcoJywgTlVMTCwgTl8oIlN0YXJ0IGEgZ3JvdXAiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZW5kLWdyb3VwIiwgbm9fYXJndW1lbnQsIE5VTEwsICcpJ30sCi0gICAgICAnKScsIE5VTEwsIE5fKCJFbmQgYSBncm91cCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJhc3NlcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FTU0VSVH0sCi0gICAgICAnXDAnLCBOXygiS0VZV09SRCIpLCBOXygiSWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHsiQmR5bmFtaWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIpLCBPTkVfREFTSCB9LAotICB7IHsiZHkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJjYWxsX3NoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0FMTF9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7IkJzdGF0aWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIpLCBPTkVfREFTSCB9LAotICB7IHsiZG4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7Im5vbl9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7InN0YXRpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9OX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsiQnN5bWJvbGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TWU1CT0xJQ30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiQmluZCBnbG9iYWwgcmVmZXJlbmNlcyBsb2NhbGx5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJjaGVjay1zZWN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0hFQ0tfU0VDVElPTlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyAoZGVmYXVsdCkiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm8tY2hlY2stc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEbyBub3QgY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG92ZXJsYXBzIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJjcmVmIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DUkVGfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJPdXRwdXQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRlZnN5bSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVGU1lNfSwKLSAgICAgICdcMCcsIE5fKCJTWU1CT0w9RVhQUkVTU0lPTiIpLCBOXygiRGVmaW5lIGEgc3ltYm9sIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERU1BTkdMRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRGVtYW5nbGUgc3ltYm9sIG5hbWVzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImR5bmFtaWMtbGlua2VyIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EWU5BTUlDX0xJTktFUn0sCi0gICAgICAnXDAnLCBOXygiUFJPR1JBTSIpLCBOXygiU2V0IHRoZSBkeW5hbWljIGxpbmtlciB0byB1c2UiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZW1iZWRkZWQtcmVsb2NzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTUJFRERFRF9SRUxPQ1N9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkdlbmVyYXRlIGVtYmVkZGVkIHJlbG9jcyIpLCBUV09fREFTSEVTfSwKLSAgeyB7ImZpbmkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZJTkl9LAotICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJDYWxsIFNZTUJPTCBhdCB1bmxvYWQtdGltZSIpLCBPTkVfREFTSCB9LAotICB7IHsiZm9yY2UtZXhlLXN1ZmZpeCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRm9yY2UgZ2VuZXJhdGlvbiBvZiBmaWxlIHdpdGggLmV4ZSBzdWZmaXgiKSwgVFdPX0RBU0hFU30sCi0gIHsgeyJnYy1zZWN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fR0NfU0VDVElPTlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKG9uIHNvbWUgdGFyZ2V0cykiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vLWdjLXNlY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19HQ19TRUNUSU9OU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG9uJ3QgcmVtb3ZlIHVudXNlZCBzZWN0aW9ucyAoZGVmYXVsdCkiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hFTFB9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlByaW50IG9wdGlvbiBoZWxwIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImluaXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lOSVR9LAotICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJDYWxsIFNZTUJPTCBhdCBsb2FkLXRpbWUiKSwgT05FX0RBU0ggfSwKLSAgeyB7Ik1hcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFQfSwKLSAgICAgICdcMCcsIE5fKCJGSUxFIiksIE5fKCJXcml0ZSBhIG1hcCBmaWxlIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJuby1kZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fREVNQU5HTEUgfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEbyBub3QgZGVtYW5nbGUgc3ltYm9sIG5hbWVzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vLWtlZXAtbWVtb3J5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19LRUVQX01FTU9SWX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiVXNlIGxlc3MgbWVtb3J5IGFuZCBtb3JlIGRpc2sgSS9PIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vLXVuZGVmaW5lZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fVU5ERUZJTkVEfSwKLSAgICAgJ1wwJywgTlVMTCwgTl8oIkFsbG93IG5vIHVuZGVmaW5lZCBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vLXdhcm4tbWlzbWF0Y2giLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0h9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvbid0IHdhcm4gYWJvdXQgbWlzbWF0Y2hlZCBpbnB1dCBmaWxlcyIpLCBUV09fREFTSEVTfSwKLSAgeyB7Im5vLXdob2xlLWFyY2hpdmUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlR1cm4gb2ZmIC0td2hvbGUtYXJjaGl2ZSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJub2luaGliaXQtZXhlYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9JTkhJQklUX0VYRUN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkNyZWF0ZSBhbiBvdXRwdXQgZmlsZSBldmVuIGlmIGVycm9ycyBvY2N1ciIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJub2luaGliaXRfZXhlYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9JTkhJQklUX0VYRUN9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgTk9fSEVMUCB9LAotICB7IHsib2Zvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT0ZPUk1BVH0sCi0gICAgICAnXDAnLCBOXygiVEFSR0VUIiksIE5fKCJTcGVjaWZ5IHRhcmdldCBvZiBvdXRwdXQgZmlsZSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJxbWFnaWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiSWdub3JlZCBmb3IgTGludXggY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJSZWxheCBicmFuY2hlcyBvbiBjZXJ0YWluIHRhcmdldHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicmV0YWluLXN5bWJvbHMtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLAotICAgICAgIE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFfSwKLSAgICAgICdcMCcsIE5fKCJGSUxFIiksIE5fKCJLZWVwIG9ubHkgc3ltYm9scyBsaXN0ZWQgaW4gRklMRSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJycGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUlBBVEh9LAotICAgICAgJ1wwJywgTl8oIlBBVEgiKSwgTl8oIlNldCBydW50aW1lIHNoYXJlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJycGF0aC1saW5rIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SUEFUSF9MSU5LfSwKLSAgICAgICdcMCcsIE5fKCJQQVRIIiksIE5fKCJTZXQgbGluayB0aW1lIHNoYXJlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJzaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkiKSwgT05FX0RBU0ggfSwKLSAgeyB7IkJzaGFyZWFibGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NIQVJFRCB9LCAvKiBGcmVlQlNELiAgKi8KLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJzb3J0LWNvbW1vbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU09SVF9DT01NT059LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlNvcnQgY29tbW9uIHN5bWJvbHMgYnkgc2l6ZSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJzb3J0X2NvbW1vbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU09SVF9DT01NT059LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgTk9fSEVMUCB9LAotICB7IHsic3BsaXQtYnktZmlsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1BMSVRfQllfRklMRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiU3BsaXQgb3V0cHV0IHNlY3Rpb25zIGZvciBlYWNoIGZpbGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic3BsaXQtYnktcmVsb2MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NQTElUX0JZX1JFTE9DfSwKLSAgICAgICdcMCcsIE5fKCJDT1VOVCIpLCBOXygiU3BsaXQgb3V0cHV0IHNlY3Rpb25zIGV2ZXJ5IENPVU5UIHJlbG9jcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJzdGF0cyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBVFN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlByaW50IG1lbW9yeSB1c2FnZSBzdGF0aXN0aWNzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InRhc2stbGluayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEFTS19MSU5LfSwKLSAgICAgICdcMCcsIE5fKCJTWU1CT0wiKSwgTl8oIkRvIHRhc2sgbGV2ZWwgbGlua2luZyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0cmFkaXRpb25hbC1mb3JtYXQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBsaW5rZXIiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiVGJzcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEJTU30sCi0gICAgICAnXDAnLCBOXygiQUREUkVTUyIpLCBOXygiU2V0IGFkZHJlc3Mgb2YgLmJzcyBzZWN0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJUZGF0YSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVERBVEF9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC5kYXRhIHNlY3Rpb24iKSwgT05FX0RBU0ggfSwKLSAgeyB7IlR0ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UVEVYVH0sCi0gICAgICAnXDAnLCBOXygiQUREUkVTUyIpLCBOXygiU2V0IGFkZHJlc3Mgb2YgLnRleHQgc2VjdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSQk9TRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiT3V0cHV0IGxvdHMgb2YgaW5mb3JtYXRpb24gZHVyaW5nIGxpbmsiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZGxsLXZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LCAvKiBMaW51eC4gICovCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBOT19IRUxQIH0sCi0gIHsgeyJ2ZXJzaW9uLXNjcmlwdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTl9TQ1JJUFQgfSwKLSAgICAgICdcMCcsIE5fKCJGSUxFIiksIE5fKCJSZWFkIHZlcnNpb24gaW5mb3JtYXRpb24gc2NyaXB0IiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InZlcnNpb24tZXhwb3J0cy1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsCi0gICAgIE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTiB9LAotICAgICdcMCcsIE5fKCJTWU1CT0wiKSwgTl8oIlRha2UgZXhwb3J0IHN5bWJvbHMgbGlzdCBmcm9tIC5leHBvcnRzLCB1c2luZ1xuXHRcdFx0XHRTWU1CT0wgYXMgdGhlIHZlcnNpb24uIiksCi0gICAgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGFib3V0IGR1cGxpY2F0ZSBjb21tb24gc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ3YXJuLWNvbnN0cnVjdG9ycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9DT05TVFJVQ1RPUlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgZ2xvYmFsIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBhcmUgc2VlbiIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1tdWx0aXBsZS1ncCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9NVUxUSVBMRV9HUH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBpZiB0aGUgbXVsdGlwbGUgR1AgdmFsdWVzIGFyZSB1c2VkIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tb25jZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9PTkNFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIG9ubHkgb25jZSBwZXIgdW5kZWZpbmVkIHN5bWJvbCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ3YXJuLXNlY3Rpb24tYWxpZ24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBpZiBzdGFydCBvZiBzZWN0aW9uIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudCIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsid2hvbGUtYXJjaGl2ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0hPTEVfQVJDSElWRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiSW5jbHVkZSBhbGwgb2JqZWN0cyBmcm9tIGZvbGxvd2luZyBhcmNoaXZlcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ3cmFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XUkFQfSwKLSAgICAgICdcMCcsIE5fKCJTWU1CT0wiKSwgTl8oIlVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgU1lNQk9MIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im1wYzg2MGMwIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NUEM4NjBDMH0sCi0gICAgICAnXDAnLCBOXygiWz1XT1JEU10iKSwgTl8oIk1vZGlmeSBwcm9ibGVtYXRpYyBicmFuY2hlcyBpbiBsYXN0IFdPUkRTICgxLTEwLFxuXHRcdFx0XHRkZWZhdWx0IDUpIHdvcmRzIG9mIGEgcGFnZSIpLCBUV09fREFTSEVTIH0KLX07Ci0KLSNkZWZpbmUgT1BUSU9OX0NPVU5UICgoaW50KSAoc2l6ZW9mIGxkX29wdGlvbnMgLyBzaXplb2YgbGRfb3B0aW9uc1swXSkpCi0KLS8qIFRlc3QgInN0cmluZyIgZm9yIGNvbnRhaW5pbmcgYSBzdHJpbmcgb2YgZGlnaXRzIHRoYXQgZm9ybSBhIG51bWJlcgotYmV0d2VlbiAibWluIiBhbmQgIm1heCIuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb3IgImVyciIuICovCi1zdGF0aWMKLWludCBpc19udW0oIGNoYXIgKnN0cmluZywgaW50IG1pbiwgaW50IG1heCwgaW50IGVycikKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgZm9yICggOyAqc3RyaW5nOyArK3N0cmluZykKLSAgewotICAgIGlmICghaXNkaWdpdCgqc3RyaW5nKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlcnI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyAoKnN0cmluZyAtICcwJyk7Ci0gIH0KLSAgaWYgKHJlc3VsdCA8IG1pbiB8fCByZXN1bHQgPiBtYXgpCi0gICAgcmVzdWx0ID0gZXJyOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQKLXBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGksIGlzLCBpbDsKLSAgaW50IGluZ3JvdXAgPSAwOwotICBjaGFyICpkZWZhdWx0X2Rpcmxpc3QgPSBOVUxMOwotICBjaGFyIHNob3J0b3B0c1tPUFRJT05fQ09VTlQgKiAzICsgMl07Ci0gIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbT1BUSU9OX0NPVU5UICsgMV07Ci0gIGludCBsYXN0X29wdGluZDsKLQotICAvKiBTdGFydGluZyB0aGUgc2hvcnQgb3B0aW9uIHN0cmluZyB3aXRoICctJyBpcyBmb3IgcHJvZ3JhbXMgdGhhdAotICAgICBleHBlY3Qgb3B0aW9ucyBhbmQgb3RoZXIgQVJHVi1lbGVtZW50cyBpbiBhbnkgb3JkZXIgYW5kIHRoYXQgY2FyZSBhYm91dAotICAgICB0aGUgb3JkZXJpbmcgb2YgdGhlIHR3by4gIFdlIGRlc2NyaWJlIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQKLSAgICAgYXMgaWYgaXQgd2VyZSB0aGUgYXJndW1lbnQgb2YgYW4gb3B0aW9uIHdpdGggY2hhcmFjdGVyIGNvZGUgMS4gICovCi0gIHNob3J0b3B0c1swXSA9ICctJzsKLSAgaXMgPSAxOwotICBpbCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBPUFRJT05fQ09VTlQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobGRfb3B0aW9uc1tpXS5zaG9ydG9wdCAhPSAnXDAnKQotCXsKLQkgIHNob3J0b3B0c1tpc10gPSBsZF9vcHRpb25zW2ldLnNob3J0b3B0OwotCSAgKytpczsKLQkgIGlmIChsZF9vcHRpb25zW2ldLm9wdC5oYXNfYXJnID09IHJlcXVpcmVkX2FyZ3VtZW50Ci0JICAgICAgfHwgbGRfb3B0aW9uc1tpXS5vcHQuaGFzX2FyZyA9PSBvcHRpb25hbF9hcmd1bWVudCkKLQkgICAgewotCSAgICAgIHNob3J0b3B0c1tpc10gPSAnOic7Ci0JICAgICAgKytpczsKLQkgICAgICBpZiAobGRfb3B0aW9uc1tpXS5vcHQuaGFzX2FyZyA9PSBvcHRpb25hbF9hcmd1bWVudCkKLQkJewotCQkgIHNob3J0b3B0c1tpc10gPSAnOic7Ci0JCSAgKytpczsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKGxkX29wdGlvbnNbaV0ub3B0Lm5hbWUgIT0gTlVMTCkKLQl7Ci0JICBsb25nb3B0c1tpbF0gPSBsZF9vcHRpb25zW2ldLm9wdDsKLQkgICsraWw7Ci0JfQotICAgIH0KLSAgc2hvcnRvcHRzW2lzXSA9ICdcMCc7Ci0gIGxvbmdvcHRzW2lsXS5uYW1lID0gTlVMTDsKLQotICAvKiBUaGUgLUcgb3B0aW9uIGlzIGFtYmlndW91cyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLiAgU29tZXRpbWVzIGl0Ci0gICAgIHNwZWNpZmllcyB0aGUgbGFyZ2VzdCBkYXRhIHNpemUgdG8gcHV0IGludG8gdGhlIHNtYWxsIGRhdGEKLSAgICAgc2VjdGlvbi4gIFNvbWV0aW1lcyBpdCBpcyBlcXVpdmFsZW50IHRvIC0tc2hhcmVkLiAgVW5mb3J0dW5hdGVseSwKLSAgICAgdGhlIGZpcnN0IGZvcm0gdGFrZXMgYW4gYXJndW1lbnQsIHdoaWxlIHRoZSBzZWNvbmQgZG9lcyBub3QuCi0KLSAgICAgV2UgbmVlZCB0byBwZXJtaXQgdGhlIC0tc2hhcmVkIGZvcm0gYmVjYXVzZSBvbiBzb21lIHBsYXRmb3JtcywKLSAgICAgc3VjaCBhcyBTb2xhcmlzLCBnY2MgLXNoYXJlZCB3aWxsIHBhc3MgLUcgdG8gdGhlIGxpbmtlci4KLQotICAgICBUbyBwZXJtaXQgZWl0aGVyIHVzYWdlLCB3ZSBsb29rIHRocm91Z2ggdGhlIGFyZ3VtZW50IGxpc3QuICBJZiB3ZQotICAgICBmaW5kIC1HIG5vdCBmb2xsb3dlZCBieSBhIG51bWJlciwgd2UgY2hhbmdlIGl0IGludG8gLS1zaGFyZWQuCi0gICAgIFRoaXMgd2lsbCB3b3JrIGZvciBtb3N0IG5vcm1hbCBjYXNlcy4gICovCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1HIikgPT0gMAotCSYmIChpICsgMSA+PSBhcmdjCi0JICAgIHx8ICEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGFyZ3ZbaSArIDFdWzBdKSkpCi0gICAgICBhcmd2W2ldID0gKGNoYXIgKikgIi0tc2hhcmVkIjsKLQotICAvKiBCZWNhdXNlIHdlIHBlcm1pdCBsb25nIG9wdGlvbnMgdG8gc3RhcnQgd2l0aCBhIHNpbmdsZSBkYXNoLCBhbmQKLSAgICAgd2UgaGF2ZSBhIC0tbGlicmFyeSBvcHRpb24sIGFuZCB0aGUgLWwgb3B0aW9uIGlzIGNvbnZlbnRpb25hbGx5Ci0gICAgIHVzZWQgd2l0aCBhbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYXJndW1lbnQsIHdlIGNhbiBoYXZlIGJhZAotICAgICByZXN1bHRzIGlmIHNvbWVib2R5IHRyaWVzIHRvIHVzZSAtbCB3aXRoIGEgbGlicmFyeSB3aG9zZSBuYW1lCi0gICAgIGhhcHBlbnMgdG8gc3RhcnQgd2l0aCAiaWJyYXJ5IiwgYXMgaW4gLWxpLiAgV2UgYXZvaWQgcHJvYmxlbXMgYnkKLSAgICAgc2ltcGx5IHR1cm5pbmcgLWwgaW50byAtLWxpYnJhcnkuICBUaGlzIG1lYW5zIHRoYXQgdXNlcnMgd2lsbAotICAgICBoYXZlIHRvIHVzZSB0d28gZGFzaGVzIGluIG9yZGVyIHRvIHVzZSAtLWxpYnJhcnksIHdoaWNoIGlzIE9LCi0gICAgIHNpbmNlIHRoYXQncyBob3cgaXQgaXMgZG9jdW1lbnRlZC4KLQotICAgICBGSVhNRTogSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgcHJvYmxlbSBjYW4gYXJpc2UgZm9yIG90aGVyIHNob3J0Ci0gICAgIG9wdGlvbnMgYXMgd2VsbCwgYWx0aG91Z2ggdGhlIHVzZXIgZG9lcyBhbHdheXMgaGF2ZSB0aGUgcmVjb3Vyc2UKLSAgICAgb2YgYWRkaW5nIGEgc3BhY2UgYmV0d2VlbiB0aGUgb3B0aW9uIGFuZCB0aGUgYXJndW1lbnQuICAqLwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChhcmd2W2ldWzBdID09ICctJwotCSAgJiYgYXJndltpXVsxXSA9PSAnbCcKLQkgICYmIGFyZ3ZbaV1bMl0gIT0gJ1wwJykKLQl7Ci0JICBjaGFyICpuOwotCi0JICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChhcmd2W2ldKSArIDIwKTsKLQkgIHNwcmludGYgKG4sICItLWxpYnJhcnk9JXMiLCBhcmd2W2ldICsgMik7Ci0JICBhcmd2W2ldID0gbjsKLQl9Ci0gICAgfQotCi0gIGxhc3Rfb3B0aW5kID0gLTE7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCBsb25naW5kOwotICAgICAgaW50IG9wdGM7Ci0KLSAgICAgIC8qIFVzaW5nIGxhc3Rfb3B0aW5kIGxldHMgdXMgYXZvaWQgY2FsbGluZyBsZGVtdWxfcGFyc2VfYXJncwotCSBtdWx0aXBsZSB0aW1lcyBvbiBhIHNpbmdsZSBvcHRpb24sIHdoaWNoIHdvdWxkIGxlYWQgdG8KLQkgY29uZnVzaW9uIGluIHRoZSBpbnRlcm5hbCBzdGF0aWMgdmFyaWFibGVzIG1haW50YWluZWQgYnkKLQkgZ2V0b3B0LiAgVGhpcyBjb3VsZCBvdGhlcndpc2UgaGFwcGVuIGZvciBhbiBhcmd1bWVudCBsaWtlCi0JIC1ueCwgaW4gd2hpY2ggdGhlIC1uIGlzIHBhcnNlZCBhcyBhIHNpbmdsZSBvcHRpb24sIGFuZCB3ZQotCSBsb29wIGFyb3VuZCB0byBwaWNrIHVwIHRoZSAteC4gICovCi0gICAgICBpZiAob3B0aW5kICE9IGxhc3Rfb3B0aW5kKQotCXsKLQkgIGlmIChsZGVtdWxfcGFyc2VfYXJncyAoYXJnYywgYXJndikpCi0JICAgIGNvbnRpbnVlOwotCSAgbGFzdF9vcHRpbmQgPSBvcHRpbmQ7Ci0JfQotCi0gICAgICAvKiBnZXRvcHRfbG9uZ19vbmx5IGlzIGxpa2UgZ2V0b3B0X2xvbmcsIGJ1dCAnLScgYXMgd2VsbCBhcyAnLS0nCi0JIGNhbiBpbmRpY2F0ZSBhIGxvbmcgb3B0aW9uLiAgKi8KLSAgICAgIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCBzaG9ydG9wdHMsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0KLSAgICAgIGlmIChvcHRjID09IC0xKQotCWJyZWFrOwotICAgICAgc3dpdGNoIChvcHRjKQotCXsKLQlkZWZhdWx0OgotCSAgeGV4aXQgKDEpOwotCWNhc2UgMToJCQkvKiBGaWxlIG5hbWUuICAqLwotCSAgbGFuZ19hZGRfaW5wdXRfZmlsZSAob3B0YXJnLCBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JR05PUkU6Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIC8qIEZvciBIUC9VWCBjb21wYXRpYmlsaXR5LiAgQWN0dWFsbHkgLWEgc2hhcmVkIHNob3VsZCBtZWFuCi0gICAgICAgICAgICAgYGB1c2Ugb25seSBzaGFyZWQgbGlicmFyaWVzJycgYnV0LCB0aGVuLCB3ZSBkb24ndAotICAgICAgICAgICAgIGN1cnJlbnRseSBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gSFAvVVggYW55aG93LiAgKi8KLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgImFyY2hpdmUiKSA9PSAwKQotCSAgICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgInNoYXJlZCIpID09IDAKLQkJICAgfHwgc3RyY21wIChvcHRhcmcsICJkZWZhdWx0IikgPT0gMCkKLQkgICAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiB1bnJlY29nbml6ZWQgLWEgb3B0aW9uIGAlcydcbiIpLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQVNTRVJUOgotCSAgLyogRklYTUU6IFdlIGp1c3QgaWdub3JlIHRoZXNlLCBidXQgd2Ugc2hvdWxkIGhhbmRsZSB0aGVtLiAgKi8KLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgImRlZmluaXRpb25zIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub2RlZmluaXRpb25zIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub3N5bWJvbGljIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJwdXJlLXRleHQiKSA9PSAwKQotCSAgICA7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiB1bnJlY29nbml6ZWQgLWFzc2VydCBvcHRpb24gYCVzJ1xuIiksIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdBJzoKLQkgIGxkZmlsZV9hZGRfYXJjaCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgbGFuZ19hZGRfdGFyZ2V0IChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9tcmlfc2NyaXB0OwotCSAgeXlwYXJzZSAoKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NBTExfU0hBUkVEOgotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT05fU0hBUkVEOgotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ1JFRjoKLQkgIGNvbW1hbmRfbGluZS5jcmVmID0gdHJ1ZTsKLQkgIGxpbmtfaW5mby5ub3RpY2VfYWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RFRlNZTToKLQkgIGxleF9zdHJpbmcgPSBvcHRhcmc7Ci0JICBsZXhfcmVkaXJlY3QgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9kZWZzeW07Ci0JICBwYXJzaW5nX2RlZnN5bSA9IDE7Ci0JICB5eXBhcnNlICgpOwotCSAgcGFyc2luZ19kZWZzeW0gPSAwOwotCSAgbGV4X3N0cmluZyA9IE5VTEw7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERU1BTkdMRToKLQkgIGRlbWFuZ2xpbmcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFlOQU1JQ19MSU5LRVI6Ci0JICBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FQjoKLQkgIGNvbW1hbmRfbGluZS5lbmRpYW4gPSBFTkRJQU5fQklHOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRUw6Ci0JICBjb21tYW5kX2xpbmUuZW5kaWFuID0gRU5ESUFOX0xJVFRMRTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VNQkVEREVEX1JFTE9DUzoKLQkgIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRVhQT1JUX0RZTkFNSUM6Ci0JY2FzZSAnRSc6IC8qIEhQL1VYIGNvbXBhdGliaWxpdHkuICAqLwotCSAgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgbGFuZ19hZGRfZW50cnkgKG9wdGFyZywgdHJ1ZSk7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGlmIChjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycyA9Ci0JCShjaGFyICoqKSB4bWFsbG9jICgyICogc2l6ZW9mIChjaGFyICopKTsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnNbMF0gPSBvcHRhcmc7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzWzFdID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGM7Ci0JICAgICAgY2hhciAqKnA7Ci0KLQkgICAgICBjID0gMDsKLQkgICAgICBmb3IgKHAgPSBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnM7ICpwICE9IE5VTEw7IHArKykKLQkJKytjOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycyA9Ci0JCShjaGFyICoqKSB4cmVhbGxvYyAoY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzLAotCQkJCSAgICAoYyArIDIpICogc2l6ZW9mIChjaGFyICopKTsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnNbY10gPSBvcHRhcmc7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzW2MgKyAxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgY29tbWFuZF9saW5lLmZpbHRlcl9zaGxpYiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVg6Ci0JICBjb21tYW5kX2xpbmUuZm9yY2VfZXhlX3N1ZmZpeCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdHJzoKLQkgIHsKLQkgICAgY2hhciAqZW5kOwotCSAgICBnX3N3aXRjaF92YWx1ZSA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0JICAgIGlmICgqZW5kKQotCSAgICAgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIG51bWJlciBgJXMnXG4iKSwgb3B0YXJnKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgLyogSWdub3JlLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0dDX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0hFTFA6Ci0JICBoZWxwICgpOwotCSAgeGV4aXQgKDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAob3B0YXJnLCB0cnVlKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbGFuZ19hZGRfaW5wdXRfZmlsZSAob3B0YXJnLCBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6Ci0JICBjb25maWcubWFwX2ZpbGVuYW1lID0gIi0iOwotCSAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICAvKiBJZ25vcmUuICBXYXMgaGFuZGxlZCBpbiBhIHByZS1wYXJzZS4gICAqLwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTUFQOgotCSAgY29uZmlnLm1hcF9maWxlbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSBmYWxzZTsKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFTUFOR0xFOgotCSAgZGVtYW5nbGluZyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fR0NfU0VDVElPTlM6Ci0JICBjb21tYW5kX2xpbmUuZ2Nfc2VjdGlvbnMgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0tFRVBfTUVNT1JZOgotCSAgbGlua19pbmZvLmtlZXBfbWVtb3J5ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19VTkRFRklORUQ6Ci0JICBsaW5rX2luZm8ubm9fdW5kZWZpbmVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0g6Ci0JICBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9JTkhJQklUX0VYRUM6Ci0JICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fV0hPTEVfQVJDSElWRToKLQkgIHdob2xlX2FyY2hpdmUgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCSAgLyogRklYTUUgIi1PPG5vbi1kaWdpdHM+IDx2YWx1ZT4iIHVzZWQgdG8gc2V0IHRoZSBhZGRyZXNzIG9mCi0JICAgICBzZWN0aW9uIDxub24tZGlnaXRzPi4gIFdhcyB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLQkgICAgIHNvbWV0aGluZywgb3IgY2FuIHdlIGNyZWF0ZSBhIG5ldyBvcHRpb24gdG8gZG8gdGhhdAotCSAgICAgKHdpdGggYSBzeW50YXggc2ltaWxhciB0byAtZGVmc3ltKT8KLQkgICAgIGdldG9wdCBjYW4ndCBoYW5kbGUgdHdvIGFyZ3MgdG8gYW4gb3B0aW9uIHdpdGhvdXQga2x1ZGdlcy4gICovCi0KLQkgIC8qIEVuYWJsZSBvcHRpbWl6YXRpb25zIG9mIG91dHB1dCBmaWxlcy4gICovCi0JICBsaW5rX2luZm8ub3B0aW1pemUgPSBzdHJ0b3VsIChvcHRhcmcsIE5VTEwsIDApID8gdHJ1ZSA6IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBsYW5nX2FkZF9vdXRwdXQgKG9wdGFyZywgMCk7IAotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fT0ZPUk1BVDoKLQkgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQgKG9wdGFyZywgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMCk7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQljYXNlICdyJzoKLQkgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSB0cnVlOwotCSAgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9IGZhbHNlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIC8qIFRoZSBHTlUgbGlua2VyIHRyYWRpdGlvbmFsbHkgdXNlcyAtUiB0byBtZWFuIHRvIGluY2x1ZGUKLQkgICAgIG9ubHkgdGhlIHN5bWJvbHMgZnJvbSBhIGZpbGUuICBUaGUgU29sYXJpcyBsaW5rZXIgdXNlcyAtUgotCSAgICAgdG8gc2V0IHRoZSBwYXRoIHVzZWQgYnkgdGhlIHJ1bnRpbWUgbGlua2VyIHRvIGZpbmQKLQkgICAgIGxpYnJhcmllcy4gIFRoaXMgaXMgdGhlIEdOVSBsaW5rZXIgLXJwYXRoIGFyZ3VtZW50LiAgV2UKLQkgICAgIHRyeSB0byBzdXBwb3J0IGJvdGggc2ltdWx0YW5lb3VzbHkgYnkgY2hlY2tpbmcgdGhlIGZpbGUKLQkgICAgIG5hbWVkLiAgSWYgaXQgaXMgYSBkaXJlY3RvcnksIHJhdGhlciB0aGFuIGEgcmVndWxhciBmaWxlLAotCSAgICAgd2UgYXNzdW1lIC1ycGF0aCB3YXMgbWVhbnQuICAqLwotCSAgewotCSAgICBzdHJ1Y3Qgc3RhdCBzOwotCi0JICAgIGlmIChzdGF0IChvcHRhcmcsICZzKSA+PSAwCi0JCSYmICEgU19JU0RJUiAocy5zdF9tb2RlKSkKLQkgICAgICB7Ci0JCWxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywKLQkJCQkgICAgIGxhbmdfaW5wdXRfZmlsZV9pc19zeW1ib2xzX29ubHlfZW51bSwKLQkJCQkgICAgIChjaGFyICopIE5VTEwpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgT1BUSU9OX1JQQVRIOgotCSAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCSAgICBjb21tYW5kX2xpbmUucnBhdGggPSBidXlzdHJpbmcgKG9wdGFyZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzaXplX3QgcnBhdGhfbGVuID0gc3RybGVuIChjb21tYW5kX2xpbmUucnBhdGgpOwotCSAgICAgIHNpemVfdCBvcHRhcmdfbGVuID0gc3RybGVuIChvcHRhcmcpOwotCSAgICAgIGNoYXIgKmJ1ZjsKLQkgICAgICBjaGFyICpjcCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLQotCSAgICAgIC8qIEZpcnN0IHNlZSB3aGV0aGVyIE9QVEFSRyBpcyBhbHJlYWR5IGluIHRoZSBwYXRoLiAgKi8KLQkgICAgICBkbwotCQl7Ci0JCSAgc2l6ZV90IGlkeCA9IDA7Ci0JCSAgd2hpbGUgKG9wdGFyZ1tpZHhdICE9ICdcMCcgJiYgb3B0YXJnW2lkeF0gPT0gY3BbaWR4XSkKLQkJICAgICsraWR4OwotCQkgIGlmIChvcHRhcmdbaWR4XSA9PSAnXDAnCi0JCSAgICAgICYmIChjcFtpZHhdID09ICdcMCcgfHwgY3BbaWR4XSA9PSAnOicpKQotCQkgICAgLyogV2UgZm91bmQgaXQuICAqLwotCQkgICAgYnJlYWs7Ci0KLQkJICAvKiBOb3QgeWV0IGZvdW5kLiAgKi8KLQkJICBjcCA9IHN0cmNociAoY3AsICc6Jyk7Ci0JCSAgaWYgKGNwICE9IE5VTEwpCi0JCSAgICArK2NwOwotCQl9Ci0JICAgICAgd2hpbGUgKGNwICE9IE5VTEwpOwotCi0JICAgICAgaWYgKGNwID09IE5VTEwpCi0JCXsKLQkJICBidWYgPSB4bWFsbG9jIChycGF0aF9sZW4gKyBvcHRhcmdfbGVuICsgMik7Ci0JCSAgc3ByaW50ZiAoYnVmLCAiJXM6JXMiLCBjb21tYW5kX2xpbmUucnBhdGgsIG9wdGFyZyk7Ci0JCSAgZnJlZSAoY29tbWFuZF9saW5lLnJwYXRoKTsKLQkJICBjb21tYW5kX2xpbmUucnBhdGggPSBidWY7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fUlBBVEhfTElOSzoKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMKQotCSAgICBjb21tYW5kX2xpbmUucnBhdGhfbGluayA9IGJ1eXN0cmluZyAob3B0YXJnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgIGJ1ZiA9IHhtYWxsb2MgKHN0cmxlbiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmspCi0JCQkgICAgICsgc3RybGVuIChvcHRhcmcpCi0JCQkgICAgICsgMik7Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAiJXM6JXMiLCBjb21tYW5kX2xpbmUucnBhdGhfbGluaywgb3B0YXJnKTsKLQkgICAgICBmcmVlIChjb21tYW5kX2xpbmUucnBhdGhfbGluayk7Ci0JICAgICAgY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPSBidWY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFTEFYOgotCSAgY29tbWFuZF9saW5lLnJlbGF4ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEU6Ci0JICBhZGRfa2VlcHN5bXNfZmlsZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfZGVidWdnZXI7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2FsbDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NIQVJFRDoKLQkgIGlmIChjb25maWcuaGFzX3NoYXJlZCkKLQkgICAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiAtc2hhcmVkIG5vdCBzdXBwb3J0ZWRcbiIpKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgkJLyogVXNlZCBvbiBTb2xhcmlzLiAgKi8KLQljYXNlIE9QVElPTl9TT05BTUU6Ci0JICBjb21tYW5kX2xpbmUuc29uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU09SVF9DT01NT046Ci0JICBjb25maWcuc29ydF9jb21tb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RBVFM6Ci0JICBjb25maWcuc3RhdHMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1lNQk9MSUM6Ci0JICBsaW5rX2luZm8uc3ltYm9saWMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICB0cmFjZV9maWxlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAob3B0YXJnKTsKLQkgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKLQkgIHl5cGFyc2UgKCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UQlNTOgotCSAgc2V0X3NlY3Rpb25fc3RhcnQgKCIuYnNzIiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1REQVRBOgotCSAgc2V0X3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UVEVYVDoKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUOgotCSAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UQVNLX0xJTks6Ci0JICBsaW5rX2luZm8udGFza19saW5rID0gdHJ1ZTsKLQkgIC8qIEZhbGwgdGhyb3VnaCAtIGRvIGFuIGltcGxpZWQgLXIgb3B0aW9uLiAgKi8KLQljYXNlIE9QVElPTl9VUjoKLQkgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSB0cnVlOwotCSAgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9IHRydWU7Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcudGV4dF9yZWFkX29ubHkgPSBmYWxzZTsKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3UnOgotCSAgbGRsYW5nX2FkZF91bmRlZiAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1ZFUkJPU0U6Ci0JICBsZHZlcnNpb24gKDEpOwotCSAgdmVyc2lvbl9wcmludGVkID0gdHJ1ZTsKLQkgIHRyYWNlX2ZpbGVfdHJpZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICBsZHZlcnNpb24gKDApOwotCSAgdmVyc2lvbl9wcmludGVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgbGR2ZXJzaW9uICgxKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OOgotCSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KLQkgIHByaW50ZiAoIkdOVSBsZCAlc1xuIiwgbGRfcHJvZ3JhbV92ZXJzaW9uKTsKLQkgIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLQkgIHsKLQkgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKnB0ciA9IGxkX2VtdWxhdGlvbnM7Ci0gICAgCi0JICAgIHByaW50ZiAoXygiICBTdXBwb3J0ZWQgZW11bGF0aW9uczpcbiIpKTsKLQkgICAgd2hpbGUgKCpwdHIpIAotCSAgICAgIHsKLQkJcHJpbnRmICgiICAgJXNcbiIsICgqcHRyKS0+ZW11bGF0aW9uX25hbWUpOwotCQlwdHIrKzsKLQkgICAgICB9Ci0JICB9Ci0JICB4ZXhpdCAoMCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OX1NDUklQVDoKLQkgIC8qIFRoaXMgb3B0aW9uIGluZGljYXRlcyBhIHNtYWxsIHNjcmlwdCB0aGF0IG9ubHkgc3BlY2lmaWVzCi0gICAgICAgICAgICAgdmVyc2lvbiBpbmZvcm1hdGlvbi4gIFJlYWQgaXQsIGJ1dCBkb24ndCBhc3N1bWUgdGhhdAotICAgICAgICAgICAgIHdlJ3ZlIHNlZW4gYSBsaW5rZXIgc2NyaXB0LiAgKi8KLQkgIHsKLQkgICAgYm9vbGVhbiBob2xkX2hhZF9zY3JpcHQ7Ci0KLQkgICAgaG9sZF9oYWRfc2NyaXB0ID0gaGFkX3NjcmlwdDsKLQkgICAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChvcHRhcmcpOwotCSAgICBoYWRfc2NyaXB0ID0gaG9sZF9oYWRfc2NyaXB0OwotCSAgICBwYXJzZXJfaW5wdXQgPSBpbnB1dF92ZXJzaW9uX3NjcmlwdDsKLQkgICAgeXlwYXJzZSAoKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OOgotCSAgLyogVGhpcyBvcHRpb24gcmVjb3JkcyBhIHZlcnNpb24gc3ltYm9sIHRvIGJlIGFwcGxpZWQgdG8gdGhlCi0JICAgICBzeW1ib2xzIGxpc3RlZCBmb3IgZXhwb3J0IHRvIGJlIGZvdW5kIGluIHRoZSBvYmplY3QgZmlsZXMKLQkgICAgIC5leHBvcnRzIHNlY3Rpb25zLiAgKi8KLQkgIGNvbW1hbmRfbGluZS52ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fQ09NTU9OOgotCSAgY29uZmlnLndhcm5fY29tbW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTOgotCSAgY29uZmlnLndhcm5fY29uc3RydWN0b3JzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fTVVMVElQTEVfR1A6Ci0JICBjb25maWcud2Fybl9tdWx0aXBsZV9ncCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX09OQ0U6Ci0JICBjb25maWcud2Fybl9vbmNlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTjoKLQkgIGNvbmZpZy53YXJuX3NlY3Rpb25fYWxpZ24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV0hPTEVfQVJDSElWRToKLQkgIHdob2xlX2FyY2hpdmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV1JBUDoKLQkgIGFkZF93cmFwIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfbDsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgbGlua19pbmZvLmRpc2NhcmQgPSBkaXNjYXJkX2FsbDsKLQkgIGJyZWFrOwotCWNhc2UgJ1knOgotCSAgaWYgKHN0cm5jbXAgKG9wdGFyZywgIlAsIiwgMikgPT0gMCkKLQkgICAgb3B0YXJnICs9IDI7Ci0JICBkZWZhdWx0X2Rpcmxpc3QgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAneSc6Ci0JICBhZGRfeXN5bSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgLyogV2UgYWNjZXB0IGFuZCBpZ25vcmUgdGhpcyBvcHRpb24gZm9yIFNvbGFyaXMKLSAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LiAgQWN0dWFsbHksIG9uIFNvbGFyaXMsIG9wdGFyZyBpcyBub3QKLSAgICAgICAgICAgICBpZ25vcmVkLiAgU29tZWRheSB3ZSBzaG91bGQgaGFuZGxlIGl0IGNvcnJlY3RseS4gIEZJWE1FLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NQTElUX0JZX1JFTE9DOgotCSAgY29uZmlnLnNwbGl0X2J5X3JlbG9jID0gYXRvaSAob3B0YXJnKTsKLQkgIGJyZWFrOyAKLQljYXNlIE9QVElPTl9TUExJVF9CWV9GSUxFOgotCSAgY29uZmlnLnNwbGl0X2J5X2ZpbGUgPSB0cnVlOwotCSAgYnJlYWs7IAotCWNhc2UgT1BUSU9OX0NIRUNLX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICcoJzoKLQkgIGlmIChpbmdyb3VwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IG1heSBub3QgbmVzdCBncm91cHMgKC0taGVscCBmb3IgdXNhZ2UpXG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgeGV4aXQgKDEpOwotCSAgICB9Ci0JICBsYW5nX2VudGVyX2dyb3VwICgpOwotCSAgaW5ncm91cCA9IDE7Ci0JICBicmVhazsKLQljYXNlICcpJzoKLQkgIGlmICghIGluZ3JvdXApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogZ3JvdXAgZW5kZWQgYmVmb3JlIGl0IGJlZ2FuICgtLWhlbHAgZm9yIHVzYWdlKVxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCSAgbGFuZ19sZWF2ZV9ncm91cCAoKTsKLQkgIGluZ3JvdXAgPSAwOwotCSAgYnJlYWs7Ci0gICAgICBjYXNlIE9QVElPTl9NUEM4NjBDMDoKLSAgICAgICAgICBsaW5rX2luZm8ubXBjODYwYzAgPSAyMDsgICAgICAvKiBkZWZhdWx0IHZhbHVlIChpbiBieXRlcykgKi8KLSAgICAgICAgICBpZiAob3B0YXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCB3b3JkczsKLQotICAgICAgICAgICAgICB3b3JkcyA9IGlzX251bSAob3B0YXJnLCAxLCAxMCwgMCk7Ci0gICAgICAgICAgICAgIGlmICh3b3JkcyA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSW52YWxpZCBhcmd1bWVudCB0byBvcHRpb24gXCJtcGM4NjBjMFwiXG4iKSk7Ci0gICAgICAgICAgICAgICAgICB4ZXhpdCAoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBsaW5rX2luZm8ubXBjODYwYzAgPSB3b3JkcyAqIDQ7ICAgLyogY29udmVydCB3b3JkcyB0byBieXRlcyAqLwotICAgICAgICAgICAgfQotICAgICAgICAgIGNvbW1hbmRfbGluZS5yZWxheCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JTklUOgotCSAgbGlua19pbmZvLmluaXRfZnVuY3Rpb24gPSBvcHRhcmc7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgT1BUSU9OX0ZJTkk6Ci0JICBsaW5rX2luZm8uZmluaV9mdW5jdGlvbiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZ3JvdXApCi0gICAgbGFuZ19sZWF2ZV9ncm91cCAoKTsKLQotICBpZiAoZGVmYXVsdF9kaXJsaXN0ICE9IE5VTEwpCi0gICAgc2V0X2RlZmF1bHRfZGlybGlzdCAoZGVmYXVsdF9kaXJsaXN0KTsKLQotfQotCi0vKiBBZGQgdGhlIChjb2xvbi1zZXBhcmF0ZWQpIGVsZW1lbnRzIG9mIERJUkxJU1RfUFRSIHRvIHRoZQotICAgbGlicmFyeSBzZWFyY2ggcGF0aC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZGVmYXVsdF9kaXJsaXN0IChkaXJsaXN0X3B0cikKLSAgICAgY2hhciAqZGlybGlzdF9wdHI7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgcCA9IHN0cmNociAoZGlybGlzdF9wdHIsIFBBVEhfU0VQQVJBVE9SKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSAnXDAnOwotICAgICAgaWYgKCpkaXJsaXN0X3B0ciAhPSAnXDAnKQotCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChkaXJsaXN0X3B0ciwgdHJ1ZSk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgZGlybGlzdF9wdHIgPSBwICsgMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfc2VjdGlvbl9zdGFydCAoc2VjdCwgdmFsc3RyKQotICAgICBjaGFyICpzZWN0LCAqdmFsc3RyOwotewotICBjaGFyICplbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsID0gc3RydG91bCAodmFsc3RyLCAmZW5kLCAxNik7Ci0gIGlmICgqZW5kKQotICAgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIGhleCBudW1iZXIgYCVzJ1xuIiksIHZhbHN0cik7Ci0gIGxhbmdfc2VjdGlvbl9zdGFydCAoc2VjdCwgZXhwX2ludG9wICh2YWwpKTsKLX0KLQwKLS8qIFByaW50IGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBvcHRpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWhlbHAgKCkKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKip0YXJnZXRzLCAqKnBwOwotCi0gIHByaW50ZiAoXygiVXNhZ2U6ICVzIFtvcHRpb25zXSBmaWxlLi4uXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLQotICBwcmludGYgKF8oIk9wdGlvbnM6XG4iKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBPUFRJT05fQ09VTlQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobGRfb3B0aW9uc1tpXS5kb2MgIT0gTlVMTCkKLQl7Ci0JICBib29sZWFuIGNvbW1hOwotCSAgaW50IGxlbjsKLQkgIGludCBqOwotCi0JICBwcmludGYgKCIgICIpOwotCi0JICBjb21tYSA9IGZhbHNlOwotCSAgbGVuID0gMjsKLQotCSAgaiA9IGk7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbal0uc2hvcnRvcHQgIT0gJ1wwJwotCQkgICYmIGxkX29wdGlvbnNbal0uY29udHJvbCAhPSBOT19IRUxQKQotCQl7Ci0JCSAgcHJpbnRmICgiJXMtJWMiLCBjb21tYSA/ICIsICIgOiAiIiwgbGRfb3B0aW9uc1tqXS5zaG9ydG9wdCk7Ci0JCSAgbGVuICs9IChjb21tYSA/IDIgOiAwKSArIDI7Ci0JCSAgaWYgKGxkX29wdGlvbnNbal0uYXJnICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChsZF9vcHRpb25zW2pdLm9wdC5oYXNfYXJnICE9IG9wdGlvbmFsX2FyZ3VtZW50KQotCQkJewotCQkJICBwcmludGYgKCIgIik7Ci0JCQkgICsrbGVuOwotCQkJfQotCQkgICAgICBwcmludGYgKCIlcyIsIF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgICAgbGVuICs9IHN0cmxlbiAoXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgfQotCQkgIGNvbW1hID0gdHJ1ZTsKLQkJfQotCSAgICAgICsrajsKLQkgICAgfQotCSAgd2hpbGUgKGogPCBPUFRJT05fQ09VTlQgJiYgbGRfb3B0aW9uc1tqXS5kb2MgPT0gTlVMTCk7Ci0KLQkgIGogPSBpOwotCSAgZG8KLQkgICAgewotCSAgICAgIGlmIChsZF9vcHRpb25zW2pdLm9wdC5uYW1lICE9IE5VTEwKLQkJICAmJiBsZF9vcHRpb25zW2pdLmNvbnRyb2wgIT0gTk9fSEVMUCkKLQkJewotCQkgIHByaW50ZiAoIiVzLSVzJXMiLAotCQkJICBjb21tYSA/ICIsICIgOiAiIiwKLQkJCSAgbGRfb3B0aW9uc1tqXS5jb250cm9sID09IFRXT19EQVNIRVMgPyAiLSIgOiAiIiwKLQkJCSAgbGRfb3B0aW9uc1tqXS5vcHQubmFtZSk7Ci0JCSAgbGVuICs9ICgoY29tbWEgPyAyIDogMCkKLQkJCSAgKyAxCi0JCQkgICsgKGxkX29wdGlvbnNbal0uY29udHJvbCA9PSBUV09fREFTSEVTID8gMSA6IDApCi0JCQkgICsgc3RybGVuIChsZF9vcHRpb25zW2pdLm9wdC5uYW1lKSk7Ci0JCSAgaWYgKGxkX29wdGlvbnNbal0uYXJnICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiAlcyIsIF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgICAgbGVuICs9IDEgKyBzdHJsZW4gKF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgIH0KLQkJICBjb21tYSA9IHRydWU7Ci0JCX0KLQkgICAgICArK2o7Ci0JICAgIH0KLQkgIHdoaWxlIChqIDwgT1BUSU9OX0NPVU5UICYmIGxkX29wdGlvbnNbal0uZG9jID09IE5VTEwpOwotCi0JICBpZiAobGVuID49IDMwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgICBsZW4gPSAwOwotCSAgICB9Ci0KLQkgIGZvciAoOyBsZW4gPCAzMDsgbGVuKyspCi0JICAgIHB1dGNoYXIgKCcgJyk7Ci0KLQkgIHByaW50ZiAoIiVzXG4iLCBfKGxkX29wdGlvbnNbaV0uZG9jKSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3RlOiBWYXJpb3VzIHRvb2xzIChzdWNoIGFzIGxpYnRvb2wpIGRlcGVuZCB1cG9uIHRoZQotICAgICBmb3JtYXQgb2YgdGhlIGxpc3RpbmdzIGJlbG93IC0gZG8gbm90IGNoYW5nZSB0aGVtLiAgKi8KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgcHJpbnRmIChfKCIlczogc3VwcG9ydGVkIHRhcmdldHM6IiksIHByb2dyYW1fbmFtZSk7Ci0gIHRhcmdldHMgPSBiZmRfdGFyZ2V0X2xpc3QgKCk7Ci0gIGZvciAocHAgPSB0YXJnZXRzOyAqcHAgIT0gTlVMTDsgcHArKykKLSAgICBwcmludGYgKCIgJXMiLCAqcHApOwotICBmcmVlICh0YXJnZXRzKTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKF8oIiVzOiBzdXBwb3J0ZWQgZW11bGF0aW9uczogIiksIHByb2dyYW1fbmFtZSk7Ci0gIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgKHN0ZG91dCk7Ci0gIHByaW50ZiAoIlxuIik7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgcHJpbnRmIChfKCIlczogZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnM6XG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMgKHN0ZG91dCk7Ci0gIHByaW50ZiAoIlxuIik7Ci0gIAotICBwcmludGYgKF8oIlxuUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci19CmRpZmYgLS1naXQgYS9sZC9tYWMtbGQuciBiL2xkL21hYy1sZC5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzE2ZmM1Li4wMDAwMDAwCi0tLSBhL2xkL21hYy1sZC5yCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogUmVzb3VyY2VzIGZvciBHTlUgTEQuICovCi0KLSNpbmNsdWRlICJTeXNUeXBlcy5yIgotCi0vKiBWZXJzaW9uIHJlc291cmNlcy4gKi8KLQotcmVzb3VyY2UgJ3ZlcnMnICgxKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JVkVSU0lPTl9TVFJJTkcgICIgKEMpIDE5ODYtOTUgRlNGLCBJbmMuIgotfTsKLQotcmVzb3VyY2UgJ3ZlcnMnICgyLCBwdXJnZWFibGUpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQkiR0xEICIgVkVSU0lPTl9TVFJJTkcgIiBmb3IgTVBXIgotfTsKLQotI2lmZGVmIFdBTlRfQ0ZSRwotCi0jaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKLQotcmVzb3VyY2UgJ2NmcmcnICgwKSB7Ci0JewotCQlrUG93ZXJQQywKLQkJa0Z1bGxMaWIsCi0JCWtOb1ZlcnNpb25OdW0sIGtOb1ZlcnNpb25OdW0sCi0JCTAsIDAsCi0JCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAotCQlQUk9HX05BTUUKLQl9Ci19OwotCi0jZW5kaWYgLyogV0FOVF9DRlJHICovCmRpZmYgLS1naXQgYS9sZC9tcHctY29uZmlnLmluIGIvbGQvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1NDJjYy4uMDAwMDAwMAotLS0gYS9sZC9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBMRC4KLQotSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL202OGstYXBwbGUtbWFjb3MvCi0JU2V0IGVtdWxuYW1lIG02OGtjb2ZmCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZW02OGtjb2ZmLmMgZW02OGtjb2ZmLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVtNjhrY29mZi5jLm8KLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvcG93ZXJwYy1hcHBsZS1tYWNvcy8KLQlTZXQgZW11bG5hbWUgcHBjbWFjb3MKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lcHBjbWFjLmMgZXBwY21hY29zLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVwcGNtYWNvcy5jLm8KLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvaTM4Ni1cT3B0aW9uLXgtZ28zMi8KLQlTZXQgZW11bG5hbWUgaTM4NmdvMzIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1laTM4NmdvMzIuYyBlaTM4NmdvMzIuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZWkzODZnbzMyLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1lY29mZi8KLQlTZXQgZW11bG5hbWUgbWlwc2lkdAotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWlkdG1pcHMuYyBlbWlwc2lkdC5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlbWlwc2lkdC5jLm8KLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtXE9wdGlvbi14LwotCVNldCBlbXVsbmFtZSBlbGYzMmVibWlwCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZWxmbWlwcy5jIGVlbGYzMmVibWlwLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVlbGYzMmVibWlwLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1cT3B0aW9uLXgtaG1zLwotCVNldCBlbXVsbmFtZSBzaAotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVzaC5jIGVzaC5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlc2guYy5vCi1FbmQgSWYKLQotRWNobyAnLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAgRE8gTk9UIEVESVQhICovJyA+ICJ7b30ibGRlbXVsLXRtcC5oCi1FY2hvICJleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSBsZF97ZW11bG5hbWV9X2VtdWxhdGlvbjsiID4+ICJ7b30ibGRlbXVsLXRtcC5oCi1FY2hvICcjZGVmaW5lIEVNVUxBVElPTl9MSVNUIFwnCQkJCT4+ICJ7b30ibGRlbXVsLXRtcC5oCi1FY2hvICIgICZsZF97ZW11bG5hbWV9X2VtdWxhdGlvbiwgXCIJCQk+PiAie299ImxkZW11bC10bXAuaAotRWNobyAnICAwJwkJCQkJCT4+ICJ7b30ibGRlbXVsLXRtcC5oCi0KLU1vdmVJZkNoYW5nZSAie299ImxkZW11bC10bXAuaCAie299ImxkZW11bC1saXN0LmgKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJFTVVMID0gIiB7ZW11bG5hbWV9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJFTVVMQVRJT05fT0ZJTEVTID0gIiB7ZW11bGF0aW9uX29maWxlc30JCT4+ICJ7b30ibWsudG1wCi1FY2hvICd2ZXJzaW9uID0gJyBgU2VhcmNoICdsZCB2ZXJzaW9uICcge3NyY2Rpcn1sZHZlci5jIHwgc2VkIC1lICdzLy4qbGQgdmVyc2lvbiBcKFteIF0qXCkuKi9cMS8nYCA+PiAie299Im1rLnRtcAotRWNobyAiVERFRklORVMgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCQk+PiAie299Im1rLnRtcAotCi1FY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldwotRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCQkJCT4+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL2xkL21wdy1lbGZtaXBzLmMgYi9sZC9tcHctZWxmbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFiMDU2Li4wMDAwMDAwCi0tLSBhL2xkL21wdy1lbGZtaXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDM5ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogMzIgYml0IEVMRiBlbXVsYXRpb24gY29kZSBmb3IgZWxmMzJlYm1pcAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBFTEYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfZWxmMzJlYm1pcAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfc3RhdF9uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX3NlYXJjaF9uZWVkZWQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkZWxmMzJlYm1pcF9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkZWxmMzJlYm1pcF9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfbWlwczsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCi0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkZWxmMzJlYm1pcF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0KLSAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkgICAgICsgc3RybGVuIChmaWxlbmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkgICAgICsgc2l6ZW9mICIvbGliLnNvIik7Ci0KLSAgc3ByaW50ZiAoc3RyaW5nLCAiJXMvbGliJXMlcy5zbyIsIHNlYXJjaC0+bmFtZSwgZmlsZW5hbWUsIGFyY2gpOwotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICAvKiBXZSBoYXZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBpbiB0aGUgbGluay4gIFRoZSBFTEYKLSAgICAgYmFja2VuZCBsaW5rZXIgd2lsbCBjcmVhdGUgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIC5keW5hbWljCi0gICAgIHNlY3Rpb24gbmFtaW5nIHRoaXMgZmlsZS4gIElmIHRoaXMgZmlsZSBpbmNsdWRlcyBhIERUX1NPTkFNRQotICAgICBlbnRyeSwgaXQgd2lsbCBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUgRUxGIGxpbmtlciB3aWxsIGp1c3QgdXNlCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIGFuIGFyY2hpdmUgZm91bmQgYnkgc2VhcmNoaW5nLCBsaWtlCi0gICAgIHRoaXMgb25lLCB0aGUgRFRfTkVFREVEIGVudHJ5IHNob3VsZCBjb25zaXN0IG9mIGp1c3QgdGhlIG5hbWUgb2YKLSAgICAgdGhlIGZpbGUsIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24gdXNlZCB0byBmaW5kIGl0LiAgTm90ZQotICAgICB0aGF0IHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGlmIHdlIGhhdmUgYSBkeW5hbWljIG9iamVjdDsgYW4KLSAgICAgYXJjaGl2ZSB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuCi0KLSAgICAgRklYTUU6IFRoaXMgYXBwcm9hY2gtLXVzaW5nIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLS1pcyBub3QKLSAgICAgdmVyeSBwcmV0dHkuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mIGFueXRoaW5nIHRoYXQgaXMKLSAgICAgcHJldHR5LCB0aG91Z2guICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9vYmplY3QpCi0gICAgICAmJiAoZW50cnktPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpuZWVkZWRfbmFtZTsKLQotICAgICAgQVNTRVJUIChlbnRyeS0+aXNfYXJjaGl2ZSAmJiBlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZyk7Ci0gICAgICBuZWVkZWRfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkJICAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkJICAgICAgKyBzaXplb2YgImxpYi5zbyIpOwotICAgICAgc3ByaW50ZiAobmVlZGVkX25hbWUsICJsaWIlcyVzLnNvIiwgZmlsZW5hbWUsIGFyY2gpOwotICAgICAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGVudHJ5LT50aGVfYmZkLCBuZWVkZWRfbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aAotICAgYmV0d2VlbiBhZnRlcl9vcGVuIGFuZCBjaGVja19uZWVkZWQgYW5kIHN0YXRfbmVlZGVkLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBzdHJ1Y3Qgc3RhdCBnbG9iYWxfc3RhdDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKmw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgd2hlbiBkb2luZyBhIGZpbmFsIGxpbmsuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSB8fCBsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybjsKLQotICAvKiBHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXBwZWFyIGluIERUX05FRURFRCBlbnRyaWVzIGluCi0gICAgIGR5bmFtaWMgb2JqZWN0cyBpbmNsdWRlZCBpbiB0aGUgbGluayAob2Z0ZW4gdGhlcmUgd2lsbCBiZSBub25lKS4KLSAgICAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdAotICAgICB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZQotICAgICBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcKLSAgICAgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbiBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUKLSAgICAgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcwotICAgICBsb29wLiAgKi8KLSAgbmVlZGVkID0gYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsbDsKLSAgICAgIGNvbnN0IGNoYXIgKmxpYl9wYXRoOwotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCi0gICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQotCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsLT5uYW1lKSA9PSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAobGwgIT0gbCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgZmlsZSB3YXMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgZXhwbGljaXRseS4gICovCi0gICAgICBnbG9iYWxfbmVlZGVkID0gbDsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IGZhbHNlOwotICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQotCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKLQkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAotCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuICAqLwotICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCi0JCQkJCSAgICAgIGwtPm5hbWUpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLCBsLT5uYW1lKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMCi0JICAmJiBjb21tYW5kX2xpbmUucnBhdGggPT0gTlVMTCkKLQl7Ci0JICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0JICBpZiAoZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSkpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGxlbiA9IHN0cmxlbiAobC0+bmFtZSk7Ci0gICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCXsKLQkgIGNoYXIgKmZpbGVuYW1lOwotCi0JICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCSAgICBjb250aW51ZTsKLQkgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpICsgbGVuICsgMik7Ci0JICBzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBsLT5uYW1lKTsKLQkgIGlmIChnbGRlbGYzMmVibWlwX3RyeV9uZWVkZWQgKGZpbGVuYW1lKSkKLQkgICAgYnJlYWs7Ci0JICBmcmVlIChmaWxlbmFtZSk7Ci0JfQotICAgICAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZFxuIiksCi0JICAgICBsLT5uYW1lLCBsLT5ieSk7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggZm9yIGEgbmVlZGVkIGZpbGUgaW4gYSBwYXRoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlbmFtZSwgKnNzZXQ7Ci0KLSAgICAgIHMgPSBzdHJjaHIgKHBhdGgsICc6Jyk7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXMgPSBwYXRoICsgc3RybGVuIChwYXRoKTsKLQotICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIGxlbiArIDIpOwotICAgICAgaWYgKHMgPT0gcGF0aCkKLQlzc2V0ID0gZmlsZW5hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChmaWxlbmFtZSwgcGF0aCwgcyAtIHBhdGgpOwotCSAgZmlsZW5hbWVbcyAtIHBhdGhdID0gJy8nOwotCSAgc3NldCA9IGZpbGVuYW1lICsgKHMgLSBwYXRoKSArIDE7Ci0JfQotICAgICAgc3RyY3B5IChzc2V0LCBuYW1lKTsKLQotICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCAoZmlsZW5hbWUpKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmcmVlIChmaWxlbmFtZSk7Ci0KLSAgICAgIGlmICgqcyA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgcGF0aCA9IHMgKyAxOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CSAgCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHBvc3NpYmxlIG5hbWUgZm9yIGEgZHluYW1pYyBvYmplY3QKLSAgIG5hbWVkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgYmZkICphYmZkOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgbWF0Y2hpbmcgdGhlIERUX05FRURFRCBlbnRyeS4gICovCi0KLSAgLyogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBvdGhlciBpbnB1dCBmaWxlIG9mIHRoZQotICAgICBzYW1lIG5hbWUuICBXZSBtdXN0IG5vdyBjaGVjayBhZ2FpbiB0aGF0IHdlIGFyZSBub3QgaW5jbHVkaW5nIHRoZQotICAgICBzYW1lIGZpbGUgdHdpY2UuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvbiBtYW55IHN5c3RlbXMKLSAgICAgbGliYy5zbyBpcyBhIHN5bWxpbmsgdG8sIGUuZy4sIGxpYmMuc28uMS4gIFRoZSBTT05BTUUgZW50cnkgd2lsbAotICAgICByZWZlcmVuY2UgbGliYy5zby4xLiAgSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGxpYmMuc28sIHdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBsaWJjLnNvLjEgaWYgdGhleSBhcmUgdGhlIHNhbWUgZmlsZSwgYW5kIHdlCi0gICAgIGNhbiBvbmx5IGNoZWNrIHRoYXQgdXNpbmcgc3RhdC4gICovCi0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmZ2xvYmFsX3N0YXQpICE9IDApCi0gICAgZWluZm8gKF8oIiVGJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIpLCBhYmZkKTsKLSAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkZWxmMzJlYm1pcF9zdGF0X25lZWRlZCk7Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgewotICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2gKLSAgICAgICAgIHdlIGFyZW4ndCBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUZWxsIHRoZSBFTEYgYmFja2VuZCB0aGF0IGRvbid0IHdhbnQgdGhlIG91dHB1dCBmaWxlIHRvIGhhdmUgYQotICAgICBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZmlsZS4gICovCi0gIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCAiIik7Ci0KLSAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKF8oIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgYWJmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAocy0+ZmlsZW5hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzb25hbWU7Ci0KLSAgICAgIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gICAgICBpZiAoc29uYW1lICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoc29uYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQkgIAotICBpZiAocy0+c2VhcmNoX2RpcnNfZmxhZwotICAgICAgJiYgcy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpID09IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZjsKLQotICAgICAgZiA9IHN0cnJjaHIgKHMtPmZpbGVuYW1lLCAnLycpOwotICAgICAgaWYgKGYgIT0gTlVMTAotCSAgJiYgc3RyY21wIChmICsgMSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgcnVubmluZyBzdGF0IG9uCi0gICB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX3N0YXRfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgY29uc3QgY2hhciAqc3VmZml4OwotICBjb25zdCBjaGFyICpzb25hbWU7Ci0gIGNvbnN0IGNoYXIgKmY7Ci0KLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfc3RhdCAocy0+dGhlX2JmZCwgJnN0KSAhPSAwKQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiksIHMtPnRoZV9iZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3Quc3RfZGV2ID09IGdsb2JhbF9zdGF0LnN0X2RldgotICAgICAgJiYgc3Quc3RfaW5vID09IGdsb2JhbF9zdGF0LnN0X2lubykKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQgbG9va3MgbGlrZSB3ZSBhcmUgaW5jbHVkaW5nIHR3bwotICAgICBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwKLSAgICAgdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSBpZiAtbGMgcGlja3MgdXAgbGliYy5zby42IGJ1dCBzb21lIG90aGVyCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGhhcyBhIERUX05FRURFRCBlbnRyeSBvZiBsaWJjLnNvLjUuICBUaGlzIGlzIGEKLSAgICAgaHVlcmlzdGljIHRlc3QsIGFuZCBpdCB3aWxsIG9ubHkgd29yayBpZiB0aGUgbmFtZSBsb29rcyBsaWtlCi0gICAgIE5BTUUuc28uVkVSU0lPTi4gIEZJWE1FOiBEZXBlbmRpbmcgb24gZmlsZSBuYW1lcyBpcyBlcnJvci1wcm9uZS4KLSAgICAgSWYgd2UgcmVhbGx5IHdhbnQgdG8gaXNzdWUgd2FybmluZ3MgYWJvdXQgbWl4aW5nIHZlcnNpb24gbnVtYmVycwotICAgICBvZiBzaGFyZWQgbGlicmFyaWVzLCB3ZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5LiAgKi8KLQotICBpZiAoc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpICE9IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggPSBzdHJzdHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICIuc28uIik7Ci0gIGlmIChzdWZmaXggPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gcy0+ZmlsZW5hbWU7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGlmIChzdHJuY21wIChmLCBnbG9iYWxfbmVlZGVkLT5uYW1lLCBzdWZmaXggLSBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbWF5IGNvbmZsaWN0IHdpdGggJXNcbiIpLAotCSAgIGdsb2JhbF9uZWVkZWQtPm5hbWUsIGdsb2JhbF9uZWVkZWQtPmJ5LCBmKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJwYXRoOwotICBhc2VjdGlvbiAqc2ludGVycDsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBFTEYgYmFja2VuZCBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIEVMRiBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQKLSAgICAgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgcnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0gIGlmIChycGF0aCA9PSBOVUxMKQotICAgIHJwYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLSAgaWYgKCEgYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwKLQkJCQkJCSBjb21tYW5kX2xpbmUuc29uYW1lLAotCQkJCQkJIHJwYXRoLAotCQkJCQkJIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYywKLQkJCQkJCSAmbGlua19pbmZvLAotCQkJCQkJICZzaW50ZXJwKSkKLSAgICBlaW5mbyAoXygiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKSk7Ci0KLSAgLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBkeW5hbWljIGxpbmtlciB3ZSBhcmUgdXNpbmcuICAqLwotICBpZiAoY29tbWFuZF9saW5lLmludGVycHJldGVyICE9IE5VTEwKLSAgICAgICYmIHNpbnRlcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW50ZXJwLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXI7Ci0gICAgICBzaW50ZXJwLT5fcmF3X3NpemUgPSBzdHJsZW4gKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcikgKyAxOwotICAgIH0KLQotICAvKiBMb29rIGZvciBhbnkgc2VjdGlvbnMgbmFtZWQgLmdudS53YXJuaW5nLiAgQXMgYSBHTlUgZXh0ZW5zaW9ucywKLSAgICAgd2UgdHJlYXQgc3VjaCBzZWN0aW9ucyBhcyBjb250YWluaW5nIHdhcm5pbmcgbWVzc2FnZXMuICBXZSBwcmludAotICAgICBvdXQgdGhlIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gemVybyBvdXQgdGhlIHNlY3Rpb24gc2l6ZSBzbwotICAgICB0aGF0IGl0IGRvZXMgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JYXNlY3Rpb24gKnM7Ci0JYmZkX3NpemVfdHlwZSBzejsKLQljaGFyICptc2c7Ci0JYm9vbGVhbiByZXQ7Ci0KLQlpZiAoaXMtPmp1c3Rfc3ltc19mbGFnKQotCSAgY29udGludWU7Ci0KLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlzLT50aGVfYmZkLCAiLmdudS53YXJuaW5nIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ogPSBiZmRfc2VjdGlvbl9zaXplIChpcy0+dGhlX2JmZCwgcyk7Ci0JbXNnID0geG1hbGxvYyAoKHNpemVfdCkgc3ogKyAxKTsKLQlpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQotCSAgZWluZm8gKF8oIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuZ251Lndhcm5pbmc6ICVFXG4iKSwKLQkJIGlzLT50aGVfYmZkKTsKLQltc2dbc3pdID0gJ1wwJzsKLQlyZXQgPSBsaW5rX2luZm8uY2FsbGJhY2tzLT53YXJuaW5nICgmbGlua19pbmZvLCBtc2csCi0JCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgICAgaXMtPnRoZV9iZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkgICAgKGJmZF92bWEpIDApOwotCUFTU0VSVCAocmV0KTsKLQlmcmVlIChtc2cpOwotCi0JLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplLCBzbyB0aGF0IHdlIGRvbid0IHdhc3RlIGNvcHlpbmcgdGhlCi0JICAgd2FybmluZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICAgIH0KLSAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBhbmQKLSAgIHRlbGxzIHRoZSBFTEYgYmFja2VuZCBhYm91dCB0aGVtLCBpbiBjYXNlIHRoZXkgYXJlIGFzc2lnbm1lbnRzIHRvCi0gICBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKLQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlIGNhbGwgcmVjb3JkX2xpbmtfYXNzaWdubWVudCBldmVuIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4KLQkgVGhpcyBpcyBiZWNhdXNlIGlmIGl0IGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgd2UKLQkgYWN0dWFsbHkgd2FudCB0byB1c2UgdGhlIHZhbHVlIGRlZmluZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsCi0JIG5vdCB0aGUgdmFsdWUgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgKGJlY2F1c2Ugd2UgYXJlIHNldHRpbmcKLQkgc3ltYm9scyBsaWtlIGV0ZXh0KS4gIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIKLQkgb2JqZWN0LCB0aGVuLCBhcyBpdCBoYXBwZW5zLCBjYWxsaW5nIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkgd2lsbCBkbyBubyBoYXJtLiAgKi8KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCQkgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGV4cC0+YXNzaWduLmRzdCwKLQkJICBleHAtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlID8gdHJ1ZSA6IGZhbHNlKSkpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iKSwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQwotICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yb2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfYnNzOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcmVsOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGRlbGYzMmVibWlwX3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOwotICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOwotICBldHJlZV90eXBlICphZGRyZXNzOwotICBjb25zdCBjaGFyICpzZWNuYW1lLCAqcHM7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLwotICBob2xkX3NlY3Rpb24gPSBzOwotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24pOwotCi0gIGlmIChob2xkX3VzZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBwbGFjZWQgYSBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdXNlLT5jaGlsZHJlbiwgcywgaG9sZF91c2UsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCB0aGVuIGFsd2F5cyBwdXQgLmdudS53YXJuaW5nLlNZTUJPTAotICAgICBzZWN0aW9ucyBpbnRvIHRoZSAudGV4dCBzZWN0aW9uIHRvIGdldCB0aGVtIG91dCBvZiB0aGUgd2F5LiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnNoYXJlZAotICAgICAgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSA9PSAwCi0gICAgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB3aWxkX2RvaXQgKCZob2xkX3RleHQtPmNoaWxkcmVuLCBzLCBob2xkX3RleHQsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIERlY2lkZSB3aGljaCBzZWdtZW50IHRoZSBzZWN0aW9uIHNob3VsZCBnbyBpbiBiYXNlZCBvbiB0aGUKLSAgICAgc2VjdGlvbiBuYW1lIGFuZCBzZWN0aW9uIGZsYWdzLiAgKi8KLSAgcGxhY2UgPSBOVUxMOwotICBpZiAoKHMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotICAgICAgJiYgaG9sZF9ic3MgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfYnNzOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKLQkgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfZGF0YTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoc2VjbmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JICAgJiYgaG9sZF9yZWwgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcmVsOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfcm9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JvZGF0YTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3RleHQ7Ci0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZSByaWdodAotICAgICBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sgbmVhdGVyLiAgKi8KLSAgc25ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIHNlY25hbWUpOwotICBpZiAoc25ldyA9PSBOVUxMKQotICAgICAgZWluZm8gKF8oIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiksCi0JICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBzZWNuYW1lKTsKLSAgaWYgKHBsYWNlLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocHBzID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOyAqcHBzICE9IHNuZXc7IHBwcyA9ICYoKnBwcyktPm5leHQpCi0JOwotICAgICAgKnBwcyA9IHNuZXctPm5leHQ7Ci0gICAgICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotICAgICAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLSAgICB9Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIG9sZCA9IHN0YXRfcHRyOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0gIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgLyogSWYgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaXMgcmVwcmVzZW50YWJsZSBpbiBDLCB0aGVuIGNyZWF0ZQotICAgICBzeW1ib2xzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgZm9yIChwcyA9IHNlY25hbWU7ICpwcyAhPSAnXDAnOyBwcysrKQotICAgIGlmICghIGlzYWxudW0gKCpwcykgJiYgKnBzICE9ICdfJykKLSAgICAgIGJyZWFrOwotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBzZWNuYW1lICsgc2l6ZW9mICJfX3N0YXJ0XyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RhcnRfJXMiLCBzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAotCQkJCQkJZXhwX2ludG9wICgoYmZkX3ZtYSkgMQotCQkJCQkJCSAgIDw8IHMtPmFsaWdubWVudF9wb3dlcikpKSk7Ci0gICAgfQotCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgYWRkcmVzcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBhZGRyZXNzID0gZXhwX2ludG9wICgoYmZkX3ZtYSkgMCk7Ci0KLSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJICAgICAgIChiZmRfdm1hKSAwLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoc2VjbmFtZSk7Ci0gIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCi0gIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIpOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0KLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gc2VjbmFtZSArIHNpemVvZiAiX19zdG9wXyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RvcF8lcyIsIHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlIG5ldyBzdGF0ZW1lbnQgbGlzdCByaWdodCBhZnRlciBQTEFDRS4gICovCi0gICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLSAgcGxhY2UtPmhlYWRlci5uZXh0ID0gYWRkLmhlYWQ7Ci0KLSAgc3RhdF9wdHIgPSBvbGQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24gKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmIChzLT5oZWFkZXIudHlwZSAhPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtKQotICAgIHJldHVybjsKLQotICBvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsIGhvbGRfc2VjdGlvbi0+bmFtZSkgPT0gMCkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJvZGF0YSIpID09IDApCi0gICAgaG9sZF9yb2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICBob2xkX2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5ic3MiKSA9PSAwKQotICAgIGhvbGRfYnNzID0gb3M7Ci0gIGVsc2UgaWYgKGhvbGRfcmVsID09IE5VTEwKLQkgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICYmIHN0cm5jbXAgKG9zLT5uYW1lLCAiLnJlbCIsIDQpID09IDApCi0gICAgaG9sZF9yZWwgPSBvczsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkZWxmMzJlYm1pcF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzXG5cCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nXG5cCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkXG5cCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuaW50ZXJwICAgMCA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgMCA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgMCA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgMCA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgMCA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgMCA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgIDAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgMCA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgMCA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAwIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAwIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgMCA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAwIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgMCA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAwIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgIDAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgIDAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgMCA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgMCA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgIDAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgMCA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgIDAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgMCA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgIDAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgMCA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgIDAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAwIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExIDAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgIDAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgLmZpbmkgICAgMCA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLmRhdGEgIDAgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAuZGF0YTEgMCA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgIDAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgIDAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgLmdvdCAgICAgICAgIDAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgIDAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5zYnNzICAgIDAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgMCA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCi1PVVRQVVRfQVJDSChtaXBzKVxuXAotRU5UUlkoX3N0YXJ0KVxuXAotIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlc1xuXAotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZ1xuXAotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZFxuXAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKLSAgLmludGVycCAgIDAgOiB7ICooLmludGVycCkgCX1cblwKLSAgLnJlZ2luZm8gICAgIDAgOiB7ICooLnJlZ2luZm8pIH1cblwKLSAgLmR5bmFtaWMgICAgIDAgOiB7ICooLmR5bmFtaWMpIH1cblwKLSAgLmR5bnN0ciAgICAgIDAgOiB7ICooLmR5bnN0cikJCX1cblwKLSAgLmR5bnN5bSAgICAgIDAgOiB7ICooLmR5bnN5bSkJCX1cblwKLSAgLmhhc2ggICAgICAgIDAgOiB7ICooLmhhc2gpCQl9XG5cCi0gIC5yZWwudGV4dCAgICAwIDogeyAqKC5yZWwudGV4dCkJCX1cblwKLSAgLnJlbGEudGV4dCAgIDAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKLSAgLnJlbC5kYXRhICAgIDAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAotICAucmVsYS5kYXRhICAgMCA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAotICAucmVsLnJvZGF0YSAgMCA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKLSAgLnJlbGEucm9kYXRhIDAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAotICAucmVsLmdvdCAgICAgMCA6IHsgKigucmVsLmdvdCkJCX1cblwKLSAgLnJlbGEuZ290ICAgIDAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAotICAucmVsLmN0b3JzICAgMCA6IHsgKigucmVsLmN0b3JzKQl9XG5cCi0gIC5yZWxhLmN0b3JzICAwIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCi0gIC5yZWwuZHRvcnMgICAwIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKLSAgLnJlbGEuZHRvcnMgIDAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKLSAgLnJlbC5pbml0ICAgIDAgOiB7ICooLnJlbC5pbml0KQl9XG5cCi0gIC5yZWxhLmluaXQgICAwIDogeyAqKC5yZWxhLmluaXQpCX1cblwKLSAgLnJlbC5maW5pICAgIDAgOiB7ICooLnJlbC5maW5pKQl9XG5cCi0gIC5yZWxhLmZpbmkgICAwIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKLSAgLnJlbC5ic3MgICAgIDAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCi0gIC5yZWxhLmJzcyAgICAwIDogeyAqKC5yZWxhLmJzcykJCX1cblwKLSAgLnJlbC5wbHQgICAgIDAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCi0gIC5yZWxhLnBsdCAgICAwIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKLSAgLnJvZGF0YSAgMCA6IHsgKigucm9kYXRhKSAgfVxuXAotICAucm9kYXRhMSAwIDogeyAqKC5yb2RhdGExKSB9XG5cCi0gIC5pbml0ICAgICAgICAwIDogeyAqKC5pbml0KQl9ID0wXG5cCi0gIC50ZXh0ICAgIDAgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHViKVxuXAotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAotICAgICooLmdudS53YXJuaW5nKVxuXAotICB9ID0wXG5cCi0gIC5maW5pICAgIDAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAotICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCi0gIC5kYXRhICAwIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH1cblwKLSAgLmRhdGExIDAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAwIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAwIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIC5nb3QgICAgICAgICAwIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAwIDogeyAqKC5zZGF0YSkgfVxuXAotICAuc2JzcyAgICAwIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgIDAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCi0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAotICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuID0gMHgwNDAwMDAwO1xuXAotICAuaW50ZXJwICAgICA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgICA6XG5cCi0gIHtcblwKLSAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgX2V0ZXh0ID0gLjtcblwKLSAgUFJPVklERSAoZXRleHQgPSAuKTtcblwKLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgICAgLiA9IC47XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLiArPSAuIC0gMHgwNDAwMDAwO1xuXAotICAuZGF0YSAgICA6XG5cCi0gIHtcblwKLSAgICBfZmRhdGEgPSAuIDtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCi0gIC5nb3QgICAgICAgICAgIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAotICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAotICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAotICBfZWRhdGEgID0gIC47XG5cCi0gIFBST1ZJREUgKGVkYXRhID0gLik7XG5cCi0gIF9fYnNzX3N0YXJ0ID0gLjtcblwKLSAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgICAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICBfZW5kID0gLiA7XG5cCi0gIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCi0gICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC4gPSAweDA0MDAwMDA7XG5cCi0gIC5pbnRlcnAgICAgIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAgIDpcblwKLSAge1xuXAotICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICBfZXRleHQgPSAuO1xuXAotICBQUk9WSURFIChldGV4dCA9IC4pO1xuXAotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgICAuID0gMHgxMDAwMDAwMDtcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuICs9IDB4MTAwMDAwMDAgLSAweDA0MDAwMDA7XG5cCi0gIC5kYXRhICAgIDpcblwKLSAge1xuXAotICAgIF9mZGF0YSA9IC4gO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKLSAgLmdvdCAgICAgICAgICAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCi0gIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCi0gIF9lZGF0YSAgPSAgLjtcblwKLSAgUFJPVklERSAoZWRhdGEgPSAuKTtcblwKLSAgX19ic3Nfc3RhcnQgPSAuO1xuXAotICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgICA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIF9lbmQgPSAuIDtcblwKLSAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCi0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAotICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuID0gMHg1ZmZlMDAwMCArIFNJWkVPRl9IRUFERVJTO1xuXAotICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgICA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgICAgLiA9IDB4MTAwMDAwMDA7XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLiArPSAweDEwMDAwO1xuXAotICAuZGF0YSAgICA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCi0gIC5nb3QgICAgICAgICAgIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAotICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAotICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgICAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCi0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAotICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuID0gMHgwNDAwMDAwO1xuXAotICAuaW50ZXJwICAgICA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgICA6XG5cCi0gIHtcblwKLSAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgX2V0ZXh0ID0gLjtcblwKLSAgUFJPVklERSAoZXRleHQgPSAuKTtcblwKLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgICAgLiA9IDB4MTAwMDAwMDA7XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLiArPSAweDEwMDAwMDAwIC0gMHgwNDAwMDAwO1xuXAotICAuZGF0YSAgICA6XG5cCi0gIHtcblwKLSAgICBfZmRhdGEgPSAuIDtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCi0gIC5nb3QgICAgICAgICAgIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAotICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAotICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAotICBfZWRhdGEgID0gIC47XG5cCi0gIFBST1ZJREUgKGVkYXRhID0gLik7XG5cCi0gIF9fYnNzX3N0YXJ0ID0gLjtcblwKLSAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgICAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICBfZW5kID0gLiA7XG5cCi0gIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2VsZjMyZWJtaXBfZW11bGF0aW9uID0gCi17Ci0gIGdsZGVsZjMyZWJtaXBfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGRlbGYzMmVibWlwX2dldF9zY3JpcHQsCi0gICJlbGYzMmVibWlwIiwKLSAgImVsZjMyLWJpZ21pcHMiLAotICBOVUxMLAotICBOVUxMLAotICBnbGRlbGYzMmVibWlwX29wZW5fZHluYW1pY19hcmNoaXZlLAotICBnbGRlbGYzMmVibWlwX3BsYWNlX29ycGhhbgotfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1lcHBjbWFjLmMgYi9sZC9tcHctZXBwY21hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA5YTQxLi4wMDAwMDAwCi0tLSBhL2xkL21wdy1lcHBjbWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogQUlYIGVtdWxhdGlvbiBjb2RlIGZvciBwcGNtYWNvcwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBBSVggc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfcHBjbWFjb3MKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0KLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdsZHBwY21hY29zX3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX3JlYWRfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2ZyZWUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19maW5kX3JlbG9jcwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkcHBjbWFjb3NfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi0vKiBUaGUgZmlsZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGVhY2ggc2VjdGlvbi4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotCi0vKiBUaGUgbWF4aW11bSBzaXplIHRoZSBzdGFjayBpcyBwZXJtaXR0ZWQgdG8gZ3Jvdy4gIFRoaXMgaXMgc3RvcmVkIGluCi0gICB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heHN0YWNrOwotCi0vKiBUaGUgbWF4aW11bSBkYXRhIHNpemUuICBUaGlzIGlzIHN0b3JlZCBpbiB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heGRhdGE7Ci0KLS8qIFdoZXRoZXIgdG8gcGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotc3RhdGljIGludCBnYyA9IDE7Ci0KLS8qIFRoZSBtb2R1bGUgdHlwZSB0byB1c2UuICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG1vZHR5cGUgPSAoJzEnIDw8IDgpIHwgJ0wnOwotCi0vKiBXaGV0aGVyIHRoZSAudGV4dCBzZWN0aW9uIG11c3QgYmUgcmVhZC1vbmx5IChpLmUuLCBubyByZWxvY3MKLSAgIHBlcm1pdHRlZCkuICAqLwotc3RhdGljIGludCB0ZXh0cm87Ci0KLS8qIFdoZXRoZXIgdG8gaW1wbGVtZW50IFVuaXggbGlrZSBsaW5rZXIgc2VtYW50aWNzLiAgKi8KLXN0YXRpYyBpbnQgdW5peF9sZDsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbXBvcnQgZmlsZSBsaXN0LiAgKi8KLQotc3RydWN0IGZpbGVsaXN0Ci17Ci0gIHN0cnVjdCBmaWxlbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLS8qIExpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmlsZWxpc3QgKmltcG9ydF9maWxlczsKLQotLyogTGlzdCBvZiBleHBvcnQgc3ltYm9scyByZWFkIGZyb20gdGhlIGV4cG9ydCBmaWxlcy4gICovCi0KLXN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QKLXsKLSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYm9vbGVhbiBzeXNjYWxsOwotfTsKLQotc3RhdGljIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKmV4cG9ydF9zeW1ib2xzOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGRvbmUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9wb3dlcnBjOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIEhhbmRsZSBBSVggc3BlY2lmaWMgb3B0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLWdsZHBwY21hY29zX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgaW5keDsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBsb25nIHZhbDsKLSAgY2hhciAqZW5kOwotCi0jZGVmaW5lIE9QVElPTl9JR05PUkUgKDMwMCkKLSNkZWZpbmUgT1BUSU9OX0FVVE9JTVAgKE9QVElPTl9JR05PUkUgKyAxKQotI2RlZmluZSBPUFRJT05fRVJOT1RPSyAoT1BUSU9OX0FVVE9JTVAgKyAxKQotI2RlZmluZSBPUFRJT05fRVJPSyAoT1BUSU9OX0VSTk9UT0sgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUIChPUFRJT05fRVJPSyArIDEpCi0jZGVmaW5lIE9QVElPTl9JTVBPUlQgKE9QVElPTl9FWFBPUlQgKyAxKQotI2RlZmluZSBPUFRJT05fTE9BRE1BUCAoT1BUSU9OX0lNUE9SVCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVhEQVRBIChPUFRJT05fTE9BRE1BUCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVhTVEFDSyAoT1BUSU9OX01BWERBVEEgKyAxKQotI2RlZmluZSBPUFRJT05fTU9EVFlQRSAoT1BUSU9OX01BWFNUQUNLICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PQVVUT0lNUCAoT1BUSU9OX01PRFRZUEUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9TVFJDTVBDVCAoT1BUSU9OX05PQVVUT0lNUCArIDEpCi0jZGVmaW5lIE9QVElPTl9QRCAoT1BUSU9OX05PU1RSQ01QQ1QgKyAxKQotI2RlZmluZSBPUFRJT05fUFQgKE9QVElPTl9QRCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVFJDTVBDVCAoT1BUSU9OX1BUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1VOSVggKE9QVElPTl9TVFJDTVBDVCArIDEpCi0KLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKLSAgICB7ImJhc2lzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmF1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAotICAgIHsiYmNvbXBybGQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiY3JsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJjcm9yMzEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiRCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCi0gICAgeyJiRSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUfSwKLSAgICB7ImJlcm5vdG9rIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk5PVE9LfSwKLSAgICB7ImJlcm9rIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk9LfSwKLSAgICB7ImJlcnJtc2ciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiZXhwb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAotICAgIHsiYmYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAotICAgIHsiYmdjIiwgbm9fYXJndW1lbnQsICZnYywgMX0sCi0gICAgeyJiaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJoYWx0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYkkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCi0gICAgeyJiaW1wb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBPUlR9LAotICAgIHsiYmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xPQURNQVB9LAotICAgIHsiYmxvYWRtYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xPQURNQVB9LAotICAgIHsiYm1heGRhdGEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWERBVEF9LAotICAgIHsiYm1heHN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCi0gICAgeyJiTSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9EVFlQRX0sCi0gICAgeyJibW9kdHlwZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9EVFlQRX0sCi0gICAgeyJibm9hdXRvaW1wIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsiYm5vZGVsY3NlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJibm9lbnRyeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJub2djIiwgbm9fYXJndW1lbnQsICZnYywgMH0sCi0gICAgeyJibnNvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsiYm5vc3RyY21wY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PU1RSQ01QQ1R9LAotICAgIHsiYm5vdGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAotICAgIHsiYm5ybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAwfSwKLSAgICB7ImJwRCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUER9LAotICAgIHsiYnBUIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QVH0sCi0gICAgeyJicm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMX0sCi0gICAgeyJiUyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYU1RBQ0t9LAotICAgIHsiYnNvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BVVRPSU1QfSwKLSAgICB7ImJzdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSQ01QQ1R9LAotICAgIHsiYnRleHRybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKLSAgICB7InN0YXRpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9BVVRPSU1QfSwKLSAgICB7InVuaXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1VOSVh9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLSAgfTsKLQotICAvKiBPcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgQUlYIGxpbmtlciB3aGljaCB3ZSBkbyBub3Qgc3VwcG9ydDogLWYsCi0gICAgIC1TLCAtdiwgLVosIC1iYmluZGNtZHMsIC1iYmluZGVyLCAtYmJpbmRvcHRzLCAtYmNhbGxzLCAtYmNhcHMsCi0gICAgIC1iY3JvcjE1LCAtYmRlYnVnb3B0LCAtYmRiZywgLWJkZWxjc2VjdCwgLWJleD8sIC1iZmlsZWxpc3QsIC1iZmwsCi0gICAgIC1iZ2NieXBhc3MsIC1iZ2xpbmssIC1iaW5zZXJ0LCAtYmksIC1ibG9hZG1hcCwgLWJsLCAtYm1hcCwgLWJubCwKLSAgICAgLWJub2JpbmQsIC1ibm9jb21wcmxkLCAtYm5vY3JsZCwgLWJub2Vycm1zZywgLWJub2dsaW5rLAotICAgICAtYm5vbG9hZG1hcCwgLWJubCwgLWJub29ianJlb3JkZXIsIC1ibm9xdWlldCwgLWJub3Jlb3JkZXIsCi0gICAgIC1ibm90eXBjaGssIC1ibm94LCAtYnF1aWV0LCAtYlIsIC1icmVuYW1lLCAtYnJlb3JkZXIsIC1idHlwY2hrLAotICAgICAtYngsIC1iWCwgLWJ4cmVmLiAgKi8KLQotICAvKiBJZiB0aGUgY3VycmVudCBvcHRpb24gc3RhcnRzIHdpdGggLWIsIGNoYW5nZSB0aGUgZmlyc3QgOiB0byBhbiA9LgotICAgICBUaGUgQUlYIGxpbmtlciB1c2VzIDogdG8gc2VwYXJhdGUgdGhlIG9wdGlvbiBmcm9tIHRoZSBhcmd1bWVudDsKLSAgICAgY2hhbmdpbmcgaXQgdG8gPSBsZXRzIHVzIHRyZWF0IGl0IGFzIGEgZ2V0b3B0IG9wdGlvbi4gICovCi0gIGluZHggPSBvcHRpbmQ7Ci0gIGlmIChpbmR4ID09IDApCi0gICAgaW5keCA9IDE7Ci0gIGlmIChpbmR4IDwgYXJnYyAmJiBzdHJuY21wIChhcmd2W2luZHhdLCAiLWIiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9IGFyZ3ZbaW5keF07ICpzICE9ICdcMCc7IHMrKykKLQl7Ci0JICBpZiAoKnMgPT0gJzonKQotCSAgICB7Ci0JICAgICAgKnMgPSAnPSc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIG9wdGVyciA9IDA7Ci0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLUQ6SDpLVDp6IiwgbG9uZ29wdHMsICZsb25naW5kKTsKLSAgb3B0ZXJyID0gcHJldm9wdGVycjsKLQotICBzd2l0Y2ggKG9wdGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBvcHRpbmQgPSBwcmV2b3B0aW5kOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIDA6Ci0gICAgICAvKiBMb25nIG9wdGlvbiB3aGljaCBqdXN0IHNldHMgYSBmbGFnLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRCc6Ci0gICAgICB2YWwgPSBzdHJ0b2wgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtRCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZSBpZiAodmFsICE9IC0xKQotCWxhbmdfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgZXhwX2ludG9wICh2YWwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSCc6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJwotCSAgfHwgKHZhbCAmICh2YWwgLSAxKSkgIT0gMCkKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLUggbnVtYmVyICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQlmaWxlX2FsaWduID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdLJzoKLSAgICBjYXNlICd6JzoKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgdGhlIHBhZ2Ugc2l6ZSBmb3IgdGhlIHRhcmdldCBzeXN0ZW0uICAqLwotICAgICAgZmlsZV9hbGlnbiA9IDQwOTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogT24gQUlYIHRoaXMgaXMgdGhlIHNhbWUgYXMgR05VIGxkIC1UdGV4dC4gIFdoZW4gd2Ugc2VlIC1UCi0gICAgICAgICBudW1iZXIsIHdlIGFzc3VtZSB0aGUgQUlYIG9wdGlvbiBpcyBpbnRlbmRlZC4gIE90aGVyd2lzZSwgd2UKLSAgICAgICAgIGFzc3VtZSB0aGUgdXN1YWwgR05VIGxkIC1UIG9wdGlvbiBpcyBpbnRlbmRlZC4gIFdlIGNhbid0IGp1c3QKLSAgICAgICAgIGlnbm9yZSB0aGUgQUlYIG9wdGlvbiwgYmVjYXVzZSBnY2MgcGFzc2VzIGl0IHRvIHRoZSBsaW5rZXIuICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JewotCSAgb3B0aW5kID0gcHJldm9wdGluZDsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi50ZXh0IiwgZXhwX2ludG9wICh2YWwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fSUdOT1JFOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9BVVRPSU1QOgotICAgICAgbGlua19pbmZvLnN0YXRpY19saW5rID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VSTk9UT0s6Ci0gICAgICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVJPSzoKLSAgICAgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VYUE9SVDoKLSAgICAgIGdsZHBwY21hY29zX3JlYWRfZmlsZSAob3B0YXJnLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0lNUE9SVDoKLSAgICAgIHsKLQlzdHJ1Y3QgZmlsZWxpc3QgKm47Ci0Jc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKLQotCW4gPSAoc3RydWN0IGZpbGVsaXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVsaXN0KSk7Ci0Jbi0+bmV4dCA9IE5VTEw7Ci0Jbi0+bmFtZSA9IG9wdGFyZzsKLQlmbHBwID0gJmltcG9ydF9maWxlczsKLQl3aGlsZSAoKmZscHAgIT0gTlVMTCkKLQkgIGZscHAgPSAmKCpmbHBwKS0+bmV4dDsKLQkqZmxwcCA9IG47Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0xPQURNQVA6Ci0gICAgICBjb25maWcubWFwX2ZpbGVuYW1lID0gb3B0YXJnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NQVhEQVRBOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1ibWF4ZGF0YSBudW1iZXIgJXNcbiIpLAotCSAgICAgICBvcHRhcmcpOwotICAgICAgZWxzZQotCW1heGRhdGEgPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01BWFNUQUNLOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1ibWF4c3RhY2sgbnVtYmVyICVzXG4iKSwKLQkgICAgICAgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltYXhzdGFjayA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTU9EVFlQRToKLSAgICAgIGlmICgqb3B0YXJnID09ICdTJykKLQl7Ci0JICBsaW5rX2luZm8uc2hhcmVkID0gdHJ1ZTsKLQkgICsrb3B0YXJnOwotCX0KLSAgICAgIGlmICgqb3B0YXJnID09ICdcMCcgfHwgb3B0YXJnWzFdID09ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIG1vZHVsZSB0eXBlICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltb2R0eXBlID0gKCpvcHRhcmcgPDwgOCkgfCBvcHRhcmdbMV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PQVVUT0lNUDoKLSAgICAgIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PU1RSQ01QQ1Q6Ci0gICAgICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUEQ6Ci0gICAgICAvKiBUaGlzIHNldHMgdGhlIHBhZ2UgdGhhdCB0aGUgLmRhdGEgc2VjdGlvbiBpcyBzdXBwb3NlZCB0bwotICAgICAgICAgc3RhcnQgb24uICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSBzaG91bGQgc3RpbGwgYmUgdGhlCi0gICAgICAgICBvZmZzZXQgd2l0aGluIHRoZSBmaWxlLCBzbyB3ZSBuZWVkIHRvIGJ1aWxkIGFuIGFwcHJvcHJpYXRlCi0gICAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcEQgbnVtYmVyICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBldHJlZV90eXBlICp0OwotCi0JICB0ID0gZXhwX2Jpbm9wICgnKycsCi0JCQkgZXhwX2ludG9wICh2YWwpLAotCQkJIGV4cF9iaW5vcCAoJyYnLAotCQkJCSAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpLAotCQkJCSAgICBleHBfaW50b3AgKDB4ZmZmKSkpOwotCSAgdCA9IGV4cF9iaW5vcCAoJyYnLAotCQkJIGV4cF9iaW5vcCAoJysnLCB0LCBleHBfaW50b3AgKDcpKSwKLQkJCSBleHBfaW50b3AgKH4gKGJmZF92bWEpIDcpKTsKLQkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgdCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QVDoKLSAgICAgIC8qIFRoaXMgc2V0IHRoZSBwYWdlIHRoYXQgdGhlIC50ZXh0IHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gc3RhcnQKLSAgICAgICAgIG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZSBvZmZzZXQKLSAgICAgICAgIHdpdGhpbiB0aGUgZmlsZS4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLXBUIG51bWJlciAlc1xuIiksIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JewotCSAgZXRyZWVfdHlwZSAqdDsKLQotCSAgdCA9IGV4cF9iaW5vcCAoJysnLAotCQkJIGV4cF9pbnRvcCAodmFsKSwKLQkJCSBleHBfbmFtZW9wIChTSVpFT0ZfSEVBREVSUywgTlVMTCkpOwotCSAgdCA9IGV4cF9iaW5vcCAoJyYnLAotCQkJIGV4cF9iaW5vcCAoJysnLCB0LCBleHBfaW50b3AgKDcpKSwKLQkJCSBleHBfaW50b3AgKH4gKGJmZF92bWEpIDcpKTsKLQkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi50ZXh0IiwgdCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TVFJDTVBDVDoKLSAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVU5JWDoKLSAgICAgIHVuaXhfbGQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGZpbGUgY2FuIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgQkZECi0gICBvYmplY3Qgb3IgYW4gYXJjaGl2ZS4gIElmIHRoZSBmaWxlIHN0YXJ0cyB3aXRoICMhLCB3ZSBtdXN0IHRyZWF0IGl0Ci0gICBhcyBhbiBpbXBvcnQgZmlsZS4gIFRoaXMgaXMgZm9yIEFJWCBjb21wYXRpYmlsaXR5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZHBwY21hY29zX3VucmVjb2duaXplZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIEZJTEUgKmU7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGUgPSBmb3BlbiAoZW50cnktPmZpbGVuYW1lLCBGT1BFTl9SVCk7Ci0gIGlmIChlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldCA9IGZhbHNlOwotCi0gIGlmIChnZXRjIChlKSA9PSAnIycgJiYgZ2V0YyAoZSkgPT0gJyEnKQotICAgIHsKLSAgICAgIHN0cnVjdCBmaWxlbGlzdCAqbjsKLSAgICAgIHN0cnVjdCBmaWxlbGlzdCAqKmZscHA7Ci0KLSAgICAgIG4gPSAoc3RydWN0IGZpbGVsaXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVsaXN0KSk7Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIG4tPm5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0gICAgICBmbHBwID0gJmltcG9ydF9maWxlczsKLSAgICAgIHdoaWxlICgqZmxwcCAhPSBOVUxMKQotCWZscHAgPSAmKCpmbHBwKS0+bmV4dDsKLSAgICAgICpmbHBwID0gbjsKLQotICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgIGVudHJ5LT5sb2FkZWQgPSB0cnVlOwotICAgIH0KLQotICBmY2xvc2UgKGUpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2FmdGVyX29wZW4gKCkKLXsKLSAgYm9vbGVhbiByOwotICBzdHJ1Y3Qgc2V0X2luZm8gKnA7Ci0KLSAgLyogQ2FsbCBsZGN0b3JfYnVpbGRfc2V0cywgYWZ0ZXIgcHJldGVuZGluZyB0aGF0IHRoaXMgaXMgYQotICAgICByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvIHRoaXMgYmVjYXVzZSBBSVggcmVxdWlyZXMgcmVsb2NhdGlvbgotICAgICBlbnRyaWVzIGZvciBhbGwgcmVmZXJlbmNlcyB0byBzeW1ib2xzLCBldmVuIGluIGEgZmluYWwKLSAgICAgZXhlY3V0YWJsZS4gIE9mIGNvdXJzZSwgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgaWYgd2UgYXJlCi0gICAgIHByb2R1Y2luZyBhbiBYQ09GRiBvdXRwdXQgZmlsZS4gICovCi0gIHIgPSBsaW5rX2luZm8ucmVsb2NhdGVhYmxlOwotICBpZiAoc3Ryc3RyIChiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCksICJ4Y29mZiIpICE9IE5VTEwpCi0gICAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gIGxkY3Rvcl9idWlsZF9zZXRzICgpOwotICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gcjsKLQotICAvKiBGb3IgZWFjaCBzZXQsIHJlY29yZCB0aGUgc2l6ZSwgc28gdGhhdCB0aGUgWENPRkYgYmFja2VuZCBjYW4KLSAgICAgb3V0cHV0IHRoZSBjb3JyZWN0IGNzZWN0IGxlbmd0aC4gICovCi0gIGZvciAocCA9IHNldHM7IHAgIT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgd2UgbWF5IGhhdmUgYmVlbiBpbnZva2VkIGZyb20KLQkgY29sbGVjdCwgYW5kIHRoZSBzZXRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCwgc28gd2UgZG8KLQkgbm90IGRvIGFueXRoaW5nLiAgKi8KLSAgICAgIGlmIChwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgcC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChwLT5yZWxvYyAhPSBCRkRfUkVMT0NfQ1RPUikKLQl7Ci0JICAvKiBIYW5kbGUgdGhpcyBpZiB3ZSBuZWVkIHRvLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgc2l6ZSA9IChwLT5jb3VudCArIDIpICogNDsKLSAgICAgIGlmICghIGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHAtPmgsIHNpemUpKQotCWVpbmZvIChfKCIlRiVQOiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0IGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgc3RydWN0IGZpbGVsaXN0ICpmbDsKLSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqZWw7Ci0gIGNoYXIgKmxpYnBhdGg7Ci0gIGFzZWN0aW9uICpzcGVjaWFsX3NlY3Rpb25zWzZdOwotICBpbnQgaTsKLQotICAvKiBIYW5kbGUgdGhlIGltcG9ydCBhbmQgZXhwb3J0IGZpbGVzLCBpZiBhbnkuICAqLwotICBmb3IgKGZsID0gaW1wb3J0X2ZpbGVzOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5uZXh0KQotICAgIGdsZHBwY21hY29zX3JlYWRfZmlsZSAoZmwtPm5hbWUsIHRydWUpOwotICBmb3IgKGVsID0gZXhwb3J0X3N5bWJvbHM7IGVsICE9IE5VTEw7IGVsID0gZWwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGVsLT5uYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JZWluZm8gKF8oIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIG9mIGV4cG9ydCBzeW1ib2wgZmFpbGVkOiAlRVxuIikpOwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGgsIGVsLT5zeXNjYWxsKSkKLQllaW5mbyAoXygiJVAlRjogYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLQotICAvKiBUcmFjayBkb3duIGFsbCByZWxvY2F0aW9ucyBjYWxsZWQgZm9yIGJ5IHRoZSBsaW5rZXIgc2NyaXB0ICh0aGVzZQotICAgICBhcmUgdHlwaWNhbGx5IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZW50cmllcyBjcmVhdGVkIGJ5Ci0gICAgIENPTlNUUlVDVE9SUykgYW5kIGxldCB0aGUgYmFja2VuZCBrbm93IGl0IHdpbGwgbmVlZCB0byBjcmVhdGUKLSAgICAgLmxvYWRlciByZWxvY3MgZm9yIHRoZW0uICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkcHBjbWFjb3NfZmluZF9yZWxvY3MpOwotCi0gIC8qIFdlIG5lZWQgdG8gYnVpbGQgTElCUEFUSCBmcm9tIHRoZSAtTCBhcmd1bWVudHMuICBJZiBhbnkgLXJwYXRoCi0gICAgIGFyZ3VtZW50cyB3ZXJlIHVzZWQsIHRob3VnaCwgd2UgdXNlIC1ycGF0aCBpbnN0ZWFkLCBhcyBhIEdOVQotICAgICBleHRlbnNpb24uICAqLwotICBpZiAoY29tbWFuZF9saW5lLnJwYXRoICE9IE5VTEwpCi0gICAgbGlicGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgZWxzZSBpZiAoc2VhcmNoX2hlYWQgPT0gTlVMTCkKLSAgICBsaWJwYXRoID0gKGNoYXIgKikgIiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKHNlYXJjaF9oZWFkLT5uYW1lKTsKLSAgICAgIGxpYnBhdGggPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cmNweSAobGlicGF0aCwgc2VhcmNoX2hlYWQtPm5hbWUpOwotICAgICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZC0+bmV4dDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQl7Ci0JICBzaXplX3QgbmxlbjsKLQotCSAgbmxlbiA9IHN0cmxlbiAoc2VhcmNoLT5uYW1lKTsKLQkgIGxpYnBhdGggPSB4cmVhbGxvYyAobGlicGF0aCwgbGVuICsgbmxlbiArIDIpOwotCSAgbGlicGF0aFtsZW5dID0gJzonOwotCSAgc3RyY3B5IChsaWJwYXRoICsgbGVuICsgMSwgc2VhcmNoLT5uYW1lKTsKLQkgIGxlbiArPSBubGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIExldCB0aGUgWENPRkYgYmFja2VuZCBzZXQgdXAgdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0gIGlmICghIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGxpYnBhdGgsCi0JCQkJCSBlbnRyeV9zeW1ib2wsIGZpbGVfYWxpZ24sCi0JCQkJCSBtYXhzdGFjaywgbWF4ZGF0YSwKLQkJCQkJIGdjICYmICEgdW5peF9sZCA/IHRydWUgOiBmYWxzZSwKLQkJCQkJIG1vZHR5cGUsCi0JCQkJCSB0ZXh0cm8gPyB0cnVlIDogZmFsc2UsCi0JCQkJCSB1bml4X2xkLAotCQkJCQkgc3BlY2lhbF9zZWN0aW9ucykpCi0gICAgZWluZm8gKF8oIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIikpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3BlY2lhbCBzZWN0aW9ucywgYW5kIHB1dCB0aGVtIGluIHRoZSByaWdodAotICAgICBwbGFjZSBpbiB0aGUgbGluayBvcmRlcmluZy4gIFRoaXMgaXMgZXNwZWNpYWxseSBtYWdpYy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnBsczsKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppczsKLSAgICAgIGNvbnN0IGNoYXIgKm9uYW1lOwotICAgICAgYm9vbGVhbiBzdGFydDsKLQotICAgICAgc2VjID0gc3BlY2lhbF9zZWN0aW9uc1tpXTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogUmVtb3ZlIHRoaXMgc2VjdGlvbiBmcm9tIHRoZSBsaXN0IG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4KLSAgICAgICAgIFRoaXMgYXNzdW1lcyB3ZSBrbm93IHdoYXQgdGhlIHNjcmlwdCBsb29rcyBsaWtlLiAgKi8KLSAgICAgIGlzID0gTlVMTDsKLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGlmIChvcyA9PSBOVUxMKQotCWVpbmZvIChfKCIlUCVGOiBjYW4ndCBmaW5kIG91dHB1dCBzZWN0aW9uICVzXG4iKSwKLQkgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBmb3IgKHBscyA9ICZvcy0+Y2hpbGRyZW4uaGVhZDsgKnBscyAhPSBOVUxMOyBwbHMgPSAmKCpwbHMpLT5uZXh0KQotCXsKLQkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JICAgICAgJiYgKCpwbHMpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24gPT0gc2VjKQotCSAgICB7Ci0JICAgICAgaXMgPSAobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKikgKnBsczsKLQkgICAgICAqcGxzID0gKCpwbHMpLT5uZXh0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoKCpwbHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW0pCi0JICAgIHsKLQkgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHdsczsKLQotCSAgICAgIGZvciAocHdscyA9ICYoKnBscyktPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQ7Ci0JCSAgICpwd2xzICE9IE5VTEw7Ci0JCSAgIHB3bHMgPSAmKCpwd2xzKS0+bmV4dCkKLQkJewotCQkgIGlmICgoKnB3bHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCQkgICAgICAmJiAoKnB3bHMpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24gPT0gc2VjKQotCQkgICAgewotCQkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcHdsczsKLQkJICAgICAgKnB3bHMgPSAoKnB3bHMpLT5uZXh0OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmIChpcyAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0JCi0KLSAgICAgIGlmIChpcyA9PSBOVUxMKQotCWVpbmZvIChfKCIlUCVGOiBjYW4ndCBmaW5kICVzIGluIG91dHB1dCBzZWN0aW9uXG4iKSwKLQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKHNlYy0+b3duZXIsIHNlYykpOwotCi0gICAgICAvKiBOb3cgZmlndXJlIG91dCB3aGVyZSB0aGUgc2VjdGlvbiBzaG91bGQgZ28uICAqLwotICAgICAgc3dpdGNoIChpKQotCXsKLQlkZWZhdWx0OiAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLwotCWNhc2UgMDoKLQkgIC8qIF90ZXh0ICovCi0JICBvbmFtZSA9ICIudGV4dCI7Ci0JICBzdGFydCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAvKiBfZXRleHQgKi8KLQkgIG9uYW1lID0gIi50ZXh0IjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICAvKiBfZGF0YSAqLwotCSAgb25hbWUgPSAiLmRhdGEiOwotCSAgc3RhcnQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgLyogX2VkYXRhICovCi0JICBvbmFtZSA9ICIuZGF0YSI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkgIC8qIF9lbmQgYW5kIGVuZCAqLwotCSAgb25hbWUgPSAiLmJzcyI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAob25hbWUpOwotCi0gICAgICBpZiAoc3RhcnQpCi0JewotCSAgaXMtPmhlYWRlci5uZXh0ID0gb3MtPmNoaWxkcmVuLmhlYWQ7Ci0JICBvcy0+Y2hpbGRyZW4uaGVhZCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpcy0+aGVhZGVyLm5leHQgPSBOVUxMOwotCSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmb3MtPmNoaWxkcmVuLAotCQkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBpcywKLQkJCQkgJmlzLT5oZWFkZXIubmV4dCk7Ci0JfQotICAgIH0KLX0KLQotLyogUmVhZCBhbiBpbXBvcnQgb3IgZXhwb3J0IGZpbGUuICBGb3IgYW4gaW1wb3J0IGZpbGUsIHRoaXMgaXMgY2FsbGVkCi0gICBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gZW11bGF0aW9uIHJvdXRpbmUuICBGb3IgYW4gZXhwb3J0IGZpbGUsCi0gICB0aGlzIGlzIGNhbGxlZCBieSB0aGUgcGFyc2VfYXJncyBlbXVsYXRpb24gcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19yZWFkX2ZpbGUgKGZpbGVuYW1lLCBpbXBvcnQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBib29sZWFuIGltcG9ydDsKLXsKLSAgc3RydWN0IG9ic3RhY2sgKm87Ci0gIEZJTEUgKmY7Ci0gIGludCBsaW5lbm87Ci0gIGludCBjOwotICBib29sZWFuIGtlZXA7Ci0gIGNvbnN0IGNoYXIgKmltcHBhdGg7Ci0gIGNvbnN0IGNoYXIgKmltcGZpbGU7Ci0gIGNvbnN0IGNoYXIgKmltcG1lbWJlcjsKLQotICBvID0gKHN0cnVjdCBvYnN0YWNrICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG9ic3RhY2spKTsKLSAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKG8sIDAsIDAsIHhtYWxsb2MsIGdsZHBwY21hY29zX2ZyZWUpOwotCi0gIGYgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1JUKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZWluZm8gKCIlRiVzOiAlRVxuIiwgZmlsZW5hbWUpOwotICAgIH0KLQotICBrZWVwID0gZmFsc2U7Ci0KLSAgaW1wcGF0aCA9IE5VTEw7Ci0gIGltcGZpbGUgPSBOVUxMOwotICBpbXBtZW1iZXIgPSBOVUxMOwotCi0gIGxpbmVubyA9IDA7Ci0gIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0gICAgICBib29sZWFuIHN5c2NhbGw7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaWYgKGMgIT0gJ1xuJykKLQl7Ci0JICBvYnN0YWNrXzFncm93IChvLCBjKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgb2JzdGFja18xZ3JvdyAobywgJ1wwJyk7Ci0gICAgICArK2xpbmVubzsKLQotICAgICAgcyA9IChjaGFyICopIG9ic3RhY2tfYmFzZSAobyk7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkrK3M7Ci0gICAgICBpZiAoKnMgPT0gJ1wwJwotCSAgfHwgKnMgPT0gJyonCi0JICB8fCAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyAnKQotCSAgfHwgKCEgaW1wb3J0ICYmICpzID09ICcjJyAmJiBzWzFdID09ICchJykpCi0JewotCSAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCpzID09ICcjJyAmJiBzWzFdID09ICchJykKLQl7Ci0JICBzICs9IDI7Ci0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgICAgKytzOwotCSAgaWYgKCpzID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpbXBwYXRoID0gTlVMTDsKLQkgICAgICBpbXBmaWxlID0gTlVMTDsKLQkgICAgICBpbXBtZW1iZXIgPSBOVUxMOwotCSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpzID09ICcoJykKLQkgICAgZWluZm8gKF8oIiVGJXMlZDogIyEgKFttZW1iZXJdKSBpcyBub3Qgc3VwcG9ydGVkIGluIGltcG9ydCBmaWxlc1xuIiksCi0JCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciBjczsKLQkgICAgICBjaGFyICpmaWxlOwotCi0JICAgICAgKHZvaWQpIG9ic3RhY2tfZmluaXNoIChvKTsKLQkgICAgICBrZWVwID0gdHJ1ZTsKLQkgICAgICBpbXBwYXRoID0gczsKLQkgICAgICBmaWxlID0gTlVMTDsKLQkgICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICcoJyAmJiAqcyAhPSAnXDAnKQotCQl7Ci0JCSAgaWYgKCpzID09ICcvJykKLQkJICAgIGZpbGUgPSBzICsgMTsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoZmlsZSAhPSBOVUxMKQotCQl7Ci0JCSAgZmlsZVstMV0gPSAnXDAnOwotCQkgIGltcGZpbGUgPSBmaWxlOwotCQkgIGlmIChpbXBwYXRoID09IGZpbGUgLSAxKQotCQkgICAgaW1wcGF0aCA9ICIvIjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGltcGZpbGUgPSBpbXBwYXRoOwotCQkgIGltcHBhdGggPSAiIjsKLQkJfQotCSAgICAgIGNzID0gKnM7Ci0JICAgICAgKnMgPSAnXDAnOwotCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3MpKQotCQl7Ci0JCSAgKytzOwotCQkgIGNzID0gKnM7Ci0JCX0KLQkgICAgICBpZiAoY3MgIT0gJygnKQotCQl7Ci0JCSAgaW1wbWVtYmVyID0gIiI7Ci0JCSAgaWYgKGNzICE9ICdcMCcpCi0JCSAgICBlaW5mbyAoXygiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQgZmlsZVxuIiksCi0JCQkgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICsrczsKLQkJICBpbXBtZW1iZXIgPSBzOwotCQkgIHdoaWxlICgqcyAhPSAnKScgJiYgKnMgIT0gJ1wwJykKLQkJICAgICsrczsKLQkJICBpZiAoKnMgPT0gJyknKQotCQkgICAgKnMgPSAnXDAnOwotCQkgIGVsc2UKLQkJICAgIGVpbmZvIChfKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iKSwKLQkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIHRvIGJlIGltcG9ydGVkIG9yIGV4cG9ydGVkLiAgKi8KLSAgICAgIHN5bW5hbWUgPSBzOwotICAgICAgc3lzY2FsbCA9IGZhbHNlOwotICAgICAgYWRkcmVzcyA9IChiZmRfdm1hKSAtMTsKLQotICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSAmJiAqcyAhPSAnXDAnKQotCSsrczsKLSAgICAgIGlmICgqcyAhPSAnXDAnKQotCXsKLQkgIGNoYXIgKnNlOwotCi0JICAqcysrID0gJ1wwJzsKLQotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JICAgICsrczsKLQotCSAgc2UgPSBzOwotCSAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkgJiYgKnNlICE9ICdcMCcpCi0JICAgICsrc2U7Ci0JICBpZiAoKnNlICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAqc2UrKyA9ICdcMCc7Ci0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqc2UpKQotCQkrK3NlOwotCSAgICAgIGlmICgqc2UgIT0gJ1wwJykKLQkJZWluZm8gKF8oIiVzJWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgIH0KLQotCSAgaWYgKHN0cmNhc2VjbXAgKHMsICJzdmMiKSA9PSAwCi0JICAgICAgfHwgc3RyY2FzZWNtcCAocywgInN5c2NhbGwiKSA9PSAwKQotCSAgICBzeXNjYWxsID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmVuZDsKLQotCSAgICAgIGFkZHJlc3MgPSBzdHJ0b3VsIChzLCAmZW5kLCAwKTsKLQkgICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCQllaW5mbyAoXygiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGltcG9ydCkKLQl7Ci0JICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpuOwotCi0JICBsZGxhbmdfYWRkX3VuZGVmIChzeW1uYW1lKTsKLQkgIG4gPSAoKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKikKLQkgICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0KSkpOwotCSAgbi0+bmV4dCA9IGV4cG9ydF9zeW1ib2xzOwotCSAgbi0+bmFtZSA9IGJ1eXN0cmluZyAoc3ltbmFtZSk7Ci0JICBuLT5zeXNjYWxsID0gc3lzY2FsbDsKLQkgIGV4cG9ydF9zeW1ib2xzID0gbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgc3ltbmFtZSwgZmFsc2UsIGZhbHNlLAotCQkJCSAgICB0cnVlKTsKLQkgIGlmIChoID09IE5VTEwgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiBqdXN0IGlnbm9yZSBhdHRlbXB0cyB0byBpbXBvcnQgYW4gdW5yZWZlcmVuY2VkCi0JCSBzeW1ib2wuICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwKLQkJCQkJICAgICBhZGRyZXNzLCBpbXBwYXRoLCBpbXBmaWxlLAotCQkJCQkgICAgIGltcG1lbWJlcikpCi0JCWVpbmZvIChfKCIlWCVzOiVkOiBmYWlsZWQgdG8gaW1wb3J0IHN5bWJvbCAlczogJUVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubywgc3ltbmFtZSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0gICAgfQotCi0gIGlmIChvYnN0YWNrX29iamVjdF9zaXplIChvKSA+IDApCi0gICAgewotICAgICAgZWluZm8gKF8oIiVzOiVkOiB3YXJuaW5nOiBpZ25vcmluZyB1bnRlcm1pbmF0ZWQgbGFzdCBsaW5lXG4iKSwKLQkgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwotICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLSAgICB9Ci0KLSAgaWYgKCEga2VlcCkKLSAgICB7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIE5VTEwpOwotICAgICAgZnJlZSAobyk7Ci0gICAgfQotfQotCi0vKiBUaGlzIHJvdXRpbmUgc2F2ZXMgdXMgZnJvbSB3b3JyeWluZyBhYm91dCBkZWNsYXJpbmcgZnJlZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19mcmVlIChwKQotICAgICBQVFIgcDsKLXsKLSAgZnJlZSAocCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb29rcyBmb3IgcmVsb2NhdGlvbnMgYW5kIGFzc2lnbm1lbnRzCi0gICB0byBzeW1ib2xzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2ZpbmRfcmVsb2NzIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bSkKLSAgICB7Ci0gICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyczsKLQotICAgICAgcnMgPSAmcy0+cmVsb2Nfc3RhdGVtZW50OwotICAgICAgaWYgKHJzLT5uYW1lID09IE5VTEwpCi0JZWluZm8gKF8oIiVGJVA6IG9ubHkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBwZXJtaXR0ZWRcbiIpKTsKLSAgICAgIGlmICghIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBycy0+bmFtZSkpCi0JZWluZm8gKF8oIiVGJVA6IGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci0KLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSkKLSAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKLQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCi0JCQkJCQkgIGV4cC0+YXNzaWduLmRzdCkpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iKSwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZHBwY21hY29zX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi1FTlRSWShfX3N0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKLSAgLnRleHQgMCA6IHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcInhjb2ZmLXBvd2VybWFjXCIpXG5cCi1PVVRQVVRfQVJDSChwb3dlcnBjKVxuXAotRU5UUlkoX19zdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCi0gIC50ZXh0IDAgOiB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgKigucncpXG5cCi0gICAgKiguc3YpXG5cCi0gICAgKigudWEpXG5cCi0gICAgLiA9IEFMSUdOKDQpO1xuXAotICAgICooLmRzKVxuXAotICAgICooLnRjMClcblwKLSAgICAqKC50YylcblwKLSAgICAqKC50ZClcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKC5icylcblwKLSAgICAqKC51YylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYXBwbGUtbWFjb3MvbGliKTtcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAgIDoge1xuXAotICAgIFBST1ZJREUgKF90ZXh0ID0gLik7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgICBQUk9WSURFIChfZXRleHQgPSAuKTtcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgIFBST1ZJREUgKF9kYXRhID0gLik7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICAgIFBST1ZJREUgKF9lZGF0YSA9IC4pO1xuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgIFBST1ZJREUgKF9lbmQgPSAuKTtcblwKLSAgICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcInhjb2ZmLXBvd2VybWFjXCIpXG5cCi1PVVRQVVRfQVJDSChwb3dlcnBjKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFwcGxlLW1hY29zL2xpYik7XG5cCi1FTlRSWShfX3N0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKLSAgLnRleHQgICA6IHtcblwKLSAgICBQUk9WSURFIChfdGV4dCA9IC4pO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucHIpXG5cCi0gICAgKigucm8pXG5cCi0gICAgKiguZGIpXG5cCi0gICAgKiguZ2wpXG5cCi0gICAgKigueG8pXG5cCi0gICAgKigudGkpXG5cCi0gICAgKigudGIpXG5cCi0gICAgUFJPVklERSAoX2V0ZXh0ID0gLik7XG5cCi0gIH1cblwKLSAgLmRhdGEgMCA6IHtcblwKLSAgICBQUk9WSURFIChfZGF0YSA9IC4pO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgKigucncpXG5cCi0gICAgKiguc3YpXG5cCi0gICAgKigudWEpXG5cCi0gICAgLiA9IEFMSUdOKDQpO1xuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICAgICooLmRzKVxuXAotICAgICooLnRjMClcblwKLSAgICAqKC50YylcblwKLSAgICAqKC50ZClcblwKLSAgICBQUk9WSURFIChfZWRhdGEgPSAuKTtcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKC5icylcblwKLSAgICAqKC51YylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICBQUk9WSURFIChfZW5kID0gLik7XG5cCi0gICAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIH1cblwKLSAgLmxvYWRlciAwIDoge1xuXAotICAgICooLmxvYWRlcilcblwKLSAgfVxuXAotICAuZGVidWcgMCA6IHtcblwKLSAgICAqKC5kZWJ1ZylcblwKLSAgfVxuXAotfVxuXG4iCi0gIDsgZWxzZSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYXBwbGUtbWFjb3MvbGliKTtcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAgIDoge1xuXAotICAgIFBST1ZJREUgKF90ZXh0ID0gLik7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgICBQUk9WSURFIChfZXRleHQgPSAuKTtcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgIFBST1ZJREUgKF9kYXRhID0gLik7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICAgIFBST1ZJREUgKF9lZGF0YSA9IC4pO1xuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgIFBST1ZJREUgKF9lbmQgPSAuKTtcblwKLSAgICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLTsgfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX3BwY21hY29zX2VtdWxhdGlvbiA9IAotewotICBnbGRwcGNtYWNvc19iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkcHBjbWFjb3NfYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGRwcGNtYWNvc19iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkcHBjbWFjb3NfZ2V0X3NjcmlwdCwKLSAgInBwY21hY29zIiwKLSAgInhjb2ZmLXBvd2VybWFjIiwKLSAgMCwJLyogZmluaXNoICovCi0gIDAsCS8qIGNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICovCi0gIDAsCS8qIG9wZW5fZHluYW1pY19hcmNoaXZlICovCi0gIDAsCS8qIHBsYWNlX29ycGhhbiAqLwotICAwLAkvKiBzZXRfc3ltYm9scyAqLwotICBnbGRwcGNtYWNvc19wYXJzZV9hcmdzLAotICBnbGRwcGNtYWNvc191bnJlY29nbml6ZWRfZmlsZQotfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1lc2guYyBiL2xkL21wdy1lc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiYzVmNS4uMDAwMDAwMAotLS0gYS9sZC9tcHctZXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiBzaAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX3NoCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGRzaF9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZHNoX2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZHNoX2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfc2g7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkc2hfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotY29uY2F0KAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLU1FTU9SWVxuXAote1xuXAotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAotfVxuXAotICIsIiBTRUNUSU9OU1xuXAote1xuXAotICIsIiAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICB9IFxuXAotICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gXG5cCi0gIiwiICAuZGF0YSA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICB9IFxuXAotICIsIiAuYnNzIDpcblwKLSAge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfSBcblwKLSAiLCIgLnN0YWNrICAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhY2spXG5cCi0gIH0gXG5cCi0gIiwiIC5zdGFiIDAgIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgLnN0YWJzdHIgMCAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLSAiLCIgTUVNT1JZXG5cCi17XG5cCi0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCi19XG5cCi0gIiwiIFNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gIH0gXG5cCi0gIiwiICAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9IFxuXAotICIsIiAgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH0gXG5cCi0gIiwiICAgLmJzcyA6XG5cCi0gIHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH0gXG5cCi0gIiwiICAgLnN0YWNrICAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhY2spXG5cCi0gIH0gXG5cCi0gIiwiICAgLnN0YWIgMCAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAgIC5zdGFic3RyIDAgIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKLU9VVFBVVF9BUkNIKHNoKVxuXAotTUVNT1JZXG5cCi17XG5cCi0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCi19XG5cCi1TRUNUSU9OU1xuXAote1xuXAotICIsIiAgIC50ZXh0IDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3RyaW5ncylcblwKLSAgICAgX2V0ZXh0ID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC50b3JzIDpcblwKLSAge1xuXAotICAgIF9fX2N0b3JzID0gLiA7XG5cCi0gICAgKiguY3RvcnMpXG5cCi0gICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCi0gICAgX19fZHRvcnMgPSAuIDtcblwKLSAgICAqKC5kdG9ycylcblwKLSAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuZGF0YSA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICBfZWRhdGEgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmJzcyA6XG5cCi0gIHtcblwKLSAgICAgX2Jzc19zdGFydCA9IC4gOyBcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgIF9lbmQgPSAuIDsgIFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFjayAgMHgzMDAwMCAgIDpcblwKLSAge1xuXAotICAgICBfc3RhY2sgPSAuIDsgXG5cCi0gICAgKiguc3RhY2spXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWIgMCAoTk9MT0FEKSA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFiKVxuXAotICB9XG5cCi0gIiwiICAgLnN0YWJzdHIgMCAoTk9MT0FEKSA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFic3RyKVxuXAotICB9XG5cCi19XG5cbiIsIE5VTEwpCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAotT1VUUFVUX0FSQ0goc2gpXG5cCi1NRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICAgICBfZXRleHQgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgIF9lZGF0YSA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuYnNzIDpcblwKLSAge1xuXAotICAgICBfYnNzX3N0YXJ0ID0gLiA7IFxuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICAgX2VuZCA9IC4gOyAgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWNrICAweDMwMDAwICAgOlxuXAotICB7XG5cCi0gICAgIF9zdGFjayA9IC4gOyBcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhYiAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgICAuc3RhYnN0ciAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAotT1VUUFVUX0FSQ0goc2gpXG5cCi1NRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICAgICBfZXRleHQgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgIF9lZGF0YSA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuYnNzIDpcblwKLSAge1xuXAotICAgICBfYnNzX3N0YXJ0ID0gLiA7IFxuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICAgX2VuZCA9IC4gOyAgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWNrICAweDMwMDAwICAgOlxuXAotICB7XG5cCi0gICAgIF9zdGFjayA9IC4gOyBcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhYiAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgICAuc3RhYnN0ciAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLTsgfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX3NoX2VtdWxhdGlvbiA9IAotewotICBnbGRzaF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZHNoX2dldF9zY3JpcHQsCi0gICJzaCIsCi0gICJjb2ZmLXNoIgotfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1pZHRtaXBzLmMgYi9sZC9tcHctaWR0bWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGRkYzcwLi4wMDAwMDAwCi0tLSBhL2xkL21wdy1pZHRtaXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBIYW5kbGUgZW1iZWRkZWQgcmVsb2NzIGZvciBNSVBTLgotICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiBiYXNlZCBvbiBnZW5lcmljLmVtLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19taXBzaWR0Ci0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGRtaXBzaWR0X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRtaXBzaWR0X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2hlY2tfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGRtaXBzaWR0X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZG1pcHNpZHRfYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9taXBzOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcnVuIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4KLSAgIFdlIGNyZWF0ZSBhIC5yZWwuc2RhdGEgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBmaWxlIHdpdGggYSBub24gemVybwotICAgLnNkYXRhIHNlY3Rpb24uICBUaGUgQkZEIGJhY2tlbmQgd2lsbCBmaWxsIGluIHRoZXNlIHNlY3Rpb25zIHdpdGgKLSAgIG1hZ2ljIG51bWJlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVsb2NhdGUgdGhlIGRhdGEgc2VjdGlvbiBhdCBydW4KLSAgIHRpbWUuICBUaGlzIHdpbGwgb25seSBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgYWxsIHRoZSBpbnB1dCBmaWxlcwotICAgaGF2ZSBiZWVuIGNvbXBpbGVkIHVzaW5nIC1tZW1iZWRkZWQtcGljLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZG1pcHNpZHRfYWZ0ZXJfb3BlbiAoKQotewotICBiZmQgKmFiZmQ7Ci0KLSAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcwotICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YXNlYzsKLQotICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVsb2NfY291bnQgZmllbGQgaGFzIGFscmVhZHkKLSAgICAgICAgIGJlZW4gc2V0IHVwLiAgV2UgY291bGQgY2FsbCBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBidXQKLSAgICAgICAgIHRoYXQgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG1lbW9yeSBidWZmZXIgcmF0aGVyIHRoYW4gYSByZWxvYwotICAgICAgICAgY291bnQuICBXZSBkbyBub3Qgd2FudCB0byBjYWxsIGJmZF9jYW5vbmljYWxpemVfcmVsb2MsCi0gICAgICAgICBiZWNhdXNlIGFsdGhvdWdoIGl0IHdvdWxkIGFsd2F5cyB3b3JrIGl0IHdvdWxkIGZvcmNlIHVzIHRvCi0gICAgICAgICByZWFkIGluIHRoZSByZWxvY3MgaW50byBCRkQgY2Fub25pY2FsIGZvcm0sIHdoaWNoIHdvdWxkIHdhc3RlCi0gICAgICAgICBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIGFuZCBtZW1vcnkuICAqLwotICAgICAgaWYgKGRhdGFzZWMgIT0gTlVMTCAmJiBkYXRhc2VjLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgYXNlY3Rpb24gKnJlbHNlYzsKLQotCSAgcmVsc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yZWwuc2RhdGEiKTsKLQkgIGlmIChyZWxzZWMgPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCByZWxzZWMsCi0JCQkJCSAgKFNFQ19BTExPQwotCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkpKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcmVsc2VjLCAyKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbHNlYywKLQkJCQkJIGRhdGFzZWMtPnJlbG9jX2NvdW50ICogNCkpCi0JICAgIGVpbmZvIChfKCIlRiVCOiBjYW4gbm90IGNyZWF0ZSAucmVsLnNkYXRhIHNlY3Rpb246ICVFXG4iKSk7Ci0JfQotCi0gICAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBhbGwgb3RoZXIgZGF0YSBzZWN0aW9ucyBhcmUgZW1wdHksIGFzIGlzCi0gICAgICAgICByZXF1aXJlZCBmb3IgZW1iZWRkZWQgUElDIGNvZGUuICAqLwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBjaGVja19zZWN0aW9ucywgKFBUUikgZGF0YXNlYyk7Ci0gICAgfQotfQotCi0vKiBDaGVjayB0aGF0IG9mIHRoZSBkYXRhIHNlY3Rpb25zLCBvbmx5IHRoZSAuc2RhdGEgc2VjdGlvbiBoYXMKLSAgIHJlbG9jcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfc2VjdGlvbnMgKGFiZmQsIHNlYywgc2RhdGFzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHNkYXRhc2VjOwotewotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKSA9PSAwCi0gICAgICAmJiBzZWMgIT0gKGFzZWN0aW9uICopIHNkYXRhc2VjCi0gICAgICAmJiBzZWMtPnJlbG9jX2NvdW50ICE9IDApCi0gICAgZWluZm8gKF8oIiVGJVg6IHNlY3Rpb24gJXMgaGFzIHJlbG9jczsgY2FuIG5vdCB1c2UgLS1lbWJlZGRlZC1yZWxvY3NcbiIpLAotCSAgIGFiZmQsIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIG9mZnNldHMgaGF2ZQotICAgYmVlbiBzZXQuICBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBlbWJlZGRlZCByZWxvY3MsIGl0IGNhbGxzIGEgc3BlY2lhbAotICAgQkZEIGJhY2tlbmQgcm91dGluZSB0byBkbyB0aGUgd29yay4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRtaXBzaWR0X2FmdGVyX2FsbG9jYXRpb24gKCkKLXsKLSAgYmZkICphYmZkOwotCi0gIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKLSAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFzZWMsICpyZWxzZWM7Ci0gICAgICBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOwotCi0gICAgICBpZiAoZGF0YXNlYyA9PSBOVUxMIHx8IGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHJlbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbC5zZGF0YSIpOwotICAgICAgQVNTRVJUIChyZWxzZWMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MgKGFiZmQsICZsaW5rX2luZm8sCi0JCQkJCQkgICBkYXRhc2VjLCByZWxzZWMsCi0JCQkJCQkgICAmZXJybXNnKSkKLQl7Ci0JICBpZiAoZXJybXNnID09IE5VTEwpCi0JICAgIGVpbmZvIChfKCIlQiVYOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlRVxuIiksCi0JCSAgIGFiZmQpOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVglQjogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJXNcbiIpLAotCQkgICBhYmZkLCBlcnJtc2cpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZG1pcHNpZHRfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotY29uY2F0KAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAudGV4dCA6IHtcblwKLSAgICA7XG5cCi0gICAgKiguaW5pdClcblwKLSAgICA7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5yZWwuc2RhdGEpXG5cCi0gICAgKiguZmluaSlcblwKLSAgICA7XG5cCi0gICAgO1xuXAotICB9XG5cCi0gIiwiICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICB9XG5cCi0gIC5saXQ0IDoge1xuXAotICAgICooLmxpdDQpXG5cCi0gIH1cblwKLSAiLCIgIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAudGV4dCA6IHtcblwKLSAgICA7XG5cCi0gICAgKiguaW5pdClcblwKLSAgICA7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5yZWwuc2RhdGEpXG5cCi0gICAgKiguZmluaSlcblwKLSAgICA7XG5cCi0gICAgO1xuXAotICB9XG5cCi0gIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICB9XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICAuc2RhdGEgOiB7XG5cCi0gICAgKiguc2RhdGEpXG5cCi0gIH1cblwKLSAgLnNic3MgOiB7XG5cCi0gICAgKiguc2JzcylcblwKLSAgICAqKC5zY29tbW9uKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4KLWNvbmNhdCgKLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLiA9IDB4YTAwMTIwMDA7XG5cCi0gIC50ZXh0IDoge1xuXAotICAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgICBlcHJvbCAgPSAgLjtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAotICAgICooLmZpbmkpXG5cCi0gICAgIGV0ZXh0ICA9ICAuO1xuXAotICAgICBfZXRleHQgID0gIC47XG5cCi0iLCIgIH1cblwKLSAgLiA9IC47XG5cCi0gIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAgX2ZkYXRhID0gQUxJR04oMTYpO1xuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gICBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICAuc2RhdGEgOiB7XG5cCi0gICAgKiguc2RhdGEpXG5cCi0gIH1cblwKLSIsIiAgIGVkYXRhICA9ICAuO1xuXAotICAgX2VkYXRhICA9ICAuO1xuXAotICAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgIGVuZCA9IC47XG5cCi0gICBfZW5kID0gLjtcblwKLX1cblxuIgotLCBOVUxMKQotICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC4gPSAweGEwMDEyMDAwO1xuXAotICAudGV4dCA6IHtcblwKLSAgICAgX2Z0ZXh0ID0gLiA7XG5cCi0gICAgKiguaW5pdClcblwKLSAgICAgZXByb2wgID0gIC47XG5cCi0gICAgKigudGV4dClcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgPSAuKTtcblwKLSAgICAqKC5yZWwuc2RhdGEpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0b3AgPSAuKTtcblwKLSAgICAqKC5maW5pKVxuXAotICAgICBldGV4dCAgPSAgLjtcblwKLSAgICAgX2V0ZXh0ICA9ICAuO1xuXAotICIsIiAgfVxuXAotICAuID0gLjtcblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gICBfZmRhdGEgPSBBTElHTigxNik7XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtcblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAiLCIgIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICAuc2RhdGEgOiB7XG5cCi0gICAgKiguc2RhdGEpXG5cCi0gIH1cblwKLSAgIGVkYXRhICA9ICAuO1xuXAotICAgX2VkYXRhICA9ICAuO1xuXAotICAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIiwiICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gICBlbmQgPSAuO1xuXAotICAgX2VuZCA9IC47XG5cCi19XG5cbiIKLSwgTlVMTCkKLSAgOyBlbHNlIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLiA9IDB4YTAwMTIwMDA7XG5cCi0gIC50ZXh0IDoge1xuXAotICAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgICBlcHJvbCAgPSAgLjtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAotICAgICooLmZpbmkpXG5cCi0gICAgIGV0ZXh0ICA9ICAuO1xuXAotICAgICBfZXRleHQgID0gIC47XG5cCi0gIiwiICB9XG5cCi0gIC4gPSAuO1xuXAotICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgIF9mZGF0YSA9IEFMSUdOKDE2KTtcblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO1xuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICB9XG5cCi0gIC5saXQ0IDoge1xuXAotICAgICooLmxpdDQpXG5cCi0gIiwiICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAgZWRhdGEgID0gIC47XG5cCi0gICBfZWRhdGEgID0gIC47XG5cCi0gICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAgZW5kID0gLjtcblwKLSAgIF9lbmQgPSAuO1xuXAotfVxuXG4iCi0sIE5VTEwpCi07IH0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9taXBzaWR0X2VtdWxhdGlvbiA9IAotewotICBnbGRtaXBzaWR0X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGRtaXBzaWR0X2FmdGVyX29wZW4sCi0gIGdsZG1pcHNpZHRfYWZ0ZXJfYWxsb2NhdGlvbiwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkbWlwc2lkdF9nZXRfc2NyaXB0LAotICAibWlwc2lkdCIsCi0gICJlY29mZi1iaWdtaXBzIgotfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1tYWtlLnNlZCBiL2xkL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxOTcwOC4uMDAwMDAwMAotLS0gYS9sZC9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIGxkIE1ha2VmaWxlLmluIGludG8gTVBXIHN5bnRheC4KLQotL0hERUZJTkVTL3MvQEhERUZJTkVTQC8vCi0KLS9edGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0Avcy9eLyMvCi0KLS9eRU1VTCA9IEBFTVVMQC9zL14vIy8KLQotL15FTVVMQVRJT05fT0ZJTEVTID0gQEVNVUxBVElPTl9PRklMRVNAL3MvXi8jLwotCi0jIEZpeGFkZCB0byB0aGUgaW5jbHVkZSBwYXRocy4KLS9eSU5DTFVERVMgPSAuKiQvcy8kLyAtaSAie0lOQ0RJUn0iOm1wdzogLWkgOjpleHRyYS1pbmNsdWRlOi8KLS9CRkRESVIvcy8taSB7QkZERElSfSAvLWkgIntCRkRESVJ9IjogLwotL0lOQ0RJUi9zLy1pIHtJTkNESVJ9IC8taSAie0lOQ0RJUn0iOiAvCi0KLSMgVXNlIGJ5YWNjIGluc3RlYWQgb2YgYmlzb24gKGZvciBub3cgYW55d2F5KS4KLS9CSVNPTi9zL15CSVNPTiA9LiokL0JJU09OID0gYnlhY2MvCi0jL0JJU09ORkxBR1Mvcy9eQklTT05GTEFHUyA9LiokL0JJU09ORkxBR1MgPSAvCi0KLSMgU3VwcHJlc3MgdGhlIHN1cHByZXNzaW9uIG9mIHNtYXJ0IG1ha2VzLgotL15cLnlcLmMvZAotCi0jIEhhY2sgdXAgbGRtYWluIGNvbXBpbGUuCi0vXiJ7b30ibGRtYWluLmMubyBcXE9wdGlvbi1mIC4qIGNvbmZpZy5zdGF0dXMkLywvXiQvY1wKLSJ7b30ibGRtYWluLmMubyBcXE9wdGlvbi1mICAie3N9ImxkbWFpbi5jXAotCXtDQ30gQERBU0hfQ19GTEFHQCAtZCBERUZBVUxUX0VNVUxBVElPTj17ZHF9e0VNVUx9e2RxfSAtZCBTQ1JJUFRESVI9e2RxfXtzY3JpcHRkaXJ9e2RxfSB7QUxMX0NGTEFHU30gIntzfSJsZG1haW4uYyAtbyAie299ImxkbWFpbi5jLm9cCi0KLQotIyBSZW1vdmUgbGRlbXVsLWxpc3QuaCBidWlsZCwgcmVseSBvbiBjb25maWd1cmUgdG8gbWFrZSBvbmUuCi0vXmxkZW11bC1saXN0LmggLywvUmVuYW1lIC15ICJ7c30ibGRlbXVsLXRtcC5oIC9kCi0KLSMgRml4IHBhdGhuYW1lcyB0byBnZW5lcmF0ZWQgZmlsZXMuCi0vY29uZmlnLmgvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS9jb25maWcuaC9zL15jb25maWdcLmgvIntvfSJjb25maWcuaC8KLQotL3kudGFiLmMvcy8ie3N9InlcLnRhYlwuYy8ie299InkudGFiLmMvZwotL3kudGFiLmMvcy9eeVwudGFiXC5jLyJ7b30ieS50YWIuYy8KLS95LnRhYi5oL3MvIntzfSJ5XC50YWJcLmgvIntvfSJ5LnRhYi5oL2cKLS95LnRhYi5oL3MvXnlcLnRhYlwuaC8ie299InkudGFiLmgvCi0KLS9sZGdyYW0uYy9zLyJ7c30ibGRncmFtXC5jLyJ7b30ibGRncmFtLmMvZwotL2xkZ3JhbS5jL3MvXmxkZ3JhbVwuYy8ie299ImxkZ3JhbS5jLwotCi0vbGRncmFtLmgvcy8ie3N9ImxkZ3JhbVwuaC8ie299ImxkZ3JhbS5oL2cKLS9sZGdyYW0uaC9zL15sZGdyYW1cLmgvIntvfSJsZGdyYW0uaC8KLQotL2xkbGV4LmMvcy8ie3N9ImxkbGV4XC5jLyJ7b30ibGRsZXguYy9nCi0vbGRsZXguYy9zL15sZGxleFwuYy8ie299ImxkbGV4LmMvCi0KLS9sZGxleC5jLm5ldy9zLyJ7c30ibGRsZXhcLmNcLm5ldy8ie299ImxkbGV4LmMubmV3L2cKLQotL2xleC55eS5jL3MvIntzfSJsZXhcLnl5XC5jLyJ7b30ibGV4Lnl5LmMvZwotCi0vbGRlbXVsLWxpc3QuaC9zLyJ7c30ibGRlbXVsLWxpc3RcLmgvIntvfSJsZGVtdWwtbGlzdC5oL2cKLS9sZGVtdWwtbGlzdC5oL3MvXmxkZW11bC1saXN0XC5oLyJ7b30ibGRlbXVsLWxpc3QuaC8KLQotIyBFZGl0IHBhdGhuYW1lcyB0byBlbXVsYXRpb24gZmlsZXMuCi0vIntzfSJlLipcLmMvcy8ie3N9ImVcKFstX2EtejAtOV0qXClcLmMvIntvfSJlXDEuYy9nCi0vXmUuKlwuYy9zL15lXChbLV9hLXowLTldKlwpXC5jLyJ7b30iZVwxLmMvCi0KLSMgV2UgY2FuJ3QgcnVuIGdlbnNjcmlwdHMsIHNvIGRvbid0IHRyeS4KLS97R0VOU0NSSVBUU30vcy97R0VOU0NSSVBUU30vbnVsbC1jb21tYW5kLwotCi0jIENvbW1lbnQgb3V0IHRoZSBURElSUyBiaXRzLgotL15URElSU0Avcy9eLyMvCi0KLSMgUG9pbnQgYXQgdGhlIEJGRCBsaWJyYXJ5IGRpcmVjdGx5LgotL0BCRkRMSUJAL3MvQEJGRExJQkAvOjpiZmQ6bGliYmZkLm8vCi0KLSMgRG9uJ3QgbmVlZCB0aGlzLgotL0BITERGTEFHU0Avcy9ASExERkxBR1NALy8KLQotIy9zZWQuKmZyZWUvLC8+ICJ7b30ibGRsZXguYy5uZXcvY1wKLSMJXAlDYXRlbmF0ZSAie299ImxleC55eS5jID4ie299ImxkbGV4LmMubmV3Ci0KLSMgVGhlIHJlc291cmNlIGZpbGUgaXMgY2FsbGVkIG1hYy1sZC5yLgotL3tMRF9QUk9HfS5yL3Mve0xEX1BST0d9XC5yL21hYy1sZC5yLwotCi0vXmluc3RhbGwgXFxPcHRpb24tZiAvLC9eJC9jXAotaW5zdGFsbCBcXE9wdGlvbi1mICBhbGwgaW5zdGFsbC1vbmx5XAotXAotaW5zdGFsbC1vbmx5IFxcT3B0aW9uLWZcCi0JTmV3Rm9sZGVyUmVjdXJzaXZlICJ7YmluZGlyfSJcCi0JRHVwbGljYXRlIC15IDpsZC5uZXcgIntiaW5kaXJ9ImxkXAotCi0KLSMgUmVtb3ZlIGRlcGVuZGVuY3kgcmVidWlsZGluZyBjcnVkLgotL14uZGVwIC8sLyMgLlBIT05ZIC9kCi0KLSMgUmVtb3ZlIHRoZSBsaW50bG9nIGFjdGlvbiwgcGlwZSBzeW1ib2xzIGluIGNvbHVtbiAxIGxvc2UuCi0vXmxpbnRsb2cgXFxPcHRpb24tZi8sL14kL2QKLQotL15NYWtlZmlsZSBcXE9wdGlvbi1mLywvXiQvZAotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvLC9eJC9kCi0vXmNvbmZpZy5zdGF0dXMgXFxPcHRpb24tZi8sL14kL2QKZGlmZiAtLWdpdCBhL2xkL21yaS5jIGIvbGQvbXJpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWFlYTIuLjAwMDAwMDAKLS0tIGEvbGQvbXJpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyogbXJpLmMgLS0gaGFuZGxlIE1SSSBzdHlsZSBsaW5rZXIgc2NyaXB0cwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBiaXQgZG9lcyB0aGUgdHJlZSBkZWNvcmF0aW9uIHdoZW4gTVJJIHN0eWxlIGxpbmsgc2NyaXB0cyBhcmUgcGFyc2VkICovCi0KLS8qCi0gIGNvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gIAkJIHNhY0BjeWdudXMuY29tCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIgCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgIm1yaS5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCB7Ci0gIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpuZXh0OwotICBDT05TVCBjaGFyICpuYW1lOwotICBDT05TVCBjaGFyICphbGlhczsKLSAgZXRyZWVfdHlwZSAqdm1hOwotICBldHJlZV90eXBlICphbGlnbjsKLSAgZXRyZWVfdHlwZSAqc3ViYWxpZ247Ci0gIGludCBva190b19sb2FkOwotfSA7Ci0KLXVuc2lnbmVkIGludCBzeW1ib2xfdHJ1bmNhdGUgPSAxMDAwMDsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpvcmRlcjsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpvbmx5X2xvYWQ7Ci1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWRkcmVzczsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphbGlhczsKLQotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFsaWdubWVudDsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpzdWJhbGlnbm1lbnQ7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxvb2t1cAotICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3QpKTsKLXN0YXRpYyB2b2lkIG1yaV9hZGRfdG9fbGlzdCBQQVJBTVMgKChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3QsCi0JCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICp2bWEsCi0JCQkJICAgICBjb25zdCBjaGFyICp6YWxpYXMsIGV0cmVlX3R5cGUgKmFsaWduLAotCQkJCSAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ24pKTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqCi1sb29rdXAgKG5hbWUsIGxpc3QpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdDsKLXsKLQotICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKnB0ciA9IGxpc3Q7Ci0gIHdoaWxlICgqcHRyKSAKLSAgewotICAgIGlmIChzdHJjbXAobmFtZSwgKCpwdHIpLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIGEgbWF0Y2gsIGRlbGV0ZSBpdCwgd2Ugb25seSBrZWVwIHRoZSBsYXN0IGluc3RhbmNlCi0JIG9mIGFueSBuYW1lICovCi0gICAgICAqcHRyID0gKCpwdHIpLT5uZXh0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHB0ciA9ICYoKCpwdHIpLT5uZXh0KTsKLSAgICB9Ci0gIH0KLQotICAqcHRyID0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopeG1hbGxvYyhzaXplb2Yoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QpKTsKLSAgcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIHZvaWQKLW1yaV9hZGRfdG9fbGlzdCAobGlzdCwgbmFtZSwgdm1hLCB6YWxpYXMsIGFsaWduLCBzdWJhbGlnbikKLSAgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0OwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICp2bWE7Ci0gICAgIENPTlNUIGNoYXIgKnphbGlhczsKLSAgICAgZXRyZWVfdHlwZSAqYWxpZ247Ci0gICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduOwotewotICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKnB0ciA9IGxvb2t1cChuYW1lLGxpc3QpOwotICAoKnB0ciktPm5hbWUgPSBuYW1lOwotICAoKnB0ciktPnZtYSA9IHZtYTsKLSAgKCpwdHIpLT5uZXh0ID0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTDsKLSAgKCpwdHIpLT5va190b19sb2FkID0gMDsKLSAgKCpwdHIpLT5hbGlhcyA9IHphbGlhczsKLSAgKCpwdHIpLT5hbGlnbiA9IGFsaWduOwotICAoKnB0ciktPnN1YmFsaWduID0gc3ViYWxpZ247Ci19Ci0KLQotdm9pZAotbXJpX291dHB1dF9zZWN0aW9uIChuYW1lLCB2bWEpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKnZtYTsKLXsKLSAgbXJpX2FkZF90b19saXN0KCZhZGRyZXNzLCBuYW1lLCB2bWEsIDAsMCwwKTsKLX0KLQotLyogaWYgYW55IEFCU09MVVRFIDxuYW1lPiBhcmUgaW4gdGhlIHNjcmlwdCwgb25seSBsb2FkIHRob3NlIGZpbGVzCi1tYXJrZWQgdGh1cyAqLwotCi12b2lkCi1tcmlfb25seV9sb2FkIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBtcmlfYWRkX3RvX2xpc3QoJm9ubHlfbG9hZCwgbmFtZSwgMCwgMCwwLDApOwotfQotCi0KLXZvaWQKLW1yaV9iYXNlIChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgYmFzZSA9IGV4cDsKLX0KLQotc3RhdGljIGludCBkb25lX3RyZWUgPSAwOwotCi12b2lkCi1tcmlfZHJhd190cmVlICgpCi17Ci0gIGlmIChkb25lX3RyZWUpIHJldHVybjsKLQotICAvKiBXZSBkb24ndCBib3RoZXIgd2l0aCBtZW1vcnkgcmVnaW9ucy4gICovCi0jaWYgMAotICAvKiBDcmVhdGUgdGhlIHJlZ2lvbnMgKi8KLSB7Ci0gICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcjsKLSAgIHIgPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKCJsb25nIik7Ci0gICByLT5jdXJyZW50ID0gci0+b3JpZ2luID0gZXhwX2dldF92bWEoYmFzZSwgKGJmZF92bWEpMCwgIm9yaWdpbiIsCi0JCQkJCWxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gICByLT5sZW5ndGggPSAoYmZkX3NpemVfdHlwZSkgZXhwX2dldF92bWEoMCwgKGJmZF92bWEpIH4oKGJmZF9zaXplX3R5cGUpMCksCi0JCQkJCSAgICJsZW5ndGgiLCBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOwotIH0KLSNlbmRpZgotICAKLSAgLyogTm93IGJ1aWxkIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgbGRsYW5nIG1hY2hpbmUgKi8KLQotCi0gIC8qIEF0dGF0Y2ggdGhlIGFkZHJlc3NlcyBvZiBhbnkgd2hpY2ggaGF2ZSBhZGRyZXNzZXMsIGFuZCBhZGQgdGhlCi0gICAgIG9uZXMgbm90IG1lbnRpb25lZCAqLwotICBpZiAoYWRkcmVzcyAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSB7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFsaXN0OwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpvbGlzdDsKLSAgICBpZiAob3JkZXIgPT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTCkgewotICAgICAgb3JkZXIgPSBhZGRyZXNzOwotICAgIH0KLQotICAgIGZvciAoYWxpc3QgPSBhZGRyZXNzOwotCSBhbGlzdCAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QqKU5VTEw7Ci0JIGFsaXN0ID0gYWxpc3QtPm5leHQpIAotICAgIHsKLSAgICAgIGludCBkb25lID0gMDsKLSAgICAgIGZvciAob2xpc3QgPSBvcmRlcjsKLQkgICBkb25lID09IDAgJiYKLQkgICBvbGlzdCAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMOwotCSAgIG9saXN0ID0gb2xpc3QtPm5leHQpIAotICAgICAgewotCWlmIChzdHJjbXAoYWxpc3QtPm5hbWUsIG9saXN0LT5uYW1lKSA9PSAwKSAKLQl7Ci0JICBvbGlzdC0+dm1hID0gYWxpc3QtPnZtYTsKLQkgIGRvbmUgPSAxOwotCX0KLSAgICAgIH0KLSAgICAgIGlmICghZG9uZSkgewotCS8qIGFkZCB0aGlzIG9udG8gZW5kIG9mIG9yZGVyIGxpc3QgKi8KLQltcmlfYWRkX3RvX2xpc3QoJm9yZGVyLCBhbGlzdC0+bmFtZSwgYWxpc3QtPnZtYSwgMCwwLDApOwotICAgICAgfQotCi0gICAgfQotCi0gIH0KLQotICAvKiBJZiB3ZSdyZSBvbmx5IHN1cHBvc2VkIHRvIGxvYWQgYSBzdWJzZXQgb2YgdGhlbSBpbiwgdGhlbiBwcnVuZQotICAgICB0aGUgbGlzdC4gICovCi0KLSAgaWYgKG9ubHlfbG9hZCAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSAKLSAgewotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwdHIxOwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwdHIyOwotICAgIGlmIChvcmRlciA9PSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QqKU5VTEwpCi0gICAgIG9yZGVyID0gb25seV9sb2FkOwotICAgIAotICAgIC8qIFNlZSBpZiB0aGlzIG5hbWUgaXMgaW4gdGhlIGxpc3QsIGlmIGl0IGlzIHRoZW4gd2UgY2FuIGxvYWQgaXQKLSAgICAgKi8KLSAgICBmb3IgKHB0cjEgPSBvbmx5X2xvYWQ7IHB0cjE7IHB0cjEgPSBwdHIxLT5uZXh0KSAKLSAgICB7Ci0gICAgICBmb3IgKHB0cjI9IG9yZGVyOyBwdHIyOyBwdHIyPXB0cjItPm5leHQpIAotICAgICAgewotCWlmIChzdHJjbXAocHRyMi0+bmFtZSwgcHRyMS0+bmFtZSk9PTApIHsKLQkgIHB0cjItPm9rX3RvX2xvYWQgPSAxOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIC8qIE5vIG9ubHkgbG9hZCBsaXN0LCBzbyBldmVyeXRoaW5nIGlzIG9rIHRvIGxvYWQgKi8KLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqcHRyOwotICAgIGZvciAocHRyID0gb3JkZXI7IHB0cjsgcHRyPXB0ci0+bmV4dCkgewotICAgICAgcHRyLT5va190b19sb2FkID0gMTsKLSAgICB9Ci0gIH0KLQotCi0KLSAgLyogQ3JlYXRlIHRoZSBvcmRlciBvZiBzZWN0aW9ucyB0byBsb2FkICovCi0gIGlmIChvcmRlciAhPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSAKLSAgewotICAgIC8qIEJlZW4gdG9sZCB0byBvdXRwdXQgdGhlIHNlY3Rpb25zIGluIGEgY2VydGFpbiBvcmRlciAqLwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwID0gb3JkZXI7Ci0gICAgd2hpbGUgKHApIAotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphcHRyOwotICAgICAgZXRyZWVfdHlwZSAqYWxpZ24gPSAwOwotICAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ24gPSAwOwotICAgICAgLyogU2VlIGlmIGFuIGFsaWdubWVudCBoYXMgYmVlbiBzcGVjaWZpZWQgKi8KLQotICAgICAgZm9yIChhcHRyID0gYWxpZ25tZW50OyBhcHRyOyBhcHRyPSBhcHRyLT5uZXh0KQotICAgICAgewotCWlmIChzdHJjbXAoYXB0ci0+bmFtZSwgcC0+bmFtZSk9PTApIHsKLQkgIGFsaWduID0gIGFwdHItPmFsaWduOwotCX0KLSAgICAgIH0KLQotICAgICAgZm9yIChhcHRyID0gc3ViYWxpZ25tZW50OyBhcHRyOyBhcHRyPSBhcHRyLT5uZXh0KQotICAgICAgewotCWlmIChzdHJjbXAoYXB0ci0+bmFtZSwgcC0+bmFtZSk9PTApIHsKLQkgIHN1YmFsaWduID0gIGFwdHItPnN1YmFsaWduOwotCX0KLSAgICAgIH0KLQotICAgICAgaWYgKGJhc2UgPT0gMCkgewotCWJhc2UgPSBwLT52bWEgPyBwLT52bWEgOmV4cF9uYW1lb3AoTkFNRSwgIi4iKTsKLSAgICAgIH0KLSAgICAgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChwLT5uYW1lLCBiYXNlLAotCQkJCQkgICBwLT5va190b19sb2FkID8gMCA6IG5vbG9hZF9zZWN0aW9uLAotCQkJCQkgICAxLCBhbGlnbiwgc3ViYWxpZ24sCi0JCQkJCSAgIChldHJlZV90eXBlICopIE5VTEwpOwotICAgICAgYmFzZSA9IDA7Ci0gICAgICBsYW5nX2FkZF93aWxkIChwLT5uYW1lLCBmYWxzZSwgKGNoYXIgKilOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpOwotICAgICAgLyogSWYgdGhlcmUgaXMgYW4gYWxpYXMgZm9yIHRoaXMgc2VjdGlvbiwgYWRkIGl0IHRvbyAqLwotICAgICAgZm9yIChhcHRyID0gYWxpYXM7IGFwdHI7IGFwdHIgPSBhcHRyLT5uZXh0KSB7Ci0KLQlpZiAoc3RyY21wKGFwdHItPmFsaWFzLCBwLT5uYW1lKT09IDApIHsKLQkgIGxhbmdfYWRkX3dpbGQgKGFwdHItPm5hbWUsIGZhbHNlLCAoY2hhciAqKU5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0JfQotICAgICAgfQotCi0gICAgICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotCSgwLCAiKmRlZmF1bHQqIiwgKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSBOVUxMKTsKLQotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotICB9Ci0KLQotICBkb25lX3RyZWUgPSAxOwotCi19Ci12b2lkCi1tcmlfbG9hZCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgYmFzZSA9IDA7Ci0gIGxhbmdfYWRkX2lucHV0X2ZpbGUobmFtZSwKLQkJICAgICAgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSwgKGNoYXIgKilOVUxMKTsKLSAgLyogIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KDAsIipkZWZhdWx0KiIpOyovCi19Ci0KLQotdm9pZAotbXJpX29yZGVyIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBtcmlfYWRkX3RvX2xpc3QoJm9yZGVyLCBuYW1lLCAwLCAwLDAsMCk7Ci19Ci0KLXZvaWQgCi1tcmlfYWxpYXMgKHdhbnQsIGlzLCBpc24pCi0gICAgIENPTlNUIGNoYXIgKndhbnQ7Ci0gICAgIENPTlNUIGNoYXIgKmlzOwotICAgICBpbnQgaXNuOwotewotICBpZiAoIWlzKSB7Ci0gICAgLyogU29tZSBzZWN0aW9ucyBhcmUgZGlnaXRzIC0gKi8KLSAgICBjaGFyIGJ1ZlsyMF07Ci0gICAgc3ByaW50ZihidWYsICIlZCIsIGlzbik7Ci0gICAgaXMgPSB4c3RyZHVwIChidWYpOwotICAgIGlmIChpcyA9PSBOVUxMKQotICAgICAgYWJvcnQgKCk7Ci0gIH0KLSAgbXJpX2FkZF90b19saXN0KCZhbGlhcywgaXMsIDAsIHdhbnQsMCwwKTsKLQotfQotCi0KLXZvaWQgCi1tcmlfbmFtZSAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgbGFuZ19hZGRfb3V0cHV0KG5hbWUsIDEpOwotCi19Ci0KLQotdm9pZAotbXJpX2Zvcm1hdCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKHN0cmNtcChuYW1lLCAiUyIpID09IDApCi0gIHsKLSAgICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KCJzcmVjIiwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMSk7Ci0gIH0KLSAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJJRUVFIikgPT0gMCkKLSAgewotICAgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQoImllZWUiLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAxKTsKLSAgfQotICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIkNPRkYiKSA9PSAwKQotICB7Ci0gICAgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCgiY29mZi1tNjhrIiwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZWluZm8oXygiJVAlRjogdW5rbm93biBmb3JtYXQgdHlwZSAlc1xuIiksIG5hbWUpOwotICB9Ci19Ci0KLQotdm9pZAotbXJpX3B1YmxpYyAobmFtZSwgZXhwKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIGxhbmdfYWRkX2Fzc2lnbm1lbnQoZXhwX2Fzc29wKCc9JywgbmFtZSwgZXhwKSk7Ci19Ci0KLXZvaWQgCi1tcmlfYWxpZ24gKG5hbWUsIGV4cCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBtcmlfYWRkX3RvX2xpc3QoJmFsaWdubWVudCwgbmFtZSwwLDAsZXhwLDApOwotfQotCi12b2lkIAotbXJpX2FsaWdubW9kIChuYW1lLCBleHApCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgbXJpX2FkZF90b19saXN0KCZzdWJhbGlnbm1lbnQsIG5hbWUsMCwwLDAsZXhwKTsKLX0KLQotCi12b2lkIAotbXJpX3RydW5jYXRlIChleHApCi0gICAgIHVuc2lnbmVkIGludCBleHA7Ci17Ci0gIHN5bWJvbF90cnVuY2F0ZSA9IGV4cDsKLX0KZGlmZiAtLWdpdCBhL2xkL21yaS5oIGIvbGQvbXJpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjM2YwZjMuLjAwMDAwMDAKLS0tIGEvbGQvbXJpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBtcmkuaCAtLSBoZWFkZXIgZmlsZSBmb3IgTVJJIHNjcmlwdGluZyBmdW5jdGlvbnMKLSAgIENvcHlyaWdodCAxOTkzLCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNUklfSAotI2RlZmluZSBNUklfSAotCi1leHRlcm4gdW5zaWduZWQgaW50IHN5bWJvbF90cnVuY2F0ZTsKLQotZXh0ZXJuIHZvaWQgbXJpX291dHB1dF9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKnZtYSkpOwotZXh0ZXJuIHZvaWQgbXJpX29ubHlfbG9hZCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfYmFzZSBQQVJBTVMgKChldHJlZV90eXBlICpleHApKTsKLWV4dGVybiB2b2lkIG1yaV9sb2FkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9vcmRlciBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfYWxpYXMgUEFSQU1TICgoY29uc3QgY2hhciAqd2FudCwgY29uc3QgY2hhciAqaXMsIGludCBpc24pKTsKLWV4dGVybiB2b2lkIG1yaV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9mb3JtYXQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX3B1YmxpYyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKLWV4dGVybiB2b2lkIG1yaV9hbGlnbiBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKLWV4dGVybiB2b2lkIG1yaV9hbGlnbm1vZCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKLWV4dGVybiB2b2lkIG1yaV90cnVuY2F0ZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgZXhwKSk7Ci1leHRlcm4gdm9pZCBtcmlfZHJhd190cmVlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9wZS1kbGwuYyBiL2xkL3BlLWRsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzUyZDY2Li4wMDAwMDAwCi0tLSBhL2xkL3BlLWRsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc4NiArMCwwIEBACi0vKiBSb3V0aW5lcyB0byBoZWxwIGJ1aWxkIFBFSS1mb3JtYXQgRExMcyAoV2luMzIgZXRjKQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBESiBEZWxvcmllIDxkakBjeWdudXMuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGR3cml0ZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotI2luY2x1ZGUgImRlZmZpbGUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gVGhpcyBmaWxlIHR1cm5zIGEgcmVndWxhciBXaW5kb3dzIFBFIGltYWdlIGludG8gYSBETEwuICBCZWNhdXNlIG9mCi0gdGhlIGNvbXBsZXhpdHkgb2YgdGhpcyBvcGVyYXRpb24sIGl0IGhhcyBiZWVuIGJyb2tlbiBkb3duIGludG8gYQotIG51bWJlciBvZiBzZXBhcmF0ZSBtb2R1bGVzIHdoaWNoIGFyZSBhbGwgY2FsbGVkIGJ5IHRoZSBtYWluIGZ1bmN0aW9uCi0gYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZS1lbnRyYW50IGFuZCBpcwotIG5vcm1hbGx5IG9ubHkgY2FsbGVkIG9uY2UsIHNvIHN0YXRpYyB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gcmVkdWNlCi0gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzIHJlcXVpcmVkLgotCi0gU2VlIGFsc286IGxkL2VtdWx0ZW1wbC9wZS5lbQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBmb3IgZW11bHRlbXBsL3BlLmVtICovCi0KLWRlZl9maWxlICpwZV9kZWZfZmlsZSA9IDA7Ci1pbnQgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nID0gMDsKLWludCBwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlcyA9IDE7Ci1pbnQgcGVfZGxsX2tpbGxfYXRzID0gMDsKLWludCBwZV9kbGxfc3RkY2FsbF9hbGlhc2VzID0gMDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gc3RhdGljIHZhcmlhYmxlcyBhbmQgdHlwZXMKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJmZF92bWEgaW1hZ2VfYmFzZTsKLQotc3RhdGljIGJmZCAqZmlsbGVyX2JmZDsKLXN0YXRpYyBzdHJ1Y3Qgc2VjICplZGF0YV9zLCAqcmVsb2NfczsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICplZGF0YV9kLCAqcmVsb2NfZDsKLXN0YXRpYyBpbnQgZWRhdGFfc3osIHJlbG9jX3N6OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKnRhcmdldF9uYW1lOwotICBjaGFyICpvYmplY3RfdGFyZ2V0OwotICBpbnQgaW1hZ2ViYXNlX3JlbG9jOwotICBpbnQgcGVfYXJjaDsKLSAgaW50IGJmZF9hcmNoOwotICBpbnQgdW5kZXJzY29yZWQ7Ci19IHBlX2RldGFpbHNfdHlwZTsKLQotI2RlZmluZSBQRV9BUkNIX2kzODYJMQotCi1zdGF0aWMgcGVfZGV0YWlsc190eXBlIHBlX2RldGFpbF9saXN0W10gPSB7Ci0gIHsKLSAgICAicGVpLWkzODYiLAotICAgICJwZS1pMzg2IiwKLSAgICA3IC8qIFJfSU1BR0VCQVNFICovLAotICAgIFBFX0FSQ0hfaTM4NiwKLSAgICBiZmRfYXJjaF9pMzg2LAotICAgIDEKLSAgfSwKLSAgeyAwIH0KLX07Ci0KLXN0YXRpYyBwZV9kZXRhaWxzX3R5cGUgKnBlX2RldGFpbHM7Ci0KLSNkZWZpbmUgVShzdHIpIChwZV9kZXRhaWxzLT51bmRlcnNjb3JlZCA/ICJfIiBzdHIgOiBzdHIpCi0KLXZvaWQKLXBlX2RsbF9pZF90YXJnZXQgKHRhcmdldCkKLSAgICAgY2hhciAqdGFyZ2V0OwotewotICBpbnQgaTsKLSAgZm9yIChpPTA7IHBlX2RldGFpbF9saXN0W2ldLnRhcmdldF9uYW1lOyBpKyspCi0gICAgaWYgKHN0cmNtcCAocGVfZGV0YWlsX2xpc3RbaV0udGFyZ2V0X25hbWUsIHRhcmdldCkgPT0gMCkKLSAgICAgIHsKLQlwZV9kZXRhaWxzID0gcGVfZGV0YWlsX2xpc3QraTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gIGVpbmZvIChfKCIlWFVuc3VwcG9ydGVkIFBFSSBhcmNoaXRlY3R1cmU6ICVzXG4iKSwgdGFyZ2V0KTsKLSAgZXhpdCAoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEhlbHBlciBmdW5jdGlvbnMgZm9yIHFzb3J0LiAgUmVsb2NzIG11c3QgYmUgc29ydGVkIHNvIHRoYXQgd2UgY2FuIHdyaXRlCi0gdGhlbSBvdXQgYnkgcGFnZXMuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYmZkX3ZtYSB2bWE7Ci0gIGNoYXIgdHlwZTsKLSAgc2hvcnQgZXh0cmE7Ci19IHJlbG9jX2RhdGFfdHlwZTsKLQotc3RhdGljIGludAotcmVsb2Nfc29ydCAodmEsIHZiKQotICAgICBjb25zdCB2b2lkICp2YSwgKnZiOwotewotICBiZmRfdm1hIGEgPSAoKHJlbG9jX2RhdGFfdHlwZSAqKSB2YSktPnZtYTsKLSAgYmZkX3ZtYSBiID0gKChyZWxvY19kYXRhX3R5cGUgKikgdmIpLT52bWE7Ci0gIHJldHVybiAoYSA+IGIpID8gMSA6ICgoYSA8IGIpID8gLTEgOiAwKTsKLX0KLQotc3RhdGljIGludAotcGVfZXhwb3J0X3NvcnQgKHZhLCB2YikKLSAgICAgY29uc3Qgdm9pZCAqdmEsICp2YjsKLXsKLSAgZGVmX2ZpbGVfZXhwb3J0ICphID0gKGRlZl9maWxlX2V4cG9ydCAqKSB2YTsKLSAgZGVmX2ZpbGVfZXhwb3J0ICpiID0gKGRlZl9maWxlX2V4cG9ydCAqKSB2YjsKLSAgcmV0dXJuIHN0cmNtcCAoYS0+bmFtZSwgYi0+bmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIFJlYWQgYW5kIHByb2Nlc3MgdGhlIC5ERUYgZmlsZQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBlbnRyaWVzIGluIHBlX2RlZl9maWxlLT5leHBvcnRzW10uICBJIHVzZQotICAgZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldIHRvIHRhZyB3aGV0aGVyIG9yIG5vdCB0aGUgc3ltYm9sIHdhcwotICAgZGVmaW5lZCwgc2luY2Ugd2UgY2FuJ3QgZXhwb3J0IHN5bWJvbHMgd2UgZG9uJ3QgaGF2ZS4gKi8KLQotc3RhdGljIGJmZF92bWEgKmV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzOwotc3RhdGljIHN0cnVjdCBzZWMgKipleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnM7Ci0KLXN0YXRpYyBpbnQgZXhwb3J0X3RhYmxlX3NpemU7Ci1zdGF0aWMgaW50IGNvdW50X2V4cG9ydGVkOwotc3RhdGljIGludCBjb3VudF9leHBvcnRlZF9ieW5hbWU7Ci1zdGF0aWMgaW50IGNvdW50X3dpdGhfb3JkaW5hbHM7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGxsX25hbWU7Ci1zdGF0aWMgaW50IG1pbl9vcmRpbmFsLCBtYXhfb3JkaW5hbDsKLXN0YXRpYyBpbnQgKmV4cG9ydGVkX3N5bWJvbHM7Ci0KLXR5cGVkZWYgc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QKLSAgewotICAgIGNoYXIgKnN0cmluZzsKLSAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqbmV4dDsKLSAgfQotZXhjbHVkZV9saXN0X3N0cnVjdDsKLXN0YXRpYyBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqZXhjbHVkZXMgPSAwOwotCi12b2lkCi1wZV9kbGxfYWRkX2V4Y2x1ZGVzIChuZXdfZXhjbHVkZXMpCi0gICAgIGNvbnN0IGNoYXIgKm5ld19leGNsdWRlczsKLXsKLSAgY2hhciAqbG9jYWxfY29weTsKLSAgY2hhciAqZXhjbHVkZV9zdHJpbmc7Ci0KLSAgbG9jYWxfY29weSA9IHhzdHJkdXAgKG5ld19leGNsdWRlcyk7Ci0KLSAgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKGxvY2FsX2NvcHksICIsOiIpOwotICBmb3IgKDsgZXhjbHVkZV9zdHJpbmc7IGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChOVUxMLCAiLDoiKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqbmV3X2V4Y2x1ZGU7Ci0KLSAgICAgIG5ld19leGNsdWRlID0gKChzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqKQotCQkgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QpKSk7Ci0gICAgICBuZXdfZXhjbHVkZS0+c3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChleGNsdWRlX3N0cmluZykgKyAxKTsKLSAgICAgIHN0cmNweSAobmV3X2V4Y2x1ZGUtPnN0cmluZywgZXhjbHVkZV9zdHJpbmcpOwotICAgICAgbmV3X2V4Y2x1ZGUtPm5leHQgPSBleGNsdWRlczsKLSAgICAgIGV4Y2x1ZGVzID0gbmV3X2V4Y2x1ZGU7Ci0gICAgfQotCi0gIGZyZWUgKGxvY2FsX2NvcHkpOwotfQotCi1zdGF0aWMgaW50Ci1hdXRvX2V4cG9ydCAoZCwgbikKLSAgICAgZGVmX2ZpbGUgKmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm47Ci17Ci0gIGludCBpOwotICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqZXg7Ci0gIGZvciAoaSA9IDA7IGkgPCBkLT5udW1fZXhwb3J0czsgaSsrKQotICAgIGlmIChzdHJjbXAgKGQtPmV4cG9ydHNbaV0ubmFtZSwgbikgPT0gMCkKLSAgICAgIHJldHVybiAwOwotICBpZiAocGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXMpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobiwgIkRsbE1haW5AMTIiKSA9PSAwKQotCXJldHVybiAwOwotICAgICAgaWYgKHN0cmNtcCAobiwgIkRsbEVudHJ5UG9pbnRAMCIpID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBpZiAoc3RyY21wIChuLCAiaW1wdXJlX3B0ciIpID09IDApCi0JcmV0dXJuIDA7Ci0gICAgfQotICBmb3IgKGV4ID0gZXhjbHVkZXM7IGV4OyBleCA9IGV4LT5uZXh0KQotICAgIGlmIChzdHJjbXAgKG4sIGV4LT5zdHJpbmcpID09IDApCi0gICAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2RlZl9maWxlIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpbnQgaSwgajsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJsaGU7Ci0gIGJmZCAqYjsKLSAgc3RydWN0IHNlYyAqczsKLSAgZGVmX2ZpbGVfZXhwb3J0ICplPTA7Ci0KLSAgaWYgKCFwZV9kZWZfZmlsZSkKLSAgICBwZV9kZWZfZmlsZSA9IGRlZl9maWxlX2VtcHR5ICgpOwotCi0gIC8qIEZpcnN0LCBydW4gYXJvdW5kIHRvIGFsbCB0aGUgb2JqZWN0cyBsb29raW5nIGZvciB0aGUgLmRyZWN0dmUKLSAgICAgc2VjdGlvbnMsIGFuZCBwdXNoIHRob3NlIGludG8gdGhlIGRlZiBmaWxlIHRvbyAqLwotCi0gIGZvciAoYiA9IGluZm8tPmlucHV0X2JmZHM7IGI7IGIgPSBiLT5saW5rX25leHQpCi0gICAgewotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiLCAiLmRyZWN0dmUiKTsKLSAgICAgIGlmIChzKQotCXsKLQkgIGludCBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzKTsKLQkgIGNoYXIgKmJ1ZiA9IHhtYWxsb2MgKHNpemUpOwotCSAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChiLCBzLCBidWYsIDAsIHNpemUpOwotCSAgZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSAocGVfZGVmX2ZpbGUsIGJ1Ziwgc2l6ZSk7Ci0JICBmcmVlIChidWYpOwotCX0KLSAgICB9Ci0KLSAgLyogTm93LCBtYXliZSBleHBvcnQgZXZlcnl0aGluZyBlbHNlIHRoZSBkZWZhdWx0IHdheSAqLwotCi0gIGlmIChwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgfHwgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzID09IDApCi0gICAgewotICAgICAgZm9yIChiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYiA9IGItPmxpbmtfbmV4dCkKLQl7Ci0JICBhc3ltYm9sICoqc3ltYm9sczsKLQkgIGludCBuc3ltcywgc3ltc2l6ZTsKLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChiKTsKLQkgIHN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICBuc3ltcyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChiLCBzeW1ib2xzKTsKLQotCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyBqKyspCi0JICAgIHsKLQkgICAgICBpZiAoKHN5bWJvbHNbal0tPmZsYWdzICYgKEJTRl9GVU5DVElPTiB8IEJTRl9HTE9CQUwpKQotCQkgID09IChCU0ZfRlVOQ1RJT04gfCBCU0ZfR0xPQkFMKSkKLQkJewotCQkgIGNvbnN0IGNoYXIgKnNuID0gc3ltYm9sc1tqXS0+bmFtZTsKLQkJICBpZiAoKnNuID09ICdfJykKLQkJICAgIHNuKys7Ci0JCSAgaWYgKGF1dG9fZXhwb3J0IChwZV9kZWZfZmlsZSwgc24pKQotCQkgICAgZGVmX2ZpbGVfYWRkX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHNuLCAwLCAtMSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSN1bmRlZiBORQotI2RlZmluZSBORSBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHMKLQotICAvKiBDYW5vbmljYWxpemUgdGhlIGV4cG9ydCBsaXN0ICovCi0KLSAgaWYgKHBlX2RsbF9raWxsX2F0cykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKLQl7Ci0JICBpZiAoc3RyY2hyIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lLCAnQCcpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyB3aWxsIHByZXNlcnZlIGludGVybmFsX25hbWUsIHdoaWNoIG1heSBoYXZlIGJlZW4gcG9pbnRpbmcKLQkgICAgICAgICB0byB0aGUgc2FtZSBtZW1vcnkgYXMgbmFtZSwgb3IgbWlnaHQgbm90IGhhdmUgKi8KLQkgICAgICBjaGFyICp0bXAgPSB4c3RyZHVwIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lKTsKLQkgICAgICAqKHN0cmNociAodG1wLCAnQCcpKSA9IDA7Ci0JICAgICAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSA9IHRtcDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0JewotCSAgaWYgKHN0cmNociAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSwgJ0AnKSkKLQkgICAgewotCSAgICAgIGNoYXIgKnRtcCA9IHhzdHJkdXAgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUpOwotCSAgICAgICooc3RyY2hyICh0bXAsICdAJykpID0gMDsKLQkgICAgICBpZiAoYXV0b19leHBvcnQgKHBlX2RlZl9maWxlLCB0bXApKQotCQlkZWZfZmlsZV9hZGRfZXhwb3J0IChwZV9kZWZfZmlsZSwgdG1wLAotCQkJCSAgICAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSwgLTEpOwotCSAgICAgIGVsc2UKLQkJZnJlZSAodG1wKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZSA9IHBlX2RlZl9maWxlLT5leHBvcnRzOyAvKiBjb252ZW5pZW5jZSwgYnV0IHdhdGNoIG91dCBmb3IgaXQgY2hhbmdpbmcgKi8KLQotICBleHBvcnRlZF9zeW1ib2xfb2Zmc2V0cyA9IChiZmRfdm1hICopIHhtYWxsb2MgKE5FICogc2l6ZW9mIChiZmRfdm1hKSk7Ci0gIGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9ucyA9IChzdHJ1Y3Qgc2VjICoqKSB4bWFsbG9jIChORSAqIHNpemVvZiAoc3RydWN0IHNlYyAqKSk7Ci0KLSAgbWVtc2V0IChleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnMsIDAsIE5FICogc2l6ZW9mIChzdHJ1Y3Qgc2VjICopKTsKLSAgbWF4X29yZGluYWwgPSAwOwotICBtaW5fb3JkaW5hbCA9IDY1NTM2OwotICBjb3VudF9leHBvcnRlZCA9IDA7Ci0gIGNvdW50X2V4cG9ydGVkX2J5bmFtZSA9IDA7Ci0gIGNvdW50X3dpdGhfb3JkaW5hbHMgPSAwOwotCi0gIHFzb3J0IChwZV9kZWZfZmlsZS0+ZXhwb3J0cywgTkUsIHNpemVvZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbMF0pLCBwZV9leHBvcnRfc29ydCk7Ci0gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgTkU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSA+IDAgJiYgc3RyY21wIChlW2ldLm5hbWUsIGVbaSAtIDFdLm5hbWUpID09IDApCi0JewotCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSAqLwotCSAgaWYgKGVbaiAtIDFdLm9yZGluYWwgIT0gLTEKLQkgICAgICAmJiBlW2ldLm9yZGluYWwgIT0gLTEKLQkgICAgICAmJiBlW2ogLSAxXS5vcmRpbmFsICE9IGVbaV0ub3JkaW5hbCkKLQkgICAgewotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgZWluZm8gKF8oIiVYRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzICglZCB2cyAlZClcbiIpLAotCQkgICAgIGVbaiAtIDFdLm5hbWUsIGVbaiAtIDFdLm9yZGluYWwsIGVbaV0ub3JkaW5hbCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgZWluZm8gKF8oIldhcm5pbmcsIGR1cGxpY2F0ZSBFWFBPUlQ6ICVzXG4iKSwKLQkJICAgICBlW2ogLSAxXS5uYW1lKTsKLQkgICAgfQotCSAgaWYgKGVbaV0ub3JkaW5hbCkKLQkgICAgZVtqIC0gMV0ub3JkaW5hbCA9IGVbaV0ub3JkaW5hbDsKLQkgIGVbaiAtIDFdLmZsYWdfcHJpdmF0ZSB8PSBlW2ldLmZsYWdfcHJpdmF0ZTsKLQkgIGVbaiAtIDFdLmZsYWdfY29uc3RhbnQgfD0gZVtpXS5mbGFnX2NvbnN0YW50OwotCSAgZVtqIC0gMV0uZmxhZ19ub25hbWUgfD0gZVtpXS5mbGFnX25vbmFtZTsKLQkgIGVbaiAtIDFdLmZsYWdfZGF0YSB8PSBlW2ldLmZsYWdfZGF0YTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGkgIT0gaikKLQkgICAgZVtqXSA9IGVbaV07Ci0JICBqKys7Ci0JfQotICAgIH0KLSAgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzID0gajsJLyogPT0gTkUgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKSArIDIpOwotICAgICAgaWYgKHBlX2RldGFpbHMtPnVuZGVyc2NvcmVkKQotCXsKLQkgICpuYW1lID0gJ18nOwotCSAgc3RyY3B5IChuYW1lICsgMSwgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXN0cmNweSAobmFtZSwgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0KLSAgICAgIGJsaGUgPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwKLQkJCQkgICBuYW1lLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIGlmIChibGhlICYmIChibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkpCi0JewotCSAgY291bnRfZXhwb3J0ZWQrKzsKLQkgIGlmICghcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uZmxhZ19ub25hbWUpCi0JICAgIGNvdW50X2V4cG9ydGVkX2J5bmFtZSsrOwotCSAgZXhwb3J0ZWRfc3ltYm9sX29mZnNldHNbaV0gPSBibGhlLT51LmRlZi52YWx1ZTsKLQkgIGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSA9IGJsaGUtPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCAhPSAtMSkKLQkgICAgewotCSAgICAgIGlmIChtYXhfb3JkaW5hbCA8IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwpCi0JCW1heF9vcmRpbmFsID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbDsKLQkgICAgICBpZiAobWluX29yZGluYWwgPiBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsKQotCQltaW5fb3JkaW5hbCA9IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWw7Ci0JICAgICAgY291bnRfd2l0aF9vcmRpbmFscysrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYmxoZSAmJiBibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlaW5mbyAoXygiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGRlZmluZWRcbiIpLAotCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoYmxoZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIHdyb25nIHR5cGUgKCVkIHZzICVkKVxuIiksCi0JCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgYmxoZS0+dHlwZSwgYmZkX2xpbmtfaGFzaF9kZWZpbmVkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGVpbmZvIChfKCIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZm91bmRcbiIpLAotCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JfQotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBCdWlsZCB0aGUgYmZkIHRoYXQgd2lsbCBjb250YWluIC5lZGF0YSBhbmQgLnJlbG9jIHNlY3Rpb25zCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9maWxsZXJfYmZkIChpbmNsdWRlX2VkYXRhKQotICAgICBpbnQgaW5jbHVkZV9lZGF0YTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsbGVyX2ZpbGU7Ci0gIGZpbGxlcl9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAoImRsbCBzdHVmZiIsCi0JCQkJICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotCQkJCSAgICAgTlVMTCk7Ci0gIGZpbGxlcl9maWxlLT50aGVfYmZkID0gZmlsbGVyX2JmZCA9IGJmZF9jcmVhdGUgKCJkbGwgc3R1ZmYiLCBvdXRwdXRfYmZkKTsKLSAgaWYgKGZpbGxlcl9iZmQgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfYXJjaF9tYWNoIChmaWxsZXJfYmZkLAotCQkJICAgICBiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpLAotCQkJICAgICBiZmRfZ2V0X21hY2ggKG91dHB1dF9iZmQpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIEJGRCAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmNsdWRlX2VkYXRhKQotICAgIHsKLSAgICAgIGVkYXRhX3MgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGZpbGxlcl9iZmQsICIuZWRhdGEiKTsKLSAgICAgIGlmIChlZGF0YV9zID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGZpbGxlcl9iZmQsIGVkYXRhX3MsCi0JCQkJICAgICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgIHwgU0VDX0FMTE9DCi0JCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgIHwgU0VDX0tFRVAKLQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkpKSkKLQl7Ci0JICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIC5lZGF0YSBzZWN0aW9uOiAlRVxuIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGZpbGxlcl9iZmQsIGVkYXRhX3MsIGVkYXRhX3N6KTsKLSAgICB9Ci0KLSAgcmVsb2NfcyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoZmlsbGVyX2JmZCwgIi5yZWxvYyIpOwotICBpZiAocmVsb2NfcyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChmaWxsZXJfYmZkLCByZWxvY19zLAotCQkJCSAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgfCBTRUNfQUxMT0MKLQkJCQkgIHwgU0VDX0xPQUQKLQkJCQkgIHwgU0VDX0tFRVAKLQkJCQkgIHwgU0VDX0lOX01FTU9SWSkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgLnJlbG9jIHNlY3Rpb246ICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCByZWxvY19zLCAwKTsKLQotICBsZGxhbmdfYWRkX2ZpbGUgKGZpbGxlcl9maWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gR2F0aGVyIGFsbCB0aGUgZXhwb3J0ZWQgc3ltYm9scyBhbmQgYnVpbGQgdGhlIC5lZGF0YSBzZWN0aW9uCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9lZGF0YSAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGksIG5leHRfb3JkaW5hbDsKLSAgaW50IG5hbWVfdGFibGVfc2l6ZSA9IDA7Ci0gIGNvbnN0IGNoYXIgKmRsbnA7Ci0KLSAgLyogRmlyc3QsIHdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBleHBvcnRlZCBzeW1ib2xzIHRoZXJlIGFyZSwKLSAgICAgYW5kIHdoYXQgdGhlIHJhbmdlIG9mIG9yZGluYWxzIGlzLiAqLwotCi0gIGlmIChwZV9kZWZfZmlsZS0+bmFtZSkKLSAgICB7Ci0gICAgICBkbGxfbmFtZSA9IHBlX2RlZl9maWxlLT5uYW1lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRsbF9uYW1lID0gYWJmZC0+ZmlsZW5hbWU7Ci0gICAgICBmb3IgKGRsbnAgPSBkbGxfbmFtZTsgKmRsbnA7IGRsbnArKykKLQl7Ci0JICBpZiAoKmRsbnAgPT0gJ1xcJyB8fCAqZGxucCA9PSAnLycgfHwgKmRsbnAgPT0gJzonKQotCSAgICBkbGxfbmFtZSA9IGRsbnAgKyAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKGNvdW50X3dpdGhfb3JkaW5hbHMgJiYgbWF4X29yZGluYWwgPiBjb3VudF9leHBvcnRlZCkKLSAgICB7Ci0gICAgICBpZiAobWluX29yZGluYWwgPiBtYXhfb3JkaW5hbCAtIGNvdW50X2V4cG9ydGVkICsgMSkKLQltaW5fb3JkaW5hbCA9IG1heF9vcmRpbmFsIC0gY291bnRfZXhwb3J0ZWQgKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1pbl9vcmRpbmFsID0gMTsKLSAgICAgIG1heF9vcmRpbmFsID0gY291bnRfZXhwb3J0ZWQ7Ci0gICAgfQotICBleHBvcnRfdGFibGVfc2l6ZSA9IG1heF9vcmRpbmFsIC0gbWluX29yZGluYWwgKyAxOwotCi0gIGV4cG9ydGVkX3N5bWJvbHMgPSAoaW50ICopIHhtYWxsb2MgKGV4cG9ydF90YWJsZV9zaXplICogc2l6ZW9mIChpbnQpKTsKLSAgZm9yIChpID0gMDsgaSA8IGV4cG9ydF90YWJsZV9zaXplOyBpKyspCi0gICAgZXhwb3J0ZWRfc3ltYm9sc1tpXSA9IC0xOwotCi0gIC8qIE5vdyB3ZSBuZWVkIHRvIGFzc2lnbiBvcmRpbmFscyB0byB0aG9zZSB0aGF0IGRvbid0IGhhdmUgdGhlbSAqLwotICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldKQotCXsKLQkgIGlmIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsICE9IC0xKQotCSAgICB7Ci0JICAgICAgaW50IGVpID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCAtIG1pbl9vcmRpbmFsOwotCSAgICAgIGludCBwaSA9IGV4cG9ydGVkX3N5bWJvbHNbZWldOwotCSAgICAgIGlmIChwaSAhPSAtMSkKLQkJewotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgZWluZm8gKF8oIiVYRXJyb3IsIG9yaWRpbmFsIHVzZWQgdHdpY2U6ICVkICglcyB2cyAlcylcbiIpLAotCQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwsCi0JCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSwKLQkJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1twaV0ubmFtZSk7Ci0JCX0KLQkgICAgICBleHBvcnRlZF9zeW1ib2xzW2VpXSA9IGk7Ci0JICAgIH0KLQkgIG5hbWVfdGFibGVfc2l6ZSArPSBzdHJsZW4gKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUpICsgMTsKLQl9Ci0gICAgfQotCi0gIG5leHRfb3JkaW5hbCA9IG1pbl9vcmRpbmFsOwotICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKLSAgICBpZiAoZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldKQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgPT0gLTEpCi0JewotCSAgd2hpbGUgKGV4cG9ydGVkX3N5bWJvbHNbbmV4dF9vcmRpbmFsIC0gbWluX29yZGluYWxdICE9IC0xKQotCSAgICBuZXh0X29yZGluYWwrKzsKLQkgIGV4cG9ydGVkX3N5bWJvbHNbbmV4dF9vcmRpbmFsIC0gbWluX29yZGluYWxdID0gaTsKLQkgIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgPSBuZXh0X29yZGluYWw7Ci0JfQotCi0gIC8qIE9LLCBub3cgd2UgY2FuIGFsbG9jYXRlIHNvbWUgbWVtb3J5ICovCi0KLSAgZWRhdGFfc3ogPSAoNDAJCS8qIGRpcmVjdG9yeSAqLwotCSAgICAgICsgNCAqIGV4cG9ydF90YWJsZV9zaXplCS8qIGFkZHJlc3NlcyAqLwotCSAgICAgICsgNCAqIGNvdW50X2V4cG9ydGVkX2J5bmFtZQkvKiBuYW1lIHB0cnMgKi8KLQkgICAgICArIDIgKiBjb3VudF9leHBvcnRlZF9ieW5hbWUJLyogb3JkaW5hbHMgKi8KLQkgICAgICArIG5hbWVfdGFibGVfc2l6ZSArIHN0cmxlbiAoZGxsX25hbWUpICsgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1maWxsX2VkYXRhIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpbnQgaSwgaGludDsKLSAgdW5zaWduZWQgY2hhciAqZWRpcmVjdG9yeTsKLSAgdW5zaWduZWQgbG9uZyAqZWFkZHJlc3NlczsKLSAgdW5zaWduZWQgbG9uZyAqZW5hbWVwdHJzOwotICB1bnNpZ25lZCBzaG9ydCAqZW9yZGluYWxzOwotICB1bnNpZ25lZCBjaGFyICplbmFtZXN0cjsKLSAgdGltZV90IG5vdzsKLQotICB0aW1lICgmbm93KTsKLQotICBlZGF0YV9kID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoZWRhdGFfc3opOwotCi0gIC8qIE5vdGUgdXNlIG9mIGFycmF5IHBvaW50ZXIgbWF0aCBoZXJlICovCi0gIGVkaXJlY3RvcnkgPSBlZGF0YV9kOwotICBlYWRkcmVzc2VzID0gKHVuc2lnbmVkIGxvbmcgKikgKGVkYXRhX2QgKyA0MCk7Ci0gIGVuYW1lcHRycyA9IGVhZGRyZXNzZXMgKyBleHBvcnRfdGFibGVfc2l6ZTsKLSAgZW9yZGluYWxzID0gKHVuc2lnbmVkIHNob3J0ICopIChlbmFtZXB0cnMgKyBjb3VudF9leHBvcnRlZF9ieW5hbWUpOwotICBlbmFtZXN0ciA9IChjaGFyICopIChlb3JkaW5hbHMgKyBjb3VudF9leHBvcnRlZF9ieW5hbWUpOwotCi0jZGVmaW5lIEVSVkEocHRyKSAoKCh1bnNpZ25lZCBjaGFyICopKHB0cikgLSBlZGF0YV9kKSArIGVkYXRhX3MtPm91dHB1dF9zZWN0aW9uLT52bWEgLSBpbWFnZV9iYXNlKQotCi0gIG1lbXNldCAoZWRhdGFfZCwgMCwgNDApOwotICBiZmRfcHV0XzMyIChhYmZkLCBub3csIGVkYXRhX2QgKyA0KTsKLSAgaWYgKHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yICE9IC0xKQotICAgIHsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yLCBlZGF0YV9kICsgOCk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9taW5vciwgZWRhdGFfZCArIDEwKTsKLSAgICB9Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVuYW1lc3RyKSwgZWRhdGFfZCArIDEyKTsKLSAgc3RyY3B5IChlbmFtZXN0ciwgZGxsX25hbWUpOwotICBlbmFtZXN0ciArPSBzdHJsZW4gKGVuYW1lc3RyKSArIDE7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIG1pbl9vcmRpbmFsLCBlZGF0YV9kICsgMTYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBleHBvcnRfdGFibGVfc2l6ZSwgZWRhdGFfZCArIDIwKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnRfZXhwb3J0ZWRfYnluYW1lLCBlZGF0YV9kICsgMjQpOwotICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlYWRkcmVzc2VzKSwgZWRhdGFfZCArIDI4KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZW5hbWVwdHJzKSwgZWRhdGFfZCArIDMyKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZW9yZGluYWxzKSwgZWRhdGFfZCArIDM2KTsKLQotICAvKiBPaywgbm93IGZvciB0aGUgZmlsbGluZyBpbiBwYXJ0ICovCi0gIGhpbnQgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0X3RhYmxlX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgcyA9IGV4cG9ydGVkX3N5bWJvbHNbaV07Ci0gICAgICBpZiAocyAhPSAtMSkKLQl7Ci0JICBzdHJ1Y3Qgc2VjICpzc2VjID0gZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW3NdOwotCSAgdW5zaWduZWQgbG9uZyBzcnZhID0gKGV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzW3NdCi0JCQkJKyBzc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgYmZkX3B1dF8zMiAoYWJmZCwgc3J2YSAtIGltYWdlX2Jhc2UsICh2b2lkICopIChlYWRkcmVzc2VzICsgaSkpOwotCSAgaWYgKCFwZV9kZWZfZmlsZS0+ZXhwb3J0c1tzXS5mbGFnX25vbmFtZSkKLQkgICAgewotCSAgICAgIGNoYXIgKmVuYW1lID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbc10ubmFtZTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlbmFtZXN0ciksICh2b2lkICopIGVuYW1lcHRycyk7Ci0JICAgICAgc3RyY3B5IChlbmFtZXN0ciwgZW5hbWUpOwotCSAgICAgIGVuYW1lc3RyICs9IHN0cmxlbiAoZW5hbWVzdHIpICsgMTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpLCAodm9pZCAqKSBlb3JkaW5hbHMpOwotCSAgICAgIGVuYW1lcHRycysrOwotCSAgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW3NdLmhpbnQgPSBoaW50Kys7Ci0JICAgIH0KLQkgIGVvcmRpbmFscysrOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEdhdGhlciBhbGwgdGhlIHJlbG9jYXRpb25zIGFuZCBidWlsZCB0aGUgLnJlbG9jIHNlY3Rpb24KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX3JlbG9jIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotCi0gIC8qIGZvciAucmVsb2Mgc3R1ZmYgKi8KLSAgcmVsb2NfZGF0YV90eXBlICpyZWxvY19kYXRhOwotICBpbnQgdG90YWxfcmVsb2NzID0gMDsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIGxvbmcgc2VjX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgKC0xKTsKLSAgdW5zaWduZWQgbG9uZyBwYWdlX3B0ciwgcGFnZV9jb3VudDsKLSAgaW50IGJpOwotICBiZmQgKmI7Ci0gIHN0cnVjdCBzZWMgKnM7Ci0KLSAgdG90YWxfcmVsb2NzID0gMDsKLSAgZm9yIChiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYiA9IGItPmxpbmtfbmV4dCkKLSAgICBmb3IgKHMgPSBiLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0gICAgICB0b3RhbF9yZWxvY3MgKz0gcy0+cmVsb2NfY291bnQ7Ci0KLSAgcmVsb2NfZGF0YSA9IChyZWxvY19kYXRhX3R5cGUgKikgeG1hbGxvYyAodG90YWxfcmVsb2NzICogc2l6ZW9mIChyZWxvY19kYXRhX3R5cGUpKTsKLQotICB0b3RhbF9yZWxvY3MgPSAwOwotICBiaSA9IDA7Ci0gIGZvciAoYmkgPSAwLCBiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYmkrKywgYiA9IGItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsb2NzOwotICAgICAgaW50IHJlbHNpemUsIG5yZWxvY3MsIGk7Ci0KLSAgICAgIGZvciAocyA9IGItPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHNlY192bWEgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldDsKLQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCSAgaW50IG5zeW1zLCBzeW1zaXplOwotCi0JICAvKiBpZiBpdCdzIG5vdCBsb2FkZWQsIHdlIGRvbid0IG5lZWQgdG8gcmVsb2NhdGUgaXQgdGhpcyB3YXkgKi8KLQkgIGlmICghKHMtPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhlcmUgd291bGQgYmUgYSByZWxvYyBmb3IgdGhlc2UsIGJ1dCBJJ3ZlCi0JICAgICBzZWVuIGl0IGhhcHBlbiAtIERKICovCi0JICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hID09IDApCi0JICAgIHsKLQkgICAgICAvKiBIdWg/ICBTaG91bGRuJ3QgaGFwcGVuLCBidXQgcHVudCBpZiBpdCBkb2VzICovCi0JICAgICAgZWluZm8gKCJESjogemVybyB2bWEgc2VjdGlvbiByZWxvYyBkZXRlY3RlZDogYCVzJyAjJWQgZj0lZFxuIiwKLQkJICAgICBzLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgcy0+b3V0cHV0X3NlY3Rpb24tPmluZGV4LAotCQkgICAgIHMtPm91dHB1dF9zZWN0aW9uLT5mbGFncyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChiKTsKLQkgIHN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICBuc3ltcyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChiLCBzeW1ib2xzKTsKLQotCSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGIsIHMpOwotCSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKChzaXplX3QpIHJlbHNpemUpOwotCSAgbnJlbG9jcyA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGIsIHMsIHJlbG9jcywgc3ltYm9scyk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBucmVsb2NzOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoIXJlbG9jc1tpXS0+aG93dG8tPnBjX3JlbGF0aXZlCi0JCSAgJiYgcmVsb2NzW2ldLT5ob3d0by0+dHlwZSAhPSBwZV9kZXRhaWxzLT5pbWFnZWJhc2VfcmVsb2MpCi0JCXsKLQkJICBiZmRfdm1hIHN5bV92bWE7Ci0JCSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltID0gKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHI7Ci0JCSAgc3ltX3ZtYSA9IChyZWxvY3NbaV0tPmFkZGVuZAotCQkJICAgICArIHN5bS0+dmFsdWUKLQkJCSAgICAgKyBzeW0tPnNlY3Rpb24tPnZtYQotCQkJICAgICArIHN5bS0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICArIHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgcmVsb2NfZGF0YVt0b3RhbF9yZWxvY3NdLnZtYSA9IHNlY192bWEgKyByZWxvY3NbaV0tPmFkZHJlc3M7Ci0JCSAgc3dpdGNoIChyZWxvY3NbaV0tPmhvd3RvLT5iaXRzaXplKjEwMDAKLQkJCSAgKyByZWxvY3NbaV0tPmhvd3RvLT5yaWdodHNoaWZ0KQotCQkgICAgewotCQkgICAgY2FzZSAzMjAwMDoKLQkJICAgICAgcmVsb2NfZGF0YVt0b3RhbF9yZWxvY3NdLnR5cGUgPSAzOwotCQkgICAgICB0b3RhbF9yZWxvY3MrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgICAgICBlaW5mbyAoXygiJVhFcnJvcjogJWQtYml0IHJlbG9jIGluIGRsbFxuIiksCi0JCQkgICAgIHJlbG9jc1tpXS0+aG93dG8tPmJpdHNpemUpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBmcmVlIChyZWxvY3MpOwotCSAgLyogV2FybmluZzogdGhlIGFsbG9jYXRlZCBzeW1ib2xzIGFyZSByZW1lbWJlcmVkIGluIEJGRCBhbmQgcmV1c2VkCi0JICAgICBsYXRlciwgc28gZG9uJ3QgZnJlZSB0aGVtISAqLwotCSAgLyogZnJlZSAoc3ltYm9scyk7ICovCi0JfQotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHRvdGFsX3JlbG9jcyByZWxvY2F0aW9uIGFkZHJlc3NlcyBpbgotICAgICByZWxvY19hZGRyZXNzZXMsIHdoaWNoIGFyZSBhbGwgc3VpdGFibGUgZm9yIHRoZSAucmVsb2Mgc2VjdGlvbi4KLSAgICAgV2UgbXVzdCBub3cgY3JlYXRlIHRoZSBuZXcgc2VjdGlvbnMuICovCi0KLSAgcXNvcnQgKHJlbG9jX2RhdGEsIHRvdGFsX3JlbG9jcywgc2l6ZW9mICgqcmVsb2NfZGF0YSksIHJlbG9jX3NvcnQpOwotCi0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9yZWxvY3M7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRoaXNfcGFnZSA9IChyZWxvY19kYXRhW2ldLnZtYSA+PiAxMik7Ci0gICAgICBpZiAodGhpc19wYWdlICE9IHNlY19wYWdlKQotCXsKLQkgIHJlbG9jX3N6ID0gKHJlbG9jX3N6ICsgMykgJiB+MzsJLyogNC1ieXRlIGFsaWduICovCi0JICByZWxvY19zeiArPSA4OwotCSAgc2VjX3BhZ2UgPSB0aGlzX3BhZ2U7Ci0JfQotICAgICAgcmVsb2Nfc3ogKz0gMjsKLSAgICB9Ci0gIHJlbG9jX3N6ID0gKHJlbG9jX3N6ICsgMykgJiB+MzsJLyogNC1ieXRlIGFsaWduICovCi0KLSAgcmVsb2NfZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKHJlbG9jX3N6KTsKLQotICBzZWNfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSAoLTEpOwotICByZWxvY19zeiA9IDA7Ci0gIHBhZ2VfcHRyID0gKHVuc2lnbmVkIGxvbmcpICgtMSk7Ci0gIHBhZ2VfY291bnQgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfcmVsb2NzOyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBydmEgPSByZWxvY19kYXRhW2ldLnZtYSAtIGltYWdlX2Jhc2U7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRoaXNfcGFnZSA9IChydmEgJiB+MHhmZmYpOwotICAgICAgaWYgKHRoaXNfcGFnZSAhPSBzZWNfcGFnZSkKLQl7Ci0JICB3aGlsZSAocmVsb2Nfc3ogJiAzKQotCSAgICByZWxvY19kW3JlbG9jX3N6KytdID0gMDsKLQkgIGlmIChwYWdlX3B0ciAhPSAodW5zaWduZWQgbG9uZykgKC0xKSkKLQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2Nfc3ogLSBwYWdlX3B0ciwgcmVsb2NfZCArIHBhZ2VfcHRyICsgNCk7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCB0aGlzX3BhZ2UsIHJlbG9jX2QgKyByZWxvY19zeik7Ci0JICBwYWdlX3B0ciA9IHJlbG9jX3N6OwotCSAgcmVsb2Nfc3ogKz0gODsKLQkgIHNlY19wYWdlID0gdGhpc19wYWdlOwotCSAgcGFnZV9jb3VudCA9IDA7Ci0JfQotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgKHJ2YSAmIDB4ZmZmKSArIChyZWxvY19kYXRhW2ldLnR5cGU8PDEyKSwKLQkJICByZWxvY19kICsgcmVsb2Nfc3opOwotICAgICAgcmVsb2Nfc3ogKz0gMjsKLSAgICAgIGlmIChyZWxvY19kYXRhW2ldLnR5cGUgPT0gNCkKLQl7Ci0JICBiZmRfcHV0XzE2IChhYmZkLCByZWxvY19kYXRhW2ldLmV4dHJhLCByZWxvY19kICsgcmVsb2Nfc3opOwotCSAgcmVsb2Nfc3ogKz0gMjsKLQl9Ci0gICAgICBwYWdlX2NvdW50Kys7Ci0gICAgfQotICB3aGlsZSAocmVsb2Nfc3ogJiAzKQotICAgIHJlbG9jX2RbcmVsb2Nfc3orK10gPSAwOwotICBpZiAocGFnZV9wdHIgIT0gKHVuc2lnbmVkIGxvbmcpICgtMSkpCi0gICAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2Nfc3ogLSBwYWdlX3B0ciwgcmVsb2NfZCArIHBhZ2VfcHRyICsgNCk7Ci0gIHdoaWxlIChyZWxvY19zeiA8IHJlbG9jX3MtPl9yYXdfc2l6ZSkKLSAgICByZWxvY19kW3JlbG9jX3N6KytdID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gR2l2ZW4gdGhlIGV4aXRpbmcgZGVmX2ZpbGUgc3RydWN0dXJlLCBwcmludCBvdXQgYSAuREVGIGZpbGUgdGhhdAotIGNvcnJlc3BvbmRzIHRvIGl0LgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotcXVvdGVwdXQgKHMsIGYsIG5lZWRzX3F1b3RlcykKLSAgICAgY2hhciAqczsKLSAgICAgRklMRSAqIGY7Ci0gICAgIGludCBuZWVkc19xdW90ZXM7Ci17Ci0gIGNoYXIgKmNwOwotICBmb3IgKGNwID0gczsgKmNwOyBjcCsrKQotICAgIGlmICgqY3AgPT0gJ1wnJwotCXx8ICpjcCA9PSAnIicKLQl8fCAqY3AgPT0gJ1xcJwotCXx8IGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqY3ApCi0JfHwgKmNwID09ICcsJwotCXx8ICpjcCA9PSAnOycpCi0gICAgICBuZWVkc19xdW90ZXMgPSAxOwotICBpZiAobmVlZHNfcXVvdGVzKQotICAgIHsKLSAgICAgIHB1dGMgKCciJywgZik7Ci0gICAgICB3aGlsZSAoKnMpCi0JewotCSAgaWYgKCpzID09ICciJyB8fCAqcyA9PSAnXFwnKQotCSAgICBwdXRjICgnXFwnLCBmKTsKLQkgIHB1dGMgKCpzLCBmKTsKLQkgIHMrKzsKLQl9Ci0gICAgICBwdXRjICgnIicsIGYpOwotICAgIH0KLSAgZWxzZQotICAgIGZwdXRzIChzLCBmKTsKLX0KLQotdm9pZAotcGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlIChwZV9vdXRfZGVmX2ZpbGVuYW1lKQotICAgICBjaGFyICpwZV9vdXRfZGVmX2ZpbGVuYW1lOwotewotICBpbnQgaTsKLSAgRklMRSAqb3V0ID0gZm9wZW4gKHBlX291dF9kZWZfZmlsZW5hbWUsICJ3Iik7Ci0gIGlmIChvdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZWluZm8gKF8oIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBkZWYgZmlsZSAlc1xuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIHBlX291dF9kZWZfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAocGVfZGVmX2ZpbGUpCi0gICAgewotICAgICAgaWYgKHBlX2RlZl9maWxlLT5uYW1lKQotCXsKLQkgIGlmIChwZV9kZWZfZmlsZS0+aXNfZGxsKQotCSAgICBmcHJpbnRmIChvdXQsICJMSUJSQVJZICIpOwotCSAgZWxzZQotCSAgICBmcHJpbnRmIChvdXQsICJOQU1FICIpOwotCSAgcXVvdGVwdXQgKHBlX2RlZl9maWxlLT5uYW1lLCBvdXQsIDEpOwotCSAgaWYgKHBlX2RhdGEgKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKQotCSAgICBmcHJpbnRmIChvdXQsICIgQkFTRT0weCVseCIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIHBlX2RhdGEgKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKTsKLQkgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JfQotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmRlc2NyaXB0aW9uKQotCXsKLQkgIGZwcmludGYgKG91dCwgIkRFU0NSSVBUSU9OICIpOwotCSAgcXVvdGVwdXQgKHBlX2RlZl9maWxlLT5kZXNjcmlwdGlvbiwgb3V0LCAxKTsKLQkgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JfQotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3IgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiVkVSU0lPTiAlZC4lZFxuIiwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IsCi0JCSBwZV9kZWZfZmlsZS0+dmVyc2lvbl9taW5vcik7Ci0gICAgICBlbHNlIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJWRVJTSU9OICVkXG4iLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvcik7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSAhPSAtMSB8fCBwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlICE9IC0xKQotCWZwcmludGYgKG91dCwgIlxuIik7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0ICE9IC0xKQotCWZwcmludGYgKG91dCwgIlNUQUNLU0laRSAweCV4LDB4JXhcbiIsCi0JCSBwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSwgcGVfZGVmX2ZpbGUtPnN0YWNrX2NvbW1pdCk7Ci0gICAgICBlbHNlIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJTVEFDS1NJWkUgMHgleFxuIiwgcGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUpOwotICAgICAgaWYgKHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdCAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJIRUFQU0laRSAweCV4LDB4JXhcbiIsCi0JCSBwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlLCBwZV9kZWZfZmlsZS0+aGVhcF9jb21taXQpOwotICAgICAgZWxzZSBpZiAocGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJIRUFQU0laRSAweCV4XG4iLCBwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlKTsKLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5udW1fc2VjdGlvbl9kZWZzID4gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXQsICJcblNFQ1RJT05TXG5cbiIpOwotCSAgZm9yIChpID0gMDsgaSA8IHBlX2RlZl9maWxlLT5udW1fc2VjdGlvbl9kZWZzOyBpKyspCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChvdXQsICIgICAgIik7Ci0JICAgICAgcXVvdGVwdXQgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSwgb3V0LCAwKTsKLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcykKLQkJewotCQkgIGZwcmludGYgKG91dCwgIiBDTEFTUyAiKTsKLQkJICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcywgb3V0LCAwKTsKLQkJfQotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfcmVhZCkKLQkJZnByaW50ZiAob3V0LCAiIFJFQUQiKTsKLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3dyaXRlKQotCQlmcHJpbnRmIChvdXQsICIgV1JJVEUiKTsKLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX2V4ZWN1dGUpCi0JCWZwcmludGYgKG91dCwgIiBFWEVDVVRFIik7Ci0JICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19zaGFyZWQpCi0JCWZwcmludGYgKG91dCwgIiBTSEFSRUQiKTsKLQkgICAgICBmcHJpbnRmIChvdXQsICJcbiIpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzID4gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXQsICJcbkVYUE9SVFNcblxuIik7Ci0JICBmb3IgKGkgPSAwOyBpIDwgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzOyBpKyspCi0JICAgIHsKLQkgICAgICBkZWZfZmlsZV9leHBvcnQgKmUgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0cyArIGk7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiICAgICIpOwotCSAgICAgIHF1b3RlcHV0IChlLT5uYW1lLCBvdXQsIDApOwotCSAgICAgIGlmIChlLT5pbnRlcm5hbF9uYW1lICYmIHN0cmNtcCAoZS0+aW50ZXJuYWxfbmFtZSwgZS0+bmFtZSkpCi0JCXsKLQkJICBmcHJpbnRmIChvdXQsICIgPSAiKTsKLQkJICBxdW90ZXB1dCAoZS0+aW50ZXJuYWxfbmFtZSwgb3V0LCAwKTsKLQkJfQotCSAgICAgIGlmIChlLT5vcmRpbmFsICE9IC0xKQotCQlmcHJpbnRmIChvdXQsICIgQCVkIiwgZS0+b3JkaW5hbCk7Ci0JICAgICAgaWYgKGUtPmZsYWdfcHJpdmF0ZSkKLQkJZnByaW50ZiAob3V0LCAiIFBSSVZBVEUiKTsKLQkgICAgICBpZiAoZS0+ZmxhZ19jb25zdGFudCkKLQkJZnByaW50ZiAob3V0LCAiIENPTlNUQU5UIik7Ci0JICAgICAgaWYgKGUtPmZsYWdfbm9uYW1lKQotCQlmcHJpbnRmIChvdXQsICIgTk9OQU1FIik7Ci0JICAgICAgaWYgKGUtPmZsYWdfZGF0YSkKLQkJZnByaW50ZiAob3V0LCAiIERBVEEiKTsKLQotCSAgICAgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+bnVtX2ltcG9ydHMgPiAwKQotCXsKLQkgIGZwcmludGYgKG91dCwgIlxuSU1QT1JUU1xuXG4iKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBwZV9kZWZfZmlsZS0+bnVtX2ltcG9ydHM7IGkrKykKLQkgICAgewotCSAgICAgIGRlZl9maWxlX2ltcG9ydCAqaW0gPSBwZV9kZWZfZmlsZS0+aW1wb3J0cyArIGk7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiICAgICIpOwotCSAgICAgIGlmIChpbS0+aW50ZXJuYWxfbmFtZQotCQkgICYmICghaW0tPm5hbWUgfHwgc3RyY21wIChpbS0+aW50ZXJuYWxfbmFtZSwgaW0tPm5hbWUpKSkKLQkJewotCQkgIHF1b3RlcHV0IChpbS0+aW50ZXJuYWxfbmFtZSwgb3V0LCAwKTsKLQkJICBmcHJpbnRmIChvdXQsICIgPSAiKTsKLQkJfQotCSAgICAgIHF1b3RlcHV0IChpbS0+bW9kdWxlLT5uYW1lLCBvdXQsIDApOwotCSAgICAgIGZwcmludGYgKG91dCwgIi4iKTsKLQkgICAgICBpZiAoaW0tPm5hbWUpCi0JCXF1b3RlcHV0IChpbS0+bmFtZSwgb3V0LCAwKTsKLQkgICAgICBlbHNlCi0JCWZwcmludGYgKG91dCwgIiVkIiwgaW0tPm9yZGluYWwpOwotCSAgICAgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgZnByaW50ZiAob3V0LCBfKCI7IG5vIGNvbnRlbnRzIGF2YWlsYWJsZVxuIikpOwotCi0gIGlmIChmY2xvc2UgKG91dCkgPT0gRU9GKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBlaW5mbyAoXygiJVA6IEVycm9yIGNsb3NpbmcgZmlsZSBgJXMnXG4iKSwgcGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBHZW5lcmF0ZSB0aGUgaW1wb3J0IGxpYnJhcnkKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFzeW1ib2wgKipzeW10YWI7Ci1zdGF0aWMgaW50IHN5bXB0cjsKLXN0YXRpYyBpbnQgdG1wX3NlcTsKLXN0YXRpYyBjb25zdCBjaGFyICpkbGxfZmlsZW5hbWU7Ci1zdGF0aWMgY2hhciAqZGxsX3N5bW5hbWU7Ci0KLSNkZWZpbmUgVU5EU0VDIChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9uCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1xdWlja19zZWN0aW9uKGFiZmQsIG5hbWUsIGZsYWdzLCBhbGlnbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZmxhZ3M7Ci0gICAgIGludCBhbGlnbjsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqc3ltOwotCi0gIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncwotCQkJCSAgfCBTRUNfQUxMT0MKLQkJCQkgIHwgU0VDX0xPQUQKLQkJCQkgIHwgU0VDX0tFRVAKLQkJCSApOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIGFsaWduKTsKLSAgLyogcmVtZW1iZXIgdG8gdW5kbyB0aGlzIGJlZm9yZSB0cnlpbmcgdG8gbGluayBpbnRlcm5hbGx5ISAqLwotICBzZWMtPm91dHB1dF9zZWN0aW9uID0gc2VjOwotCi0gIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIHN5bXRhYltzeW1wdHIrK10gPSBzeW07Ci0gIHN5bS0+bmFtZSA9IHNlYy0+bmFtZTsKLSAgc3ltLT5zZWN0aW9uID0gc2VjOwotICBzeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotICBzeW0tPnZhbHVlID0gMDsKLQotICByZXR1cm4gc2VjOwotfQotCi1zdGF0aWMgdm9pZAotcXVpY2tfc3ltYm9sIChhYmZkLCBuMSwgbjIsIG4zLCBzZWMsIGZsYWdzLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm4xOwotICAgICBjaGFyICpuMjsKLSAgICAgY2hhciAqbjM7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCBmbGFnczsKLSAgICAgaW50IGFkZHI7Ci17Ci0gIGFzeW1ib2wgKnN5bTsKLSAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobjEpICsgc3RybGVuIChuMikgKyBzdHJsZW4gKG4zKSArIDEpOwotICBzdHJjcHkgKG5hbWUsIG4xKTsKLSAgc3RyY2F0IChuYW1lLCBuMik7Ci0gIHN0cmNhdCAobmFtZSwgbjMpOwotICBzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBzeW0tPm5hbWUgPSBuYW1lOwotICBzeW0tPnNlY3Rpb24gPSBzZWM7Ci0gIHN5bS0+ZmxhZ3MgPSBmbGFnczsKLSAgc3ltLT52YWx1ZSA9IGFkZHI7Ci0gIHN5bXRhYltzeW1wdHIrK10gPSBzeW07Ci19Ci0KLXN0YXRpYyBhcmVsZW50ICpyZWx0YWIgPSAwOwotc3RhdGljIGludCByZWxjb3VudCA9IDAsIHJlbHNpemUgPSAwOwotCi1zdGF0aWMgdm9pZAotcXVpY2tfcmVsb2MgKGFiZmQsIGFkZHJlc3MsIHdoaWNoX2hvd3RvLCBzeW1pZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGFkZHJlc3M7Ci0gICAgIGludCB3aGljaF9ob3d0bzsKLSAgICAgaW50IHN5bWlkeDsKLXsKLSAgaWYgKHJlbGNvdW50ID49IChyZWxzaXplLTEpKQotICAgIHsKLSAgICAgIHJlbHNpemUgKz0gMTA7Ci0gICAgICBpZiAocmVsdGFiKQotCXJlbHRhYiA9IChhcmVsZW50ICopIHhyZWFsbG9jIChyZWx0YWIsIHJlbHNpemUgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgICAgIGVsc2UKLQlyZWx0YWIgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChyZWxzaXplICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgfQotICByZWx0YWJbcmVsY291bnRdLmFkZHJlc3MgPSBhZGRyZXNzOwotICByZWx0YWJbcmVsY291bnRdLmFkZGVuZCA9IDA7Ci0gIHJlbHRhYltyZWxjb3VudF0uaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIHdoaWNoX2hvd3RvKTsKLSAgcmVsdGFiW3JlbGNvdW50XS5zeW1fcHRyX3B0ciA9IHN5bXRhYiArIHN5bWlkeDsKLSAgcmVsY291bnQrKzsKLX0KLQotc3RhdGljIHZvaWQKLXNhdmVfcmVsb2NzIChhc2VjdGlvbiAqc2VjKQotewotICBpbnQgaTsKLSAgc2VjLT5yZWxvY2F0aW9uID0gcmVsdGFiOwotICBzZWMtPnJlbG9jX2NvdW50ID0gcmVsY291bnQ7Ci0gIHNlYy0+b3JlbG9jYXRpb24gPSAoYXJlbGVudCAqKikgeG1hbGxvYyAoKHJlbGNvdW50KzEpICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgZm9yIChpPTA7IGk8cmVsY291bnQ7IGkrKykKLSAgICBzZWMtPm9yZWxvY2F0aW9uW2ldID0gc2VjLT5yZWxvY2F0aW9uICsgaTsKLSAgc2VjLT5vcmVsb2NhdGlvbltyZWxjb3VudF0gPSAwOwotICBzZWMtPmZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgcmVsdGFiID0gMDsKLSAgcmVsY291bnQgPSByZWxzaXplID0gMDsKLX0KLQotLyoKLSAqCS5zZWN0aW9uCS5pZGF0YSQyCi0gKgkuZ2xvYmFsCQlfX2hlYWRfbXlfZGxsCi0gKiBfX2hlYWRfbXlfZGxsOgotICoJLnJ2YQkJaG5hbWUKLSAqCS5sb25nCQkwCi0gKgkubG9uZwkJMAotICoJLnJ2YQkJX19teV9kbGxfaW5hbWUKLSAqCS5ydmEJCWZ0aHVuawotICoKLSAqCS5zZWN0aW9uCS5pZGF0YSQ1Ci0gKgkubG9uZwkJMAotICogZnRodW5rOgotICoKLSAqCS5zZWN0aW9uCS5pZGF0YSQ0Ci0gKgkubG9uZwkJMAotICogaG5hbWU6Ci0gKi8KLQotc3RhdGljIGJmZCAqCi1tYWtlX2hlYWQgKHBhcmVudCkKLSAgICAgYmZkICpwYXJlbnQ7Ci17Ci0gIGFzZWN0aW9uICppZDIsICppZDUsICppZDQ7Ci0gIHVuc2lnbmVkIGNoYXIgKmQyLCAqZDUsICpkNDsKLSAgY2hhciAqb25hbWU7Ci0gIGJmZCAqYWJmZDsKLQotICBvbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgc3ByaW50ZiAob25hbWUsICJkJTA2ZC5vIiwgdG1wX3NlcSk7Ci0gIHRtcF9zZXErKzsKLQotICBhYmZkID0gYmZkX2NyZWF0ZSAob25hbWUsIHBhcmVudCk7Ci0gIGJmZF9maW5kX3RhcmdldCAocGVfZGV0YWlscy0+b2JqZWN0X3RhcmdldCwgYWJmZCk7Ci0gIGJmZF9tYWtlX3dyaXRhYmxlIChhYmZkKTsKLQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBwZV9kZXRhaWxzLT5iZmRfYXJjaCwgMCk7Ci0KLSAgc3ltcHRyID0gMDsKLSAgc3ltdGFiID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKDYgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZDIgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDIiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ1ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNCA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIl9oZWFkXyIpLCBkbGxfc3ltbmFtZSwgIiIsIGlkMiwgQlNGX0dMT0JBTCwgMCk7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiIiksIGRsbF9zeW1uYW1lLCAiX2luYW1lIiwgVU5EU0VDLCBCU0ZfR0xPQkFMLCAwKTsKLQotICAvKiBPSywgcGF5IGF0dGVudGlvbiBoZXJlLiAgSSBnb3QgY29uZnVzZWQgbXlzZWxmIGxvb2tpbmcgYmFjayBhdAotICAgICBpdC4gIFdlIGNyZWF0ZSBhIGZvdXItYnl0ZSBzZWN0aW9uIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgbGlzdCwgYW5kIHdlIGluY2x1ZGUgYW4gb2Zmc2V0IG9mIDQgaW4gdGhlIHNlY3Rpb24sIHNvIHRoYXQgdGhlCi0gICAgIHBvaW50ZXIgdG8gdGhlIGxpc3QgcG9pbnRzIHRvIHRoZSAqZW5kKiBvZiB0aGlzIHNlY3Rpb24sIHdoaWNoIGlzCi0gICAgIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBvZiBzZWN0aW9ucyBmcm9tIG90aGVyIG9iamVjdHMuICovCi0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkMiwgMjApOwotICBkMiA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgaWQyLT5jb250ZW50cyA9IGQyOwotICBtZW1zZXQgKGQyLCAwLCAyMCk7Ci0gIGQyWzBdID0gZDJbMTZdID0gNDsgLyogcmVsb2MgYWRkZW5kICovCi0gIHF1aWNrX3JlbG9jIChhYmZkLCAgMCwgQkZEX1JFTE9DX1JWQSwgMik7Ci0gIHF1aWNrX3JlbG9jIChhYmZkLCAxMiwgQkZEX1JFTE9DX1JWQSwgNCk7Ci0gIHF1aWNrX3JlbG9jIChhYmZkLCAxNiwgQkZEX1JFTE9DX1JWQSwgMSk7Ci0gIHNhdmVfcmVsb2NzIChpZDIpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDUsIDQpOwotICBkNSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDUtPmNvbnRlbnRzID0gZDU7Ci0gIG1lbXNldCAoZDUsIDAsIDQpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDQsIDQpOwotICBkNCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDQtPmNvbnRlbnRzID0gZDQ7Ci0gIG1lbXNldCAoZDQsIDAsIDQpOwotCi0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW10YWIsIHN5bXB0cik7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDIsIGQyLCAwLCAyMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ1LCBkNSwgMCwgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ0LCBkNCwgMCwgNCk7Ci0gIAotICBiZmRfbWFrZV9yZWFkYWJsZSAoYWJmZCk7Ci0gIHJldHVybiBhYmZkOwotfQotCi0vKgotICoJLnNlY3Rpb24JLmlkYXRhJDQKLSAqCS5sb25nCQkwCi0gKgkuc2VjdGlvbgkuaWRhdGEkNQotICoJLmxvbmcJCTAKLSAqCS5zZWN0aW9uCWlkYXRhJDcKLSAqCS5nbG9iYWwJCV9fbXlfZGxsX2luYW1lCi0gKl9fbXlfZGxsX2luYW1lOgotICoJLmFzY2l6CQkibXkuZGxsIgotICovCi0KLXN0YXRpYyBiZmQgKgotbWFrZV90YWlsIChwYXJlbnQpCi0gICAgIGJmZCAqcGFyZW50OwotewotICBhc2VjdGlvbiAqaWQ0LCAqaWQ1LCAqaWQ3OwotICB1bnNpZ25lZCBjaGFyICpkNCwgKmQ1LCAqZDc7Ci0gIGludCBsZW47Ci0gIGNoYXIgKm9uYW1lOwotICBiZmQgKmFiZmQ7Ci0KLSAgb25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIHNwcmludGYgKG9uYW1lLCAiZCUwNmQubyIsIHRtcF9zZXEpOwotICB0bXBfc2VxKys7Ci0KLSAgYWJmZCA9IGJmZF9jcmVhdGUgKG9uYW1lLCBwYXJlbnQpOwotICBiZmRfZmluZF90YXJnZXQgKHBlX2RldGFpbHMtPm9iamVjdF90YXJnZXQsIGFiZmQpOwotICBiZmRfbWFrZV93cml0YWJsZSAoYWJmZCk7Ci0KLSAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgcGVfZGV0YWlscy0+YmZkX2FyY2gsIDApOwotCi0gIHN5bXB0ciA9IDA7Ci0gIHN5bXRhYiA9IChhc3ltYm9sICoqKSB4bWFsbG9jICg1ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWQ0ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNSA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDcgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDciLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCIiKSwgZGxsX3N5bW5hbWUsICJfaW5hbWUiLCBpZDcsIEJTRl9HTE9CQUwsIDApOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDQsIDQpOwotICBkNCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDQtPmNvbnRlbnRzID0gZDQ7Ci0gIG1lbXNldCAoZDQsIDAsIDQpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDUsIDQpOwotICBkNSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDUtPmNvbnRlbnRzID0gZDU7Ci0gIG1lbXNldCAoZDUsIDAsIDQpOwotCi0gIGxlbiA9IHN0cmxlbiAoZGxsX2ZpbGVuYW1lKSsxOwotICBpZiAobGVuICYgMSkKLSAgICBsZW4gKys7Ci0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDcsIGxlbik7Ci0gIGQ3ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgaWQ3LT5jb250ZW50cyA9IGQ3OwotICBzdHJjcHkgKGQ3LCBkbGxfZmlsZW5hbWUpOwotCi0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW10YWIsIHN5bXB0cik7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDQsIGQ0LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDUsIGQ1LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDcsIGQ3LCAwLCBsZW4pOwotCi0gIGJmZF9tYWtlX3JlYWRhYmxlIChhYmZkKTsKLSAgcmV0dXJuIGFiZmQ7Ci19Ci0KLS8qCi0gKgkudGV4dAotICoJLmdsb2JhbAkJX2Z1bmN0aW9uCi0gKgkuZ2xvYmFsCQlfX19pbXBfZnVuY3Rpb24KLSAqCS5nbG9iYWwJCV9faW1wX19mdW5jdGlvbgotICpfZnVuY3Rpb246Ci0gKglqbXAJCSpfX2ltcF9fZnVuY3Rpb246Ci0gKgotICoJLnNlY3Rpb24JaWRhdGEkNwotICoJLmxvbmcJCV9faGVhZF9teV9kbGwKLSAqCi0gKgkuc2VjdGlvbgkuaWRhdGEkNQotICpfX19pbXBfZnVuY3Rpb246Ci0gKl9faW1wX19mdW5jdGlvbjoKLSAqaWF0PwotICoJLnNlY3Rpb24JLmlkYXRhJDQKLSAqaWF0PwotICoJLnNlY3Rpb24JLmlkYXRhJDYKLSAqSUQ8b3JkaW5hbD46Ci0gKgkuc2hvcnQJCTxoaW50PgotICoJLmFzY2l6CQkiZnVuY3Rpb24iIHhsYXRlPyAoYWRkIHVuZGVyc2NvcmUsIGtpbGwgYXQpCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgam1wX2l4ODZfYnl0ZXNbXSA9IHsKLSAgMHhmZiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MAotfTsKLQotCi1zdGF0aWMgYmZkICoKLW1ha2Vfb25lIChleHAsIHBhcmVudCkKLSAgICAgZGVmX2ZpbGVfZXhwb3J0ICpleHA7Ci0gICAgIGJmZCAqcGFyZW50OwotewotICBhc2VjdGlvbiAqdHgsICppZDcsICppZDUsICppZDQsICppZDY7Ci0gIHVuc2lnbmVkIGNoYXIgKnRkLCAqZDcsICpkNSwgKmQ0LCAqZDY7Ci0gIGludCBsZW47Ci0gIGNoYXIgKm9uYW1lOwotICBiZmQgKmFiZmQ7Ci0gIHVuc2lnbmVkIGNoYXIgKmptcF9ieXRlczsKLSAgaW50IGptcF9ieXRlX2NvdW50OwotCi0gIHN3aXRjaCAocGVfZGV0YWlscy0+cGVfYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBQRV9BUkNIX2kzODY6Ci0gICAgICBqbXBfYnl0ZXMgPSBqbXBfaXg4Nl9ieXRlczsKLSAgICAgIGptcF9ieXRlX2NvdW50ID0gc2l6ZW9mIChqbXBfaXg4Nl9ieXRlcyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgb25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIHNwcmludGYgKG9uYW1lLCAiZCUwNmQubyIsIHRtcF9zZXEpOwotICB0bXBfc2VxKys7Ci0KLSAgYWJmZCA9IGJmZF9jcmVhdGUgKG9uYW1lLCBwYXJlbnQpOwotICBiZmRfZmluZF90YXJnZXQgKHBlX2RldGFpbHMtPm9iamVjdF90YXJnZXQsIGFiZmQpOwotICBiZmRfbWFrZV93cml0YWJsZSAoYWJmZCk7Ci0KLSAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgcGVfZGV0YWlscy0+YmZkX2FyY2gsIDApOwotCi0gIHN5bXB0ciA9IDA7Ci0gIHN5bXRhYiA9IChhc3ltYm9sICoqKSB4bWFsbG9jICgxMCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIHR4ICA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIudGV4dCIsICAgIFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDcgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDciLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ1ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNCA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDYgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDYiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCIiKSwgZXhwLT5pbnRlcm5hbF9uYW1lLCAiIiwgdHgsIEJTRl9HTE9CQUwsIDApOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIl9oZWFkXyIpLCBkbGxfc3ltbmFtZSwgIiIsIFVORFNFQywgQlNGX0dMT0JBTCwgMCk7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiX19pbXBfIiksIGV4cC0+aW50ZXJuYWxfbmFtZSwgIiIsIGlkNSwgQlNGX0dMT0JBTCwgMCk7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiX2ltcF9fIiksIGV4cC0+aW50ZXJuYWxfbmFtZSwgIiIsIGlkNSwgQlNGX0dMT0JBTCwgMCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHR4LCBqbXBfYnl0ZV9jb3VudCk7Ci0gIHRkID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoam1wX2J5dGVfY291bnQpOwotICB0eC0+Y29udGVudHMgPSB0ZDsKLSAgbWVtY3B5ICh0ZCwgam1wX2J5dGVzLCBqbXBfYnl0ZV9jb3VudCk7Ci0gIHN3aXRjaCAocGVfZGV0YWlscy0+cGVfYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBQRV9BUkNIX2kzODY6Ci0gICAgICBxdWlja19yZWxvYyAoYWJmZCwgMiwgQkZEX1JFTE9DXzMyLCAyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgc2F2ZV9yZWxvY3MgKHR4KTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ3LCA0KTsKLSAgZDcgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ3LT5jb250ZW50cyA9IGQ3OwotICBtZW1zZXQgKGQ3LCAwLCA0KTsKLSAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19SVkEsIDYpOwotICBzYXZlX3JlbG9jcyAoaWQ3KTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ1LCA0KTsKLSAgZDUgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ1LT5jb250ZW50cyA9IGQ1OwotICBtZW1zZXQgKGQ1LCAwLCA0KTsKLSAgaWYgKGV4cC0+ZmxhZ19ub25hbWUpCi0gICAgewotICAgICAgZDVbMF0gPSBleHAtPm9yZGluYWw7Ci0gICAgICBkNVsxXSA9IGV4cC0+b3JkaW5hbCA+PiA4OwotICAgICAgZDVbM10gPSAweDgwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHF1aWNrX3JlbG9jIChhYmZkLCAwLCBCRkRfUkVMT0NfUlZBLCA0KTsKLSAgICAgIHNhdmVfcmVsb2NzIChpZDUpOwotICAgIH0KLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ0LCA0KTsKLSAgZDQgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ0LT5jb250ZW50cyA9IGQ0OwotICBtZW1zZXQgKGQ0LCAwLCA0KTsKLSAgaWYgKGV4cC0+ZmxhZ19ub25hbWUpCi0gICAgewotICAgICAgZDVbMF0gPSBleHAtPm9yZGluYWw7Ci0gICAgICBkNVsxXSA9IGV4cC0+b3JkaW5hbCA+PiA4OwotICAgICAgZDVbM10gPSAweDgwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHF1aWNrX3JlbG9jIChhYmZkLCAwLCBCRkRfUkVMT0NfUlZBLCA0KTsKLSAgICAgIHNhdmVfcmVsb2NzIChpZDQpOwotICAgIH0KLQotICBpZiAoZXhwLT5mbGFnX25vbmFtZSkKLSAgICB7Ci0gICAgICBsZW4gPSAwOwotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNiwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGVuID0gc3RybGVuIChleHAtPm5hbWUpICsgMzsKLSAgICAgIGlmIChsZW4gJiAxKQotCWxlbisrOwotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNiwgbGVuKTsKLSAgICAgIGQ2ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgICAgIGlkNi0+Y29udGVudHMgPSBkNjsKLSAgICAgIG1lbXNldCAoZDYsIDAsIGxlbik7Ci0gICAgICBkNlswXSA9IGV4cC0+aGludCAmIDB4ZmY7Ci0gICAgICBkNlsxXSA9IGV4cC0+aGludCA+PiA4OwotICAgICAgc3RyY3B5IChkNisyLCBleHAtPm5hbWUpOwotICAgIH0KLQotICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgc3ltdGFiLCBzeW1wdHIpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgdHgsIHRkLCAwLCBqbXBfYnl0ZV9jb3VudCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ3LCBkNywgMCwgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ1LCBkNSwgMCwgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ0LCBkNCwgMCwgNCk7Ci0gIGlmICghZXhwLT5mbGFnX25vbmFtZSkKLSAgICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNiwgZDYsIDAsIGxlbik7Ci0KLSAgYmZkX21ha2VfcmVhZGFibGUgKGFiZmQpOwotICByZXR1cm4gYWJmZDsKLX0KLQotdm9pZAotcGVfZGxsX2dlbmVyYXRlX2ltcGxpYiAoZGVmLCBpbXBmaWxlbmFtZSkKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLSAgICAgY2hhciAqaW1wZmlsZW5hbWU7Ci17Ci0gIGludCBpOwotICBiZmQgKmFyX2hlYWQ7Ci0gIGJmZCAqYXJfdGFpbDsKLSAgYmZkICpvdXRhcmNoOwotICBiZmQgKmhlYWQgPSAwOwotCi0gIGRsbF9maWxlbmFtZSA9IGRlZi0+bmFtZTsKLSAgaWYgKGRsbF9maWxlbmFtZSA9PSAwKQotICAgIHsKLSAgICAgIGRsbF9maWxlbmFtZSA9IGRsbF9uYW1lOwotICAgICAgZm9yIChpPTA7IGltcGZpbGVuYW1lW2ldOyBpKyspCi0JaWYgKGltcGZpbGVuYW1lW2ldID09ICcvJyB8fCBpbXBmaWxlbmFtZVtpXSA9PSAnXFwnKQotCSAgZGxsX2ZpbGVuYW1lID0gaW1wZmlsZW5hbWUrMTsKLSAgICB9Ci0gIGRsbF9zeW1uYW1lID0geHN0cmR1cCAoZGxsX2ZpbGVuYW1lKTsKLSAgZm9yIChpPTA7IGRsbF9zeW1uYW1lW2ldOyBpKyspCi0gICAgaWYgKCFpc2FsbnVtICgodW5zaWduZWQgY2hhcikgZGxsX3N5bW5hbWVbaV0pKQotICAgICAgZGxsX3N5bW5hbWVbaV0gPSAnXyc7Ci0KLSAgdW5saW5rIChpbXBmaWxlbmFtZSk7Ci0KLSAgb3V0YXJjaCA9IGJmZF9vcGVudyAoaW1wZmlsZW5hbWUsIDApOwotCi0gIGlmICghb3V0YXJjaCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZWluZm8gKF8oIiVYQ2FuJ3Qgb3BlbiAubGliIGZpbGU6ICVzXG4iKSwgaW1wZmlsZW5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBlaW5mbyAoXygiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIiksIGltcGZpbGVuYW1lKTsKLSAgCi0gIGJmZF9zZXRfZm9ybWF0IChvdXRhcmNoLCBiZmRfYXJjaGl2ZSk7Ci0gIG91dGFyY2gtPmhhc19hcm1hcCA9IDE7Ci0KLSAgLyogV29yayBvdXQgYSByZWFzb25hYmxlIHNpemUgb2YgdGhpbmdzIHRvIHB1dCBvbnRvIG9uZSBsaW5lLiAqLwotCi0gIGFyX2hlYWQgPSBtYWtlX2hlYWQgKG91dGFyY2gpOwotCi0gIGZvciAoaSA9IDA7IGk8ZGVmLT5udW1fZXhwb3J0czsgaSsrKQotICAgIHsKLSAgICAgIC8qIFRoZSBpbXBvcnQgbGlicmFyeSBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIGludGVybmFsIG5hbWUgKi8KLSAgICAgIGNoYXIgKmludGVybmFsID0gZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWU7Ci0gICAgICBiZmQgKm47Ci0gICAgICBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSA9IGRlZi0+ZXhwb3J0c1tpXS5uYW1lOwotICAgICAgbiA9IG1ha2Vfb25lIChkZWYtPmV4cG9ydHMraSwgb3V0YXJjaCk7Ci0gICAgICBuLT5uZXh0ID0gaGVhZDsKLSAgICAgIGhlYWQgPSBuOwotICAgICAgZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUgPSBpbnRlcm5hbDsKLSAgICB9Ci0KLSAgYXJfdGFpbCA9IG1ha2VfdGFpbCAob3V0YXJjaCk7Ci0KLSAgaWYgKGFyX2hlYWQgPT0gTlVMTCB8fCBhcl90YWlsID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIE5vdyBzdGljayB0aGVtIGFsbCBpbnRvIHRoZSBhcmNoaXZlICovCi0KLSAgYXJfaGVhZC0+bmV4dCA9IGhlYWQ7Ci0gIGFyX3RhaWwtPm5leHQgPSBhcl9oZWFkOwotICBoZWFkID0gYXJfdGFpbDsKLQotICBpZiAoISBiZmRfc2V0X2FyY2hpdmVfaGVhZCAob3V0YXJjaCwgaGVhZCkpCi0gICAgZWluZm8gKCIlWGJmZF9zZXRfYXJjaGl2ZV9oZWFkOiAlc1xuIiwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAKLSAgaWYgKCEgYmZkX2Nsb3NlIChvdXRhcmNoKSkKLSAgICBlaW5mbyAoIiVYYmZkX2Nsb3NlICVzOiAlc1xuIiwgaW1wZmlsZW5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQotICB3aGlsZSAoaGVhZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZCAqbiA9IGhlYWQtPm5leHQ7Ci0gICAgICBiZmRfY2xvc2UgKGhlYWQpOwotICAgICAgaGVhZCA9IG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotYWRkX2JmZF90b19saW5rIChhYmZkLCBuYW1lLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmFrZV9maWxlOwotICBmYWtlX2ZpbGUgPSBsYW5nX2FkZF9pbnB1dF9maWxlIChuYW1lLAotCQkJCSAgIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW0sCi0JCQkJICAgTlVMTCk7Ci0gIGZha2VfZmlsZS0+dGhlX2JmZCA9IGFiZmQ7Ci0gIGxkbGFuZ19hZGRfZmlsZSAoZmFrZV9maWxlKTsKLSAgaWYgKCFiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgbGlua19pbmZvKSkKLSAgICBlaW5mbyAoIiVYYWRkc3ltICVzOiAlc1xuIiwgbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotfQotCi12b2lkCi1wZV9wcm9jZXNzX2ltcG9ydF9kZWZzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgZGVmX2ZpbGVfbW9kdWxlICptb2R1bGU7Ci0gIHBlX2RsbF9pZF90YXJnZXQoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLQotICBpZiAoIXBlX2RlZl9maWxlKQotICAgIHJldHVybjsKLQotICBmb3IgKG1vZHVsZSA9IHBlX2RlZl9maWxlLT5tb2R1bGVzOyBtb2R1bGU7IG1vZHVsZSA9IG1vZHVsZS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgaSwgZG9fdGhpc19kbGw7Ci0KLSAgICAgIGRsbF9maWxlbmFtZSA9IG1vZHVsZS0+bmFtZTsKLSAgICAgIGRsbF9zeW1uYW1lID0geHN0cmR1cCAobW9kdWxlLT5uYW1lKTsKLSAgICAgIGZvciAoaT0wOyBkbGxfc3ltbmFtZVtpXTsgaSsrKQotCWlmICghaXNhbG51bSAoZGxsX3N5bW5hbWVbaV0pKQotCSAgZGxsX3N5bW5hbWVbaV0gPSAnXyc7Ci0KLSAgICAgIGRvX3RoaXNfZGxsID0gMDsKLQotICAgICAgZm9yIChpPTA7IGk8cGVfZGVmX2ZpbGUtPm51bV9pbXBvcnRzOyBpKyspCi0JaWYgKHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLm1vZHVsZSA9PSBtb2R1bGUpCi0JICB7Ci0JICAgIGRlZl9maWxlX2V4cG9ydCBleHA7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpibGhlOwotCi0JICAgIC8qIHNlZSBpZiB3ZSBuZWVkIHRoaXMgaW1wb3J0ICovCi0JICAgIGNoYXIgKm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUpICsgMik7Ci0JICAgIHNwcmludGYgKG5hbWUsICIlcyVzIiwgVSgiIiksIHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCSAgICBibGhlID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby0+aGFzaCwgbmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCSAgICBmcmVlIChuYW1lKTsKLQkgICAgaWYgKGJsaGUgJiYgYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICAgICB7Ci0JCWJmZCAqb25lOwotCQkvKiB3ZSBkbyAqLwotCQlpZiAoIWRvX3RoaXNfZGxsKQotCQkgIHsKLQkJICAgIGJmZCAqYXJfaGVhZCA9IG1ha2VfaGVhZCAob3V0cHV0X2JmZCk7Ci0JCSAgICBhZGRfYmZkX3RvX2xpbmsgKGFyX2hlYWQsIGFyX2hlYWQtPmZpbGVuYW1lLCBsaW5rX2luZm8pOwotCQkgICAgZG9fdGhpc19kbGwgPSAxOwotCQkgIH0KLQkJZXhwLmludGVybmFsX25hbWUgPSBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lOwotCQlleHAubmFtZSA9IHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLm5hbWU7Ci0JCWV4cC5vcmRpbmFsID0gcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0ub3JkaW5hbDsKLQkJZXhwLmhpbnQgPSBleHAub3JkaW5hbCA+PSAwID8gZXhwLm9yZGluYWwgOiAwOwotCQlleHAuZmxhZ19wcml2YXRlID0gMDsKLQkJZXhwLmZsYWdfY29uc3RhbnQgPSAwOwotCQlleHAuZmxhZ19kYXRhID0gMDsKLQkJZXhwLmZsYWdfbm9uYW1lID0gZXhwLm5hbWUgPyAwIDogMTsKLQkJb25lID0gbWFrZV9vbmUgKCZleHAsIG91dHB1dF9iZmQpOwotCQlhZGRfYmZkX3RvX2xpbmsgKG9uZSwgb25lLT5maWxlbmFtZSwgbGlua19pbmZvKTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICBpZiAoZG9fdGhpc19kbGwpCi0JewotCSAgYmZkICphcl90YWlsID0gbWFrZV90YWlsIChvdXRwdXRfYmZkKTsKLQkgIGFkZF9iZmRfdG9fbGluayAoYXJfdGFpbCwgYXJfdGFpbC0+ZmlsZW5hbWUsIGxpbmtfaW5mbyk7Ci0JfQotCi0gICAgICBmcmVlIChkbGxfc3ltbmFtZSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBXZSB3ZXJlIGhhbmRlZCBhICouRExMIGZpbGUuICBQYXJzZSBpdCBhbmQgdHVybiBpdCBpbnRvIGEgc2V0IG9mCi0gSU1QT1JUUyBkaXJlY3RpdmVzIGluIHRoZSBkZWYgZmlsZS4gIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcwotIGhhbmRsZWQsIGZhbHNlIGlmIG5vdC4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGVfZ2V0MTYgKGFiZmQsIHdoZXJlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB3aGVyZTsKLXsKLSAgdW5zaWduZWQgY2hhciBiWzJdOwotICBiZmRfc2VlayAoYWJmZCwgd2hlcmUsIFNFRUtfU0VUKTsKLSAgYmZkX3JlYWQgKGIsIDEsIDIsIGFiZmQpOwotICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGVfZ2V0MzIgKGFiZmQsIHdoZXJlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB3aGVyZTsKLXsKLSAgdW5zaWduZWQgY2hhciBiWzRdOwotICBiZmRfc2VlayAoYWJmZCwgd2hlcmUsIFNFRUtfU0VUKTsKLSAgYmZkX3JlYWQgKGIsIDEsIDQsIGFiZmQpOwotICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotfQotCi0jaWYgMCAvKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBlX2FzMTYgKHB0cikKLSAgICAgdm9pZCAqcHRyOwotewotICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBlX2FzMzIgKHB0cikKLSAgICAgdm9pZCAqcHRyOwotewotICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotfQotCi1ib29sZWFuCi1wZV9pbXBsaWVkX2ltcG9ydF9kbGwgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgYmZkICpkbGw7Ci0gIHVuc2lnbmVkIGxvbmcgcGVfaGVhZGVyX29mZnNldCwgb3B0aGRyX29mcywgbnVtX2VudHJpZXMsIGk7Ci0gIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7Ci0gIHVuc2lnbmVkIGNoYXIgKmV4cGRhdGEsICplcnZhOwotICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhcywgb3JkaW5hbHMsIG5leHAsIG9yZGJhc2U7Ci0gIGNoYXIgKmRsbF9uYW1lOwotCi0gIC8qIE5vLCBJIGNhbid0IHVzZSBiZmQgaGVyZS4gIGtlcm5lbDMyLmRsbCBwdXRzIGl0cyBleHBvcnQgdGFibGUgaW4KLSAgICAgdGhlIG1pZGRsZSBvZiB0aGUgLnJkYXRhIHNlY3Rpb24uICovCi0KLSAgZGxsID0gYmZkX29wZW5yIChmaWxlbmFtZSwgcGVfZGV0YWlscy0+dGFyZ2V0X25hbWUpOwotICBpZiAoIWRsbCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYb3BlbiAlczogJXNcbiIsIGZpbGVuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBQRUkgZGxscyBzZWVtIHRvIGJlIGJmZF9vYmplY3RzICovCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoZGxsLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJXM6IHRoaXMgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBETExcbiIsIGZpbGVuYW1lKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZGxsX25hbWUgPSBmaWxlbmFtZTsKLSAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCi0gICAgaWYgKGZpbGVuYW1lW2ldID09ICcvJyB8fCBmaWxlbmFtZVtpXSA9PSAnXFwnIHx8IGZpbGVuYW1lW2ldID09ICc6JykKLSAgICAgIGRsbF9uYW1lID0gZmlsZW5hbWUgKyBpICsgMTsKLQotICBwZV9oZWFkZXJfb2Zmc2V0ID0gcGVfZ2V0MzIgKGRsbCwgMHgzYyk7Ci0gIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOwotICBudW1fZW50cmllcyA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyA5Mik7Ci0gIGlmIChudW1fZW50cmllcyA8IDEpIC8qIG5vIGV4cG9ydHMgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci0gIGV4cG9ydF9ydmEgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTYpOwotICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOwotICBuc2VjdGlvbnMgPSBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIpOwotICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCi0JICAgIHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMTYpKTsKLSAgZXhwcHRyID0gMDsKLSAgZm9yIChpPTA7IGk8bnNlY3Rpb25zOyBpKyspCi0gICAgewotICAgICAgY2hhciBzbmFtZVs4XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTIpOwotICAgICAgdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7Ci0gICAgICB1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOwotICAgICAgYmZkX3NlZWsoZGxsLCBzZWNwdHIxLCBTRUVLX1NFVCk7Ci0gICAgICBiZmRfcmVhZChzbmFtZSwgMSwgOCwgZGxsKTsKLSAgICAgIGlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKLQl7Ci0JICBleHBwdHIgPSBmcHRyICsgKGV4cG9ydF9ydmEgLSB2YWRkcik7Ci0JICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKLQkgICAgZXhwb3J0X3NpemUgPSB2c2l6ZSAtIChleHBvcnRfcnZhIC0gdmFkZHIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoZXhwb3J0X3NpemUpOwotICBiZmRfc2VlayAoZGxsLCBleHBwdHIsIFNFRUtfU0VUKTsKLSAgYmZkX3JlYWQgKGV4cGRhdGEsIDEsIGV4cG9ydF9zaXplLCBkbGwpOwotICBlcnZhID0gZXhwZGF0YSAtIGV4cG9ydF9ydmE7Ci0KLSAgaWYgKHBlX2RlZl9maWxlID09IDApCi0gICAgcGVfZGVmX2ZpbGUgPSBkZWZfZmlsZV9lbXB0eSgpOwotCi0gIG5leHAgPSBwZV9hczMyIChleHBkYXRhKzI0KTsKLSAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7Ci0gIG9yZGluYWxzID0gcGVfYXMzMiAoZXhwZGF0YSszNik7Ci0gIG9yZGJhc2UgPSBwZV9hczMyIChleHBkYXRhKzE2KTsKLSAgZm9yIChpPTA7IGk8bmV4cDsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZV9ydmEgPSBwZV9hczMyIChlcnZhK25hbWVfcnZhcytpKjQpOwotICAgICAgZGVmX2ZpbGVfaW1wb3J0ICppbXA7Ci0gICAgICBpbXAgPSBkZWZfZmlsZV9hZGRfaW1wb3J0IChwZV9kZWZfZmlsZSwgZXJ2YStuYW1lX3J2YSwgZGxsX25hbWUsCi0JCQkJIGksIDApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gVGhlc2UgYXJlIHRoZSBtYWluIGZ1bmN0aW9ucywgY2FsbGVkIGZyb20gdGhlIGVtdWxhdGlvbi4gIFRoZSBmaXJzdAotIGlzIGNhbGxlZCBhZnRlciB0aGUgYmZkcyBhcmUgcmVhZCwgc28gd2UgY2FuIGd1ZXNzIGF0IGhvdyBtdWNoIHNwYWNlCi0gd2UgbmVlZC4gIFRoZSBzZWNvbmQgaXMgY2FsbGVkIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgcGxhY2VkLCBzbyB3ZQotIGNhbiBwdXQgdGhlIHJpZ2h0IHZhbHVlcyBpbiBwbGFjZS4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotcGVfZGxsX2J1aWxkX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBwZV9kbGxfaWRfdGFyZ2V0IChiZmRfZ2V0X3RhcmdldCAoYWJmZCkpOwotICBwcm9jZXNzX2RlZl9maWxlIChhYmZkLCBpbmZvKTsKLQotICBnZW5lcmF0ZV9lZGF0YSAoYWJmZCwgaW5mbyk7Ci0gIGJ1aWxkX2ZpbGxlcl9iZmQgKDEpOwotfQotCi12b2lkCi1wZV9leGVfYnVpbGRfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHBlX2RsbF9pZF90YXJnZXQgKGJmZF9nZXRfdGFyZ2V0IChhYmZkKSk7Ci0gIGJ1aWxkX2ZpbGxlcl9iZmQgKDApOwotfQotCi12b2lkCi1wZV9kbGxfZmlsbF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcGVfZGxsX2lkX3RhcmdldCAoYmZkX2dldF90YXJnZXQgKGFiZmQpKTsKLSAgaW1hZ2VfYmFzZSA9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCi0gIGdlbmVyYXRlX3JlbG9jIChhYmZkLCBpbmZvKTsKLSAgaWYgKHJlbG9jX3N6ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgcmVsb2NfcywgcmVsb2Nfc3opOwotCi0gICAgICAvKiBSZXNpemUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQsIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJnN0YXRfcHRyLT5oZWFkLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotCi0gICAgICAvKiBSZWRvIHNwZWNpYWwgc3R1ZmYuICAqLwotICAgICAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0KLSAgICAgIC8qIERvIHRoZSBhc3NpZ25tZW50cyBhZ2Fpbi4gICovCi0gICAgICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0X3B0ci0+aGVhZCwKLQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLSAgICB9Ci0KLSAgZmlsbF9lZGF0YSAoYWJmZCwgaW5mbyk7Ci0KLSAgcGVfZGF0YSAoYWJmZCktPmRsbCA9IDE7Ci0KLSAgZWRhdGFfcy0+Y29udGVudHMgPSBlZGF0YV9kOwotICByZWxvY19zLT5jb250ZW50cyA9IHJlbG9jX2Q7Ci19Ci0KLXZvaWQKLXBlX2V4ZV9maWxsX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBwZV9kbGxfaWRfdGFyZ2V0IChiZmRfZ2V0X3RhcmdldCAoYWJmZCkpOwotICBpbWFnZV9iYXNlID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0KLSAgZ2VuZXJhdGVfcmVsb2MgKGFiZmQsIGluZm8pOwotICBpZiAocmVsb2Nfc3ogPiAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCByZWxvY19zLCByZWxvY19zeik7Ci0KLSAgICAgIC8qIFJlc2l6ZSB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCwgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmc3RhdF9wdHItPmhlYWQsIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0KLSAgICAgIC8qIFJlZG8gc3BlY2lhbCBzdHVmZi4gICovCi0gICAgICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKLQotICAgICAgLyogRG8gdGhlIGFzc2lnbm1lbnRzIGFnYWluLiAgKi8KLSAgICAgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRfcHRyLT5oZWFkLAotCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotICAgIH0KLSAgcmVsb2Nfcy0+Y29udGVudHMgPSByZWxvY19kOwotfQpkaWZmIC0tZ2l0IGEvbGQvcG8vTWFrZS1pbiBiL2xkL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTEwOTAuLjAwMDAwMDAKLS0tIGEvbGQvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLUMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9sZC9wby9QT1RGSUxFUy5pbiBiL2xkL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWEwYzhlLi4wMDAwMDAwCi0tLSBhL2xkL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotZGVmZmlsZS5oCi1lbXVsdGVtcGwvYXJtY29mZi5lbQotZW11bHRlbXBsL3BlLmVtCi1sZC5oCi1sZGNyZWYuYwotbGRjdG9yLmMKLWxkY3Rvci5oCi1sZGVtdWwuYwotbGRlbXVsLmgKLWxkZXhwLmMKLWxkZXhwLmgKLWxkZmlsZS5jCi1sZGZpbGUuaAotbGRsYW5nLmMKLWxkbGFuZy5oCi1sZGxleC5oCi1sZG1haW4uYwotbGRtYWluLmgKLWxkbWlzYy5jCi1sZG1pc2MuaAotbGR2ZXIuYwotbGR2ZXIuaAotbGR3cml0ZS5jCi1sZHdyaXRlLmgKLWxleHN1cC5jCi1tcmkuYwotbXJpLmgKLXBlLWRsbC5jCmRpZmYgLS1naXQgYS9sZC9wby9sZC5wb3QgYi9sZC9wby9sZC5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDM0Y2UuLjAwMDAwMDAKLS0tIGEvbGQvcG8vbGQucG90CisrKyAvZGV2L251bGwKQEAgLTEsMTQyNSArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wNi0wMyAwMzoxMS0wNzAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogZW11bHRlbXBsL2FybWNvZmYuZW06NjUKLW1zZ2lkICIgIC0tc3VwcG9ydC1vbGQtY29kZSAgIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvYXJtY29mZi5lbToxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTk4Ci1tc2dpZCAiIgotIiAgLS1iYXNlX2ZpbGUgPGJhc2VmaWxlPiAgICAgICAgICAgICBHZW5lcmF0ZSBhIGJhc2UgZmlsZSBmb3IgcmVsb2NhdGFibGUgIgotIkRMTHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTk5Ci1tc2dpZCAiIgotIiAgLS1kbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgaW1hZ2UgYmFzZSB0byB0aGUgZGVmYXVsdCBmb3IgRExMc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDAKLW1zZ2lkICIgIC0tZmlsZS1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgICAgU2V0IGZpbGUgYWxpZ25tZW50XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwMQotbXNnaWQgIiAgLS1oZWFwIDxzaXplPiAgICAgICAgICAgICAgICAgICAgICBTZXQgaW5pdGlhbCBzaXplIG9mIHRoZSBoZWFwXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwMgotbXNnaWQgIiIKLSIgIC0taW1hZ2UtYmFzZSA8YWRkcmVzcz4gICAgICAgICAgICAgU2V0IHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjAzCi1tc2dpZCAiIgotIiAgLS1tYWpvci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA0Ci1tc2dpZCAiICAtLW1ham9yLW9zLXZlcnNpb24gPG51bWJlcj4gICAgICAgIFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA1Ci1tc2dpZCAiIgotIiAgLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gIgotInZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA2Ci1tc2dpZCAiIgotIiAgLS1taW5vci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwNwotbXNnaWQgIiAgLS1taW5vci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyByZXZpc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDgKLW1zZ2lkICIiCi0iICAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSAiCi0icmV2aXNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA5Ci1tc2dpZCAiICAtLXNlY3Rpb24tYWxpZ25tZW50IDxzaXplPiAgICAgICAgIFNldCBzZWN0aW9uIGFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTAKLW1zZ2lkICIgIC0tc3RhY2sgPHNpemU+ICAgICAgICAgICAgICAgICAgICAgU2V0IHNpemUgb2YgdGhlIGluaXRpYWwgc3RhY2tcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjExCi1tc2dpZCAiIgotIiAgLS1zdWJzeXN0ZW0gPG5hbWU+Wzo8dmVyc2lvbj5dICAgICBTZXQgcmVxdWlyZWQgT1Mgc3Vic3lzdGVtIFsmIHZlcnNpb25dXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxMgotbXNnaWQgIiIKLSIgIC0tc3VwcG9ydC1vbGQtY29kZSAgICAgICAgICAgICAgICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTQKLW1zZ2lkICIiCi0iICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgICAgICAgICAgICAgIEV4cG9ydCBzeW1ib2xzIHdpdGggYW5kIHdpdGhvdXQgQG5uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxNQotbXNnaWQgIiAgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgICAgICAgICAgICBEb24ndCBsaW5rIF9zeW0gdG8gX3N5bUBublxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTYKLW1zZ2lkICIiCi0iICAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgIExpbmsgX3N5bSB0byBfc3ltQG5uIHdpdGhvdXQgd2FybmluZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjE3Ci1tc2dpZCAiIgotIiAgLS1leGNsdWRlLXN5bWJvbHMgc3ltLHN5bSwuLi4gICAgICBFeGNsdWRlIHN5bWJvbHMgZnJvbSBhdXRvbWF0aWMgZXhwb3J0XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxOAotbXNnaWQgIiIKLSIgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgICAgICAgICAgICAgQXV0b21hdGljYWxseSBleHBvcnQgYWxsIGdsb2JhbHMgdG8gIgotIkRMTFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTkKLW1zZ2lkICIgIC0ta2lsbC1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIEBubiBmcm9tIGV4cG9ydGVkIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjIwCi1tc2dpZCAiICAtLW91dC1pbXBsaWIgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIyMQotbXNnaWQgIiIKLSIgIC0tb3V0cHV0LWRlZiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgYSAuREVGIGZpbGUgZm9yIHRoZSBidWlsdCBETExcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06Mjg0Ci1tc2dpZCAiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTozMDAKLW1zZ2lkICIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjMxNQotbXNnaWQgIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzMzCi1tc2dpZCAiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo1MDUKLW1zZ2lkICIlUDogd2FybmluZywgZmlsZSBhbGlnbm1lbnQgPiBzZWN0aW9uIGFsaWdubWVudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NTc1IGVtdWx0ZW1wbC9wZS5lbTo2MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NTgwIGVtdWx0ZW1wbC9wZS5lbTo2MDYKLW1zZ2lkICJVc2UgLS1lbmFibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIHdhcm5pbmdzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjU4MSBlbXVsdGVtcGwvcGUuZW06NjA3Ci1tc2dpZCAiVXNlIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2UgZml4dXBzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjYyMwotbXNnaWQgIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjcyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjc0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIGZvciBpbnRlcndvcmtpbmciCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjgwMiBsZGxhbmcuYzoxNjU3IGxkbGFuZy5jOjM5MzQgbGRsYW5nLmM6Mzk2OCBsZG1haW4uYzo5OTIKLW1zZ2lkICIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MTYyCi1tc2dpZCAiJVglUDogYmZkX2hhc2hfdGFibGVfaW5pdCBvZiBjcmVmIHRhYmxlIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoxNjgKLW1zZ2lkICIlWCVQOiBjcmVmX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyMzkKLW1zZ2lkICIiCi0iXG4iCi0iQ3Jvc3MgUmVmZXJlbmNlIFRhYmxlXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MjQwCi1tc2dpZCAiU3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjI0OAotbXNnaWQgIkZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyNTIKLW1zZ2lkICJObyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MzY5Ci1tc2dpZCAiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzo0NDEKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOyAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjQ0NSBsZG1haW4uYzoxMDYwIGxkbWFpbi5jOjEwNjQKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjUxNyBsZGNyZWYuYzo1MjQgbGRtYWluLmM6MTExMCBsZG1haW4uYzoxMTE3Ci1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIgotbXNnc3RyICIiCi0KLSMuIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wuICBUaGUgc3ltYm9sIGlzIGRlZmluZWQKLSMuIGluIE9VVFNFQ05BTUUuICBUaGlzIHJlbG9jIGlzIGZyb20gYSBzZWN0aW9uIHdoaWNoIGlzCi0jLiBtYXBwZWQgaW50byBhIHNlY3Rpb24gZnJvbSB3aGljaCByZWZlcmVuY2VzIHRvIE9VVFNFQ05BTUUKLSMuIGFyZSBwcm9oaWJpdGVkLiAgV2UgbXVzdCByZXBvcnQgYW4gZXJyb3IuCi0jOiBsZGNyZWYuYzo1NDIKLW1zZ2lkICIlWCVDOiBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tICVzIHRvIGAlVCcgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzo4OQotbXNnaWQgIiVQJVg6IERpZmZlcmVudCByZWxvY3MgdXNlZCBpbiBzZXQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzoxMDYKLW1zZ2lkICIlUCVYOiBEaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cyBjb21wb3Npbmcgc2V0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjdG9yLmM6Mjg4IGxkY3Rvci5jOjMwMgotbXNnaWQgIiVQJVg6ICVzIGRvZXMgbm90IHN1cHBvcnQgcmVsb2MgJXMgZm9yIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjMyMwotbXNnaWQgIiVQJVg6IFVuc3VwcG9ydGVkIHNpemUgJWQgZm9yIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjM0NAotbXNnaWQgIiIKLSJcbiIKLSJTZXQgICAgICAgICAgICAgICAgIFN5bWJvbFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjIyMwotbXNnaWQgIiVTIFNZU0xJQiBpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6MjMxCi1tc2dpZCAiJVMgSExMIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGVtdWwuYzoyNTIKLW1zZ2lkICIlUDogdW5yZWNvZ25pc2VkIGVtdWxhdGlvbiBtb2RlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjI1MwotbXNnaWQgIlN1cHBvcnRlZCBlbXVsYXRpb25zOiAiCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6Mjk3Ci1tc2dpZCAiICBubyBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9ucy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjE1NgotbXNnaWQgIiVGJVA6ICVzIHVzZXMgdW5kZWZpbmVkIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjE1OAotbXNnaWQgIiVGJVA6ICVzIGZvcndhcmQgcmVmZXJlbmNlIG9mIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjI3MAotbXNnaWQgIiVGJVMgJSUgYnkgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6Mjc3Ci1tc2dpZCAiJUYlUyAvIGJ5IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjQwMAotbXNnaWQgIiVYJVM6IHVucmVzb2x2YWJsZSBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjQxOQotbXNnaWQgIiVGJVM6IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYwMAotbXNnaWQgIiVGJVMgY2FuIG5vdCBQUk9WSURFIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjEwCi1tc2dpZCAiJUYlUyBpbnZhbGlkIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjE0Ci1tc2dpZCAiJUYlUyBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXIgaW52YWxpZCBvdXRzaWRlIG9mIFNFQ1RJT05cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYyNAotbXNnaWQgIiVGJVMgY2Fubm90IG1vdmUgbG9jYXRpb24gY291bnRlciBiYWNrd2FyZHMgKGZyb20gJVYgdG8gJVYpXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo2NTIKLW1zZ2lkICIlUCVGOiVzOiBoYXNoIGNyZWF0aW9uIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6OTQ5Ci1tc2dpZCAiJUYlUyBub25jb25zdGFudCBleHByZXNzaW9uIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6OTgyCi1tc2dpZCAiJUYlUyBub24gY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoxMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byBvcGVuICVzIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjExMQotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIG9wZW4gJXMgc3VjY2VlZGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MTE5Ci1tc2dpZCAiJUYlUDogaW52YWxpZCBCRkQgdGFyZ2V0IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyMDQKLW1zZ2lkICIlRiVQOiBjYW5ub3Qgb3BlbiAlcyBmb3IgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjA3Ci1tc2dpZCAiJUYlUDogY2Fubm90IG9wZW4gJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjI1Ci1tc2dpZCAiJUYlUDogY2Fubm90IGZpbmQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyNDMgbGRmaWxlLmM6MjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjQ1IGxkZmlsZS5jOjI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVuZWQgc2NyaXB0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzozMDMKLW1zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0IGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MzQ0Ci1tc2dpZCAiJVAlRjogdW5rbm93biBhcmNoaXRlY3R1cmU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MzYxCi1tc2dpZCAiJVAlRjogdGFyZ2V0IGFyY2hpdGVjdHVyZSByZXNwZWNpZmllZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjQxNAotbXNnaWQgIiVQJUY6IGNhbm5vdCByZXByZXNlbnQgbWFjaGluZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzIzCi1tc2dpZCAiIgotIlxuIgotIk1lbW9yeSBDb25maWd1cmF0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzI1Ci1tc2dpZCAiTmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3MjUKLW1zZ2lkICJPcmlnaW4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzI1Ci1tc2dpZCAiTGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjcyNQotbXNnaWQgIkF0dHJpYnV0ZXMiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzY3Ci1tc2dpZCAiIgotIlxuIgotIkxpbmtlciBzY3JpcHQgYW5kIG1lbW9yeSBtYXBcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3ODQKLW1zZ2lkICIlUCVGOiBJbGxlZ2FsIHVzZSBvZiBgJXMnIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Nzk0Ci1tc2dpZCAiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6OTE1Ci1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6OTI5Ci1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnIGhhcyBkaWZmZXJlbnQgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEzMjAKLW1zZ2lkICIlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxMzIxCi1tc2dpZCAiJUI6IG1hdGNoaW5nIGZvcm1hdHM6IgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEzMjgKLW1zZ2lkICIlRiVCOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEzODEKLW1zZ2lkICIlRiVCOiBvYmplY3QgJUIgaW4gYXJjaGl2ZSBpcyBub3Qgb2JqZWN0XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTM4NyBsZGxhbmcuYzoxMzk5Ci1tc2dpZCAiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDUyCi1tc2dpZCAiJVAlRjogdGFyZ2V0ICVzIG5vdCBmb3VuZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0NTQKLW1zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDYyCi1tc2dpZCAiJVAlRjolczogY2FuIG5vdCBtYWtlIG9iamVjdCBmaWxlOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0NjYKLW1zZ2lkICIlUCVGOiVzOiBjYW4gbm90IHNldCBhcmNoaXRlY3R1cmU6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTQ3MAotbXNnaWQgIiVQJUY6IGNhbiBub3QgY3JlYXRlIGxpbmsgaGFzaCB0YWJsZTogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNzgwCi1tc2dpZCAiIGxvYWQgYWRkcmVzcyAweCVWIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE5MDkKLW1zZ2lkICIlVyAoc2l6ZSBiZWZvcmUgcmVsYXhpbmcpXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTk4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJBZGRyZXNzIG9mIHNlY3Rpb24gJXMgc2V0IHRvICIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyMTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZhaWwgd2l0aCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjIzNTcKLW1zZ2lkICIlWCVQOiBzZWN0aW9uICVzIFslViAtPiAlVl0gb3ZlcmxhcHMgc2VjdGlvbiAlcyBbJVYgLT4gJVZdXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjQwOAotbXNnaWQgIiVQJVg6IEludGVybmFsIGVycm9yIG9uIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0NDkKLW1zZ2lkICIlUDogd2FybmluZzogbm8gbWVtb3J5IHJlZ2lvbiBzcGVjaWZpZWQgZm9yIHNlY3Rpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0NjIKLW1zZ2lkICIlUDogd2FybmluZzogY2hhbmdpbmcgc3RhcnQgb2Ygc2VjdGlvbiAlcyBieSAldSBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0NzYKLW1zZ2lkICIlRiVTOiBub24gY29uc3RhbnQgYWRkcmVzcyBleHByZXNzaW9uIGZvciBzZWN0aW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjUyOAotbXNnaWQgIiVYJVA6IGFkZHJlc3MgMHgldiBvZiAlQiBzZWN0aW9uICVzIGlzIG5vdCB3aXRoaW4gcmVnaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjUzNgotbXNnaWQgIiVYJVA6IHJlZ2lvbiAlcyBpcyBmdWxsICglQiBzZWN0aW9uICVzKVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI2MzgKLW1zZ2lkICIlUCVGOiBjYW4ndCByZWxheCBzZWN0aW9uOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI3OTkKLW1zZ2lkICIlRiVQOiBpbnZhbGlkIGRhdGEgc3RhdGVtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjgyOAotbXNnaWQgIiVGJVA6IGludmFsaWQgcmVsb2Mgc3RhdGVtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjk2MgotbXNnaWQgIiVQJUY6JXM6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjk3NSBsZGxhbmcuYzoyOTkyCi1tc2dpZCAiJVAlRjogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyOTg3Ci1tc2dpZCAiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgZGVmYXVsdGluZyB0byAlVlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI5OTcKLW1zZ2lkICIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBub3Qgc2V0dGluZyBzdGFydCBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzAzOQotbXNnaWQgIiIKLSIlUDogd2FybmluZzogJXMgYXJjaGl0ZWN0dXJlIG9mIGlucHV0IGZpbGUgYCVCJyBpcyBpbmNvbXBhdGlibGUgd2l0aCAlcyAiCi0ib3V0cHV0XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzA1NwotbXNnaWQgIiVFJVg6IGZhaWxlZCB0byBtZXJnZSB0YXJnZXQgc3BlY2lmaWMgZGF0YSBvZiBmaWxlICVCXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzE0MgotbXNnaWQgIiIKLSJcbiIKLSJBbGxvY2F0aW5nIGNvbW1vbiBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzE0MwotbXNnaWQgIiIKLSJDb21tb24gc3ltYm9sICAgICAgIHNpemUgICAgICAgICAgICAgIGZpbGVcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIG1lc3NhZ2UgaGFwcGVucyB3aGVuIHVzaW5nIHRoZQotIy4gc3ZyMy5pZmlsZSBsaW5rZXIgc2NyaXB0LCBzbyBJIGhhdmUKLSMuIGRpc2FibGVkIGl0LgotIzogbGRsYW5nLmM6MzIzMgotbXNnaWQgIiVQOiBubyBbQ09NTU9OXSBjb21tYW5kLCBkZWZhdWx0aW5nIHRvIC5ic3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMjk1Ci1tc2dpZCAiJVAlRjogaW52YWxpZCBzeW50YXggaW4gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozODkxCi1tc2dpZCAiJVAlRm11bHRpcGxlIFNUQVJUVVAgZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0MTUzCi1tc2dpZCAiJUYlUDogYmZkX3JlY29yZF9waGRyIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0MTcyCi1tc2dpZCAiJVglUDogc2VjdGlvbiBgJXMnIGFzc2lnbmVkIHRvIG5vbi1leGlzdGVudCBwaGRyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NDcxCi1tc2dpZCAiJVglUDogdW5rbm93biBsYW5ndWFnZSBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTIwCi1tc2dpZCAiJVglUDogZHVwbGljYXRlIHZlcnNpb24gdGFnIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTMzIGxkbGFuZy5jOjQ1NDYKLW1zZ2lkICIlWCVQOiBkdXBsaWNhdGUgZXhwcmVzc2lvbiBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTgzCi1tc2dpZCAiJVglUDogdW5hYmxlIHRvIGZpbmQgdmVyc2lvbiBkZXBlbmRlbmN5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NjA1Ci1tc2dpZCAiJVglUDogdW5hYmxlIHRvIHJlYWQgLmV4cG9ydHMgc2VjdGlvbiBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxOTIKLW1zZ2lkICIlWCVQOiBjYW4ndCBzZXQgQkZEIGRlZmF1bHQgdGFyZ2V0IHRvIGAlcyc6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjU4Ci1tc2dpZCAiJVAlRjogLXIgYW5kIC0tbXBjODYwYzAgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjYwCi1tc2dpZCAiJVAlRjogLS1yZWxheCBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjYyCi1tc2dpZCAiJVAlRjogLXIgYW5kIC1zaGFyZWQgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjkxCi1tc2dpZCAidXNpbmcgaW50ZXJuYWwgbGlua2VyIHNjcmlwdDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozMTAKLW1zZ2lkICIlUCVGOiBubyBpbnB1dCBmaWxlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjMxNQotbXNnaWQgIiVQOiBtb2RlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MzMzCi1tc2dpZCAiJVAlRjogY2Fubm90IG9wZW4gbWFwIGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6Mzc5Ci1tc2dpZCAiJVA6IGxpbmsgZXJyb3JzIGZvdW5kLCBkZWxldGluZyBleGVjdXRhYmxlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozOTAKLW1zZ2lkICIlRiVCOiBmaW5hbCBjbG9zZSBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDE0Ci1tc2dpZCAiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIHNvdXJjZSBvZiBjb3B5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0MTYKLW1zZ2lkICIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3IgZGVzdGluYXRpb24gb2YgY29weSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDIyCi1tc2dpZCAiJVA6IEVycm9yIHdyaXRpbmcgZmlsZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDI4IHBlLWRsbC5jOjk4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlUDogRXJyb3IgY2xvc2luZyBmaWxlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHRvdGFsIHRpbWUgaW4gbGluazogJWxkLiUwNmxkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDg5Ci1tc2dpZCAiJVAlRjogbWlzc2luZyBhcmd1bWVudCB0byAtbVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjYwMyBsZG1haW4uYzo2MjQgbGRtYWluLmM6NjU1Ci1tc2dpZCAiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjA4IGxkbWFpbi5jOjYyNwotbXNnaWQgIiVQJUY6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjQyCi1tc2dpZCAiJVglUDogZXJyb3I6IGR1cGxpY2F0ZSByZXRhaW4tc3ltYm9scy1maWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6Njg2Ci1tc2dpZCAiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZvciBpbnNlcnRpb24gZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjY5MQotbXNnaWQgIiVQOiBgLXJldGFpbi1zeW1ib2xzLWZpbGUnIG92ZXJyaWRlcyBgLXMnIGFuZCBgLVMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NzY4Ci1tc2dpZCAiQXJjaGl2ZSBtZW1iZXIgaW5jbHVkZWQiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NzY5Ci1tc2dpZCAiYmVjYXVzZSBvZiBmaWxlIChzeW1ib2wpIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg0MQotbXNnaWQgIiVYJUM6IG11bHRpcGxlIGRlZmluaXRpb24gb2YgYCVUJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg0NAotbXNnaWQgIiVEOiBmaXJzdCBkZWZpbmVkIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4NzMKLW1zZ2lkICIlQjogd2FybmluZzogZGVmaW5pdGlvbiBvZiBgJVQnIG92ZXJyaWRpbmcgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODc2Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBpcyBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODgzCi1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRkZW4gYnkgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg4NgotbXNnaWQgIiVCOiB3YXJuaW5nOiBkZWZpbmVkIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4OTMKLW1zZ2lkICIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBsYXJnZXIgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODk2Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IGxhcmdlciBjb21tb24gaXMgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkwMAotbXNnaWQgIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTAzCi1tc2dpZCAiJUI6IHdhcm5pbmc6IHNtYWxsZXIgY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MDcKLW1zZ2lkICIlQjogd2FybmluZzogbXVsdGlwbGUgY29tbW9uIG9mIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MDkKLW1zZ2lkICIlQjogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MzEgbGRtYWluLmM6OTcwCi1tc2dpZCAiJVA6IHdhcm5pbmc6IGdsb2JhbCBjb25zdHJ1Y3RvciAlcyB1c2VkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTgwCi1tc2dpZCAiJVAlRjogQkZEIGJhY2tlbmQgZXJyb3I6IEJGRF9SRUxPQ19DVE9SIHVuc3VwcG9ydGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE2NgotbXNnaWQgIiVGJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExNzMKLW1zZ2lkICIlRiVQOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExOTIKLW1zZ2lkICIlWCVDOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMTk1Ci1tc2dpZCAiJUQ6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjAxCi1tc2dpZCAiJVglQjogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIwNAotbXNnaWQgIiVCOiBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzIHRvIGAlVCcgZm9sbG93XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIyNSBsZG1haW4uYzoxMjQ3IGxkbWFpbi5jOjEyNjcKLW1zZ2lkICIlUCVYOiBnZW5lcmF0ZWQiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIyOAotbXNnaWQgIiByZWxvY2F0aW9uIHRydW5jYXRlZCB0byBmaXQ6ICVzICVUIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGFuZ2Vyb3VzIHJlbG9jYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTI3MAotbXNnaWQgIiByZWxvYyByZWZlcnMgdG8gc3ltYm9sIGAlVCcgd2hpY2ggaXMgbm90IGJlaW5nIG91dHB1dFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjE3OAotbXNnaWQgIm5vIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzoyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYnVpbHQgaW4gbGlua2VyIHNjcmlwdDoldSIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzoyOTIgbGRtaXNjLmM6Mjk2Ci1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSMuIFdlIHVzZSBhYmZkLT5maWxlbmFtZSBpbiB0aGlzIGluaXRpYWwgbGluZSwKLSMuIGluIGNhc2UgZmlsZW5hbWUgaXMgYSAuaCBmaWxlIG9yIHNvbWV0aGluZwotIy4gc2ltaWxhcmx5IHVuaGVscGZ1bC4KLSM6IGxkbWlzYy5jOjMzMgotbXNnaWQgIiVCOiBJbiBmdW5jdGlvbiBgJVQnOlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjQ2NAotbXNnaWQgIiVGJVA6IGludGVybmFsIGVycm9yICVzICVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGR2ZXIuYzozNQotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgbGQgdmVyc2lvbiAlcyAod2l0aCBCRkQgJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogbGR2ZXIuYzo0MiBsZXhzdXAuYzo4NzIKLW1zZ2lkICIgIFN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzo1OSBsZHdyaXRlLmM6MTk1Ci1tc2dpZCAiJVAlRjogYmZkX25ld19saW5rX29yZGVyIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzozNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTh4IHNvbWV0aGluZyBlbHNlXG4iCi1tc2dzdHIgIiIKLQotIzogbGR3cml0ZS5jOjUyNgotbXNnaWQgIiVGJVA6IGZpbmFsIGxpbmsgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1MiBsZXhzdXAuYzoyMzUgbGV4c3VwLmM6MjQxCi1tc2dpZCAiS0VZV09SRCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTIKLW1zZ2lkICJTaGFyZWQgbGlicmFyeSBjb250cm9sIGZvciBIUC9VWCBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1NQotbXNnaWQgIkFSQ0giCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU1Ci1tc2dpZCAiU2V0IGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTcgbGV4c3VwLmM6MzAwCi1tc2dpZCAiVEFSR0VUIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1NwotbXNnaWQgIlNwZWNpZnkgdGFyZ2V0IGZvciBmb2xsb3dpbmcgaW5wdXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU5IGxleHN1cC5jOjE5OCBsZXhzdXAuYzoyMDggbGV4c3VwLmM6MjE3IGxleHN1cC5jOjI4NAotIzogbGV4c3VwLmM6MzA3IGxleHN1cC5jOjM0MQotbXNnaWQgIkZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU5Ci1tc2dpZCAiUmVhZCBNUkkgZm9ybWF0IGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTYxCi1tc2dpZCAiRm9yY2UgY29tbW9uIHN5bWJvbHMgdG8gYmUgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjUgbGV4c3VwLmM6MzMxIGxleHN1cC5jOjMzMyBsZXhzdXAuYzozMzUKLW1zZ2lkICJBRERSRVNTIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2NQotbXNnaWQgIlNldCBzdGFydCBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2NwotbXNnaWQgIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2OQotbXNnaWQgIkxpbmsgYmlnLWVuZGlhbiBvYmplY3RzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3MQotbXNnaWQgIkxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3MyBsZXhzdXAuYzoxNzYKLW1zZ2lkICJTSExJQiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzMKLW1zZ2lkICJBdXhpbGlhcnkgZmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzYKLW1zZ2lkICJGaWx0ZXIgZm9yIHNoYXJlZCBvYmplY3Qgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3OAotbXNnaWQgIklnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTgwCi1tc2dpZCAiU0laRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODAKLW1zZ2lkICJTbWFsbCBkYXRhIHNpemUgKGlmIG5vIHNpemUsIHNhbWUgYXMgLS1zaGFyZWQpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MwotbXNnaWQgIkZJTEVOQU1FIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MwotbXNnaWQgIlNldCBpbnRlcm5hbCBuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4NQotbXNnaWQgIkxJQk5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg1Ci1tc2dpZCAiU2VhcmNoIGZvciBsaWJyYXJ5IExJQk5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg3Ci1tc2dpZCAiRElSRUNUT1JZIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4NwotbXNnaWQgIkFkZCBESVJFQ1RPUlkgdG8gbGlicmFyeSBzZWFyY2ggcGF0aCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODkKLW1zZ2lkICJFTVVMQVRJT04iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg5Ci1tc2dpZCAiU2V0IGVtdWxhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTEKLW1zZ2lkICJQcmludCBtYXAgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTkzCi1tc2dpZCAiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTUKLW1zZ2lkICJEbyBub3QgcGFnZSBhbGlnbiBkYXRhLCBkbyBub3QgbWFrZSB0ZXh0IHJlYWRvbmx5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5OAotbXNnaWQgIlNldCBvdXRwdXQgZmlsZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwMAotbXNnaWQgIk9wdGltaXplIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwMgotbXNnaWQgIklnbm9yZWQgZm9yIFNWUjQgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMDQKLW1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0ZWFibGUgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwOAotbXNnaWQgIkp1c3QgbGluayBzeW1ib2xzIChpZiBkaXJlY3RvcnksIHNhbWUgYXMgLS1ycGF0aCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjExCi1tc2dpZCAiU3RyaXAgYWxsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjEzCi1tc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE1Ci1tc2dpZCAiVHJhY2UgZmlsZSBvcGVucyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTcKLW1zZ2lkICJSZWFkIGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE5IGxleHN1cC5jOjIzMSBsZXhzdXAuYzozMjcgbGV4c3VwLmM6MzQ0IGxleHN1cC5jOjM2MQotbXNnaWQgIlNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTkKLW1zZ2lkICJTdGFydCB3aXRoIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyMQotbXNnaWQgIkJ1aWxkIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRhYmxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjMKLW1zZ2lkICJQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyNQotbXNnaWQgIlByaW50IHZlcnNpb24gYW5kIGVtdWxhdGlvbiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjcKLW1zZ2lkICJEaXNjYXJkIGFsbCBsb2NhbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyOQotbXNnaWQgIkRpc2NhcmQgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjMxCi1tc2dpZCAiVHJhY2UgbWVudGlvbnMgb2YgU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzMyBsZXhzdXAuYzozMDkgbGV4c3VwLmM6MzExCi1tc2dpZCAiUEFUSCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzMKLW1zZ2lkICJEZWZhdWx0IHNlYXJjaCBwYXRoIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM1Ci1tc2dpZCAiSWdub3JlZCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzNwotbXNnaWQgIlN0YXJ0IGEgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM5Ci1tc2dpZCAiRW5kIGEgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjQxCi1tc2dpZCAiSWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNDMKLW1zZ2lkICJMaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNDkKLW1zZ2lkICJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjU3Ci1tc2dpZCAiQmluZCBnbG9iYWwgcmVmZXJlbmNlcyBsb2NhbGx5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI1OQotbXNnaWQgIkNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyAoZGVmYXVsdCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjYxCi1tc2dpZCAiRG8gbm90IGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjQKLW1zZ2lkICJPdXRwdXQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2NgotbXNnaWQgIlNZTUJPTD1FWFBSRVNTSU9OIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2NgotbXNnaWQgIkRlZmluZSBhIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjgKLW1zZ2lkICJEZW1hbmdsZSBzeW1ib2wgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjcwCi1tc2dpZCAiUFJPR1JBTSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzAKLW1zZ2lkICJTZXQgdGhlIGR5bmFtaWMgbGlua2VyIHRvIHVzZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzIKLW1zZ2lkICJHZW5lcmF0ZSBlbWJlZGRlZCByZWxvY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjc0Ci1tc2dpZCAiRm9yY2UgZ2VuZXJhdGlvbiBvZiBmaWxlIHdpdGggLmV4ZSBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjc2Ci1tc2dpZCAiUmVtb3ZlIHVudXNlZCBzZWN0aW9ucyAob24gc29tZSB0YXJnZXRzKSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzkKLW1zZ2lkICJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zIChkZWZhdWx0KSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODIKLW1zZ2lkICJQcmludCBvcHRpb24gaGVscCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODQKLW1zZ2lkICJXcml0ZSBhIG1hcCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI4NgotbXNnaWQgIkRvIG5vdCBkZW1hbmdsZSBzeW1ib2wgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjg4Ci1tc2dpZCAiVXNlIGxlc3MgbWVtb3J5IGFuZCBtb3JlIGRpc2sgSS9PIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5MAotbXNnaWQgIkFsbG93IG5vIHVuZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5MgotbXNnaWQgIkRvbid0IHdhcm4gYWJvdXQgbWlzbWF0Y2hlZCBpbnB1dCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyOTQKLW1zZ2lkICJUdXJuIG9mZiAtLXdob2xlLWFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjk2Ci1tc2dpZCAiQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGV2ZW4gaWYgZXJyb3JzIG9jY3VyIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwMAotbXNnaWQgIlNwZWNpZnkgdGFyZ2V0IG9mIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwMgotbXNnaWQgIklnbm9yZWQgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzA0Ci1tc2dpZCAiUmVsYXggYnJhbmNoZXMgb24gY2VydGFpbiB0YXJnZXRzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwNwotbXNnaWQgIktlZXAgb25seSBzeW1ib2xzIGxpc3RlZCBpbiBGSUxFIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwOQotbXNnaWQgIlNldCBydW50aW1lIHNoYXJlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxMQotbXNnaWQgIlNldCBsaW5rIHRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzEzCi1tc2dpZCAiQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzE3Ci1tc2dpZCAiU29ydCBjb21tb24gc3ltYm9scyBieSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyMQotbXNnaWQgIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBmb3IgZWFjaCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyMwotbXNnaWQgIkNPVU5UIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyMwotbXNnaWQgIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBldmVyeSBDT1VOVCByZWxvY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzI1Ci1tc2dpZCAiUHJpbnQgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzI3Ci1tc2dpZCAiRG8gdGFzayBsZXZlbCBsaW5raW5nIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyOQotbXNnaWQgIlVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgbGlua2VyIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMzMQotbXNnaWQgIlNldCBhZGRyZXNzIG9mIC5ic3Mgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzMKLW1zZ2lkICJTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMzNQotbXNnaWQgIlNldCBhZGRyZXNzIG9mIC50ZXh0IHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzM3Ci1tc2dpZCAiT3V0cHV0IGxvdHMgb2YgaW5mb3JtYXRpb24gZHVyaW5nIGxpbmsiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzQxCi1tc2dpZCAiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHNjcmlwdCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNDQKLW1zZ2lkICIiCi0iVGFrZSBleHBvcnQgc3ltYm9scyBsaXN0IGZyb20gLmV4cG9ydHMsIHVzaW5nXG4iCi0iXHRcdFx0XHRTWU1CT0wgYXMgdGhlIHZlcnNpb24uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0NwotbXNnaWQgIldhcm4gYWJvdXQgZHVwbGljYXRlIGNvbW1vbiBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0OQotbXNnaWQgIldhcm4gaWYgZ2xvYmFsIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBhcmUgc2VlbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTIKLW1zZ2lkICJXYXJuIGlmIHRoZSBtdWx0aXBsZSBHUCB2YWx1ZXMgYXJlIHVzZWQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzU0Ci1tc2dpZCAiV2FybiBvbmx5IG9uY2UgcGVyIHVuZGVmaW5lZCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzU2Ci1tc2dpZCAiV2FybiBpZiBzdGFydCBvZiBzZWN0aW9uIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTkKLW1zZ2lkICJJbmNsdWRlIGFsbCBvYmplY3RzIGZyb20gZm9sbG93aW5nIGFyY2hpdmVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM2MQotbXNnaWQgIlVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM2MwotbXNnaWQgIls9V09SRFNdIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM2MwotbXNnaWQgIiIKLSJNb2RpZnkgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gbGFzdCBXT1JEUyAoMS0xMCxcbiIKLSJcdFx0XHRcdGRlZmF1bHQgNSkgd29yZHMgb2YgYSBwYWdlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjUyNQotbXNnaWQgIiVQJUY6IHVucmVjb2duaXplZCAtYSBvcHRpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjUzOAotbXNnaWQgIiVQJUY6IHVucmVjb2duaXplZCAtYXNzZXJ0IG9wdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6NjI5Ci1tc2dpZCAiJVAlRjogaW52YWxpZCBudW1iZXIgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjgwMQotbXNnaWQgIiVQJUY6IC1zaGFyZWQgbm90IHN1cHBvcnRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjg2NQotbXNnaWQgIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjg2NgotbXNnaWQgIiIKLSJUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG4iCi0idGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjk1NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbWF5IG5vdCBuZXN0IGdyb3VwcyAoLS1oZWxwIGZvciB1c2FnZSlcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo5NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGdyb3VwIGVuZGVkIGJlZm9yZSBpdCBiZWdhbiAoLS1oZWxwIGZvciB1c2FnZSlcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo5ODQKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IHRvIG9wdGlvbiBcIm1wYzg2MGMwXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDMxCi1tc2dpZCAiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbb3B0aW9uc10gZmlsZS4uLlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjEwNDUKLW1zZ2lkICJPcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjExMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czpcbiIKLSIgICIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogc3VwcG9ydGVkIGVtdWxhdGlvbnM6XG4iCi0iICAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTEzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTEzOQotbXNnaWQgIiIKLSJcbiIKLSJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBtcmkuYzozNDIKLW1zZ2lkICIlUCVGOiB1bmtub3duIGZvcm1hdCB0eXBlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6MTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYVW5zdXBwb3J0ZWQgUEVJIGFyY2hpdGVjdHVyZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzozNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMgKCVkIHZzICVkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjM1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nLCBkdXBsaWNhdGUgRVhQT1JUOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjQwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjQxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCB3cm9uZyB0eXBlICglZCB2cyAlZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo0MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGZvdW5kXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6NTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVYRXJyb3IsIG9yaWRpbmFsIHVzZWQgdHdpY2U6ICVkICglcyB2cyAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo3MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhFcnJvcjogJWQtYml0IHJlbG9jIGluIGRsbFxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjg1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZGVmIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo5NzYKLW1zZ2lkICI7IG5vIGNvbnRlbnRzIGF2YWlsYWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjE0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW4ndCBvcGVuIC5saWIgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzoxNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvUkVBRE1FIGIvbGQvc2NyaXB0dGVtcGwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmFkMmU5Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSBsaW5rZXIgc2NyaXB0IHRlbXBsYXRlcy4KLWdlbnNjcmlwdHMuc2ggc2V0cyBzb21lIHNoZWxsIHZhcmlhYmxlcywgdGhlbiBzb3VyY2VzCi1FTVVMQVRJT04uc2MsIHRvIGdlbmVyYXRlIEVNVUxBVElPTi57eCx4cix4dSx4bix4Ym59IC0tIHRoZSBzY3JpcHQKLWZpbGVzIGZvciBkZWZhdWx0LCAtciwgLVVyLCAtbiwgLU4uCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hMjlrLnNjIGIvbGQvc2NyaXB0dGVtcGwvYTI5ay5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyNWIxZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hMjlrLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1TRUNUSU9OUwotewotICAudGV4dCA6IHsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgX19ldGV4dCAgPSAgLn07Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKigubGl0KQotICAgICooLnNoZGF0YSkKLSAgfQotICAuc2hic3MgU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpIDoJewotICAgICooLnNoYnNzKQotICB9IAotICAuZGF0YSAgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9fZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgICBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSkgOgotICB7IAkJCQkJCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IEFMSUdOKDB4OCl9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FpeC5zYyBiL2xkL3NjcmlwdHRlbXBsL2FpeC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0YjYxNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9haXguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIEFJWCBsaW5rZXIgc2NyaXB0LgotIyBBSVggYWx3YXlzIHVzZXMgc2hhcmVkIGxpYnJhcmllcy4gIFRoZSBzZWN0aW9uIFZNQSBhcHBlYXJzIHRvIGJlCi0jIHVuaW1wb3J0YW50LiAgVGhlIG5hdGl2ZSBsaW5rZXIgYWxpZ25zIHRoZSBzZWN0aW9ucyBvbiBib3VuZGFyaWVzCi0jIHNwZWNpZmllZCBieSB0aGUgLUggb3B0aW9uLgotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotRU5UUlkoX19zdGFydCkKLVNFQ1RJT05TCi17Ci0gIC5wYWQgMCA6IHsgKigucGFkKSB9Ci0gIC50ZXh0ICR7UkVMT0NBVElORy0wfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX3RleHQgPSAuKTt9Ci0gICAgKigudGV4dCkKLSAgICAqKC5wcikKLSAgICAqKC5ybykKLSAgICAqKC5kYikKLSAgICAqKC5nbCkKLSAgICAqKC54bykKLSAgICAqKC50aSkKLSAgICAqKC50YikKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2V0ZXh0ID0gLik7fQotICB9Ci0gIC5kYXRhIDAgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9kYXRhID0gLik7fQotICAgICooLmRhdGEpCi0gICAgKigucncpCi0gICAgKiguc3YpCi0gICAgKigudWEpCi0gICAgLiA9IEFMSUdOKDQpOwotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAqKC5kcykKLSAgICAqKC50YzApCi0gICAgKigudGMpCi0gICAgKigudGQpCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9lZGF0YSA9IC4pO30KLSAgfQotICAuYnNzIDogewotICAgICooLnRvY2JzcykKLSAgICAqKC5ic3MpCi0gICAgKiguYnMpCi0gICAgKigudWMpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9lbmQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLSAgfQotICAubG9hZGVyIDAgOiB7Ci0gICAgKigubG9hZGVyKQotICB9Ci0gIC5kZWJ1ZyAwIDogewotICAgICooLmRlYnVnKQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FscGhhLnNjIGIvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTEwYzQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIEFscGhhIHN5c3RlbXMuCi0jIElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLSMgVGhlc2UgdmFyaWFibGVzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBlbXVsYXRpb24gZmlsZS4gIFRoZQotIyBkZWZhdWx0cyBhcmUgYXBwcm9wcmlhdGUgZm9yIGFuIEFscGhhIHJ1bm5pbmcgT1NGLzEuCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9fc3RhcnQKLXRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHgxMjAwMDAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKLWlmIHRlc3QgIngkTERfRkxBRyIgPSAieG4iIC1vICJ4JExEX0ZMQUciID0gInhOIjsgdGhlbgotICBEQVRBX0FERFI9LgotZWxzZQotICB0ZXN0IC16ICIkREFUQV9BRERSIiAmJiBEQVRBX0FERFI9MHgxNDAwMDAwMDAKLWZpCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDogewotICAgICR7UkVMT0NBVElORysgX2Z0ZXh0ID0gLiB9OwotICAgICR7UkVMT0NBVElORysgX19pc3RhcnQgPSAuIH07Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KSB9Ci0gICAgJHtSRUxPQ0FUSU5HKyBMT05HICgweDZiZmE4MDAxKX0KLSAgICAke1JFTE9DQVRJTkcrIGVwcm9sICA9ICAufTsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgX19mc3RhcnQgPSAuIH07Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAke1JFTE9DQVRJTkcrIExPTkcgKDB4NmJmYTgwMDEpfQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ICA9ICAufTsKLSAgfQotICAucmRhdGEgOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgLnJjb25zdCA6IHsKLSAgICAqKC5yY29uc3QpCi0gIH0KLSAgLnBkYXRhIDogewotICAgICR7UkVMT0NBVElORysgX2ZwZGF0YSA9IC47fQotICAgICooLnBkYXRhKQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9O30KLSAgLmRhdGEgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZmRhdGEgPSAuO30KLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAueGRhdGEgOiB7Ci0gICAgKigueGRhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZ3AgPSBBTElHTiAoMTYpICsgMHg4MDAwO30KLSAgLmxpdDggOiB7Ci0gICAgKigubGl0OCkKLSAgfQotICAubGl0YSA6IHsKLSAgICAqKC5saXRhKQotICB9Ci0gIC5zZGF0YSA6IHsKLSAgICAqKC5zZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIF9FREFUQSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORysgX0ZCU1MgPSAuO30KLSAgLnNic3MgOiB7Ci0gICAgKiguc2JzcykKLSAgICAqKC5zY29tbW9uKQotICB9Ci0gIC5ic3MgOiB7Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvYW91dC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkYmIzNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hb3V0LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0FMSUdOTUVOVH0iICYmIEFMSUdOTUVOVD0iNCIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotJHtTSExJQl9QQVRIKyR7UkVMT0NBVElORyske1NITElCX1BBVEh9fX0KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19zdGFjayA9IDApO30KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKLSAgICAgICBpcyBpbXBvcnRhbnQuICAqLwotICAgICooLmR5bnJlbCkKLSAgICAqKC5oYXNoKQotICAgICooLmR5bnN5bSkKLSAgICAqKC5keW5zdHIpCi0gICAgKigucnVsZXMpCi0gICAgKigubmVlZCkKLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgICAqKC5keW5hbWljKQotICAgICooLmdvdCkKLSAgICAqKC5wbHQpCi0gICAgKiguZGF0YSkKLSAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9Ci0gICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IC4gfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvYXJtYW91dC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyNzZhOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgJHtSRUxPQ0FUSU5HK19fc3RleHRfID0gLjt9Ci0gICAgKigudGV4dCkKLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORyske0RBVEFfQUxJR05NRU5UfX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fc2RhdGFfID0gLjt9Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiAoLmRhdGEpfSA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvYXJtY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwNzE2OS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBBUk0gQ09GRi4KLSMgQmFzZWQgb24gaTM4NmNvZmYuc2MgYnkgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWlmIHRlc3QgLXogIiR7REFUQV9BRERSfSI7IHRoZW4KLSAgaWYgdGVzdCAiJExEX0ZMQUciID0gIk4iIHx8IHRlc3QgIiRMRF9GTEFHIiA9ICJuIjsgdGhlbgotICAgIERBVEFfQUREUj0uCi0gIGZpCi1maQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLyogV2Ugc3RhcnQgYXQgMHg4MDAwIGJlY2F1c2UgZ2RiIGFzc3VtZXMgaXQgKHNlZSBGUkFNRV9DSEFJTikuCi0gICAgIFRoaXMgaXMgYW4gYXJ0aWZhY3Qgb2YgdGhlIEFSTSBEZW1vbiBtb25pdG9yIHVzaW5nIHRoZSBib3R0b20gMzJrCi0gICAgIGFzIHdvcmtzcGFjZSAoc2hhcmVkIHdpdGggdGhlIEZQIGluc3RydWN0aW9uIGVtdWxhdG9yIGlmCi0gICAgIHByZXNlbnQpOiAqLwotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4ODAwMH0gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICooLmdsdWVfN3QpCi0gICAgKiguZ2x1ZV83KQotICAgICooLnJkYXRhKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrJHtEQVRBX0FERFItMHg0MDAwMCArICguICYgMHhmZmZjMGZmZil9fSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICBfX2RhdGFfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9fID0gLjt9Ci0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjIGIvbGQvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NjMwNS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWShfc3RhcnQpCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4MjAwMCArIFNJWkVPRl9IRUFERVJTfSA6Ci0gICAgewotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZXh0LnN0YXJ0ID0gLn07Ci0gICAgICAqKC50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLjt9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHQuZW5kID0gLn07Ci0gICAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQotICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KLSAgICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpICsgMHg0MDAwMDB9IDoKLSAgICB7Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmRhdGEuc3RhcnQgPSAufTsKLSAgICAgICooLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgICAgICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAufTsKLSAgICAgICR7UkVMT0NBVElORysgX18uZGF0YS5lbmQgPSAufTsKLSAgICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgICB7IAkJCQkJCi0gICAgICAke1JFTE9DQVRJTkcrIF9fLmJzcy5zdGFydCA9IC59OwotICAgICAgKiguYnNzKQotICAgICAgKihDT01NT04pCi0gICAgICAke1JFTE9DQVRJTkcrIF9fLmJzcy5lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgZW5kID0gQUxJR04oMHg4KX07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSBBTElHTigweDgpfTsKLSAgICB9Ci0gIC5jb21tZW50ICR7UkVMT0NBVElORysgMH0gOgotICAgIHsKLSAgICAgICooLmNvbW1lbnQpCi0gICAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYyBiL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA1MGVlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLUVOVFJZKHN0YXJ0KQotCi1TRUNUSU9OUyB7Ci0gIC50ZXh0ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDogCi0gICAgewotCSooLnRleHQpOwotCSR7UkVMT0NBVElORytfZXRleHQgPSAufTsKLSAgICB9Ci0gIGRhdGEgJHtSRUxPQ0FUSU5HKzB4ODAwMDIwMDB9IDoKLSAgICB7Ci0JKiguZGF0YSk7Ci0JKigubXN0YWNrKTsgCi0JKiguc2hic3MpOwotCSooLnJzdGFjayk7Ci0JKigubXN0YWNrKTsKLQkke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgfQotICAuYnNzICAuIDoKLSAgICB7IAotCSooQ09NTU9OKSAJCi0JKiguYnNzKTsKLQkke1JFTE9DQVRJTkcrX2VuZCA9IC59OwotICAgIH0gCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2VsZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiNGFjNi4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TIC0gYXQgc3RhcnQgb2YgdGV4dCBzZWdtZW50Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1RFWFRfU0VDVElPTlMgLSB0aGVzZSBnZXQgcHV0IGluIC50ZXh0IHdoZW4gcmVsb2NhdGluZwotIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLmN0b3JzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCi0jCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCi0jCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQotIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS50ZXh0IHNlY3Rpb24uCi0jCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmRhdGEgc2VjdGlvbi4KLSMJT1RIRVJfR09UX1NZTUJPTFMgLSBzeW1ib2xzIGRlZmluZWQganVzdCBiZWZvcmUgLmdvdC4KLSMJT1RIRVJfR09UX1NFQ1RJT05TIC0gc2VjdGlvbnMganVzdCBhZnRlciAuZ290IGFuZCAuc2RhdGEuCi0jCU9USEVSX0JTU19TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuYnNzIHNlY3Rpb24gYmVzaWRlcyBfX2Jzc19zdGFydC4KLSMJREFUQV9QTFQgLSAucGx0IHNob3VsZCBiZSBpbiBkYXRhIHNlZ21lbnQsIG5vdCB0ZXh0IHNlZ21lbnQuCi0jCVRFWFRfRFlOQU1JQyAtIC5keW5hbWljIGluIHRleHQgc2VnbWVudCwgbm90IGRhdGEgc2VnbWVudC4KLSMJRU1CRURERUQgLSB3aGV0aGVyIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gCi0jCVNITElCX1RFWFRfU1RBUlRfQUREUiAtIGlmIHNldCwgYWRkIHRvIFNJWkVPRl9IRUFERVJTIHRvIHNldAotIwkJc3RhcnQgYWRkcmVzcyBvZiBzaGFyZWQgbGlicmFyeS4KLSMJSU5QVVRfRklMRVMgLSBJTlBVVCBjb21tYW5kIG9mIGZpbGVzIHRvIGFsd2F5cyBpbmNsdWRlCi0jCVdSSVRBQkxFX1JPREFUQSAtIGlmIHNldCwgdGhlIC5yb2RhdGEgc2VjdGlvbiBzaG91bGQgYmUgd3JpdGFibGUKLSMKLSMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAotIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCi0jCi0KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWlmIFsgLXogIiRNQUNISU5FIiBdOyB0aGVuIE9VVFBVVF9BUkNIPSR7QVJDSH07IGVsc2UgT1VUUFVUX0FSQ0g9JHtBUkNIfToke01BQ0hJTkV9OyBmaQotdGVzdCAteiAiJHtFTEZTSVpFfSIgJiYgRUxGU0laRT0zMgotdGVzdCAteiAiJHtBTElHTk1FTlR9IiAmJiBBTElHTk1FTlQ9IiR7RUxGU0laRX0gLyA4IgotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1JTlRFUlA9Ii5pbnRlcnAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmludGVycCkgCX0iCi1QTFQ9Ii5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpCX0iCi1EWU5BTUlDPSIuZHluYW1pYyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5hbWljKSB9IgotUk9EQVRBPSIucm9kYXRhICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfSAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnIqKX0gfSIKLUNUT1I9Ii5jdG9ycyAke0NPTlNUUlVDVElORy0wfSA6IAotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX1NUQVJUfX0KLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCi0gICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCi0gICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAotICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKLSAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubwotICAgICAgIGlzIGluLiAgKi8KLQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0KLSAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQotICAgICAgIGZyb20gdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KLSAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKLSAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KLQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9FTkR9fQotICB9IgotCi1EVE9SPSIgLmR0b3JzICAgICAgICR7Q09OU1RSVUNUSU5HLTB9IDoKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9TVEFSVH19Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfRU5EfX0KLSAgfSIKLQotIyBpZiB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0sIGRvbid0IGFkZCBTSVpFT0ZfSEVBREVSUy4KLWlmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgotICAgdGVzdCAteiAiJHtURVhUX0JBU0VfQUREUkVTU30iICYmIFRFWFRfQkFTRV9BRERSRVNTPSIke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUyIKLWVsc2UKLSAgIHRlc3QgLXogIiR7VEVYVF9CQVNFX0FERFJFU1N9IiAmJiBURVhUX0JBU0VfQUREUkVTUz0iJHtURVhUX1NUQVJUX0FERFJ9IgotZmkKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtPVVRQVVRfQVJDSH0pCi1FTlRSWSgke0VOVFJZfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORyske0lOUFVUX0ZJTEVTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci0KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9CQVNFX0FERFJFU1N9O319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gJHtTSExJQl9URVhUX1NUQVJUX0FERFI6LTB9ICsgU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQotICAke0lOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlN9Ci0gICR7VEVYVF9EWU5BTUlDKyR7RFlOQU1JQ319Ci0gIC5oYXNoICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQotICAuZ251LnZlcnNpb24gJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbikJfQotICAuZ251LnZlcnNpb25fZCAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX2QpCX0KLSAgLmdudS52ZXJzaW9uX3IgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9yKQl9Ci0gIC5yZWwudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbC50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC50ZXh0LiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UudCopfQotICAgIH0KLSAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEudGV4dC4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS50Kil9Ci0gICAgfQotICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZ251LmxpbmtvbmNlLmQqKX0KLSAgICB9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmRhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuZCopfQotICAgIH0KLSAgLnJlbC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwucm9kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UuciopfQotICAgIH0KLSAgLnJlbGEucm9kYXRhICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS5yb2RhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5yb2RhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuciopfQotICAgIH0KLSAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuaW5pdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5pbml0KQl9Ci0gIC5yZWxhLmluaXQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuaW5pdCkJfQotICAucmVsLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZmluaSkJfQotICAucmVsYS5maW5pICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyBLRUVQICgqKC5pbml0KSkJfSA9JHtOT1AtMH0KLSAgJHtEQVRBX1BMVC0ke1BMVH19Ci0gIC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9Ci0gICAgKiguc3R1YikKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnQqKX0KLSAgICAke1JFTE9DQVRJTkcrJHtPVEhFUl9URVhUX1NFQ1RJT05TfX0KLSAgfSA9JHtOT1AtMH0KLSAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Ci0gIC5maW5pICAgICR7UkVMT0NBVElORy0wfSA6IHsgS0VFUCAoKiguZmluaSkpCQl9ID0ke05PUC0wfQotICAke1dSSVRBQkxFX1JPREFUQS0ke1JPREFUQX19Ci0gIC5yb2RhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFET05MWV9TRUNUSU9OU319Ci0KLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItQUxJR04oJHtNQVhQQUdFU0laRX0pICsgKC4gJiAoJHtNQVhQQUdFU0laRX0gLSAxKSl9O319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gJHtTSExJQl9EQVRBX0FERFItQUxJR04oJHtNQVhQQUdFU0laRX0pICsgKC4gJiAoJHtNQVhQQUdFU0laRX0gLSAxKSl9O319Ci0KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGEuKil9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5kKil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrU09SVChDT05TVFJVQ1RPUlMpfQotICB9Ci0gIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9Ci0gIC5laF9mcmFtZSA6IHsgKiguZWhfZnJhbWUpIH0KLSAgLmdjY19leGNlcHRfdGFibGUgOiB7ICooLmdjY19leGNlcHRfdGFibGUpIH0KLSAgJHtXUklUQUJMRV9ST0RBVEErJHtST0RBVEF9fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQotICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KLSAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0gICR7REFUQV9QTFQrJHtQTFR9fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9HT1RfU1lNQk9MU319Ci0gIC5nb3QgICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAke1RFWFRfRFlOQU1JQy0ke0RZTkFNSUN9fQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpICooLnNkYXRhLiopIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfR09UX1NFQ1RJT05TfX0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCi0gICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKLSAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KLSAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke0FMSUdOTUVOVH0pO30KLSAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIDt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19FTkRfU1lNQk9MU319Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotCi0gIC5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TfX0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyZWVmNC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLSMKLSMgVW51c3VhbCB2YXJpYWJsZXMgY2hlY2tlZCBieSB0aGlzIGNvZGU6Ci0jCU5PUCAtIHR3byBieXRlIG9wY29kZSBmb3Igbm8tb3AgKGRlZmF1bHRzIHRvIDApCi0jCURBVEFfQUREUiAtIGlmIGVuZC1vZi10ZXh0LXBsdXMtb25lLXBhZ2UgaXNuJ3QgcmlnaHQgZm9yIGRhdGEgc3RhcnQKLSMJT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgLSBvdGhlciB0aGFuIC50ZXh0IC5pbml0IC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5jdG9ycyAuc2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5nbG9iYWwpCi0jCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAotIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgotIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKLSMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkudGV4dCBzZWN0aW9uLgotIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5kYXRhIHNlY3Rpb24uCi0jCU9USEVSX0JTU19TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuYnNzIHNlY3Rpb24gYmVzaWRlcyBfX2Jzc19zdGFydC4KLSMJREFUQV9QTFQgLSAucGx0IHNob3VsZCBiZSBpbiBkYXRhIHNlZ21lbnQsIG5vdCB0ZXh0IHNlZ21lbnQuCi0jCUVNQkVEREVEIC0gd2hldGhlciB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uIAotIwotIyBXaGVuIGFkZGluZyBzZWN0aW9ucywgZG8gbm90ZSB0aGF0IHRoZSBuYW1lcyBvZiBzb21lIHNlY3Rpb25zIGFyZSB1c2VkCi0jIHdoZW4gc3BlY2lmeWluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dC4KLSMKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWlmIFsgLXogIiRNQUNISU5FIiBdOyB0aGVuIE9VVFBVVF9BUkNIPSR7QVJDSH07IGVsc2UgT1VUUFVUX0FSQ0g9JHtBUkNIfToke01BQ0hJTkV9OyBmaQotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1JTlRFUlA9Ii5pbnRlcnAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmludGVycCkgCX0iCi1QTFQ9Ii5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpCX0iCi0KLQotQ1RPUj0iLmN0b3JzICR7Q09OU1RSVUNUSU5HLTB9IDogCi0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfU1RBUlR9fQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX0VORH19Ci0gIH0iCi0KLURUT1I9IiAuZHRvcnMgICAgICAgJHtDT05TVFJVQ1RJTkctMH0gOgotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX1NUQVJUfX0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9FTkR9fQotICB9IgotCi0KLSMgaWYgdGhpcyBpcyBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLCBkb24ndCBhZGQgU0laRU9GX0hFQURFUlMuCi1pZiBbIC16ICIkRU1CRURERUQiIF07IHRoZW4KLSAgIHRlc3QgLXogIiR7UkVBRE9OTFlfQkFTRV9BRERSRVNTfSIgJiYgUkVBRE9OTFlfQkFTRV9BRERSRVNTPSIke1JFQURPTkxZX1NUQVJUX0FERFJ9ICsgU0laRU9GX0hFQURFUlMiCi1lbHNlCi0gICB0ZXN0IC16ICIke1JFQURPTkxZX0JBU0VfQUREUkVTU30iICYmIFJFQURPTkxZX0JBU0VfQUREUkVTUz0iJHtSRUFET05MWV9TVEFSVF9BRERSfSIKLWZpCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7T1VUUFVUX0FSQ0h9KQotRU5UUlkoJHtFTlRSWX0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1JFTE9DQVRJTkcrLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICR7U1RBQ0taRVJPKyR7U1RBQ0taRVJPfX0gJHtTSExJQl9QQVRIKyR7U0hMSUJfUEFUSH19ICAqL30KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkctIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcwotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZwotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovfQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtSRUFET05MWV9CQVNFX0FERFJFU1N9O319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQotICAuaGFzaCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmluaXQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuaW5pdCkJfQotICAucmVsYS5pbml0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbC5maW5pICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmZpbmkpCX0KLSAgLnJlbGEuZmluaSAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5maW5pKQl9Ci0gIC5yZWwuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgJHtEQVRBX1BMVC0ke1BMVH19Ci0gIC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSAqKC5nbnUubGlua29uY2UuciopIH0KLSAgLnJvZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KLQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLUFMSUdOKDQpO319Ci0KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YS4qKQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gIH0KLSAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TfX0KLSAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0gICR7UkVMT0NBVElORyske0RUT1J9fQotICAuZ290ICAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfQotICAke0RBVEFfUExUKyR7UExUfX0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IC47fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0ciAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXggMCA6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotCi0gICR7UkVMT0NBVElORyske09USEVSX1JFTE9DQVRJTkdfU0VDVElPTlN9fQotCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgJHtSRUxPQ0FUSU5HfS4gICovCi0gICR7T1RIRVJfU0VDVElPTlN9Ci0KLQotICAvKiBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotICAgICB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKGkuZS4gdG9wIG9mIDY0SyBkYXRhIHNwYWNlKS4gKi8KLSAgLnN0YWNrIDB4MDAwMDdGRkUgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9Ci0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICBLRUVQICgqKC5pbml0KSkKLSAgICBLRUVQICgqKC5maW5pKSkKLSAgICAqKC50ZXh0KQotICAgICooLnRleHQuKikKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gIH0gPSR7Tk9QLTB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmOTI4My4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLQotQ1RPUj0iLmN0b3JzICR7Q09OU1RSVUNUSU5HLTB9IDogCi0gIHsKLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47IH0KLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCi0gICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCi0gICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAotICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKLSAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubwotICAgICAgIGlzIGluLiAgKi8KLQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0KLSAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQotICAgICAgIGZyb20gdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KLSAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKLSAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KLQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fSIKLQotRFRPUj0iICAuZHRvcnMJJHtDT05TVFJVQ1RJTkctMH0gOgotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuOyB9Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjsgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0iCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi1NRU1PUlkKLXsKLSAgdGV4dCAke1RFWFRfREVGX1NFQ1RJT059IDogT1JJR0lOID0gJHtURVhUX1NUQVJUX0FERFJ9LCBMRU5HVEggPSAke1RFWFRfU0laRX0KLSAgZGF0YSAke0RBVEFfREVGX1NFQ1RJT059IDogT1JJR0lOID0gJHtEQVRBX1NUQVJUX0FERFJ9LCBMRU5HVEggPSAke0RBVEFfU0laRX0KLSAgZW1lbSAke0VNRU1fREVGX1NFQ1RJT059IDogT1JJR0lOID0gJHtFTUVNX1NUQVJUX0FERFJ9LCBMRU5HVEggPSAke0VNRU1fU0laRX0KLSAgZWl0CQkJICAgOiBPUklHSU4gPSAke0VJVF9TVEFSVF9BRERSfSwgIExFTkdUSCA9ICR7RUlUX1NJWkV9Ci19Ci0KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke1RFWFRfRFlOQU1JQyske0RZTkFNSUN9fQotICAuaGFzaAkJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkgfQotICAuZHluc3ltCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkgfQotICAuZHluc3RyCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikgfQotICAuZ251LnZlcnNpb24JCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb24pIH0KLSAgLmdudS52ZXJzaW9uX2QJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9kKSB9Ci0gIC5nbnUudmVyc2lvbl9yCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fcikgfQotCi0gIC5yZWxhLnRleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS50ZXh0KSAqKC5yZWxhLmdudS5saW5rb25jZS50KikgfQotICAucmVsYS5kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZGF0YSkgKigucmVsYS5nbnUubGlua29uY2UuZCopIH0KLSAgLnJlbGEucm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucm9kYXRhKSAqKC5yZWxhLmdudS5saW5rb25jZS5yKikgfQotICAucmVsYS5zdGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnN0ZXN0KSB9Ci0gIC5yZWxhLmV0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZXRlc3QpIH0KLSAgLnJlbGEuc2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zZGF0YSkgfQotICAucmVsYS5lZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmVkYXRhKSB9Ci0gIC5yZWxhLmVpdF92CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZWl0X3YpIH0KLSAgLnJlbGEuc2JzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MpIH0KLSAgLnJlbGEuZWJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmVic3MpIH0KLSAgLnJlbGEuc3JvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNyb2RhdGEpIH0KLSAgLnJlbGEuZXJvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmVyb2RhdGEpIH0KLSAgLnJlbGEuZ290CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KSB9Ci0gIC5yZWxhLmN0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpIH0KLSAgLnJlbGEuZHRvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykgfQotICAucmVsYS5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuaW5pdCkgfQotICAucmVsYS5maW5pCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkgfQotICAucmVsYS5ic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpIH0KLSAgLnJlbGEucGx0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KSB9Ci0KLSAgLnJlbC5kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kYXRhKSAqKC5yZWwuZ251LmxpbmtvbmNlLmQqKSB9Ci0gIC5yZWwucm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5yb2RhdGEpICooLnJlbC5nbnUubGlua29uY2UuciopIH0KLSAgLnJlbC5zdGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc3Rlc3QpIH0KLSAgLnJlbC5ldGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZXRlc3QpIH0KLSAgLnJlbC5zZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc2RhdGEpIH0KLSAgLnJlbC5lZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZWRhdGEpIH0KLSAgLnJlbC5zYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zYnNzKSB9Ci0gIC5yZWwuZWJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZWJzcykgfQotICAucmVsLmVpdF92CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5laXRfdikgfQotICAucmVsLnNyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnNyb2RhdGEpIH0KLSAgLnJlbC5lcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5lcm9kYXRhKSB9Ci0gIC5yZWwuZ290CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5nb3QpIH0KLSAgLnJlbC5jdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuY3RvcnMpIH0KLSAgLnJlbC5kdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZHRvcnMpIH0KLSAgLnJlbC5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5pbml0KSB9Ci0gIC5yZWwuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZmluaSkgfQotICAucmVsLmJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuYnNzKSB9Ci0gIC5yZWwucGx0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpIH0KLQotICAuaW5pdAkJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguaW5pdCkgfSA9JHtOT1AtMH0KLSAgJHtEQVRBX1BMVC0ke1BMVH19Ci0KLSAgLyogSW50ZXJuYWwgdGV4dCBzcGFjZSAqLwotICAuc3RleHQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zdGV4dCkgfQkJJHtSRUxPQ0FUSU5HKyA+IHRleHR9Ci0KLSAgLyogSW50ZXJuYWwgdGV4dCBzcGFjZSBvciBleHRlcm5hbCBtZW1vcnkgKi8KLSAgLnRleHQgOgotICB7Ci0gICAgKigudGV4dCkKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gICAgKiguaW5pdCkKLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtURVhUX01FTU9SWX19Ci0KLSAgLyogSW50ZXJuYWwgZGF0YSBzcGFjZSAqLwotICAuc3JvZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNyb2RhdGEpIH0JJHtSRUxPQ0FUSU5HKyA+IGRhdGF9Ci0gIC5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9CQkke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAvKiBJbnRlcm5hbCBkYXRhIHNwYWNlIG9yIGV4dGVybmFsIG1lbW9yeSAqLwotICAucm9kYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSB9CSR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAvKiBDKysgZXhjZXB0aW9uIHN1cHBvcnQuICAqLwotICAuZWhfZnJhbWUJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5laF9mcmFtZSkgfQkke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19Ci0KLSAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0gICR7UkVMT0NBVElORyske0RUT1J9fQotCi0gIC5kYXRhCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5nbnUubGlua29uY2UuZCopCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19Ci0KLSAgLyogRXh0ZXJuYWwgbWVtb3J5ICovCi0gIC5ldGV4dAkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2V0ZXh0X3N0YXJ0ID0gLikgOyB9Ci0gICAgKiguZXRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2V0ZXh0X2VuZCA9IC4pIDsgfQotICB9ICR7UkVMT0NBVElORysgPiBlbWVtfQotCi0gIC5lcm9kYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZXJvZGF0YSkgfQkke1JFTE9DQVRJTkcrID4gZW1lbX0KLSAgLmVkYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZWRhdGEpIH0JCSR7UkVMT0NBVElORysgPiBlbWVtfQotCi0gIC5zYnNzCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX3Nic3Nfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5zYnNzKQotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19zYnNzX2VuZCA9IC4pIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAuZWJzcwkJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19lYnNzX3N0YXJ0ID0gLikgOyB9Ci0gICAgKiguZWJzcykKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWJzc19lbmQgPSAuKSA7ICB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IGRhdGF9Ci0KLSAgLmJzcwkJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ic3Nfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Jzc19lbmQgPSAuKSA7IH0KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19Ci0KLSAgLmVpdF92CSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWl0X3N0YXJ0ID0gLikgOyB9Ci0gICAgKiguZWl0X3YpCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2VpdF9lbmQgPSAuKSA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZWl0fQotCi0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiCQkgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0cgkgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsCSAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0cgkgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4CSAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLQotICAuY29tbWVudAkgMCA6IHsgKiguY29tbWVudCkgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZwkgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUJCSAwIDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICBQUk9WSURFIChfX3N0YWNrID0gJHtTVEFDS19TVEFSVF9BRERSfSk7Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGFiOGY4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZnBwYy5zYworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuY3RvcnMgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKLSMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KLSMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCi0jCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLnRleHQgc2VjdGlvbi4KLSMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuZGF0YSBzZWN0aW9uLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1TQlNTMj0iLnNic3MyICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzczIpIH0iCi1TREFUQTI9Ii5zZGF0YTIgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YTIpIH0iCi1JTlRFUlA9Ii5pbnRlcnAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIH0iCi1QTFQ9Ii5wbHQgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpIH0iCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgotICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcwotICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKLSAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCi0gICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KLSAgICAgICBpcyBpbi4gICovCi0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KLSAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCi0gICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCi0gICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCi0KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KLSAgfSIKLQotRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19Ci0gIH0iCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWSgke0VOVFJZfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci0KLSR7UkVMT0NBVElORytQUk9WSURFIChfX3N0YWNrID0gMCk7fQotJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX3N0YWNrID0gMCk7fQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9ICsgU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gIC5oYXNoCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0JJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKSAgICAgIH0KLSAgLmdudS52ZXJzaW9uX2QgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9kKSAgfQotICAuZ251LnZlcnNpb25fciAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpICB9Ci0gIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEudGV4dCkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnRleHQuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UudCopfQotICAgIH0KLSAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS5kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5kKil9Ci0gICAgfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnJvZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsYS5nb3QJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsYS5nb3QxCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QxKQl9Ci0gIC5yZWxhLmdvdDIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdDIpCX0KLSAgLnJlbGEuY3RvcnMJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsYS5pbml0CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KQl9Ci0gIC5yZWxhLmZpbmkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbGEuYnNzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbGEucGx0CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCX0KLSAgLnJlbGEuc2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhKQl9Ci0gIC5yZWxhLnNic3MJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MpCX0KLSAgLnJlbGEuc2RhdGEyCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zZGF0YTIpCX0KLSAgLnJlbGEuc2JzczIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MyKQl9Ci0gIC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9Ci0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS50Kil9Ci0gIH0gPSR7Tk9QLTB9Ci0gIC5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7IEtFRVAgKCooLmluaXQpKQl9ID0ke05PUC0wfQotICAuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyBLRUVQICgqKC5maW5pKSkJfSA9JHtOT1AtMH0KLSAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuciopfQotICB9Ci0gIC5yb2RhdGExCSR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZXRleHQgPSAuKTt9Ci0gICR7Q1JFQVRFX1NITElCLSR7U0RBVEEyfX0KLSAgJHtDUkVBVEVfU0hMSUItJHtTQlNTMn19Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KLQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bwotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGQKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6Ci0gICAgICAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoQUxJR04oOCkgJiAoJHtNQVhQQUdFU0laRX0gLSAxKSl9O30KLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGEKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGUKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZQotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmcKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmUKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3QKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqLwotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLSBBTElHTig4KSArICR7TUFYUEFHRVNJWkV9fTt9Ci0KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGEuKil9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5kKil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0KLSAgLmdvdDEJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290MSkgfQotICAuZHluYW1pYwkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0KLQotICAvKiBQdXQgLmN0b3JzIGFuZCAuZHRvcnMgbmV4dCB0byB0aGUgLmdvdDIgc2VjdGlvbiwgc28gdGhhdCB0aGUgcG9pbnRlcnMKLSAgICAgZ2V0IHJlbG9jYXRlZCB3aXRoIC1tcmVsb2NhdGFibGUuIEFsc28gcHV0IGluIHRoZSAuZml4dXAgcG9pbnRlcnMuCi0gICAgIFRoZSBjdXJyZW50IGNvbXBpbGVyIG5vIGxvbmdlciBuZWVkcyB0aGlzLCBidXQga2VlcCBpdCBhcm91bmQgZm9yIDIuNy4yICAqLwotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UMl9TVEFSVF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVDJfU1RBUlRfID0gLik7fQotICAuZ290MgkJJHtSRUxPQ0FUSU5HLTB9IDogIHsgKiguZ290MikgfQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfTElTVF9fID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fQ1RPUl9MSVNUX18gPSAuKTt9Ci0gICAgICAgICAgICAgICAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfRU5EX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19DVE9SX0VORF9fID0gLik7fQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfTElTVF9fID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fRFRPUl9MSVNUX18gPSAuKTt9Ci0gICAgICAgICAgICAgICAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfRU5EX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19EVE9SX0VORF9fID0gLik7fQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfU1RBUlRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19GSVhVUF9TVEFSVF8gPSAuKTt9Ci0gIC5maXh1cAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmZpeHVwKSB9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRklYVVBfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1QyX0VORF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVDJfRU5EXyA9IC4pO30KLQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVF9TVEFSVF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVF9TVEFSVF8gPSAuKTt9Ci0gIC5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290KSB9Ci0gIC5nb3QucGx0CSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgfQotICAke0NSRUFURV9TSExJQiske1NEQVRBMn19Ci0gICR7Q1JFQVRFX1NITElCKyR7U0JTUzJ9fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVF9FTkRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19HT1RfRU5EXyA9IC4pO30KLQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChfX2VkYXRhID0gLik7fQotICAuc2JzcyAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc2Jzc19zdGFydCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc2Jzc19zdGFydCA9IC4pO30KLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gICAgKiguZHluc2JzcykKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19zYnNzX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc2Jzc19lbmQgPSAuKTt9Ci0gIH0KLSAgJHtQTFR9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgICR7UkVMT0NBVElORytQUk9WSURFIChfX2Jzc19zdGFydCA9IC4pO30KLSAgICR7UkVMT0NBVElORytQUk9WSURFIChfX19ic3Nfc3RhcnQgPSAuKTt9Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZW5kID0gLik7fQotCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbgotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9nbzMyY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGY2MDc2Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciAzODYgZ28zMgotIyBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9c3RhcnQKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwK1NJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC4gOyBfZXRleHQgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTigweDIwMCk7fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgJHtEQVRBX0FMSUdOTUVOVH19IDogewotICAgICR7UkVMT0NBVElORysgKiguY3Rvcil9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5kdG9yKX0KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC4gOyBfZWRhdGEgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTigweDIwMCk7fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC4gOyBfZW5kID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gQUxJR04oMHgyMDApO30KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODMwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4MzAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmY4NzZlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWSgiX3N0YXJ0IikKLQotTUVNT1JZCi17Ci0JLyogMHhjNCBpcyBhIG1hZ2ljIGVudHJ5LiAgV2Ugc2hvdWxkIGhhdmUgdGhlIGxpbmtlciBqdXN0Ci0JICAgc2tpcCBvdmVyIGl0IG9uZSBkYXkuLi4gKi8KLQl2ZWN0b3JzIDogbyA9IDB4MDAwMCwgbCA9IDB4YzQKLQltYWdpY3ZlY3RvcnMgOiBvID0gMHhjNCwgbCA9IDB4M2MKLQlyYW0gICAgOiBvID0gMHgwMTAwLCBsID0gMHhmZGZjCi0JLyogVGhlIHN0YWNrIHN0YXJ0cyBhdCB0aGUgdG9wIG9mIG1haW4gcmFtLiAgKi8KLQl0b3ByYW0gOiBvID0gMHhmZWZjLCBsID0gMHg0Ci0JLyogQXQgdGhlIHZlcnkgdG8gb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIDgtYml0IGFyZWEuICAqLwotCWVpZ2h0IDogbyA9IDB4ZmYwMCwgbCA9IDB4MTAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDogewotCS8qIFVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHBsYWNlIGEgc3BlY2lmaWMgZnVuY3Rpb24ncyBhZGRyZXNzCi0JICAgaW50byB0aGUgdmVjdG9yIHRhYmxlLiAKLQotCVNIT1JUKEFCU09MVVRFKF9mb29iYXIpKSAqLwotCi0JKigudmVjdG9ycykKLSAgICAgICAgfSAke1JFTE9DQVRJTkcrID4gdmVjdG9yc30KLQotLnRleHQgOgl7IAkJCQkJCi0JKigucm9kYXRhKSAJCQkJCi0JKigudGV4dCkgCQkJCQotCSooLnN0cmluZ3MpCi0gICAJJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS50b3JzIDogewotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uZGF0YSA6IHsKLQkqKC5kYXRhKQotCSooLnRpbnkpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5ic3MgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7fQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9ICR7UkVMT0NBVElORysgPnJhbX0KLS5zdGFjayA6IHsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAke1JFTE9DQVRJTkcrID4gdG9wcmFtfQotLmVpZ2h0IDogewotCSooLmVpZ2h0KQotCX0gJHtSRUxPQ0FUSU5HKyA+IGVpZ2h0fQotLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWIgXQotCX0KLS5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFic3RyIF0KLQl9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwaC5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4MzAwaC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjZmQ4Ni4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODMwMGguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goaDgzMDBoKQotRU5UUlkoIl9zdGFydCIpCi0KLS8qIFRoZSBtZW1vcnkgc2l6ZSBpcyAyNTZLQiB0byBjb2luY2lkZSB3aXRoIHRoZSBzaW11bGF0b3IuCi0gICBEb24ndCBjaGFuZ2UgZWl0aGVyIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG90aGVyLiAgKi8KLQotTUVNT1JZCi17Ci0gICAgICAgIC8qIDB4YzQgaXMgYSBtYWdpYyBlbnRyeS4gIFdlIHNob3VsZCBoYXZlIHRoZSBsaW5rZXIganVzdAotICAgICAgICAgICBza2lwIG92ZXIgaXQgb25lIGRheS4uLiAqLwotICAgICAgICB2ZWN0b3JzIDogbyA9IDB4MDAwMCwgbCA9IDB4YzQKLSAgICAgICAgbWFnaWN2ZWN0b3JzIDogbyA9IDB4YzQsIGwgPSAweDNjCi0JLyogV2Ugc3RpbGwgb25seSB1c2UgMjU2ayBhcyB0aGUgbWFpbiByYW0gc2l6ZS4gICovCi0JcmFtICAgIDogbyA9IDB4MDEwMCwgbCA9IDB4M2ZlZmMKLQkvKiBUaGUgc3RhY2sgc3RhcnRzIGF0IHRoZSB0b3Agb2YgbWFpbiByYW0uICAqLwotCXRvcHJhbSA6IG8gPSAweDNmZmZjLCBsID0gMHg0Ci0JLyogVGhpcyBob2xkcyB2YXJpYWJsZXMgaW4gdGhlICJ0aW55IiBzZWN0aW9ucy4gICovCi0JdGlueSAgIDogbyA9IDB4ZmY4MDAwLCBsID0gMHg3ZjAwCi0JLyogQXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGlzIHRoZSA4LWJpdCBhcmVhLiAgKi8KLQllaWdodCAgOiBvID0gMHhmZmZmMDAsIGwgPSAweDEwMAotfQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udmVjdG9ycyA6IHsKLQkvKiBVc2Ugc29tZXRoaW5nIGxpa2UgdGhpcyB0byBwbGFjZSBhIHNwZWNpZmljIGZ1bmN0aW9uJ3MgYWRkcmVzcwotCSAgIGludG8gdGhlIHZlY3RvciB0YWJsZS4KLQotCUxPTkcoQUJTT0xVVEUoX2Zvb2JhcikpICovCi0KLQkqKC52ZWN0b3JzKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHZlY3RvcnN9Ci0udGV4dCA6CXsgCQkJCQkKLQkqKC5yb2RhdGEpIAkJCQkKLQkqKC50ZXh0KSAJCQkJCi0JKiguc3RyaW5ncykKLSAgIAkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLnRvcnMgOiB7Ci0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5kYXRhIDogewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5ic3MgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7fQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9ICR7UkVMT0NBVElORysgPnJhbX0KLS5zdGFjayA6IHsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAke1JFTE9DQVRJTkcrID4gdG9wcmFtfQotLnRpbnkgOiB7Ci0JKigudGlueSkKLQl9ICR7UkVMT0NBVElORysgPiB0aW55fQotLmVpZ2h0IDogewotCSooLmVpZ2h0KQotCX0gJHtSRUxPQ0FUSU5HKyA+IGVpZ2h0fQotLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWIgXQotCX0KLS5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFic3RyIF0KLQl9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwcy5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4MzAwcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0NzRmYy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODMwMHMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goaDgzMDBzKQotRU5UUlkoIl9zdGFydCIpCi0KLS8qIFRoZSBtZW1vcnkgc2l6ZSBpcyAyNTZLQiB0byBjb2luY2lkZSB3aXRoIHRoZSBzaW11bGF0b3IuCi0gICBEb24ndCBjaGFuZ2UgZWl0aGVyIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG90aGVyLiAgKi8KLQotTUVNT1JZCi17Ci0gICAgICAgIC8qIDB4YzQgaXMgYSBtYWdpYyBlbnRyeS4gIFdlIHNob3VsZCBoYXZlIHRoZSBsaW5rZXIganVzdAotICAgICAgICAgICBza2lwIG92ZXIgaXQgb25lIGRheS4uLiAqLwotICAgICAgICB2ZWN0b3JzIDogbyA9IDB4MDAwMCwgbCA9IDB4YzQKLSAgICAgICAgbWFnaWN2ZWN0b3JzIDogbyA9IDB4YzQsIGwgPSAweDNjCi0JLyogV2Ugc3RpbGwgb25seSB1c2UgMjU2ayBhcyB0aGUgbWFpbiByYW0gc2l6ZS4gICovCi0JcmFtICAgIDogbyA9IDB4MDEwMCwgbCA9IDB4M2ZlZmMKLQkvKiBUaGUgc3RhY2sgc3RhcnRzIGF0IHRoZSB0b3Agb2YgbWFpbiByYW0uICAqLwotCXRvcHJhbSA6IG8gPSAweDNmZmZjLCBsID0gMHg0Ci0JLyogVGhpcyBob2xkcyB2YXJpYWJsZXMgaW4gdGhlICJ0aW55IiBzZWN0aW9ucy4gICovCi0JdGlueSAgIDogbyA9IDB4ZmY4MDAwLCBsID0gMHg3ZjAwCi0JLyogQXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGlzIHRoZSA4LWJpdCBhcmVhLiAgKi8KLQllaWdodCAgOiBvID0gMHhmZmZmMDAsIGwgPSAweDEwMAotfQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udmVjdG9ycyA6IHsKLQkvKiBVc2Ugc29tZXRoaW5nIGxpa2UgdGhpcyB0byBwbGFjZSBhIHNwZWNpZmljIGZ1bmN0aW9uJ3MgYWRkcmVzcwotCSAgIGludG8gdGhlIHZlY3RvciB0YWJsZS4KLQotCUxPTkcoQUJTT0xVVEUoX2Zvb2JhcikpICovCi0KLQkqKC52ZWN0b3JzKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHZlY3RvcnN9Ci0udGV4dCA6CXsgCQkJCQkKLQkqKC5yb2RhdGEpIAkJCQkKLQkqKC50ZXh0KSAJCQkJCi0JKiguc3RyaW5ncykKLSAgIAkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLnRvcnMgOiB7Ci0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5kYXRhIDogewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5ic3MgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7fQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9ICR7UkVMT0NBVElORysgPnJhbX0KLS5zdGFjayA6IHsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAke1JFTE9DQVRJTkcrID4gdG9wcmFtfQotLnRpbnkgOiB7Ci0JKigudGlueSkKLQl9ICR7UkVMT0NBVElORysgPiB0aW55fQotLmVpZ2h0IDogewotCSooLmVpZ2h0KQotCX0gJHtSRUxPQ0FUSU5HKyA+IGVpZ2h0fQotLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWIgXQotCX0KLS5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFic3RyIF0KLQl9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTM5ZWUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29kZSBhbmQgZGF0YSA2NGsgdG90YWwgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtSRUxPQ0FUSU5HKyAweDAwMDAgfSA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9Ci0KLQotLmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAKLQotLnJkYXRhICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSooLnJkYXRhKTsgCi0JICAqKC5zdHJpbmdzKQotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLX0gCi0KLS5ic3MgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4ZmZmMH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAKLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBiLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBiLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjVmYTJjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwYi5zYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhLCBib3RoIGxhcmdlciB0aGFuIDY0ayAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDB9IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0KLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDIwMDAwfSA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gCi0KLS5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDMwMDAwfSA6Ci0JewotCSooLnJkYXRhKTsgCi0JICAqKC5zdHJpbmdzKQotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLX0gCi0KLS5ic3MgICR7UkVMT0NBVElORysgMHg0MDAwMH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfQotCi0uc3RhY2sgICR7UkVMT0NBVElORysgMHg1MDAwMH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAKLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBjLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBjLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg4MGUzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwYy5zYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb21wYWN0IG1vZGVsIC0gY29kZSA8IDY0aywgZGF0YSA+IDY0ayAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAweDEwMDAwIDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0JICAqKC5zdHJpbmdzKQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0KLS5kYXRhIDB4MjAwMDAgOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0KLS5yZGF0YSAweDMwMDAwICA6IHsKLQkqKC5yZGF0YSk7IAotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLX0gICR7UkVMT0NBVElORysgPiByYW19Ci0KLS5ic3MgIDB4NDAwMDAgOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgMHg1ZmZmMCA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwbS5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwbS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwYTRhNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMG0uc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29kZSBhbmQgZGF0YSwgYm90aCBsYXJnZXIgdGhhbiA2NGsgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwfSA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfQotCi0KLS5kYXRhICAke1JFTE9DQVRJTkcrIDB4MjAwMDB9IDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAKLQotLnJkYXRhICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSooLnJkYXRhKTsgCi0JICAqKC5zdHJpbmdzKQotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLQl9IAotCi0uYnNzICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9Ci0KLS5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweDJmZmYwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9IAotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMHMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMHMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNjE1ZDguLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBzLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvZGUgYW5kIGRhdGEsIGJvdGggNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMCB9IDoKLQl7IAkJCQkJCi0JKigudGV4dCkgCQkJCQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9Ci0KLS5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDIwMDAwIH0gOgotCXsKLQkqKC5yZGF0YSk7IAotCSooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0KLQotLmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAufSA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9Ci0KLS5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweDJmZmYwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9IAotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjIGIvbGQvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxY2UwOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotREFUQV9BRERSPTB4NDAwMDAwMDAKLXRlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWSgiXCRTVEFSVFwkIikKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci1TRUNUSU9OUwotewotICAudGV4dCAweDEwMDAgJHtSRUxPQ0FUSU5HKyske1RFWFRfU1RBUlRfQUREUn19OgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fdGV4dF9zdGFydCA9IC59OwotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLlBBUklTQy5zdHVicykKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytldGV4dCA9IC59OwotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAufTsKLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSfTt9Ci0gIC5kYXRhIDoKLSAgewotICAgICR7UkVMT0NBVElORysgLiA9IC4gKyAweDEwMDAgfTsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0ID0gLn07Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK2VkYXRhID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSA9IC59OwotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9ICsgU0laRU9GKC5kYXRhKTt9Ci0gIC5ic3MgOgotICB7Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytlbmQgPSAuIH07Ci0gICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYyBiL2xkL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZmZGUxLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgUEUuCi0KLWlmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgotICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1maQotCi0jIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAotIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KLWlmIHRlc3QgIiR7UkVMT0NBVElOR30iOyB0aGVuCi0gIFJfVEVYVD0nKigudGV4dCQqKScKLSAgUl9EQVRBPScqKC5kYXRhJCopJwotICBSX1JEQVRBPScqKC5yZGF0YSQqKScKLSAgUl9JREFUQT0nCi0gICAgKiguaWRhdGEkMikKLSAgICAqKC5pZGF0YSQzKQotICAgIC8qIFRoZXNlIHplcm9lcyBtYXJrIHRoZSBlbmQgb2YgdGhlIGltcG9ydCBsaXN0LiAgKi8KLSAgICBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7Ci0gICAgKiguaWRhdGEkNCkKLSAgICAqKC5pZGF0YSQ1KQotICAgICooLmlkYXRhJDYpCi0gICAgKiguaWRhdGEkNyknCi0gIFJfQ1JUPScqKC5DUlQkKiknCi0gIFJfUlNSQz0nKigucnNyYyQqKScKLSAgUl9FWEM9JyooLmV4YyQqKScKLWVsc2UKLSAgUl9URVhUPQotICBSX0RBVEE9Ci0gIFJfUkRBVEE9Ci0gIFJfSURBVEE9Ci0gIFJfQ1JUPQotICBSX1JTUkM9Ci0gIFJfRVhDPQotZmkKLQotY2F0IDw8RU9GCi0ke1JFTE9DQVRJTkcrT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KX0KLSR7UkVMT0NBVElORy1PVVRQVVRfRk9STUFUKCR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9KX0KLQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKF9fc3RhcnQpCi0ke1JFTE9DQVRJTkcraGVhZGVyID0gLjt9Ci0ke1JFTE9DQVRJTkcrX19mbHR1c2VkID0gLjsgLyogc2V0IHVwIGZsb2F0aW5nIHB0IGZvciBNUyAub2JqXCdzICovfQotJHtSRUxPQ0FUSU5HK19fbGR1c2VkID0gLjt9Ci1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgX190ZXh0X3N0YXJ0X18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAqKC50ZXh0KQotICAgICR7Ul9URVhUfQotICAgICooLmdsdWVfN3QpCi0gICAgKiguZ2x1ZV83KQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAvKiA/Pz8gV2h5IGlzIC5nY2NfZXhjIGhlcmU/ICAqLwotICAgICR7UkVMT0NBVElORysgKiguZ2NjX2V4Yyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORysgX190ZXh0X2VuZF9fID0gLjt9Ci0gICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLSAgfQotCi0gIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCi0gICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKLSAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKLSAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCi0gICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLwotCi0gIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTIpCi0gICAgJHtSX0RBVEF9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KLSAgfQotCi0gIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAvKiBsaW5rLmV4ZSBhcHBhcmVudGx5IHB1bGxzIGluIC5vYmoncyBiZWNhdXNlIG9mIFVOREVGIGNvbW1vbgotCXN5bWJvbHMsIHdoaWNoIGlzIG5vdCB0aGUgY29mZiB3YXksIGJ1dCB0aGF0J3MgTVMgZm9yIHlvdS4gKi8KLSAgICAqKC5DUlRcJFhDQSkKLSAgICAqKC5DUlRcJFhDWikKLSAgICAqKC5DUlRcJFhJQSkKLSAgICAqKC5DUlRcJFhJWikKLSAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAucmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLnJkYXRhKQotICAgICR7Ul9SREFUQX0KLSAgICAqKC5laF9mcmFtZSkKLSAgfQotCi0gIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKiguZWRhdGEpCi0gIH0KLQotICAvRElTQ0FSRC8gOgotICB7Ci0gICAgKiguZGVidWdcJFMpCi0gICAgKiguZGVidWdcJFQpCi0gICAgKiguZGVidWdcJEYpCi0gICAgKiguZHJlY3R2ZSkKLSAgICAqKC5kZWJ1ZyopCi0gIH0KLQotICAuaWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIFRoaXMgY2Fubm90IGN1cnJlbnRseSBiZSBoYW5kbGVkIHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4KLQlTZWUgcGUuZW06c29ydF9zZWN0aW9ucy4gICovCi0gICAgJHtSX0lEQVRBfQotICB9Ci0gIC5DUlQgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICR7Ul9DUlR9Ci0gIH0KLQotICAuZW5kanVuayAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogZW5kIGlzIGRlcHJlY2F0ZWQsIGRvbid0IHVzZSBpdCAqLwotICAgICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9fID0gLjt9Ci0gIH0KLQotICAucmVsb2MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJlbG9jKQotICB9Ci0KLSAgLnJzcmMgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJzcmMpCi0gICAgJHtSX1JTUkN9Ci0gIH0KLQotICAuZXhjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5leGMpCi0gICAgJHtSX0VYQ30KLSAgfQotCi0gIC5zdGFiICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0KLSAgLnN0YWJzdHIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmIxYjc5Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciAzODYgQ09GRi4gIFRoaXMgd29ya3Mgb24gU1ZSMy4yIGFuZCBTQ08gVW5peCAzLjIuMi4KLSMgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLSMgVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGluIGFzIHZhcmlhYmxlcyBpbiBvcmRlciB0byBnZXQgJ30nIGluIGEgc2hlbGwKLSMgY29uZGl0aW9uYWwgZXhwYW5zaW9uLgotSU5JVD0nLmluaXQgOiB7ICooLmluaXQpIH0nCi1GSU5JPScuZmluaSA6IHsgKiguZmluaSkgfScKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OwotICB9Ci0gICR7UkVMT0NBVElORy0gJHtJTklUfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0ZJTkl9fQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDNkMDkuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIGkzODYgZ28zMiAoREpHUFApCi0KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9c3RhcnQKLUVYRT0ke0NPTlNUUlVDVElORyske1JFTE9DQVRJTkcrLWV4ZX19Ci0KLSMgVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGluIGFzIHZhcmlhYmxlcyBpbiBvcmRlciB0byBnZXQgJ30nIGluIGEgc2hlbGwKLSMgY29uZGl0aW9uYWwgZXhwYW5zaW9uLgotQ1RPUj0nLmN0b3IgOiB7ICooLmN0b3IpIH0nCi1EVE9SPScuZHRvciA6IHsgKiguZHRvcikgfScKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9JHtFWEV9IikKLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgJHtUQVJHRVRfUEFHRV9TSVpFfStTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKigudGV4dCkKLSAgICAqKC5jb25zdCopCi0gICAgKigucm8qKQotICAgICR7UkVMT0NBVElORytldGV4dCAgPSAgLiA7IF9ldGV4dCA9IC59OwotICAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtTRUdNRU5UX1NJWkV9KTt9Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAke0RBVEFfQUxJR05NRU5UfX0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK2RqZ3BwX2ZpcnN0X2N0b3IgPSAuIDsKLSAgICAqKC5jdG9yKQotICAgIGRqZ3BwX2xhc3RfY3RvciA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrZGpncHBfZmlyc3RfZHRvciA9IC4gOwotICAgICooLmR0b3IpCi0gICAgZGpncHBfbGFzdF9kdG9yID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLiA7IF9lZGF0YSA9IC59OwotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKCR7U0VHTUVOVF9TSVpFfSk7fQotICB9Ci0gICR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORy0kQ1RPUn19Ci0gICR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORy0kRFRPUn19Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC4gOyBfZW5kID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gQUxJR04oJHtTRUdNRU5UX1NJWkV9KTt9Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiNzJhNC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYyBiL2xkL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzMTJlNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9IC47fQotICB9Ci0gIC5kYXRhIDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzIDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLn07Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytlbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pOTYwLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzMzU1NS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pOTYwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotY2F0IDw8RU9GCi1TRUNUSU9OUwoteyAKLSAgICAudGV4dCA6IAotICAgIHsgCi0JJHtHTERfU1RZTEUrIENSRUFURV9PQkpFQ1RfU1lNQk9MU30KLQkqKC50ZXh0KSAKLQkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC59OwotCSR7Q09OU1RSVUNUSU5HKyR7Q09GRl9DVE9SU319Ci0gICAgfSAgCi0gICAgLmRhdGEgOgotICAgIHsgCi0gCSooLmRhdGEpIAotCSR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC59OwotICAgIH0gIAotICAgIC5ic3MgOgotICAgIHsgCi0JJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLn07Ci0JKiguYnNzKQkgCi0JKihDT01NT04pIAotCSR7UkVMT0NBVElORysgX2VuZCA9IC59OwotICAgIH0gCi19IAotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjIGIvbGQvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0MjgwZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBBL1VYLgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1DVE9SUz0nLmN0b3JzIDogeyAqKC5jdG9ycykgfScKLURUT1JTPScuZHRvcnMgOiB7ICooLmR0b3JzKSB9JwotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrICRURVhUX1NUQVJUX0FERFJ9IDogewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKDQpO30KLSAgICAke1JFTE9DQVRJTkcrICooLmN0b3JzKX0KLSAgICAke1JFTE9DQVRJTkcrICooLmR0b3JzKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuO30KLSAgfSA9MHg0RTcxNEU3MQotICAuZGF0YSAke1JFTE9DQVRJTkcrICREQVRBX0FMSUdOTUVOVH0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuO30KLSAgfQotICAuYnNzIDogewotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICB9Ci0gICR7UkVMT0NBVElORy0gJHtJTklUfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0ZJTkl9fQotICAke1JFTE9DQVRJTkctICR7Q1RPUlN9fQotICAke1JFTE9DQVRJTkctICR7RFRPUlN9fQotCi0gIC5jb21tZW50IDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgWyAuY29tbWVudCBdIFsgLmlkZW50IF0gfQotICAuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLnN0YWIgXSB9Ci0gIC5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgWyAuc3RhYnN0ciBdIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2OGM2Zi4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLVBST1ZJREUgKF9fc3RhY2sgPSAwKTsgCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDAwMH0gOiB7Ci0gICAgKigudGV4dCkKLSAgICAke0NPTlNUUlVDVElORysgLiA9IEFMSUdOKDQpO30KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KLSAgfQotICAuZGF0YSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgOiB7IAkJCQkJCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSBBTElHTigweDgpfTsKLSAgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gQUxJR04oMHg4KX07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYyBiL2xkL3NjcmlwdHRlbXBsL202OGtseW54LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQyMjQ1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL202OGtseW54LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogewotICAgICooLmluaXQpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEgLmRhdGEyKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyBiL2xkL3NjcmlwdHRlbXBsL204OGtiY3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MmIxNGQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMgVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGluIGFzIHZhcmlhYmxlcyBpbiBvcmRlciB0byBnZXQgJ30nIGluIGEgc2hlbGwKLSMgY29uZGl0aW9uYWwgZXhwYW5zaW9uLgotSU5JVD0nLmluaXQgOiB7ICooLmluaXQpIH0nCi1GSU5JPScuZmluaSA6IHsgKiguZmluaSkgfScKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoX19zdGFydCkKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAoMHgyMDAwNyArIFNJWkVPRl9IRUFERVJTKSAmfiA3fSA6Ci0gICAgewotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZXh0LnN0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmluaXQuc3RhcnQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmluaXQuZW5kID0gLn07Ci0gICAgICAqKC50ZXh0KSAJCQkJCi0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRkZXNjX3N0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrICooLnRkZXNjKX0KLSAgICAgICR7UkVMT0NBVElORysgX18udGV4dF9lbmQgPSAufQk7Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmluaXRwLnN0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmluaXRwLmVuZCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5maW5pX3N0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpIH0KLSAgICAgICR7UkVMT0NBVElORysgX18uZmluaV9lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORytfZXRleHQgPSAufTsKLSAgICB9ICAJCQkJCQotICAuZGF0YSAke1JFTE9DQVRJTkcrIE5FWFQgKDB4NDAwMDAwKSArICgoU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpKSAlIDB4MjAwMCl9IDoKLSAgICB7IAkJCQkJCi0gICAgICAqKC5kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLn07Ci0gICAgfSAgCQkJCQkKLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICAgIHsgCQkKLSAgICAgICooLmJzcykJCi0gICAgICAqKENPTU1PTikgCQotICAgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fZW5kID0gLn07Ci0gICAgfQotICAke1JFTE9DQVRJTkctICR7SU5JVH19Ci0gICR7UkVMT0NBVElORy0gJHtGSU5JfX0KLSAgLmNvbW1lbnQgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgKiguY29tbWVudCkKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tY29yZXBlLnNjIGIvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3MTMzOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tY29yZXBlLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgTUNvcmUgUEUuCi0KLWlmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgotICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1maQotCi0jIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAotIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KLSMgU29ydGluZyBvZiB0aGUgLmZvbyQqIHNlY3Rpb25zIGlzIHJlcXVpcmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mCi0jIGdyb3VwZWQgc2VjdGlvbnMgaW4gUEUuCi0jIFNvcnRpbmcgb2YgdGhlIGZpbGUgbmFtZXMgaW4gUl9JREFUQSBpcyByZXF1aXJlZCBieSB0aGUKLSMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkbGx0b29sICh0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8KLSMgdXNlIGdyb3VwZWQgc2VjdGlvbnMgaW5zdGVhZCkuCi1pZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgotICBSX1RFWFQ9JyooU09SVCgudGV4dCQqKSknCi0gIFJfREFUQT0nKihTT1JUKC5kYXRhJCopKScKLSAgUl9SREFUQT0nKihTT1JUKC5yZGF0YSQqKSknCi0gIFJfSURBVEE9JwotICAgIFNPUlQoKikoLmlkYXRhJDIpCi0gICAgU09SVCgqKSguaWRhdGEkMykKLSAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCi0gICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOwotICAgIFNPUlQoKikoLmlkYXRhJDQpCi0gICAgU09SVCgqKSguaWRhdGEkNSkKLSAgICBTT1JUKCopKC5pZGF0YSQ2KQotICAgIFNPUlQoKikoLmlkYXRhJDcpJwotICBSX0NSVD0nKihTT1JUKC5DUlQkKikpJwotICBSX1JTUkM9JyooU09SVCgucnNyYyQqKSknCi1lbHNlCi0gIFJfVEVYVD0KLSAgUl9EQVRBPQotICBSX1JEQVRBPQotICBSX0lEQVRBPQotICBSX0NSVD0KLSAgUl9SU1JDPQotZmkKLQotY2F0IDw8RU9GCi0ke1JFTE9DQVRJTkcrT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAJICAgICAgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKX0KLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWShfbWFpbkNSVFN0YXJ0dXApCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAqKC50ZXh0KQotICAgICR7Ul9URVhUfQotICAgICooLmdsdWVfN3QpCi0gICAgKiguZ2x1ZV83KQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAvKiA/Pz8gV2h5IGlzIC5nY2NfZXhjIGhlcmU/ICAqLwotICAgICR7UkVMT0NBVElORysgKiguZ2NjX2V4Yyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCA9IC47fQotICAgICooLmdjY19leGNlcHRfdGFibGUpCi0gIH0KLQotICAvKiBUaGUgQ3lnd2luMzIgbGlicmFyeSB1c2VzIGEgc2VjdGlvbiB0byBhdm9pZCBjb3B5aW5nIGNlcnRhaW4gZGF0YQotICAgICBvbiBmb3JrLiAgVGhpcyB1c2VkIHRvIGJlIG5hbWVkICIuZGF0YSRub2NvcHkiLiAgVGhlIGxpbmtlciB1c2VkCi0gICAgIHRvIGluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0Ci0gICAgIGJyZWFrcyBidWlsZGluZyB0aGUgY3lnd2luMzIgZGxsLiAgSW5zdGVhZCwgd2UgbmFtZSB0aGUgc2VjdGlvbgotICAgICAiLmRhdGFfY3lnd2luX25vY29weSIgYW5kIGV4cGxpY3RseSBpbmNsdWRlIGl0IGFmdGVyIF9fZGF0YV9lbmRfXy4gKi8KLQotICAuZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOiAKLSAgewotICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICooLmRhdGEyKQotICAgICR7Ul9EQVRBfQotICAgICR7UkVMT0NBVElORytfX2RhdGFfZW5kX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGFfY3lnd2luX25vY29weSl9Ci0gIH0KLQotICAuYnNzICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX2VuZF9fID0gLiA7fQotICB9Ci0KLSAgLnJkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5yZGF0YSkKLSAgICAke1JfUkRBVEF9Ci0gICAgKiguZWhfZnJhbWUpCi0gIH0KLQotICAuZWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLmVkYXRhKQotICB9Ci0KLSAgL0RJU0NBUkQvIDoKLSAgewotICAgICooLmRlYnVnXCRTKQotICAgICooLmRlYnVnXCRUKQotICAgICooLmRlYnVnXCRGKQotICAgICooLmRyZWN0dmUpCi0gIH0KLQotICAuaWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIFRoaXMgY2Fubm90IGN1cnJlbnRseSBiZSBoYW5kbGVkIHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4KLQlTZWUgcGUuZW06c29ydF9zZWN0aW9ucy4gICovCi0gICAgJHtSX0lEQVRBfQotICB9Ci0gIC5DUlQgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICR7Ul9DUlR9Ci0gIH0KLQotICAuZW5kanVuayAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogZW5kIGlzIGRlcHJlY2F0ZWQsIGRvbid0IHVzZSBpdCAqLwotICAgICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9fID0gLjt9Ci0gIH0KLQotICAucmVsb2MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJlbG9jKQotICB9Ci0KLSAgLnJzcmMgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJzcmMpCi0gICAgJHtSX1JTUkN9Ci0gIH0KLQotICAuc3RhYiAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotCi0gIC5zdGFic3RyICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci0KLSAgLnN0YWNrIDB4ODAwMDAgOgotICB7Ci0gICAgX3N0YWNrID0gLjsKLSAgICAqKC5zdGFjaykKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9taXBzLnNjIGIvbGQvc2NyaXB0dGVtcGwvbWlwcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwYWVlZC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9taXBzLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBNSVBTIHN5c3RlbXMuCi0jIElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLSMgVGhlc2UgdmFyaWFibGVzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBlbXVsYXRpb24gZmlsZS4gIFRoZQotIyBkZWZhdWx0cyBhcmUgYXBwcm9wcmlhdGUgZm9yIGEgREVDc3RhdGlvbiBydW5uaW5nIFVsdHJpeC4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X19zdGFydAotCi1pZiBbIC16ICIkRU1CRURERUQiIF07IHRoZW4KLSAgdGVzdCAteiAiJFRFWFRfU1RBUlRfQUREUiIgJiYgVEVYVF9TVEFSVF9BRERSPSIweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTIgotZWxzZQotICB0ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4NDAwMDAwIgotZmkKLWlmIHRlc3QgIngkTERfRkxBRyIgPSAieG4iIC1vICJ4JExEX0ZMQUciID0gInhOIjsgdGhlbgotICBEQVRBX0FERFI9LgotZWxzZQotICB0ZXN0IC16ICIkREFUQV9BRERSIiAmJiBEQVRBX0FERFI9MHgxMDAwMDAwMAotZmkKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6IHsKLSAgICAke1JFTE9DQVRJTkcrIF9mdGV4dCA9IC4gfTsKLSAgICAqKC5pbml0KQotICAgICR7UkVMT0NBVElORysgZXByb2wgID0gIC59OwotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO30KLSAgICAqKC5yZWwuc2RhdGEpCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdG9wID0gLik7fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgID0gIC59OwotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9O30KLSAgLnJkYXRhIDogewotICAgICooLnJkYXRhKQotICB9Ci0gICR7UkVMT0NBVElORysgX2ZkYXRhID0gQUxJR04oMTYpO30KLSAgLmRhdGEgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7fQotICAubGl0OCA6IHsKLSAgICAqKC5saXQ4KQotICB9Ci0gIC5saXQ0IDogewotICAgICooLmxpdDQpCi0gIH0KLSAgLnNkYXRhIDogewotICAgICooLnNkYXRhKQotICB9Ci0gICR7UkVMT0NBVElORysgZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrIF9lZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORysgX2Zic3MgPSAuO30KLSAgLnNic3MgOiB7Ci0gICAgKiguc2JzcykKLSAgICAqKC5zY29tbW9uKQotICB9Ci0gIC5ic3MgOiB7Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjIGIvbGQvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyMmIzMy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIC5kYXRhIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORytlZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyA6Ci0gIHsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK2VuZCA9IC4gfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9udy5zYyBiL2xkL3NjcmlwdHRlbXBsL253LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU1MjJjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL253LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLSMKLSMgVW51c3VhbCB2YXJpYWJsZXMgY2hlY2tlZCBieSB0aGlzIGNvZGU6Ci0jCU5PUCAtIHR3byBieXRlIG9wY29kZSBmb3Igbm8tb3AgKGRlZmF1bHRzIHRvIDApCi0jCURBVEFfQUREUiAtIGlmIGVuZC1vZi10ZXh0LXBsdXMtb25lLXBhZ2UgaXNuJ3QgcmlnaHQgZm9yIGRhdGEgc3RhcnQKLSMJT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgLSBvdGhlciB0aGFuIC50ZXh0IC5pbml0IC5jdG9ycyAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuc2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5nbG9iYWwpCi0jCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAotIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgotIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKLSMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkudGV4dCBzZWN0aW9uLgotIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5kYXRhIHNlY3Rpb24uCi0jCU9USEVSX0JTU19TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuYnNzIHNlY3Rpb24gYmVzaWRlcyBfX2Jzc19zdGFydC4KLSMJREFUQV9QTFQgLSAucGx0IHNob3VsZCBiZSBpbiBkYXRhIHNlZ21lbnQsIG5vdCB0ZXh0IHNlZ21lbnQuCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLUlOVEVSUD0iLmludGVycCAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSAJfSIKLVBMVD0iLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkJfSIKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1JFTE9DQVRJTkcrLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICR7U1RBQ0taRVJPKyR7U1RBQ0taRVJPfX0gJHtTSExJQl9QQVRIKyR7U0hMSUJfUEFUSH19ICAqL30KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkctIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcwotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZwotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovfQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9ICsgU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gIC5oYXNoICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW5pdCkJfSA9JHtOT1AtMH0KLSAgJHtEQVRBX1BMVC0ke1BMVH19Ci0gIC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQotICAgICooLnRleHQpCi0gICAgJHtDT05TVFJVQ1RJTkcrCV9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysJTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCSooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysJTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysJX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCV9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysJTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCSooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysJTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysJX19EVE9SX0VORF9fID0gLjt9Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Ci0gIC5maW5pICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZmluaSkgICAgfSA9JHtOT1AtMH0KLSAgLmN0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHRvcnMpICAgfQotICAucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YSkgIH0KLSAgLnJvZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi0gQUxJR04oOCkgKyAke01BWFBBR0VTSVpFfX07fQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gIH0KLSAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TfX0KLSAgLmdvdCAgICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gIC5keW5hbWljICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0KLSAgJHtEQVRBX1BMVCske1BMVH19Ci0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YSkgfQotICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVkYXRhID0gLik7fQotICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX1NZTUJPTFN9fQotICAuc2JzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNic3MpICooLnNjb21tb24pIH0KLSAgLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIDt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0KLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgJHtSRUxPQ0FUSU5HfS4gICovCi0gICR7T1RIRVJfU0VDVElPTlN9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3BlLnNjIGIvbGQvc2NyaXB0dGVtcGwvcGUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTJkNDIuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvcGUuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBQRS4KLQotaWYgdGVzdCAteiAiJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0iOyB0aGVuCi0gIFJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWZpCi0KLSMgV2UgY2FuJ3QgZWFzaWx5IGFuZCBwb3J0YWJseSBnZXQgYW4gdW5xdW90ZWQgJCBpbiBhIHNoZWxsCi0jIHN1YnN0aXR1dGlvbiwgc28gd2UgZG8gdGhpcyBpbnN0ZWFkLgotIyBTb3J0aW5nIG9mIHRoZSAuZm9vJCogc2VjdGlvbnMgaXMgcmVxdWlyZWQgYnkgdGhlIGRlZmluaXRpb24gb2YKLSMgZ3JvdXBlZCBzZWN0aW9ucyBpbiBQRS4KLSMgU29ydGluZyBvZiB0aGUgZmlsZSBuYW1lcyBpbiBSX0lEQVRBIGlzIHJlcXVpcmVkIGJ5IHRoZQotIyBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGRsbHRvb2wgKHRoaXMgY291bGQgcHJvYmFibHkgYmUgY2hhbmdlZCB0bwotIyB1c2UgZ3JvdXBlZCBzZWN0aW9ucyBpbnN0ZWFkKS4KLWlmIHRlc3QgIiR7UkVMT0NBVElOR30iOyB0aGVuCi0gIFJfVEVYVD0nKihTT1JUKC50ZXh0JCopKScKLSAgUl9EQVRBPScqKFNPUlQoLmRhdGEkKikpJwotICBSX1JEQVRBPScqKFNPUlQoLnJkYXRhJCopKScKLSAgUl9JREFUQT0nCi0gICAgU09SVCgqKSguaWRhdGEkMikKLSAgICBTT1JUKCopKC5pZGF0YSQzKQotICAgIC8qIFRoZXNlIHplcm9lcyBtYXJrIHRoZSBlbmQgb2YgdGhlIGltcG9ydCBsaXN0LiAgKi8KLSAgICBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7Ci0gICAgU09SVCgqKSguaWRhdGEkNCkKLSAgICBTT1JUKCopKC5pZGF0YSQ1KQotICAgIFNPUlQoKikoLmlkYXRhJDYpCi0gICAgU09SVCgqKSguaWRhdGEkNyknCi0gIFJfQ1JUPScqKFNPUlQoLkNSVCQqKSknCi0gIFJfUlNSQz0nKihTT1JUKC5yc3JjJCopKScKLWVsc2UKLSAgUl9URVhUPQotICBSX0RBVEE9Ci0gIFJfUkRBVEE9Ci0gIFJfSURBVEE9Ci0gIFJfQ1JUPQotICBSX1JTUkM9Ci1maQotCi1jYXQgPDxFT0YKLSR7UkVMT0NBVElORytPVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pfQotJHtSRUxPQ0FUSU5HLU9VVFBVVF9GT1JNQVQoJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0pfQotJHtPVVRQVVRfQVJDSCtPVVRQVVRfQVJDSCgke09VVFBVVF9BUkNIfSl9Ci0KLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWShfbWFpbkNSVFN0YXJ0dXApCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAqKC50ZXh0KQotICAgICR7Ul9URVhUfQotICAgICooLmdsdWVfN3QpCi0gICAgKiguZ2x1ZV83KQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAvKiA/Pz8gV2h5IGlzIC5nY2NfZXhjIGhlcmU/ICAqLwotICAgICR7UkVMT0NBVElORysgKiguZ2NjX2V4Yyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCA9IC47fQotICAgICooLmdjY19leGNlcHRfdGFibGUpCi0gIH0KLQotICAvKiBUaGUgQ3lnd2luMzIgbGlicmFyeSB1c2VzIGEgc2VjdGlvbiB0byBhdm9pZCBjb3B5aW5nIGNlcnRhaW4gZGF0YQotICAgICBvbiBmb3JrLiAgVGhpcyB1c2VkIHRvIGJlIG5hbWVkICIuZGF0YSRub2NvcHkiLiAgVGhlIGxpbmtlciB1c2VkCi0gICAgIHRvIGluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0Ci0gICAgIGJyZWFrcyBidWlsZGluZyB0aGUgY3lnd2luMzIgZGxsLiAgSW5zdGVhZCwgd2UgbmFtZSB0aGUgc2VjdGlvbgotICAgICAiLmRhdGFfY3lnd2luX25vY29weSIgYW5kIGV4cGxpY3RseSBpbmNsdWRlIGl0IGFmdGVyIF9fZGF0YV9lbmRfXy4gKi8KLQotICAuZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOiAKLSAgewotICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICooLmRhdGEyKQotICAgICR7Ul9EQVRBfQotICAgICR7UkVMT0NBVElORytfX2RhdGFfZW5kX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGFfY3lnd2luX25vY29weSl9Ci0gIH0KLQotICAuYnNzICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX2VuZF9fID0gLiA7fQotICB9Ci0KLSAgLnJkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5yZGF0YSkKLSAgICAke1JfUkRBVEF9Ci0gICAgKiguZWhfZnJhbWUpCi0gIH0KLQotICAuZWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLmVkYXRhKQotICB9Ci0KLSAgL0RJU0NBUkQvIDoKLSAgewotICAgICooLmRlYnVnXCRTKQotICAgICooLmRlYnVnXCRUKQotICAgICooLmRlYnVnXCRGKQotICAgICooLmRyZWN0dmUpCi0gIH0KLQotICAuaWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIFRoaXMgY2Fubm90IGN1cnJlbnRseSBiZSBoYW5kbGVkIHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4KLQlTZWUgcGUuZW06c29ydF9zZWN0aW9ucy4gICovCi0gICAgJHtSX0lEQVRBfQotICB9Ci0gIC5DUlQgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICR7Ul9DUlR9Ci0gIH0KLQotICAuZW5kanVuayAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogZW5kIGlzIGRlcHJlY2F0ZWQsIGRvbid0IHVzZSBpdCAqLwotICAgICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9fID0gLjt9Ci0gIH0KLQotICAucmVsb2MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJlbG9jKQotICB9Ci0KLSAgLnJzcmMgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJzcmMpCi0gICAgJHtSX1JTUkN9Ci0gIH0KLQotICAuc3RhYiAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotCi0gIC5zdGFic3RyICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcHBjcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9wcGNwZS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmYmUzMy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9wcGNwZS5zYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0jIEEgUEUgbGlua2VyIHNjcmlwdCBmb3IgUG93ZXJQQy4KLSMgTG9vc2VseSBiYXNlZCBvbiBTdGV2ZSBDaGFtYmVybGFpbidzIHBlLnNjLgotIyBBbGwgbmV3IG1pc3Rha2VzIHNob3VsZCBiZSBjcmVkaXRlZCB0byBLaW0gS251dHRpbGEgKGtya0BjeWdudXMuY29tKQotIwotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotLyogTXVjaCBvZiB0aGlzIGxheW91dCB3YXMgZGV0ZXJtaW5lZCBieSBkZWx2aW5nIGludG8gLmV4ZSBmaWxlcyBmb3IKLSAgIHRoZSBib3ggZ2VuZXJhdGVkIGJ5IG90aGVyIGNvbXBpbGVycy9saW5rZXJzL2V0Yy4gVGhpcyBtZWFucyB0aGF0Ci0gICBpZiBhIHBhcnRpY3VsYXIgZmVhdHVyZSBkaWQgbm90IGhhcHBlbiB0byBhcHBlYXIgaW4gb25lIG9mIHRoZSAKLSAgIHN1YmplY3QgZmlsZXMsIHRoZW4gaXQgbWF5IG5vdCBiZSB5ZXQgc3VwcG9ydGVkLgotKi8KLQotLyogSXQncyAibWFpbkNSVFN0YXJ0dXAiLCBub3QgIl9tYWluQ1JUU3RhcnR1cCIsIGFuZCBpdCdzIGxvY2F0ZWQgaW4KLSAgIG9uZSBvZiB0aGUgdHdvIC5saWIgZmlsZXMgKGxpYmMubGliIGFuZCBrZXJuZWwzMi5saWIpIHRoYXQgY3VycmVudGx5Ci0gICBtdXN0IGJlIHByZXNlbnQgb24gdGhlIGxpbmsgbGluZS4gVGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0IHVzZSAKLSAgICItdSBtYWluQ1JUU3RhcnR1cCIgdG8gbWFrZSBzdXJlIGl0IGdldHMgaW5jbHVkZWQgaW4gdGhlIGxpbmsuCi0qLwotCi1FTlRSWShtYWluQ1JUU3RhcnR1cCkKLQotU0VDVElPTlMKLXsKLQotICAvKiB0ZXh0IC0gdGhlIHVzdWFsIG1lYW5pbmcgKi8KLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0JewotCSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpO30KLQkgICAgKigudGV4dCkKLQkgICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLQkgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJICAgICAgICBMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgICAgICAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLQkgICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKTt9Ci0JICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotCX0KLQotICAvKiByZGF0YSAtIFJlYWQgT25seSBSdW50aW1lIERhdGEKLSAgICAgQ1RSIHNlY3Rpb25zOiBBbGwgb2YgdGhlIENSVCAocmVhZCBvbmx5IEMgcnVudGltZSBkYXRhKSBzZWN0aW9ucyAKLQlhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSAucmRhdGEgKHJlYWQgb25seSBydW50aW1lIGRhdGEpIAotCXNlY3Rpb24sIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIuIERvbid0IGtub3cgaWYgaXQgbWF0dGVycyBvciBub3QuCi0JTm90IGFsbCBzZWN0aW9ucyBhcmUgYWx3YXlzIHByZXNlbnQgZWl0aGVyLgotICAgICAucmRhdGE6IGNvbXBpbGVyIGdlbmVyYXRlZCByZWFkIG9ubHkgZGF0YQotICAgICAueGRhdGE6IGNvbXBpbGVyIGdlbmVyYXRlZCBleGNlcHRpb24gaGFuZGxpbmcgdGFibGUuIChNb3N0IGRvY3MKLQlzZWVtIHRvIHN1Z2dlc3QgdGhhdCB0aGlzIHNlY3Rpb24gaXMgbm93IGRlcHJlY2F0ZWQgaW5mYXZvcgotCW9mIHRoZSB5ZGF0YSBzZWN0aW9uKQotICAgICAuZWRhdGE6IFRoZSBleHBvcnRlZCBuYW1lcyB0YWJsZS4KLSAgKi8KLSAgLnJkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsKLQkgICAgKiguQ1JUXCRYQ0EpOwotCSAgICAqKC5DUlRcJFhDQyk7Ci0JICAgICooLkNSVFwkWENaKTsKLQkgICAgKiguQ1JUXCRYSUEpOwotCSAgICAqKC5DUlRcJFhJQyk7Ci0JICAgICooLkNSVFwkWElaKTsKLQkgICAgKiguQ1JUXCRYTEEpOwotCSAgICAqKC5DUlRcJFhMWik7Ci0JICAgICooLkNSVFwkWFBBKTsKLQkgICAgKiguQ1JUXCRYUFgpOwotCSAgICAqKC5DUlRcJFhQWik7Ci0JICAgICooLkNSVFwkWFRBKTsKLQkgICAgKiguQ1JUXCRYVFopOwotCSAgICAqKC5yZGF0YSk7Ci0JICAgICooLnhkYXRhKTsKLQl9Ci0KLSAgLmVkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsKLSAgICAJICAgICooLmVkYXRhKTsKLQl9Ci0KLSAgLyogZGF0YSAtIGluaXRpYWxpemVkIGRhdGEKLSAgICAgLnlkYXRhOiBleGNlcHRpb24gaGFuZGxpbmcgaW5mb3JtYXRpb24uCi0gICAgIC5kYXRhOiB0aGUgdXN1YWwgbWVhbmluZy4KLSAgICAgLmRhdGEyOiBtb3JlIG9mIHRoZSBzYW1lLgotICAgICAuYnNzOiBGb3Igc29tZSByZWFzb24sIGJzcyBhcHBlYXJzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhCi0Jc2VjdGlvbiwgYXMgb3Bwb3NlZCB0byBiZWluZyBnaXZlbiBhIHNlY3Rpb24gb2YgaXQncyBvd24uCi0gICAgIENPTU1PTjoKLSAgKi8KLSAgLmRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6IAotCXsKLQkgICAgX19kYXRhX3N0YXJ0X18gPSAuIDsgCi0JICAgICooLnlkYXRhKTsKLQkgICAgKiguZGF0YSk7Ci0JICAgICooLmRhdGEyKTsKLQkgICAgX19ic3Nfc3RhcnRfXyA9IC4gOwotCSAgICAqKC5ic3MpIDsKLQkgICAgKihDT01NT04pOwotCSAgICBfX2Jzc19lbmRfXyA9IC4gOwotCSAgICAke1JFTE9DQVRJTkcrIGVuZCA9ICAufTsKLSAJICAgIF9fZGF0YV9lbmRfXyA9IC4gOyAKLQl9Ci0KLSAgLyogVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZS4gQSBzZXF1ZW5jZSBvZiA1IHdvcmQgZW50cmllcy4gU2VjdGlvbgotICAgICBhZGRyZXNzIGFuZCBleHRlbnQgYXJlIHBsYWNlZCBpbiB0aGUgRGF0YURpcmVjdG9yeS4KLSAgKi8KLSAgLnBkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgKigucGRhdGEpCi0gCSAgICA7Ci0JfQotCi0gIC8qIFRoZSBpZGF0YSBzZWN0aW9uIGlzIGNob2NrIGZ1bGwgb2YgbWFnaWMgYml0cy4gCi0JMS4gQm91bmRhcmllcyBhcm91bmQgdmFyaW91cyBpZGF0YSBwYXJ0cyBhcmUgdXNlZCB0byBpbml0aWFsaXplCi0JICAgc29tZSBvZiB0aGUgZmllbGRzIG9mIHRoZSBEYXRhRGlyZWN0b3J5LiBJbiBwYXJ0aWN1bGFyLCB0aGUKLQkgICBtYWdpYyBmb3IgMiwgNCBhbmQgNSBhcmUga25vd24gdG8gYmUgdXNlZC4gU29tZSBjb21waWxlcnMKLQkgICBhcHBlYXIgdG8gZ2VuZXJhdGUgbWFnaWMgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGlzIHB1cnBvc2UuCi0JICAgV2hlcmUgd2UgY2FuLCB3ZSBjYXRjaCBzdWNoIHN5bWJvbHMgYW5kIHVzZSBvdXIgb3duLiBUaGlzIG9mCi0JICAgY291cnNlIGlzIHNvbWV0aGluZyBsZXNzIHRoYW4gYSBwZXJmZWN0IHN0cmF0ZWd5LgotCTIuIFRoZSB0YWJsZSBvZiBjb250ZW50cyBpcyBwbGFjZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaWRhdGE0LgotCSAgIFRoZSAiLnByaXZhdGUudG9jIiBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBwcGMgYmZkLiBUaGUKLQkgICAudG9jIHZhcmlhYmxlIGlzIGdlbmVyYXRlZCBieSBnYXMsIGFuZCByZXNvbHZlZCBoZXJlLiBJdCBpcwotCSAgIHVzZWQgdG8gaW5pdGlhbGl6ZWQgZnVuY3Rpb24gZGVzY3JpcHRvcnMgKGFuZCBhbnlvbmUgZWxzZSB3aG8KLQkgICBuZWVkcyB0aGUgYWRkcmVzcyBvZiB0aGUgbW9kdWxlJ3MgdG9jKS4gVGhlIG9ubHkgdGhpbmcgCi0JICAgaW50ZXJlc3RpbmcgYWJvdXQgaXQgYXQgYWxsPyBNb3N0IHBwYyBpbnN0cnVjdGlvbnMgdXNpbmcgaXQKLQkgICBoYXZlIGEgMTZiaXQgZGlzcGxhY2VtZW50IGZpZWxkLiBUaGUgY29udmVudGlvbiBmb3IgYWRkcmVzc2luZwotCSAgIGlzIHRvIGluaXRpYWxpemUgdGhlIC50b2MgdmFsdWUgdG8gMzJLIHBhc3QgdGhlIHN0YXJ0IG9mIHRoZQotCSAgIGFjdHVhbCB0b2MsIGFuZCBzdWJ0cmFjdCAzMksgZnJvbSBhbGwgcmVmZXJlbmNlcywgdGh1cyB1c2luZwotCSAgIHRoZSBlbnRpcmUgNjRLIHJhbmdlLiBOYXR1cmFsbHksIHRoZSByZWxvYyBjb2RlIG11c3QgYWdyZWUKLQkgICBvbiB0aGlzIG51bWJlciBvciB5b3UgZ2V0IHByZXR0eSBzdHVwaWQgcmVzdWx0cy4KLSAgKi8KLSAgLmlkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgX19pZGF0YTJfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQyKTsKLQkgICAgX19pZGF0YTNfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQzKTsKLQkgICAgX19pZGF0YTRfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQ0KTsKLQkgICAgLiA9IEFMSUdOKDQpOwotCSAgICAudG9jID0gLiArIDMyNzY4OwotCSAgICAqKC5wcml2YXRlLnRvYyk7Ci0JICAgIF9faWRhdGE1X21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkNSk7Ci0JICAgIF9faWRhdGE2X21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkNik7Ci0JICAgIF9faWRhdGE3X21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkNyk7Ci0JICAgIDsKLQl9Ci0KLSAgLyogcmVsZGF0YSAtLSBkYXRhIHRoYXQgcmVxdWlyZXMgcmVsb2NhdGlvbgotICAqLwotICAucmVsZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgICooLnJlbGRhdGEpCi0gCSAgICA7Ci0JfQotCi0KLSAgLyogUmVzb3VyY2VzICovCi0gIC5yc3JjIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgKigucnNyY1wkMDEpCi0JICAgICooLnJzcmNcJDAyKQotCSAgICA7Ci0JfQotCi0gIC5zdGFiIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0KLSAgLnN0YWJzdHIgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci0KLSAgLyogVGhlIC5yZWxvYyBzZWN0aW9uIGlzIGN1cnJlbnRseSBnZW5lcmF0ZWQgYnkgdGhlIGRsbHRvb2wgZnJvbSBTdGV2ZSAKLSAgICAgQ2hhbWJlcmxhaW4gaW4gYSBzZWNvbmQgcGFzcyBvZiBsaW5raW5nLiBTZWN0aW9uIGFkZHJlc3MgYW5kIGV4dGVudAotICAgICBhcmUgcGxhY2VkIGluIHRoZSBEYXRhRGlyZWN0b3J5LgotICAqLwotICAucmVsb2MgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICAqKC5yZWxvYykKLQkgICAgOwotCX0KLQotICAvKiBXZSBkb24ndCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCBjb2RldmlldyBkZWJ1Z2dlciBzdXBwb3J0IG9yIHRoZQotICAgICBkaXJlY3RpdmUgc2VjdGlvbiAoeWV0KS4gSG9wZWZ1bGx5LCB3ZSBqdW5rIHRoZW0gY29ycmVjdGx5LiAKLSAgKi8KLSAgL0RJU0NBUkQvIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOiAKLQl7Ci0gICAgCSAgICAqKC5kZWJ1Z1wkUykKLSAgICAJICAgICooLmRlYnVnXCRUKQotICAgIAkgICAgKiguZGVidWdcJEYpCi0gICAgCSAgICAqKC5kcmVjdHZlKQotICAgIAkgICAgOwotICAgCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcHNvcy5zYyBiL2xkL3NjcmlwdHRlbXBsL3Bzb3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOGM2YzcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvcHNvcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORzotMH0gJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBzdGFydCA9IERFRklORUQoX1NUQVJUKSA/IF9TVEFSVCA6IERFRklORUQoX3N0YXJ0KSA/IF9zdGFydCA6IC47fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX3RleHQgPSAuKTt9Ci0gICAgKigudGV4dCk7Ci0gICAgKihjb2RlKTsKLSAgICAqKGNvbnN0KTsKLSAgICAqKHN0cmluZ3MpOwotICAgICoocFNPUyk7Ci0gICAgKihwUk9CRSk7Ci0gICAgKihwTkEpOwotICAgICoocEhJTEUpOwotICAgICoocFJFUEMpOwotICAgICoocFJQQyk7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCk7fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZXRleHQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9ldGV4dCA9IC4pO30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkc6LTB9IDogJHtSRUxPQ0FUSU5HKyBBVChBRERSKC50ZXh0KSArIFNJWkVPRigudGV4dCkpfSB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZGF0YSA9IC4pO30KLSAgICAqKC5kYXRhKTsKLSAgICAqKHZhcnMpOwotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2VkYXRhID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfZWRhdGEgPSAuKTt9Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkc6LTB9IDoKLSAgeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2JzcyA9IC4pO30KLSAgICAqKC5ic3MpOwotICAgICooemVyb3ZhcnMpOwotICAgICooQ09NTU9OKTsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19lYnNzID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX0ZyZWVNZW1TdGFydCA9IC4pO30KLSAgfQotICAuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgICooLnN0YWIpOwotICB9Ci0gIC5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICAqKC5zdGFic3RyKTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9yaXNjaXguc2MgYi9sZC9zY3JpcHR0ZW1wbC9yaXNjaXguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDFhMGMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvcmlzY2l4LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1JFTE9DQVRJTkcrX19EWU5BTUlDICA9ICAwO30KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotJHtTSExJQl9QQVRIKyR7UkVMT0NBVElORyske1NITElCX1BBVEh9fX0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19OgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICB9Ci0gIC5kYXRhICAke1JFTE9DQVRJTkcrJHtEQVRBX0FMSUdOTUVOVH19IDoKLSAgewotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfX2VkYXRhID0gIC47fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HK1NJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjI2N2UuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1FTlRSWShzdGFydCkKLQotU0VDVElPTlMgewotICAudGV4dCAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6IAotICAgIHsKLQkqKC50ZXh0KTsKLQkqKC50ZXh0MSk7Ci0JKigudGV4dDIpOwotCSR7UkVMT0NBVElORytfZXRleHQgPSAufTsKLSAgICB9Ci0gIC5saXQgQUxJR04oNCkgOgotICAgewotCSooLmxpdCk7Ci0JJHtSRUxPQ0FUSU5HK19lbGl0ID0gLn07Ci0gICB9Ci0gIC5kYXRhIEFMSUdOKDQpIDoKLSAgICB7Ci0JKiguZGF0YSk7Ci0JKiguZGF0YTEpOwotCSooLmRhdGEyKTsKLQkke1JFTE9DQVRJTkcrX2VkYXRhID0gLn07Ci0JJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotCSR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotCSR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotCSR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0JJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0JJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLQkke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLQkke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLQkke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotCSR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotCSR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgfQotCi0gIC5ic3MgIEFMSUdOKDQpIDoKLSAgICB7IAotCSooQ09NTU9OKSAJCi0JKiguYnNzKQotCSR7UkVMT0NBVElORytfZW5kID0gLn07Ci0gICAgfSAKLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc2guc2MgYi9sZC9zY3JpcHR0ZW1wbC9zaC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2ZGQyMS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zaC5zYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLVRPUlM9Ii50b3JzIDoKLSAgewotICAgIF9fX2N0b3JzID0gLiA7Ci0gICAgKiguY3RvcnMpCi0gICAgX19fY3RvcnNfZW5kID0gLiA7Ci0gICAgX19fZHRvcnMgPSAuIDsKLSAgICAqKC5kdG9ycykKLSAgICBfX19kdG9yc19lbmQgPSAuIDsKLSAgfSA+IHJhbSIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWQotewotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEyawotfQotCi1TRUNUSU9OUwotewotICAudGV4dCA6Ci0gIHsKLSAgICAqKC50ZXh0KQotICAgICooLnN0cmluZ3MpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gICR7Q09OU1RSVUNUSU5HKyR7VE9SU319Ci0gIC5kYXRhIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5ic3MgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7IH0KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLnN0YWNrICR7UkVMT0NBVElORysgMHgzMDAwMCB9ICA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0gICAgKiguc3RhY2spCi0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgICooLnN0YWIpCi0gIH0KLSAgLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgICooLnN0YWJzdHIpCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYmI3YWQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBTcGFyYyBDT0ZGLgotIyBCYXNlZCBvbiBpMzg2Y29mZi5zYyBieSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYyBiL2xkL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiMWUxZC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFNwYXJjIEx5bnhPUy4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc3QyMDAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvc3QyMDAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWUxMzJhLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3N0MjAwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0JICAqKC5zdHJpbmdzKQotICAgCSAgX2V0ZXh0ID0gLjsKLQkqKC5kYXRhKQotCV9lZGF0YSA9IC47Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSBfZW5kID0gLjsKLQotfQotCi19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGJhZWQzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLSR7UkVMT0NBVElORytQUk9WSURFIChfX3N0YWNrID0gMCk7fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9IC47fQotICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzIDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrX2VuZCA9IEFMSUdOKDQpIH07Ci0gICAke1JFTE9DQVRJTkcrX19lbmQgPSBBTElHTig0KSB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyZDRmNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goIiR7T1VUUFVUX0FSQ0h9IikKLQotTUVNT1JZCi17Ci0Jcm9tIDogT1JJR0lOID0gMHgwMDAwMDMwMCwgTEVOR1RIID0gMTZrCi0JcmFtIDogT1JJR0lOID0gMHgwMDAwMDMwMCArIDE2aywgTEVOR1RIID0gMTZrCi0JcmFtYmxrMCA6IE9SSUdJTiA9IDB4MDIwMjYwMDAsIExFTkdUSCA9IDB4MTAwMAotCXJhbWJsazEgOiBPUklHSU4gPSAweDAyMDI3MDAwLCBMRU5HVEggPSAweDEwMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgMHgwMDAwMDAwMCA6Ci17Ci0JKih2ZWN0b3JzKQotfQotCi0udGV4dCA6IAotewotCSooLnRleHQpCi19ID4gcm9tCi0KLS5jb25zdCA6Ci17Ci0JKiguY29uc3QpCi0JX19ldGV4dCA9IC4gOwotfSA+IHJvbQotCi0ubWRhdGEgOiBBVCggQUREUiguY29uc3QpICsgU0laRU9GKC5jb25zdCkgKQotewotCV9fZGF0YSA9IC4gOwotCSooLmRhdGEpOwotCV9fZWRhdGEgPSAuIDsKLX0gPiByYW0KLQotLmJzcyA6Ci17Ci0JX19ic3MgPSAuIDsKLQkqKC5ic3MpOwotCSooQ09NTU9OKTsKLQlfX2Vic3MgPSAuIDsKLX0gPiByYW0KLQotLnJhbTAgOgotewotCSoocmFtMCkKLX0gPiByYW1ibGswCi0KLS5yYW0xIDoKLXsKLQkqKHJhbTEpCi19ID4gcmFtYmxrMQotCi19Ci0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZmNjUzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgVEkgVE1TMzIwQzgwICh0aWM4MCkgQ09GRi4KLSMKLSMgQmVzaWRlcyB0aGUgc2hlbGwgdmFyaWFibGVzIHNldCBieSB0aGUgZW11bHBhcmFtcyBzY3JpcHQsIGFuZCB0aGUgTERfRkxBRwotIyB2YXJpYWJsZSwgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHdpbGwgc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGZvciBlYWNoCi0jIHRpbWUgdGhpcyBzY3JpcHQgaXMgcnVuIHRvIGdlbmVyYXRlIG9uZSBvZiB0aGUgbGlua2VyIHNjcmlwdHMgZm9yIGxkc2NyaXB0czoKLSMKLSMgUkVMT0NBVElORzogU2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgZ29pbmcgdG8gYmUgZG9pbmcKLSMgYSBmaW5hbCByZWxvY2F0aW9uLgotIwotIyBDT05TVFJVQ1RJTkc6IFNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGdvaW5nIHRvIGJlCi0jIGJ1aWxkaW5nIGdsb2JhbCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMuCi0jCi0jIERBVEFfQUxJR05NRU5UOiBTZXQgdG8gYW4gQUxJR04gZXhwcmVzc2lvbiB3aGVuIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHBhZ2UKLSMgYWxpZ25lZCwgb3IgdG8gIi4iIHdoZW4gZ2VuZXJhdGluZyB0aGUgLU4gc2NyaXB0LgotIwotIyBDUkVBVEVfU0hMSUI6IFNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiBnZW5lcmF0aW5nIGEgc2NyaXB0IGZvcgotIyB0aGUgLXNoYXJlZCBsaW5rZXIgYXJnLgotCi10ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4ODAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X19zdGFydAotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrICRURVhUX1NUQVJUX0FERFJ9IDogewotICAgICooLmluaXQpCi0gICAgKiguZmluaSkKLSAgICAqKC50ZXh0KQotICB9Ci0gIC5jb25zdCBBTElHTig0KSA6IHsKLSAgICAqKC5jb25zdCkKLSAgfQotICAuY3RvcnMgQUxJR04oNCkgOiB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIC4gPSBBTElHTig0KTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoLTEpfQotICAgICooLmN0b3JzKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gIH0KLSAgLmR0b3JzIEFMSUdOKDQpIDogewotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKC0xKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gIC5kYXRhIDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2VkYXRhICA9ICAufTsKLSAgfQotICAuYnNzIDogeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgICR7UkVMT0NBVElORysgX2VuZCA9IEFMSUdOKDB4OCl9OwotICAgICAke1JFTE9DQVRJTkcrIF9fZW5kID0gQUxJR04oMHg4KX07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC92ODUwLnNjIGIvbGQvc2NyaXB0dGVtcGwvdjg1MC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyMDk1NC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC92ODUwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLWNhdCA8PCBFT0YKLU9VVFBVVF9GT1JNQVQoImVsZjMyLXY4NTAiLCAiZWxmMzItdjg1MCIsCi0JICAgICAgImVsZjMyLXY4NTAiKQotT1VUUFVUX0FSQ0godjg1MCkKLUVOVFJZKF9zdGFydCkKLVNFQVJDSF9ESVIoLik7Ci0vKi9jcml0dGVycy9zbHVnL2dyb3NzbWFuL2luc3RhbGwvc3VuNC92ODUwLWVsZi9saWIqLwotU0VDVElPTlMKLXsKLSAgLyogVGhpcyBzYXZlcyBhIGxpdHRsZSBzcGFjZSBpbiB0aGUgRUxGIGZpbGUsIHNpbmNlIHRoZSB6ZGEgc3RhcnRzCi0gICAgIGF0IGEgaGlnaGVyIGxvY2F0aW9uIHRoYXQgdGhlIEVMRiBoZWFkZXJzIHRha2UgdXAuICAqLwotCi0gIC56ZGF0YSAke1pEQVRBX1NUQVJUX0FERFJ9IDogewotCSooLnpkYXRhKQotCSooLnpic3MpCi0JKihyZXN6ZGF0YSkKLQkqKC56Y29tbW9uKQotICB9Ci0KLSAgLyogVGhpcyBpcyB0aGUgcmVhZCBvbmx5IHBhcnQgb2YgdGhlIHplcm8gZGF0YSBhcmVhLgotICAgICBIYXZpbmcgaXQgYXMgYSBzZXBlcmF0ZSBzZWN0aW9uIHByZXZlbnRzIGl0cwotICAgICBhdHRyaWJ1dGVzIGZyb20gYmVpbmcgaW5oZXJpdGVkIGJ5IHRoZSB6ZGF0YQotICAgICBzZWN0aW9uLiAgU3BlY2lmaWNhbGx5IGl0IHByZXZlbnRzIHRoZSB6ZGF0YQotICAgICBzZWN0aW9uIGZyb20gYmVpbmcgbWFya2VkIFJFQURPTkxZLiAgKi8KLQotICAucm96ZGF0YSAke1JPWkRBVEFfU1RBUlRfQUREUn0gOiB7Ci0JKigucm96ZGF0YSkKLQkqKHJvbXpkYXRhKQotCSoocm9temJzcykKLSAgfQotCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gJHtURVhUX1NUQVJUX0FERFJ9OwotICAuaW50ZXJwCTogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2gJCTogeyAqKC5oYXNoKSB9Ci0gIC5keW5zeW0JOiB7ICooLmR5bnN5bSkgfQotICAuZHluc3RyCTogeyAqKC5keW5zdHIpIH0KLSAgLnJlbC50ZXh0CTogeyAqKC5yZWwudGV4dCkgfQotICAucmVsYS50ZXh0CTogeyAqKC5yZWxhLnRleHQpIH0KLSAgLnJlbC5kYXRhCTogeyAqKC5yZWwuZGF0YSkgfQotICAucmVsYS5kYXRhCTogeyAqKC5yZWxhLmRhdGEpIH0KLSAgLnJlbC5yb2RhdGEJOiB7ICooLnJlbC5yb2RhdGEpIH0KLSAgLnJlbGEucm9kYXRhCTogeyAqKC5yZWxhLnJvZGF0YSkgfQotICAucmVsLmdvdAk6IHsgKigucmVsLmdvdCkgfQotICAucmVsYS5nb3QJOiB7ICooLnJlbGEuZ290KSB9Ci0gIC5yZWwuY3RvcnMJOiB7ICooLnJlbC5jdG9ycykgfQotICAucmVsYS5jdG9ycwk6IHsgKigucmVsYS5jdG9ycykgfQotICAucmVsLmR0b3JzCTogeyAqKC5yZWwuZHRvcnMpIH0KLSAgLnJlbGEuZHRvcnMJOiB7ICooLnJlbGEuZHRvcnMpIH0KLSAgLnJlbC5pbml0CTogeyAqKC5yZWwuaW5pdCkgfQotICAucmVsYS5pbml0CTogeyAqKC5yZWxhLmluaXQpIH0KLSAgLnJlbC5maW5pCTogeyAqKC5yZWwuZmluaSkgfQotICAucmVsYS5maW5pCTogeyAqKC5yZWxhLmZpbmkpIH0KLSAgLnJlbC5ic3MJOiB7ICooLnJlbC5ic3MpIH0KLSAgLnJlbGEuYnNzCTogeyAqKC5yZWxhLmJzcykgfQotICAucmVsLnBsdAk6IHsgKigucmVsLnBsdCkgfQotICAucmVsYS5wbHQJOiB7ICooLnJlbGEucGx0KSB9Ci0gIC5pbml0CQk6IHsgS0VFUCAoKiguaW5pdCkpIH0gPTAKLSAgLnBsdAkJOiB7ICooLnBsdCkgfQotCi0gIC50ZXh0CQk6IHsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysqKC50ZXh0LiopfQotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwotICAgICooLmdudS53YXJuaW5nKQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgfSA9MAotCi0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotCi0gICAvKiBUaGlzIGlzIHNwZWNpYWwgY29kZSBhcmVhIGF0IHRoZSBlbmQgb2YgdGhlIG5vcm1hbCB0ZXh0IHNlY3Rpb24uCi0gICAgICBJdCBjb250YWlucyBhIHNtYWxsIGxvb2t1cCB0YWJsZSBhdCB0aGUgc3RhcnQgZm9sbG93ZWQgYnkgdGhlCi0gICAgICBjb2RlIHBvaW50ZWQgdG8gYnkgZW50cmllcyBpbiB0aGUgbG9va3VwIHRhYmxlLiAgKi8KLQotICAuY2FsbF90YWJsZV9kYXRhICR7Q0FMTF9UQUJMRV9TVEFSVF9BRERSfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERShfX2N0YnAgPSAuKTt9Ci0gICAgKiguY2FsbF90YWJsZV9kYXRhKQotICB9ID0gMHhmZiAgIC8qIGZpbGwgZ2FwcyB3aXRoIDB4ZmYgKi8KLSAgLmNhbGxfdGFibGVfdGV4dCA6IHsKLSAgICAqKC5jYWxsX3RhYmxlX3RleHQpCi0gIH0KLQotICAuZmluaQkJOiB7IEtFRVAgKCooLmZpbmkpKSAgICB9ID0wCi0gIC5yb2RhdGEJOiB7ICooLnJvZGF0YSkgJHtSRUxPQ0FUSU5HKyooLnJvZGF0YS4qKX0gKiguZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yb2RhdGExCTogeyAqKC5yb2RhdGExKSB9Ci0KLSAgLmRhdGEJCTogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGEuKil9Ci0gICAgKiguZ251LmxpbmtvbmNlLmQqKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIC5kYXRhMQk6IHsgKiguZGF0YTEpIH0KLSAgLmN0b3JzCTogewotICAgICR7UkVMT0NBVElORytfX19jdG9ycyA9IC47fQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKmNydGVuZCguY3RvcnMpKQotICAgICR7UkVMT0NBVElORytfX19jdG9yc19lbmQgPSAuO30KLSAgfQotCi0gIC5kdG9ycwk6IHsKLSAgICAke1JFTE9DQVRJTkcrX19fZHRvcnMgPSAuO30KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCpjcnRlbmQubyguZHRvcnMpKQotICAgICR7UkVMT0NBVElORytfX19kdG9yc19lbmQgPSAuO30KLSAgfQotCi0gIC5nb3QJCTogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMJOiB7ICooLmR5bmFtaWMpIH0KLQotICAudGRhdGEgJHtUREFUQV9TVEFSVF9BRERSfSA6IHsKLQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19lcCA9IC4pO30KLQkqKC50Ynl0ZSkKLQkqKC50Y29tbW9uX2J5dGUpCi0JKigudGRhdGEpCi0JKigudGJzcykKLQkqKC50Y29tbW9uKQotICB9Ci0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgJHtTREFUQV9TVEFSVF9BRERSfSA6IHsKLQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19ncCA9IC4gKyAweDgwMDApO30KLQkqKC5zZGF0YSkKLSAgIH0KLQotICAvKiBTZWUgY29tbWVudCBhYm91dCAucm96ZGF0YS4gKi8KLSAgLnJvc2RhdGEgJHtST1NEQVRBX1NUQVJUX0FERFJ9IDogewotCSooLnJvc2RhdGEpCi0gIH0KLQotICAvKiBXZSBwbGFjZSB0aGUgLnNic3MgZGF0YSBzZWN0aW9uIEFGVEVSIHRoZSAucm9zZGF0YSBzZWN0aW9uLCBzbyB0aGF0Ci0gICAgIGl0IGNhbiBkaXJlY3RseSBwcmVjZWVkIHRoZSAuYnNzIHNlY3Rpb24uICBUaGlzIGFsbG93cyBydW50aW1lIHN0YXJ0dXAKLSAgICAgY29kZSB0byBpbml0aWFsaXNlIGFsbCB0aGUgemVyby1kYXRhIHNlY3Rpb25zIGJ5IHNpbXBseSB0YWtpbmcgdGhlCi0gICAgIHZhbHVlIG9mICdfZWRhdGEnIGFuZCB6ZXJvaW5nIHVudGlsIGl0IHJlYWNoZXMgJ19lbmQnICAqLwotICAuc2JzcyA6IHsKLQkke1JFTE9DQVRJTkcrX19zYnNzX3N0YXJ0ID0gLjt9Ci0JKiguc2JzcykKLQkqKC5zY29tbW9uKQotICB9Ci0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSBERUZJTkVEIChfX3Nic3Nfc3RhcnQpID8gX19zYnNzX3N0YXJ0IDogLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSBfZWRhdGEpO30KLQotICAuYnNzICAgICAgIDoKLSAgewotCSR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IERFRklORUQgKF9fc2Jzc19zdGFydCkgPyBfX3Nic3Nfc3RhcnQgOiAuIDt9Ci0JJHtSRUxPQ0FUSU5HK19fcmVhbF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguZHluYnNzKQotCSooLmJzcykKLQkqKENPTU1PTikKLSAgfQotCi0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotCi0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAJCTogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAJCTogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMAkJOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAJOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwCQk6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwCTogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0gIC5jb21tZW50IDAJCTogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAJOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwCTogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMAk6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMAk6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMAk6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMAk6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwCTogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwCTogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAJOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAJOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwCTogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAJOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMAk6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAJOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAJOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAJOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAJOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0KLSAgLyogVXNlciBzdGFjayAqLwotICAuc3RhY2sgMHgyMDAwMDAJOiB7Ci0JJHtSRUxPQ0FUSU5HK19fc3RhY2sgPSAuO30KLQkqKC5zdGFjaykKLSAgfQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqLwotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjIGIvbGQvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5ODQ4MC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBOb3RoaW5nIHRvIGRvLgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdzY1LnNjIGIvbGQvc2NyaXB0dGVtcGwvdzY1LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTA0NDk1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3c2NS5zYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi1NRU1PUlkgewotCXJhbSAgIDogbyA9IDB4MTAwMCwgbCA9IDUxMmsKLQl9Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0JICAqKC5zdHJpbmdzKQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0KLS50b3JzICAgOiB7Ci0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAgJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotLmRhdGEgIDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyAgOgotCXsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9ICR7UkVMT0NBVElORysgPnJhbX0KLS5zdGFjayAke1JFTE9DQVRJTkcrIDB4MzAwMDAgfSAgOiAKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLnN0YWIgIC4gKE5PTE9BRCkgOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAuIChOT0xPQUQpIDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvejgwMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC96ODAwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4NzkzMC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC96ODAwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgiJHtPVVRQVVRfQVJDSH0iKQotRU5UUlkoX3N0YXJ0KQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDAwMDAwMDB9fSA6IHsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0JICAqKC5yZGF0YSkKLQl9Ci0KLS5jdG9ycyAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDIwMDAwMDB9fSAgOiAKLQl7Ci0JICAke1JFTE9DQVRJTkcrIF9fX2N0b3JzID0gLiA7ICB9Ci0JICAqKC5jdG9ycyk7Ci0JICAke1JFTE9DQVRJTkcrIF9fX2N0b3JzX2VuZCA9IC4gOyB9Ci0JICBfX19kdG9ycyA9IC4gOwotCSAgKiguZHRvcnMpOwotCSAgJHtSRUxPQ0FUSU5HKyBfX19kdG9yc19lbmQgPSAuIDsgfQotCX0gCi0KLS5kYXRhICR7QklHKyAke1JFTE9DQVRJTkcrIDB4MzAwMDAwMH19IDogewotCSooLmRhdGEpCi0JfQotCi0uYnNzICR7QklHKyAke1JFTE9DQVRJTkcrIDB4NDAwMDAwMH19IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLSAgICAqKC5ic3MpOwotICAgICooQ09NTU9OKTsKLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX2JzcyA9IC4gOyB9Ci0gIH0KLQotLmhlYXAgJHtCSUcrICR7UkVMT0NBVElORysgMHg1MDAwMDAwfX0gOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2hlYXAgPSAuIDsgfQotCSR7UkVMT0NBVElORysgLiA9IC4gKyAyMGsgIDsgfQotCSR7UkVMT0NBVElORysgX19lbmRfaGVhcCA9IC4gOyB9Ci0JfSAKLQotLnN0YWNrICR7UkVMT0NBVElORysgMHhmMDAwIH0gIDogCi0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQkke1JFTE9DQVRJTkcrIF9fc3RhY2tfdG9wID0gLiA7IH0KLQl9IAotCi19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc3RhbXAtaC5pbiBiL2xkL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvbGQvc3RhbXAtaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvbGQvc3lzZGVwLmggYi9sZC9zeXNkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjYzEyMi4uMDAwMDAwMAotLS0gYS9sZC9zeXNkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIHN5c2RlcC5oIC0tIGhhbmRsZSBob3N0IGRlcGVuZGVuY2llcyBmb3IgdGhlIEdOVSBsaW5rZXIKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERfU1lTREVQX0gKLSNkZWZpbmUgTERfU1lTREVQX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLWV4dGVybiBjaGFyICpzdHJzdHIgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotZXh0ZXJuIHZvaWQgZnJlZSAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLWV4dGVybiBjaGFyICpnZXRlbnYgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKExEX1NZU0RFUF9IKSAqLwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2xkL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZTI1NWIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0xOTk5LTA3LTA3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogQWRkIG5ldyB0ZXN0cyB2ZXJzMTcgdG8gdmVyczE5LgotCSogbGQvZWxmdmVycy97dmVyczE3LiosIHZlcnMxOC4qLCB2ZXJzMTkuKn06IE5ldyBmaWxlcy4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLWNoZWNrcy9hc20uczogVXNlIGEgc3ltYm9sIG5hbWUgZm9yIC5sY29tbS4KLQkqIGxkLWNoZWNrcy9jaGVja3MuZXhwOiBVc2UgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgdHdvIHRlc3RzLgotCURvbid0IGFkZCBleHRyYSB0ZXh0IHdoZW4gaW52b2tpbmcgZmFpbC4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvcGhkcnMuZXhwOiBDaGFuZ2UgdGFyZ2V0IGNoZWNrIGZyb20gIiotKi1saW51eGFvdXQqIgotCXRvICIqLSotbGludXgqYW91dCoiLgotCSogbGQtc2NyaXB0cy93ZWFrLmV4cDogTGlrZXdpc2UuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTGlrZXdpc2UuICBTaW1wbGlmeSBjb25kaXRpb24gYSBiaXQuCi0KLVdlZCBKdW4gIDkgMTI6MDI6MzMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2M6IEF2b2lkIGBpbXBsaWNpdCBpbnQnIHdhcm5pbmcuCi0JKiBsZC1zaGFyZWQvc2gxLmM6IEZpeCB0eXBvLgotCi0xOTk5LTA2LTA0ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxpYi9sZC1saWIuZXhwIChkZWZhdWx0X2xkX25tKTogQ2xlYXIgbm1fb3V0cHV0IGZpcnN0IGlmCi0JbmVjZXNzYXJ5LgotCi0xOTk5LTA1LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogQWRkIHhmYWlsIGZvciBtY29yZS1lbGYuCi0KLTE5OTktMDUtMTEgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEbyBub3QgcnVuIHRlc3RzIGZvciBQRSBiYXNlZCBwb3J0cy4KLQotMTk5OS0wMy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6IERvIG5vdCBydW4gdGVzdHMgZm9yIENPRkYgb3IgUEUKLQliYXNlZCBwb3J0cy4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlcyBmb3IgU3Ryb25nQVJNCi0JdGFyZ2V0cy4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIGV4cGVjdGVkIGZhaWx1cmVzIGZvciBTdHJvbmdBUk0gdGFyZ2V0cy4KLQotCSogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlIGZvciBBUk0tQ09GRgotCXRhcmdldHMuIAotCi0xOTk5LTAyLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1jaGVja3MvYXNtLnM6IFVzZSAubG9uZyBpbnN0ZWFkIG9mIC53b3JkLgotCVJlcGxhY2UgY3VzdG9tIHNlY3Rpb24gbmFtZXMgd2l0aCAudGV4dCwgLmRhdGEgYW5kIC5ic3MuCi0JKiBsZC1jaGVja3Mvc2NyaXB0OiBSZXBsYWNlIGN1c3RvbSBzZWN0aW9uIG5hbWVzIHdpdGggLnRleHQsIC5kYXRhCi0JYW5kIC5ic3MuIAotCSogbGQtY2hlY2tzL2NoZWNrcy5leHA6IFJlcGxhY2UgY3VzdG9tIHNlY3Rpb24gbmFtZXMgd2l0aCAudGV4dCwKLQkuZGF0YSBhbmQgLmJzcy4gCi0KLTE5OTktMDItMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLWNoZWNrczogTmV3IGRpcmVjdG9yeTogIFRlc3RzIGZvciB0aGUgbGlua2VyJ3MKLQktLWNoZWNrLXNlY3Rpb25zIG9wdGlvbi4KLQkqIGxkLWNoZWNrcy9jaGVja3MuZXhwOiBOZXcgZmlsZS4KLQkqIGxkLWNoZWNrcy9zY3JpcHQ6IEJvZ3VzIGxpbmtlciBzY3JpcHQuCi0JKiBsZC1jaGVja3MvYXNtLnM6IFNpbXBsZSB0ZXN0IGFzc2VtYmxlciBmaWxlLgotCi1UdWUgRmViICAyIDE5OjE1OjAyIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6ICBEaXNhYmxlIHRlc3QgZm9yIHVuc3VwcG9ydGVkCi0gICAgICAgIHRhcmdldHMuICBDaGFuZ2UgdGVzdHMgdG8gY2hlY2sgZm9yIGFic2VuY2Ugb2Ygc3ltYm9scyBpbnN0ZWFkCi0gICAgICAgIG9mIGFkZHJlc3MgemVyby4KLQotTW9uIEphbiAxOCAwMzo0NDo1MiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoZ2V0X2xpbmtfZmlsZXMpOiBRdW90ZSB0YXJnZXRfdHJpcGxldCBhbmQgQ0MKLQl3aGVuIGludm9raW5nIHNoZWxsLgotCShnZXRfdGFyZ2V0X2VtdWwpOiBMaWtld2lzZS4KLQotMTk5OS0wMS0wMyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoZ2V0X2xpbmtfZmlsZXMsIGdldF90YXJnZXRfZW11bCk6IE5ldyBwcm9jczsKLQlydW4gc2hlbGwgY29tbWFuZHMgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGNvbmZpZ3VyZS5ob3N0IGFuZAotCWNvbmZpZ3VyZS50Z3QgaW4gdGhlIHNvdXJjZSB0cmVlLgotCSh0b3AgbGV2ZWwpOiBVc2UgdGhlbSB0byBnZXQgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJ1biB0ZXN0cywgaWYKLQlub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotCi0JKiBsZC1zaGFyZWQvZWxmLW9mZnNldC5sZDogTmV3IGZpbGUuICBCdWlsZHMgYSBzaGFyZWQgbGlicmFyeSwgYnV0Ci0JZ2l2ZXMgbm9uLXplcm8gYWRkcmVzc2VzIGZvciBtZW1vcnkgcmVnaW9uLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0aGUgbm9uLVBJQyBub24tQUlYIHRlc3QgYWdhaW4gdXNpbmcKLQl0aGUgbmV3IGxpbmtlciBzY3JpcHQuCi0KLVR1ZSBEZWMgIDggMjI6NTY6MDUgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRGVsZXRlIHhmYWlscyBmb3IgUFBDIExpbnV4IHRhcmdldHMsCi0JbmV3ZXIgZ2xpYmMgbGV0cyBsaW5rIHN1Y2NlZWQuCi0KLVN1biBEZWMgIDYgMTI6NTk6MzcgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxLmM6IEFkZCBtaXNzaW5nIHJldHVybiB0eXBlcyBhbmQgdmFsdWVzLgotCSogbGQtZWxmdmVycy92ZXJzMi5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczMuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM0LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNS5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczYuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM3LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzOS5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczE1LmM6IExpa2V3aXNlLgotCi1GcmkgT2N0IDIzIDE2OjI4OjI5IDE5OTggQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGxkLXNlbGVjdGl2ZTogIE5ldyBkaXJlY3Rvcnkgd2l0aCBuZXcgZmlsZXMgdG8gdGVzdAotICAgICAgIHNlbGVjdGl2ZSBsaW5raW5nLgotCi0gICAgICAgKiBsaWIvbGQtbGliLmV4cCAobGRfbm0pOiAgU3RyaXAgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gJG5hbWUuCi0gICAgIAotU3VuIE9jdCAgNCAyMjoxNzowNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVyczE2LmRzeW06IFdvcmsgY29ycmVjdGx5IG9uIGEgc3lzdGVtIHdpdGhvdXQKLQl2ZXJzaW9uZWQgc3lzdGVtIGxpYnJhcmllcy4KLQotTW9uIFNlcCAyOCAyMTozMToxMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBSdW4gdGVzdHMgb24gYWxwaGEtbGludXguCi0JKiBsZC1lbGZ2ZXJzLyouc3ltLCBsZC1lbGZ2ZXJzLyouZHN5bTogQWRqdXN0IHBhdHRlcnMgdG8gbWF0Y2gKLQlBbHBoYSdzIHVzZSBvZiBzdF9vdGhlci4KLQotMTk5OC0wOS0yNyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHAgKHZlcnMxNiwgdmVyczE2YSk6IE5ldyB0ZXN0cy4KLQkqIGxkLWVsZnZlcnMve3ZlcnMxNi4qLCB2ZXJzMTZhLip9OiBOZXcgZmlsZXMuCi0KLVRodSBTZXAgMTcgMTc6MTg6MTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IE1ha2UgdW5kZWZpbmVkIGxpbmUgdGVzdCBiZSBhbiB4ZmFpbAotCWZvciBhcm0vdGh1bmIgZWxmIHRvb2xjaGFpbnMuCi0KLVdlZCBTZXAgIDkgMTQ6MTA6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IGNoYW5nZSB0ZXN0IGZvciBlbGYvZHdhcmYyIHRhcmdldHMuCi0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFybS1lbGYgbm93IHBhc3NlcyB0aGlzIHRlc3QuCi0KLVdlZCBBdWcgMTkgMTE6NTk6MTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIGFybS90aHVtYi1lbGYgZXhwZWN0ZWQgZmFpbHVyZXMuCi0JCi1UaHUgQXVnIDEzIDEyOjQxOjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IERvbid0IHJ1biB0aGUgLS1zdGF0aWMgYm9vdHN0cmFwCi0JdGVzdCBpZiB3ZSBkb24ndCBoYXZlIGEgc3RhdGljIGxpYmJmZC5hLgotCi1XZWQgQXVnIDEyIDE1OjE5OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlscyBmb3IgQWxwaGEgRUxGIHRhcmdldHMuCi0KLU1vbiBBdWcgMTAgMTU6NDI6MjAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy93ZWFrLnQgKC50ZXh0LCAuZGF0YSk6IEZvY3VzIGRhdGEgdG8gYmUgdXNlZC4KLQkoL0RJU0NBUkQvKTogQWxsIHRoZSByZXN0LgotCSogbGQtc2NyaXB0cy93ZWFrMS5zLCBsZC1zY3JpcHRzL3dlYWsyLnM6IFB1dCBzdHVmZiBpbiAuZGF0YS4KLQotRnJpIEp1bCAyNCAxODozNzoxNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogQ3JlYXRlIHRtcGRpci9nYXMgc3ViZGlyZWN0b3J5LCBhZGQgYQotCXN5bWxpbmsgdG8gYXMtbmV3LCBhbmQgc2V0IGdjY19nYXNfZmxhZyB2YXJpYWJsZS4KLQkqIGxpYi9sZC1saWIuZXhwIChkZWZhdWx0X2xkX2NvbXBpbGUpOiBJZiB0aGUgY29tcGlsZXIgYXBwZWFycyB0bwotCWJlIGdjYywgdXNlIGdjY19nYXNfZmxhZyB3aGVuIGNvbXBpbGluZy4KLQotVGh1IEp1bCAyMyAxMjoyMzoyOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IEp1c3QgY2hlY2sgZm9yIGk/ODYgcmF0aGVyIHRoYW4gY2hlY2tpbmcKLQlmb3IgaTM4NiwgaTQ4NiwgYW5kIGk1ODYuCi0JKG9iamR1bXBfdmVyc2lvbnN0dWZmKTogSWYgd2UgY2FuJ3QgZmluZCB0aGUgbGluZSwgZHVtcCB0aGUgZmlsZS4KLQotRnJpIEp1bCAgMyAwMDoyNzo0MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvcGhkcnMuZXhwOiBSdW4gdGVzdCBvbiAqLSotZWFiaSouCi0JKiBsZC1zY3JpcHRzL3dlYWsuZXhwOiBMaWtld2lzZS4KLQotV2VkIEp1bCAgMSAxMDo1MTo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgeGZhaWwgZm9yIHY4NTAuCi0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBhcm0gYW5kIHRodW1iIFBFIHRvb2xjaGFpbnMgbm93IHBhc3MKLQl0aGVzZSB0ZXN0cy4KLQotRnJpIEp1biAxOSAxNzoxMjo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvd2Vhay5leHA6IE5ldyB0ZXN0LgotCSogbGQtc2NyaXB0cy93ZWFrLnQ6IE5ldyBmaWxlLgotCSogbGQtc2NyaXB0cy93ZWFrMS5zOiBOZXcgZmlsZS4KLQkqIGxkLXNjcmlwdHMvd2VhazIuczogTmV3IGZpbGUuCi0KLVR1ZSBKdW4gMTYgMTI6NDA6MzggMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogUnVuIHRlc3RzIG9uIHBvd2VycGMgRUxGIHRhcmdldHMuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxLmRzeW06IEFsbG93IGZvciAuc2RhdGEuCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBQb3dlclBDIExpbnV4LgotCi1GcmkgTWF5IDI5IDE1OjAyOjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlscyBmb3IgcG93ZXJwYyotKi1lYWJpLgotIAkocnVuX3NyZWNfdGVzdCk6IE9uIG1uMTAyMDAsIGRlZmluZSBfX3RydW5jc2lwc2kyX2RvX2QyLgotCSogbGQtc3JlYy9zcjEuYyAoX19tYWluKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIHZvaWQuCi0JKiBsZC1zcmVjL3NyMy5jYyAoX19tYWluKTogTGlrZXdpc2UuCi0JKF9fYnVpbHRpbl9kZWxldGUsIF9fYnVpbHRpbl9uZXcpOiBMaWtld2lzZS4KLQkoX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluKTogUmV0dXJuIDAuCi0JKF9fZ2V0X2VoX2NvbnRleHQpOiBMaWtld2lzZS4KLQotVGh1IE1heSAyMSAxNToyMTozMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogQWRkIHN1cHBvcnQgZm9yIHRodW1iLXBlIHRhcmdldC4KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzdXBwb3J0IGZvciBhcm0tcGUgYW5kIHRodW1iLXBlIHRhcmdldHMuCi0KLU1vbiBNYXkgIDQgMTc6NTQ6MjAgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWxzIGZvciBtNjhrLWxpbnV4LgotCi1Nb24gTWF5ICA0IDE3OjEyOjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkL21haW4uYyAoc2hsaWJfb3ZlcnJpZGRlbmNhbGwyKTogTmV3IGZ1bmN0aW9uLgotCShtYWluKTogQ2FsbCBzaGxpYl9zaGxpYmNhbGwyLgotCSogbGQtc2hhcmVkL3NoMS5jIChzaGxpYl9zaGxpYmNhbGwyKTogTmV3IGZ1bmN0aW9uLgotCShzaGxpYl9vdmVycmlkZGVuY2FsbDIpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmRhdDogQWRkIG91dHB1dCBsaW5lIGZvciBuZXcgdGVzdC4KLQkqIGxkLXNoYXJlZC9zdW40LmRhdDogTGlrZXdpc2UuCi0KLQkqIGxkLXNyZWMvc3IzLmNjIChfX2dldF9laF9jb250ZXh0KTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgQXByICA3IDEyOjUwOjE3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC1mb28uaCAoY2xhc3MgRm9vKTogRGVjbGFyZSBsZW4gdG8gYmUgc3RhdGljIHRvCi0JYXZvaWQgY29tcGlsZXIgd2FybmluZy4KLQkqIGxkLXNyZWMvc3IzLmNjIChjbGFzcyBGb28pOiBMaWtld2lzZS4KLQotVHVlIEZlYiAxMCAxNjo0Mjo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3IzLmNjIChfX2dldF9keW5hbWljX2hhbmRsZXJfY2hhaW4pOiBOZXcgZnVuY3Rpb24uCi0KLU1vbiBGZWIgIDIgMTQ6MTc6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3BoZHJzLmV4cDogQWRqdXN0IHBoZHJzX3JlZ2V4cCBmb3IgYSA2NCBiaXQgdGFyZ2V0LgotCi1UaHUgRGVjIDE4IDExOjEzOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IER1cGxpY2F0ZWQgQXJtIHBhdGNoIGZvciBUaHVtYiB0YXJnZXRzLgotCi1UdWUgRGVjICAyIDA5OjUwOjE5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFwcGxpZWQgcGF0Y2ggZnJvbSBUb255LlRob21wc29uQGFybS5jb20gd2hpY2gKLQlmaXhlcyBBUk0gdGVzdHMuCi0KLU1vbiBEZWMgIDEgMTY6MTI6MDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIGV4cGVjdGVkIGZhaWx1cmVzIG9mIHRlc3RzIDEgYW5kIDIgZm9yIEFSTQotCWNvZmYgdGFyZ2V0cy4KLQotV2VkIE5vdiAxMiAxNDoxODozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QtZm9vLmggKGNsYXNzIEZvbyk6IERlY2xhcmUgbGVuIHRvIGJlIGludCB0bwotCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCi0JKiBsZC1zcmVjL3NyMy5jYyAoY2xhc3MgRm9vKTogTGlrZXdpc2UuCi0KLU1vbiBOb3YgMTAgMTQ6MjU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvbGQtbGliLmV4cCAoZGVmYXVsdF9sZF9zaW1wbGVfbGluayk6IFBlcm1pdCB0aGUgbGlua2VyIHRvCi0JaGF2ZSBhbnkgbmFtZSB3aGVuIGxvb2tpbmcgZm9yIGVudHJ5IHN5bWJvbCB3YXJuaW5ncy4KLQotCSogbGQtc3JlYy9zcjMuY2MgKF9fZWhfcGMpOiBEZWZpbmUuCi0KLU1vbiBPY3QgMjAgMTQ6MzY6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyMy5jYzogQWRkIGRlZmluaXRpb25zIGZvciB0ZXJtaW5hdGUsIF9fdGVybWluYXRlLCBhbmQKLSAJX190aHJvdywgc2luY2UgdGhlIGN1cnJlbnQgZysrIGV4cGVjdHMgdGhlbSB0byBiZSBkZWZpbmVkLgotCi1GcmkgT2N0ICAzIDEyOjI0OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cCAob2JqZHVtcF9lbXB0eXZlcnN0dWZmKTogQWNjZXB0IHRoZSBvdXRwdXQKLQlmaWxlIGlmIHRoZSBzdHJpbmcgbGliYyBhcHBlYXJzIGluIGl0LgotCShvYmpkdW1wX3ZlcnNpb25zdHVmZik6IEFjY2VwdCB1bmV4cGVjdGVkIGxpbmVzIGluIHRoZSBvdXRwdXQKLQlmaWxlLiAgQ29tcGFyZSBsaW5lcyB1c2luZyBzdHJpbmcgbWF0Y2guCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM2LnZlcjogUGVybWl0IGFueSB2YWx1ZSBpbiB0aGUgdm5hX290aGVyIGZpZWxkLgotCi1UdWUgQXVnIDEyIDE2OjAxOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IENvcnJlY3Qgc3RyaW5nIHF1b3RpbmcuCi0KLVNhdCBBdWcgIDkgMDA6NTY6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IENoYW5nZSBsZCwgYXMsIG5tIGFuZCBzdHJpcCBmcm9tIC5uZXcgdG8KLQktbmV3LiAgTG9hZCBsZC1saWIuZXhwIHJhdGhlciB0aGFuIGxkLmV4cC4KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBVc2UgbGQtbmV3IHJhdGhlciB0aGFuIGxkLm5ldy4KLQkqIGxpYi9sZC1saWIuZXhwOiBSZW5hbWUgZnJvbSBsaWIvbGQuZXhwLCBmb3IgdGhlIGJlbmVmaXQgb2YKLQlEZWphR251IGNoYW5nZXMuCi0KLVRodSBKdW4gMjYgMTI6MDc6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBVc2UgZWdyZXAgcmF0aGVyIHRoYW4gZ3JlcCB3aGVuIGxvb2tpbmcgZm9yCi0JYW4gYWx0ZXJuYXRpb24uICBGcm9tIEdyZWcgTWFyZ28gPGdtYXJnb0BkbC5jb20+LgotCi1XZWQgSnVuIDI1IDEyOjQ3OjIyIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBtNjhrLWxpbnV4IG9uIHRlc3RzCi0Jd2l0aCBub24gUElDIHNoYXJlZCBsaWJyYXJpZXMuCi0KLUZyaSBKdW4gIDYgMTc6MzU6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM2LnZlcjogVXBkYXRlIGZvciByZWNlbnQgZWxmbGluay5oIHBhdGNoIHRvCi0JdmVyc2lvbiBoYW5kbGluZy4KLQotV2VkIEp1biAgNCAxMjowNjo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERlZmluZSBfX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluIGFzIHdlbGwuCi0KLUZyaSBNYXkgMzAgMTI6MjE6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEZWZpbmUgX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluIHdoZW4KLQlsaW5raW5nLgotCi1Nb24gTWF5IDEyIDExOjE3OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBVc2UgJGJhc2VfZGlyIHJhdGhlciB0aGFuICRvYmpkaXIgd2hlbgotCXNldHRpbmcgbGQuICBGcm9tIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4uCi0KLUZyaSBBcHIgMjUgMDk6MDc6MDAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEZWZpbmUgdmFyaW91cyBvdXQgb2YgbGluZSBwcm9sb2d1ZS9lcGlsb2d1ZQotCWZ1bmN0aW9ucyBmb3IgdGhlIG1uMTAyMDAgdG8gYXZvaWQgbmVlZGluZyBsaWJnY2MuYS4KLQotV2VkIE1hciAyNiAxMzo1NjoxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERvbid0IGV4cGVjdCBmYWlsdXJlcyBvbiBtaXBzKi0qLWVsZiouCi0KLU1vbiBNYXIgMTcgMTk6Mjc6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBEb24ndCBydW4gb24gU3VuT1Mgb3IgQUlYLgotCi1XZWQgTWFyIDEyIDIxOjQ0OjE5IDE5OTcgIEVyaWMgWW91bmdkYWxlICA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHAsICo6IE5ldyB0ZXN0cyBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCBhciBhbmQgc3RyaXAuCi0KLUZyaSBGZWIgIDcgMTY6NDc6MDIgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBVc2UgcHJ1bmVfd2FybmluZ3MgaW5zdGVhZCBvZgotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IERpdHRvLgotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IERpdHRvLgotCSogbGQtc2gvc2guZXhwOiBEaXR0by4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBEaXR0by4KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERpdHRvLgotCSogbGliL2xkLmV4cDogRGl0dG8uCi0KLVdlZCBKYW4gMjkgMDA6NDc6MjkgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBQdXQgYSBzbGFzaCBiZXR3ZWVuICRzcmNkaXIvJHN1YmRpci4KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogRGl0dG8uCi0JKiBsZC1zaC9zaC5leHA6IERpdHRvLgotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IERpdHRvLgotCSogbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwOiBEaXR0by4KLQkqIGxpYi9sZC5leHA6IERpdHRvLgotCi1Nb24gRGVjIDMwIDE3OjA4OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IEZpeCBxdW90aW5nIGZvciAtLWRlZnN5bSAkZ2xvYmFsJC4KLQotVHVlIE9jdCAgMSAxNTo1MjozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfdmVyc2lvbik6IEZpeCBmb3IgY3VycmVudCB2ZXJzaW9uCi0JcHJpbnRpbmcuCi0KLUZyaSBTZXAgMTMgMTU6NTE6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogRGVmaW5lICRnbG9iYWwkIGZvciBocHBhLWVsZi4KLQotVGh1IEF1ZyAgOCAxNDoyOTozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3MyLnQ6IE1hcCBYQ09GRiBzZWN0aW9ucyB0byAudGV4dCBvciAuZGF0YS4KLQotCSogbGliL2xkLmV4cDogVXNlIHZlcmJvc2UgLWxvZyBpbnN0ZWFkIG9mIGNhbGxpbmcgYm90aCB2ZXJib3NlIGFuZAotCXNlbmRfbG9nLgotCi1XZWQgQXVnICA3IDE4OjAwOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9waGRycy5leHA6IE5ldyB0ZXN0LgotCSogbGQtc2NyaXB0cy9waGRycy5zLCBsZC1zY3JpcHRzL3BoZHJzLnQ6IE5ldyBmaWxlcy4KLQotU3VuIEF1ZyAgNCAyMTo1ODoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBPbiBhMjlrIHRhcmdldHMsIHVzZSAtLWRlZnN5bSB0byBkZWZpbmUKLQlWX1NQSUxMIGFuZCBWX0ZJTEwuCi0KLVRodSBBdWcgIDEgMTQ6MTA6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogTmV3IHRlc3QuCi0JKiBsZC1zY3JpcHRzL3tjcm9zczEuYywgY3Jvc3MyLmMsIGNyb3NzMy5jfTogTmV3IGZpbGVzLgotCSogbGQtc2NyaXB0cy97Y3Jvc3MxLnQsIGNyb3NzMi50fTogTmV3IGZpbGVzLgotCi1TYXQgSnVuIDI5IDEzOjQwOjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2gvc2guZXhwOiBGaXggZGVidWdnaW5nIG1lc3NhZ2VzLgotCSogbGQtc2gvc2gxLnM6IFVzZSAuYWxpZ24gNC4KLQotV2VkIE1heSAgMSAxNjo0NToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoL3NoLmV4cDogVXNlIC1PIHdoZW4gY29tcGlsaW5nIHdpdGggLW1yZWxheC4KLQotTW9uIEFwciAyOSAxMDozMzoxMCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0aGUgc2hhcmVkIGxpYnJhcnkgdGVzdHMgb24KLSAJTGludXgvbTY4ay4KLQotRnJpIEFwciAgNSAxNjoyMDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIHNoYXJlZCBsaWJyYXJ5IHRlc3RzIG9uIExpbnV4LgotCi1Nb24gRmViIDI2IDEyOjQ1OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IERvbid0IHVzZSAtZnBpYyBvbiBNSVBTIHRhcmdldHMuCi0KLVdlZCBKYW4gMzEgMTU6MDk6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgeGZhaWxzIGZvciBocHBhKi0qLSplbGYqLgotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IExpa2V3aXNlLgotCi1GcmkgSmFuIDI2IDE4OjQzOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEVMRiB0YXJnZXRzIHNob3VsZCBub3cgcGFzcyB0aGUKLQl1bmRlZmluZWQgbGluZSB0ZXN0LgotCi1UaHUgSmFuIDI1IDE1OjM2OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZW1waWMvZW1waWMuZXhwOiBVcGRhdGUgZm9yIGNoYW5nZSB0byBNSVBTIGRpc2Fzc2VtYmxlci4KLQotTW9uIEphbiAxNSAxNTowNTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBFeHBlY3QgZmFpbHVyZSBmb3IgbWlwcyotKi1pcml4NSoKLQl3aGVuIGRvaW5nIHRoZSAtLXN0YXRpYyB0ZXN0LgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0ZXN0cyBvbiBtaXBzKi0qLWlyaXg1Ki4KLQotRnJpIERlYyAyOSAxMjozMzowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBPbiBBSVgsIGRvbid0IHBhc3MgdGhlIC1iSSBvcHRpb24KLQl3aGVuIGNyZWF0aW5nIGxkLXBhcnRpYWwuby4KLQotVHVlIERlYyAyNiAxNzozNzoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IElmIHBvd2VycGMqLSotZWFiaSosIHVzZSAtLWRlZnN5bSB0byBkZWZpbmUKLQlfX2VhYmkuCi0KLVR1ZSBEZWMgMTkgMTg6MDE6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBYQ09GRiB0YXJnZXRzLgotCi1GcmkgRGVjIDE1IDE2OjM2OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogT24gYTI5ayB0YXJnZXRzLCB1c2UgLS1kZWZzeW0gdG8gZGVmaW5lCi0JVl9TUElMTCBhbmQgVl9GSUxMLgotCSogbGQtc3JlYy9zcjEuYyAoVl9TUElMTCwgVl9GSUxMKTogUmVtb3ZlIGRlZmluaXRpb25zLgotCSogbGQtc3JlYy9zcjMuY2M6IExpa2V3aXNlLgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBSZW1vdmUgaTk2MCBDT0ZGIHNldHVwX3hmYWlsLgotCi1TYXQgRGVjICAyIDAxOjIwOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRG9uJ3QgdXNlIFtdIGluIHNldHVwX3hmYWlsIGV4cHJlc3Npb25zLgotCi1GcmkgRGVjICAxIDEzOjE4OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgTUlQUyBFTEYgdGFyZ2V0cy4KLQotV2VkIE5vdiAyOSAxMzowMToxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgaTk2MCBDT0ZGIHRhcmdldHMuCi0KLU1vbiBOb3YgMjcgMTQ6MzY6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWwgY2FsbHMgZm9yIGlbMzQ1XTg2LSotYW91dCouCi0KLQkqIGxkLXNyZWMvc3IxLmMgKFZfU1BJTEwsIFZfRklMTCk6IERlZmluZS4KLQkqIGxkLXNyZWMvc3IzLmNjOiBMaWtld2lzZS4KLQotVHVlIE5vdiAyMSAxNjowNTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogVXBkYXRlIGZvciBjaGFuZ2VzIGluIG9iamR1bXAgb3V0cHV0LgotCi1XZWQgTm92IDE1IDE3OjQyOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogTmV3IHRlc3RzLgotCSogbGQtc3JlYy9zcjEuYywgbGQtc3JlYy9zcjIuYywgbGQtc3JlYy9zcjMuY2M6IE5ldyBmaWxlcy4KLQkqIGxpYi9sZC5leHAgKGxkX3NpbXBsZV9saW5rKTogRGlzY2FyZCB3YXJuaW5ncyBhYm91dCBub3QgYmVpbmcKLQlhYmxlIHRvIGZpbmQgdGhlIGVudHJ5IHN5bWJvbC4KLQotVHVlIE5vdiAxNCAyMDowMzo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoL3NoMi5jIChfX21haW4pOiBEZWZpbmUuCi0KLU1vbiBOb3YgIDYgMTQ6Mzk6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IEFjY2VwdCBhIC4gaW4gdGhlIGFkZHJlc3Mgc3ltYm9sLgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRlc3RzIG9uIHJzNjAwMCotKi1haXgqIGFuZAotCXBvd2VycGMqLSotYWl4Ki4gIEFkZCBjb2RlIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBleHBvcnRzIGZpbGVzLAotCWFuZCBwYXNzIGFwcHJvcHJpYXRlIGNvbXBpbGF0aW9uIGZsYWdzLCBhbmQgdGVzdCBhZ2FpbnN0Ci0JYXBwcm9wcmlhdGUgZXhwZWN0ZWQgb3V0cHV0LgotCSogbGQtc2hhcmVkL3hjb2ZmLmRhdDogTmV3IGZpbGUuCi0JKiBsZC1zaGFyZWQvbWFpbi5jOiBQdXQgI2lmbmRlZiBYQ09GRl9URVNUIGFyb3VuZCB0ZXN0cyB0aGF0IGNhbgotCW5vdCBiZSBsaW5rZWQgdXNpbmcgWENPRkYuICBVc2Ugc2hsaWJfc2hsaWJ2YXIxIGFzIGEgc2FtcGxlCi0JZnVuY3Rpb24gcG9pbnRlciwgcmF0aGVyIHRoYW4gc2hsaWJfbWFpbnZhci4KLQkqIGxkLXNoYXJlZC9zaDEuYzogTGlrZXdpc2UuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmRhdDogVXBkYXRlIGZvciBjaGFuZ2UgZnJvbSB1c2luZyBzaGxpYl9tYWludmFyCi0JdG8gdXNpbmcgc2hsaWJfc2hsaWJ2YXIxLgotCSogbGQtc2hhcmVkL3N1bjQuZGF0OiBMaWtld2lzZS4KLQotU2F0IE9jdCAyOCAwMTo1NDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LnQ6IFB1dCAucHIgaW4gLnRleHQsIGFuZCAucncgaW4gLmRhdGEsIGZvcgotCWNvbnZlbmllbmNlIHdoZW4gdGVzdGluZyBYQ09GRi4KLQotVGh1IE9jdCAyNiAyMjo1MzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBPbiBBSVgsIHBhc3MgLWJJL2xpYi9zeXNjYWxscy5leHAKLQlhbG9uZyB3aXRoIC0tc3RhdGljLgotCi0JKiBsZC1zY3JpcHRzL3NjcmlwdC5zOiBNYWtlIHN5bWJvbHMgZ2xvYmFsLgotCi1GcmkgT2N0IDIwIDEyOjIyOjE2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIGFybSotKi1wZSouCi0KLUZyaSBTZXAgMjkgMTE6MDY6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogVXNlIC1lIHdoZW4gaW52b2tpbmcgdGhlIGxpbmtlciwgdG8KLQlwcmV2ZW50IHRoZSBTdW5PUyBsaW5rZXIgZnJvbSB0cnlpbmcgdG8gY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuCi0KLVRodSBTZXAgMjggMTI6Mzc6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRoZSB0ZXN0cyBvbiBzcGFyYyotKi1zdW5vczQqLiAgQWRkCi0JYXBwcm9wcmlhdGUgbW9kaWZpY2F0aW9ucyBhbmQgc2V0dXBfeGZhaWxzLgotCSogbGQtc2hhcmVkL3N1bjQuZGF0OiBOZXcgZmlsZS4KLQotTW9uIFNlcCAxOCAxNDoxMjo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfdmVyc2lvbik6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQuCi0JKGRlZmF1bHRfbGRfcmVsb2NhdGUsIGRlZmF1bHRfbGRfbGluayk6IExpa2V3aXNlLgotCShkZWZhdWx0X2xkX3NpbXBsZV9saW5rLCBkZWZhdWx0X2xkX2NvbXBpbGUpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9sZF9hc3NlbWJsZSwgZGVmYXVsdF9sZF9ubSk6IExpa2V3aXNlLgotCi1GcmkgU2VwICA4IDE3OjE1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IElmIHRoZSBjb21waWxlciBkb2VzIG5vdCBleGlzdCwgbWFyayB0aGUKLQl0ZXN0cyBhcyB1bnRlc3RlZCByYXRoZXIgdGhhbiB1bnJlc29sdmVkLgotCi1XZWQgQXVnIDIzIDEwOjQ2OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGQtc2gvc2guZXhwOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkIG9uIHRoZSBvdXRwdXQgb2YgY21wLgotCi1UdWUgQXVnIDE1IDE3OjM1OjM1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9zY3JpcHQuZXhwOiBTcGxpdCBzY3JpcHQgdmVyaWZpY2F0aW9uIGludG8gYSBwcm9jLgotCUFkZCBzaW1wbGUgdGVzdCBvZiBNUkkgc2NyaXB0LgotCSogbGQtc2NyaXB0cy9zY3JpcHRtLnQ6IE5ldyBmaWxlLgotCi1XZWQgSnVsIDI2IDExOjM4OjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2gvc2guZXhwOiBNYXJrIGBTSCBjb25maXJtIHJlbGF4aW5nJyB0ZXN0IHVucmVzb2x2ZWQgd2hlbgotCWFwcHJvcHJpYXRlLgotCi1Nb24gSnVsIDI0IDE1OjM0OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBEZWZpbmUgb2JqY29weSBpZiBpdCBpcyBub3QgZGVmaW5lZC4KLQkqIGxkLXNoLyo6IE5ldyB0ZXN0cyBmb3IgU0ggcmVsYXhpbmcuCi0KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogSWYgJENDIGRvZXMgbm90IGV4aXN0LCBjYWxsIHVudGVzdGVkIHJhdGhlcgotCXRoYW4gdW5yZXNvbHZlZC4KLQotVGh1IEp1bCAyMCAxNTowOToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBJZiAkQ0MgZG9lcyBub3QgZXhpc3QsIG1hcmsgdGhlCi0JdGVzdHMgYXMgdW50ZXN0ZWQgcmF0aGVyIHRoYW4gdW5yZXNvbHZlZC4gIENsZWFyIEVMRiB4ZmFpbHMgZm9yCi0JbWlwcyosIG5vdCBqdXN0IG1pcHMuCi0KLVR1ZSBKdWwgMTggMTI6MDA6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBzaC0qLSogZm9yCi0JdW5kZWZpbmVkIGxpbmUgdGVzdC4KLQotRnJpIEp1bCAxNCAxMzowNzo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBOZXcgdGVzdCwgdG8gY2hlY2sgcmVwb3J0aW5nIG9mCi0JdW5kZWZpbmVkIHN5bWJvbHMuCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmM6IE5ldyBmaWxlLgotCi1Nb24gSnVsIDEwIDExOjEzOjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwOiBJZiBhIHRlc3QgZmFpbHMsIHJlcG9ydCBpdCBjb3JyZWN0bHk6Ci0JZG9uJ3QgdHJ5IHRvIHJ1biB0aGUgbmV4dCB0ZXN0LCBhbmQgZG9uJ3QgcmVwb3J0IGEgcGFzcyBhcyB3ZWxsIGFzCi0JYSBmYWlsLgotCi1Nb24gSnVsICAzIDE0OjI2OjM3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkL3Rlc3RzdWl0ZS92ZXJzYWRvcy8odDEsdDIpLmxkOiBFbmQgaW4gbmV3bGluZXMuCi0KLU1vbiBNYXkgMjIgMjA6MTk6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogSWYgY2MgYXJndW1lbnQgaXMgbXVsdGlwbGUKLQl3b3JkcywgdXNlIG9ubHkgdGhlIGZpcnN0IHdoZW4gdHJ5aW5nIHRvIHZlcmlmeSB0aGUgYXZhaWxhYmlsaXR5Ci0Jb2YgdGhlIGNvbXBpbGVyLgotCi1Nb24gRmViICA2IDExOjQ2OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9kZWZpbmVkLnQ6IE1lbnRpb24gLmRhdGEgYW5kIC5ic3MgZXhwbGljaXRseS4KLQotVHVlIEphbiAyNCAxNDo1MTo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBJZiBub3QgaW4gdGhlIGxkIGJ1aWxkIGRpcmVjdG9yeSwKLQljYWxsIHVudGVzdGVkIGZvciBlYWNoIHRlc3QsIHJhdGhlciB0aGFuIGlnbm9yaW5nIGl0LiAgSWYgb25lIHRlc3QKLQlmYWlscywgZ28gb24gdG8gdGhlIG5leHQgb25lIGluc3RlYWQgb2YgcmV0dXJuaW5nLgotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IElmIGNvbXBpbGF0aW9ucyBmYWlsLCBtYXJrIHRlc3RzIGFzCi0JdW5yZXNvbHZlZC4KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogTGlrZXdpc2UuICBBbHNvLCBhbHdheXMgcGFzcyB0aGUgc2FtZSB0ZXN0Ci0JbmFtZSB0byBwYXNzIG9yIGZhaWwuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTGlrZXdpc2UuICBBbHNvLCBhbHdheXMgcnVuIGFsbCB0ZXN0cy4KLQkqIGxkLXNjcmlwdHMvZGVmaW5lZC5leHA6IElmIGFzIG9yIG5tIGZhaWwsIG1hcmsgdGVzdCBhcwotCXVucmVzb2x2ZWQuICBBbHdheXMgcGFzcyB0aGUgc2FtZSB0ZXN0IG5hbWUgdG8gcGFzcyBvciBmYWlsLgotCSogbGQtc2NyaXB0cy9zY3JpcHQuZXhwOiBMaWtld2lzZS4KLQkqIGxkLXNjcmlwdHMvc2l6ZW9mLmV4cDogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTEgMTE6NDg6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3NpemVvZi5leHA6IE5ldyB0ZXN0LCBiYXNlZCBvbiBidWcgcmVwb3J0IGZyb20KLQlhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2UuCi0JKiBsZC1zY3JpcHRzL3NpemVvZi5zOiBOZXcgZmlsZS4KLQkqIGxkLXNjcmlwdHMvc2l6ZW9mLnQ6IE5ldyBmaWxlLgotCi1XZWQgSmFuICA0IDE4OjU2OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cDogVXNlIFt3aGljaCAkbGRdIHJhdGhlciB0aGFuIFtmaWxlIGV4aXN0cyAkbGRdIHRvIHNlZQotCWlmIHRoZSBsaW5rZXIgZXhpc3RzLgotCi1XZWQgRGVjIDE0IDE2OjM5OjAzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKHBydW5lX3N5c3RlbV9jcnVkKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQsCi0JaW4gY2FzZSB0aGUgdXNlciBpc24ndCB1c2luZyB0aGUgbmV3ZXN0IERlamFHbnUgdmVyc2lvbiB0aGF0IHdlCi0JaGF2ZW4ndCByZWxlYXNlZCB0byB0aGUgbmV0IHlldC4KLQotRnJpIERlYyAgMiAxNDoxNzowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IERlZmluZSBvYmpkdW1wIGlmIGl0IGlzIG5vdCBkZWZpbmVkLgotCSogbGQtZW1waWMvKjogTmV3IHRlc3RzIHRvIHRlc3QgLW1lbWJlZGRlZC1waWMgY29kZS4KLQotTW9uIE5vdiAyOCAxMToyNDozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBQYXNzIGNtcCBvdXRwdXQgdGhyb3VnaAotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IFBhc3MgZGlmZiBvdXRwdXQgdGhyb3VnaAotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbW92ZSB1bnVzZWQgYW5kIHVzZWxlc3MgcHJvYyBsZF9sb2FkLgotCi1TdW4gT2N0IDMwIDEzOjAyOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogUmVtb3ZlIHRoZSBvdXRwdXQgZmlsZSBiZWZvcmUKLQljb21waWxpbmcuCi0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBNb3ZlIGNvbW1vbiB0ZXN0IGNvZGUgaW50byBhIHByb2NlZHVyZS4KLQlBZGQgdGVzdHMgZm9yIGNvbXBpbGluZyB0aGUgbm9uIHNoYXJlZCBjb2RlIFBJQy4KLQkqIGxkLXNoYXJlZC9tYWluLmMgKG1haW4pOiBDYWxsIG1haW5fY2FsbGVkLCBhbmQgcHJpbnQgdGhlIHJlc3VsdC4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZGF0OiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVRodSBPY3QgMjcgMTc6MzA6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQ6IE5ldyBkaXJlY3RvcnksIHdpdGggbmV3IGZpbGVzIHRvIHRlc3QgZ2VuZXJhdGluZyBFTEYKLQlzaGFyZWQgbGlicmFyaWVzLgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX2NvbXBpbGUpOiBJZiB0aGUgY29tcGlsYXRpb24gd29ya2VkLCBidXQKLQlubyBvYmplY3QgZmlsZSB3YXMgY3JlYXRlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBjb21waWxlciBmb29saXNobHkKLQlpZ25vcmVkIHRoZSAtbyBzd2l0Y2ggd2hlbiBjb21waWxpbmcsIGFuZCBtb3ZlIHRoZSByZXN1bHRpbmcKLQlvYmplY3QgaWYgaXQgZGlkLgotCi1UaHUgU2VwIDI5IDEyOjM2OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogVk1TIGRvZXMgbm90IHBlcm1pdHMgYC4nIGluIGRpcmVjdG9yeSBuYW1lcy4gIFJlbmFtZWQKLQlsZC5ib290c3RyYXAgdG8gbGQtYm9vdHN0cmFwLCBsZC5jZHRlc3QgdG8gbGQtY2R0ZXN0LCBhbmQKLQlsZC5zY3JpcHRzIHRvIGxkLXNjcmlwdHMuCi0KLVdlZCBTZXAgMjggMTI6MTg6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCB2YXJpYWJsZXMgYXMgYW5kIG5tLiAgQ3JlYXRlIHRtcGRpciBpZgotCWl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0JKiBsZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogRG9uJ3QgY3JlYXRlIHRtcGRpciBoZXJlLgotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IExpa2V3aXNlLgotCSogbGQuc2NyaXB0cy9kZWZpbmVkLmV4cDogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBzZXQgYXMgYW5kIG5tCi0JaGVyZS4gIENoYW5nZSBwZXJyb3IgZm9yIG5vIHZhcmlhYmxlcyBmb3VuZCB0byBmYWlsLgotCSogbGQuc2NyaXB0cy9zY3JpcHQuZXhwOiBOZXcgdGVzdC4KLQkqIGxkLnNjcmlwdHMvc2NyaXB0LnQsIGxkLnNjcmlwdHMvc2NyaXB0LnM6IE5ldyBmaWxlcy4KLQotVHVlIFNlcCAyNyAxNDo1OTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkLnNjcmlwdHM6IE5ldyBkaXJlY3RvcnkuCi0JKiBsZC5zY3JpcHRzL2RlZmluZWQuZXhwLCBsZC5zY3JpcHRzL2RlZmluZWQuczogTmV3IGZpbGVzLgotCSogbGQuc2NyaXB0cy9kZWZpbmVkLnQ6IE5ldyBmaWxlLgotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9zaW1wbGVfbGluayk6IE5ldyBmdW5jdGlvbi4KLQkoZGVmYXVsdF9sZF9hc3NlbWJsZSwgZGVmYXVsdF9sZF9ubSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbmFtZSBmcm9tIHVuaXgtbGQuZXhwLgotCShsZF9zaW1wbGVfbGluaywgbGRfYXNzZW1ibGUsIGxkX25tKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogY29uZmlnL3VuaXgtbGQuZXhwOiBTZXQgbGQgdXNpbmcgZmluZGZpbGUuCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3JlbG9jYXRlKTogUmV0dXJuIGEgdmFsdWUuICBDaGFuZ2UgZm9ybWF0Ci0Jb2YgbG9nIG1lc3NhZ2VzLgotCShkZWZhdWx0X2xkX2NvbXBpbGUpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9sZF9saW5rKTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBpbmNsdWRlICRCRkRMSUIgYW5kCi0JJExJQklCRVJUWSBpbiBsaW5rLgotCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IFJld3JpdGUuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogUmV3cml0ZS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QtZm9vLmNjOiBVcGRhdGUgZnJvbSB0b3AgbGV2ZWwgbGQgZGlyZWN0b3J5LgotCSogbGQuY2R0ZXN0L2NkdGVzdC1mb28uaDogTGlrZXdpc2UuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LW1haW4uY2M6IExpa2V3aXNlLgotCi1GcmkgTWF5IDI3IDA5OjM1OjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogRG9uJ3QgbG9vayBmb3IgJHJlc3VsdCBiZWZvcmUgaXQncwotCWRlZmluZWQuCi0KLVR1ZSBNYXkgMTcgMTU6MDY6NDkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cCwgbGliL2xkLmV4cDogUmVwbGFjZSBlcnJvciBwcm9jCi0JICBjYWxscyB3aXRoIHBlcnJvciBjYWxscy4KLQotV2VkIE1heSAxMSAxNjo0Nzo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkLmNkdGVzdC9jZHRlc3QtYmFyLmNjOiBSZW5hbWVkIGZyb20gY2R0ZXN0LWZ1bmMuY2MuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogQWRqdXN0ZWQuCi0KLUZyaSBKYW4gMjggMTM6MjU6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGliL2xkLmV4cCAoc2ltcGxlX2RpZmYpOiBJbmRpY2F0ZSBmYWlsdXJlIGlmIGZpbGVzIGhhdmUKLQlkaWZmZXJlbnQgbnVtYmVycyBvZiBsaW5lcy4gIERvbid0IG11Y2sgd2l0aCAkZGlmZmVyZW5jZXMgdG8gYXZvaWQKLQlpbmRpY2F0aW5nIGEgcGFzcywganVzdCByZXR1cm4uCi0KLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3Qve2NkdGVzdC1mb28uaCxjZHRlc3QtZm9vLmNjLGNkdGVzdC1tYWluLmNjfToKLQlGaXggdGVzdCBjYXNlIHRvIGJlIHZhbGlkIEFOU0kgQysrLiAgRG9uJ3QgcmVxdWlyZSB1c2Ugb2YgaGVhZGVyCi0JZmlsZXMsIHNvICIuLi9nY2MveGdjYyAtQi4uL2djYy8iIGNhbiBiZSB1c2VkIGZvciBDWFguCi0JKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L2NkdGVzdC5leHA6IENvbWJpbmUgInJtIiBsaW5lcy4gIEFkZCBzb21lCi0JY29tbWVudGFyeSBvbiB0aGluZ3MgdGhhdCBhcmUgc3RpbGwgYnJva2VuIHdpdGggdGhpcyB0ZXN0IGNhc2UuCi0KLUZyaSBTZXAgMTAgMDk6NTg6MjMgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogdGVzdHN1aXRlL2xkLmNkdGVzdC9jZHRlc3QuZXhwOiBBZGRlZCBDWFhGTEFHUyB0byBjb21waWxlIHN0YWdlLgotCi1UaHUgQXVnIDEyIDE2OjA1OjM3IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIHRlc3RzdWl0ZS9saWIvbGQuZXhwOiBhZGQgY29tcGlsZXIgYW5kIGxpbmtlciBzdXBwb3J0Ci0JKiB0ZXN0c3VpdGUvY29uZmlnL3VuaXgtbGQuZXhwOiBhZGQgY29tcGlsZXIgYW5kIGxpbmtlciBzdXBwb3J0Ci0JKiB0ZXN0c3VpdGUvbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IGZpeGVkIHRvIGRvIHBhcnRpYWwgbGlua3MKLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3QvY2R0ZXN0LmV4cDogY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0ZXN0c2Nhc2UKLQotV2VkIEF1ZyAgNCAyMTowMDoxOCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiB0ZXN0c3VpdGUvbGliL2xkLmV4cDogbmV3IGZpbGUKLQkqIHRlc3RzdWl0ZS9jb25maWcvdW5peC1sZC5leHA6IG5ldyBmaWxlCi0JKiB0ZXN0c3VpdGUvbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IG5ldyBmaWxlCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwIGIvbGQvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwZmRlYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLSMgQmFzaWMgZXhwZWN0IHNjcmlwdCBmb3IgTEQgUmVncmVzc2lvbiBUZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBKZWZmcmV5IFdoZWF0IChjYXNzaWR5QGN5Z251cy5jb20pCi0jCi0KLWlmICFbaW5mbyBleGlzdHMgbGRdIHRoZW4gewotICAgIHNldCBsZCBbZmluZGZpbGUgJGJhc2VfZGlyL2xkLW5ldyAkYmFzZV9kaXIvbGQtbmV3IFt0cmFuc2Zvcm0gbGRdXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIGFzXSB0aGVuIHsKLSAgICBzZXQgYXMgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9nYXMvYXMtbmV3ICRiYXNlX2Rpci8uLi9nYXMvYXMtbmV3IFt0cmFuc2Zvcm0gYXNdXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIG5tXSB0aGVuIHsKLSAgICBzZXQgbm0gW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9ubS1uZXcgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL25tLW5ldyBbdHJhbnNmb3JtIG5tXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBvYmpkdW1wXSB0aGVuIHsKLSAgICBzZXQgb2JqZHVtcCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL29iamR1bXBdCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgb2JqY29weV0gdGhlbiB7Ci0gICAgc2V0IG9iamNvcHkgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9vYmpjb3B5XQotfQotCi1pZiAhW2luZm8gZXhpc3RzIGFyXSB0aGVuIHsKLSAgICBzZXQgYXIgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9hcl0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBzdHJpcF0gdGhlbiB7Ci0gICAgc2V0IHN0cmlwIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvc3RyaXAtbmV3ICRiYXNlX2Rpci8uLi9iaW51dGlscy9zdHJpcC1uZXcgW3RyYW5zZm9ybSBzdHJpcF1dCi19Ci0KLWlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgdG1wZGlyXX0gdGhlbiB7Ci0gICAgY2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyIiBzdGF0dXMKLX0KLQotIyBNYWtlIGEgc3ltbGluayBmcm9tIHRtcGRpci9hcyB0byB0aGUgYXNzZW1ibGVyIGluIHRoZSBidWlsZCB0cmVlLCBzbwotIyB0aGF0IHdlIGNhbiB1c2UgYSAtQiBvcHRpb24gdG8gZ2NjIHRvIGZvcmNlIGl0IHRvIHVzZSB0aGUgbmV3bHkKLSMgYnVpbHQgYXNzZW1ibGVyLgotaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSB0bXBkaXIvZ2FzXX0gdGhlbiB7Ci0gICAgY2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyL2dhcyIgc3RhdHVzCi0gICAgY2F0Y2ggImV4ZWMgbG4gLXMgLi4vLi4vLi4vZ2FzL2FzLW5ldyB0bXBkaXIvZ2FzL2FzIiBzdGF0dXMKLX0KLXNldCBnY2NfZ2FzX2ZsYWcgIi1CW3B3ZF0vdG1wZGlyL2dhcy8iCi0KLSMgbG9hZCB0aGUgdXRpbGl0eSBwcm9jZWR1cmVzCi1sb2FkX2xpYiBsZC1saWIuZXhwCi0KLXByb2MgZ2V0X2xpbmtfZmlsZXMge3Zhcm5hbWV9IHsKLSAgICBnbG9iYWwgJHZhcm5hbWUKLSAgICBnbG9iYWwgdGFyZ2V0X3RyaXBsZXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIENDCi0gICAgaWYgIVtpbmZvIGV4aXN0cyAkdmFybmFtZV0gewotCXNldCBzdGF0dXMgW2NhdGNoICJleGVjIHNoIC1jIFwiaG9zdD0nJHRhcmdldF90cmlwbGV0JyAmJiBDQz0nJENDJyAmJiAuICRzcmNkaXIvLi4vY29uZmlndXJlLmhvc3QgJiYgZXZhbCBlY2hvIFxcJCR2YXJuYW1lXCIiIHJlc3VsdF0KLQlpZiAkc3RhdHVzIHsgZXJyb3IgIkVycm9yIGdldHRpbmcgbmF0aXZlIGxpbmsgZmlsZXM6ICRyZXN1bHQiIH0KLQlzZXQgJHZhcm5hbWUgJHJlc3VsdAotICAgIH0KLX0KLQotcHJvYyBnZXRfdGFyZ2V0X2VtdWwge30gewotICAgIGdsb2JhbCB0YXJnZXRfdHJpcGxldAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBzZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyBzaCAtYyBcInRhcmc9JyR0YXJnZXRfdHJpcGxldCcgJiYgLiAkc3JjZGlyLy4uL2NvbmZpZ3VyZS50Z3QgJiYgZWNobyBcXFwkdGFyZ19lbXVsXCIiIHJlc3VsdF0KLSAgICBpZiAkc3RhdHVzIHsgZXJyb3IgIkVycm9yIGdldHRpbmcgZW11bGF0aW9uIG5hbWU6ICRyZXN1bHQiIH0KLSAgICByZXR1cm4gJHJlc3VsdAotfQotCi1pZiBbaXNuYXRpdmVdIHsKLSAgICBmb3JlYWNoIHgge0hPU1RJTkdfQ1JUMCBIT1NUSU5HX0xJQlN9IHsKLQlnZXRfbGlua19maWxlcyAkeAotICAgIH0KLX0gZWxzZSB7Ci0gICAgZm9yZWFjaCB4IHtIT1NUSU5HX0NSVDAgSE9TVElOR19MSUJTfSB7IHNldCAkeCAiIiB9Ci19Ci1pZiAhW2luZm8gZXhpc3RzIEhPU1RJTkdfRU1VXSB7IHNldCBIT1NUSU5HX0VNVSAiLW0gW2dldF90YXJnZXRfZW11bF0iIH0KLQotIwotIyBsZF92ZXJzaW9uIC0tIGV4dHJhY3QgYW5kIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsZCBjb21waWxlciAoR0NDKQotIwotcHJvYyBsZF92ZXJzaW9uIHt9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBkZWZhdWx0X2xkX3ZlcnNpb24gJGxkCi19Ci0KLSMKLSMgbGRfZXhpdCAtLSBqdXN0IGEgc3R1YiBmb3IgbGQKLSMKLXByb2MgbGRfZXhpdCB7fSB7Ci19Ci0KLSMKLSMgbGRfc3RhcnQgCi0jCXJlbGluayB0aGUgbGlua2VyCi0jCi1wcm9jIGxkX3N0YXJ0IHsgbGQgdGFyZ2V0IH0gewotCSMKLX0KLQotIwotIyBsZF9yZWxvY2F0ZSAKLSMJbGluayBhbiBvYmplY3QgdXNpbmcgcmVsb2NhdGlvbgotIwotcHJvYyBsZF9yZWxvY2F0ZSB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotCWRlZmF1bHRfbGRfcmVsb2NhdGUgJGxkICR0YXJnZXQgJG9iamVjdHMKLX0KLQotIwotIyBsZF9saW5rIAotIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZAotIwotcHJvYyBsZF9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0JZGVmYXVsdF9sZF9saW5rICRsZCAkdGFyZ2V0ICRvYmplY3RzCi19Ci0KLSMKLSMgbGRfc2ltcGxlX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkLCB3aXRob3V0IGluY2x1ZGluZyBhbnkgbGlicmFyaWVzCi0jCi1wcm9jIGxkX3NpbXBsZV9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0JZGVmYXVsdF9sZF9zaW1wbGVfbGluayAkbGQgJHRhcmdldCAkb2JqZWN0cwotfQotCi0jCi0jIGxkX2NvbXBpbGUgCi0jCWNvbXBpbGUgYW4gb2JqZWN0IHVzaW5nICRjYwotIwotcHJvYyBsZF9jb21waWxlIHsgY2Mgc291cmNlIG9iamVjdCB9IHsKLQlkZWZhdWx0X2xkX2NvbXBpbGUgJGNjICRzb3VyY2UgJG9iamVjdCAKLX0KLQotIwotIyBsZF9hc3NlbWJsZQotIwlhc3NlbWJsZSBhIGZpbGUKLSMKLXByb2MgbGRfYXNzZW1ibGUgeyBhcyBzb3VyY2Ugb2JqZWN0IH0gewotCWRlZmF1bHRfbGRfYXNzZW1ibGUgJGFzICRzb3VyY2UgJG9iamVjdCAKLX0KLQotIwotIyBsZF9ubQotIwlydW4gbm0gb24gYSBmaWxlCi0jCi1wcm9jIGxkX25tIHsgbm0gb2JqZWN0IH0gewotCWRlZmF1bHRfbGRfbm0gJG5tICRvYmplY3QKLX0KLQotIwotIyBsZF9leGVjCi0jCWV4ZWN1dGUgaXRoZSB0YXJnZXQKLSMKLXByb2MgbGRfZXhlYyB7IHRhcmdldCBvdXRwdXQgfSB7Ci0JZGVmYXVsdF9sZF9leGVjICR0YXJnZXQgJG91dHB1dAotfQotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNGI4MjAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgQm9vdHN0cmFwIFRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSmVmZnJleSBXaGVhdCAoY2Fzc2lkeUBjeWdudXMuY29tKQotIyBSZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgTWFrZSBzdXJlIHRoYXQgbGQgY2FuIGJvb3RzdHJhcCBpdHNlbGYuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gewotICAgIHJldHVybgotfQotCi0jIEJvb3RzdHJhcCBsZC4gIEZpcnN0IGxpbmsgdGhlIG9iamVjdCBmaWxlcyB0b2dldGhlciB1c2luZyAtciwgaW4KLSMgb3JkZXIgdG8gdGVzdCAtci4gIFRoZW4gbGluayB0aGUgcmVzdWx0IGludG8gYW4gZXhlY3V0YWJsZSwgbGQxLCB0bwotIyByZWFsbHkgdGVzdCAtci4gIFVzZSBsZDEgdG8gbGluayBhIGZyZXNoIGxkLCBsZDIuICBVc2UgbGQyIHRvIGxpbmsgYQotIyBuZXcgbGQsIGxkMy4gIGxkMiBhbmQgbGQzIHNob3VsZCBiZSBpZGVudGljYWwuCi0KLWZvcmVhY2ggZmxhZ3MgeyIiICItLXN0YXRpYyIgIi0tdHJhZGl0aW9uYWwtZm9ybWF0IiAiLS1uby1rZWVwLW1lbW9yeSJ9IHsKLSAgICBpZiB7IiRmbGFncyIgIT0gIiJ9IHsgCi0Jc2V0IHRlc3RuYW1lICJib290c3RyYXAgd2l0aCAkZmxhZ3MiCi0gICAgfSBlbHNlIHsKLQlzZXQgdGVzdG5hbWUgImJvb3RzdHJhcCIKLSAgICB9Ci0KLSAgICAjIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgd2UgaGF2ZSB0aGUgbGQgYnVpbGQgZGlyZWN0b3J5LAotICAgICMgc2luY2Ugd2UgbmVlZCB0aGUgb2JqZWN0IGZpbGVzLgotICAgIGlmIHskbGQgIT0gIiRvYmpkaXIvbGQtbmV3In0gewotCXVudGVzdGVkICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgIyBJZiB3ZSBvbmx5IGhhdmUgYSBzaGFyZWQgbGliYmZkLCB3ZSBwcm9iYWJseSBjYW4ndCBydW4gdGhlCi0gICAgIyAtLXN0YXRpYyB0ZXN0LgotICAgIGlmIHsgJGZsYWdzID09ICItLXN0YXRpYyIgJiYgISBbc3RyaW5nIG1hdGNoICIqbGliYmZkLmEqIiAkQkZETElCXSB9IHRoZW4gewotCXVudGVzdGVkICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgaWYgIVtsZF9yZWxvY2F0ZSAkbGQgdG1wZGlyL2xkLXBhcnRpYWwubyAiJGZsYWdzICRPRklMRVMiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgICMgT24gQUlYLCB5b3UgbmVlZCB0byBzcGVjaWZ5IGFuIGltcG9ydCBsaXN0IHdoZW4gdXNpbmcgLS1zdGF0aWMuCi0gICAgIyBZb3Ugb25seSB3YW50IHRoZSBpbXBvcnQgbGlzdCB3aGVuIGNyZWF0aW5nIHRoZSBmaW5hbAotICAgICMgZXhlY3V0YWJsZS4KLSAgICBpZiBbaXN0YXJnZXQgIiotKi1haXgqIl0gewotCWlmIHsiJGZsYWdzIiA9PSAiLS1zdGF0aWMifSB7Ci0JICAgIHNldCBmbGFncyAiLS1zdGF0aWMgLWJJOi9saWIvc3lzY2FsbHMuZXhwIgotCX0KLSAgICB9Ci0KLSAgICAjIE9uIElyaXggNSwgbGlua2luZyB3aXRoIC0tc3RhdGljIG9ubHkgd29ya3MgaWYgYWxsIHRoZSBmaWxlcyBhcmUKLSAgICAjIGNvbXBpbGVkIHVzaW5nIC1ub25fc2hhcmVkLgotICAgIGlmIHsiJGZsYWdzIiA9PSAiLS1zdGF0aWMifSB7Ci0Jc2V0dXBfeGZhaWwgIm1pcHMqLSotaXJpeDUqIgotICAgIH0KLQotICAgIGlmICFbbGRfbGluayAkbGQgdG1wZGlyL2xkMSAiJGZsYWdzIHRtcGRpci9sZC1wYXJ0aWFsLm8gJEJGRExJQiAkTElCSUJFUlRZIl0gewotCWZhaWwgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2xpbmsgdG1wZGlyL2xkMSB0bXBkaXIvbGQyICIkZmxhZ3MgJE9GSUxFUyAkQkZETElCICRMSUJJQkVSVFkiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgIGlmICFbbGRfbGluayB0bXBkaXIvbGQyIHRtcGRpci9sZDMgIiRmbGFncyAkT0ZJTEVTICRCRkRMSUIgJExJQklCRVJUWSJdIHsKLQlmYWlsICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgc2VuZF9sb2cgImNtcCB0bXBkaXIvbGQyIHRtcGRpci9sZDNcbiIKLSAgICB2ZXJib3NlICJjbXAgdG1wZGlyL2xkMiB0bXBkaXIvbGQzIgotICAgIGNhdGNoICJleGVjIGNtcCB0bXBkaXIvbGQyIHRtcGRpci9sZDMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtYmFyLmNjIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtYmFyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAwMGUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWJhci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vIHRlc3QgcHJvZ3JhbSBmb3IgQ2xhc3MgRm9vCi0KLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLXN0YXRpYyBGb28gc3RhdGljX2ZvbyggInN0YXRpY19mb28iKTsgCi0KLUZvbyBmKCkKLXsKLSAgICBGb28geDsKLSAgICByZXR1cm4geDsKLX0KLQotdm9pZCBnKCkKLXsKLSAgICBGb28gb3RoZXJfZm9vMSA9IEZvbyggIm90aGVyX2ZvbzEiKSwgb3RoZXJfZm9vMiA9IEZvbyggIm90aGVyX2ZvbzIiKTsKLSAgICBvdGhlcl9mb28yID0gb3RoZXJfZm9vMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1ZTMzYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLyBDbGFzcyBGb28KLSNwcmFnbWEgaW1wbGVtZW50YXRpb24KLQotCi0vLyBXZSBkb24ndCB1c2UgaGVhZGVyIGZpbGVzLCBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gc2VlLCB3aGV0aGVyIHRoZQotLy8gY29tcGlsZXIgaXMgaW5zdGFsbGVkIHByb3Blcmx5LgotLy8KLSNpZiAoX19HTlVHX18gPT0gMikKLXR5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwotI2VuZGlmCi0KLWV4dGVybiAiQyIgewotICAgIGNoYXIgKnN0cm5jcHkgKGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIGRlc3QsIHNpemVfdCBsZW4pOwotICAgIGludCBwcmludGYgKGNvbnN0IGNoYXIqLCAuLi4pOwotfTsKLQotI2luY2x1ZGUgImNkdGVzdC1mb28uaCIKLQotaW50IEZvbzo6Zm9vcyA9IDA7Ci0KLXZvaWQgRm9vOjppbml0X2ZvbyAoKQotewotICAgIHByaW50ZiAoIkJST0tFTkxZIGNhbGxpbmcgRm9vOjppbml0X2ZvbyBmcm9tIF9faW5pdF9zdGFydDsgc2l6ZV9vZihGb28pID0gJWRcbiIsIHNpemVvZihGb28pKTsKLSAgICBmb29zID0gRk9PTElTSF9OVU1CRVI7Ci19Ci0KLQotRm9vOjpGb28gKCkKLXsKLSAgICBpID0gKytmb29zOwotICAgIHN0cm5jcHkgKG1lc3NhZ2UsICJkZWZhdWx0LWZvbyIsIGxlbik7Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICgiQ29uc3RydWN0aW5nIEZvbyglZCkgXCJkZWZhdWx0LWZvb1wiIGF0ICUwOHhcbiIsIGksIHRoaXMpOwotI2Vsc2UKLSAgICBwcmludGYgKCJDb25zdHJ1Y3RpbmcgRm9vKCVkKSBcImRlZmF1bHQtZm9vXCJcbiIsIGkpOwotI2VuZGlmCi19Ci0KLUZvbzo6Rm9vIChjaGFyKiBtc2cpCi17Ci0gICAgaSA9ICsrZm9vczsKLSAgICBzdHJuY3B5KCBtZXNzYWdlLCBtc2csIGxlbik7Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4XG4iLCBpLCBtZXNzYWdlLCB0aGlzKTsKLSNlbHNlCi0gICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIlxuIiwgaSwgbWVzc2FnZSk7Ci0jZW5kaWYKLX0KLQotCi1Gb286OkZvbyAoY29uc3QgRm9vJiBmb28pCi17Ci0gICAgaSA9ICsrZm9vczsKLSNpZmRlZiBXSVRIX0FERFIKLSAgICBwcmludGYgKCJJbml0aWFsaXppbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB3aXRoIEZvbyglZCkgJTA4eFxuIiwgCi0JICAgIGksIGZvby5tZXNzYWdlLCB0aGlzLCBmb28uaSwgJmZvbyk7Ci0jZWxzZQotICAgcHJpbnRmICgiSW5pdGlhbGl6aW5nIEZvbyglZCkgXCIlc1wiIHdpdGggRm9vKCVkKVxuIixpLCBmb28ubWVzc2FnZSwgZm9vLmkpOwotI2VuZGlmCi0gICAgZm9yICggaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotfQotCi0KLUZvbyYgRm9vOjpvcGVyYXRvcj0gKGNvbnN0IEZvbyYgZm9vKQotewotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB0byBGb28oJWQpICUwOHhcbiIsIAotCSAgICBmb28uaSwgZm9vLm1lc3NhZ2UsICZmb28sIGksIHRoaXMpOwotI2Vsc2UKLSAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgdG8gRm9vKCVkKVxuIiwgZm9vLmksIGZvby5tZXNzYWdlLCBpKTsKLSNlbmRpZgotICAgIGZvciAoIGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLQotRm9vOjp+Rm9vICgpCi17Ci0gICAgZm9vcy0tOwotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkRlc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIGF0ICUwOHggKHJlbWFpbmluZyBmb29zOiAlZClcbiIsCi0JICAgIGksIG1lc3NhZ2UsIHRoaXMsIGZvb3MpOwotI2Vsc2UKLSAgICBwcmludGYgKCJEZXN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiAocmVtYWluaW5nIGZvb3M6ICVkKVxuIiwKLQkgICAgaSwgbWVzc2FnZSwgZm9vcyk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5oIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmU1MmEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyBDbGFzcyBGb28KLQotI3ByYWdtYSBpbnRlcmZhY2UKLQotI2RlZmluZSBGT09MSVNIX05VTUJFUiAtNDcxMQotCi0jaWZuZGVmIEZPT19NU0dfTEVOCi0jZGVmaW5lIEZPT19NU0dfTEVOIDgwCi0jZW5kaWYKLSAKLWNsYXNzIEZvbyB7Ci0gICAgc3RhdGljIGludCBmb29zOwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuID0gRk9PX01TR19MRU47Ci0gICAgY2hhciBtZXNzYWdlW2xlbl07Ci1wdWJsaWM6IAotICAgIHN0YXRpYyB2b2lkIGluaXRfZm9vICgpOwotICAgIHN0YXRpYyBpbnQgbmJfZm9vcygpIHsgcmV0dXJuIGZvb3M7IH0KLSAgICBGb28oKTsKLSAgICBGb28oIGNoYXIqIG1lc3NhZ2UpOwotICAgIEZvbyhjb25zdCBGb28mKTsKLSAgICBGb28gJiBvcGVyYXRvcj0gKGNvbnN0IEZvbyYpOwotICAgIH5Gb28gKCk7Ci19OyAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzg4MWRhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBtYWluIHByb2dyYW0gZm9yIENsYXNzIEZvbwotCi1leHRlcm4gIkMiIHsKLS8vIFNvbWUgPGFzc2VydC5oPiBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gU1VOT1MgNC4xKSBhcmUgYnJva2VuLAotLy8gaW4gdGhhdCB0aGV5IHJlcXVpcmUgPHN0ZGlvLmg+LiAgQnV0LCBpZiBnY2MvZysrIGlzIGluc3RhbGxlZAotLy8gY29ycmVjdGx5LCB5b3Ugc2hvdWxkIGdldCBnY2MncyBhc3NlcnQuaC4KLS8vIElmIHRoZSBjb21waWxlIGZhaWxzLCBpdCBtZWFucyB0aGUgd3JvbmcgaW5jbHVkZSBmaWxlcyBhcmUgaW4gdXNlIQotI2luY2x1ZGUgPGFzc2VydC5oPgotfTsKLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLWV4dGVybiAiQyIgdm9pZCBfX2luaXRfc3RhcnQoKTsKLQotZXh0ZXJuIEZvbyBmKHZvaWQpOwotZXh0ZXJuIHZvaWQgZyh2b2lkKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgKm5vdCogYmUgY2FsbGVkIGJ5IHRoZSBlbnZpcm9ubWVudC4gIFRoZXJlIGlzCi0gICBubyB3YXkgaW4gQysrIHRvIGBgcnVuIHNvbWV0aGluZyBhZnRlciB0aGUgaW5pdGlhbGl6ZXJzIGJ1dCBiZWZvcmUgbWFpbigpJycuCi0gICBUaGUgbGlicmFyeSB0aGF0IGRlcGVuZHMgb24gdGhpcyAoTklIQ0wpIGlzIGJyb2tlbi4gIC0tIEpvaG4gR2lsbW9yZSAKLSAgIFdlIGxlYXZlIHRoaXMgaGVyZSB0byB0ZXN0IHRoYXQgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVyCi0gICBkbyBub3QgcmUtaW50cm9kdWNlIHRoaXMgbG9zaW5nIGBgZmVhdHVyZScnLiAgKi8KLXZvaWQgCi1fX2luaXRfc3RhcnQoKQotewotICAgIEZvbzo6aW5pdF9mb28oKTsKLX0KLQotc3RhdGljIEZvbyBzdGF0aWNfZm9vKCAic3RhdGljX2ZvbyIpOyAKLQotaW50IG1haW4oKSAKLXsgCi0gICAgYXNzZXJ0IChGb286Om5iX2Zvb3MoKSA9PSAyKTsKLSAgICBGb28gYXV0b21hdGljX2ZvbyggImF1dG9tYXRpY19mb28iKTsKLSAgICBGb28gYmxhX2ZvbyA9IGYoKTsKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOwotICAgIGcoKTsKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOwotICAgIC8vIGBhdXRvbWF0aWNfZm9vJyBhbmQgYGJsYV9mb28nIGFyZSBkZXN0cnVjdGVkIGhlcmUgCi19IAotIApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWJlMGRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUNvbnN0cnVjdGluZyBGb28oMSkgInN0YXRpY19mb28iCi1Db25zdHJ1Y3RpbmcgRm9vKDIpICJzdGF0aWNfZm9vIgotQ29uc3RydWN0aW5nIEZvbygzKSAiYXV0b21hdGljX2ZvbyIKLUNvbnN0cnVjdGluZyBGb28oNCkgImRlZmF1bHQtZm9vIgotSW5pdGlhbGl6aW5nIEZvbyg1KSAiZGVmYXVsdC1mb28iIHdpdGggRm9vKDQpCi1EZXN0cnVjdGluZyBGb28oNCkgImRlZmF1bHQtZm9vIiAocmVtYWluaW5nIGZvb3M6IDQpCi1Db25zdHJ1Y3RpbmcgRm9vKDUpICJvdGhlcl9mb28xIgotQ29uc3RydWN0aW5nIEZvbyg2KSAib3RoZXJfZm9vMiIKLUNvcHlpbmcgRm9vKDUpICJvdGhlcl9mb28xIiB0byBGb28oNikKLURlc3RydWN0aW5nIEZvbyg2KSAib3RoZXJfZm9vMSIgKHJlbWFpbmluZyBmb29zOiA1KQotRGVzdHJ1Y3RpbmcgRm9vKDUpICJvdGhlcl9mb28xIiAocmVtYWluaW5nIGZvb3M6IDQpCi1EZXN0cnVjdGluZyBGb28oNSkgImRlZmF1bHQtZm9vIiAocmVtYWluaW5nIGZvb3M6IDMpCi1EZXN0cnVjdGluZyBGb28oMykgImF1dG9tYXRpY19mb28iIChyZW1haW5pbmcgZm9vczogMikKLURlc3RydWN0aW5nIEZvbygyKSAic3RhdGljX2ZvbyIgKHJlbWFpbmluZyBmb29zOiAxKQotRGVzdHJ1Y3RpbmcgRm9vKDEpICJzdGF0aWNfZm9vIiAocmVtYWluaW5nIGZvb3M6IDApCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmUzNWUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgY2R0ZXN0IFRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTQsMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IEplZmZyZXkgV2hlYXQgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLSMgUmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGNvbnN0cnVjdG9ycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLXNldCB0ZXN0MSAiY2R0ZXN0Igotc2V0IHRlc3QyICJjZHRlc3Qgd2l0aCAtVXIiCi0KLSMgVGhpcyB0ZXN0IHJlcXVpcmVzIHJ1bm5pbmcgdGhlIGV4ZWN1dGFibGUgZ2VuZXJhdGVkIGJ5IGxkLgotaWYgIVtpc25hdGl2ZV0gewotICAgIHJldHVybgotfQotCi1pZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LWZvby5jYyB0bXBkaXIvY2R0ZXN0LWZvby5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC1iYXIuY2MgdG1wZGlyL2NkdGVzdC1iYXIub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9jZHRlc3QtbWFpbi5jYyB0bXBkaXIvY2R0ZXN0LW1haW4ub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX2xpbmsgJGxkIHRtcGRpci9jZHRlc3Qge3RtcGRpci9jZHRlc3QtZm9vLm8gdG1wZGlyL2NkdGVzdC1iYXIubyB0bXBkaXIvY2R0ZXN0LW1haW4ub31dIHsKLSAgICBmYWlsICR0ZXN0MQotfSBlbHNlIHsKLSAgICBzZW5kX2xvZyAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXRcbiIKLSAgICB2ZXJib3NlICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIKLSAgICBjYXRjaCAiZXhlYyB0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQlmYWlsICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXRcbiIKLQl2ZXJib3NlICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IgotCWNhdGNoICJleGVjIGRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiIGV4ZWNfb3V0cHV0Ci0Jc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3QxCi0JfSBlbHNlIHsKLQkgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkgICAgZmFpbCAkdGVzdDEKLQl9Ci0gICAgfQotfQotCi1pZiAhW2xkX3JlbG9jYXRlICRsZCB0bXBkaXIvY2R0ZXN0Lm8gey1VciB0bXBkaXIvY2R0ZXN0LWZvby5vIHRtcGRpci9jZHRlc3QtYmFyLm8gdG1wZGlyL2NkdGVzdC1tYWluLm99XSB7Ci0gICAgZmFpbCAkdGVzdDIKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9saW5rICRsZCB0bXBkaXIvY2R0ZXN0IHRtcGRpci9jZHRlc3Qub10gewotCWZhaWwgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXRcbiIKLQl2ZXJib3NlICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIKLQljYXRjaCAiZXhlYyB0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIgZXhlY19vdXRwdXQKLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCSAgICBmYWlsICR0ZXN0MgotCX0gZWxzZSB7Ci0JICAgIHNlbmRfbG9nICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0XG4iCi0JICAgIHZlcmJvc2UgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiCi0JICAgIGNhdGNoICJleGVjIGRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiIGV4ZWNfb3V0cHV0Ci0JICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQkJcGFzcyAkdGVzdDIKLQkgICAgfSBlbHNlIHsKLQkJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkJZmFpbCAkdGVzdDIKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9hc20ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZTE3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLnRleHQKLQkuZ2xvYmFsIGZvbwotZm9vOgotCS5sb25nIDB4MTIzNDU2NzgKLQotLmRhdGEKLQkuZ2xvYmFsIGJhcgotYmFyOgotCS5sb25nIDB4ODc2NTQzMjEKLQotCS5sY29tbSBkdW1teSwgMHgxMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZhZmUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvY2hlY2tzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgc2VjdGlvbiBjaGVja3MgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBOaWNrIENsaWZ0b24gKG5pY2tjQGN5Z251cy5jb20pCi0KLXByb2Mgc2VjdGlvbl9jaGVjayB7fSB7Ci0gICAgZ2xvYmFsIGxkX2ZsYWdzCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICAKLSAgICBzZXQgdGVzdCAiY2hlY2sgc2VjdGlvbnMgMSIKLSAgICAKLSAgICBzZXQgbGRmbGFncyAiLS1jaGVjay1zZWN0aW9ucyIKLQotICAgIGlmIHsgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2FzbS5zIHRtcGRpci9hc20ub119IHsKLQl1bnJlc29sdmVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL2FzbS54ICIkbGRmbGFncyB0bXBkaXIvYXNtLm8iXSB7Ci0JZmFpbCAkdGVzdAotICAgIH0gZWxzZSB7Ci0JcGFzcyAkdGVzdAotICAgIH0KLQotICAgIHNldCB0ZXN0ICJjaGVjayBzZWN0aW9ucyAyIgotCi0gICAgIyBDaGFuZ2UgdGhlIGxpbmtlciBmbGFncyBzbyB0aGF0IG91ciAiYnVnZ3kiIGxpbmtlcgotICAgICMgc2NyaXB0IGlzIHVzZWQuCi0gICAgc2V0IGxkZmxhZ3MgIi0tY2hlY2stc2VjdGlvbnMgLVQgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdCAtZSBmb28iCi0KLSAgICAjIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgaW52b2tpbmcgbGRfc2ltcGxlX2xpbmsKLSAgICAjIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWFzc2FnZSB0aGUgb3V0cHV0IGZ1dGhlci4KLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgLW8gdG1wZGlyL2FzbS54ICRsZGZsYWdzIHRtcGRpci9hc20ubyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgICMgTWFrZSBzdXJlIHRoYXQgd2UgZ290IHNvbWUgb3V0cHV0IGZyb20gdGhlIGxpbmtlcgotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICR0ZXN0Ci0gICAgfSAKLQotICAgICMgTm93IHJlbW92ZSBvdXIgZXhwZWN0ZWQgZXJyb3IgbWVzc2FnZQotICAgIHJlZ3N1YiAtYWxsICIuKjogc2VjdGlvbiAuZGF0YSAuKiBvdmVybGFwcyBzZWN0aW9uIC50ZXh0IC4qIiAkZXhlY19vdXRwdXQgIiIgZXhlY19vdXRwdXQKLQotICAgICMgQW5kIGNoZWNrIHRvIHNlZSBpZiBhbnl0aGluZyBlbHNlLCAodW5leHBlY3RlZCkgd2FzIGxlZnQKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICJVbmV4cGVjdGVkIGxpbmtlciBtZXNzYWdlKHMpOiAkZXhlY19vdXRwdXQiCi0JZmFpbCAkdGVzdAotICAgIH0KLX0KLQotc2VjdGlvbl9jaGVjawotCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3Mvc2NyaXB0IGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzZhMDguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNFQ1RJT05TIHsKLSAgICAgICAgLnRleHQgMHgxMDAgOiAgICAgICAgICAgICB7ICooLnRleHQpIH0KLQkuZGF0YSAweDEwMCA6IEFUICgweDEwMCkgIHsgKiguZGF0YSkgfQotCS5ic3MgIDB4MTAwIDogQVQgKDB4NDAwMCkgeyAqKC5ic3MpICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDJkNjkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MTMgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzaW9uIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgRXJpYyBZb3VuZ2RhbGUgKGVyaWNAYW5kYW50ZS5qaWMuY29tKQotCi0jCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gdGhlbiB7cmV0dXJufQotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gb24gYSBjb3VwbGUgb2YgRUxGIHBsYXRmb3Jtcy4KLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotIyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRlc3QgdGhhdCBpcyB1c2VkIGluIGxkLXNoYXJlZCwgQlRXLgotaWYgeyAhW2lzdGFyZ2V0IGk/ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXQotICAgICAmJiAhW2lzdGFyZ2V0IGFscGhhKi0qLWxpbnV4Kl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0IGk/ODYtKi1saW51eGFvdXQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpPzg2LSotbGludXhvbGRsZCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IG02OGstKi1saW51eGFvdXQqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotICAgIHJldHVybgotfQotCi1zZXQgZGlmZiBkaWZmCi1zZXQgdG1wZGlyIHRtcGRpcgotc2V0IFZPQkpEVU1QX0ZMQUdTIC0tcHJpdmF0ZS1oZWFkZXJzCi1zZXQgRE9CSkRVTVBfRkxBR1MgLS1keW5hbWljLXN5bXMKLXNldCBTT0JKRFVNUF9GTEFHUyAtLXN5bXMKLXNldCBzaGFyZWQgLS1zaGFyZWQKLXNldCBzY3JpcHQgLS12ZXJzaW9uLXNjcmlwdAotCi1wcm9jIHRlc3RfYXIgeyB0ZXN0IGxpYiBvYmplY3QgZXhwZWN0IH0gewotICAgIGdsb2JhbCBhcgotICAgIGdsb2JhbCBubQotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBkaWZmCi0KLSAgICB2ZXJib3NlIC1sb2cgIiRhciAtY3IgJHRtcGRpci8kbGliICR0bXBkaXIvJG9iamVjdCIKLSAgICBjYXRjaCAiZXhlYyAkYXIgLWNyICR0bXBkaXIvJGxpYiAkdG1wZGlyLyRvYmplY3QiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIAotICAgIHZlcmJvc2UgLWxvZyAiJG5tIC0tcHJpbnQtYXJtYXAgJHRtcGRpci8kbGliIHwgZ3JlcCBcIiBpbiBcIiB8IGVncmVwIFwiVkVSU1xcfGJhclxcfGZvb1wiIHwgc29ydCA+ICR0bXBkaXIvbm0ub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG5tIC0tcHJpbnQtYXJtYXAgJHRtcGRpci8kbGliIHwgZ3JlcCBcXFwgaW5cXFwgIHwgZWdyZXAgVkVSU1xcXHxiYXJcXFx8Zm9vIHwgc29ydCA+ICR0bXBkaXIvbm0ub3V0IiBleGVjX291dHB1dAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQljYXRjaCAiZXhlYyAkZGlmZiAtcSAkdG1wZGlyL25tLm91dCAkc3JjZGlyLyRzdWJkaXIvJGV4cGVjdCIgZXhlY19vdXRwdXQKLQlzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3QKLQkgICAgcmV0dXJuCi0JfSBlbHNlIHsKLQkgICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdCIKLSAgICB9Ci19Ci0KLSMKLSMgb2JqZHVtcF9lbXB0eXN5bXN0dWZmCi0jCUNoZWNrIG5vbi1keW5hbWljIHN5bWJvbHMgYW5kIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSB3aXRoICdAJy4KLSMKLXByb2Mgb2JqZHVtcF9lbXB0eXN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIFNPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLQotICAgIGlmICFbaW5mbyBleGlzdHMgU09CSkRVTVBfRkxBR1NdIHsgc2V0IFNPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1xAL3AiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkU09CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvXEAvcCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0jIFdlIHNob3VsZG4ndCBnZXQgYW55dGhpbmcgaGVyZS4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0jIGl0IGlzIG5vdCBub3JtYWwgdG8gY29tZSBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl2ZXJib3NlIC1sb2cgIm9iamR1bXBfZW1wdHlzeW1zdHVmZjogZGlkIG5vdCBleHBlY3QgYW55IG91dHB1dCBmcm9tIG9iamR1bXAiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX2VtcHR5ZHluc3ltc3R1ZmYKLSMJQ2hlY2sgZHluYW1pYyBzeW1ib2xzIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vbmUgd2l0aCAnQCcuCi0jCi1wcm9jIG9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IH0gewotICAgIGdsb2JhbCBET0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFZPQkpEVU1QX0ZMQUdTXSB7IHNldCBWT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0jIFdlIHNob3VsZG4ndCBnZXQgYW55dGhpbmcgaGVyZS4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7IGlmIFtzdHJpbmcgbWF0Y2ggIipvYmpkdW1wOiAqOiBub3QgYSBkeW5hbWljIG9iamVjdCIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0jIGl0IGlzIG5vdCBub3JtYWwgdG8gY29tZSBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl2ZXJib3NlIC1sb2cgIm9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZjogZGlkIG5vdCBleHBlY3QgYW55IG91dHB1dCBmcm9tIG9iamR1bXAiCi0JcmV0dXJuIDAKLSAgICB9IH0KLX0KLQotIwotIyBvYmpkdW1wX2VtcHR5dmVyc3R1ZmYKLSMJTWFrZSBzdXJlIHRoZXJlIGlzIG5vIHZlcnNpb24gaW5mb3JtYXRpb24KLSMKLXByb2Mgb2JqZHVtcF9lbXB0eXZlcnN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIFZPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRvYmpkdW1wIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBWT0JKRFVNUF9GTEFHU10geyBzZXQgVk9CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAgPiAkdG1wZGlyL29iamR1bXAub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSMgaXQgaXMgbm9ybWFsIHRvIGZhaWwgaGVyZSAtIHdlIGhhdmUgbm8gb3V0cHV0IHRvIGNvbXBhcmUuCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgeyBpZiB7IFtzdHJpbmcgbWF0Y2ggIipsaWJjKiIgJGV4ZWNfb3V0cHV0XSB9IHRoZW4gewotIyB0aGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlcmUgaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBsaWJjLCBzbyB3ZQotIyBjYW4ndCByZWFsbHkgcGVyZm9ybSB0aGlzIHRlc3QuCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eXZlcnN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKLQlyZXR1cm4gMAotICAgIH0gfQotCi19Ci0KLSMKLSMgb2JqZHVtcF9zeW1zdHVmZgotIwlEdW1wIG5vbi1keW5hbWljIHN5bWJvbCBzdHVmZiBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF9zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7Ci0gICAgZ2xvYmFsIFNPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFNPQkpEVU1QX0ZMQUdTXSB7IHNldCBTT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgZ3JlcCBcQCB8IHNvcnQgID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgZ3JlcCBcQCB8IHNvcnQgID4gJHRtcGRpci9vYmpkdW1wLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0KLSMgTm93IGRvIGEgbGluZS1ieS1saW5lIGNvbXBhcmlzb24gdG8gZWZmZWN0aXZlbHkgZGlmZiB0aGUgZGFybmVkIHRoaW5ncwotIyBUaGUgc3R1ZmYgY29taW5nIGZyb20gdGhlIGV4cGVjdGZpbGUgaXMgYWN0dWFsbHkgYSByZWdleCwgc28gd2UgY2FuCi0jIHNraXAgb3ZlciB0aGUgYWN0dWFsIGFkZHJlc3NlcyBhbmQgc28gZm9ydGguICBUaGlzIGlzIGN1cnJlbnRseSB2ZXJ5Ci0jIHNpbXBsZW1pbmRlZCAtIGl0IGV4cGVjdHMgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGluIHRlcm1zIG9mIGxpbmUKLSMgbnVtYmVycy4KLQotCWlmIFtmaWxlIGV4aXN0cyAkZXhwZWN0ZmlsZV0gdGhlbiB7Ci0JICAgIHNldCBmaWxlX2EgW29wZW4gJGV4cGVjdGZpbGUgcl0KLQl9IGVsc2UgewotCSAgICBwZXJyb3IgIiRleHBlY3RmaWxlIGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmIFtmaWxlIGV4aXN0cyAkdG1wZGlyL29iamR1bXAub3V0XSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYiBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0JfSBlbHNlIHsKLQkgICAgcGVycm9yICIkdG1wZGlyL29iamR1bXAub3V0IGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCi0JdmVyYm9zZSAiIyBEaWZmJ2luZzogJGV4cGVjdGZpbGUgJHRtcGRpci9vYmpkdW1wLm91dCIgMgotCi0Jc2V0IGVvZiAtMQotCXNldCBkaWZmZXJlbmNlcyAwCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2EgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9hCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2IgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2IgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9iCi0JCi0JZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBpIH0gewotCSAgICBzZXQgbGluZV9hIFtsaW5kZXggJGxpc3RfYSAkaV0KLQkgICAgc2V0IGxpbmVfYiBbbGluZGV4ICRsaXN0X2IgJGldCi0JICAgIAotCi0JICAgIHZlcmJvc2UgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9hIiAzCi0JICAgIHZlcmJvc2UgIlx0L3RtcC9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiIDMKLQkgICAgaWYgW3JlZ2V4cCAkbGluZV9hICRsaW5lX2JdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQl2ZXJib3NlIC1sb2cgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9hIgotCQl2ZXJib3NlIC1sb2cgIlx0JHRtcGRpci9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiCi0JCQotCQlyZXR1cm4gMAotCSAgICB9Ci0JfQotCQotCWlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiTGluZSBjb3VudCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgJGRpZmZlcmVuY2VzPDEgdGhlbiB7Ci0JICAgIHJldHVybiAxCi0JfQotCQotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLQotfQotCi0jCi0jIG9iamR1bXBfZHltc3ltc3R1ZmYKLSMJRHVtcCBkeW5hbWljIHN5bWJvbCBzdHVmZiBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF9keW5zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7Ci0gICAgZ2xvYmFsIERPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIERPQkpEVU1QX0ZMQUdTXSB7IHNldCBET0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCB8IHNvcnQgfCB1bmlxICA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkRE9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVkVSUy9wXFxcOy9zaG93L3AgfCBzb3J0IHwgdW5pcSAgPiAkdG1wZGlyL29iamR1bXAub3V0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotIyBOb3cgZG8gYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiB0byBlZmZlY3RpdmVseSBkaWZmIHRoZSBkYXJuZWQgdGhpbmdzCi0jIFRoZSBzdHVmZiBjb21pbmcgZnJvbSB0aGUgZXhwZWN0ZmlsZSBpcyBhY3R1YWxseSBhIHJlZ2V4LCBzbyB3ZSBjYW4KLSMgc2tpcCBvdmVyIHRoZSBhY3R1YWwgYWRkcmVzc2VzIGFuZCBzbyBmb3J0aC4gIFRoaXMgaXMgY3VycmVudGx5IHZlcnkKLSMgc2ltcGxlbWluZGVkIC0gaXQgZXhwZWN0cyBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgaW4gdGVybXMgb2YgbGluZQotIyBudW1iZXJzLgotCi0JaWYgW2ZpbGUgZXhpc3RzICRleHBlY3RmaWxlXSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYSBbb3BlbiAkZXhwZWN0ZmlsZSByXQotCX0gZWxzZSB7Ci0JICAgIHdhcm5pbmcgIiRleHBlY3RmaWxlIGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmIFtmaWxlIGV4aXN0cyAkdG1wZGlyL29iamR1bXAub3V0XSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYiBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0JfSBlbHNlIHsKLQkgICAgZmFpbCAiJHRtcGRpci9vYmpkdW1wLm91dCBkb2Vzbid0IGV4aXN0IgotCSAgICByZXR1cm4gMAotCX0KLQotCXZlcmJvc2UgIiMgRGlmZidpbmc6ICRleHBlY3RmaWxlICR0bXBkaXIvb2JqZHVtcC5vdXQiIDIKLQotCXNldCBlb2YgLTEKLQlzZXQgZGlmZmVyZW5jZXMgMAotCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZV9hIGxpbmVdICE9ICRlb2YgfSB7Ci0JICAgIGlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCWxhcHBlbmQgbGlzdF9hICRsaW5lCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGVfYQotCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZV9iIGxpbmVdICE9ICRlb2YgfSB7Ci0JICAgIGlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCWxhcHBlbmQgbGlzdF9iICRsaW5lCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGVfYgotCQotCWZvciB7IHNldCBpIDAgfSB7ICRpIDwgW2xsZW5ndGggJGxpc3RfYl0gfSB7IGluY3IgaSB9IHsKLQkgICAgc2V0IGxpbmVfYiBbbGluZGV4ICRsaXN0X2IgJGldCi0JICAgIAotIyBUaGUgdGVzdHMgYXJlIHJpZ2dlZCBzbyB0aGF0IHdlIHNob3VsZCBuZXZlciBleHBvcnQgYSBzeW1ib2wgd2l0aCB0aGUKLSMgd29yZCAnaGlkZScgaW4gaXQuICBUaHVzIHdlIGp1c3Qgc2VhcmNoIGZvciBpdCwgYW5kIGJhaWwgaWYgd2UgZmluZCBpdC4KLQkgICAgaWYgW3JlZ2V4cCAiaGlkZSIgJGxpbmVfYl0gdGhlbiB7Ci0JCXZlcmJvc2UgLWxvZyAiXHQkdG1wZGlyL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIKLQkJCi0JCXJldHVybiAwCi0JICAgIH0KLQotCSAgICB2ZXJib3NlICJcdCRleHBlY3RmaWxlOiAkaTogJGxpbmVfYiIgMwotCi0JICAgICMgV2UgY2FuJ3QgYXNzdW1lIHRoYXQgdGhlIHNvcnQgaXMgY29uc2lzdGVudCBhY3Jvc3MKLQkgICAgIyBzeXN0ZW1zLCBzbyB3ZSBtdXN0IGNoZWNrIGVhY2ggcmVnZXhwLiAgV2hlbiB3ZSBmaW5kIGEKLQkgICAgIyByZWdleHAsIHdlIG51bGwgaXQgb3V0LCBzbyB3ZSBkb24ndCBtYXRjaCBpdCB0d2ljZS4KLQkgICAgZm9yIHsgc2V0IGogMCB9IHsgJGogPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBqIH0gewotCQlzZXQgbGluZV9hIFtsaW5kZXggJGxpc3RfYSAkal0KLQotCQlpZiBbcmVnZXhwICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7Ci0JCSAgICBscmVwbGFjZSAkbGlzdF9hICRqICRqICJDQU4gTk9UIE1BVENIIgotCQkgICAgYnJlYWsKLQkJfQotCSAgICB9Ci0KLQkgICAgaWYgeyAkaiA+PSBbbGxlbmd0aCAkbGlzdF9hXSB9IHsKLQkJdmVyYm9zZSAtbG9nICJcdCR0bXBkaXIvb2JqZHVtcC5vdXQ6ICRpOiAkbGluZV9iIgotCQkKLQkJcmV0dXJuIDAKLQkgICAgfQotCX0KLQkKLQlpZiB7IFtsbGVuZ3RoICRsaXN0X2FdICE9IFtsbGVuZ3RoICRsaXN0X2JdIH0gewotCSAgICB2ZXJib3NlIC1sb2cgIkxpbmUgY291bnQiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmICRkaWZmZXJlbmNlczwxIHRoZW4gewotCSAgICByZXR1cm4gMQotCX0KLQkKLQlyZXR1cm4gMAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX3ZlcnNpb25zdHVmZgotIwlEdW1wIHZlcnNpb24gZGVmaW5pdGlvbnMvcmVmZXJlbmNlcyBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF92ZXJzaW9uc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCBleHBlY3RmaWxlIH0gewotICAgIGdsb2JhbCBWT0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0gICAgZ2xvYmFsIHRtcGRpcgotCi0gICAgaWYge1t3aGljaCAkb2JqZHVtcF0gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkb2JqZHVtcCBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgVk9CSkRVTVBfRkxBR1NdIHsgc2V0IFZPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRWT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WZXJzaW9uLyxcXFwkcCA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCi0JIyBJdCdzIE9LIGlmIHRoZXJlIGFyZSBleHRyYSBsaW5lcyBpbiB0aGUgYWN0dWFsIG91dHB1dDsgdGhleQotCSMgbWF5IGNvbWUgZnJvbSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGxpYmMuICBXZSByZXF1aXJlIHRoYXQKLQkjIGV2ZXJ5IGxpbmUgaW4gRVhQRUNURklMRSBhcHBlYXIgaW4gdGhlIG91dHB1dCBpbiBvcmRlci4KLQotCXNldCBmMSBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0Jc2V0IGYyIFtvcGVuICRleHBlY3RmaWxlIHJdCi0JZ2V0cyAkZjIgbDIKLQl3aGlsZSB7IFtnZXRzICRmMSBsMV0gIT0gLTEgfSB7Ci0JICAgIGlmIHsgW3N0cmluZyBtYXRjaCAkbDIgJGwxXSB9IHRoZW4gewotCQlpZiB7IFtnZXRzICRmMiBsMl0gPT0gLTEgfSB0aGVuIHsKLQkJICAgIGNsb3NlICRmMQotCQkgICAgY2xvc2UgJGYyCi0JCSAgICByZXR1cm4gMQotCQl9Ci0JICAgIH0KLQl9Ci0KLQkjIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHdpdGhvdXQgc2VlaW5nIHRoZSBsaW5lIHdlCi0JIyBleHBlY3RlZC4gIFRoaXMgaXMgYSB0ZXN0IGZhaWx1cmUuCi0KLQljbG9zZSAkZjEKLQljbG9zZSAkZjIKLQotCXZlcmJvc2UgLWxvZyAiRGlkIG5vdCBmaW5kIFwiJGwyXCIiCi0Jc2V0IGYxIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQl3aGlsZSB7IFtnZXRzICRmMSBsMV0gIT0gLTEgfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAkbDEKLQl9Ci0KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLXByb2MgYnVpbGRfdmVyc19saWIgeyB0ZXN0IHNvdXJjZSBsaWJuYW1lIG90aGVyIG1hcGZpbGUgdmVyZXhwIHZlcnN5bWV4cCBzeW1leHAgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBvYmpkdW1wCi0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIENGTEFHUwotICAgIGdsb2JhbCBzaGFyZWQKLSAgICBnbG9iYWwgc2NyaXB0Ci0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRsaWJuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kbGlibmFtZS5zICR0bXBkaXIvJGxpYm5hbWUubyBdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkb3RoZXJdIHRoZW4gewotCXNldCBvdGhlcl9saWIgIiIKLSAgICB9IGVsc2UgewotCXNldCBvdGhlcl9saWIgJHRtcGRpci8kb3RoZXIKLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRtYXBmaWxlXSB0aGVuIHsKLQlzZXQgc2NyaXB0X2FyZyAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHNjcmlwdF9hcmcgIiRzY3JpcHQgJHNyY2Rpci8kc3ViZGlyLyRtYXBmaWxlIgotICAgIH0KLQotICAgIGlmIHshW2xkX3NpbXBsZV9saW5rICRsZCAkdG1wZGlyLyRsaWJuYW1lLnNvICIkc2hhcmVkICR0bXBkaXIvJGxpYm5hbWUubyAkb3RoZXJfbGliICRzY3JpcHRfYXJnIl19ICAgICB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcmV4cCBdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHN5bWV4cF0gdGhlbiB7Ci0JaWYgeyFbb2JqZHVtcF9lbXB0eXN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUubyBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbb2JqZHVtcF9zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLm8gJHNyY2Rpci8kc3ViZGlyLyRzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci0gICAgCi19Ci0KLXByb2MgdGVzdF9sZGZhaWwgeyB0ZXN0IGZsYWcgc291cmNlIGV4ZWNuYW1lIG90aGVyIG1hcGZpbGUgd2h5ZmFpbCB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0gICAgZ2xvYmFsIHNjcmlwdAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkb3RoZXJdIHRoZW4gewotCXNldCBvdGhlcl9saWIgIiIKLSAgICB9IGVsc2UgewotCXNldCBvdGhlcl9saWIgJHRtcGRpci8kb3RoZXIKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkZmxhZyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRleGVjbmFtZS5zXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmICFbbGRfYXNzZW1ibGUgJGFzICR0bXBkaXIvJGV4ZWNuYW1lLnMgJHRtcGRpci8kZXhlY25hbWUubyBdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICJUaGlzIGxpbmsgc2hvdWxkIGZhaWwgYmVjYXVzZSBvZiAkd2h5ZmFpbCIKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJG1hcGZpbGVdIHRoZW4gewotCXNldCBzY3JpcHRfYXJnICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgc2NyaXB0X2FyZyAiJHNjcmlwdCAkc3JjZGlyLyRzdWJkaXIvJG1hcGZpbGUiCi0gICAgfQotCi0gICAgaWYgeyFbbGRfbGluayAkbGQgJHRtcGRpci8kZXhlY25hbWUgIiR0bXBkaXIvJGV4ZWNuYW1lLm8gJG90aGVyX2xpYiAkc2NyaXB0X2FyZyJdfSAgICAgewotCXBhc3MgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLSAgICBmYWlsICIkdGVzdCIKLX0KLQotcHJvYyB0ZXN0X2FzZmFpbCB7IHRlc3QgZmxhZyBzb3VyY2UgZXhlY25hbWUgd2h5ZmFpbCB9IHsKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkZmxhZyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRleGVjbmFtZS5zXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiVGhpcyBhc3NlbWJsZSBzaG91bGQgZmFpbCBiZWNhdXNlIG9mICR3aHlmYWlsIgotICAgIGNhdGNoICJleGVjICRhcyAtbyAkdG1wZGlyLyRleGVjbmFtZS5vICR0bXBkaXIvJGV4ZWNuYW1lLnMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLSAgICBwYXNzICIkdGVzdCIKLX0KLQotcHJvYyB0ZXN0X3N0cmlwX3ZlcnNfbGliIHsgdGVzdCBzcmNsaWIgbGlibmFtZSB2ZXJleHAgdmVyc3ltZXhwIH0gewotICAgIGdsb2JhbCBzdHJpcAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgb2JqZHVtcAotCi0gICAgdmVyYm9zZSAtbG9nICJjcCAkdG1wZGlyLyRzcmNsaWIgJHRtcGRpci8kbGlibmFtZS5zbyIKLSAgICBleGVjIGNwICR0bXBkaXIvJHNyY2xpYiAkdG1wZGlyLyRsaWJuYW1lLnNvCi0KLSAgICB2ZXJib3NlIC1sb2cgIiRzdHJpcCAkdG1wZGlyLyRsaWJuYW1lLnNvIgotICAgIGNhdGNoICJleGVjICRzdHJpcCAkdG1wZGlyLyRsaWJuYW1lLnNvIiBleGVjX291dHB1dAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotIyBJZiBzdHJpcCB3ZW50IE9LLCB0aGVuIHJ1biB0aGUgdXN1YWwgdGVzdHMgb24gdGhlIHRoaW5nIHRvIG1ha2Ugc3VyZSB0aGF0Ci0jIGl0IGlzIHNhbmUuCi0JaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcmV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotCQotCWlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotCQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3QKLX0KLQotCi1wcm9jIGJ1aWxkX2V4ZWMgeyB0ZXN0IHNvdXJjZSBleGVjbmFtZSBmbGFncyBzb2xpYm5hbWUgdmVyZXhwIHZlcnN5bWV4cCBzeW1leHAgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBvYmpkdW1wCi0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIENGTEFHUwotCi0gICAgc2V0IHNoYXJlZCAtLXNoYXJlZAotICAgIHNldCBzY3JpcHQgLS12ZXJzaW9uLXNjcmlwdAotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kZXhlY25hbWUucyAkdG1wZGlyLyRleGVjbmFtZS5vIF0gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRzb2xpYm5hbWVdIHRoZW4gewotCXNldCBzb2xpYm5hbWVfbGliICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgc29saWJuYW1lX2xpYiAkdG1wZGlyLyRzb2xpYm5hbWUKLSAgICB9Ci0KLSAgICBpZiB7IVtsZF9saW5rICRsZCAkdG1wZGlyLyRleGVjbmFtZSAiJGZsYWdzICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHNvbGlibmFtZV9saWIiXX0gICAgIHsKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICR2ZXJleHBdIHRoZW4gewotIwotIyBNYWtlIHN1cmUgd2UgZ2V0IG5vdGhpbmcgYmFjay4KLSMKLQlpZiB7IVtvYmpkdW1wX2VtcHR5dmVyc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfdmVyc2lvbnN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkdmVyc3ltZXhwXSB0aGVuIHsKLQlpZiB7IVtvYmpkdW1wX2VtcHR5ZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgJHNyY2Rpci8kc3ViZGlyLyR2ZXJzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRzeW1leHBdIHRoZW4gewotCWlmIHshW29iamR1bXBfZW1wdHlzeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZS5vIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiB7IVtvYmpkdW1wX3N5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHNyY2Rpci8kc3ViZGlyLyRzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLQotIwotIyBCYXNpYyB0ZXN0IC0gYnVpbGQgYSBsaWJyYXJ5IHdpdGggdmVyc2lvbmVkIHN5bWJvbHMuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczEiIHZlcnMxLmMgdmVyczEgIiIgdmVyczEubWFwIHZlcnMxLnZlciB2ZXJzMS5kc3ltIHZlcnMxLnN5bQotCi0KLSMKLSMgVGVzdCAjMiAtIGJ1aWxkIGEgbGlicmFyeSwgYW5kIGxpbmsgaXQgYWdhaW5zdCB0aGUgbGlicmFyeSB3ZSBidWlsdCBpbiBzdGVwCi0jIDEuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczIiIHZlcnMyLmMgdmVyczIgdmVyczEuc28gdmVyczIubWFwIHZlcnMyLnZlciB2ZXJzMi5kc3ltICIiCi0KLSMKLSMgVGVzdCAjMyAtIGJ1aWxkIGFuIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IGFnYWluc3QgdmVyczEuc28uCi0jCi1idWlsZF9leGVjICJ2ZXJzMyIgdmVyczMuYyB2ZXJzMyAiIiB2ZXJzMS5zbyB2ZXJzMy52ZXIgdmVyczMuZHN5bSAiIgotCi0jCi0jIFRlc3QgIzQgLSBNYWtlIHN1cmUgYSB2ZXJzaW9uIGltcGxpY2l0bHkgZGVmaW5lZCBpbiBhbiBleGVjdXRhYmxlCi0jIGNhdXNlcyBhIHZlcnNpb24gbm9kZSB0byBiZSBjcmVhdGVkLiAgVmVyaWZ5IHRoaXMgYm90aCB3aXRoIGFuZCB3aXRob3V0Ci0jIC0tZXhwb3J0LWR5bmFtaWMuCi0jCi0KLSMgVGhpcyB0ZXN0IGZhaWxzIG9uIE1JUFMuICBPbiB0aGUgTUlQUyB3ZSBtdXN0IHB1dCBmb28gaW4gdGhlIGR5bmFtaWMKLSMgc3ltYm9sIHRhYmxlLCB3aGljaCB0aGUgdGVzdCBkb2VzIG5vdCBleHBlY3QuCi1zZXR1cF94ZmFpbCAibWlwcyotKi0qIgotYnVpbGRfZXhlYyAidmVyczQiIHZlcnM0LmMgdmVyczQgIiIgIiIgIiIgIiIgdmVyczQuc3ltCi0KLWJ1aWxkX2V4ZWMgInZlcnM0YSIgdmVyczQuYyB2ZXJzNGEgIi1leHBvcnQtZHluYW1pYyIgIiIgdmVyczRhLnZlciB2ZXJzNGEuZHN5bSB2ZXJzNGEuc3ltCi0KLQotIwotIyBUcnkgbXVsdGlwbGUgZGVmaW5pdGlvbnMgZm9vQEJBUiBhbmQgZm9vQEBCQVIgYW5kIG1ha2Ugc3VyZSB0aGUgbGlua2VyCi0jIGNvbXBsYWlucy4KLSMKLXRlc3RfbGRmYWlsICJ2ZXJzNSIgIiIgdmVyczUuYyB2ZXJzNSAiIiAiIiAibXVsdGlwbGUgZGVmaW5pdGlvbiBvZiBmb29AVkVSU18xLjIiCi0KLSMKLSMKLSMgTm93IGJ1aWxkIGEgdGVzdCB0aGF0IHNob3VsZCByZWZlcmVuY2UgYSBidW5jaCBvZiB2ZXJzaW9uZWQgc3ltYm9scy4KLSMgQWxsIG9mIHRoZW0gc2hvdWxkIGJlIGNvcnJlY3RseSByZWZlcmVuY2VkLgotIwotYnVpbGRfZXhlYyAidmVyczYiIHZlcnM2LmMgdmVyczYgIiIgdmVyczEuc28gdmVyczYudmVyIHZlcnM2LmRzeW0gdmVyczYuc3ltCi0KLSMKLSMgQW5vdGhlciB0ZXN0IHRvIHZlcmlmeSB0aGF0IHNvbWV0aGluZyBtYWRlIGxvY2FsIHZpYSAnbG9jYWwnIGlzIHRydWx5IG5vdAotIyBhY2Nlc3NpYmxlLgotIwotYnVpbGRfdmVyc19saWIgInZlcnM3YSIgdmVyczdhLmMgdmVyczdhICIiIHZlcnM3Lm1hcCB2ZXJzN2EudmVyIHZlcnM3YS5kc3ltIHZlcnM3YS5zeW0KLQotdGVzdF9sZGZhaWwgInZlcnM3IiAiIiB2ZXJzNy5jIHZlcnM3IHZlcnM3YS5zbyAiIiAidW5kZWZpbmVkIHJlZmVyZW5jZSB0byBoaWRlX2EiCi0KLQotIwotIyBUaGlzIHRlc3QgaXMgZGVzaWduZWQgdG8gdmVyaWZ5IHRoYXQgd2UgY2FuIHBhc3MgYSBsaW5rZXIgc2NyaXB0IG9uIHRoZQotIyBjb21tYW5kIGxpbmUgYXMgaWYgaXQgd2VyZSBhIG5vcm1hbCAubyBmaWxlLgotIwotY2F0Y2ggImV4ZWMgY3AgJHNyY2Rpci8kc3ViZGlyL3ZlcnM4Lm1hcCAkdG1wZGlyLyIgaWdub3JlX291dHB1dAotYnVpbGRfdmVyc19saWIgInZlcnM4IiB2ZXJzMS5jIHZlcnM4IHZlcnM4Lm1hcCAiIiB2ZXJzOC52ZXIgdmVyczEuZHN5bSB2ZXJzMS5zeW0KLQotIwotIyBUaGlzIHRlc3QgdHJpZXMgdG8gbWFrZSBzdXJlIHRoYXQgdmVyc2lvbiByZWZlcmVuY2VzIHRvIHZlcnNpb25lZCBzeW1ib2xzCi0jIGRvbid0IGNvbGxpZGUgd2l0aCBkZWZhdWx0IGRlZmluaXRpb25zIHdpdGggdGhlIHNhbWUgc3ltYm9sLgotIwotYnVpbGRfZXhlYyAidmVyczkiIHZlcnM5LmMgdmVyczkgIi1leHBvcnQtZHluYW1pYyIgIiIgdmVyczkudmVyIHZlcnM5LmRzeW0gdmVyczkuc3ltCi0KLQotIwotIyBUcnkgYW5kIHVzZSBhIG5vbi1leGlzdGFudCB2ZXJzaW9uIG5vZGUuICBUaGUgbGlua2VyIHNob3VsZCBmYWlsIHdpdGgKLSMgYW4gZXJyb3IgbWVzc2FnZS4KLSMKLXRlc3RfbGRmYWlsICJ2ZXJzMTAiICItRERPX1RFU1QxMCIgdmVyczEuYyB2ZXJzMTAgIiIgInZlcnMxLm1hcCAtLXNoYXJlZCIgImludmFsaWQgdmVyc2lvbiIKLQotIwotIyBUcnkgYW5kIHNvbWUgdGhpbmdzIHRoZSBhc3NlbWJsZXIgc2hvdWxkIGNvbXBsYWluIGFib3V0LgotIwotdGVzdF9hc2ZhaWwgInZlcnMxMSIgIi1ERE9fVEVTVDExIiB2ZXJzMS5jIHZlcnMxMSAibm8gQCBpbiBzeW12ZXIiCi0KLXRlc3RfYXNmYWlsICJ2ZXJzMTIiICItRERPX1RFU1QxMiIgdmVyczEuYyB2ZXJzMTIgImV4dGVybiB2ZXJzaW9uIGRlZmluaXRpb24iCi0KLSMKLSMgUHV0IGEgc2hhcmVkIGxpYnJhcnkgaW4gYW4gYXJjaGl2ZSBsaWJyYXJ5LCBhbmQgbWFrZSBzdXJlIHRoZSBnbG9iYWwKLSMgYXJjaGl2ZSBzeW1ib2wgdGFibGUgaXMgc2FuZS4KLSMKLXRlc3RfYXIgImFyIHdpdGggdmVyc2lvbmVkIHNvbGliIiB2ZXJzMTMuYSB2ZXJzMS5zbyB2ZXJzMTMuYXN5bQotCi0jCi0jIFN0cmlwIGEgc2hhcmVkIGxpYnJhcnksIGFuZCBtYWtlIHN1cmUgd2UgZGlkbid0IHNjcmV3IHNvbWV0aGluZyB1cCBpbiB0aGVyZS4KLSMKLXRlc3Rfc3RyaXBfdmVyc19saWIgInZlcnMxNCIgdmVyczEuc28gdmVyczE0IHZlcnMxLnZlciB2ZXJzMS5kc3ltIAotCi0KLSMKLSMgQnVpbGQgYW5vdGhlciB0ZXN0IHdpdGggc29tZSB2ZXJzaW9uZWQgc3ltYm9scy4gIEhlcmUgd2UgYXJlIGdvaW5nIHRvIAotIyB0cnkgYW5kIG92ZXJyaWRlIHNvbWV0aGluZyBmcm9tIHRoZSBsaWJyYXJ5LCBhbmQgd2Ugc2hvdWxkbid0IGdldAotIyBhbnkgZXJyb3JzLgotIwotYnVpbGRfZXhlYyAidmVyczE1IiB2ZXJzMTUuYyB2ZXJzMTUgIiIgdmVyczEuc28gdmVyczE1LnZlciB2ZXJzMTUuZHN5bSB2ZXJzMTUuc3ltCi0KLSMKLSMgVGVzdCB0aGF0IHdoZW4gd2Ugb3ZlcnJpZGUgYSB2ZXJzaW9uZWQgc3ltYm9sIGZyb20gdGhlIGxpYnJhcnkgdGhpcwotIyBzeW1ib2wgYXBwZWFycyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgdGhlIGV4ZWN1dGFibGUuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczE2YSIgdmVyczE2YS5jIHZlcnMxNmEgIiIgdmVyczE2Lm1hcCB2ZXJzMTZhLnZlciB2ZXJzMTZhLmRzeW0gIiIKLWJ1aWxkX2V4ZWMgInZlcnMxNiIgdmVyczE2LmMgdmVyczE2ICIiIHZlcnMxNmEuc28gIiIgdmVyczE2LmRzeW0gIiIKLQotIyBUZXN0IGEgd2VhayB2ZXJzaW9uZWQgc3ltYm9sLgotYnVpbGRfdmVyc19saWIgInZlcnMxNyIgdmVyczE3LmMgdmVyczE3ICIiIHZlcnMxNy5tYXAgdmVyczE3LnZlciB2ZXJzMTcuZHN5bSAiIgotYnVpbGRfdmVyc19saWIgInZlcnMxOCIgdmVyczE4LmMgdmVyczE4IHZlcnMxNy5zbyB2ZXJzMTgubWFwIHZlcnMxOC52ZXIgdmVyczE4LmRzeW0gdmVyczE4LnN5bQotYnVpbGRfZXhlYyAidmVyczE5IiB2ZXJzMTkuYyB2ZXJzMTkgIiIgdmVyczE4LnNvIHZlcnMxOS52ZXIgdmVyczE5LmRzeW0gIiIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDQxZmQ5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQmFzaWMgdGVzdCBvZiB2ZXJzaW9uaW5nLiAgVGhlIGlkZWEgd2l0aCB0aGlzIGlzIHRoYXQgd2UgZGVmaW5lCi0gKiBhIGJ1bmNoIG9mIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHN5bWJvbCwgYW5kIHdlIGNhbiB0aGVvcmV0aWNhbGx5Ci0gKiB0aGVuIGxpbmsgYXBwbGljYXRpb25zIGFnYWluc3QgdmFyeWluZyBzZXRzIG9mIHRoZXNlLgotICovCi1jb25zdCBjaGFyICogc2hvd19iYXIxID0gImFzZGYiOwotY29uc3QgY2hhciAqIHNob3dfYmFyMiA9ICJhc2RmIjsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi0vKgotICogVGhlICdoaWRlJyBwcmVmaXggaXMgc29tZXRoaW5nIHNvIHRoYXQgd2UgY2FuIGF1dG9tYXRpY2FsbHkgc2VhcmNoIHRoZQotICogc3ltYm9sIHRhYmxlIGFuZCB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZXNlIHN5bWJvbHMgd2VyZSBhY3R1YWxseSBleHBvcnRlZC4KLSAqLwotaW50Ci1oaWRlX29yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX29sZF9mb28oKQotewotCXJldHVybiAxMCtiYXIoKTsKLQotfQotCi1pbnQKLWhpZGVfb2xkX2ZvbzEoKQotewotCXJldHVybiAxMDArYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX25ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vcmlnaW5hbF9mb28sc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb2xkX2ZvbyxzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28xLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfbmV3X2ZvbyxzaG93X2Zvb0BAVkVSU18yLjAiKTsKLQotCi0KLSNpZmRlZiBET19URVNUMTAKLS8qIEluIHRlc3QgMTAsIHdlIHRyeSBhbmQgZGVmaW5lIGEgbm9uLWV4aXN0YW50IHZlcnNpb24gbm9kZS4gIFRoZSBsaW5rZXIKLSAqIHNob3VsZCBjYXRjaCB0aGlzIGFuZCBjb21wbGFpbi4gKi8KLWludAotaGlkZV9uZXdfYm9ndXNfZm9vKCkKLXsKLQlyZXR1cm4gMTAwMCtiYXIoKTsKLQotfQotX19hc21fXygiLnN5bXZlciBoaWRlX25ld19ib2d1c19mb28sc2hvd19mb29AVkVSU18yLjIiKTsKLSNlbmRpZgotCi0KLQotCi0jaWZkZWYgRE9fVEVTVDExCi0vKgotICogVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIGNhdGNoIGEgY291cGxlIG9mIHN5bnRhY3RpYyBlcnJvcnMuICBUaGUgYXNzZW1ibGVyCi0gKiBzaG91bGQgY29tcGxhaW4gYWJvdXQgYm90aCBvZiB0aGUgZGlyZWN0aXZlcyBiZWxvdy4KLSAqLwotaW50Ci14eXp6eigpCi17Ci0gIG5ldzJfZm9vKCk7Ci0gIGJhcjMzKCk7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgbmV3Ml9mb28sZm9vVkVSU18yLjAiKTsKLV9fYXNtX18oIi5zeW12ZXIgYmFyMzMsYmFyQEBWRVJTXzIuMCIpOwotI2VuZGlmCi0KLSNpZmRlZiBET19URVNUMTIKLS8qCi0gKiBUaGlzIHRlc3QgaXMgZGVzaWduZWQgdG8gY2F0Y2ggYSBjb3VwbGUgb2Ygc3ludGFjdGljIGVycm9ycy4gIFRoZSBhc3NlbWJsZXIKLSAqIHNob3VsZCBjb21wbGFpbiBhYm91dCBib3RoIG9mIHRoZSBkaXJlY3RpdmVzIGJlbG93LgotICovCi1pbnQKLXh5enp6KCkKLXsKLSAgbmV3Ml9mb28oKTsKLSAgYmFyMzMoKTsKLX0KLQotX19hc21fXygiLnN5bXZlciBiYXIzMyxiYXJAQFZFUlNfMi4wIik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ0MzRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18yLjAgICAgVkVSU18yLjAKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChCYXNlXCkgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4yXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgRE8gKC5zP2RhdGF8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICBzaG93X2JhcjEKLVswLTlhLWZdKiBnICAgIERPICgucz9kYXRhfFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgc2hvd19iYXIyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzM3YmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotVkVSU18xLjEgewotCSBnbG9iYWw6Ci0JCSBmb28xOwotCSBsb2NhbDoKLQkJIGhpZGVfb2xkKjsgCi0JCSBoaWRlX29yaWdpbmFsKjsgCi0JCSBoaWRlX25ldyo7IAotfTsKLQotVkVSU18xLjIgewotCQkgZm9vMjsKLX0gVkVSU18xLjE7Ci0KLVZFUlNfMi4wIHsKLQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotfSBWRVJTXzEuMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmZjg1NS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTczMTJiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBhMjY4ODFmIHRtcGRpci92ZXJzMS5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKLTMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0JVkVSU18xLjEgCi00IDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMAotCVZFUlNfMS4yIAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTMuYXN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ2MTQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotVkVSU18xLjEgaW4gdmVyczEuc28KLVZFUlNfMS4yIGluIHZlcnMxLnNvCi1WRVJTXzIuMCBpbiB2ZXJzMS5zbwotYmFyIGluIHZlcnMxLnNvCi1zaG93X2JhcjEgaW4gdmVyczEuc28KLXNob3dfYmFyMiBpbiB2ZXJzMS5zbwotc2hvd19mb29AIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BAVkVSU18yLjAgaW4gdmVyczEuc28KLXNob3dfZm9vQFZFUlNfMS4xIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BWRVJTXzEuMiBpbiB2ZXJzMS5zbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyYmUzZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byBtYWtlIHN1cmUgdGhhdCBpZiB3ZSBleHRlcm5hbGx5IHJlZmVyZW5jZSBhIHZlcnNpb25lZCBzeW1ib2wKLSAqIHRoYXQgd2UgYWx3YXlzIGdldCB0aGUgcmlnaHQgb25lLgotICovCi0KLWludAotZm9vXzEoKQotewotICByZXR1cm4gMTAzNDsKLX0KLQotaW50Ci1mb29fMigpCi17Ci0gIHJldHVybiAxMzQzOwotfQotCi1pbnQKLWZvb18zKCkKLXsKLSAgcmV0dXJuIDEzMzQ7Ci19Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiRXhwZWN0IDQsICAgIGdldCAlZFxuIiwgZm9vXzEoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEzLCAgIGdldCAlZFxuIiwgZm9vXzIoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEwMywgIGdldCAlZFxuIiwgZm9vXzMoKSk7Ci0gIHJldHVybiAwOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGZvb18xLHNob3dfZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBmb29fMixzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBmb29fMyxzaG93X2Zvb0BAVkVSU18xLjIiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNWUxNWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKEJhc2VcKSAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMVwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzEuMiAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2JhYjYyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzEuMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmVjNTguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBkOGEyNjA1IHRtcGRpci92ZXJzMTUKLTIgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0zIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjY4YmM2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotaW50IHNob3dfYmFyICgpCi17Ci0gIHJldHVybiAwOwotfQotZXh0ZXJuIGludCBzaG93X2ZvbyAoKTsKLQotaW50IG1haW4gKCkKLXsKLSAgcmV0dXJuIHNob3dfZm9vICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0MjRjMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSooICBCYXNlICAgICAgICk/ICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2JhcgotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSooICAgICAgICAgICAgICk/ICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjMzMmYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVkVSU18xLjEgewotICBnbG9iYWw6IHNob3dfYmFyOwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzYjFmZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWludCBzaG93X2JhciAoKQotewotICByZXR1cm4gMTsKLX0KLWludCBzaG93X2ZvbyAoKQotewotICByZXR1cm4gc2hvd19iYXIgKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGRmNDcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1bMC05YS1mXSogZyAgICBETyAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xXC4xICAgIFZFUlNfMVwuMQotWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMVwuMSAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iYXIKLVswLTlhLWZdKiBnICAgIERGIChcLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBCYXNlICAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2YxZGYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwNjAxY2ZiZiB0bXBkaXIvdmVyczE2YS5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2Q2NDcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWludAotc2hvd19mb28gKCkKLXsKLSAgcmV0dXJuIDk5OwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlY2MwYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18yLjAgICAgVkVSU18yLjAKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3Lm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzljZjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVkVSU18yLjAgewotCSBnbG9iYWw6Ci0JCSBzaG93X2ZvbzsKLX07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4ZDU5Yy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcudmVyCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MDI2MDVkM2YgdG1wZGlyL3ZlcnMxNy5zbwotMiAweDAwIDB4MGE3OTIyYjAgVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZGNjMjUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1pbnQKLWJhciAoKQotewotICByZXR1cm4gMzsKLX0KLQotI3ByYWdtYSB3ZWFrIGhpZGVfb3JpZ2luYWxfZm9vCi0KLWludAotaGlkZV9vcmlnaW5hbF9mb28gKCkKLXsKLSAgcmV0dXJuIDEgKyBiYXIgKCk7Ci19Ci0KLSNwcmFnbWEgd2VhayBoaWRlX29sZF9mb28KLQotaW50Ci1oaWRlX29sZF9mb28gKCkKLXsKLSAgcmV0dXJuIDEwICsgYmFyKCk7Ci19Ci0KLSNwcmFnbWEgd2VhayBoaWRlX29sZF9mb28xCi0KLWludAotaGlkZV9vbGRfZm9vMSAoKQotewotICByZXR1cm4gMTAwICsgYmFyICgpOwotfQotCi0jcHJhZ21hIHdlYWsgaGlkZV9uZXdfZm9vCi0KLWludAotaGlkZV9uZXdfZm9vICgpCi17Ci0gIHJldHVybiAxMDAwICsgYmFyICgpOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb3JpZ2luYWxfZm9vLHNob3dfZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28sc2hvd19mb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vbGRfZm9vMSxzaG93X2Zvb0BWRVJTXzEuMiIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX25ld19mb28sc2hvd19mb29AQFZFUlNfMi4wIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNhZDdiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1bMC05YS1mXSogIHcgICBERiAoXCpVTkRcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18yLjAgICAgVkVSU18yLjAKLVswLTlhLWZdKiAgdyAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChCYXNlXCkgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogIHcgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qICB3ICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4yXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTgubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWMyYjBlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1WRVJTXzEuMSB7Ci0JIGdsb2JhbDoKLQkJIGZvbzE7Ci0JIGxvY2FsOgotCQkgaGlkZV9vbGQqOyAKLQkJIGhpZGVfb3JpZ2luYWwqOyAKLQkJIGhpZGVfbmV3KjsgCi19OwotCi1WRVJTXzEuMiB7Ci0JCSBmb28yOwotfSBWRVJTXzEuMTsKLQotVkVSU18yLjAgewotfSBWRVJTXzEuMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWNlZmRmLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswLTlhLWZdKiAgdyAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogIHcgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogIHcgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogIHcgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTI5OTYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwMjYwOGQzZiB0bXBkaXIvdmVyczE4LnNvCi0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotMyAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLQlWRVJTXzEuMSAKLTQgMHgwMiAweDBhNzkyMmIwIFZFUlNfMi4wCi0JVkVSU18xLjIgCi0KLVZlcnNpb24gUmVmZXJlbmNlczoKLSAgcmVxdWlyZWQgZnJvbSB0bXBkaXIvdmVyczE3LnNvOgotICAgIDB4MGE3OTIyYjAgMHgwMCAwNSBWRVJTXzIuMAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJkODNjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1pbnQKLW1haW4gKCkKLXsKLSAgcHJpbnRmICgiJWRcbiIsIHNob3dfZm9vICgpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWMyNjQyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmRjODguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tICp0bXBkaXIvdmVyczE3LnNvOgotICAgIDB4MGE3OTIyYjAgMHgwMCAwMiBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTUzN2UuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qCi0gKiBUZXN0IGZ1bmN0aW9uLiAgVGhpcyBpcyBidWlsdCBpbnRvIGEgc2hhcmVkIGxpYnJhcnksIGFuZCByZWZlcmVuY2VzIGEKLSAqIHZlcnNpb25lZCBzeW1ib2wgZm9vIHRoYXQgaXMgaW4gdGVzdC5zby4KLSAqLwotCi12b2lkCi1zaG93X3h5enp5KCkKLXsKLSAgcHJpbnRmKCIlZCIsIHNob3dfZm9vKCkpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTg1YzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU19YWFhfMS4xIFZFUlNfWFhYXzEuMQotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU19YWFhfMS4xICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X3h5enp5CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTdkN2UuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLVZFUlNfWFhYXzEuMSB7Ci0JCSBzaG93X3h5enp5OwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyNjM0My4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwYTI2MTgxZiB0bXBkaXIvdmVyczIuc28KLTIgMHgwMCAweDA4Nzg1YjUxIFZFUlNfWFhYXzEuMQotCi1WZXJzaW9uIFJlZmVyZW5jZXM6Ci0gIHJlcXVpcmVkIGZyb20gdG1wZGlyL3ZlcnMxLnNvOgotICAgIDB4MGE3OTIyYjAgMHgwMCAwMyBWRVJTXzIuMAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwNmQ3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyoKLSAqIE1haW4gcHJvZ3JhbSBmb3IgdGVzdDEsIHRlc3QyLgotICovCi0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiJWRcbiIsIHNob3dfZm9vKCkpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWMyNjQyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjMwZWUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMudmVyCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1WZXJzaW9uIFJlZmVyZW5jZXM6Ci0gIHJlcXVpcmVkIGZyb20gdG1wZGlyL3ZlcnMxLnNvOgotICAgIDB4MGE3OTIyYjAgMHgwMCAwMiBWRVJTXzIuMAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0OTdjYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIFRlc3RjYXNlIHRvIG1ha2Ugc3VyZSB0aGF0IGEgdmVyc2lvbmVkIHN5bWJvbCBkZWZpbml0aW9uIGluIGFuCi0gKiBhcHBsaWNhdGlvbiBjb3JyZWN0bHkgZGVmaW5lcyB0aGUgdmVyc2lvbiBub2RlLCBpZiBhbmQgb25seSBpZgotICogdGhlIGFjdHVhbCBzeW1ib2wgaXMgZXhwb3J0ZWQuICBUaGlzIGlzIGJ1aWx0IGJvdGggd2l0aCBhbmQgd2l0aG91dAotICogLWV4cG9ydC1keW5hbWljLgotICovCi1pbnQKLWJhcigpCi17Ci0JcmV0dXJuIDM7Ci19Ci0KLWludAotbmV3X2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLQotX19hc21fXygiLnN5bXZlciBuZXdfZm9vLGZvb0BAVkVSU18yLjAiKTsKLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCIlZFxuIiwgZm9vKCkpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0OTQ0Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0BAVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjlmZGEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMi4wICAgIFZFUlNfMi4wCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0OTQ0Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2Y2VkYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEudmVyCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGQ4YTI2ZTEgdG1wZGlyL3ZlcnM0YQotMiAweDAwIDB4MGE3OTIyYjAgVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczUuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNmVhNDAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczUuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byB2ZXJpZnkgdGhhdCBmb29AQkFSIGFuZCBmb29AQEJBUiBhcmUgY29ycmVjdGx5IGRldGVjdGVkCi0gKiBhcyBhIG11bHRpcGx5IGRlZmluZWQgc3ltYm9sLgotICovCi1jb25zdCBjaGFyICogYmFyMSA9ICJhc2RmIjsKLWNvbnN0IGNoYXIgKiBiYXIyID0gImFzZGYiOwotCi1pbnQKLWJhcigpCi17Ci0JcmV0dXJuIDM7Ci19Ci0KLWludAotb3JpZ2luYWxfZm9vKCkKLXsKLQlyZXR1cm4gMStiYXIoKTsKLQotfQotCi1pbnQKLW9sZF9mb28oKQotewotCXJldHVybiAxMCtiYXIoKTsKLQotfQotCi1pbnQKLW9sZF9mb28xKCkKLXsKLQlyZXR1cm4gMTAwK2JhcigpOwotCi19Ci0KLWludAotbmV3X2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLQotX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBvbGRfZm9vLGZvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBvbGRfZm9vMSxmb29AVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQFZFUlNfMS4yIik7Ci0KLWludAotbWFpbiAoKQotewotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg2OGJmLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gbWFrZSBzdXJlIHRoYXQgaWYgd2UgZXh0ZXJuYWxseSByZWZlcmVuY2UgYSB2ZXJzaW9uZWQgc3ltYm9sCi0gKiB0aGF0IHdlIGFsd2F5cyBnZXQgdGhlIHJpZ2h0IG9uZS4KLSAqLwotCi1pbnQKLW1haW4oKQotewotICBwcmludGYoIkV4cGVjdCA0LCAgICBnZXQgJWRcbiIsIGZvb18xKCkpOwotICBwcmludGYoIkV4cGVjdCAxMywgICBnZXQgJWRcbiIsIGZvb18yKCkpOwotICBwcmludGYoIkV4cGVjdCAxMDMsICBnZXQgJWRcbiIsIGZvb18zKCkpOwotICBwcmludGYoIkV4cGVjdCAxMDAzLCBnZXQgJWRcbiIsIGZvb180KCkpOwotICByZXR1cm4gMDsKLX0KLQotX19hc21fXygiLnN5bXZlciBmb29fMSxzaG93X2Zvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgZm9vXzIsc2hvd19mb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgZm9vXzMsc2hvd19mb29AVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgZm9vXzQsc2hvd19mb29AVkVSU18yLjAiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg1MWQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICAgICAgICAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzEuMiAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzEuMSAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiNWNjNy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswXSogKkY/ICpcKlVORFwqCVswXSogc2hvd19mb29ACi1bMF0qICpGPyAqXCpVTkRcKglbMF0qIHNob3dfZm9vQFZFUlNfMS4xCi1bMF0qICpGPyAqXCpVTkRcKglbMF0qIHNob3dfZm9vQFZFUlNfMS4yCi1bMF0qICpGPyAqXCpVTkRcKglbMF0qIHNob3dfZm9vQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTJiNDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1WZXJzaW9uIFJlZmVyZW5jZXM6Ci0gIHJlcXVpcmVkIGZyb20gdG1wZGlyL3ZlcnMxLnNvOgotICAgIDB4MGE3OTI3YjEgMHgwMCA/PyBWRVJTXzEuMQotICAgIDB4MGE3OTI3YjIgMHgwMCA/PyBWRVJTXzEuMgotICAgIDB4MGE3OTIyYjAgMHgwMCA/PyBWRVJTXzIuMAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1YjdlMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoKLSAqIFRlc3QgcHJvZ3JhbSB0aGF0IGdvZXMgd2l0aCB0ZXN0Ny5zbwotICovCi0KLQotaW50Ci1tYWluKCkKLXsKLSAgcmV0dXJuIGhpZGVfYSgxKSArIHNob3dfYigxKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmQ1MDEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1WRVJTXzEgewotCWdsb2JhbDoKLQkJc2hvd19iIDsKLQlsb2NhbDoKLQkJaGlkZV9hOwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZWU4YzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogVGVzdCBzdXBwbGllZCBieSBVbHJpY2guICBWZXJpZnkgdGhhdCB3ZSBjYW4gY29ycmVjdGx5IGZvcmNlICdhJwotICogdG8gbG9jYWwgc2NvcGUuCi0gKi8KLWludAotX19hX2ludGVybmFsIChpbnQgZSkKLXsKLSAgcmV0dXJuIGUgKyAxMDsKLX0KLQotaW50Ci1fX2JfaW50ZXJuYWwgKGludCBlKQotewotICByZXR1cm4gZSArIDQyOwotfQotCi1hc20gKCIuc3ltdmVyIF9fYV9pbnRlcm5hbCxoaWRlX2FAQFZFUlNfMSIpOwotYXNtICgiLnN5bXZlciBfX2JfaW50ZXJuYWwsc2hvd19iQEBWRVJTXzEiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Njk2YzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMSAgICAgIFZFUlNfMQotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfYgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OWJkNjEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9oaWRlX2FAQFZFUlNfMQotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2JAQFZFUlNfMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWY4YTguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDAyNjlmZDNmIHRtcGRpci92ZXJzN2Euc28KLTIgMHgwMCAweDA1YWE3OTIxIFZFUlNfMQotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0NTg2Yy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5jCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1pbnQKLW1haW4oKQotewotICByZXR1cm4gYSgxKSArIGIoMSk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzU5NTUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotVkVSU0lPTiB7Ci0JVkVSU18xLjEgewotCQkgZ2xvYmFsOgotCQkJIGZvbzE7Ci0JCSBsb2NhbDoKLQkJCSBoaWRlX29sZCo7IAotCQkJIGhpZGVfb3JpZ2luYWwqOyAKLQkJCSBoaWRlX25ldyo7IAotCX07Ci0JCi0JVkVSU18xLjIgewotCQkJIGZvbzI7Ci0JfSBWRVJTXzEuMTsKLQkKLQlWRVJTXzIuMCB7Ci0JCQkgc2hvd19iYXIxOyBzaG93X2JhcjI7Ci0JfSBWRVJTXzEuMjsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1OTAyMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwYTI2ZjgxZiB0bXBkaXIvdmVyczguc28KLTIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0zIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgotCVZFUlNfMS4xIAotNCAweDAwIDB4MGE3OTIyYjAgVkVSU18yLjAKLQlWRVJTXzEuMiAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmZkZGIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byB2ZXJpZnkgdGhhdCByZWZlcmVuY2UgdG8gZm9vQEJBUiBhbmQgYSBkZWZpbml0aW9uIG9mIGZvb0BAQkFSCi0gKiBhcmUgbm90IHRyZWF0ZWQgYXMgYSBtdWx0aXBsZSBkZWYuCi0gKi8KLWNvbnN0IGNoYXIgKiBiYXIxID0gImFzZGYiOwotY29uc3QgY2hhciAqIGJhcjIgPSAiYXNkZiI7Ci0KLWludAotYmFyKCkKLXsKLQlyZXR1cm4gMzsKLX0KLQotaW50Ci1vcmlnaW5hbF9mb28oKQotewotCXJldHVybiAxK2JhcigpOwotCi19Ci0KLWludAotb2xkX2ZvbygpCi17Ci0JcmV0dXJuIDEwK2JhcigpOwotCi19Ci0KLWludAotbmV3X2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLQotaW50Ci1tYWluKCkKLXsKLSAgb2xkX2ZvbzEoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBWRVJTXzEuMiIpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTMwMDIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjEgICAgVkVSU18xLjEKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4yICAgIFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMS4yICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzMTUxNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswXSogKkY/ICpcKlVORFwqCVswXSogZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0AKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0BAVkVSU18xLjIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczYmE3Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwNGQ4YTI2OSB0bXBkaXIvdmVyczkKLTIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0zIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL2VtcGljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1MjhiZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgbGQtZW1waWMgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIFRlc3QgdGhlIGhhbmRsaW5nIG9mIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUuICBUaGlzIHRlc3QgZXNzZW50aWFsbHkKLSMgdGVzdHMgdGhlIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgYXMgd2VsbCBhcyB0aGUgbGlua2VyLCBzaW5jZSBNSVBTCi0jIGVtYmVkZGVkIFBJQyBpcyBhIEdOVSBlbmhhbmNlbWVudCB0byBzdGFuZGFyZCBNSVBTIHRvb2xzLgotCi0jIEVtYmVkZGVkIFBJQyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgTUlQUyBFQ09GRiB0YXJnZXRzLgotaWYgIVtpc3RhcmdldCBtaXBzKi0qLWVjb2ZmKl0gewotICAgIHJldHVybgotfQotCi1zZXQgdGVzdG5hbWUgcmVsYXgKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi0jIFRlc3QgdGhhdCByZWxheGF0aW9uIHdvcmtzIGNvcnJlY3RseS4gIFRoaXMgdGVzdHN1aXRlIHdhcyBjb21wb3NlZAotIyAoYnkgZXhwZXJpbWVudGF0aW9uKSB0byBmb3JjZSB0aGUgbGlua2VyIHRvIHJlbGF4IHR3aWNlLS10aGF0IGlzLAotIyB0aGUgZmlyc3QgcmVsYXhhdGlvbiBwYXNzIHdpbGwgZm9yY2UgYW5vdGhlciBjYWxsIHRvIGJlIG91dCBvZgotIyByYW5nZSwgcmVxdWlyaW5nIGEgc2Vjb25kIHJlbGF4YXRpb24gcGFzcy4KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4MS5jIHRtcGRpci9yZWxheDEub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4Mi5jIHRtcGRpci9yZWxheDIub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4My5jIHRtcGRpci9yZWxheDMub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4NC5jIHRtcGRpci9yZWxheDQub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3JlbGF4ICItLXJlbGF4IC1UICRzcmNkaXIvJHN1YmRpci9yZWxheC50IHRtcGRpci9yZWxheDEubyB0bXBkaXIvcmVsYXgyLm8gdG1wZGlyL3JlbGF4My5vIHRtcGRpci9yZWxheDQubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICAjIENoZWNrIHRoYXQgdGhlIHJlbGF4YXRpb24gcHJvZHVjZWQgdGhlIGNvcnJlY3QgcmVzdWx0LiAgQ2hlY2sKLSAgICAjIGVhY2ggYmFsIGluc3RydWN0aW9uLiAgU29tZSB3aWxsIGdvIGRpcmVjdGx5IHRvIHRoZSBzdGFydCBvZiBhCi0gICAgIyBmdW5jdGlvbiwgd2hpY2ggaXMgT0suICBTb21lIHdpbGwgZm9ybSBwYXJ0IG9mIHRoZSBmaXZlCi0gICAgIyBpbnN0cnVjdGlvbiBleHBhbmRlZCBjYWxsIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIHdlIGNvbXB1dGUgdGhlCi0gICAgIyByZWFsIGRlc3RpbmF0aW9uIGFuZCBtYWtlIHN1cmUgaXQgaXMgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uCi0gICAgIyBTb21lIGJhbCBpbnN0cnVjdGlvbnMgYXJlIHVzZWQgdG8gbG9jYXRlIHRoZSBzdGFydCBvZiB0aGUKLSAgICAjIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGRvIHBvc2l0aW9uIGluZGVwZW5kZW50IGFkZHJlc3NpbmcgaW50byB0aGUKLSAgICAjIHRleHQgc2VjdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IGNoZWNrIHRoYXQgaXQgY29ycmVjdGx5Ci0gICAgIyBjb21wdXRlcyB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgotCi0gICAgIyBHZXQgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvcmVsYXhdIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgICMgR2V0IGEgZGlzYXNzZW1ibHkuCi0gICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1kIHRtcGRpci9yZWxheCA+dG1wZGlyL3JlbGF4LmRpc1xuIgotICAgIHZlcmJvc2UgIiRvYmpkdW1wIC1kIHRtcGRpci9yZWxheCA+dG1wZGlyL3JlbGF4LmRpcyIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXMiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgYmFsY250IDAKLSAgICBzZXQgZmlsZSBbb3BlbiB0bXBkaXIvcmVsYXguZGlzIHJdCi0gICAgd2hpbGUgeyBbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMSB9IHsKLQl2ZXJib3NlICIkbGluZSIgMgotCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIipiYWwqIiAkbGluZV0gewotCSAgICBjb250aW51ZQotCX0KLQotCXZlcmJvc2UgIiRsaW5lIgotCi0JaW5jciBiYWxjbnQKLQotCWlmICFbcmVnZXhwICJeKFxbMC05YS1mQS1GXF0rKSAoPFxbYS16KzAtOUEtWi5cXSs+KT8gYmFsIChcWzAtOWEtZkEtRlxdKykiICRsaW5lIHdob2xlIGFkZHIgbGFiZWwgZGVzdF0gewotCSAgICBwZXJyb3IgInVucmVjb2duaXplZCBmb3JtYXQgZm9yICRsaW5lIgotCSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0KLQlpZiAiMHgkYWRkciArIDggIT0gMHgkZGVzdCIgewotCSAgICAjIFRoaXMgaXMgYSBzdHJhaWdodCBmdW5jdGlvbiBjYWxsLiAgQWxsIGZ1bmN0aW9uIGNhbGxzIGluCi0JICAgICMgdGhpcyBleGFtcGxlIGFyZSB0byBlaXRoZXIgZm9vIG9yIGJhci4KLQkgICAgaWYgIjB4JGRlc3QgIT0gJG5tX291dHB1dChmb28pICYmIDB4JGRlc3QgIT0gJG5tX291dHB1dChiYXIpIiB7Ci0JCXNlbmRfbG9nICJmYWlsIDFcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgIyBQaWNrIHVwIHRoZSBuZXh0IGxpbmUuICBJZiBpdCBpcyBzbGwsIHRoaXMgaXMgYSBzd2l0Y2gKLQkgICAgIyBwcm9sb2d1ZSwgYW5kIHRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkbyB0byB0ZXN0IGl0LgotCSAgICAjIE90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIGx1aSwgYW5kIHRoZSBuZXh0IGluc3RydWN0aW9uCi0JICAgICMgc2hvdWxkIGJlIGFuIGFkZGl1LCBmb2xsb3dlZCBieSBhbiBhZGR1IHRvICQzMS4KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgMlxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAkbAotCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipzbGwqIiAkbF0gewotCQljb250aW51ZQotCSAgICB9Ci0JICAgIGlmICFbcmVnZXhwICJsdWkgKFxbXCRhLXowLTlcXSspLChcWzAtOWEtZkEtRnhcXSspIiAkbCB3aG9sZSByZWcgdXBwZXJdIHsKLQkJc2VuZF9sb2cgImZhaWwgM1xuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJc2VuZF9sb2cgIiRsXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgNFxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAiJGwiCi0JICAgIGlmICFbcmVnZXhwICJhZGRpdSBcXCRyZWcsXFwkcmVnLChcWy0wLTlcXSspIiAkbCB3aG9sZSBsb3dlcl0gewotCQlzZW5kX2xvZyAiZmFpbCA1XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlzZW5kX2xvZyAiJGxcbiIKLQkJc2VuZF9sb2cgImFkZGl1IFxcJHJlZyxcXCRyZWcsKFxbLTAtOVxdKylcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQotCSAgICBpZiB7IFtnZXRzICRmaWxlIGxdID09IC0xIH0gewotCQlzZW5kX2xvZyAiZmFpbCA2XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCSAgICB2ZXJib3NlICIkbCIKLQkgICAgaWYgIVtyZWdleHAgImFkZHUgXFwkcmVnLFxcJHJlZyxcXFwkcmEiICRsXSB7Ci0JCXNlbmRfbG9nICJmYWlsIDdcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCXNlbmRfbG9nICIkbFxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCi0JICAgICMgVGhlIG5leHQgbGluZSB3aWxsIGJlIGphbHIgaW4gdGhlIGNhc2Ugb2YgYW4gZXhwYW5kZWQKLQkgICAgIyBjYWxsLiAgT3RoZXJ3aXNlLCB0aGUgY29kZSBpcyBnZXR0aW5nIHRoZSBzdGFydCBvZiB0aGUKLQkgICAgIyBmdW5jdGlvbiwgYW5kIHRoZSBuZXh0IGxpbmUgY2FuIGJlIGFueXRoaW5nLgotCi0JICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7Ci0JCXNlbmRfbG9nICJmYWlsIDhcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JICAgIHZlcmJvc2UgIiRsIgkKLQkgICAgaWYgW3N0cmluZyBtYXRjaCAiKmphbHIqIiAkbF0gewotCQlzZXQgZGVzdCBbZXhwciAweCRhZGRyICsgOCArICgkdXBwZXIgPDwgMTYpICsgJGxvd2VyXQotCQlpZiB7ICRkZXN0ICE9ICRubV9vdXRwdXQoZm9vKSAmJiAkZGVzdCAhPSAkbm1fb3V0cHV0KGJhcikgfSB7Ci0JCSAgICBzZW5kX2xvZyAiZmFpbCA5XG4iCi0JCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCSAgICByZXR1cm4KLQkJfQotCSAgICB9IGVsc2UgewotCQlzZXQgZGVzdCBbZXhwciAoJHVwcGVyIDw8IDE2KSArICRsb3dlcl0KLQkJaWYgIVtyZWdleHAgIjwoXFsuYS16XF0rKVxcKyhcWzAtOWEtZkEtRlxdKyk+IiAkbGFiZWwgd2hvbGUgYmFzZSBvZmZzZXRdIHsKLQkJICAgIHNlbmRfbG9nICJmYWlsIDEwXG4iCi0JCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCSAgICByZXR1cm4KLQkJfQotCQlzZXQgb2Zmc2V0IDB4JG9mZnNldAotCQlpZiB7ICRiYXNlID09ICIuZm9vIiB9IHsKLQkJICAgIHNldCBvZmZzZXQgW2V4cHIgJG9mZnNldCAtICgkbm1fb3V0cHV0KGZvbykgLSAweDMwKV0KLQkJfQotCQlpZiB7ICRvZmZzZXQgKyA4ICE9IC0gJGRlc3QgfSB7Ci0JCSAgICBzZW5kX2xvZyAiZmFpbCAxMVxuIgotCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQkgICAgcmV0dXJuCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZQotCi0gICAgaWYgeyRiYWxjbnQgPCAxMH0gewotCXNlbmRfbG9nICJmYWlsIDEyXG4iCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgIiRiYWxjbnQgYmFsIGluc3RydWN0aW9ucyIKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0KLX0KLQotIyBXZSBub3cgdGVzdCBhY3R1YWxseSBydW5uaW5nIGVtYmVkZGVkIE1JUFMgUElDIGNvZGUuICBUaGlzIGNhbiBvbmx5Ci0jIGJlIGRvbmUgb24gYSBNSVBTIGhvc3Qgd2l0aCB0aGUgc2FtZSBlbmRpYW5uZXNzIGFzIG91ciB0YXJnZXQuCi1pZiBbaXN0YXJnZXQgbWlwc2VsLSotKl0gewotICAgIGlmICFbaXNob3N0IG1pcHMqLSotdWx0cml4Kl0gewotCXJldHVybgotICAgIH0KLX0gZWxzZSB7Ci0gICAgaWYgIVtpc2hvc3QgbWlwcyotKi1pcml4Kl0gewotCXJldHVybgotICAgIH0KLX0KLQotc2V0IHRlc3RuYW1lICJydW4gZW1iZWRkZWQgUElDIGNvZGUiCi0KLSMgQ29tcGlsZSB0aGUgcHJvZ3JhbSB3aGljaCB3aWxsIHJ1biB0aGUgdGVzdC4gIFRoaXMgY29kZSBtdXN0IGJlCi0jIGNvbXBpbGVkIGZvciB0aGUgaG9zdCwgbm90IHRoZSB0YXJnZXQuCi1zZW5kX2xvZyAiJENDX0ZPUl9IT1NUICRDRkxBR1NfRk9SX0hPU1QgLW8gdG1wZGlyL3J1biAkc3JjZGlyLyRzdWJkaXIvcnVuLmNcbiIKLXZlcmJvc2UgIiRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jIgotY2F0Y2ggImV4ZWMgJENDX0ZPUl9IT1NUICRDRkxBR1NfRk9SX0hPU1QgLW8gdG1wZGlyL3J1biAkc3JjZGlyLyRzdWJkaXIvcnVuLmMiIGV4ZWNfb3V0cHV0Ci1pZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0gICAgdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLSMgQ29tcGlsZSBhbmQgbGluayB0aGUgdGVzdC4KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3J1bnRlc3RpLnMgdG1wZGlyL3J1bnRlc3RpLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9ydW50ZXN0MS5jIHRtcGRpci9ydW50ZXN0MS5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcnVudGVzdDIuYyB0bXBkaXIvcnVudGVzdDIub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9ydW50ZXN0ICItLWVtYmVkZGVkLXJlbG9jcyB0bXBkaXIvcnVudGVzdGkubyB0bXBkaXIvcnVudGVzdDEubyB0bXBkaXIvcnVudGVzdDIubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICAjIE5vdyBydW4gdGhlIHRlc3QuCi0gICAgc2VuZF9sb2cgInRtcGRpci9ydW4gdG1wZGlyL3J1bnRlc3RcbiIKLSAgICB2ZXJib3NlICJ0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0IgotICAgIGNhdGNoICJleGVjIHRtcGRpci9ydW4gdG1wZGlyL3J1bnRlc3QiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiKnJhbiBhbmQgcmV0dXJuZWQgMCoiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgudCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheC50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzE4YjY5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheC50CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotT1VUUFVUX0ZPUk1BVCgiZWNvZmYtYmlnbWlwcyIpCi1TRUNUSU9OUwotewotICAuZm9vIDB4MzAgOiB7Ci0gICAgdG1wZGlyL3JlbGF4My5vKC50ZXh0KQotICAgIHRtcGRpci9yZWxheDEubygudGV4dCkKLSAgfQotICAudGV4dCAgMHgyMDAwMCA6IHsKLSAgICAgX2Z0ZXh0ID0gLiA7Ci0gICAgKiguaW5pdCkKLSAgICAgZXByb2wgID0gIC47Ci0gICAgdG1wZGlyL3JlbGF4NC5vKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZmluaSkKLSAgICAgZXRleHQgID0gIC47Ci0gICAgIF9ldGV4dCAgPSAgLjsKLSAgfQotICAucmRhdGEgIC4gOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgIF9mZGF0YSA9IC47Ci0gIC5kYXRhICAuIDogewotICAgICooLmRhdGEpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgIF9ncCA9IC4gKyAweDgwMDA7Ci0gIC5saXQ4ICAuIDogewotICAgICooLmxpdDgpCi0gIH0KLSAgLmxpdDQgIC4gOiB7Ci0gICAgKigubGl0NCkKLSAgfQotICAuc2RhdGEgIC4gOiB7Ci0gICAgKiguc2RhdGEpCi0gIH0KLSAgIGVkYXRhICA9ICAuOwotICAgX2VkYXRhICA9ICAuOwotICAgX2Zic3MgPSAuOwotICAuc2JzcyAgLiA6IHsKLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyAgLiA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gIH0KLSAgIGVuZCA9IC47Ci0gICBfZW5kID0gLjsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlYzM5ZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBGaXJzdCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1leHRlcm4gaW50IGJhciAoKTsKLXN0YXRpYyBpbnQgZm9vMiAoKTsKLQotaW50IGZvbyAoaW50IGkpCi17Ci0gIHN3aXRjaCAoaSkKLSAgICB7Ci0gICAgY2FzZSAwOiBiYXIgKDApOyBicmVhazsKLSAgICBjYXNlIDE6IGJhciAoMSk7IGJyZWFrOwotICAgIGNhc2UgMjogYmFyICgyKTsgYnJlYWs7Ci0gICAgY2FzZSAzOiBiYXIgKDMpOyBicmVhazsKLSAgICBjYXNlIDQ6IGJhciAoZm9vMik7IGJyZWFrOwotICAgIGNhc2UgNTogYmFyIChiYXIpOyBicmVhazsKLSAgICB9Ci0gIHdoaWxlICgxKQotICAgIGlmIChpKQotICAgICAgcmV0dXJuIGJhciAoKTsKLX0KLQotc3RhdGljIGludCBmb28yICgpIHsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODg1NGEwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDIuYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIFNlY29uZCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1pbnQgYmFyMiAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCi0gICAgZm9vICgpOwotICByZXR1cm4gZm9vICgpICsgZm9vICgpICsgZm9vICgpICsgZm9vICgpOwotfQotCi1pbnQgYmFyIChpbnQgaSkKLXsKLSAgd2hpbGUgKDEpCi0gICAgaWYgKGkpCi0gICAgICByZXR1cm4gZm9vICgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmb28gKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWE1MzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0vKiBUaGlyZCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1pbnQgcXV1eCAoKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2ZiMDUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0vKiBGb3VydGggc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotaW50IHh5enp5ICgpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW4uYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwMzc3ZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyogTG9hZCBhbmQgcnVuIGEgTUlQUyBwb3NpdGlvbiBpbmRlcGVuZGVudCBFQ09GRiBmaWxlLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLSAgIFB1YmxpYyBkb21haW4uICAqLwotCi0vKiBUaGlzIHByb2dyYW0gd2lsbCBsb2FkIGFuIEVDT0ZGIGZpbGUgaW50byBtZW1vcnkgYW5kIGV4ZWN1dGUgaXQuCi0gICBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiBjb21waWxlZCB1c2luZyB0aGUgR05VIC1tZW1iZWRkZWQtcGljCi0gICBzd2l0Y2ggdG8gcHJvZHVjZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgVGhpcyB3aWxsIG9ubHkgd29yawotICAgaWYgdGhpcyBwcm9ncmFtIGlzIHJ1biBvbiBhIE1JUFMgc3lzdGVtIHdpdGggdGhlIHNhbWUgZW5kaWFubmVzcyBhcwotICAgdGhlIEVDT0ZGIGZpbGUuICBUaGUgRUNPRkYgZmlsZSBtdXN0IGJlIGNvbXBsZXRlLiAgU3lzdGVtIGNhbGxzIG1heQotICAgbm90IHdvcmsgY29ycmVjdGx5LgotCi0gICBUaGVyZSBhcmUgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIGZpbGUgKHRoZXkgY291bGQgYmUgcmVtb3ZlZAotICAgYnkgZG9pbmcgc29tZSBhZGRpdGlvbmFsIHByb2dyYW1taW5nKS4gIFRoZSBmaWxlIG11c3QgYmUgYWxpZ25lZAotICAgc3VjaCB0aGF0IGl0IGRvZXMgbm90IHJlcXVpcmUgYW55IGdhcHMgaW50cm9kdWNlZCBpbiB0aGUgZGF0YQotICAgc2VnbWVudDsgdGhlIEdOVSBsaW5rZXIgcHJvZHVjZXMgc3VjaCBmaWxlcyBieSBkZWZhdWx0LiAgSG93ZXZlciwKLSAgIHRoZSBmaWxlIG11c3Qgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZXh0IG9yIGRhdGEgc2VnbWVudCBpcyBhbGlnbmVkCi0gICBvbiBhIHBhZ2UgYm91bmRhcnkuICBUaGUgc3RhcnQgYWRkcmVzcyBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUKLSAgIHRleHQgc2VnbWVudC4KLQotICAgVGhlIEVDT0ZGIGZpbGUgaXMgcnVuIGJ5IGNhbGxpbmcgaXQgYXMgdGhvdWdoIGl0IHdlcmUgYSBmdW5jdGlvbi4KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQgaXMgcGFzc2VkIGFzIHRoZSBvbmx5IGFyZ3VtZW50LgotICAgVGhlIGZpbGUgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGFuIGludGVnZXIgdmFsdWUsIHdoaWNoIHdpbGwgYmUKLSAgIHByaW50ZWQuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0vKiBTdHJ1Y3R1cmVzIHVzZWQgaW4gRUNPRkYgZmlsZXMuICBXZSBhc3N1bWUgdGhhdCBhIHNob3J0IGlzIHR3bwotICAgYnl0ZXMgYW5kIGFuIGludCBpcyBmb3VyIGJ5dGVzLiAgVGhpcyBpcyBub3QgbXVjaCBvZiBhbiBhc3N1bXB0aW9uLAotICAgc2luY2Ugd2UgYWxyZWFkeSBhc3N1bWUgdGhhdCB3ZSBhcmUgcnVubmluZyBvbiBhIE1JUFMgaG9zdCB3aXRoIHRoZQotICAgc2FtZSBlbmRpYW5uZXNzIGFzIHRoZSBmaWxlIHdlIGFyZSBleGFtaW5pbmcuICAqLwotCi1zdHJ1Y3QgZWNvZmZfZmlsZWhkciB7Ci0gIHVuc2lnbmVkIHNob3J0IGZfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciAgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsJLyogbnVtYmVyIG9mIHNlY3Rpb25zICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZl90aW1kYXQ7CS8qIHRpbWUgJiBkYXRlIHN0YW1wICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGZfc3ltcHRyOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiICAgICAgICovCi0gIHVuc2lnbmVkIGludCBmX25zeW1zOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzICAgICAqLwotICB1bnNpZ25lZCBzaG9ydCBmX29wdGhkcjsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikgICAgICAgICAqLwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwkvKiBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICovCi19OwotCi1zdHJ1Y3QgZWNvZmZfYW91dGhkcgotewotICB1bnNpZ25lZCBzaG9ydCBtYWdpYzsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICB1bnNpZ25lZCBzaG9ydCB2c3RhbXA7CS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICB1bnNpZ25lZCBpbnQgdHNpemU7CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgdW5zaWduZWQgaW50IGRzaXplOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICB1bnNpZ25lZCBpbnQgYnNpemU7CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIHVuc2lnbmVkIGludCBlbnRyeTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICB1bnNpZ25lZCBpbnQgdGV4dF9zdGFydDsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgZGF0YV9zdGFydDsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgYnNzX3N0YXJ0OwkvKiBiYXNlIG9mIGJzcyB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGdwcm1hc2s7CQkvKiA/PyAqLwotICB1bnNpZ25lZCBpbnQgY3BybWFza1s0XTsJLyogPz8gKi8KLSAgdW5zaWduZWQgaW50IGdwX3ZhbHVlOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX07Ci0KLSNkZWZpbmUgRUNPRkZfU0NOSERSX1NJWkUgKDQwKQotCi1zdGF0aWMgdm9pZAotZGllIChzKQotICAgICBjaGFyICpzOwotewotICBwZXJyb3IgKHMpOwotICBleGl0ICgxKTsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIEZJTEUgKmY7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKno7Ci0gIHN0cnVjdCBlY29mZl9maWxlaGRyICpmaDsKLSAgc3RydWN0IGVjb2ZmX2FvdXRoZHIgKmFoOwotICB1bnNpZ25lZCBpbnQgdG9mZjsKLSAgY2hhciAqdCwgKmQ7Ci0gIGludCAoKnBmbikgKCk7Ci0gIGludCByZXQ7Ci0KLSAgaWYgKGFyZ2MgIT0gMikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgZmlsZVxuIiwgYXJndlswXSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZiA9IGZvcGVuIChhcmd2WzFdLCAiciIpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIGRpZSAoYXJndlsxXSk7Ci0KLSAgaWYgKHN0YXQgKGFyZ3ZbMV0sICZzKSA8IDApCi0gICAgZGllICgic3RhdCIpOwotCi0gIHogPSAoY2hhciAqKSBtYWxsb2MgKHMuc3Rfc2l6ZSk7Ci0gIGlmICh6ID09IE5VTEwpCi0gICAgZGllICgibWFsbG9jIik7Ci0KLSAgaWYgKGZyZWFkICh6LCAxLCBzLnN0X3NpemUsIGYpICE9IHMuc3Rfc2l6ZSkKLSAgICBkaWUgKCJmcmVhZCIpOwotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgd2hpY2ggaXMgdGhlCi0gICAgIGxvY2F0aW9uIHdlIGFyZSBnb2luZyB0byBjYWxsLCBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsCi0gICAgIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwYXNzIGFzIGFuIGFyZ3VtZW50LiAgV2UgYWxzbyBuZWVkIHRoZSBzaXplCi0gICAgIGFuZCBzdGFydCBhZGRyZXNzIG9mIHRoZSBic3Mgc2VnbWVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxsIGluCi0gICAgIHRoZSBFQ09GRiBhLm91dCBoZWFkZXIuICAqLwotCi0gIGZoID0gKHN0cnVjdCBlY29mZl9maWxlaGRyICopIHo7Ci0gIGlmIChmaC0+Zl9vcHRoZHIgIT0gc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfYW91dGhkcikpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVuZXhwZWN0ZWQgb3B0aGRyIHNpemU6IGlzICV1LCB3YW50ICV1XG4iLAotCSAgICAgICBhcmd2WzFdLCAodW5zaWduZWQgaW50KSBmaC0+Zl9vcHRoZHIsCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBhaCA9IChzdHJ1Y3QgZWNvZmZfYW91dGhkciAqKSAoeiArIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZpbGVoZHIpKTsKLSAgaWYgKGFoLT5tYWdpYyAhPSAwNDEzKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBiYWQgYW91dGhkciBtYWdpYyBudW1iZXIgMCVvICh3YW50IDA0MTMpXG4iLAotCSAgICAgICBhcmd2WzFdLCAodW5zaWduZWQgaW50KSBhaC0+bWFnaWMpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFdlIHNob3VsZCBjbGVhciB0aGUgYnNzIHNlZ21lbnQgYXQgdGhpcyBwb2ludC4gIFRoaXMgaXMgdGhlCi0gICAgIGFoLT5ic2l6ZSBieXRlcyBzdGFydGluZyBhdCBhaC0+YnNzX3N0YXJ0LCBUbyBkbyB0aGlzIGNvcnJlY3RseSwKLSAgICAgd2Ugd291bGQgaGF2ZSB0byBtYWtlIHN1cmUgb3VyIG1lbW9yeSBibG9jayBpcyBsYXJnZSBlbm91Z2guICBJdAotICAgICBzbyBoYXBwZW5zIHRoYXQgb3VyIHRlc3QgY2FzZSBkb2VzIG5vdCBoYXZlIGFueSBhZGRpdGlvbmFsIHBhZ2VzCi0gICAgIGZvciB0aGUgYnNzIHNlZ21lbnQtLWl0IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGRhdGEgc2VnbWVudC4KLSAgICAgU28sIHdlIGRvbid0IGJvdGhlci4gICovCi0gIGlmIChhaC0+YnNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICIlczogYnNzIHNlZ21lbnQgaXMgJXUgYnl0ZXM7IG5vbi16ZXJvIHNpemVzIG5vdCBzdXBwb3J0ZWRcbiIsCi0JICAgICAgIGFyZ3ZbMV0sIGFoLT5ic2l6ZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogVGhlIHRleHQgc2VjdGlvbiBzdGFydHMganVzdCBhZnRlciBhbGwgdGhlIGhlYWRlcnMsIHJvdW5kZWQgdG8gYQotICAgICAxNiBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgdG9mZiA9IChzaXplb2YgKHN0cnVjdCBlY29mZl9maWxlaGRyKSArIHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpCi0JICArIGZoLT5mX25zY25zICogRUNPRkZfU0NOSERSX1NJWkUpOwotICB0b2ZmICs9IDE1OwotICB0b2ZmICY9fiAxNTsKLSAgdCA9IHogKyB0b2ZmOwotCi0gIC8qIFRoZSB0c2l6ZSBmaWVsZCBnaXZlcyB1cyB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudC4gICovCi0gIGQgPSB6ICsgYWgtPnRzaXplOwotCi0gIC8qIENhbGwgdGhlIGNvZGUgYXMgYSBmdW5jdGlvbi4gICovCi0gIHBmbiA9IChpbnQgKCopICgpKSB0OwotICByZXQgPSAoKnBmbikgKGQpOwotCi0gIHByaW50ZiAoIiVzIHJhbiBhbmQgcmV0dXJuZWQgJWRcbiIsIGFyZ3ZbMV0sIHJldCk7Ci0KLSAgZXhpdCAoMCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWFiNmViLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qIEZpcnN0IEMgc291cmNlIGZpbGUgZm9yIGFjdHVhbCBleGVjdXRpb24gdGVzdC4gICovCi0KLS8qIFRoZSBtYWluIHBvaW50IG9mIHRoaXMgdGVzdCBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBhbmQgZGF0YQotICAgYXJlIHRydWx5IHBvc2l0aW9uIGluZGVwZW5kZW50LiAgV2Ugc3RhdGljYWxseSBpbml0aWFsaXplIHNldmVyYWwKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHkgYWRqdXN0ZWQgYXQKLSAgIHJ1bnRpbWUuICAqLwotCi1pbnQgaSA9IDE7Ci1pbnQgaiA9IDA7Ci1leHRlcm4gaW50IGs7Ci1pbnQgbDsKLWNoYXIgc21hbGxfYnVmW10gPSAiYWFhYSI7Ci1jaGFyICpzbWFsbF9wb2ludGVyID0gc21hbGxfYnVmOwotY2hhciBiaWdfYnVmW10gPSAiYWFhYWFhYWFhYWFhYWFhYSI7Ci1jaGFyICpiaWdfcG9pbnRlciA9IGJpZ19idWY7Ci0KLWV4dGVybiBpbnQgYmFyICgpOwotaW50ICgqcGJhcikgKCkgPSBiYXI7Ci0KLXN0YXRpYyBpbnQKLWZvbzIgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgbCA9IGFyZzsKLSAgcmV0dXJuIGkgKyBqOwotfQotCi1pbnQgKCpwZm9vMikgKCkgPSBmb28yOwotCi1pbnQKLWNoa3N0ciAoeiwgYykKLSAgICAgY2hhciAqejsKLSAgICAgaW50IGM7Ci17Ci0gIC8qIFN3aXRjaCBzdGF0ZW1lbnRzIG5lZWQgZXh0cmEgZWZmb3J0IHRvIGJlIHBvc2l0aW9uIGluZGVwZW5kZW50LAotICAgICBzbyB3ZSBydW4gb25lIGhlcmUsIGV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlIGNhc2VzIHdpbGwgbmV2ZXIgYmUKLSAgICAgdGFrZW4uICAqLwotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIGkgLSAxOwotICAgIGNhc2UgNDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgIGNhc2UgODoKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gaSAqIGo7Ci0gICAgY2FzZSAxMDoKLSAgICBjYXNlIDExOgotICAgIGNhc2UgMTI6Ci0gICAgY2FzZSAxMzoKLSAgICBjYXNlIDE0OgotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gajsKLSAgICBjYXNlIDE2OgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICB3aGlsZSAoYy0tICE9IDApCi0gICAgaWYgKCp6KysgIT0gJ2EnKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuICp6ID09ICdcMCc7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgc3RhcnR1cCByb3V0aW5lLiAgSXQgdHJpZXMKLSAgIHRvIHRlc3QgdGhhdCBldmVyeXRoaW5nIHdhcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuICBJdCByZXR1cm5zIDAgb24KLSAgIHN1Y2Nlc3MsIHNvbWV0aGluZyBlbHNlIG9uIGZhaWx1cmUuICAqLwotCi1pbnQKLWZvbyAoKQotewotICBpZiAoaSAhPSAxKQotICAgIHJldHVybiAxOwotICBpZiAoaiAhPSAwKQotICAgIHJldHVybiAyOwotICBpZiAoISBjaGtzdHIgKHNtYWxsX2J1ZiwgNCkpCi0gICAgcmV0dXJuIDM7Ci0gIGlmICghIGNoa3N0ciAoc21hbGxfcG9pbnRlciwgNCkpCi0gICAgcmV0dXJuIDQ7Ci0gIGlmICghIGNoa3N0ciAoYmlnX2J1ZiwgMTYpKQotICAgIHJldHVybiA1OwotICBpZiAoISBjaGtzdHIgKGJpZ19wb2ludGVyLCAxNikpCi0gICAgcmV0dXJuIDY7Ci0KLSAgaWYgKGwgIT0gMCkKLSAgICByZXR1cm4gNzsKLSAgaWYgKGZvbzIgKDEpICE9IDEpCi0gICAgcmV0dXJuIDg7Ci0gIGlmIChsICE9IDEpCi0gICAgcmV0dXJuIDk7Ci0gIGlmICgoKnBmb28yKSAoMikgIT0gMSkKLSAgICByZXR1cm4gMTA7Ci0gIGlmIChsICE9IDIpCi0gICAgcmV0dXJuIDExOwotCi0gIGlmIChiYXIgKDEpICE9IDApCi0gICAgcmV0dXJuIDEyOwotICBpZiAoYmFyICgtMSkgIT0gMSkKLSAgICByZXR1cm4gMTM7Ci0gIGlmICgoKnBiYXIpICgweGE1YTVhNWE1KSAhPSAtMSkKLSAgICByZXR1cm4gMTQ7Ci0gIGlmIChrICE9IDB4YTVhNWE1YTUpCi0gICAgcmV0dXJuIDE1OwotICBpZiAoKCpwYmFyKSAoMCkgIT0gMHhhNWE1YTVhNSkKLSAgICByZXR1cm4gMTY7Ci0gIGlmIChrICE9IDApCi0gICAgcmV0dXJuIDE3OwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwNTI1Zi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIFNlY29uZCBDIHNvdXJjZSBmaWxlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHRlc3QuICAqLwotCi1pbnQgazsKLWV4dGVybiBpbnQgaTsKLWV4dGVybiBpbnQgajsKLWV4dGVybiBjaGFyIHNtYWxsX2J1ZltdOwotZXh0ZXJuIGNoYXIgKnNtYWxsX3BvaW50ZXI7Ci0KLWV4dGVybiBpbnQgY2hrc3RyICgpOwotCi1pbnQKLWJhciAobikKLSAgICAgaW50IG47Ci17Ci0gIGludCByOwotCi0gIGlmIChpICE9IDEKLSAgICAgIHx8IGogIT0gMAotICAgICAgfHwgISBjaGtzdHIgKHNtYWxsX2J1ZiwgNCkKLSAgICAgIHx8ICEgY2hrc3RyIChzbWFsbF9wb2ludGVyLCA0KSkKLSAgICByZXR1cm4gayArIDE7Ci0KLSAgciA9IGs7Ci0gIGsgPSBuOwotICByZXR1cm4gcjsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0aS5zIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTE5NTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIEFzc2VtYmxlciBpbml0aWFsaXphdGlvbiBjb2RlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHRlc3QuCi0JCi0jIFRoaXMgY29kZSBiZWNvbWVzIHRoZSBzdGFydCBvZiB0aGUgZXhlY3V0aW9uIHRlc3QgcHJvZ3JhbS4gIEl0IGlzCi0jIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgdGhlIHN0YXRpYyBkYXRhLCBpbnZva2luZyB0aGUgQyBjb2RlLAotIyBhbmQgcmV0dXJuaW5nIHRoZSByZXN1bHQuICBJdCBpcyBjYWxsZWQgYXMgdGhvdWdoIGl0IHdlcmUgYSBDCi0jIGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudC4KLQotIyBXZSBuZWVkIHRvIGtub3cgdGhlIHZhbHVlIG9mIF9mdGV4dCBhbmQgX2ZkYXRhIGF0IGxpbmsgdGltZSwgYnV0IHdlCi0jIGhhdmUgbm8gd2F5IHRvIGFjdHVhbGx5IGdldCB0aGF0IGF0IHJ1bnRpbWUuICBUaGlzIGlzIGJlY2F1c2Ugd2hlbgotIyB0aGlzIGNvZGUgaXMgY29tcGlsZWQgd2l0aCAtbWVtYmVkZGVkLXBpYywgdGhlIGxhIGluc3RydWN0aW9uIHdpbGwKLSMgYmUgdHVybmVkIGludG8gYW4gYWRkaXUgJGdwIGluc3RydWN0aW9uLiAgV2Ugd29yayBhcm91bmQgdGhpcyBieQotIyBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB3b3JkcyBpbiB0aGUgLmRhdGEgc2VjdGlvbi4gIFdlIHRoZW4gbG9hZAotIyB0aGUgdmFsdWVzIG9mIHRoZXNlIHdvcmRzICpiZWZvcmUqIGRvaW5nIHRoZSBydW50aW1lIHJlbG9jYXRpb24uCi0JLnNkYXRhCi10ZXh0X3N0YXJ0OgotCS53b3JkCV9mdGV4dAotZGF0YV9zdGFydDoKLQkud29yZAlfZmRhdGEKLQotCS5nbG9ibAlzdGFydAotCS50ZXh0Ci1zdGFydDoKLQkjIEdyYWIgc29tZSBzcGFjZSBvbiB0aGUgc3RhY2ssIGp1c3QgYXMgdGhvdWdoIHdlIHdlcmUgYSByZWFsCi0JIyBmdW5jdGlvbi4KLQlhZGRpdQkkc3AsJHNwLC04Ci0Jc3cJJDMxLDAoJHNwKQotCi0JIyBTYXZlIHRoZSAkZ3AgcmVnaXN0ZXIsIGFuZCBzZXQgaXQgdXAgZm9yIG91ciBkYXRhIHNlY3Rpb24uCi0Jc3cJJGdwLDQoJHNwKQotCi0JYWRkdQkkZ3AsJDQsMHg4MDAwCQkjIG1hY3JvCi0KLQkjIFRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50IGlzIGluICQ0LgotCi0JIyBHZXQgdGhlIGFkZHJlc3Mgb2Ygc3RhcnQgaW50byAkNSBpbiBhIHBvc2l0aW9uIGluZGVwZW5kZW50Ci0JIyBmYXNoaW9uLgotCS5zZXQJbm9yZW9yZGVyCi0JJExGMSA9IC4gKyA4Ci0JYmFsCSRMRjEKLQlsYQkkNSxzdGFydC0kTEYxCQkjIG1hY3JvCi0JLnNldAlyZW9yZGVyCi0JYWRkdQkkNSwkNSwkMzEKLQotCSMgTm93IGdldCB0aGUgYWRkcmVzcyBvZiBfZnRleHQgaW50byAkNi4KLQlsYQkkNixfZnRleHQtc3RhcnQJCSMgbWFjcm8KLQlhZGR1CSQ2LCQ2LCQ1Ci0KLQkjIEdldCB0aGUgdmFsdWUgb2YgX2Z0ZXh0IHVzZWQgdG8gbGluayBpbnRvICQ3LgotCWx3CSQ3LHRleHRfc3RhcnQJCSMgbWFjcm8KLQotCSMgR2V0IHRoZSB2YWx1ZSBvZiBfZmRhdGEgdXNlZCB0byBsaW5rIGludG8gJDguCi0JbHcJJDgsZGF0YV9zdGFydAkJIyBtYWNybwotCi0JIyBHZXQgdGhlIGFkZHJlc3Mgb2YgX19ydW50aW1lX3JlbG9jX3N0YXJ0IGludG8gJDkuCi0JbGEJJDksX19ydW50aW1lX3JlbG9jX3N0YXJ0LXN0YXJ0CSMgbWFjcm8KLQlhZGR1CSQ5LCQ5LCQ1Ci0KLQkjIEdldCB0aGUgYWRkcmVzcyBvZiBfX3J1bnRpbWVfcmVsb2Nfc3RvcCBpbnRvICQxMC4KLQlsYQkkMTAsX19ydW50aW1lX3JlbG9jX3N0b3Atc3RhcnQJIyBtYWNybwotCWFkZHUJJDEwLCQxMCwkNQotCi0JIyBUaGUgd29yZHMgYmV0d2VlbiAkOSBhbmQgJDEwIGFyZSB0aGUgcnVudGltZSBpbml0aWFsaXphdGlvbgotCSMgaW5zdHJ1Y3Rpb25zLiAgU3RlcCB0aHJvdWdoIGFuZCByZWxvY2F0ZSB0aGVtLiAgRmlyc3Qgc2V0Ci0JIyAkMTEgYW5kICQxMiB0byB0aGUgdmFsdWVzIHRvIGFkZCB0byB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLAotCSMgcmVzcGVjdGl2ZWx5LgotCXN1YnUJJDExLCQ2LCQ3Ci0Jc3VidQkkMTIsJDQsJDgKLQotMToJCi0JYmdlCSQ5LCQxMCwzZgkJIyBtYWNybwotCWx3CSQxMywwKCQ5KQotCWFuZAkkMTQsJDEzLDB4ZmZmZmZmZmUJIyBtYWNybwotCW1vdmUJJDE1LCQxMQotCWJlcQkkMTMsJDE0LDJmCi0JbW92ZQkkMTUsJDEyCi0yOgkKLQlhZGR1CSQxNCwkMTQsJDQKLQlsdwkkMjQsMCgkMTQpCi0JYWRkdQkkMjQsJDI0LCQxNQotCXN3CSQyNCwwKCQxNCkKLQlhZGRpdQkkOSwkOSw0Ci0JYgkxYgotMzoJCi0KLQkjIE5vdyB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBkYXRhIGhhcyBiZWVuIHJlbG9jYXRlZAotCSMgY29ycmVjdGx5LCBhbmQgd2UgY2FuIGNhbGwgdGhlIEMgY29kZSB3aGljaCBkb2VzIHRoZSBhY3R1YWwKLQkjIHRlc3RpbmcuCi0JYmFsCWZvbwotCi0JIyBXZSByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBDIGNvZGUuCi0JbHcJJDMxLDAoJHNwKQotCWx3CSRncCw0KCRzcCkKLQlhZGR1CSRzcCwkc3AsOAotCWoJJDMxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc4OTQ1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1leHRlcm4gaW50IGZvbyAoKTsKLWludAotZnVuYyAoKQotewotICByZXR1cm4gZm9vICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5NDhjOS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEudAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTk9DUk9TU1JFRlMgKCAudGV4dCAuZGF0YSApCi1TRUNUSU9OUwotewotICAudGV4dCA6IHsgdG1wZGlyL2Nyb3NzMS5vIH0KLSAgLmRhdGEgOiB7IHRtcGRpci9jcm9zczIubyB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQzMTc3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1pbnQKLWZvbyAoKQotewotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDQ2ZjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLnQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU5PQ1JPU1NSRUZTICggLnRleHQgLmRhdGEgKQotU0VDVElPTlMKLXsKLSAgLnRleHQgOiB7ICooLnRleHQpICooLnByKSB9Ci0gIC5kYXRhIDogeyAqKC5kYXRhKSAqKC5zZGF0YSkgKigucncpICooLnRjMCkgKigudGMpIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDhjMzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWludCBpID0gNDsKLQotaW50Ci1mb28gKCkKLXsKLSAgcmV0dXJuIGk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zc3JlZi5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zc3JlZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTk3NTkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotIyBUZXN0IE5PQ1JPU1NSRUZTIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLXNldCB0ZXN0MSAiTk9DUk9TU1JFRlMgMSIKLXNldCB0ZXN0MiAiTk9DUk9TU1JFRlMgMiIKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAkQ0MgIiRzcmNkaXIvJHN1YmRpci9jcm9zczEuYyIgdG1wZGlyL2Nyb3NzMS5vXSBcCi0gICAgIHx8ICFbbGRfY29tcGlsZSAkQ0MgIiRzcmNkaXIvJHN1YmRpci9jcm9zczIuYyIgdG1wZGlyL2Nyb3NzMi5vXSB9IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MQotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLXNldCBmbGFncyAiIgotCi0jIFRoZSBhMjlrIGNvbXBpbGVkIGNvZGUgY2FsbHMgVl9TUElMTCBhbmQgVl9GSUxMLiAgU2luY2Ugd2UgZG9uJ3QKLSMgbmVlZCB0byBydW4gdGhpcyBjb2RlLCBidXQgd2UgZG9uJ3QgaGF2ZSBkZWZpbml0aW9ucyBmb3IgdGhvc2UKLSMgZnVuY3Rpb25zLCB3ZSBqdXN0IGRlZmluZSB0aGVtIG91dC4KLWlmIFtpc3RhcmdldCBhMjlrKi0qLSpdIHsKLSAgICBzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBWX1NQSUxMPTAgLS1kZWZzeW0gVl9GSUxMPTAiCi19Ci0KLSMgaHBwYS1lbGYgbmVlZHMgYSBkZWZpbml0aW9uIGZvciAkZ2xvYmFsJC4KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHsKLSAgICBzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSAnXCRnbG9iYWxcJCc9MCIKLX0KLQotdmVyYm9zZSAtbG9nICIkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczEgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMS50IHRtcGRpci9jcm9zczEubyB0bXBkaXIvY3Jvc3MyLm8iCi0KLWNhdGNoICJleGVjICRsZCAkZmxhZ3MgLW8gdG1wZGlyL2Nyb3NzMSAtVCAkc3JjZGlyLyRzdWJkaXIvY3Jvc3MxLnQgdG1wZGlyL2Nyb3NzMS5vIHRtcGRpci9jcm9zczIubyIgZXhlY19vdXRwdXQKLQotc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLXJlZ3N1YiAtYWxsICIoXnxcbikoJGxkOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2xcW15cblxdKlxuPykiICRleGVjX291dHB1dCAiXFwxIiBleGVjX291dHB1dAotCi1pZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0gICAgZmFpbCAkdGVzdDEKLX0gZWxzZSB7Ci0gICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0gICAgaWYgW3JlZ2V4cCAicHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZnJvbSAuKiB0byBgZm9vJyBpbiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdDEKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3QxCi0gICAgfQotfQotCi0jIENoZWNrIGNyb3NzIHJlZmVyZW5jZXMgd2l0aGluIGEgc2luZ2xlIG9iamVjdC4KLQotaWYgeyAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MzLmMiIHRtcGRpci9jcm9zczMub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotdmVyYm9zZSAtbG9nICIkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczIgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMi50IHRtcGRpci9jcm9zczMubyIKLQotY2F0Y2ggImV4ZWMgJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MyIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczIudCB0bXBkaXIvY3Jvc3MzLm8iIGV4ZWNfb3V0cHV0Ci0KLXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi1yZWdzdWIgLWFsbCAiKF58XG4pKCRsZDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKLQotaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotICAgIGZhaWwgJHRlc3QyCi19IGVsc2UgewotICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotICAgIGlmIFtyZWdleHAgInByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gLiogdG8gYC4qJyBpbiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdDIKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3QyCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhMjZiYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMgVGVzdCBERUZJTkVEIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLXNldCB0ZXN0bmFtZSAiREVGSU5FRCIKLXNldCBwcm1zX2lkIDU2OTkKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2RlZmluZWQucyB0bXBkaXIvZGVmLm9dIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvZGVmICItVCAkc3JjZGlyLyRzdWJkaXIvZGVmaW5lZC50IHRtcGRpci9kZWYubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvZGVmXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh2YWx1ZTEpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh2YWx1ZTIpXX0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dCh2YWx1ZTEpICE9IDF9IHsKLQkJc2VuZF9sb2cgInZhbHVlMSA9PSAkbm1fb3V0cHV0KHZhbHVlMSlcbiIKLQkJdmVyYm9zZSAidmFsdWUxID09ICRubV9vdXRwdXQodmFsdWUxKSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsKLQkJaWYgeyRubV9vdXRwdXQodmFsdWUyKSAhPSAyfSB7Ci0JCSAgICBzZW5kX2xvZyAidmFsdWUyID09ICRubV9vdXRwdXQodmFsdWUyKVxuIgotCQkgICAgdmVyYm9zZSAidmFsdWUyID09ICRubV9vdXRwdXQodmFsdWUyKSIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICR0ZXN0bmFtZQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzY0YmJiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS5nbG9ibAlkZWZpbmVkCi0JZGVmaW5lZAk9CTEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlZjFiNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNFQ1RJT05TIHsKLQkudGV4dCA6IHsgKigudGV4dCkgfQotCS5kYXRhIDogeyAqKC5kYXRhKSB9Ci0JLmJzcyA6IHsgKiguYnNzKSAqKENPTU1PTikgfQotfQotdmFsdWUxID0gREVGSU5FRCAoZGVmaW5lZCkgPyAxIDogMjsKLXZhbHVlMiA9IERFRklORUQgKHVuZGVmaW5lZCkgPyAxIDogMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzN2ZhMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFRlc3QgUEhEUlMgaW4gYSBsaW5rZXIgc2NyaXB0LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotIyBQSERSUyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIEVMRi4KLWlmIHsgIVtpc3RhcmdldCAqLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXVuaXh3YXJlKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWVhYmkqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXNvbGFyaXMyKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLSMgVGhpcyBpcyBhIHZlcnkgc2ltcGxpc3RpYyB0ZXN0LgotCi1zZXQgdGVzdG5hbWUgIlBIRFJTIgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvcGhkcnMucyB0bXBkaXIvcGhkcnMub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXNldCBwaGRyc19yZWdleHAgXAotIi4qUHJvZ3JhbSBIZWFkZXI6LipQSERSICpvZmYgKjB4MDAqMzQgKnZhZGRyICoweDAwKjgwMDM0ICpwYWRkciAqMHgwMCo4MDAzNC4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qIGZsYWdzIHItLS4qTE9BRCAqb2ZmICoweDAwKiAqdmFkZHIgKjB4MDAqODAwMDAgKnBhZGRyICoweDAwKjgwMDAwLipmaWxlc3ogKjB4MDAqXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3Mgci14LipMT0FEICpvZmYgKjB4MFxbMC05YS1mXF0qICp2YWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKiAqcGFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSouKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3MgKnJ3LS4qIgotCi0jIE9uIGEgNjQgYml0IEVMRiBmb3JtYXQsIHdlIG5lZWQgZGlmZmVyZW50IG51bWJlcnMuCi1pZiB7IFtpc3RhcmdldCBhbHBoYSotKi0qXSB9IHRoZW4gewotICBzZXQgcGhkcnNfcmVnZXhwIFwKLSIuKlByb2dyYW0gSGVhZGVyOi4qUEhEUiAqb2ZmICoweDAwKjQwICp2YWRkciAqMHgwMCo4MDA0MCAqcGFkZHIgKjB4MDAqODAwNDAuKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiBmbGFncyByLS0uKkxPQUQgKm9mZiAqMHgwMCogKnZhZGRyICoweDAwKjgwMDAwICpwYWRkciAqMHgwMCo4MDAwMC4qZmlsZXN6ICoweDAwKlxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzIHIteC4qTE9BRCAqb2ZmICoweDBcWzAtOWEtZlxdKiAqdmFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSogKnBhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qLipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzICpydy0uKiIKLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3BoZHJzICItVCAkc3JjZGlyLyRzdWJkaXIvcGhkcnMudCB0bXBkaXIvcGhkcnMubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wIC0tcHJpdmF0ZSB0bXBkaXIvcGhkcnMiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLS1wcml2YXRlIHRtcGRpci9waGRycyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICB2ZXJib3NlIC1sb2cgJGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiBbcmVnZXhwICRwaGRyc19yZWdleHAgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMWYwZDEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0KLQkubG9uZwkxCi0KLQkuZGF0YQotCi0JLmxvbmcJMgotCQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzEwZTIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVBIRFJTCi17Ci0gIGhlYWRlciBQVF9QSERSIFBIRFJTIDsKLSAgdGV4dCBQVF9MT0FEIEZJTEVIRFIgUEhEUlMgOwotICBkYXRhIFBUX0xPQUQgOwotfQotCi1TRUNUSU9OUwotewotICAuID0gMHg4MDAwMCArIFNJWkVPRl9IRUFERVJTOwotICAudGV4dCA6IHsgKigudGV4dCkgfSA6dGV4dAotICAuZGF0YSA6IHsgKiguZGF0YSkgfSA6ZGF0YQotICAvRElTQ0FSRC8gOiB7ICooLnJlZ2luZm8pIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBhMDQxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jIFRlc3QgYmFzaWMgbGlua2VyIHNjcmlwdCBmdW5jdGlvbmFsaXR5Ci0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLXNldCB0ZXN0bmFtZSAic2NyaXB0IgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvc2NyaXB0LnMgdG1wZGlyL3NjcmlwdC5vXSB7IAotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXByb2MgY2hlY2tfc2NyaXB0IHsgfSB7Ci0gICAgZ2xvYmFsIG5tCi0gICAgZ2xvYmFsIHRlc3RuYW1lCi0gICAgZ2xvYmFsIG5tX291dHB1dAotCi0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NjcmlwdF0gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiB7IVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodGV4dF9zdGFydCldIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfZW5kKV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9zdGFydCldIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRhdGFfZW5kKV19IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQodGV4dF9zdGFydCkgIT0gMHgxMDB9IHsKLQkJc2VuZF9sb2cgInRleHRfc3RhcnQgPT0gJG5tX291dHB1dCh0ZXh0X3N0YXJ0KVxuIgotCQl2ZXJib3NlICJ0ZXh0X3N0YXJ0ID09ICRubV9vdXRwdXQodGV4dF9zdGFydCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7IGlmIHskbm1fb3V0cHV0KHRleHRfZW5kKSA8IDB4MTA0IFwKLQkJCSAgfHwgJG5tX291dHB1dCh0ZXh0X2VuZCkgPiAweDExMH0gewotCQlzZW5kX2xvZyAidGV4dF9lbmQgPT0gJG5tX291dHB1dCh0ZXh0X2VuZClcbiIKLQkJdmVyYm9zZSAidGV4dF9lbmQgPT0gJG5tX291dHB1dCh0ZXh0X2VuZCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7IGlmIHskbm1fb3V0cHV0KGRhdGFfc3RhcnQpICE9IDB4MTAwMH0gewotCQlzZW5kX2xvZyAiZGF0YV9zdGFydCA9PSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpXG4iCi0JCXZlcmJvc2UgImRhdGFfc3RhcnQgPT0gJG5tX291dHB1dChkYXRhX3N0YXJ0KSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsgaWYgeyRubV9vdXRwdXQoZGF0YV9lbmQpIDwgMHgxMDA0IFwKLQkJCSB8fCAkbm1fb3V0cHV0KGRhdGFfZW5kKSA+IDB4MTAxMH0gewotCQlzZW5kX2xvZyAiZGF0YV9lbmQgPT0gJG5tX291dHB1dChkYXRhX2VuZClcbiIKLQkJdmVyYm9zZSAiZGF0YV9lbmQgPT0gJG5tX291dHB1dChkYXRhX2VuZCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgJHRlc3RuYW1lCi0JICAgIH0gfSB9IH0KLQl9Ci0gICAgfQotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2NyaXB0ICItVCAkc3JjZGlyLyRzdWJkaXIvc2NyaXB0LnQgdG1wZGlyL3NjcmlwdC5vIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi19IGVsc2UgewotICAgIGNoZWNrX3NjcmlwdAotfQotCi1zZXQgdGVzdG5hbWUgIk1SSSBzY3JpcHQiCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zY3JpcHQgIi1jICRzcmNkaXIvJHN1YmRpci9zY3JpcHRtLnQiXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgY2hlY2tfc2NyaXB0Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I2NWIwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgdGV4dF9zeW1ib2wKLXRleHRfc3ltYm9sOgkKLQkubG9uZwkxCi0JLmRhdGEKLQkuZ2xvYmwgZGF0YV9zeW1ib2wKLWRhdGFfc3ltYm9sOgkKLQkubG9uZwkyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTdhNDhhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotU0VDVElPTlMKLXsKLSAgLnRleHQgMHgxMDAgOiB7IAotICAgIHRleHRfc3RhcnQgPSAuOwotICAgICooLnRleHQpCi0gICAgKigucHIpCi0gICAgdGV4dF9lbmQgPSAuOwotICB9Ci0gIC4gPSAweDEwMDA7Ci0gIC5kYXRhIDogewotICAgIGRhdGFfc3RhcnQgPSAuOwotICAgICooLmRhdGEpCi0gICAgKigucncpCi0gICAgZGF0YV9lbmQgPSAuOwotICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHRtLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHRtLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Y2NhZTEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0bS50CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotKiBNUkkgc2NyaXB0Ci1zZWN0IC50ZXh0ID0gJDEwMAk7IC50ZXh0IHN0YXJ0IGFkZHJlc3MKLXNlY3QgLmRhdGEgPSAxMDAwaAk7IC5kYXRhIHN0YXJ0IGFkZHJlc3MKLXB1YmxpYyB0ZXh0X3N0YXJ0ID0gJDEwMAotcHVibGljIHRleHRfZW5kID0gIyBjb250aW51YXRpb24gbGluZQotICB0ZXh0X3N0YXJ0ICsgNAotcHVibGljIGRhdGFfc3RhcnQgPSAxMDAwaAotcHVibGljIGRhdGFfZW5kID0gZGF0YV9zdGFydCArIDQKLQotbG9hZCB0bXBkaXIvc2NyaXB0Lm8KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmRlZmQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIFRlc3QgU0laRU9GIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLSMgQmFzZWQgb24gYSBidWcgcmVwb3J0IGZyb20gYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlLgotCi1zZXQgdGVzdG5hbWUgIlNJWkVPRiIKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3NpemVvZi5zIHRtcGRpci9zaXplb2Yub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaXplb2YgIi1UICRzcmNkaXIvJHN1YmRpci9zaXplb2YudCB0bXBkaXIvc2l6ZW9mLm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NpemVvZl0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X3N0YXJ0KV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X2VuZCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9zdGFydCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9lbmQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHNpemVvZl90ZXh0KV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChzaXplb2ZfZGF0YSldfSB7Ci0gICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dCh0ZXh0X2VuZCkgLSAkbm1fb3V0cHV0KHRleHRfc3RhcnQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX3RleHQpfSB7Ci0gICAgc2VuZF9sb2cgInRleHRfZW5kIC0gdGV4dF9zdGFydCAhPSBzaXplb2ZfdGV4dFxuIgotICAgIHZlcmJvc2UgInRleHRfZW5kIC0gdGV4dF9zdGFydCAhPSBzaXplb2ZfdGV4dCIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dChkYXRhX2VuZCkgLSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX2RhdGEpfSB7Ci0gICAgc2VuZF9sb2cgImRhdGFfZW5kIC0gZGF0YV9zdGFydCAhPSBzaXplb2ZfZGF0YVxuIgotICAgIHZlcmJvc2UgImRhdGFfZW5kIC0gZGF0YV9zdGFydCAhPSBzaXplb2ZfZGF0YSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dChzaXplb2ZfdGV4dCkgIT0gJG5tX291dHB1dChzaXplb2ZfZGF0YSl9IHsKLSAgICBzZW5kX2xvZyAic2l6ZW9mX3RleHQgIT0gc2l6ZW9mX2RhdGFcbiIKLSAgICB2ZXJib3NlICJzaXplb2ZfdGV4dCAhPSBzaXplb2ZfZGF0YSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1wYXNzICR0ZXN0bmFtZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyMWNhMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQkuc3BhY2UJMTYKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDRhMzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1TRUNUSU9OUyB7Ci0JLnRleHQgOgotCSAgewotCSAgICB0ZXh0X3N0YXJ0ID0gLjsKLQkgICAgdG1wZGlyL3NpemVvZi5vIAotCSAgICB0ZXh0X2VuZCA9IC47Ci0JICB9Ci0JLmRhdGEgOiAKLQkgIHsgCi0JICAgIGRhdGFfc3RhcnQgPSAuOwotCSAgICAuID0gLiArIFNJWkVPRigudGV4dCk7Ci0JICAgIGRhdGFfZW5kID0gLjsKLQkgIH0KLX0JCi0KLXNpemVvZl90ZXh0ID0gU0laRU9GKC50ZXh0KTsKLXNpemVvZl9kYXRhID0gU0laRU9GKC5kYXRhKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjU5NjcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFRlc3Qgd2VhayBzeW1ib2xzLgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgotCi1zZXQgdGVzdG5hbWUgIndlYWsgc3ltYm9scyIKLQotIyBUaGlzIHRlc3Qgb25seSB3b3JrcyBmb3IgRUxGIHRhcmdldHMuICBJdCBvdWdodCB0byB3b3JrIGZvciBzb21lCi0jIGEub3V0IHRhcmdldHMsIGJ1dCBpdCBkb2Vzbid0LgotCi1pZiB7ICFbaXN0YXJnZXQgKi0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi11bml4d2FyZSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lYWJpKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDUqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWlyaXg2Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1zb2xhcmlzMipdIH0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHshIFtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3dlYWsxLnMgdG1wZGlyL3dlYWsxLm9dCi0gICAgfHwgISBbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci93ZWFrMi5zIHRtcGRpci93ZWFrMi5vXX0gdGhlbiB7Ci0gICAgIyBJdCdzIE9LIGlmIC53ZWFrIGRvZXNuJ3Qgd29yayBvbiB0aGlzIHRhcmdldC4KLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1zZXQgd2Vha19yZWdleHBfYmlnIFwKLSIuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6LioxMDAwIDAwMDAxMDA4IDAwMDAyMDBjIDEyMTIxMjEyIDM0MzQzNDM0LipDb250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOi4qMjAwMCAwMDAwMTAwOCAwMDAwMjAwYyA1NjU2NTY1NiA3ODc4Nzg3OC4qIgotCi1zZXQgd2Vha19yZWdleHBfbGl0dGxlIFwKLSIuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6LioxMDAwIDA4MTAwMDAwIDBjMjAwMDAwIDEyMTIxMjEyIDM0MzQzNDM0LipDb250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOi4qMjAwMCAwODEwMDAwMCAwYzIwMDAwMCA1NjU2NTY1NiA3ODc4Nzg3OC4qIgotCi1pZiB7ISBbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci93ZWFrICItVCAkc3JjZGlyLyRzdWJkaXIvd2Vhay50IHRtcGRpci93ZWFrMS5vIHRtcGRpci93ZWFrMi5vIl0gfSB0aGVuIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgLXMgdG1wZGlyL3dlYWsiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLXMgdG1wZGlyL3dlYWsiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCi0gICAgaWYge1tyZWdleHAgJHdlYWtfcmVnZXhwX2JpZyAkZXhlY19vdXRwdXRdIFwKLQl8fCBbcmVnZXhwICR3ZWFrX3JlZ2V4cF9saXR0bGUgJGV4ZWNfb3V0cHV0XSB9IHRoZW4gewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMDEzZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1TRUNUSU9OUwotewotICAudGV4dCAweDEwMDAgOiB7Ci0gICAgdG1wZGlyL3dlYWsxLm8oLmRhdGEpCi0gIH0KLSAgLmRhdGEgMHgyMDAwIDogewotICAgIHRtcGRpci93ZWFrMi5vKC5kYXRhKQotICB9Ci0gIC9ESVNDQVJELyA6IHsKLSAgICAqKCopCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDZmYmUxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0uZGF0YQotCS5nbG9iYWwJZm9vMQotCS5nbG9iYWwJc3ltMQotCS53ZWFrCXN5bTIKLWZvbzE6Ci0JLmxvbmcJc3ltMQotCS5sb25nCXN5bTIKLXN5bTE6Ci0JLmxvbmcJMHgxMjEyMTIxMgotc3ltMjoKLQkubG9uZwkweDM0MzQzNDM0CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlZGZmNS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLmRhdGEKLQkuZ2xvYmFsCWZvbzIKLQkud2VhawlzeW0xCi0JLmdsb2JhbAlzeW0yCi1mb28yOgotCS5sb25nCXN5bTEKLQkubG9uZwlzeW0yCi1zeW0xOgotCS5sb25nCTB4NTY1NjU2NTYKLXN5bTI6Ci0JLmxvbmcJMHg3ODc4Nzg3OApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8xLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwMjM2Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIF9zdGFydCBzaG91bGQgYmUgdGhlIG9ubHkgdGhpbmcgbGVmdCBhZnRlciBHQy4gICovCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Ci12b2lkIF9zdGFydCgpCi17Ci19Ci0KLXZvaWQgZHJvcG1lMSgpCi17Ci19Ci0KLWludCBkcm9wbWUyWzEwMl0gPSB7IDAgfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTU4ODcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBOb3JtYWxseSB3ZSBzaG91bGQgbG9vc2UgZm9vIGFuZCBrZWVwIF9zdGFydCBhbmQgX2luaXQuIAotICAgV2l0aCAtdSBmb28sIHdlIHNob3VsZCBrZWVwIHRoYXQgYXMgd2VsbC4gICovCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Ci12b2lkIF9zdGFydCgpCi17Ci19Ci0KLXZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmluaXQiKSkpCi1faW5pdCgpCi17Ci19Ci0KLWludCBmb28oKSBfX2FzbV9fKCJmb28iKTsKLWludCBmb28oKQotewotICBzdGF0aWMgaW50IHggPSAxOwotICByZXR1cm4geCsrOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTJiYzVkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMy5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXN0cnVjdCBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLSAgdmlydHVhbCB2b2lkIGJhcigpOwotfTsKLQotdm9pZCBBOjpmb28oKSB7IH0JCQkvLyBrZWVwCi12b2lkIEE6OmJhcigpIHsgfQkJCS8vIGxvb3NlCi0KLXN0cnVjdCBCIDogcHVibGljIEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotfTsKLQotdm9pZCBCOjpmb28oKSB7IH0JCQkvLyBrZWVwCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKLQotQSBhOwkJCQkJLy8ga2VlcAotQiBiOwotQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpCi17Ci0gIGdldG1lKCktPmZvbygpOwotfQotCi0vLyBJbiBhZGRpdGlvbiwga2VlcCBBJ3MgdmlydHVhbCB0YWJsZS4KLQotLy8gV2UnbGwgd2luZCB1cCBrZWVwaW5nIGBiJyBhbmQgdGh1cyBCJ3MgdmlydHVhbCB0YWJsZSBiZWNhdXNlCi0vLyBgYScgYW5kIGBiJyBhcmUgYm90aCByZWZlcmVuY2VkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgotCi1leHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjI2YWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS80LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotc3RydWN0IEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotICB2aXJ0dWFsIHZvaWQgYmFyKCk7Ci19OwotCi12b2lkIEE6OmZvbygpIHsgfQkJCS8vIGxvb3NlCi12b2lkIEE6OmJhcigpIHsgfQkJCS8vIGtlZXAKLQotc3RydWN0IEIgOiBwdWJsaWMgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci19OwotCi12b2lkIEI6OmZvbygpIHsgfQkJCS8vIGxvb3NlCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKLQotQSBhOwkJCQkJLy8ga2VlcAotQiBiOwotQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpCi17Ci0gIGdldG1lKCktPmJhcigpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzUuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzlkOTEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS81LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gVGhpcyB0ZXN0IGN1cnJlbnRseSBmYWlscyBiZWNhdXNlIHRoZSBDKysgZnJvbnQgZW5kIGVtaXRzIGBBJyBhcwotLy8gdGhlIGJhc2UgY2xhc3MgY2FsbGVkIHJhdGhlciB0aGFuIGBCJyBhcyBpdCBvdWdodC4gIEF0IGxlYXN0IGl0Ci0vLyBpcyBlcnJvcmluZyBvbiB0aGUgc2FmZSBzaWRlLi4uCi0KLXN0cnVjdCBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLSAgdmlydHVhbCB2b2lkIGJhcigpOwotfTsKLQotdm9pZCBBOjpmb28oKSB7IH0JCQkvLyBsb29zZQotdm9pZCBBOjpiYXIoKSB7IH0JCQkvLyBsb29zZQotCi1zdHJ1Y3QgQiA6IHB1YmxpYyBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLX07Ci0KLXZvaWQgQjo6Zm9vKCkgeyB9CQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpIF9fYXNtX18oIl9zdGFydCIpOwkvLyBrZWVwCi0KLUEgYTsKLUIgYjsJCQkJCS8vIGtlZXAKLUIgKmdldG1lKCkgeyByZXR1cm4gJmI7IH0JCS8vIGtlZXAKLQotdm9pZCBfc3RhcnQoKQotewotICBnZXRtZSgpLT5mb28oKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIF9fbWFpbigpIHsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE5ZDk3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIExEIHNlbGVjdGl2ZSBsaW5raW5nIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgQ2F0aGVyaW5lIE1vb3JlIChjbG1AY3lnbnVzLmNvbSkKLSMgTWFrZSBzdXJlIHRoYXQgY29uc3RydWN0b3JzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotCi0jIENPRkYgYmFzZWQgcG9ydHMgZG8gbm90IHN1cHBvcnQgc2VsZWN0aXZlIGxpbmtpbmcKLWlmIHtbaXN0YXJnZXQgIiotKi1jb2ZmIiAiKi0qLXBlIl19IHsKLSAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0MSAic2VsZWN0aXZlMSIKLXNldCB0ZXN0MiAic2VsZWN0aXZlMiIKLXNldCB0ZXN0MyAic2VsZWN0aXZlMyIKLXNldCB0ZXN0NCAic2VsZWN0aXZlNCIKLXNldCB0ZXN0NSAic2VsZWN0aXZlNSIKLXNldCB0ZXN0NiAic2VsZWN0aXZlNiIKLQotc2V0IGNmbGFncyAiLXcgLU8yIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIiAKLXNldCBjeHhmbGFncyAiLWZ2dGFibGUtZ2MgLWZuby1leGNlcHRpb25zIC1mbm8tcnR0aSIKLXNldCBsZGZsYWdzICItLWdjLXNlY3Rpb25zIC1Cc3RhdGljIgotCi1pZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHVudGVzdGVkICR0ZXN0MwotICAgIHVudGVzdGVkICR0ZXN0NAotICAgIHVudGVzdGVkICR0ZXN0NQotICAgIHVudGVzdGVkICR0ZXN0NgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8xLmMgdG1wZGlyLzEub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMS54ICIkbGRmbGFncyB0bXBkaXIvMS5vIl0gewotICAgIGZhaWwgJHRlc3QxCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8xLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZHJvcG1lMSldfSB7Ci0JCXNlbmRfbG9nICJkcm9wbWUxID09ICRubV9vdXRwdXQoZHJvcG1lMSlcbiIKLQkJdmVyYm9zZSAiZHJvcG1lMSA9PSAkbm1fb3V0cHV0KGRyb3BtZTEpIgotCQlmYWlsICR0ZXN0MQotCSAgICB9IGVsc2UgewotCQlpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChkcm9wbWUyKV19IHsKLQkJICAgIHNlbmRfbG9nICJkcm9wbWUyID09ICRubV9vdXRwdXQoZHJvcG1lMilcbiIKLQkJICAgIHZlcmJvc2UgImRyb3BtZTIgPT0gJG5tX291dHB1dChkcm9wbWUyKSIKLQkJICAgIGZhaWwgJHRlc3QxCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICR0ZXN0MQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8yLmMgdG1wZGlyLzIub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMi54ICIkbGRmbGFncyB0bXBkaXIvMi5vIl0gewotICAgIGZhaWwgJHRlc3QyCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8yLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MgotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vKV0gfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZm9vID09ICRubV9vdXRwdXQoZm9vKVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZm9vPT0gJG5tX291dHB1dChmb28pIgotICAgICAgICAgICAgZmFpbCAkdGVzdDIKLQl9IGVsc2UgewotICAgICAgICAgICAgcGFzcyAkdGVzdDIKLQkgICAgfSAKLQkgfQotICAgICB9Ci0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzIuYyB0bXBkaXIvMi5vXX0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QzCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci8yLnggIiRsZGZsYWdzIC11IGZvbyB0bXBkaXIvMi5vIl0gewotICAgIGZhaWwgJHRlc3QzCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8yLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MwotICAgIH0gZWxzZSB7Ci0JaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldIH0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdDMKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dChmb28pID09IDB9IHsKLQkJc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKLQkJdmVyYm9zZSAiZm9vPT0gJG5tX291dHB1dChmb28pIgotCQlmYWlsICR0ZXN0MwotCSAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhc3MgJHRlc3QzCi0JCX0KLQkgfQotICAgICB9Ci19Ci0KLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzICRjeHhmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzMuY2MgdG1wZGlyLzMub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0NAotICAgIHJldHVybgotfQotCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci8zLnggIiRsZGZsYWdzIHRtcGRpci8zLm8iXSB7Ci0gICBmYWlsICR0ZXN0NAotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMy54XSB7Ci0gICAgICAgdW5yZXNvbHZlZCAkdGVzdDQKLSAgICB9IGVsc2UgewotICAgICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUIpXX0gewotICAgICAgICAgIHNlbmRfbG9nICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQilcbiIKLSAgICAgICAgICB2ZXJib3NlICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQikiCi0gICAgICAgICAgZmFpbCAkdGVzdDQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpZiB7WyBpbmZvIGV4aXN0cyBubV9vdXRwdXQoYmFyX18xQSldfSB7Ci0gICAgICAgICAgICAgIHNlbmRfbG9nICJiYXJfXzFBPT0gJG5tX291dHB1dChfYmFyX18xQSlcbiIKLSAgICAgICAgICAgICAgdmVyYm9zZSAiYmFyX18xQSA9PSAkbm1fb3V0cHV0KF9iYXJfXzFBKSIKLSAgICAgICAgICAgICAgZmFpbCAkdGVzdDQKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIHBhc3MgJHRlc3Q0Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzICRjeHhmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzQuY2MgdG1wZGlyLzQub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0NQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvNC54ICIkbGRmbGFncyB0bXBkaXIvNC5vIl0gewotICAgIGZhaWwgJHRlc3Q1Ci19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci80LnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0NQotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQildfSB7IAotICAgICAgICAgICAgc2VuZF9sb2cgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgotCSAgICBmYWlsICR0ZXN0NQotCX0gZWxzZSB7Ci0gICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQSldfSB7Ci0JICAgICAgICBzZW5kX2xvZyAiZm9vX18xQT09ICRubV9vdXRwdXQoZm9vX18xQSlcbiIKLQkJdmVyYm9zZSAiZm9vX18xQSA9PSAkbm1fb3V0cHV0KGZvb19fMUEpIgotCQlmYWlsICR0ZXN0NQotICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgcGFzcyAkdGVzdDUKLSAgICAgICAgICAgICB9Ci0JfQotICAgIH0KLX0KLQotc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MgJGN4eGZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvNS5jYyB0bXBkaXIvNS5vXX0gewotICAgIHVucmVzb2x2ZWQgJHRlc3Q2Ci0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci81LnggIiRsZGZsYWdzIHRtcGRpci81Lm8iXSB7Ci0gICAgZmFpbCAkdGVzdDYKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyLzUueF0gewotCXVucmVzb2x2ZWQgJHRlc3Q2Ci0gICAgfSBlbHNlIHsKLQlpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChmb29fXzFCKV0gfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQikiCi0JICAgIGZhaWwgJHRlc3Q2Ci0JfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIHsgW2luZm8gZXhpc3RzIG5tX291dHB1dChmb29fXzFBKV19IHsKLQkJICBzZW5kX2xvZyAiZm9vX18xQT09ICRubV9vdXRwdXQoZm9vX18xQSlcbiIKLQkJICB2ZXJib3NlICJmb29fXzFBID09ICRubV9vdXRwdXQoZm9vX18xQSkiCi0JCSAgZmFpbCAkdGVzdDYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgIHBhc3MgJHRlc3Q2Ci0JICAgIH0KLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NDZkMjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXNoIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgVGVzdCBTSCByZWxheGluZy4gIFRoaXMgdGVzdHMgdGhlIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgYXMgd2VsbCBhcwotIyB0aGUgbGlua2VyLgotCi1pZiAhW2lzdGFyZ2V0IHNoKi0qLSpdIHsKLSAgICByZXR1cm4KLX0KLQotc2V0IHRlc3RzaW1wbGUgIlNIIHNpbXBsZSByZWxheGluZyIKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgIi1yZWxheCAkc3JjZGlyLyRzdWJkaXIvc2gxLnMiIHRtcGRpci9zaDEub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RzaW1wbGUKLX0gZWxzZSB7IGlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaDEgIi1yZWxheCB0bXBkaXIvc2gxLm8iXSB7Ci0gICAgZmFpbCAkdGVzdHNpbXBsZQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvc2gxXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdHNpbXBsZQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGJhcildIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldfSB7Ci0JICAgIHNlbmRfbG9nICJiYWQgb3V0cHV0IGZyb20gbm1cbiIKLQkgICAgdmVyYm9zZSAiYmFkIG91dHB1dCBmcm9tIG5tIgotCSAgICBmYWlsICR0ZXN0c2ltcGxlCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQoYmFyKSAhPSAkbm1fb3V0cHV0KGZvbykgKyA0fSB7Ci0JCXNlbmRfbG9nICJmb28gPT0gJG5tX291dHB1dChmb28pXG4iCi0JCXZlcmJvc2UgImZvbyA9PSAkbm1fb3V0cHV0KGZvbykiCi0JCXNlbmRfbG9nICJiYXIgPT0gJG5tX291dHB1dChiYXIpXG4iCi0JCXZlcmJvc2UgImJhciA9PSAkbm1fb3V0cHV0KGJhcikiCi0JCWZhaWwgJHRlc3RzaW1wbGUKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAkdGVzdHNpbXBsZQotCSAgICB9Ci0JfQotICAgIH0KLX0gfQotCi1zZXQgdGVzdHNyZWMgIlNIIHJlbGF4aW5nIHRvIFMtcmVjb3JkcyIKLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NoMS5zMSAiLXJlbGF4IC1vZm9ybWF0IHNyZWMgdG1wZGlyL3NoMS5vIl0gewotICAgIGZhaWwgJHRlc3RzcmVjCi19IGVsc2UgewotICAgICMgVGhlIGZpbGUgbmFtZSBpcyBlbWJlZGRlZCBpbiB0aGUgUy1yZWNvcmRzLCBzbyBjcmVhdGUgYm90aAotICAgICMgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lLgotICAgIGNhdGNoICJleGVjIHJtIC1mIHRtcGRpci9zaDEuczIiIGV4ZWNfb3V0cHV0Ci0gICAgc2VuZF9sb2cgIm12IHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMlxuIgotICAgIHZlcmJvc2UgIm12IHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIKLSAgICBjYXRjaCAiZXhlYyBtdiB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQl1bnJlc29sdmVkICR0ZXN0c3JlYwotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIgotCXZlcmJvc2UgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIgotCWNhdGNoICJleGVjICRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIiBleGVjX291dHB1dAotCWlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIKLQkgICAgdW5yZXNvbHZlZCAkdGVzdHNyZWMKLQl9IGVsc2UgewotCSAgICBzZW5kX2xvZyAiY21wIHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMlxuIgotCSAgICB2ZXJib3NlICJjbXAgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIgotCSAgICBjYXRjaCAiZXhlYyBjbXAgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIiBleGVjX291dHB1dAotCSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQkgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQkJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCQlmYWlsICR0ZXN0c3JlYwotCSAgICB9IGVsc2UgewotCQlwYXNzICR0ZXN0c3JlYwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotc2V0IHRlc3RsaW5rICJTSCByZWxheGluZyIKLXNldCB0ZXN0anNyICJTSCBjb25maXJtIHJlbGF4aW5nIgotc2V0IHRlc3RydW4gIlNIIHJlbGF4aW5nIGV4ZWN1dGlvbiIKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0bGluawotICAgIHVudGVzdGVkICR0ZXN0anNyCi0gICAgdW50ZXN0ZWQgJHRlc3RydW4KLSAgICByZXR1cm4KLX0KLQotaWYgeyFbbGRfYXNzZW1ibGUgJGFzICItcmVsYXggJHNyY2Rpci8kc3ViZGlyL3N0YXJ0LnMiIHRtcGRpci9zdGFydC5vXSBcCi0gICAgIHx8ICFbbGRfY29tcGlsZSAkQ0MgIi1PIC1tcmVsYXggJHNyY2Rpci8kc3ViZGlyL3NoMi5jIiB0bXBkaXIvc2gyLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdGxpbmsKLSAgICB1bnJlc29sdmVkICR0ZXN0anNyCi0gICAgdW5yZXNvbHZlZCAkdGVzdHJ1bgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2gyICItcmVsYXggdG1wZGlyL3N0YXJ0Lm8gdG1wZGlyL3NoMi5vIl0gewotICAgIGZhaWwgJHRlc3RsaW5rCi0gICAgdW5yZXNvbHZlZCAkdGVzdGpzcgotICAgIHVucmVzb2x2ZWQgJHRlc3RydW4KLSAgICByZXR1cm4KLX0KLQotcGFzcyAkdGVzdGxpbmsKLQotc2VuZF9sb2cgIiRvYmpkdW1wIC1kIHRtcGRpci9zaDJcbiIKLXZlcmJvc2UgIiRvYmpkdW1wIC1kIHRtcGRpci9zaDIiCi1jYXRjaCAiZXhlYyAkb2JqZHVtcCAtZCB0bXBkaXIvc2gyIiBleGVjX291dHB1dAotaWYgW3N0cmluZyBtYXRjaCAiKmpzcioiICRleGVjX291dHB1dF0gewotICAgIGZhaWwgJHRlc3Rqc3IKLX0gZWxzZSB7Ci0gICAgcGFzcyAkdGVzdGpzcgotfQotCi1pZiB7ICFbaW5mbyBleGlzdHMgU0lNXSB8fCBbd2hpY2ggJFNJTV0gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdHJ1bgotICAgIHJldHVybgotfQotCi1zZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyAkU0lNIHRtcGRpci9zaDIiIGV4ZWNfb3V0cHV0XQotaWYgeyAkc3RhdHVzID09IDAgfSB7Ci0gICAgcGFzcyAkdGVzdHJ1bgotfSBlbHNlIHsKLSAgICBmYWlsICR0ZXN0cnVuCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gxLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2gxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOGU0MzkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci1MMToJCi0JbW92LmwJTDIscjAKLQkudXNlcwlMMQotCWpzcglAcjAKLQlydHMKLQkuYWxpZ24JMgotTDI6Ci0JLmxvbmcJYmFyCi1iYXI6Ci0JcnRzCi0JLmFsaWduCTQKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3ZmU4OC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotaW50IGdsb2JhbDsKLQotZXh0ZXJuIHZvaWQgdHJhcCAoaW50LCBpbnQpOwotc3RhdGljIHZvaWQgcXVpdCAoaW50KTsKLXN0YXRpYyBpbnQgZm9vIChpbnQpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgaWYgKGZvbyAoMCkgIT0gMCB8fCBnbG9iYWwgIT0gMCkKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoMSkgIT0gMSB8fCBnbG9iYWwgIT0gMSkKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoMikgIT0gMiB8fCBnbG9iYWwgIT0gMikKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoMykgIT0gMyB8fCBnbG9iYWwgIT0gMykKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoNCkgIT0gNCB8fCBnbG9iYWwgIT0gNCkKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoNSkgIT0gNSB8fCBnbG9iYWwgIT0gNSkKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoNikgIT0gNiB8fCBnbG9iYWwgIT0gNikKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoNykgIT0gNyB8fCBnbG9iYWwgIT0gNykKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoOCkgIT0gOCB8fCBnbG9iYWwgIT0gOCkKLSAgICBxdWl0ICgxKTsKLSAgcXVpdCAoMCk7Ci19Ci0KLXZvaWQKLV9fbWFpbiAoKQotewotfQotCi1zdGF0aWMgdm9pZAotcXVpdCAoaW50IHN0YXR1cykKLXsKLSAgdHJhcCAoMSwgc3RhdHVzKTsKLX0KLQotaW50Ci1iYXIgKGludCBpKQotewotICBnbG9iYWwgPSBpOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXIwIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gMDsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyMSAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDE7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjIgKGludCBpKQotewotICBnbG9iYWwgPSAyOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXIzIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gMzsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyNCAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDQ7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjUgKGludCBpKQotewotICBnbG9iYWwgPSA1OwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXI2IChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gNjsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyNyAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDc7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWZvbyAoaW50IGkpCi17Ci0gIHN3aXRjaCAoaSkKLSAgICB7Ci0gICAgY2FzZSAwOiBiYXIwICgwKTsgcmV0dXJuIDA7Ci0gICAgY2FzZSAxOiBiYXIxICgxKTsgcmV0dXJuIDE7Ci0gICAgY2FzZSAyOiBiYXIyICgyKTsgcmV0dXJuIDI7Ci0gICAgY2FzZSAzOiBiYXIzICgzKTsgcmV0dXJuIDM7Ci0gICAgY2FzZSA0OiBiYXI0ICg0KTsgcmV0dXJuIDQ7Ci0gICAgY2FzZSA1OiBiYXI1ICg1KTsgcmV0dXJuIDU7Ci0gICAgY2FzZSA2OiBiYXI2ICg2KTsgcmV0dXJuIDY7Ci0gICAgY2FzZSA3OiBiYXI3ICg3KTsgcmV0dXJuIDc7Ci0gICAgZGVmYXVsdDogcmV0dXJuIGJhciAoaSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3N0YXJ0LnMgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc3RhcnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmNGM3OS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2gvc3RhcnQucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJc3RhcnQKLXN0YXJ0OgotCi0JbW92LmwJc3RhY2tfayxyMTUKLQotCSEgY2FsbCB0aGUgbWFpbmxpbmUJCi1MMToJCi0JbW92LmwJbWFpbl9rLHIwCi0JLnVzZXMJTDEKLQlqc3IJQHIwCi0Jbm9wCi0KLQkuYWxpZ24gMgotc3RhY2tfazoKLQkubG9uZwlfc3RhY2sJCi1tYWluX2s6Ci0JLmxvbmcJX21haW4KLQotCS5nbG9iYWwgX3RyYXAKLV90cmFwOgkKLQl0cmFwYSAjMwotCXJ0cwotCW5vcAotCi0JLnNlY3Rpb24gLnN0YWNrCi1fc3RhY2s6CS5sb25nCTB4ZGVhZGRlYWQKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvZWxmLW9mZnNldC5sZCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvZWxmLW9mZnNldC5sZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlNDI5My4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSAweDEwMDAwMDsKLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAgIDogeyAqKC5nbnUudmVyc2lvbikJfQotICAuZ251LnZlcnNpb25fZCAgIDogeyAqKC5nbnUudmVyc2lvbl9kKQl9Ci0gIC5nbnUudmVyc2lvbl9yICAgOiB7ICooLmdudS52ZXJzaW9uX3IpCX0KLSAgLnJlbC50ZXh0ICAgICAgOgotICAgIHsKLSAgICAgICooLnJlbC50ZXh0KQotICAgICAgKigucmVsLnRleHQuKikKLSAgICAgICooLnJlbC5nbnUubGlua29uY2UudCopCi0gICAgfQotICAucmVsYS50ZXh0ICAgICA6Ci0gICAgewotICAgICAgKigucmVsYS50ZXh0KQotICAgICAgKigucmVsYS50ZXh0LiopCi0gICAgICAqKC5yZWxhLmdudS5saW5rb25jZS50KikKLSAgICB9Ci0gIC5yZWwuZGF0YSAgICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWwuZGF0YSkKLSAgICAgICooLnJlbC5kYXRhLiopCi0gICAgICAqKC5yZWwuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLnJlbGEuZGF0YSAgICAgOgotICAgIHsKLSAgICAgICooLnJlbGEuZGF0YSkKLSAgICAgICooLnJlbGEuZGF0YS4qKQotICAgICAgKigucmVsYS5nbnUubGlua29uY2UuZCopCi0gICAgfQotICAucmVsLnJvZGF0YSAgICA6Ci0gICAgewotICAgICAgKigucmVsLnJvZGF0YSkKLSAgICAgICooLnJlbC5yb2RhdGEuKikKLSAgICAgICooLnJlbC5nbnUubGlua29uY2UuciopCi0gICAgfQotICAucmVsYS5yb2RhdGEgICA6Ci0gICAgewotICAgICAgKigucmVsYS5yb2RhdGEpCi0gICAgICAqKC5yZWxhLnJvZGF0YS4qKQotICAgICAgKigucmVsYS5nbnUubGlua29uY2UuciopCi0gICAgfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5pbml0ICAgICAgOiB7ICooLnJlbC5pbml0KQl9Ci0gIC5yZWxhLmluaXQgICAgIDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbC5maW5pICAgICAgOiB7ICooLnJlbC5maW5pKQl9Ci0gIC5yZWxhLmZpbmkgICAgIDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7IEtFRVAgKCooLmluaXQpKQl9Ci0gIC5wbHQgICAgICA6IHsgKigucGx0KQl9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgKigudGV4dCkKLSAgICAqKC50ZXh0LiopCi0gICAgKiguc3R1YikKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gIH0KLSAgX2V0ZXh0ID0gLjsKLSAgUFJPVklERSAoZXRleHQgPSAuKTsKLSAgLmZpbmkgICAgICA6IHsgS0VFUCAoKiguZmluaSkpCQl9ID0weDkwOTAKLSAgLnJvZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhLiopCi0gICAgKiguZ251LmxpbmtvbmNlLnIqKQotICB9Ci0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH0KLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCi0gIC4gPSBBTElHTigweDEwMDApICsgKC4gJiAoMHgxMDAwIC0gMSkpOwotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGEuKikKLSAgICAqKC5nbnUubGlua29uY2UuZCopCi0gICAgU09SVChDT05TVFJVQ1RPUlMpCi0gIH0KLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9Ci0gIC5jdG9ycyAgICAgICAgIDoKLSAgewotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIGNvbnN0cnVjdG9ycywgc28KLSAgICAgICB3ZSBtYWtlIHN1cmUgaXQgaXMgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdCBhY3R1YWxseSBsaW5rIGFnYWluc3QKLSAgICAgICBjcnRiZWdpbi5vOyB0aGUgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoCi0gICAgICAgZGlyZWN0b3J5IGNydGJlZ2luLm8gaXMgaW4uICAqLwotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICB9Ci0gIC5kdG9ycyAgICAgICAgIDoKLSAgewotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICB9Ci0gIC5nb3QgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgKiguc2RhdGEuKikgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLnNic3MgICAgICA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KLSAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQotICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLwotICAgLiA9IEFMSUdOKDMyIC8gOCk7Ci0gIH0KLSAgLiA9IEFMSUdOKDMyIC8gOCk7Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqLwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9tYWluLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZmRhYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qIFRoaXMgaXMgdGhlIG1haW4gcHJvZ3JhbSBmb3IgdGhlIHNoYXJlZCBsaWJyYXJ5IHRlc3QuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IG1haW52YXIgPSAxOwotaW50IG92ZXJyaWRkZW52YXIgPSAyOwotZXh0ZXJuIGludCBzaGxpYnZhcjE7Ci0KLWV4dGVybiBpbnQgc2hsaWJfbWFpbnZhciAoKTsKLWV4dGVybiBpbnQgc2hsaWJfb3ZlcnJpZGRlbnZhciAoKTsKLWV4dGVybiBpbnQgc2hsaWJfc2hsaWJ2YXIxICgpOwotZXh0ZXJuIGludCBzaGxpYl9zaGxpYnZhcjIgKCk7Ci1leHRlcm4gaW50IHNobGliX3NobGliY2FsbCAoKTsKLWV4dGVybiBpbnQgc2hsaWJfbWFpbmNhbGwgKCk7Ci1leHRlcm4gaW50IHNobGliX2NoZWNrZnVucHRyMSAoKTsKLWV4dGVybiBpbnQgc2hsaWJfY2hlY2tmdW5wdHIyICgpOwotZXh0ZXJuIGludCAoKnNobGliX2dldGZ1bnB0cjEgKCkpICgpOwotZXh0ZXJuIGludCAoKnNobGliX2dldGZ1bnB0cjIgKCkpICgpOwotZXh0ZXJuIGludCBzaGxpYl9jaGVjayAoKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotaW50Ci1tYWluX2NhbGxlZCAoKQotewotICByZXR1cm4gNjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgYSBmdW5jdGlvbiBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi1pbnQKLXNobGliX292ZXJyaWRkZW5jYWxsMiAoKQotewotICByZXR1cm4gODsKLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIGludCAoKnApICgpOwotCi0gIHByaW50ZiAoIm1haW52YXIgPT0gJWRcbiIsIG1haW52YXIpOwotICBwcmludGYgKCJvdmVycmlkZGVudmFyID09ICVkXG4iLCBvdmVycmlkZGVudmFyKTsKLSAgcHJpbnRmICgic2hsaWJ2YXIxID09ICVkXG4iLCBzaGxpYnZhcjEpOwotI2lmbmRlZiBYQ09GRl9URVNUCi0gIHByaW50ZiAoInNobGliX21haW52YXIgKCkgPT0gJWRcbiIsIHNobGliX21haW52YXIgKCkpOwotICBwcmludGYgKCJzaGxpYl9vdmVycmlkZGVudmFyICgpID09ICVkXG4iLCBzaGxpYl9vdmVycmlkZGVudmFyICgpKTsKLSNlbmRpZgotICBwcmludGYgKCJzaGxpYl9zaGxpYnZhcjEgKCkgPT0gJWRcbiIsIHNobGliX3NobGlidmFyMSAoKSk7Ci0gIHByaW50ZiAoInNobGliX3NobGlidmFyMiAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJ2YXIyICgpKTsKLSAgcHJpbnRmICgic2hsaWJfc2hsaWJjYWxsICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYmNhbGwgKCkpOwotI2lmbmRlZiBYQ09GRl9URVNUCi0gIHByaW50ZiAoInNobGliX3NobGliY2FsbDIgKCkgPT0gJWRcbiIsIHNobGliX3NobGliY2FsbDIgKCkpOwotICBwcmludGYgKCJzaGxpYl9tYWluY2FsbCAoKSA9PSAlZFxuIiwgc2hsaWJfbWFpbmNhbGwgKCkpOwotI2VuZGlmCi0gIHByaW50ZiAoIm1haW5fY2FsbGVkICgpID09ICVkXG4iLCBtYWluX2NhbGxlZCAoKSk7Ci0gIHByaW50ZiAoInNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAlZFxuIiwKLQkgIHNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSk7Ci0jaWZuZGVmIFhDT0ZGX1RFU1QKLSAgcHJpbnRmICgic2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkgPT0gJWRcbiIsCi0JICBzaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSk7Ci0jZW5kaWYKLSAgcCA9IHNobGliX2dldGZ1bnB0cjEgKCk7Ci0gIHByaW50ZiAoInNobGliX2dldGZ1bnB0cjEgKCkgIik7Ci0gIGlmIChwID09IHNobGliX3NobGlidmFyMSkKLSAgICBwcmludGYgKCI9PSIpOwotICBlbHNlCi0gICAgcHJpbnRmICgiIT0iKTsKLSAgcHJpbnRmICgiIHNobGliX3NobGlidmFyMVxuIik7Ci0jaWZuZGVmIFhDT0ZGX1RFU1QKLSAgcCA9IHNobGliX2dldGZ1bnB0cjIgKCk7Ci0gIHByaW50ZiAoInNobGliX2dldGZ1bnB0cjIgKCkgIik7Ci0gIGlmIChwID09IG1haW5fY2FsbGVkKQotICAgIHByaW50ZiAoIj09Iik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIhPSIpOwotICBwcmludGYgKCIgbWFpbl9jYWxsZWRcbiIpOwotI2VuZGlmCi0gIHByaW50ZiAoInNobGliX2NoZWNrICgpID09ICVkXG4iLCBzaGxpYl9jaGVjayAoKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZjE4M2MuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKiBUaGlzIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGxkIHRlc3QuICBUaGlzIGZpbGUgYmVjb21lcyBwYXJ0Ci0gICBvZiBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBzdXBwbGllZCBieSB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KLSNpZm5kZWYgWENPRkZfVEVTVAotZXh0ZXJuIGludCBtYWludmFyOwotI2VuZGlmCi0KLS8qIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGxpYnJhcnksIGFuZCBvdmVycmlkZGVuIGJ5Ci0gICB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50IG92ZXJyaWRkZW52YXIgPSAtMTsKLSNlbmRpZgotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLWludCBzaGxpYnZhcjEgPSAzOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgYnkgYW5vdGhlciBvYmplY3QgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLWV4dGVybiBpbnQgc2hsaWJ2YXIyOwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSB2YWx1ZXMgb2YgdGhlIGFib3ZlIHZhcmlhYmxlcyBhcyBzZWVuIGluCi0gICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotc2hsaWJfbWFpbnZhciAoKQotewotICByZXR1cm4gbWFpbnZhcjsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotc2hsaWJfb3ZlcnJpZGRlbnZhciAoKQotewotICByZXR1cm4gb3ZlcnJpZGRlbnZhcjsKLX0KLSNlbmRpZgotCi1pbnQKLXNobGliX3NobGlidmFyMSAoKQotewotICByZXR1cm4gc2hsaWJ2YXIxOwotfQotCi1pbnQKLXNobGliX3NobGlidmFyMiAoKQotewotICByZXR1cm4gc2hsaWJ2YXIyOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhbm90aGVyIG9iamVjdCBpbiB0aGUKLSAgIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotZXh0ZXJuIGludCBzaGxpYl9zaGxpYmNhbGxlZCAoKTsKLQotaW50Ci1zaGxpYl9zaGxpYmNhbGwgKCkKLXsKLSAgcmV0dXJuIHNobGliX3NobGliY2FsbGVkICgpOwotfQotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLS8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoaXMgb2JqZWN0IGluIHRoZSBzaGFyZWQKLSAgIGxpYnJhcnkuICBUaGUgbWFpbiBwcm9ncmFtIHdpbGwgb3ZlcnJpZGUgdGhlIGNhbGxlZCBmdW5jdGlvbi4gICovCi0KLWV4dGVybiBpbnQgc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpOwotCi1pbnQKLXNobGliX3NobGliY2FsbDIgKCkKLXsKLSAgcmV0dXJuIHNobGliX292ZXJyaWRkZW5jYWxsMiAoKTsKLX0KLQotaW50Ci1zaGxpYl9vdmVycmlkZGVuY2FsbDIgKCkKLXsKLSAgcmV0dXJuIDc7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBjYWxscyBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgdGhlIG1haW4gcHJvZ3JhbS4gICovCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotZXh0ZXJuIGludCBtYWluX2NhbGxlZCAoKTsKLQotaW50Ci1zaGxpYl9tYWluY2FsbCAoKQotewotICByZXR1cm4gbWFpbl9jYWxsZWQgKCk7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgYSBmdW5jdGlvbiBwb2ludGVyIHRvIHNobGliX21haW52YXIuICBJdAotICAgY29uZmlybXMgdGhhdCB0aGUgcG9pbnRlciBjb21wYXJlcyBlcXVhbGx5LiAgKi8KLQotaW50IAotc2hsaWJfY2hlY2tmdW5wdHIxIChwKQotICAgICBpbnQgKCpwKSAoKTsKLXsKLSAgcmV0dXJuIHAgPT0gc2hsaWJfc2hsaWJ2YXIxOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gbWFpbl9jYWxsZWQuICBJdAotICAgY29uZmlybXMgdGhhdCB0aGUgcG9pbnRlciBjb21wYXJlcyBlcXVhbGx5LiAgKi8KLQotI2lmbmRlZiBYQ09GRl9URVNUCi1pbnQKLXNobGliX2NoZWNrZnVucHRyMiAocCkKLSAgICAgaW50ICgqcCkgKCk7Ci17Ci0gIHJldHVybiBwID09IG1haW5fY2FsbGVkOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gc2hsaWJfbWFpbnZhci4gICovCi0KLWludAotKCpzaGxpYl9nZXRmdW5wdHIxICgpKSAoKQotewotICByZXR1cm4gc2hsaWJfc2hsaWJ2YXIxOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIG1haW5fY2FsbGVkLiAgKi8KLQotI2lmbmRlZiBYQ09GRl9URVNUCi1pbnQKLSgqc2hsaWJfZ2V0ZnVucHRyMiAoKSkgKCkKLXsKLSAgcmV0dXJuIG1haW5fY2FsbGVkOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IGNvbnN0YW50IGRhdGEgYW5kIGxvY2FsIGZ1bmN0aW9ucwotICAgd29yay4gICovCi0KLSNpZm5kZWYgX19TVERDX18KLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi1zdGF0aWMgaW50IGkgPSA2Owotc3RhdGljIGNvbnN0IGNoYXIgKnN0ciA9ICJIZWxsbywgd29ybGRcbiI7Ci0KLWludAotc2hsaWJfY2hlY2sgKCkKLXsKLSAgY29uc3QgY2hhciAqczEsICpzMjsKLQotICBpZiAoaSAhPSA2KQotICAgIHJldHVybiAwOwotCi0gIC8qIFRvIGlzb2xhdGUgdGhlIHRlc3QsIGRvbid0IHJlbHkgb24gYW55IGV4dGVybmFsIGZ1bmN0aW9ucywgc3VjaAotICAgICBhcyBzdHJjbXAuICAqLwotICBzMSA9ICJIZWxsbywgd29ybGRcbiI7Ci0gIHMyID0gc3RyOwotICB3aGlsZSAoKnMxICE9ICdcMCcpCi0gICAgaWYgKCpzMSsrICE9ICpzMisrKQotICAgICAgcmV0dXJuIDA7Ci0gIGlmICgqczIgIT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLQotICBpZiAoc2hsaWJfc2hsaWJ2YXIxICgpICE9IDMpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzYTRlMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyogVGhpcyBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgbGlicmFyeSBsZCB0ZXN0LiAgVGhpcyBmaWxlIGJlY29tZXMgcGFydAotICAgb2YgYSBzaGFyZWQgbGlicmFyeS4gICovCi0KLS8qIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBoZXJlLCBhbmQgcmVmZXJlbmNlZCBieSBhbm90aGVyIGZpbGUgaW4KLSAgIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi1pbnQgc2hsaWJ2YXIyID0gNDsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYW5vdGhlciBmaWxlIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLWludAotc2hsaWJfc2hsaWJjYWxsZWQgKCkKLXsKLSAgcmV0dXJuIDU7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5kYXQgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZWUzN2YuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotbWFpbnZhciA9PSAxCi1vdmVycmlkZGVudmFyID09IDIKLXNobGlidmFyMSA9PSAzCi1zaGxpYl9tYWludmFyICgpID09IDEKLXNobGliX292ZXJyaWRkZW52YXIgKCkgPT0gMgotc2hsaWJfc2hsaWJ2YXIxICgpID09IDMKLXNobGliX3NobGlidmFyMiAoKSA9PSA0Ci1zaGxpYl9zaGxpYmNhbGwgKCkgPT0gNQotc2hsaWJfc2hsaWJjYWxsMiAoKSA9PSA4Ci1zaGxpYl9tYWluY2FsbCAoKSA9PSA2Ci1tYWluX2NhbGxlZCAoKSA9PSA2Ci1zaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gMQotc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkgPT0gMQotc2hsaWJfZ2V0ZnVucHRyMSAoKSA9PSBzaGxpYl9zaGxpYnZhcjEKLXNobGliX2dldGZ1bnB0cjIgKCkgPT0gbWFpbl9jYWxsZWQKLXNobGliX2NoZWNrICgpID09IDEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmMTQ3OS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC1zaGFyZWQgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKLSMKLQotIyBNYWtlIHN1cmUgdGhhdCBsZCBjYW4gZ2VuZXJhdGUgRUxGIHNoYXJlZCBsaWJyYXJpZXMuCi0jIE5vdGUgdGhhdCBsaW5raW5nIGFnYWluc3QgRUxGIHNoYXJlZCBsaWJyYXJpZXMgaXMgdGVzdGVkIGJ5IHRoZQotIyBib290c3RyYXAgdGVzdC4KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCi1pZiAhW2lzbmF0aXZlXSB0aGVuIHtyZXR1cm59Ci0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiBhIGNvdXBsZSBvZiBFTEYgcGxhdGZvcm1zLgotIyBTcXVhcmUgYnJhY2tldCBleHByZXNzaW9ucyBzZWVtIHRvIGNvbmZ1c2UgaXN0YXJnZXQuCi1pZiB7ICFbaXN0YXJnZXQgaTM4Ni0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk0ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNTg2LSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTM4Ni0qLXVuaXh3YXJlXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLXVuaXh3YXJlXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLXVuaXh3YXJlXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTM4Ni0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTM4Ni0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk0ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNTg2LSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbTY4ay0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IG1pcHMqLSotaXJpeDUqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYy0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYy0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHNwYXJjKi0qLWVsZl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHNwYXJjKi0qLXNvbGFyaXMyKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHNwYXJjKi0qLXN1bm9zNCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCB0bXBkaXIgdG1wZGlyCi1zZXQgU0hDRkxBRyAiIgotCi1pZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0KLSAgICAjIEFJWCBzaGFyZWQgbGlicmFyaWVzIGRvIG5vdCBzZWVtIHRvIHN1cHBvcnQgdXNlZnVsIGZlYXR1cmVzLAotICAgICMgbGlrZSBvdmVycmlkaW5nIHRoZSBzaGFyZWQgbGlicmFyeSBmdW5jdGlvbiBvciBsZXR0aW5nIHRoZQotICAgICMgc2hhcmVkIGxpYnJhcnkgcmVmZXIgdG8gb2JqZWN0cyBkZWZpbmVkIGluIHRoZSBtYWluIHByb2dyYW0uICBXZQotICAgICMgYXZvaWQgdGVzdGluZyB0aG9zZSBmZWF0dXJlcy4KLSAgICBzZXQgU0hDRkxBRyAiLURYQ09GRl9URVNUIgotCi0gICAgIyBUaGUgQUlYIDMuMi41IGxvYWRlciBhcHBlYXJzIHRvIHJhbmRvbWx5IGZhaWwgd2hlbiBsb2FkaW5nCi0gICAgIyBzaGFyZWQgbGlicmFyaWVzIGZyb20gTlNGIG1vdW50ZWQgcGFydGl0aW9ucywgc28gd2UgYXZvaWQgYW55Ci0gICAgIyBwb3RlbnRpYWwgcHJvYmxlbXMgYnkgdXNpbmcgYSBsb2NhbCBkaXJlY3RvcnkuCi0gICAgY2F0Y2gge2V4ZWMgL2Jpbi9zaCAtYyAiZWNobyAkJCJ9IHBpZAotICAgIHNldCB0bXBkaXIgL3Vzci90bXAvbGQuJHBpZAotICAgIGNhdGNoICJleGVjIG1rZGlyICR0bXBkaXIiIGV4ZWNfc3RhdHVzCi0KLSAgICAjIE9uIEFJWCwgd2UgbmVlZCB0byBleHBsaWNpdGx5IGV4cG9ydCB0aGUgc3ltYm9scyB0aGUgc2hhcmVkCi0gICAgIyBsaWJyYXJ5IGlzIGdvaW5nIHRvIHByb3ZpZGUsIGFuZCBuZWVkLgotICAgIHNldCBmaWxlIFtvcGVuICR0bXBkaXIveGNvZmYuZXhwIHddCi0gICAgcHV0cyAkZmlsZSBzaGxpYnZhcjEKLSAgICBwdXRzICRmaWxlIHNobGlidmFyMgotICAgIHB1dHMgJGZpbGUgc2hsaWJfc2hsaWJ2YXIxCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYnZhcjIKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGliY2FsbAotICAgIHB1dHMgJGZpbGUgc2hsaWJfc2hsaWJjYWxsZWQKLSAgICBwdXRzICRmaWxlIHNobGliX2NoZWNrZnVucHRyMQotICAgIHB1dHMgJGZpbGUgc2hsaWJfZ2V0ZnVucHRyMQotICAgIHB1dHMgJGZpbGUgc2hsaWJfY2hlY2sKLSAgICBjbG9zZSAkZmlsZQotfQotCi0jIFRoZSB0ZXN0IHByb2NlZHVyZS4KLXByb2Mgc2hhcmVkX3Rlc3QgeyBwcm9nbmFtZSB0ZXN0bmFtZSBtYWluIHNoMSBzaDIgZGF0IGFyZ3MgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotCi0gICAgaWYgW2xsZW5ndGggJGFyZ3NdIHsgc2V0IHNobGRmbGFncyBbbGluZGV4ICRhcmdzIDBdIH0gZWxzZSB7IHNldCBzaGxkZmxhZ3MgIiIgfQotCi0gICAgIyBCdWlsZCB0aGUgc2hhcmVkIGxpYnJhcnkuCi0gICAgIyBPbiBBSVgsIHdlIG5lZWQgdG8gdXNlIGFuIGV4cG9ydCBmaWxlLgotICAgIHNldCBzaGFyZWQgLXNoYXJlZAotICAgIGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQlzZXQgc2hhcmVkICItYk06U1JFIC1iRTokdG1wZGlyL3hjb2ZmLmV4cCIKLSAgICB9Ci0gICAgaWYgeyFbbGRfc2ltcGxlX2xpbmsgJGxkICR0bXBkaXIvJHByb2duYW1lLnNvICIkc2hhcmVkICRzaGxkZmxhZ3MgJHRtcGRpci8kc2gxICR0bXBkaXIvJHNoMiJdfSB7Ci0gICAgICAgIGZhaWwgIiR0ZXN0bmFtZSIKLSAgICAJcmV0dXJuCi0gICAgfQotCi0gICAgIyBMaW5rIGFnYWluc3QgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgVXNlIC1ycGF0aCBzbyB0aGF0IHRoZQotICAgICMgZHluYW1pYyBsaW5rZXIgY2FuIGxvY2F0ZSB0aGUgc2hhcmVkIGxpYnJhcnkgYXQgcnVudGltZS4KLSAgICAjIE9uIEFJWCwgd2UgbXVzdCBpbmNsdWRlIC9saWIgaW4gLXJwYXRoLCBhcyBvdGhlcndpc2UgdGhlIGxvYWRlcgotICAgICMgY2FuIG5vdCBmaW5kIC1sYy4KLSAgICBzZXQgcnBhdGggJHRtcGRpcgotICAgIGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQlzZXQgcnBhdGggL2xpYjokdG1wZGlyCi0gICAgfQotICAgIGlmICFbbGRfbGluayAkbGQgJHRtcGRpci8kcHJvZ25hbWUgIi1ycGF0aCAkcnBhdGggJHRtcGRpci8kbWFpbiAkdG1wZGlyLyRwcm9nbmFtZS5zbyJdIHsKLSAgICAJZmFpbCAiJHRlc3RuYW1lIgotICAgIAlyZXR1cm4KLSAgICB9Ci0KLSAgICAjIFJ1biB0aGUgcmVzdWx0aW5nIHByb2dyYW0KLSAgICBzZW5kX2xvZyAiJHRtcGRpci8kcHJvZ25hbWUgPiR0bXBkaXIvJHByb2duYW1lLm91dFxuIgotICAgIHZlcmJvc2UgIiR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXQiCi0gICAgY2F0Y2ggImV4ZWMgJHRtcGRpci8kcHJvZ25hbWUgPiR0bXBkaXIvJHByb2duYW1lLm91dCIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JZmFpbCAiJHRlc3RuYW1lIgotICAgIAlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiZGlmZiAkdG1wZGlyLyRwcm9nbmFtZS5vdXQgJHNyY2Rpci8kc3ViZGlyLyRkYXQuZGF0XG4iCi0gICAgdmVyYm9zZSAiZGlmZiAkdG1wZGlyLyRwcm9nbmFtZS5vdXQgJHNyY2Rpci8kc3ViZGlyLyRkYXQuZGF0IgotICAgIGNhdGNoICJleGVjIGRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgIGlmIHshW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdfSB0aGVuIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAiJHRlc3RuYW1lIgotfQotCi1pZiBbaXN0YXJnZXQgbWlwcyotKi0qXSB7Ci0gICAgc2V0IHBpY2ZsYWcgIiIKLX0gZWxzZSB7Ci0gICAgIyBVbmZvcnR1bmF0ZWx5LCB0aGUgZ2NjIGFyZ3VtZW50IGlzIC1mcGljIGFuZCB0aGUgY2MgYXJndW1lbnQgaXMKLSAgICAjIC1LUElDLiAgV2UgaGF2ZSB0byB0cnkgYm90aC4KLSAgICBzZXQgcGljZmxhZyAiLWZwaWMiCi0gICAgc2VuZF9sb2cgIiRDQyAkcGljZmxhZ1xuIgotICAgIHZlcmJvc2UgIiRDQyAkcGljZmxhZyIKLSAgICBjYXRjaCAiZXhlYyAkQ0MgJHBpY2ZsYWciIGV4ZWNfb3V0cHV0Ci0gICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotICAgIHZlcmJvc2UgIi0tIiAiJGV4ZWNfb3V0cHV0IgotICAgIGlmIHsgW3N0cmluZyBtYXRjaCAiKmlsbGVnYWwgb3B0aW9uKiIgJGV4ZWNfb3V0cHV0XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipvcHRpb24gaWdub3JlZCoiICRleGVjX291dHB1dF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqdW5yZWNvZ25pemVkIG9wdGlvbioiICRleGVjX291dHB1dF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqcGFzc2VkIHRvIGxkKiIgJGV4ZWNfb3V0cHV0XSB9IHsKLQlpZiBbaXN0YXJnZXQgKi0qLXN1bm9zNCpdIHsKLQkgICAgc2V0IHBpY2ZsYWcgIi1waWMiCi0JfSBlbHNlIHsKLQkgICAgc2V0IHBpY2ZsYWcgIi1LUElDIgotCX0KLSAgICB9Ci19Ci12ZXJib3NlICJVc2luZyAkcGljZmxhZyB0byBjb21waWxlIFBJQyBjb2RlIgotCi0jIENvbXBpbGUgdGhlIG1haW4gcHJvZ3JhbS4KLWlmICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUciICRzcmNkaXIvJHN1YmRpci9tYWluLmMgJHRtcGRpci9tYWlubnAub10gewotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAobm9uIFBJQykiCi0gICAgdW5yZXNvbHZlZCAic2hhcmVkIgotfSBlbHNlIHsKLSAgICAjIFRoZSBzaGFyZWQgbGlicmFyeSBpcyBjb21wb3NlZCBvZiB0d28gZmlsZXMuICBGaXJzdCBjb21waWxlIHRoZW0KLSAgICAjIHdpdGhvdXQgdXNpbmcgLWZwaWMuICBUaGF0IHNob3VsZCB3b3JrIG9uIGFuIEVMRiBzeXN0ZW0sCi0gICAgIyBhbHRob3VnaCBpdCB3aWxsIGJlIGxlc3MgZWZmaWNpZW50IGJlY2F1c2UgdGhlIGR5bmFtaWMgbGlua2VyCi0gICAgIyB3aWxsIG5lZWQgdG8gZG8gbW9yZSByZWxvY2F0aW9uIHdvcmsuICBIb3dldmVyLCBub3RlIHRoYXQgbm90Ci0gICAgIyB1c2luZyAtZnBpYyB3aWxsIGNhdXNlIHNvbWUgb2YgdGhlIHRlc3RzIHRvIHJldHVybiBkaWZmZXJlbnQKLSAgICAjIHJlc3VsdHMuCi0gICAgaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHIiAkc3JjZGlyLyRzdWJkaXIvc2gxLmMgJHRtcGRpci9zaDFucC5vXQotCSB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHIiAkc3JjZGlyLyRzdWJkaXIvc2gyLmMgJHRtcGRpci9zaDJucC5vXSB9IHsKLQl1bnJlc29sdmVkICJzaGFyZWQgKG5vbiBQSUMpIgotICAgIH0gZWxzZSB7IGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQlzaGFyZWRfdGVzdCBzaG5wICJzaGFyZWQgKG5vblBJQykiIG1haW5ucC5vIHNoMW5wLm8gc2gybnAubyB4Y29mZgotICAgIH0gZWxzZSB7Ci0JIyBTdW5PUyBub24gUElDIHNoYXJlZCBsaWJyYXJpZXMgZG9uJ3QgcGVybWl0IHNvbWUgY2FzZXMgb2YKLQkjIG92ZXJyaWRpbmcuCi0Jc2V0dXBfeGZhaWwgIiotKi1zdW5vczQqIgotCXNoYXJlZF90ZXN0IHNobnAgInNoYXJlZCAobm9uIFBJQykiIG1haW5ucC5vIHNoMW5wLm8gc2gybnAubyBzaGFyZWQKLQotCSMgVGVzdCBFTEYgc2hhcmVkIGxpYnJhcnkgcmVsb2NhdGlvbnMgd2l0aCBhIG5vbi16ZXJvIGxvYWQKLQkjIGFkZHJlc3MgZm9yIHRoZSBsaWJyYXJ5LiAgTmVhciBhcyBJIGNhbiB0ZWxsLCB0aGUgUl8qX1JFTEFUSVZFCi0JIyByZWxvY2F0aW9ucyBmb3IgdmFyaW91cyB0YXJnZXRzIGFyZSBicm9rZW4gaW4gdGhlIGNhc2Ugd2hlcmUKLQkjIHRoZSBsb2FkIGFkZHJlc3MgaXMgbm90IHplcm8gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS4KLQlzZXR1cF94ZmFpbCAiKi0qLXN1bm9zNCoiCi0Jc2hhcmVkX3Rlc3Qgc2hucCAic2hhcmVkIChub24gUElDLCBsb2FkIG9mZnNldCkiIFwKLQkJbWFpbm5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZCBcCi0JCSItVCAkc3JjZGlyLyRzdWJkaXIvZWxmLW9mZnNldC5sZCIKLSAgICB9IH0KLQotICAgICMgTm93IGNvbXBpbGUgdGhlIGNvZGUgdXNpbmcgLWZwaWMuCi0KLSAgICBpZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUcgJHBpY2ZsYWciICRzcmNkaXIvJHN1YmRpci9zaDEuYyAkdG1wZGlyL3NoMXAub10gCi0JIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUcgJHBpY2ZsYWciICRzcmNkaXIvJHN1YmRpci9zaDIuYyAkdG1wZGlyL3NoMnAub10gfSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIgotICAgIH0gZWxzZSB7Ci0JIyBTdW5PUyBjYW4gbm90IGNvbXBhcmUgZnVuY3Rpb24gcG9pbnRlcnMgY29ycmVjdGx5Ci0JaWYgW2lzdGFyZ2V0ICIqLSotc3Vub3M0KiJdIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8gc3VuNAotCX0gZWxzZSB7IGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8geGNvZmYKLQl9IGVsc2UgewotCSAgICBzaGFyZWRfdGVzdCBzaHAgInNoYXJlZCIgbWFpbm5wLm8gc2gxcC5vIHNoMnAubyBzaGFyZWQKLQl9IH0KLSAgICB9Ci19Ci0KLSMgTm93IGRvIHRoZSBzYW1lIHRlc3RzIGFnYWluLCBidXQgdGhpcyB0aW1lIGNvbXBpbGUgbWFpbi5jIFBJQy4KLWlmICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUcgJHBpY2ZsYWciICRzcmNkaXIvJHN1YmRpci9tYWluLmMgJHRtcGRpci9tYWlucC5vXSB7Ci0gICAgdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiCi0gICAgdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbikiCi19IGVsc2UgewotICAgIGlmIHsgW2ZpbGUgZXhpc3RzICR0bXBkaXIvc2gxbnAubyBdICYmIFsgZmlsZSBleGlzdHMgJHRtcGRpci9zaDJucC5vIF0gfSB7Ci0gICAgICAgIGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcG5wICJzaGFyZWQgKFBJQyBtYWluLCBub24gUElDIHNvKSIgbWFpbnAubyBzaDFucC5vIHNoMm5wLm8geGNvZmYKLQl9IGVsc2UgewotCSAgICAjIFN1bk9TIG5vbiBQSUMgc2hhcmVkIGxpYnJhcmllcyBkb24ndCBwZXJtaXQgc29tZSBjYXNlcyBvZgotCSAgICAjIG92ZXJyaWRpbmcuCi0JICAgIHNldHVwX3hmYWlsICIqLSotc3Vub3M0KiIKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcG5wICJzaGFyZWQgKFBJQyBtYWluLCBub24gUElDIHNvKSIgbWFpbnAubyBzaDFucC5vIHNoMm5wLm8gc2hhcmVkCi0JfQotICAgIH0gZWxzZSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiCi0gICAgfQotCi0gICAgaWYgeyBbZmlsZSBleGlzdHMgJHRtcGRpci9zaDFwLm8gXSAmJiBbIGZpbGUgZXhpc3RzICR0bXBkaXIvc2gycC5vIF0gfSB7Ci0gICAgICAgIGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcHAgInNoYXJlZCAoUElDIG1haW4pIiBtYWlucC5vIHNoMXAubyBzaDJwLm8geGNvZmYKLQl9IGVsc2UgewotCSAgICBzaGFyZWRfdGVzdCBzaG1wcCAic2hhcmVkIChQSUMgbWFpbikiIG1haW5wLm8gc2gxcC5vIHNoMnAubyBzaGFyZWQKLQl9Ci0gICAgfSBlbHNlIHsKLQl1bnJlc29sdmVkICJzaGFyZWQgKFBJQyBtYWluKSIKLSAgICB9Ci19Ci0KLWlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLSAgICAjIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KLSAgICBjYXRjaCAiZXhlYyBybSAtcmYgJHRtcGRpciIgZXhlY19zdGF0dXMKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc3VuNC5kYXQgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTBkODdkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc3VuNC5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX21haW52YXIgKCkgPT0gMQotc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAyCi1zaGxpYl9zaGxpYnZhcjEgKCkgPT0gMwotc2hsaWJfc2hsaWJ2YXIyICgpID09IDQKLXNobGliX3NobGliY2FsbCAoKSA9PSA1Ci1zaGxpYl9zaGxpYmNhbGwyICgpID09IDgKLXNobGliX21haW5jYWxsICgpID09IDYKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAwCi1zaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpICE9IHNobGliX3NobGlidmFyMQotc2hsaWJfZ2V0ZnVucHRyMiAoKSA9PSBtYWluX2NhbGxlZAotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3hjb2ZmLmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwOWQ5Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3hjb2ZmLmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLW1haW52YXIgPT0gMQotb3ZlcnJpZGRlbnZhciA9PSAyCi1zaGxpYnZhcjEgPT0gMwotc2hsaWJfc2hsaWJ2YXIxICgpID09IDMKLXNobGliX3NobGlidmFyMiAoKSA9PSA0Ci1zaGxpYl9zaGxpYmNhbGwgKCkgPT0gNQotbWFpbl9jYWxsZWQgKCkgPT0gNgotc2hsaWJfY2hlY2tmdW5wdHIxIChzaGxpYl9zaGxpYnZhcjEpID09IDEKLXNobGliX2dldGZ1bnB0cjEgKCkgPT0gc2hsaWJfc2hsaWJ2YXIxCi1zaGxpYl9jaGVjayAoKSA9PSAxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2RlOTc3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LiAgKi8KLQotZXh0ZXJuIGludCBlMTsKLWV4dGVybiBpbnQgZTI7Ci1pbnQgaTsKLWludCBqID0gMTsKLXN0YXRpYyBpbnQgazsKLXN0YXRpYyBpbnQgbCA9IDE7Ci1zdGF0aWMgY2hhciBhYltdID0gIlRoaXMgaXMgYSBzdHJpbmcgY29uc3RhbnQiOwotCi1leHRlcm4gaW50IGZuMSAoKTsKLWV4dGVybiBpbnQgZm4yICgpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgZm4xIChhYik7Ci0gIGZuMiAoInN0YXRpYyBzdHJpbmcgY29uc3RhbnQiKTsKLSAgcmV0dXJuIGUxICsgZTIgKyBpICsgaiArIGsgKyBsOwotfQotCi12b2lkCi1fX21haW4gKCkKLXsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzZjZmEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBTLXJlY29yZCBmb3JtYXQuICAqLwotCi1pbnQgZTE7Ci1pbnQgZTIgPSAxOwotCi1pbnQKLWZuMSAocykKLSAgICAgY2hhciAqczsKLXsKLSAgcmV0dXJuIHNbZTFdOwotfQotCi1pbnQKLWZuMiAocykKLSAgICAgY2hhciAqczsKLXsKLSAgcmV0dXJuIHNbZTJdOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IzLmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE3YzI2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLyBUaGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBTLXJlY29yZCBmb3JtYXQuCi0KLSNkZWZpbmUgRk9PX01TR19MRU4gODAKLQotY2xhc3MgRm9vIHsKLSAgICBzdGF0aWMgaW50IGZvb3M7Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBsZW4gPSBGT09fTVNHX0xFTjsKLSAgICBjaGFyIG1lc3NhZ2VbbGVuXTsKLXB1YmxpYzoKLSAgICBzdGF0aWMgdm9pZCBpbml0X2ZvbyAoKTsKLSAgICBzdGF0aWMgaW50IG5iX2Zvb3MoKSB7IHJldHVybiBmb29zOyB9Ci0gICAgRm9vKCk7Ci0gICAgRm9vKCBjaGFyKiBtZXNzYWdlKTsKLSAgICBGb28oY29uc3QgRm9vJik7Ci0gICAgRm9vICYgb3BlcmF0b3I9IChjb25zdCBGb28mKTsKLSAgICB+Rm9vICgpOwotfTsKLQotc3RhdGljIEZvbyBzdGF0aWNfZm9vKCAic3RhdGljX2ZvbyIpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgRm9vIGF1dG9tYXRpY19mb28oICJhdXRvbWF0aWNfZm9vIik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi10ZXJtaW5hdGUodm9pZCkKLXsKLSAgLyogVGhpcyByZWN1cnNpdmUgY2FsbCBwcmV2ZW50cyBhIGNvbXBpbGVyIHdhcm5pbmcgdGhhdCB0aGUgbm9yZXR1cm4KLSAgICAgZnVuY3Rpb24gdGVybWluYXRlIGFjdHVhbGx5IGRvZXMgcmV0dXJuLiAgKi8KLSAgdGVybWluYXRlICgpOwotfQotCi1leHRlcm4gIkMiIHsKLXZvaWQKLV9fbWFpbiAoKQotewotfQotCi12b2lkCi1fX2J1aWx0aW5fZGVsZXRlICgpCi17Ci19Ci0KLXZvaWQKLV9fYnVpbHRpbl9uZXcgKCkKLXsKLX0KLQotdm9pZAotX190aHJvdyAoKQotewotfQotCi12b2lkCi1fX3Rlcm1pbmF0ZSAoKQotewotfQotCi12b2lkICpfX2VoX3BjOwotCi12b2lkICoqKgotX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluICgpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkICoKLV9fZ2V0X2VoX2NvbnRleHQgKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLX0KLQotaW50IEZvbzo6Zm9vcyA9IDA7Ci0KLXZvaWQgRm9vOjppbml0X2ZvbyAoKQotewotICBmb29zID0gODA7Ci19Ci0KLUZvbzo6Rm9vICgpCi17Ci0gIGkgPSArK2Zvb3M7Ci19Ci0KLUZvbzo6Rm9vIChjaGFyKiBtc2cpCi17Ci0gIGkgPSArK2Zvb3M7Ci19Ci0KLUZvbzo6Rm9vIChjb25zdCBGb28mIGZvbykKLXsKLSAgaSA9ICsrZm9vczsKLSAgZm9yIChpbnQgayA9IDA7IGsgPCBGT09fTVNHX0xFTjsgaysrKQotICAgIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKLX0KLQotRm9vJiBGb286Om9wZXJhdG9yPSAoY29uc3QgRm9vJiBmb28pCi17Ci0gIGZvciAoaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykKLSAgICBtZXNzYWdlW2tdID0gZm9vLm1lc3NhZ2Vba107Ci0gIHJldHVybiAqdGhpczsKLX0KLQotRm9vOjp+Rm9vICgpCi17Ci0gIGZvb3MtLTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyZWMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3JlYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTFkMzYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3JlYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotIyBUZXN0IGxpbmtpbmcgZGlyZWN0bHkgdG8gUy1yZWNvcmRzLgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLSMgUHVibGljIGRvbWFpbi4KLQotIyBHZXQgdGhlIG9mZnNldCBmcm9tIGFuIFMtcmVjb3JkIGxpbmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhLgotCi1wcm9jIHNyZWNfb2ZmIHsgbCB9IHsKLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTMSoiICRsXSB7Ci0JcmV0dXJuIDgKLSAgICB9IGVsc2UgeyBpZiBbc3RyaW5nIG1hdGNoICJTMioiICRsXSB7Ci0JcmV0dXJuIDEwCi0gICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiUzMqIiAkbF0gewotCXJldHVybiAxMgotICAgIH0gZWxzZSB7Ci0JcmV0dXJuIC0xCi0gICAgfSB9IH0KLX0KLQotIyBTZWUgaWYgYW4gUy1yZWNvcmQgbGluZSBjb250YWlucyBvbmx5IHplcm8gZGF0YS4KLQotcHJvYyBzcmVjX3plcm8geyBsIH0gewotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIlNcWzA3ODlcXSoiICRsXSB7Ci0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICAjIFN0cmlwIHRoZSBhZGRyZXNzIGFuZCBjaGVja3N1bS4KLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7Ci0Jc2V0IGwgW3N0cmluZyByYW5nZSAkbCBbc3JlY19vZmYgJGxdIFtleHByIFtzdHJpbmcgbGVuZ3RoICRsXSAtIDNdXQotICAgIH0gZWxzZSB7Ci0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICAjIFRoZSByZXN0IG11c3QgYmUgemVyby4KLSAgICByZXR1cm4gW3N0cmluZyBtYXRjaCAiIiBbc3RyaW5nIHRyaW0gJGwgIjAiXV0KLX0KLQotIyBHZXQgdGhlIGFkZHJlc3Mgb2YgYW4gUy1yZWNvcmQgbGluZS4KLQotcHJvYyBzcmVjX2FkZHIgeyBsIH0gewotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIlNcWzEyM1xdKiIgJGxdIHsKLQlzZXQgYWRkciBbc3RyaW5nIHJhbmdlICRsIDQgW2V4cHIgW3NyZWNfb2ZmICRsXSAtIDFdXQotICAgIH0gZWxzZSB7Ci0JcmV0dXJuIC0xCi0gICAgfQotCi0gICAgcmV0dXJuICIweCRhZGRyIgotfQotCi0jIEdldCB0aGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gYW4gUy1yZWNvcmQgbGluZS4KLQotcHJvYyBzcmVjX2xlbiB7IGwgfSB7Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIlNcWzEyM1xdKiIgJGxdIHsKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIHJldHVybiBbZXhwciAiMHhbc3RyaW5nIHJhbmdlICRsIDIgM10iIC0gKFtzcmVjX29mZiAkbF0gLSA0KSAvIDIgLSAxXQotfQotCi0jIEV4dHJhY3QgYnl0ZXMgZnJvbSBhbiBTLXJlY29yZCBsaW5lLgotCi1wcm9jIHNyZWNfZXh0cmFjdCB7IGwgc3RhcnQgbGVuIH0gewotICAgIHNldCBvZmYgW3NyZWNfb2ZmICRsXQotICAgIHNldCBybGVuIFtzcmVjX2xlbiAkbF0KLSAgICBzZXQgc3RvcCBbZXhwciAkc3RhcnQgKyAkbGVuXQotICAgIGlmIHsgJHN0b3AgPiAkcmxlbiB9IHsKLQlzZXQgc3RvcCBbZXhwciAkcmxlbl0KLSAgICB9Ci0gICAgc2V0IHN0YXJ0IFtleHByICRzdGFydCAqIDIgKyAkb2ZmXQotICAgIHNldCBzdG9wIFtleHByICRzdG9wICogMiArICRvZmYgLSAxXQotICAgIHJldHVybiBbc3RyaW5nIHJhbmdlICRsICRzdGFydCAkc3RvcF0KLX0KLQotIyBTZWUgaWYgYSByYW5nZSBvZiBieXRlcyBpbiBhbiBTLXJlY29yZCBsaW5lIGlzIGFsbCB6ZXJvZXMuCi0KLXByb2Mgc3JlY196ZXJvX3JhbmdlIHsgbCBzdGFydCBsZW4gfSB7Ci0gICAgcmV0dXJuIFtzdHJpbmcgbWF0Y2ggIiIgW3N0cmluZyB0cmltIFtzcmVjX2V4dHJhY3QgJGwgJHN0YXJ0ICRsZW5dICIwIl1dCi19Ci0KLSMgVHJpbSBhbiBTLXJlY29yZCBsaW5lIHN1Y2ggdGhhdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyByZW1haW4KLSMgYXQgdGhlIGVuZC4KLQotcHJvYyBzcmVjX3RyaW0geyBsIGxlYXZlIH0gewotICAgIHNldCBvZmYgW3NyZWNfb2ZmICRsXQotICAgIHNldCBhZGRyIFtzcmVjX2FkZHIgJGxdCi0gICAgc2V0IGxlbiBbc3JlY19sZW4gJGxdCi0KLSAgICBpZiB7ICRsZWF2ZSA+PSAkbGVuIH0gewotCXJldHVybiAkbAotICAgIH0KLQotICAgIHNldCBzMSBbc3RyaW5nIHJhbmdlICRsIDAgMV0KLSAgICBzZXQgczIgW2Zvcm1hdCAiJTAyeCIgW2V4cHIgKCRvZmYgLSA0KSAvIDIgKyAkbGVhdmUgKyAxXV0KLSAgICBzZXQgczMgW2Zvcm1hdCAiJTBbZXhwciAkb2ZmIC0gNF14IiBbZXhwciAkYWRkciArICRsZW4gLSAkbGVhdmVdXQotICAgIHNldCBzNCBbc3RyaW5nIHJhbmdlICRsIFtleHByIFtzdHJpbmcgbGVuZ3RoICRsXSAtICgkbGVhdmUgKiAyKSAtIDJdIGVuZF0KLSAgICBzZXQgcyAiJHtzMX0ke3MyfSR7czN9JHtzNH0iCi0KLSAgICB2ZXJib3NlICJzcmVjX3RyaW0geyAnJGwnICRsZWF2ZSB9IHJldHVybmluZyAnJHMnIiAyCi0KLSAgICByZXR1cm4gJHMKLX0KLQotIyBSZXBvcnQgZmFpbHVyZSB3aGVuIGNvbXBhcmluZyBTLXJlY29yZCBsaW5lcwotCi1wcm9jIHNyZWNfY29tcGFyZV9mYWlsIHsgd2hpY2ggbDEgbDIgfSB7Ci0gICAgc2VuZF9sb2cgImNvbXBhcmlzb24gZmFpbHVyZSAkd2hpY2g6XG4kbDFcbiRsMlxuIgotICAgIHZlcmJvc2UgImNvbXBhcmlzb24gZmFpbHVyZSAkd2hpY2g6XG4kbDFcbiRsMiIKLX0KLQotIyBDb21wYXJlIFMtcmVjb3JkIGZpbGVzLiAgV2UgZG9uJ3Qgd2FudCB0byBmdXNzIGFib3V0IHRoaW5ncyBsaWtlCi0jIGV4dHJhIHplcm9lcy4gIE5vdGUgdGhhdCBCRkQgYWx3YXlzIHNvcnRzIFMtcmVjb3JkcyBieSBhZGRyZXNzLgotCi1wcm9jIHNyZWNfY29tcGFyZSB7IGYxIGYyIH0gewotICAgIHNldCBlMSBbZ2V0cyAkZjEgbDFdCi0gICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KLQotICAgIHdoaWxlIHsgJGUxICE9IC0xIH0gewotCXNldCBsMSBbc3RyaW5nIHRyaW1yaWdodCAkbDEgIlxyXG4iXQotCXNldCBsMiBbc3RyaW5nIHRyaW1yaWdodCAkbDIgIlxyXG4iXQotCWlmIHsgJGUyID09IC0xIH0gewotCSAgICAjIElmIGwxIGNvbnRhaW5zIGRhdGEsIGl0IG11c3QgYmUgemVyby4KLQkgICAgaWYgIVtzcmVjX3plcm8gJGwxXSB7Ci0JCXNlbmRfbG9nICJkYXRhIGFmdGVyIEVPRjogJGwxXG4iCi0JCXZlcmJvc2UgImRhdGEgYWZ0ZXIgRU9GOiAkbDEiCi0JCXJldHVybiAwCi0JICAgIH0KLQl9IGVsc2UgeyBpZiB7IFtzdHJpbmcgY29tcGFyZSAkbDEgJGwyXSA9PSAwIH0gewotCSAgICBzZXQgZTEgW2dldHMgJGYxIGwxXQotCSAgICBzZXQgZTIgW2dldHMgJGYyIGwyXQotCX0gZWxzZSB7IGlmIHsgW3NyZWNfemVybyAkbDFdIH0gewotCSAgICBzZXQgZTEgW2dldHMgJGYxIGwxXQotCX0gZWxzZSB7IGlmIHsgW3NyZWNfemVybyAkbDJdIH0gewotCSAgICBzZXQgZTIgW2dldHMgJGYyIGwyXQotCX0gZWxzZSB7Ci0JICAgICMgVGhlIHN0cmluZ3MgYXJlIG5vdCB0aGUgc2FtZSwgYW5kIG5laXRoZXIgaXMgYWxsIHplcm9lcy4KLQkgICAgc2V0IGExIFtzcmVjX2FkZHIgJGwxXQotCSAgICBzZXQgbjEgW3NyZWNfbGVuICRsMV0KLQkgICAgc2V0IGEyIFtzcmVjX2FkZHIgJGwyXQotCSAgICBzZXQgbjIgW3NyZWNfbGVuICRsMl0KLQotCSAgICBpZiB7ICRhMSA8ICRhMiAmJiAhW3NyZWNfemVyb19yYW5nZSAkbDEgMCBbZXhwciAkYTIgLSAkYTFdXSB9IHsKLQkJdmVyYm9zZSAiJGExICRhMiBbc3JlY19leHRyYWN0ICRsMSAwIFtleHByICRhMiAtICRhMV1dIiAyCi0JCXNyZWNfY29tcGFyZV9mYWlsIDEgJGwxICRsMgotCQlyZXR1cm4gMAotCSAgICB9Ci0JICAgIGlmIHsgJGEyIDwgJGExICYmICFbc3JlY196ZXJvX3JhbmdlICRsMiAwIFtleHByICRhMSAtICRhMl1dIH0gewotCQlzcmVjX2NvbXBhcmVfZmFpbCAyICRsMSAkbDIKLQkJcmV0dXJuIDAKLQkgICAgfQotCi0JICAgICMgSGVyZSB3ZSBrbm93IHRoYXQgYW55IGluaXRpYWwgZGF0YSBpbiBib3RoIGxpbmVzIGlzCi0JICAgICMgemVyby4gIE5vdyBtYWtlIHN1cmUgdGhhdCBhbnkgb3ZlcmxhcHBpbmcgZGF0YSBtYXRjaGVzLgotCSAgICBpZiB7ICRhMSA8ICRhMiB9IHsKLQkJc2V0IG9zMSBbZXhwciAkYTIgLSAkYTFdCi0JCXNldCBvczIgMAotCSAgICB9IGVsc2UgewotCQlzZXQgb3MxIDAKLQkJc2V0IG9zMiBbZXhwciAkYTEgLSAkYTJdCi0JICAgIH0KLQkgICAgaWYgeyAkYTEgKyAkbjEgPCAkYTIgKyAkbjIgfSB7Ci0JCXNldCBvbCBbZXhwciAkbjEgLSAkb3MxXQotCSAgICB9IGVsc2UgewotCQlzZXQgb2wgW2V4cHIgJG4yIC0gJG9zMl0KLQkgICAgfQotCi0JICAgIHNldCB4MSBbc3JlY19leHRyYWN0ICRsMSAkb3MxICRvbF0KLQkgICAgc2V0IHgyIFtzcmVjX2V4dHJhY3QgJGwyICRvczIgJG9sXQotCSAgICBpZiB7IFtzdHJpbmcgY29tcGFyZSAkeDEgJHgyXSAhPSAwIH0gewotCQl2ZXJib3NlICIkb3MxICRvbCAkeDEiIDIKLQkJdmVyYm9zZSAiJG9zMiAkb2wgJHgyIiAyCi0JCXNyZWNfY29tcGFyZV9mYWlsIDMgJGwxICRsMgotCQlyZXR1cm4gMAotCSAgICB9Ci0KLQkgICAgIyBUaGVzZSBzdHJpbmdzIG1hdGNoLiAgVHJpbSB0aGUgZGF0YSBmcm9tIHRoZSBsYXJnZXIKLQkgICAgIyBzdHJpbmcsIHJlYWQgYSBuZXcgY29weSBvZiB0aGUgc21hbGxlciBzdHJpbmcsIGFuZAotCSAgICAjIGNvbnRpbnVlLgotCSAgICBpZiB7ICRhMSArICRuMSA8ICRhMiArICRuMiB9IHsKLQkJc2V0IGwyIFtzcmVjX3RyaW0gJGwyIFtleHByICgkYTIgKyAkbjIpIC0gKCRhMSArICRuMSldXQotCQlzZXQgZTEgW2dldHMgJGYxIGwxXQotCSAgICB9IGVsc2UgeyBpZiB7ICRhMSArICRuMSA+ICRhMiArICRuMiB9IHsKLQkJc2V0IGwxIFtzcmVjX3RyaW0gJGwxIFtleHByICgkYTEgKyAkbjEpIC0gKCRhMiArICRuMildXQotCQlzZXQgZTIgW2dldHMgJGYyIGwyXQotCSAgICB9IGVsc2UgewotCQlzZXQgZTEgW2dldHMgJGYxIGwxXQotCQlzZXQgZTIgW2dldHMgJGYyIGwyXQotCSAgICB9IH0KLQl9IH0gfSB9Ci0gICAgfQotCi0gICAgIyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGZpbGUuICBUaGUgcmVtYWluZGVyIG9mIHRoZQotICAgICMgc2Vjb25kIGZpbGUgbXVzdCBjb250YWluIG9ubHkgemVyb2VzLgotICAgIHdoaWxlIHsgJGUyICE9IC0xIH0gewotCXNldCBsMiBbc3RyaW5nIHRyaW1yaWdodCAkbDIgIlxyXG4iXQotCWlmICFbc3JlY196ZXJvICRsMl0gewotCSAgICBzZW5kX2xvZyAiZGF0YSBhZnRlciBFT0Y6ICRsMlxuIgotCSAgICB2ZXJib3NlICJkYXRhIGFmdGVyIEVPRjogJGwyIgotCSAgICByZXR1cm4gMAotCX0KLQlzZXQgZTIgW2dldHMgJGYyIGwyXQotICAgIH0KLQotICAgIHJldHVybiAxCi19Ci0KLSMgTGluayB0d2ljZSwgb2JqY29weSwgYW5kIGNvbXBhcmUKLQotcHJvYyBydW5fc3JlY190ZXN0IHsgdGVzdCBvYmpzIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBvYmpjb3B5Ci0gICAgZ2xvYmFsIHNpemVvZl9oZWFkZXJzCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgc2V0IGZsYWdzICIiCi0KLSAgICAjIElmIHRoZSBsaW5rZXIgc2NyaXB0IHVzZXMgU0laRU9GX0hFQURFUlMsIHVzZSBhIC1UdGV4dCBhcmd1bWVudAotICAgICMgdG8gZm9yY2UgYm90aCB0aGUgbm9ybWFsIGxpbmsgYW5kIHRoZSBTLXJlY29yZCBsaW5rIHRvIGJlIHB1dCBpbgotICAgICMgdGhlIHNhbWUgcGxhY2UuICBXZSBkb24ndCBhbHdheXMgdXNlIC1UdGV4dCBiZWNhdXNlIGl0IGludGVyYWN0cwotICAgICMgcG9vcmx5IHdpdGggYS5vdXQuCi0KLSAgICBpZiB7ICRzaXplb2ZfaGVhZGVycyB9IHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtVHRleHQgMHgxMDAwIgotICAgIH0KLQotICAgICMgVGhlIGEyOWsgY29tcGlsZWQgY29kZSBjYWxscyBWX1NQSUxMIGFuZCBWX0ZJTEwuICBTaW5jZSB3ZSBkb24ndAotICAgICMgbmVlZCB0byBydW4gdGhpcyBjb2RlLCBidXQgd2UgZG9uJ3QgaGF2ZSBkZWZpbml0aW9ucyBmb3IgdGhvc2UKLSAgICAjIGZ1bmN0aW9ucywgd2UganVzdCBkZWZpbmUgdGhlbSBvdXQuCi0gICAgaWYgW2lzdGFyZ2V0IGEyOWsqLSotKl0gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIFZfU1BJTEw9MCAtLWRlZnN5bSBWX0ZJTEw9MCIKLSAgICB9Ci0KLSAgICAjIEFSTSB0YXJnZXRzIGNhbGwgX19nY2NtYWluCi0gICAgaWYgW2lzdGFyZ2V0IGFybS0qLSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBfX19nY2NtYWluPTAiCi0gICAgfQotICAgIAotICAgIGlmIFtpc3RhcmdldCBzdHJvbmdhcm0tKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19nY2NtYWluPTAiCi0gICAgfQotICAgIAotICAgICMgVGh1bWIgdGFyZ2V0cyBjYWxsIF9fZ2NjbWFpbgotICAgIGlmIFtpc3RhcmdldCB0aHVtYi0qLSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBfX19nY2NtYWluPTAiCi0gICAgfQotCi0gICAgIyBQb3dlclBDIEVBQkkgY29kZSBjYWxscyBfX2VhYmkuCi0gICAgaWYgW2lzdGFyZ2V0IHBvd2VycGMqLSotZWFiaSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBfX2VhYmk9MCIKLSAgICB9Ci0KLSAgICAjIG1uMTAyMDAgY29kZSBjYWxscyBfX3RydW5jc2lwc2kyX2QwX2QyLgotICAgIGlmIHtbaXN0YXJnZXQgbW4xMDIwMCotKi0qXX0gdGhlbiB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX190cnVuY3NpcHNpMl9kMF9kMj0wIgotICAgIH0KLQotICAgICMgVjg1MCB0YXJnZXRzIG5lZWQgbGliZ2NjLmEKLSAgICBpZiBbaXN0YXJnZXQgdjg1MCotKi1lbGZdIHsKLQlzZXQgb2JqcyAiJG9ianMgLUwgLi4vZ2NjIC1sZ2NjIgotICAgIH0KLSAgICAKLSAgICBpZiB7ICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zcjEgIiRmbGFncyAkb2JqcyJdIFwKLQkgfHwgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NyMi5zciAiJGZsYWdzIC1vZm9ybWF0IHNyZWMgJG9ianMiXSB9IHsKLQlzZXR1cF94ZmFpbCAiaHBwYSotKi0qZWxmKiIKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgc2VuZF9sb2cgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyXG4iCi0gICAgdmVyYm9zZSAiJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc3IxIHRtcGRpci9zcjEuc3IiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc3IxIHRtcGRpci9zcjEuc3IiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQl1bnJlc29sdmVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGYxIFtvcGVuIHRtcGRpci9zcjEuc3Igcl0KLSAgICBzZXQgZjIgW29wZW4gdG1wZGlyL3NyMi5zciByXQotICAgIGlmIFtzcmVjX2NvbXBhcmUgJGYxICRmMl0gewotCXBhc3MgJHRlc3QKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3QKLSAgICB9Ci0gICAgY2xvc2UgJGYxCi0gICAgY2xvc2UgJGYyCi19Ci0KLXNldCB0ZXN0MSAiUy1yZWNvcmRzIgotc2V0IHRlc3QyICJTLXJlY29yZHMgd2l0aCBjb25zdHJ1Y3RvcnMiCi0KLSMgU2VlIHdoZXRoZXIgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdCB1c2VzIFNJWkVPRl9IRUFERVJTLgotY2F0Y2ggImV4ZWMgJGxkIC0tdmVyYm9zZSIgZXhlY19vdXRwdXQKLXNldCBzaXplb2ZfaGVhZGVycyBbc3RyaW5nIG1hdGNoICIqU0laRU9GX0hFQURFUlMqIiAkZXhlY19vdXRwdXRdCi0KLSMgRmlyc3QgdGVzdCBsaW5raW5nIGEgQyBwcm9ncmFtLiAgV2UgZG9uJ3QgcmVxdWlyZSBhbnkgbGlicmFyaWVzLiAgV2UKLSMgbGluayBpdCBub3JtYWxseSwgYW5kIG9iamNvcHkgdG8gdGhlIFMtcmVjb3JkIGZvcm1hdCwgYW5kIHRoZW4gbGluawotIyBkaXJlY3RseSB0byB0aGUgUy1yZWNvcmQgZm9ybWF0LCBhbmQgcmVxdWlyZSB0aGF0IHRoZSB0d28gZmlsZXMKLSMgY29udGFpbiB0aGUgc2FtZSBkYXRhLgotCi1pZiB7IFt3aGljaCAkQ0NdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3QxCi0gICAgdW50ZXN0ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLWlmIHsgIVtsZF9jb21waWxlICRDQyAkc3JjZGlyLyRzdWJkaXIvc3IxLmMgdG1wZGlyL3NyMS5vXSBcCi0gICAgIHx8ICFbbGRfY29tcGlsZSAkQ0MgJHNyY2Rpci8kc3ViZGlyL3NyMi5jIHRtcGRpci9zcjIub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi0jIFRoZSBpMzg2LWFvdXQgdGFyZ2V0IGlzIGNvbmZ1c2VkOiB0aGUgbGlua2VyIGRvZXMgbm90IHB1dCB0aGUKLSMgc2VjdGlvbnMgd2hlcmUgb2JqZHVtcCBmaW5kcyB0aGVtLiAgSSBkb24ndCBrbm93IHdoaWNoIGlzIHdyb25nLgotc2V0dXBfeGZhaWwgImkqODYtKi1hb3V0KiIKLQotIyBUaGVzZSB0ZXN0cyBmYWlsIG9uIHRoZSBuYXRpdmUgTUlQUyBFTEYgdGFyZ2V0cyBiZWNhdXNlIHRoZSBHUCB2YWx1ZQotIyBpbiB0aGUgLnJlZ2luZm8gc2VjdGlvbiBpcyBub3QgdXBkYXRlZCB3aGVuIHRoZSBTLXJlY29yZCB2ZXJzaW9uIGlzCi0jIHdyaXR0ZW4gb3V0LiAgVGhlIG1pcHMtZWxmIHRhcmdldCBpdHNlbGYgZG9lcyBub3QgdXNlIGEgLnJlZ2luZm8gc2VjdGlvbi4KLXNldHVwX3hmYWlsICJtaXBzKi0qLWlyaXg1KiIgIm1pcHMqLSotaXJpeDYqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBkbyB0aGUgbWFnaWMgVE9DIGhhbmRsaW5nIHRoYXQgWENPRkYKLSMgbGlua2VycyBkby4KLXNldHVwX3hmYWlsICIqLSotYWl4KiIgIiotKi14Y29mZioiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGJ1aWxkIEFSTS9UaHVtYiBzdHVicy4KLXNldHVwX3hmYWlsICJhcm0tKi1jb2ZmIgotc2V0dXBfeGZhaWwgInN0cm9uZ2FybS0qLSoiCi1zZXR1cF94ZmFpbCAiYXJtLSotcGUqIgotIyBzZXR1cF94ZmFpbCAiYXJtLSplbGYqIgotc2V0dXBfeGZhaWwgInRodW1iLSotY29mZioiCi1zZXR1cF94ZmFpbCAidGh1bWItKi1wZSoiCi1zZXR1cF94ZmFpbCAidGh1bWItKi1lbGYqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBidWlsZCBzcGVjaWFsIEVBQkkgc2VjdGlvbnMuCi1zZXR1cF94ZmFpbCAicG93ZXJwYyotKi1lYWJpKiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgaW5jbHVkZSB0aGUgLnt6ZGF9IHNlY3Rpb25zLgotc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBoYW5kbGUgQWxwaGEgRWxmIHJlbGF4YXRpb24uCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotZWxmKiIgImFscGhhKi0qLWxpbnV4LWdudSoiICJhbHBoYSotKi1nbnUqIgotc2V0dXBfeGZhaWwgImFscGhhKi0qLW5ldGJzZCoiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHNwZWNpYWwgUEUgaGVhZGVycyAtIHRoZSBQRQotIyBlbXVsYXRpb24gdHJpZXMgdG8gd3JpdGUgcGUtc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdGhlIFBFIGhlYWRlcnMKLSMgaW4gdGhlIG91dHB1dCBiZmQsIGJ1dCBpdCdzIG5vdCBhIFBFIGJmZCAoaXQncyBhbiBzcmVjIGJmZCkKLXNldHVwX3hmYWlsICIqLSotY3lnd2luKiIgIiotKi1taW5ndyoiICIqLSotcGUqIiAiKi0qLXdpbm50KiIKLQotcnVuX3NyZWNfdGVzdCAkdGVzdDEgInRtcGRpci9zcjEubyB0bXBkaXIvc3IyLm8iCi0KLSMgTm93IHRyeSBsaW5raW5nIGEgQysrIHByb2dyYW0gd2l0aCBnbG9iYWwgY29uc3RydWN0b3JzIGFuZAotIyBkZXN0cnVjdG9ycy4gIE5vdGUgdGhhdCBzaW5jZSB3ZSBhcmUgbm90IGxpbmtpbmcgYWdhaW5zdCBhbnkKLSMgbGlicmFyaWVzLCB0aGlzIHByb2dyYW0gd29uJ3QgYWN0dWFsbHkgd29yayBvciBhbnl0aGluZy4KLQotaWYgeyBbd2hpY2ggJENYWF0gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9zcjMuY2MgdG1wZGlyL3NyMy5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotIyBTZWUgYWJvdmUuCi1zZXR1cF94ZmFpbCAiaSo4Ni0qLWFvdXQqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotaXJpeDUqIiAibWlwcyotKi1pcml4NioiCi1zZXR1cF94ZmFpbCAiKi0qLWFpeCoiICIqLSoteGNvZmYqIgotc2V0dXBfeGZhaWwgImFybS0qLSoiCi1zZXR1cF94ZmFpbCAic3Ryb25nYXJtLSotKiIKLXNldHVwX3hmYWlsICJ0aHVtYi0qLSoiCi1zZXR1cF94ZmFpbCAicG93ZXJwYyotKi1lYWJpKiIKLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLXNldHVwX3hmYWlsICJhbHBoYSotKi1lbGYqIiAiYWxwaGEqLSotbGludXgtZ251KiIgImFscGhhKi0qLWdudSoiCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotbmV0YnNkKiIKLXNldHVwX3hmYWlsICIqLSotY3lnd2luKiIgIiotKi1taW5ndyoiICIqLSotcGUqIiAiKi0qLXdpbm50KiIKLQotcnVuX3NyZWNfdGVzdCAkdGVzdDIgInRtcGRpci9zcjMubyIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmMgYi9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhZWM2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdXNlZCB0byB0ZXN0IHRoZSBsaW5rZXIncyByZXBvcnRpbmcgb2YgdW5kZWZpbmVkCi0gICBzeW1ib2xzLiAgKi8KLQotZXh0ZXJuIGludCB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkICgpOwotCi1pbnQKLWZ1bmN0aW9uICgpCi17Ci0gIHJldHVybiB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDI1ZTAyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jIFRlc3QgdGhhdCB0aGUgbGlua2VyIHJlcG9ydHMgdW5kZWZpbmVkIHN5bWJvbCBlcnJvcnMgY29ycmVjdGx5LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotIwotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1zZXQgdGVzdHVuZCAidW5kZWZpbmVkIgotc2V0IHRlc3RmbiAidW5kZWZpbmVkIGZ1bmN0aW9uIgotc2V0IHRlc3RsaW5lICJ1bmRlZmluZWQgbGluZSIKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHZlcmJvc2UgIkNvdWxkIG5vdCBmaW5kIEMgY29tcGlsZXIhIiAxCi0gICAgdW50ZXN0ZWQgJHRlc3R1bmQKLSAgICB1bnRlc3RlZCAkdGVzdGZuCi0gICAgdW50ZXN0ZWQgJHRlc3RsaW5lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfY29tcGlsZSAiJENDIC1nIiAkc3JjZGlyLyRzdWJkaXIvdW5kZWZpbmVkLmMgdG1wZGlyL3VuZGVmaW5lZC5vXSB7Ci0gICAgdmVyYm9zZSAiVW5hYmxlIHRvIGNvbXBpbGUgdGVzdCBmaWxlISIgMQotICAgIHVucmVzb2x2ZWQgJHRlc3R1bmQKLSAgICB1bnJlc29sdmVkICR0ZXN0Zm4KLSAgICB1bnJlc29sdmVkICR0ZXN0bGluZQotICAgIHJldHVybgotfQotCi1jYXRjaCAiZXhlYyBybSAtZiB0bXBkaXIvdW5kZWZpbmVkIiBleGVjX291dHB1dAotCi0jIFVzaW5nIC1lIHN0YXJ0IHByZXZlbnRzIHRoZSBTdW5PUyBsaW5rZXIgZnJvbSB0cnlpbmcgdG8gYnVpbGQgYQotIyBzaGFyZWQgbGlicmFyeS4KLXNlbmRfbG9nICIkbGQgLWUgc3RhcnQgLW8gdG1wZGlyL3VuZGVmaW5lZCB0bXBkaXIvdW5kZWZpbmVkLm9cbiIKLXZlcmJvc2UgIiRsZCAtZSBzdGFydCAtbyB0bXBkaXIvdW5kZWZpbmVkIHRtcGRpci91bmRlZmluZWQubyIKLQotY2F0Y2ggImV4ZWMgJGxkIC1lIHN0YXJ0IC1vIHRtcGRpci91bmRlZmluZWQgdG1wZGlyL3VuZGVmaW5lZC5vIiBleGVjX291dHB1dAotc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCi1wcm9jIGNoZWNrdW5kIHsgc3RyaW5nIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBleGVjX291dHB1dAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiKiRzdHJpbmcqIiAkZXhlY19vdXRwdXRdIHsKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19Ci0KLXNldCBtdSAidW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCciCi1jaGVja3VuZCAkbXUgJHRlc3R1bmQKLQotIyBBUk0gUEUgZGVmYXVsdHMgdG8gdXNpbmcgc3RhYnMgZGVidWdnaW5nLCB3aGljaCB3ZSBjYW4ndCBoYW5kbGUgZm9yCi0jIGEgQ09GRiBmaWxlLgotI3NldHVwX3hmYWlsICJhcm0qLSotcGUqIgotI3NldHVwX3hmYWlsICJ0aHVtYiotKi1wZSoiCi0KLSMgSnVzdCBkb2Vzbid0IHdvcmsgZm9yIFBBIEVMRi4gIE5vIGNsdWUgd2h5Lgotc2V0dXBfeGZhaWwgImhwcGEqLSotKmVsZioiCi0KLXNldCBtZiAidG1wZGlyL3VuZGVmaW5lZC5vOiBJbiBmdW5jdGlvbiBgZnVuY3Rpb24nOiIKLWNoZWNrdW5kICRtZiAkdGVzdGZuCi0KLSMgQ09GRiBTSCBnZXRzIHRoaXMgdGVzdCB3cm9uZy0taXQgcmVwb3J0cyBsaW5lIDEwLCBiZWNhdXNlIGFsdGhvdWdoCi0jIHRoZSBqdW1wIGlzIGF0IGxpbmUgOSwgdGhlIGZ1bmN0aW9uIGFkZHJlc3MsIGFuZCB0aGUgcmVsb2MsIGlzCi0jIHN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KLXNldHVwX3hmYWlsICJzaC0qLSoiCi0KLSMgQVJNIFBFIGRlZmF1bHRzIHRvIHVzaW5nIHN0YWJzIGRlYnVnZ2luZywgd2hpY2ggd2UgY2FuJ3QgaGFuZGxlIGZvcgotIyBhIENPRkYgZmlsZS4KLSNzZXR1cF94ZmFpbCAiYXJtKi0qLXBlKiIKLSNzZXR1cF94ZmFpbCAidGh1bWIqLSotcGUqIgotCi0jIEp1c3QgZG9lc24ndCB3b3JrIGZvciBQQSBFTEYuICBObyBjbHVlIHdoeS4KLXNldHVwX3hmYWlsICJocHBhKi0qLSplbGYqIgotCi1zZXQgbWwgInVuZGVmaW5lZC5jOjk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnIgotIyBXaXRoIHRhcmdldHMgdGhhdCB1c2UgZWxmL2R3YXJmMiwgc3VjaCBhcyB0aGUgYXJtLWVsZiBhbmQgdGh1bWItZWxmCi0jIHRvb2xjaGFpbnMsIHRoZSBjb2RlIGluIGJmZC9lbGYuYzpfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSgpIGlzIGNhbGxlZAotIyBpbiBvcmRlciB0byBsb2NhdGUgdGhlIGZpbGUgbmFtZS9saW5lIG51bWJlciB3aGVyZSB0aGUgdW5kZWZpbmVkCi0jIHJlZmVyZW5jZSBvY2N1cnMuICBVbmZvcnR1bmF0ZWx5IHRoaXMgdHJpZXMgdG8gdXNlIHRoZSBkd2FyZjIgZGVidWcKLSMgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gIFRoaXMgc2VjdGlvbiBjb250YWlucyBhIHNlcmllcwotIyBvZiBjb21wX3VuaXQgc3RydWN0dXJlcywgZWFjaCBvZiB3aGljaCBoYXMgYSBsb3cvaGlnaCBhZGRyZXNzIHJhbmdlCi0jIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiBtZW1vcnkgbG9jYXRpb25zIGNvdmVyZWQgYnkgdGhhdCBzdHJ1Y3R1cmUuICBUaGUKLSMgc3RydWN0dXJlcyBhbHNvIGluZGV4IGludG8gb3RoZXIgc3RydWN0dXJlcyBoZWxkIGluIHRoZSAuZGVidWdfbGluZSBzZWN0aW9uCi0jIGFuZCB0b2dldGhlciB0aGV5IGNhbiB0cmFuc2xhdGUgbWVtb3J5IGxvY2F0aW9ucyBiYWNrIGludG8gZmlsZS9mdW5jdGlvbi9saW5lCi0jIG51bWJlciBhZGRyZXNzZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiAgU2luY2UgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkKLSMgcmVnaW9uIGNvdmVyZWQgYnkgYSBjb21wX3VuaXQgaXMgb25seSBkZXRlcm1pbmVkIGF0IGxpbmsgdGltZSwgdGhlIGxvdy9oaWdoCi0jIGFkZHJlc3NlcyBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBhbmQgdGhlIGxpbmUgYWRkcmVzc2VzIGluIHRoZSAuZGVidWdfbGluZQotIyBzZWN0aW9uIGFyZSBjb21wdXRlZCBieSBnZW5lcmF0aW5nIHJlbG9jcyBhZ2FpbnN0IGtub3duIHN5bWJvbHMgaW4gdGhlIG9iamVjdAotIyBjb2RlLgotIwotIyBXaGVuIHRoZSB1bmRlZmluZWQgcmVmZXJlbmNlIGlzIGRldGVjdGVkLCB0aGUgcmVsb2NzIGluIHRoZSBkd2FyZjIKLSMgZGVidWcgc2VjdGlvbnMgaGF2ZSBub3QgeWV0IGJlZW4gcmVzb2x2ZWQsIHNvIHRoZSBsb3cvaGlnaCBhZGRyZXNzZXMgYW5kIHRoZQotIyBsaW5lIG51bWJlciBhZGRyZXNzIGFyZSBhbGwgc2V0IGF0IHplcm8uICBUaHVzIHdoZW4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUoKQotIyBjYWxscyBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSgpIG5vIGNvbXBfdW5pdCBjYW4gYmUgZm91bmQgd2hpY2gKLSMgYWN0dWFsbHkgY292ZXJzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSByZWZlcmVuY2Ugb2NjdXJlZCwgYW5kIHNvCi0jIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKCkgZmFpbHMuCi0jCi0jIFRoZSB1cHNob3Qgb2YgYWxsIG9mIHRoaXMsIGlzIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlCi0jIGxpbmtlciwgaW5zdGVhZCBvZiBoYXZpbmcgYSBzb3VyY2UgZmlsZSBuYW1lICYgbGluZSBudW1iZXIgYXMgaW46Ci0jCi0jICAgdW5kZWZpbmVkLmM6OTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCcKLSMKLSMgaGFzIGFuIG9iamVjdCBmaWxlICYgc2VjdGlvbiBhZGRyZXNzIGluc3RlYWQ6Ci0jCi0jICAgdW5kZWZpbmVkLjAoLnRleHQrMHhjKTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCcKLSMKLSMgaGVuY2UgdGhlIHhmYWlscyBiZWxvdy4KLQotc2V0dXBfeGZhaWwgYXJtLSotZWxmCi1zZXR1cF94ZmFpbCBzdHJvbmdhcm0tKi1lbGYKLXNldHVwX3hmYWlsIHRodW1iLSotZWxmCi1zZXR1cF94ZmFpbCBtY29yZS0qLWVsZgotCi1jaGVja3VuZCAkbWwgJHRlc3RsaW5lCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMS5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0xLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDcwZDgwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0xLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMi5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0ZGM1OS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMi5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5sZCBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5sZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1YzRlMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEubGQKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotT1VUUFVUX0ZPUk1BVCgic3JlYyIpCi1TRUNUSU9OUwotewotCi0KLS50ZXh0IDAgOiB7ICooIjkiKSAqKCIxMCIpICooIjExIikgKigiMTIiKSAqKCIxMyIpICooIjE0IikgKigiMTUiKQotCQkqKCI3IikgKigiOCIpICooIjAiKSAqKCIxIikgKigiMiIpICooIjMiKSAqKCI0IikgfQotLmJzcyAoTk9MT0FEKSAgOiB7ICAqKCI1IikgKigiNiIpIH0KLQotLlBBRkkgICAgPTB4MDAwMDAwNTAgOwotLlBDSElPICAgPTB4MDAwMDAwRDAgOwotLlBDTE8gICAgPTB4MDAwMDAwNTQgOwotLlBDVkJTViAgPTB4MDAwMDAwMEUgOwotLlBDVlRTVSAgPTB4MDAwMDAwMTIgOwotLlBDVlRTViAgPTB4MDAwMDAwMTYgOwotLlBDVlRTVkwgPTB4MDAwMDAwMUEgOwotLlBDVlRVUyAgPTB4MDAwMDAwMUUgOwotLlBESVMgICAgPTB4MDAwMDAwMjIgOwotLlBESVNMICAgPTB4MDAwMDAwMjYgOwotLlBEVkogICAgPTB4MDAwMDAwMkEgOwotLlBFSU8gICAgPTB4MDAwMDAwQ0MgOwotLlBFT0YgICAgPTB4MDAwMDAwNTggOwotLlBFT0wgICAgPTB4MDAwMDAwNUMgOwotLlBFUVVTICAgPTB4MDAwMDAwMkUgOwotLlBFUVVWICAgPTB4MDAwMDAwMzIgOwotLlBFUVVWTCAgPTB4MDAwMDAwMzYgOwotLlBFUVVXICAgPTB4MDAwMDAwREUgOwotLlBHQ00gICAgPTB4MDAwMDAwNjQgOwotLlBHRVFTICAgPTB4MDAwMDAwM0EgOwotLlBHRVFWICAgPTB4MDAwMDAwM0UgOwotLlBHRVFWTCAgPTB4MDAwMDAwNDIgOwotLlBHRVQgICAgPTB4MDAwMDAwNjAgOwotLlBHUlRTICAgPTB4MDAwMDAwNDYgOwotLlBHUlRWICAgPTB4MDAwMDAwNEEgOwotLlBHUlRWTCAgPTB4MDAwMDAwNEUgOwotLlBJQUNUICAgPTB4MDAwMDAwNkMgOwotLlBJRkQgICAgPTB4MDAwMDAwNjggOwotLlBJTkRTICAgPTB4MDAwMDAwNTIgOwotLlBJTkRWICAgPTB4MDAwMDAwNTYgOwotLlBJTkRWTCAgPTB4MDAwMDAwNUEgOwotLlBJTkRXICAgPTB4MDAwMDAwRDYgOwotLlBMRENTICAgPTB4MDAwMDAwNUUgOwotLlBMRENWICAgPTB4MDAwMDAwNjIgOwotLlBMRVFTICAgPTB4MDAwMDAwNjYgOwotLlBMRVFWICAgPTB4MDAwMDAwNkEgOwotLlBMRVFWTCAgPTB4MDAwMDAwNkUgOwotLlBMRVNTICAgPTB4MDAwMDAwNzIgOwotLlBMRVNWICAgPTB4MDAwMDAwNzYgOwotLlBMRVNWTCAgPTB4MDAwMDAwN0EgOwotLlBMT0RTICAgPTB4MDAwMDAwN0UgOwotLlBMT0RWICAgPTB4MDAwMDAwODIgOwotLlBMT0RWTCAgPTB4MDAwMDAwODYgOwotLlBNT0RKICAgPTB4MDAwMDAwOEEgOwotLlBNT1YgICAgPTB4MDAwMDAwRTIgOwotLlBNUEogICAgPTB4MDAwMDAwOEUgOwotLlBORVFTICAgPTB4MDAwMDAwOTIgOwotLlBORVFWICAgPTB4MDAwMDAwOTYgOwotLlBORVFWTCAgPTB4MDAwMDAwOUEgOwotLlBORVFXICAgPTB4MDAwMDAwREEgOwotLlBQQUdFICAgPTB4MDAwMDAwRDQgOwotLlBQRUUgICAgPTB4MDAwMDAwNzAgOwotLlBQVVQgICAgPTB4MDAwMDAwNzQgOwotLlBSREIgICAgPTB4MDAwMDAwNzggOwotLlBSREMgICAgPTB4MDAwMDAwN0MgOwotLlBSREggICAgPTB4MDAwMDAwODAgOwotLlBSREkgICAgPTB4MDAwMDAwODQgOwotLlBSREogICAgPTB4MDAwMDAwODggOwotLlBSRFJTICAgPTB4MDAwMDAwQzggOwotLlBSRFMgICAgPTB4MDAwMDAwOEMgOwotLlBSRFYgICAgPTB4MDAwMDAwOTAgOwotLlBSTE4gICAgPTB4MDAwMDAwOTQgOwotLlBSUkFOICAgPTB4MDAwMDAwOTggOwotLlBSU1QgICAgPTB4MDAwMDAwOUMgOwotLlBSV1QgICAgPTB4MDAwMDAwQTAgOwotLlBTQ09OICAgPTB4MDAwMDAwOUUgOwotLlBTQ09QICAgPTB4MDAwMDAwQTIgOwotLlBTREVMICAgPTB4MDAwMDAwQTYgOwotLlBTSU5TICAgPTB4MDAwMDAwQUEgOwotLlBTTEVOICAgPTB4MDAwMDAwQUUgOwotLlBTUE9TICAgPTB4MDAwMDAwQjIgOwotLlBTVENWICAgPTB4MDAwMDAwQjYgOwotLlBTVENWTCAgPTB4MDAwMDAwQkEgOwotLlBTVE9TICAgPTB4MDAwMDAwQkUgOwotLlBTVE9WICAgPTB4MDAwMDAwQzIgOwotLlBTVE9WTCAgPTB4MDAwMDAwQzYgOwotLlBTVFJTICAgPTB4MDAwMDAwQ0EgOwotLlBTVFJWICAgPTB4MDAwMDAwQ0UgOwotLlBTVFJWTCAgPTB4MDAwMDAwRDIgOwotLlBXTE4gICAgPTB4MDAwMDAwQTQgOwotLlBXUkFOICAgPTB4MDAwMDAwQTggOwotLlBXUkIgICAgPTB4MDAwMDAwQUMgOwotLlBXUkMgICAgPTB4MDAwMDAwQjAgOwotLlBXUkggICAgPTB4MDAwMDAwQjQgOwotLlBXUkkgICAgPTB4MDAwMDAwQjggOwotLlBXUkogICAgPTB4MDAwMDAwQkMgOwotLlBXUlMgICAgPTB4MDAwMDAwQzAgOwotLlBXUlYgICAgPTB4MDAwMDAwQzQgOwotCi0vKgotLlBBRkk9MHggICA9IDB4MDA7Ci0uUENISU8gICA9MHggMHgwMDAwMDA7Ci0uUENMTyAgICA9MHggNjQgOwotLlBDOwotLlBDVlRTVSAgPTB4IDB4MDAwMDAwOwotLlBDVlRTViAgPTB4IDB4MDAwMDAwOwotLlBDVlRTVkwgPTB4IDB4MDAwMDAwOwotLlBDVlRVUyAgPTB4IDE1OCA7Ci0uUDsKLS5QRElTTCAgID0weCAweDAwMDAwMDsKLS5QRFZKICAgID0weCAweDAwMDAwMDsKLS5QRUlPICAgID0weCAweDAwMDAwMDsKLS5QRU9GICAgID0weCAweDAwMDAwMDsKLS5QRU9MICAgID0weCAweDAwMDAwMDsKLS5QRVFVUyAgID0weCAweDAwMDAwMDsKLS5QRVFVViAgID0weCAweDAwMDAwMDsKLS5QRVFVVkwgID0weCAweDAwMDAwMDsKLS5QRVFVVyAgID0weCAweDAwMDAwMDsKLS5QR0NNICAgID0weCAweDAwMDAwMDsKLS5QR0VRUyAgID0weCAweDAwMDAwMDsKLS5QR0VRViAgID0weCAweDAwMDAwMDsKLS5QR0VRVkwgID0weCAweDAwMDAwMDsKLS5QR0VUICAgID0weCAweDAwMDAwMDsKLS5QR1JUUyAgID0weCAweDAwMDAwMDsKLS5QR1JUViAgID0weCAweDAwMDAwMDsKLS5QR1JUVkwgID0weCAweDAwMDAwMDsKLS5QSUFDVCAgID0weCAweDAwMDAwMDsKLS5QSUZEICAgID0weCAxMjYgOwotLlA7Ci0uUElORFYgICA9MHggMHgwMDAwMDA7Ci0uUElORFZMICA9MHggMHgwMDAwMDA7Ci0uUElORFcgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1MgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1YgICA9MHggMHgwMDAwMDA7Ci0uUExFUVMgICA9MHggMHgwMDAwMDA7Ci0uUExFUVYgICA9MHggMHgwMDAwMDA7Ci0uUExFUVZMICA9MHggMHgwMDAwMDA7Ci0uUExFU1MgICA9MHggMHgwMDAwMDA7Ci0uUExFU1YgICA9MHggMHgwMDAwMDA7Ci0uUExFU1ZMICA9MHggMHgwMDAwMDA7Ci0uUExPRFMgICA9MHggMHgwMDAwMDA7Ci0uUExPRFYgICA9MHggMHgwMDAwMDA7Ci0uUExPRFZMICA9MHggMHgwMDAwMDA7Ci0uUE1PREogICA9MHggMHgwMDAwMDA7Ci0uUE1PViAgICA9MHggMHgwMDAwMDA7Ci0uUE1QSiAgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVMgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVYgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVZMICA9MHggMHgwMDAwMDA7Ci0uUE5FUVcgICA9MHggMHgwMDAwMDA7Ci0uUFBBR0UgICA9MHggMHgwMDAwMDA7Ci0uUFBFRSAgICA9MHggMHgwMDAwMDA7Ci0uUFBVVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQyAgICA9MHggMHgwMDAwMDA7Ci0uUFJESCAgICA9MHggMHgwMDAwMDA7Ci0uUFJESSAgICA9MHggMHgwMDAwMDA7Ci0uUFJESiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEUlMgICA9MHggMHgwMDAwMDA7Ci0uUFJEUyAgICA9MHggMHgwMDAwMDA7Ci0uUFJEViAgICA9MHggMHgwMDAwMDA7Ci0uUFJMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFJSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFJTVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJXVCAgICA9MHggMHgwMDAwMDA7Ci0uUFNDT04gICA9MHggMHgwMDAwMDA7Ci0uUFNDT1AgICA9MHggMHgwMDAwMDA7Ci0uUFNERUwgICA9MHggMHgwMDAwMDA7Ci0uUFNJTlMgICA9MHggMHgwMDAwMDA7Ci0uUFNMRU4gICA9MHggMHgwMDAwMDA7Ci0uUFNQT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUUlMgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlYgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlZMICA9MHggMHgwMDAwMDA7Ci0uUFdMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFdSQiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSCAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSSAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSUyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSViAgICA9MHggMHgwMDAwMDA7Ci0KLSovCi0vKgotLlA9MHggICAgICA9IDA7Ci0uUENISU8gICA9MHggMHhmZWVkZmE7Ci0uUENMTyAgICA9MHggMHhmZWVkZmE7Ci0uUENWQlNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNVICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWTCA9MHggMHhmZWVkZmE7Ci0uUENWVFVTICA9MHggMHhmZWVkZmE7Ci0uUERJUyAgICA9MHggMHhmZWVkZmE7Ci0uUERJU0wgICA9MHggMHhmZWVkZmE7Ci0uUERWSiAgICA9MHggMHhmZWVkZmE7Ci0uUEVJTyAgICA9MHggMHhmZWVkZmE7Ci0uUEVPRiAgICA9MHggMHhmZWVkZmE7Ci0uUEVPTCAgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVMgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVYgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVZMICA9MHggMHhmZWVkZmE7Ci0uUEVRVVcgICA9MHggMHhmZWVkZmE7Ci0uUEdDTSAgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVMgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVYgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVZMICA9MHggMHhmZWVkZmE7Ci0uUEdFVCAgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFMgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFYgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFZMICA9MHggMHhmZWVkZmE7Ci0uUElBQ1QgICA9MHggMHhmZWVkZmE7Ci0uUElGRCAgICA9MHggMHhmZWVkZmE7Ci0uUElORFMgICA9MHggMHhmZWVkZmE7Ci0uUElORFYgICA9MHggMHhmZWVkZmE7Ci0uUElORFZMICA9MHggMHhmZWVkZmE7Ci0uUElORFcgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1MgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1YgICA9MHggMHhmZWVkZmE7Ci0uUExFUVMgICA9MHggMHhmZWVkZmE7Ci0uUExFUVYgICA9MHggMHhmZWVkZmE7Ci0uUExFUVZMICA9MHggMHhmZWVkZmE7Ci0uUExFU1MgICA9MHggMHhmZWVkZmE7Ci0uUExFU1YgICA9MHggMHhmZWVkZmE7Ci0uUExFU1ZMICA9MHggMHhmZWVkZmE7Ci0uUExPRFMgICA9MHggMHhmZWVkZmE7Ci0uUExPRFYgICA9MHggMHhmZWVkZmE7Ci0uUExPRFZMICA9MHggMHhmZWVkZmE7Ci0uUE1PREogICA9MHggMHhmZWVkZmE7Ci0uUE1PViAgICA9MHggMHhmZWVkZmE7Ci0uUE1QSiAgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVMgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVYgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVZMICAgID0gMHhmZWVkZmFjZTsKLS5QTkVRVyAgICAgPSAweGZlZWRmYWNlOwotLlBQQUdFICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBFRSAgICAgID0gMHhmZWVkZmFjZTsKLS5QUFVUICAgICAgPSAweGZlZWRmYWNlOwotLlBSREIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRIICAgICAgPSAweGZlZWRmYWNlOwotLlBSREkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRSUyAgICAgPSAweGZlZWRmYWNlOwotLlBSRFMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEViAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkxOICAgICAgPSAweGZlZWRmYWNlOwotLlBSUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJTVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUldUICAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09OICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNDT1AgICAgID0gMHhmZWVkZmFjZTsKLS5QU0RFTCAgICAgPSAweGZlZWRmYWNlOwotLlBTSU5TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNMRU4gICAgID0gMHhmZWVkZmFjZTsKLS5QU1BPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUQ1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlZMICAgID0gMHhmZWVkZmFjZTsKLS5QV0xOICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JDICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkggICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSSAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JKICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSViAgICAgID0gMHhmZWVkZmFjZTsKLSovCi0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5vb2sgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEub29rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTg0Yjk0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5vb2sKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotUzAwQzAwMDA3NDMxMkU2Rjc1NzQyRTZGNkJDMA0KLVMxMTgwMDAwMDAwMDBBMjA1MzQxNDY0NTUzNTQ0RjUyNDUyMDQxMjAyMDIwMjAyMDUyQkUNCi1TMTE4MDAxNTMxMzMyRTMzMjAyMDIwMjAyMDIwMjA1MjMxMzMyRTMyMjAyMDIwMjAyMDc3DQotUzExODAwMkEyMDIwMDBCNUU4NjYwMEI1RTlCMTFEQTE1Qjk5MDAwMDFGMDAwMDAwMEE1MA0KLVMxMTgwMDNGNjQwMDAwMDAzRTAwMDAwMDVDMDBBODAwQkEwMEYwMDAwNDAwMDEwMDAyNTENCi1TMTE4MDA1NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjAwNDAzMUNGNTI1NDRDNDk0MkQwDQotUzExODAwNjk0MzRGNEUwMDA0RTVFQzUyNTQ0QzQ5NDI0MzRGNEUwMDA0RTVFRDUyNTRGMA0KLVMxMTgwMDdFNEM0OTQyNDM0RjRFMDA0MDMxRDI1MjU0NEM0OTQyNDM0RjRFMDAwMDBBMDgNCi1TMTE4MDA5MzdENTI1NDRDNDk0MjUzNTQ1MjAwMTBBNEE4NTI1NDRDNDk0MjQ2NDk0Q0FEDQotUzExODAwQTgwMDAyMDBCNUU4NkQwMDAwMDE2MDAwQjVFODczMDAwMDAyNTQwMDAyMDA2QQ0KLVMxMTgwMEJEQjVFOTM3NTM0MTQ2NDU1MDUyNDk0RTU0MjAwMDAwMDYwMDAyMDAwODAwNzkNCi1TMTE4MDBEMjAwMDAwMzQyMDBCNUU4NkU0OTRFNDk1NDUzNDE0NjQ1NTM1NDAwMDAwMkM5DQotUzExODAwRTcxODAwMDAwRTAwMDAwMDA5MDIwMDMwMDAwMDAwMDA0RTU2RkZEOEJBOEZEQg0KLVMxMTgwMEZDNjMwNjJFNEU2MTAwMDAxNjQxRkEwMDMyNDNFRUZGRDg3MDI2MTJEODUxNDkNCi1TMTE4MDExMUM4RkZGQzRFNUU0RTc1MkI1N0ZGRjIyRjNDMDAwMDAwMEE2MDAwMDAwMjU5DQotUzExODAxMjYzQjZGMDAwMkZGRjYyRjJEMDAzODJGMkQwMDM0NEU0QzRFNEE0MzRGNTBFNw0KLVMxMTgwMTNCNTk1MjQ5NDc0ODU0MjA1NDY1NkM2NTY2NkY2RTIwNDE0MjIwNEMyMDRENkINCi1TMTE4MDE1MDIwNDU3MjY5NjM3MzczNkY2RTJDMjAzMTM5MzkzMzAwNEU1NkZGRkNCQUI1DQotUzExODAxNjU4RjYzMDQyRTRFNjFBQzIwMkUwMDBDMDY4MDAwMDAwMDBDNEU3NjU2ODA3Qw0KLVMxMTgwMTdBNEU3NjAyODBGRkZGRkZGQzRBRDU2NjA0NjEwMDAwQjAyRDQwRkZGQzIwMEINCi1TMTE4MDE4RjZDMDAzQTIyMDgyNDJDMDAzNjk0ODE0RTc2MDQ4MjAwMDAwMDBDNEU3NkQyDQotUzExODAxQTQ0QUQ1NjYwNDYxMDAwMDhFQjA4MjZFMEMwQ0FFMDAwMDAwMDEwMDBDNkNFQg0KLVMxMTgwMUI5MDAwMDBDMjA3QzAwMDAwMDAwNjEwMDAwNjAyMDZDMDAzQTIwMDg2NjA0NkMNCi1TMTE4MDFDRTYxMDAwMDc2MjIwOEQyQUVGRkZDNjgwNDYxMDAwMDVDMjA4MTIxNkUwMDQzDQotUzExODAxRTMxMDAwMDQyMTZFMDAwQzAwMDgyMjA4MDY4MTAwMDAwMDBDNjgwNDYxMDBDMg0KLVMxMTgwMUY4MDA0MDJENDEwMDE0Mjk1MDAwM0EyMDZDMDAzQTI0MDg2NjA0NjEwMDAwQkMNCi1TMTE4MDIwRDNBNDI5MDQyQTgwMDA0NDJBODAwMDg0RTVFMjI1RjI4NUY1MDhGNEVFOTIyDQotUzExODAyMjIwMDAyMkI1RkZGRjI0RTVFRDFERjI4NUYyRjA4MkI0OEZGRjJEMEQwNEVEQQ0KLVMxMTgwMjM3RDAyQjU3RkZGMjJGM0MwMDAwMDAwRTYwMDBGRUUyMkI1N0ZGRjIyRjNDRDQNCi1TMTE4MDI0QzAwMDAwMDEwNjAwMEZFRDQ0RTU2RkZGQ0JBOEY2MzA2MkU0RTYxMDBGRTJCDQotUzExODAyNjFCODJENkMwMDMyRkZGQzYwMDAwMDEyMkI1RkZGRjI0RkVFRkZGQzQyQUVGMQ0KLVMxMTgwMjc2RkZGQzYwMDAwMDgyNEFBRUZGRkM2NzAwMDA3QTIwNkVGRkZDMjAwODY2QTcNCi1TMTE4MDI4QjAwMDAwNDYxQjYyMjI4MDAwNEIyQUUwMDEwNjcwMDAwNjIyMjA4MDI4MTBCDQotUzExODAyQTAwMDAwMDAwMzRBODE2NjQwMjIwODIyNkMwMDNBMjQwOUIyODI2RTM0MjZCNg0KLVMxMTgwMkI1MTAyODA4MDY4NDAwMDAwMDBDNjgwNDYxMDBGRjc2QjY4NDZEMjAyNjEwMUINCi1TMTE4MDJDQTI4MDg5Njg0NEU3NjA0ODMwMDAwMDAwQzRFNzY0QUQ1NjYwNDYxMDBGRkNEDQotUzExODAyREY1QUI2QTgwMDA4NkMwMDAwMDQ2MTgyMjA2RUZGRkMyMDA4NjYwNDYxMDA3Nw0KLVMxMTgwMkY0RkY1MjJENTBGRkZDNjA4MDRBQUVGRkZDNjcwMDAwMkMyMDZFRkZGQzIwMTkNCi1TMTE4MDMwOTA4NjYwNDYxMDBGRjM4MjI2RTAwMEMyMkE4MDAwODIyMDgwNjgxMDAwMEIyDQotUzExODAzMUUwMDBDNjgwNDYxMDBGRjE0MkQ0MTAwMTQ2MDAwMDAwQzIwNkUwMDBDNDIxMA0KLVMxMTgwMzMzOTA0MkFFMDAxNDRFNUUyMDVGMjg1RjUwOEY0RUQwNEZFREZGMDA3MDdGNDQNCi1TMTE4MDM0ODIwNEY0MjU4NTFDOEZGRkM0ODZERkYwODFGM0MwMDA0M0YzQzAwMDE5RjQ5DQotUzExODAzNURGQzAwMDAwMDBDMjI0RjQ1RkEwNEZFMjJEQTIyREEyMkRBMjY2QzAwMjgxRg0KLVMxMTgwMzcyMkYwQzI4NkMwMDJDNEVBQjAwNjg0ODZERkZCODQ4NkRGRkI0MkYwQzIwRTcNCi1TMTE4MDM4NzZDMDAwMDI4NkMwMDA0NEU5MDlGRkMwMDAwMDA1MjJGMkRGRkM2MkYwQzMyDQotUzExODAzOUMyMDZDMDAwODI4NkMwMDBDNEU5MDcwNTIyNjZDMDAyMDRFQUIwMDFFNDE2QQ0KLVMxMTgwM0IxRkEwNEJFMjY2QzAwMjA0RUFCMDA3RTI2NkMwMDIwNEVBQjAwOUU0MUVERDcNCi1TMTE4MDNDNkZGQkEyNjZDMDAyMDRFQUIwMDdFMjY2QzAwMjA0RUFCMDA5RTFGM0MwMDk4DQotUzExODAzREIyODNGM0MwMDAxMjY2QzAwMjA0RUFCMDA5RTlGRkMwMDAwMDA1MjMwMkREMg0KLVMxMTgwM0YwRkZDQTQ4QzAyRjAwMkYwQzIwNkMwMDA4Mjg2QzAwMEM0RTkwNzA1MjI2QkYNCi1TMTE4MDQwNTZDMDAyMDRFQUIwMDFFMjY2QzAwMjA0RUFCMDA5RTQxRkEwNDVFMjY2Q0MzDQotUzExODA0MUEwMDIwNEVBQjAwN0UyNjZDMDAyMDRFQUIwMDlFNDFFREZGOUU3MDE2MjY3Mg0KLVMxMTgwNDJGNkMwMDIwNEVBQjAwQ0E2MDAwMDAxNjJCNUZGRkYyNEZFREZGMDAyQjdDOTINCi1TMTE4MDQ0NDAwMDAwMDAxRkZCNDYwMDAwM0U0NDg2REZGMDg5RkZDMDAwMDAwNTIyMERCDQotUzExODA0NTk0RjQzRURGRjlFMzAxOTcyNTA5MjQwNkYwMjQyNDFEMDQxMzBDMDZGMEEyMw0KLVMxMTgwNDZFNTM0MEUyNDAzMEQ5NTFDOEZGRkM5RkZDMDAwMDAwNTIyMjRGNDVGQTAzMDMNCi1TMTE4MDQ4M0Y2MzJEQTI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNTBGRkFBNDg2RDAyDQotUzExODA0OThGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBBMEZGOTY0MkFERkY3Mw0KLVMxMTgwNEFEMDAyQjZDMDAzMkZGMDQ0ODdBMDNDNDNGM0NGRkZGNDg2REZGMDgyNjZDMUENCi1TMTE4MDRDMjAwMjgyRjBDMjg2QzAwMkM0RUFCMDBDMEZGNzA0ODZERkYwODI2NkMwMDg4DQotUzExODA0RDcyODJGMEMyODZDMDAyQzRFQUIwMEE0RkY1QzYwMDAwMDc4MkI1RkZGRjI5RQ0KLVMxMTgwNEVDNEZFREZGMDA0ODdBMDNCQTNGM0NGRkZGNDg2REZGMDgyNjZDMDAyODJGMUYNCi1TMTE4MDUwMTBDMjg2QzAwMkM0RUFCMDBDMEZGMzQ5RkZDMDAwMDAwNTIyMDZERkYwNEFDDQotUzExODA1MTYyMDA4MkYwMDJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDJGMEYzRjNDRkY2MA0KLVMxMTgwNTJCRkY0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQzBGRjAwOEYNCi1TMTE4MDU0MERGRkMwMDAwMDA1MjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUI2DQotUzExODA1NTVBQjAwQTRGRUU2NjAwMDAxRjAyMDZERkYwNDIwMDg2NjAyNjE4MDRBOTAyRQ0KLVMxMTgwNTZBNjcwMDAxNkEyMjEwMDI4MTAwMDAwMDAzNEE4MTY2NEEyMjEwMjQyQzAwRjENCi1TMTE4MDU3RjM2MDQ4MjAwMDAwMDBDNjgwNDYxMDBGQ0FFQjI4MjZFMzQyMjEwMjQwOEYwDQotUzExODA1OTQwNjgyMDAwMDAwMEM2ODA0NjEwMEZDOUFCMjgyNkQyMDIyMTAyNDA4OTJBNg0KLVMxMTgwNUE5ODI0RTc2MDQ4MTAwMDAwMDBDNEU3NjRBRDU2NjA0NjEwMEZDN0VCMkE4RTANCi1TMTE4MDVCRTAwMDg2QzAwMDAwNjYxMDBGRjIyMjA2REZGMDQyMDA4NjYwNDYxMDBGRkE2DQotUzExODA1RDMxNjIyMjgwMDA4RDJBREZGMDA2ODA0NjEwMEZDNTgyQjQxRkYwMDlGRkMwMg0KLVMxMTgwNUU4MDAwMDAwNTIyNDA4MkYwMjJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDJGQkYNCi1TMTE4MDVGRDBGM0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQkU1DQotUzExODA2MTIwMEMwRkUyQURGRkMwMDAwMDA1MjIwNkRGRjA0MjAwODY2MDQ2MTAwRkUzOQ0KLVMxMTgwNjI3QzIyRjI4MDAwNDNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMEMyODZDRDENCi1TMTE4MDYzQzAwMkM0RUFCMDBCQ0ZERkMyMDZERkYwNDIwMDg2NjA0NjEwMEZFOUEyRjgxDQotUzExODA2NTEyODAwMDgzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM2OA0KLVMxMTgwNjY2NEVBQjAwQkNGREQ0OUZGQzAwMDAwMDUyMjA2REZGMDQyMDA4NjYwNDYxODUNCi1TMTE4MDY3QjAwRkU2QzIyMTAyRjAxMkYwQzIwNkMwMDEwMjg2QzAwMTQ0RTkwMkYwRkZGDQotUzExODA2OTAzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDA2MA0KLVMxMTgwNkE1QzBGRDk4REZGQzAwMDAwMDUyNDg2REZGMDgyNjZDMDAyODJGMEMyODZDNzUNCi1TMTE4MDZCQTAwMkM0RUFCMDBBNEZEN0UyMDZERkYwNDIwMDg2NjA0NjEwMEZFMUMyQjFCDQotUzExODA2Q0Y1MEZGMDQ2MDAwRkU4QTIwNkMwMDNBQjFFREZGMDQ2NzAwMDA2QzQ4N0FEQg0KLVMxMTgwNkU0MDFFODNGM0NGRkZGNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFREMNCi1TMTE4MDZGOUFCMDBDMEZENDI5RkZDMDAwMDAwNTIyMDZERkYwNDIwMDgyRjAwMkYwQzJGDQotUzExODA3MEUyMDZDMDAxMDI4NkMwMDE0NEU5MDJGMEYzRjNDRkZGRjQ4NkRGRjA4MjYxNw0KLVMxMTgwNzIzNkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQzBGRDBFREZGQzAwMDAwMDUyM0QNCi1TMTE4MDczODQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZDRjQ0ODYyDQotUzExODA3NEQ3QTAxOTgzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM5Ng0KLVMxMTgwNzYyNEVBQjAwQzBGQ0Q4NDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFMzINCi1TMTE4MDc3N0FCMDBBNEZDQzQ0ODdBMDE2QTNGM0NGRkZGNDg2REZGMDgyNjZDMDAyODNFDQotUzExODA3OEMyRjBDMjg2QzAwMkM0RUFCMDBDMEZDQTg0ODZERkYwODI2NkMwMDI4MkY1Nw0KLVMxMTgwN0ExMEMyODZDMDAyQzRFQUIwMEE0RkM5NDIwNkRGRjA0MjAwODA2ODAwMDAwMDgNCi1TMTE4MDdCNjAwMTg0RTc2MjIyQzAwMzY5MjgwNEU3NjAyODFGRkZGRkZGQzRBRDU2NkYzDQotUzExODA3Q0IwNDYxMDBGQTZBMkYwMTNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMENFNA0KLVMxMTgwN0UwMjg2QzAwMkM0RUFCMDBCQ0ZDNTYyRjJERkYwMDNGM0MwMDBDNDg2REZGQTMNCi1TMTE4MDdGNTA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBCQ0ZDM0E0ODZERkYwODg3DQotUzExODA4MEEyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEE0RkMyNjQ4NkRGRjA4MUY4Ng0KLVMxMTgwODFGM0MwMDAxMjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDA1NDQ4NkRGRkI4MTUNCi1TMTE4MDgzNDQ4NkRGRkI0MkYwQzIwNkMwMDE4Mjg2QzAwMUM0RTkwNDg2REZGMDg0MkQ4DQotUzExODA4NDkyNzI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNTQ0MkE3MkYyRDAwMzhGMA0KLVMxMTgwODVFMkYyRDAwMzQ0RTRBMDAwQTQ2MzEyMDIwMjAyMDIwMjAyMDIwMDAwMjNBOUMNCi1TMTE4MDg3MzNBMDAwMjI5M0EwMDAwMDAzMDIwMjAyMDIwMjA0MTY0NjQ3MjY1NzM3MzM3DQotUzExODA4ODgyMDIwMjAyMDQ5NjQ2NTZFNzQ2OTc0NzkyMDIwMjAyMDIwMjAyMDIwNTMzQQ0KLVMxMTgwODlENjk3QTY1MjAyMDIwMjAyMDIwMjAyMDRFNjU3ODc0MDAxRDQ5NkU3NjYxQjANCi1TMTE4MDhCMjZDNjk2NDIwNzM2NTY3NkQ2NTZFNzQyMDczNzQ2MTcyNzQ2OTZFNjcyMDM1DQotUzExODA4Qzc2MTc0M0EyMDIwMDAxODUzNjU2NzZENjU2RTc0MjA2QzY5NzM3NDIwNjM3Rg0KLVMxMTgwOERDNkY3MjcyNzU3MDc0NjU2NDNBMjAwMDAwMDAxODIwMjAyMDQxNzY2MTY5M0INCi1TMTE4MDhGMTZDNjE2MjZDNjUyMDIwMjAyMDIwMjAyMDIwNTU3MzY1NjQ0RkVERkZGMjMwDQotUzExODA5MDY5RkZDMDAwMDAwMEE2MTAwMDE1NjQxRUMwMDMwMjBERjIwREYzMERGMjBGMQ0KLVMxMTgwOTFCMkMwMDMyNTY4MDRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDBGOTBBNjMNCi1TMTE4MDkzMDI5NDAwMDMyMjk0MDAwM0E2MDAwMDAzRTJCNUZGRkYyNEZFREZGRjIyMDBBDQotUzExODA5NDUyQzAwMzI1NjgwNEU3NjAyODBGRkZGRkZGQzRBRDU2NjA0NjEwMEY4RTA2NA0KLVMxMTgwOTVBMjk0MDAwM0EyMDZDMDAzQTIyMDg2NjA0NjEwMEY4REU0MjkwNDJBODAwOTQNCi1TMTE4MDk2RjA0NDJBODAwMDg2MDAwMDA5RTRBMkMwMDMwNjcwMDAwMUEyMDZDMDAzQThFDQotUzExODA5ODQyMDA4NjYwMjYxQjI0MjkwNDJBODAwMDQ0MkE4MDAwODYwMDAwMDdFMjAwNw0KLVMxMTgwOTk5NkMwMDNBMjAwODY2MDI2MTlBNEE5MDY3MDAwMDZFMjIxMDAyODEwMDAwQjANCi1TMTE4MDlBRTAwMDM0QTgxNjY0QTIyMTAyNDJDMDAzNjA0ODIwMDAwMDAwQzY4MDQ2MTlCDQotUzExODA5QzMwMEY4NzRCMjgyNkUzNDIyMTAyNDA4MDY4MjAwMDAwMDBDNjgwNDYxMDAxQQ0KLVMxMTgwOUQ4Rjg2MEIyODI2RDIwMjIxMDI0MDg5MjgyNEU3NjA0ODEwMDAwMDAwQzRFRDgNCi1TMTE4MDlFRDc2NEFENTY2MDQ2MTAwRjg0NEIyQTgwMDA4NkMwMDAwMDY2MTAwRkYzQ0U1DQotUzExODBBMDIyMDZDMDAzQTIwMDg2NjA0NjEwMEZGMzAyOTUwMDAzQTYwODQ0MkE3MkY0NA0KLVMxMTgwQTE3MkQwMDM4MkYyRDAwMzQ0RTRBNEU1NjAwMDA1MThGNDJBNzFGM0MwMDBFNjMNCi1TMTE4MEEyQzQyNjc0ODdBMDAxMjQyNjc0MjI3MkYzQzAwQjVFODZFNEU0OTAwMEU1MEI3DQotUzExODBBNDE4RjRFNUUyMDVGMjg1RjRFRTgwMDAyMjA3QzAwMDAwMDAwNjAwNDJCNUY5OQ0KLVMxMTgwQTU2RkZGMjRFNUVEMURGMjg1RjJGMDhEMEQwNEVEMDQzRkEwMDA0RDNGQzAwQUUNCi1TMTE4MEE2QjAyNzA0RTJGNDkwMDBBNDNGQTAwMDREM0ZDMDAwMDAwNDAyRjQ5MDAwNjYyDQotUzExODBBODA0MUZBMDAwNEQxRkNGRkZGRjU3QTIwMjgwMDU2NjYwMDAwMjIyMjA5OTIwMQ0KLVMxMTgwQTk1ODgyMTQxMDA1NjQyODEyNDQ4RDI1QUI1Qzk2REZBNDQ0MUQzNjgwMDVBQUUNCi1TMTExMEFBQTFGN0MwMDAxMDAwNDRFNzU0MjJGMDAwNDRFNzU5Rg0KLVM5MDMwMDAwRkMNCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0xLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNhN2NjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0xLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMi5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0YTc5ZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMi5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0zLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTMucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTkzNDIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTMucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIubGQgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIubGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMWU0MTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLU9VVFBVVF9GT1JNQVQoInNyZWMiKQotU0VDVElPTlMKLXsKLQotCi0udGV4dCAwIDogeyAqKCI5IikgKigiMTAiKSAqKCIxMSIpICooIjEyIikgKigiMTMiKSAqKCIxNCIpICooIjE1IikKLQkJKigiNyIpICooIjgiKSAqKCIwIikgKigiMSIpICooIjIiKSAqKCIzIikgKigiNCIpIH0KLS5ic3MgICA6IHsgICooIjUiKSAqKCI2IikgfQotCi0uUEFGSSAgICA9MHgwMDAwMDA1MCA7Ci0uUENISU8gICA9MHgwMDAwMDBEMCA7Ci0uUENMTyAgICA9MHgwMDAwMDA1NCA7Ci0uUENWQlNWICA9MHgwMDAwMDAwRSA7Ci0uUENWVFNVICA9MHgwMDAwMDAxMiA7Ci0uUENWVFNWICA9MHgwMDAwMDAxNiA7Ci0uUENWVFNWTCA9MHgwMDAwMDAxQSA7Ci0uUENWVFVTICA9MHgwMDAwMDAxRSA7Ci0uUERJUyAgICA9MHgwMDAwMDAyMiA7Ci0uUERJU0wgICA9MHgwMDAwMDAyNiA7Ci0uUERWSiAgICA9MHgwMDAwMDAyQSA7Ci0uUEVJTyAgICA9MHgwMDAwMDBDQyA7Ci0uUEVPRiAgICA9MHgwMDAwMDA1OCA7Ci0uUEVPTCAgICA9MHgwMDAwMDA1QyA7Ci0uUEVRVVMgICA9MHgwMDAwMDAyRSA7Ci0uUEVRVVYgICA9MHgwMDAwMDAzMiA7Ci0uUEVRVVZMICA9MHgwMDAwMDAzNiA7Ci0uUEVRVVcgICA9MHgwMDAwMDBERSA7Ci0uUEdDTSAgICA9MHgwMDAwMDA2NCA7Ci0uUEdFUVMgICA9MHgwMDAwMDAzQSA7Ci0uUEdFUVYgICA9MHgwMDAwMDAzRSA7Ci0uUEdFUVZMICA9MHgwMDAwMDA0MiA7Ci0uUEdFVCAgICA9MHgwMDAwMDA2MCA7Ci0uUEdSVFMgICA9MHgwMDAwMDA0NiA7Ci0uUEdSVFYgICA9MHgwMDAwMDA0QSA7Ci0uUEdSVFZMICA9MHgwMDAwMDA0RSA7Ci0uUElBQ1QgICA9MHgwMDAwMDA2QyA7Ci0uUElGRCAgICA9MHgwMDAwMDA2OCA7Ci0uUElORFMgICA9MHgwMDAwMDA1MiA7Ci0uUElORFYgICA9MHgwMDAwMDA1NiA7Ci0uUElORFZMICA9MHgwMDAwMDA1QSA7Ci0uUElORFcgICA9MHgwMDAwMDBENiA7Ci0uUExEQ1MgICA9MHgwMDAwMDA1RSA7Ci0uUExEQ1YgICA9MHgwMDAwMDA2MiA7Ci0uUExFUVMgICA9MHgwMDAwMDA2NiA7Ci0uUExFUVYgICA9MHgwMDAwMDA2QSA7Ci0uUExFUVZMICA9MHgwMDAwMDA2RSA7Ci0uUExFU1MgICA9MHgwMDAwMDA3MiA7Ci0uUExFU1YgICA9MHgwMDAwMDA3NiA7Ci0uUExFU1ZMICA9MHgwMDAwMDA3QSA7Ci0uUExPRFMgICA9MHgwMDAwMDA3RSA7Ci0uUExPRFYgICA9MHgwMDAwMDA4MiA7Ci0uUExPRFZMICA9MHgwMDAwMDA4NiA7Ci0uUE1PREogICA9MHgwMDAwMDA4QSA7Ci0uUE1PViAgICA9MHgwMDAwMDBFMiA7Ci0uUE1QSiAgICA9MHgwMDAwMDA4RSA7Ci0uUE5FUVMgICA9MHgwMDAwMDA5MiA7Ci0uUE5FUVYgICA9MHgwMDAwMDA5NiA7Ci0uUE5FUVZMICA9MHgwMDAwMDA5QSA7Ci0uUE5FUVcgICA9MHgwMDAwMDBEQSA7Ci0uUFBBR0UgICA9MHgwMDAwMDBENCA7Ci0uUFBFRSAgICA9MHgwMDAwMDA3MCA7Ci0uUFBVVCAgICA9MHgwMDAwMDA3NCA7Ci0uUFJEQiAgICA9MHgwMDAwMDA3OCA7Ci0uUFJEQyAgICA9MHgwMDAwMDA3QyA7Ci0uUFJESCAgICA9MHgwMDAwMDA4MCA7Ci0uUFJESSAgICA9MHgwMDAwMDA4NCA7Ci0uUFJESiAgICA9MHgwMDAwMDA4OCA7Ci0uUFJEUlMgICA9MHgwMDAwMDBDOCA7Ci0uUFJEUyAgICA9MHgwMDAwMDA4QyA7Ci0uUFJEViAgICA9MHgwMDAwMDA5MCA7Ci0uUFJMTiAgICA9MHgwMDAwMDA5NCA7Ci0uUFJSQU4gICA9MHgwMDAwMDA5OCA7Ci0uUFJTVCAgICA9MHgwMDAwMDA5QyA7Ci0uUFJXVCAgICA9MHgwMDAwMDBBMCA7Ci0uUFNDT04gICA9MHgwMDAwMDA5RSA7Ci0uUFNDT1AgICA9MHgwMDAwMDBBMiA7Ci0uUFNERUwgICA9MHgwMDAwMDBBNiA7Ci0uUFNJTlMgICA9MHgwMDAwMDBBQSA7Ci0uUFNMRU4gICA9MHgwMDAwMDBBRSA7Ci0uUFNQT1MgICA9MHgwMDAwMDBCMiA7Ci0uUFNUQ1YgICA9MHgwMDAwMDBCNiA7Ci0uUFNUQ1ZMICA9MHgwMDAwMDBCQSA7Ci0uUFNUT1MgICA9MHgwMDAwMDBCRSA7Ci0uUFNUT1YgICA9MHgwMDAwMDBDMiA7Ci0uUFNUT1ZMICA9MHgwMDAwMDBDNiA7Ci0uUFNUUlMgICA9MHgwMDAwMDBDQSA7Ci0uUFNUUlYgICA9MHgwMDAwMDBDRSA7Ci0uUFNUUlZMICA9MHgwMDAwMDBEMiA7Ci0uUFdMTiAgICA9MHgwMDAwMDBBNCA7Ci0uUFdSQU4gICA9MHgwMDAwMDBBOCA7Ci0uUFdSQiAgICA9MHgwMDAwMDBBQyA7Ci0uUFdSQyAgICA9MHgwMDAwMDBCMCA7Ci0uUFdSSCAgICA9MHgwMDAwMDBCNCA7Ci0uUFdSSSAgICA9MHgwMDAwMDBCOCA7Ci0uUFdSSiAgICA9MHgwMDAwMDBCQyA7Ci0uUFdSUyAgICA9MHgwMDAwMDBDMCA7Ci0uUFdSViAgICA9MHgwMDAwMDBDNCA7Ci0KLS8qCi0uUEFGST0weCAgID0gMHgwMDsKLS5QQ0hJTyAgID0weCAweDAwMDAwMDsKLS5QQ0xPICAgID0weCA2NCA7Ci0uUEM7Ci0uUENWVFNVICA9MHggMHgwMDAwMDA7Ci0uUENWVFNWICA9MHggMHgwMDAwMDA7Ci0uUENWVFNWTCA9MHggMHgwMDAwMDA7Ci0uUENWVFVTICA9MHggMTU4IDsKLS5QOwotLlBESVNMICAgPTB4IDB4MDAwMDAwOwotLlBEVkogICAgPTB4IDB4MDAwMDAwOwotLlBFSU8gICAgPTB4IDB4MDAwMDAwOwotLlBFT0YgICAgPTB4IDB4MDAwMDAwOwotLlBFT0wgICAgPTB4IDB4MDAwMDAwOwotLlBFUVVTICAgPTB4IDB4MDAwMDAwOwotLlBFUVVWICAgPTB4IDB4MDAwMDAwOwotLlBFUVVWTCAgPTB4IDB4MDAwMDAwOwotLlBFUVVXICAgPTB4IDB4MDAwMDAwOwotLlBHQ00gICAgPTB4IDB4MDAwMDAwOwotLlBHRVFTICAgPTB4IDB4MDAwMDAwOwotLlBHRVFWICAgPTB4IDB4MDAwMDAwOwotLlBHRVFWTCAgPTB4IDB4MDAwMDAwOwotLlBHRVQgICAgPTB4IDB4MDAwMDAwOwotLlBHUlRTICAgPTB4IDB4MDAwMDAwOwotLlBHUlRWICAgPTB4IDB4MDAwMDAwOwotLlBHUlRWTCAgPTB4IDB4MDAwMDAwOwotLlBJQUNUICAgPTB4IDB4MDAwMDAwOwotLlBJRkQgICAgPTB4IDEyNiA7Ci0uUDsKLS5QSU5EViAgID0weCAweDAwMDAwMDsKLS5QSU5EVkwgID0weCAweDAwMDAwMDsKLS5QSU5EVyAgID0weCAweDAwMDAwMDsKLS5QTERDUyAgID0weCAweDAwMDAwMDsKLS5QTERDViAgID0weCAweDAwMDAwMDsKLS5QTEVRUyAgID0weCAweDAwMDAwMDsKLS5QTEVRViAgID0weCAweDAwMDAwMDsKLS5QTEVRVkwgID0weCAweDAwMDAwMDsKLS5QTEVTUyAgID0weCAweDAwMDAwMDsKLS5QTEVTViAgID0weCAweDAwMDAwMDsKLS5QTEVTVkwgID0weCAweDAwMDAwMDsKLS5QTE9EUyAgID0weCAweDAwMDAwMDsKLS5QTE9EViAgID0weCAweDAwMDAwMDsKLS5QTE9EVkwgID0weCAweDAwMDAwMDsKLS5QTU9ESiAgID0weCAweDAwMDAwMDsKLS5QTU9WICAgID0weCAweDAwMDAwMDsKLS5QTVBKICAgID0weCAweDAwMDAwMDsKLS5QTkVRUyAgID0weCAweDAwMDAwMDsKLS5QTkVRViAgID0weCAweDAwMDAwMDsKLS5QTkVRVkwgID0weCAweDAwMDAwMDsKLS5QTkVRVyAgID0weCAweDAwMDAwMDsKLS5QUEFHRSAgID0weCAweDAwMDAwMDsKLS5QUEVFICAgID0weCAweDAwMDAwMDsKLS5QUFVUICAgID0weCAweDAwMDAwMDsKLS5QUkRCICAgID0weCAweDAwMDAwMDsKLS5QUkRDICAgID0weCAweDAwMDAwMDsKLS5QUkRIICAgID0weCAweDAwMDAwMDsKLS5QUkRJICAgID0weCAweDAwMDAwMDsKLS5QUkRKICAgID0weCAweDAwMDAwMDsKLS5QUkRSUyAgID0weCAweDAwMDAwMDsKLS5QUkRTICAgID0weCAweDAwMDAwMDsKLS5QUkRWICAgID0weCAweDAwMDAwMDsKLS5QUkxOICAgID0weCAweDAwMDAwMDsKLS5QUlJBTiAgID0weCAweDAwMDAwMDsKLS5QUlNUICAgID0weCAweDAwMDAwMDsKLS5QUldUICAgID0weCAweDAwMDAwMDsKLS5QU0NPTiAgID0weCAweDAwMDAwMDsKLS5QU0NPUCAgID0weCAweDAwMDAwMDsKLS5QU0RFTCAgID0weCAweDAwMDAwMDsKLS5QU0lOUyAgID0weCAweDAwMDAwMDsKLS5QU0xFTiAgID0weCAweDAwMDAwMDsKLS5QU1BPUyAgID0weCAweDAwMDAwMDsKLS5QU1RDViAgID0weCAweDAwMDAwMDsKLS5QU1RDVkwgID0weCAweDAwMDAwMDsKLS5QU1RPUyAgID0weCAweDAwMDAwMDsKLS5QU1RPViAgID0weCAweDAwMDAwMDsKLS5QU1RPVkwgID0weCAweDAwMDAwMDsKLS5QU1RSUyAgID0weCAweDAwMDAwMDsKLS5QU1RSViAgID0weCAweDAwMDAwMDsKLS5QU1RSVkwgID0weCAweDAwMDAwMDsKLS5QV0xOICAgID0weCAweDAwMDAwMDsKLS5QV1JBTiAgID0weCAweDAwMDAwMDsKLS5QV1JCICAgID0weCAweDAwMDAwMDsKLS5QV1JDICAgID0weCAweDAwMDAwMDsKLS5QV1JIICAgID0weCAweDAwMDAwMDsKLS5QV1JJICAgID0weCAweDAwMDAwMDsKLS5QV1JKICAgID0weCAweDAwMDAwMDsKLS5QV1JTICAgID0weCAweDAwMDAwMDsKLS5QV1JWICAgID0weCAweDAwMDAwMDsKLQotKi8KLS8qCi0uUD0weCAgICAgID0gMDsKLS5QQ0hJTyAgID0weCAweGZlZWRmYTsKLS5QQ0xPICAgID0weCAweGZlZWRmYTsKLS5QQ1ZCU1YgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1UgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1YgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1ZMID0weCAweGZlZWRmYTsKLS5QQ1ZUVVMgID0weCAweGZlZWRmYTsKLS5QRElTICAgID0weCAweGZlZWRmYTsKLS5QRElTTCAgID0weCAweGZlZWRmYTsKLS5QRFZKICAgID0weCAweGZlZWRmYTsKLS5QRUlPICAgID0weCAweGZlZWRmYTsKLS5QRU9GICAgID0weCAweGZlZWRmYTsKLS5QRU9MICAgID0weCAweGZlZWRmYTsKLS5QRVFVUyAgID0weCAweGZlZWRmYTsKLS5QRVFVViAgID0weCAweGZlZWRmYTsKLS5QRVFVVkwgID0weCAweGZlZWRmYTsKLS5QRVFVVyAgID0weCAweGZlZWRmYTsKLS5QR0NNICAgID0weCAweGZlZWRmYTsKLS5QR0VRUyAgID0weCAweGZlZWRmYTsKLS5QR0VRViAgID0weCAweGZlZWRmYTsKLS5QR0VRVkwgID0weCAweGZlZWRmYTsKLS5QR0VUICAgID0weCAweGZlZWRmYTsKLS5QR1JUUyAgID0weCAweGZlZWRmYTsKLS5QR1JUViAgID0weCAweGZlZWRmYTsKLS5QR1JUVkwgID0weCAweGZlZWRmYTsKLS5QSUFDVCAgID0weCAweGZlZWRmYTsKLS5QSUZEICAgID0weCAweGZlZWRmYTsKLS5QSU5EUyAgID0weCAweGZlZWRmYTsKLS5QSU5EViAgID0weCAweGZlZWRmYTsKLS5QSU5EVkwgID0weCAweGZlZWRmYTsKLS5QSU5EVyAgID0weCAweGZlZWRmYTsKLS5QTERDUyAgID0weCAweGZlZWRmYTsKLS5QTERDViAgID0weCAweGZlZWRmYTsKLS5QTEVRUyAgID0weCAweGZlZWRmYTsKLS5QTEVRViAgID0weCAweGZlZWRmYTsKLS5QTEVRVkwgID0weCAweGZlZWRmYTsKLS5QTEVTUyAgID0weCAweGZlZWRmYTsKLS5QTEVTViAgID0weCAweGZlZWRmYTsKLS5QTEVTVkwgID0weCAweGZlZWRmYTsKLS5QTE9EUyAgID0weCAweGZlZWRmYTsKLS5QTE9EViAgID0weCAweGZlZWRmYTsKLS5QTE9EVkwgID0weCAweGZlZWRmYTsKLS5QTU9ESiAgID0weCAweGZlZWRmYTsKLS5QTU9WICAgID0weCAweGZlZWRmYTsKLS5QTVBKICAgID0weCAweGZlZWRmYTsKLS5QTkVRUyAgID0weCAweGZlZWRmYTsKLS5QTkVRViAgID0weCAweGZlZWRmYTsKLS5QTkVRVkwgICAgPSAweGZlZWRmYWNlOwotLlBORVFXICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBBR0UgICAgID0gMHhmZWVkZmFjZTsKLS5QUEVFICAgICAgPSAweGZlZWRmYWNlOwotLlBQVVQgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEQiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRDICAgICAgPSAweGZlZWRmYWNlOwotLlBSREggICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESSAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRKICAgICAgPSAweGZlZWRmYWNlOwotLlBSRFJTICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEUyAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRWICAgICAgPSAweGZlZWRmYWNlOwotLlBSTE4gICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJSQU4gICAgID0gMHhmZWVkZmFjZTsKLS5QUlNUICAgICAgPSAweGZlZWRmYWNlOwotLlBSV1QgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNDT04gICAgID0gMHhmZWVkZmFjZTsKLS5QU0NPUCAgICAgPSAweGZlZWRmYWNlOwotLlBTREVMICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNJTlMgICAgID0gMHhmZWVkZmFjZTsKLS5QU0xFTiAgICAgPSAweGZlZWRmYWNlOwotLlBTUE9TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUQ1YgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RDVkwgICAgPSAweGZlZWRmYWNlOwotLlBTVE9TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1YgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPVkwgICAgPSAweGZlZWRmYWNlOwotLlBTVFJTICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlYgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSVkwgICAgPSAweGZlZWRmYWNlOwotLlBXTE4gICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQU4gICAgID0gMHhmZWVkZmFjZTsKLS5QV1JCICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSCAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JJICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkogICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSUyAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JWICAgICAgPSAweGZlZWRmYWNlOwotKi8KLQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLm9vayBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjI0YTUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLm9vaworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLVMwMTIwMDAwNjk2RTY5NzQ3NDY1NzM3NDVGNjU3MDYzMkU3MzcyQ0YNCi1TMTE4MDAwMDAwMDAwMDAwNDk0RTQ5NTQ1NDQ1NTM1NDIwMjA1MDQxMzAzNTIwMjA1MkFCDQotUzExODAwMTUzMTMzMkUzMzIwMjAyMDIwMjAyMDIwNTIzMTMzMkUzMjIwMjAyMDIwMjA3Nw0KLVMxMTgwMDJBMjAyMDAwOTM0QjVCMDBCNUU2QzExQjA4OURENjAwMDA1NDAwMDAwMDA1RjkNCi1TMTE4MDAzRjVBMDAwMDAwNDgwMDVDMDBBNjAwMDAwMTBBMDEyNjAwMDQwMDAxMDAwMkNCDQotUzExODAwNTQwMDkwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDQwMjAyMDAwMDA0OTRGNUY4QQ0KLVMxMTgwMDY5NTI0NTUzNDU1MjU2NDE1MjU0NEM0OTQyNDM0RjRFMDA0MDQ4NDUwMTAwM0INCi1TMTE4MDA3RTUwNUY0MTRDNEMyMDIwMjAyMDIwNTI1NDRDNDk0MjQzNEY0RTAxMDAwMEUzDQotUzExODAwOTMwMDAwOUMwMTAwMDAwMDAwMDAwMDA4NTM0NTUwNDE1MjQxNTQ0NTAwMDg1Mg0KLVMxMTgwMEE4MDAwODAwNDAzMUNGNTI1NDRDNDk0MjQzNEY0RTAwMDRFNUVDNTI1NDRDRDMNCi1TMTE4MDBCRDQ5NDI0MzRGNEUwMEI1RTg2RDUzNDE0NjQ1NTM1NDRGNTIwMDAwNEYyOEQ3DQotUzExODAwRDI1MzU5NTM1NDQ1NEQ0OTREMDBCNUU4NzM1MzQxNDY0NTUzNTQ0RjUyMDAyMw0KLVMxMTgwMEU3NDAzMUQyNTI1NDRDNDk0MjQzNEY0RTAwMDAwQTdENTI1NDRDNDk0MjUzMDkNCi1TMTE4MDBGQzU0NTIwMDEwQTRBODUyNTQ0QzQ5NDI0NjQ5NEMwMDAxMDBCNUU2QzA0OUVDDQotUzExODAxMTE0RTQ5NTQ1NDQ1NTM1NDIwMjAwMDAwMDYxNjAyMDAwODAwMDAwMDAyMzIxMA0KLVMxMTgwMTI2MDA0ODAwMDAwMDAwNEU1NkZGRjBCQThGNjMwNjJFNEU2MTAwMDBCQzQxNTkNCi1TMTE4MDEzQkZBMDBGNDQzRUVGRkYwMzJEODJEN0MwMDAwMDAwMUZGRkMyMDZFMDAwODU4DQotUzExODAxNTAyMDA4NjYwNDYxMDAwMEJBMjIyRUZGRkM1MzgxNEE4MTZDMDQ2MTAwMDAyRQ0KLVMxMTgwMTY1OUUyMjQ4RDNFOUZGRkM0MUYwMTgwMEIzQzg2M0VFNEExMDY2MDAwMDA2RTcNCi1TMTE4MDE3QTYwMDAwMDYyNDFFRUZGRjAyNjZDMDAzODRFQUIwMDdFMjA2RTAwMDgyMDk1DQotUzExODAxOEYwODY2MDQ2MTAwMDA3QzIyMkVGRkZDNTM4MTRBODE2QzA0NjEwMDAwNjBFRA0KLVMxMTgwMUE0MjI0OEQzRTlGRkZDNDFGMDE4MDBCM0M4NjNFRTFGMTAzRjNDMDAwMTI2M0INCi1TMTE4MDFCOTZDMDAzODRFQUIwMDlFNDFFRUZGRjA3MDBDMjY2QzAwMzg0RUFCMDBDQUNCDQotUzExODAxQ0U1MkFFRkZGQzBDQUUwMDAwMDAwQUZGRkM2RjAwRkY3MDQxRUVGRkYwNDMxRg0KLVMxMTgwMUUzRUUwMDBDMjJEODIyRDgyMkQ4NEU1RTIwNUY1ODhGNEVEMDJCNTdGRkYyNzgNCi1TMTE4MDFGODJGM0MwMDAwMDAwQTYwMDAwMDFFMkI1N0ZGRjIyRjNDMDAwMDAwMEY2MEFFDQotUzExODAyMEQwMDAwMTAyQjU3RkZGMjJGM0MwMDAwMDAxMDYwMDAwMDAyM0I2RjAwMDJDQw0KLVMxMTgwMjIyRkZGNjJGMkQwMDM4MkYyRDAwMzQ0RTRDNEU0QTAwMDA0RkVERkVFQTIwMzQNCi1TMTE4MDIzNzNDMDAwMDAwOEEyMDRGNDI1ODUxQzhGRkZDNDg2REZFRUExRjNDMDAwNENGDQotUzExODAyNEMzRjNDMDAwMTlGRkMwMDAwMDAwQzIyNEY0NUZBMDJENDIyREEyMkRBMjJENg0KLVMxMTgwMjYxREEyNjZDMDA0MDJGMEMyODZDMDA0NDRFQUIwMDY4NDg2REZGQjg0ODZENDMNCi1TMTE4MDI3NkZGQjQyRjBDMjA2QzAwMDgyODZDMDAwQzRFOTA5RkZDMDAwMDAwNTIyRjUzDQotUzExODAyOEIyREZGQzYyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTA3MDUyMjY2QzAwMzg3Rg0KLVMxMTgwMkEwNEVBQjAwMUU0MUZBMDI5NDI2NkMwMDM4NEVBQjAwN0UyNjZDMDAzODRFMDQNCi1TMTE4MDJCNUFCMDA5RTQxRURGRkJBMjY2QzAwMzg0RUFCMDA3RTI2NkMwMDM4NEVBQkZDDQotUzExODAyQ0EwMDlFMUYzQzAwMjgzRjNDMDAwMTI2NkMwMDM4NEVBQjAwOUU5RkZDMDA4Mg0KLVMxMTgwMkRGMDAwMDUyMzAyREZGQ0E0OEMwMkYwMDJGMEMyMDZDMDAxMDI4NkMwMDE0RDgNCi1TMTE4MDJGNDRFOTA3MDUyMjY2QzAwMzg0RUFCMDAxRTI2NkMwMDM4NEVBQjAwOUU0MUNFDQotUzExODAzMDlGQTAyMzQyNjZDMDAzODRFQUIwMDdFMjY2QzAwMzg0RUFCMDA5RTQxRUREQg0KLVMxMTgwMzFFRkY4MDcwMTYyNjZDMDAzODRFQUIwMENBOUZGQzAwMDAwMDBFNjEwMDAyMjgNCi1TMTE4MDMzMzI4NDFFREZGOUUyMERGMjBERjIwREYzMERGNEEyREZGOUU2NzAwMDAzQUZEDQotUzExODAzNDg1OThGMkYyREZGQTAyRjJERkZBODJGMEMyMDZDMDAxODI4NkMwMDFDNEVEOQ0KLVMxMTgwMzVEOTAwMUI4MkI1RkZGOUEyRjJERkY5QTJGMkRGRkE0MkYyREZGQTgyRjBDRTkNCi1TMTE4MDM3MjIwNkMwMDIwMjg2QzAwMjQ0RTkwNjAwMDAwMzQ1OThGMkYyREZGQTA0ODcxDQotUzExODAzODc2REZGQTgyRjBDMjA2QzAwMjgyODZDMDAyQzRFOTAyQjVGRkY5NjJGMkQ0MQ0KLVMxMTgwMzlDRkZBNDJGMkRGRjk2MkYyREZGQTgyRjBDMjA2QzAwMjAyODZDMDAyNDRFQzQNCi1TMTE4MDNCMTkwNDg2REZFRUE5RkZDMDAwMDAwNTIyMDRGNDNFREZGODAzMDE5NzI1MEYwDQotUzExODAzQzY5MjQwNkYwMjQyNDFEMDQxMzBDMDZGMEE1MzQwRTI0MDMwRDk1MUM4RkYwOA0KLVMxMTgwM0RCRkM5RkZDMDAwMDAwNTIyMjRGNDVGQTAxNUMzMkRBMjY2QzAwNDAyRjBDRkENCi1TMTE4MDNGMDI4NkMwMDQ0NEVBQjAwNTAwMTJDNDg2REZFRUEyNjZDMDA0MDJGMEMyOEQ0DQotUzExODA0MDU2QzAwNDQ0RUFCMDBBMDAxMTg0ODdBMDEzNDNGM0NGRkZGNDg2REZFRUE2Rg0KLVMxMTgwNDFBMjY2QzAwNDAyRjBDMjg2QzAwNDQ0RUFCMDBDMDAwRkM0ODZERkVFQTI2NkMNCi1TMTE4MDQyRjZDMDA0MDJGMEMyODZDMDA0NDRFQUIwMEE0MDBFODQyQURGRkIwMkI3QzJCDQotUzExODA0NDQwMDAwMDAwMUZGQUM1OThGMkYyREZGQUM2MTAwMDE3RTJCNUZGRkIwMkJDMA0KLVMxMTgwNDU5NDBGRkIwMkYyREZGQUMzRjNDMDAwQTQ4NkRGRUVBMjY2QzAwNDAyRjBDNjUNCi1TMTE4MDQ2RTI4NkMwMDQ0NEVBQjAwQkMwMEFFOUZGQzAwMDAwMDBDMkYyREZGQjA2MTI3DQotUzExODA0ODMwMEZDQTgyRjBGM0YzQzAwMEE0ODZERkVFQTI2NkMwMDQwMkYwQzI4NkNCQg0KLVMxMTgwNDk4MDA0NDRFQUIwMEMwMDA4NkRGRkMwMDAwMDAwQzQ4NkRGRUVBMjY2QzAwQjINCi1TMTE4MDRBRDQwMkYwQzI4NkMwMDQ0NEVBQjAwQTQwMDZDNTJBREZGQUMwQ0FEMDAwMDc3DQotUzExODA0QzIwMDBBRkZBQzZGODI0ODZERkVFQTFGM0MwMDAxMjY2QzAwNDAyRjBDMjg0RA0KLVMxMTgwNEQ3NkMwMDQ0NEVBQjAwNTQ0ODZERkZCODQ4NkRGRkI0MkYwQzIwNkMwMDMwNDQNCi1TMTE4MDRFQzI4NkMwMDM0NEU5MDQ4NkRGRUVBNDIyNzI2NkMwMDQwMkYwQzI4NkMwMEFBDQotUzExODA1MDE0NDRFQUIwMDU0NDJBNzJGMkQwMDM4MkYyRDAwMzQ0RTRBMkI1N0ZGRjIzOA0KLVMxMTgwNTE2MkYzQzAwMDAwMDBDNjAwMEZEMDAyQjU3RkZGMjJGM0MwMDAwMDA2NDYwNTYNCi1TMTE4MDUyQjAwRkNGMjAwMEE0NjMxMjAyMDIwMjAyMDIwMjAyMDAwMDIzQTNBMDAwMkQwDQotUzExODA1NDAyOTNBMDAwMDAwMTQyMDIwMjAyMDIwMjA0MzYxNzM2NTIwMjAyMDIwNTIxRA0KLVMxMTgwNTU1NjU3Mzc1NkM3NDQxRkEwMDA0RDFGQ0ZGRkZGQUEwMjAyODAwM0M0M0ZBRkINCi1TMTE4MDU2QTAwMDREM0ZDMDAwMDAxRDY0NUZBMDAwNEQ1RkMwMDAwMDI1RTI2MEE1OEQyDQotUzExODA1N0Y4QUQwODg1NTgwMjIyODAwNTY2NjAwMDAyRTI0MDgyNjVBRDVCMEI4MDA4Rg0KLVMxMTgwNTk0QjVDMDZERjYyMjA5OTI4ODIxNDEwMDU2NDI4MTI2NDhEMjVCQjdDOTZEMkUNCi1TMTE4MDVBOUZBNDQ0MUQzNjgwMDVBMTIzQzAwMDE2MDAwMDAwNDQyNDExRjQxMDAwNDhCDQotUzExODA1QkUyRjY4MDAzNDAwMDYyRjQ5MDAwQTk2ODkyRjQzMDAwRTRFNzU0RTU2RkZDQw0KLVMxMTgwNUQzRjAyMDJFMDAwODQ3RkEwMDA0RDdGQzAwMDAwMUE2MjIwQjQxRkEwMDA0OUUNCi1TMTE4MDVFOEQxRkMwMDAwMDFCNjJENThGRkYwMkQ1OEZGRjQyRDU4RkZGODJENTBGRjkyDQotUzExODA1RkRGQzUzODA3NDA4QjQ4MDY1MDAwMTJDNDFGQTAwMDREMUZDMDAwMDAwMEVCQQ0KLVMxMTgwNjEyRDA4MDMwMzAwODAwNEVGQjAwMDIwMDEyMDAyMjAwMzIwMDQyMDA0ODAwREMNCi1TMTE4MDYyNzU4MDA2QzAwQTAwMERDNDFGQTAwMDREMUZDMDAwMDAxMTgyMDEwNjAwMEM1DQotUzExODA2M0MwMTAyNDdGQTAwMDREN0ZDMDAwMDAxMEMyMDBCNjAwMDAwRjI0MUZBMDBDNQ0KLVMxMTgwNjUxMDREMUZDMDAwMDAxMTAyMDEwNjAwMDAwRTIyMDAxNjAwMDAwREM0N0ZBOUUNCi1TMTE4MDY2NjAwMDREN0ZDMDAwMDAxMjAyMDBCNjAwMDAwQ0M0M0ZBMDAwNEQzRkMwMDFDDQotUzExODA2N0IwMDAwRkE0MUU5MDAwQzIwMTA2MDAwMDBCODI0MkVGRkY0NDdGQTAwMDQ2NA0KLVMxMTgwNjkwRDdGQzAwMDAwMEZFQjQ4QjY2MDAwMDEyNDdGQTAwMDREN0ZDMDAwMDAxQjANCi1TMTE4MDZBNTE0MjAwQjYwMDAwMDk0NDdGQTAwMDREN0ZDMDAwMDAxMEEyMDBCNjAwMDVCDQotUzExODA2QkEwMDg0NDFGQTAwMDREMUZDMDAwMDAwOEEyMDUwNDdGQTAwMDREN0ZDMDA4NQ0KLVMxMTgwNkNGMDAwMDgyQjFDQjY2MDAwMDEyNDdGQTAwMDREN0ZDMDAwMDAwRTAyMDBCNzkNCi1TMTE4MDZFNDYwMDAwMDU4NDdGQTAwMDREN0ZDMDAwMDAwRDIyMDBCNjAwMDAwNDg0MTQ3DQotUzExODA2RjlGQTAwMDREMUZDMDAwMDAwNEU0M0ZBMDAwNEQzRkMwMDAwMDAzRUIzRDBGRQ0KLVMxMTgwNzBFNjYwMDAwMTI0N0ZBMDAwNEQ3RkMwMDAwMDBBRTIwMEI2MDAwMDAxRTQ3QTQNCi1TMTE4MDcyM0ZBMDAwNEQ3RkMwMDAwMDBBNjIwMEI2MDAwMDAwRTQ3RkEwMDA0RDdGQzk1DQotUzExODA3MzgwMDAwMDA5ODIwMEI0RTVFNEU3NDAwMDQwMDAwNTM3NTZFNjUwMDAwMDBEOA0KLVMxMTgwNzREMDAwNzQ2NEY3NDc0NkYwMDAwMDAwMDAwMEEwMDAwMDAwQzUwNjU2QzZDRkQNCi1TMTE4MDc2MjY1MDAwMDAwMDc1RTUzNzQ2OTZFNjEwMDRCNjE3MjY5NkUwMDAwMDAwMEMwDQotUzExODA3NzcwNTAwMDAwNzY4MDAwMDAwMDMwMDAwMDc2RTUwNzU3NDc0NjUwMDRCNjFCRg0KLVMxMTgwNzhDNkM2QzY1MDA1Mzc0Njk2RTYxMzEwMDAwNEI2MTcyNjk2RTMxMDAwMDAwQzENCi1TMTE4MDdBMTAwMDAzMzAwMDAwNzkwMDAwMDAwMUYwMDAwMDc5ODc4Nzk3QTdBMDAwMEQyDQotUzExODA3QjY0RjZDNkM2NTAwMDAzNzAwMzgwMDUwNjU3NDY1NzIwMDUzNzY3NTZDNkMxOQ0KLVMxMTgwN0NCNkYwMDAwMzkwMDUzNkM3NTc0MDAwMDAwMDAwMDAwMDAwMDA3NEMwMDAwNzINCi1TMTE1MDdFMDA3NjQwMDAwMDc3ODAwMDAwNzgwMDAwMDA3QTQwMDAwMDdBQzM0DQotUzkwMzAwMDBGQw0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy92ZXJzYWRvcy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDJjMDY2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy92ZXJzYWRvcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXZlcnNhZG9zIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGxkIGNhbiByZWFkIHZlcnNhZG9zIGltYWdlcyBhbmQKLSMgZ2VuZXJhdGUgYmluYXJpZXMgd2hpY2ggYXJlIGlkZW50aWNhbCB0byB0aGUgY3VzdG9tZXIncwotIyBvbGQgbWV0aG9kLgotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgbGQgZ2VuZXJhdGVzIG5hdGl2ZSBleGVjdXRhYmxlcy4KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIG9uIDY4ayBjb2ZmIHRhcmdldHMKLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotaWYgeyAhW2lzdGFyZ2V0IG02OGstKi1jb2ZmKl0gfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotc2V0IHRlc3RuYW1lICJMRCBWRVJTQURPUyIKLQotCi1wcm9jIGluc3BlY3QgeyB3aGljaG9uZSB9IHsKLSAgICBnbG9iYWwgb2JqZHVtcAotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIHRlc3RuYW1lCi0KLSAgICBzZW5kX2xvZyAiJG9iamR1bXAgLXMgdG1wZGlyLyR3aGljaG9uZS5vdXQgPnRtcGRpci8kd2hpY2hvbmUuZHVtcFxuIgotICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC1zIHRtcGRpci8kd2hpY2hvbmUub3V0IHwgZ3JlcCAtdiBzcmVjID50bXBkaXIvJHdoaWNob25lLmR1bXAiIGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAkZXhlY19vdXRwdXQKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfQotCi0gICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1zICRzcmNkaXIvJHN1YmRpci8kd2hpY2hvbmUub29rID50bXBkaXIvJHdoaWNob25lLmRva1xuIgotICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC1zICRzcmNkaXIvJHN1YmRpci8kd2hpY2hvbmUub29rIHwgZ3JlcCAtdiBzcmVjID50bXBkaXIvJHdoaWNob25lLmRvayIgZXhlY19vdXRwdXQKLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICRleGVjX291dHB1dAotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICAjIGNvbXBhcmUgaXQgd2l0aCB0aGUgY29ycmVjdCBvdXRwdXQKLSAgICBjYXRjaCAiZXhlYyBkaWZmIHRtcGRpci8kd2hpY2hvbmUuZHVtcCB0bXBkaXIvJHdoaWNob25lLmRvayIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAkZXhlY19vdXRwdXQKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfQotCi0gICAgcmV0dXJuIDEKLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3QxLm91dCBcCi0JIiAtVCAkc3JjZGlyLyRzdWJkaXIvdDEubGQgJHNyY2Rpci8kc3ViZGlyL3QxLTEucm8gICRzcmNkaXIvJHN1YmRpci90MS0yLnJvIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19IGVsc2UgewotICAgICMgR2V0IGEgZHVtcCBvZiB3aGF0IHdlJ3ZlIGdvdCwgYW5kIHdoYXQgd2Ugc2hvdWxkIGhhdmUKLSAgICBpZiAhW2luc3BlY3QgdDFdIHsKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgIHRtcGRpci90Mi5vdXQgXAotCSIgLVQgJHNyY2Rpci8kc3ViZGlyL3QyLmxkICRzcmNkaXIvJHN1YmRpci90Mi0yLnJvIFwKLQkkc3JjZGlyLyRzdWJkaXIvdDItMS5ybyAgJHNyY2Rpci8kc3ViZGlyL3QyLTMucm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0gZWxzZSB7Ci0gICAgIyBHZXQgYSBkdW1wIG9mIHdoYXQgd2UndmUgZ290LCBhbmQgd2hhdCB3ZSBzaG91bGQgaGF2ZQotICAgIGlmICFbaW5zcGVjdCB0Ml0gewotCXJldHVybgotICAgIH0KLX0KLQotcGFzcyAkdGVzdG5hbWUKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9saWIvbGQtbGliLmV4cCBiL2xkL3Rlc3RzdWl0ZS9saWIvbGQtbGliLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhMTgwYi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotIwotIyBkZWZhdWx0X2xkX3ZlcnNpb24gCi0jCWV4dHJhY3QgYW5kIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsZAotIwotcHJvYyBkZWZhdWx0X2xkX3ZlcnNpb24geyBsZCB9IHsKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBpZiB7IFt3aGljaCAkbGRdID09IDAgfSB0aGVuIHsKLQlwZXJyb3IgIiRsZCBkb2VzIG5vdCBleGlzdCIKLQlleGl0IDEKLSAgICB9Ci0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkIC0tdmVyc2lvbiIgdG1wCi0gICAgc2V0IHRtcCBbcHJ1bmVfd2FybmluZ3MgJHRtcF0KLSAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgJHRtcCB2ZXJzaW9uIGN5ZyBudW1iZXIKLSAgICBpZiBbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKLQljbG9uZV9vdXRwdXQgIiRsZCAkbnVtYmVyXG4iCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfcmVsb2NhdGUgCi0jCWxpbmsgYW4gb2JqZWN0IHVzaW5nIHJlbG9jYXRpb24KLSMKLXByb2MgZGVmYXVsdF9sZF9yZWxvY2F0ZSB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotICAgIGdsb2JhbCBIT1NUSU5HX0VNVQotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICAKLSAgICBpZiB7IFt3aGljaCAkbGRdID09IDAgfSB0aGVuIHsKLQlwZXJyb3IgIiRsZCBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLSAgICAKLSAgICB2ZXJib3NlIC1sb2cgIiRsZCAkSE9TVElOR19FTVUgLW8gJHRhcmdldCAtciAkb2JqZWN0cyIKLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgJEhPU1RJTkdfRU1VIC1vICR0YXJnZXQgLXIgJG9iamVjdHMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotCi0jCi0jIGRlZmF1bHRfbGRfbGluayAKLSMJbGluayBhIHByb2dyYW0gdXNpbmcgbGQKLSMKLXByb2MgZGVmYXVsdF9sZF9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0gICAgZ2xvYmFsIEhPU1RJTkdfRU1VCi0gICAgZ2xvYmFsIEhPU1RJTkdfQ1JUMAotICAgIGdsb2JhbCBIT1NUSU5HX0xJQlMKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgc2V0IG9ianMgIiRIT1NUSU5HX0NSVDAgJG9iamVjdHMiCi0gICAgc2V0IGxpYnMgIiRIT1NUSU5HX0xJQlMiCi0gICAgCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgJEhPU1RJTkdfRU1VIC1vICR0YXJnZXQgJG9ianMgJGxpYnMiCi0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkICRIT1NUSU5HX0VNVSAtbyAkdGFyZ2V0ICRvYmpzICRsaWJzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9zaW1wbGVfbGluayAKLSMJbGluayBhIHByb2dyYW0gdXNpbmcgbGQsIHdpdGhvdXQgaW5jbHVkaW5nIGFueSBsaWJyYXJpZXMKLSMKLXByb2MgZGVmYXVsdF9sZF9zaW1wbGVfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICAKLSAgICBpZiB7IFt3aGljaCAkbGRdID09IDAgfSB0aGVuIHsKLQlwZXJyb3IgIiRsZCBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLSAgICAKLSAgICB2ZXJib3NlIC1sb2cgIiRsZCAtbyAkdGFyZ2V0ICRvYmplY3RzIgotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAtbyAkdGFyZ2V0ICRvYmplY3RzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgIyBXZSBkb24ndCBjYXJlIGlmIHdlIGdldCBhIHdhcm5pbmcgYWJvdXQgYSBub24tZXhpc3RlbnQgc3RhcnQKLSAgICAjIHN5bWJvbCwgc2luY2UgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdCBtaWdodCB1c2UgRU5UUlkuCi0gICAgcmVnc3ViIC1hbGwgIihefFxuKShcW15cblxdKjogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9jb21waWxlIAotIwljb21waWxlIGFuIG9iamVjdCB1c2luZyBjYwotIwotcHJvYyBkZWZhdWx0X2xkX2NvbXBpbGUgeyBjYyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBDRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgZ2NjX2dhc19mbGFnCi0KLSAgICBzZXQgY2NfcHJvZyAkY2MKLSAgICBpZiB7W2xsZW5ndGggJGNjX3Byb2ddID4gMX0gdGhlbiB7Ci0Jc2V0IGNjX3Byb2cgW2xpbmRleCAkY2NfcHJvZyAwXQotICAgIH0KLSAgICBpZiB7W3doaWNoICRjY19wcm9nXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRjY19wcm9nIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG9iamVjdCIgZXhlY19vdXRwdXQKLQotICAgIHNldCBmbGFncyAiLUkkc3JjZGlyLyRzdWJkaXIgJENGTEFHUyIKLQotICAgICMgSWYgd2UgYXJlIGNvbXBpbGluZyB3aXRoIGdjYywgd2Ugd2FudCB0byBhZGQgZ2NjX2dhc19mbGFnIHRvCi0gICAgIyBmbGFncy4gIFJhdGhlciB0aGFuIGRldGVybWluZSB0aGlzIGluIHNvbWUgY29tcGxleCB3YXksIHdlIGd1ZXNzCi0gICAgIyBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIuCi0gICAgaWYge1tzdHJpbmcgbWF0Y2ggIipnY2MqIiAkY2NdIHx8IFtzdHJpbmcgbWF0Y2ggIiorKyoiICRjY119IHRoZW4gewotCXNldCBmbGFncyAiJGdjY19nYXNfZmxhZyAkZmxhZ3MiCi0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkY2MgJGZsYWdzIC1jICRzb3VyY2UgLW8gJG9iamVjdCIKLQotICAgIGNhdGNoICJleGVjICRjYyAkZmxhZ3MgLWMgJHNvdXJjZSAtbyAkb2JqZWN0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlpZiB7IVtmaWxlIGV4aXN0cyAkb2JqZWN0XX0gdGhlbiB7Ci0JICAgIHJlZ2V4cCAiLiovKFxbXi9cXSopJCIgJHNvdXJjZSBhbGwgZG9iagotCSAgICByZWdzdWIgIlxcLmMiICRkb2JqICIubyIgcmVhbG9iagotCSAgICB2ZXJib3NlICJsb29raW5nIGZvciAkcmVhbG9iaiIKLQkgICAgaWYge1tmaWxlIGV4aXN0cyAkcmVhbG9ial19IHRoZW4gewotCQl2ZXJib3NlIC1sb2cgIm12ICRyZWFsb2JqICRvYmplY3QiCi0JCWNhdGNoICJleGVjIG12ICRyZWFsb2JqICRvYmplY3QiIGV4ZWNfb3V0cHV0Ci0JCXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCQlpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7Ci0JCSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQkJICAgIHBlcnJvciAiY291bGQgbm90IG1vdmUgJHJlYWxvYmogdG8gJG9iamVjdCIKLQkJICAgIHJldHVybiAwCi0JCX0KLQkgICAgfSBlbHNlIHsKLQkJcGVycm9yICIkb2JqZWN0IG5vdCBmb3VuZCBhZnRlciBjb21waWxhdGlvbiIKLQkJcmV0dXJuIDAKLQkgICAgfQotCX0KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkc291cmNlOiBjb21waWxhdGlvbiBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9hc3NlbWJsZQotIwlhc3NlbWJsZSBhIGZpbGUKLSMKLXByb2MgZGVmYXVsdF9sZF9hc3NlbWJsZSB7IGFzIHNvdXJjZSBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIEFTRkxBR1MKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgaWYge1t3aGljaCAkYXNdID09IDB9IHRoZW4gewotCXBlcnJvciAiJGFzIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBBU0ZMQUdTXSB7IHNldCBBU0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJGFzICRBU0ZMQUdTIC1vICRvYmplY3QgJHNvdXJjZSIKLQotICAgIGNhdGNoICJleGVjICRhcyAkQVNGTEFHUyAtbyAkb2JqZWN0ICRzb3VyY2UiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlwZXJyb3IgIiRzb3VyY2U6IGFzc2VtYmx5IGZhaWxlZCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotIwotIyBkZWZhdWx0X2xkX25tCi0jCXJ1biBubSBvbiBhIGZpbGUsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbiB0aGUgYXJyYXkgbm1fb3V0cHV0Ci0jCi1wcm9jIGRlZmF1bHRfbGRfbm0geyBubSBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIE5NRkxBR1MKLSAgICBnbG9iYWwgbm1fb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgaWYge1t3aGljaCAkbm1dID09IDB9IHRoZW4gewotCXBlcnJvciAiJG5tIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXRdfSB7Ci0gICAgICB1bnNldCBubV9vdXRwdXQKLSAgICB9Ci0KLSAgICBpZiAhW2luZm8gZXhpc3RzIE5NRkxBR1NdIHsgc2V0IE5NRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkbm0gJE5NRkxBR1MgJG9iamVjdCA+dG1wZGlyL25tLm91dCIKLQotICAgIGNhdGNoICJleGVjICRubSAkTk1GTEFHUyAkb2JqZWN0ID50bXBkaXIvbm0ub3V0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlzZXQgZmlsZSBbb3BlbiB0bXBkaXIvbm0ub3V0IHJdCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMSB9IHsKLQkgICAgdmVyYm9zZSAiJGxpbmUiIDIKLQkgICAgaWYgW3JlZ2V4cCAiXihcWzAtOWEtZkEtRlxdKykgXFthLXpBLVowLTlcXSAoLispJCIgJGxpbmUgd2hvbGUgdmFsdWUgbmFtZV0gewotICAgICAgICAgICAgICAgIHNldCBuYW1lIFtzdHJpbmcgdHJpbWxlZnQgJG5hbWUgIl8iXQotCQl2ZXJib3NlICJTZXR0aW5nIG5tX291dHB1dCgkbmFtZSkgdG8gMHgkdmFsdWUiIDIKLQkJc2V0IG5tX291dHB1dCgkbmFtZSkgMHgkdmFsdWUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZQotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlwZXJyb3IgIiRvYmplY3Q6IG5tIGZhaWxlZCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotIwotIyBzaW1wbGVfZGlmZgotIwljb21wYXJlcyB0d28gZmlsZXMgbGluZS1ieS1saW5lCi0jCXJldHVybnMgZGlmZmVyZW5jZXMgaWYgZXhpc3QKLSMJcmV0dXJucyBudWxsIGlmIGZpbGUocykgY2Fubm90IGJlIG9wZW5lZAotIwotcHJvYyBzaW1wbGVfZGlmZiB7IGZpbGVfMSBmaWxlXzIgfSB7Ci0gICAgZ2xvYmFsIHRhcmdldAotCQotICAgIHNldCBlb2YgLTEKLSAgICBzZXQgZGlmZmVyZW5jZXMgMAotICAgIAotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8xXSB0aGVuIHsKLQlzZXQgZmlsZV9hIFtvcGVuICRmaWxlXzEgcl0KLSAgICB9IGVsc2UgewotCXdhcm5pbmcgIiRmaWxlXzEgZG9lc24ndCBleGlzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzJdIHRoZW4gewotCXNldCBmaWxlX2IgW29wZW4gJGZpbGVfMiByXQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGZpbGVfMiBkb2Vzbid0IGV4aXN0IgotCXJldHVybgotICAgIH0KLSAgICAKLSAgICB2ZXJib3NlICIjIERpZmYnaW5nOiAkZmlsZV8xICRmaWxlXzJcbiIgMgotICAgIAotICAgIHdoaWxlIHsgW2dldHMgJGZpbGVfYSBsaW5lXSAhPSAkZW9mIH0gewotCWlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JICAgIGNvbnRpbnVlCi0JfSBlbHNlIHsKLQkgICAgbGFwcGVuZCBsaXN0X2EgJGxpbmUKLQl9Ci0gICAgfQotICAgIGNsb3NlICRmaWxlX2EKLSAgICAKLSAgICB3aGlsZSB7IFtnZXRzICRmaWxlX2IgbGluZV0gIT0gJGVvZiB9IHsKLQlpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCSAgICBjb250aW51ZQotCX0gZWxzZSB7Ci0JICAgIGxhcHBlbmQgbGlzdF9iICRsaW5lCi0JfQotICAgIH0KLSAgICBjbG9zZSAkZmlsZV9iCi0KLSAgICBmb3IgeyBzZXQgaSAwIH0geyAkaSA8IFtsbGVuZ3RoICRsaXN0X2FdIH0geyBpbmNyIGkgfSB7Ci0Jc2V0IGxpbmVfYSBbbGluZGV4ICRsaXN0X2EgJGldCi0Jc2V0IGxpbmVfYiBbbGluZGV4ICRsaXN0X2IgJGldCi0KLQl2ZXJib3NlICJcdCRmaWxlXzE6ICRpOiAkbGluZV9hXG4iIDMKLQl2ZXJib3NlICJcdCRmaWxlXzI6ICRpOiAkbGluZV9iXG4iIDMKLQlpZiBbc3RyaW5nIGNvbXBhcmUgJGxpbmVfYSAkbGluZV9iXSB0aGVuIHsKLQkgICAgdmVyYm9zZSAtbG9nICJcdCRmaWxlXzE6ICRpOiAkbGluZV9hXG4iCi0JICAgIHZlcmJvc2UgLWxvZyAiXHQkZmlsZV8yOiAkaTogJGxpbmVfYlxuIgotCi0JICAgIGZhaWwgIlRlc3Q6ICR0YXJnZXQiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgCi0gICAgaWYgeyBbbGxlbmd0aCAkbGlzdF9hXSAhPSBbbGxlbmd0aCAkbGlzdF9iXSB9IHsKLQlmYWlsICJUZXN0OiAkdGFyZ2V0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmICRkaWZmZXJlbmNlczwxIHRoZW4gewotCXBhc3MgIlRlc3Q6ICR0YXJnZXQiCi0gICAgfQotfQotCi0jIFRoaXMgZGVmaW5pdGlvbiBpcyB0YWtlbiBmcm9tIGFuIHVucmVsZWFzZWQgdmVyc2lvbiBvZiBEZWphR251LiAgT25jZQotIyB0aGF0IHZlcnNpb24gZ2V0cyByZWxlYXNlZCwgYW5kIGhhcyBiZWVuIG91dCBpbiB0aGUgd29ybGQgZm9yIGEgZmV3Ci0jIG1vbnRocyBhdCBsZWFzdCwgaXQgbWF5IGJlIHNhZmUgdG8gZGVsZXRlIHRoaXMgY29weS4KLWlmICFbc3RyaW5nIGxlbmd0aCBbaW5mbyBwcm9jIHBydW5lX3dhcm5pbmdzXV0gewotICAgICMKLSAgICAjIHBydW5lX3dhcm5pbmdzIC0tIGRlbGV0ZSB2YXJpb3VzIHN5c3RlbSB2ZXJib3NpdGllcyBmcm9tIFRFWFQKLSAgICAjCi0gICAgIyBBbiBleGFtcGxlIGlzOgotICAgICMgbGQuc286IHdhcm5pbmc6IC91c3IvbGliL2xpYmMuc28uMS44LjEgaGFzIG9sZGVyIHJldmlzaW9uIHRoYW4gZXhwZWN0ZWQgOQotICAgICMKLSAgICAjIFNpdGVzIHdpdGggcGFydGljdWxhciB2ZXJib3NlIG9zJ3MgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBpbiBzaXRlLmV4cC4KLSAgICAjCi0gICAgcHJvYyBwcnVuZV93YXJuaW5ncyB7IHRleHQgfSB7Ci0JIyBUaGlzIGlzIGZyb20gc3VuNCdzLiAgRG8gaXQgZm9yIGFsbCBtYWNoaW5lcyBmb3Igbm93LgotCSMgVGhlICJcXDEiIGlzIHRvIHRyeSB0byBwcmVzZXJ2ZSBhICJcbiIgYnV0IG9ubHkgaWYgbmVjZXNzYXJ5LgotCXJlZ3N1YiAtYWxsICIoXnxcbikobGQuc286IHdhcm5pbmc6XFteXG5cXSpcbj8pKyIgJHRleHQgIlxcMSIgdGV4dAotCi0JIyBJdCBtaWdodCBiZSB0ZW1wdGluZyB0byBnZXQgY2FycmllZCBhd2F5IGFuZCBkZWxldGUgYmxhbmsgbGluZXMsIGV0Yy4KLQkjIEp1c3QgZGVsZXRlICpleGFjdGx5KiB3aGF0IHdlJ3JlIGFzayB0bywgYW5kIHRoYXQncyBpdC4KLQlyZXR1cm4gJHRleHQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvQ09QWUlORy5MSUIgYi9saWJpYmVydHkvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L0NPUFlJTkcuTElCCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgR1BMLiAgSXQgaXMKLSBudW1iZXJlZCAyIGJlY2F1c2UgaXQgZ29lcyB3aXRoIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR1BMLl0KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKLWZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KLQotICBUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQotc3BlY2lhbGx5IGRlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55Ci1vdGhlciBsaWJyYXJpZXMgd2hvc2UgYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UgaXQgZm9yCi15b3VyIGxpYnJhcmllcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmCi15b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKLW9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKLXlvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKLWNvZGUuICBJZiB5b3UgbGluayBhIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQotY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KLXdpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZwotaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLSAgT3VyIG1ldGhvZCBvZiBwcm90ZWN0aW5nIHlvdXIgcmlnaHRzIGhhcyB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQKLXRoZSBsaWJyYXJ5LCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCi1wZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KLQotICBBbHNvLCBmb3IgZWFjaCBkaXN0cmlidXRvcidzIHByb3RlY3Rpb24sIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotbGlicmFyeS4gIElmIHRoZSBsaWJyYXJ5IGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbAotdmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbgotdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgotDAotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IGNvbXBhbmllcyBkaXN0cmlidXRpbmcgZnJlZQotc29mdHdhcmUgd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgdGh1cyBpbiBlZmZlY3QKLXRyYW5zZm9ybWluZyB0aGUgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlLiAgVG8gcHJldmVudCB0aGlzLAotd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzCi1mcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5Ci1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggd2FzIGRlc2lnbmVkIGZvciB1dGlsaXR5IHByb2dyYW1zLiAgVGhpcwotbGljZW5zZSwgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbgotZGVzaWduYXRlZCBsaWJyYXJpZXMuICBUaGlzIGxpY2Vuc2UgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5Ci1vbmU7IGJlIHN1cmUgdG8gcmVhZCBpdCBpbiBmdWxsLCBhbmQgZG9uJ3QgYXNzdW1lIHRoYXQgYW55dGhpbmcgaW4gaXQgaXMKLXRoZSBzYW1lIGFzIGluIHRoZSBvcmRpbmFyeSBsaWNlbnNlLgotCi0gIFRoZSByZWFzb24gd2UgaGF2ZSBhIHNlcGFyYXRlIHB1YmxpYyBsaWNlbnNlIGZvciBzb21lIGxpYnJhcmllcyBpcyB0aGF0Ci10aGV5IGJsdXIgdGhlIGRpc3RpbmN0aW9uIHdlIHVzdWFsbHkgbWFrZSBiZXR3ZWVuIG1vZGlmeWluZyBvciBhZGRpbmcgdG8gYQotcHJvZ3JhbSBhbmQgc2ltcGx5IHVzaW5nIGl0LiAgTGlua2luZyBhIHByb2dyYW0gd2l0aCBhIGxpYnJhcnksIHdpdGhvdXQKLWNoYW5naW5nIHRoZSBsaWJyYXJ5LCBpcyBpbiBzb21lIHNlbnNlIHNpbXBseSB1c2luZyB0aGUgbGlicmFyeSwgYW5kIGlzCi1hbmFsb2dvdXMgdG8gcnVubmluZyBhIHV0aWxpdHkgcHJvZ3JhbSBvciBhcHBsaWNhdGlvbiBwcm9ncmFtLiAgSG93ZXZlciwgaW4KLWEgdGV4dHVhbCBhbmQgbGVnYWwgc2Vuc2UsIHRoZSBsaW5rZWQgZXhlY3V0YWJsZSBpcyBhIGNvbWJpbmVkIHdvcmssIGEKLWRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnksIGFuZCB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotdHJlYXRzIGl0IGFzIHN1Y2guCi0KLSAgQmVjYXVzZSBvZiB0aGlzIGJsdXJyZWQgZGlzdGluY3Rpb24sIHVzaW5nIHRoZSBvcmRpbmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBmb3IgbGlicmFyaWVzIGRpZCBub3QgZWZmZWN0aXZlbHkgcHJvbW90ZSBzb2Z0d2FyZQotc2hhcmluZywgYmVjYXVzZSBtb3N0IGRldmVsb3BlcnMgZGlkIG5vdCB1c2UgdGhlIGxpYnJhcmllcy4gIFdlCi1jb25jbHVkZWQgdGhhdCB3ZWFrZXIgY29uZGl0aW9ucyBtaWdodCBwcm9tb3RlIHNoYXJpbmcgYmV0dGVyLgotCi0gIEhvd2V2ZXIsIHVucmVzdHJpY3RlZCBsaW5raW5nIG9mIG5vbi1mcmVlIHByb2dyYW1zIHdvdWxkIGRlcHJpdmUgdGhlCi11c2VycyBvZiB0aG9zZSBwcm9ncmFtcyBvZiBhbGwgYmVuZWZpdCBmcm9tIHRoZSBmcmVlIHN0YXR1cyBvZiB0aGUKLWxpYnJhcmllcyB0aGVtc2VsdmVzLiAgVGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KLXBlcm1pdCBkZXZlbG9wZXJzIG9mIG5vbi1mcmVlIHByb2dyYW1zIHRvIHVzZSBmcmVlIGxpYnJhcmllcywgd2hpbGUKLXByZXNlcnZpbmcgeW91ciBmcmVlZG9tIGFzIGEgdXNlciBvZiBzdWNoIHByb2dyYW1zIHRvIGNoYW5nZSB0aGUgZnJlZQotbGlicmFyaWVzIHRoYXQgYXJlIGluY29ycG9yYXRlZCBpbiB0aGVtLiAgKFdlIGhhdmUgbm90IHNlZW4gaG93IHRvIGFjaGlldmUKLXRoaXMgYXMgcmVnYXJkcyBjaGFuZ2VzIGluIGhlYWRlciBmaWxlcywgYnV0IHdlIGhhdmUgYWNoaWV2ZWQgaXQgYXMgcmVnYXJkcwotY2hhbmdlcyBpbiB0aGUgYWN0dWFsIGZ1bmN0aW9ucyBvZiB0aGUgTGlicmFyeS4pICBUaGUgaG9wZSBpcyB0aGF0IHRoaXMKLXdpbGwgbGVhZCB0byBmYXN0ZXIgZGV2ZWxvcG1lbnQgb2YgZnJlZSBsaWJyYXJpZXMuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQotIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKLWZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hpbGUgdGhlIGxhdHRlciBvbmx5Ci13b3JrcyB0b2dldGhlciB3aXRoIHRoZSBsaWJyYXJ5LgotCi0gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBsaWJyYXJ5IHRvIGJlIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJhdGhlciB0aGFuIGJ5IHRoaXMgc3BlY2lhbCBvbmUuCi0MCi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCi1jb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAotcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCi1hZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KLWFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KLXN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKLXdyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKLWFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgotICAKLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCi1jb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoteW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KLWFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0Ci1hbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQotd2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKLUxpYnJhcnkuCi0KLSAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKLWFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKLWZlZS4KLQwKLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwotICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCi0gICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwotICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKLSAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKLSAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKLSAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgotICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KLQotICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCi0gICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQotICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55Ci0gICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKLSAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQotICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKLWl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Ci13aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCi10aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCi10aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi1pbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Ci10aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCi10aGVzZSBub3RpY2VzLgotDAotICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCi10aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAotc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KLQotICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKLXRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KLQotICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgotZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KLXVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQotaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAotbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLWZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCi1zb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKLUxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKLWxpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCi13b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCi10aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKLWNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAotY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKLWxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCi0KLSAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKLXRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQotZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCi1XaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQotbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKLXRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCi0KLSAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKLXN0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQotZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAotZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQotd29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKLUxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCi0KLSAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKLWRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgotQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCi13aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCi0MCi0gIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21waWxlIG9yCi1saW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQotd29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKLXVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKLW1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQotZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCi0KLSAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCi1MaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKLXRoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKLWR1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1jb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCi1kaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCi1vZiB0aGVzZSB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZwotICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgotICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCi0gICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKLSAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKLSAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQotICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCi0gICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKLSAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKLSAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgotICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQotCi0gICAgYikgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKLSAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKLSAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCi0gICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgotCi0gICAgYykgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLSAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKLSAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCi0KLSAgICBkKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKLSAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KLQotICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKLUxpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCi1yZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKLXRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkKLWRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgotY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgotd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwotdGhlIGV4ZWN1dGFibGUuCi0KLSAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKLXJlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKLWFjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKLXVzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKLWRpc3RyaWJ1dGUuCi0MCi0gIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCi1saWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KLXRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQotcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCi0gICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQotICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgIFNlY3Rpb25zIGFib3ZlLgotCi0gICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKLSAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwotICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQotdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKLWF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCi1yaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCi1vciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCi10ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKLXN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0MCi0gIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQotcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAotYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCi1hbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKLXNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cwotZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKLXdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwotdmVyc2lvbnMgb2YgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KLVN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKLWJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCi0iYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCi1saWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQwKLSAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAotd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKLWNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCi1kZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCi1vZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZwotYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCi1XQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgotRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKLU9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCi1LSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCi1MSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQotVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCi1XUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQotQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKLUZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCi1MSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCi1SRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQotRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgotU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotICAgICBBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLW9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKLXNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKLSJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgICBNQSAwMjExMS0xMzA3LCBVU0EKLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCi0gIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCi0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCmRpZmYgLS1naXQgYS9saWJpYmVydHkvQ2hhbmdlTG9nIGIvbGliaWJlcnR5L0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkMzIyOS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzI0NSArMCwwIEBACi0xOTk5LTA1LTExICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChtYWluKTogVXNlIHRhYmxlIGxvb2t1cCB0byBkaXN0aW5ndWlzaCBpZGVudGlmaWVyCi0JY2hhcmFjdGVycyBmcm9tIG5vbi1pZGVudGlmaWVyIGNoYXJhY3RlcnMuCi0JKHN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCwgaHBfc3ltYm9sX2FscGhhYmV0KTogTmV3IGZ1bmN0aW9ucy4KLQotVGh1IE1heSAgNiAyMDozNDo0MiAxOTk5ICBGcmVkIEZpc2ggIDxmbmZAYmUuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHN5cy9yZXNvdXJjZS5oKTogQWRkIHRvIEFDX0NIRUNLX0hFQURFUlMgbGlzdC4KLQkqIGdldHJ1bnRpbWUuYzogT25seSBhdHRlbXB0IHRvIGluY2x1ZGUgc3lzL3Jlc291cmNlLmggYW5kCi0JdXNlIGdldHJ1c2FnZSBpZiBib3RoIEhBVkVfR0VUUlVTQUdFIGFuZCBIQVZFX1NZU19SRVNPVVJDRV9ICi0JYXJlIGRlZmluZWQuCi0KLTE5OTktMDQtMjAgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCUZpeCBmcm9tIERhbGUgSGF3a2luczoKLQkqIGNwbHVzLWRlbS5jIChtb3BfdXApOiBTZXQgdHlwZXZlY19zaXplIHRvIHplcm8sIHNvIGl0J2xsIGJlIAotCXJlYWxsb2NhdGVkIHByb3Blcmx5IGlmIHdlIHVzZSBpdCBhZ2Fpbi4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IENoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bi4gIEJlCi0Jc3RyaWN0ZXIgYWJvdXQgc3ludGF4LiAgQWx3YXlzIG51bGwtdGVybWluYXRlIHN0cmluZy4KLQotCUZpeCBmcm9tIE1hcmN1cyBEYW5pZWxzOgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IERvbid0IHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUKLQlpZGVudGlmaWVyIGxvb2tpbmcgZm9yIGFub3RoZXIgdW5kZXJzY29yZS4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLWNvbmYuaCAoYWxsb2NhKSBbQ19BTExPQ0FdOiBEb24ndCB1c2UgR2NjIGJ1aWx0aW4KLQlvciA8YWxsb2NhLmg+LgotCSogY2xvY2suYyAoR05VX0haKTogTmV3IGRlZmluaXRpb24uCi0JKGNsb2NrKTogVXNlIGl0LgotCSogZ2V0cnVudGltZS5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnLnRhYmxlOiBVc2UgbWgtYmVvcy4KLQkqIGNvbmZpZy9taC1iZW9zOiBOZXcgZmlsZS4KLQotMTk5OS0wNC0wMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogQXR0ZW1wdCB0byBoYW5kbGUgb3ZlcmZsb3dzIGluIGNvdW50cyB3aXRoIHNvbWUKLQlzZW1ibGFuY2Ugb2YgZ3JhY2UuCi0JKGNvbnN1bWVfY291bnQpOiBEZXRlY3Qgb3ZlcmZsb3dzLiAgUmV0dXJuIC0xIHRvIGluZGljYXRlIGVycm9ycywKLQlpbnN0ZWFkIG9mIHplcm8uCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0sIGRlbWFuZ2xlX3RlbXBsYXRlKTogSGFuZGxlIGNoYW5nZQotCXRvIGNvbnN1bWVfY291bnQncyByZXR1cm4gY29udmVudGlvbi4KLQotVGh1IEFwciAgOCAxNDo0MzoyOCAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHhtYWxsb2MuYywgcGV4ZWN1dGUuYzogRGVmaW5lIF9fQ1lHV0lOX18gd2hlbiBiZWluZyBjb21waWxlZAotIAl3aXRoIG9sZCBfX0NZR1dJTjMyX18gY29tcGlsZXIuCi0KLTE5OTktMDQtMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzKTogRGVmaW5lLgotCi0xOTk5LTAzLTMwICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfY29tcGFyZV9pbnRzKTogRGVmaW5lLgotCi0xOTk5LTAzLTMwICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogSWYgYGNvdW50JyB3cmFwcywgcmV0dXJuIDAgYW5kCi0JZG9uJ3QgYWR2YW5jZSBpbnB1dCBwb2ludGVyLgotCShkZW1hbmdsZV9jbGFzc19uYW1lKTogSWYgY29uc3VtZV9jb3VudCBkaWRuJ3QgZmluZCBhIGNvdW50LCBkbwotCW5vdGhpbmcuICBEb24ndCBib3RoZXIgd2l0aCBgc3RybGVuJyBzYW5pdHkgY2hlY2s7IGNvbnN1bWVfY291bnQKLQlkb2VzIGl0IGZvciB1cy4KLQotMTk5OS0wMy0xNiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JRnJvbSBBcnQgSGFhcyAgPGFoYWFzQG5lb3NvZnQuY29tPjoKLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBEb24ndCBncmFiIGFsbCB0aGUgJ19fJyBzdHJpbmdzCi0Jd2hlbiBkb2luZyBhcm0gb3IgaHAgc3R5bGUuCi0JKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogRGVjciBmb3JnZXR0aW5nX3R5cGVzIGZpZWxkIHdoZW4gZG9uZS4KLQkKLVRodSBNYXIgMTEgMDE6MjI6NTggMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHBleGVjdXRlLmMgKF9fQ1lHV0lOMzJfXyk6IFJlbmFtZSB0bwotCShfX0NZR1dJTl9fKTogdGhpcy4KLQkqIHhtYWxsb2MuYzogTGlrZXdpc2UuCi0KLQlDaGFuZ2VzIHRvIHN1cHBvcnQgaTM4Ni1wYy11d2luLgotCSogY29uZmlndXJlLmluICgqLSotdXdpbiopOiBXb3JrYXJvdW5kIGZvciB2Zm9yayBidWcuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBwZXhlY3V0ZS5jIChwZXhlY3V0ZSk6IEJlIGxpa2Ugc3RhbmRhcmQgVW5peC4KLQkocHdhaXQpOiBMaWtld2lzZS4KLQkqIHhtYWxsb2MuYyAoZmlyc3RfYnJlYWspOiBEZWZpbmUuCi0JKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IFVzZS4KLQkoeG1hbGxvYyk6IFVzZS4KLQotVGh1IE1hciAxMSAwMTowNzo1NSAxOTk5ICBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBDbGVhbnVwIGFuZCBhZGQgbWgtKnBpYyBoYW5kbGluZyBmb3IgYWxwaGEsIGFybSwgcG93ZXJwYwotCi1TdW4gRmViIDI4IDIyOjMwOjQ0IDE5OTkgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogQ2hlY2sgY3lnd2luKiwgbm90IGN5Z3dpbjMyKi4KLQotVHVlIEZlYiAgOSAxNjozOTowMSAxOTk5ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgbWtzdGVtcCAtPiBta3N0ZW1wcy4KLQotVHVlIEZlYiAgOSAwMToxMjoyNyAxOTk5ICBNYXJjIEVzcGllIDxNYXJjLkVzcGllQGxpYWZhLmp1c3NpZXUuZnI+Ci0KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiByZW1vdmUgbWtzdGVtcC5vCi0JKiBjb25maWd1cmUuaW4gKGZ1bmNzKTogQ2hlY2sgZm9yIGFuZCBjb25kaXRpb25hbGx5IGFkZCBta3N0ZW1wcyB0bwotCXRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBsaWJpYmVydHkgd2lsbCBwcm92aWRlLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCQotV2VkIEZlYiAgMyAwMDowMToxNSAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY2xvY2suYyAoSFopOiBEZWZpbmUgaW4gdGVybXMgb2YgKElTTyBDKSBDTE9DS1NfUEVSX1NFQyBvbiAKLQlwbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIEhaLgotCSogZ2V0cnVudGltZS5jIChIWik6IExpa2V3aXNlLgotCi1TYXQgSmFuIDMwIDEzOjI4OjA0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh4c3RyZHVwLm8pOiBEZXBlbmQgb24gY29uZmlnLmguCi0KLVdlZCBKYW4gMTMgMDc6MjY6NDQgMTk5OSAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBjcGx1cy1kZW0uYyAobW9wX3VwKTogU2V0IHdvcmstPnByZXZpb3VzX2FyZ3VtZW50IHRvIE5VTEwgYWZ0ZXIKLQlmcmVlaW5nIGl0LgotCi1XZWQgSmFuIDEzIDE0OjE2OjM2IDE5OTkgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogeHN0cmR1cC5jICh4c3RyZHVwKTogU3dpdGNoIGZyb20gc3RyY3B5IHRvIG1lbWNweSBmb3Igc3BlZWQuCi0KLVR1ZSBKYW4gIDUgMTU6NTg6MjkgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogZml4IHR5cG8sIHNwbGF5LXRyZWUuYyBpbnN0ZWFkIG9mCi0Jc3BsYXktdHJlZS5vLgotCi0xOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgotCi0xOTk4LTEyLTMwICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcmFuZG9tLmMgKE5VTEwpOiBEb24ndCByZWRlZmluZSBOVUxMIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZC4KLQotVHVlIERlYyAyMiAwOTo0MzozNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGFyZ3YuYyAoYnVpbGRhcmd2KTogQ2FzdCB0aGUgcmVzdWx0IG9mIGFsbG9jYSBpbiBhc3NpZ25tZW50LgotCi0JKiBjaG9vc2UtdGVtcC5jOiBJbmNsdWRlIHN0ZGxpYi5oLgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogUmVtb3ZlIHVudXNlZCBwcm90b3R5cGUuCi0gIAkoc25hcmZfbnVtZXJpY19saXRlcmFsKTogQ29uc3RpZnkgZmlyc3QgcGFyYW1ldGVyLgotICAJKGNvZGVfZm9yX3F1YWxpZmllcik6IEF2b2lkIGEgZ2NjIGV4dGVuc2lvbiwgbWFrZSB0aGUgcGFyYW1ldGVyIGFuCi0gCWludCwgbm90IGEgY2hhci4KLQkoZGVtYW5nbGVfcXVhbGlmaWVyKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IENhc3QgdGhlIGFyZ3VtZW50IG9mIGEgY3R5cGUgZnVuY3Rpb24gdG8KLQl1bnNpZ25lZCBjaGFyLgotCShhcm1fcHQpOiBBZGQgcGFyZW5zIGFyb3VuZCBhc3NpZ25tZW50IHVzZWQgYXMgdHJ1dGggdmFsdWUuCi0JKGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSk6IENvbnN0aWZ5IHZhcmlhYmxlIGBhcmdzJy4KLQkoZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUpOiBDYXN0IHRoZSBhcmd1bWVudCBvZiBhIGN0eXBlCi0JZnVuY3Rpb24gdG8gdW5zaWduZWQgY2hhci4KLQkoZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGknLgotCShzbmFyZl9udW1lcmljX2xpdGVyYWwpOiBDb25zdGlmeSBwYXJhbWV0ZXIgYGFyZ3MnLgotCUNhc3QgdGhlIGFyZ3VtZW50IG9mIGEgY3R5cGUgZnVuY3Rpb24gdG8gdW5zaWduZWQgY2hhci4KLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfdG9fZG91YmxlKTogQWRkIGV4cGxpY2l0IGJyYWNlcyB0bwotIAlhdm9pZCBhbWJpZ3VvdXMgYGVsc2UnLgotCi0JKiBmbm1hdGNoLmMgKGZubWF0Y2gpOiBDaGFuZ2UgdHlwZSBvZiB2YXJpYWJsZXMgYGMnLCBgYzEnLAotIAlgY3N0YXJ0JyBhbmQgYGNlbmQnIHRvIHVuc2lnbmVkIGNoYXIuICBDYXN0IHRoZSBhcmd1bWVudCBvZiBtYWNybwotIAlgRk9MRCcsIHdoaWNoIHVzZXMgY3R5cGUgZnVuY3Rpb25zLCB0byB1bnNpZ25lZCBjaGFyLgotCi0JKiBvYmphbGxvYy5jIChmcmVlKTogQWRkIHByb3RvdHlwZS4KLQotU3VuIERlYyAyMCAxNjowMzo0NiAxOTk4ICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLnNlPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogRml4IHR5cG86IHNwbGF5LXRyZWUuYywgbm90IHNwbGF5LXRyZWUubwotCi1GcmkgRGVjIDE4IDE3OjUwOjE4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogcmVtb3ZlIGRlY2xhcmF0aW9uIC0tIGZ1bmN0aW9uCi0gCWRvZXNuJ3QgZXhpc3QuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwpOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBpJy4KLQkKLUZyaSBEZWMgMTggMTY6MTE6NDMgRVNUIDE5OTggIEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFByb2Nlc3MgQ1YgYW5kIHUgY29kZXMgYmVmb3JlCi0JYnVtcGluZyB0aGUgcG9pbnRlciB3ZSByZWFkIGZyb20uIEFsc28gcHJlcGVuZCB0aGVzZSBjb2RlcywKLQlhcyB3ZSBkbyBpbiBvdGhlciBwbGFjZXMuCi0KLTE5OTgtMTItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUpOiBNYWtlIHZhcmlhYmxlICdhcmdzJyBiZQotCSdjb25zdCBjaGFyIConIGluIG9yZGVyIHRvIG1hdGNoIGl0cyB1c2FnZSB3aGVuIGNhbGxpbmcgc2libGluZ3MuCi0JKHNuYXJmX251bWVyaWNfbGl0ZXJhbCk6IE1ha2UgZmlyc3QgYXJnICdjb25zdCBjaGFyICoqJyBpbiBvcmRlcgotCXRvIG1hdGNoIHVzYWdlLgotCi1Nb24gRGVjIDE0IDA5OjU1OjUwIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY2hvb3NlLXRlbXAuYzogRG9uJ3QgY2hlY2sgSU5fR0NDIGFueW1vcmUuCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlKTogVXNlIGBjb25zdCcsIG5vdCBgQ09OU1QnLgotCSogbWVtY2hyLmMgKG1lbWNocik6IExpa2V3aXNlLgotCSogbWVtY3B5LmMgKG1lbWNweSk6IExpa2V3aXNlLgotCSogbWVtbW92ZS5jIChtZW1tb3ZlKTogTGlrZXdpc2UuCi0KLQkqIG1rc3RlbXAuYzogRG9uJ3QgY2hlY2sgSU5fR0NDIGFueW1vcmUuCi0JKiBwZXhlY3V0ZS5jOiBMaWtld2lzZS4KLQkqIHNwbGF5LXRyZWUuYzogTGlrZXdpc2UuCi0KLQkqIHN0cmNoci5jIChzdHJjaHIpOiBVc2UgYGNvbnN0Jywgbm90IGBDT05TVCcuCi0JKiBzdHJyY2hyLmMgKHN0cnJjaHIpOiBMaWtld2lzZS4KLQkqIHN0cnRvbC5jIChzdHJ0b2wpOiBMaWtld2lzZS4KLQkqIHN0cnRvdWwuYyAoc3RydG91bCk6IExpa2V3aXNlLgotCi1GcmkgRGVjICA0IDEzOjUxOjA0IDE5OTggIERhdmlkIFRheWxvciAgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQkJCSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGN5Z251cy5jb20+Ci0JCQkgIFN0YW4gU2hlYnMgICAgIDxzaGVic0BjeWdudXMuY29tPgotCQkJICBFZGl0aCBFcHN0ZWluICA8ZWVwc3RlaW5AY3lnbnVzLmNvbT4KLQkJCSAgQW5kcmVzIE1hY0xlb2QgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0JCQkgIFNhdGlzaCBQYWkJIDxwYWlAYXBvbGxvLmhwLmNvbT4KLQotCSogSFAgYUNDIGRlbWFuZ2xpbmcgc3VwcG9ydC4KLQkqIGNwbHVzLWRlbS5jCi0JKG1haW4pOiBSZW1vdmUgZGVmYXVsdCB0byBIUCBzdHlsZSBkZW1hbmdsaW5nLCBzZXQgdG8gRURHCi0gCWRlbWFuZ2xpbmcgY29ycmVjdGx5IHdoZW4gLWVkZyBzcGVjaWZpZWQ7IHNldCB0aGUgZGVtYW5nbGluZyBzdHlsZQotIAl3aGVuIHVzZXIgc3BlY2lmaWVzICdlZGcnLiBTZXQgc3RyaXBfdW5kZXJzY29yZSB0bwotIAlwcmVwZW5kc191bmRlcnNjb3JlLCBpZiBub3QgSFBVWEhQUEEuICBTZXQKLSAJY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlIHRvIGhwX2RlbWFuZ2xpbmcgaWYgSFBVWEhQUEEuICBTZXQKLSAJY3VycmVudCBkZW1hbmdsaW5nIHN0eWxlIGNvcnJlY3RseSBpZiB0aGUgc3dpdGNoIGlzIGhwLiAgUmVhZAotIAlsYWJlbCBjb3JyZWN0bHkgYWxzbyBpbiB0aGUgSFAgc3R5bGUgY2FzZS4KLQkod29ya19zdHVmZik6IGFkZCB0ZW1wX3N0YXJ0IGZpZWxkOyBhZGQgZmllbGQgZm9yIHZvbGF0aWxlIG1lbWJlcgotIAlmdW5jdGlvbi4KLQkoYXJtX3B0KTogaGFuZGxlIEFSTV9ERU1BTkdMSU5HIGFuZCBFREdfREVNQU5HTElORyBzdHlsZXM7IEhQCi0gCXN0eWxlIGZvciB0aGlzIGNhc2UgaXMgdGhlIHNhbWUgYXMgQVJNLgotCShkZW1hbmdsZV9hcmdzKTogaGFuZGxlIEVER19ERU1BTkdMSU5HIHN0eWxlOyBzdXBwb3J0IEhQIHN0eWxlLgotCShkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUpOiBuZXcgZnVuY3Rpb24uIChJdCB3YXMKLSAJZGVtYW5nbGVfYXJtX3B0Lik7IGNoZWNrIGFuZCBzZXQgdmFsdWUgb2YgdGVtcF9zdGFydCBmaWVsZCBpbgotIAltdWx0aXBsZSBwbGFjZXMuIEFsc28sIHdoZW4gY2VjaGluZyBmb3IgZW5kIG9mIHRlbXBsYXRlIGFyZ3MsCi0gCWNoZWNrIHRvIHNlZSBpZiBhdCBlbmQgb2Ygc3RhdGljIG1lbWJlciBvZiB0ZW1wbGF0ZSBjbGFzcy4KLQkoZGVtYW5nbGVfY2xhc3MpOiBuZXcgbG9jYWwgdmFyaWFibGUgOiBzYXZlX2NsYXNzX25hbWVfZW5kIERvbid0Ci0gCWluY2x1ZGUgdGVtcGxhdGUgYXJncyBpbiBzdHJpbmcgZGVmaW5pbmcgY2xhc3MuCi0JKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiB1c2UgZGVtYW5nZWxfYXJtX2hwX3RlbXBsYXRlLgotCShkZW1hbmdsZV9mdW5jdGlvbl9uYW1lKTogaGFuZGxlIGNhc2Ugd2hlcmUgZGVtYW5nbGluZyBzdHlsZSBpcwotIAlIUF9ERU1BTkdMSU5HIGFuZCBjdXJyZW50bHkgcG9pbnQgYXQgYW4gJ1gnIGluIHRoZSBtYW5nbGVkIG5hbWUuCi0gIAlIYW5kbGUgRURHX0RFTUFOR0xJTkcgc3R5bGUuICBIYW5kbGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKLSAJb3BzIGZvciBIUCBzdHlsZS4KLQkoZGVtYW5nbGVfcHJlZml4KTogaGFuZGxlIEVER19ERU1BTkdMSU5HIGFuZCBBUk1fREVNQU5HTElORwotIAlzdHlsZXMuICBnbG9iYWwgZGVzdHJ1Y3RvciBhbmQgY29uc3RydWN0b3IgZm9yIEhQIHN0eWxlIGFyZSBzYW1lCi0gCWFzIGZvciBBUk0gc3R5bGUuIFNhbWUgZm9yIGxvY2FsIHZhcmlhYmxlcy4KLQkoZGVtYW5nbGVfcXVhbGlmaWVkKTogaGFuZGxlIEVER19ERU1BTkdMSU5HIHN0eWxlLgotCShkZW1hbmdsZV9zaWduYXR1cmUpOiBhZGQgY2FzZSBmb3Igdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uLiAgRm9yCi0gCWNhc2VzICcxJyAtICc5JyA6IGluaXRpYWxpemUgdGhlIHRlbXBfc3RhcnQgZmllbGQgdG8gLTEgYW5kIGhhbmRsZQotIAl0aGUgRURHX0RFTUFOR0xJTkcgc3R5bGUuICBmb3IgY2FzZSAnRicgOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcKLSAJYW5kIEFVVE9fREVNQU5HTElORyBzdHlsZXMuICBJZiBleHBlY3RpbmcgYSBmdW5jdGlvbiBhbmQgbWFuYWdlZAotIAl0byBkZW1hbmdsZSB0aGUgZnVuY3QgYXJncywgdGhlbiBoYW5kbGUgdGhlIExVQ0lEX0RFTUFOR0xJTkcsCi0gCUFSTV9ERU1BTkdMSU5HLCBhbmQgRURHX0RFTUFOR0xJTkcgc3R5bGVzLiAgQWRkIGNhc2UgZm9yIGxvY2FsCi0gCWNsYXNzIG5hbWUgYWZ0ZXIgIkxubm5fIGluIEhQIHN0eWxlIGNhc2UuIEhQIHN0eWxlIHRvbyBuZWVkcyB0bwotIAlmb3JnZXQgdHlwZXMuICBfbm5uIGlzIE9LIGZvciBIUCBzdHlsZSwgc28gZG9uJ3QgcmVwb3J0IGZhaWx1cmUuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlKTogbmV3IGZ1bmN0aW9uLiBIYW5kbGUgdGVtcGxhdGUncwotIAl2YWx1ZSBwYXJhbSBmb3IgSFAvYUNDLgotCShkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsKTogbmV3IGZ1bmN0aW9uLiAgSGFuZGxlIGEgdGVtcGxhdGUncwotIAlsaXRlcmFsIHBhcmFtZXRlciBmb3IgSFAgYUNDLgotCShyZWN1cnNpdmVseV9kZW1hbmdsZSk6IG5ldyBmdW5jdGlvbgotCShzbmFyZl9udW1lcmljX2xpdGVyYWwpOiBuZXcgZnVuY3Rpb24uCi0JKHVzYWdlKTogYWRkICdlZGcnIHRvIHRoZSBsaXN0IG9mIGRlbWFuZ2xpbmcgc3R5bGVzOyBhZGQgaHAgc3dpdGNoCi0gCXRvIG1lc3NhZ2UuCi0KLVNhdCBOb3YgMjggMTc6MjU6MjIgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogUmVtb3ZlIG9ic29sZXRlIGlmZGVmZWQgY3lnd2luIGNvZGUuCi0KLUZyaSBOb3YgMjcgMTM6MjY6MDYgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjaG9vc2UtdGVtcC5jOiBBbHdheXMgaW5jbHVkZSBsaWJpYmVydHkuaC4gIEF2b2lkIHJlZHVuZGFuY2llcy4KLQkqIGNwbHVzLWRlbS5jOiBMaWtld2lzZS4gIENvbmZvcm0gdG8gbGliaWJlcnR5LmguCi0JKiBwZXhlY3V0ZS5jOiBMaWtld2lzZS4KLQkqIHNwbGF5LXRyZWUuYzogTGlrZXdpc2UuCi0KLTE5OTgtMTEtMjUgIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNwbGF5LXRyZWUubyk6IEFkZCBjb25maWcuaCBkZXBlbmRlbmN5LgotCi1Nb24gTm92IDIzIDE2OjU5OjQ5IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogIGNvbmZpZ3VyZS5pbjogVXNlIEFDX1BSRVJFUSgyLjEyLjEpLgotCi0xOTk4LTExLTE2ICBCZW5qYW1pbiBLb3NuaWsgIDxia296QGhhaWdodC5jb25zdGFudC5jb20+Ci0KLSAgICAgICAgKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogQWRkIGRlbWFuZ2xpbmcgZm9yIEM5eCB0eXBlcy4KLQotVGh1IE5vdiAxOSAyMjoxNTo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1wdy5jIChtcHdfYWNjZXNzKTogQWRkIG1pc3NpbmcgcGFyZW5zLgotCi1UaHUgTm92IDE5IDEyOjU5OjIxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0hFQURFUl9TWVNfV0FJVC4KLQotCSogcGV4ZWN1dGUuYzogSW5jbHVkZSBzeXMvd2FpdC5oIHdoZW4gIUlOX0dDQy4KLQotVGh1IE5vdiAxOSAxNDozODoyMCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiByZXZlcnQgYmFjayB0byBjaGVja2luZyBvbGQgQ3lnd2luCi0JcHJlcHJvY2Vzc29yIHN5bWJvbCB1bnRpbCBzb21lIHRpbWUgaGFzIHBhc3NlZC4KLQotV2VkIE5vdiAxOCAwODo1MjoyNiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBSZW9yZ2FuaXplIFdJTjMyIGNhc2UgdG8gYWNjb21vZGF0ZSBDeWd3aW4KLQlzaW5jZSBpdCB3aWxsIG5vdyBzdXBwb3J0IHNpbWlsYXIgY29uc3RydWN0cy4KLQotRnJpIE5vdiAxMyAxOToxODowNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGNhbGxvYy4KLQotCSogY2FsbG9jLmM6IE5ldwlmaWxlLgotCi0JKiB4bWFsbG9jLmMgKHhjYWxsb2MpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBOb3YgMTMgMDg6NTE6NDYgRVNUIDE5OTggIEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSpjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogVXNlIHRoZSBsYXN0ICJfXyIKLQlpbiB0aGUgbWFuZ2xlZCBuYW1lIHdoZW4gbG9va2luZyBmb3IgdGhlIHNpZ25hdHVyZS4gVGhpcyBhbGxvd3MKLQl0ZW1wbGF0ZSBuYW1lcyB0byBiZWdpbiB3aXRoICJfXyIuCi0KLTE5OTgtMTEtMDggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jICh0eXBlX2tpbmRfdCk6IEFkZCB0a19yZWZlcmVuY2UuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBIYW5kbGUgaXQuCi0JKGRvX3R5cGUpOiBVc2UgaXQgZm9yIHJlZmVyZW5jZXMsIGluc3RlYWQgb2YgdGtfcG9pbnRlci4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBVc2UgY3BsdXNfZGVtYW5nbGUsCi0Jbm90IGludGVybmFsX2NwbHVzX2RlbWFuZ2xlLgotCi1TYXQgTm92ICA3IDE2OjAyOjEwIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY2hvb3NlLXRlbXAuYzogRG9uJ3QgaW5jbHVkZSBnYW5zaWRlY2wuaC4KLQkqIG1rc3RlbXAuYzogTGlrZXdpc2UuCi0JKiBwZXhlY3V0ZS5jOiBMaWtld2lzZS4KLQotTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1Nb24gTm92ICAyIDEwOjIyOjAxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogcGV4ZWN1dGUuYzogQ2hlY2sgSEFWRV9DT05GSUdfSCwgbm90IElOX0dDQywgd2hlbiBkZXRlcm1pbmluZwotIAl3aGV0aGVyIHRvIGluY2x1ZGUgY29uZmlnLmguICBQb3NzaWJseSBpbmNsdWRlIHVuaXN0ZC5oIGluIHRoZQotIAkhSU5fR0NDIGNhc2UuICBEZWZpbmUgVkZPUktfU1RSSU5HIGFzIGEgcHJpbnRhYmxlIGZ1bmN0aW9uIGNhbGwKLSAJZm9yIGVycm9yIG1lc3NhZ2VzIChlaXRoZXIgInZmb3JrIiBvciAiZm9yayIuKSAgSWYgSEFWRV9WRk9SS19IIGlzCi0gCWRlZmluZWQsIGluY2x1ZGUgdmZvcmsuaC4gIElmIFZNUyBpcyBkZWZpbmVkLCBkZWZpbmUgdmZvcmsoKQotIAlhcHByb3ByaWF0ZWx5LiAgUmVtb3ZlIHZmb3JrIGNoZWNrIG9uIFVTRywgd2UncmUgdXNpbmcgYXV0b2NvbmYuCi0gIAkocGV4ZWN1dGUpOiBTZXQgYGVycm1zZ19mbXQnIHRvIFZGT1JLX1NUUklORyBpbnN0ZWFkIG9mIGNoZWNraW5nCi0gCWxvY2FsbHkgd2hhdCBzdHJpbmcgdG8gdXNlLgotCi0xOTk4LTEwLTI2ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBzcGxheS10cmVlLmM6IFR3ZWFrIGluY2x1ZGUgZGlyZWN0aXZlcyB0byBtYWtlIHN1cmUgZGVjbGFyYXRpb25zIG9mCi0JeG1hbGxvYyBhbmQgZnJlZSBhcmUgYXZhaWxhYmxlLgotCi0xOTk4LTEwLTI1ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBGaXggaGFuZGxpbmcgb2YgdmlydHVhbCB0YWJsZXMgaW4KLQlhbm9ueW1vdXMgbmFtZXNwYWNlcy4KLQotMTk5OC0xMC0yMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHdvcmtfc3R1ZmYpOiBSZXBsYWNlIGNvbnN0X3R5cGUgYW5kIHZvbGF0aWxlX3R5cGUKLQl3aXRoIHR5cGVfcXVhbHMuCi0JKFRZUEVfVU5RVUFMSUZJRUQpOiBOZXcgbWFjcm8uCi0JKFRZUEVfUVVBTF9DT05TVCk6IExpa2V3aXNlLgotCShUWVBFX1FVQUxfVk9MQVRJTEUpOiBMaWtld2lzZS4KLQkoVFlQRV9RVUFMX1JFU1RSSUNUKTogTGlrZXdpc2UuCi0JKGNvZGVfZm9yX3F1YWxpZmllcik6IE5ldyBmdW5jdGlvbi4KLQkocXVhbGlmaWVyX3N0cmluZyk6IExpa2V3aXNlLgotCShkZW1hbmdsZV9xdWFsaWZpZXIpOiBMaWtld2lzZS4KLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBVc2UgdGhlbS4KLQkoZGVtYW5nbGVfc2lnbmF0dXJlKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBMaWtld2lzZS4KLQkoZG9fdHlwZSk6IExpa2V3aXNlLgotCShkZW1hbmdsZV9mdW5kX3R5cGUpKTogTGlrZXdpc2UuCi0KLVRodSBPY3QgMjIgMTk6NTg6NDMgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIpOiBNYWtlIGRlZmluaXRpb24gc3RhdGljCi0JdG8gbWF0Y2ggcHJvdG90eXBlLgotCi0xOTk4LTEwLTIxICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBzcGxheS10cmVlLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBpdC4KLQkoUkVRVUlSRURfT0ZJTEVTKTogTGlrZXdpc2UuCi0JKHNwbGF5LXRyZWUubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBPY3QgMjAgMTI6Mjk6MDIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkKTogRml4IG9mZi1ieS1vbmUgd2hlbiBjaGVja2luZwotCXJhbmdlIG9mICdLJyBpbmRleC4KLQotVGh1IE9jdCAxNSAxODo1MToxMiAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmM6IFByb3RvdHlwZSBta3N0ZW1wcygpIHdoZW4gSU5fR0NDLgotCi0JKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6IENhc3QgYXJndW1lbnQgb2YgY3R5cGUgbWFjcm8gdG8KLQlgdW5zaWduZWQgY2hhcicuCi0JKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCShjcGx1c19tYW5nbGVfb3BuYW1lKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0bwotCWB1bnNpZ25lZCBjaGFyJy4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IExpa2V3aXNlLgotCShkZW1hbmdsZV90ZW1wbGF0ZSk6IEluaXRpYWxpemUgdmFyaWFibGUgYGJpbmRleCcuICBDYXN0IHRoZQotCXJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4gIFJlbW92ZQotCXVudXNlZCB2YXJpYWJsZSBgc3RhcnRfb2ZfdmFsdWVfcGFybScuCi0JKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQkoZGVtYW5nbGVfcHJlZml4KTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCi0JKGdudV9zcGVjaWFsKTogTGlrZXdpc2UuICBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkKLQl3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQkoZGVtYW5nbGVfcXVhbGlmaWVkKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCi0JKGdldF9jb3VudCk6IExpa2V3aXNlLgotCShkb190eXBlKTogTGlrZXdpc2UuICBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCi0JKGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUpOiBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkKLQl3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQotCSogbWtzdGVtcC5jIChta3N0ZW1wcyk6IENhc3QgdmFyaWFibGUgYGxlbicgdG8gKGludCkgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQotVHVlIE9jdCAxMyAyMzo1MTo1MSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBta3N0ZW1wLmM6IENoZWNrIEhBVkVfU1lTX1RJTUVfSCBiZWZvcmUgaW5jbHVkaW5nIHN5cy90aW1lLmgKLSAgICAgICAgKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3lzL3RpbWUuaCB0b28uCi0gICAgICAgICogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLQkqIGdldG9wdC5jOiBDaGVjayBIQVZFX1NUUklOR1NfSCBiZWZvcmUgaW5jbHVkaW5nIHN0cmluZ3MuaC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IENoZWNrIGZvciBzdHJpbmdzLmggdG9vLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBPY3QgMTIgMTk6MTU6NTkgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogaW4gY29tbWVudCwgY2FsbCBBQ19FWEVFWFQgaW5zdGVhZCBvZiBBTV9FWEVFWFQKLQotU3VuIE9jdCAxMSAxNzozNjowNiAxOTk4ICBNaWNoYWVsIFRpZW1hbm4gIDx0aWVtYW5uQGhvbG9kZWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjcGx1cy1kZW0ubywgb2JzdGFjay5vKTogRGVwZW5kIHVwb24gY29uZmlnLmguCi0KLVRodSBPY3QgIDggMjM6NDI6MDggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNZXJnZSBlZ2NzICYgZGV2byBsaWJpYmVydHkuCi0KLTE5OTgtMDktMDggIE1hcnRpbiB2b24gTPZ3aXMgIDxsb2V3aXNAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiBEZW1hbmdsZSBhbm9ueW1vdXMgbmFtZXNwYWNlcy4KLQotTW9uIFNlcCAgNyAyMzoyOTowMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIG1rc3RlbXAuYzogSW5jbHVkZSBjb25maWcuaCBldmVuIHdoZW4gbm90IElOX0dDQy4gIFdyYXAgaGVhZGVyCi0gCWluY2x1c2lvbnMgaW5zaWRlIEhBVkVfKl9IIG1hY3Jvcy4gIEluY2x1ZGUgYW5zaWRlY2wuaCB3aGVuIG5vdAotIAlJTl9HQ0MuCi0KLQkqIHZhc3ByaW50Zi5jOiBJbmNsdWRlIHN0ZGFyZy5oL3ZhcmFyZ3MuaCBmaXJzdC4KLQotCSogdnByaW50Zi5jOiBMaWtld2lzZS4KLQotU2F0IFNlcCAgNSAwMzoyNDo0OSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBleGVjdXRlLmM6IFVwZGF0ZXMgZnJvbSBnY2MuICBDb3B5IGluIGdjYyBoYXMgYmVlbiByZW1vdmVkLiAgVGhpcwotCWlzIHRoZSBjYW5vbmljYWwgY29weS4gIERlZmluZSBJU1NQQUNFIGlmICFJTl9HQ0MuCi0JKiBhbGxvY2EuYywgdmZwcmludGYuYywgY2hvb3NlLXRlbXAuYywgbWtzdGVtcC5jLCBnZXRvcHQuYzogU2ltaWxhcmx5LgotCSogZ2V0b3B0MS5jLCBvYnN0YWNrLmM6IFNpbWlsYXJseS4KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBta3N0ZW1wLm8KLQotVHVlIFNlcCAgMSAyMzoxMjo0NyAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgYXNwcmludGYgaW4gbGlzdCBvZiBmdW5jdGlvbnMga25vd24gbm90Ci0JdG8gYmUgaW4gbmV3bGliLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXVnIDE5IDE0OjA1OjAxIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAod29ya19zdHVmZik6IEFkZCBkbGxpbXBvcnRlZC4KLQkoZGVtYW5nbGVkX3ByZWZpeCk6IE1hcmsgc3ltYm9scyBpbXBvcnRlZCBmcm9tIFBFIERMTC4KLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGVkKTogSGFuZGxlLgotCi0xOTk4LTA4LTE3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogRml4IHNpbXBsZSBhcnJheSBoYW5kbGluZy4gIElmIHdlIGZhaWwsCi0Jc3RheSBmYWlsZWQuCi0KLU1vbiBBdWcgMTcgMTA6NDA6MzQgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjcGx1cy1kZW0uYzogSW5jbHVkZSBjb25maWcuaCBpZiBpdCBleGlzdHMuICBBbHNvLCBvbmx5Ci0JcHJvdG90eXBlIG1hbGxvYy9yZWFsbG9jIGlmIHdlIGNhbid0IGdldCBzdGRsaWIuaC4KLQotU2F0IEF1ZyAxNSAxNjoxNTowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3dpdGNoIGJhY2sgdG8gY2hlY2tpbmcgLS13aXRoLXRhcmdldC1zdWJkaXIgd2hlbgotCWRlY2lkaW5nIHdoZXRoZXIgdG8gY2hlY2sgZm9yIG5ld2xpYiwgdW5kb2luZyBwYXJ0IG9mIEp1bHkgMTUKLQljaGFuZ2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBBdWcgMTMgMTY6NDc6MzggMTk5OCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHR5cGVfa2luZF90KTogTmV3IHR5cGUuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBBZGQgdHlwZV9raW5kX3QgcGFyYW1ldGVyLiAgUmVseQotCW9uIHRoaXMgcGFyYW10ZXIsIHJhdGhlciB0aGFuIGRlbWFuZ2xpbmcgdGhlIHR5cGUgYWdhaW4uCi0JKGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlKTogUGFzcyB0a19pbnRlZ3JhbC4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfOiBQYXNzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGRvX3R5cGUuCi0JKGRvX3R5cGUpOiBSZXR1cm4gYSB0eXBlX2tpbmRfdC4gIFBhc3MgdGtfaW50ZWdyYWwgdG8KLQlkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIGZvciBhcnJheSBib3VuZHMuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IExpa2V3aXNlLgotCi0JQWxzbyBpbmNvcnBvcmF0ZSBmcm9tIEdDQyB2ZXJzaW9uOgotCi0JVHVlIEp1bCAyMSAxMzoyODoxOSAxOTk4ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogVXNlIGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gZm9yIGFycmF5cy4KLQotVGh1IEF1ZyAxMyAxNjo0NzozOCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IE1ha2UgZnVuY3Rpb24gZGVmaW5pdGlvbgotCXN0YXRpYyB0byBtYXRjaCB0aGUgcHJvdG90eXBlLgotCi1UdWUgSnVsIDI4IDExOjMzOjA5IDE5OTggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jICh0eXBlX2tpbmRfdCk6IE5ldyB0eXBlLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogQWRkIHR5cGVfa2luZF90IHBhcmFtZXRlci4gIFJlbHkKLQlvbiB0aGlzIHBhcmFtdGVyLCByYXRoZXIgdGhhbiBkZW1hbmdsaW5nIHRoZSB0eXBlIGFnYWluLgotCShkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSk6IFBhc3MgdGtfaW50ZWdyYWwuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlXzogUGFzcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBkb190eXBlLgotCShkb190eXBlKTogUmV0dXJuIGEgdHlwZV9raW5kX3QuICBQYXNzIHRrX2ludGVncmFsIHRvCi0JZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBmb3IgYXJyYXkgYm91bmRzLgotCShkZW1hbmdsZV9mdW5kX3R5cGUpOiBMaWtld2lzZS4KLQotCUFsc28gaW5jb3Jwb3JhdGUgZnJvbSBHQ0MgdmVyc2lvbjoKLQotCVR1ZSBKdWwgMjEgMTM6Mjg6MTkgMTk5OCAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IFVzZSBkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIGZvciBhcnJheXMuCi0KLU1vbiBKdWwgMjcgMTI6MTY6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMT0NBKTogTmV3IHZhcmlhYmxlLgotCSgkKFRBUkdFVExJQikpOiBBZGQgJChBTExPQ0EpIHRvIGxpYnJhcnkuCi0JKG5lZWRlZC1saXN0KTogQWRkICQoQUxMT0NBKS4KLQkoJChBTExPQ0EpKTogRGVwZW5kIHVwb24gc3RhbXAtcGljZGlyLgotCi1TdW4gSnVsIDE5IDA4OjIzOjE3IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogTWFrZSBmdW5jdGlvbiBkZWZpbml0aW9uCi0Jc3RhdGljIHRvIG1hdGNoIHRoZSBwcm90b3R5cGUuCi0KLVdlZCBKdWwgMTUgMDA6MTI6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIC0td2l0aC1jcm9zcy1ob3N0IHJhdGhlciB0aGFuCi0JLS13aXRoLXRhcmdldC1zdWJkaXIgd2hlbiBkZWNpZGluZyB3aGV0aGVyIGJ1aWxkIHVzZXMgYSBjcm9zcwotCWNvbXBpbGVyLCBhbmQgd2hlbiBkZWNpZGluZyB3aGVyZSB0byBpbnN0YWxsIHRoZSBsaWJyYXJ5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TdW4gSnVsIDEyIDAxOjI3OjA1IDE5OTggIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogUmV0dXJuIGEgdmFsdWUuCi0KLVNhdCBKdWwgMTEgMTY6MTk6NDggMTk5OCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHN0cmluZyk6IE1vdmUgZGVmaW5pdGlvbiBiZWZvcmUgd29ya19zdHVmZi4KLQkod29ya19zdHVmZik6IEFkZCB2b2xhdGlsZV90eXBlLCBmb3JnZXR0aW5nX3R5cGVzLAotCXByZXZpb3VzX2FyZ3VtZW50LCBhbmQgbnJlcGVhdHMgZmllbGRzLgotCShTQ09QRV9TVFJJTkcpOiBOZXcgbWFjcm8uCi0JKGRlbWFuZ2xlX3RlbXBsYXRlKTogQWRkIGByZW1lbWJlcicgcGFyYW1ldGVyLiAgQWRkIGNvbW1lbnQuCi0JUmVnaXN0ZXIgdGhlIGBCJyBjb2RlIHR5cGUgaGVyZSwgaWYgcmVtZW1iZXJpbmcuICBUaWR5LiAgRml4IGNyYXNoCi0Jb24gTlVMTCB0bXBsX2FyZ3ZlYy4gIEJlIGNvbnNpc3RlbnQgd2l0aCB1c2Ugb2YgdG5hbWUvdHJhd25hbWUuCi0JKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogTmV3IGZ1bmN0aW9uLgotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSk6IEhhbmRsZSB2b2xhdGlsZS1xdWFsaWZpZWQgbWVtYmVyCi0JZnVuY3Rpb25zLgotCShtb3BfdXApOiBEZWxldGUgdGhlIHByZXZpb3VzX2FyZ3VtZW50IHN0cmluZyBpZiBwcmVzZW50LgotCShkZW1hbmdsZV9zaWduYXR1cmUpOiBUaWR5LiAgSGFuZGxlIHZvbGF0aWxlLXF1YWxpZmllZCBtZW1iZXIKLQlmdW5jdGlvbnMuICBIYW5kbGUgYmFjay1yZWZlcmVuY2VzIHVzaW5nIHRoZSBgQicgY29kZS4gIFVzZSBleHRyYQotCXBhcmFtZXRlciB0byBkZW1hbmdsZV90ZW1wbGF0ZSBhbmQgU0NPUEVfU1RSSU5HIHdoZXJlIGFwcHJvcHJpYXRlLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogRml4IHRoaW5rbzsgJ0InIGlzIG5vdCBhbiBpbnRlZ3JhbAotCWNvZGUuCi0JKGRlbWFuZ2xlX2NsYXNzKTogVXNlIFNDT1BFX1NUUklORy4KLQkoZ251X3NwZWNpYWwpOiBQYXNzIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gZGVtYW5nbGVfdGVtcGxhdGUuCi0JVXNlIFNDT1BFX1NUUklORy4KLQkoZGVtYW5nbGVfcXVhbGlmaWVkKTogU2F2ZSBxdWFsaWZpZWQgdHlwZXMgZm9yIGxhdGVyCi0JYmFjay1yZWZlcmVuY2VzLiAgSGFuZGxlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlCi0JdHlwZXMgY29ycmVjdGx5LgotCShkb190eXBlKTogVGlkeS4gIFVzZSBTQ09QRV9TVFJJTkcuICBQYXNzIGV4dHJhIGFyZ3VtZW50IHRvCi0JZGVtYW5nbGVfdGVtcGxhdGUuICBVc2UgZGVtYW5nbGVkX25lc3RlZF9hcmdzLiAgRG9uJ3QgcmVtZW1iZXIKLQlxdWFsaWZpZWQgdHlwZXMgaGVyZTsgdGhhdCdzIG5vdyBkb25lIGluIGRlbWFuZ2xlX3F1YWxpZmllZC4KLQlTaW1pbGFybHkgZm9yIHRlbXBsYXRlcy4KLQkoZG9fYXJnKTogSW1wcm92ZSBjb21tbWVudC4gIEhhbmRsZSAnbicgcmVwZWF0IGNvZGUuCi0JKHJlbWVtYmVyX3R5cGUpOiBDaGVjayBmb3JnZXR0aW5nX3R5cGVzLgotCShkZW1hbmdsZV9hcmdzKTogRGVhbCB3aXRoICduJyByZXBlYXQgY29kZXMuICBUaWR5LgotCi1UaHUgSnVsICAyIDE2OjI2OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBPbmx5IHVzZSBtaC1mYnNkMjEgb24gKi0qLWZyZWVic2QyLjIuWzAxMl0sIG5vdCBvbgotCSotKi1mcmVlYnNkMi4yLiouICBGcm9tIERtaXRyaWogVGVqYmx1bSA8dGVqYmx1bUBhcmMuaHEuY3RpLnJ1Pi4KLQotTW9uIEp1biAxNSAxNjoyOTowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc2V0b2Jqcyk6IENvcnJlY3QgcXVvdGluZyBlcnJvciBpbiBjeWd3aW4zMiBjYXNlLgotCUZyb20gQ2hyaXMgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4uCi0KLU1vbiBKdW4gIDEgMTM6NDc6NTUgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotTW9uIEp1biAgMSAxNDoxNzozNiAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYSBkZXBlbmRlbmN5IG9uIHN0YW1wLXBpY2RpciBmb3IgdGhlCi0Jb2JqZWN0cywgc28gdGhhdCB3ZSBjYW4gZG8gYSBwYXJhbGxlbCBidWlsZC4KLQotU2F0IE1heSAzMCAyMjoxNzoxMyAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlndXJlLmluIChjaGVja2Z1bmNzKTogQWRkIG1pc3NpbmcgIiciLgotCi1GcmkgTWF5IDI5IDEyOjQwOjQxIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX21lbW9yeV91c2VkKTogIEVsaWRlIHRoaXMgZnVuY3Rpb24gaWYgd2UncmUKLQlvbiBhIHN5c3RlbSB3aXRoIEdOVSBsaWJjLgotCi1UdWUgTWF5IDI2IDE4OjI4OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCi1UdWUgTWF5IDI2IDE1OjAxOjUyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGFsbG9jYS1jb25mLmguCi0KLUZyaSBNYXkgMjIgMDE6Mzg6MDcgMTk5OCAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5zZT4KLQotCSogY3BsdXMtZGVtLmMgKE1CVUZfU0laRSk6IEJ1bXBlZCBmcm9tIDUxMiB0byAzMjc2Ny4KLQotMTk5OC0wNS0yMSAgTWFyayBNaXRjaGVsbCAgPG1taXRjaGVsbEB1c2EubmV0PgotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEhhbmRsZSB2b2xhdGlsZSBxdWFsaWZpY2F0aW9uLgotCi0xOTk4LTA1LTIxICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIHVuaXN0ZC5oIGFzIHdlbGwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBnZXRwYWdlc2l6ZS5jIChHTlVfT1VSX1BBR0VTSVpFKTogVXNlIHN5c2NvbmYgb25seSBpZiBfU0NfUEFHRVNJWkUKLQlpcyBkZWZpbmVkIGluIHVuaXN0ZC5oLiBSZWZvcm1hdCBjb25kaXRpb25hbCBibG9jayBmb3IgZWFzaWVyIHJlYWRpbmcuCi0KLQkqIGNvbmZpZy50YWJsZSAoc2hhcmVkKTogRGVmYXVsdCB0byBubyBpZiAke2VuYWJsZV9zaGFyZWR9Ci0JaXMgdW5zZXQgb3IgZW1wdHk7IHRoaXMgbG9naWMgaXMgdXNlZCBieSB0aGUgdG9wbGV2ZWwKLQljb25maWd1cmUgc2NyaXB0cywgdG9vLgotCi1TYXQgTWF5IDE2IDE0OjAxOjI2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiBBZGQgbGluZSB0byBzZXQgZW5hYmxlX3NoYXJlZCBpbiB0aGUgTWFrZWZpbGUKLQlhcyBuZWVkZWQuCi0KLVdlZCBNYXkgMTMgMTQ6MjQ6MzggMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoc3F1YW5nbGVfbW9wX3VwKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIHZvaWQuCi0JKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlKTogUmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgYG9wdGlvbnMnLgotCUFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IFJlbW92ZSBmdW5jdGlvbiB3aWRlIHZhcmlhYmxlIGBpbnQgaScgYW5kCi0JcmVwbGFjZSB3aXRoIGBzaXplX3QgaScgYXQgZWFjaCBsb2NhdGlvbiB3aGVyZSBpdCBpcyB1c2VkLgotCShjcGx1c19tYW5nbGVfb3BuYW1lKTogY2hhbmdlIHR5cGUgb2YgYGknIGZyb20gaW50IHRvIHNpemVfdC4KLQotV2VkIE1heSAxMyAxMzozOTozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1jb25mLmg6IEluY2x1ZGUgY29uZmlnLmguICBDaGVjayBIQVZFX0FMTE9DQV9IIHJhdGhlcgotCXRoYW4gc3BhcmMgb3Igc3VuLgotCSogTWFrZWZpbGUuaW4gKGFyZ3Yubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oIGFuZCBhbGxvY2EtY29uZi5oLgotCi1GcmkgTWF5ICA4IDAwOjIzOjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbGliaWJlcnR5X3RvcGRpciBjb3JyZWN0bHkgd2hlbiBzcmNkaXIgaXMKLQkiLiIgYW5kIHdpdGhfdGFyZ2V0X3N1YmRpciBpcyBub3Qgc2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTWF5ICA3IDEzOjAxOjQ0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgKi0qLW1pbmd3MzIqIGNhc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBNYXkgIDYgMTE6MzM6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IE5ldmVyIHVzZSBhIFBJQyBmaWxlIGZvciAqLSotY3lnd2luMzIqLgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIGNvbmZpZy50YWJsZS4KLQotCSogY29uZmlndXJlLmluOiBPbiBhIGN5Z3dpbjMyIGhvc3QsIGFsd2F5cyBjb21waWxlIHJhbmRvbSwgYW5kCi0JZG9uJ3QgdGVzdCBmb3Igc3lzX3NpZ2xpc3QsIHN0cnNpZ25hbCwgb3IgcHNpZ25hbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY2xvY2suYzogQ2hlY2sgSEFWRV9TWVNfUEFSQU1fSCByYXRoZXIgdGhhbiBOT19TWVNfUEFSQU1fSC4KLQkqIGdldGN3ZC5jOiBMaWtld2lzZS4KLQkqIGdldHBhZ2VzaXplLmM6IExpa2V3aXNlLgotCSogZ2V0cnVudGltZS5jOiBMaWtld2lzZS4KLQotVHVlIE1heSAgNSAxODowODozMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlVc2UgYXV0b2NvbmYgdGVzdHMgcmF0aGVyIHRoYW4gdGhlIG9sZCBkdW1teS5jIHRlc3Q6Ci0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfV0lUSCBjYWxscyBmb3IgLS13aXRoLXRhcmdldC1zdWJkaXIgYW5kCi0JLS13aXRoLW5ld2xpYi4gIEFkZCBBQ19DT05GSUdfSEVBREVSLiAgVXNlIEFDX1JFUExBQ0VfRlVOQ1MgZm9yCi0JbW9zdCBmdW5jdGlvbnMuICBBZGQgc3BlY2lhbCBjYXNlcyB0byBoYW5kbGUgbmV3bGliIGFuZCBWeFdvcmtzLgotCVJlbW92ZSB0YXJnZXRfbWFrZWZpbGVfZnJhZy4gIENyZWF0ZSBzdGFtcC1oIGluIEFDX09VVFBVVCBpZgotCUNPTkZJR19IRUFERVJTIGlzIHNldC4gIE9ubHkgY2FsbCBjb25maWctbWwuaW4gaW4gQUNfT1VUUFVUIGlmCi0JQ09ORklHX0ZJTEVTIGlzIHNldDsgc2V0IGFjX2ZpbGUgYmVmb3JlIGNhbGxpbmcgaXQuCi0JKiBjb25maWcudGFibGUgKGFybS0qLXJpc2NpeCosICotKi1jeWd3aW4zMik6IFJlbW92ZS4KLQkoKi0qLWhwdXgqLCAqLSotaGl1eCosICotKi1pcml4NCosICotKi1zb2xhcmlzMiopOiBSZW1vdmUuCi0JKCotKi1zeXN2NCosICotKi1nbzMyLCAqLSotdnh3b3JrczUqLCAqLSotdnh3b3Jrcyk6IFJlbW92ZQotCShpWzM0NTZdLSotbWluZ3czMiopOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbiAoRVJST1JTX0NDLCBDT05GSUdfSCwgTkVFREVEX0xJU1QpOiBSZW1vdmUuCi0JKExJQk9CSlMpOiBOZXcgdmFyaWFibGUuCi0JKEhPU1RfT0ZJTEVTLCBET19BTFNPLCBTVEFHRVNUVUZGKTogUmVtb3ZlLgotCShhbGwpOiBEZXBlbmQgdXBvbiBuZWVkZWQtbGlzdC4gIERvbid0IGNoZWNrIFJVTEUxLgotCShAdGFyZ2V0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgotCShDT01QSUxFLmMpOiBJbmNsdWRlIEBERUZTQC4KLQkoSEZJTEVTKTogQWRkIGFsbG9jYS1jb25mLmguCi0JKFJFUVVJUkVEX09GSUxFUyk6IFJlbW92ZSBiYXNlbmFtZS5vLgotCSgkKFRBUkdFVExJQikpOiBOZXcgdGFyZ2V0LgotCShzdGFtcC1uZWVkZWQsIGxuZWVkZWQtbGlzdCwgbmVlZGVkLmF3aywgc3RhbXAtY29uZmlnKTogUmVtb3ZlLgotCShsY29uZmlnLmgsIG5lZWRlZDIuYXdrLCBkdW1teS5vLCBlcnJvcnMpOiBSZW1vdmUuCi0JKG5lZWRlZC1saXN0LCBjb25maWcuaCk6IFJld3JpdGUuCi0JKFJVTEUxLCAkKFJVTEUxKSwgUlVMRTIsICQoUlVMRTIpKTogUmVtb3ZlLgotCSguYWx3YXlzLik6IFJlbW92ZS4KLQkoTWFrZWZpbGUpOiBTZXQgQ09ORklHX0ZJTEVTIGFuZCBDT05GSUdfSEVBREVSUy4KLQkoc3RhbXAtaCk6IE5ldyB0YXJnZXQuCi0JKGF0ZXhpdC5vLCBjbG9jay5vLCBnZXRjd2QubywgZ2V0cGFnZXNpemUubyk6IE5ldyB0YXJnZXRzLgotCShiYXNlbmFtZS5vKTogRG9uJ3QgZGVwZW5kIHVwb24gY29uZmlnLmguCi0JKGdldHJ1bnRpbWUubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCSogYXRleGl0LmM6IEluY2x1ZGUgY29uZmlnLmguICBDaGVjayBIQVZFX09OX0VYSVQgcmF0aGVyIHRoYW4KLQlORUVEX29uX2V4aXQuCi0JKiBiYXNlbmFtZS5jOiBEb24ndCBpbmNsdWRlIGNvbmZpZy5oLiAgRG9uJ3QgY2hlY2sgTkVFRF9iYXNlbmFtZS4KLQkqIGNsb2NrLmM6IEluY2x1ZGUgY29uZmlnLmguCi0JKiBnZXRjd2QuYzogTGlrZXdpc2UuCi0JKiBnZXRwYWdlc2l6ZS5jOiBMaWtld2lzZS4KLQkqIGdldHJ1bnRpbWUuYzogTGlrZXdpc2UuICBGaXggY2hlY2tzIHdoaWNoIHNldCBIQVZFX0dFVFJVU0FHRSBhbmQKLQlIQVZFX1RJTUVTLgotCSogc3RyZXJyb3IuYzogQ2hhbmdlIHVzZXMgb2YgTkVFRF9zeXNfZXJybGlzdCB0bwotCUhBVkVfU1lTX0VSUkxJU1QuICBMaWtld2lzZSBmb3IgTkVFRF9zdHJlcnJvciBhbmQgSEFWRV9TVFJFUlJPUi4KLQkqIHN0cnNpZ25hbC5jOiBMaWtld2lzZSBmb3IgTkVFRF9zeXNfc2lnbGlzdCBhbmQgSEFWRV9TWVNfU0lHTElTVCwKLQlhbmQgZm9yIE5FRURfc3Ryc2lnbmFsIGFuZCBIQVZFX1NUUlNJR05BTCBhbmQgZm9yIE5FRURfcHNpZ25hbCBhbmQKLQlIQVZFX1BTSUdOQUwuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGR1bW15LmM6IFJlbW92ZS4KLQkqIGZ1bmN0aW9ucy5kZWY6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1jeHV4NyAoSERFRklORVMpOiBSZW1vdmUgLURIQVZFX1NZU0NPTkYuCi0JKiBjb25maWcvbWgtd2luZG93cyAoSERFRklORVMpOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtY3lnd2luMzI6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1nbzMyOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtaXJpeDQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1yaXNjaXg6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1zeXN2NDogUmVtb3ZlLgotCSogY29uZmlnL210LW1pbmd3MzI6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC12eHdvcmtzNTogUmVtb3ZlLgotCSogY29uZmlnLmluOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHVzaW5nIGF1dG9oZWFkZXIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBNYXkgIDQgMTM6MDA6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJld3JpdGUgdG8gdXNlIGF1dG9jb25mLgotCSogY29uZmlndXJlOiBHZW5lcmF0ZSB1c2luZyBhdXRvY29uZi4KLQkqIGNvbmZpZy9taC1hNjhic2Q6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1hcG9sbG82ODogUmVtb3ZlLgotCSogY29uZmlnL21oLWhwYnNkOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtbmNyMzAwMDogUmVtb3ZlLgotCSogY29uZmlnL21oLXN5c3Y6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1haXggKFJBTkxJQiwgSU5TVEFMTCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9taC1jeHV4NyAoUkFOTElCLCBJTlNUQUxMKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL21oLWlyaXg0IChDQywgUkFOTElCLCBJTlNUQUxMKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL21oLXN5c3Y0IChSQU5MSUIsIElOU1RBTEwpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcudGFibGU6IENoYW5nZSBjb25maWdfc2hlbGwgdG8gQ09ORklHX1NIRUxMLCBhbmQgdXNlCi0JbGliaWJlcnR5X3RvcGRpciB0byBmaW5kIG1vdmUtaWYtY2hhbmdlLgotIAkobTY4ay1hcG9sbG8tYnNkKiwgbTY4ay1hcG9sbG8tc3lzdiopOiBSZW1vdmUuCi0JKGlbMzQ1Nl04Ni1uY3Itc3lzdjQqLCAqLSotZGd1eCosIGhwcGEqLWhwLWJzZCopOiBSZW1vdmUuCi0JKCotKi1pcml4KiwgKi0qLW04OGtiY3MqLCAqLSotc3lzdiopOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbiAoc3JjZGlyKTogU2V0IHRvIEBzcmNkaXJALgotCShWUEFUSCk6IExpa2V3aXNlLgotCShwcmVmaXgsIGV4ZWNfcHJlZml4LCBiaW5kaXIsIGxpYmRpcik6IFNldCB0byBhdXRvY29uZiB2YXJpYWJsZXMuCi0JKFNIRUxMLCBJTlNUQUxMLCBJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IExpa2V3aXNlLgotCShDQywgQ0ZMQUdTLCBSQU5MSUIpKTogTGlrZXdpc2UuCi0JKGRhdGFkaXIsIG1hbipkaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsIE1BS0VJTkZPKTogUmVtb3ZlLgotCSh0YXJnZXRfbWFrZWZpbGVfZnJhZywgaG9zdF9tYWtlZmlsZV9mcmFnKTogQWRkIHN1YnN0aXR1dGlvbnMuCi0JKElOU1RBTExfREVTVCk6IFNldCB0byBASU5TVEFMTF9ERVNUQC4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgdXBvbiBjb25maWcuc3RhdHVzLiAgRG9uJ3QgZGVwZW5kIHVwb24KLQkkKGhvc3RfbWFrZWZpbGVfZnJhZykgb3IgJCh0YXJnZXRfbWFrZWZpbGVfZnJhZykuCi0JKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0LgotCi1TdW4gTWF5ICAzIDE3OjU4OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXN1bm9zNDogUmVtb3ZlLiAgU2hvdWxkIGJlIGhhbmRsZWQgYnkgLS13aXRoLWhlYWRlcnMKLQlhbmQgLS13aXRoLWxpYnJhcmllcyBvcHRpb25zIGF0IHRvcCBsZXZlbC4KLQkqIGNvbmZpZy50YWJsZTogTmV2ZXIgdXNlIG10LXN1bm9zNC4KLQotCSogYWxsb2NhLWNvbmYuaDogTmV3IGZpbGUsIGNvbWJpbmluZyBhbGxvY2Etbm9ybS5oIGFuZAotCWFsbG9jYS1ib3RjaC5oLgotCSogYWxsb2NhLW5vcm0uaDogUmVtb3ZlLgotCSogYWxsb2NhLWJvdGNoLmg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHNoZWxsIHZhcmlhYmxlcyBmaWxlcyBhbmQgbGlua3MgdG8gZW1wdHkuCi0JKiBjb25maWcudGFibGU6IERvbid0IHNldCBzaGVsbCB2YXJpYWJsZSBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5iYXQ6IERvbid0IGNyZWF0ZSBhbGxvY2EtY29uZi5oLgotCSogbWFrZWZpbGUudm1zOiBMaWtld2lzZS4KLQkqIG1wdy1jb25maWcuaW46IExpa2V3aXNlLgotCSogdm1zYnVpbGQuY29tOiBMaWtld2lzZS4KLQotRnJpIE1heSAgMSAxMTo0MTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKEhPU1RfT0ZJTEVTKSAkKFJFUVVJUkVEX09GSUxFUykpOiBSZW1vdmUgb2xkCi0JdGFyZ2V0IGRlcGVuZGluZyB1cG9uIGNvbmZpZy5oLgotCShhbGxvY2Eubyk6IEFkZCB0YXJnZXQgZGVwZW5kaW5nIHVwb24gY29uZmlnLmgKLQkoYmFzZW5hbWUubywgY2hvb3NlLXRlbXAubywgZm5tYXRjaC5vKTogTGlrZXdpc2UuCi0JKGdldG9wdC5vLCBnZXRvcHQxLm8sIHBleGVjdXRlLm8sIHN0cmVycm9yLm8pOiBMaWtld2lzZS4KLQkoc3Ryc2lnbmFsLm8sIHhzdHJlcnJvci5vKTogTGlrZXdpc2UuCi0KLUZyaSBNYXkgIDEgMDQ6MjY6MjUgMTk5OCAgUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiAgSW5pdGlhbGl6ZSB3b3JrLgotCi1Nb24gQXByIDI3IDE1OjUzOjMwIEVEVCAxOTk4IEFuZHJldyBNYWNMZW9kIDxhbWFjbGVvZEBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkKTogUmVwbGFjZSBtaXNzaW5nIGVsc2UuCi0KLVN1biBBcHIgMjYgMTU6Mzg6NTAgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6IEZpeCBvZmYtYnktb25lIGJ1ZyB3aGVuIGNoZWNraW5nIHRoZQotCWxlbmd0aCBpbiB0aGUgbmFtZSBvZiBhIHZpcnR1YWwgdGFibGUuCi0KLVdlZCBBcHIgMjIgMTA6NTM6NDkgRURUIDE5OTggQW5kcmV3IE1hY0xlb2QgIDxhbWFjbGVvZEBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoc3RydWN0IHdvcmsgc3R1ZmYpOiBBZGQgZmllbGQgZm9yIEIgYW5kIEsgbWFuZ2xlIGNvZGVzLgotCShjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBDYWxsIG1vcF91cF9zcXVhbmdsZS4KLQkoY3BsdXNfZGVtYW5nbGUpOiBJbml0aWFsaXplIHNxdWFuZ2xlIGluZm8sIHRoZW4gY2FsbAotCWludGVybmFsX2NwbHVzX2RlbWFuZ2xlLiAoTW9zdCBjb2RlIG1vdmVkIHRoZXJlIGFzIHdlbGwpCi0JKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlKTogTmV3IGZ1bmN0aW9uLCBwZXJmb3JtcyBtb3N0IG9mIHdoYXQgdXNlCi0JdG8gYmUgZG9uZSBpbiBjcGx1c19kZW1hbmdsZSwgYnV0IGlzIG9ubHkgY2FsbGVkIHdpdGggdGhpcyBmaWxlLgotCShzcXVhbmdsZV9tb3BfdXApOiBOZXcgZnVuY3Rpb24gdG8gY2xlYW4gdXAgQiBhbmQgSyBjb2RlIGRhdGEuCi0JKG1vcF91cCk6IHNldCBwb2ludGVycyB0byBOVUxMIGFmdGVyIGZyZWVpbmcuCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSwgZGVtYW5nbGVfdGVtcGxhdGUsIGRlbWFuZ2xlX2NsYXNzKTogQWRkCi0Jc3dpdGNoIGVsZW1lbnRzIHRvIGhhbmRsZSBLIGFuZCBCIGNvZGVzLgotCShkZW1hbmdsZV9wcmVmaXgsIGdudV9zcGVjaWFsLCBkZW1hbmdsZV9xdWFsaWZpZWQpOiBBZGQKLQljb2RlIHRvIGhhbmRsZSBLIGFuZCBCIGNvZGVzLgotCShkb190eXBlLCBkZW1hbmdsZV9mdW5kX3R5cGUpOiBIYW5kbGUgQiBhbmQgSyBjb2Rlcy4KLQkocmVtZW1iZXJfS3R5cGUpOiBOZXcgZnVuY3Rpb24gdG8gc3RvcmUgSyBpbmZvLgotCShyZWdpc3Rlcl9CdHlwZSwgcmVtZW1iZXJfQnR5cGUpOiBOZXcgZnVuY3Rpb25zIGZvciBCIGNvZGVzLgotCShmb3JnZXRfQl9hbmRfS190eXBlcyk6IE5ldyBmdW5jdGlvbiB0byBkZXN0cm95IEIgYW5kIEsgaW5mby4KLQotRnJpIEFwciAxMCAwMTo0OToxMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIENPUFlJTkcuTElCLCBjaG9vc2UtdGVtcC5jLCBjcGx1cy1kZW0uYzogU3luYyB3aXRoIGVnY3MgJiBnY2MuCi0KLVRodSBNYXIgIDUgMDk6MjM6MjggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWcudGFibGU6IE1ha2UgbG9jYXRpbmcgZnJhZyBmaWxlcyBmYWlsc2FmZSBldmVuIGZvciB0aGUKLQlzcGVjaWFsIGNhc2UgaWYgY29uZmlndXJpbmcgYW5kIGJ1aWxkaW5nIGluIHNyY2Rpci4KLQotTW9uIEZlYiAyMyAxNDozMzoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNob29zZS10ZW1wLmM6IEZpeCBoYW5kbGluZyBvZiBzeXMvZmlsZS5oIHRvIHdvcmsgaW4gbGliaWJlcnR5LgotCi1TdW4gRmViIDIyIDE4OjAzOjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY2hvb3NlLXRlbXAuYzogU3luYyB3aXRoIGNvcHkgaW4gZ2NjLgotCi1UaHUgRmViIDEyIDE2OjI5OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2V0b3B0LmM6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCi0JKiBnZXRvcHQxLmM6IExpa2V3aXNlLgotCi1UdWUgRmViIDEwIDE2OjU4OjMzIDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IC48ZGlnaXRzPgotCXN0cmluZ3MgdGhhdCBhcmUgbm90IGFjdHVhbGx5IGxlbmd0aHMuCi0KLUZyaSBGZWIgIDYgMDE6MzU6MTcgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IERvbid0IHBhc3MgUElDRkxBRy4KLQkoLmMubyk6IENoZWNrIHZhbHVlIG9mIGVuYWJsZV9zaGFyZWQsIG5vdCBQSUNGTEFHLgotCShzdGFtcC1waWNkaXIpOiBEaXRvLgotCi1UaHUgRmViICA1IDE4OjQ4OjU2IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvbWgtY3lnd2luMzI6IHJlbW92ZSB2YXNwcmludGYubyBmcm9tIEVYVFJBX09GSUxFUwotICAgICAgICBzaW5jZSBpdCBnZXRzIGJ1aWx0IGF1dG9tYXRpY2FsbHkKLQotU3VuIEZlYiAgMSAwMjo1MjozMiAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZSAodnh3b3JrcyBjb25maWdzKTogRGVmYXVsdCB0byBWeFdvcmtzIDUueCwgYXMgdGhhdCBpcwotCXRoZSBjdXJyZW50bHkgc2hpcHBpbmcgT1MuCi0KLVR1ZSBKYW4gMjcgMTY6MDg6MjAgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIHZtc2J1aWxkLmNvbSBbUkVRVUlSRV9PRklMRVNdOiBTeW5jaHJvbml6ZWQgd2l0aCBNYWtlZmlsZS5pbjoKLQlBZGQgZm5tYXRjaC5vIGFuZCBvYmphbGxvYy5vOyByZW1vdmUgdmFzcHJpbnRmLm8uCi0JW2NvbmZpZy5oXTogRGVmaW5lIE5FRURfc3Ryc2lnbmFsLgotCi1Nb24gSmFuIDE5IDEyOjIwOjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZnVuY3Rpb25zLmRlZjogQ29ycmVjdCBhcmd1bWVudCB0eXBlcyBmb3Igc3RyZXJyb3IgYW5kCi0Jc3Ryc2lnbmFsLiAgUmVwb3J0ZWQgYnkgQWxleCBHdXRtYW4gPGFndXRtYW5AZW1jLmNvbT4uCi0KLVN1biBKYW4gMTggMTU6NTc6MjggMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogdmFzcHJpbnRmLmMgKGludF92YXNwcmludGYpOiBJbmNyZWFzZSBidWZmZXIgc2l6ZSBmb3IgZmxvYXQvZG91YmxlCi0JdmFsdWVzLgotCi1TYXQgSmFuIDE3IDIyOjI4OjM4IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCQkJICBKLkouIFZhbmRlckhlaWpkZW4gPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCUFkZCBtaW5ndzMyIHN1cHBvcnQuCi0JKiBwZXhlY3V0ZS5jIChwZXhlY3V0ZSk6IE5ldyBmdW5jdGlvbiBmb3IgbWluZ3czMi4gU3VwcG9ydHMgcGlwZXMuCi0JKHB3YWl0KTogTmV3IGZ1bmN0aW9uIGZvciBtaW5ndzMyLgotCi0JKiBjb25maWcudGFibGUgKGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKTogU3VwcG9ydCBmb3IgaTM4Ni1taW5ndzMyLgotCSogY29uZmlnL210LW1pbmd3MzI6IE5ldyBmaWxlLgotCSogeG1hbGxvYy5jIChmaXJzdF9icmVhayk6IE5vdCB1c2VkIGZvciBtaW5ndzMyLgotCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBEb24ndCB1c2Ugc2JyayBvbiBtaW5ndzMyLgotCSh4bWFsbG9jKTogTGlrZXdpc2UuCi0JKHhyZWFsbG9jKTogTGlrZXdpc2UuCi0KLVNhdCBKYW4gMTcgMjI6Mjg6MDUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjaG9vc2UtdGVtcC5jOiBTeW5jIHdpdGggZ2NjIHZlcnNpb24uCi0KLVR1ZSBKYW4gMTMgMTg6MzQ6MzkgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbF90b19saWJkaXIsIGluc3RhbGxfdG9fdG9vbGRpcik6IEFkZCBNVUxUSVNVQkRJUgotCXRvIGFsbCBmaWxlbmFtZXMgaW4gbGliZGlyIGFuZCB0b29sZGlyLgotCShkaXN0Y2xlYW4pOiBEbyBNVUxUSUNMRUFOIGJlZm9yZSBkZWxldGluZyBNYWtlZmlsZS4KLQkoc3RhbXAtbmVlZGVkLCBzdGFtcC1jb25maWcpOiBBZGQgTVVMVElTUkNUT1AgdG8KLQlwYXRobmFtZSBmb3IgbW92ZS1pZi1jaGFuZ2UuCi0KLVRodSBEZWMgIDQgMTc6MjU6MTkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYyAoc3lzX25zaWcpOiBUcnkgTlNJRyBhbmQgX05TSUcuCi0KLVdlZCBOb3YgMTkgMTM6Mzc6MDYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1ub3JtLmggKGFsbG9jYSwgR0NDIGNhc2UpOiBEb24ndCByZWRlZmluZSBhbGxvY2EgaWYgaXQKLQl3YXMgYWxyZWFkeSBkZWZpbmVkIHByZXZpb3VzbHkuCi0KLU1vbiBOb3YgMTAgMTI6NDg6MDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlIC4uL2luc3RhbGwtc2gsIG5vdCBpbnN0YWxsLgotCi1UdWUgT2N0IDI4IDIzOjQxOjE1IDE5OTcgIEp1ZHkgR29sZGJlcmcgIDxqb2R5Z0BpZHQubmV0PgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIHBleGVjdXRlLmMuCi0KLVdlZCBPY3QgMTUgMTk6MTM6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhc3ByaW50Zi5jOiBDb25zaXN0ZW50bHkgdXNlIGVpdGhlciBzdGRhcmcgb3IgdmFyYXJncy4KLQotVHVlIE9jdCAxNCAxMjowMTowMCAxOTk3ICBNYXJrIE1pdGNoZWxsICA8bW1pdGNoZWxsQHVzYS5uZXQ+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiBEb24ndCBsb29rIGZvciByZXR1cm4gdHlwZXMgb24KLQljb25zdHJ1Y3RvcnMuICBIYW5kbGUgbWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9ycy4KLQotRnJpIE9jdCAgMyAxNzo1MzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogRml4IGNvbmZpZ3VyYXRpb24gaW5zdHJ1Y3Rpb25zLgotCi1Nb24gU2VwIDI5IDEyOjI4OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogVXBkYXRlIHRvIGN1cnJlbnQgdmVyc2lvbiBmcm9tIC9nZC9nbnUvbGliOgotCi0JTW9uIFNlcCAyOSAxMjoyNzo1OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBwZXhlY3V0ZS5jOiBVc2Ugc3Bhd24gaWYgX19DWUdXSU4zMl9fLgotCi0JMTk5Ny0wOC0wOCAgUGF1bCBFZ2dlcnQgIDxlZ2dlcnRAdHdpbnN1bi5jb20+Ci0KLSAgICAgICAgKiBwZXhlY3V0ZS5jOiBJbmNsdWRlICJjb25maWcuaCIgZmlyc3QsIGFzIHBlciBhdXRvY29uZiBtYW51YWwuCi0KLQlGcmkgSnVuIDI3IDE1OjIwOjI5IDE5OTcgIFNjb3R0IENocmlzdGxleSA8c2NvdHRjQG5ldC1jb21tdW5pdHkuY29tPgotCi0gICAgICAgICogcGV4ZWN1dGUuYyAoZml4X2FyZ3YpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChwZXhlY3V0ZSk6IFdpbjMyIGJ1dCBub3QgQ3lnd2luMzIgbmVlZHMgaXRzIGFyZ3VtZW50cyBmaXhlZC4KLSAgICAgICAgQWRkIHVuZGVyc2NvcmUgdG8gY3dhaXQgZnVuY3Rpb24gY2FsbC4KLQotU3VuIFNlcCAyOCAxMjowMDo1MiAxOTk3ICBNYXJrIE1pdGNoZWxsICA8bW1pdGNoZWxsQHVzYS5uZXQ+Ci0KLSAgICAgICAgKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBBZGQgbmV3IHBhcmFtZXRlci4gIEhhbmRsZSBuZXcKLSAgICAgICAgdGVtcGxhdGUtZnVuY3Rpb24gbWFuZ2xpbmcuCi0gICAgICAgIChjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChkZW1hbmdsZV9zaWduYXR1cmUpOiBIYW5kbGUgbmV3IG5hbWUtbWFuZ2xpbmcgc2NoZW1lLgotCi1XZWQgU2VwIDI0IDAwOjMxOjU5IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAeWluLmN5Z251cy5jb20+Ci0KLQkqIGFzcHJpbnRmLmM6IHN0ZGFyZy5oIHdoZW4gQUxNT1NUX1NUREMKLQkqIGNvbmZpZy9taC13aW5kb3dzIChFWFRSQV9PRklMRVMpOiBhZGQgYXNwcmludGYubyBhbmQKLSAJc3RybmNhc2VjbXAuby4KLQotVGh1IEF1ZyAyOCAxNDoyNzoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHZhc3ByaW50Zi5jICh2YXNwcmludGYpOiBBbGxvdyBmb3IgX0JTRF9WQV9MSVNUXy4KLQotCSogY29uZmlnLnRhYmxlOiBBZGQgY2FzZSBmb3IgRnJlZUJTRCAyLjEgYW5kIDIuMiwgbmVlZHMgbWgtZmJzZDIxLgotCi0JKiBjb25maWcvbWgtZmJzZDIxIChFWFRSQV9PRklMRVMpOiBGb3JjZSB2YXNwcmludGYubwotCi1XZWQgU2VwIDEwIDEyOjQzOjEwIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IENoYW5nZSAiY29tcGxleCIgdG8gIl9fY29tcGxleCIuCi0KLUZyaSBTZXAgIDUgMTY6MzQ6NDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhc3ByaW50Zi5jIChhc3ByaW50Zik6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBhc3ByaW50Zi5jCi0JKiBmdW5jdGlvbnMuZGVmOiBEaXR0by4KLQotVGh1IEF1ZyAyOCAxODo1MzozNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyZ3YuYyAoZHVwYXJndik6IE5ldyBmdW5jdGlvbiwgZHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4KLQotVHVlIEF1ZyAxOSAyMDoyODo0NSAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtY3lnd2luMzI6IGFsc28gYnVpbGQgcmFuZG9tLm8KLQotVHVlIEF1ZyAxOSAxNzoxMDo1NiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBBZGQgJ2V4dGVybicgdG8gcHJlcGVuZHNfdW5kZXJzY29yZS4KLQotV2VkIEp1bCAzMCAxMTo0MjoxOSAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IFZhcmlvdXMgY2hhbmdlcyB0byBwcm9kdWNlIEphdmEgb3V0cHV0IHdoZW4gcGFzc2VkCi0JRE1HTF9KQVZBLiAgVGh1cyAiOjoiIGJlY29tZXMgIi4iIGFuZCAiSkFycmF5PEZvbz4iIGJlY29tZXMgIkZvb1tdIi4KLQkobWFpbik6IFN1cHBvcnQgLS1qYXZhIGFuZCAtaiBmbGFncyB0byBzZXQgRE1HTF9KQVZBLgotCi1UdWUgSnVsIDIyIDE5OjA1OjIzIDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogY29uZmlnL21oLWdvMzIgKENDLCBBUiwgUkFOTElCKTogRG9uJ3QgZGVmaW5lLgotCi1UdWUgSnVsIDIyIDE3OjQ5OjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBwZXhlY3V0ZS5vLgotCShwZXhlY3V0ZS5vKTogTmV3IHRhcmdldC4KLQotCSogTWFrZWZpbGUuaW4gKHN0YW1wLW5lZWRlZCk6IE5ldyB0YXJnZXQsIHJlcGxhY2luZyBuZWVkZWQtbGlzdC4KLQkobmVlZGVkLWxpc3QpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLW5lZWRlZC4KLQkoc3RhbXAtY29uZmlnKTogTmV3IHRhcmdldCwgcmVwbGFjaW5nIGNvbmZpZy5oLgotCShjb25maWcuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RhbXAtY29uZmlnLgotCShtb3N0bHljbGVhbik6IFJlbW92ZSBzdGFtcC0qLgotCi1UaHUgSnVuIDEyIDExOjAwOjE4IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IHBhc3MgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNIGFuZAotCUlOU1RBTExfREFUQSBmb3IgbXVsdGlsaWJiZWQgaW5zdGFsbHMKLQotVHVlIEp1biAgMyAxMzoyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JVHVlIERlYyAxMCAwOTo0NDo1NyAxOTk2ICBQYXVsIEVnZ2VydCAgPGVnZ2VydEB0d2luc3VuLmNvbT4KLQotCSogY2hvb3NlLXRlbXAuYyAoY2hvb3NlX3RlbXBfYmFzZSk6IERvbid0IGR1bXAgY29yZSBpZiBUTVBESVIgaXMgZW1wdHkuCi0KLQkqIGNob29zZS10ZW1wLmMgKHRyeSk6IEluc2lzdCB0aGF0IHRlbXAgZGlyIGJlIHNlYXJjaGFibGUuCi0KLQlXZWQgT2N0IDIzIDE3OjM2OjM5IDE5OTYgIERvdWcgUnVwcCAgKHJ1cHBAZ25hdC5jb20pCi0KLQkqIGNob29zZS10ZW1wLmMgKGNob29zZV90ZW1wX2Jhc2UpOiBPbiBWTVMsIHVzZSBwcm9wZXIgc3ludGF4Ci0JZm9yIGN1cnJlbnQgZGlyZWN0b3J5LgotCi0JU2F0IEZlYiAxNSAxOTowMzo0OCAxOTk3ICBHZW9mZnJleSBOb2VyICAobm9lckBjeWdudXMuY29tKQotCi0JKiBwZXhlY3V0ZS5jOiBSZW1vdmUgc3BlY2lhbCBjYXNlcyBmb3IgY3lnd2luMzIuCi0JKHB3YWl0KTogUmVtb3ZlIGxvY2FsIGRlZmluaXRpb24gb2YgYHBpZCcuCi0KLQlUdWUgTm92IDEyIDE4OjI2OjE1IDE5OTYgIERvdWcgUnVwcCAgKHJ1cHBAZ25hdC5jb20pCi0KLQkqIHBleGVjdXRlLmMgKHZmb3JrKTogU3VwcGx5IG5ldyBkZWZpbml0aW9uIGZvciBWTVMuCi0JKHB3YWl0KTogVXNlIHdhaXRwaWQgaW5zdGVhZCBvZiB3YWl0IGZvciBWTVMuCi0KLVR1ZSBNYXkgMjAgMTQ6MDI6MjAgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEhhbmRsZSBgSicuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFByaW50ICJjb21wbGV4IiBmb3IgaXQuCi0KLVdlZCBBcHIgMzAgMTI6MTU6NDUgMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHR1cm4gb24gbXVsdGlsaWIgaGVyZS4KLQotTW9uIEFwciAyOCAxOTowNDozMSAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBvYnN0YWNrLmM6IG1vdmUgX29ic3RhY2tfbWVtb3J5X3VzZWQgb3V0c2lkZSBvZiBpZmRlZi4gIENhbm5vdCBiZQotCWVsaWRlZDsgbmVlZGVkIGJ5IGdkYiBhbmQgbm90IHByZXNlbnQgaW4gbGliYy4KLQotVGh1IEFwciAyNCAxOTozMzo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSB0bXBtdWx0aS5vdXQuCi0KLVR1ZSBBcHIgMjIgMTA6MjU6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZCk6Ci0JQWRkIG5ldyBmbG9hdGZvcm1hdCwgbWFpbmx5IGZvciBBUk0gZG91Ymxlcy4KLQotTW9uIEFwciAxNCAxMjoxMToxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogVXNlICR7Y29uZmlnX3NoZWxsfSB3aXRoICR7bW92ZWlmY2hhbmdlfS4gIEZyb20KLQlUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+LgotCi1GcmkgQXByICA0IDAzOjA5OjI0IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEVuYWJsZSBtdWx0aWxpYmluZyBieSBkZWZhdWx0LgotCVVwZGF0ZSBtdWx0aWxpYiB0ZW1wbGF0ZSB0byByZWFkIGNvbmZpZy1tbC5pbi4KLQotVHVlIEFwciAgMSAxNjoyNjozOSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBBZGQgb2JqYWxsb2MuCi0KLU1vbiBNYXIgMzEgMjM6NTc6NTEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2l0KTogQWRkIHByb3RvdHlwZSBkZWNsYXJhdGlvbi4KLQkodXNhZ2UsIGZhdGFsKTogTGlrZXdpc2UuCi0KLQkqIHhleGl0LmMgKF94ZXhpdF9jbGVhbnVwKTogQWRkIHByb3RvdHlwZS4KLQotCSogc3RyZXJyb3IuYyAoaW5pdF9lcnJvcl90YWJsZXMpOiBEZWNsYXJlLgotCi1GcmkgTWFyIDI4IDExOjQzOjIwIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBmdW5jdGlvbnMuZGVmOiBBZGQgREVGIG9mIHZhc3ByaW50ZiwgYW5kIERFRkZVTkMgb2Ygc3Ryc2lnbmFsLgotCSogc3Ryc2lnbmFsLmM6IE9ubHkgZGVmaW5lIHN0cnNpZ25hbCBpZiBORUVEX3N0cnNpZ25hbC4KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiBSZW1vdmUgdmFzcHJpbnRmLm8uCi0JKiBjb25maWd1cmUuaW46IEFkZCBORUVEX3N0cnNpZ25hbCB0byB4Y29uZmlnLmguICBBZGQgdmFzcHJpbnRmLm8KLQl0byB4bmVlZGVkLWxpc3QuCi0JKiBjb25maWcvbWgtY3lnd2luMzIgKEhERUZJTkVTKTogQWRkIC1ETkVFRF9zdHJzaWduYWwuCi0JKEVYVFJBX09GSUxFUyk6IERlZmluZSB0byB2YXNwcmludGYuby4KLQkqIGNvbmZpZy9taC13aW5kb3dzIChIREVGSU5FUyk6IEFkZCAtRE5FRURfc3Ryc2lnbmFsLgotCShFWFRSQV9PRklMRVMpOiBBZGQgdmFzcHJpbnRmLm8uCi0JKiBjb25maWcvbXQtdnh3b3JrczUgKHZ4Y29uZmlnLmgpOiBEZWZpbmUgTkVFRF9zdHJzaWduYWwuCi0JKHZ4bmVlZGVkLWxpc3QpOiBBZGQgdmFzcHJpbnRmLm8uCi0KLVRodSBNYXIgMjAgMTc6MDI6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmphbGxvYy5jOiBJbmNsdWRlIDxzdGRpby5oPi4KLQotTW9uIE1hciAxNyAxOToyMzoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamFsbG9jLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBvYmphbGxvYy5jCi0JKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBvYmphbGxvYy5vLgotCShvYmphbGxvYy5vKTogTmV3IHRhcmdldC4KLQotU2F0IE1hciAxNSAxODo0OTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suYzogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb24uCi0KLUZyaSBNYXIgMTQgMTQ6MTg6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogQWRkIHByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLgotCShteXN0cnN0cik6IE1ha2Ugc3RhdGljLiAgTWFrZSBhcmd1bWVudHMgYW5kIHJlc3VsdCBjb25zdC4KLQkoY3BsdXNfbWF0Y2gpOiBSZW1vdmU7IG5vdCB1c2VkLgotCi1UdWUgTWFyIDExIDE0OjIwOjMxIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogQ2FsbCBkZW1hbmdsZWRfZnVuZF90eXBlIGZvciBvdGhlcgotCV9fdCogc3ltYm9scy4KLQotVHVlIE1hciAxMSAxNTo0MToyMSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogc3BhY2VzLmM6IERlY2xhcmUgbWFsbG9jIGFuZCBmcmVlIHByb3Blcmx5LgotCSogc3Ryc2lnbmFsLmMgKGluaXRfc2lnbmFsX3RhYmxlcyk6IEFkZCBwcm90b3R5cGUuCi0JKiB4YXRleGl0LmMgKF94ZXhpdF9jbGVhbnVwKTogQWRkIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCi0KLVdlZCBGZWIgMTkgMTU6NDM6MjQgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogSWYgYWxsb2NhLm8gaXMgbmVlZGVkLCB4ZXhpdC5vIGlzCi0JYWxzbyByZXF1aXJlZCBiZWNhdXNlIG9mIHhtYWxsb2Muby4KLQotRnJpIEZlYiAxNCAxMzo0MzozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cnNpZ25hbC5jOiBVbmNvbmRpdGlvbmFsbHkgcmVkZWZpbmUgc3lzX3NpZ2xpc3QgYXJvdW5kIHRoZQotCWluY2x1c2lvbiBvZiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcy4KLQotVGh1IEZlYiAxMyAyMjowMTowNCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSZW1vdmUgOCBiaXQgY2hhcmFjdGVycy4gIFVwZGF0ZSB0byBsYXRlc3QKLQlnY2MgcmVsZWFzZS4KLQotVHVlIEZlYiAgNCAxMTo1MjoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cnNpZ25hbC5jOiBVc2UgTkVFRF9zeXNfc2lnbGlzdCBpbnN0ZWFkIG9mCi0JTE9TSU5HX1NZU19TSUdMSVNULgotCSogY29uZmlnLnRhYmxlOiBEb24ndCB1c2UgbWgtbHlueG9zLgotCSogY29uZmlnL21oLWx5bnhvczogUmVtb3ZlLgotCi1UaHUgSmFuIDE2IDE0OjUxOjAzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogRml4IGluZGVudGluZzsgbWFrZSBpZGVudGljYWwgdG8gdGhlIGNvcHkKLQlpbiBHQ0MuCi0JKGRvX3R5cGUsIGNhc2UgJ00nKTogQ2hlY2sgZm9yIGEgdGVtcGxhdGUgYXMgd2VsbCBhcyBhIGNsYXNzLgotCi1UaHUgRGVjIDE5IDEzOjUxOjMzIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXZ4d29ya3M1ICh2eG5lZWRlZC1saXN0KTogUmVtb3ZlIHNpZ3NldG1hc2subywgc2luY2UKLQl2eHdvcmtzIDUuWzAtM10gYWxsIGhhdmUgc2lnc2V0bWFzayBpbiB0aGVtOyB0aGUgb25lIHByb3ZpZGVkIGJ5Ci0JbGliaWJlcnR5IGlzIGluY29ycmVjdCwgYXMgd2VsbC4KLQotTW9uIERlYyAgMiAxNTowMzo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS5jIChhbGxvY2EpOiBXaGVuIGNvbXBpbGVkIHdpdGggYW4gQU5TSS9JU08gY29tcGlsZXIsCi0JYWxsb2NhIHRha2VzIGEgc2l6ZV90IGFyZ3VtZW50LCBub3QganVzdCB1bnNpZ25lZC4KLQotTW9uIE5vdiAxOCAxNTo0MjowOCAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBOb3RlIHRoYXQgdGhpcyBmaWxlIGFsc28gbGl2ZXMgaW4gR0NDLgotCi1Nb24gTm92IDE4IDE1OjE5OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLmM6IFJlbW92ZSBpbmNsdWRlIG9mIGxpYmliZXJ0eS5oIGZvciBocHV4LgotCSogYXJndi5jOiAgUmVwbGFjZSBkZWZzIGZyb20gbGliaWJlcnR5LmguCi0JKiBzcGFjZXMuYzogUHV0IGJhY2sgZXh0ZXJucyBmcm9tIHJlbW92ZWQgZnJvbSBsaWJpYmVydHkuaC4KLQkqIHZhc3ByaW50Zi5jOiBSZW1vdmUgaW5jbHVkZSBvZiBsaWJpYmVydHkuaCBmb3IgaHB1eC4KLQotTW9uIE5vdiAxOCAxNDowODowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBDaGVja2luZyBpbiBhZ2FpbjsgbGFzdCBjaGVja2luIGZpbGVkIGR1ZSB0byBzdGlja3kgdGFnLgotCi1XZWQgTm92IDEzIDA4OjIyOjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IFJldmVydCBsYXN0IHR3byBjb21taXRzIGR1ZSB0byBjb25mbGljdHMgd2l0aAotCWhwdXggc3lzdGVtIGhlYWRlcnMuCi0KLVdlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBhbGxvY2EuYywgYXJndi5jLCBzcGFjZXMuYywgc3RyY2FzZWNtcC5jLCB2YXNwcmludGYuYywgdnByaW50Zi5jOgotCVJldmVydCBsYXN0IGNvbW1pdCBkdWUgdG8gY29uZmxpY3RzIHdpdGggaHB1eCBzeXN0ZW0gaGVhZGVycy4KLQotV2VkIE5vdiAxMyAxMDozNjo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jICh4e20scmV9YWxsb2MpOiBNYWtlIGRlY2xhcmF0aW9ucyBjb21wYXRpYmlsZSB3aXRoCi0JbGliaWJlcnR5Lmggd2hlbiBjb21waWxlZCB3aXRoIGEgc3RhbmRhcmQgY29tcGlsZXIuCi0KLVR1ZSBOb3YgMTIgMTY6MzE6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBhbGxvY2EuYzogSW5jbHVkZSBsaWJpYmVydHkuaCBmb3IgZGVmaW5pdGlvbiBvZiB4bWFsbG9jLgotCURvbid0IHJlZGVmaW5lIE5VTEwuCi0JKiBhcmd2LmM6IE1vdmUgcHJvdG90eXBlcyB0byBsaWJpYmVydHkuaC4KLQkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oIGZvciBkZWZpbml0aW9uIG9mIHhtYWxsb2MuCi0JRG9uJ3QgcmVkZWZpbmUgTlVMTC4KLQlVc2UgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3BhY2VzLmM6IFJlbW92ZSBwcm90b3R5cGVzIGZvciBtYWxsb2MgYW5kIGZyZWUgd2hpY2ggYXJlCi0JYWxyZWFkeSBpbiBsaWJpYnJ0eS5oLgotCSogc3RyY2FzZWNtcC5jOiBVc2UgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogdmFzcHJpbnRmLmM6IEluY2x1ZGUgbGliaWJlcnR5LmggZm9yIGRlZmluaXRpb24gb2YgbWFsbG9jLgotCURvbid0IHJlZGVmaW5lIE5VTEwuCi0JKiB2cHJpbnRmLmM6IEluY2x1ZGUgc3RkYXJnLmggaWYgX19TVERDX18uCi0KLUZyaSBPY3QgMTEgMTU6NDI6MTIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXdpbmRvd3M6ICBBZGQgc3RyY2FzZWNtcC5vIHRvIEVYVFJBX09GSUxFUy4KLQotRnJpIE9jdCAxMSAxMToxNjozMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5jIChtcHdpZnlfZmlsZW5hbWUpOiBSZXdyaXRlIHRvIHNpbXBsaWZ5LCBhbmQgdG8gaGFuZGxlCi0JdXB3YXJkIGNvbXBvbmVudHMgY29ycmVjdGx5LgotCi1UdWUgT2N0ICA4IDA4OjU1OjM0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZSwgY29uZmlnL21oLXdpbmRvd3M6ICBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgdW5kZXIKLQlNU1ZDICh0aGUgTWljcm9zb2Z0IGJ1aWxkIGVudmlyb25tZW50KS4KLQotTW9uIE9jdCAgNyAxMDo1MDoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guYzogVW5kZWYgY29uc3QgaWYgbm90IF9fU1REQ19fLgotCi1UaHUgT2N0ICAzIDEzOjQ2OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgZm5tYXRjaC5jLgotCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgZm5tYXRjaC5vLgotCShmbm1hdGNoLm8pOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDE4IDE0OjQ5OjEzIDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRml4IGhhbmRsaW5nIG9mIGFkZHJlc3MgYXJncy4KLQkoZ251X3NwZWNpYWwpOiBIYW5kbGUgdHlwZV9pbmZvIHN0dWZmLgotCi1GcmkgU2VwIDEzIDE3OjUyOjU1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKERlYnVnUEkpOiBNYWtlIHNldHRhYmxlIGZyb20gdGhlIGVudiB2YXIgREVCVUdfUEFUSE5BTUVTLgotCShtcHdpZnlfZmlsZW5hbWUpOiBIYW5kbGUgIjo6LyIgY2FzZS4KLQotVGh1IFNlcCAxMiAxMzozMDo0MCAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtY3lnd2luMzI6IG5ldyBmaWxlIChuZWVkIC1ETkVFRF9iYXNlbmFtZSBhbmQKLQkJLURORUVEX3N5c19zaWdsaXN0IGZvciBuYXRpdmUgTlQgcmVidWlsZGluZykKLQkqIGNvbmZpZy50YWJsZSAoKi0qLWN5Z3dpbjMyKTogbmV3IGVudHJ5Ci0JKiBjaG9vc2UtdGVtcC5jOiBicmluZyBpbiBzeW5jIHdpdGggZ2NjIChyZXZlcnQgQXVnIDE3IGNoYW5nZSkKLQotVGh1IEF1ZyAyOSAxNjo0ODo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZSAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCi1UdWUgQXVnIDI3IDEzOjQ3OjU4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYyAocGV4ZWN1dGUpIFtNUFddOiBSZW1vdmUgb2xkIGJvZ3VzIGNvZGUgdGhhdAotCW1lc3NlZCB3aXRoIGFyZ3VtZW50cyB0aGF0IGluY2x1ZGVkIGEgJy8nLCBhZGQgZXNjYXBlIGNoYXJzCi0JdG8gZG91YmxlIHF1b3RlcywgcmVtb3ZlIGNvbnN0IGRlY2wgZnJvbSBhcmcgdGhhdCBNYWMKLQljb21waWxlcnMgZG9uJ3Qgc2VlbSB0byBsaWtlLgotCi1TYXQgQXVnIDE3IDA0OjQ0OjI3IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IFVwZGF0ZSB0ZXN0IGZvciB3aW4zMiAoJiYgISBjeWd3aW4zMikuCi0JKiBjaG9vc2UtdGVtcC5jOiBmaXggV0lOMzIgcHJlcHJvY2Vzc29yIGRlZmluZXMKLQotVGh1IEF1ZyAxNSAxMjoyNjo0OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIEBEQVNIX0NfRkxBR0AgYW5kIEBTRUdNRU5UX0ZMQUcoe0RlZmF1bHR9KUAKLQl0byBlZGl0aW5nIG9mIGRlZmF1bHQgbWFrZWZpbGUgcnVsZS4KLQotU3VuIEF1ZyAxMSAyMTowMzoyNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhbGxvY2Etbm9ybS5oOiAgSW5jbHVkZSA8bWFsbG9jLmg+IGlmIF9XSU4zMi4KLQkqIGFyZ3YuYzogIEluY2x1ZGUgbm9uLXByb3RvdHlwZWQgZGVjbHMgZm9yIG1hbGxvYyBhbmQgc3RyaW5nCi0JZnVuY3Rpb25zIGlmICEgX1dJTjMyIG9yIGlmIF9fR05VQ19fLgotCi1UaHUgQXVnICA4IDEyOjQyOjQwIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWcuaC12bXM6IE5ldyBmaWxlLgotCSogbWFrZWZpbGUudm1zOiBVc2UgaXQuCi0KLVdlZCBBdWcgIDcgMTc6MTY6MTIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmMgKF9nZXRvcHRfaW50ZXJuYWwpOiAgSWYgYXJnYyBpcyAwLCBqdXN0IHJldHVybiAoYmVmb3JlCi0Jd2UgcmVmZXJlbmNlICphcmd2IGFuZCBzZWdmYXVsdCkuCi0KLU1vbiBBdWcgIDUgMDE6Mjk6MDggMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogQWRkIG11bHRpbGliLm91dC4KLQotVGh1IEp1bCAxOCAxNzo0MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1ub3JtLmg6IENoYW5nZSAjaWZkZWYgc3BhcmMgdG8gI2lmIGRlZmluZWQgKHNwYXJjKSAmJgotCWRlZmluZWQgKHN1bikuICBGcm9tIEFuZHJldyBHaWVydGggPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KLQotTW9uIEp1bCAgMSAxMzo0MDo0NCAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVR1ZSBNYXkgMjggMTU6Mjk6MDMgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIHZtc2J1aWxkLmNvbSAoUkVRVUlSRF9PRklMRVMpOiBBZGQgY2hvb3NlLXRlbXAubyBhbmQgeHN0cmR1cC5vLgotCi0JVGh1IEphbiAyNSAxODoyMDowNCAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogdm1zYnVpbGQuY29tOiBDaGFuZ2VzIHRvIGhhbmRsZSBERUZGVU5DKG9uX2V4aXQpLgotCShkb19vZmlsZXMpOiBBbGxvdyBub25leGlzdGVudCBzb3VyY2UgZmlsZSBpbiBwYXNzIDMuCi0JKGNoa19kZWZmdW5jKTogTmV3IHJvdXRpbmUuCi0KLVR1ZSBKdW4gMjUgMTk6MjQ6NDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYyAoUEVYRUNVVEVfVkVSQk9TRSk6IERlZmluZS4KLQkoTVBXIHBleGVjdXRlKTogQ2hlY2sgZmxhZ3MgJiBQRVhFQ1VURV9WRVJCT1NFIGluc3RlYWQgb2YgdmVyYm9zZV9mbGFnLgotCi1UdWUgSnVuIDI1IDIzOjExOjQ4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkb2NkaXIpOiBSZW1vdmVkLgotCi1UdWUgSnVuIDI1IDIzOjAxOjA3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChvbGRpbmNsdWRlZGlyKTogUmVtb3ZlZC4KLQotVHVlIEp1biAyNSAyMjo1MDowNyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBTZXQgdG8gJChwcmVmaXgpL3NoYXJlLgotCi1UaHUgSnVuIDIwIDIxOjE3OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IFJlaW5kZW50LiAgQXZvaWQgZW5kbGVzcyBsb29wIGJ5Ci0JY2hlY2tpbmcgZm9yIGVycm9ycyBmcm9tIGRvX3R5cGUuCi0KLVR1ZSBKdW4gMTggMTQ6MzY6MTkgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCi0JKiB4bWFsbG9jLmM6IElmIFZNUywgaW5jbHVkZSA8c3RkbGliLmg+IGFuZCA8dW5peGxpYi5oPiByYXRoZXIKLQl0aGFuIGRlY2xhcmluZyBtYWxsb2MsIHJlYWxsb2MsIGFuZCBzYnJrLgotCi1Nb24gSnVuIDEwIDEzOjE3OjE3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IE5ldyBmaWxlLgotCi1XZWQgSnVuICA1IDE2OjU3OjQ1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiB4bWFsbG9jLmM6IERlY2xhcmUgc2Jyay4KLQotU2F0IE1heSAgNCAwNTowODo0NSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFsbG9jYS1ub3JtLmg6ICBBZGQgU1BBUkN3b3JrcyBjYyBjb21wYXRpYmxlIF9fYnVpbHRpbl9hbGxvY2EKLQlkZWNsYXJhdGlvbi4KLQotTW9uIEFwciAyMiAxODo0MTo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhzdHJlcnJvci5jOiBJbmNsdWRlIDxzdGRpby5oPi4KLQotU3VuIEFwciAyMSAxMTo1NToxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGF0ZXhpdC5jLgotCi1TdW4gQXByIDIxIDA5OjUwOjA5IDE5OTYgIFN0ZXBoZW4gTCBNb3NoaWVyICAobW9zaGllckB3b3JsZC5zdGQuY29tKQotCi0JKiBjaG9vc2UtdGVtcC5jOiBJbmNsdWRlIHN5cy90eXBlcy5oIGJlZm9yZSBzeXMvZmlsZS5oIGZvciBzY28zLjJ2NS4KLQotV2VkIEFwciAxNyAxMToxNzo1NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjaG9vc2UtdGVtcC5jOiBEb24ndCAjaW5jbHVkZSBzeXMvZmlsZS5oIGlmZGVmIE5PX1NZU19GSUxFX0guCi0JI2luY2x1ZGUgPHN0ZGlvLmg+Ci0JKiBjb25maWcvbXQtdnh3b3JrczUgKEhERUZJTkVTKTogRGVmaW5lIE5PX1NZU19GSUxFX0guCi0KLVR1ZSBBcHIgMTYgMTE6Mjc6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IElmIGFsbG9jYS5vIGlzIG5lZWRlZCwgc28gaXMgeG1hbGxvYy5vLgotCVJldmVydHMgRmViIDgsIDE5OTUgY2hhbmdlLgotCi1Nb24gQXByIDE1IDEyOjUzOjI2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNob29zZS10ZW1wLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBjaG9vc2UtdGVtcC5jLgotCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgY2hvb3NlLXRlbXAuby4KLQotU2F0IEFwciAxMyAxNDoxOTozMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF90b19kb3VibGUpOiAgRG9uJ3QgYmlhcyBleHBvbmVudCB3aGVuCi0JaGFuZGxpbmcgemVybydzLCBkZW5vcm1zIG9yIE5hTnMuCi0KLVRodSBBcHIgMTEgMTM6MzY6NTYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfdG9fZG91YmxlKTogIEZpeCBidWdzIHdpdGggaGFuZGxpbmcKLQludW1iZXJzIHdpdGggZnJhY3Rpb25zIDwgMzIgYml0cy4KLQotTW9uIEFwciAgOCAxNDo0ODozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCi1UdWUgTWFyIDE5IDIyOjAyOjA3IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRml4IGZvciBub24tbWFuZ2xlZCBwb2ludGVyCi0JYXJndW1lbnRzLgotCi1GcmkgTWFyICA4IDE3OjI0OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiBzcmNkaXIgaXMgYC4nIGFuZCB3aXRoX3RhcmdldF9zdWJkaXIgaXMgbm90Ci0JYC4nLCB0aGVuIHNldCBNVUxUSVNSQ1RPUCBiZWZvcmUgY2FsbGluZyBjb25maWctbWwuaW4uCi0KLVRodSBNYXIgIDcgMTM6Mzc6MTAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAobXB3X29wZW4pOiBBZGQgZGVidWdnaW5nIG91dHB1dCBvcHRpb24uCi0KLVdlZCBNYXIgIDYgMTc6MzY6MDMgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBGaXggZm9yIGFkZHJlc3Mtb2YtZXh0ZXJuIGFyZ3VtZW50cy4KLQotVHVlIEZlYiAyNyAxMjowMDo1MCAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAobXB3aWZ5X2ZpbGVuYW1lKTogQ2hhbmdlIDYgdG8gNSBpbgotCXN0cm5jbXAgKHVuaXhuYW1lLCAiL3RtcC8iLCA1KS4KLQotVHVlIEZlYiAyMCAxMDo1NTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEluaXRpYWxpemUgaXNfYm9vbC4gIENvcnJlY3RseQotCWhhbmRsZSAwIGFzIGEgcG9pbnRlciB2YWx1ZSBwYXJhbWV0ZXIuCi0KLU1vbiBGZWIgIDUgMTY6NDE6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVwZW5kIHVwb24gcmVxdWlyZWQtbGlzdC4KLQkocmVxdWlyZWQtbGlzdCk6IE5ldyB0YXJnZXQuCi0JKGNsZWFuKTogUmVtb3ZlIHJlcXVpcmVkLWxpc3QuCi0KLVdlZCBKYW4gMzEgMTA6MTk6NDEgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogd2luMzIuYzogRGVsZXRlZC4KLQkqIGNvbmZpZy50YWJsZSAoaTM4Ni0qLXdpbjMyKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9taC1pMzg2d2luMzI6IERlbGV0ZWQuCi0KLVRodSBKYW4gMTggMTE6MzQ6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2hhbmdlIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgYW5kIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouICBEb24ndCBjYXN0IHJldHVybiB2YWx1ZS4KLQotVHVlIEphbiAxNiAxMjoxMzoxMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5jOiBJbmNsdWRlIFRpbWVyLmgsIGluIG9yZGVyIHRvIGdldCBtNjhrIE1pY3Jvc2Vjb25kcyB0cmFwCi0JZGVmaW5pdGlvbi4KLQotV2VkIEphbiAgMyAxMzoxNTowNCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5jOiBVcGRhdGUgY29weXJpZ2h0IHRvIDE5OTYuCi0JKF9vYnN0YWNrX21lbW9yeV91c2VkKTogRGVmaW5lIG5ldyBmdW5jdGlvbi4gIENhbGxlZCB2aWEKLQlvYnN0YWNrX21lbW9yeV91c2VkIG1hY3JvLgotCi1UaHUgRGVjIDI4IDExOjM5OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeHN0cmR1cC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgeHN0cmR1cC5jLgotCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgeHN0cmR1cC5vLgotCSh4c3RyZHVwLm8pOiBOZXcgdGFyZ2V0LgotCi1Nb24gRGVjIDExIDE4OjE4OjUyIDE5OTUgIE1pa2UgU3R1bXAgIDxtcnNAY3lnbnVzLmNvbT4KLQotCSogYXRleGl0LmM6IE5ldyBzdHViIHRvIHByb3ZpZGUgYXRleGl0IG9uIHN5c3RlbXMgdGhhdCBoYXZlCi0Jb25fZXhpdCwgbGlrZSBTdW5PUyA0LjEueCBzeXN0ZW1zLgotCSogZnVuY3Rpb25zLmRlZiAob25fZXhpdCwgYXRleGl0KTogRGl0dG8uCi0KLU1vbiBEZWMgMTEgMTU6NDI6MTQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAobXB3X2Fib3J0KTogUmVtb3ZlIGRlY2wuCi0JKG1wd19hY2Nlc3MpOiBNb3ZlIGRlYnVnZ2luZyBwcmludGYuCi0KLVNhdCBEZWMgIDIgMDE6MjU6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IENvbnNpc3RlbnRseSB1c2UgJHtob3N0fSByYXRoZXIgdGhhbiAke3hob3N0fSBvcgotCSR7dGFyZ2V0fS4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYm90aGVyIHRvIHNldCAke3hob3N0fSBiZWZvcmUgY2FsbGluZwotCWNvbmZpZy50YWJsZS4KLQotVHVlIE5vdiAyOCAxNDoxNjo1NyAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguYy5vKTogVXNlIHRlc3QgaW5zdGVhZCBvZiB0aGUgbGVmdCBicmFja2V0LCB0bwotCWF2b2lkIHByb2JsZW1zIHdpdGggc29tZSB2ZXJzaW9ucyBvZiBtYWtlLgotCi1UdWUgTm92IDI4IDExOjQ1OjE3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBGaXggSU5DRElSIGVkaXQgdG8gd29yayB3aXRoIE5vdiAxNCBjaGFuZ2UuCi0KLVR1ZSBOb3YgMjEgMTE6MjY6MzQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtaHB1eDogUmVtb3ZlLiAgSXQgd2FzIG9ubHkgdXNlZCB0byBkZWZpbmUgRVhUUkFfT0ZJTEVTLAotCXdoaWNoIHdhcyBzZXQgdG8ganVzdCBhbGxvY2Eubywgd2hpY2ggaXMgbm93IGF1dG9tYXRpY2FsbHkgbWFya2VkCi0JYXMgbmVlZGVkIGJ5IHRoZSBhdXRvY29uZmlndXJhdGlvbiBwcm9jZXNzLgotCi1UdWUgTm92IDIxIDE0OjE1OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBDaGVjayAke3dpdGhfY3Jvc3NfaG9zdH0gcmF0aGVyIHRoYW4gY29tcGFyaW5nCi0JJHtob3N0fSBhbmQgJHt0YXJnZXR9LgotCi1UaHUgTm92IDE2IDE0OjM0OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiB3aXRoX3RhcmdldF9zdWJkaXIgaXMgZW1wdHksIHNldCB4aG9zdCB0bwotCSR7aG9zdH0gcmF0aGVyIHRoYW4gJHt0YXJnZXR9IGJlZm9yZSBjYWxsaW5nIGNvbmZpZy50YWJsZS4KLQotVHVlIE5vdiAxNCAwMTozODozMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTVVMVElUT1ApOiBEZWxldGVkLgotCShNVUxUSVNSQ1RPUCwgTVVMVElCVUlMRFRPUCk6IE5ldy4KLQkoRkxBR1NfVE9fUEFTUyk6IERlbGV0ZSBJTkNESVIuCi0JKElOQ0RJUik6IEFkZCAkKE1VTFRJU1JDVE9QKS4KLQkoaW5zdGFsbF90b19saWJkaXIpOiBBZGQgJChNVUxUSVNVQkRJUikuICBDYWxsICQoTVVMVElETykuCi0JKiBjb25maWd1cmUuaW46IERlbGV0ZSBjYWxsIHRvIGNmZy1tbC1jb20uaW4uICBDYWxsIGNvbmZpZy1tbC5pbgotCWluc3RlYWQgb2YgY2ZnLW1sLXBvcy5pbi4KLQkoY3Jvc3MtY29tcGlsZSBjaGVjayk6IENoYW5nZSB0byB0ZXN0IGZvciB3aXRoX3RhcmdldF9zdWJkaXIuCi0JKEVYVFJBX0xJTktTKTogRGVsZXRlLgotCi1TdW4gTm92IDEyIDEyOjEzOjA0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgZ2V0cGFnZXNpemUuYy5vIHRvIG5lZWRlZC1saXN0LgotCSogbXB3LmMgW1VTRV9NV19IRUFERVJTXTogQ29uZGl0aW9uYWxpemUgY29tcGlsaW5nIG9mCi0JZnVuY3Rpb25zIHRoYXQgYXJlIHN1cHBsaWVkIGJ5IE1ldHJvd2Vya3MgbGlicmFyaWVzLgotCShmc3RhdCk6IENsZWFuIHVwIGRlc2NyaXB0b3ItPnBvaW50ZXIgY29udmVyc2lvbiBjb2RlLgotCShJbnN0YWxsQ29uc29sZSwgZXRjKTogRW1wdHkgZGVmaW5pdGlvbnMsIGZvciB3aGVuIGxpbmtpbmcKLQl3aXRoIFNJT1VYLgotCi1TdW4gTm92ICA1IDE5OjI1OjI3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBBbHNvIHBhc3MgUElDRkxBR1MuCi0JKC5jLm8pOiAgU3R5bGlzdGljIGNoYW5nZS4KLQotVGh1IE5vdiAgMiAxMjowNjoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cnRvbC5jLCBzdHJ0b3VsLmM6IERvbid0IGluY2x1ZGUgPHN0ZGxpYi5oPi4gIEZyb20KLQlwaGRtQGluZm8udWNsLmFjLmJlIChQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDExOjU5OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDb3JyZWN0IHNlZCBjYWxsLgotCi1Nb24gT2N0IDMwIDEzOjAzOjQ1IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46ICBDbGVhbiB1cCAvIHNpbXBsaWZ5IGZvciBuYXRpdmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1lcmdlIGluIHN0dWZmIGZyb20gLi4veGliZXJ0eS9jb25maWd1cmUuaW4uCi0JKiBNYWtlZmlsZS5pbiAoQ0MpOiAgQWRkIGRlZmluaXRpb24gKHNvIGl0IGNhbiBiZSBvdmVycnJpZGRlbgotCWJ5IC4uL2NvbmZpZ3VyZSkuCi0KLVR1ZSBPY3QgMjQgMTc6NTc6MjcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IExlYXZlIHN0cmVycm9yLmMubyBpbiBzdGFuZGFyZCBsaXN0IG9mIGZ1bmN0aW9ucy4KLQkqIG1wdy5jIChSX09LLCBFTk9FTlQsIEVBQ0NFU1MsIEVOT1NZUyk6IFJlbW92ZS4KLQkobGluayk6IFJlbW92ZSB1c2VsZXNzIGRlZmluaXRpb24gd2l0aCBlcnJvciByZXR1cm4uCi0JKGxhc3RfbWljcm9zZWNvbmRzLCB3YXJuX2lmX3NwaW5fZGVsYXksIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSk6Ci0JVXNlIFVuc2lnbmVkV2lkZSB0eXBlIGZvciBtaWNyb3NlY29uZCBjb3VudHMuCi0KLVRodSBPY3QgMTkgMTA6NTI6MDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogbWVtY21wLmMgKG1lbWNtcCk6IEFyZ3VtZW50IHR5cGVzIGFyZSBjb25zdCB2b2lkICosIG5vdCB2b2lkCi0JKmNvbnN0LgotCi0JKiBzdHJuY2FzZWNtcC5jIChzdHJuY2FzZWNtcCk6IEluY2x1ZGUgYW5zaWRlY2wuaC9zdGRhcmcuaCwgbm90Ci0Jc3lzL3R5cGVzLmguCi0JKiBzdHJjYXNlY21wLmMgKHN0cmNhc2VjbXApOiBEaXR0by4KLQotVHVlIE9jdCAxMCAxMTowMzoyNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogIFJlbW92ZSBtYWNyby4KLQotVHVlIFNlcCAyNiAxNTowNjo0NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBBZGQgZGVmYXVsdCBlbXB0eSBkZWZpbml0aW9uLgotCSogbXB3LWNvbmZpZy5pbiAoY29uZmlnLmgpOiBPbmx5IHVwZGF0ZSBpZiBjaGFuZ2VkLgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIGVkaXRzIE1ha2VmaWxlLmluIGludG8gTVBXIG1ha2VmaWxlLgotCSogbXB3LmM6IFJlbW92ZSBzZW1pLWNsb25lIG9mIHN0cmVycm9yIGNvZGUuCi0JKHN5c19uZXJyLCBzeXNfZXJybGlzdCk6IERlZmluZSBoZXJlLgotCShNaWNyb3NlY29uZHMpOiBPbmx5IGRlZmluZSBhcyBBLWxpbmUgdHJhcCBpZiBtNjhrIE1hYy4KLQotV2VkIFNlcCAyMCAxMjo1MzozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIGRpc3RjbGVhbi4KLQotTW9uIEF1ZyAyOCAxOTo0Nzo1MiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiAgRm9yIGhvc3QsIGdlbmVyYWxpemUgcnM2MDAwLWlibS1haXgqCi0JdG8gKi1pYm0tYWl4KiBzbyB3ZSBhbHNvIGluY2x1ZGUgcG93ZXJwYy4KLQotVHVlIEF1ZyAyMiAwMzoxODowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlGcmkgSnVuIDE2IDE4OjM1OjQwIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB4c3RyZXJyb3IuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiwgdm1zYnVpbGQuY29tOiBDb21waWxlIGl0LgotCi1Nb24gSnVsIDMxIDEyOjE2OjMyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZSAoaTM4Ni0qLXdpbjMyKTogTmV3LgotCi1GcmkgSnVsIDIxIDExOjM1OjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNVUxUSVRPUCk6IE5ldyB2YXJpYWJsZS4KLQkoTVVMVElESVJTLCBNVUxUSVNVQkRJUiwgTVVMVElETywgTVVMVElDTEVBTik6IExpa2V3aXNlLgotCShhbGwpOiBBZGQgbXVsdGlsaWIgc3VwcG9ydC4KLQkoaW5zdGFsbF90b190b29sZGlyLCAqY2xlYW4pOiBMaWtld2lzZS4KLQotTW9uIEp1bCAxMCAxMTo0NzoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWFrZWZpbGUuZG9zIChPQkpTKTogQWRkIGhleC5vLiAgRnJvbSBESiBEZWxvcmllLgotCi1GcmkgSnVuIDMwIDE3OjI4OjU5IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB2bXNidWlsZC5jb206ICBjcmVhdGUgIm5ldy1saWIub2xiIiwgYnVpbGQgbGliaWJlcnR5IHVuZGVyIHRoYXQKLQluYW1lLCBhbmQgdGhlbiBtYWtlIGl0IGJlY29tZSAibGliZXJ0eS5vbGIiIHdoZW4gZG9uZSwgc28gdGhhdCBhbgotCWluY29tcGxldGUgYnVpbGQgYXR0ZW1wdCBuZXZlciBsZWF2ZXMgYmVoaW5kIHNvbWV0aGluZyB3aGljaCBsb29rcwotCWxpa2UgYSBjb21wbGV0ZSBsaWJyYXJ5LgotCi1UaHUgSnVuIDI5IDAwOjIyOjAyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9taC1pMzg2cGU6IE5ldyBmaWxlIGZvciBQRSBob3N0cy4KLQkqIGNvbmZpZy50YWJsZTogVW5kZXJzdGFuZCBQRSBob3N0cy4KLQotV2VkIEp1biAyOCAxOToxMzoyMyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IFVwZGF0ZSBmcm9tIGdjYy4KLQotCSogYXJndi5jLCBkdW1teS5jOiBJZiBfX1NURENfXywgI2luY2x1ZGUgImFsbG9jYS1jb25mLmgiIGFmdGVyCi0gICAgICAgIDxzdGRkZWYuaD4uCi0JKiBhbGxvY2Etbm9ybS5oOiBJZiBfX1NURENfXywgZGVjbGFyZSBhbGxvY2Egd2l0aCBpdHMgcGFyYW1ldGVyLgotCi1UaHUgSnVuIDIyIDE4OjU3OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2UuaW4gKEFMTF9DRkxBR1MpOiBEZWZpbmUgTkVFRF9iYXNlbmFtZS4KLQkqIG1wdy5jOiBPbmx5IHRlc3QgRGVidWdQSSBvbmNlIHdoZW5ldmVyIHByaW50aW5nIGRlYnVnIGluZm8uCi0JKG1wd2lmeV9maWxlbmFtZSk6IElmIGZpbGVuYW1lIGlzIC90bXAvZm9vLCBjaGFuZ2UgaXQgaW50byA6X2ZvbywKLQlhbHNvIGZpeCB0byBub3Qgd3JpdGUgb24gaW5wdXQgZmlsZW5hbWUgYnVmZmVyLgotCShtcHdfYWNjZXNzKTogVXNlIHN0YXQoKSBpbnN0ZWFkIG9mIG9wZW4oKSwgd29ya3MgZm9yIGRpcmVjdG9yaWVzCi0JYXMgd2VsbCBhcyBmaWxlcy4KLQotTW9uIEp1biAxOSAwMDozMzoyMiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IE1hc3NhZ2UgYnJva2VuIHNoZWxscyB0aGF0IHJlcXVpcmUgJ2Vsc2UgdHJ1ZScuCi0KLVNhdCBKdW4gMTcgMjM6MjE6NTggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1ub3JtLmg6IERlY2xhcmUgYWxsb2NhIGFzIHR5cGUgIlBUUiIgdG8gbWF0Y2ggZnVuY3Rpb25zLmRlZi4KLQlEZWNsYXJlIF9fYnVpbHRpbl9hbGxvY2EgaW4gdGhlIHNwYXJjIGNhc2UsIGFzIGFyZ3YuYyBkaWQuCi0JKiBhcmd2LmM6IFJlcGxhY2UgaW5saW5lIHZlcnNpb24gb2YgYWxsb2NhLW5vcm0uaCBhdCBzdGFydCBvZiBmaWxlIHdpdGgKLQlhICNpbmNsdWRlIG9mIGFsbG9jYS1jb25mLmguICBQcmVjZWRlIGl0IHdpdGggYW4gaW5jbHVkZSBvZiBhbnNpZGVjbC5oCi0JYmVjYXVzZSBhbGxvY2Etbm9ybS5oIG5lZWRzIHRvIGRlY2xhcmUgYWxsb2NhIGFzICJQVFIiLgotCi1Nb24gSnVuIDEyIDE0OjI0OjI2IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHdpbjMyLmM6IE5ldyBmaWxlLgotCi1GcmkgSnVuICA5IDE1OjE2OjE0IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBkdW1teS5jOiAjaW5jbHVkZSAiYWxsb2NhLWNvbmYuaCIuCi0KLVdlZCBKdW4gIDcgMTE6NDY6MjMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBzdGFtcC1waWNkaXIuCi0JKGNsZWFuKTogRG9uJ3QuCi0KLU1vbiBKdW4gIDUgMTg6NDY6MDYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZSAoZnJhZ3MpOiBVc2UgdG9wbGV2ZWwgcGljIGZyYWdzLgotCi0JKiBNYWtlZmlsZS5pbiAoUElDRkxBRyk6IE5ldyBtYWNyby4KLQkoYWxsKTogRGVwZW5kIG9uIHN0YW1wLXBpY2Rpci4KLQkobmVlZGVkLWxpc3QpOiBEaXR0by4KLQkoLmMubyk6IEFsc28gYnVpbGQgcGljIG9iamVjdC4KLQkoc3RhbXAtcGljZGlyKTogTmV3IHJ1bGUuCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIHBpYy4KLQkoY2xlYW4pOiBSZW1vdmUgc3RhbXAtcGljZGlyLgotCi1GcmkgTWFyIDI0IDE2OjU1OjQ4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB2bXNidWlsZC5jb20gKGNvbmZpZy5oKTogQWRkIGAjZGVmaW5lIE5FRURfYmFzZW5hbWUnLgotCi1UdWUgTWF5IDIzIDEwOjEyOjQ2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjbG9jay5jLCBnZXRvcHQuYywgc3RydG9kLmMsIHZzcHJpbnRmLmM6ICBDaGFuZ2UgZnJvbSB1c2luZyBMR1BMCi0JdG8gbGliaW8tc3R5bGUgY29weXJpZ2h0LgotCSogZ2V0cGFnZXNpemUuYzogIFJlbW92ZSBGU0YgY29weXJpZ2h0LgotCi1TYXQgTWF5IDIwIDEyOjMwOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCUFkZGVkIGltcHJvdmVkIFZNUyBzdXBwb3J0IGZyb20gUGF0IFJhbmtpbjoKLQotCUZyaSBNYXIgMTcgMTg6NDA6MzYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHZtc2J1aWxkLmNvbTogIG5ldyBmaWxlLgotCi0JKiBnZXRwYWdlc2l6ZS5jIChnZXRwYWdlc2l6ZSk6ICBpbXBsZW1lbnQgZm9yIFZNUzsKLQkqIHN0cmVycm9yLmMgKHN0cmVycm9yLCBzdHJlcnJubywgc3RydG9lcnJubyk6ICBhZGQgcnVkaW1lbnRhcnkKLQlzdXBwb3J0IGZvciBFVk1TRVJSLgotCi1UaHUgTWF5IDE4IDE3OjAxOjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2FybV9leHQpOiBEZWZpbmUuCi0KLVR1ZSBNYXkgMTYgMTM6MzA6NTkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGJhc2VuYW1lLmMsIGJjbXAuYywgZ2V0Y3dkLmMsIGluc3F1ZS5jLCByZW5hbWUuYywgc2lnc2V0bWFzay5jLAotCXN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgUmVtb3ZlIEZTRiBjb3B5cmlnaHQuCi0JKiBzaWdzZXRtYXNrLmM6ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLSBzZWVtcyB0byBiZSBuZWVkZWQgYnkgSVNDLgotCi1Nb24gTWF5IDE1IDE5OjUzOjE3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBiY29weS5jLCBiemVyby5jLCBtZW1jbXAuYywgbWVtY3B5LmMsIG1lbXNldC5jLCBzdHJjaHIuYywKLQlzdHJyY2hyLmMsIHN0cnN0ci5jLCB2Zm9yay5jOiAgUmVtb3ZlIEZTRiBDb3B5cmlnaHQsIGJlY2F1c2UgdGhpcwotCW1pZ2h0IGNvbnRhbWluYXRlIGxpYnN0ZGMrKyB3aXRoIHRoZSBMR1BMLiAgKE9LJ2QgYnkgUk1TIDExIE9jdCA5NC4pCi0JKiBzdHJjaHIuYywgc3RycmNoci5jOiAgQWRkIGNhc3QgdG8gc3VwcHJlc3MgY29uc3Qgd2FybmluZy4KLQotVGh1IE1heSAgNCAxNDozNjo0MiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IFVzZSBjb25zdCBpbnN0ZWFkIG9mIENPTlNULiAgRG9uJ3QgaW5jbHVkZQotICAgICAgICBhbnNpZGVjbC5oIGRpcmVjdGx5LgotCi1XZWQgQXByIDE5IDAxOjMwOjI3IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogRG9uJ3QgaW5jbHVkZSBsaWJpYmVydHkuaC4gIERvIGRlY2xhcmUgeG1hbGxvYyBhbmQKLSAgICAgICAgeHJlYWxsb2MuCi0JKC1ETUFJTik6IERvbid0IHJlbHkgb24gYW4gZXh0ZXJuYWxseS1kZWZpbmVkIHZlcnNpb24gbnVtYmVyOwotICAgICAgICBpbnN0ZWFkLCByZXF1aXJlIHRoZSB2ZXJzaW9uIG51bWJlciB0byBiZSBkZWZpbmVkIGFzIGEKLSAgICAgICAgcHJlcHJvY2Vzc29yIG1hY3JvLiAgSGFuZGxlIHRoZSBSUy82MDAwIGxlYWRpbmcgZG90LiAgRGVmaW5lCi0gICAgICAgIHhtYWxsb2MsIHhyZWFsbG9jIGFuZCBmYXRhbC4gIERvbid0IHN0cmlwIGEgbGVhZGluZyB1bmRlcnNjb3JlCi0gICAgICAgIGlmIHdlIGNvdWxkbid0IGRlbWFuZ2xlIHRoZSB3b3JkLgotCi1UdWUgQXByICA0IDEzOjAzOjUxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCShPbGQgbXB3LmMgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0JKiBtcHcuYyAod2FybmluZ190aHJlc2hvbGQpOiBEZWZhdWx0IHRvIC40IHNlYy4KLQkob3ZlcmZsb3dfY291bnQsIGN1cnJlbnRfcHJvZ3Jlc3MpOiBOZXcgZ2xvYmFscy4KLQkod2Fybl9pZl9zcGluX2RlbGF5KTogSW5jbHVkZSBjdXJyZW50IHByb2dyZXNzIHR5cGUsCi0Jc3VjaCBhcyBwcm9ncmFtIG5hbWUsIGluIG1lc3NhZ2UuCi0JKG1wd19zdGFydF9wcm9ncmVzcyk6IFNldCBjdXJyZW50X3Byb2dyZXNzIHZhcmlhYmxlIGZyb20gYXJnLgotCShtcHdfZW5kX3Byb2dyZXNzKTogUmVwb3J0IHNwaW4gZGVsYXlzIGJ5IHBvd2VyLW9mLXR3by1zaXplCi0JYnVja2V0cyBpbnN0ZWFkIG9mIGNvbnN0YW50LXNpemUgYnVja2V0cy4KLQotCSogbXB3LmM6IENsZWFuIHVwIGZvcm1hdHRpbmcsIHR5cGVzLCByZXR1cm5zLCBldGMuCi0JKEVOT1NZUyk6IERlZmluZS4KLQkobXB3X2ZyZWFkLCBtcHdfZndyaXRlKTogRGVmaW5lLgotCShzbGVlcCk6IERlZmluZSBjb3JyZWN0bHkuCi0KLQkqIG1wdy5jOiBOZXcgY29kZSB0byBpbXBsZW1lbnQgY3Vyc29yIHNwaW5uaW5nIHN1cHBvcnQuCi0JKHVtYXNrKTogTmV3IGZ1bmN0aW9uLgotCShtcHdfZm9wZW4sIG1wd19mc2Vlaywgc3RhdCwgZnN0YXQpOiBDYWxsIFBST0dSRVNTLgotCi0JKiBtcHcuYyAobXB3X2Jhc2VuYW1lLCBtcHdfbWl4ZWRfYmFzZW5hbWUpOiBOZXcgZnVuY3Rpb25zLCBmaW5kCi0JYmFzZW5hbWVzIGZvciBNUFcgYW5kIE1QVy9Vbml4IGZpbGVuYW1lcy4KLQkobXB3X3NwZWNpYWxfaW5pdCk6IE5ldyBmdW5jdGlvbiwgY2FsbHMgTWFjc2J1ZyBpZiBkZXNpcmVkLgotCi0JKiBtcHcuYzogQWRkIEdQTCBub3RpY2UuCi0JKG1wd2lmeV9maWxlbmFtZSk6IEFkZCBtb3JlIHRyYW5zZm9ybWF0aW9ucy4KLQkobXB3X2ZvcGVuKTogQ2FsbCBtcHdpZnlfZmlsZW5hbWUgb24gZmlsZSBuYW1lcy4KLQkocmVuYW1lKTogUmVtb3ZlLgotCShjaGRpciwgZ2V0Y3dkKTogQWRkIHNpbXBsZSBkZWZpbml0aW9ucy4KLQotCSogbXB3LmM6IFJhbmRvbSBjbGVhbnVwcywgcmVtb3ZlIHVudXNlZCBjb2RlIGJpdHMuCi0JQWRkZWQgY29weSBvZiBzdHJlcnJvci5jIGZvciBnY2MncyB1c2UuCi0JKHN0YXQsIGZzdGF0LCBfc3RhdCk6IE5ldyB2ZXJzaW9ucyBiYXNlZCBvbiBHdWlkbyB2YW4gUm9zc3VtIGNvZGUuCi0KLQkqIG1wdy5jIChtcHdfZnNlZWspOiBNYWtlIGl0IHdvcmsgY29ycmVjdGx5IHdoZW4gZG9pbmcgU0VFS19DVVIuCi0KLQkqIG1wdy5jIChzdGF0KTogUmVtb3ZlIGhhY2sgZGVmaW5pdGlvbiwgZ2V0IGZyb20gc3lzL3N0YXQuaC4KLQkoZm9yaywgdmZvcmssIGV0Yyk6IFByaW50IGVycm9yIG1lc3NhZ2VzIGlmIGNhbGxlZC4KLQkoZ2V0cnVzYWdlLCBzYnJrLCBlbnZpcm9uLCBpc2F0dHksIGxpbmssIHV0aW1lLCBta2Rpciwgcm1kaXIsCi0JcmVuYW1lLCBjaG93bik6IERlZmluZS4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0JKiBtcHcuYzogTmV3IGZpbGUsIE1QVyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzLgotCi1GcmkgTWFyIDI0IDE0OjEwOjMwIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBiYXNlbmFtZS5jOiBJbmNsdWRlIGNvbmZpZy5oIGJlZm9yZSBjaGVja2luZyBmb3IgTkVFRF9iYXNlbmFtZS4KLQotVGh1IE1hciAyMyAxOTowOTo1NCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogZnVuY3Rpb25zLmRlZjogQWRkIERFRkZVTkMgZm9yIGJhc2VuYW1lLgotCi0JKiBiYXNlbmFtZS5jOiBPbmx5IGRlZmluZSBiYXNlbmFtZSBpZiBORUVEX2Jhc2VuYW1lLgotCi1UaHUgTWFyIDE2IDEzOjM2OjA1IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IEZpeCAtLWVuYWJsZS1zaGFyZWQgbG9naWMgZm9yIG5hdGl2ZSBidWlsZHMuCi0KLU1vbiBNYXIgMTMgMTE6MDU6MTEgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IERlbWFuZ2xlIGJvb2wgbGl0ZXJhbHMgcHJvcGVybHkuCi0KLU1vbiBNYXIgIDYgMjM6NTc6MjggMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogc3RydG9sLmMgc3RydG91bC5jOiAgUmVwbGFjZSB0aGVzZSB3aXRoIGxlc3MgYnVnZ3kgdmVyc2lvbnMgZnJvbQotCU5ldEJTRC4gIChzdHJ0b3VsIGluIHBhcnRpY3VsYXIgY291bGRuJ3QgaGFuZGxlIGJhc2UgMTYuKQotCi1XZWQgTWFyICAxIDE1OjU5OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXZ4d29ya3M1IChIREVGSU5FUyk6IERlZmluZSBOT19TWVNfUEFSQU1fSC4KLQotCSogY2xvY2suYzogSWYgTk9fU1lTX1BBUkFNX0ggaXMgZGVmaW5lZCwgZG9uJ3QgaW5jbHVkZQotCTxzeXMvcGFyYW0uaD4uCi0JKiBnZXRjd2QuYywgZ2V0cGFnZXNpemUuYywgZ2V0cnVudGltZS5jOiBMaWtld2lzZS4KLQotRnJpIEZlYiAxNyAxNTo0MDo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdldHJ1bnRpbWUuYyAoZ2V0X3J1bl90aW1lKTogRG9uJ3QgYXNzdW1lIHRoYXQgQ0xPQ0tTX1BFUl9TRUMgaXMKLQlhIG51bWJlcjsgQU5TSSBhcHBlYXJzIHRvIHBlcm1pdCBhbnkgZXhwcmVzc2lvbiwgaW5jbHVkaW5nIGEKLQlmdW5jdGlvbiBjYWxsLgotCi0JKiBjb25maWcudGFibGUgKCotKi12eHdvcmtzNSopOiBVc2UgbXQtdnh3b3JrczUgd2hlbiBjb25maWd1cmluZwotCXhpYmVydHkuCi0JKiBjb25maWcvbXQtdnh3b3JrczU6IE5ldyBmaWxlLgotCi1UaHUgRmViICA5IDE0OjE5OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmFzZW5hbWUuYyAoYmFzZW5hbWUpOiBDaGFuZ2UgYXJndW1lbnQgdG8gYmUgY29uc3QuCi0KLVdlZCBGZWIgIDggMTg6MDY6NTIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBEb24ndCB3b3JyeSBhYm91dCB4bWFsbG9jLgotCi1TdW4gSmFuIDE1IDAwOjQwOjM2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRGVsZXRlIHhob3N0LW1rZnJhZy4KLQotVGh1IEphbiAxMiAxNjo1NDoxOCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IElmIGFsbG9jYS5vIGlzIG5lZWRlZCwgc28gaXMgeG1hbGxvYy5vLgotCi1XZWQgSmFuIDExIDIyOjM5OjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGhleC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMsIENGSUxFUyk6IExpc3QgaXQuCi0JKGhleC5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IEZvciBHTlUgc3R5bGUgY29uc3RydWN0b3IgYW5kCi0JZGVzdHJ1Y3RvciBuYW1lcywgdHJ5IGRlbWFuZ2xpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nLgotCi1XZWQgRGVjIDI4IDAwOjQ5OjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogdmFzcHJpbnRmLmMgKGludF92YXNwcmludGYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh2YXNwcmludGYpOiBVc2UgaW50X3Zhc3ByaW50Zi4gIFJlbW92ZXMgYXNzdW1wdGlvbiB0aGF0IHZhX2xpc3QKLQlpcyBhc3NpZ25tZW50IGNvbXBhdGlibGUuCi0KLVNhdCBOb3YgIDUgMTk6Mjk6MTIgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChMSUJDRkxBR1MpOiBOZXcgdmFyaWFibGUuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGl0LgotCSguYy5vKTogVXNlIGl0LgotCi1UaHUgTm92ICAzIDE5OjA5OjQ3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmM6IERvIGNvbXBpbGUgdGhlc2UgZnVuY3Rpb25zIHVuZGVyIExpbnV4LAotCXNpbmNlIG1hbnkgbmF0aXZlIHZlcnNpb25zIGFyZSBiYXNlZCBvbiBnbGliYyBidXQgYXJlIGJ1Z2d5LgotCi1Nb24gT2N0IDI0IDE1OjE2OjQ2IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiB2YXNwcmludGYuYzogIE1ha2UgJ2Zvcm1hdCcgYXJnIGJlIGNvbnN0LCB0byBhdm9pZCBhIG1pc21hdGNoCi0Jd2l0aCBwcm90b3R5cGUgaW4gR05VIGxpYmMuICBTdXBwb3J0IHN0ZGFyZy5oIGFzIHdlbGwgYXMgdmFyYXJncy5oLgotCi1UdWUgT2N0IDExIDE3OjQ4OjI3IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTKTogQWRkIHZhc3ByaW50Zi5vLgotCSogZnVuY3Rpb25zLmRlZjogUmVtb3ZlIHZhc3ByaW50Zi4KLQotV2VkIFNlcCAxNCAxNzowNDo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYyAoZmlyc3RfYnJlYWspOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBSZWNvcmQgc2JyayAoMCkgaW4gZmlyc3RfYnJlYWsuCi0JKHhtYWxsb2MpOiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywgdHJ5IHRvIHJlcG9ydCBob3cgbXVjaAotCW1lbW9yeSB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBwcm9ncmFtIHVwIHRvIHRoaXMgcG9pbnQuCi0JKHhyZWFsbG9jKTogTGlrZXdpc2UuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogTWFrZWZpbGUuaW4gKEVSUk9SU19DQyk6IE5ldyB2YXJpYWJsZSwgZGVmYXVsdGVkIHRvICQoQ0MpLiAgVXNlIGl0Ci0Jd2hlbiBsaW5raW5nIGR1bW15LgotCSogY29uZmlnLnRhYmxlOiBBZGQgaG9zdCBSSVNDaVggTWFrZWZpbGUgZnJhZy4KLQkqIGNvbmZpZy9taC1yaXNjaXg6IE5ldyBmaWxlLgotCi1UaHUgQXVnIDI1IDE3OjI5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBEZWZpbmUuCi0JKCQoUlVMRTEpKTogVXNlICQoRkxBR1NfVE9fUEFTUykuCi0KLVdlZCBBdWcgMjQgMTc6MDg6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB2YXNwcmludGYuYzogSW5jbHVkZSA8c3RyaW5nLmg+LgotCSh2YXNwcmludGYpOiBBZGQgY2FzdHMgdG8gdm9pZCBmb3IgdmFfYXJnIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KLQkqIHhhdGV4aXQuYzogRGVjbGFyZSBtYWxsb2MuCi0KLUZyaSBBdWcgMTkgMTU6Mjk6MTIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FyZ3MpOiBGaXggYSBidWcgaW4gcHJldmlvdXMgcGF0Y2ggKHRoZQotCW9uZSBiZWxvdykuCi0KLVRodSBBdWcgMTggMTQ6Mzc6MTQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlIGFyZ3MpOiBIYW5kbGUgQVJNIHJlcGVhdCBlbmNvZGluZyB3aGVyZQotICAgICAgICB0aGUgdHlwZSBpbmRleCBpcyBncmVhdGVyIHRoYW4gOS4KLQotV2VkIEF1ZyAxNyAxNjoxMzo0OSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkKTogYWNjZXB0IG9wdGlvbmFsICdfJyBiZXR3ZWVuCi0JcXVhbGlmaWVkIG5hbWUuIFRoaXMgaXMgYmFlY2F1c2UgdGhlIHRlbXBsYXRlIG5hbWUgbWF5IGVuZCB3aXRoCi0JbnVtZXJpYyBhbmQgY2FuIG1peGVkIHVwIHdpdGggdGhlIGxlbmd0aCBvZiBuZXh0IHF1YWxpZmllZCBuYW1lLgotCi1XZWQgQXVnICAzIDA1OjUyOjE0IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LXN1bm9zNDogVXNlIG91ciBzdGFuZGFyZCBsb2NhdGlvbiBmb3IgY3Jvc3MtaW5jbHVkZXMKLQlhbmQgY3Jvc3MtbGlicyB3aGVuIHRoZSB0YXJnZXQgaXMgYWxzbyBhICJob3N0IiBlbnZpcm9ubWVudCAoaWUgbm8KLQluZXdsaWI7IGluY2x1ZGVzIGFuZCBzdWNoIGRvbid0IGJlbG9uZyB0byB1cykuICBUaGlzIGlzIHNwZWNpZmljCi0JdG8gdGhlIEN5Z251cyBTdXBwb3J0IGVudmlyb25tZW50LgotCi1UdWUgQXVnICAyIDE1OjI1OjEyIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IGRlbWFuZ2xlIGFzIHh4eDwnUSc+IG5vdAotCXh4eDxjaD04MT4uCi0KLU1vbiBBdWcgIDEgMTc6MDI6NDggMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKG1haW4pOiBmbHVzaCBzdGRvdXQgdG8gbWFrZSBwaXBlIHdvcmsuCi0KLVNhdCBKdWwgMTYgMTI6NTY6MzIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGUgKCotKi1jeHV4NyopOiAgUmVjb2duaXplLgotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfbTg4MTEwX2V4dCkgW0hBUlJJU19GTE9BVF9GT1JNQVRdOgotCUhhcnJpcy1zcGVjaWZpYyBmbG9hdCBmb3JtYXQuCi0JKiBjb25maWcvbWgtY3h1eDc6IE5ldyBmaWxlLgotCi1XZWQgSnVuIDI5IDAwOjI2OjE3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHQgb2YKLQljb25zdW1lX2NvdW50IGRvZXNuJ3QgaW5kZXggYmV5b25kIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLQotTW9uIEp1biAyMCAyMzo1NDozNyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6ICBIYW5kbGUgdnRhYmxlIG1hbmdsaW5nIG9mIGdjYy0yLjQuNSBhbmQKLQllYXJsaWVyLiBJbXByb3ZlIHRlc3QgZm9yIG5ldyB2dGFibGUgbWFuZ2xpbmcuIENoYW5nZSBvdXRwdXQgYmFjawotCXRvIGB2aXJ0dWFsIHRhYmxlJy4KLQotTW9uIEp1biAyMCAxMTozNzozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogQWx3YXlzIGNvbXBpbGUgdGhpcyBjb2RlLCBldmVuIGlmIHVzaW5nIHRoZSBHTlUKLQlsaWJyYXJ5LiAgQXZvaWRzIHByb2JsZW1zIHdpdGggcmVsYXRpdmVseSByZWNlbnQgYmluYXJ5Ci0JaW5jb21wYXRpYmlsaXR5LgotCi1UaHUgSnVuIDE2IDE3OjU0OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHhtYWxsb2MsIHhyZWFsbG9jLCBmcmVlKTogRG9uJ3QgZGVjbGFyZS4KLQkoc3Ryc3RyKTogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXJzLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IERvbid0IGRlZmluZS4KLQkobG9uZ19vcHRpb25zKTogQWRkIG5vLXN0cmlwLXVuZGVyc2NvcmVzLgotCShtYWluKTogQ2FsbCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUuICBQYXNzIG4gaW4gc2hvcnQgb3B0aW9ucyB0bwotCWdldG9wdF9sb25nLiAgSGFuZGxlIG9wdGlvbiAnbicgdG8gbm90IHN0cmlwIHVuZGVyc2NvcmVzLgotCSh1c2FnZSk6IE1lbnRpb24gLW4gYW5kIC0tbm8tc3RyaXAtdW5kZXJzY29yZXMuCi0KLVN1biBKdW4gMTIgMDE6Mzc6MDkgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IFNlcGFyYXRlIGNvbnNlY3V0aXZlID4ncyB3aXRoIGEKLSAgICAgICAgc3BhY2UuCi0JKGdudV9zcGVjaWFsKTogRGVtYW5nbGUgdGVtcGxhdGUgYW5kIHF1YWxpZmllZCBuYW1lcyBpbiBhIHZ0YWJsZSBuYW1lLgotCi1GcmkgTWF5IDI3IDEyOjI3OjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQlGcm9tIGdhcy0yLjMgYW5kIGJpbnV0aWxzLTIuNCBuZXQgcmVsZWFzZXM6Ci0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogbWFrZWZpbGUuZG9zOiBbbmV3XSBNYWtlZmlsZSBmb3IgZG9zL2dvMzIKLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IGZpbGVzCi0JKiBtc2Rvcy5jOiByZW1vdmUgc29tZSBmdW5jdGlvbnMgbm93IGluIGxpYmMuYQotCi1GcmkgTWF5IDIwIDE4OjUzOjMyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiAgUmVjb2duaXplIHRodW5rcywgYXMgd2VsbCBhcwotCXRoZSBuZXcgbmFtaW5nIHN0eWxlIGZvciB2dGFibGVzICh3aGVuIC1mdnRhYmxlLXRodW5rcykuCi0KLVdlZCBNYXkgMTggMTM6MzQ6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoWFRSQUZMQUdTKTogRG9uJ3QgZGVmaW5lLgotCSguYy5vLCBkdW1teS5vKTogRG9uJ3QgdXNlIFhUUkFGTEFHUy4KLQkoJChSVUxFMSkpOiBEb24ndCBwYXNzIFhUUkFGTEFHUyBkb3duIGluIHJlY3Vyc2l2ZSBjYWxsLgotCi1GcmkgTWF5IDEzIDE2OjAyOjEyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB2YXNwcmludGYuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogQWRkIGl0LgotCi1GcmkgTWF5IDEzIDE2OjIwOjI4IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogR3JvayBib29sLgotCi1GcmkgTWF5ICA2IDE0OjQ0OjIxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkIGdvMzIKLQkqIGNvbmZpZy9taC1nbzMyOiBOZXcgdGVtcGxhdGUuCi0KLUZyaSBNYXkgIDYgMTE6MDE6NTkgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlLCBjb25maWcvbXQtc3Vub3M0OiBjb25maWcgZm9yIHdoZW4gc3VuNCBpcyBjcm9zcyB0YXJnZXQuCi0KLU1vbiBBcHIgMTEgMDA6NTQ6MzMgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogZ2V0b3B0LmMgW25vdCBfX0dOVV9MSUJSQVJZX19dIFtfX0dDQ19fXSBbbm90IF9fU1REQ19fXToKLSAgICAgICAgRGVjbGFyZSBzdHJsZW4gdG8gcmV0dXJuIGludC4gIERvbid0IGluY2x1ZGUgc3RkZGVmLmguCi0KLUZyaSBBcHIgIDEgMDA6Mzg6MTcgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBtb2xlLmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogZ2V0b3B0LmM6IERlbGV0ZSB1c2Ugb2YgSU5fR0NDIHRvIGNvbnRyb2wgd2hldGhlcgotICAgICAgICBzdGRkZWYuaCBvciBnc3RkZGVmLmggaXMgaW5jbHVkZWQuCi0KLVRodSBBcHIgMTQgMTQ6MDA6NTYgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IEZpeCBhIGJ1ZyBpbiB0ZW1wbGF0ZSBmdW5jdGlvbgotCXR5cGUgbnVtYmVyaW5nLgotCi1XZWQgQXByIDEzIDE3OjIzOjAzIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiBGaXggdGVtcGxhdGUgZnVuY3Rpb24gd2l0aCBhcm0KLQlzdHlsZSBhcmd1bWVudCB0eXBlIG51bWJlciwgVG4uCi0KLVdlZCBBcHIgMTMgMTc6MTE6MTUgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogQWRkIG5ld1tdIGFuZCBkZWxldGVbXS4KLQotRnJpIEFwciAgOCAxMToyMTo0MiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYXJndi5jIChidWlsZGFyZ3YpOiBEb24ndCBwcm9kdWNlIGVtcHR5IGFyZ3VtZW50IGp1c3QgYmVjYXVzZQotCXRoZXJlIGlzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0KLVdlZCBBcHIgIDYgMTE6NDI6MTQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogZml4ICdRJyBxdWFsaWZpZWQgbmFtZSBidWcuCi0JSGFuZGxlICdwJyBzYW1lIGFzICdQJy4KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogSGFuZGxlICdwJyBzYW1lIGFzICdQJy4KLQotU2F0IE1hciAyNiAxMjowMDoxMyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGdldF9maWVsZCwgcHV0X2ZpZWxkKTogIEZpeCBvZmYgYnkgb25lIGVycm9yIGluCi0JbGl0dGxlIGVuZGlhbiBjYXNlLgotCi1UaHUgTWFyIDI0IDEwOjQwOjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSk6IFBhc3MgdW5zaWduZWQgY2hhciAqLAotCW5vdCBjaGFyICosIHRvIHB1dF9maWVsZC4KLQotRnJpIE1hciAxOCAxMjozNDozMyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogbWVtbW92ZS5jOiAgUmUtd3JvdGU7ICBwbGFjZWQgaW4gcHVibGljIGRvbWFpbi4KLQotV2VkIE1hciAxNiAxMDozMzowNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IElmIEFSTSBkZW1hbmdsaW5nLCBkb24ndCB0cmVhdAotCV9fUSogYXMgYSBjb25zdHJ1Y3Rvci4KLQotTW9uIE1hciAxNCAxMjoyNjowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuYzogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQotTW9uIE1hciAgNyAxMjoyODoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGdldF9maWVsZCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0JKHB1dF9maWVsZCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0KLVN1biBGZWIgMjcgMjE6NTA6MTEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmM6IE5ldyBmaWxlLCBpbnRlbmRlZCB0byByZXBsYWNlIGllZWUtZmxvYXQuYy4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0KLVRodSBGZWIgMjQgMTE6NTE6MTIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogUmVtb3ZlICNpZmRlZiBHRVRPUFRfQ09NUEFUIGFuZCAjaWYgMCBjb2RlLgotCSAoX2dldG9wdF9pbml0aWFsaXplKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIF9nZXRvcHRfaW50ZXJuYWwuCi0JIChfZ2V0b3B0X2ludGVybmFsKToKLQkgSWYgbG9uZ19vbmx5IGFuZCB0aGUgQVJHVi1lbGVtZW50IGhhcyB0aGUgZm9ybSAiLWYiLCB3aGVyZSBmIGlzCi0JIGEgdmFsaWQgc2hvcnQgb3B0aW9uLCBkb24ndCBjb25zaWRlciBpdCBhbiBhYmJyZXZpYXRlZCBmb3JtIG9mCi0JIGEgbG9uZyBvcHRpb24gdGhhdCBzdGFydHMgd2l0aCBmLiAgT3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlIG5vCi0JIHdheSB0byBnaXZlIHRoZSAtZiBzaG9ydCBvcHRpb24uCi0KLVRodSBGZWIgMTAgMTQ6NDQ6MTYgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogZ2V0b3B0LmMgW25vdCBfX0dOVV9MSUJSQVJZX19dIFtfX0dOVUNfX10gW25vdCBJTl9HQ0NdOgotICAgICAgICBUZXN0IGp1c3QgX19TVERDX18sIG5vdCBlbWFjcy4KLQotV2VkIEZlYiAgOSAwMDoxNDowMCAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLSAgICAgICAgKiBnZXRvcHQuYyBbbm90IF9fR05VX0xJQlJBUllfX10gW19fR05VQ19fXSBbbm90IElOX0dDQ10KLSAgICAgICAgW2VtYWNzXSBbbm90IF9fU1REQ19fXTogRG9uJ3QgaW5jbHVkZSBzdGRkZWYuaC4gIERvbid0IGRlY2xhcmUgc3RybGVuLgotCi1GcmkgRGVjIDI0IDE5OjQzOjAwIDE5OTMgIE5vYWggRnJpZWRtYW4gIChmcmllZG1hbkBudXRyaW1hdC5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGdldG9wdC5jIChfTk9fUFJPVE8pOiBEZWZpbmUgYmVmb3JlIGNvbmZpZy5oIGlzIGluY2x1ZGVkLgotCi1Nb24gU2VwIDIwIDE1OjU5OjAzIDE5OTMgIFJvbGFuZCBNY0dyYXRoICAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCi0KLSAgICAgICAgKiBnZXRvcHQuYywgZ2V0b3B0MS5jIFtlbWFjcyB8fCBDT05GSUdfQlJPS0VUU106IEluY2x1ZGUKLQk8Y29uZmlnLmg+IG9ubHkgdW5kZXIgdGhlc2UsIGVsc2UgImNvbmZpZy5oIi4KLQotVGh1IEF1ZyAxMiAxODoxNjo0OSAxOTkzICBSb2xhbmQgTWNHcmF0aCAgKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogZ2V0b3B0LmMsIGdldG9wdDEuYyBbSEFWRV9DT05GSUdfSF06IEluY2x1ZGUKLSAgICAgICAgPGNvbmZpZy5oPiBpbnN0ZWFkIG9mICJjb25maWcuaCIuCi0KLVN1biBGZWIgMjAgMTc6MTc6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmNhdC5jOiBDaGVjayBBTlNJX1BST1RPVFlQRVMgcmF0aGVyIHRoYW4gX19TVERDX18gdG8gZGVjaWRlCi0Jd2hldGhlciB0byB1c2UgcHJvdG90eXBlcyBvciBub3QuCi0JKiBzdHJlcnJvci5jIChjb25zdCk6IE5ldmVyIHVuZGVmaW5lOyBsZXQgYW5zaWRlY2wuaCBoYW5kbGUgaXQuCi0JKiBzdHJzaWduYWwuYyAoY29uc3QpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxNyAxMzoyNzozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHhhdGV4aXQuYyAoX3hleGl0X2NsZWFudXApOiBEZWNsYXJlIGFzIGV4dGVybjsgZG9uJ3QgaW5pdGlhbGl6ZS4KLQlNZXJnaW5nIGNvbW1vbiBhbmQgaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG5lZWQgbm90IGJlIHN1cHBvcnRlZCBieQotCUFOU0kgQyBjb21waWxlcnMuCi0JKHhhdGV4aXQpOiBJbml0aWFsaXplIF94ZXhpdF9jbGVhbnVwIGlmIG5vdCBhbHJlYWR5IHNldC4KLQkqIHhleGl0LmM6IENvbW1lbnQgZml4LgotCi1XZWQgRmViIDE2IDAxOjE1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jOiBEb24ndCBkZWNsYXJlIHhleGl0OyBpdCdzIGRlY2xhcmVkIGluIGxpYmliZXJ0eS5oLgotCSh4cmVhbGxvYyk6IElmIG9sZG1lbSBpcyBOVUxMLCBhbGxvY2F0ZSB3aXRoIG1hbGxvYywgcmF0aGVyIHRoYW4KLQlhc3N1bWluZyB0aGF0IHJlYWxsb2Mgd29ya3MgY29ycmVjdGx5LgotCi1UdWUgRmViIDE1IDA5OjI2OjE2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uY2F0LmMsIGllZWUtZmxvYXQuYzogIFJlcGxhY2UgaW5jbHVzaW9uIG9mIDxzdHJpbmcuaD4KLQl3aXRoIGV4cGxpY2l0IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgYXMgcmVjb21tZW5kZWQgYnkgSWFuIFRheWxvci4KLQotU2F0IEZlYiAxMiAxMDozMToxMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBVc2UgUFRSIGFuZCBzaXplX3QgdGhyb3VnaG91dC4KLQkobWFsbG9jLCByZWFsbG9jKTogRGVjbGFyZS4KLQotVGh1IEZlYiAxMCAxNzowODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYywgYmFzZW5hbWUuYzogSW5jbHVkZSBhbnNpZGVjbC5oIGFuZCBsaWJpYmVydHkuaC4KLQkqIGNvbmNhdC5jLCBmZG1hdGNoLmMsIGdldHJ1bnRpbWUuYywgc3BhY2VzLmM6IExpa2V3aXNlLgotCSogc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmMsIHhhdGV4aXQuYywgeGV4aXQuYzogTGlrZXdpc2UuCi0JKiB4bWFsbG9jLmM6IExpa2V3aXNlLgotCSogY29uY2F0LmM6IERvbid0IGRlY2xhcmUgeG1hbGxvYy4gIElmIF9fU1REQ19fLCB1c2UgPHN0ZGFyZy5oPgotCW1hY3Jvcywgbm90IDx2YXJhcmdzLmg+IG1hY3Jvcy4KLQkqIHNwYWNlcy5jIChzcGFjZXMpOiBNYWtlIHJldHVybiB0eXBlIGNvbnN0LiAgRG9uJ3QgY3Jhc2ggaWYKLQltYWxsb2MgcmV0dXJucyBOVUxMLgotCSogc3RyZXJyb3IuYyAoc3RydWN0IGVycm9yX2luZm8pOiBNYWtlIG5hbWUgYW5kIG1zZyBmaWVsZHMgY29uc3QuCi0JKGVycm9yX25hbWVzKTogTWFrZSBjb25zdC4KLQkoc3RyZXJybm8pOiBNYWtlIGNvbnN0LgotCShzdHJ0b2Vycm5vKTogTWFrZSBhcmd1bWVudCBjb25zdC4KLQkqIHN0cnNpZ25hbC5jIChzdHJ1Y3Qgc2lnbmFsX2luZm8pOiBNYWtlIG5hbWUgYW5kIG1zZyBmaWVsZHMKLQljb25zdC4KLQkoc2lnbmFsX25hbWVzLCBzeXNfc2lnbGlzdCk6IE1ha2UgY29uc3QuCi0JKHN0cnNpZ25hbCwgc3Ryc2lnbm8pOiBNYWtlIGNvbnN0LgotCShzdHJ0b3NpZ25vKTogTWFrZSBhcmd1bWVudCBjb25zdC4KLQkqIHhhdGV4aXQuYzogRGVjbGFyZSBwYXJhbWV0ZXIgdHlwZXMuCi0JKiB4bWFsbG9jLmMgKG5hbWUpOiBNYWtlIGNvbnN0LgotCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBNYWtlIGFyZ3VtZW50IGNvbnN0LgotCSogTWFrZWZpbGUuaW4gKElOQ0RJUik6IERlZmluZS4KLQkoLmMubyk6IFVzZSAkKElOQ0RJUikuCi0JKGR1bW15Lm8pOiBMaWtld2lzZS4KLQkoYXJndi5vLCBiYXNlbmFtZS5vKTogTmV3IHRhcmdldHM7IGRlcGVuZCBvbiBsaWJpYmVydHkuaC4KLQkoY29uY2F0Lm8sIGZkbWF0Y2gubywgZ2V0cnVudGltZS5vLCBzcGFjZXMubyk6IExpa2V3aXNlLgotCShzdHJlcnJvci5vLCBzdHJzaWduYWwubywgeGF0ZXhpdC5vLCB4ZXhpdC5vKTogTGlrZXdpc2UuCi0JKHhtYWxsb2Mubyk6IExpa2V3aXNlLgotCShjcGx1cy1kZW0ubyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCBvbiBkZW1hbmdsZS5oLgotCShnZXRvcHQubywgZ2V0b3B0MS5vKTogTmV3IHRhcmdldHM7IGRlcGVuZCBvbiBnZXRvcHQuaC4KLQkoaWVlZS1mbG9hdC5vKTogTmV3IHRhcmdldDsgZGVwZW5kIG9uIGllZWUtZmxvYXQuaC4KLQkob2JzdGFjay5vKTogTmV3IHRhcmdldDsgZGVwZW5kIG9uIG9ic3RhY2suaC4KLQotVHVlIEZlYiAgOCAwNToyOTowOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlIYW5kbGUgb2JzdGFja19jaHVua19hbGxvYyByZXR1cm5pbmcgTlVMTC4gIFRoaXMgYWxsb3dzCi0Jb2JzdGFja3MgdG8gYmUgdXNlZCBieSBsaWJyYXJpZXMsIHdpdGhvdXQgZm9yY2luZyB0aGVtCi0JdG8gY2FsbCBleGl0IG9yIGxvbmdqbXAuCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xLCBfb2JzdGFja19uZXdjaHVuayk6Ci0JSWYgQ0FMTF9DSFVOS0ZVTiByZXR1cm5zIE5VTEwsIHNldCBhbGxvY19mYWlsZWQsIGVsc2UgY2xlYXIgaXQuCi0JKF9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xKTogUmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bCwgMCBpZiBub3QuCi0KLVR1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25jYXQuYywgaWVlZS1mbG9hdC5jOiAgSW5jbHVkZSA8c3RyaW5nLmg+LgotCi1TdW4gRmViICA2IDIxOjI4OjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jICh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogSW5jbHVkZSB0aGUgbmFtZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSwgaWYgc2V0LgotCi0JKiBSZXBsYWNlIGF0ZXhpdC5jIHdpdGggeGF0ZXhpdC5jLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyksIGZ1bmN0aW9ucy5kZWY6IENoYW5nZSByZWZlcmVuY2VzLgotCi1TYXQgRmViICA1IDE0OjAyOjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZ2V0cnVudGltZS5jIChnZXRfcnVuX3RpbWUpOiBVc2UgZ2V0cnVzYWdlIG9yIHRpbWVzIGlmCi0JSEFWRV9HRVRSVVNBR0Ugb3IgSEFWRV9USU1FUyBhcmUgZGVmaW5lZC4KLQotRnJpIEZlYiAgNCAxNTo0OTozOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGF0ZXhpdC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpLCBmdW5jdGlvbnMuZGVmOiBBZGQgaXQuCi0JKiB4ZXhpdC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMsIFJFUVVJUkVEX09GSUxFUyk6IEFkZCBpdC4KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBDYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4KLQlDaGFuZ2UgcmVxdWVzdCBmb3IgMCBieXRlcyBpbnRvIHJlcXVlc3QgZm9yIDEgYnl0ZS4KLQotV2VkIEZlYiAgMiAxMTozNjo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBQcmludCBzaXplIHVzaW5nICVsdSwgYW5kIGNhc3QgdG8KLQl1bnNpZ25lZCBsb25nLCB0byBhdm9pZCB3YXJuaW5ncy4KLQotRnJpIEphbiAyOCAxNzo0OTowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBkdW1teS5jOiBEb24ndCBpbmNsdWRlIHRpbWUuaCBldmVyOyBhbHdheXMgZGVmaW5lIGNsb2NrX3QgYXMKLQkidW5zaWduZWQgbG9uZyIuICBVbnRpbCBnY2MvZml4aW5jbHVkZXMgZW5zdXJlcyB0aGF0IGNsb2NrX3QKLQlleGlzdHMsIF9fU1REQ19fIGlzbid0IGEgc3VmZmljaWVudCB0ZXN0LiAgQW5kIGlmIGNsb2NrKCkgZG9lc24ndAotCWV4aXN0LCBjbG9ja190IHByb2JhYmx5IGRvZXNuJ3QgZWl0aGVyLgotCi1Nb24gSmFuIDI0IDExOjUyOjMxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY2xvY2suYywgZ2V0cnVudGltZS5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogQWRkIHRvIGZpbGUgbGlzdHMuCi0JKiBmdW5jdGlvbnMuZGVmIChjbG9jayk6IEFkZCB0byBsaXN0LgotCSogZHVtbXkuYyAodGltZS5oKTogQWRkIGlmIF9fU1REQ19fLgotCShjbG9ja190KTogI2RlZmluZSBhcyAidW5zaWduZWQgbG9uZyIgaWYgbm90IF9fU1REQ19fLgotCi1UdWUgSmFuIDExIDExOjI3OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3RydG9kLmM6IERlY2xhcmUgYXRvZi4gIEZyb20gZWRsZXJAamFuLnVsdHJhLm55dS5lZHUgKEphbgotCUVkbGVyKS4KLQotVHVlIERlYyAyOCAxNDoxNzozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlcnJvcnMpOiBVc2UgQ0ZMQUdTIGFzIHdlbGwgYXMgTERGTEFHUyB3aGVuCi0JbGlua2luZy4KLQotRnJpIERlYyAxNyAxMjoyNjowNyAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiBOZXcgZnVuY3Rpb24uICBDb21tb24gY29kZQotCWZvciBBUk0gdGVtcGxhdGUgZGVtYW5nbGluZy4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9jbGFzc19uYW1lKTogVXNlIGRlbWFuZ2xlX2FybV9wdC4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBMaWtld2lzZS4KLQotVHVlIE5vdiAzMCAxNTo0Nzo0OCAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IEFkZCBDT05TVCB0byBwbGVhc2UgZ2NjLgotCi1TYXQgTm92IDI3IDExOjA1OjUwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIHRvbUBiYXNpbC5pY2NlLnJ1Zy5ubCAoVG9tIFIuSGFnZW1hbikKLQkqIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgQXMgYSBzbWFsbCBzcGFjZSBvcHRpbWl6YXRpb24sIGRvbid0Ci0JaW5jbHVkZSBtZXNzYWdlcyB3aGVuIHRoZXkgYXJlbid0IGFjdHVhbGx5IHVzZWQuCi0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gdGFrZWZpdmUuY28uYXQham9lIChKb3NlZiBMZWhlcmJhdWVyKQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCwgZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSwKLQljcGx1c19kZW1hbmdsZV9vcG5hbWUpOiAgRml4ZXMgZm9yIHN5c3RlbXMgd2hlcmUgY3BsdXNfbWFya2VyCi0JaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gJyQnLgotCi1GcmkgTm92IDI2IDEzOjUxOjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiB3YWl0cGlkLmM6ICBTaW1wbGUtbWluZGVkIGFwcHJvY2ltYXRpb24gdG8gd2FpdHBpZAotCXVzaW5nIHZhbmlsbGEgd2FpdC4KLQkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgVXBkYXRlIGFjY29yZGluZ2x5LAotCi1UaHUgTm92IDE4IDE4OjAxOjE1IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMoZGVtYW5nbGVfdGVtcGxhdGUpOiBmaXggYnVnIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLQl3aXRoIHZhbHVlIG9mIHVzZXIgZGVmaW5lZCB0eXBlLgotCi1XZWQgTm92IDE3IDE4OjMwOjIxIDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogYWRkIHRoZSBzdWJqZWN0IG5ldyBmdW5jdGlvbgotCXRvIHN1cHBvcnQgdW5pZmllZCBzZWFyY2ggb2Ygb3BlcmF0b3IgaW4gY2xhc3MuCi0KLVdlZCBOb3YgMTAgMDk6NDc6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQlnY2MgLVdhbGwgbGludDoKLQkqIHN0cnRvdWwuYyAoc3RydG91bCk6IHVzZSAiKGRpZ2l0ID0gKnMpICE9ICdcMCciIG5vdCBqdXN0Ci0JImRpZ2l0ID0gKnMiIGFzIGNvbmRpdGlvbiBpbiB3aGlsZSBsb29wLgotCi1UdWUgTm92ICA5IDE1OjUyOjIyIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIFNIRUxMIHRvIHJlY3Vyc2l2ZSBtYWtlCi0KLVRodSBOb3YgIDQgMTI6MDk6MjYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHZmcHJpbnRmLmMsIHZwcmludGYuYywgdnNwcmludGYuYzogIE1ha2UgZm9ybWF0IGFyZwotCWJlIChjb25zdCBjaGFyKiksIGZvciBBTlNJIChhbmQgZ2NjIHcvZml4cHJvdG8pIGNvbnNpc3RlbmN5LgotCi1UaHUgTm92ICA0IDA4OjI5OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IE1ha2UgKi0qLWhpdXgqIHVzZSBtaC1ocHV4LgotCi1GcmkgT2N0IDIyIDA3OjUzOjE1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCi0KLVR1ZSBPY3QgMTkgMTc6MTI6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogZW5zdXJlIHRoYXQgb2JqZWN0IGZpbGUgbmFtZXMgYXJlCi0JICBub3QgZHVwbGljYXRlZCwgYXMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9iamVjdCBmaWxlIGluCi0JICBhIGxpYnJhcnkgY2F1c2VzIHByb2JsZW1zIG9uIHNvbWUgbWFjaGluZXMKLQotTW9uIE9jdCAxOCAyMTo1OToyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3RyY2FzZWNtcC5jLCBzdHJuY2FzZWNtcC5jOiBDaGFuZ2UgdV9jaGFyIHRvIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBPY3QgMTUgMjI6MTc6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdHJuY2FzZWNtcC5jOiBuZXcgZmlsZSwgaW1wbGVtZW50cyBzdHJuY2FzZWNtcAotCSogc3RyY2FzZWNtcC5jOiBuZXcgZmlsZSwgaW1wbGVtZW50IHN0cmNhc2VjbXAKLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IGxpc3QgdGhlc2UgdHdvIG5ldyBzb3VyY2UgZmlsZXMKLQotCSogZnVuY3Rpb25zLmRlZjogYWRkIHN0cmNhc2VjbXAgYW5kIHN0cm5jYXNlY21wIGVudHJpZXMKLQotRnJpIE9jdCAxNSAxNDo1MzowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN0cnRvdWwuYyAoc3RydG91bCksIHN0cnRvbC5jIChzdHJ0b2wpOiBIYW5kbGUgb3ZlcmZsb3cKLQlhY2NvcmRpbmcgdG8gQU5TSSBDLgotCi1UaHUgT2N0IDE0IDE2OjM0OjE5IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IGFkZCBzdXBwb3J0IG9mIEFSTSBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciwKLQlhbmQgJ0cnIGZvciBwYXNzaW5nIHJlY29yZCBvciB1bmlvbiBpbiBwYXJhbWV0ZXIuCi0KLVdlZCBPY3QgMTMgMTM6MzY6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBGaXggY29tbWVudCB0byBjbGFyaWZ5IHRoYXQgc3R1ZmYgaW4gUkVRVUlSRURfT0ZJTEVTCi0Jc2hvdWxkIG5vdCBiZSBpbiBmdW5jdGlvbnMuZGVmLgotCi1XZWQgT2N0IDEzIDEzOjEzOjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZnVuY3Rpb25zLmRlZjogUmVtb3ZlZCB4bWFsbG9jLiAgU3R1ZmYgaW4gUkVRVUlSRURfT0ZJTEVTIHNob3VsZAotCW5vdCBiZSBpbiBmdW5jdGlvbnMuZGVmLgotCi1Nb24gT2N0ICA0IDE4OjI2OjM5IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IGNoYW5nZSBnbG9ibCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRvIHByb3BlciBuYW1lCi0KLVR1ZSBTZXAgMjggMTg6MTE6MDcgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogZml4IGJ1ZyBpbiBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCi0KLVR1ZSBTZXAgMjggMTY6MjA6NDkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogc3VwcG9ydCBib3RoIG9sZCBhbmQgbmV3IF92dCQuLi4gdnRibCBtYW5nbGVkIG5hbWVzCi0KLUZyaSBTZXAgMjQgMTk6MDc6MTYgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBGaXggZGVtYW5nbGVfdGVtcGxhdGUgcHJvdG90eXBlCi0KLUZyaSBTZXAgMjQgMTc6MzI6NTUgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogZml4IHRlbXBsYXRlIGRlbWFuZ2xpbmcKLQkqIGNwbHVzLWRlbS5jOiBmaXggY29uc3QgdHlwZSBkZW1hbmdsaW5nCi0JKiBjcGx1cy1kZW0uYzogZml4IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IsIHZpcnR1YWwgdGFibGUsCi0JcXVhbGlmaWVyLCBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBkZW1hbmdsaW5nCi0KLVdlZCBTZXAgIDEgMjM6MTM6MTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jLCBzdHJlcnJvci5jOiBVc2UgZnVsbHktYnJhY2tldGVkIGluaXRpYWxpemVyIHRvCi0Ja2VlcCBnY2MgLVdhbGwgaGFwcHkuCi0KLUZyaSBBdWcgMjcgMTA6MzA6MDkgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogQWRkIENPTlNUUyB0byBtYWtlIGdjYyBoYXBweSB3aXRoIGxhc3QKLQlwYXRjaC4KLQotRnJpIEF1ZyAyNyAxMToyNDo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCVBhdGNoIGZyb20gUGF1bCBGbGluZGVyczoKLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogRGVhbCB3aXRoIGFycmF5cy4KLQotVHVlIEF1ZyAyNCAxNDoyMzo1MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZDogRGVhbCB3aXRoIEdOVSBmb3JtYXQgZm9yIG1vcmUKLQl0aGFuIDkgY2xhc3Nlcy4KLQotV2VkIEF1ZyAxOCAxOTo1MDoyOSAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGR1bW15Lm8pOiBSZWRpcmVjdCB0byAvZGV2L251bGwgdG8gYXZvaWQgInZhcmlhYmxlCi0Jbm90IGluaXRpYWxpemVkIiB3YXJuaW5ncyB1bmRlciBIUC9VWAotCi1TdW4gQXVnIDE1IDIwOjQyOjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdHJlcnJvci5jOiBNb3ZlIGluY2x1ZGUgb2Ygc3RkaW8uaCBhZnRlciBzeXNfZXJybGlzdCAjZGVmaW5lLgotCUFsc28gcmVtb3ZlIE5VTEwgZGVmaW5pdGlvbiAoc3RkaW8uaCBhbHdheXMgZGVmaW5lcyBOVUxMLCBzbyBpdAotCW5ldmVyIGRpZCBhbnl0aGluZyBidXQgY2x1dHRlciB1cCB0aGUgY29kZSkuCi0KLVNhdCBBdWcgMTQgMTQ6MjE6NDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogaGFuZGxlIHhtYWxsb2MuYwotCi0JKiB4bWFsbG9jLmM6IHByb3ZpZGUgeG1hbGxvYyBhbmQgeHJlYWxsb2MgZnVuY3Rpb25zCi0KLVRodSBBdWcgMTIgMTc6Mzg6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogRml4IGEgY29tbWVudC4KLQotU2F0IEF1ZyAgNyAxMzo1NjozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdDEuYzogRGVjbGFyZSBjb25zdCB0aGUgd2F5IGdldG9wdC5jIGRvZXMuCi0KLUZyaSBBdWcgIDYgMTc6MDM6MTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMsIGFsbG9jYS5jOiBVcGRhdGUgZnJvbSBGU0YuCi0JKiBnZXRvcHQuYywgZ2V0b3B0MS5jOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbiwgd2hpY2gKLQlkb2Vzbid0IHVzZSBhbGxvY2EuCi0KLVR1ZSBKdWwgMjcgMTQ6MDM6NTcgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBBZGQgdGhlIHRhcmdldCB3aXRoIGEgbWVzc2FnZSBzYXlpbmcKLQl3aGVyZSBkZW1hbmdsZSB3ZW50LgotCi1Nb24gSnVsIDI2IDE1OjQ5OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIG9ic29sZXRlIGBkZW1hbmdsZScgdGFyZ2V0LgotCi1UaHUgSnVsIDIyIDA4OjMxOjAxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoYXJtX3NwZWNpYWwpOiAgQXBwbHkgcGF0Y2ggZnJvbSBhcmdAbHVjaWQuY29tIHRvCi0JYXZvaWQgaW5maW5pdGUgbG9vcCBvbiB2dGJsIHN5bWJvbHMgd2l0aCBkaXNhbWJpZ3VhdGluZyAianVuayIKLQl0YWNrZWQgb24gdGhlIGVuZC4KLQotTW9uIEp1bCAxOSAxNDoxMDozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jOiB3b3JrIGFyb3VuZCBzb21lIHN5c3RlbXMgbG9zaW5nIGRlZmluaXRpb25zIG9mCi0Jc3lzX3NpZ2xpc3QKLQotCSogY29uZmlnL21oLWx5bnhvczogdGhpcyBzeXN0ZW0gaGFzIGEgbG9zaW5nIGRlZmluaXRpb24gb2YKLQlzeXNfc2lnbGlzdAotCi0JKiBjb25maWcudGFibGU6IHVzZSBtaC1seW54b3MgZm9yICotKi1seW54b3MKLQotTW9uIEp1bCAxOSAxNzowODo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkIHN1cHBvcnQgZm9yIEhQUEEgQlNEIGhvc3RzLgotCi0JKiBjb25maWcvbWgtaHBic2Q6IE5ldyBmaWxlLgotCi1Nb24gSnVsIDEyIDE4OjAwOjQwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUyk6IG1ha2Ugd29yayB3aGVuIHNyY2RpciAhPSBvYmpkaXIuCi0KLVN1biBKdW4gMjcgMTU6MzU6MzEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAobWFpbik6IEFkZCBsb25nIG9wdGlvbnMsIGluY2x1ZGluZyAtLWhlbHAgYW5kCi0JLS12ZXJzaW9uLgotCSh1c2FnZSk6IE5ldyBmdW5jdGlvbiBmcm9tIGNvZGUgaW4gbWFpbi4KLQotVHVlIEp1biAyMiAxMTozNzozOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiAgTmV3IHNoZWxsIHNjaXB0LCBzb3VyY2VkIGJ5IGJvdGggLi9jb25maWd1cmUsaW4KLQlhbmQgLi4veGliZXJ0eS9jb25maWd1cmUuaW4sIHRvIGF2b2lkIG1haW50YWluYW5jZSBsb3NzYWdlcy4KLQkqIGNvbmZpZ3VyZS5pbiBhbmQgLi4veGliZXJ0eS9jb25maWd1cmUuaW46ICBVc2UgY29uZmlnLnRhYmxlLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBtaC1haXggZm9yIEFJWCAzLjIsIG9ubHkgZm9yIDMuMS4KLQkqIGNvbmZpZ3VyZS5pbjogTWFwICotKi1pcml4KiAoZXhjZXB0IGlyaXg0KSB0byBtaC1zeXN2LgotCSogLi4veGliZXJ0eS9jb25maWd1cmUuaW46ICBVcGRhdGUgZnJvbSAuL2NvbmZpZ3VyZS5pbi4KLQotVHVlIEp1biAxNSAxNzowNTozMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQKLQotV2VkIE1heSAyNiAxMjo1OTowOSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jICh4cmVhbGxvYyk6ICBNYXRjaCBkZWZpbml0aW9uIHdpdGggcHJvdG90eXBlLgotCi1UdWUgTWF5IDI1IDE0OjI3OjUxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6ICBEZW1hbmdsZSBjZnJvbnQKLQlsb2NhbCB2YXJpYWJsZXMgYXMgYW4gZXh0ZW5zaW9uIHRvIEFSTSBkZW1hbmdsaW5nLgotCi1GcmkgTWF5IDIxIDA5OjUzOjU3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0LmM6IERvbid0IHJlcXVpcmUgcG9pbnRlcnMgdG8gZG91YmxlIHRvIGJlIGFsaWduZWQuCi0KLVR1ZSBNYXkgMTggMTc6MTI6MTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLSAgICAgICAgKG1lcmdlIGNoYW5nZXMgZnJvbSBkbG9uZ0Bjc2UudWNzYy5lZHUpCi0JKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6ICBTaW1wbGlmeS4KLQkqIGNwbHVzLWRlbS5jIChhcm1fcHQsIGRlbWFuZ2xlX2NsYXNzX25hbWUpOiAgTmV3IGZ1bmN0aW9ucy4KLQkqIGNwbHVzLWRlbS5jICh2YXJpb3VzKTogIENhbGxzIHRvIGFybV9wdCwgZGVtYW5nbGVfY2xhc3NfbmFtZS4KLQotCSogY3BsdXMtZGVtLmMgKHhtYWxsb2MsIHhyZWFsbG9jLCBzdHJzdHIpOiAgTWFrZSBleHRlcm4gZGVjbHMgaW50bwotCWZ1bGwgcHJvdG90eXBlcy4KLQkqIGNwbHVzLWRlbS5jIChmcmVlKTogIEFkZCBwcm90b3R5cGUuCi0JKiBjcGx1cy1kZW0uYyAob3B0YWJsZSk6ICBGdWxseSBicmFja2V0aXplIGluaXRpYWxpemVyLgotCi1GcmkgTWF5IDE0IDE3OjEzOjA1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIFdoZXRoZXIgaW5pdGlhbCB1bmRlcnNjb3JlcyBhcmUgc3RyaXBwZWQKLQlkZXBlbmRzIG9uIHRoZSBleHRlcm5hbCB2YXJpYWJsZSBwcmVwZW5kc191bmRlcnNjb3JlCi0JKHdoaWNoIGlzIGdlbmVyYXRlZCBieSB0aGUgYmludXRpbHMgTWFrZWZpbGUpLgotCi1GcmkgTWF5IDE0IDA3OjMyOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAobW9wX3VwLCBhcm1fc3BlY2lhbCk6IFJlbW92ZSBzb21lIHVudXNlZCB2YXJpYWJsZXMuCi0KLVR1ZSBNYXkgIDQgMjA6MzE6NTkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogIFJldHVybiB6ZXJvIGlmIGFyZyBkb2VzIG5vdAotCXN0YXJ0IHdpdGggZGlnaXQsIGFuZCBkb24ndCBjb25zdW1lIGFueSBpbnB1dC4KLQotVHVlIE1heSAgNCAwODoxMDoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlbWFuZ2xlKTogVXNlICR7c3JjZGlyfSBub3QgJF4uCi0KLQkqIHN0cnRvZC5jOiBOZXcgZmlsZSwgbmVlZGVkIGF0IGxlYXN0IGZvciBCU0QgNC4zLgotCi1TdW4gTWF5ICAyIDExOjMwOjQyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYyAoc3lzX3NpZ2xpc3QpOiAgRm9yIEFOU0kgY29tcGlsYXRpb25zLCB0eXBlIGlzCi0JImNvbnN0IGNoYXIgKmNvbnN0Ii4gIEFsc28gcmVtb3ZlIGNvbmRpdGlvbmFsaXphdGlvbiBvbiBfX1NURENfXwotCXNpbmNlIGNvbnN0IGlzIGRlZmluZWQgYXdheSBmb3Igbm9uLUFOU0kuCi0KLVdlZCBBcHIgMjggMTk6Mjk6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplICotKi1ocHV4LgotCSogY29uZmlnL21oLWhwdXg6IE5ldyBmaWxlLgotCi1UdWUgQXByIDI3IDE1OjIyOjE5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiB0bXBuYW0uYzogIEFkZGVkIEFOU0kgdG1wbmFtKCkgZnVuY3Rpb24uCi0JKiBmdW5jdGlvbnMuZGVmLCBNYWtlZmlsZS5pbjogIFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotVHVlIEFwciAyNyAxMzozODozOCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5jdGlvbl9uYW1lKTogR2V0IHRoZSBkZW1hbmdsaW5nIG9mCi0Jc3RvcF9fMUEgcmlnaHQuCi0KLUZyaSBBcHIgMTYgMjM6NDg6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGNhbHZpbikKLQotCSogY3BsdXMtZGVtLmM6IERlY2xhcmUgc3Ryc3RyIHJldHVybiB0eXBlLgotCi1GcmkgTWFyIDI2IDEyOjAxOjI2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYzogQWRkIHNvbWUgQUlYIHNpZ25hbHMuCi0KLVRodSBNYXIgMjUgMTU6MTc6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRU9WRVJSSURFUyk6IERlZmluZSB0byBiZSBlbXB0eS4KLQotV2VkIE1hciAyNCAwMTo1OToyNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgJiBkdmkgdGFyZ2V0cwotCi1UaHUgTWFyIDE4IDE0OjA1OjQ0IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5jOiAgTmV3IGZpbGUsIG1vdmVkIGZyb20gLi4vZ2RiIChzaW5jZSBpdCBpcwotCW5lZWRlZCBieSAuLi9vcGNvZGUvbTY4ay1kaXMuYykuCi0KLVR1ZSBNYXIgIDIgMTc6NDc6MzEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBjZnJvbnQgd2l0aCBBUk0uCi0KLUZyaSBGZWIgMjYgMDA6MTc6MDcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIEZpeCBtYWluIHByb2dyYW0gKHdoZW4gY29tcGlsZWQgd2l0aCAtRE1BSU4pCi0JdG8gYmUgbW9yZSB1c2VmdWwgYXMgYSBmaWx0ZXIuCi0KLVNhdCBGZWIgMjAgMjE6NDE6MzkgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbF90b19saWJkaXIsIGluc3RhbGxfdG9fdG9vbGRpcik6IEdvIGludG8gdGhlCi0JZGVzdGluYXRpb24gZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nICQoUkFOTElCKSwgaW4gY2FzZSB0aGF0Ci0JcHJvZ3JhbSB0cmllcyB0byBjcmVhdGUgYSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyBwYXJ0IG9mCi0JaXRzIHdvcmsuCi0KLVRodSBGZWIgMTggMjM6MDA6MTkgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jIChzeXNfc2lnbGlzdCk6ICBSZW1vdmUgeWV0IGFub3RoZXIgKiVeJiUmJCMgImNvbnN0IgotCWJlY2F1c2UgQlNEIDQuNCBsYWNrcyBvbmUuICBJc24ndCB0aGlzIGZ1bj8KLQotVGh1IEZlYiAxOCAxMToyNDoyNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6ICBTZXQgZnVuY19kb25lIGFmdGVyCi0JZGVtYW5nbGluZyBhIHRlbXBsYXRlLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogIEZpeCBzZXZlcmFsIHNtYWxsIGJ1Z3MKLQlpbiBkZW1hbmdsaW5nIEdOVSBzdHlsZSB0ZW1wbGF0ZXMuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogIEZpeCBmb3IgdGVtcGxhdGVzIGluIEdOVQotCXN0eWxlIGNvbnN0cnVjdG9ycy4KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6ICBGaXggZm9yIHRlbXBsYXRlcyBpbiBHTlUgc3R5bGUKLQlzdGF0aWMgZGF0YSBtZW1iZXJzLgotCi1UdWUgRmViIDE2IDE3OjI4OjM1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIE1vZGlmeSB0byBpbmNsdWRlIHR5cGUKLQltb2RpZmllcnMgbGlrZSBzdGF0aWMgYW5kIGNvbnN0IGluIHJlbWVtYmVyZWQgdHlwZXMuCi0KLVRodSBGZWIgMTEgMjI6MjA6NDcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZWRfcXVhbGlmaWVkKTogIEFkZCBuZXcgcGFyYW1ldGVyIHRoYXQgdGVsbHMKLQl3aGV0aGVyIHRvIHByZXBlbmQgb3IgYXBwZW5kIHRoZSBxdWFsaWZpZXJzLgotCSogY3BsdXMtZGVtLmMgKHN0cmluZ19wcmVwZW5kcyk6ICBVc2VkIG5vdywgcmVtb3ZlICNpZiAwLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6ICBDYWxsIGRlbWFuZ2xlX3F1YWxpZmllZAotCXdpdGggcHJlcGVuZGluZy4KLQkqIGNwbHVzX2RlbS5jIChnbnVfc3BlY2lhbCk6ICBSZWNvZ25pemUgc3RhdGljIGRhdGEgbWVtYmVycyB0aGF0Ci0JdXNlIHF1YWxpZmllZCBuYW1lcy4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiAgQWNjdW11bGF0ZSBxdWFsaWZpZXJzIGluIGEKLQl0ZW1wb3JhcnkgYnVmZmVyIGFuZCB0aGUgcHJlcGVuZCBvciBhcHBlbmQgdGhlbSB0byB0aGUgcmVzdWx0LAotCWFzIHNwZWNpZmllZCBieSB0aGUgbmV3ICJhcHBlbmQiIGZsYWcuCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6ICBDYWxsIGRlbWFuZ2xlZF9xdWFsaWZpZWQgd2l0aAotCWFwcGVuZGluZy4KLQotTW9uIERlYyAyOCAxMDo0NzoxOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMgKHNpZ25hbF90YWJsZSk6IE5vdyBjb25zdC4KLQkoaW5pdF9zaWduYWxfdGFibGVzKTogVmFyaWFibGUgZWlwIG5vdyBwb2ludHMgdG8gY29uc3QuCi0KLQkqIHN0cmVycm9yLmMgKGVycm9yX3RhYmxlKTogTm93IGNvbnN0LgotCShpbml0X2Vycm9yX3RhYmxlcyk6IFZhcmlhYmxlIGVpcCBub3cgcG9pbnRzIHRvIGNvbnN0LgotCi1UdWUgRGVjIDE1IDE1OjM2OjUwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBtZW1jaHIuYyAobWVtY2hyKTogIE5ldyAoQU5TSSBzdGFuZGFyZCkgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogIEFkZGVkIG1lbWNoci4KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6IFVzZSByYyBpbnN0YWQgb2Ygbm9uLXN0YW5kYXJkIGNxLgotCi1XZWQgRGVjICAyIDIyOjQ5OjEwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IHJlbW92ZSB1c2Ugb2YgVVNHIGFyb3VuZCA8YWxsb2NhLmg+LCB3aGljaCBuZXZlciBtZWFudAotCWFueXRoaW5nIGFueXdheQotCi0JKiBjb25maWcvbWgte2FpeCxhcG9sbG82OCxuY3IzMDAwLHN5c3Ysc3lzdjR9OiByZW1vdmVkIGRlZmluaXRpb25zCi0Jb2YgVVNHIGFuZCBVU0dyNAotCi1UaHUgTm92IDE5IDAzOjA5OjMzIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFJlY29nbml6ZSBgdycsIGEgd2lkZSBjaGFyYWN0ZXI7Ci0JaXQncyBub3cgYSB0eXBlIGFjY29yZGluZyB0byB0aGUgQU5TSSBYM0oxNiB3b3JraW5nIHBhcGVyOyBvdXRwdXQKLQkid2NoYXJfdCIgZm9yIGl0LgotCShkZW1hbmdsZV90ZW1wbGF0ZSk6IEFjY2VwdCBgdycgYXMgYW4gaW50ZWdyYWwgdHlwZS4KLQkoeG1hbGxvYywgeHJlYWxsb2MpOiBVc2UgYGNoYXIgKicsIG5vdCBgUFRSJy4gIENhc3QgY2FsbHMgdG8gdGhlaXIKLQljb3VudGVycGFydHMgbWFsbG9jIGFuZCByZWFsbG9jIHRvIGBjaGFyIConLgotCShtYWluKTogRXhpdCB3aXRoIGEgMCBzdGF0dXMuCi0JKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBEb24ndCBleHBlY3QgdGhlIHVzZXIgdG8gZGVmaW5lCi0JREVNQU5HTEUsIGluc3RlYWQgZm9yY2UgdG8gYmUgY3BsdXMtZGVtLmMuICBMb29rIGluICQoc3JjZGlyKS8uLi9pbmNsdWRlCi0JZm9yIGRlbWFuZ2xlLmguICBQYXNzIGl0IGFueSBIREVGSU5FUyBvciBYVFJBRkxBR1MuCi0KLVdlZCBOb3YgMTggMTg6NTY6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBBdm9pZCB2ZXJib3NpdHkuCi0JKiBjb25maWcvbWgtc3lzdjQ6ICBSZW1vdmUgQVJfRkxBR1Mgb3ZlcnJpZGUsIHVzZSBJTlNUQUxMPWNwLAotCXJlcGxhY2UgVVNHcjQgd2l0aCBIQVZFX1NZU0NPTkYuCi0JKiBjb25maWcvbWgtc29sYXJpczogIFJlbW92ZTsgbWgtc3lzdjQgd29ya3Mgbm93LgotCSogZ2V0cGFnZXNpemUuYzogIFJlcGxhY2UgVVNHcjQgd2l0aCBIQVZFX1NZU0NPTkYuCi0JKiBjb25maWd1cmUuaW46ICBTaW1wbGlmeSBob3N0IG1hdGNoaW5nIHRhYmxlLCByZW1vdmUgc2VwYXJhdGUKLQlzb2xhcmlzIGNvbmZpZyBmaWxlLgotCi1TdW4gTm92IDE1IDA5OjM1OjE2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zb2xhcmlzMiopOiAgQWRkLCB1c2UgbWgtc3lzdjQuCi0KLVR1ZSBOb3YgIDMgMjE6Mjc6MDMgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogQWRkIGRlY2xzLgotCShyZW1lbWJlcl90eXBlKTogRG9uJ3QgY2FzdCB4bWFsbG9jLgotCShzdHJpbmdfbmVlZCk6IExpa2V3aXNlOyBkb24ndCBjYXN0IHhyZWFsbG9jIGVpdGhlci4KLQotRnJpIE9jdCAyMyAwODo1MjowMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmcywgcmVuYW1lLmM6IGFkZGVkIHNpbXBsZQotCWltcGxlbWVudGF0aW9uIG9mIHJlbmFtZSwgc2luY2Ugc29tZSBiaW51dGlscyBwcm9ncmFtcyB1c2UgaXQuCi0KLVRodSBPY3QgMTUgMTU6MTg6MjIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jOiAgQWRkIGFwcHJvcHJpYXRlICdjb25zdCcgdG8gc3lzX3NpZ2xpc3QKLQlleHRlcm4gZGVjbGFyYXRpb24gKGlmIF9fU1REQ19fKS4gIChOZWVkZWQgZm9yIExpbnV4LikKLQkqIHN0cnNpZ25hbC5jIChzdHJzaWduYWwpOiBBZGQgY2FzdCB0byByZW1vdmUgY29uc3QtbmVzcy4KLQotRnJpIE9jdCAgOSAwMzoyMjo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG5lZWRlZC5hd2ssIG5lZWRlZDIuYXdrKTogIFJlbW92ZSBlcnJvbmVvdXMgXCdzCi0JYmVmb3JlICIncywgZGlhZ25vc2VkIGJ5IEJTRCA0LjQgYXdrLgotCi1UaHUgT2N0ICA4IDE1OjI1OjEyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNyZWF0ZSBjb25maWcuaCBhbmQgbmVlZGVkLWxpc3QgdGhyb3VnaCAkKENPTkZJR19IKQotCWFuZCAkKE5FRURFRF9MSVNUKSwgdG8gZ2l2ZSBzb21lIGhvb2tzIGZvciB4aWJlcnR5LgotCi1UaHUgT2N0ICAxIDIzOjMxOjQyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci10cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKLQotV2VkIFNlcCAzMCAxMToyNjo1OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhcmd2LmMsIGJhc2VuYW1lLmMsIGJjbXAuYywgYmNvcHkuYywgYnplcm8uYywKLQljb25jYXQuYywgY3BsdXMtZGVtLmMsIGZkbWF0Y2guYywgZ2V0Y3dkLmMsIGdldG9wdC5jLCBnZXRvcHQxLmMsCi0JZ2V0cGFnZXNpemUuYywgaW5zcXVlLmMsIG1lbWNtcC5jLCBtZW1jcHkuYywgbWVtbW92ZS5jLCBtZW1zZXQuYywKLQlvYnN0YWNrLmMsIHNpZ3NldG1hc2suYywgc3BhY2VzLmMsIHN0cmNoci5jLCBzdHJlcnJvci5jLAotCXN0cnJjaHIuYywgc3Ryc2lnbmFsLmMsIHN0cnN0ci5jLCB2Zm9yay5jLCB2c3ByaW50Zi5jOgotCUNvbnZlcnQgZnJvbSB1c2luZyBHUEwgdG8gTEdQTC4KLQotU2F0IFNlcCAyNiAwNDowMTozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVycm9ycyk6ICBMZWF2ZSBkdW1teS5vIGFuZCBkdW1teSBhcm91bmQgc28gdGhhdAotCXdlIGNhbiBzZWUgaG93IHRoZSBuZWVkZWQgbGlzdCB3YXMgZ2VuZXJhdGVkIChpdCdzIHNvbWV0aW1lcyB3cm9uZykuCi0JKG1vc3RseWNsZWFuKTogIFJlbW92ZSB0aGVtLgotCi1Nb24gU2VwIDIxIDE0OjUwOjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZ2V0Y3dkLmM6IHN1cHBseSBhIGRlZmF1bHQgaWYgTUFYUEFUSExFTiBpcyBub3QgZGVmaW5lZC4KLQotCSogY29uZmlnL21oLWlyaXg0OiBzZXQgRVhUUkFfT0ZJTEVTIHRvIGFsbG9jYS5vLCBmcm9tIFdSUy4KLQotV2VkIFNlcCAgOSAxMjo0MTo0OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVc2UgWFRSQUZMQUdTIHdoZW4gY29tcGlsaW5nLCBzbyB0aGF0IHhpYmVydHkgd29ya3MKLQl3aGVuIGNyb3NzLWNvbXBpbGluZy4KLQotVGh1IFNlcCAgMyAxMzoyOTozOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAoZGVtYW5nbGVfcHJlZml4KTogcmVkdWN0aW9uIGluIHN0cmVuZ3RoIG9mIHN0cnN0cgotCSAgYXMgYSB0aW1lIG9wdGltaXphdGlvbi4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlKTogcmVtb3ZlIHN0cnBicmsgdGVzdC4gIEFwcGVhcnMgdG8KLQkgIGJlIG1vcmUgZXhwZW5zaXZlIHRoYW4gc2ltcGx5IGRlbWFuZ2xpbmcuCi0KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19tYXRjaCk6IG5ldyBmdW5jdGlvbi4KLQotVHVlIFNlcCAgMSAxNToyNDowNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgI2luY2x1ZGUgPHN0ZGlvLmg+LCB0byBkZWZpbmUgTlVMTC4KLQlEZWZpbmUgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlLgotCi1TdW4gQXVnIDMwIDE3OjU4OjE5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9nZGIuCi0JKiBjcGx1cy1kZW0uYyAoc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyk6ICBOZXcgZXhwb3J0ZWQKLQlmdW5jdGlvbiwgdG8gYXZvaWQgY29tcGlsaW5nIGluIHRhcmdldC1kZXBlbmRlbmN5IGZvciBDUExVU19NQVJLRVIuCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiAgQWxsb3cgZGVtYW5nbGluZyBzdHlsZSBvcHRpb24KLQl0byBiZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIsIGJ1dCB1c2luZyB0aGUgZ2xvYmFsIHZhcmlhYmxlCi0JY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlIGFzIGEgZGVmYXVsdC4KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIGZvciBjcGx1cy1kZW0uYwotCi1TYXQgQXVnIDI5IDEwOjQ0OjA5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6ICBNZXJnZSBpbiBjb21tZW50IGNoYW5nZXMgZnJvbSBGU0YgdmVyc2lvbi4gIE5vdwotCW1hdGNoZXMgdGhlIEZTRiB2ZXJzaW9uIGV4YWN0bHkuCi0KLUZyaSBBdWcgMjggMTg6Mzk6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoQ0FMTF9GUkVFRlVOKTogIENhbid0IHVzZSA/OiB3aXRoIHZvaWQgdmFsdWVzIChhdAotCWxlYXN0IG9uIGxvc2luZyBERUNzdGF0aW9ucyEpOyB1c2UgaWYtdGhlbi1lbHNlIGluc3RlYWQuCi0KLVdlZCBBdWcgMTkgMTQ6NDA6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLU1vbiBBdWcgMTAgMTc6MzM6NDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0gICAgICAgKiBNYWtlZmlsZS5pbjogY2xlYW4gdXAgZGVmaW5pdGlvbiBvZiBDRklMRVMsIG1vcmUgY29tbWVudHMKLQotU2F0IEF1ZyAgOCAyMzoxMDo1OSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmMgKG15X2luZGV4KTogIE1ha2UgZmlyc3QgYXJnIGNvbnN0IHRvIG1hdGNoIHN0cmNociwKLQl3aGljaCBpdCBzb21ldGltZXMgaXMgcmVtYXBwZWQgdG8uCi0KLVNhdCBBdWcgIDEgMTM6NDg6NTAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoREVGQVVMVF9BTElHTk1FTlQpOiAgVXBkYXRlIHRvIG1hdGNoIEZTRiB2ZXJzaW9uLgotCSogb2JzdGFjay5jIChfb2JzdGFja19iZWdpbik6ICBJbml0aWFsaXplIHVzZV9leHRyYV9hcmcuCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luXzEpOiAgTmV3LCBmcm9tIEZTRiB2ZXJzaW9uLgotCi1Nb24gSnVsIDIwIDIxOjA3OjU4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMgKENBTExfQ0hFQ0tGVU4sIENBTExfRlJFRUZVTik6ICBVc2UgdXNlX2V4dHJhX2FyZyBhbmQKLQlleHRyYV9hcmcuCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luKTogIFJlbW92ZSBhcmVhX2lkIGFuZCBmbGFncyBhcmd1bWVudHMKLQkocHJldmlvdXNseSBhZGRlZCBmb3IgbW1hbGxvYyBzdXBwb3J0LCBpbnRlcmZhY2UgaGFzIGNoYW5nZWQpLgotCUFsc28gY29udmVydCBmbGFncyB1c2FnZSB0byB1c2UgdXNlX2V4dHJhX2FyZyBhbmQgbWF5YmVfZW1wdHlfb2JqZWN0LgotCi1GcmkgSnVsIDEwIDAwOjQxOjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICBNb3ZlIGV4cGFuZGFyZ3YgaW5saW5lIGFuZCBlbGltaW5hdGUgc3RhdGljIHZhcmlhYmxlcy4KLQlSZXdyaXRlIHRvIGFsd2F5cyBhbGxvY2F0ZSBpbiBwb3dlcnMgb2YgdHdvLiAgRml4IHRvIHJldHVybiBhbgotCWFyZ3Ygd2l0aCBhIHNpbmdsZSBudWxsIHN0cmluZyBhcmcgaWYgcGFzc2VkIGEgbnVsbCBzdHJpbmcuCi0KLUZyaSBKdWwgIDMgMjA6Mjc6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHJhbmRvbS5jLCBzaWdzZXRtYXNrLmMsIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgUmVtb3ZlCi0JIih2b2lkKSIgY2FzdHMgZnJvbSBmdW5jdGlvbiBjYWxscyB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzCi0JaWdub3JlZCwgaW4gYWNjb3JkYW5jZSB3aXRoIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1Nb24gSnVuIDI5IDEwOjU0OjE5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBiY29weS5jLCBzdHJlcnJvci5jLCBzdHJzaWduYWwuYzogIExpbnQuCi0KLVRodSBKdW4gMjUgMDk6MTg6NDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogbWVyZ2UgY2hhbmdlcyBmcm9tIG1ha2UuCi0KLVRodSBKdW4gMjUgMDQ6NDM6MjIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFsbG9jYS5jOiAgSW5jb3Jwb3JhdGUgZml4ZXMgZnJvbSBnZGIvYWxsb2NhLmMuCi0JRklYTUU6ICBFdmVudHVhbGx5IG1vdmUgZ2RiJ3MgYWxsb2NhIGNvbmZpZ3VyYXRpb24gZmlsZXMgaGVyZSwKLQlhbmQgcmVtb3ZlIGdkYi9hbGxvY2EuYyBhbmQgaXRzIE1ha2VmaWxlLmluIHN1cHBvcnQuCi0KLVR1ZSBKdW4gMjMgMjE6NTY6MzAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGR1bW15LmM6ICBEZWZpbmUgTk9USElORyB0byAvKm5vdGhpbmcqLywgY2hhbmdlIHJldHVybiB0eXBlCi0Jb2YgbWFpbiB0byBpbnQgYW5kIHJldHVybiB6ZXJvLgotCSogZnVuY3Rpb25zLmRlZjogIFN1cHBseSBOT1RISU5HIGFzIHRoZSBmb3VydGggYXJnIHRvIG1hY3JvcwotCXRoYXQgZG9uJ3QgaGF2ZSBhbiBleHBsaWNpdCBhcmcsIHRvIHNhdGlzZnkgcGlja3kgcHJlcHJvY2Vzc29ycy4KLQotV2VkIEp1biAxNyAxODoxMzo1OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2xlYW4gdXAgKmNsZWFuIHJ1bGVzLCBhcyBwZXIgc3RhbmRhcmRzLnRleGkuCi0KLVR1ZSBKdW4gMTYgMTY6MTE6NTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYywgZ2V0b3B0MS5jOiBtZXJnZWQgbGFyZ2VseSBncmF0dWl0b3VzLCBtb3N0bHkKLQkgIHdoaXRlc3BhY2UgZGlmZnMgZnJvbSBvdGhlciBwcmVwIGRpc3RyaWJ1dGlvbnMuCi0KLU1vbiBKdW4gMTUgMTI6MjU6NDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1uY3IzMDAwIChJTlNUQUxMKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAotCWl0IGlzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLgotCi1Nb24gSnVuIDE1IDAxOjAzOjI2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzaWdzZXRtYXNrLmM6ICBSZXdyaXRlLiAgT2xkIG9uZSB3YXMgdmVyeSBjb25mdXNlZCBhYm91dCBpdHMKLQlhcmd1bWVudHMgYW5kIHJlc3VsdC4gIE5ldyBvbmUgY2FuJ3QgZG8gbXVjaCwgYnV0IGF0IGxlYXN0IGtub3dzCi0Jd2hhdCBpdCBjYW4ndCBkbywgYW5kIGl0J3MgZ29vZCBlbm91Z2ggZm9yIEdEQidzIHVzZS4KLQotU3VuIEp1biAxNCAxNToxNzo0MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBmdW5jdGlvbnMuZGVmOiAgVXNlIHByb3BlciBwcm90b3R5cGUgZm9yIHN0cnRvdWwuCi0KLUZyaSBKdW4gMTIgMTk6MjI6NDAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIHJhbmRvbS5jLgotCSogY29uZmlnL21oLSo6ICBVc2UgInRydWUiIHJhdGhlciB0aGFuICJlY2hvID4vZGV2L251bGwiIGZvciByYW5saWIuCi0JKiBjb25maWd1cmUuaW46ICB1cGRhdGUgc29sYXJpczIgY29uZmlnLgotCi1XZWQgSnVuIDEwIDE2OjMxOjI5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiByYW5kb20uYzogIEFkZCBmb3IgcmFuZG9tKCkgYW5kIHNyYW5kb20oKS4KLQkqIGZ1bmN0aW9ucy5kZWY6ICBBZGQgcmFuZG9tCi0KLVR1ZSBKdW4gIDkgMTc6Mjc6MTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97bWgtbmNyMzAwMCwgbWgtc3lzdjR9OiAgQWRkIGRlZmluaXRpb24gZm9yIElOU1RBTEwKLQl1c2luZyAvdXNyL3VjYi9pbnN0YWxsLgotCi1Nb24gSnVuICAxIDEzOjIwOjE3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RyZXJyb3IuYzogIEtsdWRnZSB0byBndWFyZCBhZ2FpbnN0IGEgY29uZmxpY3Qgd2l0aAotCXBvc3NpYmxlIGRlY2xhcmF0aW9uIG9mIHN5c19lcnJsaXN0IGluIGVycm5vLmguCi0KLVN1biBNYXkgMzEgMTU6MDc6NDcgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtc29sYXJpczogYWRkIHNvbGFyaXMyIGNvbmZpZyBzdXBwb3J0LgotCi1GcmkgTWF5IDI5IDE3OjIzOjIzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogc2lnc2V0bWFzay5jOiAgI2lmZGVmIG91dCBzaWdzZXRtYXNrIGlmIFNJR19TRVRNQVNLCi0JaXMgbm90IGRlZmluZWQgKHNob3VsZCBiZSBkZWZpbmVkIGluIHNpZ25hbC5oLCBzYXlzIFBvc2l4LikuCi0KLU1vbiBNYXkgMTggMTc6MzU6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiBtZXJnZWQgY2hhbmdlcyBmcm9tIG1ha2UtMy42Mi4xMS4KLQotRnJpIE1heSAgOCAxNDo1MzowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IG1lcmdlZCBjaGFuZ2VzIGZyb20gYmlzb24tMS4xOC4KLQotVHVlIE1heSAgNSAxMTo1MTo0MCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgRG9uJ3QgaGF2ZSAkKEVYVFJBX09GSUxFUykgZGVwZW5kIG9uIGNvbmZpZy5oLAotCXNpbmNlIHRoYXQgaW50cm9kdWNlcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi0JKCQoRVhUUkFfT0ZJTEVTKSBhcmUgdXNlZCB0byBidWlsZCBjb25maWcuaC4pCi0KLQkqIHN0cnRvdWwuYzogIEZpeGVzIHRvIGhhbmRsZSBub24tZGVjaW1hbCBiYXNlcyBiZXR0ZXIuCi0KLVdlZCBBcHIgMjIgMDk6Mjc6NTEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiAgUmVwbGFjZSBNSU5VU19HIHdpdGggQ0ZMQUdTLgotCSogTWFrZWZpbGUuZG9zOiAgRmluaXNoIE1JTlVTX0cgZXJhZGljYXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogIEFkZCBzdHJzaWduYWwuYy4KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiAgQWRkIHN0cmVycm9yLm8gc3Ryc2lnbmFsLm8KLQkqIE1ha2VmaWxlLmluIChuZWVkZWQtbGlzdCk6ICBTcGxpdCBjcmVhdGlvbiBvZiBlcnJvcnMgZmlsZSB0bwotCXNlcGFyYXRlIG1ha2UgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5oLCBuZWVkZWQyLmF3aywgZXJyb3JzKTogIE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogIFNwbGl0IHRvIG11bHRpcGxlIGxpbmVzLCBhZGQgbmVlZGVkMi5hd2sKLQlhbmQgY29uZmlnLmguCi0JKiBkdW1teS5jIChERUZGVU5DLCBERUZWQVIpOiAgQWRkIGRlZmluZXMgYW5kIHVuZGVmcy4KLQkqIGZ1bmN0aW9ucy5kZWYgKHN0cmVycm9yKTogIFJlbW92ZSBmcm9tIG9wdGlvbmFsIGxpc3QuCi0JKiBmdW5jdGlvbnMuZGVmIChzeXNfbmVyciwgc3lzX2Vycmxpc3QsIHN5c19zaWdsaXN0KTogIERFRlZBUidzCi0JKiBmdW5jdGlvbnMuZGVmIChzdHJlcnJvciwgcHNpZ25hbCk6ICBERUZGVU5DJ3MKLQkqIHN0cmVycm9yLmM6ICBSZXdyaXRlIGZyb20gc2NyYXRjaCB0byB1c2Ugc3lzX2Vycmxpc3Qgb25seSBpZgotCWF2YWlsYWJsZSwgYWRkIGVycm5vX21heCgpLCBhZGQgc3RyZXJybm8oKSwgYWRkIHN0cnRvZXJybm8oKSwKLQlhZGQgdGVzdCBkcml2ZXIuCi0JKiBzdHJzaWduYWwuYzogIE5ldyBmaWxlLCBzaWduYWwgZXF1aXZhbGVudCB0byBzdHJlcnJvci5jLgotCVVzZXMgc3lzX3NpZ2xpc3QgaWYgYXZhaWxhYmxlLCBkZWZpbmVzIHNpZ25vX21heCgpLCBzdHJzaWduYWwoKSwKLQlzdHJzaWdubygpLCBzdHJ0b3NpZ25vKCksIHBzaWduYWwoKSwgYW5kIHRlc3QgZHJpdmVyLgotCi1Nb24gQXByIDIwIDIwOjQ5OjMyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZG8gbm90IHByaW50IHJlY3Vyc2lvbiBsaW5lLgotCi0JKiBNYWtlZmlsZS5pbjogYWxsb3cgQ0ZMQUdTIHRvIGJlIHBhc3NlZCBpbiBmcm9tIGNvbW1hbmQgbGluZS4KLQkgIFJlbW92ZWQgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1Nb24gQXByIDIwIDEyOjU3OjQ2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFpeDogIE5ldy4gIEVYVFJBX09GSUxFUyBsaXN0cyBjb3B5c2lnbi5vLAotCXNvIGxpYmcrKyB1c2VycyBkb24ndCBoYXZlIHRvIGJlIGluY29udmVuaWVuY2VkIGJ5IGEKLQlsaWJjLmEgYnVnIChsaWJjLmEgbmVlZHMgY29weXNpZ24sIGJ1dCBkb2Vzbid0IGRlZmluZSBpdCEpLgotCSogY29uZmlndXJlLmluOiAgVXNlIGNvbmZpZy9taC1haXguCi0JKiBzdHJ0b3VsLmM6ICBIYW5kbGUgJy0nIGFzIHJlcXVpcmVkIGJ5IEFOU0kuCi0JQ2xlYW4gdXAgcmFkaXggaGFuZGxpbmcuCi0JKiBzdHJzdHIuYzogIEZpeCBidWdneSBhbGdvcml0aG0uCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZSBzbyB0aGF0ICR7RVhUUkFfT0ZJTEVTfSBpcwotCWFwcGVuZGVkIHRvIG5lZWRlZC1saXN0ICh3aGljaCBpcyB1c2VkIGJ5IGxpYmcrKykuCi0KLUZyaSBBcHIgMTAgMjI6NTE6NDEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuZXcgbmNyMzAwMCBjb25maWcuCi0JKiBjb25maWcvbWgtbmNyMzAwMDogIE5ldyBjb25maWcgZmlsZS4KLQotV2VkIEFwciAgMSAyMzozMTo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJndi5jLCBkdW1teS5jOiAgTGludC4KLQotVHVlIE1hciAzMSAxODo0Njo0NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN5c3Y0OiAgTmV3IGNvbmZpZyBmaWxlLgotCSogY29uZmlndXJlLmluIChob3N0X21ha2VmaWxlX2ZyYWcpOiAgU2V0IHRvIGNvbmZpZy9taC1zeXN2NCBmb3IKLQlob3N0X29zID09IHN5c3Y0LgotCSogZ2V0cGFnZXNpemUuYzogIEZvciBTVlI0LCB1c2Ugc3lzY29uZihfU0NfUEFHRVNJWkUpIHRvIGdldAotCXBhZ2VzaXplLgotCi1TdW4gTWFyIDI5IDEyOjI2OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogIExpbnQuCi0KLUZyaSBNYXIgMjcgMDg6MzI6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGZ1bmN0aW9ucy5kZWYgKGFsbG9jYSk6ICBGaXggcmV0dXJuIHR5cGUgYW5kIGFyZ3MgdG8gYXZvaWQKLQl0eXBlIGNsYXNoIHdpdGggZ2NjJ3MgYnVpbHRpbiBhbGxvY2EuCi0KLVR1ZSBNYXIgMjQgMjM6MzM6NDIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLWlyaXg0OiBpcml4NCBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZiwgYWxsb2NhLmM6IGFkZGVkIGFsbG9jYS4KLQotVHVlIE1hciAyNCAxNzozNDo0NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMgKENBTExfRlJFRUZVTik6ICBNYWtlIGl0IGNvbXBpbGUgb24gREVDc3RhdGlvbnMuCi0KLVRodSBNYXIgMTkgMTM6NTc6NDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIEZpeCB2YXJpb3VzIGV4dGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlCi0JY29ycmVjdCBpbiBhbiBBTlNJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgotCi1TYXQgTWFyIDE0IDE3OjI4OjE3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6ICBDaGFuZ2VzIHRvIHN1cHBvcnQgY2FsbGluZyBtbWFsbG9jIGZ1bmN0aW9ucywKLQl3aGljaCB0YWtlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgb3ZlciBtYWxsb2MgZnVuY3Rpb25zLgotCi1GcmkgTWFyICA2IDIyOjAxOjEwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVRodSBGZWIgMjcgMjI6MTk6MzkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogICNpbmNsdWRlIGFsbG9jYS1jb25mLmggKG5lZWRlZCBieSBBSVgpLgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotU2F0IEZlYiAyMiAwMTowOToyMSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICBDaGVjayBpbiBGcmVkJ3MgdmVyc2lvbiB3aGljaCBmaXhlcyBwcm9ibGVtcyB3aXRoCi0JYWxsb2NhKCkuCi0KLUZyaSBGZWIgIDcgMjE6NDY6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbWFrZWZpbGUuZG9zOiAgUmVtb3ZlIE5VTCB0byBrZWVwIHBhdGNoIGZyb20gZmFpbGluZy4KLQotVGh1IEphbiAzMCAyMjo0ODo0MSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYyAoX2dldG9wdF9pbnRlcm5hbCk6ICBGaXggdXNhZ2Ugb2YgZW51bSBoYXNfYXJnLgotCi1Nb24gSmFuIDIwIDE4OjUzOjIzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLSAJKiBnZXRvcHQuYywgZ2V0b3B0MS5jLCAuLi9pbmNsdWRlL2dldG9wdC5oOiAgR2V0IGxhdGVzdCB2ZXJzaW9ucy4KLQotU2F0IEphbiAxOCAxNjo1MzowMSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgTmV3IGZpbGUgdG8gYnVpbGQgYW5kIGRlc3Ryb3kgc3RhbmRhcmQgYXJndW1lbnQKLQl2ZWN0b3JzIGZyb20gYSBjb21tYW5kIHN0cmluZy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgYXJndi5jIGFuZCBhcmd2Lm8gdG8gYXBwcm9wcmlhdGUgbWFjcm9zLgotCi1GcmkgRGVjIDIwIDEyOjEyOjU3IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDaGFuZ2Ugc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LgotCi0JKiByaW5kZXguYzogIERlY2xhcmUgcmV0dXJuIHR5cGUgb2YgZXh0ZXJuYWxseSB1c2VkIGZ1bmN0aW9uCi0Jc3RycmNocigpLgotCi1UaHUgRGVjIDE5IDE4OjM1OjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZSAiKioqIiBpbiBub3JtYWwgb3V0cHV0LCBzaW5jZSBNYWtlIHByb2R1Y2VzCi0JdGhpcyBvbiBlcnJvcnMsIGFuZCBpdCdzIGNvbnZlbmllbnQgdG8gc2VhcmNoIGZvci4KLQotVHVlIERlYyAxNyAyMzoyMTozMCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbWVtY21wLmMsIG1lbWNweS5jLCBtZW1tb3ZlLmMsIG1lbXNldC5jLCBzdHJjaHIuYywgc3RycmNoci5jOgotCU5ldyBBTlNJIGZ1bmN0aW9ucy4gIFRoZSBvbGQgbm9uLUFOU0kgZnVuY3Rpb25zIChzdWNoIGFzIGJjb3B5KQotCXNob3VsZCBiZSBhdm9pZGVkLgotCSogYmNvcHkuYzogIEZpeCB0byBjb3JyZWN0bHkgaGFuZGxlIG92ZXJsYXBwaW5nIHJlZ2lvbnMuCi0JKiBpbmRleC5jLCByaW5kZXguYzogIFJlLXdyaXRlIGluIHRlcm1zIG9mIHN0cmNocigpIGFuZCBzdHJyY2hyKCkuCi0JKiBmdW5jdGlvbnMuZGVmOiAgQWRkIHRoZSBuZXcgZnVuY3Rpb25zLgotCSogZnVuY3Rpb25zLmRlZjogIEFkZCA0dGggcGFyYW1ldGVyIHRvIERFRiBtYWNybywKLQlhbiBhbnNpZGVjbC5oLXN0eWxlIHByb3RvdHlwZS4KLQkqIGR1bW15LmM6ICBVc2UgZXhwYW5kZWQgREVGIG1hY3JvIHRvIGNyZWF0ZSBhIGR1bW15IGZ1bmN0aW9uCi0JY2FsbCwgd2l0aCBjb3JyZWN0IHBhcmFtZXRlciB0eXBlcy4gIChUaGlzIGF2b2lkcyBzb21lCi0JY29tcGxhaW50cyBmcm9tIGdjYyBhYm91dCBwcmVkZWZpbmVkIGJ1aWx0aW5zLikKLQotCU1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29uZmlnL21oLWRlZmF1bHQgaW50byBNYWtlZmlsZS5pbi4KLQlUaGlzIGF2b2lkIGR1cGxpY2F0aW9uLCBhbmQgc2ltcGxpZmllcyB0aGluZ3Mgc2xpZ2h0bHkuCi0JKiBNYWtlZmlsZS5pbjogIFR3ZWFrIHNvIHdlIGRvbid0IG5lZWQgY29uZmlnL21oLWRlZmF1bHQuCi0JKiBSRUFETUU6ICBVcGRhdGUuCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCBjb25maWcvbWgtZGVmYXVsdC4KLQkqIGNvbmZpZy9taC1kZWZhdWx0OiAgRGVsZXRlZC4KLQkqIGNvbmZpZy9taC1zeXN2OiAgUmVtb3ZlIGxpbmVzIGNvcGllZCBmcm9tIG9sZCBtaC1kZWZhdWx0LgotCi1UdWUgRGVjIDE3IDA1OjQ2OjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBmZG1hdGNoLmMgKGZkbWF0Y2gpOiAgRG9uJ3QgY29tcGFyZSBzdF9yZGV2LCB3aGljaCBpcyBmb3IKLQknbWtub2QnIGRldmljZSBudW1iZXJzLgotCi1Nb24gRGVjIDE2IDEyOjI1OjM0IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBmZG1hdGNoLmMsIE1ha2VmaWxlLmluOiAgQWRkIG5ldyBmdW5jdGlvbiB0aGF0IHRha2VzIHR3bwotCW9wZW4gZmlsZSBkZXNjcmlwdG9ycyBhbmQgcmV0dXJucyBub256ZXJvIGlmIHRoZXkgcmVmZXIgdG8KLQl0aGUgc2FtZSBmaWxlLCB6ZXJvIG90aGVyd2lzZS4gICh1c2VkIGluIGdkYikKLQotV2VkIERlYyAxMSAxNzo0MDozOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQlGcm9tIERKOgotCSogbXNkb3MuYzogc3R1YiBmdW5jdGlvbnMgZm9yIGRvcy4KLQkqIG1ha2VmaWxlLmRvcywgY29uZmlnZGouYmF0OiBuZXcuCi0JKiBnZXRvcHQuYzogRG9uJ3QgaW5jbHVkZSBhbGxvY2EtY29uZi5oIGluIGEgR08zMiB3b3JsZC4KLQotCi1UdWUgRGVjIDEwIDA0OjE0OjQ5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1GcmkgRGVjICA2IDIzOjI2OjQ1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMgYmVjYXVzZSBic2QgbWFrZQotCSAgY2FuJ3QgY29wZS4gIGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuICBpbnN0YWxsIHVzaW5nCi0JICBJTlNUQUxMX0RBVEEuCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIGNvbW1vbnRhcmdldHMgYXMgaXQgaXMgbm8gbG9uZ2VyIGEKLQkgIHJlY29nbml6ZWQgaG9vay4KLQotVGh1IERlYyAgNSAyMjo0Njo0NiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLUZyaSBOb3YgMjIgMTk6MTU6MjkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgZmluZC1uZWVkZWQuYXdrIGRvZXMgbm90IGZpdCBpbiAxNCBjaGFycy4KLQotCSogTWFrZWZpbGUuaW46ICBTdXBwcmVzcyBlcnJvciBjaGVja2luZyB3aGVuIGNvbXBpbGluZyB0aGUgdGVzdAotCXByb2dyYW0sIGJlY2F1c2UgVWx0cml4IG1ha2Uvc2ggYWJvcnRzIHRoZXJlIGR1ZSB0byBhIGJ1Zy4KLQotRnJpIE5vdiAyMiAxMjoyMzoxNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZS1kaWQgaG93IEVYVFJBX09GSUxFUyBpcyB1c2VkIHRvIGJlIG1vcmUgdXNlZnVsLgotCSogUkVBRE1FOiAgRXhwbGFpbmVkIGhvdyB0aGUgYXV0by1jb25maWd1cmF0aW9uIHdvcmtzLAotCWFuZCBob3cgdG8gYWRkIG5ldyBmaWxlcyBhbmQvb3IgY29uZmlndXJhdGlvbnMuCi0KLUZyaSBOb3YgMjIgMDk6NDU6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0cnRvdWwuYzogIEF2b2lkIGRlZmluaW5nIFVMT05HX01BWCBpZiBhbHJlYWR5IGRlZmluZWQ7Ci0JY2FzdCBhIGNvbnN0IGNoYXIgKiB0byBjaGFyICogZm9yIHBlZGFudHMuCi0KLQkqIGdldG9wdC5jOiAgT25seSBkZWZpbmUgImNvbnN0IiBhZnRlciBsb2NhbCBpbmNsdWRlIGZpbGVzIGdldCB0bywKLQlhbmQgb25seSBpZiB0aGV5IGhhdmVuJ3QgZGVmaW5lZCBpdC4KLQotVGh1IE5vdiAyMSAxNjo1ODo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZ2V0Y3dkLmMgKHJlbW92ZSBnZXR3ZC5jKTogR05VIGNvZGUgc2hvdWxkIGNhbGwgZ2V0Y3dkKCkuICBXZQotCWVtdWxhdGUgaXQgd2l0aCBnZXR3ZCgpIGlmIGF2YWlsYWJsZS4gIFRoaXMgYXZvaWRzIGNhbGxlcnMgaGF2aW5nCi0JdG8gZmluZCBhIE1BWFBBVEhMRU4gb3IgUEFUSF9NQVggdmFsdWUgZnJvbSBzb21ld2hlcmUuCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogIGdldHdkLT5nZXRjd2QuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgZ2VuZXJpYyBjYXNlIGZvciBldmVyeSBzeXN0ZW0uCi0JKiBjb25maWcvbWgte2RlbHRhODgsbWFjaCxyczYwMDAsc3ZyNH06ICBSZW1vdmUuCi0JKiBjb25maWcvbWgtc3lzdjogIFVzZSBkZWZhdWx0IGhhbmRsaW5nLCBqdXN0IGFkZCAtRFVTRy4KLQotVGh1IE5vdiAxNCAxMDo1ODowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy9taC1kZWZhdWx0OiBSZS1kbyBtYWtlIG1hZ2ljCi0Jc28gdGhhdCBmb3IgdGhlIGRlZmF1bHQgKCJhdXRvbWF0aWMiKSBtb2RlIHdlIG9ubHkKLQljb21waWxlIHRoZSBmaWxlcyB3ZSBhY3R1YWxseSBuZWVkLiAgRG8gdGhpcyB1c2luZwotCWEgcmVjdXJzaXZlIG1ha2U6ICBUaGUgdG9wLWxldmVsIGdlbmVyYXRlcyB0aGUgbGlzdAotCW9mIG5lZWRlZCBmaWxlcyAobG9vc2VseSwgdGhlIG9uZXMgbWlzc2luZyBpbiBsaWJjKSwKLQlhbmQgdGhlbiBwYXNzZXMgdGhhdCBsaXN0IHRvIHRoZSByZWN1cnNpdmUgbWFrZS4KLQkqIGNvbmZpZy9taC1tYWNoOiAgUmVtb3ZlIG9ic29sZXRlIFNUUkVSUk9SLXtDLE99IG1hY3Jvcy4KLQotVHVlIE5vdiAxMiAxOToxMDo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJTLzYwMDAgaG9zdCBzdXBwb3J0IChncnVtYmxlKS4KLQotCSogY29uZmlndXJlLmluOiAgQnVpbGQgYWxsb2NhLWNvbmYuaCBmaWxlIGZyb20gYWxsb2NhLW5vcm0uaAotCShldmVyeXRoaW5nIGVsc2UpIG9yIGFsbG9jYS1ib3RjaC5oIChycy82MDAwKS4KLQkqIE1ha2VmaWxlLmluOiAgSW5jbHVkZSAuIG9uIHRoZSBpbmNsdWRlIHBhdGguCi0JKiBnZXRvcHQuYzogIFVzZSBhbGxvY2EtY29uZi5oLgotCSogYWxsb2NhLW5vcm0uaDogIEhvdyB0byBkZWNsYXJlIGFsbG9jYSBvbiByZWFzb25hYmxlIG1hY2hpbmVzLgotCSogYWxsb2NhLWJvdGNoLmg6IEhvdyB0byBkZWNsYXJlIGFsbG9jYSBvbiBicmFpbmRlYWQgbWFjaGluZXMuCi0KLVR1ZSBOb3YgMTIgMDk6MjE6NDggMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmNhdC5jIDogIE5ldyBmaWxlLCBsaWtlIGNvbmNhdCgpIGluIGdkYiBidXQgY2FuIHRha2UgYQotCXZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgcmF0aGVyIHRoYW4gZml4ZWQgYXQgMyBhcmdzLiAgRm9yCi0Jbm93LCBjbGllbnQgYXBwbGljYXRpb25zIG11c3Qgc3VwcGx5IGFuIHhtYWxsb2MoKSwgd2hpY2ggaXMgYQotCWZyb250IGVuZCBmdW5jdGlvbiB0byBtYWxsb2MoKSB0aGF0IGRlYWxzIHdpdGggb3V0LW9mLW1lbW9yeQotCWNvbmRpdGlvbnMuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGNvbmNhdC5jIGFuZCBjb25jYXQubyB0byBhcHByb3ByaWF0ZSBtYWNyb3MuCi0KLVNhdCBOb3YgIDkgMTM6Mjk6NTkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zdnI0OiAgQWRkIHNpZ3NldG1hc2sgdG8gbGlzdCBvZiByZXF1aXJlZCBmdW5jdGlvbnMuCi0KLVN1biBOb3YgIDMgMTE6NTc6NTYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHZzcHJpbnRmLmM6ICBOZXcgZmlsZS4KLQkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgQWRkIHZzcHJpbnRmLgotCi1TdW4gT2N0IDI3IDE2OjMxOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1yczYwMDA6ICBBZGQgcnMvNjAwMCBob3N0IHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbjogIENvbXBpbGUgd2l0aCBkZWJ1ZyBpbmZvLgotCi1GcmkgT2N0IDI1IDE3OjAxOjEyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBhbmQgbmV3IGZpbGVzOiBkdW1teS5jLCBmdW5jdGlvbnMuZGVmLAotCWNvbmZpZy9tZi1kZWZhdWx0OiAgQWRkZWQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbW9kZSwKLQl3aGljaCBpbmNsdWRlcyBpbnRvIGxpYmliZXJ0eS5hIGZ1bmN0aW9ucyB0aGF0IGFyZSAibWlzc2luZyIgaW4gbGliYy4KLQkqIHN0cmR1cC5jLCB2cHJpbnRmLmMsIHZmcHJpbnRmLmM6IE5ldyBmaWxlcy4KLQotVGh1IE9jdCAyNCAwMjoyOToyNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2htYWtlLXN2cjQ6IE5ldyBmaWxlLgotCi0JKiBjb25maWcvaG1ha2Utc3lzdjogQWRkIEhPU1RfQ0ZJTEVTIGFuZCBIT1NUX09GSUxFUy4KLQotCSogYmFzZW5hbWUuYywgYmNtcC5jLCBiY29weS5jLCBiemVyby5jLCBnZXRwYWdlc2l6ZS5jIGdldHdkLmMsCi0JaW5kZXguYywgaW5zcXVlLmMsIHJpbmRleC5jLCBzcGFjZXMuYywgc3Ryc3RyLmMsIHZmb3JrLmM6IE5ldwotCWZpbGVzIGNvbnRhaW5pbmcgZWl0aGVyIHBvcnRhYmxlIEMgdmVyc2lvbnMgb3IgZW11bGF0aW9ucyB1c2luZwotCW5hdGl2ZSBsaWJyYXJ5IGNhbGxzLgotCi0JKiBzdHJlcnJvci5jOiAgQWRkIGNvcHlyaWdodCwgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiwgZXRjLgotCi0JKiBzdHJ0b2wuYzogIFJlcGxhY2UgaGFyZHdpcmVkIGhleCBjb25zdGFudHMgd2l0aCBzb21lIG1vcmUKLQlwb3J0YWJsZSBtYWNyb3MuICBSZW1vdmUgaWxsZWdhbCAoYWNjb3JkaW5nIHRvIGdjYykgY2FzdC4KLQotCSogc3RydG91bC5jOiBSZXBsYWNlIGhhcmR3aXJlZCBoZXggY29uc3RhbnQgd2l0aCBtb3JlIHBvcnRhYmxlCi0JbWFjcm8uCi0KLQkqIE1ha2VmaWxlLmluOiBNb3ZlIFRBUkdFVExJQiBhbmQgQ0ZMQUdTIHdoZXJlIG1ha2VmaWxlIGZyYWdtZW50cwotCWNhbiBvdmVycmlkZSB0aGVtLiAgQWRkIG5ldyBzb3VyY2UgYW5kIG9iamVjdCBmaWxlIG5hbWVzIHRvIENGSUxFUwotCWFuZCBPRklMRVMgcmVzcGVjdGl2ZWx5LgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBTVlI0IG1ha2VmaWxlIGZyYWdtZW50cy4KLQotVHVlIE9jdCAyMiAxOTowMDoyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBNb3ZlIFJBTkxJQiwgQVIgYW5kIEFSX0ZMQUdTIHRvIHdoZXJlIHRoZXkgY2FuIGJlCi0Jb3Zlci1yaWRkZW4gYnkgY29uZmlnL2htYWtlLSoKLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgbTg4a2N2cyB0byBzeXN2IGxpc3QKLQotRnJpIE9jdCAgNCAwMToyOTowOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBNb3N0IGhvc3RzIG5lZWQgc3RyZXJyb3IsIGJ1dCBvbmUgb3IgdHdvIGRvbid0LAotCWFuZCB0aGV5IG92ZXJyaWRlIHRoZXNlIGRlZmluaXRpb25zIGluIHRoZSBob3N0LWRlcGVuZGVudCBtYWtlZmlsZQotCWZyYWdtZW50LgotCSogY29uZmlnL2htYWtlLW1hY2g6ICBUaGUgb2RkIG1hbiBvdXQgb24gc3RyZXJyb3IgLS0gaXQncyBzdXBwbGllZC4KLQkqIHN0cmVycm9yLmM6ICBOZXcgZmlsZS4KLQotCSogc3RydG9sLmMsIHN0cnRvdWwuYzogIEFkZCBzdHJ0b2wgdG8gbGliaWJlcnR5LCBzaW5jZSBNYWNoIGxhY2tzCi0JaXQgYW5kIGJmZCB1c2VzIGl0LgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgY29uZmlnL2htYWtlLW1hY2g6ICBPbmx5IGNvbmZpZ3VyZQotCXN0cnRvbCAmIHN0cm90b3VsIGluIG9uIE1hY2guCi0KLVR1ZSBTZXAgIDMgMDY6MzY6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6ICBNZXJnZSB3aXRoIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L01ha2VmaWxlLmluIGIvbGliaWJlcnR5L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY4OWJhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0jCi0jIE1ha2VmaWxlCi0jICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi0jIExpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0jIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi0jIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEsuIFJpY2hhcmQgUGl4bGV5IDxyaWNoQGN5Z251cy5jb20+LgotCi0jCi0jIE1ha2VmaWxlIGZvciBsaWJpYmVydHkgZGlyZWN0b3J5Ci0jCi0KLXNyY2RpciA9IEBzcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi0KLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotYmluZGlyID0gQGJpbmRpckAKLWxpYmRpciA9IEBsaWJkaXJACi0KLVNIRUxMID0gQFNIRUxMQAotCi0jIE11bHRpbGliIHN1cHBvcnQgdmFyaWFibGVzLgotTVVMVElTUkNUT1AgPQotTVVMVElCVUlMRFRPUCA9Ci1NVUxUSURJUlMgPQotTVVMVElTVUJESVIgPQotTVVMVElETyA9IHRydWUKLU1VTFRJQ0xFQU4gPSB0cnVlCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotCi1BUiA9IEBBUkAKLUFSX0ZMQUdTID0gcmMKLQotQ0MgPSBAQ0NACi1DRkxBR1MgPSBAQ0ZMQUdTQAotTElCQ0ZMQUdTID0gJChDRkxBR1MpCi1SQU5MSUIgPSBAUkFOTElCQAotCi1QSUNGTEFHID0KLQotTUFLRU9WRVJSSURFUyA9Ci0KLVRBUkdFVExJQiA9IGxpYmliZXJ0eS5hCi0KLUxJQk9CSlMgPSBATElCT0JKU0AKLUFMTE9DQSA9IEBBTExPQ0FACi0KLSMgQSBjb25maWd1cmF0aW9uIGNhbiBzcGVjaWZ5IGV4dHJhIC5vIGZpbGVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkLAotIyBldmVuIGlmIHRoZXkgYXJlIGluIGxpYmMuIChQZXJoYXBzIHRoZSBsaWJjIHZlcnNpb24gaXMgYnVnZ3kuKQotRVhUUkFfT0ZJTEVTID0gCi0KLSMgRmxhZ3MgdG8gcGFzcyB0byBhIHJlY3Vyc2l2ZSBtYWtlLgotRkxBR1NfVE9fUEFTUyA9IFwKLQkiQVI9JChBUikiIFwKLQkiQVJfRkxBR1M9JChBUl9GTEFHUykiIFwKLQkiQ0M9JChDQykiIFwKLQkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAotCSJMSUJDRkxBR1M9JChMSUJDRkxBR1MpIiBcCi0JIkVYVFJBX09GSUxFUz0kKEVYVFJBX09GSUxFUykiIFwKLQkiSERFRklORVM9JChIREVGSU5FUykiIFwKLQkiSU5TVEFMTD0kKElOU1RBTEwpIiBcCi0JIklOU1RBTExfREFUQT0kKElOU1RBTExfREFUQSkiIFwKLQkiSU5TVEFMTF9QUk9HUkFNPSQoSU5TVEFMTF9QUk9HUkFNKSIgXAotCSJMREZMQUdTPSQoTERGTEFHUykiIFwKLQkiTE9BRExJQkVTPSQoTE9BRExJQkVTKSIgXAotCSJSQU5MSUI9JChSQU5MSUIpIiBcCi0JIlNIRUxMPSQoU0hFTEwpIgotCi1hbGw6IHN0YW1wLXBpY2RpciAkKFRBUkdFVExJQikgbmVlZGVkLWxpc3QgcmVxdWlyZWQtbGlzdAotCUAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgbXVsdGktZG8gRE89YWxsCi0KLS5QSE9OWTogY2hlY2sgaW5zdGFsbGNoZWNrCi1jaGVjayBpbnN0YWxsY2hlY2s6Ci0KLUBob3N0X21ha2VmaWxlX2ZyYWdACi0KLUlOQ0RJUj0kKHNyY2RpcikvJChNVUxUSVNSQ1RPUCkuLi9pbmNsdWRlCi0KLUNPTVBJTEUuYyA9ICQoQ0MpIC1jIEBERUZTQCAkKExJQkNGTEFHUykgLUkuIC1JJChJTkNESVIpICQoSERFRklORVMpCi0uYy5vOgotCXRlc3QgeCIkKGVuYWJsZV9zaGFyZWQpIiAhPSB4eWVzIHx8IFwKLQkgICQoQ09NUElMRS5jKSAkKFBJQ0ZMQUcpICQ8IC1vIHBpYy8kQAotCSQoQ09NUElMRS5jKSAkPAotCi1pbmZvIGluc3RhbGwtaW5mbyBjbGVhbi1pbmZvIGR2aToKLQotIyBJbmNsdWRlIGZpbGVzIHRoYXQgYXJlIGluIHRoaXMgZGlyZWN0b3J5LgotSEZJTEVTID0gYWxsb2NhLWNvbmYuaAotCi0jIE5PVEU6IElmIHlvdSBhZGQgbmV3IGZpbGVzIHRvIHRoZSBsaWJyYXJ5LCBhZGQgdGhlbSB0byB0aGlzIGxpc3QKLSMgKGFscGhhYmV0aWNhbCksIGFuZCBhZGQgdGhlbSB0byBSRVFVSVJFRF9PRklMRVMgb3IgZnVuY3MgaW4KLSMgY29uZmlndXJlLmluLgotQ0ZJTEVTID0gYXNwcmludGYuYyBhbGxvY2EuYyBhcmd2LmMgYXRleGl0LmMgYmFzZW5hbWUuYyBiY21wLmMgYmNvcHkuYyBcCi0JYnplcm8uYyBjaG9vc2UtdGVtcC5jIGNsb2NrLmMgY29uY2F0LmMgY3BsdXMtZGVtLmMgZmRtYXRjaC5jIFwKLQlmbm1hdGNoLmMgZ2V0Y3dkLmMgZ2V0b3B0LmMgZ2V0b3B0MS5jIGdldHBhZ2VzaXplLmMgXAotCWdldHJ1bnRpbWUuYyBmbG9hdGZvcm1hdC5jIGhleC5jIGluZGV4LmMgaW5zcXVlLmMgbWVtY2hyLmMgXAotCW1lbWNtcC5jIG1lbWNweS5jIG1lbW1vdmUuYyBtZW1zZXQuYyBta3N0ZW1wcy5jIG9iamFsbG9jLmMgb2JzdGFjay5jIFwKLQlwZXhlY3V0ZS5jIHJhbmRvbS5jIHJlbmFtZS5jIHJpbmRleC5jIHNpZ3NldG1hc2suYyBzcGFjZXMuYyBcCi0Jc3BsYXktdHJlZS5jIHN0cmNhc2VjbXAuYyBzdHJuY2FzZWNtcC5jIHN0cmNoci5jIHN0cmR1cC5jIHN0cmVycm9yLmMgXAotCXN0cnJjaHIuYyBzdHJzaWduYWwuYyBzdHJzdHIuYyBzdHJ0b2QuYyBzdHJ0b2wuYyBzdHJ0b3VsLmMgXAotCXRtcG5hbS5jIHZhc3ByaW50Zi5jIHZmb3JrLmMgdmZwcmludGYuYyB2cHJpbnRmLmMgdnNwcmludGYuYyBcCi0Jd2FpdHBpZC5jIHhhdGV4aXQuYyB4ZXhpdC5jIHhtYWxsb2MuYyB4c3RyZHVwLmMgeHN0cmVycm9yLmMKLQotIyBUaGVzZSBhcmUgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5LgotUkVRVUlSRURfT0ZJTEVTID0gYXJndi5vIGNob29zZS10ZW1wLm8gY29uY2F0Lm8gY3BsdXMtZGVtLm8gXAotICBmZG1hdGNoLm8gZm5tYXRjaC5vIGdldG9wdC5vIGdldG9wdDEubyBnZXRydW50aW1lLm8gaGV4Lm8gXAotICBmbG9hdGZvcm1hdC5vIG9iamFsbG9jLm8gb2JzdGFjay5vIHBleGVjdXRlLm8gc3BhY2VzLm8gXAotICBzcGxheS10cmVlLm8gc3RyZXJyb3IubyBzdHJzaWduYWwubyB4YXRleGl0Lm8geGV4aXQubyB4bWFsbG9jLm8gXAotICB4c3RyZHVwLm8geHN0cmVycm9yLm8KLQotJChUQVJHRVRMSUIpOiAkKFJFUVVJUkVEX09GSUxFUykgJChFWFRSQV9PRklMRVMpICQoTElCT0JKUykgJChBTExPQ0EpCi0Jcm0gLWYgJChUQVJHRVRMSUIpCi0JJChBUikgJChBUl9GTEFHUykgJChUQVJHRVRMSUIpIFwKLQkgICQoUkVRVUlSRURfT0ZJTEVTKSAkKEVYVFJBX09GSUxFUykgJChMSUJPQkpTKSAkKEFMTE9DQSkKLQkkKFJBTkxJQikgJChUQVJHRVRMSUIpCi0KLUlOU1RBTExfREVTVCA9IEBJTlNUQUxMX0RFU1RACi1pbnN0YWxsOiBpbnN0YWxsX3RvXyQoSU5TVEFMTF9ERVNUKQotCi1pbnN0YWxsX3RvX2xpYmRpcjogYWxsCi0JJChJTlNUQUxMX0RBVEEpICQoVEFSR0VUTElCKSAkKGxpYmRpcikkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikubgotCSggY2QgJChsaWJkaXIpJChNVUxUSVNVQkRJUikgOyAkKFJBTkxJQikgJChUQVJHRVRMSUIpLm4gKQotCW12IC1mICQobGliZGlyKSQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKS5uICQobGliZGlyKSQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKQotCUAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgbXVsdGktZG8gRE89aW5zdGFsbAotCi1pbnN0YWxsX3RvX3Rvb2xkaXI6IGFsbAotCSQoSU5TVEFMTF9EQVRBKSAkKFRBUkdFVExJQikgJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikubgotCSggY2QgJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKSA7ICQoUkFOTElCKSAkKFRBUkdFVExJQikubiApCi0JbXYgLWYgJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikubiAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKQotCUAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgbXVsdGktZG8gRE89aW5zdGFsbAotCi0jIG5lZWRlZC1saXN0IGlzIHVzZWQgYnkgbGlic3RkYysrLgotbmVlZGVkLWxpc3Q6IE1ha2VmaWxlCi0JZj0iJChMSUJPQkpTKSAkKEFMTE9DQSkgJChFWFRSQV9PRklMRVMpIjsgXAotCWNhc2UgJCRmIGluIFwKLQkgICphbGxvY2EubyopIGY9IiQkZiB4bWFsbG9jLm8geGV4aXQubyIgOzsgXAotCWVzYWM7IFwKLQllY2hvICQkZiA+IG5lZWRlZC1saXN0Ci0KLSMgcmVxdWlyZWQtbGlzdCB3YXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgc2hhcmVkIGJmZC9vcGNvZGVzL2xpYmliZXJ0eQotIyBsaWJyYXJ5LiAgSSBkb24ndCBrbm93IGlmIGl0IHVzZWQgYnkgYW55dGhpbmcgY3VycmVudGx5LgotcmVxdWlyZWQtbGlzdDogTWFrZWZpbGUKLQllY2hvICQoUkVRVUlSRURfT0ZJTEVTKSA+IHJlcXVpcmVkLWxpc3QKLQotc3RhbXAtcGljZGlyOgotCWlmIFsgeCIkKGVuYWJsZV9zaGFyZWQpIiA9IHh5ZXMgXSAmJiBbICEgLWQgcGljIF07IHRoZW4gXAotCSAgbWtkaXIgcGljOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLXBpY2RpcgotCi0uUEhPTlk6IGFsbCBldGFncyB0YWdzIGxzIGNsZWFuIHN0YWdlMSBzdGFnZTIKLQotZXRhZ3MgdGFnczogVEFHUwotCi1UQUdTOiAkKENGSUxFUykgJChIRklMRVMpCi0JZXRhZ3MgYGZvciBpIGluICQoSEZJTEVTKSAkKENGSUxFUyk7IGRvIGVjaG8gJChzcmNkaXIpLyQkaSA7IGRvbmVgCi0KLSMgVGhlIHN0YW5kYWxvbmUgZGVtYW5nbGVyIChjKytmaWx0KSBoYXMgYmVlbiBtb3ZlZCB0byBiaW51dGlscy4KLWRlbWFuZ2xlOgotCUBlY2hvICJUaGUgc3RhbmRhbG9uZSBkZW1hbmdsZXIsIG5vdyBuYW1lZCBjKytmaWx0LCBpcyBub3ciCi0JQGVjaG8gImEgcGFydCBvZiBiaW51dGlscy4iCi0JQGZhbHNlCi0KLWxzOgotCUBlY2hvIE1ha2VmaWxlICQoSEZJTEVTKSAkKENGSUxFUykKLQotIyBOZWVkIHRvIGRlYWwgd2l0aCBwcm9maWxlZCBsaWJyYXJpZXMsIHRvby4KLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLXJmICoubyBwaWMgY29yZSBlcnJzIFwjKiAqLkUgYS5vdXQKLQlybSAtZiBuZWVkZWQuYXdrIG5lZWRlZDIuYXdrIGVycm9ycyBkdW1teSBuZWVkZWQtbGlzdCBjb25maWcuaCBzdGFtcC0qCi0Jcm0gLWYgJChDT05GSUdfSCkgJChORUVERURfTElTVCkgc3RhbXAtcGljZGlyCi0JQCQoTVVMVElDTEVBTikgbXVsdGktY2xlYW4gRE89bW9zdGx5Y2xlYW4KLWNsZWFuOiBtb3N0bHljbGVhbgotCXJtIC1mICouYSByZXF1aXJlZC1saXN0IHRtcG11bHRpLm91dAotCUAkKE1VTFRJQ0xFQU4pIG11bHRpLWNsZWFuIERPPWNsZWFuCi1kaXN0Y2xlYW46IGNsZWFuCi0JQCQoTVVMVElDTEVBTikgbXVsdGktY2xlYW4gRE89ZGlzdGNsZWFuCi0Jcm0gLWYgKn4gTWFrZWZpbGUgY29uZmlnLnN0YXR1cyB4aG9zdC1ta2ZyYWcgVEFHUyBtdWx0aWxpYi5vdXQKLQlybSAtZiBjb25maWcubG9nCi1tYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogZGlzdGNsZWFuCi0KLWZvcmNlOgotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKLQlDT05GSUdfRklMRVM9TWFrZWZpbGUgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1jb25maWcuaDogc3RhbXAtaCA7IEB0cnVlCi1zdGFtcC1oOiBjb25maWcuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcudGFibGUKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSQoUkVRVUlSRURfT0ZJTEVTKSAkKEVYVFJBX09GSUxFUykgJChMSUJPQkpTKSAkKEFMTE9DQSk6IHN0YW1wLXBpY2RpcgotCi1hbGxvY2EubzogY29uZmlnLmgKLWF0ZXhpdC5vOiBjb25maWcuaAotYXJndi5vOiBjb25maWcuaCBhbGxvY2EtY29uZi5oICQoSU5DRElSKS9saWJpYmVydHkuaAotYmFzZW5hbWUubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1jaG9vc2UtdGVtcC5vOiBjb25maWcuaAotY2xvY2subzogY29uZmlnLmgKLWNvbmNhdC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWNwbHVzLWRlbS5vOiBjb25maWcuaCAkKElOQ0RJUikvZGVtYW5nbGUuaAotZmRtYXRjaC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWZubWF0Y2gubzogY29uZmlnLmggJChJTkNESVIpL2ZubWF0Y2guaAotZ2V0Y3dkLm86IGNvbmZpZy5oCi1nZXRvcHQubzogY29uZmlnLmggJChJTkNESVIpL2dldG9wdC5oCi1nZXRvcHQxLm86IGNvbmZpZy5oICQoSU5DRElSKS9nZXRvcHQuaAotZ2V0cGFnZXNpemUubzogY29uZmlnLmgKLWdldHJ1bnRpbWUubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1oZXgubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1mbG9hdGZvcm1hdC5vOiAkKElOQ0RJUikvZmxvYXRmb3JtYXQuaAotbWtzdGVtcHMubzogY29uZmlnLmgKLW9iamFsbG9jLm86ICQoSU5DRElSKS9vYmphbGxvYy5oCi1vYnN0YWNrLm86IGNvbmZpZy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLXBleGVjdXRlLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3BhY2VzLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotc3BsYXktdHJlZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL3NwbGF5LXRyZWUuaCAkKElOQ0RJUikvYW5zaWRlY2wuaAotc3RyZXJyb3IubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdHJzaWduYWwubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi14YXRleGl0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAoteGV4aXQubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi14bWFsbG9jLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAoteHN0cmR1cC5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhzdHJlcnJvci5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9SRUFETUUgYi9saWJpYmVydHkvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUyMjZhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgLWxpYmVydHkgbGlicmFyeSBvZiBmcmVlIHNvZnR3YXJlLgotSXQgaXMgYSBjb2xsZWN0aW9uIG9mIHN1YnJvdXRpbmVzIHVzZWQgYnkgdmFyaW91cyBHTlUgcHJvZ3JhbXMuCi1DdXJyZW50IG1lbWJlcnMgaW5jbHVkZToKLQotCWdldG9wdCAtLSBnZXQgb3B0aW9ucyBmcm9tIGNvbW1hbmQgbGluZQotCW9ic3RhY2sgLS0gc3RhY2tzIG9mIGFyYml0cmFyaWx5LXNpemVkIG9iamVjdHMKLQlzdHJlcnJvciAtLSBlcnJvciBtZXNzYWdlIHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byBlcnJubwotCXN0cnRvbCAtLSBzdHJpbmctdG8tbG9uZyBjb252ZXJzaW9uCi0Jc3RydG91bCAtLSBzdHJpbmctdG8tdW5zaWduZWQtbG9uZyBjb252ZXJzaW9uCi0KLVdlIGV4cGVjdCBtYW55IG9mIHRoZSBHTlUgc3Vicm91dGluZXMgdGhhdCBhcmUgZmxvYXRpbmcgYXJvdW5kIHRvCi1ldmVudHVhbGx5IGFycml2ZSBoZXJlLgotCi1UaGUgbGlicmFyeSBtdXN0IGJlIGNvbmZpZ3VyZWQgZnJvbSB0aGUgdG9wIHNvdXJjZSBkaXJlY3RvcnkuICBEb24ndAotdHJ5IHRvIHJ1biBjb25maWd1cmUgaW4gdGhpcyBkaXJlY3RvcnkuICBGb2xsb3cgdGhlIGNvbmZpZ3VyYXRpb24KLWluc3RydWN0aW9ucyBpbiAuLi9SRUFETUUuCi0KLVBsZWFzZSByZXBvcnQgYnVncyBhbmQgZml4ZXMgdG8gImJ1Zy1nbnUtdXRpbHNAcHJlcC5haS5taXQuZWR1Ii4gIFRoYW5rIHlvdS4KLQotQURESU5HIEEgTkVXIEZJTEUKLT09PT09PT09PT09PT09PT09Ci0KLVRoZXJlIGFyZSB0d28gc2V0cyBvZiBmaWxlczogIFRob3NlIHRoYXQgYXJlICJyZXF1aXJlZCIgd2lsbCBiZQotaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkgZm9yIGFsbCBjb25maWd1cmF0aW9ucywgd2hpbGUgdGhvc2UKLXRoYXQgYXJlICJvcHRpb25hbCIgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeSBvbmx5IGlmICJuZWVkZWQuIgotCi1UbyBhZGQgYSBuZXcgcmVxdWlyZWQgZmlsZSwgZWRpdCBNYWtlZmlsZSB0byBhZGQgdGhlIHNvdXJjZSBmaWxlCi1uYW1lIHRvIENGSUxFUyBhbmQgdGhlIG9iamVjdCBmaWxlIHRvIFJFUVVJUkVEX09GSUxFUy4KLQotVG8gYWRkIGEgbmV3IG9wdGlvbmFsIGZpbGUsIGl0IG11c3QgcHJvdmlkZSBhIHNpbmdsZSBmdW5jdGlvbiwgYW5kIHRoZQotbmFtZSBvZiB0aGUgZnVuY3Rpb24gbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLQotICAgICogQWRkIHRoZSBzb3VyY2UgZmlsZSBuYW1lIHRvIENGSUxFUy4KLQotICAgICogQWRkIHRoZSBmdW5jdGlvbiB0byBuYW1lIHRvIHRoZSBmdW5jcyBzaGVsbCB2YXJpYWJsZSBpbgotICAgICAgY29uZmlndXJlLmluLgotCi0gICAgKiBBZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSBBQ19DSEVDS19GVU5DUyBsaXN0cyBqdXN0IGFmdGVyIHRoZQotICAgICAgc2V0dGluZyBvZiB0aGUgZnVuY3Mgc2hlbGwgdmFyaWFibGUuICBUaGVzZSBBQ19DSEVDS19GVU5DUyBjYWxscwotICAgICAgYXJlIG5ldmVyIGV4ZWN1dGVkOyB0aGV5IGFyZSB0aGVyZSB0byBtYWtlIGF1dG9oZWFkZXIgd29yawotICAgICAgYmV0dGVyLgotCi0gICAgKiBDb25zaWRlciB0aGUgc3BlY2lhbCBjYXNlcyBvZiBidWlsZGluZyBsaWJpYmVydHk7IGFzIG9mIHRoaXMKLSAgICAgIHdyaXRpbmcsIHRoZSBzcGVjaWFsIGNhc2VzIGFyZSBuZXdsaWIgYW5kIFZ4V29ya3MuICBJZiBhCi0gICAgICBwYXJ0aWN1bGFyIHNwZWNpYWwgY2FzZSBwcm92aWRlcyB0aGUgZnVuY3Rpb24sIHlvdSBkbyBub3QgbmVlZAotICAgICAgdG8gZG8gYW55dGhpbmcuICBJZiBpdCBkb2VzIG5vdCBwcm92aWRlIHRoZSBmdW5jdGlvbiwgYWRkIHRoZQotICAgICAgb2JqZWN0IGZpbGUgdG8gTElCT0JKUywgYW5kIGFkZCB0aGUgZnVuY3Rpb24gbmFtZSB0byB0aGUgY2FzZQotICAgICAgY29udHJvbGxpbmcgd2hldGhlciB0byBkZWZpbmUgSEFWRV9mdW5jLgotCi1UaGUgb3B0aW9uYWwgZmlsZSB5b3UndmUgYWRkZWQgKGUuZy4gZ2V0Y3dkLmMpIHNob3VsZCBjb21waWxlIGFuZCB3b3JrCi1vbiBhbGwgaG9zdHMgd2hlcmUgaXQgaXMgbmVlZGVkLiAgSXQgZG9lcyBub3QgaGF2ZSB0byB3b3JrIG9yIGV2ZW4KLWNvbXBpbGUgb24gaG9zdHMgd2hlcmUgaXQgaXMgbm90IG5lZWRlZC4KLQotQURESU5HIEEgTkVXIENPTkZJR1VSQVRJT04KLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLU9uIG1vc3QgaG9zdHMgeW91IHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGUgc2NoZW1lIGZvciBhdXRvbWF0aWNhbGx5Ci1maWd1cmluZyBvdXQgd2hpY2ggZmlsZXMgYXJlIG5lZWRlZC4gIEluIHRoYXQgY2FzZSwgeW91IHByb2JhYmx5Ci1kb24ndCBuZWVkIGEgc3BlY2lhbCBNYWtlZmlsZSBzdHViIGZvciB0aGF0IGNvbmZpZ3VyYXRpb24uCi0KLUlmIHRoZSBmdWxseSBhdXRvbWF0aWMgc2NoZW1lIGRvZXNuJ3Qgd29yaywgeW91IG1heSBiZSBhYmxlIHRvIGdldAotYnkgd2l0aCBkZWZpbmluZyBFWFRSQV9PRklMRVMgaW4geW91ciBNYWtlZmlsZSBzdHViLiAgVGhpcyBpcwotYSBsaXN0IG9mIG9iamVjdCBmaWxlIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcmVxdWlyZWQKLWZvciB0aGlzIGNvbmZpZ3VyYXRpb24gLSB0aGV5IHdpbGwgYmUgaW5jbHVkZWQgaW4gbGliaWJlcnR5LmEsCi1yZWdhcmRsZXNzIG9mIHdoYXRldmVyIG1pZ2h0IGJlIGluIHRoZSBDIGxpYnJhcnkuCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYWNjb25maWcuaCBiL2xpYmliZXJ0eS9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2M1OTlkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfZXJybGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19uZXJyIHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ORVJSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX3NpZ2xpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJlcnJvciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJFUlJPUgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FsbG9jYS1jb25mLmggYi9saWJpYmVydHkvYWxsb2NhLWNvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzZWVhMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYWxsb2NhLWNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyBpZm5kZWYgYWxsb2NhCi0jICBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSMgZW5kaWYKLSNlbHNlIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgIGlmIGRlZmluZWQoSEFWRV9BTExPQ0FfSCkgJiYgIWRlZmluZWQoQ19BTExPQ0EpCi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlIC8qICEgZGVmaW5lZCAoSEFWRV9BTExPQ0FfSCkgKi8KLSMgICBpZmRlZiBfX1NURENfXwotZXh0ZXJuIFBUUiBhbGxvY2EgKHNpemVfdCk7Ci0jICAgZWxzZSAvKiAhIGRlZmluZWQgKF9fU1REQ19fKSAqLwotZXh0ZXJuIFBUUiBhbGxvY2EgKCk7Ci0jICAgZW5kaWYgLyogISBkZWZpbmVkIChfX1NURENfXykgKi8KLSMgIGVuZGlmIC8qICEgZGVmaW5lZCAoSEFWRV9BTExPQ0FfSCkgKi8KLSMgIGlmZGVmIF9XSU4zMgotIyAgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZW5kaWYKLSMgZW5kaWYgLyogISBkZWZpbmVkIChfQUlYKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYWxsb2NhLmMgYi9saWJpYmVydHkvYWxsb2NhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGEyMTUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FsbG9jYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qIGFsbG9jYS5jIC0tIGFsbG9jYXRlIGF1dG9tYXRpY2FsbHkgcmVjbGFpbWVkIG1lbW9yeQotICAgKE1vc3RseSkgcG9ydGFibGUgcHVibGljLWRvbWFpbiBpbXBsZW1lbnRhdGlvbiAtLSBEIEEgR3d5bgotCi0gICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQV0IgbGlicmFyeSBhbGxvY2EgZnVuY3Rpb24sCi0gICB3aGljaCBpcyB1c2VkIHRvIGFsbG9jYXRlIHNwYWNlIG9mZiB0aGUgcnVuLXRpbWUgc3RhY2sgc28KLSAgIHRoYXQgaXQgaXMgYXV0b21hdGljYWxseSByZWNsYWltZWQgdXBvbiBwcm9jZWR1cmUgZXhpdCwKLSAgIHdhcyBpbnNwaXJlZCBieSBkaXNjdXNzaW9ucyB3aXRoIEouIFEuIEpvaG5zb24gb2YgQ29ybmVsbC4KLSAgIEouT3R0byBUZW5uYW50IDxqb3RAY3JheS5jb20+IGNvbnRyaWJ1dGVkIHRoZSBDcmF5IHN1cHBvcnQuCi0KLSAgIFRoZXJlIGFyZSBzb21lIHByZXByb2Nlc3NvciBjb25zdGFudHMgdGhhdCBjYW4KLSAgIGJlIGRlZmluZWQgd2hlbiBjb21waWxpbmcgZm9yIHlvdXIgc3BlY2lmaWMgc3lzdGVtLCBmb3IKLSAgIGltcHJvdmVkIGVmZmljaWVuY3k7IGhvd2V2ZXIsIHRoZSBkZWZhdWx0cyBzaG91bGQgYmUgb2theS4KLQotICAgVGhlIGdlbmVyYWwgY29uY2VwdCBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRvIGtlZXAKLSAgIHRyYWNrIG9mIGFsbCBhbGxvY2EtYWxsb2NhdGVkIGJsb2NrcywgYW5kIHJlY2xhaW0gYW55Ci0gICB0aGF0IGFyZSBmb3VuZCB0byBiZSBkZWVwZXIgaW4gdGhlIHN0YWNrIHRoYW4gdGhlIGN1cnJlbnQKLSAgIGludm9jYXRpb24uICBUaGlzIGhldXJpc3RpYyBkb2VzIG5vdCByZWNsYWltIHN0b3JhZ2UgYXMKLSAgIHNvb24gYXMgaXQgYmVjb21lcyBpbnZhbGlkLCBidXQgaXQgd2lsbCBkbyBzbyBldmVudHVhbGx5LgotCi0gICBBcyBhIHNwZWNpYWwgY2FzZSwgYWxsb2NhKDApIHJlY2xhaW1zIHN0b3JhZ2Ugd2l0aG91dAotICAgYWxsb2NhdGluZyBhbnkuICBJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2UgYWxsb2NhKDApIGluCi0gICB5b3VyIG1haW4gY29udHJvbCBsb29wLCBldGMuIHRvIGZvcmNlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgZW1hY3MKLSNpbmNsdWRlICJibG9ja2lucHV0LmgiCi0jZW5kaWYKLQotLyogSWYgY29tcGlsaW5nIHdpdGggR0NDIDIsIHRoaXMgZmlsZSdzIG5vdCBuZWVkZWQuICBFeGNlcHQgb2YgY291cnNlIGlmCi0gICB0aGUgQyBhbGxvY2EgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQuICAqLwotI2lmIGRlZmluZWQgKFVTRV9DX0FMTE9DQSkgfHwgIWRlZmluZWQgKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA8IDIKLQotLyogSWYgc29tZW9uZSBoYXMgZGVmaW5lZCBhbGxvY2EgYXMgYSBtYWNybywKLSAgIHRoZXJlIG11c3QgYmUgc29tZSBvdGhlciB3YXkgYWxsb2NhIGlzIHN1cHBvc2VkIHRvIHdvcmsuICAqLwotI2lmbmRlZiBhbGxvY2EKLQotI2lmZGVmIGVtYWNzCi0jaWZkZWYgc3RhdGljCi0vKiBhY3R1YWxseSwgb25seSB3YW50IHRoaXMgaWYgc3RhdGljIGlzIGRlZmluZWQgYXMgIiIKLSAgIC0tIHRoaXMgaXMgZm9yIHVzZywgaW4gd2hpY2ggZW1hY3MgbXVzdCB1bmRlZmluZSBzdGF0aWMKLSAgIGluIG9yZGVyIHRvIG1ha2UgdW5leGVjIHdvcmthYmxlCi0gICAqLwotI2lmbmRlZiBTVEFDS19ESVJFQ1RJT04KLXlvdQotbG9zZQotLS0gbXVzdCBrbm93IFNUQUNLX0RJUkVDVElPTiBhdCBjb21waWxlLXRpbWUKLSNlbmRpZiAvKiBTVEFDS19ESVJFQ1RJT04gdW5kZWZpbmVkICovCi0jZW5kaWYgLyogc3RhdGljICovCi0jZW5kaWYgLyogZW1hY3MgKi8KLQotLyogSWYgeW91ciBzdGFjayBpcyBhIGxpbmtlZCBsaXN0IG9mIGZyYW1lcywgeW91IGhhdmUgdG8KLSAgIHByb3ZpZGUgYW4gImFkZHJlc3MgbWV0cmljIiBBRERSRVNTX0ZVTkNUSU9OIG1hY3JvLiAgKi8KLQotI2lmIGRlZmluZWQgKENSQVkpICYmIGRlZmluZWQgKENSQVlfU1RBQ0tTRUdfRU5EKQotbG9uZyBpMDBhZnVuYyAoKTsKLSNkZWZpbmUgQUREUkVTU19GVU5DVElPTihhcmcpIChjaGFyICopIGkwMGFmdW5jICgmKGFyZykpCi0jZWxzZQotI2RlZmluZSBBRERSRVNTX0ZVTkNUSU9OKGFyZykgJihhcmcpCi0jZW5kaWYKLQotI2lmIF9fU1REQ19fCi10eXBlZGVmIHZvaWQgKnBvaW50ZXI7Ci0jZWxzZQotdHlwZWRlZiBjaGFyICpwb2ludGVyOwotI2VuZGlmCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZQlOVUxMCTAKLSNlbmRpZgotCi0vKiBEaWZmZXJlbnQgcG9ydGlvbnMgb2YgRW1hY3MgbmVlZCB0byBjYWxsIGRpZmZlcmVudCB2ZXJzaW9ucyBvZgotICAgbWFsbG9jLiAgVGhlIEVtYWNzIGV4ZWN1dGFibGUgbmVlZHMgYWxsb2NhIHRvIGNhbGwgeG1hbGxvYywgYmVjYXVzZQotICAgb3JkaW5hcnkgbWFsbG9jIGlzbid0IHByb3RlY3RlZCBmcm9tIGlucHV0IHNpZ25hbHMuICBPbiB0aGUgb3RoZXIKLSAgIGhhbmQsIHRoZSB1dGlsaXRpZXMgaW4gbGliLXNyYyBuZWVkIGFsbG9jYSB0byBjYWxsIG1hbGxvYzsgc29tZSBvZgotICAgdGhlbSBhcmUgdmVyeSBzaW1wbGUsIGFuZCBkb24ndCBoYXZlIGFuIHhtYWxsb2Mgcm91dGluZS4KLQotICAgTm9uLUVtYWNzIHByb2dyYW1zIGV4cGVjdCB0aGlzIHRvIGNhbGwgdXNlIHhtYWxsb2MuCi0KLSAgIENhbGxlcnMgYmVsb3cgc2hvdWxkIHVzZSBtYWxsb2MuICAqLwotCi0jaWZuZGVmIGVtYWNzCi0jZGVmaW5lIG1hbGxvYyB4bWFsbG9jCi0jZW5kaWYKLWV4dGVybiBwb2ludGVyIG1hbGxvYyAoKTsKLQotLyogRGVmaW5lIFNUQUNLX0RJUkVDVElPTiBpZiB5b3Uga25vdyB0aGUgZGlyZWN0aW9uIG9mIHN0YWNrCi0gICBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5Ci0gICBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotCi0gICBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gICBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSAgIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duICAqLwotCi0jaWZuZGVmIFNUQUNLX0RJUkVDVElPTgotI2RlZmluZQlTVEFDS19ESVJFQ1RJT04JMAkvKiBEaXJlY3Rpb24gdW5rbm93bi4gICovCi0jZW5kaWYKLQotI2lmIFNUQUNLX0RJUkVDVElPTiAhPSAwCi0KLSNkZWZpbmUJU1RBQ0tfRElSCVNUQUNLX0RJUkVDVElPTgkvKiBLbm93biBhdCBjb21waWxlLXRpbWUuICAqLwotCi0jZWxzZSAvKiBTVEFDS19ESVJFQ1RJT04gPT0gMDsgbmVlZCBydW4tdGltZSBjb2RlLiAgKi8KLQotc3RhdGljIGludCBzdGFja19kaXI7CQkvKiAxIG9yIC0xIG9uY2Uga25vd24uICAqLwotI2RlZmluZQlTVEFDS19ESVIJc3RhY2tfZGlyCi0KLXN0YXRpYyB2b2lkCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IE5VTEw7CS8qIEFkZHJlc3Mgb2YgZmlyc3QgYGR1bW15Jywgb25jZSBrbm93bi4gICovCi0gIGF1dG8gY2hhciBkdW1teTsJCS8qIFRvIGdldCBzdGFjayBhZGRyZXNzLiAgKi8KLQotICBpZiAoYWRkciA9PSBOVUxMKQotICAgIHsJCQkJLyogSW5pdGlhbCBlbnRyeS4gICovCi0gICAgICBhZGRyID0gQUREUkVTU19GVU5DVElPTiAoZHVtbXkpOwotCi0gICAgICBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsJLyogUmVjdXJzZSBvbmNlLiAgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTZWNvbmQgZW50cnkuICAqLwotICAgICAgaWYgKEFERFJFU1NfRlVOQ1RJT04gKGR1bW15KSA+IGFkZHIpCi0Jc3RhY2tfZGlyID0gMTsJCS8qIFN0YWNrIGdyZXcgdXB3YXJkLiAgKi8KLSAgICAgIGVsc2UKLQlzdGFja19kaXIgPSAtMTsJCS8qIFN0YWNrIGdyZXcgZG93bndhcmQuICAqLwotICAgIH0KLX0KLQotI2VuZGlmIC8qIFNUQUNLX0RJUkVDVElPTiA9PSAwICovCi0KLS8qIEFuICJhbGxvY2EgaGVhZGVyIiBpcyB1c2VkIHRvOgotICAgKGEpIGNoYWluIHRvZ2V0aGVyIGFsbCBhbGxvY2EnZWQgYmxvY2tzOwotICAgKGIpIGtlZXAgdHJhY2sgb2Ygc3RhY2sgZGVwdGguCi0KLSAgIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgc2l6ZW9mKGhlYWRlcikgYWdyZWUgd2l0aCBtYWxsb2MKLSAgIGFsaWdubWVudCBjaHVuayBzaXplLiAgVGhlIGZvbGxvd2luZyBkZWZhdWx0IHNob3VsZCB3b3JrIG9rYXkuICAqLwotCi0jaWZuZGVmCUFMSUdOX1NJWkUKLSNkZWZpbmUJQUxJR05fU0laRQlzaXplb2YoZG91YmxlKQotI2VuZGlmCi0KLXR5cGVkZWYgdW5pb24gaGRyCi17Ci0gIGNoYXIgYWxpZ25bQUxJR05fU0laRV07CS8qIFRvIGZvcmNlIHNpemVvZihoZWFkZXIpLiAgKi8KLSAgc3RydWN0Ci0gICAgewotICAgICAgdW5pb24gaGRyICpuZXh0OwkJLyogRm9yIGNoYWluaW5nIGhlYWRlcnMuICAqLwotICAgICAgY2hhciAqZGVlcDsJCS8qIEZvciBzdGFjayBkZXB0aCBtZWFzdXJlLiAgKi8KLSAgICB9IGg7Ci19IGhlYWRlcjsKLQotc3RhdGljIGhlYWRlciAqbGFzdF9hbGxvY2FfaGVhZGVyID0gTlVMTDsJLyogLT4gbGFzdCBhbGxvY2EgaGVhZGVyLiAgKi8KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byBhdCBsZWFzdCBTSVpFIGJ5dGVzIG9mIHN0b3JhZ2UsCi0gICB3aGljaCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVjbGFpbWVkIHVwb24gZXhpdCBmcm9tCi0gICB0aGUgcHJvY2VkdXJlIHRoYXQgY2FsbGVkIGFsbG9jYS4gIE9yaWdpbmFsbHksIHRoaXMgc3BhY2UKLSAgIHdhcyBzdXBwb3NlZCB0byBiZSB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lIG9mIHRoZQotICAgY2FsbGVyLCBidXQgdGhhdCBtZXRob2QgY2Fubm90IGJlIG1hZGUgdG8gd29yayBmb3Igc29tZQotICAgaW1wbGVtZW50YXRpb25zIG9mIEMsIGZvciBleGFtcGxlIHVuZGVyIEdvdWxkJ3MgVVRYLzMyLiAgKi8KLQotcG9pbnRlcgotYWxsb2NhIChzaXplKQotICAgICB1bnNpZ25lZCBzaXplOwotewotICBhdXRvIGNoYXIgcHJvYmU7CQkvKiBQcm9iZXMgc3RhY2sgZGVwdGg6ICovCi0gIHJlZ2lzdGVyIGNoYXIgKmRlcHRoID0gQUREUkVTU19GVU5DVElPTiAocHJvYmUpOwotCi0jaWYgU1RBQ0tfRElSRUNUSU9OID09IDAKLSAgaWYgKFNUQUNLX0RJUiA9PSAwKQkJLyogVW5rbm93biBncm93dGggZGlyZWN0aW9uLiAgKi8KLSAgICBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSNlbmRpZgotCi0gIC8qIFJlY2xhaW0gZ2FyYmFnZSwgZGVmaW5lZCBhcyBhbGwgYWxsb2NhJ2Qgc3RvcmFnZSB0aGF0Ci0gICAgIHdhcyBhbGxvY2F0ZWQgZnJvbSBkZWVwZXIgaW4gdGhlIHN0YWNrIHRoYW4gY3VycmVudGx5LiAgKi8KLQotICB7Ci0gICAgcmVnaXN0ZXIgaGVhZGVyICpocDsJLyogVHJhdmVyc2VzIGxpbmtlZCBsaXN0LiAgKi8KLQotI2lmZGVmIGVtYWNzCi0gICAgQkxPQ0tfSU5QVVQ7Ci0jZW5kaWYKLQotICAgIGZvciAoaHAgPSBsYXN0X2FsbG9jYV9oZWFkZXI7IGhwICE9IE5VTEw7KQotICAgICAgaWYgKChTVEFDS19ESVIgPiAwICYmIGhwLT5oLmRlZXAgPiBkZXB0aCkKLQkgIHx8IChTVEFDS19ESVIgPCAwICYmIGhwLT5oLmRlZXAgPCBkZXB0aCkpCi0JewotCSAgcmVnaXN0ZXIgaGVhZGVyICpucCA9IGhwLT5oLm5leHQ7Ci0KLQkgIGZyZWUgKChwb2ludGVyKSBocCk7CS8qIENvbGxlY3QgZ2FyYmFnZS4gICovCi0KLQkgIGhwID0gbnA7CQkvKiAtPiBuZXh0IGhlYWRlci4gICovCi0JfQotICAgICAgZWxzZQotCWJyZWFrOwkJCS8qIFJlc3QgYXJlIG5vdCBkZWVwZXIuICAqLwotCi0gICAgbGFzdF9hbGxvY2FfaGVhZGVyID0gaHA7CS8qIC0+IGxhc3QgdmFsaWQgc3RvcmFnZS4gICovCi0KLSNpZmRlZiBlbWFjcwotICAgIFVOQkxPQ0tfSU5QVVQ7Ci0jZW5kaWYKLSAgfQotCi0gIGlmIChzaXplID09IDApCi0gICAgcmV0dXJuIE5VTEw7CQkvKiBObyBhbGxvY2F0aW9uIHJlcXVpcmVkLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBjb21iaW5lZCBoZWFkZXIgKyB1c2VyIGRhdGEgc3RvcmFnZS4gICovCi0KLSAgewotICAgIHJlZ2lzdGVyIHBvaW50ZXIgbmV3ID0gbWFsbG9jIChzaXplb2YgKGhlYWRlcikgKyBzaXplKTsKLSAgICAvKiBBZGRyZXNzIG9mIGhlYWRlci4gICovCi0KLSAgICBpZiAobmV3ID09IDApCi0gICAgICBhYm9ydCgpOwotCi0gICAgKChoZWFkZXIgKikgbmV3KS0+aC5uZXh0ID0gbGFzdF9hbGxvY2FfaGVhZGVyOwotICAgICgoaGVhZGVyICopIG5ldyktPmguZGVlcCA9IGRlcHRoOwotCi0gICAgbGFzdF9hbGxvY2FfaGVhZGVyID0gKGhlYWRlciAqKSBuZXc7Ci0KLSAgICAvKiBVc2VyIHN0b3JhZ2UgYmVnaW5zIGp1c3QgYWZ0ZXIgaGVhZGVyLiAgKi8KLQotICAgIHJldHVybiAocG9pbnRlcikgKChjaGFyICopIG5ldyArIHNpemVvZiAoaGVhZGVyKSk7Ci0gIH0KLX0KLQotI2lmIGRlZmluZWQgKENSQVkpICYmIGRlZmluZWQgKENSQVlfU1RBQ0tTRUdfRU5EKQotCi0jaWZkZWYgREVCVUdfSTAwQUZVTkMKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLSNpZm5kZWYgQ1JBWV9TVEFDSwotI2RlZmluZSBDUkFZX1NUQUNLCi0jaWZuZGVmIENSQVkyCi0vKiBTdGFjayBzdHJ1Y3R1cmVzIGZvciBDUkFZLTEsIENSQVkgWC1NUCwgYW5kIENSQVkgWS1NUCAqLwotc3RydWN0IHN0YWNrX2NvbnRyb2xfaGVhZGVyCi0gIHsKLSAgICBsb25nIHNoZ3JvdzozMjsJCS8qIE51bWJlciBvZiB0aW1lcyBzdGFjayBoYXMgZ3Jvd24uICAqLwotICAgIGxvbmcgc2hhc2VnOjMyOwkJLyogU2l6ZSBvZiBpbmNyZW1lbnRzIHRvIHN0YWNrLiAgKi8KLSAgICBsb25nIHNoaHdtOjMyOwkJLyogSGlnaCB3YXRlciBtYXJrIG9mIHN0YWNrLiAgKi8KLSAgICBsb25nIHNoc2l6ZTozMjsJCS8qIEN1cnJlbnQgc2l6ZSBvZiBzdGFjayAoYWxsIHNlZ21lbnRzKS4gICovCi0gIH07Ci0KLS8qIFRoZSBzdGFjayBzZWdtZW50IGxpbmthZ2UgY29udHJvbCBpbmZvcm1hdGlvbiBvY2N1cnMgYXQKLSAgIHRoZSBoaWdoLWFkZHJlc3MgZW5kIG9mIGEgc3RhY2sgc2VnbWVudC4gIChUaGUgc3RhY2sKLSAgIGdyb3dzIGZyb20gbG93IGFkZHJlc3NlcyB0byBoaWdoIGFkZHJlc3Nlcy4pICBUaGUgaW5pdGlhbAotICAgcGFydCBvZiB0aGUgc3RhY2sgc2VnbWVudCBsaW5rYWdlIGNvbnRyb2wgaW5mb3JtYXRpb24gaXMKLSAgIDAyMDAgKG9jdGFsKSB3b3Jkcy4gIFRoaXMgcHJvdmlkZXMgZm9yIHJlZ2lzdGVyIHN0b3JhZ2UKLSAgIGZvciB0aGUgcm91dGluZSB3aGljaCBvdmVyZmxvd3MgdGhlIHN0YWNrLiAgKi8KLQotc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZQotICB7Ci0gICAgbG9uZyBzc1swMjAwXTsJCS8qIDAyMDAgb3ZlcmZsb3cgd29yZHMuICAqLwotICAgIGxvbmcgc3NzaXplOjMyOwkJLyogTnVtYmVyIG9mIHdvcmRzIGluIHRoaXMgc2VnbWVudC4gICovCi0gICAgbG9uZyBzc2Jhc2U6MzI7CQkvKiBPZmZzZXQgdG8gc3RhY2sgYmFzZS4gICovCi0gICAgbG9uZzozMjsKLSAgICBsb25nIHNzcHNlZzozMjsJCS8qIE9mZnNldCB0byBsaW5rYWdlIGNvbnRyb2wgb2YgcHJldmlvdXMKLQkJCQkgICBzZWdtZW50IG9mIHN0YWNrLiAgKi8KLSAgICBsb25nOjMyOwotICAgIGxvbmcgc3N0Y3B0OjMyOwkJLyogUG9pbnRlciB0byB0YXNrIGNvbW1vbiBhZGRyZXNzIGJsb2NrLiAgKi8KLSAgICBsb25nIHNzY3NubTsJCS8qIFByaXZhdGUgY29udHJvbCBzdHJ1Y3R1cmUgbnVtYmVyIGZvcgotCQkJCSAgIG1pY3JvdGFza2luZy4gICovCi0gICAgbG9uZyBzc3VzcjE7CQkvKiBSZXNlcnZlZCBmb3IgdXNlci4gICovCi0gICAgbG9uZyBzc3VzcjI7CQkvKiBSZXNlcnZlZCBmb3IgdXNlci4gICovCi0gICAgbG9uZyBzc3RwaWQ7CQkvKiBQcm9jZXNzIElEIGZvciBwaWQgYmFzZWQgbXVsdGktdGFza2luZy4gICovCi0gICAgbG9uZyBzc2d2dXA7CQkvKiBQb2ludGVyIHRvIG11bHRpdGFza2luZyB0aHJlYWQgZ2l2ZXVwLiAgKi8KLSAgICBsb25nIHNzY3JheVs3XTsJCS8qIFJlc2VydmVkIGZvciBDcmF5IFJlc2VhcmNoLiAgKi8KLSAgICBsb25nIHNzYTA7Ci0gICAgbG9uZyBzc2ExOwotICAgIGxvbmcgc3NhMjsKLSAgICBsb25nIHNzYTM7Ci0gICAgbG9uZyBzc2E0OwotICAgIGxvbmcgc3NhNTsKLSAgICBsb25nIHNzYTY7Ci0gICAgbG9uZyBzc2E3OwotICAgIGxvbmcgc3NzMDsKLSAgICBsb25nIHNzczE7Ci0gICAgbG9uZyBzc3MyOwotICAgIGxvbmcgc3NzMzsKLSAgICBsb25nIHNzczQ7Ci0gICAgbG9uZyBzc3M1OwotICAgIGxvbmcgc3NzNjsKLSAgICBsb25nIHNzczc7Ci0gIH07Ci0KLSNlbHNlIC8qIENSQVkyICovCi0vKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB2ZWN0b3Igb2Ygd29yZHMKLSAgIHJldHVybmVkIGJ5IHRoZSBTVEtTVEFUIGxpYnJhcnkgcm91dGluZS4gICovCi1zdHJ1Y3Qgc3RrX3N0YXQKLSAgewotICAgIGxvbmcgbm93OwkJCS8qIEN1cnJlbnQgdG90YWwgc3RhY2sgc2l6ZS4gICovCi0gICAgbG9uZyBtYXhjOwkJCS8qIEFtb3VudCBvZiBjb250aWd1b3VzIHNwYWNlIHdoaWNoIHdvdWxkCi0JCQkJICAgYmUgcmVxdWlyZWQgdG8gc2F0aXNmeSB0aGUgbWF4aW11bQotCQkJCSAgIHN0YWNrIGRlbWFuZCB0byBkYXRlLiAgKi8KLSAgICBsb25nIGhpZ2hfd2F0ZXI7CQkvKiBTdGFjayBoaWdoLXdhdGVyIG1hcmsuICAqLwotICAgIGxvbmcgb3ZlcmZsb3dzOwkJLyogTnVtYmVyIG9mIHN0YWNrIG92ZXJmbG93ICgkU1RLT0ZFTikgY2FsbHMuICAqLwotICAgIGxvbmcgaGl0czsJCQkvKiBOdW1iZXIgb2YgaW50ZXJuYWwgYnVmZmVyIGhpdHMuICAqLwotICAgIGxvbmcgZXh0ZW5kczsJCS8qIE51bWJlciBvZiBibG9jayBleHRlbnNpb25zLiAgKi8KLSAgICBsb25nIHN0a29fbWFsbG9jczsJCS8qIEJsb2NrIGFsbG9jYXRpb25zIGJ5ICRTVEtPRkVOLiAgKi8KLSAgICBsb25nIHVuZGVyZmxvd3M7CQkvKiBOdW1iZXIgb2Ygc3RhY2sgdW5kZXJmbG93IGNhbGxzICgkU1RLUkVUTikuICAqLwotICAgIGxvbmcgc3Rrb19mcmVlOwkJLyogTnVtYmVyIG9mIGRlYWxsb2NhdGlvbnMgYnkgJFNUS1JFVE4uICAqLwotICAgIGxvbmcgc3RrbV9mcmVlOwkJLyogTnVtYmVyIG9mIGRlYWxsb2NhdGlvbnMgYnkgJFNUS01SRVQuICAqLwotICAgIGxvbmcgc2VnbWVudHM7CQkvKiBDdXJyZW50IG51bWJlciBvZiBzdGFjayBzZWdtZW50cy4gICovCi0gICAgbG9uZyBtYXhzOwkJCS8qIE1heGltdW0gbnVtYmVyIG9mIHN0YWNrIHNlZ21lbnRzIHNvIGZhci4gICovCi0gICAgbG9uZyBwYWRfc2l6ZTsJCS8qIFN0YWNrIHBhZCBzaXplLiAgKi8KLSAgICBsb25nIGN1cnJlbnRfYWRkcmVzczsJLyogQ3VycmVudCBzdGFjayBzZWdtZW50IGFkZHJlc3MuICAqLwotICAgIGxvbmcgY3VycmVudF9zaXplOwkJLyogQ3VycmVudCBzdGFjayBzZWdtZW50IHNpemUuICBUaGlzCi0JCQkJICAgbnVtYmVyIGlzIGFjdHVhbGx5IGNvcnJ1cHRlZCBieSBTVEtTVEFUIHRvCi0JCQkJICAgaW5jbHVkZSB0aGUgZmlmdGVlbiB3b3JkIHRyYWlsZXIgYXJlYS4gICovCi0gICAgbG9uZyBpbml0aWFsX2FkZHJlc3M7CS8qIEFkZHJlc3Mgb2YgaW5pdGlhbCBzZWdtZW50LiAgKi8KLSAgICBsb25nIGluaXRpYWxfc2l6ZTsJCS8qIFNpemUgb2YgaW5pdGlhbCBzZWdtZW50LiAgKi8KLSAgfTsKLQotLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBkYXRhIHN0cnVjdHVyZSB3aGljaCB0cmFpbHMKLSAgIGFueSBzdGFjayBzZWdtZW50LiAgSSB0aGluayB0aGF0IHRoZSBkZXNjcmlwdGlvbiBpbiAnYXNkZWYnIGlzCi0gICBvdXQgb2YgZGF0ZS4gIEkgb25seSBkZXNjcmliZSB0aGUgcGFydHMgdGhhdCBJIGFtIHN1cmUgYWJvdXQuICAqLwotCi1zdHJ1Y3Qgc3RrX3RyYWlsZXIKLSAgewotICAgIGxvbmcgdGhpc19hZGRyZXNzOwkJLyogQWRkcmVzcyBvZiB0aGlzIGJsb2NrLiAgKi8KLSAgICBsb25nIHRoaXNfc2l6ZTsJCS8qIFNpemUgb2YgdGhpcyBibG9jayAoZG9lcyBub3QgaW5jbHVkZQotCQkJCSAgIHRoaXMgdHJhaWxlcikuICAqLwotICAgIGxvbmcgdW5rbm93bjI7Ci0gICAgbG9uZyB1bmtub3duMzsKLSAgICBsb25nIGxpbms7CQkJLyogQWRkcmVzcyBvZiB0cmFpbGVyIGJsb2NrIG9mIHByZXZpb3VzCi0JCQkJICAgc2VnbWVudC4gICovCi0gICAgbG9uZyB1bmtub3duNTsKLSAgICBsb25nIHVua25vd242OwotICAgIGxvbmcgdW5rbm93bjc7Ci0gICAgbG9uZyB1bmtub3duODsKLSAgICBsb25nIHVua25vd245OwotICAgIGxvbmcgdW5rbm93bjEwOwotICAgIGxvbmcgdW5rbm93bjExOwotICAgIGxvbmcgdW5rbm93bjEyOwotICAgIGxvbmcgdW5rbm93bjEzOwotICAgIGxvbmcgdW5rbm93bjE0OwotICB9OwotCi0jZW5kaWYgLyogQ1JBWTIgKi8KLSNlbmRpZiAvKiBub3QgQ1JBWV9TVEFDSyAqLwotCi0jaWZkZWYgQ1JBWTIKLS8qIERldGVybWluZSBhICJzdGFjayBtZWFzdXJlIiBmb3IgYW4gYXJiaXRyYXJ5IEFERFJFU1MuCi0gICBJIGRvdWJ0IHRoYXQgImxpbnQiIHdpbGwgbGlrZSB0aGlzIG11Y2guICAqLwotCi1zdGF0aWMgbG9uZwotaTAwYWZ1bmMgKGxvbmcgKmFkZHJlc3MpCi17Ci0gIHN0cnVjdCBzdGtfc3RhdCBzdGF0dXM7Ci0gIHN0cnVjdCBzdGtfdHJhaWxlciAqdHJhaWxlcjsKLSAgbG9uZyAqYmxvY2ssIHNpemU7Ci0gIGxvbmcgcmVzdWx0ID0gMDsKLQotICAvKiBXZSB3YW50IHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHNlZ21lbnRzLiAgVGhlIGZpcnN0Ci0gICAgIHN0ZXAgaXMgdG8gZ2V0IHRoZSBzdGFjayBzdGF0dXMgc3RydWN0dXJlLiAgV2UgY291bGQgZG8gdGhpcwotICAgICBtb3JlIHF1aWNrbHkgYW5kIG1vcmUgZGlyZWN0bHksIHBlcmhhcHMsIGJ5IHJlZmVyZW5jaW5nIHRoZQotICAgICAkTE0wMCBjb21tb24gYmxvY2ssIGJ1dCBJIGtub3cgdGhhdCB0aGlzIHdvcmtzLiAgKi8KLQotICBTVEtTVEFUICgmc3RhdHVzKTsKLQotICAvKiBTZXQgdXAgdGhlIGl0ZXJhdGlvbi4gICovCi0KLSAgdHJhaWxlciA9IChzdHJ1Y3Qgc3RrX3RyYWlsZXIgKikgKHN0YXR1cy5jdXJyZW50X2FkZHJlc3MKLQkJCQkgICAgKyBzdGF0dXMuY3VycmVudF9zaXplCi0JCQkJICAgIC0gMTUpOwotCi0gIC8qIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHN0YWNrIHNlZ21lbnQuICBUaGVyZWZvcmUgaXQgaXMKLSAgICAgYSBmYXRhbCBlcnJvciBpZiAidHJhaWxlciIgaXMgbnVsbC4gICovCi0KLSAgaWYgKHRyYWlsZXIgPT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICAvKiBEaXNjYXJkIHNlZ21lbnRzIHRoYXQgZG8gbm90IGNvbnRhaW4gb3VyIGFyZ3VtZW50IGFkZHJlc3MuICAqLwotCi0gIHdoaWxlICh0cmFpbGVyICE9IDApCi0gICAgewotICAgICAgYmxvY2sgPSAobG9uZyAqKSB0cmFpbGVyLT50aGlzX2FkZHJlc3M7Ci0gICAgICBzaXplID0gdHJhaWxlci0+dGhpc19zaXplOwotICAgICAgaWYgKGJsb2NrID09IDAgfHwgc2l6ZSA9PSAwKQotCWFib3J0ICgpOwotICAgICAgdHJhaWxlciA9IChzdHJ1Y3Qgc3RrX3RyYWlsZXIgKikgdHJhaWxlci0+bGluazsKLSAgICAgIGlmICgoYmxvY2sgPD0gYWRkcmVzcykgJiYgKGFkZHJlc3MgPCAoYmxvY2sgKyBzaXplKSkpCi0JYnJlYWs7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgcmVzdWx0IHRvIHRoZSBvZmZzZXQgaW4gdGhpcyBzZWdtZW50IGFuZCBhZGQgdGhlIHNpemVzCi0gICAgIG9mIGFsbCBwcmVkZWNlc3NvciBzZWdtZW50cy4gICovCi0KLSAgcmVzdWx0ID0gYWRkcmVzcyAtIGJsb2NrOwotCi0gIGlmICh0cmFpbGVyID09IDApCi0gICAgewotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAodHJhaWxlci0+dGhpc19zaXplIDw9IDApCi0JYWJvcnQgKCk7Ci0gICAgICByZXN1bHQgKz0gdHJhaWxlci0+dGhpc19zaXplOwotICAgICAgdHJhaWxlciA9IChzdHJ1Y3Qgc3RrX3RyYWlsZXIgKikgdHJhaWxlci0+bGluazsKLSAgICB9Ci0gIHdoaWxlICh0cmFpbGVyICE9IDApOwotCi0gIC8qIFdlIGFyZSBkb25lLiAgTm90ZSB0aGF0IGlmIHlvdSBwcmVzZW50IGEgYm9ndXMgYWRkcmVzcyAob25lCi0gICAgIG5vdCBpbiBhbnkgc2VnbWVudCksIHlvdSB3aWxsIGdldCBhIGRpZmZlcmVudCBudW1iZXIgYmFjaywgZm9ybWVkCi0gICAgIGZyb20gc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJsb2NrLiAgVGhpcyBpcyBwcm9iYWJseQotICAgICBub3Qgd2hhdCB5b3Ugd2FudC4gICovCi0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQotCi0jZWxzZSAvKiBub3QgQ1JBWTIgKi8KLS8qIFN0YWNrIGFkZHJlc3MgZnVuY3Rpb24gZm9yIGEgQ1JBWS0xLCBDUkFZIFgtTVAsIG9yIENSQVkgWS1NUC4KLSAgIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHRoZSBjZWxsIHdpdGhpbiB0aGUgc3RhY2ssCi0gICBnaXZlbiB0aGUgYWRkcmVzcyBvZiB0aGUgY2VsbC4gIFRoZSBwdXJwb3NlIG9mIHRoaXMKLSAgIHJvdXRpbmUgaXMgdG8gbGluZWFyaXplLCBpbiBzb21lIHNlbnNlLCBzdGFjayBhZGRyZXNzZXMKLSAgIGZvciBhbGxvY2EuICAqLwotCi1zdGF0aWMgbG9uZwotaTAwYWZ1bmMgKGxvbmcgYWRkcmVzcykKLXsKLSAgbG9uZyBzdGtsID0gMDsKLQotICBsb25nIHNpemUsIHBzZWcsIHRoaXNfc2VnbWVudCwgc3RhY2s7Ci0gIGxvbmcgcmVzdWx0ID0gMDsKLQotICBzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICpzc3B0cjsKLQotICAvKiBSZWdpc3RlciBCNjcgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUKLSAgICAgY3VycmVudCBzdGFjayBzZWdtZW50LiAgSWYgeW91IChhcyBhIHN1YnByb2dyYW0pIHN0b3JlCi0gICAgIHlvdXIgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjayBhbmQgZmluZCB0aGF0IHlvdSBhcmUgcGFzdAotICAgICB0aGUgY29udGVudHMgb2YgQjY3LCB5b3UgaGF2ZSBvdmVyZmxvd2VkIHRoZSBzZWdtZW50LgotCi0gICAgIEI2NyBhbHNvIHBvaW50cyB0byB0aGUgc3RhY2sgc2VnbWVudCBsaW5rYWdlIGNvbnRyb2wKLSAgICAgYXJlYSwgd2hpY2ggaXMgd2hhdCB3ZSBhcmUgcmVhbGx5IGludGVyZXN0ZWQgaW4uICAqLwotCi0gIHN0a2wgPSBDUkFZX1NUQUNLU0VHX0VORCAoKTsKLSAgc3NwdHIgPSAoc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqKSBzdGtsOwotCi0gIC8qIElmIG9uZSBzdWJ0cmFjdHMgJ3NpemUnIGZyb20gdGhlIGVuZCBvZiB0aGUgc2VnbWVudCwKLSAgICAgb25lIGhhcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgc2VnbWVudC4KLQotICAgICBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3Qgc2VnbWVudCwgJ3BzZWcnIHdpbGwgYmUKLSAgICAgbm9uemVyby4gICovCi0KLSAgcHNlZyA9IHNzcHRyLT5zc3BzZWc7Ci0gIHNpemUgPSBzc3B0ci0+c3NzaXplOwotCi0gIHRoaXNfc2VnbWVudCA9IHN0a2wgLSBzaXplOwotCi0gIC8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgY2FsbGluZyB0aGlzIHJvdXRpbmUgaXRzZWxmIGNhdXNlZAotICAgICBhIHN0YWNrIG92ZXJmbG93LiAgRGlzY2FyZCBzdGFjayBzZWdtZW50cyB3aGljaCBkbyBub3QKLSAgICAgY29udGFpbiB0aGUgdGFyZ2V0IGFkZHJlc3MuICAqLwotCi0gIHdoaWxlICghKHRoaXNfc2VnbWVudCA8PSBhZGRyZXNzICYmIGFkZHJlc3MgPD0gc3RrbCkpCi0gICAgewotI2lmZGVmIERFQlVHX0kwMEFGVU5DCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlMDExbyAlMDExbyAlMDExb1xuIiwgdGhpc19zZWdtZW50LCBhZGRyZXNzLCBzdGtsKTsKLSNlbmRpZgotICAgICAgaWYgKHBzZWcgPT0gMCkKLQlicmVhazsKLSAgICAgIHN0a2wgPSBzdGtsIC0gcHNlZzsKLSAgICAgIHNzcHRyID0gKHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKikgc3RrbDsKLSAgICAgIHNpemUgPSBzc3B0ci0+c3NzaXplOwotICAgICAgcHNlZyA9IHNzcHRyLT5zc3BzZWc7Ci0gICAgICB0aGlzX3NlZ21lbnQgPSBzdGtsIC0gc2l6ZTsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gYWRkcmVzcyAtIHRoaXNfc2VnbWVudDsKLQotICAvKiBJZiB5b3Ugc3VidHJhY3QgcHNlZyBmcm9tIHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgc3RhY2ssCi0gICAgIHlvdSBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHByZXZpb3VzIHN0YWNrIHNlZ21lbnQncyBlbmQuCi0gICAgIFRoaXMgc2VlbXMgYSBsaXR0bGUgY29udm9sdXRlZCB0byBtZSwgYnV0IEknbGwgYmV0IHlvdSBzYXZlCi0gICAgIGEgY3ljbGUgc29tZXdoZXJlLiAgKi8KLQotICB3aGlsZSAocHNlZyAhPSAwKQotICAgIHsKLSNpZmRlZiBERUJVR19JMDBBRlVOQwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJTAxMW8gJTAxMW9cbiIsIHBzZWcsIHNpemUpOwotI2VuZGlmCi0gICAgICBzdGtsID0gc3RrbCAtIHBzZWc7Ci0gICAgICBzc3B0ciA9IChzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICopIHN0a2w7Ci0gICAgICBzaXplID0gc3NwdHItPnNzc2l6ZTsKLSAgICAgIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOwotICAgICAgcmVzdWx0ICs9IHNpemU7Ci0gICAgfQotICByZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLSNlbmRpZiAvKiBub3QgQ1JBWTIgKi8KLSNlbmRpZiAvKiBDUkFZICovCi0KLSNlbmRpZiAvKiBubyBhbGxvY2EgKi8KLSNlbmRpZiAvKiBub3QgR0NDIHZlcnNpb24gMiAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FyZ3YuYyBiL2xpYmliZXJ0eS9hcmd2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzE3ZTkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FyZ3YuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MCArMCwwIEBACi0vKiBDcmVhdGUgYW5kIGRlc3Ryb3kgYXJndW1lbnQgdmVjdG9ycyAoYXJndidzKQotICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiAgQ3JlYXRlIGFuZCBkZXN0cm95IGFyZ3VtZW50IHZlY3RvcnMuICBBbiBhcmd1bWVudCB2ZWN0b3IgaXMgc2ltcGx5IGFuCi0gICAgYXJyYXkgb2Ygc3RyaW5nIHBvaW50ZXJzLCB0ZXJtaW5hdGVkIGJ5IGEgTlVMTCBwb2ludGVyLiAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmZGVmIGlzc3BhY2UKLSN1bmRlZiBpc3NwYWNlCi0jZW5kaWYKLSNkZWZpbmUgaXNzcGFjZShjaCkgKChjaCkgPT0gJyAnIHx8IChjaCkgPT0gJ1x0JykKLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiB2b2lkICptZW1jcHkgKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOwkvKiA0LjExLjIuMSAqLwotZXh0ZXJuIHNpemVfdCBzdHJsZW4gKGNvbnN0IGNoYXIgKnMpOwkJCQkvKiA0LjExLjYuMyAqLwotZXh0ZXJuIHZvaWQgKm1hbGxvYyAoc2l6ZV90IHNpemUpOwkJCQkvKiA0LjEwLjMuMyAqLwotZXh0ZXJuIHZvaWQgKnJlYWxsb2MgKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwkJCS8qIDQuMTAuMy40ICovCi1leHRlcm4gdm9pZCBmcmVlICh2b2lkICpwdHIpOwkJCQkJLyogNC4xMC4zLjIgKi8KLWV4dGVybiBjaGFyICpzdHJkdXAgKGNvbnN0IGNoYXIgKnMpOwkJCQkvKiBOb24tQU5TSSAqLwotCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLQotI2lmICFkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fR05VQ19fCi1leHRlcm4gY2hhciAqbWVtY3B5ICgpOwkJLyogQ29weSBtZW1vcnkgcmVnaW9uICovCi1leHRlcm4gaW50IHN0cmxlbiAoKTsJCS8qIENvdW50IGxlbmd0aCBvZiBzdHJpbmcgKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqcmVhbGxvYyAoKTsJLyogU3RhbmRhcmQgbWVtb3J5IHJlYWxsb2NhdG9yICovCi1leHRlcm4gdm9pZCBmcmVlICgpOwkJLyogRnJlZSBtYWxsb2MnZCBtZW1vcnkgKi8KLWV4dGVybiBjaGFyICpzdHJkdXAgKCk7CQkvKiBEdXBsaWNhdGUgYSBzdHJpbmcgKi8KLSNlbmRpZgotCi0jZW5kaWYJLyogX19TVERDX18gKi8KLQotI2luY2x1ZGUgImFsbG9jYS1jb25mLmgiCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0jaWZuZGVmIEVPUwotI2RlZmluZSBFT1MgJ1wwJwotI2VuZGlmCi0KLSNkZWZpbmUgSU5JVElBTF9NQVhBUkdDIDgJLyogTnVtYmVyIG9mIGFyZ3MgKyBOVUxMIGluIGluaXRpYWwgYXJndiAqLwotCi0KLS8qCi0KLU5BTUUKLQotCWR1cGFyZ3YgLS0gZHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3RvcgotCi1TWU5PUFNJUwotCi0JY2hhciAqKmR1cGFyZ3YgKHZlY3RvcikKLQljaGFyICoqdmVjdG9yOwotCi1ERVNDUklQVElPTgotCi0JRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gIFNpbXBseSBzY2FucyB0aHJvdWdoIHRoZQotCXZlY3RvciwgZHVwbGljYXRpbmcgZWFjaCBhcmd1bWVudCB1bnRpbCB0aGUKLQl0ZXJtaW5hdGluZyBOVUxMIGlzIGZvdW5kLgotCi1SRVRVUk5TCi0KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgdmVjdG9yIGlmCi0Jc3VjY2Vzc2Z1bC4gUmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBtZW1vcnkgdG8KLQljb21wbGV0ZSBidWlsZGluZyB0aGUgYXJndW1lbnQgdmVjdG9yLgotCi0qLwotCi1jaGFyICoqCi1kdXBhcmd2IChhcmd2KQotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGFyZ2M7Ci0gIGNoYXIgKipjb3B5OwotICAKLSAgaWYgKGFyZ3YgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIHRoZSB2ZWN0b3IgKi8KLSAgZm9yIChhcmdjID0gMDsgYXJndlthcmdjXSAhPSBOVUxMOyBhcmdjKyspOwotICBjb3B5ID0gKGNoYXIgKiopIG1hbGxvYyAoKGFyZ2MgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0gIGlmIChjb3B5ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAvKiB0aGUgc3RyaW5ncyAqLwotICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKykKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChhcmd2W2FyZ2NdKTsKLSAgICAgIGNvcHlbYXJnY10gPSBtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIChsZW4gKyAxKSk7Ci0gICAgICBpZiAoY29weVthcmdjXSA9PSBOVUxMKQotCXsKLQkgIGZyZWVhcmd2IChjb3B5KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHN0cmNweSAoY29weVthcmdjXSwgYXJndlthcmdjXSk7Ci0gICAgfQotICBjb3B5W2FyZ2NdID0gTlVMTDsKLSAgcmV0dXJuIGNvcHk7Ci19Ci0KLS8qCi0KLU5BTUUKLQotCWZyZWVhcmd2IC0tIGZyZWUgYW4gYXJndW1lbnQgdmVjdG9yCi0KLVNZTk9QU0lTCi0KLQl2b2lkIGZyZWVhcmd2ICh2ZWN0b3IpCi0JY2hhciAqKnZlY3RvcjsKLQotREVTQ1JJUFRJT04KLQotCUZyZWUgYW4gYXJndW1lbnQgdmVjdG9yIHRoYXQgd2FzIGJ1aWx0IHVzaW5nIGJ1aWxkYXJndi4gIFNpbXBseSBzY2FucwotCXRocm91Z2ggdGhlIHZlY3RvciwgZnJlZWluZyB0aGUgbWVtb3J5IGZvciBlYWNoIGFyZ3VtZW50IHVudGlsIHRoZQotCXRlcm1pbmF0aW5nIE5VTEwgaXMgZm91bmQsIGFuZCB0aGVuIGZyZWVzIHRoZSB2ZWN0b3IgaXRzZWxmLgotCi1SRVRVUk5TCi0KLQlObyB2YWx1ZS4KLQotKi8KLQotdm9pZCBmcmVlYXJndiAodmVjdG9yKQotY2hhciAqKnZlY3RvcjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqKnNjYW47Ci0KLSAgaWYgKHZlY3RvciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoc2NhbiA9IHZlY3RvcjsgKnNjYW4gIT0gTlVMTDsgc2NhbisrKQotCXsKLQkgIGZyZWUgKCpzY2FuKTsKLQl9Ci0gICAgICBmcmVlICh2ZWN0b3IpOwotICAgIH0KLX0KLQotLyoKLQotTkFNRQotCi0JYnVpbGRhcmd2IC0tIGJ1aWxkIGFuIGFyZ3VtZW50IHZlY3RvciBmcm9tIGEgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljaGFyICoqYnVpbGRhcmd2IChzcCkKLQljaGFyICpzcDsKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIGEgcG9pbnRlciB0byBhIHN0cmluZywgcGFyc2UgdGhlIHN0cmluZyBleHRyYWN0aW5nIGZpZWxkcwotCXNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIGFuZCBvcHRpb25hbGx5IGVuY2xvc2VkIHdpdGhpbiBlaXRoZXIgc2luZ2xlCi0Jb3IgZG91YmxlIHF1b3RlcyAod2hpY2ggYXJlIHN0cmlwcGVkIG9mZiksIGFuZCBidWlsZCBhIHZlY3RvciBvZgotCXBvaW50ZXJzIHRvIGNvcGllcyBvZiB0aGUgc3RyaW5nIGZvciBlYWNoIGZpZWxkLiAgVGhlIGlucHV0IHN0cmluZwotCXJlbWFpbnMgdW5jaGFuZ2VkLgotCi0JQWxsIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSBwb2ludGVyIGFycmF5IGFuZCBjb3BpZXMgb2YgdGhlIHN0cmluZwotCWlzIG9idGFpbmVkIGZyb20gbWFsbG9jLiAgQWxsIG9mIHRoZSBtZW1vcnkgY2FuIGJlIHJldHVybmVkIHRvIHRoZQotCXN5c3RlbSB3aXRoIHRoZSBzaW5nbGUgZnVuY3Rpb24gY2FsbCBmcmVlYXJndiwgd2hpY2ggdGFrZXMgdGhlCi0JcmV0dXJuZWQgcmVzdWx0IG9mIGJ1aWxkYXJndiwgYXMgaXQncyBhcmd1bWVudC4KLQotCVRoZSBtZW1vcnkgZm9yIHRoZSBhcmd2IGFycmF5IGlzIGR5bmFtaWNhbGx5IGV4cGFuZGVkIGFzIG5lY2Vzc2FyeS4KLQotUkVUVVJOUwotCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IHZlY3RvciBpZiBzdWNjZXNzZnVsLiBSZXR1cm5zIE5VTEwKLQlpZiB0aGUgaW5wdXQgc3RyaW5nIHBvaW50ZXIgaXMgTlVMTCBvciBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQKLQltZW1vcnkgdG8gY29tcGxldGUgYnVpbGRpbmcgdGhlIGFyZ3VtZW50IHZlY3Rvci4KLQotTk9URVMKLQotCUluIG9yZGVyIHRvIHByb3ZpZGUgYSB3b3JraW5nIGJ1ZmZlciBmb3IgZXh0cmFjdGluZyBhcmd1bWVudHMgaW50bywKLQl3aXRoIGFwcHJvcHJpYXRlIHN0cmlwcGluZyBvZiBxdW90ZXMgYW5kIHRyYW5zbGF0aW9uIG9mIGJhY2tzbGFzaAotCXNlcXVlbmNlcywgd2UgYWxsb2NhdGUgYSB3b3JraW5nIGJ1ZmZlciBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBpbnB1dAotCXN0cmluZy4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBzcGFjZSBpbiB3aGljaCB0bwotCXdvcmssIHNpbmNlIHRoZSBleHRyYWN0ZWQgYXJnIGlzIG5ldmVyIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBzdHJpbmcuCi0KLQlJZiB0aGUgaW5wdXQgaXMgYSBudWxsIHN0cmluZyAoYXMgb3Bwb3NlZCB0byBhIE5VTEwgcG9pbnRlciksIHRoZW4KLQlidWlsZGFyZyByZXR1cm5zIGFuIGFyZ3YgdGhhdCBoYXMgb25lIGFyZywgYSBudWxsIHN0cmluZy4KLQotCUFyZ3YgaXMgYWx3YXlzIGtlcHQgdGVybWluYXRlZCB3aXRoIGEgTlVMTCBhcmcgcG9pbnRlciwgc28gaXQgY2FuCi0JYmUgcGFzc2VkIHRvIGZyZWVhcmd2IGF0IGFueSB0aW1lLCBvciByZXR1cm5lZCwgYXMgYXBwcm9wcmlhdGUuCi0qLwotCi1jaGFyICoqYnVpbGRhcmd2IChpbnB1dCkKLWNoYXIgKmlucHV0OwotewotICBjaGFyICphcmc7Ci0gIGNoYXIgKmNvcHlidWY7Ci0gIGludCBzcXVvdGUgPSAwOwotICBpbnQgZHF1b3RlID0gMDsKLSAgaW50IGJzcXVvdGUgPSAwOwotICBpbnQgYXJnYyA9IDA7Ci0gIGludCBtYXhhcmdjID0gMDsKLSAgY2hhciAqKmFyZ3YgPSBOVUxMOwotICBjaGFyICoqbmFyZ3Y7Ci0KLSAgaWYgKGlucHV0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29weWJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChpbnB1dCkgKyAxKTsKLSAgICAgIC8qIElzIGEgZG97fXdoaWxlIHRvIGFsd2F5cyBleGVjdXRlIHRoZSBsb29wIG9uY2UuICBBbHdheXMgcmV0dXJuIGFuCi0JIGFyZ3YsIGV2ZW4gZm9yIG51bGwgc3RyaW5ncy4gIFNlZSBOT1RFUyBhYm92ZSwgdGVzdCBjYXNlIGJlbG93LiAqLwotICAgICAgZG8KLQl7Ci0JICAvKiBQaWNrIG9mZiBhcmd2W2FyZ2NdICovCi0JICB3aGlsZSAoaXNzcGFjZSAoKmlucHV0KSkKLQkgICAgewotCSAgICAgIGlucHV0Kys7Ci0JICAgIH0KLQkgIGlmICgobWF4YXJnYyA9PSAwKSB8fCAoYXJnYyA+PSAobWF4YXJnYyAtIDEpKSkKLQkgICAgewotCSAgICAgIC8qIGFyZ3YgbmVlZHMgaW5pdGlhbGl6YXRpb24sIG9yIGV4cGFuc2lvbiAqLwotCSAgICAgIGlmIChhcmd2ID09IE5VTEwpCi0JCXsKLQkJICBtYXhhcmdjID0gSU5JVElBTF9NQVhBUkdDOwotCQkgIG5hcmd2ID0gKGNoYXIgKiopIG1hbGxvYyAobWF4YXJnYyAqIHNpemVvZiAoY2hhciAqKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBtYXhhcmdjICo9IDI7Ci0JCSAgbmFyZ3YgPSAoY2hhciAqKikgcmVhbGxvYyAoYXJndiwgbWF4YXJnYyAqIHNpemVvZiAoY2hhciAqKSk7Ci0JCX0KLQkgICAgICBpZiAobmFyZ3YgPT0gTlVMTCkKLQkJewotCQkgIGlmIChhcmd2ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLQkJICAgICAgYXJndiA9IE5VTEw7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBhcmd2ID0gbmFyZ3Y7Ci0JICAgICAgYXJndlthcmdjXSA9IE5VTEw7Ci0JICAgIH0KLQkgIC8qIEJlZ2luIHNjYW5uaW5nIGFyZyAqLwotCSAgYXJnID0gY29weWJ1ZjsKLQkgIHdoaWxlICgqaW5wdXQgIT0gRU9TKQotCSAgICB7Ci0JICAgICAgaWYgKGlzc3BhY2UgKCppbnB1dCkgJiYgIXNxdW90ZSAmJiAhZHF1b3RlICYmICFic3F1b3RlKQotCQl7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoYnNxdW90ZSkKLQkJICAgIHsKLQkJICAgICAgYnNxdW90ZSA9IDA7Ci0JCSAgICAgICphcmcrKyA9ICppbnB1dDsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqaW5wdXQgPT0gJ1xcJykKLQkJICAgIHsKLQkJICAgICAgYnNxdW90ZSA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3F1b3RlKQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICdcJycpCi0JCQl7Ci0JCQkgIHNxdW90ZSA9IDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKGRxdW90ZSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCppbnB1dCA9PSAnIicpCi0JCQl7Ci0JCQkgIGRxdW90ZSA9IDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCppbnB1dCA9PSAnXCcnKQotCQkJewotCQkJICBzcXVvdGUgPSAxOwotCQkJfQotCQkgICAgICBlbHNlIGlmICgqaW5wdXQgPT0gJyInKQotCQkJewotCQkJICBkcXVvdGUgPSAxOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgICphcmcrKyA9ICppbnB1dDsKLQkJCX0KLQkJICAgIH0KLQkJICBpbnB1dCsrOwotCQl9Ci0JICAgIH0KLQkgICphcmcgPSBFT1M7Ci0JICBhcmd2W2FyZ2NdID0gc3RyZHVwIChjb3B5YnVmKTsKLQkgIGlmIChhcmd2W2FyZ2NdID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlYXJndiAoYXJndik7Ci0JICAgICAgYXJndiA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGFyZ2MrKzsKLQkgIGFyZ3ZbYXJnY10gPSBOVUxMOwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKmlucHV0KSkKLQkgICAgewotCSAgICAgIGlucHV0Kys7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0ICE9IEVPUyk7Ci0gICAgfQotICByZXR1cm4gKGFyZ3YpOwotfQotCi0jaWZkZWYgTUFJTgotCi0vKiBTaW1wbGUgbGl0dGxlIHRlc3QgZHJpdmVyLiAqLwotCi1zdGF0aWMgY2hhciAqdGVzdHNbXSA9Ci17Ci0gICJhIHNpbXBsZSBjb21tYW5kIGxpbmUiLAotICAiYXJnICdmb28nIGlzIHNpbmdsZSBxdW90ZWQiLAotICAiYXJnIFwiYmFyXCIgaXMgZG91YmxlIHF1b3RlZCIsCi0gICJhcmcgXCJmb28gYmFyXCIgaGFzIGVtYmVkZGVkIHdoaXRlc3BhY2UiLAotICAiYXJnICdKYWNrIHNhaWQgXFwnaGlcXCcnIGhhcyBzaW5nbGUgcXVvdGVzIiwKLSAgImFyZyAnSmFjayBzYWlkIFxcXCJoaVxcXCInIGhhcyBkb3VibGUgcXVvdGVzIiwKLSAgImEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgeiAxIDIgMyA0IDUgNiA3IDggOSIsCi0gIAotICAvKiBUaGlzIHNob3VsZCBiZSBleHBhbmRlZCBpbnRvIG9ubHkgb25lIGFyZ3VtZW50LiAgKi8KLSAgInRyYWlsaW5nLXdoaXRlc3BhY2UgIiwKLQotICAiIiwKLSAgTlVMTAotfTsKLQotbWFpbiAoKQotewotICBjaGFyICoqYXJndjsKLSAgY2hhciAqKnRlc3Q7Ci0gIGNoYXIgKip0YXJnczsKLQotICBmb3IgKHRlc3QgPSB0ZXN0czsgKnRlc3QgIT0gTlVMTDsgdGVzdCsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoImJ1aWxkYXJndihcIiVzXCIpXG4iLCAqdGVzdCk7Ci0gICAgICBpZiAoKGFyZ3YgPSBidWlsZGFyZ3YgKCp0ZXN0KSkgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJmYWlsZWQhXG5cbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKHRhcmdzID0gYXJndjsgKnRhcmdzICE9IE5VTEw7IHRhcmdzKyspCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcdFwiJXNcIlxuIiwgKnRhcmdzKTsKLQkgICAgfQotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBmcmVlYXJndiAoYXJndik7Ci0gICAgfQotCi19Ci0KLSNlbmRpZgkvKiBNQUlOICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXNwcmludGYuYyBiL2xpYmliZXJ0eS9hc3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWFmMzIwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hc3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogTGlrZSBzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmIGRlZmluZWQgKEFOU0lfUFJPVE9UWVBFUykgfHwgZGVmaW5lZCAoQUxNT1NUX1NUREMpCi0jZGVmaW5lIFVTRV9TVERBUkcKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotLyogVkFSQVJHUyAqLwotI2lmZGVmIFVTRV9TVERBUkcKLWludAotYXNwcmludGYgKGNoYXIgKipidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotI2Vsc2UKLWludAotYXNwcmludGYgKGJ1ZiwgZm10LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICBpbnQgc3RhdHVzOwotICB2YV9saXN0IGFwOwotI2lmZGVmIFVTRV9TVERBUkcKLSAgdmFfc3RhcnQgKGFwLCBmbXQpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFwKTsKLSNlbmRpZgotICBzdGF0dXMgPSB2YXNwcmludGYgKGJ1ZiwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2F0ZXhpdC5jIGIvbGliaWJlcnR5L2F0ZXhpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdkOTg1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hdGV4aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIFdyYXBwZXIgdG8gaW1wbGVtZW50IEFOU0kgQydzIGF0ZXhpdCB1c2luZyBTdW5PUydzIG9uX2V4aXQuICovCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgLS1NaWtlIFN0dW1wLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX09OX0VYSVQKLQotaW50Ci1hdGV4aXQoZikKLSAgICAgdm9pZCAoKmYpKCk7Ci17Ci0gIC8qIElmIHRoZSBzeXN0ZW0gZG9lc24ndCBwcm92aWRlIGEgZGVmaW5pdGlvbiBmb3IgYXRleGl0LCB1c2Ugb25fZXhpdAotICAgICBpZiB0aGUgc3lzdGVtIHByb3ZpZGVzIHRoYXQuICAqLwotICBvbl9leGl0IChmLCAwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Jhc2VuYW1lLmMgYi9saWJpYmVydHkvYmFzZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0NGM4NS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYmFzZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIFJldHVybiB0aGUgYmFzZW5hbWUgb2YgYSBwYXRobmFtZS4KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQliYXNlbmFtZSAtLSByZXR1cm4gcG9pbnRlciB0byBsYXN0IGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lCi0KLVNZTk9QU0lTCi0JY2hhciAqYmFzZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCi0KLURFU0NSSVBUSU9OCi0JR2l2ZW4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB0eXBpY2FsIHBhdGhuYW1lCi0JKC91c3Ivc3JjL2NtZC9scy9scy5jIGZvciBleGFtcGxlKSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCi0JbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGhuYW1lICgibHMuYyIgaW4gdGhpcyBjYXNlKS4KLQotQlVHUwotCVByZXN1bWVzIGEgVU5JWCBzdHlsZSBwYXRoIHdpdGggVU5JWCBzdHlsZSBzZXBhcmF0b3JzLgotKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLWNoYXIgKgotYmFzZW5hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKmJhc2UgPSBuYW1lOwotCi0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUrKyA9PSAnLycpCi0JewotCSAgYmFzZSA9IG5hbWU7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChjaGFyICopIGJhc2U7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmNtcC5jIGIvbGliaWJlcnR5L2JjbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNDQxNy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYmNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogYmNtcAotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi0KLU5BTUUKLQotCWJjbXAgLS0gY29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMKLQotU1lOT1BTSVMKLQotCWludCBiY21wIChjaGFyICpmcm9tLCBjaGFyICp0bywgaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCi0JQ29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMgYW5kIHJldHVybiB6ZXJvIGlmIHRoZXkgYXJlIGlkZW50aWNhbCwKLQlub24temVybyBvdGhlcndpc2UuICBJZiBjb3VudCBpcyB6ZXJvLCByZXR1cm4gemVyby4KLQotTk9URVMKLQotCU5vIGd1YXJhbnRlZSBpcyBtYWRlIGFib3V0IHRoZSBub24temVybyByZXR1cm5lZCB2YWx1ZS4gIEluCi0JcGFydGljdWxhciwgdGhlIHJlc3VsdHMgbWF5IGJlIHNpZ25maWNhbnRseSBkaWZmZXJlbnQgdGhhbgotCXN0cmNtcCgpLCB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGVzcyB0aGFuLAotCWVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybywgYWNjb3JkaW5nIHRvIGxleGljb2dyYXBoaWNhbAotCXNvcnRpbmcgb2YgdGhlIGNvbXBhcmVkIHJlZ2lvbnMuCi0KLUJVR1MKLQotKi8KLQotCi1pbnQKLWJjbXAgKGZyb20sIHRvLCBjb3VudCkKLSAgY2hhciAqZnJvbSwgKnRvOwotICBpbnQgY291bnQ7Ci17Ci0gIGludCBydG52YWwgPSAwOwotCi0gIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKmZyb20rKyAhPSAqdG8rKykKLQl7Ci0JICBydG52YWwgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChydG52YWwpOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmNvcHkuYyBiL2xpYmliZXJ0eS9iY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjU1MzYzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iY29weS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogYmNvcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdGFyeSBsZW5ndGgKLQotTkFNRQotCWJjb3B5IC0tIGNvcHkgbWVtb3J5IHJlZ2lvbnMgb2YgYXJiaXRyYXJ5IGxlbmd0aAotCi1TWU5PUFNJUwotCXZvaWQgYmNvcHkgKGNoYXIgKmluLCBjaGFyICpvdXQsIGludCBsZW5ndGgpCi0KLURFU0NSSVBUSU9OCi0JQ29weSBMRU5HVEggYnl0ZXMgZnJvbSBtZW1vcnkgcmVnaW9uIHBvaW50ZWQgdG8gYnkgSU4gdG8gbWVtb3J5Ci0JcmVnaW9uIHBvaW50ZWQgdG8gYnkgT1VULgotCi1CVUdTCi0JU2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnRzIGNhbiBiZSBtYWRlIGluIHNvbWUgY2FzZXMgYnkKLQlpbXBsZW1lbnRpbmcgY29waWVzIG9mIG11bHRpcGxlIGJ5dGVzIHNpbXVsdGFuZW91c2x5LCBvciB1bnJvbGxpbmcKLQl0aGUgY29weSBsb29wLgotCi0qLwotCi12b2lkCi1iY29weSAoc3JjLCBkZXN0LCBsZW4pCi0gIHJlZ2lzdGVyIGNoYXIgKnNyYywgKmRlc3Q7Ci0gIGludCBsZW47Ci17Ci0gIGlmIChkZXN0IDwgc3JjKQotICAgIHdoaWxlIChsZW4tLSkKLSAgICAgICpkZXN0KysgPSAqc3JjKys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpsYXN0cyA9IHNyYyArIChsZW4tMSk7Ci0gICAgICBjaGFyICpsYXN0ZCA9IGRlc3QgKyAobGVuLTEpOwotICAgICAgd2hpbGUgKGxlbi0tKQotICAgICAgICAqKGNoYXIgKilsYXN0ZC0tID0gKihjaGFyICopbGFzdHMtLTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYnplcm8uYyBiL2xpYmliZXJ0eS9iemVyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDE2NDRiLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iemVyby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogUG9ydGFibGUgdmVyc2lvbiBvZiBiemVybyBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JYnplcm8gLS0gemVybyB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpZWQgbWVtb3J5IHJlZ2lvbgotCi1TWU5PUFNJUwotCXZvaWQgYnplcm8gKGNoYXIgKnRvLCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JWmVybyBDT1VOVCBieXRlcyBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBUTy4KLQotQlVHUwotCVNpZ25pZmljYW50IHNwZWVkIGVuaGFuY2VtZW50cyBtYXkgYmUgbWFkZSBpbiBzb21lIGVudmlyb25tZW50cwotCWJ5IHplcm9pbmcgbW9yZSB0aGFuIGEgc2luZ2xlIGJ5dGUgYXQgYSB0aW1lLCBvciBieSB1bnJvbGxpbmcgdGhlCi0JbG9vcC4KLQotKi8KLQotCi12b2lkCi1iemVybyAodG8sIGNvdW50KQotICBjaGFyICp0bzsKLSAgaW50IGNvdW50OwotewotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgewotICAgICAgKnRvKysgPSAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jYWxsb2MuYyBiL2xpYmliZXJ0eS9jYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMGE3OC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY2FsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSAKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGlzIG11c3QgYmUgZGVjbGFyZWQuICAqLwotUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotUFRSCi1jYWxsb2MgKG5lbGVtLCBlbHNpemUpCi0gIHNpemVfdCBuZWxlbSwgZWxzaXplOwotewotICByZWdpc3RlciBQVFIgcHRyOyAgCi0KLSAgaWYgKG5lbGVtID09IDAgfHwgZWxzaXplID09IDApCi0gICAgbmVsZW0gPSBlbHNpemUgPSAxOwotICAKLSAgcHRyID0gbWFsbG9jIChuZWxlbSAqIGVsc2l6ZSk7Ci0gIGlmIChwdHIpIGJ6ZXJvIChwdHIsIG5lbGVtICogZWxzaXplKTsKLSAgCi0gIHJldHVybiBwdHI7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY2hvb3NlLXRlbXAuYyBiL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWM3Mzg2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qIFV0aWxpdHkgdG8gcGljayBhIHRlbXBvcmFyeSBmaWxlbmFtZSBwcmVmaXguCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZXhwb3J0cyB0d28gZnVuY3Rpb25zOiBjaG9vc2VfdGVtcF9iYXNlIGFuZCBtYWtlX3RlbXBfZmlsZS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBsaWJpYmVydHkgYW5kIGdjYy4KLSAgIERvbid0IGNoYW5nZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkvKiBNYXkgZ2V0IFBfdG1wZGlyLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPiAgIC8qIE1heSBnZXQgUl9PSywgZXRjLiBvbiBzb21lIHN5c3RlbXMuICAqLwotI2VuZGlmCi0KLSNpZm5kZWYgUl9PSwotI2RlZmluZSBSX09LIDQKLSNkZWZpbmUgV19PSyAyCi0jZGVmaW5lIFhfT0sgMQotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLWV4dGVybiBpbnQgbWtzdGVtcHMgKCk7Ci0KLSNpZm5kZWYgSU5fR0NDCi0jaWYgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfV0lOMzIpCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJ1xcJwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBESVJfU0VQQVJBVE9SCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCi0jZW5kaWYKLQotLyogT24gTVNET1MsIHdyaXRlIHRlbXAgZmlsZXMgaW4gY3VycmVudCBkaXIKLSAgIGJlY2F1c2UgdGhlcmUncyBubyBwbGFjZSBlbHNlIHdlIGNhbiBleHBlY3QgdG8gdXNlLiAgKi8KLS8qID8/PyBBbHRob3VnaCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgdHJpZWQgYXMgYSBsYXN0IHJlc29ydCwKLSAgIHRoaXMgaXMgbGVmdCBpbiBzbyB0aGF0IG9uIE1TRE9TIGl0IGlzIHByZWZlcnJlZCB0byAvdG1wIG9uIHRoZQotICAgb2ZmIGNoYW5jZSB0aGF0IHNvbWVvbmUgcmVxdWlyZXMgdGhpcywgc2luY2UgdGhhdCB3YXMgdGhlIHByZXZpb3VzCi0gICBiZWhhdmlvdXIuICAqLwotI2lmZGVmIF9fTVNET1NfXwotI2lmbmRlZiBQX3RtcGRpcgotI2RlZmluZSBQX3RtcGRpciAiLiIKLSNlbmRpZgotI2VuZGlmCi0KLS8qIE5hbWUgb2YgdGVtcG9yYXJ5IGZpbGUuCi0gICBta3RlbXAgcmVxdWlyZXMgNiB0cmFpbGluZyBYJ3MuICAqLwotI2RlZmluZSBURU1QX0ZJTEUgImNjWFhYWFhYIgotCi0vKiBTdWJyb3V0aW5lIG9mIGNob29zZV90ZW1wX2Jhc2UuCi0gICBJZiBCQVNFIGlzIG5vbi1OVUxMLCByZXR1cm4gaXQuCi0gICBPdGhlcndpc2UgaXQgY2hlY2tzIGlmIERJUiBpcyBhIHVzYWJsZSBkaXJlY3RvcnkuCi0gICBJZiBzdWNjZXNzLCBESVIgaXMgcmV0dXJuZWQuCi0gICBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4gICovCi0KLXN0YXRpYyBjaGFyICoKLXRyeSAoZGlyLCBiYXNlKQotICAgICBjaGFyICpkaXIsICpiYXNlOwotewotICBpZiAoYmFzZSAhPSAwKQotICAgIHJldHVybiBiYXNlOwotICBpZiAoZGlyICE9IDAKLSAgICAgICYmIGFjY2VzcyAoZGlyLCBSX09LIHwgV19PSyB8IFhfT0spID09IDApCi0gICAgcmV0dXJuIGRpcjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBhIHByZWZpeCBmb3IgdGVtcG9yYXJ5IGZpbGUgbmFtZXMgb3IgTlVMTCBpZiB1bmFibGUgdG8gZmluZCBvbmUuCi0gICBUaGUgY3VycmVudCBkaXJlY3RvcnkgaXMgY2hvc2VuIGlmIGFsbCBlbHNlIGZhaWxzIHNvIHRoZSBwcm9ncmFtIGlzCi0gICBleGl0ZWQgaWYgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGNhbid0IGJlIGZvdW5kIChta3RlbXAgZmFpbHMpLgotICAgVGhlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBpcyBvYnRhaW5lZCB3aXRoIHhtYWxsb2MuIAotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSBvbmx5LiAgSXQgdXNlCi0gICBpcyBub3QgcmVjb21tZW5kZWQuICAqLwotCi1jaGFyICoKLWNob29zZV90ZW1wX2Jhc2UgKCkKLXsKLSAgY2hhciAqYmFzZSA9IDA7Ci0gIGNoYXIgKnRlbXBfZmlsZW5hbWU7Ci0gIGludCBsZW47Ci0gIHN0YXRpYyBjaGFyIHRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07Ci0gIHN0YXRpYyBjaGFyIHVzcnRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndScsICdzJywgJ3InLCBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07Ci0KLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QRElSIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVAiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRFTVAiKSwgYmFzZSk7Ci0KLSNpZmRlZiBQX3RtcGRpcgotICBiYXNlID0gdHJ5IChQX3RtcGRpciwgYmFzZSk7Ci0jZW5kaWYKLQotICAvKiBUcnkgL3Vzci90bXAsIHRoZW4gL3RtcC4gICovCi0gIGJhc2UgPSB0cnkgKHVzcnRtcCwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKHRtcCwgYmFzZSk7Ci0gCi0gIC8qIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5ISAgKi8KLSAgaWYgKGJhc2UgPT0gMCkKLSAgICBiYXNlID0gIi4iOwotCi0gIGxlbiA9IHN0cmxlbiAoYmFzZSk7Ci0gIHRlbXBfZmlsZW5hbWUgPSB4bWFsbG9jIChsZW4gKyAxIC8qRElSX1NFUEFSQVRPUiovCi0JCQkgICArIHN0cmxlbiAoVEVNUF9GSUxFKSArIDEpOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUsIGJhc2UpOwotCi0gIGlmIChsZW4gIT0gMAotICAgICAgJiYgdGVtcF9maWxlbmFtZVtsZW4tMV0gIT0gJy8nCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2xlbi0xXSAhPSBESVJfU0VQQVJBVE9SKQotICAgIHRlbXBfZmlsZW5hbWVbbGVuKytdID0gRElSX1NFUEFSQVRPUjsKLSAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lICsgbGVuLCBURU1QX0ZJTEUpOwotCi0gIG1rdGVtcCAodGVtcF9maWxlbmFtZSk7Ci0gIGlmIChzdHJsZW4gKHRlbXBfZmlsZW5hbWUpID09IDApCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiB0ZW1wX2ZpbGVuYW1lOwotfQotLyogUmV0dXJuIGEgdGVtcG9yYXJ5IGZpbGUgbmFtZSAoYXMgYSBzdHJpbmcpIG9yIE5VTEwgaWYgdW5hYmxlIHRvIGNyZWF0ZQotICAgb25lLiAgKi8KLQotY2hhciAqCi1tYWtlX3RlbXBfZmlsZSAoc3VmZml4KQotICAgICBjaGFyICpzdWZmaXg7Ci17Ci0gIGNoYXIgKmJhc2UgPSAwOwotICBjaGFyICp0ZW1wX2ZpbGVuYW1lOwotICBpbnQgYmFzZV9sZW4sIHN1ZmZpeF9sZW47Ci0gIGludCBmZDsKLSAgc3RhdGljIGNoYXIgdG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLSAgc3RhdGljIGNoYXIgdXNydG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd1JywgJ3MnLCAncicsIERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLQotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVBESVIiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUCIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVEVNUCIpLCBiYXNlKTsKLQotI2lmZGVmIFBfdG1wZGlyCi0gIGJhc2UgPSB0cnkgKFBfdG1wZGlyLCBiYXNlKTsKLSNlbmRpZgotCi0gIC8qIFRyeSAvdXNyL3RtcCwgdGhlbiAvdG1wLiAgKi8KLSAgYmFzZSA9IHRyeSAodXNydG1wLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAodG1wLCBiYXNlKTsKLSAKLSAgLyogSWYgYWxsIGVsc2UgZmFpbHMsIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkhICAqLwotICBpZiAoYmFzZSA9PSAwKQotICAgIGJhc2UgPSAiLiI7Ci0KLSAgYmFzZV9sZW4gPSBzdHJsZW4gKGJhc2UpOwotCi0gIGlmIChzdWZmaXgpCi0gICAgc3VmZml4X2xlbiA9IHN0cmxlbiAoc3VmZml4KTsKLSAgZWxzZQotICAgIHN1ZmZpeF9sZW4gPSAwOwotCi0gIHRlbXBfZmlsZW5hbWUgPSB4bWFsbG9jIChiYXNlX2xlbiArIDEgLypESVJfU0VQQVJBVE9SKi8KLQkJCSAgICsgc3RybGVuIChURU1QX0ZJTEUpCi0JCQkgICArIHN1ZmZpeF9sZW4gKyAxKTsKLSAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lLCBiYXNlKTsKLQotICBpZiAoYmFzZV9sZW4gIT0gMAotICAgICAgJiYgdGVtcF9maWxlbmFtZVtiYXNlX2xlbi0xXSAhPSAnLycKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbYmFzZV9sZW4tMV0gIT0gRElSX1NFUEFSQVRPUikKLSAgICB0ZW1wX2ZpbGVuYW1lW2Jhc2VfbGVuKytdID0gRElSX1NFUEFSQVRPUjsKLSAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lICsgYmFzZV9sZW4sIFRFTVBfRklMRSk7Ci0KLSAgaWYgKHN1ZmZpeCkKLSAgICBzdHJjYXQgKHRlbXBfZmlsZW5hbWUsIHN1ZmZpeCk7Ci0KLSAgZmQgPSBta3N0ZW1wcyAodGVtcF9maWxlbmFtZSwgc3VmZml4X2xlbik7Ci0gIC8qIElmIG1rc3RlbXBzIGZhaWxlZCwgdGhlbiBzb21ldGhpbmcgYmFkIGlzIGhhcHBlbmluZy4gIE1heWJlIHdlIHNob3VsZAotICAgICBpc3N1ZSBhIG1lc3NhZ2UgYWJvdXQgYSBwb3NzaWJsZSBzZWN1cml0eSBhdHRhY2sgaW4gcHJvZ3Jlc3M/ICAqLwotICBpZiAoZmQgPT0gLTEpCi0gICAgYWJvcnQgKCk7Ci0gIC8qIFNpbWlsYXJseSBpZiB3ZSBjYW4gbm90IGNsb3NlIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGNsb3NlIChmZCkpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiB0ZW1wX2ZpbGVuYW1lOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Nsb2NrLmMgYi9saWJpYmVydHkvY2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyNTA5Yy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIEFOU0ktY29tcGF0aWJsZSBjbG9jayBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfR0VUUlVTQUdFCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9USU1FUwotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9TQ19DTEtfVENLCi0jZGVmaW5lIEdOVV9IWiAgc3lzY29uZihfU0NfQ0xLX1RDSykKLSNlbHNlCi0jaWZkZWYgSFoKLSNkZWZpbmUgR05VX0haICBIWgotI2Vsc2UKLSNpZmRlZiBDTE9DS1NfUEVSX1NFQwotI2RlZmluZSBHTlVfSFogIENMT0NLU19QRVJfU0VDCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qIEZJWE1FOiBzaG91bGQgYmUgYWJsZSB0byBkZWNsYXJlIGFzIGNsb2NrX3QuICovCi0KLWxvbmcKLWNsb2NrICgpCi17Ci0jaWZkZWYgSEFWRV9HRVRSVVNBR0UKLSAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7Ci0KLSAgZ2V0cnVzYWdlICgwLCAmcnVzYWdlKTsKLSAgcmV0dXJuIChydXNhZ2UucnVfdXRpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV91dGltZS50dl91c2VjCi0JICArIHJ1c2FnZS5ydV9zdGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMpOwotI2Vsc2UKLSNpZmRlZiBIQVZFX1RJTUVTCi0gIHN0cnVjdCB0bXMgdG1zOwotCi0gIHRpbWVzICgmdG1zKTsKLSAgcmV0dXJuICh0bXMudG1zX3V0aW1lICsgdG1zLnRtc19zdGltZSkgKiAoMTAwMDAwMCAvIEdOVV9IWik7Ci0jZWxzZQotI2lmZGVmIFZNUwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgcHJvY191c2VyX3RpbWU7Ci0gICAgICBpbnQgcHJvY19zeXN0ZW1fdGltZTsKLSAgICAgIGludCBjaGlsZF91c2VyX3RpbWU7Ci0gICAgICBpbnQgY2hpbGRfc3lzdGVtX3RpbWU7Ci0gICAgfSB2bXNfdGltZXM7Ci0KLSAgdGltZXMgKCZ2bXNfdGltZXMpOwotICByZXR1cm4gKHZtc190aW1lcy5wcm9jX3VzZXJfdGltZSArIHZtc190aW1lcy5wcm9jX3N5c3RlbV90aW1lKSAqIDEwMDAwOwotI2Vsc2UKLSAgLyogQSBmYWxsYmFjaywgaWYgbm90aGluZyBlbHNlIGF2YWlsYWJsZS4gKi8KLSAgcmV0dXJuIDA7Ci0jZW5kaWYgLyogVk1TICovCi0jZW5kaWYgLyogSEFWRV9USU1FUyAqLwotI2VuZGlmIC8qIEhBVkVfR0VUUlVTQUdFICovCi19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25jYXQuYyBiL2xpYmliZXJ0eS9jb25jYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxMzJjOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uY2F0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyogQ29uY2F0ZW5hdGUgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0KLU5BTUUKLQotCWNvbmNhdCAtLSBjb25jYXRlbmF0ZSBhIHZhcmlhYmxlIG51bWJlciBvZiBzdHJpbmdzCi0KLVNZTk9QU0lTCi0KLQkjaW5jbHVkZSA8dmFyYXJncy5oPgotCi0JY2hhciAqY29uY2F0IChzMSwgczIsIHMzLCAuLi4sIE5VTEwpCi0KLURFU0NSSVBUSU9OCi0KLQlDb25jYXRlbmF0ZSBhIHZhcmlhYmxlIG51bWJlciBvZiBzdHJpbmdzIGFuZCByZXR1cm4gdGhlIHJlc3VsdAotCWluIGZyZXNobHkgbWFsbG9jJ2QgbWVtb3J5LgotCi0JUmV0dXJucyBOVUxMIGlmIGluc3VmZmljaWVudCBtZW1vcnkgaXMgYXZhaWxhYmxlLiAgVGhlIGFyZ3VtZW50Ci0JbGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdCBOVUxMIHBvaW50ZXIgZW5jb3VudGVyZWQuICBQb2ludGVycwotCXRvIGVtcHR5IHN0cmluZ3MgYXJlIGlnbm9yZWQuCi0KLU5PVEVTCi0KLQlUaGlzIGZ1bmN0aW9uIHVzZXMgeG1hbGxvYygpIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIGEgZnJvbnQgZW5kCi0JZnVuY3Rpb24gdG8gbWFsbG9jKCkgdGhhdCBkZWFscyB3aXRoIGxvdyBtZW1vcnkgc2l0dWF0aW9ucy4gIEluCi0JdHlwaWNhbCB1c2UsIGlmIG1hbGxvYygpIHJldHVybnMgTlVMTCB0aGVuIHhtYWxsb2MoKSBkaXZlcnRzIHRvIGFuCi0JZXJyb3IgaGFuZGxlciByb3V0aW5lIHdoaWNoIG5ldmVyIHJldHVybnMsIGFuZCB0aHVzIHhtYWxsb2Mgd2lsbAotCW5ldmVyIHJldHVybiBhIE5VTEwgcG9pbnRlci4gIElmIHRoZSBjbGllbnQgYXBwbGljYXRpb24gd2lzaGVzIHRvCi0JZGVhbCB3aXRoIGxvdyBtZW1vcnkgc2l0dWF0aW9ucyBpdHNlbGYsIGl0IHNob3VsZCBzdXBwbHkgYW4geG1hbGxvYwotCXRoYXQganVzdCBkaXJlY3RseSBpbnZva2VzIG1hbGxvYyBhbmQgYmxpbmRseSByZXR1cm5zIHdoYXRldmVyCi0JbWFsbG9jIHJldHVybnMuCi0qLwotCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiBzaXplX3Qgc3RybGVuIChjb25zdCBjaGFyICpzKTsKLSNlbHNlCi1leHRlcm4gaW50IHN0cmxlbiAoKTsKLSNlbmRpZgotCi0jZGVmaW5lIE5VTExQIChjaGFyICopMAotCi0vKiBWQVJBUkdTICovCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1jaGFyICoKLWNvbmNhdCAoY29uc3QgY2hhciAqZmlyc3QsIC4uLikKLSNlbHNlCi1jaGFyICoKLWNvbmNhdCAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHJlZ2lzdGVyIGludCBsZW5ndGg7Ci0gIHJlZ2lzdGVyIGNoYXIgKm5ld3N0cjsKLSAgcmVnaXN0ZXIgY2hhciAqZW5kOwotICByZWdpc3RlciBjb25zdCBjaGFyICphcmc7Ci0gIHZhX2xpc3QgYXJnczsKLSNpZm5kZWYgQU5TSV9QUk9UT1RZUEVTCi0gIGNvbnN0IGNoYXIgKmZpcnN0OwotI2VuZGlmCi0KLSAgLyogRmlyc3QgY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0IGFuZCBnZXQgc3VmZmljaWVudCBtZW1vcnkuICovCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgdmFfc3RhcnQgKGFyZ3MsIGZpcnN0KTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZmlyc3QgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotICBpZiAoZmlyc3QgPT0gTlVMTFApCi0gICAgbGVuZ3RoID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoZmlyc3QpOwotICAgICAgd2hpbGUgKChhcmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKikpICE9IE5VTExQKQotCXsKLQkgIGxlbmd0aCArPSBzdHJsZW4gKGFyZyk7Ci0JfQotICAgIH0KLSAgbmV3c3RyID0gKGNoYXIgKikgeG1hbGxvYyAobGVuZ3RoICsgMSk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgLyogTm93IGNvcHkgdGhlIGluZGl2aWR1YWwgcGllY2VzIHRvIHRoZSByZXN1bHQgc3RyaW5nLiAqLwotCi0gIGlmIChuZXdzdHIgIT0gTlVMTFApCi0gICAgewotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZpcnN0KTsKLSNlbHNlCi0gICAgICB2YV9zdGFydCAoYXJncyk7Ci0gICAgICBmaXJzdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotICAgICAgZW5kID0gbmV3c3RyOwotICAgICAgaWYgKGZpcnN0ICE9IE5VTExQKQotCXsKLQkgIGFyZyA9IGZpcnN0OwotCSAgd2hpbGUgKCphcmcpCi0JICAgIHsKLQkgICAgICAqZW5kKysgPSAqYXJnKys7Ci0JICAgIH0KLQkgIHdoaWxlICgoYXJnID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopKSAhPSBOVUxMUCkKLQkgICAgewotCSAgICAgIHdoaWxlICgqYXJnKQotCQl7Ci0JCSAgKmVuZCsrID0gKmFyZysrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAqZW5kID0gJ1wwMDAnOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChuZXdzdHIpOwotfQotCi0jaWZkZWYgTUFJTgotCi0vKiBTaW1wbGUgbGl0dGxlIHRlc3QgZHJpdmVyLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluICgpCi17Ci0gIHByaW50ZiAoIlwiXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImEiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImEiLCAiYiIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJjXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImEiLCAiYiIsICJjIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNkXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImFiIiwgImNkIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNkZVwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhYiIsICJjIiwgImRlIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNkZWZcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiIiwgImEiLCAiIiwgImJjZCIsICJlZiIsIE5VTExQKSk7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcuaC12bXMgYi9saWJpYmVydHkvY29uZmlnLmgtdm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2FjNmEyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcuaC12bXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaWZuZGVmIE5FRURfc3RyZXJyb3IKLSNkZWZpbmUgTkVFRF9zdHJlcnJvcgotI2VuZGlmCi0jaWZuZGVmIE5FRURfYmFzZW5hbWUKLSNkZWZpbmUgTkVFRF9iYXNlbmFtZQotI2VuZGlmCi0jaWZuZGVmIE5FRURfcHNpZ25hbAotI2RlZmluZSBORUVEX3BzaWduYWwKLSNlbmRpZgotI2lmbmRlZiBORUVEX29uX2V4aXQKLSNkZWZpbmUgTkVFRF9vbl9leGl0Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy5pbiBiL2xpYmliZXJ0eS9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzJkODYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfV0FJVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8dmZvcmsuaD4uICAqLwotI3VuZGVmIEhBVkVfVkZPUktfSAotCi0vKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgcGlkX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB2Zm9yayBhcyBmb3JrIGlmIHZmb3JrIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIHZmb3JrCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX2Vycmxpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfbmVyciB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkVSUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19zaWdsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhc3ByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9BU1BSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGF0ZXhpdCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9BVEVYSVQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiYXNlbmFtZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CQVNFTkFNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQkNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJjb3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JDT1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYnplcm8gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQlpFUk8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjYWxsb2MgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQ0FMTE9DCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2xvY2sgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQ0xPQ0sKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaW5kZXggZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfSU5ERVgKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpbnNxdWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfSU5TUVVFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTUNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1DTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtbW92ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1NT1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtc2V0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTVNFVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG9uX2V4aXQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfT05fRVhJVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHBzaWduYWwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFNJR05BTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJhbmRvbSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SQU5ET00KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW5hbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUkVOQU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmluZGV4IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1JJTkRFWAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ3NldG1hc2sgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0lHU0VUTUFTSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJkdXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRFVQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJuY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJOQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnNpZ25hbCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJTSUdOQUwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJzdHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSU1RSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG9kIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlRPRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvbCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJUT0wKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b3VsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlRPVUwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNjb25mIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NZU0NPTkYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lcyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9USU1FUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRtcG5hbSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9UTVBOQU0KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2YXNwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVkFTUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdmZwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVkZQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2cHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2c3ByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WU1BSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHdhaXRwaWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfV0FJVFBJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19GSUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLnRhYmxlIGIvbGliaWJlcnR5L2NvbmZpZy50YWJsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxM2IyMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnLnRhYmxlCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotY2FzZSAiJHtob3N0fSIgaW4KLSAgcnM2MDAwLWlibS1haXgzLjEgfCByczYwMDAtaWJtLWFpeCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYWc9bWgtYWl4IDs7Ci0gICotKi1jeHV4NyopCQlmcmFnPW1oLWN4dXg3IDs7Ci0gICotKi1mcmVlYnNkMi4xLiopCWZyYWc9bWgtZmJzZDIxIDs7Ci0gICotKi1mcmVlYnNkMi4yLlswMTJdKQlmcmFnPW1oLWZic2QyMSA7OwotICBpWzM0NV04Ni0qLXdpbmRvd3MqKQlmcmFnPW1oLXdpbmRvd3MgOzsKLSAgKi0qLWJlb3MqKQkJZnJhZz1taC1iZW9zIDs7Ci1lc2FjCi0KLWZyYWdzPSRmcmFnCi0KLSMgSWYgdGhleSBkaWRuJ3Qgc3BlY2lmeSAtLWVuYWJsZS1zaGFyZWQsIGRvbid0IGdlbmVyYXRlIHNoYXJlZCBsaWJzLgotY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLSAgeWVzKSBzaGFyZWQ9eWVzIDs7Ci0gIG5vKSBzaGFyZWQ9bm8gOzsKLSAgIiIpIHNoYXJlZD1ubyA7OwotICAqKSBzaGFyZWQ9eWVzIDs7Ci1lc2FjCi1pZiBbICIke3NoYXJlZH0iID0gInllcyIgXTsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICAgICotKi1jeWd3aW4qKQk7OwotICAgIGFscGhhKi0qLWxpbnV4KikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1lbGZhbHBoYXBpYyIgOzsKLSAgICBhcm0qLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtYXJtcGljIiA7OwotICAgIGhwcGEqLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtcGFwaWMiIDs7Ci0gICAgaVszNDU2XTg2LSotKikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC14ODZwaWMiIDs7Ci0gICAgcG93ZXJwYyotKi1haXgqKQk7OwotICAgIHBvd2VycGMqLSotKikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1wcGNwaWMiIDs7Ci0gICAgKi0qLSopCQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLSR7aG9zdF9jcHV9cGljIiA7OwotICBlc2FjCi1maQotCi1lY2hvICIjIFdhcm5pbmc6IHRoaXMgZnJhZ21lbnQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQiID4gdGVtcC1mcmFnCi0KLWZvciBmcmFnIGluICR7ZnJhZ3N9OyBkbwotICBjYXNlICR7ZnJhZ30gaW4KLSAgICAuLi8qICkKLSAgICAgIGlmIFsgJHtzcmNkaXJ9ID0gLiBdOyB0aGVuCi0JWyAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiBdICYmIGZyYWc9Li4vJHtmcmFnfQotCVsgLW4gIiR7d2l0aF9tdWx0aXNyY3RvcH0iIF0gJiYgZnJhZz0ke3dpdGhfbXVsdGlzcmN0b3B9JHtmcmFnfQotICAgICAgZmkKLSAgICAgIDs7Ci0gIGVzYWMKLSAgZnJhZz0ke3NyY2Rpcn0vJHt4c3JjZGlyfWNvbmZpZy8kZnJhZwotICBpZiBbIC1mICR7ZnJhZ30gXTsgdGhlbgotICAgIGVjaG8gIkFwcGVuZGluZyAke2ZyYWd9IHRvIHhob3N0LW1rZnJhZyIKLSAgICBlY2hvICIjIEZvbGxvd2luZyBmcmFnbWVudCBjb3BpZWQgZnJvbSAke2ZyYWd9IiA+PiB0ZW1wLWZyYWcKLSAgICBjYXQgJHtmcmFnfSA+PiB0ZW1wLWZyYWcKLSAgZmkKLWRvbmUKLQotIyByZWNvcmQgaWYgd2Ugd2FudCB0byBidWlsZCBzaGFyZWQgbGlicy4KLWlmIFsgIiR7c2hhcmVkfSIgPSAieWVzIiBdOyB0aGVuCi0gIGVjaG8gZW5hYmxlX3NoYXJlZCA9IHllcyA+PiB0ZW1wLWZyYWcKLWVsc2UKLSAgZWNobyBlbmFibGVfc2hhcmVkID0gbm8gPj4gdGVtcC1mcmFnCi1maQotCi1mcmFnPXhob3N0LW1rZnJhZwotJHtDT05GSUdfU0hFTEx9ICR7bGliaWJlcnR5X3RvcGRpcn0vbW92ZS1pZi1jaGFuZ2UgdGVtcC1mcmFnIHhob3N0LW1rZnJhZwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1haXggYi9saWJpYmVydHkvY29uZmlnL21oLWFpeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2NDUwNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWFpeAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgb25seSBuZWVkZWQgYnkgQUlYIDMuMS4KLUhERUZJTkVTID0gLURfX0lFRUVfQklHX0VORElBTgotCi0jIE1vc3QgcmVsZWFzZXMgb2YgQUlYIDMuMSBpbmNsdWRlIGFuIGluY29ycmVjdCBpbnRlcm5hbCB2ZXJzaW9uIG9mIGNvcHlzaWduCi0jIGluIGxpYmMuYSBmb3IgdXNlIGJ5IHNvbWUgbGliYyBwdWJsaWMgZnVuY3Rpb25zIGluY2x1ZGluZyBtb2RmLiAgVGhlIHB1YmxpYwotIyB2ZXJzaW9uIG9mIGNvcHlzaWduIGluIGxpYm0uYSBpcyB1c2FibGUuICBGb3IgdGhlIHNha2Ugb2YgbGliZysrICh3aGljaAotIyB1c2VzIG1vZGYpLCB3ZSBhZGQgY29weXNpZ24gaGVyZS4gIFN1cHBvc2VkbHksIHRoaXMgcHJvYmxlbSBpcyBmaXhlZCBpbiBBSVgKLSMgMy4xLjggYW5kIGFib3ZlLCBpbmNsdWRpbmcgYWxsIHJlbGVhc2VzIG9mIEFJWCAzLjIuCi1FWFRSQV9PRklMRVMgPSBjb3B5c2lnbi5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWJlb3MgYi9saWJpYmVydHkvY29uZmlnL21oLWJlb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzVlN2QuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1iZW9zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIEhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIEJlT1MKLQotIyBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgdGhlIHdpbXB5IGRlZmF1bHQgNjRrIHN0YWNrCi0jIGxpbWl0IGluIEJlT1MgaXMgZWl0aGVyIGluY3JlYXNlZCBvciBtYWRlIHVzZXIgc2V0dGFibGUgc29tZWhvdy4KLSMgVGhpcyBwcm9iYWJseSB3b24ndCBoYXBwZW4gdW50aWwgYWZ0ZXIgdGhlIERSOSByZWxlYXNlLgotCi1FWFRSQV9PRklMRVMgPSBhbGxvY2EubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NyBiL2xpYmliZXJ0eS9jb25maWcvbWgtY3h1eDcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjRiMDguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUhERUZJTkVTID0gLURIQVJSSVNfRkxPQVRfRk9STUFUCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWZic2QyMSBiL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzc1YTc4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRVhUUkFfT0ZJTEVTPXZhc3ByaW50Zi5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MgYi9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjVmNzkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC13aW5kb3dzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRVhUUkFfT0ZJTEVTPWFzcHJpbnRmLm8gc3RyY2FzZWNtcC5vIHN0cm5jYXNlY21wLm8gdmFzcHJpbnRmLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWd1cmUgYi9saWJpYmVydHkvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzU1NTEwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwyODUwICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtdGFyZ2V0LXN1YmRpcj1TVUJESVIgICAgICBDb25maWd1cmluZyBpbiBhIHN1YmRpcmVjdG9yeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1jcm9zcy1ob3N0PUhPU1QgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggYSBjcm9zcyBjb21waWxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1uZXdsaWIgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggbmV3bGliIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1wZXhlY3V0ZS5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhcmdldC1zdWJkaXIgb3IgLS13aXRob3V0LXRhcmdldC1zdWJkaXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfdGFyZ2V0X3N1YmRpciIKLSAgOgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jcm9zcy1ob3N0IG9yIC0td2l0aG91dC1jcm9zcy1ob3N0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcm9zc19ob3N0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2Nyb3NzX2hvc3QiCi0gIDoKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbmV3bGliIG9yIC0td2l0aG91dC1uZXdsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX25ld2xpYitzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9uZXdsaWIiCi0gIDoKLWZpCi0KLQotaWYgdGVzdCAiJHtzcmNkaXJ9IiA9ICIuIjsgdGhlbgotICBpZiB0ZXN0IC16ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgotICBlbHNlCi0gICAgaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiI7IHRoZW4KLSAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4iCi0gICAgZWxzZQotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLiIKLSAgICBmaQotICBmaQotZWxzZQotICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi1maQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJGxpYmliZXJ0eV90b3BkaXIgJHNyY2Rpci8kbGliaWJlcnR5X3RvcGRpcjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRsaWJpYmVydHlfdG9wZGlyICRzcmNkaXIvJGxpYmliZXJ0eV90b3BkaXIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTkxOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNDogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjcyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIFJBTkxJQj0iOiIKLWZpCi1maQotCi0KLSMgRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlZmluZSBvdXIgb3duIHZlcnNpb24gb2YgQUNfUFJPR19DQy4gIFRoaXMgaXMKLSMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgbm90IGNhbGwgQUNfUFJPR19DQ19XT1JLUy4gIFdlCi0jIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci0jIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBpbiBhdXRvY29uZgotIyBpdHNlbGYuCi0KLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzQ5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3Nzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4Mjg6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjgzNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NTI6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdDQz0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4MTogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLQotCi0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkxOTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0uICR7c3JjZGlyfS9jb25maWcudGFibGUKLWhvc3RfbWFrZWZpbGVfZnJhZz0ke2ZyYWd9Ci0KLQotIyBJdCdzIE9LIHRvIGNoZWNrIGZvciBoZWFkZXIgZmlsZXMuICBBbHRob3VnaCB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZQotIyBhYmxlIHRvIGxpbmsgYW55dGhpbmcsIGl0IGhhZCBiZXR0ZXIgYmUgYWJsZSB0byBhdCBsZWFzdCBjb21waWxlCi0jIHNvbWV0aGluZy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODA6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTk1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDE4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDM1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWZvciBhY19oZHIgaW4gc3lzL2ZpbGUuaCBzeXMvcGFyYW0uaCBzdGRsaWIuaCBzdHJpbmcuaCB1bmlzdGQuaCBzdHJpbmdzLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNjM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDY4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDczOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMDA6IGNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHN0YXRfdmFsKSAoKHVuc2lnbmVkKShzdGF0X3ZhbCkgPj4gOCkKLSNlbmRpZgotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHN0YXRfdmFsKSAoKChzdGF0X3ZhbCkgJiAyNTUpID09IDApCi0jZW5kaWYKLWludCBtYWluKCkgewotaW50IHM7Ci13YWl0ICgmcyk7Ci1zID0gV0lGRVhJVEVEIChzKSA/IFdFWElUU1RBVFVTIChzKSA6IDE7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi1FT0YKLQotZmkKLQotCi0jIFRoaXMgaXMgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGxpYmliZXJ0eSB3aWxsIHByb3ZpZGUgaWYgdGhleQotIyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUgaG9zdC4KLQotZnVuY3M9ImFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyBhdGV4aXQiCi1mdW5jcz0iJGZ1bmNzIGJhc2VuYW1lIgotZnVuY3M9IiRmdW5jcyBiY21wIgotZnVuY3M9IiRmdW5jcyBiY29weSIKLWZ1bmNzPSIkZnVuY3MgYnplcm8iCi1mdW5jcz0iJGZ1bmNzIGNhbGxvYyIKLWZ1bmNzPSIkZnVuY3MgY2xvY2siCi1mdW5jcz0iJGZ1bmNzIGdldGN3ZCIKLWZ1bmNzPSIkZnVuY3MgZ2V0cGFnZXNpemUiCi1mdW5jcz0iJGZ1bmNzIGluZGV4IgotZnVuY3M9IiRmdW5jcyBpbnNxdWUiCi1mdW5jcz0iJGZ1bmNzIG1lbWNociIKLWZ1bmNzPSIkZnVuY3MgbWVtY21wIgotZnVuY3M9IiRmdW5jcyBtZW1jcHkiCi1mdW5jcz0iJGZ1bmNzIG1lbW1vdmUiCi1mdW5jcz0iJGZ1bmNzIG1lbXNldCIKLWZ1bmNzPSIkZnVuY3MgbWtzdGVtcHMiCi1mdW5jcz0iJGZ1bmNzIHJhbmRvbSIKLWZ1bmNzPSIkZnVuY3MgcmVuYW1lIgotZnVuY3M9IiRmdW5jcyByaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIHNpZ3NldG1hc2siCi1mdW5jcz0iJGZ1bmNzIHN0cmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cmNociIKLWZ1bmNzPSIkZnVuY3Mgc3RyZHVwIgotZnVuY3M9IiRmdW5jcyBzdHJuY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RycmNociIKLWZ1bmNzPSIkZnVuY3Mgc3Ryc3RyIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2QiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvbCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG91bCIKLWZ1bmNzPSIkZnVuY3MgdG1wbmFtIgotZnVuY3M9IiRmdW5jcyB2YXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZmcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2cHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2c3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3Mgd2FpdHBpZCIKLQotIyBBbHNvIGluIHRoZSBvbGQgZnVuY3Rpb24uZGVmIGZpbGU6IGFsbG9jYSwgdmZvcmssIGdldG9wdC4KLQotdmFycz0ic3lzX2Vycmxpc3Qgc3lzX25lcnIgc3lzX3NpZ2xpc3QiCi0KLWNoZWNrZnVuY3M9ImdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMiCi0KLSMgVGhlc2UgYXJlIG5laXRoZXIgZXhlY3V0ZWQgbm9yIHJlcXVpcmVkLCBidXQgdGhleSBoZWxwIGtlZXAKLSMgYXV0b2hlYWRlciBoYXBweSB3aXRob3V0IGFkZGluZyBhIGJ1bmNoIG9mIHRleHQgdG8gYWNjb25maWcuaC4KLWlmIHRlc3QgIngiID0gInkiOyB0aGVuCi0gIGZvciBhY19mdW5jIGluIGFzcHJpbnRmIGF0ZXhpdCBiYXNlbmFtZSBiY21wIGJjb3B5IGJ6ZXJvIGNhbGxvYyBjbG9jayBnZXRjd2QKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZSBpbmRleCBpbnNxdWUgbWtzdGVtcHMgbWVtY2hyIG1lbWNtcCBtZW1jcHkgbWVtbW92ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIG1lbXNldCByYW5kb20gcmVuYW1lIHJpbmRleCBzaWdzZXRtYXNrIHN0cmNhc2VjbXAKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMDU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBzdHJjaHIgc3RyZHVwIHN0cm5jYXNlY21wIHN0cnJjaHIgc3Ryc3RyIHN0cnRvZCBzdHJ0b2wKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzNjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM4ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBzdHJ0b3VsIHRtcG5hbSB2YXNwcmludGYgdmZwcmludGYgdnByaW50ZiB2c3ByaW50ZiB3YWl0cGlkCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDE1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDIwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX0VSUkxJU1QgMQotRU9GCi0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX05FUlIgMQotRU9GCi0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX1NJR0xJU1QgMQotRU9GCi0KLSAgZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ4MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ4NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1maQotCi0jIEZvciBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucywgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSB0aGUKLSMgZnVuY3Rpb24gd2Ugd2FudCB0byBwdXQgRk4ubyBpbiBMSUJPQkpTLCBhbmQgaWYgdGhlIGhvc3QgZG9lcwotIyBwcm92aWRlIHRoZSBmdW5jdGlvbiwgd2Ugd2FudCB0byBkZWZpbmUgSEFWRV9GTiBpbiBjb25maWcuaC4gIEFsc28sCi0jIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgYWxsb2NhLCB3ZSBzZXQgQUxMT0NBIHRvIGFsbG9jYS5vCi0KLXNldG9ianM9Ci1pZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0KLSAgIyBXZSBhcmUgYmVpbmcgY29uZmlndXJlZCBhcyBhIHRhcmdldCBsaWJyYXJ5LiAgQUNfUkVQTEFDRV9GVU5DUwotICAjIG1heSBub3Qgd29yayBjb3JyZWN0bHksIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG1heSBub3QgYmUgYWJsZSB0bwotICAjIGxpbmsgZXhlY3V0YWJsZXMuICBOb3RlIHRoYXQgd2UgbWF5IHN0aWxsIGJlIGJlaW5nIGNvbmZpZ3VyZWQKLSAgIyBuYXRpdmUuCi0KLSAgIyBJZiB3ZSBhcmUgYmVpbmcgY29uZmlndXJlZCBmb3IgbmV3bGliLCB3ZSBrbm93IHdoaWNoIGZ1bmN0aW9ucwotICAjIG5ld2xpYiBwcm92aWRlIGFuZCB3aGljaCBvbmVzIHdlIHdpbGwgYmUgZXhwZWN0ZWQgdG8gcHJvdmlkZS4KLQotICBpZiB0ZXN0ICJ4JHt3aXRoX25ld2xpYn0iID0gInh5ZXMiOyB0aGVuCi0gICAgQUxMT0NBPSJhbGxvY2EubyIKLSAgICBMSUJPQkpTPSJhc3ByaW50Zi5vIGJhc2VuYW1lLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyZHVwLm8gdmFzcHJpbnRmLm8iCi0KLSAgICBmb3IgZiBpbiAkZnVuY3M7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLQlhc3ByaW50ZiB8IGJhc2VuYW1lIHwgaW5zcXVlIHwgcmFuZG9tIHwgc3RyZHVwIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBuZXdsaWIgZG9lc250IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCi0gICAgIyBkb250IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBuZXdsaWIgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotRU9GCi0KLQotICAgIHNldG9ianM9eWVzCi0KLSAgZmkKLWZpCi0KLWlmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0KLSAgKi0qLXZ4d29ya3MqKQotICAgICMgSGFuZGxlIFZ4V29ya3MgY29uZmlndXJhdGlvbiBzcGVjaWFsbHksIHNpbmNlIG9uIFZ4V29ya3MgdGhlCi0gICAgIyBsaWJyYXJpZXMgYXJlIGFjdHVhbGx5IG9uIHRoZSB0YXJnZXQgYm9hcmQsIG5vdCBpbiB0aGUgZmlsZQotICAgICMgc3lzdGVtLgotICAgIExJQk9CSlM9ImJhc2VuYW1lLm8gZ2V0cGFnZXNpemUubyBpbnNxdWUubyByYW5kb20ubyBzdHJjYXNlY21wLm8iCi0gICAgTElCT0JKUz0iJExJQk9CSlMgc3RybmNhc2VjbXAubyBzdHJkdXAubyB2Zm9yay5vIHdhaXRwaWQubyB2YXNwcmludGYubyIKLSAgICBmb3IgZiBpbiAkZnVuY3M7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLQliYXNlbmFtZSB8IGdldHBhZ2VzaXplIHwgaW5zcXVlIHwgcmFuZG9tIHwgc3RyY2FzZWNtcCkKLQkgIDs7Ci0Jc3RybmNhc2VjbXAgfCBzdHJkdXAgfCB2Zm9yayB8IHdhaXRwaWQgfCB2YXNwcmludGYpCi0JICA7OwotCSopCi0JICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0JICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkbiAxCi1FT0YKLQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFZ4V29ya3MgZG9lc24ndCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIFZ4V29ya3Mgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotRU9GCi0KLQotICAgIHNldG9ianM9eWVzCi0gICAgOzsKLQotICBlc2FjCi1maQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0KLSAgKi0qLWN5Z3dpbiopCi0gICAgIyBUaGUgQ3lnd2luIGxpYnJhcnkgYWN0dWFsbHkgdXNlcyBhIGNvdXBsZSBvZiBmaWxlcyBmcm9tCi0gICAgIyBsaWJpYmVydHkgd2hlbiBpdCBpcyBidWlsdC4gIElmIHdlIGFyZSBidWlsZGluZyBhIG5hdGl2ZQotICAgICMgQ3lnd2luLCBhbmQgd2UgcnVuIHRoZSB0ZXN0cywgd2Ugd2lsbCBhcHBlYXIgdG8gaGF2ZSB0aGVzZQotICAgICMgZmlsZXMuICBIb3dldmVyLCB3aGVuIHdlIGdvIG9uIHRvIGJ1aWxkIHdpbnN1cCwgd2Ugd2lsbCB3aW5kIHVwCi0gICAgIyB3aXRoIGEgbGlicmFyeSB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZSBmaWxlcywgc2luY2UgdGhleSBzaG91bGQKLSAgICAjIGhhdmUgY29tZSBmcm9tIGxpYmliZXJ0eS4KLQotICAgICMgV2UgaGFuZGxlIHRoaXMgYnkgcmVtb3ZpbmcgdGhlIGZ1bmN0aW9ucyB0aGUgd2luc3VwIGxpYnJhcnkKLSAgICAjIHByb3ZpZGVzIGZyb20gb3VyIHNoZWxsIHZhcmlhYmxlcywgc28gdGhhdCB0aGV5IGFwcGVhciB0byBiZQotICAgICMgbWlzc2luZy4KLQotICAgIGZ1bmNzPSJgZWNobyAkZnVuY3MgfCBzZWQgLWUgJ3MvcmFuZG9tLy8nYCIKLSAgICBMSUJPQkpTPSIkTElCT0JKUyByYW5kb20ubyIKLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfc2lnbGlzdC8vJ2AiCi0gICAgY2hlY2tmdW5jcz0iYGVjaG8gJGNoZWNrZnVuY3MgfCBzZWQgLWUgJ3Mvc3Ryc2lnbmFsLy8nIC1lICdzL3BzaWduYWwvLydgIgotICAgIDs7Ci0KLSAgKi0qLW1pbmd3MzIqKQotICAgICMgVW5kZXIgbWluZ3czMiwgc3lzX25lcnIgYW5kIHN5c19lcnJsaXN0IGV4aXN0LCBidXQgdGhleSBhcmUKLSAgICAjIG1hY3Jvcywgc28gdGhlIHRlc3QgYmVsb3cgd29uJ3QgZmluZCB0aGVtLgotICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19uZXJyLy8nIC1lICdzL3N5c19lcnJsaXN0Ly8nYCIKLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfTkVSUiAxCi1FT0YKLQotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19FUlJMSVNUIDEKLUVPRgotCi0gICAgOzsKLQotICAqLSotdXdpbiopCi0gICAgIyBVbmRlciBzb21lIHZlcnNpb25zIG9mIHV3aW4sIHZmb3JrIGlzIG5vdG9yaW91c2x5IGJ1Z2d5IGFuZCB0aGUgdGVzdCAKLSAgICAjIGNhbiBoYW5nIGNvbmZpZ3VyZTsgb24gb3RoZXIgdmVyc2lvbnMsIHZmb3JrIGV4aXN0cyBqdXN0IGFzIGEgc3R1Yi4KLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdmZvcmsgaW4gdXdpbidzIHJ1bnRpbWUgaXMgZml4ZWQuCi0gICAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubwotICAgIDs7Ci0KLSAgZXNhYwotCi0gICMgV2UgaGF2ZW4ndCBzZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB5ZXQuICBVc2UgdGhlIHN0YW5kYXJkIGF1dG9jb25mCi0gICMgdGVzdHMuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBjb21waWxlciB3b3Jrcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjcyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxNjgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY4ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzE0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi0gIGZvciBhY19mdW5jIGluICRmdW5jcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTcyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1MSUJPQkpTPSIkTElCT0JKUyAke2FjX2Z1bmN9LiR7YWNfb2JqZXh0fSIKLWZpCi1kb25lCi0KLQotICAjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzc4OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc4MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxMTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODc2OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTYxOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxMDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAyMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBpZF90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTE0OiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfcGlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXBpZF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9waWRfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3BpZF90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfcGlkX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfcGlkX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgcGlkX3QgaW50Ci1FT0YKLQotZmkKLQotYWNfc2FmZT1gZWNobyAidmZvcmsuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdmZvcmsuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE0ODogY2hlY2tpbmcgZm9yIHZmb3JrLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHZmb3JrLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxNTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9WRk9SS19IIDEKLUVPRgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxODM6IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3Zmb3JrX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZmb3JrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTg5OiBjaGVja2luZyBmb3IgdmZvcmsiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdmZvcmsnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHZmb3JrKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgdmZvcmsoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl92Zm9yaykgfHwgZGVmaW5lZCAoX19zdHViX19fdmZvcmspCi1jaG9rZSBtZQotI2Vsc2UKLXZmb3JrKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfdmZvcms9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3Zmb3JrPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ndmZvcmtgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgOgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIzOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVkZPUktfSAotI2luY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLS8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywgY2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCi0gICBhcmd1bWVudCByZWdpc3RlcnMgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50LgotICAgVGhlIGNvbXBpbGVyIGlzIHRvbGQgYWJvdXQgdGhpcyB3aXRoICNpbmNsdWRlIDx2Zm9yay5oPiwKLSAgIGJ1dCBzb21lIGNvbXBpbGVycyAoZS5nLiBnY2MgLU8pIGRvbid0IGdyb2sgPHZmb3JrLmg+LgotICAgVGVzdCBmb3IgdGhpcyBieSB1c2luZyBhIHN0YXRpYyB2YXJpYWJsZSB3aG9zZSBhZGRyZXNzCi0gICBpcyBwdXQgaW50byBhIHJlZ2lzdGVyIHRoYXQgaXMgY2xvYmJlcmVkIGJ5IHRoZSB2Zm9yay4gICovCi1zdGF0aWMKLSNpZmRlZiBfX2NwbHVzcGx1cwotc3BhcmNfYWRkcmVzc190ZXN0IChpbnQgYXJnKQotI2Vsc2UKLXNwYXJjX2FkZHJlc3NfdGVzdCAoYXJnKSBpbnQgYXJnOwotI2VuZGlmCi17Ci0gIHN0YXRpYyBwaWRfdCBjaGlsZDsKLSAgaWYgKCFjaGlsZCkgewotICAgIGNoaWxkID0gdmZvcmsgKCk7Ci0gICAgaWYgKGNoaWxkIDwgMCkgewotICAgICAgcGVycm9yICgidmZvcmsiKTsKLSAgICAgIF9leGl0KDIpOwotICAgIH0KLSAgICBpZiAoIWNoaWxkKSB7Ci0gICAgICBhcmcgPSBnZXRwaWQoKTsKLSAgICAgIHdyaXRlKC0xLCAiIiwgMCk7Ci0gICAgICBfZXhpdCAoYXJnKTsKLSAgICB9Ci0gIH0KLX0KLW1haW4oKSB7Ci0gIHBpZF90IHBhcmVudCA9IGdldHBpZCAoKTsKLSAgcGlkX3QgY2hpbGQ7Ci0KLSAgc3BhcmNfYWRkcmVzc190ZXN0ICgpOwotCi0gIGNoaWxkID0gdmZvcmsgKCk7Ci0KLSAgaWYgKGNoaWxkID09IDApIHsKLSAgICAvKiBIZXJlIGlzIGFub3RoZXIgdGVzdCBmb3Igc3BhcmMgdmZvcmsgcmVnaXN0ZXIgcHJvYmxlbXMuCi0gICAgICAgVGhpcyB0ZXN0IHVzZXMgbG90cyBvZiBsb2NhbCB2YXJpYWJsZXMsIGF0IGxlYXN0Ci0gICAgICAgYXMgbWFueSBsb2NhbCB2YXJpYWJsZXMgYXMgbWFpbiBoYXMgYWxsb2NhdGVkIHNvIGZhcgotICAgICAgIGluY2x1ZGluZyBjb21waWxlciB0ZW1wb3Jhcmllcy4gIDQgbG9jYWxzIGFyZSBlbm91Z2ggZm9yCi0gICAgICAgZ2NjIDEuNDAuMyBvbiBhIFNvbGFyaXMgNC4xLjMgc3BhcmMsIGJ1dCB3ZSB1c2UgOCB0byBiZSBzYWZlLgotICAgICAgIEEgYnVnZ3kgY29tcGlsZXIgc2hvdWxkIHJldXNlIHRoZSByZWdpc3RlciBvZiBwYXJlbnQKLSAgICAgICBmb3Igb25lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMsIHNpbmNlIGl0IHdpbGwgdGhpbmsgdGhhdAotICAgICAgIHBhcmVudCBjYW4ndCBwb3NzaWJseSBiZSB1c2VkIGFueSBtb3JlIGluIHRoaXMgcm91dGluZS4KLSAgICAgICBBc3NpZ25pbmcgdG8gdGhlIGxvY2FsIHZhcmlhYmxlIHdpbGwgdGh1cyBtdW5nZSBwYXJlbnQKLSAgICAgICBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICAqLwotICAgIHBpZF90Ci0gICAgICBwID0gZ2V0cGlkKCksIHAxID0gZ2V0cGlkKCksIHAyID0gZ2V0cGlkKCksIHAzID0gZ2V0cGlkKCksCi0gICAgICBwNCA9IGdldHBpZCgpLCBwNSA9IGdldHBpZCgpLCBwNiA9IGdldHBpZCgpLCBwNyA9IGdldHBpZCgpOwotICAgIC8qIENvbnZpbmNlIHRoZSBjb21waWxlciB0aGF0IHAuLnA3IGFyZSBsaXZlOyBvdGhlcndpc2UsIGl0IG1pZ2h0Ci0gICAgICAgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIHJlZ2lzdGVyIGZvciBhbGwgOCBsb2NhbCB2YXJpYWJsZXMuICAqLwotICAgIGlmIChwICE9IHAxIHx8IHAgIT0gcDIgfHwgcCAhPSBwMyB8fCBwICE9IHA0Ci0JfHwgcCAhPSBwNSB8fCBwICE9IHA2IHx8IHAgIT0gcDcpCi0gICAgICBfZXhpdCgxKTsKLQotICAgIC8qIE9uIHNvbWUgc3lzdGVtcyAoZS5nLiBJUklYIDMuMyksCi0gICAgICAgdmZvcmsgZG9lc24ndCBzZXBhcmF0ZSBwYXJlbnQgZnJvbSBjaGlsZCBmaWxlIGRlc2NyaXB0b3JzLgotICAgICAgIElmIHRoZSBjaGlsZCBjbG9zZXMgYSBkZXNjcmlwdG9yIGJlZm9yZSBpdCBleGVjcyBvciBleGl0cywKLSAgICAgICB0aGlzIG11bmdlcyB0aGUgcGFyZW50J3MgZGVzY3JpcHRvciBhcyB3ZWxsLgotICAgICAgIFRlc3QgZm9yIHRoaXMgYnkgY2xvc2luZyBzdGRvdXQgaW4gdGhlIGNoaWxkLiAgKi8KLSAgICBfZXhpdChjbG9zZShmaWxlbm8oc3Rkb3V0KSkgIT0gMCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IHN0YXR1czsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICAgIHdoaWxlICh3YWl0KCZzdGF0dXMpICE9IGNoaWxkKQotICAgICAgOwotICAgIGV4aXQoCi0JIC8qIFdhcyB0aGVyZSBzb21lIHByb2JsZW0gd2l0aCB2Zm9ya2luZz8gICovCi0JIGNoaWxkIDwgMAotCi0JIC8qIERpZCB0aGUgY2hpbGQgZmFpbD8gIChUaGlzIHNob3VsZG4ndCBoYXBwZW4uKSAgKi8KLQkgfHwgc3RhdHVzCi0KLQkgLyogRGlkIHRoZSB2Zm9yay9jb21waWxlciBidWcgb2NjdXI/ICAqLwotCSB8fCBwYXJlbnQgIT0gZ2V0cGlkKCkKLQotCSAvKiBEaWQgdGhlIGZpbGUgZGVzY3JpcHRvciBidWcgb2NjdXI/ICAqLwotCSB8fCBmc3RhdChmaWxlbm8oc3Rkb3V0KSwgJnN0KSAhPSAwCi0JICk7Ci0gIH0KLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgdmZvcmsgZm9yawotRU9GCi0KLWZpCi0KLSAgaWYgdGVzdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyA9IG5vOyB0aGVuCi0gICAgTElCT0JKUz0iJExJQk9CSlMgdmZvcmsubyIKLSAgZmkKLSAgZm9yIHYgaW4gJHZhcnM7IGRvCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICR2IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzYxOiBjaGVja2luZyBmb3IgJHYiID4mNQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsaWJpYmVydHlfY3ZfdmFyXyR2JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1pbnQgKnA7Ci1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgJHY7IHAgPSAmJHY7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckbGliaWJlcnR5X2N2X3Zhcl8nJHZgXCIgPSB5ZXMiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgICBuPUhBVkVfYGVjaG8gJHYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkbiAxCi1FT0YKLQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190IiJubyIgMT4mNgotICAgIGZpCi0gIGRvbmUKLSAgZm9yIGFjX2Z1bmMgaW4gJGNoZWNrZnVuY3MKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzOTk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZmkKLQotIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gJCh0b29sZGlyKSByYXRoZXIKLSMgdGhhbiAkKGxpYmRpcikuCi1pZiB0ZXN0IC16ICIke3dpdGhfY3Jvc3NfaG9zdH0iOyB0aGVuCi0gIElOU1RBTExfREVTVD1saWJkaXIKLWVsc2UKLSAgSU5TVEFMTF9ERVNUPXRvb2xkaXIKLWZpCi0KLQotIyBXZSBuZWVkIG11bHRpbGliIHN1cHBvcnQsIGJ1dCBvbmx5IGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgdGFyZ2V0LgotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotL0Bob3N0X21ha2VmaWxlX2ZyYWdAL3IgJGhvc3RfbWFrZWZpbGVfZnJhZwotcyVAaG9zdF9tYWtlZmlsZV9mcmFnQCUlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQExJQk9CSlNAJSRMSUJPQkpTJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBJTlNUQUxMX0RFU1RAJSRJTlNUQUxMX0RFU1QlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi1zcmNkaXI9JHtzcmNkaXJ9Ci1ob3N0PSR7aG9zdH0KLXRhcmdldD0ke3RhcmdldH0KLXdpdGhfdGFyZ2V0X3N1YmRpcj0ke3dpdGhfdGFyZ2V0X3N1YmRpcn0KLXdpdGhfbXVsdGlzdWJkaXI9JHt3aXRoX211bHRpc3ViZGlyfQotYWNfY29uZmlndXJlX2FyZ3M9Ii0tZW5hYmxlLW11bHRpbGliICR7YWNfY29uZmlndXJlX2FyZ3N9IgotQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1saWJpYmVydHlfdG9wZGlyPSR7bGliaWJlcnR5X3RvcGRpcn0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotICAgICMgRklYTUU6IFdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBhY19maWxlCi0gICAgYWNfZmlsZT1NYWtlZmlsZQotICAgIC4gJHtsaWJpYmVydHlfdG9wZGlyfS9jb25maWctbWwuaW4KLSAgZmkKLWZpCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5iYXQgYi9saWJpYmVydHkvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4ODFhYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLUBlY2hvIG9mZg0KLWlmICIlMSIgPT0gImg4LzMwMCIgZ290byBoODMwMA0KLQ0KLWVjaG8gQ29uZmlndXJpbmcgbGliaWJlcnR5IGZvciBnbzMyDQotY29weSBNYWtlZmlsZS5kb3MgTWFrZWZpbGUNCi1lY2hvICNkZWZpbmUgTkVFRF9zeXNfc2lnbGlzdCAxID4+IGNvbmZpZy5oDQotZWNobyAjZGVmaW5lIE5FRURfcHNpZ25hbCAxID4+IGNvbmZpZy5oDQotZ290byBleGl0DQotDQotOmg4MzAwDQotZWNobyBDb25maWd1cmluZyBsaWJpYmVydHkgZm9yIEg4LzMwMA0KLWNvcHkgTWFrZWZpbGUuZG9zIE1ha2VmaWxlDQotDQotOmV4aXQNCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlndXJlLmluIGIvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxY2IwYi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Ci0KLUFDX1BSRVJFUSgyLjEyLjEpCi1BQ19JTklUKHBleGVjdXRlLmMpCi0KLWRubCBXZSB1c2UgdGhlc2Ugb3B0aW9ucyB0byBkZWNpZGUgd2hpY2ggZnVuY3Rpb25zIHRvIGluY2x1ZGUuCi1BQ19BUkdfV0lUSCh0YXJnZXQtc3ViZGlyLAotWyAgLS13aXRoLXRhcmdldC1zdWJkaXI9U1VCRElSICAgICAgQ29uZmlndXJpbmcgaW4gYSBzdWJkaXJlY3RvcnldKQotQUNfQVJHX1dJVEgoY3Jvc3MtaG9zdCwKLVsgIC0td2l0aC1jcm9zcy1ob3N0PUhPU1QgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggYSBjcm9zcyBjb21waWxlcl0pCi1BQ19BUkdfV0lUSChuZXdsaWIsCi1bICAtLXdpdGgtbmV3bGliICAgICAgICAgICAgICAgICAgICBDb25maWd1cmluZyB3aXRoIG5ld2xpYl0pCi0KLWlmIHRlc3QgIiR7c3JjZGlyfSIgPSAiLiI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKLSAgZWxzZQotICAgIGlmIHRlc3QgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iOyB0aGVuCi0gICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uLy4uIgotICAgIGVsc2UKLSAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4iCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgotZmkKLUFDX0NPTkZJR19BVVhfRElSKCRsaWJpYmVydHlfdG9wZGlyKQotCi1BQ19DQU5PTklDQUxfSE9TVAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKGxpYmliZXJ0eSwgMS4wKQotCi1kbmwgVGhlc2UgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTCwgYmVjYXVzZSBpdCBtYXkgd2FudAotZG5sIHRvIGNhbGwgQUNfQ0hFQ0tfUFJPRy4KLUFDX0NIRUNLX1RPT0woQVIsIGFyKQotQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKLQotIyBGSVhNRTogV2UgdGVtcG9yYXJpbHkgZGVmaW5lIG91ciBvd24gdmVyc2lvbiBvZiBBQ19QUk9HX0NDLiAgVGhpcyBpcwotIyBjb3BpZWQgZnJvbSBhdXRvY29uZiAyLjEyLCBidXQgZG9lcyBub3QgY2FsbCBBQ19QUk9HX0NDX1dPUktTLiAgV2UKLSMgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHdoaWNoIHdpbGwgbm90IGJlIGFibGUgdG8gZnVsbHkKLSMgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mCi0jIGl0c2VsZi4KLQotQUNfREVGVU4oTElCX0FDX1BST0dfQ0MsCi1bQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NQUF0pZG5sCi1BQ19QUk9WSURFKFtBQ19QUk9HX0NDXSkKLUFDX0NIRUNLX1BST0coQ0MsIGdjYywgZ2NjKQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBBQ19DSEVDS19QUk9HKENDLCBjYywgY2MsICwgLCAvdXNyL3VjYi9jYykKLSAgdGVzdCAteiAiJENDIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIXSkKLWZpCi0KLUFDX1BST0dfQ0NfR05VCi0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKLWRubCBwbGF5cyBhcm91bmQgd2l0aCBDRkxBR1MgKHN1Y2ggYXMgdG8gYnVpbGQgYm90aCBkZWJ1Z2dpbmcgYW5kCi1kbmwgbm9ybWFsIHZlcnNpb25zIG9mIGEgbGlicmFyeSksIHRhc3RlbGVzcyBhcyB0aGF0IGlkZWEgaXMuCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBBQ19QUk9HX0NDX0cKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdDQz0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi1dKQotCi1MSUJfQUNfUFJPR19DQwotCi1BQ19JU0NfUE9TSVgKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgbGlidG9vbDoKLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLWRubCBBTV9ESVNBQkxFX1NIQVJFRAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBsaWJ0b29sOgotZG5sIEFNX1BST0dfTElCVE9PTAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKLWRubCBBTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLUFDX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKLWRubCBBTV9NQUlOVEFJTkVSX01PREUKLWRubCBBQ19FWEVFWFQKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fUFJPR19JTlNUQUxMCi1BQ19QUk9HX0lOU1RBTEwKLQotLiAke3NyY2Rpcn0vY29uZmlnLnRhYmxlCi1ob3N0X21ha2VmaWxlX2ZyYWc9JHtmcmFnfQotQUNfU1VCU1RfRklMRShob3N0X21ha2VmaWxlX2ZyYWcpCi0KLSMgSXQncyBPSyB0byBjaGVjayBmb3IgaGVhZGVyIGZpbGVzLiAgQWx0aG91Z2ggdGhlIGNvbXBpbGVyIG1heSBub3QgYmUKLSMgYWJsZSB0byBsaW5rIGFueXRoaW5nLCBpdCBoYWQgYmV0dGVyIGJlIGFibGUgdG8gYXQgbGVhc3QgY29tcGlsZQotIyBzb21ldGhpbmcuCi1BQ19DSEVDS19IRUFERVJTKHN5cy9maWxlLmggc3lzL3BhcmFtLmggc3RkbGliLmggc3RyaW5nLmggdW5pc3RkLmggc3RyaW5ncy5oIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgpCi1BQ19IRUFERVJfU1lTX1dBSVQKLQotIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBsaWJpYmVydHkgd2lsbCBwcm92aWRlIGlmIHRoZXkKLSMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlIGhvc3QuCi0KLWZ1bmNzPSJhc3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgYXRleGl0IgotZnVuY3M9IiRmdW5jcyBiYXNlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgYmNtcCIKLWZ1bmNzPSIkZnVuY3MgYmNvcHkiCi1mdW5jcz0iJGZ1bmNzIGJ6ZXJvIgotZnVuY3M9IiRmdW5jcyBjYWxsb2MiCi1mdW5jcz0iJGZ1bmNzIGNsb2NrIgotZnVuY3M9IiRmdW5jcyBnZXRjd2QiCi1mdW5jcz0iJGZ1bmNzIGdldHBhZ2VzaXplIgotZnVuY3M9IiRmdW5jcyBpbmRleCIKLWZ1bmNzPSIkZnVuY3MgaW5zcXVlIgotZnVuY3M9IiRmdW5jcyBtZW1jaHIiCi1mdW5jcz0iJGZ1bmNzIG1lbWNtcCIKLWZ1bmNzPSIkZnVuY3MgbWVtY3B5IgotZnVuY3M9IiRmdW5jcyBtZW1tb3ZlIgotZnVuY3M9IiRmdW5jcyBtZW1zZXQiCi1mdW5jcz0iJGZ1bmNzIG1rc3RlbXBzIgotZnVuY3M9IiRmdW5jcyByYW5kb20iCi1mdW5jcz0iJGZ1bmNzIHJlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgcmluZGV4IgotZnVuY3M9IiRmdW5jcyBzaWdzZXRtYXNrIgotZnVuY3M9IiRmdW5jcyBzdHJjYXNlY21wIgotZnVuY3M9IiRmdW5jcyBzdHJjaHIiCi1mdW5jcz0iJGZ1bmNzIHN0cmR1cCIKLWZ1bmNzPSIkZnVuY3Mgc3RybmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cnJjaHIiCi1mdW5jcz0iJGZ1bmNzIHN0cnN0ciIKLWZ1bmNzPSIkZnVuY3Mgc3RydG9kIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2wiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvdWwiCi1mdW5jcz0iJGZ1bmNzIHRtcG5hbSIKLWZ1bmNzPSIkZnVuY3MgdmFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2ZnByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdnByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdnNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHdhaXRwaWQiCi0KLSMgQWxzbyBpbiB0aGUgb2xkIGZ1bmN0aW9uLmRlZiBmaWxlOiBhbGxvY2EsIHZmb3JrLCBnZXRvcHQuCi0KLXZhcnM9InN5c19lcnJsaXN0IHN5c19uZXJyIHN5c19zaWdsaXN0IgotCi1jaGVja2Z1bmNzPSJnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzIgotCi0jIFRoZXNlIGFyZSBuZWl0aGVyIGV4ZWN1dGVkIG5vciByZXF1aXJlZCwgYnV0IHRoZXkgaGVscCBrZWVwCi0jIGF1dG9oZWFkZXIgaGFwcHkgd2l0aG91dCBhZGRpbmcgYSBidW5jaCBvZiB0ZXh0IHRvIGFjY29uZmlnLmguCi1pZiB0ZXN0ICJ4IiA9ICJ5IjsgdGhlbgotICBBQ19DSEVDS19GVU5DUyhhc3ByaW50ZiBhdGV4aXQgYmFzZW5hbWUgYmNtcCBiY29weSBiemVybyBjYWxsb2MgY2xvY2sgZ2V0Y3dkKQotICBBQ19DSEVDS19GVU5DUyhnZXRwYWdlc2l6ZSBpbmRleCBpbnNxdWUgbWtzdGVtcHMgbWVtY2hyIG1lbWNtcCBtZW1jcHkgbWVtbW92ZSkKLSAgQUNfQ0hFQ0tfRlVOQ1MobWVtc2V0IHJhbmRvbSByZW5hbWUgcmluZGV4IHNpZ3NldG1hc2sgc3RyY2FzZWNtcCkKLSAgQUNfQ0hFQ0tfRlVOQ1Moc3RyY2hyIHN0cmR1cCBzdHJuY2FzZWNtcCBzdHJyY2hyIHN0cnN0ciBzdHJ0b2Qgc3RydG9sKQotICBBQ19DSEVDS19GVU5DUyhzdHJ0b3VsIHRtcG5hbSB2YXNwcmludGYgdmZwcmludGYgdnByaW50ZiB2c3ByaW50ZiB3YWl0cGlkKQotICBBQ19ERUZJTkUoSEFWRV9TWVNfRVJSTElTVCkKLSAgQUNfREVGSU5FKEhBVkVfU1lTX05FUlIpCi0gIEFDX0RFRklORShIQVZFX1NZU19TSUdMSVNUKQotICBBQ19DSEVDS19GVU5DUyhnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzKQotZmkKLQotIyBGb3IgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMsIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgdGhlCi0jIGZ1bmN0aW9uIHdlIHdhbnQgdG8gcHV0IEZOLm8gaW4gTElCT0JKUywgYW5kIGlmIHRoZSBob3N0IGRvZXMKLSMgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIHdlIHdhbnQgdG8gZGVmaW5lIEhBVkVfRk4gaW4gY29uZmlnLmguICBBbHNvLAotIyBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIGFsbG9jYSwgd2Ugc2V0IEFMTE9DQSB0byBhbGxvY2EubwotCi1zZXRvYmpzPQotaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotCi0gICMgV2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgYXMgYSB0YXJnZXQgbGlicmFyeS4gIEFDX1JFUExBQ0VfRlVOQ1MKLSAgIyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkgbm90IGJlIGFibGUgdG8KLSAgIyBsaW5rIGV4ZWN1dGFibGVzLiAgTm90ZSB0aGF0IHdlIG1heSBzdGlsbCBiZSBiZWluZyBjb25maWd1cmVkCi0gICMgbmF0aXZlLgotCi0gICMgSWYgd2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgZm9yIG5ld2xpYiwgd2Uga25vdyB3aGljaCBmdW5jdGlvbnMKLSAgIyBuZXdsaWIgcHJvdmlkZSBhbmQgd2hpY2ggb25lcyB3ZSB3aWxsIGJlIGV4cGVjdGVkIHRvIHByb3ZpZGUuCi0KLSAgaWYgdGVzdCAieCR7d2l0aF9uZXdsaWJ9IiA9ICJ4eWVzIjsgdGhlbgotICAgIEFMTE9DQT0iYWxsb2NhLm8iCi0gICAgTElCT0JKUz0iYXNwcmludGYubyBiYXNlbmFtZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmR1cC5vIHZhc3ByaW50Zi5vIgotCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYXNwcmludGYgfCBiYXNlbmFtZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmR1cCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIEFDX0RFRklORV9VTlFVT1RFRCgkbikKLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBuZXdsaWIgZG9lc250IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCi0gICAgIyBkb250IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBuZXdsaWIgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1IpCi0KLSAgICBzZXRvYmpzPXllcwotCi0gIGZpCi1maQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi12eHdvcmtzKikKLSAgICAjIEhhbmRsZSBWeFdvcmtzIGNvbmZpZ3VyYXRpb24gc3BlY2lhbGx5LCBzaW5jZSBvbiBWeFdvcmtzIHRoZQotICAgICMgbGlicmFyaWVzIGFyZSBhY3R1YWxseSBvbiB0aGUgdGFyZ2V0IGJvYXJkLCBub3QgaW4gdGhlIGZpbGUKLSAgICAjIHN5c3RlbS4KLSAgICBMSUJPQkpTPSJiYXNlbmFtZS5vIGdldHBhZ2VzaXplLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyY2FzZWNtcC5vIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHN0cm5jYXNlY21wLm8gc3RyZHVwLm8gdmZvcmsubyB3YWl0cGlkLm8gdmFzcHJpbnRmLm8iCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYmFzZW5hbWUgfCBnZXRwYWdlc2l6ZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmNhc2VjbXApCi0JICA7OwotCXN0cm5jYXNlY21wIHwgc3RyZHVwIHwgdmZvcmsgfCB3YWl0cGlkIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFZ4V29ya3MgZG9lc24ndCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIFZ4V29ya3Mgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1IpCi0KLSAgICBzZXRvYmpzPXllcwotICAgIDs7Ci0KLSAgZXNhYwotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLQotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi1jeWd3aW4qKQotICAgICMgVGhlIEN5Z3dpbiBsaWJyYXJ5IGFjdHVhbGx5IHVzZXMgYSBjb3VwbGUgb2YgZmlsZXMgZnJvbQotICAgICMgbGliaWJlcnR5IHdoZW4gaXQgaXMgYnVpbHQuICBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBuYXRpdmUKLSAgICAjIEN5Z3dpbiwgYW5kIHdlIHJ1biB0aGUgdGVzdHMsIHdlIHdpbGwgYXBwZWFyIHRvIGhhdmUgdGhlc2UKLSAgICAjIGZpbGVzLiAgSG93ZXZlciwgd2hlbiB3ZSBnbyBvbiB0byBidWlsZCB3aW5zdXAsIHdlIHdpbGwgd2luZCB1cAotICAgICMgd2l0aCBhIGxpYnJhcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgZmlsZXMsIHNpbmNlIHRoZXkgc2hvdWxkCi0gICAgIyBoYXZlIGNvbWUgZnJvbSBsaWJpYmVydHkuCi0KLSAgICAjIFdlIGhhbmRsZSB0aGlzIGJ5IHJlbW92aW5nIHRoZSBmdW5jdGlvbnMgdGhlIHdpbnN1cCBsaWJyYXJ5Ci0gICAgIyBwcm92aWRlcyBmcm9tIG91ciBzaGVsbCB2YXJpYWJsZXMsIHNvIHRoYXQgdGhleSBhcHBlYXIgdG8gYmUKLSAgICAjIG1pc3NpbmcuCi0KLSAgICBmdW5jcz0iYGVjaG8gJGZ1bmNzIHwgc2VkIC1lICdzL3JhbmRvbS8vJ2AiCi0gICAgTElCT0JKUz0iJExJQk9CSlMgcmFuZG9tLm8iCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX3NpZ2xpc3QvLydgIgotICAgIGNoZWNrZnVuY3M9ImBlY2hvICRjaGVja2Z1bmNzIHwgc2VkIC1lICdzL3N0cnNpZ25hbC8vJyAtZSAncy9wc2lnbmFsLy8nYCIKLSAgICA7OwotCi0gICotKi1taW5ndzMyKikKLSAgICAjIFVuZGVyIG1pbmd3MzIsIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCBleGlzdCwgYnV0IHRoZXkgYXJlCi0gICAgIyBtYWNyb3MsIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfbmVyci8vJyAtZSAncy9zeXNfZXJybGlzdC8vJ2AiCi0gICAgQUNfREVGSU5FKEhBVkVfU1lTX05FUlIpCi0gICAgQUNfREVGSU5FKEhBVkVfU1lTX0VSUkxJU1QpCi0gICAgOzsKLQotICAqLSotdXdpbiopCi0gICAgIyBVbmRlciBzb21lIHZlcnNpb25zIG9mIHV3aW4sIHZmb3JrIGlzIG5vdG9yaW91c2x5IGJ1Z2d5IGFuZCB0aGUgdGVzdCAKLSAgICAjIGNhbiBoYW5nIGNvbmZpZ3VyZTsgb24gb3RoZXIgdmVyc2lvbnMsIHZmb3JrIGV4aXN0cyBqdXN0IGFzIGEgc3R1Yi4KLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdmZvcmsgaW4gdXdpbidzIHJ1bnRpbWUgaXMgZml4ZWQuCi0gICAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubwotICAgIDs7Ci0KLSAgZXNhYwotCi0gICMgV2UgaGF2ZW4ndCBzZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB5ZXQuICBVc2UgdGhlIHN0YW5kYXJkIGF1dG9jb25mCi0gICMgdGVzdHMuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBjb21waWxlciB3b3Jrcy4KLSAgQUNfUFJPR19DQ19XT1JLUwotICBBQ19SRVBMQUNFX0ZVTkNTKCRmdW5jcykKLSAgQUNfRlVOQ19BTExPQ0EKLSAgQUNfRlVOQ19WRk9SSwotICBpZiB0ZXN0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzID0gbm87IHRoZW4KLSAgICBMSUJPQkpTPSIkTElCT0JKUyB2Zm9yay5vIgotICBmaQotICBmb3IgdiBpbiAkdmFyczsgZG8KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkdl0pCi0gICAgQUNfQ0FDSEVfVkFMKGxpYmliZXJ0eV9jdl92YXJfJHYsCi0gICAgICBbQUNfVFJZX0xJTksoW2ludCAqcDtdLCBbZXh0ZXJuIGludCAkdjsgcCA9ICYkdjtdLAotCQkgICBbZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj15ZXMiXSwKLQkJICAgW2V2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9bm8iXSldKQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGxpYmliZXJ0eV9jdl92YXJfJyR2YFwiID0geWVzIjsgdGhlbgotICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gICAgICBuPUhBVkVfYGVjaG8gJHYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gICAgICBBQ19ERUZJTkVfVU5RVU9URUQoJG4pCi0gICAgZWxzZQotICAgICAgQUNfTVNHX1JFU1VMVChubykKLSAgICBmaQotICBkb25lCi0gIEFDX0NIRUNLX0ZVTkNTKCRjaGVja2Z1bmNzKQotZmkKLQotIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gJCh0b29sZGlyKSByYXRoZXIKLSMgdGhhbiAkKGxpYmRpcikuCi1pZiB0ZXN0IC16ICIke3dpdGhfY3Jvc3NfaG9zdH0iOyB0aGVuCi0gIElOU1RBTExfREVTVD1saWJkaXIKLWVsc2UKLSAgSU5TVEFMTF9ERVNUPXRvb2xkaXIKLWZpCi1BQ19TVUJTVChJTlNUQUxMX0RFU1QpCi0KLSMgV2UgbmVlZCBtdWx0aWxpYiBzdXBwb3J0LCBidXQgb25seSBpZiBjb25maWd1cmluZyBmb3IgdGhlIHRhcmdldC4KLUFDX09VVFBVVChNYWtlZmlsZSwKLVt0ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotICAgICMgRklYTUU6IFdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBhY19maWxlCi0gICAgYWNfZmlsZT1NYWtlZmlsZQotICAgIC4gJHtsaWJpYmVydHlfdG9wZGlyfS9jb25maWctbWwuaW4KLSAgZmkKLWZpXSwKLXNyY2Rpcj0ke3NyY2Rpcn0KLWhvc3Q9JHtob3N0fQotdGFyZ2V0PSR7dGFyZ2V0fQotd2l0aF90YXJnZXRfc3ViZGlyPSR7d2l0aF90YXJnZXRfc3ViZGlyfQotd2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9Ci1hY19jb25maWd1cmVfYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHthY19jb25maWd1cmVfYXJnc30iCi1DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWxpYmliZXJ0eV90b3BkaXI9JHtsaWJpYmVydHlfdG9wZGlyfQotKQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvcHlzaWduLmMgYi9saWJpYmVydHkvY29weXNpZ24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1ZjhjMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29weXNpZ24uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotI2lmZGVmIF9fSUVFRV9CSUdfRU5ESUFOCi0KLXR5cGVkZWYgdW5pb24gCi17Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDo0OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24zOjE2OwotICAgIAotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDozOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24zOjE2OwotICB9IG5hbjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBtc3c7Ci0gICAgdW5zaWduZWQgbG9uZyBsc3c7Ci0gIH0gcGFydHM7Ci0gICAgbG9uZyBhc2xvbmdbMl07Ci19IF9faWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKLQotI2VuZGlmCi0KLSNpZmRlZiBfX0lFRUVfTElUVExFX0VORElBTgotCi10eXBlZGVmIHVuaW9uIAotewotICBkb3VibGUgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotI2lmZGVmIF9fU01BTExfQklURklFTERTCi0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMzoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNDsKLSNlbHNlCi0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMTozMjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOjIwOwotI2VuZGlmCi0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50IDoxMTsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiAgICAgOiAxOwotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0jaWZkZWYgX19TTUFMTF9CSVRGSUVMRFMKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24zOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjM7Ci0jZWxzZQotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MzI7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDoxOTsKLSNlbmRpZgotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICB9IG5hbjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBsc3c7Ci0gICAgdW5zaWduZWQgbG9uZyBtc3c7Ci0gIH0gcGFydHM7Ci0KLSAgbG9uZyBhc2xvbmdbMl07Ci0KLX0gX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fSUVFRV9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uCi17Ci0gIGZsb2F0IHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiA4OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMTogMTY7Ci0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbjoxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDo4OwotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6NjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICB9IG5hbjsKLSAgbG9uZyBwMTsKLSAgCi19IF9faWVlZV9mbG9hdF9zaGFwZV90eXBlOwotI2VuZGlmCi0KLSNpZmRlZiBfX0lFRUVfTElUVExFX0VORElBTgotdHlwZWRlZiB1bmlvbgotewotICBmbG9hdCB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNzsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOiAxNjsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDg7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjY7Ci0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7Ci0gICAgdW5zaWduZWQgaW50IHNpZ246MTsKLSAgfSBuYW47Ci0gIGxvbmcgcDE7Ci0gIAotfSBfX2llZWVfZmxvYXRfc2hhcGVfdHlwZTsKLSNlbmRpZgotCi0KLWRvdWJsZSBERUZVTihjb3B5c2lnbiwgKHgsIHkpLCBkb3VibGUgeCBBTkQgZG91YmxlIHkpCi17Ci0gIF9faWVlZV9kb3VibGVfc2hhcGVfdHlwZSBhLGI7Ci0gIGIudmFsdWUgPSB5OyAgCi0gIGEudmFsdWUgPSB4OwotICBhLm51bWJlci5zaWduID1iLm51bWJlci5zaWduOwotICByZXR1cm4gYS52YWx1ZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyBiL2xpYmliZXJ0eS9jcGx1cy1kZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlZjU2YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY3BsdXMtZGVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEwICswLDAgQEAKLS8qIERlbWFuZ2xlciBmb3IgR05VIEMrKwotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEphbWVzIENsYXJrIChqamNAamNsYXJrLnV1Y3ApCi0gICBSZXdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkgZm9yIEFSTSBhbmQgTHVjaWQgZGVtYW5nbGluZwotICAgTW9kaWZpZWQgYnkgU2F0aXNoIFBhaSAocGFpQGFwb2xsby5ocC5jb20pIGZvciBIUCBkZW1hbmdsaW5nCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZXhwb3J0cyB0d28gZnVuY3Rpb25zOyBjcGx1c19tYW5nbGVfb3BuYW1lIGFuZCBjcGx1c19kZW1hbmdsZS4KLQotICAgVGhpcyBmaWxlIGltcG9ydHMgeG1hbGxvYyBhbmQgeHJlYWxsb2MsIHdoaWNoIGFyZSBsaWtlIG1hbGxvYyBhbmQKLSAgIHJlYWxsb2MgZXhjZXB0IHRoYXQgdGhleSBnZW5lcmF0ZSBhIGZhdGFsIGVycm9yIGlmIHRoZXJlIGlzIG5vCi0gICBhdmFpbGFibGUgbWVtb3J5LiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGJvdGggR0NDIGFuZCBsaWJpYmVydHkuICBXaGVuIG1ha2luZyBjaGFuZ2VzLCBwbGVhc2UKLSAgIHRyeSBub3QgdG8gYnJlYWsgZWl0aGVyLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKiBtYWxsb2MgKCk7Ci1jaGFyICogcmVhbGxvYyAoKTsKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZGVtYW5nbGUuaD4KLSN1bmRlZiBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUKLSNkZWZpbmUgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFIHdvcmstPm9wdGlvbnMKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqbXlzdHJzdHIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbXlzdHJzdHIgKHMxLCBzMikKLSAgICAgY29uc3QgY2hhciAqczEsICpzMjsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IHMxOwotICByZWdpc3RlciBpbnQgbGVuID0gc3RybGVuIChzMik7Ci0KLSAgZm9yICg7IChwID0gc3RyY2hyIChwLCAqczIpKSAhPSAwOyBwKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHAsIHMyLCBsZW4pID09IDApCi0JewotCSAgcmV0dXJuIChwKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0vKiBJbiBvcmRlciB0byBhbGxvdyBhIHNpbmdsZSBkZW1hbmdsZXIgZXhlY3V0YWJsZSB0byBkZW1hbmdsZSBzdHJpbmdzCi0gICB1c2luZyB2YXJpb3VzIGNvbW1vbiB2YWx1ZXMgb2YgQ1BMVVNfTUFSS0VSLCBhcyB3ZWxsIGFzIGFueSBzcGVjaWZpYwotICAgb25lIHNldCBhdCBjb21waWxlIHRpbWUsIHdlIG1haW50YWluIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZQotICAgY29tbW9ubHkgdXNlZCBvbmVzLCBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZSBtYXJrZXIgd2UgYXJlIGxvb2tpbmcgZm9yCi0gICBpcyBpbiB0aGF0IHN0cmluZy4gIENQTFVTX01BUktFUiBpcyB1c3VhbGx5ICckJyBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICAgYXNzZW1ibGVyIGNhbiBkZWFsIHdpdGggdGhhdC4gIFdoZXJlIHRoZSBhc3NlbWJsZXIgY2FuJ3QsIGl0J3MgdXN1YWxseQotICAgJy4nIChidXQgb24gbWFueSBzeXN0ZW1zICcuJyBpcyB1c2VkIGZvciBvdGhlciB0aGluZ3MpLiAgV2UgcHV0IHRoZQotICAgY3VycmVudCBkZWZpbmVkIENQTFVTX01BUktFUiBmaXJzdCAod2hpY2ggZGVmYXVsdHMgdG8gJyQnKSwgZm9sbG93ZWQKLSAgIGJ5IHRoZSBuZXh0IG1vc3QgY29tbW9uIHZhbHVlLCBmb2xsb3dlZCBieSBhbiBleHBsaWNpdCAnJCcgaW4gY2FzZQotICAgdGhlIHZhbHVlIG9mIENQTFVTX01BUktFUiBpcyBub3QgJyQnLgotCi0gICBXZSBjb3VsZCBhdm9pZCB0aGlzIGlmIHdlIGNvdWxkIGp1c3QgZ2V0IGcrKyB0byB0ZWxsIHVzIHdoYXQgdGhlIGFjdHVhbAotICAgY3BsdXMgbWFya2VyIGNoYXJhY3RlciBpcyBhcyBwYXJ0IG9mIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiwgcGVyaGFwcyBieQotICAgZW5zdXJpbmcgdGhhdCBpdCBpcyB0aGUgY2hhcmFjdGVyIHRoYXQgdGVybWluYXRlcyB0aGUgZ2NjPG4+X2NvbXBpbGVkCi0gICBtYXJrZXIgc3ltYm9sIChGSVhNRSkuICAqLwotCi0jaWYgIWRlZmluZWQgKENQTFVTX01BUktFUikKLSNkZWZpbmUgQ1BMVVNfTUFSS0VSICckJwotI2VuZGlmCi0KLWVudW0gZGVtYW5nbGluZ19zdHlsZXMgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gZ251X2RlbWFuZ2xpbmc7Ci0KLXN0YXRpYyBjaGFyIGNwbHVzX21hcmtlcnNbXSA9IHsgQ1BMVVNfTUFSS0VSLCAnLicsICckJywgJ1wwJyB9OwotCi1zdGF0aWMgY2hhciBjaGFyX3N0clsyXSA9IHsgJ1wwMDAnLCAnXDAwMCcgfTsKLQotdm9pZAotc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyAoY2gpCi0gICAgIGludCBjaDsKLXsKLSAgY3BsdXNfbWFya2Vyc1swXSA9IGNoOwotfQotCi10eXBlZGVmIHN0cnVjdCBzdHJpbmcJCS8qIEJld2FyZTogdGhlc2UgYXJlbid0IHJlcXVpcmVkIHRvIGJlICovCi17CQkJCS8qICAnXDAnIHRlcm1pbmF0ZWQuICAqLwotICBjaGFyICpiOwkJCS8qIHBvaW50ZXIgdG8gc3RhcnQgb2Ygc3RyaW5nICovCi0gIGNoYXIgKnA7CQkJLyogcG9pbnRlciBhZnRlciBsYXN0IGNoYXJhY3RlciAqLwotICBjaGFyICplOwkJCS8qIHBvaW50ZXIgYWZ0ZXIgZW5kIG9mIGFsbG9jYXRlZCBzcGFjZSAqLwotfSBzdHJpbmc7Ci0KLS8qIFN0dWZmIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gc3ViLXJvdXRpbmVzLgotICAgVXNpbmcgYSBzaGFyZWQgc3RydWN0dXJlIGFsbG93cyBjcGx1c19kZW1hbmdsZSB0byBiZSByZWVudHJhbnQuICAqLwotCi1zdHJ1Y3Qgd29ya19zdHVmZgotewotICBpbnQgb3B0aW9uczsKLSAgY2hhciAqKnR5cGV2ZWM7Ci0gIGNoYXIgKiprdHlwZXZlYzsKLSAgY2hhciAqKmJ0eXBldmVjOwotICBpbnQgbnVtazsKLSAgaW50IG51bWI7Ci0gIGludCBrc2l6ZTsKLSAgaW50IGJzaXplOwotICBpbnQgbnR5cGVzOwotICBpbnQgdHlwZXZlY19zaXplOwotICBpbnQgY29uc3RydWN0b3I7Ci0gIGludCBkZXN0cnVjdG9yOwotICBpbnQgc3RhdGljX3R5cGU7CS8qIEEgc3RhdGljIG1lbWJlciBmdW5jdGlvbiAqLwotICBpbnQgdGVtcF9zdGFydDsgICAgICAgLyogaW5kZXggaW4gZGVtYW5nbGVkIHRvIHN0YXJ0IG9mIHRlbXBsYXRlIGFyZ3MgKi8KLSAgaW50IHR5cGVfcXVhbHM7ICAgICAgIC8qIFRoZSB0eXBlIHF1YWxpZmllcnMuICAqLwotICBpbnQgZGxsaW1wb3J0ZWQ7CS8qIFN5bWJvbCBpbXBvcnRlZCBmcm9tIGEgUEUgRExMICovCi0gIGNoYXIgKip0bXBsX2FyZ3ZlYzsgICAvKiBUZW1wbGF0ZSBmdW5jdGlvbiBhcmd1bWVudHMuICovCi0gIGludCBudG1wbF9hcmdzOyAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRlbXBsYXRlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gKi8KLSAgaW50IGZvcmdldHRpbmdfdHlwZXM7IC8qIE5vbnplcm8gaWYgd2UgYXJlIG5vdCByZW1lbWJlcmluZyB0aGUgdHlwZXMKLQkJCSAgIHdlIHNlZS4gICovCi0gIHN0cmluZyogcHJldmlvdXNfYXJndW1lbnQ7IC8qIFRoZSBsYXN0IGZ1bmN0aW9uIGFyZ3VtZW50IGRlbWFuZ2xlZC4gICovCi0gIGludCBucmVwZWF0czsgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgcHJldmlvdXMKLQkJCSAgIGFyZ3VtZW50LiAgKi8KLX07Ci0KLSNkZWZpbmUgUFJJTlRfQU5TSV9RVUFMSUZJRVJTICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX0FOU0kpCi0jZGVmaW5lIFBSSU5UX0FSR19UWVBFUyAgICAgICAod29yayAtPiBvcHRpb25zICYgRE1HTF9QQVJBTVMpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0YWJsZQotewotICBjb25zdCBjaGFyICppbjsKLSAgY29uc3QgY2hhciAqb3V0OwotICBpbnQgZmxhZ3M7Ci19IG9wdGFibGVbXSA9IHsKLSAgeyJudyIsCSAgIiBuZXciLAlETUdMX0FOU0l9LAkvKiBuZXcgKDEuOTIsCSBhbnNpKSAqLwotICB7ImRsIiwJICAiIGRlbGV0ZSIsCURNR0xfQU5TSX0sCS8qIG5ldyAoMS45MiwJIGFuc2kpICovCi0gIHsibmV3IiwJICAiIG5ldyIsCTB9LAkJLyogb2xkICgxLjkxLAkgYW5kIDEueCkgKi8KLSAgeyJkZWxldGUiLAkgICIgZGVsZXRlIiwJMH0sCQkvKiBvbGQgKDEuOTEsCSBhbmQgMS54KSAqLwotICB7InZuIiwJICAiIG5ldyBbXSIsCURNR0xfQU5TSX0sCS8qIEdOVSwgcGVuZGluZyBhbnNpICovCi0gIHsidmQiLAkgICIgZGVsZXRlIFtdIiwJRE1HTF9BTlNJfSwJLyogR05VLCBwZW5kaW5nIGFuc2kgKi8KLSAgeyJhcyIsCSAgIj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im5lIiwJICAiIT0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLCBhbnNpICovCi0gIHsiZXEiLAkgICI9PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJnZSIsCSAgIj49IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7Imd0IiwJICAiPiIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJsZSIsCSAgIjw9IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7Imx0IiwJICAiPCIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJwbHVzIiwJICAiKyIsCQkwfSwJCS8qIG9sZCAqLwotICB7InBsIiwJICAiKyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYXBsIiwJICAiKz0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im1pbnVzIiwJICAiLSIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1pIiwJICAiLSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW1pIiwJICAiLT0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im11bHQiLAkgICIqIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWwiLAkgICIqIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbXUiLAkgICIqPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpIChBUk0vTHVjaWQpICovCi0gIHsiYW1sIiwJICAiKj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAoR05VL2crKykgKi8KLSAgeyJjb252ZXJ0IiwJICAiKyIsCQkwfSwJCS8qIG9sZCAodW5hcnkgKykgKi8KLSAgeyJuZWdhdGUiLAkgICItIiwJCTB9LAkJLyogb2xkICh1bmFyeSAtKSAqLwotICB7InRydW5jX21vZCIsCSAgIiUiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtZCIsCSAgIiUiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFtZCIsCSAgIiU9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnVuY19kaXYiLAkgICIvIiwJCTB9LAkJLyogb2xkICovCi0gIHsiZHYiLAkgICIvIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhZHYiLAkgICIvPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1dGhfYW5kaWYiLCAiJiYiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJhYSIsCSAgIiYmIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnV0aF9vcmlmIiwgICJ8fCIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im9vIiwJICAifHwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydXRoX25vdCIsCSAgIiEiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJudCIsCSAgIiEiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InBvc3RpbmNyZW1lbnQiLCIrKyIsCTB9LAkJLyogb2xkICovCi0gIHsicHAiLAkgICIrKyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsicG9zdGRlY3JlbWVudCIsIi0tIiwJMH0sCQkvKiBvbGQgKi8KLSAgeyJtbSIsCSAgIi0tIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfaW9yIiwJICAifCIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im9yIiwJICAifCIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW9yIiwJICAifD0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF94b3IiLAkgICJeIiwJCTB9LAkJLyogb2xkICovCi0gIHsiZXIiLAkgICJeIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhZXIiLAkgICJePSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X2FuZCIsCSAgIiYiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJhZCIsCSAgIiYiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFhZCIsCSAgIiY9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfbm90IiwJICAifiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNvIiwJICAifiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY2FsbCIsCSAgIigpIiwJCTB9LAkJLyogb2xkICovCi0gIHsiY2wiLAkgICIoKSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWxzaGlmdCIsCSAgIjw8IiwJCTB9LAkJLyogb2xkICovCi0gIHsibHMiLAkgICI8PCIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWxzIiwJICAiPDw9IiwJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFyc2hpZnQiLAkgICI+PiIsCQkwfSwJCS8qIG9sZCAqLwotICB7InJzIiwJICAiPj4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFycyIsCSAgIj4+PSIsCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjb21wb25lbnQiLAkgICItPiIsCQkwfSwJCS8qIG9sZCAqLwotICB7InB0IiwJICAiLT4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaTsgTHVjaWQgQysrIGZvcm0gKi8KLSAgeyJyZiIsCSAgIi0+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2k7IEFSTS9HTlUgZm9ybSAqLwotICB7ImluZGlyZWN0IiwJICAiKiIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1ldGhvZF9jYWxsIiwgICItPigpIiwJMH0sCQkvKiBvbGQgKi8KLSAgeyJhZGRyIiwJICAiJiIsCQkwfSwJCS8qIG9sZCAodW5hcnkgJikgKi8KLSAgeyJhcnJheSIsCSAgIltdIiwJCTB9LAkJLyogb2xkICovCi0gIHsidmMiLAkgICJbXSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY29tcG91bmQiLAkgICIsICIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNtIiwJICAiLCAiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNvbmQiLAkgICI/OiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNuIiwJICAiPzoiLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJtYXgiLAkgICI+PyIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im14IiwJICAiPj8iLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJtaW4iLAkgICI8PyIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1uIiwJICAiPD8iLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJub3AiLAkgICIiLAkJMH0sCQkvKiBvbGQgKGZvciBvcGVyYXRvcj0pICovCi0gIHsicm0iLAkgICItPioiLAlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsic3oiLCAgICAgICAgICAic2l6ZW9mICIsICAgIERNR0xfQU5TSX0gICAgICAvKiBwc2V1ZG8tYW5zaSAqLwotfTsKLQotLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGluZGljYXRlIHRoZSB2YXJpb3VzIHR5cGUgdmFyaWV0aWVzLgotICAgVGhleSBhcmUgYWxsIG5vbi16ZXJvIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhcyBgc3VjY2VzcycKLSAgIHZhbHVlcy4gICovCi10eXBlZGVmIGVudW0gdHlwZV9raW5kX3QKLXsKLSAgdGtfbm9uZSwKLSAgdGtfcG9pbnRlciwKLSAgdGtfcmVmZXJlbmNlLAotICB0a19pbnRlZ3JhbCwKLSAgdGtfYm9vbCwKLSAgdGtfY2hhciwKLSAgdGtfcmVhbAotfSB0eXBlX2tpbmRfdDsKLQotI2RlZmluZSBTVFJJTkdfRU1QVFkoc3RyKQkoKHN0cikgLT4gYiA9PSAoc3RyKSAtPiBwKQotI2RlZmluZSBQUkVQRU5EX0JMQU5LKHN0cikJe2lmICghU1RSSU5HX0VNUFRZKHN0cikpIFwKLSAgICBzdHJpbmdfcHJlcGVuZChzdHIsICIgIik7fQotI2RlZmluZSBBUFBFTkRfQkxBTksoc3RyKQl7aWYgKCFTVFJJTkdfRU1QVFkoc3RyKSkgXAotICAgIHN0cmluZ19hcHBlbmQoc3RyLCAiICIpO30KLSNkZWZpbmUgTEVOX1NUUklORyhzdHIpICAgICAgICAgKCAoU1RSSU5HX0VNUFRZKHN0cikpPzA6KChzdHIpLT5wIC0gKHN0ciktPmIpKQotCi0vKiBUaGUgc2NvcGUgc2VwYXJhdG9yIGFwcHJvcHJpYXRlIGZvciB0aGUgbGFuZ3VhZ2UgYmVpbmcgZGVtYW5nbGVkLiAgKi8KLQotI2RlZmluZSBTQ09QRV9TVFJJTkcod29yaykgKCh3b3JrLT5vcHRpb25zICYgRE1HTF9KQVZBKSA/ICIuIiA6ICI6OiIpCi0KLSNkZWZpbmUgQVJNX1ZUQUJMRV9TVFJJTkcgIl9fdnRibF9fIgkvKiBMdWNpZC9BUk0gdmlydHVhbCB0YWJsZSBwcmVmaXggKi8KLSNkZWZpbmUgQVJNX1ZUQUJMRV9TVFJMRU4gOAkJLyogc3RybGVuIChBUk1fVlRBQkxFX1NUUklORykgKi8KLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBjaGFyICoKLW1vcF91cCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBzdHJpbmcgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zcXVhbmdsZV9tb3BfdXAgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi0jaWYgMAotc3RhdGljIGludAotZGVtYW5nbGVfbWV0aG9kX2FyZ3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqCi1pbnRlcm5hbF9jcGx1c19kZW1hbmdsZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywKLQkJCQkJIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKLQkJCSAgIHN0cmluZyAqLCBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50Ci1hcm1fcHQgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiosCi0JCWNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3NfbmFtZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9xdWFsaWZpZWQgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCi0JCQkgICAgaW50LCBpbnQpKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfZnVuZF90eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3NpZ25hdHVyZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9wcmVmaXggUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZ251X3NwZWNpYWwgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotYXJtX3NwZWNpYWwgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19uZWVkIFBBUkFNUyAoKHN0cmluZyAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19kZWxldGUgUEFSQU1TICgoc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19pbml0IFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfY2xlYXIgUEFSQU1TICgoc3RyaW5nICopKTsKLQotI2lmIDAKLXN0YXRpYyBpbnQKLXN0cmluZ19lbXB0eSBQQVJBTVMgKChzdHJpbmcgKikpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRzIFBBUkFNUyAoKHN0cmluZyAqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZG4gUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZCBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZG4gUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWdldF9jb3VudCBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBpbnQgKikpOwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIFBBUkFNUyAoKGNvbnN0IGNoYXIqKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX25lc3RlZF9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmKiwgY29uc3QgY2hhcioqLCBzdHJpbmcqKSk7Ci0KLXN0YXRpYyBpbnQKLWRvX3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZG9fYXJnIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLAotCQkJCWNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfQnR5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9CdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9LdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotZm9yZ2V0X3R5cGVzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotc3RhdGljIHZvaWQKLWZvcmdldF9CX2FuZF9LX3R5cGVzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kcyBQQVJBTVMgKChzdHJpbmcgKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiosIGNvbnN0IGNoYXIqKiwKLQkJCQkgICAgICBzdHJpbmcqLCB0eXBlX2tpbmRfdCkpOwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLXNuYXJmX251bWVyaWNfbGl0ZXJhbCBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi0vKiBUaGVyZSBpcyBhIFRZUEVfUVVBTCB2YWx1ZSBmb3IgZWFjaCB0eXBlIHF1YWxpZmllci4gIFRoZXkgY2FuIGJlCi0gICBjb21iaW5lZCBieSBiaXR3aXNlLW9yIHRvIGZvcm0gdGhlIGNvbXBsZXRlIHNldCBvZiBxdWFsaWZpZXJzIGZvciBhCi0gICB0eXBlLiAgKi8KLQotI2RlZmluZSBUWVBFX1VOUVVBTElGSUVEICAgMHgwCi0jZGVmaW5lIFRZUEVfUVVBTF9DT05TVCAgICAweDEKLSNkZWZpbmUgVFlQRV9RVUFMX1ZPTEFUSUxFIDB4MgotI2RlZmluZSBUWVBFX1FVQUxfUkVTVFJJQ1QgMHg0Ci0KLXN0YXRpYyBpbnQKLWNvZGVfZm9yX3F1YWxpZmllciBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqCi1xdWFsaWZpZXJfc3RyaW5nIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY29uc3QgY2hhcioKLWRlbWFuZ2xlX3F1YWxpZmllciBQQVJBTVMgKChpbnQpKTsKLQotLyogVHJhbnNsYXRlIGNvdW50IHRvIGludGVnZXIsIGNvbnN1bWluZyB0b2tlbnMgaW4gdGhlIHByb2Nlc3MuCi0gICBDb252ZXJzaW9uIHRlcm1pbmF0ZXMgb24gdGhlIGZpcnN0IG5vbi1kaWdpdCBjaGFyYWN0ZXIuCi0KLSAgIFRyeWluZyB0byBjb25zdW1lIHNvbWV0aGluZyB0aGF0IGlzbid0IGEgY291bnQgcmVzdWx0cyBpbiBubwotICAgY29uc3VtcHRpb24gb2YgaW5wdXQgYW5kIGEgcmV0dXJuIG9mIC0xLgotCi0gICBPdmVyZmxvdyBjb25zdW1lcyB0aGUgcmVzdCBvZiB0aGUgZGlnaXRzLCBhbmQgcmV0dXJucyAtMS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnQgKHR5cGUpCi0gICAgIGNvbnN0IGNoYXIgKip0eXBlOwotewotICBpbnQgY291bnQgPSAwOwotCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotICAgIHsKLSAgICAgIGNvdW50ICo9IDEwOwotCi0gICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0JIFdlIGFzc3VtZSB0aGF0IGNvdW50IGlzIHJlcHJlc2VudGVkIHVzaW5nIHR3bydzLWNvbXBsZW1lbnQ7Ci0JIG5vIHBvd2VyIG9mIHR3byBpcyBkaXZpc2libGUgYnkgdGVuLCBzbyBpZiBhbiBvdmVyZmxvdyBvY2N1cnMKLQkgd2hlbiBtdWx0aXBseWluZyBieSB0ZW4sIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgYSBtdWx0aXBsZSBvZgotCSB0ZW4uICAqLwotICAgICAgaWYgKChjb3VudCAlIDEwKSAhPSAwKQotCXsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKip0eXBlKSkKLQkgICAgKCp0eXBlKSsrOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgY291bnQgKz0gKip0eXBlIC0gJzAnOwotICAgICAgKCp0eXBlKSsrOwotICAgIH0KLQotICByZXR1cm4gKGNvdW50KTsKLX0KLQotCi0vKiBMaWtlIGNvbnN1bWVfY291bnQsIGJ1dCBmb3IgY291bnRzIHRoYXQgYXJlIHByZWNlZGVkIGFuZCBmb2xsb3dlZAotICAgYnkgJ18nIGlmIHRoZXkgYXJlIGdyZWF0ZXIgdGhhbiAxMC4gIEFsc28sIC0xIGlzIHJldHVybmVkIGZvcgotICAgZmFpbHVyZSwgc2luY2UgMCBjYW4gYmUgYSB2YWxpZCB2YWx1ZS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci17Ci0gIGludCBpZHg7Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0gICAgewotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXJldHVybiAtMTsKLQotICAgICAgaWR4ID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkvKiBUaGUgdHJhaWxpbmcgdW5kZXJzY29yZSB3YXMgbWlzc2luZy4gKi8KLQlyZXR1cm4gLTE7Ci0KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKiptYW5nbGVkIDwgJzAnIHx8ICoqbWFuZ2xlZCA+ICc5JykKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlkeCA9ICoqbWFuZ2xlZCAtICcwJzsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogQyBpcyB0aGUgY29kZSBmb3IgYSB0eXBlLXF1YWxpZmllci4gIFJldHVybiB0aGUgVFlQRV9RVUFMCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcXVhbGlmaWVyLiAgKi8KLQotc3RhdGljIGludAotY29kZV9mb3JfcXVhbGlmaWVyIChjKQotICBpbnQgYzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdDJzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfQ09OU1Q7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfVk9MQVRJTEU7Ci0KLSAgICBjYXNlICd1JzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfUkVTVFJJQ1Q7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEMgd2FzIGFuIGludmFsaWQgcXVhbGlmaWVyLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHF1YWxpZmllcnMgZ2l2ZW4gYnkKLSAgIFRZUEVfUVVBTFMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhcioKLXF1YWxpZmllcl9zdHJpbmcgKHR5cGVfcXVhbHMpCi0gICAgIGludCB0eXBlX3F1YWxzOwotewotICBzd2l0Y2ggKHR5cGVfcXVhbHMpCi0gICAgewotICAgIGNhc2UgVFlQRV9VTlFVQUxJRklFRDoKLSAgICAgIHJldHVybiAiIjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUOgotICAgICAgcmV0dXJuICJjb25zdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9WT0xBVElMRToKLSAgICAgIHJldHVybiAidm9sYXRpbGUiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gIl9fcmVzdHJpY3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1QgfCBUWVBFX1FVQUxfVk9MQVRJTEU6Ci0gICAgICByZXR1cm4gImNvbnN0IHZvbGF0aWxlIjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJjb25zdCBfX3Jlc3RyaWN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX1ZPTEFUSUxFIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJ2b2xhdGlsZSBfX3Jlc3RyaWN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1ZPTEFUSUxFIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJjb25zdCB2b2xhdGlsZSBfX3Jlc3RyaWN0IjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVFlQRV9RVUFMUyB3YXMgYW4gaW52YWxpZCBxdWFsaWZpZXIgc2V0LiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIEMgaXMgdGhlIGNvZGUgZm9yIGEgdHlwZS1xdWFsaWZpZXIuICBSZXR1cm4gdGhlIHN0cmluZwotICAgY29ycmVzcG9uZGluZyB0byB0aGlzIHF1YWxpZmllci4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUKLSAgIGNhbGxlZCB3aXRoIGEgdmFsaWQgcXVhbGlmaWVyIGNvZGUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhcioKLWRlbWFuZ2xlX3F1YWxpZmllciAoYykKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBxdWFsaWZpZXJfc3RyaW5nIChjb2RlX2Zvcl9xdWFsaWZpZXIgKGMpKTsKLX0KLQotaW50Ci1jcGx1c19kZW1hbmdsZV9vcG5hbWUgKG9wbmFtZSwgcmVzdWx0LCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLSAgICAgaW50IG9wdGlvbnM7Ci17Ci0gIGludCBsZW4sIGxlbjEsIHJldDsKLSAgc3RyaW5nIHR5cGU7Ci0gIHN0cnVjdCB3b3JrX3N0dWZmIHdvcmtbMV07Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLQotICBsZW4gPSBzdHJsZW4ob3BuYW1lKTsKLSAgcmVzdWx0WzBdID0gJ1wwJzsKLSAgcmV0ID0gMDsKLSAgbWVtc2V0ICgoY2hhciAqKSB3b3JrLCAwLCBzaXplb2YgKHdvcmspKTsKLSAgd29yay0+b3B0aW9ucyA9IG9wdGlvbnM7Ci0KLSAgaWYgKG9wbmFtZVswXSA9PSAnXycgJiYgb3BuYW1lWzFdID09ICdfJwotICAgICAgJiYgb3BuYW1lWzJdID09ICdvJyAmJiBvcG5hbWVbM10gPT0gJ3AnKQotICAgIHsKLSAgICAgIC8qIEFOU0kuICAqLwotICAgICAgLyogdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yLiAgKi8KLSAgICAgIHRlbSA9IG9wbmFtZSArIDQ7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IgIik7Ci0JICBzdHJuY2F0IChyZXN1bHQsIHR5cGUuYiwgdHlwZS5wIC0gdHlwZS5iKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQkgIHJldCA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAob3BuYW1lWzBdID09ICdfJyAmJiBvcG5hbWVbMV0gPT0gJ18nCi0JICAgJiYgb3BuYW1lWzJdID49ICdhJyAmJiBvcG5hbWVbMl0gPD0gJ3onCi0JICAgJiYgb3BuYW1lWzNdID49ICdhJyAmJiBvcG5hbWVbM10gPD0gJ3onKQotICAgIHsKLSAgICAgIGlmIChvcG5hbWVbNF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBPcGVyYXRvci4gICovCi0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMgotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMiwgMikgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3BuYW1lWzJdID09ICdhJyAmJiBvcG5hbWVbNV0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIEFzc2lnbm1lbnQuICAqLwotCSAgICAgIHNpemVfdCBpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCQl7Ci0JCSAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMwotCQkgICAgICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICAgICAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICAgICAgcmV0ID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA+PSAzCi0JICAgJiYgb3BuYW1lWzBdID09ICdvJwotCSAgICYmIG9wbmFtZVsxXSA9PSAncCcKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIG9wbmFtZVsyXSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzZWUgaWYgaXQncyBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChsZW4gPj0gMTAgLyogb3AkYXNzaWduXyAqLwotCSAgJiYgbWVtY21wIChvcG5hbWUgKyAzLCAiYXNzaWduXyIsIDcpID09IDApCi0JewotCSAgc2l6ZV90IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGxlbjEgPSBsZW4gLSAxMDsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4xCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAxMCwgbGVuMSkgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHN0cmNhdCAocmVzdWx0LCAiPSIpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgbGVuMSA9IGxlbiAtIDM7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuMQotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMywgbGVuMSkgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA+PSA1ICYmIG1lbWNtcCAob3BuYW1lLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIG9wbmFtZVs0XSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgKi8KLSAgICAgIHRlbSA9IG9wbmFtZSArIDU7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IgIik7Ci0JICBzdHJuY2F0IChyZXN1bHQsIHR5cGUuYiwgdHlwZS5wIC0gdHlwZS5iKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQkgIHJldCA9IDE7Ci0JfQotICAgIH0KLSAgc3F1YW5nbGVfbW9wX3VwICh3b3JrKTsKLSAgcmV0dXJuIHJldDsKLQotfQotLyogVGFrZXMgb3BlcmF0b3IgbmFtZSBhcyBlLmcuICIrKyIgYW5kIHJldHVybnMgbWFuZ2xlZAotICAgb3BlcmF0b3IgbmFtZSAoZS5nLiAicG9zdGluY3JlbWVudF9leHByIiksIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotCi0gICBJZiBPUFRJT05TICYgRE1HTF9BTlNJID09IDEsIHJldHVybiB0aGUgQU5TSSBuYW1lOwotICAgaWYgT1BUSU9OUyAmIERNR0xfQU5TSSA9PSAwLCByZXR1cm4gdGhlIG9sZCBHTlUgbmFtZS4gICovCi0KLWNvbnN0IGNoYXIgKgotY3BsdXNfbWFuZ2xlX29wbmFtZSAob3BuYW1lLCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGludCBvcHRpb25zOwotewotICBzaXplX3QgaTsKLSAgaW50IGxlbjsKLQotICBsZW4gPSBzdHJsZW4gKG9wbmFtZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotICAgIHsKLSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0ub3V0KSA9PSBsZW4KLQkgICYmIChvcHRpb25zICYgRE1HTF9BTlNJKSA9PSAob3B0YWJsZVtpXS5mbGFncyAmIERNR0xfQU5TSSkKLQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5vdXQsIG9wbmFtZSwgbGVuKSA9PSAwKQotCXJldHVybiBvcHRhYmxlW2ldLmluOwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogY2hhciAqY3BsdXNfZGVtYW5nbGUgKGNvbnN0IGNoYXIgKm1hbmdsZWQsIGludCBvcHRpb25zKQotCi0gICBJZiBNQU5HTEVEIGlzIGEgbWFuZ2xlZCBmdW5jdGlvbiBuYW1lIHByb2R1Y2VkIGJ5IEdOVSBDKyssIHRoZW4KLSAgIGEgcG9pbnRlciB0byBhIG1hbGxvY2VkIHN0cmluZyBnaXZpbmcgYSBDKysgcmVwcmVzZW50YXRpb24KLSAgIG9mIHRoZSBuYW1lIHdpbGwgYmUgcmV0dXJuZWQ7IG90aGVyd2lzZSBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCi0gICBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgc3RyaW5nIHdoaWNoCi0gICBpcyByZXR1cm5lZC4KLQotICAgVGhlIE9QVElPTlMgYXJnIG1heSBjb250YWluIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgYml0czoKLQotICAgCURNR0xfQU5TSQlBTlNJIHF1YWxpZmllcnMgc3VjaCBhcyBgY29uc3QnIGFuZCBgdm9pZCcgYXJlCi0JCQlpbmNsdWRlZC4KLQlETUdMX1BBUkFNUwlGdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZC4KLQotICAgRm9yIGV4YW1wbGUsCi0KLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCBETUdMX1BBUkFNUykJCT0+ICJBOjpmb28oaW50KSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCBETUdMX1BBUkFNUyB8IERNR0xfQU5TSSkJPT4gIkE6OmZvbyhpbnQpIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBaSIsIDApCQkJPT4gIkE6OmZvbyIKLQotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBZmUiLCBETUdMX1BBUkFNUykJCT0+ICJBOjpmb28oZmxvYXQsLi4uKSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpPT4gIkE6OmZvbyhmbG9hdCwuLi4pIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBZmUiLCAwKQkJCT0+ICJBOjpmb28iCi0KLSAgIE5vdGUgdGhhdCBhbnkgbGVhZGluZyB1bmRlcnNjb3Jlcywgb3Igb3RoZXIgc3VjaCBjaGFyYWN0ZXJzIHByZXBlbmRlZCBieQotICAgdGhlIGNvbXBpbGF0aW9uIHN5c3RlbSwgYXJlIHByZXN1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHN0cmlwcGVkIGZyb20KLSAgIE1BTkdMRUQuICAqLwotCi1jaGFyICoKLWNwbHVzX2RlbWFuZ2xlIChtYW5nbGVkLCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotICAgICBpbnQgb3B0aW9uczsKLXsKLSAgY2hhciAqcmV0OwotICBzdHJ1Y3Qgd29ya19zdHVmZiB3b3JrWzFdOwotICBtZW1zZXQgKChjaGFyICopIHdvcmssIDAsIHNpemVvZiAod29yaykpOwotICB3b3JrIC0+IG9wdGlvbnMgPSBvcHRpb25zOwotICBpZiAoKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfU1RZTEVfTUFTSykgPT0gMCkKLSAgICB3b3JrIC0+IG9wdGlvbnMgfD0gKGludCkgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlICYgRE1HTF9TVFlMRV9NQVNLOwotCi0gIHJldCA9IGludGVybmFsX2NwbHVzX2RlbWFuZ2xlICh3b3JrLCBtYW5nbGVkKTsKLSAgc3F1YW5nbGVfbW9wX3VwICh3b3JrKTsKLSAgcmV0dXJuIChyZXQpOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbW9zdCBvZiB3aGF0IGNwbHVzX2RlbWFuZ2xlIHVzZSB0byBkbywgYnV0Ci0gICB0byBiZSBhYmxlIHRvIGRlbWFuZ2xlIGEgbmFtZSB3aXRoIGEgQiwgSyBvciBuIGNvZGUsIHdlIG5lZWQgdG8KLSAgIGhhdmUgYSBsb25nZXIgdGVybSBtZW1vcnkgb2Ygd2hhdCB0eXBlcyBoYXZlIGJlZW4gc2Vlbi4gVGhlIG9yaWdpbmFsCi0gICBub3cgaW50aWFsaXplcyBhbmQgY2xlYW5zIHVwIHRoZSBzcXVhbmdsZSBjb2RlIGluZm8sIHdoaWxlIGludGVybmFsCi0gICBjYWxscyBnbyBkaXJlY3RseSB0byB0aGlzIHJvdXRpbmUgdG8gYXZvaWQgcmVzZXR0aW5nIHRoYXQgaW5mby4gKi8KLQotc3RhdGljIGNoYXIgKgotaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssIG1hbmdsZWQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotewotCi0gIHN0cmluZyBkZWNsOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGNoYXIgKmRlbWFuZ2xlZCA9IE5VTEw7Ci0gIGludCBzMSxzMixzMyxzNDsKLSAgczEgPSB3b3JrLT5jb25zdHJ1Y3RvcjsKLSAgczIgPSB3b3JrLT5kZXN0cnVjdG9yOwotICBzMyA9IHdvcmstPnN0YXRpY190eXBlOwotICBzNCA9IHdvcmstPnR5cGVfcXVhbHM7Ci0gIHdvcmstPmNvbnN0cnVjdG9yID0gd29yay0+ZGVzdHJ1Y3RvciA9IDA7Ci0gIHdvcmstPnR5cGVfcXVhbHMgPSBUWVBFX1VOUVVBTElGSUVEOwotICB3b3JrLT5kbGxpbXBvcnRlZCA9IDA7Ci0KLSAgaWYgKChtYW5nbGVkICE9IE5VTEwpICYmICgqbWFuZ2xlZCAhPSAnXDAnKSkKLSAgICB7Ci0gICAgICBzdHJpbmdfaW5pdCAoJmRlY2wpOwotCi0gICAgICAvKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgZ251IHN0eWxlIGRlbWFuZ2xpbmcgaXMgYWN0aXZlIGFuZCBpZiB0aGUKLQkgc3RyaW5nIHRvIGJlIGRlbWFuZ2xlZCBjb250YWlucyBhIENQTFVTX01BUktFUi4gIElmIHNvLCBhdHRlbXB0IHRvCi0JIHJlY29nbml6ZSBvbmUgb2YgdGhlIGdudSBzcGVjaWFsIGZvcm1zIHJhdGhlciB0aGFuIGxvb2tpbmcgZm9yIGEKLQkgc3RhbmRhcmQgcHJlZml4LiAgSW4gcGFydGljdWxhciwgZG9uJ3Qgd29ycnkgYWJvdXQgd2hldGhlciB0aGVyZQotCSBpcyBhICJfXyIgc3RyaW5nIGluIHRoZSBtYW5nbGVkIHN0cmluZy4gIENvbnNpZGVyICJfJF81X19mb28iIGZvcgotCSBleGFtcGxlLiAgKi8KLQotICAgICAgaWYgKChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpKQotCXsKLQkgIHN1Y2Nlc3MgPSBnbnVfc3BlY2lhbCAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAoIXN1Y2Nlc3MpCi0JewotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3ByZWZpeCAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAoc3VjY2VzcyAmJiAoKm1hbmdsZWQgIT0gJ1wwJykpCi0JewotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3NpZ25hdHVyZSAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAod29yay0+Y29uc3RydWN0b3IgPT0gMikKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgImdsb2JhbCBjb25zdHJ1Y3RvcnMga2V5ZWQgdG8gIik7Ci0gICAgICAgICAgd29yay0+Y29uc3RydWN0b3IgPSAwOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmICh3b3JrLT5kZXN0cnVjdG9yID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJnbG9iYWwgZGVzdHJ1Y3RvcnMga2V5ZWQgdG8gIik7Ci0gICAgICAgICAgd29yay0+ZGVzdHJ1Y3RvciA9IDA7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHdvcmstPmRsbGltcG9ydGVkID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJpbXBvcnQgc3R1YiBmb3IgIik7Ci0gICAgICAgICAgd29yay0+ZGxsaW1wb3J0ZWQgPSAwOwotICAgICAgICB9Ci0gICAgICBkZW1hbmdsZWQgPSBtb3BfdXAgKHdvcmssICZkZWNsLCBzdWNjZXNzKTsKLSAgICB9Ci0gIHdvcmstPmNvbnN0cnVjdG9yID0gczE7Ci0gIHdvcmstPmRlc3RydWN0b3IgPSBzMjsKLSAgd29yay0+c3RhdGljX3R5cGUgPSBzMzsKLSAgd29yay0+dHlwZV9xdWFscyA9IHM0OwotICByZXR1cm4gKGRlbWFuZ2xlZCk7Ci19Ci0KLQotLyogQ2xlYXIgb3V0IGFuZCBzcXVhbmdsaW5nIHJlbGF0ZWQgc3RvcmFnZSAqLwotc3RhdGljIHZvaWQKLXNxdWFuZ2xlX21vcF91cCAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIC8qIGNsZWFuIHVwIHRoZSBCIGFuZCBLIHR5cGUgbWFuZ2xpbmcgdHlwZXMuICovCi0gIGZvcmdldF9CX2FuZF9LX3R5cGVzICh3b3JrKTsKLSAgaWYgKHdvcmsgLT4gYnR5cGV2ZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICgoY2hhciAqKSB3b3JrIC0+IGJ0eXBldmVjKTsKLSAgICB9Ci0gIGlmICh3b3JrIC0+IGt0eXBldmVjICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiBrdHlwZXZlYyk7Ci0gICAgfQotfQotCi0vKiBDbGVhciBvdXQgYW55IG1hbmdsZWQgc3RvcmFnZSAqLwotCi1zdGF0aWMgY2hhciAqCi1tb3BfdXAgKHdvcmssIGRlY2xwLCBzdWNjZXNzKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgc3RyaW5nICpkZWNscDsKLSAgICAgaW50IHN1Y2Nlc3M7Ci17Ci0gIGNoYXIgKmRlbWFuZ2xlZCA9IE5VTEw7Ci0KLSAgLyogRGlzY2FyZCB0aGUgcmVtZW1iZXJlZCB0eXBlcywgaWYgYW55LiAgKi8KLQotICBmb3JnZXRfdHlwZXMgKHdvcmspOwotICBpZiAod29yayAtPiB0eXBldmVjICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiB0eXBldmVjKTsKLSAgICAgIHdvcmsgLT4gdHlwZXZlYyA9IE5VTEw7Ci0gICAgICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSA9IDA7Ci0gICAgfQotICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCB3b3JrLT5udG1wbF9hcmdzOyBpKyspCi0JaWYgKHdvcmstPnRtcGxfYXJndmVjW2ldKQotCSAgZnJlZSAoKGNoYXIqKSB3b3JrLT50bXBsX2FyZ3ZlY1tpXSk7Ci0KLSAgICAgIGZyZWUgKChjaGFyKikgd29yay0+dG1wbF9hcmd2ZWMpOwotICAgICAgd29yay0+dG1wbF9hcmd2ZWMgPSBOVUxMOwotICAgIH0KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHsKLSAgICAgIHN0cmluZ19kZWxldGUgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgICAgIGZyZWUgKChjaGFyKikgd29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgICAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiBkZW1hbmdsaW5nIHdhcyBzdWNjZXNzZnVsLCBlbnN1cmUgdGhhdCB0aGUgZGVtYW5nbGVkIHN0cmluZyBpcyBudWxsCi0gICAgIHRlcm1pbmF0ZWQgYW5kIHJldHVybiBpdC4gIE90aGVyd2lzZSwgZnJlZSB0aGUgZGVtYW5nbGluZyBkZWNsLiAgKi8KLQotICBpZiAoIXN1Y2Nlc3MpCi0gICAgewotICAgICAgc3RyaW5nX2RlbGV0ZSAoZGVjbHApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgIiIsIDEpOwotICAgICAgZGVtYW5nbGVkID0gZGVjbHAgLT4gYjsKLSAgICB9Ci0gIHJldHVybiAoZGVtYW5nbGVkKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3NpZ25hdHVyZSAtLSBkZW1hbmdsZSB0aGUgc2lnbmF0dXJlIHBhcnQgb2YgYSBtYW5nbGVkIG5hbWUKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9zaWduYXR1cmUgKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCSAgICBzdHJpbmcgKmRlY2xwKTsKLQotREVTQ1JJUFRJT04KLQotCUNvbnN1bWUgYW5kIGRlbWFuZ2xlIHRoZSBzaWduYXR1cmUgcG9ydGlvbiBvZiB0aGUgbWFuZ2xlZCBuYW1lLgotCi0JREVDTFAgaXMgdGhlIHN0cmluZyB3aGVyZSBkZW1hbmdsZWQgb3V0cHV0IGlzIGJlaW5nIGJ1aWx0LiAgQXQKLQllbnRyeSBpdCBjb250YWlucyB0aGUgZGVtYW5nbGVkIHJvb3QgbmFtZSBmcm9tIHRoZSBtYW5nbGVkIG5hbWUKLQlwcmVmaXguICBJLkUuIGVpdGhlciBhIGRlbWFuZ2xlZCBvcGVyYXRvciBuYW1lIG9yIHRoZSByb290IGZ1bmN0aW9uCi0JbmFtZS4gIEluIHNvbWUgc3BlY2lhbCBjYXNlcywgaXQgbWF5IGNvbnRhaW4gbm90aGluZy4KLQotCSpNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCB1bmNvbnN1bWVkIGxvY2F0aW9uIGluIHRoZSBtYW5nbGVkCi0JbmFtZS4gIEFzIHRva2VucyBhcmUgY29uc3VtZWQgYW5kIGRlbWFuZ2xpbmcgaXMgcGVyZm9ybWVkLCB0aGUKLQlwb2ludGVyIGlzIHVwZGF0ZWQgdG8gY29udGludW91c2x5IHBvaW50IGF0IHRoZSBuZXh0IHRva2VuIHRvCi0JYmUgY29uc3VtZWQuCi0KLQlEZW1hbmdsaW5nIEdOVSBzdHlsZSBtYW5nbGVkIG5hbWVzIGlzIG5hc3R5IGJlY2F1c2UgdGhlcmUgaXMgbm8KLQlleHBsaWNpdCB0b2tlbiB0aGF0IG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgb3V0ZXJtb3N0IGZ1bmN0aW9uCi0JYXJndW1lbnQgbGlzdC4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3NpZ25hdHVyZSAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBpbnQgZnVuY19kb25lID0gMDsKLSAgaW50IGV4cGVjdF9mdW5jID0gMDsKLSAgaW50IGV4cGVjdF9yZXR1cm5fdHlwZSA9IDA7Ci0gIGNvbnN0IGNoYXIgKm9sZG1hbmdsZWQgPSBOVUxMOwotICBzdHJpbmcgdHJhd25hbWU7Ci0gIHN0cmluZyB0bmFtZTsKLQotICB3aGlsZSAoc3VjY2VzcyAmJiAoKiptYW5nbGVkICE9ICdcMCcpKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQkgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAxLCAwKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICByZW1lbWJlcl90eXBlICh3b3JrLCBvbGRtYW5nbGVkLCAqbWFuZ2xlZCAtIG9sZG1hbmdsZWQpOwotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBicmVhazsKLQotICAgICAgICBjYXNlICdLJzoKLQkgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAxLCAwKTsKLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICAgIH0KLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdTJzoKLQkgIC8qIFN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gKi8KLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHdvcmsgLT4gc3RhdGljX3R5cGUgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoKLQljYXNlICdWJzoKLQljYXNlICd1JzoKLQkgIHdvcmstPnR5cGVfcXVhbHMgfD0gY29kZV9mb3JfcXVhbGlmaWVyICgqKm1hbmdsZWQpOwotCi0JICAvKiBhIHF1YWxpZmllZCBtZW1iZXIgZnVuY3Rpb24gKi8KLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTCc6Ci0JICAvKiBMb2NhbCBjbGFzcyBuYW1lIGZvbGxvd3MgYWZ0ZXIgIkxubm5fIiAqLwotCSAgaWYgKEhQX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoKiptYW5nbGVkICYmICgqKm1hbmdsZWQgIT0gJ18nKSkKLQkJKCptYW5nbGVkKSsrOwotCSAgICAgIGlmICghKiptYW5nbGVkKQotCQlzdWNjZXNzID0gMDsKLQkgICAgICBlbHNlCi0JCSgqbWFuZ2xlZCkrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzdWNjZXNzID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLSAgICAgICAgICB3b3JrLT50ZW1wX3N0YXJ0ID0gLTE7IC8qIHVwcGVybW9zdCBjYWxsIHRvIGRlbWFuZ2xlX2NsYXNzICovCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfY2xhc3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKLQkgICAgfQotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgICAgewotICAgICAgICAgICAgICAvKiBFREcgYW5kIG90aGVycyB3aWxsIGhhdmUgdGhlICJGIiwgc28gd2UgbGV0IHRoZSBsb29wIGN5Y2xlCi0gICAgICAgICAgICAgICAgIGlmIHdlIGFyZSBsb29raW5nIGF0IG9uZS4gKi8KLSAgICAgICAgICAgICAgaWYgKCoqbWFuZ2xlZCAhPSAnRicpCi0gICAgICAgICAgICAgICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgICAgfQotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgJ0InOgotCSAgewotCSAgICBzdHJpbmcgczsKLQkgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZzKTsKLQkgICAgaWYgKHN1Y2Nlc3MpCi0JICAgICAgewotCQlzdHJpbmdfYXBwZW5kICgmcywgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0JCXN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZzKTsKLQkgICAgICB9Ci0JICAgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgLyogRnVuY3Rpb24gKi8KLQkgIC8qIEFSTS9IUCBzdHlsZSBkZW1hbmdsaW5nIGluY2x1ZGVzIGEgc3BlY2lmaWMgJ0YnIGNoYXJhY3RlciBhZnRlcgotCSAgICAgdGhlIGNsYXNzIG5hbWUuICBGb3IgR05VIHN0eWxlLCBpdCBpcyBqdXN0IGltcGxpZWQuICBTbyB3ZSBjYW4KLQkgICAgIHNhZmVseSBqdXN0IGNvbnN1bWUgYW55ICdGJyBhdCB0aGlzIHBvaW50IGFuZCBiZSBjb21wYXRpYmxlCi0JICAgICB3aXRoIGVpdGhlciBzdHlsZS4gICovCi0KLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgZnVuY19kb25lID0gMTsKLQkgICgqbWFuZ2xlZCkrKzsKLQotCSAgLyogRm9yIGx1Y2lkL0FSTS9IUCBzdHlsZSB3ZSBoYXZlIHRvIGZvcmdldCBhbnkgdHlwZXMgd2UgbWlnaHQKLQkgICAgIGhhdmUgcmVtZW1iZXJlZCB1cCB0byB0aGlzIHBvaW50LCBzaW5jZSB0aGV5IHdlcmUgbm90IGFyZ3VtZW50Ci0JICAgICB0eXBlcy4gIEdOVSBzdHlsZSBjb25zaWRlcnMgYWxsIHR5cGVzIHNlZW4gYXMgYXZhaWxhYmxlIGZvcgotCSAgICAgYmFjayByZWZlcmVuY2VzLiAgU2VlIGNvbW1lbnQgaW4gZGVtYW5nbGVfYXJncygpICovCi0KLQkgIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICBmb3JnZXRfdHlwZXMgKHdvcmspOwotCSAgICB9Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgLyogQWZ0ZXIgcGlja2luZyBvZmYgdGhlIGZ1bmN0aW9uIGFyZ3MsIHdlIGV4cGVjdCB0byBlaXRoZXIKLQkgICAgIGZpbmQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIChwcmVjZWRlZCBieSBhbiAnXycpIG9yIHRoZQotCSAgICAgZW5kIG9mIHRoZSBzdHJpbmcuICovCi0JICBpZiAoc3VjY2VzcyAmJiAoQVVUT19ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiAqKm1hbmdsZWQgPT0gJ18nKQotCSAgICB7Ci0JICAgICAgKysoKm1hbmdsZWQpOwotICAgICAgICAgICAgICAvKiBBdCB0aGlzIGxldmVsLCB3ZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgcmV0dXJuIHR5cGUuICovCi0gICAgICAgICAgICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdG5hbWUpOwotICAgICAgICAgICAgICBzdHJpbmdfZGVsZXRlICgmdG5hbWUpOwotICAgICAgICAgICAgfQotCi0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgLyogRysrIFRlbXBsYXRlICovCi0JICBzdHJpbmdfaW5pdCgmdHJhd25hbWUpOwotCSAgc3RyaW5nX2luaXQoJnRuYW1lKTsKLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJnRuYW1lLAotCQkJCSAgICAgICAmdHJhd25hbWUsIDEsIDEpOwotCSAgaWYgKHN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICByZW1lbWJlcl90eXBlICh3b3JrLCBvbGRtYW5nbGVkLCAqbWFuZ2xlZCAtIG9sZG1hbmdsZWQpOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kICgmdG5hbWUsIFNDT1BFX1NUUklORyAod29yaykpOwotCi0JICBzdHJpbmdfcHJlcGVuZHMoZGVjbHAsICZ0bmFtZSk7Ci0JICBpZiAod29yayAtPiBkZXN0cnVjdG9yICYgMSkKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kICgmdHJhd25hbWUsICJ+Iik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHJhd25hbWUpOwotCSAgICAgIHdvcmstPmRlc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgaWYgKCh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpIHx8ICh3b3JrLT5kZXN0cnVjdG9yICYgMSkpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0cmF3bmFtZSk7Ci0JICAgICAgd29yay0+Y29uc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgc3RyaW5nX2RlbGV0ZSgmdHJhd25hbWUpOwotCSAgc3RyaW5nX2RlbGV0ZSgmdG5hbWUpOwotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBleHBlY3RfZnVuYyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ18nOgotCSAgaWYgKEdOVV9ERU1BTkdMSU5HICYmIGV4cGVjdF9yZXR1cm5fdHlwZSkKLQkgICAgewotCSAgICAgIC8qIFJlYWQgdGhlIHJldHVybiB0eXBlLiAqLwotCSAgICAgIHN0cmluZyByZXR1cm5fdHlwZTsKLQkgICAgICBzdHJpbmdfaW5pdCAoJnJldHVybl90eXBlKTsKLQotCSAgICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnJldHVybl90eXBlKTsKLQkgICAgICBBUFBFTkRfQkxBTksgKCZyZXR1cm5fdHlwZSk7Ci0KLQkgICAgICBzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmcmV0dXJuX3R5cGUpOwotCSAgICAgIHN0cmluZ19kZWxldGUgKCZyZXR1cm5fdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgLyogQXQgdGhlIG91dGVybW9zdCBsZXZlbCwgd2UgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZSBzcGVjaWZpZWQsCi0JICAgICAgIHNvIGlmIHdlIHJ1biBpbnRvIGFub3RoZXIgJ18nIGF0IHRoaXMgcG9pbnQgd2UgYXJlIGRlYWxpbmcgd2l0aAotCSAgICAgICBhIG1hbmdsZWQgbmFtZSB0aGF0IGlzIGVpdGhlciBib2d1cywgb3IgaGFzIGJlZW4gbWFuZ2xlZCBieQotCSAgICAgICBzb21lIGFsZ29yaXRobSB3ZSBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGguICBTbyBqdXN0Ci0JICAgICAgIHJlamVjdCB0aGUgZW50aXJlIGRlbWFuZ2xpbmcuICAqLwotICAgICAgICAgICAgLyogSG93ZXZlciwgIl9ubm4iIGlzIGFuIGV4cGVjdGVkIHN1ZmZpeCBmb3IgYWx0ZXJuYXRlIGVudHJ5IHBvaW50Ci0gICAgICAgICAgICAgICBudW1iZXJlZCBubm4gZm9yIGEgZnVuY3Rpb24sIHdpdGggSFAgYUNDLCBzbyBza2lwIG92ZXIgdGhhdAotICAgICAgICAgICAgICAgd2l0aG91dCByZXBvcnRpbmcgZmFpbHVyZS4gcGFpLzE5OTctMDktMDQgKi8KLSAgICAgICAgICAgIGlmIChIUF9ERU1BTkdMSU5HKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgICAgICAgIHdoaWxlICgqKm1hbmdsZWQgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLSAgICAgICAgICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdIJzoKLQkgIGlmIChHTlVfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIC8qIEEgRysrIHRlbXBsYXRlIGZ1bmN0aW9uLiAgUmVhZCB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLiAqLwotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDAsCi0JCQkJCSAgIDApOwotCSAgICAgIGlmICghKHdvcmstPmNvbnN0cnVjdG9yICYgMSkpCi0JCWV4cGVjdF9yZXR1cm5fdHlwZSA9IDE7Ci0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCSAgICB7O30KLQotCWRlZmF1bHQ6Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgLyogQXNzdW1lIHdlIGhhdmUgc3R1bWJsZWQgb250byB0aGUgZmlyc3Qgb3V0ZXJtb3N0IGZ1bmN0aW9uCi0JCSBhcmd1bWVudCB0b2tlbiwgYW5kIHN0YXJ0IHByb2Nlc3NpbmcgYXJncy4gICovCi0JICAgICAgZnVuY19kb25lID0gMTsKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBOb24tR05VIGRlbWFuZ2xlcnMgdXNlIGEgc3BlY2lmaWMgdG9rZW4gdG8gbWFyayB0aGUgc3RhcnQKLQkJIG9mIHRoZSBvdXRlcm1vc3QgZnVuY3Rpb24gYXJndW1lbnQgdG9rZW5zLiAgVHlwaWNhbGx5ICdGJywKLQkJIGZvciBBUk0vSFAtZGVtYW5nbGluZywgZm9yIGV4YW1wbGUuICBTbyBpZiB3ZSBmaW5kIHNvbWV0aGluZwotCQkgd2UgYXJlIG5vdCBwcmVwYXJlZCBmb3IsIGl0IG11c3QgYmUgYW4gZXJyb3IuICAqLwotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKgotCWlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JKi8KLSAgICAgIHsKLQlpZiAoc3VjY2VzcyAmJiBleHBlY3RfZnVuYykKLQkgIHsKLQkgICAgZnVuY19kb25lID0gMTsKLSAgICAgICAgICAgICAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICAgIC8qIFNpbmNlIHRlbXBsYXRlIGluY2x1ZGUgdGhlIG1hbmdsaW5nIG9mIHRoZWlyIHJldHVybiB0eXBlcywKLQkgICAgICAgd2UgbXVzdCBzZXQgZXhwZWN0X2Z1bmMgdG8gMCBzbyB0aGF0IHdlIGRvbid0IHRyeSBkbwotCSAgICAgICBkZW1hbmdsZSBtb3JlIGFyZ3VtZW50cyB0aGUgbmV4dCB0aW1lIHdlIGdldCBoZXJlLiAgKi8KLQkgICAgZXhwZWN0X2Z1bmMgPSAwOwotCSAgfQotICAgICAgfQotICAgIH0KLSAgaWYgKHN1Y2Nlc3MgJiYgIWZ1bmNfZG9uZSkKLSAgICB7Ci0gICAgICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCXsKLQkgIC8qIFdpdGggR05VIHN0eWxlIGRlbWFuZ2xpbmcsIGJhcl9fM2ZvbyBpcyAnZm9vOjpiYXIodm9pZCknLCBhbmQKLQkgICAgIGJhcl9fM2Zvb2kgaXMgJ2Zvbzo6YmFyKGludCknLiAgV2UgZ2V0IGhlcmUgd2hlbiB3ZSBmaW5kIHRoZQotCSAgICAgZmlyc3QgY2FzZSwgYW5kIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlICcodm9pZCknIGdldHMgYWRkZWQgdG8KLQkgICAgIHRoZSBjdXJyZW50IGRlY2xwLiAgTm90ZSB0aGF0IHdpdGggQVJNL0hQLCB0aGUgZmlyc3QgY2FzZQotCSAgICAgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhIHN0YXRpYyBkYXRhIG1lbWJlciAnZm9vOjpiYXInLAotCSAgICAgd2hpY2ggaXMgaW4gdGhlIGN1cnJlbnQgZGVjbHAsIHNvIHdlIGxlYXZlIGl0IGFsb25lLiAgKi8KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JfQotICAgIH0KLSAgaWYgKHN1Y2Nlc3MgJiYgUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIGlmICh3b3JrLT5zdGF0aWNfdHlwZSkKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgIiBzdGF0aWMiKTsKLSAgICAgIGlmICh3b3JrLT50eXBlX3F1YWxzICE9IFRZUEVfVU5RVUFMSUZJRUQpCi0JewotCSAgQVBQRU5EX0JMQU5LIChkZWNscCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgcXVhbGlmaWVyX3N0cmluZyAod29yay0+dHlwZV9xdWFscykpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotI2lmIDAKLQotc3RhdGljIGludAotZGVtYW5nbGVfbWV0aG9kX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMDsKLQotICBpZiAod29yayAtPiBzdGF0aWNfdHlwZSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQgKyAxKTsKLSAgICAgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnRuYW1lOwotewotICBpbnQgaTsKLSAgaW50IHI7Ci0gIGludCBuZWVkX2NvbW1hID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBzdHJpbmcgdGVtcDsKLQotICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgInRlbXBsYXRlIDwiKTsKLSAgLyogZ2V0IHNpemUgb2YgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QgKi8KLSAgaWYgKGdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0JewotCSAgaWYgKG5lZWRfY29tbWEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiwgIik7Ci0JICAgIH0KLQotCSAgICAvKiBaIGZvciB0eXBlIHBhcmFtZXRlcnMgKi8KLQkgICAgaWYgKCoqbWFuZ2xlZCA9PSAnWicpCi0JICAgICAgewotCQkoKm1hbmdsZWQpKys7Ci0JCXN0cmluZ19hcHBlbmQgKHRuYW1lLCAiY2xhc3MiKTsKLQkgICAgICB9Ci0JICAgICAgLyogeiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAqLwotCSAgICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCSAgICAgIHsKLQkJKCptYW5nbGVkKSsrOwotCQlzdWNjZXNzID0KLQkJICBkZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSk7Ci0JCWlmICghc3VjY2VzcykKLQkJICB7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkJc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkJaWYgKHN1Y2Nlc3MpCi0JCSAgewotCQkgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCAmdGVtcCk7Ci0JCSAgfQotCQlzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkJaWYgKCFzdWNjZXNzKQotCQkgIHsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICBuZWVkX2NvbW1hID0gMTsKLQl9Ci0KLSAgICB9Ci0gIGlmICh0bmFtZS0+cFstMV0gPT0gJz4nKQotICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIj4gY2xhc3MiKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIGludAotZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHMpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyKiogbWFuZ2xlZDsKLSAgICAgc3RyaW5nKiBzOwotewotICBpbnQgc3VjY2VzczsKLQotICBpZiAoKiptYW5nbGVkID09ICdFJykKLSAgICB7Ci0gICAgICBpbnQgbmVlZF9vcGVyYXRvciA9IDA7Ci0KLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICIoIiwgMSk7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICB3aGlsZSAoc3VjY2VzcyAmJiAqKm1hbmdsZWQgIT0gJ1cnICYmICoqbWFuZ2xlZCAhPSAnXDAnKQotCXsKLQkgIGlmIChuZWVkX29wZXJhdG9yKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGk7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCi0JICAgICAgbGVuID0gc3RybGVuICgqbWFuZ2xlZCk7Ci0KLQkgICAgICBmb3IgKGkgPSAwOwotCQkgICBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZSBbMF0pOwotCQkgICArK2kpCi0JCXsKLQkJICBzaXplX3QgbCA9IHN0cmxlbiAob3B0YWJsZVtpXS5pbik7Ci0KLQkJICBpZiAobCA8PSBsZW4KLQkJICAgICAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCAqbWFuZ2xlZCwgbCkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICIgIiwgMSk7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmQgKHMsIG9wdGFibGVbaV0ub3V0KTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICIgIiwgMSk7Ci0JCSAgICAgIHN1Y2Nlc3MgPSAxOwotCQkgICAgICAoKm1hbmdsZWQpICs9IGw7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoIXN1Y2Nlc3MpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIG5lZWRfb3BlcmF0b3IgPSAxOwotCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgcywKLQkJCQkJCSAgdGtfaW50ZWdyYWwpOwotCX0KLQotICAgICAgaWYgKCoqbWFuZ2xlZCAhPSAnVycpCi0JICBzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIikiLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgfQotICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ1EnIHx8ICoqbWFuZ2xlZCA9PSAnSycpCi0gICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgcywgMCwgMSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLQotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnbScpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICItIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN1Y2Nlc3MgPSAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsIHRrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyogczsKLSAgICAgdHlwZV9raW5kX3QgdGs7Ci17Ci0gIGludCBzdWNjZXNzID0gMTsKLQotICBpZiAoKiptYW5nbGVkID09ICdZJykKLSAgICB7Ci0gICAgICAvKiBUaGUgbmV4dCBhcmd1bWVudCBpcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4gKi8KLSAgICAgIGludCBpZHg7Ci0KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0gICAgICBpZiAoaWR4ID09IC0xCi0JICB8fCAod29yay0+dG1wbF9hcmd2ZWMgJiYgaWR4ID49IHdvcmstPm50bXBsX2FyZ3MpCi0JICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCXJldHVybiAtMTsKLSAgICAgIGlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLQlzdHJpbmdfYXBwZW5kIChzLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyIGJ1ZlsxMF07Ci0JICBzcHJpbnRmKGJ1ZiwgIlQlZCIsIGlkeCk7Ci0JICBzdHJpbmdfYXBwZW5kIChzLCBidWYpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX2ludGVncmFsKQotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSAod29yaywgbWFuZ2xlZCwgcyk7Ci0gIGVsc2UgaWYgKHRrID09IHRrX2NoYXIpCi0gICAgewotICAgICAgY2hhciB0bXBbMl07Ci0gICAgICBpbnQgdmFsOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnbScpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICItIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICInIiwgMSk7Ci0gICAgICB2YWwgPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotICAgICAgaWYgKHZhbCA8PSAwKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRtcFswXSA9IChjaGFyKXZhbDsKLQkgIHRtcFsxXSA9ICdcMCc7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgJnRtcFswXSwgMSk7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIiciLCAxKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19ib29sKQotICAgIHsKLSAgICAgIGludCB2YWwgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmICh2YWwgPT0gMCkKLQlzdHJpbmdfYXBwZW5kbiAocywgImZhbHNlIiwgNSk7Ci0gICAgICBlbHNlIGlmICh2YWwgPT0gMSkKLQlzdHJpbmdfYXBwZW5kbiAocywgInRydWUiLCA0KTsKLSAgICAgIGVsc2UKLQlzdWNjZXNzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX3JlYWwpCi0gICAgewotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnbScpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICItIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICcuJykgLyogZnJhY3Rpb24gKi8KLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIi4iLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICAgICAoKm1hbmdsZWQpKys7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdlJykgLyogZXhwb25lbnQgKi8KLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgImUiLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICAgICAoKm1hbmdsZWQpKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19wb2ludGVyIHx8IHRrID09IHRrX3JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBpbnQgc3ltYm9sX2xlbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgaWYgKHN5bWJvbF9sZW4gPT0gLTEpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHN5bWJvbF9sZW4gPT0gMCkKLQlzdHJpbmdfYXBwZW5kbiAocywgIjAiLCAxKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpwID0geG1hbGxvYyAoc3ltYm9sX2xlbiArIDEpLCAqcTsKLQkgIHN0cm5jcHkgKHAsICptYW5nbGVkLCBzeW1ib2xfbGVuKTsKLQkgIHAgW3N5bWJvbF9sZW5dID0gJ1wwJzsKLQkgIC8qIFdlIHVzZSBjcGx1c19kZW1hbmdsZSBoZXJlLCByYXRoZXIgdGhhbgotCSAgICAgaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUsIGJlY2F1c2UgdGhlIG5hbWUgb2YgdGhlIGVudGl0eQotCSAgICAgbWFuZ2xlZCBoZXJlIGRvZXMgbm90IG1ha2UgdXNlIG9mIGFueSBvZiB0aGUgc3F1YW5nbGluZwotCSAgICAgb3IgdHlwZS1jb2RlIGluZm9ybWF0aW9uIHdlIGhhdmUgYnVpbHQgdXAgdGh1cyBmYXI7IGl0IGlzCi0JICAgICBtYW5nbGVkIGluZGVwZW5kZW50bHkuICAqLwotCSAgcSA9IGNwbHVzX2RlbWFuZ2xlIChwLCB3b3JrLT5vcHRpb25zKTsKLQkgIGlmICh0ayA9PSB0a19wb2ludGVyKQotCSAgICBzdHJpbmdfYXBwZW5kbiAocywgIiYiLCAxKTsKLQkgIC8qIEZJWE1FOiBQb2ludGVyLXRvLW1lbWJlciBjb25zdGFudHMgc2hvdWxkIGdldCBhCi0JICAgICAgICAgICAgcXVhbGlmeWluZyBjbGFzcyBuYW1lIGhlcmUuICAqLwotCSAgaWYgKHEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChzLCBxKTsKLQkgICAgICBmcmVlIChxKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzdHJpbmdfYXBwZW5kIChzLCBwKTsKLQkgIGZyZWUgKHApOwotCX0KLSAgICAgICptYW5nbGVkICs9IHN5bWJvbF9sZW47Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi0vKiBEZW1hbmdsZSB0aGUgdGVtcGxhdGUgbmFtZSBpbiBNQU5HTEVELiAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUKLSAgIHRlbXBsYXRlIChlLmcuLCBTPGludD4pIGlzIHBsYWNlZCBpbiBUTkFNRS4gIFRoZSBuYW1lIHdpdGhvdXQgdGhlCi0gICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChlLmcuIFMpIGlzIHBsYWNlZCBpbiBUUkFXTkFNRSBpZiBUUkFXTkFNRSBpcwotICAgbm9uLU5VTEwuICBJZiBJU19UWVBFIGlzIG5vbnplcm8sIHRoaXMgdGVtcGxhdGUgaXMgYSB0eXBlIHRlbXBsYXRlLAotICAgbm90IGEgZnVuY3Rpb24gdGVtcGxhdGUuICBJZiBib3RoIElTX1RZUEUgYW5kIFJFTUVNQkVSIGFyZSBub256ZXJvLAotICAgdGhlIHRtZXBsYXRlIGlzIHJlbWVtYmVyZWQgaW4gdGhlIGxpc3Qgb2YgYmFjay1yZWZlcmVuY2VhYmxlCi0gICB0eXBlcy4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCB0bmFtZSwgdHJhd25hbWUsIGlzX3R5cGUsIHJlbWVtYmVyKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqdG5hbWU7Ci0gICAgIHN0cmluZyAqdHJhd25hbWU7Ci0gICAgIGludCBpc190eXBlOwotICAgICBpbnQgcmVtZW1iZXI7Ci17Ci0gIGludCBpOwotICBpbnQgcjsKLSAgaW50IG5lZWRfY29tbWEgPSAwOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBpbnQgaXNfamF2YV9hcnJheSA9IDA7Ci0gIHN0cmluZyB0ZW1wOwotICBpbnQgYmluZGV4ID0gMDsKLQotICAoKm1hbmdsZWQpKys7Ci0gIGlmIChpc190eXBlKQotICAgIHsKLSAgICAgIGlmIChyZW1lbWJlcikKLQliaW5kZXggPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0gICAgICBzdGFydCA9ICptYW5nbGVkOwotICAgICAgLyogZ2V0IHRlbXBsYXRlIG5hbWUgKi8KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCXsKLQkgIGludCBpZHg7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICAoKm1hbmdsZWQpKys7Ci0KLQkgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0JICBpZiAoaWR4ID09IC0xCi0JICAgICAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQotCSAgICAgIHx8IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkgPT0gLTEpCi0JICAgIHJldHVybiAoMCk7Ci0KLQkgIGlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQkgICAgICBpZiAodHJhd25hbWUpCi0JCXN0cmluZ19hcHBlbmQgKHRyYXduYW1lLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbMTBdOwotCSAgICAgIHNwcmludGYoYnVmLCAiVCVkIiwgaWR4KTsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgYnVmKTsKLQkgICAgICBpZiAodHJhd25hbWUpCi0JCXN0cmluZ19hcHBlbmQgKHRyYXduYW1lLCBidWYpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgociA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpKSA8PSAwCi0JICAgICAgfHwgKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPCByKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgaXNfamF2YV9hcnJheSA9ICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX0pBVkEpCi0JICAgICYmIHN0cm5jbXAgKCptYW5nbGVkLCAiSkFycmF5MVoiLCA4KSA9PSAwOwotCSAgaWYgKCEgaXNfamF2YV9hcnJheSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRuICh0bmFtZSwgKm1hbmdsZWQsIHIpOwotCSAgICB9Ci0JICBpZiAodHJhd25hbWUpCi0JICAgIHN0cmluZ19hcHBlbmRuICh0cmF3bmFtZSwgKm1hbmdsZWQsIHIpOwotCSAgKm1hbmdsZWQgKz0gcjsKLQl9Ci0gICAgfQotICBpZiAoIWlzX2phdmFfYXJyYXkpCi0gICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI8Iik7Ci0gIC8qIGdldCBzaXplIG9mIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0ICovCi0gIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmcikpCi0gICAgewotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIGlmICghaXNfdHlwZSkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYW4gYXJyYXkgZm9yIHNhdmluZyB0aGUgdGVtcGxhdGUgYXJndW1lbnQgdmFsdWVzLiAqLwotICAgICAgd29yay0+dG1wbF9hcmd2ZWMgPSAoY2hhcioqKSB4bWFsbG9jIChyICogc2l6ZW9mIChjaGFyICopKTsKLSAgICAgIHdvcmstPm50bXBsX2FyZ3MgPSByOwotICAgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLQl3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IDA7Ci0gICAgfQotICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChuZWVkX2NvbW1hKQotCXsKLQkgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiLCAiKTsKLQl9Ci0gICAgICAvKiBaIGZvciB0eXBlIHBhcmFtZXRlcnMgKi8KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ1onKQotCXsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIC8qIHRlbXAgaXMgaW5pdGlhbGl6ZWQgaW4gZG9fdHlwZSAqLwotCSAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCAmdGVtcCk7Ci0KLQkgICAgICBpZiAoIWlzX3R5cGUpCi0JCXsKLQkJICAvKiBTYXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gKi8KLQkJICBpbnQgbGVuID0gdGVtcC5wIC0gdGVtcC5iOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldID0geG1hbGxvYyAobGVuICsgMSk7Ci0JCSAgbWVtY3B5ICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSwgdGVtcC5iLCBsZW4pOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCQl9Ci0JICAgIH0KLQkgIHN0cmluZ19kZWxldGUoJnRlbXApOwotCSAgaWYgKCFzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiB6IGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCi0gICAgICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCXsKLQkgIGludCByMjsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSk7Ci0KLQkgIGlmIChzdWNjZXNzCi0JICAgICAgJiYgKHIyID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCkpID4gMAotCSAgICAgICYmIChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpID49IHIyKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIgIik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKHRuYW1lLCAqbWFuZ2xlZCwgcjIpOwotCSAgICAgIGlmICghaXNfdHlwZSkKLQkJewotCQkgIC8qIFNhdmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LiAqLwotCQkgIGludCBsZW4gPSByMjsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IHhtYWxsb2MgKGxlbiArIDEpOwotCQkgIG1lbWNweSAod29yay0+dG1wbF9hcmd2ZWNbaV0sICptYW5nbGVkLCBsZW4pOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCQl9Ci0JICAgICAgKm1hbmdsZWQgKz0gcjI7Ci0JICAgIH0KLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cmluZyAgcGFyYW07Ci0JICBzdHJpbmcqIHM7Ci0KLQkgIC8qIG90aGVyd2lzZSwgdmFsdWUgcGFyYW1ldGVyICovCi0KLQkgIC8qIHRlbXAgaXMgaW5pdGlhbGl6ZWQgaW4gZG9fdHlwZSAqLwotCSAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkgIHN0cmluZ19kZWxldGUoJnRlbXApOwotCSAgaWYgKCFzdWNjZXNzKQotCSAgICBicmVhazsKLQotCSAgaWYgKCFpc190eXBlKQotCSAgICB7Ci0JICAgICAgcyA9ICZwYXJhbTsKLQkgICAgICBzdHJpbmdfaW5pdCAocyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcyA9IHRuYW1lOwotCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgcywKLQkJCQkJCSAgKHR5cGVfa2luZF90KSBzdWNjZXNzKTsKLQotCSAgaWYgKCFzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgaWYgKCFpc190eXBlKQotCQlzdHJpbmdfZGVsZXRlIChzKTsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoIWlzX3R5cGUpCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gcy0+cCAtIHMtPmI7Ci0JICAgICAgd29yay0+dG1wbF9hcmd2ZWNbaV0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgICAgICBtZW1jcHkgKHdvcmstPnRtcGxfYXJndmVjW2ldLCBzLT5iLCBsZW4pOwotCSAgICAgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCi0JICAgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCBzKTsKLQkgICAgICBzdHJpbmdfZGVsZXRlIChzKTsKLQkgICAgfQotCX0KLSAgICAgIG5lZWRfY29tbWEgPSAxOwotICAgIH0KLSAgaWYgKGlzX2phdmFfYXJyYXkpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICJbXSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh0bmFtZS0+cFstMV0gPT0gJz4nKQotCXN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI+Iik7Ci0gICAgfQotCi0gIGlmIChpc190eXBlICYmIHJlbWVtYmVyKQotICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCB0bmFtZS0+YiwgTEVOX1NUUklORyAodG5hbWUpLCBiaW5kZXgpOwotCi0gIC8qCi0gICAgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCi0gICAgewotICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCArIDEpOwotICAgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0gICAgfQotICAgIH0KLSAgICAqLwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgaW50Ci1hcm1fcHQgKHdvcmssIG1hbmdsZWQsIG4sIGFuY2hvciwgYXJncykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKm1hbmdsZWQ7Ci0gICAgIGludCBuOwotICAgICBjb25zdCBjaGFyICoqYW5jaG9yLCAqKmFyZ3M7Ci17Ci0gIC8qIENoZWNrIGlmIEFSTSB0ZW1wbGF0ZSB3aXRoICJfX3B0X18iIGluIGl0ICgicGFyYW1ldGVyaXplZCB0eXBlIikgKi8KLSAgLyogQWxsb3cgSFAgYWxzbyBoZXJlLCBiZWNhdXNlIEhQJ3MgY2Zyb250IGNvbXBpbGVyIGZvbGxvd3MgQVJNIHRvIHNvbWUgZXh0ZW50ICovCi0gIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORykgJiYgKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fcHRfXyIpKSkKLSAgICB7Ci0gICAgICBpbnQgbGVuOwotICAgICAgKmFyZ3MgPSAqYW5jaG9yICsgNjsKLSAgICAgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotICAgICAgaWYgKGxlbiA9PSAtMSkKLQlyZXR1cm4gMDsKLSAgICAgIGlmICgqYXJncyArIGxlbiA9PSBtYW5nbGVkICsgbiAmJiAqKmFyZ3MgPT0gJ18nKQotCXsKLQkgICsrKmFyZ3M7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotICAgIHsKLSAgICAgIGlmICgoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX190bV9fIikpCi0gICAgICAgICAgfHwgKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fcHNfXyIpKQotICAgICAgICAgIHx8ICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3B0X18iKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbGVuOwotICAgICAgICAgICphcmdzID0gKmFuY2hvciArIDY7Ci0gICAgICAgICAgbGVuID0gY29uc3VtZV9jb3VudCAoYXJncyk7Ci0JICBpZiAobGVuID09IC0xKQotCSAgICByZXR1cm4gMDsKLSAgICAgICAgICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKysqYXJnczsKLSAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX1MiKSkpCi0gICAgICAgIHsKLSAJICBpbnQgbGVuOwotIAkgICphcmdzID0gKmFuY2hvciArIDM7Ci0gCSAgbGVuID0gY29uc3VtZV9jb3VudCAoYXJncyk7Ci0JICBpZiAobGVuID09IC0xKQotCSAgICByZXR1cm4gMDsKLSAJICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKysqYXJnczsKLSAJICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIG4sIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIGludCBuOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBjb25zdCBjaGFyICpwOwotICBjb25zdCBjaGFyICphcmdzOwotICBjb25zdCBjaGFyICplID0gKm1hbmdsZWQgKyBuOwotICBzdHJpbmcgYXJnOwotCi0gIC8qIENoZWNrIGZvciBIUCBhQ0MgdGVtcGxhdGUgc3BlYzogY2xhc3NYdDF0MiB3aGVyZSB0MSwgdDIgYXJlCi0gICAgIHRlbXBsYXRlIGFyZ3MgKi8KLSAgaWYgKEhQX0RFTUFOR0xJTkcgJiYgKCgqbWFuZ2xlZClbbl0gPT0gJ1gnKSkKLSAgICB7Ci0gICAgICBjaGFyICpzdGFydF9zcGVjX2FyZ3MgPSBOVUxMOwotCi0gICAgICAvKiBGaXJzdCBjaGVjayBmb3IgYW5kIG9taXQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gcHNldWRvLWFyZ3VtZW50cywKLSAgICAgICAgIHN1Y2ggYXMgaW4gIlNwZWM8IzEsIzEuKj4iICovCi0gICAgICBzdGFydF9zcGVjX2FyZ3MgPSBzdHJjaHIgKCptYW5nbGVkLCAnPCcpOwotICAgICAgaWYgKHN0YXJ0X3NwZWNfYXJncyAmJiAoc3RhcnRfc3BlY19hcmdzIC0gKm1hbmdsZWQgPCBuKSkKLSAgICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgc3RhcnRfc3BlY19hcmdzIC0gKm1hbmdsZWQpOwotICAgICAgZWxzZQotICAgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLSAgICAgICgqbWFuZ2xlZCkgKz0gbiArIDE7Ci0gICAgICBzdHJpbmdfaW5pdCAoJmFyZyk7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgLyogbm9uLXJlY3Vyc2l2ZSBjYWxsICovCi0gICAgICAgIHdvcmstPnRlbXBfc3RhcnQgPSBkZWNscC0+cCAtIGRlY2xwLT5iOwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI8Iik7Ci0gICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19jbGVhciAoJmFyZyk7Ci0gICAgICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgICAgICAgIC8qICdUJyBzaWduYWxzIGEgdHlwZSBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ1UnOgotICAgICAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICAvKiAnVScgb3IgJ1MnIHNpZ25hbHMgYW4gaW50ZWdyYWwgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgICAgIC8qICdBJyBzaWduYWxzIGEgbmFtZWQgY29uc3RhbnQgZXhwcmVzc2lvbiAobGl0ZXJhbCkgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgKHdvcmssIG1hbmdsZWQsICZhcmcpKQotICAgICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBUb2RheSwgMTk5Ny0wOS0wMywgd2UgaGF2ZSBvbmx5IHRoZSBhYm92ZSB0eXBlcwotICAgICAgICAgICAgICAgICAgIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAvKiBGSVhNRTogbWF5YmUgdGhpcyBzaG91bGQgZmFpbCBhbmQgcmV0dXJuIG51bGwgKi8KLSAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOwotICAgICAgICAgLyogQ2hlY2sgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0ZW1wbGF0ZSBhcmdzLgotICAgICAgICAgICAgIDAgaWYgYXQgZW5kIG9mIHN0YXRpYyBtZW1iZXIgb2YgdGVtcGxhdGUgY2xhc3MsCi0gICAgICAgICAgICAgXyBpZiBkb25lIHdpdGggdGVtcGxhdGUgYXJncyBmb3IgYSBmdW5jdGlvbiAqLwotICAgICAgICAgIGlmICgoKiptYW5nbGVkID09ICdcMDAwJykgfHwgKCoqbWFuZ2xlZCA9PSAnXycpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0gICAgICAgIH0KLSAgICBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU6Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIj4iKTsKLSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0gICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qIEFSTSB0ZW1wbGF0ZT8gKEFsc28gaGFuZGxlcyBIUCBjZnJvbnQgZXh0ZW5zaW9ucykgKi8KLSAgZWxzZSBpZiAoYXJtX3B0ICh3b3JrLCAqbWFuZ2xlZCwgbiwgJnAsICZhcmdzKSkKLSAgICB7Ci0gICAgICBzdHJpbmcgdHlwZV9zdHI7Ci0KLSAgICAgIHN0cmluZ19pbml0ICgmYXJnKTsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIHAgLSAqbWFuZ2xlZCk7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgIC8qIG5vbi1yZWN1cnNpdmUgY2FsbCAqLwotCXdvcmstPnRlbXBfc3RhcnQgPSBkZWNscC0+cCAtIGRlY2xwLT5iOwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI8Iik7Ci0gICAgICAvKiBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcgaGVyZSAqLwotICAgICAgd2hpbGUgKGFyZ3MgPCBlKSB7Ci0Jc3RyaW5nX2NsZWFyICgmYXJnKTsKLQotCS8qIENoZWNrIGZvciB0eXBlIG9yIGxpdGVyYWwgaGVyZSAqLwotCXN3aXRjaCAoKmFyZ3MpCi0JICB7Ci0JICAgIC8qIEhQIGNmcm9udCBleHRlbnNpb25zIHRvIEFSTSBmb3IgdGVtcGxhdGUgYXJncyAqLwotCSAgICAvKiBzcGVjOiBYdDFMdjEgd2hlcmUgdDEgaXMgYSB0eXBlLCB2MSBpcyBhIGxpdGVyYWwgdmFsdWUgKi8KLQkgICAgLyogRklYTUU6IFdlIGhhbmRsZSBvbmx5IG51bWVyaWMgbGl0ZXJhbHMgZm9yIEhQIGNmcm9udCAqLwotICAgICAgICAgIGNhc2UgJ1gnOgotICAgICAgICAgICAgLyogQSB0eXBlZCBjb25zdGFudCB2YWx1ZSBmb2xsb3dzICovCi0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICBpZiAoIWRvX3R5cGUgKHdvcmssICZhcmdzLCAmdHlwZV9zdHIpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKCZhcmcsICIoIik7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAoJmFyZywgJnR5cGVfc3RyKTsKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKCZhcmcsICIpIik7Ci0gICAgICAgICAgICBpZiAoKmFyZ3MgIT0gJ0wnKQotICAgICAgICAgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICAvKiBOb3cgc25hcmYgYSBsaXRlcmFsIHZhbHVlIGZvbGxvd2luZyAnTCcgKi8KLSAgICAgICAgICAgIGlmICghc25hcmZfbnVtZXJpY19saXRlcmFsICgmYXJncywgJmFyZykpCi0JICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdMJzoKLSAgICAgICAgICAgIC8qIFNuYXJmIGEgbGl0ZXJhbCBmb2xsb3dpbmcgJ0wnICovCi0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICBpZiAoIXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoJmFyZ3MsICZhcmcpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBOb3QgaGFuZGxpbmcgb3RoZXIgSFAgY2Zyb250IHN0dWZmICovCi0gICAgICAgICAgICBpZiAoIWRvX3R5cGUgKHdvcmssICZhcmdzLCAmYXJnKSkKLSAgICAgICAgICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotCSAgfQotCXN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0Jc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0gICAgICB9Ci0gICAgY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZToKLSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotICAgICAgaWYgKGFyZ3MgPj0gZSkKLQktLWRlY2xwLT5wOyAvKiByZW1vdmUgZXh0cmEgY29tbWEgKi8KLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPiIpOwotICAgIH0KLSAgZWxzZSBpZiAobj4xMCAmJiBzdHJuY21wICgqbWFuZ2xlZCwgIl9HTE9CQUxfIiwgOCkgPT0gMAotCSAgICYmICgqbWFuZ2xlZClbOV0gPT0gJ04nCi0JICAgJiYgKCptYW5nbGVkKVs4XSA9PSAoKm1hbmdsZWQpWzEwXQotCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVs4XSkpCi0gICAgewotICAgICAgLyogQSBtZW1iZXIgb2YgdGhlIGFub255bW91cyBuYW1lc3BhY2UuICAqLwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJ7YW5vbnltb3VzfSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ID09IC0xKSAvKiBub24tcmVjdXJzaXZlIGNhbGwgb25seSAqLwotCXdvcmstPnRlbXBfc3RhcnQgPSAwOyAgICAgLyogZGlzYWJsZSBpbiByZWN1cnNpdmUgY2FsbHMgKi8KLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotICAgIH0KLSAgKm1hbmdsZWQgKz0gbjsKLX0KLQotLyogRXh0cmFjdCBhIGNsYXNzIG5hbWUsIHBvc3NpYmx5IGEgdGVtcGxhdGUgd2l0aCBhcmd1bWVudHMsIGZyb20gdGhlCi0gICBtYW5nbGVkIHN0cmluZzsgcXVhbGlmaWVycywgbG9jYWwgY2xhc3MgaW5kaWNhdG9ycywgZXRjLiBoYXZlCi0gICBhbHJlYWR5IGJlZW4gZGVhbHQgd2l0aCAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9jbGFzc19uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotCi0gIG4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgaWYgKG4gPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICgoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA+PSBuKQotICAgIHsKLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgbiwgZGVjbHApOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotCi0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9jbGFzcyAtLSBkZW1hbmdsZSBhIG1hbmdsZWQgY2xhc3Mgc2VxdWVuY2UKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9jbGFzcyAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkJc3RyaW50ICpkZWNscCkKLQotREVTQ1JJUFRJT04KLQotCURFQ0xQIHBvaW50cyB0byB0aGUgYnVmZmVyIGludG8gd2hpY2ggZGVtYW5nbGluZyBpcyBiZWluZyBkb25lLgotCi0JKk1BTkdMRUQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHRva2VuIHRvIGJlIGRlbWFuZ2xlZC4gIE9uIGlucHV0LAotCWl0IHBvaW50cyB0byBhIG1hbmdsZWQgY2xhc3MgKEkuRS4gIjNmb28iLCAiMTN2ZXJ5bG9uZ2NsYXNzIiwgZXRjLikKLQlPbiBleGl0LCBpdCBwb2ludHMgdG8gdGhlIG5leHQgdG9rZW4gYWZ0ZXIgdGhlIG1hbmdsZWQgY2xhc3Mgb24KLQlzdWNjZXNzLCBvciB0aGUgZmlyc3QgdW5jb25zdW1lZCB0b2tlbiBvbiBmYWlsdXJlLgotCi0JSWYgdGhlIENPTlNUUlVDVE9SIG9yIERFU1RSVUNUT1IgZmxhZ3MgYXJlIHNldCBpbiBXT1JLLCB0aGVuCi0Jd2UgYXJlIGRlbWFuZ2xpbmcgYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgSW4gdGhpcyBjYXNlCi0Jd2UgcHJlcGVuZCAiY2xhc3M6OmNsYXNzIiBvciAiY2xhc3M6On5jbGFzcyIgdG8gREVDTFAuCi0KLQlPdGhlcndpc2UsIHdlIHByZXBlbmQgImNsYXNzOjoiIHRvIHRoZSBjdXJyZW50IERFQ0xQLgotCi0JUmVzZXQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZmxhZ3Mgb25jZSB0aGV5IGhhdmUgYmVlbgotCSJjb25zdW1lZCIuICBUaGlzIGFsbG93cyBkZW1hbmdsZV9jbGFzcyB0byBiZSBjYWxsZWQgbGF0ZXIgZHVyaW5nCi0JdGhlIHNhbWUgZGVtYW5nbGluZywgdG8gZG8gbm9ybWFsIGNsYXNzIGRlbWFuZ2xpbmcuCi0KLQlSZXR1cm5zIDEgaWYgZGVtYW5nbGluZyBpcyBzdWNjZXNzZnVsLCAwIG90aGVyd2lzZS4KLQotKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMDsKLSAgaW50IGJ0eXBlOwotICBzdHJpbmcgY2xhc3NfbmFtZTsKLSAgY2hhciAqc2F2ZV9jbGFzc19uYW1lX2VuZCA9IDA7Ci0KLSAgc3RyaW5nX2luaXQgKCZjbGFzc19uYW1lKTsKLSAgYnR5cGUgPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0gIGlmIChkZW1hbmdsZV9jbGFzc19uYW1lICh3b3JrLCBtYW5nbGVkLCAmY2xhc3NfbmFtZSkpCi0gICAgewotICAgICAgc2F2ZV9jbGFzc19uYW1lX2VuZCA9IGNsYXNzX25hbWUucDsKLSAgICAgIGlmICgod29yay0+Y29uc3RydWN0b3IgJiAxKSB8fCAod29yay0+ZGVzdHJ1Y3RvciAmIDEpKQotCXsKLSAgICAgICAgICAvKiBhZGp1c3Qgc28gd2UgZG9uJ3QgaW5jbHVkZSB0ZW1wbGF0ZSBhcmdzICovCi0gICAgICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgJiYgKHdvcmstPnRlbXBfc3RhcnQgIT0gLTEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjbGFzc19uYW1lLnAgPSBjbGFzc19uYW1lLmIgKyB3b3JrLT50ZW1wX3N0YXJ0OwotICAgICAgICAgICAgfQotCSAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJmNsYXNzX25hbWUpOwotCSAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsICJ+Iik7Ci0gICAgICAgICAgICAgIHdvcmsgLT4gZGVzdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3b3JrIC0+IGNvbnN0cnVjdG9yIC09IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBjbGFzc19uYW1lLnAgPSBzYXZlX2NsYXNzX25hbWVfZW5kOwotICAgICAgcmVtZW1iZXJfS3R5cGUgKHdvcmssIGNsYXNzX25hbWUuYiwgTEVOX1NUUklORygmY2xhc3NfbmFtZSkpOwotICAgICAgcmVtZW1iZXJfQnR5cGUgKHdvcmssIGNsYXNzX25hbWUuYiwgTEVOX1NUUklORygmY2xhc3NfbmFtZSksIGJ0eXBlKTsKLSAgICAgIHN0cmluZ19wcmVwZW5kIChkZWNscCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmY2xhc3NfbmFtZSk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gIHN0cmluZ19kZWxldGUgKCZjbGFzc19uYW1lKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3ByZWZpeCAtLSBjb25zdW1lIHRoZSBtYW5nbGVkIG5hbWUgcHJlZml4IGFuZCBmaW5kIHNpZ25hdHVyZQotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX3ByZWZpeCAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkJIHN0cmluZyAqZGVjbHApOwotCi1ERVNDUklQVElPTgotCi0JQ29uc3VtZSBhbmQgZGVtYW5nbGUgdGhlIHByZWZpeCBvZiB0aGUgbWFuZ2xlZCBuYW1lLgotCi0JREVDTFAgcG9pbnRzIHRvIHRoZSBzdHJpbmcgYnVmZmVyIGludG8gd2hpY2ggZGVtYW5nbGVkIG91dHB1dCBpcwotCXBsYWNlZC4gIE9uIGVudHJ5LCB0aGUgYnVmZmVyIGlzIGVtcHR5LiAgT24gZXhpdCBpdCBjb250YWlucwotCXRoZSByb290IGZ1bmN0aW9uIG5hbWUsIHRoZSBkZW1hbmdsZWQgb3BlcmF0b3IgbmFtZSwgb3IgaW4gc29tZQotCXNwZWNpYWwgY2FzZXMgZWl0aGVyIG5vdGhpbmcgb3IgdGhlIGNvbXBsZXRlbHkgZGVtYW5nbGVkIHJlc3VsdC4KLQotCU1BTkdMRUQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHBvaW50ZXIgaW50byB0aGUgbWFuZ2xlZCBuYW1lLiAgQXMgZWFjaAotCXRva2VuIG9mIHRoZSBtYW5nbGVkIG5hbWUgaXMgY29uc3VtZWQsIGl0IGlzIHVwZGF0ZWQuICBVcG9uIGVudHJ5Ci0JdGhlIGN1cnJlbnQgbWFuZ2xlZCBuYW1lIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKLQl0aGUgbWFuZ2xlZCBuYW1lLiAgVXBvbiBleGl0LCBpdCBzaG91bGQgcG9pbnQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgotCW9mIHRoZSBzaWduYXR1cmUgaWYgZGVtYW5nbGluZyB3YXMgc3VjY2Vzc2Z1bCwgb3IgdG8gdGhlIGZpcnN0Ci0JdW5jb25zdW1lZCBjaGFyYWN0ZXIgaWYgZGVtYW5nbGluZyBvZiB0aGUgcHJlZml4IHdhcyB1bnN1Y2Nlc3NmdWwuCi0KLQlSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UuCi0gKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfcHJlZml4ICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNvbnN0IGNoYXIgKnNjYW47Ci0gIGludCBpOwotCi0gIGlmIChzdHJsZW4oKm1hbmdsZWQpID4gNgotICAgICAgJiYgKHN0cm5jbXAoKm1hbmdsZWQsICJfaW1wX18iLCA2KSA9PSAwCi0gICAgICAgICAgfHwgc3RybmNtcCgqbWFuZ2xlZCwgIl9faW1wXyIsIDYpID09IDApKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBzeW1ib2wgaW1wb3J0ZWQgZnJvbSBhIFBFIGR5bmFtaWMgbGlicmFyeS4gQ2hlY2sgZm9yIGJvdGgKLSAgICAgICAgIG5ldyBzdHlsZSBwcmVmaXggX2ltcF9fIGFuZCBsZWdhY3kgX19pbXBfIHVzZWQgYnkgb2xkZXIgdmVyc2lvbnMKLQkgb2YgZGxsdG9vbC4gKi8KLSAgICAgICgqbWFuZ2xlZCkgKz0gNjsKLSAgICAgIHdvcmstPmRsbGltcG9ydGVkID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmxlbigqbWFuZ2xlZCkgPj0gMTEgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9HTE9CQUxfIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICptYXJrZXIgPSBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbOF0pOwotICAgICAgaWYgKG1hcmtlciAhPSBOVUxMICYmICptYXJrZXIgPT0gKCptYW5nbGVkKVsxMF0pCi0JewotCSAgaWYgKCgqbWFuZ2xlZClbOV0gPT0gJ0QnKQotCSAgICB7Ci0JICAgICAgLyogaXQncyBhIEdOVSBnbG9iYWwgZGVzdHJ1Y3RvciB0byBiZSBleGVjdXRlZCBhdCBwcm9ncmFtIGV4aXQgKi8KLQkgICAgICAoKm1hbmdsZWQpICs9IDExOwotCSAgICAgIHdvcmstPmRlc3RydWN0b3IgPSAyOwotCSAgICAgIGlmIChnbnVfc3BlY2lhbCAod29yaywgbWFuZ2xlZCwgZGVjbHApKQotCQlyZXR1cm4gc3VjY2VzczsKLQkgICAgfQotCSAgZWxzZSBpZiAoKCptYW5nbGVkKVs5XSA9PSAnSScpCi0JICAgIHsKLQkgICAgICAvKiBpdCdzIGEgR05VIGdsb2JhbCBjb25zdHJ1Y3RvciB0byBiZSBleGVjdXRlZCBhdCBwcm9ncmFtIGluaXQgKi8KLQkgICAgICAoKm1hbmdsZWQpICs9IDExOwotCSAgICAgIHdvcmstPmNvbnN0cnVjdG9yID0gMjsKLQkgICAgICBpZiAoZ251X3NwZWNpYWwgKHdvcmssIG1hbmdsZWQsIGRlY2xwKSkKLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9fc3RkX18iLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBBUk0gZ2xvYmFsIGRlc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBleGl0ICovCi0gICAgICAoKm1hbmdsZWQpICs9IDc7Ci0gICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKChBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiBzdHJuY21wKCptYW5nbGVkLCAiX19zdGlfXyIsIDcpID09IDApCi0gICAgewotICAgICAgLyogaXQncyBhIEFSTSBnbG9iYWwgY29uc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBpbml0aWFsICovCi0gICAgICAoKm1hbmdsZWQpICs9IDc7Ci0gICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDI7Ci0gICAgfQotCi0gIC8qICBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgYSByZWR1Y3Rpb24gaW4gc3RyZW5ndGggdGltZSBvcHRpbWl6YXRpb24KLSAgICAgIG9mOgotICAgICAgc2NhbiA9IG15c3Ryc3RyICgqbWFuZ2xlZCwgIl9fIik7ICovCi0KLSAgewotICAgIHNjYW4gPSAqbWFuZ2xlZDsKLQotICAgIGRvIHsKLSAgICAgIHNjYW4gPSBzdHJjaHIgKHNjYW4sICdfJyk7Ci0gICAgfSB3aGlsZSAoc2NhbiAhPSBOVUxMICYmICorK3NjYW4gIT0gJ18nKTsKLQotICAgIGlmIChzY2FuICE9IE5VTEwpIC0tc2NhbjsKLSAgfQotCi0gIGlmIChzY2FuICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgZm91bmQgYSBzZXF1ZW5jZSBvZiB0d28gb3IgbW9yZSAnXycsIGVuc3VyZSB0aGF0IHdlIHN0YXJ0IGF0Ci0JIHRoZSBsYXN0IHBhaXIgaW4gdGhlIHNlcXVlbmNlLiAgKi8KLSAgICAgIGkgPSBzdHJzcG4gKHNjYW4sICJfIik7Ci0gICAgICBpZiAoaSA+IDIpCi0JewotCSAgc2NhbiArPSAoaSAtIDIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNjYW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCi0gICAgewotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzBdKSAmJiAoc2NhblswXSAhPSAndCcpKQotCXsKLQkgIHN1Y2Nlc3MgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKChzY2FuID09ICptYW5nbGVkKQotCSAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKSB8fCAoc2NhblsyXSA9PSAnUScpCi0JICAgICAgIHx8IChzY2FuWzJdID09ICd0JykgfHwgKHNjYW5bMl0gPT0gJ0snKSB8fCAoc2NhblsyXSA9PSAnSCcpKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgQVJNIHNheXMgbm90aGluZyBhYm91dCB0aGUgbWFuZ2xpbmcgb2YgbG9jYWwgdmFyaWFibGVzLgotCSBCdXQgY2Zyb250IG1hbmdsZXMgbG9jYWwgdmFyaWFibGVzIGJ5IHByZXBlbmRpbmcgX188bmVzdGluZ19sZXZlbD4KLQkgdG8gdGhlbS4gQXMgYW4gZXh0ZW5zaW9uIHRvIEFSTSBkZW1hbmdsaW5nIHdlIGhhbmRsZSB0aGlzIGNhc2UuICAqLwotICAgICAgaWYgKChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcpCi0JICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKSkKLQl7Ci0JICAqbWFuZ2xlZCA9IHNjYW4gKyAyOwotCSAgY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQpOwotCSAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0JICBzdWNjZXNzID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBHTlUgc3R5bGUgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggX19bMC05UXRdLiAgQnV0IGNmcm9udCB1c2VzCi0JICAgICBuYW1lcyBsaWtlIF9fUTJfM2ZvbzNiYXIgZm9yIG5lc3RlZCB0eXBlIG5hbWVzLiAgU28gZG9uJ3QgYWNjZXB0Ci0JICAgICB0aGlzIHN0eWxlIG9mIGNvbnN0cnVjdG9yIGZvciBjZnJvbnQgZGVtYW5nbGluZy4gIEEgR05VCi0JICAgICBzdHlsZSBtZW1iZXItdGVtcGxhdGUgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggJ0gnLiAqLwotCSAgaWYgKCEoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSkKLQkgICAgd29yayAtPiBjb25zdHJ1Y3RvciArPSAxOwotCSAgKm1hbmdsZWQgPSBzY2FuICsgMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChBUk1fREVNQU5HTElORyAmJiBzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICd0JykKLSAgICB7Ci0gICAgICAvKiBDZnJvbnQtc3R5bGUgcGFyYW1ldGVyaXplZCB0eXBlLiAgSGFuZGxlZCBsYXRlciBhcyBhIHNpZ25hdHVyZS4gKi8KLSAgICAgIHN1Y2Nlc3MgPSAxOwotCi0gICAgICAvKiBBUk0gdGVtcGxhdGU/ICovCi0gICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIHN0cmxlbiAoKm1hbmdsZWQpLCBkZWNscCk7Ci0gICAgfQotICBlbHNlIGlmIChFREdfREVNQU5HTElORyAmJiAoKHNjYW5bMl0gPT0gJ3QnICYmIHNjYW5bM10gPT0gJ20nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNjYW5bMl0gPT0gJ3AnICYmIHNjYW5bM10gPT0gJ3MnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNjYW5bMl0gPT0gJ3AnICYmIHNjYW5bM10gPT0gJ3QnKSkpCi0gICAgewotICAgICAgLyogRURHLXN0eWxlIHBhcmFtZXRlcml6ZWQgdHlwZS4gIEhhbmRsZWQgbGF0ZXIgYXMgYSBzaWduYXR1cmUuICovCi0gICAgICBzdWNjZXNzID0gMTsKLQotICAgICAgLyogRURHIHRlbXBsYXRlPyAqLwotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBzdHJsZW4gKCptYW5nbGVkKSwgZGVjbHApOwotICAgIH0KLSAgZWxzZSBpZiAoKHNjYW4gPT0gKm1hbmdsZWQpICYmICFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKQotCSAgICYmIChzY2FuWzJdICE9ICd0JykpCi0gICAgewotICAgICAgLyogTWFuZ2xlZCBuYW1lIHN0YXJ0cyB3aXRoICJfXyIuICBTa2lwIG92ZXIgYW55IGxlYWRpbmcgJ18nIGNoYXJhY3RlcnMsCi0JIHRoZW4gZmluZCB0aGUgbmV4dCAiX18iIHRoYXQgc2VwYXJhdGVzIHRoZSBwcmVmaXggZnJvbSB0aGUgc2lnbmF0dXJlLgotCSAqLwotICAgICAgaWYgKCEoQVJNX0RFTUFOR0xJTkcgfHwgTFVDSURfREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgfHwgKGFybV9zcGVjaWFsIChtYW5nbGVkLCBkZWNscCkgPT0gMCkpCi0JewotCSAgd2hpbGUgKCpzY2FuID09ICdfJykKLQkgICAgewotCSAgICAgIHNjYW4rKzsKLQkgICAgfQotCSAgaWYgKChzY2FuID0gbXlzdHJzdHIgKHNjYW4sICJfXyIpKSA9PSBOVUxMIHx8ICgqKHNjYW4gKyAyKSA9PSAnXDAnKSkKLQkgICAgewotCSAgICAgIC8qIE5vIHNlcGFyYXRvciAoSS5FLiAiX19ub3RfbWFuZ2xlZCIpLCBvciBlbXB0eSBzaWduYXR1cmUKLQkJIChJLkUuICJfX25vdF9tYW5nbGVkX2VpdGhlcl9fIikgKi8KLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqdG1wOwotCi0gICAgICAgICAgICAgIC8qIExvb2sgZm9yIHRoZSBMQVNUIG9jY3VycmVuY2Ugb2YgX18sIGFsbG93aW5nIG5hbWVzIHRvCi0gICAgICAgICAgICAgICAgIGhhdmUgdGhlICdfXycgc2VxdWVuY2UgZW1iZWRkZWQgaW4gdGhlbS4gKi8KLQkgICAgICBpZiAoIShBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HKSkKLQkJewotCQkgIHdoaWxlICgodG1wID0gbXlzdHJzdHIgKHNjYW4gKyAyLCAiX18iKSkgIT0gTlVMTCkKLQkJICAgIHNjYW4gPSB0bXA7Ci0JCX0KLQkgICAgICBpZiAoKihzY2FuICsgMikgPT0gJ1wwJykKLQkJc3VjY2VzcyA9IDA7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2Nhbik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICgqKHNjYW4gKyAyKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIE1hbmdsZWQgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICJfXyIgYnV0IGRvZXMgaGF2ZSBvbmUgc29tZXdoZXJlCi0JIGluIHRoZXJlIHdpdGggbm9uIGVtcHR5IHN0dWZmIGFmdGVyIGl0LiAgTG9va3MgbGlrZSBhIGdsb2JhbAotCSBmdW5jdGlvbiBuYW1lLiAgKi8KLSAgICAgIGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCBzY2FuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBEb2Vzbid0IGxvb2sgbGlrZSBhIG1hbmdsZWQgbmFtZSAqLwotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotCi0gIGlmICghc3VjY2VzcyAmJiAod29yay0+Y29uc3RydWN0b3IgPT0gMiB8fCB3b3JrLT5kZXN0cnVjdG9yID09IDIpKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCk7Ci0gICAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWdudV9zcGVjaWFsIC0tIHNwZWNpYWwgaGFuZGxpbmcgb2YgZ251IG1hbmdsZWQgc3RyaW5ncwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWdudV9zcGVjaWFsIChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCSAgICAgc3RyaW5nICpkZWNscCk7Ci0KLQotREVTQ1JJUFRJT04KLQotCVByb2Nlc3Mgc29tZSBzcGVjaWFsIEdOVSBzdHlsZSBtYW5nbGluZyBmb3JtcyB0aGF0IGRvbid0IGZpdAotCXRoZSBub3JtYWwgcGF0dGVybi4gIEZvciBleGFtcGxlOgotCi0JCV8kXzNmb28JCShkZXN0cnVjdG9yIGZvciBjbGFzcyBmb28pCi0JCV92dCRmb28JCShmb28gdmlydHVhbCB0YWJsZSkKLQkJX3Z0JGZvbyRiYXIJKGZvbzo6YmFyIHZpcnR1YWwgdGFibGUpCi0JCV9fdnRfZm9vCShmb28gdmlydHVhbCB0YWJsZSwgbmV3IHN0eWxlIHdpdGggdGh1bmtzKQotCQlfM2ZvbyR2YXJuYW1lCShzdGF0aWMgZGF0YSBtZW1iZXIpCi0JCV9RMjJyczJ0dSR2dwkoc3RhdGljIGRhdGEgbWVtYmVyKQotCQlfX3Q2dmVjdG9yMVppaQkoY29uc3RydWN0b3Igd2l0aCB0ZW1wbGF0ZSkKLQkJX190aHVua180X18kXzdvc3RyZWFtICh2aXJ0dWFsIGZ1bmN0aW9uIHRodW5rKQotICovCi0KLXN0YXRpYyBpbnQKLWdudV9zcGVjaWFsICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpwOwotCi0gIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJwotICAgICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzFdKSAhPSBOVUxMCi0gICAgICAmJiAoKm1hbmdsZWQpWzJdID09ICdfJykKLSAgICB7Ci0gICAgICAvKiBGb3VuZCBhIEdOVSBzdHlsZSBkZXN0cnVjdG9yLCBnZXQgcGFzdCAiXzxDUExVU19NQVJLRVI+XyIgKi8KLSAgICAgICgqbWFuZ2xlZCkgKz0gMzsKLSAgICAgIHdvcmsgLT4gZGVzdHJ1Y3RvciArPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycKLQkgICAmJiAoKCgqbWFuZ2xlZClbMV0gPT0gJ18nCi0JCSYmICgqbWFuZ2xlZClbMl0gPT0gJ3YnCi0JCSYmICgqbWFuZ2xlZClbM10gPT0gJ3QnCi0JCSYmICgqbWFuZ2xlZClbNF0gPT0gJ18nKQotCSAgICAgICB8fCAoKCptYW5nbGVkKVsxXSA9PSAndicKLQkJICAgJiYgKCptYW5nbGVkKVsyXSA9PSAndCcKLQkJICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzNdKSAhPSBOVUxMKSkpCi0gICAgewotICAgICAgLyogRm91bmQgYSBHTlUgc3R5bGUgdmlydHVhbCB0YWJsZSwgZ2V0IHBhc3QgIl92dDxDUExVU19NQVJLRVI+IgotICAgICAgICAgYW5kIGNyZWF0ZSB0aGUgZGVjbC4gIE5vdGUgdGhhdCB3ZSBjb25zdW1lIHRoZSBlbnRpcmUgbWFuZ2xlZAotCSBpbnB1dCBzdHJpbmcsIHdoaWNoIG1lYW5zIHRoYXQgZGVtYW5nbGVfc2lnbmF0dXJlIGhhcyBubyB3b3JrCi0JIHRvIGRvLiAgKi8KLSAgICAgIGlmICgoKm1hbmdsZWQpWzJdID09ICd2JykKLQkoKm1hbmdsZWQpICs9IDU7IC8qIE5ldyBzdHlsZSwgd2l0aCB0aHVua3M6ICJfX3Z0XyIgKi8KLSAgICAgIGVsc2UKLQkoKm1hbmdsZWQpICs9IDQ7IC8qIE9sZCBzdHlsZSwgbm8gdGh1bmtzOiAiX3Z0PENQTFVTX01BUktFUj4iICovCi0gICAgICB3aGlsZSAoKiptYW5nbGVkICE9ICdcMCcpCi0JewotCSAgc3dpdGNoICgqKm1hbmdsZWQpCi0JICAgIHsKLQkgICAgY2FzZSAnUSc6Ci0JICAgIGNhc2UgJ0snOgotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndCc6Ci0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwKLQkJCQkJICAgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKm1hbmdsZWRbMF0pKQotCQl7Ci0JCSAgbiA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCk7Ci0JCSAgLyogV2UgbWF5IGJlIHNlZWluZyBhIHRvby1sYXJnZSBzaXplLCBvciBlbHNlIGEKLQkJICAgICAiLjxkaWdpdHM+IiBpbmRpY2F0aW5nIGEgc3RhdGljIGxvY2FsIHN5bWJvbC4gIEluCi0JCSAgICAgYW55IGNhc2UsIGRlY2xhcmUgdmljdG9yeSBhbmQgbW92ZSBvbjsgKmRvbid0KiB0cnkKLQkJICAgICB0byB1c2UgbiB0byBhbGxvY2F0ZS4gICovCi0JCSAgaWYgKG4gPiAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSkKLQkJICAgIHsKLQkJICAgICAgc3VjY2VzcyA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbiA9IHN0cmNzcG4gKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKTsKLQkJfQotCSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgICAgICgqbWFuZ2xlZCkgKz0gbjsKLQkgICAgfQotCi0JICBwID0gc3RycGJyayAoKm1hbmdsZWQsIGNwbHVzX21hcmtlcnMpOwotCSAgaWYgKHN1Y2Nlc3MgJiYgKChwID09IE5VTEwpIHx8IChwID09ICptYW5nbGVkKSkpCi0JICAgIHsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQl7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOwotCQkgICgqbWFuZ2xlZCkrKzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzdWNjZXNzKQotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiIHZpcnR1YWwgdGFibGUiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nCi0JICAgJiYgKHN0cmNocigiMDEyMzQ1Njc4OVF0IiwgKCptYW5nbGVkKVsxXSkgIT0gTlVMTCkKLQkgICAmJiAocCA9IHN0cnBicmsgKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzdGF0aWMgZGF0YSBtZW1iZXIsICJfM2ZvbyR2YXJuYW1lIiBmb3IgZXhhbXBsZSAqLwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ1EnOgotCWNhc2UgJ0snOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxLCAxKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICBpZiAobiA8IDAgfHwgbiA+IHN0cmxlbiAoKm1hbmdsZWQpKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgKCptYW5nbGVkKSArPSBuOwotCX0KLSAgICAgIGlmIChzdWNjZXNzICYmIChwID09ICptYW5nbGVkKSkKLQl7Ci0JICAvKiBDb25zdW1lZCBldmVyeXRoaW5nIHVwIHRvIHRoZSBjcGx1c19tYXJrZXIsIGFwcGVuZCB0aGUKLQkgICAgIHZhcmlhYmxlIG5hbWUuICAqLwotCSAgKCptYW5nbGVkKSsrOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOwotCSAgbiA9IHN0cmxlbiAoKm1hbmdsZWQpOwotCSAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0JICAoKm1hbmdsZWQpICs9IG47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN1Y2Nlc3MgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKCptYW5nbGVkLCAiX190aHVua18iLCA4KSA9PSAwKQotICAgIHsKLSAgICAgIGludCBkZWx0YTsKLQotICAgICAgKCptYW5nbGVkKSArPSA4OwotICAgICAgZGVsdGEgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmIChkZWx0YSA9PSAtMSkKLQlzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICptZXRob2QgPSBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSAod29yaywgKysqbWFuZ2xlZCk7Ci0KLQkgIGlmIChtZXRob2QpCi0JICAgIHsKLQkgICAgICBjaGFyIGJ1Zls1MF07Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAidmlydHVhbCBmdW5jdGlvbiB0aHVuayAoZGVsdGE6JWQpIGZvciAiLCAtZGVsdGEpOwotCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBidWYpOwotCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBtZXRob2QpOwotCSAgICAgIGZyZWUgKG1ldGhvZCk7Ci0JICAgICAgbiA9IHN0cmxlbiAoKm1hbmdsZWQpOwotCSAgICAgICgqbWFuZ2xlZCkgKz0gbjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgIl9fdCIsIDMpID09IDAKLQkgICAmJiAoKCptYW5nbGVkKVszXSA9PSAnaScgfHwgKCptYW5nbGVkKVszXSA9PSAnZicpKQotICAgIHsKLSAgICAgIHAgPSAoKm1hbmdsZWQpWzNdID09ICdpJyA/ICIgdHlwZV9pbmZvIG5vZGUiIDogIiB0eXBlX2luZm8gZnVuY3Rpb24iOwotICAgICAgKCptYW5nbGVkKSArPSA0OwotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ1EnOgotCWNhc2UgJ0snOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxLCAxKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfZnVuZF90eXBlICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoc3VjY2VzcyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykKLQlzdWNjZXNzID0gMDsKLSAgICAgIGlmIChzdWNjZXNzKQotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCBwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWN1cnNpdmVseV9kZW1hbmdsZSh3b3JrLCBtYW5nbGVkLCByZXN1bHQsIG5hbWVsZW5ndGgpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci0gICAgIGludCBuYW1lbGVuZ3RoOwotewotICBjaGFyICogcmVjdXJzZSA9IChjaGFyICopTlVMTDsKLSAgY2hhciAqIHJlY3Vyc2VfZGVtID0gKGNoYXIgKilOVUxMOwotCi0gIHJlY3Vyc2UgPSAoY2hhciAqKSB4bWFsbG9jIChuYW1lbGVuZ3RoICsgMSk7Ci0gIG1lbWNweSAocmVjdXJzZSwgKm1hbmdsZWQsIG5hbWVsZW5ndGgpOwotICByZWN1cnNlW25hbWVsZW5ndGhdID0gJ1wwMDAnOwotCi0gIHJlY3Vyc2VfZGVtID0gY3BsdXNfZGVtYW5nbGUgKHJlY3Vyc2UsIHdvcmstPm9wdGlvbnMpOwotCi0gIGlmIChyZWN1cnNlX2RlbSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHJlY3Vyc2VfZGVtKTsKLSAgICAgIGZyZWUgKHJlY3Vyc2VfZGVtKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocmVzdWx0LCAqbWFuZ2xlZCwgbmFtZWxlbmd0aCk7Ci0gICAgfQotICBmcmVlIChyZWN1cnNlKTsKLSAgKm1hbmdsZWQgKz0gbmFtZWxlbmd0aDsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWFybV9zcGVjaWFsIC0tIHNwZWNpYWwgaGFuZGxpbmcgb2YgQVJNL2x1Y2lkIG1hbmdsZWQgc3RyaW5ncwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWFybV9zcGVjaWFsIChjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJICAgICBzdHJpbmcgKmRlY2xwKTsKLQotCi1ERVNDUklQVElPTgotCi0JUHJvY2VzcyBzb21lIHNwZWNpYWwgQVJNIHN0eWxlIG1hbmdsaW5nIGZvcm1zIHRoYXQgZG9uJ3QgZml0Ci0JdGhlIG5vcm1hbCBwYXR0ZXJuLiAgRm9yIGV4YW1wbGU6Ci0KLQkJX192dGJsX18zZm9vCQkoZm9vIHZpcnR1YWwgdGFibGUpCi0JCV9fdnRibF9fM2Zvb19fM2JhcgkoYmFyOjpmb28gdmlydHVhbCB0YWJsZSkKLQotICovCi0KLXN0YXRpYyBpbnQKLWFybV9zcGVjaWFsIChtYW5nbGVkLCBkZWNscCkKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBuOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNvbnN0IGNoYXIgKnNjYW47Ci0KLSAgaWYgKHN0cm5jbXAgKCptYW5nbGVkLCBBUk1fVlRBQkxFX1NUUklORywgQVJNX1ZUQUJMRV9TVFJMRU4pID09IDApCi0gICAgewotICAgICAgLyogRm91bmQgYSBBUk0gc3R5bGUgdmlydHVhbCB0YWJsZSwgZ2V0IHBhc3QgQVJNX1ZUQUJMRV9TVFJJTkcKLSAgICAgICAgIGFuZCBjcmVhdGUgdGhlIGRlY2wuICBOb3RlIHRoYXQgd2UgY29uc3VtZSB0aGUgZW50aXJlIG1hbmdsZWQKLQkgaW5wdXQgc3RyaW5nLCB3aGljaCBtZWFucyB0aGF0IGRlbWFuZ2xlX3NpZ25hdHVyZSBoYXMgbm8gd29yawotCSB0byBkby4gICovCi0gICAgICBzY2FuID0gKm1hbmdsZWQgKyBBUk1fVlRBQkxFX1NUUkxFTjsKLSAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSAgICAgICAgLyogZmlyc3QgY2hlY2sgaXQgY2FuIGJlIGRlbWFuZ2xlZCAqLwotICAgICAgICB7Ci0gICAgICAgICAgbiA9IGNvbnN1bWVfY291bnQgKCZzY2FuKTsKLSAgICAgICAgICBpZiAobiA9PSAtMSkKLQkgICAgewotCSAgICAgIHJldHVybiAoMCk7ICAgICAgICAgICAvKiBubyBnb29kICovCi0JICAgIH0KLSAgICAgICAgICBzY2FuICs9IG47Ci0gICAgICAgICAgaWYgKHNjYW5bMF0gPT0gJ18nICYmIHNjYW5bMV0gPT0gJ18nKQotCSAgICB7Ci0JICAgICAgc2NhbiArPSAyOwotCSAgICB9Ci0gICAgICAgIH0KLSAgICAgICgqbWFuZ2xlZCkgKz0gQVJNX1ZUQUJMRV9TVFJMRU47Ci0gICAgICB3aGlsZSAoKiptYW5nbGVkICE9ICdcMCcpCi0JewotCSAgbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgICAgIGlmIChuID09IC0xCi0JICAgICAgfHwgbiA+IHN0cmxlbiAoKm1hbmdsZWQpKQotCSAgICByZXR1cm4gMDsKLQkgIHN0cmluZ19wcmVwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICgqbWFuZ2xlZCkgKz0gbjsKLQkgIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJyAmJiAoKm1hbmdsZWQpWzFdID09ICdfJykKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kIChkZWNscCwgIjo6Iik7Ci0JICAgICAgKCptYW5nbGVkKSArPSAyOwotCSAgICB9Ci0JfQotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIgdmlydHVhbCB0YWJsZSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3F1YWxpZmllZCAtLSBkZW1hbmdsZSAnUScgcXVhbGlmaWVkIG5hbWUgc3RyaW5ncwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX3F1YWxpZmllZCAoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqbWFuZ2xlZCwKLQkJCSAgICBzdHJpbmcgKnJlc3VsdCwgaW50IGlzZnVuY25hbWUsIGludCBhcHBlbmQpOwotCi1ERVNDUklQVElPTgotCi0JRGVtYW5nbGUgYSBxdWFsaWZpZWQgbmFtZSwgc3VjaCBhcyAiUTI1T3V0ZXI1SW5uZXIiIHdoaWNoIGlzCi0JdGhlIG1hbmdsZWQgZm9ybSBvZiAiT3V0ZXI6OklubmVyIi4gIFRoZSBkZW1hbmdsZWQgb3V0cHV0IGlzCi0JcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHRvIHRoZSByZXN1bHQgc3RyaW5nIGFjY29yZGluZyB0byB0aGUKLQlzdGF0ZSBvZiB0aGUgYXBwZW5kIGZsYWcuCi0KLQlJZiBpc2Z1bmNuYW1lIGlzIG5vbnplcm8sIHRoZW4gdGhlIHF1YWxpZmllZCBuYW1lIHdlIGFyZSBidWlsZGluZwotCWlzIGdvaW5nIHRvIGJlIHVzZWQgYXMgYSBtZW1iZXIgZnVuY3Rpb24gbmFtZSwgc28gaWYgaXQgaXMgYQotCWNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgZnVuY3Rpb24sIGFwcGVuZCBhbiBhcHByb3ByaWF0ZQotCWNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZS4gIEkuRS4gZm9yIHRoZSBhYm92ZSBleGFtcGxlLAotCXRoZSByZXN1bHQgZm9yIHVzZSBhcyBhIGNvbnN0cnVjdG9yIGlzICJPdXRlcjo6SW5uZXI6OklubmVyIgotCWFuZCB0aGUgcmVzdWx0IGZvciB1c2UgYXMgYSBkZXN0cnVjdG9yIGlzICJPdXRlcjo6SW5uZXI6On5Jbm5lciIuCi0KLUJVR1MKLQotCU51bWVyaWMgY29udmVyc2lvbiBpcyBBU0NJSSBkZXBlbmRlbnQgKEZJWE1FKS4KLQotICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgcmVzdWx0LCBpc2Z1bmNuYW1lLCBhcHBlbmQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci0gICAgIGludCBpc2Z1bmNuYW1lOwotICAgICBpbnQgYXBwZW5kOwotewotICBpbnQgcXVhbGlmaWVycyA9IDA7Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY29uc3QgY2hhciAqcDsKLSAgY2hhciBudW1bMl07Ci0gIHN0cmluZyB0ZW1wOwotICBzdHJpbmcgbGFzdF9uYW1lOwotICBpbnQgYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotCi0gIC8qIFdlIG9ubHkgbWFrZSB1c2Ugb2YgSVNGVU5DTkFNRSBpZiB0aGUgZW50aXR5IGlzIGEgY29uc3RydWN0b3Igb3IKLSAgICAgZGVzdHJ1Y3Rvci4gICovCi0gIGlzZnVuY25hbWUgPSAoaXNmdW5jbmFtZQotCQkmJiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkpOwotCi0gIHN0cmluZ19pbml0ICgmdGVtcCk7Ci0gIHN0cmluZ19pbml0ICgmbGFzdF9uYW1lKTsKLQotICBpZiAoKCptYW5nbGVkKVswXSA9PSAnSycpCi0gICAgewotICAgIC8qIFNxdWFuZ2xpbmcgcXVhbGlmaWVkIG5hbWUgcmV1c2UgKi8KLSAgICAgIGludCBpZHg7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotICAgICAgaWYgKGlkeCA9PSAtMSB8fCBpZHggPj0gd29yayAtPiBudW1rKQotICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIHdvcmsgLT4ga3R5cGV2ZWNbaWR4XSk7Ci0gICAgfQotICBlbHNlCi0gICAgc3dpdGNoICgoKm1hbmdsZWQpWzFdKQotICAgIHsKLSAgICBjYXNlICdfJzoKLSAgICAgIC8qIEdOVSBtYW5nbGVkIG5hbWUgd2l0aCBtb3JlIHRoYW4gOSBjbGFzc2VzLiAgVGhlIGNvdW50IGlzIHByZWNlZGVkCi0JIGJ5IGFuIHVuZGVyc2NvcmUgKHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIDw9IDkgY2FzZSkgYW5kIGZvbGxvd2VkCi0JIGJ5IGFuIHVuZGVyc2NvcmUuICAqLwotICAgICAgcCA9ICptYW5nbGVkICsgMjsKLSAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChwKTsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKnApIHx8ICpwID09ICcwJykKLQlzdWNjZXNzID0gMDsKLQotICAgICAgLyogU2tpcCB0aGUgZGlnaXRzLiAgKi8KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqcCkpCi0JKytwOwotCi0gICAgICBpZiAoKnAgIT0gJ18nKQotCXN1Y2Nlc3MgPSAwOwotCi0gICAgICAqbWFuZ2xlZCA9IHAgKyAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIC8qIFRoZSBjb3VudCBpcyBpbiBhIHNpbmdsZSBkaWdpdC4gICovCi0gICAgICBudW1bMF0gPSAoKm1hbmdsZWQpWzFdOwotICAgICAgbnVtWzFdID0gJ1wwJzsKLSAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChudW0pOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBhbiB1bmRlcnNjb3JlIGFmdGVyIHRoZSBkaWdpdCwgc2tpcCBpdC4gIFRoaXMgaXMKLQkgc2FpZCB0byBiZSBmb3IgQVJNLXF1YWxpZmllZCBuYW1lcywgYnV0IHRoZSBBUk0gbWFrZXMgbm8KLQkgbWVudGlvbiBvZiBzdWNoIGFuIHVuZGVyc2NvcmUuICBQZXJoYXBzIGNmcm9udCB1c2VzIG9uZS4gICovCi0gICAgICBpZiAoKCptYW5nbGVkKVsyXSA9PSAnXycpCi0JewotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgICgqbWFuZ2xlZCkgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLQotICBpZiAoIXN1Y2Nlc3MpCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0KLSAgLyogUGljayBvZmYgdGhlIG5hbWVzIGFuZCBjb2xsZWN0IHRoZW0gaW4gdGhlIHRlbXAgYnVmZmVyIGluIHRoZSBvcmRlcgotICAgICBpbiB3aGljaCB0aGV5IGFyZSBmb3VuZCwgc2VwYXJhdGVkIGJ5ICc6OicuICAqLwotCi0gIHdoaWxlIChxdWFsaWZpZXJzLS0gPiAwKQotICAgIHsKLSAgICAgIGludCByZW1lbWJlcl9LID0gMTsKLSAgICAgIHN0cmluZ19jbGVhciAoJmxhc3RfbmFtZSk7Ci0KLSAgICAgIGlmICgqbWFuZ2xlZFswXSA9PSAnXycpCi0JKCptYW5nbGVkKSsrOwotCi0gICAgICBpZiAoKm1hbmdsZWRbMF0gPT0gJ3QnKQotCXsKLQkgIC8qIEhlcmUgd2UgYWx3YXlzIGFwcGVuZCB0byBURU1QIHNpbmNlIHdlIHdpbGwgd2FudCB0byB1c2UKLQkgICAgIHRoZSB0ZW1wbGF0ZSBuYW1lIHdpdGhvdXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXMgYQotCSAgICAgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLiAgVGhlIGFwcHJvcHJpYXRlCi0JICAgICAocGFyYW1ldGVyLWxlc3MpIHZhbHVlIGlzIHJldHVybmVkIGJ5IGRlbWFuZ2xlX3RlbXBsYXRlCi0JICAgICBpbiBMQVNUX05BTUUuICBXZSBkbyBub3QgcmVtZW1iZXIgdGhlIHRlbXBsYXRlIHR5cGUgaGVyZSwKLQkgICAgIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBHKysgbWFuZ2xpbmcgYWxnb3JpdGhtLiAgKi8KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSh3b3JrLCBtYW5nbGVkLCAmdGVtcCwKLQkJCQkgICAgICAmbGFzdF9uYW1lLCAxLCAwKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoKm1hbmdsZWRbMF0gPT0gJ0snKQotCXsKLSAgICAgICAgICBpbnQgaWR4OwotICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotICAgICAgICAgIGlmIChpZHggPT0gLTEgfHwgaWR4ID49IHdvcmstPm51bWspCi0gICAgICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmdGVtcCwgd29yay0+a3R5cGV2ZWNbaWR4XSk7Ci0gICAgICAgICAgcmVtZW1iZXJfSyA9IDA7Ci0KLQkgIGlmICghc3VjY2VzcykgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChFREdfREVNQU5HTElORykKLSAgICAgICAgICAgIHsKLQkgICAgICBpbnQgbmFtZWxlbmd0aDsKLSAJICAgICAgLyogTm93IHJlY3Vyc2l2ZWx5IGRlbWFuZ2xlIHRoZSBxdWFsaWZpZXIKLSAJICAgICAgICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZGVhbCB3aXRoIHRlbXBsYXRlcyBpbgotIAkgICAgICAgKiBtYW5nbGluZyBzdHlsZXMgbGlrZSBFREcgKi8KLQkgICAgICBuYW1lbGVuZ3RoID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICAgICAgaWYgKG5hbWVsZW5ndGggPT0gLTEpCi0JCXsKLQkJICBzdWNjZXNzID0gMDsKLQkJICBicmVhazsKLQkJfQotIAkgICAgICByZWN1cnNpdmVseV9kZW1hbmdsZSh3b3JrLCBtYW5nbGVkLCAmdGVtcCwgbmFtZWxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJmxhc3RfbmFtZSk7Ci0gICAgICAgICAgICAgIGlmICghc3VjY2VzcykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKCZ0ZW1wLCAmbGFzdF9uYW1lKTsKLSAgICAgICAgICAgIH0KLQl9Ci0KLSAgICAgIGlmIChyZW1lbWJlcl9LKQotCXJlbWVtYmVyX0t0eXBlICh3b3JrLCB0ZW1wLmIsIExFTl9TVFJJTkcgKCZ0ZW1wKSk7Ci0KLSAgICAgIGlmIChxdWFsaWZpZXJzID4gMCkKLQlzdHJpbmdfYXBwZW5kICgmdGVtcCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgfQotCi0gIHJlbWVtYmVyX0J0eXBlICh3b3JrLCB0ZW1wLmIsIExFTl9TVFJJTkcgKCZ0ZW1wKSwgYmluZGV4KTsKLQotICAvKiBJZiB3ZSBhcmUgdXNpbmcgdGhlIHJlc3VsdCBhcyBhIGZ1bmN0aW9uIG5hbWUsIHdlIG5lZWQgdG8gYXBwZW5kCi0gICAgIHRoZSBhcHByb3ByaWF0ZSAnOjonIHNlcGFyYXRlZCBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUuCi0gICAgIFdlIGRvIHRoaXMgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIG1vc3QgY29udmVuaWVudCBwbGFjZSwgd2hlcmUKLSAgICAgd2UgYWxyZWFkeSBoYXZlIGEgcG9pbnRlciB0byB0aGUgbmFtZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZS4gICovCi0KLSAgaWYgKGlzZnVuY25hbWUpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsICJ+Iik7Ci0gICAgICBzdHJpbmdfYXBwZW5kcyAoJnRlbXAsICZsYXN0X25hbWUpOwotICAgIH0KLQotICAvKiBOb3cgZWl0aGVyIHByZXBlbmQgdGhlIHRlbXAgYnVmZmVyIHRvIHRoZSByZXN1bHQsIG9yIGFwcGVuZCBpdCwKLSAgICAgZGVwZW5kaW5nIHVwb24gdGhlIHN0YXRlIG9mIHRoZSBhcHBlbmQgZmxhZy4gICovCi0KLSAgaWYgKGFwcGVuZCkKLSAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmdGVtcCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIVNUUklOR19FTVBUWSAocmVzdWx0KSkKLQlzdHJpbmdfYXBwZW5kICgmdGVtcCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZHMgKHJlc3VsdCwgJnRlbXApOwotICAgIH0KLQotICBzdHJpbmdfZGVsZXRlICgmbGFzdF9uYW1lKTsKLSAgc3RyaW5nX2RlbGV0ZSAoJnRlbXApOwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZ2V0X2NvdW50IC0tIGNvbnZlcnQgYW4gYXNjaWkgY291bnQgdG8gaW50ZWdlciwgY29uc3VtaW5nIHRva2VucwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWdldF9jb3VudCAoY29uc3QgY2hhciAqKnR5cGUsIGludCAqY291bnQpCi0KLURFU0NSSVBUSU9OCi0KLQlBc3N1bWUgdGhhdCAqdHlwZSBwb2ludHMgYXQgYSBjb3VudCBpbiBhIG1hbmdsZWQgbmFtZTsgc2V0Ci0JKmNvdW50IHRvIGl0cyB2YWx1ZSwgYW5kIHNldCAqdHlwZSB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIKLQl0aGUgY291bnQuICBUaGVyZSBhcmUgc29tZSB3ZWlyZCBydWxlcyBpbiBlZmZlY3QgaGVyZS4KLQotCUlmICp0eXBlIGRvZXMgbm90IHBvaW50IGF0IGEgc3RyaW5nIG9mIGRpZ2l0cywgcmV0dXJuIHplcm8uCi0KLQlJZiAqdHlwZSBwb2ludHMgYXQgYSBzdHJpbmcgb2YgZGlnaXRzIGZvbGxvd2VkIGJ5IGFuCi0JdW5kZXJzY29yZSwgc2V0ICpjb3VudCB0byB0aGVpciB2YWx1ZSBhcyBhbiBpbnRlZ2VyLCBhZHZhbmNlCi0JKnR5cGUgdG8gcG9pbnQgKmFmdGVyIHRoZSB1bmRlcnNjb3JlLCBhbmQgcmV0dXJuIDEuCi0KLQlJZiAqdHlwZSBwb2ludHMgYXQgYSBzdHJpbmcgb2YgZGlnaXRzIG5vdCBmb2xsb3dlZCBieSBhbgotCXVuZGVyc2NvcmUsIGNvbnN1bWUgb25seSB0aGUgZmlyc3QgZGlnaXQuICBTZXQgKmNvdW50IHRvIGl0cwotCXZhbHVlIGFzIGFuIGludGVnZXIsIGxlYXZlICp0eXBlIHBvaW50aW5nIGFmdGVyIHRoYXQgZGlnaXQsCi0JYW5kIHJldHVybiAxLgotCi0gICAgICAgIFRoZSBleGN1c2UgZm9yIHRoaXMgb2RkIGJlaGF2aW9yOiBpbiB0aGUgQVJNIGFuZCBIUCBkZW1hbmdsaW5nCi0gICAgICAgIHN0eWxlcywgYSB0eXBlIGNhbiBiZSBmb2xsb3dlZCBieSBhIHJlcGVhdCBjb3VudCBvZiB0aGUgZm9ybQotICAgICAgICBgTnh5Jywgd2hlcmU6Ci0KLSAgICAgICAgYHgnIGlzIGEgc2luZ2xlIGRpZ2l0IHNwZWNpZnlpbmcgaG93IG1hbnkgYWRkaXRpb25hbCBjb3BpZXMKLSAgICAgICAgICAgIG9mIHRoZSB0eXBlIHRvIGFwcGVuZCB0byB0aGUgYXJndW1lbnQgbGlzdCwgYW5kCi0KLSAgICAgICAgYHknIGlzIG9uZSBvciBtb3JlIGRpZ2l0cywgc3BlY2lmeWluZyB0aGUgemVyby1iYXNlZCBpbmRleCBvZgotICAgICAgICAgICAgdGhlIGZpcnN0IHJlcGVhdGVkIGFyZ3VtZW50IGluIHRoZSBsaXN0LiAgWWVzLCBhcyB5b3UncmUKLSAgICAgICAgICAgIHVubWFuZ2xpbmcgdGhlIG5hbWUgeW91IGNhbiBmaWd1cmUgdGhpcyBvdXQgeW91cnNlbGYsIGJ1dAotICAgICAgICAgICAgaXQncyB0aGVyZSBhbnl3YXkuCi0KLSAgICAgICAgU28sIGZvciBleGFtcGxlLCBpbiBgYmFyX18zZm9vRlBpTjUxJywgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEKLSAgICAgICAgcG9pbnRlciB0byBhbiBpbnRlZ2VyIChgUGknKSwgYW5kIHRoZW4gdGhlIG5leHQgZml2ZSBhcmd1bWVudHMKLSAgICAgICAgYXJlIHRoZSBzYW1lIChgTjUnKSwgYW5kIHRoZSBmaXJzdCByZXBlYXQgaXMgdGhlIGZ1bmN0aW9uJ3MKLSAgICAgICAgc2Vjb25kIGFyZ3VtZW50IChgMScpLgotKi8KLQotc3RhdGljIGludAotZ2V0X2NvdW50ICh0eXBlLCBjb3VudCkKLSAgICAgY29uc3QgY2hhciAqKnR5cGU7Ci0gICAgIGludCAqY291bnQ7Ci17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGludCBuOwotCi0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpjb3VudCA9ICoqdHlwZSAtICcwJzsKLSAgICAgICgqdHlwZSkrKzsKLSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotCXsKLQkgIHAgPSAqdHlwZTsKLQkgIG4gPSAqY291bnQ7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgbiAqPSAxMDsKLQkgICAgICBuICs9ICpwIC0gJzAnOwotCSAgICAgIHArKzsKLQkgICAgfQotCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSpwKSk7Ci0JICBpZiAoKnAgPT0gJ18nKQotCSAgICB7Ci0JICAgICAgKnR5cGUgPSBwICsgMTsKLQkgICAgICAqY291bnQgPSBuOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogUkVTVUxUIHdpbGwgYmUgaW5pdGlhbGlzZWQgaGVyZTsgaXQgd2lsbCBiZSBmcmVlZCBvbiBmYWlsdXJlLiAgVGhlCi0gICB2YWx1ZSByZXR1cm5lZCBpcyByZWFsbHkgYSB0eXBlX2tpbmRfdC4gICovCi0KLXN0YXRpYyBpbnQKLWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IG47Ci0gIGludCBkb25lOwotICBpbnQgc3VjY2VzczsKLSAgc3RyaW5nIGRlY2w7Ci0gIGNvbnN0IGNoYXIgKnJlbWVtYmVyZWRfdHlwZTsKLSAgaW50IHR5cGVfcXVhbHM7Ci0gIHN0cmluZyBidHlwZTsKLSAgdHlwZV9raW5kX3QgdGsgPSB0a19ub25lOwotCi0gIHN0cmluZ19pbml0ICgmYnR5cGUpOwotICBzdHJpbmdfaW5pdCAoJmRlY2wpOwotICBzdHJpbmdfaW5pdCAocmVzdWx0KTsKLQotICBkb25lID0gMDsKLSAgc3VjY2VzcyA9IDE7Ci0gIHdoaWxlIChzdWNjZXNzICYmICFkb25lKQotICAgIHsKLSAgICAgIGludCBtZW1iZXI7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0KLQkgIC8qIEEgcG9pbnRlciB0eXBlICovCi0JY2FzZSAnUCc6Ci0JY2FzZSAncCc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBpZiAoISAod29yayAtPiBvcHRpb25zICYgRE1HTF9KQVZBKSkKLQkgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKiIpOwotCSAgaWYgKHRrID09IHRrX25vbmUpCi0JICAgIHRrID0gdGtfcG9pbnRlcjsKLQkgIGJyZWFrOwotCi0JICAvKiBBIHJlZmVyZW5jZSB0eXBlICovCi0JY2FzZSAnUic6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICImIik7Ci0JICBpZiAodGsgPT0gdGtfbm9uZSkKLQkgICAgdGsgPSB0a19yZWZlcmVuY2U7Ci0JICBicmVhazsKLQotCSAgLyogQW4gYXJyYXkgKi8KLQljYXNlICdBJzoKLQkgIHsKLQkgICAgKysoKm1hbmdsZWQpOwotCSAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpCi0JCSYmIChkZWNsLmJbMF0gPT0gJyonIHx8IGRlY2wuYlswXSA9PSAnJicpKQotCSAgICAgIHsKLQkJc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKCIpOwotCQlzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKLQkgICAgICB9Ci0JICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiWyIpOwotCSAgICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgJmRlY2wsCi0JCQkJCQkgICAgICB0a19pbnRlZ3JhbCk7Ci0JICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotCSAgICAgICsrKCptYW5nbGVkKTsKLQkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICJdIik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHByZXZpb3VzbHkgc2VlbiB0eXBlICovCi0JY2FzZSAnVCc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJm4pIHx8IG4gPj0gd29yayAtPiBudHlwZXMpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVtZW1iZXJlZF90eXBlID0gd29yayAtPiB0eXBldmVjW25dOwotCSAgICAgIG1hbmdsZWQgPSAmcmVtZW1iZXJlZF90eXBlOwotCSAgICB9Ci0JICBicmVhazsKLQotCSAgLyogQSBmdW5jdGlvbiAqLwotCWNhc2UgJ0YnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpCi0JCSYmIChkZWNsLmJbMF0gPT0gJyonIHx8IGRlY2wuYlswXSA9PSAnJicpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKCIpOwotCSAgICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiKSIpOwotCSAgICB9Ci0JICAvKiBBZnRlciBwaWNraW5nIG9mZiB0aGUgZnVuY3Rpb24gYXJncywgd2UgZXhwZWN0IHRvIGVpdGhlciBmaW5kIHRoZQotCSAgICAgZnVuY3Rpb24gcmV0dXJuIHR5cGUgKHByZWNlZGVkIGJ5IGFuICdfJykgb3IgdGhlIGVuZCBvZiB0aGUKLQkgICAgIHN0cmluZy4gICovCi0JICBpZiAoIWRlbWFuZ2xlX25lc3RlZF9hcmdzICh3b3JrLCBtYW5nbGVkLCAmZGVjbCkKLQkgICAgICB8fCAoKiptYW5nbGVkICE9ICdfJyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKHN1Y2Nlc3MgJiYgKCoqbWFuZ2xlZCA9PSAnXycpKQotCSAgICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCWNhc2UgJ08nOgotCSAgewotCSAgICB0eXBlX3F1YWxzID0gVFlQRV9VTlFVQUxJRklFRDsKLQotCSAgICBtZW1iZXIgPSAqKm1hbmdsZWQgPT0gJ00nOwotCSAgICAoKm1hbmdsZWQpKys7Ci0JICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSAmJiAqKm1hbmdsZWQgIT0gJ3QnKQotCSAgICAgIHsKLQkJc3VjY2VzcyA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKLQkgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JICAgICAgewotCQluID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JCWlmIChuID09IC0xCi0JCSAgICB8fCAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA8IG4pCi0JCSAgewotCQkgICAgc3VjY2VzcyA9IDA7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCXN0cmluZ19wcmVwZW5kbiAoJmRlY2wsICptYW5nbGVkLCBuKTsKLQkJKm1hbmdsZWQgKz0gbjsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cmluZyB0ZW1wOwotCQlzdHJpbmdfaW5pdCAoJnRlbXApOwotCQlzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wLAotCQkJCQkgICAgIE5VTEwsIDEsIDEpOwotCQlpZiAoc3VjY2VzcykKLQkJICB7Ci0JCSAgICBzdHJpbmdfcHJlcGVuZG4gKCZkZWNsLCB0ZW1wLmIsIHRlbXAucCAtIHRlbXAuYik7Ci0JCSAgICBzdHJpbmdfY2xlYXIgKCZ0ZW1wKTsKLQkJICB9Ci0JCWVsc2UKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKLQkgICAgaWYgKG1lbWJlcikKLQkgICAgICB7Ci0JCXN3aXRjaCAoKiptYW5nbGVkKQotCQkgIHsKLQkJICBjYXNlICdDJzoKLQkJICBjYXNlICdWJzoKLQkJICBjYXNlICd1JzoKLQkJICAgIHR5cGVfcXVhbHMgfD0gY29kZV9mb3JfcXVhbGlmaWVyICgqKm1hbmdsZWQpOwotCQkgICAgKCptYW5nbGVkKSsrOwotCQkgICAgYnJlYWs7Ci0KLQkJICBkZWZhdWx0OgotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWlmICgqKCptYW5nbGVkKSsrICE9ICdGJykKLQkJICB7Ci0JCSAgICBzdWNjZXNzID0gMDsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGlmICgobWVtYmVyICYmICFkZW1hbmdsZV9uZXN0ZWRfYXJncyAod29yaywgbWFuZ2xlZCwgJmRlY2wpKQotCQl8fCAqKm1hbmdsZWQgIT0gJ18nKQotCSAgICAgIHsKLQkJc3VjY2VzcyA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgKCptYW5nbGVkKSsrOwotCSAgICBpZiAoISBQUklOVF9BTlNJX1FVQUxJRklFUlMpCi0JICAgICAgewotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGlmICh0eXBlX3F1YWxzICE9IFRZUEVfVU5RVUFMSUZJRUQpCi0JICAgICAgewotCQlBUFBFTkRfQkxBTksgKCZkZWNsKTsKLQkJc3RyaW5nX2FwcGVuZCAoJmRlY2wsIHF1YWxpZmllcl9zdHJpbmcgKHR5cGVfcXVhbHMpKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgICBjYXNlICdHJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQyc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAndSc6Ci0JICBpZiAoUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQotCSAgICB7Ci0JICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKSkKLQkJc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiICIpOwotCi0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCBkZW1hbmdsZV9xdWFsaWZpZXIgKCoqbWFuZ2xlZCkpOwotCSAgICB9Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQkgIC8qCi0JICAgIH0KLQkgICAgKi8KLQotCSAgLyogZmFsbCB0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkgIGRvbmUgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoc3VjY2Vzcykgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgewotICAgICAgLyogQSBxdWFsaWZpZWQgbmFtZSwgc3VjaCBhcyAiT3V0ZXI6OklubmVyIi4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgY2FzZSAnSyc6Ci0gICAgICB7Ci0gICAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCwgMCwgMSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHByZXZpb3VzbHkgc2VlbiBzcXVhbmdsZWQgdHlwZSAqLwotICAgIGNhc2UgJ0InOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZuKSB8fCBuID49IHdvcmsgLT4gbnVtYikKLQlzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQlzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHdvcmstPmJ0eXBldmVjW25dKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWCc6Ci0gICAgY2FzZSAnWSc6Ci0gICAgICAvKiBBIHRlbXBsYXRlIHBhcm0uICBXZSBzdWJzdGl0dXRlIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LiAqLwotICAgICAgewotCWludCBpZHg7Ci0KLQkoKm1hbmdsZWQpKys7Ci0JaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLQotCWlmIChpZHggPT0gLTEKLQkgICAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQotCSAgICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCSAgewotCSAgICBzdWNjZXNzID0gMDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHdvcmstPnRtcGxfYXJndmVjW2lkeF0pOwotCWVsc2UKLQkgIHsKLQkgICAgY2hhciBidWZbMTBdOwotCSAgICBzcHJpbnRmKGJ1ZiwgIlQlZCIsIGlkeCk7Ci0JICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgYnVmKTsKLQkgIH0KLQotCXN1Y2Nlc3MgPSAxOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9mdW5kX3R5cGUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCk7Ci0gICAgICBpZiAodGsgPT0gdGtfbm9uZSkKLQl0ayA9ICh0eXBlX2tpbmRfdCkgc3VjY2VzczsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoc3VjY2VzcykKLSAgICB7Ci0gICAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpKQotCXsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIiAiKTsKLQkgIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsICZkZWNsKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgc3RyaW5nX2RlbGV0ZSAocmVzdWx0KTsKLSAgc3RyaW5nX2RlbGV0ZSAoJmRlY2wpOwotCi0gIGlmIChzdWNjZXNzKQotICAgIC8qIEFzc3VtZSBhbiBpbnRlZ3JhbCB0eXBlLCBpZiB3ZSdyZSBub3Qgc3VyZS4gICovCi0gICAgcmV0dXJuIChpbnQpICgodGsgPT0gdGtfbm9uZSkgPyB0a19pbnRlZ3JhbCA6IHRrKTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBHaXZlbiBhIHBvaW50ZXIgdG8gYSB0eXBlIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBmdW5kYW1lbnRhbCB0eXBlCi0gICBhcmd1bWVudCAoaW50LCBsb25nLCB1bnNpZ25lZCBpbnQsIGV0YykgaW4gVFlQRSwgYSBwb2ludGVyIHRvIHRoZQotICAgc3RyaW5nIGluIHdoaWNoIHRoZSBkZW1hbmdsZWQgb3V0cHV0IGlzIGJlaW5nIGJ1aWx0IGluIFJFU1VMVCwgYW5kCi0gICB0aGUgV09SSyBzdHJ1Y3R1cmUsIGRlY29kZSB0aGUgdHlwZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSByZXN1bHQuCi0KLSAgIEZvciBleGFtcGxlOgotCi0gICAJIkNpIgk9PgkiY29uc3QgaW50IgotCSJTbCIJPT4JInNpZ25lZCBsb25nIgotCSJDVXMiCT0+CSJjb25zdCB1bnNpZ25lZCBzaG9ydCIKLQotICAgVGhlIHZhbHVlIHJldHVybmVkIGlzIHJlYWxseSBhIHR5cGVfa2luZF90LiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfZnVuZF90eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIGludCBkb25lID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjaGFyIGJ1ZlsxMF07Ci0gIGludCBkZWMgPSAwOwotICBzdHJpbmcgYnR5cGU7Ci0gIHR5cGVfa2luZF90IHRrID0gdGtfaW50ZWdyYWw7Ci0KLSAgc3RyaW5nX2luaXQgKCZidHlwZSk7Ci0KLSAgLyogRmlyc3QgcGljayBvZmYgYW55IHR5cGUgcXVhbGlmaWVycy4gIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lLiAgKi8KLQotICB3aGlsZSAoIWRvbmUpCi0gICAgewotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ0MnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ3UnOgotCSAgaWYgKFBSSU5UX0FOU0lfUVVBTElGSUVSUykKLQkgICAgewotICAgICAgICAgICAgICBpZiAoIVNUUklOR19FTVBUWSAocmVzdWx0KSkKLSAgICAgICAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAocmVzdWx0LCAiICIpOwotCSAgICAgIHN0cmluZ19wcmVwZW5kIChyZXN1bHQsIGRlbWFuZ2xlX3F1YWxpZmllciAoKiptYW5nbGVkKSk7Ci0JICAgIH0KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCWNhc2UgJ1UnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAidW5zaWduZWQiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOiAvKiBzaWduZWQgY2hhciBvbmx5ICovCi0JICAoKm1hbmdsZWQpKys7Ci0JICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJzaWduZWQiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0onOgotCSAgKCptYW5nbGVkKSsrOwotCSAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiX19jb21wbGV4Iik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZG9uZSA9IDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBwaWNrIG9mZiB0aGUgZnVuZGFtZW50YWwgdHlwZS4gIFRoZXJlIGNhbiBiZSBvbmx5IG9uZS4gICovCi0KLSAgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICBjYXNlICdfJzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3YnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAidm9pZCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAneCc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJsb25nIGxvbmciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2wnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAibG9uZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJpbnQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAic2hvcnQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiYm9vbCIpOwotICAgICAgdGsgPSB0a19ib29sOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJjaGFyIik7Ci0gICAgICB0ayA9IHRrX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd3JzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIndjaGFyX3QiKTsKLSAgICAgIHRrID0gdGtfY2hhcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAibG9uZyBkb3VibGUiKTsKLSAgICAgIHRrID0gdGtfcmVhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiZG91YmxlIik7Ci0gICAgICB0ayA9IHRrX3JlYWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImZsb2F0Iik7Ci0gICAgICB0ayA9IHRrX3JlYWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdHJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQl7Ci0JICBzdWNjZXNzID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICBjYXNlICdJJzoKLSAgICAgICsrKCptYW5nbGVkKTsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotCXsKLQkgIGludCBpOwotCSAgKysoKm1hbmdsZWQpOwotCSAgZm9yIChpID0gMDsKLQkgICAgICAgKGkgPCBzaXplb2YgKGJ1ZikgLSAxICYmICoqbWFuZ2xlZCAmJiAqKm1hbmdsZWQgIT0gJ18nKTsKLQkgICAgICAgKysoKm1hbmdsZWQpLCArK2kpCi0JICAgIGJ1ZltpXSA9ICoqbWFuZ2xlZDsKLQkgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJ1ZltpXSA9ICdcMCc7Ci0JICArKygqbWFuZ2xlZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cm5jcHkgKGJ1ZiwgKm1hbmdsZWQsIDIpOwotCSAgYnVmWzJdID0gJ1wwJzsKLQkgICptYW5nbGVkICs9IDI7Ci0JfQotICAgICAgc3NjYW5mIChidWYsICIleCIsICZkZWMpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiaW50JWlfdCIsIGRlYyk7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGJ1Zik7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAvKiBBbiBleHBsaWNpdCB0eXBlLCBzdWNoIGFzICI2bXl0eXBlIiBvciAiN2ludGVnZXIiICovCi0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICB7Ci0gICAgICAgIGludCBiaW5kZXggPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0gICAgICAgIHN0cmluZyBidHlwZTsKLSAgICAgICAgc3RyaW5nX2luaXQgKCZidHlwZSk7Ci0gICAgICAgIGlmIChkZW1hbmdsZV9jbGFzc19uYW1lICh3b3JrLCBtYW5nbGVkLCAmYnR5cGUpKSB7Ci0gICAgICAgICAgcmVtZW1iZXJfQnR5cGUgKHdvcmssIGJ0eXBlLmIsIExFTl9TVFJJTkcgKCZidHlwZSksIGJpbmRleCk7Ci0gICAgICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgICAgIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsICZidHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgICBzdHJpbmdfZGVsZXRlICgmYnR5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBjYXNlICd0JzoKLSAgICAgIHsKLSAgICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAmYnR5cGUsIDAsIDEsIDEpOwotICAgICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmYnR5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3MgPyAoKGludCkgdGspIDogMDsKLX0KLQotCi0vKiBIYW5kbGUgYSB0ZW1wbGF0ZSdzIHZhbHVlIHBhcmFtZXRlciBmb3IgSFAgYUNDIChleHRlbnNpb24gZnJvbSBBUk0pCi0gICAqKm1hbmdsZWQgcG9pbnRzIHRvICdTJyBvciAnVScgKi8KLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IHVuc2lnbmVkX2NvbnN0OwotCi0gIGlmICgqKm1hbmdsZWQgIT0gJ1UnICYmICoqbWFuZ2xlZCAhPSAnUycpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdW5zaWduZWRfY29uc3QgPSAoKiptYW5nbGVkID09ICdVJyk7Ci0KLSAgKCptYW5nbGVkKSsrOwotCi0gIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICAgIGNhc2UgJ04nOgotICAgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICItIik7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAnUCc6Ci0gICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdNJzoKLSAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciAtMl4zMSAqLwotICAgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICItMjE0NzQ4MzY0OCIpOwotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gYmUgbG9va2luZyBhdCBhbiBpbnRlZ2VyIG5vdyAqLwotICBpZiAoIShpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBvbmx5IGRlYWwgd2l0aCBpbnRlZ3JhbCB2YWx1ZXMgZm9yIHRlbXBsYXRlCi0gICAgIHBhcmFtZXRlcnMgLS0gc28gaXQncyBPSyB0byBsb29rIG9ubHkgZm9yIGRpZ2l0cyAqLwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLSAgICB7Ci0gICAgICBjaGFyX3N0clswXSA9ICoqbWFuZ2xlZDsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgY2hhcl9zdHIpOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLQotICBpZiAodW5zaWduZWRfY29uc3QpCi0gICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiVSIpOwotCi0gIC8qIEZJWE1FPyBTb21lIGRheSB3ZSBtYXkgaGF2ZSA2NC1iaXQgKG9yIGxhcmdlciA6LSkgKSBjb25zdGFudHMKLSAgICAgd2l0aCBMIG9yIExMIHN1ZmZpeGVzLiBwYWkvMTk5Ny0wOS0wMyAqLwotCi0gIHJldHVybiAxOyAvKiBzdWNjZXNzICovCi19Ci0KLS8qIEhhbmRsZSBhIHRlbXBsYXRlJ3MgbGl0ZXJhbCBwYXJhbWV0ZXIgZm9yIEhQIGFDQyAoZXh0ZW5zaW9uIGZyb20gQVJNKQotICAgKiptYW5nbGVkIGlzIHBvaW50aW5nIHRvIHRoZSAnQScgKi8KLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgbGl0ZXJhbF9sZW4gPSAwOwotICBjaGFyICogcmVjdXJzZTsKLSAgY2hhciAqIHJlY3Vyc2VfZGVtOwotCi0gIGlmICgqKm1hbmdsZWQgIT0gJ0EnKQotICAgIHJldHVybiAwOwotCi0gICgqbWFuZ2xlZCkrKzsKLQotICBsaXRlcmFsX2xlbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCi0gIGlmIChsaXRlcmFsX2xlbiA8PSAwKQotICAgIHJldHVybiAwOwotCi0gIC8qIExpdGVyYWwgcGFyYW1ldGVycyBhcmUgbmFtZXMgb2YgYXJyYXlzLCBmdW5jdGlvbnMsIGV0Yy4gIGFuZCB0aGUKLSAgICAgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgdGhlIGFkZHJlc3Mgb3BlcmF0b3IgKi8KLSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiJiIpOwotCi0gIC8qIE5vdyByZWN1cnNpdmVseSBkZW1hbmdsZSB0aGUgbGl0ZXJhbCBuYW1lICovCi0gIHJlY3Vyc2UgPSAoY2hhciAqKSB4bWFsbG9jIChsaXRlcmFsX2xlbiArIDEpOwotICBtZW1jcHkgKHJlY3Vyc2UsICptYW5nbGVkLCBsaXRlcmFsX2xlbik7Ci0gIHJlY3Vyc2VbbGl0ZXJhbF9sZW5dID0gJ1wwMDAnOwotCi0gIHJlY3Vyc2VfZGVtID0gY3BsdXNfZGVtYW5nbGUgKHJlY3Vyc2UsIHdvcmstPm9wdGlvbnMpOwotCi0gIGlmIChyZWN1cnNlX2RlbSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHJlY3Vyc2VfZGVtKTsKLSAgICAgIGZyZWUgKHJlY3Vyc2VfZGVtKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocmVzdWx0LCAqbWFuZ2xlZCwgbGl0ZXJhbF9sZW4pOwotICAgIH0KLSAgKCptYW5nbGVkKSArPSBsaXRlcmFsX2xlbjsKLSAgZnJlZSAocmVjdXJzZSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoYXJncywgYXJnKQotICAgICBjb25zdCBjaGFyICoqIGFyZ3M7Ci0gICAgIHN0cmluZyAqIGFyZzsKLXsKLSAgaWYgKCoqYXJncyA9PSAnLScpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAnLSc7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChhcmcsIGNoYXJfc3RyKTsKLSAgICAgICgqYXJncykrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCoqYXJncyA9PSAnKycpCi0gICAgKCphcmdzKSsrOwotCi0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiphcmdzKSkKLSAgICByZXR1cm4gMDsKLQotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiphcmdzKSkKLSAgICB7Ci0gICAgICBjaGFyX3N0clswXSA9ICoqYXJnczsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGFyZywgY2hhcl9zdHIpOwotICAgICAgKCphcmdzKSsrOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVtYW5nbGUgdGhlIG5leHQgYXJndW1lbnQsIGdpdmVuIGJ5IE1BTkdMRUQgaW50byBSRVNVTFQsIHdoaWNoCi0gICAqc2hvdWxkIGJlIGFuIHVuaW5pdGlhbGl6ZWQqIHN0cmluZy4gIEl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaGVyZSwKLSAgIGFuZCBmcmVlJ2Qgc2hvdWxkIGFueXRoaW5nIGdvIHdyb25nLiAgKi8KLQotc3RhdGljIGludAotZG9fYXJnICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIC8qIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQgc28gdGhhdCB3ZSBjYW4gcmVjb3JkIHRoZSB0eXBlLCBmb3IKLSAgICAgbm9uLXNxdWFuZ2xpbmcgdHlwZSByZW1lbWJlcmluZy4gICovCi0gIGNvbnN0IGNoYXIgKnN0YXJ0ID0gKm1hbmdsZWQ7Ci0KLSAgc3RyaW5nX2luaXQgKHJlc3VsdCk7Ci0KLSAgaWYgKHdvcmstPm5yZXBlYXRzID4gMCkKLSAgICB7Ci0gICAgICAtLXdvcmstPm5yZXBlYXRzOwotCi0gICAgICBpZiAod29yay0+cHJldmlvdXNfYXJndW1lbnQgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgLyogV2Ugd2FudCB0byByZWlzc3VlIHRoZSBwcmV2aW91cyB0eXBlIGluIHRoaXMgYXJndW1lbnQgbGlzdC4gICovCi0gICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnbicpCi0gICAgewotICAgICAgLyogQSBzcXVhbmdsaW5nLXN0eWxlIHJlcGVhdC4gICovCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICB3b3JrLT5ucmVwZWF0cyA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCk7Ci0KLSAgICAgIGlmICh3b3JrLT5ucmVwZWF0cyA8PSAwKQotCS8qIFRoaXMgd2FzIG5vdCBhIHJlcGVhdCBjb3VudCBhZnRlciBhbGwuICAqLwotCXJldHVybiAwOwotCi0gICAgICBpZiAod29yay0+bnJlcGVhdHMgPiA5KQotCXsKLQkgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCSAgICAvKiBUaGUgcmVwZWF0IGNvdW50IHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbiAnXycgaW4gdGhpcwotCSAgICAgICBjYXNlLiAgKi8KLQkgICAgcmV0dXJuIDA7Ci0JICBlbHNlCi0JICAgICgqbWFuZ2xlZCkrKzsKLQl9Ci0KLSAgICAgIC8qIE5vdywgdGhlIHJlcGVhdCBpcyBhbGwgc2V0IHVwLiAgKi8KLSAgICAgIHJldHVybiBkb19hcmcgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCk7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIHJlc3VsdCBpbiBXT1JLLT5wcmV2aW91c19hcmd1bWVudCBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0Ci0gICAgIGlmIGl0J3MgcmVwZWF0ZWQuICBOb3RlIHRoYXQgc2F2aW5nIFNUQVJUIGlzIG5vdCBnb29kIGVub3VnaDogd2UKLSAgICAgZG8gbm90IHdhbnQgdG8gYWRkIGFkZGl0aW9uYWwgdHlwZXMgdG8gdGhlIGJhY2stcmVmZXJlbmNlYWJsZQotICAgICB0eXBlIHZlY3RvciB3aGVuIHByb2Nlc3NpbmcgYSByZXBlYXRlZCB0eXBlLiAgKi8KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHN0cmluZ19jbGVhciAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICBlbHNlCi0gICAgewotICAgICAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSAoc3RyaW5nKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJpbmcpKTsKLSAgICAgIHN0cmluZ19pbml0ICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgfQotCi0gIGlmICghZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgd29yay0+cHJldmlvdXNfYXJndW1lbnQpKQotICAgIHJldHVybiAwOwotCi0gIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLQotICByZW1lbWJlcl90eXBlICh3b3JrLCBzdGFydCwgKm1hbmdsZWQgLSBzdGFydCk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfdHlwZSAod29yaywgc3RhcnQsIGxlbikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICBpbnQgbGVuOwotewotICBjaGFyICp0ZW07Ci0KLSAgaWYgKHdvcmstPmZvcmdldHRpbmdfdHlwZXMpCi0gICAgcmV0dXJuOwotCi0gIGlmICh3b3JrIC0+IG50eXBlcyA+PSB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiB0eXBldmVjX3NpemUgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSA9IDM7Ci0JICB3b3JrIC0+IHR5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogd29yayAtPiB0eXBldmVjX3NpemUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSAqPSAyOwotCSAgd29yayAtPiB0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKXdvcmsgLT4gdHlwZXZlYywKLQkJCQkgIHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gdHlwZXZlY19zaXplKTsKLQl9Ci0gICAgfQotICB0ZW0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5ICh0ZW0sIHN0YXJ0LCBsZW4pOwotICB0ZW1bbGVuXSA9ICdcMCc7Ci0gIHdvcmsgLT4gdHlwZXZlY1t3b3JrIC0+IG50eXBlcysrXSA9IHRlbTsKLX0KLQotCi0vKiBSZW1lbWJlciBhIEsgdHlwZSBjbGFzcyBxdWFsaWZpZXIuICovCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfS3R5cGUgKHdvcmssIHN0YXJ0LCBsZW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqdGVtOwotCi0gIGlmICh3b3JrIC0+IG51bWsgPj0gd29yayAtPiBrc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiBrc2l6ZSA9PSAwKQotCXsKLQkgIHdvcmsgLT4ga3NpemUgPSA1OwotCSAgd29yayAtPiBrdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGtzaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiBrc2l6ZSAqPSAyOwotCSAgd29yayAtPiBrdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IGt0eXBldmVjLAotCQkJCSAgc2l6ZW9mIChjaGFyICopICogd29yayAtPiBrc2l6ZSk7Ci0JfQotICAgIH0KLSAgdGVtID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAodGVtLCBzdGFydCwgbGVuKTsKLSAgdGVtW2xlbl0gPSAnXDAnOwotICB3b3JrIC0+IGt0eXBldmVjW3dvcmsgLT4gbnVtaysrXSA9IHRlbTsKLX0KLQotLyogUmVnaXN0ZXIgYSBCIGNvZGUsIGFuZCBnZXQgYW4gaW5kZXggZm9yIGl0LiBCIGNvZGVzIGFyZSByZWdpc3RlcmVkCi0gICBhcyB0aGV5IGFyZSBzZWVuLCByYXRoZXIgdGhhbiBhcyB0aGV5IGFyZSBjb21wbGV0ZWQsIHNvIG1hcDx0ZW1wPGNoYXI+ID4KLSAgIHJlZ2lzdGVycyBtYXA8dGVtcDxjaGFyPiA+IGFzIEIwLCBhbmQgdGVtcDxjaGFyPiBhcyBCMSAqLwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9CdHlwZSAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCByZXQ7Ci0KLSAgaWYgKHdvcmsgLT4gbnVtYiA+PSB3b3JrIC0+IGJzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JrIC0+IGJzaXplID09IDApCi0JewotCSAgd29yayAtPiBic2l6ZSA9IDU7Ci0JICB3b3JrIC0+IGJ0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gYnNpemUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3JrIC0+IGJzaXplICo9IDI7Ci0JICB3b3JrIC0+IGJ0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKXdvcmsgLT4gYnR5cGV2ZWMsCi0JCQkJICBzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGJzaXplKTsKLQl9Ci0gICAgfQotICByZXQgPSB3b3JrIC0+IG51bWIrKzsKLSAgd29yayAtPiBidHlwZXZlY1tyZXRdID0gTlVMTDsKLSAgcmV0dXJuKHJldCk7Ci19Ci0KLS8qIFN0b3JlIGEgdmFsdWUgaW50byBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBCIGNvZGUgdHlwZS4gKi8KLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0J0eXBlICh3b3JrLCBzdGFydCwgbGVuLCBpbmRleCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICBpbnQgbGVuLCBpbmRleDsKLXsKLSAgY2hhciAqdGVtOwotCi0gIHRlbSA9IHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHRlbSwgc3RhcnQsIGxlbik7Ci0gIHRlbVtsZW5dID0gJ1wwJzsKLSAgd29yayAtPiBidHlwZXZlY1tpbmRleF0gPSB0ZW07Ci19Ci0KLS8qIExvc2UgYWxsIHRoZSBpbmZvIHJlbGF0ZWQgdG8gQiBhbmQgSyB0eXBlIGNvZGVzLiAqLwotc3RhdGljIHZvaWQKLWZvcmdldF9CX2FuZF9LX3R5cGVzICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnVtayA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnVtayk7Ci0gICAgICBpZiAod29yayAtPiBrdHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4ga3R5cGV2ZWNbaV0pOwotCSAgd29yayAtPiBrdHlwZXZlY1tpXSA9IE5VTEw7Ci0JfQotICAgIH0KLQotICB3aGlsZSAod29yayAtPiBudW1iID4gMCkKLSAgICB7Ci0gICAgICBpID0gLS0od29yayAtPiBudW1iKTsKLSAgICAgIGlmICh3b3JrIC0+IGJ0eXBldmVjW2ldICE9IE5VTEwpCi0JewotCSAgZnJlZSAod29yayAtPiBidHlwZXZlY1tpXSk7Ci0JICB3b3JrIC0+IGJ0eXBldmVjW2ldID0gTlVMTDsKLQl9Ci0gICAgfQotfQotLyogRm9yZ2V0IHRoZSByZW1lbWJlcmVkIHR5cGVzLCBidXQgbm90IHRoZSB0eXBlIHZlY3RvciBpdHNlbGYuICAqLwotCi1zdGF0aWMgdm9pZAotZm9yZ2V0X3R5cGVzICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnR5cGVzID4gMCkKLSAgICB7Ci0gICAgICBpID0gLS0od29yayAtPiBudHlwZXMpOwotICAgICAgaWYgKHdvcmsgLT4gdHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4gdHlwZXZlY1tpXSk7Ci0JICB3b3JrIC0+IHR5cGV2ZWNbaV0gPSBOVUxMOwotCX0KLSAgICB9Ci19Ci0KLS8qIFByb2Nlc3MgdGhlIGFyZ3VtZW50IGxpc3QgcGFydCBvZiB0aGUgc2lnbmF0dXJlLCBhZnRlciBhbnkgY2xhc3Mgc3BlYwotICAgaGFzIGJlZW4gY29uc3VtZWQsIGFzIHdlbGwgYXMgdGhlIGZpcnN0ICdGJyBjaGFyYWN0ZXIgKGlmIGFueSkuICBGb3IKLSAgIGV4YW1wbGU6Ci0KLSAgICJfX2Fsc19fM2Zvb1JUMCIJCT0+CXByb2Nlc3MgIlJUMCIKLSAgICJjb21wbGV4ZnVuYzVfX0ZQRlBjX1BGbF9pIgk9Pglwcm9jZXNzICJQRlBjX1BGbF9pIgotCi0gICBERUNMUCBtdXN0IGJlIGFscmVhZHkgaW5pdGlhbGlzZWQsIHVzdWFsbHkgbm9uLWVtcHR5LiAgSXQgd29uJ3QgYmUgZnJlZWQKLSAgIG9uIGZhaWx1cmUuCi0KLSAgIE5vdGUgdGhhdCBnKysgZGlmZmVycyBzaWduaWZpY2FudGx5IGZyb20gQVJNIGFuZCBsdWNpZCBzdHlsZSBtYW5nbGluZwotICAgd2l0aCByZWdhcmRzIHRvIHJlZmVyZW5jZXMgdG8gcHJldmlvdXNseSBzZWVuIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGdpdmVuCi0gICB0aGUgc291cmNlIGZyYWdtZW50OgotCi0gICAgIGNsYXNzIGZvbyB7Ci0gICAgICAgcHVibGljOgotICAgICAgIGZvbzo6Zm9vIChpbnQsIGZvbyAmaWEsIGludCwgZm9vICZpYiwgaW50LCBmb28gJmljKTsKLSAgICAgfTsKLQotICAgICBmb286OmZvbyAoaW50LCBmb28gJmlhLCBpbnQsIGZvbyAmaWIsIGludCwgZm9vICZpYykgeyBpYSA9IGliID0gaWM7IH0KLSAgICAgdm9pZCBmb28gKGludCwgZm9vICZpYSwgaW50LCBmb28gJmliLCBpbnQsIGZvbyAmaWMpIHsgaWEgPSBpYiA9IGljOyB9Ci0KLSAgIGcrKyBwcm9kdWNlcyB0aGUgbmFtZXM6Ci0KLSAgICAgX18zZm9vaVJUMGlUMmlUMgotICAgICBmb29fX0ZpUjNmb29pVDFpVDEKLQotICAgd2hpbGUgbGNjIChhbmQgcHJlc3VtYWJseSBvdGhlciBBUk0gc3R5bGUgY29tcGlsZXJzIGFzIHdlbGwpIHByb2R1Y2VzOgotCi0gICAgIGZvb19fRmlSM2Zvb1QxVDJUMVQyCi0gICAgIF9fY3RfXzNmb29GaVIzZm9vVDFUMlQxVDIKLQotICAgTm90ZSB0aGF0IGcrKyBiYXNlcyBpdHMgdHlwZSBudW1iZXJzIHN0YXJ0aW5nIGF0IHplcm8gYW5kIGNvdW50cyBhbGwKLSAgIHByZXZpb3VzbHkgc2VlbiB0eXBlcywgd2hpbGUgbHVjaWQvQVJNIGJhc2VzIGl0cyB0eXBlIG51bWJlcnMgc3RhcnRpbmcKLSAgIGF0IG9uZSBhbmQgb25seSBjb25zaWRlcnMgdHlwZXMgYWZ0ZXIgaXQgaGFzIHNlZW4gdGhlICdGJyBjaGFyYWN0ZXIKLSAgIGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBhcmdzLiAgRm9yIGx1Y2lkL0FSTSBzdHlsZSwgd2UKLSAgIGFjY291bnQgZm9yIHRoaXMgZGlmZmVyZW5jZSBieSBkaXNjYXJkaW5nIGFueSBwcmV2aW91c2x5IHNlZW4gdHlwZXMgd2hlbgotICAgd2Ugc2VlIHRoZSAnRicgY2hhcmFjdGVyLCBhbmQgc3VidHJhY3Rpbmcgb25lIGZyb20gdGhlIHR5cGUgbnVtYmVyCi0gICByZWZlcmVuY2UuCi0KLSAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBzdHJpbmcgYXJnOwotICBpbnQgbmVlZF9jb21tYSA9IDA7Ci0gIGludCByOwotICBpbnQgdDsKLSAgY29uc3QgY2hhciAqdGVtOwotICBjaGFyIHRlbXB0eXBlOwotCi0gIGlmIChQUklOVF9BUkdfVFlQRVMpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIoIik7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdcMCcpCi0JewotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJ2b2lkIik7Ci0JfQotICAgIH0KLQotICB3aGlsZSAoKCoqbWFuZ2xlZCAhPSAnXycgJiYgKiptYW5nbGVkICE9ICdcMCcgJiYgKiptYW5nbGVkICE9ICdlJykKLQkgfHwgd29yay0+bnJlcGVhdHMgPiAwKQotICAgIHsKLSAgICAgIGlmICgoKiptYW5nbGVkID09ICdOJykgfHwgKCoqbWFuZ2xlZCA9PSAnVCcpKQotCXsKLQkgIHRlbXB0eXBlID0gKigqbWFuZ2xlZCkrKzsKLQotCSAgaWYgKHRlbXB0eXBlID09ICdOJykKLQkgICAgewotCSAgICAgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmcikpCi0JCXsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHIgPSAxOwotCSAgICB9Ci0gICAgICAgICAgaWYgKChIUF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiB3b3JrIC0+IG50eXBlcyA+PSAxMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSAxMCBvciBtb3JlIHR5cGVzIHdlIG1pZ2h0IGhhdmUgbW9yZSB0aGFuIGEgMSBkaWdpdAotICAgICAgICAgICAgICAgICBpbmRleCBzbyB3ZSdsbCBoYXZlIHRvIGNvbnN1bWUgdGhlIHdob2xlIGNvdW50IGhlcmUuIFRoaXMKLSAgICAgICAgICAgICAgICAgd2lsbCBsb3NlIGlmIHRoZSBuZXh0IHRoaW5nIGlzIGEgdHlwZSBuYW1lIHByZWNlZGVkIGJ5IGEKLSAgICAgICAgICAgICAgICAgY291bnQgYnV0IGl0J3MgaW1wb3NzaWJsZSB0byBkZW1hbmdsZSB0aGF0IGNhc2UgcHJvcGVybHkKLSAgICAgICAgICAgICAgICAgYW55d2F5LiBFZyBpZiB3ZSBhbHJlYWR5IGhhdmUgMTIgdHlwZXMgaXMgVDEyUGMgIiguLi4sIHR5cGUxLAotICAgICAgICAgICAgICAgICBQYywgLi4uKSIgIG9yICIoLi4uLCB0eXBlMTIsIGNoYXIgKiwgLi4uKSIgKi8KLSAgICAgICAgICAgICAgaWYgKCh0ID0gY29uc3VtZV9jb3VudChtYW5nbGVkKSkgPD0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnQpKQotCSAgICAJewotCSAgICAgICAgICByZXR1cm4gKDApOwotCSAgICAJfQotCSAgICB9Ci0JICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgdC0tOwotCSAgICB9Ci0JICAvKiBWYWxpZGF0ZSB0aGUgdHlwZSBpbmRleC4gIFByb3RlY3QgYWdhaW5zdCBpbGxlZ2FsIGluZGljZXMgZnJvbQotCSAgICAgbWFsZm9ybWVkIHR5cGUgc3RyaW5ncy4gICovCi0JICBpZiAoKHQgPCAwKSB8fCAodCA+PSB3b3JrIC0+IG50eXBlcykpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKDApOwotCSAgICB9Ci0JICB3aGlsZSAod29yay0+bnJlcGVhdHMgPiAwIHx8IC0tciA+PSAwKQotCSAgICB7Ci0JICAgICAgdGVtID0gd29yayAtPiB0eXBldmVjW3RdOwotCSAgICAgIGlmIChuZWVkX2NvbW1hICYmIFBSSU5UX0FSR19UWVBFUykKLQkJewotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCAiKTsKLQkJfQotCSAgICAgIGlmICghZG9fYXJnICh3b3JrLCAmdGVtLCAmYXJnKSkKLQkJewotCQkgIHJldHVybiAoMCk7Ci0JCX0KLQkgICAgICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotCQl7Ci0JCSAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLQkJfQotCSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotCSAgICAgIG5lZWRfY29tbWEgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChuZWVkX2NvbW1hICYmIFBSSU5UX0FSR19UWVBFUykKLQkgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsICIpOwotCSAgaWYgKCFkb19hcmcgKHdvcmssIG1hbmdsZWQsICZhcmcpKQotCSAgICByZXR1cm4gKDApOwotCSAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQkgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLQkgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotCSAgbmVlZF9jb21tYSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAoKiptYW5nbGVkID09ICdlJykKLSAgICB7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotCXsKLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0JICAgIH0KLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLi4uIik7Ci0JfQotICAgIH0KLQotICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiKSIpOwotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogTGlrZSBkZW1hbmdsZV9hcmdzLCBidXQgZm9yIGRlbWFuZ2xpbmcgdGhlIGFyZ3VtZW50IGxpc3RzIG9mIGZ1bmN0aW9uCi0gICBhbmQgbWV0aG9kIHBvaW50ZXJzIG9yIHJlZmVyZW5jZXMsIG5vdCB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zLiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIHN0cmluZyogc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQ7Ci0gIGludCByZXN1bHQ7Ci0gIGludCBzYXZlZF9ucmVwZWF0czsKLQotICAvKiBUaGUgRysrIG5hbWUtbWFuZ2xpbmcgYWxnb3JpdGhtIGRvZXMgbm90IHJlbWVtYmVyIHR5cGVzIG9uIG5lc3RlZAotICAgICBhcmd1bWVudCBsaXN0cywgdW5sZXNzIC1mc3F1YW5nbGluZyBpcyB1c2VkLCBhbmQgaW4gdGhhdCBjYXNlIHRoZQotICAgICB0eXBlIHZlY3RvciB1cGRhdGVkIGJ5IHJlbWVtYmVyX3R5cGUgaXMgbm90IHVzZWQuICBTbywgd2UgdHVybgotICAgICBvZmYgcmVtZW1iZXJpbmcgb2YgdHlwZXMgaGVyZS4gICovCi0gICsrd29yay0+Zm9yZ2V0dGluZ190eXBlczsKLQotICAvKiBGb3IgdGhlIHJlcGVhdCBjb2RlcyB1c2VkIHdpdGggLWZzcXVhbmdsaW5nLCB3ZSBtdXN0IGtlZXAgdHJhY2sgb2YKLSAgICAgdGhlIGxhc3QgYXJndW1lbnQuICAqLwotICBzYXZlZF9wcmV2aW91c19hcmd1bWVudCA9IHdvcmstPnByZXZpb3VzX2FyZ3VtZW50OwotICBzYXZlZF9ucmVwZWF0cyA9IHdvcmstPm5yZXBlYXRzOwotICB3b3JrLT5wcmV2aW91c19hcmd1bWVudCA9IDA7Ci0gIHdvcmstPm5yZXBlYXRzID0gMDsKLQotICAvKiBBY3R1YWxseSBkZW1hbmdsZSB0aGUgYXJndW1lbnRzLiAgKi8KLSAgcmVzdWx0ID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCi0gIC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzX2FyZ3VtZW50IGZpZWxkLiAgKi8KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHN0cmluZ19kZWxldGUgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSBzYXZlZF9wcmV2aW91c19hcmd1bWVudDsKLSAgLS13b3JrLT5mb3JnZXR0aW5nX3R5cGVzOwotICB3b3JrLT5ucmVwZWF0cyA9IHNhdmVkX25yZXBlYXRzOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2NhbikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotICAgICBjb25zdCBjaGFyICpzY2FuOwotewotICBzaXplX3QgaTsKLSAgc3RyaW5nIHR5cGU7Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLQotICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICgqbWFuZ2xlZCksIHNjYW4gLSAoKm1hbmdsZWQpKTsKLSAgc3RyaW5nX25lZWQgKGRlY2xwLCAxKTsKLSAgKihkZWNscCAtPiBwKSA9ICdcMCc7Ci0KLSAgLyogQ29uc3VtZSB0aGUgZnVuY3Rpb24gbmFtZSwgaW5jbHVkaW5nIHRoZSAiX18iIHNlcGFyYXRpbmcgdGhlIG5hbWUKLSAgICAgZnJvbSB0aGUgc2lnbmF0dXJlLiAgV2UgYXJlIGd1YXJhbnRlZWQgdGhhdCBTQ0FOIHBvaW50cyB0byB0aGUKLSAgICAgc2VwYXJhdG9yLiAgKi8KLQotICAoKm1hbmdsZWQpID0gc2NhbiArIDI7Ci0gIC8qIFdlIG1heSBiZSBsb29raW5nIGF0IGFuIGluc3RhbnRpYXRpb24gb2YgYSB0ZW1wbGF0ZSBmdW5jdGlvbjoKLSAgICAgZm9vX19YdDF0Ml9GdDN0NCwgd2hlcmUgdDEsIHQyLCAuLi4gYXJlIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgYQotICAgICBmb2xsb3dpbmcgX0YgbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuICBIYW5kbGUKLSAgICAgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBmaXJzdC4gKi8KLQotICBpZiAoSFBfREVNQU5HTElORyAmJiAoKiptYW5nbGVkID09ICdYJykpCi0gICAgewotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAwLCBkZWNscCk7Ci0gICAgICAvKiBUaGlzIGxlYXZlcyBNQU5HTEVEIHBvaW50aW5nIHRvIHRoZSAnRicgbWFya2luZyBmdW5jIGFyZ3MgKi8KLSAgICB9Ci0KLSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLSAgICB7Ci0KLSAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIEFSTSBzdHlsZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG9wZXJhdG9yLgotCSBJZiBzbywgdGhlbiBqdXN0IHJlY29yZCBpdCwgY2xlYXIgdGhlIGRlY2wsIGFuZCByZXR1cm4uCi0JIFdlIGNhbid0IGJ1aWxkIHRoZSBhY3R1YWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBkZWNsIHVudGlsIGxhdGVyLAotCSB3aGVuIHdlIHJlY292ZXIgdGhlIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2lnbmF0dXJlLiAgKi8KLQotICAgICAgaWYgKHN0cmNtcCAoZGVjbHAgLT4gYiwgIl9fY3QiKSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gY29uc3RydWN0b3IgKz0gMTsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVjbHAgLT4gYiwgIl9fZHQiKSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gZGVzdHJ1Y3RvciArPSAxOwotCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZGVjbHAtPnAgLSBkZWNscC0+YiA+PSAzCi0gICAgICAmJiBkZWNscC0+YlswXSA9PSAnbycKLSAgICAgICYmIGRlY2xwLT5iWzFdID09ICdwJwotICAgICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBkZWNscC0+YlsyXSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzZWUgaWYgaXQncyBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChkZWNscC0+cCAtIGRlY2xwLT5iID49IDEwIC8qIG9wJGFzc2lnbl8gKi8KLQkgICYmIG1lbWNtcCAoZGVjbHAtPmIgKyAzLCAiYXNzaWduXyIsIDcpID09IDApCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gZGVjbHAtPnAgLSBkZWNscC0+YiAtIDEwOwotCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbgotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgZGVjbHAtPmIgKyAxMCwgbGVuKSA9PSAwKQotCQl7Ci0JCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI9Iik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGludCBsZW4gPSBkZWNscC0+cCAtIGRlY2xwLT5iIC0gMzsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4KLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMywgbGVuKSA9PSAwKQotCQl7Ci0JCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGRlY2xwLT5wIC0gZGVjbHAtPmIgPj0gNSAmJiBtZW1jbXAgKGRlY2xwLT5iLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIGRlY2xwLT5iWzRdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciAqLwotICAgICAgdGVtID0gZGVjbHAtPmIgKyA1OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0eXBlKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+YlswXSA9PSAnXycgJiYgZGVjbHAtPmJbMV0gPT0gJ18nCi0JICAgJiYgZGVjbHAtPmJbMl0gPT0gJ28nICYmIGRlY2xwLT5iWzNdID09ICdwJykKLSAgICB7Ci0gICAgICAvKiBBTlNJLiAgKi8KLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBkZWNscC0+YiArIDQ7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciAiKTsKLQkgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnR5cGUpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJnR5cGUpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGRlY2xwLT5iWzBdID09ICdfJyAmJiBkZWNscC0+YlsxXSA9PSAnXycKLQkgICAmJiBkZWNscC0+YlsyXSA+PSAnYScgJiYgZGVjbHAtPmJbMl0gPD0gJ3onCi0JICAgJiYgZGVjbHAtPmJbM10gPj0gJ2EnICYmIGRlY2xwLT5iWzNdIDw9ICd6JykKLSAgICB7Ci0gICAgICBpZiAoZGVjbHAtPmJbNF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBPcGVyYXRvci4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDIKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMiwgMikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGRlY2xwLT5iWzJdID09ICdhJyAmJiBkZWNscC0+Yls1XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogQXNzaWdubWVudC4gICovCi0JICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JCXsKLQkJICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAzCi0JCSAgICAgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgZGVjbHAtPmIgKyAyLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogYSBtaW5pIHN0cmluZy1oYW5kbGluZyBwYWNrYWdlICovCi0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfbmVlZCAocywgbikKLSAgICAgc3RyaW5nICpzOwotICAgICBpbnQgbjsKLXsKLSAgaW50IHRlbTsKLQotICBpZiAocy0+YiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChuIDwgMzIpCi0JewotCSAgbiA9IDMyOwotCX0KLSAgICAgIHMtPnAgPSBzLT5iID0geG1hbGxvYyAobik7Ci0gICAgICBzLT5lID0gcy0+YiArIG47Ci0gICAgfQotICBlbHNlIGlmIChzLT5lIC0gcy0+cCA8IG4pCi0gICAgewotICAgICAgdGVtID0gcy0+cCAtIHMtPmI7Ci0gICAgICBuICs9IHRlbTsKLSAgICAgIG4gKj0gMjsKLSAgICAgIHMtPmIgPSB4cmVhbGxvYyAocy0+Yiwgbik7Ci0gICAgICBzLT5wID0gcy0+YiArIHRlbTsKLSAgICAgIHMtPmUgPSBzLT5iICsgbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfZGVsZXRlIChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIGlmIChzLT5iICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocy0+Yik7Ci0gICAgICBzLT5iID0gcy0+ZSA9IHMtPnAgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19pbml0IChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIHMtPmIgPSBzLT5wID0gcy0+ZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfY2xlYXIgKHMpCi0gICAgIHN0cmluZyAqczsKLXsKLSAgcy0+cCA9IHMtPmI7Ci19Ci0KLSNpZiAwCi0KLXN0YXRpYyBpbnQKLXN0cmluZ19lbXB0eSAocykKLSAgICAgc3RyaW5nICpzOwotewotICByZXR1cm4gKHMtPmIgPT0gcy0+cCk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZCAocCwgcykKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpbnQgbjsKLSAgaWYgKHMgPT0gTlVMTCB8fCAqcyA9PSAnXDAnKQotICAgIHJldHVybjsKLSAgbiA9IHN0cmxlbiAocyk7Ci0gIHN0cmluZ19uZWVkIChwLCBuKTsKLSAgbWVtY3B5IChwLT5wLCBzLCBuKTsKLSAgcC0+cCArPSBuOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZHMgKHAsIHMpCi0gICAgIHN0cmluZyAqcCwgKnM7Ci17Ci0gIGludCBuOwotCi0gIGlmIChzLT5iICE9IHMtPnApCi0gICAgewotICAgICAgbiA9IHMtPnAgLSBzLT5iOwotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgbWVtY3B5IChwLT5wLCBzLT5iLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kbiAocCwgcywgbikKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKG4gIT0gMCkKLSAgICB7Ci0gICAgICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gICAgICBtZW1jcHkgKHAtPnAsIHMsIG4pOwotICAgICAgcC0+cCArPSBuOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kIChwLCBzKQotICAgICBzdHJpbmcgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGlmIChzICE9IE5VTEwgJiYgKnMgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzdHJpbmdfcHJlcGVuZG4gKHAsIHMsIHN0cmxlbiAocykpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kcyAocCwgcykKLSAgICAgc3RyaW5nICpwLCAqczsKLXsKLSAgaWYgKHMtPmIgIT0gcy0+cCkKLSAgICB7Ci0gICAgICBzdHJpbmdfcHJlcGVuZG4gKHAsIHMtPmIsIHMtPnAgLSBzLT5iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZG4gKHAsIHMsIG4pCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IG47Ci17Ci0gIGNoYXIgKnE7Ci0KLSAgaWYgKG4gIT0gMCkKLSAgICB7Ci0gICAgICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gICAgICBmb3IgKHEgPSBwLT5wIC0gMTsgcSA+PSBwLT5iOyBxLS0pCi0JewotCSAgcVtuXSA9IHFbMF07Ci0JfQotICAgICAgbWVtY3B5IChwLT5iLCBzLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLS8qIFRvIGdlbmVyYXRlIGEgc3RhbmRhbG9uZSBkZW1hbmdsZXIgcHJvZ3JhbSBmb3IgdGVzdGluZyBwdXJwb3NlcywKLSAgIGp1c3QgY29tcGlsZSBhbmQgbGluayB0aGlzIGZpbGUgd2l0aCAtRE1BSU4gYW5kIGxpYmliZXJ0eS5hLiAgV2hlbgotICAgcnVuLCBpdCBkZW1hbmdsZXMgZWFjaCBjb21tYW5kIGxpbmUgYXJnLCBvciBlYWNoIHN0ZGluIHN0cmluZywgYW5kCi0gICBwcmludHMgdGhlIHJlc3VsdCBvbiBzdGRvdXQuICAqLwotCi0jaWZkZWYgTUFJTgotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLXN0YXRpYyBjaGFyICpwcm9ncmFtX25hbWU7Ci1zdGF0aWMgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gVkVSU0lPTjsKLXN0YXRpYyBpbnQgZmxhZ3MgPSBETUdMX1BBUkFNUyB8IERNR0xfQU5TSTsKLQotc3RhdGljIHZvaWQgZGVtYW5nbGVfaXQgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZmF0YWwgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9pdCAobWFuZ2xlZF9uYW1lKQotICAgICBjaGFyICptYW5nbGVkX25hbWU7Ci17Ci0gIGNoYXIgKnJlc3VsdDsKLQotICByZXN1bHQgPSBjcGx1c19kZW1hbmdsZSAobWFuZ2xlZF9uYW1lLCBmbGFncyk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlc1xuIiwgbWFuZ2xlZF9uYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIlc1xuIiwgcmVzdWx0KTsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgIlwKLVVzYWdlOiAlcyBbLV9dIFstbl0gWy1zIHtnbnUsbHVjaWQsYXJtLGhwLGVkZ31dIFstLXN0cmlwLXVuZGVyc2NvcmVzXVxuXAotICAgICAgIFstLW5vLXN0cmlwLXVuZGVyc2NvcmVzXSBbLS1mb3JtYXQ9e2dudSxsdWNpZCxhcm0saHAsZWRnfV1cblwKLSAgICAgIFstLWhlbHBdIFstLXZlcnNpb25dIFthcmcuLi5dXG4iLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLSNkZWZpbmUgTUJVRl9TSVpFIDMyNzY3Ci1jaGFyIG1idWZmZXJbTUJVRl9TSVpFXTsKLQotLyogRGVmaW5lZCBpbiB0aGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgdW5kZXJzY29yZS5jLiAgKi8KLWV4dGVybiBpbnQgcHJlcGVuZHNfdW5kZXJzY29yZTsKLQotaW50IHN0cmlwX3VuZGVyc2NvcmUgPSAwOwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKLSAgeyJzdHJpcC11bmRlcnNjb3JlcyIsIG5vX2FyZ3VtZW50LCAwLCAnXyd9LAotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncyd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJqYXZhIiwgbm9fYXJndW1lbnQsIDAsICdqJ30sCi0gIHsibm8tc3RyaXAtdW5kZXJzY29yZXMiLCBub19hcmd1bWVudCwgMCwgJ24nfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLS8qIE1vcmUgJ2ZyaWVuZGx5JyBhYm9ydCB0aGF0IHByaW50cyB0aGUgbGluZSBhbmQgZmlsZS4KLSAgIGNvbmZpZy5oIGNhbiAjZGVmaW5lIGFib3J0IGZhbmN5X2Fib3J0IGlmIHlvdSBsaWtlIHRoYXQgc29ydCBvZiB0aGluZy4gICovCi0KLXZvaWQKLWZhbmN5X2Fib3J0ICgpCi17Ci0gIGZhdGFsICgiSW50ZXJuYWwgZ2NjIGFib3J0LiIpOwotfQotCi0KLS8qIEZpbGwgaW4gVEFCTEUgc28gdGhhdCBUQUJMRVtDXSBpcyB0cnVlIGlmZiBDIChhcyBhbiB1bnNpZ25lZCBjaGFyKQotICAgaXMgYSB2YWxpZCBzeW1ib2wgY29tcG9uZW50LCBpbiB0aGUgc3RhbmRhcmQgYXNzZW1ibGVyIHN5bWJvbAotICAgc3ludGF4LiAgKi8KLXZvaWQKLXN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCAoY2hhciAqdGFibGUpCi17Ci0gIGludCBjOwotCi0gIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykKLSAgICB0YWJsZVtjXSA9IGlzYWxudW0oYyk7Ci0KLSAgdGFibGVbJ18nXSA9IDE7Ci0gIHRhYmxlWyckJ10gPSAxOwotICB0YWJsZVsnLiddID0gMTsKLX0KLQotCi0vKiBGaWxsIGluIFRBQkxFIHNvIHRoYXQgVEFCTEVbQ10gaXMgdHJ1ZSBpZmYgQyAoYXMgYW4gdW5zaWduZWQgY2hhcikKLSAgIGlzIGEgdmFsaWQgc3ltYm9sIG5hbWUgY29tcG9uZW50IGluIGFuIEhQIG9iamVjdCBmaWxlLgotCi0gICBOb3RlIHRoYXQsIHNpbmNlIEhQJ3MgY29tcGlsZXIgZ2VuZXJhdGVzIG9iamVjdCBjb2RlIHN0cmFpZ2h0IGZyb20KLSAgIEMrKyBzb3VyY2UsIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBhbiBhc3NlbWJsZXIsIGl0cyBtYW5nbGVkCi0gICBpZGVudGlmaWVycyBjYW4gdXNlIGFsbCBzb3J0cyBvZiBjaGFyYWN0ZXJzIHRoYXQgbm8gYXNzZW1ibGVyIHdvdWxkCi0gICB0b2xlcmF0ZSwgc28gdGhlIGFscGhhYmV0IHRoaXMgZnVuY3Rpb24gY3JlYXRlcyBpcyBhIGxpdHRsZSBvZGQuCi0gICBIZXJlIGFyZSBzb21lIHNhbXBsZSBtYW5nbGVkIGlkZW50aWZpZXJzIG9mZmVyZWQgYnkgSFA6Ci0KLQl0eXBlaWQqX19YVDI0QWRkcmVzc0luZEV4cENsYXNzTWVtYmVyXwotCVtWZnRwdHJda2V5Ol9fZHRfXzMyT3JkaW5hcnlDb21wYXJlSW5kRXhwQ2xhc3NNZW1iZXJGdgotCV9fY3RfX1EyXzlFbGY2NF9EeW4xOHt1bm5hbWVkLnVuaW9uLiMxfUZ2Ci0KLSAgIFRoaXMgc3RpbGwgc2VlbXMgcmVhbGx5IHdlaXJkIHRvIG1lLCBzaW5jZSBub3doZXJlIGVsc2UgaW4gdGhpcwotICAgZmlsZSBpcyB0aGVyZSBhbnl0aGluZyB0byByZWNvZ25pemUgY3VybHkgYnJhY2tldHMsIHBhcmVucywgZXRjLgotICAgSSd2ZSB0YWxrZWQgd2l0aCBTcmlrYW50aCA8c3Jpa2FudGhAY3VwLmhwLmNvbT4sIGFuZCBoZSBhc3N1cmVzIG1lCi0gICB0aGlzIGlzIHJpZ2h0LCBidXQgSSBzdGlsbCBzdHJvbmdseSBzdXNwZWN0IHRoYXQgdGhlcmUncyBhCi0gICBtaXN1bmRlcnN0YW5kaW5nIGhlcmUuCi0KLSAgIElmIHdlIGRlY2lkZSBpdCdzIGJldHRlciBmb3IgYysrZmlsdCB0byB1c2UgSFAncyBhc3NlbWJsZXIgc3ludGF4Ci0gICB0byBzY3JhcGUgaWRlbnRpZmllcnMgb3V0IG9mIGl0cyBpbnB1dCwgaGVyZSdzIHRoZSBkZWZpbml0aW9uIG9mCi0gICB0aGUgc3ltYm9sIG5hbWUgc3ludGF4IGZyb20gdGhlIEhQIGFzc2VtYmxlciBtYW51YWw6Ci0KLSAgICAgICBTeW1ib2xzIGFyZSBjb21wb3NlZCBvZiB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSBsZXR0ZXJzLCBkZWNpbWFsCi0gICAgICAgZGlnaXRzLCBkb2xsYXIgc3ltYm9sLCBwZXJpb2QgKC4pLCBhbXBlcnNhbmQgKCYpLCBwb3VuZCBzaWduKCMpIGFuZAotICAgICAgIHVuZGVyc2NvcmUgKF8pLiBBIHN5bWJvbCBjYW4gYmVnaW4gd2l0aCBhIGxldHRlciwgZGlnaXQgdW5kZXJzY29yZSBvcgotICAgICAgIGRvbGxhciBzaWduLiBJZiBhIHN5bWJvbCBiZWdpbnMgd2l0aCBhIGRpZ2l0LCBpdCBtdXN0IGNvbnRhaW4gYQotICAgICAgIG5vbi1kaWdpdCBjaGFyYWN0ZXIuCi0KLSAgIFNvIGhhdmUgZnVuLiAgKi8KLXZvaWQKLWhwX3N5bWJvbF9hbHBoYWJldCAoY2hhciAqdGFibGUpCi17Ci0gIGNoYXIgKmM7Ci0KLSAgc3RhbmRhcmRfc3ltYm9sX2FscGhhYmV0ICh0YWJsZSk7Ci0KLSAgZm9yIChjID0gIjw+IywqJltdOigpe30iOyAqYzsgYysrKQotICAgIHRhYmxlWyh1bnNpZ25lZCBjaGFyKSAqY10gPSAxOwotfQotCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICpyZXN1bHQ7Ci0gIGludCBjOwotICBjaGFyIHN5bWJvbF9hbHBoYWJldFsyNTZdOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgc3RyaXBfdW5kZXJzY29yZSA9IHByZXBlbmRzX3VuZGVyc2NvcmU7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJfbnM6aiIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnPyc6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JY2FzZSAnbic6Ci0JICBzdHJpcF91bmRlcnNjb3JlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgcHJpbnRmICgiR05VICVzIChDKysgZGVtYW5nbGVyKSwgdmVyc2lvbiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX3ZlcnNpb24pOwotCSAgZXhpdCAoMCk7Ci0JY2FzZSAnXyc6Ci0JICBzdHJpcF91bmRlcnNjb3JlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2onOgotCSAgZmxhZ3MgfD0gRE1HTF9KQVZBOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBpZiAoc3RyY21wIChvcHRhcmcsICJnbnUiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gZ251X2RlbWFuZ2xpbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibHVjaWQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gbHVjaWRfZGVtYW5nbGluZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJhcm0iKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gYXJtX2RlbWFuZ2xpbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiaHAiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gaHBfZGVtYW5nbGluZzsKLQkgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiZWRnIikgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gZWRnX2RlbWFuZ2xpbmc7Ci0gICAgICAgICAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogdW5rbm93biBkZW1hbmdsaW5nIHN0eWxlIGAlcydcbiIsCi0JCSAgICAgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICAgICAgZXhpdCAoMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgZm9yICggOyBvcHRpbmQgPCBhcmdjOyBvcHRpbmQrKykKLQl7Ci0JICBkZW1hbmdsZV9pdCAoYXJndltvcHRpbmRdKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUpCi0JewotCWNhc2UgZ251X2RlbWFuZ2xpbmc6Ci0JY2FzZSBsdWNpZF9kZW1hbmdsaW5nOgotCWNhc2UgYXJtX2RlbWFuZ2xpbmc6Ci0JY2FzZSBlZGdfZGVtYW5nbGluZzoKLQkgIHN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCAoc3ltYm9sX2FscGhhYmV0KTsKLQkgIGJyZWFrOwotCWNhc2UgaHBfZGVtYW5nbGluZzoKLQkgIGhwX3N5bWJvbF9hbHBoYWJldCAoc3ltYm9sX2FscGhhYmV0KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiBGb2xrcyBzaG91bGQgZXhwbGljaXRseSBpbmRpY2F0ZSB0aGUgYXBwcm9wcmlhdGUgYWxwaGFiZXQgZm9yCi0JICAgICBlYWNoIGRlbWFuZ2xpbmcuICBQcm92aWRpbmcgYSBkZWZhdWx0IHdvdWxkIGFsbG93IHRoZQotCSAgICAgcXVlc3Rpb24gdG8gZ28gdW5jb25zaWRlcmVkLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgZm9yICg7OykKLQl7Ci0JICBpbnQgaSA9IDA7Ci0JICBjID0gZ2V0Y2hhciAoKTsKLQkgIC8qIFRyeSB0byByZWFkIGEgbGFiZWwuICAqLwotCSAgd2hpbGUgKGMgIT0gRU9GICYmIHN5bWJvbF9hbHBoYWJldFtjXSkKLQkgICAgewotCSAgICAgIGlmIChpID49IE1CVUZfU0laRS0xKQotCQlicmVhazsKLQkgICAgICBtYnVmZmVyW2krK10gPSBjOwotCSAgICAgIGMgPSBnZXRjaGFyICgpOwotCSAgICB9Ci0JICBpZiAoaSA+IDApCi0JICAgIHsKLQkgICAgICBpbnQgc2tpcF9maXJzdCA9IDA7Ci0KLQkgICAgICBpZiAobWJ1ZmZlclswXSA9PSAnLicpCi0JCSsrc2tpcF9maXJzdDsKLQkgICAgICBpZiAoc3RyaXBfdW5kZXJzY29yZSAmJiBtYnVmZmVyW3NraXBfZmlyc3RdID09ICdfJykKLQkJKytza2lwX2ZpcnN0OwotCi0JICAgICAgaWYgKHNraXBfZmlyc3QgPiBpKQotCQlza2lwX2ZpcnN0ID0gaTsKLQotCSAgICAgIG1idWZmZXJbaV0gPSAwOwotCi0JICAgICAgcmVzdWx0ID0gY3BsdXNfZGVtYW5nbGUgKG1idWZmZXIgKyBza2lwX2ZpcnN0LCBmbGFncyk7Ci0JICAgICAgaWYgKHJlc3VsdCkKLQkJewotCQkgIGlmIChtYnVmZmVyWzBdID09ICcuJykKLQkJICAgIHB1dGMgKCcuJywgc3Rkb3V0KTsKLQkJICBmcHV0cyAocmVzdWx0LCBzdGRvdXQpOwotCQkgIGZyZWUgKHJlc3VsdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWZwdXRzIChtYnVmZmVyLCBzdGRvdXQpOwotCi0JICAgICAgZmZsdXNoIChzdGRvdXQpOwotCSAgICB9Ci0JICBpZiAoYyA9PSBFT0YpCi0JICAgIGJyZWFrOwotCSAgcHV0Y2hhciAoYyk7Ci0JfQotICAgIH0KLQotICBleGl0ICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWZhdGFsIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cik7Ci0gIGV4aXQgKDEpOwotfQotCi1QVFIKLXhtYWxsb2MgKHNpemUpCi0gIHNpemVfdCBzaXplOwotewotICByZWdpc3RlciBQVFIgdmFsdWUgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotICBpZiAodmFsdWUgPT0gMCkKLSAgICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLVBUUgoteHJlYWxsb2MgKHB0ciwgc2l6ZSkKLSAgUFRSIHB0cjsKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiB2YWx1ZSA9IChQVFIpIHJlYWxsb2MgKHB0ciwgc2l6ZSk7Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLSNlbmRpZgkvKiBtYWluICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZmRtYXRjaC5jIGIvbGliaWJlcnR5L2ZkbWF0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmMDM5Zi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZmRtYXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogQ29tcGFyZSB0d28gb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHRvIHNlZSBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0KLU5BTUUKLQotCWZkbWF0Y2ggLS0gc2VlIGlmIHR3byBmaWxlIGRlc2NyaXB0b3JzIHJlZmVyIHRvIHNhbWUgZmlsZQotCi1TWU5PUFNJUwotCi0JaW50IGZkbWF0Y2ggKGludCBmZDEsIGludCBmZDIpCi0KLURFU0NSSVBUSU9OCi0KLQlDaGVjayB0byBzZWUgaWYgdHdvIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyByZWZlciB0byB0aGUgc2FtZSBmaWxlLgotCVRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiB3ZSBoYXZlIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCi0JZm9yIGFuIHVubmFtZWQgZmlsZSwgYW5kIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IHdlIGJlbGlldmUgdG8gCi0JY29ycmVzcG9uZCB0byB0aGF0IGZkLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGV4ZWMnZCB3aXRoCi0JYW4gYWxyZWFkeSBvcGVuIGZpbGUgKHN0ZG91dCBmb3IgZXhhbXBsZSkgb3IgZnJvbSB0aGUgU1ZSNCAvcHJvYwotCWNhbGxzIHRoYXQgcmV0dXJuIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgbWFwcGVkIGFkZHJlc3Mgc3BhY2VzLgotCUFsbCB3ZSBoYXZlIHRvIGRvIGlzIG9wZW4gdGhlIGZpbGUgYnkgbmFtZSBhbmQgY2hlY2sgdGhlIHR3byBmaWxlCi0JZGVzY3JpcHRvcnMgZm9yIGEgbWF0Y2gsIHdoaWNoIGlzIGRvbmUgYnkgY29tcGFyaW5nIG1ham9yJm1pbm9yCi0JZGV2aWNlIG51bWJlcnMgYW5kIGlub2RlIG51bWJlcnMuCi0KLUJVR1MKLQotCShGSVhNRTogZG9lcyB0aGlzIHdvcmsgZm9yIG5ldHdvcmtzPykKLQlJdCB3b3JrcyBmb3IgTkZTLCB3aGljaCBhc3NpZ25zIGEgZGV2aWNlIG51bWJlciB0byBlYWNoIG1vdW50LgotCi0qLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi1pbnQgZmRtYXRjaCAoZmQxLCBmZDIpCi0JaW50IGZkMTsKLQlpbnQgZmQyOwotewotICBzdHJ1Y3Qgc3RhdCBzYnVmMTsKLSAgc3RydWN0IHN0YXQgc2J1ZjI7Ci0KLSAgaWYgKChmc3RhdCAoZmQxLCAmc2J1ZjEpID09IDApICYmCi0gICAgICAoZnN0YXQgKGZkMiwgJnNidWYyKSA9PSAwKSAmJgotICAgICAgKHNidWYxLnN0X2RldiA9PSBzYnVmMi5zdF9kZXYpICYmCi0gICAgICAoc2J1ZjEuc3RfaW5vID09IHNidWYyLnN0X2lubykpCi0gICAgewotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jIGIvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZjIxZTQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyogSUVFRSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IHJvdXRpbmVzLCBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgotI2luY2x1ZGUgPG1hdGguaD4JCS8qIGxkZXhwICovCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiB2b2lkICptZW1jcHkgKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOwotZXh0ZXJuIHZvaWQgKm1lbXNldCAodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsKLSNlbHNlCi1leHRlcm4gY2hhciAqbWVtY3B5ICgpOwotZXh0ZXJuIGNoYXIgKm1lbXNldCAoKTsKLSNlbmRpZgotCi0vKiBUaGUgb2RkcyB0aGF0IENIQVJfQklUIHdpbGwgYmUgYW55dGhpbmcgYnV0IDggYXJlIGxvdyBlbm91Z2ggdGhhdCBJJ20gbm90Ci0gICBnb2luZyB0byBib3RoZXIgd2l0aCB0cnlpbmcgdG8gbXVjayBhcm91bmQgd2l0aCB3aGV0aGVyIGl0IGlzIGRlZmluZWQgaW4KLSAgIGEgc3lzdGVtIGhlYWRlciwgd2hhdCB3ZSBkbyBpZiBub3QsIGV0Yy4gICovCi0jZGVmaW5lIEZMT0FURk9STUFUX0NIQVJfQklUIDgKLQotLyogZmxvYXRmb3JtYXRzIGZvciBJRUVFIHNpbmdsZSBhbmQgZG91YmxlLCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4uICAqLwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2JpZyA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2JpZywgMzIsIDAsIDEsIDgsIDEyNywgMjU1LCA5LCAyMywgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2xpdHRsZSA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgMzIsIDAsIDEsIDgsIDEyNywgMjU1LCA5LCAyMywgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZyA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2JpZywgNjQsIDAsIDEsIDExLCAxMDIzLCAyMDQ3LCAxMiwgNTIsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9saXR0bGUgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGUsIDY0LCAwLCAxLCAxMSwgMTAyMywgMjA0NywgMTIsIDUyLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci0KLS8qIGZsb2F0Zm9ybWF0IGZvciBJRUVFIGRvdWJsZSwgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLCB3aXRoIGJpZyBlbmRpYW4gd29yZAotICAgb3JkZXJpbmcsIGFzIG9uIHRoZSBBUk0uICAqLwotCi1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkID0KLXsKLSAgZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkLCA2NCwgMCwgMSwgMTEsIDEwMjMsIDIwNDcsIDEyLCA1MiwgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotCi1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTM4N19leHQgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGUsIDgwLCAwLCAxLCAxNSwgMHgzZmZmLCAweDdmZmYsIDE2LCA2NCwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9tNjg4ODFfZXh0ID0KLXsKLSAgLyogTm90ZSB0aGF0IHRoZSBiaXRzIGZyb20gMTYgdG8gMzEgYXJlIHVudXNlZC4gICovCi0gIGZsb2F0Zm9ybWF0X2JpZywgOTYsIDAsIDEsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMzIsIDY0LCBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2k5NjBfZXh0ID0KLXsKLSAgLyogTm90ZSB0aGF0IHRoZSBiaXRzIGZyb20gMCB0byAxNSBhcmUgdW51c2VkLiAgKi8KLSAgZmxvYXRmb3JtYXRfbGl0dGxlLCA5NiwgMTYsIDE3LCAxNSwgMHgzZmZmLCAweDdmZmYsIDMyLCA2NCwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9tODgxMTBfZXh0ID0KLXsKLSNpZmRlZiBIQVJSSVNfRkxPQVRfRk9STUFUCi0gIC8qIEhhcnJpcyB1c2VzIHJhdyBmb3JtYXQgMTI4IGJ5dGVzIGxvbmcsIGJ1dCB0aGUgbnVtYmVyIGlzIGp1c3QgYW4gaWVlZQotICAgICBkb3VibGUsIGFuZCB0aGUgbGFzdCA2NCBiaXRzIGFyZSB3YXN0ZWQuICovCi0gIGZsb2F0Zm9ybWF0X2JpZywxMjgsIDAsIDEsIDExLCAgMHgzZmYsICAweDdmZiwgMTIsIDUyLAotICBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLSNlbHNlCi0gIGZsb2F0Zm9ybWF0X2JpZywgODAsIDAsIDEsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMTYsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi0jZW5kaWYgLyogSEFSUklTX0ZMT0FUX0ZPUk1BVCAqLwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9hcm1fZXh0ID0KLXsKLSAgLyogQml0cyAxIHRvIDE2IGFyZSB1bnVzZWQuICAqLwotICBmbG9hdGZvcm1hdF9iaWcsIDk2LCAwLCAxNywgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLX07Ci0MCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZmllbGQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLAotCQkJCQllbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMsCi0JCQkJCXVuc2lnbmVkIGludCwKLQkJCQkJdW5zaWduZWQgaW50LAotCQkJCQl1bnNpZ25lZCBpbnQpKTsKLQotLyogRXh0cmFjdCBhIGZpZWxkIHdoaWNoIHN0YXJ0cyBhdCBTVEFSVCBhbmQgaXMgTEVOIGJ5dGVzIGxvbmcuICBEQVRBIGFuZAotICAgVE9UQUxfTEVOIGFyZSB0aGUgdGhpbmcgd2UgYXJlIGV4dHJhY3RpbmcgaXQgZnJvbSwgaW4gYnl0ZW9yZGVyIE9SREVSLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1nZXRfZmllbGQgKGRhdGEsIG9yZGVyLCB0b3RhbF9sZW4sIHN0YXJ0LCBsZW4pCi0gICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBvcmRlcjsKLSAgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbjsKLSAgICAgdW5zaWduZWQgaW50IHN0YXJ0OwotICAgICB1bnNpZ25lZCBpbnQgbGVuOwotewotICB1bnNpZ25lZCBsb25nIHJlc3VsdDsKLSAgdW5zaWduZWQgaW50IGN1cl9ieXRlOwotICBpbnQgY3VyX2JpdHNoaWZ0OwotCi0gIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIGN1cl9ieXRlID0gKHN0YXJ0ICsgbGVuKSAvIEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgIGN1cl9ieXRlID0gKHRvdGFsX2xlbiAvIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIGN1cl9ieXRlIC0gMTsKLSAgY3VyX2JpdHNoaWZ0ID0KLSAgICAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIEZMT0FURk9STUFUX0NIQVJfQklUOwotICByZXN1bHQgPSAqKGRhdGEgKyBjdXJfYnl0ZSkgPj4gKC1jdXJfYml0c2hpZnQpOwotICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgKytjdXJfYnl0ZTsKLSAgZWxzZQotICAgIC0tY3VyX2J5dGU7Ci0KLSAgLyogTW92ZSB0b3dhcmRzIHRoZSBtb3N0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgd2hpbGUgKGN1cl9iaXRzaGlmdCA8IGxlbikKLSAgICB7Ci0gICAgICBpZiAobGVuIC0gY3VyX2JpdHNoaWZ0IDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpCi0JLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlOyB6ZXJvIG91dCB0aGUgYml0cyB3aGljaCBhcmUgbm90IHBhcnQgb2YKLQkgICB0aGlzIGZpZWxkLiAgKi8KLQlyZXN1bHQgfD0KLQkgICgqKGRhdGEgKyBjdXJfYnl0ZSkgJiAoKDEgPDwgKGxlbiAtIGN1cl9iaXRzaGlmdCkpIC0gMSkpCi0JICAgIDw8IGN1cl9iaXRzaGlmdDsKLSAgICAgIGVsc2UKLQlyZXN1bHQgfD0gKihkYXRhICsgY3VyX2J5dGUpIDw8IGN1cl9iaXRzaGlmdDsKLSAgICAgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgICAgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0JKytjdXJfYnl0ZTsKLSAgICAgIGVsc2UKLQktLWN1cl9ieXRlOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLSAgCi0jaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi0vKiBDb252ZXJ0IGZyb20gRk1UIHRvIGEgZG91YmxlLgotICAgRlJPTSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZXh0ZW5kZWQgZmxvYXQuCi0gICBTdG9yZSB0aGUgZG91YmxlIGluICpUTy4gICovCi0KLXZvaWQKLWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoZm10LCBmcm9tLCB0bykKLSAgICAgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICpmbXQ7Ci0gICAgIGNoYXIgKmZyb207Ci0gICAgIGRvdWJsZSAqdG87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnVmcm9tID0gKHVuc2lnbmVkIGNoYXIgKilmcm9tOwotICBkb3VibGUgZHRvOwotICBsb25nIGV4cG9uZW50OwotICB1bnNpZ25lZCBsb25nIG1hbnQ7Ci0gIHVuc2lnbmVkIGludCBtYW50X2JpdHMsIG1hbnRfb2ZmOwotICBpbnQgbWFudF9iaXRzX2xlZnQ7Ci0gIGludCBzcGVjaWFsX2V4cG9uZW50OwkJLyogSXQncyBhIE5hTiwgZGVub3JtIG9yIHplcm8gKi8KLQotICBleHBvbmVudCA9IGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKLQkJCWZtdC0+ZXhwX3N0YXJ0LCBmbXQtPmV4cF9sZW4pOwotICAvKiBOb3RlIHRoYXQgaWYgZXhwb25lbnQgaW5kaWNhdGVzIGEgTmFOLCB3ZSBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcgdXNlZnVsCi0gICAgIChub3Qga25vd2luZyBpZiB0aGUgaG9zdCBoYXMgTmFOJ3MsIG9yIGhvdyB0byBidWlsZCBvbmUpLiAgU28gaXQgd2lsbAotICAgICBlbmQgdXAgYXMgYW4gaW5maW5pdHkgb3Igc29tZXRoaW5nIGNsb3NlOyB0aGF0IGlzIE9LLiAgKi8KLQotICBtYW50X2JpdHNfbGVmdCA9IGZtdC0+bWFuX2xlbjsKLSAgbWFudF9vZmYgPSBmbXQtPm1hbl9zdGFydDsKLSAgZHRvID0gMC4wOwotCi0gIHNwZWNpYWxfZXhwb25lbnQgPSBleHBvbmVudCA9PSAwIHx8IGV4cG9uZW50ID09IGZtdC0+ZXhwX25hbjsKLQotICAvKiBEb24ndCBiaWFzIHplcm8ncywgZGVub3JtcyBvciBOYU5zLiAgKi8KLSAgaWYgKCFzcGVjaWFsX2V4cG9uZW50KQotICAgIGV4cG9uZW50IC09IGZtdC0+ZXhwX2JpYXM7Ci0KLSAgLyogQnVpbGQgdGhlIHJlc3VsdCBhbGdlYnJhaWNhbGx5LiAgTWlnaHQgZ28gaW5maW5pdGUsIHVuZGVyZmxvdywgZXRjOwotICAgICB3aG8gY2FyZXMuICovCi0KLSAgLyogSWYgdGhpcyBmb3JtYXQgdXNlcyBhIGhpZGRlbiBiaXQsIGV4cGxpY2l0bHkgYWRkIGl0IGluIG5vdy4gIE90aGVyd2lzZSwKLSAgICAgaW5jcmVtZW50IHRoZSBleHBvbmVudCBieSBvbmUgdG8gYWNjb3VudCBmb3IgdGhlIGludGVnZXIgYml0LiAgKi8KLQotICBpZiAoIXNwZWNpYWxfZXhwb25lbnQpCi0gICAgewotICAgICAgaWYgKGZtdC0+aW50Yml0ID09IGZsb2F0Zm9ybWF0X2ludGJpdF9ubykKLQlkdG8gPSBsZGV4cCAoMS4wLCBleHBvbmVudCk7Ci0gICAgICBlbHNlCi0JZXhwb25lbnQrKzsKLSAgICB9Ci0KLSAgd2hpbGUgKG1hbnRfYml0c19sZWZ0ID4gMCkKLSAgICB7Ci0gICAgICBtYW50X2JpdHMgPSBtaW4gKG1hbnRfYml0c19sZWZ0LCAzMik7Ci0KLSAgICAgIG1hbnQgPSBnZXRfZmllbGQgKHVmcm9tLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsCi0JCQkgbWFudF9vZmYsIG1hbnRfYml0cyk7Ci0KLSAgICAgIGR0byArPSBsZGV4cCAoKGRvdWJsZSltYW50LCBleHBvbmVudCAtIG1hbnRfYml0cyk7Ci0gICAgICBleHBvbmVudCAtPSBtYW50X2JpdHM7Ci0gICAgICBtYW50X29mZiArPSBtYW50X2JpdHM7Ci0gICAgICBtYW50X2JpdHNfbGVmdCAtPSBtYW50X2JpdHM7Ci0gICAgfQotCi0gIC8qIE5lZ2F0ZSBpdCBpZiBuZWdhdGl2ZS4gICovCi0gIGlmIChnZXRfZmllbGQgKHVmcm9tLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+c2lnbl9zdGFydCwgMSkpCi0gICAgZHRvID0gLWR0bzsKLSAgKnRvID0gZHRvOwotfQotDAotc3RhdGljIHZvaWQgcHV0X2ZpZWxkIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLQotLyogU2V0IGEgZmllbGQgd2hpY2ggc3RhcnRzIGF0IFNUQVJUIGFuZCBpcyBMRU4gYnl0ZXMgbG9uZy4gIERBVEEgYW5kCi0gICBUT1RBTF9MRU4gYXJlIHRoZSB0aGluZyB3ZSBhcmUgZXh0cmFjdGluZyBpdCBmcm9tLCBpbiBieXRlb3JkZXIgT1JERVIuICAqLwotc3RhdGljIHZvaWQKLXB1dF9maWVsZCAoZGF0YSwgb3JkZXIsIHRvdGFsX2xlbiwgc3RhcnQsIGxlbiwgc3R1ZmZfdG9fcHV0KQotICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMgb3JkZXI7Ci0gICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW47Ci0gICAgIHVuc2lnbmVkIGludCBzdGFydDsKLSAgICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICAgdW5zaWduZWQgbG9uZyBzdHVmZl90b19wdXQ7Ci17Ci0gIHVuc2lnbmVkIGludCBjdXJfYnl0ZTsKLSAgaW50IGN1cl9iaXRzaGlmdDsKLQotICAvKiBTdGFydCBhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLwotICBjdXJfYnl0ZSA9IChzdGFydCArIGxlbikgLyBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLSAgICBjdXJfYnl0ZSA9ICh0b3RhbF9sZW4gLyBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBjdXJfYnl0ZSAtIDE7Ci0gIGN1cl9iaXRzaGlmdCA9Ci0gICAgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgKihkYXRhICsgY3VyX2J5dGUpICY9Ci0gICAgfigoKDEgPDwgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkpIC0gMSkgPDwgKC1jdXJfYml0c2hpZnQpKTsKLSAgKihkYXRhICsgY3VyX2J5dGUpIHw9Ci0gICAgKHN0dWZmX3RvX3B1dCAmICgoMSA8PCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSAxKSkgPDwgKC1jdXJfYml0c2hpZnQpOwotICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgKytjdXJfYnl0ZTsKLSAgZWxzZQotICAgIC0tY3VyX2J5dGU7Ci0KLSAgLyogTW92ZSB0b3dhcmRzIHRoZSBtb3N0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgd2hpbGUgKGN1cl9iaXRzaGlmdCA8IGxlbikKLSAgICB7Ci0gICAgICBpZiAobGVuIC0gY3VyX2JpdHNoaWZ0IDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpCi0JewotCSAgLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlLiAgKi8KLQkgICooZGF0YSArIGN1cl9ieXRlKSAmPQotCSAgICB+KCgxIDw8IChsZW4gLSBjdXJfYml0c2hpZnQpKSAtIDEpOwotCSAgKihkYXRhICsgY3VyX2J5dGUpIHw9IChzdHVmZl90b19wdXQgPj4gY3VyX2JpdHNoaWZ0KTsKLQl9Ci0gICAgICBlbHNlCi0JKihkYXRhICsgY3VyX2J5dGUpID0gKChzdHVmZl90b19wdXQgPj4gY3VyX2JpdHNoaWZ0KQotCQkJICAgICAgJiAoKDEgPDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gMSkpOwotICAgICAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICAgICAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLQkrK2N1cl9ieXRlOwotICAgICAgZWxzZQotCS0tY3VyX2J5dGU7Ci0gICAgfQotfQotCi0vKiBUaGUgY29udmVyc2U6IGNvbnZlcnQgdGhlIGRvdWJsZSAqRlJPTSB0byBhbiBleHRlbmRlZCBmbG9hdAotICAgYW5kIHN0b3JlIHdoZXJlIFRPIHBvaW50cy4gIE5laXRoZXIgRlJPTSBub3IgVE8gaGF2ZSBhbnkgYWxpZ25tZW50Ci0gICByZXN0cmljdGlvbnMuICAqLwotCi12b2lkCi1mbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSAoZm10LCBmcm9tLCB0bykKLSAgICAgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICpmbXQ7Ci0gICAgIGRvdWJsZSAqZnJvbTsKLSAgICAgY2hhciAqdG87Ci17Ci0gIGRvdWJsZSBkZnJvbTsKLSAgaW50IGV4cG9uZW50OwotICBkb3VibGUgbWFudDsKLSAgdW5zaWduZWQgaW50IG1hbnRfYml0cywgbWFudF9vZmY7Ci0gIGludCBtYW50X2JpdHNfbGVmdDsKLSAgdW5zaWduZWQgY2hhciAqdXRvID0gKHVuc2lnbmVkIGNoYXIgKil0bzsKLQotICBtZW1jcHkgKCZkZnJvbSwgZnJvbSwgc2l6ZW9mIChkZnJvbSkpOwotICBtZW1zZXQgKHV0bywgMCwgZm10LT50b3RhbHNpemUgLyBGTE9BVEZPUk1BVF9DSEFSX0JJVCk7Ci0gIGlmIChkZnJvbSA9PSAwKQotICAgIHJldHVybjsJCQkvKiBSZXN1bHQgaXMgemVybyAqLwotICBpZiAoZGZyb20gIT0gZGZyb20pCi0gICAgewotICAgICAgLyogRnJvbSBpcyBOYU4gKi8KLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+ZXhwX3N0YXJ0LAotCQkgZm10LT5leHBfbGVuLCBmbXQtPmV4cF9uYW4pOwotICAgICAgLyogQmUgc3VyZSBpdCdzIG5vdCBpbmZpbml0eSwgYnV0IE5hTiB2YWx1ZSBpcyBpcnJlbCAqLwotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5tYW5fc3RhcnQsCi0JCSAzMiwgMSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIG5lZ2F0aXZlLCBzZXQgdGhlIHNpZ24gYml0LiAgKi8KLSAgaWYgKGRmcm9tIDwgMCkKLSAgICB7Ci0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPnNpZ25fc3RhcnQsIDEsIDEpOwotICAgICAgZGZyb20gPSAtZGZyb207Ci0gICAgfQotCi0gIC8qIEhvdyB0byB0ZWxsIGFuIGluZmluaXR5IGZyb20gYW4gb3JkaW5hcnkgbnVtYmVyPyAgRklYTUUtc29tZWRheSAqLwotCi0gIG1hbnQgPSBmcmV4cCAoZGZyb20sICZleHBvbmVudCk7Ci0gIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+ZXhwX3N0YXJ0LCBmbXQtPmV4cF9sZW4sCi0JICAgICBleHBvbmVudCArIGZtdC0+ZXhwX2JpYXMgLSAxKTsKLQotICBtYW50X2JpdHNfbGVmdCA9IGZtdC0+bWFuX2xlbjsKLSAgbWFudF9vZmYgPSBmbXQtPm1hbl9zdGFydDsKLSAgd2hpbGUgKG1hbnRfYml0c19sZWZ0ID4gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1hbnRfbG9uZzsKLSAgICAgIG1hbnRfYml0cyA9IG1hbnRfYml0c19sZWZ0IDwgMzIgPyBtYW50X2JpdHNfbGVmdCA6IDMyOwotCi0gICAgICBtYW50ICo9IDQyOTQ5NjcyOTYuMDsKLSAgICAgIG1hbnRfbG9uZyA9ICh1bnNpZ25lZCBsb25nKW1hbnQ7Ci0gICAgICBtYW50IC09IG1hbnRfbG9uZzsKLQotICAgICAgLyogSWYgdGhlIGludGVnZXIgYml0IGlzIGltcGxpY2l0LCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBpdC4KLQkgSWYgd2UgYXJlIGRpc2NhcmRpbmcgYSB6ZXJvLCB3ZSBzaG91bGQgYmUgKGJ1dCBhcmUgbm90KSBjcmVhdGluZwotCSBhIGRlbm9ybWFsaXplZAludW1iZXIgd2hpY2ggbWVhbnMgYWRqdXN0aW5nIHRoZSBleHBvbmVudAotCSAoSSB0aGluaykuICAqLwotICAgICAgaWYgKG1hbnRfYml0c19sZWZ0ID09IGZtdC0+bWFuX2xlbgotCSAgJiYgZm10LT5pbnRiaXQgPT0gZmxvYXRmb3JtYXRfaW50Yml0X25vKQotCXsKLQkgIG1hbnRfbG9uZyAmPSAweDdmZmZmZmZmOwotCSAgbWFudF9iaXRzIC09IDE7Ci0JfQotICAgICAgZWxzZSBpZiAobWFudF9iaXRzIDwgMzIpCi0JewotCSAgLyogVGhlIGJpdHMgd2Ugd2FudCBhcmUgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgTUFOVF9CSVRTIGJpdHMgb2YKLQkgICAgIG1hbnRfbG9uZy4gIE1vdmUgdGhlbSB0byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLwotCSAgbWFudF9sb25nID4+PSAzMiAtIG1hbnRfYml0czsKLQl9Ci0KLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsCi0JCSBtYW50X29mZiwgbWFudF9iaXRzLCBtYW50X2xvbmcpOwotICAgICAgbWFudF9vZmYgKz0gbWFudF9iaXRzOwotICAgICAgbWFudF9iaXRzX2xlZnQgLT0gbWFudF9iaXRzOwotICAgIH0KLX0KLQotCi0jaWZkZWYgSUVFRV9ERUJVRwotCi0vKiBUaGlzIGlzIHRvIGJlIHJ1biBvbiBhIGhvc3Qgd2hpY2ggdXNlcyBJRUVFIGZsb2F0aW5nIHBvaW50LiAgKi8KLQotdm9pZAotaWVlZV90ZXN0IChuKQotICAgICBkb3VibGUgbjsKLXsKLSAgZG91YmxlIHJlc3VsdDsKLSAgY2hhciBleHRlblsxNl07Ci0KLSAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnLCAmbiwgJnJlc3VsdCk7Ci0gIGlmIChuICE9IHJlc3VsdCkKLSAgICBwcmludGYgKCJEaWZmZXIodG8pOiAlLjIwZyAtPiAlLjIwZ1xuIiwgbiwgcmVzdWx0KTsKLSAgZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgKCZmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcsICZuLCAmcmVzdWx0KTsKLSAgaWYgKG4gIT0gcmVzdWx0KQotICAgIHByaW50ZiAoIkRpZmZlcihmcm9tKTogJS4yMGcgLT4gJS4yMGdcbiIsIG4sIHJlc3VsdCk7Ci0KLSAgZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgKCZmbG9hdGZvcm1hdF9tNjg4ODFfZXh0LCAmbiwgZXh0ZW4pOwotICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9tNjg4ODFfZXh0LCBleHRlbiwgJnJlc3VsdCk7Ci0gIGlmIChuICE9IHJlc3VsdCkKLSAgICBwcmludGYgKCJEaWZmZXIodG8rZnJvbSk6ICUuMjBnIC0+ICUuMjBnXG4iLCBuLCByZXN1bHQpOwotCi0jaWYgSUVFRV9ERUJVRyA+IDEKLSAgLyogVGhpcyBpcyB0byBiZSBydW4gb24gYSBob3N0IHdoaWNoIHVzZXMgNjg4ODEgZm9ybWF0LiAgKi8KLSAgewotICAgIGxvbmcgZG91YmxlIGV4ID0gKihsb25nIGRvdWJsZSAqKWV4dGVuOwotICAgIGlmIChleCAhPSBuKQotICAgICAgcHJpbnRmICgiRGlmZmVyKGZyb20gdnMuIGV4dGVuZGVkKTogJS4yMGdcbiIsIG4pOwotICB9Ci0jZW5kaWYKLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIGllZWVfdGVzdCAoMC41KTsKLSAgaWVlZV90ZXN0ICgyNTYuMCk7Ci0gIGllZWVfdGVzdCAoMC4xMjM0NSk7Ci0gIGllZWVfdGVzdCAoMjM0MjM1Ljc4OTA3MjM0KTsKLSAgaWVlZV90ZXN0ICgtNTEyLjApOwotICBpZWVlX3Rlc3QgKC0wLjAwNDMyMSk7Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZm5tYXRjaC5jIGIvbGliaWJlcnR5L2ZubWF0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5YmZlNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZm5tYXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLUJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BwcmVwLmFpLm1pdC5lZHUuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2lmIGRlZmluZWQgKENPTkZJR19CUk9LRVRTKQotLyogV2UgdXNlIDxjb25maWcuaD4gaW5zdGVhZCBvZiAiY29uZmlnLmgiIHNvIHRoYXQgYSBjb21waWxhdGlvbgotICAgdXNpbmcgLUkuIC1JJHNyY2RpciB3aWxsIHVzZSAuL2NvbmZpZy5oIHJhdGhlciB0aGFuICRzcmNkaXIvY29uZmlnLmgKLSAgICh3aGljaCBpdCB3b3VsZCBkbyBiZWNhdXNlIGl0IGZvdW5kIHRoaXMgZmlsZSBpbiAkc3JjZGlyKS4gICovCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZWxzZQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWZuZGVmIF9HTlVfU09VUkNFCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYKLQotLyogVGhpcyBjb2RlIHRvIHVuZGVmIGNvbnN0IGFkZGVkIGluIGxpYmliZXJ0eS4gICovCi0jaWZuZGVmIF9fU1REQ19fCi0vKiBUaGlzIGlzIGEgc2VwYXJhdGUgY29uZGl0aW9uYWwgc2luY2Ugc29tZSBzdGRjIHN5c3RlbXMKLSAgIHJlamVjdCBgZGVmaW5lZCAoY29uc3QpJy4gICovCi0jaWZuZGVmIGNvbnN0Ci0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmbm1hdGNoLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotCi0vKiBDb21tZW50IG91dCBhbGwgdGhpcyBjb2RlIGlmIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSwgYW5kIGFyZSBub3QKLSAgIGFjdHVhbGx5IGNvbXBpbGluZyB0aGUgbGlicmFyeSBpdHNlbGYuICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VIEMKLSAgIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0IGZpbGVzLAotICAgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jaWYgZGVmaW5lZCAoX0xJQkMpIHx8ICFkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pCi0KLQotI2lmICFkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgJiYgIWRlZmluZWQoU1REQ19IRUFERVJTKQotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotCi0vKiBNYXRjaCBTVFJJTkcgYWdhaW5zdCB0aGUgZmlsZW5hbWUgcGF0dGVybiBQQVRURVJOLCByZXR1cm5pbmcgemVybyBpZgotICAgaXQgbWF0Y2hlcywgbm9uemVybyBpZiBub3QuICAqLwotaW50Ci1mbm1hdGNoIChwYXR0ZXJuLCBzdHJpbmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwYXR0ZXJuOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IHBhdHRlcm4sICpuID0gc3RyaW5nOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGM7Ci0KLS8qIE5vdGUgdGhhdCB0aGlzIGV2YWx1dGVzIEMgbWFueSB0aW1lcy4gICovCi0jZGVmaW5lIEZPTEQoYykJKChmbGFncyAmIEZOTV9DQVNFRk9MRCkgJiYgaXN1cHBlciAoYykgPyB0b2xvd2VyIChjKSA6IChjKSkKLQotICB3aGlsZSAoKGMgPSAqcCsrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGMgPSBGT0xEIChjKTsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICc/JzoKLQkgIGlmICgqbiA9PSAnXDAnKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICBlbHNlIGlmICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiAqbiA9PSAnLycpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkgIGVsc2UgaWYgKChmbGFncyAmIEZOTV9QRVJJT0QpICYmICpuID09ICcuJyAmJgotCQkgICAobiA9PSBzdHJpbmcgfHwgKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmIG5bLTFdID09ICcvJykpKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICBicmVhazsKLQotCWNhc2UgJ1xcJzoKLQkgIGlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSkKLQkgICAgewotCSAgICAgIGMgPSAqcCsrOwotCSAgICAgIGMgPSBGT0xEIChjKTsKLQkgICAgfQotCSAgaWYgKEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSAhPSBjKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICBicmVhazsKLQotCWNhc2UgJyonOgotCSAgaWYgKChmbGFncyAmIEZOTV9QRVJJT0QpICYmICpuID09ICcuJyAmJgotCSAgICAgIChuID09IHN0cmluZyB8fCAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgblstMV0gPT0gJy8nKSkpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCSAgZm9yIChjID0gKnArKzsgYyA9PSAnPycgfHwgYyA9PSAnKic7IGMgPSAqcCsrLCArK24pCi0JICAgIGlmICgoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgKm4gPT0gJy8nKSB8fAotCQkoYyA9PSAnPycgJiYgKm4gPT0gJ1wwJykpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JICBpZiAoYyA9PSAnXDAnKQotCSAgICByZXR1cm4gMDsKLQotCSAgewotCSAgICB1bnNpZ25lZCBjaGFyIGMxID0gKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpICYmIGMgPT0gJ1xcJykgPyAqcCA6IGM7Ci0JICAgIGMxID0gRk9MRCAoYzEpOwotCSAgICBmb3IgKC0tcDsgKm4gIT0gJ1wwJzsgKytuKQotCSAgICAgIGlmICgoYyA9PSAnWycgfHwgRk9MRCAoKHVuc2lnbmVkIGNoYXIpKm4pID09IGMxKSAmJgotCQkgIGZubWF0Y2ggKHAsIG4sIGZsYWdzICYgfkZOTV9QRVJJT0QpID09IDApCi0JCXJldHVybiAwOwotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICB9Ci0KLQljYXNlICdbJzoKLQkgIHsKLQkgICAgLyogTm9uemVybyBpZiB0aGUgc2Vuc2Ugb2YgdGhlIGNoYXJhY3RlciBjbGFzcyBpcyBpbnZlcnRlZC4gICovCi0JICAgIHJlZ2lzdGVyIGludCBub3Q7Ci0KLQkgICAgaWYgKCpuID09ICdcMCcpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JICAgIGlmICgoZmxhZ3MgJiBGTk1fUEVSSU9EKSAmJiAqbiA9PSAnLicgJiYKLQkJKG4gPT0gc3RyaW5nIHx8ICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiBuWy0xXSA9PSAnLycpKSkKLQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkgICAgbm90ID0gKCpwID09ICchJyB8fCAqcCA9PSAnXicpOwotCSAgICBpZiAobm90KQotCSAgICAgICsrcDsKLQotCSAgICBjID0gKnArKzsKLQkgICAgZm9yICg7OykKLQkgICAgICB7Ci0JCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY3N0YXJ0ID0gYywgY2VuZCA9IGM7Ci0KLQkJaWYgKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpICYmIGMgPT0gJ1xcJykKLQkJICBjc3RhcnQgPSBjZW5kID0gKnArKzsKLQotCQljc3RhcnQgPSBjZW5kID0gRk9MRCAoY3N0YXJ0KTsKLQotCQlpZiAoYyA9PSAnXDAnKQotCQkgIC8qIFsgKHVudGVybWluYXRlZCkgbG9zZXMuICAqLwotCQkgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCQljID0gKnArKzsKLQkJYyA9IEZPTEQgKGMpOwotCi0JCWlmICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiBjID09ICcvJykKLQkJICAvKiBbL10gY2FuIG5ldmVyIG1hdGNoLiAgKi8KLQkJICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkJaWYgKGMgPT0gJy0nICYmICpwICE9ICddJykKLQkJICB7Ci0JCSAgICBjZW5kID0gKnArKzsKLQkJICAgIGlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjZW5kID09ICdcXCcpCi0JCSAgICAgIGNlbmQgPSAqcCsrOwotCQkgICAgaWYgKGNlbmQgPT0gJ1wwJykKLQkJICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCQkgICAgY2VuZCA9IEZPTEQgKGNlbmQpOwotCi0JCSAgICBjID0gKnArKzsKLQkJICB9Ci0KLQkJaWYgKEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSA+PSBjc3RhcnQKLQkJICAgICYmIEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSA8PSBjZW5kKQotCQkgIGdvdG8gbWF0Y2hlZDsKLQotCQlpZiAoYyA9PSAnXScpCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoIW5vdCkKLQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICAgIGJyZWFrOwotCi0JICBtYXRjaGVkOjsKLQkgICAgLyogU2tpcCB0aGUgcmVzdCBvZiB0aGUgWy4uLl0gdGhhdCBhbHJlYWR5IG1hdGNoZWQuICAqLwotCSAgICB3aGlsZSAoYyAhPSAnXScpCi0JICAgICAgewotCQlpZiAoYyA9PSAnXDAnKQotCQkgIC8qIFsuLi4gKHVudGVybWluYXRlZCkgbG9zZXMuICAqLwotCQkgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCQljID0gKnArKzsKLQkJaWYgKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpICYmIGMgPT0gJ1xcJykKLQkJICAvKiBYWFggMTAwMy4yZDExIGlzIHVuY2xlYXIgaWYgdGhpcyBpcyByaWdodC4gICovCi0JCSAgKytwOwotCSAgICAgIH0KLQkgICAgaWYgKG5vdCkKLQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBpZiAoYyAhPSBGT0xEICgodW5zaWduZWQgY2hhcikqbikpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQl9Ci0KLSAgICAgICsrbjsKLSAgICB9Ci0KLSAgaWYgKCpuID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKChmbGFncyAmIEZOTV9MRUFESU5HX0RJUikgJiYgKm4gPT0gJy8nKQotICAgIC8qIFRoZSBGTk1fTEVBRElOR19ESVIgZmxhZyBzYXlzIHRoYXQgImZvbyoiIG1hdGNoZXMgImZvb2Jhci9mcm9ib3p6Ii4gICovCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIEZOTV9OT01BVENIOwotfQotCi0jZW5kaWYJLyogX0xJQkMgb3Igbm90IF9fR05VX0xJQlJBUllfXy4gICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZ2V0Y3dkLmMgYi9saWJpYmVydHkvZ2V0Y3dkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDU1YzAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldGN3ZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogRW11bGF0ZSBnZXRjd2QgdXNpbmcgZ2V0d2QuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi0vKgotTkFNRQotCWdldGN3ZCAtLSBnZXQgYWJzb2x1dGUgcGF0aG5hbWUgZm9yIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKLQotU1lOT1BTSVMKLQljaGFyICpnZXRjd2QgKGNoYXIgcGF0aG5hbWVbbGVuXSwgbGVuKQotCi1ERVNDUklQVElPTgotCUNvcHkgdGhlIGFic29sdXRlIHBhdGhuYW1lIGZvciB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpbnRvCi0JdGhlIHN1cHBsaWVkIGJ1ZmZlciBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLiAgSWYgdGhlIAotCWN1cnJlbnQgZGlyZWN0b3J5J3MgcGF0aCBkb2Vzbid0IGZpdCBpbiBMRU4gY2hhcmFjdGVycywgdGhlIHJlc3VsdAotCWlzIE5VTEwgYW5kIGVycm5vIGlzIHNldC4KLQotQlVHUwotCUVtdWxhdGVkIHZpYSB0aGUgZ2V0d2QoKSBjYWxsLCB3aGljaCBpcyByZWFzb25hYmxlIGZvciBtb3N0Ci0Jc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGdldGN3ZCgpLgotCi0qLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxlcnJuby5oPgotCi1leHRlcm4gY2hhciAqZ2V0d2QgKCk7Ci1leHRlcm4gaW50IGVycm5vOwotCi0jaWZuZGVmIE1BWFBBVEhMRU4KLSNkZWZpbmUgTUFYUEFUSExFTiAxMDI0Ci0jZW5kaWYKLQotY2hhciAqCi1nZXRjd2QgKGJ1ZiwgbGVuKQotICBjaGFyICpidWY7Ci0gIGludCBsZW47Ci17Ci0gIGNoYXIgb3VyYnVmW01BWFBBVEhMRU5dOwotICBjaGFyICpyZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gZ2V0d2QgKG91cmJ1Zik7Ci0gIGlmIChyZXN1bHQpIHsKLSAgICBpZiAoc3RybGVuIChvdXJidWYpID49IGxlbikgewotICAgICAgZXJybm8gPSBFUkFOR0U7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc3RyY3B5IChidWYsIG91cmJ1Zik7Ci0gIH0KLSAgcmV0dXJuIGJ1ZjsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRvcHQuYyBiL2xpYmliZXJ0eS9nZXRvcHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNTMxZS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZ2V0b3B0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU2ICswLDAgQEAKLS8qIEdldG9wdCBmb3IgR05VLgotICAgTk9URTogZ2V0b3B0IGlzIG5vdyBwYXJ0IG9mIHRoZSBDIGxpYnJhcnksIHNvIGlmIHlvdSBkb24ndCBrbm93IHdoYXQKLSAgICJLZWVwIHRoaXMgZmlsZSBuYW1lLXNwYWNlIGNsZWFuIiBtZWFucywgdGFsayB0byBkcmVwcGVyQGdudS5vcmcKLSAgIGJlZm9yZSBjaGFuZ2luZyBpdCEKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgKLSAgIAlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLSAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQwKLS8qIFRoaXMgdGVsbHMgQWxwaGEgT1NGLzEgbm90IHRvIGRlZmluZSBhIGdldG9wdCBwcm90b3R5cGUgaW4gPHN0ZGlvLmg+LgotICAgRGl0dG8gZm9yIEFJWCAzLjIgYW5kIDxzdGRsaWIuaD4uICAqLwotI2lmbmRlZiBfTk9fUFJPVE8KLSMgZGVmaW5lIF9OT19QUk9UTwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCBfX1NURENfXyB8fCAhX19TVERDX18KLS8qIFRoaXMgaXMgYSBzZXBhcmF0ZSBjb25kaXRpb25hbCBzaW5jZSBzb21lIHN0ZGMgc3lzdGVtcwotICAgcmVqZWN0IGBkZWZpbmVkIChjb25zdCknLiAgKi8KLSMgaWZuZGVmIGNvbnN0Ci0jICBkZWZpbmUgY29uc3QKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90Ci0gICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLiAgVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIEdOVSBDCi0gICBMaWJyYXJ5LCBidXQgYWxzbyBpbmNsdWRlZCBpbiBtYW55IG90aGVyIEdOVSBkaXN0cmlidXRpb25zLiAgQ29tcGlsaW5nCi0gICBhbmQgbGlua2luZyBpbiB0aGlzIGNvZGUgaXMgYSB3YXN0ZSB3aGVuIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5Ci0gICAoZXNwZWNpYWxseSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5KS4gIFJhdGhlciB0aGFuIGhhdmluZyBldmVyeSBHTlUKLSAgIHByb2dyYW0gdW5kZXJzdGFuZCBgY29uZmlndXJlIC0td2l0aC1nbnUtbGliYycgYW5kIG9taXQgdGhlIG9iamVjdCBmaWxlcywKLSAgIGl0IGlzIHNpbXBsZXIgdG8ganVzdCBkbyB0aGlzIGluIHRoZSBzb3VyY2UgZm9yIGVhY2ggc3VjaCBmaWxlLiAgKi8KLQotI2RlZmluZSBHRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04gMgotI2lmICFkZWZpbmVkIF9MSUJDICYmIGRlZmluZWQgX19HTElCQ19fICYmIF9fR0xJQkNfXyA+PSAyCi0jIGluY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgotIyBpZiBfR05VX0dFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiA9PSBHRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04KLSMgIGRlZmluZSBFTElERV9DT0RFCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBFTElERV9DT0RFCi0KLQotLyogVGhpcyBuZWVkcyB0byBjb21lIGFmdGVyIHNvbWUgbGlicmFyeSAjaW5jbHVkZQotICAgdG8gZ2V0IF9fR05VX0xJQlJBUllfXyBkZWZpbmVkLiAgKi8KLSNpZmRlZglfX0dOVV9MSUJSQVJZX18KLS8qIERvbid0IGluY2x1ZGUgc3RkbGliLmggZm9yIG5vbi1HTlUgQyBsaWJyYXJpZXMgYmVjYXVzZSBzb21lIG9mIHRoZW0KLSAgIGNvbnRhaW4gY29uZmxpY3RpbmcgcHJvdG90eXBlcyBmb3IgZ2V0b3B0LiAgKi8KLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCS8qIEdOVSBDIGxpYnJhcnkuICAqLwotCi0jaWZkZWYgVk1TCi0jIGluY2x1ZGUgPHVuaXhsaWIuaD4KLSMgaWYgSEFWRV9TVFJJTkdfSCAtIDAKLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgXwotLyogVGhpcyBpcyBmb3Igb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMgd2l0aCBpbnRlcm5hdGlvbmFsaXplZCBtZXNzYWdlcy4KLSAgIFdoZW4gY29tcGlsaW5nIGxpYmMsIHRoZSBfIG1hY3JvIGlzIHByZWRlZmluZWQuICAqLwotIyBpZmRlZiBIQVZFX0xJQklOVExfSAotIyAgaW5jbHVkZSA8bGliaW50bC5oPgotIyAgZGVmaW5lIF8obXNnaWQpCWdldHRleHQgKG1zZ2lkKQotIyBlbHNlCi0jICBkZWZpbmUgXyhtc2dpZCkJKG1zZ2lkKQotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFRoaXMgdmVyc2lvbiBvZiBgZ2V0b3B0JyBhcHBlYXJzIHRvIHRoZSBjYWxsZXIgbGlrZSBzdGFuZGFyZCBVbml4IGBnZXRvcHQnCi0gICBidXQgaXQgYmVoYXZlcyBkaWZmZXJlbnRseSBmb3IgdGhlIHVzZXIsIHNpbmNlIGl0IGFsbG93cyB0aGUgdXNlcgotICAgdG8gaW50ZXJzcGVyc2UgdGhlIG9wdGlvbnMgd2l0aCB0aGUgb3RoZXIgYXJndW1lbnRzLgotCi0gICBBcyBgZ2V0b3B0JyB3b3JrcywgaXQgcGVybXV0ZXMgdGhlIGVsZW1lbnRzIG9mIEFSR1Ygc28gdGhhdCwKLSAgIHdoZW4gaXQgaXMgZG9uZSwgYWxsIHRoZSBvcHRpb25zIHByZWNlZGUgZXZlcnl0aGluZyBlbHNlLiAgVGh1cwotICAgYWxsIGFwcGxpY2F0aW9uIHByb2dyYW1zIGFyZSBleHRlbmRlZCB0byBoYW5kbGUgZmxleGlibGUgYXJndW1lbnQgb3JkZXIuCi0KLSAgIFNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCBkaXNhYmxlcyBwZXJtdXRhdGlvbi4KLSAgIFRoZW4gdGhlIGJlaGF2aW9yIGlzIGNvbXBsZXRlbHkgc3RhbmRhcmQuCi0KLSAgIEdOVSBhcHBsaWNhdGlvbiBwcm9ncmFtcyBjYW4gdXNlIGEgdGhpcmQgYWx0ZXJuYXRpdmUgbW9kZSBpbiB3aGljaAotICAgdGhleSBjYW4gZGlzdGluZ3Vpc2ggdGhlIHJlbGF0aXZlIG9yZGVyIG9mIG9wdGlvbnMgYW5kIG90aGVyIGFyZ3VtZW50cy4gICovCi0KLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotLyogRm9yIGNvbW11bmljYXRpb24gZnJvbSBgZ2V0b3B0JyB0byB0aGUgY2FsbGVyLgotICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudCwKLSAgIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBoZXJlLgotICAgQWxzbywgd2hlbiBgb3JkZXJpbmcnIGlzIFJFVFVSTl9JTl9PUkRFUiwKLSAgIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4gICovCi0KLWNoYXIgKm9wdGFyZyA9IE5VTEw7Ci0KLS8qIEluZGV4IGluIEFSR1Ygb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSBzY2FubmVkLgotICAgVGhpcyBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHRvIGFuZCBmcm9tIHRoZSBjYWxsZXIKLSAgIGFuZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYGdldG9wdCcuCi0KLSAgIE9uIGVudHJ5IHRvIGBnZXRvcHQnLCB6ZXJvIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGw7IGluaXRpYWxpemUuCi0KLSAgIFdoZW4gYGdldG9wdCcgcmV0dXJucyAtMSwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZQotICAgbm9uLW9wdGlvbiBlbGVtZW50cyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGl0c2VsZiBzY2FuLgotCi0gICBPdGhlcndpc2UsIGBvcHRpbmQnIGNvbW11bmljYXRlcyBmcm9tIG9uZSBjYWxsIHRvIHRoZSBuZXh0Ci0gICBob3cgbXVjaCBvZiBBUkdWIGhhcyBiZWVuIHNjYW5uZWQgc28gZmFyLiAgKi8KLQotLyogMTAwMy4yIHNheXMgdGhpcyBtdXN0IGJlIDEgYmVmb3JlIGFueSBjYWxsLiAgKi8KLWludCBvcHRpbmQgPSAxOwotCi0vKiBGb3JtZXJseSwgaW5pdGlhbGl6YXRpb24gb2YgZ2V0b3B0IGRlcGVuZGVkIG9uIG9wdGluZD09MCwgd2hpY2gKLSAgIGNhdXNlcyBwcm9ibGVtcyB3aXRoIHJlLWNhbGxpbmcgZ2V0b3B0IGFzIHByb2dyYW1zIGdlbmVyYWxseSBkb24ndAotICAga25vdyB0aGF0LiAqLwotCi1pbnQgX19nZXRvcHRfaW5pdGlhbGl6ZWQgPSAwOwotCi0vKiBUaGUgbmV4dCBjaGFyIHRvIGJlIHNjYW5uZWQgaW4gdGhlIG9wdGlvbi1lbGVtZW50Ci0gICBpbiB3aGljaCB0aGUgbGFzdCBvcHRpb24gY2hhcmFjdGVyIHdlIHJldHVybmVkIHdhcyBmb3VuZC4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHBpY2sgdXAgdGhlIHNjYW4gd2hlcmUgd2UgbGVmdCBvZmYuCi0KLSAgIElmIHRoaXMgaXMgemVybywgb3IgYSBudWxsIHN0cmluZywgaXQgbWVhbnMgcmVzdW1lIHRoZSBzY2FuCi0gICBieSBhZHZhbmNpbmcgdG8gdGhlIG5leHQgQVJHVi1lbGVtZW50LiAgKi8KLQotc3RhdGljIGNoYXIgKm5leHRjaGFyOwotCi0vKiBDYWxsZXJzIHN0b3JlIHplcm8gaGVyZSB0byBpbmhpYml0IHRoZSBlcnJvciBtZXNzYWdlCi0gICBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMuICAqLwotCi1pbnQgb3B0ZXJyID0gMTsKLQotLyogU2V0IHRvIGFuIG9wdGlvbiBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVucmVjb2duaXplZC4KLSAgIFRoaXMgbXVzdCBiZSBpbml0aWFsaXplZCBvbiBzb21lIHN5c3RlbXMgdG8gYXZvaWQgbGlua2luZyBpbiB0aGUKLSAgIHN5c3RlbSdzIG93biBnZXRvcHQgaW1wbGVtZW50YXRpb24uICAqLwotCi1pbnQgb3B0b3B0ID0gJz8nOwotCi0vKiBEZXNjcmliZSBob3cgdG8gZGVhbCB3aXRoIG9wdGlvbnMgdGhhdCBmb2xsb3cgbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzLgotCi0gICBJZiB0aGUgY2FsbGVyIGRpZCBub3Qgc3BlY2lmeSBhbnl0aGluZywKLSAgIHRoZSBkZWZhdWx0IGlzIFJFUVVJUkVfT1JERVIgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICBQT1NJWExZX0NPUlJFQ1QgaXMgZGVmaW5lZCwgUEVSTVVURSBvdGhlcndpc2UuCi0KLSAgIFJFUVVJUkVfT1JERVIgbWVhbnMgZG9uJ3QgcmVjb2duaXplIHRoZW0gYXMgb3B0aW9uczsKLSAgIHN0b3Agb3B0aW9uIHByb2Nlc3Npbmcgd2hlbiB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBpcyBzZWVuLgotICAgVGhpcyBpcyB3aGF0IFVuaXggZG9lcy4KLSAgIFRoaXMgbW9kZSBvZiBvcGVyYXRpb24gaXMgc2VsZWN0ZWQgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50Ci0gICB2YXJpYWJsZSBQT1NJWExZX0NPUlJFQ1QsIG9yIHVzaW5nIGArJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICBvZiB0aGUgbGlzdCBvZiBvcHRpb24gY2hhcmFjdGVycy4KLQotICAgUEVSTVVURSBpcyB0aGUgZGVmYXVsdC4gIFdlIHBlcm11dGUgdGhlIGNvbnRlbnRzIG9mIEFSR1YgYXMgd2Ugc2NhbiwKLSAgIHNvIHRoYXQgZXZlbnR1YWxseSBhbGwgdGhlIG5vbi1vcHRpb25zIGFyZSBhdCB0aGUgZW5kLiAgVGhpcyBhbGxvd3Mgb3B0aW9ucwotICAgdG8gYmUgZ2l2ZW4gaW4gYW55IG9yZGVyLCBldmVuIHdpdGggcHJvZ3JhbXMgdGhhdCB3ZXJlIG5vdCB3cml0dGVuIHRvCi0gICBleHBlY3QgdGhpcy4KLQotICAgUkVUVVJOX0lOX09SREVSIGlzIGFuIG9wdGlvbiBhdmFpbGFibGUgdG8gcHJvZ3JhbXMgdGhhdCB3ZXJlIHdyaXR0ZW4KLSAgIHRvIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0Ci0gICB0aGUgb3JkZXJpbmcgb2YgdGhlIHR3by4gIFdlIGRlc2NyaWJlIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQKLSAgIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbiB3aXRoIGNoYXJhY3RlciBjb2RlIDEuCi0gICBVc2luZyBgLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGlzdCBvZiBvcHRpb24gY2hhcmFjdGVycwotICAgc2VsZWN0cyB0aGlzIG1vZGUgb2Ygb3BlcmF0aW9uLgotCi0gICBUaGUgc3BlY2lhbCBhcmd1bWVudCBgLS0nIGZvcmNlcyBhbiBlbmQgb2Ygb3B0aW9uLXNjYW5uaW5nIHJlZ2FyZGxlc3MKLSAgIG9mIHRoZSB2YWx1ZSBvZiBgb3JkZXJpbmcnLiAgSW4gdGhlIGNhc2Ugb2YgUkVUVVJOX0lOX09SREVSLCBvbmx5Ci0gICBgLS0nIGNhbiBjYXVzZSBgZ2V0b3B0JyB0byByZXR1cm4gLTEgd2l0aCBgb3B0aW5kJyAhPSBBUkdDLiAgKi8KLQotc3RhdGljIGVudW0KLXsKLSAgUkVRVUlSRV9PUkRFUiwgUEVSTVVURSwgUkVUVVJOX0lOX09SREVSCi19IG9yZGVyaW5nOwotCi0vKiBWYWx1ZSBvZiBQT1NJWExZX0NPUlJFQ1QgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLwotc3RhdGljIGNoYXIgKnBvc2l4bHlfY29ycmVjdDsKLQwKLSNpZmRlZglfX0dOVV9MSUJSQVJZX18KLS8qIFdlIHdhbnQgdG8gYXZvaWQgaW5jbHVzaW9uIG9mIHN0cmluZy5oIHdpdGggbm9uLUdOVSBsaWJyYXJpZXMKLSAgIGJlY2F1c2UgdGhlcmUgYXJlIG1hbnkgd2F5cyBpdCBjYW4gY2F1c2UgdHJvdWJsZS4KLSAgIE9uIHNvbWUgc3lzdGVtcywgaXQgY29udGFpbnMgc3BlY2lhbCBtYWdpYyBtYWNyb3MgdGhhdCBkb24ndCB3b3JrCi0gICBpbiBHQ0MuICAqLwotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgZGVmaW5lIG15X2luZGV4CXN0cmNocgotI2Vsc2UKLQotIyBpZiBIQVZFX1NUUklOR19ICi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgZWxzZQotIyAgaWYgSEFWRV9TVFJJTkdTX0gKLSMgICBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jICBlbmRpZgotIyBlbmRpZgotCi0vKiBBdm9pZCBkZXBlbmRpbmcgb24gbGlicmFyeSBmdW5jdGlvbnMgb3IgZmlsZXMKLSAgIHdob3NlIG5hbWVzIGFyZSBpbmNvbnNpc3RlbnQuICAqLwotCi0jaWZuZGVmIGdldGVudgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqCi1teV9pbmRleCAoc3RyLCBjaHIpCi0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgaW50IGNocjsKLXsKLSAgd2hpbGUgKCpzdHIpCi0gICAgewotICAgICAgaWYgKCpzdHIgPT0gY2hyKQotCXJldHVybiAoY2hhciAqKSBzdHI7Ci0gICAgICBzdHIrKzsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBJZiB1c2luZyBHQ0MsIHdlIGNhbiBzYWZlbHkgZGVjbGFyZSBzdHJsZW4gdGhpcyB3YXkuCi0gICBJZiBub3QgdXNpbmcgR0NDLCBpdCBpcyBvayBub3QgdG8gZGVjbGFyZSBpdC4gICovCi0jaWZkZWYgX19HTlVDX18KLS8qIE5vdGUgdGhhdCBNb3Rvcm9sYSBEZWx0YSA2OGsgUjNWNyBjb21lcyB3aXRoIEdDQyBidXQgbm90IHN0ZGRlZi5oLgotICAgVGhhdCB3YXMgcmVsZXZhbnQgdG8gY29kZSB0aGF0IHdhcyBoZXJlIGJlZm9yZS4gICovCi0jIGlmICghZGVmaW5lZCBfX1NURENfXyB8fCAhX19TVERDX18pICYmICFkZWZpbmVkIHN0cmxlbgotLyogZ2NjIHdpdGggLXRyYWRpdGlvbmFsIGRlY2xhcmVzIHRoZSBidWlsdC1pbiBzdHJsZW4gdG8gcmV0dXJuIGludCwKLSAgIGFuZCBoYXMgZG9uZSBzbyBhdCBsZWFzdCBzaW5jZSB2ZXJzaW9uIDIuNC41LiAtLSBybXMuICAqLwotZXh0ZXJuIGludCBzdHJsZW4gKGNvbnN0IGNoYXIgKik7Ci0jIGVuZGlmIC8qIG5vdCBfX1NURENfXyAqLwotI2VuZGlmIC8qIF9fR05VQ19fICovCi0KLSNlbmRpZiAvKiBub3QgX19HTlVfTElCUkFSWV9fICovCi0MCi0vKiBIYW5kbGUgcGVybXV0YXRpb24gb2YgYXJndW1lbnRzLiAgKi8KLQotLyogRGVzY3JpYmUgdGhlIHBhcnQgb2YgQVJHViB0aGF0IGNvbnRhaW5zIG5vbi1vcHRpb25zIHRoYXQgaGF2ZQotICAgYmVlbiBza2lwcGVkLiAgYGZpcnN0X25vbm9wdCcgaXMgdGhlIGluZGV4IGluIEFSR1Ygb2YgdGhlIGZpcnN0IG9mIHRoZW07Ci0gICBgbGFzdF9ub25vcHQnIGlzIHRoZSBpbmRleCBhZnRlciB0aGUgbGFzdCBvZiB0aGVtLiAgKi8KLQotc3RhdGljIGludCBmaXJzdF9ub25vcHQ7Ci1zdGF0aWMgaW50IGxhc3Rfbm9ub3B0OwotCi0jaWZkZWYgX0xJQkMKLS8qIEJhc2ggMi4wIGdpdmVzIHVzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcgZmxhZ3MKLSAgIGluZGljYXRpbmcgQVJHViBlbGVtZW50cyB0aGF0IHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhcmd1bWVudHMuICAqLwotCi0vKiBEZWZpbmVkIGluIGdldG9wdF9pbml0LmMgICovCi1leHRlcm4gY2hhciAqX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzOwotCi1zdGF0aWMgaW50IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuOwotc3RhdGljIGludCBub25vcHRpb25fZmxhZ3NfbGVuOwotCi1zdGF0aWMgaW50IG9yaWdpbmFsX2FyZ2M7Ci1zdGF0aWMgY2hhciAqY29uc3QgKm9yaWdpbmFsX2FyZ3Y7Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYmFzaCAyLjAgcHV0cyBpbiB0aGUgZW52aXJvbm1lbnQKLSAgIGlzIHZhbGlkIGZvciB0aGUgZ2V0b3B0IGNhbGwgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgQVJHViBwYXNzZWQKLSAgIHRvIGdldG9wdCBpcyB0aGF0IG9uZSBwYXNzZWQgdG8gdGhlIHByb2Nlc3MuICAqLwotc3RhdGljIHZvaWQKLV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQotc3RvcmVfYXJnc19hbmRfZW52IChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCi17Ci0gIC8qIFhYWCBUaGlzIGlzIG5vIGdvb2Qgc29sdXRpb24uICBXZSBzaG91bGQgcmF0aGVyIGNvcHkgdGhlIGFyZ3Mgc28KLSAgICAgdGhhdCB3ZSBjYW4gY29tcGFyZSB0aGVtIGxhdGVyLiAgQnV0IHdlIG11c3Qgbm90IHVzZSBtYWxsb2MoMykuICAqLwotICBvcmlnaW5hbF9hcmdjID0gYXJnYzsKLSAgb3JpZ2luYWxfYXJndiA9IGFyZ3Y7Ci19Ci0jIGlmZGVmIHRleHRfc2V0X2VsZW1lbnQKLXRleHRfc2V0X2VsZW1lbnQgKF9fbGliY19zdWJpbml0LCBzdG9yZV9hcmdzX2FuZF9lbnYpOwotIyBlbmRpZiAvKiB0ZXh0X3NldF9lbGVtZW50ICovCi0KLSMgZGVmaW5lIFNXQVBfRkxBR1MoY2gxLCBjaDIpIFwKLSAgaWYgKG5vbm9wdGlvbl9mbGFnc19sZW4gPiAwKQkJCQkJCSAgICAgIFwKLSAgICB7CQkJCQkJCQkJICAgICAgXAotICAgICAgY2hhciBfX3RtcCA9IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tjaDFdOwkJCSAgICAgIFwKLSAgICAgIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tjaDFdID0gX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMl07CSAgICAgIFwKLSAgICAgIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tjaDJdID0gX190bXA7CQkJCSAgICAgIFwKLSAgICB9Ci0jZWxzZQkvKiAhX0xJQkMgKi8KLSMgZGVmaW5lIFNXQVBfRkxBR1MoY2gxLCBjaDIpCi0jZW5kaWYJLyogX0xJQkMgKi8KLQotLyogRXhjaGFuZ2UgdHdvIGFkamFjZW50IHN1YnNlcXVlbmNlcyBvZiBBUkdWLgotICAgT25lIHN1YnNlcXVlbmNlIGlzIGVsZW1lbnRzIFtmaXJzdF9ub25vcHQsbGFzdF9ub25vcHQpCi0gICB3aGljaCBjb250YWlucyBhbGwgdGhlIG5vbi1vcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHNraXBwZWQgc28gZmFyLgotICAgVGhlIG90aGVyIGlzIGVsZW1lbnRzIFtsYXN0X25vbm9wdCxvcHRpbmQpLCB3aGljaCBjb250YWlucyBhbGwKLSAgIHRoZSBvcHRpb25zIHByb2Nlc3NlZCBzaW5jZSB0aG9zZSBub24tb3B0aW9ucyB3ZXJlIHNraXBwZWQuCi0KLSAgIGBmaXJzdF9ub25vcHQnIGFuZCBgbGFzdF9ub25vcHQnIGFyZSByZWxvY2F0ZWQgc28gdGhhdCB0aGV5IGRlc2NyaWJlCi0gICB0aGUgbmV3IGluZGljZXMgb2YgdGhlIG5vbi1vcHRpb25zIGluIEFSR1YgYWZ0ZXIgdGhleSBhcmUgbW92ZWQuICAqLwotCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotc3RhdGljIHZvaWQgZXhjaGFuZ2UgKGNoYXIgKiopOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1leGNoYW5nZSAoYXJndikKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBib3R0b20gPSBmaXJzdF9ub25vcHQ7Ci0gIGludCBtaWRkbGUgPSBsYXN0X25vbm9wdDsKLSAgaW50IHRvcCA9IG9wdGluZDsKLSAgY2hhciAqdGVtOwotCi0gIC8qIEV4Y2hhbmdlIHRoZSBzaG9ydGVyIHNlZ21lbnQgd2l0aCB0aGUgZmFyIGVuZCBvZiB0aGUgbG9uZ2VyIHNlZ21lbnQuCi0gICAgIFRoYXQgcHV0cyB0aGUgc2hvcnRlciBzZWdtZW50IGludG8gdGhlIHJpZ2h0IHBsYWNlLgotICAgICBJdCBsZWF2ZXMgdGhlIGxvbmdlciBzZWdtZW50IGluIHRoZSByaWdodCBwbGFjZSBvdmVyYWxsLAotICAgICBidXQgaXQgY29uc2lzdHMgb2YgdHdvIHBhcnRzIHRoYXQgbmVlZCB0byBiZSBzd2FwcGVkIG5leHQuICAqLwotCi0jaWZkZWYgX0xJQkMKLSAgLyogRmlyc3QgbWFrZSBzdXJlIHRoZSBoYW5kbGluZyBvZiB0aGUgYF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncycKLSAgICAgc3RyaW5nIGNhbiB3b3JrIG5vcm1hbGx5LiAgT3VyIHRvcCBhcmd1bWVudCBtdXN0IGJlIGluIHRoZSByYW5nZQotICAgICBvZiB0aGUgc3RyaW5nLiAgKi8KLSAgaWYgKG5vbm9wdGlvbl9mbGFnc19sZW4gPiAwICYmIHRvcCA+PSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbikKLSAgICB7Ci0gICAgICAvKiBXZSBtdXN0IGV4dGVuZCB0aGUgYXJyYXkuICBUaGUgdXNlciBwbGF5cyBnYW1lcyB3aXRoIHVzIGFuZAotCSBwcmVzZW50cyBuZXcgYXJndW1lbnRzLiAgKi8KLSAgICAgIGNoYXIgKm5ld19zdHIgPSBtYWxsb2MgKHRvcCArIDEpOwotICAgICAgaWYgKG5ld19zdHIgPT0gTlVMTCkKLQlub25vcHRpb25fZmxhZ3NfbGVuID0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG1lbXNldCAoX19tZW1wY3B5IChuZXdfc3RyLCBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MsCi0JCQkgICAgIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKSwKLQkJICAnXDAnLCB0b3AgKyAxIC0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pOwotCSAgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSB0b3AgKyAxOwotCSAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID0gbmV3X3N0cjsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgd2hpbGUgKHRvcCA+IG1pZGRsZSAmJiBtaWRkbGUgPiBib3R0b20pCi0gICAgewotICAgICAgaWYgKHRvcCAtIG1pZGRsZSA+IG1pZGRsZSAtIGJvdHRvbSkKLQl7Ci0JICAvKiBCb3R0b20gc2VnbWVudCBpcyB0aGUgc2hvcnQgb25lLiAgKi8KLQkgIGludCBsZW4gPSBtaWRkbGUgLSBib3R0b207Ci0JICByZWdpc3RlciBpbnQgaTsKLQotCSAgLyogU3dhcCBpdCB3aXRoIHRoZSB0b3AgcGFydCBvZiB0aGUgdG9wIHNlZ21lbnQuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCSAgICB7Ci0JICAgICAgdGVtID0gYXJndltib3R0b20gKyBpXTsKLQkgICAgICBhcmd2W2JvdHRvbSArIGldID0gYXJndlt0b3AgLSAobWlkZGxlIC0gYm90dG9tKSArIGldOwotCSAgICAgIGFyZ3ZbdG9wIC0gKG1pZGRsZSAtIGJvdHRvbSkgKyBpXSA9IHRlbTsKLQkgICAgICBTV0FQX0ZMQUdTIChib3R0b20gKyBpLCB0b3AgLSAobWlkZGxlIC0gYm90dG9tKSArIGkpOwotCSAgICB9Ci0JICAvKiBFeGNsdWRlIHRoZSBtb3ZlZCBib3R0b20gc2VnbWVudCBmcm9tIGZ1cnRoZXIgc3dhcHBpbmcuICAqLwotCSAgdG9wIC09IGxlbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVG9wIHNlZ21lbnQgaXMgdGhlIHNob3J0IG9uZS4gICovCi0JICBpbnQgbGVuID0gdG9wIC0gbWlkZGxlOwotCSAgcmVnaXN0ZXIgaW50IGk7Ci0KLQkgIC8qIFN3YXAgaXQgd2l0aCB0aGUgYm90dG9tIHBhcnQgb2YgdGhlIGJvdHRvbSBzZWdtZW50LiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkgICAgewotCSAgICAgIHRlbSA9IGFyZ3ZbYm90dG9tICsgaV07Ci0JICAgICAgYXJndltib3R0b20gKyBpXSA9IGFyZ3ZbbWlkZGxlICsgaV07Ci0JICAgICAgYXJndlttaWRkbGUgKyBpXSA9IHRlbTsKLQkgICAgICBTV0FQX0ZMQUdTIChib3R0b20gKyBpLCBtaWRkbGUgKyBpKTsKLQkgICAgfQotCSAgLyogRXhjbHVkZSB0aGUgbW92ZWQgdG9wIHNlZ21lbnQgZnJvbSBmdXJ0aGVyIHN3YXBwaW5nLiAgKi8KLQkgIGJvdHRvbSArPSBsZW47Ci0JfQotICAgIH0KLQotICAvKiBVcGRhdGUgcmVjb3JkcyBmb3IgdGhlIHNsb3RzIHRoZSBub24tb3B0aW9ucyBub3cgb2NjdXB5LiAgKi8KLQotICBmaXJzdF9ub25vcHQgKz0gKG9wdGluZCAtIGxhc3Rfbm9ub3B0KTsKLSAgbGFzdF9ub25vcHQgPSBvcHRpbmQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGludGVybmFsIGRhdGEgd2hlbiB0aGUgZmlyc3QgY2FsbCBpcyBtYWRlLiAgKi8KLQotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLXN0YXRpYyBjb25zdCBjaGFyICpfZ2V0b3B0X2luaXRpYWxpemUgKGludCwgY2hhciAqY29uc3QgKiwgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotc3RhdGljIGNvbnN0IGNoYXIgKgotX2dldG9wdF9pbml0aWFsaXplIChhcmdjLCBhcmd2LCBvcHRzdHJpbmcpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICpjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqb3B0c3RyaW5nOwotewotICAvKiBTdGFydCBwcm9jZXNzaW5nIG9wdGlvbnMgd2l0aCBBUkdWLWVsZW1lbnQgMSAoc2luY2UgQVJHVi1lbGVtZW50IDAKLSAgICAgaXMgdGhlIHByb2dyYW0gbmFtZSk7IHRoZSBzZXF1ZW5jZSBvZiBwcmV2aW91c2x5IHNraXBwZWQKLSAgICAgbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzIGlzIGVtcHR5LiAgKi8KLQotICBmaXJzdF9ub25vcHQgPSBsYXN0X25vbm9wdCA9IG9wdGluZDsKLQotICBuZXh0Y2hhciA9IE5VTEw7Ci0KLSAgcG9zaXhseV9jb3JyZWN0ID0gZ2V0ZW52ICgiUE9TSVhMWV9DT1JSRUNUIik7Ci0KLSAgLyogRGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdGhlIG9yZGVyaW5nIG9mIG9wdGlvbnMgYW5kIG5vbm9wdGlvbnMuICAqLwotCi0gIGlmIChvcHRzdHJpbmdbMF0gPT0gJy0nKQotICAgIHsKLSAgICAgIG9yZGVyaW5nID0gUkVUVVJOX0lOX09SREVSOwotICAgICAgKytvcHRzdHJpbmc7Ci0gICAgfQotICBlbHNlIGlmIChvcHRzdHJpbmdbMF0gPT0gJysnKQotICAgIHsKLSAgICAgIG9yZGVyaW5nID0gUkVRVUlSRV9PUkRFUjsKLSAgICAgICsrb3B0c3RyaW5nOwotICAgIH0KLSAgZWxzZSBpZiAocG9zaXhseV9jb3JyZWN0ICE9IE5VTEwpCi0gICAgb3JkZXJpbmcgPSBSRVFVSVJFX09SREVSOwotICBlbHNlCi0gICAgb3JkZXJpbmcgPSBQRVJNVVRFOwotCi0jaWZkZWYgX0xJQkMKLSAgaWYgKHBvc2l4bHlfY29ycmVjdCA9PSBOVUxMCi0gICAgICAmJiBhcmdjID09IG9yaWdpbmFsX2FyZ2MgJiYgYXJndiA9PSBvcmlnaW5hbF9hcmd2KQotICAgIHsKLSAgICAgIGlmIChub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9PSAwKQotCXsKLQkgIGlmIChfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPT0gTlVMTAotCSAgICAgIHx8IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1swXSA9PSAnXDAnKQotCSAgICBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IC0xOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3JpZ19zdHIgPSBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3M7Ci0JICAgICAgaW50IGxlbiA9IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gc3RybGVuIChvcmlnX3N0cik7Ci0JICAgICAgaWYgKG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuIDwgYXJnYykKLQkJbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSBhcmdjOwotCSAgICAgIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9Ci0JCShjaGFyICopIG1hbGxvYyAobm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pOwotCSAgICAgIGlmIChfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPT0gTlVMTCkKLQkJbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSAtMTsKLQkgICAgICBlbHNlCi0JCW1lbXNldCAoX19tZW1wY3B5IChfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MsIG9yaWdfc3RyLCBsZW4pLAotCQkJJ1wwJywgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gLSBsZW4pOwotCSAgICB9Ci0JfQotICAgICAgbm9ub3B0aW9uX2ZsYWdzX2xlbiA9IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuOwotICAgIH0KLSAgZWxzZQotICAgIG5vbm9wdGlvbl9mbGFnc19sZW4gPSAwOwotI2VuZGlmCi0KLSAgcmV0dXJuIG9wdHN0cmluZzsKLX0KLQwKLS8qIFNjYW4gZWxlbWVudHMgb2YgQVJHViAod2hvc2UgbGVuZ3RoIGlzIEFSR0MpIGZvciBvcHRpb24gY2hhcmFjdGVycwotICAgZ2l2ZW4gaW4gT1BUU1RSSU5HLgotCi0gICBJZiBhbiBlbGVtZW50IG9mIEFSR1Ygc3RhcnRzIHdpdGggJy0nLCBhbmQgaXMgbm90IGV4YWN0bHkgIi0iIG9yICItLSIsCi0gICB0aGVuIGl0IGlzIGFuIG9wdGlvbiBlbGVtZW50LiAgVGhlIGNoYXJhY3RlcnMgb2YgdGhpcyBlbGVtZW50Ci0gICAoYXNpZGUgZnJvbSB0aGUgaW5pdGlhbCAnLScpIGFyZSBvcHRpb24gY2hhcmFjdGVycy4gIElmIGBnZXRvcHQnCi0gICBpcyBjYWxsZWQgcmVwZWF0ZWRseSwgaXQgcmV0dXJucyBzdWNjZXNzaXZlbHkgZWFjaCBvZiB0aGUgb3B0aW9uIGNoYXJhY3RlcnMKLSAgIGZyb20gZWFjaCBvZiB0aGUgb3B0aW9uIGVsZW1lbnRzLgotCi0gICBJZiBgZ2V0b3B0JyBmaW5kcyBhbm90aGVyIG9wdGlvbiBjaGFyYWN0ZXIsIGl0IHJldHVybnMgdGhhdCBjaGFyYWN0ZXIsCi0gICB1cGRhdGluZyBgb3B0aW5kJyBhbmQgYG5leHRjaGFyJyBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gYGdldG9wdCcgY2FuCi0gICByZXN1bWUgdGhlIHNjYW4gd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbiBjaGFyYWN0ZXIgb3IgQVJHVi1lbGVtZW50LgotCi0gICBJZiB0aGVyZSBhcmUgbm8gbW9yZSBvcHRpb24gY2hhcmFjdGVycywgYGdldG9wdCcgcmV0dXJucyAtMS4KLSAgIFRoZW4gYG9wdGluZCcgaXMgdGhlIGluZGV4IGluIEFSR1Ygb2YgdGhlIGZpcnN0IEFSR1YtZWxlbWVudAotICAgdGhhdCBpcyBub3QgYW4gb3B0aW9uLiAgKFRoZSBBUkdWLWVsZW1lbnRzIGhhdmUgYmVlbiBwZXJtdXRlZAotICAgc28gdGhhdCB0aG9zZSB0aGF0IGFyZSBub3Qgb3B0aW9ucyBub3cgY29tZSBsYXN0LikKLQotICAgT1BUU1RSSU5HIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxlZ2l0aW1hdGUgb3B0aW9uIGNoYXJhY3RlcnMuCi0gICBJZiBhbiBvcHRpb24gY2hhcmFjdGVyIGlzIHNlZW4gdGhhdCBpcyBub3QgbGlzdGVkIGluIE9QVFNUUklORywKLSAgIHJldHVybiAnPycgYWZ0ZXIgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZS4gIElmIHlvdSBzZXQgYG9wdGVycicgdG8KLSAgIHplcm8sIHRoZSBlcnJvciBtZXNzYWdlIGlzIHN1cHByZXNzZWQgYnV0IHdlIHN0aWxsIHJldHVybiAnPycuCi0KLSAgIElmIGEgY2hhciBpbiBPUFRTVFJJTkcgaXMgZm9sbG93ZWQgYnkgYSBjb2xvbiwgdGhhdCBtZWFucyBpdCB3YW50cyBhbiBhcmcsCi0gICBzbyB0aGUgZm9sbG93aW5nIHRleHQgaW4gdGhlIHNhbWUgQVJHVi1lbGVtZW50LCBvciB0aGUgdGV4dCBvZiB0aGUgZm9sbG93aW5nCi0gICBBUkdWLWVsZW1lbnQsIGlzIHJldHVybmVkIGluIGBvcHRhcmcnLiAgVHdvIGNvbG9ucyBtZWFuIGFuIG9wdGlvbiB0aGF0Ci0gICB3YW50cyBhbiBvcHRpb25hbCBhcmc7IGlmIHRoZXJlIGlzIHRleHQgaW4gdGhlIGN1cnJlbnQgQVJHVi1lbGVtZW50LAotICAgaXQgaXMgcmV0dXJuZWQgaW4gYG9wdGFyZycsIG90aGVyd2lzZSBgb3B0YXJnJyBpcyBzZXQgdG8gemVyby4KLQotICAgSWYgT1BUU1RSSU5HIHN0YXJ0cyB3aXRoIGAtJyBvciBgKycsIGl0IHJlcXVlc3RzIGRpZmZlcmVudCBtZXRob2RzIG9mCi0gICBoYW5kbGluZyB0aGUgbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzLgotICAgU2VlIHRoZSBjb21tZW50cyBhYm91dCBSRVRVUk5fSU5fT1JERVIgYW5kIFJFUVVJUkVfT1JERVIsIGFib3ZlLgotCi0gICBMb25nLW5hbWVkIG9wdGlvbnMgYmVnaW4gd2l0aCBgLS0nIGluc3RlYWQgb2YgYC0nLgotICAgVGhlaXIgbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkIGFzIGxvbmcgYXMgdGhlIGFiYnJldmlhdGlvbiBpcyB1bmlxdWUKLSAgIG9yIGlzIGFuIGV4YWN0IG1hdGNoIGZvciBzb21lIGRlZmluZWQgb3B0aW9uLiAgSWYgdGhleSBoYXZlIGFuCi0gICBhcmd1bWVudCwgaXQgZm9sbG93cyB0aGUgb3B0aW9uIG5hbWUgaW4gdGhlIHNhbWUgQVJHVi1lbGVtZW50LCBzZXBhcmF0ZWQKLSAgIGZyb20gdGhlIG9wdGlvbiBuYW1lIGJ5IGEgYD0nLCBvciBlbHNlIHRoZSBpbiBuZXh0IEFSR1YtZWxlbWVudC4KLSAgIFdoZW4gYGdldG9wdCcgZmluZHMgYSBsb25nLW5hbWVkIG9wdGlvbiwgaXQgcmV0dXJucyAwIGlmIHRoYXQgb3B0aW9uJ3MKLSAgIGBmbGFnJyBmaWVsZCBpcyBub256ZXJvLCB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbidzIGB2YWwnIGZpZWxkCi0gICBpZiB0aGUgYGZsYWcnIGZpZWxkIGlzIHplcm8uCi0KLSAgIFRoZSBlbGVtZW50cyBvZiBBUkdWIGFyZW4ndCByZWFsbHkgY29uc3QsIGJlY2F1c2Ugd2UgcGVybXV0ZSB0aGVtLgotICAgQnV0IHdlIHByZXRlbmQgdGhleSdyZSBjb25zdCBpbiB0aGUgcHJvdG90eXBlIHRvIGJlIGNvbXBhdGlibGUKLSAgIHdpdGggb3RoZXIgc3lzdGVtcy4KLQotICAgTE9OR09QVFMgaXMgYSB2ZWN0b3Igb2YgYHN0cnVjdCBvcHRpb24nIHRlcm1pbmF0ZWQgYnkgYW4KLSAgIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMgemVyby4KLQotICAgTE9OR0lORCByZXR1cm5zIHRoZSBpbmRleCBpbiBMT05HT1BUIG9mIHRoZSBsb25nLW5hbWVkIG9wdGlvbiBmb3VuZC4KLSAgIEl0IGlzIG9ubHkgdmFsaWQgd2hlbiBhIGxvbmctbmFtZWQgb3B0aW9uIGhhcyBiZWVuIGZvdW5kIGJ5IHRoZSBtb3N0Ci0gICByZWNlbnQgY2FsbC4KLQotICAgSWYgTE9OR19PTkxZIGlzIG5vbnplcm8sICctJyBhcyB3ZWxsIGFzICctLScgY2FuIGludHJvZHVjZQotICAgbG9uZy1uYW1lZCBvcHRpb25zLiAgKi8KLQotaW50Ci1fZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRzdHJpbmcsIGxvbmdvcHRzLCBsb25naW5kLCBsb25nX29ubHkpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICpjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqb3B0c3RyaW5nOwotICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0czsKLSAgICAgaW50ICpsb25naW5kOwotICAgICBpbnQgbG9uZ19vbmx5OwotewotICBvcHRhcmcgPSBOVUxMOwotCi0gIGlmIChvcHRpbmQgPT0gMCB8fCAhX19nZXRvcHRfaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgaWYgKG9wdGluZCA9PSAwKQotCW9wdGluZCA9IDE7CS8qIERvbid0IHNjYW4gQVJHVlswXSwgdGhlIHByb2dyYW0gbmFtZS4gICovCi0gICAgICBvcHRzdHJpbmcgPSBfZ2V0b3B0X2luaXRpYWxpemUgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZyk7Ci0gICAgICBfX2dldG9wdF9pbml0aWFsaXplZCA9IDE7Ci0gICAgfQotCi0gIC8qIFRlc3Qgd2hldGhlciBBUkdWW29wdGluZF0gcG9pbnRzIHRvIGEgbm9uLW9wdGlvbiBhcmd1bWVudC4KLSAgICAgRWl0aGVyIGl0IGRvZXMgbm90IGhhdmUgb3B0aW9uIHN5bnRheCwgb3IgdGhlcmUgaXMgYW4gZW52aXJvbm1lbnQgZmxhZwotICAgICBmcm9tIHRoZSBzaGVsbCBpbmRpY2F0aW5nIGl0IGlzIG5vdCBhbiBvcHRpb24uICBUaGUgbGF0ZXIgaW5mb3JtYXRpb24KLSAgICAgaXMgb25seSB1c2VkIHdoZW4gdGhlIHVzZWQgaW4gdGhlIEdOVSBsaWJjLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgTk9OT1BUSU9OX1AgKGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScgfHwgYXJndltvcHRpbmRdWzFdID09ICdcMCcJICAgICAgXAotCQkgICAgICB8fCAob3B0aW5kIDwgbm9ub3B0aW9uX2ZsYWdzX2xlbgkJCSAgICAgIFwKLQkJCSAgJiYgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW29wdGluZF0gPT0gJzEnKSkKLSNlbHNlCi0jIGRlZmluZSBOT05PUFRJT05fUCAoYXJndltvcHRpbmRdWzBdICE9ICctJyB8fCBhcmd2W29wdGluZF1bMV0gPT0gJ1wwJykKLSNlbmRpZgotCi0gIGlmIChuZXh0Y2hhciA9PSBOVUxMIHx8ICpuZXh0Y2hhciA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIEFkdmFuY2UgdG8gdGhlIG5leHQgQVJHVi1lbGVtZW50LiAgKi8KLQotICAgICAgLyogR2l2ZSBGSVJTVF9OT05PUFQgJiBMQVNUX05PTk9QVCByYXRpb25hbCB2YWx1ZXMgaWYgT1BUSU5EIGhhcyBiZWVuCi0JIG1vdmVkIGJhY2sgYnkgdGhlIHVzZXIgKHdobyBtYXkgYWxzbyBoYXZlIGNoYW5nZWQgdGhlIGFyZ3VtZW50cykuICAqLwotICAgICAgaWYgKGxhc3Rfbm9ub3B0ID4gb3B0aW5kKQotCWxhc3Rfbm9ub3B0ID0gb3B0aW5kOwotICAgICAgaWYgKGZpcnN0X25vbm9wdCA+IG9wdGluZCkKLQlmaXJzdF9ub25vcHQgPSBvcHRpbmQ7Ci0KLSAgICAgIGlmIChvcmRlcmluZyA9PSBQRVJNVVRFKQotCXsKLQkgIC8qIElmIHdlIGhhdmUganVzdCBwcm9jZXNzZWQgc29tZSBvcHRpb25zIGZvbGxvd2luZyBzb21lIG5vbi1vcHRpb25zLAotCSAgICAgZXhjaGFuZ2UgdGhlbSBzbyB0aGF0IHRoZSBvcHRpb25zIGNvbWUgZmlyc3QuICAqLwotCi0JICBpZiAoZmlyc3Rfbm9ub3B0ICE9IGxhc3Rfbm9ub3B0ICYmIGxhc3Rfbm9ub3B0ICE9IG9wdGluZCkKLQkgICAgZXhjaGFuZ2UgKChjaGFyICoqKSBhcmd2KTsKLQkgIGVsc2UgaWYgKGxhc3Rfbm9ub3B0ICE9IG9wdGluZCkKLQkgICAgZmlyc3Rfbm9ub3B0ID0gb3B0aW5kOwotCi0JICAvKiBTa2lwIGFueSBhZGRpdGlvbmFsIG5vbi1vcHRpb25zCi0JICAgICBhbmQgZXh0ZW5kIHRoZSByYW5nZSBvZiBub24tb3B0aW9ucyBwcmV2aW91c2x5IHNraXBwZWQuICAqLwotCi0JICB3aGlsZSAob3B0aW5kIDwgYXJnYyAmJiBOT05PUFRJT05fUCkKLQkgICAgb3B0aW5kKys7Ci0JICBsYXN0X25vbm9wdCA9IG9wdGluZDsKLQl9Ci0KLSAgICAgIC8qIFRoZSBzcGVjaWFsIEFSR1YtZWxlbWVudCBgLS0nIG1lYW5zIHByZW1hdHVyZSBlbmQgb2Ygb3B0aW9ucy4KLQkgU2tpcCBpdCBsaWtlIGEgbnVsbCBvcHRpb24sCi0JIHRoZW4gZXhjaGFuZ2Ugd2l0aCBwcmV2aW91cyBub24tb3B0aW9ucyBhcyBpZiBpdCB3ZXJlIGFuIG9wdGlvbiwKLQkgdGhlbiBza2lwIGV2ZXJ5dGhpbmcgZWxzZSBsaWtlIGEgbm9uLW9wdGlvbi4gICovCi0KLSAgICAgIGlmIChvcHRpbmQgIT0gYXJnYyAmJiAhc3RyY21wIChhcmd2W29wdGluZF0sICItLSIpKQotCXsKLQkgIG9wdGluZCsrOwotCi0JICBpZiAoZmlyc3Rfbm9ub3B0ICE9IGxhc3Rfbm9ub3B0ICYmIGxhc3Rfbm9ub3B0ICE9IG9wdGluZCkKLQkgICAgZXhjaGFuZ2UgKChjaGFyICoqKSBhcmd2KTsKLQkgIGVsc2UgaWYgKGZpcnN0X25vbm9wdCA9PSBsYXN0X25vbm9wdCkKLQkgICAgZmlyc3Rfbm9ub3B0ID0gb3B0aW5kOwotCSAgbGFzdF9ub25vcHQgPSBhcmdjOwotCi0JICBvcHRpbmQgPSBhcmdjOwotCX0KLQotICAgICAgLyogSWYgd2UgaGF2ZSBkb25lIGFsbCB0aGUgQVJHVi1lbGVtZW50cywgc3RvcCB0aGUgc2NhbgotCSBhbmQgYmFjayBvdmVyIGFueSBub24tb3B0aW9ucyB0aGF0IHdlIHNraXBwZWQgYW5kIHBlcm11dGVkLiAgKi8KLQotICAgICAgaWYgKG9wdGluZCA9PSBhcmdjKQotCXsKLQkgIC8qIFNldCB0aGUgbmV4dC1hcmctaW5kZXggdG8gcG9pbnQgYXQgdGhlIG5vbi1vcHRpb25zCi0JICAgICB0aGF0IHdlIHByZXZpb3VzbHkgc2tpcHBlZCwgc28gdGhlIGNhbGxlciB3aWxsIGRpZ2VzdCB0aGVtLiAgKi8KLQkgIGlmIChmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQpCi0JICAgIG9wdGluZCA9IGZpcnN0X25vbm9wdDsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGhhdmUgY29tZSB0byBhIG5vbi1vcHRpb24gYW5kIGRpZCBub3QgcGVybXV0ZSBpdCwKLQkgZWl0aGVyIHN0b3AgdGhlIHNjYW4gb3IgZGVzY3JpYmUgaXQgdG8gdGhlIGNhbGxlciBhbmQgcGFzcyBpdCBieS4gICovCi0KLSAgICAgIGlmIChOT05PUFRJT05fUCkKLQl7Ci0JICBpZiAob3JkZXJpbmcgPT0gUkVRVUlSRV9PUkRFUikKLQkgICAgcmV0dXJuIC0xOwotCSAgb3B0YXJnID0gYXJndltvcHRpbmQrK107Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5vdGhlciBvcHRpb24tQVJHVi1lbGVtZW50LgotCSBTa2lwIHRoZSBpbml0aWFsIHB1bmN0dWF0aW9uLiAgKi8KLQotICAgICAgbmV4dGNoYXIgPSAoYXJndltvcHRpbmRdICsgMQotCQkgICsgKGxvbmdvcHRzICE9IE5VTEwgJiYgYXJndltvcHRpbmRdWzFdID09ICctJykpOwotICAgIH0KLQotICAvKiBEZWNvZGUgdGhlIGN1cnJlbnQgb3B0aW9uLUFSR1YtZWxlbWVudC4gICovCi0KLSAgLyogQ2hlY2sgd2hldGhlciB0aGUgQVJHVi1lbGVtZW50IGlzIGEgbG9uZyBvcHRpb24uCi0KLSAgICAgSWYgbG9uZ19vbmx5IGFuZCB0aGUgQVJHVi1lbGVtZW50IGhhcyB0aGUgZm9ybSAiLWYiLCB3aGVyZSBmIGlzCi0gICAgIGEgdmFsaWQgc2hvcnQgb3B0aW9uLCBkb24ndCBjb25zaWRlciBpdCBhbiBhYmJyZXZpYXRlZCBmb3JtIG9mCi0gICAgIGEgbG9uZyBvcHRpb24gdGhhdCBzdGFydHMgd2l0aCBmLiAgT3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlIG5vCi0gICAgIHdheSB0byBnaXZlIHRoZSAtZiBzaG9ydCBvcHRpb24uCi0KLSAgICAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZXJlJ3MgYSBsb25nIG9wdGlvbiAiZnViYXIiIGFuZAotICAgICB0aGUgQVJHVi1lbGVtZW50IGlzICItZnUiLCBkbyBjb25zaWRlciB0aGF0IGFuIGFiYnJldmlhdGlvbiBvZgotICAgICB0aGUgbG9uZyBvcHRpb24sIGp1c3QgbGlrZSAiLS1mdSIsIGFuZCBub3QgIi1mIiB3aXRoIGFyZyAidSIuCi0KLSAgICAgVGhpcyBkaXN0aW5jdGlvbiBzZWVtcyB0byBiZSB0aGUgbW9zdCB1c2VmdWwgYXBwcm9hY2guICAqLwotCi0gIGlmIChsb25nb3B0cyAhPSBOVUxMCi0gICAgICAmJiAoYXJndltvcHRpbmRdWzFdID09ICctJwotCSAgfHwgKGxvbmdfb25seSAmJiAoYXJndltvcHRpbmRdWzJdIHx8ICFteV9pbmRleCAob3B0c3RyaW5nLCBhcmd2W29wdGluZF1bMV0pKSkpKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWVlbmQ7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpwOwotICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqcGZvdW5kID0gTlVMTDsKLSAgICAgIGludCBleGFjdCA9IDA7Ci0gICAgICBpbnQgYW1iaWcgPSAwOwotICAgICAgaW50IGluZGZvdW5kID0gLTE7Ci0gICAgICBpbnQgb3B0aW9uX2luZGV4OwotCi0gICAgICBmb3IgKG5hbWVlbmQgPSBuZXh0Y2hhcjsgKm5hbWVlbmQgJiYgKm5hbWVlbmQgIT0gJz0nOyBuYW1lZW5kKyspCi0JLyogRG8gbm90aGluZy4gICovIDsKLQotICAgICAgLyogVGVzdCBhbGwgbG9uZyBvcHRpb25zIGZvciBlaXRoZXIgZXhhY3QgbWF0Y2gKLQkgb3IgYWJicmV2aWF0ZWQgbWF0Y2hlcy4gICovCi0gICAgICBmb3IgKHAgPSBsb25nb3B0cywgb3B0aW9uX2luZGV4ID0gMDsgcC0+bmFtZTsgcCsrLCBvcHRpb25faW5kZXgrKykKLQlpZiAoIXN0cm5jbXAgKHAtPm5hbWUsIG5leHRjaGFyLCBuYW1lZW5kIC0gbmV4dGNoYXIpKQotCSAgewotCSAgICBpZiAoKHVuc2lnbmVkIGludCkgKG5hbWVlbmQgLSBuZXh0Y2hhcikKLQkJPT0gKHVuc2lnbmVkIGludCkgc3RybGVuIChwLT5uYW1lKSkKLQkgICAgICB7Ci0JCS8qIEV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KLQkJcGZvdW5kID0gcDsKLQkJaW5kZm91bmQgPSBvcHRpb25faW5kZXg7Ci0JCWV4YWN0ID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChwZm91bmQgPT0gTlVMTCkKLQkgICAgICB7Ci0JCS8qIEZpcnN0IG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KLQkJcGZvdW5kID0gcDsKLQkJaW5kZm91bmQgPSBvcHRpb25faW5kZXg7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgLyogU2Vjb25kIG9yIGxhdGVyIG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KLQkgICAgICBhbWJpZyA9IDE7Ci0JICB9Ci0KLSAgICAgIGlmIChhbWJpZyAmJiAhZXhhY3QpCi0JewotCSAgaWYgKG9wdGVycikKLQkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogb3B0aW9uIGAlcycgaXMgYW1iaWd1b3VzXG4iKSwKLQkJICAgICBhcmd2WzBdLCBhcmd2W29wdGluZF0pOwotCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JICBvcHRpbmQrKzsKLQkgIG9wdG9wdCA9IDA7Ci0JICByZXR1cm4gJz8nOwotCX0KLQotICAgICAgaWYgKHBmb3VuZCAhPSBOVUxMKQotCXsKLQkgIG9wdGlvbl9pbmRleCA9IGluZGZvdW5kOwotCSAgb3B0aW5kKys7Ci0JICBpZiAoKm5hbWVlbmQpCi0JICAgIHsKLQkgICAgICAvKiBEb24ndCB0ZXN0IGhhc19hcmcgd2l0aCA+LCBiZWNhdXNlIHNvbWUgQyBjb21waWxlcnMgZG9uJ3QKLQkJIGFsbG93IGl0IHRvIGJlIHVzZWQgb24gZW51bXMuICAqLwotCSAgICAgIGlmIChwZm91bmQtPmhhc19hcmcpCi0JCW9wdGFyZyA9IG5hbWVlbmQgKyAxOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChvcHRlcnIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChhcmd2W29wdGluZCAtIDFdWzFdID09ICctJykKLQkJCS8qIC0tb3B0aW9uICovCi0JCQlmcHJpbnRmIChzdGRlcnIsCi0JCQkJIF8oIiVzOiBvcHRpb24gYC0tJXMnIGRvZXNuJ3QgYWxsb3cgYW4gYXJndW1lbnRcbiIpLAotCQkJCSBhcmd2WzBdLCBwZm91bmQtPm5hbWUpOwotCQkgICAgICBlbHNlCi0JCQkvKiArb3B0aW9uIG9yIC1vcHRpb24gKi8KLQkJCWZwcmludGYgKHN0ZGVyciwKLQkJCQkgXygiJXM6IG9wdGlvbiBgJWMlcycgZG9lc24ndCBhbGxvdyBhbiBhcmd1bWVudFxuIiksCi0JCQkJIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kIC0gMV1bMF0sIHBmb3VuZC0+bmFtZSk7Ci0KLQkJICAgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0KLQkJICAgICAgb3B0b3B0ID0gcGZvdW5kLT52YWw7Ci0JCSAgICAgIHJldHVybiAnPyc7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocGZvdW5kLT5oYXNfYXJnID09IDEpCi0JICAgIHsKLQkgICAgICBpZiAob3B0aW5kIDwgYXJnYykKLQkJb3B0YXJnID0gYXJndltvcHRpbmQrK107Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG9wdGVycikKLQkJICAgIGZwcmludGYgKHN0ZGVyciwKLQkJCSAgIF8oIiVzOiBvcHRpb24gYCVzJyByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiksCi0JCQkgICBhcmd2WzBdLCBhcmd2W29wdGluZCAtIDFdKTsKLQkJICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkJICBvcHRvcHQgPSBwZm91bmQtPnZhbDsKLQkJICByZXR1cm4gb3B0c3RyaW5nWzBdID09ICc6JyA/ICc6JyA6ICc/JzsKLQkJfQotCSAgICB9Ci0JICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkgIGlmIChsb25naW5kICE9IE5VTEwpCi0JICAgICpsb25naW5kID0gb3B0aW9uX2luZGV4OwotCSAgaWYgKHBmb3VuZC0+ZmxhZykKLQkgICAgewotCSAgICAgICoocGZvdW5kLT5mbGFnKSA9IHBmb3VuZC0+dmFsOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICByZXR1cm4gcGZvdW5kLT52YWw7Ci0JfQotCi0gICAgICAvKiBDYW4ndCBmaW5kIGl0IGFzIGEgbG9uZyBvcHRpb24uICBJZiB0aGlzIGlzIG5vdCBnZXRvcHRfbG9uZ19vbmx5LAotCSBvciB0aGUgb3B0aW9uIHN0YXJ0cyB3aXRoICctLScgb3IgaXMgbm90IGEgdmFsaWQgc2hvcnQKLQkgb3B0aW9uLCB0aGVuIGl0J3MgYW4gZXJyb3IuCi0JIE90aGVyd2lzZSBpbnRlcnByZXQgaXQgYXMgYSBzaG9ydCBvcHRpb24uICAqLwotICAgICAgaWYgKCFsb25nX29ubHkgfHwgYXJndltvcHRpbmRdWzFdID09ICctJwotCSAgfHwgbXlfaW5kZXggKG9wdHN0cmluZywgKm5leHRjaGFyKSA9PSBOVUxMKQotCXsKLQkgIGlmIChvcHRlcnIpCi0JICAgIHsKLQkgICAgICBpZiAoYXJndltvcHRpbmRdWzFdID09ICctJykKLQkJLyogLS1vcHRpb24gKi8KLQkJZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIG9wdGlvbiBgLS0lcydcbiIpLAotCQkJIGFyZ3ZbMF0sIG5leHRjaGFyKTsKLQkgICAgICBlbHNlCi0JCS8qICtvcHRpb24gb3IgLW9wdGlvbiAqLwotCQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uIGAlYyVzJ1xuIiksCi0JCQkgYXJndlswXSwgYXJndltvcHRpbmRdWzBdLCBuZXh0Y2hhcik7Ci0JICAgIH0KLQkgIG5leHRjaGFyID0gKGNoYXIgKikgIiI7Ci0JICBvcHRpbmQrKzsKLQkgIG9wdG9wdCA9IDA7Ci0JICByZXR1cm4gJz8nOwotCX0KLSAgICB9Ci0KLSAgLyogTG9vayBhdCBhbmQgaGFuZGxlIHRoZSBuZXh0IHNob3J0IG9wdGlvbi1jaGFyYWN0ZXIuICAqLwotCi0gIHsKLSAgICBjaGFyIGMgPSAqbmV4dGNoYXIrKzsKLSAgICBjaGFyICp0ZW1wID0gbXlfaW5kZXggKG9wdHN0cmluZywgYyk7Ci0KLSAgICAvKiBJbmNyZW1lbnQgYG9wdGluZCcgd2hlbiB3ZSBzdGFydCB0byBwcm9jZXNzIGl0cyBsYXN0IGNoYXJhY3Rlci4gICovCi0gICAgaWYgKCpuZXh0Y2hhciA9PSAnXDAnKQotICAgICAgKytvcHRpbmQ7Ci0KLSAgICBpZiAodGVtcCA9PSBOVUxMIHx8IGMgPT0gJzonKQotICAgICAgewotCWlmIChvcHRlcnIpCi0JICB7Ci0JICAgIGlmIChwb3NpeGx5X2NvcnJlY3QpCi0JICAgICAgLyogMTAwMy4yIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZS4gICovCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIpLAotCQkgICAgICAgYXJndlswXSwgYyk7Ci0JICAgIGVsc2UKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnZhbGlkIG9wdGlvbiAtLSAlY1xuIiksCi0JCSAgICAgICBhcmd2WzBdLCBjKTsKLQkgIH0KLQlvcHRvcHQgPSBjOwotCXJldHVybiAnPyc7Ci0gICAgICB9Ci0gICAgLyogQ29udmVuaWVuY2UuIFRyZWF0IFBPU0lYIC1XIGZvbyBzYW1lIGFzIGxvbmcgb3B0aW9uIC0tZm9vICovCi0gICAgaWYgKHRlbXBbMF0gPT0gJ1cnICYmIHRlbXBbMV0gPT0gJzsnKQotICAgICAgewotCWNoYXIgKm5hbWVlbmQ7Ci0JY29uc3Qgc3RydWN0IG9wdGlvbiAqcDsKLQljb25zdCBzdHJ1Y3Qgb3B0aW9uICpwZm91bmQgPSBOVUxMOwotCWludCBleGFjdCA9IDA7Ci0JaW50IGFtYmlnID0gMDsKLQlpbnQgaW5kZm91bmQgPSAwOwotCWludCBvcHRpb25faW5kZXg7Ci0KLQkvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IHJlcXVpcmVzIGFuIGFyZ3VtZW50LiAgKi8KLQlpZiAoKm5leHRjaGFyICE9ICdcMCcpCi0JICB7Ci0JICAgIG9wdGFyZyA9IG5leHRjaGFyOwotCSAgICAvKiBJZiB3ZSBlbmQgdGhpcyBBUkdWLWVsZW1lbnQgYnkgdGFraW5nIHRoZSByZXN0IGFzIGFuIGFyZywKLQkgICAgICAgd2UgbXVzdCBhZHZhbmNlIHRvIHRoZSBuZXh0IGVsZW1lbnQgbm93LiAgKi8KLQkgICAgb3B0aW5kKys7Ci0JICB9Ci0JZWxzZSBpZiAob3B0aW5kID09IGFyZ2MpCi0JICB7Ci0JICAgIGlmIChvcHRlcnIpCi0JICAgICAgewotCQkvKiAxMDAzLjIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlLiAgKi8KLQkJZnByaW50ZiAoc3RkZXJyLCBfKCIlczogb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IC0tICVjXG4iKSwKLQkJCSBhcmd2WzBdLCBjKTsKLQkgICAgICB9Ci0JICAgIG9wdG9wdCA9IGM7Ci0JICAgIGlmIChvcHRzdHJpbmdbMF0gPT0gJzonKQotCSAgICAgIGMgPSAnOic7Ci0JICAgIGVsc2UKLQkgICAgICBjID0gJz8nOwotCSAgICByZXR1cm4gYzsKLQkgIH0KLQllbHNlCi0JICAvKiBXZSBhbHJlYWR5IGluY3JlbWVudGVkIGBvcHRpbmQnIG9uY2U7Ci0JICAgICBpbmNyZW1lbnQgaXQgYWdhaW4gd2hlbiB0YWtpbmcgbmV4dCBBUkdWLWVsdCBhcyBhcmd1bWVudC4gICovCi0JICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKLQotCS8qIG9wdGFyZyBpcyBub3cgdGhlIGFyZ3VtZW50LCBzZWUgaWYgaXQncyBpbiB0aGUKLQkgICB0YWJsZSBvZiBsb25nb3B0cy4gICovCi0KLQlmb3IgKG5leHRjaGFyID0gbmFtZWVuZCA9IG9wdGFyZzsgKm5hbWVlbmQgJiYgKm5hbWVlbmQgIT0gJz0nOyBuYW1lZW5kKyspCi0JICAvKiBEbyBub3RoaW5nLiAgKi8gOwotCi0JLyogVGVzdCBhbGwgbG9uZyBvcHRpb25zIGZvciBlaXRoZXIgZXhhY3QgbWF0Y2gKLQkgICBvciBhYmJyZXZpYXRlZCBtYXRjaGVzLiAgKi8KLQlmb3IgKHAgPSBsb25nb3B0cywgb3B0aW9uX2luZGV4ID0gMDsgcC0+bmFtZTsgcCsrLCBvcHRpb25faW5kZXgrKykKLQkgIGlmICghc3RybmNtcCAocC0+bmFtZSwgbmV4dGNoYXIsIG5hbWVlbmQgLSBuZXh0Y2hhcikpCi0JICAgIHsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGludCkgKG5hbWVlbmQgLSBuZXh0Y2hhcikgPT0gc3RybGVuIChwLT5uYW1lKSkKLQkJewotCQkgIC8qIEV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KLQkJICBwZm91bmQgPSBwOwotCQkgIGluZGZvdW5kID0gb3B0aW9uX2luZGV4OwotCQkgIGV4YWN0ID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHBmb3VuZCA9PSBOVUxMKQotCQl7Ci0JCSAgLyogRmlyc3Qgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQkgIHBmb3VuZCA9IHA7Ci0JCSAgaW5kZm91bmQgPSBvcHRpb25faW5kZXg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCS8qIFNlY29uZCBvciBsYXRlciBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCWFtYmlnID0gMTsKLQkgICAgfQotCWlmIChhbWJpZyAmJiAhZXhhY3QpCi0JICB7Ci0JICAgIGlmIChvcHRlcnIpCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogb3B0aW9uIGAtVyAlcycgaXMgYW1iaWd1b3VzXG4iKSwKLQkJICAgICAgIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kXSk7Ci0JICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCSAgICBvcHRpbmQrKzsKLQkgICAgcmV0dXJuICc/JzsKLQkgIH0KLQlpZiAocGZvdW5kICE9IE5VTEwpCi0JICB7Ci0JICAgIG9wdGlvbl9pbmRleCA9IGluZGZvdW5kOwotCSAgICBpZiAoKm5hbWVlbmQpCi0JICAgICAgewotCQkvKiBEb24ndCB0ZXN0IGhhc19hcmcgd2l0aCA+LCBiZWNhdXNlIHNvbWUgQyBjb21waWxlcnMgZG9uJ3QKLQkJICAgYWxsb3cgaXQgdG8gYmUgdXNlZCBvbiBlbnVtcy4gICovCi0JCWlmIChwZm91bmQtPmhhc19hcmcpCi0JCSAgb3B0YXJnID0gbmFtZWVuZCArIDE7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAob3B0ZXJyKQotCQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlwKLSVzOiBvcHRpb24gYC1XICVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50XG4iKSwKLQkJCSAgICAgICBhcmd2WzBdLCBwZm91bmQtPm5hbWUpOwotCi0JCSAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkJICAgIHJldHVybiAnPyc7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAocGZvdW5kLT5oYXNfYXJnID09IDEpCi0JICAgICAgewotCQlpZiAob3B0aW5kIDwgYXJnYykKLQkJICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmIChvcHRlcnIpCi0JCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJCSAgICAgICBfKCIlczogb3B0aW9uIGAlcycgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpLAotCQkJICAgICAgIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kIC0gMV0pOwotCQkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JCSAgICByZXR1cm4gb3B0c3RyaW5nWzBdID09ICc6JyA/ICc6JyA6ICc/JzsKLQkJICB9Ci0JICAgICAgfQotCSAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkgICAgaWYgKGxvbmdpbmQgIT0gTlVMTCkKLQkgICAgICAqbG9uZ2luZCA9IG9wdGlvbl9pbmRleDsKLQkgICAgaWYgKHBmb3VuZC0+ZmxhZykKLQkgICAgICB7Ci0JCSoocGZvdW5kLT5mbGFnKSA9IHBmb3VuZC0+dmFsOwotCQlyZXR1cm4gMDsKLQkgICAgICB9Ci0JICAgIHJldHVybiBwZm91bmQtPnZhbDsKLQkgIH0KLQkgIG5leHRjaGFyID0gTlVMTDsKLQkgIHJldHVybiAnVyc7CS8qIExldCB0aGUgYXBwbGljYXRpb24gaGFuZGxlIGl0LiAgICovCi0gICAgICB9Ci0gICAgaWYgKHRlbXBbMV0gPT0gJzonKQotICAgICAgewotCWlmICh0ZW1wWzJdID09ICc6JykKLQkgIHsKLQkgICAgLyogVGhpcyBpcyBhbiBvcHRpb24gdGhhdCBhY2NlcHRzIGFuIGFyZ3VtZW50IG9wdGlvbmFsbHkuICAqLwotCSAgICBpZiAoKm5leHRjaGFyICE9ICdcMCcpCi0JICAgICAgewotCQlvcHRhcmcgPSBuZXh0Y2hhcjsKLQkJb3B0aW5kKys7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgb3B0YXJnID0gTlVMTDsKLQkgICAgbmV4dGNoYXIgPSBOVUxMOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogVGhpcyBpcyBhbiBvcHRpb24gdGhhdCByZXF1aXJlcyBhbiBhcmd1bWVudC4gICovCi0JICAgIGlmICgqbmV4dGNoYXIgIT0gJ1wwJykKLQkgICAgICB7Ci0JCW9wdGFyZyA9IG5leHRjaGFyOwotCQkvKiBJZiB3ZSBlbmQgdGhpcyBBUkdWLWVsZW1lbnQgYnkgdGFraW5nIHRoZSByZXN0IGFzIGFuIGFyZywKLQkJICAgd2UgbXVzdCBhZHZhbmNlIHRvIHRoZSBuZXh0IGVsZW1lbnQgbm93LiAgKi8KLQkJb3B0aW5kKys7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChvcHRpbmQgPT0gYXJnYykKLQkgICAgICB7Ci0JCWlmIChvcHRlcnIpCi0JCSAgewotCQkgICAgLyogMTAwMy4yIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZS4gICovCi0JCSAgICBmcHJpbnRmIChzdGRlcnIsCi0JCQkgICBfKCIlczogb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IC0tICVjXG4iKSwKLQkJCSAgIGFyZ3ZbMF0sIGMpOwotCQkgIH0KLQkJb3B0b3B0ID0gYzsKLQkJaWYgKG9wdHN0cmluZ1swXSA9PSAnOicpCi0JCSAgYyA9ICc6JzsKLQkJZWxzZQotCQkgIGMgPSAnPyc7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgLyogV2UgYWxyZWFkeSBpbmNyZW1lbnRlZCBgb3B0aW5kJyBvbmNlOwotCQkgaW5jcmVtZW50IGl0IGFnYWluIHdoZW4gdGFraW5nIG5leHQgQVJHVi1lbHQgYXMgYXJndW1lbnQuICAqLwotCSAgICAgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCSAgICBuZXh0Y2hhciA9IE5VTEw7Ci0JICB9Ci0gICAgICB9Ci0gICAgcmV0dXJuIGM7Ci0gIH0KLX0KLQotaW50Ci1nZXRvcHQgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZykKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRzdHJpbmc7Ci17Ci0gIHJldHVybiBfZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRzdHJpbmcsCi0JCQkgICAoY29uc3Qgc3RydWN0IG9wdGlvbiAqKSAwLAotCQkJICAgKGludCAqKSAwLAotCQkJICAgMCk7Ci19Ci0KLSNlbmRpZgkvKiBOb3QgRUxJREVfQ09ERS4gICovCi0MCi0jaWZkZWYgVEVTVAotCi0vKiBDb21waWxlIHdpdGggLURURVNUIHRvIG1ha2UgYW4gZXhlY3V0YWJsZSBmb3IgdXNlIGluIHRlc3RpbmcKLSAgIHRoZSBhYm92ZSBkZWZpbml0aW9uIG9mIGBnZXRvcHQnLiAgKi8KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgZGlnaXRfb3B0aW5kID0gMDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgdGhpc19vcHRpb25fb3B0aW5kID0gb3B0aW5kID8gb3B0aW5kIDogMTsKLQotICAgICAgYyA9IGdldG9wdCAoYXJnYywgYXJndiwgImFiYzpkOjAxMjM0NTY3ODkiKTsKLSAgICAgIGlmIChjID09IC0xKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCWNhc2UgJzcnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCSAgaWYgKGRpZ2l0X29wdGluZCAhPSAwICYmIGRpZ2l0X29wdGluZCAhPSB0aGlzX29wdGlvbl9vcHRpbmQpCi0JICAgIHByaW50ZiAoImRpZ2l0cyBvY2N1ciBpbiB0d28gZGlmZmVyZW50IGFyZ3YtZWxlbWVudHMuXG4iKTsKLQkgIGRpZ2l0X29wdGluZCA9IHRoaXNfb3B0aW9uX29wdGluZDsKLQkgIHByaW50ZiAoIm9wdGlvbiAlY1xuIiwgYyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2EnOgotCSAgcHJpbnRmICgib3B0aW9uIGFcbiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdiJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBiXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYyc6Ci0JICBwcmludGYgKCJvcHRpb24gYyB3aXRoIHZhbHVlIGAlcydcbiIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJz8nOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcHJpbnRmICgiPz8gZ2V0b3B0IHJldHVybmVkIGNoYXJhY3RlciBjb2RlIDAlbyA/P1xuIiwgYyk7Ci0JfQotICAgIH0KLQotICBpZiAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBwcmludGYgKCJub24tb3B0aW9uIEFSR1YtZWxlbWVudHM6ICIpOwotICAgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpCi0JcHJpbnRmICgiJXMgIiwgYXJndltvcHRpbmQrK10pOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0KLSAgZXhpdCAoMCk7Ci19Ci0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZ2V0b3B0MS5jIGIvbGliaWJlcnR5L2dldG9wdDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNTczNy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZ2V0b3B0MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qIGdldG9wdF9sb25nIGFuZCBnZXRvcHRfbG9uZ19vbmx5IGVudHJ5IHBvaW50cyBmb3IgR05VIGdldG9wdC4KLSAgIENvcHlyaWdodCAoQykgMTk4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5Niw5Nyw5OAotICAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLSAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQwKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaWYgIWRlZmluZWQgX19TVERDX18gfHwgIV9fU1REQ19fCi0vKiBUaGlzIGlzIGEgc2VwYXJhdGUgY29uZGl0aW9uYWwgc2luY2Ugc29tZSBzdGRjIHN5c3RlbXMKLSAgIHJlamVjdCBgZGVmaW5lZCAoY29uc3QpJy4gICovCi0jaWZuZGVmIGNvbnN0Ci0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90Ci0gICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLiAgVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIEdOVSBDCi0gICBMaWJyYXJ5LCBidXQgYWxzbyBpbmNsdWRlZCBpbiBtYW55IG90aGVyIEdOVSBkaXN0cmlidXRpb25zLiAgQ29tcGlsaW5nCi0gICBhbmQgbGlua2luZyBpbiB0aGlzIGNvZGUgaXMgYSB3YXN0ZSB3aGVuIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5Ci0gICAoZXNwZWNpYWxseSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5KS4gIFJhdGhlciB0aGFuIGhhdmluZyBldmVyeSBHTlUKLSAgIHByb2dyYW0gdW5kZXJzdGFuZCBgY29uZmlndXJlIC0td2l0aC1nbnUtbGliYycgYW5kIG9taXQgdGhlIG9iamVjdCBmaWxlcywKLSAgIGl0IGlzIHNpbXBsZXIgdG8ganVzdCBkbyB0aGlzIGluIHRoZSBzb3VyY2UgZm9yIGVhY2ggc3VjaCBmaWxlLiAgKi8KLQotI2RlZmluZSBHRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04gMgotI2lmICFkZWZpbmVkIF9MSUJDICYmIGRlZmluZWQgX19HTElCQ19fICYmIF9fR0xJQkNfXyA+PSAyCi0jaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+Ci0jaWYgX0dOVV9HRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04gPT0gR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OCi0jZGVmaW5lIEVMSURFX0NPREUKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRUxJREVfQ09ERQotCi0KLS8qIFRoaXMgbmVlZHMgdG8gY29tZSBhZnRlciBzb21lIGxpYnJhcnkgI2luY2x1ZGUKLSAgIHRvIGdldCBfX0dOVV9MSUJSQVJZX18gZGVmaW5lZC4gICovCi0jaWZkZWYgX19HTlVfTElCUkFSWV9fCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmbmRlZglOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLWludAotZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdGlvbnM7Ci0gICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdfb3B0aW9uczsKLSAgICAgaW50ICpvcHRfaW5kZXg7Ci17Ci0gIHJldHVybiBfZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCwgMCk7Ci19Ci0KLS8qIExpa2UgZ2V0b3B0X2xvbmcsIGJ1dCAnLScgYXMgd2VsbCBhcyAnLS0nIGNhbiBpbmRpY2F0ZSBhIGxvbmcgb3B0aW9uLgotICAgSWYgYW4gb3B0aW9uIHRoYXQgc3RhcnRzIHdpdGggJy0nIChub3QgJy0tJykgZG9lc24ndCBtYXRjaCBhIGxvbmcgb3B0aW9uLAotICAgYnV0IGRvZXMgbWF0Y2ggYSBzaG9ydCBvcHRpb24sIGl0IGlzIHBhcnNlZCBhcyBhIHNob3J0IG9wdGlvbgotICAgaW5zdGVhZC4gICovCi0KLWludAotZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICpjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqb3B0aW9uczsKLSAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ19vcHRpb25zOwotICAgICBpbnQgKm9wdF9pbmRleDsKLXsKLSAgcmV0dXJuIF9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4LCAxKTsKLX0KLQotCi0jZW5kaWYJLyogTm90IEVMSURFX0NPREUuICAqLwotDAotI2lmZGVmIFRFU1QKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgaW50IGRpZ2l0X29wdGluZCA9IDA7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IHRoaXNfb3B0aW9uX29wdGluZCA9IG9wdGluZCA/IG9wdGluZCA6IDE7Ci0gICAgICBpbnQgb3B0aW9uX2luZGV4ID0gMDsKLSAgICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLSAgICAgIHsKLQl7ImFkZCIsIDEsIDAsIDB9LAotCXsiYXBwZW5kIiwgMCwgMCwgMH0sCi0JeyJkZWxldGUiLCAxLCAwLCAwfSwKLQl7InZlcmJvc2UiLCAwLCAwLCAwfSwKLQl7ImNyZWF0ZSIsIDAsIDAsIDB9LAotCXsiZmlsZSIsIDEsIDAsIDB9LAotCXswLCAwLCAwLCAwfQotICAgICAgfTsKLQotICAgICAgYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYWJjOmQ6MDEyMzQ1Njc4OSIsCi0JCSAgICAgICBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOwotICAgICAgaWYgKGMgPT0gLTEpCi0JYnJlYWs7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAwOgotCSAgcHJpbnRmICgib3B0aW9uICVzIiwgbG9uZ19vcHRpb25zW29wdGlvbl9pbmRleF0ubmFtZSk7Ci0JICBpZiAob3B0YXJnKQotCSAgICBwcmludGYgKCIgd2l0aCBhcmcgJXMiLCBvcHRhcmcpOwotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JY2FzZSAnMyc6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnNic6Ci0JY2FzZSAnNyc6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnOSc6Ci0JICBpZiAoZGlnaXRfb3B0aW5kICE9IDAgJiYgZGlnaXRfb3B0aW5kICE9IHRoaXNfb3B0aW9uX29wdGluZCkKLQkgICAgcHJpbnRmICgiZGlnaXRzIG9jY3VyIGluIHR3byBkaWZmZXJlbnQgYXJndi1lbGVtZW50cy5cbiIpOwotCSAgZGlnaXRfb3B0aW5kID0gdGhpc19vcHRpb25fb3B0aW5kOwotCSAgcHJpbnRmICgib3B0aW9uICVjXG4iLCBjKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYSc6Ci0JICBwcmludGYgKCJvcHRpb24gYVxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2InOgotCSAgcHJpbnRmICgib3B0aW9uIGJcbiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdjJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBjIHdpdGggdmFsdWUgYCVzJ1xuIiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6Ci0JICBwcmludGYgKCJvcHRpb24gZCB3aXRoIHZhbHVlIGAlcydcbiIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJz8nOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcHJpbnRmICgiPz8gZ2V0b3B0IHJldHVybmVkIGNoYXJhY3RlciBjb2RlIDAlbyA/P1xuIiwgYyk7Ci0JfQotICAgIH0KLQotICBpZiAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBwcmludGYgKCJub24tb3B0aW9uIEFSR1YtZWxlbWVudHM6ICIpOwotICAgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpCi0JcHJpbnRmICgiJXMgIiwgYXJndltvcHRpbmQrK10pOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0KLSAgZXhpdCAoMCk7Ci19Ci0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZ2V0cGFnZXNpemUuYyBiL2xpYmliZXJ0eS9nZXRwYWdlc2l6ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjRkNmMwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRwYWdlc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogRW11bGF0aW9uIG9mIGdldHBhZ2VzaXplKCkgZm9yIHN5c3RlbXMgdGhhdCBuZWVkIGl0LiAqLwotCi0vKgotCi1OQU1FCi0KLQlnZXRwYWdlc2l6ZSAtLSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBwYWdlIG9mIG1lbW9yeQotCi1TWU5PUFNJUwotCi0JaW50IGdldHBhZ2VzaXplICh2b2lkKQotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgcGFnZSBvZiBtZW1vcnkuICBUaGlzIGlzIHRoZQotCWdyYW51bGFyaXR5IG9mIG1hbnkgb2YgdGhlIHN5c3RlbSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcy4KLQlObyBndWFyYW50ZWUgaXMgbWFkZSBhcyB0byB3aGV0aGVyIG9yIG5vdCBpdCBpcyB0aGUgc2FtZSBhcyB0aGUKLQliYXNpYyBtZW1vcnkgbWFuYWdlbWVudCBoYXJkd2FyZSBwYWdlIHNpemUuCi0KLUJVR1MKLQotCUlzIGludGVuZGVkIGFzIGEgcmVhc29uYWJsZSByZXBsYWNlbWVudCBmb3Igc3lzdGVtcyB3aGVyZSB0aGlzCi0JaXMgbm90IHByb3ZpZGVkIGFzIGEgc3lzdGVtIGNhbGwuICBUaGUgdmFsdWUgb2YgNDA5NiBtYXkgb3IgbWF5Ci0Jbm90IGJlIGNvcnJlY3QgZm9yIHRoZSBzeXN0ZW1zIHdoZXJlIGl0IGlzIHJldHVybmVkIGFzIHRoZSBkZWZhdWx0Ci0JdmFsdWUuCi0KLSovCi0KLSNpZm5kZWYgVk1TCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotCi0jdW5kZWYgR05VX09VUl9QQUdFU0laRQotI2lmIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgJiYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpZmRlZiBfU0NfUEFHRVNJWkUKLSNkZWZpbmUgR05VX09VUl9QQUdFU0laRSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgR05VX09VUl9QQUdFU0laRQotIyBpZmRlZglQQUdFU0laRQotIyAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgUEFHRVNJWkUKLSMgZWxzZQkvKiBubyBQQUdFU0laRSAqLwotIyAgaWZkZWYJRVhFQ19QQUdFU0laRQotIyAgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIEVYRUNfUEFHRVNJWkUKLSMgIGVsc2UJLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgIGlmZGVmCU5CUEcKLSMgICAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgKE5CUEcgKiBDTFNJWkUpCi0jICAgIGlmbmRlZglDTFNJWkUKLSMgICAgIGRlZmluZQlDTFNJWkUgMQotIyAgICBlbmRpZgkvKiBDTFNJWkUgKi8KLSMgICBlbHNlCS8qIG5vIE5CUEcgKi8KLSMgICAgaWZkZWYJTkJQQwotIyAgICAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgTkJQQwotIyAgICBlbHNlCS8qIG5vIE5CUEMgKi8KLSMgICAgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIDQwOTYJLyogSnVzdCBwdW50IGFuZCB1c2UgcmVhc29uYWJsZSB2YWx1ZSAqLwotIyAgICBlbmRpZiAvKiBOQlBDICovCi0jICAgZW5kaWYgLyogTkJQRyAqLwotIyAgZW5kaWYgLyogRVhFQ19QQUdFU0laRSAqLwotIyBlbmRpZiAvKiBQQUdFU0laRSAqLwotI2VuZGlmIC8qIEdOVV9PVVJfUEFHRVNJWkUgKi8KLQotaW50Ci1nZXRwYWdlc2l6ZSAoKQotewotICByZXR1cm4gKEdOVV9PVVJfUEFHRVNJWkUpOwotfQotCi0jZWxzZSAvKiBWTVMgKi8KLQotI2lmIDAJLyogb2xkZXIgZGlzdHJpYnV0aW9ucyBvZiBnY2Mtdm1zIGFyZSBtaXNzaW5nIDxzeWlkZWYuaD4gKi8KLSNpbmNsdWRlIDxzeWlkZWYuaD4KLSNlbmRpZgotI2lmbmRlZiBTWUkkX1BBR0VfU0laRQkvKiBWTVMgVjUuNCBhbmQgZWFybGllciBkaWRuJ3QgaGF2ZSB0aGlzIHlldCAqLwotI2RlZmluZSBTWUkkX1BBR0VfU0laRSA0NDUyCi0jZW5kaWYKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxpYiRnZXRzeWkoY29uc3QgdW5zaWduZWQgc2hvcnQgKiwuLi4pOwotCi1pbnQgZ2V0cGFnZXNpemUgKCkKLXsKLSAgbG9uZyBwYWdzaXogPSAwTDsKLSAgdW5zaWduZWQgc2hvcnQgaXRtY29kID0gU1lJJF9QQUdFX1NJWkU7Ci0KLSAgKHZvaWQpIGxpYiRnZXRzeWkgKCZpdG1jb2QsICh2b2lkICopICZwYWdzaXopOwotICBpZiAocGFnc2l6ID09IDBMKQotICAgIHBhZ3NpeiA9IDUxMkw7CS8qIFZBWCBkZWZhdWx0ICovCi0gIHJldHVybiAoaW50KSBwYWdzaXo7Ci19Ci0KLSNlbmRpZiAvKiBWTVMgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRydW50aW1lLmMgYi9saWJpYmVydHkvZ2V0cnVudGltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODU1ZWE2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRydW50aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiBSZXR1cm4gdGltZSB1c2VkIHNvIGZhciwgaW4gbWljcm9zZWNvbmRzLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotLyogVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBnZXQgZWxhcHNlZCBleGVjdXRpb24gdGltZTsgdW5mb3J0dW5hdGVseSBubwotICAgc2luZ2xlIHdheSBpcyBhdmFpbGFibGUgZm9yIGFsbCBob3N0IHN5c3RlbXMsIG5vciBhcmUgdGhlcmUgcmVsaWFibGUKLSAgIHdheXMgdG8gZmluZCBvdXQgd2hpY2ggd2F5IGlzIGNvcnJlY3QgZm9yIGEgZ2l2ZW4gaG9zdC4gKi8KLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfR0VUUlVTQUdFKSAmJiBkZWZpbmVkIChIQVZFX1NZU19SRVNPVVJDRV9IKQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVElNRVMKLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgYSBmYWxsYmFjazsgaWYgd3JvbmcsIGl0IHdpbGwgbGlrZWx5IG1ha2Ugb2J2aW91c2x5IHdyb25nCi0gICByZXN1bHRzLiAqLwotCi0jaWZuZGVmIENMT0NLU19QRVJfU0VDCi0jZGVmaW5lIENMT0NLU19QRVJfU0VDIDEKLSNlbmRpZgotCi0jaWZkZWYgX1NDX0NMS19UQ0sKLSNkZWZpbmUgR05VX0haICBzeXNjb25mKF9TQ19DTEtfVENLKQotI2Vsc2UKLSNpZmRlZiBIWgotI2RlZmluZSBHTlVfSFogIEhaCi0jZWxzZQotI2lmZGVmIENMT0NLU19QRVJfU0VDCi0jZGVmaW5lIEdOVV9IWiAgQ0xPQ0tTX1BFUl9TRUMKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotbG9uZwotZ2V0X3J1bl90aW1lICgpCi17Ci0jaWYgZGVmaW5lZCAoSEFWRV9HRVRSVVNBR0UpICYmIGRlZmluZWQgKEhBVkVfU1lTX1JFU09VUkNFX0gpCi0gIHN0cnVjdCBydXNhZ2UgcnVzYWdlOwotCi0gIGdldHJ1c2FnZSAoMCwgJnJ1c2FnZSk7Ci0gIHJldHVybiAocnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfdXRpbWUudHZfdXNlYwotCSAgKyBydXNhZ2UucnVfc3RpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV9zdGltZS50dl91c2VjKTsKLSNlbHNlIC8qICEgSEFWRV9HRVRSVVNBR0UgKi8KLSNpZmRlZiBIQVZFX1RJTUVTCi0gIHN0cnVjdCB0bXMgdG1zOwotCi0gIHRpbWVzICgmdG1zKTsKLSAgcmV0dXJuICh0bXMudG1zX3V0aW1lICsgdG1zLnRtc19zdGltZSkgKiAoMTAwMDAwMCAvIEdOVV9IWik7Ci0jZWxzZSAvKiAhIEhBVkVfVElNRVMgKi8KLSAgLyogRmFsbCBiYWNrIG9uIGNsb2NrIGFuZCBob3BlIGl0J3MgY29ycmVjdGx5IGltcGxlbWVudGVkLiAqLwotICBjb25zdCBsb25nIGNsb2Nrc19wZXJfc2VjID0gQ0xPQ0tTX1BFUl9TRUM7Ci0gIGlmIChjbG9ja3NfcGVyX3NlYyA8PSAxMDAwMDAwKQotICAgIHJldHVybiBjbG9jayAoKSAqICgxMDAwMDAwIC8gY2xvY2tzX3Blcl9zZWMpOwotICBlbHNlCi0gICAgcmV0dXJuIGNsb2NrICgpIC8gY2xvY2tzX3Blcl9zZWM7Ci0jZW5kaWYgIC8qIEhBVkVfVElNRVMgKi8KLSNlbmRpZiAgLyogSEFWRV9HRVRSVVNBR0UgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9oZXguYyBiL2xpYmliZXJ0eS9oZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyZWVmMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvaGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBIZXggY2hhcmFjdGVyIG1hbmlwdWxhdGlvbiBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1jaGFyIF9oZXhfdmFsdWVbX2hleF9hcnJheV9zaXplXTsKLQotdm9pZCBoZXhfaW5pdCAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IF9oZXhfYXJyYXlfc2l6ZTsgaSsrKQotICAgIF9oZXhfdmFsdWVbaV0gPSBfaGV4X2JhZDsKLSAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCi0gICAgX2hleF92YWx1ZVsnMCcgKyBpXSA9IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgX2hleF92YWx1ZVsnYScgKyBpXSA9IF9oZXhfdmFsdWVbJ0EnICsgaV0gPSAxMCArIGk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvaW5kZXguYyBiL2xpYmliZXJ0eS9pbmRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEwMGY1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9pbmRleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogU3R1YiBpbXBsZW1lbnRhdGlvbiBvZiAob2Jzb2xldGUpIGluZGV4KCkuICovCi0KLWV4dGVybiBjaGFyICogc3RyY2hyKCk7Ci0KLWNoYXIgKgotaW5kZXggKHMsIGMpCi0gIGNoYXIgKnM7Ci0gIGludCBjOwotewotICByZXR1cm4gc3RyY2hyIChzLCBjKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9pbnNxdWUuYyBiL2xpYmliZXJ0eS9pbnNxdWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1MDE5Zi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvaW5zcXVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBpbnNxdWUoM0MpIHJvdXRpbmVzCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCWluc3F1ZSwgcmVtcXVlIC0tIGluc2VydCwgcmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHF1ZXVlCi0KLVNZTk9QU0lTCi0Jc3RydWN0IHFlbGVtIHsKLQkgIHN0cnVjdCBxZWxlbSAqcV9mb3J3OwotCSAgc3RydWN0IHFlbGVtICpxX2JhY2s7Ci0JICBjaGFyIHFfZGF0YVtdOwotCX07Ci0KLQl2b2lkIGluc3F1ZSAoc3RydWN0IHFlbGVtICplbGVtLCBzdHJ1Y3QgcWVsZW0gKnByZWQpCi0KLQl2b2lkIHJlbXF1ZSAoc3RydWN0IHFlbGVtICplbGVtKQotCi1ERVNDUklQVElPTgotCVJvdXRpbmVzIHRvIG1hbmlwdWxhdGUgcXVldWVzIGJ1aWx0IGZyb20gZG91Ymx5IGxpbmtlZCBsaXN0cy4KLQlUaGUgaW5zcXVlIHJvdXRpbmUgaW5zZXJ0cyBFTEVNIGluIHRoZSBxdWV1ZSBpbW1lZGlhdGVseSBhZnRlcgotCVBSRUQuICBUaGUgcmVtcXVlIHJvdXRpbmUgcmVtb3ZlcyBFTEVNIGZyb20gaXRzIGNvbnRhaW5pbmcgcXVldWUuCi0qLwotCi0KLXN0cnVjdCBxZWxlbSB7Ci0gIHN0cnVjdCBxZWxlbSAqcV9mb3J3OwotICBzdHJ1Y3QgcWVsZW0gKnFfYmFjazsKLX07Ci0KLQotdm9pZAotaW5zcXVlIChlbGVtLCBwcmVkKQotICBzdHJ1Y3QgcWVsZW0gKmVsZW07Ci0gIHN0cnVjdCBxZWxlbSAqcHJlZDsKLXsKLSAgZWxlbSAtPiBxX2ZvcncgPSBwcmVkIC0+IHFfZm9ydzsKLSAgcHJlZCAtPiBxX2ZvcncgLT4gcV9iYWNrID0gZWxlbTsKLSAgZWxlbSAtPiBxX2JhY2sgPSBwcmVkOwotICBwcmVkIC0+IHFfZm9ydyA9IGVsZW07Ci19Ci0KLQotdm9pZAotcmVtcXVlIChlbGVtKQotICBzdHJ1Y3QgcWVsZW0gKmVsZW07Ci17Ci0gIGVsZW0gLT4gcV9mb3J3IC0+IHFfYmFjayA9IGVsZW0gLT4gcV9iYWNrOwotICBlbGVtIC0+IHFfYmFjayAtPiBxX2ZvcncgPSBlbGVtIC0+IHFfZm9ydzsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tYWtlZmlsZS5kb3MgYi9saWJpYmVydHkvbWFrZWZpbGUuZG9zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJhNjJjLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tYWtlZmlsZS5kb3MKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1DRkxBR1M9LU8yCi0KLU9CSlMgPSBcCi0JYXJndi5vIFwKLQliYXNlbmFtZS5vIFwKLQljb25jYXQubyBcCi0JY3BsdXMtZGVtLm8gXAotCWZkbWF0Y2gubyBcCi0JZmxvYXRmb3JtYXQubyBcCi0JZ2V0b3B0Lm8gXAotCWdldG9wdDEubyBcCi0JZ2V0cnVudGltZS5vIFwKLQloZXgubyBcCi0JbXNkb3MubyBcCi0Jb2JzdGFjay5vIFwKLQlzcGFjZXMubyBcCi0Jc3RyZXJyb3IubyBcCi0Jc3Ryc2lnbmFsLm8gXAotCXhhdGV4aXQubyBcCi0JeGV4aXQubyBcCi0JeG1hbGxvYy5vIFwKLQkkRQotCi0uYy5vOgotCWdjYyAtSS4uL2luY2x1ZGUgJChDRkxBR1MpIC1jICQ8Ci0KLWxpYmliZXJ0eS5hIDogJChPQkpTKQotCS1ybSBsaWJpYmVydHkuYQotCWFyIHJ2cyBsaWJpYmVydHkuYSAkKE9CSlMpCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWFrZWZpbGUudm1zIGIvbGliaWJlcnR5L21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxYjUxMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgbGliaWJlcnR5IHVuZGVyIG9wZW5WTVMvQWxwaGEKLSMKLSMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcHJvZ2lzLmRlCi0jCi0jCi0KLU9CSlM9YmNvcHkub2JqLGJjbXAub2JqLGdldG9wdC5vYmosb2JzdGFjay5vYmoseGV4aXQub2JqLHhtYWxsb2Mub2JqLGhleC5vYmosXAotICAgZ2V0b3B0MS5vYmosY3BsdXMtZGVtLm9iaixzdHJuY2FzZWNtcC5vYmosc3RyY2FzZWNtcC5vYmosc3RyZHVwLm9iaixcCi0gICBjb25jYXQub2JqLGdldHJ1bnRpbWUub2JqLGdldHBhZ2VzaXplLm9iaixhbGxvY2Eub2JqLHhzdHJlcnJvci5vYmosXAotICAgeHN0cmR1cC5vYmoseGF0ZXhpdC5vYmosY2hvb3NlLXRlbXAub2JqLGZubWF0Y2gub2JqLG9iamFsbG9jLm9iagotCi1pZmVxICgkKENDKSxnY2MpCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKQotZWxzZQotIyBhc3N1bWUgZGVjIGMKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pL2RlZmluZT0oImNvbnN0PSIpL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jKQotZW5kaWYKLQotbGliaWJlcnR5Lm9sYjogY29uZmlnLmggYWxsb2NhLWNvbmYuaCAkKE9CSlMpCi0JcHVyZ2UKLQlsaWIvY3JlYXRlIGxpYmliZXJ0eSAqLm9iagotCi1jb25maWcuaDogY29uZmlnLmgtdm1zCi0JJChDUCkgJDwgJEAKLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSBjb25maWcuaDsKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSBsaWJpYmVydHkub2xiOwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbWNoci5jIGIvbGliaWJlcnR5L21lbWNoci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UzMDAzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1jaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi1GVU5DVElPTgotCTw8bWVtY2hyPj4tLS1maW5kIGNoYXJhY3RlciBpbiBtZW1vcnkKLQotSU5ERVgKLQltZW1jaHIKLQotQU5TSV9TWU5PUFNJUwotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQl2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqPFtzcmNdPiwgaW50IDxbY10+LCBzaXplX3QgPFtsZW5ndGhdPik7Ci0KLVRSQURfU1lOT1BTSVMKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0Jdm9pZCAqbWVtY2hyKDxbc3JjXT4sIDxbY10+LCA8W2xlbmd0aF0+KQotCXZvaWQgKjxbc3JjXT47Ci0Jdm9pZCAqPFtjXT47Ci0Jc2l6ZV90IDxbbGVuZ3RoXT47Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBtZW1vcnkgc3RhcnRpbmcgYXQgPDwqPFtzcmNdPj4+IGZvciB0aGUKLQljaGFyYWN0ZXIgPFtjXT4uICBUaGUgc2VhcmNoIG9ubHkgZW5kcyB3aXRoIHRoZSBmaXJzdAotCW9jY3VycmVuY2Ugb2YgPFtjXT4sIG9yIGFmdGVyIDxbbGVuZ3RoXT4gY2hhcmFjdGVyczsgaW4KLQlwYXJ0aWN1bGFyLCA8PE5VTEw+PiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIHNlYXJjaC4KLQotUkVUVVJOUwotCUlmIHRoZSBjaGFyYWN0ZXIgPFtjXT4gaXMgZm91bmQgd2l0aGluIDxbbGVuZ3RoXT4gY2hhcmFjdGVycwotCW9mIDw8Kjxbc3JjXT4+PiwgYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgaXMgcmV0dXJuZWQuIElmCi0JPFtjXT4gaXMgbm90IGZvdW5kLCB0aGVuIDw8TlVMTD4+IGlzIHJldHVybmVkLiAJCi0KLVBPUlRBQklMSVRZCi08PG1lbWNocj4+ICByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgotCi1RVUlDS1JFRgotCW1lbWNociBhbnNpIHB1cmUKLQotKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotUFRSCi1tZW1jaHIgKHNyY192b2lkLCBjLCBsZW5ndGgpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IFBUUiBzcmNfdm9pZDsKLSAgICAgaW50IGM7Ci0gICAgIHNpemVfdCBsZW5ndGg7Ci17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjX3ZvaWQ7Ci0gIAotICB3aGlsZSAoLS1sZW5ndGggPj0gMCkKLSAgewotICAgIGlmICgqc3JjID09IGMpCi0gICAgIHJldHVybiAoUFRSKXNyYzsKLSAgICBzcmMrKzsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jbXAuYyBiL2xpYmliZXJ0eS9tZW1jbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3YWUwYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBtZW1jbXAgLS0gY29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQltZW1jbXAgLS0gY29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMKLQotU1lOT1BTSVMKLQlpbnQgbWVtY21wIChjb25zdCB2b2lkICpmcm9tLCBjb25zdCB2b2lkICp0bywgc2l6ZV90IGNvdW50KQotCi1ERVNDUklQVElPTgotCUNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zIGFuZCByZXR1cm4gbGVzcyB0aGFuLAotCWVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybywgYWNjb3JkaW5nIHRvIGxleGljb2dyYXBoaWNhbAotCW9yZGVyaW5nIG9mIHRoZSBjb21wYXJlZCByZWdpb25zLgotKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotaW50Ci1ERUZVTihtZW1jbXAsIChzdHIxLCBzdHIyLCBjb3VudCksCi0gICAgICBjb25zdCBQVFIgc3RyMSBBTkQgY29uc3QgUFRSIHN0cjIgQU5EIHNpemVfdCBjb3VudCkKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczEgPSAodW5zaWduZWQgY2hhciopc3RyMTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczIgPSAodW5zaWduZWQgY2hhciopc3RyMjsKLQotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgewotICAgICAgaWYgKCpzMSsrICE9ICpzMisrKQotCSAgcmV0dXJuIHMxWy0xXSA8IHMyWy0xXSA/IC0xIDogMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtY3B5LmMgYi9saWJpYmVydHkvbWVtY3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwN2E5ZjUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbWNweS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogbWVtY3B5ICh0aGUgc3RhbmRhcmQgQyBmdW5jdGlvbikKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCW1lbWNweSAtLSBjb3B5IG1lbW9yeSByZWdpb25zIG9mIGFyYml0YXJ5IGxlbmd0aAotCi1TWU5PUFNJUwotCXZvaWQqIG1lbWNweSAodm9pZCAqb3V0LCBjb25zdCB2b2lkICppbiwgc2l6ZV90IG4pOwotCi1ERVNDUklQVElPTgotCUNvcHkgTEVOR1RIIGJ5dGVzIGZyb20gbWVtb3J5IHJlZ2lvbiBwb2ludGVkIHRvIGJ5IElOIHRvIG1lbW9yeQotCXJlZ2lvbiBwb2ludGVkIHRvIGJ5IE9VVC4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotREVGVU4obWVtY3B5LCAob3V0LCBpbiwgbGVuZ3RoKSwgUFRSIG91dCBBTkQgY29uc3QgUFRSIGluIEFORCBzaXplX3QgbGVuZ3RoKQotewotICAgIGJjb3B5KGluLCBvdXQsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIG91dDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1tb3ZlLmMgYi9saWJpYmVydHkvbWVtbW92ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzZjMzI2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1tb3ZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBXcmFwcGVyIHRvIGltcGxlbWVudCBBTlNJIEMncyBtZW1tb3ZlIHVzaW5nIEJTRCdzIGJjb3B5LiAqLwotLyogVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIC0tUGVyIEJvdGhuZXIuICovCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLW1lbW1vdmUgKHMxLCBzMiwgbikKLSAgICAgUFRSIHMxOwotICAgICBjb25zdCBQVFIgczI7Ci0gICAgIHNpemVfdCBuOwotewotICBiY29weSAoczIsIHMxLCBuKTsKLSAgcmV0dXJuIHMxOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbXNldC5jIGIvbGliaWJlcnR5L21lbXNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjU0ODMxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1zZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIG1lbXNldAotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotREVGVU4obWVtc2V0LCAoZGVzdCwgdmFsLCBsZW4pLAotICAgICAgUFRSIGRlc3QgQU5EIHJlZ2lzdGVyIGludCB2YWwgQU5EIHJlZ2lzdGVyIHNpemVfdCBsZW4pCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyKilkZXN0OwotICB3aGlsZSAobGVuLS0gPiAwKQotICAgICpwdHIrKyA9IHZhbDsKLSAgcmV0dXJuIGRlc3Q7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWtzdGVtcHMuYyBiL2xpYmliZXJ0eS9ta3N0ZW1wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmMxNmEyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9ta3N0ZW1wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gbWtzdGVtcC5jIGZyb20gdGhlIEdOVSBDIExpYnJhcnkuCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi0gICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogV2UgbmVlZCB0byBwcm92aWRlIGEgdHlwZSBmb3IgZ2NjX3VpbnQ2NF90LiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZ2NjX3VpbnQ2NF90OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBnY2NfdWludDY0X3Q7Ci0jZW5kaWYKLQotI2lmbmRlZiBUTVBfTUFYCi0jZGVmaW5lIFRNUF9NQVggMTYzODQKLSNlbmRpZgotCi0vKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZSBuYW1lIGZyb20gVEVNUExBVEUuCi0KLSAgIFRFTVBMQVRFIGhhcyB0aGUgZm9ybToKLQotICAgPHBhdGg+L2NjWFhYWFhYPHN1ZmZpeD4KLQotICAgU1VGRklYX0xFTiB0ZWxscyB1cyBob3cgbG9uZyA8c3VmZml4PiBpcyAoaXQgY2FuIGJlIHplcm8gbGVuZ3RoKS4KLQotICAgVGhlIGxhc3Qgc2l4IGNoYXJhY3RlcnMgb2YgVEVNUExBVEUgYmVmb3JlIDxzdWZmaXg+IG11c3QgYmUgIlhYWFhYWCI7Ci0gICB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGZpbGVuYW1lIHVuaXF1ZS4KLQotICAgUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBvcGVuIG9uIHRoZSBmaWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiAgKi8KLWludAotbWtzdGVtcHMgKHRlbXBsYXRlLCBzdWZmaXhfbGVuKQotICAgICBjaGFyICp0ZW1wbGF0ZTsKLSAgICAgaW50IHN1ZmZpeF9sZW47Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGxldHRlcnNbXQotICAgID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IjsKLSAgc3RhdGljIGdjY191aW50NjRfdCB2YWx1ZTsKLSNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICBzdHJ1Y3QgdGltZXZhbCB0djsKLSNlbmRpZgotICBjaGFyICpYWFhYWFg7Ci0gIHNpemVfdCBsZW47Ci0gIGludCBjb3VudDsKLQotICBsZW4gPSBzdHJsZW4gKHRlbXBsYXRlKTsKLQotICBpZiAoKGludCkgbGVuIDwgNiArIHN1ZmZpeF9sZW4KLSAgICAgIHx8IHN0cm5jbXAgKCZ0ZW1wbGF0ZVtsZW4gLSA2IC0gc3VmZml4X2xlbl0sICJYWFhYWFgiLCA2KSkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIFhYWFhYWCA9ICZ0ZW1wbGF0ZVtsZW4gLSA2IC0gc3VmZml4X2xlbl07Ci0KLSNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICAvKiBHZXQgc29tZSBtb3JlIG9yIGxlc3MgcmFuZG9tIGRhdGEuICAqLwotICBnZXR0aW1lb2ZkYXkgKCZ0diwgTlVMTCk7Ci0gIHZhbHVlICs9ICgoZ2NjX3VpbnQ2NF90KSB0di50dl91c2VjIDw8IDE2KSBeIHR2LnR2X3NlYyBeIGdldHBpZCAoKTsKLSNlbHNlCi0gIHZhbHVlICs9IGdldHBpZCAoKTsKLSNlbmRpZgotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IFRNUF9NQVg7ICsrY291bnQpCi0gICAgewotICAgICAgZ2NjX3VpbnQ2NF90IHYgPSB2YWx1ZTsKLSAgICAgIGludCBmZDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgcmFuZG9tIGJpdHMuICAqLwotICAgICAgWFhYWFhYWzBdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFsxXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbMl0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzNdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFs0XSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbNV0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0KLSAgICAgIGZkID0gb3BlbiAodGVtcGxhdGUsIE9fUkRXUnxPX0NSRUFUfE9fRVhDTCwgMDYwMCk7Ci0gICAgICBpZiAoZmQgPj0gMCkKLQkvKiBUaGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gICovCi0JcmV0dXJuIGZkOwotCi0gICAgICAvKiBUaGlzIGlzIGEgcmFuZG9tIHZhbHVlLiAgSXQgaXMgb25seSBuZWNlc3NhcnkgdGhhdCB0aGUgbmV4dAotCSBUTVBfTUFYIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYWRkaW5nIDc3NzcgdG8gVkFMVUUgYXJlIGRpZmZlcmVudAotCSB3aXRoIChtb2R1bGUgMl4zMikuICAqLwotICAgICAgdmFsdWUgKz0gNzc3NzsKLSAgICB9Ci0KLSAgLyogV2UgcmV0dXJuIHRoZSBudWxsIHN0cmluZyBpZiB3ZSBjYW4ndCBmaW5kIGEgdW5pcXVlIGZpbGUgbmFtZS4gICovCi0gIHRlbXBsYXRlWzBdID0gJ1wwJzsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21wdy1jb25maWcuaW4gYi9saWJpYmVydHkvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyMTgwMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBNUFcgY29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgbGliaWJlcnR5LgotCi1FY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKLQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXB3LW1ha2Uuc2VkIGIvbGliaWJlcnR5L21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyYTVlNy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIGxpYmliZXJ0eSdzIFVuaXggbWFrZWZpbGUgdG8gTVBXIHN5bnRheC4KLQotIyBDb21tZW50IG91dCBhIHVzZWxlc3MgdGhpbmcuCi0vXlwuYWx3YXlzXC4vcy9eLyMvCi0KLSMgUmVwbGFjZSB0aGUgYXV0by1nZW5lcmF0ZWQgbGlzdCB3aXRoIHRoZSBsaXN0IG9mIHdoYXQgd2Uga25vdyB3ZSBuZWVkLgotcy9gY2F0IG5lZWRlZC1saXN0YC8ie299ImFsbG9jYS5jLm8gIntvfSJiY29weS5jLm8gIntvfSJnZXRwYWdlc2l6ZS5jLm8gIntvfSJpbnNxdWUuYy5vICJ7b30ibXB3LmMubyAie299InN0cmNhc2VjbXAuYy5vICJ7b30ic3RyZHVwLmMubyAie299InN0cm5jYXNlY21wLmMuby8KLQotIyBQYXN0ZSBpbiBzb21lIGRlc2lyYWJsZSBkZWZpbml0aW9ucy4KLSMgVGhlIGRlZmF1bHQgcnVsZSBoZXJlIGNvbXBsZXRlbHkgcmVwbGFjZXMgdGhlIHRyaWNreSBzdHVmZiBpbiB0aGUgVW5peAotIyBNYWtlZmlsZS5pbi4KLS9eIyMjJC9hXAotXAotSERFRklORVMgPSAtZCBORUVEX3N5c19zaWdsaXN0IC1kIE5FRURfc3lzX2Vycmxpc3QgLWQgTkVFRF9iYXNlbmFtZSAtZCBORUVEX3N0cmNhc2VjbXAgLWQgTkVFRF9zdHJuY2FzZWNtcFwKLUlOQ0xVREVTID0gLWkgOiAtaSB7SU5DRElSfTogLWkge0lOQ0RJUn06bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6IC1pICJ7c30iXAotXAotLmMubyBcXE9wdGlvbi1mIC5jXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7RGVwRGlyfXtEZWZhdWx0fS5jIHtMSUJDRkxBR1N9IHtJTkNMVURFU30ge0hERUZJTkVTfSBAU0VHTUVOVF9GTEFHKHtEZWZhdWx0fSlAIC1vIHtUYXJnRGlyfXtEZWZhdWx0fS5jLm9cCi0KLSMgUmVtb3ZlIGRlcGVuZGVuY3kgb24gbmVlZGVkLWxpc3QsIHdoaWNoIHdlIGRvbid0IHVzZS4KLS9ET19BTFNPID0vcy9uZWVkZWQtbGlzdC8vCi0KLS9JTkNESVI9L3MvIntzcmNkaXJ9IntNVUxUSVNSQ1RPUH06Oi8ie3RvcHNyY2Rpcn0iLwotCi0jIFdoYWNrIG91dCB0aGUgQ09NUElMRS5jIHRyaWNraW5lc3MuCi0vXkNPTVBJTEUuYyAvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBtdWx0aWRvIHRyaWNraW5lc3MgZnJvbSB0aGUgImFsbCIgdGFyZ2V0LgotL15hbGwgXFxPcHRpb24tZi8sL14kL2NcCi1hbGwgXFxPcHRpb24tZiB7VEFSR0VUTElCfVwKLQotCi0jIFJlbW92ZSB0aGUgUlVMRTEvUlVMRTIgY3J1ZC4KLS9pZiBcWy8sL2ZpL2QKLS9eUlVMRTEgPS8sL1JVTEUyID0vZAotL1JVTEUyL3MvUlVMRTIvVEFSR0VUTElCLwotCi0jIERvbid0IHdhbnQgZmRtYXRjaCBldmVyLgotcy8gIntvfSJmZG1hdGNoLmMuby8vCi0KLSMgRml4IHBhdGhzIHRvIGdlbmVyYXRlZCBmaWxlcy4KLS9jb25maWcuaC9zLyJ7c30iY29uZmlnLmgvIntvfSJjb25maWcuaC8KLQotIyBXaGFjayBvdXQgY29uZmlnIHJlYnVpbGQgcnVsZXMuCi0vXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi8sL14kL2QKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tcHcuYyBiL2xpYmliZXJ0eS9tcHcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzYWU0MS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbXB3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEwICswLDAgQEAKLS8qIE1QVy1Vbml4IGNvbXBhdGliaWxpdHkgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgY29tcGlsZWQgYW5kIGxpbmtlZCB1bmRlciBNUFcuICovCi0KLSNpbmNsdWRlICJtcHcuaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNpbmNsdWRlIDxGaWxlcy5oPgotCi0jaW5jbHVkZSA8VGltZXIuaD4KLQotLyogSW5pdGlhbGl6ZSB0byAwIGF0IGZpcnN0LCB0aGVuIHNldCB0byBlcnJub19tYXgoKSBsYXRlci4gICovCi0KLWludCBzeXNfbmVyciA9IDA7Ci0KLS8qIERlYnVnIGZsYWcgZm9yIHBhdGhuYW1lIGhhY2tpbmcuICBTZXQgdGhpcyB0byBvbmUgYW5kIHJlYnVpbGQuICovCi0KLWludCBEZWJ1Z1BJID0gLTE7Ci0KLXZvaWQKLW1wd2lmeV9maWxlbmFtZShjaGFyICp1bml4bmFtZSwgY2hhciAqbWFjbmFtZSkKLXsKLSAgaW50IGksIGo7Ci0KLSAgLyogKHNob3VsZCB0cnVuY2F0ZSAyNTUgY2hhcnMgZnJvbSBlbmQgb2YgbmFtZSwgbm90IGJlZ2lubmluZykgKi8KLSAgaWYgKHN0cmxlbiAodW5peG5hbWUpID4gMjU1KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBhdGhuYW1lIFwiJXNcIiBpcyB0b28gbG9uZyBmb3IgTWFjcywgdHJ1bmNhdGluZ1xuIiwKLQkgICAgICAgdW5peG5hbWUpOwotICAgIH0KLSAgaiA9IDA7Ci0gIC8qIElmIHlvdSdyZSBnb2luZyB0byBlbmQgdXAgd2l0aCBvbmUgb3IgbW9yZSBjb2xvbnMgaW4gdGhlIG1pZGRsZSBvZiBhCi0gICAgIHBhdGggYWZ0ZXIgYW4gYWxsLVVuaXggcmVsYXRpdmUgcGF0aCBpcyB0cmFuc2xhdGVkLCB5b3UgbXVzdCBhZGQgYQotICAgICBjb2xvbiBvbiB0aGUgZnJvbnQsIHNvIHRoYXQgdGhlIGZpcnN0IGNvbXBvbmVudCBpcyBub3QgdGhvdWdodCB0byBiZQotICAgICBhIGRpc2sgbmFtZS4gICovCi0gIGlmICh1bml4bmFtZVswXSAhPSAnLycgJiYgISBzdHJjaHIgKHVuaXhuYW1lLCAnOicpICYmIHN0cmNociAodW5peG5hbWUsICcvJykpCi0gICAgewotICAgICAgbWFjbmFtZVtqKytdID0gJzonOwotICAgIH0KLSAgZm9yIChpID0gMDsgdW5peG5hbWVbaV0gIT0gJ1wwJyAmJiBpIDwgMjU1OyArK2kpCi0gICAgewotICAgICAgaWYgKGkgPT0gMCAmJiB1bml4bmFtZVtpXSA9PSAnLycpCi0JewotCSAgaWYgKHN0cm5jbXAgKHVuaXhuYW1lLCAiL3RtcC8iLCA1KSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQSB0ZW1wb3JhcnkgbmFtZSwgbWFrZSBhIG1vcmUgTWFjLWZsYXZvcmVkIHRtcG5hbWUuICovCi0JICAgICAgLyogQSBiZXR0ZXIgY2hvaWNlIHdvdWxkIGJlIHtCb290fVRyYXNoOmZvbywgYnV0Ci0JCSB0aGF0IHdvdWxkIHJlcXVpcmUgYmVpbmcgYWJsZSB0byBpZGVudGlmeSB0aGUKLQkJIGJvb3QgZGlzaydzIGFuZCB0cmFzaGNhbidzIG5hbWUuICBBbm90aGVyIG9wdGlvbgotCQkgd291bGQgYmUgdG8gaGF2ZSBhbiBlbnYgdmFyLCBzbyB1c2VyIGNhbiBwb2ludCBpdAotCQkgYXQgYSByYW1kaXNrLiAqLwotCSAgICAgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAndCc7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ20nOwotCSAgICAgIG1hY25hbWVbaisrXSA9ICdwJzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAnXyc7Ci0JICAgICAgaSArPSA0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBEb24ndCBjb3B5IHRoZSBsZWFkaW5nIHNsYXNoLiAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJzonICYmIHVuaXhuYW1lW2krMV0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgIGkgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnLicgJiYgdW5peG5hbWVbaSsxXSA9PSAnLycpCi0JewotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgaSArPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICcuJyAmJiB1bml4bmFtZVtpKzFdID09ICcuJyAmJiB1bml4bmFtZVtpKzJdID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBpICs9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWFjbmFtZVtqKytdID0gdW5peG5hbWVbaV07Ci0JfQotICAgIH0KLSAgbWFjbmFtZVtqXSA9ICdcMCc7Ci0gIC8qIEFsbG93IGZvciBnZXR0aW5nIHRoZSBkZWJ1ZyBmbGFnIGZyb20gYW4gZW52IHZhcjsgcXVpdGUgdXNlZnVsLiAqLwotICBpZiAoRGVidWdQSSA8IDApCi0gICAgRGVidWdQSSA9ICgqKGdldGVudiAoIkRFQlVHX1BBVEhOQU1FUyIpKSA9PSAnMScgPyAxIDogMCk7Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgTWFkZSBcIiVzXCJcbiIsIHVuaXhuYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgaW50byBcIiVzXCJcbiIsIG1hY25hbWUpOwotICAgIH0KLX0KLQotLyogTVBXLWZsYXZvcmVkIGJhc2VuYW1lIGZpbmRlci4gKi8KLQotY2hhciAqCi1tcHdfYmFzZW5hbWUgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKmJhc2UgPSBuYW1lOwotCi0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUrKyA9PSAnOicpCi0JewotCSAgYmFzZSA9IG5hbWU7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGJhc2U7Ci19Ci0KLS8qIE1peGVkIE1QVy9Vbml4IGJhc2VuYW1lIGZpbmRlci4gIFRoaXMgY2FuIGJlIGxlZCBhc3RyYXkgYnkKLSAgIGZpbGVuYW1lcyB3aXRoIHNsYXNoZXMgaW4gdGhlbSBhbmQgY29tZSB1cCB3aXRoIGEgYmFzZW5hbWUgdGhhdAotICAgZWl0aGVyIGNvcnJlc3BvbmRzIHRvIG5vIGZpbGUgb3IgKHdvcnNlKSB0byBzb21lIG90aGVyIGZpbGUsIHNvCi0gICBzaG91bGQgb25seSBiZSB0cmllZCBpZiBvdGhlciBtZXRob2RzIG9mIGZpbmRpbmcgYSBmaWxlIHZpYSBhCi0gICBiYXNlbmFtZSBoYXZlIGZhaWxlZC4gICovCi0KLWNoYXIgKgotbXB3X21peGVkX2Jhc2VuYW1lIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lID09ICcvJyB8fCAqbmFtZSA9PSAnOicpCi0JewotCSAgYmFzZSA9IG5hbWUgKyAxOwotCX0KLSAgICAgICsrbmFtZTsKLSAgICB9Ci0gIHJldHVybiBiYXNlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGZvcGVuKCkgbW9kaWZpZWQgdG8gY3JlYXRlIGZpbGVzIHRoYXQgYXJlIHR5cGUgVEVYVAotICAgb3IgJ0JJTiAnLCBhbmQgYWx3YXlzIG9mIHR5cGUgJ01QUyAnLiAgKi8KLQotRklMRSAqCi1tcHdfZm9wZW4gKGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUpCi17Ci0jdW5kZWYgZm9wZW4KLSAgaW50IGVycm51bTsKLSAgRklMRSAqZnA7Ci0gIGNoYXIgdG1wbmFtZVsyNTZdOwotCi0gIG1wd2lmeV9maWxlbmFtZSAobmFtZSwgdG1wbmFtZSk7Ci0gIFBST0dSRVNTICgxKTsKLSAgZnAgPSBmb3BlbiAodG1wbmFtZSwgbW9kZSk7Ci0gIGVycm51bSA9IGVycm5vOwotCi0gIC8qIElmIHdyaXRpbmcsIG5lZWQgdG8gc2V0IHR5cGUgYW5kIGNyZWF0b3IgdXNlZnVsbHkuICovCi0gIGlmIChzdHJjaHIgKG1vZGUsICd3JykpCi0gICAgewotICAgICAgY2hhciAqcG5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAodG1wbmFtZSkgKyAyKTsKLSAgICAgIE9TRXJyIGU7Ci0gICAgICBzdHJ1Y3QgRkluZm8gZmk7Ci0KLSAgICAgIHBuYW1lWzBdID0gc3RybGVuICh0bXBuYW1lKTsKLSAgICAgIHN0cmNweSAocG5hbWUrMSwgdG1wbmFtZSk7Ci0JCi0gICAgICBlID0gR2V0RkluZm8gKChDb25zdFN0cjI1NVBhcmFtKSBwbmFtZSwgMCwgJmZpKTsKLSAgICAgIC8qIHNob3VsZCBkbyBzcGlmZmllciBlcnJvciBoYW5kbGluZyAqLwotICAgICAgaWYgKGUgIT0gMCkKLQlmcHJpbnRmKHN0ZGVyciwgIkdldEZJbmZvIHJldHVybnMgJWRcbiIsIGUpOwotICAgICAgaWYgKHN0cmNociAobW9kZSwgJ2InKSkKLQl7Ci0JICBmaS5mZFR5cGUgPSAoT1NUeXBlKSAnQklOICc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZpLmZkVHlwZSA9IChPU1R5cGUpICdURVhUJzsKLQl9Ci0gICAgICBmaS5mZENyZWF0b3IgPSAoT1NUeXBlKSAnTVBTICc7Ci0gICAgICBlID0gU2V0RkluZm8gKChDb25zdFN0cjI1NVBhcmFtKSBwbmFtZSwgMCwgJmZpKTsKLSAgICAgIGlmIChlICE9IDApCi0JZnByaW50ZihzdGRlcnIsICJTZXRGSW5mbyByZXR1cm5zICVkXG4iLCBlKTsKLSAgICAgIGZyZWUgKHBuYW1lKTsKLSAgICB9Ci0gIGlmIChmcCA9PSBOVUxMKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gZnA7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGZzZWVrKCkgbW9kaWZpZWQgdG8gZmlsbCB0aGUgZmlsZSB3aXRoIHplcm9zCi0gICBpZiBzZWVraW5nIHBhc3QgdGhlIGVuZCBvZiBpdC4gICovCi0KLSNkZWZpbmUgWkVST0JMS1NJWkUgNDA5NgotCi1jaGFyIHplcm9zW1pFUk9CTEtTSVpFXTsKLQotaW50Ci1tcHdfZnNlZWsgKEZJTEUgKmZwLCBpbnQgb2Zmc2V0LCBpbnQgd2hlbmNlKQotewotI3VuZGVmIGZzZWVrCi0gIGludCBjdXJzaXplLCBudW1sZWZ0OwotCi0gIFBST0dSRVNTICgxKTsKLSAgaWYgKHdoZW5jZSA9PSBTRUVLX1NFVCkKLSAgICB7Ci0gICAgICBmc2VlayAoZnAsIDAsIFNFRUtfRU5EKTsKLSAgICAgIGN1cnNpemUgPSBmdGVsbCAoZnApOwotICAgICAgaWYgKG9mZnNldCA+IGN1cnNpemUpCi0JewotCSAgbnVtbGVmdCA9IG9mZnNldCAtIGN1cnNpemU7Ci0JICB3aGlsZSAobnVtbGVmdCA+IFpFUk9CTEtTSVpFKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtaWdodCBmYWlsLCBzaG91bGQgY2hlY2sgZm9yIHRoYXQuICovCi0JICAgICAgUFJPR1JFU1MgKDEpOwotCSAgICAgIGZ3cml0ZSAoemVyb3MsIDEsIFpFUk9CTEtTSVpFLCBmcCk7Ci0JICAgICAgbnVtbGVmdCAtPSBaRVJPQkxLU0laRTsKLQkgICAgfQotCSAgUFJPR1JFU1MgKDEpOwotCSAgZndyaXRlICh6ZXJvcywgMSwgbnVtbGVmdCwgZnApOwotCSAgZmZsdXNoIChmcCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGZzZWVrIChmcCwgb2Zmc2V0LCB3aGVuY2UpOwotfQotCi1pbnQKLW1wd19mcmVhZCAoY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG5pdGVtcywgRklMRSAqc3RyZWFtKQotewotI3VuZGVmIGZyZWFkCi0gIGludCByc2x0OwotCi0gIFBST0dSRVNTICgxKTsKLSAgcnNsdCA9IGZyZWFkIChwdHIsIHNpemUsIG5pdGVtcywgc3RyZWFtKTsKLSAgUFJPR1JFU1MgKDEpOwotICByZXR1cm4gcnNsdDsKLX0KLQotaW50Ci1tcHdfZndyaXRlIChjaGFyICpwdHIsIGludCBzaXplLCBpbnQgbml0ZW1zLCBGSUxFICpzdHJlYW0pCi17Ci0jdW5kZWYgZndyaXRlCi0gIGludCByc2x0OwotCi0gIFBST0dSRVNTICgxKTsKLSAgcnNsdCA9IGZ3cml0ZSAocHRyLCBzaXplLCBuaXRlbXMsIHN0cmVhbSk7Ci0gIFBST0dSRVNTICgxKTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLWludAotbGluayAoKQotewotICBmcHJpbnRmIChzdGRlcnIsICJsaW5rIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotfQotCi1pbnQKLWZvcmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZm9yayBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLX0KLQotaW50Ci12Zm9yayAoKQotewotICBmcHJpbnRmIChzdGRlcnIsICJ2Zm9yayBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWludAotcGlwZSAoaW50ICpmZCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAicGlwZSBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotZXhlY3ZwIChjaGFyICpmaWxlLCBjaGFyICoqYXJndikKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZXhlY3ZwIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLQotaW50Ci1leGVjdiAoY2hhciAqcGF0aCwgY2hhciAqKmFyZ3YpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4ZWN2IG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLSNlbmRpZgotCi1pbnQKLWtpbGwgKGludCBwaWQsIGludCBzaWcpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImtpbGwgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi1pbnQKLXdhaXQgKGludCAqc3RhdHVzKQotewotICAqc3RhdHVzID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotc2xlZXAgKGludCBzZWNvbmRzKQotewotICB1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUsIG5vdzsKLQotICB0aW1lICgmc3RhcnRfdGltZSk7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotICAgICAgdGltZSAoJm5vdyk7Ci0gICAgICBpZiAobm93ID4gc3RhcnRfdGltZSArIHNlY29uZHMpCi0JcmV0dXJuIDA7Ci0gICAgfQotfQotI2VuZGlmCi0KLXZvaWQKLXB1dGVudiAoY2hhciAqc3RyKQotewotICAvKiBUaGUgR0NDIGRyaXZlciBjYWxscyB0aGlzIHRvIGRvIHRoaW5ncyBmb3IgY29sbGVjdDIsIGJ1dCB3ZQotICAgICBkb24ndCBjYXJlIGFib3V0IGNvbGxlY3QyLiAqLwotfQotCi1pbnQKLWNobW9kIChjaGFyICpwYXRoLCBpbnQgbW9kZSkKLXsKLSAgLyogUHJldGVuZCBpdCB3YXMgYWxsIE9LLiAqLwotICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotaW50Ci1nZXR1aWQgKCkKLXsKLSAgLyogT25lIHZhbHVlIGlzIGFzIGdvb2QgYXMgYW5vdGhlci4uLiAqLwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1nZXRnaWQgKCkKLXsKLSAgLyogT25lIHZhbHVlIGlzIGFzIGdvb2QgYXMgYW5vdGhlci4uLiAqLwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiBJbnN0ZWFkIG9mIGNvcmVkdW1waW5nLCB3aGljaCBpcyBub3QgYSBub3JtYWwgTWFjIGZhY2lsaXR5LCB3ZQotICAgZHJvcCBpbnRvIE1hY3NidWcuICBJZiB3ZSB0aGVuICJnIiBmcm9tIE1hY3NidWcsIHRoZSBwcm9ncmFtIHdpbGwKLSAgIGV4aXQgY2xlYW5seS4gKi8KLQotdm9pZAotbXB3X2Fib3J0ICgpCi17Ci0gIC8qIE1ha2Ugc3VyZSBubyBvdXRwdXQgc3RpbGwgYnVmZmVyZWQgdXAsIHRoZW4gemFwIGludG8gTWFjc0J1Zy4gKi8KLSAgZmZsdXNoKHN0ZG91dCk7Ci0gIGZmbHVzaChzdGRlcnIpOwotICBwcmludGYoIiMjIEFib3J0ISAjI1xuIik7Ci0jaWZkZWYgTVBXX1NBREUKLSAgU3lzRXJyb3IoODAwNSk7Ci0jZWxzZSAKLSAgRGVidWdnZXIoKTsKLSNlbmRpZgotICAvKiAiZyIgaW4gTWFjc0J1ZyB3aWxsIHRoZW4gY2F1c2UgYSByZWd1bGFyIGVycm9yIGV4aXQuICovCi0gIGV4aXQgKDEpOwotfQotCi0vKiBJbWl0YXRpb24gZ2V0cnVzYWdlIGJhc2VkIG9uIHRoZSBBTlNJIGNsb2NrKCkgZnVuY3Rpb24uICovCi0KLWludAotZ2V0cnVzYWdlIChpbnQgd2hvLCBzdHJ1Y3QgcnVzYWdlICpydXNhZ2UpCi17Ci0gIGludCBjbGsgPSBjbG9jayAoKTsKLQotI2lmIDAKLSAgcnVzYWdlLT5ydV91dGltZS50dl9zZWMgPSBjbGsgLyBDTE9DS1NfUEVSX1NFQzsKLSAgcnVzYWdlLT5ydV91dGltZS50dl91c2VjID0gKChjbGsgKiAxMDAwKSAvIENMT0NLU19QRVJfU0VDKSAqIDEwMDA7Ci0gIHJ1c2FnZS0+cnVfc3RpbWUudHZfc2VjID0gMDsKLSAgcnVzYWdlLT5ydV9zdGltZS50dl91c2VjID0gMDsKLSNlbmRpZgotfQotCi1pbnQKLXNicmsgKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotaXNhdHR5IChpbnQgZmQpCi17Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIGluaGVyaXRlZCBmcm9tIFRpbW90aHkgTXVycmF5J3MgUG9zaXggbGlicmFyeS4gKi8KLQotI2luY2x1ZGUgInV0aW1lLmgiCi0KLWludAotdXRpbWUgKGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgdXRpbWJ1ZiAqdGltZXMpCi17Ci0gIENJbmZvUEJSZWMgY2lwYnI7Ci0gIEhGaWxlSW5mbyAqZnBiID0gKEhGaWxlSW5mbyAqKSAmY2lwYnI7Ci0gIERpckluZm8gKmRwYiA9IChEaXJJbmZvICopICZjaXBicjsKLSAgdW5zaWduZWQgY2hhciBwbmFtZVsyNTZdOwotICBzaG9ydCBlcnI7Ci0gIAotICBzdHJjcHkgKChjaGFyICopIHBuYW1lLCBmaWxlbmFtZSk7Ci0gIGMycHN0ciAocG5hbWUpOwotCi0gIGRwYi0+aW9EckRpcklEID0gMEw7Ci0gIGZwYi0+aW9OYW1lUHRyID0gcG5hbWU7Ci0gIGZwYi0+aW9WUmVmTnVtID0gMDsKLSAgZnBiLT5pb0ZEaXJJbmRleCA9IDA7Ci0gIGZwYi0+aW9GVmVyc051bSA9IDA7Ci0gIGVyciA9IFBCR2V0Q2F0SW5mbyAoJmNpcGJyLCAwKTsKLSAgaWYgKGVyciAhPSBub0VycikgewotICAgIGVycm5vID0gRU5PRU5UOwotICAgIHJldHVybiAtMTsKLSAgfQotICBkcGItPmlvRHJEaXJJRCA9IDBMOwotICBmcGItPmlvRmxNZERhdCA9IHRpbWVzLT5tb2R0aW1lOwotICBmcGItPmlvRmxDckRhdCA9IHRpbWVzLT5hY3RpbWU7Ci0gIGVyciA9IFBCU2V0Q2F0SW5mbyAoJmNpcGJyLCAwKTsKLSAgaWYgKGVyciAhPSBub0VycikgewotICAgIGVycm5vID0gRUFDQ0VTOwotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1ta2RpciAoY2hhciAqcGF0aCwgaW50IG1vZGUpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gLTE7Ci19Ci0KLWludAotcm1kaXIgKCkKLXsKLSAgZXJybm8gPSBFTk9TWVM7Ci0gIHJldHVybiAtMTsKLX0KLSNlbmRpZgotCi1jaG93biAoKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuIC0xOwotfQotCi1jaGFyICpteWVudmlyb25bXSA9IHtOVUxMfTsKLQotY2hhciAqKmVudmlyb24gPSBteWVudmlyb247Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLQotLyogTWluaW1hbCAnc3RhdCcgZW11bGF0aW9uOiB0ZWxscyBkaXJlY3RvcmllcyBmcm9tIGZpbGVzIGFuZAotICAgZ2l2ZXMgbGVuZ3RoIGFuZCBtdGltZS4KLQotICAgRGVyaXZlZCBmcm9tIGNvZGUgd3JpdHRlbiBieSBHdWlkbyB2YW4gUm9zc3VtLCBDV0ksIEFtc3RlcmRhbQotICAgYW5kIHBsYWNlZCBieSBoaW0gaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi1leHRlcm4gaW50IF9fdWlkLCBfX2dpZDsKLQotaW50IF9fdWlkID0gMDsKLWludCBfX2dpZCA9IDA7Ci0KLS8qIEJpdHMgaW4gaW9GbEF0dHJpYjogKi8KLSNkZWZpbmUgTE9DS0JJVAkoMTw8MCkJCS8qIEZpbGUgbG9ja2VkICovCi0jZGVmaW5lIERJUkJJVAkoMTw8NCkJCS8qIEl0J3MgYSBkaXJlY3RvcnkgKi8KLQotLyogTWFjaWZpZWQgInN0YXQiIGluIHdoaWNoIGZpbGVuYW1lIGlzIGdpdmVuIHJlbGF0aXZlIHRvIGEgZGlyZWN0b3J5LAotICAgc3BlY2lmaWVkIGJ5IGxvbmcgRGlySUQuICAqLwotCi1zdGF0aWMgaW50Ci1fc3RhdCAoY2hhciAqbmFtZSwgbG9uZyBkaXJpZCwgc3RydWN0IHN0YXQgKmJ1ZikKLXsKLSAgQ0luZm9QQlJlYyBjaXBicjsKLSAgSEZpbGVJbmZvICpmcGIgPSAoSEZpbGVJbmZvKikgJmNpcGJyOwotICBEaXJJbmZvICpkcGIgPSAoRGlySW5mbyopICZjaXBicjsKLSAgU3RyMjU1IHBuYW1lOwotICBzaG9ydCBlcnI7Ci0KLSAgLyogTWFrZSBhIHRlbXAgY29weSBvZiB0aGUgbmFtZSBhbmQgcGFzY2FsaXplLiAqLwotICBzdHJjcHkgKChjaGFyICopIHBuYW1lLCBuYW1lKTsKLSAgYzJwc3RyIChwbmFtZSk7Ci0gIAotICBjaXBici5kaXJJbmZvLmlvRHJEaXJJRCA9IGRpcmlkOwotICBjaXBici5oRmlsZUluZm8uaW9OYW1lUHRyID0gcG5hbWU7Ci0gIGNpcGJyLmhGaWxlSW5mby5pb1ZSZWZOdW0gPSAwOwotICBjaXBici5oRmlsZUluZm8uaW9GRGlySW5kZXggPSAwOwotICBjaXBici5oRmlsZUluZm8uaW9GVmVyc051bSA9IDA7Ci0gIGVyciA9IFBCR2V0Q2F0SW5mbyAoJmNpcGJyLCAwKTsKLSAgaWYgKGVyciAhPSBub0VycikKLSAgICB7Ci0gICAgICBlcnJubyA9IEVOT0VOVDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIC8qIE1hYyBmaWxlcyBhcmUgcmVhZGFibGUgaWYgdGhleSBjYW4gYmUgYWNjZXNzZWQgYXQgYWxsLiAqLwotICBidWYtPnN0X21vZGUgPSAwNDQ0OwotICAvKiBNYXJrIHVubG9ja2VkIGZpbGVzIGFzIHdyaXRlYWJsZS4gKi8KLSAgaWYgKCEoZnBiLT5pb0ZsQXR0cmliICYgTE9DS0JJVCkpCi0gICAgYnVmLT5zdF9tb2RlIHw9IDAyMjI7Ci0gIGlmIChmcGItPmlvRmxBdHRyaWIgJiBESVJCSVQpCi0gICAgewotICAgICAgLyogTWFyayBkaXJlY3RvcmllcyBhcyAiZXhlY3V0YWJsZSIuICovCi0gICAgICBidWYtPnN0X21vZGUgfD0gMDExMSB8IFNfSUZESVI7Ci0gICAgICBidWYtPnN0X3NpemUgPSBkcGItPmlvRHJObUZsczsKLSAgICAgIGJ1Zi0+c3RfcnNpemUgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1Zi0+c3RfbW9kZSB8PSBTX0lGUkVHOwotICAgICAgLyogTWFyayBhcHBzIGFzICJleGVjdXRhYmxlIi4gKi8KLSAgICAgIGlmIChmcGItPmlvRmxGbmRySW5mby5mZFR5cGUgPT0gJ0FQUEwnKQotCWJ1Zi0+c3RfbW9kZSB8PSAwMTExOwotICAgICAgLyogRmlsbCBpbiB0aGUgc2l6ZXMgb2YgZGF0YSBhbmQgcmVzb3VyY2UgZm9ya3MuICovCi0gICAgICBidWYtPnN0X3NpemUgPSBmcGItPmlvRmxMZ0xlbjsKLSAgICAgIGJ1Zi0+c3RfcnNpemUgPSBmcGItPmlvRmxSTGdMZW47Ci0gICAgfQotICAvKiBGaWxsIGluIHZhcmlvdXMgdGltZXMuICovCi0gIGJ1Zi0+c3RfYXRpbWUgPSBmcGItPmlvRmxDckRhdDsKLSAgYnVmLT5zdF9tdGltZSA9IGZwYi0+aW9GbE1kRGF0OwotICBidWYtPnN0X2N0aW1lID0gZnBiLT5pb0ZsQ3JEYXQ7Ci0gIC8qIFNldCB1cCBhbiBpbWl0YXRpb24gaW5vZGUgbnVtYmVyLiAqLwotICBidWYtPnN0X2lubyA9ICh1bnNpZ25lZCBzaG9ydCkgZnBiLT5pb0RpcklEOwotICAvKiBTZXQgdXAgYW4gaW1pdGF0aW9uIGRldmljZS4gKi8KLSAgR2V0VlJlZk51bSAoYnVmLT5zdF9pbm8sICZidWYtPnN0X2Rldik7Ci0gIGJ1Zi0+c3RfdWlkID0gX191aWQ7Ci0gIGJ1Zi0+c3RfZ2lkID0gX19naWQ7Ci0vKiAgYnVmLT5zdF9GbEZuZHJJbmZvID0gZnBiLT5pb0ZsRm5kckluZm87ICAqLwotICByZXR1cm4gMDsKLX0KLQotLyogc3RhdCgpIHNldHMgdXAgYW4gZW1wdHkgZGlyaWQuICovCi0KLWludAotc3RhdCAoY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKmJ1ZikKLXsKLSAgbG9uZyByc2x0LCBlcnJudW07Ci0gIGNoYXIgdG1wbmFtZVsyNTZdOwotCi0gIG1wd2lmeV9maWxlbmFtZSAocGF0aCwgdG1wbmFtZSk7Ci0gIGlmIChEZWJ1Z1BJKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiMgc3RhdCAoJXMsICV4KSIsIHRtcG5hbWUsIGJ1Zik7Ci0gIFBST0dSRVNTICgxKTsKLSAgcnNsdCA9IF9zdGF0ICh0bXBuYW1lLCAwTCwgYnVmKTsKLSAgZXJybnVtID0gZXJybm87Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIHJzbHQpOwotICAgICAgaWYgKHJzbHQgIT0gMCkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgZmZsdXNoIChzdGRlcnIpOwotICAgIH0KLSAgaWYgKHJzbHQgIT0gMCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLWludAotZnN0YXQgKGludCBmZCwgc3RydWN0IHN0YXQgKmJ1ZikKLXsKLSAgRkNCUEJSZWMgZmNiOwotICBGSUxFICpmcDsKLSAgU3RyMjU1IHBhdGhuYW1lOwotICBsb25nIGRpcmlkID0gMEwsIHRlbXA7Ci0gIGxvbmcgcnNsdCwgZXJybnVtOwotICBzaG9ydCBlcnI7Ci0KLSAgaWYgKERlYnVnUEkgPCAwKQotICAgIERlYnVnUEkgPSAoKihnZXRlbnYgKCJERUJVR19QQVRITkFNRVMiKSkgPT0gJzEnID8gMSA6IDApOwotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIjIGZzdGF0ICglZCwgJXgpIiwgZmQsIGJ1Zik7Ci0gIFBST0dSRVNTICgxKTsKLSAgcGF0aG5hbWVbMF0gPSAwOwotI2lmZGVmIEZJT0ZOQU1FCi0gIC8qIFVzZSBhbiBNUFctc3BlY2lmaWMgaW9jdGwgdG8gZ2V0IHRoZSBwYXRobmFtZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgdGhlIGZpbGUgZGVzY3JpcHRvci4gICovCi0gIGlvY3RsIChmZCwgRklPRk5BTUUsIChsb25nICopIHBhdGhuYW1lKTsgCi0jZWxzZQotICB5b3UgbG9zZQotI2VuZGlmCi0gIGlmIChEZWJ1Z1BJKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiAobmFtZSBpcyAlcykiLCBwYXRobmFtZSk7Ci0gIGRpcmlkID0gMEwgLyogZmNiLmlvRkNCUGFySUQgKi8gOwotICByc2x0ID0gX3N0YXQgKChjaGFyICopIHBhdGhuYW1lLCBkaXJpZCwgYnVmKTsKLSAgZXJybnVtID0gZXJybm87Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIHJzbHQpOwotICAgICAgaWYgKHJzbHQgIT0gMCkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgZmZsdXNoIChzdGRlcnIpOwotICAgIH0KLSAgaWYgKHJzbHQgIT0gMCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLSNlbmRpZiAvKiBuIFVTRV9NV19IRUFERVJTICovCi0KLWNoZGlyICgpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gKC0xKTsKLX0KLQotY2hhciAqCi1nZXRjd2QgKGNoYXIgKmJ1ZiwgaW50IHNpemUpCi17Ci0gIGlmIChidWYgPT0gTlVMTCkKLSAgICBidWYgPSAoY2hhciAqKSBtYWxsb2MgKHNpemUpOwotICBzdHJjcHkoYnVmLCAiOiIpOwotICByZXR1cm4gYnVmOwotfQotCi0vKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBtb3JlIGVsYWJvcmF0ZSBmb3IgTVBXLiAqLwotCi1jaGFyICoKLWdldHB3ZCAoKQotewotICByZXR1cm4gIjoiOwotfQotCi1pbnQKLW1wd19vcGVuIChjaGFyICpmaWxlbmFtZSwgaW50IGFyZzIsIGludCBhcmczKQotewotI3VuZGVmIG9wZW4KLSAgaW50IGZkLCBlcnJudW0gPSAwOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKGZpbGVuYW1lLCB0bXBuYW1lKTsKLSAgZmQgPSBvcGVuICh0bXBuYW1lLCBhcmcyKTsKLSAgZXJybnVtID0gZXJybm87Ci0KLSAgaWYgKERlYnVnUEkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIyBvcGVuICglcywgJWQsICVkKSIsIHRtcG5hbWUsIGFyZzIsIGFyZzMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVkIiwgZmQpOwotICAgICAgaWYgKGZkID09IC0xKQotCWZwcmludGYgKHN0ZGVyciwgIiAoZXJybm8gaXMgJWQpIiwgZXJybnVtKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotICBpZiAoZmQgPT0gLTEpCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiBmZDsKLX0KLQotaW50Ci1tcHdfYWNjZXNzIChjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgaW50IGNtZCkKLXsKLSN1bmRlZiBhY2Nlc3MKLQotICBpbnQgcnNsdCwgZXJybnVtID0gMDsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGNoYXIgdG1wbmFtZVsyNTZdOwotCi0gIG1wd2lmeV9maWxlbmFtZSAoZmlsZW5hbWUsIHRtcG5hbWUpOwotICBpZiAoY21kICYgUl9PSyB8fCBjbWQgJiBYX09LKQotICAgIHsKLSAgICAgIHJzbHQgPSBzdGF0ICh0bXBuYW1lLCAmc3QpOwotICAgICAgZXJybnVtID0gZXJybm87Ci0gICAgICBpZiAocnNsdCA+PSAwKQotCXsKLQkgIGlmICgoKChzdC5zdF9tb2RlICYgMDA0KSA9PSAwKSAmJiAoY21kICYgUl9PSykpCi0JICAgICAgfHwgKCgoc3Quc3RfbW9kZSAmIDAwMikgPT0gMCkgJiYgKGNtZCAmIFdfT0spKQotCSAgICAgIHx8ICgoKHN0LnN0X21vZGUgJiAwMDEpID09IDApICYmIChjbWQgJiBYX09LKSkpCi0JICAgIHsKLQkgICAgICByc2x0ID0gLTE7Ci0JICAgICAgZXJybnVtID0gRUFDQ0VTOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKERlYnVnUEkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIyBtcHdfYWNjZXNzICglcywgJWQpIiwgdG1wbmFtZSwgY21kKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIHJzbHQpOwotICAgICAgaWYgKHJzbHQgIT0gMCkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSAgaWYgKHJzbHQgIT0gMCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLS8qIFRoZSBNUFcgbGlicmFyeSBjcmVhdCgpIGhhcyBubyBtb2RlIGFyZ3VtZW50LiAqLwotCi1pbnQKLW1wd19jcmVhdCAoY2hhciAqcGF0aCwgLyogbW9kZV90ICovIGludCBtb2RlKQotewotI3VuZGVmIGNyZWF0Ci0KLSNpZmRlZiBVU0VfTVdfSEVBREVSUwotICByZXR1cm4gY3JlYXQgKHBhdGgsIG1vZGUpOwotI2Vsc2UKLSAgcmV0dXJuIGNyZWF0IChwYXRoKTsKLSNlbmRpZgotfQotCi0vKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgY29udHJvbCBpbiBhbiBNUFcgdG9vbCBiZWZvcmUgaXQgY3Jhc2hlcyB0aGUKLSAgIG1hY2hpbmUuICAqLwotCi1tcHdfc3BlY2lhbF9pbml0IChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoc3Ryc3RyIChuYW1lLCAiREVCVUciKSkKLSAgICBEZWJ1Z1N0cigiXHBhdCBiZWdpbm5pbmcgb2YgcHJvZ3JhbSIpOwotfQotCi1zdGF0aWMgaW50IGN1cnJlbnRfdW1hc2s7Ci0KLWludAotdW1hc2soaW50IG1hc2spCi17Ci0gIGludCBvbGRtYXNrID0gY3VycmVudF91bWFzazsKLQotICBjdXJyZW50X3VtYXNrID0gbWFzazsKLSAgcmV0dXJuIG9sZG1hc2s7Ci19Ci0KLS8qIEN1cnNvci1zcGlubmluZyBzdHVmZiB0aGF0IGluY2x1ZGVzIG1ldGVyaW5nIG9mIHNwaW4gcmF0ZSBhbmQgZGVsYXlzLiAgKi8KLQotLyogTm9uemVybyB3aGVuIGN1cnNvciBzcGlubmluZyBoYXMgYmVlbiBzZXQgdXAgcHJvcGVybHkuICAqLwotCi1pbnQgY3Vyc29yX2luaXRlZDsKLQotLyogTm9uemVybyBpZiBzcGluIHNob3VsZCBiZSBtZWFzdXJlZCBhbmQgZXhjZXNzaXZlIGRlbGF5cyByZXBvcnRlZC4gICovCi0KLWludCBtZWFzdXJlX3NwaW47Ci0KLS8qIE5vbnplcm8gaWYgc3BpbiBoaXN0b2dyYW0gYW5kIHJhdGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbiBvdXQuICAqLwotCi1pbnQgZHVtcF9zcGluX2RhdGE7Ci0KLWxvbmcgd2FybmluZ190aHJlc2hvbGQgPSA0MDAwMDA7Ci0KLWxvbmcgYnVja2V0X3NpemUgPSAxMDI0OwotCi1sb25nIGJ1Y2tldF9wb3dlciA9IDEwOwotCi1sb25nIG51bWJ1Y2tldHMgPSAzMDA7Ci0KLWludCAqZGVsYXlfY291bnRzOwotCi1pbnQgb3ZlcmZsb3dfY291bnQ7Ci0KLWNoYXIgKmN1cnJlbnRfcHJvZ3Jlc3M7Ci0KLXN0YXRpYyBVbnNpZ25lZFdpZGUgbGFzdF9taWNyb3NlY29uZHM7Ci0KLXN0YXRpYyBjaGFyICpsYXN0X3NwaW5fZmlsZSA9ICIiOwotCi1zdGF0aWMgaW50IGxhc3Rfc3Bpbl9saW5lOwotCi12b2lkCi13YXJuX2lmX3NwaW5fZGVsYXkgKGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBsb25nIGRpZmYsIGl4OwotICBVbnNpZ25lZFdpZGUgbm93OwotCi0gIE1pY3Jvc2Vjb25kcygmbm93KTsKLQotICBkaWZmID0gbm93LmxvIC0gbGFzdF9taWNyb3NlY29uZHMubG87Ci0KLSAgaWYgKGRpZmYgPiB3YXJuaW5nX3RocmVzaG9sZCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIjICVzOiAlbGQuJTA2bGQgc2VjIGRlbGF5IGdldHRpbmcgZnJvbSAlczolZCB0byAlczolZFxuIiwKLQkgICAgIChjdXJyZW50X3Byb2dyZXNzID8gY3VycmVudF9wcm9ncmVzcyA6ICIiKSwKLQkgICAgIGRpZmYgLyAxMDAwMDAwLCBkaWZmICUgMTAwMDAwMCwKLQkgICAgIGxhc3Rfc3Bpbl9maWxlLCBsYXN0X3NwaW5fbGluZSwgZmlsZSwgbGluZSk7Ci0gIGlmIChkdW1wX3NwaW5fZGF0YSkKLSAgICB7Ci0gICAgICBpZiAoZGlmZiA+PSAwKQotCXsKLQkgIGl4ID0gZGlmZiA+PiBidWNrZXRfcG93ZXI7Ci0JICBpZiAoaXggPj0gMCAmJiBpeCA8IG51bWJ1Y2tldHMgJiYgZGVsYXlfY291bnRzICE9IE5VTEwpCi0JICAgICsrZGVsYXlfY291bnRzW2l4XTsKLQkgIGVsc2UKLQkgICAgKytvdmVyZmxvd19jb3VudDsKLQl9Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLCAicmF3IGRpZmYgaXMgJWxkICg/KVxuIiwgZGlmZik7Ci0gICAgfQotfQotCi12b2lkCi1yZWNvcmRfZm9yX3NwaW5fZGVsYXkgKGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBNaWNyb3NlY29uZHMgKCZsYXN0X21pY3Jvc2Vjb25kcyk7Ci0gIGxhc3Rfc3Bpbl9maWxlID0gZmlsZTsKLSAgbGFzdF9zcGluX2xpbmUgPSBsaW5lOwotfQotCi12b2lkCi1tcHdfc3RhcnRfcHJvZ3Jlc3MgKGNoYXIgKnN0ciwgaW50IG4sIGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBpbnQgaTsKLSAgY2hhciAqbWVhc3VyZSwgKnRocmVzaG9sZDsKLQotICBpZiAoIWN1cnNvcl9pbml0ZWQpCi0gICAgewotICAgICAgSW5pdEN1cnNvckN0bCAobmlsKTsKLSAgICAgIGN1cnNvcl9pbml0ZWQgPSAxOwotICAgICAgcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLSAgICAgIG1lYXN1cmUgPSBnZXRlbnYgKCJNRUFTVVJFX1NQSU4iKTsKLSAgICAgIGlmIChtZWFzdXJlICE9IE5VTEwgJiYgbWVhc3VyZVswXSAhPSAnXDAnKQotCXsKLQkgIG1lYXN1cmVfc3BpbiA9IDE7Ci0JICBpZiAoc3RyY21wIChtZWFzdXJlLCAiYWxsIikgPT0gMCkKLQkgICAgZHVtcF9zcGluX2RhdGEgPSAxOwotCX0KLSAgICAgIHRocmVzaG9sZCA9IGdldGVudiAoIlNQSU5fV0FSTl9USFJFU0hPTEQiKTsKLSAgICAgIGlmICh0aHJlc2hvbGQgIT0gTlVMTCAmJiB0aHJlc2hvbGRbMF0gIT0gJ1wwJykKLQl3YXJuaW5nX3RocmVzaG9sZCA9IGF0b2wgKHRocmVzaG9sZCk7Ci0gICAgICBpZiAoZHVtcF9zcGluX2RhdGEpCi0JewotCSAgaWYgKGRlbGF5X2NvdW50cyA9PSBOVUxMKQotCSAgICBkZWxheV9jb3VudHMgPSAoaW50ICopIG1hbGxvYyAobnVtYnVja2V0cyAqIHNpemVvZiAoaW50KSk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbnVtYnVja2V0czsgKytpKQotCSAgICBkZWxheV9jb3VudHNbaV0gPSAwOwotCSAgb3ZlcmZsb3dfY291bnQgPSAwOwotCX0KLSAgICB9Ci0gIGN1cnJlbnRfcHJvZ3Jlc3MgPSBzdHI7Ci0KLSAgc3lzX25lcnIgPSBlcnJub19tYXggKCk7Ci0KLSAgbXB3X3NwZWNpYWxfaW5pdCAoc3RyKTsKLX0KLQotdm9pZAotbXB3X3Byb2dyZXNzIChpbnQgbikKLXsKLSAgU3BpbkN1cnNvciAoMzIpOwotfQotCi12b2lkCi1tcHdfcHJvZ3Jlc3NfbWVhc3VyZWQgKGludCBuLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgaWYgKG1lYXN1cmVfc3BpbikKLSAgICB3YXJuX2lmX3NwaW5fZGVsYXkgKGZpbGUsIGxpbmUpOwotICBTcGluQ3Vyc29yICgzMik7Ci0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLX0KLQotdm9pZAotbXB3X2VuZF9wcm9ncmVzcyAoY2hhciAqc3RyLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgbG9uZyBpLCBkZWxheSwgY291bnQgPSAwLCBzdW0gPSAwLCBhdmdkZWxheSwgc3BpbnJhdGU7Ci0gIGxvbmcgY3VycG93ZXIgPSAwLCBjdXJncm91cCA9IDA7Ci0KLSAgLyogV2FybiBpZiBpdCdzIGJlZW4gYSB3aGlsZSBzaW5jZSB0aGUgbGFzdCBzcGluLiAgKi8KLSAgaWYgKG1lYXN1cmVfc3BpbikKLSAgICB3YXJuX2lmX3NwaW5fZGVsYXkgKGZpbGUsIGxpbmUpOwotCi0gIC8qIER1bXAgYWxsIHRoZSBub256ZXJvIGRlbGF5IGNvdW50cyBhbmQgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgZGVsYXkuICAqLwotICBpZiAoZHVtcF9zcGluX2RhdGEgJiYgZGVsYXlfY291bnRzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJ1Y2tldHM7ICsraSkKLQl7Ci0JICBkZWxheSA9IChpICsgMSkgKiBidWNrZXRfc2l6ZTsKLQkgIHN1bSArPSBkZWxheV9jb3VudHNbaV0gKiAoaSArIDEpOwotCSAgY291bnQgKz0gZGVsYXlfY291bnRzW2ldOwotCSAgaWYgKGRlbGF5IDw9ICgxIDw8IGN1cnBvd2VyKSkKLQkgICAgewotCSAgICAgIGN1cmdyb3VwICs9IGRlbGF5X2NvdW50c1tpXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGN1cmdyb3VwID4gMCkKLQkJZnByaW50ZiAoc3RkZXJyLAotCQkJICIjICVzOiAlZCBkZWxheXMgYmV0d2VlbiAlbGQuJTA2bGQgYW5kICVsZC4lMDZsZCBzZWNcbiIsCi0JCQkgKHN0ciA/IHN0ciA6ICIiKSwKLQkJCSBjdXJncm91cCwKLQkJCSAoMSA8PCBjdXJwb3dlcikgLyAxMDAwMDAwLAotCQkJICgxIDw8IGN1cnBvd2VyKSAlIDEwMDAwMDAsCi0JCQkgKDEgPDwgKGN1cnBvd2VyICsgMSkpIC8gMTAwMDAwMCwKLQkJCSAoMSA8PCAoY3VycG93ZXIgKyAxKSkgJSAxMDAwMDAwKTsKLQkgICAgICArK2N1cnBvd2VyOwotCSAgICAgIGN1cmdyb3VwID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChjb3VudCA+IDApCi0JewotCSAgYXZnZGVsYXkgPSAoc3VtICogYnVja2V0X3NpemUpIC8gY291bnQ7Ci0JICBzcGlucmF0ZSA9IDEwMDAwMDAgLyBhdmdkZWxheTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiMgJXM6IEF2ZXJhZ2Ugc3BpbiByYXRlIGlzICVkIHRpbWVzL3NlY1xuIiwKLQkJICAgKHN0ciA/IHN0ciA6ICIiKSwgc3BpbnJhdGUpOwotCX0KLSAgICB9Ci19Ci0KLSNpZmRlZiBQUk9HUkVTU19URVNUCi0KLS8qIFRlc3QgcHJvZ3JhbS4gICovCi0KLW1haW4gKCkKLXsKLSAgaW50IGksIGo7Ci0gIGRvdWJsZSB4ID0gMS4wLCB5ID0gMi40OwotICBsb25nIHN0YXJ0ID0gTWljcm9zZWNvbmRzICgpLCB0bTsgIEZJWE1FCi0KLSAgU1RBUlRfUFJPR1JFU1MgKCJoaSIsIDApOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgKGkgKiAxMDApOyArK2opCi0JewotCSAgeCArPSAoeCAqIHkpIC8gajsKLQl9Ci0gICAgfQotICAKLSAgRU5EX1BST0dSRVNTICgiaGkiKTsKLSAgCi0gIHRtID0gTWljcm9zZWNvbmRzICgpIC0gc3RhcnQ7Ci0KLSAgcHJpbnRmICgiVG90YWwgdGltZSBpcyAlZC4lZCBzZWNzXG4iLCB0bSAvIDEwMDAwMDAsIHRtICUgMTAwMDAwMCk7Ci19Ci0KLSNlbmRpZgotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLS8qIEVtcHR5IGRlZmluaXRpb25zIGZvciBNZXRyb3dlcmtzJyBTSU9VWCBjb25zb2xlIGxpYnJhcnkuICovCi0KLSNpZm5kZWYgX19DT05TT0xFX18KLSNpbmNsdWRlIDxjb25zb2xlLmg+Ci0jZW5kaWYKLQotc2hvcnQKLUluc3RhbGxDb25zb2xlKHNob3J0IGZkKQotewotI3ByYWdtYSB1bnVzZWQgKGZkKQotCXJldHVybiAwOwotfQotCi12b2lkCi1SZW1vdmVDb25zb2xlKHZvaWQpCi17Ci19Ci0KLWxvbmcKLVdyaXRlQ2hhcnNUb0NvbnNvbGUoY2hhciAqYnVmLCBsb25nIG4pCi17Ci0jcHJhZ21hIHVudXNlZCAoYnVmLCBuKQotCXJldHVybiAwOwotfQotCi1sb25nIFJlYWRDaGFyc0Zyb21Db25zb2xlKGNoYXIgKmJ1ZiwgbG9uZyBuKQotewotI3ByYWdtYSB1bnVzZWQgKGJ1ZiwgbikKLQlyZXR1cm4gMDsKLX0KLQotZXh0ZXJuIGNoYXIgKgotX190dHluYW1lKGxvbmcgZmQpCi17Ci0Jc3RhdGljIGNoYXIgKl9fZGV2aWNlbmFtZSA9ICJudWxsIGRldmljZSI7Ci0KLQlpZiAoZmQgPj0gMCAmJiBmZCA8PSAyKQotCSAgcmV0dXJuIChfX2RldmljZW5hbWUpOwotCXJldHVybiBOVUxMOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tc2Rvcy5jIGIvbGliaWJlcnR5L21zZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2U2NGQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21zZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1jaGFyIG1zZ1tdID0gIk5vIHZmb3JrIGF2YWlsYWJsZSAtIGFib3J0aW5nXG4iOwotdmZvcmsoKQotewotICB3cml0ZSgxLCBtc2csIHNpemVvZihtc2cpKTsKLX0KLQotc2lnc2V0bWFzaygpCi17Ci0gIC8qIG5vIHNpZ25hbHMgc3VwcG9ydCBpbiBnbzMyICh5ZXQpICovCi19Ci0KLXdhaXRwaWQoKQotewotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvb2JqYWxsb2MuYyBiL2xpYmliZXJ0eS9vYmphbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1NGE4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9vYmphbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qIG9iamFsbG9jLmMgLS0gcm91dGluZXMgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvYmplY3RzCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0KLS8qIEdldCBhIGRlZmluaXRpb24gZm9yIE5VTEwuICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBWTVMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jZWxzZQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciBzaXplX3QuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0KLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhpcyBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLWV4dGVybiBQVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgZnJlZSBQQVJBTVMgKChQVFIpKTsKLSNlbmRpZgotCi0vKiBUaGVzZSByb3V0aW5lcyBhbGxvY2F0ZSBzcGFjZSBmb3IgYW4gb2JqZWN0LiAgRnJlZWluZyBhbGxvY2F0ZWQKLSAgIHNwYWNlIG1heSBvciBtYXkgbm90IGZyZWUgYWxsIG1vcmUgcmVjZW50bHkgYWxsb2NhdGVkIHNwYWNlLgotCi0gICBXZSBoYW5kbGUgbGFyZ2UgYW5kIHNtYWxsIGFsbG9jYXRpb24gcmVxdWVzdHMgZGlmZmVyZW50bHkuICBJZiB3ZQotICAgZG9uJ3QgaGF2ZSBlbm91Z2ggc3BhY2UgaW4gdGhlIGN1cnJlbnQgYmxvY2ssIGFuZCB0aGUgYWxsb2NhdGlvbgotICAgcmVxdWVzdCBpcyBmb3IgbW9yZSB0aGFuIDUxMiBieXRlcywgd2Ugc2ltcGx5IHBhc3MgaXQgdGhyb3VnaCB0bwotICAgbWFsbG9jLiAgKi8KLQotLyogVGhlIG9iamFsbG9jIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIG9iamFsbG9jLmguICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiBlYWNoIGNodW5rLiAgKi8KLQotc3RydWN0IG9iamFsbG9jX2NodW5rCi17Ci0gIC8qIE5leHQgY2h1bmsuICAqLwotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0gIC8qIElmIHRoaXMgY2h1bmsgY29udGFpbnMgbGFyZ2Ugb2JqZWN0cywgdGhpcyBpcyB0aGUgdmFsdWUgb2YKLSAgICAgY3VycmVudF9wdHIgd2hlbiB0aGlzIGNodW5rIHdhcyBhbGxvY2F0ZWQuICBJZiB0aGlzIGNodW5rCi0gICAgIGNvbnRhaW5zIHNtYWxsIG9iamVjdHMsIHRoaXMgaXMgTlVMTC4gICovCi0gIGNoYXIgKmN1cnJlbnRfcHRyOwotfTsKLQotLyogVGhlIGFsaWduZWQgc2l6ZSBvZiBvYmphbGxvY19jaHVuay4gICovCi0KLSNkZWZpbmUgQ0hVTktfSEVBREVSX1NJWkUJCQkJCVwKLSAgKChzaXplb2YgKHN0cnVjdCBvYmphbGxvY19jaHVuaykgKyBPQkpBTExPQ19BTElHTiAtIDEpCVwKLSAgICZ+IChPQkpBTExPQ19BTElHTiAtIDEpKQotCi0vKiBXZSBhc2sgZm9yIHRoaXMgbXVjaCBtZW1vcnkgZWFjaCB0aW1lIHdlIGNyZWF0ZSBhIGNodW5rIHdoaWNoIGlzIHRvCi0gICBob2xkIHNtYWxsIG9iamVjdHMuICAqLwotCi0jZGVmaW5lIENIVU5LX1NJWkUgKDQwOTYgLSAzMikKLQotLyogQSByZXF1ZXN0IGZvciB0aGlzIGFtb3VudCBvciBtb3JlIGlzIGp1c3QgcGFzc2VkIHRocm91Z2ggdG8gbWFsbG9jLiAgKi8KLQotI2RlZmluZSBCSUdfUkVRVUVTVCAoNTEyKQotCi0vKiBDcmVhdGUgYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG9iamFsbG9jICoKLW9iamFsbG9jX2NyZWF0ZSAoKQotewotICBzdHJ1Y3Qgb2JqYWxsb2MgKnJldDsKLSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICByZXQgPSAoc3RydWN0IG9iamFsbG9jICopIG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0LT5jaHVua3MgPSAoUFRSKSBtYWxsb2MgKENIVU5LX1NJWkUpOwotICBpZiAocmV0LT5jaHVua3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGNodW5rID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSByZXQtPmNodW5rczsKLSAgY2h1bmstPm5leHQgPSBOVUxMOwotICBjaHVuay0+Y3VycmVudF9wdHIgPSBOVUxMOwotCi0gIHJldC0+Y3VycmVudF9wdHIgPSAoY2hhciAqKSBjaHVuayArIENIVU5LX0hFQURFUl9TSVpFOwotICByZXQtPmN1cnJlbnRfc3BhY2UgPSBDSFVOS19TSVpFIC0gQ0hVTktfSEVBREVSX1NJWkU7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2UgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLwotCi1QVFIKLV9vYmphbGxvY19hbGxvYyAobywgbGVuKQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuOwotewotICAvKiBXZSBhdm9pZCBjb25mdXNpb24gZnJvbSB6ZXJvIHNpemVkIG9iamVjdHMgYnkgYWx3YXlzIGFsbG9jYXRpbmcKLSAgICAgYXQgbGVhc3QgMSBieXRlLiAgKi8KLSAgaWYgKGxlbiA9PSAwKQotICAgIGxlbiA9IDE7Ci0KLSAgbGVuID0gKGxlbiArIE9CSkFMTE9DX0FMSUdOIC0gMSkgJn4gKE9CSkFMTE9DX0FMSUdOIC0gMSk7Ci0KLSAgaWYgKGxlbiA8PSBvLT5jdXJyZW50X3NwYWNlKQotICAgIHsKLSAgICAgIG8tPmN1cnJlbnRfcHRyICs9IGxlbjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgLT0gbGVuOwotICAgICAgcmV0dXJuIChQVFIpIChvLT5jdXJyZW50X3B0ciAtIGxlbik7Ci0gICAgfQotCi0gIGlmIChsZW4gPj0gQklHX1JFUVVFU1QpCi0gICAgewotICAgICAgY2hhciAqcmV0OwotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICAgICAgcmV0ID0gKGNoYXIgKikgbWFsbG9jIChDSFVOS19IRUFERVJfU0laRSArIGxlbik7Ci0gICAgICBpZiAocmV0ID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGNodW5rID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSByZXQ7Ci0gICAgICBjaHVuay0+bmV4dCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgY2h1bmstPmN1cnJlbnRfcHRyID0gby0+Y3VycmVudF9wdHI7Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGNodW5rOwotCi0gICAgICByZXR1cm4gKFBUUikgKHJldCArIENIVU5LX0hFQURFUl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmNodW5rOwotCi0gICAgICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgbWFsbG9jIChDSFVOS19TSVpFKTsKLSAgICAgIGlmIChjaHVuayA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgY2h1bmstPm5leHQgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIGNodW5rLT5jdXJyZW50X3B0ciA9IE5VTEw7Ci0KLSAgICAgIG8tPmN1cnJlbnRfcHRyID0gKGNoYXIgKikgY2h1bmsgKyBDSFVOS19IRUFERVJfU0laRTsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSBDSFVOS19TSVpFIC0gQ0hVTktfSEVBREVSX1NJWkU7Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGNodW5rOwotCi0gICAgICByZXR1cm4gb2JqYWxsb2NfYWxsb2MgKG8sIGxlbik7Ci0gICAgfQotfQotCi0vKiBGcmVlIGFuIGVudGlyZSBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1vYmphbGxvY19mcmVlIChvKQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKm87Ci17Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbDsKLQotICBsID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gIHdoaWxlIChsICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0gICAgICBuZXh0ID0gbC0+bmV4dDsKLSAgICAgIGZyZWUgKGwpOwotICAgICAgbCA9IG5leHQ7Ci0gICAgfQotCi0gIGZyZWUgKG8pOwotfQotCi0vKiBGcmVlIGEgYmxvY2sgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBUaGlzIGFsc28gZnJlZXMgYWxsIG1vcmUKLSAgIHJlY2VudGx5IGFsbG9jYXRlZCBibG9ja3MuICAqLwotCi12b2lkCi1vYmphbGxvY19mcmVlX2Jsb2NrIChvLCBibG9jaykKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotICAgICBQVFIgYmxvY2s7Ci17Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqcCwgKnNtYWxsOwotICBjaGFyICpiID0gKGNoYXIgKikgYmxvY2s7Ci0KLSAgLyogRmlyc3Qgc2V0IFAgdG8gdGhlIGNodW5rIHdoaWNoIGNvbnRhaW5zIHRoZSBibG9jayB3ZSBhcmUgZnJlZWluZywKLSAgICAgYW5kIHNldCBRIHRvIHRoZSBsYXN0IHNtYWxsIG9iamVjdCBjaHVuayB3ZSBzZWUgYmVmb3JlIFAuICAqLwotICBzbWFsbCA9IE5VTEw7Ci0gIGZvciAocCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChwLT5jdXJyZW50X3B0ciA9PSBOVUxMKQotCXsKLQkgIGlmIChiID4gKGNoYXIgKikgcCAmJiBiIDwgKGNoYXIgKikgcCArIENIVU5LX1NJWkUpCi0JICAgIGJyZWFrOwotCSAgc21hbGwgPSBwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYiA9PSAoY2hhciAqKSBwICsgQ0hVTktfSEVBREVSX1NJWkUpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgY2FuJ3QgZmluZCB0aGUgY2h1bmssIHRoZSBjYWxsZXIgaGFzIG1hZGUgYSBtaXN0YWtlLiAgKi8KLSAgaWYgKHAgPT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAocC0+Y3VycmVudF9wdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnE7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmZpcnN0OwotCi0gICAgICAvKiBUaGUgYmxvY2sgaXMgaW4gYSBjaHVuayBjb250YWluaW5nIHNtYWxsIG9iamVjdHMuICBXZSBjYW4KLQkgZnJlZSBldmVyeSBjaHVuayB0aHJvdWdoIFNNQUxMLCBiZWNhdXNlIHRoZXkgaGF2ZSBjZXJ0YWlubHkKLQkgYmVlbiBhbGxvY2F0ZWQgbW9yZSByZWNlbnRseS4gIEFmdGVyIFNNQUxMLCB3ZSB3aWxsIG5vdCBzZWUKLQkgYW55IGNodW5rcyBjb250YWluaW5nIHNtYWxsIG9iamVjdHM7IHdlIGNhbiBmcmVlIGFueSBiaWcKLQkgY2h1bmsgaWYgdGhlIGN1cnJlbnRfcHRyIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBCLiAgV2UKLQkgY2FuIHRoZW4gcmVzZXQgdGhlIG5ldyBjdXJyZW50X3B0ciB0byBCLiAgKi8KLQotICAgICAgZmlyc3QgPSBOVUxMOwotICAgICAgcSA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgd2hpbGUgKHEgIT0gcCkKLQl7Ci0JICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0KLQkgIG5leHQgPSBxLT5uZXh0OwotCSAgaWYgKHNtYWxsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc21hbGwgPT0gcSkKLQkJc21hbGwgPSBOVUxMOwotCSAgICAgIGZyZWUgKHEpOwotCSAgICB9Ci0JICBlbHNlIGlmIChxLT5jdXJyZW50X3B0ciA+IGIpCi0JICAgIGZyZWUgKHEpOwotCSAgZWxzZSBpZiAoZmlyc3QgPT0gTlVMTCkKLQkgICAgZmlyc3QgPSBxOwotCi0JICBxID0gbmV4dDsKLQl9Ci0KLSAgICAgIGlmIChmaXJzdCA9PSBOVUxMKQotCWZpcnN0ID0gcDsKLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGZpcnN0OwotCi0gICAgICAvKiBOb3cgc3RhcnQgYWxsb2NhdGluZyBmcm9tIHRoaXMgc21hbGwgYmxvY2sgYWdhaW4uICAqLwotICAgICAgby0+Y3VycmVudF9wdHIgPSBiOwotICAgICAgby0+Y3VycmVudF9zcGFjZSA9ICgoY2hhciAqKSBwICsgQ0hVTktfU0laRSkgLSBiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqcTsKLSAgICAgIGNoYXIgKmN1cnJlbnRfcHRyOwotCi0gICAgICAvKiBUaGlzIGJsb2NrIGlzIGluIGEgbGFyZ2UgY2h1bmsgYnkgaXRzZWxmLiAgV2UgY2FuIGZyZWUKLSAgICAgICAgIGV2ZXJ5dGhpbmcgb24gdGhlIGxpc3QgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIGJsb2NrLiAgV2UKLSAgICAgICAgIHRoZW4gc3RhcnQgYWxsb2NhdGluZyBmcm9tIHRoZSBuZXh0IGNodW5rIGNvbnRhaW5pbmcgc21hbGwKLSAgICAgICAgIG9iamVjdHMsIHNldHRpbmcgY3VycmVudF9wdHIgZnJvbSB0aGUgdmFsdWUgc3RvcmVkIHdpdGggdGhlCi0gICAgICAgICBsYXJnZSBjaHVuayB3ZSBhcmUgZnJlZWluZy4gICovCi0KLSAgICAgIGN1cnJlbnRfcHRyID0gcC0+Y3VycmVudF9wdHI7Ci0gICAgICBwID0gcC0+bmV4dDsKLQotICAgICAgcSA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgd2hpbGUgKHEgIT0gcCkKLQl7Ci0JICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0KLQkgIG5leHQgPSBxLT5uZXh0OwotCSAgZnJlZSAocSk7Ci0JICBxID0gbmV4dDsKLQl9Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIHA7Ci0KLSAgICAgIHdoaWxlIChwLT5jdXJyZW50X3B0ciAhPSBOVUxMKQotCXAgPSBwLT5uZXh0OwotCi0gICAgICBvLT5jdXJyZW50X3B0ciA9IGN1cnJlbnRfcHRyOwotICAgICAgby0+Y3VycmVudF9zcGFjZSA9ICgoY2hhciAqKSBwICsgQ0hVTktfU0laRSkgLSBjdXJyZW50X3B0cjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvb2JzdGFjay5jIGIvbGliaWJlcnR5L29ic3RhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzMThiMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvb2JzdGFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qIG9ic3RhY2suYyAtIHN1YnJvdXRpbmVzIHVzZWQgaW1wbGljaXRseSBieSBvYmplY3Qgc3RhY2sgbWFjcm9zCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLSAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBOT1RFIEJFRk9SRSBNT0RJRllJTkcgVEhJUyBGSUxFOiBUaGlzIHZlcnNpb24gbnVtYmVyIG11c3QgYmUKLSAgIGluY3JlbWVudGVkIHdoZW5ldmVyIGNhbGxlcnMgY29tcGlsZWQgdXNpbmcgYW4gb2xkIG9ic3RhY2suaCBjYW4gbm8KLSAgIGxvbmdlciBwcm9wZXJseSBjYWxsIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBvYnN0YWNrLmMuICAqLwotI2RlZmluZSBPQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OIDEKLQotLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90Ci0gICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLCBhbmQgdGhlIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICBzdXBwb3J0cyB0aGUgc2FtZSBsaWJyYXJ5IGludGVyZmFjZSB3ZSBkby4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUKLSAgIEMgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZwotICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQotICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCi0gICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QKLSAgIGZpbGVzLCBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkJLyogUmFuZG9tIHRoaW5nIHRvIGdldCBfX0dOVV9MSUJSQVJZX18uICAqLwotI2lmICFkZWZpbmVkIChfTElCQykgJiYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKSAmJiBfX0dOVV9MSUJSQVJZX18gPiAxCi0jaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+Ci0jaWYgX0dOVV9PQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OID09IE9CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04KLSNkZWZpbmUgRUxJREVfQ09ERQotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWZuZGVmIEVMSURFX0NPREUKLQotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jZGVmaW5lIFBPSU5URVIgdm9pZCAqCi0jZWxzZQotI2RlZmluZSBQT0lOVEVSIGNoYXIgKgotI2VuZGlmCi0KLS8qIERldGVybWluZSBkZWZhdWx0IGFsaWdubWVudC4gICovCi1zdHJ1Y3QgZm9vYWxpZ24ge2NoYXIgeDsgZG91YmxlIGQ7fTsKLSNkZWZpbmUgREVGQVVMVF9BTElHTk1FTlQgIFwKLSAgKChQVFJfSU5UX1RZUEUpICgoY2hhciAqKSAmKChzdHJ1Y3QgZm9vYWxpZ24gKikgMCktPmQgLSAoY2hhciAqKSAwKSkKLS8qIElmIG1hbGxvYyB3ZXJlIHJlYWxseSBzbWFydCwgaXQgd291bGQgcm91bmQgYWRkcmVzc2VzIHRvIERFRkFVTFRfQUxJR05NRU5ULgotICAgQnV0IGluIGZhY3QgaXQgbWlnaHQgYmUgbGVzcyBzbWFydCBhbmQgcm91bmQgYWRkcmVzc2VzIHRvIGFzIG11Y2ggYXMKLSAgIERFRkFVTFRfUk9VTkRJTkcuICBTbyB3ZSBwcmVwYXJlIGZvciBpdCB0byBkbyB0aGF0LiAgKi8KLXVuaW9uIGZvb3JvdW5kIHtsb25nIHg7IGRvdWJsZSBkO307Ci0jZGVmaW5lIERFRkFVTFRfUk9VTkRJTkcgKHNpemVvZiAodW5pb24gZm9vcm91bmQpKQotCi0vKiBXaGVuIHdlIGNvcHkgYSBsb25nIGJsb2NrIG9mIGRhdGEsIHRoaXMgaXMgdGhlIHVuaXQgdG8gZG8gaXQgd2l0aC4KLSAgIE9uIHNvbWUgbWFjaGluZXMsIGNvcHlpbmcgc3VjY2Vzc2l2ZSBpbnRzIGRvZXMgbm90IHdvcms7Ci0gICBpbiBzdWNoIGEgY2FzZSwgcmVkZWZpbmUgQ09QWUlOR19VTklUIHRvIGBsb25nJyAoaWYgdGhhdCB3b3JrcykKLSAgIG9yIGBjaGFyJyBhcyBhIGxhc3QgcmVzb3J0LiAgKi8KLSNpZm5kZWYgQ09QWUlOR19VTklUCi0jZGVmaW5lIENPUFlJTkdfVU5JVCBpbnQKLSNlbmRpZgotCi0KLS8qIFRoZSBmdW5jdGlvbnMgYWxsb2NhdGluZyBtb3JlIHJvb20gYnkgY2FsbGluZyBgb2JzdGFja19jaHVua19hbGxvYycKLSAgIGp1bXAgdG8gdGhlIGhhbmRsZXIgcG9pbnRlZCB0byBieSBgb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcicuCi0gICBUaGlzIHZhcmlhYmxlIGJ5IGRlZmF1bHQgcG9pbnRzIHRvIHRoZSBpbnRlcm5hbCBmdW5jdGlvbgotICAgYHByaW50X2FuZF9hYm9ydCcuICAqLwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotc3RhdGljIHZvaWQgcHJpbnRfYW5kX2Fib3J0ICh2b2lkKTsKLXZvaWQgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAodm9pZCkgPSBwcmludF9hbmRfYWJvcnQ7Ci0jZWxzZQotc3RhdGljIHZvaWQgcHJpbnRfYW5kX2Fib3J0ICgpOwotdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpID0gcHJpbnRfYW5kX2Fib3J0OwotI2VuZGlmCi0KLS8qIEV4aXQgdmFsdWUgdXNlZCB3aGVuIGBwcmludF9hbmRfYWJvcnQnIGlzIHVzZWQuICAqLwotI2lmIGRlZmluZWQgX19HTlVfTElCUkFSWV9fIHx8IGRlZmluZWQgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX0ZBSUxVUkUgMQotI2VuZGlmCi1pbnQgb2JzdGFja19leGl0X2ZhaWx1cmUgPSBFWElUX0ZBSUxVUkU7Ci0KLS8qIFRoZSBub24tR05VLUMgbWFjcm9zIGNvcHkgdGhlIG9ic3RhY2sgaW50byB0aGlzIGdsb2JhbCB2YXJpYWJsZQotICAgdG8gYXZvaWQgbXVsdGlwbGUgZXZhbHVhdGlvbi4gICovCi0KLXN0cnVjdCBvYnN0YWNrICpfb2JzdGFjazsKLQotLyogRGVmaW5lIGEgbWFjcm8gdGhhdCBlaXRoZXIgY2FsbHMgZnVuY3Rpb25zIHdpdGggdGhlIHRyYWRpdGlvbmFsIG1hbGxvYy9mcmVlCi0gICBjYWxsaW5nIGludGVyZmFjZSwgb3IgY2FsbHMgZnVuY3Rpb25zIHdpdGggdGhlIG1tYWxsb2MvbWZyZWUgaW50ZXJmYWNlCi0gICAodGhhdCBhZGRzIGFuIGV4dHJhIGZpcnN0IGFyZ3VtZW50KSwgYmFzZWQgb24gdGhlIHN0YXRlIG9mIHVzZV9leHRyYV9hcmcuCi0gICBGb3IgZnJlZSwgZG8gbm90IHVzZSA/Oiwgc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgdGhlIE1JUFMgY29tcGlsZXJzLAotICAgZG8gbm90IGFsbG93IChleHByKSA/IHZvaWQgOiB2b2lkLiAgKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2RlZmluZSBDQUxMX0NIVU5LRlVOKGgsIHNpemUpIFwKLSAgKCgoaCkgLT4gdXNlX2V4dHJhX2FyZykgXAotICAgPyAoKihoKS0+Y2h1bmtmdW4pICgoaCktPmV4dHJhX2FyZywgKHNpemUpKSBcCi0gICA6ICgqKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopIChsb25nKSkgKGgpLT5jaHVua2Z1bikgKChzaXplKSkpCi0KLSNkZWZpbmUgQ0FMTF9GUkVFRlVOKGgsIG9sZF9jaHVuaykgXAotICBkbyB7IFwKLSAgICBpZiAoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgICAgICgqKGgpLT5mcmVlZnVuKSAoKGgpLT5leHRyYV9hcmcsIChvbGRfY2h1bmspKTsgXAotICAgIGVsc2UgXAotICAgICAgKCoodm9pZCAoKikgKHZvaWQgKikpIChoKS0+ZnJlZWZ1bikgKChvbGRfY2h1bmspKTsgXAotICB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgQ0FMTF9DSFVOS0ZVTihoLCBzaXplKSBcCi0gICgoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgID8gKCooaCktPmNodW5rZnVuKSAoKGgpLT5leHRyYV9hcmcsIChzaXplKSkgXAotICAgOiAoKihzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSAoKSkgKGgpLT5jaHVua2Z1bikgKChzaXplKSkpCi0KLSNkZWZpbmUgQ0FMTF9GUkVFRlVOKGgsIG9sZF9jaHVuaykgXAotICBkbyB7IFwKLSAgICBpZiAoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgICAgICgqKGgpLT5mcmVlZnVuKSAoKGgpLT5leHRyYV9hcmcsIChvbGRfY2h1bmspKTsgXAotICAgIGVsc2UgXAotICAgICAgKCoodm9pZCAoKikgKCkpIChoKS0+ZnJlZWZ1bikgKChvbGRfY2h1bmspKTsgXAotICB9IHdoaWxlICgwKQotI2VuZGlmCi0KLQwKLS8qIEluaXRpYWxpemUgYW4gb2JzdGFjayBIIGZvciB1c2UuICBTcGVjaWZ5IGNodW5rIHNpemUgU0laRSAoMCBtZWFucyBkZWZhdWx0KS4KLSAgIE9iamVjdHMgc3RhcnQgb24gbXVsdGlwbGVzIG9mIEFMSUdOTUVOVCAoMCBtZWFucyB1c2UgZGVmYXVsdCkuCi0gICBDSFVOS0ZVTiBpcyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRvIGFsbG9jYXRlIGNodW5rcywKLSAgIGFuZCBGUkVFRlVOIHRoZSBmdW5jdGlvbiB0byBmcmVlIHRoZW0uCi0KLSAgIFJldHVybiBub256ZXJvIGlmIHN1Y2Nlc3NmdWwsIHplcm8gaWYgb3V0IG9mIG1lbW9yeS4KLSAgIFRvIHJlY292ZXIgZnJvbSBhbiBvdXQgb2YgbWVtb3J5IGVycm9yLAotICAgZnJlZSB1cCBzb21lIG1lbW9yeSwgdGhlbiBjYWxsIHRoaXMgYWdhaW4uICAqLwotCi1pbnQKLV9vYnN0YWNrX2JlZ2luIChoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKGxvbmcpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKHZvaWQgKik7Ci0jZWxzZQotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pICgpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKCk7Ci0jZW5kaWYKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpjaHVuazsgLyogcG9pbnRzIHRvIG5ldyBjaHVuayAqLwotCi0gIGlmIChhbGlnbm1lbnQgPT0gMCkKLSAgICBhbGlnbm1lbnQgPSAoaW50KSBERUZBVUxUX0FMSUdOTUVOVDsKLSAgaWYgKHNpemUgPT0gMCkKLSAgICAvKiBEZWZhdWx0IHNpemUgaXMgd2hhdCBHTlUgbWFsbG9jIGNhbiBmaXQgaW4gYSA0MDk2LWJ5dGUgYmxvY2suICAqLwotICAgIHsKLSAgICAgIC8qIDEyIGlzIHNpemVvZiAobWhlYWQpIGFuZCA0IGlzIEVYVFJBIGZyb20gR05VIG1hbGxvYy4KLQkgVXNlIHRoZSB2YWx1ZXMgZm9yIHJhbmdlIGNoZWNraW5nLCBiZWNhdXNlIGlmIHJhbmdlIGNoZWNraW5nIGlzIG9mZiwKLQkgdGhlIGV4dHJhIGJ5dGVzIHdvbid0IGJlIG1pc3NlZCB0ZXJyaWJseSwgYnV0IGlmIHJhbmdlIGNoZWNraW5nIGlzIG9uCi0JIGFuZCB3ZSB1c2VkIGEgbGFyZ2VyIHJlcXVlc3QsIGEgd2hvbGUgZXh0cmEgNDA5NiBieXRlcyB3b3VsZCBiZQotCSBhbGxvY2F0ZWQuCi0KLQkgVGhlc2UgbnVtYmVyIGFyZSBpcnJlbGV2YW50IHRvIHRoZSBuZXcgR05VIG1hbGxvYy4gIEkgc3VzcGVjdCBpdCBpcwotCSBsZXNzIHNlbnNpdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdC4gICovCi0gICAgICBpbnQgZXh0cmEgPSAoKCgoMTIgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSkKLQkJICAgICsgNCArIERFRkFVTFRfUk9VTkRJTkcgLSAxKQotCQkgICAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKTsKLSAgICAgIHNpemUgPSA0MDk2IC0gZXh0cmE7Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSh2b2lkICosIGxvbmcpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9ICh2b2lkICgqKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIGZyZWVmdW47Ci0jZWxzZQotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikoKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSBmcmVlZnVuOwotI2VuZGlmCi0gIGgtPmNodW5rX3NpemUgPSBzaXplOwotICBoLT5hbGlnbm1lbnRfbWFzayA9IGFsaWdubWVudCAtIDE7Ci0gIGgtPnVzZV9leHRyYV9hcmcgPSAwOwotCi0gIGNodW5rID0gaC0+Y2h1bmsgPSBDQUxMX0NIVU5LRlVOIChoLCBoIC0+IGNodW5rX3NpemUpOwotICBpZiAoIWNodW5rKQotICAgICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0gIGgtPm5leHRfZnJlZSA9IGgtPm9iamVjdF9iYXNlID0gY2h1bmstPmNvbnRlbnRzOwotICBoLT5jaHVua19saW1pdCA9IGNodW5rLT5saW1pdAotICAgID0gKGNoYXIgKikgY2h1bmsgKyBoLT5jaHVua19zaXplOwotICBjaHVuay0+cHJldiA9IDA7Ci0gIC8qIFRoZSBpbml0aWFsIGNodW5rIG5vdyBjb250YWlucyBubyBlbXB0eSBvYmplY3QuICAqLwotICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAwOwotICBoLT5hbGxvY19mYWlsZWQgPSAwOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1fb2JzdGFja19iZWdpbl8xIChoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuLCBhcmcpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGFsaWdubWVudDsKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoUE9JTlRFUiwgbG9uZyk7Ci0gICAgIHZvaWQgKCpmcmVlZnVuKSAoUE9JTlRFUiwgUE9JTlRFUik7Ci0jZWxzZQotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pICgpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKCk7Ci0jZW5kaWYKLSAgICAgUE9JTlRFUiBhcmc7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7IC8qIHBvaW50cyB0byBuZXcgY2h1bmsgKi8KLQotICBpZiAoYWxpZ25tZW50ID09IDApCi0gICAgYWxpZ25tZW50ID0gKGludCkgREVGQVVMVF9BTElHTk1FTlQ7Ci0gIGlmIChzaXplID09IDApCi0gICAgLyogRGVmYXVsdCBzaXplIGlzIHdoYXQgR05VIG1hbGxvYyBjYW4gZml0IGluIGEgNDA5Ni1ieXRlIGJsb2NrLiAgKi8KLSAgICB7Ci0gICAgICAvKiAxMiBpcyBzaXplb2YgKG1oZWFkKSBhbmQgNCBpcyBFWFRSQSBmcm9tIEdOVSBtYWxsb2MuCi0JIFVzZSB0aGUgdmFsdWVzIGZvciByYW5nZSBjaGVja2luZywgYmVjYXVzZSBpZiByYW5nZSBjaGVja2luZyBpcyBvZmYsCi0JIHRoZSBleHRyYSBieXRlcyB3b24ndCBiZSBtaXNzZWQgdGVycmlibHksIGJ1dCBpZiByYW5nZSBjaGVja2luZyBpcyBvbgotCSBhbmQgd2UgdXNlZCBhIGxhcmdlciByZXF1ZXN0LCBhIHdob2xlIGV4dHJhIDQwOTYgYnl0ZXMgd291bGQgYmUKLQkgYWxsb2NhdGVkLgotCi0JIFRoZXNlIG51bWJlciBhcmUgaXJyZWxldmFudCB0byB0aGUgbmV3IEdOVSBtYWxsb2MuICBJIHN1c3BlY3QgaXQgaXMKLQkgbGVzcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QuICAqLwotICAgICAgaW50IGV4dHJhID0gKCgoKDEyICsgREVGQVVMVF9ST1VORElORyAtIDEpICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpCi0JCSAgICArIDQgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkKLQkJICAgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSk7Ci0gICAgICBzaXplID0gNDA5NiAtIGV4dHJhOwotICAgIH0KLQotI2lmIGRlZmluZWQoX19TVERDX18pICYmIF9fU1REQ19fCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSh2b2lkICosbG9uZykpIGNodW5rZnVuOwotICBoLT5mcmVlZnVuID0gKHZvaWQgKCopICh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKSkgZnJlZWZ1bjsKLSNlbHNlCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSgpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9IGZyZWVmdW47Ci0jZW5kaWYKLSAgaC0+Y2h1bmtfc2l6ZSA9IHNpemU7Ci0gIGgtPmFsaWdubWVudF9tYXNrID0gYWxpZ25tZW50IC0gMTsKLSAgaC0+ZXh0cmFfYXJnID0gYXJnOwotICBoLT51c2VfZXh0cmFfYXJnID0gMTsKLQotICBjaHVuayA9IGgtPmNodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgaCAtPiBjaHVua19zaXplKTsKLSAgaWYgKCFjaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSA9IGNodW5rLT5jb250ZW50czsKLSAgaC0+Y2h1bmtfbGltaXQgPSBjaHVuay0+bGltaXQKLSAgICA9IChjaGFyICopIGNodW5rICsgaC0+Y2h1bmtfc2l6ZTsKLSAgY2h1bmstPnByZXYgPSAwOwotICAvKiBUaGUgaW5pdGlhbCBjaHVuayBub3cgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLSAgaC0+YWxsb2NfZmFpbGVkID0gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IGN1cnJlbnQgY2h1bmsgZm9yIHRoZSBvYnN0YWNrICpICi0gICBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IExFTkdUSCBieXRlcyBuZWVkIHRvIGJlIGFkZGVkCi0gICB0byB0aGUgY3VycmVudCBvYmplY3QsIG9yIGEgbmV3IG9iamVjdCBvZiBsZW5ndGggTEVOR1RIIGFsbG9jYXRlZC4KLSAgIENvcGllcyBhbnkgcGFydGlhbCBvYmplY3QgZnJvbSB0aGUgZW5kIG9mIHRoZSBvbGQgY2h1bmsKLSAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBvbmUuICAqLwotCi12b2lkCi1fb2JzdGFja19uZXdjaHVuayAoaCwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpvbGRfY2h1bmsgPSBoLT5jaHVuazsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpuZXdfY2h1bms7Ci0gIHJlZ2lzdGVyIGxvbmcJbmV3X3NpemU7Ci0gIHJlZ2lzdGVyIGxvbmcgb2JqX3NpemUgPSBoLT5uZXh0X2ZyZWUgLSBoLT5vYmplY3RfYmFzZTsKLSAgcmVnaXN0ZXIgbG9uZyBpOwotICBsb25nIGFscmVhZHk7Ci0KLSAgLyogQ29tcHV0ZSBzaXplIGZvciBuZXcgY2h1bmsuICAqLwotICBuZXdfc2l6ZSA9IChvYmpfc2l6ZSArIGxlbmd0aCkgKyAob2JqX3NpemUgPj4gMykgKyAxMDA7Ci0gIGlmIChuZXdfc2l6ZSA8IGgtPmNodW5rX3NpemUpCi0gICAgbmV3X3NpemUgPSBoLT5jaHVua19zaXplOwotCi0gIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBuZXcgY2h1bmsuICAqLwotICBuZXdfY2h1bmsgPSBDQUxMX0NIVU5LRlVOIChoLCBuZXdfc2l6ZSk7Ci0gIGlmICghbmV3X2NodW5rKQotICAgICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0gIGgtPmNodW5rID0gbmV3X2NodW5rOwotICBuZXdfY2h1bmstPnByZXYgPSBvbGRfY2h1bms7Ci0gIG5ld19jaHVuay0+bGltaXQgPSBoLT5jaHVua19saW1pdCA9IChjaGFyICopIG5ld19jaHVuayArIG5ld19zaXplOwotCi0gIC8qIE1vdmUgdGhlIGV4aXN0aW5nIG9iamVjdCB0byB0aGUgbmV3IGNodW5rLgotICAgICBXb3JkIGF0IGEgdGltZSBpcyBmYXN0IGFuZCBpcyBzYWZlIGlmIHRoZSBvYmplY3QKLSAgICAgaXMgc3VmZmljaWVudGx5IGFsaWduZWQuICAqLwotICBpZiAoaC0+YWxpZ25tZW50X21hc2sgKyAxID49IERFRkFVTFRfQUxJR05NRU5UKQotICAgIHsKLSAgICAgIGZvciAoaSA9IG9ial9zaXplIC8gc2l6ZW9mIChDT1BZSU5HX1VOSVQpIC0gMTsKLQkgICBpID49IDA7IGktLSkKLQkoKENPUFlJTkdfVU5JVCAqKW5ld19jaHVuay0+Y29udGVudHMpW2ldCi0JICA9ICgoQ09QWUlOR19VTklUICopaC0+b2JqZWN0X2Jhc2UpW2ldOwotICAgICAgLyogV2UgdXNlZCB0byBjb3B5IHRoZSBvZGQgZmV3IHJlbWFpbmluZyBieXRlcyBhcyBvbmUgZXh0cmEgQ09QWUlOR19VTklULAotCSBidXQgdGhhdCBjYW4gY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5IG9uIGEgbWFjaGluZQotCSB3aGljaCBkb2VzIG5vdCBkbyBzdHJpY3QgYWxpZ25tZW50IGZvciBDT1BZSU5HX1VOSVRTLiAgKi8KLSAgICAgIGFscmVhZHkgPSBvYmpfc2l6ZSAvIHNpemVvZiAoQ09QWUlOR19VTklUKSAqIHNpemVvZiAoQ09QWUlOR19VTklUKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhbHJlYWR5ID0gMDsKLSAgLyogQ29weSByZW1haW5pbmcgYnl0ZXMgb25lIGJ5IG9uZS4gICovCi0gIGZvciAoaSA9IGFscmVhZHk7IGkgPCBvYmpfc2l6ZTsgaSsrKQotICAgIG5ld19jaHVuay0+Y29udGVudHNbaV0gPSBoLT5vYmplY3RfYmFzZVtpXTsKLQotICAvKiBJZiB0aGUgb2JqZWN0IGp1c3QgY29waWVkIHdhcyB0aGUgb25seSBkYXRhIGluIE9MRF9DSFVOSywKLSAgICAgZnJlZSB0aGF0IGNodW5rIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgY2hhaW4uCi0gICAgIEJ1dCBub3QgaWYgdGhhdCBjaHVuayBtaWdodCBjb250YWluIGFuIGVtcHR5IG9iamVjdC4gICovCi0gIGlmIChoLT5vYmplY3RfYmFzZSA9PSBvbGRfY2h1bmstPmNvbnRlbnRzICYmICEgaC0+bWF5YmVfZW1wdHlfb2JqZWN0KQotICAgIHsKLSAgICAgIG5ld19jaHVuay0+cHJldiA9IG9sZF9jaHVuay0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgb2xkX2NodW5rKTsKLSAgICB9Ci0KLSAgaC0+b2JqZWN0X2Jhc2UgPSBuZXdfY2h1bmstPmNvbnRlbnRzOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSArIG9ial9zaXplOwotICAvKiBUaGUgbmV3IGNodW5rIGNlcnRhaW5seSBjb250YWlucyBubyBlbXB0eSBvYmplY3QgeWV0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLX0KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgb2JqZWN0IE9CSiBoYXMgYmVlbiBhbGxvY2F0ZWQgZnJvbSBvYnN0YWNrIEguCi0gICBUaGlzIGlzIGhlcmUgZm9yIGRlYnVnZ2luZy4KLSAgIElmIHlvdSB1c2UgaXQgaW4gYSBwcm9ncmFtLCB5b3UgYXJlIHByb2JhYmx5IGxvc2luZy4gICovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLS8qIFN1cHByZXNzIC1XbWlzc2luZy1wcm90b3R5cGVzIHdhcm5pbmcuICBXZSBkb24ndCB3YW50IHRvIGRlY2xhcmUgdGhpcyBpbgotICAgb2JzdGFjay5oIGJlY2F1c2UgaXQgaXMganVzdCBmb3IgZGVidWdnaW5nLiAgKi8KLWludCBfb2JzdGFja19hbGxvY2F0ZWRfcCAoc3RydWN0IG9ic3RhY2sgKmgsIFBPSU5URVIgb2JqKTsKLSNlbmRpZgotCi1pbnQKLV9vYnN0YWNrX2FsbG9jYXRlZF9wIChoLCBvYmopCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBQT0lOVEVSIG9iajsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpscDsJLyogYmVsb3cgYWRkciBvZiBhbnkgb2JqZWN0cyBpbiB0aGlzIGNodW5rICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcGxwOwkvKiBwb2ludCB0byBwcmV2aW91cyBjaHVuayBpZiBhbnkgKi8KLQotICBscCA9IChoKS0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSByYXRoZXIgdGhhbiA+IHNpbmNlIHRoZSBvYmplY3QgY2Fubm90IGJlIGV4YWN0bHkgYXQKLSAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2h1bmsgYnV0IG1pZ2h0IGJlIGFuIGVtcHR5IG9iamVjdCBleGFjdGx5Ci0gICAgIGF0IHRoZSBlbmQgb2YgYW4gYWRqYWNlbnQgY2h1bmsuICAqLwotICB3aGlsZSAobHAgIT0gMCAmJiAoKFBPSU5URVIpIGxwID49IG9iaiB8fCAoUE9JTlRFUikgKGxwKS0+bGltaXQgPCBvYmopKQotICAgIHsKLSAgICAgIHBscCA9IGxwLT5wcmV2OwotICAgICAgbHAgPSBwbHA7Ci0gICAgfQotICByZXR1cm4gbHAgIT0gMDsKLX0KLQwKLS8qIEZyZWUgb2JqZWN0cyBpbiBvYnN0YWNrIEgsIGluY2x1ZGluZyBPQkogYW5kIGV2ZXJ5dGhpbmcgYWxsb2NhdGUKLSAgIG1vcmUgcmVjZW50bHkgdGhhbiBPQkouICBJZiBPQkogaXMgemVybywgZnJlZSBldmVyeXRoaW5nIGluIEguICAqLwotCi0jdW5kZWYgb2JzdGFja19mcmVlCi0KLS8qIFRoaXMgZnVuY3Rpb24gaGFzIHR3byBuYW1lcyB3aXRoIGlkZW50aWNhbCBkZWZpbml0aW9ucy4KLSAgIFRoaXMgaXMgdGhlIGZpcnN0IG9uZSwgY2FsbGVkIGZyb20gbm9uLUFOU0kgY29kZS4gICovCi0KLXZvaWQKLV9vYnN0YWNrX2ZyZWUgKGgsIG9iaikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIFBPSU5URVIgb2JqOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmxwOwkvKiBiZWxvdyBhZGRyIG9mIGFueSBvYmplY3RzIGluIHRoaXMgY2h1bmsgKi8KLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwbHA7CS8qIHBvaW50IHRvIHByZXZpb3VzIGNodW5rIGlmIGFueSAqLwotCi0gIGxwID0gaC0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSBiZWNhdXNlIHRoZXJlIGNhbm5vdCBiZSBhbiBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNodW5rLgotICAgICBCdXQgdGhlcmUgY2FuIGJlIGFuIGVtcHR5IG9iamVjdCBhdCB0aGF0IGFkZHJlc3MKLSAgICAgYXQgdGhlIGVuZCBvZiBhbm90aGVyIGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgbHApOwotICAgICAgbHAgPSBwbHA7Ci0gICAgICAvKiBJZiB3ZSBzd2l0Y2ggY2h1bmtzLCB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBjdXJyZW50Ci0JIGNodW5rIGNvbnRhaW5zIGFuIGVtcHR5IG9iamVjdCwgc28gYXNzdW1lIHRoYXQgaXQgbWF5LiAgKi8KLSAgICAgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7Ci0gICAgfQotICBpZiAobHApCi0gICAgewotICAgICAgaC0+b2JqZWN0X2Jhc2UgPSBoLT5uZXh0X2ZyZWUgPSAoY2hhciAqKSAob2JqKTsKLSAgICAgIGgtPmNodW5rX2xpbWl0ID0gbHAtPmxpbWl0OwotICAgICAgaC0+Y2h1bmsgPSBscDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9iaiAhPSAwKQotICAgIC8qIG9iaiBpcyBub3QgaW4gYW55IG9mIHRoZSBjaHVua3MhICovCi0gICAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIEFOU0kgY29kZS4gICovCi0KLXZvaWQKLW9ic3RhY2tfZnJlZSAoaCwgb2JqKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgUE9JTlRFUiBvYmo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbHA7CS8qIGJlbG93IGFkZHIgb2YgYW55IG9iamVjdHMgaW4gdGhpcyBjaHVuayAqLwotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnBscDsJLyogcG9pbnQgdG8gcHJldmlvdXMgY2h1bmsgaWYgYW55ICovCi0KLSAgbHAgPSBoLT5jaHVuazsKLSAgLyogV2UgdXNlID49IGJlY2F1c2UgdGhlcmUgY2Fubm90IGJlIGFuIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY2h1bmsuCi0gICAgIEJ1dCB0aGVyZSBjYW4gYmUgYW4gZW1wdHkgb2JqZWN0IGF0IHRoYXQgYWRkcmVzcwotICAgICBhdCB0aGUgZW5kIG9mIGFub3RoZXIgY2h1bmsuICAqLwotICB3aGlsZSAobHAgIT0gMCAmJiAoKFBPSU5URVIpIGxwID49IG9iaiB8fCAoUE9JTlRFUikgKGxwKS0+bGltaXQgPCBvYmopKQotICAgIHsKLSAgICAgIHBscCA9IGxwLT5wcmV2OwotICAgICAgQ0FMTF9GUkVFRlVOIChoLCBscCk7Ci0gICAgICBscCA9IHBscDsKLSAgICAgIC8qIElmIHdlIHN3aXRjaCBjaHVua3MsIHdlIGNhbid0IHRlbGwgd2hldGhlciB0aGUgbmV3IGN1cnJlbnQKLQkgY2h1bmsgY29udGFpbnMgYW4gZW1wdHkgb2JqZWN0LCBzbyBhc3N1bWUgdGhhdCBpdCBtYXkuICAqLwotICAgICAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMTsKLSAgICB9Ci0gIGlmIChscCkKLSAgICB7Ci0gICAgICBoLT5vYmplY3RfYmFzZSA9IGgtPm5leHRfZnJlZSA9IChjaGFyICopIChvYmopOwotICAgICAgaC0+Y2h1bmtfbGltaXQgPSBscC0+bGltaXQ7Ci0gICAgICBoLT5jaHVuayA9IGxwOwotICAgIH0KLSAgZWxzZSBpZiAob2JqICE9IDApCi0gICAgLyogb2JqIGlzIG5vdCBpbiBhbnkgb2YgdGhlIGNodW5rcyEgKi8KLSAgICBhYm9ydCAoKTsKLX0KLQwKLWludAotX29ic3RhY2tfbWVtb3J5X3VzZWQgKGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsqIGxwOwotICByZWdpc3RlciBpbnQgbmJ5dGVzID0gMDsKLQotICBmb3IgKGxwID0gaC0+Y2h1bms7IGxwICE9IDA7IGxwID0gbHAtPnByZXYpCi0gICAgewotICAgICAgbmJ5dGVzICs9IGxwLT5saW1pdCAtIChjaGFyICopIGxwOwotICAgIH0KLSAgcmV0dXJuIG5ieXRlczsKLX0KLQwKLS8qIERlZmluZSB0aGUgZXJyb3IgaGFuZGxlci4gICovCi0jaWZuZGVmIF8KLSMgaWZkZWYgSEFWRV9MSUJJTlRMX0gKLSMgIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgIGlmbmRlZiBfCi0jICAgZGVmaW5lIF8oU3RyKSBnZXR0ZXh0IChTdHIpCi0jICBlbmRpZgotIyBlbHNlCi0jICBkZWZpbmUgXyhTdHIpIChTdHIpCi0jIGVuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXByaW50X2FuZF9hYm9ydCAoKQotewotICBmcHV0cyAoXygibWVtb3J5IGV4aGF1c3RlZFxuIiksIHN0ZGVycik7Ci0gIGV4aXQgKG9ic3RhY2tfZXhpdF9mYWlsdXJlKTsKLX0KLQwKLSNpZiAwCi0vKiBUaGVzZSBhcmUgbm93IHR1cm5lZCBvZmYgYmVjYXVzZSB0aGUgYXBwbGljYXRpb25zIGRvIG5vdCB1c2UgaXQKLSAgIGFuZCBpdCB1c2VzIGJjb3B5IHZpYSBvYnN0YWNrX2dyb3csIHdoaWNoIGNhdXNlcyB0cm91YmxlIG9uIHN5c1YuICAqLwotCi0vKiBOb3cgZGVmaW5lIHRoZSBmdW5jdGlvbmFsIHZlcnNpb25zIG9mIHRoZSBvYnN0YWNrIG1hY3Jvcy4KLSAgIERlZmluZSB0aGVtIHRvIHNpbXBseSB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgbWFjcm9zIHRvIGRvIHRoZSBqb2IuICAqLwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0vKiBUaGVzZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBkbyBub3Qgd29yayB3aXRoIG5vbi1BTlNJIHByZXByb2Nlc3NvcnM7Ci0gICB0aGV5IHdvbid0IHBhc3MgdGhyb3VnaCB0aGUgbWFjcm8gbmFtZXMgaW4gcGFyZW50aGVzZXMuICAqLwotCi0vKiBUaGUgZnVuY3Rpb24gbmFtZXMgYXBwZWFyIGluIHBhcmVudGhlc2VzIGluIG9yZGVyIHRvIHByZXZlbnQKLSAgIHRoZSBtYWNyby1kZWZpbml0aW9ucyBvZiB0aGUgbmFtZXMgZnJvbSBiZWluZyBleHBhbmRlZCB0aGVyZS4gICovCi0KLVBPSU5URVIgKG9ic3RhY2tfYmFzZSkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19iYXNlIChvYnN0YWNrKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19uZXh0X2ZyZWUpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfbmV4dF9mcmVlIChvYnN0YWNrKTsKLX0KLQotaW50IChvYnN0YWNrX29iamVjdF9zaXplKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX29iamVjdF9zaXplIChvYnN0YWNrKTsKLX0KLQotaW50IChvYnN0YWNrX3Jvb20pIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfcm9vbSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19tYWtlX3Jvb20pIChvYnN0YWNrLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgbGVuZ3RoOwotewotICByZXR1cm4gb2JzdGFja19tYWtlX3Jvb20gKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfZ3JvdykgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ncm93IChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrX2dyb3cwKSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgUE9JTlRFUiBwb2ludGVyOwotICAgICBpbnQgbGVuZ3RoOwotewotICBvYnN0YWNrX2dyb3cwIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrXzFncm93KSAob2JzdGFjaywgY2hhcmFjdGVyKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGNoYXJhY3RlcjsKLXsKLSAgb2JzdGFja18xZ3JvdyAob2JzdGFjaywgY2hhcmFjdGVyKTsKLX0KLQotdm9pZCAob2JzdGFja19ibGFuaykgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfYmxhbmsgKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfMWdyb3dfZmFzdCkgKG9ic3RhY2ssIGNoYXJhY3RlcikKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBjaGFyYWN0ZXI7Ci17Ci0gIG9ic3RhY2tfMWdyb3dfZmFzdCAob2JzdGFjaywgY2hhcmFjdGVyKTsKLX0KLQotdm9pZCAob2JzdGFja19ibGFua19mYXN0KSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ibGFua19mYXN0IChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2ZpbmlzaCkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19maW5pc2ggKG9ic3RhY2spOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2FsbG9jKSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfYWxsb2MgKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfY29weSkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfY29weSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19jb3B5MCkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfY29weTAgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Ci19Ci0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0jZW5kaWYgLyogMCAqLwotCi0jZW5kaWYJLyogIUVMSURFX0NPREUgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9wZXhlY3V0ZS5jIGIvbGliaWJlcnR5L3BleGVjdXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTk3ZGUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3BleGVjdXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzggKzAsMCBAQAotLyogVXRpbGl0aWVzIHRvIGV4ZWN1dGUgYSBwcm9ncmFtIGluIGEgc3VicHJvY2VzcyAocG9zc2libHkgbGlua2VkIGJ5IHBpcGVzCi0gICB3aXRoIG90aGVyIHN1YnByb2Nlc3NlcyksIGFuZCB3YWl0IGZvciBpdC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi13cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM6IHBleGVjdXRlIGFuZCBwd2FpdC4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBsaWJpYmVydHkgYW5kIGdjYy4KLSAgIERvbid0IGNoYW5nZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jZGVmaW5lIElTU1BBQ0UgKHgpIGlzc3BhY2UoeCkKLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2VuZGlmCi0KLSNpZmRlZiB2Zm9yayAvKiBBdXRvY29uZiBtYXkgZGVmaW5lIHRoaXMgdG8gZm9yayBmb3IgdXMuICovCi0jIGRlZmluZSBWRk9SS19TVFJJTkcgImZvcmsiCi0jZWxzZQotIyBkZWZpbmUgVkZPUktfU1RSSU5HICJ2Zm9yayIKLSNlbmRpZgotI2lmZGVmIEhBVkVfVkZPUktfSAotI2luY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLSNpZmRlZiBWTVMKLSNkZWZpbmUgdmZvcmsoKSAoZGVjYyQkYWxsb2NfdmZvcmtfYmxvY2tzKCkgPj0gMCA/IFwKLSAgICAgICAgICAgICAgIGxpYiRnZXRfY3VycmVudF9pbnZvX2NvbnRleHQoZGVjYyQkZ2V0X3Zmb3JrX2ptcGJ1ZigpKSA6IC0xKQotI2VuZGlmIC8qIFZNUyAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZiAhZGVmaW5lZCAoX19DWUdXSU5fXykgJiYgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2RlZmluZSBfX0NZR1dJTl9fIDEKLSNlbmRpZgotCi0vKiBzdGRpbiBmaWxlIG51bWJlci4gICovCi0jZGVmaW5lIFNURElOX0ZJTEVfTk8gMAotCi0vKiBzdGRvdXQgZmlsZSBudW1iZXIuICAqLwotI2RlZmluZSBTVERPVVRfRklMRV9OTyAxCi0KLS8qIHZhbHVlIG9mIGBwaXBlJzogcG9ydCBpbmRleCBmb3IgcmVhZGluZy4gICovCi0jZGVmaW5lIFJFQURfUE9SVCAwCi0KLS8qIHZhbHVlIG9mIGBwaXBlJzogcG9ydCBpbmRleCBmb3Igd3JpdGluZy4gICovCi0jZGVmaW5lIFdSSVRFX1BPUlQgMQotCi1zdGF0aWMgY2hhciAqaW5zdGFsbF9lcnJvcl9tc2cgPSAiaW5zdGFsbGF0aW9uIHByb2JsZW0sIGNhbm5vdCBleGVjIGAlcyciOwotCi0vKiBwZXhlY3V0ZTogZXhlY3V0ZSBhIHByb2dyYW0uCi0KLSAgIFBST0dSQU0gYW5kIEFSR1YgYXJlIHRoZSBhcmd1bWVudHMgdG8gZXhlY3YvZXhlY3ZwLgotCi0gICBUSElTX1BOQU1FIGlzIG5hbWUgb2YgdGhlIGNhbGxpbmcgcHJvZ3JhbSAoaS5lLiBhcmd2WzBdKS4KLQotICAgVEVNUF9CQVNFIGlzIHRoZSBwYXRoIG5hbWUsIHNhbnMgc3VmZml4LCBvZiBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQotICAgaWYgbmVlZGVkLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBuZWVkZWQgZm9yIE1TRE9TIHBvcnRzIHRoYXQgZG9uJ3QgdXNlCi0gICBHTzMyIChkbyBhbnkgc3RpbGwgZXhpc3Q/KS4gIFBvcnRzIHRoYXQgZG9uJ3QgbmVlZCBpdCBjYW4gcGFzcyBOVUxMLgotCi0gICAoRkxBR1MgJiBQRVhFQ1VURV9TRUFSQ0gpIGlzIG5vbi16ZXJvIGlmICRQQVRIIHNob3VsZCBiZSBzZWFyY2hlZAotICAgKD8/PyBJdCdzIG5vdCBjbGVhciB0aGF0IEdDQyBwYXNzZXMgdGhpcyBmbGFnIGNvcnJlY3RseSkuCi0gICAoRkxBR1MgJiBQRVhFQ1VURV9GSVJTVCkgaXMgbm9uemVybyBmb3IgdGhlIGZpcnN0IHByb2Nlc3MgaW4gY2hhaW4uCi0gICAoRkxBR1MgJiBQRVhFQ1VURV9GSVJTVCkgaXMgbm9uemVybyBmb3IgdGhlIGxhc3QgcHJvY2VzcyBpbiBjaGFpbi4KLSAgIEZJUlNUX0xBU1QgY291bGQgYmUgc2ltcGxpZmllZCB0byBvbmx5IG1hcmsgdGhlIGxhc3Qgb2YgYSBjaGFpbiBvZiBwcm9jZXNzZXMKLSAgIGJ1dCB0aGF0IHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYWx3YXlzIG1hcmsgdGhlIGxhc3Qgb25lIChhbmQgbm90IGdpdmUgdXAKLSAgIGVhcmx5IGlmIHNvbWUgZXJyb3Igb2NjdXJzKS4gIEl0J3MgbW9yZSByb2J1c3QgdG8gcmVxdWlyZSB0aGUgY2FsbGVyIHRvCi0gICBtYXJrIGJvdGggZW5kcyBvZiB0aGUgY2hhaW4uCi0KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHBpZCBvbiBzeXN0ZW1zIGxpa2UgVW5peCB3aGVyZSB3ZSBmb3JrL2V4ZWMgYW5kIG9uIHN5c3RlbXMKLSAgIGxpa2UgV0lOMzIgYW5kIE9TMiB3aGVyZSB3ZSB1c2Ugc3Bhd24uICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHdhaXQgZm9yCi0gICB0aGUgY2hpbGQuCi0KLSAgIFRoZSByZXN1bHQgaXMgdGhlIFdFWElUU1RBVFVTIG9uIHN5c3RlbXMgbGlrZSBNU0RPUyB3aGVyZSB3ZSBzcGF3biBhbmQgd2FpdAotICAgZm9yIHRoZSBjaGlsZCBoZXJlLgotCi0gICBVcG9uIGZhaWx1cmUsIEVSUk1TR19GTVQgYW5kIEVSUk1TR19BUkcgYXJlIHNldCB0byB0aGUgdGV4dCBvZiB0aGUgZXJyb3IKLSAgIG1lc3NhZ2Ugd2l0aCBhbiBvcHRpb25hbCBhcmd1bWVudCAoaWYgbm90IG5lZWRlZCwgRVJSTVNHX0FSRyBpcyBzZXQgdG8KLSAgIE5VTEwpLCBhbmQgLTEgaXMgcmV0dXJuZWQuICBgZXJybm8nIGlzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIHVzZS4KLQotICAgcHdhaXQ6IGNvdmVyIGZ1bmN0aW9uIGZvciB3YWl0LgotCi0gICBQSUQgaXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHRhc2sgdG8gd2FpdCBmb3IuCi0gICBTVEFUVVMgaXMgdGhlIGBzdGF0dXMnIGFyZ3VtZW50IHRvIHdhaXQuCi0gICBGTEFHUyBpcyBjdXJyZW50bHkgdW51c2VkIChhbGxvd3MgZnV0dXJlIGVuaGFuY2VtZW50IHdpdGhvdXQgYnJlYWtpbmcKLSAgIHVwd2FyZCBjb21wYXRpYmlsaXR5KS4gIFBhc3MgMCBmb3Igbm93LgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBwaWQgb2YgdGhlIGNoaWxkIHJlYXBlZCwKLSAgIG9yIC0xIGZvciBmYWlsdXJlIChlcnJubyBzYXlzIHdoeSkuCi0KLSAgIE9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHdhaXRpbmcgZm9yIGEgcGFydGljdWxhciBjaGlsZCwgUElEIGlzCi0gICBpZ25vcmVkLiAgT24gc3lzdGVtcyBsaWtlIE1TRE9TIHRoYXQgZG9uJ3QgcmVhbGx5IG11bHRpdGFzayBwd2FpdAotICAgaXMganVzdCBhIG1lY2hhbmlzbSB0byBwcm92aWRlIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgZm9yIHRoZSBjYWxsZXIuCi0KLSAgIHBmaW5pc2g6IGZpbmlzaCBnZW5lcmF0aW9uIG9mIHNjcmlwdAotCi0gICBwZmluaXNoIGlzIG5lY2Vzc2FyeSBmb3Igc3lzdGVtcyBsaWtlIE1QVyB3aGVyZSBhIHNjcmlwdCBpcyBnZW5lcmF0ZWQgdGhhdAotICAgcnVucyB0aGUgcmVxdWVzdGVkIHByb2dyYW1zLgotKi8KLQotI2lmZGVmIF9fTVNET1NfXwotCi0vKiBNU0RPUyBkb2Vzbid0IG11bHRpdGFzaywgYnV0IGZvciB0aGUgc2FrZSBvZiBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlCi0gICB0aGUgY29kZSBiZWhhdmVzIGxpa2UgaXQgZG9lcy4gIHBleGVjdXRlIHJ1bnMgdGhlIHByb2dyYW0sIHR1Y2tzIHRoZQotICAgZXhpdCBjb2RlIGF3YXksIGFuZCByZXR1cm5zIGEgInBpZCIuICBwd2FpdCBtdXN0IGJlIGNhbGxlZCB0byBmZXRjaCB0aGUKLSAgIGV4aXQgY29kZS4gICovCi0KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0KLS8qIEZvciBjb21tdW5pY2F0aW5nIGluZm9ybWF0aW9uIGZyb20gcGV4ZWN1dGUgdG8gcHdhaXQuICAqLwotc3RhdGljIGludCBsYXN0X3BpZCA9IDA7Ci1zdGF0aWMgaW50IGxhc3Rfc3RhdHVzID0gMDsKLXN0YXRpYyBpbnQgbGFzdF9yZWFwZWQgPSAwOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgcmM7Ci0KLSAgbGFzdF9waWQrKzsKLSAgaWYgKGxhc3RfcGlkIDwgMCkKLSAgICBsYXN0X3BpZCA9IDE7Ci0KLSAgaWYgKChmbGFncyAmIFBFWEVDVVRFX09ORSkgIT0gUEVYRUNVVEVfT05FKQotICAgIGFib3J0ICgpOwotCi0jaWZkZWYgX19HTzMyX18KLSAgLyogPz8/IFdoYXQgYXJlIHRoZSBwb3NzaWJsZSByZXR1cm4gdmFsdWVzIGZyb20gc3Bhd252PyAgKi8KLSAgcmMgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBzcGF3bnZwIDogc3Bhd252KSAoMSwgcHJvZ3JhbSwgYXJndik7Ci0jZWxzZQotICBjaGFyICpzY21kLCAqcmY7Ci0gIEZJTEUgKmFyZ2ZpbGU7Ci0gIGludCBpLCBlbCA9IGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gNCA6IDA7Ci0KLSAgc2NtZCA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocHJvZ3JhbSkgKyBzdHJsZW4gKHRlbXBfYmFzZSkgKyA2ICsgZWwpOwotICByZiA9IHNjbWQgKyBzdHJsZW4ocHJvZ3JhbSkgKyAyICsgZWw7Ci0gIHNwcmludGYgKHNjbWQsICIlcyVzIEAlcy5ncCIsIHByb2dyYW0sCi0JICAgKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gIi5leGUiIDogIiIpLCB0ZW1wX2Jhc2UpOwotICBhcmdmaWxlID0gZm9wZW4gKHJmLCAidyIpOwotICBpZiAoYXJnZmlsZSA9PSAwKQotICAgIHsKLSAgICAgIGludCBlcnJub19zYXZlID0gZXJybm87Ci0gICAgICBmcmVlIChzY21kKTsKLSAgICAgIGVycm5vID0gZXJybm9fc2F2ZTsKLSAgICAgICplcnJtc2dfZm10ID0gImNhbm5vdCBvcGVuIGAlcy5ncCciOwotICAgICAgKmVycm1zZ19hcmcgPSB0ZW1wX2Jhc2U7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCi0gICAgewotICAgICAgY2hhciAqY3A7Ci0gICAgICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQotCXsKLQkgIGlmICgqY3AgPT0gJyInIHx8ICpjcCA9PSAnXCcnIHx8ICpjcCA9PSAnXFwnIHx8IElTU1BBQ0UgKCpjcCkpCi0JICAgIGZwdXRjICgnXFwnLCBhcmdmaWxlKTsKLQkgIGZwdXRjICgqY3AsIGFyZ2ZpbGUpOwotCX0KLSAgICAgIGZwdXRjICgnXG4nLCBhcmdmaWxlKTsKLSAgICB9Ci0gIGZjbG9zZSAoYXJnZmlsZSk7Ci0KLSAgcmMgPSBzeXN0ZW0gKHNjbWQpOwotCi0gIHsKLSAgICBpbnQgZXJybm9fc2F2ZSA9IGVycm5vOwotICAgIHJlbW92ZSAocmYpOwotICAgIGZyZWUgKHNjbWQpOwotICAgIGVycm5vID0gZXJybm9fc2F2ZTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKHJjID09IC0xKQotICAgIHsKLSAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7Ci0gICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIFR1Y2sgdGhlIHN0YXR1cyBhd2F5IGZvciBwd2FpdCwgYW5kIHJldHVybiBhICJwaWQiLiAgKi8KLSAgbGFzdF9zdGF0dXMgPSByYyA8PCA4OwotICByZXR1cm4gbGFzdF9waWQ7Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgLyogT24gTVNET1MgZWFjaCBwZXhlY3V0ZSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGl0J3MgYXNzb2NpYXRlZCBwd2FpdC4gICovCi0gIGlmIChwaWQgIT0gbGFzdF9waWQKLSAgICAgIC8qIENhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgY2hpbGQ/ICAqLwotICAgICAgfHwgcGlkID09IGxhc3RfcmVhcGVkKQotICAgIHsKLSAgICAgIC8qID8/PyBFQ0hJTEQgd291bGQgYmUgYSBiZXR0ZXIgY2hvaWNlLiAgQ2FuIHdlIHVzZSBpdCBoZXJlPyAgKi8KLSAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0gICpzdGF0dXMgPSBsYXN0X3N0YXR1czsKLSAgbGFzdF9yZWFwZWQgPSBsYXN0X3BpZDsKLSAgcmV0dXJuIGxhc3RfcGlkOwotfQotCi0jZW5kaWYgLyogTVNET1MgKi8KLQotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX1VXSU5fXykKLQotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLQotI2lmZGVmIF9fQ1lHV0lOX18KLQotI2RlZmluZSBmaXhfYXJndihhcmd2ZWMpIChhcmd2ZWMpCi0KLWV4dGVybiBpbnQgX3NwYXdudiAoKTsKLWV4dGVybiBpbnQgX3NwYXdudnAgKCk7Ci0KLSNlbHNlIC8qICEgX19DWUdXSU5fXyAqLwotCi0vKiBUaGlzIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlIE1pY3Jvc29mdCBDIHNwYXduIGZ1bmN0aW9ucycgcHJvcGVuc2l0eQotICAgdG8gcmVtb3ZlIHRoZSBvdXRlcm1vc3Qgc2V0IG9mIGRvdWJsZSBxdW90ZXMgZnJvbSBhbGwgYXJndW1lbnRzLiAgKi8KLQotY29uc3QgY2hhciAqIGNvbnN0ICoKLWZpeF9hcmd2IChhcmd2ZWMpCi0gICAgIGNoYXIgKiphcmd2ZWM7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDE7IGFyZ3ZlY1tpXSAhPSAwOyBpKyspCi0gICAgewotICAgICAgaW50IGxlbiwgajsKLSAgICAgIGNoYXIgKnRlbXAsICpuZXd0ZW1wOwotCi0gICAgICB0ZW1wID0gYXJndmVjW2ldOwotICAgICAgbGVuID0gc3RybGVuICh0ZW1wKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKLSAgICAgICAgewotICAgICAgICAgIGlmICh0ZW1wW2pdID09ICciJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmV3dGVtcCA9IHhtYWxsb2MgKGxlbiArIDIpOwotICAgICAgICAgICAgICBzdHJuY3B5IChuZXd0ZW1wLCB0ZW1wLCBqKTsKLSAgICAgICAgICAgICAgbmV3dGVtcCBbal0gPSAnXFwnOwotICAgICAgICAgICAgICBzdHJuY3B5ICgmbmV3dGVtcCBbaisxXSwgJnRlbXAgW2pdLCBsZW4taik7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgW2xlbisxXSA9IDA7Ci0gICAgICAgICAgICAgIHRlbXAgPSBuZXd0ZW1wOwotICAgICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXJndmVjW2ldID0gdGVtcDsKLSAgICAgIH0KLQotICByZXR1cm4gKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBhcmd2ZWM7Ci19Ci0jZW5kaWYgLyogX19DWUdXSU5fXyAqLwotCi0jaW5jbHVkZSA8aW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBtaW5ndzMyIGhlYWRlcnMgbWF5IG5vdCBkZWZpbmUgdGhlIGZvbGxvd2luZy4gICovCi0KLSNpZm5kZWYgX1BfV0FJVAotIyAgZGVmaW5lIF9QX1dBSVQJMAotIyAgZGVmaW5lIF9QX05PV0FJVAkxCi0jICBkZWZpbmUgX1BfT1ZFUkxBWQkyCi0jICBkZWZpbmUgX1BfTk9XQUlUTwkzCi0jICBkZWZpbmUgX1BfREVUQUNICTQKLQotIyAgZGVmaW5lIFdBSVRfQ0hJTEQJMAotIyAgZGVmaW5lIFdBSVRfR1JBTkRDSElMRAkxCi0jZW5kaWYKLQotLyogV2luMzIgc3VwcG9ydHMgcGlwZXMgKi8KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCBwaWQ7Ci0gIGludCBwZGVzWzJdLCBvcmdfc3RkaW4sIG9yZ19zdGRvdXQ7Ci0gIGludCBpbnB1dF9kZXNjLCBvdXRwdXRfZGVzYzsKLSAgaW50IHJldHJpZXMsIHNsZWVwX2ludGVydmFsOwotCi0gIC8qIFBpcGUgd2FpdGluZyBmcm9tIGxhc3QgcHJvY2VzcywgdG8gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhlIG5leHQgb25lLgotICAgICBWYWx1ZSBpcyBTVERJTl9GSUxFX05PIGlmIG5vIHBpcGUgaXMgd2FpdGluZwotICAgICAoaS5lLiB0aGUgbmV4dCBjb21tYW5kIGlzIHRoZSBmaXJzdCBvZiBhIGdyb3VwKS4gICovCi0gIHN0YXRpYyBpbnQgbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHByb2Nlc3MsIGluaXRpYWxpemUuICAqLwotICBpZiAoZmxhZ3MgJiBQRVhFQ1VURV9GSVJTVCkKLSAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POwotCi0gIGlucHV0X2Rlc2MgPSBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBwcm9jZXNzLCBtYWtlIGEgcGlwZSBmb3IgaXRzIG91dHB1dCwKLSAgICAgYW5kIHJlY29yZCBpdCBhcyB3YWl0aW5nIHRvIGJlIHRoZSBpbnB1dCB0byB0aGUgbmV4dCBwcm9jZXNzLiAgKi8KLSAgaWYgKCEgKGZsYWdzICYgUEVYRUNVVEVfTEFTVCkpCi0gICAgewotICAgICAgaWYgKF9waXBlIChwZGVzLCAyNTYsIE9fQklOQVJZKSA8IDApCi0JewotCSAgKmVycm1zZ19mbXQgPSAicGlwZSI7Ci0JICAqZXJybXNnX2FyZyA9IE5VTEw7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgb3V0cHV0X2Rlc2MgPSBwZGVzW1dSSVRFX1BPUlRdOwotICAgICAgbGFzdF9waXBlX2lucHV0ID0gcGRlc1tSRUFEX1BPUlRdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIExhc3QgcHJvY2Vzcy4gICovCi0gICAgICBvdXRwdXRfZGVzYyA9IFNURE9VVF9GSUxFX05POwotICAgICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLSAgICB9Ci0KLSAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLSAgICB7Ci0gICAgICBvcmdfc3RkaW4gPSBkdXAgKFNURElOX0ZJTEVfTk8pOwotICAgICAgZHVwMiAoaW5wdXRfZGVzYywgU1RESU5fRklMRV9OTyk7Ci0gICAgICBjbG9zZSAoaW5wdXRfZGVzYyk7IAotICAgIH0KLQotICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0gICAgewotICAgICAgb3JnX3N0ZG91dCA9IGR1cCAoU1RET1VUX0ZJTEVfTk8pOwotICAgICAgZHVwMiAob3V0cHV0X2Rlc2MsIFNURE9VVF9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChvdXRwdXRfZGVzYyk7Ci0gICAgfQotCi0gIHBpZCA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IF9zcGF3bnZwIDogX3NwYXdudikKLSAgICAoX1BfTk9XQUlULCBwcm9ncmFtLCBmaXhfYXJndihhcmd2KSk7Ci0KLSAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLSAgICB7Ci0gICAgICBkdXAyIChvcmdfc3RkaW4sIFNURElOX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKG9yZ19zdGRpbik7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLSAgICB7Ci0gICAgICBkdXAyIChvcmdfc3Rkb3V0LCBTVERPVVRfRklMRV9OTyk7Ci0gICAgICBjbG9zZSAob3JnX3N0ZG91dCk7Ci0gICAgfQotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgKmVycm1zZ19mbXQgPSBpbnN0YWxsX2Vycm9yX21zZzsKLSAgICAgICplcnJtc2dfYXJnID0gcHJvZ3JhbTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHBpZDsKLX0KLQotLyogTVMgQ1JURExMIGRvZXNuJ3QgcmV0dXJuIGVub3VnaCBpbmZvcm1hdGlvbiBpbiBzdGF0dXMgdG8gZGVjaWRlIGlmIHRoZQotICAgY2hpbGQgZXhpdGVkIGR1ZSB0byBhIHNpZ25hbCBvciBub3QsIHJhdGhlciBpdCBzaW1wbHkgcmV0dXJucyBhbgotICAgaW50ZWdlciB3aXRoIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNoaWxkOyBlZy4sIGlmIHRoZSBjaGlsZCBleGl0ZWQgd2l0aCAKLSAgIGFuIGFib3J0KCkgY2FsbCBhbmQgZGlkbid0IGhhdmUgYSBoYW5kbGVyIGZvciBTSUdBQlJULCBpdCBzaW1wbHkgcmV0dXJucwotICAgd2l0aCBzdGF0dXMgPSAzLiBXZSBmaXggdGhlIHN0YXR1cyBjb2RlIHRvIGNvbmZvcm0gdG8gdGhlIHVzdWFsIFdJRioKLSAgIG1hY3Jvcy4gTm90ZSB0aGF0IFdJRlNJR05BTEVEIHdpbGwgbmV2ZXIgYmUgdHJ1ZSB1bmRlciBDUlRETEwuICovCi0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSNpZmRlZiBfX0NZR1dJTl9fCi0gIHJldHVybiB3YWl0IChzdGF0dXMpOwotI2Vsc2UKLSAgaW50IHRlcm1zdGF0OwotCi0gIHBpZCA9IF9jd2FpdCAoJnRlcm1zdGF0LCBwaWQsIFdBSVRfQ0hJTEQpOwotCi0gIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgotICAgICBOZWVkZWQ/ICAqLwotCi0gIC8qIGN3YWl0IHJldHVybnMgdGhlIGNoaWxkIHByb2Nlc3MgZXhpdCBjb2RlIGluIHRlcm1zdGF0LgotICAgICBBIHZhbHVlIG9mIDMgaW5kaWNhdGVzIHRoYXQgdGhlIGNoaWxkIGNhdWdodCBhIHNpZ25hbCwgYnV0IG5vdAotICAgICB3aGljaCBvbmUuICBTaW5jZSBvbmx5IFNJR0FCUlQsIFNJR0ZQRSBhbmQgU0lHSU5UIGRvIGFueXRoaW5nLCB3ZQotICAgICByZXBvcnQgU0lHQUJSVC4gICovCi0gIGlmICh0ZXJtc3RhdCA9PSAzKQotICAgICpzdGF0dXMgPSBTSUdBQlJUOwotICBlbHNlCi0gICAgKnN0YXR1cyA9ICgoKHRlcm1zdGF0KSAmIDB4ZmYpIDw8IDgpOwotCi0gIHJldHVybiBwaWQ7Ci0jZW5kaWYgLyogX19DWUdXSU5fXyAqLwotfQotCi0jZW5kaWYgLyogX1dJTjMyICYmICEgX19VV0lOX18gKi8KLQotI2lmZGVmIE9TMgotCi0vKiA/Pz8gRG9lcyBPUzIgaGF2ZSBwcm9jZXNzLmg/ICAqLwotZXh0ZXJuIGludCBzcGF3bnYgKCk7Ci1leHRlcm4gaW50IHNwYXdudnAgKCk7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCBwaWQ7Ci0KLSAgaWYgKChmbGFncyAmIFBFWEVDVVRFX09ORSkgIT0gUEVYRUNVVEVfT05FKQotICAgIGFib3J0ICgpOwotICAvKiA/Pz8gUHJlc3VtYWJseSAxID09IF9QX05PV0FJVC4gICovCi0gIHBpZCA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IHNwYXdudnAgOiBzcGF3bnYpICgxLCBwcm9ncmFtLCBhcmd2KTsKLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICAqZXJybXNnX2ZtdCA9IGluc3RhbGxfZXJyb3JfbXNnOwotICAgICAgKmVycm1zZ19hcmcgPSBwcm9ncmFtOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIHBpZDsKLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLSAgaW50IHBpZCA9IHdhaXQgKHN0YXR1cyk7Ci0gIHJldHVybiBwaWQ7Ci19Ci0KLSNlbmRpZiAvKiBPUzIgKi8KLQotI2lmZGVmIE1QVwotCi0vKiBNUFcgcGV4ZWN1dGUgZG9lc24ndCBhY3R1YWxseSBydW4gYW55dGhpbmc7IGluc3RlYWQsIGl0IHdyaXRlcyBvdXQKLSAgIHNjcmlwdCBjb21tYW5kcyB0aGF0LCB3aGVuIHJ1biwgd2lsbCBkbyB0aGUgYWN0dWFsIGV4ZWN1dGluZy4KLQotICAgRm9yIGV4YW1wbGUsIGluIEdDQydzIGNhc2UsIEdDQyB3aWxsIHdyaXRlIG91dCBzZXZlcmFsIHNjcmlwdCBjb21tYW5kczoKLQotICAgY3BwIC4uLgotICAgY2MxIC4uLgotICAgYXMgLi4uCi0gICBsZCAuLi4KLQotICAgYW5kIHRoZW4gZXhpdC4gIE5vbmUgb2YgdGhlIGFib3ZlIHByb2dyYW1zIHdpbGwgaGF2ZSBydW4geWV0LiAgVGhlIHRhc2sKLSAgIHRoYXQgY2FsbGVkIEdDQyB3aWxsIHRoZW4gZXhlY3V0ZSB0aGUgc2NyaXB0IGFuZCBjYXVzZSBjcHAsZXRjLiB0byBydW4uCi0gICBUaGUgY2FsbGVyIG11c3QgaW52b2tlIHBmaW5pc2ggYmVmb3JlIGNhbGxpbmcgZXhpdC4gIFRoaXMgYWRkcwotICAgdGhlIGZpbmlzaGluZyB0b3VjaGVzIHRvIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LiAgKi8KLQotc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgY2hhciB0bXBwcm9ncmFtWzI1NV07Ci0gIGNoYXIgKmNwLCAqdG1wbmFtZTsKLSAgaW50IGk7Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChwcm9ncmFtLCB0bXBwcm9ncmFtKTsKLSAgaWYgKGZpcnN0X3RpbWUpCi0gICAgewotICAgICAgcHJpbnRmICgiU2V0IEZhaWxlZCAwXG4iKTsKLSAgICAgIGZpcnN0X3RpbWUgPSAwOwotICAgIH0KLQotICBmcHV0cyAoIklmIHtGYWlsZWR9ID09IDBcbiIsIHN0ZG91dCk7Ci0gIC8qIElmIGJlaW5nIHZlcmJvc2UsIG91dHB1dCBhIGNvcHkgb2YgdGhlIGNvbW1hbmQuICBJdCBzaG91bGQgYmUKLSAgICAgYWNjdXJhdGUgZW5vdWdoIGFuZCBlc2NhcGVkIGVub3VnaCB0byBiZSAiY2xpY2thYmxlIi4gICovCi0gIGlmIChmbGFncyAmIFBFWEVDVVRFX1ZFUkJPU0UpCi0gICAgewotICAgICAgZnB1dHMgKCJcdEVjaG8gIiwgc3Rkb3V0KTsKLSAgICAgIGZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZnB1dHMgKHRtcHByb2dyYW0sIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0gICAgICBmb3IgKGk9MTsgYXJndltpXTsgaSsrKQotCXsKLQkgIGZwdXRjICgnXCcnLCBzdGRvdXQpOwotCSAgLyogU2VlIGlmIHdlIGhhdmUgYW4gYXJndW1lbnQgdGhhdCBuZWVkcyBmaXhpbmcuICAqLwotCSAgaWYgKHN0cmNocihhcmd2W2ldLCAnLycpKQotCSAgICB7Ci0JICAgICAgdG1wbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDI1Nik7Ci0JICAgICAgbXB3aWZ5X2ZpbGVuYW1lIChhcmd2W2ldLCB0bXBuYW1lKTsKLQkgICAgICBhcmd2W2ldID0gdG1wbmFtZTsKLQkgICAgfQotCSAgZm9yIChjcCA9IGFyZ3ZbaV07ICpjcDsgY3ArKykKLQkgICAgewotCSAgICAgIC8qIFdyaXRlIGFuIE9wdGlvbi1kIGVzY2FwZSBjaGFyIGluIGZyb250IG9mIHNwZWNpYWwgY2hhcnMuICAqLwotCSAgICAgIGlmIChzdHJjaHIoIicrIiwgKmNwKSkKLQkJZnB1dGMgKCdcMjY2Jywgc3Rkb3V0KTsKLQkgICAgICBmcHV0YyAoKmNwLCBzdGRvdXQpOwotCSAgICB9Ci0JICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLQkgIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0JfQotICAgICAgZnB1dHMgKCJcbiIsIHN0ZG91dCk7Ci0gICAgfQotICBmcHV0cyAoIlx0Iiwgc3Rkb3V0KTsKLSAgZnB1dHMgKHRtcHByb2dyYW0sIHN0ZG91dCk7Ci0gIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0KLSAgZm9yIChpPTE7IGFyZ3ZbaV07IGkrKykKLSAgICB7Ci0gICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBhcmd1bWVudCB0aGF0IG5lZWRzIGZpeGluZy4gICovCi0gICAgICBpZiAoc3RyY2hyKGFyZ3ZbaV0sICcvJykpCi0JewotCSAgdG1wbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDI1Nik7Ci0JICBtcHdpZnlfZmlsZW5hbWUgKGFyZ3ZbaV0sIHRtcG5hbWUpOwotCSAgYXJndltpXSA9IHRtcG5hbWU7Ci0JfQotICAgICAgaWYgKHN0cmNociAoYXJndltpXSwgJyAnKSkKLQlmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZvciAoY3AgPSBhcmd2W2ldOyAqY3A7IGNwKyspCi0JewotCSAgLyogV3JpdGUgYW4gT3B0aW9uLWQgZXNjYXBlIGNoYXIgaW4gZnJvbnQgb2Ygc3BlY2lhbCBjaGFycy4gICovCi0JICBpZiAoc3RyY2hyKCInKyIsICpjcCkpCi0JICAgIGZwdXRjICgnXDI2NicsIHN0ZG91dCk7Ci0JICBmcHV0YyAoKmNwLCBzdGRvdXQpOwotCX0KLSAgICAgIGlmIChzdHJjaHIgKGFyZ3ZbaV0sICcgJykpCi0JZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotICAgIH0KLQotICBmcHV0cyAoIlxuIiwgc3Rkb3V0KTsKLQotICAvKiBPdXRwdXQgY29tbWFuZHMgdGhhdCBhcnJhbmdlIHRvIGNsZWFuIHVwIGFuZCBleGl0IGlmIGEgZmFpbHVyZSBvY2N1cnMuCi0gICAgIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBjb2xsZWN0IHRoZSBzdGF0dXMgZnJvbSB0aGUgcHJvZ3JhbSB0aGF0IHdhcwotICAgICBydW4sIHJhdGhlciB0aGFuIHNvbWUgb3RoZXIgc2NyaXB0IGNvbW1hbmQuICBBbHNvLCB3ZSBkb24ndCBleGl0Ci0gICAgIGltbWVkaWF0ZWx5LCBzaW5jZSBuZWNlc3NhcnkgY2xlYW51cHMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNjcmlwdC4gICovCi0gIGZwdXRzICgiXHRTZXQgVG1wU3RhdHVzIHtTdGF0dXN9XG4iLCBzdGRvdXQpOwotICBmcHV0cyAoIlx0SWYge1RtcFN0YXR1c30gIT0gMFxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJcdFx0U2V0IEZhaWxlZCB7VG1wU3RhdHVzfVxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJcdEVuZFxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJFbmRcbiIsIHN0ZG91dCk7Ci0KLSAgLyogV2UncmUganVzdCBjb21wb3NpbmcgYSBzY3JpcHQsIGNhbid0IGZhaWwgaGVyZS4gICovCi0gIHJldHVybiAwOwotfQotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gICpzdGF0dXMgPSAwOwotICByZXR1cm4gMDsKLX0KLQotLyogV3JpdGUgb3V0IGNvbW1hbmRzIHRoYXQgd2lsbCBleGl0IHdpdGggdGhlIGNvcnJlY3QgZXJyb3IgY29kZQotICAgaWYgc29tZXRoaW5nIGluIHRoZSBzY3JpcHQgZmFpbGVkLiAgKi8KLQotdm9pZAotcGZpbmlzaCAoKQotewotICBwcmludGYgKCJcdEV4aXQgXCJ7RmFpbGVkfVwiXG4iKTsKLX0KLQotI2VuZGlmIC8qIE1QVyAqLwotCi0vKiBpbmNsdWRlIGZvciBVbml4LWxpa2UgZW52aXJvbm1lbnRzIGJ1dCBub3QgZm9yIERvcy1saWtlIGVudmlyb25tZW50cyAqLwotI2lmICEgZGVmaW5lZCAoX19NU0RPU19fKSAmJiAhIGRlZmluZWQgKE9TMikgJiYgISBkZWZpbmVkIChNUFcpIFwKLSAgICAmJiAhIChkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19VV0lOX18pKQotCi1leHRlcm4gaW50IGV4ZWN2ICgpOwotZXh0ZXJuIGludCBleGVjdnAgKCk7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCAoKmZ1bmMpKCkgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBleGVjdnAgOiBleGVjdik7Ci0gIGludCBwaWQ7Ci0gIGludCBwZGVzWzJdOwotICBpbnQgaW5wdXRfZGVzYywgb3V0cHV0X2Rlc2M7Ci0gIGludCByZXRyaWVzLCBzbGVlcF9pbnRlcnZhbDsKLSAgLyogUGlwZSB3YWl0aW5nIGZyb20gbGFzdCBwcm9jZXNzLCB0byBiZSB1c2VkIGFzIGlucHV0IGZvciB0aGUgbmV4dCBvbmUuCi0gICAgIFZhbHVlIGlzIFNURElOX0ZJTEVfTk8gaWYgbm8gcGlwZSBpcyB3YWl0aW5nCi0gICAgIChpLmUuIHRoZSBuZXh0IGNvbW1hbmQgaXMgdGhlIGZpcnN0IG9mIGEgZ3JvdXApLiAgKi8KLSAgc3RhdGljIGludCBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcHJvY2VzcywgaW5pdGlhbGl6ZS4gICovCi0gIGlmIChmbGFncyAmIFBFWEVDVVRFX0ZJUlNUKQotICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0KLSAgaW5wdXRfZGVzYyA9IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzbid0IHRoZSBsYXN0IHByb2Nlc3MsIG1ha2UgYSBwaXBlIGZvciBpdHMgb3V0cHV0LAotICAgICBhbmQgcmVjb3JkIGl0IGFzIHdhaXRpbmcgdG8gYmUgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHByb2Nlc3MuICAqLwotICBpZiAoISAoZmxhZ3MgJiBQRVhFQ1VURV9MQVNUKSkKLSAgICB7Ci0gICAgICBpZiAocGlwZSAocGRlcykgPCAwKQotCXsKLQkgICplcnJtc2dfZm10ID0gInBpcGUiOwotCSAgKmVycm1zZ19hcmcgPSBOVUxMOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIG91dHB1dF9kZXNjID0gcGRlc1tXUklURV9QT1JUXTsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IHBkZXNbUkVBRF9QT1JUXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMYXN0IHByb2Nlc3MuICAqLwotICAgICAgb3V0cHV0X2Rlc2MgPSBTVERPVVRfRklMRV9OTzsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0gICAgfQotCi0gIC8qIEZvcmsgYSBzdWJwcm9jZXNzOyB3YWl0IGFuZCByZXRyeSBpZiBpdCBmYWlscy4gICovCi0gIHNsZWVwX2ludGVydmFsID0gMTsKLSAgZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDQ7IHJldHJpZXMrKykKLSAgICB7Ci0gICAgICBwaWQgPSB2Zm9yayAoKTsKLSAgICAgIGlmIChwaWQgPj0gMCkKLQlicmVhazsKLSAgICAgIHNsZWVwIChzbGVlcF9pbnRlcnZhbCk7Ci0gICAgICBzbGVlcF9pbnRlcnZhbCAqPSAyOwotICAgIH0KLQotICBzd2l0Y2ggKHBpZCkKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHsKLQkqZXJybXNnX2ZtdCA9IFZGT1JLX1NUUklORzsKLQkqZXJybXNnX2FyZyA9IE5VTEw7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgY2FzZSAwOiAvKiBjaGlsZCAqLwotICAgICAgLyogTW92ZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBwaXBlcyBpbnRvIHBsYWNlLCBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLQl7Ci0JICBjbG9zZSAoU1RESU5fRklMRV9OTyk7Ci0JICBkdXAgKGlucHV0X2Rlc2MpOwotCSAgY2xvc2UgKGlucHV0X2Rlc2MpOwotCX0KLSAgICAgIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLQl7Ci0JICBjbG9zZSAoU1RET1VUX0ZJTEVfTk8pOwotCSAgZHVwIChvdXRwdXRfZGVzYyk7Ci0JICBjbG9zZSAob3V0cHV0X2Rlc2MpOwotCX0KLQotICAgICAgLyogQ2xvc2UgdGhlIHBhcmVudCdzIGRlc2NzIHRoYXQgYXJlbid0IHdhbnRlZCBoZXJlLiAgKi8KLSAgICAgIGlmIChsYXN0X3BpcGVfaW5wdXQgIT0gU1RESU5fRklMRV9OTykKLQljbG9zZSAobGFzdF9waXBlX2lucHV0KTsKLQotICAgICAgLyogRXhlYyB0aGUgcHJvZ3JhbS4gICovCi0gICAgICAoKmZ1bmMpIChwcm9ncmFtLCBhcmd2KTsKLQotICAgICAgLyogTm90ZTogQ2FsbGluZyBmcHJpbnRmIGFuZCBleGl0IGhlcmUgZG9lc24ndCBzZWVtIHJpZ2h0IGZvciB2Zm9yay4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgdGhpc19wbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIGluc3RhbGxfZXJyb3JfbXNnLCBwcm9ncmFtKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogJXNcbiIsIHhzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIEluIHRoZSBwYXJlbnQsIGFmdGVyIGZvcmtpbmcuCi0JIENsb3NlIHRoZSBkZXNjcmlwdG9ycyB0aGF0IHdlIG1hZGUgZm9yIHRoaXMgY2hpbGQuICAqLwotICAgICAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLQljbG9zZSAoaW5wdXRfZGVzYyk7Ci0gICAgICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0JY2xvc2UgKG91dHB1dF9kZXNjKTsKLQotICAgICAgLyogUmV0dXJuIGNoaWxkJ3MgcHJvY2VzcyBudW1iZXIuICAqLwotICAgICAgcmV0dXJuIHBpZDsKLSAgICB9Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0jaWZkZWYgVk1TCi0gIHBpZCA9IHdhaXRwaWQgKC0xLCBzdGF0dXMsIDApOwotI2Vsc2UKLSAgcGlkID0gd2FpdCAoc3RhdHVzKTsKLSNlbmRpZgotICByZXR1cm4gcGlkOwotfQotCi0jZW5kaWYgLyogISBfX01TRE9TX18gJiYgISBPUzIgJiYgISBNUFcgJiYgISAoX1dJTjMyICYmICEgX19VV0lOX18pICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcmFuZG9tLmMgYi9saWJpYmVydHkvcmFuZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTUwNzAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3JhbmRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQotICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKLSAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKLSAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKLSAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCi0gKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotLyoKLSAqIFRoaXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBCZXJrZWxleSBzb3VyY2U6Ci0gKglAKCMpcmFuZG9tLmMJNS41IChCZXJrZWxleSkgNy82Lzg4Ci0gKiBJdCB3YXMgcmV3b3JrZWQgZm9yIHRoZSBHTlUgQyBMaWJyYXJ5IGJ5IFJvbGFuZCBNY0dyYXRoLgotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWYgMAotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2Vsc2UKLQotI2RlZmluZQlVTE9OR19NQVggICgodW5zaWduZWQgbG9uZykofjBMKSkgICAgIC8qIDB4RkZGRkZGRkYgZm9yIDMyLWJpdHMgKi8KLSNkZWZpbmUJTE9OR19NQVggICAoKGxvbmcpKFVMT05HX01BWCA+PiAxKSkgICAvKiAweDdGRkZGRkZGIGZvciAzMi1iaXRzKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jICBkZWZpbmUgUFRSIHZvaWQgKgotIyAgaWZuZGVmIE5VTEwKLSMgICAgZGVmaW5lIE5VTEwgKHZvaWQgKikgMAotIyAgZW5kaWYKLSNlbHNlCi0jICBkZWZpbmUgUFRSIGNoYXIgKgotIyAgaWZuZGVmIE5VTEwKLSMgICAgZGVmaW5lIE5VTEwgKHZvaWQgKikgMAotIyAgZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYKLQotbG9uZyBpbnQgcmFuZG9tICgpOwotCi0vKiBBbiBpbXByb3ZlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gcGFja2FnZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZAotICAgcmFuZCgpL3NyYW5kKCkgbGlrZSBpbnRlcmZhY2UsIHRoaXMgcGFja2FnZSBhbHNvIGhhcyBhIHNwZWNpYWwgc3RhdGUgaW5mbwotICAgaW50ZXJmYWNlLiAgVGhlIGluaXRzdGF0ZSgpIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggYSBzZWVkLCBhbiBhcnJheSBvZgotICAgYnl0ZXMsIGFuZCBhIGNvdW50IG9mIGhvdyBtYW55IGJ5dGVzIGFyZSBiZWluZyBwYXNzZWQgaW47IHRoaXMgYXJyYXkgaXMKLSAgIHRoZW4gaW5pdGlhbGl6ZWQgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBmb3IgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIHdpdGgKLSAgIHRoYXQgbXVjaCBzdGF0ZSBpbmZvcm1hdGlvbi4gIEdvb2Qgc2l6ZXMgZm9yIHRoZSBhbW91bnQgb2Ygc3RhdGUKLSAgIGluZm9ybWF0aW9uIGFyZSAzMiwgNjQsIDEyOCwgYW5kIDI1NiBieXRlcy4gIFRoZSBzdGF0ZSBjYW4gYmUgc3dpdGNoZWQgYnkKLSAgIGNhbGxpbmcgdGhlIHNldHN0YXRlKCkgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBhcnJheSBhcyB3YXMgaW5pdGlhbGxpemVkCi0gICB3aXRoIGluaXRzdGF0ZSgpLiAgQnkgZGVmYXVsdCwgdGhlIHBhY2thZ2UgcnVucyB3aXRoIDEyOCBieXRlcyBvZiBzdGF0ZQotICAgaW5mb3JtYXRpb24gYW5kIGdlbmVyYXRlcyBmYXIgYmV0dGVyIHJhbmRvbSBudW1iZXJzIHRoYW4gYSBsaW5lYXIKLSAgIGNvbmdydWVudGlhbCBnZW5lcmF0b3IuICBJZiB0aGUgYW1vdW50IG9mIHN0YXRlIGluZm9ybWF0aW9uIGlzIGxlc3MgdGhhbgotICAgMzIgYnl0ZXMsIGEgc2ltcGxlIGxpbmVhciBjb25ncnVlbnRpYWwgUi5OLkcuIGlzIHVzZWQuICBJbnRlcm5hbGx5LCB0aGUKLSAgIHN0YXRlIGluZm9ybWF0aW9uIGlzIHRyZWF0ZWQgYXMgYW4gYXJyYXkgb2YgbG9uZ3M7IHRoZSB6ZXJvZXRoIGVsZW1lbnQgb2YKLSAgIHRoZSBhcnJheSBpcyB0aGUgdHlwZSBvZiBSLk4uRy4gYmVpbmcgdXNlZCAoc21hbGwgaW50ZWdlcik7IHRoZSByZW1haW5kZXIKLSAgIG9mIHRoZSBhcnJheSBpcyB0aGUgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBSLk4uRy4gIFRodXMsIDMyIGJ5dGVzIG9mCi0gICBzdGF0ZSBpbmZvcm1hdGlvbiB3aWxsIGdpdmUgNyBsb25ncyB3b3J0aCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiwgd2hpY2ggd2lsbAotICAgYWxsb3cgYSBkZWdyZWUgc2V2ZW4gcG9seW5vbWlhbC4gIChOb3RlOiBUaGUgemVyb2V0aCB3b3JkIG9mIHN0YXRlCi0gICBpbmZvcm1hdGlvbiBhbHNvIGhhcyBzb21lIG90aGVyIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBpdDsgc2VlIHNldHN0YXRlCi0gICBmb3IgZGV0YWlscykuICBUaGUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIHRlY2huaXF1ZSBpcyBhIGxpbmVhciBmZWVkYmFjawotICAgc2hpZnQgcmVnaXN0ZXIgYXBwcm9hY2gsIGVtcGxveWluZyB0cmlub21pYWxzIChzaW5jZSB0aGVyZSBhcmUgZmV3ZXIgdGVybXMKLSAgIHRvIHN1bSB1cCB0aGF0IHdheSkuICBJbiB0aGlzIGFwcHJvYWNoLCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGFsbAotICAgdGhlIG51bWJlcnMgaW4gdGhlIHN0YXRlIHRhYmxlIHdpbGwgYWN0IGFzIGEgbGluZWFyIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyLAotICAgYW5kIHdpbGwgaGF2ZSBwZXJpb2QgMl5kZWcgLSAxICh3aGVyZSBkZWcgaXMgdGhlIGRlZ3JlZSBvZiB0aGUgcG9seW5vbWlhbAotICAgYmVpbmcgdXNlZCwgYXNzdW1pbmcgdGhhdCB0aGUgcG9seW5vbWlhbCBpcyBpcnJlZHVjaWJsZSBhbmQgcHJpbWl0aXZlKS4KLSAgIFRoZSBoaWdoZXIgb3JkZXIgYml0cyB3aWxsIGhhdmUgbG9uZ2VyIHBlcmlvZHMsIHNpbmNlIHRoZWlyIHZhbHVlcyBhcmUKLSAgIGFsc28gaW5mbHVlbmNlZCBieSBwc2V1ZG8tcmFuZG9tIGNhcnJpZXMgb3V0IG9mIHRoZSBsb3dlciBiaXRzLiAgVGhlCi0gICB0b3RhbCBwZXJpb2Qgb2YgdGhlIGdlbmVyYXRvciBpcyBhcHByb3hpbWF0ZWx5IGRlZyooMioqZGVnIC0gMSk7IHRodXMKLSAgIGRvdWJsaW5nIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gaGFzIGEgdmFzdCBpbmZsdWVuY2Ugb24gdGhlCi0gICBwZXJpb2Qgb2YgdGhlIGdlbmVyYXRvci4gIE5vdGU6IFRoZSBkZWcqKDIqKmRlZyAtIDEpIGlzIGFuIGFwcHJveGltYXRpb24KLSAgIG9ubHkgZ29vZCBmb3IgbGFyZ2UgZGVnLCB3aGVuIHRoZSBwZXJpb2Qgb2YgdGhlIHNoaWZ0IHJlZ2lzdGVyIGlzIHRoZQotICAgZG9taW5hbnQgZmFjdG9yLiAgV2l0aCBkZWcgZXF1YWwgdG8gc2V2ZW4sIHRoZSBwZXJpb2QgaXMgYWN0dWFsbHkgbXVjaAotICAgbG9uZ2VyIHRoYW4gdGhlIDcqKDIqKjcgLSAxKSBwcmVkaWN0ZWQgYnkgdGhpcyBmb3JtdWxhLiAgKi8KLQotCi0KLS8qIEZvciBlYWNoIG9mIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycywgd2UgaGF2ZSBhCi0gICBicmVhayB2YWx1ZSBvbiB0aGUgYW1vdW50IG9mIHN0YXRlIGluZm9ybWF0aW9uICh5b3UgbmVlZCBhdCBsZWFzdCB0aGkKLSAgIGJ5dGVzIG9mIHN0YXRlIGluZm8gdG8gc3VwcG9ydCB0aGlzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yKSwgYSBkZWdyZWUgZm9yCi0gICB0aGUgcG9seW5vbWlhbCAoYWN0dWFsbHkgYSB0cmlub21pYWwpIHRoYXQgdGhlIFIuTi5HLiBpcyBiYXNlZCBvbiwgYW5kCi0gICBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIHR3byBsb3dlciBvcmRlciBjb2VmZmljaWVudHMgb2YgdGhlIHRyaW5vbWlhbC4gICovCi0KLS8qIExpbmVhciBjb25ncnVlbnRpYWwuICAqLwotI2RlZmluZQlUWVBFXzAJCTAKLSNkZWZpbmUJQlJFQUtfMAkJOAotI2RlZmluZQlERUdfMAkJMAotI2RlZmluZQlTRVBfMAkJMAotCi0vKiB4Kio3ICsgeCoqMyArIDEuICAqLwotI2RlZmluZQlUWVBFXzEJCTEKLSNkZWZpbmUJQlJFQUtfMQkJMzIKLSNkZWZpbmUJREVHXzEJCTcKLSNkZWZpbmUJU0VQXzEJCTMKLQotLyogeCoqMTUgKyB4ICsgMS4gICovCi0jZGVmaW5lCVRZUEVfMgkJMgotI2RlZmluZQlCUkVBS18yCQk2NAotI2RlZmluZQlERUdfMgkJMTUKLSNkZWZpbmUJU0VQXzIJCTEKLQotLyogeCoqMzEgKyB4KiozICsgMS4gICovCi0jZGVmaW5lCVRZUEVfMwkJMwotI2RlZmluZQlCUkVBS18zCQkxMjgKLSNkZWZpbmUJREVHXzMJCTMxCi0jZGVmaW5lCVNFUF8zCQkzCi0KLS8qIHgqKjYzICsgeCArIDEuICAqLwotI2RlZmluZQlUWVBFXzQJCTQKLSNkZWZpbmUJQlJFQUtfNAkJMjU2Ci0jZGVmaW5lCURFR180CQk2MwotI2RlZmluZQlTRVBfNAkJMQotCi0KLS8qIEFycmF5IHZlcnNpb25zIG9mIHRoZSBhYm92ZSBpbmZvcm1hdGlvbiB0byBtYWtlIGNvZGUgcnVuIGZhc3Rlci4KLSAgIFJlbGllcyBvbiBmYWN0IHRoYXQgVFlQRV9pID09IGkuICAqLwotCi0jZGVmaW5lCU1BWF9UWVBFUwk1CS8qIE1heCBudW1iZXIgb2YgdHlwZXMgYWJvdmUuICAqLwotCi1zdGF0aWMgaW50IGRlZ3JlZXNbTUFYX1RZUEVTXSA9IHsgREVHXzAsIERFR18xLCBERUdfMiwgREVHXzMsIERFR180IH07Ci1zdGF0aWMgaW50IHNlcHNbTUFYX1RZUEVTXSA9IHsgU0VQXzAsIFNFUF8xLCBTRVBfMiwgU0VQXzMsIFNFUF80IH07Ci0KLQotCi0vKiBJbml0aWFsbHksIGV2ZXJ5dGhpbmcgaXMgc2V0IHVwIGFzIGlmIGZyb206Ci0JaW5pdHN0YXRlKDEsIHJhbmR0YmwsIDEyOCk7Ci0gICBOb3RlIHRoYXQgdGhpcyBpbml0aWFsaXphdGlvbiB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBzcmFuZG9tCi0gICBhZHZhbmNlcyB0aGUgZnJvbnQgYW5kIHJlYXIgcG9pbnRlcnMgMTAqcmFuZF9kZWcgdGltZXMsIGFuZCBoZW5jZSB0aGUKLSAgIHJlYXIgcG9pbnRlciB3aGljaCBzdGFydHMgYXQgMCB3aWxsIGFsc28gZW5kIHVwIGF0IHplcm87IHRodXMgdGhlIHplcm9ldGgKLSAgIGVsZW1lbnQgb2YgdGhlIHN0YXRlIGluZm9ybWF0aW9uLCB3aGljaCBjb250YWlucyBpbmZvIGFib3V0IHRoZSBjdXJyZW50Ci0gICBwb3NpdGlvbiBvZiB0aGUgcmVhciBwb2ludGVyIGlzIGp1c3QKLQkoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgVFlQRV8zID09IFRZUEVfMy4gICovCi0KLXN0YXRpYyBsb25nIGludCByYW5kdGJsW0RFR18zICsgMV0gPQotICB7IFRZUEVfMywKLSAgICAgIDB4OWEzMTkwMzksIDB4MzJkOWMwMjQsIDB4OWI2NjMxODIsIDB4NWRhMWYzNDIsIAotICAgICAgMHhkZTNiODFlMCwgMHhkZjBhNmZiNSwgMHhmMTAzYmMwMiwgMHg0OGYzNDBmYiwgCi0gICAgICAweDc0NDllNTZiLCAweGJlYjFkYmIwLCAweGFiNWM1OTE4LCAweDk0NjU1NGZkLCAKLSAgICAgIDB4OGMyZTY4MGYsIDB4ZWIzZDc5OWYsIDB4YjExZWUwYjcsIDB4MmQ0MzZiODYsIAotICAgICAgMHhkYTY3MmUyYSwgMHgxNTg4Y2E4OCwgMHhlMzY5NzM1ZCwgMHg5MDRmMzVmNywgCi0gICAgICAweGQ3MTU4ZmQ2LCAweDZmYTZmMDUxLCAweDYxNmU2Yjk2LCAweGFjOTRlZmRjLCAKLSAgICAgIDB4MzY0MTNmOTMsIDB4YzYyMmMyOTgsIDB4ZjVhNDJhYjgsIDB4OGE4OGQ3N2IsIAotICAgICAgMHhmNWFkOWQwZSwgMHg4OTk5MjIwYiwgMHgyN2ZiNDdiOQotICAgIH07Ci0KLS8qIEZQVFIgYW5kIFJQVFIgYXJlIHR3byBwb2ludGVycyBpbnRvIHRoZSBzdGF0ZSBpbmZvLCBhIGZyb250IGFuZCBhIHJlYXIKLSAgIHBvaW50ZXIuICBUaGVzZSB0d28gcG9pbnRlcnMgYXJlIGFsd2F5cyByYW5kX3NlcCBwbGFjZXMgYXBhcnRzLCBhcyB0aGV5Ci0gICBjeWNsZSB0aHJvdWdoIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gIChZZXMsIHRoaXMgZG9lcyBtZWFuIHdlIGNvdWxkIGdldAotICAgYXdheSB3aXRoIGp1c3Qgb25lIHBvaW50ZXIsIGJ1dCB0aGUgY29kZSBmb3IgcmFuZG9tIGlzIG1vcmUgZWZmaWNpZW50Ci0gICB0aGlzIHdheSkuICBUaGUgcG9pbnRlcnMgYXJlIGxlZnQgcG9zaXRpb25lZCBhcyB0aGV5IHdvdWxkIGJlIGZyb20gdGhlIGNhbGw6Ci0JaW5pdHN0YXRlKDEsIHJhbmR0YmwsIDEyOCk7Ci0gICAoVGhlIHBvc2l0aW9uIG9mIHRoZSByZWFyIHBvaW50ZXIsIHJwdHIsIGlzIHJlYWxseSAwIChhcyBleHBsYWluZWQgYWJvdmUKLSAgIGluIHRoZSBpbml0aWFsaXphdGlvbiBvZiByYW5kdGJsKSBiZWNhdXNlIHRoZSBzdGF0ZSB0YWJsZSBwb2ludGVyIGlzIHNldAotICAgdG8gcG9pbnQgdG8gcmFuZHRibFsxXSAoYXMgZXhwbGFpbmVkIGJlbG93KS4pICAqLwotCi1zdGF0aWMgbG9uZyBpbnQgKmZwdHIgPSAmcmFuZHRibFtTRVBfMyArIDFdOwotc3RhdGljIGxvbmcgaW50ICpycHRyID0gJnJhbmR0YmxbMV07Ci0KLQotCi0vKiBUaGUgZm9sbG93aW5nIHRoaW5ncyBhcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHN0YXRlIGluZm9ybWF0aW9uIHRhYmxlLAotICAgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgZ2VuZXJhdG9yLCB0aGUgZGVncmVlIG9mIHRoZSBjdXJyZW50IHBvbHlub21pYWwKLSAgIGJlaW5nIHVzZWQsIGFuZCB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSB0d28gcG9pbnRlcnMuCi0gICBOb3RlIHRoYXQgZm9yIGVmZmljaWVuY3kgb2YgcmFuZG9tLCB3ZSByZW1lbWJlciB0aGUgZmlyc3QgbG9jYXRpb24gb2YKLSAgIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiwgbm90IHRoZSB6ZXJvZXRoLiAgSGVuY2UgaXQgaXMgdmFsaWQgdG8gYWNjZXNzCi0gICBzdGF0ZVstMV0sIHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHR5cGUgb2YgdGhlIFIuTi5HLgotICAgQWxzbywgd2UgcmVtZW1iZXIgdGhlIGxhc3QgbG9jYXRpb24sIHNpbmNlIHRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbgotICAgaW5kZXhpbmcgZXZlcnkgdGltZSB0byBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGVsZW1lbnQgdG8gc2VlIGlmCi0gICB0aGUgZnJvbnQgYW5kIHJlYXIgcG9pbnRlcnMgaGF2ZSB3cmFwcGVkLiAgKi8KLQotc3RhdGljIGxvbmcgaW50ICpzdGF0ZSA9ICZyYW5kdGJsWzFdOwotCi1zdGF0aWMgaW50IHJhbmRfdHlwZSA9IFRZUEVfMzsKLXN0YXRpYyBpbnQgcmFuZF9kZWcgPSBERUdfMzsKLXN0YXRpYyBpbnQgcmFuZF9zZXAgPSBTRVBfMzsKLQotc3RhdGljIGxvbmcgaW50ICplbmRfcHRyID0gJnJhbmR0Ymxbc2l6ZW9mKHJhbmR0YmwpIC8gc2l6ZW9mKHJhbmR0YmxbMF0pXTsKLQwKLS8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJhc2VkIG9uIHRoZSBnaXZlbiBzZWVkLiAgSWYgdGhlCi0gICB0eXBlIGlzIHRoZSB0cml2aWFsIG5vLXN0YXRlLWluZm9ybWF0aW9uIHR5cGUsIGp1c3QgcmVtZW1iZXIgdGhlIHNlZWQuCi0gICBPdGhlcndpc2UsIGluaXRpYWxpemVzIHN0YXRlW10gYmFzZWQgb24gdGhlIGdpdmVuICJzZWVkIiB2aWEgYSBsaW5lYXIKLSAgIGNvbmdydWVudGlhbCBnZW5lcmF0b3IuICBUaGVuLCB0aGUgcG9pbnRlcnMgYXJlIHNldCB0byBrbm93biBsb2NhdGlvbnMKLSAgIHRoYXQgYXJlIGV4YWN0bHkgcmFuZF9zZXAgcGxhY2VzIGFwYXJ0LiAgTGFzdGx5LCBpdCBjeWNsZXMgdGhlIHN0YXRlCi0gICBpbmZvcm1hdGlvbiBhIGdpdmVuIG51bWJlciBvZiB0aW1lcyB0byBnZXQgcmlkIG9mIGFueSBpbml0aWFsIGRlcGVuZGVuY2llcwotICAgaW50cm9kdWNlZCBieSB0aGUgTC5DLlIuTi5HLiAgTm90ZSB0aGF0IHRoZSBpbml0aWFsaXphdGlvbiBvZiByYW5kdGJsW10KLSAgIGZvciBkZWZhdWx0IHVzYWdlIHJlbGllcyBvbiB2YWx1ZXMgcHJvZHVjZWQgYnkgdGhpcyByb3V0aW5lLiAgKi8KLXZvaWQKLXNyYW5kb20gKHgpCi0gIHVuc2lnbmVkIGludCB4OwotewotICBzdGF0ZVswXSA9IHg7Ci0gIGlmIChyYW5kX3R5cGUgIT0gVFlQRV8wKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGxvbmcgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgcmFuZF9kZWc7ICsraSkKLQlzdGF0ZVtpXSA9ICgxMTAzNTE1MTQ1ICogc3RhdGVbaSAtIDFdKSArIDEyMzQ1OwotICAgICAgZnB0ciA9ICZzdGF0ZVtyYW5kX3NlcF07Ci0gICAgICBycHRyID0gJnN0YXRlWzBdOwotICAgICAgZm9yIChpID0gMDsgaSA8IDEwICogcmFuZF9kZWc7ICsraSkKLQlyYW5kb20oKTsKLSAgICB9Ci19Ci0MCi0vKiBJbml0aWFsaXplIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gYXJyYXkgb2YgTiBieXRlcyBmb3IKLSAgIGZ1dHVyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24uICBCYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlCi0gICBhcmUgZ2l2ZW4sIGFuZCB0aGUgYnJlYWsgdmFsdWVzIGZvciB0aGUgZGlmZmVyZW50IFIuTi5HLidzLCB3ZSBjaG9vc2UKLSAgIHRoZSBiZXN0IChsYXJnZXN0KSBvbmUgd2UgY2FuIGFuZCBzZXQgdGhpbmdzIHVwIGZvciBpdC4gIHNyYW5kb20gaXMKLSAgIHRoZW4gY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IG9uIHJldHVybgotICAgZnJvbSBzcmFuZG9tLCB3ZSBzZXQgc3RhdGVbLTFdIHRvIGJlIHRoZSB0eXBlIG11bHRpcGxleGVkIHdpdGggdGhlIGN1cnJlbnQKLSAgIHZhbHVlIG9mIHRoZSByZWFyIHBvaW50ZXI7IHRoaXMgaXMgc28gc3VjY2Vzc2l2ZSBjYWxscyB0byBpbml0c3RhdGUgd29uJ3QKLSAgIGxvc2UgdGhpcyBpbmZvcm1hdGlvbiBhbmQgd2lsbCBiZSBhYmxlIHRvIHJlc3RhcnQgd2l0aCBzZXRzdGF0ZS4KLSAgIE5vdGU6IFRoZSBmaXJzdCB0aGluZyB3ZSBkbyBpcyBzYXZlIHRoZSBjdXJyZW50IHN0YXRlLCBpZiBhbnksIGp1c3QgbGlrZQotICAgc2V0c3RhdGUgc28gdGhhdCBpdCBkb2Vzbid0IG1hdHRlciB3aGVuIGluaXRzdGF0ZSBpcyBjYWxsZWQuCi0gICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgb2xkIHN0YXRlLiAgKi8KLVBUUgotaW5pdHN0YXRlIChzZWVkLCBhcmdfc3RhdGUsIG4pCi0gIHVuc2lnbmVkIGludCBzZWVkOwotICBQVFIgYXJnX3N0YXRlOwotICB1bnNpZ25lZCBsb25nIG47Ci17Ci0gIFBUUiBvc3RhdGUgPSAoUFRSKSAmc3RhdGVbLTFdOwotCi0gIGlmIChyYW5kX3R5cGUgPT0gVFlQRV8wKQotICAgIHN0YXRlWy0xXSA9IHJhbmRfdHlwZTsKLSAgZWxzZQotICAgIHN0YXRlWy0xXSA9IChNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyByYW5kX3R5cGU7Ci0gIGlmIChuIDwgQlJFQUtfMSkKLSAgICB7Ci0gICAgICBpZiAobiA8IEJSRUFLXzApCi0JewotCSAgZXJybm8gPSBFSU5WQUw7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzA7Ci0gICAgICByYW5kX2RlZyA9IERFR18wOwotICAgICAgcmFuZF9zZXAgPSBTRVBfMDsKLSAgICB9Ci0gIGVsc2UgaWYgKG4gPCBCUkVBS18yKQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMTsKLSAgICAgIHJhbmRfZGVnID0gREVHXzE7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8xOwotICAgIH0KLSAgZWxzZSBpZiAobiA8IEJSRUFLXzMpCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV8yOwotICAgICAgcmFuZF9kZWcgPSBERUdfMjsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzI7Ci0gICAgfQotICBlbHNlIGlmIChuIDwgQlJFQUtfNCkKLSAgICB7Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzM7Ci0gICAgICByYW5kX2RlZyA9IERFR18zOwotICAgICAgcmFuZF9zZXAgPSBTRVBfMzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzQ7Ci0gICAgICByYW5kX2RlZyA9IERFR180OwotICAgICAgcmFuZF9zZXAgPSBTRVBfNDsKLSAgICB9Ci0KLSAgc3RhdGUgPSAmKChsb25nIGludCAqKSBhcmdfc3RhdGUpWzFdOwkvKiBGaXJzdCBsb2NhdGlvbi4gICovCi0gIC8qIE11c3Qgc2V0IEVORF9QVFIgYmVmb3JlIHNyYW5kb20uICAqLwotICBlbmRfcHRyID0gJnN0YXRlW3JhbmRfZGVnXTsKLSAgc3JhbmRvbShzZWVkKTsKLSAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCi0gICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOwotICBlbHNlCi0gICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKLQotICByZXR1cm4gb3N0YXRlOwotfQotDAotLyogUmVzdG9yZSB0aGUgc3RhdGUgZnJvbSB0aGUgZ2l2ZW4gc3RhdGUgYXJyYXkuCi0gICBOb3RlOiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBhbHNvIHJlbWVtYmVyIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHBvaW50ZXJzCi0gICBpbiB0aGUgY3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbiwgYW5kIHJlc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiB0aGUgcG9pbnRlcnMKLSAgIGZyb20gdGhlIG9sZCBzdGF0ZSBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgZG9uZSBieSBtdWx0aXBsZXhpbmcgdGhlIHBvaW50ZXIKLSAgIGxvY2F0aW9uIGludG8gdGhlIHplcm9ldGggd29yZCBvZiB0aGUgc3RhdGUgaW5mb3JtYXRpb24uIE5vdGUgdGhhdCBkdWUKLSAgIHRvIHRoZSBvcmRlciBpbiB3aGljaCB0aGluZ3MgYXJlIGRvbmUsIGl0IGlzIE9LIHRvIGNhbGwgc2V0c3RhdGUgd2l0aCB0aGUKLSAgIHNhbWUgc3RhdGUgYXMgdGhlIGN1cnJlbnQgc3RhdGUKLSAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvbGQgc3RhdGUgaW5mb3JtYXRpb24uICAqLwotCi1QVFIKLXNldHN0YXRlIChhcmdfc3RhdGUpCi0gIFBUUiBhcmdfc3RhdGU7Ci17Ci0gIHJlZ2lzdGVyIGxvbmcgaW50ICpuZXdfc3RhdGUgPSAobG9uZyBpbnQgKikgYXJnX3N0YXRlOwotICByZWdpc3RlciBpbnQgdHlwZSA9IG5ld19zdGF0ZVswXSAlIE1BWF9UWVBFUzsKLSAgcmVnaXN0ZXIgaW50IHJlYXIgPSBuZXdfc3RhdGVbMF0gLyBNQVhfVFlQRVM7Ci0gIFBUUiBvc3RhdGUgPSAoUFRSKSAmc3RhdGVbLTFdOwotCi0gIGlmIChyYW5kX3R5cGUgPT0gVFlQRV8wKQotICAgIHN0YXRlWy0xXSA9IHJhbmRfdHlwZTsKLSAgZWxzZQotICAgIHN0YXRlWy0xXSA9IChNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyByYW5kX3R5cGU7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFRZUEVfMDoKLSAgICBjYXNlIFRZUEVfMToKLSAgICBjYXNlIFRZUEVfMjoKLSAgICBjYXNlIFRZUEVfMzoKLSAgICBjYXNlIFRZUEVfNDoKLSAgICAgIHJhbmRfdHlwZSA9IHR5cGU7Ci0gICAgICByYW5kX2RlZyA9IGRlZ3JlZXNbdHlwZV07Ci0gICAgICByYW5kX3NlcCA9IHNlcHNbdHlwZV07Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogU3RhdGUgaW5mbyBtdW5nZWQuICAqLwotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgc3RhdGUgPSAmbmV3X3N0YXRlWzFdOwotICBpZiAocmFuZF90eXBlICE9IFRZUEVfMCkKLSAgICB7Ci0gICAgICBycHRyID0gJnN0YXRlW3JlYXJdOwotICAgICAgZnB0ciA9ICZzdGF0ZVsocmVhciArIHJhbmRfc2VwKSAlIHJhbmRfZGVnXTsKLSAgICB9Ci0gIC8qIFNldCBlbmRfcHRyIHRvby4gICovCi0gIGVuZF9wdHIgPSAmc3RhdGVbcmFuZF9kZWddOwotCi0gIHJldHVybiBvc3RhdGU7Ci19Ci0MCi0vKiBJZiB3ZSBhcmUgdXNpbmcgdGhlIHRyaXZpYWwgVFlQRV8wIFIuTi5HLiwganVzdCBkbyB0aGUgb2xkIGxpbmVhcgotICAgY29uZ3J1ZW50aWFsIGJpdC4gIE90aGVyd2lzZSwgd2UgZG8gb3VyIGZhbmN5IHRyaW5vbWlhbCBzdHVmZiwgd2hpY2ggaXMgdGhlCi0gICBzYW1lIGluIGFsbCB0aGVyIG90aGVyIGNhc2VzIGR1ZSB0byBhbGwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4KLSAgIHNldCB1cC4gIFRoZSBiYXNpYyBvcGVyYXRpb24gaXMgdG8gYWRkIHRoZSBudW1iZXIgYXQgdGhlIHJlYXIgcG9pbnRlciBpbnRvCi0gICB0aGUgb25lIGF0IHRoZSBmcm9udCBwb2ludGVyLiAgVGhlbiBib3RoIHBvaW50ZXJzIGFyZSBhZHZhbmNlZCB0byB0aGUgbmV4dAotICAgbG9jYXRpb24gY3ljbGljYWxseSBpbiB0aGUgdGFibGUuICBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIHN1bSBnZW5lcmF0ZWQsCi0gICByZWR1Y2VkIHRvIDMxIGJpdHMgYnkgdGhyb3dpbmcgYXdheSB0aGUgImxlYXN0IHJhbmRvbSIgbG93IGJpdC4KLSAgIE5vdGU6IFRoZSBjb2RlIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IGJvdGggdGhlIGZyb250IGFuZAotICAgcmVhciBwb2ludGVycyBjYW4ndCB3cmFwIG9uIHRoZSBzYW1lIGNhbGwgYnkgbm90IHRlc3RpbmcgdGhlIHJlYXIKLSAgIHBvaW50ZXIgaWYgdGhlIGZyb250IG9uZSBoYXMgd3JhcHBlZC4gIFJldHVybnMgYSAzMS1iaXQgcmFuZG9tIG51bWJlci4gICovCi0KLWxvbmcgaW50Ci1yYW5kb20gKCkKLXsKLSAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCi0gICAgewotICAgICAgc3RhdGVbMF0gPSAoKHN0YXRlWzBdICogMTEwMzUxNTI0NSkgKyAxMjM0NSkgJiBMT05HX01BWDsKLSAgICAgIHJldHVybiBzdGF0ZVswXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGludCBpOwotICAgICAgKmZwdHIgKz0gKnJwdHI7Ci0gICAgICAvKiBDaHVja2luZyBsZWFzdCByYW5kb20gYml0LiAgKi8KLSAgICAgIGkgPSAoKmZwdHIgPj4gMSkgJiBMT05HX01BWDsKLSAgICAgICsrZnB0cjsKLSAgICAgIGlmIChmcHRyID49IGVuZF9wdHIpCi0JewotCSAgZnB0ciA9IHN0YXRlOwotCSAgKytycHRyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK3JwdHI7Ci0JICBpZiAocnB0ciA+PSBlbmRfcHRyKQotCSAgICBycHRyID0gc3RhdGU7Ci0JfQotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3JlbmFtZS5jIGIvbGliaWJlcnR5L3JlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTI2ZTJkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9yZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIHJlbmFtZSAtLSByZW5hbWUgYSBmaWxlCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi0vKiBSZW5hbWUgYSBmaWxlLiAgKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLWludAotcmVuYW1lICh6ZnJvbSwgenRvKQotICAgICBjaGFyICp6ZnJvbTsKLSAgICAgY2hhciAqenRvOwotewotICBpZiAobGluayAoemZyb20sIHp0bykgPCAwKQotICAgIHsKLSAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHVubGluayAoenRvKSA8IDAKLQkgIHx8IGxpbmsgKHpmcm9tLCB6dG8pIDwgMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICByZXR1cm4gdW5saW5rICh6ZnJvbSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvcmluZGV4LmMgYi9saWJpYmVydHkvcmluZGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWQxMjYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3JpbmRleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogU3R1YiBpbXBsZW1lbnRhdGlvbiBvZiAob2Jzb2xldGUpIHJpbmRleCgpLiAqLwotCi1leHRlcm4gY2hhciAqc3RycmNociAoKTsKLQotY2hhciAqCi1yaW5kZXggKHMsIGMpCi0gIGNoYXIgKnM7Ci0gIGludCBjOwotewotICByZXR1cm4gc3RycmNociAocywgYyk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc2lnc2V0bWFzay5jIGIvbGliaWJlcnR5L3NpZ3NldG1hc2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOWU2YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc2lnc2V0bWFzay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogVmVyc2lvbiBvZiBzaWdzZXRtYXNrLmMKLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKS4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9hbWluLiAqLwotCi0vKiBTZXQgdGhlIGN1cnJlbnQgc2lnbmFsIG1hc2sgdG8gdGhlIHNldCBwcm92aWRlZCwgYW5kIHJldHVybiB0aGUgCi0gICBwcmV2aW91cyB2YWx1ZSAqLwotCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotLyogSW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gc2VlbXMgdG8gYmUgbmVlZGVkIGJ5IElTQy4gKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2lmZGVmIFNJR19TRVRNQVNLCi1pbnQKLURFRlVOKHNpZ3NldG1hc2ssKHNldCksCi0gICAgICBpbnQgc2V0KQotewotICAgIHNpZ3NldF90IG5ldzsKLSAgICBzaWdzZXRfdCBvbGQ7Ci0gICAgCi0gICAgc2lnZW1wdHlzZXQgKCZuZXcpOwotICAgIGlmIChzZXQgIT0gMCkgewotICAgICAgYWJvcnQoKTsJLyogRklYTUUsIHdlIGRvbid0IGtub3cgaG93IHRvIHRyYW5zbGF0ZSBvbGQgbWFzayB0byBuZXcgKi8KLSAgICB9Ci0gICAgc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZuZXcsICZvbGQpOwotICAgIHJldHVybiAxOwkvKiBGSVhNRSwgd2UgYWx3YXlzIHJldHVybiAxIGFzIG9sZCB2YWx1ZS4gICovCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zcGFjZXMuYyBiL2xpYmliZXJ0eS9zcGFjZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5MjU3MS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3BhY2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBBbGxvY2F0ZSBtZW1vcnkgcmVnaW9uIGZpbGxlZCB3aXRoIHNwYWNlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0KLU5BTUUKLQotCXNwYWNlcyAtLSByZXR1cm4gYSBwb2ludGVyIHRvIGEgYnVmZmVyIGZ1bGwgb2Ygc3BhY2VzCi0KLVNZTk9QU0lTCi0KLQljaGFyICpzcGFjZXMgKGludCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQotCVJldHVybnMgYSBwb2ludGVyIHRvIGEgbWVtb3J5IHJlZ2lvbiBmaWxsZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0JbnVtYmVyIG9mIHNwYWNlcyBhbmQgbnVsbCB0ZXJtaW5hdGVkLiAgVGhlIHJldHVybmVkIHBvaW50ZXIgaXMKLQl2YWxpZCB1bnRpbCBhdCBsZWFzdCB0aGUgbmV4dCBjYWxsLgotCQotQlVHUwotCi0qLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmIFZNUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXhsaWIuaD4KLSNlbHNlCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoZXNlIG11c3QgYmUgZGVjbGFyZWQuICAqLwotZXh0ZXJuIFBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBmcmVlIFBBUkFNUyAoKFBUUikpOwotI2VuZGlmCi0KLWNvbnN0IGNoYXIgKgotc3BhY2VzIChjb3VudCkKLSAgaW50IGNvdW50OwotewotICByZWdpc3RlciBjaGFyICp0OwotICBzdGF0aWMgY2hhciAqYnVmOwotICBzdGF0aWMgaW50IG1heHNpemU7Ci0KLSAgaWYgKGNvdW50ID4gbWF4c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYnVmKQotCXsKLQkgIGZyZWUgKGJ1Zik7Ci0JfQotICAgICAgYnVmID0gbWFsbG9jIChjb3VudCArIDEpOwotICAgICAgaWYgKGJ1ZiA9PSAoY2hhciAqKSAwKQotCXJldHVybiAwOwotICAgICAgZm9yICh0ID0gYnVmICsgY291bnQgOyB0ICE9IGJ1ZiA7ICkKLQl7Ci0JICAqLS10ID0gJyAnOwotCX0KLSAgICAgIG1heHNpemUgPSBjb3VudDsKLSAgICAgIGJ1Zltjb3VudF0gPSAnXDAnOwotICAgIH0KLSAgcmV0dXJuIChjb25zdCBjaGFyICopIChidWYgKyBtYXhzaXplIC0gY291bnQpOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3BsYXktdHJlZS5jIGIvbGliaWJlcnR5L3NwbGF5LXRyZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiYjVhNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3BsYXktdHJlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qIEEgc3BsYXktdHJlZSBkYXRhdHlwZS4gIAotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFyayBNaXRjaGVsbCAobWFya0BtYXJrbWl0Y2hlbGwuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotICAgCi1HTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgYW4gZWFzaWx5IHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHNwbGF5LXRyZWVzLCBzZWU6Ci0KLSAgICAgTGV3aXMsIEhhcnJ5IFIuIGFuZCBEZW5lbmJlcmcsIExhcnJ5LiAgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBUaGVpcgotICAgICBBbGdvcml0aG1zLiAgSGFycGVyLUNvbGxpbnMsIEluYy4gIDE5OTEuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNwbGF5LXRyZWUuaCIKLQotc3RhdGljIHZvaWQgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyICAgIFBBUkFNUygoc3BsYXlfdHJlZSwgCi0JCQkJCQlzcGxheV90cmVlX25vZGUpKTsKLXN0YXRpYyB2b2lkIHNwbGF5X3RyZWVfc3BsYXkgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCQlzcGxheV90cmVlX2tleSkpOwotc3RhdGljIHNwbGF5X3RyZWVfbm9kZSBzcGxheV90cmVlX3NwbGF5X2hlbHBlciAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkJc3BsYXlfdHJlZV9rZXksCi0JCQkJCQlzcGxheV90cmVlX25vZGUqLAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKiwKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSopKTsKLXN0YXRpYyBpbnQgc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9ub2RlLAotCQkJCQkJc3BsYXlfdHJlZV9mb3JlYWNoX2ZuLAotCQkJCQkJdm9pZCopKTsKLQotLyogRGVhbGxvY2F0ZSBOT0RFIChhIG1lbWJlciBvZiBTUCksIGFuZCBhbGwgaXRzIHN1Yi10cmVlcy4gICovCi0KLXN0YXRpYyB2b2lkIAotc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7Ci17Ci0gIGlmICghbm9kZSkKLSAgICByZXR1cm47Ci0KLSAgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZS0+bGVmdCk7Ci0gIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIG5vZGUtPnJpZ2h0KTsKLQotICBpZiAoc3AtPmRlbGV0ZV9rZXkpCi0gICAgKCpzcC0+ZGVsZXRlX2tleSkobm9kZS0+a2V5KTsKLSAgaWYgKHNwLT5kZWxldGVfdmFsdWUpCi0gICAgKCpzcC0+ZGVsZXRlX3ZhbHVlKShub2RlLT52YWx1ZSk7Ci0KLSAgZnJlZSAoKGNoYXIqKSBub2RlKTsKLX0KLQotLyogSGVscCBzcGxheSBTUCBhcm91bmQgS0VZLiAgUEFSRU5UIGFuZCBHUkFORFBBUkVOVCBhcmUgdGhlIHBhcmVudAotICAgYW5kIGdyYW5kcGFyZW50LCByZXNwZWN0aXZlbHksIG9mIE5PREUuICAqLwotCi1zdGF0aWMgc3BsYXlfdHJlZV9ub2RlCi1zcGxheV90cmVlX3NwbGF5X2hlbHBlciAoc3AsIGtleSwgbm9kZSwgcGFyZW50LCBncmFuZHBhcmVudCkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9rZXkga2V5OwotICAgICBzcGxheV90cmVlX25vZGUgKm5vZGU7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSAqcGFyZW50OwotICAgICBzcGxheV90cmVlX25vZGUgKmdyYW5kcGFyZW50OwotewotICBzcGxheV90cmVlX25vZGUgKm5leHQ7Ci0gIHNwbGF5X3RyZWVfbm9kZSBuOwotICBpbnQgY29tcGFyaXNvbjsKLSAgCi0gIG4gPSAqbm9kZTsKLQotICBpZiAoIW4pCi0gICAgcmV0dXJuICpwYXJlbnQ7Ci0KLSAgY29tcGFyaXNvbiA9ICgqc3AtPmNvbXApIChrZXksIG4tPmtleSk7Ci0KLSAgaWYgKGNvbXBhcmlzb24gPT0gMCkKLSAgICAvKiBXZSd2ZSBmb3VuZCB0aGUgdGFyZ2V0LiAgKi8KLSAgICBuZXh0ID0gMDsKLSAgZWxzZSBpZiAoY29tcGFyaXNvbiA8IDApCi0gICAgLyogVGhlIHRhcmdldCBpcyB0byB0aGUgbGVmdC4gICovCi0gICAgbmV4dCA9ICZuLT5sZWZ0OwotICBlbHNlIAotICAgIC8qIFRoZSB0YXJnZXQgaXMgdG8gdGhlIHJpZ2h0LiAgKi8KLSAgICBuZXh0ID0gJm4tPnJpZ2h0OwotCi0gIGlmIChuZXh0KQotICAgIHsKLSAgICAgIC8qIENvbnRpbnVlIGRvd24gdGhlIHRyZWUuICAqLwotICAgICAgbiA9IHNwbGF5X3RyZWVfc3BsYXlfaGVscGVyIChzcCwga2V5LCBuZXh0LCBub2RlLCBwYXJlbnQpOwotCi0gICAgICAvKiBUaGUgcmVjdXJzaXZlIGNhbGwgd2lsbCBjaGFuZ2UgdGhlIHBsYWNlIHRvIHdoaWNoIE5PREUKLQkgcG9pbnRzLiAgKi8KLSAgICAgIGlmICgqbm9kZSAhPSBuKQotCXJldHVybiBuOwotICAgIH0KLQotICBpZiAoIXBhcmVudCkKLSAgICAvKiBOT0RFIGlzIHRoZSByb290LiAgV2UgYXJlIGRvbmUuICAqLwotICAgIHJldHVybiBuOwotCi0gIC8qIEZpcnN0LCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gZ3JhbmRwYXJlbnQgKGkuZS4sCi0gICAgICpQQVJFTlQgaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuKSAgKi8KLSAgaWYgKCFncmFuZHBhcmVudCkgCi0gICAgewotICAgICAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0KQotCXsKLQkgICpub2RlID0gbi0+cmlnaHQ7Ci0JICBuLT5yaWdodCA9ICpwYXJlbnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpub2RlID0gbi0+bGVmdDsKLQkgIG4tPmxlZnQgPSAqcGFyZW50OwotCX0KLSAgICAgICpwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gIC8qIE5leHQgaGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBib3RoIE4gYW5kICpQQVJFTlQgYXJlIGxlZnQgY2hpbGRyZW4sCi0gICAgIG9yIHdoZXJlIGJvdGggYXJlIHJpZ2h0IGNoaWxkcmVuLiAgKi8KLSAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0ICYmICpwYXJlbnQgPT0gKCpncmFuZHBhcmVudCktPmxlZnQpCi0gICAgewotICAgICAgc3BsYXlfdHJlZV9ub2RlIHAgPSAqcGFyZW50OwotCi0gICAgICAoKmdyYW5kcGFyZW50KS0+bGVmdCA9IHAtPnJpZ2h0OwotICAgICAgcC0+cmlnaHQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICBwLT5sZWZ0ID0gbi0+cmlnaHQ7Ci0gICAgICBuLT5yaWdodCA9IHA7Ci0gICAgICAqZ3JhbmRwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47IAotICAgIH0KLSAgZWxzZSBpZiAgKG4gPT0gKCpwYXJlbnQpLT5yaWdodCAmJiAqcGFyZW50ID09ICgqZ3JhbmRwYXJlbnQpLT5yaWdodCkKLSAgICB7Ci0gICAgICBzcGxheV90cmVlX25vZGUgcCA9ICpwYXJlbnQ7Ci0KLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5yaWdodCA9IHAtPmxlZnQ7Ci0gICAgICBwLT5sZWZ0ID0gKmdyYW5kcGFyZW50OwotICAgICAgcC0+cmlnaHQgPSBuLT5sZWZ0OwotICAgICAgbi0+bGVmdCA9IHA7Ci0gICAgICAqZ3JhbmRwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gIC8qIEZpbmFsbHksIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBOIGlzIGEgbGVmdCBjaGlsZCwgYnV0ICpQQVJFTlQKLSAgICAgaXMgYSByaWdodCBjaGlsZCwgb3IgdmljZSB2ZXJzYS4gICovCi0gIGlmIChuID09ICgqcGFyZW50KS0+bGVmdCkgCi0gICAgewotICAgICAgKCpwYXJlbnQpLT5sZWZ0ID0gbi0+cmlnaHQ7Ci0gICAgICBuLT5yaWdodCA9ICpwYXJlbnQ7Ci0gICAgICAoKmdyYW5kcGFyZW50KS0+cmlnaHQgPSBuLT5sZWZ0OwotICAgICAgbi0+bGVmdCA9ICpncmFuZHBhcmVudDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9IAotICBlbHNlCi0gICAgewotICAgICAgKCpwYXJlbnQpLT5yaWdodCA9IG4tPmxlZnQ7Ci0gICAgICBuLT5sZWZ0ID0gKnBhcmVudDsKLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5sZWZ0ID0gbi0+cmlnaHQ7Ci0gICAgICBuLT5yaWdodCA9ICpncmFuZHBhcmVudDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci19Ci0KLS8qIFNwbGF5IFNQIGFyb3VuZCBLRVkuICAqLwotCi1zdGF0aWMgdm9pZAotc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9rZXkga2V5OwotewotICBpZiAoc3AtPnJvb3QgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgKHNwLCBrZXksICZzcC0+cm9vdCwgCi0JCQkgICAvKmdyYW5kcGFyZW50PSovMCwgLypwYXJlbnQ9Ki8wKTsgCi19Ci0KLS8qIENhbGwgRk4sIHBhc3NpbmcgaXQgdGhlIERBVEEsIGZvciBldmVyeSBub2RlIGJlbG93IE5PREUsIGFsbCBvZgotICAgd2hpY2ggYXJlIGZyb20gU1AsIGZvbGxvd2luZyBhbiBpbi1vcmRlciB0cmF2ZXJzYWwuICBJZiBGTiBldmVyeQotICAgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgaXRlcmF0aW9uIGNlYXNlcyBpbW1lZGlhdGVseSwgYW5kIHRoZQotICAgdmFsdWUgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiAgKi8KLQotc3RhdGljIGludAotc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIG5vZGUsIGZuLCBkYXRhKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKLSAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuIGZuOwotICAgICB2b2lkKiBkYXRhOwotewotICBpbnQgdmFsOwotCi0gIGlmICghbm9kZSkKLSAgICByZXR1cm4gMDsKLQotICB2YWwgPSBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZS0+bGVmdCwgZm4sIGRhdGEpOwotICBpZiAodmFsKQotICAgIHJldHVybiB2YWw7Ci0KLSAgdmFsID0gKCpmbikobm9kZSwgZGF0YSk7Ci0gIGlmICh2YWwpCi0gICAgcmV0dXJuIHZhbDsKLQotICByZXR1cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIG5vZGUtPnJpZ2h0LCBmbiwgZGF0YSk7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IHNwbGF5IHRyZWUsIHVzaW5nIENPTVBBUkVfRk4gdG8gY29tcGFyZSBub2RlcywKLSAgIERFTEVURV9LRVlfRk4gdG8gZGVhbGxvY2F0ZSBrZXlzLCBhbmQgREVMRVRFX1ZBTFVFX0ZOIHRvIGRlYWxsb2NhdGUKLSAgIHZhbHVlcy4gICovCi0KLXNwbGF5X3RyZWUgCi1zcGxheV90cmVlX25ldyAoY29tcGFyZV9mbiwgZGVsZXRlX2tleV9mbiwgZGVsZXRlX3ZhbHVlX2ZuKQotICAgICBzcGxheV90cmVlX2NvbXBhcmVfZm4gY29tcGFyZV9mbjsKLSAgICAgc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuIGRlbGV0ZV9rZXlfZm47Ci0gICAgIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuIGRlbGV0ZV92YWx1ZV9mbjsKLXsKLSAgc3BsYXlfdHJlZSBzcCA9IChzcGxheV90cmVlKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzcGxheV90cmVlKSk7Ci0gIHNwLT5yb290ID0gMDsKLSAgc3AtPmNvbXAgPSBjb21wYXJlX2ZuOwotICBzcC0+ZGVsZXRlX2tleSA9IGRlbGV0ZV9rZXlfZm47Ci0gIHNwLT5kZWxldGVfdmFsdWUgPSBkZWxldGVfdmFsdWVfZm47Ci0KLSAgcmV0dXJuIHNwOwotfQotCi0vKiBEZWFsbG9jYXRlIFNQLiAgKi8KLQotdm9pZCAKLXNwbGF5X3RyZWVfZGVsZXRlIChzcCkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLXsKLSAgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgc3AtPnJvb3QpOwotICBmcmVlICgoY2hhciopIHNwKTsKLX0KLQotLyogSW5zZXJ0IGEgbmV3IG5vZGUgKGFzc29jaWF0aW5nIEtFWSB3aXRoIERBVEEpIGludG8gU1AuICBJZiBhCi0gICBwcmV2aW91cyBub2RlIHdpdGggdGhlIGluZGljYXRlZCBLRVkgZXhpc3RzLCBpdHMgZGF0YSBpcyByZXBsYWNlZAotICAgd2l0aCB0aGUgbmV3IHZhbHVlLiAgKi8KLQotdm9pZCAKLXNwbGF5X3RyZWVfaW5zZXJ0IChzcCwga2V5LCB2YWx1ZSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9rZXkga2V5OwotICAgICBzcGxheV90cmVlX3ZhbHVlIHZhbHVlOwotewotICBpbnQgY29tcGFyaXNvbjsKLQotICBzcGxheV90cmVlX3NwbGF5IChzcCwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QpCi0gICAgY29tcGFyaXNvbiA9ICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSk7Ci0KLSAgaWYgKHNwLT5yb290ICYmIGNvbXBhcmlzb24gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgcm9vdCBvZiB0aGUgdHJlZSBhbHJlYWR5IGhhcyB0aGUgaW5kaWNhdGVkIEtFWSwganVzdAotCSByZXBsYWNlIHRoZSB2YWx1ZSB3aXRoIFZBTFVFLiAgKi8KLSAgICAgIGlmIChzcC0+ZGVsZXRlX3ZhbHVlKQotCSgqc3AtPmRlbGV0ZV92YWx1ZSkoc3AtPnJvb3QtPnZhbHVlKTsKLSAgICAgIHNwLT5yb290LT52YWx1ZSA9IHZhbHVlOwotICAgIH0gCi0gIGVsc2UgCi0gICAgewotICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUsIGFuZCBpbnNlcnQgaXQgYXQgdGhlIHJvb3QuICAqLwotICAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7Ci0gICAgICAKLSAgICAgIG5vZGUgPSAoc3BsYXlfdHJlZV9ub2RlKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzcGxheV90cmVlX25vZGUpKTsKLSAgICAgIG5vZGUtPmtleSA9IGtleTsKLSAgICAgIG5vZGUtPnZhbHVlID0gdmFsdWU7Ci0gICAgICAKLSAgICAgIGlmICghc3AtPnJvb3QpCi0Jbm9kZS0+bGVmdCA9IG5vZGUtPnJpZ2h0ID0gMDsKLSAgICAgIGVsc2UgaWYgKGNvbXBhcmlzb24gPCAwKQotCXsKLQkgIG5vZGUtPmxlZnQgPSBzcC0+cm9vdDsKLQkgIG5vZGUtPnJpZ2h0ID0gbm9kZS0+bGVmdC0+cmlnaHQ7Ci0JICBub2RlLT5sZWZ0LT5yaWdodCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5vZGUtPnJpZ2h0ID0gc3AtPnJvb3Q7Ci0JICBub2RlLT5sZWZ0ID0gbm9kZS0+cmlnaHQtPmxlZnQ7Ci0JICBub2RlLT5yaWdodC0+bGVmdCA9IDA7Ci0JfQotCi0gICAgc3AtPnJvb3QgPSBub2RlOwotICB9Ci19Ci0KLS8qIExvb2t1cCBLRVkgaW4gU1AsIHJldHVybmluZyBWQUxVRSBpZiBwcmVzZW50LCBhbmQgTlVMTCAKLSAgIG90aGVyd2lzZS4gICovCi0KLXNwbGF5X3RyZWVfbm9kZQotc3BsYXlfdHJlZV9sb29rdXAgKHNwLCBrZXkpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLXsKLSAgc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSk7Ci0KLSAgaWYgKHNwLT5yb290ICYmICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSkgPT0gMCkKLSAgICByZXR1cm4gc3AtPnJvb3Q7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ2FsbCBGTiwgcGFzc2luZyBpdCB0aGUgREFUQSwgZm9yIGV2ZXJ5IG5vZGUgaW4gU1AsIGZvbGxvd2luZyBhbgotICAgaW4tb3JkZXIgdHJhdmVyc2FsLiAgSWYgRk4gZXZlcnkgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGUKLSAgIGl0ZXJhdGlvbiBjZWFzZXMgaW1tZWRpYXRlbHksIGFuZCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiAgKi8KLQotaW50Ci1zcGxheV90cmVlX2ZvcmVhY2ggKHNwLCBmbiwgZGF0YSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuIGZuOwotICAgICB2b2lkICpkYXRhOwotewotICByZXR1cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIHNwLT5yb290LCBmbiwgZGF0YSk7Ci19Ci0KLS8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgaW50cy4gICovCi0KLWludAotc3BsYXlfdHJlZV9jb21wYXJlX2ludHMgKGsxLCBrMikKLSAgICAgc3BsYXlfdHJlZV9rZXkgazE7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGsyOwotewotICBpZiAoKGludCkgazEgPCAoaW50KSBrMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKChpbnQpIGsxID4gKGludCkgazIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgcG9pbnRlcnMuICAqLwotCi1pbnQKLXNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyAoazEsIGsyKQotICAgICBzcGxheV90cmVlX2tleSBrMTsKLSAgICAgc3BsYXlfdHJlZV9rZXkgazI7Ci17Ci0gIGlmICgoY2hhciopIGsxIDwgKGNoYXIqKSBrMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKChjaGFyKikgazEgPiAoY2hhciopIGsyKQotICAgIHJldHVybiAxOwotICBlbHNlIAotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYyBiL2xpYmliZXJ0eS9zdHJjYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTkzMGIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkIGFuZCB0aGF0IGR1ZSBjcmVkaXQgaXMgZ2l2ZW4KLSAqIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkuIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5Ci0gKiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGhpcyBzb2Z0d2FyZQotICogaXMgcHJvdmlkZWQgYGBhcyBpcycnIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICovCi0KLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylzdHJjYXNlY21wLmMJNS41IChCZXJrZWxleSkgMTEvMjQvODciOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyoKLSAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCi0gKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCi0gKiBiYXNlZCB1cG9uIGFzY2lpIGNoYXJhY3RlciBzZXF1ZW5jZXMuCi0gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1YzsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJtYXBbXSA9IHsKLQkodWMpJ1wwMDAnLCh1YyknXDAwMScsKHVjKSdcMDAyJywodWMpJ1wwMDMnLCh1YyknXDAwNCcsKHVjKSdcMDA1JywodWMpJ1wwMDYnLCh1YyknXDAwNycsCi0JKHVjKSdcMDEwJywodWMpJ1wwMTEnLCh1YyknXDAxMicsKHVjKSdcMDEzJywodWMpJ1wwMTQnLCh1YyknXDAxNScsKHVjKSdcMDE2JywodWMpJ1wwMTcnLAotCSh1YyknXDAyMCcsKHVjKSdcMDIxJywodWMpJ1wwMjInLCh1YyknXDAyMycsKHVjKSdcMDI0JywodWMpJ1wwMjUnLCh1YyknXDAyNicsKHVjKSdcMDI3JywKLQkodWMpJ1wwMzAnLCh1YyknXDAzMScsKHVjKSdcMDMyJywodWMpJ1wwMzMnLCh1YyknXDAzNCcsKHVjKSdcMDM1JywodWMpJ1wwMzYnLCh1YyknXDAzNycsCi0JKHVjKSdcMDQwJywodWMpJ1wwNDEnLCh1YyknXDA0MicsKHVjKSdcMDQzJywodWMpJ1wwNDQnLCh1YyknXDA0NScsKHVjKSdcMDQ2JywodWMpJ1wwNDcnLAotCSh1YyknXDA1MCcsKHVjKSdcMDUxJywodWMpJ1wwNTInLCh1YyknXDA1MycsKHVjKSdcMDU0JywodWMpJ1wwNTUnLCh1YyknXDA1NicsKHVjKSdcMDU3JywKLQkodWMpJ1wwNjAnLCh1YyknXDA2MScsKHVjKSdcMDYyJywodWMpJ1wwNjMnLCh1YyknXDA2NCcsKHVjKSdcMDY1JywodWMpJ1wwNjYnLCh1YyknXDA2NycsCi0JKHVjKSdcMDcwJywodWMpJ1wwNzEnLCh1YyknXDA3MicsKHVjKSdcMDczJywodWMpJ1wwNzQnLCh1YyknXDA3NScsKHVjKSdcMDc2JywodWMpJ1wwNzcnLAotCSh1YyknXDEwMCcsKHVjKSdcMTQxJywodWMpJ1wxNDInLCh1YyknXDE0MycsKHVjKSdcMTQ0JywodWMpJ1wxNDUnLCh1YyknXDE0NicsKHVjKSdcMTQ3JywKLQkodWMpJ1wxNTAnLCh1YyknXDE1MScsKHVjKSdcMTUyJywodWMpJ1wxNTMnLCh1YyknXDE1NCcsKHVjKSdcMTU1JywodWMpJ1wxNTYnLCh1YyknXDE1NycsCi0JKHVjKSdcMTYwJywodWMpJ1wxNjEnLCh1YyknXDE2MicsKHVjKSdcMTYzJywodWMpJ1wxNjQnLCh1YyknXDE2NScsKHVjKSdcMTY2JywodWMpJ1wxNjcnLAotCSh1YyknXDE3MCcsKHVjKSdcMTcxJywodWMpJ1wxNzInLCh1YyknXDEzMycsKHVjKSdcMTM0JywodWMpJ1wxMzUnLCh1YyknXDEzNicsKHVjKSdcMTM3JywKLQkodWMpJ1wxNDAnLCh1YyknXDE0MScsKHVjKSdcMTQyJywodWMpJ1wxNDMnLCh1YyknXDE0NCcsKHVjKSdcMTQ1JywodWMpJ1wxNDYnLCh1YyknXDE0NycsCi0JKHVjKSdcMTUwJywodWMpJ1wxNTEnLCh1YyknXDE1MicsKHVjKSdcMTUzJywodWMpJ1wxNTQnLCh1YyknXDE1NScsKHVjKSdcMTU2JywodWMpJ1wxNTcnLAotCSh1YyknXDE2MCcsKHVjKSdcMTYxJywodWMpJ1wxNjInLCh1YyknXDE2MycsKHVjKSdcMTY0JywodWMpJ1wxNjUnLCh1YyknXDE2NicsKHVjKSdcMTY3JywKLQkodWMpJ1wxNzAnLCh1YyknXDE3MScsKHVjKSdcMTcyJywodWMpJ1wxNzMnLCh1YyknXDE3NCcsKHVjKSdcMTc1JywodWMpJ1wxNzYnLCh1YyknXDE3NycsCi0JKHVjKSdcMjAwJywodWMpJ1wyMDEnLCh1YyknXDIwMicsKHVjKSdcMjAzJywodWMpJ1wyMDQnLCh1YyknXDIwNScsKHVjKSdcMjA2JywodWMpJ1wyMDcnLAotCSh1YyknXDIxMCcsKHVjKSdcMjExJywodWMpJ1wyMTInLCh1YyknXDIxMycsKHVjKSdcMjE0JywodWMpJ1wyMTUnLCh1YyknXDIxNicsKHVjKSdcMjE3JywKLQkodWMpJ1wyMjAnLCh1YyknXDIyMScsKHVjKSdcMjIyJywodWMpJ1wyMjMnLCh1YyknXDIyNCcsKHVjKSdcMjI1JywodWMpJ1wyMjYnLCh1YyknXDIyNycsCi0JKHVjKSdcMjMwJywodWMpJ1wyMzEnLCh1YyknXDIzMicsKHVjKSdcMjMzJywodWMpJ1wyMzQnLCh1YyknXDIzNScsKHVjKSdcMjM2JywodWMpJ1wyMzcnLAotCSh1YyknXDI0MCcsKHVjKSdcMjQxJywodWMpJ1wyNDInLCh1YyknXDI0MycsKHVjKSdcMjQ0JywodWMpJ1wyNDUnLCh1YyknXDI0NicsKHVjKSdcMjQ3JywKLQkodWMpJ1wyNTAnLCh1YyknXDI1MScsKHVjKSdcMjUyJywodWMpJ1wyNTMnLCh1YyknXDI1NCcsKHVjKSdcMjU1JywodWMpJ1wyNTYnLCh1YyknXDI1NycsCi0JKHVjKSdcMjYwJywodWMpJ1wyNjEnLCh1YyknXDI2MicsKHVjKSdcMjYzJywodWMpJ1wyNjQnLCh1YyknXDI2NScsKHVjKSdcMjY2JywodWMpJ1wyNjcnLAotCSh1YyknXDI3MCcsKHVjKSdcMjcxJywodWMpJ1wyNzInLCh1YyknXDI3MycsKHVjKSdcMjc0JywodWMpJ1wyNzUnLCh1YyknXDI3NicsKHVjKSdcMjc3JywKLQkodWMpJ1wzMDAnLCh1YyknXDM0MScsKHVjKSdcMzQyJywodWMpJ1wzNDMnLCh1YyknXDM0NCcsKHVjKSdcMzQ1JywodWMpJ1wzNDYnLCh1YyknXDM0NycsCi0JKHVjKSdcMzUwJywodWMpJ1wzNTEnLCh1YyknXDM1MicsKHVjKSdcMzUzJywodWMpJ1wzNTQnLCh1YyknXDM1NScsKHVjKSdcMzU2JywodWMpJ1wzNTcnLAotCSh1YyknXDM2MCcsKHVjKSdcMzYxJywodWMpJ1wzNjInLCh1YyknXDM2MycsKHVjKSdcMzY0JywodWMpJ1wzNjUnLCh1YyknXDM2NicsKHVjKSdcMzY3JywKLQkodWMpJ1wzNzAnLCh1YyknXDM3MScsKHVjKSdcMzcyJywodWMpJ1wzMzMnLCh1YyknXDMzNCcsKHVjKSdcMzM1JywodWMpJ1wzMzYnLCh1YyknXDMzNycsCi0JKHVjKSdcMzQwJywodWMpJ1wzNDEnLCh1YyknXDM0MicsKHVjKSdcMzQzJywodWMpJ1wzNDQnLCh1YyknXDM0NScsKHVjKSdcMzQ2JywodWMpJ1wzNDcnLAotCSh1YyknXDM1MCcsKHVjKSdcMzUxJywodWMpJ1wzNTInLCh1YyknXDM1MycsKHVjKSdcMzU0JywodWMpJ1wzNTUnLCh1YyknXDM1NicsKHVjKSdcMzU3JywKLQkodWMpJ1wzNjAnLCh1YyknXDM2MScsKHVjKSdcMzYyJywodWMpJ1wzNjMnLCh1YyknXDM2NCcsKHVjKSdcMzY1JywodWMpJ1wzNjYnLCh1YyknXDM2NycsCi0JKHVjKSdcMzcwJywodWMpJ1wzNzEnLCh1YyknXDM3MicsKHVjKSdcMzczJywodWMpJ1wzNzQnLCh1YyknXDM3NScsKHVjKSdcMzc2JywodWMpJ1wzNzcnLAotfTsKLQotaW50Ci1zdHJjYXNlY21wKHMxLCBzMikKLSAgICBjb25zdCBjaGFyICpzMSwgKnMyOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdTEsIHUyOwotCi0gICAgZm9yICg7OykgewotCXUxID0gKHVuc2lnbmVkIGNoYXIpICpzMSsrOwotCXUyID0gKHVuc2lnbmVkIGNoYXIpICpzMisrOwotCWlmIChjaGFybWFwW3UxXSAhPSBjaGFybWFwW3UyXSkgewotCSAgICByZXR1cm4gY2hhcm1hcFt1MV0gLSBjaGFybWFwW3UyXTsKLQl9Ci0JaWYgKHUxID09ICdcMCcpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNoci5jIGIvbGliaWJlcnR5L3N0cmNoci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTA0ODBmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJjaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RyY2hyKCkKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCXN0cmNociAtLSByZXR1cm4gcG9pbnRlciB0byBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBjaGFyYWN0ZXIKLQotU1lOT1BTSVMKLQljaGFyICpzdHJjaHIgKGNvbnN0IGNoYXIgKnMsIGludCBjKQotCi1ERVNDUklQVElPTgotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgY2hhcmFjdGVyIEMgaW4KLQlzdHJpbmcgUywgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm8gb2NjdXJhbmNlIGlzIGZvdW5kLgotCQotQlVHUwotCUJlaGF2aW9yIHdoZW4gY2hhcmFjdGVyIGlzIHRoZSBudWxsIGNoYXJhY3RlciBpcyBpbXBsZW1lbnRhdGlvbgotCWRlcGVuZGVudC4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi1jaGFyICoKLXN0cmNociAocywgYykKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIGRvIHsKLSAgICBpZiAoKnMgPT0gYykKLSAgICAgIHsKLQlyZXR1cm4gKGNoYXIqKXM7Ci0gICAgICB9Ci0gIH0gd2hpbGUgKCpzKyspOwotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmR1cC5jIGIvbGliaWJlcnR5L3N0cmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzg1YjM0Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWNoYXIgKgotc3RyZHVwKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gICAgY2hhciAqcmVzdWx0ID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocykgKyAxKTsKLSAgICBpZiAocmVzdWx0ID09IChjaGFyKikwKQotCXJldHVybiAoY2hhciopMDsKLSAgICBzdHJjcHkocmVzdWx0LCBzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmVycm9yLmMgYi9saWJpYmVydHkvc3RyZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0Y2M3NS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDgzMSArMCwwIEBACi0vKiBFeHRlbmRlZCBzdXBwb3J0IGZvciB1c2luZyBlcnJubyB2YWx1ZXMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaC4gIGZuZkBjeWdudXMuY29tCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLVBlciBCb3RobmVyLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1lTX0VSUkxJU1QKLS8qIE5vdGUgdGhhdCBlcnJuby5oIChub3Qgc3VyZSB3aGF0IE9TKSBvciBzdGRpby5oIChCU0QgNC40LCBhdCBsZWFzdCkKLSAgIG1pZ2h0IGRlY2xhcmUgc3lzX2Vycmxpc3QgaW4gYSB3YXkgdGhhdCB0aGUgY29tcGlsZXIgbWlnaHQgY29uc2lkZXIKLSAgIGluY29tcGF0aWJsZSB3aXRoIG91ciBsYXRlciBkZWNsYXJhdGlvbiwgcGVyaGFwcyBieSB1c2luZyBjb25zdAotICAgYXR0cmlidXRlcy4gIFNvIHdlIGhpZGUgdGhlIGRlY2xhcmF0aW9uIGluIGVycm5vLmggKGlmIGFueSkgdXNpbmcgYQotICAgbWFjcm8uICovCi0jZGVmaW5lIHN5c19lcnJsaXN0IHN5c19lcnJsaXN0X18KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgSEFWRV9TWVNfRVJSTElTVAotI3VuZGVmIHN5c19lcnJsaXN0Ci0jZW5kaWYKLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3Qgc2l6ZSk7CQkJCS8qIDQuMTAuMy4zICovCi1leHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOwkJCS8qIDQuMTEuNi4xICovCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqbWVtc2V0ICgpOwotI2VuZGlmCS8qIF9fU1REQ19fICovCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpbml0X2Vycm9yX3RhYmxlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGZvciBlcnJubyB2YWx1ZXMuICBTZWUgaW50cm8oMikgaW4gbW9zdCBVTklYIHN5c3RlbXMKLSAgIFByb2dyYW1tZXJzIFJlZmVyZW5jZSBNYW51YWxzLgotCi0gICBOb3RlIHRoYXQgdGhpcyB0YWJsZSBpcyBnZW5lcmFsbHkgb25seSBhY2Nlc3NlZCB3aGVuIGl0IGlzIHVzZWQgYXQgcnVudGltZQotICAgdG8gaW5pdGlhbGl6ZSBlcnJubyBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcyB0aGF0IGFyZSBpbmRleGVkIGJ5IGVycm5vCi0gICB2YWx1ZS4KLQotICAgTm90IGFsbCBvZiB0aGVzZSBlcnJub3Mgd2lsbCBleGlzdCBvbiBhbGwgc3lzdGVtcy4gIFRoaXMgdGFibGUgaXMgdGhlIG9ubHkKLSAgIHRoaW5nIHRoYXQgc2hvdWxkIGhhdmUgdG8gYmUgdXBkYXRlZCBhcyBuZXcgZXJyb3IgbnVtYmVycyBhcmUgaW50cm9kdWNlZC4KLSAgIEl0J3Mgc29ydCBvZiB1Z2x5LCBidXQgYXQgbGVhc3QgaXRzIHBvcnRhYmxlLiAqLwotCi1zdHJ1Y3QgZXJyb3JfaW5mbwotewotICBpbnQgdmFsdWU7CQkvKiBUaGUgbnVtZXJpYyB2YWx1ZSBmcm9tIDxlcnJuby5oPiAqLwotICBjb25zdCBjaGFyICpuYW1lOwkvKiBUaGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZSAqLwotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0gIGNvbnN0IGNoYXIgKm1zZzsJLyogU2hvcnQgbWVzc2FnZSBhYm91dCB0aGlzIHZhbHVlICovCi0jZW5kaWYKLX07Ci0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWUsIG1zZ30KLSNlbHNlCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVycm9yX2luZm8gZXJyb3JfdGFibGVbXSA9Ci17Ci0jaWYgZGVmaW5lZCAoRVBFUk0pCi0gIEVOVFJZKEVQRVJNLCAiRVBFUk0iLCAiTm90IG93bmVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9FTlQpCi0gIEVOVFJZKEVOT0VOVCwgIkVOT0VOVCIsICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1JDSCkKLSAgRU5UUlkoRVNSQ0gsICJFU1JDSCIsICJObyBzdWNoIHByb2Nlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlRSKQotICBFTlRSWShFSU5UUiwgIkVJTlRSIiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSU8pCi0gIEVOVFJZKEVJTywgIkVJTyIsICJJL08gZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOWElPKQotICBFTlRSWShFTlhJTywgIkVOWElPIiwgIk5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEUyQklHKQotICBFTlRSWShFMkJJRywgIkUyQklHIiwgIkFyZyBsaXN0IHRvbyBsb25nIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9FWEVDKQotICBFTlRSWShFTk9FWEVDLCAiRU5PRVhFQyIsICJFeGVjIGZvcm1hdCBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBREYpCi0gIEVOVFJZKEVCQURGLCAiRUJBREYiLCAiQmFkIGZpbGUgbnVtYmVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ0hJTEQpCi0gIEVOVFJZKEVDSElMRCwgIkVDSElMRCIsICJObyBjaGlsZCBwcm9jZXNzZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVXT1VMREJMT0NLKQkvKiBQdXQgYmVmb3JlIEVBR0FJTiwgc29tZXRpbWVzIGFsaWFzZWQgKi8KLSAgRU5UUlkoRVdPVUxEQkxPQ0ssICJFV09VTERCTE9DSyIsICJPcGVyYXRpb24gd291bGQgYmxvY2siKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBR0FJTikKLSAgRU5UUlkoRUFHQUlOLCAiRUFHQUlOIiwgIk5vIG1vcmUgcHJvY2Vzc2VzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9NRU0pCi0gIEVOVFJZKEVOT01FTSwgIkVOT01FTSIsICJOb3QgZW5vdWdoIHNwYWNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUNDRVMpCi0gIEVOVFJZKEVBQ0NFUywgIkVBQ0NFUyIsICJQZXJtaXNzaW9uIGRlbmllZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUZBVUxUKQotICBFTlRSWShFRkFVTFQsICJFRkFVTFQiLCAiQmFkIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RCTEspCi0gIEVOVFJZKEVOT1RCTEssICJFTk9UQkxLIiwgIkJsb2NrIGRldmljZSByZXF1aXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJVU1kpCi0gIEVOVFJZKEVCVVNZLCAiRUJVU1kiLCAiRGV2aWNlIGJ1c3kiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVFWElTVCkKLSAgRU5UUlkoRUVYSVNULCAiRUVYSVNUIiwgIkZpbGUgZXhpc3RzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFWERFVikKLSAgRU5UUlkoRVhERVYsICJFWERFViIsICJDcm9zcy1kZXZpY2UgbGluayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PREVWKQotICBFTlRSWShFTk9ERVYsICJFTk9ERVYiLCAiTm8gc3VjaCBkZXZpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RESVIpCi0gIEVOVFJZKEVOT1RESVIsICJFTk9URElSIiwgIk5vdCBhIGRpcmVjdG9yeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlTRElSKQotICBFTlRSWShFSVNESVIsICJFSVNESVIiLCAiSXMgYSBkaXJlY3RvcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlZBTCkKLSAgRU5UUlkoRUlOVkFMLCAiRUlOVkFMIiwgIkludmFsaWQgYXJndW1lbnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORklMRSkKLSAgRU5UUlkoRU5GSUxFLCAiRU5GSUxFIiwgIkZpbGUgdGFibGUgb3ZlcmZsb3ciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNRklMRSkKLSAgRU5UUlkoRU1GSUxFLCAiRU1GSUxFIiwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RUWSkKLSAgRU5UUlkoRU5PVFRZLCAiRU5PVFRZIiwgIk5vdCBhIHR5cGV3cml0ZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVUWFRCU1kpCi0gIEVOVFJZKEVUWFRCU1ksICJFVFhUQlNZIiwgIlRleHQgZmlsZSBidXN5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRkJJRykKLSAgRU5UUlkoRUZCSUcsICJFRkJJRyIsICJGaWxlIHRvbyBsYXJnZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PU1BDKQotICBFTlRSWShFTk9TUEMsICJFTk9TUEMiLCAiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTUElQRSkKLSAgRU5UUlkoRVNQSVBFLCAiRVNQSVBFIiwgIklsbGVnYWwgc2VlayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJPRlMpCi0gIEVOVFJZKEVST0ZTLCAiRVJPRlMiLCAiUmVhZC1vbmx5IGZpbGUgc3lzdGVtIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTUxJTkspCi0gIEVOVFJZKEVNTElOSywgIkVNTElOSyIsICJUb28gbWFueSBsaW5rcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBJUEUpCi0gIEVOVFJZKEVQSVBFLCAiRVBJUEUiLCAiQnJva2VuIHBpcGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVET00pCi0gIEVOVFJZKEVET00sICJFRE9NIiwgIk1hdGggYXJndW1lbnQgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkFOR0UpCi0gIEVOVFJZKEVSQU5HRSwgIkVSQU5HRSIsICJNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTVNHKQotICBFTlRSWShFTk9NU0csICJFTk9NU0ciLCAiTm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJRFJNKQotICBFTlRSWShFSURSTSwgIkVJRFJNIiwgIklkZW50aWZpZXIgcmVtb3ZlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNIUk5HKQotICBFTlRSWShFQ0hSTkcsICJFQ0hSTkciLCAiQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDJOU1lOQykKLSAgRU5UUlkoRUwyTlNZTkMsICJFTDJOU1lOQyIsICJMZXZlbCAyIG5vdCBzeW5jaHJvbml6ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMM0hMVCkKLSAgRU5UUlkoRUwzSExULCAiRUwzSExUIiwgIkxldmVsIDMgaGFsdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDNSU1QpCi0gIEVOVFJZKEVMM1JTVCwgIkVMM1JTVCIsICJMZXZlbCAzIHJlc2V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTE5STkcpCi0gIEVOVFJZKEVMTlJORywgIkVMTlJORyIsICJMaW5rIG51bWJlciBvdXQgb2YgcmFuZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVTkFUQ0gpCi0gIEVOVFJZKEVVTkFUQ0gsICJFVU5BVENIIiwgIlByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0NTSSkKLSAgRU5UUlkoRU5PQ1NJLCAiRU5PQ1NJIiwgIk5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDJITFQpCi0gIEVOVFJZKEVMMkhMVCwgIkVMMkhMVCIsICJMZXZlbCAyIGhhbHRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURFQURMSykKLSAgRU5UUlkoRURFQURMSywgIkVERUFETEsiLCAiRGVhZGxvY2sgY29uZGl0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9MQ0spCi0gIEVOVFJZKEVOT0xDSywgIkVOT0xDSyIsICJObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERSkKLSAgRU5UUlkoRUJBREUsICJFQkFERSIsICJJbnZhbGlkIGV4Y2hhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEUikKLSAgRU5UUlkoRUJBRFIsICJFQkFEUiIsICJJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVhGVUxMKQotICBFTlRSWShFWEZVTEwsICJFWEZVTEwiLCAiRXhjaGFuZ2UgZnVsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PQU5PKQotICBFTlRSWShFTk9BTk8sICJFTk9BTk8iLCAiTm8gYW5vZGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURSUUMpCi0gIEVOVFJZKEVCQURSUUMsICJFQkFEUlFDIiwgIkludmFsaWQgcmVxdWVzdCBjb2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEU0xUKQotICBFTlRSWShFQkFEU0xULCAiRUJBRFNMVCIsICJJbnZhbGlkIHNsb3QiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERUFETE9DSykKLSAgRU5UUlkoRURFQURMT0NLLCAiRURFQURMT0NLIiwgIkZpbGUgbG9ja2luZyBkZWFkbG9jayBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJGT05UKQotICBFTlRSWShFQkZPTlQsICJFQkZPTlQiLCAiQmFkIGZvbnQgZmlsZSBmb3JtYXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NUUikKLSAgRU5UUlkoRU5PU1RSLCAiRU5PU1RSIiwgIkRldmljZSBub3QgYSBzdHJlYW0iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0RBVEEpCi0gIEVOVFJZKEVOT0RBVEEsICJFTk9EQVRBIiwgIk5vIGRhdGEgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVElNRSkKLSAgRU5UUlkoRVRJTUUsICJFVElNRSIsICJUaW1lciBleHBpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TUikKLSAgRU5UUlkoRU5PU1IsICJFTk9TUiIsICJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT05FVCkKLSAgRU5UUlkoRU5PTkVULCAiRU5PTkVUIiwgIk1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9QS0cpCi0gIEVOVFJZKEVOT1BLRywgIkVOT1BLRyIsICJQYWNrYWdlIG5vdCBpbnN0YWxsZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRU1PVEUpCi0gIEVOVFJZKEVSRU1PVEUsICJFUkVNT1RFIiwgIk9iamVjdCBpcyByZW1vdGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0xJTkspCi0gIEVOVFJZKEVOT0xJTkssICJFTk9MSU5LIiwgIkxpbmsgaGFzIGJlZW4gc2V2ZXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFEVikKLSAgRU5UUlkoRUFEViwgIkVBRFYiLCAiQWR2ZXJ0aXNlIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1JNTlQpCi0gIEVOVFJZKEVTUk1OVCwgIkVTUk1OVCIsICJTcm1vdW50IGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09NTSkKLSAgRU5UUlkoRUNPTU0sICJFQ09NTSIsICJDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UTykKLSAgRU5UUlkoRVBST1RPLCAiRVBST1RPIiwgIlByb3RvY29sIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTVVMVElIT1ApCi0gIEVOVFJZKEVNVUxUSUhPUCwgIkVNVUxUSUhPUCIsICJNdWx0aWhvcCBhdHRlbXB0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVET1RET1QpCi0gIEVOVFJZKEVET1RET1QsICJFRE9URE9UIiwgIlJGUyBzcGVjaWZpYyBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBRE1TRykKLSAgRU5UUlkoRUJBRE1TRywgIkVCQURNU0ciLCAiTm90IGEgZGF0YSBtZXNzYWdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkFNRVRPT0xPTkcpCi0gIEVOVFJZKEVOQU1FVE9PTE9ORywgIkVOQU1FVE9PTE9ORyIsICJGaWxlIG5hbWUgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVPVkVSRkxPVykKLSAgRU5UUlkoRU9WRVJGTE9XLCAiRU9WRVJGTE9XIiwgIlZhbHVlIHRvbyBsYXJnZSBmb3IgZGVmaW5lZCBkYXRhIHR5cGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RVTklRKQotICBFTlRSWShFTk9UVU5JUSwgIkVOT1RVTklRIiwgIk5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERkQpCi0gIEVOVFJZKEVCQURGRCwgIkVCQURGRCIsICJGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNQ0hHKQotICBFTlRSWShFUkVNQ0hHLCAiRVJFTUNIRyIsICJSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCQUNDKQotICBFTlRSWShFTElCQUNDLCAiRUxJQkFDQyIsICJDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkJBRCkKLSAgRU5UUlkoRUxJQkJBRCwgIkVMSUJCQUQiLCAiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCU0NOKQotICBFTlRSWShFTElCU0NOLCAiRUxJQlNDTiIsICIubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCTUFYKQotICBFTlRSWShFTElCTUFYLCAiRUxJQk1BWCIsICJBdHRlbXB0aW5nIHRvIGxpbmsgaW4gdG9vIG1hbnkgc2hhcmVkIGxpYnJhcmllcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkVYRUMpCi0gIEVOVFJZKEVMSUJFWEVDLCAiRUxJQkVYRUMiLCAiQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlMU0VRKQotICBFTlRSWShFSUxTRVEsICJFSUxTRVEiLCAiSWxsZWdhbCBieXRlIHNlcXVlbmNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TWVMpCi0gIEVOVFJZKEVOT1NZUywgIkVOT1NZUyIsICJPcGVyYXRpb24gbm90IGFwcGxpY2FibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMT09QKQotICBFTlRSWShFTE9PUCwgIkVMT09QIiwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVTVEFSVCkKLSAgRU5UUlkoRVJFU1RBUlQsICJFUkVTVEFSVCIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1RSUElQRSkKLSAgRU5UUlkoRVNUUlBJUEUsICJFU1RSUElQRSIsICJTdHJlYW1zIHBpcGUgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RFTVBUWSkKLSAgRU5UUlkoRU5PVEVNUFRZLCAiRU5PVEVNUFRZIiwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVU0VSUykKLSAgRU5UUlkoRVVTRVJTLCAiRVVTRVJTIiwgIlRvbyBtYW55IHVzZXJzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UU09DSykKLSAgRU5UUlkoRU5PVFNPQ0ssICJFTk9UU09DSyIsICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERVNUQUREUlJFUSkKLSAgRU5UUlkoRURFU1RBRERSUkVRLCAiRURFU1RBRERSUkVRIiwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNU0dTSVpFKQotICBFTlRSWShFTVNHU0laRSwgIkVNU0dTSVpFIiwgIk1lc3NhZ2UgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UT1RZUEUpCi0gIEVOVFJZKEVQUk9UT1RZUEUsICJFUFJPVE9UWVBFIiwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PUFJPVE9PUFQpCi0gIEVOVFJZKEVOT1BST1RPT1BULCAiRU5PUFJPVE9PUFQiLCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBST1RPTk9TVVBQT1JUKQotICBFTlRSWShFUFJPVE9OT1NVUFBPUlQsICJFUFJPVE9OT1NVUFBPUlQiLCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNPQ0tUTk9TVVBQT1JUKQotICBFTlRSWShFU09DS1ROT1NVUFBPUlQsICJFU09DS1ROT1NVUFBPUlQiLCAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU9QTk9UU1VQUCkKLSAgRU5UUlkoRU9QTk9UU1VQUCwgIkVPUE5PVFNVUFAiLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUEZOT1NVUFBPUlQpCi0gIEVOVFJZKEVQRk5PU1VQUE9SVCwgIkVQRk5PU1VQUE9SVCIsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFGTk9TVVBQT1JUKQotICBFTlRSWShFQUZOT1NVUFBPUlQsICJFQUZOT1NVUFBPUlQiLCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFERFJJTlVTRSkKLSAgRU5UUlkoRUFERFJJTlVTRSwgIkVBRERSSU5VU0UiLCAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFERFJOT1RBVkFJTCkKLSAgRU5UUlkoRUFERFJOT1RBVkFJTCwgIkVBRERSTk9UQVZBSUwiLCJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkVURE9XTikKLSAgRU5UUlkoRU5FVERPV04sICJFTkVURE9XTiIsICJOZXR3b3JrIGlzIGRvd24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRVTlJFQUNIKQotICBFTlRSWShFTkVUVU5SRUFDSCwgIkVORVRVTlJFQUNIIiwgIk5ldHdvcmsgaXMgdW5yZWFjaGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRSRVNFVCkKLSAgRU5UUlkoRU5FVFJFU0VULCAiRU5FVFJFU0VUIiwgIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OQUJPUlRFRCkKLSAgRU5UUlkoRUNPTk5BQk9SVEVELCAiRUNPTk5BQk9SVEVEIiwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09OTlJFU0VUKQotICBFTlRSWShFQ09OTlJFU0VULCAiRUNPTk5SRVNFVCIsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0JVRlMpCi0gIEVOVFJZKEVOT0JVRlMsICJFTk9CVUZTIiwgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU0NPTk4pCi0gIEVOVFJZKEVJU0NPTk4sICJFSVNDT05OIiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVENPTk4pCi0gIEVOVFJZKEVOT1RDT05OLCAiRU5PVENPTk4iLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTSFVURE9XTikKLSAgRU5UUlkoRVNIVVRET1dOLCAiRVNIVVRET1dOIiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRPT01BTllSRUZTKQotICBFTlRSWShFVE9PTUFOWVJFRlMsICJFVE9PTUFOWVJFRlMiLCAiVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRJTUVET1VUKQotICBFTlRSWShFVElNRURPVVQsICJFVElNRURPVVQiLCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OUkVGVVNFRCkKLSAgRU5UUlkoRUNPTk5SRUZVU0VELCAiRUNPTk5SRUZVU0VEIiwgIkNvbm5lY3Rpb24gcmVmdXNlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUhPU1RET1dOKQotICBFTlRSWShFSE9TVERPV04sICJFSE9TVERPV04iLCAiSG9zdCBpcyBkb3duIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSE9TVFVOUkVBQ0gpCi0gIEVOVFJZKEVIT1NUVU5SRUFDSCwgIkVIT1NUVU5SRUFDSCIsICJObyByb3V0ZSB0byBob3N0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUxSRUFEWSkKLSAgRU5UUlkoRUFMUkVBRFksICJFQUxSRUFEWSIsICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlOUFJPR1JFU1MpCi0gIEVOVFJZKEVJTlBST0dSRVNTLCAiRUlOUFJPR1JFU1MiLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNUQUxFKQotICBFTlRSWShFU1RBTEUsICJFU1RBTEUiLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVUNMRUFOKQotICBFTlRSWShFVUNMRUFOLCAiRVVDTEVBTiIsICJTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1ROQU0pCi0gIEVOVFJZKEVOT1ROQU0sICJFTk9UTkFNIiwgIk5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5BVkFJTCkKLSAgRU5UUlkoRU5BVkFJTCwgIkVOQVZBSUwiLCAiTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU05BTSkKLSAgRU5UUlkoRUlTTkFNLCAiRUlTTkFNIiwgIklzIGEgbmFtZWQgdHlwZSBmaWxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNT1RFSU8pCi0gIEVOVFJZKEVSRU1PVEVJTywgIkVSRU1PVEVJTyIsICJSZW1vdGUgSS9PIGVycm9yIiksCi0jZW5kaWYKLSAgRU5UUlkoMCwgTlVMTCwgTlVMTCkKLX07Ci0KLSNpZmRlZiBFVk1TRVJSCi0vKiBUaGlzIGlzIG5vdCBpbiB0aGUgdGFibGUsIGJlY2F1c2UgdGhlIG51bWVyaWMgdmFsdWUgb2YgRVZNU0VSUiAoMzI3NjcpCi0gICBsaWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHN5c19lcnJsaXN0W10uICAqLwotc3RhdGljIHN0cnVjdCB7IGludCB2YWx1ZTsgY29uc3QgY2hhciAqbmFtZSwgKm1zZzsgfQotICBldm1zZXJyID0geyBFVk1TRVJSLCAiRVZNU0VSUiIsICJWTVMtc3BlY2lmaWMgZXJyb3IiIH07Ci0jZW5kaWYKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLiAgSW5kZXhlZCBieSB0aGUKLSAgIGVycm5vIHZhbHVlIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoqZXJyb3JfbmFtZXM7Ci1zdGF0aWMgaW50IG51bV9lcnJvcl9uYW1lcyA9IDA7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZSwgaWYgaXQgZG9lcyBub3QKLSAgIGFscmVhZHkgZXhpc3QgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuICBJbmRleGVkIGJ5IHRoZSBlcnJubyB2YWx1ZSB0byBmaW5kCi0gICB0aGUgZGVzY3JpcHRpdmUgc3RyaW5nLgotCi0gICBXZSBkb24ndCBleHBvcnQgaXQgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaGFzIHRoZQotICAgc2FtZSBuYW1lLCBpdCBkaWZmZXJzIGZyb20gb3RoZXIgaW1wbGVtZW50YXRpb25zIGluIHRoYXQgaXQgaXMgZHluYW1pY2FsbHkKLSAgIGluaXRpYWxpemVkIHJhdGhlciB0aGFuIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi1zdGF0aWMgaW50IHN5c19uZXJyOwotc3RhdGljIGNvbnN0IGNoYXIgKipzeXNfZXJybGlzdDsKLQotI2Vsc2UKLQotZXh0ZXJuIGludCBzeXNfbmVycjsKLWV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOwotCi0jZW5kaWYKLQotCi0vKgotCi1OQU1FCi0KLQlpbml0X2Vycm9yX3RhYmxlcyAtLSBpbml0aWFsaXplIHRoZSBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIHZvaWQgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlVc2luZyB0aGUgZXJyb3JfdGFibGUsIHdoaWNoIGlzIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZSwgZ2VuZXJhdGUKLQl0aGUgZXJyb3JfbmFtZXMgYW5kIHRoZSBzeXNfZXJybGlzdCAoaWYgbmVlZGVkKSB0YWJsZXMsIHdoaWNoIGFyZQotCWluZGV4ZWQgYXQgcnVudGltZSBieSBhIHNwZWNpZmljIGVycm5vIHZhbHVlLgotCi1CVUdTCi0KLQlUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlcyBtYXkgZmFpbCB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsCi0JaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgdXNlZnVsLCBidXQgd2UgZG9uJ3QKLQlib21iIGVpdGhlci4gIFdobyBrbm93cywgaXQgbWlnaHQgc3VjY2VlZCBhdCBhIGxhdGVyIHBvaW50IGlmIHdlIGZyZWUKLQlzb21lIG1lbW9yeSBpbiB0aGUgbWVhbnRpbWUuICBJbiBhbnkgY2FzZSwgdGhlIG90aGVyIHJvdXRpbmVzIGtub3cKLQlob3cgdG8gZGVhbCB3aXRoIGxhY2sgb2YgYSB0YWJsZSBhZnRlciB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoaXMKLQltYXkgb3IgbWF5IG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYnVnLCB0aGF0IHdlIGRvbid0IHNwZWNpZmljYWxseQotCXdhcm4gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGZhaWx1cmUgbW9kZS4KLQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfZXJyb3JfdGFibGVzICgpCi17Ci0gIGNvbnN0IHN0cnVjdCBlcnJvcl9pbmZvICplaXA7Ci0gIGludCBuYnl0ZXM7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHNjYW5uZWQgdGhlIGVycm9yX3RhYmxlIG9uY2UgdG8gZmluZCB0aGUgbWF4aW11bQotICAgICBlcnJubyB2YWx1ZSwgdGhlbiBnbyBmaW5kIGl0IG5vdy4gKi8KLQotICBpZiAobnVtX2Vycm9yX25hbWVzID09IDApCi0gICAgewotICAgICAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JewotCSAgaWYgKGVpcCAtPiB2YWx1ZSA+PSBudW1fZXJyb3JfbmFtZXMpCi0JICAgIHsKLQkgICAgICBudW1fZXJyb3JfbmFtZXMgPSBlaXAgLT4gdmFsdWUgKyAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgZXJyb3JfbmFtZXMgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZXJyb3JfdGFibGUuICovCi0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX2Vycm9yX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChlcnJvcl9uYW1lcyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChlcnJvcl9uYW1lcywgMCwgbmJ5dGVzKTsKLQkgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgZXJyb3JfbmFtZXNbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBuYW1lOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHN5c19lcnJsaXN0IHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KLSAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGVycm9yX3RhYmxlLiAqLwotCi0gIGlmIChzeXNfZXJybGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5ieXRlcyA9IG51bV9lcnJvcl9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc3lzX2Vycmxpc3QgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc3lzX2Vycmxpc3QsIDAsIG5ieXRlcyk7Ci0JICBzeXNfbmVyciA9IG51bV9lcnJvcl9uYW1lczsKLQkgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc3lzX2Vycmxpc3RbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBtc2c7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jZW5kaWYKLQotfQotCi0vKgotCi1OQU1FCi0KLQllcnJub19tYXggLS0gcmV0dXJuIHRoZSBtYXggZXJybm8gdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBlcnJub19tYXggKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIHRoZSBtYXhpbXVtIGVycm5vIHZhbHVlIGZvciB3aGljaCBhIGNvcnJlc3BvbmRpbmcgc3ltYm9saWMKLQluYW1lIG9yIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IGluIHRoZSBjYXNlIHdoZXJlCi0Jd2UgdXNlIHRoZSBzeXNfZXJybGlzdCBzdXBwbGllZCBieSB0aGUgc3lzdGVtLCBpdCBpcyBwb3NzaWJsZSBmb3IKLQl0aGVyZSB0byBiZSBtb3JlIHN5bWJvbGljIG5hbWVzIHRoYW4gbWVzc2FnZXMsIG9yIHZpY2UgdmVyc2EuCi0JSW4gZmFjdCwgdGhlIG1hbnVhbCBwYWdlIGZvciBwZXJyb3IoM0MpIGV4cGxpY2l0bHkgd2FybnMgdGhhdCBvbmUKLQlzaG91bGQgY2hlY2sgdGhlIHNpemUgb2YgdGhlIHRhYmxlIChzeXNfbmVycikgYmVmb3JlIGluZGV4aW5nIGl0LAotCXNpbmNlIG5ldyBlcnJvciBjb2RlcyBtYXkgYmUgYWRkZWQgdG8gdGhlIHN5c3RlbSBiZWZvcmUgdGhleSBhcmUKLQlhZGRlZCB0byB0aGUgdGFibGUuICBUaHVzIHN5c19uZXJyIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB2YWx1ZQotCWltcGxpZWQgYnkgdGhlIGxhcmdlc3QgZXJybm8gdmFsdWUgZGVmaW5lZCBpbiA8ZXJybm8uaD4uCi0KLQlXZSByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYSBtZWFuaW5nZnVsCi0Jc3ltYm9saWMgbmFtZSBvciBtZXNzYWdlLgotCi0qLwotCi1pbnQKLWVycm5vX21heCAoKQotewotICBpbnQgbWF4c2l6ZTsKLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLSAgICB9Ci0gIG1heHNpemUgPSBNQVggKHN5c19uZXJyLCBudW1fZXJyb3JfbmFtZXMpOwotICByZXR1cm4gKG1heHNpemUgLSAxKTsKLX0KLQotI2lmbmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qCi0KLU5BTUUKLQotCXN0cmVycm9yIC0tIG1hcCBhbiBlcnJvciBudW1iZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNoYXIgKnN0cmVycm9yIChpbnQgZXJybm92YWwpCi0KLURFU0NSSVBUSU9OCi0KLQlNYXBzIGFuIGVycm5vIG51bWJlciB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhlIGNvbnRlbnRzIG9mCi0Jd2hpY2ggYXJlIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICBPbiBzeXN0ZW1zIHdoaWNoIGhhdmUgdGhlIGV4dGVybmFsCi0JdmFyaWFibGVzIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCwgdGhlc2Ugc3RyaW5ncyB3aWxsIGJlIHRoZSBzYW1lCi0JYXMgdGhlIG9uZXMgdXNlZCBieSBwZXJyb3IoKS4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHRoZSBzeXNfZXJybGlzdCwgYnV0IG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCWVycm9yIG51bWJlciwgdGhlbiByZXR1cm5zIHRoZSBzdHJpbmcgIkVycm9yIE5VTSIsIHdoZXJlIE5VTSBpcyB0aGUKLQllcnJvciBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgZXJyb3IgbnVtYmVyIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gc3lzX2Vycmxpc3QsCi0JcmV0dXJucyBOVUxMLgotCi0JVGhlIHJldHVybmVkIHN0cmluZyBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgb25seSB1bnRpbCB0aGUKLQluZXh0IGNhbGwgdG8gc3RyZXJyb3IuCi0KLSovCi0KLWNoYXIgKgotc3RyZXJyb3IgKGVycm5vdmFsKQotICBpbnQgZXJybm92YWw7Ci17Ci0gIGNoYXIgKm1zZzsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0gICAgfQotCi0jZW5kaWYKLQotICBpZiAoKGVycm5vdmFsIDwgMCkgfHwgKGVycm5vdmFsID49IHN5c19uZXJyKSkKLSAgICB7Ci0jaWZkZWYgRVZNU0VSUgotICAgICAgaWYgKGVycm5vdmFsID09IGV2bXNlcnIudmFsdWUpCi0JbXNnID0gZXZtc2Vyci5tc2c7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeXNfZXJybGlzdCA9PSBOVUxMKSB8fCAoc3lzX2Vycmxpc3RbZXJybm92YWxdID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc3lzX2Vycmxpc3Qgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIkVycm9yICVkIiwgZXJybm92YWwpOwotICAgICAgbXNnID0gYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBtZXNzYWdlLiAgSnVzdCByZXR1cm4gdGhlIG1lc3NhZ2UuICovCi0gICAgICBtc2cgPSAoY2hhciAqKSBzeXNfZXJybGlzdFtlcnJub3ZhbF07Ci0gICAgfQotICAKLSAgcmV0dXJuIChtc2cpOwotfQotCi0jZW5kaWYJLyogISBIQVZFX1NUUkVSUk9SICovCi0KLQotLyoKLQotTkFNRQotCi0Jc3RyZXJybm8gLS0gbWFwIGFuIGVycm9yIG51bWJlciB0byBhIHN5bWJvbGljIG5hbWUgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJlcnJubyAoaW50IGVycm5vdmFsKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYW4gZXJyb3IgbnVtYmVyIHJldHVybmVkIGZyb20gYSBzeXN0ZW0gY2FsbCAodHlwaWNhbGx5Ci0JcmV0dXJuZWQgaW4gZXJybm8pLCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZQotCXN5bWJvbGljIG5hbWUgb2YgdGhhdCBlcnJvciBudW1iZXIsIGFzIGZvdW5kIGluIDxlcnJuby5oPi4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHN5bWJvbGljIG5hbWVzLCBidXQgbm8gbmFtZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCi0JZXJyb3IgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiRXJyb3IgTlVNIiwgd2hlcmUgTlVNIGlzCi0JdGhlIGVycm9yIG51bWJlci4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdmFsaWQKLQlpbmRpY2VzLCB0aGVuIHJldHVybnMgTlVMTC4KLQotQlVHUwotCi0JVGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKLQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHN0cmVycm5vLgotCi0qLwotCi1jb25zdCBjaGFyICoKLXN0cmVycm5vIChlcnJub3ZhbCkKLSAgaW50IGVycm5vdmFsOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfZXJyb3JfdGFibGVzICgpOwotICAgIH0KLQotICBpZiAoKGVycm5vdmFsIDwgMCkgfHwgKGVycm5vdmFsID49IG51bV9lcnJvcl9uYW1lcykpCi0gICAgewotI2lmZGVmIEVWTVNFUlIKLSAgICAgIGlmIChlcnJub3ZhbCA9PSBldm1zZXJyLnZhbHVlKQotCW5hbWUgPSBldm1zZXJyLm5hbWU7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoZXJyb3JfbmFtZXMgPT0gTlVMTCkgfHwgKGVycm9yX25hbWVzW2Vycm5vdmFsXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIGVycm9yX25hbWVzIG9yIG5vIGVudHJ5IGF0IHRoaXMgaW5kZXguICovCi0gICAgICBzcHJpbnRmIChidWYsICJFcnJvciAlZCIsIGVycm5vdmFsKTsKLSAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG5hbWUuICBKdXN0IHJldHVybiB0aGUgbmFtZS4gKi8KLSAgICAgIG5hbWUgPSBlcnJvcl9uYW1lc1tlcnJub3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiAobmFtZSk7Ci19Ci0KLS8qCi0KLU5BTUUKLQotCXN0cnRvZXJybm8gLS0gbWFwIGEgc3ltYm9saWMgZXJybm8gbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBzdHJ0b2Vycm5vIChjaGFyICpuYW1lKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gdGhlIHN5bWJvbGljIG5hbWUgb2YgYSBlcnJvciBudW1iZXIsIG1hcCBpdCB0byBhbiBlcnJubyB2YWx1ZS4KLQlJZiBubyB0cmFuc2xhdGlvbiBpcyBmb3VuZCwgcmV0dXJucyAwLgotCi0qLwotCi1pbnQKLXN0cnRvZXJybm8gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBlcnJub3ZhbCA9IDA7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLQl9Ci0gICAgICBmb3IgKGVycm5vdmFsID0gMDsgZXJybm92YWwgPCBudW1fZXJyb3JfbmFtZXM7IGVycm5vdmFsKyspCi0JewotCSAgaWYgKChlcnJvcl9uYW1lc1tlcnJub3ZhbF0gIT0gTlVMTCkgJiYKLQkgICAgICAoc3RyY21wIChuYW1lLCBlcnJvcl9uYW1lc1tlcnJub3ZhbF0pID09IDApKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZXJybm92YWwgPT0gbnVtX2Vycm9yX25hbWVzKQotCXsKLSNpZmRlZiBFVk1TRVJSCi0JICBpZiAoc3RyY21wIChuYW1lLCBldm1zZXJyLm5hbWUpID09IDApCi0JICAgIGVycm5vdmFsID0gZXZtc2Vyci52YWx1ZTsKLQkgIGVsc2UKLSNlbmRpZgotCSAgZXJybm92YWwgPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAoZXJybm92YWwpOwotfQotCi0KLS8qIEEgc2ltcGxlIGxpdHRsZSBtYWluIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCBwcmludCBhbGwgdGhlIGVycm5vIHRyYW5zbGF0aW9ucwotICAgaWYgTUFJTiBpcyBkZWZpbmVkIGFuZCB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZC4gKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgZXJybjsKLSAgaW50IGVycm5tYXg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgKm1zZzsKLSAgY2hhciAqc3RyZXJyb3IgKCk7Ci0KLSAgZXJybm1heCA9IGVycm5vX21heCAoKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBuYW1lcyB0YWJsZS5cbiIsIG51bV9lcnJvcl9uYW1lcyk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbWVzc2FnZXMgdGFibGUuXG4iLCBzeXNfbmVycik7Ci0gIHByaW50ZiAoIiVkIGlzIG1heCB1c2VmdWwgaW5kZXguXG4iLCBlcnJubWF4KTsKLQotICAvKiBLZWVwIHByaW50aW5nIHZhbHVlcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBvZiAqYm90aCogdGFibGVzLCBub3QKLSAgICAgKmVpdGhlciogdGFibGUuICBOb3RlIHRoYXQga25vd2luZyB0aGUgbWF4aW11bSB1c2VmdWwgaW5kZXggZG9lcyAqbm90KgotICAgICByZWxpZXZlIHVzIG9mIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0ZXN0aW5nIHRoZSByZXR1cm4gcG9pbnRlciBmb3IKLSAgICAgTlVMTC4gKi8KLQotICBmb3IgKGVycm4gPSAwOyBlcnJuIDw9IGVycm5tYXg7IGVycm4rKykKLSAgICB7Ci0gICAgICBuYW1lID0gc3RyZXJybm8gKGVycm4pOwotICAgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxOVUxMPiIgOiBuYW1lOwotICAgICAgbXNnID0gc3RyZXJyb3IgKGVycm4pOwotICAgICAgbXNnID0gKG1zZyA9PSBOVUxMKSA/ICI8TlVMTD4iIDogbXNnOwotICAgICAgcHJpbnRmICgiJS00ZCUtMThzJXNcbiIsIGVycm4sIG5hbWUsIG1zZyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJuY2FzZWNtcC5jIGIvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODVjYWMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg3IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBhbmQgdGhhdCBkdWUgY3JlZGl0IGlzIGdpdmVuCi0gKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LiBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQotICogbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRoaXMgc29mdHdhcmUKLSAqIGlzIHByb3ZpZGVkIGBgYXMgaXMnJyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqLwotCi0jaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCi1zdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpc3RyY2FzZWNtcC5jCTUuNSAoQmVya2VsZXkpIDExLzI0Lzg3IjsKLSNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGFycmF5IGlzIGRlc2lnbmVkIGZvciBtYXBwaW5nIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcgotICogdG9nZXRoZXIgZm9yIGEgY2FzZSBpbmRlcGVuZGVudCBjb21wYXJpc29uLiAgVGhlIG1hcHBpbmdzIGFyZQotICogYmFzZWQgdXBvbiBhc2NpaSBjaGFyYWN0ZXIgc2VxdWVuY2VzLgotICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBjaGFybWFwW10gPSB7Ci0JJ1wwMDAnLCAnXDAwMScsICdcMDAyJywgJ1wwMDMnLCAnXDAwNCcsICdcMDA1JywgJ1wwMDYnLCAnXDAwNycsCi0JJ1wwMTAnLCAnXDAxMScsICdcMDEyJywgJ1wwMTMnLCAnXDAxNCcsICdcMDE1JywgJ1wwMTYnLCAnXDAxNycsCi0JJ1wwMjAnLCAnXDAyMScsICdcMDIyJywgJ1wwMjMnLCAnXDAyNCcsICdcMDI1JywgJ1wwMjYnLCAnXDAyNycsCi0JJ1wwMzAnLCAnXDAzMScsICdcMDMyJywgJ1wwMzMnLCAnXDAzNCcsICdcMDM1JywgJ1wwMzYnLCAnXDAzNycsCi0JJ1wwNDAnLCAnXDA0MScsICdcMDQyJywgJ1wwNDMnLCAnXDA0NCcsICdcMDQ1JywgJ1wwNDYnLCAnXDA0NycsCi0JJ1wwNTAnLCAnXDA1MScsICdcMDUyJywgJ1wwNTMnLCAnXDA1NCcsICdcMDU1JywgJ1wwNTYnLCAnXDA1NycsCi0JJ1wwNjAnLCAnXDA2MScsICdcMDYyJywgJ1wwNjMnLCAnXDA2NCcsICdcMDY1JywgJ1wwNjYnLCAnXDA2NycsCi0JJ1wwNzAnLCAnXDA3MScsICdcMDcyJywgJ1wwNzMnLCAnXDA3NCcsICdcMDc1JywgJ1wwNzYnLCAnXDA3NycsCi0JJ1wxMDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxMzMnLCAnXDEzNCcsICdcMTM1JywgJ1wxMzYnLCAnXDEzNycsCi0JJ1wxNDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxNzMnLCAnXDE3NCcsICdcMTc1JywgJ1wxNzYnLCAnXDE3NycsCi0JJ1wyMDAnLCAnXDIwMScsICdcMjAyJywgJ1wyMDMnLCAnXDIwNCcsICdcMjA1JywgJ1wyMDYnLCAnXDIwNycsCi0JJ1wyMTAnLCAnXDIxMScsICdcMjEyJywgJ1wyMTMnLCAnXDIxNCcsICdcMjE1JywgJ1wyMTYnLCAnXDIxNycsCi0JJ1wyMjAnLCAnXDIyMScsICdcMjIyJywgJ1wyMjMnLCAnXDIyNCcsICdcMjI1JywgJ1wyMjYnLCAnXDIyNycsCi0JJ1wyMzAnLCAnXDIzMScsICdcMjMyJywgJ1wyMzMnLCAnXDIzNCcsICdcMjM1JywgJ1wyMzYnLCAnXDIzNycsCi0JJ1wyNDAnLCAnXDI0MScsICdcMjQyJywgJ1wyNDMnLCAnXDI0NCcsICdcMjQ1JywgJ1wyNDYnLCAnXDI0NycsCi0JJ1wyNTAnLCAnXDI1MScsICdcMjUyJywgJ1wyNTMnLCAnXDI1NCcsICdcMjU1JywgJ1wyNTYnLCAnXDI1NycsCi0JJ1wyNjAnLCAnXDI2MScsICdcMjYyJywgJ1wyNjMnLCAnXDI2NCcsICdcMjY1JywgJ1wyNjYnLCAnXDI2NycsCi0JJ1wyNzAnLCAnXDI3MScsICdcMjcyJywgJ1wyNzMnLCAnXDI3NCcsICdcMjc1JywgJ1wyNzYnLCAnXDI3NycsCi0JJ1wzMDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzMzMnLCAnXDMzNCcsICdcMzM1JywgJ1wzMzYnLCAnXDMzNycsCi0JJ1wzNDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzNzMnLCAnXDM3NCcsICdcMzc1JywgJ1wzNzYnLCAnXDM3NycsCi19OwotCi1pbnQKLXN0cm5jYXNlY21wKHMxLCBzMiwgbikKLQljb25zdCBjaGFyICpzMSwgKnMyOwotCXJlZ2lzdGVyIHNpemVfdCBuOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdTEsIHUyOwotCi0gICAgZm9yICg7IG4gIT0gMDsgLS1uKSB7Ci0JdTEgPSAodW5zaWduZWQgY2hhcikgKnMxKys7Ci0JdTIgPSAodW5zaWduZWQgY2hhcikgKnMyKys7Ci0JaWYgKGNoYXJtYXBbdTFdICE9IGNoYXJtYXBbdTJdKSB7Ci0JICAgIHJldHVybiBjaGFybWFwW3UxXSAtIGNoYXJtYXBbdTJdOwotCX0KLQlpZiAodTEgPT0gJ1wwJykgewotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnJjaHIuYyBiL2xpYmliZXJ0eS9zdHJyY2hyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDViY2IuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnJjaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RycmNocigpLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQlzdHJyY2hyIC0tIHJldHVybiBwb2ludGVyIHRvIGxhc3Qgb2NjdXJhbmNlIG9mIGEgY2hhcmFjdGVyCi0KLVNZTk9QU0lTCi0JY2hhciAqc3RycmNociAoY29uc3QgY2hhciAqcywgaW50IGMpCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIGNoYXJhY3RlciBDIGluCi0Jc3RyaW5nIFMsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vIG9jY3VyYW5jZSBpcyBmb3VuZC4KLQkKLUJVR1MKLQlCZWhhdmlvciB3aGVuIGNoYXJhY3RlciBpcyB0aGUgbnVsbCBjaGFyYWN0ZXIgaXMgaW1wbGVtZW50YXRpb24KLQlkZXBlbmRlbnQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotY2hhciAqCi1zdHJyY2hyIChzLCBjKQotICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgY2hhciAqcnRudmFsID0gMDsKLQotICBkbyB7Ci0gICAgaWYgKCpzID09IGMpCi0gICAgICBydG52YWwgPSAoY2hhciopIHM7Ci0gIH0gd2hpbGUgKCpzKyspOwotICByZXR1cm4gKHJ0bnZhbCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3Ryc2lnbmFsLmMgYi9saWJpYmVydHkvc3Ryc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmIxMGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnNpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qIEV4dGVuZGVkIHN1cHBvcnQgZm9yIHVzaW5nIHNpZ25hbCB2YWx1ZXMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaC4gIGZuZkBjeWdudXMuY29tCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBXZSBuZWVkIHRvIGRlY2xhcmUgc3lzX3NpZ2xpc3QsIGJlY2F1c2UgZXZlbiBpZiB0aGUgc3lzdGVtIHByb3ZpZGVzCi0gICBpdCB3ZSBjYW4ndCBhc3N1bWUgdGhhdCBpdCBpcyBkZWNsYXJlZCBpbiA8c2lnbmFsLmg+IChmb3IgZXhhbXBsZSwKLSAgIFN1bk9TIHByb3ZpZGVzIHN5c19zaWdsaXN0LCBidXQgaXQgZG9lcyBub3QgZGVjbGFyZSBpdCBpbiBhbnkKLSAgIGhlYWRlciBmaWxlKS4gIGZIb3dldmVyLCB3ZSBjYW4ndCBkZWNsYXJlIHN5c19zaWdsaXN0IHBvcnRhYmx5LAotICAgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgaXMgZGVjbGFyZWQgd2l0aCBjb25zdCBhbmQgb24gc29tZQotICAgc3lzdGVtcyBpdCBpcyBkZWNsYXJlZCB3aXRob3V0IGNvbnN0LiAgSWYgd2Ugd2VyZSB1c2luZyBhdXRvY29uZiwKLSAgIHdlIGNvdWxkIHdvcmsgb3V0IHRoZSByaWdodCBkZWNsYXJhdGlvbi4gIFVudGlsLCB0aGVuIHdlIGp1c3QKLSAgIGlnbm9yZSBhbnkgZGVjbGFyYXRpb24gaW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMsIGFuZCBhbHdheXMKLSAgIGRlY2xhcmUgaXQgb3Vyc2VsdmVzLiAgV2l0aCBsdWNrLCB0aGlzIHdpbGwgYWx3YXlzIHdvcmsuICAqLwotI2RlZmluZSBzeXNfc2lnbGlzdCBub19zdWNoX3N5bWJvbAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3Qgc2l6ZSk7CQkJCS8qIDQuMTAuMy4zICovCi1leHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOwkJCS8qIDQuMTEuNi4xICovCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqbWVtc2V0ICgpOwotI2VuZGlmCS8qIF9fU1REQ19fICovCi0KLS8qIFVuZGVmaW5lIHRoZSBtYWNybyB3ZSB1c2VkIHRvIGhpZGUgdGhlIGRlZmluaXRpb24gb2Ygc3lzX3NpZ2xpc3QKLSAgIGZvdW5kIGluIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBzeXNfc2lnbGlzdAotCi0jaWZuZGVmIE5VTEwKLSMgIGlmZGVmIF9fU1REQ19fCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE5VTEwgMAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgZGVmaW5lIE1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW5pdF9zaWduYWxfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIHNpZ25hbCB2YWx1ZXMuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIHRhYmxlIGlzIGdlbmVyYWxseSBvbmx5IGFjY2Vzc2VkIHdoZW4gaXQgaXMgdXNlZCBhdCBydW50aW1lCi0gICB0byBpbml0aWFsaXplIHNpZ25hbCBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcyB0aGF0IGFyZSBpbmRleGVkIGJ5IHNpZ25hbAotICAgdmFsdWUuCi0KLSAgIE5vdCBhbGwgb2YgdGhlc2Ugc2lnbmFscyB3aWxsIGV4aXN0IG9uIGFsbCBzeXN0ZW1zLiAgVGhpcyB0YWJsZSBpcyB0aGUgb25seQotICAgdGhpbmcgdGhhdCBzaG91bGQgaGF2ZSB0byBiZSB1cGRhdGVkIGFzIG5ldyBzaWduYWwgbnVtYmVycyBhcmUgaW50cm9kdWNlZC4KLSAgIEl0J3Mgc29ydCBvZiB1Z2x5LCBidXQgYXQgbGVhc3QgaXRzIHBvcnRhYmxlLiAqLwotCi1zdHJ1Y3Qgc2lnbmFsX2luZm8KLXsKLSAgaW50IHZhbHVlOwkJLyogVGhlIG51bWVyaWMgdmFsdWUgZnJvbSA8c2lnbmFsLmg+ICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7CS8qIFRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlICovCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLSAgY29uc3QgY2hhciAqbXNnOwkvKiBTaG9ydCBtZXNzYWdlIGFib3V0IHRoaXMgdmFsdWUgKi8KLSNlbmRpZgotfTsKLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZSwgbXNnfQotI2Vsc2UKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lnbmFsX2luZm8gc2lnbmFsX3RhYmxlW10gPQotewotI2lmIGRlZmluZWQgKFNJR0hVUCkKLSAgRU5UUlkoU0lHSFVQLCAiU0lHSFVQIiwgIkhhbmd1cCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHSU5UKQotICBFTlRSWShTSUdJTlQsICJTSUdJTlQiLCAiSW50ZXJydXB0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdRVUlUKQotICBFTlRSWShTSUdRVUlULCAiU0lHUVVJVCIsICJRdWl0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdJTEwpCi0gIEVOVFJZKFNJR0lMTCwgIlNJR0lMTCIsICJJbGxlZ2FsIGluc3RydWN0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUUkFQKQotICBFTlRSWShTSUdUUkFQLCAiU0lHVFJBUCIsICJUcmFjZS9icmVha3BvaW50IHRyYXAiKSwKLSNlbmRpZgotLyogUHV0IFNJR0lPVCBiZWZvcmUgU0lHQUJSVCwgc28gdGhhdCBpZiBTSUdJT1Q9PVNJR0FCUlQgdGhlbiBTSUdBQlJUCi0gICBvdmVycmlkZXMgU0lHSU9ULiAgU0lHQUJSVCBpcyBpbiBBTlNJIGFuZCBQT1NJWC4xLCBhbmQgU0lHSU9UIGlzbid0LiAqLwotI2lmIGRlZmluZWQgKFNJR0lPVCkKLSAgRU5UUlkoU0lHSU9ULCAiU0lHSU9UIiwgIklPVCB0cmFwIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdBQlJUKQotICBFTlRSWShTSUdBQlJULCAiU0lHQUJSVCIsICJBYm9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdFTVQpCi0gIEVOVFJZKFNJR0VNVCwgIlNJR0VNVCIsICJFbXVsYXRpb24gdHJhcCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHRlBFKQotICBFTlRSWShTSUdGUEUsICJTSUdGUEUiLCAiQXJpdGhtZXRpYyBleGNlcHRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0tJTEwpCi0gIEVOVFJZKFNJR0tJTEwsICJTSUdLSUxMIiwgIktpbGxlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQlVTKQotICBFTlRSWShTSUdCVVMsICJTSUdCVVMiLCAiQnVzIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTRUdWKQotICBFTlRSWShTSUdTRUdWLCAiU0lHU0VHViIsICJTZWdtZW50YXRpb24gZmF1bHQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NZUykKLSAgRU5UUlkoU0lHU1lTLCAiU0lHU1lTIiwgIkJhZCBzeXN0ZW0gY2FsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUElQRSkKLSAgRU5UUlkoU0lHUElQRSwgIlNJR1BJUEUiLCAiQnJva2VuIHBpcGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0FMUk0pCi0gIEVOVFJZKFNJR0FMUk0sICJTSUdBTFJNIiwgIkFsYXJtIGNsb2NrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdURVJNKQotICBFTlRSWShTSUdURVJNLCAiU0lHVEVSTSIsICJUZXJtaW5hdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdVU1IxKQotICBFTlRSWShTSUdVU1IxLCAiU0lHVVNSMSIsICJVc2VyIGRlZmluZWQgc2lnbmFsIDEiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1VTUjIpCi0gIEVOVFJZKFNJR1VTUjIsICJTSUdVU1IyIiwgIlVzZXIgZGVmaW5lZCBzaWduYWwgMiIpLAotI2VuZGlmCi0vKiBQdXQgU0lHQ0xEIGJlZm9yZSBTSUdDSExELCBzbyB0aGF0IGlmIFNJR0NMRD09U0lHQ0hMRCB0aGVuIFNJR0NITEQKLSAgIG92ZXJyaWRlcyBTSUdDTEQuICBTSUdDSExEIGlzIGluIFBPWElYLjEgKi8KLSNpZiBkZWZpbmVkIChTSUdDTEQpCi0gIEVOVFJZKFNJR0NMRCwgIlNJR0NMRCIsICJDaGlsZCBzdGF0dXMgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQ0hMRCkKLSAgRU5UUlkoU0lHQ0hMRCwgIlNJR0NITEQiLCAiQ2hpbGQgc3RhdHVzIGNoYW5nZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BXUikKLSAgRU5UUlkoU0lHUFdSLCAiU0lHUFdSIiwgIlBvd2VyIGZhaWwvcmVzdGFydCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHV0lOQ0gpCi0gIEVOVFJZKFNJR1dJTkNILCAiU0lHV0lOQ0giLCAiV2luZG93IHNpemUgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVVJHKQotICBFTlRSWShTSUdVUkcsICJTSUdVUkciLCAiVXJnZW50IEkvTyBjb25kaXRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0lPKQotICAvKiAiSS9PIHBlbmRpbmciIGhhcyBhbHNvIGJlZW4gc3VnZ2VzdGVkLCBidXQgaXMgbWlzbGVhZGluZyBzaW5jZSB0aGUKLSAgICAgc2lnbmFsIG9ubHkgaGFwcGVucyB3aGVuIHRoZSBwcm9jZXNzIGhhcyBhc2tlZCBmb3IgaXQsIG5vdCBldmVyeXRpbWUKLSAgICAgSS9PIGlzIHBlbmRpbmcuICovCi0gIEVOVFJZKFNJR0lPLCAiU0lHSU8iLCAiSS9PIHBvc3NpYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQT0xMKQotICBFTlRSWShTSUdQT0xMLCAiU0lHUE9MTCIsICJQb2xsYWJsZSBldmVudCBvY2N1cnJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU1RPUCkKLSAgRU5UUlkoU0lHU1RPUCwgIlNJR1NUT1AiLCAiU3RvcHBlZCAoc2lnbmFsKSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFNUUCkKLSAgRU5UUlkoU0lHVFNUUCwgIlNJR1RTVFAiLCAiU3RvcHBlZCAodXNlcikiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0NPTlQpCi0gIEVOVFJZKFNJR0NPTlQsICJTSUdDT05UIiwgIkNvbnRpbnVlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFRJTikKLSAgRU5UUlkoU0lHVFRJTiwgIlNJR1RUSU4iLCAiU3RvcHBlZCAodHR5IGlucHV0KSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFRPVSkKLSAgRU5UUlkoU0lHVFRPVSwgIlNJR1RUT1UiLCAiU3RvcHBlZCAodHR5IG91dHB1dCkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1ZUQUxSTSkKLSAgRU5UUlkoU0lHVlRBTFJNLCAiU0lHVlRBTFJNIiwgIlZpcnR1YWwgdGltZXIgZXhwaXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUFJPRikKLSAgRU5UUlkoU0lHUFJPRiwgIlNJR1BST0YiLCAiUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1hDUFUpCi0gIEVOVFJZKFNJR1hDUFUsICJTSUdYQ1BVIiwgIkNQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdYRlNaKQotICBFTlRSWShTSUdYRlNaLCAiU0lHWEZTWiIsICJGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1dJTkQpCi0gIEVOVFJZKFNJR1dJTkQsICJTSUdXSU5EIiwgIlNJR1dJTkQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BIT05FKQotICBFTlRSWShTSUdQSE9ORSwgIlNJR1BIT05FIiwgIlNJR1BIT05FIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdMT1NUKQotICBFTlRSWShTSUdMT1NULCAiU0lHTE9TVCIsICJSZXNvdXJjZSBsb3N0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdXQUlUSU5HKQotICBFTlRSWShTSUdXQUlUSU5HLCAiU0lHV0FJVElORyIsICJQcm9jZXNzJ3MgTFdQcyBhcmUgYmxvY2tlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHTFdQKQotICBFTlRSWShTSUdMV1AsICJTSUdMV1AiLCAiU2lnbmFsIExXUCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHREFOR0VSKQotICBFTlRSWShTSUdEQU5HRVIsICJTSUdEQU5HRVIiLCAiU3dhcCBzcGFjZSBkYW5nZXJvdXNseSBsb3ciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0dSQU5UKQotICBFTlRSWShTSUdHUkFOVCwgIlNJR0dSQU5UIiwgIk1vbml0b3IgbW9kZSBncmFudGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdSRVRSQUNUKQotICBFTlRSWShTSUdSRVRSQUNULCAiU0lHUkVUUkFDVCIsICJOZWVkIHRvIHJlbGluZ3Vpc2ggbW9uaXRvciBtb2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdNU0cpCi0gIEVOVFJZKFNJR01TRywgIlNJR01TRyIsICJNb25pdG9yIG1vZGUgZGF0YSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NPVU5EKQotICBFTlRSWShTSUdTT1VORCwgIlNJR1NPVU5EIiwgIlNvdW5kIGNvbXBsZXRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU0FLKQotICBFTlRSWShTSUdTQUssICJTSUdTQUsiLCAiU2VjdXJlIGF0dGVudGlvbiIpLAotI2VuZGlmCi0gIEVOVFJZKDAsIE5VTEwsIE5VTEwpCi19OwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUuICBJbmRleGVkIGJ5IHRoZQotICAgc2lnbmFsIHZhbHVlIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoqc2lnbmFsX25hbWVzOwotc3RhdGljIGludCBudW1fc2lnbmFsX25hbWVzID0gMDsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLCBpZiBpdCBkb2VzIG5vdAotICAgYWxyZWFkeSBleGlzdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4gIEluZGV4ZWQgYnkgdGhlIHNpZ25hbCB2YWx1ZSB0byBmaW5kCi0gICB0aGUgZGVzY3JpcHRpdmUgc3RyaW5nLgotCi0gICBXZSBkb24ndCBleHBvcnQgaXQgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaGFzIHRoZQotICAgc2FtZSBuYW1lLCBpdCBkaWZmZXJzIGZyb20gb3RoZXIgaW1wbGVtZW50YXRpb25zIGluIHRoYXQgaXQgaXMgZHluYW1pY2FsbHkKLSAgIGluaXRpYWxpemVkIHJhdGhlciB0aGFuIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi1zdGF0aWMgaW50IHN5c19uc2lnOwotc3RhdGljIGNvbnN0IGNoYXIgKipzeXNfc2lnbGlzdDsKLQotI2Vsc2UKLQotI2lmZGVmIE5TSUcKLXN0YXRpYyBpbnQgc3lzX25zaWcgPSBOU0lHOwotI2Vsc2UKLSNpZmRlZiBfTlNJRwotc3RhdGljIGludCBzeXNfbnNpZyA9IF9OU0lHOwotI2VuZGlmCi0jZW5kaWYKLWV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgc3lzX3NpZ2xpc3RbXTsKLQotI2VuZGlmCi0KLQotLyoKLQotTkFNRQotCi0JaW5pdF9zaWduYWxfdGFibGVzIC0tIGluaXRpYWxpemUgdGhlIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgdm9pZCBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlVc2luZyB0aGUgc2lnbmFsX3RhYmxlLCB3aGljaCBpcyBpbml0aWFsaXplZCBhdCBjb21waWxlIHRpbWUsIGdlbmVyYXRlCi0JdGhlIHNpZ25hbF9uYW1lcyBhbmQgdGhlIHN5c19zaWdsaXN0IChpZiBuZWVkZWQpIHRhYmxlcywgd2hpY2ggYXJlCi0JaW5kZXhlZCBhdCBydW50aW1lIGJ5IGEgc3BlY2lmaWMgc2lnbmFsIHZhbHVlLgotCi1CVUdTCi0KLQlUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlcyBtYXkgZmFpbCB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsCi0JaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgdXNlZnVsLCBidXQgd2UgZG9uJ3QKLQlib21iIGVpdGhlci4gIFdobyBrbm93cywgaXQgbWlnaHQgc3VjY2VlZCBhdCBhIGxhdGVyIHBvaW50IGlmIHdlIGZyZWUKLQlzb21lIG1lbW9yeSBpbiB0aGUgbWVhbnRpbWUuICBJbiBhbnkgY2FzZSwgdGhlIG90aGVyIHJvdXRpbmVzIGtub3cKLQlob3cgdG8gZGVhbCB3aXRoIGxhY2sgb2YgYSB0YWJsZSBhZnRlciB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoaXMKLQltYXkgb3IgbWF5IG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYnVnLCB0aGF0IHdlIGRvbid0IHNwZWNpZmljYWxseQotCXdhcm4gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGZhaWx1cmUgbW9kZS4KLQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfc2lnbmFsX3RhYmxlcyAoKQotewotICBjb25zdCBzdHJ1Y3Qgc2lnbmFsX2luZm8gKmVpcDsKLSAgaW50IG5ieXRlczsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgc2Nhbm5lZCB0aGUgc2lnbmFsX3RhYmxlIG9uY2UgdG8gZmluZCB0aGUgbWF4aW11bQotICAgICBzaWduYWwgdmFsdWUsIHRoZW4gZ28gZmluZCBpdCBub3cuICovCi0KLSAgaWYgKG51bV9zaWduYWxfbmFtZXMgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JewotCSAgaWYgKGVpcCAtPiB2YWx1ZSA+PSBudW1fc2lnbmFsX25hbWVzKQotCSAgICB7Ci0JICAgICAgbnVtX3NpZ25hbF9uYW1lcyA9IGVpcCAtPiB2YWx1ZSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzaWduYWxfbmFtZXMgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgc2lnbmFsX3RhYmxlLiAqLwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fc2lnbmFsX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChzaWduYWxfbmFtZXMgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc2lnbmFsX25hbWVzLCAwLCBuYnl0ZXMpOwotCSAgZm9yIChlaXAgPSBzaWduYWxfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc2lnbmFsX25hbWVzW2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbmFtZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzeXNfc2lnbGlzdCB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBzaWduYWxfdGFibGUuICovCi0KLSAgaWYgKHN5c19zaWdsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX3NpZ25hbF9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc3lzX3NpZ2xpc3QgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc3lzX3NpZ2xpc3QsIDAsIG5ieXRlcyk7Ci0JICBzeXNfbnNpZyA9IG51bV9zaWduYWxfbmFtZXM7Ci0JICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBzeXNfc2lnbGlzdFtlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG1zZzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotCi19Ci0KLQotLyoKLQotTkFNRQotCi0Jc2lnbm9fbWF4IC0tIHJldHVybiB0aGUgbWF4IHNpZ25vIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc2lnbm9fbWF4ICgpOwotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyB0aGUgbWF4aW11bSBzaWdubyB2YWx1ZSBmb3Igd2hpY2ggYSBjb3JyZXNwb25kaW5nIHN5bWJvbGljCi0JbmFtZSBvciBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSB3aGVyZQotCXdlIHVzZSB0aGUgc3lzX3NpZ2xpc3Qgc3VwcGxpZWQgYnkgdGhlIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgZm9yCi0JdGhlcmUgdG8gYmUgbW9yZSBzeW1ib2xpYyBuYW1lcyB0aGFuIG1lc3NhZ2VzLCBvciB2aWNlIHZlcnNhLgotCUluIGZhY3QsIHRoZSBtYW51YWwgcGFnZSBmb3IgcHNpZ25hbCgzYikgZXhwbGljaXRseSB3YXJucyB0aGF0IG9uZQotCXNob3VsZCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgKE5TSUcpIGJlZm9yZSBpbmRleGluZyBpdCwKLQlzaW5jZSBuZXcgc2lnbmFsIGNvZGVzIG1heSBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIGJlZm9yZSB0aGV5IGFyZQotCWFkZGVkIHRvIHRoZSB0YWJsZS4gIFRodXMgTlNJRyBtaWdodCBiZSBzbWFsbGVyIHRoYW4gdmFsdWUKLQlpbXBsaWVkIGJ5IHRoZSBsYXJnZXN0IHNpZ25vIHZhbHVlIGRlZmluZWQgaW4gPHNpZ25hbC5oPi4KLQotCVdlIHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhIG1lYW5pbmdmdWwKLQlzeW1ib2xpYyBuYW1lIG9yIG1lc3NhZ2UuCi0KLSovCi0KLWludAotc2lnbm9fbWF4ICgpCi17Ci0gIGludCBtYXhzaXplOwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotICBtYXhzaXplID0gTUFYIChzeXNfbnNpZywgbnVtX3NpZ25hbF9uYW1lcyk7Ci0gIHJldHVybiAobWF4c2l6ZSAtIDEpOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXN0cnNpZ25hbCAtLSBtYXAgYSBzaWduYWwgbnVtYmVyIHRvIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJzaWduYWwgKGludCBzaWdubykKLQotREVTQ1JJUFRJT04KLQotCU1hcHMgYW4gc2lnbmFsIG51bWJlciB0byBhbiBzaWduYWwgbWVzc2FnZSBzdHJpbmcsIHRoZSBjb250ZW50cyBvZgotCXdoaWNoIGFyZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgT24gc3lzdGVtcyB3aGljaCBoYXZlIHRoZSBleHRlcm5hbAotCXZhcmlhYmxlIHN5c19zaWdsaXN0LCB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIG9uZXMgdXNlZAotCWJ5IHBzaWduYWwoKS4KLQotCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcwotCWZvciB0aGUgc3lzX3NpZ2xpc3QsIGJ1dCBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQlzaWduYWwgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiU2lnbmFsIE5VTSIsIHdoZXJlIE5VTSBpcyB0aGUKLQlzaWduYWwgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byBzeXNfc2lnbGlzdCwKLQlyZXR1cm5zIE5VTEwuCi0KLQlUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBvbmx5IHVudGlsIHRoZQotCW5leHQgY2FsbCB0byBzdHJzaWduYWwuCi0KLSovCi0KLSNpZm5kZWYgSEFWRV9TVFJTSUdOQUwKLQotY29uc3QgY2hhciAqCi1zdHJzaWduYWwgKHNpZ25vKQotICBpbnQgc2lnbm87Ci17Ci0gIGNvbnN0IGNoYXIgKm1zZzsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmICgoc2lnbm8gPCAwKSB8fCAoc2lnbm8gPj0gc3lzX25zaWcpKQotICAgIHsKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeXNfc2lnbGlzdCA9PSBOVUxMKSB8fCAoc3lzX3NpZ2xpc3Rbc2lnbm9dID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc3lzX3NpZ2xpc3Qgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZ25vKTsKLSAgICAgIG1zZyA9IChjb25zdCBjaGFyICopIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbWVzc2FnZS4gIEp1c3QgcmV0dXJuIHRoZSBtZXNzYWdlLiAqLwotICAgICAgbXNnID0gKGNvbnN0IGNoYXIgKikgc3lzX3NpZ2xpc3Rbc2lnbm9dOwotICAgIH0KLSAgCi0gIHJldHVybiAobXNnKTsKLX0KLQotI2VuZGlmIC8qICEgSEFWRV9TVFJTSUdOQUwgKi8KLQotLyoKLQotTkFNRQotCi0Jc3Ryc2lnbm8gLS0gbWFwIGFuIHNpZ25hbCBudW1iZXIgdG8gYSBzeW1ib2xpYyBuYW1lIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY29uc3QgY2hhciAqc3Ryc2lnbm8gKGludCBzaWdubykKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIGFuIHNpZ25hbCBudW1iZXIsIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcKLQl0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGF0IHNpZ25hbCBudW1iZXIsIGFzIGZvdW5kIGluIDxzaWduYWwuaD4uCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3Igc3ltYm9saWMgbmFtZXMsIGJ1dCBubyBuYW1lIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQlzaWduYWwgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiU2lnbmFsIE5VTSIsIHdoZXJlIE5VTSBpcwotCXRoZSBzaWduYWwgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdmFsaWQKLQlpbmRpY2VzLCB0aGVuIHJldHVybnMgTlVMTC4KLQotQlVHUwotCi0JVGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKLQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHN0cnNpZ25vLgotCi0qLwotCi1jb25zdCBjaGFyICoKLXN0cnNpZ25vIChzaWdubykKLSAgaW50IHNpZ25vOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotCi0gIGlmICgoc2lnbm8gPCAwKSB8fCAoc2lnbm8gPj0gbnVtX3NpZ25hbF9uYW1lcykpCi0gICAgewotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBuYW1lID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzaWduYWxfbmFtZXMgPT0gTlVMTCkgfHwgKHNpZ25hbF9uYW1lc1tzaWdub10gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzaWduYWxfbmFtZXMgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZ25vKTsKLSAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG5hbWUuICBKdXN0IHJldHVybiB0aGUgbmFtZS4gKi8KLSAgICAgIG5hbWUgPSBzaWduYWxfbmFtZXNbc2lnbm9dOwotICAgIH0KLQotICByZXR1cm4gKG5hbWUpOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXN0cnRvc2lnbm8gLS0gbWFwIGEgc3ltYm9saWMgc2lnbmFsIG5hbWUgdG8gYSBudW1lcmljIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc3RydG9zaWdubyAoY2hhciAqbmFtZSkKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIHRoZSBzeW1ib2xpYyBuYW1lIG9mIGEgc2lnbmFsLCBtYXAgaXQgdG8gYSBzaWduYWwgbnVtYmVyLgotCUlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCByZXR1cm5zIDAuCi0KLSovCi0KLWludAotc3RydG9zaWdubyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IHNpZ25vID0gMDsKLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0JfQotICAgICAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDwgbnVtX3NpZ25hbF9uYW1lczsgc2lnbm8rKykKLQl7Ci0JICBpZiAoKHNpZ25hbF9uYW1lc1tzaWdub10gIT0gTlVMTCkgJiYKLQkgICAgICAoc3RyY21wIChuYW1lLCBzaWduYWxfbmFtZXNbc2lnbm9dKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNpZ25vID09IG51bV9zaWduYWxfbmFtZXMpCi0JewotCSAgc2lnbm8gPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAoc2lnbm8pOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXBzaWduYWwgLS0gcHJpbnQgbWVzc2FnZSBhYm91dCBzaWduYWwgdG8gc3RkZXJyCi0KLVNZTk9QU0lTCi0KLQl2b2lkIHBzaWduYWwgKHVuc2lnbmVkIHNpZ25vLCBjaGFyICptZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciB0aGUgbWVzc2FnZSwgZm9sbG93ZWQgYnkgYSBjb2xvbiwKLQlmb2xsb3dlZCBieSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNpZ25hbCBzcGVjaWZpZWQgYnkgc2lnbm8sCi0JZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgotKi8KLQotI2lmbmRlZiBIQVZFX1BTSUdOQUwKLQotdm9pZAotcHNpZ25hbCAoc2lnbm8sIG1lc3NhZ2UpCi0gIHVuc2lnbmVkIHNpZ25vOwotICBjaGFyICptZXNzYWdlOwotewotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotICAgIH0KLSAgaWYgKChzaWdubyA8PSAwKSB8fCAoc2lnbm8gPj0gc3lzX25zaWcpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmtub3duIHNpZ25hbFxuIiwgbWVzc2FnZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBzeXNfc2lnbGlzdFtzaWdub10pOwotICAgIH0KLX0KLQotI2VuZGlmCS8qICEgSEFWRV9QU0lHTkFMICovCi0KLQotLyogQSBzaW1wbGUgbGl0dGxlIG1haW4gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHByaW50IGFsbCB0aGUgc2lnbmFsIHRyYW5zbGF0aW9ucwotICAgaWYgTUFJTiBpcyBkZWZpbmVkIGFuZCB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZC4gKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgc2lnbm87Ci0gIGludCBtYXhzaWdubzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqbXNnOwotCi0gIG1heHNpZ25vID0gc2lnbm9fbWF4ICgpOwotICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG5hbWVzIHRhYmxlLlxuIiwgbnVtX3NpZ25hbF9uYW1lcyk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbWVzc2FnZXMgdGFibGUuXG4iLCBzeXNfbnNpZyk7Ci0gIHByaW50ZiAoIiVkIGlzIG1heCB1c2VmdWwgaW5kZXguXG4iLCBtYXhzaWdubyk7Ci0KLSAgLyogS2VlcCBwcmludGluZyB2YWx1ZXMgdW50aWwgd2UgZ2V0IHRvIHRoZSBlbmQgb2YgKmJvdGgqIHRhYmxlcywgbm90Ci0gICAgICplaXRoZXIqIHRhYmxlLiAgTm90ZSB0aGF0IGtub3dpbmcgdGhlIG1heGltdW0gdXNlZnVsIGluZGV4IGRvZXMgKm5vdCoKLSAgICAgcmVsaWV2ZSB1cyBvZiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGVzdGluZyB0aGUgcmV0dXJuIHBvaW50ZXIgZm9yCi0gICAgIE5VTEwuICovCi0KLSAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDw9IG1heHNpZ25vOyBzaWdubysrKQotICAgIHsKLSAgICAgIG5hbWUgPSBzdHJzaWdubyAoc2lnbm8pOwotICAgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxOVUxMPiIgOiBuYW1lOwotICAgICAgbXNnID0gc3Ryc2lnbmFsIChzaWdubyk7Ci0gICAgICBtc2cgPSAobXNnID09IE5VTEwpID8gIjxOVUxMPiIgOiBtc2c7Ci0gICAgICBwcmludGYgKCIlLTRkJS0xOHMlc1xuIiwgc2lnbm8sIG5hbWUsIG1zZyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJzdHIuYyBiL2xpYmliZXJ0eS9zdHJzdHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiMzZlMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3Ryc3RyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Ygc3Ryc3RyIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLQotTkFNRQotCi0Jc3Ryc3RyIC0tIGxvY2F0ZSBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBzdWJzdHJpbmcKLQotU1lOT1BTSVMKLQotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCWNoYXIgKnN0cnN0ciAoY2hhciAqczEsIGNoYXIgKnMyKQotCi1ERVNDUklQVElPTgotCi0JTG9jYXRlcyB0aGUgZmlyc3Qgb2NjdXJhbmNlIGluIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTMSBvZgotCXRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTMi4gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdWJzdHJpbmcKLQlmb3VuZCwgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm90IGZvdW5kLiAgSWYgUzIgcG9pbnRzIHRvIGEgc3RyaW5nCi0Jd2l0aCB6ZXJvIGxlbmd0aCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgUzEuCi0JCi1CVUdTCi0KLSovCi0KLQotLyogRklYTUU6ICBUaGUgYWJvdmUgZGVzY3JpcHRpb24gaXMgQU5TSSBjb21waWxpYW50LiAgVGhpcyByb3V0aW5lIGhhcyBub3QKLSAgIGJlZW4gdmFsaWRhdGVkIHRvIGNvbXBseSB3aXRoIGl0LiAgLWZuZiAqLwotCi1jaGFyICoKLXN0cnN0ciAoczEsIHMyKQotICBjaGFyICpzMSwgKnMyOwotewotICByZWdpc3RlciBjaGFyICpwID0gczE7Ci0gIGV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci0gIGV4dGVybiBpbnQgc3RybmNtcCAoKTsKLSNpZiBfX0dOVUNfXz09MgotICBleHRlcm4gX19TSVpFX1RZUEVfXyBzdHJsZW4gKCk7Ci0jZW5kaWYKLSAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAoczIpOwotCi0gIGZvciAoOyAocCA9IHN0cmNociAocCwgKnMyKSkgIT0gMDsgcCsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChwLCBzMiwgbGVuKSA9PSAwKQotCXsKLQkgIHJldHVybiAocCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJ0b2QuYyBiL2xpYmliZXJ0eS9zdHJ0b2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2YzczZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RydG9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2Ygc3RydG9kIGZvciBzeXN0ZW1zIHdpdGggYXRvZi4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1leHRlcm4gZG91YmxlIGF0b2YgKCk7Ci0KLS8qIERpc2NsYWltZXI6IHRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCBieSBDSElMTCBpbiBHREIgYW5kIHRoZXJlZm9yZQotICAgaGFzIG5vdCBiZWVuIHRlc3RlZCB3ZWxsLiAgSXQgbWF5IGhhdmUgYmVlbiB0ZXN0ZWQgZm9yIG5vdGhpbmcgZXhjZXB0Ci0gICB0aGF0IGl0IGNvbXBpbGVzLiAgKi8KLQotZG91YmxlCi1zdHJ0b2QgKHN0ciwgcHRyKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGNoYXIgKipwdHI7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKHB0ciA9PSAoY2hhciAqKikwKQotICAgIHJldHVybiBhdG9mIChzdHIpOwotICAKLSAgcCA9IHN0cjsKLSAgCi0gIHdoaWxlIChpc3NwYWNlICgqcCkpCi0gICAgKytwOwotICAKLSAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCi0gICAgKytwOwotCi0gIC8qIElORiBvciBJTkZJTklUWS4gICovCi0gIGlmICgocFswXSA9PSAnaScgfHwgcFswXSA9PSAnSScpCi0gICAgICAmJiAocFsxXSA9PSAnbicgfHwgcFsxXSA9PSAnTicpCi0gICAgICAmJiAocFsyXSA9PSAnZicgfHwgcFsyXSA9PSAnRicpKQotICAgIHsKLSAgICAgIGlmICgocFszXSA9PSAnaScgfHwgcFszXSA9PSAnSScpCi0JICAmJiAocFs0XSA9PSAnbicgfHwgcFs0XSA9PSAnTicpCi0JICAmJiAocFs1XSA9PSAnaScgfHwgcFs1XSA9PSAnSScpCi0JICAmJiAocFs2XSA9PSAndCcgfHwgcFs2XSA9PSAnVCcpCi0JICAmJiAocFs3XSA9PSAneScgfHwgcFs3XSA9PSAnWScpKQotCXsKLQkgICpwdHIgPSBwICsgNzsKLQkgIHJldHVybiBhdG9mIChzdHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcHRyID0gcCArIDM7Ci0JICByZXR1cm4gYXRvZiAoc3RyKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5BTiBvciBOQU4oZm9vKS4gICovCi0gIGlmICgocFswXSA9PSAnbicgfHwgcFswXSA9PSAnTicpCi0gICAgICAmJiAocFsxXSA9PSAnYScgfHwgcFsxXSA9PSAnQScpCi0gICAgICAmJiAocFsyXSA9PSAnbicgfHwgcFsyXSA9PSAnTicpKQotICAgIHsKLSAgICAgIHAgKz0gMzsKLSAgICAgIGlmICgqcCA9PSAnKCcpCi0JewotCSAgKytwOwotCSAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJyknKQotCSAgICArK3A7Ci0JICBpZiAoKnAgPT0gJyknKQotCSAgICArK3A7Ci0JfQotICAgICAgKnB0ciA9IHA7Ci0gICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLSAgICB9Ci0KLSAgLyogZGlnaXRzLCB3aXRoIDAgb3IgMSBwZXJpb2RzIGluIGl0LiAgKi8KLSAgaWYgKGlzZGlnaXQgKCpwKSB8fCAqcCA9PSAnLicpCi0gICAgewotICAgICAgaW50IGdvdF9kb3QgPSAwOwotICAgICAgd2hpbGUgKGlzZGlnaXQgKCpwKSB8fCAoIWdvdF9kb3QgJiYgKnAgPT0gJy4nKSkKLQl7Ci0JICBpZiAoKnAgPT0gJy4nKQotCSAgICBnb3RfZG90ID0gMTsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIC8qIEV4cG9uZW50LiAgKi8KLSAgICAgIGlmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKQotCXsKLQkgIGludCBpOwotCSAgaSA9IDE7Ci0JICBpZiAocFtpXSA9PSAnKycgfHwgcFtpXSA9PSAnLScpCi0JICAgICsraTsKLQkgIGlmIChpc2RpZ2l0IChwW2ldKSkKLQkgICAgewotCSAgICAgIHdoaWxlIChpc2RpZ2l0IChwW2ldKSkKLQkJKytpOwotCSAgICAgICpwdHIgPSBwICsgaTsKLQkgICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLQkgICAgfQotCX0KLSAgICAgICpwdHIgPSBwOwotICAgICAgcmV0dXJuIGF0b2YgKHN0cik7Ci0gICAgfQotICAvKiBEaWRuJ3QgZmluZCBhbnkgZGlnaXRzLiAgRG9lc24ndCBsb29rIGxpa2UgYSBudW1iZXIuICAqLwotICAqcHRyID0gc3RyOwotICByZXR1cm4gMC4wOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvbC5jIGIvbGliaWJlcnR5L3N0cnRvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2QxNzA2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJ0b2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgMAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogRklYTUU6IEl0J2QgYmUgbmljZSB0byBjb25maWd1cmUgYXJvdW5kIHRoZXNlLCBidXQgdGhlIGluY2x1ZGUgZmlsZXMgYXJlIHRvbwotICAgcGFpbmZ1bC4gIFRoZXNlIG1hY3JvcyBzaG91bGQgYXQgbGVhc3QgYmUgbW9yZSBwb3J0YWJsZSB0aGFuIGhhcmR3aXJlZCBoZXgKLSAgIGNvbnN0YW50cy4gKi8KLQotI2lmbmRlZiBVTE9OR19NQVgKLSNkZWZpbmUJVUxPTkdfTUFYCSgodW5zaWduZWQgbG9uZykofjBMKSkJCS8qIDB4RkZGRkZGRkYgKi8KLSNlbmRpZgotCi0jaWZuZGVmIExPTkdfTUFYCi0jZGVmaW5lCUxPTkdfTUFYCSgobG9uZykoVUxPTkdfTUFYID4+IDEpKQkvKiAweDdGRkZGRkZGICovCi0jZW5kaWYKLQotI2lmbmRlZiBMT05HX01JTgotI2RlZmluZQlMT05HX01JTgkoKGxvbmcpKH5MT05HX01BWCkpCQkvKiAweDgwMDAwMDAwICovCi0jZW5kaWYKLQotLyoKLSAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGludGVnZXIuCi0gKgotICogSWdub3JlcyBgbG9jYWxlJyBzdHVmZi4gIEFzc3VtZXMgdGhhdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UKLSAqIGFscGhhYmV0cyBhbmQgZGlnaXRzIGFyZSBlYWNoIGNvbnRpZ3VvdXMuCi0gKi8KLWxvbmcKLXN0cnRvbChucHRyLCBlbmRwdHIsIGJhc2UpCi0JY29uc3QgY2hhciAqbnB0cjsKLQljaGFyICoqZW5kcHRyOwotCXJlZ2lzdGVyIGludCBiYXNlOwotewotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBucHRyOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYWNjOwotCXJlZ2lzdGVyIGludCBjOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY3V0b2ZmOwotCXJlZ2lzdGVyIGludCBuZWcgPSAwLCBhbnksIGN1dGxpbTsKLQotCS8qCi0JICogU2tpcCB3aGl0ZSBzcGFjZSBhbmQgcGljayB1cCBsZWFkaW5nICsvLSBzaWduIGlmIGFueS4KLQkgKiBJZiBiYXNlIGlzIDAsIGFsbG93IDB4IGZvciBoZXggYW5kIDAgZm9yIG9jdGFsLCBlbHNlCi0JICogYXNzdW1lIGRlY2ltYWw7IGlmIGJhc2UgaXMgYWxyZWFkeSAxNiwgYWxsb3cgMHguCi0JICovCi0JZG8gewotCQljID0gKnMrKzsKLQl9IHdoaWxlIChpc3NwYWNlKGMpKTsKLQlpZiAoYyA9PSAnLScpIHsKLQkJbmVnID0gMTsKLQkJYyA9ICpzKys7Ci0JfSBlbHNlIGlmIChjID09ICcrJykKLQkJYyA9ICpzKys7Ci0JaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKLQkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpKSB7Ci0JCWMgPSBzWzFdOwotCQlzICs9IDI7Ci0JCWJhc2UgPSAxNjsKLQl9Ci0JaWYgKGJhc2UgPT0gMCkKLQkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOwotCi0JLyoKLQkgKiBDb21wdXRlIHRoZSBjdXRvZmYgdmFsdWUgYmV0d2VlbiBsZWdhbCBudW1iZXJzIGFuZCBpbGxlZ2FsCi0JICogbnVtYmVycy4gIFRoYXQgaXMgdGhlIGxhcmdlc3QgbGVnYWwgdmFsdWUsIGRpdmlkZWQgYnkgdGhlCi0JICogYmFzZS4gIEFuIGlucHV0IG51bWJlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlLCBpZgotCSAqIGZvbGxvd2VkIGJ5IGEgbGVnYWwgaW5wdXQgY2hhcmFjdGVyLCBpcyB0b28gYmlnLiAgT25lIHRoYXQKLQkgKiBpcyBlcXVhbCB0byB0aGlzIHZhbHVlIG1heSBiZSB2YWxpZCBvciBub3Q7IHRoZSBsaW1pdAotCSAqIGJldHdlZW4gdmFsaWQgYW5kIGludmFsaWQgbnVtYmVycyBpcyB0aGVuIGJhc2VkIG9uIHRoZSBsYXN0Ci0JICogZGlnaXQuICBGb3IgaW5zdGFuY2UsIGlmIHRoZSByYW5nZSBmb3IgbG9uZ3MgaXMKLQkgKiBbLTIxNDc0ODM2NDguLjIxNDc0ODM2NDddIGFuZCB0aGUgaW5wdXQgYmFzZSBpcyAxMCwKLQkgKiBjdXRvZmYgd2lsbCBiZSBzZXQgdG8gMjE0NzQ4MzY0IGFuZCBjdXRsaW0gdG8gZWl0aGVyCi0JICogNyAobmVnPT0wKSBvciA4IChuZWc9PTEpLCBtZWFuaW5nIHRoYXQgaWYgd2UgaGF2ZSBhY2N1bXVsYXRlZAotCSAqIGEgdmFsdWUgPiAyMTQ3NDgzNjQsIG9yIGVxdWFsIGJ1dCB0aGUgbmV4dCBkaWdpdCBpcyA+IDcgKG9yIDgpLAotCSAqIHRoZSBudW1iZXIgaXMgdG9vIGJpZywgYW5kIHdlIHdpbGwgcmV0dXJuIGEgcmFuZ2UgZXJyb3IuCi0JICoKLQkgKiBTZXQgYW55IGlmIGFueSBgZGlnaXRzJyBjb25zdW1lZDsgbWFrZSBpdCBuZWdhdGl2ZSB0byBpbmRpY2F0ZQotCSAqIG92ZXJmbG93LgotCSAqLwotCWN1dG9mZiA9IG5lZyA/IC0odW5zaWduZWQgbG9uZylMT05HX01JTiA6IExPTkdfTUFYOwotCWN1dGxpbSA9IGN1dG9mZiAlICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JY3V0b2ZmIC89ICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JZm9yIChhY2MgPSAwLCBhbnkgPSAwOzsgYyA9ICpzKyspIHsKLQkJaWYgKGlzZGlnaXQoYykpCi0JCQljIC09ICcwJzsKLQkJZWxzZSBpZiAoaXNhbHBoYShjKSkKLQkJCWMgLT0gaXN1cHBlcihjKSA/ICdBJyAtIDEwIDogJ2EnIC0gMTA7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCQlpZiAoYyA+PSBiYXNlKQotCQkJYnJlYWs7Ci0JCWlmIChhbnkgPCAwIHx8IGFjYyA+IGN1dG9mZiB8fCBhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pCi0JCQlhbnkgPSAtMTsKLQkJZWxzZSB7Ci0JCQlhbnkgPSAxOwotCQkJYWNjICo9IGJhc2U7Ci0JCQlhY2MgKz0gYzsKLQkJfQotCX0KLQlpZiAoYW55IDwgMCkgewotCQlhY2MgPSBuZWcgPyBMT05HX01JTiA6IExPTkdfTUFYOwotCQllcnJubyA9IEVSQU5HRTsKLQl9IGVsc2UgaWYgKG5lZykKLQkJYWNjID0gLWFjYzsKLQlpZiAoZW5kcHRyICE9IDApCi0JCSplbmRwdHIgPSAoY2hhciAqKSAoYW55ID8gcyAtIDEgOiBucHRyKTsKLQlyZXR1cm4gKGFjYyk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RydG91bC5jIGIvbGliaWJlcnR5L3N0cnRvdWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2ZjJkNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RydG91bC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgMAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2lmbmRlZiBVTE9OR19NQVgKLSNkZWZpbmUJVUxPTkdfTUFYCSgodW5zaWduZWQgbG9uZykofjBMKSkJCS8qIDB4RkZGRkZGRkYgKi8KLSNlbmRpZgotCi0vKgotICogQ29udmVydCBhIHN0cmluZyB0byBhbiB1bnNpZ25lZCBsb25nIGludGVnZXIuCi0gKgotICogSWdub3JlcyBgbG9jYWxlJyBzdHVmZi4gIEFzc3VtZXMgdGhhdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UKLSAqIGFscGhhYmV0cyBhbmQgZGlnaXRzIGFyZSBlYWNoIGNvbnRpZ3VvdXMuCi0gKi8KLXVuc2lnbmVkIGxvbmcKLXN0cnRvdWwobnB0ciwgZW5kcHRyLCBiYXNlKQotCWNvbnN0IGNoYXIgKm5wdHI7Ci0JY2hhciAqKmVuZHB0cjsKLQlyZWdpc3RlciBpbnQgYmFzZTsKLXsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpzID0gbnB0cjsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGFjYzsKLQlyZWdpc3RlciBpbnQgYzsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGN1dG9mZjsKLQlyZWdpc3RlciBpbnQgbmVnID0gMCwgYW55LCBjdXRsaW07Ci0KLQkvKgotCSAqIFNlZSBzdHJ0b2wgZm9yIGNvbW1lbnRzIGFzIHRvIHRoZSBsb2dpYyB1c2VkLgotCSAqLwotCWRvIHsKLQkJYyA9ICpzKys7Ci0JfSB3aGlsZSAoaXNzcGFjZShjKSk7Ci0JaWYgKGMgPT0gJy0nKSB7Ci0JCW5lZyA9IDE7Ci0JCWMgPSAqcysrOwotCX0gZWxzZSBpZiAoYyA9PSAnKycpCi0JCWMgPSAqcysrOwotCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCi0JICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSkgewotCQljID0gc1sxXTsKLQkJcyArPSAyOwotCQliYXNlID0gMTY7Ci0JfQotCWlmIChiYXNlID09IDApCi0JCWJhc2UgPSBjID09ICcwJyA/IDggOiAxMDsKLQljdXRvZmYgPSAodW5zaWduZWQgbG9uZylVTE9OR19NQVggLyAodW5zaWduZWQgbG9uZyliYXNlOwotCWN1dGxpbSA9ICh1bnNpZ25lZCBsb25nKVVMT05HX01BWCAlICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JZm9yIChhY2MgPSAwLCBhbnkgPSAwOzsgYyA9ICpzKyspIHsKLQkJaWYgKGlzZGlnaXQoYykpCi0JCQljIC09ICcwJzsKLQkJZWxzZSBpZiAoaXNhbHBoYShjKSkKLQkJCWMgLT0gaXN1cHBlcihjKSA/ICdBJyAtIDEwIDogJ2EnIC0gMTA7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCQlpZiAoYyA+PSBiYXNlKQotCQkJYnJlYWs7Ci0JCWlmIChhbnkgPCAwIHx8IGFjYyA+IGN1dG9mZiB8fCBhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pCi0JCQlhbnkgPSAtMTsKLQkJZWxzZSB7Ci0JCQlhbnkgPSAxOwotCQkJYWNjICo9IGJhc2U7Ci0JCQlhY2MgKz0gYzsKLQkJfQotCX0KLQlpZiAoYW55IDwgMCkgewotCQlhY2MgPSBVTE9OR19NQVg7Ci0JCWVycm5vID0gRVJBTkdFOwotCX0gZWxzZSBpZiAobmVnKQotCQlhY2MgPSAtYWNjOwotCWlmIChlbmRwdHIgIT0gMCkKLQkJKmVuZHB0ciA9IChjaGFyICopIChhbnkgPyBzIC0gMSA6IG5wdHIpOwotCXJldHVybiAoYWNjKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS90bXBuYW0uYyBiL2xpYmliZXJ0eS90bXBuYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2MTQ2Ny4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdG1wbmFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmbmRlZiBMX3RtcG5hbQotI2RlZmluZSBMX3RtcG5hbWUgMTAwCi0jZW5kaWYKLSNpZm5kZWYgUF90bXBkaXIKLSNkZWZpbmUgUF90bXBkaXIgIi91c3IvdG1wIgotI2VuZGlmCi0KLXN0YXRpYyBjaGFyIHRtcG5hbV9idWZmZXJbTF90bXBuYW1dOwotc3RhdGljIGludCB0bXBuYW1fY291bnRlcjsKLQotZXh0ZXJuIGludCBnZXRwaWQgKCk7Ci0KLWNoYXIgKgotdG1wbmFtIChzKQotICAgICBjaGFyICpzOwotewotICBpbnQgcGlkID0gZ2V0cGlkICgpOwotCi0gIGlmIChzID09IE5VTEwpCi0gICAgcyA9IHRtcG5hbV9idWZmZXI7Ci0KLSAgLyogIEdlbmVyYXRlIHRoZSBmaWxlbmFtZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3Qgb25lIGNhbGxlZAotICAgICAgaXQgYWxyZWFkeS4gICovCi0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgRklMRSAqZjsKLSAgICAgIHNwcmludGYgKHMsICIlcy8lcyV4LiV4IiwgUF90bXBkaXIsICJ0IiwgcGlkLCB0bXBuYW1fY291bnRlcik7Ci0gICAgICBmID0gZm9wZW4gKHMsICJyIik7Ci0gICAgICBpZiAoZiA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgdG1wbmFtX2NvdW50ZXIrKzsKLSAgICAgIGZjbG9zZSAoZik7Ci0gICAgfQotCi0gIHJldHVybiBzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Zhc3ByaW50Zi5jIGIvbGliaWJlcnR5L3Zhc3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWI4MGU2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92YXNwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKiBMaWtlIHZzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBURVNUCi1pbnQgZ2xvYmFsX3RvdGFsX3dpZHRoOwotI2VuZGlmCi0KLXVuc2lnbmVkIGxvbmcgc3RydG91bCAoKTsKLWNoYXIgKm1hbGxvYyAoKTsKLQotc3RhdGljIGludAotaW50X3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsIGFyZ3MpCi0gICAgIGNoYXIgKipyZXN1bHQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCAqYXJnczsKLXsKLSAgY29uc3QgY2hhciAqcCA9IGZvcm1hdDsKLSAgLyogQWRkIG9uZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBuZXZlciB6ZXJvLCB3aGljaCBtaWdodCBjYXVzZSBtYWxsb2MKLSAgICAgdG8gcmV0dXJuIE5VTEwuICAqLwotICBpbnQgdG90YWxfd2lkdGggPSBzdHJsZW4gKGZvcm1hdCkgKyAxOwotICB2YV9saXN0IGFwOwotCi0gIG1lbWNweSAoKFBUUikgJmFwLCAoUFRSKSBhcmdzLCBzaXplb2YgKHZhX2xpc3QpKTsKLQotICB3aGlsZSAoKnAgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoKnArKyA9PSAnJScpCi0JewotCSAgd2hpbGUgKHN0cmNociAoIi0rICMwIiwgKnApKQotCSAgICArK3A7Ci0JICBpZiAoKnAgPT0gJyonKQotCSAgICB7Ci0JICAgICAgKytwOwotCSAgICAgIHRvdGFsX3dpZHRoICs9IGFicyAodmFfYXJnIChhcCwgaW50KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgdG90YWxfd2lkdGggKz0gc3RydG91bCAocCwgJnAsIDEwKTsKLQkgIGlmICgqcCA9PSAnLicpCi0JICAgIHsKLQkgICAgICArK3A7Ci0JICAgICAgaWYgKCpwID09ICcqJykKLQkJewotCQkgICsrcDsKLQkJICB0b3RhbF93aWR0aCArPSBhYnMgKHZhX2FyZyAoYXAsIGludCkpOwotCQl9Ci0JICAgICAgZWxzZQotCSAgICAgIHRvdGFsX3dpZHRoICs9IHN0cnRvdWwgKHAsICZwLCAxMCk7Ci0JICAgIH0KLQkgIHdoaWxlIChzdHJjaHIgKCJobEwiLCAqcCkpCi0JICAgICsrcDsKLQkgIC8qIFNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciBhbnkgZm9ybWF0IHNwZWNpZmllciBleGNlcHQgJXMgYW5kIGZsb2F0cy4gICovCi0JICB0b3RhbF93aWR0aCArPSAzMDsKLQkgIHN3aXRjaCAoKnApCi0JICAgIHsKLQkgICAgY2FzZSAnZCc6Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdvJzoKLQkgICAgY2FzZSAndSc6Ci0JICAgIGNhc2UgJ3gnOgotCSAgICBjYXNlICdYJzoKLQkgICAgY2FzZSAnYyc6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGludCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICdlJzoKLQkgICAgY2FzZSAnRSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdHJzoKLQkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgZG91YmxlKTsKLQkgICAgICAvKiBTaW5jZSBhbiBpZWVlIGRvdWJsZSBjYW4gaGF2ZSBhbiBleHBvbmVudCBvZiAzMDcsIHdlJ2xsCi0JCSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gY292ZXIgdGhlIGdyb3NzIGNhc2UuICovCi0JICAgICAgdG90YWxfd2lkdGggKz0gMzA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdzJzoKLQkgICAgICB0b3RhbF93aWR0aCArPSBzdHJsZW4gKHZhX2FyZyAoYXAsIGNoYXIgKikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdwJzoKLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGNoYXIgKik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2lmZGVmIFRFU1QKLSAgZ2xvYmFsX3RvdGFsX3dpZHRoID0gdG90YWxfd2lkdGg7Ci0jZW5kaWYKLSAgKnJlc3VsdCA9IG1hbGxvYyAodG90YWxfd2lkdGgpOwotICBpZiAoKnJlc3VsdCAhPSBOVUxMKQotICAgIHJldHVybiB2c3ByaW50ZiAoKnJlc3VsdCwgZm9ybWF0LCAqYXJncyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci12YXNwcmludGYgKHJlc3VsdCwgZm9ybWF0LCBhcmdzKQotICAgICBjaGFyICoqcmVzdWx0OwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0jaWYgZGVmaW5lZCAoX0JTRF9WQV9MSVNUXykgJiYgZGVmaW5lZCAoX19GcmVlQlNEX18pCi0gICAgIF9CU0RfVkFfTElTVF8gYXJnczsKLSNlbHNlCi0gICAgIHZhX2xpc3QgYXJnczsKLSNlbmRpZgotewotICByZXR1cm4gaW50X3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsICZhcmdzKTsKLX0KLQotI2lmZGVmIFRFU1QKLXZvaWQKLWNoZWNraXQKLSNpZmRlZiBfX1NURENfXwotICAgICAoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pCi0jZWxzZQotICAgICAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciAqcmVzdWx0OwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0jZWxzZQotICBjaGFyICpmb3JtYXQ7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotI2VuZGlmCi0gIHZhc3ByaW50ZiAoJnJlc3VsdCwgZm9ybWF0LCBhcmdzKTsKLSAgaWYgKHN0cmxlbiAocmVzdWx0KSA8IGdsb2JhbF90b3RhbF93aWR0aCkKLSAgICBwcmludGYgKCJQQVNTOiAiKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIkZBSUw6ICIpOwotICBwcmludGYgKCIlZCAlc1xuIiwgZ2xvYmFsX3RvdGFsX3dpZHRoLCByZXN1bHQpOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgY2hlY2tpdCAoIiVkIiwgMHgxMjM0NTY3OCk7Ci0gIGNoZWNraXQgKCIlMjAwZCIsIDUpOwotICBjaGVja2l0ICgiJS4zMDBkIiwgNik7Ci0gIGNoZWNraXQgKCIlMTAwLjE1MGQiLCA3KTsKLSAgY2hlY2tpdCAoIiVzIiwgImpqampqampqamlpaWlpaWlpaWlpaWlpaW9vb29vb29vb29vb29vb29vcHBwcHBwcHBwcHBwYWFcblwKLTc3Nzc3Nzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzM2NjY2NjY2NjY2NjYyMjIyMjIyMjIyMjc3Nzc3Nzc3Nzc3NzczMzMzMyIpOwotICBjaGVja2l0ICgiJWYlcyVkJXMiLCAxLjAsICJmb28iLCA3NywgImFzZGpmZmZmZmZmZmZmZmZmZmlpaWlpaWlpaWlpeHh4eHgiKTsKLX0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmZvcmsuYyBiL2xpYmliZXJ0eS92Zm9yay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmM0NTkxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92Zm9yay5jCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBFbXVsYXRlIHZmb3JrIHVzaW5nIGp1c3QgcGxhaW4gZm9yaywgZm9yIHN5c3RlbXMgd2l0aG91dCBhIHJlYWwgdmZvcmsuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi1pbnQKLXZmb3JrICgpCi17Ci0gIHJldHVybiAoZm9yayAoKSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmZwcmludGYuYyBiL2xpYmliZXJ0eS92ZnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdiMmZmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92ZnByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogUHJvdmlkZSBhIHZlcnNpb24gdmZwcmludGYgaW4gdGVybXMgb2YgX2RvcHJudC4KLSAgIEJ5IEthdmVoIEdoYXppICAoZ2hhemlAY2FpcC5ydXRnZXJzLmVkdSkgIDMvMjkvOTgKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSN1bmRlZiB2ZnByaW50ZgotCi1pbnQKLXZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXApCi0gIEZJTEUgKiBzdHJlYW07Ci0gIGNvbnN0IGNoYXIgKiBmb3JtYXQ7Ci0gIHZhX2xpc3QgYXA7Ci17Ci0gIHJldHVybiBfZG9wcm50IChmb3JtYXQsIGFwLCBzdHJlYW0pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbSBiL2xpYmliZXJ0eS92bXNidWlsZC5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZWRlMzguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0kISBsaWJpYmVydHkvdm1zYnVpbGQuY29tIC0tIGJ1aWxkIGxpYmVydHkub2xiIGZvciBWTVMgaG9zdCwgVk1TIHRhcmdldAotJCEKLSQgQ0MJPSAiZ2NjIC9ub1ZlcmJvc2UvRGVidWcvSW5jbD0oW10sWy0uaW5jbHVkZV0pIgotJCBMSUJSCT0gImxpYnJhcnkgL09iaiIKLSQgTElOSwk9ICJsaW5rIgotJCBERUxFVEU9ICJkZWxldGUgL25vQ29uZmlybSIKLSQgU0VBUkNIPSAic2VhcmNoIC9FeGFjdCIKLSQgRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgotJCBBQk9SVAk9ICJleGl0ICV4MDAyQyIKLSQhCi0kIExJQl9OQU1FID0gImxpYmVydHkub2xiIgkhdGhpcyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIGNvbnN0cnVjdAotJCBXT1JLX0xJQiA9ICJuZXctbGliLm9sYiIJIXVzZWQgdG8gZ3VhcmQgYWdhaW5zdCBhbiBpbmNvbXBsZXRlIGJ1aWxkCi0kCi0kISBtYW51YWxseSBjb3BpZWQgZnJvbSBNYWtlZmlsZS5pbgotJCBSRVFVSVJFRF9PRklMRVMgPSAiYXJndi5vIGJhc2VuYW1lLm8gY2hvb3NlLXRlbXAubyBjb25jYXQubyBjcGx1cy1kZW0ubyAiLQotCSsgImZkbWF0Y2gubyBmbm1hdGNoLm8gZ2V0b3B0Lm8gZ2V0b3B0MS5vIGdldHJ1bnRpbWUubyBoZXgubyAiLQotCSsgImZsb2F0Zm9ybWF0Lm8gb2JqYWxsb2MubyBvYnN0YWNrLm8gc3BhY2VzLm8gc3RyZXJyb3IubyBzdHJzaWduYWwubyAiLQotCSsgInhhdGV4aXQubyB4ZXhpdC5vIHhtYWxsb2MubyB4c3RyZHVwLm8geHN0cmVycm9yLm8iCi0kISBhbnl0aGluZyBub3QgY2F1Z2h0IGJ5IGxpbmsrc2VhcmNoIG9mIGR1bW15Liogc2hvdWxkIGJlIGFkZGVkIGhlcmUKLSQgRVhUUkFfT0ZJTEVTID0gIiIKLSQhCi0kISBtb3ZlIHRvIHRoZSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhpcyBjb21tYW5kIHByb2NlZHVyZQotJCBvbGRfZGlyID0gZiRlbnZpcm9uKCJERUZBVUxUIikKLSQgbmV3X2RpciA9IGYkcGFyc2UoIl8uXzsiLGYkZW52aXJvbigiUFJPQ0VEVVJFIikpIC0gIl8uXzsiCi0kIHNldCBkZWZhdWx0ICduZXdfZGlyJwotJAotJCBFQ0hPICJTdGFydGluZyBsaWJpYmVydHkgYnVpbGQuLi4iCi0kIGNyZWF0ZSBjb25maWcuaAotLyogbGliaWJlcnR5IGNvbmZpZy5oIGZvciBWTVMgKi8KLSNkZWZpbmUgTkVFRF9zeXNfc2lnbGlzdAotI2RlZmluZSBORUVEX3N0cnNpZ25hbAotI2RlZmluZSBORUVEX3BzaWduYWwKLSNkZWZpbmUgTkVFRF9iYXNlbmFtZQotJCBMSUJSICdXT1JLX0xJQicgL0NyZWF0ZQotJAotJCEgZmlyc3QgcGFzczogY29tcGlsZSAicmVxdWlyZWQiIG1vZHVsZXMKLSQgb2ZpbGVzID0gUkVRVUlSRURfT0ZJTEVTICsgIiAiICsgRVhUUkFfT0ZJTEVTCi0kIHBhc3MgPSAxCi0kIGdvc3ViIGRvX29maWxlcwotJAotJCEgc2Vjb25kIHBhc3M6IHByb2Nlc3MgZHVtbXkuYywgdXNpbmcgdGhlIGZpcnN0IHBhc3MnIHJlc3VsdHMKLSQgRUNITyAiIG5vdyBjaGVja2luZyBydW4tdGltZSBsaWJyYXJ5IGZvciBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkiCi0kIGlmIGYkc2VhcmNoKCJkdW1teS5vYmoiKS5uZXMuIiIgdGhlbiAgREVMRVRFIGR1bW15Lm9iajsqCi0kIGRlZmluZS9ub0xvZyBzeXMkZXJyb3IgX05MOgkhY2FuJ3QgdXNlIC9Vc2VyX01vZGUgaGVyZSBkdWUgdG8gZ2NjCi0kIGRlZmluZS9ub0xvZyBzeXMkb3V0cHV0IF9OTDoJISBkcml2ZXIncyB1c2Ugb2YgbXVsdGlwbGUgaW1hZ2UgYWN0aXZhdGlvbgotJCBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCi0kICdDQycgZHVtbXkuYwotJCBkZWFzc2lnbiBzeXMkZXJyb3IgICAhcmVzdG9yZSwgbW9yZSBvciBsZXNzCi0kIGRlYXNzaWduIHN5cyRvdXRwdXQKLSQgaWYgZiRzZWFyY2goImR1bW15Lm9iaiIpLmVxcy4iIiB0aGVuICBnb3RvIHBhc3MyX2ZhaWx1cmUxCi0kISBsaW5rIGR1bW15Lm9iaiwgY2FwdHVyaW5nIGZ1bGwgbGlua2VyIGZlZWRiYWNrIGluIGR1bW15Lm1hcAotJCBvbGRtc2cgPSBmJGVudmlyb24oIk1FU1NBR0UiKQotJCBzZXQgbWVzc2FnZSAvRmFjaWxpdHkvU2V2ZXJpdHkvSWRlbnRpZmljYXRpb24vVGV4dAotJCBkZWZpbmUvVXNlciBzeXMkb3V0cHV0IF9OTDoKLSQgZGVmaW5lL1VzZXIgc3lzJGVycm9yIF9OTDoKLSQgTElOSy9NYXA9ZHVtbXkubWFwL25vRXhlIGR1bW15Lm9iaiwnV09SS19MSUInL0xpYnIsLQotCWdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvTGlicixzeXMkbGlicmFyeTp2YXhjcnRsLm9sYi9MaWJyCi0kIHNldCBtZXNzYWdlICdvbGRtc2cnCi0kIGlmIGYkc2VhcmNoKCJkdW1teS5tYXAiKS5lcXMuIiIgdGhlbiAgZ290byBwYXNzMl9mYWlsdXJlMgotJCBERUxFVEUgZHVtbXkub2JqOyoKLSQgU0VBUkNIIGR1bW15Lm1hcCAiJUxJTkstSS1VREZTWU0iIC9PdXRwdXQ9ZHVtbXkubGlzdAotJCBERUxFVEUgZHVtbXkubWFwOyoKLSQgRUNITyAiIGNoZWNrIGNvbXBsZXRlZCIKLSQhIHdlIG5vdyBoYXZlIGEgZmlsZSB3aXRoIG9uZSBlbnRyeSBwZXIgbGluZSBvZiB1bnJlc29sdmFibGUgc3ltYm9scwotJCBvZmlsZXMgPSAiIgotJCBpZiBmJHRybmxubSgiSUZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGlmaWxlJAotJAlvcGVuL1JlYWQgaWZpbGUkIGR1bW15Lmxpc3QKLSRpbG9vcDogcmVhZC9FbmQ9aWRvbmUgaWZpbGUkIGlsaW5lCi0kCWlsaW5lID0gZiRlZGl0KGlsaW5lLCJDT01QUkVTUyxUUklNLExPV0VSQ0FTRSIpCi0kCW9maWxlcyA9IG9maWxlcyArICIgIiArIGYkZWxlbWVudCgxLCIgIixpbGluZSkgKyAiLm8iCi0kCWdvdG8gaWxvb3AKLSRpZG9uZTogY2xvc2UgaWZpbGUkCi0kIERFTEVURSBkdW1teS5saXN0OyoKLSQgb24gZXJyb3IgdGhlbiBBQk9SVAotJAotJCEgdGhpcmQgcGFzczogY29tcGlsZSAibWlzc2luZyIgbW9kdWxlcyBjb2xsZWN0ZWQgaW4gcGFzcyAyCi0kIHBhc3MgPSAzCi0kIGdvc3ViIGRvX29maWxlcwotJAotJCEgZmluaXNoIHVwCi0kIExJQlIgJ1dPUktfTElCJyAvQ29tcHJlc3MgL091dHB1dD0nTElCX05BTUUnCSFuZXctbGliLm9sYiAtPiBsaWJlcnR5Lm9sYgotJCBERUxFVEUgJ1dPUktfTElCJzsqCi0kCi0kISBhbGwgZG9uZQotJCBFQ0hPICJDb21wbGV0ZWQgbGliaWJlcnR5IGJ1aWxkLiIKLSQgdHlwZSBzeXMkaW5wdXQ6Ci0KLSAgWW91IG1hbnkgd2lzaCB0byBkbwotICAkIENPUFkgTElCRVJUWS5PTEIgR05VX0NDOlswMDAwMDBdCi0gIHNvIHRoYXQgdGhpcyBydW4tdGltZSBsaWJyYXJ5IHJlc2lkZXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgZ2NjJ3MKLSAgc3VwcG9ydCBsaWJyYXJ5LiAgV2hlbiBidWlsZGluZyBnYXMsIGJlIHN1cmUgdG8gbGVhdmUgdGhlIG9yaWdpbmFsCi0gIGNvcHkgb2YgbGliZXJ0eS5vbGIgaGVyZSBzbyB0aGF0IGdhcydzIGJ1aWxkIHByb2NlZHVyZSBjYW4gZmluZCBpdC4KLQotJCBzZXQgZGVmYXVsdCAnb2xkX2RpcicKLSQgZXhpdAotJAotJCEKLSQhIGNvbXBpbGUgZWFjaCBlbGVtZW50IG9mIHRoZSBzcGFjZS1kZWxpbWl0ZWQgbGlzdCAnb2ZpbGVzJwotJCEKLSRkb19vZmlsZXM6Ci0kIG9maWxlcyA9IGYkZWRpdChvZmlsZXMsIkNPTVBSRVNTLFRSSU0iKQotJCBpID0gMAotJG9sb29wOgotJCBmID0gZiRlbGVtZW50KGksIiAiLG9maWxlcykKLSQgaWYgZi5lcXMuIiAiIHRoZW4gIGdvdG8gb2RvbmUKLSQgZiA9IGYgLSAiLm8iCSFzdHJpcCBkdW1teSBzdWZmaXgKLSQgRUNITyAiICAnJ2YnIgotJCBza2lwX2YgPSAwCi0kIGlmIHBhc3MuZXEuMyAuYW5kLiBmJHNlYXJjaCgiJydmJy5jIikuZXFzLiIiIHRoZW4gIGdvc3ViIGNoa19kZWZmdW5jCi0kIGlmIC5ub3Quc2tpcF9mCi0kIHRoZW4KLSQgICAnQ0MnICdmJy5jCi0kICAgTElCUiAnV09SS19MSUInICdmJy5vYmogL0luc2VydAotJCAgIERFTEVURSAnZicub2JqOyoKLSQgZW5kaWYKLSQgaSA9IGkgKyAxCi0kIGdvdG8gb2xvb3AKLSRvZG9uZToKLSQgcmV0dXJuCi0kCi0kIQotJCEgY2hlY2sgZnVuY3Rpb25zLmRlZiBmb3IgYSBERUZGVU5DKCkgZW50cnkgY29ycmVzcG9uZGluZyB0byBtaXNzaW5nIGZpbGUgJ2YnLmMKLSQhCi0kY2hrX2RlZmZ1bmM6Ci0kIGRlZmluZS9Vc2VyIHN5cyRvdXRwdXQgX05MOgotJCBkZWZpbmUvVXNlciBzeXMkZXJyb3IgX05MOgotJCBTRUFSQ0ggZnVuY3Rpb25zLmRlZiAiREVGRlVOQyIsIicnZiciIC9NYXRjaD1BTkQKLSQgaWYgKCgkc3RhdHVzLmFuZC4leDdGRkZGRkZGKSAuZXEuIDEpCi0kIHRoZW4KLSQgICBza2lwX2YgPSAxCi0kICAgb3Blbi9BcHBlbmQgY29uZmlnX2ggY29uZmlnLmgKLSQgICB3cml0ZSBjb25maWdfaCAiI2RlZmluZSBORUVEXycnZiciCi0kICAgY2xvc2UgY29uZmlnX2gKLSQgZW5kaWYKLSQgcmV0dXJuCi0kCi0kIQotJHBhc3MyX2ZhaWx1cmUxOgotJCEgaWYgd2UgcmVhY2ggaGVyZSwgZHVtbXkuYyBmYWlsZWQgdG8gY29tcGlsZSBhbmQgd2UncmUgcmVhbGx5IHN0dWNrCi0kIHR5cGUgc3lzJGlucHV0OgotCi0gIENhbm5vdCBjb21waWxlIHRoZSBsaWJyYXJ5IGNvbnRlbnRzIGNoZWNrZXIgKGR1bW15LmMgKyBmdW5jdGlvbnMuZGVmKSwKLSAgc28gY2Fubm90IGNvbnRpbnVlIQotCi0kISBhdHRlbXB0IHRoZSBjb21waWxlIGFnYWluLCB3aXRob3V0IHN1cHByZXNzaW5nIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhpcyB0aW1lCi0kIG9uIGVycm9yIHRoZW4gQUJPUlQgKzAqZiR2ZXJpZnkodikKLSQgdiA9IGYkdmVyaWZ5KDEpCi0kICdDQycgZHVtbXkuYwotJCBBQk9SVCArMCpmJHZlcmlmeSh2KQkhJ2YkdmVyaWZ5KDApJwotJCEKLSRwYXNzMl9mYWlsdXJlMjoKLSQhIHNob3VsZCBuZXZlciByZWFjaCBoZXJlLi4KLSQgdHlwZSBzeXMkaW5wdXQ6Ci0KLSAgQ2Fubm90IGxpbmsgdGhlIGxpYnJhcnkgY29udGVudHMgY2hlY2tlciAoZHVtbXkub2JqKSwgc28gY2Fubm90IGNvbnRpbnVlIQotCi0kISBhdHRlbXB0IHRoZSBsaW5rIGFnYWluLCB3aXRob3V0IHN1cHByZXNzaW5nIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhpcyB0aW1lCi0kIG9uIGVycm9yIHRoZW4gQUJPUlQgKzAqZiR2ZXJpZnkodikKLSQgdiA9IGYkdmVyaWZ5KDEpCi0kIExJTksvTWFwPWR1bW15Lm1hcC9ub0V4ZSBkdW1teS5vYmosJ1dPUktfTElCJy9MaWJyLC0KLQlnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL0xpYnIsc3lzJGxpYnJhcnk6dmF4Y3J0bC5vbGIvTGlicgotJCBBQk9SVCArMCpmJHZlcmlmeSh2KQkhJ2YkdmVyaWZ5KDApJwotJAotJCEgbm90IHJlYWNoZWQKLSQgZXhpdApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3ZwcmludGYuYyBiL2xpYmliZXJ0eS92cHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjQyNWEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3ZwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jdW5kZWYgdnByaW50ZgotaW50Ci12cHJpbnRmIChmb3JtYXQsIGFwKQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2xpc3QgYXA7Ci17Ci0gIHJldHVybiB2ZnByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFwKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92c3ByaW50Zi5jIGIvbGliaWJlcnR5L3ZzcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDc2MGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3ZzcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdnNwcmludGYgZm9yIHN5c3RlbXMgd2l0aG91dCBpdC4KLSAgIEhpZ2hseSBzeXN0ZW0tZGVwZW5kZW50LCBidXQgc2hvdWxkIHdvcmsgb24gbW9zdCAidHJhZGl0aW9uYWwiCi0gICBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RkaW87IG5ld2VyIG9uZXMgc2hvdWxkIGFscmVhZHkgaGF2ZSB2c3ByaW50Zi4KLSAgIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgb2YgQ3lnbnVzIFN1cHBvcnQuCi0gICBCYXNlZCBvbiBsaWJnKysncyAiZm9ybSIgKHdyaXR0ZW4gYnkgRG91ZyBMZWE7IGRsQHJvY2t5Lm9zd2Vnby5lZHUpLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQotc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCi1jb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQotdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gKi8KLQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jdW5kZWYgdnNwcmludGYKLQotaW50Ci12c3ByaW50ZiAoYnVmLCBmb3JtYXQsIGFwKQotICAgICBjaGFyICpidWY7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCBhcDsKLXsKLSAgRklMRSBiOwotICBpbnQgcmV0OwotI2lmZGVmIFZNUwotICBiLT5fZmxhZyA9IF9JT1dSVHxfSU9TVFJHOwotICBiLT5fcHRyID0gYnVmOwotICBiLT5fY250ID0gMTIwMDA7Ci0jZWxzZQotICBiLl9mbGFnID0gX0lPV1JUfF9JT1NUUkc7Ci0gIGIuX3B0ciA9IGJ1ZjsKLSAgYi5fY250ID0gMTIwMDA7Ci0jZW5kaWYKLSAgcmV0ID0gX2RvcHJudChmb3JtYXQsIGFwLCAmYik7Ci0gIHB1dGMoJ1wwJywgJmIpOwotICByZXR1cm4gcmV0OwotCi19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvd2FpdHBpZC5jIGIvbGliaWJlcnR5L3dhaXRwaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkYjBiOS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvd2FpdHBpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotaW50Ci13YWl0cGlkIChwaWQsIHN0YXRfbG9jLCBvcHRpb25zKQotCWludCBwaWQsICpzdGF0X2xvYywgb3B0aW9uczsKLXsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpbnQgd3BpZCA9IHdhaXQoc3RhdF9sb2MpOwotICAgICAgaWYgKHdwaWQgPT0gcGlkIHx8IHdwaWQgPT0gLTEpCi0JcmV0dXJuIHdwaWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hhdGV4aXQuYyBiL2xpYmliZXJ0eS94YXRleGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDc2YzIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hhdGV4aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiAlc2Njcy5pbmNsdWRlLnJlZGlzdC5jJQotICovCi0KLS8qIEFkYXB0ZWQgZnJvbSBuZXdsaWIvbGliYy9zdGRsaWIveyxhdH1leGl0LltjaF0uCi0gICBJZiB5b3UgdXNlIHhhdGV4aXQsIHlvdSBtdXN0IGNhbGwgeGV4aXQgaW5zdGVhZCBvZiBleGl0LiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGlzIG11c3QgYmUgZGVjbGFyZWQuICAqLwotUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotc3RhdGljIHZvaWQgeGF0ZXhpdF9jbGVhbnVwIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUG9pbnRlciB0byBmdW5jdGlvbiBydW4gYnkgeGV4aXQuICAqLwotZXh0ZXJuIHZvaWQgKCpfeGV4aXRfY2xlYW51cCkgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lCVhBVEVYSVRfU0laRSAzMgotCi1zdHJ1Y3QgeGF0ZXhpdCB7Ci0Jc3RydWN0CXhhdGV4aXQgKm5leHQ7CQkvKiBuZXh0IGluIGxpc3QgKi8KLQlpbnQJaW5kOwkJCS8qIG5leHQgaW5kZXggaW4gdGhpcyB0YWJsZSAqLwotCXZvaWQJKCpmbnNbWEFURVhJVF9TSVpFXSkgUEFSQU1TICgodm9pZCkpOwkvKiB0aGUgdGFibGUgaXRzZWxmICovCi19OwotCi0vKiBBbGxvY2F0ZSBvbmUgc3RydWN0IHN0YXRpY2FsbHkgdG8gZ3VhcmFudGVlIHRoYXQgd2UgY2FuIHJlZ2lzdGVyCi0gICBhdCBsZWFzdCBhIGZldyBoYW5kbGVycy4gICovCi1zdGF0aWMgc3RydWN0IHhhdGV4aXQgeGF0ZXhpdF9maXJzdDsKLQotLyogUG9pbnRzIHRvIGhlYWQgb2YgTElGTyBzdGFjay4gICovCi1zdGF0aWMgc3RydWN0IHhhdGV4aXQgKnhhdGV4aXRfaGVhZCA9ICZ4YXRleGl0X2ZpcnN0OwotCi0vKiBSZWdpc3RlciBmdW5jdGlvbiBGTiB0byBiZSBydW4gYnkgeGV4aXQuCi0gICBSZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QuICAqLwotCi1pbnQKLXhhdGV4aXQgKGZuKQotICAgICB2b2lkICgqZm4pIFBBUkFNUyAoKHZvaWQpKTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHhhdGV4aXQgKnA7Ci0KLSAgLyogVGVsbCB4ZXhpdCB0byBjYWxsIHhhdGV4aXRfY2xlYW51cC4gICovCi0gIGlmICghX3hleGl0X2NsZWFudXApCi0gICAgX3hleGl0X2NsZWFudXAgPSB4YXRleGl0X2NsZWFudXA7Ci0KLSAgcCA9IHhhdGV4aXRfaGVhZDsKLSAgaWYgKHAtPmluZCA+PSBYQVRFWElUX1NJWkUpCi0gICAgewotICAgICAgaWYgKChwID0gKHN0cnVjdCB4YXRleGl0ICopIG1hbGxvYyAoc2l6ZW9mICpwKSkgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgICBwLT5pbmQgPSAwOwotICAgICAgcC0+bmV4dCA9IHhhdGV4aXRfaGVhZDsKLSAgICAgIHhhdGV4aXRfaGVhZCA9IHA7Ci0gICAgfQotICBwLT5mbnNbcC0+aW5kKytdID0gZm47Ci0gIHJldHVybiAwOwotfQotCi0vKiBDYWxsIGFueSBjbGVhbnVwIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi14YXRleGl0X2NsZWFudXAgKCkKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHhhdGV4aXQgKnA7Ci0gIHJlZ2lzdGVyIGludCBuOwotCi0gIGZvciAocCA9IHhhdGV4aXRfaGVhZDsgcDsgcCA9IHAtPm5leHQpCi0gICAgZm9yIChuID0gcC0+aW5kOyAtLW4gPj0gMDspCi0gICAgICAoKnAtPmZuc1tuXSkgKCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveGV4aXQuYyBiL2xpYmliZXJ0eS94ZXhpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFiYmUwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94ZXhpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogeGV4aXQuYyAtLSBSdW4gYW55IGV4aXQgaGFuZGxlcnMsIHRoZW4gZXhpdC4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZQotdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IGJ5IHhhdGV4aXQgaWYgaXQgaXMgY2FsbGVkLiAgVGhpcyB3YXksIHhtYWxsb2MKLSAgIGRvZXNuJ3QgZHJhZyB4YXRleGl0IGludG8gdGhlIGxpbmsuICAqLwotdm9pZCAoKl94ZXhpdF9jbGVhbnVwKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLXhleGl0IChjb2RlKQotICAgICBpbnQgY29kZTsKLXsKLSAgaWYgKF94ZXhpdF9jbGVhbnVwICE9IE5VTEwpCi0gICAgKCpfeGV4aXRfY2xlYW51cCkgKCk7Ci0gIGV4aXQgKGNvZGUpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3htYWxsb2MuYyBiL2xpYmliZXJ0eS94bWFsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODM3OTAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3htYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKiBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB3aXRoIGVycm9yIGNoZWNraW5nLgotICAgQ29weXJpZ2h0IDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2RlZmluZSBwdHJkaWZmX3QgbG9uZwotI2VuZGlmCi0KLSNpZiBWTVMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jZWxzZQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGVzZSBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLVBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1QVFIgcmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotUFRSIGNhbGxvYyBQQVJBTVMgKChzaXplX3QsIHNpemVfdCkpOwotUFRSIHNicmsgUEFSQU1TICgocHRyZGlmZl90KSk7Ci0jZW5kaWYKLQotLyogVGhlIHByb2dyYW0gbmFtZSBpZiBzZXQuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKLQotI2lmICFkZWZpbmVkIChfX0NZR1dJTl9fKSAmJiBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0jZGVmaW5lIF9fQ1lHV0lOX18gMQotI2VuZGlmCi0KLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19VV0lOX18pCi0vKiBUaGUgaW5pdGlhbCBzYnJrLCBzZXQgd2hlbiB0aGUgcHJvZ3JhbSBuYW1lIGlzIHNldC4gTm90IHVzZWQgZm9yIHdpbjMyCi0gICBwb3J0cyBvdGhlciB0aGFuIGN5Z3dpbjMyLiAgKi8KLXN0YXRpYyBjaGFyICpmaXJzdF9icmVhayA9IE5VTEw7Ci0jZW5kaWYgLyogISBfV0lOMzIgfHwgX19DWUdXSU4gX18gfHwgX19VV0lOX18gKi8KLQotdm9pZAoteG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBuYW1lID0gczsKLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19VV0lOX18pCi0gIC8qIFdpbjMyIHBvcnRzIG90aGVyIHRoYW4gY3lnd2luMzIgZG9uJ3QgaGF2ZSBicmsoKSAqLwotICBpZiAoZmlyc3RfYnJlYWsgPT0gTlVMTCkKLSAgICBmaXJzdF9icmVhayA9IChjaGFyICopIHNicmsgKDApOwotI2VuZGlmIC8qICEgX1dJTjMyIHx8IF9fQ1lHV0lOIF9fIHx8IF9fVVdJTl9fICovCi19Ci0KLVBUUgoteG1hbGxvYyAoc2l6ZSkKLSAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHNpemUgPSAxOwotICBuZXdtZW0gPSBtYWxsb2MgKHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fVVdJTl9fKQotICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKLQotICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKLSAgICAgIGVsc2UKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXG4lcyVzQ2FuIG5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXMgYWZ0ZXIgYWxsb2NhdGluZyAlbHUgYnl0ZXNcbiIsCi0JICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2l6ZSwgKHVuc2lnbmVkIGxvbmcpIGFsbG9jYXRlZCk7Ci0jZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLAotICAgICAgICAgICAgICAiXG4lcyVzQ2FuIG5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0jZW5kaWYgLyogISBfV0lOMzIgfHwgX19DWUdXSU4gX18gfHwgX19VV0lOX18gKi8KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybiAobmV3bWVtKTsKLX0KLQotUFRSCi14Y2FsbG9jIChuZWxlbSwgZWxzaXplKQotICBzaXplX3QgbmVsZW0sIGVsc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAobmVsZW0gPT0gMCB8fCBlbHNpemUgPT0gMCkKLSAgICBuZWxlbSA9IGVsc2l6ZSA9IDE7Ci0KLSAgbmV3bWVtID0gY2FsbG9jIChuZWxlbSwgZWxzaXplKTsKLSAgaWYgKCFuZXdtZW0pCi0gICAgewotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKQotICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKLQotICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKLSAgICAgIGVsc2UKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXG4lcyVzQ2FuIG5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXMgYWZ0ZXIgYWxsb2NhdGluZyAlbHUgYnl0ZXNcbiIsCi0JICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgKG5lbGVtICogZWxzaXplKSwgKHVuc2lnbmVkIGxvbmcpIGFsbG9jYXRlZCk7Ci0jZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLAotICAgICAgICAgICAgICAiXG4lcyVzQ2FuIG5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgKG5lbGVtICogZWxzaXplKSk7Ci0jZW5kaWYgLyogISBfV0lOMzIgfHwgX19DWUdXSU4gX18gKi8KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybiAobmV3bWVtKTsKLX0KLQotUFRSCi14cmVhbGxvYyAob2xkbWVtLCBzaXplKQotICAgIFBUUiBvbGRtZW07Ci0gICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBuZXdtZW07Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICBzaXplID0gMTsKLSAgaWYgKCFvbGRtZW0pCi0gICAgbmV3bWVtID0gbWFsbG9jIChzaXplKTsKLSAgZWxzZQotICAgIG5ld21lbSA9IHJlYWxsb2MgKG9sZG1lbSwgc2l6ZSk7Ci0gIGlmICghbmV3bWVtKQotICAgIHsKLSNpZm5kZWYgX19NSU5HVzMyX18KLSAgICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKLSAgICAgIHNpemVfdCBhbGxvY2F0ZWQ7Ci0KLSAgICAgIGlmIChmaXJzdF9icmVhayAhPSBOVUxMKQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gZmlyc3RfYnJlYWs7Ci0gICAgICBlbHNlCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSAoY2hhciAqKSAmZW52aXJvbjsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgIlxuJXMlc0NhbiBub3QgcmVhbGxvY2F0ZSAlbHUgYnl0ZXMgYWZ0ZXIgYWxsb2NhdGluZyAlbHUgYnl0ZXNcbiIsCi0JICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2l6ZSwgKHVuc2lnbmVkIGxvbmcpIGFsbG9jYXRlZCk7Ci0jZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLAotICAgICAgICAgICAgICAiXG4lcyVzQ2FuIG5vdCByZWFsbG9jYXRlICVsdSBieXRlc1xuIiwKLSAgICAgICAgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSNlbmRpZiAvKiBfX01JTkdXMzJfXyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hzdHJkdXAuYyBiL2xpYmliZXJ0eS94c3RyZHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmFiYTAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hzdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIHhzdHJkdXAuYyAtLSBEdXBsaWNhdGUgYSBzdHJpbmcgaW4gbWVtb3J5LCB1c2luZyB4bWFsbG9jLgotICAgVGhpcyB0cml2aWFsIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgotICAgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIERlY2VtYmVyIDE5OTUuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotY2hhciAqCi14c3RyZHVwIChzKQotICBjb25zdCBjaGFyICpzOwotewotICByZWdpc3RlciBzaXplX3QgbGVuID0gc3RybGVuIChzKSArIDE7Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldCA9IHhtYWxsb2MgKGxlbik7Ci0gIG1lbWNweSAocmV0LCBzLCBsZW4pOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hzdHJlcnJvci5jIGIvbGliaWJlcnR5L3hzdHJlcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzBiNjUzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94c3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIHhzdHJlcnJvci5jIC0tIGphY2tldCByb3V0aW5lIGZvciBtb3JlIHJvYnVzdCBzdHJlcnJvcigpIHVzYWdlLgotICAgRnJpIEp1biAxNiAxODozMDowMCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLSAgIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBWTVMKLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pICYmICFkZWZpbmVkIChfX0hJREVfRk9SQklEREVOX05BTUVTKQotZXh0ZXJuIGNoYXIgKnN0cmVycm9yIFBBUkFNUyAoKGludCwuLi4pKTsKLSNkZWZpbmUgRE9OVF9ERUNMQVJFX1NUUkVSUk9SCi0jZW5kaWYKLSNlbmRpZgkvKiBWTVMgKi8KLQotI2lmbmRlZiBET05UX0RFQ0xBUkVfU1RSRVJST1IKLWV4dGVybiBjaGFyICpzdHJlcnJvciBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi0vKiBJZiBzdHJlcnJvciByZXR1cm5zIE5VTEwsIHdlJ2xsIGZvcm1hdCB0aGUgbnVtYmVyIGludG8gYSBzdGF0aWMgYnVmZmVyLiAgKi8KLQotI2RlZmluZSBFUlJTVFJfRk1UICJ1bmRvY3VtZW50ZWQgZXJyb3IgIyVkIgotc3RhdGljIGNoYXIgeHN0cmVycm9yX2J1ZltzaXplb2YgRVJSU1RSX0ZNVCArIDIwXTsKLQotLyogTGlrZSBzdHJlcnJvciwgYnV0IHJlc3VsdCBpcyBuZXZlciBhIG51bGwgcG9pbnRlci4gICovCi0KLWNoYXIgKgoteHN0cmVycm9yIChlcnJudW0pCi0gICAgIGludCBlcnJudW07Ci17Ci0gIGNoYXIgKmVycnN0cjsKLSNpZmRlZiBWTVMKLSAgY2hhciAqKCp2bXNsaWJfc3RyZXJyb3IpIFBBUkFNUyAoKGludCwuLi4pKTsKLQotICAvKiBPdmVycmlkZSBhbnkgcG9zc2libHktY29uZmxpY3RpbmcgZGVjbGFyYXRpb24gZnJvbSBzeXN0ZW0gaGVhZGVyLiAgKi8KLSAgdm1zbGliX3N0cmVycm9yID0gKGNoYXIgKigqKSBQQVJBTVMgKChpbnQsLi4uKSkpIHN0cmVycm9yOwotICAvKiBTZWNvbmQgYXJndW1lbnQgbWF0dGVycyBpZmYgZmlyc3QgaXMgRVZNU0VSUiwgYnV0IGl0J3Mgc2ltcGxlciB0bwotICAgICBwYXNzIGl0IHVuY29uZGl0aW9uYWxseS4gIGB2YXhjJGVycm5vJyBpcyBkZWNsYXJlZCBpbiA8ZXJybm8uaD4KLSAgICAgYW5kIG1haW50YWluZWQgYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnkgaW4gcGFyYWxsZWwgdG8gYGVycm5vJy4KLSAgICAgV2UgYXNzdW1lIHRoYXQgYGVycm51bScgY29ycmVzcG9uZHMgdG8gdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQgdG8KLSAgICAgZXJybm8gYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnksIGhlbmNlIHZheGMkZXJybm8gd2lsbCBiZSByZWxldmFudC4gICovCi0gIGVycnN0ciA9ICgqdm1zbGliX3N0cmVycm9yKSAoZXJybnVtLCB2YXhjJGVycm5vKTsKLSNlbHNlCi0gIGVycnN0ciA9IHN0cmVycm9yIChlcnJudW0pOwotI2VuZGlmCi0KLSAgLyogSWYgYGVycm51bScgaXMgb3V0IG9mIHJhbmdlLCByZXN1bHQgbWlnaHQgYmUgTlVMTC4gIFdlJ2xsIGZpeCB0aGF0LiAgKi8KLSAgaWYgKCFlcnJzdHIpCi0gICAgewotICAgICAgc3ByaW50ZiAoeHN0cmVycm9yX2J1ZiwgRVJSU1RSX0ZNVCwgZXJybnVtKTsKLSAgICAgIGVycnN0ciA9IHhzdHJlcnJvcl9idWY7Ci0gICAgfQotICByZXR1cm4gZXJyc3RyOwotfQpkaWZmIC0tZ2l0IGEvbHRjb25maWcgYi9sdGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWIzMDRmZC4uMDAwMDAwMAotLS0gYS9sdGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDI4MjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGx0Y29uZmlnIC0gQ3JlYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wuCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIEEgbG90IG9mIHRoaXMgc2NyaXB0IGlzIHRha2VuIGZyb20gYXV0b2NvbmYtMi4xMC4KLQotIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWVjaG89ZWNobwotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgMAotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KLSAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLSAgZXhlYyAiJFNIRUxMIiAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotIyBGaW5kIHRoZSBjb3JyZWN0IFBBVEggc2VwYXJhdG9yLiAgVXN1YWxseSB0aGlzIGlzIGA6JywgYnV0Ci0jIERKR1BQIHVzZXMgYDsnIGxpa2UgRE9TLgotaWYgdGVzdCAiWCR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gIlhzZXQiOyB0aGVuCi0gIFVOQU1FPSR7VU5BTUUtYHVuYW1lIDI+L2Rldi9udWxsYH0KLSAgY2FzZSBYJFVOQU1FIGluCi0gICAgKi1ET1MpIFBBVEhfU0VQQVJBVE9SPSc7JyA7OwotICAgICopICAgICBQQVRIX1NFUEFSQVRPUj0nOicgOzsKLSAgZXNhYwotZmkKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgIiR7Q0RQQVRIK3NldH0iID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLWlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gIlhzZXQiOyB0aGVuCi0gICMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICBmb3IgY21kIGluICdzZWQgNTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMnEgIiQwIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICBpZiAoZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbCAmJgotICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIiAmJgotICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgIT0gJ1hcdCcgfHwKLSAgIHRlc3QgIlhgKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgIT0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgaWYgdGVzdCAtZiAkZGlyL2VjaG8gJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgotICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIHRlc3QgIlhgKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KLSAgICAgIGVjaG89J3ByaW50IC1yJwotICAgIGVsaWYgdGVzdCAtZiAvYmluL2tzaCAmJiB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCi0gICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBsdGNvbmZpZyBhZ2FpbiB3aXRoIGl0LgotICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSIke0NPTkZJR19TSEVMTC0vYmluL3NofSIKLSAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKLSAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAotICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLSAgICBlbHNlCi0gICAgICAjIFRyeSB1c2luZyBwcmludGYuCi0gICAgICBlY2hvPSdwcmludGYgIiVzXG4iJwotICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JIHRlc3QgIlhgKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JOgotICAgICAgZWxpZiB0ZXN0ICJYYCgiJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JICAgdGVzdCAiWGAoIiRPUklHSU5BTF9DT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCUNPTkZJR19TSEVMTD0iJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIKLQlleHBvcnQgQ09ORklHX1NIRUxMCi0JU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JZXhwb3J0IFNIRUxMCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbGlmIHRlc3QgIlhgKCIkQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgICB0ZXN0ICJYYCgiJENPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbHNlCi0JIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KLQlwcmV2PToKLQotCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDUwcSAiJDAiJzsgZG8KLQkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsOyB0aGVuCi0JICAgIGJyZWFrCi0JICBmaQotCSAgcHJldj0iJGNtZCIKLQlkb25lCi0KLQlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIiQwIic7IHRoZW4KLQkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICBleHBvcnQgZWNob190ZXN0X3N0cmluZwotCSAgZXhlYyAiJHtPUklHSU5BTF9DT05GSUdfU0hFTEx9IiAiJDAiICR7MSsiJEAifQotCWVsc2UKLQkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCi0JICBlY2hvPWVjaG8KLQlmaQotICAgICAgZmkKLSAgICBmaQotICBmaQotZmkKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSBzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgotcHJvZ25hbWU9YCRlY2hvICJYJDAiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotIyBDb25zdGFudHM6Ci1QUk9HUkFNPWx0Y29uZmlnCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4yZgotVElNRVNUQU1QPSIgKDEuMzg1IDE5OTkvMDMvMTUgMTc6MjQ6NTQpIgotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuYyAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuYyAkTElCUyAxPiY1Jwotcm09InJtIC1mIgotCi1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWRlZmF1bHRfb2ZpbGU9bGlidG9vbAotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLWVuYWJsZV9zaGFyZWQ9eWVzCi0jIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nLgotZW5hYmxlX3N0YXRpYz15ZXMKLWVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1lbmFibGVfZGxvcGVuPXVua25vd24KLWx0bWFpbj0KLXNpbGVudD0KLXNyY2Rpcj0KLWFjX2NvbmZpZ19ndWVzcz0KLWFjX2NvbmZpZ19zdWI9Ci1ob3N0PQotbm9ub3B0PQotb2ZpbGU9IiRkZWZhdWx0X29maWxlIgotdmVyaWZ5X2hvc3Q9eWVzCi13aXRoX2djYz1ubwotd2l0aF9nbnVfbGQ9bm8KLW5lZWRfbG9ja3M9eWVzCi1hY19leHQ9Ywotb2JqZXh0PW8KLWxpYmV4dD1hCi1jYWNoZV9maWxlPQotCi1vbGRfQVI9IiRBUiIKLW9sZF9DQz0iJENDIgotb2xkX0NGTEFHUz0iJENGTEFHUyIKLW9sZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotb2xkX0xEPSIkTEQiCi1vbGRfTE5fUz0iJExOX1MiCi1vbGRfTk09IiROTSIKLW9sZF9SQU5MSUI9IiRSQU5MSUIiCi1vbGRfRExMVE9PTD0iJERMTFRPT0wiCi1vbGRfQVM9IiRBUyIKLQotIyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi1hcmdzPQotcHJldj0KLWZvciBvcHRpb24KLWRvCi0gIGNhc2UgIiRvcHRpb24iIGluCi0gIC0qPSopIG9wdGFyZz1gZWNobyAiJG9wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBvcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgZXZhbCAiJHByZXY9XCRvcHRpb24iCi0gICAgcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRvcHRpb24iIGluCi0gIC0taGVscCkgY2F0IDw8RU9NCi1Vc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtIT1NUIFtMVE1BSU5dXQotCi1HZW5lcmF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sIHNjcmlwdC4KLQotICAgIC0tZGVidWcgICAgICAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotICAgIC0tZGlzYWJsZS1zaGFyZWQgICAgICAgZG8gbm90IGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKLSAgICAtLWRpc2FibGUtc3RhdGljICAgICAgIGRvIG5vdCBidWlsZCBzdGF0aWMgbGlicmFyaWVzCi0gICAgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCBkbyBub3Qgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uCi0gICAgLS1lbmFibGUtZGxvcGVuICAgICAgICBlbmFibGUgZGxvcGVuIHN1cHBvcnQKLSAgICAtLWVuYWJsZS1kbG9wZW4tc2VsZiAgIGVuYWJsZSBzdXBwb3J0IGZvciBkbG9wZW5pbmcgcHJvZ3JhbXMKLSAgICAtLWhlbHAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgLS1uby12ZXJpZnkgICAgICAgICAgICBkbyBub3QgdmVyaWZ5IHRoYXQgSE9TVCBpcyBhIHZhbGlkIGhvc3QgdHlwZQotLW8sIC0tb3V0cHV0PUZJTEUgICAgICAgICAgc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgW2RlZmF1bHQ9JGRlZmF1bHRfb2ZpbGVdCi0gICAgLS1xdWlldCAgICAgICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tc3JjZGlyPURJUiAgICAgICAgICAgZmluZCBcYGNvbmZpZy5ndWVzcycgaW4gRElSCi0gICAgLS12ZXJzaW9uICAgICAgICAgICAgICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0td2l0aC1nY2MgICAgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEdOVSBDIGNvbXBpbGVyIHdpbGwgYmUgdXNlZAotICAgIC0td2l0aC1nbnUtbGQgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEMgY29tcGlsZXIgdXNlcyB0aGUgR05VIGxpbmtlcgotICAgIC0tZGlzYWJsZS1sb2NrICAgICAgICAgZGlzYWJsZSBmaWxlIGxvY2tpbmcKLSAgICAtLWNhY2hlLWZpbGU9RklMRSAgICAgIGNvbmZpZ3VyZSBjYWNoZSBmaWxlCi0KLUxUTUFJTiBpcyB0aGUgXGBsdG1haW4uc2gnIHNoZWxsIHNjcmlwdCBmcmFnbWVudCBvciBcYGx0bWFpbi5jJyBwcm9ncmFtCi10aGF0IHByb3ZpZGVzIGJhc2ljIGxpYnRvb2wgZnVuY3Rpb25hbGl0eS4KLQotSE9TVCBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3lzdGVtIG5hbWUgW2RlZmF1bHQ9Z3Vlc3NlZF0uCi1FT00KLSAgZXhpdCAwCi0gIDs7Ci0KLSAgLS1kZWJ1ZykKLSAgICBlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgOzsKLQotICAtLWRpc2FibGUtc2hhcmVkKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0KLSAgLS1kaXNhYmxlLXN0YXRpYykgZW5hYmxlX3N0YXRpYz1ubyA7OwotCi0gIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwpIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLQotICAtLWVuYWJsZS1kbG9wZW4pIGVuYWJsZV9kbG9wZW49eWVzIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KSBzaWxlbnQ9eWVzIDs7Ci0KLSAgLS1zcmNkaXIpIHByZXY9c3JjZGlyIDs7Ci0gIC0tc3JjZGlyPSopIHNyY2Rpcj0iJG9wdGFyZyIgOzsKLQotICAtLW5vLXZlcmlmeSkgdmVyaWZ5X2hvc3Q9bm8gOzsKLQotICAtLW91dHB1dCB8IC1vKSBwcmV2PW9maWxlIDs7Ci0gIC0tb3V0cHV0PSopIG9maWxlPSIkb3B0YXJnIiA7OwotCi0gIC0tdmVyc2lvbikgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIjsgZXhpdCAwIDs7Ci0KLSAgLS13aXRoLWdjYykgd2l0aF9nY2M9eWVzIDs7Ci0gIC0td2l0aC1nbnUtbGQpIHdpdGhfZ251X2xkPXllcyA7OwotCi0gIC0tZGlzYWJsZS1sb2NrKSBuZWVkX2xvY2tzPW5vIDs7Ci0KLSAgLS1jYWNoZS1maWxlPSopIGNhY2hlX2ZpbGU9IiRvcHRhcmciIDs7Ci0KLSAgLSopCi0gICAgZWNobyAiJHByb2duYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdGlvbiciIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICAgICAgbHRtYWluPSIkb3B0aW9uIgotICAgIGVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0jIFRoaXMgZ2VuZXJhdGVzIGFuIHVubmVjZXNzYXJ5IHdhcm5pbmcgZm9yIHNwYXJjLXN1bi1zb2xhcmlzNC4xLjNfVTEKLSMgICAgICBpZiB0ZXN0IC1uICJgZWNobyAkb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotIyAgICAgICAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nIFxgJG9wdGlvbicgaXMgbm90IGEgdmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0jICAgICAgZmkKLSAgICAgIGhvc3Q9IiRvcHRpb24iCi0gICAgZWxzZQotICAgICAgZWNobyAiJHByb2duYW1lOiB0b28gbWFueSBhcmd1bWVudHMiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIExUTUFJTiBmaWxlIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAhIC1mICIkbHRtYWluIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IFxgJGx0bWFpbicgZG9lcyBub3QgZXhpc3QiIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIFF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1sdGNvbmZpZ19hcmdzPQotZm9yIGFyZwotZG8KLSAgY2FzZSAiJGFyZyIgaW4KLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJyRhcmcnIiA7OwotICAqKSBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAkYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgQSByZWxldmFudCBzdWJzZXQgb2YgQUNfSU5JVC4KLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotCi1pZiB0ZXN0IC1uICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUgd2l0aGluIGx0Y29uZmlnIgotICAuICRjYWNoZV9maWxlCi1maQotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICAjIEFzc3VtZSB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyB0aGUgc2FtZSBvbmUgYXMgdGhlIHBhdGggdG8gTFRNQUlOLgotICBzcmNkaXI9YCRlY2hvICJYJGx0bWFpbiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICB0ZXN0ICIkc3JjZGlyIiA9ICIkbHRtYWluIiAmJiBzcmNkaXI9LgotZmkKLQotdHJhcCAiJHJtIGNvbmZ0ZXN0KjsgZXhpdCAxIiAxIDIgMTUKLWlmIHRlc3QgIiR2ZXJpZnlfaG9zdCIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBmb3IgY29uZmlnLmd1ZXNzIGFuZCBjb25maWcuc3ViLgotICBhY19hdXhfZGlyPQotICBmb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9jb25maWcuZ3Vlc3M7IHRoZW4KLSAgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIGlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGZpbmQgY29uZmlnLmd1ZXNzIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLSAgYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotICBhY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLQotICAjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0gIGlmICRTSEVMTCAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotCi0gIGhvc3RfYWxpYXM9JGhvc3QKLSAgY2FzZSAiJGhvc3RfYWxpYXMiIGluCi0gICIiKQotICAgIGlmIGhvc3RfYWxpYXM9YCRTSEVMTCAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZQotICAgICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMgotICAgICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpIDs7Ci0gIGVzYWMKLSAgaG9zdD1gJFNIRUxMICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotICBlY2hvICIkYWNfdCRob3N0IiAxPiY2Ci0KLSAgIyBNYWtlIHN1cmUgdGhlIGhvc3QgdmVyaWZpZWQuCi0gIHRlc3QgLXogIiRob3N0IiAmJiBleGl0IDEKLQotZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgaG9zdCB0eXBlIGlmIHlvdSB1c2UgXGAtLW5vLXZlcmlmeSciIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1lbHNlCi0gIGhvc3RfYWxpYXM9JGhvc3QKLWZpCi0KLSMgVHJhbnNmb3JtIGxpbnV4KiB0byAqLSotbGludXgtZ251KiwgdG8gc3VwcG9ydCBvbGQgY29uZmlndXJlIHNjcmlwdHMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWxpbnV4LWdudSopIDs7Ci1saW51eCopIGhvc3Q9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoLiotLiotbGludXhcKVwoLipcKSQvXDEtZ251XDIvJ2AKLWVzYWMKLQotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCi0gICAgQ09MTEVDVF9OQU1FUz0KLSAgICBleHBvcnQgQ09MTEVDVF9OQU1FUwotICBmaQotICA7OwotZXNhYwotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiBjcnUgJG9sZGxpYiRvbGRvYmpzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotIyBTZXQgYSBzYW5lIGRlZmF1bHQgZm9yIGBBUicuCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi0KLSMgSWYgUkFOTElCIGlzIG5vdCBzZXQsIHRoZW4gcnVuIHRoZSB0ZXN0LgotaWYgdGVzdCAiJHtSQU5MSUIrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgcmVzdWx0PW5vCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJhbmxpYi4uLiAkYWNfYyIgMT4mNgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci9yYW5saWI7IHRoZW4KLSAgICAgIFJBTkxJQj0icmFubGliIgotICAgICAgcmVzdWx0PSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgZWNobyAiJGFjX3QkcmVzdWx0IiAxPiY2Ci1maQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGlifiRvbGRfcG9zdGluc3RhbGxfY21kcyIKLWZpCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIGBETExUT09MJyBhbmQgYEFTJywgdXNlZCBvbiBjeWd3aW4uCi10ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCi10ZXN0IC16ICIkQVMiICYmIEFTPWFzCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB1c2luZyBHQ0MuCi1pZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllcyB8fCB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgSWYgQ0MgaXMgbm90IHNldCwgdGhlbiB0cnkgdG8gZmluZCBHQ0Mgb3IgYSB1c2FibGUgQ0MuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2NjLi4uICRhY19jIiAxPiY2Ci0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9nY2M7IHRoZW4KLQlDQz0iZ2NjIgotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190JENDIiAxPiY2Ci0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgIGZpCi0gIGZpCi0KLSAgIyBOb3QgImdjYyIsIHNvIHRyeSAiY2MiLCByZWplY3RpbmcgIi91c3IvdWNiL2NjIi4KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYy4uLiAkYWNfYyIgMT4mNgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICAgIGNjX3JlamVjdGVkPW5vCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvY2M7IHRoZW4KLQlpZiB0ZXN0ICIkZGlyL2NjIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLQkgIGNjX3JlamVjdGVkPXllcwotCSAgY29udGludWUKLQlmaQotCUNDPSJjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgaWYgdGVzdCAkY2NfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgICAgIHNldCBkdW1teSAkQ0MKLSAgICAgIHNoaWZ0Ci0gICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0JIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0JIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLQlzaGlmdAotCXNldCBkdW1teSAiJGRpci9jYyIgIiRAIgotCXNoaWZ0Ci0JQ0M9IiRAIgotICAgICAgZmkKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotICBmaQotCi0gICMgTm93IHNlZSBpZiB0aGUgY29tcGlsZXIgaXMgcmVhbGx5IEdDQy4KLSAgd2l0aF9nY2M9bm8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gJGFjX2MiIDE+JjYKLSAgZWNobyAiJHByb2duYW1lOjU2NDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotCi0gICRybSBjb25mdGVzdC5jCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotICBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTcyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICB3aXRoX2djYz15ZXMKLSAgZmkKLSAgJHJtIGNvbmZ0ZXN0LmMKLSAgZWNobyAiJGFjX3Qkd2l0aF9nY2MiIDE+JjYKLWZpCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1zZXQgZHVtbXkgJENDCi1jb21waWxlcj0iJDIiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4Li4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdpbnQgaSA9IDE7JyA+IGNvbmZ0ZXN0LmMKLWVjaG8gIiRwcm9nbmFtZTo1ODY6IGNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4IiA+JiA1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjU4NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH07IHRoZW4KLSAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLQotICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLmMpIDs7Ci0gICAgKikgb2JqZXh0PWBlY2hvICRhY19maWxlIHwgc2VkIC1lIHMvY29uZnRlc3QuLy9gIDs7Ci0gICAgZXNhYwotICBkb25lCi1lbHNlCi0gIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi0kcm0gY29uZnRlc3QqCi1lY2hvICIkYWNfdCRvYmpleHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gJGFjX2MiIDE+JjYKLXBpY19mbGFnPQotc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzPQotd2w9Ci1saW5rX3N0YXRpY19mbGFnPQotbm9fYnVpbHRpbl9mbGFnPQotCi1pZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gIHdsPSctV2wsJwotICBsaW5rX3N0YXRpY19mbGFnPSctc3RhdGljJwotCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG9zZjMqIHwgb3NmNCopCi0gICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgOzsKLSAgYWl4KikKLSAgICAjIEJlbG93IHRoZXJlIGlzIGEgZGlydHkgaGFjayB0byBmb3JjZSBub3JtYWwgc3RhdGljIGxpbmtpbmcgd2l0aCAtbGRsCi0gICAgIyBUaGUgcHJvYmxlbSBpcyBiZWNhdXNlIGxpYmRsIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIGJvdGggbGliYyBhbmQKLSAgICAjIGxpYkMgKEFJWCBDKysgbGlicmFyeSksIHdoaWNoIG9idmlvdXNseSBkb2Vzbid0IGluY2x1ZGVkIGluIGxpYnJhcmllcwotICAgICMgbGlzdCBieSBnY2MuIFRoaXMgY2F1c2UgdW5kZWZpbmVkIHN5bWJvbHMgd2l0aCAtc3RhdGljIGZsYWdzLgotICAgICMgVGhpcyBoYWNrIGFsbG93cyBDIHByb2dyYW1zIHRvIGJlIGxpbmtlZCB3aXRoICItc3RhdGljIC1sZGwiLCBidXQKLSAgICAjIHdlIG5vdCBzdXJlIGFib3V0IEMrKyBwcm9ncmFtcy4KLSAgICBsaW5rX3N0YXRpY19mbGFnPSIkbGlua19zdGF0aWNfZmxhZyAke3dsfS1sQyIKLSAgICA7OwotICBjeWd3aW4qIHwgbWluZ3cqIHwgb3MyKikKLSAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KLSAgICA7OwotICBhbWlnYW9zKikKLSAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICBwaWNfZmxhZz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgIDs7Ci0gICopCi0gICAgcGljX2ZsYWc9Jy1mUElDJwotICAgIDs7Ci0gIGVzYWMKLWVsc2UKLSAgIyBQT1JUTUUgQ2hlY2sgZm9yIFBJQyBmbGFncyBmb3IgdGhlIHN5c3RlbSBjb21waWxlci4KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCopCi0gICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICA7OwotCi0gIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbGlua19zdGF0aWNfZmxhZyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0iJHt3bH0tYSAke3dsfWFyY2hpdmUiCi0gICAgcGljX2ZsYWc9JytaJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ub25fc2hhcmVkJwotICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBvczIqKQotICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgotICAgIDs7Ci0KLSAgb3NmMyogfCBvc2Y0KikKLSAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKLSAgICA7OwotCi0gIHNjbzMuMnY1KikKLSAgICBwaWNfZmxhZz0nLUtwaWMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLWRuJwotICAgIHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0nLWJlbGYnCi0gICAgOzsKLQotICBzb2xhcmlzKikKLSAgICBwaWNfZmxhZz0nLUtQSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1XbCwnCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIHBpY19mbGFnPSctUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctUW9wdGlvbiBsZCAnCi0gICAgOzsKLQotICBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICAgIHBpY19mbGFnPSctS1BJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVdsLCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIHBpY19mbGFnPSctcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIDs7Ci0KLSAgKikKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLQotaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotICBlY2hvICIkYWNfdCRwaWNfZmxhZyIgMT4mNgotCi0gICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwaWNfZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTICRwaWNfZmxhZyAtRFBJQyIKLSAgZWNobyAiJHByb2duYW1lOjcxNzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3JrcyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NzE4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRvYmpleHQ7IHRoZW4KLSAgICAjIEFwcGVuZCBhbnkgd2FybmluZ3MgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgCi0gICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICAjIE9uIEhQLVVYLCBib3RoIENDIGFuZCBHQ0Mgb25seSB3YXJuIHRoYXQgUElDIGlzIHN1cHBvcnRlZC4uLiB0aGVuIHRoZXkKLSAgICAgICMgY3JlYXRlIG5vbi1QSUMgb2JqZWN0cy4gIFNvLCBpZiB0aGVyZSB3ZXJlIGFueSB3YXJuaW5ncywgd2UgYXNzdW1lIHRoYXQKLSAgICAgICMgUElDIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCWVjaG8gIiRhY190Im5vIDE+JjYKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0JcGljX2ZsYWc9Ci0gICAgICBlbHNlCi0JZWNobyAiJGFjX3QieWVzIDE+JjYKLQlwaWNfZmxhZz0iICRwaWNfZmxhZyIKLSAgICAgIGZpCi0gICAgICA7OwotICAgICopCi0gICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICAgICAgcGljX2ZsYWc9IiAkcGljX2ZsYWciCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIHBpY19mbGFnPQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiJGFjX3Qibm9uZSAxPiY2Ci1maQotCi0jIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1vIGFuZCAtYyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCi1lY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5vLi4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPSIkQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Mi5vIgotZWNobyAiJHByb2duYW1lOjc2MDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjc2MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDIubzsgdGhlbgotCi0gICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgICBjb21waWxlcl9jX289bm8KLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICAgICAgY29tcGlsZXJfY19vPXllcwotICAgIGZpCi1lbHNlCi0gICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICBjb21waWxlcl9jX289bm8KLSAgZWNobyAiJGFjX3Qibm8gMT4mNgotZmkKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotJHJtIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0IHgiJGNvbXBpbGVyX2NfbyIgPSB4InllcyI7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHdyaXRlIHRvIGEgLmxvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLmxvLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdCoKLSAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi0gIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWMgLW8gY29uZnRlc3QubG8iCi0gIGVjaG8gIiRwcm9nbmFtZTo3ODg6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLmxvIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6Nzg5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LmxvOyB0aGVuCi0KLSAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLQllY2hvICIkYWNfdCJubyAxPiY2Ci0JY29tcGlsZXJfb19sbz1ubwotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JY29tcGlsZXJfb19sbz15ZXMKLSAgICAgIGZpCi0gIGVsc2UKLSAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGNvbXBpbGVyX29fbG89bm8KLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAkcm0gY29uZnRlc3QqCi1lbHNlCi0gIGNvbXBpbGVyX29fbG89bm8KLWZpCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKLWhhcmRfbGlua3M9Im5vdHRlc3RlZCIKLWlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICBlY2hvICRhY19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gJGFjX2MiIDE+JjYKLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgZWNobyAiJGFjX3QkaGFyZF9saW5rcyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgZWNobyAiKioqIFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMgotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotCi1pZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgLWMgY29uZnRlc3QuYyIKLSAgZWNobyAiJHByb2duYW1lOjg0MDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiID4mNQotICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjg0MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCi0KLSAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLQllY2hvICIkYWNfdCJubyAxPiY2Ci0JY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gICAgICBlbHNlCi0JZWNobyAiJGFjX3QieWVzIDE+JjYKLQljb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCi0gICAgICBmaQotICBlbHNlCi0gICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAkcm0gY29uZnRlc3QqCi0KLSAgaWYgdGVzdCAiJGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSAieWVzIjsgdGhlbgotICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zJwotICBlbHNlCi0gICAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJwotICBmaQotICAKLWZpCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIHNoYXJlZCBsaWJyYXJ5IGNvbXBpbGF0aW9uIGZsYWdzLgotaWYgdGVzdCAtbiAiJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncyI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nOiBcYCRDQycgcmVxdWlyZXMgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0gIGlmIGVjaG8gIiRvbGRfQ0MgJG9sZF9DRkxBR1MgIiB8IGVncmVwIC1lICJbIAldJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFnc1sgCV0iID4vZGV2L251bGw7IHRoZW4gOgotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBhZGQgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byB0aGUgQ0Mgb3IgQ0ZMQUdTIGVudiB2YXJpYWJsZSBhbmQgcmVjb25maWd1cmUiIDE+JjIKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gIGZpCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSRybSBjb25mdGVzdCoKLWVjaG8gJ21haW4oKXtyZXR1cm4oMCk7fScgPiBjb25mdGVzdC5jCi1zYXZlX0xERkxBR1M9IiRMREZMQUdTIgotTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCi1lY2hvICIkcHJvZ25hbWU6ODg0OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo4ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBlY2hvICIkYWNfdCRsaW5rX3N0YXRpY19mbGFnIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190Im5vbmUgMT4mNgotICBsaW5rX3N0YXRpY19mbGFnPQotZmkKLUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0kcm0gY29uZnRlc3QqCi0KLWlmIHRlc3QgLXogIiRMTl9TIjsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gdXNlIGxuIC1zLCBvciB3ZSBuZWVkIGhhcmQgbGlua3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0ZGF0YQotICBpZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICRybSBjb25mdGVzdGRhdGEKLSAgICBMTl9TPSJsbiAtcyIKLSAgZWxzZQotICAgIExOX1M9bG4KLSAgZmkKLSAgaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgotICAgIGVjaG8gIiRhY190InllcyAxPiY2Ci0gIGVsc2UKLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi1maQotCi0jIE1ha2Ugc3VyZSBMRCBpcyBhbiBhYnNvbHV0ZSBwYXRoLgotaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBhY19wcm9nPWxkCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6OTE3OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAgICIiKQotICAgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZSBub3QgdXNpbmcgR0NDLgotICAgICAgYWNfcHJvZz1sZAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6OTQxOiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSAgZWxzZQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6OTQ0OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICAgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLQlMRD0iJGFjX2Rpci8kYWNfcHJvZyIKLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0JIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotCSMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotCWlmICIkTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0JZWxzZQotCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIGZpCi0KLSAgaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICAgIGVjaG8gIiRhY190JExEIiAxPiY2Ci0gIGVsc2UKLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiBpdCByZWFsbHkgaXMgb3IgaXMgbm90IEdOVSBsZC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICRhY19jIiAxPiY2Ci0jIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi1lY2hvICIkYWNfdCR3aXRoX2dudV9sZCIgMT4mNgotCi0jIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgotCi1hbGxvd191bmRlZmluZWRfZmxhZz0KLW5vX3VuZGVmaW5lZF9mbGFnPQotbmVlZF9saWJfcHJlZml4PXVua25vd24KLW5lZWRfdmVyc2lvbj11bmtub3duCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotYXJjaGl2ZV9jbWRzPQotYXJjaGl2ZV9leHBzeW1fY21kcz0KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9Ci1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQotaGFyZGNvZGVfZGlyZWN0PW5vCi1oYXJkY29kZV9taW51c19MPW5vCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi1ydW5wYXRoX3Zhcj0KLWFsd2F5c19leHBvcnRfc3ltYm9scz1ubwotZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKLSMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci1pbmNsdWRlX2V4cHN5bXM9Ci0jIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZWdyZXAgcmVndWxhciBleHByZXNzaW9uIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQotIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCi1leGNsdWRlX2V4cHN5bXM9Ci0KLWNhc2UgIiRob3N0X29zIiBpbgotY3lnd2luKiB8IG1pbmd3KikKLSAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICBpZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllczsgdGhlbgotICAgIHdpdGhfZ251X2xkPW5vCi0gIGZpCi0gIDs7Ci0KLWZyZWVic2QyKiB8IHN1bm9zNCopCi0gIGV4Y2x1ZGVfZXhwc3ltcz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotICA7OwotCi1lc2FjCi0KLWxkX3NobGlicz15ZXMKLWlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKLSAgd2xhcmM9JyR7d2x9JwotCi0gICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyogfCBhaXg0KikKLSAgICAjIE9uIEFJWCwgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICBsZF9zaGxpYnM9bm8KLSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgY3J1ICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIHdsYXJjPQotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGJlb3MqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlicz1ubwotICAgIGZpCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLQotICAgICMgRXh0cmFjdCB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0IGZyb20gYW4gYC0tZXhwb3J0LWFsbCcgZGVmIGZpbGUsCi0gICAgIyB0aGVuIHJlZ2VuZXJhdGUgdGhlIGRlZiBmaWxlIGZyb20gdGhlIHN5bWJvbCBleHBvcnQgbGlzdCwgc28gdGhhdAotICAgICMgdGhlIGNvbXBpbGVkIGRsbCBvbmx5IGV4cG9ydHMgdGhlIHN5bWJvbCBleHBvcnQgbGlzdC4KLSAgICBleHBvcnRfc3ltYm9sc19jbWRzPSdybSAtZiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuY34KLSAgICAgIHNlZCAtZSAiL14jIFwvXCogbHRkbGwuYyBzdGFydHMgaGVyZSBcKlwvLywvXiMgXC9cKiBsdGRsbC5jIGVuZHMgaGVyZSBcKlwvLyB7IHMvXiMgLy87IHA7IH0iIC1lIGQgPCAkMCA+ICRvYmpkaXIvJHNvbmFtZS1sdGRsbC5jfgotICAgICAgKGNkICRvYmpkaXIgJiYgJENDIC1jICRzb25hbWUtbHRkbGwuYyl+Ci0gICAgICAkRExMVE9PTCAtLWV4cG9ydC1hbGwgLS1leGNsdWRlLXN5bWJvbHMgRGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIgLS1vdXRwdXQtZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzfgotICAgICAgc2VkIC1lICIxLC9FWFBPUlRTL2QiIC1lICJzLyBAIFswLTldKiA7ICovLyIgPCAkb2JqZGlyLyRzb25hbWUtZGVmID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyBFWFBPUlRTID4gJG9iamRpci8kc29uYW1lLWRlZn4KLSAgICAgIF9sdF9oaW50PTE7Ci0gICAgICBmb3Igc3ltYm9sIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8KLSAgICAgICAgZWNobyAiCVwkc3ltYm9sIEAgXCRfbHRfaGludCA7ICIgPj4gJG9iamRpci8kc29uYW1lLWRlZjsKLQlfbHRfaGludD1gZXhwciAxICsgXCRfbHRfaGludGA7Ci0gICAgICBkb25lfgotICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb2JqZGlyLyRzb25hbWUtYmFzZSAtV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyAtV2wsLWUsX19jeWd3aW5fZGxsX2VudHJ5QDEyIC1vICRsaWIgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfgotICAgICAgJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1leGNsdWRlLXN5bWJvbHMgRGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIgLS1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAtLWJhc2UtZmlsZSAkb2JqZGlyLyRzb25hbWUtYmFzZSAtLW91dHB1dC1leHAgJG9iamRpci8kc29uYW1lLWV4cH4KLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG9iamRpci8kc29uYW1lLWJhc2UgJG9iamRpci8kc29uYW1lLWV4cCAtV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyAtV2wsLWUsX19jeWd3aW5fZGxsX2VudHJ5QDEyIC1vICRsaWIgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfgotICAgICAgJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1leGNsdWRlLXN5bWJvbHMgRGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIgLS1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAtLWJhc2UtZmlsZSAkb2JqZGlyLyRzb25hbWUtYmFzZSAtLW91dHB1dC1leHAgJG9iamRpci8kc29uYW1lLWV4cH4KLSAgICAgICRDQyAkb2JqZGlyLyRzb25hbWUtZXhwIC1XbCwtLWRsbCAtbm9zdGFydGZpbGVzIC1XbCwtZSxfX2N5Z3dpbl9kbGxfZW50cnlAMTIgLW8gJGxpYiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0KLSAgICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JyRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1vdXRwdXQtbGliICRvYmpkaXIvJGxpYm5hbWUuYScKLSAgICA7OwotCi0gICopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlicz1ubwotICAgIGZpCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICBmaQotZWxzZQotICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKikKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSIGNydSAkbGliICRvYmpkaXIvJHNvbmFtZScKLSAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0gICAgICAjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLSAgICAgICMgYnJva2VuIGNvbGxlY3QyLgotICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgZmkKLSAgICA7OwotCi0gIGFpeDQqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGlmIHN0cmluZ3MgYCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgIHwgXAotCSBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotICAgICAgdGhlbgotCSMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotCWhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGVsc2UKLQkjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0JaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgICBmaQotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1ibm9lbnRyeSAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGVsc2UKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyAke3dsfS1iTTpTUkUgJHt3bH0tYm5vZW50cnknCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgZmkKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICMgVGhvdWdoIExJQlBBVEggdmFyaWFibGUgaGFyZGNvZGVzIHNobGlicGF0aCBpbnRvIGV4ZWN1dGFibGUsCi0gICAgIyBpdCBkb2Vzbid0IGFmZmVjdCBzZWFyY2hpbmcgZm9yIC1sKiBsaWJyYXJpZXM7IHRoaXMgY29uZnVzZXMKLSAgICAjIHRlc3RzIGluIG1kZW1vLgotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICA7OwotCi0gIGFtaWdhb3MqKQotICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiBjcnUgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgotICAgIGxpYmV4dD1saWIKLSAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkbGlua29wdHMgYGVjaG8gIiRkZXBsaWJzIiB8IHNlZCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JwotICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKLSAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcycKLSAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAkc3JjZmlsZWAnCi0gICAgOzsKLQotICBmcmVlYnNkMSopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0KLSAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubwotICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgIyBleHRyYSBzcGFjZSkuCi0gIGZyZWVic2QyLjIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC91c3IvbGliL2MrK3J0MC5vJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubyAjIHZlcmlmaWVkIG9uIDIuMi42Ci0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICBmcmVlYnNkMiopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgotICBmcmVlYnNkKikKLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGhwdXg5KikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyLyRzb25hbWV+JExEIC1iICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfnRlc3QgJG9iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgOzsKLQotICBocHV4MTAqIHwgaHB1eDExKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgOzsKLQotICBpcml4NSogfCBpcml4NiopCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtbyAkbGliJwotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIDs7Ci0KLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycgICMgYS5vdXQKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJyAgICAgICMgRUxGCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3BlbmJzZCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBvczIqKQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYXJjaGl2ZV9jbWRzPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAkb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSdlbXhpbXAgLW8gJG9iamRpci8kbGlibmFtZS5hICRvYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgIDs7Ci0KLSAgb3NmMyogfCBvc2Y0KikKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC1vICRsaWInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIDs7Ci0KLSAgc29sYXJpcyopCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JwotICAgICMgJENDIC1zaGFyZWQgd2l0aG91dCBHTlUgbGQgd2lsbCBub3QgY3JlYXRlIGEgbGlicmFyeSBmcm9tIEMrKwotICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34kcm0gJGxpYi5leHAnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgIyBXaHkgZG8gd2UgbmVlZCAtQnN0YXRpYz8gIFRvIGF2b2lkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzLCBtYXliZS4uLgotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgVXNlIC1mUElDIGhlcmUgYmVjYXVzZSBsaWJnY2MgaXMgbXVsdGlsaWJiZWQKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQnN0YXRpYyAtZlBJQyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzeXN2NC4zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSctQmV4cG9ydCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBkZ3V4KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgKikKLSAgICBsZF9zaGxpYnM9bm8KLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLWVjaG8gIiRhY190JGxkX3NobGlicyIgMT4mNgotCi1pZiB0ZXN0IC16ICIkTk0iOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAkYWNfYyIgMT4mNgotICBjYXNlICIkTk0iIGluCi0gIC8qIHwgW0EtWmEtel06Wy9cXF0qKSA7OyAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgKikKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvdWNiIC91c3IvY2NzL2JpbiAvYmluOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0JIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotCWlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCSAgTk09IiRhY19kaXIvbm0gLUIiCi0JICBicmVhawotCWVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JICBOTT0iJGFjX2Rpci9ubSAtcCIKLQkgIGJyZWFrCi0JZWxzZQotCSAgTk09JHtOTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJE5NIiAmJiBOTT1ubQotICAgIDs7Ci0gIGVzYWMKLSAgZWNobyAiJGFjX3QkTk0iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQuLi4gJGFjX2MiIDE+JjYKLQotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLXN5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLXN5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scwotICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBzeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIHN5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBzeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotICBnbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJHN5bXBhdCQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLSAgJHJtIGNvbmZ0ZXN0KgotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQotRU9GCi0KLSAgZWNobyAiJHByb2duYW1lOjE0NDc6IGNoZWNraW5nIGlmIGdsb2JhbF9zeW1ib2xfcGlwZSB3b3JrcyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTQ0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRvYmpleHQ7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBubGlzdD1jb25mdGVzdC5ubQotICAgIGlmIHsgZWNobyAiJHByb2duYW1lOjE0NTE6IGV2YWwgXCIkTk0gY29uZnRlc3QuJG9iamV4dCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3RcIiIgPiY1OyBldmFsICIkTk0gY29uZnRlc3QuJG9iamV4dCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3QgMj4mNSI7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KLQltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJG5saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQkgIHNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYwotCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJG9iamV4dCBjb25mdGVzdG0uJG9iamV4dAotCSAgc2F2ZV9MSUJTPSIkTElCUyIKLQkgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRvYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxNTAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJHNhdmVfTElCUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGdsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gICRybSBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBnbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1lY2hvICIkYWNfdCRwaXBlX3dvcmtzIiAxPiY2Ci0KLWlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci1maQotCi0jIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJGFjX2MiIDE+JjYKLWhhcmRjb2RlX2FjdGlvbj0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJiBcCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubyAmJiBcCi0gICAgIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSBubzsgdGhlbgotCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCi1maQotZWNobyAiJGFjX3QkaGFyZGNvZGVfYWN0aW9uIiAxPiY2Ci0KLQotcmVsb2FkX2ZsYWc9Ci1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICRhY19jIiAxPiY2Ci0jIFBPUlRNRSBTb21lIGxpbmtlcnMgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCi1yZWxvYWRfZmxhZz0nLXInCi1lY2hvICIkYWNfdCRyZWxvYWRfZmxhZyIgMT4mNgotdGVzdCAtbiAiJHJlbG9hZF9mbGFnIiAmJiByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIKLQotIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcwotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpbGVfbWFnaWNfY21kPQotZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW3JlZ2V4XScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCi0jIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGVncmVwIHJlZ2V4LgotIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCi0jIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRhY19jIiAxPiY2Ci1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICA7OwotCi1haXg0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aG91Z2ggQUlYNC4yCi0gICMgYW5kIGxhdGVyIGxpbmtlciBzdXBwb3J0cyAuc28KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgIihjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSI7IChjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uc28nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaTQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LnNvJG1ham9yICR7bGlibmFtZX0uc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9LnNvJwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiAzMi1iaXQgTFNCIHNoYXJlZCBvYmplY3QnCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmEnCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwgJGxpYm5hbWUubGliJwotICBmaQotICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYuKmFyY2hpdGVjdHVyZTogaTM4NicKLSAgZmlsZV9tYWdpY19jbWQ9J29iamR1bXAgLWYnCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KLSAgc2hsaWJwYXRoX3Zhcj1QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLSAgCi1mcmVlYnNkKikKLSAgb2JqZm9ybWF0PWB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdCAmJiAvdXNyL2Jpbi9vYmpmb3JtYXQgfHwgZWNobyBhb3V0YAotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0Ci0gIGNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0Igc2hhcmVkIG9iamVjdCcKLSAgICAgIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgICAgIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5zbyR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgT0JKRk9STUFUPSInIiRvYmpmb3JtYXQiJyIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3IgJGxpYm5hbWUuc2wnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvcicKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pcml4NSopCi0gIHZlcnNpb25fdHlwZT1pcml4Ci0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiAzMi1iaXQgTVNCIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiICMgb3Igc2hvdWxkIGl0IGJlIHBhc3NfYWxsPwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIvbGliYy5zbypgCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICA7OwotCi1pcml4NiopCi0gIHZlcnNpb25fdHlwZT1pcml4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKLSAgY2FzZSAiJExEIiBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICotMzJ8KiItMzIgIikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OwotICAqLW4zMnwqIi1uMzIgIikgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICotNjR8KiItNjQgIikgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgZXZlbiB0aG91Z2ggL3Vzci9sb2NhbC9saWIgaXMgYWx3YXlzIHNlYXJjaGVkLCB0aGUgbWFuLXBhZ2Ugc2F5cwotICAjIHNoYXJlZCBsaWJyYXJpZXMgc2hvdWxkIG5vdCBiZSBpbnN0YWxsZWQgdGhlcmUgaWYgdGhleSB1c2UgYW4gQUJJCi0gICMgZGlmZmVyZW50IGZyb20gLTMyLCBzbyB3ZSdkIGJldHRlciBub3Qgc2VhcmNoIGZvciBzaGFyZWQgbGlicmFyaWVzCi0gICMgdGhlcmUgZWl0aGVyCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiR7bGlic3VmZn0gL3Vzci9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIke2xpYnN1ZmZ9IC91c3IvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiAke2xpYm1hZ2ljfSBNU0IgbWlwcy1bMTIzNF0gZHluYW1pYyBsaWIgTUlQUyAtIHZlcnNpb24gMSIgIyBvciBzaG91bGQgaXQgYmUgcGFzc19hbGw/Ci0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYiR7bGlic3VmZn0vbGliYy5zbypgCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4LWdudW9sZGxkKiB8IGxpbnV4LWdudWFvdXQqIHwgbGludXgtZ251Y29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4LWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKiAvbGliL2xpYmMtKi5zb2AKLQotICBpZiB0ZXN0IC1mIC9saWIvbGQuc28uMTsgdGhlbgotICAgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIGVsc2UKLSAgICAjIE9ubHkgdGhlIEdOVSBsZC5zbyBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIG9uIE1rTGludXguCi0gICAgY2FzZSAiJGhvc3RfY3B1IiBpbgotICAgIHBvd2VycGMqKSBkeW5hbWljX2xpbmtlcj1ubyA7OwotICAgICopIGR5bmFtaWNfbGlua2VyPSdMaW51eCBsZC5zbycgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICR7bGlibmFtZX0uc28nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICBuZWVkX3ZlcnNpb249bm8KLSAgZmkKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLW9zMiopCi0gIGxpYm5hbWVfc3BlYz0nJG5hbWUnCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbCAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICMgZGVwbGlic19jaGVja19tZXRob2Q9J3Bhc3NfYWxsJwotICAjIEFsdGhvdWdoIHBhc3NfYWxsIGFwcGVhcnMgdG8gd29yaywgaXQgY29waWVzIHN5bWJvbHMgZnJvbSBzdGF0aWMgbGlicmFyaWVzCi0gICMgaW50byBzaGFyZWQgb25lcyBhbmQgZXhwb3J0cyB0aGVtLiAgU28sIHdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHR3bwotICAjIG9yIG1vcmUgbGlicmFyaWVzIHRoYXQgaGF2ZSBnb3QgY29waWVzIG9mIHRoZSBzYW1lIHN5bWJvbHMsIGxpbmsgZmFpbHMKLSAgIyBUaGlzIHdhcyBvbmx5IHRlc3RlZCBvbiBvc2Y0OgotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBDT0ZGIGZvcm1hdCBhbHBoYSBzaGFyZWQgbGlicmFyeScKLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc2NvMy4ydjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGZpCi0gIG5lZWRfdmVyc2lvbj15ZXMKLSAgOzsKLQotc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgIiRob3N0X3ZlbmRvciIgaW4KLSAgICBuY3IpCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD0ncGFzc19hbGwnCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZGd1eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi1lY2hvICIkYWNfdCRkeW5hbWljX2xpbmtlciIgMT4mNgotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotIyBSZXBvcnQgdGhlIGZpbmFsIGNvbnNlcXVlbmNlcy4KLWVjaG8gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkY2FuX2J1aWxkX3NoYXJlZCIgMT4mNgotCi1pZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiICYmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX2NtZCI7IHRoZW4KLSAgY2FzZSAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiBpbgotICAiZmlsZV9tYWdpYyAiKikKLSAgICBmaWxlX21hZ2ljX3JlZ2V4PSJgZXhwciBcIiRkZXBsaWJzX2NoZWNrX21ldGhvZFwiIDogXCJmaWxlX21hZ2ljIFwoLipcKVwiYCIKLSAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0gICAgICAgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgOgotICAgIGVsc2UKLSAgICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCi0qKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCi0qKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKLSoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAotKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCi0qKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91Ci0qKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCi0qKiogYnVnLWxpYnRvb2xAZ251Lm9yZwotCi1FT0YKLSAgICBmaSA7OwotICBlc2FjCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLQotYWl4NCopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIDs7Ci1lc2FjCi0KLWVjaG8gIiRhY190JGVuYWJsZV9zaGFyZWQiIDE+JjYKLQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLQotZWNobyAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRlbmFibGVfc3RhdGljIiAxPiY2Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICRhY19jIiAxPiY2Ci1ybSAtZiAubGlicyAyPi9kZXYvbnVsbAotbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLmxpYnM7IHRoZW4KLSAgb2JqZGlyPS5saWJzCi1lbHNlCi0gICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCi0gIG9iamRpcj1fbGlicwotZmkKLXJtZGlyIC5saWJzIDI+L2Rldi9udWxsCi1lY2hvICIkYWNfdCRvYmpkaXIiIDE+JjYKLQotaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCi0gIGVuYWJsZV9kbG9wZW49dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KLWVsc2UKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9kbG9wZW4nK3NldH0nYFwiICE9IHNldCI7IHRoZW4KLSAgbHRfY3ZfZGxvcGVuPW5vIGx0X2N2X2Rsb3Blbl9saWJzPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MTk3NzogY2hlY2tpbmcgZm9yIGRsb3BlbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19kbG9wZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTgyICJsdGNvbmZpZyIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGRsb3BlbigpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGRsb3BlbigpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX2Rsb3BlbikgfHwgZGVmaW5lZCAoX19zdHViX19fZGxvcGVuKQotY2hva2UgbWUKLSNlbHNlCi1kbG9wZW4oKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjAwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19kbG9wZW49eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX2Rsb3Blbj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ2Rsb3BlbmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIwMjI6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRsJ18nZGxvcGVuIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMzAgImx0Y29uZmlnIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBkbG9wZW4oKTsKLQotaW50IG1haW4oKSB7Ci1kbG9wZW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIwNDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIwNTk6IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRsZCdfJ2RsZF9saW5rIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRsZCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDY3ICJsdGNvbmZpZyIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZGxkX2xpbmsoKTsKLQotaW50IG1haW4oKSB7Ci1kbGRfbGluaygpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjA3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjA5NjogY2hlY2tpbmcgZm9yIHNobF9sb2FkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobF9sb2FkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEwMSAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCgpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHNobF9sb2FkKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfc2hsX2xvYWQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobF9sb2FkKQotY2hva2UgbWUKLSNlbHNlCi1zaGxfbG9hZCgpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMTIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3NobF9sb2FkPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19zaGxfbG9hZD1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ3NobF9sb2FkYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExvYWRMaWJyYXJ5IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMTQxOiBjaGVja2luZyBmb3IgTG9hZExpYnJhcnkiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfTG9hZExpYnJhcnknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQ2ICJsdGNvbmZpZyIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIExvYWRMaWJyYXJ5KCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgTG9hZExpYnJhcnkoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9Mb2FkTGlicmFyeSkgfHwgZGVmaW5lZCAoX19zdHViX19fTG9hZExpYnJhcnkpCi1jaG9rZSBtZQotI2Vsc2UKLUxvYWRMaWJyYXJ5KCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIxNjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfTG9hZExpYnJhcnk9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX0xvYWRMaWJyYXJ5PW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nTG9hZExpYnJhcnlgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAKLWZpCi0KLSAgICAKLWZpCi0KLSAgCi1maQotCi0KLWZpCi0KLWZpCi0KLSAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgotICAgIGVuYWJsZV9kbG9wZW49eWVzCi0gIGZpCi0KLSAgY2FzZSAiJGx0X2N2X2Rsb3BlbiIgaW4KLSAgZGxvcGVuKQotZm9yIGFjX2hkciBpbiBkbGZjbi5oOyBkbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjIxMDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTUgImx0Y29uZmlnIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1pbnQgZm5vcmQgPSAwOwotRU9GCi1hY190cnk9IiRhY19jb21waWxlIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjIyMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgIGlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbgotICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKLSAgICBmaQotICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLSAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIyNDg6IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGYrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcwotICBlbHNlCi0gICAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2xpbmUgMjI1NiAibHRjb25maWciCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgZGVmaW5lIExURExfR0xPQkFMCVJUTERfR0xPQkFMCi0jZWxzZQotIyBpZmRlZiBETF9HTE9CQUwKLSMgIGRlZmluZSBMVERMX0dMT0JBTAlETF9HTE9CQUwKLSMgZWxzZQotIyAgZGVmaW5lIExURExfR0xPQkFMCTAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRETF9MQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExURExfTEFaWV9PUl9OT1cKLSMgaWZkZWYgUlRMRF9MQVpZCi0jICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX0xBWlkKLSMgZWxzZQotIyAgaWZkZWYgRExfTEFaWQotIyAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX0xBWlkKLSMgIGVsc2UKLSMgICBpZmRlZiBSVExEX05PVwotIyAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX05PVwotIyAgIGVsc2UKLSMgICAgaWZkZWYgRExfTk9XCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9OT1cKLSMgICAgZWxzZQotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJMAotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWZub3JkKCkgeyBpbnQgaT00Mjt9Ci1tYWluKCkgeyB2b2lkICpzZWxmLCAqcHRyMSwgKnB0cjI7IHNlbGY9ZGxvcGVuKDAsTFRETF9HTE9CQUx8TFRETF9MQVpZX09SX05PVyk7Ci0gICAgaWYoc2VsZikgeyBwdHIxPWRsc3ltKHNlbGYsImZub3JkIik7IHB0cjI9ZGxzeW0oc2VsZiwiX2Zub3JkIik7Ci0JICAgICAgIGlmKHB0cjEgfHwgcHRyMikgZXhpdCgwKTsgfSBleGl0KDEpOyB9IAotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjMwMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmIiAxPiY2Ci0KLSAgaWYgdGVzdCAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHllczsgdGhlbgotICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjMyMTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotaWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKLSAgZWxzZQotICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNsaW5lIDIzMjkgImx0Y29uZmlnIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jIGRlZmluZSBMVERMX0dMT0JBTAlSVExEX0dMT0JBTAotI2Vsc2UKLSMgaWZkZWYgRExfR0xPQkFMCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJRExfR0xPQkFMCi0jIGVsc2UKLSMgIGRlZmluZSBMVERMX0dMT0JBTAkwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExURExfTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVERMX0xBWllfT1JfTk9XCi0jIGlmZGVmIFJUTERfTEFaWQotIyAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9MQVpZCi0jIGVsc2UKLSMgIGlmZGVmIERMX0xBWlkKLSMgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9MQVpZCi0jICBlbHNlCi0jICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICBlbHNlCi0jICAgIGlmZGVmIERMX05PVwotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgIGVsc2UKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCTAKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1mbm9yZCgpIHsgaW50IGk9NDI7fQotbWFpbigpIHsgdm9pZCAqc2VsZiwgKnB0cjEsICpwdHIyOyBzZWxmPWRsb3BlbigwLExURExfR0xPQkFMfExURExfTEFaWV9PUl9OT1cpOwotICAgIGlmKHNlbGYpIHsgcHRyMT1kbHN5bShzZWxmLCJmbm9yZCIpOyBwdHIyPWRsc3ltKHNlbGYsIl9mbm9yZCIpOwotICAgIGlmKHB0cjEgfHwgcHRyMikgZXhpdCgwKTsgfSBleGl0KDEpOyB9IAotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjM3NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiAxPiY2Ci1maQotICAgIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkbHRfY3ZfZGxvcGVuX3NlbGYiIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7Ci0gIGVzYWMKLWZpCi0KLSMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSwgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwsIGJlY2F1c2UgaXQgaXMKLSMgdXNlZCBsYXRlci4KLWx0ZWNobz0iJGVjaG8iCi1pZiB0ZXN0ICJYJGx0ZWNobyIgPSAiWCRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotICAgbHRlY2hvPSIkQ09ORklHX1NIRUxMIFwkMCAtLWZhbGxiYWNrLWVjaG8iCi1maQotTFRTSEVMTD0iJFNIRUxMIgotCi1MVENPTkZJR19WRVJTSU9OPSIkVkVSU0lPTiIKLQotIyBPbmx5IHF1b3RlIHZhcmlhYmxlcyBpZiB3ZSdyZSB1c2luZyBsdG1haW4uc2guCi1jYXNlICIkbHRtYWluIiBpbgotKi5zaCkKLSAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycy4KLSAgZm9yIHZhciBpbiBsdGVjaG8gb2xkX0NDIG9sZF9DRkxBR1Mgb2xkX0NQUEZMQUdTIG9sZF9MRCBvbGRfTk0gb2xkX1JBTkxJQiBcCi0gICAgb2xkX0xOX1Mgb2xkX0RMTFRPT0wgb2xkX0FTIEFSIENDIExEIExOX1MgTk0gTFRTSEVMTCBMVENPTkZJR19WRVJTSU9OIFwKLSAgICByZWxvYWRfZmxhZyByZWxvYWRfY21kcyB3bCBcCi0gICAgcGljX2ZsYWcgbGlua19zdGF0aWNfZmxhZyBub19idWlsdGluX2ZsYWcgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgbGlibmFtZV9zcGVjIFwKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgXAotICAgIFJBTkxJQiBvbGRfYXJjaGl2ZV9jbWRzIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAotICAgIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgYXJjaGl2ZV9jbWRzIGFyY2hpdmVfZXhwc3ltX2NtZHMgcG9zdGluc3RhbGxfY21kcyBwb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIGZpbGVfbWFnaWNfY21kIGV4cG9ydF9zeW1ib2xzX2NtZHMgZGVwbGlic19jaGVja19tZXRob2QgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgbm9fdW5kZWZpbmVkX2ZsYWcgXAotICAgIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIGdsb2JhbF9zeW1ib2xfcGlwZSBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgIFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAotICAgIGNvbXBpbGVyX2NfbyBjb21waWxlcl9vX2xvIG5lZWRfbG9ja3MgZXhjbHVkZV9leHBzeW1zIGluY2x1ZGVfZXhwc3ltczsgZG8KLQotICAgIGNhc2UgIiR2YXIiIGluCi0gICAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcyB8IGFyY2hpdmVfY21kcyB8IGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCi0gICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBmaW5pc2hfY21kcyB8IHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAiJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAiJGx0ZWNobyIgaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRlY2hvPWAkZWNobyAiWCRsdGVjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLSAgdHJhcCAiJHJtIFwiJG9maWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gIGVjaG8gImNyZWF0aW5nICRvZmlsZSIKLSAgJHJtICIkb2ZpbGUiCi0gIGNhdCA8PEVPRiA+ICIkb2ZpbGUiCi0jISAkU0hFTEwKLQotIyBgJGVjaG8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0Y29uZmlnIG9yIGx0bWFpbi5zaC4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSJzZWQgLWUgcy9eWC8vIgotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiXCR7Q0RQQVRIK3NldH0iID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLSMjIyBCRUdJTiBMSUJUT09MIENPTkZJRwotRU9GCi0gIGNmZ2ZpbGU9IiRvZmlsZSIKLSAgOzsKLQotKikKLSAgIyBEb3VibGUtcXVvdGUgdGhlIHZhcmlhYmxlcyB0aGF0IG5lZWQgaXQgKGZvciBhZXN0aGV0aWNzKS4KLSAgZm9yIHZhciBpbiBvbGRfQ0Mgb2xkX0NGTEFHUyBvbGRfQ1BQRkxBR1Mgb2xkX0xEIG9sZF9OTSBvbGRfUkFOTElCIFwKLSAgICBvbGRfTE5fUyBvbGRfRExMVE9PTCBvbGRfQVM7IGRvCi0gICAgZXZhbCAiJHZhcj1cXFwiXCR2YXJcXFwiIgotICBkb25lCi0KLSAgIyBKdXN0IGNyZWF0ZSBhIGNvbmZpZyBmaWxlLgotICBjZmdmaWxlPSIkb2ZpbGUuY2ZnIgotICB0cmFwICIkcm0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQotICBlY2hvICJjcmVhdGluZyAkY2ZnZmlsZSIKLSAgJHJtICIkY2ZnZmlsZSIKLSAgY2F0IDw8RU9GID4gIiRjZmdmaWxlIgotIyBgJGVjaG8gIiRjZmdmaWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIExpYnRvb2wgY29uZmlndXJhdGlvbiBmaWxlLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKLUVPRgotICA7OwotZXNhYwotCi1jYXQgPDxFT0YgPj4gIiRjZmdmaWxlIgotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyBDQz0kb2xkX0NDIENGTEFHUz0kb2xkX0NGTEFHUyBDUFBGTEFHUz0kb2xkX0NQUEZMQUdTIFxcCi0jIExEPSRvbGRfTEQgTk09JG9sZF9OTSBSQU5MSUI9JG9sZF9SQU5MSUIgTE5fUz0kb2xkX0xOX1MgXFwKLSMgRExMVE9PTD0iJG9sZF9ETExUT09MIiBBUz0iJG9sZF9BUyIgXFwKLSMgICAkMCRsdGNvbmZpZ19hcmdzCi0jCi0jIENvbXBpbGVyIGFuZCBvdGhlciB0ZXN0IG91dHB1dCBwcm9kdWNlZCBieSAkcHJvZ25hbWUsIHVzZWZ1bCBmb3IKLSMgZGVidWdnaW5nICRwcm9nbmFtZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotIyBUaGUgdmVyc2lvbiBvZiAkcHJvZ25hbWUgdGhhdCBnZW5lcmF0ZWQgdGhpcyBzY3JpcHQuCi1MVENPTkZJR19WRVJTSU9OPSRMVENPTkZJR19WRVJTSU9OCi0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRMVFNIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdGVjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kQVIKLQotIyBUaGUgZGVmYXVsdCBDIGNvbXBpbGVyLgotQ0M9JENDCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRMRAotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRMTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JE5NCi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JHJlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JHdsCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kcGljX2ZsYWcKLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnMKLWNvbXBpbGVyX2Nfbz0kY29tcGlsZXJfY19vCi0KLSMgQ2FuIHdlIHdyaXRlIGRpcmVjdGx5IHRvIGEgLmxvID8KLWNvbXBpbGVyX29fbG89JGNvbXBpbGVyX29fbG8KLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbiA/Ci1uZWVkX2xvY2tzPSRuZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuPSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsaW5rX3N0YXRpY19mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbm9fYnVpbHRpbl9mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSR0aHJlYWRfc2FmZV9mbGFnX3NwZWMKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGxpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGxpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JHNvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kYXJjaGl2ZV9jbWRzCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi1wb3N0aW5zdGFsbF9jbWRzPSRwb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JHBvc3R1bmluc3RhbGxfY21kcwotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljCi1maWxlX21hZ2ljX2NtZD0kZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZwotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbm9fdW5kZWZpbmVkX2ZsYWcKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYwotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aCIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9scwotCi0jIFRoZSBjb21tYW5kIHRvIGV4dHJhY3QgZXhwb3J0ZWQgc3ltYm9scwotZXhwb3J0X3N5bWJvbHNfY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcwotCi0jIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMKLWV4Y2x1ZGVfZXhwc3ltcz0kZXhjbHVkZV9leHBzeW1zCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkCi1pbmNsdWRlX2V4cHN5bXM9JGluY2x1ZGVfZXhwc3ltcwotCi1FT0YKLQotY2FzZSAiJGx0bWFpbiIgaW4KLSouc2gpCi0gIGVjaG8gJyMjIyBFTkQgTElCVE9PTCBDT05GSUcnID4+ICIkb2ZpbGUiCi0gIGVjaG8gPj4gIiRvZmlsZSIKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqKQotICAgIGNhdCA8PFxFT0YgPj4gIiRvZmlsZSIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIiR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgQ09MTEVDVF9OQU1FUz0KLSAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLWZpCi1FT0YKLSAgICA7OwotICBlc2FjCi0KLSAgIyBBcHBlbmQgdGhlIGx0bWFpbi5zaCBzY3JpcHQuCi0gIGNhdCAiJGx0bWFpbiIgPj4gIiRvZmlsZSIgfHwgKHJtIC1mICIkb2ZpbGUiOyBleGl0IDEpCi0KLSAgY2htb2QgK3ggIiRvZmlsZSIKLSAgOzsKLQotKikKLSAgIyBDb21waWxlIHRoZSBsaWJ0b29sIHByb2dyYW0uCi0gIGVjaG8gIkZJWE1FOiB3b3VsZCBjb21waWxlICRsdG1haW4iCi0gIDs7Ci1lc2FjCi0KLXRlc3QgLW4gIiRjYWNoZV9maWxlIiB8fCBleGl0IDAKLQotIyBBQ19DQUNIRV9TQVZFCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotZXhpdCAwCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2x0bWFpbi5zaCBiL2x0bWFpbi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4Nzg3YS4uMDAwMDAwMAotLS0gYS9sdG1haW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNzgyICswLDAgQEAKLSMgbHRtYWluLnNoIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIE5PVEU6IENoYW5naW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBhZmZlY3QgYW55dGhpbmcgdW50aWwgeW91IHJlcnVuIGx0Y29uZmlnLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgMAotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KLSAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgJGVjaG8gd2lsbCB3b3JrLgotICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCi1wcm9nbmFtZT1gJGVjaG8gIiQwIiB8IHNlZCAncyVeLiovJSUnYAotbW9kZW5hbWU9IiRwcm9nbmFtZSIKLQotIyBDb25zdGFudHMuCi1QUk9HUkFNPWx0bWFpbi5zaAotUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTEuMmYKLVRJTUVTVEFNUD0iICgxLjMzIDE5OTkvMDQvMjYgMTY6Mjg6NTMpIgotCi1kZWZhdWx0X21vZGU9Ci1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi1tYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCi1ta2Rpcj0ibWtkaXIiCi1tdj0ibXYgLWYiCi1ybT0icm0gLWYiCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCi1TUDJOTD0ndHIgXDA0MCBcMDEyJwotTkwyU1A9J3RyIFwwMTIgXDA0MCcKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAotZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORwotZmkKLQotaWYgdGVzdCAiJExUQ09ORklHX1ZFUlNJT04iICE9ICIkVkVSU0lPTiI7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBsdGNvbmZpZyB2ZXJzaW9uIFxgJExUQ09ORklHX1ZFUlNJT04nIGRvZXMgbm90IG1hdGNoICRQUk9HUkFNIHZlcnNpb24gXGAkVkVSU0lPTiciIDE+JjIKLSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCi0gIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBHbG9iYWwgdmFyaWFibGVzLgotbW9kZT0kZGVmYXVsdF9tb2RlCi1ub25vcHQ9Ci1wcmV2PQotcHJldm9wdD0KLXJ1bj0KLXNob3c9IiRlY2hvIgotc2hvd19oZWxwPQotZXhlY3V0ZV9kbGZpbGVzPQotbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgotCi0jIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgotd2hpbGUgdGVzdCAkIyAtZ3QgMAotZG8KLSAgYXJnPSIkMSIKLSAgc2hpZnQKLQotICBjYXNlICIkYXJnIiBpbgotICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBjYXNlICIkcHJldiIgaW4KLSAgICBleGVjdXRlX2RsZmlsZXMpCi0gICAgICBldmFsICIkcHJldj1cIlwkJHByZXYgXCRhcmdcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBwcmV2PQotICAgIHByZXZvcHQ9Ci0gICAgY29udGludWUKLSAgZmkKLQotICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/Ci0gIGNhc2UgIiRhcmciIGluCi0gIC0taGVscCkKLSAgICBzaG93X2hlbHA9eWVzCi0gICAgOzsKLQotICAtLXZlcnNpb24pCi0gICAgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIgotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1jb25maWcpCi0gICAgc2VkIC1lICcxLC9eIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHL2QnIC1lICcvXiMjIyBFTkQgTElCVE9PTCBDT05GSUcvLCRkJyAkMAotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1kZWJ1ZykKLSAgICBlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgOzsKLQotICAtLWRyeS1ydW4gfCAtbikKLSAgICBydW49OgotICAgIDs7Ci0KLSAgLS1mZWF0dXJlcykKLSAgICBlY2hvICJob3N0OiAkaG9zdCIKLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGZpCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGZpCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OwotCi0gIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKLSAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KQotICAgIHNob3c9OgotICAgIDs7Ci0KLSAgLWRsb3BlbikKLSAgICBwcmV2b3B0PSItZGxvcGVuIgotICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCi0gICAgOzsKLQotICAtKikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgbm9ub3B0PSIkYXJnIgotICAgIGJyZWFrCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KLSAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCi0KLSAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCi0gIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotICAgIGNhc2UgIiRub25vcHQiIGluCi0gICAgKmNjIHwgKisrIHwgZ2NjKiB8ICotZ2NjKikKLSAgICAgIG1vZGU9bGluawotICAgICAgZm9yIGFyZwotICAgICAgZG8KLQljYXNlICIkYXJnIiBpbgotCS1jKQotCSAgIG1vZGU9Y29tcGlsZQotCSAgIGJyZWFrCi0JICAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KLSAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQotCi0gICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgotICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICIkbW9kZSIgaW4KLSAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQotICBjb21waWxlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCi0gICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KLSAgICBiYXNlX2NvbXBpbGU9Ci0gICAgbGFzdGFyZz0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IgotICAgIHN1cHByZXNzX291dHB1dD0KLQotICAgIHVzZXJfdGFyZ2V0PW5vCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLW8pCi0JaWYgdGVzdCAiJHVzZXJfdGFyZ2V0IiAhPSAibm8iOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JdXNlcl90YXJnZXQ9bmV4dAotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICIkdXNlcl90YXJnZXQiIGluCi0gICAgICBuZXh0KQotCSMgVGhlIG5leHQgb25lIGlzIHRoZSAtbyB0YXJnZXQgbmFtZQotCXVzZXJfdGFyZ2V0PXllcwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIHllcykKLQkjIFdlIGdvdCB0aGUgb3V0cHV0IGZpbGUKLQl1c2VyX3RhcmdldD1zZXQKLQlsaWJvYmo9IiRhcmciCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0gICAgICBsYXN0YXJnPSIkc3JjZmlsZSIKLSAgICAgIHNyY2ZpbGU9IiRhcmciCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCi0KLSAgICAgICMgQmFja3NsYXNoaWZ5IGFueSBiYWNrc2xhc2hlcywgZG91YmxlIHF1b3RlcywgYW5kIGRvbGxhciBzaWducy4KLSAgICAgICMgVGhlc2UgYXJlIHRoZSBvbmx5IGNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgc3BlY2lhbGx5Ci0gICAgICAjIGludGVycHJldGVkIGluc2lkZSBvZiBkb3VibGUtcXVvdGVkIHNjcmluZ3MuCi0gICAgICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQotICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkgaW4gc2NhbgotICAgICAgIyBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0gICAgICBjYXNlICIkbGFzdGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgotICAgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLQliYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgotICAgICAgZWxzZQotCWJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgY2FzZSAiJHVzZXJfdGFyZ2V0IiBpbgotICAgIHNldCkKLSAgICAgIDs7Ci0gICAgbm8pCi0gICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCi0gICAgICBsaWJvYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCi0gICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KLSAgICB4Zm9ybT0nW2NDRlNmbXNvXScKLSAgICBjYXNlICIkbGlib2JqIiBpbgotICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKLSAgICAqLmFkYikgeGZvcm09YWRiIDs7Ci0gICAgKi5hZHMpIHhmb3JtPWFkcyA7OwotICAgICouYXNtKSB4Zm9ybT1hc20gOzsKLSAgICAqLmMrKykgeGZvcm09YysrIDs7Ci0gICAgKi5jYykgeGZvcm09Y2MgOzsKLSAgICAqLmNwcCkgeGZvcm09Y3BwIDs7Ci0gICAgKi5jeHgpIHhmb3JtPWN4eCA7OwotICAgICouZjkwKSB4Zm9ybT1mOTAgOzsKLSAgICAqLmZvcikgeGZvcm09Zm9yIDs7Ci0gICAgZXNhYwotCi0gICAgbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgInMvXC4keGZvcm0kLy5sby8iYAotCi0gICAgY2FzZSAiJGxpYm9iaiIgaW4KLSAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxpYm9iaiIKLSAgICBlbHNlCi0gICAgICByZW1vdmVsaXN0PSIkbGlib2JqIgotICAgIGZpCi0KLSAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAotICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQotCi0gICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKLSAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKLSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC4uKiQlJSdgLiR7b2JqZXh0fQotICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCi0gICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiAkbG9ja2ZpbGUiCi0gICAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAxIiAxIDIgMTUKLSAgICBlbHNlCi0gICAgICBuZWVkX2xvY2tzPW5vCi0gICAgICBsb2NrZmlsZT0KLSAgICBmaQotCi0gICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKLSAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCi0gICAgICB1bnRpbCBsbiAiJDAiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbwotCSRzaG93ICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKLQlzbGVlcCAyCi0gICAgICBkb25lCi0gICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCi0JZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgICBlY2hvICRzcmNmaWxlID4gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCi0gICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgotICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCi0KLSAgICAgICMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCi0gICAgICBjb21tYW5kPSIkYmFzZV9jb21waWxlICRwaWNfZmxhZyAtRFBJQyAkc3JjZmlsZSIKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQlsb19saWJvYmo9IiRsaWJvYmoiCi0JZGlyPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQlpZiB0ZXN0ICJYJGRpciIgPSAiWCRsaWJvYmoiOyB0aGVuCi0JICBkaXI9IiRvYmpkaXIiCi0JZWxzZQotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZmkKLQlsaWJvYmo9IiRkaXIvImAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCWlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCi0JICAkc2hvdyAiJHJtICRsaWJvYmoiCi0JICAkcnVuICRybSAkbGlib2JqCi0JZWxzZQotCSAgJHNob3cgIiRta2RpciAkZGlyIgotCSAgJHJ1biAkbWtkaXIgJGRpcgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRkaXI7IHRoZW4KLQkgICAgZXhpdCAkc3RhdHVzCi0JICBmaQotCWZpCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX29fbG8iID0geWVzOyB0aGVuCi0Jb3V0cHV0X29iaj0iJGxpYm9iaiIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKLSAgICAgIGVsaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQlvdXRwdXRfb2JqPSIkb2JqIgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvdXRwdXRfb2JqIgotICAgICAgZmkKLQotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCXRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0IHgiYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSB4IiRzcmNmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKLSAgICAgIGlmIHRlc3QgeCIkb3V0cHV0X29iaiIgIT0geCIkbGlib2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJGxpYm9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkbGlib2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiBjb3B5IHRoZSBvYmplY3QgaW50byBwbGFjZSBhbmQgZmluaXNoLgotICAgICAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBSZW5hbWUgdGhlIC5sbyBmcm9tIHdpdGhpbiBvYmpkaXIgdG8gb2JqCi0JaWYgdGVzdCAtZiAkb2JqOyB0aGVuCi0JICAkc2hvdyAkcm0gJG9iagotCSAgJHJ1biAkcm0gJG9iagotCWZpCi0KLQkkc2hvdyAiJG12ICRsaWJvYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkbGlib2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotCi0JIyBOb3cgYXJyYW5nZSB0aGF0IG9iaiBhbmQgbG9fbGlib2JqIGJlY29tZSB0aGUgc2FtZSBmaWxlCi0JJHNob3cgIiRMTl9TICRvYmogJGxvX2xpYm9iaiIKLQlpZiAkcnVuICRMTl9TICRvYmogJGxvX2xpYm9iajsgdGhlbgotCSAgZXhpdCAwCi0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCi0gICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBjb21tYW5kPSIkYmFzZV9jb21waWxlICRzcmNmaWxlIgotICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgotCW91dHB1dF9vYmo9IiRvYmoiCi0gICAgICBmaQotCi0gICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KLSAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0IHgiYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSB4IiRzcmNmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKLSAgICAgIGlmIHRlc3QgeCIkb3V0cHV0X29iaiIgIT0geCIkb2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvIG5vdAotICAgICAgIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0JJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+IFwkbGlib2JqIiB8fCBleGl0ICQ/Ci0gICAgICBlbHNlCi0JIyBNb3ZlIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyCi0JJHNob3cgIiRtdiAkbGlib2JqICRsb19saWJvYmoiCi0JaWYgJHJ1biAkbXYgJGxpYm9iaiAkbG9fbGlib2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgICAgICRybSAiJGxvY2tmaWxlIgotICAgIGZpCi0KLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBsaW5rIG1vZGUKLSAgbGluaykKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBsaW5rIgotICAgIENfY29tcGlsZXI9IiRDQyIgIyBzYXZlIGl0LCB0byBjb21waWxlIGdlbmVyYXRlZCBDIHNvdXJjZXMKLSAgICAjIENZR05VUyBMT0NBTDogdHJvbWV5L2phdmEKLSAgICAjIEFsd2F5cyByZXNwZWN0IHRoZSBDQyBjb25maWd1cmVkIGluIGJ5IGx0Y29uZmlnLgotICAgICMgQ0M9IiRub25vcHQiCi0gICAgIyBFTkQgQ1lHTlVTIExPQ0FMCi0gICAgY2FzZSAiJGhvc3QiIGluCi0gICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0gICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCi0gICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0Ci0gICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCi0gICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2thdGlvbi4KLSAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCi0KLSAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZwotICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKLSAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5Ci0gICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KLSAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCi0gICAgICBhbGxvd191bmRlZmluZWQ9eWVzCi0KLSAgICAgICMgVGhpcyBpcyBhIHNvdXJjZSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgZGxscyBvbiBXaW5kb3dzCi0gICAgICAjIERvbid0IHJlbW92ZSBub3IgbW9kaWZ5IHRoZSBzdGFydGluZyBhbmQgY2xvc2luZyBjb21tZW50cwotIyAvKiBsdGRsbC5jIHN0YXJ0cyBoZXJlICovCi0jICNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAjaW5jbHVkZSA8d2luZG93cy5oPgotIyAjdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAjaW5jbHVkZSA8c3RkaW8uaD4KLSMKLSMgQk9PTCBBUElFTlRSWSBEbGxNYWluIChISU5TVEFOQ0UgaEluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkKTsKLSMKLSMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+Ci0jIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOwotIyBISU5TVEFOQ0UgX19oRGxsSW5zdGFuY2VfYmFzZTsKLSMKLSMgQk9PTCBBUElFTlRSWQotIyBEbGxNYWluIChISU5TVEFOQ0UgaEluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkKQotIyB7Ci0jICAgX19oRGxsSW5zdGFuY2VfYmFzZSA9IGhJbnN0OwotIyAgIHJldHVybiBUUlVFOwotIyB9Ci0jIC8qIGx0ZGxsLmMgZW5kcyBoZXJlICovCi0gICAgICAjIFRoaXMgaXMgYSBzb3VyY2UgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGltcG9ydCBsaWJyYXJpZXMKLSAgICAgICMgb24gV2luZG93cyBmb3IgZGxscyB3aGljaCBsYWNrIHRoZW0uIERvbid0IHJlbW92ZSBub3IgbW9kaWZ5IHRoZQotICAgICAgIyBzdGFydGluZyBhbmQgY2xvc2luZyBjb21tZW50cwotIyAvKiBpbXBnZW4uYyBzdGFydHMgaGVyZSAqLwotIyAvKiAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgbGlidG9vbC4KLSMgCi0jICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIyAgKi8KLSMgCi0jICAjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIGZvciBwcmludGYoKSAqLwotIyAgI2luY2x1ZGUgPHVuaXN0ZC5oPgkJLyogZm9yIG9wZW4oKSwgbHNlZWsoKSwgcmVhZCgpICovCi0jICAjaW5jbHVkZSA8ZmNudGwuaD4JCS8qIGZvciBPX1JET05MWSwgT19CSU5BUlkgKi8KLSMgICNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBzdHJkdXAoKSAqLwotIyAKLSMgIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgIHBlX2dldDE2IChmZCwgb2Zmc2V0KQotIyAgICAgICBpbnQgZmQ7Ci0jICAgICAgIGludCBvZmZzZXQ7Ci0jICB7Ci0jICAgIHVuc2lnbmVkIGNoYXIgYlsyXTsKLSMgICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSMgICAgcmVhZCAoZmQsIGIsIDIpOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKLSMgIH0KLSMgCi0jICBzdGF0aWMgdW5zaWduZWQgaW50Ci0jICBwZV9nZXQzMiAoZmQsIG9mZnNldCkKLSMgICAgICBpbnQgZmQ7Ci0jICAgICAgaW50IG9mZnNldDsKLSMgIHsKLSMgICAgdW5zaWduZWQgY2hhciBiWzRdOwotIyAgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOwotIyAgICByZWFkIChmZCwgYiwgNCk7Ci0jICAgIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci0jICB9Ci0jIAotIyAgc3RhdGljIHVuc2lnbmVkIGludAotIyAgcGVfYXMzMiAocHRyKQotIyAgICAgICB2b2lkICpwdHI7Ci0jICB7Ci0jICAgIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7Ci0jICAgIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci0jICB9Ci0jIAotIyAgaW50Ci0jICBtYWluIChhcmdjLCBhcmd2KQotIyAgICAgIGludCBhcmdjOwotIyAgICAgIGNoYXIgKmFyZ3ZbXTsKLSMgIHsKLSMgICAgICBpbnQgZGxsOwotIyAgICAgIHVuc2lnbmVkIGxvbmcgcGVfaGVhZGVyX29mZnNldCwgb3B0aGRyX29mcywgbnVtX2VudHJpZXMsIGk7Ci0jICAgICAgdW5zaWduZWQgbG9uZyBleHBvcnRfcnZhLCBleHBvcnRfc2l6ZSwgbnNlY3Rpb25zLCBzZWNwdHIsIGV4cHB0cjsKLSMgICAgICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhcywgbmV4cDsKLSMgICAgICB1bnNpZ25lZCBjaGFyICpleHBkYXRhLCAqZXJ2YTsKLSMgICAgICBjaGFyICpmaWxlbmFtZSwgKmRsbF9uYW1lOwotIyAKLSMgICAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07Ci0jIAotIyAgICAgIGRsbCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKLSMgICAgICBpZiAoIWRsbCkKLSMgIAlyZXR1cm4gMTsKLSMgCi0jICAgICAgZGxsX25hbWUgPSBmaWxlbmFtZTsKLSMgICAgCi0jICAgICAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCi0jICAJaWYgKGZpbGVuYW1lW2ldID09ICcvJyB8fCBmaWxlbmFtZVtpXSA9PSAnXFwnICB8fCBmaWxlbmFtZVtpXSA9PSAnOicpCi0jICAJICAgIGRsbF9uYW1lID0gZmlsZW5hbWUgKyBpICsxOwotIyAKLSMgICAgICBwZV9oZWFkZXJfb2Zmc2V0ID0gcGVfZ2V0MzIgKGRsbCwgMHgzYyk7Ci0jICAgICAgb3B0aGRyX29mcyA9IHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMjA7Ci0jICAgICAgbnVtX2VudHJpZXMgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTIpOwotIyAKLSMgICAgICBpZiAobnVtX2VudHJpZXMgPCAxKSAvKiBubyBleHBvcnRzICovCi0jICAJcmV0dXJuIDE7Ci0jIAotIyAgICAgIGV4cG9ydF9ydmEgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTYpOwotIyAgICAgIGV4cG9ydF9zaXplID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDEwMCk7Ci0jICAgICAgbnNlY3Rpb25zID0gcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKzIpOwotIyAgICAgIHNlY3B0ciA9IChwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwICsKLSMgIAkgICAgICBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDE2KSk7Ci0jIAotIyAgICAgIGV4cHB0ciA9IDA7Ci0jICAgICAgZm9yIChpID0gMDsgaSA8IG5zZWN0aW9uczsgaSsrKQotIyAgICAgIHsKLSMgIAljaGFyIHNuYW1lWzhdOwotIyAgCXVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKLSMgIAl1bnNpZ25lZCBsb25nIHZhZGRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDEyKTsKLSMgIAl1bnNpZ25lZCBsb25nIHZzaXplID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDE2KTsKLSMgIAl1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOwotIyAgCWxzZWVrKGRsbCwgc2VjcHRyMSwgU0VFS19TRVQpOwotIyAgCXJlYWQoZGxsLCBzbmFtZSwgOCk7Ci0jICAJaWYgKHZhZGRyIDw9IGV4cG9ydF9ydmEgJiYgdmFkZHIrdnNpemUgPiBleHBvcnRfcnZhKQotIyAgCXsKLSMgIAkgICAgZXhwcHRyID0gZnB0ciArIChleHBvcnRfcnZhIC0gdmFkZHIpOwotIyAgCSAgICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKLSMgIAkJZXhwb3J0X3NpemUgPSB2c2l6ZSAtIChleHBvcnRfcnZhIC0gdmFkZHIpOwotIyAgCSAgICBicmVhazsKLSMgIAl9Ci0jICAgICAgfQotIyAKLSMgICAgICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhleHBvcnRfc2l6ZSk7Ci0jICAgICAgbHNlZWsgKGRsbCwgZXhwcHRyLCBTRUVLX1NFVCk7Ci0jICAgICAgcmVhZCAoZGxsLCBleHBkYXRhLCBleHBvcnRfc2l6ZSk7Ci0jICAgICAgZXJ2YSA9IGV4cGRhdGEgLSBleHBvcnRfcnZhOwotIyAKLSMgICAgICBuZXhwID0gcGVfYXMzMiAoZXhwZGF0YSsyNCk7Ci0jICAgICAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7Ci0jIAotIyAgICAgIHByaW50ZiAoIkVYUE9SVFNcbiIpOwotIyAgICAgIGZvciAoaSA9IDA7IGk8bmV4cDsgaSsrKQotIyAgICAgIHsKLSMgIAl1bnNpZ25lZCBsb25nIG5hbWVfcnZhID0gcGVfYXMzMiAoZXJ2YStuYW1lX3J2YXMraSo0KTsKLSMgIAlwcmludGYgKCJcdCVzIEAgJWxkIDtcbiIsIGVydmErbmFtZV9ydmEsIDErIGkpOwotIyAgICAgIH0KLSMgCi0jICAgICAgcmV0dXJuIDA7Ci0jICB9Ci0jIC8qIGltcGdlbi5jIGVuZHMgaGVyZSAqLwotICAgICAgOzsKLSAgICAqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgY29tcGlsZV9jb21tYW5kPSIkQ0MiCi0gICAgZmluYWxpemVfY29tbWFuZD0iJENDIgotCi0gICAgY29tcGlsZV9ycGF0aD0KLSAgICBmaW5hbGl6ZV9ycGF0aD0KLSAgICBjb21waWxlX3NobGlicGF0aD0KLSAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9Ci0gICAgY29udmVuaWVuY2U9Ci0gICAgb2xkX2NvbnZlbmllbmNlPQotICAgIGRlcGxpYnM9Ci0gICAgbGlua29wdHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKLSAgICAgIGV2YWwgbGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWCBcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAotICAgIGVsc2UKLSAgICAgIGxpYl9zZWFyY2hfcGF0aD0KLSAgICBmaQotICAgICMgbm93IHByZXBlbmQgdGhlIHN5c3RlbS1zcGVjaWZpYyBvbmVzCi0gICAgZXZhbCBsaWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCRsaWJfc2VhcmNoX3BhdGhcIgotICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKLSAgICAKLSAgICBhdm9pZF92ZXJzaW9uPW5vCi0gICAgZGxmaWxlcz0KLSAgICBkbHByZWZpbGVzPQotICAgIGRsc2VsZj1ubwotICAgIGV4cG9ydF9keW5hbWljPW5vCi0gICAgZXhwb3J0X3N5bWJvbHM9Ci0gICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9Ci0gICAgZ2VuZXJhdGVkPQotICAgIGxpYm9ianM9Ci0gICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KLSAgICBsdGxpYnM9Ci0gICAgbW9kdWxlPW5vCi0gICAgb2Jqcz0KLSAgICBwcmVsb2FkPW5vCi0gICAgcHJldj0KLSAgICBwcmV2YXJnPQotICAgIHJlbGVhc2U9Ci0gICAgcnBhdGg9Ci0gICAgeHJwYXRoPQotICAgIHBlcm1fcnBhdGg9Ci0gICAgdGVtcF9ycGF0aD0KLSAgICB0aHJlYWRfc2FmZT1ubwotICAgIHZpbmZvPQotCi0gICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iIDE+JjIKLQlmaQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCWJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCi0gICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcwotCi0gICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCi0gICAgd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotCi0gICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCWNhc2UgIiRwcmV2IiBpbgotCW91dHB1dCkKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBPVVRQVVRAIgotCSAgOzsKLQllc2FjCi0KLQljYXNlICIkcHJldiIgaW4KLQlkbGZpbGVzfGRscHJlZmlsZXMpCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCi0JICAgIHByZWxvYWQ9eWVzCi0JICBmaQotCSAgY2FzZSAiJGFyZyIgaW4KLQkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCi0JICBzZWxmKQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAgICAgZGxzZWxmPXllcwotCSAgICBlbGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiAhPSB5ZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqKQotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIHByZXY9Ci0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWV4cHN5bXMpCi0JICBleHBvcnRfc3ltYm9scz0iJGFyZyIKLQkgIGlmIHRlc3QgISAtZiAiJGFyZyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogc3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgICAgZXhpdCAxCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWV4cHN5bXNfcmVnZXgpCi0JICBleHBvcnRfc3ltYm9sc19yZWdleD0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlyZWxlYXNlKQotCSAgcmVsZWFzZT0iLSRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcnBhdGgpCi0JICBycGF0aD0iJHJwYXRoICRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JeHJwYXRoKQotCSAgeHJwYXRoPSIkeHJwYXRoICRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JKikKLQkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQllc2FjCi0gICAgICBmaQotCi0gICAgICBwcmV2YXJnPSIkYXJnIgotCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLWFsbC1zdGF0aWMpCi0JaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWFsbG93LXVuZGVmaW5lZCkKLQkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAtYWxsb3ctdW5kZWZpbmVkJyBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiIDE+JjIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hdm9pZC12ZXJzaW9uKQotCWF2b2lkX3ZlcnNpb249eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxvcGVuKQotCXByZXY9ZGxmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRscHJlb3BlbikKLQlwcmV2PWRscHJlZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtZHluYW1pYykKLQlpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiICE9IHllczsgdGhlbgotCSAgZXhwb3J0X2R5bmFtaWM9eWVzCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCSAgZWxzZQotCSAgICBhcmc9Ci0JICBmaQotCWZpCi0JOzsKLQotICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyIKLQkgIGV4aXQgMQotCWZpCi0JaWYgdGVzdCAiJGFyZyIgPSAiLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgotCSAgcHJldj1leHBzeW1zCi0JZWxzZQotCSAgcHJldj1leHBzeW1zX3JlZ2V4Ci0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1MKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLUxcKC4qXCkkJVwxJSdgCi0JY2FzZSAiJGRpciIgaW4KLQkvKiB8IFtBLVphLXpdOlsvXFxdKikKLQkgICMgQWRkIHRoZSBjb3JyZXNwb25kaW5nIGhhcmRjb2RlX2xpYmRpcl9mbGFnLCBpZiBpdCBpcyBub3QgaWRlbnRpY2FsLgotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAtTCRkaXInIGNhbm5vdCBzcGVjaWZ5IGEgcmVsYXRpdmUgZGlyZWN0b3J5IiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiAkZGVwbGlicyAiIGluCi0JKiIgJGFyZyAiKikgOzsKLQkqKSBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIjs7Ci0JZXNhYwotCWNhc2UgIiAkbGliX3NlYXJjaF9wYXRoICIgaW4KLQkqIiAkZGlyICIqKSA7OwotCSopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIjs7Ci0JZXNhYwotCWNhc2UgIiRob3N0IiBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCSAgZGxsc2VhcmNoZGlyPWBjZCAiJGRpciIgJiYgcHdkIHx8IGVjaG8gIiRkaXIiYAotCSAgY2FzZSAiOiRkbGxzZWFyY2hwYXRoOiIgaW4KLQkgIDo6KSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNoZGlyIjs7Ci0JICAqIjokZGxsc2VhcmNoZGlyOiIqKSA7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRsbHNlYXJjaGRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JOzsKLQotICAgICAgLWwqKQotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JOzsKLQotICAgICAgLW1vZHVsZSkKLQlpZiB0ZXN0ICIkbW9kdWxlIiAhPSB5ZXM7IHRoZW4KLQkgIG1vZHVsZT15ZXMKLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCi0JICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0JICBlbHNlCi0JICAgIGFyZz0KLQkgIGZpCi0JZmkKLQk7OwotCQotICAgICAgLW5vLXVuZGVmaW5lZCkKLQlhbGxvd191bmRlZmluZWQ9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1vKSBwcmV2PW91dHB1dCA7OwotCi0gICAgICAtcmVsZWFzZSkKLQlwcmV2PXJlbGVhc2UKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1ycGF0aCkKLQlwcmV2PXJwYXRoCi0JY29udGludWUKLQk7OwotCi0gICAgICAtUikKLQlwcmV2PXhycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIqKQotCXhycGF0aD0iJHhycGF0aCAiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JY29udGludWUKLQk7OwotCi0gICAgICAtc3RhdGljKQotCSMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiB0aGlzIGlzIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljLgotCWlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXRocmVhZC1zYWZlKQotCXRocmVhZF9zYWZlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXZlcnNpb24taW5mbykKLQlwcmV2PXZpbmZvCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KLSAgICAgIC0qIHwgKyopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotCi0gICAgICAqLm8gfCAqLm9iaiB8ICouYSB8ICoubGliKQotCSMgQSBzdGFuZGFyZCBvYmplY3QuCi0Jb2Jqcz0iJG9ianMgJGFyZyIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgQSBsaWJyYXJ5IG9iamVjdC4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3BlbiIgPSB5ZXM7IHRoZW4KLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgIGVsc2UKLQkgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgcHJldj1kbHByZWZpbGVzCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0JICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgcHJldj0KLQlmaQotCWxpYm9ianM9IiRsaWJvYmpzICRhcmciCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCi0KLQlkbG5hbWU9Ci0JbGliZGlyPQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0KLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmIChzZWQgLWUgJzJxJyAkYXJnIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCi0JIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZSBpbnN0YWxsZWQuCi0JaW5zdGFsbGVkPXllcwotCi0JIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JY2FzZSAiJGFyZyIgaW4KLQkqLyogfCAqXFwqKSAuICRhcmcgOzsKLQkqKSAuIC4vJGFyZyA7OwotCWVzYWMKLQotCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KLQlsaW5rbGliPQotCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkgIGxpbmtsaWI9IiRsIgotCWRvbmUKLQotCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGFyZyciIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIEZpbmQgdGhlIHJlbGV2YW50IG9iamVjdCBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgbmFtZS4KLQluYW1lPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotCi0JaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgotCSAgZGlyPSIkbGliZGlyIgotCWVsc2UKLQkgIGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRhcmciOyB0aGVuCi0JICAgIGRpcj0iJG9iamRpciIKLQkgIGVsc2UKLQkgICAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkZGVwZW5kZW5jeV9saWJzIjsgdGhlbgotCSAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCi0JICB0ZW1wX2RlcGxpYnM9Ci0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgIGNhc2UgIiRkZXBsaWIiIGluCi0JICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JCSBjYXNlICIgJHJwYXRoICR4cnBhdGggIiBpbgotCQkgKiIgJHRlbXBfeHJwYXRoICIqKSA7OwotCQkgKikgeHJwYXRoPSIkeHJwYXRoICR0ZW1wX3hycGF0aCI7OwotCQkgZXNhYzs7Ci0JICAgIC1MKikgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAkdGVtcF9kZXBsaWJzICIgaW4KLQkJICoiICRkZXBsaWIgIiopIDs7Ci0JCSAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OwotCQkgZXNhYzs7Ci0JICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkZGVwbGliIjs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKLQlmaQotCi0JaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KLQkgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGRpci8kb2xkX2xpYnJhcnkiCi0JICBvbGRfY29udmVuaWVuY2U9IiRvbGRfY29udmVuaWVuY2UgJGRpci8kb2xkX2xpYnJhcnkiCi0JICBkZXBsaWJzPSIkZGVwbGlicyRkZXBlbmRlbmN5X2xpYnMiCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kb2xkX2xpYnJhcnkkZGVwZW5kZW5jeV9saWJzIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGRpci8kb2xkX2xpYnJhcnkkZGVwZW5kZW5jeV9saWJzIgotCSAgY29udGludWUKLQlmaQotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIGlmIHRlc3QgLXogIiRkbG5hbWUiIHx8IHRlc3QgIiRkbG9wZW4iICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCi0JICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgotCSAgICBwcmV2PWRscHJlZmlsZXMKLQkgIGVsc2UKLQkgICAgIyBXZSBzaG91bGQgbm90IGNyZWF0ZSBhIGRlcGVuZGVuY3kgb24gdGhpcyBsaWJyYXJ5LCBidXQgd2UKLQkgICAgIyBtYXkgbmVlZCBhbnkgbGlicmFyaWVzIGl0IHJlcXVpcmVzLgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICBmaQotCWZpCi0KLQkjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCWlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scwotCSAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCi0JICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgZWxzZQotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgotCSAgZmkKLQkgIHByZXY9Ci0JZmkKLQotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotCSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0iJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMgJGFyZyIKLQkgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICIkZGlyIiBpbgotCSAgLyogfCBbQS1aYS16XTpbL1xcXSopIGFic2Rpcj0iJGRpciIgOzsKLQkgICopCi0JICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkgICAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxpYmRpciciIDE+JjIKLQkgICAgICBleGl0IDEKLQkgICAgZmkKLQkgICAgOzsKLQkgIGVzYWMKLQkgIAotCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgotCSAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgIyBzZWFyY2ggcGF0aCwgdW5sZXNzIHRoZXkgaGF2ZSBiZWVuIHJlcXVlc3RlZCB3aXRoIC1SLgotCSAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotIAkgICoiICRhYnNkaXIgIiopIDs7Ci0JICAqKQotCSAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRhYnNkaXIiIAotCSAgICBlc2FjCi0JICAgIDs7Ci0gCSAgZXNhYwotCi0JICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0gCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgZXNhYwotCSAgICA7OwotIAkgIGVzYWMKLQotCSAgbGliX2xpbmtlZD15ZXMKLQkgIGNhc2UgIiRoYXJkY29kZV9hY3Rpb24iIGluCi0JICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKLQkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzICRkaXIvJGxpbmtsaWIiCi0JICAgICAgY2FzZSAiJGhvc3QiIGluCi0JICAgICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0JCWRsbHNlYXJjaGRpcj1gY2QgIiRkaXIiICYmIHB3ZCB8fCBlY2hvICIkZGlyImAKLQkJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0JCSAgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRsbHNlYXJjaGRpciIKLQkJZWxzZQotCQkgIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hkaXIiCi0JCWZpCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCi0JICAgICAgY2FzZSAiJGhvc3QiIGluCi0JICAgICAgKi0qLXN1bm9zKikKLQkJY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRkaXI6IgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgICAqIiAtTCRkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIgLWwkbmFtZSIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgotCSAgICAgIGNhc2UgIjokY29tcGlsZV9zaGxpYnBhdGg6IiBpbgotCSAgICAgICoiOiRkaXI6IiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRkaXI6Ijs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sJG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICBsaWJfbGlua2VkPW5vCi0JICAgIGZpCi0JICAgIDs7Ci0KLQkgIHJlbGluaykKLQkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFic2Rpci8kbGlua2xpYiIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkYWJzZGlyLyRsaW5rbGliIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCSAgICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAgICoiIC1MJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkYWJzZGlyIjs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGFic2RpciAtbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCSAgICAgIGNhc2UgIjokY29tcGlsZV9zaGxpYnBhdGg6IiBpbgotCSAgICAgICoiOiRhYnNkaXI6IiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhYnNkaXI6Ijs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sJG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICBsaWJfbGlua2VkPW5vCi0JICAgIGZpCi0JICAgIDs7Ci0KLQkgICopCi0JICAgIGxpYl9saW5rZWQ9bm8KLQkgICAgOzsKLQkgIGVzYWMKLQotCSAgaWYgdGVzdCAiJGxpYl9saW5rZWQiICE9IHllczsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjb25maWd1cmF0aW9uIGVycm9yOiB1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCi0JICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGliZGlyLyRsaW5rbGliIgotCSAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgY2FzZSAiJGZpbmFsaXplX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtTCRsaWJkaXIgIiopIDs7Ci0JICAgICopIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGxpYmRpciI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCSAgICBjYXNlICI6JGZpbmFsaXplX3NobGlicGF0aDoiIGluCi0JICAgICoiOiRsaWJkaXI6IiopIDs7Ci0JICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6Ijs7Ci0JICAgIGVzYWMKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLWwkbmFtZSIKLQkgIGVsc2UKLQkgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KLQkgICAgY2FzZSAiJGZpbmFsaXplX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtTCRkaXIgIiopIDs7Ci0JICAgICopIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGxpYmRpciI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBmaQotCWVsc2UKLQkgICMgVHJhbnNmb3JtIGRpcmVjdGx5IHRvIG9sZCBhcmNoaXZlcyBpZiB3ZSBkb24ndCBidWlsZCBuZXcgbGlicmFyaWVzLgotCSAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiAmJiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHN0YXRpYyBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCi0JICAgIGV4aXQgMQotCSAgZmkKLQotCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAotCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCi0JICAjIHNoYXJlZCBwbGF0Zm9ybXMuCi0JICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0JICBlbHNlCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtTCRkaXIgIiopIDs7Ci0JICAgICopIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgZXNhYwotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgY2FzZSAiJGZpbmFsaXplX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtTCRkaXIgIiopIDs7Ci0JICAgICopIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGRpciI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBmaQotCWZpCi0KLQkjIEFkZCBpbiBhbnkgbGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGFyZ3VtZW50LgotICAgICAgKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICIkYXJnIiBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2YXJnJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIG9sZGxpYnM9Ci0gICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQotICAgIG91dHB1dG5hbWU9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCi0KLSAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICIiKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0KLSAgICAqLmEgfCAqLmxpYikKLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIGFyY2hpdmVzIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtUicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCi0gICAgICA7OwotCi0gICAgKi5sYSkKLSAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KLSAgICAgIGNhc2UgIiRvdXRwdXRuYW1lIiBpbgotICAgICAgbGliKikKLQluYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0JZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSBubzsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCi0JICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCi0JICBuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JZWxzZQotCSAgbGlibmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIG91dHB1dF9vYmpkaXI9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KLQlvdXRwdXRfb2JqZGlyPSIkb2JqZGlyIgotICAgICAgZWxzZQotCW91dHB1dF9vYmpkaXI9IiRvdXRwdXRfb2JqZGlyLyRvYmpkaXIiCi0gICAgICBmaQotCi0gICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCi0gICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICBkbG5hbWU9Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHM6JG9ianMiIDI+JjEKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgSG93IHRoZSBoZWNrIGFyZSB3ZSBzdXBwb3NlZCB0byB3cml0ZSBhIHdyYXBwZXIgZm9yIGEgc2hhcmVkIGxpYnJhcnk/Ci0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBsaW5rIHNoYXJlZCBsaWJyYXJpZXMgaW50byBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgotCSBleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgc2V0IGR1bW15ICRycGF0aAotICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCi0gICAgICBmaQotICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgotCi0gICAgICBvbGRsaWJzPQotICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCSAgbGliZXh0PWFsCi0JICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCi0JICBidWlsZF9vbGRfbGlicz15ZXMKLQlmaQotCWRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCi0KLQlpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgotCWZpCi0KLQlpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgotCWZpCi0gICAgICBlbHNlCi0KLQkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgotCUlGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCi0Jc2V0IGR1bW15ICR2aW5mbyAwIDAgMAotCUlGUz0iJHNhdmVfaWZzIgotCi0JaWYgdGVzdCAtbiAiJDgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCWN1cnJlbnQ9IiQyIgotCXJldmlzaW9uPSIkMyIKLQlhZ2U9IiQ0IgotCi0JIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KLQljYXNlICIkY3VycmVudCIgaW4KLQkwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQ1VSUkVOVCBcYCRjdXJyZW50JyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQljYXNlICIkcmV2aXNpb24iIGluCi0JMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFJFVklTSU9OIFxgJHJldmlzaW9uJyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQljYXNlICIkYWdlIiBpbgotCTAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICRhZ2UgLWd0ICRjdXJyZW50OyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG51bWJlciBcYCRjdXJyZW50JyIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBDYWxjdWxhdGUgdGhlIHZlcnNpb24gdmFyaWFibGVzLgotCW1ham9yPQotCXZlcnN1ZmZpeD0KLQl2ZXJzdHJpbmc9Ci0JY2FzZSAiJHZlcnNpb25fdHlwZSIgaW4KLQlub25lKSA7OwotCi0JaXJpeCkKLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZSArIDFgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCi0JICB2ZXJzdHJpbmc9InNnaSRtYWpvci4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRyZXZpc2lvbgotCSAgd2hpbGUgdGVzdCAkbG9vcCAhPSAwOyBkbwotCSAgICBpZmFjZT1gZXhwciAkcmV2aXNpb24gLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0ic2dpJG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgotCSAgZG9uZQotCSAgOzsKLQotCWxpbnV4KQotCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgOzsKLQotCW9zZikKLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQotCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLQkgIGxvb3A9JGFnZQotCSAgd2hpbGUgdGVzdCAkbG9vcCAhPSAwOyBkbwotCSAgICBpZmFjZT1gZXhwciAkY3VycmVudCAtICRsb29wYAotCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKLQkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCi0JICBkb25lCi0KLQkgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KLQkgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2N1cnJlbnR9LjAiCi0JICA7OwotCi0Jc3Vub3MpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgotCSAgOzsKLQotCWZyZWVic2QtYW91dCkKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iOwotCSAgOzsKLQotCWZyZWVic2QtZWxmKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IjsKLQkgIDs7Ci0KLQl3aW5kb3dzKQotCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5Ci0JICAjIHdhbnQgb25lIGV4dGVuc2lvbiBvbiBXaW5kb3dzIDk1LgotCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSItJG1ham9yLSRhZ2UtJHJldmlzaW9uIgotCSAgOzsKLQotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciIDE+JjIKLQkgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KLQlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSAgbWFqb3I9Ci0JICB2ZXJzdHJpbmc9IjAuMCIKLQkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgICAgdmVyc3VmZml4PQotCSAgZWxzZQotCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCi0JICBmaQotCWZpCi0KLQkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKLQlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgotCSAgbWFqb3I9Ci0JICB2ZXJzdWZmaXg9Ci0JICB2ZXJzdHJpbmc9IiIKLQlmaQotCQotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLQlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgZmkKLQllbHNlCi0JICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKLQlmaQotCi0JZGVwZW5kZW5jeV9saWJzPSIkZGVwbGlicyIKLQljYXNlICIkaG9zdCIgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKLQkgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKLQkgIDs7Ci0JKikKLQkgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcy4KLQkgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnksIG9yIHJlbW92ZSBvdXIgb3V0cHV0cyBpZiB3ZSBuZWVkIHRvLgotICAgICAgaWYgdGVzdCAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSRzaG93ICIke3JtfXIgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qIgotCSRydW4gJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKgotICAgICAgZWxzZQotCSRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCi0JJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgotCW9sZGxpYnM9IiRvbGRsaWJzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0KLQkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCi0Jb2xkb2Jqcz0iJG9ianMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgotCW5hbWVfc2F2ZT0kbmFtZQotCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQotCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQotCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKLQltYWpvcl9zYXZlPSRtYWpvcgotCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCi0JIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCi0JIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/Ci0JcmVsZWFzZT0iIgotCXZlcnN1ZmZpeD0iIgotCW1ham9yPSIiCi0JbmV3ZGVwbGlicz0KLQlkcm9wcGVkZGVwcz1ubwotCWNhc2UgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgaW4KLQlwYXNzX2FsbCkKLQkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKLQkJICAgIDs7ICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgotCQkgICAgICAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjawotCQkgICAgICAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgotCQkgICAgICAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0Ci0JCSAgICAgICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvdXIuCi0JdGVzdF9jb21waWxlKQotCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKLQkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0Ci0JICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjawotCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCi0JICAkcm0gY29uZnRlc3QuYwotCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1FT0YKLQkgICRybSBjb25mdGVzdAotCSAgJENfY29tcGlsZXIgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGlicwotCSAgaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KLQkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgotCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQlkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQlzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCWRlcGxpYl9tYXRjaD0kMgotCQlpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICBlY2hvCi0JCSAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGkuIgotCQkgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICAjIEVycm9yIG9jY3VyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZSB0aGUgc2l0dWF0aW9uOgotCSAgICAjIENvbXBpbGUgYSBzZXBlcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIG5hbWU9ImBleHByICRpIDogJy1sXCguKlwpJ2AiCi0JICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JCSRybSBjb25mdGVzdAotCQkkQ19jb21waWxlciAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpCi0JCSMgRGlkIGl0IHdvcms/Ci0JCWlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCi0JCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCQkgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQkgICAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJICAgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXMKLQkJICAgIGRlcGxpYl9tYXRjaD0kMgotCQkgICAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICAgIGVsc2UKLQkJICAgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICAgIGVjaG8KLQkJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGkuIgotCQkgICAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCQkgICAgZmkKLQkJZWxzZQotCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgIGVjaG8KLQkJICBlY2hvICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCi0JCSAgZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKLQkJICBlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgotCQkgIGVjaG8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCi0JCWZpCi0JICAgICAgZWxzZQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBmaQotCSAgZGVwbGlicz0kbmV3ZGVwbGlicwotCSAgOzsKLQlmaWxlX21hZ2ljKikKLQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKLQkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcIiQyIFwoLipcKVwiYCIKLQkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgICAgbmFtZT0iYGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AiCi0JICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JICAgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCSAgICAgIGZvciBpIGluICRsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICAgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KLQkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGxpYiIgMj4vZGV2L251bGwgXAotCQkJIHwgZ3JlcCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgotCQkJY29udGludWUgCi0JCSAgICAgIGZpCi0JCSAgICAgICMgVGhlIHN0YXRlbWVudCBhYm92ZSB0cmllcyB0byBhdm9pZCBlbnRlcmluZyBhbgotCQkgICAgICAjIGVuZGxlc3MgbG9vcCBiZWxvdywgaW4gY2FzZSBvZiBjeWNsaWMgbGlua3MuCi0JCSAgICAgICMgV2UgbWlnaHQgc3RpbGwgZW50ZXIgYW4gZW5kbGVzcyBsb29wLCBzaW5jZSBhIGxpbmsKLQkJICAgICAgIyBsb29wIGNhbiBiZSBjbG9zZWQgd2hpbGUgd2UgZm9sbG93IGxpbmtzLAotCQkgICAgICAjIGJ1dCBzbyB3aGF0PwotCQkgICAgICBwb3RsaWI9IiRwb3RlbnRfbGliIgotCQkgICAgICB3aGlsZSB0ZXN0IC1oICIkcG90bGliIiAyPi9kZXYvbnVsbDsgZG8KLQkJCXBvdGxpYmxpbms9YGxzIC1sZCAkcG90bGliIHwgc2VkICdzLy4qIC0+IC8vJ2AKLQkJCWNhc2UgIiRwb3RsaWJsaW5rIiBpbgotCQkJLyopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKLQkJCSopIHBvdGxpYj1gJGVjaG8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKLQkJCWVzYWMKLQkJICAgICAgZG9uZQotCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgXAotCQkJIHwgc2VkIDEwcSBcCi0JCQkgfCBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCQlhX2RlcGxpYj0iIgotCQkJYnJlYWsgMgotCQkgICAgICBmaQotCQkgICAgZG9uZQotCSAgICAgIGRvbmUKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlkcm9wcGVkZGVwcz15ZXMKLQkJZWNobwotCQllY2hvICIqKiogV2FybmluZzogVGhpcyBsaWJyYXJ5IG5lZWRzIHNvbWUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSAkYV9kZXBsaWIuIgotCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgZmkKLQkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCi0JICA7OwotCW5vbmUgfCB1bmtub3duIHwgKikgbmV3ZGVwbGlicz0iIgotCSAgaWYgJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAotCSAgICAgICAtZSAncy8gLVtMUl1bXiBdKi8vZycgLWUgJ3MvWyAJXS8vZycgfAotCSAgICAgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgZWNobwotCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCi0JICAgIGVsc2UKLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgotCSAgICBmaQotCSAgICBlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKLQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JICBmaQotCSAgOzsKLQllc2FjCi0JdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQotCW1ham9yPSRtYWpvcl9zYXZlCi0JcmVsZWFzZT0kcmVsZWFzZV9zYXZlCi0JbGlibmFtZT0kbGlibmFtZV9zYXZlCi0JbmFtZT0kbmFtZV9zYXZlCi0KLQlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICBlY2hvCi0JICAgIGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgotCSAgICBlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKLQkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCi0JICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKLQkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgICAgICBlY2hvCi0JICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgICBlbHNlCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGZpCi0JICAgIGRsbmFtZT0KLQkgICAgbGlicmFyeV9uYW1lcz0KLQkgIGVsc2UKLQkgICAgZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKLQkgICAgZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKLQkgICAgZWNobyAiKioqIG9yIGlzIGRlY2xhcmVkIHRvIC1kbG9wZW4gaXQuIgotCSAgZmkKLQlmaQotICAgICAgZmkKLQotICAgICAgIyB0ZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlkZXBsaWJzPSRuZXdkZXBsaWJzCi0JIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCi0gCi0JIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0JZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JcmVhbG5hbWU9IiQyIgotCXNoaWZ0OyBzaGlmdAotCi0JaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCWVsc2UKLQkgIHNvbmFtZT0iJHJlYWxuYW1lIgotCWZpCi0KLQlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0JIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIC5vIG9iamVjdHMgZm9yIGxpbmtlcnMgd2hpY2ggZGlzbGlrZSAubG8KLQkjIChlLmcuIGFpeCkgaW5jYXNlIHdlIGFyZSBydW5uaW5nIC0tZGlzYWJsZS1zdGF0aWMKLQlmb3Igb2JqIGluICRsaWJvYmpzOyBkbwotCSAgb2xkb2JqPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIHRlc3QgLWYgJG9sZG9iaiB8fCAke0xOX1N9ICRvYmogJG9sZG9iagotCWRvbmUKLQotCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCi0JdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0KLQlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCSAgZmkKLQllbHNlCi0JICBmb3IgeGxpYiBpbiAkY29udmVuaWVuY2U7IGRvCi0JICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLQkgICAgeGRpcj0iJHhsaWIieAotCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJHhkaXIiCi0JICAgIHhsaWI9YCRlY2hvICJYJHhsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCSAgICAkc2hvdyAiJHtybX1yICR4ZGlyIgotCSAgICAkcnVuICR7cm19ciAiJHhkaXIiCi0JICAgICRzaG93ICJta2RpciAkeGRpciIKLQkgICAgJHJ1biBta2RpciAiJHhkaXIiCi0JICAgIHN0YXR1cz0kPwotCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkeGRpciI7IHRoZW4KLQkgICAgICBleGl0ICRzdGF0dXMKLQkgICAgZmkKLQkgICAgJHNob3cgIihjZCAkeGRpciAmJiAkQVIgeCAuLi8keGxpYikiCi0JICAgICRydW4gZXZhbCAiKGNkIFwkeGRpciAmJiAkQVIgeCAuLi9cJHhsaWIpIiB8fCBleGl0ICQ/Ci0KLQkgICAgbGlib2Jqcz0iJGxpYm9ianMgImBmaW5kICR4ZGlyIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKLQkgIGRvbmUKLQlmaQotCi0JaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCi0KLQkgIGxpbmtvcHRzPSIkbGlua29wdHMgJGZsYWciCi0JZmkKLQotCSMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgaWYgdGVzdCAiJGFsd2F5c19leHBvcnRfc3ltYm9scyIgPSB5ZXMgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb2JqZGlyLyRsaWJuYW1lLmV4cCIKLQkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGV2YWwgY21kcz1cIiRleHBvcnRfc3ltYm9sc19jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRzaG93ICJlZ3JlcCAtZSBcIiRleHBvcnRfc3ltYm9sc19yZWdleFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIgPiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIgotCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKLQkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKLQlmaQotCi0JIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICBldmFsIGNtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCi0JZWxzZQotCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfY21kc1wiCi0JZmkKLQlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCWZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgICRzaG93ICIkY21kIgotCSAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCi0JIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KLQlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KLQkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KLQkgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCSAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/Ci0JICBmaQotCWRvbmUKLQotCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgotCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCi0JICBkbG5hbWU9IiRzb25hbWUiCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgKi5sbyB8ICoubyB8ICoub2JqKQotICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBsaW5rIGxpYnRvb2wgbGlicmFyaWVzIGludG8gb2JqZWN0cyIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgICAqLmxvKQotCWlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCWxpYm9iaj0iJG91dHB1dCIKLQlvYmo9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCTs7Ci0gICAgICAqKQotCWxpYm9iaj0KLQlvYmo9IiRvdXRwdXQiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgotICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotICAgICAgcmVsb2FkX29ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSQnL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0KLSAgICAgIG91dHB1dD0iJG9iaiIKLSAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KLSAgICAgIHRlc3QgLXogIiRsaWJvYmoiICYmIGV4aXQgMAotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQkjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAotCSMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0JJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPwotCWV4aXQgMAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0JcmVsb2FkX29ianM9IiRsaWJvYmpzIgotCW91dHB1dD0iJGxpYm9iaiIKLQlldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotCUlGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0gICAgICBlbHNlCi0JIyBKdXN0IGNyZWF0ZSBhIHN5bWxpbmsuCi0JJHNob3cgJHJtICRsaWJvYmoKLQkkcnVuICRybSAkbGlib2JqCi0JJHNob3cgIiRMTl9TICRvYmogJGxpYm9iaiIKLQkkcnVuICRMTl9TICRvYmogJGxpYm9iaiB8fCBleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0KLSAgICAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KLSAgICAqKQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkZGxvcGVuIiA9IHVua25vd24gJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gJiYKLQkgICB0ZXN0ICIkZGxvcGVuX3NlbGZfc3RhdGljIiA9IHVua25vd247IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgQUNfTElCVE9PTF9ETE9QRU4nIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCi0JZmkgCi0gICAgICBmaQotICAgIAotICAgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXMgJiYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IG5vOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IFxgLWRsb3BlbiBzZWxmJyByZXF1aXJlcyBcYC1leHBvcnQtZHluYW1pYyciIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCi0gICAgICBycGF0aD0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KLQlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCSAgICAgIGNhc2UgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgaW4KLQkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCTs7Ci0JICAgICAgKikKLQkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZWxzZQotCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3Blcm1fcnBhdGg9IiRmaW5hbGl6ZV9wZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgotCi0gICAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIlgkb3V0cHV0X29iamRpciIgPSAiWCRvdXRwdXQiOyB0aGVuCi0Jb3V0cHV0X29iamRpcj0iJG9iamRpciIKLSAgICAgIGVsc2UKLQlvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBkbHN5bXM9Ci0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgotCWlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgIGRsc3ltcz0iJHtvdXRwdXRuYW1lfVMuYyIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KLQljYXNlICIkZGxzeW1zIiBpbgotCSIiKSA7OwotCSouYykKLQkgICMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCi0JICBubGlzdD0iJG9iamRpci8ke291dHB1dH0ubm0iCi0KLQkgIGlmIHRlc3QgLWQgJG9iamRpcjsgdGhlbgotCSAgICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgotCSAgICAkcnVuICRybSAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgotCSAgZWxzZQotCSAgICAkc2hvdyAiJG1rZGlyICRvYmpkaXIiCi0JICAgICRydW4gJG1rZGlyICRvYmpkaXIKLQkgICAgc3RhdHVzPSQ/Ci0JICAgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgJG9iamRpcjsgdGhlbgotCSAgICAgIGV4aXQgJHN0YXR1cwotCSAgICBmaQotCSAgZmkKLQotCSAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KLQkgICRzaG93ICJjcmVhdGluZyAkb2JqZGlyLyRkbHN5bXMiCi0KLQkgICRlY2hvID4gIiRvYmpkaXIvJGRsc3ltcyIgIlwKLS8qICRkbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiBcIkNcIiB7Ci0jZW5kaWYKLQotLyogUHJldmVudCB0aGUgb25seSBraW5kIG9mIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3ZSBjYW4gbWFrZS4gKi8KLSNkZWZpbmUgbHRfcHJlbG9hZGVkX3N5bWJvbHMgc29tZV9vdGhlcl9zeW1ib2wKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCSAgaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCi0KLQkgICAgZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCi0KLQkgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgotCSAgICBwcm9nZmlsZXM9YCRlY2hvICJYJG9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQkgICAgZm9yIGFyZyBpbiAkcHJvZ2ZpbGVzOyBkbwotCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgICBkb25lCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCSAgICAKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCi0JICAgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JICAgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgICAgICBleHBvcnRfc3ltYm9scz0iJG9iamRpci8kb3V0cHV0LmV4cCIKLQkgICAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgICAkcnVuIGV2YWwgInNlZCAtbiAtZSAnL146IEBQUk9HUkFNQCQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGVsc2UKLQkgICAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgICAkcnVuIGV2YWwgInNlZCAtZSAncy9cKFtdWy4qXiRdXCkvXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG9iamRpci8kb3V0cHV0LmV4cCInCi0JICAgICAgJHJ1biBldmFsICdncmVwIC1mICIkb2JqZGlyLyRvdXRwdXQuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCSAgZmkKLQotCSAgZm9yIGFyZyBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCi0JICAgIG5hbWU9YGVjaG8gIiRhcmciIHwgc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgICRydW4gZXZhbCAnZWNobyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJwotCSAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgotCSAgICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgZWdyZXAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVAotCSAgICAgICRtdiAiJG5saXN0IlQgIiRubGlzdCIKLQkgICAgZmkKLQotCSAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotCSAgICBpZiBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgfCBzb3J0ICsyIHwgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIDoKLQkgICAgZWxzZQotCSAgICAgIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCi0JICAgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyInCi0JICAgIGVsc2UKLQkgICAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQkgICAgZmkKLQotCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLQotI3VuZGVmIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXtcCi0iCi0KLQkgICAgc2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1wiXDFcIiwgKGx0X3B0cl90KSAwfSwvcCcgXAotCQktZSAncy9eLiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC9wJyBcCi0JCSAgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQotCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLS8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLwotI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAotc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKLSAgcmV0dXJuIGx0X3ByZWxvYWRlZF9zeW1ib2xzOwotfQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmXAotIgotCSAgZmkKLQotCSAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQotICAgICAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCi0JICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKLQkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKLQkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgotCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KLQkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqKQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLXN0YXRpYyAiKikgOzsKLQkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1EUElDIC1ERlJFRUJTRF9XT1JLQVJPVU5EIjs7Ci0JICAgIGVzYWMKLQkgIGVzYWMKLQotCSAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLQkgICRzaG93ICIoY2QgJG9iamRpciAmJiAkQ19jb21waWxlciAtYyRub19idWlsdGluX2ZsYWckcGljX2ZsYWdfZm9yX3N5bXRhYmxlIFwiJGRsc3ltc1wiKSIKLQkgICRydW4gZXZhbCAnKGNkICRvYmpkaXIgJiYgJENfY29tcGlsZXIgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/Ci0KLQkgICMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCi0JICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG9iamRpci8ke291dHB1dH1TLiR7b2JqZXh0fSUiYAotCSAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG9iamRpci8ke291dHB1dH1TLiR7b2JqZXh0fSUiYAotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KLQkjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCi0JIyByZWFsbHkgd2FzIHJlcXVpcmVkLgotCi0JIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLXogIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIiB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0KLQkjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KLQkkc2hvdyAiJGxpbmtfY29tbWFuZCIKLQkkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiCi0JZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCi0JcnBhdGg9Ci0JZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KLQkgIGNhc2UgIiRkaXIiIGluCi0JICAvKiB8IFtBLVphLXpdOlsvXFxdKikKLQkgICAgIyBBYnNvbHV0ZSBwYXRoLgotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIFJlbGF0aXZlIHBhdGg6IGFkZCBhIHRoaXNkaXIgZW50cnkuCi0JICAgIHJwYXRoPSIkcnBhdGhcJHRoaXNkaXIvJGRpcjoiCi0JICAgIDs7Ci0JICBlc2FjCi0JZG9uZQotCXRlbXBfcnBhdGg9IiRycGF0aCIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGNvbXBpbGVfdmFyPQotICAgICAgZmluYWxpemVfdmFyPQotICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JCi0JIyBBR0ghIEZsYW1lIHRoZSBBSVggYW5kIEhQLVVYIHBlb3BsZSBmb3IgbWUsIHdpbGwgeWE/Ci0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIgMT4mMgotICAgICAgZWxzZQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiICE9IG5vOyB0aGVuCi0JICBsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkY29tcGlsZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCi0JICBlbHNlCi0JICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcwotCSAgICByZWxpbmtfY29tbWFuZD0KLQkgIGZpCi0JZWxzZQotCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICBsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCi0gICAgICAKLSAgICAgICMgQ3JlYXRlIHRoZSBiaW5hcnkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIHRoZW4gd3JhcCBpdC4KLSAgICAgIGlmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCi0JJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvYmpkaXI7IHRoZW4KLQkgIGV4aXQgJHN0YXR1cwotCWZpCi0gICAgICBmaQotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgotICAgICAgJHJ1biAkcm0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQotCi0gICAgICAkc2hvdyAiJGxpbmtfY29tbWFuZCIKLSAgICAgICRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPwotCi0gICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQlyZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBRdW90ZSAkZWNobyBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0ICJYJGVjaG8iID0gIlgkU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotCWNhc2UgIiQwIiBpbgotCS8qIHwgW0EtWmEtel06Wy9cXF0qKSBxZWNobz0iJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7OwotCSopIHFlY2hvPSIkU0hFTEwgYHB3ZGAvJDAgLS1mYWxsYmFjay1lY2hvIjs7Ci0JZXNhYwotCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBlbHNlCi0JcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcwotCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCi0JY2FzZSAkb3V0cHV0IGluCi0JICAqLmV4ZSkgb3V0cHV0PWBlY2hvICRvdXRwdXR8c2VkICdzLC5leGUkLCwnYCA7OwotCWVzYWMKLQkkcm0gJG91dHB1dAotCXRyYXAgIiRybSAkb3V0cHV0OyBleGl0IDEiIDEgMiAxNQotCi0JJGVjaG8gPiAkb3V0cHV0ICJcCi0jISAkU0hFTEwKLQotIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCi0jIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLSMKLSMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0jIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCBcIlwke0NEUEFUSCtzZXR9XCIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKLQotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgotCi0jIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCi1pZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKLSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0nJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMnCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgIGVjaG89XCIkcWVjaG9cIgotICAgIGZpbGU9XCJcJDBcIgotICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCi0gICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gICAgICBzaGlmdAotICAgIGVsaWYgdGVzdCBcIlhcYChcJGVjaG8gJ1x0JykgMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KLSAgICAgICMgWWlwcGVlLCBcJGVjaG8gd29ya3MhCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJGVjaG8gd2lsbCB3b3JrLgotICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9Ci0gICAgZmkKLSAgZmlcCi0iCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCi0gIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCi0gIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KLQotICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KLSAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIC8qIHwgW0EtWmEtel06Wy9cXF0qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKLSAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotCi0gICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKLSAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIGRvbmUKLQotICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgotICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCi0gIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCi0iCi0KLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJwotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotICAKLSAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8IFxcCi0gICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCBzZWQgMXFcYDsgXFwKLSAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgotCi0gICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKLQotICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCi0gICAgICAkbWtkaXIgXCJcJHByb2dkaXJcIgotICAgIGVsc2UKLSAgICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICAgIGZpIgotCi0JICBlY2hvID4+ICRvdXRwdXQgIlwKLQotICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgotICAgICAgaWYgKGNkIFwiXCR0aGlzZGlyXCIgJiYgZXZhbCBcJHJlbGlua19jb21tYW5kKTsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0JZXhpdCAxCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfHwKLSAgICB7ICRybSBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsKLSAgICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfQotICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICBmaSIKLQllbHNlCi0JICBlY2hvID4+ICRvdXRwdXQgIlwKLSAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0iCi0JZmkKLQotCWVjaG8gPj4gJG91dHB1dCAiXAotCi0gIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCi0KLQkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KLQlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKLSAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCi0KLSAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKLSAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAotICAgICRzaGxpYnBhdGhfdmFyPVxgXCRlY2hvIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCi0KLSAgICBleHBvcnQgJHNobGlicGF0aF92YXIKLSIKLQlmaQotCi0JIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KLQlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAotICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICi0iCi0JZmkKLQotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgotIgotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyB8ICotKi1vczIqKQotCSAgIyB3aW4zMiBzeXN0ZW1zIG5lZWQgdG8gdXNlIHRoZSBwcm9nIHBhdGggZm9yIGRsbAotCSAgIyBsb29rdXAgdG8gd29yawotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgZXhlYyBcJHByb2dkaXJcXFxcXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0JKikKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgICMgRXhwb3J0IHRoZSBwYXRoIHRvIHRoZSBwcm9ncmFtLgotICAgICAgUEFUSD1cIlwkcHJvZ2RpcjpcJFBBVEhcIgotICAgICAgZXhwb3J0IFBBVEgKLQotICAgICAgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQllc2FjCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgXCRlY2hvIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifVwiCi0gICAgICBleGl0IDEKLSAgICBmaQotICBlbHNlCi0gICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgotICAgIFwkZWNobyBcIlwkMDogZXJyb3I6IFwkcHJvZ2Rpci9cJHByb2dyYW0gZG9lcyBub3QgZXhpc3RcIiAxPiYyCi0gICAgXCRlY2hvIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCi0gICAgZWNobyBcIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maVwKLSIKLQljaG1vZCAreCAkb3V0cHV0Ci0gICAgICBmaQotICAgICAgZXhpdCAwCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgotICAgIGZvciBvbGRsaWIgaW4gJG9sZGxpYnM7IGRvCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gY29udmVuaWVuY2U7IHRoZW4KLQlvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCWFkZGxpYnM9IiRjb252ZW5pZW5jZSIKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG1vZHVsZTsgdGhlbgotCSAgb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWVsc2UKLQkgIG9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2Jqc19zYXZlIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaQotCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCi0gICAgICBmaQotCi0gICAgICAjIEFkZCBpbiBtZW1iZXJzIGZyb20gY29udmVuaWVuY2UgYXJjaGl2ZXMuCi0gICAgICBmb3IgeGxpYiBpbiAkYWRkbGliczsgZG8KLQkjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0JeGRpcj0iJHhsaWIieAotCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkeGRpciIKLQl4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLQkkc2hvdyAiJHtybX1yICR4ZGlyIgotCSRydW4gJHtybX1yICIkeGRpciIKLQkkc2hvdyAibWtkaXIgJHhkaXIiCi0JJHJ1biBta2RpciAiJHhkaXIiCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotCSRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggLi4vJHhsaWIpIgotCSRydW4gZXZhbCAiKGNkIFwkeGRpciAmJiAkQVIgeCAuLi9cJHhsaWIpIiB8fCBleGl0ICQ/Ci0KLQlvbGRvYmpzPSIkb2xkb2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotICAgICAgZG9uZQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXCIKLSAgICAgIGVsc2UKLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0gICAgICBmaQotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZ2VuZXJhdGVkIjsgdGhlbgotICAgICAgJHNob3cgIiR7cm19ciRnZW5lcmF0ZWQiCi0gICAgICAkcnVuICR7cm19ciRnZW5lcmF0ZWQKLSAgICBmaQotCi0gICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAqLmxhKQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JdGVtcF94cnBhdGg9Ci0JZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbwotCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCi0JZG9uZQotCWRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JJGVjaG8gPiAkb3V0cHV0ICJcCi0jICRvdXRwdXQgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLQotIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCi1kbG5hbWU9JyRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCi1jdXJyZW50PSRjdXJyZW50Ci1hZ2U9JGFnZQotcmV2aXNpb249JHJldmlzaW9uCi0KLSMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PwotaW5zdGFsbGVkPW5vCi0KLSMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKLWxpYmRpcj0nJGluc3RhbGxfbGliZGlyJ1wKLSIKLQotCSRybSAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQotCXNlZCAncy9eaW5zdGFsbGVkPW5vJC9pbnN0YWxsZWQ9eWVzLycgXAotCSAgPCAiJG91dHB1dCIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaSB8fCBleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KLSAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCi0gICAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSkiCi0gICAgICAkcnVuIGV2YWwgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIiB8fCBleGl0ICQ/Ci0gICAgICA7OwotICAgIGVzYWMKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBpbnN0YWxsIG1vZGUKLSAgaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBpbnN0YWxsIgotCi0gICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgotICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoOyB0aGVuCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgIGluc3RhbGxfcHJvZz0KLSAgICAgIGFyZz0iJG5vbm9wdCIKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAiJGFyZyIgaW4KLSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLSAgICAgIGFyZz0iXCIkYXJnXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckYXJnIgotCi0gICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgotICAgIGRlc3Q9Ci0gICAgZmlsZXM9Ci0gICAgb3B0cz0KLSAgICBwcmV2PQotICAgIGluc3RhbGxfdHlwZT0KLSAgICBpc2Rpcj1ubwotICAgIHN0cmlwbWU9Ci0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KLQlmaWxlcz0iJGZpbGVzICRkZXN0IgotCWRlc3Q9IiRhcmciCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtZCkgaXNkaXI9eWVzIDs7Ci0gICAgICAtZikgcHJldj0iLWYiIDs7Ci0gICAgICAtZykgcHJldj0iLWciIDs7Ci0gICAgICAtbSkgcHJldj0iLW0iIDs7Ci0gICAgICAtbykgcHJldj0iLW8iIDs7Ci0gICAgICAtcykKLQlzdHJpcG1lPSIgLXMiCi0JY29udGludWUKLQk7OwotICAgICAgLSopIDs7Ci0KLSAgICAgICopCi0JIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgotCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCSAgcHJldj0KLQllbHNlCi0JICBkZXN0PSIkYXJnIgotCSAgY29udGludWUKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCi0gICAgICBlbHNlCi0JJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIiAxPiYyCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCi0gICAgZGVzdD1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvJCUlJ2AKLQotICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgotICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKLSAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCi0gICAgICBkZXN0ZGlyPSIkZGVzdCIKLSAgICAgIGRlc3RuYW1lPQotICAgIGVsc2UKLSAgICAgIGRlc3RkaXI9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRkZXN0IiAmJiBkZXN0ZGlyPS4KLSAgICAgIGRlc3RuYW1lPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KLSAgICAgIHNldCBkdW1teSAkZmlsZXMKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgZmkKLSAgICBjYXNlICIkZGVzdGRpciIgaW4KLSAgICAvKiB8IFtBLVphLXpdOlsvXFxdKikgOzsKLSAgICAqKQotICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCWNhc2UgIiRmaWxlIiBpbgotCSoubG8pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCi0gICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCi0KLSAgICBzdGF0aWNsaWJzPQotICAgIGZ1dHVyZV9saWJkaXJzPQotICAgIGN1cnJlbnRfbGliZGlycz0KLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0KLSAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCi0gICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgICouYSB8ICoubGliKQotCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCi0Jc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgIiRmaWxlIiBpbgotCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkqKSAuIC4vJGZpbGUgOzsKLQllc2FjCi0KLQkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCi0JaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KLQkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OwotCSAgZXNhYwotCWVsc2UKLQkgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KLQkgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZnV0dXJlX2xpYmRpcnM9IiRmdXR1cmVfbGliZGlycyAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0KLQlkaXI9ImAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLyIKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQotCWRpcj0iJGRpciRvYmpkaXIiCi0KLQkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCWlmIHRlc3QgLW4gIiQyIjsgdGhlbgotCSAgcmVhbG5hbWU9IiQyIgotCSAgc2hpZnQKLQkgIHNoaWZ0Ci0KLQkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KLQkgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJHJlYWxuYW1lIiAmJiBkbG5hbWU9Ci0KLQkgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLQkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KLQkgICAgZm9yIGxpbmtuYW1lCi0JICAgIGRvCi0JICAgICAgdGVzdCAiWCRkbG5hbWUiID0gIlgkbGlua25hbWUiICYmIGRsbmFtZT0KLQkgICAgICBpZiB0ZXN0ICIkbGlua25hbWUiICE9ICIkcmVhbG5hbWUiOyB0aGVuCi0JCSRzaG93ICIoY2QgJGRlc3RkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkJJHJ1biBldmFsICIoY2QgJGRlc3RkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotCSAgICAjIEluc3RhbGwgdGhlIGR5bmFtaWNhbGx5LWxvYWRhYmxlIGxpYnJhcnkuCi0JICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIgotCSAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lICRkZXN0ZGlyLyRkbG5hbWUiIHx8IGV4aXQgJD8KLQkgIGZpCi0KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLQkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgZXZhbCBjbWRzPVwiJHBvc3RpbnN0YWxsX2NtZHNcIgotCSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0JbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKLQlpZiB0ZXN0ICEgLWYgIiRpbnN0bmFtZSI7IHRoZW4KLQkgICMgSnVzdCBpbiBjYXNlIGl0IHdhcyByZW1vdmVkLi4uCi0JICAkc2hvdyAiQ3JlYXRpbmcgJGluc3RuYW1lIgotCSAgJHJtICIkaW5zdG5hbWUiCi0JICBzZWQgJ3MvXmluc3RhbGxlZD1ubyQvaW5zdGFsbGVkPXllcy8nICIkZmlsZSIgPiAiJGluc3RuYW1lIgotCWZpCi0JJHNob3cgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIgotCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiIHx8IGV4aXQgJD8KLQotCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KLQl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCi0KLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQljYXNlICIkZGVzdGZpbGUiIGluCi0JKi5sbykKLQkgIHN0YXRpY2Rlc3Q9YCRlY2hvICJYJGRlc3RmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICA7OwotCSoubyB8ICoub2JqKQotCSAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgotCSAgZGVzdGZpbGU9Ci0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RmaWxlIjsgdGhlbgotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgfHwgZXhpdCAkPwotCWZpCi0KLQkjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KLQlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCSAgc3RhdGljb2JqPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRzdGF0aWNvYmogJHN0YXRpY2Rlc3QiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiB8fCBleGl0ICQ/Ci0JZmkKLQlleGl0IDAKLQk7OwotCi0gICAgICAqKQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPQotCSAgcmVsaW5rX2NvbW1hbmQ9Ci0KLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAiJGZpbGUiIGluCi0JICAqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JICAqKSAuIC4vJGZpbGUgOzsKLQkgIGVzYWMKLQotCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCi0JICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJGZpbGUnIiAxPiYyCi0JICAgIGV4aXQgMQotCSAgZmkKLQotCSAgZmluYWxpemU9eWVzCi0JICBmb3IgbGliIGluICRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzOyBkbwotCSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCi0JICAgIGxpYmRpcj0KLQkgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KLQkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgICAgICBjYXNlICIkbGliIiBpbgotCSAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OwotCSAgICAgICopIC4gLi8kbGliIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICBsaWJmaWxlPSIkbGliZGlyL2AkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgIgotCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIiAxPiYyCi0JICAgICAgZmluYWxpemU9bm8KLQkgICAgZmkKLQkgIGRvbmUKLQotCSAgb3V0cHV0bmFtZT0KLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzOyB0aGVuCi0JICAgICAgb3V0cHV0bmFtZT0iL3RtcC8kJC0kZmlsZSIKLQkgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKLQotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyBvbiBiZWhhbGYgb2YgeW91ciBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCi0JICAgICAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKLQkgICAgICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgotCSAgICAgIGVsc2UKLQkJJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCi0JCWNvbnRpbnVlCi0JICAgICAgZmkKLQkgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZScgb24gYmVoYWxmIG9mIHlvdXIgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgotCSAgICBmaQotCSAgZWxzZQotCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCi0JICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCi0JICBmaQotCWZpCi0KLQkkc2hvdyAiJGluc3RhbGxfcHJvZyRzdHJpcG1lICRmaWxlICRkZXN0ZmlsZSIKLQkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLQl0ZXN0IC1uICIkb3V0cHV0bmFtZSIgJiYgJHJtICRvdXRwdXRuYW1lCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgotICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKLQotICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKLSAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotICAgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0aW5zdGFsbF9jbWRzXCIKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgotICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KLSAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKLSAgICAgIGV4ZWMgJFNIRUxMICQwIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycwotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCi0gIGZpbmlzaCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCi0gICAgbGliZGlycz0iJG5vbm9wdCIKLSAgICBhZG1pbmNtZHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgotICAgICAgZm9yIGRpcgotICAgICAgZG8KLQlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgotICAgICAgZG9uZQotCi0gICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2NtZHNcIgotCSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kIgotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCi0JICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgotCSAgJHJ1biBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZHMiCi0JZmkKLSAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCi0gICAgdGVzdCAiJHNob3ciID0gOiAmJiBleGl0IDAKLQotICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICBlY2hvICIgICAkbGliZGlyIgotICAgIGRvbmUKLSAgICBlY2hvCi0gICAgZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCi0gICAgZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCi0gICAgZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIFxgLUxMSUJESVInIgotICAgIGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICBlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGxpYmRpcj1MSUJESVIKLSAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgotICAgIGZpCi0gICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgotICAgIGZpCi0gICAgZWNobwotICAgIGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgotICAgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgotICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCi0gIGV4ZWN1dGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKLQotICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0gICAgY21kPSIkbm9ub3B0IgotICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCi0gICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KLSAgICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgZGlyPQotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCi0JZGxuYW1lPQotCWxpYnJhcnlfbmFtZXM9Ci0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkZmlsZSIgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KLQkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0KLQlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQk7OwotCi0gICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KLSAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLSAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKLQotICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KLSAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgotICAgICAgZWxzZQotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKLSAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCi0KLSAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCi0gICAgYXJncz0KLSAgICBmb3IgZmlsZQotICAgIGRvCi0gICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgIC0qKSA7OwotICAgICAgKikKLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgIiRmaWxlIiBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCi0JICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgotICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBhcmdzPSIkYXJncyBcIiRmaWxlXCIiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLSAgICAgICMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgotICAgICAgZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotCi0gICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbWVudCB2YXJpYWJsZXMKLSAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQ19BTEw9IiRzYXZlX0xDX0FMTCI7IGV4cG9ydCBMQ19BTEwKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTEFORytzZXR9IiA9IHNldDsgdGhlbgotCUxBTkc9IiRzYXZlX0xBTkciOyBleHBvcnQgTEFORwotICAgICAgZmkKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KLSAgICAgIGV2YWwgImV4ZWMgXCRjbWQkYXJncyIKLQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGV4ZWMgXCRjbWQkYXJncyIKLSAgICAgIGV4aXQgMQotICAgIGVsc2UKLSAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCi0gICAgICBldmFsICJcJGVjaG8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgJGVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgICRlY2hvICIkY21kJGFyZ3MiCi0gICAgICBleGl0IDAKLSAgICBmaQotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIHVuaW5zdGFsbCBtb2RlCi0gIHVuaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiB1bmluc3RhbGwiCi0gICAgcm09IiRub25vcHQiCi0gICAgZmlsZXM9Ci0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtKikgcm09IiRybSAkYXJnIiA7OwotICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRybSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICBybWZpbGVzPSIkZmlsZSIKLQotICAgICAgY2FzZSAiJG5hbWUiIGluCi0gICAgICAqLmxhKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KLQlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIC4gJGRpci8kbmFtZQotCi0JICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgotCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG4iCi0JICAgIHRlc3QgIlgkbiIgPSAiWCRkbG5hbWUiICYmIGRsbmFtZT0KLQkgIGRvbmUKLQkgIHRlc3QgLW4gIiRkbG5hbWUiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJGRsbmFtZSIKLQkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCi0KLQkgICRzaG93ICIkcm0gJHJtZmlsZXMiCi0JICAkcnVuICRybSAkcm1maWxlcwotCi0JICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KLQkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgIGV2YWwgY21kcz1cIiRwb3N0dW5pbnN0YWxsX2NtZHNcIgotCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgICRzaG93ICIkY21kIgotCSAgICAgICRydW4gZXZhbCAiJGNtZCIKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3R1bmluc3RhbGxfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIgotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgZmkKLQotCSAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgIG9sZG9iaj1gJGVjaG8gIlgkbmFtZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkb2JqIgotCWZpCi0JJHNob3cgIiRybSAkcm1maWxlcyIKLQkkcnVuICRybSAkcm1maWxlcwotCTs7Ci0KLSAgICAgICopCi0JJHNob3cgIiRybSAkcm1maWxlcyIKLQkkcnVuICRybSAkcm1maWxlcwotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIiIpCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKLSAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0gIGVzYWMKLQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkgIyB0ZXN0IC16ICIkc2hvd19oZWxwIgotCi0jIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLWNhc2UgIiRtb2RlIiBpbgotIiIpICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLQotUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0KLSAgICAtLWNvbmZpZyAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotICAgIC0tZGVidWcgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLS1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcwotICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJwotICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KLSAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tdmVyc2lvbiAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLQotTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICBjb21waWxlICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAotICAgICAgZXhlY3V0ZSAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCi0gICAgICBmaW5pc2ggICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAgICAgaW5zdGFsbCAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCi0gICAgICBsaW5rICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCi0gICAgICB1bmluc3RhbGwgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKLQotTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yCi1hIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4iCi0gIGV4aXQgMAotICA7OwotCi1jb21waWxlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQotCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQotICAtc3RhdGljICAgICAgICAgICBhbHdheXMgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwotCi1DT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQotZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KLQotVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCi1TT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKLWxpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKLSAgOzsKLQotZXhlY3V0ZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KLQotQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCi0KLVRoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKLWZsYWdzLgotCi1JZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCi1pbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKLWRpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgotCi1UaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKLSAgOzsKLQotZmluaXNoKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCi0KLUNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCi0KLUVhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCi0KLVRoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQotdGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCi0gIDs7Ci0KLWluc3RhbGwpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgotCi1JbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KLQotSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCi1laXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KLQotVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKLUJTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgotICA7OwotCi1saW5rKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KLQotTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bwotY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCi1hIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQotVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6Ci0KLSAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCi0gIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQotICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKLSAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKLSAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKLSAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKLQkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQotICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCi0gIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCi0gIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAotICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKLSAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCi0gIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCi0gIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKLSAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKLSAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KLQkJICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KLQotQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KLQotRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKLXRyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5Ci1vYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAotb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcwotcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCi11c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKLWlzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCi0gIDs7Ci0KLXVuaW5zdGFsbCkKLSAgJGVjaG8KLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCi1PdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gIDs7Ci0KLSopCi0gICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1lY2hvCi0kZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvbWFrZWFsbC5iYXQgYi9tYWtlYWxsLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkNDE1Zi4uMDAwMDAwMAotLS0gYS9tYWtlYWxsLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUBlY2hvIG9mZg0KLWNoZGlyIGxpYmliZXJ0eQ0KLW1ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxiZmQNCi1tYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cb3Bjb2Rlcw0KLW1ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxncHJvZg0KLW1ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxiaW51dGlscw0KLW1ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxnYXMNCi1tYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cbGQNCi1tYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi4NCmRpZmYgLS1naXQgYS9tYWtlZmlsZS52bXMgYi9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTM2MzQuLjAwMDAwMDAKLS0tIGEvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIwotIyBtYWtlZmlsZSBmb3IgYmZkLCBiaW51dGlscyBhbmQgZ2FzCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLSMKLSMgWW91IG11c3QgdXNlIFZlcnNpb24gMy43NiBvZiBHTlUgTWFrZQotIwotIwotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotQ0MgPSBnY2MKLUdBU0NDID0gJChDQykKLWVsc2UKLUNDID0gY2MKLUdBU0NDID0gZ2NjCi1lbmRpZgotCi1pZmVxICgkKENDKSxjYykKLSAgQ0hFQ0stQ09NUElMRVIgPSBjaGVja19jb21waWxlcgotZWxzZQotICBDSEVDSy1DT01QSUxFUiA9Ci1lbmRpZgotCi1hbGw6CWNoZWNrX2NjICQoQ0hFQ0stQ09NUElMRVIpIFsuYmludXRpbHNdbWFrZWZpbGUudm1zCi0JJChDRCkgWy5iZmRdCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5vcGNvZGVzXQotCUBnbWFrZSAiQ0M9JChDQykiCi0JJChDRCkgWy0ubGliaWJlcnR5XQotCUBnbWFrZSAiQ0M9JChDQykiCi0JJChDRCkgWy0uYmludXRpbHNdCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5nYXNdCi0JQGdtYWtlICJDQz0kKEdBU0NDKSIKLQkkKENEKSBbLV0KLQotY2hlY2tfY2M6Ci1pZmVxICgkQ0MsKQotCUAkKEVDSE8pICJQbGVhc2UgZWRpdCBNQUtFRklMRS5WTVMgYW5kIHNlbGVjdCBhIEMgQ29tcGlsZXIuIgotCXN0b3AKLWVuZGlmCi0KLWNoZWNrX2NvbXBpbGVyOgotCUAkKEVDSE8pICJQZXJmb3JtIGEgJyQkIEBzZXR1cCcgYmVmb3JlIHN0YXJ0aW5nIG1ha2UiCi0KLVsuYmludXRpbHNdbWFrZWZpbGUudm1zOgotCSQoQ0QpIFsuYmludXRpbHNdCi0JJCQgQGNvbmZpZ3VyZQotCSQoQ0QpIFstXQotCi1pbnN0YWxsOiBhbGwKLQkkKENEKSBbLmJpbnV0aWxzXQotCUBnbWFrZSAiQ0M9JChDQykiIGluc3RhbGwKLQkkKENEKSBbLV0KLQkkKENEKSBbLmdhc10KLQlAZ21ha2UgIkNDPSQoR0FTQ0MpIiBpbnN0YWxsCi0JJChDRCkgWy1dCi0KLWNsZWFuOgotCSQoQ0QpIFsuYmZkXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstLm9wY29kZXNdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0ubGliaWJlcnR5XQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstLmJpbnV0aWxzXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstLmdhc10KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLV0KLQpkaWZmIC0tZ2l0IGEvbWlzc2luZyBiL21pc3NpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3ODk2NTIuLjAwMDAwMDAKLS0tIGEvbWlzc2luZworKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZyYW5jLG9pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0jIDAyMTExLTEzMDcsIFVTQS4KLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gIGV4aXQgMQotZmkKLQotY2FzZSAiJDEiIGluCi0KLSAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQotICAgIGVjaG8gIlwKLSQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgotCi1IYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCi1lcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCi0KLU9wdGlvbnM6Ci0gIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLQotU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgotICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCi0gIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJwotICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJwotICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCi0gIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLSAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdIgotICAgIDs7Ci0KLSAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQotICAgIGVjaG8gIm1pc3NpbmcgLSBHTlUgbGliaXQgMC4wIgotICAgIDs7Ci0KLSAgLSopCi0gICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCi0gICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgYWNsb2NhbCkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYGNvbmZpZ3VyZS5pbicuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQotICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGFjbG9jYWwubTQKLSAgICA7OwotCi0gIGF1dG9jb25mKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBjb25maWd1cmUuaW4nLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUKLSAgICAgICAgIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VCi0gICAgICAgICBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGNvbmZpZ3VyZQotICAgIDs7Ci0KLSAgYXV0b2hlYWRlcikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGBjb25maWd1cmUuaW4nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KLSAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyBjb25maWd1cmUuaW5gCi0gICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCi0gICAgdG91Y2hfZmlsZXM9Ci0gICAgZm9yIGYgaW4gJGZpbGVzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0gICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAotCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKLSAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgdG91Y2ggJHRvdWNoX2ZpbGVzCi0gICAgOzsKLQotICBhdXRvbWFrZSkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgTWFrZWZpbGUuYW0nLCBcYGFjaW5jbHVkZS5tNCcgb3IgXGBjb25maWd1cmUuaW4nLgotICAgICAgICAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuCi0gICAgICAgICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmluZCAuIC10eXBlIGYgLW5hbWUgTWFrZWZpbGUuYW0gLXByaW50IHwKLQkgICBzZWQgJ3MvXC5hbSQvLmluLycgfAotCSAgIHdoaWxlIHJlYWQgZjsgZG8gdG91Y2ggIiRmIjsgZG9uZQotICAgIDs7Ci0KLSAgYmlzb258eWFjYykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoueSkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmMKLQkgICAgZmkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2gvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmgKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmggXTsgdGhlbgotCWVjaG8gPnkudGFiLmgKLSAgICBmaQotICAgIGlmIFsgISAtZiB5LnRhYi5jIF07IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKLSAgICBmaQotICAgIDs7Ci0KLSAgbGV4fGZsZXgpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICIkTEFTVEFSRyIgaW4KLQkqLmwpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYwotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgbGV4Lnl5LmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+bGV4Lnl5LmMKLSAgICBmaQotICAgIDs7Ci0KLSAgbWFrZWluZm8pCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnRleGknIG9yIFxgLnRleGluZm8nIGZpbGUsIG9yIGFueSBvdGhlciBmaWxlCi0gICAgICAgICBpbmRpcmVjdGx5IGFmZmVjdGluZyB0aGUgYXNwZWN0IG9mIHRoZSBtYW51YWwuICBUaGUgc3B1cmlvdXMKLSAgICAgICAgIGNhbGwgbWlnaHQgYWxzbyBiZSB0aGUgY29uc2VxdWVuY2Ugb2YgdXNpbmcgYSBidWdneSBcYG1ha2UnIChBSVgsCi0gICAgICAgICBEVSwgSVJJWCkuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYFRleGluZm8nIHBhY2thZ2Ugb3IKLSAgICAgICAgIHRoZSBcYEdOVSBtYWtlJyBwYWNrYWdlLiAgR3JhYiBlaXRoZXIgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW8gXChbXiBdKlwpLiovXDEvcCdgCi0gICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCi0gICAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgJ3MvLiogXChbXiBdKlwpICokL1wxLydgCi0gICAgICBmaWxlPWBzZWQgLW4gJy9eQHNldGZpbGVuYW1lLyB7IHMvLiogXChbXiBdKlwpICokL1wxLzsgcDsgcTsgfScgJGZpbGVgCi0gICAgZmkKLSAgICB0b3VjaCAkZmlsZQotICAgIDs7Ci0KLSAgKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIHlvdSBkbyBub3Qgc2VlbSB0byBoYXZlIGl0IGhhbmR5IG9uIHlvdXIKLSAgICAgICAgIHN5c3RlbS4gIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCi0gICAgICAgICBwcm9wZXIgdG9vbHMgZm9yIGZ1cnRoZXIgaGFuZGxpbmcgdGhlbS4gIENoZWNrIHRoZSBcYFJFQURNRScgZmlsZSwKLSAgICAgICAgIGl0IG9mdGVuIHRlbGxzIHlvdSBhYm91dCB0aGUgbmVlZGVkIHByZXJlcXVpcmVtZW50cyBmb3IgaW5zdGFsbGluZwotICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKLSAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi1leGl0IDAKZGlmZiAtLWdpdCBhL21raW5zdGFsbGRpcnMgYi9ta2luc3RhbGxkaXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg3ODNlLi4wMDAwMDAwCi0tLSBhL21raW5zdGFsbGRpcnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jISAvYmluL3NoCi0jIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQotIyBBdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KLSMgQ3JlYXRlZDogMTk5My0wNS0xNgotIyBMYXN0IG1vZGlmaWVkOiAxOTk0LTAzLTI1Ci0jIFB1YmxpYyBkb21haW4KLQotZXJyc3RhdHVzPTAKLQotZm9yIGZpbGUgaW4gJHsxKyIkQCJ9IDsgZG8gCi0gICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAotICAgc2hpZnQKLQotICAgcGF0aGNvbXA9Ci0gICBmb3IgZCBpbiAkezErIiRAIn0gOyBkbwotICAgICBwYXRoY29tcD0iJHBhdGhjb21wJGQiCi0gICAgIGNhc2UgIiRwYXRoY29tcCIgaW4KLSAgICAgICAtKiApIHBhdGhjb21wPS4vJHBhdGhjb21wIDs7Ci0gICAgIGVzYWMKLQotICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLSAgICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIiAxPiYyCi0gICAgICAgIG1rZGlyICIkcGF0aGNvbXAiID4gL2Rldi9udWxsIDI+JjEgfHwgbGFzdGVycj0kPwotICAgICBmaQotCi0gICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotCWVycnN0YXR1cz0kbGFzdGVycgotICAgICBmaQotCi0gICAgIHBhdGhjb21wPSIkcGF0aGNvbXAvIgotICAgZG9uZQotZG9uZQotCi1leGl0ICRlcnJzdGF0dXMKLQotIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvbW92ZS1pZi1jaGFuZ2UgYi9tb3ZlLWlmLWNoYW5nZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUxYjM0OC4uMDAwMDAwMAotLS0gYS9tb3ZlLWlmLWNoYW5nZQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotaWYKLXRlc3QgLXIgJDIKLXRoZW4KLWlmCi1jbXAgJDEgJDIgPiAvZGV2L251bGwKLXRoZW4KLWVjaG8gJDIgaXMgdW5jaGFuZ2VkCi1ybSAtZiAkMQotZWxzZQotbXYgLWYgJDEgJDIKLWZpCi1lbHNlCi1tdiAtZiAkMSAkMgotZmkKZGlmZiAtLWdpdCBhL21wdy1SRUFETUUgYi9tcHctUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcxNDBiLi4wMDAwMDAwCi0tLSBhL21wdy1SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotVGhpcyBpcyBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTWFjaW50b3NoKHRtKSBNUFcodG0pIHBvcnQgb2YgdGhlCi1HTlUgdG9vbHMuICBUaGUgaW5mb3JtYXRpb24gYmVsb3cgYXBwbGllcyB0byBib3RoIG5hdGl2ZSBhbmQgY3Jvc3MKLWNvbXBpbGVycy4KLQotKFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgYXJlIHR3byB2ZXJzaW9ucyBvZiB0aGlzIGZpbGU7ICJtcHctUkVBRE1FIgotaXMgdGhlIHNvdXJjZSBmb3JtLCBhbmQgIlJlYWQgTWUgZm9yIE1QVyIgaXMgdGhlIGRpc3RyaWJ1dGlvbiBmb3JtLgotIlJlYWQgTWUgZm9yIE1QVyIgaGFzIDgtYml0IGNoYXJzIHN1Y2ggYXMgXE9wdGlvbi1kIGVtYmVkZGVkIGluIGl0LikKLQotSU5TVEFMTElORyBHTlUgVE9PTFMKLQotKiBTeXN0ZW0gUmVxdWlyZW1lbnRzCi0KLVRvIHVzZSB0aGVzZSB0b29scywgeW91IHdpbGwgbmVlZCBhIE1hYyB3aXRoIGEgNjgwMjAgb3IgYmV0dGVyIG9yIGVsc2UKLWFueSBQb3dlck1hYywgU3lzdGVtIDcuMSBvciBsYXRlciwgYW5kIE1QVyAzLjMgb3IgMy40LiAgWW91IHdpbGwgKm5vdCoKLW5lZWQgYW55IG90aGVyIE1QVyBjb21waWxlciB1bmxlc3MgeW91IHdhbnQgdG8gcmVidWlsZCBmcm9tIHNvdXJjZXMsCi1ub3IgZXZlbiBhbnkgaW5jbHVkZSBmaWxlcywgdW5sZXNzIHlvdSBhcmUgYnVpbGRpbmcgYWN0dWFsIE1hYwotYXBwbGljYXRpb25zLiAgRm9yIFBvd2VyTWFjIG5hdGl2ZSB5b3Ugd2lsbCBuZWVkIFBQQ0xpbmssIGhvd2V2ZXI7Ci1hbHNvIHRoZSBleGVjdXRhYmxlcyBhcmUgUG93ZXJQQy1vbmx5LgotCi0qIEF1dG9tYXRlZCBJbnN0YWxsYXRpb24KLQotVGhlIHNpbXBsZXN0IHdheSB0byBpbnN0YWxsIEdOVSB0b29scyBpcyB0byBydW4gdGhlIEluc3RhbGwgc2NyaXB0LgotVGhlIHNjcmlwdCB3aWxsIGNvcHkgdGhpbmdzIHRvIHdoZXJlIHlvdSB3YW50IHRvIGtlZXAgdGhlbSwgd2lsbCBidWlsZAotYSBVc2VyU3RhcnR1cCBmaWxlIHdpdGggc2V0dGluZ3MgY29ycmVzcG9uZGluZyB0byB3aGVyZSB0aGluZ3Mgd2VyZQotY29waWVkLCBhbmQgb2ZmZXIgdG8gcHV0IHRoYXQgVXNlclN0YXJ0dXAgZmlsZSBpbiB5b3VyIE1QVyBmb2xkZXIuCi0KLVRoZSBJbnN0YWxsIHNjcmlwdCBkb2VzIG5vdCBhbHRlciBhbnl0aGluZyBpbiB0aGUgU3lzdGVtIEZvbGRlciwgYW5kCi1pdCBkb2VzIG5vdCB0YWtlIGFueSBhY3Rpb24gd2l0aG91dCBjb25maXJtYXRpb24uCi0KLVRoZSBJbnN0YWxsIHNjcmlwdCB3aWxsIGJlIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGJpbmFyeQotZGlzdHJpYnV0aW9uLCBvciBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBvYmplY3QgZGlyZWN0b3J5IGlmCi1yZWJ1aWxkaW5nIGZyb20gc291cmNlLiAgKFRoZSBzb3VyY2VzIGluY2x1ZGUgYSBmaWxlIGNhbGxlZAotIm1wdy1pbnN0YWxsIiBhdCB0aGUgdG9wIGxldmVsLCBidXQgaXQgaXMgdGhlIHNvdXJjZSB0byB0aGUgSW5zdGFsbAotc2NyaXB0IGFuZCBjYW5ub3QgYmUgcnVuIGRpcmVjdGx5LikKLQotKiBNYW51YWwgSW5zdGFsbGF0aW9uCi0KLUlmIHlvdSBkb24ndCB3YW50IHRvIHJ1biB0aGUgSW5zdGFsbCBzY3JpcHQsIHlvdSBjYW4gZG8gaW5zdGFsbGF0aW9uCi1tYW51YWxseTsgdGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgc3RlcHMgaW52b2x2ZWQuCi0KLVRoZSBHTlUgdG9vbHMgY2FuIGdvIGluIGFueSBkaXJlY3RvcnkgdGhhdCBpcyBpbiB5b3VyIHtDb21tYW5kc30gbGlzdC4KLVdlIGdlbmVyYWxseSBwdXQgYWxsIHRoZSB0b29scyBzb21ld2hlcmUgbGlrZSB7Qm9vdH1DeWdudXM6bGF0ZXN0OmJpbiwKLWFuZCB0aGVuIGFkZCB0byBhIFVzZXJTdGFydHVwIGZpbGU6Ci0KLQlzZXQgQ29tbWFuZHMgIntCb290fUN5Z251czpsYXRlc3Q6YmluOix7Q29tbWFuZHN9IgotCi1Ib3dldmVyLCB0aGUgY3BwIGFuZCBjYzEgcHJvZ3JhbXMgb2YgR0NDIGFyZSBub3Qgbm9ybWFsbHkgc3RvcmVkIGhlcmUuCi1JbnN0ZWFkLCB0aGV5IHdpbGwgYmUgaW4gYSAibGliIiBkaXJlY3RvcnkgdGhhdCBpcyBhbG9uZ3NpZGUgImJpbiIsCi1hbmQgb3JnYW5pemVkIGJ5IHRhcmdldCBhbmQgdmVyc2lvbiB1bmRlcm5lYXRoLCB3aXRoIG5hbWVzIGxpa2UKLQotCTpsaWI6Z2NjLWxpYjo8dGFyZ2V0PjpjeWdudXMtPHZlcnNpb24+OgotCi1JZiB5b3UgYnVpbGQgYW5kIGluc3RhbGwgZXZlcnl0aGluZyB5b3Vyc2VsZiBhY2NvcmRpbmcgdG8gdGhlIGJ1aWxkCi1pbnN0cnVjdGlvbnMgYmVsb3csIHRoZW4geW91IHdpbGwgbm90IGhhdmUgYW55IHByb2JsZW1zLiAgSG93ZXZlciwgeW91Ci1tYXkgZGlzY292ZXIgdGhhdCBHQ0Mgc2VlbXMgdW5hYmxlIHRvIGZpbmQgdGhlIHJpZ2h0IGNwcCBhbmQgY2MxOwotdXN1YWxseSB0aGlzIHdpbGwgYmUgYmVjYXVzZSBkaXJlY3RvcnkgbmFtZXMgaGF2ZSBjaGFuZ2VkLiAgKEV2ZW4KLXJlbmFtaW5nIHlvdXIgaGFyZCBkaXNrIHdpbGwgbWFrZSB0aGlzIGhhcHBlbi4pICBJbiBzdWNoIGNhc2VzLCB5b3UKLWhhdmUgc2V2ZXJhbCBjaG9pY2VzLiAgT25lIGlzIGp1c3QgdG8gYWRkIHRoaXMgZGlyZWN0b3J5IHRvCi17Q29tbWFuZHN9LCBidXQgdGhlbiB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBnZXQgYW55IG90aGVyIGNwcCBvciBjYzEsCi1zdWNoIGFzIHRob3NlIHVzZWQgYnkgYSBkaWZmZXJlbnQgdGFyZ2V0IG9yIHZlcnNpb24uICBBbm90aGVyIHdheSBpcwotdG8gcmVuYW1lIHlvdXIgZGlzayBhbmQgZGlyZWN0b3JpZXMgdG8gbWF0Y2ggdGhlIHByZWZpeCB1c2VkIHdoZW4gdGhlCi10b29scyB3ZXJlIGNvbXBpbGVkLiAgRmluYWxseSwgeW91IGNhbiBzZXQgdGhlIHZhcmlhYmxlCi1HQ0NfRVhFQ19QUkVGSVggdG8gcG9pbnQgdG8gdGhlIGxpYnJhcnkgZGlyZWN0b3J5OgotCi0Jc2V0IEdDQ19FWEVDX1BSRUZJWCBNeURpc2s6U3R1ZmY6bGliOmdjYy1saWI6Ci0JZXhwb3J0IEdDQ19FWEVDX1BSRUZJWAotCi1Zb3UgbWF5IGFsc28gd2FudCB0byBlZGl0IE1QVydzIEhFWEEgMTI4IHJlc291cmNlLiAgV2hlbiBHQ0MgaXMgYnVpbHQKLXVzaW5nIGEgbmF0aXZlIEdDQywgaXQgaXMgY29tcGlsZWQgdG8gdXNlIGEgc3BlY2lhbCBzdGFjayBhbGxvY2F0b3IKLWZ1bmN0aW9uIGFsbG9jYSgpLiAgV2hpbGUgdGhpcyBpcyB2ZXJ5IGVmZmljaWVudCwgaXQgbWVhbnMgdGhhdCBHQ0MKLXdpbGwgbmVlZCBjb25zaWRlcmFibGUgc3RhY2sgc3BhY2UgdG8gcnVuLCBlc3BlY2lhbGx5IHdoZW4gY29tcGlsaW5nCi1sYXJnZSBwcm9ncmFtcyB3aXRoIG9wdGltaXphdGlvbiB0dXJuZWQgb24uICBZb3UgZ2l2ZSBNUFcgbW9yZSBzdGFjawotYnkgZWRpdGluZyB0aGUgSEVYQSAxMjggcmVzb3VyY2Ugb2YgdGhlIE1QVyBTaGVsbC4gIEEgdmFsdWUgb2YgIjAwMDgKLTAwMDAiIGdpdmVzIDUxMksgb2Ygc3RhY2sgc2l6ZSwgd2hpY2ggaXMgdXN1YWxseSBzdWZmaWNpZW50LgotCi1VU0lORyBHTlUgVE9PTFMKLQotKiBVc2luZyBOYXRpdmUgUG93ZXJNYWMgR0NDCi0KLVVzaW5nIGEgbmF0aXZlIFBvd2VyTWFjIEdDQyB0byBwcm9kdWNlIE1QVyB0b29scyBvciBNYWNPUyBhcHBsaWNhdGlvbnMKLWlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBqdXN0ICJnQyBmb28uYyIsIGFsdGhvdWdoIG5vIG1vcmUgY29tcGxpY2F0ZWQKLXRoYW4gd2l0aCBvdGhlciBNYWMgY29tcGlsZXJzLgotCi1UbyBidWlsZCBhIG5hdGl2ZSBQb3dlck1hYyBNUFcgdG9vbCwgdXNlIHRoaXMgc2VxdWVuY2UsIHdoZXJlIGhlbGxvLmMKLWlzIHRoZSB1c3VhbCAiaGVsbG8gd29ybGQiIHByb2dyYW0sIGFuZCBnZW5lcmljY2ZyZy5yIGlzIHRoZSBSZXogZmlsZQotd2l0aCB0aGUgY29kZSBmcmFnbWVudCByZXNvdXJjZToKLQotZ0MgLUl7Q0luY2x1ZGVzfSAtZm5vLWJ1aWx0aW4gLURwYXNjYWw9IC1jIC1nIGhlbGxvLmMKLVBQQ0xpbmsgaGVsbG8ubyAtbyBoZWxsbyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iU3RkQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie1NoYXJlZExpYnJhcmllc30iSW50ZXJmYWNlTGliIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJTdGRDTGliIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7R0NDUFBDTGlicmFyaWVzfSJsaWJnY2MueGNvZmYKLXJleiAtZCBBUFBOQU1FPSciJ2hlbGxvJyInIEdlbmVyaWNDRlJHLnIgLW8gaGVsbG8KLXNldGZpbGUgLXQgJ01QU1QnIC1jICdNUFMgJyBoZWxsbwotCi1UaGUgc2FtZSBzZXF1ZW5jZSB3b3JrcyB0byBidWlsZCBhIE1hY09TIGFwcGxpY2F0aW9uLCBidXQgeW91IHNldCB0aGUgZmlsZQotdHlwZSB0byAnQVBQTCcgYW5kIGRvbid0IGxpbmsgaW4gUFBDVG9vbExpYnMuby4gIEZvciBmdXJ0aGVyIGRldGFpbHMgb24KLXVzaW5nIE1QVyB0byBidWlsZCBNYWMgYXBwbGljYXRpb25zLCBzZWUgdGhlIGdlbmVyYWwgTVBXIGRvY3VtZW50YXRpb24uCi0KLVJlY2VudCB2ZXJzaW9ucyBvZiBQUENMaW5rIGhhdmUgYW4gb3B0aW9uIHRvIGdlbmVyYXRlIHRoZSBjb2RlCi1mcmFnbWVudCByZXNvdXJjZSBhbmQgYXV0b21hdGljYWxseSBzZXQgY3JlYXRvciBhbmQgZmlsZSB0eXBlOwotaGVyZSBpcyB3aGF0IEdlbmVyaWNDRlJHLnIgc2hvdWxkIGxvb2sgbGlrZSBpZiB5b3UgaGF2ZSBhbiBvbGRlcgotUFBDTGluayBvciBhcmUgdXNpbmcgR05VIGxkOgotCi0jaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKLQotcmVzb3VyY2UgJ2NmcmcnICgwKSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBrUG93ZXJQQywKLSAgICAgICAgICAgICAgICBrRnVsbExpYiwKLSAgICAgICAgICAgICAgICBrTm9WZXJzaW9uTnVtLGtOb1ZlcnNpb25OdW0sCi0gICAgICAgICAgICAgICAgMCwwLAotICAgICAgICAgICAgICAgIGtJc0FwcCxrT25EaXNrRmxhdCxrWmVyb09mZnNldCxrV2hvbGVGb3JrLAotICAgICAgICAgICAgICAgIEFQUE5BTUUgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIFJleiBjb21tYW5kIGxpbmUgd2l0aCAtZCBvcHRpb24KLSAgICAgICAgfQotfTsKLQotSW4gZ2VuZXJhbCB0aGlzIHBvcnQgb2YgR0NDIHN1cHBvcnRzIHRoZSBzYW1lIG9wdGlvbiBzeW50YXggYW5kCi1iZWhhdmlvciBhcyBpdHMgVW5peCBjb3VudGVycGFydC4gIEl0IGFsc28gaGFzIHNpbWlsYXIgY29tcGlsYXRpb24KLXJ1bGVzLCBzbyBpdCB3aWxsIHJ1biB0aGUgYXNzZW1ibGVyIG9uIC5zIGZpbGVzIGFuZCBzbyBmb3J0aC4KLQotVGhlIEdDQyBtYW51YWwgaW5jbHVkZXMgZnVsbCBpbmZvcm1hdGlvbiBvbiB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuCi1PbmUgb3B0aW9uIHRoYXQgbWF5IGJlIGVzcGVjaWFsbHkgdXNlZnVsIGlzICItdiIsIHdoaWNoIHNob3dzIHlvdSB3aGF0Ci10b29scyBhbmQgb3B0aW9ucyBhcmUgYmVpbmcgdXNlZDsgdW5saWtlIG1vc3QgTWFjIEMgY29tcGlsZXJzLCBHQ0MKLWRpcmVjdHMgYXNzZW1ibHkgYW5kIGxpbmtpbmcgaW4gYWRkaXRpb24gdG8gY29tcGlsYXRpb24uCi0KLU1QVyBHQ0MgZG9lcyBmZWF0dXJlIHR3byBleHRlbnNpb25zIHRvIHRoZSBvcHRpb24gc3ludGF4OyAnLWQgbWFjcm89bmFtZScKLXdvcmtzIGp1c3QgYXMgJy1EbWFjcm89bmFtZScgZG9lcyBpbiBVbml4LCBhbmQgJy1pIGRpcmVjdG9yeScgd29ya3MgdGhlCi1zYW1lIGFzICctSWRpcmVjdG9yeScuCi0KLU1QVyBHQ0Mgc3VwcG9ydHMgdGhlIHVzdWFsIFBhc2NhbC1zdHlsZSBzdHJpbmdzIGFuZCBhbGlnbm1lbnQgcHJhZ21hcy4KLQotVG8gZmluZCBzdGFuZGFyZCBpbmNsdWRlIGZpbGVzIHlvdSBjYW4gc2V0IHRoZSB2YXJpYWJsZSBHQ0NJbmNsdWRlczoKLQotCXNldCBHQ0NJbmNsdWRlcyBNeURpc2s6TXlJbmNsdWRlczoKLQlleHBvcnQgR0NDSW5jbHVkZXMKLQotR0NDSW5jbHVkZXMgaXMgc2ltaWxhciB0byBNUFcncyBDSW5jbHVkZXMgb3IgQ1cncyBNV0NJbmNsdWRlcy4gIEluCi1vcmRlciB0byB1c2UgTVBXJ3MgdXN1YWwgaW5jbHVkZSBmaWxlcywganVzdCBzYXk6Ci0KLQlzZXQgR0NDSW5jbHVkZXMgIntDSW5jbHVkZXN9IgotCWV4cG9ydCBHQ0NJbmNsdWRlcwotCi0qIFVzaW5nIEdDQyBhcyBhIENyb3NzLUNvbXBpbGVyCi0KLUlmIHlvdSBoYXZlIGEgY3Jvc3MtY29tcGlsZXIsIGFuZCB5b3UgaGF2ZSBhbGwgb2YgdGhlIGNvcnJlY3QKLXRhcmdldC1zaWRlIGNydDAgYW5kIGxpYnJhcmllcyBhdmFpbGFibGUsIHRoZW4gdG8gY29tcGlsZSBhbmQgbGluayBhCi1maWxlICJmb28uYyIsIHlvdSBjYW4gc2F5IGp1c3QKLQotCWdDIGZvby5jCi0KLVRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIGFuIE1QVyBiaW5hcnkgZmlsZSBuYW1lZCAiYS5vdXQiOyB0aGUgZm9ybWF0Ci1vZiB0aGUgY29udGVudHMgd2lsbCBkZXBlbmQgb24gd2hpY2ggdGFyZ2V0IGlzIGluIHVzZSwgc28gZm9yIGluc3RhbmNlCi1hIE1JUFMtdGFyZ2V0aW5nIEdDQyB3aWxsIHByb2R1Y2UgRUNPRkYgb3IgRUxGIGV4ZWN1dGFibGVzLgotCi1Ob3RlIHRoYXQgdXNpbmcgTVBXIGluY2x1ZGUgZmlsZXMgd2l0aCBhIGNyb3NzLWNvbXBpbGVyIGlzIHNvbWV3aGF0Ci1kYW5nZXJvdXMuCi0KLSogVXNpbmcgdGhlIEFzc2VtYmxlciBhbmQgRnJpZW5kcwotCi1UaGUgYXNzZW1ibGVyICgiYXMiKSBhbmQgbGlua2VyICgibGQiKSBhcmUgZmFpdGhmdWwgcG9ydHMgb2YgdGhlaXIKLVVuaXggY291bnRlcnBhcnRzLiAgU2ltaWxhcmx5LCB0aGUgYmludXRpbHMgImFyIiwgImNwbHVzZmlsdCIsICJubSIsCi0ib2JqY29weSIsICJvYmpkdW1wIiwgInJhbmxpYiIsICJzaXplIiwgInN0cmluZ3MiLCBhbmQgInN0cmlwIiBhcmUgYWxsCi1saWtlIHRoZXkgYXJlIHVuZGVyIFVuaXguICAoTm90ZSB0aGF0ICJjcGx1c2ZpbHQiIGlzIHVzdWFsbHkgY2FsbGVkCi0iYysrZmlsdCIgdW5kZXIgVW5peC4pCi0KLSogVXNpbmcgR0RCCi0KLVRoZXJlIGFyZSB0d28gZmxhdm9ycyBvZiBHREIuICAiZ2RiIiBpcyBhbiBNUFcgdG9vbCB0aGF0IHdvcmtzIHZlcnkKLW11Y2ggbGlrZSBpdCBkb2VzIGluIFVuaXg7IHB1dCBhIGNvbW1hbmQgaW50byB0aGUgTVBXIHdvcmtzaGVldCBhbmQKLXR5cGUgdGhlIDxlbnRlcj4ga2V5IHRvIHNlbmQgaXQgdG8gR0RCLiAgV2hpbGUgImdkYiIgaXMgcnVubmluZywgeW91Ci1jYW5ub3QgZG8gYW55dGhpbmcgZWxzZSBpbiBNUFcsIGFsdGhvdWdoIHlvdSBjYW4gc3dpdGNoIHRvIG90aGVyCi1NYWMgYXBwbGljYXRpb25zIGFuZCB1c2UgdGhlbS4KLQotIlNpb3dHREIiIGlzIGFsc28gYSBNYWMgYXBwbGljYXRpb24sIGJ1dCBpdCBpcyBHREIgdXNpbmcgdGhlIFNJT1cKLXBhY2thZ2UgdG8gcHJvdmlkZSBjb25zb2xlIGVtdWxhdGlvbi4gIENvbW1hbmRzIGFyZSBleGFjdGx5IGFzIGZvciB0aGUKLU1QVyB0b29sLCBidXQgc2luY2UgdGhpcyBpcyBpdHMgb3duIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHN3aXRjaAotYmV0d2VlbiBpdCBhbmQgTVBXLgotCi1CVUlMRElORyBHTlUgVE9PTFMKLQotVGhpcyBwb3J0IG9mIHRoZSBHTlUgdG9vbHMgdXNlcyBhIGNvbmZpZ3VyZSBzY3JpcHQgc2ltaWxhciB0bwotdGhhdCB1c2VkIGZvciBHTlUgdG9vbHMgdW5kZXIgVW5peCwgYnV0IHJld3JpdHRlbiBmb3IgTVBXLiAgQXMgd2l0aAotVW5peCBjb25maWd1cmF0aW9uLCB0aGVyZSBpcyBhbiAib2JqZWN0IiBkaXJlY3RvcnkgdGhhdCBtYXkgYmUKLWRpZmZlcmVudCBmcm9tIHRoZSAic291cmNlIiBkaXJlY3RvcnkuICBJbiB0aGUgZXhhbXBsZSBjb21tYW5kcyBiZWxvdywKLXdlIHdpbGwgYXNzdW1lIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeSwgYW5kIHRoYXQKLXRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzICJ7Qm9vdH1DeWdudXM6c3JjOiIuCi0KLSogUmVxdWlyZW1lbnRzIGZvciBCdWlsZGluZwotCi1JbiBhZGRpdGlvbiB0byB0aGUgc291cmNlcywgeW91IHdpbGwgbmVlZCBhIHNldCBvZiB0b29scyB0aGF0IHRoZQotY29uZmlndXJlIGFuZCBidWlsZCBzY3JpcHRzIGFzc3VtZSB0byBiZSBhdmFpbGFibGUuICBUaGVzZSB0b29scwotKGFuZCB0aGVpciB2ZXJzaW9ucywgaWYgcmVsZXZhbnQpIGFyZSBhcyBmb2xsb3dzOgotCi0JYnlhY2MgdG9vbAotCWZsZXggKDIuMy43KSB0b29sIChhbmQgRmxleC5za2VsIGZpbGUpCi0JZm9yd2FyZC1pbmNsdWRlIHNjcmlwdAotCU1vdmVJZkNoYW5nZSBzY3JpcHQKLQltcHctdG91Y2ggc2NyaXB0Ci0JbXB3LXRydWUgc2NyaXB0Ci0JTmV3Rm9sZGVyUmVjdXJzaXZlIHNjcmlwdAotCW51bGwtY29tbWFuZCBzY3JpcHQKLQlvcGVuLWJyYWNlIHNjcmlwdAotCXNlZCAoMS4xMykgdG9vbAotCXRyLTd0bzggc2NyaXB0Ci0JdHJ1ZSBzY3JpcHQKLQotVGhlIHNjcmlwdHMgYXJlIGluIHRoZSBzb3VyY2VzLCB1bmRlciB1dGlsczptcHc6LiBZb3UgbXVzdCBhcnJhbmdlIHRvCi1nZXQgdGhlIG90aGVyIHRvb2xzIHlvdXJzZWxmICh0aGV5IGFyZSByZWFkaWx5IGF2YWlsYWJsZSBmcm9tIHRoZQotInVzdWFsIiBuZXQgc2l0ZXMsIGFuZCBhcmUgYWxzbyBvbiBtYW55IENEUk9NUykuICBJbiBhZGRpdGlvbiwgdGhlcmUKLXdpbGwgdXN1YWxseSBiZSBhIHNldCBvZiB0aGVzZSBhdmFpbGFibGUgYXQgZnRwLmN5Z251cy5jb20sIGluIHB1Yi9tYWMuCi0KLVlvdSBtYXkgcHV0IHRoZSBidWlsZCB0b29scyBpbiB5b3VyIHVzdWFsIFRvb2xzIG9yIFNjcmlwdHMKLWRpcmVjdG9yaWVzLCBvciBrZWVwIHRoZW0gaW4gYSBzZXBhcmF0ZSBkaXJlY3Rvcmllcy4gIFdlIHByZWZlciB0bwotbWFrZSBhIGRpcmVjdG9yeSBjYWxsZWQgImJ1aWxkdG9vbHMiIGFuZCB3ZSBwdXQgdGhpcyBpbiBvbmUgb2Ygb3VyCi1Vc2VyU3RhcnR1cCBmaWxlczoKLQotCXNldCBDb21tYW5kcyAie0Jvb3R9Q3lnbnVzOmJ1aWxkdG9vbHM6LHtDb21tYW5kc30iCi0KLUZsZXggdXNlcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBGTEVYX1NLRUxFVE9OIHRvIGxvY2F0ZSBpdHMgc2tlbGV0b24KLWZpbGUsIHNvIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMsIHByZWZlcmFibHkgaW4gYSBVc2VyU3RhcnR1cDoKLQotCVNldCBGTEVYX1NLRUxFVE9OICJ7Qm9vdH0iQ3lnbnVzOmJ1aWxkdG9vbHM6RmxleC5za2VsCi0JRXhwb3J0IEZMRVhfU0tFTEVUT04KLQotKiBDb25maWd1cmluZwotCi1CZWZvcmUgeW91IGNhbiBidWlsZCBhbnl0aGluZywgeW91IG11c3QgY29uZmlndXJlLiAgWW91IGRvIHRoaXMgYnkKLWNyZWF0aW5nIGFuIGRpcmVjdG9yeSB3aGVyZSBvYmplY3QgZmlsZXMgd2lsbCBiZSBzdG9yZWQsIHNldGRpcmVjdG9yeQotdG8gdGhhdCBkaXJlY3RvcnkgYW5kIGRvIGEgY29uZmlndXJlIGNvbW1hbmQ6Ci0KLQl7Qm9vdH1DeWdudXM6c3JjOm1wdy1jb25maWd1cmUgLS10YXJnZXQgPG5hbWU+IC0tY2MgPGNvbXBpbGVyPiAtLXNyY2RpciB7Qm9vdH1DeWdudXM6c3JjOiAtLXByZWZpeCA8d2hhdGV2ZXI+Ci0KLUlmIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIG5vdCBpbiB5b3VyIHtDb21tYW5kc30gbGlzdCwgdGhlbiB5b3UgbXVzdAotc3VwcGx5IGEgZnVsbCBwYXRobmFtZSB0byBtcHctY29uZmlndXJlLCBzaW5jZSBtcHctY29uZmlndXJlIGludm9rZXMKLWl0c2VsZiBhZnRlciBzd2l0Y2hpbmcgaW50byBlYWNoIHN1YmRpcmVjdG9yeS4gIFVzaW5nIGEgcmVsYXRpdmUKLXBhdGhuYW1lLCBldmVuIHNvbWV0aGluZyBsaWtlICc6bXB3LWNvbmZpZ3VyZScsIHdpbGwgdGhlcmVmb3JlIG5vdCB3b3JrLgotCi08bmFtZT4gbXVzdCBiZSBhIGtub3duIHRhcmdldC4gIFZhbGlkIG9uZXMgaW5jbHVkZSAibTY4ay1hcHBsZS1tYWNvcyIsCi0icG93ZXJwYy1hcHBsZS1tYWNvcyIsICJpMzg2LXVua25vd24tZ28zMiIsICJtaXBzLWlkdC1lY29mZiIsIGFuZAotInNoLWhpdGFjaGktaG1zIi4gIE5vdCBhbGwgdGFyZ2V0IHR5cGVzIGFyZSBhY2NlcHRlZCBmb3IgYWxsIG9mIHRoZQotdG9vbHMgeWV0LgotCi08Y29tcGlsZXI+IG11c3QgYmUgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIHVzZS4gIEl0IGRlZmF1bHRzIHRvICJtcHdjIi4KLQotCShtNjhrKQotCW1wd2MJTVBXIEMKLQlzYzY4awlTeW1hbnRlYyBDCi0JbXdjNjhrCU1ldHJvd2Vya3MgQyAoQ29kZXdhcnJpb3IpCi0JZ2NjNjhrCUdDQwotCi0JKHBvd2VycGMpCi0JcHBjYwlQUENDCi0JbXJjCU1hY2ludG9zaCBvbiBSaXNDIChNaXN0ZXIgQywgYWthKD8pIEZyYW5rZW5zdGVpbikKLQlzY3BwYwlTeW1hbnRlYyBDCi0JbXdjcHBjCU1ldHJvd2Vya3MgQyAoQ29kZXdhcnJpb3IpCi0JZ2NjcHBjCUdDQwotCi1Ob3QgYWxsIGNvbXBpbGVycyB3aWxsIGNvbXBpbGUgYWxsIHRvb2xzIGVxdWFsbHkgd2VsbCEgIEZvciBtNjhrIE1hY3MsCi1NUFcgQyBoYXMgdGhlIGJlc3QgcmVjb3JkIHNvIGZhciAoaXQgaGFzIHByb2JsZW1zLCBidXQgdGhleSBjYW4gYmUKLXdvcmtlZCBhcm91bmQpLCB3aGlsZSBmb3IgUG93ZXJNYWNzLCBDb2RlV2FycmlvciBpcyB0aGUgb25seSBjb21waWxlcgotdGhhdCBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBpbGVkIGV2ZXJ5dGhpbmcgaW50byBydW5uaW5nIGNvZGUuCi0KLTxwcmVmaXg+IGlzIHRoZSBwYXRoIHRoYXQgImdjYyIgd2lsbCBwcmVwZW5kIHdoZW4gbG9va2luZyBmb3IgdG9vbHMKLXRvIGV4ZWN1dGUuICBHQ0NfRVhFQ19QUkVGSVggb3ZlcnJpZGVzIHRoaXMgdmFsdWUsIHNvIHlvdSBuZWVkIG5vdAotaW5jbHVkZSBpdCBpZiB5b3UgcGxhbiB0byB1c2UgR0NDX0VYRUNfUFJFRklYLgotCi1BcyBhbiBleGFtcGxlLCBoZXJlIGlzIHRoZSBjb25maWd1cmUgbGluZSB0aGF0IHlvdSBjb3VsZCB1c2UgdG8gYnVpbGQKLW5hdGl2ZSBQb3dlck1hYyBHQ0M6Ci0KLSJ7Qm9vdH0iQ3lnbnVzOnNyYzptcHctY29uZmlndXJlIC0tY2MgbXdjcHBjIC0tdGFyZ2V0IHBvd2VycGMtYXBwbGUtbWFjb3MgLS1zcmNkaXIgIntCb290fSJDeWdudXM6c3JjOiAtLXByZWZpeCAie0Jvb3R9IkdOVVRvb2xzOgotCi0qIEJ1aWxkaW5nCi0KLUlmIHlvdSB1c2UgQ29kZVdhcnJpb3IsIHlvdSAqbXVzdCogZmlyc3Qgc2V0IE1XQ0luY2x1ZGVzIHRvCi17Q0luY2x1ZGVzfS4gIFRoaXMgaXMgYmVjYXVzZSB5b3Ugd2lsbCBiZSBidWlsZGluZyBNUFcgdG9vbHMsIGFuZAotdGhlaXIgc3RhbmRhcmQgSS9PIHdvcmtzIGJ5IG1ha2luZyByZWZlcmVuY2VzIHRvIGRhdGEgdGhhdCBpcyBwYXJ0IG9mCi10aGUgTVBXIFNoZWxsLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjb2RlIG11c3QgYmUgY29tcGlsZWQgYW5kIGxpbmtlZAotd2l0aCBtYWNyb3MgdGhhdCByZWZlciB0byB0aGF0IGRhdGEsIGFuZCB0aG9zZSBtYWNyb3MgYXJlIGluCi17Q0luY2x1ZGVzfSwgbm90IHRoZSBkZWZhdWx0IHtNV0NJbmNsdWRlc30uICBXaXRob3V0IHRoaXMgY2hhbmdlLCB5b3UKLXdpbGwgZW5jb3VudGVyIHByb2JsZW1zIGNvbXBpbGluZyBsaWJpYmVydHkvbXB3LmMsIGJ1dCB0d2Vha2luZyB0aGF0Ci1maWxlIG9ubHkgbWFza3MgdGhlIHJlYWwgcHJvYmxlbSwgYW5kIGRvZXMgbm90IGZpeCBpdC4KLQotVGhlIGNvbW1hbmQKLQotCW1wdy1idWlsZAotCi13aWxsIGJ1aWxkIGV2ZXJ5dGhpbmcuIEJ1aWxkaW5nIHdpbGwgdGFrZSBvdmVyIGFuIGhvdXIgb24gYSBRdWFkcmEgODAwCi1vciBQb3dlck1hYyA4MTAwLzExMCwgbG9uZ2VyIGlmIHRoZSBzb3VyY2VzIGFyZSBvbiBhIHNoYXJlZCB2b2x1bWUuCi0KLVlvdSBtYXkgc2VlIHNvbWUgd2FybmluZ3M7IHRoZXNlIGFyZSBtb3N0bHkgbGlrZWx5IGJlbmlnbiwgdHlwaWNhbGx5Ci1kaXNhZ3JlZW1lbnRzIGFib3V0IGRlY2xhcmF0aW9ucyBvZiBsaWJyYXJ5IGFuZCBzeXN0ZW0gZnVuY3Rpb25zLgotCi0qIEluc3RhbGxpbmcKLQotVG8gaW5zdGFsbCB0aGUganVzdC1idWlsdCB0b29scywgdXNlIHRoZSBjb21tYW5kCi0KLQltcHctYnVpbGQgaW5zdGFsbAotCi1UaGlzIHBhcnQgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUganVzdCBjb3BpZXMgZmlsZXMgdG8gdGhlCi1sb2NhdGlvbiBzcGVjaWZpZWQgYXQgY29uZmlndXJlIHRpbWUgYnkgPHByZWZpeD4sIGFuZCwgaW4gc29tZSBjYXNlcywKLXJlbmFtZXMgdGhlbSBmcm9tIHRlbXBvcmFyeSBpbnRlcm5hbCBuYW1lcyB0byB0aGVpciB1c3VhbCBuYW1lcy4gVGhpcwotaW5zdGFsbCBwcm9jZXNzIGlzICpub3QqIHRoZSBzYW1lIGFzIHdoYXQgdGhlIEluc3RhbGwgc2NyaXB0IGRvZXM7Ci1JbnN0YWxsIGNhbiBjb3B5IHRvb2xzIGZyb20gdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBjaG9zZW4gYXQKLWNvbmZpZ3VyYXRpb24gdGltZSB0byBhIHVzZXItY2hvc2VuIHBsYWNlLCBhbmQgc2V0cyB1cCBhIFVzZXJTdGFydHVwCi1maWxlLiAgTm90ZSB0aGF0IHdoaWxlIHRoZSBJbnN0YWxsIHNjcmlwdCBpcyBvcHRpb25hbCwgdGhlIGluc3RhbGwKLWJ1aWxkIGFjdGlvbiBwZXJmb3JtcyBzb21lIHRhc2tzIHdvdWxkIGJlIHZlcnkgaGFyZCB0byByZXBsaWNhdGUKLW1hbnVhbGx5LCBzbyB5b3Ugc2hvdWxkIGFsd2F5cyBkbyBpdCBiZWZvcmUgdXNpbmcgdGhlIHRvb2xzLgotCi0qIEtub3duIFByb2JsZW1zIFdpdGggVXNpbmcgVmFyaW91cyBDb21waWxlcnMgdG8gQnVpbGQKLQotTW9zdCB2ZXJzaW9ucyBvZiBNUFcgQyBoYXZlIHByb2JsZW1zIHdpdGggY29tcGlsaW5nIEdOVSBzb2Z0d2FyZS4KLQotTVBXIEMgMy4yLnggaGFzIHByZXByb2Nlc3NpbmcgYnVncyB0aGF0IHJlbmRlciBpdCBpbmNhcGFibGUgb2YKLWNvbXBpbGluZyB0aGUgQkZEIGxpYnJhcnksIHNvIGl0IGNhbid0IGJlIHVzZWQgYXQgYWxsIGZvciBidWlsZGluZyBCRkQuCi0KLU1QVyBDIDMuMywgMy4zLjEsIGFuZCAzLjMuMiB3aWxsIHNwb250YW5lb3VzbHkgY2xhaW0gdG8gaGF2ZSBmb3VuZAotZXJyb3JzIGluIHRoZSBzb3VyY2UgY29kZSwgYnV0IGluIGZhY3QgdGhlIGNvZGUgaXMgcGVyZmVjdGx5IGZpbmUuICBJZgotdGhpcyBoYXBwZW5zLCBqdXN0IHNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmFjayB0byB0aGUgdG9wLWxldmVsCi1vYmpkaXIgKHdoZXJlIHRoZSBjb25maWd1cmUgY29tbWFuZCBhYm92ZSB3YXMgcGVyZm9ybWVkKSwgYW5kIHR5cGUKLSJtcHctYnVpbGQgYWxsIiBhZ2Fpbi4gIElmIGl0IGdvZXMgb24gdGhyb3VnaCB0aGUgc3VwcG9zZWQgZXJyb3IsIHRoZW4KLXlvdSBnb3Qgb25lIG9mIHRoZSBzcHVyaW91cyBlcnJvcnMuICBBIGZ1bGwgYnVpbGQgbWF5IHJlcXVpcmUgYSBudW1iZXIKLW9mIHRoZXNlIHJlc3RhcnRzLgotCi1NUFcgQyAzLjMuMyBzZWVtcyB0byB3b3JrIE9LLCBhdCBsZWFzdCB3aXRoIHRoZSBhaWQgb2YgYSBudW1iZXIgb2YKLXdvcmthcm91bmRzIHRoYXQgYXJlIGluIHRoZSBzb3VyY2VzIChsb29rIGZvciAjaWZkZWYgTVBXX0MpLgotCi1WZXJzaW9ucyBvZiBNUFcgTWFrZSBlYXJsaWVyIHRoYW4gNC4wZDIgaGF2ZSBleGhpYml0ZWQgYml6YXJyZSBiZWhhdmlvciwKLWZhaWx1cmUgdG8gc3Vic3RpdHV0ZSB2YXJpYWJsZXMgYW5kIHRoZSBsaWtlLgotCi1NZXRyb3dlcmtzIENXNiBQUEMgbGlua2VyIChNV0xpbmtQUEMpIHNlZW1zIHRvIGRvIGJhZCB0aGluZ3Mgd2l0aCBtZW1vcnkKLWlmIHRoZSAiTW9kZXJuIE1lbW9yeSBNYW5hZ2VyIiBpcyB0dXJuZWQgb24gKGluIHRoZSBNZW1vcnkgY29udHJvbCBwYW5lbCksCi1idXQgd29ya3MgT0sgaWYgaXQgaXMgdHVybmVkIG9mZi4KLQotTWV0cm93ZXJrcyBDVzYgbG9zZXMgYmlndGltZSBjb21waWxpbmcgb3Bjb2RlczpwcGMtb3BjLmMsIHdoaWNoIGhhcwotc29tZSBkZWVwbHkgbmVzdGVkIG1hY3Jvcy4gIChDVzcgaXMgT0suKSAgVGhlcmUgaXMgYSB3YXkgdG8gcGF0Y2ggdGhlCi1maWxlLCBieSBzdWJzdGl0dXRpbmcgY29uc3RhbnQgdmFsdWVzLiAgSWYgeW91IG5lZWQgdG8gZG8gdGhpcywKLWNvbnRhY3Qgc2hlYnNAY3lnbnVzLmNvbSBmb3IgZGV0YWlscy4KLQotPEdlc3RhbHQuaD4gaXMgbWlzc2luZyBmcm9tIHtDSW5jbHVkZXN9IGluIHRoZSBNUFcgdmVyc2lvbiB0aGF0IGNvbWVzCi13aXRoIENXNy4gIFlvdSBjYW4ganVzdCBjb3B5IHRoZSBvbmUgaW4gQ1c3J3Mge01XQ0luY2x1ZGVzfS4KLQotQ1c4IGFuZCBsYXRlciBoYXZlIGNoYW5nZXMgdG8gaGVhZGVycyBhbmQgc3VjaCB0aGF0IHdpbGwgcmVxdWlyZSBjaGFuZ2VzCi10byB0aGUgc291cmNlIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHRoZW0gdG8gcmVidWlsZC4KLQotS05PV04gQlVHUwotCi1UaGUgZGVjbGFyYXRpb25zIGZvciBtZW1jcHkgYW5kIG1lbWNtcCBpbiBzb21lIHZlcnNpb25zIG9mIGhlYWRlciBmaWxlcwotbWF5IGNvbmZsaWN0IHdpdGggR0NDJ3MgYnVpbHRpbiBkZWZpbml0aW9uLiAgRWl0aGVyIHVzZSAtZm5vLWJ1aWx0aW4KLW9yIGlnbm9yZSB0aGUgd2FybmluZ3MuCi0KLVRoaXMgaXMgbm90IGEgYnVnLCBidXQgLSB3YXRjaCBvdXQgZm9yIGNyL25sIHRyYW5zbGF0aW9uISAgRm9yIGluc3RhbmNlLAotaWYgY29uZmlnL21wdy1taC1tcHcgaXMgbm90IHByb3Blcmx5IHRyYW5zbGF0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbgotY29waWVkIG9yIHVwZGF0ZWQgc2VwYXJhdGVseSwgdGhlbiBldmVyeXRoaW5nIHdpbGwgYWxtb3N0IGJ1aWxkLCBidXQKLXlvdSB3aWxsIGdldCBwdXp6bGluZyBlcnJvciBtZXNzYWdlcyBmcm9tIG1ha2Ugb3IgdGhlIGNvbXBpbGVyLgotCi0nLycgb3IgJyAnIGVtYmVkZGVkIGluIGFueSBkZXZpY2UsIGRpcmVjdG9yeSwgb3IgZmlsZSBuYW1lIG1heSBvciBtYXkKLW5vdCB3b3JrLgotCi1vYmpjb3B5IC1PIHNyZWMgZm9vLm8gbWFrZXMgcmFuZG9tIG91dHB1dCBmaWxlbmFtZXMuCi0KLU1hYy14LW1pcHMgcmVxdWlyZXMgLW1nYXMgYnV0IFVuaXggaG9zdHMgZG9uJ3QuCi0KLUdEQiB3aWxsIGZyZXF1ZW50bHkgcmVxdWlyZSBhICcvJyBvbiB0aGUgZnJvbnQgb2YgYSBkZXZpY2UgbmFtZSBpbiBvcmRlcgotdG8gcmVjb2duaXplIGl0IGFzIGFuIGFic29sdXRlIHJhdGhlciB0aGFuIGEgcmVsYXRpdmUgcGF0aG5hbWUuCi0KLUdEQiBkb2Vzbid0IHNlZW0gdG8gdXNlIHRoZSBwcmludGVyIHBvcnQgY29ycmVjdGx5LCBhbHRob3VnaCBpdCB0cmllcy4KLQotVGhlIGN1cnNvciBkb2Vzbid0IGFsd2F5cyBzcGluIGFzIG11Y2ggYXMgaXQgc2hvdWxkLiAgVG8gZ2V0IGVsYWJvcmF0ZQotc3RhdGlzdGljcyBhbmQgd2FybmluZ3MgYWJvdXQgc3BpbiByYXRlcywgYWRkIHRoaXMgdG8gVXNlclN0YXJ0dXA6Ci0KLQlzZXQgTUVBU1VSRV9TUElOIGFsbAotCWV4cG9ydCBNRUFTVVJFX1NQSU4KZGlmZiAtLWdpdCBhL21wdy1idWlsZC5pbiBiL21wdy1idWlsZC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkOTUzMC4uMDAwMDAwMAotLS0gYS9tcHctYnVpbGQuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotIyBUb3AtbGV2ZWwgc2NyaXB0IGZyYWdtZW50IHRvIGJ1aWxkIGV2ZXJ5dGhpbmcgZm9yIE1QVy4KLQotU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgotCi0jU2V0IEVjaG8gMQotCi1TZXQgVGhpc1NjcmlwdCAiezB9IgotCi1TZXQgb2JqZGlyICI6IgotCi1TZXQgdmVyaWZ5IDAKLQotU2V0IEJ1aWxkVGFyZ2V0ICJub25lIgotCi0jIFBhcnNlIGFyZ3VtZW50cy4KLQotTG9vcAotCUJyZWFrIElmIHsjfSA9PSAwCi0JCUlmICJ7QnVpbGRUYXJnZXR9IiA9fiAvbm9uZS8KLQkJCVNldCBCdWlsZFRhcmdldCAiezF9IgotCQlFbHNlCi0JCQlFY2hvIE9ubHkgb25lIGJ1aWxkIHRhcmdldCBhbGxvd2VkLCBpZ25vcmluZyAiezF9IgotCQlFbmQgSWYKLQlTaGlmdCAxCi1FbmQgTG9vcAotCi1JZiAie0J1aWxkVGFyZ2V0fSIgPX4gL25vbmUvCi0JU2V0IEJ1aWxkVGFyZ2V0ICJhbGwiCi1FbmQgSWYKLQotSWYge3ZlcmlmeX0gPT0gMQotCUVjaG8gIiMiIERvaW5nICJ7VGhpc1NjcmlwdH0iICJ7QnVpbGRUYXJnZXR9IiBpbiAiYERpcmVjdG9yeWAiIC4uLiAKLUVuZCBJZgotCi1TZXQgcmFubWFrZSAwCi0KLUlmICJgRXhpc3RzIE1ha2VmaWxlYCIgIT0gIiIKLQlFY2hvICJTZXQgRWNobyAxIiA+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0Ci0JTWFrZSAtZiBNYWtlZmlsZSB7QnVpbGRUYXJnZXR9ID4+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0Ci0Je0J1aWxkVGFyZ2V0fS5tYWtlb3V0Ci0JRGVsZXRlIHtCdWlsZFRhcmdldH0ubWFrZW91dAotCVNldCByYW5tYWtlIDEKLUVuZCBJZgotCi1JZiAiYEV4aXN0cyBNYWtlZmlsZS5QUENgIiAhPSAiIgotCUVjaG8gIlNldCBFY2hvIDEiID57QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0JTWFrZSAtZiBNYWtlZmlsZS5QUEMge0J1aWxkVGFyZ2V0fSA+PntCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKLQl7QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0JRGVsZXRlIHtCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKLQlTZXQgcmFubWFrZSAxCi1FbmQgSWYKLQotSWYge3Jhbm1ha2V9ID09IDEKLQlFeGl0Ci1FbmQgSWYKLQotIyBEaXNwYXRjaCBvbiB2YXJpb3VzIHBzZXVkby10YXJnZXRzLgotCi1JZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC8KLQlFY2hvIFN0YXJ0ZWQgYERhdGVgCi0JIntUaGlzU2NyaXB0fSIgYWxsLWdjYwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1nZGIKLQlFY2hvIEZpbmlzaGVkIGBEYXRlYAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1saWJpYmVydHkvCi0JIntUaGlzU2NyaXB0fSIgZG8tbGliaWJlcnR5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJmZC8KLQkie1RoaXNTY3JpcHR9IiBkby1iZmQKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtb3Bjb2Rlcy8KLQkie1RoaXNTY3JpcHR9IiBkby1vcGNvZGVzCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJ5YWNjLwotCSJ7VGhpc1NjcmlwdH0iIGRvLWJ5YWNjCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWZsZXgvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGRvLWZsZXgKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtYmludXRpbHMvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWJpbnV0aWxzCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdhcy8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCi0JIntUaGlzU2NyaXB0fSIgZG8tZ2FzCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdjYy8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWdhcwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iaW51dGlscwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1sZAotCSJ7VGhpc1NjcmlwdH0iIGRvLWdjYwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nZGIvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWdkYgotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1ncmV6LwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgZG8tZ3JlegotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1sZC8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCi0JIntUaGlzU2NyaXB0fSIgZG8tbGQKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1ieWFjYy8KLQlTZXREaXJlY3RvcnkgOmJ5YWNjOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWZsZXgvCi0JU2V0RGlyZWN0b3J5IDpmbGV4OgotCTo6bXB3LWJ1aWxkIF9ib290c3RyYXAKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1iZmQvCi0JU2V0RGlyZWN0b3J5IDpiZmQ6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tbGliaWJlcnR5LwotCVNldERpcmVjdG9yeSA6bGliaWJlcnR5OgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLW9wY29kZXMvCi0JU2V0RGlyZWN0b3J5IDpvcGNvZGVzOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWJpbnV0aWxzLwotCVNldERpcmVjdG9yeSA6YmludXRpbHM6Ci0JOjptcHctYnVpbGQgc3RhbXBzCi0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ2FzLwotCVNldERpcmVjdG9yeSA6Z2FzOgotCTo6bXB3LWJ1aWxkIHN0YW1wcwotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdjYy8KLQlTZXREaXJlY3RvcnkgOmdjYzoKLQk6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdkYi8KLQlTZXREaXJlY3RvcnkgOmdkYjoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1ncmV6LwotCVNldERpcmVjdG9yeSA6Z3JlejoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1sZC8KLQlTZXREaXJlY3RvcnkgOmxkOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLW5ld2xpYi8KLQlTZXREaXJlY3RvcnkgOm5ld2xpYjoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS10b3AKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWJpbnV0aWxzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nYXMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWdjYwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtbGQKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWdkYgotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtYmludXRpbHMvCi0JU2V0RGlyZWN0b3J5IDpiaW51dGlsczoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1nYXMvCi0JU2V0RGlyZWN0b3J5IDpnYXM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2NjLwotCVNldERpcmVjdG9yeSA6Z2NjOgotCTptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2RiLwotCVNldERpcmVjdG9yeSA6Z2RiOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdyZXovCi0JU2V0RGlyZWN0b3J5IDpncmV6OgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWxkLwotCVNldERpcmVjdG9yeSA6bGQ6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS8KLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktdG9wCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWJpbnV0aWxzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWdhcwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1nY2MKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktZ2RiCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWxkCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWJpbnV0aWxzLwotCVNldERpcmVjdG9yeSA6YmludXRpbHM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdhcy8KLQlTZXREaXJlY3RvcnkgOmdhczoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ2NjLwotCVNldERpcmVjdG9yeSA6Z2NjOgotCTptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdkYi8KLQlTZXREaXJlY3RvcnkgOmdkYjoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ3Jlei8KLQlTZXREaXJlY3RvcnkgOmdyZXo6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWxkLwotCVNldERpcmVjdG9yeSA6bGQ6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LXRvcC8KLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntwcmVmaXh9IgotCUlmICJ7cHJlZml4fSIgIT0gImBEaXJlY3RvcnlgIgotCQlEdXBsaWNhdGUgLXkgJ1JlYWQgTWUgZm9yIE1QVycgIntwcmVmaXh9IidSZWFkIE1lIGZvciBNUFcnCi0JCUR1cGxpY2F0ZSAteSBJbnN0YWxsICJ7cHJlZml4fSJJbnN0YWxsCi0JRW5kIElmCi1FbHNlCi0JRWNobyB7QnVpbGRUYXJnZXR9IG5vdCB1bmRlcnN0b29kLCBpZ25vcmluZwotRW5kIElmCi0KLVNldERpcmVjdG9yeSAie3NhdmVkaXJ9IgpkaWZmIC0tZ2l0IGEvbXB3LWNvbmZpZy5pbiBiL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjg3MzcuLjAwMDAwMDAKLS0tIGEvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIEN5Z251cyBzb3VyY2UgdHJlZS4KLQotIyBDaGVjayB0aGF0IHdlIGNhbiBmaW5kIGFsbCB0aGUgc3BlY2lhbCB0b29scyB0aGF0IHdlIHdpbGwgbmVlZC4KLSMgVGhlIHRlc3QgZm9yIHNlZCBpcyBzZW1pLXBvaW50bGVzcywgYmVjYXVzZSBpdCdzIGFscmVhZHkgYmVlbiBpbnZva2VkCi0jIGJ5IHRoZSBjYWxjdWxhdGlvbiBvZiB0YXJnZXRfY3B1IGluIHRoZSBtYWluIGNvbmZpZ3VyZSBzY3JpcHQsIGJ1dAotIyB0aGUgdGVzdCB3aWxsIGFsc28gc2hvdyB3aGljaCBvbmUgaXMgYmVpbmcgdXNlZC4KLQotU2V0IEV4aXQgMAotRWNobyBieWFjYyBpcyBgV2hpY2ggYnlhY2NgCi1FY2hvIGZsZXggaXMgYFdoaWNoIGZsZXhgCi1FY2hvIGZvcndhcmQtaW5jbHVkZSBpcyBgV2hpY2ggZm9yd2FyZC1pbmNsdWRlYAotRWNobyBNb3ZlSWZDaGFuZ2UgaXMgYFdoaWNoIE1vdmVJZkNoYW5nZWAKLUVjaG8gbXB3LXRvdWNoIGlzIGBXaGljaCBtcHctdG91Y2hgCi1FY2hvIG1wdy10cnVlIGlzIGBXaGljaCBtcHctdHJ1ZWAKLUVjaG8gTmV3Rm9sZGVyUmVjdXJzaXZlIGlzIGBXaGljaCBOZXdGb2xkZXJSZWN1cnNpdmVgCi1FY2hvIG51bGwtY29tbWFuZCBpcyBgV2hpY2ggbnVsbC1jb21tYW5kYAotRWNobyBvcGVuLWJyYWNlIGlzIGBXaGljaCBvcGVuLWJyYWNlYAotRWNobyBzZWQgaXMgYFdoaWNoIHNlZGAKLUVjaG8gJ3RyLTd0bzgnIGlzIGBXaGljaCB0ci03dG84YAotRWNobyB0cnVlIGlzIGBXaGljaCB0cnVlYAotU2V0IEV4aXQgMQotCi1TZXQgaG9zdF9saWJzICJtbWFsbG9jIGxpYmliZXJ0eSBvcGNvZGVzIGJmZCByZWFkbGluZSBnYXNoIHRjbCB0ayB0Y2xYIgotCi1TZXQgaG9zdF90b29scyAidGV4aW5mbyBieWFjYyBmbGV4IGJpc29uIGJpbnV0aWxzIGxkIGdhcyBnY2MgZ2RiIG1ha2UgcGF0Y2ggXE9wdGlvbi1kCi0JICAgIHBybXMgc2VuZC1wciBncHJvZiBnZGJ0ZXN0IHRnYXMgZXRjIGV4cGVjdCBkZWphZ251IHNpbSBiYXNoIFxPcHRpb24tZAotCSAgICBtNCBhdXRvY29uZiBpc3BlbGwgZ3JlcCBkaWZmIHJjcyBjdnMgZmlsZXV0aWxzIHNoZWxsdXRpbHMgdGltZSBcT3B0aW9uLWQKLQkgICAgdGV4dHV0aWxzIHdkaWZmIGZpbmQgZW1hY3MgZW1hY3MxOSB1dWRlY29kZSBoZWxsbyB0YXIgZ3ppcCBpbmRlbnQgXE9wdGlvbi1kCi0JICAgIHJlY29kZSByZWxlYXNlIHNlZCB1dGlscyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGdhd2siCi0KLVNldCB0YXJnZXRfbGlicyAibmV3bGliIgotCi1TZXQgdGFyZ2V0X3Rvb2xzICJleGFtcGxlcyIKLQotIyBDb25maWd1cmUgdGhlIHJlc291cmNlIGNvbXBpbGVyIGlmIHRhcmdldGluZyBNYWNzLgotSWYge3RhcmdldF9vc30gPX4gL21hY29zLyB8fCB7dGFyZ2V0X29zfSA9fiAvbXB3LwotCVNldCBob3N0X3Rvb2xzICJ7aG9zdF90b29sc30gZ3JleiIKLUVuZCBJZgotCQotU2V0IGNvbmZpZ2RpcnMgIntob3N0X2xpYnN9IHtob3N0X3Rvb2xzfSB7dGFyZ2V0X2xpYnN9IHt0YXJnZXRfdG9vbHN9IgotRXhwb3J0IGNvbmZpZ2RpcnMKLQotIyBNYWtlIHVwIGEgc3BlY2lhbCBpbmNsdWRlIGRpcmVjdG9yeSB0aGF0IHRvb2xzIHdpbGwgc2hhcmUuCi0KLUlmICJgRXhpc3RzICJ7b2JqZGlyfSJleHRyYS1pbmNsdWRlYCIgPT0gIiIKLQlOZXdGb2xkZXIgIntvYmpkaXJ9ImV4dHJhLWluY2x1ZGUKLUVuZCBJZgotCi1TZXQgZWRpciAie29iamRpcn1leHRyYS1pbmNsdWRlOiIKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6ZmlsZS5oICJ7ZWRpcn0iJ3N5cy9maWxlLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czppb2N0bC5oICJ7ZWRpcn0iJ3N5cy9pb2N0bC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6cGFyYW0uaCAie2VkaXJ9IidzeXMvcGFyYW0uaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnJlc291cmNlLmggIntlZGlyfSInc3lzL3Jlc291cmNlLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpzdGF0LmggIntlZGlyfSInc3lzL3N0YXQuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnRpbWUuaCAie2VkaXJ9IidzeXMvdGltZS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6dHlwZXMuaCAie2VkaXJ9IidzeXMvdHlwZXMuaCcKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OmFvdXQ2NC5oICJ7ZWRpcn0iJ2FvdXQvYW91dDY0LmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6YXIuaCAie2VkaXJ9Iidhb3V0L2FyLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6cmFubGliLmggIntlZGlyfSInYW91dC9yYW5saWIuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpyZWxvYy5oICJ7ZWRpcn0iJ2FvdXQvcmVsb2MuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpzdGFiLmRlZiAie2VkaXJ9Iidhb3V0L3N0YWIuZGVmJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnN0YWJfZ251LmggIntlZGlyfSInYW91dC9zdGFiX2dudS5oJwotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDoie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9Iidhb3V0Lycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6ZWNvZmYuaCAie2VkaXJ9Iidjb2ZmL2Vjb2ZmLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6aW50ZXJuYWwuaCAie2VkaXJ9Iidjb2ZmL2ludGVybmFsLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6c3ltLmggIntlZGlyfSInY29mZi9zeW0uaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjpzeW1jb25zdC5oICJ7ZWRpcn0iJ2NvZmYvc3ltY29uc3QuaCcKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInY29mZi8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLUlmICJ7dGFyZ2V0X2NwdX0iID1+IC9wb3dlcnBjLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjpyczYwMDAuaCAie2VkaXJ9Iidjb2ZmL3JzNjAwMC5oJwotRW5kIElmCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmNvbW1vbi5oICJ7ZWRpcn0iJ2VsZi9jb21tb24uaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmR3YXJmLmggIntlZGlyfSInZWxmL2R3YXJmLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpkd2FyZjIuaCAie2VkaXJ9IidlbGYvZHdhcmYyLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpleHRlcm5hbC5oICJ7ZWRpcn0iJ2VsZi9leHRlcm5hbC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6aW50ZXJuYWwuaCAie2VkaXJ9IidlbGYvaW50ZXJuYWwuaCcKLQotIyBCZWxpZXZlIGl0IG9yIG5vdCwgR0RCIG5lZWRzIHRoaXMgZm9yIGFsbCB0YXJnZXRzLgotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6bWlwcy5oICJ7ZWRpcn0iJ2VsZi9taXBzLmgnCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9IidlbGYvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi1JZiAie3RhcmdldF9jcHV9IiA9fiAvcG93ZXJwYy8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpwcGMuaCAie2VkaXJ9IidlbGYvcHBjLmgnCi1FbmQgSWYKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOm9wY29kZToie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOm9wY29kZToie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ29wY29kZS8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLUlmICJ7dGFyZ2V0X2NwdX0iID1+IC9wb3dlcnBjLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6b3Bjb2RlOnBwYy5oICJ7ZWRpcn0iJ29wY29kZS9wcGMuaCcKLUVuZCBJZgotCi0jIEFkZCBzb21lIGJmZCBpbmNsdWRlcyB0aGF0IGdldCBtZW50aW9uZWQgb3V0c2lkZSB0aGUgYmZkIGRpci4KLQkKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImJmZDpsaWJjb2ZmLmggIntlZGlyfSInYmZkL2xpYmNvZmYuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImJmZDpsaWJlY29mZi5oICJ7ZWRpcn0iJ2JmZC9saWJlY29mZi5oJwotCi0jIFRyYW5zbGF0ZSByYW5kb20gZmlsZXMgaW50byBNUFctb25seSBjaGFyYWN0ZXIgc2V0LgotCi10ci03dG84ICJ7c3JjZGlyfSJtcHctUkVBRE1FID4gIntvYmpkaXJ9UmVhZCBNZSBmb3IgTVBXIgotdHItN3RvOCAie3NyY2Rpcn0ibXB3LWluc3RhbGwgPiAie29iamRpcn0iSW5zdGFsbApkaWZmIC0tZ2l0IGEvbXB3LWNvbmZpZ3VyZSBiL21wdy1jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDUxNDguLjAwMDAwMDAKLS0tIGEvbXB3LWNvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gc2NyaXB0Ci0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMjIyBXQVJOSU5HCi0jIyMgVGhpcyBzY3JpcHQgbXVzdCBOT1QgdXNlIGFueSA4LWJpdCBjaGFycyEKLSMjIyBXQVJOSU5HCi0KLSMgVGhpcyBpcyBhbiBNUFcgU2hlbGwgc2NyaXB0IHRoYXQgc2V0cyBldmVyeXRoaW5nIHVwIGZvciBjb21waWxhdGlvbiwKLSMgbWFpbmx5IGNyZWF0aW5nIGRpcmVjdG9yaWVzLCBhbmQgZWRpdGluZyBjb3BpZXMgb2YgZmlsZXMuCi0KLVNldCBzYXZlZGlyICJgRGlyZWN0b3J5YCIKLQotI1NldCBFY2hvIDEKLQotU2V0IFRoaXNTY3JpcHQgInswfSIKLQotU2V0IHNyY3Jvb3QgIi0tLS0tLS0tIgotCi1TZXQgc3JjZGlyICI6IgotCi1TZXQgb2JqZGlyICI6IgotCi1TZXQgcHJlZml4ICJ7TVBXfSI6R05VVG9vbHM6Ci0KLVNldCBleGVjX3ByZWZpeCAiIgotCi1TZXQgYmluZGlyICIiCi0KLVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQotU2V0IHRhcmdldF9hbGlhcyB7aG9zdF9hbGlhc30KLQotU2V0IGhvc3RfY2MgIm1wd2MiCi0KLVNldCB3aXRoX2dudV9sZCAwCi0KLVNldCBoZWxwb3V0cHV0IDAKLQotU2V0IHJlY3Vyc2UgMQotCi1TZXQgdmVyaWZ5IDAKLVNldCB2ZXJpZnlzdHIgIiIKLQotU2V0IGVuYWJsZV9vcHRpb25zICIiCi1TZXQgZGlzYWJsZV9vcHRpb25zICIiCi0KLSMgUGFyc2UgYXJndW1lbnRzLgotCi1Mb29wCi0JQnJlYWsgSWYgeyN9ID09IDAKLQlJZiAiezF9IiA9fiAvLS1jYy8KLQkJU2V0IGhvc3RfY2MgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tYmluZGlyLwotCQlTZXQgYmluZGlyICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWRpc2FibGUtPysvCi0JCVNldCBgRWNobyB7MX0gfCBzZWQgLWUgJ3MvLS1kaXNhYmxlLS9lbmFibGVfLydgIG5vCi0JCVNldCBkaXNhYmxlX29wdGlvbnMgIntkaXNhYmxlX29wdGlvbnN9ICd7MX0nIgotCUVsc2UgSWYgInsxfSIgPX4gLy0tZW5hYmxlLT8rLwotCQlTZXQgYEVjaG8gezF9IHwgc2VkIC1lICdzLy0tZW5hYmxlLS9lbmFibGVfLydgIHllcwotCQlTZXQgZW5hYmxlX29wdGlvbnMgIntlbmFibGVfb3B0aW9uc30gJ3sxfSciCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1leGVjLXByZWZpeC8KLQkJU2V0IGV4ZWNfcHJlZml4ICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWhlbHAvCi0JCVNldCBoZWxwb3V0cHV0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWhvc3QvCi0JCVNldCBob3N0X2FsaWFzICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLW5vcmVjdXJzaW9uLwotCQlTZXQgcmVjdXJzZSAwCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1wcmVmaXgvCi0JCVNldCBwcmVmaXggInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tc3JjZGlyLwotCQlTZXQgc3JjZGlyICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLXNyY3Jvb3QvCi0JCVNldCBzcmNyb290ICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLXRhcmdldC8KLQkJU2V0IHRhcmdldF9hbGlhcyAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLXYvCi0JCVNldCB2ZXJpZnkgMQotCQlTZXQgdmVyaWZ5c3RyICItdiIKLQlFbHNlIElmICJ7MX0iID1+IC8tLXdpdGgtZ251LWxkLwotCQlTZXQgd2l0aF9nbnVfbGQgMQotCUVsc2UKLQkJRWNobyAtbiAnbXB3LWNvbmZpZ3VyZTogVW5yZWNvZ25pemVkIG9wdGlvbjogIicKLQkJRWNobyAtbiAiezF9IgotCQlFY2hvICciOyB1c2UgLS1oZWxwIGZvciB1c2FnZS4nCi0JCUV4aXQgMQotCUVuZCBJZgotCVNoaWZ0IDEKLUVuZCBMb29wCi0KLUlmIHtoZWxwb3V0cHV0fSA9PSAxCi0JRWNobyAiVXNhZ2U6IG1wdy1jb25maWd1cmUgW09QVElPTlNdIgotCUVjaG8gIiIKLQlFY2hvICJPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHNdIgotCUVjaG8gIi0tYmluZGlyIERJUiAgICAgIGRpcmVjdG9yeSBmb3IgYmluYXJpZXMgW10iCi0JRWNobyAiLS1jYyBDQyAgICAgICAgICAgdXNlIEMgY29tcGlsZXIgQ0MgW21wd2NdIgotCUVjaG8gIi0tZGlzYWJsZS1GT08gICAgIGRvIG5vdCBpbmNsdWRlIGZlYXR1cmUgRk9PIgotCUVjaG8gIi0tZW5hYmxlLUZPTyAgICAgIGluY2x1ZGUgZmVhdHVyZSBGT08iCi0JRWNobyAiLS1leGVjLXByZWZpeCBESVIgaW5zdGFsbCBob3N0LWRlcGVuZGVudCBmaWxlcyBpbnRvIERJUiBbXSIKLQlFY2hvICItLWhlbHAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UiCi0JRWNobyAiLS1ob3N0IEhPU1QgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFttNjhrLWFwcGxlLW1wd10iCi0JRWNobyAiLS1ub3JlY3Vyc2lvbiAgICAgY29uZmlndXJlIHRoaXMgZGlyZWN0b3J5IG9ubHkgW3JlY3Vyc2VdIgotCUVjaG8gIi0tcHJlZml4IERJUiAgICAgIGluc3RhbGwgaW50byBESVIgW3tNUFd9OkdOVVRvb2xzOl0iCi0JRWNobyAiLS1zcmNkaXIgRElSICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgWzpdIgotCUVjaG8gIi0tc3Jjcm9vdCBESVIgICAgIGZpbmQgdGhlIHRvcGxldmVsIHNvdXJjZXMgaW4gRElSIFs6XSIKLQlFY2hvICItLXRhcmdldCBUQVJHRVQgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdIgotCUVjaG8gIi12ICAgICAgICAgICAgICAgIHZlcmJvc2UiCi0JRWNobyAiLS13aXRoLWdudS1sZCAgICAgbGluayB1c2luZyBHTlUgbGQgW25vXSIKLQlFeGl0IDAKLUVuZCBJZgotCi1TZXQgRXhpdCAwCi0KLSMgRGVmYXVsdCBleGVjX3ByZWZpeCBmcm9tIHByZWZpeC4KLQotSWYgIntleGVjX3ByZWZpeH0iID09ICIiCi0JU2V0IGV4ZWNfcHJlZml4ICJ7cHJlZml4fSIKLUVuZCBJZgotCi1JZiAie2JpbmRpcn0iID09ICIiCi0JU2V0IGJpbmRpciAie3ByZWZpeH0iYmluOgotRW5kIElmCi0KLSMgUG9pbnQgdG8gdGhlIGNvcnJlY3Qgc2V0IG9mIHRvb2xzIHRvIHVzZSB3aXRoIHRoZSBjaG9zZW4gY29tcGlsZXIuCi0KLUlmICJ7aG9zdF9jY30iID1+IC9tcHdjLwotCVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX01QV19DfScKLQlTZXQgc2VnbWVudF9mbGFnICctcyAnCi0JU2V0IGFyX25hbWUgJ3tBUl9MSUJ9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9zYzY4ay8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19TQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfTElCfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9MSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX0N9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvbXdjNjhrLwotCVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX01XQzY4S30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfTVdMSU5LNjhLfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9NV0xJTks2OEt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfTVdDNjhLfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djYzY4ay8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ182OEtfR0NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctcyAnCi0JU2V0IGFyX25hbWUgJ3tBUl82OEtfQVJ9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9SQU5MSUJ9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfNjhLX0dDQ30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19DfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL3BwY2MvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfUFBDQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfUFBDTElOS30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfUFBDTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF9YQ09GRn0nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfUFBDfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL21yYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NUkN9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9zY3BwYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19TQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfUFBDTElOS30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfUFBDTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF9YQ09GRn0nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfUFBDfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL213Y3BwYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NV0NQUEN9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX01XTElOS1BQQ30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTVdMSU5LUFBDfScKLQkjIE1pc2xlYWRpbmcsIGJ1dCB3ZSBkb24ndCBuZWVkIGEgUEVGIHN0ZXAuCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19NV0NQUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvZ2NjcHBjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1BQQ19HQ0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCUlmIHt3aXRoX2dudV9sZH0gPT0gMQotCQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfUkFOTElCfScKLQkJU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9HTER9JwotCUVsc2UKLQkJU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCUVuZCBJZgotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlCi0JRWNobyAie2hvc3RfY2N9IiBpcyBub3QgYSBrbm93biBNUFcgY29tcGlsZXIgdHlwZQotRW5kIElmCi0KLVNldCBkYXNoX2NfZmxhZyAnJwotSWYgIntob3N0X2NjfSIgPX4gL2djYzY4ay8KLQlTZXQgZGFzaF9jX2ZsYWcgJy1jJwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvZ2NjcHBjLwotCVNldCBkYXNoX2NfZmxhZyAnLWMnCi1FbmQgSWYKLQotIyAoc2hvdWxkIGludGVycHJldCBhbGlhc2VzIGlmIG5vdCBpbiBjYW5vbmljYWwgZm9ybSkKLQotU2V0IGhvc3RfY2Fub25pY2FsICJ7aG9zdF9hbGlhc30iCi0KLVNldCB0YXJnZXRfY2Fub25pY2FsICJ7dGFyZ2V0X2FsaWFzfSIKLQotU2V0IGNvbmZpZ2RpcnMgIiIKLQotSWYgIntzcmNyb290fSIgPX4gLy0tLS0tLS0tLwotCVNldCBzcmNyb290ICJ7c3JjZGlyfSIKLUVuZCBJZgotSWYgImBFeGlzdHMgIntzcmNkaXJ9ImAiID09ICIiCi0JRWNobyBTb3VyY2UgZGlyZWN0b3J5IHtzcmNkaXJ9IGRvZXMgbm90IGV4aXN0IQotCUV4aXQgMQotRW5kIElmCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImAiID09ICIiCi0JRWNobyBUb3AtbGV2ZWwgc291cmNlIGRpcmVjdG9yeSB7c3Jjcm9vdH0gZG9lcyBub3QgZXhpc3QhCi0JRXhpdCAxCi1FbmQgSWYKLQotU2V0IHRhcmdldF9jcHUgImBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wxLydgIgotU2V0IHRhcmdldF92ZW5kb3IgImBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wyLydgIgotU2V0IHRhcmdldF9vcyAiYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDMvJ2AiCi0KLSMgQ3JlYXRlIGEgZmlsZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb2xkZXIgdGhhbiBhbnkgb3RoZXIgaGVyZS4KLQotSWYgImBFeGlzdHMgIntvYmpkaXJ9Il9vbGRlc3RgIiA9PSAiIgotCW1wdy10b3VjaCBfb2xkZXN0Ci1FbmQgSWYKLQotIyBSZWNvcmQgdGhpcyBiZWZvcmUgY3JlYXRpbmcgYW55IGZpbGVzLCBtYWtlZmlsZXMgc29tZXRpbWVzIG1lbnRpb24KLSMgZGVwZW5kZW5jaWVzIG9uIGNvbmZpZy5zdGF0dXMuCi0KLUVjaG8gIiMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93czoiID5jb25maWcubmV3Ci1FY2hvICJ7VGhpc1NjcmlwdH0gLS1ob3N0IHtob3N0X2FsaWFzfSAtLXRhcmdldCB7dGFyZ2V0X2FsaWFzfSAtLXNyY2RpciB7c3JjZGlyfSAgLS1zcmNyb290IHtzcmNyb290fSAgLS1wcmVmaXgge3ByZWZpeH0gLS1jYyB7aG9zdF9jY30ge3ZlcmlmeXN0cn0ge2VuYWJsZV9vcHRpb25zfSB7ZGlzYWJsZV9vcHRpb25zfSAtLW5vcmVjdXJzaW9uIiA+PmNvbmZpZy5uZXcKLU1vdmVJZkNoYW5nZSBjb25maWcubmV3IGNvbmZpZy5zdGF0dXMKLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9Im1wdy1jb25maWcuaW5gIiAhPSAiIgotCXRyLTd0bzggIntzcmNkaXJ9Im1wdy1jb25maWcuaW4gPiJ7b2JqZGlyfSJtcHctY29uZmlnLmluCi0JRXhlY3V0ZSAie29iamRpcn0ibXB3LWNvbmZpZy5pbgotRW5kIElmCi0KLSMgU3RhcnQgTWFrZWZpbGUgY29uc3RydWN0aW9uIGJ5IGRlZmluaW5nIGFsbCB0aGUgdmFyaWFibGVzIGNob3NlbiBieQotIyBjb25maWd1cmF0aW9uLgotCi1FY2hvICIjIFRoaXMgTWFrZWZpbGUgcHJvZHVjZWQgYnkgbXB3LWNvbmZpZ3VyZS4gIENoYW5nZXMgbWF5IGdldCBsb3N0ISIgPiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJzcmNyb290ID0gIiB7c3Jjcm9vdH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0b3BzcmNkaXIgPSAiIHtzcmNyb290fQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInNyY2RpciA9ICIge3NyY2Rpcn0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJtcHdfcHJlZml4ID0gIiB7cHJlZml4fQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIm1wd19leGVjX3ByZWZpeCA9ICIge2V4ZWNfcHJlZml4fQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAibXB3X2JpbmRpciA9ICIge2JpbmRpcn0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJob3N0X2FsaWFzID0gIiB7aG9zdF9hbGlhc30JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9hbGlhcyA9ICIge3RhcmdldF9hbGlhc30JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9jcHUgPSAiIHt0YXJnZXRfY3B1fQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X3ZlbmRvciA9ICIge3RhcmdldF92ZW5kb3J9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfb3MgPSAiIHt0YXJnZXRfb3N9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X2Nhbm9uaWNhbCA9ICIge3RhcmdldF9jYW5vbmljYWx9CT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gImhvc3RfbWFrZWZpbGVfZnJhZyA9ICIJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfbWFrZWZpbGVfZnJhZyA9ICIJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJDQyA9ICIge2NjX25hbWV9CQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkFSID0gIiB7YXJfbmFtZX0JCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiUkFOTElCID0gIiB7cmFubGliX25hbWV9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiQ0NfTEQgPSAiIHtjY19sZF9uYW1lfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIlBST0dfRVhUID0gIiB7cHJvZ19leHRfbmFtZX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkVYVFJBTElCUyA9ICIge2V4dHJhbGlic19uYW1lfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiTUFLRVBFRiA9ICIge21ha2VwZWZfbmFtZX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIlJFWiA9ICIge3Jlel9uYW1lfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQotSWYge2hvc3RfY2N9ID1+IC9nY2NwcGMvCi0JRWNobyAtbiAiZHEgPVxPcHRpb24tZFxPcHRpb24tZFxPcHRpb24tZCIgPiAie29iamRpcn0iTWFrZWZpbGUudGVtMAotCUVjaG8gJyInIAkJCQkgPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAKLQl0ci03dG84ICAie29iamRpcn0iTWFrZWZpbGUudGVtMAk+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVsc2UKLQlFY2hvIC1uICJkcSA9JyIgCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVjaG8gLW4gJyInIAkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRWNobyAgICAiJyIgCQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVuZCBJZgotCi0jIEFwcGVuZCB0aGUgbWFzdGVyIHNldCBvZiBkZWZpbml0aW9ucyBmb3IgdGhlIHZhcmlvdXMgY29tcGlsZXJzLgotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0iY29uZmlnOm1wdy1taC1tcHdgIiAhPSAiIgotCXRyLTd0bzggIntzcmNkaXJ9ImNvbmZpZzptcHctbWgtbXB3ID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWxzZSBJZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImNvbmZpZzptcHctbWgtbXB3YCIgIT0gIiIKLQl0ci03dG84ICJ7c3Jjcm9vdH0iY29uZmlnOm1wdy1taC1tcHcgPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbHNlCi0JRWNobyAiY2FuJ3QgZmluZCBhIGhvc3QgY29uZmlnIGZpbGUhIgotCUV4aXQgMAotRW5kIElmCi0KLSMgQXBwZW5kIGFueXRoaW5nIHByb2R1Y2VkIGJ5IHRoZSBkaXJlY3RvcnkncyBtcHctY29uZmlnLmluLgotCi1JZiAiYEV4aXN0cyAie29iamRpcn0ibWsudG1wYCIgIT0gIiIKLQlDYXRlbmF0ZSAie29iamRpcn0ibWsudG1wID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCSMgQW4gbXB3LWNvbmZpZy5pbiBtaWdodCBjaGFuZ2Ugc28gYXMgbm90IHRvIGNyZWF0ZSB0aGlzCi0JIyBhbnltb3JlLCBzbyBnZXQgcmlkIG9mIGl0IG5vdyB0byBiZSBzYWZlLgotCURlbGV0ZSAtaSAteSAie29iamRpcn0ibWsudG1wCi1FbmQgSWYKLQotIyBJZiB0aGVyZSBhcmUgc2VkIHNjcmlwdHMgdG8gZWRpdCB0aGUgVW5peCBNYWtlZmlsZS5pbiwgdXNlIHRoZW07IG90aGVyd2lzZQotIyB1c2UgYW4gbXB3LW1ha2UuaW4gaWYgcHJlc2VudC4KLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9Im1wdy1tYWtlLnNlZGAiICE9ICIiCi0JSWYgImBFeGlzdHMgIntvYmpkaXJ9ImhhY2tlZF9NYWtlZmlsZS5pbmAiICE9ICIiCi0JCVNldCBNYWtlZmlsZUluICJ7b2JqZGlyfSJoYWNrZWRfTWFrZWZpbGUuaW4KLQlFbHNlCi0JCVNldCBNYWtlZmlsZUluICJ7c3JjZGlyfSJNYWtlZmlsZS5pbgotCUVuZCBJZgotCSMgRmluZCB0aGUgZ2VuZXJpYyBtYWtlZmlsZSBlZGl0aW5nIHNjcmlwdC4KLQlJZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImNvbmZpZzptcHc6Zy1tcHctbWFrZS5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntzcmNyb290fSJjb25maWc6bXB3OmctbXB3LW1ha2Uuc2VkICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVsc2UgSWYgImBFeGlzdHMgIntzcmNyb290fSJ1dGlsczptcHc6Zy1tcHctbWFrZS5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntzcmNyb290fSJ1dGlsczptcHc6Zy1tcHctbWFrZS5zZWQgIntNYWtlZmlsZUlufSIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0JRWxzZSBJZiAiYEV4aXN0cyAie3NyY2Rpcn0iZy1tcHctbWFrZS5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntzcmNkaXJ9ImctbXB3LW1ha2Uuc2VkICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVsc2UKLQkJRWNobyBXYXJuaW5nOiBnLW1wdy1tYWtlLnNlZCBub3QgZm91bmQsIGNvcHlpbmcgIntNYWtlZmlsZUlufSIgdmVyYmF0aW0uLi4KLQkJQ2F0ZW5hdGUgIntNYWtlZmlsZUlufSIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0JRW5kIElmCi0Jc2VkIC1mICJ7c3JjZGlyfSJtcHctbWFrZS5zZWQgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0Jc2VkIC1lICdzL15wcmVmaXggPSAuKiQvcHJlZml4ID0ge21wd19wcmVmaXh9L2cnIC1lICdzL15leGVjX3ByZWZpeCA9IC4qJC9leGVjX3ByZWZpeCA9IHttcHdfZXhlY19wcmVmaXh9L2cnIC1lICdzL15iaW5kaXIgPSBAYmluZGlyQC9iaW5kaXIgPSB7bXB3X2JpbmRpcn0vZycgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0zCi0Jc2VkIC1lICJzL0BEQVNIX0NfRkxBR0Ave2Rhc2hfY19mbGFnfS8iIC1lICJzL0BTRUdNRU5UX0ZMQUcoXChbXildKlwpKUAve3NlZ21lbnRfZmxhZ31cMS8iICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0zID4ie29iamRpcn0ibXB3LW1ha2UuaW4KLQl0ci03dG84ICJ7b2JqZGlyfSJtcHctbWFrZS5pbiA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlJZiAiYEV4aXN0cyAie29iamRpcn0ibWsuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7b2JqZGlyfSJtay5zZWQgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQkJUmVuYW1lIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFbmQgSWYKLQlNb3ZlSWZDaGFuZ2UgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbSAie29iamRpcn0iTWFrZWZpbGUKLQlEZWxldGUgLWkgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbVsxMl0KLQlJZiB7dmVyaWZ5fSA9PSAxCi0JCUVjaG8gQ3JlYXRlZCBNYWtlZmlsZSBpbiAiYERpcmVjdG9yeWAiCi0JRW5kIElmCi1FbHNlIElmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctbWFrZS5pbmAiICE9ICIiCi0Jc2VkIC1lICdzL15wcmVmaXggPSAuKiQvcHJlZml4ID0ge21wd19wcmVmaXh9L2cnICJ7c3JjZGlyfSJtcHctbWFrZS5pbiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlzZWQgLWUgInMvQERBU0hfQ19GTEFHQC97ZGFzaF9jX2ZsYWd9LyIgLWUgInMvQFNFR01FTlRfRkxBRyhcKFteKV0qXCkpQC97c2VnbWVudF9mbGFnfX1cMS8iICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCXRyLTd0bzggIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi0JSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie29iamRpcn0ibWsuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0JCVJlbmFtZSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtMiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRW5kIElmCi0JTW92ZUlmQ2hhbmdlICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gIntvYmpkaXJ9Ik1ha2VmaWxlCi0JRGVsZXRlIC1pIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW1bMTJdCi0JSWYge3ZlcmlmeX0gPT0gMQotCQlFY2hvIENyZWF0ZWQgTWFrZWZpbGUgaW4gImBEaXJlY3RvcnlgIgotCUVuZCBJZgotRW5kIElmCi0KLSMgUHJvZHVjZSBhIGJ1aWxkIHNjcmlwdCBpZiB0aGUgc291cmNlIGlzIGRlZmluZWQuCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctYnVpbGQuaW5gIiAhPSAiIgotCUVjaG8gIlNldCBzcmNyb290ICIge3NyY3Jvb3R9ID4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlFY2hvICJTZXQgc3JjZGlyICIge3NyY2Rpcn0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlFY2hvICJTZXQgdGFyZ2V0X2Nhbm9uaWNhbCAiIHt0YXJnZXRfY2Fub25pY2FsfSA+PiAie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCUVjaG8gIlNldCBwcmVmaXggIiB7cHJlZml4fSA+PiAie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCXRyLTd0bzggIntzcmNkaXJ9Im1wdy1idWlsZC5pbiA+PiJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JTW92ZUlmQ2hhbmdlICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtICJ7b2JqZGlyfSJtcHctYnVpbGQKLQlJZiB7dmVyaWZ5fSA9PSAxCi0JCUVjaG8gQ3JlYXRlZCBtcHctYnVpbGQgaW4gImBEaXJlY3RvcnlgIgotCUVuZCBJZgotRW5kIElmCi0KLSMgQXBwbHkgb3Vyc2VsdmVzIHJlY3Vyc2l2ZWx5IHRvIHRoZSBsaXN0IG9mIHN1YmRpcmVjdG9yaWVzIHRvIGNvbmZpZ3VyZS4KLQotSWYge3JlY3Vyc2V9ID09IDEKLQlGb3Igc3ViZGlyIEluIHtjb25maWdkaXJzfQotCQlTZXQgc2F2ZWRpciAiYERpcmVjdG9yeWAiCi0JCUlmICJgRXhpc3RzICJ7c3JjZGlyfXtzdWJkaXJ9OiJgIiA9PSAiIgotCQkJSWYge3ZlcmlmeX0gPT0gMQotCQkJCUVjaG8gTm8gIntzcmNkaXJ9e3N1YmRpcn06IiBmb3VuZCwgc2tpcHBpbmcKLQkJCUVuZCBJZgotCQkJQ29udGludWUKLQkJRW5kIElmCi0JCUlmIHt2ZXJpZnl9ID09IDEKLQkJCUVjaG8gQ29uZmlndXJpbmcge3N1YmRpcn0uLi4KLQkJRW5kIElmCi0JCUlmICJgRXhpc3RzICJ7b2JqZGlyfXtzdWJkaXJ9OiJgIiA9PSAiIgotCQkJTmV3Rm9sZGVyICJ7b2JqZGlyfXtzdWJkaXJ9IgotCQlFbmQgSWYKLQkJU2V0RGlyZWN0b3J5ICJ7b2JqZGlyfXtzdWJkaXJ9OiIKLQkJIntUaGlzU2NyaXB0fSIgLS10YXJnZXQgInt0YXJnZXRfY2Fub25pY2FsfSIgLS1zcmNkaXIgIntzcmNkaXJ9e3N1YmRpcn06IiAtLXNyY3Jvb3QgIntzcmNyb290fSIgLS1wcmVmaXggIntwcmVmaXh9IiAtLWNjICJ7aG9zdF9jY30iIHt2ZXJpZnlzdHJ9IHtlbmFibGVfb3B0aW9uc30ge2Rpc2FibGVfb3B0aW9uc30KLQkJU2V0RGlyZWN0b3J5ICJ7c2F2ZWRpcn0iCi0JRW5kIEZvcgotRW5kIElmCi0KLVNldERpcmVjdG9yeSAie3NhdmVkaXJ9IgpkaWZmIC0tZ2l0IGEvbXB3LWluc3RhbGwgYi9tcHctaW5zdGFsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjNWFhYy4uMDAwMDAwMAotLS0gYS9tcHctaW5zdGFsbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jIEdOVSBJbnN0YWxsIHNjcmlwdCBmb3IgTVBXLgotCi1TZXQgT2xkRXhpdCAie0V4aXR9IgotU2V0IEV4aXQgMAotCi1TZXQgVGVtcFVzZXJTdGFydHVwICJ7VGVtcEZvbGRlcn0iX190ZW1wX19Vc2VyU3RhcnR1cAotCi1FY2hvICcjIFVzZXJTdGFydHVwIGdlbmVyYXRlZCBieSBHTlUgSW5zdGFsbCBzY3JpcHQnID4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyAoc2hvdWxkKSBDaGVjayB0aGF0IGRpc2sgc3BhY2UgaXMgc3VmZmljaWVudCBmb3IgaW5zdGFsbGF0aW9uLgotCi0jIEFzc3VtZSB0aGF0IHRoZSBpbnN0YWxsIHNjcmlwdCBpcyB3aGVyZSBldmVyeXRoaW5nIGVsc2UgaXMuCi0KLVNldCB0aGlzZGlyICJgRGlyZWN0b3J5YCIKLQotIyBDb3B5IHRoZSBiaW5hcmllcyB0byB0aGUgZGVzaXJlZCBwbGFjZS4KLQotQ29uZmlybSAtdCAiQ29weSB0aGUgYmluYXJpZXMgdG8gc29tZXdoZXJlIGVsc2U/IgotU2V0IFRtcFN0YXR1cyB7U3RhdHVzfQotSWYge1RtcFN0YXR1c30gPT0gMAotCVNldCBiaW5kZXN0ICJgR2V0RmlsZU5hbWUgLWQgLW0gIldoZXJlIHRvIGluc3RhbGwgdGhlIGJpbmFyaWVzPyJgIgotCUlmIHtTdGF0dXN9ID09IDAKLQkJSWYgImBFeGlzdHMgInt0aGlzZGlyfWJpbiJgIiAhPSAiIgotCQkJRm9yIGFmaWxlIEluICJ7dGhpc2Rpcn0iYmluOlxPcHRpb24teAotCQkJCUR1cGxpY2F0ZSAteSAie2FmaWxlfSIgIntiaW5kZXN0fSIKLQkJCUVuZCBGb3IKLQkJRWxzZQotCQkJRWNobyAiYmluIGRpcmVjdG9yeSBub3QgZm91bmQsIGV4aXRpbmciCi0JCQlFeGl0IDEKLQkJRW5kIElmCi0JRWxzZQotCQlFY2hvICJObyBkZXN0aW5hdGlvbiBzdXBwbGllZCwgZXhpdGluZyIKLQkJRXhpdCAxCi0JRW5kIElmCi1FbHNlIElmIHtUbXBTdGF0dXN9ID09IDQKLQkjIFVzZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5LgotCVNldCBiaW5kZXN0ICJ7dGhpc2Rpcn1iaW46IgotRWxzZQotCSMgQ2FuY2VsbGVkIGZyb20gY29uZmlybWF0aW9uLCBlc2NhcGUgYWx0b2dldGhlci4KLQlFeGl0IDEKLUVuZCBJZgotCi0jIENvcHkgdGhlIGxpYnJhcmllcyB0byB0aGUgZGVzaXJlZCBwbGFjZS4KLQotQ29uZmlybSAtdCAiQ29weSB0aGUgbGlicmFyaWVzIHRvIHNvbWV3aGVyZSBlbHNlPyIKLVNldCBUbXBTdGF0dXMge1N0YXR1c30KLUlmIHtUbXBTdGF0dXN9ID09IDAKLQlTZXQgbGliZGVzdCAiYEdldEZpbGVOYW1lIC1kIC1tICJXaGVyZSB0byBpbnN0YWxsIHRoZSBsaWJyYXJpZXM/ImAiCi0JSWYge1N0YXR1c30gPT0gMAotCQlJZiAiYEV4aXN0cyAie3RoaXNkaXJ9bGliOiJgIiAhPSAiIgotCQkJRm9yIGFmaWxlIEluICJ7dGhpc2Rpcn0ibGliOlxPcHRpb24teAotCQkJCUR1cGxpY2F0ZSAteSAie2FmaWxlfSIgIntsaWJkZXN0fSIKLQkJCUVuZCBGb3IKLQkJRWxzZQotCQkJRWNobyAibGliIGRpcmVjdG9yeSBub3QgZm91bmQsIGV4aXRpbmciCi0JCQlFeGl0IDEKLQkJRW5kIElmCi0JRWxzZQotCQlFY2hvICJObyBkZXN0aW5hdGlvbiBzdXBwbGllZCwgZXhpdGluZyIKLQkJRXhpdCAxCi0JRW5kIElmCi1FbHNlIElmIHtUbXBTdGF0dXN9ID09IDQKLQkjIFVzZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5LgotCVNldCBsaWJkZXN0ICJ7dGhpc2Rpcn1saWI6IgotRWxzZQotCSMgQ2FuY2VsbGVkIGZyb20gY29uZmlybWF0aW9uLCBlc2NhcGUgYWx0b2dldGhlci4KLQlFeGl0IDEKLUVuZCBJZgotCi0KLSMgQWRkIHRoZSBsb2NhdGlvbiBvZiB0aGUgYmluYXJpZXMgdG8gdGhlIGNvbW1hbmQgcGF0aC4KLQotRWNobyAtbiAnU2V0IENvbW1hbmRzICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAtbiAie2JpbmRlc3R9IgkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICAgICcse0NvbW1hbmRzfSInCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgU2V0IHVwIEdDQyBleGVjIHByZWZpeC4KLQotU2V0IGdjY2xpYmRpciAie2xpYmRlc3R9ImdjYy1saWI6Ci0KLUVjaG8gLW4gJ1NldCBHQ0NfRVhFQ19QUkVGSVggIicJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvIC1uICJ7Z2NjbGliZGlyfSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAgICAnIicJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gIkV4cG9ydCBHQ0NfRVhFQ19QUkVGSVgiCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyBTZXQgdXAgcGF0aCB0byBsaWJnY2MueGNvZmYgZXRjLgotCi1FY2hvIC1uICdTZXQgR0NDUFBDTGlicmFyaWVzICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAtbiAie2xpYmRlc3R9IgkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICAgICciJwkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAiRXhwb3J0IEdDQ1BQQ0xpYnJhcmllcyIJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIERpc3BsYXkgY29udGVudHMgb2YgVXNlclN0YXJ0dXAsIGNvbmZpcm0gaW5zdGFsbGF0aW9uLgotCi1TZXQgVXNlclN0YXJ0dXBOYW1lICJVc2VyU3RhcnR1cFxPcHRpb24tOEdOVSIKLQotRWNobyAiQ29udGVudHMgb2YiIHtVc2VyU3RhcnR1cE5hbWV9ICJ3aWxsIGJlOiIKLUNhdGVuYXRlICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotQ29uZmlybSAiSW5zdGFsbCB7VXNlclN0YXJ0dXBOYW1lfSBpbnRvIHRoZSBNUFcgZm9sZGVyIHtNUFd9ID8iCi1JZiB7U3RhdHVzfSA9PSAwCi0JRHVwbGljYXRlICJ7VGVtcFVzZXJTdGFydHVwfSIgIntNUFd9e1VzZXJTdGFydHVwTmFtZX0iCi0JRGVsZXRlIC15ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVsc2UKLQlFY2hvICJ7VXNlclN0YXJ0dXBOYW1lfSBmaWxlIG5vdCBpbnN0YWxsZWQiCi1FbmQgSWYKLQotIyAoc2hvdWxkKSBDaGVjayBIRVhBIHJlc291cmNlLCB3YXJuIGlmIGxvdy4KLQotIyAoc2hvdWxkKSBDaGVjayBmb3Igc3BhY2VzIGluIHBhdGhuYW1lcywgd2FybiBpZiBmb3VuZC4KLQotRWNobyAiSW5zdGFsbGF0aW9uIHdhcyBzdWNjZXNzZnVsLiIKLUVjaG8gIiIKLUVjaG8gIkJlIHN1cmUgdG8gcmV2aWV3IHRoZSB1c2FnZSBub3RlcyBpbiAnUmVhZCBNZSBmb3IgTVBXJyBiZWZvcmUgcHJvY2VlZGluZyEiCi0KLSMgUmVzdG9yZSBwcmV2aW91cyBzZXR0aW5ncy4KLQotU2V0IEV4aXQgIntPbGRFeGl0fSIKZGlmZiAtLWdpdCBhL29wY29kZXMvQ2hhbmdlTG9nIGIvb3Bjb2Rlcy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTRjNjkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1MTk3ICswLDAgQEAKLTE5OTktMDctMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEaXNwbGF5IGhleCBlcXVpdmFsZW50IG9mIHJvdGF0ZWQKLQljb25zdGFudC4gCi0KLTE5OTktMDYtMjMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYzogTWVudGlvbiBpbnRlbCBtb2RlIHNwZWNpYWxzIGluIG1hY3JvIGNoYXIgY29tbWVudC4KLQotMTk5OS0wNi0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFscGhhLWRpcy5jOiBEb24ndCBpbmNsdWRlIDxzdGRsaWIuaD4uCi0JKiBhcm0tZGlzLmM6IEluY2x1ZGUgInN5c2RlcC5oIi4KLQkqIHRpYzMwLWRpcy5jOiBEb24ndCBpbmNsdWRlIDxzdGRsaWIuaD4gb3IgPHN0cmluZy5oPi4gIEluY2x1ZGUKLQkic3lzZGVwLmgiLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBBZGQgZGV0ZWN0aW9uIG9mIElNQiBhbmQgSU1CUmFuZ2UKLQlTV0lzLiAKLQotMTk5OS0wNi0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4gJiBEcmV3IE1vc2xleSA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChhcm1fcmVnbmFtZXMpOiBUdXJuIGludG8gYSBwb2ludGVyIHRvIGEgcmVnaXN0ZXIKLQluYW1lIHNldC4KLQkoYXJtX3JlZ25hbWVzX3N0YW5kYXJkKTogTmV3IHZhcmlhYmxlOiBBcnJheSBvZiBBUk0gcmVnaXN0ZXIKLQluYW1lcyBhY2NvcmRpbmcgdG8gQVJNIGluc3RydWN0aW9uIHNldCBub21lbmNsYXR1cmUuIAotCShhcm1fcmVnbmFtZXNfYXBjcyk6IE5ldyB2YXJpYWJsZTogQXJyYXkgb2YgQVJNIHJlZ2lzdGVyIG5hbWVzCi0JYWNjb3JkaW5nIHRvIEFSTSBQcm9jZWR1cmUgQ2FsbCBTdGFuZGFyZC4KLQkoYXJtX3JlZ25hbWVzX3Jhdyk6IE5ldyB2YXJpYWJsZTogQXJyYXkgb2YgQVJNIHJlZ2lzdGVyIG5hbWVzCi0JdXNpbmcganVzdCAncicgYW5kIHRoZSByZWdpc3RlciBudW1iZXIuCi0JKGFybV90b2dnbGVfcmVnbmFtZXMpOiBOZXcgZnVuY3Rpb246IFRvZ2dsZSB0aGUgY2hvc2VuIHJlZ2lzdGVyIHNldAotCW5hbWluZyBzY2hlbWUuCi0JKHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zKTogTmV3IGZ1bmN0aW9uOiBQYXJzZSBhbnkgdGFyZ2V0Ci0JZGlzYXNzZW1ibGVyIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCShwcmludF9pbnNuX2JpZ19hcm0pOiBDYWxsIHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIGlmIGFueQotCWFyZSBkZWZpbmVkLgotCShwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBDYWxsIHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIGlmIGFueQotCWFyZSBkZWZpbmVkLgotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoRldBSVRfT1BDT0RFKTogRGVmaW5lLgotCSh1c2VkX3ByZWZpeGVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZmV0Y2hfZGF0YSk6IERvbid0IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgaGF2ZSBhbHJlYWR5Ci0JZmV0Y2hlZCBzb21lIGJ5dGVzIHN1Y2Nlc3NmdWxseS4KLQkoY2twcmVmaXgpOiBDbGVhciB1c2VkX3ByZWZpeGVzLiAgVXNlIEZXQUlUX09QQ09ERSwgbm90IDB4OWIuCi0JKHByZWZpeF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9pMzg2KTogSWYgc2V0am1wIGZhaWxzLCBpbmRpY2F0aW5nIGEgZGF0YSBlcnJvciwgYnV0Ci0Jd2UgaGF2ZSBtYW5hZ2VkIHRvIGZldGNoIHNvbWUgYnl0ZXMsIHByaW50IHRoZSBmaXJzdCBvbmUgYXMgYQotCXByZWZpeCBvciBhIC5ieXRlIHBzZXVkby1vcC4gIElmIGZ3YWl0IGlzIGZvbGxvd2VkIGJ5IGEgbm9uCi0JZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24sIHByaW50IHRoZSBmaXJzdCBwcmVmaXguICBTZXQKLQl1c2VkX3ByZWZpeGVzIHdoZW4gcHJlZml4ZXMgYXJlIHVzZWQuICBJZiBhbnkgcHJlZml4ZXMgd2VyZSBub3QKLQl1c2VkIGFmdGVyIGRpc2Fzc2VtYmxpbmcgdGhlIGluc3RydWN0aW9uLCBwcmludCB0aGUgZmlyc3QgcHJlZml4Ci0JaW5zdGVhZCBvZiBwcmludGluZyB0aGUgaW5zdHJ1Y3Rpb24uCi0JKHB1dG9wKTogU2V0IHVzZWRfcHJlZml4ZXMgd2hlbiBwcmVmaXhlcyBhcmUgdXNlZC4KLQkoYXBwZW5kX3NlZywgT1BfRSwgT1BfRywgT1BfUkVHLCBPUF9JLCBPUF9zSSwgT1BfSik6IExpa2V3aXNlLgotCShPUF9ESVIsIE9QX1NJTURfU3VmZml4KTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMDcgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMtb3BjLmM6IEZpeCB1cCBzZXQsIHNldHN3LCBzZXR1dyBvcGVyYW5kIGtpbmRzLgotCVN1cHBvcnQgc2lnbnggJXJlZywgY2xydXcgJXJlZy4KLQotMTk5OS0wNi0wNyAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy1vcGMuYzogQWRkIGFsaWFzZXMgU29sYXJpcyBhcyBzdXBwb3J0cy4KLQotTW9uIEp1biAgNyAxMjowNDo1MiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChDRklMRVMpOiBBZGQgYXJjLXtkaXMsb3BjfS5jIGFuZCB2ODUwLXtkaXMsb3BjfS5jLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA2LTAzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogTWFrZSBMRFJIL0xEUkIgY29uc2lzdGVudCB3aXRoIExEUgotCXdoZW4gdGFyZ2V0IGlzIFBDLXJlbGF0aXZlLgotCi0xOTk5LTA1LTI4ICBMaW51cyBOb3JkYmVyZyAgPGxpbnVzLm5vcmRiZXJnQGNhbml0LnNlPgotCi0JKiBtNjhrLW9wYy5jOiBSZW5hbWUgTUFDTC9NU0FDTCB0byBNQUMvTVNBQy4gIEFkZCBNQUNNL01TQUNNLiAgQWRkCi0JTU9WRSBNQUNTUixDQ1IuCi0KLQkqIG02OGstZGlzLmMgKGZldGNoX2FyZyk6IEFkZCBwbGFjZXMgYG4nLCBgbycuCi0KLQkqIG02OGstb3BjLmM6IEFkZCBNU0FDLCBNQUNMLCBNT1ZFIHRvL2Zyb20gQUNDLCBNQUNTUiwgTUFTSy4KLQlBZGQgbWNmNTIwNmUgdG8gYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb25zLgotCUFkZCBhbGlhcyBmb3IgTUFDLCBNU0FDLgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEFkZCBmb3JtYXRzIGBFJywgYEcnLCBgSCcgYW5kIHBsYWNlCi0JYE4nLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGQgZGl2c3csIGRpdnNsLCBkaXZ1dywgZGl2dWwsIG1hY2wsCi0JbWFjdywgcmVtc2wsIHJlbXVsIGZvciBtY2Y1MzA3LiAgQ2hhbmdlIG1jZjUyMDAgLS0+IG1jZi4KLQotCSogbTY4ay1kaXMuYzogQWRkIGZvcm1hdCBgdScgYW5kIHBsYWNlcyBgaCcsIGBtJywgYE0nLgotCi0xOTk5LTA1LTE4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKEVkKTogRGVmaW5lLgotCShkaXMzODZfdHdvYnl0ZV9hdHQsIGRpczM4Nl90d29ieXRlX2ludGVsKTogVXNlIEVkIGZvciBtb3ZkLgotCShSdyk6IFJlbW92ZS4KLQkoT1Bfcm0pOiBSZW5hbWUgdG8gT1BfUmQuCi0JKE9ORSk6IFJlbW92ZS4KLQkoT1BfT05FKTogUmVtb3ZlLgotCShwdXRvcCk6IEFkZCBjb25zdCB0byB0ZW1wbGF0ZSBhbmQgcC4KLQkocHJpbnRfaW5zbl94ODYpOiBEZWxldGUuCi0JKHByaW50X2luc25faTM4Nik6IE1lcmdlIG9sZCBmdW5jdGlvbiBwcmludF9pbnNuX3g4Ni4gIEFkZCBjb25zdAotCXRvIGRwLgotCShzdHJ1Y3QgZGlzMzg2KTogQWRkIGNvbnN0IHRvIG5hbWUuCi0JKGRpczM4Nl9hdHQsIGRpczM4Nl9pbnRlbCk6IEFkZCBjb25zdC4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0LCBkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IEFkZCBjb25zdC4KLQkobmFtZXMzMiwgbmFtZXMxNiwgbmFtZXM4LCBuYW1lc19zZWcsIGluZGV4MTYpOiBBZGQgY29uc3QuCi0JKGdycHMsIHByZWZpeF91c2VyX3RhYmxlLCBmbG9hdF9yZWcpOiBBZGQgY29uc3QuCi0JKGZsb2F0X21lbV9hdHQsIGZsb2F0X21lbV9pbnRlbCk6IEFkZCBjb25zdC4KLQkob2FwcGVuZCk6IEFkZCBjb25zdCB0byBzLgotCShPUF9SRUcpOiBBZGQgY29uc3QgdG8gcy4KLQkocHRyX3JlZyk6IEFkZCBjb25zdCB0byBzLgotCShkb2Zsb2F0KTogQWRkIGNvbnN0IHRvIGRwLgotCShPUF9DKTogRG9uJ3Qgc2tpcCBtb2RybSwgaXQncyBub3cgZG9uZSBpbiBPUF9SZC4KLQkoT1BfRCk6IERpdHRvLgotCShPUF9UKTogRGl0dG8uCi0JKE9QX1JkKTogQ2hlY2sgZm9yIHZhbGlkIG1vZC4gIENhbGwgT3BfRSB0byBwcmludC4KLQkoT1BfRSk6IEhhbmRsZSBkX21vZGUgYXJnLiAgQ2hlY2sgZm9yIGJhZCBzZmVuY2UsbGVhLGxkcyBldGMuCi0JKE9QX01TKTogQ2hlY2sgZm9yIHZhbGlkIG1vZC4gIENhbGwgT3BfRU0gdG8gcHJpbnQuCi0JKE9QXzNETm93U3VmZml4KTogU2V0IG9idWZwIGFuZCB1c2Ugb2FwcGVuZCByYXRoZXIgdGhhbgotCXN0cmNhdC4gIENhbGwgQmFkT3AoKSBmb3IgZXJyb3JzLgotCShPUF9TSU1EX1N1ZmZpeCk6IExpa2V3aXNlLgotCShCYWRPcCk6IE5ldyBmdW5jdGlvbi4KLQotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZfaW50ZWwpOiBSZW1vdmUgbWFjcm8gY2hhcnMsIGV4Y2VwdCBmb3IKLQlqRWN4ei4gIENoYW5nZSBjV3RSIGFuZCBjUnRkIHRvIGNXIGFuZCBjUi4KLQkoZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBSZW1vdmUgbWFjcm8gY2hhcnMgaGVyZSB0b28uCi0JKHB1dG9wKTogSGFuZGxlIFIgYW5kIFcgbWFjcm9zIGZvciBpbnRlbCBtb2RlLgotCi0JKiBpMzg2LWRpcy5jIChTSU1EX0ZpeHVwKTogTmV3IGZ1bmN0aW9uLgotCShkaXMzODZfdHdvYnl0ZV9hdHQpOiBVc2UgaXQgb24gbW92bHBzIGFuZCBtb3ZocHMsIGFuZCBjaGFuZ2UKLQlFdiB0byBFWCBvbiB0aGVzZSBpbnNucy4gIENoYW5nZSBtb3Ztc2twcyBFdiwgWE0gdG8gR3YsIEVYLgotCShkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IFNhbWUgaGVyZS4KLQotCSogaTM4Ni1kaXMuYyAoQXYpOiBSZW1vdmUuCi0JKEFwKTogcmVtb3ZlIGxwdHIuCi0JKGxwdHIpOiBSZW1vdmUuCi0JKE9QU0lNRCk6IERlZmluZS4KLQkoT1BfU0lNRF9TdWZmaXgpOiBOZXcgZnVuY3Rpb24uCi0JKE9QX0RJUik6IFJlbW92ZSBkZWFkIGNvZGUuCi0JKGVBWF9yZWcuLmVESV9yZWcpOiBSZW51bWJlci4KLQkob25lYnl0ZV9oYXNfbW9kcm0pOiBUYWJsZSBudW1iZXJpbmcgY29tbWVudHMuCi0JKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik6IE1vdmUgdG8gYmVmb3JlIHByaW50X2luc25feDg2LgotCShwcmludF9pbnNuX3g4Nik6IE1vdmUgYWxsIHByZWZpeCBvYXBwZW5kcyB0byBhZnRlciB1c2VzX2YzX3ByZWZpeAotCWNoZWNrcy4gIFByaW50IGVycm9yIG9uIGludmFsaWQgZHAtPmJ5dGVtb2RlMi4gIFJlbW92ZSBzaW1kX2NtcCwKLQlhbmQgaGFuZGxlIFNJTUQgY21wIGluc25zIGluIE9QX1NJTURfU3VmZml4LgotCShpbmZvLT5ieXRlc19wZXJfbGluZSk6IEJ1bXAgZnJvbSA1IHRvIDYuCi0JKE9QX05vbmUpOiBSZW1vdmUuCi0JKE9QX0UpOiBVc2UgSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SLiAgSGFuZGxlIHNmZW5jZS4KLQkoT1BfM0ROb3dTdWZmaXgpOiBFbnN1cmUgbW5lbW9uaWMgaW5kZXggdW5zaWduZWQuCi0KLQlQSUlJIFNJTUQgc3VwcG9ydCBmcm9tIERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KLQkqIGkzODYtZGlzLmMgKFhNLCBFWCwgTm9uZSk6IERlZmluZS4KLQkoT1BfWE1NLCBPUF9FWCwgT1BfTm9uZSk6IE5ldyBmdW5jdGlvbnMuCi0JKFVTRV9HUk9VUFMsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSk6IERlZmluZS4KLQkoR1JQMTQpOiBSZW5hbWUgdG8gR1JQQU1ELgotCShHUlAqKTogQWRkIFVTRV9HUk9VUFMgZmxhZy4KLQkoUFJFR1JQKik6IERlZmluZS4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0LCBkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IEFkZCBTSU1EIGluc25zLgotCSh0d29ieXRlX2hhc19tb2RybSk6IEFkZCBTSU1EIGVudHJpZXMuCi0JKHR3b2J5dGVfdXNlc19mM19wcmVmaXgsIHNpbWRfY21wX29wLCBwcmVmaXhfdXNlcl90YWJsZSk6IE5ldy4KLQkoZ3Jwcyk6IEFkZCBTSU1EIGluc25zLgotCShwcmludF9pbnNuX3g4Nik6IE5ldyB2YXJzIHVzZXNfZjNfcHJlZml4IGFuZCBzaW1kX2NtcC4gIERvbid0Ci0Jb2FwcGVuZCByZXB6IGlmIHVzZXNfZjNfcHJlZml4LiAgQWRkIGNvZGUgdG8gaGFuZGxlIG5ldyBncm91cHMgZm9yCi0JU0lNRCBpbnNucy4KLQotCUZyb20gTWFjaWVqIFcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+Ci0JKiBpMzg2LWRpcy5jIChkaXMzODZfYXR0LCBkaXMzODZfaW50ZWwpOiBDaGFuZ2UgMHhFOCBjYWxsIGluc24KLQlvcGVyYW5kIGZyb20gQXYgdG8gSnYuCi0KLTE5OTktMDUtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLWRpcy5jIChwcmludF9pbnNuX21jb3JlKTogVXNlIC5zaG9ydCB0byBkaXNwbGF5Ci0JdW5pZGVudGlmaWVkIGluc3RydWN0aW9ucywgbm90IC53b3JkLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jLG0zMnItb3BjLmM6IFJlYnVpbGQuCi0KLU1vbiBBcHIgMTIgMjM6NDY6MTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEsIGNhc2UgJzMnKTogTmV3IGNhc2UgZm9yIFBBMi4wCi0JaW5zdHJ1Y3Rpb25zLgotCi0xOTk5LTA0LTEwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtaWJsZC5jOiBSZWJ1aWxkLgotCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1vcGluc3QuYzogUmVidWlsZC4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9waW50bC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKGludGVsX3N5bnRheCwgb3Blbl9jaGFyLCBjbG9zZV9jaGFyKTogTWFrZSBzdGF0aWMuCi0JKHNlcGFyYXRvcl9jaGFyLCBzY2FsZV9jaGFyKTogTGlrZXdpc2UuCi0JKHByaW50X2luc25feDg2KTogTGlrZXdpc2UuCi0JKHByaW50X2luc25faTM4Nik6IExpa2V3aXNlLiAgQWRkIGRlY2xhcmF0aW9uLgotCi0xOTk5LTAzLTI2ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtZGlzLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWRpcy5jOiBSZWJ1aWxkLgotCi0xOTk5LTAzLTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbTY4ay1vcGMuYzogQ2hhbmdlIGNvbXBhcmUgaW5zdHJ1Y3Rpb25zIHRvIHVzZSAiQHMiIHJhdGhlciB0aGFuCi0JIjtzIiB3aGVuIHVzZWQgd2l0aCBhbiBpbW1lZGlhdGUgb3BlcmFuZC4KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBEZWxldGUuCi0JKGNnZW5fbG9va3VwX2luc24pOiBtYXhfaW5zbl9zaXplIHJlbmFtZWQgdG8gbWF4X2luc25fYml0c2l6ZS4KLQkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOgotCVJlYnVpbGQuCi0JKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDoKLQlSZWJ1aWxkLgotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlYnVpbGQuCi0KLTE5OTktMDMtMTYgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChtdnRzeXMpOiBSZW1vdmUgRkxBR19MS1IuCi0KLTE5OTktMDMtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9zZXRfY3B1KTogTmV3IGFyZyBgaXNhJy4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZSxjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSk6IE5ldyBmbnMuCi0JKGNnZW5fZ2V0X2luc25fb3BlcmFuZHMpOiBSZXdyaXRlIHRlc3QgZm9yIGhhcmRjb2RlZC9vcGVyYW5kIGluZGV4LgotCSogZnIzMC1hc20uYyxmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jOiBSZWJ1aWxkLgotCSogbTMyci1hc20uYyxtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jOiBSZWJ1aWxkLgotCSogbTMyci1vcGluc3QuYzogUmVidWlsZC4KLQotMTk5OS0wMi0yNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lKTogUmV3cml0ZS4KLQkoY2dlbl9od19sb29rdXBfYnlfbnVtKTogUmV3cml0ZS4KLQkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItb3BpbnN0LmM6IFJlYnVpbGQuCi0KLVNhdCBGZWIgMTMgMTQ6MDY6MTkgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmM6IEFkZCBzcXJ0K2ZsYWdzIHBhdHRlcm5zLiAgQWRkIEVWNiBQQUxjb2RlIGluc25zLgotCShpbnNlcnRfamhpbnQpOiBGaXggaW5zZXJ0aW9uIG1hc2suCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IERpc2Fzc2VtYmxlIEVWNiBQQUxjb2RlIGluc25zLgotCi0xOTk5LTAyLTEwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGk5NjBjLWFzbS5jLGk5NjBjLWRpcy5jLGk5NjBjLW9wYy5jLGk5NjBjLW9wYy5oOiBEZWxldGUuCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBSZW5hbWUgZnJvbSBwcmludF9pbnNuX2k5NjBfb3JpZy4KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGVtLgotCShIRklMRVMpOiBBZGQgZnIzMC1kZXNjLmgsbTMyci1kZXNjLmguCi0JKENGSUxFUyk6IEFkZCBmcjMwLWRlc2MuYyxmcjMwLWlibGQuYyxtMzJyLWRlc2MuYyxtMzJyLWlibGQuYywKLQltMzJyLW9waW5zdC5jLgotCShBTExfTUFDSElORVMpOiBVcGRhdGUuCi0JKiBjb25maWd1cmUuaW46IFJlZG8gaGFuZGxpbmcgb2YgY2dlbl9maWxlcy4KLQkoYmZkX2k5NjBfYXJjaCk6IERlbGV0ZSBpOTYwYy0qLmxvIGZpbGVzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY2dlbi1hc20uYyAoKik6IENHRU5fT1BDT0RFX0RFU0MgcmVuYW1lZCB0byBDR0VOX0NQVV9ERVNDLgotCShoYXNoX2luc25fYXJyYXkpOiBSZXdyaXRlLgotCSogY2dlbi1kaXMuYyAoKik6IENHRU5fT1BDT0RFX0RFU0MgcmVuYW1lZCB0byBDR0VOX0NQVV9ERVNDLgotCShoYXNoX2luc25fYXJyYXkpOiBSZXdyaXRlLgotCSogY2dlbi1vcGMuYyAoKik6IENHRU5fT1BDT0RFX0RFU0MgcmVuYW1lZCB0byBDR0VOX0NQVV9ERVNDLgotCShjZ2VuX2xvb2t1cF9pbnNuLGNnZW5fZ2V0X2luc25fb3BlcmFuZHMpOiBEZWZpbmUgaGVyZS4KLQkoY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMpOiBEaXR0by4KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCSogcG8vUE9URklMRVMuaW46IFJlYnVpbGQuCi0JKiBwby9vcGNvZGVzLnBvdDogUmVidWlsZC4KLQotRnJpIEZlYiAgNSAwMDowNDoyNCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoSEZJTEVTKTogQWRkIGZyMzAtb3BjLmguCi0JKENGSUxFUyk6IEFkZCBmcjMwLWFzbS5jLCBmcjMwLWRpcy5jLCBmcjMwLW9wYy5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgUmVtb3ZlIEFNX0NZR1dJTjMyLgotCUNoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhUIGFuZCBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGF1dG9jb25mL2F1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBjb25maWcuaW46IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi1UaHUgRmViICA0IDEzOjQ4OjUyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQ29ycmVjdCBtb3ZlIChub3QgbW92ZXcpIHRvIHN0YXR1cyB3b3JkIG9uIDUyMDAuCi0KLU1vbiBGZWIgIDEgMjA6NTQ6MzYgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiAgSGFuZGxlIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXguCi0gICAgICAgICogaTM4Ni1kaXMuYyAoeF9tb2RlKTogIERlZmluZS4KLSAgICAgICAgKGRpczM4Nik6ICBSZW1vdmUuCi0gICAgICAgIChkaXMzODZfYXR0KTogIE5ldy4KLSAgICAgICAgKGRpczM4Nl9pbnRlbCk6ICBOZXcuCi0gICAgICAgIChkaXMzODZfdHdvYnl0ZSk6ICBSZW1vdmUuCi0gICAgICAgIChkaXMzODZfdHdvYnl0ZV9hdHQpOiAgTmV3LgotICAgICAgICAoZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiAgTmV3LgotICAgICAgICAocHJpbnRfaW5zbl94ODYpOiAgVXNlIG5ldyBhcnJheXMuCi0gICAgICAgIChmbG9hdF9tZW0pOiAgUmVtb3ZlLgotICAgICAgICAoZmxvYXRfbWVtX2ludGVsKTogIE5ldy4KLSAgICAgICAgKGZsb2F0X21lbV9hdHQpOiAgTmV3LgotICAgICAgICAoZG9mbG9hdCk6ICBVc2UgbmV3IGZsb2F0X21lbSBhcnJheXMuCi0gICAgICAgIChwcmludF9pbnNuX2kzODZfYXR0KTogIE5ldy4KLSAgICAgICAgKHByaW50X2luc25faTM4Nl9pbnRlbCk6ICBOZXcuCi0gICAgICAgIChwcmludF9pbnNuX2kzODYpOiAgSGFuZGxlIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXguCi0gICAgICAgIChwdXRvcCk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1BfaW5kaXJFKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9FKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9JKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9zSSk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1BfT0ZGKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0KLQotCi0xOTk5LTAxLTI3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmgsZnIzMC1vcGMuYzogUmVidWlsZC4KLQkqIGk5NjBjLW9wYy5oLGk5NjBjLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1vcGMuYzogUmVidWlsZC4KLQotVHVlIEphbiAxOSAxODowMTo1NCAxOTk5ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCSogaHBwYS1kaXMuYzogcmV2ZXJ0IEhQIG1lcmdlIGNoYW5nZXMgdW50aWwgSFAgZ2l2ZXMgdXMKLQlhbiB1cGRhdGVkIGZpbGUuCi0JCi0xOTk5LTAxLTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogRGlzcGxheSBBUk0gc3ludGF4IGZvciBQQyByZWxhdGl2ZQotCW9mZnNldHMgYXMgd2VsbCBhcyBzeW1ibG9pYyBhZGRyZXNzLgotCi1UdWUgSmFuIDE5IDEwOjUxOjAxIDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBocHBhLWRpcy5jOiBmaXggY29tbWVudHMgYW5kIHNvbWUgaW5kZW50YXRpb24uCi0KLTE5OTktMDEtMTIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYyxpOTYwYy1vcGMuYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA2ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmgsZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQkqIGk5NjBjLWFzbS5jLGk5NjBjLWRpcy5jLGk5NjBjLW9wYy5oLGk5NjBjLW9wYy5jOiBSZWdlbmVyYXRlLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmgsbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMi4xIG9yIGhpZ2hlci4KLQotMTk5OC0xMi0zMCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMxNi1vcGMuYzogTWFyayBicmFuY2ggaW5zbnMgd2l0aCBNSVBTMTZfSU5TTl9CUkFOQ0guCi0KLVdlZCBEZWMgMTYgMTY6MTc6NDkgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMi0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHNldF9taXBzX2lzYV90eXBlKTogSGFuZGxlIGJmZF9tYWNoX21pcHM0MTExLgotCi0xOTk4LTEyLTE1ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTItMTQgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IERlYyAxMCAxODozOTo0NiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBEZWMgMTAgMTI6NDk6MjQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotVHVlIERlYyAgOCAxMzo1NjoxOCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3N0cmNhdF9hZGRyZXNzKTogcmVmb3JtYXQgdG8gR05VIGNvZGluZwotCWNvbnZlbnRpb25zLiAgY2hhbmdlIHNwcmludGYgY2FsbCB0byBhbiBzcHJpbnRmX3ZtYSBjYWxsLgotCi1UdWUgRGVjICA4IDEzOjEyOjQ0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBEZWMgIDggMTA6NTA6NDYgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5Ci0JRWxlbmEgWmFubm9uaSA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+LAotCURhdmlkIFRheWxvciA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+LCBhbmQKLQlFZGl0aCBFcHN0ZWluIDxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8KLQltZXJnZSBpbiBjaGFuZ2VzIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cgZW50cmllcy4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3N0cmNhdF9hZGRyZXNzKTogbmV3IGZ1bmN0aW9uLgotCi0JKiBocHBhLWRpcy5jOiBDaGFuZ2VzIHRvIGltcHJvdmUgaHBwYSBkaXNhc3NlbWJseS4KLQkgIENoYW5nZWQgZm9ybWF0dGluZyBpbiA6IHJlZ19uYW1lcywgZnBfcmVnX25hbWVzLGNvbnRyb2xfcmVnLCAKLQkgIE5ldyB2YXJpYWJsZXMgOiBzaWduX2V4dGVuc2lvbl9uYW1lcywgZGVwb3NpdF9uYW1lcywgY29udmVyc2lvbl9uYW1lcwotCSAgICBmbG9hdF90ZXN0X25hbWVzLCBjb21wYXJlX2NvbmRfbmFtZXNfZG91YmxlLCBhZGRfY29uZF9uYW1lc19kb3VibGUsCi0JICAgIGxvZ2ljYWxfY29uZF9uYW1lc19kb3VibGUsIHVuaXRfY29uZF9uYW1lc19kb3VibGUsIAotCSAgICBicmFuY2hfcHVzaF9wb3BfbmFtZXMsIHNhdHVyYXRpb25fbmFtZXMsIHNoaWZ0X25hbWVzLCBtaXhfbmFtZXMsCi0JICBOZXcgTWFjcm9zIDogICBHRVRfQ09NUExfTywgR0VUX1BVU0hfUE9QLE1FUkdFRF9SRUcgCi0JICBNb3ZlIHNvbWUgZGVmaW5pdGlvbnMgdG8gbGliaHBwYS5oOiBHRVRfRklFTEQsIEdFVF9CSVQKLQkgIChmcHV0X2NvbnN0KTogcmVuYW1lZCBhcyBmcHV0X2hleF9jb25zdAotCSAgKHByaW50X2luc25faHBwYSk6Ci0JICAgLSB1c2UgdGhlIG1hY3JvcyBmcHV0c19maWx0ZXJlZCBhbmQKLQkgICAgIGZwdXRfZGVjaW1hbF9jb25zdCB3aGVuZXZlciBwb3NzaWJsZTsgY2FsbHMgdG8gc2lnbl9leHRlbmQgcmVxdWlyZQotCSAgICAgMiBwYXJhbXMgLS0gYWRkIGEgbWlzc2luZyBzZWNvbmQgcGFyYW0gb2YgMC4KLQkgICAtIFNvbWUgbmV3IGNvZGUgaWZkZWZlZCBmb3IgTE9DQUxfT05MWSwgYWxsIHJlbGF0ZWQgdG8gZmlndXJpbmcgb3V0Ci0JICAgICBhcmNoaXRlY3R1cmUgdmVyc2lvbiBudW1iZXIgb2YgY3VycmVudCBtYWNoaW5lLiBIUCBmb2xrcyBhcmUKLQkgICAgIHRyeWluZyB0byBoYW5kbGUgc2l0dWF0aW9uIHdoZXJlIHRoZSB0YXJnZXQgcHJvZ3JhbSB3YXMgY29tcGlsZWQKLQkgICAgIGZvciBQQSAxLnggKDMyLWJpdCksIGJ1dCBpcyBydW5uaW5nIG9uIGEgUEEgMi4wIG1hY2hpbmUgYW5kIAotCSAgICAgdmlzYSB2ZXJzYS4KLQkgICAtIGFkZGVkIG5ldyBjYXNlcyA6ICdnJywgJ0InLCAnbScKLQkgICAtIGFkZGVkIGNhc2VzIHNwZWNpZmljYWxseSBmb3IgUEEgMi4wCi0JICAgLSBjaGFuZ2VkIHRoZSBmb2xsb3dpbmcgY2FzZXMgOiAnIicsICduJywgJ04nLCAncCcsICdaJywgCi0JICAgLSBjYWxscyB0byBmcHV0X2NvbnN0IGJlY29tZSBjYWxscyB0byBmcHV0X2hleF9jb25zdAotCi0xOTk4LTEyLTA3ICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkB3aWxzb24tcGMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENGSUxFUyk6IEFkZCBpOTYwYy1hc20sIGk5NjBjLWRpcy5jLCBpOTYwYy1vcGMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGk5NjBjLWFzbS5sbywgaTk2MGMtZGlzLmxvLCBpOTYwLW9wYy5sby4KLQkoaTk2MC1hc20ubG8sIGk5NjBjLWRpcy5sbywgaTk2MGMtb3BjLmxvKTogTmV3IE1ha2VmaWxlIHJ1bGVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9pOTYwX2FyY2gpOiBBZGQgaTk2MGMtb3BjLmxvLCBpOTYwLWFzbS5vLAotCWk5NjAtZGlzLmMgdG8gdGEuCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBSZW5hbWUgdG8gcHJpbnRfaW5zbl9pOTYwX29yaWcuCi0JKiBpOTYwYy1hc20uYywgaTk2MGMtZGlzLmMsIGk5NjBjLW9wYy5jLCBpOTYwYy1vcGMuaDogTmV3IGZpbGVzLgotCQotTW9uIERlYyAgNyAxNDozMzo0NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1TdW4gRGVjICA2IDE0OjA2OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobWlwc19idWlsdGluX29wY29kZXMpOiBBZGQgZG1mYzIgYW5kIGRtdGMyLgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCBQb3dlclBDNDAzIEdDW1hdIGluc3RydWN0aW9ucy4KLQlGcm9tIFNhaXRvaCBNYXNhbm9idSA8bXNhaXRvaEBzcGEuaXMudWVjLmFjLmpwPi4KLQotRnJpIERlYyAgNCAxNzo0NTo1MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgRGVjICA0IDE3OjA4OjA4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBEZWMgIDMgMTQ6MjY6MjAgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IERlYyAgMyAwMDowOToxNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlLgotCi0xOTk4LTExLTMwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tZGlzLmMgKGhhc2hfaW5zbl9hcnJheSk6IENHRU5fSU5TTl9WQUxVRSAtPgotCUNHRU5fSU5TTl9CQVNFX1ZBTFVFLgotCSogbTMyci1vcGMuYyxtMzJyLW9wYy5oLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQkqIGZyMzAtb3BjLmMsZnIzMC1vcGMuaCxmcjMwLWFzbS5jLGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLVRodSBOb3YgMjYgMTE6MjY6MzIgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMjQgMTE6MjA6NTQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTm92IDIzIDE4OjI4OjQ4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTEtMjAgIERvdWcgRXZhbnMgIDxkZXZhbnNAdG9ib3IudG8uY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0KLVRodSBOb3YgMTkgMTY6MDI6NDYgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWFzbS5jOiBSZWdlbmVyYXRlZC4KLQotVGh1IE5vdiAxOSAwNzo1NDoxNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoc3luYy5wLHN5bmMubCk6IFN3YXAgaW5zbiB2YWx1ZXMuCi0KLTE5OTgtMTEtMTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAdG9ib3IudG8uY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQotV2VkIE5vdiAxOCAyMTozNjozNyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmM6IFJlYnVpbGQuCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KLQotV2VkIE5vdiAxOCAxMTozMDowNCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTm92IDE2IDE5OjIxOjQ4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQkKLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtYXNtLmM6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDEyIDE5OjI0OjE4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1hc20uYzogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMTAgMTU6MjY6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogQWRkIHN1cHBvcnQgZm9yIEZSMzAgdGFyZ2V0LgotCQotVHVlIE5vdiAxMCAxMTowMDowNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVidWlsZC4KLQkqIGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWJ1aWxkLgotCi1Nb24gTm92ICA5IDE4OjIyOjU1IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlZ2VuZXJhdGUuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVnZW5lcmF0ZS4KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1GcmkgTm92ICA2IDE3OjIxOjM4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmM6IFJlZ2VuZXJhdGUuCi0KLVdlZCBOb3YgIDQgMTg6NDY6NDcgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGNhc2UgZm9yIGJmZF9mcjMwX2FyY2guCi0JKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkZWQgZnIzMC1hc20uYywgZnIzMC1kaXMuYywgZnIzMC1vcGMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkZWQgZnIzMC1hc20ubG8sIGZyMzAtZGlzLmxvLCBmcjMwLW9wYy5sby4KLQkoQ0xFQU5GSUxFUyk6IEFkZGVkIHN0YW1wLWZyMzAuCi0JKEZSMzBfREVQUyk6IEFkZGVkLgotCSogZnIzMC1hc20uYzogTmV3IGZpbGUuCi0JKiBmcjMwLWRpcy5jOiBOZXcgZmlsZS4KLQkqIGZyMzAtb3BjLmM6IE5ldyBmaWxlLgotCSogZnIzMC1vcGMuaDogTmV3IGZpbGUuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVnZW5lcmF0ZWQKLQkqIHBvL29wY29kZXMucG90OiBSZWdlbmVyYXRlZAotCi1Nb24gTm92ICAyIDE1OjA1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0gICAgICAgICogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBPY3QgMjcgMDg6NTg6MzcgMTk5OCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKElTX00pOiBBZGRlZC4KLQotTW9uIE9jdCAxOSAxMzowMzoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYyxtMzJyLW9wYy5oLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIE9jdCAgOSAxNDowMTo1NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1TdW4gT2N0ICA0IDIxOjAxOjQ0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoT1BfM0ROb3dTdWZmaXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShPUFNVRik6IERlZmluZS4KLQkoR1JQMTQpOiBEZWZpbmUuCi0JKGRpczM4Nl90d29ieXRlKTogQWRkIEdSUDE0LCBmZW1tcywgYW5kIDNETm93IGVudHJpZXMuCi0JKHR3b2J5dGVfaGFzX21vZHJtKTogU2V0IGVudHJpZXMgY29ycmVzcG9uZGluZyB0byBHUlAxNCwgM0ROb3cuCi0JKGluc25fY29kZXApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcmludF9pbnNuX3g4Nik6IEluaXQgaW5zbl9jb2RlcCBhZnRlciBwcmVmaXhlcy4KLQkoZ3Jwcyk6IEFkZCBHUlAxNCBlbnRyaWVzIGZvciBwcmVmZXRjaCwgcHJlZmV0Y2h3LgotCShPUF9SRUcpOiBSZWZvcm1hdC4KLQotCUZyb20gSmVmZiBCIEVwbGVyIDxqZXBsZXJAdXNncy5nb3Y+Ci0JKiBpMzg2LWRpcy5jIChTdWZmaXgzRE5vdyk6IE5ldyB0YWJsZS4KLQotV2VkIFNlcCAzMCAxMDoxNzo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jOiBUcmVhdCBUUkFQIGFzIGlmIGl0IHdlcmUgYSBicmFuY2ggdHlwZSBpbnN0cnVjdGlvbi4KLQotTW9uIFNlcCAyOCAxNDozNTo0MyAxOTk4ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IElmIG51bSBpcyBub256ZXJvLCB0aGVuCi0JYWRkIE9QRVJBTkRfQUNDMSwgbm90IE9QRVJBTkRfQUNDMC4KLQotVGh1IFNlcCAyNCAwOToyMDowMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBBZGQgRkxBR19KU1IgYXR0cmlidXRlIHRvIERCVCwgUkVJVCwgUlRELCBhbmQgVFJBUAotCWluc25zLiAKLQotVHVlIFNlcCAyMiAxNzo1NToxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBBZGQgdXNlIG9mIEVJVEhFUl9CVVRfUFJFRkVSX01VIGV4ZWN1dGlvbiB1bml0Ci0JY2xhc3MuIAotCi1UdWUgU2VwIDE1IDE1OjE0OjQ1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYzogQWRkIGJicGMsYmJwc3cgc3VwcG9ydC4KLQotMTk5OC0wOS0wOSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQWRkIHN1cHBvcnQgZm9yIFBvd2VyUEMgNzUwIG1vdmUKLQl0by9mcm9tIFNQUnMuCi0KLUZyaSBTZXAgIDQgMTk6NDI6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0pOiBEZXRlY3QgVGh1bWIgc3ltYm9scyBpbiBlbGYKLQlvYmplY3QgZmlsZXMuCi0JKHByaW50X2luc25fbGl0dGxlX2FybSk6IERldGVjdCBUaHVtYiBzeW1ib2xzIGluIGVsZiBvYmplY3QKLQlmaWxlcy4gCi0KLVNhdCBBdWcgMjkgMjI6MjQ6MDkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBVc2UgdGhlIG1hY2hpbmUgdHlwZSB0bwotCWRlY2lkZSB3aGljaCBQQUxjb2RlIHNldCB0byBpbmNsdWRlLgotCi1TdW4gQXVnIDIzIDAyOjE2OjE4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChGQlJYKTogRml4IHR5cG8gaW4gIixhLHBuICVmY2MzIiBjYXNlLgotCi1GcmkgQXVnIDIxIDE2OjA3OjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogQWRkIEZMQUdfTVVMMzIgdG8gTUFDLCBNQUNTLAotCU1TVUIgYW5kIE1TVUJTIGluc3RydWN0aW9ucy4KLQotVGh1IEF1ZyAxMyAxNjoyMzowNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IE9taXQgcGFyZW5zIGFyb3VuZCBhZGRpdGlvbnMgaW4KLQlvcGVyYW5kIG5hbWUgbWFjcm9zLgotCi1XZWQgQXVnIDEyIDE0OjAwOjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUGV0ZXIgSmVyZW15IDxwZXRlci5qZXJlbXlAYXVzczIuYWxjYXRlbC5jb20uYXU+OgotCSogbTY4ay1vcGMuYzogQ29ycmVjdCBtdWxzbCBhbmQgbXVsdWwgdG8gdXNlIHEgcmF0aGVyIHRoYW4gRCwgYSwKLQkrLCAtLCBhbmQgZCBmb3IgQ29sZEZpcmUuCi0KLQlGcm9tIFBldGVyIFRoaWVtYW5uIDx0aGllbWFubkBpbmZvcm1hdGlrLnVuaS10dWViaW5nZW4uZGU+OgotCSogcHBjLW9wYy5jIChpbnNlcnRfbWJlKTogSGFuZGxlIHdyYXBwaW5nIGJpdG1hc2tzLgotCShleHRyYWN0X21iZSk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDEyIDExOjExOjM0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jOiBGaXggdHlwbyBpbiB1ZGYyMCAuLiB1ZGYyNSBpbnN0cnVjdGlvbiBvcGNvZGVzLgotCi0JKiBtMTAzMDAtb3BjLmM6IEZpcnN0IGN1dCBhdCBVREYgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gQXVnIDEwIDE0OjA4OjIyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUgKHJlbW92ZSBzZW1hbnRpYyBkZXNjcmlwdGlvbnMpLgotCi1Nb24gQXVnIDEwIDEyOjUxOjEyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0pOiAgRml4IGluZGVudGF0aW9uLgotICAgICAgICAocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogTGlrZXdpc2UuCi0KLVN1biBBdWcgIDkgMjA6MTc6MjggMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6ICBDaGVjayBmb3IgdGh1bWIgc3ltYm9sCi0gICAgICAgIGF0dHJpYnV0ZXMuCi0gICAgICAgIChwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAgMyAxMjo0MzoxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCU1vdmUgYWxsIGdsb2JhbCBzdGF0ZSBkYXRhIGludG8gb3Bjb2RlIHRhYmxlIHN0cnVjdCwgYW5kIHRyZWF0Ci0Jb3Bjb2RlIHRhYmxlIGFzIHNvbWV0aGluZyB0aGF0IGlzICJvcGVuZWQvY2xvc2VkIi4KLQkqIGNnZW4tYXNtLmMgKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgotCShjZ2VuX2FzbV9pbml0KTogRGVsZXRlLgotCShjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuKTogTmV3IGZ1bmN0aW9uLgotCSogY2dlbi1kaXMuYyAoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCi0JKGNnZW5fZGlzX2luaXQpOiBEZWxldGUuCi0JKiBjZ2VuLW9wYy5jIChhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KLQkoY2dlbl9jdXJyZW50X3tvcGNvZGVfdGFibGVfbWFjaCxlbmRpYW59KTogRGVsZXRlLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEp1bCAzMCAyMTo0MToxMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IEFkZCBuZXcgIkxLUiIgZmxhZyB0byBzb21lCi0JaW5zdHJ1Y3Rpb25zLgotCi1UdWUgSnVsIDI4IDExOjAwOjA5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jOiBBZGQgZW50cmllcyBmb3IgIm5vX21hdGNoX29wZXJhbmRzIiBmaWVsZCBpbgotCXRoZSBvcGNvZGUgdGFibGUuCi0KLUZyaSBKdWwgMjQgMTE6NDE6MzcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYyxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlICgtV2FsbCBjbGVhbnVwcykuCi0KLVR1ZSBKdWwgMjEgMTM6NDE6MDcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYyxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLU1vbiBKdWwgMTMgMTQ6NTM6NTkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChja3ByZWZpeCk6IEhhbmRsZSBmd2FpdCBzcGVjaWFsbHkgb25seSB3aGVuIGl0IGlzbid0Ci0JdGhlIGZpcnN0IHByZWZpeC4KLQkoZG9mbG9hdCk6IENvcnJlY3QgdGVzdCBmb3IgZm5zdHN3LiAgUHJpbnQgYGZuc3RzdyAlYXgnIHJhdGhlcgotCXRoYW4gYGZuc3RzdyAlZWF4Jy4KLQkoT1BfSik6IFJlbW92ZSB1bm5lY2Vzc2FyeSBzdWJ0cmFjdGlvbiB3aGVuIDE2LWJpdCBkaXNwbGFjZW1lbnQKLQl3aWxsIGJlIG1hc2tlZCBsYXRlci4KLQotVGh1IEp1bCAgMiAxNzoxMToyNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCAoQ0dFTl9NSU5fSU5TTl9TSVpFKTogTmV3ICNkZWZpbmUuCi0KLVdlZCBKdWwgIDEgMTY6MTE6MTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdW4gMjYgMTE6MDg6NTUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtZGlzLmM6IE9ubHkgcmVjb2duaXplIGluc3RydWN0aW9ucyBmcm9tIHRoZSBjdXJyZW50bHkKLQlzZWxlY3RlZCBtYWNoaW5lLgotCSogbTEwMzAwLW9wYy5jOiBBZGQgZmllbGQgaW5kaWNhdGluZyB0aGUgcGFydGljdWxhciB2YXJpYW50IG9mCi0JdGhlIG1uMTAzMDAgZWFjaCBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgb24uCi0KLUZyaSBKdW4gMjYgMTI6MDQ6MjEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEZvciBiZmRfdmF4X2FyY2gsIGJ1aWxkIHZheC1kaXMubG8uCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShDRklMRVMpOiBBZGQgdmF4LWRpcy5jLgotCShBTExfTUFDSElORVMpOiBBZGQgdmF4LWRpcy5sby4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGxpYnRvb2wuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDI2IDEyOjAzOjIwIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiB2YXgtZGlzLmM6IE5ldyBmaWxlLCBmcm9tIHdvcmsgYnkgUGF1bGluZSBNaWRkZWxpbmsKLQk8bWlkZGVsaW5AcG9seXdhcmUuaWFmLm5sPi4KLQkqIGRpc2Fzc2VtYmxlLmMgKEFSQ0hfdmF4KTogRGVmaW5lIGlmIEFSQ0hfYWxsLgotCShkaXNhc3NlbWJsZXIpOiBBZGQgY2FzZSBmb3IgQVJDSF92YXguCi0JKiBtYWtlZmlsZS52bXM6IFN1cHBvcnQgY29tcGlsYXRpb24gb24gdm1zL3ZheC4KLQotVHVlIEp1biAyMyAxOTo0MjoxOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG0xMDIwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMjAwKTogRml4IHZhcmlvdXMgbm9uLXBvcnRhYmlsaXRpZXMKLQlyZWxhdGVkIHRvIHNpZ24gZXh0ZW5zaW9uIGFuZCB0aGUgc2l6ZSBvZiBpbnRzLgotCi1UdWUgSnVuIDIzIDEwOjU5OjI2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jOiBTdXBwb3J0IG9uZSBvcGVyYW5kICJhc3IiLCAibHNyIiBhbmQgImFzbCIKLQlpbnN0cnVjdGlvbnMuICBTdXBwb3J0IChzcCkgYWRkcmVzc2luZyBtb2RlIGJ5IGV4cGFuZGluZyBpdCBpbnRvCi0JKDAsc3ApLgotCi1TYXQgSnVuIDIwIDE0OjQ2OjIwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBGaXggYXJndW1lbnQgaW50ZXJjaGFuZ2UgdHlwby4KLQotRnJpIEp1biAxOSAwOToxNjo0MiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG0xMDIwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMjAwKTogUmVjb2duaXplICdicmVhaycgcHNldWRvLW9wLgotCi0xOTk4LTA2LTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogQWRkIHN1cHBvcnQgZm9yIGZ4c2F2ZSwgZnhyc3Rvciwgc3lzZW50ZXIgYW5kCi0Jc3lzZXhpdC4KLQotVGh1IEp1biAxOCAxMDoyMjoyNCAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2xpdHRsZV9taXBzKTogUHJldmlvdXNseSwgaW5zdHJ1Y3Rpb24KLSAJcHJpbnRpbmcgcmVmZXJlbmNlcyB0aGUgc3ltYm9sIHRhYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQotIAlpbnN0cnVjdGlvbiByZXNpZGVzIGluIGEgYmxvY2sgcmVndWxhciBpbnN0cnVjdGlvbnMgb3IgbWlwczE2Ci0gCWluc3RydWN0aW9ucy4gSG93ZXZlciwgd2hlbiB0aGUgZGlzYXNzZW1ibGVyIGdldHMgdXNlZCBpbiBvdGhlcgotIAllbnZpcm9ubWVudHMgd2hlcmUgdGhlIHN5bWJvbCB0YWJsZSBpcyBub3QgcHJlc2VudCwgd2Ugbm8gbG9uZ2VyCi0gCXJlbHkgaW4gdGhlIHN5bWJvbCB0YWJsZSwgcmF0aGVyLCB1c2UgdGhlIGxvdyBiaXQgb2YgdGhlCi0gCWluc3RydWN0aW9ucyBhZGRyZXNzIHRvIGd1ZXNzLiBUaGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlIGZvciB1c2FnZQotIAlvZiB0aGUgZGlzYXNzZW1ibGVyIGluIGhvc3QgYmFzZWQgcHJvZ3JhbXMsIGdkYiwgb2JqZHVtcC4KLQkocHJpbnRfaW5zbl9iaWdfbWlwcyk6IGRpdHRvLgotCShwcmludF9pbnNuX21pcHMpOiBkaXR0bwotCi1XZWQgSnVuIDE3IDIxOjE5OjAxIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBEb24ndCBib21iIG9uIHVua25vd24gb3Bjb2Rlcy4KLQotV2VkIEp1biAxNyAxNzo0OToyMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQ2hhbmdlIG9wY29kZSBmb3IgInN5c2NhbGwiLgotCi1UdWUgSnVuIDE2IDEzOjEwOjUxIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoaW5kZXgxNik6IEFkZCAnJScgdG8gcmVnaXN0ZXIgbmFtZXMuICBVc2UgJywnCi0JaW5zdGVhZCBvZiAnKycuCi0KLVNhdCBKdW4gMTMgMTE6MzM6NTUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jOiBEb24ndCBwcmludCBvcGNvZGUgc3VmZml4IHdoZW4gd2UgY2FuIGZpZ3VyZSBvdXQgdGhlCi0Jc2l6ZSAoYW5kIGdhcyBjYW4hKSBieSByZWdpc3RlciBvcGVyYW5kcywgb3IgZnJvbSB0aGUgZGVmYXVsdAotCXNpemUuCi0JKHB1dG9wKTogSGFuZGxlICdBJywgJ0InLCAnTCcsICdQJywgJ1EnLCAnUicgbWFjcm9zLiAgUmVuYW1lICdDJwotCW1hY3JvIHRvICdFJy4KLQkoZGlzMzg2LCBkaXMzODZfdHdvYnl0ZSwgZ3Jwcyk6IFVzZSBuZXcgc3VmZml4IG1hY3Jvcy4KLQkoZGlzMzg2KTogQ29ycmVjdCBpbXVsIEliIHRvIGltdWwgc0liLiAgQ2hhbmdlIGpubCB0byBqZ2UgdG8gYmUKLQljb25zaXN0ZW50LiAgQWRkIHN1ZmZpeCBmb3IgY2FsbCwgam1wLCBsY2FsbCwgbGptcCwgaXJldC4gIFJldmVyc2UKLQlvcmRlciBvZiBjbXBzIG9wZXJhbmRzIHRvIGFncmVlIHdpdGggSW50ZWwgZG9jcy4gIENvcnJlY3Qgb3BlcmFuZAotCW9mIGFhZCBhbmQgYWFtIChJYiAtPiBzSWIpLiAgQ2hhbmdlIHVkMmIgZnJvbSAwZmI4IHRvIDBmYjkgdG8KLQlhZ3JlZSB3aXRoIEludGVsIGRvY3MuCi0JKHByaW50X2luc25feDg2KTogUHJpbnQgb3JwaGFuIGZ3YWl0IGJlZm9yZSBvdGhlciBwcmVmaXhlcy4KLQlSZXR1cm4gY29ycmVjdCBieXRlIGNvdW50IGZvciBvcnBoYW4gZndhaXQgd2l0aCBwcmVmaXhlcy4gIERvbid0Ci0JcHJpbnQgYGJvdW5kJyBvcGVyYW5kcyBpbiByZXZlcnNlIG9yZGVyLgotCShja3ByZWZpeCk6IFN0b3AgYWNjdW11bGF0aW5nIHByZWZpeGVzIGlmIHdlIGdldCBmd2FpdC4KLQkoT1BfRElSKTogUHJpbnQgYCQnIGJlZm9yZSBBcCBvcGVyYW5kcyBvZiBsam1wLCBsY2FsbC4KLQotRnJpIEp1biAxMiAxMzo0MDozOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotRnJpIEp1biAxMiAxMTowNDowNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCUZpeCBwcm9ibGVtcyB3aGVuIGJmZF92bWEgaXMgd2lkZXIgdGhhbiBsb25nLgotCSogaTM4Ni1kaXMuYzogTWFrZSBvcF9hZGRyZXNzIGFuZCBzdGFydF9wYyB1bnNpZ25lZC4KLQkoc2V0X29wKTogTWFrZSBwYXJhbWV0ZXIgdW5zaWduZWQuCi0JKHByaW50X2luc25feDg2KTogQ2FzdCB0byBiZmRfdm1hIHdoZW4gcGFzc2luZyBhIHZhbHVlIHRvCi0JcHJpbnRfYWRkcmVzc19mdW5jLgotCSogbnMzMmstZGlzLmMgKENPUkVfQUREUik6IERvbid0IGRlZmluZS4KLSAJKHByaW50X2luc25fbnMzMmspOiBDaGFuZ2UgdHlwZSBvZiBhZGRyIHRvIGJmZF92bWEuICBVc2UKLQliZmRfc2Nhbl92bWEgdG8gcmVhZCBiYWNrIGFkZHJlc3MuCi0JKHByaW50X2luc25fYXJnKTogQ2hhbmdlIHR5cGUgb2YgYWRkciB0byBiZmRfdm1hLiAgVXNlIHNwcmludGZfdm1hCi0JdG8gZm9ybWF0IGl0LgotCSogbTY4ay1kaXMuYyAoQ09FUkNFMzIpOiBDYXN0IHRvIGJmZF9zaWduZWRfdm1hIHRvIGF2b2lkIG92ZXJmbG93LgotCShORVhUVUxPTkcpOiBOZXcgZGVmaW5pdGlvbi4KLQkocHJpbnRfaW5zbl9tNjhrKTogQXZvaWQgb3ZlcmZsb3cgd2hlbiBjb21wdXRpbmcgdGhpcmQgYXJndW1lbnQgb2YKLQlwcmludF9pbnNuX2FyZy4KLQkocHJpbnRfaW5zbl9hcmcpOiBVc2UgTkVYVFVMT05HIHRvIGZldGNoIDMyIGJpdCBhZGRyZXNzIHZhbHVlcy4KLQlVc2UgZGlzcCBpbnN0ZWFkIG9mIHZhbCB0byBzdG9yZSBvZmZzZXQgdmFsdWVzLgotCShwcmludF9pbmRleGVkKTogVXNlIGJhc2VfZGlzcCBpbnN0ZWFkIG9mIHdvcmQgdG8gc3RvcmUgYmFzZQotCWRpc3BsYWNlbWVudCwgdG8gYXZvaWQgb3ZlcmZsb3cuCi0JKiBtMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQ2FzdCB2YWx1ZSB0byBsb25nIHdoZW4gY29tcHV0aW5nCi0JcGMtcmVsYXRpdmUgYWRkcmVzcywgdG8gZ2V0IGNvcnJlY3Qgc2lnbiBleHRlbnNpb24uCi0KLVdlZCBKdW4gMTAgMTU6NTg6MzcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotVHVlIEp1biAgOSAxNDoyNzo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tb3BjLmggKHRodW1iX29wY29kZXMpOiBEaXNwbGF5ICdhZGQgcngsIHJZLCAjMCcgaW5zbnMgYXMKLQknbW92IHJYLCByWScuICBQYXRjaCBjb3VydGVzeSBvZiBUb255IFRob21wc29uIDxUb255LlRob21wc29uQGFybS5jb20+Ci0KLU1vbiBKdW4gIDggMTg6MTc6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogUmVtb3ZlIEZBTEdfTVVMMzIgYXR0cmlieXRlIGZyb20gTVVMWDJIIGluc24uCi0KLUZyaSBKdW4gIDUgMjM6NDc6NTUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jOiAgQ29tYmluZSBhZmxhZyBhbmQgZGZsYWcgaW50byBzaXplZmxhZy4gIENoYW5nZSBPUF8qCi0JZnVuY3Rpb25zIHRvIHZvaWQuCi0JKE9QX0RTcmVnKTogUmVuYW1lIGZyb20gT1BfRFNTSS4KLQkoT1BfRVNyZWcpOiBSZW5hbWUgZnJvbSBPUF9FU0RJLgotCShYYiwgWHYsIFliLCBZdik6IFVzZSBpbmRleCByZWcgY29kZSwgbm90IGJfbW9kZSBvciB2X21vZGUuCi0JKERTQlgpOiBEZWZpbmUuCi0JKGFwcGVuZF9zZWcpOiBSZW5hbWUgZnJvbSBhcHBlbmRfcHJlZml4LgotCShwdHJfcmVnKTogTmV3IGZ1bmN0aW9uLgotCShkaXMzODYpOiBBZGQgUyBzdWZmaXggdG8gcHVzaGYsIHBvcGYsIHJldCwgbHJldCwgZW50ZXIsIGxlYXZlLgotCUFkZCBEU0JYIGZvciB4bGF0LgotCShQUkVGSVhfQUREUik6IFJlbmFtZSBmcm9tIFBSRUZJWF9BRFIuCi0JKGZsb2F0X3JlZyk6IEFkZCBub24tYnJva2VuIG9wY29kZXMgZm9yIHBlb3BsZSB3aG8gZG9uJ3Qgd2FudAotCVVOSVhXQVJFX0NPTVBBVC4KLQotRnJpIEp1biAgNSAxOToxNTowNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAodHN0YiwgdHN0dywgdHN0bCk6IERvbid0IGFsbG93IHBjcmVsIG9uCi0JNjgwMDAvNjgwMDgvNjgwMTAuCi0KLVdlZCBKdW4gIDMgMTg6NTY6MjIgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODYpOiBDaGFuZ2UgMHg2MCB0byAicHVzaGFTIiwgMHg2MSB0byAicG9wYVMiLgotCi1UdWUgSnVuICAyIDE1OjA2OjQ2IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19tYWNyb3MpOiBTdXBwb3J0IHNoaWZ0cyBhbmQgcm90YXRlcyBvZiBzaXplCi0JMDsgcHJvZHVjZSBlcnJvciBtZXNzYWdlIGZvciBzaGlmdHMgb2Ygc2l6ZSAzMiAob3IgNjQgZm9yIDY0LWJpdAotCXNoaWZ0cyksIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLgotCi1XZWQgTWF5IDI3IDE1OjI5OjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IEFkZCBuZXcgb3BlcmFuZDogUmEzLiAgQ2hhbmdlIFNIT1JUX0IzLCBTSE9SVF9CM2IsCi0JTE9OR18yLCBMT05HXzJiIGZvcm1hdHMgdG8gdXNlIHRoaXMgbmV3IG9wZXJhbmQuCi0KLVR1ZSBNYXkgMjYgMjA6NDc6NDggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChjb21wdXRlX2FyY2hfbWFzayk6IEFkZGVkIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZS4KLQotVHVlIE1heSAyNiAyMDo0NTozMyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogYmlnIGVuZGlhbiBpbnN0cnVjdGlvbiAvIGxpdHRsZQotCWVuZGlhbiBkYXRhIHN1cHBvcnQuCi0KLVR1ZSBNYXkgMjYgMTY6MTQ6MzkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9mb3JtYXRfdGFibGUpOiBDaGFuZ2UgZGVmaW5pdGlvbiBvZiBTSE9SVF9CMwotCWFuZCBTSE9SVF9CM2IgZm9ybWF0cyB0byB1c2UgUmIgaW5zdGVhZCBvZiBSYS4KLQotCUFkZCBGTEFHX01VTDE2IHRvIE1VTDJYSCBvcGNvZGUuCi0KLQlBZGQgRkxBR19BRERTVUJwcHAgdG8gU1JDIGFuZCBTQVRIcCBvcGNvZGVzIHRvIGltcGxlbWVudCBleHRlbnNpb24KLQl0byBleGlzdGluZyAxLjEuMSBwYXJhbGxlbGlzYXRpb24gcHJvaGliaXRpb24gcHJvY2VkdXJlLgotCi1GcmkgTWF5IDIyIDE2OjAwOjAwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotVHVlIE1heSAxOSAxNzozNjowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IEhhbmRsZSB0eXBlICddJyBjb3JyZWN0bHkKLQl3aXRoIGEgc2hpZnQgY291bnQgb2YgMC4KLQotRnJpIE1heSAxNSAxNDo1ODozMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9od19sb29rdXBfYnlfbmFtZSk6IFJlbmFtZWQgZnJvbSBjZ2VuX2h3X2xvb2t1cC4KLQkoY2dlbl9od19sb29rdXBfYnlfbnVtKTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgTWF5IDEzIDE3OjAzOjU5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmM6IFJlZ2VuZXJhdGUgKGhhbmRsZSB1cHBlcmNhc2UgSElHSC9TSElHSC9MT1cvU0RBKS4KLQotV2VkIE1heSAxMyAxNDozNDozMSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogQWx3YXlzIGZldGNoIGluc3RydWN0aW9ucwotCWFzIGJpZy1lbmRpYW4gb24gU1BBUkNsaXRlLgotCi1UdWUgTWF5IDEyIDExOjQ2OjMxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVyKTogUmVtb3ZlIGFsaWFzIGZvciByMC4KLQotU3VuIE1heSAxMCAyMjozNzoyMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVRodSBNYXkgIDcgMTc6MTU6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFdJTjMyTElCQUREKTogQWRkIC1saW50bCBvbiBjeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE1heSAgNyAxMjo0OTo0NiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jICh0ZXEsdGdlLHRnZXUsdGx0LHRsdHUsdG5lKTogQWRkZWQgdGhyZWUtb3BlcmFuZAotIAl2YXJpZXR5IG9mIElTQTIgaW5zdHJ1Y3Rpb25zIHRvIHNldCBib3R0b20gdGVuIGJpdHMgb2YgdHJhcCBjb2RlLgotCi1UaHUgTWF5ICA3IDExOjU0OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNvbmZpZy5zdGF0dXMpOiBBZGQgZXhwbGljaXQgdGFyZ2V0IHNvIHRoYXQKLQljb25maWcuc3RhdHVzIGRlcGVuZHMgdXBvbiBiZmQvY29uZmlndXJlLmluLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBNYXkgIDcgMDk6MzM6MDIgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoYnJlYWssIHNkYmJwKTogQWRkZWQgdHdvLW9wZXJhbmQgdmFyaWV0eSBvZiBJU0ExCi0JaW5zdHJ1Y3Rpb25zIHRvIHNldCBib3R0b20gdGVuIGJpdHMgb2YgYnJlYWsgY29kZS4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSW1wbGVtZW50ICdxJyBvcGVyYW5kIGZvcm1hdCB1c2VkCi0JZm9yIGFib3ZlIG9wdGlvbmFsIGFyZ3VtZW50LgotCi1XZWQgTWF5ICA2IDE1OjMwOjA2IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLgotCi1Nb24gTWF5ICA0IDEwOjE5OjU3IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5hbTogUmVnZW5lcmF0ZWQgZGVwZW5kZW5jaWVzIHdpdGggbWtkZXAuCi0KLQkqIG9waW50bC5oIChfKTogRGVmaW5lIGFzIGRnZXR0ZXh0LgotCi1UdWUgQXByIDI4IDE0OjEyOjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTMyci1hc20uYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMzJyLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0zMnItb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCi0JKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBNYWtlZmlsZS5hbSAoUE9URklMRVMpOiBSZW1vdmUgaW5jbHVzaW9uIG9mIEJGRF9ILgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVidWlsdCB1c2luZyBydWxlIGluIE1ha2VmaWxlLmluLgotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlYnVpbHQgYWZ0ZXIgY2hhbmdpbmcgUE9URklMRVMuaW4uCi0KLVR1ZSBBcHIgMjggMTM6MTM6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfSVNDX1BPU0lYIG5lYXIgc3RhcnQuICBNb3ZlIENZX0dOVV9HRVRURVhUCi0JYWZ0ZXIgQUNfUFJPR19DQy4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgdG9vbHMuCi0KLU1vbiBBcHIgMjcgMTQ6MzE6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb3BpbnRsLmg6IE5ldyBmaWxlIC0gY29udGFpbnMgaW50ZXJuYXRpb25hbGlzYXRpb24gbWFjcm9zIHVzZWQKLQlieSBzb3VyY2UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkuCi0JKiBwby86IE5ldyBzdWJkaXJlY3RvcnkgLSBjb250YWlucyBpbnRlcm5hdGlvbmFsaXNhdGlvbiBmaWxlcy4KLQkqIHBvL01ha2UtaW46IE5ldyBmaWxlIC0gTWFrZWZpbGUgY29uc3RydWN0b3IuCi0JKiBwby9QT1RGSUxFUy5pbjogTmV3IGZpbGUgLSBsaXN0IG9mIGZpbGVzIGluIG9wY29kZXMgZGlyZWN0b3J5Ci0JdGhhdCBzaG91bGQgYmUgc2NhbiBmb3IgaW50ZXJuYXRpb25hbGlzYXRpb24gbWFjcm9zLgotCSogcG8vb3Bjb2Rlcy5wb3Q6IE5ldyBmaWxlIC0gbGlzdCBvZiBpbnRlcm5hdGlvbmlzYXRpb24gc3RyaW5ncwotCWZvdW5kIGluIGZpbGVzIG1lbnRpb25lZCBpbiBwby9QT1RGSUxFUy5pbi4KLQkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZSB0byBidWlsZCBwby9QT1RGSUxFUy5pbi4gIEFkZCBTVUJESVJTCi0JZW50cnkuICBBZGQgaW50bCBkaXJlY3RvcnkgdG8gaW5jbHVkZSBwYXRocy4KLQkqIGFjY29uZmlnLmg6IEFkZCBFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VURVhULAotCUhBVkVfU1RSQ1BZLCBIQVZFX0xDX01FU1NBR0VTCi0JKiBjb25maWd1cmUuaW46IEFkZCBydWxlIHRvIGJ1aWxkIE1ha2VmaWxlIGluIHBvIHN1YmRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCSogYWNsb2NhbC5tNDogUmVidWlsdC4KLQkqIGNvbmZpZy5pbjogUmVidWlsdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkqIGFscGhhLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGFyYy1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBhcmMtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogYXJtLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGNnZW4tYXNtLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogZDMwdi1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBkaXMtYnVmLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogaDgzMDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogaDg1MDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogaTM4Ni1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMTAyMDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTEwMzAwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG02OGstZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTg4ay1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtaXBzLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG5zMzJrLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG9waW50bC5oOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIHBwYy1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBzcGFyYy1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiB2ODUwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIHY4NTAtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCi1Nb24gQXByIDI3IDEwOjMzOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX2N1cnJlbnRfb3Bjb2RlX3RhYmxlKTogUmVuYW1lZCBmcm9tIC4uLl9kYXRhLgotCShhc21faGFzaF90YWJsZV9lbnRyaWVzKTogTmV3IHZhcmlhYmxlLgotCShjZ2VuX2FzbV9pbml0KTogRnJlZSBhc21faGFzaF90YWJsZV9lbnRyaWVzLgotCShoYXNoX2luc25fYXJyYXksaGFzaF9pbnNuX2xpc3QpOiBOZXcgZnVuY3Rpb25zLgotCShidWlsZF9hc21faGFzaF90YWJsZSk6IFVzZSB0aGVtLiAgSGFzaCBtYWNybyBpbnNucyBhcyB3ZWxsLgotCShjZ2VuX2FzbV9sb29rdXBfaW5zbik6IFVwZGF0ZS4KLQkqIGNnZW5fZGlzLmMgKGNnZW5fY3VycmVudF9vcGNvZGVfdGFibGUpOiBSZW5hbWVkIGZyb20gLi4uX2RhdGEuCi0JKGRpc19oYXNoX3RhYmxlX2VudHJpZXMpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW5fZGlzX2luaXQpOiBGcmVlIGRpc19oYXNoX3RhYmxlX2VudHJpZXMuCi0JKGhhc2hfaW5zbl9hcnJheSxoYXNoX2luc25fbGlzdCk6IE5ldyBmdW5jdGlvbnMuCi0JKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogVXNlIHRoZW0uICBIYXNoIG1hY3JvIGluc25zIGFzIHdlbGwuCi0JKGNnZW5fZGlzX2xvb2t1cF9pbnNuKTogVXBkYXRlLgotCSogY2dlbi1vcGMuYyAoY2dlbl9jdXJyZW50X29wY29kZV90YWJsZSk6IFJlbmFtZWQgZnJvbSAuLi5fZGF0YS4KLQkoY2dlbl9zZXRfY3B1LGNnZW5faHdfbG9va3VwLGNnZW5faW5zbl9jb3VudCk6IFVwZGF0ZS4KLQkoY2dlbl9tYWNyb19pbnNuX2NvdW50KTogTmV3IGZ1bmN0aW9uLgotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIEFwciAyNCAxNjowNzo1NyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKE9QX0RTU0kpOiBQcmludCBzZWdtZW50IG92ZXJyaWRlLgotCi1Nb24gQXByIDEzIDE2OjU5OjM5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBBZGQgIl9hbGwiIGV4dGVuc2lvbiB0byAnQycKLQlvcGVyYXRvci4KLQotTW9uIEFwciAxMyAxNjo1MDoyNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJvcGNvZGVzX2xhX0xJQkFERCk6IEFkZCBAV0lOMzJMSUJBRERALgotCShsaWJvcGNvZGVzX2xhX0xERkxBR1MpOiBBZGQgQFdJTjMyTERGTEFHU0AuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBXSU4zMkxERkxBR1MgYW5kCi0JV0lOMzJMSUJBREQuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXByIDEwIDE4OjE0OjMxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVN1biBBcHIgIDUgMTY6MDQ6MzkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoc3RhbXAtbGliKTogQ2hlY2sgdGhhdCAubGlicy9saWJvcGNvZGVzLmEgZXhpc3RzCi0JYmVmb3JlIHRyeWluZyB0byBjb3B5IGl0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBBcHIgIDIgMTc6MjU6NDkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogVXNlIHNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIGZvciBDTVBVSSBpbnN0cnVjdGlvbi4KLQotV2VkIEFwciAgMSAxNjoyMDoyNyAxOTk4ICBJYW4gRGFsbCAgPElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXU+Ci0KLSAgICAgICAgKiBuczMyay1kaXMuYyAoYml0X2V4dHJhY3Rfc2ltcGxlKTogTmV3IGZ1bmN0aW9uIHRvIGV4dHJhY3QgYml0cwotICAgICAgICBmcm9tIGFuIGFyYml0cmFyeSB2YWxpZCBidWZmZXIgaW5zdGVhZCBvZiBmZXRjaGluZyB0aGVtIG9uIGRlbWFuZAotICAgICAgICB1c2luZyBmZXRjaF9kYXRhKCkuCi0gICAgICAgIChpbnZhbGlkX2Zsb2F0KTogdXNlIGJpdF9leHRyYWN0X3NpbXBsZSgpIGluc3RlYWQgb2YgYml0X2V4dHJhY3QoKS4KLQotVHVlIE1hciAzMSAxMTowOTowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIGkzODYtZGlzLmMgKGRpczM4Nik6IENoYW5nZSAweDhjIGFuZCAweDhlIHRvIG1vdlMsIGFuZCBjaGFuZ2UgRXcKLQl0byBFdiBmb3IgYm90aC4KLQotTW9uIE1hciAzMCAxNzozMjowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotTW9uIE1hciAzMCAxNToxODowMCAxOTk4ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbl9kMzB2KTogRG9uJ3QgdXNlIHVuaW5pdGlhbGl6ZWQgIm51bSIgd2hlbgotCWRpc2Fzc2VtYmxpbmcgbGFzdCA0IGJ5dGVzIG9mIGEgc2VjdGlvbi4KLQotRnJpIE1hciAyNyAxODowODoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhcmMtZGlzLmMgKHByaW50X2luc24pOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2tleXdvcmRfbG9va3VwX25hbWUpOiBMaWtld2lzZS4KLQkqIGQxMHYtZGlzLmMgKGRpc19sb25nLCBkaXNfMl9zaG9ydCk6IExpa2V3aXNlLgotCSogbTEwMjAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IExpa2V3aXNlLgotCSogbTEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IExpa2V3aXNlLgotCSogbnMzMmstZGlzLmMgKHByaW50X2luc25fbnMzMmspOiBMaWtld2lzZS4KLQkqIHBwYy1vcGMuYyAoaW5zZXJ0X3JhbCwgaW5zZXJ0X3JhbSk6IExpa2V3aXNlLgotCSogY2dlbi1kaXMuYyAoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBSZW1vdmUgdXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQpOiBMaWtld2lzZS4KLQkqIGQxMHYtZGlzLmMgKGRpc19sb25nLCBkaXNfMl9zaG9ydCk6IExpa2V3aXNlLgotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbl9kMzB2LCBsb29rdXBfb3Bjb2RlKTogTGlrZXdpc2UuCi0JKiBuczMyay1kaXMuYyAoYml0X2V4dHJhY3QsIHByaW50X2luc25fbnMzMmspOiBMaWtld2lzZS4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9vbmVfaW5zdHJ1Y3Rpb24pOiBMaWtld2lzZS4KLQkqIHc2NS1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IExpa2V3aXNlLgotCSogejhrLWRpcy5jIChmZXRjaF9kYXRhKTogTGlrZXdpc2UuCi0JKiBhMjlrLWRpcy5jOiBBZGQgcmV0dXJuIHR5cGUgZm9yIGZpbmRfYnl0ZV9mdW5jX3R5cGUuCi0JKiBhcmMtb3BjLmM6IEluY2x1ZGUgPHN0ZGlvLmg+LiAgUmVtb3ZlIGRlY2xhcmF0aW9ucyBvZgotCWluc2VydF9tdWx0c2hpZnQgYW5kIGV4dHJhY3RfbXVsdHNoaWZ0LgotCSogZDMwdi1kaXMuYyAobG9va3VwX29wY29kZSk6IFBhcmVudGhlc2l6ZSBhc3NpZ25tZW50cyBpbgotCWNvbmRpdGlvbmFscy4KLQkoZXh0cmFjdF92YWx1ZSk6IEZ1bGx5IHBhcmVudGhlc2l6ZSBleHByZXNzaW9uLgotCSogaDg1MDAtZGlzLmMgKHByaW50X2luc25faDg1MDApOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KLQkqIGg4NTAwLW9wYy5oIChoODUwMF90YWJsZSk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXIuCi0JKiB3NjUtb3BjLmggKG9wdGFibGUpOiBMaWtld2lzZS4KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25feDg2KTogRGVjbGFyZSBhZmxhZyBhbmQgZmxhZyBwYXJhbWV0ZXJzLgotCSogaTM4Ni1kaXMuYyAoT1BfRSk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgotCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBMaWtld2lzZS4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbWlwczE2KTogTGlrZXdpc2UuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBMaWtld2lzZS4KLQkqIHY4NTAtZGlzLmMgKHByaW50X2luc25fdjg1MCk6IExpa2V3aXNlLgotCSogbnMzMmstZGlzLmMgKHByaW50X2luc25fYXJnKTogRGVjbGFyZS4KLQkoZ2V0X2Rpc3BsYWNlbWVudCwgaW52YWxpZF9mbG9hdCk6IERlY2xhcmUuCi0JKGxpc3Rfc2VhcmNoLCBzaWduX2V4dGVuZCwgZmxpcF9ieXRlcyk6IERlY2xhcmUgcmV0dXJuIHR5cGUuCi0JKGdldF9kaXNwbGFjZW1lbnQpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9hcmcpOiBMaWtld2lzZS4gIE1ha2UgZCBpbnQuICBGaXggc3ByaW50ZiBmb3JtYXQKLQlzdHJpbmcuCi0JKHByaW50X2luc25fbnMzMmspOiBNYWtlIGkgdW5zaWduZWQuCi0JKGludmFsaWRfZmxvYXQpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUgdHlwZSBvZiB2YWwuCi0JKiB0aWMzMC1kaXMuYyAocHJpbnRfcGFyX2luc24pOiBNYWtlIGkgc2l6ZV90LiAgRG9uJ3QgY2hlY2sgc3RybGVuCi0Jb24gZWFjaCBmb3IgaXRlcmF0aW9uLgotCSogdGljMzAtZGlzLmMgKGdldF9pbmRpcmVjdF9vcGVyYW5kKTogTGlrZXdpc2UuCi0JKiB6OGstZGlzLmMgKHByaW50X2luc25fejgwMDEpOiBEZWNsYXJlIHJldHVybiB0eXBlLgotCShwcmludF9pbnNuX3o4MDAyKTogTGlrZXdpc2UuCi0JKHVucGFyc2VfaW5zdHIpOiBGaXggc3ByaW50ZiBmb3JtYXQgc3RyaW5ncy4KLQotRnJpIE1hciAyNyAwMDowNToyMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEFkZCAic3luYy5sIiBhbmQgInN5bmMucCIuCi0KLVdlZCBNYXIgMjUgMTQ6MzI6NDggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IFVzZSBpbmZvLT5tYWNoIHRvIHNlbGVjdCB0aGUKLQlkZWZhdWx0IG02OGsgdmFyaWFudCB0byByZWNvZ25pemUuCi0KLQkqIGk5NjAtZGlzLmMgKHBpbnNuKTogQ2hhbmdlIHR5cGUgb2YgZmlyc3QgYXJndW1lbnQgdG8gYmZkX3ZtYS4KLQkoY3RybCwgY29iciwgbWVtLCBlYSk6IExpa2V3aXNlLgotCShwcmludF9hZGRyKTogTGlrZXdpc2UuICBSZW1vdmUgY2FzdC4KLQkoZWEpOiBDYXN0IGFyZ3VtZW50IG9mIHByaW50X2FkZHIgdG8gYmZkX3ZtYS4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlcik6IEZpeCB0eXBlIG9mIGxvY2FsCi0JdmFyaWFibGUgdmFsdWUuCi0JKGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlcik6IExpa2V3aXNlLgotCShjZ2VuX3BhcnNlX2FkZHJlc3MpOiBMaWtld2lzZS4KLQotV2VkIE1hciAyNSAxNDozMTozMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGlzLmMgKGN0cmwpOiBBZGQgZnVsbCBicmFjZXMgdG8gc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLgotCShjb2JyLCBtZW0sIHJlZyk6IExpa2V3aXNlLgotCShlYSk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiBpbiBleHByZXNzaW9uLgotCi0JKiBjZ2VuLWFzbS5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoYnVpbGRfYXNtX2hhc2hfdGFibGUpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0JKGNnZW5fcGFyc2Vfa2V5d29yZCk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0pOiBPbmx5IGNhbGwgY29mZnN5bWJvbCBmb3IgYSBDT0ZGCi0Jc3ltYm9sLiAgRml4IGluZGVudGF0aW9uLgotCShwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KLQotRnJpIE1hciAyMCAxODo1NToxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFNX0RJU0FCTEVfU0hBUkVELgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVRodSBNYXIgMTkgMTU6NDY6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVRoZXNlIHBhdGNoZXMgYXJlIGNvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbiBhbmQgVG9ueSBUaG9tcHNvbgotCShhdGhvbXBzb0BjYW1icmlkZ2UuYXJtLmNvbSkuCi0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl90aHVtYik6IElnbm9yZSBib3R0b20gdHdvIGJpdHMgb2YgUEMKLQlyZWxhdGl2ZSBhZGRyZXNzZXMuCi0KLQkqIGFybS1vcGMuaCAodGh1bWJfb3Bjb2Rlcyk6IEFubm90YXRlIFBDIHJlbGF0aXZlIGFkZHJlc3NlcyB3aXRoCi0JYm90aCB0aGUgb2Zmc2V0IGFuZCB0aGUgbGFiZWwgY2xvc2VzdCB0byB0aGUgZGVzdGluYXRpb24uCi0KLVNhdCBNYXIgMTQgMjM6NDc6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLVdlZCBNYXIgIDQgMTI6MDg6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotU2F0IEZlYiAyOCAxNjowMjozNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSwgcHJpbnRfaW5zbl9saXR0bGVfYXJtKTogRG8gbm90Ci0JYXNzdW1lIHRoYXQgaW5mby0+c3ltYm9scyBpcyBub24tZW1wdHkuCi0KLVNhdCBGZWIgMjggMTI6MTk6MDUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGN2dHFzKSBUaGVyZSBpcyBubyBzdWNoIHRoaW5nLgotCShjdnR0cSk6IE1pc3NpbmcgbW9zdCBvZiB0aGUgLypkIHZhcmlhbnRzLgotCi1UaHUgRmViIDI2IDE1OjUzOjA5IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IEluZGljYXRlIHdoaWNoIGluc3RydWN0aW9ucyBhcmUKLQlkZWxheWVkIGJyYW5jaGVzIG9yIGp1bXBzLgotCi1UdWUgRmViIDI0IDEwOjQ2OjQ0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl97YmlnLGxpdHRsZX1fYXJtKTogaW5mby0+c3ltYm9sIGNoYW5nZWQKLQl0byAqaW5mby0+c3ltYm9scy4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fe2JpZyxsaXR0bGV9X21pcHMpOiBMaWtld2lzZS4KLQkqIHRpYzMwLWRpcy5jIChwcmludF9icmFuY2gpOiBMaWtld2lzZS4KLQotVHVlIEZlYiAyNCAxMTowNjoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSwgcHJpbnRfaW5zbl9saXR0bGVfYXJtKTogUmVtb3ZlCi0Jc2F2ZWRfc3ltYm9sIGNvZGUgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotTW9uIEZlYiAyMyAxMzoxNjoxNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYzogSW5jbHVkZSBzeW1jYXQuaC4KLQkqIGNnZW4tZGlzLmMsY2dlbi1vcGMuYzogRGl0dG8uCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1Nb24gRmViIDIzIDEwOjM0OjU4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBEbyBub3QgcHJlZml4ICdQJyBhcmd1bWVudHMgd2l0aCAnJCcuCi0KLVRodSBGZWIgMTkgMTY6NTE6MTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuW2NoXTogUmVnZW5lcmF0ZS4KLQotVHVlIEZlYiAxNyAxNzoxNDo1MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV97c2lnbmVkLHVuc2lnbmVkfV9pbnRlZ2VyKTogRGVsZXRlIG1pbixtYXgKLQlhcmd1bWVudHMuICBEb24ndCBwZXJmb3JtIHZhbGlkYXRpb24gaGVyZS4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgRmViIDEzIDE0OjI2OjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBGZWIgMTMgMTQ6NTM6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCi1GcmkgRmViIDEzIDEwOjIxOjA5IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogbTEwMzAwLWRpcy5jIChwcmludF9pbnNuX21uMTAzMDApOiBSZWNvZ25pemUgYnJlYWsgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBGZWIgMTMgMTM6MTI6MTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSBCRkQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChsaWJvcGNvZGVzX2xhX0xERkxBR1MpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEZlYiAxMyAwOTo1MDozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCSogbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAxMiAxMTowMTo0MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViIDEyIDAzOjQxOjAwIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQlGaXggcmFjIHRvIGFjY2VwdCBvbmx5IGEwOgotCSogZDEwdi1vcGMuYyAoZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycywgZDEwdl9vcGVyYW5kcywgZDEwdl9vcGNvZGVzKToKLQlTcGxpdCBPUEVSQU5EX0FDQyBpbnRvIE9QRVJBTkRfQUNDMCBhbmQgT1BFUkFORF9BQ0MxLgotCUludHJvZHVjZSBPUEVSQU5EX0dQUi4KLQkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAxMSAxODo1ODozNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9zZXRfY3B1KTogRGVsZXRlIGluaXQgb2YgaHcgbGlzdCBgbmV4dCcgY2hhaW4uCi0JKGNnZW5faHdfbG9va3VwKTogTWFrZSByZXN1bHQgY29uc3QuCi0JKiBtMzJyLW9wYy5oLCBtMzJyLW9wYy5jLCBtMzJyLWFzbS5jLCBtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1TYXQgRmViICA3IDE1OjMwOjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBGZWIgIDUgMTc6NTY6MTAgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKHJlcGVhdHssaX0gaW5zdHJ1Y3Rpb25zKTogUmVwZWF0L3JlcGVhdGkKLQlpbnN0cnVjdGlvbnMgdXNlIGEgUEMgcmVsYXRpdmUgYnJhbmNoLCBub3QgYWJzb2x1dGUuCi0KLVdlZCBGZWIgIDQgMTk6MTc6MzcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBsaWJ0b29sX2VuYWJsZV9zaGFyZWQgcmF0aGVyIHRoYW4KLQlsaWJ0b29sX3NoYXJlZC4gIFJlbW92ZSBkaXZlcnNpb24gaGFjay4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVHVlIEZlYiAgMyAxNzoxOTo0MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9zZXRfY3B1KTogSW5pdGlhbGl6ZSBoYXJkd2FyZSB0YWJsZS4KLQkqIG0zMnItb3BjLmgsIG0zMnItb3BjLmMsIG0zMnItYXNtLmMsIG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLU1vbiBGZWIgIDIgMTk6MjI6MTUgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogdGljMzAtZGlzLmM6IE5ldyBmaWxlLgotCSogZGlzYXNzZW1ibGUuYwkoZGlzYXNzZW1ibGVyKTogQWRkIGJmZF9hcmNoX3RpYzMwIGNhc2UuCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBiZmRfdGljMzBfYXJjaC4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHRpYzMwLWRpcy5jCi0JKEFMTF9NQUNISU5FUyk6IEFkZCB0aWMzMC1kaXMubG8uCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgSmFuIDI5IDEzOjAyOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmggKEhBVkVfQ1BVX00zMlIpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjggMDk6NTU6MDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0aW9uIHJvdXRpbmVzKTogSWYgYm90aCBhbGlnbm1lbnQgYW5kIHNpemUgaXMKLQl3cm9uZyB0aGVuIHJlcG9ydCB0aGlzLgotCi1UdWUgSmFuIDI3IDIxOjUyOjU5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFNldCB0YXJnZXRfcHJvY2Vzc29yIGFzIGFwcHJvcHJpYXRlLgotCU9ubHkgcmVjb2duaXplIGluc3RydWN0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0X3Byb2Nlc3Nvci4KLQotVGh1IEphbiAyMiAxNjoyMDoxNyAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYyAoUENfTUFTSyk6IENvcnJlY3QgdmFsdWUuCi0JKHByaW50X29wZXJhbmQpOiBJZiB0aGVyZSdzIGEgcmVsb2MsIGRvbid0IGNhbGN1bGF0ZSB0aGUKLSAJYWRkcmVzcyBiZWNhdXNlIHRoZXkgY291bGQgYmUgaW4gZGlmZmVyZW50IHNlY3Rpb25zLgotCi1GcmkgSmFuIDE2IDE1OjI5OjExIDE5OTggIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobWlwc19idWlsdGluX29wY29kZXMpOiBNb3ZlIDQwMTAncyAiYWRkY2l1IgotIAlpbnN0cnVjdGlvbiBhZnRlciB0aGUgNDY1MCdzICJtdWwiIGluc3RydWN0aW9uOyBub2JvZHkncyB1c2luZyB0aGUKLSAJNDAxMCB0aGVzZSBkYXlzLiAgSWYgb2JqZWN0IGZpbGVzIHNvbWVkYXkgaW5kaWNhdGUgd2hpY2ggcHJvY2Vzc29yCi0JdmFyaWFudCB0aGV5J3JlIGludGVuZGVkIGZvciwgd2UgY2FuIGRvIGEgYmV0dGVyIGpvYiBhdCB0aGlzLgotCi1Nb24gSmFuIDEyIDE0OjQzOjU0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChidWlsZF9hc21faGFzaF90YWJsZSk6IFRyYXZlcnNlIGNvbXBpbGVkIGluIHRhYmxlIHVzaW5nCi0JdGFibGUgcHJvdmlkZWQgZW50cnkgc2l6ZS4gIFVzZSBDR0VOX0lOU05fTU5FTU9OSUMuCi0JKGNnZW5fcGFyc2Vfa2V5d29yZCk6IFJld3JpdGUuCi0JKiBjZ2VuLWRpcy5jIChidWlsZF9kaXNfaGFzaF90YWJsZSk6IFRyYXZlcnNlIGNvbXBpbGVkIGluIHRhYmxlIHVzaW5nCi0JdGFibGUgcHJvdmlkZWQgZW50cnkgc2l6ZS4gIFVzZSBDR0VOX0lOU05fTUFTS19CSVRTSVpFLgotCSogY2dlbi1vcGMuYzogQ2xlYW4gdXAgcGFzcyBvdmVyIGBzdHJ1Y3QgZm9vJyB1c2FnZS4KLQkoY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSk6IEhhbmRsZSAiIiBlbnRyeS4KLQkoY2dlbl9rZXl3b3JkX2FkZCk6IExpa2V3aXNlLgotCi1Nb24gRGVjIDIyIDEyOjM3OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIEZQX0QgdG8gcy5kIGluc3RydWN0aW9uIGZsYWdzLgotCi1XZWQgRGVjIDE3IDExOjM4OjI5IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChoYWx0LCBwdWxzZSk6IEVuYWJsZSB0aGVtIG9uIHRoZSA2ODA2MC4KLQotVHVlIERlYyAxNiAxNToyMjo1MyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wY29kZXMpOiBSZXZlcnQgY2hhbmdlIHRoYXQgcHV0IHRoZSAzMiBiaXQKLQlQQyByZWxhdGl2ZSBvZmZzZXQgZm9ybXMgYmVmb3JlIHRoZSAxNSBiaXQgZm9ybXMuICBBbiBhc3NlbWJsZXIgY29tbWFuZAotCWxpbmUgb3B0aW9uIG5vdyBjaG9vc2VzIHRoZSBkZWZhdWx0LgotCi1UdWUgRGVjIDE2IDE1OjIyOjUxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IFNldCBuZXcgZmxhZ3MgYml0cwotCUZMQUdfezJXT1JELE1VTHsxNiwzMn0sQUREU1VCcHBwfSwgaW4gYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb25zLgotCi0xOTk3LTEyLTE1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogT25seSBidWlsZCBsaWJvcGNvZGVzIHNoYXJlZCBpZiAtLWVuYWJsZS1zaGFyZWQncyB2YWx1ZQotCXdhcyBgeWVzJywgb3Igd2FzIHNldCB0byBgKm9wY29kZXMqJy4KLQkqIGFjbG9jYWwubTQ6IExpa2V3aXNlLgotCSogTk9URTogdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgZml4ZWQgaW4gbGlidG9vbC9saWJ0b29sLm00LCB0aGUKLQlvcmlnaW5hbCBzb3VyY2Ugb2YgdGhpcyBiaXQgb2YgY29kZS4gIEl0J3Mgbm90IGNsZWFyIHdoYXQgdGhlIGJlc3QgZml4Ci0Jd291bGQgYmUsIHRob3VnaC4KLQotRnJpIERlYyAxMiAxMTo1NzowNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKE9GRl9TTF9QQywgT0ZGX1NMX0JSKTogTWlub3IgZm9ybWF0dGluZyBjaGFuZ2UuCi0JKHRpYzgwX29wY29kZXMpOiBSZW9yZGVyIHRhYmxlIGVudHJpZXMgdG8gcHV0IHRoZSAzMiBiaXQgUEMgcmVsYXRpdmUKLSAJb2Zmc2V0IGZvcm1zIGJlZm9yZSB0aGUgMTUgYml0IGZvcm1zLCB0byBkZWZhdWx0IHRvIHRoZSBsb25nIGZvcm1zLgotCi1GcmkgRGVjIDEyIDAxOjMyOjMwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jIChjdnR0cS8qdSopOiBSZW1vdmUsIGFzIHRoYXQgc3VmZml4IGlzIGludmFsaWQuCi0KLVdlZCBEZWMgMTAgMTc6NDI6MzUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBQcmV2ZW50IGV4YW1pbmF0aW9uIG9mIHN0b3JlZAotCXN5bWJvbCBpZiBub25lIGlzIHByZXNlbnQuCi0JKHByaW50X2luc25fYmlnX2FybSk6ICBQcmV2ZW50IGV4YW1pbmF0aW9uIG9mIHN0b3JlZCBzeW1ib2wgaWYKLQlub25lIGlzIHByZXNlbnQuCi0KLVRodSBPY3QgMjMgMjE6MTM6MzcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IENvcnJlY3QgZW50cnkgZm9yIFJURS4KLQotTW9uIERlYyAgOCAxMToyMTowNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXNhc3NlbWJsZS5jOiBSZW1vdmUgZGlzYXNtX3N5bWFkZHIoKSBmdW5jdGlvbi4KLQotCSogYXJtLWRpcy5jOiBVc2UgaW5mby0+c3ltYm9sIGluc3RlYWQgb2YgaW5mby0+ZmxhZ3MgdG8gZGV0ZXJtaW5lCi0JaWYgZGlzYXNzbWJseSBzaG91bGQgYmUgaW4gVGh1bWIgb3IgQXJtIG1vZGUuCi0KLVR1ZSBEZWMgIDIgMDk6NTQ6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jOiBBZGQgc3VwcG9ydCBmb3IgZGlzYXNzZW1ibGluZyBUaHVtYiBvcGNvZGVzLgotCShwcmludF9pbnNuX3RodW1iKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc21fc3ltYWRkcik6IE5ldyBmdW5jdGlvbi4KLQotCSogYXJtLW9wYy5oOiBEaXNwbGF5IG5vcCBwc2V1ZG8gb3BzIGFsb25nc2lkZSBlcXVpdmFsZW50IGRpc2Fzc2VtYmx5LgotCSh0aHVtYl9vcGNvZGVzKTogVGFibGUgb2YgVGh1bWIgb3Bjb2Rlcy4KLQotTW9uIERlYyAgMSAxMjoyNTo1NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAoYnRzdCk6IENoYW5nZSBEZEBzIHRvIERkO2IuCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUmVjb2duaXplICdtJywgJ24nLCAnbycsICdwJywgJ3EnLAotCWFuZCAndicgYXMgb3BlcmFuZCB0eXBlcy4KLQotTW9uIERlYyAgMSAxMTo1Njo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IEFkZCBhcmd1bWVudCBmb3IgbHBzdG9wLiAgRnJvbSBPbGl2aWVyIENhcm1vbmEKLQk8b2xpdmllci5jYXJtb25hQGRpLmVwZmwuY2g+LgotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogSGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBscHN0b3AsCi0Jd2hpY2ggaGFzIGEgdHdvIHdvcmQgb3Bjb2RlIHdpdGggYSBvbmUgd29yZCBhcmd1bWVudC4KLQotU3VuIE5vdiAyMyAyMjoyNToyMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUsIGNhc2UgY21wdSk6IEltbWVkaWF0ZSBmaWVsZCBpcwotCXVuc2lnbmVkLCBub3Qgc2lnbmVkLgotCShkMzB2X2Zvcm1hdF90YWJsZSk6IEFkZCBTSE9SVF9DTVBVIGNhc2VzIGZvciBjbXB1LgotCi1UdWUgTm92IDE4IDIzOjEwOjAzIDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOgotCVNwbGl0IE9QRVJBTkRfRkxBRyBpbnRvIE9QRVJBTkRfRkZMQUcgYW5kIE9QRVJBTkRfQ0ZMQUcuCi0KLVR1ZSBOb3YgMTggMTg6NDU6MTQgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZDEwdi1vcGMuYyAoT1BFUkFORF9GTEFHKTogU3BsaXQgaW50bzoKLQkoT1BFUkFORF9GRkxBRywgT1BFUkFORF9DRkxBRykgLgotCShGU1JDKTogU3BsaXQgaW50bzoKLQkoRkZTUkMsIENGU1JDKS4KLQotVGh1IE5vdiAxMyAxMTowNTozMyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogTW92ZSB0aGUgSU5TTl9NQUNSTyBJU0EgdmFsdWUgdG8gdGhlIG1lbWJlcnNoaXAKLQlmaWVsZCBmb3IgYWxsIElOU05fTUFDUk8ncy4KLQkqIG1pcHMxNi1vcGMuYzogc2FtZQotCi1XZWQgTm92IDEyIDEwOjE2OjU3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChzeW5jLGNhY2hlKTogVGhlc2UgYXJlIDM5MDAgaW5zbnMuCi0KLVR1ZSBOb3YgMTEgMjM6NTM6NDEgMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0Jc2gtb3BjLmggKHNoX3RhYmxlKTogUmVtb3ZlIGZ0c3QvbmFuLgotCi1UdWUgT2N0IDI4IDE3OjU5OjMyIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChmZmMsIGZmcyk6IEZpeCBtYXNrLgotCi1UdWUgT2N0IDI4IDE2OjM0OjU0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGQgZWl0X3ZiLCBpbnRfcywgYW5kIGludF9tCi0JY29udHJvbCByZWdpc3RlcnMuCi0KLU1vbiBPY3QgMjcgMjI6MzQ6MDMgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEZpeCBidWcgaW4gbWFzayBmb3IgIm5vdCIgcHNldWRvLWluc3RydWN0aW9uLgotCShXUl9ISUxPLCBSRF9ISUxPLCBNT0RfSElMTyk6IE5ldyBtYWNyb3MuCi0KLU1vbiBPY3QgMjcgMjI6MzQ6MDMgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEZpeCBidWcgaW4gbWFzayBmb3IgIm5vdCIgcHNldWRvLWluc3RydWN0aW9uLgotCShXUl9ISUxPLCBSRF9ISUxPLCBNT0RfSElMTyk6IE5ldyBtYWNyb3MuCi0KLVRodSBPY3QgMjMgMTQ6NTc6NTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBSZXBsYWNlIC8vIHdpdGggLyogLi4uICovCi0KLVdlZCBPY3QgMjIgMTc6MzM6MjEgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IEFkZCB3ciAmIHJkIGZvciB2OWEgYXNyJ3MuCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IFJlY29nbml6ZSAnXycgYW5kICcvJyBmb3IgdjlhIGFzcidzLgotCSh2OWFfYXNyX3JlZ19uYW1lcyk6IE5ldyB2YXJpYWJsZS4KLQlQYXRjaCBmcm9tIERhdmlkIE1pbGxlciA8ZGF2ZW1Admdlci5ydXRnZXJzLmVkdT4uCi0KLVdlZCBPY3QgMjIgMTc6MTg6MDIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHY5bm90djlhKTogTmV3IGluc24gdHlwZS4KLQkoSU1QREVQKTogTW92ZSB0byB0aGUgZW5kIHRvIG5vdCBjb25mbGljdCB3aXRoIGVkZ2U4IGV0IGFsLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1Pi4KLQotRnJpIE9jdCAxNyAxMzoxODo1MyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoYm5lemwsYmVxemwpOiBNYXJrIHRoZXNlIGFzIGFsc28gdHgzOS4KLQotVGh1IE9jdCAxNiAxMTo1NToyMCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogTm90ZSB0aGF0ICdqYWx4JyBpcyAocHJvYmFibHkgaW5jb3JyZWN0bHkpIG1hcmtlZCBJMS4KLQotVHVlIE9jdCAxNCAxNjoxMDozMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFVzZSBuZXcgc3ltYm9sX2F0X2FkZHJlc3NfZnVuYygpIGZpZWxkCi0Jb2YgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3R1cmUgdG8gZGV0ZXJtaW5lIGlmIGFuIG92ZXJsYXkgYWRkcmVzcwotCWhhcyBhIG1hdGNoaW5nIHN5bWJvbCBpbiBsb3cgbWVtb3J5LgotCi0JKiBkaXMtYnVmLmMgKGdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MpOiBOZXcgKGR1bW15KSBmdW5jdGlvbiBmb3IKLQluZXcgc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyBmaWVsZCBpbiBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdHVyZS4KLQotRnJpIE9jdCAxMCAxNjo0NDo1MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jIChleHRyYWN0X2QyMik6IFVzZSBzaWduZWQgYXJpdGhtYXRpYy4KLQotVHVlIE9jdCAgNyAyMzo0MDo0MyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogVGhyZWUgb3AgbXVsdCBpcyBub3QgYW4gSVNBIGluc24uCi0KLVR1ZSBPY3QgIDcgMjM6Mzc6MjEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEZpeCBmb3JtYXR0aW5nLgotCi1GcmkgT2N0ICAzIDE3OjI2OjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoT1BfRSk6IEV4cGxpY2l0bHkgc2lnbiBleHRlbmQgOCBiaXQgdmFsdWVzLCByYXRoZXIKLSAJdGhhbiBhc3N1bWluZyB0aGF0IGNoYXIgaXMgc2lnbmVkLiAgRXhwbGljaXRseSBzaWduIGV4dGVuZCAxNiBiaXQKLQl2YWx1ZXMsIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgc2hvcnQgaXMgMTYgYml0cy4KLQkoT1Bfc0ksIE9QX0osIE9QX0RJUik6IExpa2V3aXNlLgotCi1UaHUgT2N0ICAyIDEzOjM2OjQ1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKHY4NTBfc3JlZ19uYW1lcyk6IFVzZSBzeW1ib2xpYyBuYW1lcyBmb3IgaGlnaGVyCi0Jc3lzdGVtIHJlZ2lzdGVycy4KLQotV2VkIE9jdCAgMSAxNjo1ODo1NCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jOiBGaXggdHlwbyBpbiBjb21tZW50LgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEFkZCB0ZXN0IG9mIHByb2Nlc3NvciB0eXBlIHdoZW4KLQlkZXRlcm1pbmluZyBvcGNvZGVzLgotCi1XZWQgT2N0ICAxIDE0OjEwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgYSBkaXZlcnNpb24gdG8gc2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIHRoZQotCWFyZ3VtZW50cyBhcmUgcGFyc2VkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgU2VwIDI1IDEzOjA0OjU5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAoVEJMMSk6IFVzZSAhIHJhdGhlciB0aGFuIGAuCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFJlbW92ZSBgIG9wZXJhbmQgc3BlY2lmaWVyLgotCi1XZWQgU2VwIDI0IDExOjI5OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQ29ycmVjdCBiY2hnLCBiY2xyLCBic2V0LCBhbmQgYnRzdCBvbiBDb2xkRmlyZS4KLQotCSogbTY4ay1vcGMuYzogQWNjZXB0IHRzdHtiLHcsbH0gd2l0aCBpbW1lZGlhdGUgb3BlcmFuZHMgb24gY3B1MzIuCi0KLQkqIG02OGstb3BjLmM6IENvcnJlY3QgbW92ZXcgb2YgYW4gaW1tZWRpYXRlIG9wZXJhbmQgdG8gJXNyIG9yICVjY3IKLQlmb3IgbWNmNTIwMC4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1RPT0wgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIFNlcCAxOSAxMTo0NTo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKCJjbW92Iik6IE9yZGVyIHJlZyBwYXJhbSByMSwgcjIgbm90IHIyLCByMi4KLQotVGh1IFNlcCAxOCAxMToyMTo0MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNsZXRfY3ByZWdfdGFibGUpOiBBZGQgJWNjc3IyLCAlY2NjcnIsICVjY3JzdHIuCi0KLVR1ZSBTZXAgMTYgMTU6MTg6MjAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRnVydGhlciByZWFycmFuZ2VtZW50cy4KLQotVHVlIFNlcCAxNiAxNjoxMjoxMSAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAocm90MmgsIHNyYTJoLCBzcmwyaCBpbnNucyk6IFJldmVydCBsYXN0IGNoYW5nZS4KLQotVHVlIFNlcCAxNiAwOTo0ODo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaWVsZHMgcmVvcmRlcmVkIHRvIGFsbG93IGFzc2VtYmxlcgotCXBhcnNlciB0byB3b3JrLgotCi1UdWUgU2VwIDE2IDEwOjAxOjAwIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGRlZCB0eDM5IGluc25zIHNkYmJwLCByZmUsIGFuZCBkZXJldC4KLQotTW9uIFNlcCAxNSAxODozMTo1MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jOiBJbml0aWFsaXNlIHByb2Nlc3NvcnMgZmllbGQgb2Ygdjg1MF9vcGNvZGUgc3RydWN0dXJlLgotCi1XZWQgQXVnIDI3IDIxOjQyOjM5IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBkMzB2LW9wYy5jOiBDaGFuZ2UgbXZmYWNjIHRvIGFjY2VwdCA2LWJpdCB1bnNpZ25lZCB2YWx1ZXMuCi0KLQkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCBjb250cm9sIHJlZ2lzdGVycyBmcm9tIDAtNjMuCi0JKGQzMHZfb3Bjb2RlX3RhYmVsKTogQWRkIGRidCwgcnRkLCBzcmFoLCBhbmQgc3JsaCBpbnN0cnVjdGlvbnMuIEZpeAotCXJvdDJoLCBzcmEyaCwgYW5kIHNybDJoIHRvIHVzZSBuZXcgU0hPUlRfQTVTIGZvcm1hdC4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IEZpeCBkaXNhc3NlbWJseSBvZiBTSE9SVF9EMiBvcGNvZGVzLgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuKTogRmlyc3Qgb3BlcmFuZCBvZiBkKmkgKGRlbGF5ZWQKLQlicmFuY2gpIGluc3RydWN0aW9ucyBpcyByZWxhdGl2ZS4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBDaGFuZ2UgZm9ybSBmb3IgcmVwZWF0aS4KLQkoZDMwdl9vcGVyYW5kX3RhYmxlKTogQWRkIElNTTZTMyB0eXBlLgotCShkMzB2X2Zvcm1hdF90YWJsZSk6IENoYW5nZSBTSE9SVF9EMi4gQWRkIExPTkdfRGIuCi0KLQkqIGQzMHYtZGlzLmM6IEZpeCBidWcgd2l0aCAiLnMiIGFuZCAiLmwiIGV4dGVuc2lvbnMKLQlhbmQgY21wIGluc3RydWN0aW9ucy4KLQotCSogZDMwdi1vcGMuYzogQ29ycmVjdCBlbnRyaWVzIGZvciByZXBlYXQqLCBhbmQgc2F0Ki4KLQlNYWtlIElNTTUgdW5zaWduZWQuIENyZWF0ZSBJTU02VSBhbmQgSU1NMTJTM1Ugb3BlcmFuZAotCXR5cGVzLiBDb3JyZWN0IHNldmVyYWwgZm9ybWF0cy4KLQotCSogZDMwdi1vcGMuYzogKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCBkcHN3IGFuZCBkcGMuCi0KLQkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IENoYW5nZSBjb250cm9sIHJlZ2lzdGVycy4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9mb3JtYXRfdGFibGUpOiBDb3JyZWN0IFNIT1JUX0MxIGFuZAotCVNIT1JUX0MyLiAgTWFudWFsIHdhcyBpbmNvcnJlY3QuCi0KLQkqIGQzMHYtZGlzLmMgKGxvb2t1cF9vcGNvZGUpOiAgUmV0dXJuIHZhbHVlIG5vdyBpbmRpY2F0ZXMKLQlpZiBhbiBvcGNvZGUgaGFzIGEgc2hvcnQgYW5kIGEgbG9uZyBmb3JtLiAgVXNlZCBmb3IgZGVjaWRpbmcKLQl0byBhcHBlbmQgYSAiLnMiIG9yICIubCIuCi0JKHByaW50X2luc24pOiBBcHBlbmQgYSAiLnMiIHRvIGFuIGluc3RydWN0aW9uIGlmIGl0IGlzCi0gCXRoZSBzaG9ydCBmb3JtIGFuZCAiLmwiIGlmIGl0IGlzIGEgbG9uZyBmb3JtLiBEbyBub3QgYXBwZW5kCi0JYW55dGhpbmcgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBvbmx5IG9uZSBwb3NzaWJsZSBzaXplLgotCi0JKiBkMzB2LW9wYy5jOiBDaGFuZ2UgbXVseDJoIHRvIHJlcXVpcmUgYW4gZXZlbiByZWdpc3Rlci4KLQlOZXcgZm9ybTogU0hPUlRfQTI7IGEgU0hPUlRfQSBmb3JtIHRoYXQgbmVlZHMgYW4gZXZlbgotCXJlZ2lzdGVyIGFzIHRoZSBmaXJzdCBvcGVyYW5kLgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuX2QzMHYpOiBGaXggcHJvYmxlbSB3aGVyZSB0aGUgbGFzdAotCWluc3RydWN0aW9uIHdhcyBub3QgYmVpbmcgZGlzYXNzZW1ibGVkIGlmIHRoZXJlIHdlcmUgYW4gb2RkCi0JbnVtYmVyIG9mIGluc3RydWN0aW9ucy4KLQotCSogZDMwdi1vcGMuYyAoU0hPUlRfTTIsIExPTkdfTTIpOiAgVHdvIG5ldyBmb3Jtcy4KLQotRnJpIFNlcCAxMiAxMTo0Mzo1NCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEltcHJvdmVkIGRpc3BsYXkgb2YgcmVnaXN0ZXIgbGlzdHMuCi0KLVRodSBTZXAgMTEgMTc6MzU6MTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggYXNzZW1ibGVyIGFyZ3MgdG8KLQlmemVyb3MsIGZvbmVzLCBmc3JjMSwgZnNyYzFzLCBmc3JjMnMsIGZub3QxLCBmbm90MXMsIGZub3QycywKLQlmb3JzLCBmbm9ycywgZmFuZHMsIGZuYW5kcywgZnhvcnMsIGZ4bm9ycywgZm9ybm90MXMsIGZvcm5vdDJzLAotCWZhbmRub3QxcywgZmFuZG5vdDJzLgotCi1UdWUgU2VwICA5IDEwOjAzOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4IG9wMyBmaWVsZCBmb3IgZmNtcHEvZmNtcGVxLgotCi1Nb24gU2VwICA4IDE0OjA2OjU5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fcGFyc2VfYWRkcmVzcyk6IE5ldyBhcmd1bWVudCByZXN1bHRwLgotCUFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKiBtMzJyLWFzbS5jIChwYXJzZV9oX2hpMTYpOiBSaWdodCBzaGlmdCBudW1iZXJzIGJ5IDE2LgotCi1UdWUgU2VwICAyIDE4OjM5OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIG1uMTAyMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIGFyZQotICAgICAgICByZWxhdGl2ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgbm90IHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgotCi1UdWUgU2VwICAyIDE1OjQxOjU1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogT25seSBzaWduZWQgZXh0ZW5kIHZhbHVlcyB0aGF0IGFyZSBub3QKLQlyZXR1cm5lZCBieSBleHRyYWN0IGZ1bmN0aW9ucy4KLQlSZW1vdmUgdXNlIG9mIFY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZIGZsYWcuCi0KLVR1ZSBTZXAgIDIgMTU6Mzk6NDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYzogVXBkYXRlIGNvbW1lbnRzLiAgUmVtb3ZlIHVzZSBvZgotCVY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZLiAgRml4IHNldmVyYWwgb3BlcmFuZCBwYXR0ZXJucy4KLQotVHVlIEF1ZyAyNiAwOTo0MjoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jIChNT1ZISSk6IEltbWVkaWF0ZSBwYXJhbWV0ZXIgaXMgdW5zaWduZWQuCi0KLU1vbiBBdWcgMjUgMTU6NTg6MDcgMTk5NyAgQ2hyaXN0b3BoZXIgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbHQgd2l0aCBsYXRlc3QgZGV2byBhdXRvY29uZiBmb3IgTlQgc3VwcG9ydC4KLQotRnJpIEF1ZyAyMiAxMDozNToxNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFVzZSBjdXJseSBicmFjZSBzeW50YXggZm9yIHJlZ2lzdGVyCi0JbGlzdHMuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogQWRkIE5PVF9SMCBmbGFnIHRvIGRlY2VjdCBjYXNlcwotCXdoZXJlIHIwIGlzIGJlaW5nIHVzZWQgYXMgYSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KLQotVGh1IEF1ZyAyMSAxMTowOTowOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXNbXSk6IE1vdmUgZGl2aCBvcGNvZGVzIG5leHQgdG8gZWFjaCBvdGhlci4KLQotVHVlIEF1ZyAxOSAxMDo1OTo1OSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYyAoYWxwaGFfb3Bjb2Rlcyk6IEZpeCBod19yZWlfc3RhbGwgbXVuZ2FnZS4KLQotTW9uIEF1ZyAxOCAxMToxMDowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXNbXSk6IFJlbW92ZSB1c2Ugb2YgZmxhZyBmaWVsZC4KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogQWRkIHN1cHBvcnQgZm9yIHJldmVyc2VkIHNob3J0IGxvYWQKLQlvcGNvZGVzLi4KLQotTW9uIEF1ZyAxOCAxMTowODoyNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUgKGNnZW5fZmlsZXMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChjZ2VuX2ZpbGVzKTogIEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMTE6MDg6MjUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChjZ2VuX2ZpbGVzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGNnZW5fZmlsZXMpOiAgQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLUZyaSBBdWcgMTUgMDU6MTc6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChiZmRfYXJjX2FyY2gpOiBBZGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX01BQ0hJTkVTKTogQWRkIGFyYy1kaXMubG8sIGFyYy1vcGMubG8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGFyYy1kaXMuYywgYXJjLW9wYy5jOiBOZXcgZmlsZXMuCi0JKiBkaXNhc3NlbWJsZS5jIChBUkNIX2FsbCk6IERlZmluZSBBUkNIX2FyYy4KLQkoZGlzYXNzZW1ibGVyKTogQWRkIEFSQyBzdXBwb3J0LgotCi1XZWQgQXVnIDEzIDE4OjUyOjExIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBFQSBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9pNWRpdiwgZXh0cmFjdF9pNWRpdik6IE5ldyBGdW5jdGlvbnMuCi0JKHY4NTBfb3Bjb2Rlcyk6IEFkZCB2ODUwRUEgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwRSBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kNV80LCBleHRyYWN0X2Q1XzQsIGluc2VydF9kMTZfMTYsCi0JZXh0cmFjdF9kMTZfMTYsIGluc2VydF9pOSwgZXh0cmFjdF9pOSwgaW5zZXJ0X3U5LCBleHRyYWN0X3U5LAotCWluc2VydF9zcGUsIGV4dHJhY3Rfc3BlKTogTmV3IEZ1bmN0aW9ucy4KLQkodjg1MF9vcGNvZGVzKTogQWRkIHY4NTBFIGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1vcGMuYzogUmVvcmdhbmlzZWQgYW5kIHJlLWxheWVkIG91dCB0byBpbXByb3ZlIHJlYWRhYmlsaXR5Ci0JYW5kIHBvcnRhYmlsaXR5LgotCi1UdWUgQXVnICA1IDIzOjA5OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4xLgotCi1Nb24gQXVnICA0IDEyOjAyOjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlIHBhdGNoZXMuCi0KLUZyaSBBdWcgIDEgMTM6MDI6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2luY2x1ZGUubTQ6IEp1c3QgaW5jbHVkZSBhY2luY2x1ZGUubTQgZnJvbSBCRkQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBKdWwgMzEgMjE6NDQ6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZS4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4KLQlSZW1vdmVkIHNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQotCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsCi0JQU1fQ1lHV0lOMzIsIGFuZCBBTV9FWEVFWFQuICBSZXBsYWNlIEFDX1BST0dfSU5TVEFMTCB3aXRoCi0JQU1fUFJPR19JTlNUQUxMLiAgQ2hhbmdlIGFsbCAubyBmaWxlcyB0byAubG8uICBSZW1vdmUgc3RhbXAtaAotCWhhbmRsaW5nIGluIEFDX09VVFBVVC4KLQkqIGRlcC1pbi5zZWQ6IENoYW5nZSAubyB0byAubG8uCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBKdWwgMjggMjE6NTI6MjQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBGaXggdHlwby90aGlua28gaW4gImVyZXQiIGluc3RydWN0aW9uLgotCi1UaHUgSnVsIDI0IDEzOjAzOjI2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4IHNwZWxsaW5nIG9uIGZwYWRkWCwgZnBzdWJYIGluc25zLgotCU1ha2UgYXJyYXkgY29uc3QuCi0JKiBzcGFyYy1kaXMuYyAoc29ydGVkX29wY29kZXMpOiBOZXcgc3RhdGljIGxvY2FsLgotCShzdHJ1Y3Qgb3Bjb2RlX2hhc2gpOiBgb3Bjb2RlJyBpcyBwb2ludGVyIHRvIGNvbnN0IGVsZW1lbnQuCi0JKGJ1aWxkX2hhc2gpOiBGaXJzdCBhcmcgaXMgbm93IHRhYmxlIG9mIHNvcnRlZCBwb2ludGVycy4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IFNvcnQgb3Bjb2RlcyBieSBzb3J0aW5nIHRhYmxlIG9mIHBvaW50ZXJzLgotCShjb21wYXJlX29wY29kZXMpOiBVcGRhdGUuCi0KLVR1ZSBKdWwgMTUgMTI6MDU6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYzogI2luY2x1ZGUgPGN0eXBlLmg+LgotCShoYXNoX2tleXdvcmRfbmFtZSk6IE5ldyBhcmcgYGNhc2Vfc2Vuc2l0aXZlX3AnLiAgQ2FsbGVycyB1cGRhdGVkLgotCUhhbmRsZSBjYXNlIGluc2Vuc2l0aXZlIGhhc2hpbmcuCi0JKGhhc2hfa2V5d29yZF92YWx1ZSk6IENoYW5nZSB0eXBlIG9mIGB2YWx1ZScgdG8gdW5zaWduZWQgaW50LgotCi1UaHUgSnVsIDEwIDEyOjU2OjEwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAobWlwc19idWlsdGluX29wY29kZXMpOiBJZiBhbiBpbnNuIHVzZXMgc2luZ2xlCi0JcHJlY2lzaW9uIEZQLCBtYXJrIGl0IGFzIHN1Y2guICBMaWtld2lzZSBmb3IgZG91YmxlIHByZWNpc2lvbgotCUZQLiAgTWFyayBJU0ExIGluc25zLiAgQ29uc29saWRhdGUgZHVwbGljYXRlIG9wY29kZXMgd2hlcmUKLQlwb3NzaWJsZS4KLQotV2VkIEp1biAyNSAxNToyNTo1NyAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGNpcmRhbi5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKGV4dHJhY3RfbnNpKTogbWFrZSB1bnNpZ25lZCBleHByZXNzaW9uIHNpZ25lZCBiZWZvcmUKLSAJbmVnYXRpbmcgaXQuCi0JKFVOVVNFRCk6IHJlbW92ZSBvbmUgbGV2ZWwgb2YgcGFyZW5zLCBzbyBNU1ZDIGRvZXNuJ3QgY2hva2Ugb24KLSAJbmVzdGluZyBkZXB0aCB3aGVuIGFsbCB0aGUgbWFjcm9zIGFyZSBleHBhbmRlZC4KLQotVHVlIEp1biAxNyAxNzowMjoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBUaGUgZmNtcCB2OWEgaW5zdHJ1Y3Rpb25zIHRha2UgYW4gaW50ZWdlciByZWdpc3RlcgotCWFzIGEgZGVzdGluYXRpb24sIG5vdCBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgRnJvbSBDaHJpc3RpYW4KLQlLdWVobmtlIDxDaHJpc3RpYW4uS3VlaG5rZUBhcmJpLkluZm9ybWF0aWsuVW5pLU9sZGVuYnVyZy5ERT4uCi0KLU1vbiBKdW4gMTYgMTQ6MTM6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFByaW50IGNhc2UgNy4yIHVzaW5nICVwY0AoKQotCXN5bnRheC4gIEZyb20gUm9tYW4gSG9kZWsKLQk8cm5ob2Rla0BmYXVpMjJjLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPi4KLQotCSogaTM4Ni1kaXMuYyAodHdvYnl0ZV9oYXNfbW9kcm0pOiBGaXggcGFuZC4KLQotTW9uIEp1biAxNiAxNDowODozOCAxOTk3ICBNaWNoYWVsIFRheWxvciAgPG1idEBtaXQuZWR1PgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZfdHdvYnl0ZSk6IEZpeCBwYW5kIGFuZCBwYW5kbi4KLQotVHVlIEp1biAxMCAxMToyNjo0NyAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBhcm0tZGlzLmM6IEFkZCBwcm90b3R5cGVzIGZvciBhcm1fZGVjb2RlX3NoaWZ0IGFuZAotCXByaW50X2luc25fYXJtLgotCi1Nb24gSnVuICAyIDExOjM5OjA0IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgcjM5MDAgaW5zbnMuCi0KLVR1ZSBNYXkgMjcgMTU6NTU6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBDaGFuZ2UgcmVsbWFzayB0byBiZmRfdm1hLiAgRG9uJ3QKLQlwcmludCBkZWxheSBzbG90IGluc3RydWN0aW9ucyBvbiB0aGUgc2FtZSBsaW5lLiAgV2hlbiB1c2luZyBhIFBDCi0JcmVsYXRpdmUgbG9hZCwgYWRkIGEgY29tbWVudCB3aXRoIHRoZSB2YWx1ZSBiZWluZyBsb2FkZWQgaWYgaXQgY2FuCi0JYmUgb2J0YWluZWQuCi0KLVR1ZSBNYXkgMjcgMTE6MDI6MDggMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZbXSwgZGlzMzg2X3R3b2J5dGVbXSk6IGNoYW5nZSBwdXNobC9wb3BsCi0JdG8gcHVzaFMvcG9wUyBmb3Igc2VnbWVudCByZWdzIGFuZCBieXRlIGNvbnN0YW50IHNvIHRoYXQKLQlwdXNody9wb3B3IHByaW50ZWQgd2hlbiBpbiAxNiBiaXQgZGF0YSBtb2RlLgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZbXSk6IGNoYW5nZSBjd3RsLCBjbHRkIHRvIGNXdFMsIGNTdGQgdG8KLQlwcmludCBjYnR3LCBjd3RkIGluIDE2IGJpdCBkYXRhIG1vZGUuCi0JKiBpMzg2LWRpcy5jIChwdXRvcCk6IGV4dHJhIGNhc2UgVyB0byBzdXBwb3J0IGFib3ZlLgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX3g4Nik6IHByaW50IGFkZHIzMiBwcmVmaXggd2hlbiBnaXZlbgotCWFkZHJlc3Mgc2l6ZSBwcmVmaXggaW4gMTYgYml0IGFkZHJlc3MgbW9kZS4KLQotRnJpIE1heSAyMyAxNjo0NzoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jOiBSZWluZGVudC4gIFJlbmFtZSBsb2NhbCB2YXJpYWJsZSBmcHJpbnRmIHRvCi0JZnByaW50Zl9mbi4KLQotVGh1IE1heSAyMiAxNDowNjowMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jIChtMzJyX2NnZW5faW5zbl90YWJsZSwgY21wdWkpOiBVbmRvIHBhdGNoIG9mIE1heSAyLgotCi1UdWUgTWF5IDIwIDExOjI2OjI3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IE1vdmVkIElOU05fSVNBIGZpZWxkIGludG8gbmV3Ci0JICBmaWVsZCBtZW1iZXJzaGlwLgotCSogbWlwczE2LW9wYy5jIChtaXAxNl9vcGNvZGVzKTogc2FtZS4KLQotTW9uIE1heSAxMiAxNToxMDo1MyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG1vdmViKTogQ2hhbmdlICRkIHRvICVkLgotCi1Nb24gTWF5ICA1IDE0OjI4OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogKGRpczM4Nl90d29ieXRlKTogQWRkIE1NWCBpbnN0cnVjdGlvbnMuCi0JKHR3b2J5dGVfaGFzX21vZHJtKTogTGlrZXdpc2UuCi0JKGdycHMpOiBMaWtld2lzZS4KLQkoT1BfTU1YLCBPUF9FTSwgT1BfTVMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQotCSogaTM4Ni1kaXMuYzogUmV2ZXJ0IHBhdGNoIG9mIEFwcmlsIDQuICBUaGUgb3V0cHV0IG5vdyBtYXRjaGVzCi0Jd2hhdCBnY2MgZ2VuZXJhdGVzLgotCi1GcmkgTWF5ICAyIDEyOjQ4OjM3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmMgKG0zMnJfY2dlbl9pbnNuX3RhYmxlLCBjbXB1aSk6IFVzZSAkdWltbTE2IGluc3RlYWQKLQlvZiAkc2ltbTE2LgotCi1UaHUgTWF5ICAxIDE1OjM0OjE1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmggKENHRU5fQVJDSCk6IFJlbmFtZWQgZnJvbSBDR0VOX0NQVS4KLQotVHVlIEFwciAxNSAxMjo0MDowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQotTW9uIEFwciAxNCAxMjoxMzo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TdW4gQXByIDEzIDE3OjUwOjQxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tKi5jLCBtMzJyLSouYzogI2luY2x1ZGUgc3lzZGVwLmggaW5zdGVhZCBvZiBjb25maWcuaC4KLQlEZWxldGUgc3RyaW5neyxzfS5oIHN1cHBvcnQuCi0KLVRodSBBcHIgMTAgMTQ6NDQ6NTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKTogTmV3IGdsb2JhbC4KLQkoY2dlbl9wYXJzZV97eyx1bn1zaWduZWRfaW50ZWdlcixhZGRyZXNzfSk6IFVwZGF0ZSBjYWxsIHRvCi0JY2dlbl9wYXJzZV9vcGVyYW5kX2ZuLgotCShjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCk6IE5ldyBmdW5jdGlvbi4KLQkqIG0zMnItYXNtLmMgKHBhcnNlX2luc25fbm9ybWFsKTogY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgcmVuYW1lZAotCWZyb20gY2dlbl9hc21faW5pdF9wYXJzZS4KLQkobTMycl9jZ2VuX2Fzc2VtYmxlX2luc24pOiBOZXcgb3BlcmFuZCBgZXJybXNnJy4KLQlEZWxldGUgY2FsbCB0byBhc19iYWQsIHJldHVybiBlcnJvciBtZXNzYWdlIHRvIGNhbGxlci4KLQkobTMycl9jZ2VuX2FzbV9oYXNoX2tleXdvcmRzKTogI2lmIDAgb3V0LgotCi1XZWQgQXByICA5IDEyOjA1OjI1IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZykgW2Nhc2UgJ2QnXTogUHJpbnQgYXMgYWRkcmVzcyByZWdpc3RlciwKLQlub3QgZGF0YSByZWdpc3Rlci4KLQlbY2FzZSAnSiddOiBGaXggdHlwbyBpbiByZWdpc3RlciBuYW1lLgotCi1Nb24gQXByICA3IDE2OjQ4OjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIFNITElCX0xJQlMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoU0hMSUJfTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJQikpOiBVc2UgJChTSExJQl9MSUJTKS4KLQotTW9uIEFwciAgNyAxMTo0NTo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWRpcy5jIChidWlsZF9kaXNfaGFzaF90YWJsZSk6IEZpeCB4bWFsbG9jIHNpemUgY29tcHV0YXRpb24uCi0KLQkqIGNnZW4tb3BjLmMgKGhhc2hfa2V5d29yZF9uYW1lKTogSW1wcm92ZSBhbGdvcml0aG0uCi0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBtMzJyLgotCi1GcmkgQXByICA0IDEyOjI5OjM4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsIG0zMnItZGlzLmMsIG0zMnItb3BjLmMsIG0zMnItb3BjLmg6IE5ldyBmaWxlcy4KLQkqIGNnZW4tYXNtLmMsIGNnZW4tZGlzLmMsIGNnZW4tb3BjLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgdGhlbS4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIHRoZW0uCi0JKGRlcGVuZGVuY2llcyk6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW4gKGNnZW5fZmlsZXMpOiBOZXcgdmFyaWFibGUuCi0JKGJmZF9tMzJyX2FyY2gpOiBBZGQgZW50cnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLUZyaSBBcHIgIDQgMTQ6MDQ6MTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENvcnJlY3QgZmlsZSBuYW1lcyBmb3IgYmZkX21uMTBbMjNdMDBfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBkMTB2LWRpcy5jOiBJbmNsdWRlICJhbnNpZGVjbC5oIiBiZWZvcmUgIm9wY29kZS9kMTB2LmgiLgotCi0JKiBpMzg2LWRpcy5jIChmbG9hdF9yZWcpOiBTd2FwIGZzdWJycCBhbmQgZnN1YnAuICBTd2FwIGZkaXZycCBhbmQKLQlmZGl2cC4KLQotVGh1IEFwciAgMyAxMzoyMjo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotV2VkIEFwciAgMiAxMjoyMzo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG0xMDIwMC1kaXMuYzogUmVuYW1lIGZyb20gbW4xMDIwMC1kaXMuYy4KLQkqIG0xMDIwMC1vcGMuYzogUmVuYW1lIGZyb20gbW4xMDIwMC1vcGMuYy4KLQkqIG0xMDMwMC1kaXMuYzogUmVuYW1lIGZyb20gbW4xMDMwMC1kaXMuYwotCSogbTEwMzAwLW9wYy5jOiBSZW5hbWUgZnJvbSBtbjEwMzAwLW9wYy5jLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotCSogbWlwczE2LW9wYy5jOiBBZGQgbXVsIGFuZCBkbXVsIG1hY3Jvcy4KLQotVHVlIEFwciAgMSAxNjoyNzo0NSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgQ0ZMQUdTLCBhZGQgY2xlYW4gdGFyZ2V0LgotCi1GcmkgTWFyIDI4IDEyOjEwOjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkICJ3YWl0Ii4gIEZyb20gUmFsZiBCYWVjaGxlCi0JPHJhbGZAZ251LmFpLm1pdC5lZHU+LgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdGRsaWIuaCB0byBBQ19DSEVDS19IRUFERVJTIGxpc3QuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIHN5c2RlcC5oOiBJbmNsdWRlIDxzdGRsaWIuaD4gaWYgaXQgZXhpc3RzLgotCSogc3BhcmMtZGlzLmM6IEluY2x1ZGUgPHN0ZGlvLmg+IGFuZCAic3lzZGVwLmgiLiAgRG9uJ3QgaW5jbHVkZQotCTxzdHJpbmcuaD4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVRodSBNYXIgMjcgMTQ6MjQ6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmM6IEFkZCBQUEMgNDAzIGluc3RydWN0aW9ucyBhbmQgZXh0ZW5kZWQgb3Bjb2Rlcy4gIEZyb20KLQlBbmRyZXcgQnJheSA8YW5keUBtYWRob3VzZS5kZW1vbi5jby51az4uCi0KLQkqIG1pcHMtb3BjLmM6IEFkZCBjYXN0IHdoZW4gc2V0dGluZyBtaXBzX29wY29kZXMuCi0KLVR1ZSBNYXIgMjUgMjM6MDQ6MDAgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiAgRml4IHNpZ24gZXh0ZW5zaW9uIHByb2JsZW0uCi0JKiB2ODUwLW9wYy5jIChleHRyYWN0X2QqKTogIEZpeCBzaWduIGV4dGVuc2lvbiBwcm9ibGVtcyB0byBtYWtlCi0JZGlzYXNzZW1ibHkgY2FsY3VsYXRlIGJyYW5jaCBvZmZzZXRzIGNvcnJlY3RseS4KLQotTW9uIE1hciAyNCAxMzoyMjoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBBZGQgYmYvcyBhbmQgYnQvcyBhcyBzeW5vbnltcyBmb3IgYmYucyBhbmQgYnQucy4KLQotCSogbWlwcy1vcGMuYzogQWRkIGRjdHIgYW5kIGRjdHcuCi0KLVN1biBNYXIgMjMgMTg6MDg6MTAgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc24pOiBDaGFuZ2UgdGhlIHdheSBzaWduZWQgY29uc3RhbnRzCi0JYXJlIGRpc3BsYXllZC4KLQotRnJpIE1hciAyMSAxNDozNzo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCRkRfSCk6IE5ldyB2YXJpYWJsZS4KLQkoSEZJTEVTKTogTmV3IHZhcmlhYmxlLgotCShDRklMRVMpOiBBZGQgYWxsIEMgZmlsZXMuCi0JKC5kZXAsIC5kZXAxLCBkZXAuc2VkLCBkZXAsIGRlcC1pbik6IE5ldyB0YXJnZXRzLgotCURlbGV0ZSBvbGQgZGVwZW5kZW5jaWVzLCBhbmQgYnVpbGQgbmV3IG9uZXMuCi0JKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KLQotVGh1IE1hciAyMCAxOTowMzozMCAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkZWQgYmxvIGFuZCBibG97cyxiLHcsbH0uCi0KLVR1ZSBNYXIgMTggMTQ6MTc6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jOiBDaGFuZ2UgInRyYXAiIHRvICJzeXNjYWxsIi4KLQkqIG1uMTAzMDAtb3BjLmM6IEFkZCBuZXcgInN5c2NhbGwiIGluc3RydWN0aW9uLgotCi1Nb24gTWFyIDE3IDA4OjQ4OjAzIDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogUHJvdmlkZSBjb3JyZWN0IGVudHJpZXMgZm9yIG11bHNsIGFuZAotIAltdWx1bCBpbnNucyBvbiB0aGUgY29sZGZpcmUuCi0KLVNhdCBNYXIgMTUgMTc6MTM6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogRG9uJ3QgcHJpbnQgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi0JKHByaW50X2luc25fYmlnX2FybSk6IFNldCBieXRlc19wZXJfY2h1bmsgYW5kIGRpc3BsYXlfZW5kaWFuLgotCShwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KLQotRnJpIE1hciAxNCAxNTowODo1OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz46Ci0JKiBpMzg2LWRpcy5jIChmZXRjaF9kYXRhKTogQWRkIHByb3RvdHlwZS4KLQkqIG02OGstZGlzLmMgKGZldGNoX2RhdGEpOiBBZGQgcHJvdG90eXBlLgotCShkdW1teV9wcmludF9hZGRyZXNzKTogQWRkIHByb3RvdHlwZS4gIE1ha2Ugc3RhdGljLgotCSogcHBjLW9wYy5jICh2YWxpZF9ibyk6IEFkZCBwcm90b3R5cGUuCi0JKiBzcGFyYy1kaXMuYyAoYnVpbGRfaGFzaF90YWJsZSk6IEFkZCBwcm90b3R5cGUuCi0JKGlzX2RlbGF5ZWRfYnJhbmNoLCBjb21wdXRlX2FyY2hfbWFzayk6IEFkZCBwcm90b3R5cGVzLgotCShwcmludF9pbnNuX3NwYXJjKTogTWFrZSBzZXZlcmFsIGxvY2FsIHZhcmlhYmxlcyBjb25zdC4KLQkoY29tcGFyZV9vcGNvZGVzKTogQ2hhbmdlIGFyZ3VtZW50cyB0byBjb25zdCBQVFIuICBBZGQgcHJvdG90eXBlLgotCSogc3BhcmMtb3BjLmMgKGFyZyk6IENoYW5nZSBuYW1lIGZpZWxkIHRvIGJlIGNvbnN0LgotCShsb29rdXBfbmFtZSwgbG9va3VwX3ZhbHVlKTogQWRkIHByb3RvdHlwZXMuICBDaGFuZ2UgdGFibGUgYW5kCi0JbmFtZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnN0LgotCShzcGFyY19lbmNvZGVfYXNpKTogQ2hhbmdlIG5hbWUgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShzcGFyY19lbmNvZGVfbWVtYmFyLCBzcGFyY19lbmNvZGVfcHJlZmV0Y2gpOiBMaWtld2lzZS4KLQkoc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnKTogTGlrZXdpc2UuCi0JKHNwYXJjX2RlY29kZV9hc2kpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYmUgY29uc3QuCi0JKHNwYXJjX2RlY29kZV9tZW1iYXIsIHNwYXJjX2RlY29kZV9wcmVmZXRjaCk6IExpa2V3aXNlLgotCShzcGFyY19kZWNvZGVfc3BhcmNsZXRfY3ByZWcpOiBMaWtld2lzZS4KLQotRnJpIE1hciAgNyAxMDo1MTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBKdXN0IHVzZSBsbiAtcywgbm90IGxuIC1zZiwgc2luY2UKLQlTb2xhcmlzIGRvZXNuJ3QgbGlrZSB0aGUgY29tYmluZWQgb3B0aW9ucywgYW5kIHRoZSAtZiBpcwotCXVubmVjZXNzYXJ5LgotCShzdGFtcC10c2hsaW5rLCBpbnN0YWxsKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgIDYgMTY6NTE6MTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChJTU0xNl9QQ1JFTCwgU0Q4Tl9QQ1JFTCwgRDE2X1NISUZUKTogTWFyayB0aGVzZQotCWFzIHJlbGF4YWJsZS4KLQotVHVlIE1hciAgNCAwNjoxMDozNiAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRml4IGxhc3QgY2hhbmdlIGZvciB0aGUgbWM2ODAxMC4KLQotTW9uIE1hciAgMyAwNzo0NToyMCAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkZWQgZW50cmllcyBmb3IgdGhlIHRzdCBpbnNucyBvbgotIAl0aGUgbWM2ODAwMC4KLQotVGh1IEZlYiAyNyAxNDowNDozMiAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGRlZCBzd2JlZ2wgcHNldWRvLWluc3RydWN0aW9uLgotCi1UaHUgRmViIDI3IDExOjM2OjQxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFNldCBpbmZvLT5ieXRlc19wZXJfbGluZSB0byA4LgotCi1XZWQgRmViIDI2IDE1OjM0OjQ4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogRGVmaW5lIHIyNSBwcm9wZXJseS4KLQotV2VkIEZlYiAyNiAxMzozODozMCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAoTkVYVFNJTkdMRSwgTkVYVERPVUJMRSwgTkVYVEVYVEVORCk6IFVzZQotCWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSB0byBtYWtlIHBvcnRhYmxlLgotCShwcmludF9pbnNuX2FyZyk6IFVzZSBORVhURVhURU5EIG1hY3JvIHdoZW4gZXh0cmFjdGluZyBleHRlbmRlZAotCXByZWNpc2lvbiBmbG9hdC4KLQotTW9uIEZlYiAyNCAxOToyNjoxMiAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEluaXRpYWxpemUgbWlwc19vcGNvZGVzIHRvIG1pcHNfYnVpbHRpbl9vcGNvZGVzLAotCWFuZCBiZmRfbWlwc19udW1fb3Bjb2RlcyB0byBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzLgotCi1Nb24gRmViIDI0IDE1OjE5OjAxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jLCBkMTB2LW9wYy5jOiBDaGFuZ2UgcHJlX2RlZmluZWRfcmVnaXN0ZXJzIHRvCi0JZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycyBhbmQgcmVnX25hbWVfY250IHRvIGQxMHZfcmVnX25hbWVfY250LgotCi1Nb24gRmViIDI0IDE0OjMzOjI2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAoTFNJX1NDQUxFRCk6IFJlbmFtZWQgZnJvbSB0aGlzIC4uLgotCShPRkZfU0xfQlJfU0NBTEVEKTogLi4uIHRvIHRoaXMsIGFuZCBhZGRlZCB0aGUgZmxhZwotCVRJQzgwX09QRVJBTkRfQkFTRVJFTCB0byB0aGUgZmxhZ3Mgd29yZC4KLQkodGljODBfb3Bjb2Rlcyk6IFJlcGxhY2UgYWxsIG9jY3VyYW5jZXMgb2YgTFNJX1NDQUxFRCB3aXRoCi0JT0ZGX1NMX0JSX1NDQUxFRC4KLQotU2F0IEZlYiAyMiAyMToyNTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBtYWNyb3MgZm9yIGNvcDAsIGNvcDEgY29wMiBhbmQgY29wMy4KLQlDaGFuZ2UgbWlwc19vcGNvZGVzIGZyb20gY29uc3QgYXJyYXkgdG8gYSBwb2ludGVyLAotCWFuZCBjaGFuZ2UgYmZkX21pcHNfbnVtX29wY29kZXMgZnJvbSBjb25zdCBpbnQgdG8gaW50LAotCXNvIHRoYXQgd2UgY2FuIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBtaXBzIG9wY29kZXMgdGFibGUKLQlkeW5hbWljYWxseS4KLQotU2F0IEZlYiAyMiAyMTowMzo0NyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IFJldmVydCBjaGFuZ2UgdG8KLQlzdG9yZSBCSVROVU0gdmFsdWVzIGluIHRoZSB0YWJsZSBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0KLQl0byBtYXRjaCBiZWhhdmlvciB3aGVuIGFzc2VtYmxlciBpcyBnaXZlbiBhIHJhdyBudW1lcmljCi0JdmFsdWUgZm9yIGEgQklUTlVNIG9wZXJhbmQuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfb3BlcmFuZF9iaXRudW0pOiBEaXR0by4KLQotRnJpIEZlYiAyMSAxNjozMToxOCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogUmVtb3ZlZCByZWZlcmVuY2VzIHRvIEZMQUdfWC4KLQotV2VkIEZlYiAxOSAxNDo1MToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jaWVzIG9uIC4uL2JmZC9iZmQuaCBhcyByZXF1aXJlZC4KLQotVHVlIEZlYiAxOCAxNzo0Mzo0MyAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIGQzMHYgb2JqZWN0IGZpbGVzLgotCSogY29uZmlndXJlOiAoYmZkX2QzMHZfYXJjaCkgUmVidWlsdC4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF9kMzB2X2FyY2gpIEFkZGVkIG5ldyBjYXNlLgotCSogZDMwdi1kaXMuYzogTmV3IGZpbGUuCi0JKiBkMzB2LW9wYy5jOiBOZXcgZmlsZS4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcikgQWRkIGVudHJ5IGZvciBkMzB2LgotCi1UdWUgRmViIDE4IDE2OjMyOjA4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogQWRkIHN5bWJvbGljCi0JcmVwcmVzZW50YXRpb25zIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgQklUTlVNIHZhbHVlcy4KLQotRnJpIEZlYiAxNCAxMjoxNDowNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IFN0b3JlIEJJVE5VTSB2YWx1ZXMKLQlpbiB0aGUgdGFibGUgaW4gb25lJ3MgY29tcGxlbWVudCBmb3JtLCBhcyB0aGV5IGFwcGVhciBpbiB0aGUKLQlhY3R1YWwgaW5zdHJ1Y3Rpb24uCi0JKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IFVzZSBtYWNyb3MgdG8gYWNjZXNzIHByZWRlZmluZWQKLQlzeW1ib2wgZmllbGRzLgotCSh0aWM4MF92YWx1ZV90b19zeW1ib2wpOiBEaXR0by4KLQkodGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9vcGVyYW5kX2JpdG51bSk6IFJlbW92ZSBjb2RlIHRoYXQgZGlkCi0Jb25lJ3MgY29tcGxlbWVudCBmb3IgQklUTlVNIHZhbHVlcy4KLQotVGh1IEZlYiAxMyAyMTo1Njo1MSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSZW1vdmUgOCBiaXQgY2hhcmFjdGVycy4gIFVwZGF0ZSB0byBsYXRlc3QKLQlnY2MgcmVsZWFzZS4KLQotVGh1IEZlYiAxMyAyMDo0MToyMiAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGQgc3diZWcgcHNldWRvLWluc3RydWN0aW9uLgotCi1UaHUgRmViIDEzIDE2OjMwOjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYyAoSU1NMTZfUENSRUwpOiBUaGlzIGlzIGEgc2lnbmVkIG9wZXJhbmQuCi0JKElNTTI0X1BDUkVMKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTMgMTM6Mjg6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9taXBzMTZfaW5zbl9hcmcpOiBVc2UgbWVtYWRkciAtIDIgYXMgdGhlIGJhc2UKLQlhZGRyZXNzIGZvciBhbiBleHRlbmRlZCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiB0aGF0IGlzIG5vdCBhCi0JYnJhbmNoLgotCi1XZWQgRmViIDEyIDEyOjI3OjQwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBTZXQgYnl0ZXNfcGVyX2NodW5rIGFuZAotCWJ5dGVzX3Blcl9saW5lLgotCi1UdWUgRmViIDExIDE2OjM2OjMxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBGaXggdHlwbyAnKycgLT4gJ3wnLgotCSh0aWM4MF9vcGNvZGVzKTogU29ydCBlbnRyaWVzIHNvIHRoYXQgbG9uZyBpbW1lZGlhdGUgZm9ybXMKLQljb21lIGFmdGVyIHNob3J0IGltbWVkaWF0ZSBmb3JtcywgbWFraW5nIGl0IGVhc2llciBmb3IKLQlhc3NlbWJsZXIgdG8gc2VsZWN0IHRoZSByaWdodCBvbmUgZm9yIGEgZ2l2ZW4gb3BlcmFuZC4KLQotVHVlIEZlYiAxMSAxNToyNjo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBTZXQgYnl0ZXNfcGVyX2NodW5rIGFuZAotCWRpc3BsYXlfZW5kaWFuLgotCShwcmludF9pbnNuX21pcHMxNik6IExpa2V3aXNlLgotCi1Nb24gRmViIDEwIDEwOjEyOjQxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogQ2hhbmdlZCB0byBhY2NlcHQKLQlhIHN5bWJvbCBjbGFzcyB0aGF0IHJlc3RyaWN0cyB0cmFuc2xhdGlvbiB0byBqdXN0IHRoYXQKLQljbGFzcyAoZ2VuZXJhbCByZWdpc3RlciwgY29uZGl0aW9uIGNvZGUsIGV0YykuCi0KLVRodSBGZWIgIDYgMTc6MzQ6MDkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEFkZCBSRUdfMF9FLCBSRUdfMjJfRSwKLQlhbmQgUkVHX0RFU1RfRSBmb3IgcmVnaXN0ZXIgb3BlcmFuZHMgdGhhdCBoYXZlIHRvIGJlCi0JYW4gZXZlbiBudW1iZXJlZCByZWdpc3Rlci4gIEFkZCBSRUdfRlBBIGZvciBvcGVyYW5kcyB0aGF0Ci0JYXJlIG9uZSBvZiB0aGUgZmxvYXRpbmcgcG9pbnQgYWNjdW11bGF0b3IgcmVnaXN0ZXJzLgotCUFkZCBUSUM4MF9PUEVSQU5EX01BU0sgdG8gZmxhZ3MgZm9yIEVORE1BU0sgb3BlcmFuZC4KLQkodGljODBfb3Bjb2Rlcyk6IENoYW5nZSBlbnRyaWVzIHRoYXQgbmVlZCBldmVuIG51bWJlcmVkCi0JcmVnaXN0ZXIgb3BlcmFuZHMgdG8gdXNlIHRoZSBuZXcgb3BlcmFuZCB0YWJsZSBlbnRyaWVzLgotCUFkZCAib3IiIGVudHJpZXMgdGhhdCBhcmUgaWRlbnRpY2FsIHRvICJvci50dCIgZW50cmllcy4KLQotV2VkIEZlYiAgNSAxMToxMjo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMxNi1vcGMuYzogQWRkIG5ldyBjYXNlcyBvZiBleGl0IGluc3RydWN0aW9uIGZvcgotCWRpc2Fzc2VtYmxlci4KLQkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IERpc3BsYXkgZmxvYXRpbmcgcG9pbnQKLQlyZWdpc3RlcnMgaW4gb3BlcmFuZHMgb2YgZXhpdCBpbnN0cnVjdGlvbi4gIFByaW50IGAkJyBiZWZvcmUKLQlyZWdpc3RlciBuYW1lcyBpbiBvcGVyYW5kcyBvZiBlbnRyeSBhbmQgZXhpdCBpbnN0cnVjdGlvbnMuCi0KLVRodSBKYW4gMzAgMTQ6MDk6MDMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBUYWJsZSBvZiBuYW1lL3ZhbHVlCi0JcGFpcnMgZm9yIGFsbCBwcmVkZWZpbmVkIHN5bWJvbHMgcmVjb2duaXplZCBieSB0aGUgYXNzZW1ibGVyLgotCUFsc28gdXNlZCBieSB0aGUgZGlzYXNzZW1ibGluZyByb3V0aW5lcy4KLQkodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCSh0aWM4MF92YWx1ZV90b19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfb3BlcmFuZF9jb250cm9sX3JlZ2lzdGVyLAotIAlwcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlLCBwcmludF9vcGVyYW5kX2JpdG51bSk6Ci0JUmVtb3ZlIHByaXZhdGUgdGFibGVzIGFuZCB1c2UgdGljODBfdmFsdWVfdG9fc3ltYm9sIGZ1bmN0aW9uLgotCi1UaHUgSmFuIDMwIDExOjMwOjQ1IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogQ2hhbmdlIGFkZHJlc3MgcHJpbnRpbmcKLQl0byBjb3JyZWN0bHkgaGFuZGxlIFBDIHdyYXBwaW5nLiAgRml4ZXMgUFIxMTQ5MC4KLQotV2VkIEphbiAyOSAwOTozOToxNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3BlcmFuZHMpOiBNYWtlIDggYW5kIDE2IGJpdCBwYy1yZWxhdGl2ZQotCWJyYW5jaGVzIHJlbGF4YWJsZS4KLQotVHVlIEphbiAyOCAxNTo1NzozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbWlwczE2KTogU2V0IGluc25faW5mbyBpbmZvcm1hdGlvbi4KLQkocHJpbnRfbWlwczE2X2luc25fYXJnKTogTGlrZXdpc2UuCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbWlwczE2KTogQmV0dGVyIGhhbmRsaW5nIG9mIGFuIGV4dGVuZAotIAlvcGNvZGUgZm9sbG93ZWQgYnkgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggY2FuIG5vdCBiZSBleHRlbmRlZC4KLQotRnJpIEphbiAyNCAxMjowODoyMSAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQ2hhbmdlZCBvcGVyYW5kIHNwZWNpZmllciBmb3IgdGhlCi0gCWNvbGRmaXJlIG1vdmViIGluc3RydWN0aW9uIHRvIG5vdCBhbGxvdyBhbiBhZGRyZXNzIHJlZ2lzdGVyIGFzCi0gCWRlc3RpbmF0aW9uLiAgQWx0aG91Z2ggdGhlIGRvY3VtZW50YXRpb24gZG9lcyBub3QgaW5kaWNhdGUgdGhhdAotCXRoaXMgaXMgaW52YWxpZCwgZXhwZXJpbWVudHMgdW5jb3ZlcmVkIHVuZXhwZWN0ZWQgYmVoYXZpb3IuCi0JQWRkZWQgYSBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHNpdHVhdGlvbi4gIFRoYW5rcyB0byBBbmRyZWFzCi0JU2Nod2FiIGZvciBwb2ludGluZyB0aGlzIG91dCB0byBtZS4KLQotV2VkIEphbiAyMiAyMDoxMzo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wY29kZXMpOiBFeHBhbmQgY29tbWVudCB0byBub3RlIHRoYXQgdGhlCi0gCWVudHJpZXMgYXJlIHByZXNvcnRlZCBzbyB0aGF0IGVudHJpZXMgd2l0aCB0aGUgc2FtZSBtbmVtb25pYyBhcmUKLQlhZGphY2VudCB0byBlYWNoIG90aGVyIGluIHRoZSB0YWJsZS4gIFNvcnQgdGhlIGVudHJpZXMgZm9yIGVhY2gKLQlpbnN0cnVjdGlvbiBzbyB0aGF0IHRoaXMgaXMgdHJ1ZS4KLQotTW9uIEphbiAyMCAxMjo0ODo1NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYzogSW5jbHVkZSA8bGliaWJlcnR5Lmg+LgotCShwcmludF9pbnNuX202OGspOiBTb3J0IHRoZSBvcGNvZGUgdGFibGUgb24gdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLQluaWJibGUgb2YgdGhlIG9wY29kZS4KLQotU2F0IEphbiAxOCAxNToxNTowNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHRpYzgwX29wY29kZXMpOiBBZGQgIndyY3IiLCAidm1weSIsICJ2cm5kIiwKLQkidnN1YiIsICJ2c3QiLCAieG5vciIsIGFuZCAieG9yIiBpbnN0cnVjdGlvbnMuCi0JKFZfYTEpOiBSZW5hbWVkIGZyb20gVl9hLCBtc2Igb2YgYWNjdW11bGF0b3IgcmVnIG51bWJlci4KLQkoVl9hMCk6IEFkZCBtYWNybywgbHNiIG9mIGFjY3VtdWxhdG9yIHJlZyBudW1iZXIuCi0KLUZyaSBKYW4gMTcgMTg6MjQ6MzEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogQnJva2UgZXhjZXNzaXZlbHkgbG9uZwotCWZ1bmN0aW9uIHVwIGludG8gc2V2ZXJhbCBzbWFsbGVyIG9uZXMgYW5kIGFycmFuZ2VkIGZvcgotCXRoZSBpbnN0cnVjdGlvbiBwcmludGluZyBmdW5jdGlvbiB0byBiZSBjYWxsYWJsZSByZWN1cnNpdmVseQotCXRvIHByaW50IHZlY3RvciBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIGJvdGggYSBsb2FkIGFuZCBhCi0JbWF0aCBpbnN0cnVjdGlvbiBwYWNrZWQgaW50byBhIHNpbmdsZSBvcGNvZGUuCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3Bjb2Rlcyk6IEV4cGFuZCBjb21tZW50IGZvciB2bGQgb3Bjb2RlCi0JdG8gZXhwbGFpbiB3aHkgaXQgY29tZXMgYWZ0ZXIgdGhlIG90aGVyIHZlY3RvciBvcGNvZGVzLgotCi1GcmkgSmFuIDE3IDE2OjE5OjE1IDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogYWRkIGIsIHcsIG9yIGwgc3BlY2lmaWVyIHRvIGNvbGRmaXJlCi0JbW92ZSBpbnNucyB0byBoYW5kbGUgaW1tZWRpYXRlIG9wZXJhbmRzLgotCi1UaHUgSmFuIDE3IDE2OjE5OjAwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBEZWxldGUgZHVwbGljYXRlIGVudHJ5IGZvciAiY21waWwiLgotCWZpeCBvcGVyYW5kIG1hc2sgaW4gdGhlICJtb3ZlbWwiIGVudHJpZXMgZm9yIHRoZSBjb2xkZmlyZS4KLQotVGh1IEphbiAxNiAyMDo1NDo0MCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKFZfYSwgVl9tLCBWX1MsIFZfWiwgVl9wLCBPUF9WLCBNQVNLX1YpOgotCU5ldyBtYWNyb3MgZm9yIGJ1aWxkaW5nIHZlY3RvciBpbnN0cnVjdGlvbiBvcGNvZGVzLgotCSh0aWM4MF9vcGNvZGVzKTogUmVtb3ZlIGFsbCB1c2VzIG9mIEZNVF9TSSwgRk1UX1JFRywgYW5kCi0JRk1UX0xJLCB3aGljaCB3ZXJlIHVudXNlZC4gIFRoZSBmaWVsZCBpcyBub3cgYSBmbGFncyBmaWVsZC4KLQlSZW1vdmUgc29tZSBvcGNvZGVzIHRoYXQgYXJlIHBvc3NpYmxlLCBidXQgaWxsZWdhbCwgc3VjaAotCWFzIGxvbmcgaW1tZWRpYXRlIGluc3RydWN0aW9ucyB3aXRoIGRvdWJsZXMgZm9yIGltbWVkaWF0ZQotCXZhbHVlcy4gIEFkZCAidmFkZCIgYW5kICJ2bGQiIGluc3RydWN0aW9ucy4KLQotV2VkIEphbiAxNSAxODo1OTo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogUmVvcmRlciBzb21lIHRhYmxlIGVudHJpZXMgdG8gbWFrZQotCXRoZSBvcmRlciBtb3JlIGxvZ2ljYWwuICBNb3ZlIHRoZSBzaGlmdCBhbGlhcyBpbnN0cnVjdGlvbnMgKCJyb3RsIiwKLQkic2hsIiwgImlucyIsICJyb3RyIiwgImV4dHUiLCAiZXh0cyIsICJzcmwiLCBhbmQgInNyYSIgdG8gYmUKLSAJaW50ZXJzcGVyc2VkIHdpdGggdGhlIHJlZ3VsYXIgc3IueCBhbmQgc2wueCBpbnN0cnVjdGlvbnMuICBBZGQKLQlhbmQgdGVzdCBuZXcgaW5zdHJ1Y3Rpb24gb3Bjb2RlcyBmb3IgInNsIiwgInNsaSIsICJzciIsICJzcmkiLCAic3QiLAotIAkic3ViIiwgInN1YnUiLCAic3djciIsIGFuZCAidHJhcCIuCi0KLVR1ZSBKYW4gMTQgMTk6NDI6NTAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jIChPRkZfU1NfUEMpOiBSZW5hbWVkIGZyb20gT0ZGX1NTLgotCShPRkZfU0xfUEMpOiBSZW5hbWVkIGZyb20gT0ZGX1NMLgotCShPRkZfU1NfQlIpOiBOZXcgb3BlcmFuZCB0eXBlIGZvciBiYXNlIHJlbGF0aXZlIG9wZXJhbmQuCi0JKE9GRl9TTF9CUik6IE5ldyBvcGVyYW5kIHR5cGUgZm9yIGJhc2UgcmVsYXRpdmUgb3BlcmFuZC4KLQkoUkVHX0JBU0UpOiBOZXcgb3BlcmFuZCB0eXBlIGZvciBiYXNlIHJlZ2lzdGVyIG9wZXJhbmQuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgYW5kIHRlc3QgImZtcHkiLCAiZnJuZG0iLCAiZnJuZG4iLCAiZnJuZHAiLAotCSJmcm5keiIsICJmc3FydCIsICJmc3ViIiwgImlsbG9wMCIsICJpbGxvcEYiLCAiaW5zIiwgImpzciIsCi0JImxkIiwgImxkLnUiLCAibG1vIiwgIm9yIiwgInJkY3IiLCAicm1vIiwgInJvdGwiLCBhbmQgInJvdHIiCi0JaW5zdHJ1Y3Rpb25zLgotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBQcmludCBvcGNvZGUgbmFtZSB3aXRoIGZpeGVkIHdpZHRoCi0gCTEwIGNoYXIgZmllbGQsIHBhZGRlZCB3aXRoIHNwYWNlcyBvbiByaHMsIHJhdGhlciB0aGFuIGEgc3RyaW5nCi0gCWZvbGxvd2VkIGJ5IGEgdGFiLiAgVXNlIHJlbmFtZWQgVElDODBfT1BFUkFORF9QQ1JFTCBmbGFnIGJpdCByYXRoZXIKLSAJdGhhbiBvbGQgVElDODBfT1BFUkFORF9SRUxBVElWRS4gIEFkZCBzdXBwb3J0IGZvciBuZXcKLQlUSUM4MF9PUEVSQU5EX0JBU0VSRUwgZmxhZyBiaXQuCi0KLU1vbiBKYW4gMTMgMTU6NTg6NTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUHJpbnQgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMKLQlhcyBmbG9hdHMuCi0JKiB0aWM4MC1vcGMuYyAoU1BGSSk6IEFkZCBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50Ci0JaW1tZWRpYXRlIG9wZXJhbmQgdHlwZS4KLQkoUk9UQVRFKTogQWRkIHJvdGF0ZSBvcGVyYW5kIHR5cGUgZm9yIHNoaWZ0cy4KLQkoRU5ETUFTSyk6IEFkZCBmb3Igc2hpZnRzLgotCShuKTogTWFjcm8gZm9yIHRoZSAnbicgYml0LgotCShpKTogTWFjcm8gZm9yIHRoZSAnaScgYml0LgotCShQRCk6IE1hY3JvIGZvciB0aGUgJ1BEJyBmaWVsZC4KLQkoUDIpOiBNYWNybyBmb3IgdGhlICdQMicgZmllbGQuCi0JKFAxKTogTWFjcm8gZm9yIHRoZSAnUDEnIGZpZWxkLgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGVudHJpZXMgZm9yICJleHRzIiwgImV4dHUiLCAiZmFkZCIsCi0JImZjbXAiLCBhbmQgImZkaXYiLgotCi1Nb24gSmFuICA2IDE1OjA2OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBNYXNrIG9mZiB1bndhbnRlZCBiaXRzIGFmdGVyCi0JYWRkaW5nIGluIGN1cnJlbnQgYWRkcmVzcyBmb3IgcGMtcmVsYXRpdmUgb3BlcmFuZHMuCi0KLU1vbiBKYW4gIDYgMTA6NTY6MjUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChSX1NDQUxFRCk6IEFkZCBtYWNybyB0byB0ZXN0IGZvciAiOnMiIG1vZGlmaWVyIGJpdC4KLQkocHJpbnRfaW5zbl90aWM4MCk6IElmIFJfU0NBTEVEIHRoZW4gcHJpbnQgIjpzIiBtb2RpZmllciBmb3Igb3BlcmFuZC4KLQkqIHRpYzgwLW9wYy5jIChSRUcwLCBSRUcyMiwgUkVHMjcsIFNTT0ZGLCBMU09GRik6IE5hbWVzCi0JY2hhbmdlZCB0byBSRUdfMCwgUkVHXzIyLCBSRUdfREVTVCwgT0ZGX1NTLCBPRkZfU0wgcmVzcGVjdGl2ZWx5LgotCShTSUNSLCBMSUNSLCBSRUdNX1NJLCBSRUdNX0xJKTogTmFtZXMgY2hhbmdlZCB0byBDUl9TSSwgQ1JfTEksCi0JUkVHX0JBU0VfTV9TSSwgUkVHX0JBU0VfTV9MSSByZXNwZWN0aXZlbHkuCi0JKFJFR19TQ0FMRUQsIExTSV9TQ0FMRUQpOiBOZXcgb3BlcmFuZCB0eXBlcy4KLQkoRSk6IE5ldyBtYWNybyBmb3IgJ0UnIGJpdCBhdCBiaXQgMjcuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgYW5kIHRlc3QgZGxkLCBkbGQudSwgZHN0LCBlc3RvcCwgYW5kIGV0cmFwCi0Jb3Bjb2RlcywgaW5jbHVkaW5nIHRoZSB2YXJpb3VzIHNpemUgZmxhdm9ycyAoYixoLHcsZCkgZm9yCi0JdGhlIGRpcmVjdCBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0KLVN1biBKYW4gIDUgMTI6MTg6MTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChNX1NJLCBNX0xJKTogQWRkIG1hY3JvcyB0byB0ZXN0IGZvciAiOm0iIG1vZGlmaWVyIGJpdAotIAlpbiBhbiBpbnN0cnVjdGlvbi4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogQ2hhbmdlIGNvbW1hIGFuZCBwYXJlbiBoYW5kbGluZy4KLSAgCVVzZSBNX1NJIGFuZCBNX0xJIG1hY3JvcyB0byBjaGVjayBmb3IgIjptIiBtb2RpZmllciBmb3IgR1BSIG9wZXJhbmRzLgotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQWRkIFJFR01fU0kgYW5kIFJFR01fTEkgb3BlcmFuZHMuCi0JKEYsIE1fUkVHLCBNX0xJLCBNX1NJLCBTWl9SRUcsIFNaX0xJLCBTWl9TSSwgRCwgUyk6IE5ldwliaXQtdHdpZGRsZXJzLgotCShNQVNLX0xJX00sIE1BU0tfU0lfTSwgTUFTS19SRUdfTSk6IFJlbW92ZSBhbmQgcmVwbGFjZSBpbiBvcGNvZGUKLQltYXNrcyB3aXRoICJNQVNLXyogJiB+TV8qIiB0byBnZXQgdGhlIE0gYml0IHJlc2V0LgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGJzciwgYnNyLmEsIGNtbmQsIGNtcCwgZGNhY2hlYywgYW5kIGRjYWNoZWYuCi0KLVNhdCBKYW4gIDQgMTk6MDU6MDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUHJpbnQgVElDODBfT1BFUkFORF9SRUxBVElWRQotCWNvcnJlY3RseS4gIEFkZCBzdXBwb3J0IGZvciBwcmludGluZyBUSUM4MF9PUEVSQU5EX0JJVE5VTSBhbmQKLQlUSUM4MF9PUEVSQU5EX0NDLCBhbmQgVElDODBfT1BFUkFORF9DUiBvcGVyYW5kcyBpbiBzeW1ib2xpYwotCWZvcm0uCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBBZGQgU1NPRkYsIExTT0ZGLCBCSVROVU0sCi0JQ0MsIFNJQ1IsIGFuZCBMSUNSIHRhYmxlIGVudHJpZXMuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgYW5kIHRlc3QgIm5vcCIsICJiciIsICJiYm8iLCAiYmJ6IiwKLQkiYmNuZCIsIGFuZCAiYnJjciIgb3Bjb2Rlcy4KLQotRnJpIEphbiAgMyAxODozMjoxMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogTWFrZSBjb21tZW50IG1hdGNoIHRoZQotCWFjdHVhbCBmaWVsZHMgKG5vIHNoaWZ0IGZpZWxkKS4KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRG9jdW1lbnQgd2h5IHRoaXMgY2Fubm90IGJlICJjb25zdCIuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFJlcGxhY2UgYWJvcnQgc3R1YiB3aXRoIGEKLQlwYXJ0aWFsIGltcGxlbWVudGF0aW9uLCB3b3JrIGluIHByb2dyZXNzLgotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQmVnaW4gY29uc3RydWN0aW9uIG9wZXJhbmRzIHRhYmxlLgotCSh0aWM4MF9vcGNvZGVzKTogQ29udGludWUgcG9wdWxhdGluZyBvcGNvZGVzIHRhYmxlIGFuZCBzdGFydAotCWZpbGxpbmcgaW4gdGhlIG9wZXJhbmQgaW5kaWNlcy4KLQkodGljODBfbnVtX29wY29kZXMpOiBBZGQgdGhpcy4KLQotRnJpIEphbiAgMyAxMjoxMzo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IEFkZCAjQiBjYXNlIGZvciBtb3ZlcS4KLQotVGh1IEphbiAgMiAxMjoxNDoyOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTWFrZSBzdXJlIGFsbCB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkCi0JYmVmb3JlIHRoZXkgYXJlIHVzZWQuCi0KLVR1ZSBEZWMgMzEgMTI6MjA6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBQdXQgY3VybHktYnJhY2VzIGFyb3VuZCBvcGVyYW5kcwotCWZvciAiYnJlYWtwb2ludCIgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBEZWMgMzEgMTU6Mzg6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgotCShkZXApOiBVc2UgQUxMX0NGTEFHUyByYXRoZXIgdGhhbiBDRkxBR1MuCi0KLVR1ZSBEZWMgMzEgMTU6MDk6MTYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jIChEOF97Niw3fSk6IFNldCBWODUwX09QRVJBTkRfQURKVVNUX1NIT1JUX01FTU9SWQotCWZsYWcuCi0KLU1vbiBEZWMgMzAgMTc6MDI6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtNjhrLW9wYy5vLCBhbHBoYS1vcGMubyk6IFJlbW92ZSBkaXMtYXNtLmggZGVwZW5kZW5jeS4KLQkodGljODAtZGlzLm8sIHRpYzgwLW9wYy5vKTogQWRkIHJ1bGVzIHBlciBjb21tZW50IGluIE1ha2VmaWxlLmluLgotCi1Nb24gRGVjIDMwIDExOjM4OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwczE2LW9wYy5jOiBBZGQgImFicyIuCi0KLVN1biBEZWMgMjkgMTA6NTg6MjIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgdGljODAtZGlzLm8gYW5kIHRpYzgwLW9wYy5vLgotCSogZGlzYXNzZW1ibGUuYyAoQVJDSF90aWM4MCk6IERlZmluZSBpZiBBUkNIX2FsbCBpcyBkZWZpbmVkLgotCShkaXNhc3NlbWJsZXIpOiBBZGQgYmZkX2FyY2hfdGljODAgc3VwcG9ydCB0byBzZXQgZGlzYXNzZW1ibGUKLSAJdG8gcHJpbnRfaW5zbl90aWM4MC4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogQWRkIHN0dWIuCi0KLUZyaSBEZWMgMjcgMjI6MzA6NTcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJjaCBpbiAkc2VsYXJjaHMpOiBBZGQgYmZkX3RpYzgwX2FyY2ggZW50cnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQkqIHRpYzgwLWRpcy5jOiBBZGQgZmlsZS4KLQkqIHRpYzgwLW9wYy5jOiBBZGQgZmlsZS4KLQotRnJpIERlYyAyMCAxNDozMDoxOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogIEFkZCBjclswLTE1XSwgZHBjLCBkcHN3LCBsaW5rLgotCi1Nb24gRGVjIDE2IDEzOjAwOjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGVyYW5kcyk6IEFkZCBTSU1NMTZOLgotCShtbjEwMjAwX29wY29kZXMpOiBVc2UgaXQgZm9yIHNvbWUgbG9naWNhbHMgYW5kIGJ0c3QgaW5zbnMuCi0JQWRkICJicmVhayIgYW5kICJ0cmFwIiBpbnN0cnVjdGlvbnMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEFkZCAiYnJlYWsiIGluc3RydWN0aW9uLgotCi0JKiBtbjEwMjAwLW9wYy5jOiBBZGQgcHNldWRvLW9wcyBmb3IgIm1vdiAoYW4pLGFtIiBhbmQgIm1vdiBhbiwoYW0pIi4KLQotU2F0IERlYyAxNCAyMjozNjoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IFRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBQQwotCXJlbGF0aXZlIGxvYWQgb3IgYWRkIG5vdyBkZXBlbmRzIHVwb24gd2hldGhlciB0aGUgaW5zdHJ1Y3Rpb24gaXMKLQlpbiBhIGRlbGF5IHNsb3QuCi0KLVdlZCBEZWMgMTEgMDk6MjM6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLWRpcy5jOiBGaW5pc2ggd3JpdGluZyBkaXNhc3NlbWJsZXIuCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wY29kZXMpOiBGaXggbWFzayBmb3IgIm1vdiBpbW04LGRuIi4KLQlGaXggbWFzayBmb3IgImptcCAoYW4pIi4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUsIHByaW50X2luc25fbW4xMDMwMCk6IENvcnJlbnRseQotCWhhbmRsZSBlbmRpYW5uZXNzIGlzc3VlcyBmb3IgbW4xMDMwMC4KLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGNvZGVzKTogRml4IG9wZXJhbmRzIGZvciAibW92YiBkbSwoYW4pIi4KLQotVHVlIERlYyAxMCAxMjowODowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3Bjb2Rlcyk6ICJtb3YgaW1tOCxkMCIgaXMgYSBmb3JtYXQgMgotCWluc3RydWN0aW9uLiAgRml4IG9wY29kZSBmaWVsZCBmb3IgIm1vdmIgKGltbTI0KSxkbiIuCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3BlcmFuZHMpOiBGaXggaW5zZXJ0aW9uIHBvc2l0aW9uCi0JZm9yIERJIG9wZXJhbmQuCi0KLU1vbiBEZWMgIDkgMTY6NDI6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jOiBDcmVhdGUgbW4xMDIwMCBvcGNvZGUgdGFibGUuCi0JKiBtbjEwMjAwLWRpcy5jOiBGbGVzaCBvdXQgbW4xMDIwMCBkaXNhc3NlbWJsZXIuICBOb3QgcmVhZHksCi0JYnV0IG1vdmluZyBhbG9uZyBuaWNlbHkuCi0KLVN1biBEZWMgIDggMDQ6Mjg6MzEgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogIEFkZCBtaXBzMTYtb3BjLm8uCi0KLUZyaSBEZWMgIDYgMTY6NDc6NDAgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJoaW5vLmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFJldmVydCBjaGFuZ2UgdG8gdXNlIDwgYW5kID4KLQlzcGVjaWZpZXJzIGZvciBmbW92ZW0qIGluc3RydWN0aW9ucy4KLQotRnJpIERlYyAgNiAxNDo0ODowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUmVtb3ZlICckJyByZWdpc3RlciBwcmVmaXhpbmcuCi0KLUZyaSBEZWMgIDYgMTc6MzQ6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzMTYtb3BjLmM6IENoYW5nZSBvcGNvZGUgZm9yIGVudHJ5L2V4aXQgdG8gYXZvaWQgY29uZmxpY3RpbmcKLQl3aXRoIGRzcmwuCi0KLUZyaSBEZWMgIDYgMTQ6NDg6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jOiBBZGQgc29tZSBjb21tZW50cyBleHBsYWluaW5nIHRoZSB2YXJpb3VzCi0gCW9wZXJhbmRzIGFuZCBzdWNoLgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEZpeCBtaW5vciBnY2MgLVdhbGwgd2FybmluZ3MuCi0KLVRodSBEZWMgIDUgMTI6MDk6NDggMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgPCBhbmQgPiBvcGVyYW5kCi0Jc3BlY2lmaWVycy4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogU2ltcGxpZnkgdGFibGUgYnkgdXNpbmcgPCBhbmQgPgotCW9wZXJhbmQgc3BlY2lmaWVycyBpbiBmbW92bSogaW5zdHJ1Y3Rpb25zLgotCi1XZWQgRGVjICA0IDE0OjUyOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChpbnNlcnRfbGkpOiBHaXZlIGFuIGVycm9yIGlmIHRoZSBvZmZzZXQgaGFzIHRoZSB0d28KLQlsZWFzdCBzaWduaWZpY2FudCBiaXRzIHNldC4KLQotV2VkIE5vdiAyNyAxMzowOTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbWlwczE2KTogU2VwYXJhdGUgdGhlIGluc3RydWN0aW9uIGZyb20KLQl0aGUgYXJndW1lbnRzIHdpdGggYSB0YWIsIG5vdCBhIHNwYWNlLgotCi1UdWUgTm92IDI2IDEzOjI0OjE3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNlbWJsZSk6IEZpbmlzaCBjb252ZXJzaW9uIHRvICckJyBhcwotCXJlZ2lzdGVyIHByZWZpeC4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IG1hc2sgZmllbGQgZm9yCi0JbW92IGFtLChpbW0zMixzcCkuCi0KLVR1ZSBOb3YgMjYgMTA6NTM6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi0JQWRkIHN1cHBvcnQgZm9yIG1pcHMxNiAoMTYgYml0IE1JUFMgaW1wbGVtZW50YXRpb24pOgotCSogbWlwczE2LW9wYy5jOiBOZXcgZmlsZS4KLQkqIG1pcHMtZGlzLmM6IEluY2x1ZGUgImVsZi1iZmQuaCIgYW5kICJlbGYvbWlwcy5oIi4KLQkobWlwczE2X3JlZ19uYW1lcyk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKHByaW50X2luc25fYmlnX21pcHMpOiBVc2UgcHJpbnRfaW5zbl9taXBzMTYgaW4gMTYgYml0IG1vZGUgb3IKLQlhZnRlciBzZWVpbmcgYSAxNiBiaXQgc3ltYm9sLgotCShwcmludF9pbnNuX2xpdHRsZV9taXBzKTogTGlrZXdpc2UuCi0JKHByaW50X2luc25fbWlwczE2KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfbWlwczE2X2luc25fYXJnKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIG1pcHMtb3BjLmM6IEFkZCBqYWx4IGluc3RydWN0aW9uLgotCSogTWFrZWZpbGUuaW4gKG1pcHMxNi1vcGMubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaXBzMTYtb3BjLm8gZm9yIGJmZF9taXBzX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBOb3YgMjUgMTY6MTU6MTcgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFNpbXBsaWZ5IHRhYmxlIGJ5IHVzaW5nIDwgYW5kID4KLSAJb3BlcmFuZCBzcGVjaWZpZXJzIGluICpzYXZlLCAqcmVzdG9yZSBhbmQgbW92ZW0qIGluc3RydWN0aW9ucy4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRml4IG1vdmUgYW5kIG1vdmVtIGluc3RydWN0aW9ucyBmb3IKLSAJdGhlIGNvbGRmaXJlLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBUaGUgY29sZGZpcmUgKG1jZjUyMDApIGNhbiBvbmx5IHVzZQotIAlyZWdpc3RlciBvcGVyYW5kcyBmb3IgaW1tZWRpYXRlIGFyaXRobWV0aWMsIG5vdCwgbmVnLCBuZWd4LCBhbmQKLQlzZXQgYWNjb3JkaW5nIHRvIGNvbmRpdGlvbiBpbnN0cnVjdGlvbnMuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IENvbnNpc3RhbnRseSBVc2UgInMiIGFzIHRoZSBzdG9yYWdlCi0gCXNwZWNpZmllciBvZiB0aGUgZWZmZWN0aXZlLWFkZHJlc3Mgb3BlcmFuZCBpbiBpbW1lZGlhdGUgZm9ybXMgb2YKLSAJYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMuICBUaGUgc3BlY2lmaWVyIGZvciB0aGUgaW1tZWRpYXRlIG9wZXJhbmQKLSAJbm90ZXMgaG93IGFuZCB3aGVyZSB0aGUgY29uc3RhbnQgd2lsbCBiZSBzdG9yZWQuCi0KLU1vbiBOb3YgMjUgMTE6MTc6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBSZW1vdmUgcmVkdW5kYW50ICJsY2MiCi0Jb3Bjb2RlLgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFVzZSAnJCcgaW5zdGVhZCBvZiAnJScgZm9yCi0JcmVnaXN0ZXIgcHJlZml4LgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFByZWZpeCByZWdpc3RlcnMgd2l0aCAnJScuCi0KLVdlZCBOb3YgMjAgMTA6Mzc6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEhhbmRsZSByZWdpc3RlciBsaXN0cy4KLQotCSogbW4xMDMwMC1vcGMuYzogRml4IGhhbmRsaW5nIG9mIHJlZ2lzdGVyIGxpc3Qgb3BlcmFuZCBmb3IKLQkiY2FsbCIsICJyZXQiLCBhbmQgInJldHMiIGluc3RydWN0aW9ucy4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBQcmludCBQQy1yZWxhdGl2ZSBhbmQgbWVtb3J5Ci0JYWRkcmVzc2VzIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4KLQkqIG1uMTAzMDAtb3BjLmM6IERpc3Rpbmd1aXNoIGJldHdlZW4gYWJzb2x1dGUgbWVtb3J5IGFkZHJlc3NlcywKLQlwYy1yZWxhdGl2ZSBvZmZzZXRzICYgcmFuZG9tIGltbWVkaWF0ZXMuCi0KLQkqIG1uMTAzMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDMwMCk6IEZpeCBmZXRjaCBvZiBsYXN0IGJ5dGUKLQlpbiA3IGJ5dGUgaW5zbnMuCi0JKGRpc2Fzc2VtYmxlKTogSGFuZGxlIFNQTElUIGFuZCBFWFRFTkRFRCBvcGVyYW5kcy4KLQotVHVlIE5vdiAxOSAxMzozMzowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmM6IFJvdWdoIGN1dCBhdCBwcmludGluZyBzb21lIG9wZXJhbmRzLgotCi0JKiBtbjEwMzAwLWRpcy5jOiBTdGFydCB3b3JraW5nIG9uIGRpc2Fzc2VtYmxlciBzdXBwb3J0LgotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IG1hc2tzIG9uIHNldmVyYWwgaW5zbnMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBBZGQgIlJFR1MiIGZvciBhIHJlZ2lzdGVyCi0JbGlzdC4KLQkobW4xMDMwMF9vcGNvZGVzKTogVXNlIFJFR1MgZm9yIHJlZ2lzdGVyIGxpc3QgaW4gIm1vdm0iIGluc3RydWN0aW9ucy4KLQotTW9uIE5vdiAxOCAxNToyMDozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IEFkZDMgc2V0cyB0aGUgY2FycnkuCi0KLUZyaSBOb3YgMTUgMTM6NDM6MTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBEZW1hbmQgcGFyZW5zIGFyb3VuZAotCXJlZ2lzdGVyIGFyZ3VtZW50IGlzIGNhbGxzIGFuZCBqbXAgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTm92ICA3IDAwOjI2OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogVXNlIEROMDEgZm9yIHB1dHggYW5kCi0JZ2V0eCBvcGVyYW5kLiAgRml4IG9wY29kZSBmb3IgbXVscXUgaW1tLGRuLgotCi1XZWQgTm92ICA2IDEzOjQyOjMyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEhpamFjayAiYml0cyIgZmllbGQKLQlpbiBNTjEwMzAwX09QRVJBTkRfU1BMSVQgb3BlcmFuZHMgZm9yIGhvdyBtYW55IGJpdHMKLQlhcHBlYXIgaW4gdGhlIGJhc2ljIGluc24gd29yZC4gIEFkZCBJTU0zMl9ISUdIMjQsCi0JSU1NMzJfSElHSDI0X0xPV1NISUZUOCwgSU1NOEVfU0hJRlQ4LgotCShtbjEwMzAwX29wY29kZXMpOiBVc2UgbmV3IG9wZXJhbmRzIGFzIG5lZWRlZC4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCBJTU0zMl9MT1dTSElGVDgKLQlmb3IgYnNldCwgYmNsciwgYnRzdCBpbnN0cnVjdGlvbnMuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBuZXcgSU1NMzJfTE9XU0hJRlQ4IGFzIG5lZWRlZC4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IFJlbW92ZSBtYW55IHJlZHVuZGFudAotCW9wZXJhbmRzLiAgVXBkYXRlIG9wY29kZSB0YWJsZSBhcyBhcHByb3ByaWF0ZS4KLQkoSU1NMzIpOiBBZGQgTU4xMDMwMF9PUEVSQU5EX1NQTElUIGZsYWcuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCBzaW5nbGUgYml0IGVycm9yIGluIG1vdiBpbW0zMixkbiBpbnNuLgotCi1UdWUgTm92ICA1IDEzOjI2OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCBETjIsIERNMiwgQU4yLCBBTTIKLQlvcGVyYW5kcyAoZm9yIGluZGV4ZWQgbG9hZC9zdG9yZXMpLiAgRml4IGJpdHBvcyBmb3IgREkKLQlvcGVyYW5kLiAgQWRkIFNOOE5fU0hJRlQ4LCBJTU04X1NISUZUOCwgYW5kIEQxNl9TSElGVCBmb3IgdGhlCi0JZmV3IGluc3RydWN0aW9ucyB0aGF0IGluc2VydCBpbW1lZGlhdGVzL2Rpc3BsYWNlbWVudHMgaW4gdGhlCi0JbWlkZGxlIG9mIHRoZSBpbnN0cnVjdGlvbi4gIEFkZCBJTU04RSBmb3IgOCBiaXQgaW1tZWRpYXRlIGluCi0JdGhlIGV4dGVuZGVkIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uCi0JKG1uMTAzMDBfb3BlcmFuZHMpOiBVc2UgbmV3IG9wY29kZXMgYXMgYXBwcm9wcmlhdGUuCi0KLVR1ZSBOb3YgIDUgMTA6MzA6NTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IERlY2xhcmUgdGhlIHRyYXAgaW5zdHJ1Y3Rpb24KLSAJc2VxdWVudGlhbCBzbyB0aGUgYXNzZW1ibGVyIG5ldmVyIHBhcmFsbGVsaXplcyBpdCB3aXRoCi0Jb3RoZXIgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gTm92ICA0IDEyOjUwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCBETjAxIGFuZCBBTjAxIGZvcgotCWEgZGF0YS9hZGRyZXNzIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiByZWdpc3RlciBmaWVsZCAwCi0JYW5kIHJlZ2lzdGVyIGZpZWxkIDEuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBETjAxIGFuZCBBTjAxIGZvciBtb3YvY21wIGltbTgsRE4vQU4KLQotRnJpIE5vdiAgMSAxMDoyOToxMSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBVc2UgbmV3IE5PUEFMIG1hc2sgZm9yCi0Jc3RhbmRhcmQgZGlzYXNzZW1ibHkuCi0KLQkqIGFscGhhLW9wYy5jIChhbHBoYV9vcGVyYW5kcyk6IFJlYXJyYW5nZSBmbGFncyBzbG90LgotCShhbHBoYV9vcGNvZGVzKTogQWRkIG5ldyBCV1gsIENJWCwgYW5kIE1BWCBpbnN0cnVjdGlvbnMuCi0JUmVjYXRlZ29yaXplIFBBTGNvZGUgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgT2N0IDMwIDE2OjQ2OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkIHJlbGF4aW5nICJqYnIiLgotCi1UdWUgT2N0IDI5IDE2OjMwOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IERvbid0IHByaW50IGEgdHJhaWxpbmcgdGFiIGlmCi0JdGhlcmUgYXJlIG5vIG9wZXJhbmQgdHlwZXMuCi0KLVR1ZSBPY3QgMjkgMTI6MjI6MjEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jIChEOV9SRUxBWCk6IFJlbmFtZWQgZnJvbSBEOSwgYWxsIHJlZmVyZW5jZXMKLQljaGFuZ2VkLgotCSh2ODUwX29wZXJhbmRzKTogTWFrZSBzdXJlIEQyMiBpbW1lZGlhdGVseSBmb2xsb3dzIEQ5X1JFTEFYLgotCi1GcmkgT2N0IDI1IDEyOjEyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl94ODYpOiBTZXQgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgdG8gNS4KLQotVGh1IE9jdCAyNCAxNzo1Mzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kOF82KTogRml4IG9wZXJhbmQgaW5zZXJ0aW9uIGZvciBzbGQudwotCWFuZCBzc3QudyBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCAiakNDIiBpbnN0cnVjdGlvbnMgKGFsaWFzZXMgZm9yCi0JImJDQyJpbnN0cnVjdGlvbnMpLgotCi1UaHUgT2N0IDI0IDE3OjIxOjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFVzZSBhIHRhYiBiZXR3ZWVuIHRoZSBpbnN0cnVjdGlvbgotCWFuZCB0aGUgYXJndW1lbnRzLgotCi1UdWUgT2N0IDIyIDIzOjMyOjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChQUENQV1IyKTogRGVmaW5lLgotCShwb3dlcnBjX29wY29kZXMpOiBVc2UgUFBDUFdSMiBmb3IgZnNxcnQsIHJhdGhlciB0aGFuIGR1cGxpY2F0aW5nCi0JaXQuCi0KLUZyaSBPY3QgMTEgMTY6MDM6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggdHlwbyBpbiBvcGNvZGUKLQlmaWVsZCBmb3IgbW92aHUgaW5zdHJ1Y3Rpb24uCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogRm9yIFY4NTBfT1BFUkFORF9TSUdORUQgb3BlcmFuZHMsCi0JY2FzdCB2YWx1ZSB0byAibG9uZyIgbm90ICJzaWduZWQgbG9uZyIgdG8ga2VlcCBocHV4MTAKLQljb21waWxlciBxdWlldC4KLQotVGh1IE9jdCAxMCAxMDoyNTo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCB0eXBvIGluIG9wY29kZSBmaWVsZAotCWZvciBtb3YgKGFiczE2KSxETi4KLQotCSogbW4xMDMwMC1vcGMuYyAoRk1UKik6IFJlbW92ZSBkZWZpbml0aW9ucy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0JZm9yIHNoaWZ0LWJ5LXJlZ2lzdGVyIG9wY29kZXMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBCcmVhayBETiwgRE0sIEFOLCBBTQotCWludG8gW0FEXVtNTl1bMDFdIGZvciBlbmNvZGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHJlZ2lzdGVyCi0JaW4gdGhlIG9wY29kZS4KLQotV2VkIE9jdCAgOSAxMToxOToyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEFkZCAiZXh0ZW5kZWQiIGluc3RydWN0aW9ucywKLQkicHV0eCIsICJnZXR4IiwgIm11bHEiLCAibXVscXUiLCAic2F0MTYiLCAic2F0MjQiLCAiYnNjaCIuCi0KLVR1ZSBPY3QgIDggMTE6NTU6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogUmVtb3ZlICJSRUdTIiBvcGVyYW5kLgotCUZpeCB2YXJpb3VzIHR5cG9zLiAgQWRkICJQQVJFTiIgb3BlcmFuZC4KLQkoTUVNLCBNRU0yKTogRGVmaW5lLgotCShtbjEwMzAwX29wY29kZXMpOiBTdXJyb3VuZCBhbGwgbWVtb3J5IGFkZHJlc3NlcyB3aXRoICJQQVJFTiIKLQlvcGVyYW5kcy4gIEZpeCBzZXZlcmFsIHR5cG9zLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggdHlwb3MgaW4geWVzdGVyZGF5J3MKLQljaGFuZ2VzLgotCi1Nb24gT2N0ICA3IDE2OjQ4OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAoRk1UX1hYKTogUmVudW1iZXIgc3RhcnRpbmcgYXQgb25lLgotCShtbjEwMzAwX29wZXJhbmRzKTogUm91Z2ggY3V0LiAgRW5vdWdoIHRvIHBhcnNlICJtb3YiIGluc3RydWN0aW9ucwotCWF0IHRoaXMgdGltZS4KLQkobW4xMDMwMF9vcGNvZGVzKTogQnJlYWsgb3Bjb2RlIGZvcm1hdCBvdXQgaW50byBpdHMgb3duIGZpZWxkLgotCVVwZGF0ZSBtYW55IG9wZXJhbmQgZmllbGRzIHRvIGRlYWwgd2l0aCBzaWduZWQgdnMgdW5zaWduZWQKLQlpc3N1ZXMuICBGaXggb25lIG9yIHR3byB0eXBvcyBpbiB0aGUgIm1vdiIgaW5zdHJ1Y3Rpb24KLQlvcGNvZGUsIG1hc2sgYW5kL29yIG9wZXJhbmQgZmllbGRzLgotCi1Nb24gT2N0ICA3IDExOjM5OjQ5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChwbHVzaGEpOiBQcmVmZXIgZW5jb2RpbmcgZm9yIG02ODA0MHVwLCBpbiBjYXNlCi0JbTY4ODUxIHdhc24ndCByZXNldC4KLQotVGh1IE9jdCAgMyAxNzoxNzowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEFkZCBvcGNvZGUgJiBtYXNrcyBmb3IKLQlhbGwgb3Bjb2Rlcy4gIFZlcnkgcm91Z2ggY3V0IGF0IG9wZXJhbmRzIGZvciBhbGwgb3Bjb2Rlcy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogU3RhcnQgZmxlc2hpbmcgb3V0IHRoZQotCW9wY29kZSB0YWJsZS4KLQotVGh1IE9jdCAgMyAxMDowNjowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMsIG1uMTAzMDAtb3BjLmM6IE5ldyBmaWxlcy4KLQkqIG1uMTAyMDAtZGlzLmMsIG1uMTAzMDAtZGlzLmM6IE5ldyBmaWxlcy4KLQkqIG1uMTB4MDAtb3BjLmMsIG1uMTB4MDAtZGlzLmM6IERlbGV0ZWQuCi0JKiBkaXNhc3NlbWJsZS5jOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byAxMDIwMCBhbmQgMTAzMDAKLQlzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVGh1IE9jdCAgMyAxNTo1OToxMiAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoTU9TVExZQ0xFQU4pOiBNb3ZlIGNvbmZpZy5sb2cgdG8gZGlzdGNsZWFuLgotCi1XZWQgT2N0ICAyIDIzOjI4OjQyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMHgwMC1vcGMuYywgbW4xMHgwMC1kaXMuYzogTmV3IGZpbGVzIGZvciBNYXRzdXNoaXRhCi0JTU4xMHgwMCBwcm9jZXNzb3JzLgotCSogZGlzYXNzZW1ibGUgKEFSQ0hfbW4xMHgwMCk6IERlZmluZS4KLQkoZGlzYXNzZW1ibGVyKTogSGFuZGxlIGJmZF9hcmNoX21uMTB4MDAuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBiZmRfbW4xMHgwMF9hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1UdWUgT2N0ICAxIDEwOjQ5OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAob3BfcnRuKTogQ2hhbmdlIHRvIGJlIGEgcG9pbnRlci4gIEFkanVzdCB1c2VzCi0JYWNjb3JkaW5nbHkuICBEb24ndCBkZWNsYXJlIGZ1bmN0aW9ucyB1c2luZyBvcF9ydG4uCi0KLUZyaSBTZXAgMjcgMTg6Mjg6NTkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiAgQWRkIG1lbWFkZHIgYXJndW1lbnQuICBSZS1hcnJhbmdlCi0JcGFyYW1zIHRvIGJlIG1vcmUgc3RhbmRhcmQuCi0JKiAoZGlzYXNzZW1ibGUpOiAgUHJpbnQgYWJzb2x1dGUgYWRkcmVzc2VzIGFuZCBzeW1ib2xpYyBuYW1lcyBmb3IKLQlicmFuY2ggYW5kIGp1bXAgdGFyZ2V0cy4KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZCk6ICBBZGQgZGlzcGxhY2VtZW50IGZsYWcgdG8gOSBhbmQgMjIKLQliaXQgb3BlcmFuZHMuCi0JKiAodjg1MF9vcGNvZGVzKTogIEFkZCBicmVha3BvaW50IGluc24uCi0KLU1vbiBTZXAgMjMgMTI6MzI6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBNb3ZlIHRoZSBmbW92ZW14IGRhdGEgcmVnaXN0ZXIgY2FzZXMgYmVmb3JlIHRoZQotIAlvdGhlciBjYXNlcywgc28gdGhhdCB0aGV5IGdldCByZWNvZ25pemVkIGJlZm9yZSB0aGUgZGF0YSByZWdpc3RlcgotIAlkb2VzIGdldHMgdHJlYXRlZCBhcyBhIGRlZ2VuZXJhdGUgcmVnaXN0ZXIgbGlzdC4KLQotVHVlIFNlcCAxNyAxMjowNjo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBhIGNhc2UgZm9yICJkaXYiIGFuZCAiZGl2dSIgd2l0aCB0d28gcmVnaXN0ZXJzCi0JYW5kIGEgZGVzdGluYXRpb24gb2YgJDAuCi0KLVR1ZSBTZXAgMTAgMTY6MTI6MzkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEFkZCBwcm90b3R5cGUuCi0JKF9wcmludF9pbnNuX21pcHMpOiBEaXR0by4KLQotTW9uIFNlcCAgOSAxNDoyNjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogUHJpbnQgY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXJzIGFzCi0gCSRmY2NOLgotCi1UdWUgU2VwICAzIDEyOjA5OjQ2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogQWRkIHNldHV3LCBzZXRzdywgc2V0eC4KLQotVHVlIFNlcCAgMyAxMjowNToyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTWFrZSBzdGF0aWMuICBQcm92aWRlIHByb3RvdHlwZS4KLQotU3VuIFNlcCAgMSAyMjozMDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kOSwgaW5zZXJ0X2QyMik6IEZpeCBib3VuZGFyeSBjYXNlCi0JaW4gcmFuZ2UgY2hlY2tzLgotCi1TYXQgQXVnIDMxIDAxOjI3OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBIYW5kbGUgaW5zZXJ0aW9uIG9mICcsJywgJ1snIGFuZAotCSddJyBjaGFyYWN0ZXJzIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXM6IFJlbW92ZSBzaXplIGZpZWxkIGZyb20gYWxsIG9wY29kZXMuCi0JQWRkICJtZW1vcCIgZmllbGQgdG8gYWxsIG9wY29kZXMgKGZvciB0aGUgZGlzYXNzZW1ibGVyKS4KLQlSZW9yZGVyIG9wY29kZXMgc28gdGhhdCAibm9wIiBjb21lcyBiZWZvcmUgIm1vdiIgYW5kICJqciIKLQljb21lcyBiZWZvcmUgImphcmwiLgotCi0JKiB2ODUwLWRpcy5jIChwcmludF9pbnNuX3Y4NTApOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KLQotCSogdjg1MC1kaXMuYyAocHJpbnRfaW5zbl92ODUwKTogUHJvcGVybHkgaGFuZGxlIGRpc2Fzc2VtYmxpbmcKLQlhIHR3byBieXRlIGluc24gYXQgdGhlIGVuZCBvZiBhIG1lbW9yeSByZWdpb24gd2hlbiB0aGUgbWVtb3J5Ci0JcmVnaW9uJ3Mgc2l6ZSBpcyBvbmx5IHR3byBieXRlIGFsaWduZWQuCi0KLQkqIHY4NTAtZGlzLmMgKHY4NTBfY2NfbmFtZXMpOiBGaXggc3R1cGlkIHRoaW5rb3MuCi0KLQkqIHY4NTAtZGlzLmMgKHY4NTBfcmVnX25hbWVzKTogRGVmaW5lLgotCSh2ODUwX3NyZWdfbmFtZXMsIHY4NTBfY2NfbmFtZXMpOiBMaWtld2lzZS4KLQkoZGlzYXNzZW1ibGUpOiBWZXJ5IHJvdWdoIGN1dCBhdCBwcmludGluZyBvcGVyYW5kcyAodW5mb3JtYXR0ZWQpLgotCi0JKiB2ODUwLW9wYy5jIChCT1BfTUFTSyk6IEZpeC4KLQkodjg1MF9vcGNvZGVzKTogRml4IG1hc2sgZm9yIGphcmwgYW5kIGpyLgotCi0JKiB2ODUwLWRpcy5jOiBOZXcgZmlsZS4gIFNrZWxldG9uIGZvciBkaXNhc3NlbWJsZXIgc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluIFJlbW92ZSB2ODUwIHJlZmVyZW5jZXMsIHRoZXkncmUgbm90IG5lZWRlZCBoZXJlLgotCSogY29uZmlndXJlLmluOiBBZGQgdjg1MC1kaXMubyB3aGVuIGJ1aWxkaW5nIHY4NTAgdG9vbGNoYWlucy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IENhbGwgdjg1MCBkaXNhc3NlbWJsZXIuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kOF83LCBleHRyYWN0X2Q4XzcpOiBOZXcgZnVuY3Rpb25zLgotCShpbnNlcnRfZDhfNiwgZXh0cmFjdF9kOF82KTogTmV3IGZ1bmN0aW9ucy4KLQkodjg1MF9vcGVyYW5kcyk6IFJlbmFtZSBEN1MgdG8gRDc7IG9wZXJhbmQgZm9yIEQ3IGlzIHVuc2lnbmVkLgotCVJlbmFtZSBEOCB0byBEOF83LCB1c2Uge2luc2VydCxleHRyYWN0fV9kOF83IHJvdXRpbmVzLgotCUFkZCBEOF82LgotCShJRjRBLCBJRjRCKTogVXNlICJENyIgaW5zdGVhZCBvZiAiRDdTIi4KLQkoSUY0QywgSUY0RCk6IFVzZSAiRDhfNyIgaW5zdGVhZCBvZiAiRDgiLgotCShJRjRFLCBJRjRGKTogTmV3LiAgVXNlICJEOF82Ii4KLQkodjg1MF9vcGNvZGVzKTogVXNlIElGNEEvSUY0QiBmb3Igc2xkLmIvc3N0LmIuICBVc2UgSUY0Qy9JRjREIGZvcgotCXNsZC5oL3NzdC5oLiAgVXNlIElGNEUvSUY0RiBmb3Igc2xkLncvc3N0LncuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kMTZfMTUsIGV4dHJhY3RfZDE2XzE1KTogTmV3IGZ1bmN0aW9ucy4KLQkodjg1MF9vcGVyYW5kcyk6IENoYW5nZSBEMTYgdG8gRDE2XzE1LCB1c2Ugc3BlY2lhbCBpbnNlcnQvZXh0cmFjdAotCXJvdXRpbmVzLiAgTmV3IG5ldyBEMTYgdGhhdCB1c2VzIHRoZSBnZW5lcmljIGluc2VydC9leHRyYWN0IGNvZGUuCi0JKElGN0EsIElGN0IpOiBVc2UgRDE2XzE1LgotCShJRjdDLCBJRjdEKTogTmV3LiAgVXNlIEQxNi4KLQkodjg1MF9vcGNvZGVzKTogVXNlIElGN0MgYW5kIElGN0QgZm9yIGxkLmIgYW5kIHN0LmIuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kOSwgaW5zZXJ0X2QyMik6IFNsaWdodGx5IGltcHJvdmUgZXJyb3IKLQltZXNzYWdlLiAgSXNzdWUgYW4gZXJyb3IgaWYgdGhlIGJyYW5jaCBvZmZzZXQgaXMgb2RkLgotCi0JKiB2ODUwLW9wYy5jOiBBZGQgbm90ZXMgYWJvdXQgbmVlZGluZyBzcGVjaWFsIGluc2VydC9leHRyYWN0Ci0JZm9yIGFsbCB0aGUgbG9hZC9zdG9yZSBpbnNucywgZXhjZXB0ICJsZC5iIiBhbmQgInN0LmIiLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDIyLCBleHRyYWN0X2QyMik6IE5ldyBmdW5jdGlvbnMuCi0JKHY4NTBfb3BlcmFuZHMpOiBVc2UgaW5zZXJ0X2QyMiBhbmQgZXh0cmFjdF9kMjIgZm9yCi0JRDIyIG9wZXJhbmRzLgotCShpbnNlcnRfZDkpOiBGaXggcmFuZ2UgY2hlY2suCi0KLUZyaSBBdWcgMzAgMTg6MDE6MDIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgVjg1MF9PUEVSQU5EX1NJR05FRCBmbGFnCi0JYW5kIHNldCBiaXRzIGZpZWxkIHRvIEQ5IGFuZCBEMjIgb3BlcmFuZHMuCi0KLVRodSBBdWcgMjkgMTE6MTA6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogRGVmaW5lIFNSMiBvcGVyYW5kLgotCSh2ODUwX29wY29kZXMpOiAibGRzciIgdXNlcyBSMSxTUjIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpeCBvcGNvZGUgc3BlY3MgZm9yCi0Jc2xkLncsIHNzdC5iLCBzc3QuaCwgc3N0LncsIGFuZCBub3AuCi0KLVdlZCBBdWcgMjggMTU6NTU6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgbnVsbCBvcGNvZGUgdG8gbWFyayB0aGUKLQllbmQgb2YgdGhlIG9wY29kZSB0YWJsZS4KLQotTW9uIEF1ZyAyNiAxMzozNTo1MyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkZWQgcmVnaXN0ZXIgcGFpcnMsCi0JInIwLXIxIiwgInIyLXIzIiwgZXRjLgotCi1GcmkgQXVnIDIzIDAwOjI3OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IE1ha2UgSTE2IGJlIGEgc2lnbmVkIG9wZXJhbmQuCi0JQ3JlYXRlIEkxNlUgZm9yIGFuIHVuc2lnbmVkIDE2Yml0IG1tZWRpYXRlIG9wZXJhbmQuCi0JKHY4NTBfb3Bjb2Rlcyk6IFVzZSBJMTZVIGZvciAib3JpIiwgImFuZGkiIGFuZCAieG9yaSIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBEZWZpbmUgRVAgb3BlcmFuZC4KLQkoSUY0QSwgSUY0QiwgSUY0QywgSUY0RCk6IFVzZSBFUC4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IG9wY29kZSBudW1iZXJzIGZvciAibW92IgotCXdpdGggaW1tZWRpYXRlIG9wZXJhbmQsICJtb3ZoaSIuICBUd2VhayAibGRzciIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEdldCBsZC5bYmh3XSBhbmQgc3QuW2Jod10KLQljb3JyZWN0LiAgR2V0IHNsZC5bYmh3XSBhbmQgc3N0LltiaHddIGNsb3Nlci4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6ICJub3QiIGlzIGEgdHdvIGJ5dGUgaW5zbgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBDb3JyZWN0IGJpdCBwYXR0ZXJuIGZvciBzZXRmLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogRDE2IGluc2VydHMgYXQgb2Zmc2V0IDE2IQotCi0JKiB2ODUwLW9wYy5jICh0d28pOiBHZXQgb3JkZXIgb2Ygd29yZHMgY29ycmVjdC4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEkxNiBpbnNlcnRzIGF0IG9mZnNldCAxNiEKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCAiU1IxIiBhbmQgIlNSMiIgZm9yIHN5c3RlbQotCXJlZ2lzdGVyIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gb3BlcmFuZHMuCi0JKHY4NTBfb3Bjb2Rlcyk6IFVzZSBTUjEgYW5kIFNSMiBmb3IgImxkc3IiIGFuZCAic3RzciIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpeCB0aGlua28gaW4gImptcCIgb3Bjb2RlLiAgRml4Ci0Jc2FtZSB0aGlua28gaW4gInRyYXAiIG9wY29kZS4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkIGluaXRpYWxpemVyIGZvciBzaXplIGZpZWxkCi0Jb24gYWxsIG9wY29kZXMuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBENiAtPiBEUzcuICBSZWZlcmVuY2VzIGNoYW5nZWQuCi0JQWRkIEQ4IGZvciA4LWJpdCB1bnNpZ25lZCBmaWVsZCBpbiBzaG9ydCBsb2FkL3N0b3JlIGluc25zLgotCShJRjRBLCBJRjREKTogVGhlc2UgYm90aCBuZWVkIHR3byByZWdpc3RlcnMuCi0JKElGNEMsIElGNEQpOiBEZWZpbmUuICBVc2UgOC1iaXQgdW5zaWduZWQgZmllbGQuCi0JKHY4NTBfb3Bjb2Rlcyk6IEZvciAic2xkLmgiLCAic2xkLnciLCAic3N0LmgiLCAic3N0LnciLCB1c2UKLQlJRjRDICYgSUY0RC4gIEZvciAidHJhcCIgdXNlIEk1VSwgbm90IEk1LiAgQWRkIElGMSBvcGVyYW5kCi0JZm9yICJsZHNyIiBhbmQgInN0c3IiLgotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IDMtYml0IGltbWVkaWF0ZSBmb3IgYml0IGluc25zCi0JaXMgdW5zaWduZWQuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IENvcnJlY3Qgc2hvcnQgc3RvcmUgaGFsZiAoc3N0LmgpIGFuZAotCXNob3J0IHN0b3JlIHdvcmQgKHNzdC53KS4KLQotVGh1IEF1ZyAyMiAxNjo1NzoyNyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGRlZCBpbnNlcnQgYW5kIGV4dHJhY3QgZmllbGRzLAotIAlwb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdW51c3VhbCBvcGVyYW5kIGVuY29kaW5ncy4KLQotVGh1IEF1ZyAyMiAwMTowNToyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEVuYWJsZSAidHJhcCIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpeCBvcmRlciBvZiBkaXNwbGFjZW1lbnQKLQlhbmQgcmVnaXN0ZXIgZm9yICJzZXQxIiwgImNscjEiLCAibm90MSIsIGFuZCAidHN0MSIuCi0KLVdlZCBBdWcgMjEgMTg6NDY6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkICJCMyIgc3VwcG9ydC4KLQkodjg1MF9vcGNvZGVzKTogRml4IGFuZCBlbmFibGUgInNldDEiLCAiY2xyMSIsICJub3QxIgotCWFuZCAidHN0MSIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6ICJqbXAiIGhhcyBvbmx5IGFuIFIxIG9wZXJhbmQuCi0KLQkqIHY4NTAtb3BjLmM6IENsb3NlIHVudGVybWluYXRlZCBjb21tZW50LgotCi1XZWQgQXVnIDIxIDE3OjMxOjI2IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkIGZsYWdzIGZpZWxkLgotIAkodjg1MF9vcGNvZGVzKTogYWRkIG1vdmUgb3Bjb2Rlcy4KLQotVHVlIEF1ZyAyMCAxNDo0MTowMyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB2ODUwLW9wYy5vLgotCSogY29uZmlndXJlOiAoYmZkX3Y4NTB2X2FyY2gpIEFkZCBuZXcgY2FzZS4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF92ODUwX2FyY2gpIEFkZCBuZXcgY2FzZS4KLQkqIHY4NTAtb3BjLmM6IE5ldyBmaWxlLgotCi1Nb24gQXVnIDE5IDE1OjIxOjM4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlIGxpdHRsZSBlbmRpYW4gc3BhcmNzLgotCi1UaHUgQXVnIDE1IDEzOjE0OjQzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jOiBBZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgb3Bjb2RlCi0JdGFibGUgdG8gaGVscCBkZXRlcm1pbmluZSB3aGljaCBpbnN0cnVjdGlvbnMgY2FuIGJlIGRvbmUKLQlpbiBwYXJhbGxlbC4KLQotVGh1IEF1ZyAxNSAxMzoxMToxMyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIGVkaXRpbmcgb2YgaW5jbHVkZSBwYXRobmFtZXMgdG8gYmUKLQltb3JlIGdlbmVyYWwuCi0KLVRodSBBdWcgMTUgMTY6Mjg6NDEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBhcm0tb3BjLmg6IEFkZGVkICJieCIgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbi4KLQotV2VkIEF1ZyAxNCAxNzowMDowNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEtb3BjLmMgKEVWNEVYVEhXSU5ERVgpOiBGaWVsZCB3aWR0aCBzaG91bGQgYmUgOCBub3QgNS4KLQotTW9uIEF1ZyAxMiAxNDozMDozNyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogTWlub3IgZml4ZXMgdG8gYWRkaSBhbmQgYmwubC4KLQotRnJpIEF1ZyAgOSAxMzoyMTo1OSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQ29ycmVjdCAnbXYnIHVuaXQgZW50cnkgdG8gRUlUSEVSLgotCi1UaHUgQXVnICA4IDEyOjQzOjUyIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBmb3IgYWxwaGEtb3BjIGNoYW5nZXMuCi0KLVdlZCBBdWcgIDcgMTE6NTU6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2kzODYpOiBBY3R1YWxseSByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUuCi0gCShPTkUsIE9QX09ORSk6ICNpZmRlZiBvdXQ7IG5vdCB1c2VkLgotCi1GcmkgQXVnICAyIDE3OjQ3OjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBBZGRlZCAyIGFjY3VtdWxhdG9yIHN1YiBpbnN0cnVjdGlvbnMuCi0JQ2hhbmdlZCBzdWJpIG9wZXJhbmQgdHlwZSB0byB0cmVhdCAwIGFzIDE2LgotCi1XZWQgSnVsIDMxIDE2OjIxOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQWRkIGNwdXNobCBmb3IgdGhlIG1jZjUyMDAuICBGcm9tIEtlbiBSb3NlCi0JPHJvc2VAbmV0Y29tLmNvbT4uCi0KLVdlZCBKdWwgMzEgMTQ6Mzk6MjcgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBhcm0tb3BjLmg6IChhcm1fb3Bjb2Rlcyk6IEFkZGVkIGhhbGZ3b3JkIGFuZCBzaWduLWV4dGVuc2lvbgotIAltZW1vcnkgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25zLiBBZGQgbmV3IGZvcm1hdCBzdHJpbmcgZW50cmllcyAlaCBhbmQgJXMuCi0JKiBhcm0tZGlzLmM6IChwcmludF9pbnNuX2FybSk6IFByb3ZpZGUgZGVjb2Rpbmcgb2YgdGhlIG5ldwotCWZvcm1hdHMgJWggYW5kICVzLgotCi1GcmkgSnVsIDI2IDExOjQ1OjA0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wZXJhbmRzKTogQWRkZWQgVU5VTTRTOyBhIDQtYml0IGFjY3VtdWxhdG9yIHNoaWZ0LgotIAkoZDEwdl9vcGNvZGVzKTogTW9kaWZpZWQgYWNjdW11bGF0b3Igc2hpZnQgaW5zdHJ1Y3Rpb25zIHRvIHVzZSBVTlVNNFMuCi0KLUZyaSBKdWwgMjYgMTQ6MDE6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYV9vc2YpOiBSZW1vdmUuCi0JKHByaW50X2luc25fYWxwaGFfdm1zKTogUmVtb3ZlLgotCShwcmludF9pbnNuX2FscGhhKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgQ2hvc2UgdGhlIHJlZ2lzdGVyCi0JbmFtZXMgYmFzZWQgb24gaW5mby0+Zmxhdm91ci4KLQkqIGRpc2Fzc2VtYmxlLmM6IEFsd2F5cyByZXR1cm4gcHJpbnRfaW5zbl9hbHBoYSBmb3IgdGhlIGFscGhhLgotCi1UaHUgSnVsIDI1IDE1OjI0OjE3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jIChkaXNfbG9uZyk6IEhhbmRsZSB1bmtub3duIG9wY29kZXMuCi0KLVRodSBKdWwgMjUgMTI6MDg6MDkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmM6IENoYW5nZXMgdG8gc3VwcG9ydCBzaWduZWQgYW5kIHVuc2lnbmVkIG51bWJlcnMuCi0JQWxsIGluc3RydWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgdGhhdCBoYXZlIGxvbmcgYW5kIHNob3J0IGZvcm1zCi0Jbm93IGVuZCBpbiAiLmwiIG9yICIucyIuICBEaXZzIGFkZGVkLgotCSogZDEwdi1kaXMuYzogQ2hhbmdlcyB0byBzdXBwb3J0IHNpZ25lZCBhbmQgdW5zaWduZWQgbnVtYmVycy4KLQotVHVlIEp1bCAyMyAxMTowMjo1MyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYzogQ2hhbmdlIGFsbCBmdW5jdGlvbnMgdG8gdXNlIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYy4KLQotTW9uIEp1bCAyMiAxNTozODo1MyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogTWFrZSBvcGNvZGUgbWFza3MgZm9yIHRoZSBDb2xkRmlyZQotIAltb3ZlIGNjci9zciBpbnNucyBtb3JlIHN0cmljdCBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgb25seQotIAlzZWxlY3RzIHRoZW0gd2hlbiB0aGUgYWRkcmVzc2luZyBtb2RlIGlzIGRhdGEgcmVnaXN0ZXIuCi0KLU1vbiBKdWwgMjIgMTE6MjU6MjQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0gICAgICAgICogZDEwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogIERlY2xhcmUuCi0gICAgICAgICogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IE5vdyB1c2VzIHByZV9kZWZpbmVkX3JlZ2lzdGVycwotICAgICAgICB0byBwaWNrIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSByZWdpc3RlcnMuCi0KLU1vbiBKdWwgMjIgMTM6NDc6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogRml4IG9wY29kZSB2YWx1ZXMgZm9yIGZwYWNrMTYsIGFuZCBmcGFja2ZpeC4gIEZpeAotCW9wZXJhbmRzIGZvciBmZXhwYW5kIGFuZCBmcG1lcmdlLiAgRnJvbSBDaHJpc3RpYW4gS3VlaG5rZQotCTxDaHJpc3RpYW4uS3VlaG5rZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZT4uCi0KLU1vbiBKdWwgMjIgMTM6MTc6MDYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogTm8gbG9uZ2VyIHRoZSB1c2VyLXZpc2libGUKLQlwcmludCByb3V0aW5lLiAgVGFrZSBuZXcgcmVnbmFtZXMgYW5kIGNwdW1hc2sgYXJndW1lbnRzLgotCUtpbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5vbnNlbnNlLgotCShwcmludF9pbnNuX2FscGhhX29zZik6IE5ldyBmdW5jdGlvbi4gIERvIE9TRi8xIHN0eWxlIHJlZ25hbWVzLgotCShwcmludF9pbnNuX2FscGhhX3Ztcyk6IE5ldyBmdW5jdGlvbi4gIERvIFZNUyBzdHlsZSByZWduYW1lcy4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IFRlc3QgYmZkIGZsYXZvdXIgdG8gcGljawotCWJldHdlZW4gT1NGIGFuZCBWTVMgcm91dGluZXMuICBEZWZhdWx0IHRvIE9TRi4KLQotVGh1IEp1bCAxOCAxNzoxOTozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19TVUJTVCAoSU5TVEFMTF9TSExJQikuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFVzZSBASU5TVEFMTF9TSExJQkAuCi0KLVdlZCBKdWwgMTcgMTQ6Mzk6MDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogKGJmZF9kMTB2X2FyY2gpIEFkZCBuZXcgY2FzZS4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF9kMTB2X2FyY2gpIEFkZCBuZXcgY2FzZS4KLQkqIGQxMHYtZGlzLmM6IE5ldyBmaWxlLgotCSogZDEwdi1vcGMuYzogTmV3IGZpbGUuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpIEFkZCBlbnRyeSBmb3IgZDEwdi4KLQotV2VkIEp1bCAxNyAxMDoxMjowNSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEZpeCBidWdzIGluIGNvbGRmaXJlIGluc25zIHJlbGF0aW5nCi0gCXRvIGJjYywgdHJhcGZsLCBzdWJ4bCwgYW5kIHdkZGF0YSBkaXNjb3ZlcmVkIGJ5IEFuZHJlYXMgU2Nod2FiLgotCi1Nb24gSnVsIDE1IDE2OjU5OjU1IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGkzODYtZGlzLmM6ICBHZXQgcmlkIG9mIHByaW50X2luc25faTgwODYuICBVc2UgaW5mby5tYWNoIHRvCi0JZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YXJpYW50cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0LgotCSogc3BhcmMtZGlzLmM6ICBHZXQgcmlkIG9mIHByaW50X2luc25fc3BhcmNsaXRlLiAgVXNlIGluZm8ubWFjaCB0bwotCWRpc3Rpbmd1aXNoIGJldHdlZW4gdmFyaWFudHMgb2YgdGhlIGluc3RydWN0aW9uIHNldC4KLQotRnJpIEp1bCAxMiAxMDoxMjowMSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2k4MDg2KTogIE5ldyByb3V0aW5lIHRvIGRpc2Fzc2VtYmxlIHVzaW5nCi0JdGhlIDgwODYgaW5zdHJ1Y3Rpb24gc2V0LgotCSogaTM4Ni1kaXMuYzogIEdlbmVyYWwgY2xlYW51cHMuICBNYWtlIG1vc3QgdGhpbmdzIHN0YXRpYy4gIEFkZAotCXByb3RvdHlwZXMuICBHZXQgcmlkIG9mIHN0YXRpYyB2YXJpYWJsZXMgYWZsYWdzIGFuZCBkZmxhZ3MuICBQYXNzCi0JdGhlbSBhcyBhcmdzICh0byBhbG1vc3QgZXZlcnl0aGluZykuCi0KLVRodSBKdWwgMTEgMTE6NTg6NDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogSGFuZGxlIG1hY3JlZ3MgaW4gbGRtYWMgaW5zbnMuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBIYW5kbGUgImxkbS5sIiBhbmQgInN0bS5sIi4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6ICJhYnMiIGlzIGltcGxpY2l0bHkgdHdvCi0JaWYgdGhlIG5leHQgYXJnIGlzIG1hcmtlZCB3aXRoIFNSQ19JTl9EU1QuICBHcm9zcy4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFByaW50ICJleHIiIHdoZW4KLQl3ZSdyZSBsb29raW5nIGZvciBhbmQgZmluZCBFWFIuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBXZSBkb24ndCBoYXZlIGEgbWF0Y2gKLQlpZiB3ZSdyZSBsb29raW5nIGZvciBLQklUIGFuZCB3ZSBkb24ndCBmaW5kIGl0LgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogTWFzayBvZmYgdW53YW50ZWQgYml0cwotCWZvciBMXzMgYW5kIExfMi4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IERvbid0IHNldCBwbGVuIGZvcgotCTNiaXQgaW1tZWRpYXRlIG9wZXJhbmRzLgotCi1UdWUgSnVsICA5IDEwOjU1OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi0JKiBhbHBoYS1vcGMuYzogQWRkIG5ldyBjYXNlIG9mICJtb3YiLiAgRnJvbSBLbGF1cyBLYWVtcGYKLQk8a2thZW1wZkBwcm9naXMuYWMtbmV0LmRlPi4KLQotVGh1IEp1bCAgNCAxMTo0Mjo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jOiBDb3JyZWN0IHNlY29uZCBjYXNlIG9mICJtb3YiIHRvIHVzZSBPUFJMLgotCi1XZWQgSnVsICAzIDE2OjAzOjQ3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjbGl0ZSk6ICBOZXcgcm91dGluZSB0byBwcmludAotCXNwYXJjbGl0ZSBpbnN0cnVjdGlvbnMuCi0KLVdlZCBKdWwgIDMgMTQ6MjE6MTggMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGQgY29sZGZpcmUgc3VwcG9ydC4KLQotRnJpIEp1biAyOCAxNTo1Mzo1MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoYXNpX3RhYmxlKTogQWRkICNBU0lfTiwgI0FTSV9OX0wsICNBU0lfTlVDTEVVUywKLQkjQVNJX05VQ0xFVVNfTElUVExFLiAgUmVuYW1lICNBU0lfQVNfSUZfVVNFUl97UFJJTUFSWSxTRUNPTkRBUll9X0wKLQl0byAjQVNJX0FTX0lGX1VTRVJfe1BSSU1BUlksU0VDT05EQVJZfV9MSVRUTEUuCi0KLVR1ZSBKdW4gMjUgMjI6NTg6MzEgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIpOgotCVVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotCShkb2NkaXIsIG9sZGluY2x1ZGVkaXIpOiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotCi1GcmkgSnVuIDIxIDEzOjUzOjM2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS1vcGMuYzogTmV3IGZpbGUuCi0JKiBhbHBoYS1vcGMuaDogUmVtb3ZlLgotCSogYWxwaGEtZGlzLmM6IENvbXBsZXRlIHJld3JpdGUgdG8gdXNlIG5ldyBvcGNvZGUgdGFibGUuCi0JKiBjb25maWd1cmUuaW46IEZvciBiZmRfYWxwaGFfYXJjaCwgdXNlIGFscGhhLW9wYy5vLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgYWxwaGEtb3BjLm8uCi0JKGFscGhhLWRpcy5vKTogRGVwZW5kIHVwb24gJChJTkNESVIpL29wY29kZS9hbHBoYS5oLCBub3QKLQlhbHBoYS1vcGMuaC4KLQkoYWxwaGEtb3BjLm8pOiBOZXcgdGFyZ2V0LgotCi1XZWQgSnVuIDE5IDE1OjU1OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0JU2V0IGltbV9hZGRlZF90b19yczEgZXZlbiBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcgotCWFyZSBub3QgdGhlIHNhbWUuCi0KLQkqIHNwYXJjLW9wYy5jOiBBZGQgc29tZSB0d28gb3BlcmFuZCBmb3JtcyBvZiB0aGUgd3IgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBKdW4gMTggMTU6NTg6MjcgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBSZW5hbWUgImhtb2RlIiBhcmd1bWVudAotCXRvIGp1c3QgIm1vZGUiLgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBIYW5kbGUgSDgvUy4KLQkqIGg4MzAwLWRpcy5jIChwcmludF9pbnNuX2g4MzAwcyk6IE5ldyBmdW5jdGlvbiBmb3IgSDgvUy4KLQotVHVlIEp1biAxOCAxODowNjo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBBZGQgYmVxL3RlcSBhcyBhbGlhc2VzIGZvciBiZS90ZS4KLQotCSogcHBjLW9wYy5jOiBGaXggZmNtcG8gb3Bjb2RlLiAgRnJvbSBTZXJnZWkgU3Rlc2hlbmtvCi0JPHNlcmdlaUBtc2lsLnNwcy5tb3QuY29tPi4KLQotVHVlIEp1biAxOCAxNTowODo1NCAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBOZXcgZmlsZS4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBQcmludCBsZGEgcmEsbGl0KHJ6KSBhcyBtb3YuCi0KLU1vbiBKdW4gMTAgMTg6NTA6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogQWx3YXlzIHByaW50IEFCUzhNRU0gd2l0aCA6OCwKLQlyZWdhcmRsZXNzIG9mIHBsZW4uCi0KLVR1ZSBKdW4gIDQgMDk6MTU6NTMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoT1BfT0ZGKTogQ2FsbCBhcHBlbmRfcHJlZml4LgotCi1UaHUgTWF5IDIzIDE1OjE4OjIzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChpbnN0cnVjdGlvbiBlbmNvZGluZyBtYWNyb3MpOiBBZGQgZXhwbGljaXQgY2FzdHMgdG8KLQl1bnNpZ25lZCBsb25nIHRvIHNpbGVuY2UgYSB3YXJuaW5nIGZyb20gdGhlIFNvbGFyaXMgUG93ZXJQQwotCWNvbXBpbGVyLgotCi1UaHUgQXByIDI1IDE5OjMzOjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogQWRkIHVsdHJhc3BhcmMgdmlzIGV4dGVuc2lvbnMuCi0KLU1vbiBBcHIgMjIgMTc6MTI6MzUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBibHVlcy5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoWF9JTU0sWF9TSU1NKTogTmV3IG1hY3Jvcy4KLQkoWF9JTU0xMyk6IERlbGV0ZS4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IE1lcmdlIGNhc2VzIGksSSxqIHRvZ2V0aGVyLiAgTmV3IGNhc2VzIFgsWS4KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogVXNlIFggZm9yIDUgYml0IHNoaWZ0IGNvbnN0YW50cywKLQlZIGZvciA2IGJpdCBzaGlmdCBjb25zdGFudHMuICBSZXdyaXRlIGVudHJpZXMgZm9yIGNyZGN4dCwgY3dyY3h0LAotCWNwdXNoLCBjcHVzaGEsIGNwdWxsIHNwYXJjbGV0IGluc25zLgotCi1XZWQgQXByIDE3IDE0OjIwOjIyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChjb21wdXRlX2FyY2hfbWFzayk6IFJlcGxhY2UgQU5TSSBzdHlsZSBkZWYgd2l0aCBLJlIuCi0KLVRodSBBcHIgMTEgMTc6MzA6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogU2V0IEZfRkJSIG9uIGZsb2F0aW5nIHBvaW50IGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0JU2V0IEZfRkxPQVQgb24gb3RoZXIgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gQXByICA4IDE3OjAyOjQ4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChQUEM4NjApOiBNYWNybyBmb3IgODYwLzgyMSBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYW5kCi0JcmVnaXN0ZXJzLgotIAkocG93ZXJwY19vcGNvZGVzKTogQWRkIDg2MC84MjEgc3BlY2lmaWMgU1BScy4KLQotTW9uIEFwciAgOCAxNDowMDo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLiAgU2V0IGFuZCBzdWJzdGl0dXRlIEJGRF9QSUNMSVNULgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEJGRF9QSUNMSVNUKTogUmVuYW1lIGZyb20gQkZEX0xJU1QuICBDaGFuZ2UgYWxsCi0JdXNlcy4gIFNldCB0byBAQkZEX1BJQ0xJU1RALgotCi1GcmkgQXByICA1IDE3OjEyOjI3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFVzZSAiYml0IiBmb3IgTF8zIGltbWVkaWF0ZXMsCi0Jbm90ICJhYnMiLCB3aGljaCBtYXkgYmUgbmVlZGVkIGZvciB0aGUgYWJzb2x1dGUgaW4gc29tZXRoaW5nCi0JbGlrZSBidHN0ICMwLEAxMDo4LiAgUHJpbnQgTF8zIGltbWVkaWF0ZXMgc2VwYXJhdGVseSBmcm9tIG90aGVyCi0JaW1tZWRpYXRlcy4gIENoYW5nZSBBQlNNT1YgcmVmZXJlbmNlIHRvIEFCUzhNRU0uCi0KLVdlZCBBcHIgIDMgMTA6NDA6NDUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKG9wY29kZXNfaW5pdGlhbGl6ZWQpOiBNb3ZlIGluc2lkZSBwcmludF9pbnNuX3NwYXJjLgotCShjdXJyZW50X2FyY2hfbWFzayk6IE5ldyBzdGF0aWMgZ2xvYmFsLgotCShjb21wdXRlX2FyY2hfbWFzayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByaW50X2luc25fc3BhcmMpOiBEZWxldGUgc3BhcmNfdjlfcC4gIE5ldyBzdGF0aWMgbG9jYWwKLQljdXJyZW50X21hY2guICBSZXNvcnQgb3Bjb2RlIHRhYmxlIGlmIGN1cnJlbnRfbWFjaCBjaGFuZ2VzLgotCUdlbmVyYWxpemUgImluc24gbm90IHN1cHBvcnRlZCIgdGVzdC4KLQkoY29tcGFyZV9vcGNvZGVzKTogUHJlZmVyIHN1cHBvcnRlZCBvcGNvZGVzIHRvIG5vbnN1cHBvcnRlZCBvbmVzLgotCURlbGV0ZSB0ZXN0IGZvciB2OS8hdjkuCi0JKiBzcGFyYy1vcGMuYyAoTUFTS18qKTogVXNlIFNQQVJDX09QQ09ERV9BUkNIX01BU0suCi0JKHY2bm90bGV0KTogRGVmaW5lLgotCShicmZjKTogU3BsaXQgaW50byBDQlIgYW5kIEZCUiBmb3IgY29wcm9jZXNzb3IvZnAgYnJhbmNoZXMuCi0JKGJyZmN4KTogUmVuYW1lZCB0byBGQlJYLgotCShjb25kZmMpOiBSZW5hbWVkIHRvIENPTkRGQy4gIFBhc3MgdjZub3RsZXQgdG8gQ0JSIChzdGFuZGFyZAotCWNvcHJvY2Vzc29yIG1uZW1vbmljcyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BhcmNsZXQpLgotCShjb25kZik6IFJlbmFtZWQgdG8gQ09OREYuCi0JKFNMQ0JDQzIpOiBEZWxldGUgRl9BTElBUyBmbGFnLgotCi1TYXQgTWFyIDMwIDIxOjQ1OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogcmQgbXVzdCBiZSAwIGZvcgotCW1vdiBmb28seyV5LCVwc3IsJXdpbSwldGJyfS4gIFN1cHBvcnQgbW92IGZvbywlYXNyWC4KLQotRnJpIE1hciAyOSAxMzowMjo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gQkZEIFZFUlNJT04gZmlsZSwgc28KLQl0aGF0IHRoZSBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIG51bWJlciBpcyBzZXQgY29ycmVjdGx5LgotCi1UdWUgTWFyIDI2IDE1OjQ3OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQUNfQ0hFQ0tfVE9PTCB0byBmaW5kIGFyIGFuZCByYW5saWIuICBGcm9tCi0JTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5haS5taXQuZWR1Pi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU2F0IE1hciAxNiAxMzowNDowNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogejhrZ2VuLmMgKGludGVybmFsLCBnYXMpOiBDYWxsIHhtYWxsb2MgcmF0aGVyIHRoYW4gdW5jaGVja2VkCi0JbWFsbG9jLgotCi1UdWUgTWFyIDEyIDEyOjE0OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi1UaHUgTWFyICA3IDE1OjExOjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEhhbmRsZSAnTycgb3BlcmFuZCBjaGFyIGxpa2UgJ3InLgotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBVc2UgJ08nIG9wZXJhbmQgY2hhciBmb3IgYG5lZyByZWcnLgotCi1UdWUgTWFyICA1IDE1OjUxOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgU0hMSUIgb3IgU0hMSU5LIHRvIGFuIGVtcHR5IHN0cmluZywKLQlzaW5jZSB0aGV5IGFwcGVhciBhcyB0YXJnZXRzIGluIE1ha2VmaWxlLmluLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gRmViIDI2IDEzOjAzOjQwIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGJpdHMuCi0KLVR1ZSBGZWIgMjAgMjA6NDg6MjggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jICh2OCx2Nm5vdHY5KTogQWRkIE1BU0tfU1BBUkNMRVQuCi0JKHNwYXJjX29wY29kZV9hcmNocyk6IEFkZCBNQVNLX1Y4IHRvIHNwYXJjbGV0IGVudHJ5LgotCShzcGFyY19vcGNvZGVzKTogQWRkIHNwYXJjbGV0IGluc25zLgotCShzcGFyY2xldF9jcHJlZ190YWJsZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9zcGFyY2xldF9jcHJlZyk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEhhbmRsZSBzcGFyY2xldCBjcHJlZ3MuCi0KLVR1ZSBGZWIgMjAgMTE6MDI6NDQgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5AbXVsbGV0LkxldmVscy5VbmlTQS5FZHUuQXU+Ci0KLQkqIGkzODYtZGlzLmMgKGluZGV4MTYpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwdXRvcCk6IFByaW50IGplY3h6IGZvciAzMiBiaXQgY2FzZSwgamN4eiBmb3IgMTYgYml0LCBub3QgdGhlCi0Jb3RoZXIgd2F5IGFyb3VuZC4KLQkoT1BfaW5kaXJFKTogUmV0dXJuIHJlc3VsdCBvZiBPUF9FLgotCShPUF9FKTogQ2hlY2sgZm9yIDE2IGJpdCBhZGRyZXNzaW5nIG1vZGUsIGFuZCBkaXNhc3NlbWJsZQotCWNvcnJlY3RseS4gIE9wdGltaXNlZCAzMiBiaXQgY2FzZSBhIGxpdHRsZS4gIERvbid0IHByaW50Ci0JIihiYXNlLGluZGV4LHNjYWxlKSIgd2hlbiBzaWIgc3BlY2lmaWVzIG9ubHkgYW4gb2Zmc2V0LgotCi1Nb24gRmViIDE5IDEyOjMyOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgU0hMSUJfREVQLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFNITElCX0RFUCk6IE5ldyB2YXJpYWJsZS4KLQkoTElCSUJFUlRZX0xJU1RTLCBCRkRfTElTVCk6IE5ldyB2YXJpYWJsZXMuCi0JKHN0YW1wLXBpY2xpc3QpOiBEZXBlbmQgdXBvbiBMSUJJQkVSVFlfTElTVFMgYW5kIEJGRF9MSVNULiAgSWYKLQlDT01NT05fU0hMSUIsIGFkZCB0aGVtIHRvIHBpY2xpc3Qgd2l0aCBhcHByb3ByaWF0ZSBtb2RpZmljYXRpb25zLgotCSgkKFNITElCKSk6IERlcGVuZCB1cG9uICQoU0hMSUJfREVQKS4gIERvbid0IGNoZWNrIENPTU1PTl9TSExJQgotCWhlcmU6IGp1c3QgdXNlIHBpY2xpc3QuCi0KLU1vbiBGZWIgMTkgMDI6MDM6NTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChNQVNLX1Y5LFY5X09OTFlfUCxWOV9QKTogRGVmaW5lLgotCShwcmludF9pbnNuX3NwYXJjKTogUmV3cml0ZSB2OS9ub3QtdjkgdGVzdHMuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IExpa2V3aXNlLgotCSogc3BhcmMtb3BjLmMgKE1BU0tfPEFSQ0g+KTogRGVmaW5lLgotCSh2Nix2Nyx2OCxzcGFyY2xpdGUsdjksdjlhKTogUmVkZWZpbmUuCi0JKHNwYXJjbGV0LHY2bm90djkpOiBEZWZpbmUuCi0JKHNwYXJjX29wY29kZV9hcmNocyk6IERlbGV0ZSBtZW1iZXIgYGNvbmZsaWN0cycuICBBZGQgYHN1cHBvcnRlZCcuCi0JKHNwYXJjX29wY29kZXMpOiBEZWxldGUgRl9OT1RWOSwgdXNlIHY2bm90djkgaW5zdGVhZC4KLQotVGh1IEZlYiAxNSAxNDo0NTowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBjb25maWd1cmUuaG9zdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW4gKFNPTkFNRSk6IFJlbW92ZSBsZWFkaW5nIC4uL2JmZC8gZnJvbSAkKFNITElCKS4KLQotV2VkIEZlYiAxNCAxOTowMToyNyAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKG9uZWJ5dGVfaGFzX21vZHJtKTogTmV3IHN0YXRpYyBhcnJheS4KLQkodHdvYnl0ZV9oYXNfbW9kcm0pOiBOZXcgc3RhdGljIGFycmF5LgotCShwcmludF9pbnNuX2kzODYpOiBPbmx5IGZldGNoIHRoZSBtb2QvcmVnL3JtIGJ5dGUgaWYgaXQgaXMgbmVlZGVkLgotCi1UdWUgRmViIDEzIDE1OjE1OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IENoZWNrIHRzIGFnYWluc3QgJChTSExJQiksIG5vdAotCSQoU0hMSU5LKS4KLQotTW9uIEZlYiAxMiAxNjoyNjowNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoUFBDKTogVW5kZWYsIHNvIGRlZmF1bHQgZGVmaW5hdGlvbiBvbiBXaW5kb3dzIE5UCi0JZG9lc24ndCBjb25mbGljdC4KLQotV2VkIEZlYiAgNyAxMzo1OTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFRoZSBia3B0IGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCBvbgotCW02ODAxMHVwLCBub3QganVzdCBtNjgwMjB1cCB8IGNwdTMyLgotCi0JKiBNYWtlZmlsZS5pbiAoU09OQU1FKTogTmV3IHZhcmlhYmxlLgotCSgkKFNITElOSykpOiBNYWtlIGEgbGluayB0byB0aGUgdHJhbnNmb3JtZWQgbmFtZSwgYXMgd2VsbC4KLQkoc3RhbXAtdHNobGluayk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBTa2lwIHN0YW1wLXRzaGxpbmsgZHVyaW5nIGluc3RhbGwuCi0KLVR1ZSBGZWIgIDYgMTI6Mjg6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQVJHX1BST0dSQU0uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSk6IE5ldyB2YXJpYWJsZS4KLQkoaW5zdGFsbCk6IFRyYW5zZm9ybSBsaWJyYXJ5IG5hbWUgYmVmb3JlIGluc3RhbGxpbmcgaXQuCi0KLU1vbiBGZWIgIDUgMTY6MTQ6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLWRpcy5jIChtZW0pOiBBZGQgSFggZGNpbnZhIGluc3RydWN0aW9uLgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYXMgYSBzaGFyZWQgbGlicmFyeSwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tCi0JQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3Igc2hhcmVkIGFuZCBjb21tb25iZmRsaWIuCi0JTmV3IHN1YnN0aXR1dGlvbnM6IEFMTExJQlMsIFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywKLQlTSExJQl9DRkxBR1MsIENPTU1PTl9TSExJQiwgU0hMSU5LLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEFMTExJQlMpOiBOZXcgdmFyaWFibGUuCi0JKFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywgU0hMSUJfQ0ZMQUdTKTogTmV3IHZhcmlhYmxlcy4KLQkoQ09NTU9OX1NITElCLCBTSExJTkspOiBOZXcgdmFyaWFibGVzLgotCSguYy5vKTogSWYgUElDRkxBRyBpcyBzZXQsIGNvbXBpbGUgdHdpY2UsIG9uY2UgUElDLCBvbmNlIG5vcm1hbC4KLQkoU1RBR0VTVFVGRik6IFJlbW92ZSB2YXJpYWJsZS4KLQkoYWxsKTogRGVwZW5kIHVwb24gJChBTExMSUJTKSByYXRoZXIgdGhhbiAkKFRBUkdFVExJQikuCi0JKHN0YW1wLXBpY2xpc3QsIHBpY2xpc3QpOiBOZXcgdGFyZ2V0cy4KLQkoJChTSExJQiksICQoU0hMSU5LKSk6IE5ldyB0YXJnZXRzLgotCSgkKE9GSUxFUykpOiBEZXBlbmQgdXBvbiBzdGFtcC1waWNkaXIuCi0JKGRpc2Fzc2VtYmxlLm8pOiBCdWlsZCB0d2ljZSBpZiBQSUNGTEFHIGlzIHNldC4KLQkoTU9TVExZQ0xFQU4pOiBBZGQgcGljLyouby4KLQkoY2xlYW4pOiBSZW1vdmUgJChTSExJQiksICQoU0hMSU5LKSwgcGljbGlzdCwgYW5kIHN0YW1wLXBpY2xpc3QuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBwaWMgYW5kIHN0YW1wLXBpY2Rpci4KLQkoaW5zdGFsbCk6IEluc3RhbGwgc2hhcmVkIGxpYnJhcmllcy4KLQkoc3RhbXAtcGljZGlyKTogTmV3IHRhcmdldC4KLQotRnJpIEZlYiAgMiAxNzoxNToyNSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBEZWxldGUgRElTQVNNX1JBV19JTlNOIHN1cHBvcnQuCi0JUHJpbnQgdW5rbm93biBpbnN0cnVjdGlvbiBhcyAidW5rbm93biIsIHJhdGhlciB0aGFuIGluIGhleC4KLQotVHVlIEphbiAzMCAxNDowNjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1idWYuYzogSW5jbHVkZSAic3lzZGVwLmgiIGJlZm9yZSAiZGlzLWFzbS5oIi4KLQotVGh1IEphbiAyNSAyMDoyNDowNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZV9hcmNocyk6IE1hcmsgdjgvc3BhcmNsaXRlIGFzIGNvbmZsaWN0aW5nLgotCi1UaHUgSmFuIDI1IDExOjU2OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pMzg2KTogT25seSBmZXRjaCB0aGUgbW9kL3JlZy9ybSBieXRlCi0Jd2hlbiBuZWNlc3NhcnkuICBGcm9tIFVscmljaCBEcmVwcGVyCi0JPGRyZXBwZXJAbXl3YXJlLnJ6LnVuaS1rYXJsc3J1aGUuZGU+LgotCi1UaHUgSmFuIDI1IDAzOjM5OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IE5VTU9QQ09ERVMgcmVwbGFjZWQgd2l0aAotCXNwYXJjX251bV9vcGNvZGVzLiAgVXBkYXRlIGFyY2hpdGVjdHVyZSBlbnVtIHZhbHVlcy4KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVfYXJjaHMpOiBSZXBsYWNlcyBhcmNoaXRlY3R1cmVfcG5hbWUuCi0JKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfbnVtX29wY29kZXMpOiBSZW5hbWVkIGZyb20gYmZkX3NwYXJjX251bV9vcGNvZGVzLgotCShzcGFyY19vcGNvZGVzKTogQWRkIHY5YSBzaHV0ZG93biBpbnNuLgotCi1Nb24gSmFuIDIyIDA4OjI5OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IFJlbmFtZWQgZnJvbSBwcmludF9pbnNuLgotCUlmIERJU0FTTV9SQVdfSU5TTiwgcHJpbnQgaW5zbiBpbiBoZXguICBIYW5kbGUgdjlhIGFzIG9wY29kZQotCWFyY2hpdGVjdHVyZS4KLQkocHJpbnRfaW5zbl9zcGFyYzY0KTogRGVsZXRlZC4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlciwgY2FzZSBiZmRfYXJjaF9zcGFyYyk6IEFsd2F5cyB1c2UKLQlwcmludF9pbnNuX3NwYXJjLgotCi0JKiBzcGFyYy1vcGMuYyAoYXJjaGl0ZWN0dXJlX3BuYW1lKTogQWRkIHY5YS4KLQotRnJpIEphbiAxMiAxNDozNTo1OCAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBBWlN0YXJOZXQuY29tPgotCi0JKiBhbHBoYS1vcGMuaCAoYWxwaGFfaW5zbl9zZXQpOiBWQVggZmxvYXRpbmcgcG9pbnQgb3Bjb2RlIHdhcwotIAlpbmNvcnJlY3RseSBkZWZpbmVkIGFzIDB4MTYgd2hlbiBpdCBzaG91bGQgYmUgMHgxNS4KLQkoRkxPQVRfRk9STUFUX01BU0spOiBmdW5jdGlvbiBjb2RlIGlzIDExIGJpdHMsIG5vdCBqdXN0IDcgYml0cyEKLQkoYWxwaGFfaW5zbl9zZXQpOiBhZGRlZCBjdnRzdCBhbmQgY3Z0dHEgZmxvYXQgb3BzLiAgQWxzbyBhZGRlZAotIAlleGNiIChleGNlcHRpb24gYmFycmllcikgd2hpY2ggaXMgZGVmaW5lZCBpbiB0aGUgQWxwaGEKLSAJQXJjaGl0ZWN0dXJlIEhhbmRib29rIHZlcnNpb24gMi4KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogRml4ZWQgc3BlY2lhbC1jYXNlIGRlY29kaW5nIGZvcgotIAlPUEVSQVRFX0ZPUk1BVF9DT0RFIHR5cGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGJ1ZyBjYXVzZWQgbXVscSB0byBiZQotIAlkaXNhc3NlbWJsZWQgYXMgb3IsIGZvciBleGFtcGxlLgotCi1XZWQgSmFuIDEwIDEyOjM3OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBQcmludCBjYXNlcyAnaScgYW5kICd1JyBpbiBoZXguCi0JKF9wcmludF9pbnNuX21pcHMpOiBDaGFuZ2UgaSBmcm9tIGludCB0byB1bnNpZ25lZCBpbnQuCi0KLVRodSBKYW4gIDQgMTc6MjE6MTAgMTk5NiAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogdGxiaSBQT1dFUiBvcGNvZGUgZm9ybSBkaWZmZXJlbnQKLQlmcm9tIHRsYmllIFBvd2VyUEMgb3Bjb2RlLiAgQWRkIFBQQzYwMyB0bGJsZCBhbmQgdGxibGkuCi0KLVRodSBEZWMgMjggMTM6Mjk6MTkgMTk5NSAgSm9obiBIYXNzZXkgIDxoYXNzZXlAcnRwLmRnLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogQWRkZWQgUGVudGl1bSBQcm8gaW5zdHJ1Y3Rpb25zLgotCi1UdWUgRGVjIDE5IDIyOjU2OjM1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChmc3FydHssLn0pOiBEdXBsaWNhdGUgZm9yIFBvd2VyUEMgaW4gYWRkaXRpb24gdG8KLQliZWluZyBmb3IgUG93ZXIyLgotCi1GcmkgRGVjIDE1IDE0OjE0OjE1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX25pYmJsZV90eXBlKTogQWRkZWQgUkVHX0IuCi0JKHNoX2FyZ190eXBlKTogQWRkZWQgQV9SRUdfQi4KLQkoc2hfdGFibGUpOiBBZGRlZCBwcmVmIGFuZCBiYW5rIHJlZyB2ZXJzaW9ucyBvZiBsZGMsIGxkYy5sLCBzdGMKLSAJYW5kIHN0Yy5sIG9wY29kZXMuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBBZGRlZCBjYXNlcyBmb3IgUkVHX0IgYW5kIEFfUkVHX0IuCi0KLUZyaSBEZWMgMTUgMTY6NDQ6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBVc2UgbmV3IGJmZF9iaWdfZW5kaWFuIG1hY3JvLgotCi1UdWUgRGVjIDEyIDEyOjIyOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzdGFtcC1oLiAgRnJvbSBSb25hbGQKLQlGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCi0KLVR1ZSBEZWMgIDUgMTM6NDI6NDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JRnJvbSBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPjoKLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogZml4ZWQgZGVjb2Rpbmcgb2YgY3B5cwotIAlpbnN0cnVjdGlvbi4KLQotTW9uIERlYyAgNCAxMjoyOTowNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9hcmdfdHlwZSk6IEFkZGVkIEFfU1NSIGFuZCBBX1NQQy4KLQkoc2hfdGFibGUpOiBBZGRlZCBtYW55IFNIMyBvcGNvZGVzLgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQWRkZWQgY2FzZXMgZm9yIEFfU1NSIGFuZCBBX1NQQy4KLQotRnJpIERlYyAgMSAwNzo0MjoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoc3ViZmMuLCBzdWJmY28pOiBNYXJrIHRoaXMgUFBDQ09NLCBub3QgUFBDLgotCShzdWJjbyxzdWJjby4pOiBNYXJrIHRoaXMgUFBDLCBub3QgUFBDQ09NLgotCi1Nb24gTm92IDI3IDEzOjA5OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi43LgotCi1UdWUgTm92IDIxIDE4OjI4OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi1XZWQgTm92IDE1IDE5OjAyOjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNvcnQgbGlzdCBvZiBhcmNoaXRlY3R1cmVzLiAgQWNjZXB0IGJ1dCBkbyBub3RoaW5nCi0JZm9yIGFsbGlhbnQsIGNvbnZleCwgcHlyYW1pZCwgcm9tcCwgYW5kIHRhaG9lLgotCi1XZWQgTm92ICA4IDIwOjE4OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYTI5ay1kaXMuYyAocHJpbnRfc3BlY2lhbCk6IENoYW5nZSBudW0gdG8gdW5zaWduZWQgaW50LgotCi1XZWQgTm92ICA4IDIwOjEwOjM1IDE5OTUgIEVyaWMgRnJldWRlbnRoYWwgPGZyZXVkZW50aGFsQG55dS5lZHU+Ci0KLQkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBDYXN0IGluc24yNCB0byB1bnNpZ25lZCBsb25nIHdoZW4KLQlzaGlmdGluZyBpdC4KLQotVHVlIE5vdiAgNyAxNToyMTowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DSEVDS19QUk9HIHRvIGZpbmQgYW5kIGNhY2hlIEFSLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gTm92ICA2IDE3OjM5OjQ3IDE5OTUgIEhhcnJ5IERvbGFuICA8ZG9sYW5Ac3NkLmludGVsLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY2FzZSBmb3IgYmZkX2k4NjBfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE5vdiAgMyAxMjo0NTozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IENvcnJlY3QgZm1vdmVtbCBvcGVyYW5kcy4KLQkqIG02OGstZGlzLmMgKE5FWFRTSU5HTEUpOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKE5FWFRET1VCTEUpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9tNjhrKTogRG9uJ3QgbWF0Y2ggZm1vdmVtbCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCi0JcmVnaXN0ZXIgaW4gdGhlIGxpc3QuCi0JKHByaW50X2luc25fYXJnKTogSGFuZGxlIGEgcGxhY2Ugb2YgJzgnIGZvciBhIHR5cGUgb2YgJ0wnLgotCi1UaHUgTm92ICAyIDIzOjA2OjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogVXNlICNXIHJhdGhlciB0aGFuICN3LgotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3ICdXJyBwbGFjZS4KLQotV2VkIE5vdiAgMSAxMzozMDoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgZGJmdyBhcyBhbiBhbGlhcyBmb3IgZGJmLAotCWFuZCBsaWtld2lzZSBmb3IgYWxsIHRoZSBkYnh4IG9wY29kZXMuCi0KLU1vbiBPY3QgMzAgMjA6NTA6NDAgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGFyYy1kaXMuYzogSW5jbHVkZSBlbGYtYmZkLmggcmF0aGVyIHRoYW4gbGliZWxmLmguCi0KLU1vbiBPY3QgMjMgMTE6MTE6MzQgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZGVkIHNob3J0aGFuZCAoVjEpIGZvciBJTlNOXzQxMDAgbWFuaWZlc3QuIEFkZGVkCi0gCXRoZSBWUjQxMDAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBtaXBzX29wY29kZXMgc3RydWN0dXJlLgotCi1UaHUgT2N0IDE5IDExOjA1OjIzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiwgbXB3LW1ha2Uuc2VkOiBSZW1vdmUgdWdseSB3b3JrYXJvdW5kIGZvcgotCXVnbHkgTWV0cm93ZXJrcyBidWcgaW4gQ1c2LCBpcyBmaXhlZCBpbiBDVzcuCi0KLU1vbiBPY3QgMTYgMTI6NTk6MDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHdob2xlIGZpbGUpOiBBZGQgZmxhZ3MgZm9yIGNvbW1vbi9hbnkgc3VwcG9ydC4KLQotVHVlIE9jdCAxMCAxMTowNjowNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogUmVtb3ZlIG1hY3JvLgotCShGTEFHU19UT19QQVNTKTogUmVtb3ZlIEJJU09OLgotCi1GcmkgT2N0ICA2IDE2OjI2OjQ1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogUmVjb2duaXplIGFsbCB0d28td29yZAotCWluc3RydWN0aW9ucyB0aGF0IHRha2Ugbm8gYXJncyBieSBsb29raW5nIGF0IHRoZSBtYXRjaCBtYXNrLgotICAJKHByaW50X2luc25fYXJnKTogQWx3YXlzIHByaW50ICIlIiBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMuCi0JW2Nhc2UgJ2MnXTogVXNlICJuYyIgZm9yIHRoZSBuby1jYWNoZSBjYXNlLCBhcyByZWNvZ25pemVkIGJ5IGdhcy4KLQlbY2FzZSAnXyddOiBEb24ndCBwcmludCAiQCMiIGJlZm9yZSBhZGRyZXNzLgotCVtjYXNlICdKJ106IFVzZSAiJXMiIGFzIGZvcm1hdCBzdHJpbmcsIG5vdCByZWdpc3RlciBuYW1lLgotCVtjYXNlICdCJ106IFRyZWF0IHBsYWNlID09ICdDJyBsaWtlICdsJyBhbmQgJ0wnLgotCi1UaHUgT2N0ICA1IDIyOjE2OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jOiBEZXNjcmliZSBjbXB4Y2hnOGIgb3BlcmFuZCwgYW5kIHNwZWxsIHRoZSBvcGNvZGUKLQluYW1lIGNvcnJlY3RseS4KLQotVHVlIE9jdCAgMyAwODozMDoyMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JRnJvbSBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBhbHBoYS1vcGMuaCAoTUVNT1JZX0ZVTkNUSU9OX0ZPUk1BVF9NQVNLKTogYWRkZWQuCi0gIAkoYWxwaGFfaW5zbl9zZXQpOiBhZGRlZCBkZWZpbml0aW9ucyBmb3IgVkFYIGZsb2F0aW5nIHBvaW50Ci0gCWluc3RydWN0aW9ucyAoVW5peCBjb21waWxlcnMgZG9uJ3QgZ2VuZXJhdGUgdGhlc2UsIGJ1dCBoYW5kY29kZWQKLSAJYXNzZW1ibHkgbWlnaHQgc3RpbGwgdXNlIHRoZW0pLgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IGFkZGVkIHN1cHBvcnQgZm9yIGRpc2Fzc2VtYmxpbmcKLSAJdGhlIG1pc2NlbGxhbmVvdXMgaW5zdHJ1Y3Rpb25zIGluIHRoZSBBbHBoYSBpbnN0cnVjdGlvbiBzZXQuCi0KLVR1ZSBTZXAgMjYgMTg6NDc6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgbTY4ay1vcGMuYy5vIHRvIEJGRF9NQUNISU5FUyBmb3IgbTY4aywKLQlubyBsb25nZXIgY3JlYXRlIHN5c2RlcC5oLCBzZWQgcHBjLW9wYy5jIHRvIHdvcmsgYXJvdW5kIGEKLQlzZXJpb3VzIE1ldHJvd2Vya3MgQyBidWcuCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgdXNlZCBieSBtcHctY29uZmlndXJlIHRvIGVkaXQKLQlNYWtlZmlsZS5pbiBpbnRvIGFuIE1QVyBtYWtlZmlsZS4KLQotV2VkIFNlcCAyMCAxMjo1NToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotVHVlIFNlcCAxOSAxNToyODozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IFNwbGl0IHBtb3ZlIHBhdHRlcm5zIHdoaWNoIHVzZSAnUCcgaW50byBwYXR0ZXJucwotCXdoaWNoIHVzZSAnMCcsICcxJywgYW5kICcyJyBpbnN0ZWFkLiAgU3BlY2lmeSB0aGUgcHJvcGVyIHNpemUgZm9yCi0JYSBwbW92ZSBpbW1lZGlhdGUgb3BlcmFuZC4gIENvcnJlY3QgdGhlIHBtb3ZlZmQgcGF0dGVybnMgdG8gYmUKLQltb3ZlcyB0byBhIHJlZ2lzdGVyLCBub3QgZnJvbSBhIHJlZ2lzdGVyLgotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBSZXBsYWNlICdQJyB3aXRoICcwJywgJzEnLCAnMicuCi0KLVRodSBTZXAgMTQgMTE6NTg6MjIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBNYXJrIGFsbCBpbnNucyB0aGF0IHJlZmVyZW5jZQotCSVwc3IsICV3aW0sICV0YnIgYXMgRl9OT1RWOS4KLQotRnJpIFNlcCAgOCAwMTowNzozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEp1c3QgcmVidWlsZCBNYWtlZmlsZSB3aGVuIHJ1bm5pbmcKLQljb25maWcuc3RhdHVzLgotCShjb25maWcuaCwgc3RhbXAtaCk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIgYW5kIEFDX0NBTk9OSUNBTF9TWVNURU0KLQllYXJsaWVyLiAgRG9uJ3QgYm90aGVyIHRvIGNhbGwgQUNfQVJHX1BST0dSQU0uICBUb3VjaCBzdGFtcC1oIHdoZW4KLQlyZWJ1aWxkaW5nIGNvbmZpZy5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBtaXBzLW9wYy5jOiBDaGFuZ2UgdW5hbGlnbmVkIGxvYWRzIGFuZCBzdG9yZXMgd2l0aCAidCxBIgotCW9wZXJhbmRzIHRvIHVzZSAidCxBKGIpIi4KLQotVGh1IFNlcCAgNyAxOTowMjo0NiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEFkZCBGX0ZSMCBzdXBwb3J0LgotCi1UaHUgU2VwICA3IDE5OjAyOjQ2IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQ2hhbmdlIGxvb3Agb3ZlciBvcC0+YXJnW25dIHRvIGl0ZXJhdGUKLQl1bnRpbCAzIGluc3RlYWQgb2YgdW50aWwgMi4KLQotV2VkIFNlcCAgNiAyMToyMTozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogRGVmaW5lLgotCSguYy5vLCBkaXNhc3NlbWJsZS5vKTogVXNlICQoQUxMX0NGTEFHUykuCi0JKE1PU1RMWUNMRUFOKTogQWRkIGNvbmZpZy5sb2cuCi0JKGRpc3RjbGVhbik6IERvbid0IHJlbW92ZSBjb25maWcubG9nLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIEhERUZJTkVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwICA2IDE1OjA4OjA5IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX2FyZ190eXBlKTogQWRkIEZfRlIwLgotCShzaF90YWJsZSwgY2FzZSBmbWFjKTogQWRkIEZfRlIwIGFzIGZpcnN0IGFyZ3VtZW50LgotCi1XZWQgU2VwICA2IDE1OjA4OjA5IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX29wY29kZV9pbmZvKTogSW5jcmVhc2UgYXJnIGFycmF5IHNpemUgdG8gNC4KLQotVHVlIFNlcCAgNSAxODoyODoxMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYzogUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIE5PX1Y5LgotCi1UdWUgU2VwICA1IDIwOjAzOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogSnVzdCBpbmNsdWRlIC4uL2JmZC9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwICA1IDE2OjA5OjU5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChYX0RJU1AxOSk6IERlZmluZS4KLQkocHJpbnRfaW5zbiwgY2FzZSAnRycpOiBVc2UgaXQuCi0JKHByaW50X2luc24sIGNhc2UgJ0wnKTogU2lnbiBleHRlbmQgZGlzcGxhY2VtZW50LgotCi1Nb24gU2VwICA0IDE0OjI4OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSdW4gLi4vYmZkL2NvbmZpZ3VyZS5ob3N0IGJlZm9yZSBBQ19QUk9HX0NDLgotCVN1YnNpdHV0ZSBDRkxBR1MgYW5kIEFSLiAgQ2FsbCBBQ19QUk9HX0lOU1RBTEwuICBEb24ndCBzdWJzdGl0dXRlCi0JaG9zdF9tYWtlZmlsZV9mcmFnIG9yIGZyYWdzLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfUFJPR1JBTSk6IFNldCB0byBASU5TVEFMTF9QUk9HUkFNQC4KLQkoSU5TVEFMTF9EQVRBKTogU2V0IHRvIEBJTlNUQUxMX0RBVEFALgotCShBUik6IFNldCB0byBAQVJALgotCShBUl9GTEFHUyk6IFNldCB0byByYyByYXRoZXIgdGhhbiBxYy4KLQkoQ0MpOiBEZWZpbmUgYXMgQENDQC4KLQkoQ0ZMQUdTKTogU2V0IHRvIEBDRkxBR1NALgotCShAaG9zdF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoY29uZmlnLnN0YXR1cyk6IFJlbW92ZSBkZXBlbmRlbmN5IHVwb24gQGZyYWdzQC4KLQotCSogY29uZmlndXJlLmluOiAuLi9iZmQvY29uZmlnLmJmZCBub3cganVzdCBzZXRzIHNoZWxsIHZhcmlhYmxlcy4KLQlVc2UgdGhlbSByYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2ggdGFyZ2V0IE1ha2VmaWxlIGZyYWdtZW50cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEF1ZyAzMSAxMjozNTozMiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChmdHJjKTogQ2hhbmdlIEZQVUxfTiB0byBGUFVMX00uCi0KLVdlZCBBdWcgMzAgMTM6NTI6MjggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBEZWxldGUgZHVwbGljYXRlIHdyICV5IGluc24uCi0JQWRkIGNscngsIGlwcmVmZXRjaCwgc2lnbngsIGNscnV3LCBjYXMsIGNhc2wsIGNhc3gsIGNhc3hsIHN5bnRoZXRpYwotCXNwYXJjNjQgaW5zbnMuCi0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4IHByZWZldGNoYSBpbnNuLgotCShsb29rdXBfe25hbWUsdmFsdWV9KTogTmV3IGZ1bmN0aW9ucy4KLQkocHJlZmV0Y2hfdGFibGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShzcGFyY197ZW5jb2RlLGRlY29kZX1fcHJlZmV0Y2gpOiBOZXcgZnVuY3Rpb25zLgotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc24pOiBIYW5kbGUgJyonIGFyZyAocHJlZmV0Y2ggZnVuY3Rpb24pLgotCi1XZWQgQXVnIDMwIDExOjExOjU4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmg6IEFkZCBibGFuayBsaW5lcyB0byBpbXByb3ZlIHJlYWRhYmlsaWx0eSBvZiBzaDNlCi0JaW5zdHJ1Y3Rpb25zLgotCi1XZWQgQXVnIDMwIDExOjA5OjM4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmM6IENvcnJlY3QgY29tbWVudCBvbiBmaXJzdCBsaW5lIG9mIGZpbGUuCi0KLVR1ZSBBdWcgMjkgMTU6Mzc6MTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogSGFuZGxlIGJmZF9tYWNoX3NwYXJjNjQuCi0KLQkqIHNwYXJjLW9wYy5jIChhc2ksIG1lbWJhcik6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzcGFyY197ZW5jb2RlLGRlY29kZX1fe2FzaSxtZW1iYXJ9KTogTmV3IGZ1bmN0aW9ucy4KLQkoc3BhcmNfb3Bjb2RlcywgbWVtYmFyIGluc24pOiBGaXguCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbik6IENhbGwgc3BhcmNfZGVjb2RlX2FzaS4KLQlTdXBwb3J0IGRlY29kaW5nIG9mIG1lbWJhciBtYXNrcy4KLQkoWF9NRU1CQVIpOiBEZWZpbmUuCi0KLVNhdCBBdWcgMjYgMjE6MjI6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIGJyLCBicnMsIGJyYiwgYnJ3LCBicmwuCi0KLU1vbiBBdWcgMjEgMTc6MzM6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIGJoaWIgYXMgYW4gYWxpYXMgZm9yIGJoaXMsCi0JYW5kIGxpa2V3aXNlIGZvciB0aGUgb3RoZXIgYnJhbmNoZXMuICBBZGQgYmhzIGFzIGFuIGFsaWFzIGZvciBiY2MsCi0JYW5kIGxpa2V3aXNlIGZvciB0aGUgc2l6ZSB2YXJpYW50cy4gIEFkZCBkYmhzIGFzIGFuIGFsaWFzIGZvcgotCWRiY2MuCi0KLUZyaSBBdWcgMTEgMTM6NDA6MjQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNoLW9wYy5oIChGUCBzdHMgaW5zdHJ1Y3Rpb25zKTogVXBkYXRlIHRvIG1hdGNoIHJlYWxpdHkuCi0KLU1vbiBBdWcgIDcgMTY6MTI6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jOiAoZnBjcl9uYW1lcyk6IEFkZCAlIGJlZm9yZSBhbGwgcmVnaXN0ZXIgbmFtZXMuCi0JKHJlZ19uYW1lcyk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX2FyZyk6IERvbid0IGV4cGxpY2l0bHkgcHJpbnQgJSBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMuCi0JQWRkICUgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzIGluIHN0YXRpYyBhcnJheSBuYW1lcy4gIEluIGNhc2UgJ3InLAotCXByaW50IGRhdGEgcmVnaXN0ZXJzIGFzIGBAKERuKScsIG5vdCBgRG5AJy4gIFdoZW4gcHJpbnRpbmcgYQotCW1lbW9yeSBhZGRyZXNzLCBkb24ndCBwcmludCBAIyBiZWZvcmUgaXQuCi0JKHByaW50X2luZGV4ZWQpOiBDaGFuZ2UgYmFzZV9kaXNwIGFuZCBvdXRlcl9kaXNwIGZyb20gaW50IHRvCi0JYmZkX3ZtYS4gIFByaW50IHVzaW5nIE1JVCBzeW50YXgsIG5vdCBtdXRhbnQgaW52YWxpZCBNb3Rvcm9sYQotCXN5bnRheC4gIFNpZ24gZXh0ZW5kIDggYnl0ZSBkaXNwbGFjZW1lbnQgY29ycmVjdGx5LgotCShwcmludF9iYXNlKTogUHJpbnQgdXNpbmcgTUlUIHN5bnRheC4gIFByaW50IHpwYyB3aGVuIGFwcHJvcHJpYXRlLgotCUNoYW5nZSBwYXJhbWV0ZXIgZGlzcCBmcm9tIGludCB0byBiZmRfdm1hLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIGpzcmwgYW5kIGpzcnMgYXMgYWxpYXNlcwotCWZvciBqc3IuCi0KLU1vbiBBdWcgIDcgMDI6MjE6NDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlcyBGX1JFR19OLAotCUZfUkVHX00sIEZQU0NSX00sIEZQU0NSX04sIEZQVUxfTSBhbmQgRlBVTF9OLgotCSogc2gtb3BjLmggKHNoX2FyZ190eXBlKTogQWRkIG5ldyBvcGVyYW5kIHR5cGVzLgotCShzaF90YWJsZSk6IEFkZCBuZXcgb3Bjb2RlcyBmcm9tIFNIM0UgRmxvYXRpbmcgUG9pbnQgSVNBLgotCi1TYXQgQXVnICA1IDE2OjUwOjE0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGdlbmVyYXRlZCBmaWxlIGNvbmZpZy5oLgotCi1TYXQgQXVnICA1IDE2OjUwOjE0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGdlbmVyYXRlZCBmaWxlIGNvbmZpZy5oLgotCi1XZWQgQXVnICAyIDE4OjMzOjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogTmV3IGZpbGUsIGhvbGRpbmcgdGFibGVzIGZyb20gaW5jbHVkZS9vcGNvZGUvbTY4ay5oLgotCUNsZWFuIHVwIHRhYmxlcy4KLQkqIG02OGstZGlzLmM6IFJlbW92ZSBCUkVBS19VUF9CSUdfREVDTCBzdHVmZi4KLQkob3Bjb2RlKTogUmVtb3ZlLgotCShwcmludF9pbnNuX202OGspOiBDaGFuZ2UgZCB0byBiZSBjb25zdC4gIFVzZSBtNjhrX251bW9wY29kZXMKLQlyYXRoZXIgdGhhbiBudW1vcGNvZGVzLiAgVXNlIG02OGtfb3Bjb2RlcyByYXRoZXIgdGhhbiByZW1vdmVkCi0Jb3Bjb2RlIGZ1bmN0aW9uLiAgRG9uJ3QgY2hlY2sgRl9BTElBUy4KLQkocHJpbnRfaW5zbl9hcmcpOiBDaGFuZ2UgZmlyc3QgcGFyYW1ldGVyIHRvIGJlIGNvbnN0IGNoYXIgKi4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgbTY4ay1vcGMuby4KLQkobTY4ay1vcGMubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIG02OGstb3BjLm8gZm9yIGJmZF9tNjhrX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDIgMDg6MjM6MzggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKEhBU0hfU0laRSwgSEFTSF9JTlNOKTogRGVmaW5lLgotCShvcGNvZGVfYml0cywgb3Bjb2RlX2hhc2hfdGFibGUpOiBOZXcgdmFyaWFibGVzLgotCShvcGNvZGVzX2luaXRpYWxpemVkKTogUmVuYW1lZCBmcm9tIG9wY29kZXNfc29ydGVkLgotCShidWlsZF9oYXNoX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShpc19kZWxheWVkX2JyYW5jaCk6IFVzZSBoYXNoIHRhYmxlLgotCShwcmludF9pbnNuKTogUmVuYW1lZCBmcm9tIHByaW50X2luc25fc3BhcmMsIG1hZGUgc3RhdGljLgotCUJ1aWxkIGFuZCB1c2UgaGFzaCB0YWJsZS4gIElmICFzcGFyYzY0LCBpZ25vcmUgc3BhcmM2NCBpbnNucywKLQlhbmQgdmljZS12ZXJzYSBpZiBzcGFyYzY0LgotCShwcmludF9pbnNuX3NwYXJjLCBwcmludF9pbnNuX3NwYXJjNjQpOiBOZXcgZnVuY3Rpb25zLgotCShjb21wYXJlX29wY29kZXMpOiBNb3ZlIHNwYXJjNjQgb3Bjb2RlcyB0byBlbmQuCi0JUHJpbnQgY29tbXV0YXRpdmUgaW5zbnMgd2l0aCBjb25zdGFudCBzZWNvbmQuCi0JKiBzcGFyYy1vcGMuYyAoYWxsIG5vbi12OSBpbnNucyk6IFVzZSBmbGFnIEZfTk9UVjkgaW5zdGVhZCBvZiBGX0FMSUFTLgotCi1UdWUgQXVnICAxIDAwOjEyOjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBkc2xvdC4gIFVzZQotCXByaW50X2FkZHJlc3NfZnVuYyBmb3IgQV9CRElTUDEyIGFuZCBBX0JESVNQOC4gIENvcnJlY3QgdGVzdCB3aGljaAotCWF2b2lkcyBwcmludGluZyBhIGRlbGF5IHNsb3QgaW4gYSBkZWxheSBzbG90LgotCSogc2gtb3BjLmggKHNoX3RhYmxlKTogRnVsbHkgYnJhY2tldCBsYXN0IGVudHJ5LgotCi1Nb24gSnVsIDMxIDEyOjA0OjQ3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzbGx4LCBzcmF4LCBzcmx4KTogRml4IGRpc2Fzc2VtYmx5LgotCi1XZWQgSnVsIDEyIDAwOjU5OjM0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEdldCBob3N0X21ha2VmaWxlX2ZyYWcgZnJvbSAke3NyY2Rpcn0uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQXV0b2NvbmZpc2NhdGVkLiAgQ2hlY2sgZm9yIHN0cmluZ1tzXS5oLiAgQ3JlYXRlCi0JY29uZmlnLmggZnJvbSBjb25maWcuaW4uICBEb24ndCBzZXQgdXAgc3lzZGVwLmggbGluay4KLQkqIHN5c2RlcC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBOZXcgZmlsZXMsIGdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbi4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIHRvIGJlIHByb2Nlc3NlZCBhdXRvY29uZi1zdHlsZS4KLQkoZGlzdGNsZWFuKTogS2VlcCBzeXNkZXAuaC4gIFJlbW92ZSBjb25maWcubG9nIGFuZCBjb25maWcuY2FjaGUuCi0JKE1ha2VmaWxlKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMuCi0JKGNvbmZpZy5zdGF0dXMpOiBOZXcgcnVsZS4KLQkqIGNvbmZpZ3VyZS5iYXQ6IFVwZGF0ZSBNYWtlZmlsZSBzdWJzdGl0dXRpb25zLgotCi1UdWUgSnVsIDExIDE0OjIzOjM3IDE5OTUgIEplZmYgU3BpZWdlbCAgPGplZmZzQGxzaWwuY29tPgotCi0JKiBtaXBzLW9wYy5jIChMMSk6IERlZmluZS4KLQkobWlwc19vcGNvZGVzKTogQWRkIFI0MDEwIGluc3RydWN0aW9uczogZmx1c2hpLCBmbHVzaGQsIGZsdXNoaWQsCi0JYWRkY2l1LCBtYWRkLCBtYWRkdSwgZmZjLCBmZnMsIG1zdWIsIG1zdWJ1LCBzZWxzaSwgc2Vsc3IsIHdhaXRpLAotCWFuZCB3Yi4KLQotVHVlIEp1bCAxMSAxMTo0OTo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6IEZvciB0aGUgbW92ZSBwc2V1ZG8tb3AsIHByZWZlciBkYWRkdQotCWlmIElTQSAzIGFuZCBhZGR1IG90aGVyd2lzZSwgcmVwbGFjaW5nIG9yLCBzaW5jZSBzb21lIE1JUFMgY2hpcHMKLQloYXZlIG11bHRpcGxlIGFkZCB1bml0cyBidXQgb25seSBhIHNpbmdsZSBsb2dpY2FsIHVuaXQuCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IENoYW5nZSBDUiB0byB1c2UgYSBiaXRzaXplIG9mIDMsCi0Jc2hpZnRlZCBieSAxOCwgd2l0aG91dCBhbnkgaW5zZXJ0aW9uIG9yIGV4dHJhY3Rpb24gZnVuY3Rpb24uCi0JKGluc2VydF9jciwgZXh0cmFjdF9jcik6IFJlbW92ZS4KLQotV2VkIEp1biAyMSAyMDowNTozOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZywgcHJpbnRfaW5kZXhlZCk6IFByaW50ICIlIiBiZWZvcmUKLQlyZWdpc3RlciBuYW1lcy4KLQotVGh1IEp1biAxNSAxNzoyMzozMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBzaCBhbmQgaTM4NiBjb25maWdzLCByZW1vdmUgc3BhcmMgY29uZmlnLgotCSogc2gtb3BjLmg6IEFkZCBjb3B5cmlnaHQuCi0KLU1vbiBKdW4gIDUgMDM6MzA6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY3J1bmNoLW02OGspOiBEZWxldGUgZXh0cmEgdGFyZ2V0IGFjY2lkZW50YWxseQotCWNoZWNrZWQgaW4gYSB3aGlsZSBhZ28uCi0KLVdlZCBNYXkgMjQgMTY6MjI6MTMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfdGFibGUpOiBBZGQgU0gzIHN1cHBvcnQuCi0KLVdlZCBNYXkgMjQgMTQ6MTY6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmg6IEFkZGVkIGJzcmYgYW5kIGJyYWYuCi0KLVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGFybS1vcGMuaCAoYXJtX29wY29kZXMpOiBBZGQgNjQtYml0IG11bHRpcGx5IHBhdHRlcm5zLiAgRGVsZXRlCi0JYm9ndXMgW2xzXWZte2VhLGZkfSBwYXR0ZXJucy4KLQotCSogYXJtLW9wYy5oIChhcm1fb3Bjb2Rlcyk6IENvcnJlY3QgdHlwb3MgaW4gc3RtLCBsZG0sIHN0ZCwgYW5kIGxkYy4KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBNYWtlIEdJVkVOIGEgcGFyYW1ldGVyLCBkb24ndCB0cnkgYW5kCi0JaW5pdGlhbGl6ZSBpdCBmcm9tIG1lbW9yeS4gIE1ha2UgZnVuY3Rpb24gc3RhdGljLgotCShwcmludF9pbnNuX3tiaWcsbGl0dGxlfV9hcm0pOiBOZXcgZnVuY3Rpb25zLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyLCBjYXNlIGJmZF9hcmNoX2FybSk6IERpc2Fzc2VtYmxlIGZvcgotCXRoZSBjb3JyZWN0IGVuZGlhbm5lc3MuCi0KLU1vbiBBcHIgMjQgMTQ6MTg6MDUgMTk5NSAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUsIHNoX2FyZ190eXBlKTogcmVtb3ZlIHRyYWlsaW5nICwgZnJvbQotCWVudW0gbGlzdC4KLQotV2VkIEFwciAxOSAxNDowNzowMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKG9wY29kZSk6IEZpbmlzaCBjaGFuZ2UgbWFkZSBieSBLdW5nIEhzdSBvbiBBcHJpbAotCTE3dGgsIHNvIHRoYXQgaXQgYnVpbGRzIGFnYWluIHVzaW5nIEdDQyBhcyB0aGUgY29tcGlsZXIuCi0KLVR1ZSBBcHIgMTggMTI6MTQ6NTEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9saXR0bGVfbWlwcyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KLQliZmRfZ2V0bDMyIGZyb20gYmZkX3ZtYSB0byB1bnNpZ25lZCBsb25nLCBiZWNhdXNlIF9wcmludF9pbnNuX21pcHMKLQlleHBlY3RzIGFuIHVuc2lnbmVkIGxvbmcsIGFuZCB0aGF0IG1pZ2h0IGJlIGZld2VyIHdvcmRzIG9mCi0JYXJndW1lbnQgc3RvcmFnZSAoZS5nLiwgaWYgYmZkX3ZtYSBpcyBsb25nIGxvbmcgb24gYSAzMi1iaXQKLQltYWNoaW5lKS4KLQkocHJpbnRfaW5zbl9iaWdfbWlwcyk6IExpa2V3aXNlIHdpdGggYmZkX2dldGIzMiB2YWx1ZS4KLQkoX3ByaW50X2luc25fbWlwcyk6IE5vdyBzdGF0aWMuCi0KLU1vbiBBcHIgMTcgMTI6MjM6MjggMTk5NSAgS3VuZyBIc3UgIDxrdW5nQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jOiBUYWtlIG91dCAjZGVmaW5lIEJSRUFLX1VQX0JJR19ERUNMIGtsdWRnZSwgYmVjYXVzZQotCWdjYyBtZW1vcnkgaG9nIHByb2JsZW0gd2l0aCBpbml0aWFsaXplciBpcyBmaXhlZC4KLQotTW9uIEFwciAxMCAxNTo1NTowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KLQkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCi0JKiBtcHctY29uZmlnLmluIChhcmNobmFtZSk6IENvbXB1dGUgZnJvbSB0aGUgY29uZmlnLgotCShCRkRfTUFDSElORVMsIEFSQ0hERUZTKTogUHV0IGludG8gbWsudG1wLgotCi0JKiBtcHctY29uZmlnLmluICh0YXJnZXRfYXJjaCk6IENvbXB1dGUgZnJvbSBjYW5vbmljYWwgdGFyZ2V0LgotCShtNjhrLCBtaXBzLCBwb3dlcnBjLCBzcGFyYyk6IEFkZCBhcmNoaXRlY3R1cmVzLgotCSogbXB3LW1ha2UuaW4gKGRpc2Fzc2VtYmxlLmMubyk6IEFkZC4KLQkoQUxMX0NGTEFHUyk6IFJlbW92ZSBzcGVjaWFsIGZsYWdzICgtbWM2ODAyMCAtbWM2ODg4MSAtbW9kZWwgZmFyKS4KLQotCSogbXB3LWNvbmZpZy5pbiAoQkZEX01BQ0hJTkVTKTogU2V0IHRvIGEgZGVmYXVsdCB2YWx1ZS4KLQkqIG1wdy1tYWtlLmluIChCRkRfTUFDSElORVMpOiBSZW1vdmUgd2lyZWQtaW4gdmFsdWUuCi0KLQkqIG1wdy1tYWtlLmluIChDU0VBUkNIKTogQWRkIGV4dHJhLWluY2x1ZGUgdG8gc2VhcmNoIHBhdGguCi0KLQkqIG1wdy1jb25maWcuaW4gKHZhcmFyZ3MuaCk6IERvbid0IGNyZWF0ZS4KLQkoc3lzZGVwLmgpOiBDcmVhdGUgdXNpbmcgZm9yd2FyZC1pbmNsdWRlLgotCSogbXB3LW1ha2UuaW4gKENTRUFSQ0gpOiBBZGQgaW5jbHVkZS9tcHcgdG8gc2VhcmNoIHBhdGguCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBjb25maWd1cmUuaW4uCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIE1ha2VmaWxlLmluLgotCi1GcmkgTWFyIDMxIDE0OjIzOjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogUHV0IGVtcHR5IHN0YXRlbWVudCBhZnRlcgotCWRlZmF1bHQgbGFiZWwuCi0KLVR1ZSBNYXIgMjEgMTA6NTE6NDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHNpZ25fZXh0ZW5kKTogRGVsZXRlLCByZWR1bmRhbnQgd2l0aCBsaWJocHBhLmggdmVyc2lvbi4KLQkobG93X3NpZ25fZXh0ZW5kKTogTGlrZXdpc2UuCi0JKGdldF9maWVsZCk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKHNldF9maWVsZCwgZGVwb3NpdF8xNCwgZGVwb3NpdF8yMSk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDE3IDE1OjU1OjUzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogU3VwcG9ydCBmb3IgbW9yZSBwZW50aXVtIG9wY29kZXMuICBGcm9tIEd1eSBIYXJyaXMKLQkgIChndXlAbmV0YXBwLmNvbSkuCi0KLVR1ZSBNYXIgMTQgMDA6NTI6NTcgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQlTYXQgRmViIDExIDE3OjIyOjQxIDE5OTUgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAZGlkeW11cy5ybWkuZGUpCi0KLQkqIGFscGhhLW9wYy5oIChPU0ZfQVNNQ09ERSk6IGRlZmluZQotCXByaW50IHBhbC1jb2RlIG5hbWVzIGFzIGRlZmluZWQgaW4gQXBwIEMgb2YgdGhlCi0JQWxwaGEgQXJjaGl0ZWN0dXJlIFJlZmVyZW5jZSBNYW51YWwKLQotCSogYWxwaGEtZGlzLmM6IGNsZWFuZWQgdXAgb3V0cHV0Ci0JcHJpbnQgc3R5bGl6ZWQgY29kZSBmb3JtcyBhcyBkZWZpbmVkIGluIEFwcCBBLjQuMyBvZiB0aGUKLQlBbHBoYSBBcmNoaXRlY3R1cmUgUmVmZXJlbmNlIE1hbnVhbAotCi1XZWQgTWFyICA4IDE1OjIxOjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIG5ldyBtaXBzNCBpbnN0cnVjdGlvbnMuICBEb24ndCBzZXQgSU5TTl9SRkUgZm9yCi0JYHJmZScuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgYXJndW1lbnQgdHlwZXMgJ2gnLCAnUicsCi0JJ04nLCBhbmQgJ00nLgotCi1XZWQgTWFyICA4IDAyOjU0OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKG9wY29kZSk6IE5ldyBmdW5jdGlvbi4gIFJldHVybnMgYWRkcmVzcyBvZiBvcGNvZGUKLQl0YWJsZSBlbnRyeSBnaXZlbiBpbmRleCwgZXZlbiBpZiB0aGUgb3Bjb2RlIHRhYmxlIHdhcyBzcGxpdCB0bwotCXdvcmsgYXJvdW5kIGdjYyBidWdzLgotCShwcmludF9pbnNuX202OGspOiBDYWxsIG9wY29kZSBpbnN0ZWFkIG9mIHJlZmVyZW5jaW5nIG02OGtfb3Bjb2RlcwotCWRpcmVjdGx5LgotCShCUkVBS19VUF9CSUdfREVDTCk6IE1ha2Ugc2Vjb25kYXJ5IGFycmF5IHN0YXRpYyBhbmQgY29uc3QuCi0JKHJlZ19uYW1lcyk6IE5vdyBjb25zdC4KLQkocHJpbnRfaW5zbl9hcmcpOiBBcnJheXMgY2FjaGVGaWVsZE5hbWUgYW5kIG5hbWVzIG5vdyBjb25zdC4KLQkocHJpbnRfaW5kZXhlZCk6IEFycmF5IHNjYWxlcyBub3cgY29uc3QuCi0KLVR1ZSBNYXIgIDcgMTY6NDE6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmM6IFNvcnQgcmVjZW50bHkgYWRkZWQgaW5zdHJ1Y3Rpb25zIGJ5IG1pbm9yIG9wY29kZQotCW51bWJlciB3aXRoaW4gbWFqb3Igb3Bjb2RlIG51bWJlci4KLQotTW9uIE1hciAgNiAxMDowNDozNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYzogSW5jbHVkZSBsaWJocHBhLmguCi0KLUZyaSBGZWIgMjQgMTk6MTU6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBDaGFuZ2UgZGxpIHRvIHVzZSBNX0RMSSwgYW5kIGFkZCBkbGEuCi0KLU1vbiBGZWIgMjAgMjM6NTQ6MzggMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogIEFkZCB3NjUtZGlzLm8uCi0KLVRodSBGZWIgMTYgMTc6MzQ6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgcjQ2NTAgbXVsIGluc3RydWN0aW9uLgotCi1XZWQgRmViIDE1IDE1OjQ1OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIHVsZCBhbmQgdXNkIG1hY3JvcyBmb3IgdW5hbGlnbmVkIGRvdWJsZSBsb2FkIGFuZAotICAgICAgICBzdG9yZS4KLQotVHVlIEZlYiAxNCAxMzoxNzozNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQWRkIDQwM0dBIG9wY29kZXMgcmZjaSwgZGNjY2ksCi0JbWZkY3IsIG10ZGNyLCBpY2J0LCBpY2NjaS4KLQotVGh1IEZlYiAgOSAxMjoyODoxMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGlzLmMgKHN0cnVjdCB0YWJlbnQsIHN0cnVjdCBzcGFyc2VfdGFiZW50KTogQ2hhbmdlIHRoZQotICAgICAgICBzaWduZWQgY2hhciBmaWVsZHMgdG8gc2hvcnRzLCBtb3JlIHBvcnRhYmxlLgotCi1XZWQgRmViICA4IDE3OjI5OjI5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogaTk2MC1kaXMuYyAoc3RydWN0IHRhYmVudCwgc3RydWN0IHNwYXJzZV90YWJlbnQpOiBEZWNsYXJlIHRoZQotICAgICAgICBjaGFyIGZpZWxkcyBhcyBzaWduZWQgY2hhcnMsIHNpbmNlIHRoZXkgbWF5IGhhdmUgbmVnYXRpdmUgdmFsdWVzLgotCi1Nb24gRmViICA2IDEwOjUyOjA2IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X3R3b2J5dGUpOiBBZGQgY3B1aWQsIEZyb20gQ2hhcmxlcyBIYW5udW0KLQkgIChteWNyb2Z0QG5ldGJzZC5vcmcpLgotCi1Nb24gSmFuIDMwIDEyOjM4OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gIkxvZ2csIEVkIiA8ZWxvZ2dAZWEuY29tPjoKLQkqIHBwYy1vcGMuYyAoZXh0cmFjdF9iZG0pOiBDb3JyZWN0IHBhcmVudGhlemlzYXRpb24uCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fcG93ZXJwYyk6IFByaW50IC5sb25nIGJlZm9yZSB1bnJlY29nbml6ZWQKLQl2YWx1ZS4KLQotVGh1IEphbiAyNiAxODozMjowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYzogQ2hhbmdlcyBiYXNlZCBvbiBwYXRjaCBmcm9tIERhdmlkIEVkZWxzb2huCi0JPGVkZWxzb2huQG1ocGNjLmVkdT4uCi0JKHBvd2VycGNfb3BlcmFuZHMpOiBBZGQgb3BlcmFuZHMgU1BSQkFUIGFuZCBTUFJHLiBTcGxpdCBUQlIgb3V0IG9mCi0JU1BSLgotCShGWE1fTUFTSyk6IERlZmluZS4KLQkoaW5zZXJ0X3Ricik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGV4dHJhY3RfdGJyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoWEZYRlhNX01BU0ssIFhGWE0pOiBEZWZpbmUuCi0JKFhTUFJCQVRfTUFTSywgWFNQUkdfTUFTSyk6IERlZmluZS4KLQkocG93ZXJwY19vcGNvZGVzKTogQWRkIGluc3RydWN0aW9ucyB0byBhY2Nlc3Mgc3BlY2lhbCByZWdpc3RlcnMgYnkKLQluYW1lLiAgQWRkIG10Y3IgYW5kIG1mdGJ1LgotCi1UdWUgSmFuIDE3IDEwOjU2OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoUDMpOiBEZWZpbmUuCi0JKG1pcHNfb3Bjb2Rlcyk6IEFkZCBtYWQgYW5kIG1hZHUuCi0KLVN1biBKYW4gMTUgMTY6MzI6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIFc2NSBzdXBwb3J0LgotCSogZGlzYXNzZW1ibGUuYzogTGlrZXdpc2UuCi0JKiB3NjUtb3BjLmgsIHc2NS1kaXMuYzogTmV3IGZpbGVzLgotCi1XZWQgRGVjIDI4IDIyOjE1OjMzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3IgMiBiaXQKLQlpbW1lZGlhdGVzLgotCi1UdWUgRGVjIDIwIDExOjI1OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIGRsaSBhcyBhIHN5bm9ueW0gZm9yIGxpLgotCi1UaHUgRGVjICA4IDE4OjIzOjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogSGFuZGxlIGNhbGxfcGFsIGluc3RydWN0aW9uLCBhbmQKLQlwcmludCBzb21ldGhpbmcgZm9yIHJlc2VydmVkIG9wY29kZSB2YWx1ZXMsIGV2ZW4gaWYgaXQgd29uJ3QKLQlhc3NlbWJsZSBhZ2Fpbi4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFdoZW4gaW5pdGlhbGl6aW5nLCBzaGlmdCByaWdodAotCWFuZCBtYXNrLCB0byBhdm9pZCBzaWduIGV4dGVuc2lvbiBwcm9ibGVtcyBvbiB0aGUgQWxwaGEuCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnLCBjYXNlICdKJyk6IEhhbmRsZSBidXNjciBhbmQgcGNyCi0JY29udHJvbCByZWdpc3RlcnMuCi0KLVdlZCBOb3YgMjMgMjI6MzQ6NTEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc2gtb3BjLmggKG1vdi5sIGdicik6IEdldCBkaXJlY3Rpb24gcmlnaHQuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2luc25fc2hsLCBwcmludF9pbnNuX3NoKTogQ2FsbCBwcmludF9pbnNuX3NoeCB0bwotCXByaW50IG9wY29kZXMgd2l0aCByaWdodCBieXRlIG9yZGVyLgotCi1UaHUgTm92ICAzIDE5OjMyOjIyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG5zMzJrLWRpcy5jIChzdHJ1Y3QgbnMzMmtfb3B0aW9uKTogUmVuYW1lZCBmcm9tIHN0cnVjdCBvcHRpb24sCi0JdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZ2V0b3B0LgotCi1Nb24gT2N0IDMxIDE4OjQ4OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogUmVhZCB0aGUgaW5zdHJ1Y3Rpb24gdXNpbmcKLQliZmRfZ2V0YjMyLCBzbyB0aGF0IGl0IHdvcmtzIG9uIGEgbGl0dGxlIGVuZGlhbiBvciA2NCBiaXQgaG9zdC4KLQlSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIG9wLgotCi1UdWUgT2N0IDI1IDE3OjA3OjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogVXNlIG9yIGluc3RlYWQgb2YgYWRkdSBmb3IgcHNldWRvLW9wIG1vdmUsIHNpbmNlCi0JYWRkdSBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBpZiAtbWlwczMuCi0KLVdlZCBPY3QgMTkgMTM6NDA6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhMjlrLWRpcy5jIChwcmludF9zcGVjaWFsKTogQWRkIHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgZGVmaW5lZAotCW9uIDI5MDMwLCAyOTA0MCBhbmQgMjkwNTAuCi0JKHByaW50X2luc24pOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSAnSScuCi0KLVdlZCBPY3QgMTIgMTE6NTk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFVzZSB0b3AgbGV2ZWwgaW5zdGFsbC5zaCBzY3JpcHQuCi0KLVdlZCBPY3QgIDUgMTk6MTY6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYzogUmV3cml0ZSB0byB1c2UgYml0ZmllbGRzLCByYXRoZXIgdGhhbiBhIHVuaW9uLCBzbwotCXRoYXQgaXQgd29ya3Mgb24gYSBsaXR0bGUgZW5kaWFuIGhvc3QuCi0KLVR1ZSBPY3QgIDQgMTI6MTQ6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCi0KLVdlZCBTZXAgMjEgMTg6NDk6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChtaXBzX29wY29kZXMpOiAiZGFicyIgaXMgb25seSBhdmFpbGFibGUgd2l0aCAtbWlwczMuCi0KLVRodSBTZXAgMTUgMTY6MzA6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogUHJpbnQgdGhlIG9wY29kZS4KLQotV2VkIFNlcCAxNCAxNzo1MjoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6IFNldCBXUl90IGZvciBzYyBhbmQgc2NkLgotCi1TdW4gU2VwIDExIDIyOjMyOjE3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChyZWdfbmFtZXMpOiBVc2UgcjI2LXIyMyBmb3IgYXJnMC1hcmczLgotCi1UdWUgU2VwICA2IDExOjM3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogU2V0IElOU05fU1RPUkVfTUVNT1JZIGZsYWcgZm9yIGFsbCBpbnN0cnVjdGlvbnMKLQl3aGljaCBzdG9yZSBhIHZhbHVlIGludG8gbWVtb3J5LgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW4sIGRpc2Fzc2VtYmxlLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgQVJNLgotCSogYXJtLWRpcy5jLCBhcm0tb3BjLmg6IE5ldyBmaWxlcy4KLQotRnJpIEF1ZyAgNSAxNDowMDowNSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChuczMyay1kaXMubyk6IEFkZCBkZXBlbmRlbmN5LgotCSogbnMzMmstZGlzLmMgKHByaW50X2luc25fYXJnKTogRGVjbGFyZSBpbml0aWFsaXplZCBsb2NhbCBhcwotCXN0cmluZywgbm90IGFzIGFycmF5IG9mIGNoYXJzLgotCi1UaHUgSnVsIDI4IDE4OjE0OjE2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgJ3gnLgotCi0JKiBzcGFyYy1vcGMuYzogQWRkZWQgc3BhcmNsaXRlIGV4dGVuZGVkIEZQIG9wZXJhdGlvbnMsIGFuZAotCXZlcnNpb25zIG9mIHY5IGltcGRlcCogaW5zdHJ1Y3Rpb25zIHBlcm1pdHRpbmcgc3BlY2lmaWNhdGlvbiBvZgotCXRoZSBPUEYgZmllbGQuCi0KLVR1ZSBKdWwgMjYgMTY6MzY6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocmVnX25hbWVzKTogTm93IGNvbnN0LgotCShzdHJ1Y3Qgc3BhcnNlX3RhYmVudCk6IE5ldyB0eXBlLCBjb3BpZWQgZnJvbSBhcnJheSB0eXBlIGluIG1lbQotCWZ1bmN0aW9uLgotCShjdHJsKTogTG9jYWwgc3RhdGljIGFycmF5IGN0cmxfdGFiIG5vdyBjb25zdC4KLQkoY29icik6IExvY2FsIHN0YXRpYyBhcnJheSBjb2JyX3RhYiBub3cgY29uc3QuCi0JKG1lbSk6IExvY2FsIHZhcmlhYmxlcyByZWcxLCByZWcyLCByZWczIG5vdyBwb2ludCB0byBjb25zdC4gIExvY2FsCi0Jc3RhdGljIHZhcmlhYmxlIG1lbV90YWIgbm8gbG9uZ2VyIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuICBDaGFuZ2VkCi0JbWVtX2luaXQgdG8gY29uc3QgYXJyYXkgb2Ygc3RydWN0IHNwYXJzZV90YWJlbnQuCi0JKHJlZyk6IExvY2FsIHN0YXRpYyB2YXJpYWJsZSByZWdfdGFiIG5vIGxvbmdlciBleHBsaWNpdGx5Ci0JaW5pdGlhbGl6ZWQuICBDaGFuZ2VkIHJlZ19pbml0IHRvIGNvbnN0IGFycmF5IG9mIHN0cnVjdAotCXNwYXJzZV90YWJlbnQuCi0JKGVhKTogTG9jYWwgc3RhdGljIGFycmF5IHNjYWxlX3RhYiBub3cgY29uc3QuCi0KLQkqIGk5NjAtZGlzLmMgKHJlZyk6IEFkZGVkIGk5NjBKWCBpbnN0cnVjdGlvbnMgdG8gcmVnX2luaXQgdGFibGUuCi0JKFJFR19NQVgpOiBVcGRhdGVkLgotCi1UdWUgSnVsIDE5IDIxOjAwOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdGhlIGRpc2Fzc2VtYmVyIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yCi0JIm9iamR1bXAgLWQiIHRvIHdvcmsgaW4gZGpncHAuCi0KLVdlZCBKdWwgMTMgMTg6MDE6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbnMzMmstZGlzLmM6IERlbGV0ZWQgYWxsIGNvZGUgaW4gIiNpZmRlZiBHREIiLgotCShpbnZhbGlkX2Zsb2F0KTogRW5hYmxlZCBnZW5lcmFsIHZlcnNpb24sIGRvZXNuJ3QgcmVxdWlyZSBydW5uaW5nCi0Jb24gbnMzMmsgaG9zdC4gIENoYW5nZWQgdG8gdGFrZSBjaGFyKiBhcmd1bWVudCwgYW5kIHRlc3QgZm9yCi0JZXhwbGljaXRseSBzcGVjaWZpZWQgc2l6ZXMsIGluc3RlYWQgb2YgdXNpbmcgc2l6ZW9mKCkgb24gaG9zdCBDUFUKLQl0eXBlcy4KLQkoSU5WQUxJRF9GTE9BVCk6IENhc3QgZmlyc3QgYXJndW1lbnQuCi0JKG9wdF91LCBvcHRfVSwgb3B0X08sIG9wdF9DLCBvcHRfUywgbGlzdF9QNTMyLCBsaXN0X001MzIsCi0JbGlzdF9QMDMyLCBsaXN0X00wMzIpOiBOb3cgY29uc3QuCi0JKG9wdGxpc3QsIGxpc3Rfc2VhcmNoKTogTWFkZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMgbm93IHBvaW50IHRvCi0JY29uc3QuCi0JKHByaW50X2luc25fYXJnKTogQ2hhbmdlZCBzdGF0aWMgYXJyYXkgb2Ygb25lLWNoYXJhY3Rlci1zdHJpbmcKLQlwb2ludGVycyBpbnRvIGEgc3RhdGljIGNvbnN0IGFycmF5IG9mIGNoYXJhY3RlcnM7IGZpeGVkIHNwcmludGYKLQlzdGF0ZW1lbnQgYWNjb3JkaW5nbHkuCi0KLVN1biBKdWwgMTAgMDA6Mjc6NDcgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIG9wY29kZXMvbnMzMmstZGlzLmM6IFNlbWktbmV3IGZpbGUuICBIYWQgYXBwYXJlbnRseSBiZWVuIGRyb3BwZWQKLQlmcm9tIGRpc3RyaWJ1dGlvbi4gQSBuczMyay1kaXMuYyBmcm9tIGEgcHJldmlvdXMgZGlzdHJpYnV0aW9uIGhhcwotCWJlZW4gYnJvdWdodCB1cCB0byBkYXRlIGFuZCBzdXBwb3J0cyB0aGUgbmV3IGludGVyZmFjZS4KLQotCSogZGlzYXNzZW1ibGUuYzogZGVmaW5lIEFSQ0hfbnMzMmsgYW5kIGFkZCBjYXNlIGJmZF9hcmNoX25zMzJrLgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBiZmRfbnMzMmtfYXJjaCB0YXJnZXQgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBuczMyay1kaXMubyB0byBBTExfTUFDSElORVMuCi0JQWRkIG5zMzJrLWRpcy5jIHRvIENGSUxFUy4gQWRkIGRlcGVuZGVuY2llcyBmb3IgbnMzMmstZGlzLm8uCi0KLVdlZCBKdW4gMjkgMjI6MTA6MzcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEdldCAxNmJpdCBicmFuY2gKLQlkaXNhc3NlbWJseSByaWdodC4KLQotVHVlIEp1biAyOCAxMzoyMjowNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jLCBtaXBzLWRpcy5jOiBEb24ndCB1c2UgdHJ1ZSBhbmQgZmFsc2UuCi0KLVRodSBKdW4gMjMgMTI6NTM6MTkgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1XZWQgSnVuIDIyIDEzOjM4OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IEJ1aWxkIGEgc3RhdGljIGhhc2ggdGFibGUgbWFwcGluZwotCW9wY29kZXMgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIHdpdGggdGhhdCBvcGNvZGUsIHRvIHNwZWVkCi0JZGlzYXNzZW1ibHkgb2YgbGFyZ2UgZmlsZXMuICBGcm9tIHJhbHBoY0BweXJhbWlkLmNvbSAoUmFscGgKLQlDYW1wYmVsbCkuCi0KLVR1ZSBKdW4gIDcgMTI6NDk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBGaXggdHlwbyAod2FzIG1vc3R5Y2xlYW4pLgotCi1XZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIHRvIGxhdGVzdCBtYWtlZmlsZS5pbgotCi1TYXQgTWF5ICA3IDE3OjEzOjIxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBQcmludCAneCcgdHlwZSBvcGVyYW5kIGluIGhleC4KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBQcmludCAxNmJpdCByZWxzIGNvcnJlY3RseS4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoKTogRG9uJ3QgcmVjdXIgZW5kbGVzc2x5IGlmIGRlbGF5Ci0Jc2xvdCBpbnNuIGlzIGluIGEgZGVsYXkgc2xvdC4KLQkqIHo4ay1vcGMuaDogKHJlc2ZsZyk6IEZpeCBwYXR0ZXJucy4KLQkqIGg4NTAwLW9wYy5oIEZpeCBDUiBpbnNuIHBhdHRlcm5zLgotCi1GcmkgTWF5ICA2IDE0OjM0OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBQdXQgUG93ZXJQQyB2ZXJzaW9ucyBvZiAiY21wIiBhbmQKLQkiY21wbCIgYmVmb3JlIFBPV0VSIHZlcnNpb25zLCBzbyB0aGF0IGdhcyAtbWFueSB1c2VzIHRoZW0uCi0KLVRodSBBcHIgMjggMTg6MzI6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZGlzYXNzZW1ibGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogQWRkIGRpc2Fzc2VtYmxlLm8uCi0JKGRpc2Fzc2VtYmxlLm8pOiBQcm92aWRlIGRlcGVuZGVuY2llczsgY29tcGlsZSB3aXRoICQoQVJDSERFRlMpLgotCSogY29uZmlndXJlLmluOiBEZWZpbmUgQVJDSERFRlMgaW4gTWFrZWZpbGUuICBDb2RlIHRha2VuIGZyb20KLQliaW51dGlscy9jb25maWd1cmUuaW4uCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IElmIEZfQUxJQVMgZmxhZyBpcyBzZXQsIHNraXAgdGhlCi0Jb3Bjb2RlIGJlaW5nIGV4YW1pbmVkLgotCi1UaHUgQXByIDIxIDE3OjA4OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogQWRkZWQgUkFMLCBSQU0gYW5kIFJBUy4KLQkoaW5zZXJ0X3JhbCwgaW5zZXJ0X3JhbSwgaW5zZXJ0X3Jhcyk6IE5ldyBmdW5jdGlvbnMuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IFVzZSBSQUwgZm9yIGxvYWQgd2l0aCB1cGRhdGUsIFJBTSBmb3IgbG13LCBhbmQKLQlSQVMgZm9yIHN0b3JlIHdpdGggdXBkYXRlLgotCi1TYXQgQXByIDE2IDIzOjQxOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBDb3JyZWN0IGZjaXIuICBGcm9tIERhdmlkIEVkZWxzb2huCi0JKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkuCi0KLVdlZCBBcHIgIDYgMTc6MTE6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChtaXBzX29wY29kZXMpOiBDb3JyZWN0IG9wZXJhbmRzIG9mICJub3IiIHdpdGggYW4KLQlpbW1lZGlhdGUgYXJndW1lbnQuCi0KLU1vbiBBcHIgIDQgMTY6MzA6NDYgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggInJkICVmcHJzLCVsMCIuCi0KLU1vbiBBcHIgIDQgMTM6MjI6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBUaGUgc2lnbmVkcCBmaWVsZCBoYXMgYmVlbgotCXJlbW92ZWQsIHNvIGRvbid0IGluaXRpYWxpemUgaXQuICBTZXQgdGhlIFBQQ19PUEVSQU5EX1NJR05FRCBmbGFnCi0JaW5zdGVhZC4gIEFkZCBuZXcgb3BlcmFuZCBTSVNJR05PUFQuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IEZvciBsaXMsIGxpdSwgYWRkaXMsIGFuZCBjYXUgdXNlIFNJU0lHTk9QVC4KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIERhdmlkIEVkZWxzb2huIChlZGVsc29obkBucGFjLnN5ci5lZHUpLgotCSogcHBjLWRpcy5jIChwcmludF9pbnNuX3Bvd2VycGMpOiBDaGVjayBQUENfT1BFUkFORF9TSUdORUQgcmF0aGVyCi0JdGhhbiBzaWduZWRwIGZpZWxkLgotCi1XZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaTM4Ni1kaXMuYyAoc3RydWN0IHByaXZhdGUpOiAgUmVuYW1lZCB0byBkaXNfcHJpdmF0ZS4gYHByaXZhdGUnCi0JaXMgYSByZXNlcnZlZCB3b3JkIGZvciBkeW5peCBjYy4KLQotTW9uIE1hciAyOCAxMzowMDoxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgdG8gcmVmZXIgdG8gYmZkL2NvbmZpZy5iZmQKLQlyYXRoZXIgdGhhbiBiZmQvY29uZmlndXJlLmluLgotCi1Nb24gTWFyIDI4IDEyOjI4OjMwIDE5OTQgIERhdmlkIEVkZWxzb2huICAoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KQotCi0JKiBwcGMtb3BjLmM6IERlZmluZSBQT1dFUjIgYXMgc2hvcnQgYWxpYXMgZmxhZy4KLQkocG93ZXJwY19vcGNvZGVzKTogQWRkIFBPV0VSLzIgb3Bjb2RlcyBsZnEqLCBzdGZxKiwgZmNpclt6XSwgYW5kCi0JZnNxcnQuCi0KLVdlZCBNYXIgMjMgMTI6MjM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBEb24ndCByZWFkIGEgc2Vjb25kIHdvcmQgZm9yCi0Jb3Bjb2RlcyAwLCAxLCAyIGFuZCAzLgotCi1XZWQgTWFyIDE2IDE1OjM3OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBtNjg4ODEtZXh0Lm8gZm9yIGJmZF9tNjhrX2FyY2guCi0KLU1vbiBNYXIgMTQgMTQ6NTM6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtNjg4ODEtZXh0LmM6IFJlbW92ZWQ7IG5vIGxvbmdlciB1c2VkLgotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0KLQkqIG02OGstZGlzLmMgKGV4dF9mb3JtYXRfNjg4ODEpOiBEb24ndCBkZWNsYXJlLgotCShwcmludF9pbnNuX202OGspOiBJZiBhbiBpbnN0cnVjdGlvbiB1c2VzIHBsYWNlICdpJywgaXQgdXNlcyBhdAotCWxlYXN0IGZvdXIgZml4ZWQgYnl0ZXMuCi0JKHByaW50X2luc25fYXJnKTogRG9uJ3QgYnVtcCBwIGJ5IDIgZm9yIGNhc2UgJ0knLCBwbGFjZSAnaScuICBGb3IKLQlleHRlbmRlZCBmbG9hdCwgY29udmVydCB0byBkb3VibGUgdXNpbmcgZmxvYXRmb3JtYXRfdG9fZG91YmxlLCBub3QKLQlpZWVlX2V4dGVuZGVkX3RvX2RvdWJsZSwgYW5kIGZldGNoIHRoZSBkYXRhIGJlZm9yZSBjb252ZXJ0aW5nIGl0LgotCi1UdWUgTWFyICA4IDE4OjEyOjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogSXQncyBzcXJ0LnMsIG5vdCBzcXJ0LncuICBGcm9tCi0JZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKS4KLQotVHVlIEZlYiAgOCAxNjo1NToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogVGhlIFBPV0VSIHVzZXMgYmRuW2xdW2FdIHdoZXJlIHRoZQotCVBvd2VyUEMgdXNlcyBiZG56W2xdW2FdLgotCi1UdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZGlzLWJ1Zi5jLCBpMzg2LWRpcy5jOiAgSW5jbHVkZSBzeXNkZXAuaC4KLQotTW9uIEZlYiAgNyAxOToyMjoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX3Bvd2VycGNfYXJjaCk6IFVzZSBwcGMtZGlzLm8gYW5kIHBwYy1vcGMuby4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBNYXJrIFBPV0VSIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQKLQlieSBNb3Rvcm9sYSBQb3dlclBDIDYwMSB3aXRoIFBQQ19PUENPREVfNjAxLgotCSogcHBjLWRpcy5jIChwcmludF9pbnNuX2JpZ19wb3dlcnBjLCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjKToKLQlEaXNhc3NlbWJsZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSBpbnN0cnVjdGlvbnMgYXMgd2VsbCBhcyBub3JtYWwKLQlQb3dlclBDIGluc3RydWN0aW9ucy4KLQotU3VuIEZlYiAgNiAwNzo0NToxNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocmVnLCBtZW0pOiBKdXN0IHVzZSBhIHN0YXRpYyBhcnJheSBpbnN0ZWFkIG9mCi0JY2FsbGluZyB4bWFsbG9jLgotCi1TYXQgRmViICA1IDAwOjA0OjAyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBGb3IgJz8nIGFuZCAnQCcgb25seSBhZGp1c3QgdGhlCi0JY29uZGl0aW9uIG5hbWUgaW5kZXggaWYgdGhpcyBpcyBmb3IgYSBuZWdhdGVkIGNvbmRpdGlvbi4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogTm8gc3BhY2UgYmVmb3JlICdIJyBvcGVyYW5kLgotCUZsb2F0aW5nIHBvaW50IGZvcm1hdCBmb3IgJ0gnIG9wZXJhbmQgaXMgYmFja3dhcmRzIGZyb20gbm9ybWFsCi0JY2FzZSAoMCA9PSBkb3VibGUsIDEgPT0gc2luZ2xlKS4gIEZvciAnNCcsICc2JywgJzcnLCAnOScsIGFuZCAnOCcKLQlvcGVyYW5kcyAoZm1weWFkZCBhbmQgZm1weXN1YiksIGhhbmRsZSBiaXphcnJlIHJlZ2lzdGVyCi0JdHJhbnNsYXRpb24gY29ycmVjdGx5IGZvciBzaW5nbGUgcHJlY2lzaW9uIGZvcm1hdC4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogRG8gbm90IGVtaXQgYSBzcGFjZSBhZnRlciAnRicKLQlvciAnSScgb3BlcmFuZHMgaWYgdGhlIG5leHQgZm9ybWF0IHNwZWNpZmllciBpcyAnTScgKGZjbXAKLQljb25kaXRpb24gY29tcGxldGVyKS4KLQotRmViICA0IDIzOjM4OjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogTmV3IG9wZXJhbmQgdHlwZSBNQkUgdG8gaGFuZGxlIGEKLQlzaW5nbGUgbnVtYmVyIGdpdmluZyBhIGJpdG1hc2sgZm9yIHRoZSBNQiBhbmQgTUUgZmllbGRzIG9mIGFuIE0KLQlmb3JtIGluc3RydWN0aW9uLiAgQ2hhbmdlIE5CIHRvIGFjY2VwdCAzMiwgYW5kIHR1cm4gaXQgaW50byAwOwotCWFsc28gdHVybiAwIGludG8gMzIgd2hlbiBkaXNhc3NlbWJsaW5nLiAgU2VwZXJhdGVkIFNIIGZyb20gTkIuCi0JKGluc2VydF9tYmUsIGV4dHJhY3RfbWJlKTogTmV3IGZ1bmN0aW9ucy4KLQkoaW5zZXJ0X25iLCBleHRyYWN0X25iKTogTmV3IGZ1bmN0aW9ucy4KLQkoU0NfTUFTSyk6IE1hc2sgb3V0IFNBIGFuZCBMSyBiaXRzLgotCShwb3dlcnBjX29wY29kZXMpOiBDaGFuZ2UgImNhbCIgdG8gdXNlIFJULCBELCBSQSByYXRoZXIgdGhhbiBSVCwKLQlSQSwgU0kuICBDaGFuZ2UgImxpdSIgYW5kICJjYXUiIHRvIHVzZSBVSSByYXRoZXIgdGhhbiBTSS4gIE1hcmsKLQkiYmN0ciIgYW5kICJiY3RybCIgYXMgYWNjZXB0ZWQgYnkgUE9XRVIuICBDaGFuZ2UgInJsd2ltaSIsCi0JInJsaW1pIiwgInJsd2ltaS4iLCAicmxpbWkuIiwgInJsd2lubSIsICJybGlubSIsICJybHdpbm0uIiwKLQkicmxpbm0uIiwgInJsbWkiLCAicmxtaS4iLCAicmx3bm0iLCAicmxubSIsICJybHdubS4iLCAicmxubS4iIHRvCi0JdXNlIE1CRSByYXRoZXIgdGhhbiBNQi4gIEFkZCAibWZtcSIgYW5kICJtdG1xIiBQT1dFUiBpbnN0cnVjdGlvbnMuCi0JKHBvd2VycGNfbWFjcm9zKTogRGVmaW5lIHRhYmxlIG9mIG1hY3JvIGRlZmluaXRpb25zLgotCShwb3dlcnBjX251bV9tYWNyb3MpOiBEZWZpbmUuCi0KLQkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9wb3dlcnBjKTogRG9uJ3Qgc2tpcCBvcHRpb25hbCBvcGVyYW5kcwotCWlmIFBQQ19PUEVSQU5EX05FWFQgaXMgc2V0LgotCi1TYXQgSmFuIDIyIDIzOjEwOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogTWFrZSBidWZmZXIgYmZkX2J5dGUgaW5zdGVhZCBvZgotCWNoYXIuICBSZXRyaWV2ZSBjb250ZW50cyB1c2luZyBiZmRfZ2V0bDMyIGluc3RlYWQgb2Ygc2hpZnRpbmcuCi0KLUZyaSBKYW4gMjEgMTk6MDE6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmM6IE5ldyBmaWxlLiAgT3Bjb2RlIHRhYmxlIGZvciBQb3dlclBDLCBpbmNsdWRpbmcKLQlvcGNvZGVzIGZvciBQT1dFUiAoUlMvNjAwMCkuCi0JKiBwcGMtZGlzLmM6IE5ldyBmaWxlLiAgUG93ZXJQQyBhbmQgUG93ZXIgKFJTLzYwMDApIGRpc2Fzc2VtYmxlci4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgcHBjLWRpcy5vIGFuZCBwcGMtb3BjLm8uCi0JKENGSUxFUyk6IEFkZCBwcGMtZGlzLmMuCi0JKHBwYy1kaXMubywgcHBjLW9wYy5vKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIHBwYy1kaXMubyBhbmQgcHBjLW9wYy5vIGZvciBiZmRfcnM2MDAwX2FyY2guCi0KLU1vbiBKYW4gMTcgMjA6MDU6NDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnTicgaW4gYXNzZW1ibGVyIHRlbXBsYXRlLgotCU5vIHNwYWNlIGJlZm9yZSAndScsICdmJywgb3IgJ04nLgotCi1TdW4gSmFuIDE2IDE0OjIwOjE2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2kzODYpOiBBZGQgRklYTUUgY29tbWVudCByZWdhcmRpbmcgcmVhZGluZwotCWZhcnRoZXIgdGhhbiB3ZSBzaG91bGQuCi0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nik6IFVzZSBZYiBhbmQgWXYgZm9yIHNjYXNiIGFuZCBzY2FzUy4KLQotVGh1IEphbiAgNiAxMjozODowNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jIG02OGstZGlzLmMgYWxwaGEtZGlzLmMgYTI5ay1kaXMuYzogRml4IGNvbW1lbnRzLgotCi1XZWQgSmFuICA1IDExOjU2OjIxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogT25seSByZWFkIHdvcmQyIGlmIHRoZSBpbnN0cnVjdGlvbgotCW5lZWRzIGl0LCB0byBwcmV2ZW50IHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4KLQotV2VkIE5vdiAxNyAxNzoyMDoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmg6IFVzZSBtYWNybyBmb3IgaiBpbnN0cnVjdGlvbiwgdG8gc3VwcG9ydCBTVlI0IFBJQy4KLQlSZW1vdmVkIHQsQSBjYXNlIGZvciBsYTsgYWx3YXlzIHVzZSB0LEEoYikgY2FzZS4KLQotTW9uIE5vdiAgOCAxMjozNzozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlGcm9tIFRlZCBMZW1lbiA8bWVsbG9uQHBlcHBlci5uY2QuY29tPgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgJ2snLgotCSogbWlwcy1vcGMuYzogTWFrZSBjYWNoZSB1c2Ugaywgbm90IHQuCi0KLVN1biBOb3YgIDcgMjM6NTI6MzQgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS1vcGMuaCwgYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiAgQWRkCi0JRkxPQVRfTUVNT1JZX0ZPUk1BVF9DT0RFLCBGTE9BVF9CUkFOQ0hfRk9STUFUX0NPREUsIGNvcnJlY3QKLQlGTE9BVF9GT1JNQVRfQ09ERSB0byBwdXQgb3V0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG5hbWVzLgotCi1Nb24gTm92ICAxIDE4OjE3OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogVXNlIG1hY3JvcyBmb3IgamFsIHZhcmlhbnRzLCB0byBzdXBwb3J0IFNWUjQgUElDLgotCi1UaHUgT2N0IDI4IDE3OjQyOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IFVzZSAweCUwOHgsIG5vdCAweCU4eC4KLQotV2VkIE9jdCAyNyAxMTo0ODowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKGRzbGwsIGRzcmEsIGRzcmwpOiBBZGRlZCAnPicgY2FzZXMgZm9yIHNoaWZ0IGNvdW50cwotCWxhcmdlciB0aGFuIDMyLiAgTW92ZWQgZHN4eDMyIHZhcmlhbnRzIGZpcnN0IGZvciBkaXNhc3NlbWJsZXIuCi0KLU1vbiBPY3QgMjUgMTE6MzM6MTQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogejhrZ2VuLmMsIHo4ay1vcGMuaDogQWRkIGZ1bGwgbGRhIGluZm9ybWF0aW9uLgotCi1UdWUgT2N0IDE5IDEyOjM5OjI1IDE5OTMgIEplZmZyZXkgQSBMYXcgIChsYXdAY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IERvIG5vdCBlbWl0IGEgc3BhY2UgYWZ0ZXIKLQltb3ZiIGluc3RydWN0aW9ucy4gIEFueSBuZWNlc3Nhcnkgc3BhY2Ugd2lsbCBiZSBlbWl0dGVkIGJ5Ci0JdGhlIGNvZGUgdG8gaGFuZGxlIG51bGxpZmljYXRpb24gY29tcGxldGVycy4KLQotV2VkIE9jdCAxMyAxNjoxOTowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IE1vdmVkIGwuZCBkb3duIHNvIHRoYXQgaXQgZGlzYXNzZW1ibGVzIGFzIGxkYzEuCi0KLUZyaSBPY3QgIDggMDI6MzQ6MjEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS1vcGMuaDogIEFkZCBsZGxfbCwgZml4IHR5cG8gZm9yIGxkcV91LgotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiAgQWRkIGNvZGUgZm9yIFBBTF9GT1JNQVRfQ09ERS4KLQotVHVlIE9jdCAgNSAxNzo0Nzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IENvcnJlY3QgbHd1IG9wY29kZSB2YWx1ZSAoYm9vayBoYWQgaXQgd3JvbmcpLgotCi1UaHUgU2VwIDMwIDExOjI2OjE4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyAoRkVUQ0hfREFUQSk6IGdldCBqdXN0IHRoZSByaWdodCBhbW91bnQgb2YgZGF0YS4KLQkodW5wYWNrX2luc3RyKTogQ29wZSB3aXRoIEFSR19JTU00TTEgdHlwZSBpbnN0cnVjdGlvbnMuCi0KLVdlZCBTZXAgMjkgMTY6MjQ6NDkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBtODhrLWRpcy5jIChtODhrZGlzKTogY29tbWVudCBjaGFuZ2UuICBSZW1vdmUgc3BhY2UgYWZ0ZXIKLQkgIHByaW50aW5nIG1uZW1vbmljLgotCSAgKHByaW50b3ApOiBoYW5kbGUgbmV3IGFyZyB0eXBlcyBERUMgYW5kIFhSRUcgZm9yIG04ODExMC4KLQotVHVlIFNlcCAyOCAxOToyMDoxNiAxOTkzICBKZWZmcmV5IEEgTGF3IChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAneicgb3BlcmFuZAotCXR5cGUgZm9yIGFic29sdXRlIGJyYW5jaCBhZGRyZXNzZXMuICBEZWxldGUgc3BlY2lhbAotCSJibGUiIGFuZCAiYmUiIGNvZGUgaW4gJ1cnIG9wZXJhbmQgY29kZS4KLQotRnJpIFNlcCAyNCAxNDowODozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IFNldCBoYXphcmQgaW5mb3JtYXRpb24gY29ycmVjdGx5IGZvciBicmFuY2gKLQlsaWtlbHkgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgU2VwIDE3IDA0OjQxOjE3IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpLCBhbHBoYS1vcGMuaDogIEZpeCBidWdzLCB1c2UKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgZm9yIHByaW50aW5nIGFuZCBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgZm9yCi0JYWRkcmVzcyBvdXRwdXQuCi0KLVdlZCBTZXAgMTUgMTI6MTI6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBTZXQgSU5TTl9UUkFQIGZvciB0WFggaW5zdHJ1Y3Rpb25zLgotCi1UaHUgU2VwICA5IDEwOjExOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogRnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOgotCUNvcnJlY3RlZCBzZWNvbmQgY2FzZSBvZiAiYiIgZm9yIGRpc2Fzc2VtYmxlci4KLQotVHVlIFNlcCAgNyAxNDoyNToxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMsIG04OGstZGlzLmM6IERvbid0IGluY2x1ZGUgbGliYmZkLmguICBDaGFuZ2VkIGNhbGxzCi0JdG8gQkZEIHN3YXBwaW5nIHJvdXRpbmVzIHRvIGNvcnJlc3BvbmQgdG8gQkZEIG5hbWUgY2hhbmdlcy4KLQotVGh1IFNlcCAgMiAxMDozNToyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IENoYW5nZSBkaXYgbWFjaGluZSBpbnN0cnVjdGlvbiB0byBiZSB6LHMsdCByYXRoZXIKLQl0aGFuIHMsdC4gIENoYW5nZSBkaXYgbWFjcm8gdG8gYmUgZCx2LHQgcmF0aGVyIHRoYW4gZCxzLHQuCi0JTGlrZXdpc2UgZm9yIGRpdnUsIGRkaXYsIGRkaXZ1LiAgQWRkZWQgeixzLHQgY2FzZSBmb3IgZHJlbSwgZHJlbXUsCi0JcmVtIGFuZCByZW11IHdoaWNoIGdlbmVyYXRlcyBvbmx5IHRoZSBjb3JyZXNwb25kaW5nIGRpdgotCWluc3RydWN0aW9uLiAgVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNSVBTIGFzc2VtYmxlciwKLQl3aGljaCBvbmx5IGdlbmVyYXRlcyB0aGUgc2ltcGxlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gd2hlbiBhbgotCWV4cGxpY2l0IGRlc3RpbmF0aW9uIG9mICQwIGlzIHVzZWQuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSAneicgKGFsd2F5cyByZWdpc3RlciB6ZXJvKS4KLQotVGh1IEF1ZyAyNiAxNzo0MTo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKTogU2V0Ci0JV1JfMzEgaGF6YXJkIGZvciBiYWwsIGJnZXphbCwgYmx0emFsLgotCi1UaHUgQXVnIDI2IDE3OjIwOjAyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBVc2UgcHJpbnQgZnVuY3Rpb24KLQlmcm9tIHdpdGhpbiB0aGUgZGlzYXNzZW1ibGVfaW5mbywgbm90IGZwcmludGZfZmlsdGVyZWQuCi0KLVdlZCBBdWcgMjUgMTM6NTE6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ3wnIGxpa2UgJz4nLiAgKEZyb20gSmVmZgotCUxhdywgbGF3QGNzLnV0YWguZWR1LikKLQotTW9uIEF1ZyAyMyAxMjo0NDowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKCJhYnN1Iik6IFJlbW92ZWQuCi0JKCJkYWJzIik6IEFkZGVkLgotCi1GcmkgQXVnIDIwIDEwOjUyOjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQWRkZWQgcjYwMDAgYW5kIHI0MDAwIGluc3RydWN0aW9ucyBhbmQgbWFjcm9zLgotCUNoYW5nZWQgaGF6YXJkIGluZm9ybWF0aW9uIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbWVtb3J5IGxvYWQKLQlkZWxheXMgYW5kIGNvcHJvY2Vzc29yIGxvYWQgZGVsYXlzLgotCi1XZWQgQXVnIDE4IDE1OjM5OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogbGkuZCB1c2VzICJULEwiLCBub3QgIlMsRiIuICBBZGRlZCBsaS5zLgotCi1UdWUgQXVnIDE3IDA5OjQ0OjQyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBwYXNzIGNwdSB0byBjb25maWcuYmZkLgotCi1UdWUgQXVnIDE3IDEyOjIzOjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay1kaXMuYyAobTg4a2Rpcyk6IE1ha2UgY2xhc3MgdW5zaWduZWQuCi0KLVRodSBBdWcgMTIgMTU6MDg6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IE9uZSBicmFuY2ggZm9ybWF0IGNhc2Ugd2FzCi0JbWlzc2luZyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZS4KLQotV2VkIEF1ZyAxMSAxOToyOTozOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBSZW5hbWVkIGZyb20gRElTX0xJQlMuCi0JQWRkIHRoZSBhcmNoLXNwZWNpZmljIGF1eGlsaWFyeSBmaWxlcy4KLQkoT0ZJTEVTKTogUmVtb3ZlIHRoZSBhcmNoLXNwZWNpZmljIGF1eGlsaWFyeSBmaWxlcwotCWFuZCB1c2UgQkZEX01BQ0hJTkVTIGluc3RlYWQgb2YgRElTX0xJQlMuCi0JKiBjb25maWd1cmUuaW46IFNldCBCRkRfTUFDSElORVMgYmFzZWQgb24gLS13aXRoLXRhcmdldHMgb3B0aW9uLgotCi1UaHUgQXVnIDEyIDEyOjA0OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQWRkZWQgbHdjMSBFLEEoYikgdG8gZ28gd2l0aCBsd2MxIFQsQShiKS4gIFNpbWlsYXJseQotCWZvciBzd2MxLgotCi1TdW4gQXVnICA4IDE1OjA5OjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogQ2hhbmdlIENPTlNUIHRvIGNvbnN0IHRvIGRlYWwgd2l0aCBnY2MKLQktRGNvbnN0PV9fY29uc3QgLXRyYWRpdGlvbmFsLgotCi1GcmkgQXVnICA2IDEwOjU4OjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogRnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOiBUb29rCi0JY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIG91dCBvZiAjaWYgMCwgYW5kIG1hZGUgdGhlbSB1c2UgbmV3Ci0JYXJndW1lbnQgdHlwZSAiQyIuCi0KLVRodSBBdWcgIDUgMTc6MTE6MDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jOiBJbmNsdWRlIGFuc2lkZWNsLmggYmVmb3JlIG9wY29kZXMvc3BhcmMuaC4KLQotRnJpIEp1bCAzMCAxODo0ODoxNSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6ICBBZGQgRl9KU1IsIEZfVU5CUiwgb3IgRl9DT05EQlIgZmxhZ3MgdG8gZWFjaCBicmFuY2gKLQlpbnN0cnVjdGlvbiwgZm9yIHVzZSBieSB0aGUgZGlzYXNzZW1ibGVyLgotCi0JKiBzcGFyYy1kaXMuYyAoU0VYKTogIEFkZCBzaWduIGV4dGVuc2lvbiBtYWNyby4gIFJlcGxhY2UgbWFueQotCWhhbmQtY29kZWQgc2lnbiBleHRlbnNpb25zIHRoYXQgZGVwZW5kZWQgb24gMzItYml0IGhvc3QgaW50cy4KLQlGSVhNRSwgd2Ugc3RpbGwgZGVwZW5kIG9uIGJpZy1lbmRpYW4gaG9zdCBiaXRmaWVsZCBvcmRlcmluZy4KLQkoc3BhcmNfcHJpbnRfaW5zbik6ICBTZXQgdGhlIGluc25faW5mb192YWxpZCBmaWVsZCwgYW5kIHRoZQotCW90aGVyIGZpZWxkcyB0aGF0IGRlc2NyaWJlIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBwcmludGVkLgotCi1UdWUgSnVsIDI3IDE3OjA0OjU4IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmMgKGNhbGwpOiBBY2NlcHQgYWxsIDYgYWRkcmVzc2luZyBtb2RlcyB2YWxpZCBmb3IKLQlgam1wJyBpbnN0ZWFkIG9mIGp1c3Qgb25lIG9mIHRoZW0uCi0KLVdlZCBKdWwgMjEgMTE6NDM6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IE1vdmUgZmxvYXRpbmcgcmVnaXN0ZXJzIGZyb20gcmVnX25hbWVzIHRvIGZwX3JlZ19uYW1lcy4KLQkoZnB1dF9mcF9yZWdfcik6IFJlbmFtZWQgZnJvbSBmcHV0X3JlZ19yLgotCShmcHV0X2ZwX3JlZyk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9ocHBhKTogVXNlIGZwdXRfZnBfcmVneyxfcn0gd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZXMgJ2EnLCAnZCcpOiBQcmludCBzcGFjZSBhZnRlcndhcmRzLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEsIGNhc2UgJ2QnKTogVXNlIEdFVF9DT05EIG5vdCBHRVRfRklFTEQuCi0KLU1vbiBKdWwgMTkgMTM6NTI6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFVzZSBleHRyYWN0XzVyX3N0b3JlIGZvciAncicuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZSAnPicpOiBJZiBuZXh0IGNoYXJhY3RlciBpcyAnbicsCi0JZG9uJ3Qgb3V0cHV0IGEgc3BhY2UuCi0KLQkqIGhwcGEtZGlzLmMgKGZsb2F0X2Zvcm1hdF9uYW1lcyk6IDEwIGlzIHVuZGVmaW5lZCwgYW5kIDExIGlzIHF1YWQuCi0KLVN1biBKdWwgMTggMTY6MzA6MDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBOZXcgZmlsZSwgY29udGFpbmluZyBvcGNvZGUgdGFibGUgZnJvbQotCS4uL2luY2x1ZGUvb3Bjb2RlL21pcHMuaC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgaXQuCi0KLVRodSBKdWwgMTUgMTI6Mzc6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLWRpcy5jOiBOZXcgZmlsZSwgbW92ZWQgaW4gZnJvbSBnZGIgYW5kIGNoYW5nZWQgdG8gdXNlIHRoZQotCW5ldyBkaXMtYXNtLmggZGlzYXNzZW1ibGVyIGludGVyZmFjZS4KLQkqIE1ha2VmaWxlLmluIChESVNfTElCUyk6IEFkZGVkIG04OGstZGlzLm8uCi0JKG04OGstZGlzLm8pOiBOZXcgdGFyZ2V0LgotCi1UdWUgSnVsIDEzIDEwOjA0OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcsIF9wcmludF9pbnNuX21pcHMpOiBNYWRlIHBvaW50ZXIgdG8KLQlhcmd1bWVudCBzdHJpbmcgY29uc3QgY2hhciAqIHRvIGNvcnJlc3BvbmQgdG8gb3Bjb2RlL21pcHMuaC4KLQotVHVlIEp1bCAgNiAxNToxODozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmM6IFVwZGF0ZWQgdG8gYWNjb3VudCBmb3IgbmFtZSBjaGFuZ2VzIGluIG5ldyB2ZXJzaW9uCi0Jb2Ygb3Bjb2RlL21pcHMuaC4KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBoZWFkZXIgZmlsZSBkZXBlbmRlbmNpZXMuCi0KLVNhdCBKdWwgIDMgMjM6NDc6NTYgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IENvcnJlY3QgZmV0Y2hpbmcgb2YgaW5zdHJ1Y3Rpb24uCi0KLVRodSBKdWwgIDEgMTI6MjM6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG02OGstZGlzLmMgKE5FWFRXT1JELCBORVhUTE9ORyk6IFVzZSAoKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCB0byBzaWduCi0JZXh0ZW5kLCByYXRoZXIgdGhhbiBzaGlmdHMuCi0KLVN1biBKdW4gMjAgMjA6NTY6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVbmRvIDE1IEp1bmUgY2hhbmdlLgotCi1GcmkgSnVuIDE4IDE0OjE1OjE1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6ICBDaGFuZ2UgcmV0dXJuIHZhbHVlIHRvIGJ5dGUgY291bnQKLQlvciBlcnJvciBjb2RlLgotCSogbTY4ay1kaXMuYzogIFJlLXdyaXRlIHRvIGRldGVjdCBpbnZhbGlkIG9wZXJhbmRzIGJlZm9yZQotCXByaW50aW5nIGFueXRoaW5nLCBzbyB3ZSBjYW4gaGFuZGxlIHRoaXMgdGhlIHNhbWUgd2F5IHdlCi0JaGFuZGxlIGludmFsaWQgb3Bjb2Rlcy4KLQotVGh1IEp1biAxNyAxNTowMTozNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBzaC1kaXMuYywgc2gtb3BjLmg6IFVuZGVyc3RhbmQgc29tZSBtb3JlIG9wY29kZXMuCi0KLVdlZCBKdW4gMTYgMTM6NDg6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBJbmNsdWRlIDxhbnNpZGVjbC5oPiBhbmQgc3lzZGVwLmggYmVmb3JlIG90aGVyCi0JaGVhZGVyIGZpbGVzLgotCi1UdWUgSnVuIDE1IDIxOjQ1OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IERvbid0IGRlY2xhcmUgcXNvcnQsIHNpbmNlIHN5c2RlcC5oIG1pZ2h0LgotCi0JKiBjb25maWd1cmUuaW46IERvIG1ha2Ugc3lzZGVwLmggbGluay4KLQkqIE1ha2VmaWxlLmluOiBTZWFyY2ggLi4vaW5jbHVkZS4gIERvbid0IHNlYXJjaCAuLi9iZmQuCi0KLVR1ZSBKdW4gMTUgMTM6MzY6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1OgotCSogaHBwYS1kaXMuYzogRml4IHR5cG8uICAnYScgYW5kICdkJyB3ZXJlIHJldmVyc2VkLgotCURvIG5vdCBwcmludCBhIHNwYWNlIGJlZm9yZSB0aGUgY29tcGxldGVycyBzcGVjaWZpZWQgYnkKLQknYScgYW5kICdkJy4KLQotRnJpIEp1biAxMSAxODo0MDoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYzogTm8gbG9uZ2VyIG5lZWQgdG8gYm9tYiBvdXQgaWYgSE9TVF82NF9CSVQgaXMKLQlkZWZpbmVkLCBzaW5jZSBnZGIgaGFzIGJlZW4gZml4ZWQuCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdToKLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IExhc3QgYXJndW1lbnQgdG8gZnB1dF9yZWcsCi0JZnB1dF9yZWdfciwgZnB1dF9jcmVnLCBmcHV0X2NvbnN0LCBhbmQgZnB1dHNfZmlsdGVyZWQgc2hvdWxkCi0JYmUgYSAqZGlzYXNzZW1ibGVfaW5mbywgbm90IGEgKkZJTEUuCi0JKiBocHBhLWRpcy5jOiBTdXBwb3J0ICdkJywgJyEnLCBhbmQgJ2EnLgotCSogaHBwYS1kaXMuYzogU3VwcG9ydCAncycgdG8gZXh0cmFjdCBhIDIgYml0IHNwYWNlIHJlZ2lzdGVyLgotCSogaHBwYS1kaXMuYzogRGVsZXRlIGNhc2VzIHdoaWNoIGFyZSBubyBsb25nZXIgbmVlZGVkLgotCi1GcmkgSnVuIDExIDA3OjUzOjQ4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX3ttNjhrLGFyZ30pOiBBZGQgTU1VIGNvZGVzLgotCi1UdWUgSnVuICA4IDEyOjI1OjAxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jOiBOZXcgZmlsZSwgcmVtb3ZlZCBmcm9tIGJmZC9jcHUtaDgzMDAuYywgd2l0aAotCUg4LzMwMC1IIG9wY29kZXMuCi0KLU1vbiBKdW4gIDcgMTI6NTg6NDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ1NFQVJDSCk6IEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgotCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KLQotVGh1IEp1biAgMyAxNTo1Njo0OSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBQYXRjaGVzIGZyb20gSmVmZnJleSBMYXcgPGxhd0Bjcy51dGFoLmVkdT4uCi0JKiBocHBhLWRpcy5jOiBTdXBwb3J0ICdJJywgJ0onLCBhbmQgJ0snIGluIG91dHB1dAotCXRlbXBsYXRlcyBmb3IgMS4xIEZQIGNvbXB1dGF0aW9uYWwgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgTWF5IDI1IDEzOjA1OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMgKHByaW50X2luc25faDg1MDApOiBBZGRyZXNzIGFyZ3VtZW50IGlzIHR5cGUKLQliZmRfdm1hLgotCSogejhrLWRpcy5jIChwcmludF9pbnNuX3o4aywgcHJpbnRfaW5zbl96ODAwMSwgcHJpbnRfaW5zbl96ODAwMik6Ci0JRGl0dG8uCi0KLQkqIGg4NTAwLW9wYy5oIChhZGRyX2NsYXNzX3R5cGUpOiBObyBjb21tYSBhdCBlbmQgb2YgZW51bWVyYXRvci4KLQkqIHNoLW9wYy5oIChzaF9uaWJibGVfdHlwZSwgc2hfYXJnX3R5cGUpOiBEaXR0by4KLQotCSogc3BhcmMtZGlzLmMgKGNvbXBhcmVfb3Bjb2Rlcyk6IE1vdmUgc3RhdGljIGRlY2xhcmF0aW9uIHRvCi0JdG9wLWxldmVsLgotCi1GcmkgTWF5IDIxIDE0OjE3OjM3IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBJbXBsZW1lbnQgJ24nIGFyZ3VtZW50IGZvciB1bmltcAotCWluc3RydWN0aW9uLCByZW1vdmUgdW5pbXAgaGFjayBmcm9tICdsJyBhcmd1bWVudC4KLQotV2VkIE1heSAxOSAxNTozNTo1NCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKGZldGNoX2RhdGEpOiAgVXNlIHVuc2lnbmVkIGNoYXIgdG8gbWFrZSBhbmNpZW50IGdjYydzCi0JaGFwcHkuCi0KLUZyaSBNYXkgMTQgMTU6MjI6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBCYXNlZCBvbiBwYXRjaGVzIGZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKToKLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlICdDJyBmb3IgZ2VuZXJhbCBjb3Byb2Nlc3NvcgotCWluc3RydWN0aW9ucy4KLQotRnJpIE1heSAxNCAwMDowOToxNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IEluY2x1ZGUgZGlzLWFzbS5oIGJlZm9yZSBzeXNkZXAuaC4gIENoYW5nZWQgc29tZQotCWFycmF5cyBvZiBzdHJpbmcgcG9pbnRlcnMgdG8gMi1kIGFycmF5cyBvZiBjaGFycywgdG8gc2F2ZQotCXNwYWNlLgotCi1UaHUgTWF5ICA2IDIwOjUxOjE3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jLCBhbHBoYS1kaXMuYywgaTk2MC1kaXMuYywgc3BhcmMtZGlzLmMsIHo4ay1kaXMuYzoKLQlDYXN0IHNlY29uZCBhcmcgdG8gcmVhZF9tZW1vcnlfZnVuYyB0byAiYmZkX2J5dGUgKiIsIGFzIG5lY2Vzc2FyeS4KLQotVHVlIE1heSAgNCAyMDozMToxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IE5ldyBmaWxlIGZyb20gVXRhaCwgYWRhcHRlZCB0byBuZXcgZGlzYXNzZW1ibGVyCi0JY2FsbGluZyBpbnRlcmZhY2UuCi0JKiBNYWtlZmlsZS5pbjogSW5jbHVkZSBpdC4KLQotTW9uIEFwciAyNiAxODoxNzo0MiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2gtZGlzLmMsIHNoLW9wYy5oOiBOZXcgZmlsZXMuCi0KLUZyaSBBcHIgMjMgMTg6NTE6MjIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFscGhhLWRpcy5jLCBhbHBoYS1vcGMuaDogTmV3IGZpbGVzLgotCi1UdWUgQXByICA2IDEyOjU0OjA4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbWlwcy1kaXMuYzogU2lnbiBleHRlbmQgJ2onIGFuZCAnYicgYXJndW1lbnRzLCBkZWx0YSBpcyBhIHNpZ25lZAotCXZhbHVlLgotCi1Nb24gQXByICA1IDE3OjM3OjM3IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYzogTWFrZSAidGEiIHRoZSBkZWZhdWx0IHRyYXAgaW5zdHJ1Y3Rpb24sICJ0IiB0aGUgYWxpYXMuCi0KLUZyaSBBcHIgIDIgMDc6MjQ6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jLCBzcGFyYy1kaXMuYywgc3BhcmMtb3BjLmM6IFVzZSBDT05TVCByYXRoZXIgdGhhbgotCWNvbnN0LgotCi1UaHUgQXByICAxIDExOjIwOjQzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYzogVXNlIGZwcmludGZfZnVuYyBhIGZldyBwbGFjZXMgd2hlcmUgSSBmb3Jnb3QsCi0JYW5kIGRvdWJsZSBwZXJjZW50IHNpZ25zIGEgZmV3IHBsYWNlcy4KLQotCSogYTI5ay1kaXMuYywgaTk2MC1kaXMuYzogTmV3LCBtZXJnZWQgZnJvbSBnZGIgYW5kIGJpbnV0aWxzLgotCi0JKiBpMzg2LWRpcy5jLCBtNjhrLWRpcy5jLCBtaXBzLWRpcy5jLCBzcGFyYy1kaXMuYzoKLQlVc2UgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIG5vdCBwcmludF9hZGRyZXNzLgotCi0JKiBkaXMtYnVmLmMgKGdlbmVyaWNfcHJpbnRfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE1hciAzMSAxMDowNzowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBzcGFyYy1kaXMuYy4KLQlzcGFyYy1kaXMuYzogTmV3IGZpbGUsIG1lcmdlcyBiaW51dGlscyBhbmQgZ2RiIHZlcnNpb25zIGFzIGZvbGxvd3M6Ci0JRnJvbSBHREI6Ci0JICAgIEFkZCBgYWRkJyBpbnN0cnVjdGlvbiB0byB0aGUgc2V0IHRoYXQgZ2V0IGNoZWNrZWQKLQkgICAgZm9yIGEgcHJlY2VkaW5nIGBzZXRoaScgaW4gb3JkZXIgdG8gcHJpbnQgYW4gYWJzb2x1dGUgYWRkcmVzcy4KLQkgICAgKiAocHJpbnRfaW5zbik6ICBEaXNhc3NlbWJseSBwcmVmZXJzIHJlYWwgaW5zdHJ1Y3Rpb25zLgotCSAgICAoaXNfZGVsYXllZF9icmFuY2gpOiAgU3BlZWQgdXAuCi0JICAgICogc3BhcmMtb3Bjb2RlLmg6IEFkZCBBTElBUyBiaXQgdG8gYWxpYXNlcy4gIEZpeCB1cCBvcGNvZGUgdGFibGVzLgotCSAgICBTdGlsbCBtaXNzaW5nIHNvbWUgZmxvYXQgb3BzLCBhbmQgbmVlZHMgdGVzdGluZy4KLQkgICAgKiBzcGFyYy1waW5zbi5jIChwcmludF9pbnNuKTogRWxpbWluYXRlICdzZXQnIHRlc3QsIHN1YnN1bWVkIGJ5Ci0JICAgIEZfQUxJQVMuICBVc2UgcHJpbnRmLCBub3QgZnByaW50Ziwgd2hlbiBub3QgcGFzc2luZyBhIGZpbGUKLQkgICAgcG9pbnRlci4uLgotCSAgICAoY29tcGFyZV9vcGNvZGVzKTogQ2hlY2sgdGhhdCBpZGVudGljYWwgaW5zdHJ1Y3Rpb25zIGhhdmUKLQkgICAgaWRlbnRpY2FsIG9wY29kZXMsIGNvbXBsYWluIG90aGVyd2lzZS4KLQlGcm9tIGJpbnV0aWxzOgotCSAgICAqIE5ldyAnbScgYXJnLgotCSAgICAqIEluY2x1ZGUgcmVnX25hbWVzLgotCUZyb20gbmVpdGhlcjoKLQkgICAgVXNlIGRpcy1hc20uaC9yZWFkX21lbW9yeV9mdW5jIGludGVyZmFjZS4KLQotV2VkIE1hciAzMSAyMDo0OTowNiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jLCBpMzg2LWRpcy5jLCBtNjhrLWRpcy5jLCB6OGstZGlzLmMgKGZldGNoX2RhdGEpOgotCSAgZGVsaWJlcmF0ZWx5IHJldHVybiBub24temVybyB0byBzZXRqbXAgZnJvbSBsb25nam1wLiAgT3RoZXJ3aXNlCi0JICB0aGlzIGNvZGUgZmFpbHMgdG8gY29tcGlsZS4KLQotV2VkIE1hciAzMSAxNzowNDozMSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLWRpcy5jOiAgRml4IHByb3RvdHlwZSBmb3IgZmV0Y2hfYXJnKCkuCi0KLVdlZCBNYXIgMzEgMTA6MDc6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGRpcy1idWYuYzogTmV3IGZpbGUsIGZvciBuZXcgcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UuCi0JTWFrZWZpbGUuaW4gKE9GSUxFUyk6IEluY2x1ZGUgaXQuCi0JbTY4ay1kaXMuYywgaTM4Ni1kaXMuYywgaDg1MDAtZGlzLmMsIG1pcHMtZGlzLmMsIHo4ay1kaXMuYzoKLQlVc2UgbmV3IHJlYWRfbWVtb3J5X2Z1bmMgaW50ZXJmYWNlLgotCi1Nb24gTWFyIDI5IDE0OjAyOjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYyAocHJpbnRfaW5zbl9oODUwMCk6IEdldCBzaWduIG9mIGZwIG9mZnNldHMgcmlnaHQuCi0JKiBoODUwMC1vcGMuaDogRml4IGNvdXBsZSBvZiBvcGNvZGVzLgotCi1XZWQgTWFyIDI0IDAyOjAzOjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGR2aSAmIGluc3RhbGxjaGVjayB0YXJnZXRzCi0KLU1vbiBNYXIgMjIgMTg6NTU6MDQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIGZvciBoODUwMC1kaXMuYy4KLQotRnJpIE1hciAxOSAxNDoyNzoxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMsIGg4NTAwLW9wYy5oOiBOZXcgZmlsZXMKLQotVGh1IE1hciAxOCAxNDoxMjozNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMsIHo4ay1kaXMuYzogIENvbnZlcnRlZCB0byB1c2UgaW50ZXJmYWNlIGRlZmluZWQgaW4KLQkuLi9pbmNsdWRlL2Rpcy1hc20uaC4KLQkqIG02OGstZGlzLmM6ICBOZXcgZmlsZSAobWVyZ2Ugb2YgLi4vYmludXRpbHMvbTY4ay1waW5zbi5jCi0JYW5kIC4uL2dkYi9tNjhrLXBpbnNuLmMpLgotCSogaTM4Ni1kaXMuYzogIE5ldyBmaWxlIChtZXJnZSBvZiAuLi9iaW51dGlscy9pMzg2LXBpbnNuLmMKLQlhbmQgLi4vZ2RiL2kzODYtcGluc24uYykuCi0JKiBtNjg4ODEtZXh0LmM6ICBOZXcgZmlsZS4gIE1vdmVkIGRlZmluaXRpb24gb2YKLQlleHRfZm9ybWF0IGV4dF9mb3JtYXRfNjg4ODEgZnJvbSAuLi9nZGIvbTY4ay10ZGVwLmMuCi0JKiBNYWtlZmlsZS5pbjogIEFkanVzdCBmb3IgbmV3IGZpbGVzLgotCSogaTM4Ni1kaXMuYzogIFBhdGNoZXMgZnJvbSBKb2huIEhhc3NleSAoaGFzc2V5QGRnLXJ0cC5kZy5jb20pLgotCSogbTY4ay1kaXMuYzogIFJlY29nbml6ZSAnOScgcGxhY2VtZW50IGNvZGUsIHNvIChzYXkpIHBmbHVzaAotCWNhbiBiZSBkaXMtYXNzZW1ibGVkLgotCi1XZWQgRmViIDE3IDA5OjE5OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBOb3cgcmV0dXJucyB2b2lkLgotCi1Nb24gSmFuIDExIDE2OjA5OjE2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChhbnNpZGVjbC5oKTogIEluY2x1ZGUgZm9yIGJlbmVmaXQgb2Ygc3lzZGVwLmgKLQlmaWxlcyB0aGF0IHVzZSB0aGUgbWFjcm9zLgotCi1UaHUgSmFuICA3IDEzOjE1OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYzogTmV3IGZpbGUsIGZyb20gZ2RiL21pcHMtcGluc24uYy4KLQkqIE1ha2VmaWxlLmluIChESVNfTElCUyk6IEFkZGVkIG1pcHMtZGlzLm8uCi0JKENGSUxFUyk6IEFkZGVkIG1pcHMtZGlzLmMuCi0KLVRodSBKYW4gIDcgMDc6MzY6MzMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAJKiB6OGstZGlzLmMgKHByaW50X2luc25fejgwMDEsIHByaW50X2luc25fejgwMDIpOiBuZXcgcm91dGluZXMKLQkqIHo4a2dlbi5jLCB6OGstb3BjLmg6IGZpeCBzaXplcyBvZiBzb21lIHNoaWZ0cy4KLQotVHVlIERlYyAyMiAxNTo0Mjo0NCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgSW1wcm92ZSAqY2xlYW4gcnVsZXMuCi0JKiBjb25maWd1cmUuaW46ICBBbGxvdyBhIGRlZmF1bHQgaG9zdC4KLQotVHVlIE5vdiAxNyAxOTo1Mzo1NCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHNvIHVzZSAtSSQoc3JjZGlyKS8uLi9iZmQsIHNpbmNlIHNvbWUgc3lzZGVwCi0JZmlsZXMgaW5jbHVkZSBvdGhlciBzeXNkZXAgZmlsZXMKLQotVGh1IE5vdiAxMiAxNjoxMDozNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jIHo4ay1vcGMuaCB6OGtnZW4uYzogY2hlY2twb2ludAotCi1GcmkgT2N0ICA5IDA0OjU2OjA1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBGb3IgaG9zdCBzdXBwb3J0LCB1c2UgLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0Jc28gaXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSAuLi9iZmQvaG9zdHMgZGF0YWJhc2UuCi0KLVRodSBPY3QgIDEgMjM6Mzg6NTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBjcHUtdmVuZG9yLW9zIHRyaXBsZSBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcwotCi1XZWQgU2VwIDMwIDE2OjA5OjIwIDE5OTIgIE1pY2hhZWwgV2VybmVyICAobXR3QGN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyAodW5wYXJzZV9pbnN0cik6IGZpeCBidWcgd2hlcmUgb3Bjb2RlIHJldHVybmVkIHdhcwotCSphbHdheXMqIHRoZSB3cm9uZyBvbmUuCi0KLVdlZCBTZXAgMzAgMDc6NDI6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4a2dlbi5jOiBhZGRlZCBjb3B5cmlnaHQgaW5mbwotCi1UdWUgU2VwIDI5IDEyOjIwOjIxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKHVucGFyc2VfaW5zdHIpOiBwcmV0dGllciB0YWJzCi0JKiB6OGtnZW4uYyAtPiB6OGstb3BjLmg6IGJ1ZyBmaXhlcyBpbiB0YWJsZXMKLQotRnJpIFNlcCAyNSAxMjo1MDozMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbmNyKiBjb25maWd1cmF0aW9uLgotCSogejhrLWRpcy5jIChzdHJ1Y3QgaW5zdHJfZGF0YV9zKTogIE1ha2UgaW5zdHJfYXNtc3JjIGNoYXIgdG8gbWFrZQotCXBpY2F5dW5lIEFOU0kgY29tcGlsZXJzIGhhcHB5LgotCi1TZXAgMjAgMDg6NTA6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Nik6ICBNYWtlIGkzODYgYW5kIGk0ODYgc3lub255bW91cyBmb3Igbm93LgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc3lzdjQpOiAgQWRkIG15X2hvc3QgZGVmaW5pdGlvbi4KLQotRnJpIFNlcCAxOCAxNzowMToyMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRml4IHR5cG8uCi0KLUZyaSBTZXAgMTggMDI6MDQ6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlKTogIFJlbW92ZSBvYnNvbGV0ZSBjcnVkLgotCShzcGFyYy1vcGMubyk6ICBBdm9pZCBTdW4gTWFrZSBWUEFUSCBidWcuCi0KLVR1ZSBTZXAgIDggMTc6Mjk6MjcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogc2luY2UgdGhlcmUgYXJlIG5vIFNVQkRJUlMsIHJlbW92ZSBydWxlIGFuZAotCXJlZmVyZW5jZXMgb2Ygc3ViZGlyX2RvLgotCi1UdWUgU2VwICA4IDE3OjAyOjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBHZXQgdGhlIGxpYnJhcnkgbmFtZSByaWdodCBoZXJlIHRvby4KLQlEb24ndCBpbnN0YWxsIGJmZC5oLCBzaW5jZSBpdCdzIHVucmVsYXRlZCB0byB0aGlzIGxpYnJhcnkuICBObwotCXN1YmRpcnMgdG8gcmVjdXJzZSBpbnRvLCBlaXRoZXIuCi0JKENGSUxFUyk6IFRoZSBzb3VyY2UgZmlsZSBoYXMgYSAuYyBzdWZmaXgsIG5vdCAuby4KLQotCSogc3BhcmMtb3BjLmM6IE5ldyBmaWxlLCBtb3ZlZCBmcm9tIEJGRC4KLQkqIE1ha2VmaWxlLmluIChPRklMRVMpOiBCdWlsZCBpdC4KLQotVGh1IFNlcCAgMyAxNjo1OToyMCAxOTkyICBNaWNoYWVsIFdlcm5lciAgKG10d0BjeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmM6IGZpeGVkIGZvcndhcmQgcmVmZmVyZW5jZXMgb2Ygc29tZSBkZWNsYXJhdGlvbnMuCi0KLU1vbiBBdWcgMzEgMTY6MDk6NDUgMTk5MiAgTWljaGFlbCBXZXJuZXIgIChtdHdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSByaWdodAotCi1Nb24gQXVnIDMxIDEzOjQ3OjM1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmM6IGtub3dzIGhvdyB0byBkaXNhc3NlbWJsZSB6OGsgc3R1ZmYKLQkqIHo4ay1vcGMuaDogbmV3IGZpbGUgZnVsbCBvZiB6ODAwMCBvcGNvZGVzCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL29wY29kZXMvTWFrZWZpbGUuYW0gYi9vcGNvZGVzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZhYmM1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLVNVQkRJUlMgPSBwbwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQkZERElSID0gJChzcmNkaXIpLy4uL2JmZAotREVQID0gbWtkZXAKLQotbGliX0xUTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5sYQotCi0jIFRoaXMgaXMgd2hlcmUgYmZkLmggbGl2ZXMuCi1CRkRfSCA9IC4uL2JmZC9iZmQuaAotCi0jIEhlYWRlciBmaWxlcy4KLUhGSUxFUyA9IFwKLQlhcm0tb3BjLmggXAotCWZyMzAtZGVzYy5oIGZyMzAtb3BjLmggXAotCWg4NTAwLW9wYy5oIFwKLQltMzJyLWRlc2MuaCBtMzJyLW9wYy5oIFwKLQltY29yZS1vcGMuaCBcCi0Jc2gtb3BjLmggXAotCXN5c2RlcC5oIFwKLQl3NjUtb3BjLmggXAotCXo4ay1vcGMuaAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCWEyOWstZGlzLmMgXAotCWFscGhhLWRpcy5jIFwKLQlhbHBoYS1vcGMuYyBcCi0JYXJjLWRpcy5jIFwKLQlhcmMtb3BjLmMgXAotCWFybS1kaXMuYyBcCi0JY2dlbi1hc20uYyBcCi0JY2dlbi1kaXMuYyBcCi0JY2dlbi1vcGMuYyBcCi0JZDEwdi1kaXMuYyBcCi0JZDEwdi1vcGMuYyBcCi0JZDMwdi1kaXMuYyBcCi0JZDMwdi1vcGMuYyBcCi0JZGlzLWJ1Zi5jIFwKLQlkaXNhc3NlbWJsZS5jIFwKLQlmcjMwLWFzbS5jIFwKLQlmcjMwLWRlc2MuYyBcCi0JZnIzMC1kaXMuYyBcCi0JZnIzMC1pYmxkLmMgXAotCWZyMzAtb3BjLmMgXAotCWg4MzAwLWRpcy5jIFwKLQloODUwMC1kaXMuYyBcCi0JaHBwYS1kaXMuYyBcCi0JaTM4Ni1kaXMuYyBcCi0JaTk2MC1kaXMuYyBcCi0JbTMyci1hc20uYyBcCi0JbTMyci1kZXNjLmMgXAotCW0zMnItZGlzLmMgXAotCW0zMnItaWJsZC5jIFwKLQltMzJyLW9wYy5jIFwKLQltMzJyLW9waW5zdC5jIFwKLQltNjhrLWRpcy5jIFwKLQltNjhrLW9wYy5jIFwKLQltODhrLWRpcy5jIFwKLQltY29yZS1kaXMuYyBcCi0JbWlwcy1kaXMuYyBcCi0JbWlwcy1vcGMuYyBcCi0JbWlwczE2LW9wYy5jIFwKLQltMTAyMDAtZGlzLmMgXAotCW0xMDIwMC1vcGMuYyBcCi0JbTEwMzAwLWRpcy5jIFwKLQltMTAzMDAtb3BjLmMgXAotCW5zMzJrLWRpcy5jIFwKLQlwcGMtZGlzLmMgXAotCXBwYy1vcGMuYyBcCi0Jc2gtZGlzLmMgXAotCXNwYXJjLWRpcy5jIFwKLQlzcGFyYy1vcGMuYyBcCi0JdGljMzAtZGlzLmMgXAotCXRpYzgwLWRpcy5jIFwKLQl0aWM4MC1vcGMuYyBcCi0Jdjg1MC1kaXMuYyBcCi0Jdjg1MC1vcGMuYyBcCi0JdmF4LWRpcy5jIFwKLQl3NjUtZGlzLmMgXAotCXo4ay1kaXMuYyBcCi0JejhrZ2VuLmMKLQotQUxMX01BQ0hJTkVTID0gXAotCWEyOWstZGlzLmxvIFwKLQlhbHBoYS1kaXMubG8gXAotCWFscGhhLW9wYy5sbyBcCi0JYXJjLWRpcy5sbyBcCi0JYXJjLW9wYy5sbyBcCi0JYXJtLWRpcy5sbyBcCi0JY2dlbi1hc20ubG8gXAotCWNnZW4tZGlzLmxvIFwKLQljZ2VuLW9wYy5sbyBcCi0JZDEwdi1kaXMubG8gXAotCWQxMHYtb3BjLmxvIFwKLQlkMzB2LWRpcy5sbyBcCi0JZDMwdi1vcGMubG8gXAotCWZyMzAtYXNtLmxvIFwKLQlmcjMwLWRlc2MubG8gXAotCWZyMzAtZGlzLmxvIFwKLQlmcjMwLWlibGQubG8gXAotCWZyMzAtb3BjLmxvIFwKLQloODMwMC1kaXMubG8gXAotCWg4NTAwLWRpcy5sbyBcCi0JaHBwYS1kaXMubG8gXAotCWkzODYtZGlzLmxvIFwKLQlpOTYwLWRpcy5sbyBcCi0JbTMyci1hc20ubG8gXAotCW0zMnItZGVzYy5sbyBcCi0JbTMyci1kaXMubG8gXAotCW0zMnItaWJsZC5sbyBcCi0JbTMyci1vcGMubG8gXAotCW0zMnItb3BpbnN0LmxvIFwKLQltNjhrLWRpcy5sbyBcCi0JbTY4ay1vcGMubG8gXAotCW04OGstZGlzLmxvIFwKLQltMTAyMDAtZGlzLmxvIFwKLQltMTAyMDAtb3BjLmxvIFwKLQltMTAzMDAtZGlzLmxvIFwKLQltMTAzMDAtb3BjLmxvIFwKLQltY29yZS1kaXMubG8gXAotCW1pcHMtZGlzLmxvIFwKLQltaXBzLW9wYy5sbyBcCi0JbWlwczE2LW9wYy5sbyBcCi0JcHBjLWRpcy5sbyBcCi0JcHBjLW9wYy5sbyBcCi0JbnMzMmstZGlzLmxvIFwKLQlzaC1kaXMubG8gXAotCXNwYXJjLWRpcy5sbyBcCi0Jc3BhcmMtb3BjLmxvIFwKLQl0aWMzMC1kaXMubG8gXAotCXRpYzgwLWRpcy5sbyBcCi0JdGljODAtb3BjLmxvIFwKLQl2ODUwLWRpcy5sbyBcCi0Jdjg1MC1vcGMubG8gXAotCXZheC1kaXMubG8gXAotCXc2NS1kaXMubG8gXAotCXo4ay1kaXMubG8KLQotT0ZJTEVTID0gQEJGRF9NQUNISU5FU0AKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoSU5DRElSKSAtSSQoQkZERElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCi0KLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9kaXMtYXNtLmgKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgQGFyY2hkZWZzQCAkKHNyY2RpcikvZGlzYXNzZW1ibGUuYwotCi1saWJvcGNvZGVzX2xhX1NPVVJDRVMgPSAgZGlzLWJ1Zi5jIGRpc2Fzc2VtYmxlLmMKLWxpYm9wY29kZXNfbGFfREVQRU5ERU5DSUVTID0gJChPRklMRVMpCi1saWJvcGNvZGVzX2xhX0xJQkFERCA9ICQoT0ZJTEVTKSBAV0lOMzJMSUJBRERACi1saWJvcGNvZGVzX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYm9wY29kZXMuYS4gIFdlIGNyZWF0ZSBsaWJvcGNvZGVzLmEgaW4KLSMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29udmVydCBhbGwgdGhlCi0jIHByb2dyYW1zIHRoYXQgdXNlIGxpYm9wY29kZXMuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoCi0jIHNob3VsZCBiZSByZW1vdmVkIGlmIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5hCi0KLXN0YW1wLWxpYjogbGlib3Bjb2Rlcy5sYQotCWlmIFsgLWYgLmxpYnMvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLVBPVEZJTEVTID0gJChIRklMRVMpICQoQ0ZJTEVTKQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotIyBXZSBzaG91bGQgcmVjb25maWd1cmUgd2hlbmV2ZXIgYmZkL2NvbmZpZ3VyZS5pbiBjaGFuZ2VzLCBiZWNhdXNlCi0jIHRoYXQncyB3aGVyZSB0aGUgdmVyc2lvbiBudW1iZXIgY29tZXMgZnJvbS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpLy4uL2JmZC9jb25maWd1cmUuaW4KLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLUNMRUFORklMRVMgPSBcCi0JbGlib3Bjb2Rlcy5hIHN0YW1wLWxpYiBkZXAuc2VkIC5kZXAgLmRlcDEKLQotCi0KLSMgVGhlIHN0YXJ0IG1hcmtlciBpcyB3cml0dGVuIHRoaXMgd2F5IHRvIHBhc3MgdGhyb3VnaCBhdXRvbWFrZSB1bnNjYXRoZWQuCi0KLQotCi0KLSMgVGhpcyBkZXBlbmRlbmN5IHN0dWZmIGlzIGNvcGllZCBmcm9tIEJGRC4KLQotLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgLmRlcDEKLQkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKLQlzZWQgLWYgZGVwLnNlZCA8IC5kZXAxID4gLmRlcAotCi0uZGVwMTogJChDRklMRVMpCi0Jcm0gLWYgLmRlcDIgLmRlcDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgotCWVjaG8gPiAuZGVwMmEKLQkkKERFUCkgLWYgLmRlcDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCAuZGVwMmEgPj4gLmRlcDIKLQlybSAtZiAuZGVwMmEKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotYTI5ay1kaXMubG86IGEyOWstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi1hbHBoYS1kaXMubG86IGFscGhhLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmgKLWFscGhhLW9wYy5sbzogYWxwaGEtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChCRkRfSCkgb3BpbnRsLmgKLWFyYy1kaXMubG86IGFyYy1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBvcGludGwuaAotYXJjLW9wYy5sbzogYXJjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICBvcGludGwuaAotYXJtLWRpcy5sbzogYXJtLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSBhcm0tb3BjLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvYXJtLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1jZ2VuLWFzbS5sbzogY2dlbi1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBvcGludGwuaAotY2dlbi1kaXMubG86IGNnZW4tZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1jZ2VuLW9wYy5sbzogY2dlbi1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmgKLWQxMHYtZGlzLmxvOiBkMTB2LWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotZDEwdi1vcGMubG86IGQxMHYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMTB2LmgKLWQzMHYtZGlzLmxvOiBkMzB2LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotZDMwdi1vcGMubG86IGQzMHYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLWRpcy1idWYubG86IGRpcy1idWYuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgb3BpbnRsLmgKLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotZnIzMC1hc20ubG86IGZyMzAtYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWRlc2MubG86IGZyMzAtZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kaXMubG86IGZyMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtaWJsZC5sbzogZnIzMC1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtb3BjLmxvOiBmcjMwLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaAotaDgzMDAtZGlzLmxvOiBoODMwMC1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1oODUwMC1kaXMubG86IGg4NTAwLWRpcy5jIGg4NTAwLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotaHBwYS1kaXMubG86IGhwcGEtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLWkzODYtZGlzLmxvOiBpMzg2LWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBjb25maWcuaCBvcGludGwuaAotaTk2MC1kaXMubG86IGk5NjAtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oCi1tMzJyLWFzbS5sbzogbTMyci1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGVzYy5sbzogbTMyci1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRpcy5sbzogbTMyci1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1pYmxkLmxvOiBtMzJyLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1vcGMubG86IG0zMnItb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5sbzogbTMyci1vcGluc3QuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW02OGstZGlzLmxvOiBtNjhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvZmxvYXRmb3JtYXQuaCBvcGludGwuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tNjhrLW9wYy5sbzogbTY4ay1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAotbTg4ay1kaXMubG86IG04OGstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbTg4ay5oIG9waW50bC5oCi1tY29yZS1kaXMubG86IG1jb3JlLWRpcy5jIG1jb3JlLW9wYy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotbWlwcy1kaXMubG86IG1pcHMtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLW1pcHMtb3BjLmxvOiBtaXBzLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1taXBzMTYtb3BjLmxvOiBtaXBzMTYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9taXBzLmgKLW0xMDIwMC1kaXMubG86IG0xMDIwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLW0xMDIwMC1vcGMubG86IG0xMDIwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotbTEwMzAwLWRpcy5sbzogbTEwMzAwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotbTEwMzAwLW9wYy5sbzogbTEwMzAwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1uczMyay1kaXMubG86IG5zMzJrLWRpcy5jICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICBvcGludGwuaAotcHBjLWRpcy5sbzogcHBjLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi1wcGMtb3BjLmxvOiBwcGMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9wcGMuaCBcCi0gIG9waW50bC5oCi1zaC1kaXMubG86IHNoLWRpcy5jIHNoLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaAotc3BhcmMtZGlzLmxvOiBzcGFyYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2xpYmliZXJ0eS5oIG9waW50bC5oCi1zcGFyYy1vcGMubG86IHNwYXJjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotdGljMzAtZGlzLmxvOiB0aWMzMC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL29wY29kZS90aWMzMC5oCi10aWM4MC1kaXMubG86IHRpYzgwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLXRpYzgwLW9wYy5sbzogdGljODAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi12ODUwLWRpcy5sbzogdjg1MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLXY4NTAtb3BjLmxvOiB2ODUwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oIFwKLSAgb3BpbnRsLmgKLXZheC1kaXMubG86IHZheC1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotdzY1LWRpcy5sbzogdzY1LWRpcy5jIHc2NS1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXo4ay1kaXMubG86IHo4ay1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgejhrLW9wYy5oCi16OGtnZW4ubG86IHo4a2dlbi5jIHN5c2RlcC5oIGNvbmZpZy5oCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL29wY29kZXMvTWFrZWZpbGUuaW4gYi9vcGNvZGVzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVkMTc5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4NjYgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9NQUNISU5FUyA9IEBCRkRfTUFDSElORVNACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUhERUZJTkVTID0gQEhERUZJTkVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKLVdJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAotYXJjaGRlZnMgPSBAYXJjaGRlZnNACi1sID0gQGxACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VCRElSUyA9IHBvCi0KLUlOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCi1CRkRESVIgPSAkKHNyY2RpcikvLi4vYmZkCi1ERVAgPSBta2RlcAotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmxhCi0KLSMgVGhpcyBpcyB3aGVyZSBiZmQuaCBsaXZlcy4KLUJGRF9IID0gLi4vYmZkL2JmZC5oCi0KLSMgSGVhZGVyIGZpbGVzLgotSEZJTEVTID0gXAotCWFybS1vcGMuaCBcCi0JZnIzMC1kZXNjLmggZnIzMC1vcGMuaCBcCi0JaDg1MDAtb3BjLmggXAotCW0zMnItZGVzYy5oIG0zMnItb3BjLmggXAotCW1jb3JlLW9wYy5oIFwKLQlzaC1vcGMuaCBcCi0Jc3lzZGVwLmggXAotCXc2NS1vcGMuaCBcCi0JejhrLW9wYy5oCi0KLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQlhMjlrLWRpcy5jIFwKLQlhbHBoYS1kaXMuYyBcCi0JYWxwaGEtb3BjLmMgXAotCWFyYy1kaXMuYyBcCi0JYXJjLW9wYy5jIFwKLQlhcm0tZGlzLmMgXAotCWNnZW4tYXNtLmMgXAotCWNnZW4tZGlzLmMgXAotCWNnZW4tb3BjLmMgXAotCWQxMHYtZGlzLmMgXAotCWQxMHYtb3BjLmMgXAotCWQzMHYtZGlzLmMgXAotCWQzMHYtb3BjLmMgXAotCWRpcy1idWYuYyBcCi0JZGlzYXNzZW1ibGUuYyBcCi0JZnIzMC1hc20uYyBcCi0JZnIzMC1kZXNjLmMgXAotCWZyMzAtZGlzLmMgXAotCWZyMzAtaWJsZC5jIFwKLQlmcjMwLW9wYy5jIFwKLQloODMwMC1kaXMuYyBcCi0JaDg1MDAtZGlzLmMgXAotCWhwcGEtZGlzLmMgXAotCWkzODYtZGlzLmMgXAotCWk5NjAtZGlzLmMgXAotCW0zMnItYXNtLmMgXAotCW0zMnItZGVzYy5jIFwKLQltMzJyLWRpcy5jIFwKLQltMzJyLWlibGQuYyBcCi0JbTMyci1vcGMuYyBcCi0JbTMyci1vcGluc3QuYyBcCi0JbTY4ay1kaXMuYyBcCi0JbTY4ay1vcGMuYyBcCi0JbTg4ay1kaXMuYyBcCi0JbWNvcmUtZGlzLmMgXAotCW1pcHMtZGlzLmMgXAotCW1pcHMtb3BjLmMgXAotCW1pcHMxNi1vcGMuYyBcCi0JbTEwMjAwLWRpcy5jIFwKLQltMTAyMDAtb3BjLmMgXAotCW0xMDMwMC1kaXMuYyBcCi0JbTEwMzAwLW9wYy5jIFwKLQluczMyay1kaXMuYyBcCi0JcHBjLWRpcy5jIFwKLQlwcGMtb3BjLmMgXAotCXNoLWRpcy5jIFwKLQlzcGFyYy1kaXMuYyBcCi0Jc3BhcmMtb3BjLmMgXAotCXRpYzMwLWRpcy5jIFwKLQl0aWM4MC1kaXMuYyBcCi0JdGljODAtb3BjLmMgXAotCXY4NTAtZGlzLmMgXAotCXY4NTAtb3BjLmMgXAotCXZheC1kaXMuYyBcCi0JdzY1LWRpcy5jIFwKLQl6OGstZGlzLmMgXAotCXo4a2dlbi5jCi0KLQotQUxMX01BQ0hJTkVTID0gXAotCWEyOWstZGlzLmxvIFwKLQlhbHBoYS1kaXMubG8gXAotCWFscGhhLW9wYy5sbyBcCi0JYXJjLWRpcy5sbyBcCi0JYXJjLW9wYy5sbyBcCi0JYXJtLWRpcy5sbyBcCi0JY2dlbi1hc20ubG8gXAotCWNnZW4tZGlzLmxvIFwKLQljZ2VuLW9wYy5sbyBcCi0JZDEwdi1kaXMubG8gXAotCWQxMHYtb3BjLmxvIFwKLQlkMzB2LWRpcy5sbyBcCi0JZDMwdi1vcGMubG8gXAotCWZyMzAtYXNtLmxvIFwKLQlmcjMwLWRlc2MubG8gXAotCWZyMzAtZGlzLmxvIFwKLQlmcjMwLWlibGQubG8gXAotCWZyMzAtb3BjLmxvIFwKLQloODMwMC1kaXMubG8gXAotCWg4NTAwLWRpcy5sbyBcCi0JaHBwYS1kaXMubG8gXAotCWkzODYtZGlzLmxvIFwKLQlpOTYwLWRpcy5sbyBcCi0JbTMyci1hc20ubG8gXAotCW0zMnItZGVzYy5sbyBcCi0JbTMyci1kaXMubG8gXAotCW0zMnItaWJsZC5sbyBcCi0JbTMyci1vcGMubG8gXAotCW0zMnItb3BpbnN0LmxvIFwKLQltNjhrLWRpcy5sbyBcCi0JbTY4ay1vcGMubG8gXAotCW04OGstZGlzLmxvIFwKLQltMTAyMDAtZGlzLmxvIFwKLQltMTAyMDAtb3BjLmxvIFwKLQltMTAzMDAtZGlzLmxvIFwKLQltMTAzMDAtb3BjLmxvIFwKLQltY29yZS1kaXMubG8gXAotCW1pcHMtZGlzLmxvIFwKLQltaXBzLW9wYy5sbyBcCi0JbWlwczE2LW9wYy5sbyBcCi0JcHBjLWRpcy5sbyBcCi0JcHBjLW9wYy5sbyBcCi0JbnMzMmstZGlzLmxvIFwKLQlzaC1kaXMubG8gXAotCXNwYXJjLWRpcy5sbyBcCi0Jc3BhcmMtb3BjLmxvIFwKLQl0aWMzMC1kaXMubG8gXAotCXRpYzgwLWRpcy5sbyBcCi0JdGljODAtb3BjLmxvIFwKLQl2ODUwLWRpcy5sbyBcCi0Jdjg1MC1vcGMubG8gXAotCXZheC1kaXMubG8gXAotCXc2NS1kaXMubG8gXAotCXo4ay1kaXMubG8KLQotCi1PRklMRVMgPSBAQkZEX01BQ0hJTkVTQAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChJTkNESVIpIC1JJChCRkRESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKLQotbGlib3Bjb2Rlc19sYV9TT1VSQ0VTID0gZGlzLWJ1Zi5jIGRpc2Fzc2VtYmxlLmMKLWxpYm9wY29kZXNfbGFfREVQRU5ERU5DSUVTID0gJChPRklMRVMpCi1saWJvcGNvZGVzX2xhX0xJQkFERCA9ICQoT0ZJTEVTKSBAV0lOMzJMSUJBRERACi1saWJvcGNvZGVzX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYm9wY29kZXMuYS4gIFdlIGNyZWF0ZSBsaWJvcGNvZGVzLmEgaW4KLSMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29udmVydCBhbGwgdGhlCi0jIHByb2dyYW1zIHRoYXQgdXNlIGxpYm9wY29kZXMuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoCi0jIHNob3VsZCBiZSByZW1vdmVkIGlmIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5hCi0KLVBPVEZJTEVTID0gJChIRklMRVMpICQoQ0ZJTEVTKQotCi1DTEVBTkZJTEVTID0gXAotCWxpYm9wY29kZXMuYSBzdGFtcC1saWIgZGVwLnNlZCAuZGVwIC5kZXAxCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1MSUJSQVJJRVMgPSAgJChub2luc3RfTElCUkFSSUVTKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1saWJvcGNvZGVzX2FfTElCQUREID0gCi1saWJvcGNvZGVzX2FfU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jCi1saWJvcGNvZGVzX2FfT0JKRUNUUyA9ICBsaWJvcGNvZGVzLmEubwotTFRMSUJSQVJJRVMgPSAgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWxpYm9wY29kZXNfbGFfT0JKRUNUUyA9ICBkaXMtYnVmLmxvIGRpc2Fzc2VtYmxlLmxvCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLURJU1RfQ09NTU9OID0gIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jICQobGlib3Bjb2Rlc19sYV9TT1VSQ0VTKQotT0JKRUNUUyA9IGxpYm9wY29kZXMuYS5vICQobGlib3Bjb2Rlc19sYV9PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubG8gLm8gLnMKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1tb3N0bHljbGVhbi1saWJMVExJQlJBUklFUzoKLQotY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUzoKLQotaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgJChMSUJUT09MKSAgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCWRvbmUKLQotbGlib3Bjb2Rlcy5sYTogJChsaWJvcGNvZGVzX2xhX09CSkVDVFMpICQobGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGlib3Bjb2Rlc19sYV9MREZMQUdTKSAkKGxpYm9wY29kZXNfbGFfT0JKRUNUUykgJChsaWJvcGNvZGVzX2xhX0xJQkFERCkgJChMSUJTKQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWluZm8tYW06Ci1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOgotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1saWJMVExJQlJBUklFUwotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbToKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpICQoTFRMSUJSQVJJRVMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGxpYmRpcikKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIG1vc3RseWNsZWFuLXRhZ3MgXAotCQltb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBcCi0JCW1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLQkJZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi1jbGVhbi1ub2luc3RMSUJSQVJJRVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJMVExJQlJBUklFUyBcCi1tYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCi1kaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCi1kdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKLWluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBcCi1hbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Rpcy1hc20uaAotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyBAYXJjaGRlZnNAICQoc3JjZGlyKS9kaXNhc3NlbWJsZS5jCi0KLXN0YW1wLWxpYjogbGlib3Bjb2Rlcy5sYQotCWlmIFsgLWYgLmxpYnMvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0jIFdlIHNob3VsZCByZWNvbmZpZ3VyZSB3aGVuZXZlciBiZmQvY29uZmlndXJlLmluIGNoYW5nZXMsIGJlY2F1c2UKLSMgdGhhdCdzIHdoZXJlIHRoZSB2ZXJzaW9uIG51bWJlciBjb21lcyBmcm9tLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvLi4vYmZkL2NvbmZpZ3VyZS5pbgotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotIyBUaGUgc3RhcnQgbWFya2VyIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gcGFzcyB0aHJvdWdoIGF1dG9tYWtlIHVuc2NhdGhlZC4KLQotIyBUaGlzIGRlcGVuZGVuY3kgc3R1ZmYgaXMgY29waWVkIGZyb20gQkZELgotCi0uZGVwOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgY29uZmlnLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwgLmRlcDEgPiAuZGVwCi0KLS5kZXAxOiAkKENGSUxFUykKLQlybSAtZiAuZGVwMiAuZGVwMmEKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JZWNobyA+IC5kZXAyYQotCSQoREVQKSAtZiAuZGVwMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/Ci0Jc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IC5kZXAyYSA+PiAuZGVwMgotCXJtIC1mIC5kZXAyYQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAQkZERElSQCEkKEJGRERJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi1hMjlrLWRpcy5sbzogYTI5ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLWFscGhhLWRpcy5sbzogYWxwaGEtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaAotYWxwaGEtb3BjLmxvOiBhbHBoYS1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKEJGRF9IKSBvcGludGwuaAotYXJjLWRpcy5sbzogYXJjLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIG9waW50bC5oCi1hcmMtb3BjLmxvOiBhcmMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hcmMuaCBcCi0gIG9waW50bC5oCi1hcm0tZGlzLmxvOiBhcm0tZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIGFybS1vcGMuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9hcm0uaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLWNnZW4tYXNtLmxvOiBjZ2VuLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG9waW50bC5oCi1jZ2VuLWRpcy5sbzogY2dlbi1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmgKLWNnZW4tb3BjLmxvOiBjZ2VuLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotZDEwdi1kaXMubG86IGQxMHYtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1kMTB2LW9wYy5sbzogZDEwdi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaAotZDMwdi1kaXMubG86IGQzMHYtZGlzLmMgJChJTkNESVIpL29wY29kZS9kMzB2LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1kMzB2LW9wYy5sbzogZDMwdi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotZGlzLWJ1Zi5sbzogZGlzLWJ1Zi5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSBvcGludGwuaAotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1mcjMwLWFzbS5sbzogZnIzMC1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGVzYy5sbzogZnIzMC1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWRpcy5sbzogZnIzMC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1pYmxkLmxvOiBmcjMwLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1vcGMubG86IGZyMzAtb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oCi1oODMwMC1kaXMubG86IGg4MzAwLWRpcy5jICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWg4NTAwLWRpcy5sbzogaDg1MDAtZGlzLmMgaDg1MDAtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1ocHBhLWRpcy5sbzogaHBwYS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotaTM4Ni1kaXMubG86IGkzODYtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIGNvbmZpZy5oIG9waW50bC5oCi1pOTYwLWRpcy5sbzogaTk2MC1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLW0zMnItYXNtLmxvOiBtMzJyLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kZXNjLmxvOiBtMzJyLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGlzLmxvOiBtMzJyLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWlibGQubG86IG0zMnItaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLW9wYy5sbzogbTMyci1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW0zMnItb3BpbnN0LmxvOiBtMzJyLW9waW5zdC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTY4ay1kaXMubG86IG02OGstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9mbG9hdGZvcm1hdC5oIG9waW50bC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW02OGstb3BjLmxvOiBtNjhrLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tODhrLWRpcy5sbzogbTg4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tODhrLmggb3BpbnRsLmgKLW1jb3JlLWRpcy5sbzogbWNvcmUtZGlzLmMgbWNvcmUtb3BjLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1taXBzLWRpcy5sbzogbWlwcy1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9taXBzLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotbWlwcy1vcGMubG86IG1pcHMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9taXBzLmgKLW1pcHMxNi1vcGMubG86IG1pcHMxNi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbTEwMjAwLWRpcy5sbzogbTEwMjAwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotbTEwMjAwLW9wYy5sbzogbTEwMjAwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1tMTAzMDAtZGlzLmxvOiBtMTAzMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAzMDAtb3BjLmxvOiBtMTAzMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLW5zMzJrLWRpcy5sbzogbnMzMmstZGlzLmMgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gIG9waW50bC5oCi1wcGMtZGlzLmxvOiBwcGMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLXBwYy1vcGMubG86IHBwYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oIFwKLSAgb3BpbnRsLmgKLXNoLWRpcy5sbzogc2gtZGlzLmMgc2gtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oCi1zcGFyYy1kaXMubG86IHNwYXJjLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvbGliaWJlcnR5Lmggb3BpbnRsLmgKLXNwYXJjLW9wYy5sbzogc3BhcmMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi10aWMzMC1kaXMubG86IHRpYzMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLXRpYzgwLWRpcy5sbzogdGljODAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotdGljODAtb3BjLmxvOiB0aWM4MC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLXY4NTAtZGlzLmxvOiB2ODUwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotdjg1MC1vcGMubG86IHY4NTAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS92ODUwLmggXAotICBvcGludGwuaAotdmF4LWRpcy5sbzogdmF4LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvdmF4LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi13NjUtZGlzLmxvOiB3NjUtZGlzLmMgdzY1LW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotejhrLWRpcy5sbzogejhrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSB6OGstb3BjLmgKLXo4a2dlbi5sbzogejhrZ2VuLmMgc3lzZGVwLmggY29uZmlnLmgKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9vcGNvZGVzL2EyOWstZGlzLmMgYi9vcGNvZGVzL2EyOWstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTU5YzkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hMjlrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qIEluc3RydWN0aW9uIHByaW50aW5nIGNvZGUgZm9yIHRoZSBBTUQgMjkwMDAKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiAgV3JpdHRlbiBieSBKaW0gS2luZ2Rvbi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9hMjlrLmgiCi0KLS8qIFByaW50IGEgc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2YgYSBnZW5lcmFsLXB1cnBvc2UKLSAgIHJlZ2lzdGVyIG51bWJlciBOVU0gb24gU1RSRUFNLgotICAgTlVNIGlzIGEgbnVtYmVyIGFzIGZvdW5kIGluIHRoZSBpbnN0cnVjdGlvbiwgbm90IGFzIGZvdW5kIGluCi0gICBkZWJ1Z2dpbmcgc3ltYm9sczsgaXQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMC0yNTUuICAqLwotc3RhdGljIHZvaWQKLXByaW50X2dlbmVyYWwgKG51bSwgaW5mbykKLSAgICAgaW50IG51bTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmIChudW0gPCAxMjgpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJnciVkIiwgbnVtKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibHIlZCIsIG51bSAtIDEyOCk7Ci19Ci0KLS8qIExpa2UgcHJpbnRfZ2VuZXJhbCBidXQgYSBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIuCi0gICAKLSAgIFRoZSBtbmVtb25pY3MgdXNlZCBieSB0aGUgQU1EIGFzc2VtYmxlciBhcmUgbm90IHF1aXRlIHRoZSBzYW1lCi0gICBhcyB0aGUgb25lcyBpbiB0aGUgVXNlcidzIE1hbnVhbC4gIFdlIHVzZSB0aGUgb25lcyB0aGF0IHRoZQotICAgYXNzZW1ibGVyIHVzZXMuICAqLwotc3RhdGljIHZvaWQKLXByaW50X3NwZWNpYWwgKG51bSwgaW5mbykKLSAgICAgdW5zaWduZWQgaW50IG51bTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIC8qIFJlZ2lzdGVyIG5hbWVzIG9mIHJlZ2lzdGVycyAwLVNQRUMwX05VTS0xLiAgKi8KLSAgc3RhdGljIGNoYXIgKnNwZWMwX25hbWVzW10gPSB7Ci0gICAgInZhYiIsICJvcHMiLCAiY3BzIiwgImNmZyIsICJjaGEiLCAiY2hkIiwgImNoYyIsICJyYnAiLCAidG1jIiwgInRtciIsCi0gICAgInBjMCIsICJwYzEiLCAicGMyIiwgIm1tdSIsICJscnUiLCAicnNuIiwgInJtYTAiLCAicm1jMCIsICJybWExIiwgInJtYzEiLAotICAgICJzcGMwIiwgInNwYzEiLCAic3BjMiIsICJpYmEwIiwgImliYzAiLCAiaWJhMSIsICJpYmMxIiwgImRiYSIsICJkYmMiLAotICAgICJjaXIiLCAiY2RyIgotICAgIH07Ci0jZGVmaW5lIFNQRUMwX05VTSAoKHNpemVvZiBzcGVjMF9uYW1lcykgLyAoc2l6ZW9mIHNwZWMwX25hbWVzWzBdKSkKLQotICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMTI4LTEyOCtTUEVDMTI4X05VTS0xLiAgKi8KLSAgc3RhdGljIGNoYXIgKnNwZWMxMjhfbmFtZXNbXSA9IHsKLSAgICAiaXBjIiwgImlwYSIsICJpcGIiLCAicSIsICJhbHUiLCAiYnAiLCAiZmMiLCAiY3IiCi0gICAgfTsKLSNkZWZpbmUgU1BFQzEyOF9OVU0gKChzaXplb2Ygc3BlYzEyOF9uYW1lcykgLyAoc2l6ZW9mIHNwZWMxMjhfbmFtZXNbMF0pKQotCi0gIC8qIFJlZ2lzdGVyIG5hbWVzIG9mIHJlZ2lzdGVycyAxNjAtMTYwK1NQRUMxNjBfTlVNLTEuICAqLwotICBzdGF0aWMgY2hhciAqc3BlYzE2MF9uYW1lc1tdID0gewotICAgICJmcGUiLCAiaW50ZSIsICJmcHMiLCAic3IxNjMiLCAiZXhvcCIKLSAgICB9OwotI2RlZmluZSBTUEVDMTYwX05VTSAoKHNpemVvZiBzcGVjMTYwX25hbWVzKSAvIChzaXplb2Ygc3BlYzE2MF9uYW1lc1swXSkpCi0KLSAgaWYgKG51bSA8IFNQRUMwX05VTSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc3BlYzBfbmFtZXNbbnVtXSk7Ci0gIGVsc2UgaWYgKG51bSA+PSAxMjggJiYgbnVtIDwgMTI4ICsgU1BFQzEyOF9OVU0pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNwZWMxMjhfbmFtZXNbbnVtLTEyOF0pOwotICBlbHNlIGlmIChudW0gPj0gMTYwICYmIG51bSA8IDE2MCArIFNQRUMxNjBfTlVNKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzcGVjMTYwX25hbWVzW251bS0xNjBdKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3IlZCIsIG51bSk7Ci19Ci0KLS8qIElzIGFuIGluc3RydWN0aW9uIHdpdGggT1BDT0RFIGEgZGVsYXllZCBicmFuY2g/ICAqLwotc3RhdGljIGludAotaXNfZGVsYXllZF9icmFuY2ggKG9wY29kZSkKLSAgICAgaW50IG9wY29kZTsKLXsKLSAgcmV0dXJuIChvcGNvZGUgPT0gMHhhOCB8fCBvcGNvZGUgPT0gMHhhOSB8fCBvcGNvZGUgPT0gMHhhMCB8fCBvcGNvZGUgPT0gMHhhMQotCSAgfHwgb3Bjb2RlID09IDB4YTQgfHwgb3Bjb2RlID09IDB4YTUKLQkgIHx8IG9wY29kZSA9PSAweGI0IHx8IG9wY29kZSA9PSAweGI1Ci0JICB8fCBvcGNvZGUgPT0gMHhjNCB8fCBvcGNvZGUgPT0gMHhjMAotCSAgfHwgb3Bjb2RlID09IDB4YWMgfHwgb3Bjb2RlID09IDB4YWQKLQkgIHx8IG9wY29kZSA9PSAweGNjKTsKLX0KLQotLyogTm93IGZpbmQgdGhlIGZvdXIgYnl0ZXMgb2YgSU5TTiBhbmQgcHV0IHRoZW0gaW4gKklOU057MCw4LDE2LDI0fS4gICovCi1zdGF0aWMgdm9pZAotZmluZF9ieXRlc19iaWcgKGluc24sIGluc24wLCBpbnNuOCwgaW5zbjE2LCBpbnNuMjQpCi0gICAgIGNoYXIgKmluc247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24wOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuODsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjE2OwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMjQ7Ci17Ci0gICppbnNuMjQgPSBpbnNuWzBdOwotICAqaW5zbjE2ID0gaW5zblsxXTsKLSAgKmluc244ICA9IGluc25bMl07Ci0gICppbnNuMCAgPSBpbnNuWzNdOwotfQotCi1zdGF0aWMgdm9pZAotZmluZF9ieXRlc19saXR0bGUgKGluc24sIGluc24wLCBpbnNuOCwgaW5zbjE2LCBpbnNuMjQpCi0gICAgIGNoYXIgKmluc247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24wOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuODsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjE2OwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMjQ7Ci17Ci0gICppbnNuMjQgPSBpbnNuWzNdOwotICAqaW5zbjE2ID0gaW5zblsyXTsKLSAgKmluc244ID0gaW5zblsxXTsKLSAgKmluc24wID0gaW5zblswXTsKLX0KLQotdHlwZWRlZiB2b2lkICgqZmluZF9ieXRlX2Z1bmNfdHlwZSkKLSAgICAgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwKLQkgICAgICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKikpOwotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBNRU1BRERSIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGFsd2F5cyA0IG9uIGEyOWspLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgLyogVGhlIHJhdyBpbnN0cnVjdGlvbi4gICovCi0gIGNoYXIgaW5zbls0XTsKLQotICAvKiBUaGUgZm91ciBieXRlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIGluc24yNCwgaW5zbjE2LCBpbnNuOCwgaW5zbjA7Ci0KLSAgZmluZF9ieXRlX2Z1bmNfdHlwZSBmaW5kX2J5dGVfZnVuYyA9IChmaW5kX2J5dGVfZnVuY190eXBlKWluZm8tPnByaXZhdGVfZGF0YTsKLQotICBzdHJ1Y3QgYTI5a19vcGNvZGUgQ09OU1QgKiBvcGNvZGU7Ci0KLSAgewotICAgIGludCBzdGF0dXMgPQotICAgICAgKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgKGJmZF9ieXRlICopICZpbnNuWzBdLCA0LCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgKCpmaW5kX2J5dGVfZnVuYykgKGluc24sICZpbnNuMCwgJmluc244LCAmaW5zbjE2LCAmaW5zbjI0KTsKLQotICBwcmludGYgKCIlMDJ4JTAyeCUwMnglMDJ4ICIsIGluc24yNCwgaW5zbjE2LCBpbnNuOCwgaW5zbjApOwotCi0gIC8qIEhhbmRsZSB0aGUgbm9wIChhc2VxIDB4NDAsZ3IxLGdyMSkgc3BlY2lhbGx5ICovCi0gIGlmICgoaW5zbjI0PT0weDcwKSAmJiAoaW5zbjE2PT0weDQwKSAmJiAoaW5zbjg9PTB4MDEpICYmIChpbnNuMD09MHgwMSkpIHsKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwibm9wIik7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0KLQotICAvKiBUaGUgb3Bjb2RlIGlzIGFsd2F5cyBpbiBpbnNuMjQuICAqLwotICBmb3IgKG9wY29kZSA9ICZhMjlrX29wY29kZXNbMF07Ci0gICAgICAgb3Bjb2RlIDwgJmEyOWtfb3Bjb2Rlc1tudW1fb3Bjb2Rlc107Ci0gICAgICAgKytvcGNvZGUpCi0gICAgewotICAgICAgaWYgKCgodW5zaWduZWQgbG9uZykgaW5zbjI0IDw8IDI0KSA9PSBvcGNvZGUtPm9wY29kZSkKLQl7Ci0JICBjaGFyICpzOwotCSAgCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsIG9wY29kZS0+bmFtZSk7Ci0JICBmb3IgKHMgPSBvcGNvZGUtPmFyZ3M7ICpzICE9ICdcMCc7ICsrcykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKnMpCi0JCXsKLQkJY2FzZSAnYSc6Ci0JCSAgcHJpbnRfZ2VuZXJhbCAoaW5zbjgsIGluZm8pOwotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICdiJzoKLQkJICBwcmludF9nZW5lcmFsIChpbnNuMCwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnYyc6Ci0JCSAgcHJpbnRfZ2VuZXJhbCAoaW5zbjE2LCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdpJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3gnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIChpbnNuMTYgPDwgOCkgKyBpbnNuMCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnaCc6Ci0JCSAgLyogVGhpcyB1c2VkIHRvIGJlICV4IGZvciBiaW51dGlscy4gICovCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCQkgICAgKGluc24xNiA8PCAyNCkgKyAoaW5zbjAgPDwgMTYpKTsKLQkJICBicmVhazsKLQotCQljYXNlICdYJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgKChpbnNuMTYgPDwgOCkgKyBpbnNuMCkgfCAweGZmZmYwMDAwKTsKLQkJICBicmVhazsKLQotCQljYXNlICdQJzoKLQkJICAvKiBUaGlzIG91dHB1dCBsb29rcyBqdXN0IGxpa2UgYWJzb2x1dGUgYWRkcmVzc2luZywgYnV0Ci0JCSAgICAgbWF5YmUgdGhhdCdzIE9LIChpdCdzIHdoYXQgdGhlIEdEQiBtNjhrIGFuZCBFQk1PTgotCQkgICAgIGEyOWsgZGlzYXNzZW1ibGVycyBkbykuICAqLwotCQkgIC8qIEFsbCB0aGUgc2hpZnRpbmcgaXMgdG8gc2lnbi1leHRlbmQgaXQuICBwKi8KLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJICAgIChtZW1hZGRyICsKLQkJICAgICAoKChpbnQpKChpbnNuMTYgPDwgMTApICsgKGluc24wIDw8IDIpKSA8PCAxNCkgPj4gMTQpLAotCQkgICAgIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0EnOgotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkgICAgKChpbnNuMTYgPDwgMTApICsgKGluc24wIDw8IDIpLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdlJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjE2ID4+IDcpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ24nOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGluc24xNiAmIDB4N2YpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGluc24xNik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncyc6Ci0JCSAgcHJpbnRfc3BlY2lhbCAoaW5zbjgsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3UnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMCA+PiA3KTsKLQkJICBicmVhazsKLQotCQljYXNlICdyJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKGluc24wID4+IDQpICYgNyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnSSc6Ci0JCSAgaWYgKChpbnNuMTYgJiAzKSAhPSAwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2QnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCAoaW5zbjAgPj4gMikgJiAzKTsKLQkJICBicmVhazsKLQotCQljYXNlICdmJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjAgJiAzKTsKLQkJICBicmVhazsKLQotCQljYXNlICdGJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKGluc24xNiA+PiAyKSAmIDE1KTsKLQkJICBicmVhazsKLQotCQljYXNlICdDJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjE2ICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKnMpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogTm93IHdlIGxvb2sgZm9yIGEgY29uc3QsY29uc3RoIHBhaXIgb2YgaW5zdHJ1Y3Rpb25zLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSB0cnkgdG8gcHJpbnQgdGhlIHN5bWJvbGljIGFkZHJlc3MuICAqLwotCSAgaWYgKGluc24yNCA9PSAyKSAgLyogY29uc3RoICovCi0JICAgIHsKLQkgICAgICBpbnQgZXJyY29kZTsKLQkgICAgICBjaGFyIHByZXZfaW5zbls0XTsKLQkgICAgICB1bnNpZ25lZCBjaGFyIHByZXZfaW5zbjAsIHByZXZfaW5zbjgsIHByZXZfaW5zbjE2LCBwcmV2X2luc24yNDsKLQkgICAgICAKLQkgICAgICBlcnJjb2RlID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciAtIDQsCi0JCQkJCQkgICAoYmZkX2J5dGUgKikgJnByZXZfaW5zblswXSwKLQkJCQkJCSAgIDQsCi0JCQkJCQkgICBpbmZvKTsKLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSWYgaXQgaXMgYSBkZWxheWVkIGJyYW5jaCwgd2UgbmVlZCB0byBsb29rIGF0IHRoZQotCQkgICAgIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgZGVsYXllZCBicmFjaCB0byBoYW5kbGUKLQkJICAgICB0aGluZ3MgbGlrZQotCQkgICAgIAotCQkgICAgIGNvbnN0IF9mb28KLQkJICAgICBjYWxsIF9wcmludGYKLQkJICAgICBjb25zdGggX2ZvbwotCQkgICAgICovCi0JCSAgKCpmaW5kX2J5dGVfZnVuYykgKHByZXZfaW5zbiwgJnByZXZfaW5zbjAsICZwcmV2X2luc244LAotCQkJCSAgICAgJnByZXZfaW5zbjE2LCAmcHJldl9pbnNuMjQpOwotCQkgIGlmIChpc19kZWxheWVkX2JyYW5jaCAocHJldl9pbnNuMjQpKQotCQkgICAgewotCQkgICAgICBlcnJjb2RlID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCQkJKG1lbWFkZHIgLSA4LCAoYmZkX2J5dGUgKikgJnByZXZfaW5zblswXSwgNCwgaW5mbyk7Ci0JCSAgICAgICgqZmluZF9ieXRlX2Z1bmMpIChwcmV2X2luc24sICZwcmV2X2luc24wLCAmcHJldl9pbnNuOCwKLQkJCQkJICZwcmV2X2luc24xNiwgJnByZXZfaW5zbjI0KTsKLQkJICAgIH0KLQkJfQotCQkgIAotCSAgICAgIC8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gcmVhZGluZyBtZW1vcnksIHRoZW4gYXNzdW1lCi0JCSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIG5vdCBjb25zdC4gICovCi0JICAgICAgaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkgIC8qIElzIGl0IGNvbnN0IHRvIHRoZSBzYW1lIHJlZ2lzdGVyPyAgKi8KLQkJICBpZiAocHJldl9pbnNuMjQgPT0gMwotCQkgICAgICAmJiBwcmV2X2luc244ID09IGluc244KQotCQkgICAgewotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0OyAiKTsKLQkJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCQkoKChpbnNuMTYgPDwgMjQpICsgKGluc24wIDw8IDE2KQotCQkJICArIChwcmV2X2luc24xNiA8PCA4KSArIChwcmV2X2luc24wKSksCi0JCQkgaW5mbyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICByZXR1cm4gNDsKLQl9Ci0gICAgfQotICAvKiBUaGlzIHVzZWQgdG8gYmUgJTh4IGZvciBiaW51dGlscy4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKQotICAgIChpbmZvLT5zdHJlYW0sICIud29yZCAweCUwOHgiLAotICAgICAoaW5zbjI0IDw8IDI0KSArIChpbnNuMTYgPDwgMTYpICsgKGluc244IDw8IDgpICsgaW5zbjApOwotICByZXR1cm4gNDsKLX0KLQotLyogRGlzYXNzZW1ibGUgYW4gYmlnLWVuZGlhbiBhMjlrIGluc3RydWN0aW9uLiAgKi8KLWludAotcHJpbnRfaW5zbl9iaWdfYTI5ayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgZmluZF9ieXRlc19iaWc7Ci0gIHJldHVybiBwcmludF9pbnNuIChtZW1hZGRyLCBpbmZvKTsKLX0KLQotLyogRGlzYXNzZW1ibGUgYSBsaXR0bGUtZW5kaWFuIGEyOWsgaW5zdHJ1Y3Rpb24uICAqLwotaW50Ci1wcmludF9pbnNuX2xpdHRsZV9hMjlrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSBmaW5kX2J5dGVzX2xpdHRsZTsKLSAgcmV0dXJuIHByaW50X2luc24gKG1lbWFkZHIsIGluZm8pOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hY2luY2x1ZGUubTQgYi9vcGNvZGVzL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiMDliOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCmRpZmYgLS1naXQgYS9vcGNvZGVzL2FjbG9jYWwubTQgYi9vcGNvZGVzL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODcxMWQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTExMSArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCi0jIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KLSMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgc2VyaWFsIDEKLQotZG5sIFVzYWdlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKLQotQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotUEFDS0FHRT1bJDFdCi1BQ19TVUJTVChQQUNLQUdFKQotVkVSU0lPTj1bJDJdCi1BQ19TVUJTVChWRVJTSU9OKQotZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLWlmZWxzZShbJDNdLCwKLUFDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLUFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKLWRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KLSMKLQotQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCi1kbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgotQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAotW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICQxPSQyCi0gICBBQ19NU0dfUkVTVUxUKGZvdW5kKQotZWxzZQotICAgJDE9IiQzL21pc3NpbmcgJDIiCi0gICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCi1maQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIHNlcmlhbCAzNSBBQ19QUk9HX0xJQlRPT0wKLUFDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKLVtBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1BQ19DQUNIRV9TQVZFCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCi0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICBBQ19TWVNfTElCVE9PTF9DWUdXSU4KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCi1bICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmddLAotbmVlZF9sb2Nrcz0kZW5hYmxldmFsLAotbmVlZF9sb2Nrcz15ZXMpCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGNoZWNrIGZvciBkbG9wZW4gc3VwcG9ydAotQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtsdF9kbG9wZW49eWVzXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELAotW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELAotW0FDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLAotW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHN0YXRpYywKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLAotW0FDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsCi1bZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKLUFDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLAotW0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKEFDX1BST0dfTEQsCi1bQUNfQVJHX1dJVEgoZ251LWxkLAotWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCi10ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotY2hhbmdlcXVvdGUoLClkbmwKLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfU1VCU1QoTEQpCi1BQ19QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFDX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1BQ19NU0dfUkVTVUxUKFskTk1dKQotQUNfU1VCU1QoTk0pCi1dKQotCi0jIEFDX1NZU19OTV9QQVJTRSAtIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZAotIyBieSBDIHN5bWJvbCBuYW1lIGZyb20gbm0uCi1BQ19ERUZVTihBQ19TWVNfTk1fUEFSU0UsCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUsCi1bIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi1jaGFuZ2VxdW90ZSgsKWRubAotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJGFjX3N5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1jaGFuZ2VxdW90ZSgsKWRubAotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotCSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotXSkKLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1BQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCi1dKQotCi0jIEFDX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgotQUNfREVGVU4oQUNfU1lTX0xJQlRPT0xfQ1lHV0lOLAotW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi1BQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi1dKQotCi0jIEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSAtIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIHVuZGVyc2NvcmU/Ci1BQ19ERUZVTihBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAotW2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi1maQotcm0gLXJmIGNvbmZ0ZXN0KgotXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSkKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLUFDX1NVQlNUKFVTRV9TWU1CT0xfVU5ERVJTQ09SRSlkbmwKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sIFsKLUFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wpCi1BQ19DSEVDS19MSUIobSwgY29zKQotXSkKLQotIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi1BQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLV0pCi0KLSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCi1BQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLCBMSUJMVERMPSItbGx0ZGwiLCBbCi0gICAgY2FzZSAiJGVuYWJsZV9sdGRsX2luc3RhbGwiIGluCi0gICAgbm8pIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKSA7OwotICAgICIiKSBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIgOzsKLSAgICBlc2FjCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geCJubyI7IHRoZW4KLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotQUNfREVGVU4oQU1fU1lTX05NX1BBUlNFLCBbaW5kaXIoW0FDX1NZU19OTV9QQVJTRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwgW2luZGlyKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sIFtpbmRpcihbQUNfU1lTX0xJQlRPT0xfQ1lHV0lOXSldKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2FscGhhLWRpcy5jIGIvb3Bjb2Rlcy9hbHBoYS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyZDhmYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FscGhhLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qIGFscGhhLWRpcy5jIC0tIERpc2Fzc2VtYmxlIEFscGhhIEFYUCBpbnN0cnVjdGlvbnMKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4sCi0gICBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIFBQQyBvcGNvZGUgaGFuZGxpbmcgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FscGhhLmgiCi0KLS8qIE9TRiByZWdpc3RlciBuYW1lcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3NmX3JlZ25hbWVzWzY0XSA9Ci17Ci0gICJ2MCIsICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsICJ0NCIsICJ0NSIsICJ0NiIsCi0gICJ0NyIsICJzMCIsICJzMSIsICJzMiIsICJzMyIsICJzNCIsICJzNSIsICJmcCIsCi0gICJhMCIsICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJ0OCIsICJ0OSIsCi0gICJ0MTAiLCAidDExIiwgInJhIiwgInQxMiIsICJhdCIsICJncCIsICJzcCIsICJ6ZXJvIiwKLSAgIiRmMCIsICIkZjEiLCAiJGYyIiwgIiRmMyIsICIkZjQiLCAiJGY1IiwgIiRmNiIsICIkZjciLAotICAiJGY4IiwgIiRmOSIsICIkZjEwIiwgIiRmMTEiLCAiJGYxMiIsICIkZjEzIiwgIiRmMTQiLCAiJGYxNSIsCi0gICIkZjE2IiwgIiRmMTciLCAiJGYxOCIsICIkZjE5IiwgIiRmMjAiLCAiJGYyMSIsICIkZjIyIiwgIiRmMjMiLAotICAiJGYyNCIsICIkZjI1IiwgIiRmMjYiLCAiJGYyNyIsICIkZjI4IiwgIiRmMjkiLCAiJGYzMCIsICIkZjMxIgotfTsKLQotLyogVk1TIHJlZ2lzdGVyIG5hbWVzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXNfcmVnbmFtZXNbNjRdID0KLXsKLSAgIlIwIiwgIlIxIiwgIlIyIiwgIlIzIiwgIlI0IiwgIlI1IiwgIlI2IiwgIlI3IiwKLSAgIlI4IiwgIlI5IiwgIlIxMCIsICJSMTEiLCAiUjEyIiwgIlIxMyIsICJSMTQiLCAiUjE1IiwKLSAgIlIxNiIsICJSMTciLCAiUjE4IiwgIlIxOSIsICJSMjAiLCAiUjIxIiwgIlIyMiIsICJSMjMiLAotICAiUjI0IiwgIkFJIiwgIlJBIiwgIlBWIiwgIkFUIiwgIkZQIiwgIlNQIiwgIlJaIiwKLSAgIkYwIiwgIkYxIiwgIkYyIiwgIkYzIiwgIkY0IiwgIkY1IiwgIkY2IiwgIkY3IiwKLSAgIkY4IiwgIkY5IiwgIkYxMCIsICJGMTEiLCAiRjEyIiwgIkYxMyIsICJGMTQiLCAiRjE1IiwKLSAgIkYxNiIsICJGMTciLCAiRjE4IiwgIkYxOSIsICJGMjAiLCAiRjIxIiwgIkYyMiIsICJGMjMiLAotICAiRjI0IiwgIkYyNSIsICJGMjYiLCAiRjI3IiwgIkYyOCIsICJGMjkiLCAiRjMwIiwgIkZaIgotfTsKLQotLyogRGlzYXNzZW1ibGUgQWxwaGEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2FscGhhIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlX2luZGV4W0FYUF9OT1BTKzFdOwotICBjb25zdCBjaGFyICogY29uc3QgKiByZWduYW1lczsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlLCAqb3Bjb2RlX2VuZDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgdW5zaWduZWQgaW5zbiwgb3AsIGlzYV9tYXNrOwotICBpbnQgbmVlZF9jb21tYTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtYWpvcm9wIHRhYmxlIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgaWYgKCFvcGNvZGVfaW5kZXhbMF0pCi0gICAgewotICAgICAgb3Bjb2RlID0gYWxwaGFfb3Bjb2RlczsKLSAgICAgIG9wY29kZV9lbmQgPSBvcGNvZGUgKyBhbHBoYV9udW1fb3Bjb2RlczsKLQotICAgICAgZm9yIChvcCA9IDA7IG9wIDwgQVhQX05PUFM7ICsrb3ApCi0gICAgICAgIHsKLSAgICAgICAgICBvcGNvZGVfaW5kZXhbb3BdID0gb3Bjb2RlOwotICAgICAgICAgIHdoaWxlIChvcGNvZGUgPCBvcGNvZGVfZW5kICYmIG9wID09IEFYUF9PUCAob3Bjb2RlLT5vcGNvZGUpKQotCSAgICArK29wY29kZTsKLSAgICAgICAgfQotICAgICAgb3Bjb2RlX2luZGV4W29wXSA9IG9wY29kZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIpCi0gICAgcmVnbmFtZXMgPSB2bXNfcmVnbmFtZXM7Ci0gIGVsc2UKLSAgICByZWduYW1lcyA9IG9zZl9yZWduYW1lczsKLQotICBpc2FfbWFzayA9IEFYUF9PUENPREVfTk9QQUw7Ci0gIHN3aXRjaCAoaW5mby0+bWFjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9hbHBoYV9ldjQ6Ci0gICAgICBpc2FfbWFzayB8PSBBWFBfT1BDT0RFX0VWNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfYWxwaGFfZXY1OgotICAgICAgaXNhX21hc2sgfD0gQVhQX09QQ09ERV9FVjU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX2FscGhhX2V2NjoKLSAgICAgIGlzYV9tYXNrIHw9IEFYUF9PUENPREVfRVY2OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGluc24gaW50byBhIGhvc3Qgd29yZCAqLwotICB7Ci0gICAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICAgIGludCBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICBpbnNuID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLSAgfQotCi0gIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9wID0gQVhQX09QIChpbnNuKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgb3Bjb2RlX2VuZCA9IG9wY29kZV9pbmRleFtvcCsxXTsKLSAgZm9yIChvcGNvZGUgPSBvcGNvZGVfaW5kZXhbb3BdOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyArK29wY29kZSkKLSAgICB7Ci0gICAgICBpZiAoKGluc24gJiBvcGNvZGUtPm1hc2spICE9IG9wY29kZS0+b3Bjb2RlKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoIShvcGNvZGUtPmZsYWdzICYgaXNhX21hc2spKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIHsKLSAgICAgICAgaW50IGludmFsaWQgPSAwOwotICAgICAgICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0JICB7Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9IGFscGhhX29wZXJhbmRzICsgKm9waW5kZXg7Ci0JICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sICZpbnZhbGlkKTsKLQkgIH0KLSAgICAgICAgaWYgKGludmFsaWQpCi0JICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGdvdG8gZm91bmQ7Ci0gICAgfQotCi0gIC8qIE5vIGluc3RydWN0aW9uIGZvdW5kICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmcgJSMwOHgiLCBpbnNuKTsKLSAgICAKLSAgcmV0dXJuIDQ7Ci0KLWZvdW5kOgotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3Bjb2RlLT5uYW1lKTsKLSAgaWYgKG9wY29kZS0+b3BlcmFuZHNbMF0gIT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0gIG5lZWRfY29tbWEgPSAwOwotICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSBhbHBoYV9vcGVyYW5kcyArICpvcGluZGV4OwotICAgICAgaW50IHZhbHVlOwotCi0gICAgICAvKiBPcGVyYW5kcyB0aGF0IGFyZSBtYXJrZWQgRkFLRSBhcmUgc2ltcGx5IGlnbm9yZWQuICBXZQotCSBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKLQkgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZhbGlkLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQl2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBzaWduYml0ID0gMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpOwotCSAgICAgIHZhbHVlID0gKHZhbHVlIF4gc2lnbmJpdCkgLSBzaWduYml0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobmVlZF9jb21tYSAmJgotCSAgKChvcGVyYW5kLT5mbGFncyAmIChBWFBfT1BFUkFORF9QQVJFTlN8QVhQX09QRVJBTkRfQ09NTUEpKQotCSAgICE9IEFYUF9PUEVSQU5EX1BBUkVOUykpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JfQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUEFSRU5TKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCi0gICAgICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfSVIpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWVzW3ZhbHVlXSk7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZQUikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZXNbdmFsdWUrMzJdKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUkVMQVRJVkUpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgNCArIHZhbHVlLCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlI3giLCB2YWx1ZSk7Ci0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1BBUkVOUykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLSAgICAgIG5lZWRfY29tbWEgPSAxOwotICAgIH0KLQotICByZXR1cm4gNDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWxwaGEtb3BjLmMgYi9vcGNvZGVzL2FscGhhLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2VhZjc5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWxwaGEtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ2ICswLDAgQEAKLS8qIGFscGhhLW9wYy5jIC0tIEFscGhhIEFYUCBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEBjeWdudXMuY29tPiwKLSAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSBoYW5kbGluZyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9hbHBoYS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIEFscGhhIEFYUCBvcGNvZGUgdGFibGUuICBUaGUgb3Bjb2RlIHRhYmxlIGluY2x1ZGVzCi0gICBhbG1vc3QgYWxsIG9mIHRoZSBleHRlbmRlZCBpbnN0cnVjdGlvbiBtbmVtb25pY3MuICBUaGlzIHBlcm1pdHMgdGhlCi0gICBkaXNhc3NlbWJsZXIgdG8gdXNlIHRoZW0sIGFuZCBzaW1wbGlmaWVzIHRoZSBhc3NlbWJsZXIgbG9naWMsIGF0IHRoZQotICAgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSB0YWJsZSBzaXplLiAgVGhlIHRhYmxlIGlzIHN0cmljdGx5IGNvbnN0YW50Ci0gICBkYXRhLCBzbyB0aGUgY29tcGlsZXIgc2hvdWxkIGJlIGFibGUgdG8gcHV0IGl0IGluIHRoZSAudGV4dCBzZWN0aW9uLgotCi0gICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQgaW5zZXJ0aW5nCi0gICBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMgZmlsZS4KLQotICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYmFzZSBpbnN0cnVjdGlvbiBzZXQgd2FzIGNvbXBpbGVkIGZyb20gdGhlCi0gICBfQWxwaGEgQXJjaGl0ZWN0dXJlIEhhbmRib29rXywgRGlnaXRhbCBPcmRlciBOdW1iZXIgRUMtUUQyS0ItVEUsCi0gICB2ZXJzaW9uIDIuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBvc3QtZXY1IGFyY2hpdGVjdHVyZSBleHRlbnNpb25zIEJXWCwgQ0lYIGFuZAotICAgTUFYIGNhbWUgZnJvbSB2ZXJzaW9uIDMgb2YgdGhpcyBzYW1lIGRvY3VtZW50LCB3aGljaCBpcyBhbHNvIGF2YWlsYWJsZQotICAgb24tbGluZSBhdCBodHRwOi8vZnRwLmRpZ2l0YWwuY29tL3B1Yi9EaWdpdGFsL2luZm8vc2VtaWNvbmR1Y3RvcgotICAgL2xpdGVyYXR1cmUvYWxwaGFoYjIucGRmCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEVWNCBQQUxjb2RlIGluc3RydWN0aW9ucyB3YXMgY29tcGlsZWQgZnJvbQotICAgX0RFQ2NoaXAgMjEwNjQgYW5kIERFQ2NoaXAgMjEwNjRBIEFscGhhIEFYUCBNaWNyb3Byb2Nlc3NvcnMgSGFyZHdhcmUKLSAgIFJlZmVyZW5jZSBNYW51YWxfLCBEaWdpdGFsIE9yZGVyIE51bWJlciBFQy1ROVpVQS1URSwgcHJlbGltaW5hcnkKLSAgIHJldmlzaW9uIGRhdGVkIEp1bmUgMTk5NC4KLQotICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgRVY1IFBBTGNvZGUgaW5zdHJ1Y3Rpb25zIHdhcyBjb21waWxlZCBmcm9tCi0gICBfQWxwaGEgMjExNjQgTWljcm9wcm9jZXNzb3IgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbF8sIERpZ2l0YWwKLSAgIE9yZGVyIE51bWJlciBFQy1RQUVRQi1URSwgcHJlbGltaW5hcnkgcmV2aXNpb24gZGF0ZWQgQXByaWwgMTk5NS4gICovCi0MCi0vKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfcmJhIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9yY2EgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3phIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF96YiBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfemMgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X2JkaXNwIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9qaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfZXY2aHdqaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludCBleHRyYWN0X3JiYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3JjYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3phIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfemIgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF96YyBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X2JkaXNwIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfamhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9ldjZod2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSAgKi8KLQotY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgYWxwaGFfb3BlcmFuZHNbXSA9Ci17Ci0gIC8qIFRoZSBmaWVsZHMgYXJlIGJpdHMsIHNoaWZ0LCBpbnNlcnQsIGV4dHJhY3QsIGZsYWdzICovCi0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgZW5kLW9mLWxpc3QgKi8KLSNkZWZpbmUgVU5VU0VECQkwCi0gIHsgMCwgMCwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBwbGFpbiBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkcyAqLwotI2RlZmluZSBSQQkJKFVOVVNFRCArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0lSLCAwLCAwIH0sCi0jZGVmaW5lIFJCCQkoUkEgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotI2RlZmluZSBSQwkJKFJCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotCi0gIC8qIFRoZSBwbGFpbiBmcCByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgRkEJCShSQyArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotI2RlZmluZSBGQgkJKEZBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRlBSLCAwLCAwIH0sCi0jZGVmaW5lIEZDCQkoRkIgKyAxKQotICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotCi0gIC8qIFRoZSBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVuIHRoZXkgYXJlIFpFUk8gKi8KLSNkZWZpbmUgWkEJCShGQyArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YSwgZXh0cmFjdF96YSB9LAotI2RlZmluZSBaQgkJKFpBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3piLCBleHRyYWN0X3piIH0sCi0jZGVmaW5lIFpDCQkoWkIgKyAxKQotICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YywgZXh0cmFjdF96YyB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG5lZWRzIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIFBSQgkJKFpDICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TLCAwLCAwIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbmVlZHMgcGFyZW50aGVzZXMgX2FuZF8gYSBwcmVjZWRpbmcgY29tbWEgKi8KLSNkZWZpbmUgQ1BSQgkJKFBSQiArIDEpCi0gIHsgNSwgMTYsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BLCAwLCAwIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgUkEgZmllbGQgKi8KLSNkZWZpbmUgUkJBCQkoQ1BSQiArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF9yYmEsIGV4dHJhY3RfcmJhIH0sCi0KLSAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgUkIgZmllbGQgKi8KLSNkZWZpbmUgUkNBCQkoUkJBICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfcmNhLCBleHRyYWN0X3JjYSB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkEgKi8KLSNkZWZpbmUgRFJDMQkJKFJDQSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNULCAwLCAwIH0sCi0KLSAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQiAqLwotI2RlZmluZSBEUkMyCQkoRFJDMSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkEgKi8KLSNkZWZpbmUgREZDMQkJKERSQzIgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfRlBSfEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QsIDAsIDAgfSwKLQotICAvKiBUaGUgRkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJCICovCi0jZGVmaW5lIERGQzIJCShERkMxICsgMSkKLSAgeyA1LCAwLCAwLAotICAgIEFYUF9PUEVSQU5EX0ZQUnxBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCwgMCwgMCB9LAotCi0gIC8qIFRoZSB1bnNpZ25lZCA4LWJpdCBsaXRlcmFsIG9mIE9wZXJhdGUgZm9ybWF0IGluc25zICovCi0jZGVmaW5lIExJVAkJKERGQzIgKyAxKQotICB7IDgsIDEzLCAtTElULCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSBzaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBvZiBNZW1vcnkgZm9ybWF0IGluc25zLiAgRnJvbSBoZXJlCi0gICAgIHdlIGNhbid0IHRlbGwgd2hhdCByZWxvY2F0aW9uIHNob3VsZCBiZSB1c2VkLCBzbyBkb24ndCB1c2UgYSBkZWZhdWx0LiAqLwotI2RlZmluZSBNRElTUAkJKExJVCArIDEpCi0gIHsgMTYsIDAsIC1NRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIHNpZ25lZCAiMjMtYml0IiBhbGlnbmVkIGRpc3BsYWNlbWVudCBvZiBCcmFuY2ggZm9ybWF0IGluc25zICovCi0jZGVmaW5lIEJESVNQCQkoTURJU1AgKyAxKQotICB7IDIxLCAwLCBCRkRfUkVMT0NfMjNfUENSRUxfUzIsIAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFLCBpbnNlcnRfYmRpc3AsIGV4dHJhY3RfYmRpc3AgfSwKLQotICAvKiBUaGUgMjYtYml0IFBBTGNvZGUgZnVuY3Rpb24gKi8KLSNkZWZpbmUgUEFMRk4JCShCRElTUCArIDEpCi0gIHsgMjYsIDAsIC1QQUxGTiwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgb3B0aW9uYWwgc2lnbmVkICIxNi1iaXQiIGFsaWduZWQgZGlzcGxhY2VtZW50IG9mIHRoZSBKTVAvSlNSIGhpbnQgKi8KLSNkZWZpbmUgSk1QSElOVAkJKFBBTEZOICsgMSkKLSAgeyAxNCwgMCwgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCi0gICAgQVhQX09QRVJBTkRfUkVMQVRJVkV8QVhQX09QRVJBTkRfREVGQVVMVF9aRVJPfEFYUF9PUEVSQU5EX05PT1ZFUkZMT1csCi0gICAgaW5zZXJ0X2poaW50LCBleHRyYWN0X2poaW50IH0sCi0KLSAgLyogVGhlIG9wdGlvbmFsIGhpbnQgdG8gUkVUL0pTUl9DT1JPVVRJTkUgKi8KLSNkZWZpbmUgUkVUSElOVAkJKEpNUEhJTlQgKyAxKQotICB7IDE0LCAwLCAtUkVUSElOVCwKLSAgICBBWFBfT1BFUkFORF9VTlNJR05FRHxBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk8sIDAsIDAgfSwKLQotICAvKiBUaGUgMTItYml0IGRpc3BsYWNlbWVudCBmb3IgdGhlIGV2WzQ2XSBod197bGQsc3R9IChwYWwxYi9wYWwxZikgaW5zbnMgKi8KLSNkZWZpbmUgRVY0SFdESVNQCShSRVRISU5UICsgMSkKLSNkZWZpbmUgRVY2SFdESVNQCShFVjRIV0RJU1ApCi0gIHsgMTIsIDAsIC1FVjRIV0RJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSA1LWJpdCBpbmRleCBmb3IgdGhlIGV2NCBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KLSNkZWZpbmUgRVY0SFdJTkRFWAkoRVY0SFdESVNQICsgMSkKLSAgeyA1LCAwLCAtRVY0SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgOC1iaXQgaW5kZXggZm9yIHRoZSBvZGRseSB1bnF1YWxpZmllZCBod19tW3RmXXByIGluc25zCi0gICAgIHRoYXQgb2NjdXIgaW4gREVDIFBBTGNvZGUuICAqLwotI2RlZmluZSBFVjRFWFRIV0lOREVYCShFVjRIV0lOREVYICsgMSkKLSAgeyA4LCAwLCAtRVY0RVhUSFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgMTAtYml0IGRpc3BsYWNlbWVudCBmb3IgdGhlIGV2NSBod197bGQsc3R9IChwYWwxYi9wYWwxZikgaW5zbnMgKi8KLSNkZWZpbmUgRVY1SFdESVNQCShFVjRFWFRIV0lOREVYICsgMSkKLSAgeyAxMCwgMCwgLUVWNUhXRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDE2LWJpdCBpbmRleCBmb3IgdGhlIGV2NSBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KLSNkZWZpbmUgRVY1SFdJTkRFWAkoRVY1SFdESVNQICsgMSkKLSAgeyAxNiwgMCwgLUVWNUhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDE2LWJpdCBjb21iaW5lZCBpbmRleC9zY29yZWJvYXJkIG1hc2sgZm9yIHRoZSBldjYKLSAgICAgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNkhXSU5ERVgJKEVWNUhXSU5ERVggKyAxKQotICB7IDE2LCAwLCAtRVY2SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgMTMtYml0IGJyYW5jaCBoaW50IGZvciB0aGUgZXY2IGh3X2ptcC9qc3IgKHBhbDFlKSBpbnNuICovCi0jZGVmaW5lIEVWNkhXSk1QSElOVAkoRVY2SFdJTkRFWCsgMSkKLSAgeyA4LCAwLCAtRVY2SFdKTVBISU5ULAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFfEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVST3xBWFBfT1BFUkFORF9OT09WRVJGTE9XLAotICAgIGluc2VydF9ldjZod2poaW50LCBleHRyYWN0X2V2Nmh3amhpbnQgfQotfTsKLQotY29uc3QgaW50IGFscGhhX251bV9vcGVyYW5kcyA9IHNpemVvZihhbHBoYV9vcGVyYW5kcykvc2l6ZW9mKCphbHBoYV9vcGVyYW5kcyk7Ci0KLS8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBSQSBmaWVsZCBpbiB0aGUgc2FtZSBpbnNuLgotICAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBmYWtlLiAgVGhlIGluc2VydGlvbiBmdW5jdGlvbiBqdXN0IGNvcGllcwotICAgdGhlIFJBIGZpZWxkIGludG8gdGhlIFJCIGZpZWxkLCBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdAotICAgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlIHNhbWUuICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfcmJhKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF9yYmEoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoKGluc24gPj4gMTYpICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgc2FtZSBmb3IgdGhlIFJDIGZpZWxkICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfcmNhKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKGluc24gPj4gMjEpICYgMHgxZik7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfcmNhKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKGluc24gJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIEZha2UgYXJndW1lbnRzIGluIHdoaWNoIHRoZSByZWdpc3RlcnMgbXVzdCBiZSBzZXQgdG8gWkVSTyAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3phKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoMzEgPDwgMjEpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3phKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3piKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoMzEgPDwgMTYpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3piKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMICYmICgoaW5zbiA+PiAxNikgJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3pjKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAzMTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF96YyhpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoaW5zbiAmIDB4MWYpICE9IDMxKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIGRpc3BsYWNlbWVudCBmaWVsZCBvZiBhIEJyYW5jaCBmb3JtYXQgaW5zbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X2JkaXNwKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQotICAgICplcnJtc2cgPSBfKCJicmFuY2ggb3BlcmFuZCB1bmFsaWduZWQiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlIC8gNCkgJiAweDFGRkZGRik7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotZXh0cmFjdF9iZGlzcChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4MUZGRkZGKSBeIDB4MTAwMDAwKSAtIDB4MTAwMDAwKTsKLX0KLQotCi0vKiBUaGUgaGludCBmaWVsZCBvZiBhIEpNUC9KU1IgaW5zbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X2poaW50KGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQotICAgICplcnJtc2cgPSBfKCJqdW1wIGhpbnQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgzRkZGKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1leHRyYWN0X2poaW50KGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgcmV0dXJuIDQgKiAoKChpbnNuICYgMHgzRkZGKSBeIDB4MjAwMCkgLSAweDIwMDApOwotfQotCi0vKiBUaGUgaGludCBmaWVsZCBvZiBhbiBFVjYgSFdfSk1QL0pTUiBpbnNuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfZXY2aHdqaGludChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygianVtcCBoaW50IHVuYWxpZ25lZCIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgLyA0KSAmIDB4MUZGRik7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotZXh0cmFjdF9ldjZod2poaW50KGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgcmV0dXJuIDQgKiAoKChpbnNuICYgMHgxRkZGKSBeIDB4MTAwMCkgLSAweDEwMDApOwotfQotCi0MCi0vKiBNYWNyb3MgdXNlZCB0byBmb3JtIG9wY29kZXMgKi8KLQotLyogVGhlIG1haW4gb3Bjb2RlICovCi0jZGVmaW5lIE9QKHgpCQkoKCh4KSAmIDB4M0YpIDw8IDI2KQotI2RlZmluZSBPUF9NQVNLCQkweEZDMDAwMDAwCi0KLS8qIEJyYW5jaCBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEJSQV8ob28pCU9QKG9vKQotI2RlZmluZSBCUkFfTUFTSwlPUF9NQVNLCi0jZGVmaW5lIEJSQShvbykJCUJSQV8ob28pLCBCUkFfTUFTSwotCi0vKiBGbG9hdGluZyBwb2ludCBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEZQXyhvbyxmZmYpCShPUChvbykgfCAoKChmZmYpICYgMHg3RkYpIDw8IDUpKQotI2RlZmluZSBGUF9NQVNLCQkoT1BfTUFTSyB8IDB4RkZFMCkKLSNkZWZpbmUgRlAob28sZmZmKQlGUF8ob28sZmZmKSwgRlBfTUFTSwotCi0vKiBNZW1vcnkgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNRU1fKG9vKQlPUChvbykKLSNkZWZpbmUgTUVNX01BU0sJT1BfTUFTSwotI2RlZmluZSBNRU0ob28pCQlNRU1fKG9vKSwgTUVNX01BU0sKLQotLyogTWVtb3J5L0Z1bmMgQ29kZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIE1GQ18ob28sZmZmZikJKE9QKG9vKSB8ICgoZmZmZikgJiAweEZGRkYpKQotI2RlZmluZSBNRkNfTUFTSwkoT1BfTUFTSyB8IDB4RkZGRikKLSNkZWZpbmUgTUZDKG9vLGZmZmYpCU1GQ18ob28sZmZmZiksIE1GQ19NQVNLCi0KLS8qIE1lbW9yeS9CcmFuY2ggZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNQlJfKG9vLGgpCShPUChvbykgfCAoKChoKSAmIDMpIDw8IDE0KSkKLSNkZWZpbmUgTUJSX01BU0sJKE9QX01BU0sgfCAweEMwMDApCi0jZGVmaW5lIE1CUihvbyxoKQlNQlJfKG9vLGgpLCBNQlJfTUFTSwotCi0vKiBPcGVyYXRlIGZvcm1hdCBpbnN0cnVjdGlvbnMuICBUaGUgT1BSTCB2YXJpYW50IHNwZWNpZmllcyBhCi0gICBsaXRlcmFsIHNlY29uZCBhcmd1bWVudC4gKi8KLSNkZWZpbmUgT1BSXyhvbyxmZikJKE9QKG9vKSB8ICgoKGZmKSAmIDB4N0YpIDw8IDUpKQotI2RlZmluZSBPUFJMXyhvbyxmZikJKE9QUl8oKG9vKSwoZmYpKSB8IDB4MTAwMCkKLSNkZWZpbmUgT1BSX01BU0sJKE9QX01BU0sgfCAweDFGRTApCi0jZGVmaW5lIE9QUihvbyxmZikJT1BSXyhvbyxmZiksIE9QUl9NQVNLCi0jZGVmaW5lIE9QUkwob28sZmYpCU9QUkxfKG9vLGZmKSwgT1BSX01BU0sKLQotLyogR2VuZXJpYyBQQUxjb2RlIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgUENEXyhvbykJT1Aob28pCi0jZGVmaW5lIFBDRF9NQVNLCU9QX01BU0sKLSNkZWZpbmUgUENEKG9vKQkJUENEXyhvbyksIFBDRF9NQVNLCi0KLS8qIFNwZWNpZmljIFBBTGNvZGUgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFNQQ0RfKG9vLGZmZmYpCShPUChvbykgfCAoKGZmZmYpICYgMHgzRkZGRkZGKSkKLSNkZWZpbmUgU1BDRF9NQVNLCTB4RkZGRkZGRkYKLSNkZWZpbmUgU1BDRChvbyxmZmZmKQlTUENEXyhvbyxmZmZmKSwgU1BDRF9NQVNLCi0KLS8qIEhhcmR3YXJlIG1lbW9yeSAoaHdfe2xkLHN0fSkgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEVWNEhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweEYpIDw8IDEyKSkKLSNkZWZpbmUgRVY0SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjAwMCkKLSNkZWZpbmUgRVY0SFdNRU0ob28sZikJRVY0SFdNRU1fKG9vLGYpLCBFVjRIV01FTV9NQVNLCi0KLSNkZWZpbmUgRVY1SFdNRU1fKG9vLGYpCShPUChvbykgfCAoKChmKSAmIDB4M0YpIDw8IDEwKSkKLSNkZWZpbmUgRVY1SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjgwMCkKLSNkZWZpbmUgRVY1SFdNRU0ob28sZikJRVY1SFdNRU1fKG9vLGYpLCBFVjVIV01FTV9NQVNLCi0KLSNkZWZpbmUgRVY2SFdNRU1fKG9vLGYpCShPUChvbykgfCAoKChmKSAmIDB4RikgPDwgMTIpKQotI2RlZmluZSBFVjZIV01FTV9NQVNLCShPUF9NQVNLIHwgMHhGMDAwKQotI2RlZmluZSBFVjZIV01FTShvbyxmKQlFVjZIV01FTV8ob28sZiksIEVWNkhXTUVNX01BU0sKLQotI2RlZmluZSBFVjZIV01CUl8ob28saCkJKE9QKG9vKSB8ICgoKGgpICYgNykgPDwgMTMpKQotI2RlZmluZSBFVjZIV01CUl9NQVNLCShPUF9NQVNLIHwgMHhFMDAwKQotI2RlZmluZSBFVjZIV01CUihvbyxoKQlFVjZIV01CUl8ob28saCksIEVWNkhXTUJSX01BU0sKLQotLyogQWJicmV2aWF0aW9ucyBmb3IgaW5zdHJ1Y3Rpb24gc3Vic2V0cy4gICovCi0jZGVmaW5lIEJBU0UJCQlBWFBfT1BDT0RFX0JBU0UKLSNkZWZpbmUgRVY0CQkJQVhQX09QQ09ERV9FVjQKLSNkZWZpbmUgRVY1CQkJQVhQX09QQ09ERV9FVjUKLSNkZWZpbmUgRVY2CQkJQVhQX09QQ09ERV9FVjYKLSNkZWZpbmUgQldYCQkJQVhQX09QQ09ERV9CV1gKLSNkZWZpbmUgQ0lYCQkJQVhQX09QQ09ERV9DSVgKLSNkZWZpbmUgTUFYCQkJQVhQX09QQ09ERV9NQVgKLQotLyogQ29tbW9uIGNvbWJpbmF0aW9ucyBvZiBhcmd1bWVudHMgKi8KLSNkZWZpbmUgQVJHX05PTkUJCXsgMCB9Ci0jZGVmaW5lIEFSR19CUkEJCQl7IFJBLCBCRElTUCB9Ci0jZGVmaW5lIEFSR19GQlJBCQl7IEZBLCBCRElTUCB9Ci0jZGVmaW5lIEFSR19GUAkJCXsgRkEsIEZCLCBERkMxIH0KLSNkZWZpbmUgQVJHX0ZQWjEJCXsgWkEsIEZCLCBERkMxIH0KLSNkZWZpbmUgQVJHX01FTQkJCXsgUkEsIE1ESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRk1FTQkJeyBGQSwgTURJU1AsIFBSQiB9Ci0jZGVmaW5lIEFSR19PUFIJCQl7IFJBLCBSQiwgRFJDMSB9Ci0jZGVmaW5lIEFSR19PUFJMCQl7IFJBLCBMSVQsIERSQzEgfQotI2RlZmluZSBBUkdfT1BSWjEJCXsgWkEsIFJCLCBEUkMxIH0KLSNkZWZpbmUgQVJHX09QUkxaMQkJeyBaQSwgTElULCBSQyB9Ci0jZGVmaW5lIEFSR19QQ0QJCQl7IFBBTEZOIH0KLSNkZWZpbmUgQVJHX0VWNEhXTUVNCQl7IFJBLCBFVjRIV0RJU1AsIFBSQiB9Ci0jZGVmaW5lIEFSR19FVjRIV01QUgkJeyBSQSwgUkJBLCBFVjRIV0lOREVYIH0KLSNkZWZpbmUgQVJHX0VWNUhXTUVNCQl7IFJBLCBFVjVIV0RJU1AsIFBSQiB9Ci0jZGVmaW5lIEFSR19FVjZIV01FTQkJeyBSQSwgRVY2SFdESVNQLCBQUkIgfQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FIE9QQ09ERSBNQVNLIHsgT1BFUkFORFMgfQotCi0gICBOQU1FCQlpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgIE9QQ09ERQlpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotCi0gICBNQVNLCQlpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgICAgICAgIAl3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotCi0gICBPUEVSQU5EUwlpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLQotICAgVGhlIHByZWNlZGluZyBtYWNyb3MgbWVyZ2UgdGhlIHRleHQgb2YgdGhlIE9QQ09ERSBhbmQgTUFTSyBmaWVsZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLgotCi0gICBPdGhlcndpc2UsIGl0IGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgYW5kIG1pbm9yIGZ1bmN0aW9uIGNvZGUuCi0KLSAgIFRoZXJlIGFyZSB0aHJlZSBjbGFzc2VzIG9mIG5vdC1yZWFsbHktaW5zdHJ1Y3Rpb25zIGluIHRoaXMgdGFibGU6Ci0KLSAgIEFMSUFTCWlzIGFub3RoZXIgbmFtZSBmb3IgYW5vdGhlciBpbnN0cnVjdGlvbi4gIFNvbWUgb2YKLQkJdGhlc2UgY29tZSBmcm9tIHRoZSBBcmNoaXRlY3R1cmUgSGFuZGJvb2ssIHNvbWUKLQkJY29tZSBmcm9tIHRoZSBvcmlnaW5hbCBnYXMgb3Bjb2RlIHRhYmxlcy4gIEluIGFsbAotCQljYXNlcywgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG9wY29kZSBpcyB1bmNoYW5nZWQuCi0KLSAgIFBTRVVETwlhIHN0eWxpemVkIGNvZGUgZm9ybSBlbmRvcnNlZCBieSBDaGFwdGVyIEEuNCBvZiB0aGUKLQkJQXJjaGl0ZWN0dXJlIEhhbmRib29rLgotCi0gICBFWFRSQQlhIHN0eWxpemVkIGNvZGUgZm9ybSBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgZ2FzIHRhYmxlcy4KLQotICAgQW5kIHR3byBhbm5vdGF0aW9uczoKLQotICAgRVY1NiBCVVQJb3Bjb2RlcyB0aGF0IGFyZSBvZmZpY2lhbGx5IGludHJvZHVjZWQgYXMgb2YgdGhlIGV2NTYsCi0gICAJCWJ1dCB3aXRoIGRlZmluZWQgcmVzdWx0cyBvbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMuCi0KLSAgIEVWNTYgVU5BCW9wY29kZXMgdGhhdCB3ZXJlIGludHJvZHVjZWQgYXMgb2YgdGhlIGV2NTYgd2l0aAotICAgCQlwcmVzdW1hYmx5IHVuZGVmaW5lZCByZXN1bHRzIG9uIHByZXZpb3VzIGltcGxlbWVudGF0aW9ucwotCQl0aGF0IHdlcmUgbm90IGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciBleHRlbnNpb24uCi0qLwotCi1jb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlIGFscGhhX29wY29kZXNbXSA9IHsKLSAgeyAiaGFsdCIsCQlTUENEKDB4MDAsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiZHJhaW5hIiwJCVNQQ0QoMHgwMCwweDAwMDIpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJicHQiLAkJU1BDRCgweDAwLDB4MDA4MCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImNhbGxzeXMiLAkJU1BDRCgweDAwLDB4MDA4MyksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImNobWsiLCAJCVNQQ0QoMHgwMCwweDAwODMpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJpbWIiLAkJU1BDRCgweDAwLDB4MDA4NiksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImNhbGxfcGFsIiwJCVBDRCgweDAwKSwgQkFTRSwgQVJHX1BDRCB9LAotICB7ICJwYWwiLAkJUENEKDB4MDApLCBCQVNFLCBBUkdfUENEIH0sCQkvKiBhbGlhcyAqLwotCi0gIHsgImxkYSIsCQlNRU0oMHgwOCksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRhaCIsCQlNRU0oMHgwOSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRidSIsCQlNRU0oMHgwQSksIEJXWCwgQVJHX01FTSB9LAotICB7ICJ1bm9wIiwJCU1FTSgweDBCKSwgQkFTRSwgeyBaQSB9IH0sCQkvKiBwc2V1ZG8gKi8KLSAgeyAibGRxX3UiLAkJTUVNKDB4MEIpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkd3UiLAkJTUVNKDB4MEMpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAic3R3IiwJCU1FTSgweDBEKSwgQldYLCBBUkdfTUVNIH0sCi0gIHsgInN0YiIsCQlNRU0oMHgwRSksIEJXWCwgQVJHX01FTSB9LAotICB7ICJzdHFfdSIsCQlNRU0oMHgwRiksIEJBU0UsIEFSR19NRU0gfSwKLQotICB7ICJzZXh0bCIsCQlPUFIoMHgxMCwweDAwKSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzZXh0bCIsCQlPUFJMKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgImFkZGwiLAkJT1BSKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkbCIsCQlPUFJMKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM0YWRkbCIsCQlPUFIoMHgxMCwweDAyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzNGFkZGwiLAkJT1BSTCgweDEwLDB4MDIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdsIiwJCU9QUigweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5lZ2wiLAkJT1BSTCgweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJsIiwJCU9QUigweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YmwiLAkJT1BSTCgweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNHN1YmwiLAkJT1BSKDB4MTAsMHgwQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRzdWJsIiwJCU9QUkwoMHgxMCwweDBCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wYmdlIiwJCU9QUigweDEwLDB4MEYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGJnZSIsCQlPUFJMKDB4MTAsMHgwRiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM4YWRkbCIsCQlPUFIoMHgxMCwweDEyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzOGFkZGwiLAkJT1BSTCgweDEwLDB4MTIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOHN1YmwiLAkJT1BSKDB4MTAsMHgxQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhzdWJsIiwJCU9QUkwoMHgxMCwweDFCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wdWx0IiwJCU9QUigweDEwLDB4MUQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcHVsdCIsCQlPUFJMKDB4MTAsMHgxRCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFkZHEiLAkJT1BSKDB4MTAsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkcSIsCQlPUFJMKDB4MTAsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM0YWRkcSIsCQlPUFIoMHgxMCwweDIyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzNGFkZHEiLAkJT1BSTCgweDEwLDB4MjIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdxIiwgCQlPUFIoMHgxMCwweDI5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdxIiwgCQlPUFJMKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnEiLAkJT1BSKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic3VicSIsCQlPUFJMKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM0c3VicSIsCQlPUFIoMHgxMCwweDJCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzNHN1YnEiLAkJT1BSTCgweDEwLDB4MkIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXBlcSIsCQlPUFIoMHgxMCwweDJEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBlcSIsCQlPUFJMKDB4MTAsMHgyRCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM4YWRkcSIsCQlPUFIoMHgxMCwweDMyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzOGFkZHEiLAkJT1BSTCgweDEwLDB4MzIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOHN1YnEiLAkJT1BSKDB4MTAsMHgzQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhzdWJxIiwJCU9QUkwoMHgxMCwweDNCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wdWxlIiwJCU9QUigweDEwLDB4M0QpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcHVsZSIsCQlPUFJMKDB4MTAsMHgzRCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFkZGwvdiIsCQlPUFIoMHgxMCwweDQwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhZGRsL3YiLAkJT1BSTCgweDEwLDB4NDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdsL3YiLAkJT1BSKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVnbC92IiwJCU9QUkwoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VibC92IiwJCU9QUigweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YmwvdiIsCQlPUFJMKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGx0IiwJCU9QUigweDEwLDB4NEQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGx0IiwJCU9QUkwoMHgxMCwweDREKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiYWRkcS92IiwJCU9QUigweDEwLDB4NjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZHEvdiIsCQlPUFJMKDB4MTAsMHg2MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5lZ3EvdiIsCQlPUFIoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdxL3YiLAkJT1BSTCgweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJxL3YiLAkJT1BSKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic3VicS92IiwJCU9QUkwoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wbGUiLAkJT1BSKDB4MTAsMHg2RCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wbGUiLAkJT1BSTCgweDEwLDB4NkQpLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgImFuZCIsCQlPUFIoMHgxMSwweDAwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhbmQiLAkJT1BSTCgweDExLDB4MDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhbmRub3QiLAkJT1BSKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFIgfSwJLyogYWxpYXMgKi8KLSAgeyAiYW5kbm90IiwJCU9QUkwoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KLSAgeyAiYmljIiwJCU9QUigweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImJpYyIsCQlPUFJMKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZsYnMiLAkJT1BSKDB4MTEsMHgxNCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmxicyIsCQlPUFJMKDB4MTEsMHgxNCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZsYmMiLAkJT1BSKDB4MTEsMHgxNiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmxiYyIsCQlPUFJMKDB4MTEsMHgxNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5vcCIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgWkIsIFpDIH0gfSwgLyogcHNldWRvICovCi0gIHsgImNsciIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgWkIsIFJDIH0gfSwgLyogcHNldWRvICovCi0gIHsgIm1vdiIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgUkIsIFJDIH0gfSwgLyogcHNldWRvICovCi0gIHsgIm1vdiIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBSQSwgUkJBLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSTCgweDExLDB4MjApLCBCQVNFLCB7IFpBLCBMSVQsIFJDIH0gfSwgLyogcHNldWRvICovCi0gIHsgIm9yIiwJCU9QUigweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCS8qIGFsaWFzICovCi0gIHsgIm9yIiwJCU9QUkwoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KLSAgeyAiYmlzIiwJCU9QUigweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImJpcyIsCQlPUFJMKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZlcSIsCQlPUFIoMHgxMSwweDI0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92ZXEiLAkJT1BSTCgweDExLDB4MjQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bmUiLAkJT1BSKDB4MTEsMHgyNiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdm5lIiwJCU9QUkwoMHgxMSwweDI2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibm90IiwJCU9QUigweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5vdCIsCQlPUFJMKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm9ybm90IiwJCU9QUigweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm9ybm90IiwJCU9QUkwoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAieG9yIiwJCU9QUigweDExLDB4NDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInhvciIsCQlPUFJMKDB4MTEsMHg0MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZsdCIsCQlPUFIoMHgxMSwweDQ0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92bHQiLAkJT1BSTCgweDExLDB4NDQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92Z2UiLAkJT1BSKDB4MTEsMHg0NiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmdlIiwJCU9QUkwoMHgxMSwweDQ2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXF2IiwJCU9QUigweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImVxdiIsCQlPUFJMKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInhvcm5vdCIsCQlPUFIoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUiB9LAkvKiBhbGlhcyAqLwotICB7ICJ4b3Jub3QiLAkJT1BSTCgweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSTCB9LAkvKiBhbGlhcyAqLwotICB7ICJhbWFzayIsCQlPUFIoMHgxMSwweDYxKSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIGV2NTYgYnV0ICovCi0gIHsgImFtYXNrIiwJCU9QUkwoMHgxMSwweDYxKSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBldjU2IGJ1dCAqLwotICB7ICJjbW92bGUiLAkJT1BSKDB4MTEsMHg2NCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmxlIiwJCU9QUkwoMHgxMSwweDY0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmd0IiwJCU9QUigweDExLDB4NjYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZndCIsCQlPUFJMKDB4MTEsMHg2NiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImltcGx2ZXIiLAkJT1BSTF8oMHgxMSwweDZDKXwoMzE8PDIxKXwoMTw8MTMpLAotICAgIAkJCTB4RkZGRkZGRTAsIEJBU0UsIHsgUkMgfSB9LAkJLyogZXY1NiBidXQgKi8KLQotICB7ICJtc2tibCIsCQlPUFIoMHgxMiwweDAyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2tibCIsCQlPUFJMKDB4MTIsMHgwMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dGJsIiwJCU9QUigweDEyLDB4MDYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dGJsIiwJCU9QUkwoMHgxMiwweDA2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zYmwiLAkJT1BSKDB4MTIsMHgwQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zYmwiLAkJT1BSTCgweDEyLDB4MEIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2t3bCIsCQlPUFIoMHgxMiwweDEyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2t3bCIsCQlPUFJMKDB4MTIsMHgxMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dHdsIiwJCU9QUigweDEyLDB4MTYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dHdsIiwJCU9QUkwoMHgxMiwweDE2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zd2wiLAkJT1BSKDB4MTIsMHgxQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zd2wiLAkJT1BSTCgweDEyLDB4MUIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2tsbCIsCQlPUFIoMHgxMiwweDIyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2tsbCIsCQlPUFJMKDB4MTIsMHgyMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dGxsIiwJCU9QUigweDEyLDB4MjYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dGxsIiwJCU9QUkwoMHgxMiwweDI2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zbGwiLAkJT1BSKDB4MTIsMHgyQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zbGwiLAkJT1BSTCgweDEyLDB4MkIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ6YXAiLAkJT1BSKDB4MTIsMHgzMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiemFwIiwJCU9QUkwoMHgxMiwweDMwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiemFwbm90IiwJCU9QUigweDEyLDB4MzEpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInphcG5vdCIsCQlPUFJMKDB4MTIsMHgzMSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za3FsIiwJCU9QUigweDEyLDB4MzIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za3FsIiwJCU9QUkwoMHgxMiwweDMyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAic3JsIiwJCU9QUigweDEyLDB4MzQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInNybCIsCQlPUFJMKDB4MTIsMHgzNCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dHFsIiwJCU9QUigweDEyLDB4MzYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dHFsIiwJCU9QUkwoMHgxMiwweDM2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAic2xsIiwJCU9QUigweDEyLDB4MzkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInNsbCIsCQlPUFJMKDB4MTIsMHgzOSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3FsIiwJCU9QUigweDEyLDB4M0IpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3FsIiwJCU9QUkwoMHgxMiwweDNCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAic3JhIiwJCU9QUigweDEyLDB4M0MpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInNyYSIsCQlPUFJMKDB4MTIsMHgzQyksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za3doIiwJCU9QUigweDEyLDB4NTIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za3doIiwJCU9QUkwoMHgxMiwweDUyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zd2giLAkJT1BSKDB4MTIsMHg1NyksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zd2giLAkJT1BSTCgweDEyLDB4NTcpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHR3aCIsCQlPUFIoMHgxMiwweDVBKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHR3aCIsCQlPUFJMKDB4MTIsMHg1QSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za2xoIiwJCU9QUigweDEyLDB4NjIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za2xoIiwJCU9QUkwoMHgxMiwweDYyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zbGgiLAkJT1BSKDB4MTIsMHg2NyksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zbGgiLAkJT1BSTCgweDEyLDB4NjcpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRsaCIsCQlPUFIoMHgxMiwweDZBKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRsaCIsCQlPUFJMKDB4MTIsMHg2QSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za3FoIiwJCU9QUigweDEyLDB4NzIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za3FoIiwJCU9QUkwoMHgxMiwweDcyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zcWgiLAkJT1BSKDB4MTIsMHg3NyksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zcWgiLAkJT1BSTCgweDEyLDB4NzcpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRxaCIsCQlPUFIoMHgxMiwweDdBKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRxaCIsCQlPUFJMKDB4MTIsMHg3QSksIEJBU0UsIEFSR19PUFJMIH0sCi0KLSAgeyAibXVsbCIsCQlPUFIoMHgxMywweDAwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxsIiwJCU9QUkwoMHgxMywweDAwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXVscSIsCQlPUFIoMHgxMywweDIwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxxIiwJCU9QUkwoMHgxMywweDIwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAidW11bGgiLAkJT1BSKDB4MTMsMHgzMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAidW11bGgiLAkJT1BSTCgweDEzLDB4MzApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtdWxsL3YiLAkJT1BSKDB4MTMsMHg0MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVsbC92IiwJCU9QUkwoMHgxMywweDQwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXVscS92IiwJCU9QUigweDEzLDB4NjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm11bHEvdiIsCQlPUFJMKDB4MTMsMHg2MCksIEJBU0UsIEFSR19PUFJMIH0sCi0KLSAgeyAiaXRvZnMiLAkJRlAoMHgxNCwweDAwNCksIENJWCwgeyBSQSwgWkIsIEZDIH0gfSwKLSAgeyAic3FydGYvYyIsCQlGUCgweDE0LDB4MDBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9jIiwJCUZQKDB4MTQsMHgwMEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgIml0b2ZmIiwJCUZQKDB4MTQsMHgwMTQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCi0gIHsgIml0b2Z0IiwJCUZQKDB4MTQsMHgwMjQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCi0gIHsgInNxcnRnL2MiLAkJRlAoMHgxNCwweDAyQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvYyIsCQlGUCgweDE0LDB4MDJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9tIiwJCUZQKDB4MTQsMHgwNEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L20iLAkJRlAoMHgxNCwweDA2QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYiLAkJRlAoMHgxNCwweDA4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMiLAkJRlAoMHgxNCwweDA4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGciLAkJRlAoMHgxNCwweDBBQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQiLAkJRlAoMHgxNCwweDBBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvZCIsCQlGUCgweDE0LDB4MENCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9kIiwJCUZQKDB4MTQsMHgwRUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3VjIiwJCUZQKDB4MTQsMHgxMEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3VjIiwJCUZQKDB4MTQsMHgxMEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3VjIiwJCUZQKDB4MTQsMHgxMkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3VjIiwJCUZQKDB4MTQsMHgxMkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3VtIiwJCUZQKDB4MTQsMHgxNEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3VtIiwJCUZQKDB4MTQsMHgxNkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3UiLAkJRlAoMHgxNCwweDE4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvdSIsCQlGUCgweDE0LDB4MThCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy91IiwJCUZQKDB4MTQsMHgxQUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3UiLAkJRlAoMHgxNCwweDFBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvdWQiLAkJRlAoMHgxNCwweDFDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvdWQiLAkJRlAoMHgxNCwweDFFQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYvc2MiLAkJRlAoMHgxNCwweDQwQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvc2MiLAkJRlAoMHgxNCwweDQyQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYvcyIsCQlGUCgweDE0LDB4NDhBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zIiwJCUZQKDB4MTQsMHg0QUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3N1YyIsCUZQKDB4MTQsMHg1MEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1YyIsCUZQKDB4MTQsMHg1MEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3N1YyIsCUZQKDB4MTQsMHg1MkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1YyIsCUZQKDB4MTQsMHg1MkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1bSIsCUZQKDB4MTQsMHg1NEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1bSIsCUZQKDB4MTQsMHg1NkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3N1IiwJCUZQKDB4MTQsMHg1OEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1IiwJCUZQKDB4MTQsMHg1OEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3N1IiwJCUZQKDB4MTQsMHg1QUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1IiwJCUZQKDB4MTQsMHg1QUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1ZCIsCUZQKDB4MTQsMHg1Q0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1ZCIsCUZQKDB4MTQsMHg1RUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1aWMiLAlGUCgweDE0LDB4NzBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWljIiwJRlAoMHgxNCwweDcyQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpbSIsCUZQKDB4MTQsMHg3NEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1aW0iLAlGUCgweDE0LDB4NzZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWkiLAlGUCgweDE0LDB4NzhCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWkiLAlGUCgweDE0LDB4N0FCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWlkIiwJRlAoMHgxNCwweDdDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpZCIsCUZQKDB4MTQsMHg3RUIpLCBDSVgsIEFSR19GUFoxIH0sCi0KLSAgeyAiYWRkZi9jIiwJCUZQKDB4MTUsMHgwMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9jIiwJCUZQKDB4MTUsMHgwMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9jIiwJCUZQKDB4MTUsMHgwMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi9jIiwJCUZQKDB4MTUsMHgwMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvYyIsCQlGUCgweDE1LDB4MDFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9jIiwJCUZQKDB4MTUsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy9jIiwJCUZQKDB4MTUsMHgwMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9jIiwJCUZQKDB4MTUsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9jIiwJCUZQKDB4MTUsMHgwMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YvYyIsCQlGUCgweDE1LDB4MDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QvYyIsCQlGUCgweDE1LDB4MDJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3EvYyIsCQlGUCgweDE1LDB4MDJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWYvYyIsCQlGUCgweDE1LDB4MDNDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWcvYyIsCQlGUCgweDE1LDB4MDNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZiIsCQlGUCgweDE1LDB4MDgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ2YiLAkJRlAoMHgxNSwweDA4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJmIiwJCUZQKDB4MTUsMHgwODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZiIsCQlGUCgweDE1LDB4MDgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYiLAkJRlAoMHgxNSwweDA4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZyIsCQlGUCgweDE1LDB4MDlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZyIsCQlGUCgweDE1LDB4MEEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ2ciLAkJRlAoMHgxNSwweDBBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJnIiwJCUZQKDB4MTUsMHgwQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZyIsCQlGUCgweDE1LDB4MEEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmciLAkJRlAoMHgxNSwweDBBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnZXEiLAkJRlAoMHgxNSwweDBBNSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnbHQiLAkJRlAoMHgxNSwweDBBNiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnbGUiLAkJRlAoMHgxNSwweDBBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZiIsCQlGUCgweDE1LDB4MEFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QiLAkJRlAoMHgxNSwweDBBRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxIiwJCUZQKDB4MTUsMHgwQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxZiIsCQlGUCgweDE1LDB4MEJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWciLAkJRlAoMHgxNSwweDBCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvdWMiLAkJRlAoMHgxNSwweDEwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3VjIiwJCUZQKDB4MTUsMHgxMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi91YyIsCQlGUCgweDE1LDB4MTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvdWMiLAkJRlAoMHgxNSwweDEwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy91YyIsCQlGUCgweDE1LDB4MTFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy91YyIsCQlGUCgweDE1LDB4MTIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmcvdWMiLAkJRlAoMHgxNSwweDEyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3VjIiwJCUZQKDB4MTUsMHgxMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy91YyIsCQlGUCgweDE1LDB4MTIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3VjIiwJCUZQKDB4MTUsMHgxMkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC91YyIsCQlGUCgweDE1LDB4MTJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3EvdmMiLAkJRlAoMHgxNSwweDEyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvdSIsCQlGUCgweDE1LDB4MTgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvdSIsCQlGUCgweDE1LDB4MTgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvdSIsCQlGUCgweDE1LDB4MTgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvdSIsCQlGUCgweDE1LDB4MTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3UiLAkJRlAoMHgxNSwweDE5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvdSIsCQlGUCgweDE1LDB4MUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmcvdSIsCQlGUCgweDE1LDB4MUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvdSIsCQlGUCgweDE1LDB4MUEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvdSIsCQlGUCgweDE1LDB4MUEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3UiLAkJRlAoMHgxNSwweDFBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3UiLAkJRlAoMHgxNSwweDFBRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3YiLAkJRlAoMHgxNSwweDFBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvc2MiLAkJRlAoMHgxNSwweDQwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3NjIiwJCUZQKDB4MTUsMHg0MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zYyIsCQlGUCgweDE1LDB4NDAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvc2MiLAkJRlAoMHgxNSwweDQwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zYyIsCQlGUCgweDE1LDB4NDFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9zYyIsCQlGUCgweDE1LDB4NDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc2MiLAkJRlAoMHgxNSwweDQyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3NjIiwJCUZQKDB4MTUsMHg0MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9zYyIsCQlGUCgweDE1LDB4NDIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3NjIiwJCUZQKDB4MTUsMHg0MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zYyIsCQlGUCgweDE1LDB4NDJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc2MiLAkJRlAoMHgxNSwweDQyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvcyIsCQlGUCgweDE1LDB4NDgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ2YvcyIsCQlGUCgweDE1LDB4NDgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmYvcyIsCQlGUCgweDE1LDB4NDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvcyIsCQlGUCgweDE1LDB4NDgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvcyIsCQlGUCgweDE1LDB4NDgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3MiLAkJRlAoMHgxNSwweDQ5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvcyIsCQlGUCgweDE1LDB4NEEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ2cvcyIsCQlGUCgweDE1LDB4NEExKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmcvcyIsCQlGUCgweDE1LDB4NEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvcyIsCQlGUCgweDE1LDB4NEEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvcyIsCQlGUCgweDE1LDB4NEEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdlcS9zIiwJCUZQKDB4MTUsMHg0QTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2x0L3MiLAkJRlAoMHgxNSwweDRBNiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnbGUvcyIsCQlGUCgweDE1LDB4NEE3KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3MiLAkJRlAoMHgxNSwweDRBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3MiLAkJRlAoMHgxNSwweDRBRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3MiLAkJRlAoMHgxNSwweDRBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvc3VjIiwJCUZQKDB4MTUsMHg1MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9zdWMiLAkJRlAoMHgxNSwweDUwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3N1YyIsCQlGUCgweDE1LDB4NTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvc3VjIiwJCUZQKDB4MTUsMHg1MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvc3VjIiwJRlAoMHgxNSwweDUxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvc3VjIiwJCUZQKDB4MTUsMHg1MjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy9zdWMiLAkJRlAoMHgxNSwweDUyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3N1YyIsCQlGUCgweDE1LDB4NTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvc3VjIiwJCUZQKDB4MTUsMHg1MjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2Yvc3VjIiwJRlAoMHgxNSwweDUyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3N1YyIsCUZQKDB4MTUsMHg1MkQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zdmMiLAlGUCgweDE1LDB4NTJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZi9zdSIsCQlGUCgweDE1LDB4NTgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvc3UiLAkJRlAoMHgxNSwweDU4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3N1IiwJCUZQKDB4MTUsMHg1ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi9zdSIsCQlGUCgweDE1LDB4NTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3N1IiwJCUZQKDB4MTUsMHg1OUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3N1IiwJCUZQKDB4MTUsMHg1QTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy9zdSIsCQlGUCgweDE1LDB4NUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvc3UiLAkJRlAoMHgxNSwweDVBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3N1IiwJCUZQKDB4MTUsMHg1QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2Yvc3UiLAkJRlAoMHgxNSwweDVBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3N1IiwJCUZQKDB4MTUsMHg1QUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zdiIsCQlGUCgweDE1LDB4NUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLQotICB7ICJhZGRzL2MiLAkJRlAoMHgxNiwweDAwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL2MiLAkJRlAoMHgxNiwweDAwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL2MiLAkJRlAoMHgxNiwweDAwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL2MiLAkJRlAoMHgxNiwweDAwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L2MiLAkJRlAoMHgxNiwweDAyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L2MiLAkJRlAoMHgxNiwweDAyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L2MiLAkJRlAoMHgxNiwweDAyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L2MiLAkJRlAoMHgxNiwweDAyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9jIiwJCUZQKDB4MTYsMHgwMkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9jIiwJCUZQKDB4MTYsMHgwMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9jIiwJCUZQKDB4MTYsMHgwM0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9jIiwJCUZQKDB4MTYsMHgwM0UpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL20iLAkJRlAoMHgxNiwweDA0MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL20iLAkJRlAoMHgxNiwweDA0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL20iLAkJRlAoMHgxNiwweDA0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL20iLAkJRlAoMHgxNiwweDA0MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L20iLAkJRlAoMHgxNiwweDA2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L20iLAkJRlAoMHgxNiwweDA2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L20iLAkJRlAoMHgxNiwweDA2MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L20iLAkJRlAoMHgxNiwweDA2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9tIiwJCUZQKDB4MTYsMHgwNkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9tIiwJCUZQKDB4MTYsMHgwNkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9tIiwJCUZQKDB4MTYsMHgwN0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9tIiwJCUZQKDB4MTYsMHgwN0UpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzIiwJCUZQKDB4MTYsMHgwODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncyIsIAkJRlAoMHgxNiwweDA4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJzIiwJCUZQKDB4MTYsMHgwODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscyIsCQlGUCgweDE2LDB4MDgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMiLAkJRlAoMHgxNiwweDA4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0IiwJCUZQKDB4MTYsMHgwQTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVndCIsIAkJRlAoMHgxNiwweDBBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJ0IiwJCUZQKDB4MTYsMHgwQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdCIsCQlGUCgweDE2LDB4MEEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQiLAkJRlAoMHgxNiwweDBBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0dW4iLAkJRlAoMHgxNiwweDBBNCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0ZXEiLAkJRlAoMHgxNiwweDBBNSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0bHQiLAkJRlAoMHgxNiwweDBBNiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0bGUiLAkJRlAoMHgxNiwweDBBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cyIsCQlGUCgweDE2LDB4MEFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEiLAkJRlAoMHgxNiwweDBBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzIiwJCUZQKDB4MTYsMHgwQkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdCIsCQlGUCgweDE2LDB4MEJFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9kIiwJCUZQKDB4MTYsMHgwQzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9kIiwJCUZQKDB4MTYsMHgwQzEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9kIiwJCUZQKDB4MTYsMHgwQzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9kIiwJCUZQKDB4MTYsMHgwQzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9kIiwJCUZQKDB4MTYsMHgwRTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9kIiwJCUZQKDB4MTYsMHgwRTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9kIiwJCUZQKDB4MTYsMHgwRTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9kIiwJCUZQKDB4MTYsMHgwRTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvZCIsCQlGUCgweDE2LDB4MEVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvZCIsCQlGUCgweDE2LDB4MEVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvZCIsCQlGUCgweDE2LDB4MEZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvZCIsCQlGUCgweDE2LDB4MEZFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91YyIsCQlGUCgweDE2LDB4MTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvdWMiLAkJRlAoMHgxNiwweDEwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3VjIiwJCUZQKDB4MTYsMHgxMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91YyIsCQlGUCgweDE2LDB4MTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvdWMiLAkJRlAoMHgxNiwweDEyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3VjIiwJCUZQKDB4MTYsMHgxMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91YyIsCQlGUCgweDE2LDB4MTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvdWMiLAkJRlAoMHgxNiwweDEyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91YyIsCQlGUCgweDE2LDB4MTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdmMiLAkJRlAoMHgxNiwweDEyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvdW0iLAkJRlAoMHgxNiwweDE0MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3VtIiwJCUZQKDB4MTYsMHgxNDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91bSIsCQlGUCgweDE2LDB4MTQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvdW0iLAkJRlAoMHgxNiwweDE0MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3VtIiwJCUZQKDB4MTYsMHgxNjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91bSIsCQlGUCgweDE2LDB4MTYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvdW0iLAkJRlAoMHgxNiwweDE2MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3VtIiwJCUZQKDB4MTYsMHgxNjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdW0iLAkJRlAoMHgxNiwweDE2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3ZtIiwJCUZQKDB4MTYsMHgxNkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3UiLAkJRlAoMHgxNiwweDE4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3UiLAkJRlAoMHgxNiwweDE4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3UiLAkJRlAoMHgxNiwweDE4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3UiLAkJRlAoMHgxNiwweDE4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3UiLAkJRlAoMHgxNiwweDFBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3UiLAkJRlAoMHgxNiwweDFBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3UiLAkJRlAoMHgxNiwweDFBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3UiLAkJRlAoMHgxNiwweDFBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91IiwJCUZQKDB4MTYsMHgxQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92IiwJCUZQKDB4MTYsMHgxQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3VkIiwJCUZQKDB4MTYsMHgxQzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91ZCIsCQlGUCgweDE2LDB4MUMxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvdWQiLAkJRlAoMHgxNiwweDFDMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3VkIiwJCUZQKDB4MTYsMHgxQzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91ZCIsCQlGUCgweDE2LDB4MUUwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvdWQiLAkJRlAoMHgxNiwweDFFMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3VkIiwJCUZQKDB4MTYsMHgxRTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91ZCIsCQlGUCgweDE2LDB4MUUzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3VkIiwJCUZQKDB4MTYsMHgxRUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92ZCIsCQlGUCgweDE2LDB4MUVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0c3QiLAkJRlAoMHgxNiwweDJBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VjIiwJCUZQKDB4MTYsMHg1MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWMiLAkJRlAoMHgxNiwweDUwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1YyIsCQlGUCgweDE2LDB4NTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VjIiwJCUZQKDB4MTYsMHg1MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWMiLAkJRlAoMHgxNiwweDUyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1YyIsCQlGUCgweDE2LDB4NTIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VjIiwJCUZQKDB4MTYsMHg1MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWMiLAkJRlAoMHgxNiwweDUyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWMiLAlGUCgweDE2LDB4NTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZjIiwJRlAoMHgxNiwweDUyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VtIiwJCUZQKDB4MTYsMHg1NDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdW0iLAkJRlAoMHgxNiwweDU0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1bSIsCQlGUCgweDE2LDB4NTQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VtIiwJCUZQKDB4MTYsMHg1NDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdW0iLAkJRlAoMHgxNiwweDU2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1bSIsCQlGUCgweDE2LDB4NTYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VtIiwJCUZQKDB4MTYsMHg1NjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdW0iLAkJRlAoMHgxNiwweDU2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdW0iLAlGUCgweDE2LDB4NTZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZtIiwJRlAoMHgxNiwweDU2RiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3UiLAkJRlAoMHgxNiwweDU4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdzL3N1IiwJCUZQKDB4MTYsMHg1ODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3Vicy9zdSIsCQlGUCgweDE2LDB4NTgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3UiLAkJRlAoMHgxNiwweDU4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1IiwJCUZQKDB4MTYsMHg1ODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdSIsCQlGUCgweDE2LDB4NUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3Qvc3UiLAkJRlAoMHgxNiwweDVBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJ0L3N1IiwJCUZQKDB4MTYsMHg1QTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdSIsCQlGUCgweDE2LDB4NUEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3UiLAkJRlAoMHgxNiwweDVBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0dW4vc3UiLAlGUCgweDE2LDB4NUE0KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRlcS9zdSIsCUZQKDB4MTYsMHg1QTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGx0L3N1IiwJRlAoMHgxNiwweDVBNiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0bGUvc3UiLAlGUCgweDE2LDB4NUE3KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1IiwJCUZQKDB4MTYsMHg1QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdiIsCQlGUCgweDE2LDB4NUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWQiLAkJRlAoMHgxNiwweDVDMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1ZCIsCQlGUCgweDE2LDB4NUMxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VkIiwJCUZQKDB4MTYsMHg1QzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWQiLAkJRlAoMHgxNiwweDVDMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1ZCIsCQlGUCgweDE2LDB4NUUwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VkIiwJCUZQKDB4MTYsMHg1RTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWQiLAkJRlAoMHgxNiwweDVFMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1ZCIsCQlGUCgweDE2LDB4NUUzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1ZCIsCUZQKDB4MTYsMHg1RUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdmQiLAlGUCgweDE2LDB4NUVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0c3QvcyIsCQlGUCgweDE2LDB4NkFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWljIiwJRlAoMHgxNiwweDcwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1aWMiLAlGUCgweDE2LDB4NzAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpYyIsCUZQKDB4MTYsMHg3MDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWljIiwJRlAoMHgxNiwweDcwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aWMiLAlGUCgweDE2LDB4NzIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VpYyIsCUZQKDB4MTYsMHg3MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWljIiwJRlAoMHgxNiwweDcyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1aWMiLAlGUCgweDE2LDB4NzIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1aWMiLAlGUCgweDE2LDB4NzJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZpYyIsCUZQKDB4MTYsMHg3MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWljIiwJRlAoMHgxNiwweDczQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L3N1aWMiLAlGUCgweDE2LDB4NzNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWltIiwJRlAoMHgxNiwweDc0MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1aW0iLAlGUCgweDE2LDB4NzQxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpbSIsCUZQKDB4MTYsMHg3NDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWltIiwJRlAoMHgxNiwweDc0MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aW0iLAlGUCgweDE2LDB4NzYwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VpbSIsCUZQKDB4MTYsMHg3NjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWltIiwJRlAoMHgxNiwweDc2MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1aW0iLAlGUCgweDE2LDB4NzYzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1aW0iLAlGUCgweDE2LDB4NzZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZpbSIsCUZQKDB4MTYsMHg3NkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWltIiwJRlAoMHgxNiwweDc3QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L3N1aW0iLAlGUCgweDE2LDB4NzdFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWkiLAkJRlAoMHgxNiwweDc4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdzL3N1aSIsIAlGUCgweDE2LDB4NzgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnMvc3VpIiwJCUZQKDB4MTYsMHg3ODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWkiLAkJRlAoMHgxNiwweDc4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1aSIsCQlGUCgweDE2LDB4NzgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VpIiwJCUZQKDB4MTYsMHg3QTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVndC9zdWkiLCAJRlAoMHgxNiwweDdBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJ0L3N1aSIsCQlGUCgweDE2LDB4N0ExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpIiwJCUZQKDB4MTYsMHg3QTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWkiLAkJRlAoMHgxNiwweDdBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWkiLAlGUCgweDE2LDB4N0FDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZpIiwJRlAoMHgxNiwweDdBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL3N1aSIsCUZQKDB4MTYsMHg3QkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWkiLAlGUCgweDE2LDB4N0JFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWlkIiwJRlAoMHgxNiwweDdDMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1aWQiLAlGUCgweDE2LDB4N0MxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpZCIsCUZQKDB4MTYsMHg3QzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWlkIiwJRlAoMHgxNiwweDdDMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aWQiLAlGUCgweDE2LDB4N0UwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VpZCIsCUZQKDB4MTYsMHg3RTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWlkIiwJRlAoMHgxNiwweDdFMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1aWQiLAlGUCgweDE2LDB4N0UzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1aWQiLAlGUCgweDE2LDB4N0VDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZpZCIsCUZQKDB4MTYsMHg3RUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWlkIiwJRlAoMHgxNiwweDdGQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L3N1aWQiLAlGUCgweDE2LDB4N0ZFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLQotICB7ICJjdnRscSIsCQlGUCgweDE3LDB4MDEwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiZm5vcCIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgeyBaQSwgWkIsIFpDIH0gfSwJLyogcHNldWRvICovCi0gIHsgImZjbHIiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgWkEsIFpCLCBGQyB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJmYWJzIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiZm1vdiIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgeyBGQSwgUkJBLCBGQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJjcHlzIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZm5lZyIsCQlGUCgweDE3LDB4MDIxKSwgQkFTRSwgeyBGQSwgUkJBLCBGQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJjcHlzbiIsCQlGUCgweDE3LDB4MDIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNweXNlIiwJCUZQKDB4MTcsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXRfZnBjciIsCQlGUCgweDE3LDB4MDI0KSwgQkFTRSwgeyBGQSwgUkJBLCBSQ0EgfSB9LAotICB7ICJtZl9mcGNyIiwJCUZQKDB4MTcsMHgwMjUpLCBCQVNFLCB7IEZBLCBSQkEsIFJDQSB9IH0sCi0gIHsgImZjbW92ZXEiLAkJRlAoMHgxNywweDAyQSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdm5lIiwJCUZQKDB4MTcsMHgwMkIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZsdCIsCQlGUCgweDE3LDB4MDJDKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92Z2UiLAkJRlAoMHgxNywweDAyRCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdmxlIiwJCUZQKDB4MTcsMHgwMkUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZndCIsCQlGUCgweDE3LDB4MDJGKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHFsIiwJCUZQKDB4MTcsMHgwMzApLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxbC92IiwJCUZQKDB4MTcsMHgxMzApLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxbC9zdiIsCQlGUCgweDE3LDB4NTMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLQotICB7ICJ0cmFwYiIsCQlNRkMoMHgxOCwweDAwMDApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJkcmFpbnQiLAkJTUZDKDB4MTgsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwJLyogYWxpYXMgKi8KLSAgeyAiZXhjYiIsCQlNRkMoMHgxOCwweDA0MDApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJtYiIsCQlNRkMoMHgxOCwweDQwMDApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJ3bWIiLAkJTUZDKDB4MTgsMHg0NDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiZmV0Y2giLAkJTUZDKDB4MTgsMHg4MDAwKSwgQkFTRSwgeyBQUkIgfSB9LAotICB7ICJmZXRjaF9tIiwJCU1GQygweDE4LDB4QTAwMCksIEJBU0UsIHsgUFJCIH0gfSwKLSAgeyAicnBjYyIsCQlNRkMoMHgxOCwweEMwMDApLCBCQVNFLCB7IFJBIH0gfSwKLSAgeyAicmMiLAkJTUZDKDB4MTgsMHhFMDAwKSwgQkFTRSwgeyBSQSB9IH0sCi0gIHsgImVjYiIsCQlNRkMoMHgxOCwweEU4MDApLCBCQVNFLCB7IFBSQiB9IH0sCS8qIGV2NTYgdW5hICovCi0gIHsgInJzIiwJCU1GQygweDE4LDB4RjAwMCksIEJBU0UsIHsgUkEgfSB9LAotICB7ICJ3aDY0IiwJCU1GQygweDE4LDB4RjgwMCksIEJBU0UsIHsgUFJCIH0gfSwJLyogZXY1NiB1bmEgKi8KLQotICB7ICJod19tZnByIiwJCU9QUigweDE5LDB4MDApLCBFVjQsIHsgUkEsIFJCQSwgRVY0RVhUSFdJTkRFWCB9IH0sCi0gIHsgImh3X21mcHIiLAkJT1AoMHgxOSksIE9QX01BU0ssIEVWNSwgeyBSQSwgUkJBLCBFVjVIV0lOREVYIH0gfSwKLSAgeyAiaHdfbWZwciIsCQlPUCgweDE5KSwgT1BfTUFTSywgRVY2LCB7IFJBLCBaQiwgRVY2SFdJTkRFWCB9IH0sCi0gIHsgImh3X21mcHIvaSIsCU9QUigweDE5LDB4MDEpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL2EiLAlPUFIoMHgxOSwweDAyKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9haSIsCU9QUigweDE5LDB4MDMpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3AiLAlPUFIoMHgxOSwweDA0KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9waSIsCU9QUigweDE5LDB4MDUpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3BhIiwJT1BSKDB4MTksMHgwNiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcGFpIiwJT1BSKDB4MTksMHgwNyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgInBhbDE5IiwJCVBDRCgweDE5KSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgImptcCIsCQlNQlIoMHgxQSwwKSwgQkFTRSwgeyBSQSwgQ1BSQiwgSk1QSElOVCB9IH0sCi0gIHsgImpzciIsCQlNQlIoMHgxQSwxKSwgQkFTRSwgeyBSQSwgQ1BSQiwgSk1QSElOVCB9IH0sCi0gIHsgInJldCIsCQlNQlIoMHgxQSwyKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sCi0gIHsgImpjciIsCQlNQlIoMHgxQSwzKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sIC8qIGFsaWFzICovCi0gIHsgImpzcl9jb3JvdXRpbmUiLAlNQlIoMHgxQSwzKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sCi0KLSAgeyAiaHdfbGRsIiwJCUVWNEhXTUVNKDB4MUIsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsIiwJCUVWNUhXTUVNKDB4MUIsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbCIsCQlFVjZIV01FTSgweDFCLDB4OCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC9hIiwJCUVWNEhXTUVNKDB4MUIsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2EiLAkJRVY1SFdNRU0oMHgxQiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2EiLAkJRVY2SFdNRU0oMHgxQiwweEMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvYWwiLAlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXIiLAlFVjRIV01FTSgweDFCLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hdmwiLAlFVjVIV01FTSgweDFCLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXciLAlFVjVIV01FTSgweDFCLDB4MTgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2wiLAkJRVY1SFdNRU0oMHgxQiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3AiLAkJRVY0SFdNRU0oMHgxQiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcCIsCQlFVjVIV01FTSgweDFCLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcCIsCQlFVjZIV01FTSgweDFCLDB4MCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYSIsCUVWNEhXTUVNKDB4MUIsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhIiwJRVY1SFdNRU0oMHgxQiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXIiLAlFVjRIV01FTSgweDFCLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXciLAlFVjVIV01FTSgweDFCLDB4MzgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BsIiwJRVY1SFdNRU0oMHgxQiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ByIiwJRVY0SFdNRU0oMHgxQiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcHYiLAlFVjVIV01FTSgweDFCLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHZsIiwJRVY1SFdNRU0oMHgxQiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3IiwJRVY1SFdNRU0oMHgxQiwweDI4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9yIiwJCUVWNEhXTUVNKDB4MUIsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3YiLAkJRVY1SFdNRU0oMHgxQiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3YiLAkJRVY2SFdNRU0oMHgxQiwweDQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvdmwiLAlFVjVIV01FTSgweDFCLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvdyIsCQlFVjVIV01FTSgweDFCLDB4MDgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvdyIsCQlFVjZIV01FTSgweDFCLDB4QSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC93YSIsCUVWNkhXTUVNKDB4MUIsMHhFKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3dsIiwJRVY1SFdNRU0oMHgxQiwweDA5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3d2bCIsCUVWNUhXTUVNKDB4MUIsMHgwYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2EiLAlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2F3IiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcCIsCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3AiLAlFVjZIV01FTSgweDFCLDB4MiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3BhIiwJRVY1SFdNRU0oMHgxQiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3B2IiwJRVY1SFdNRU0oMHgxQiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcHciLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC92IiwJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvdyIsCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxIiwJCUVWNEhXTUVNKDB4MUIsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxIiwJCUVWNUhXTUVNKDB4MUIsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcSIsCQlFVjZIV01FTSgweDFCLDB4OSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS9hIiwJCUVWNEhXTUVNKDB4MUIsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2EiLAkJRVY1SFdNRU0oMHgxQiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2EiLAkJRVY2SFdNRU0oMHgxQiwweEQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvYWwiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXIiLAlFVjRIV01FTSgweDFCLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hdmwiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXciLAlFVjVIV01FTSgweDFCLDB4MWMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDFkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2wiLAkJRVY1SFdNRU0oMHgxQiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3AiLAkJRVY0SFdNRU0oMHgxQiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcCIsCQlFVjVIV01FTSgweDFCLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcCIsCQlFVjZIV01FTSgweDFCLDB4MSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYSIsCUVWNEhXTUVNKDB4MUIsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhIiwJRVY1SFdNRU0oMHgxQiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXIiLAlFVjRIV01FTSgweDFCLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXciLAlFVjVIV01FTSgweDFCLDB4M2MpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BsIiwJRVY1SFdNRU0oMHgxQiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ByIiwJRVY0SFdNRU0oMHgxQiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcHYiLAlFVjVIV01FTSgweDFCLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHZsIiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3IiwJRVY1SFdNRU0oMHgxQiwweDJjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9yIiwJCUVWNEhXTUVNKDB4MUIsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3YiLAkJRVY1SFdNRU0oMHgxQiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3YiLAkJRVY2SFdNRU0oMHgxQiwweDUpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvdmwiLAlFVjVIV01FTSgweDFCLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvdyIsCQlFVjVIV01FTSgweDFCLDB4MGMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvdyIsCQlFVjZIV01FTSgweDFCLDB4QiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS93YSIsCUVWNkhXTUVNKDB4MUIsMHhGKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3dsIiwJRVY1SFdNRU0oMHgxQiwweDBkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3d2bCIsCUVWNUhXTUVNKDB4MUIsMHgwZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2EiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2F3IiwJRVY1SFdNRU0oMHgxQiwweDFkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcCIsCUVWNUhXTUVNKDB4MUIsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3AiLAlFVjZIV01FTSgweDFCLDB4MyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3BhIiwJRVY1SFdNRU0oMHgxQiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDNkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3B2IiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcHciLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC92IiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvdyIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQiLAkJRVY0SFdNRU0oMHgxQiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZCIsCQlFVjVIV01FTSgweDFCLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hIiwJCUVWNEhXTUVNKDB4MUIsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvYSIsCQlFVjVIV01FTSgweDFCLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hbCIsCQlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcSIsCQlFVjRIV01FTSgweDFCLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2FxIiwJCUVWNUhXTUVNKDB4MUIsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FxbCIsCUVWNUhXTUVNKDB4MUIsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FxdiIsCUVWNUhXTUVNKDB4MUIsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FxdmwiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hciIsCQlFVjRIV01FTSgweDFCLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2FycSIsCUVWNEhXTUVNKDB4MUIsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXYiLAkJRVY1SFdNRU0oMHgxQiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXciLAkJRVY1SFdNRU0oMHgxQiwweDE4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxIiwJRVY1SFdNRU0oMHgxQiwweDFjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxbCIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cXYiLAlFVjVIV01FTSgweDFCLDB4MWUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3dmwiLAlFVjVIV01FTSgweDFCLDB4MWIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3AiLAkJRVY0SFdNRU0oMHgxQiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wIiwJCUVWNUhXTUVNKDB4MUIsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhIiwJCUVWNEhXTUVNKDB4MUIsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGEiLAkJRVY1SFdNRU0oMHgxQiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFsIiwJRVY1SFdNRU0oMHgxQiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxIiwJRVY0SFdNRU0oMHgxQiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wYXEiLAlFVjVIV01FTSgweDFCLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXFsIiwJRVY1SFdNRU0oMHgxQiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxdiIsCUVWNUhXTUVNKDB4MUIsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcXZsIiwJRVY1SFdNRU0oMHgxQiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wYXJxIiwJRVY0SFdNRU0oMHgxQiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXZsIiwJRVY1SFdNRU0oMHgxQiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3EiLAlFVjVIV01FTSgweDFCLDB4M2MpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxbCIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3F2IiwJRVY1SFdNRU0oMHgxQiwweDNlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cXZsIiwJRVY1SFdNRU0oMHgxQiwweDNmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGwiLAkJRVY1SFdNRU0oMHgxQiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHEiLAkJRVY0SFdNRU0oMHgxQiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wcSIsCQlFVjVIV01FTSgweDFCLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wcWwiLAlFVjVIV01FTSgweDFCLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wcXYiLAlFVjVIV01FTSgweDFCLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wcXZsIiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHIiLAkJRVY0SFdNRU0oMHgxQiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wcnEiLAlFVjRIV01FTSgweDFCLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3B2IiwJCUVWNUhXTUVNKDB4MUIsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3IiwJCUVWNUhXTUVNKDB4MUIsMHgyOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cSIsCUVWNUhXTUVNKDB4MUIsMHgyYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cWwiLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3F2IiwJRVY1SFdNRU0oMHgxQiwweDJlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxdmwiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDJiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcSIsCQlFVjRIV01FTSgweDFCLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3EiLAkJRVY1SFdNRU0oMHgxQiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcWwiLAkJRVY1SFdNRU0oMHgxQiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcXYiLAkJRVY1SFdNRU0oMHgxQiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcXZsIiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvciIsCQlFVjRIV01FTSgweDFCLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3JxIiwJCUVWNEhXTUVNKDB4MUIsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvdiIsCQlFVjVIV01FTSgweDFCLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC92bCIsCQlFVjVIV01FTSgweDFCLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93IiwJCUVWNUhXTUVNKDB4MUIsMHgwOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dsIiwJCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dxIiwJCUVWNUhXTUVNKDB4MUIsMHgwYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dxbCIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dxdiIsCUVWNUhXTUVNKDB4MUIsMHgwZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dxdmwiLAlFVjVIV01FTSgweDFCLDB4MGYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93diIsCQlFVjVIV01FTSgweDFCLDB4MGEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93dmwiLAlFVjVIV01FTSgweDFCLDB4MGIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJwYWwxYiIsCQlQQ0QoMHgxQiksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJzZXh0YiIsCQlPUFIoMHgxQywgMHgwMCksIEJXWCwgQVJHX09QUloxIH0sCi0gIHsgInNleHR3IiwJCU9QUigweDFDLCAweDAxKSwgQldYLCBBUkdfT1BSWjEgfSwKLSAgeyAiY3Rwb3AiLAkJT1BSKDB4MUMsIDB4MzApLCBDSVgsIEFSR19PUFJaMSB9LAotICB7ICJwZXJyIiwJCU9QUigweDFDLCAweDMxKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgImN0bHoiLAkJT1BSKDB4MUMsIDB4MzIpLCBDSVgsIEFSR19PUFJaMSB9LAotICB7ICJjdHR6IiwJCU9QUigweDFDLCAweDMzKSwgQ0lYLCBBUkdfT1BSWjEgfSwKLSAgeyAidW5wa2J3IiwJCU9QUigweDFDLCAweDM0KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAidW5wa2JsIiwJCU9QUigweDFDLCAweDM1KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAicGt3YiIsCQlPUFIoMHgxQywgMHgzNiksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgInBrbGIiLAkJT1BSKDB4MUMsIDB4MzcpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJtaW5zYjgiLCAJCU9QUigweDFDLCAweDM4KSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1pbnNiOCIsIAkJT1BSTCgweDFDLCAweDM4KSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtaW5zdzQiLCAJCU9QUigweDFDLCAweDM5KSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1pbnN3NCIsIAkJT1BSTCgweDFDLCAweDM5KSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtaW51YjgiLCAJCU9QUigweDFDLCAweDNBKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1pbnViOCIsIAkJT1BSTCgweDFDLCAweDNBKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtaW51dzQiLCAJCU9QUigweDFDLCAweDNCKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1pbnV3NCIsIAkJT1BSTCgweDFDLCAweDNCKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXh1YjgiLAkJT1BSKDB4MUMsIDB4M0MpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4dWI4IiwJCU9QUkwoMHgxQywgMHgzQyksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4dXc0IiwJCU9QUigweDFDLCAweDNEKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHV3NCIsCQlPUFJMKDB4MUMsIDB4M0QpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHNiOCIsCQlPUFIoMHgxQywgMHgzRSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXhzYjgiLAkJT1BSTCgweDFDLCAweDNFKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXhzdzQiLAkJT1BSKDB4MUMsIDB4M0YpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4c3c0IiwJCU9QUkwoMHgxQywgMHgzRiksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAiZnRvaXQiLAkJRlAoMHgxQywgMHg3MCksIENJWCwgeyBGQSwgWkIsIFJDIH0gfSwKLSAgeyAiZnRvaXMiLAkJRlAoMHgxQywgMHg3OCksIENJWCwgeyBGQSwgWkIsIFJDIH0gfSwKLQotICB7ICJod19tdHByIiwJCU9QUigweDFELDB4MDApLCBFVjQsIHsgUkEsIFJCQSwgRVY0RVhUSFdJTkRFWCB9IH0sCi0gIHsgImh3X210cHIiLAkJT1AoMHgxRCksIE9QX01BU0ssIEVWNSwgeyBSQSwgUkJBLCBFVjVIV0lOREVYIH0gfSwKLSAgeyAiaHdfbXRwciIsCQlPUCgweDFEKSwgT1BfTUFTSywgRVY2LCB7IFpBLCBSQiwgRVY2SFdJTkRFWCB9IH0sCi0gIHsgImh3X210cHIvaSIsIAlPUFIoMHgxRCwweDAxKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9hIiwgCU9QUigweDFELDB4MDIpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL2FpIiwJT1BSKDB4MUQsMHgwMyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcCIsIAlPUFIoMHgxRCwweDA0KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9waSIsCU9QUigweDFELDB4MDUpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3BhIiwJT1BSKDB4MUQsMHgwNiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcGFpIiwJT1BSKDB4MUQsMHgwNyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgInBhbDFkIiwJCVBDRCgweDFEKSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgImh3X3JlaSIsCQlTUENEKDB4MUUsMHgzRkY4MDAwKSwgRVY0fEVWNSwgQVJHX05PTkUgfSwKLSAgeyAiaHdfcmVpX3N0YWxsIiwJU1BDRCgweDFFLDB4M0ZGQzAwMCksIEVWNSwgQVJHX05PTkUgfSwKLSAgeyAiaHdfam1wIiwgCQlFVjZIV01CUigweDFFLDB4MCksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19qc3IiLCAJCUVWNkhXTUJSKDB4MUUsMHgyKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X3JldCIsIAkJRVY2SFdNQlIoMHgxRSwweDQpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2pjciIsIAkJRVY2SFdNQlIoMHgxRSwweDYpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2Nvcm91dGluZSIsCUVWNkhXTUJSKDB4MUUsMHg2KSwgRVY2LCB7IFpBLCBQUkIgfSB9LCAvKiBhbGlhcyAqLwotICB7ICJod19qbXAvc3RhbGwiLAlFVjZIV01CUigweDFFLDB4MSksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19qc3Ivc3RhbGwiLCAJRVY2SFdNQlIoMHgxRSwweDMpLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfcmV0L3N0YWxsIiwJRVY2SFdNQlIoMHgxRSwweDUpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2pjci9zdGFsbCIsIAlFVjZIV01CUigweDFFLDB4NyksIEVWNiwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiaHdfY29yb3V0aW5lL3N0YWxsIiwgRVY2SFdNQlIoMHgxRSwweDcpLCBFVjYsIHsgWkEsIFBSQiB9IH0sIC8qIGFsaWFzICovCi0gIHsgInBhbDFlIiwJCVBDRCgweDFFKSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgImh3X3N0bCIsCQlFVjRIV01FTSgweDFGLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bCIsCQlFVjVIV01FTSgweDFGLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwiLAkJRVY2SFdNRU0oMHgxRiwweDQpLCBFVjYsIEFSR19FVjZIV01FTSB9LCAvKiA/Pz8gOCAqLwotICB7ICJod19zdGwvYSIsCQlFVjRIV01FTSgweDFGLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9hIiwJCUVWNkhXTUVNKDB4MUYsMHhDKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2FjIiwJRVY1SFdNRU0oMHgxRiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2FyIiwJRVY0SFdNRU0oMHgxRiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvYXYiLAlFVjVIV01FTSgweDFGLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2MiLAkJRVY1SFdNRU0oMHgxRiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3AiLAkJRVY0SFdNRU0oMHgxRiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvcCIsCQlFVjVIV01FTSgweDFGLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcCIsCQlFVjZIV01FTSgweDFGLDB4MCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYSIsCUVWNEhXTUVNKDB4MUYsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhIiwJRVY1SFdNRU0oMHgxRiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYyIsCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wciIsCUVWNEhXTUVNKDB4MUYsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3B2IiwJRVY1SFdNRU0oMHgxRiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9yIiwJCUVWNEhXTUVNKDB4MUYsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3YiLAkJRVY1SFdNRU0oMHgxRiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3ZjIiwJRVY1SFdNRU0oMHgxRiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MiLAkJRVY1SFdNRU0oMHgxRiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvYSIsCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL2F2IiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcCIsCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3AiLAlFVjZIV01FTSgweDFGLDB4MiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3BhIiwJRVY1SFdNRU0oMHgxRiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcHYiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy92IiwJRVY1SFdNRU0oMHgxRiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxIiwJCUVWNEhXTUVNKDB4MUYsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxIiwJCUVWNUhXTUVNKDB4MUYsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cSIsCQlFVjZIV01FTSgweDFGLDB4NSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sIC8qID8/PyA5ICovCi0gIHsgImh3X3N0cS9hIiwJCUVWNEhXTUVNKDB4MUYsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2EiLAkJRVY1SFdNRU0oMHgxRiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2EiLAkJRVY2SFdNRU0oMHgxRiwweEQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdHEvYWMiLAlFVjVIV01FTSgweDFGLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYXIiLAlFVjRIV01FTSgweDFGLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9hdmMiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcCIsCQlFVjRIV01FTSgweDFGLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wIiwJCUVWNUhXTUVNKDB4MUYsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wIiwJCUVWNkhXTUVNKDB4MUYsMHgxKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhIiwJRVY0SFdNRU0oMHgxRiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcGEiLAlFVjVIV01FTSgweDFGLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGFjIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhciIsCUVWNEhXTUVNKDB4MUYsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhciIsCUVWNEhXTUVNKDB4MUYsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXZjIiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BjIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3ByIiwJRVY0SFdNRU0oMHgxRiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcHYiLAlFVjVIV01FTSgweDFGLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcHZjIiwJRVY1SFdNRU0oMHgxRiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3IiLAkJRVY0SFdNRU0oMHgxRiwweDMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvdiIsCQlFVjVIV01FTSgweDFGLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvdmMiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9hIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvYXYiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9wIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcCIsCUVWNkhXTUVNKDB4MUYsMHgzKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcGEiLAlFVjVIV01FTSgweDFGLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3YiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdCIsCQlFVjRIV01FTSgweDFGLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0IiwJCUVWNUhXTUVNKDB4MUYsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2EiLAkJRVY0SFdNRU0oMHgxRiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FjIiwJCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxIiwJCUVWNEhXTUVNKDB4MUYsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXEiLAkJRVY1SFdNRU0oMHgxRiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXFjIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXF2IiwJRVY1SFdNRU0oMHgxRiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXF2YyIsCUVWNUhXTUVNKDB4MUYsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FyIiwJCUVWNEhXTUVNKDB4MUYsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXJxIiwJRVY0SFdNRU0oMHgxRiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9hdiIsCQlFVjVIV01FTSgweDFGLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hdmMiLAlFVjVIV01FTSgweDFGLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3AiLAkJRVY0SFdNRU0oMHgxRiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wIiwJCUVWNUhXTUVNKDB4MUYsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhIiwJCUVWNEhXTUVNKDB4MUYsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGEiLAkJRVY1SFdNRU0oMHgxRiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFjIiwJRVY1SFdNRU0oMHgxRiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxIiwJRVY0SFdNRU0oMHgxRiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wYXEiLAlFVjVIV01FTSgweDFGLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXFjIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxdiIsCUVWNUhXTUVNKDB4MUYsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcXZjIiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFyIiwJRVY0SFdNRU0oMHgxRiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wYXJxIiwJRVY0SFdNRU0oMHgxRiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXZjIiwJRVY1SFdNRU0oMHgxRiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGMiLAkJRVY1SFdNRU0oMHgxRiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHEiLAkJRVY0SFdNRU0oMHgxRiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wcSIsCQlFVjVIV01FTSgweDFGLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wcWMiLAlFVjVIV01FTSgweDFGLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wcXYiLAlFVjVIV01FTSgweDFGLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wcXZjIiwJRVY1SFdNRU0oMHgxRiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHIiLAkJRVY0SFdNRU0oMHgxRiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wcnEiLAlFVjRIV01FTSgweDFGLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3B2IiwJCUVWNUhXTUVNKDB4MUYsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3EiLAkJRVY0SFdNRU0oMHgxRiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9xIiwJCUVWNUhXTUVNKDB4MUYsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3FjIiwJCUVWNUhXTUVNKDB4MUYsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3F2IiwJCUVWNUhXTUVNKDB4MUYsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3F2YyIsCUVWNUhXTUVNKDB4MUYsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3IiLAkJRVY0SFdNRU0oMHgxRiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC92IiwJCUVWNUhXTUVNKDB4MUYsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3ZjIiwJCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgInBhbDFmIiwJCVBDRCgweDFGKSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgImxkZiIsCQlNRU0oMHgyMCksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgImxkZyIsCQlNRU0oMHgyMSksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgImxkcyIsCQlNRU0oMHgyMiksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgImxkdCIsCQlNRU0oMHgyMyksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgInN0ZiIsCQlNRU0oMHgyNCksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgInN0ZyIsCQlNRU0oMHgyNSksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgInN0cyIsCQlNRU0oMHgyNiksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgInN0dCIsCQlNRU0oMHgyNyksIEJBU0UsIEFSR19GTUVNIH0sCi0KLSAgeyAibGRsIiwJCU1FTSgweDI4KSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZHEiLAkJTUVNKDB4MjkpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkbF9sIiwJCU1FTSgweDJBKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZHFfbCIsCQlNRU0oMHgyQiksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RsIiwJCU1FTSgweDJDKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdHEiLAkJTUVNKDB4MkQpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0bF9jIiwJCU1FTSgweDJFKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdHFfYyIsCQlNRU0oMHgyRiksIEJBU0UsIEFSR19NRU0gfSwKLQotICB7ICJiciIsCQlCUkEoMHgzMCksIEJBU0UsIHsgWkEsIEJESVNQIH0gfSwJLyogcHNldWRvICovCi0gIHsgImJyIiwJCUJSQSgweDMwKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJmYmVxIiwJCUJSQSgweDMxKSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJsdCIsCQlCUkEoMHgzMiksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZibGUiLAkJQlJBKDB4MzMpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJic3IiLAkJQlJBKDB4MzQpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImZibmUiLAkJQlJBKDB4MzUpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmdlIiwJCUJSQSgweDM2KSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJndCIsCQlCUkEoMHgzNyksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImJsYmMiLAkJQlJBKDB4MzgpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJlcSIsCQlCUkEoMHgzOSksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmx0IiwJCUJSQSgweDNBKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibGUiLAkJQlJBKDB4M0IpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJsYnMiLAkJQlJBKDB4M0MpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJuZSIsCQlCUkEoMHgzRCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmdlIiwJCUJSQSgweDNFKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJiZ3QiLAkJQlJBKDB4M0YpLCBCQVNFLCBBUkdfQlJBIH0sCi19OwotCi1jb25zdCBpbnQgYWxwaGFfbnVtX29wY29kZXMgPSBzaXplb2YoYWxwaGFfb3Bjb2Rlcykvc2l6ZW9mKCphbHBoYV9vcGNvZGVzKTsKZGlmZiAtLWdpdCBhL29wY29kZXMvYXJjLWRpcy5jIGIvb3Bjb2Rlcy9hcmMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMmIwN2IuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcmMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gcHJpbnRpbmcgY29kZSBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FyYy5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGUgUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IHByaW50X2luc25fYXJjX2Jhc2VfYmlnIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgaW50IHByaW50X2luc24gUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqLCBpbnQsIGludCkpOwotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uICg0IG9yIDggZm9yIHRoZSBBUkMpLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChwYywgaW5mbywgbWFjaCwgYmlnX3ApCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBtYWNoOwotICAgICBpbnQgYmlnX3A7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICpvcGNvZGU7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIGludCBzdGF0dXM7Ci0gIC8qIEZpcnN0IGVsZW1lbnQgaXMgaW5zbiwgc2Vjb25kIGVsZW1lbnQgaXMgbGltbSAoaWYgcHJlc2VudCkuICAqLwotICBhcmNfaW5zbiBpbnNuWzJdOwotICBpbnQgZ290X2xpbW1fcCA9IDA7Ci0gIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotICBzdGF0aWMgaW50IGN1cnJlbnRfbWFjaCA9IDA7Ci0KLSAgaWYgKCFpbml0aWFsaXplZCB8fCBtYWNoICE9IGN1cnJlbnRfbWFjaCkKLSAgICB7Ci0gICAgICBpbml0aWFsaXplZCA9IDE7Ci0gICAgICBjdXJyZW50X21hY2ggPSBhcmNfZ2V0X29wY29kZV9tYWNoIChtYWNoLCBiaWdfcCk7Ci0gICAgICBhcmNfb3Bjb2RlX2luaXRfdGFibGVzIChjdXJyZW50X21hY2gpOwotICAgIH0KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmIChiaWdfcCkKLSAgICBpbnNuWzBdID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgZWxzZQotICAgIGluc25bMF0gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0gICgqZnVuYykgKHN0cmVhbSwgIiUwOGx4XHQiLCBpbnNuWzBdKTsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gbGlzdHMgaGFzaGVkIGJ5IHRoZSBpbnNuIGNvZGUKLSAgICAgKHRob3VnaCB3ZSBuZWVkbid0IGNhcmUgaG93IHRoZXkncmUgaGFzaGVkKS4gICovCi0KLSAgb3Bjb2RlID0gYXJjX29wY29kZV9sb29rdXBfZGlzIChpbnNuWzBdKTsKLSAgZm9yICggOyBvcGNvZGUgIT0gTlVMTDsgb3Bjb2RlID0gQVJDX09QQ09ERV9ORVhUX0RJUyAob3Bjb2RlKSkKLSAgICB7Ci0gICAgICBjaGFyICpzeW47Ci0gICAgICBpbnQgbW9kcyxpbnZhbGlkOwotICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqb3B2YWw7Ci0KLSAgICAgIC8qIEJhc2ljIGJpdCBtYXNrIG11c3QgYmUgY29ycmVjdC4gICovCi0gICAgICBpZiAoKGluc25bMF0gJiBvcGNvZGUtPm1hc2spICE9IG9wY29kZS0+dmFsdWUpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBhcmNfb3Bjb2RlX3N1cHBvcnRlZCAob3Bjb2RlKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIG9wZXJhbmRzLiAgRmlyc3Qgc2VlIGlmIGFueSBvZiB0aGVtCi0JIGhhdmUgZXh0cmFjdGlvbiBmdW5jdGlvbnMsIGFuZCwgaWYgdGhleSBkbywgbWFrZSBzdXJlIHRoZQotCSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0KLSAgICAgIGFyY19vcGNvZGVfaW5pdF9leHRyYWN0ICgpOwotICAgICAgaW52YWxpZCA9IDA7Ci0KLSAgICAgIC8qID8/PyBHcmFudGVkLCB0aGlzIGlzIHNsb3dlciB0aGFuIHRoZSBgcHBjJyB3YXkuICBNYXliZSB3aGVuIHRoaXMgaXMKLQkgZG9uZSBpdCdsbCBiZSBjbGVhciB3aGF0IHRoZSByaWdodCB3YXkgdG8gZG8gdGhpcyBpcy4gICovCi0gICAgICAvKiBJbnN0cnVjdGlvbnMgbGlrZSAiYWRkLmYgcjAscjEsMSIgYXJlIHRyaWNreSBiZWNhdXNlIHRoZSAiLmYiIGdldHMKLQkgcHJpbnRlZCBmaXJzdCwgYnV0IHdlIGRvbid0IGtub3cgaG93IHRvIHByaW50IGl0IHVudGlsIHdlJ3ZlIHByb2Nlc3NlZAotCSB0aGUgcmVncy4gIFNpbmNlIHdlJ3JlIHNjYW5uaW5nIGFsbCB0aGUgYXJncyBiZWZvcmUgcHJpbnRpbmcgdGhlIGluc24KLQkgYW55d2F5cywgaXQncyBhY3R1YWxseSBxdWl0ZSBlYXN5LiAgKi8KLQotICAgICAgZm9yIChzeW4gPSBvcGNvZGUtPnN5bnRheDsgKnN5bjsgKytzeW4pCi0JewotCSAgaW50IGM7Ci0KLQkgIGlmICgqc3luICE9ICclJyB8fCAqKytzeW4gPT0gJyUnKQotCSAgICBjb250aW51ZTsKLQkgIG1vZHMgPSAwOwotCSAgYyA9ICpzeW47Ci0JICB3aGlsZSAoQVJDX01PRF9QIChhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncykpCi0JICAgIHsKLQkgICAgICBtb2RzIHw9IGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbY11dLmZsYWdzICYgQVJDX01PRF9CSVRTOwotCSAgICAgICsrc3luOwotCSAgICAgIGMgPSAqc3luOwotCSAgICB9Ci0JICBvcGVyYW5kID0gYXJjX29wZXJhbmRzICsgYXJjX29wZXJhbmRfbWFwW2NdOwotCSAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIG9wZXJhbmQsIG1vZHMsCi0JCQkJIChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiopIE5VTEwsCi0JCQkJICZpbnZhbGlkKTsKLQl9Ci0gICAgICBpZiAoaW52YWxpZCkKLQljb250aW51ZTsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLQotICAgICAgLyogSWYgd2UgaGF2ZSBhbiBpbnNuIHdpdGggYSBsaW1tLCBmZXRjaCBpdCBub3cuICBTY2FubmluZyB0aGUgaW5zbnMKLQkgdHdpY2UgbGV0cyB1cyBkbyB0aGlzLiAgKi8KLSAgICAgIGlmIChhcmNfb3Bjb2RlX2xpbW1fcCAoTlVMTCkpCi0JewotCSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMgKyA0LCBidWZmZXIsIDQsIGluZm8pOwotCSAgaWYgKHN0YXR1cyAhPSAwKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgaWYgKGJpZ19wKQotCSAgICBpbnNuWzFdID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQkgIGVsc2UKLQkgICAgaW5zblsxXSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JICBnb3RfbGltbV9wID0gMTsKLQl9Ci0KLSAgICAgIGZvciAoc3luID0gb3Bjb2RlLT5zeW50YXg7ICpzeW47ICsrc3luKQotCXsKLQkgIGludCBjOwotCi0JICBpZiAoKnN5biAhPSAnJScgfHwgKisrc3luID09ICclJykKLQkgICAgewotCSAgICAgICgqZnVuYykgKHN0cmVhbSwgIiVjIiwgKnN5bik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgRmV0Y2ggYW55IHNwZWNpYWwgbW9kaWZpZXJzLiAgKi8KLQkgIG1vZHMgPSAwOwotCSAgYyA9ICpzeW47Ci0JICB3aGlsZSAoQVJDX01PRF9QIChhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncykpCi0JICAgIHsKLQkgICAgICBtb2RzIHw9IGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbY11dLmZsYWdzICYgQVJDX01PRF9CSVRTOwotCSAgICAgICsrc3luOwotCSAgICAgIGMgPSAqc3luOwotCSAgICB9Ci0JICBvcGVyYW5kID0gYXJjX29wZXJhbmRzICsgYXJjX29wZXJhbmRfbWFwW2NdOwotCi0JICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICBvcHZhbCA9IE5VTEw7Ci0JICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgewotCSAgICAgIHZhbHVlID0gKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywKLQkJCQkJICAgJm9wdmFsLCAoaW50ICopIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0JCSAgJiYgKHZhbHVlICYgKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkpKQotCQl2YWx1ZSAtPSAxIDw8IG9wZXJhbmQtPmJpdHM7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc3VmZml4IG9wZXJhbmQsIHNldCBgb3B2YWwnLiAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TVUZGSVgpCi0JCW9wdmFsID0gYXJjX29wY29kZV9sb29rdXBfc3VmZml4IChvcGVyYW5kLCB2YWx1ZSk7Ci0JICAgIH0KLQotCSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0ZBS0UpCi0JICAgIDsgLyogbm90aGluZyB0byBkbyAoPz8/IGF0IGxlYXN0IG5vdCB5ZXQpICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NVRkZJWCkKLQkgICAgewotCSAgICAgIC8qIERlZmF1bHQgc3VmZml4ZXMgYXJlbid0IHByaW50ZWQuICBGb3J0dW5hdGVseSwgdGhleSBhbGwgaGF2ZQotCQkgemVybyB2YWx1ZXMuICBBbHNvLCB6ZXJvIHZhbHVlcyBmb3IgYm9vbGVhbiBzdWZmaXhlcyBhcmUKLQkJIHJlcHJlc2VudGVkIGJ5IHRoZSBhYnNlbmNlIG9mIHRleHQuICAqLwotCi0JICAgICAgaWYgKHZhbHVlICE9IDApCi0JCXsKLQkJICAvKiA/Pz8gT1BWQUwgc2hvdWxkIGhhdmUgYSB2YWx1ZS4gIElmIGl0IGRvZXNuJ3QganVzdCBjb3BlCi0JCSAgICAgYXMgd2Ugd2FudCBkaXNhc3NlbWJseSB0byBiZSByZWFzb25hYmx5IHJvYnVzdC4KLQkJICAgICBBbHNvIHJlbWVtYmVyIHRoYXQgc2V2ZXJhbCBjb25kaXRpb24gY29kZSB2YWx1ZXMgKDE2LTMxKQotCQkgICAgIGFyZW4ndCBkZWZpbmVkIHlldC4gIEZvciB0aGVzZSBjYXNlcyBqdXN0IHByaW50IHRoZQotCQkgICAgIG51bWJlciBzdWl0YWJseSBkZWNvcmF0ZWQuICAqLwotCQkgIGlmIChvcHZhbCkKLQkJICAgICgqZnVuYykgKHN0cmVhbSwgIiVzJXMiLAotCQkJICAgICBtb2RzICYgQVJDX01PRF9ET1QgPyAiLiIgOiAiIiwKLQkJCSAgICAgb3B2YWwtPm5hbWUpOwotCQkgIGVsc2UKLQkJICAgICgqZnVuYykgKHN0cmVhbSwgIiVzJWMlZCIsCi0JCQkgICAgIG1vZHMgJiBBUkNfTU9EX0RPVCA/ICIuIiA6ICIiLAotCQkJICAgICBvcGVyYW5kLT5mbXQsIHZhbHVlKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChwYyArIDQgKyB2YWx1ZSwgaW5mbyk7Ci0JICAvKiA/Pz8gTm90IGFsbCBjYXNlcyBvZiB0aGlzIGFyZSBjdXJyZW50bHkgY2F1Z2h0LiAgKi8KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfQUJTT0xVVEVfQlJBTkNIKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9BRERSRVNTKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOwotCSAgZWxzZSBpZiAob3B2YWwpCi0JICAgIC8qIE5vdGUgdGhhdCB0aGlzIGNhc2UgY2F0Y2hlcyBib3RoIG5vcm1hbCBhbmQgYXV4aWxpYXJ5IHJlZ3MuICAqLwotCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlcyIsIG9wdmFsLT5uYW1lKTsKLQkgIGVsc2UKLQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBmb3VuZCBhbmQgcHJpbnRlZCBhbiBpbnN0cnVjdGlvbjsgcmV0dXJuLiAgKi8KLSAgICAgIHJldHVybiBnb3RfbGltbV9wID8gOCA6IDQ7Ci0gICAgfQotCi0gICgqZnVuYykgKHN0cmVhbSwgXygiKnVua25vd24qIikpOwotICByZXR1cm4gNDsKLX0KLQotLyogR2l2ZW4gTUFDSCwgb25lIG9mIGJmZF9tYWNoX2FyY194eHgsIHJldHVybiB0aGUgcHJpbnRfaW5zbiBmdW5jdGlvbiB0byB1c2UuCi0gICBUaGlzIGRvZXMgdGhpbmdzIGEgbm9uLXN0YW5kYXJkIHdheSAodGhlICJzdGFuZGFyZCIgd2F5IHdvdWxkIGJlIHRvIGNvcHkKLSAgIHRoaXMgY29kZSBpbnRvIGRpc2Fzc2VtYmxlLmMpLiAgU2luY2UgdGhlcmUgYXJlIG1vcmUgdGhhbiBhIGNvdXBsZSBvZgotICAgdmFyaWFudHMsIGhpZGluZyBhbGwgdGhpcyBjcnVkIGhlcmUgc2VlbXMgY2xlYW5lci4gICovCi0KLWRpc2Fzc2VtYmxlcl9mdHlwZQotYXJjX2dldF9kaXNhc3NlbWJsZXIgKG1hY2gsIGJpZ19wKQotICAgICBpbnQgbWFjaDsKLSAgICAgaW50IGJpZ19wOwotewotICBzd2l0Y2ggKG1hY2gpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfYXJjX2Jhc2U6Ci0gICAgICByZXR1cm4gYmlnX3AgPyBwcmludF9pbnNuX2FyY19iYXNlX2JpZyA6IHByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlOwotICAgIH0KLSAgcmV0dXJuIHByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZSAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuIChwYywgaW5mbywgYmZkX21hY2hfYXJjX2Jhc2UsIDApOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyY19iYXNlX2JpZyAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuIChwYywgaW5mbywgYmZkX21hY2hfYXJjX2Jhc2UsIDEpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcmMtb3BjLmMgYi9vcGNvZGVzL2FyYy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4ZjY4OS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FyYy1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMzEgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLSNkZWZpbmUgSU5TRVJUX0ZOKGZuKSBcCi1zdGF0aWMgYXJjX2luc24gZm4gUEFSQU1TICgoYXJjX2luc24sIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqLCBcCi0JCQkgICAgaW50LCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiwgbG9uZywgXAotCQkJICAgIGNvbnN0IGNoYXIgKiopKQotI2RlZmluZSBFWFRSQUNUX0ZOKGZuKSBcCi1zdGF0aWMgbG9uZyBmbiBQQVJBTVMgKChhcmNfaW5zbiAqLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgXAotCQkJaW50LCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiosIGludCAqKSkKLQotSU5TRVJUX0ZOIChpbnNlcnRfcmVnKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1tZmluaXNoKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2xpbW1maW5pc2gpOwotSU5TRVJUX0ZOIChpbnNlcnRfc2hpbW1vZmZzZXQpOwotSU5TRVJUX0ZOIChpbnNlcnRfc2hpbW16ZXJvKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZsYWcpOwotSU5TRVJUX0ZOIChpbnNlcnRfZmxhZ2ZpbmlzaCk7Ci1JTlNFUlRfRk4gKGluc2VydF9jb25kKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZvcmNlbGltbSk7Ci1JTlNFUlRfRk4gKGluc2VydF9yZWxhZGRyKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2Fic2FkZHIpOwotSU5TRVJUX0ZOIChpbnNlcnRfdW5vcG1hY3JvKTsKLQotRVhUUkFDVF9GTiAoZXh0cmFjdF9yZWcpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF9mbGFnKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfY29uZCk7Ci1FWFRSQUNUX0ZOIChleHRyYWN0X3JlbGFkZHIpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF91bm9wbWFjcm8pOwotCi0vKiBWYXJpb3VzIHR5cGVzIG9mIEFSQyBvcGVyYW5kcywgaW5jbHVkaW5nIGluc24gc3VmZml4ZXMuICAqLwotCi0vKiBJbnNuIGZvcm1hdCB2YWx1ZXM6Ci0KLSAgICdhJwlSRUdBCQlyZWdpc3RlciBBIGZpZWxkCi0gICAnYicJUkVHQgkJcmVnaXN0ZXIgQiBmaWVsZAotICAgJ2MnCVJFR0MJCXJlZ2lzdGVyIEMgZmllbGQKLSAgICdTJwlTSElNTUZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIGEgc2hpbW0gdmFsdWUKLSAgICdMJwlMSU1NRklOSVNICWZpbmlzaCBpbnNlcnRpbmcgYSBsaW1tIHZhbHVlCi0gICAnZCcJU0hJTU1PRkZTRVQJc2hpbW0gb2Zmc2V0IGluIGxkLHN0IGluc25zCi0gICAnMCcJU0hJTU1aRVJPCTAgc2hpbW0gdmFsdWUgaW4gbGQsc3QgaW5zbnMKLSAgICdmJwlGTEFHCQlGIGZsYWcKLSAgICdGJwlGTEFHRklOSVNICWZpbmlzaCBpbnNlcnRpbmcgdGhlIEYgZmxhZwotICAgJ0cnCUZMQUdJTlNOCWluc2VydCBGIGZsYWcgaW4gImZsYWciIGluc24KLSAgICduJwlERUxBWQkJTiBmaWVsZCAobnVsbGlmeSBmaWVsZCkKLSAgICdxJwlDT05ECQljb25kaXRpb24gY29kZSBmaWVsZAotICAgJ1EnCUZPUkNFTElNTQlzZXQgYGNvbmRfcCcgdG8gMSB0byBlbnN1cmUgYSBjb25zdGFudCBpcyBhIGxpbW0KLSAgICdCJwlCUkFOQ0gJCWJyYW5jaCBhZGRyZXNzICgyMiBiaXQgcGMgcmVsYXRpdmUpCi0gICAnSicJSlVNUAkJanVtcCBhZGRyZXNzICgyNiBiaXQgYWJzb2x1dGUpCi0gICAneicJU0laRTEJCXNpemUgZmllbGQgaW4gbGQgYSxbYixjXQotICAgJ1onCVNJWkUxMAkJc2l6ZSBmaWVsZCBpbiBsZCBhLFtiLHNoaW1tXQotICAgJ3knCVNJWkUyMgkJc2l6ZSBmaWVsZCBpbiBzdCBjLFtiLHNoaW1tXQotICAgJ3gnCVNJR04wCQlzaWduIGV4dGVuZCBmaWVsZCBsZCBhLFtiLGNdCi0gICAnWCcJU0lHTjkJCXNpZ24gZXh0ZW5kIGZpZWxkIGxkIGEsW2Isc2hpbW1dCi0gICAndycJQUREUkVTUzMJd3JpdGUtYmFjayBmaWVsZCBpbiBsZCBhLFtiLGNdCi0gICAnVycJQUREUkVTUzEyCXdyaXRlLWJhY2sgZmllbGQgaW4gbGQgYSxbYixzaGltbV0KLSAgICd2JwlBRERSRVNTMjQJd3JpdGUtYmFjayBmaWVsZCBpbiBzdCBjLFtiLHNoaW1tXQotICAgJ2UnCUNBQ0hFQllQQVNTNQljYWNoZSBieXBhc3MgaW4gbGQgYSxbYixjXQotICAgJ0UnCUNBQ0hFQllQQVNTMTQJY2FjaGUgYnlwYXNzIGluIGxkIGEsW2Isc2hpbW1dCi0gICAnRCcJQ0FDSEVCWVBBU1MyNgljYWNoZSBieXBhc3MgaW4gc3QgYyxbYixzaGltbV0KLSAgICdVJwlVTk9QTUFDUk8JZmFrZSBvcGVyYW5kIHRvIGNvcHkgUkVHQiB0byBSRUdDIGZvciB1bm9wIG1hY3JvcwotCi0gICBUaGUgZm9sbG93aW5nIG1vZGlmaWVycyBtYXkgYXBwZWFyIGJldHdlZW4gdGhlICUgYW5kIGNoYXIgKGVnOiAlLmYpOgotCi0gICAnLicJTU9ERE9UCQknLicgcHJlZml4IG11c3QgYmUgcHJlc2VudAotICAgJ3InCVJFRwkJZ2VuZXJpYyByZWdpc3RlciB2YWx1ZSwgZm9yIHJlZ2lzdGVyIHRhYmxlCi0gICAnQScJQVVYUkVHCQlhdXhpbGlhcnkgcmVnaXN0ZXIgaW4gbHIgYSxbYl0sIHNyIGMsW2JdCi0KLSAgIEZpZWxkcyBhcmU6Ci0KLSAgIENIQVIgQklUUyBTSElGVCBGTEFHUyBJTlNFUlRfRk4gRVhUUkFDVF9GTgotKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kIGFyY19vcGVyYW5kc1tdID0KLXsKLS8qIHBsYWNlIGhvbGRlciAoPz8/IG5vdCBzdXJlIGlmIG5lZWRlZCkgKi8KLSNkZWZpbmUgVU5VU0VEIDAKLSAgeyAwIH0sCi0KLS8qIHJlZ2lzdGVyIEEgb3Igc2hpbW0vbGltbSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUkVHQSAoVU5VU0VEICsgMSkKLSAgeyAnYScsIDYsIEFSQ19TSElGVF9SRUdBLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWcsIGV4dHJhY3RfcmVnIH0sCi0KLS8qIHJlZ2lzdGVyIEIgb3Igc2hpbW0vbGltbSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUkVHQiAoUkVHQSArIDEpCi0gIHsgJ2InLCA2LCBBUkNfU0hJRlRfUkVHQiwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVnLCBleHRyYWN0X3JlZyB9LAotCi0vKiByZWdpc3RlciBDIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0MgKFJFR0IgKyAxKQotICB7ICdjJywgNiwgQVJDX1NISUZUX1JFR0MsIEFSQ19PUEVSQU5EX1NJR05FRCwgaW5zZXJ0X3JlZywgZXh0cmFjdF9yZWcgfSwKLQotLyogZmFrZSBvcGVyYW5kIHVzZWQgdG8gaW5zZXJ0IHNoaW1tIHZhbHVlIGludG8gbW9zdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgU0hJTU1GSU5JU0ggKFJFR0MgKyAxKQotICB7ICdTJywgOSwgMCwgQVJDX09QRVJBTkRfU0lHTkVEICsgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3NoaW1tZmluaXNoLCAwIH0sCi0KLS8qIGZha2Ugb3BlcmFuZCB1c2VkIHRvIGluc2VydCBsaW1tIHZhbHVlIGludG8gbW9zdCBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBMSU1NRklOSVNIIChTSElNTUZJTklTSCArIDEpCi0gIHsgJ0wnLCAzMiwgMzIsIEFSQ19PUEVSQU5EX0FERFJFU1MgKyBBUkNfT1BFUkFORF9MSU1NICsgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2xpbW1maW5pc2gsIDAgfSwKLQotLyogc2hpbW0gb3BlcmFuZCB3aGVuIHRoZXJlIGlzIG5vIHJlZyBpbmRpY2F0b3IgKGxkLHN0KSAqLwotI2RlZmluZSBTSElNTU9GRlNFVCAoTElNTUZJTklTSCArIDEpCi0gIHsgJ2QnLCA5LCAwLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9zaGltbW9mZnNldCwgMCB9LAotCi0vKiAwIHNoaW1tIG9wZXJhbmQgZm9yIGxkLHN0IGluc25zICovCi0jZGVmaW5lIFNISU1NWkVSTyAoU0hJTU1PRkZTRVQgKyAxKQotICB7ICcwJywgOSwgMCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3NoaW1temVybywgMCB9LAotCi0vKiBmbGFnIHVwZGF0ZSBiaXQgKGluc2VydGlvbiBpcyBkZWZlcmVkIHVudGlsIHdlIGtub3cgaG93KSAqLwotI2RlZmluZSBGTEFHIChTSElNTVpFUk8gKyAxKQotICB7ICdmJywgMSwgOCwgQVJDX09QRVJBTkRfU1VGRklYLCBpbnNlcnRfZmxhZywgZXh0cmFjdF9mbGFnIH0sCi0KLS8qIGZha2UgdXRpbGl0eSBvcGVyYW5kIHRvIGZpbmlzaCAnZicgc3VmZml4IGhhbmRsaW5nICovCi0jZGVmaW5lIEZMQUdGSU5JU0ggKEZMQUcgKyAxKQotICB7ICdGJywgMSwgOCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2ZsYWdmaW5pc2gsIDAgfSwKLQotLyogZmFrZSB1dGlsaXR5IG9wZXJhbmQgdG8gc2V0IHRoZSAnZicgZmxhZyBmb3IgdGhlICJmbGFnIiBpbnNuICovCi0jZGVmaW5lIEZMQUdJTlNOIChGTEFHRklOSVNIICsgMSkKLSAgeyAnRycsIDEsIDgsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9mbGFnLCAwIH0sCi0KLS8qIGJyYW5jaCBkZWxheSB0eXBlcyAqLwotI2RlZmluZSBERUxBWSAoRkxBR0lOU04gKyAxKQotICB7ICduJywgMiwgNSwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNvbmRpdGlvbnMgKi8KLSNkZWZpbmUgQ09ORCAoREVMQVkgKyAxKQotICB7ICdxJywgNSwgMCwgQVJDX09QRVJBTkRfU1VGRklYLCBpbnNlcnRfY29uZCwgZXh0cmFjdF9jb25kIH0sCi0KLS8qIHNldCBgY29uZF9wJyB0byAxIHRvIGVuc3VyZSBhIGNvbnN0YW50IGlzIHRyZWF0ZWQgYXMgYSBsaW1tICovCi0jZGVmaW5lIEZPUkNFTElNTSAoQ09ORCArIDEpCi0gIHsgJ1EnLCAwLCAwLCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfZm9yY2VsaW1tIH0sCi0KLS8qIGJyYW5jaCBhZGRyZXNzOyBiLCBibCwgYW5kIGxwIGluc25zICovCi0jZGVmaW5lIEJSQU5DSCAoRk9SQ0VMSU1NICsgMSkKLSAgeyAnQicsIDIwLCA3LCBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0ggKyBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWxhZGRyLCBleHRyYWN0X3JlbGFkZHIgfSwKLQotLyoganVtcCBhZGRyZXNzOyBqIGluc24gKHRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzICdMJyBleGNlcHQgdGhhdCB0aGUKLSAgIHZhbHVlIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgMikgKi8KLSNkZWZpbmUgSlVNUCAoQlJBTkNIICsgMSkKLSAgeyAnSicsIDI0LCAzMiwgQVJDX09QRVJBTkRfQUJTT0xVVEVfQlJBTkNIICsgQVJDX09QRVJBTkRfTElNTSArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9hYnNhZGRyIH0sCi0KLS8qIHNpemUgZmllbGQsIHN0b3JlZCBpbiBiaXQgMSwyICovCi0jZGVmaW5lIFNJWkUxIChKVU1QICsgMSkKLSAgeyAneicsIDIsIDEsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBzaXplIGZpZWxkLCBzdG9yZWQgaW4gYml0IDEwLDExICovCi0jZGVmaW5lIFNJWkUxMCAoU0laRTEgKyAxKQotICB7ICdaJywgMiwgMTAsIEFSQ19PUEVSQU5EX1NVRkZJWCwgfSwKLQotLyogc2l6ZSBmaWVsZCwgc3RvcmVkIGluIGJpdCAyMiwyMyAqLwotI2RlZmluZSBTSVpFMjIgKFNJWkUxMCArIDEpCi0gIHsgJ3knLCAyLCAyMiwgQVJDX09QRVJBTkRfU1VGRklYLCB9LAotCi0vKiBzaWduIGV4dGVuZCBmaWVsZCwgc3RvcmVkIGluIGJpdCAwICovCi0jZGVmaW5lIFNJR04wIChTSVpFMjIgKyAxKQotICB7ICd4JywgMSwgMCwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIHNpZ24gZXh0ZW5kIGZpZWxkLCBzdG9yZWQgaW4gYml0IDkgKi8KLSNkZWZpbmUgU0lHTjkgKFNJR04wICsgMSkKLSAgeyAnWCcsIDEsIDksIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBhZGRyZXNzIHdyaXRlIGJhY2ssIHN0b3JlZCBpbiBiaXQgMyAqLwotI2RlZmluZSBBRERSRVNTMyAoU0lHTjkgKyAxKQotICB7ICd3JywgMSwgMywgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGFkZHJlc3Mgd3JpdGUgYmFjaywgc3RvcmVkIGluIGJpdCAxMiAqLwotI2RlZmluZSBBRERSRVNTMTIgKEFERFJFU1MzICsgMSkKLSAgeyAnVycsIDEsIDEyLCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogYWRkcmVzcyB3cml0ZSBiYWNrLCBzdG9yZWQgaW4gYml0IDI0ICovCi0jZGVmaW5lIEFERFJFU1MyNCAoQUREUkVTUzEyICsgMSkKLSAgeyAndicsIDEsIDI0LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogY2FjaGUgYnlwYXNzLCBzdG9yZWQgaW4gYml0IDUgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1M1IChBRERSRVNTMjQgKyAxKQotICB7ICdlJywgMSwgNSwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNhY2hlIGJ5cGFzcywgc3RvcmVkIGluIGJpdCAxNCAqLwotI2RlZmluZSBDQUNIRUJZUEFTUzE0IChDQUNIRUJZUEFTUzUgKyAxKQotICB7ICdFJywgMSwgMTQsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjYWNoZSBieXBhc3MsIHN0b3JlZCBpbiBiaXQgMjYgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1MyNiAoQ0FDSEVCWVBBU1MxNCArIDEpCi0gIHsgJ0QnLCAxLCAyNiwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIHVub3AgbWFjcm8sIHVzZWQgdG8gY29weSBSRUdCIHRvIFJFR0MgKi8KLSNkZWZpbmUgVU5PUE1BQ1JPIChDQUNIRUJZUEFTUzI2ICsgMSkKLSAgeyAnVScsIDYsIEFSQ19TSElGVF9SRUdDLCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfdW5vcG1hY3JvLCBleHRyYWN0X3Vub3BtYWNybyB9LAotCi0vKiAnLicgbW9kaWZpZXIgKCcuJyByZXF1aXJlZCkuICAqLwotI2RlZmluZSBNT0RET1QgKFVOT1BNQUNSTyArIDEpCi0gIHsgJy4nLCAxLCAwLCBBUkNfTU9EX0RPVCB9LAotCi0vKiBEdW1teSAncicgbW9kaWZpZXIgZm9yIHRoZSByZWdpc3RlciB0YWJsZS4KLSAgIEl0J3MgY2FsbGVkIGEgImR1bW15IiBiZWNhdXNlIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gaW5zZXJ0aW5nIGFuICdyJyBpbnRvIGFsbAotICAgdGhlICVhLyViLyVjIG9jY3VycmVuY2VzIGluIHRoZSBpbnNuIHRhYmxlLiAgKi8KLSNkZWZpbmUgUkVHIChNT0RET1QgKyAxKQotICB7ICdyJywgNiwgMCwgQVJDX01PRF9SRUcgfSwKLQotLyogS25vd24gYXV4aWxpYXJ5IHJlZ2lzdGVyIG1vZGlmaWVyIChzdG9yZWQgaW4gc2hpbW0gZmllbGQpLiAgKi8KLSNkZWZpbmUgQVVYUkVHIChSRUcgKyAxKQotICB7ICdBJywgOSwgMCwgQVJDX01PRF9BVVhSRUcgfSwKLQotLyogZW5kIG9mIGxpc3QgcGxhY2UgaG9sZGVyICovCi0gIHsgMCB9Ci19OwotDAotLyogR2l2ZW4gYSBmb3JtYXQgbGV0dGVyLCB5aWVsZHMgdGhlIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycuCi0gICBlZzogYXJjX29wZXJhbmRfbWFwWydhJ10gPSBSRUdBLiAgKi8KLXVuc2lnbmVkIGNoYXIgYXJjX29wZXJhbmRfbWFwWzI1Nl07Ci0KLSNkZWZpbmUgSSh4KSAoKCh4KSAmIDMxKSA8PCAyNykKLSNkZWZpbmUgQSh4KSAoKCh4KSAmIEFSQ19NQVNLX1JFRykgPDwgQVJDX1NISUZUX1JFR0EpCi0jZGVmaW5lIEIoeCkgKCgoeCkgJiBBUkNfTUFTS19SRUcpIDw8IEFSQ19TSElGVF9SRUdCKQotI2RlZmluZSBDKHgpICgoKHgpICYgQVJDX01BU0tfUkVHKSA8PCBBUkNfU0hJRlRfUkVHQykKLSNkZWZpbmUgUih4LGIsbSkgKCgoeCkgJiAobSkpIDw8IChiKSkJLyogdmFsdWUgWCwgbWFzayBNLCBhdCBiaXQgQiAqLwotCi0vKiBBUkMgaW5zdHJ1Y3Rpb25zLgotCi0gICBMb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgbXVzdCBhcHBlYXIgYmVmb3JlIHNob3J0ZXIgb25lcyAoaWYgZ2FzIHNlZXMKLSAgICJsc3IgcjIscjMsMSIgd2hlbiBpdCdzIHBhcnNpbmcgImxzciAlYSwlYiIgaXQgd2lsbCB0aGluayB0aGUgIiwxIiBpcwotICAganVuaykuICBUaGlzIGlzbid0IG5lY2Vzc2FyeSBmb3IgYGxkJyBiZWNhdXNlIG9mIHRoZSB0cmFpbGluZyAnXScuCi0KLSAgIEluc3RydWN0aW9ucyB0aGF0IGFyZSByZWFsbHkgbWFjcm9zIGJhc2VkIG9uIG90aGVyIGluc25zIG11c3QgYXBwZWFyCi0gICBiZWZvcmUgdGhlIHJlYWwgaW5zbiBzbyB0aGV5J3JlIGNob3NlbiB3aGVuIGRpc2Fzc2VtYmxpbmcuICBFZzogVGhlIGBtb3YnCi0gICBpbnNuIGlzIHJlYWxseSB0aGUgYGFuZCcgaW5zbi4KLQotICAgVGhpcyB0YWJsZSBpcyBiZXN0IHZpZXdlZCBvbiBhIHdpZGUgc2NyZWVuICgxNjEgY29sdW1ucykuICBJJ2QgcHJlZmVyIHRvCi0gICBrZWVwIGl0IHRoaXMgd2F5LiAgVGhlIHJlc3Qgb2YgdGhlIGZpbGUsIGhvd2V2ZXIsIHNob3VsZCBiZSB2aWV3YWJsZSBvbiBhbgotICAgODAgY29sdW1uIHRlcm1pbmFsLiAgKi8KLQotLyogPz8/IFRoaXMgdGFibGUgYWxzbyBpbmNsdWRlcyBtYWNyb3M6IGFzbCwgbHNsLCBhbmQgbW92LiAgVGhlIHBwYyBwb3J0IGhhcwotICAgYSBtb3JlIGdlbmVyYWwgZmFjaWxpdHkgZm9yIGRlYWxpbmcgd2l0aCBtYWNyb3Mgd2hpY2ggY291bGQgYmUgdXNlZCBpZgotICAgd2UgbmVlZCB0by4gICovCi0KLS8qIFRoaXMgdGFibGUgY2FuJ3QgYmUgYGNvbnN0JyBiZWNhdXNlIG1lbWJlcnMgYG5leHRfYXNtJyBhbmQgYG5leHRfZGlzJyBhcmUKLSAgIGNvbXB1dGVkIGF0IHJ1bi10aW1lLiAgV2UgY291bGQgc3BsaXQgdGhpcyBpbnRvIHR3bywgYnV0IHRoYXQgZG9lc24ndCBzZWVtCi0gICB3b3J0aCBpdC4gICovCi0KLXN0cnVjdCBhcmNfb3Bjb2RlIGFyY19vcGNvZGVzW10gPSB7Ci0KLSAgLyogTWFjcm9zIGFwcGVhciBmaXJzdC4gICovCi0gIC8qICJtb3YiIGlzIHJlYWxseSBhbiAiYW5kIi4gICovCi0gIHsgIm1vdiUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSgxMikgfSwKLSAgLyogImFzbCIgaXMgcmVhbGx5IGFuICJhZGQiLiAgKi8KLSAgeyAiYXNsJS5xJS5mICVhLCViJUYlUyVMJVUiLAkJSSgtMSksCQlJKDgpIH0sCi0gIC8qICJsc2wiIGlzIHJlYWxseSBhbiAiYWRkIi4gICovCi0gIHsgImxzbCUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg4KSB9LAotICAvKiAibm9wIiBpcyByZWFsbHkgYW4gInhvciIuICAqLwotICB7ICJub3AiLAkJCQkweGZmZmZmZmZmLAkweDdmZmZmZmZmIH0sCi0gIC8qICJybGMiIGlzIHJlYWxseSBhbiAiYWRjIi4gICovCi0gIHsgInJsYyUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg5KSB9LAotCi0gIC8qIFRoZSByZXN0IG9mIHRoZXNlIG5lZWRuJ3QgYmUgc29ydGVkLCBidXQgaXQgaGVscHMgdG8gZmluZCB0aGVtIGlmIHRoZXkgYXJlLiAgKi8KLSAgeyAiYWRjJS5xJS5mICVhLCViLCVjJUYlUyVMIiwJCUkoLTEpLAkJSSg5KSB9LAotICB7ICJhZGQlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDgpIH0sCi0gIHsgImFuZCUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTIpIH0sCi0gIHsgImFzciUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDEpIH0sCi0gIHsgImJpYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTQpIH0sCi0gIHsgImIlcSUubiAlQiIsCQkJSSgtMSksCQlJKDQpLAkJQVJDX09QQ09ERV9DT05EX0JSQU5DSCB9LAotICB7ICJibCVxJS5uICVCIiwJCQlJKC0xKSwJCUkoNSksCQlBUkNfT1BDT0RFX0NPTkRfQlJBTkNIIH0sCi0gIHsgImV4dGIlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg3KSB9LAotICB7ICJleHR3JS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoOCkgfSwKLSAgeyAiZmxhZyUucSAlYiVHJVMlTCIsCQkJSSgtMSkrQSgtMSkrQygtMSksCQlJKDMpK0EoQVJDX1JFR19TSElNTV9VUERBVEUpK0MoMCkgfSwKLSAgLyogJVE6IGZvcmNlIGNvbmRfcD0xIC0tPiBubyBzaGltbSB2YWx1ZXMgKi8KLSAgLyogPz8/IFRoaXMgaW5zbiBhbGxvd3MgYW4gb3B0aW9uYWwgZmxhZ3Mgc3BlYy4gICovCi0gIHsgImolcSVRJS5uJS5mICViJUoiLAkJCUkoLTEpK0EoLTEpK0MoLTEpK1IoLTEsNywxKSwJSSg3KStBKDApK0MoMCkrUigwLDcsMSkgfSwKLSAgLyogUHV0IG9wY29kZSAxIGxkIGluc25zIGZpcnN0IHNvIHNoaW1tIGdldHMgcHJlZmVyZWQgb3ZlciBsaW1tLiAgKi8KLSAgLyogIlslYl0iIGlzIGJlZm9yZSAiWyViLCVkXSIgc28gMCBvZmZzZXRzIGRvbid0IGdldCBwcmludGVkLiAgKi8KLSAgeyAibGQlWiUuWCUuVyUuRSAlMCVhLFslYl0lTCIsCUkoLTEpK1IoLTEsMTMsMSkrUigtMSwwLDUxMSksCUkoMSkrUigwLDEzLDEpK1IoMCwwLDUxMSkgfSwKLSAgeyAibGQlWiUuWCUuVyUuRSAlYSxbJWIsJWRdJVMlTCIsCUkoLTEpK1IoLTEsMTMsMSksCQlJKDEpK1IoMCwxMywxKSB9LAotICB7ICJsZCV6JS54JS53JS5lJVEgJWEsWyViLCVjXSVMIiwJSSgtMSkrUigtMSw0LDEpK1IoLTEsNiw3KSwJSSgwKStSKDAsNCwxKStSKDAsNiw3KSB9LAotICB7ICJscCVxJS5uICVCIiwJCQlJKC0xKSwJCUkoNiksIH0sCi0gIHsgImxyICVhLFslQWJdJVMlTCIsCQkJSSgtMSkrQygtMSksCUkoMSkrQygweDEwKSB9LAotICB7ICJsc3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygyKSB9LAotICB7ICJvciUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTMpIH0sCi0gIHsgInJvciUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDMpIH0sCi0gIHsgInJyYyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDQpIH0sCi0gIHsgInNiYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTEpIH0sCi0gIHsgInNleGIlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg1KSB9LAotICB7ICJzZXh3JS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNikgfSwKLSAgeyAic3IgJWMsWyVBYl0lUyVMIiwJCQlJKC0xKStBKC0xKSwJSSgyKStBKDB4MTApIH0sCi0gIC8qICJbJWJdIiBpcyBiZWZvcmUgIlslYiwlZF0iIHNvIDAgb2Zmc2V0cyBkb24ndCBnZXQgcHJpbnRlZC4gICovCi0gIHsgInN0JXklLnYlLkQlUSAlMCVjLFslYl0lTCIsCQlJKC0xKStSKC0xLDI1LDEpK1IoLTEsMjEsMSkrUigtMSwwLDUxMSksCUkoMikrUigwLDI1LDEpK1IoMCwyMSwxKStSKDAsMCw1MTEpIH0sCi0gIHsgInN0JXklLnYlLkQgJWMsWyViLCVkXSVTJUwiLAlJKC0xKStSKC0xLDI1LDEpK1IoLTEsMjEsMSksCQkJSSgyKStSKDAsMjUsMSkrUigwLDIxLDEpIH0sCi0gIHsgInN1YiUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTApIH0sCi0gIHsgInhvciUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTUpIH0KLX07Ci1jb25zdCBpbnQgYXJjX29wY29kZXNfY291bnQgPSBzaXplb2YgKGFyY19vcGNvZGVzKSAvIHNpemVvZiAoYXJjX29wY29kZXNbMF0pOwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3JlZ19uYW1lc1tdID0KLXsKLSAgLyogU29ydCB0aGlzIHNvIHRoYXQgdGhlIGZpcnN0IDYxIGVudHJpZXMgYXJlIHNlcXVlbnRpYWwuCi0gICAgIElFOiBGb3IgZWFjaCBpIChpPDYxKSwgYXJjX3JlZ19uYW1lc1tpXS52YWx1ZSA9PSBpLiAgKi8KLQotICB7ICJyMCIsIDAsIFJFRyB9LCB7ICJyMSIsIDEsIFJFRyB9LCB7ICJyMiIsIDIsIFJFRyB9LCB7ICJyMyIsIDMsIFJFRyB9LAotICB7ICJyNCIsIDQsIFJFRyB9LCB7ICJyNSIsIDUsIFJFRyB9LCB7ICJyNiIsIDYsIFJFRyB9LCB7ICJyNyIsIDcsIFJFRyB9LAotICB7ICJyOCIsIDgsIFJFRyB9LCB7ICJyOSIsIDksIFJFRyB9LCB7ICJyMTAiLCAxMCwgUkVHIH0sIHsgInIxMSIsIDExLCBSRUcgfSwKLSAgeyAicjEyIiwgMTIsIFJFRyB9LCB7ICJyMTMiLCAxMywgUkVHIH0sIHsgInIxNCIsIDE0LCBSRUcgfSwgeyAicjE1IiwgMTUsIFJFRyB9LAotICB7ICJyMTYiLCAxNiwgUkVHIH0sIHsgInIxNyIsIDE3LCBSRUcgfSwgeyAicjE4IiwgMTgsIFJFRyB9LCB7ICJyMTkiLCAxOSwgUkVHIH0sCi0gIHsgInIyMCIsIDIwLCBSRUcgfSwgeyAicjIxIiwgMjEsIFJFRyB9LCB7ICJyMjIiLCAyMiwgUkVHIH0sIHsgInIyMyIsIDIzLCBSRUcgfSwKLSAgeyAicjI0IiwgMjQsIFJFRyB9LCB7ICJyMjUiLCAyNSwgUkVHIH0sIHsgInIyNiIsIDI2LCBSRUcgfSwgeyAiZnAiLCAyNywgUkVHIH0sCi0gIHsgInNwIiwgMjgsIFJFRyB9LCB7ICJpbGluazEiLCAyOSwgUkVHIH0sIHsgImlsaW5rMiIsIDMwLCBSRUcgfSwgeyAiYmxpbmsiLCAzMSwgUkVHIH0sCi0gIHsgInIzMiIsIDMyLCBSRUcgfSwgeyAicjMzIiwgMzMsIFJFRyB9LCB7ICJyMzQiLCAzNCwgUkVHIH0sIHsgInIzNSIsIDM1LCBSRUcgfSwKLSAgeyAicjM2IiwgMzYsIFJFRyB9LCB7ICJyMzciLCAzNywgUkVHIH0sIHsgInIzOCIsIDM4LCBSRUcgfSwgeyAicjM5IiwgMzksIFJFRyB9LAotICB7ICJyNDAiLCA0MCwgUkVHIH0sIHsgInI0MSIsIDQxLCBSRUcgfSwgeyAicjQyIiwgNDIsIFJFRyB9LCB7ICJyNDMiLCA0MywgUkVHIH0sCi0gIHsgInI0NCIsIDQ0LCBSRUcgfSwgeyAicjQ1IiwgNDUsIFJFRyB9LCB7ICJyNDYiLCA0NiwgUkVHIH0sIHsgInI0NyIsIDQ3LCBSRUcgfSwKLSAgeyAicjQ4IiwgNDgsIFJFRyB9LCB7ICJyNDkiLCA0OSwgUkVHIH0sIHsgInI1MCIsIDUwLCBSRUcgfSwgeyAicjUxIiwgNTEsIFJFRyB9LAotICB7ICJyNTIiLCA1MiwgUkVHIH0sIHsgInI1MyIsIDUzLCBSRUcgfSwgeyAicjU0IiwgNTQsIFJFRyB9LCB7ICJyNTUiLCA1NSwgUkVHIH0sCi0gIHsgInI1NiIsIDU2LCBSRUcgfSwgeyAicjU3IiwgNTcsIFJFRyB9LCB7ICJyNTgiLCA1OCwgUkVHIH0sIHsgInI1OSIsIDU5LCBSRUcgfSwKLSAgeyAibHBfY291bnQiLCA2MCwgUkVHIH0sCi0KLSAgLyogSSdkIHByZWZlciB0byBvdXRwdXQgdGhlc2UgYXMgImZwIiBhbmQgInNwIiBieSBkZWZhdWx0LCBidXQgd2Ugc3RpbGwgbmVlZAotICAgICB0byByZWNvZ25pemUgdGhlIGNhbm9uaWNhbCB2YWx1ZXMuICAqLwotICB7ICJyMjciLCAyNywgUkVHIH0sIHsgInIyOCIsIDI4LCBSRUcgfSwKLQotICAvKiBTb21lb25lIG1heSB3aXNoIHRvIHJlZmVyIHRvIHRoZXNlIGluIHRoaXMgd2F5LCBhbmQgaXQncyBwcm9iYWJseSBhCi0gICAgIGdvb2QgaWRlYSB0byByZXNlcnZlIHRoZW0gYXMgc3VjaCBhbnl3YXkuICAqLwotICB7ICJyMjkiLCAyOSwgUkVHIH0sIHsgInIzMCIsIDMwLCBSRUcgfSwgeyAicjMxIiwgMzEsIFJFRyB9LCB7ICJyNjAiLCA2MCwgUkVHIH0sCi0KLSAgLyogU3RhbmRhcmQgYXV4aWxpYXJ5IHJlZ2lzdGVycy4gICovCi0gIHsgInN0YXR1cyIsCTAsIEFVWFJFRyB9LAotICB7ICJzZW1hcGhvcmUiLCAxLCBBVVhSRUcgfSwKLSAgeyAibHBfc3RhcnQiLAkyLCBBVVhSRUcgfSwKLSAgeyAibHBfZW5kIiwJMywgQVVYUkVHIH0sCi0gIHsgImlkZW50aXR5IiwJNCwgQVVYUkVHIH0sCi0gIHsgImRlYnVnIiwJNSwgQVVYUkVHIH0sCi19OwotY29uc3QgaW50IGFyY19yZWdfbmFtZXNfY291bnQgPSBzaXplb2YgKGFyY19yZWdfbmFtZXMpIC8gc2l6ZW9mIChhcmNfcmVnX25hbWVzWzBdKTsKLQotLyogVGhlIHN1ZmZpeCB0YWJsZS4KLSAgIE9wZXJhbmRzIHdpdGggdGhlIHNhbWUgbmFtZSBtdXN0IGJlIHN0b3JlZCB0b2dldGhlci4gICovCi0KLWNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSBhcmNfc3VmZml4ZXNbXSA9Ci17Ci0gIC8qIEVudHJ5IDAgaXMgc3BlY2lhbCwgZGVmYXVsdCB2YWx1ZXMgYXJlbid0IHByaW50ZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHsgIiIsIDAsIC0xIH0sCi0gIHsgImFsIiwgMCwgQ09ORCB9LAotICB7ICJyYSIsIDAsIENPTkQgfSwKLSAgeyAiZXEiLCAxLCBDT05EIH0sCi0gIHsgInoiLCAxLCBDT05EIH0sCi0gIHsgIm5lIiwgMiwgQ09ORCB9LAotICB7ICJueiIsIDIsIENPTkQgfSwKLSAgeyAicCIsIDMsIENPTkQgfSwKLSAgeyAicGwiLCAzLCBDT05EIH0sCi0gIHsgIm4iLCA0LCBDT05EIH0sCi0gIHsgIm1pIiwgNCwgQ09ORCB9LAotICB7ICJjIiwgNSwgQ09ORCB9LAotICB7ICJjcyIsIDUsIENPTkQgfSwKLSAgeyAibG8iLCA1LCBDT05EIH0sCi0gIHsgIm5jIiwgNiwgQ09ORCB9LAotICB7ICJjYyIsIDYsIENPTkQgfSwKLSAgeyAiaHMiLCA2LCBDT05EIH0sCi0gIHsgInYiLCA3LCBDT05EIH0sCi0gIHsgInZzIiwgNywgQ09ORCB9LAotICB7ICJudiIsIDgsIENPTkQgfSwKLSAgeyAidmMiLCA4LCBDT05EIH0sCi0gIHsgImd0IiwgOSwgQ09ORCB9LAotICB7ICJnZSIsIDEwLCBDT05EIH0sCi0gIHsgImx0IiwgMTEsIENPTkQgfSwKLSAgeyAibGUiLCAxMiwgQ09ORCB9LAotICB7ICJoaSIsIDEzLCBDT05EIH0sCi0gIHsgImxzIiwgMTQsIENPTkQgfSwKLSAgeyAicG56IiwgMTUsIENPTkQgfSwKLSAgeyAiZiIsIDEsIEZMQUcgfSwKLSAgeyAibmQiLCBBUkNfREVMQVlfTk9ORSwgREVMQVkgfSwKLSAgeyAiZCIsIEFSQ19ERUxBWV9OT1JNQUwsIERFTEFZIH0sCi0gIHsgImpkIiwgQVJDX0RFTEFZX0pVTVAsIERFTEFZIH0sCi0vKnsgImIiLCA3LCBTSVpFRVhUIH0sKi8KLS8qeyAiYiIsIDUsIFNJWkVTRVggfSwqLwotICB7ICJiIiwgMSwgU0laRTEgfSwKLSAgeyAiYiIsIDEsIFNJWkUxMCB9LAotICB7ICJiIiwgMSwgU0laRTIyIH0sCi0vKnsgInciLCA4LCBTSVpFRVhUIH0sKi8KLS8qeyAidyIsIDYsIFNJWkVTRVggfSwqLwotICB7ICJ3IiwgMiwgU0laRTEgfSwKLSAgeyAidyIsIDIsIFNJWkUxMCB9LAotICB7ICJ3IiwgMiwgU0laRTIyIH0sCi0gIHsgIngiLCAxLCBTSUdOMCB9LAotICB7ICJ4IiwgMSwgU0lHTjkgfSwKLSAgeyAiYSIsIDEsIEFERFJFU1MzIH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMTIgfSwKLSAgeyAiYSIsIDEsIEFERFJFU1MyNCB9LAotICB7ICJkaSIsIDEsIENBQ0hFQllQQVNTNSB9LAotICB7ICJkaSIsIDEsIENBQ0hFQllQQVNTMTQgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzI2IH0sCi19OwotY29uc3QgaW50IGFyY19zdWZmaXhlc19jb3VudCA9IHNpemVvZiAoYXJjX3N1ZmZpeGVzKSAvIHNpemVvZiAoYXJjX3N1ZmZpeGVzWzBdKTsKLQotLyogSW5kZXhlZCBieSBmaXJzdCBsZXR0ZXIgb2Ygb3Bjb2RlLiAgUG9pbnRzIHRvIGNoYWluIG9mIG9wY29kZXMgd2l0aCBzYW1lCi0gICBmaXJzdCBsZXR0ZXIuICAqLwotc3RhdGljIHN0cnVjdCBhcmNfb3Bjb2RlICpvcGNvZGVfbWFwWzI2ICsgMV07Ci0KLS8qIEluZGV4ZWQgYnkgaW5zbiBjb2RlLiAgUG9pbnRzIHRvIGNoYWluIG9mIG9wY29kZXMgd2l0aCBzYW1lIGluc24gY29kZS4gICovCi1zdGF0aWMgc3RydWN0IGFyY19vcGNvZGUgKmljb2RlX21hcFszMl07Ci0MCi0vKiBDb25maWd1cmF0aW9uIGZsYWdzLiAgKi8KLQotLyogVmFyaW91cyBBUkNfSEFWRV9YWFggYml0cy4gICovCi1zdGF0aWMgaW50IGNwdV90eXBlOwotCi0vKiBUcmFuc2xhdGUgYSBiZmRfbWFjaF9hcmNfeHh4IHZhbHVlIHRvIGEgQVJDX01BQ0hfWFhYIHZhbHVlLiAgKi8KLQotaW50Ci1hcmNfZ2V0X29wY29kZV9tYWNoIChiZmRfbWFjaCwgYmlnX3ApCi0gICAgIGludCBiZmRfbWFjaCwgYmlnX3A7Ci17Ci0gIHN0YXRpYyBpbnQgbWFjaF90eXBlX21hcFtdID0KLSAgICB7Ci0gICAgICBBUkNfTUFDSF9CQVNFCi0gICAgfTsKLQotICByZXR1cm4gbWFjaF90eXBlX21hcFtiZmRfbWFjaF0gfCAoYmlnX3AgPyBBUkNfTUFDSF9CSUcgOiAwKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbnkgdGFibGVzIHRoYXQgbmVlZCBpdC4KLSAgIE11c3QgYmUgY2FsbGVkIG9uY2UgYXQgc3RhcnQgdXAgKG9yIHdoZW4gZmlyc3QgbmVlZGVkKS4KLQotICAgRkxBR1MgaXMgYSBzZXQgb2YgYml0cyB0aGF0IHNheSB3aGF0IHZlcnNpb24gb2YgdGhlIGNwdSB3ZSBoYXZlLAotICAgYW5kIGluIHBhcnRpY3VsYXIgYXQgbGVhc3QgKG9uZSBvZikgQVJDX01BQ0hfWFhYLiAgKi8KLQotdm9pZAotYXJjX29wY29kZV9pbml0X3RhYmxlcyAoZmxhZ3MpCi0gICAgIGludCBmbGFnczsKLXsKLSAgc3RhdGljIGludCBpbml0X3AgPSAwOwotCi0gIGNwdV90eXBlID0gZmxhZ3M7Ci0KLSAgLyogV2UgbWF5IGJlIGludGVudGlvbmFsbHkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIChmb3IgZXhhbXBsZSBnZGIgd2lsbCBjYWxsCi0gICAgIHVzIGVhY2ggdGltZSB0aGUgdXNlciBzd2l0Y2hlcyBjcHUpLiAgVGhlc2UgdGFibGVzIG9ubHkgbmVlZCB0byBiZSBpbml0J2QKLSAgICAgb25jZSB0aG91Z2guICAqLwotICAvKiA/Pz8gV2UgY2FuIHJlbW92ZSB0aGUgbmVlZCBmb3IgYXJjX29wY29kZV9zdXBwb3J0ZWQgYnkgdGFraW5nIGl0IGludG8KLSAgICAgYWNjb3VudCBoZXJlLCBidXQgSSdtIG5vdCBzdXJlIEkgd2FudCB0byBkbyB0aGF0IHlldCAoaWYgZXZlcikuICAqLwotICBpZiAoIWluaXRfcCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgaSxuOwotCi0gICAgICBtZW1zZXQgKGFyY19vcGVyYW5kX21hcCwgMCwgc2l6ZW9mIChhcmNfb3BlcmFuZF9tYXApKTsKLSAgICAgIG4gPSBzaXplb2YgKGFyY19vcGVyYW5kcykgLyBzaXplb2YgKGFyY19vcGVyYW5kc1swXSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCWFyY19vcGVyYW5kX21hcFthcmNfb3BlcmFuZHNbaV0uZm10XSA9IGk7Ci0KLSAgICAgIG1lbXNldCAob3Bjb2RlX21hcCwgMCwgc2l6ZW9mIChvcGNvZGVfbWFwKSk7Ci0gICAgICBtZW1zZXQgKGljb2RlX21hcCwgMCwgc2l6ZW9mIChpY29kZV9tYXApKTsKLSAgICAgIC8qIFNjYW4gdGhlIHRhYmxlIGJhY2t3YXJkcyBzbyBtYWNyb3MgYXBwZWFyIGF0IHRoZSBmcm9udC4gICovCi0gICAgICBmb3IgKGkgPSBhcmNfb3Bjb2Rlc19jb3VudCAtIDE7IGkgPj0gMDsgLS1pKQotCXsKLQkgIGludCBvcGNvZGVfaGFzaCA9IEFSQ19IQVNIX09QQ09ERSAoYXJjX29wY29kZXNbaV0uc3ludGF4KTsKLQkgIGludCBpY29kZV9oYXNoID0gQVJDX0hBU0hfSUNPREUgKGFyY19vcGNvZGVzW2ldLnZhbHVlKTsKLQotCSAgYXJjX29wY29kZXNbaV0ubmV4dF9hc20gPSBvcGNvZGVfbWFwW29wY29kZV9oYXNoXTsKLQkgIG9wY29kZV9tYXBbb3Bjb2RlX2hhc2hdID0gJmFyY19vcGNvZGVzW2ldOwotCi0JICBhcmNfb3Bjb2Rlc1tpXS5uZXh0X2RpcyA9IGljb2RlX21hcFtpY29kZV9oYXNoXTsKLQkgIGljb2RlX21hcFtpY29kZV9oYXNoXSA9ICZhcmNfb3Bjb2Rlc1tpXTsKLQl9Ci0KLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgT1BDT0RFIGlzIHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWVkIGNwdS4KLSAgIENwdSBzZWxlY3Rpb24gaXMgbWFkZSB3aGVuIGNhbGxpbmcgYGFyY19vcGNvZGVfaW5pdF90YWJsZXMnLiAgKi8KLQotaW50Ci1hcmNfb3Bjb2RlX3N1cHBvcnRlZCAob3Bjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlOwotewotICBpZiAoQVJDX09QQ09ERV9DUFUgKG9wY29kZS0+ZmxhZ3MpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChBUkNfT1BDT0RFX0NQVSAob3Bjb2RlLT5mbGFncykgJiBBUkNfSEFWRV9DUFUgKGNwdV90eXBlKSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiBPUFZBTCBpcyBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmllZCBjcHUuCi0gICBDcHUgc2VsZWN0aW9uIGlzIG1hZGUgd2hlbiBjYWxsaW5nIGBhcmNfb3Bjb2RlX2luaXRfdGFibGVzJy4gICovCi0KLWludAotYXJjX29wdmFsX3N1cHBvcnRlZCAob3B2YWwpCi0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqb3B2YWw7Ci17Ci0gIGlmIChBUkNfT1BWQUxfQ1BVIChvcHZhbC0+ZmxhZ3MpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChBUkNfT1BWQUxfQ1BVIChvcHZhbC0+ZmxhZ3MpICYgQVJDX0hBVkVfQ1BVIChjcHVfdHlwZSkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGluc24gaW4gdGhlIGNoYWluIGZvciBhc3NlbWJsaW5nIElOU04uICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqCi1hcmNfb3Bjb2RlX2xvb2t1cF9hc20gKGluc24pCi0gICAgIGNvbnN0IGNoYXIgKmluc247Ci17Ci0gIHJldHVybiBvcGNvZGVfbWFwW0FSQ19IQVNIX09QQ09ERSAoaW5zbildOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGluc24gaW4gdGhlIGNoYWluIGZvciBkaXNhc3NlbWJsaW5nIElOU04uICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqCi1hcmNfb3Bjb2RlX2xvb2t1cF9kaXMgKGluc24pCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotewotICByZXR1cm4gaWNvZGVfbWFwW0FSQ19IQVNIX0lDT0RFIChpbnNuKV07Ci19Ci0MCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIHNlZW4gYW4gJ2YnIHN1ZmZpeCAoaW4gY2VydGFpbiBpbnNucykuICAqLwotc3RhdGljIGludCBmbGFnX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgJ2YnIHN1ZmZpeC4gICovCi1zdGF0aWMgaW50IGZsYWdzaGltbV9oYW5kbGVkX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgc2VlbiBhICdxJyBzdWZmaXggKGNvbmRpdGlvbiBjb2RlKS4gICovCi1zdGF0aWMgaW50IGNvbmRfcDsKLQotLyogTm9uemVybyBpZiB3ZSd2ZSBpbnNlcnRlZCBhIHNoaW1tLiAgKi8KLXN0YXRpYyBpbnQgc2hpbW1fcDsKLQotLyogVGhlIHZhbHVlIG9mIHRoZSBzaGltbSB3ZSBpbnNlcnRlZCAoZWFjaCBpbnNuIG9ubHkgZ2V0cyBvbmUgYnV0IGl0IGNhbgotICAgYXBwZWFyIG11bHRpcGxlIHRpbWVzLiAgKi8KLXN0YXRpYyBpbnQgc2hpbW07Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgaW5zZXJ0ZWQgYSBsaW1tIChkdXJpbmcgYXNzZW1ibHkpIG9yIHNlZW4gYSBsaW1tCi0gICAoZHVyaW5nIGRpc2Fzc2VtYmx5KS4gICovCi1zdGF0aWMgaW50IGxpbW1fcDsKLQotLyogVGhlIHZhbHVlIG9mIHRoZSBsaW1tIHdlIGluc2VydGVkLiAgRWFjaCBpbnNuIG9ubHkgZ2V0cyBvbmUgYnV0IGl0IGNhbgotICAgYXBwZWFyIG11bHRpcGxlIHRpbWVzLiAgKi8KLXN0YXRpYyBsb25nIGxpbW07Ci0MCi0vKiBJbnNlcnRpb24gZnVuY3Rpb25zLiAgKi8KLQotLyogQ2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgYmVmb3JlIHBhcnNpbmcgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi12b2lkCi1hcmNfb3Bjb2RlX2luaXRfaW5zZXJ0ICgpCi17Ci0gIGZsYWdfcCA9IDA7Ci0gIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAwOwotICBjb25kX3AgPSAwOwotICBzaGltbV9wID0gMDsKLSAgbGltbV9wID0gMDsKLX0KLQotLyogQ2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgdG8gc2VlIGlmIHRoZSBpbnNuIGhhcyBhIGxpbW0gb3BlcmFuZC4KLSAgIEFsc28gY2FsbGVkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgdG8gc2VlIGlmIHRoZSBpbnNuIGNvbnRhaW5zIGEgbGltbS4gICovCi0KLWludAotYXJjX29wY29kZV9saW1tX3AgKGxpbW1wKQotICAgICBsb25nICpsaW1tcDsKLXsKLSAgaWYgKGxpbW1wKQotICAgICpsaW1tcCA9IGxpbW07Ci0gIHJldHVybiBsaW1tX3A7Ci19Ci0KLS8qIEluc2VydCBhIHZhbHVlIGludG8gYSByZWdpc3RlciBmaWVsZC4KLSAgIElmIFJFRyBpcyBOVUxMLCB0aGVuIHRoaXMgaXMgYWN0dWFsbHkgYSBjb25zdGFudC4KLQotICAgV2UgbXVzdCBhbHNvIGhhbmRsZSBhdXhpbGlhcnkgcmVnaXN0ZXJzIGZvciBsci9zciBpbnNucy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3JlZyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgaWYgKHJlZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSBjb25zdGFudCB0aGF0IGFsc28gcmVxdWlyZXMgYSB2YWx1ZSBzdG9yZWQgaW4gYSByZWdpc3RlcgotCSBmaWVsZC4gIEhhbmRsZSB0aGVzZSBieSB1cGRhdGluZyB0aGUgcmVnaXN0ZXIgZmllbGQgYW5kIHNhdmluZyB0aGUKLQkgdmFsdWUgZm9yIGxhdGVyIGhhbmRsaW5nIGJ5IGVpdGhlciAlUyAoc2hpbW0pIG9yICVMIChsaW1tKS4gICovCi0KLSAgICAgIC8qIFRyeSB0byB1c2UgYSBzaGltbSB2YWx1ZSBiZWZvcmUgYSBsaW1tIG9uZS4gICovCi0gICAgICBpZiAoQVJDX1NISU1NX0NPTlNUX1AgKHZhbHVlKQotCSAgLyogSWYgd2UndmUgc2VlbiBhIGNvbmRpdGlvbmFsIHN1ZmZpeCB3ZSBoYXZlIHRvIHVzZSBhIGxpbW0uICAqLwotCSAgJiYgIWNvbmRfcAotCSAgLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgc2hpbW0gdmFsdWUgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbiBvdXJzCi0JICAgICB3ZSBoYXZlIHRvIHVzZSBhIGxpbW0uICAqLwotCSAgJiYgKCFzaGltbV9wIHx8IHNoaW1tID09IHZhbHVlKSkKLQl7Ci0JICBpbnQgbWFya2VyID0gZmxhZ19wID8gQVJDX1JFR19TSElNTV9VUERBVEUgOiBBUkNfUkVHX1NISU1NOwotCSAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0JICBzaGltbV9wID0gMTsKLQkgIHNoaW1tID0gdmFsdWU7Ci0JICBpbnNuIHw9IG1hcmtlciA8PCBvcGVyYW5kLT5zaGlmdDsKLQkgIC8qIGluc24gfD0gdmFsdWUgJiA1MTE7IC0gZG9uZSBsYXRlciAqLwotCX0KLSAgICAgIC8qIFdlIGhhdmUgdG8gdXNlIGEgbGltbS4gIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiBvbmUgdGhleSBtdXN0IG1hdGNoLiAgKi8KLSAgICAgIGVsc2UgaWYgKCFsaW1tX3AgfHwgbGltbSA9PSB2YWx1ZSkKLQl7Ci0JICBsaW1tX3AgPSAxOwotCSAgbGltbSA9IHZhbHVlOwotCSAgaW5zbiB8PSBBUkNfUkVHX0xJTU0gPDwgb3BlcmFuZC0+c2hpZnQ7Ci0JICAvKiBUaGUgY29uc3RhbnQgaXMgc3RvcmVkIGxhdGVyLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmVycm1zZyA9IF8oInVuYWJsZSB0byBmaXQgZGlmZmVyZW50IHZhbHVlZCBjb25zdGFudHMgaW50byBpbnN0cnVjdGlvbiIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIGhhbmRsZSBib3RoIG5vcm1hbCBhbmQgYXV4aWxpYXJ5IHJlZ2lzdGVycy4gICovCi0KLSAgICAgIGlmIChyZWctPnR5cGUgPT0gQVVYUkVHKQotCXsKLQkgIGlmICghKG1vZHMgJiBBUkNfTU9EX0FVWFJFRykpCi0JICAgICplcnJtc2cgPSBfKCJhdXhpbGlhcnkgcmVnaXN0ZXIgbm90IGFsbG93ZWQgaGVyZSIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zbiB8PSBBUkNfUkVHX1NISU1NIDw8IG9wZXJhbmQtPnNoaWZ0OwotCSAgICAgIGluc24gfD0gcmVnLT52YWx1ZSA8PCBhcmNfb3BlcmFuZHNbcmVnLT50eXBlXS5zaGlmdDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGFuIGludmFsaWQgcmVnaXN0ZXIgbnVtYmVyIGhlcmUuICAqLwotCSAgaWYgKCh1bnNpZ25lZCBpbnQpIHJlZy0+dmFsdWUgPiA2MCkKLQkgICAgewotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgc3ByaW50ZiAoYnVmLCBfKCJpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciBgJWQnIiksIHJlZy0+dmFsdWUpOwotCSAgICAgICplcnJtc2cgPSBidWY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaW5zbiB8PSByZWctPnZhbHVlIDw8IG9wZXJhbmQtPnNoaWZ0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHdlIHNlZSBhbiAnZicgZmxhZy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZsYWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIC8qIFdlIGNhbid0IHN0b3JlIGFueXRoaW5nIGluIHRoZSBpbnNuIHVudGlsIHdlJ3ZlIHBhcnNlZCB0aGUgcmVnaXN0ZXJzLgotICAgICBKdXN0IHJlY29yZCB0aGUgZmFjdCB0aGF0IHdlJ3ZlIGdvdCB0aGlzIGZsYWcuICBgaW5zZXJ0X3JlZycgd2lsbCB1c2UgaXQKLSAgICAgdG8gc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKEFSQ19SRUdfU0hJTU1fVVBEQVRFIG9yIGJpdCAweDEwMCkuICAqLwotICBmbGFnX3AgPSAxOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgY29tcGxldGVseSBidWlsZGluZyBhbiBpbnNuIHRvIGVuc3VyZSB0aGUgJ2YnIGZsYWcgZ2V0cyBzZXQKLSAgIHByb3Blcmx5LiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0byBzZXQgdGhpcyBmbGFnIHVudGlsCi0gICB3ZSd2ZSBwYXJzZWQgdGhlIHJlZ2lzdGVycy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZsYWdmaW5pc2ggKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChmbGFnX3AgJiYgIWZsYWdzaGltbV9oYW5kbGVkX3ApCi0gICAgewotICAgICAgaWYgKHNoaW1tX3ApCi0JYWJvcnQgKCk7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICAgIGluc24gfD0gKDEgPDwgb3BlcmFuZC0+c2hpZnQpOwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHdlIHNlZSBhIGNvbmRpdGlvbmFsIGZsYWcgKGVnOiAuZXEpLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfY29uZCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uZF9wID0gMTsKLSAgaW5zbiB8PSAodmFsdWUgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBVc2VkIGluIHRoZSAiaiIgaW5zdHJ1Y3Rpb24gdG8gcHJldmVudCBjb25zdGFudHMgZnJvbSBiZWluZyBpbnRlcnByZXRlZCBhcwotICAgc2hpbW0gdmFsdWVzICh3aGljaCB0aGUganVtcCBpbnNuIGRvZXNuJ3QgYWNjZXB0KS4gIFRoaXMgY2FuIGFsc28gYmUgdXNlZAotICAgdG8gZm9yY2UgdGhlIHVzZSBvZiBsaW1tIHZhbHVlcyBpbiBvdGhlciBzaXR1YXRpb25zIChlZzogbGQgcjAsW2Zvb10gdXNlcwotICAgdGhpcykuCi0gICA/Pz8gVGhlIG1lY2hhbmlzbSBpcyBzb3VuZC4gIEFjY2VzcyB0byBpdCBpcyBhIGJpdCBrbHVua3kgcmlnaHQgbm93LiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfZm9yY2VsaW1tIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBjb25kX3AgPSAxOwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogVXNlZCBpbiBsZC9zdCBpbnNucyB0byBoYW5kbGUgdGhlIHNoaW1tIG9mZnNldCBmaWVsZC4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3NoaW1tb2Zmc2V0IChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBsb25nIG1pbnZhbCwgbWF4dmFsOwotICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICBpZiAocmVnICE9IE5VTEwpCi0gICAgewotICAgICAgKmVycm1zZyA9ICJyZWdpc3RlciBhcHBlYXJzIHdoZXJlIHNoaW1tIHZhbHVlIGV4cGVjdGVkIjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzICp3YXkqIG1vcmUgZ2VuZXJhbCB0aGFuIG5lY2Vzc2FyeSwgYnV0IG1heWJlIHNvbWUgZGF5IGl0J2xsCi0JIGJlIHVzZWZ1bC4gICovCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0JewotCSAgbWludmFsID0gLSgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCSAgbWF4dmFsID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW52YWwgPSAwOwotCSAgbWF4dmFsID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCX0KLSAgICAgIGlmICh2YWx1ZSA8IG1pbnZhbCB8fCB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgc3ByaW50ZiAoYnVmLCBfKCJ2YWx1ZSB3b24ndCBmaXQgaW4gcmFuZ2UgJWxkIC0gJWxkIiksCi0JCSAgIG1pbnZhbCwgbWF4dmFsKTsKLQkgICplcnJtc2cgPSBidWY7Ci0JfQotICAgICAgZWxzZQotCWluc24gfD0gKHZhbHVlICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIFVzZWQgaW4gbGQvc3QgaW5zbnMgd2hlbiB0aGUgc2hpbW0gb2Zmc2V0IGlzIDAuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9zaGltbXplcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHNoaW1tX3AgPSAxOwotICBzaGltbSA9IDA7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBwcm9jZXNzaW5nIG5vcm1hbCBpbnNucyAoZWc6IGFkZCkgdG8gaW5zZXJ0IGEgc2hpbW0KLSAgIHZhbHVlIChpZiBwcmVzZW50KSBpbnRvIHRoZSBpbnNuLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfc2hpbW1maW5pc2ggKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChzaGltbV9wKQotICAgIGluc24gfD0gKHNoaW1tICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBub3JtYWwgaW5zbnMgKGVnOiBhZGQpIHRvIGluc2VydCBhIGxpbW0KLSAgIHZhbHVlIChpZiBwcmVzZW50KSBpbnRvIHRoZSBpbnNuLgotCi0gICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGludGVuZGVkIHRvIGhhbmRsZSBpbnN0cnVjdGlvbnMgKHdpdGggNCBieXRlCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMpLiAgSXQgaXMgbm90IGludGVuZGVkIHRvIGhhbmRsZSBkYXRhLiAgKi8KLQotLyogPz8/IEFjdHVhbGx5LCB0aGVyZSdzIG5vdGhpbmcgZm9yIHVzIHRvIGRvIGFzIHdlIGNhbid0IGNhbGwgZnJhZ19tb3JlLCB0aGUKLSAgIGNhbGxlciBtdXN0IGRvIHRoYXQuICBUaGUgZXh0cmFjdCBmbnMgdGFrZSBhIHBvaW50ZXIgdG8gdHdvIHdvcmRzLiAgVGhlCi0gICBpbnNlcnQgZm5zIGNvdWxkIGJlIGNvbnZlcnRlZCBhbmQgdGhlbiB3ZSBjb3VsZCBkbyBzb21ldGhpbmcgdXNlZnVsLCBidXQKLSAgIHRoZW4gdGhlIHJlbG9jIGhhbmRsZXJzIHdvdWxkIGhhdmUgdG8ga25vdyB0byB3b3JrIG9uIHRoZSBzZWNvbmQgd29yZCBvZgotICAgYSAyIHdvcmQgcXVhbnRpdHkuICBUaGF0J3MgdG9vIG11Y2ggc28gd2UgZG9uJ3QgaGFuZGxlIHRoZW0uICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9saW1tZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAobGltbV9wKQotICAgIDsgLyogbm90aGluZyB0byBkbywgZ2FzIGRvZXMgaXQgKi8KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIHVuYXJ5IG9wZXJhbmQgbWFjcm9zIHRvIGNvcHkgdGhlIEIgZmllbGQgdG8gQy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3Vub3BtYWNybyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbiB8PSAoKGluc24gPj4gQVJDX1NISUZUX1JFR0IpICYgQVJDX01BU0tfUkVHKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIEluc2VydCBhIHJlbGF0aXZlIGFkZHJlc3MgZm9yIGEgYnJhbmNoIGluc24gKGIsIGJsLCBvciBscCkuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9yZWxhZGRyIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgJiAzKQotICAgICplcnJtc2cgPSBfKCJicmFuY2ggYWRkcmVzcyBub3Qgb24gNCBieXRlIGJvdW5kYXJ5Iik7Ci0gIGluc24gfD0gKCh2YWx1ZSA+PiAyKSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIEluc2VydCBhIGxpbW0gdmFsdWUgYXMgYSAyNiBiaXQgYWRkcmVzcyByaWdodCBzaGlmdGVkIDIgaW50byB0aGUgaW5zbi4KLQotICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCB0byBoYW5kbGUgaW5zdHJ1Y3Rpb25zICh3aXRoIDQgYnl0ZQotICAgaW1tZWRpYXRlIG9wZXJhbmRzKS4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBoYW5kbGUgZGF0YS4gICovCi0KLS8qID8/PyBBY3R1YWxseSwgdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byBkbyBhcyB3ZSBjYW4ndCBjYWxsIGZyYWdfbW9yZSwgdGhlCi0gICBjYWxsZXIgbXVzdCBkbyB0aGF0LiAgVGhlIGV4dHJhY3QgZm5zIHRha2UgYSBwb2ludGVyIHRvIHR3byB3b3Jkcy4gIFRoZQotICAgaW5zZXJ0IGZucyBjb3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHRoZW4gd2UgY291bGQgZG8gc29tZXRoaW5nIHVzZWZ1bCwgYnV0Ci0gICB0aGVuIHRoZSByZWxvYyBoYW5kbGVycyB3b3VsZCBoYXZlIHRvIGtub3cgdG8gd29yayBvbiB0aGUgc2Vjb25kIHdvcmQgb2YKLSAgIGEgMiB3b3JkIHF1YW50aXR5LiAgVGhhdCdzIHRvbyBtdWNoIHNvIHdlIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfYWJzYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGxpbW1fcCkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgcmV0dXJuIGluc247Ci19Ci0MCi0vKiBFeHRyYWN0aW9uIGZ1bmN0aW9ucy4KLQotICAgVGhlIHN1ZmZpeCBleHRyYWN0aW9uIGZ1bmN0aW9ucycgcmV0dXJuIHZhbHVlIGlzIHJlZHVuZGFudCBzaW5jZSBpdCBjYW4gYmUKLSAgIG9idGFpbmVkIGZyb20gKCpPUFZBTCktPnZhbHVlLiAgSG93ZXZlciwgdGhlIGJvb2xlYW4gc3VmZml4ZXMgZG9uJ3QgaGF2ZQotICAgYSBzdWZmaXggdGFibGUgZW50cnkgZm9yIHRoZSAiZmFsc2UiIGNhc2UsIHNvIHZhbHVlcyBvZiB6ZXJvIG11c3QgYmUKLSAgIG9idGFpbmVkIGZyb20gdGhlIHJldHVybiB2YWx1ZSAoKk9QVkFMID09IE5VTEwpLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqbG9va3VwX3JlZ2lzdGVyIChpbnQgdHlwZSwgbG9uZyByZWdubyk7Ci0KLS8qIENhbGxlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGJlZm9yZSBwcmludGluZyBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXZvaWQKLWFyY19vcGNvZGVfaW5pdF9leHRyYWN0ICgpCi17Ci0gIGZsYWdfcCA9IDA7Ci0gIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAwOwotICBzaGltbV9wID0gMDsKLSAgbGltbV9wID0gMDsKLX0KLQotLyogQXMgd2UncmUgZXh0cmFjdGluZyByZWdpc3RlcnMsIGtlZXAgYW4gZXllIG91dCBmb3IgdGhlICdmJyBpbmRpY2F0b3IKLSAgIChBUkNfUkVHX1NISU1NX1VQREFURSkuICBJZiB3ZSBmaW5kIGEgcmVnaXN0ZXIgKG5vdCBhIGNvbnN0YW50IG1hcmtlciwKLSAgIGxpa2UgQVJDX1JFR19TSElNTSksIHNldCBPUFZBTCBzbyBvdXIgY2FsbGVyIHdpbGwga25vdyB0aGlzIGlzIGEgcmVnaXN0ZXIuCi0KLSAgIFdlIG11c3QgYWxzbyBoYW5kbGUgYXV4aWxpYXJ5IHJlZ2lzdGVycyBmb3IgbHIvc3IgaW5zbnMuICBUaGV5IGFyZSBqdXN0Ci0gICBjb25zdGFudHMgd2l0aCBzcGVjaWFsIG5hbWVzLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmVnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGludCByZWdubzsKLSAgbG9uZyB2YWx1ZTsKLQotICAvKiBHZXQgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gIHJlZ25vID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0KLSAgLyogSXMgaXQgYSBjb25zdGFudCBtYXJrZXI/ICAqLwotICBpZiAocmVnbm8gPT0gQVJDX1JFR19TSElNTSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMF0gJiA1MTE7Ci0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgMjU2KSkKLQl2YWx1ZSAtPSA1MTI7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlZ25vID09IEFSQ19SRUdfU0hJTU1fVVBEQVRFKQotICAgIHsKLSAgICAgIHZhbHVlID0gaW5zblswXSAmIDUxMTsKLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAyNTYpKQotCXZhbHVlIC09IDUxMjsKLSAgICAgIGZsYWdfcCA9IDE7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlZ25vID09IEFSQ19SRUdfTElNTSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMV07Ci0gICAgICBsaW1tX3AgPSAxOwotICAgIH0KLSAgLyogSXQncyBhIHJlZ2lzdGVyLCBzZXQgT1BWQUwgKHRoYXQncyB0aGUgb25seSB3YXkgd2UgZGlzdGluZ3Vpc2ggcmVnaXN0ZXJzCi0gICAgIGZyb20gY29uc3RhbnRzIGhlcmUpLiAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnID0gbG9va3VwX3JlZ2lzdGVyIChSRUcsIHJlZ25vKTsKLQotICAgICAgaWYgKHJlZyA9PSBOVUxMKQotCWFib3J0ICgpOwotICAgICAgaWYgKG9wdmFsICE9IE5VTEwpCi0JKm9wdmFsID0gcmVnOwotICAgICAgdmFsdWUgPSByZWdubzsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCB0YWtlcyBhbiBhdXhpbGlhcnkgcmVnaXN0ZXIsIHNlZSBpZiBpdCdzIGEga25vd24gb25lLiAgKi8KLSAgaWYgKChtb2RzICYgQVJDX01PRF9BVVhSRUcpCi0gICAgICAmJiBBUkNfUkVHX0NPTlNUQU5UX1AgKHJlZ25vKSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IGxvb2t1cF9yZWdpc3RlciAoQVVYUkVHLCB2YWx1ZSk7Ci0KLSAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IGEgY29uc3RhbnQsIGJ1dCB0ZWxsIHRoZSBjYWxsZXIgaXQgaGFzIGEgc3BlY2lhbAotCSBuYW1lLiAgKi8KLSAgICAgIGlmIChyZWcgIT0gTlVMTCAmJiBvcHZhbCAhPSBOVUxMKQotCSpvcHZhbCA9IHJlZzsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAiZmxhZyB1cGRhdGUiIGZpZWxkIGZvciBzaGltbSBpbnNucy4KLSAgIFRoaXMgdmFsdWUgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSByZWdpc3RlciBmaWVsZC4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2ZsYWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaW50IGY7Ci0gIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqdmFsOwotCi0gIGlmIChmbGFnc2hpbW1faGFuZGxlZF9wKQotICAgIGYgPSBmbGFnX3AgIT0gMDsKLSAgZWxzZQotICAgIGYgPSAoaW5zblswXSAmICgxIDw8IG9wZXJhbmQtPnNoaWZ0KSkgIT0gMDsKLQotICAvKiBUaGVyZSBpcyBubyB0ZXh0IGZvciB6ZXJvIHZhbHVlcy4gICovCi0gIGlmIChmID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgdmFsID0gYXJjX29wY29kZV9sb29rdXBfc3VmZml4IChvcGVyYW5kLCAxKTsKLSAgaWYgKG9wdmFsICE9IE5VTEwgJiYgdmFsICE9IE5VTEwpCi0gICAgKm9wdmFsID0gdmFsOwotICByZXR1cm4gdmFsLT52YWx1ZTsKLX0KLQotLyogRXh0cmFjdCB0aGUgY29uZGl0aW9uIGNvZGUgKGlmIGl0IGV4aXN0cykuCi0gICBJZiB3ZSd2ZSBzZWVuIGEgc2hpbW0gdmFsdWUgaW4gdGhpcyBpbnNuIChtZWFuaW5nIHRoYXQgdGhlIGluc24gY2FuJ3QgaGF2ZQotICAgYSBjb25kaXRpb24gY29kZSBmaWVsZCksIHRoZW4gd2UgZG9uJ3Qgc3RvcmUgYW55dGhpbmcgaW4gT1BWQUwgYW5kIHJldHVybgotICAgemVyby4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2NvbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyBjb25kOwotICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnZhbDsKLQotICBpZiAoZmxhZ3NoaW1tX2hhbmRsZWRfcCkKLSAgICByZXR1cm4gMDsKLQotICBjb25kID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gIHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgY29uZCk7Ci0KLSAgLyogSWdub3JlIE5VTEwgdmFsdWVzIG9mIGB2YWwnLiAgU2V2ZXJhbCBjb25kaXRpb24gY29kZSB2YWx1ZXMgYXJlCi0gICAgIHJlc2VydmVkIGZvciBleHRlbnNpb25zLiAgKi8KLSAgaWYgKG9wdmFsICE9IE5VTEwgJiYgdmFsICE9IE5VTEwpCi0gICAgKm9wdmFsID0gdmFsOwotICByZXR1cm4gY29uZDsKLX0KLQotLyogRXh0cmFjdCBhIGJyYW5jaCBhZGRyZXNzLgotICAgV2UgcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHJlYWwgYWRkcmVzcyAobm90IHJpZ2h0IHNoaWZ0ZWQgYnkgMikuICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9yZWxhZGRyIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgYWRkcjsKLQotICBhZGRyID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0gICAgICAmJiAoYWRkciAmICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKSkKLSAgICBhZGRyIC09IDEgPDwgb3BlcmFuZC0+Yml0czsKLQotICByZXR1cm4gYWRkciA8PCAyOwotfQotCi0vKiBUaGUgb25seSB0aGluZyB0aGlzIGRvZXMgaXMgc2V0IHRoZSBgaW52YWxpZCcgZmxhZyBpZiBCICE9IEMuCi0gICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSAibW92IiBtYWNybyBhcHBlYXJzIGJlZm9yZSBpdCdzIHJlYWwgaW5zbiAiYW5kIgotICAgYW5kIHdlIGRvbid0IHdhbnQgdGhlIGRpc2Fzc2VtYmxlciB0byBjb25mdXNlIHRoZW0uICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF91bm9wbWFjcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgLyogVGhpcyBtaXNzZXMgdGhlIGNhc2Ugd2hlcmUgQiA9PSBBUkNfUkVHX1NISU1NX1VQREFURSAmJgotICAgICBDID09IEFSQ19SRUdfU0hJTU0gKG9yIHZpY2UgdmVyc2EpLiAgTm8gYmlnIGRlYWwuICBUaG9zZSBpbnNucyB3aWxsIGdldAotICAgICBwcmludGVkIGFzICJhbmQicy4gICovCi0gIGlmICgoKGluc25bMF0gPj4gQVJDX1NISUZUX1JFR0IpICYgQVJDX01BU0tfUkVHKQotICAgICAgIT0gKChpbnNuWzBdID4+IEFSQ19TSElGVF9SRUdDKSAmIEFSQ19NQVNLX1JFRykpCi0gICAgaWYgKGludmFsaWQgIT0gTlVMTCkKLSAgICAgICppbnZhbGlkID0gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogVXRpbGl0eSBmb3IgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb25zIHRvIHJldHVybiB0aGUgaW5kZXggaW50bwotICAgYGFyY19zdWZmaXhlcycuICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKgotYXJjX29wY29kZV9sb29rdXBfc3VmZml4ICh0eXBlLCB2YWx1ZSkKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICp0eXBlOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqdiwqZW5kOwotCi0gIC8qID8/PyBUaGlzIGlzIGEgbGl0dGxlIHNsb3cgYW5kIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLQotICBmb3IgKHYgPSBhcmNfc3VmZml4ZXMsIGVuZCA9IGFyY19zdWZmaXhlcyArIGFyY19zdWZmaXhlc19jb3VudDsgdiA8IGVuZDsgKyt2KQotICAgIGlmICh0eXBlID09ICZhcmNfb3BlcmFuZHNbdi0+dHlwZV0KLQkmJiB2YWx1ZSA9PSB2LT52YWx1ZSkKLSAgICAgIHJldHVybiB2OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqCi1sb29rdXBfcmVnaXN0ZXIgKHR5cGUsIHJlZ25vKQotICAgICBpbnQgdHlwZTsKLSAgICAgbG9uZyByZWdubzsKLXsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyLCplbmQ7Ci0KLSAgaWYgKHR5cGUgPT0gUkVHKQotICAgIHJldHVybiAmYXJjX3JlZ19uYW1lc1tyZWdub107Ci0KLSAgLyogPz8/IFRoaXMgaXMgYSBsaXR0bGUgc2xvdyBhbmQgY2FuIGJlIHNwZWVkZWQgdXAuICAqLwotCi0gIGZvciAociA9IGFyY19yZWdfbmFtZXMsIGVuZCA9IGFyY19yZWdfbmFtZXMgKyBhcmNfcmVnX25hbWVzX2NvdW50OwotICAgICAgIHIgPCBlbmQ7ICsrcikKLSAgICBpZiAodHlwZSA9PSByLT50eXBlCSYmIHJlZ25vID09IHItPnZhbHVlKQotICAgICAgcmV0dXJuIHI7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcm0tZGlzLmMgYi9vcGNvZGVzL2FybS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhYzRhNC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FybS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk2MCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQVJNCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICBNb2RpZmljYXRpb24gYnkgSmFtZXMgRy4gU21pdGggKGpzbWl0aEBjeWdudXMuY28udWspCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYm9wY29kZXMuIAotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLiAKLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi1BTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLW1vcmUgZGV0YWlscy4gCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgImFybS1vcGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgZG9uZSBoZXJlICovCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImVsZi9hcm0uaCIKLQotc3RhdGljIGNoYXIgKiBhcm1fY29uZGl0aW9uYWxbXSA9Ci17ImVxIiwgIm5lIiwgImNzIiwgImNjIiwgIm1pIiwgInBsIiwgInZzIiwgInZjIiwKLSAiaGkiLCAibHMiLCAiZ2UiLCAibHQiLCAiZ3QiLCAibGUiLCAiIiwgIm52In07Ci0KLXN0YXRpYyBjaGFyICogYXJtX3JlZ25hbWVzX3Jhd1tdID0KLXsicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAotICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSJ9OwotCi1zdGF0aWMgY2hhciAqIGFybV9yZWduYW1lc19zdGFuZGFyZFtdID0KLXsicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAotICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJzcCIsICJsciIsICJwYyJ9OwotCi1zdGF0aWMgY2hhciAqIGFybV9yZWduYW1lc19hcGNzW10gPQoteyJhMSIsICJhMiIsICJhMyIsICJhNCIsICJ2MSIsICJ2MiIsICJ2MyIsICJ2NCIsCi0gInY1IiwgInY2IiwgInNsIiwgImZwIiwgImlwIiwgInNwIiwgImxyIiwgInBjIn07Ci0KLS8qIENob29zZSB3aGljaCByZWdpc3RlciBuYW1lIHNldCB0byB1c2UuICAqLwotc3RhdGljIGNoYXIgKiogYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX3N0YW5kYXJkOwotCi1zdGF0aWMgY2hhciAqIGFybV9mcF9jb25zdFtdID0KLXsiMC4wIiwgIjEuMCIsICIyLjAiLCAiMy4wIiwgIjQuMCIsICI1LjAiLCAiMC41IiwgIjEwLjAifTsKLQotc3RhdGljIGNoYXIgKiBhcm1fc2hpZnRbXSA9IAoteyJsc2wiLCAibHNyIiwgImFzciIsICJyb3IifTsKLQotc3RhdGljIGludCBwcmludF9pbnNuX2FybQotICBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci0KLXN0YXRpYyB2b2lkCi1hcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKQotICAgICBsb25nIGdpdmVuOwotICAgICBmcHJpbnRmX2Z0eXBlIGZ1bmM7Ci0gICAgIHZvaWQgKiBzdHJlYW07Ci17Ci0gIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7Ci0gIAotICBpZiAoKGdpdmVuICYgMHhmZjApICE9IDApCi0gICAgewotICAgICAgaWYgKChnaXZlbiAmIDB4MTApID09IDApCi0JewotCSAgaW50IGFtb3VudCA9IChnaXZlbiAmIDB4ZjgwKSA+PiA3OwotCSAgaW50IHNoaWZ0ID0gKGdpdmVuICYgMHg2MCkgPj4gNTsKLQkgIAotCSAgaWYgKGFtb3VudCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNoaWZ0ID09IDMpCi0JCXsKLQkJICBmdW5jIChzdHJlYW0sICIsIHJyeCIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIAotCSAgICAgIGFtb3VudCA9IDMyOwotCSAgICB9Ci0JICAKLQkgIGZ1bmMgKHN0cmVhbSwgIiwgJXMgIyVkIiwgYXJtX3NoaWZ0W3NoaWZ0XSwgYW1vdW50KTsKLQl9Ci0gICAgICBlbHNlCi0JZnVuYyAoc3RyZWFtLCAiLCAlcyAlcyIsIGFybV9zaGlmdFsoZ2l2ZW4gJiAweDYwKSA+PiA1XSwKLQkgICAgICBhcm1fcmVnbmFtZXNbKGdpdmVuICYgMHhmMDApID4+IDhdKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGFsd2F5cyA0IG9uIEFSTSkuICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJtIChwYywgaW5mbywgZ2l2ZW4pCi0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLSAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBnaXZlbjsKLXsKLSAgc3RydWN0IGFybV9vcGNvZGUgKiAgaW5zbjsKLSAgdm9pZCAqICAgICAgICAgICAgICAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlICAgICAgICBmdW5jICAgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0KLSAgZm9yIChpbnNuID0gYXJtX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiBpbnNuLT5tYXNrKSA9PSBpbnNuLT52YWx1ZSkKLQl7Ci0JICBjaGFyICogYzsKLQkgIAotCSAgZm9yIChjID0gaW5zbi0+YXNzZW1ibGVyOyAqYzsgYysrKQotCSAgICB7Ci0JICAgICAgaWYgKCpjID09ICclJykKLQkJewotCQkgIHN3aXRjaCAoKisrYykKLQkJICAgIHsKLQkJICAgIGNhc2UgJyUnOgotCQkgICAgICBmdW5jIChzdHJlYW0sICIlJSIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgIGlmICgoKGdpdmVuICYgMHgwMDBmMDAwMCkgPT0gMHgwMDBmMDAwMCkKLQkJCSAgJiYgKChnaXZlbiAmIDB4MDIwMDAwMDApID09IDApKQotCQkJewotCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKLQkJCSAgCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIltwYyIpOwotIAotCQkJICBpZiAoZ2l2ZW4gJiAweDAxMDAwMDAwKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCW9mZnNldCA9IC0gb2Zmc2V0OwotCQkJICAKLQkJCSAgICAgIC8qIHByZS1pbmRleGVkICovCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIsICMleF0iLCBvZmZzZXQpOwotCi0JCQkgICAgICBvZmZzZXQgKz0gcGMgKyA4OwotCi0JCQkgICAgICAvKiBDb3BlIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIHdyaXRlLWJhY2sgYmVpbmcgdXNlZC4KLQkJCQkgUHJvYmFibHkgYSB2ZXJ5IGRhbmdlcm91cyB0aGluZyBmb3IgdGhlIHByb2dyYW1tZXIKLQkJCQkgdG8gZG8sIGJ1dCB3aG8gYXJlIHdlIHRvIGFyZ3VlID8gICovCi0JCQkgICAgICBpZiAoZ2l2ZW4gJiAweDAwMjAwMDAwKQotCQkJCWZ1bmMgKHN0cmVhbSwgIiEiKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBwb3N0IGluZGV4ZWQgKi8KLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0sICMleCIsIG9mZnNldCk7Ci0KLQkJCSAgICAgIG9mZnNldCA9IHBjICsgODsgIC8qIGllIGlnbm9yZSB0aGUgb2Zmc2V0ICovCi0JCQkgICAgfQotCQkJICAKLQkJCSAgZnVuYyAoc3RyZWFtLCAiXHQ7ICIpOwotCQkJICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKG9mZnNldCwgaW5mbyk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgCi0JCQkJYXJtX3JlZ25hbWVzWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKLQkJCSAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCi0JCQkgICAgewotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDIwMDAwMDApID09IDApCi0JCQkJewotCQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZmY7Ci0JCQkJICBpZiAob2Zmc2V0KQotCQkJCSAgICBmdW5jIChzdHJlYW0sICIsICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIsICVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgPyAiLSIgOiAiIikpOwotCQkJCSAgYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSk7Ci0JCQkJfQotCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdJXMiLCAKLQkJCQkgICAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDApID8gIiEiIDogIiIpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKQotCQkJCXsKLQkJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJICBlbHNlIAotCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKSAKLQkJCQkJID8gIi0iIDogIiIpKTsKLQkJCQkgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgMHgwMDRmMDAwMCkgPT0gMHgwMDRmMDAwMCkKLQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUEMgcmVsYXRpdmUgd2l0aCBpbW1lZGlhdGUgb2Zmc2V0ICovCi0JCQkgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCSAgCi0JCQkgIGlmICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0JCQkgIAotCQkJICBmdW5jIChzdHJlYW0sICJbcGMsICMleF1cdDsgIiwgb2Zmc2V0KTsKLQkJCSAgCi0JCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkJICAgIChvZmZzZXQgKyBwYyArIDgsIGluZm8pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIAotCQkJCWFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZS1pbmRleGVkICovCi0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDQwMDAwMCkgPT0gMHgwMDQwMDAwMCkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZCIsCi0JCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyICovCi0JCQkJICBmdW5jIChzdHJlYW0sICIsICVzJXMiLAotCQkJCQkoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSA/ICItIiA6ICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fcmVnbmFtZXNbZ2l2ZW4gJiAweGZdKTsKLQkJCQl9Ci0KLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0lcyIsIAotCQkJCSAgICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCkgPyAiISIgOiAiIik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdC1pbmRleGVkICovCi0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDQwMDAwMCkgPT0gMHgwMDQwMDAwMCkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJICBlbHNlIAotCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciAqLwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiXSwgJXMlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkJICAKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJCShCRElTUCAoZ2l2ZW4pICogNCArIHBjICsgOCwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdjJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLAotCQkJICAgIGFybV9jb25kaXRpb25hbCBbKGdpdmVuID4+IDI4KSAmIDB4Zl0pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnbSc6Ci0JCSAgICAgIHsKLQkJCWludCBzdGFydGVkID0gMDsKLQkJCWludCByZWc7Ci0KLQkJCWZ1bmMgKHN0cmVhbSwgInsiKTsKLQkJCWZvciAocmVnID0gMDsgcmVnIDwgMTY7IHJlZysrKQotCQkJICBpZiAoKGdpdmVuICYgKDEgPDwgcmVnKSkgIT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc3RhcnRlZCkKLQkJCQlmdW5jIChzdHJlYW0sICIsICIpOwotCQkJICAgICAgc3RhcnRlZCA9IDE7Ci0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLQkJCSAgICB9Ci0JCQlmdW5jIChzdHJlYW0sICJ9Iik7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ28nOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgIT0gMCkKLQkJCXsKLQkJCSAgaW50IHJvdGF0ZSA9IChnaXZlbiAmIDB4ZjAwKSA+PiA3OwotCQkJICBpbnQgaW1tZWQgPSAoZ2l2ZW4gJiAweGZmKTsKLQkJCSAgaW1tZWQgPSAoKChpbW1lZCA8PCAoMzIgLSByb3RhdGUpKQotCQkJCSAgICB8IChpbW1lZCA+PiByb3RhdGUpKSAmIDB4ZmZmZmZmZmYpOwotCQkJICBmdW5jIChzdHJlYW0sICIjJWRcdDsgMHgleCIsIGltbWVkLCBpbW1lZCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwMDBmMDAwKSA9PSAweDAwMDBmMDAwKQotCQkJZnVuYyAoc3RyZWFtLCAicCIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAxMjAwMDAwKSA9PSAweDAwMjAwMDAwKQotCQkJZnVuYyAoc3RyZWFtLCAidCIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnaCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKQotCQkJZnVuYyAoc3RyZWFtLCAiaCIpOwotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgImIiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0EnOgotCQkgICAgICBmdW5jIChzdHJlYW0sICJbJXMiLCBhcm1fcmVnbmFtZXMgWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCi0JCQl7Ci0JCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmY7Ci0JCQkgIGlmIChvZmZzZXQpCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZF0lcyIsCi0JCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKLQkJCQkgIG9mZnNldCAqIDQsCi0JCQkJICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCA/ICIhIiA6ICIiKSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZjsKLQkJCSAgaWYgKG9mZnNldCkKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdLCAlcyMlZCIsCi0JCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKLQkJCQkgIG9mZnNldCAqIDQpOwotCQkJICBlbHNlCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnQyc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDkwMDAwKQotCQkJewotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiXz8/PyIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg5MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2FsbCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgxMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2N0bCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2ZsZyIpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0YnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDQwODAwMCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiNCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIxIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwNDAwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIyIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMyIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJCQotCQkgICAgY2FzZSAnUCc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDgwMDgwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBmdW5jIChzdHJlYW0sICJzIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDgwOgotCQkJICBmdW5jIChzdHJlYW0sICJkIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwMDgwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICJlIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCBfKCI8aWxsZWdhbCBwcmVjaXNpb24+IikpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdRJzoKLQkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDA0MDgwMDApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInMiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDQwMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUic6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDYwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBicmVhazsKLQkJCWNhc2UgMHgyMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAicCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg0MDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAibSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInoiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotCQkgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCQkgICAgICB7Ci0JCQlpbnQgYml0c3RhcnQgPSAqYysrIC0gJzAnOwotCQkJaW50IGJpdGVuZCA9IDA7Ci0JCQl3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgYml0c3RhcnQgPSAoYml0c3RhcnQgKiAxMCkgKyAqYysrIC0gJzAnOwotCi0JCQlzd2l0Y2ggKCpjKQotCQkJICB7Ci0JCQkgIGNhc2UgJy0nOgotCQkJICAgIGMrKzsKLQkJCSAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgICAgIGJpdGVuZCA9IChiaXRlbmQgKiAxMCkgKyAqYysrIC0gJzAnOwotCQkJICAgIGlmICghYml0ZW5kKQotCQkJICAgICAgYWJvcnQgKCk7Ci0JCQkgICAgc3dpdGNoICgqYykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgJ3InOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnZCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAneCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIweCUwOHgiLCByZWcpOwotCQkJCSAgCi0JCQkJICAvKiBTb21lIFNXSSBpbnN0cnVjdGlvbnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzLiAgKi8KLQkJCQkgIGlmICgoZ2l2ZW4gJiAweDBmZmZmZmZmKSA9PSAweDBGRjAwMDAwKQotCQkJCSAgICBmdW5jIChzdHJlYW0sICJcdDsgSU1CIik7Ci0JCQkJICBlbHNlIGlmICgoZ2l2ZW4gJiAweDBmZmZmZmZmKSA9PSAweDBGRjAwMDAxKQotCQkJCSAgICBmdW5jIChzdHJlYW0sICJcdDsgSU1CUmFuZ2UiKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICdmJzoKLQkJCQl7Ci0JCQkJICBsb25nIHJlZzsKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIGlmIChyZWcgPiA3KQotCQkJCSAgICBmdW5jIChzdHJlYW0sICIjJXMiLAotCQkJCQkgIGFybV9mcF9jb25zdFtyZWcgJiA3XSk7Ci0JCQkJICBlbHNlCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgImYlZCIsIHJlZyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgZGVmYXVsdDoKLQkJCQlhYm9ydCAoKTsKLQkJCSAgICAgIH0KLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAnYCc6Ci0JCQkgICAgYysrOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpID09IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAnXCcnOgotCQkJICAgIGMrKzsKLQkJCSAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgJz8nOgotCQkJICAgICsrYzsKLQkJCSAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYysrKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICorK2MpOwotCQkJICAgIGJyZWFrOwotCQkJICBkZWZhdWx0OgotCQkJICAgIGFib3J0ICgpOwotCQkJICB9Ci0JCQlicmVhazsKLQotCQkgICAgICBkZWZhdWx0OgotCQkJYWJvcnQgKCk7Ci0JCSAgICAgIH0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7Ci0JICAgIH0KLQkgIHJldHVybiA0OwotCX0KLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3RodW1iIChwYywgaW5mbywgZ2l2ZW4pCi0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLSAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBnaXZlbjsKLXsKLSAgc3RydWN0IHRodW1iX29wY29kZSAqIGluc247Ci0gIHZvaWQgKiAgICAgICAgICAgICAgICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgICAgICAgICBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGZvciAoaW5zbiA9IHRodW1iX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiBpbnNuLT5tYXNrKSA9PSBpbnNuLT52YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKiBjID0gaW5zbi0+YXNzZW1ibGVyOwotCi0gICAgICAgICAgLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBUaHVtYiAyIGluc3RydWN0aW9uIEJMIHNlcXVlbmNlOiAqLwotICAgICAgICAgIGlmICghKmMpIC8qIGNoZWNrIGZvciBlbXB0eSAobm90IE5VTEwpIGFzc2VtYmxlciBzdHJpbmcgKi8KLSAgICAgICAgICAgIHsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lICA9IDQ7Ci0JICAgICAgCi0gICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiUwNHhcdGJsXHQiLCBnaXZlbiAmIDB4ZmZmZik7Ci0gICAgICAgICAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotICAgICAgICAgICAgICAgIChCRElTUDIzIChnaXZlbikgKiAyICsgcGMgKyA0LCBpbmZvKTsKLSAgICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgID0gNDsKLQkgIAkgICAgICAKLSAgICAgICAgICAgICAgZ2l2ZW4gJj0gMHhmZmZmOwotICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlMDR4XHQiLCBnaXZlbik7Ci0JICAgICAgCi0gICAgICAgICAgICAgIGZvciAoOyAqYzsgYysrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICgqYyA9PSAnJScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9tYXNrcGMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgIGludCBkb21hc2tsciA9IDA7Ci0JCSAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKisrYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlJSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoZ2l2ZW4gPj4gMykgJiAweDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgNikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlZzsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBnaXZlbiAmIDB4NzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2l2ZW4gJiAoMSA8PCA3KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICs9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9jb25kaXRpb25hbCBbKGdpdmVuID4+IDgpICYgMHhmXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgOCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYXNrbHIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ08nOgotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJ08nICYmIChnaXZlbiAmICgxIDw8IDgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21hc2twYyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZzsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBzcG90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLCBhbmQgZ2VuZXJhdGUgdGhlIHJTLXJFIGZvcm1hdDogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJlZyA9IDA7IChyZWcgPCA4KTsgcmVnKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgcmVnKSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbWFza2xyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAibHIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb21hc2twYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAicGMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHN0YXJ0ID0gKmMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0ZW5kID0gMDsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0YXJ0ID0gKGJpdHN0YXJ0ICogMTApICsgKmMrKyAtICcwJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOwotCQkJCSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ZW5kID0gKGJpdGVuZCAqIDEwKSArICpjKysgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiaXRlbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6Ci0JCQkJICAgICAgLyogUEMtcmVsYXRpdmUgYWRkcmVzcyAtLSB0aGUgYm90dG9tIHR3bwotCQkJCQkgYml0cyBvZiB0aGUgYWRkcmVzcyBhcmUgZHJvcHBlZCBiZWZvcmUKLQkJCQkJIHRoZSBjYWxjdWxhdGlvbi4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYwotCQkJCQkoKChwYyArIDQpICYgfjMpICsgKHJlZyA8PCAyKSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiMHglMDR4IiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWcgKiAyICsgcGMgKyA0LCBpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYysrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgfQotICAgIH0KLQotICAvKiBubyBtYXRjaCAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogU2VsZWN0IGEgZGlmZmVyZW50IHJlZ2lzdGVyIG5hbWUgc2V0LgotICAgUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIHNldCBzZWxlY3RlZCBpcyB0aGUgQVBDUyBuYW1lIHNldC4gICovCi1pbnQKLWFybV90b2dnbGVfcmVnbmFtZXMgKCkKLXsKLSAgaWYgKGFybV9yZWduYW1lcyA9PSBhcm1fcmVnbmFtZXNfc3RhbmRhcmQpCi0gICAgYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX2FwY3M7Ci0gIGVsc2UKLSAgICBhcm1fcmVnbmFtZXMgPSBhcm1fcmVnbmFtZXNfc3RhbmRhcmQ7Ci0KLSAgcmV0dXJuIGFybV9yZWduYW1lcyA9PSBhcm1fcmVnbmFtZXNfYXBjczsKLX0KLQotc3RhdGljIHZvaWQKLXBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIChvcHRpb25zKQotICAgICBjaGFyICogb3B0aW9uczsKLXsKLSAgaWYgKG9wdGlvbnMgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gICAgICAKLSAgaWYgKHN0cm5jbXAgKG9wdGlvbnMsICJyZWctbmFtZXMtIiwgMTApID09IDApCi0gICAgewotICAgICAgb3B0aW9ucyArPSAxMDsKLSAgICAgIAotICAgICAgaWYgKHN0cmNtcCAob3B0aW9ucywgInN0ZCIpID09IDApCi0JYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX3N0YW5kYXJkOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChvcHRpb25zLCAiYXBjcyIpID09IDApCi0JYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX2FwY3M7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGlvbnMsICJyYXciKSA9PSAwKQotCWFybV9yZWduYW1lcyA9IGFybV9yZWduYW1lc19yYXc7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLCAiVW5yZWNvZ25pc2VkIHJlZ2lzdGVyIG5hbWUgc2V0OiAlc1xuIiwgb3B0aW9ucyk7Ci0gICAgfQotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiVW5yZWNvZ25pc2VkIGRpc2Fzc2VtYmxlciBvcHRpb246ICVzXG4iLCBvcHRpb25zKTsKLSAgCi0gIHJldHVybjsKLX0KLQotLyogTk9URTogVGhlcmUgYXJlIG5vIGNoZWNrcyBpbiB0aGVzZSByb3V0aW5lcyB0aGF0IHRoZSByZWxldmFudCBudW1iZXIgb2YgZGF0YSBieXRlcyBleGlzdCAqLwotCi1pbnQKLXByaW50X2luc25fYmlnX2FybSAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciAgICAgIGJbNF07Ci0gIGxvbmcgICAgICAgICAgICAgICBnaXZlbjsKLSAgaW50ICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgY29mZl9zeW1ib2xfdHlwZSAqIGNzOwotICBlbGZfc3ltYm9sX3R5cGUgKiAgZXM7Ci0gIGludCAgICAgICAgICAgICAgICBpc190aHVtYjsKLSAgCi0gIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucykKLSAgICB7Ci0gICAgICBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpOwotICAgICAgCi0gICAgICAvKiBUbyBhdm9pZCByZXBlYXRlZCBwYXJzaW5nIG9mIHRoaXMgb3B0aW9uLCB3ZSByZW1vdmUgaXQgaGVyZS4gICovCi0gICAgICBpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucyA9IE5VTEw7Ci0gICAgfQotICAKLSAgaXNfdGh1bWIgPSBmYWxzZTsKLSAgaWYgKGluZm8tPnN5bWJvbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotCXsKLQkgIGNzID0gY29mZnN5bWJvbCAoKmluZm8tPnN5bWJvbHMpOwotCSAgaXNfdGh1bWIgPSAoICAgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkVYVAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CTEFCRUwKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkVYVEZVTkMKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DKTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltYm9scykgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBlcyA9ICooZWxmX3N5bWJvbF90eXBlICoqKShpbmZvLT5zeW1ib2xzKTsKLQkgIGlzX3RodW1iID0gRUxGX1NUX1RZUEUgKGVzLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pID09Ci0JICAgIFNUVF9BUk1fVEZVTkM7Ci0JfQotICAgIH0KLQotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotCi0gIC8qIEFsd2F5cyBmZXRjaCB3b3JkIGFsaWduZWQgdmFsdWVzLiAgKi8KLSAgCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjICYgfiAweDMsIChiZmRfYnl0ZSAqKSAmYlswXSwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChpc190aHVtYikKLSAgICB7Ci0gICAgICBpZiAocGMgJiAweDIpCi0JewotCSAgZ2l2ZW4gPSAoYlsyXSA8PCA4KSB8IGJbM107Ci0KLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKChwYyArIDQpICYgfiAweDMsIChiZmRfYnl0ZSAqKSBiLCA0LCBpbmZvKTsKLQkgIGlmIChzdGF0dXMgIT0gMCkKLQkgICAgewotCSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIHBjICsgNCwgaW5mbyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICAKLQkgIGdpdmVuIHw9IChiWzBdIDw8IDI0KSB8IChiWzFdIDw8IDE2KTsKLQl9Ci0gICAgICBlbHNlCi0JZ2l2ZW4gPSAoYlswXSA8PCA4KSB8IGJbMV0gfCAoYlsyXSA8PCAyNCkgfCAoYlszXSA8PCAxNik7Ci0gICAgfQotICBlbHNlCi0gICAgZ2l2ZW4gPSAoYlswXSA8PCAyNCkgfCAoYlsxXSA8PCAxNikgfCAoYlsyXSA8PCA4KSB8IChiWzNdKTsKLQotICBpZiAoaXNfdGh1bWIpCi0gICAgc3RhdHVzID0gcHJpbnRfaW5zbl90aHVtYiAocGMsIGluZm8sIGdpdmVuKTsKLSAgZWxzZQotICAgIHN0YXR1cyA9IHByaW50X2luc25fYXJtIChwYywgaW5mbywgZ2l2ZW4pOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9saXR0bGVfYXJtIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICB1bnNpZ25lZCBjaGFyICAgICAgYls0XTsKLSAgbG9uZyAgICAgICAgICAgICAgIGdpdmVuOwotICBpbnQgICAgICAgICAgICAgICAgc3RhdHVzOwotICBjb2ZmX3N5bWJvbF90eXBlICogY3M7Ci0gIGVsZl9zeW1ib2xfdHlwZSAqICBlczsKLSAgaW50ICAgICAgICAgICAgICAgIGlzX3RodW1iOwotCi0gIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucykKLSAgICB7Ci0gICAgICBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpOwotICAgICAgCi0gICAgICAvKiBUbyBhdm9pZCByZXBlYXRlZCBwYXJzaW5nIG9mIHRoaXMgb3B0aW9uLCB3ZSByZW1vdmUgaXQgaGVyZS4gICovCi0gICAgICBpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucyA9IE5VTEw7Ci0gICAgfQotICAKLSAgaXNfdGh1bWIgPSBmYWxzZTsKLSAgCi0gIGlmIChpbmZvLT5zeW1ib2xzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLQl7Ci0JICBjcyA9IGNvZmZzeW1ib2wgKCppbmZvLT5zeW1ib2xzKTsKLQkgIGlzX3RodW1iID0gKCAgIGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFQKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVQKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkxBQkVMCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFRGVU5DCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFURlVOQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgZXMgPSAqKGVsZl9zeW1ib2xfdHlwZSAqKikoaW5mby0+c3ltYm9scyk7Ci0JICBpc190aHVtYiA9IEVMRl9TVF9UWVBFIChlcy0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSA9PQotCSAgICBTVFRfQVJNX1RGVU5DOwotCX0KLSAgICB9Ci0gIAotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCAoYmZkX2J5dGUgKikgJmJbMF0sIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDAgJiYgaXNfdGh1bWIpCi0gICAgewotICAgICAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLQotICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAocGMsIChiZmRfYnl0ZSAqKSBiLCAyLCBpbmZvKTsKLSAgICAgIGJbM10gPSBiWzJdID0gMDsKLSAgICB9Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGdpdmVuID0gKGJbMF0pIHwgKGJbMV0gPDwgOCkgfCAoYlsyXSA8PCAxNikgfCAoYlszXSA8PCAyNCk7Ci0KLSAgaWYgKGlzX3RodW1iKQotICAgIHN0YXR1cyA9IHByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbik7Ci0gIGVsc2UKLSAgICBzdGF0dXMgPSBwcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcm0tb3BjLmggYi9vcGNvZGVzL2FybS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5Mjk4Zi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FybS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBUk0uCi0KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLXN0cnVjdCBhcm1fb3Bjb2RlIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtYXNrOwkvKiByZWNvZ25pc2UgaW5zdHJ1Y3Rpb24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLwotICAgIGNoYXIgKmFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi1zdHJ1Y3QgdGh1bWJfb3Bjb2RlCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqIGFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi0vKiBmb3JtYXQgb2YgdGhlIGFzc2VtYmxlciBzdHJpbmcgOgotICAgCi0gICAlJQkJCSUKLSAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+eAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGhleAotICAgJTxiaXRmaWVsZD5yCQlwcmludCBhcyBhbiBBUk0gcmVnaXN0ZXIKLSAgICU8Yml0ZmllbGQ+ZgkJcHJpbnQgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpZiA+NyBlbHNlIGEKLQkJCWZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAlYwkJCXByaW50IGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyAyOC0zMSkKLSAgICVQCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGFyaXRobWV0aWMgaW5zbgotICAgJVEJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gbGRmL3N0ZiBpbnNuCi0gICAlUgkJCXByaW50IGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIG1vZGUKLSAgICU8Yml0bnVtPidjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIG9uZQotICAgJTxiaXRudW0+YGMJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgemVybwotICAgJTxiaXRudW0+P2FiCQlwcmludCBhIGlmIGJpdCBpcyBvbmUgZWxzZSBwcmludCBiCi0gICAlcAkJCXByaW50ICdwJyBpZmYgYml0cyAxMi0xNSBhcmUgMTUKLSAgICV0CQkJcHJpbnQgJ3QnIGlmZiBiaXQgMjEgc2V0IGFuZCBiaXQgMjQgY2xlYXIKLSAgICVoICAgICAgICAgICAgICAgICAgIHByaW50ICdoJyBpZmYgYml0IDUgc2V0LCBlbHNlIHByaW50ICdiJwotICAgJW8JCQlwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCi0gICAlYQkJCXByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaW5zdHJ1Y3Rpb24KLSAgICVzICAgICAgICAgICAgICAgICAgIHByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaGFsZndvcmQvc2lnbmV4dGVuZCBpbnN0cnVjdGlvbgotICAgJWIJCQlwcmludCBicmFuY2ggZGVzdGluYXRpb24KLSAgICVBCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRjL3N0Yy9sZGYvc3RmIGluc3RydWN0aW9uCi0gICAlbQkJCXByaW50IHJlZ2lzdGVyIG1hc2sgZm9yIGxkbS9zdG0gaW5zdHJ1Y3Rpb24KLSAgICVDCQkJcHJpbnQgdGhlIFBTUiBzdWIgdHlwZS4KLSAgICVGCQkJcHJpbnQgdGhlIENPVU5UIGZpZWxkIG9mIGEgTEZNL1NGTSBpbnN0cnVjdGlvbi4KLVRodW1iIHNwZWNpZmljIGZvcm1hdCBvcHRpb25zOgotICAgJUQgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMC4uMiBhcyBoaWdoIG51bWJlciBpZiBiaXQgNyBzZXQpCi0gICAlUyAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciAoYml0cyAzLi41IGFzIGhpZ2ggbnVtYmVyIGlmIGJpdCA2IHNldCkKLSAgICU8Yml0ZmllbGQ+SSAgICAgICAgIHByaW50IGJpdGZpZWxkIGFzIGEgc2lnbmVkIGRlY2ltYWwKLSAgIAkJCQkodG9wIGJpdCBvZiByYW5nZSBiZWluZyB0aGUgc2lnbiBiaXQpCi0gICAlTSAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciBtYXNrCi0gICAlTiAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciBtYXNrICh3aXRoIExSKQotICAgJU8gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBQQykKLSAgICVUICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyA4LTExKQotICAgJTxiaXRmaWVsZD5CICAgICAgICAgcHJpbnQgVGh1bWIgYnJhbmNoIGRlc3RpbmF0aW9uIChzaWduZWQgZGlzcGxhY2VtZW50KQotICAgJTxiaXRmaWVsZD5XICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogNCkgYXMgYSBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPkggICAgICAgICBwcmludCAoYml0ZmllbGQgKiAyKSBhcyBhIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+YSAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgcGMtcmVsIG9mZnNldCArIGRlY29kZWQgc3ltYm9sCi0qLwotCi0vKiBOb3RlOiBUaGVyZSBpcyBhIHBhcnRpYWwgb3JkZXJpbmcgaW4gdGhpcyB0YWJsZSAtIGl0IG11c3QgYmUgc2VhcmNoZWQgZnJvbQotICAgdGhlIHRvcCB0byBvYnRhaW4gYSBjb3JyZWN0IG1hdGNoLiAqLwotCi1zdGF0aWMgc3RydWN0IGFybV9vcGNvZGUgYXJtX29wY29kZXNbXSA9IHsKLSAgICAvKiBBUk0gaW5zdHJ1Y3Rpb25zICovCi0gICAgezB4ZTFhMDAwMDAsIDB4ZmZmZmZmZmYsICJub3BcdFx0XHQobW92IHIwLHIwKSJ9LAotICAgIHsweDAxMkZGRjEwLCAweDBmZmZmZmYwLCAiYnglY1x0JTAtM3IifSwKLSAgICB7MHgwMDAwMDA5MCwgMHgwZmUwMDBmMCwgIm11bCVjJTIwJ3NcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKLSAgICB7MHgwMDIwMDA5MCwgMHgwZmUwMDBmMCwgIm1sYSVjJTIwJ3NcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIsICUxMi0xNXIifSwKLSAgICB7MHgwMTAwMDA5MCwgMHgwZmIwMGZmMCwgInN3cCVjJTIyJ2JcdCUxMi0xNXIsICUwLTNyLCBbJTE2LTE5cl0ifSwKLSAgICB7MHgwMDgwMDA5MCwgMHgwZmEwMDBmMCwgIiUyMj9zdW11bGwlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCi0gICAgezB4MDBhMDAwOTAsIDB4MGZhMDAwZjAsICIlMjI/c3VtbGFsJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAotICAgIHsweDAwMDAwMDkwLCAweDBlMTAwMDkwLCAic3RyJWMlNidzJWhcdCUxMi0xNXIsICVzIn0sCi0gICAgezB4MDAxMDAwOTAsIDB4MGUxMDAwOTAsICJsZHIlYyU2J3MlaFx0JTEyLTE1ciwgJXMifSwKLSAgICB7MHgwMDAwMDAwMCwgMHgwZGUwMDAwMCwgImFuZCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDAyMDAwMDAsIDB4MGRlMDAwMDAsICJlb3IlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwNDAwMDAwLCAweDBkZTAwMDAwLCAic3ViJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDYwMDAwMCwgMHgwZGUwMDAwMCwgInJzYiVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDA4MDAwMDAsIDB4MGRlMDAwMDAsICJhZGQlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwYTAwMDAwLCAweDBkZTAwMDAwLCAiYWRjJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMGMwMDAwMCwgMHgwZGUwMDAwMCwgInNiYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDBlMDAwMDAsIDB4MGRlMDAwMDAsICJyc2MlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxMjBmMDAwLCAweDBkYjZmMDAwLCAibXNyJWNcdCUyMj9zY3BzciVDLCAlbyJ9LAotICAgIHsweDAxMGYwMDAwLCAweDBmYmYwZmZmLCAibXJzJWNcdCUxMi0xNXIsICUyMj9zY3BzciJ9LAotICAgIHsweDAxMDAwMDAwLCAweDBkZTAwMDAwLCAidHN0JWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTIwMDAwMCwgMHgwZGUwMDAwMCwgInRlcSVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDE0MDAwMDAsIDB4MGRlMDAwMDAsICJjbXAlYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxNjAwMDAwLCAweDBkZTAwMDAwLCAiY21uJWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTgwMDAwMCwgMHgwZGUwMDAwMCwgIm9yciVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDFhMDAwMDAsIDB4MGRlMDAwMDAsICJtb3YlYyUyMCdzXHQlMTItMTVyLCAlbyJ9LAotICAgIHsweDAxYzAwMDAwLCAweDBkZTAwMDAwLCAiYmljJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMWUwMDAwMCwgMHgwZGUwMDAwMCwgIm12biVjJTIwJ3NcdCUxMi0xNXIsICVvIn0sCi0gICAgezB4MDQwMDAwMDAsIDB4MGUxMDAwMDAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDYwMDAwMDAsIDB4MGUxMDBmZjAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDQwMDAwMDAsIDB4MGMxMDAwMTAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDYwMDAwMTAsIDB4MGUwMDAwMTAsICJ1bmRlZmluZWQifSwKLSAgICB7MHgwNDEwMDAwMCwgMHgwYzEwMDAwMCwgImxkciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwODAwMDAwMCwgMHgwZTEwMDAwMCwgInN0bSVjJTIzP2lkJTI0P2JhXHQlMTYtMTlyJTIxJyEsICVtJTIyJ14ifSwKLSAgICB7MHgwODEwMDAwMCwgMHgwZTEwMDAwMCwgImxkbSVjJTIzP2lkJTI0P2JhXHQlMTYtMTlyJTIxJyEsICVtJTIyJ14ifSwKLSAgICB7MHgwYTAwMDAwMCwgMHgwZTAwMDAwMCwgImIlMjQnbCVjXHQlYiJ9LAotICAgIHsweDBmMDAwMDAwLCAweDBmMDAwMDAwLCAic3dpJWNcdCUwLTIzeCJ9LAotCi0gICAgLyogRmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgezB4MGUwMDAxMDAsIDB4MGZmMDhmMTAsICJhZGYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUxMDAxMDAsIDB4MGZmMDhmMTAsICJtdWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUyMDAxMDAsIDB4MGZmMDhmMTAsICJzdWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUzMDAxMDAsIDB4MGZmMDhmMTAsICJyc2YlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU0MDAxMDAsIDB4MGZmMDhmMTAsICJkdmYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU1MDAxMDAsIDB4MGZmMDhmMTAsICJyZGYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU2MDAxMDAsIDB4MGZmMDhmMTAsICJwb3clYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU3MDAxMDAsIDB4MGZmMDhmMTAsICJycHclYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU4MDAxMDAsIDB4MGZmMDhmMTAsICJybWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU5MDAxMDAsIDB4MGZmMDhmMTAsICJmbWwlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVhMDAxMDAsIDB4MGZmMDhmMTAsICJmZHYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGViMDAxMDAsIDB4MGZmMDhmMTAsICJmcmQlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVjMDAxMDAsIDB4MGZmMDhmMTAsICJwb2wlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUwMDgxMDAsIDB4MGZmMDhmMTAsICJtdmYlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUxMDgxMDAsIDB4MGZmMDhmMTAsICJtbmYlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUyMDgxMDAsIDB4MGZmMDhmMTAsICJhYnMlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUzMDgxMDAsIDB4MGZmMDhmMTAsICJybmQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU0MDgxMDAsIDB4MGZmMDhmMTAsICJzcXQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU1MDgxMDAsIDB4MGZmMDhmMTAsICJsb2clYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU2MDgxMDAsIDB4MGZmMDhmMTAsICJsZ24lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU3MDgxMDAsIDB4MGZmMDhmMTAsICJleHAlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU4MDgxMDAsIDB4MGZmMDhmMTAsICJzaW4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU5MDgxMDAsIDB4MGZmMDhmMTAsICJjb3MlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVhMDgxMDAsIDB4MGZmMDhmMTAsICJ0YW4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGViMDgxMDAsIDB4MGZmMDhmMTAsICJhc24lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVjMDgxMDAsIDB4MGZmMDhmMTAsICJhY3MlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVkMDgxMDAsIDB4MGZmMDhmMTAsICJhdG4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVlMDgxMDAsIDB4MGZmMDhmMTAsICJ1cmQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVmMDgxMDAsIDB4MGZmMDhmMTAsICJucm0lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUwMDAxMTAsIDB4MGZmMDBmMWYsICJmbHQlYyVQJVJcdCUxNi0xOGYsICUxMi0xNXIifSwKLSAgICB7MHgwZTEwMDExMCwgMHgwZmZmMGY5OCwgImZpeCVjJVJcdCUxMi0xNXIsICUwLTJmIn0sCi0gICAgezB4MGUyMDAxMTAsIDB4MGZmZjBmZmYsICJ3ZnMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlMzAwMTEwLCAweDBmZmYwZmZmLCAicmZzJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTQwMDExMCwgMHgwZmZmMGZmZiwgIndmYyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGU1MDAxMTAsIDB4MGZmZjBmZmYsICJyZmMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlOTBmMTEwLCAweDBmZjhmZmYwLCAiY21mJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGViMGYxMTAsIDB4MGZmOGZmZjAsICJjbmYlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWQwZjExMCwgMHgwZmY4ZmZmMCwgImNtZmUlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWYwZjExMCwgMHgwZmY4ZmZmMCwgImNuZmUlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwYzAwMDEwMCwgMHgwZTEwMGYwMCwgInN0ZiVjJVFcdCUxMi0xNGYsICVBIn0sCi0gICAgezB4MGMxMDAxMDAsIDB4MGUxMDBmMDAsICJsZGYlYyVRXHQlMTItMTRmLCAlQSJ9LAotICAgIHsweDBjMDAwMjAwLCAweDBlMTAwZjAwLCAic2ZtJWNcdCUxMi0xNGYsICVGLCAlQSJ9LAotICAgIHsweDBjMTAwMjAwLCAweDBlMTAwZjAwLCAibGZtJWNcdCUxMi0xNGYsICVGLCAlQSJ9LAotCi0gICAgLyogR2VuZXJpYyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgICB7MHgwZTAwMDAwMCwgMHgwZjAwMDAxMCwgImNkcCVjXHQlOC0xMWQsICUyMC0yM2QsIGNyJTEyLTE1ZCwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCi0gICAgezB4MGUxMDAwMTAsIDB4MGYxMDAwMTAsICJtcmMlY1x0JTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKLSAgICB7MHgwZTAwMDAxMCwgMHgwZjEwMDAxMCwgIm1jciVjXHQlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAotICAgIHsweDBjMDAwMDAwLCAweDBlMTAwMDAwLCAic3RjJWMlMjInbFx0JTgtMTFkLCBjciUxMi0xNWQsICVBIn0sCi0gICAgezB4MGMxMDAwMDAsIDB4MGUxMDAwMDAsICJsZGMlYyUyMidsXHQlOC0xMWQsIGNyJTEyLTE1ZCwgJUEifSwKLSAgICAvKiB0aGUgcmVzdCAqLwotICAgIHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTMxeCJ9LAotICAgIHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfQotfTsKLQotI2RlZmluZSBCRElTUCh4KSAoKCgoeCkgJiAweGZmZmZmZikgXiAweDgwMDAwMCkgLSAweDgwMDAwMCkgLyogMjYgYml0ICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGh1bWJfb3Bjb2RlIHRodW1iX29wY29kZXNbXSA9Ci17Ci0gIC8qIFRodW1iIGluc3RydWN0aW9ucyAqLwotICB7MHg0NkMwLCAweEZGRkYsICJub3BcdFx0XHQobW92IHI4LHI4KSJ9LCAvKiBmb3JtYXQgNSBpbnN0cnVjdGlvbnMgZG8gbm90IHVwZGF0ZSB0aGUgUFNSICovCi0gIHsweDFDMDAsIDB4RkZDMCwgIm1vdlx0JTAtMnIsICUzLTVyXHRcdChhZGQgJTAtMnIsICUzLTVyLCAjJTYtOGQpIn0sCi0gIC8qIGZvcm1hdCA0ICovCi0gIHsweDQwMDAsIDB4RkZDMCwgImFuZFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwNDAsIDB4RkZDMCwgImVvclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwODAsIDB4RkZDMCwgImxzbFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwQzAsIDB4RkZDMCwgImxzclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxMDAsIDB4RkZDMCwgImFzclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxNDAsIDB4RkZDMCwgImFkY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxODAsIDB4RkZDMCwgInNiY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxQzAsIDB4RkZDMCwgInJvclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyMDAsIDB4RkZDMCwgInRzdFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyNDAsIDB4RkZDMCwgIm5lZ1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyODAsIDB4RkZDMCwgImNtcFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyQzAsIDB4RkZDMCwgImNtblx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzMDAsIDB4RkZDMCwgIm9yclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzNDAsIDB4RkZDMCwgIm11bFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzODAsIDB4RkZDMCwgImJpY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzQzAsIDB4RkZDMCwgIm12blx0JTAtMnIsICUzLTVyIn0sCi0gIC8qIGZvcm1hdCAxMyAqLwotICB7MHhCMDAwLCAweEZGODAsICJhZGRcdHNwLCAjJTAtNlcifSwKLSAgezB4QjA4MCwgMHhGRjgwLCAic3ViXHRzcCwgIyUwLTZXIn0sCi0gIC8qIGZvcm1hdCA1ICovCi0gIHsweDQ3MDAsIDB4RkY4MCwgImJ4XHQlUyJ9LAotICB7MHg0NDAwLCAweEZGMDAsICJhZGRcdCVELCAlUyJ9LAotICB7MHg0NTAwLCAweEZGMDAsICJjbXBcdCVELCAlUyJ9LAotICB7MHg0NjAwLCAweEZGMDAsICJtb3ZcdCVELCAlUyJ9LAotICAvKiBmb3JtYXQgMTQgKi8KLSAgezB4QjQwMCwgMHhGRTAwLCAicHVzaFx0JU4ifSwKLSAgezB4QkMwMCwgMHhGRTAwLCAicG9wXHQlTyJ9LAotICAvKiBmb3JtYXQgMiAqLwotICB7MHgxODAwLCAweEZFMDAsICJhZGRcdCUwLTJyLCAlMy01ciwgJTYtOHIifSwKLSAgezB4MUEwMCwgMHhGRTAwLCAic3ViXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCi0gIHsweDFDMDAsIDB4RkUwMCwgImFkZFx0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKLSAgezB4MUUwMCwgMHhGRTAwLCAic3ViXHQlMC0yciwgJTMtNXIsICMlNi04ZCJ9LAotICAvKiBmb3JtYXQgOCAqLwotICB7MHg1MjAwLCAweEZFMDAsICJzdHJoXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgezB4NUEwMCwgMHhGRTAwLCAibGRyaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDU2MDAsIDB4RjYwMCwgImxkcyUxMT9oYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIC8qIGZvcm1hdCA3ICovCi0gIHsweDUwMDAsIDB4RkEwMCwgInN0ciUxMCdiXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgezB4NTgwMCwgMHhGQTAwLCAibGRyJTEwJ2JcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAvKiBmb3JtYXQgMSAqLwotICB7MHgwMDAwLCAweEY4MDAsICJsc2xcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICB7MHgwODAwLCAweEY4MDAsICJsc3JcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICB7MHgxMDAwLCAweEY4MDAsICJhc3JcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICAvKiBmb3JtYXQgMyAqLwotICB7MHgyMDAwLCAweEY4MDAsICJtb3ZcdCU4LTEwciwgIyUwLTdkIn0sCi0gIHsweDI4MDAsIDB4RjgwMCwgImNtcFx0JTgtMTByLCAjJTAtN2QifSwKLSAgezB4MzAwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsICMlMC03ZCJ9LAotICB7MHgzODAwLCAweEY4MDAsICJzdWJcdCU4LTEwciwgIyUwLTdkIn0sCi0gIC8qIGZvcm1hdCA2ICovCi0gIHsweDQ4MDAsIDB4RjgwMCwgImxkclx0JTgtMTByLCBbcGMsICMlMC03V11cdCglMC03YSkifSwgIC8qIFRPRE86IERpc2Fzc2VtYmxlIFBDIHJlbGF0aXZlICJMRFIgckQsPTxzeW1ib2xpYz4iICovCi0gIC8qIGZvcm1hdCA5ICovCi0gIHsweDYwMDAsIDB4RjgwMCwgInN0clx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NjgwMCwgMHhGODAwLCAibGRyXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBXXSJ9LAotICB7MHg3MDAwLCAweEY4MDAsICJzdHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICB7MHg3ODAwLCAweEY4MDAsICJsZHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICAvKiBmb3JtYXQgMTAgKi8KLSAgezB4ODAwMCwgMHhGODAwLCAic3RyaFx0JTAtMnIsIFslMy01ciwgIyU2LTEwSF0ifSwKLSAgezB4ODgwMCwgMHhGODAwLCAibGRyaFx0JTAtMnIsIFslMy01ciwgIyU2LTEwSF0ifSwKLSAgLyogZm9ybWF0IDExICovCi0gIHsweDkwMDAsIDB4RjgwMCwgInN0clx0JTgtMTByLCBbc3AsICMlMC03V10ifSwKLSAgezB4OTgwMCwgMHhGODAwLCAibGRyXHQlOC0xMHIsIFtzcCwgIyUwLTdXXSJ9LAotICAvKiBmb3JtYXQgMTIgKi8KLSAgezB4QTAwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsIHBjLCAjJTAtN1dcdChhZHIgJTgtMTByLCUwLTdhKSJ9LAotICB7MHhBODAwLCAweEY4MDAsICJhZGRcdCU4LTEwciwgc3AsICMlMC03VyJ9LAotICAvKiBmb3JtYXQgMTUgKi8KLSAgezB4QzAwMCwgMHhGODAwLCAic3RtaWFcdCU4LTEwciEsJU0ifSwKLSAgezB4QzgwMCwgMHhGODAwLCAibGRtaWFcdCU4LTEwciEsJU0ifSwKLSAgLyogZm9ybWF0IDE4ICovCi0gIHsweEUwMDAsIDB4RjgwMCwgImJcdCUwLTEwQiJ9LAotICB7MHhFODAwLCAweEY4MDAsICJ1bmRlZmluZWQifSwKLSAgLyogZm9ybWF0IDE5ICovCi0gIHsweEYwMDAsIDB4RjgwMCwgIiJ9LCAvKiBzcGVjaWFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgaW4gZGlzYXNzZW1ibGVyICovCi0gIHsweEY4MDAsIDB4RjgwMCwgInNlY29uZCBoYWxmIG9mIEJMIGluc3RydWN0aW9uICUwLTE1eCJ9LAotICAvKiBmb3JtYXQgMTYgKi8KLSAgezB4RDAwMCwgMHhGRjAwLCAiYmVxXHQlMC03QiJ9LAotICB7MHhEMTAwLCAweEZGMDAsICJibmVcdCUwLTdCIn0sCi0gIHsweEQyMDAsIDB4RkYwMCwgImJjc1x0JTAtN0IifSwKLSAgezB4RDMwMCwgMHhGRjAwLCAiYmNjXHQlMC03QiJ9LAotICB7MHhENDAwLCAweEZGMDAsICJibWlcdCUwLTdCIn0sCi0gIHsweEQ1MDAsIDB4RkYwMCwgImJwbFx0JTAtN0IifSwKLSAgezB4RDYwMCwgMHhGRjAwLCAiYnZzXHQlMC03QiJ9LAotICB7MHhENzAwLCAweEZGMDAsICJidmNcdCUwLTdCIn0sCi0gIHsweEQ4MDAsIDB4RkYwMCwgImJoaVx0JTAtN0IifSwKLSAgezB4RDkwMCwgMHhGRjAwLCAiYmxzXHQlMC03QiJ9LAotICB7MHhEQTAwLCAweEZGMDAsICJiZ2VcdCUwLTdCIn0sCi0gIHsweERCMDAsIDB4RkYwMCwgImJsdFx0JTAtN0IifSwKLSAgezB4REMwMCwgMHhGRjAwLCAiYmd0XHQlMC03QiJ9LAotICB7MHhERDAwLCAweEZGMDAsICJibGVcdCUwLTdCIn0sCi0gIC8qIGZvcm1hdCAxNyAqLwotICB7MHhERTAwLCAweEZGMDAsICJ1bmRlZmluZWQifSwKLSAgezB4REYwMCwgMHhGRjAwLCAic3dpXHQlMC03ZCJ9LAotICAvKiBmb3JtYXQgOSAqLwotICB7MHg2MDAwLCAweEY4MDAsICJzdHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDY4MDAsIDB4RjgwMCwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NzAwMCwgMHhGODAwLCAic3RyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgezB4NzgwMCwgMHhGODAwLCAibGRyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgLyogdGhlIHJlc3QgKi8KLSAgezB4MDAwMCwgMHgwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTE1eCJ9LAotICB7MHgwMDAwLCAweDAwMDAsIDB9Ci19OwotCi0jZGVmaW5lIEJESVNQMjMoeCkgKCgoKCgoeCkgJiAweDA3ZmYpIDw8IDExKSB8ICgoKHgpICYgMHgwN2ZmMDAwMCkgPj4gMTYpKSBcCi0gICAgICAgICAgICAgICAgICAgICBeIDB4MjAwMDAwKSAtIDB4MjAwMDAwKSAvKiAyM2JpdCAqLwotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tYXNtLmMgYi9vcGNvZGVzL2NnZW4tYXNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZDY5MzYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jZ2VuLWFzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qIENHRU4gZ2VuZXJpYyBhc3NlbWJsZXIgc3VwcG9ydCBjb2RlLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIFNldCB0aGUgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGNhbGxiYWNrLiAgKi8KLQotdm9pZAotY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoY2QsIGZuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gZm47Ci17Ci0gIGNkLT5wYXJzZV9vcGVyYW5kX2ZuID0gZm47Ci19Ci0KLS8qIENhbGxlZCB3aGVuZXZlciBzdGFydGluZyB0byBwYXJzZSBhbiBpbnNuLiAgKi8KLQotdm9pZAotY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICAvKiBUaGlzIHRlbGxzIHRoZSBjYWxsYmFjayB0byByZS1pbml0aWFsaXplLiAgKi8KLSAgKHZvaWQpICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQsIE5VTEwsIDAsIDAsIE5VTEwsIE5VTEwpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBJTlNOUy4KLSAgIEVOVFNJWkUgaXMgc2l6ZW9mIChDR0VOX0lCQVNFKSBmb3IgdGhlIHRhcmdldC4KLSAgID8/PyBObyBsb25nZXIgdXNlZCBidXQgbGVhdmUgaW4gZm9yIG5vdy4KLSAgIEhUQUJMRSBwb2ludHMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBIRU5UQlVGIGlzIGEgcG9pbnRlciB0byBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyIG9mIGhhc2ggZW50cmllcy4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5IHRvIHVzZS4KLQotICAgVGhlIHRhYmxlIGlzIHNjYW5uZWQgYmFja3dhcmRzIGFzIGFkZGl0aW9ucyBhcmUgbWFkZSB0byB0aGUgZnJvbnQgb2YgdGhlCi0gICBsaXN0IGFuZCB3ZSB3YW50IGVhcmxpZXIgb25lcyB0byBiZSBwcmVmZXJlZC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fYXJyYXkgKGNkLCBpbnNucywgY291bnQsIGVudHNpemUsIGh0YWJsZSwgaGVudGJ1ZikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuczsKLSAgICAgaW50IGNvdW50OwotICAgICBpbnQgZW50c2l6ZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgLS1pLCArK2hlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSAmaW5zbnNbaV07Ci0KLSAgICAgIGlmICghICgqIGNkLT5hc21faGFzaF9wKSAoaW5zbikpCi0JY29udGludWU7Ci0gICAgICBoYXNoID0gKCogY2QtPmFzbV9oYXNoKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGluc247Ci0gICAgICBodGFibGVbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9hc21faGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBoYXNoX2luc25fYXJyYXkgZXhjZXB0IHRoZSBpbnNucyBhcmUKLSAgIGluIGEgbGlzdC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fbGlzdCAoY2QsIGluc25zLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuczsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgZm9yIChpbGlzdCA9IGluc25zOyBpbGlzdCAhPSBOVUxMOyBpbGlzdCA9IGlsaXN0LT5uZXh0LCArKyBoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotCi0gICAgICBpZiAoISAoKiBjZC0+YXNtX2hhc2hfcCkgKGlsaXN0LT5pbnNuKSkKLQljb250aW51ZTsKLSAgICAgIGhhc2ggPSAoKiBjZC0+YXNtX2hhc2gpIChDR0VOX0lOU05fTU5FTU9OSUMgKGlsaXN0LT5pbnNuKSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGlsaXN0LT5pbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9hc21faGFzaF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNnZW5faW5zbl9jb3VudCAoY2QpICsgY2dlbl9tYWNyb19pbnNuX2NvdW50IChjZCk7Ci0gIENHRU5fSU5TTl9UQUJMRSAqaW5zbl90YWJsZSA9ICZjZC0+aW5zbl90YWJsZTsKLSAgQ0dFTl9JTlNOX1RBQkxFICptYWNyb19pbnNuX3RhYmxlID0gJmNkLT5tYWNyb19pbnNuX3RhYmxlOwotICB1bnNpZ25lZCBpbnQgaGFzaF9zaXplID0gY2QtPmFzbV9oYXNoX3NpemU7Ci0gIENHRU5fSU5TTl9MSVNUICpoYXNoX2VudHJ5X2J1ZjsKLSAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci0KLSAgLyogVGhlIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIGhhc2ggdGFibGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgotICAgICB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIGhhc2ggbGlzdHMuICAqLwotCi0gIGFzbV9oYXNoX3RhYmxlID0gKENHRU5fSU5TTl9MSVNUICoqKQotICAgIHhtYWxsb2MgKGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOwotICBtZW1zZXQgKGFzbV9oYXNoX3RhYmxlLCAwLCBoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgYXNtX2hhc2hfdGFibGVfZW50cmllcyA9IGhhc2hfZW50cnlfYnVmID0gKENHRU5fSU5TTl9MSVNUICopCi0gICAgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUKSk7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIGluc25zLgotICAgICBEb24ndCBpbmNsdWRlIHRoZSBmaXJzdCBvbmUgYXMgaXQgaXMgYSByZXNlcnZlZCBlbnRyeS4gICovCi0gIC8qID8/PyBJdCB3YXMgdGhlIGVuZCBvZiBhbGwgaGFzaCBjaGFpbnMsIGFuZCBhbHNvIHRoZSBzcGVjaWFsCi0gICAgICJpbnZhbGlkIGluc24iIG1hcmtlci4gIE1heSBiZSBhYmxlIHRvIGRvIGl0IGRpZmZlcmVudGx5IG5vdy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLAotCQkJCSAgICBpbnNuX3RhYmxlLT5pbml0X2VudHJpZXMgKyAxLAotCQkJCSAgICBpbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzIC0gMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgY29tcGlsZWQgaW4gbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwgbWFjcm9faW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzLAotCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzLAotCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5lbnRyeV9zaXplLAotCQkJCSAgICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBydW50aW1lIGFkZGVkIGluc25zLgotICAgICBMYXRlciBhZGRlZCBpbnNucyB3aWxsIGJlIHByZWZlcmVkIG92ZXIgZWFybGllciBvbmVzLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9saXN0IChjZCwgaW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCQkJICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBtYWNyby1pbnNucy4gICovCi0KLSAgaGFzaF9pbnNuX2xpc3QgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5uZXdfZW50cmllcywKLQkJICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIGNkLT5hc21faGFzaF90YWJsZSA9IGFzbV9oYXNoX3RhYmxlOwotICBjZC0+YXNtX2hhc2hfdGFibGVfZW50cmllcyA9IGFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGhhc2ggbGlzdCBmb3IgSU5TTi4gICovCi0KLUNHRU5fSU5TTl9MSVNUICoKLWNnZW5fYXNtX2xvb2t1cF9pbnNuIChjZCwgaW5zbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqaW5zbjsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgaWYgKGNkLT5hc21faGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIChjZCk7Ci0KLSAgaGFzaCA9ICgqIGNkLT5hc21faGFzaCkgKGluc24pOwotICByZXR1cm4gY2QtPmFzbV9oYXNoX3RhYmxlW2hhc2hdOwotfQotDAotLyogS2V5d29yZCBwYXJzZXIuCi0gICBUaGUgcmVzdWx0IGlzIE5VTEwgdXBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIG1lc3NhZ2UuCi0gICBJZiBzdWNjZXNzZnVsLCAqU1RSUCBpcyB1cGRhdGVkIHRvIHBvaW50IHBhc3NlZCB0aGUga2V5d29yZC4KLQotICAgPz8/IEF0IHByZXNlbnQgd2UgaGF2ZSBhIHN0YXRpYyBub3Rpb24gb2YgaG93IHRvIHBpY2sgb3V0IGEga2V5d29yZC4KLSAgIExhdGVyIHdlIGNhbiBhbGxvdyBhIHRhcmdldCB0byBjdXN0b21pemUgdGhpcyBpZiBuZWNlc3NhcnkgW3NheSBieQotICAgcmVjb3JkaW5nIHNvbWV0aGluZyBpbiB0aGUga2V5d29yZCB0YWJsZV0uICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsIGtleXdvcmRfdGFibGUsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIENHRU5fS0VZV09SRCAqa2V5d29yZF90YWJsZTsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotICBjaGFyIGJ1ZlsyNTZdOwotICBjb25zdCBjaGFyICpwLCpzdGFydDsKLQotICBwID0gc3RhcnQgPSAqc3RycDsKLQotICAvKiBBbGxvdyBhbnkgZmlyc3QgY2hhcmFjdGVyLgotICAgICBOb3RlIHRoYXQgdGhpcyBhbGxvd3MgcmVjb2duaXppbmcgIixhIiBmb3IgdGhlIGFubnVsIGZsYWcgaW4gc3BhcmMKLSAgICAgZXZlbiB0aG91Z2ggIiwiIGlzIHN1YnNlcXVlbnRseSBub3QgYSB2YWxpZCBrZXl3b3JkIGNoYXIuICAqLwotICBpZiAoKnApCi0gICAgKytwOwotCi0gIC8qIE5vdyBhbGxvdyBsZXR0ZXJzLCBkaWdpdHMsIGFuZCBfLiAgKi8KLSAgd2hpbGUgKCgocCAtIHN0YXJ0KSA8IChpbnQpIHNpemVvZiAoYnVmKSkKLQkgJiYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJ18nKSkKLSAgICArK3A7Ci0KLSAgaWYgKHAgLSBzdGFydCA+PSAoaW50KSBzaXplb2YgKGJ1ZikpCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBrZXl3b3JkL3JlZ2lzdGVyIG5hbWUiKTsKLQotICBtZW1jcHkgKGJ1Ziwgc3RhcnQsIHAgLSBzdGFydCk7Ci0gIGJ1ZltwIC0gc3RhcnRdID0gMDsKLQotICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfbmFtZSAoa2V5d29yZF90YWJsZSwgYnVmKTsKLQotICBpZiAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0ga2UtPnZhbHVlOwotICAgICAgLyogRG9uJ3QgYWR2YW5jZSBwb2ludGVyIGlmIHdlIHJlY29nbml6ZWQgdGhlIG51bGwga2V5d29yZC4gICovCi0gICAgICBpZiAoa2UtPm5hbWVbMF0gIT0gMCkKLQkqc3RycCA9IHA7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIjsKLX0KLQotLyogUGFyc2UgYSBzbWFsbCBzaWduZWQgaW50ZWdlciBwYXJzZXIuCi0gICA/Pz8gVkFMVUVQIGlzIG5vdCBhIGJmZF92bWEgKiBvbiBwdXJwb3NlLCB0aG91Z2ggdGhpcyBpcyBjb25mdXNpbmcuCi0gICBOb3RlIHRoYXQgaWYgdGhlIGNhbGxlciBleHBlY3RzIGEgYmZkX3ZtYSByZXN1bHQsIGl0IHNob3VsZCBjYWxsCi0gICBjZ2VuX3BhcnNlX2FkZHJlc3MuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0OwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCi0gICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX05PTkUsCi0gICAgICZyZXN1bHQsICZ2YWx1ZSk7Ci0gIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KLSAgaWYgKCFlcnJtc2cpCi0gICAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBQYXJzZSBhIHNtYWxsIHVuc2lnbmVkIGludGVnZXIgcGFyc2VyLgotICAgPz8/IFZBTFVFUCBpcyBub3QgYSBiZmRfdm1hICogb24gcHVycG9zZSwgdGhvdWdoIHRoaXMgaXMgY29uZnVzaW5nLgotICAgTm90ZSB0aGF0IGlmIHRoZSBjYWxsZXIgZXhwZWN0cyBhIGJmZF92bWEgcmVzdWx0LCBpdCBzaG91bGQgY2FsbAotICAgY2dlbl9wYXJzZV9hZGRyZXNzLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0OwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCi0gICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX05PTkUsCi0gICAgICZyZXN1bHQsICZ2YWx1ZSk7Ci0gIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KLSAgaWYgKCFlcnJtc2cpCi0gICAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBBZGRyZXNzIHBhcnNlci4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgb3BpbmZvLCByZXN1bHRwLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgaW50IG9waW5mbzsKLSAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICpyZXN1bHRwOwotICAgICBiZmRfdm1hICp2YWx1ZXA7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0FERFJFU1MsIHN0cnAsIG9waW5kZXgsIG9waW5mbywKLSAgICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHRwICE9IE5VTEwpCi0JKnJlc3VsdHAgPSByZXN1bHRfdHlwZTsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICB9Ci0gIHJldHVybiBlcnJtc2c7Ci19Ci0MCi0vKiBTaWduZWQgaW50ZWdlciB2YWxpZGF0aW9uIHJvdXRpbmUuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fdmFsaWRhdGVfc2lnbmVkX2ludGVnZXIgKHZhbHVlLCBtaW4sIG1heCkKLSAgICAgbG9uZyB2YWx1ZSwgbWluLCBtYXg7Ci17Ci0gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkJICAgICAgdmFsdWUsIG1pbiwgbWF4KTsKLSAgICAgIHJldHVybiBidWY7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVbnNpZ25lZCBpbnRlZ2VyIHZhbGlkYXRpb24gcm91dGluZS4KLSAgIFN1cHBseWluZyBgbWluJyBoZXJlIG1heSBzZWVtIHVubmVjZXNzYXJ5LCBidXQgd2UgYWxzbyB3YW50IHRvIGhhbmRsZQotICAgY2FzZXMgd2hlcmUgbWluICE9IDAgKGFuZCBtYXggPiBMT05HX01BWCkuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fdmFsaWRhdGVfdW5zaWduZWRfaW50ZWdlciAodmFsdWUsIG1pbiwgbWF4KQotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtaW4sIG1heDsKLXsKLSAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuICVsdSBhbmQgJWx1KSIpLAotCSAgICAgICB2YWx1ZSwgbWluLCBtYXgpOwotICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tZGlzLmMgYi9vcGNvZGVzL2NnZW4tZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjFjZDkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jZ2VuLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qIENHRU4gZ2VuZXJpYyBkaXNhc3NlbWJsZXIgc3VwcG9ydCBjb2RlLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2Rpc19oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBJTlNOUy4KLSAgIEVOVFNJWkUgaXMgc2l6ZW9mIChDR0VOX0lCQVNFKSBmb3IgdGhlIHRhcmdldC4KLSAgID8/PyBObyBsb25nZXIgdXNlZCBidXQgbGVhdmUgaW4gZm9yIG5vdy4KLSAgIEhUQUJMRSBwb2ludHMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBIRU5UQlVGIGlzIGEgcG9pbnRlciB0byBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyIG9mIGhhc2ggZW50cmllcy4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5IHRvIHVzZS4KLQotICAgVGhlIHRhYmxlIGlzIHNjYW5uZWQgYmFja3dhcmRzIGFzIGFkZGl0aW9ucyBhcmUgbWFkZSB0byB0aGUgZnJvbnQgb2YgdGhlCi0gICBsaXN0IGFuZCB3ZSB3YW50IGVhcmxpZXIgb25lcyB0byBiZSBwcmVmZXJlZC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fYXJyYXkgKGNkLCBpbnNucywgY291bnQsIGVudHNpemUsIGh0YWJsZSwgaGVudGJ1ZikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbnM7Ci0gICAgIGludCBjb3VudDsKLSAgICAgaW50IGVudHNpemU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqIGh0YWJsZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKiBoZW50YnVmOwotewotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IGNvdW50IC0gMTsgaSA+PSAwOyAtLWksICsraGVudGJ1ZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKLSAgICAgIGNoYXIgYnVmIFs0XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSAmaW5zbnNbaV07Ci0KLSAgICAgIGlmICghICgqIGNkLT5kaXNfaGFzaF9wKSAoaW5zbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgdGFyZ2V0IHVzZXMgdGhlIGJ1ZmZlciBvciB0aGUgYmFzZSBpbnNuCi0JIHRvIGhhc2ggb24sIHNvIHNldCBib3RoIHVwLiAgKi8KLQotICAgICAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbik7Ci0gICAgICBzd2l0Y2ggKENHRU5fSU5TTl9NQVNLX0JJVFNJWkUgKGluc24pKQotCXsKLQljYXNlIDg6Ci0JICBidWZbMF0gPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMTY6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JY2FzZSAzMjoKLQkgIGlmIChiaWdfcCkKLQkgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgZWxzZQotCSAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGluc247Ci0gICAgICBodGFibGVbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9kaXNfaGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBoYXNoX2luc25fYXJyYXkgZXhjZXB0IHRoZSBpbnNucyBhcmUKLSAgIGluIGEgbGlzdC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fbGlzdCAoY2QsIGluc25zLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuczsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbGlzdDsKLQotICBmb3IgKGlsaXN0ID0gaW5zbnM7IGlsaXN0ICE9IE5VTEw7IGlsaXN0ID0gaWxpc3QtPm5leHQsICsrIGhlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjaGFyIGJ1Zls0XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLSAgICAgIGlmICghICgqIGNkLT5kaXNfaGFzaF9wKSAoaWxpc3QtPmluc24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHRhcmdldCB1c2VzIHRoZSBidWZmZXIgb3IgdGhlIGJhc2UgaW5zbgotCSB0byBoYXNoIG9uLCBzbyBzZXQgYm90aCB1cC4gICovCi0KLSAgICAgIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGlsaXN0LT5pbnNuKTsKLSAgICAgIHN3aXRjaCAoQ0dFTl9JTlNOX01BU0tfQklUU0laRSAoaWxpc3QtPmluc24pKQotCXsKLQljYXNlIDg6Ci0JICBidWZbMF0gPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMTY6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JY2FzZSAzMjoKLQkgIGlmIChiaWdfcCkKLQkgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgZWxzZQotCSAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlIFtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbGlzdC0+aW5zbjsKLSAgICAgIGh0YWJsZSBbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogQnVpbGQgdGhlIGRpc2Fzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2Rpc19oYXNoX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGNvdW50ID0gY2dlbl9pbnNuX2NvdW50IChjZCkgKyBjZ2VuX21hY3JvX2luc25fY291bnQgKGNkKTsKLSAgQ0dFTl9JTlNOX1RBQkxFICppbnNuX3RhYmxlID0gJiBjZC0+aW5zbl90YWJsZTsKLSAgQ0dFTl9JTlNOX1RBQkxFICptYWNyb19pbnNuX3RhYmxlID0gJiBjZC0+bWFjcm9faW5zbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IGhhc2hfc2l6ZSA9IGNkLT5kaXNfaGFzaF9zaXplOwotICBDR0VOX0lOU05fTElTVCAqaGFzaF9lbnRyeV9idWY7Ci0gIENHRU5fSU5TTl9MSVNUICoqZGlzX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICpkaXNfaGFzaF90YWJsZV9lbnRyaWVzOwotCi0gIC8qIFRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLSAgICAgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBoYXNoIGxpc3RzLiAgKi8KLQotICBkaXNfaGFzaF90YWJsZSA9IChDR0VOX0lOU05fTElTVCAqKikKLSAgICB4bWFsbG9jIChoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgbWVtc2V0IChkaXNfaGFzaF90YWJsZSwgMCwgaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIGRpc19oYXNoX3RhYmxlX2VudHJpZXMgPSBoYXNoX2VudHJ5X2J1ZiA9IChDR0VOX0lOU05fTElTVCAqKQotICAgIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCkpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBpbnNucy4KLSAgICAgRG9uJ3QgaW5jbHVkZSB0aGUgZmlyc3Qgb25lIGFzIGl0IGlzIGEgcmVzZXJ2ZWQgZW50cnkuICAqLwotICAvKiA/Pz8gSXQgd2FzIHRoZSBlbmQgb2YgYWxsIGhhc2ggY2hhaW5zLCBhbmQgYWxzbyB0aGUgc3BlY2lhbAotICAgICAiaW52YWxpZCBpbnNuIiBtYXJrZXIuICBNYXkgYmUgYWJsZSB0byBkbyBpdCBkaWZmZXJlbnRseSBub3cuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwKLQkJCQkgICAgaW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzICsgMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcyAtIDEsCi0JCQkJICAgIGluc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsIG1hY3JvX2luc25fdGFibGUtPmluaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBpbnNucy4KLSAgICAgTGF0ZXIgYWRkZWQgaW5zbnMgd2lsbCBiZSBwcmVmZXJlZCBvdmVyIGVhcmxpZXIgb25lcy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fbGlzdCAoY2QsIGluc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkJCSAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfaW5zbl9saXN0IChjZCwgbWFjcm9faW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCSAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICBjZC0+ZGlzX2hhc2hfdGFibGUgPSBkaXNfaGFzaF90YWJsZTsKLSAgY2QtPmRpc19oYXNoX3RhYmxlX2VudHJpZXMgPSBkaXNfaGFzaF90YWJsZV9lbnRyaWVzOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBoYXNoIGxpc3QgZm9yIElOU04uICAqLwotCi1DR0VOX0lOU05fTElTVCAqCi1jZ2VuX2Rpc19sb29rdXBfaW5zbiAoY2QsIGJ1ZiwgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChjZC0+ZGlzX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9kaXNfaGFzaF90YWJsZSAoY2QpOwotCi0gIGhhc2ggPSAoKiBjZC0+ZGlzX2hhc2gpIChidWYsIHZhbHVlKTsKLQotICByZXR1cm4gY2QtPmRpc19oYXNoX3RhYmxlW2hhc2hdOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLW9wYy5jIGIvb3Bjb2Rlcy9jZ2VuLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg0MGE2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgb3Bjb2RlIHN1cHBvcnQuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX2tleXdvcmRfbmFtZQotICBQQVJBTVMgKChjb25zdCBDR0VOX0tFWVdPUkQgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9rZXl3b3JkX3ZhbHVlCi0gIFBBUkFNUyAoKGNvbnN0IENHRU5fS0VZV09SRCAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICopKTsKLQotLyogUmV0dXJuIG51bWJlciBvZiBoYXNoIHRhYmxlIGVudHJpZXMgdG8gdXNlIGZvciBOIGVsZW1lbnRzLiAgKi8KLSNkZWZpbmUgS0VZV09SRF9IQVNIX1NJWkUobikgKChuKSA8PSAzMSA/IDE3IDogMzEpCi0KLS8qIExvb2sgdXAgKk5BTUVQIGluIHRoZSBrZXl3b3JkIHRhYmxlIEtULgotICAgVGhlIHJlc3VsdCBpcyB0aGUga2V5d29yZCBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqCi1jZ2VuX2tleXdvcmRfbG9va3VwX25hbWUgKGt0LCBuYW1lKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotICBjb25zdCBjaGFyICpwLCpuOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGtlID0ga3QtPm5hbWVfaGFzaF90YWJsZVtoYXNoX2tleXdvcmRfbmFtZSAoa3QsIG5hbWUsIDApXTsKLQotICAvKiBXZSBkbyBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb25zLgotICAgICBJZiB0aGF0IGV2ZXIgYmVjb21lcyBhIHByb2JsZW0sIGFkZCBhbiBhdHRyaWJ1dGUgdGhhdCBkZW5vdGVzCi0gICAgICJkbyBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29ucyIuICAqLwotCi0gIHdoaWxlIChrZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIG4gPSBuYW1lOwotICAgICAgcCA9IGtlLT5uYW1lOwotCi0gICAgICB3aGlsZSAoKnAKLQkgICAgICYmICgqcCA9PSAqbgotCQkgfHwgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSAqcCkKLQkJICAgICAmJiAodG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpwKQotCQkJID09IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqbikpKSkpCi0JKytuLCArK3A7Ci0KLSAgICAgIGlmICghKnAgJiYgISpuKQotCXJldHVybiBrZTsKLQotICAgICAga2UgPSBrZS0+bmV4dF9uYW1lOwotICAgIH0KLQotICBpZiAoa3QtPm51bGxfZW50cnkpCi0gICAgcmV0dXJuIGt0LT5udWxsX2VudHJ5OwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogTG9vayB1cCBWQUxVRSBpbiB0aGUga2V5d29yZCB0YWJsZSBLVC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGtleXdvcmQgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa3QsIHZhbHVlKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci0KLSAgaWYgKGt0LT5uYW1lX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCk7Ci0KLSAga2UgPSBrdC0+dmFsdWVfaGFzaF90YWJsZVtoYXNoX2tleXdvcmRfdmFsdWUgKGt0LCB2YWx1ZSldOwotCi0gIHdoaWxlIChrZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBrZS0+dmFsdWUpCi0JcmV0dXJuIGtlOwotICAgICAga2UgPSBrZS0+bmV4dF92YWx1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFkZCBhbiBlbnRyeSB0byBhIGtleXdvcmQgdGFibGUuICAqLwotCi12b2lkCi1jZ2VuX2tleXdvcmRfYWRkIChrdCwga2UpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGhhc2ggPSBoYXNoX2tleXdvcmRfbmFtZSAoa3QsIGtlLT5uYW1lLCAwKTsKLSAga2UtPm5leHRfbmFtZSA9IGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF07Ci0gIGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF0gPSBrZTsKLQotICBoYXNoID0gaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwga2UtPnZhbHVlKTsKLSAga2UtPm5leHRfdmFsdWUgPSBrdC0+dmFsdWVfaGFzaF90YWJsZVtoYXNoXTsKLSAga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF0gPSBrZTsKLQotICBpZiAoa2UtPm5hbWVbMF0gPT0gMCkKLSAgICBrdC0+bnVsbF9lbnRyeSA9IGtlOwotfQotCi0vKiBGSVhNRTogTmVlZCBmdW5jdGlvbiB0byByZXR1cm4gY291bnQgb2Yga2V5d29yZHMuICAqLwotCi0vKiBJbml0aWFsaXplIGEga2V5d29yZCB0YWJsZSBzZWFyY2guCi0gICBTUEVDIGlzIGEgc3BlY2lmaWNhdGlvbiBvZiB3aGF0IHRvIHNlYXJjaCBmb3IuCi0gICBBIHZhbHVlIG9mIE5VTEwgbWVhbnMgdG8gZmluZCBldmVyeSBrZXl3b3JkLgotICAgQ3VycmVudGx5IE5VTEwgaXMgdGhlIG9ubHkgYWNjZXB0YWJsZSB2YWx1ZSBbZnVydGhlciBzcGVjaWZpY2F0aW9uCi0gICBkZWZlcnJlZF0uCi0gICBUaGUgcmVzdWx0IGlzIGFuIG9wYXF1ZSBkYXRhIGl0ZW0gdXNlZCB0byByZWNvcmQgdGhlIHNlYXJjaCBzdGF0dXMuCi0gICBJdCBpcyBwYXNzZWQgdG8gZWFjaCBjYWxsIHRvIGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dC4gICovCi0KLUNHRU5fS0VZV09SRF9TRUFSQ0gKLWNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdCAoa3QsIHNwZWMpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNwZWM7Ci17Ci0gIENHRU5fS0VZV09SRF9TRUFSQ0ggc2VhcmNoOwotCi0gIC8qIEZJWE1FOiBOZWVkIHRvIHNwZWNpZnkgZm9ybWF0IG9mIFBBUkFNUy4gICovCi0gIGlmIChzcGVjICE9IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGt0LT5uYW1lX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCk7Ci0KLSAgc2VhcmNoLnRhYmxlID0ga3Q7Ci0gIHNlYXJjaC5zcGVjID0gc3BlYzsKLSAgc2VhcmNoLmN1cnJlbnRfaGFzaCA9IDA7Ci0gIHNlYXJjaC5jdXJyZW50X2VudHJ5ID0gTlVMTDsKLSAgcmV0dXJuIHNlYXJjaDsKLX0KLQotLyogUmV0dXJuIHRoZSBuZXh0IGtleXdvcmQgc3BlY2lmaWVkIGJ5IFNFQVJDSC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIG5leHQgZW50cnkgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm8gbW9yZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqCi1jZ2VuX2tleXdvcmRfc2VhcmNoX25leHQgKHNlYXJjaCkKLSAgICAgQ0dFTl9LRVlXT1JEX1NFQVJDSCAqc2VhcmNoOwotewotICAvKiBIYXMgc2VhcmNoIGZpbmlzaGVkPyAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9oYXNoID09IHNlYXJjaC0+dGFibGUtPmhhc2hfdGFibGVfc2l6ZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTZWFyY2ggaW4gcHJvZ3Jlc3M/ICAqLwotICBpZiAoc2VhcmNoLT5jdXJyZW50X2VudHJ5ICE9IE5VTEwKLSAgICAgIC8qIEFueXRoaW5nIGxlZnQgb24gdGhpcyBoYXNoIGNoYWluPyAgKi8KLSAgICAgICYmIHNlYXJjaC0+Y3VycmVudF9lbnRyeS0+bmV4dF9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgc2VhcmNoLT5jdXJyZW50X2VudHJ5ID0gc2VhcmNoLT5jdXJyZW50X2VudHJ5LT5uZXh0X25hbWU7Ci0gICAgICByZXR1cm4gc2VhcmNoLT5jdXJyZW50X2VudHJ5OwotICAgIH0KLQotICAvKiBNb3ZlIHRvIG5leHQgaGFzaCBjaGFpbiBbdW5sZXNzIHdlIGhhdmVuJ3Qgc3RhcnRlZCB5ZXRdLiAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMKQotICAgICsrc2VhcmNoLT5jdXJyZW50X2hhc2g7Ci0KLSAgd2hpbGUgKHNlYXJjaC0+Y3VycmVudF9oYXNoIDwgc2VhcmNoLT50YWJsZS0+aGFzaF90YWJsZV9zaXplKQotICAgIHsKLSAgICAgIHNlYXJjaC0+Y3VycmVudF9lbnRyeSA9IHNlYXJjaC0+dGFibGUtPm5hbWVfaGFzaF90YWJsZVtzZWFyY2gtPmN1cnJlbnRfaGFzaF07Ci0gICAgICBpZiAoc2VhcmNoLT5jdXJyZW50X2VudHJ5ICE9IE5VTEwpCi0JcmV0dXJuIHNlYXJjaC0+Y3VycmVudF9lbnRyeTsKLSAgICAgICsrc2VhcmNoLT5jdXJyZW50X2hhc2g7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXR1cm4gZmlyc3QgZW50cnkgaW4gaGFzaCBjaGFpbiBmb3IgTkFNRS4KLSAgIElmIENBU0VfU0VOU0lUSVZFX1AgaXMgbm9uLXplcm8sIHJldHVybiBhIGNhc2Ugc2Vuc2l0aXZlIGhhc2guICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1oYXNoX2tleXdvcmRfbmFtZSAoa3QsIG5hbWUsIGNhc2Vfc2Vuc2l0aXZlX3ApCi0gICAgIGNvbnN0IENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBjYXNlX3NlbnNpdGl2ZV9wOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoY2FzZV9zZW5zaXRpdmVfcCkKLSAgICBmb3IgKGhhc2ggPSAwOyAqbmFtZTsgKytuYW1lKQotICAgICAgaGFzaCA9IChoYXNoICogOTcpICsgKHVuc2lnbmVkIGNoYXIpICpuYW1lOwotICBlbHNlCi0gICAgZm9yIChoYXNoID0gMDsgKm5hbWU7ICsrbmFtZSkKLSAgICAgIGhhc2ggPSAoaGFzaCAqIDk3KSArICh1bnNpZ25lZCBjaGFyKSB0b2xvd2VyICgqbmFtZSk7Ci0gIHJldHVybiBoYXNoICUga3QtPmhhc2hfdGFibGVfc2l6ZTsKLX0KLQotLyogUmV0dXJuIGZpcnN0IGVudHJ5IGluIGhhc2ggY2hhaW4gZm9yIFZBTFVFLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwgdmFsdWUpCi0gICAgIGNvbnN0IENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIHZhbHVlICUga3QtPmhhc2hfdGFibGVfc2l6ZTsKLX0KLQotLyogQnVpbGQgYSBrZXl3b3JkIHRhYmxlJ3MgaGFzaCB0YWJsZXMuCi0gICBXZSBwcm9iYWJseSBuZWVkbid0IGJ1aWxkIHRoZSB2YWx1ZSBoYXNoIHRhYmxlIGZvciB0aGUgYXNzZW1ibGVyIHdoZW4KLSAgIHdlJ3JlIHVzaW5nIHRoZSBkaXNhc3NlbWJsZXIsIGJ1dCB3ZSBrZWVwIHRoaW5ncyBzaW1wbGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci17Ci0gIGludCBpOwotICAvKiBVc2UgdGhlIG51bWJlciBvZiBjb21waWxlZCBpbiBlbnRyaWVzIGFzIGFuIGVzdGltYXRlIGZvciB0aGUKLSAgICAgdHlwaWNhbCBzaXplZCB0YWJsZSBbbm90IHRvbyBtYW55IGFkZGVkIGF0IHJ1bnRpbWVdLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemUgPSBLRVlXT1JEX0hBU0hfU0laRSAoa3QtPm51bV9pbml0X2VudHJpZXMpOwotCi0gIGt0LT5oYXNoX3RhYmxlX3NpemUgPSBzaXplOwotICBrdC0+bmFtZV9oYXNoX3RhYmxlID0gKENHRU5fS0VZV09SRF9FTlRSWSAqKikKLSAgICB4bWFsbG9jIChzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBtZW1zZXQgKGt0LT5uYW1lX2hhc2hfdGFibGUsIDAsIHNpemUgKiBzaXplb2YgKENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0gIGt0LT52YWx1ZV9oYXNoX3RhYmxlID0gKENHRU5fS0VZV09SRF9FTlRSWSAqKikKLSAgICB4bWFsbG9jIChzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBtZW1zZXQgKGt0LT52YWx1ZV9oYXNoX3RhYmxlLCAwLCBzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotCi0gIC8qIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyB3ZSB3YW50IGtleXdvcmRzIGFwcGVhcmluZyBlYXJsaWVyIHRvCi0gICAgIGJlIHByZWZlcmVkIG92ZXIgbGF0ZXIgb25lcy4gICovCi0gIGZvciAoaSA9IGt0LT5udW1faW5pdF9lbnRyaWVzIC0gMTsgaSA+PSAwOyAtLWkpCi0gICAgY2dlbl9rZXl3b3JkX2FkZCAoa3QsICZrdC0+aW5pdF9lbnRyaWVzW2ldKTsKLX0KLQwKLS8qIEhhcmR3YXJlIHN1cHBvcnQuICAqLwotCi0vKiBMb29rdXAgYSBoYXJkd2FyZSBlbGVtZW50IGJ5IGl0cyBuYW1lLgotICAgUmV0dXJucyBOVUxMIGlmIE5BTUUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgKgotY2dlbl9od19sb29rdXBfYnlfbmFtZSAoY2QsIG5hbWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqaHcgPSBjZC0+aHdfdGFibGUuZW50cmllczsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKGh3W2ldICYmIHN0cmNtcCAobmFtZSwgaHdbaV0tPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gaHdbaV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2t1cCBhIGhhcmR3YXJlIGVsZW1lbnQgYnkgaXRzIG51bWJlci4KLSAgIEhhcmR3YXJlIGVsZW1lbnRzIGFyZSBlbnVtZXJhdGVkLCBob3dldmVyIGl0IG1heSBiZSBwb3NzaWJsZSB0byBhZGQgc29tZQotICAgYXQgcnVudGltZSwgdGh1cyBIV05VTSBpcyBub3QgYW4gZW51bSB0eXBlIGJ1dCByYXRoZXIgYW4gaW50LgotICAgUmV0dXJucyBOVUxMIGlmIEhXTlVNIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYWNoLiAgKi8KLQotY29uc3QgQ0dFTl9IV19FTlRSWSAqCi1jZ2VuX2h3X2xvb2t1cF9ieV9udW0gKGNkLCBod251bSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IGh3bnVtOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmh3ID0gY2QtPmh3X3RhYmxlLmVudHJpZXM7Ci0KLSAgLyogPz8/IFRoaXMgY2FuIGJlIHNwZWVkZWQgdXAuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKGh3W2ldICYmIGh3bnVtID09IGh3W2ldLT50eXBlKQotICAgICAgcmV0dXJuIGh3W2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogT3BlcmFuZCBzdXBwb3J0LiAgKi8KLQotLyogTG9va3VwIGFuIG9wZXJhbmQgYnkgaXRzIG5hbWUuCi0gICBSZXR1cm5zIE5VTEwgaWYgTkFNRSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgIG1hY2gvaXNhLiAgKi8KLQotY29uc3QgQ0dFTl9PUEVSQU5EICoKLWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZSAoY2QsIG5hbWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX09QRVJBTkQgKipvcCA9IGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKG9wW2ldICYmIHN0cmNtcCAobmFtZSwgb3BbaV0tPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gb3BbaV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2t1cCBhbiBvcGVyYW5kIGJ5IGl0cyBudW1iZXIuCi0gICBPcGVyYW5kcyBhcmUgZW51bWVyYXRlZCwgaG93ZXZlciBpdCBtYXkgYmUgcG9zc2libGUgdG8gYWRkIHNvbWUKLSAgIGF0IHJ1bnRpbWUsIHRodXMgT1BOVU0gaXMgbm90IGFuIGVudW0gdHlwZSBidXQgcmF0aGVyIGFuIGludC4KLSAgIFJldHVybnMgTlVMTCBpZiBPUE5VTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgIG1hY2gvaXNhLiAgKi8KLQotY29uc3QgQ0dFTl9PUEVSQU5EICoKLWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChjZCwgb3BudW0pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcG51bTsKLXsKLSAgcmV0dXJuIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXNbb3BudW1dOwotfQotDAotLyogSW5zdHJ1Y3Rpb24gc3VwcG9ydC4gICovCi0KLS8qIFJldHVybiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpbmNsdWRlcyBhbnkgYWRkZWQgYXQgcnVudGltZS4gICovCi0KLWludAotY2dlbl9pbnNuX2NvdW50IChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGNvdW50ID0gY2QtPmluc25fdGFibGUubnVtX2luaXRfZW50cmllczsKLSAgQ0dFTl9JTlNOX0xJU1QgKnJ0X2luc25zID0gY2QtPmluc25fdGFibGUubmV3X2VudHJpZXM7Ci0KLSAgZm9yICggOyBydF9pbnNucyAhPSBOVUxMOyBydF9pbnNucyA9IHJ0X2luc25zLT5uZXh0KQotICAgICsrY291bnQ7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIG1hY3JvLWluc3RydWN0aW9ucy4KLSAgIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotCi1pbnQKLWNnZW5fbWFjcm9faW5zbl9jb3VudCAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpydF9pbnNucyA9IGNkLT5tYWNyb19pbnNuX3RhYmxlLm5ld19lbnRyaWVzOwotCi0gIGZvciAoIDsgcnRfaW5zbnMgIT0gTlVMTDsgcnRfaW5zbnMgPSBydF9pbnNucy0+bmV4dCkKLSAgICArK2NvdW50OwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gcmVhZCBhbmQgcHJvcGVybHkgYnl0ZXN3YXAgYW4gaW5zbiB2YWx1ZS4gICovCi0KLUNHRU5fSU5TTl9JTlQKLWNnZW5fZ2V0X2luc25fdmFsdWUgKGNkLCBidWYsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIHN3aXRjaCAobGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB2YWx1ZSA9ICpidWY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JdmFsdWUgPSBiZmRfZ2V0YjE2IChidWYpOwotICAgICAgZWxzZQotCXZhbHVlID0gYmZkX2dldGwxNiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQl2YWx1ZSA9IGJmZF9nZXRiMzIgKGJ1Zik7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSBiZmRfZ2V0bDMyIChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIHN0b3JlIGFuIGluc24gdmFsdWUgcHJvcGVybHkgYnl0ZXN3YXBwZWQuICAqLwotCi12b2lkCi1jZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHN3aXRjaCAobGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICBidWZbMF0gPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQliZmRfcHV0YjE2ICh2YWx1ZSwgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDE2ICh2YWx1ZSwgYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQliZmRfcHV0YjMyICh2YWx1ZSwgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICh2YWx1ZSwgYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0MCi0vKiBMb29rIHVwIGluc3RydWN0aW9uIElOU05fKl9WQUxVRSBhbmQgZXh0cmFjdCBpdHMgZmllbGRzLgotICAgSU5TTl9JTlRfVkFMVUUgaXMgdXNlZCBpZiBDR0VOX0lOVF9JTlNOX1AuCi0gICBPdGhlcndpc2UgSU5TTl9CWVRFU19WQUxVRSBpcyB1c2VkLgotICAgSU5TTiwgaWYgbm9uLW51bGwsIGlzIHRoZSBpbnNuIHRhYmxlIGVudHJ5LgotICAgT3RoZXJ3aXNlIElOU05fKl9WQUxVRSBpcyBleGFtaW5lZCB0byBjb21wdXRlIGl0LgotICAgTEVOR1RIIGlzIHRoZSBiaXQgbGVuZ3RoIG9mIElOU05fKl9WQUxVRSBpZiBrbm93biwgb3RoZXJ3aXNlIDAuCi0gICAwIGlzIG9ubHkgdmFsaWQgaWYgYGluc24gPT0gTlVMTCAmJiAhIENHRU5fSU5UX0lOU05fUCcuCi0gICBJZiBJTlNOICE9IE5VTEwsIExFTkdUSCBtdXN0IGJlIHZhbGlkLgotICAgQUxJQVNfUCBpcyBub24temVybyBpZiBhbGlhcyBpbnNucyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaC4KLQotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGluc24gdGFibGUgZW50cnksIG9yIE5VTEwgaWYgdGhlIGluc3RydWN0aW9uCi0gICB3YXNuJ3QgcmVjb2duaXplZC4gICovCi0KLS8qID8/PyBXaWxsIG5lZWQgdG8gYmUgcmV2aXNpdGVkIGZvciBWTElXIGFyY2hpdGVjdHVyZXMuICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotY2dlbl9sb29rdXBfaW5zbiAoY2QsIGluc24sIGluc25faW50X3ZhbHVlLCBpbnNuX2J5dGVzX3ZhbHVlLCBsZW5ndGgsIGZpZWxkcywKLQkJICBhbGlhc19wKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl9pbnRfdmFsdWU7Ci0gICAgIC8qID8/PyBDR0VOX0lOU05fQllURVMgd291bGQgYmUgYSBuaWNlIHR5cGUgbmFtZSB0byB1c2UgaGVyZS4gICovCi0gICAgIHVuc2lnbmVkIGNoYXIgKmluc25fYnl0ZXNfdmFsdWU7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBhbGlhc19wOwotewotICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gIENHRU5fSU5TTl9JTlQgYmFzZV9pbnNuOwotICBDR0VOX0VYVFJBQ1RfSU5GTyBleF9pbmZvOwotICBDR0VOX0VYVFJBQ1RfSU5GTyAqaW5mbzsKLQotICBpZiAoY2QtPmludF9pbnNuX3ApCi0gICAgewotICAgICAgaW5mbyA9IE5VTEw7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBhbGxvY2EgKGNkLT5tYXhfaW5zbl9iaXRzaXplIC8gOCk7Ci0gICAgICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgsIGluc25faW50X3ZhbHVlKTsKLSAgICAgIGJhc2VfaW5zbiA9IGluc25faW50X3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluZm8gPSAmZXhfaW5mbzsKLSAgICAgIGV4X2luZm8uZGlzX2luZm8gPSBOVUxMOwotICAgICAgZXhfaW5mby5pbnNuX2J5dGVzID0gaW5zbl9ieXRlc192YWx1ZTsKLSAgICAgIGV4X2luZm8udmFsaWQgPSAtMTsKLSAgICAgIGJ1ZiA9IGluc25fYnl0ZXNfdmFsdWU7Ci0gICAgICBiYXNlX2luc24gPSBjZ2VuX2dldF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgpOwotICAgIH0KLQotICBpZiAoIWluc24pCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2ggbGlzdHMuCi0JIFBpY2sgdGhlIGZpcnN0IG9uZSBhbmQga2VlcCB0cnlpbmcgdW50aWwgd2UgZmluZCB0aGUgcmlnaHQgb25lLiAgKi8KLQotICAgICAgaW5zbl9saXN0ID0gY2dlbl9kaXNfbG9va3VwX2luc24gKGNkLCBidWYsIGJhc2VfaW5zbik7Ci0gICAgICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0JewotCSAgaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKLQotCSAgaWYgKGFsaWFzX3AKLQkgICAgICAvKiBGSVhNRTogRW5zdXJlIEFMSUFTIGF0dHJpYnV0ZSBhbHdheXMgaGFzIHNhbWUgaW5kZXguICAqLwotCSAgICAgIHx8ICEgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9BTElBUykpCi0JICAgIHsKLQkgICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotCSAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUKLQkJIGV4dHJhY3QgaGFuZGxlci4gICovCi0JICAgICAgaWYgKChiYXNlX2luc24gJiBDR0VOX0lOU05fQkFTRV9NQVNLIChpbnNuKSkKLQkJICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JCXsKLQkJICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLQkJICBpbnQgZWxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JCSAgICAoY2QsIGluc24sIGluZm8sIGJhc2VfaW5zbiwgZmllbGRzLCAoYmZkX3ZtYSkgMCk7Ci0JCSAgaWYgKGVsZW5ndGggPiAwKQotCQkgICAgewotCQkgICAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLQkJICAgICAgaWYgKGxlbmd0aCAhPSAwICYmIGxlbmd0aCAhPSBlbGVuZ3RoKQotCQkJYWJvcnQgKCk7Ci0JCSAgICAgIHJldHVybiBpbnNuOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaW5zbl9saXN0ID0gaW5zbl9saXN0LT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IGNhbid0IHBhc3MgYW4gYWxpYXMgaW5zbiBpZiAhIGFsaWFzX3AuICAqLwotICAgICAgaWYgKCEgYWxpYXNfcAotCSAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9BTElBUykpCi0JYWJvcnQgKCk7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IGxlbmd0aCBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgaWYgKGxlbmd0aCAhPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbikpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotICAgICAgbGVuZ3RoID0gQ0dFTl9FWFRSQUNUX0ZOIChjZCwgaW5zbikKLQkoY2QsIGluc24sIGluZm8sIGJhc2VfaW5zbiwgZmllbGRzLCAoYmZkX3ZtYSkgMCk7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IG11c3Qgc3VjY2VlZC4KLQkgQ291bGQgcmVsYXggdGhpcyBsYXRlciBpZiBpdCBldmVyIHByb3ZlcyB1c2VmdWwuICAqLwotICAgICAgaWYgKGxlbmd0aCA9PSAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIGluc247Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBGaWxsIGluIHRoZSBvcGVyYW5kIGluc3RhbmNlcyB1c2VkIGJ5IElOU04gd2hvc2Ugb3BlcmFuZHMgYXJlIEZJRUxEUy4KLSAgIElORElDRVMgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIG9mIE1BWF9PUEVSQU5EX0lOU1RBTkNFUyBpbnRzIHRvIGJlIGZpbGxlZAotICAgaW4uICAqLwotCi12b2lkCi1jZ2VuX2dldF9pbnNuX29wZXJhbmRzIChjZCwgaW5zbiwgZmllbGRzLCBpbmRpY2VzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCAqaW5kaWNlczsKLXsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKm9waW5zdDsKLSAgaW50IGk7Ci0KLSAgaWYgKGluc24tPm9waW5zdCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotICBmb3IgKGkgPSAwLCBvcGluc3QgPSBpbnNuLT5vcGluc3Q7IG9waW5zdC0+dHlwZSAhPSBDR0VOX09QSU5TVF9FTkQ7ICsraSwgKytvcGluc3QpCi0gICAgewotICAgICAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSBvcF90eXBlID0gb3BpbnN0LT5vcF90eXBlOwotICAgICAgaWYgKG9wX3R5cGUgPT0gQ0dFTl9PUEVSQU5EX05JTCkKLQlpbmRpY2VzW2ldID0gb3BpbnN0LT5pbmRleDsKLSAgICAgIGVsc2UKLQlpbmRpY2VzW2ldID0gKCpjZC0+Z2V0X2ludF9vcGVyYW5kKSAoY2QsIG9wX3R5cGUsIGZpZWxkcyk7Ci0gICAgfQotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byBjZ2VuX2dldF9pbnNuX29wZXJhbmRzIHdoZW4gZWl0aGVyIElOU04gb3IgRklFTERTCi0gICBpc24ndCBrbm93bi4KLSAgIFRoZSBJTlNOLCBJTlNOXypfVkFMVUUsIGFuZCBMRU5HVEggYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8KLSAgIGNnZW5fbG9va3VwX2luc24gdW5jaGFuZ2VkLgotICAgSU5TTl9JTlRfVkFMVUUgaXMgdXNlZCBpZiBDR0VOX0lOVF9JTlNOX1AuCi0gICBPdGhlcndpc2UgSU5TTl9CWVRFU19WQUxVRSBpcyB1c2VkLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBpbnNuIHRhYmxlIGVudHJ5IG9yIE5VTEwgaWYgdGhlIGluc3RydWN0aW9uIHdhc24ndAotICAgcmVjb2duaXplZC4gICovCi0KLWNvbnN0IENHRU5fSU5TTiAqCi1jZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyAoY2QsIGluc24sIGluc25faW50X3ZhbHVlLCBpbnNuX2J5dGVzX3ZhbHVlLAotCQkJICAgICAgIGxlbmd0aCwgaW5kaWNlcywgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl9pbnRfdmFsdWU7Ci0gICAgIC8qID8/PyBDR0VOX0lOU05fQllURVMgd291bGQgYmUgYSBuaWNlIHR5cGUgbmFtZSB0byB1c2UgaGVyZS4gICovCi0gICAgIHVuc2lnbmVkIGNoYXIgKmluc25fYnl0ZXNfdmFsdWU7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIGludCAqaW5kaWNlczsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLXsKLSAgLyogUGFzcyBub24temVybyBmb3IgQUxJQVNfUCBvbmx5IGlmIElOU04gIT0gTlVMTC4KLSAgICAgSWYgSU5TTiA9PSBOVUxMLCB3ZSB3YW50IGEgcmVhbCBpbnNuLiAgKi8KLSAgaW5zbiA9IGNnZW5fbG9va3VwX2luc24gKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwKLQkJCSAgIGxlbmd0aCwgZmllbGRzLCBpbnNuICE9IE5VTEwpOwotICBpZiAoISBpbnNuKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNnZW5fZ2V0X2luc25fb3BlcmFuZHMgKGNkLCBpbnNuLCBmaWVsZHMsIGluZGljZXMpOwotICByZXR1cm4gaW5zbjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlnLmluIGIvb3Bjb2Rlcy9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MGEzMjEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlIGIvb3Bjb2Rlcy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxY2ZmMTIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NzU0ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNnZW4tbWFpbnRbPWRpcl0gICAgYnVpbGQgY2dlbiBnZW5lcmF0ZWQgZmlsZXMiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPXo4ay1kaXMuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTY6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE3OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MzU6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NzM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDc4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MTU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjA6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjgyOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4ODA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotCi0jIFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBuYW1lIG9mIGFueSBzaGFyZWQKLSMgbGlicmFyeS4gIEZvciB1c2VyIGNvbnZlbmllbmNlLCB3ZSBhbHdheXMgdXNlIHRoZSBzYW1lIHZlcnNpb24KLSMgbnVtYmVyIHRoYXQgQkZEIGlzIHVzaW5nLgotQkZEX1ZFUlNJT049YGdyZXAgSU5JVF9BVVRPTUFLRSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5pbiB8IHNlZCAtbiAtZSAncy9bIAldLy9nJyAtZSAncy9eLiosXCguKlwpKS4qJC9cMS9wJ2AKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MTg6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTcxOiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjg6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPW9wY29kZXMKLQotVkVSU0lPTj0ke0JGRF9WRVJTSU9OfQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNzQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTAwOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI2OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIxMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzU4OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODI6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM4NTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MjE6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0Mzc6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDc1OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTM4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQyOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDA6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1MjogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjc4OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTcxNCAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcxNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzM2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODAzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Mzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIG9wY29kZXMgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi0KLQotCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA0OTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwODg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDU6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjExMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEzNjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjUzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjg1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMjk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzI3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzMjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzYwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzOTQ6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ0OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ3NDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ4NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTA0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1Nzg6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU4MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NTM6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2Njc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjkzOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MjY6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjczMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc2MTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc3MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3OTQ6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg1OTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODg5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk0NDogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTk2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAwMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAwNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDM1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwODg6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwOTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjY0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM2MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MjM6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDU2OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NzY6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ5NTogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTA1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUyMjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NTA6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU4NTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NTk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcxNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzc4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODU2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk4MjogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAxMDogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotLiAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDk3OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLWZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE1NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxNTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQxNjQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotdXNpbmdfY2dlbj1ubwotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9iZmQgLWxiZmQgLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiIKLSAgZmkKLSAgOzsKLWVzYWMKLQotCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1zZWxhcmNocz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIiA7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvLi4vYmZkL2NvbmZpZy5iZmQKLQlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgotICAgIGZpCi1kb25lCQotCi0jIFV0aWxpdHkgdmFyLCBkb2N1bWVudHMgZ2VuZXJpYyBjZ2VuIHN1cHBvcnQgZmlsZXMuCi0KLWNnZW5fZmlsZXM9ImNnZW4tb3BjLmxvIGNnZW4tYXNtLmxvIGNnZW4tZGlzLmxvIgotCi0jIFdlIGRvbid0IGRvIGFueSBsaW5rcyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHN5c3RlbSwganVzdCBtYWtlZmlsZSBjb25maWcuCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geGZhbHNlIDsgdGhlbgotCi0gICAgIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotICAgIHRhPQotCi0gICAgZm9yIGFyY2ggaW4gJHNlbGFyY2hzCi0gICAgZG8KLQlhZD1gZWNobyAkYXJjaCB8IHNlZCAtZSBzL2JmZF8vL2cgLWUgcy9fYXJjaC8vZ2AKLQlhcmNoZGVmcz0iJGFyY2hkZWZzIC1EQVJDSF8kYWQiCi0JY2FzZSAiJGFyY2giIGluCi0JYmZkX2EyOWtfYXJjaCkJCXRhPSIkdGEgYTI5ay1kaXMubG8iIDs7Ci0JYmZkX2FsbGlhbnRfYXJjaCkJOzsKLQliZmRfYWxwaGFfYXJjaCkJCXRhPSIkdGEgYWxwaGEtZGlzLmxvIGFscGhhLW9wYy5sbyIgOzsKLQliZmRfYXJjX2FyY2gpCQl0YT0iJHRhIGFyYy1kaXMubG8gYXJjLW9wYy5sbyIgOzsKLQliZmRfYXJtX2FyY2gpCQl0YT0iJHRhIGFybS1kaXMubG8iIDs7Ci0JYmZkX2NvbnZleF9hcmNoKQk7OwotCWJmZF9kMTB2X2FyY2gpCQl0YT0iJHRhIGQxMHYtZGlzLmxvIGQxMHYtb3BjLmxvIiA7OwotCWJmZF9kMzB2X2FyY2gpCQl0YT0iJHRhIGQzMHYtZGlzLmxvIGQzMHYtb3BjLmxvIiA7OwotCWJmZF9mcjMwX2FyY2gpICAgICAgICAgIHRhPSIkdGEgZnIzMC1hc20ubG8gZnIzMC1kZXNjLmxvIGZyMzAtZGlzLmxvIGZyMzAtaWJsZC5sbyBmcjMwLW9wYy5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfaDgzMDBfYXJjaCkJCXRhPSIkdGEgaDgzMDAtZGlzLmxvIiA7OwotCWJmZF9oODUwMF9hcmNoKQkJdGE9IiR0YSBoODUwMC1kaXMubG8iIDs7Ci0JYmZkX2hwcGFfYXJjaCkJCXRhPSIkdGEgaHBwYS1kaXMubG8iIDs7Ci0JYmZkX2kzODZfYXJjaCkJCXRhPSIkdGEgaTM4Ni1kaXMubG8iIDs7Ci0JYmZkX2k4NjBfYXJjaCkJCTs7Ci0JYmZkX2k5NjBfYXJjaCkJCXRhPSIkdGEgaTk2MC1kaXMubG8iIDs7Ci0JYmZkX20zMnJfYXJjaCkJCXRhPSIkdGEgbTMyci1hc20ubG8gbTMyci1kZXNjLmxvIG0zMnItZGlzLmxvIG0zMnItaWJsZC5sbyBtMzJyLW9wYy5sbyBtMzJyLW9waW5zdC5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfbTY4a19hcmNoKQkJdGE9IiR0YSBtNjhrLWRpcy5sbyBtNjhrLW9wYy5sbyIgOzsKLQliZmRfbTg4a19hcmNoKQkJdGE9IiR0YSBtODhrLWRpcy5sbyIgOzsKLQliZmRfbWNvcmVfYXJjaCkJCXRhPSIkdGEgbWNvcmUtZGlzLmxvIiA7OwotCWJmZF9taXBzX2FyY2gpCQl0YT0iJHRhIG1pcHMtZGlzLmxvIG1pcHMtb3BjLmxvIG1pcHMxNi1vcGMubG8iIDs7Ci0JYmZkX21uMTAyMDBfYXJjaCkJdGE9IiR0YSBtMTAyMDAtZGlzLmxvIG0xMDIwMC1vcGMubG8iIDs7Ci0JYmZkX21uMTAzMDBfYXJjaCkJdGE9IiR0YSBtMTAzMDAtZGlzLmxvIG0xMDMwMC1vcGMubG8iIDs7Ci0JYmZkX25zMzJrX2FyY2gpCQl0YT0iJHRhIG5zMzJrLWRpcy5sbyIgOzsKLQliZmRfcG93ZXJwY19hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfcHlyYW1pZF9hcmNoKQk7OwotCWJmZF9yb21wX2FyY2gpCQk7OwotCWJmZF9yczYwMDBfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3NoX2FyY2gpCQl0YT0iJHRhIHNoLWRpcy5sbyIgOzsKLQliZmRfc3BhcmNfYXJjaCkJCXRhPSIkdGEgc3BhcmMtZGlzLmxvIHNwYXJjLW9wYy5sbyIgOzsKLQliZmRfdGFob2VfYXJjaCkJCTs7Ci0JYmZkX3RpYzMwX2FyY2gpCQl0YT0iJHRhIHRpYzMwLWRpcy5sbyIgOzsKLQliZmRfdGljODBfYXJjaCkJCXRhPSIkdGEgdGljODAtZGlzLmxvIHRpYzgwLW9wYy5sbyIgOzsKLQliZmRfdjg1MF9hcmNoKQkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdjg1MGVfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlYV9hcmNoKQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92YXhfYXJjaCkJCXRhPSIkdGEgdmF4LWRpcy5sbyIgOzsKLQliZmRfdzY1X2FyY2gpCQl0YT0iJHRhIHc2NS1kaXMubG8iIDs7Ci0JYmZkX3dlMzJrX2FyY2gpCQk7OwotCWJmZF96OGtfYXJjaCkJCXRhPSIkdGEgejhrLWRpcy5sbyIgOzsKLQotCSIiKQkJCTs7Ci0JKikJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogKioqIHVua25vd24gdGFyZ2V0IGFyY2hpdGVjdHVyZSAkYXJjaCIgMT4mMjsgZXhpdCAxOyB9IDs7Ci0JZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JdGE9IiR0YSAkY2dlbl9maWxlcyIKLSAgICBmaQotCi0gICAgIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi0gICAgZj0iIgotICAgIGZvciBpIGluICR0YSA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIHRhPSIkZiIKLQotICAgICMgQW5kIGR1cGxpY2F0ZSAtRCBmbGFncy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJGFyY2hkZWZzIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgYXJjaGRlZnM9IiRmIgotCi0gICAgQkZEX01BQ0hJTkVTPSIkdGEiCi0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICAgYXJjaGRlZnM9LURBUkNIX2FsbAotICAgIEJGRF9NQUNISU5FUz0nJChBTExfTUFDSElORVMpJwotZmkKLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQExEQCUkTEQlZwotcyVATk1AJSROTSVnCi1zJUBVU0VfU1lNQk9MX1VOREVSU0NPUkVAJSRVU0VfU1lNQk9MX1VOREVSU0NPUkUlZwotcyVATE5fU0AlJExOX1MlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAQVNAJSRBUyVnCi1zJUBMSUJUT09MQCUkTElCVE9PTCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBDR0VOX01BSU5UX1RSVUVAJSRDR0VOX01BSU5UX1RSVUUlZwotcyVAQ0dFTl9NQUlOVF9GQUxTRUAlJENHRU5fTUFJTlRfRkFMU0UlZwotcyVAY2dlbmRpckAlJGNnZW5kaXIlZwotcyVAY2dlbkAlJGNnZW4lZwotcyVAV0lOMzJMREZMQUdTQCUkV0lOMzJMREZMQUdTJWcKLXMlQFdJTjMyTElCQUREQCUkV0lOMzJMSUJBREQlZwotcyVAYXJjaGRlZnNAJSRhcmNoZGVmcyVnCi1zJUBCRkRfTUFDSElORVNAJSRCRkRfTUFDSElORVMlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZ3VyZS5iYXQgYi9vcGNvZGVzL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmM2ZDEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotQGVjaG8gb2ZmDQotZWNobyBDb25maWd1cmluZyBvcGNvZGVzIGZvciBnbzMyDQotcmVtIFRoaXMgYmF0Y2ggZmlsZSBhc3N1bWVzIGEgdW5peC10eXBlICJzZWQiIHByb2dyYW0NCi0NCi1lY2hvICMgTWFrZWZpbGUgZ2VuZXJhdGVkIGJ5ICJjb25maWd1cmUuYmF0Ij4gTWFrZWZpbGUNCi0NCi1pZiBleGlzdCBjb25maWcuc2VkIGRlbCBjb25maWcuc2VkDQotDQotZWNobyAiL1wub1sgCV0qOi8gcy9jb25maWcuc3RhdHVzLy8JCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQ0MgPSBjYy9DQyA9IGdjYy8JCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BCRkRfTUFDSElORVNAL2kzODYtZGlzLm8vCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BhcmNoZGVmc0AvLURBUkNIX2kzODYvCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AZnJhZ3NALy8JCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9Ac3JjZGlyQC8vCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMhQHByZWZpeEAhL3Vzci9sb2NhbCEJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzIUBleGVjX3ByZWZpeEAhL3Vzci9sb2NhbCEJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQFJBTkxJQkAvcmFubGliLwkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvXlsgCV0qcm0vCS1ybS8JCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1zZWQgLWUgInMvXlwiLy8iIC1lICJzL1wiJC8vIiAtZSAicy9bIAldKiQvLyIgY29uZmlnLnNlZCA+IGNvbmZpZzIuc2VkDQotc2VkIC1mIGNvbmZpZzIuc2VkIE1ha2VmaWxlLmluID4+IE1ha2VmaWxlDQotZGVsIGNvbmZpZy5zZWQNCi1kZWwgY29uZmlnMi5zZWQNCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZ3VyZS5pbiBiL29wY29kZXMvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjc4NTgwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVCh6OGstZGlzLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLUFDX0lTQ19QT1NJWAotCi0jIFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBuYW1lIG9mIGFueSBzaGFyZWQKLSMgbGlicmFyeS4gIEZvciB1c2VyIGNvbnZlbmllbmNlLCB3ZSBhbHdheXMgdXNlIHRoZSBzYW1lIHZlcnNpb24KLSMgbnVtYmVyIHRoYXQgQkZEIGlzIHVzaW5nLgotY2hhbmdlcXVvdGUoLClkbmwKLUJGRF9WRVJTSU9OPWBncmVwIElOSVRfQVVUT01BS0UgJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaW4gfCBzZWQgLW4gLWUgJ3MvWyAJXS8vZycgLWUgJ3MvXi4qLFwoLipcKSkuKiQvXDEvcCdgCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLUFNX0lOSVRfQVVUT01BS0Uob3Bjb2RlcywgJHtCRkRfVkVSU0lPTn0pCi0KLWRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50Ci1kbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi1kbmwgRGVmYXVsdCB0byBhIG5vbiBzaGFyZWQgbGlicmFyeS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlCi1kbmwgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1zaGFyZWQuCi1BTV9ESVNBQkxFX1NIQVJFRAotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3Igb3Bjb2RlcyBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1BQ19BUkdfUFJPR1JBTQotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUFDX1BST0dfQ0MKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BQ19QUk9HX0lOU1RBTEwKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmgpCi0KLQotdXNpbmdfY2dlbj1ubwotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9iZmQgLWxiZmQgLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiIKLSAgZmkKLSAgOzsKLWVzYWMKLUFDX1NVQlNUKFdJTjMyTERGTEFHUykKLUFDX1NVQlNUKFdJTjMyTElCQUREKQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotc2VsYXJjaHM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCIgOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLSAgICBlbHNlCi0JLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLSAgICBmaQotZG9uZQkKLQotIyBVdGlsaXR5IHZhciwgZG9jdW1lbnRzIGdlbmVyaWMgY2dlbiBzdXBwb3J0IGZpbGVzLgotCi1jZ2VuX2ZpbGVzPSJjZ2VuLW9wYy5sbyBjZ2VuLWFzbS5sbyBjZ2VuLWRpcy5sbyIKLQotIyBXZSBkb24ndCBkbyBhbnkgbGlua3MgYmFzZWQgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGp1c3QgbWFrZWZpbGUgY29uZmlnLgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHhmYWxzZSA7IHRoZW4KLQotICAgICMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KLSAgICB0YT0KLQotICAgIGZvciBhcmNoIGluICRzZWxhcmNocwotICAgIGRvCi0JYWQ9YGVjaG8gJGFyY2ggfCBzZWQgLWUgcy9iZmRfLy9nIC1lIHMvX2FyY2gvL2dgCi0JYXJjaGRlZnM9IiRhcmNoZGVmcyAtREFSQ0hfJGFkIgotCWNhc2UgIiRhcmNoIiBpbgotCWJmZF9hMjlrX2FyY2gpCQl0YT0iJHRhIGEyOWstZGlzLmxvIiA7OwotCWJmZF9hbGxpYW50X2FyY2gpCTs7Ci0JYmZkX2FscGhhX2FyY2gpCQl0YT0iJHRhIGFscGhhLWRpcy5sbyBhbHBoYS1vcGMubG8iIDs7Ci0JYmZkX2FyY19hcmNoKQkJdGE9IiR0YSBhcmMtZGlzLmxvIGFyYy1vcGMubG8iIDs7Ci0JYmZkX2FybV9hcmNoKQkJdGE9IiR0YSBhcm0tZGlzLmxvIiA7OwotCWJmZF9jb252ZXhfYXJjaCkJOzsKLQliZmRfZDEwdl9hcmNoKQkJdGE9IiR0YSBkMTB2LWRpcy5sbyBkMTB2LW9wYy5sbyIgOzsKLQliZmRfZDMwdl9hcmNoKQkJdGE9IiR0YSBkMzB2LWRpcy5sbyBkMzB2LW9wYy5sbyIgOzsKLQliZmRfZnIzMF9hcmNoKSAgICAgICAgICB0YT0iJHRhIGZyMzAtYXNtLmxvIGZyMzAtZGVzYy5sbyBmcjMwLWRpcy5sbyBmcjMwLWlibGQubG8gZnIzMC1vcGMubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX2g4MzAwX2FyY2gpCQl0YT0iJHRhIGg4MzAwLWRpcy5sbyIgOzsKLQliZmRfaDg1MDBfYXJjaCkJCXRhPSIkdGEgaDg1MDAtZGlzLmxvIiA7OwotCWJmZF9ocHBhX2FyY2gpCQl0YT0iJHRhIGhwcGEtZGlzLmxvIiA7OwotCWJmZF9pMzg2X2FyY2gpCQl0YT0iJHRhIGkzODYtZGlzLmxvIiA7OwotCWJmZF9pODYwX2FyY2gpCQk7OwotCWJmZF9pOTYwX2FyY2gpCQl0YT0iJHRhIGk5NjAtZGlzLmxvIiA7OwotCWJmZF9tMzJyX2FyY2gpCQl0YT0iJHRhIG0zMnItYXNtLmxvIG0zMnItZGVzYy5sbyBtMzJyLWRpcy5sbyBtMzJyLWlibGQubG8gbTMyci1vcGMubG8gbTMyci1vcGluc3QubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX202OGtfYXJjaCkJCXRhPSIkdGEgbTY4ay1kaXMubG8gbTY4ay1vcGMubG8iIDs7Ci0JYmZkX204OGtfYXJjaCkJCXRhPSIkdGEgbTg4ay1kaXMubG8iIDs7Ci0JYmZkX21jb3JlX2FyY2gpCQl0YT0iJHRhIG1jb3JlLWRpcy5sbyIgOzsKLQliZmRfbWlwc19hcmNoKQkJdGE9IiR0YSBtaXBzLWRpcy5sbyBtaXBzLW9wYy5sbyBtaXBzMTYtb3BjLmxvIiA7OwotCWJmZF9tbjEwMjAwX2FyY2gpCXRhPSIkdGEgbTEwMjAwLWRpcy5sbyBtMTAyMDAtb3BjLmxvIiA7OwotCWJmZF9tbjEwMzAwX2FyY2gpCXRhPSIkdGEgbTEwMzAwLWRpcy5sbyBtMTAzMDAtb3BjLmxvIiA7OwotCWJmZF9uczMya19hcmNoKQkJdGE9IiR0YSBuczMyay1kaXMubG8iIDs7Ci0JYmZkX3Bvd2VycGNfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3B5cmFtaWRfYXJjaCkJOzsKLQliZmRfcm9tcF9hcmNoKQkJOzsKLQliZmRfcnM2MDAwX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9zaF9hcmNoKQkJdGE9IiR0YSBzaC1kaXMubG8iIDs7Ci0JYmZkX3NwYXJjX2FyY2gpCQl0YT0iJHRhIHNwYXJjLWRpcy5sbyBzcGFyYy1vcGMubG8iIDs7Ci0JYmZkX3RhaG9lX2FyY2gpCQk7OwotCWJmZF90aWMzMF9hcmNoKQkJdGE9IiR0YSB0aWMzMC1kaXMubG8iIDs7Ci0JYmZkX3RpYzgwX2FyY2gpCQl0YT0iJHRhIHRpYzgwLWRpcy5sbyB0aWM4MC1vcGMubG8iIDs7Ci0JYmZkX3Y4NTBfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZWFfYXJjaCkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdmF4X2FyY2gpCQl0YT0iJHRhIHZheC1kaXMubG8iIDs7Ci0JYmZkX3c2NV9hcmNoKQkJdGE9IiR0YSB3NjUtZGlzLmxvIiA7OwotCWJmZF93ZTMya19hcmNoKQkJOzsKLQliZmRfejhrX2FyY2gpCQl0YT0iJHRhIHo4ay1kaXMubG8iIDs7Ci0KLQkiIikJCQk7OwotCSopCQlBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IGFyY2hpdGVjdHVyZSAkYXJjaCkgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLQl0YT0iJHRhICRjZ2VuX2ZpbGVzIgotICAgIGZpCi0KLSAgICAjIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJHRhIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgdGE9IiRmIgotCi0gICAgIyBBbmQgZHVwbGljYXRlIC1EIGZsYWdzLgotICAgIGY9IiIKLSAgICBmb3IgaSBpbiAkYXJjaGRlZnMgOyBkbwotCWNhc2UgIiAkZiAiIGluCi0JKiIgJGkgIiopIDs7Ci0JKikgZj0iJGYgJGkiIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgICBhcmNoZGVmcz0iJGYiCi0KLSAgICBCRkRfTUFDSElORVM9IiR0YSIKLQotZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLSAgICBhcmNoZGVmcz0tREFSQ0hfYWxsCi0gICAgQkZEX01BQ0hJTkVTPSckKEFMTF9NQUNISU5FUyknCi1maQotCi1BQ19TVUJTVChhcmNoZGVmcykKLUFDX1NVQlNUKEJGRF9NQUNISU5FUykKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL29wY29kZXMvZDEwdi1kaXMuYyBiL29wY29kZXMvZDEwdi1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxYTdkMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QxMHYtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgRDEwViBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotLyogdGhlIFBDIHdyYXBzIGF0IDE4IGJpdHMsIGV4Y2VwdCBmb3IgdGhlIHNlZ21lbnQgbnVtYmVyICovCi0vKiBzbyB1c2UgdGhpcyBtYXNrIHRvIGtlZXAgdGhlIHBhcnRzIHdlIHdhbnQgKi8KLSNkZWZpbmUgUENfTUFTSwkweDAzMDNGRkZGCi0KLXN0YXRpYyB2b2lkIGRpc18yX3Nob3J0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgYmZkX3ZtYSBtZW1hZGRyLCAKLQkJCQkgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGludCBvcmRlcikpOwotc3RhdGljIHZvaWQgZGlzX2xvbmcgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnNuLCBiZmRfdm1hIG1lbWFkZHIsIAotCQkJICAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotaW50IAotcHJpbnRfaW5zbl9kMTB2IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBzdGF0dXMgPSBpbnNuICYgRk0xMTsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgY2FzZSAwOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAyKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTAxOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAwKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTEwOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAxKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTExOgotICAgIGRpc19sb25nIChpbnNuLCBtZW1hZGRyLCBpbmZvKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gNDsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmQgKG9wZXIsIGluc24sIG9wLCBtZW1hZGRyLCBpbmZvKQotICAgICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3A7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBudW0sIHNoaWZ0OwotCi0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUTUlOVVMpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJALSIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfTUlOVVMpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7ICAgCi0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9QTFVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKyIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRTSUdOKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzaGlmdCA9IG9wZXItPnNoaWZ0OwotCi0gIC8qIHRoZSBMT05HX0wgZm9ybWF0IHNoaWZ0cyByZWdpc3RlcnMgb3ZlciBieSAxNSAqLwotICBpZiAob3AtPmZvcm1hdCA9PSBMT05HX0wgJiYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpKQotICAgIHNoaWZ0ICs9IDE1OwotCi0gIG51bSA9IChpbnNuID4+IHNoaWZ0KSAmICgweDdGRkZGRkZGID4+ICgzMSAtIG9wZXItPmJpdHMpKTsKLQotICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBtYXRjaD0wOwotICAgICAgbnVtICs9IChvcGVyLT5mbGFncwotCSAgICAgICYgKE9QRVJBTkRfR1BSfE9QRVJBTkRfRkZMQUd8T1BFUkFORF9DRkxBR3xPUEVSQU5EX0NPTlRST0wpKTsKLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQludW0gKz0gbnVtID8gT1BFUkFORF9BQ0MxIDogT1BFUkFORF9BQ0MwOwotICAgICAgZm9yIChpID0gMDsgaSA8IGQxMHZfcmVnX25hbWVfY250KCk7IGkrKykKLQl7Ci0JICBpZiAobnVtID09IGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0udmFsdWUpCi0JICAgIHsKLQkgICAgICBpZiAoZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSk7Ci0JICAgICAgZWxzZQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIixkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLm5hbWUpOwotCSAgICAgIG1hdGNoPTE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLQl7Ci0JICAvKiB0aGlzIHdvdWxkIG9ubHkgZ2V0IGV4ZWN1dGVkIGlmIGEgcmVnaXN0ZXIgd2FzIG5vdCBpbiB0aGUgCi0JICAgICByZWdpc3RlciB0YWJsZSAqLwotCSAgaWYgKG9wZXItPmZsYWdzICYgKE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzEpKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImEiKTsKLQkgIGVsc2UgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9DT05UUk9MKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyIik7Ci0JICBlbHNlIGlmKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciIpOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsbnVtKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogYWRkcmVzc2VzIGFyZSByaWdodC1zaGlmdGVkIGJ5IDIgKi8KLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQUREUikKLQl7Ci0JICBsb25nIG1heDsKLQkgIGludCBuZWc9MDsKLQkgIG1heCA9ICgxIDw8IChvcGVyLT5iaXRzIC0gMSkpOwotCSAgaWYgKG51bSAmIG1heCkKLQkgICAgewotCSAgICAgIG51bSA9IC1udW0gJiAoKDEgPDwgb3Blci0+Yml0cyktMSk7Ci0JICAgICAgbmVnID0gMTsKLQkgICAgfQotCSAgbnVtID0gbnVtPDwyOwotCSAgaWYgKGluZm8tPmZsYWdzICYgSU5TTl9IQVNfUkVMT0MpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobnVtICYgUENfTUFTSywgaW5mbyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobmVnKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyIC0gbnVtKSAmIFBDX01BU0ssIGluZm8pOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIG51bSkgJiBQQ19NQVNLLCBpbmZvKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBtYXggPSAoMSA8PCAob3Blci0+Yml0cyAtIDEpKTsKLQkgICAgICBpZiAobnVtICYgbWF4KQotCQl7Ci0JCSAgbnVtID0gLW51bSAmICgoMSA8PCBvcGVyLT5iaXRzKS0xKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsKLQkJfQotCSAgICB9Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLG51bSk7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZGlzX2xvbmcgKGluc24sIG1lbWFkZHIsIGluZm8pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmWzMyXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7Ci0gIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBuZWVkX3BhcmVuID0gMDsKLSAgaW50IG1hdGNoID0gMDsKLQotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKChvcC0+Zm9ybWF0ICYgTE9OR19PUENPREUpICYmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlKSkKLQl7Ci0JICBtYXRjaCA9IDE7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLCBvcC0+bmFtZSk7ICAgCi0JICBmb3IgKCBpPTA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCSAgICB7Ci0JICAgICAgb3BlciA9IChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2ldXTsKLQkgICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQkJbmVlZF9wYXJlbiA9IDE7Ci0JICAgICAgcHJpbnRfb3BlcmFuZCAob3BlciwgaW5zbiwgb3AsIG1lbWFkZHIsIGluZm8pOwotCSAgICAgIGlmIChvcC0+b3BlcmFuZHNbaSsxXSAmJiBvcGVyLT5iaXRzICYmCi0JCSAgZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MgIT0gT1BFUkFORF9QTFVTICYmCi0JCSAgZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MgIT0gT1BFUkFORF9NSU5VUykKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOyAgIAotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JTA4eCIsaW5zbik7ICAgCi0KLSAgaWYgKG5lZWRfcGFyZW4pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7ICAgCi19Ci0KLXN0YXRpYyB2b2lkCi1kaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgb3JkZXIpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG9yZGVyOwotewotICBpbnQgaSxqOwotICBjaGFyIGFzdHJbMl1bMzJdOwotICB1bnNpZ25lZCBpbnQgaW5zWzJdOwotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wOwotICBjaGFyIGJ1ZlszMl07Ci0gIGludCBtYXRjaCwgbnVtX21hdGNoPTA7Ci0gIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBuZWVkX3BhcmVuID0gMDsKLQotICBpbnNbMF0gPSAoaW5zbiAmIDB4M0ZGRkZGRkYpID4+IDE1OwotICBpbnNbMV0gPSBpbnNuICYgMHgwMDAwN0ZGRjsKLQotICBmb3Ioaj0wO2o8MjtqKyspCi0gICAgewotICAgICAgb3AgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOwotICAgICAgbWF0Y2g9MDsKLSAgICAgIHdoaWxlIChvcC0+bmFtZSkKLQl7Ci0JICBpZiAoKG9wLT5mb3JtYXQgJiBTSE9SVF9PUENPREUpICYmICgob3AtPm1hc2sgJiBpbnNbal0pID09IG9wLT5vcGNvZGUpKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0IixvcC0+bmFtZSk7ICAgCi0JICAgICAgZm9yIChpPTA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCQl7Ci0JCSAgb3BlciA9IChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2ldXTsKLQkJICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQkJICAgIG5lZWRfcGFyZW4gPSAxOwotCQkgIHByaW50X29wZXJhbmQgKG9wZXIsIGluc1tqXSwgb3AsIG1lbWFkZHIsIGluZm8pOwotCQkgIGlmIChvcC0+b3BlcmFuZHNbaSsxXSAmJiBvcGVyLT5iaXRzICYmIAotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfUExVUyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwgIik7ICAgCi0JCX0KLQkgICAgICBtYXRjaCA9IDE7Ci0JICAgICAgbnVtX21hdGNoKys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIG9wKys7Ci0JfQotICAgICAgaWYgKCFtYXRjaCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInVua25vd24iKTsgICAKLQotICAgICAgc3dpdGNoIChvcmRlcikKLQl7Ci0JY2FzZSAwOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdC0+XHQiKTsgICAKLQkgIG9yZGVyID0gLTE7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0PC1cdCIpOyAgIAotCSAgb3JkZXIgPSAtMTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHR8fFx0Iik7ICAgCi0JICBvcmRlciA9IC0xOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG51bV9tYXRjaCA9PSAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JTA4eCIsaW5zbik7ICAgCi0KLSAgaWYgKG5lZWRfcGFyZW4pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7ICAgCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2QxMHYtb3BjLmMgYi9vcGNvZGVzL2QxMHYtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YTAyZDAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMTB2LW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qIGQxMHYtb3BjLmMgLS0gRDEwViBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiCi0KLQotLyogICBUaGUgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLWNvbnN0IHN0cnVjdCBwZF9yZWcgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCBOVUxMLCBPUEVSQU5EX0FDQzArMCB9LAotICB7ICJhMSIsIE5VTEwsIE9QRVJBTkRfQUNDMSsxIH0sCi0gIHsgImJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjIiwgTlVMTCwgT1BFUkFORF9DRkxBRyszIH0sCi0gIHsgImNyMCIsICJwc3ciLCBPUEVSQU5EX0NPTlRST0wgfSwKLSAgeyAiY3IxIiwgImJwc3ciLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjcjEwIiwgIm1vZF9zIiwgT1BFUkFORF9DT05UUk9MKzEwIH0sCi0gIHsgImNyMTEiLCAibW9kX2UiLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAiY3IxMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMiB9LAotICB7ICJjcjEzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEzIH0sCi0gIHsgImNyMTQiLCAiaWJhIiwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImNyMTUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKLSAgeyAiY3IyIiwgInBjIiwgT1BFUkFORF9DT05UUk9MKzIgfSwKLSAgeyAiY3IzIiwgImJwYyIsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImNyNCIsICJkcHN3IiwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiY3I1IiwgImRwYyIsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImNyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2IH0sCi0gIHsgImNyNyIsICJycHRfYyIsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgImNyOCIsICJycHRfcyIsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgImNyOSIsICJycHRfZSIsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCi0gIHsgImRwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImRwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNCB9LAotICB7ICJmMCIsIE5VTEwsIE9QRVJBTkRfRkZMQUcrMCB9LAotICB7ICJmMSIsIE5VTEwsIE9QRVJBTkRfRkZMQUcrMSB9LAotICB7ICJpYmEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAibGluayIsICJyMTMiLCBPUEVSQU5EX0dQUisxMyB9LAotICB7ICJtb2RfZSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJtb2RfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgInBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCswIH0sCi0gIHsgInIwIiwgTlVMTCwgT1BFUkFORF9HUFIrMCB9LAotICB7ICJyMC1yMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzB9LAotICB7ICJyMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzEgfSwKLSAgeyAicjEiLCBOVUxMLCBPUEVSQU5EX0dQUisxIH0sCi0gIHsgInIxMCIsIE5VTEwsIE9QRVJBTkRfR1BSKzEwIH0sCi0gIHsgInIxMC1yMTEiLCBOVUxMLCBPUEVSQU5EX0dQUisxMCB9LAotICB7ICJyMTEiLCBOVUxMLCBPUEVSQU5EX0dQUisxMSB9LAotICB7ICJyMTIiLCBOVUxMLCBPUEVSQU5EX0dQUisxMiB9LAotICB7ICJyMTItcjEzIiwgTlVMTCwgT1BFUkFORF9HUFIrMTIgfSwKLSAgeyAicjEzIiwgTlVMTCwgT1BFUkFORF9HUFIrMTMgfSwKLSAgeyAicjE0IiwgTlVMTCwgT1BFUkFORF9HUFIrMTQgfSwKLSAgeyAicjE0LXIxNSIsIE5VTEwsIE9QRVJBTkRfR1BSKzE0IH0sCi0gIHsgInIxNSIsICJzcCIsIE9QRVJBTkRfR1BSKzE1IH0sCi0gIHsgInIyIiwgTlVMTCwgT1BFUkFORF9HUFIrMiB9LAotICB7ICJyMi1yMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzIgfSwKLSAgeyAicjMiLCBOVUxMLCBPUEVSQU5EX0dQUiszIH0sCi0gIHsgInI0IiwgTlVMTCwgT1BFUkFORF9HUFIrNCB9LAotICB7ICJyNC1yNSIsIE5VTEwsIE9QRVJBTkRfR1BSKzQgfSwKLSAgeyAicjUiLCBOVUxMLCBPUEVSQU5EX0dQUis1IH0sCi0gIHsgInI2IiwgTlVMTCwgT1BFUkFORF9HUFIrNiB9LAotICB7ICJyNi1yNyIsIE5VTEwsIE9QRVJBTkRfR1BSKzYgfSwKLSAgeyAicjciLCBOVUxMLCBPUEVSQU5EX0dQUis3IH0sCi0gIHsgInI4IiwgTlVMTCwgT1BFUkFORF9HUFIrOCB9LAotICB7ICJyOC1yOSIsIE5VTEwsIE9QRVJBTkRfR1BSKzggfSwKLSAgeyAicjkiLCBOVUxMLCBPUEVSQU5EX0dQUis5IH0sCi0gIHsgInJwdF9jIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAicnB0X2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJycHRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgInNwIiwgTlVMTCwgT1BFUkFORF9HUFIrMTUgfSwKLX07Ci0KLWludCAKLWQxMHZfcmVnX25hbWVfY250KCkKLXsKLSAgcmV0dXJuIChzaXplb2YoZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpOwotfQotCi1jb25zdCBzdHJ1Y3QgZDEwdl9vcGVyYW5kIGQxMHZfb3BlcmFuZHNbXSA9Ci17Ci0jZGVmaW5lIFVOVVNFRAkoMCkKLSAgeyAwLCAwLCAwIH0sCi0jZGVmaW5lIFJTUkMJKFVOVVNFRCArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUkRTVAkoUlNSQyArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9ERVNUfE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFTUkMJKFJEU1QgKyAxKQotICB7IDEsIDQsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQVNSQzBPTkxZIChBU1JDICsgMSkKLSAgeyAxLCA0LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQURTVAkoQVNSQzBPTkxZICsgMSkKLSAgeyAxLCA4LCBPUEVSQU5EX0RFU1R8T1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSU1JDRQkoQURTVCArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9FVkVOfE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJEU1RFCShSU1JDRSArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9FVkVOfE9QRVJBTkRfREVTVHxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBOVU0xNgkoUkRTVEUgKyAxKQotICB7IDE2LCAwLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBOVU0zCShOVU0xNiArIDEpCQkJLyogcmFjLCByYWNoaSAqLwotICB7IDMsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIE5VTTQJKE5VTTMgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIFVOVU00CShOVU00ICsgMSkKLSAgeyA0LCAxLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBVTlVNNFMJKFVOVU00ICsgMSkJCQkvKiBhZGRpLCBzbGxpLCBzcmFpLCBzcmxpLCBzdWJpICovCi0gIHsgNCwgMSwgT1BFUkFORF9OVU18T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBVTlVNOAkoVU5VTTRTICsgMSkJCQkvKiByZXBpICovCi0gIHsgOCwgMTYsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIFVOVU0xNgkoVU5VTTggKyAxKQkJCS8qIGNtcHVpICovCi0gIHsgMTYsIDAsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIEFOVU0xNgkoVU5VTTE2ICsgMSkKLSAgeyAxNiwgMCwgT1BFUkFORF9BRERSfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIEFOVU04CShBTlVNMTYgKyAxKQotICB7IDgsIDAsIE9QRVJBTkRfQUREUnxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBBU1JDMgkoQU5VTTggKyAxKQotICB7IDEsIDgsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUlNSQzIJKEFTUkMyICsgMSkKLSAgeyA0LCA1LCBPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSU1JDMkUJKFJTUkMyICsgMSkKLSAgeyA0LCA1LCBPUEVSQU5EX0dQUnxPUEVSQU5EX1JFR3xPUEVSQU5EX0VWRU4gfSwKLSNkZWZpbmUgQVNSQzAJKFJTUkMyRSArIDEpCi0gIHsgMSwgMCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBRFNUMAkoQVNSQzAgKyAxKQotICB7IDEsIDAsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIEZGU1JDCShBRFNUMCArIDEpCi0gIHsgMiwgMSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZGTEFHIH0sCi0jZGVmaW5lIENGU1JDCShGRlNSQyArIDEpCi0gIHsgMiwgMSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0NGTEFHIH0sCi0jZGVmaW5lIEZEU1QJKENGU1JDICsgMSkKLSAgeyAxLCA1LCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0RFU1R9LAotI2RlZmluZSBBVFNJR04JKEZEU1QgKyAxKQotICB7IDAsIDAsIE9QRVJBTkRfQVRTSUdOfSwKLSNkZWZpbmUgQVRQQVIJKEFUU0lHTiArIDEpCS8qICJAKCIgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX0FUUEFSfSwKLSNkZWZpbmUgUExVUwkoQVRQQVIgKyAxKQkvKiBwb3N0aW5jcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9QTFVTfSwKLSNkZWZpbmUgTUlOVVMJKFBMVVMgKyAxKQkvKiBwb3N0ZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9NSU5VU30sCi0jZGVmaW5lIEFUTUlOVVMJKE1JTlVTICsgMSkJLyogcHJlZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9BVE1JTlVTfSwKLSNkZWZpbmUgQ1NSQwkoQVRNSU5VUyArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA0LCAxLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x9LAotI2RlZmluZSBDRFNUCShDU1JDICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDQsIDUsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTHxPUEVSQU5EX0RFU1R9LAotfTsKLQotY29uc3Qgc3RydWN0IGQxMHZfb3Bjb2RlIGQxMHZfb3Bjb2Rlc1tdID0gewotICB7ICJhYnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDYwNywgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJhYnMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHg1NjA3LCAweDdlZmYsIHsgQURTVCB9IH0sCi0gIHsgImFkZCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdDQVIsIDB4MDIwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEyMDEsIDB4N2VlMywgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgImFkZCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTIwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJhZGQydyIsIFNIT1JUXzIsIDIsIElVLCBQQVJ8V0NBUiwgMHgxMjAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAiYWRkMyIsIExPTkdfTCwgMSwgTVUsIFNFUXxXQ0FSLCAweDEwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7ICJhZGRhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAyMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgImFkZGFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDIwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJhZGRhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMjAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJhZGRhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMjAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgImFkZGkiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAgMHgyMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNFMgfSB9LAotICB7ICJhbmQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHhjMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAiYW5kMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg2MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgeyAiYmNscmkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweGMwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYmwiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJsLnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIX0xJTkt8UEFSLCAweDQ5MDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJsLmwiLCBMT05HX0IsIDMsIE1VLCBCUkFOQ0hfTElOS3xTRVEsIDB4MjQ4MDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYm5vdGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweGEwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYnJhIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJicmEucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0h8UEFSLCAweDQ4MDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJyYS5sIiwgTE9OR19CLCAzLCBNVSwgQlJBTkNIfFNFUSwgMHgyNDAwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJicmYwZiIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYnJmMGYucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0h8UEFSfFJGMCwgMHg0YTAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJicmYwZi5sIiwgTE9OR19CLCAzLCBNVSwgU0VRLCAweDI1MDAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJyZjB0IiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJicmYwdC5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSHxQQVJ8UkYwLCAweDRiMDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJyZjB0LmwiLCBMT05HX0IsIDMsIE1VLCBTRVEsIDB4MjU4MDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYnNldGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDgwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYnRzdGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHhlMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImNscmFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NjAxLCAweDdlZmYsIHsgQURTVCB9IH0sCi0gIHsgImNtcCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg2MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgImNtcCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDE2MDMsIDB4N2VlZiwgeyBBU1JDMiwgQVNSQyB9IH0sCi0gIHsgImNtcGVxIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQwMCwgMHg3ZTAxLCB7IFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAiY21wZXEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgxNDAzLCAweDdlZWYsIHsgQVNSQzIsIEFTUkMgfSB9LAotICB7ICJjbXBlcWkiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAxLCA0LCAxNiwgMCB9IH0sCi0gIHsgImNtcGVxaS5zIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQwMSwgMHg3ZTAxLCB7IFJTUkMyLCBOVU00IH0gfSwKLSAgeyAiY21wZXFpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MjAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJjbXBpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAotICB7ICJjbXBpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NjAxLCAweDdlMDEsIHsgUlNSQzIsIE5VTTQgfSB9LAotICB7ICJjbXBpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJjbXB1IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQ2MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgImNtcHVpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIzMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBVTlVNMTYgfSB9LAotICB7ICJjcGZnIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg0ZTA5LCAweDdmZDksIHsgRkRTVCwgRkZTUkMgfSB9LAotICB7ICJjcGZnIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg0ZTA5LCAweDdmZDksIHsgRkRTVCwgQ0ZTUkMgfSB9LAotICB7ICJkYnQiLCBTSE9SVF8yLCA1LCBNVSwgUEFSLCAweDVmMjAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZGl2cyIsIExPTkdfTCwgMSwgQk9USCwgU0VRLCAweDE0MDAyODAwLCAweDNmMTBmZTIxLCB7IFJEU1RFLCBSU1JDIH0gfSwKLSAgeyAiZXhlZjBmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDQsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjB0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjQsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlNDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlNDIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZmFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZmF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhldGFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhldGF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhwIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE1MDAyYTAwLCAweDNmZmZmZTAzLCB7IFJEU1QsIFJTUkNFIH0gfSwKLSAgeyAiZXhwIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE1MDAyYTAyLCAweDNmZmZmZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJqbCIsIFNIT1JUXzIsIDMsIE1VLCBCUkFOQ0hfTElOS3xQQVIsIDB4NGQwMCwgMHg3ZmUxLCB7IFJTUkMgfSB9LAotICB7ICJqbXAiLCBTSE9SVF8yLCAzLCBNVSwgQlJBTkNIfFBBUiwgMHg0YzAwLCAweDdmZTEsIHsgUlNSQyB9IH0sCi0gIHsgImxkIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMwMDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDY0MDEsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKLSAgeyAibGQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjAwMSwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYwMDAsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJsZDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMxMDAwMDAwLCAweDNmMTAwMDAwLCB7IFJEU1RFLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDY2MDEsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgImxkMnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjIwMSwgMHg3ZTIxLCB7IFJEU1RFLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYyMDAsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGRiIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM4MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkYiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg3MDAwLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGRpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAotICB7ICJsZGkucyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFJNRU0sIDB4NDAwMSwgMHg3ZTAxICwgeyBSRFNULCBOVU00IH0gfSwKLSAgeyAibGRpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MjAwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUkRTVCwgTlVNMTYgfSB9LAotICB7ICJsZHViIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM5MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkdWIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NzIwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgIm1hYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MmEwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1hY3N1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxYTAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibWFjdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2EwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDI2MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibWF4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMCwgMHg3ZWUzLCB7IEFEU1QsIFJTUkNFIH0gfSwKLSAgeyAibWF4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMiwgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtaW4iLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgyNjAxLCAweDdlMDEgLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtaW4iLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgzNjAxLCAweDdlZTMgLCB7IEFEU1QsIFJTUkNFIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtc2IiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtc2JzdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTgwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1zYnUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJlMDAsIDB4N2UwMSAsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm11bHgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWx4c3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWx4dSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2MwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm12IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NDAwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdjJ3IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1MDAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAibXYyd2ZhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMCwgMHg3ZTJmLCB7IFJEU1RFLCBBU1JDIH0gfSwKLSAgeyAibXYyd3RhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMSwgMHg3ZWUzLCB7IFJTUkNFLCBBRFNUIH0gfSwKLSAgeyAibXZhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtdmIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXZmMGYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSRjAsIDB4NDQwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdmYwdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFJGMCwgMHg0NDAxLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm12ZmFjZyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwNCwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJtdmZhY2hpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTAwLCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgIm12ZmFjbG8iLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDIsIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAibXZmYyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NTIwMCwgMHg3ZTAxLCB7IFJEU1QsIENTUkMgfSB9LAotICB7ICJtdnRhY2ciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlNDEsIDB4N2VlMSwgeyBSU1JDLCBBRFNUIH0gfSwKLSAgeyAibXZ0YWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwMSwgMHg3ZWUxLCB7IFJTUkMsIEFEU1QgfSB9LAotICB7ICJtdnRhY2xvIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTIxLCAweDdlZTEsIHsgUlNSQywgQURTVCB9IH0sCi0gIHsgIm12dGMiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDU2MDAsIDB4N2UwMSwgeyBSU1JDLCBDRFNUIH0gfSwKLSAgeyAibXZ1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTQwMSwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJuZWciLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg0NjA1LCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgIm5lZyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTYwNSwgMHg3ZWZmLCB7IEFEU1QgfSB9LAotICB7ICJub3AiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg1ZTAwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgIm5vdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDQ2MDMsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAib3IiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg4MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAib3IzIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDQwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7ICJyYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHg1MjAxLCAweDdlMjEsIHsgUkRTVEUsIEFTUkMwT05MWSwgTlVNMyB9IH0sCi0gIHsgInJhY2hpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NDIwMSwgMHg3ZTAxLCB7IFJEU1QsIEFTUkMsIE5VTTMgfSB9LAotICB7ICJyZXAiLCBMT05HX0wsIDIsIE1VLCBTRVEsIDB4MjcwMDAwMDAsIDB4M2ZmMDAwMDAsIHsgUlNSQywgQU5VTTE2IH0gfSwKLSAgeyAicmVwaSIsIExPTkdfTCwgMiwgTVUsIFNFUSwgMHgyZjAwMDAwMCwgMHgzZjAwMDAwMCwgeyBVTlVNOCwgQU5VTTE2IH0gfSwKLSAgeyAicnRkIiwgU0hPUlRfMiwgMywgTVUsIFBBUiwgMHg1ZjYwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInJ0ZSIsIFNIT1JUXzIsIDMsIE1VLCBQQVIsIDB4NWY0MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzYWRkIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMjIzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgInNldGYwZiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8UkYwLCAweDQ2MTEsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic2V0ZjB0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSRjAsIDB4NDYxMywgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzbGVlcCIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NWZjMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzbGwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIyMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic2xsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMjAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNsbGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIyMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNsbGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMyMDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzbHgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMCwgMHg0NjBiLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInNyYSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjQwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzcmEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM0MDAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic3JhaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjQwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAic3JhaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzQwMSwgMHg3ZWUxLCB7IEFEU1QsIFVOVU00UyB9IH0sCi0gIHsgInNybCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjAwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzcmwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMwMDAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic3JsaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjAwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAic3JsaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzAwMSwgMHg3ZWUxLCB7IEFEU1QsIFVOVU00UyB9IH0sCi0gIHsgInNyeCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8UkYwLCAweDQ2MDksIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic3QiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzQwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUlNSQzIsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDY4MDAsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmMxZiwgMHg3ZTFmLCB7IFJTUkMyLCBBVE1JTlVTLCBSU1JDIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NjgwMSwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YzAxLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJzdDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM1MDAwMDAwLCAweDNmMTAwMDAwLCB7IFJTUkMyRSwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YTAwLCAweDdlMjEsIHsgUlNSQzJFLCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZlMWYsIDB4N2UzZiwgeyBSU1JDMkUsIEFUTUlOVVMsIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZhMDEsIDB4N2UyMSwgeyBSU1JDMkUsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmUwMSwgMHg3ZTIxLCB7IFJTUkMyRSwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgInN0YiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzYzAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSU1JDMiwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAic3RiIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDc4MDAsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAic3RvcCIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NWZlMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzdWIiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAweDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3ViIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMDAxLCAweDdlZTMsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInN1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTAwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJzdWIydyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0NBUiwgMHgxMDAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAic3ViYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMDAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJzdWJhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAwMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAic3ViYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTAwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAic3ViYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTAwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJzdWJpIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4MSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00UyB9IH0sCi0gIHsgInRyYXAiLCBTSE9SVF8yLCA1LCBNVSwgQlJBTkNIX0xJTkt8UEFSLCAweDVmMDAsIDB4N2ZlMSwgeyBVTlVNNCB9IH0sCi0gIHsgInRzdDBpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDcwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAidHN0MWkiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4ZjAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJ3YWl0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1ZjgwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInhvciIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweGEwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJ4b3IzIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDUwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIHsgMCB9IH0sCi19OwotCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvZDMwdi1kaXMuYyBiL29wY29kZXMvZDMwdi1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1OGI3NS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QzMHYtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgRDMwViBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2RlZmluZSBQQ19NQVNLIDB4RkZGRkZGRkYKLQotc3RhdGljIGludCBsb29rdXBfb3Bjb2RlIFBBUkFNUyAoKCBzdHJ1Y3QgZDMwdl9pbnNuICppbnNuLCBsb25nIG51bSwgaW50IGlzX2xvbmcgKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnNuIFBBUkFNUyAoKCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbywgYmZkX3ZtYSBtZW1hZGRyLCBsb25nIGxvbmcgbnVtLCAKLQkJCQkgc3RydWN0IGQzMHZfaW5zbiAqaW5zbiwgaW50IGlzX2xvbmcsIGludCBzaG93X2V4dCApKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF92YWx1ZSBQQVJBTVMgKCggbG9uZyBsb25nIG51bSwgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlciwgaW50IGlzX2xvbmcgKSk7Ci0KLWludCAKLXByaW50X2luc25fZDMwdiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1cywgcmVzdWx0OwotICBiZmRfYnl0ZSBidWZmZXJbMTJdOwotICB1bnNpZ25lZCBsb25nIGluMSxpbjI7Ci0gIHN0cnVjdCBkMzB2X2luc24gaW5zbjsKLSAgbG9uZyBsb25nIG51bTsKLQotICBpbnNuLmZvcm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopTlVMTDsKLQotICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7Ci0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW4xID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyKzQsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjEpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgKGxvbmcgbG9uZykgaW4xLCAmaW5zbiwgMCwgcmVzdWx0KTsKLSAgICAgIHJldHVybiA0OyAgICAgIAotICAgIH0KLSAgaW4yID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgCi0gIGlmIChpbjEgJiBpbjIgJiBGTTAxKQotICAgIHsKLSAgICAgIC8qIExPTkcgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMSwgMSkpKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgsMHgleCIsaW4xLGluMik7Ci0JICByZXR1cm4gODsKLQl9Ci0gICAgICBudW0gPSAobG9uZyBsb25nKWluMSA8PCAzMiB8IGluMjsKLSAgICAgIHByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMSwgcmVzdWx0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBudW0gPSBpbjE7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjEpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMCwgcmVzdWx0KTsKLSAgICAgIAotICAgICAgc3dpdGNoICggKChpbjE+PjMxKTw8MSkgfCAoaW4yPj4zMSkgKQotCXsKLQljYXNlIDA6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0fHxcdCIpOyAgIAotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdC0+XHQiKTsgICAKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQ8LVx0Iik7ICAgCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIAotICAgICAgaW5zbi5mb3JtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKU5VTEw7Ci0gICAgICBudW0gPSBpbjI7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjIsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjIpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMCwgcmVzdWx0KTsKLQotICAgIH0KLSAgcmV0dXJuIDg7Ci19Ci0KLQotLyogcmV0dXJucyAwIGlmIGxvb2t1cCBmYWlscyAqLwotLyogMSBpZiBmb3VuZCBhbmQgb25seSBvbmUgZm9ybSAqLwotLyogMiBpZiBmb3VuZCBhbmQgdGhlcmUgYXJlIHNob3J0IGFuZCBsb25nIGZvcm1zICovCi1zdGF0aWMgaW50Ci1sb29rdXBfb3Bjb2RlIChpbnNuLCBudW0sIGlzX2xvbmcpCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKmluc247Ci0gICAgIGxvbmcgbnVtOwotICAgICBpbnQgaXNfbG9uZzsKLXsKLSAgaW50IGk9MCwgaW5kZXg7Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZjsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgZDMwdl9vcGNvZGUgKilkMzB2X29wY29kZV90YWJsZTsKLSAgaW50IG9wMSA9IChudW0gPj4gMjUpICYgMHg3OwotICBpbnQgb3AyID0gKG51bSA+PiAyMCkgJiAweDFmOwotICBpbnQgbW9kID0gKG51bSA+PiAxOCkgJiAweDM7Ci0KLSAgLyogZmluZCB0aGUgb3Bjb2RlICovCi0gIGRvIHsKLSAgICBpZiAoKG9wLT5vcDEgPT0gb3AxKSAmJiAob3AtPm9wMiA9PSBvcDIpKQotICAgICAgYnJlYWs7Ci0gICAgb3ArKzsKLSAgfSB3aGlsZSAob3AtPm5hbWUpOwotCi0gIGlmICghb3AgfHwgIW9wLT5uYW1lKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChvcC0+b3AxID09IG9wMSAmJiBvcC0+b3AyID09IG9wMikKLSAgICB7Ci0gICAgICAvKiBzY2FuIHRocm91Z2ggYWxsIHRoZSBmb3JtYXRzIGZvciB0aGUgb3Bjb2RlICAqLwotICAgICAgaW5kZXggPSBvcC0+Zm9ybWF0W2krK107Ci0gICAgICBkbyAKLQl7Ci0JICBmID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVtpbmRleF07Ci0JICB3aGlsZSAoZi0+Zm9ybSA9PSBpbmRleCkKLQkgICAgewotCSAgICAgIGlmICgoIWlzX2xvbmcgfHwgZi0+Zm9ybSA+PSBMT05HKSAmJiAoZi0+bW9kaWZpZXIgPT0gbW9kKSkKLQkJewotCQkgIGluc24tPmZvcm0gPSBmOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZisrOwotCSAgICB9Ci0JICBpZiAoaW5zbi0+Zm9ybSkKLQkgICAgYnJlYWs7Ci0JfSB3aGlsZSAoKGluZGV4ID0gb3AtPmZvcm1hdFtpKytdKSAhPSAwKTsKLSAgICAgIGlmIChpbnNuLT5mb3JtKQotCWJyZWFrOwotICAgICAgb3ArKzsKLSAgICAgIGk9MDsKLSAgICB9Ci0gIGlmIChpbnNuLT5mb3JtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaW5zbi0+b3AgPSBvcDsKLSAgaW5zbi0+ZWNjID0gKG51bSA+PiAyOCkgJiAweDc7Ci0gIGlmIChvcC0+Zm9ybWF0WzFdKQotICAgIHJldHVybiAyOwotICBlbHNlCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIHZvaWQgCi1wcmludF9pbnNuICggaW5mbywgbWVtYWRkciwgbnVtLCBpbnNuLCBpc19sb25nLCBzaG93X2V4dCApCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGxvbmcgbG9uZyBudW07Ci0gICAgIHN0cnVjdCBkMzB2X2luc24gKmluc247Ci0gICAgIGludCBpc19sb25nOwotICAgICBpbnQgc2hvd19leHQ7Ci17Ci0gIGludCB2YWwsIG9wbnVtLCBuZWVkX2NvbW1hPTA7Ci0gIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBpLCBtYXRjaCwgb3BpbmQ9MCwgbmVlZF9wYXJlbj0wLCBmb3VuZF9jb250cm9sPTA7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsaW5zbi0+b3AtPm5hbWUpOwotCi0gIC8qIGNoZWNrIGZvciBDTVAgb3IgQ01QVSAqLwotICBpZiAoZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzBdXS5mbGFncyAmIE9QRVJBTkRfTkFNRSkKLSAgICB7Ci0gICAgICBvcGluZCsrOwotICAgICAgdmFsID0gZXh0cmFjdF92YWx1ZShudW0sKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzBdXSxpc19sb25nKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQzMHZfY2NfbmFtZXNbdmFsXSk7Ci0gICAgfQotCi0gIC8qIGFkZCBpbiAiLnMiIG9yICIubCIgKi8KLSAgaWYgKHNob3dfZXh0ID09IDIpCi0gICAgewotICAgICAgaWYgKGlzX2xvbmcpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubCIpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLnMiKTsKLSAgICB9Ci0KLSAgaWYgKGluc24tPmVjYykKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi8lcyIsZDMwdl9lY2NfbmFtZXNbaW5zbi0+ZWNjXSk7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gIHdoaWxlICgob3BudW0gPSBpbnNuLT5mb3JtLT5vcGVyYW5kc1tvcGluZCsrXSkgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgYml0czsKLSAgICAgIG9wZXIgPSAoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbb3BudW1dOwotICAgICAgYml0cyA9IG9wZXItPmJpdHM7Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCWJpdHMgKz0gMzsKLQotICAgICAgaWYgKG5lZWRfY29tbWEgJiYgb3Blci0+ZmxhZ3MgIT0gT1BFUkFORF9QTFVTICYmIG9wZXItPmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JewotCSAgbmVlZF9jb21tYT0wOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOwotCX0KLQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRNSU5VUykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAtIik7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9NSU5VUykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsgICAKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX1BMVVMpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7ICAgCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFNJR04pCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAIik7ICAgCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoIik7ICAgCi0JICBuZWVkX3BhcmVuID0gMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfU1BFQ0lBTCkKLQljb250aW51ZTsKLQotICAgICAgdmFsID0gZXh0cmFjdF92YWx1ZShudW0sIG9wZXIsIGlzX2xvbmcpOwotICAgICAgCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQl7Ci0JICBtYXRjaCA9IDA7Ci0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcGVyMyA9IAotCQkoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbaW5zbi0+Zm9ybS0+b3BlcmFuZHNbMl1dOwkgICAgICAKLQkgICAgICBpbnQgaWQgPSBleHRyYWN0X3ZhbHVlIChudW0sIG9wZXIzLCBpc19sb25nICk7Ci0JICAgICAgZm91bmRfY29udHJvbCA9IDE7Ci0JICAgICAgc3dpdGNoICggaWQgKQotCQl7Ci0JCWNhc2UgMDoKLQkJICB2YWwgfD0gT1BFUkFORF9DT05UUk9MOwotCQkgIGJyZWFrOwotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJICB2YWwgPSBPUEVSQU5EX0NPTlRST0wgKyBNQVhfQ09OVFJPTF9SRUcgKyBpZDsKLQkJICBicmVhazsKLQkJY2FzZSAzOgotCQkgIHZhbCB8PSBPUEVSQU5EX0ZMQUc7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZnByaW50ZihzdGRlcnIsImlsbGVnYWwgaWQgKCVkKVxuIixpZCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0FDQykKLQkgICAgdmFsIHw9IE9QRVJBTkRfQUNDOwotCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCi0JICAgIHZhbCB8PSBPUEVSQU5EX0ZMQUc7Ci0JICBmb3IgKGk9MDtpPHJlZ19uYW1lX2NudCgpO2krKykKLQkgICAgewotCSAgICAgIGlmICh2YWwgPT0gcHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLnZhbHVlKQotCQl7Ci0JCSAgaWYgKHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkgICAgICAoaW5mby0+c3RyZWFtLCAiJXMiLHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAgIChpbmZvLT5zdHJlYW0sICIlcyIscHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLm5hbWUpOwotCQkgIG1hdGNoPTE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKG1hdGNoPT0wKQotCSAgICB7Ci0JICAgICAgLyogdGhpcyB3b3VsZCBvbmx5IGdldCBleGVjdXRlZCBpZiBhIHJlZ2lzdGVyIHdhcyBub3QgaW4gdGhlIAotCQkgcmVnaXN0ZXIgdGFibGUgKi8KLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJKGluZm8tPnN0cmVhbSwgXygiPHVua25vd24gcmVnaXN0ZXIgJWQ+IiksIHZhbCAmIDB4M0YpOwkgICAgICAKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24tPm9wLT5yZWxvY19mbGFnID09IFJFTE9DX1BDUkVMIHx8IAotCSAgICAgICAob3BpbmQgPT0gMSAmJiAoaW5zbi0+Zm9ybS0+Zm9ybSA9PSBTSE9SVF9EMiB8fCBpbnNuLT5mb3JtLT5mb3JtID09IExPTkdfRCkpKQotCXsKLQkgIGxvbmcgbWF4OwotCSAgaW50IG5lZz0wOwotCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JICBpZiAodmFsICYgbWF4KQotCSAgICB7Ci0JICAgICAgaWYgKGJpdHMgPT0gMzIpCi0JCXZhbCA9IC12YWw7Ci0JICAgICAgZWxzZQotCQl2YWwgPSAtdmFsICYgKCgxIDw8IGJpdHMpLTEpOwotCSAgICAgIG5lZyA9IDE7Ci0JICAgIH0KLQkgIGlmIChvcGluZCA9PSAxICYmIChpbnNuLT5mb3JtLT5mb3JtID09IFNIT1JUX0QyIHx8IGluc24tPmZvcm0tPmZvcm0gPT0gTE9OR19EKSkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXgiLHZhbCk7Ci0JICAgIH0KLQkgIGVsc2UgewotCSAgICBpZiAobmVnKQotCSAgICAgIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXhcdCgiLHZhbCk7Ci0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgLSB2YWwpICYgUENfTUFTSywgaW5mbyk7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIleFx0KCIsdmFsKTsKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIHZhbCkgJiBQQ19NQVNLLCBpbmZvKTsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JICAgICAgfQotCSAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24tPm9wLT5yZWxvY19mbGFnID09IFJFTE9DX0FCUykKLQl7Ci0JICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotCSAgICB7Ci0JICAgICAgaW50IG1heCA9ICgxIDw8IChiaXRzIC0gMSkpOwotCSAgICAgIGlmICh2YWwgJiBtYXgpCi0JCXsKLQkJICB2YWwgPSAtdmFsOwotCQkgIGlmIChiaXRzIDwgMzIpCi0JCSAgICB2YWwgJj0gKCgxIDw8IGJpdHMpIC0gMSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7Ci0JCX0KLQkgICAgfQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4Iix2YWwpOwotCX0KLSAgICAgIC8qIGlmIHRoZXJlIGlzIGFub3RoZXIgb3BlcmFuZCwgdGhlbiB3cml0ZSBhIGNvbW1hIGFuZCBzcGFjZSAqLwotICAgICAgaWYgKGluc24tPmZvcm0tPm9wZXJhbmRzW29waW5kXSAmJiAhKGZvdW5kX2NvbnRyb2wgJiYgb3BpbmQgPT0gMikpCi0JbmVlZF9jb21tYSA9IDE7Ci0gICAgfQotICBpZiAobmVlZF9wYXJlbikKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfdmFsdWUgKG51bSwgb3BlciwgaXNfbG9uZykKLSAgICAgbG9uZyBsb25nIG51bTsKLSAgICAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlcjsKLSAgICAgaW50IGlzX2xvbmc7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBzaGlmdCA9IDEyIC0gb3Blci0+cG9zaXRpb247Ci0gIGludCBtYXNrID0gKDB4RkZGRkZGRkYgPj4gKDMyIC0gb3Blci0+Yml0cykpOwotCi0gIGlmIChpc19sb25nKQotICAgIHsKLSAgICAgIGlmIChvcGVyLT5iaXRzID09IDMyKSAKLQl7Ci0JICAvKiBwaWVjZSB0b2dldGhlciAzMi1iaXQgY29uc3RhbnQgKi8KLQkgIHZhbCA9ICgobnVtICYgMHgzRkZGRikKLQkJIHwgKChudW0gJiAweEZGMDAwMDApID4+IDIpCi0JCSB8ICgobnVtICYgMHgzRjAwMDAwMDAwTEwpID4+IDYpKTsKLQl9Ci0gICAgICBlbHNlCQotCXZhbCA9IChudW0gPj4gKDMyICsgc2hpZnQpKSAmIG1hc2s7CQotICAgIH0KLSAgZWxzZQotICAgIHZhbCA9IChudW0gPj4gc2hpZnQpICYgbWFzazsKLQotICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHZhbCA8PD0gMzsKLQotICByZXR1cm4gdmFsOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMzB2LW9wYy5jIGIvb3Bjb2Rlcy9kMzB2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjY1ZTdjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDMwdi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKiBkMzB2LW9wYy5jIC0tIEQzMFYgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDMwdi5oIgotCi0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiAqLwotLyogSWYgeW91IGFkZCBhbnl0aGluZywgaXQgTVVTVCBiZSBpbiBhbHBoYWJldGljYWwgb3JkZXIgKi8KLS8qIFRoZSBmaXJzdCBmaWVsZCBpcyB0aGUgbmFtZSB0aGUgYXNzZW1ibGVyIHVzZXMgd2hlbiBsb29raW5nICovCi0vKiB1cCBvcmNvZGVzLiAgVGhlIHNlY29uZCBmaWVsZCBpcyB0aGUgbmFtZSB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgdXNlLiAqLwotLyogVGhpcyBhbGxvd3MgdGhlIGFzc2VtYmxlciB0byBhc3NlbWJsZSByZWZlcmVuY2VzIHRvIHI2MyAoZm9yIGV4YW1wbGUpICovCi0vKiBvciAic3AiLiAgVGhlIGRpc2Fzc2VtYmxlciB3aWxsIGFsd2F5cyB1c2UgdGhlIHByZWZlcnJlZCBmb3JtIChzcCkgKi8KLWNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQotewotICB7ICJhMCIsIE5VTEwsIE9QRVJBTkRfQUNDKzAgfSwKLSAgeyAiYTEiLCBOVUxMLCBPUEVSQU5EX0FDQysxIH0sCi0gIHsgImJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjIiwgImMiLCBPUEVSQU5EX0ZMQUcrNyB9LAotICB7ICJjcjAiLCAicHN3IiwgT1BFUkFORF9DT05UUk9MIH0sCi0gIHsgImNyMSIsICJicHN3IiwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiY3IxMCIsICJtb2RfcyIsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJjcjExIiwgIm1vZF9lIiwgT1BFUkFORF9DT05UUk9MKzExIH0sCi0gIHsgImNyMTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTIgfSwKLSAgeyAiY3IxMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMyB9LAotICB7ICJjcjE0IiwgImliYSIsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAotICB7ICJjcjE1IiwgImVpdF92YiIsIE9QRVJBTkRfQ09OVFJPTCsxNSB9LAotICB7ICJjcjE2IiwgImludF9zIiwgT1BFUkFORF9DT05UUk9MKzE2IH0sCi0gIHsgImNyMTciLCAiaW50X20iLCBPUEVSQU5EX0NPTlRST0wrMTcgfSwKLSAgeyAiY3IxOCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxOCB9LAotICB7ICJjcjE5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE5IH0sCi0gIHsgImNyMiIsICJwYyIsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgImNyMjAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjAgfSwKLSAgeyAiY3IyMSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMSB9LAotICB7ICJjcjIyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIyIH0sCi0gIHsgImNyMjMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjMgfSwKLSAgeyAiY3IyNCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNCB9LAotICB7ICJjcjI1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI1IH0sCi0gIHsgImNyMjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjYgfSwKLSAgeyAiY3IyNyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNyB9LAotICB7ICJjcjI4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI4IH0sCi0gIHsgImNyMjkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjkgfSwKLSAgeyAiY3IzIiwgImJwYyIsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImNyMzAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzAgfSwKLSAgeyAiY3IzMSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMSB9LAotICB7ICJjcjMyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMyIH0sCi0gIHsgImNyMzMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzMgfSwKLSAgeyAiY3IzNCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNCB9LAotICB7ICJjcjM1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM1IH0sCi0gIHsgImNyMzYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzYgfSwKLSAgeyAiY3IzNyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNyB9LAotICB7ICJjcjM4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM4IH0sCi0gIHsgImNyMzkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzkgfSwKLSAgeyAiY3I0IiwgImRwc3ciLCBPUEVSQU5EX0NPTlRST0wrNCB9LAotICB7ICJjcjQwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQwIH0sCi0gIHsgImNyNDEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDEgfSwKLSAgeyAiY3I0MiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MiB9LAotICB7ICJjcjQzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQzIH0sCi0gIHsgImNyNDQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDQgfSwKLSAgeyAiY3I0NSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NSB9LAotICB7ICJjcjQ2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ2IH0sCi0gIHsgImNyNDciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDcgfSwKLSAgeyAiY3I0OCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0OCB9LAotICB7ICJjcjQ5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ5IH0sCi0gIHsgImNyNSIsImRwYyIsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImNyNTAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTAgfSwKLSAgeyAiY3I1MSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MSB9LAotICB7ICJjcjUyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUyIH0sCi0gIHsgImNyNTMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTMgfSwKLSAgeyAiY3I1NCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NCB9LAotICB7ICJjcjU1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU1IH0sCi0gIHsgImNyNTYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTYgfSwKLSAgeyAiY3I1NyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NyB9LAotICB7ICJjcjU4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU4IH0sCi0gIHsgImNyNTkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTkgfSwKLSAgeyAiY3I2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYgfSwKLSAgeyAiY3I2MCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MCB9LAotICB7ICJjcjYxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYxIH0sCi0gIHsgImNyNjIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjIgfSwKLSAgeyAiY3I2MyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MyB9LAotICB7ICJjcjciLCAicnB0X2MiLCBPUEVSQU5EX0NPTlRST0wrNyB9LAotICB7ICJjcjgiLCAicnB0X3MiLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJjcjkiLCAicnB0X2UiLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJkcGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJkcHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiZWl0X3ZiIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE1IH0sCi0gIHsgImYwIiwgTlVMTCwgT1BFUkFORF9GTEFHKzAgfSwKLSAgeyAiZjEiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMSB9LAotICB7ICJmMiIsIE5VTEwsIE9QRVJBTkRfRkxBRysyIH0sCi0gIHsgImYzIiwgTlVMTCwgT1BFUkFORF9GTEFHKzMgfSwKLSAgeyAiZjQiLCAicyIsIE9QRVJBTkRfRkxBRys0IH0sCi0gIHsgImY1IiwgInYiLCBPUEVSQU5EX0ZMQUcrNSB9LAotICB7ICJmNiIsICJ2YSIsIE9QRVJBTkRfRkxBRys2IH0sCi0gIHsgImY3IiwgImMiLCBPUEVSQU5EX0ZMQUcrNyB9LAotICB7ICJpYmEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAiaW50X20iLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTcgfSwKLSAgeyAiaW50X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTYgfSwKLSAgeyAibGluayIsICJyNjIiLCA2MiB9LAotICB7ICJtb2RfZSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJtb2RfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgInBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCB9LAotICB7ICJwc3doIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysyIH0sCi0gIHsgInBzd2wiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzEgfSwKLSAgeyAicjAiLCBOVUxMLCAwIH0sCi0gIHsgInIxIiwgTlVMTCwgMSB9LAotICB7ICJyMTAiLCBOVUxMLCAxMCB9LAotICB7ICJyMTEiLCBOVUxMLCAxMSB9LAotICB7ICJyMTIiLCBOVUxMLCAxMiB9LAotICB7ICJyMTMiLCBOVUxMLCAxMyB9LAotICB7ICJyMTQiLCBOVUxMLCAxNCB9LAotICB7ICJyMTUiLCBOVUxMLCAxNSB9LAotICB7ICJyMTYiLCBOVUxMLCAxNiB9LAotICB7ICJyMTciLCBOVUxMLCAxNyB9LAotICB7ICJyMTgiLCBOVUxMLCAxOCB9LAotICB7ICJyMTkiLCBOVUxMLCAxOSB9LAotICB7ICJyMiIsIE5VTEwsIDIgfSwKLSAgeyAicjIwIiwgTlVMTCwgMjAgfSwKLSAgeyAicjIxIiwgTlVMTCwgMjEgfSwKLSAgeyAicjIyIiwgTlVMTCwgMjIgfSwKLSAgeyAicjIzIiwgTlVMTCwgMjMgfSwKLSAgeyAicjI0IiwgTlVMTCwgMjQgfSwKLSAgeyAicjI1IiwgTlVMTCwgMjUgfSwKLSAgeyAicjI2IiwgTlVMTCwgMjYgfSwKLSAgeyAicjI3IiwgTlVMTCwgMjcgfSwKLSAgeyAicjI4IiwgTlVMTCwgMjggfSwKLSAgeyAicjI5IiwgTlVMTCwgMjkgfSwKLSAgeyAicjMiLCBOVUxMLCAzIH0sCi0gIHsgInIzMCIsIE5VTEwsIDMwIH0sCi0gIHsgInIzMSIsIE5VTEwsIDMxIH0sCi0gIHsgInIzMiIsIE5VTEwsIDMyIH0sCi0gIHsgInIzMyIsIE5VTEwsIDMzIH0sCi0gIHsgInIzNCIsIE5VTEwsIDM0IH0sCi0gIHsgInIzNSIsIE5VTEwsIDM1IH0sCi0gIHsgInIzNiIsIE5VTEwsIDM2IH0sCi0gIHsgInIzNyIsIE5VTEwsIDM3IH0sCi0gIHsgInIzOCIsIE5VTEwsIDM4IH0sCi0gIHsgInIzOSIsIE5VTEwsIDM5IH0sCi0gIHsgInI0IiwgTlVMTCwgNCB9LAotICB7ICJyNDAiLCBOVUxMLCA0MCB9LAotICB7ICJyNDEiLCBOVUxMLCA0MSB9LAotICB7ICJyNDIiLCBOVUxMLCA0MiB9LAotICB7ICJyNDMiLCBOVUxMLCA0MyB9LAotICB7ICJyNDQiLCBOVUxMLCA0NCB9LAotICB7ICJyNDUiLCBOVUxMLCA0NSB9LAotICB7ICJyNDYiLCBOVUxMLCA0NiB9LAotICB7ICJyNDciLCBOVUxMLCA0NyB9LAotICB7ICJyNDgiLCBOVUxMLCA0OCB9LAotICB7ICJyNDkiLCBOVUxMLCA0OSB9LAotICB7ICJyNSIsIE5VTEwsIDUgfSwKLSAgeyAicjUwIiwgTlVMTCwgNTAgfSwKLSAgeyAicjUxIiwgTlVMTCwgNTEgfSwKLSAgeyAicjUyIiwgTlVMTCwgNTIgfSwKLSAgeyAicjUzIiwgTlVMTCwgNTMgfSwKLSAgeyAicjU0IiwgTlVMTCwgNTQgfSwKLSAgeyAicjU1IiwgTlVMTCwgNTUgfSwKLSAgeyAicjU2IiwgTlVMTCwgNTYgfSwKLSAgeyAicjU3IiwgTlVMTCwgNTcgfSwKLSAgeyAicjU4IiwgTlVMTCwgNTggfSwKLSAgeyAicjU5IiwgTlVMTCwgNTkgfSwKLSAgeyAicjYiLCBOVUxMLCA2IH0sCi0gIHsgInI2MCIsIE5VTEwsIDYwIH0sCi0gIHsgInI2MSIsIE5VTEwsIDYxIH0sCi0gIHsgInI2MiIsICJsaW5rIiwgNjIgfSwKLSAgeyAicjYzIiwgInNwIiwgNjMgfSwKLSAgeyAicjciLCBOVUxMLCA3IH0sCi0gIHsgInI4IiwgTlVMTCwgOCB9LAotICB7ICJyOSIsIE5VTEwsIDkgfSwKLSAgeyAicnB0X2MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNyB9LAotICB7ICJycHRfZSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCi0gIHsgInJwdF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzggfSwKLSAgeyAicyIsIE5VTEwsIE9QRVJBTkRfRkxBRys0IH0sCi0gIHsgInNwIiwgTlVMTCwgNjMgfSwKLSAgeyAidiIsIE5VTEwsIE9QRVJBTkRfRkxBRys1IH0sCi0gIHsgInZhIiwgTlVMTCwgT1BFUkFORF9GTEFHKzYgfSwKLX07Ci0KLWludCAKLXJlZ19uYW1lX2NudCgpCi17Ci0gIHJldHVybiAoc2l6ZW9mKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpOwotfQotCi0vKiBPUENPREUgVEFCTEUgKi8KLS8qIFRoZSBmb3JtYXQgb2YgdGhpcyB0YWJsZSBpcyBkZWZpbmVkIGluIG9wY29kZS9kMzB2LmggKi8KLWNvbnN0IHN0cnVjdCBkMzB2X29wY29kZSBkMzB2X29wY29kZV90YWJsZVtdID0gewotICB7ICJhYnMiLCBJQUxVMSwgMHg4LCB7IFNIT1JUX1UgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImFkZCIsIElBTFUxLCAweDAsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZDJoIiwgSUFMVTEsIDB4MSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImFkZGMiLCBJQUxVMSwgMHg0LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0MsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGxsIiwgSUFMVTEsIDB4MTAsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxsaCIsIElBTFUxLCAweDExLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsaGwiLCBJQUxVMSwgMHgxMiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGhoIiwgSUFMVTEsIDB4MTMsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhsbCIsIElBTFUxLCAweDE0LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhobGgiLCBJQUxVMSwgMHgxNSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGhsIiwgSUFMVTEsIDB4MTYsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhoaCIsIElBTFUxLCAweDE3LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZHMiLCBJQUxVMSwgMHg2LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkczJoIiwgSUFMVTEsIDB4NywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhbmQiLCBMT0dJQywgMHgxOCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhbmRmZyIsIExPR0lDLCAweDgsIHsgU0hPUlRfRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYXZnIiwgSUFMVTEsIDB4YSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImF2ZzJoIiwgSUFMVTEsIDB4YiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImJjbHIiLCBMT0dJQywgMHgzLCB7IFNIT1JUX0EgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiYm5vdCIsIExPR0lDLCAweDEsIHsgU0hPUlRfQSB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAotICB7ICJicmEiLCBCUkEsIDAsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJicmF0bnoiLCBCUkEsIDB4NCwgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJicmF0enIiLCBCUkEsIDB4NCwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnNldCIsIExPR0lDLCAweDIsIHsgU0hPUlRfQSB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAotICB7ICJic3IiLCBCUkEsIDB4MiwgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzcnRueiIsIEJSQSwgMHg2LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzcnR6ciIsIEJSQSwgMHg2LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJidHN0IiwgTE9HSUMsIDAsIHsgU0hPUlRfQUYgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiY21wIiwgTE9HSUMsIDB4QywgeyBTSE9SVF9DTVAsIExPTkdfQ01QIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJjbXB1IiwgTE9HSUMsIDB4RCwgeyBTSE9SVF9DTVBVLCBMT05HX0NNUCB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiZGJyYSIsIEJSQSwgMHgxMCwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRicmFpIiwgQlJBLCAweDE0LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJzciIsIEJSQSwgMHgxMiwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRic3JpIiwgQlJBLCAweDE2LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJ0IiwgQlJBLCAweGIsIHsgU0hPUlRfTk9ORSB9LCBNVSwgRkxBR19KU1IsIEZMQUdfTEtSLCAwIH0sCi0gIHsgImRqbXAiLCBCUkEsIDB4MTEsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGptcGkiLCBCUkEsIDB4MTUsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGpzciIsIEJSQSwgMHgxMywgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAotICB7ICJkanNyaSIsIEJSQSwgMHgxNywgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAotICB7ICJqbXAiLCBCUkEsIDB4MSwgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqbXB0bnoiLCBCUkEsIDB4NSwgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wdHpyIiwgQlJBLCAweDUsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqb2lubGwiLCBJQUxVMSwgMHhDLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpvaW5saCIsIElBTFUxLCAweEQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiam9pbmhsIiwgSUFMVTEsIDB4RSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqb2luaGgiLCBJQUxVMSwgMHhGLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpzciIsIEJSQSwgMHgzLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImpzcnRueiIsIEJSQSwgMHg3LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqc3J0enIiLCBCUkEsIDB4NywgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImxkMmgiLCBJTUVNLCAweDMsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkMnciLCBJTUVNLCAweDYsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNIHwgRkxBR18yV09SRCwgMCwgMCB9LAotICB7ICJsZDRiaCIsIElNRU0sIDB4NSwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0gfCBGTEFHXzJXT1JELCAwLCAwIH0sCi0gIHsgImxkNGJodSIsIElNRU0sIDB4ZCwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRiIiwgSU1FTSwgMCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkYnUiLCBJTUVNLCAweDksIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGgiLCBJTUVNLCAweDIsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGhoIiwgSU1FTSwgMHgxLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRodSIsIElNRU0sIDB4YSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkdyIsIElNRU0sIDB4NCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgIm1hYzAiLCBJQUxVMiwgMHgxNCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1hYzEiLCBJQUxVMiwgMHgxNCwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtYWNzMCIsIElBTFUyLCAweDE1LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibWFjczEiLCBJQUxVMiwgMHgxNSwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtb2RkZWMiLCBJTUVNLCAweDcsIHsgU0hPUlRfTU9EREVDIH0sIE1VLCAwLCAwLCAwIH0sCi0gIHsgIm1vZGluYyIsIElNRU0sIDB4NywgeyBTSE9SVF9NT0RJTkMgfSwgTVUsIDAsIDAsIDAgfSwKLSAgeyAibXN1YjAiLCBJQUxVMiwgMHgxNiwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1zdWIxIiwgSUFMVTIsIDB4MTYsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXN1YnMwIiwgSUFMVTIsIDB4MTcsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtc3ViczEiLCBJQUxVMiwgMHgxNywgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdWwiLCBJQUxVMiwgMHgxMCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm11bDJoIiwgSUFMVTIsIDAsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGxsIiwgSUFMVTIsIDB4NCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4bGgiLCBJQUxVMiwgMHg1LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhobCIsIElBTFUyLCAweDYsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGhoIiwgSUFMVTIsIDB4NywgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bHgiLCBJQUxVMiwgMHgxOCwgeyBTSE9SVF9BQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdWx4MmgiLCBJQUxVMiwgMHgxLCB7IFNIT1JUX0EyIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bHhzIiwgSUFMVTIsIDB4MTksIHsgU0hPUlRfQUEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXZmYWNjIiwgSUFMVTIsIDB4MWYsIHsgU0hPUlRfUkEgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAibXZmc3lzIiwgQlJBLCAweDFlLCB7IFNIT1JUX0MxIH0sIE1VLCBGTEFHX0FMTCwgRkxBR19BTEwsIDAgfSwKLSAgeyAibXZ0YWNjIiwgSUFMVTIsIDB4ZiwgeyBTSE9SVF9BQSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJtdnRzeXMiLCBCUkEsIDB4ZSwgeyBTSE9SVF9DMiB9LCBNVSwgRkxBR19BTEwsIEZMQUdfQUxMLCAwIH0sCi0gIHsgIm5vcCIsIEJSQSwgMHhGLCB7IFNIT1JUX05PTkUgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm5vdCIsIExPR0lDLCAweDE5LCB7IFNIT1JUX1UgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm5vdGZnIiwgTE9HSUMsIDB4OSwgeyBTSE9SVF9VRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAib3IiLCBMT0dJQywgMHgxYSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJvcmZnIiwgTE9HSUMsIDB4YSwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJyZWl0IiwgQlJBLCAweDgsIHsgU0hPUlRfTk9ORSB9LCBNVSwgRkxBR19TTSB8IEZMQUdfSk1QLCBGTEFHX1NNIHwgRkxBR19MS1IsIDAgfSwKLSAgeyAicmVwZWF0IiwgQlJBLCAweDE4LCB7IFNIT1JUX0QxLCBMT05HXzIgfSwgTVUsIEZMQUdfUlAsIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgInJlcGVhdGkiLCBCUkEsIDB4MWEsIHsgU0hPUlRfRDJCLCBMT05HX0RiIH0sIE1VLCBGTEFHX1JQLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJyb3QiLCBMT0dJQywgMHgxNCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJyb3QyaCIsIExPR0lDLCAweDE1LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInJ0ZCIsIEJSQSwgMHhhLCB7IFNIT1JUX05PTkUgfSwgTVUsIEZMQUdfSk1QLCBGTEFHX0xLUiwgMCB9LAotICB7ICJzYXQiLCBJQUxVMiwgMHg4LCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgInNhdDJoIiwgSUFMVTIsIDB4OSwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXRobCIsIElBTFUyLCAweDFjLCB7IFNIT1JUX0E1IH0sIElVLCBGTEFHX0FERFNVQnBwcCwgMCwgMCB9LAotICB7ICJzYXRoaCIsIElBTFUyLCAweDFkLCB7IFNIT1JUX0E1IH0sIElVLCBGTEFHX0FERFNVQnBwcCwgMCwgMCB9LAotICB7ICJzYXR6IiwgSUFMVTIsIDB4YSwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXR6MmgiLCBJQUxVMiwgMHhiLCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgInNyYSIsIExPR0lDLCAweDEwLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYTJoIiwgTE9HSUMsIDB4MTEsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JhaGgiLCBMT0dJQywgMHg1LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYWhsIiwgTE9HSUMsIDB4NCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmMiLCBMT0dJQywgMHgxNiwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic3JsIiwgTE9HSUMsIDB4MTIsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsMmgiLCBMT0dJQywgMHgxMywgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmxoaCIsIExPR0lDLCAweDcsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsaGwiLCBMT0dJQywgMHg2LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInN0MmgiLCBJTUVNLCAweDEzLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAotICB7ICJzdDJ3IiwgSU1FTSwgMHgxNiwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHXzJXT1JELCAwIH0sCi0gIHsgInN0NGhiIiwgSU1FTSwgMHgxNSwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHXzJXT1JELCAwIH0sCi0gIHsgInN0YiIsIElNRU0sIDB4MTAsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAotICB7ICJzdGgiLCBJTUVNLCAweDEyLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3RoaCIsIElNRU0sIDB4MTEsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAotICB7ICJzdHciLCBJTUVNLCAweDE0LCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3ViIiwgSUFMVTEsIDB4MiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViMmgiLCBJQUxVMSwgMHgzLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3ViYiIsIElBTFUxLCAweDUsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19DLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxsbCIsIElBTFUxLCAweDE4LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxsaCIsIElBTFUxLCAweDE5LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxobCIsIElBTFUxLCAweDFhLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxoaCIsIElBTFUxLCAweDFiLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhsbCIsIElBTFUxLCAweDFjLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhsaCIsIElBTFUxLCAweDFkLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhobCIsIElBTFUxLCAweDFlLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhoaCIsIElBTFUxLCAweDFmLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAidHJhcCIsIEJSQSwgMHg5LCB7IFNIT1JUX0IxLCBTSE9SVF9UfSwgTVUsIEZMQUdfSlNSLCBGTEFHX1NNIHwgRkxBR19MS1IsIDAgfSwKLSAgeyAieG9yIiwgTE9HSUMsIDB4MWIsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAieG9yZmciLCBMT0dJQywgMHhiLCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCwgeyAwIH0sIDAsIDAsIDAsIDAgfSwKLX07Ci0KLQotLyogbm93IGRlZmluZSB0aGUgb3BlcmFuZCB0eXBlcyAqLwotLyogZm9ybWF0IGlzIGxlbmd0aCwgYml0cywgcG9zaXRpb24sIGZsYWdzICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9vcGVyYW5kIGQzMHZfb3BlcmFuZF90YWJsZVtdID0KLXsKLSNkZWZpbmUgVU5VU0VECSgwKQotICB7IDAsIDAsIDAsIDAgfSwKLSNkZWZpbmUgUmEJKFVOVVNFRCArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIFJhMgkoUmEgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVHxPUEVSQU5EXzJSRUcgfSwKLSNkZWZpbmUgUmEzCShSYTIgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJiCShSYTMgKyAxKQotICB7IDYsIDYsIDYsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJjCShSYiArIDEpCi0gIHsgNiwgNiwgMTIsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFhCShSYyArIDEpCi0gIHsgNiwgMSwgMCwgT1BFUkFORF9BQ0N8T1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIEFiCShBYSArIDEpCi0gIHsgNiwgMSwgNiwgT1BFUkFORF9BQ0N8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgSU1NNQkoQWIgKyAxKQotICB7IDYsIDUsIDEyLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBJTU01VQkoSU1NNSArIDEpCi0gIHsgNiwgNSwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIElNTTVTMwkoSU1NNVUgKyAxKQotICB7IDYsIDUsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBJTU02CShJTU01UzMgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBJTU02VQkoSU1NNiArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgSU1NNlUyCShJTU02VSArIDEpCi0gIHsgNiwgNiwgMTIsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIElNTTZTMwkoSU1NNlUyICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIElNTTEyUzMJKElNTTZTMyArIDEpCi0gIHsgMTIsIDEyLCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUR8T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBJTU0xMlMzVSAoSU1NMTJTMyArIDEpCi0gIHsgMTIsIDEyLCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBJTU0xOFMzCShJTU0xMlMzVSArIDEpCi0gIHsgMTgsIDE4LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUR8T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBJTU0zMgkoSU1NMThTMyArIDEpCi0gIHsgMzIsIDMyLCAwLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBGYQkoSU1NMzIgKyAxKQotICB7IDYsIDMsIDAsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GTEFHIHwgT1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIEZiCShGYSArIDEpCi0gIHsgNiwgMywgNiwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZMQUcgfSwKLSNkZWZpbmUgRmMJKEZiICsgMSkKLSAgeyA2LCAzLCAxMiwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZMQUcgfSwKLSNkZWZpbmUgQVRTSUdOCShGYyArIDEpCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9BVFNJR059LAotI2RlZmluZSBBVFBBUgkoQVRTSUdOICsgMSkJLyogIkAoIiAqLwotICB7IDAsIDAsIDAsIE9QRVJBTkRfQVRQQVJ9LAotI2RlZmluZSBQTFVTCShBVFBBUiArIDEpCS8qIHBvc3RpbmNyZW1lbnQgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX1BMVVN9LAotI2RlZmluZSBNSU5VUwkoUExVUyArIDEpCS8qIHBvc3RkZWNyZW1lbnQgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX01JTlVTfSwKLSNkZWZpbmUgQVRNSU5VUwkoTUlOVVMgKyAxKQkvKiBwcmVkZWNyZW1lbnQgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX0FUTUlOVVN9LAotI2RlZmluZSBDYQkoQVRNSU5VUyArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x8T1BFUkFORF9ERVNUfSwKLSNkZWZpbmUgQ2IJKENhICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDYsIDYsIDYsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTH0sCi0jZGVmaW5lIENDCShDYiArIDEpCS8qIGNvbmRpdGlvbiBjb2RlIChDTVBjYyBhbmQgQ01QVWNjKSAqLwotICB7IDMsIDMsIC0zLCBPUEVSQU5EX05BTUV9LAotI2RlZmluZSBGYTIJKENDICsgMSkJLyogZmxhZyByZWdpc3RlciAoQ01QY2MgYW5kIENNUFVjYykgKi8KLSAgeyAzLCAzLCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0ZMQUd8T1BFUkFORF9ERVNUfSwKLSNkZWZpbmUgRmFrZQkoRmEyICsgMSkJLyogcGxhY2UgaG9sZGVyIGZvciAiaWQiIGZpZWxkIGluIG12ZnN5cyBhbmQgbXZ0c3lzICovCi0gIHsgNiwgMiwgMTIsIE9QRVJBTkRfU1BFQ0lBTH0sCi19OwotCi0vKiBub3cgd2UgbmVlZCB0byBkZWZpbmUgdGhlIGluc3RydWN0aW9uIGZvcm1hdHMgKi8KLWNvbnN0IHN0cnVjdCBkMzB2X2Zvcm1hdCBkMzB2X2Zvcm1hdF90YWJsZVtdID0KLXsKLSAgeyAwLCAwLCB7IDAgfSB9LAotICB7IFNIT1JUX00sIDAsIHsgUmEsIEFUUEFSLCBSYiwgUmMgfSB9LAkvKiBSYSxAKFJiLFJjKSAqLwotICB7IFNIT1JUX00sIDEsIHsgUmEsIEFUUEFSLCBSYiwgUExVUywgUmMgfSB9LAkvKiBSYSxAKFJiKyxSYykgKi8KLSAgeyBTSE9SVF9NLCAyLCB7IFJhLCBBVFBBUiwgUmIsIElNTTYgfSB9LAkvKiBSYSxAKFJiLGltbTYpICovCi0gIHsgU0hPUlRfTSwgMywgeyBSYSwgQVRQQVIsIFJiLCBNSU5VUywgUmMgfSB9LAkvKiBSYSxAKFJiLSxSYykgKi8KLSAgeyBTSE9SVF9NMiwgMCwgeyBSYTIsIEFUUEFSLCBSYiwgUmMgfSB9LAkvKiBSYSxAKFJiLFJjKSAqLwotICB7IFNIT1JUX00yLCAxLCB7IFJhMiwgQVRQQVIsIFJiLCBQTFVTLCBSYyB9IH0sCS8qIFJhLEAoUmIrLFJjKSAqLwotICB7IFNIT1JUX00yLCAyLCB7IFJhMiwgQVRQQVIsIFJiLCBJTU02IH0gfSwJLyogUmEsQChSYixpbW02KSAqLwotICB7IFNIT1JUX00yLCAzLCB7IFJhMiwgQVRQQVIsIFJiLCBNSU5VUywgUmMgfSB9LAkvKiBSYSxAKFJiLSxSYykgKi8KLSAgeyBTSE9SVF9BLCAwLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BLCAyLCB7IFJhLCBSYiwgSU1NNiB9IH0sCQkvKiBSYSxSYixpbW02ICovCi0gIHsgU0hPUlRfQjEsIDAsIHsgUmMgfSB9LAkJCS8qIFJjICovCi0gIHsgU0hPUlRfQjIsIDIsIHsgSU1NMThTMyB9IH0sCQkJLyogaW1tMTggKi8KLSAgeyBTSE9SVF9CMywgMCwgeyBSYTMsIFJjIH0gfSwJCQkvKiBSYSxSYyAqLwotICB7IFNIT1JUX0IzLCAyLCB7IFJhMywgSU1NMTJTMyB9IH0sCQkvKiBSYSxpbW0xMiAqLwotICB7IFNIT1JUX0IzYiwgMSwgeyBSYTMsIFJjIH0gfSwJCS8qIFJhLFJjICovCi0gIHsgU0hPUlRfQjNiLCAzLCB7IFJhMywgSU1NMTJTMyB9IH0sCQkvKiBSYSxpbW0xMiAqLwotICB7IFNIT1JUX0QxLCAwLCB7IFJhLCBSYyB9IH0sCQkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9EMSwgMiwgeyBSYSwgSU1NMTJTMyB9IH0sCQkvKiBSYSxpbW0xMnMzICovCi0gIHsgU0hPUlRfRDIsIDAsIHsgSU1NNlMzLCBSYyB9IH0sCQkvKiBpbW02czMsUmMgKi8KLSAgeyBTSE9SVF9EMiwgMiwgeyBJTU02UzMsIElNTTEyUzMgfSB9LAkJLyogaW1tNnMzLGltbTEyczMgKi8KLSAgeyBTSE9SVF9EMkIsIDAsIHsgSU1NNlUsIFJjIH0gfSwJCS8qIGltbTZ1LFJjICovCi0gIHsgU0hPUlRfRDJCLCAyLCB7IElNTTZVLCBJTU0xMlMzVSB9IH0sCS8qIGltbTZ1LGltbTEyczN1ICovCi0gIHsgU0hPUlRfVSwgMCwgeyBSYSwgUmIgfSB9LAkJCS8qIFJhLFJiICovCi0gIHsgU0hPUlRfVSwgMiwgeyBSYSwgSU1NMTJTMyB9IH0sCQkvKiBSYSxpbW0xMiAocmVwZWF0KSAqLwotICB7IFNIT1JUX0YsIDAsIHsgRmEsIEZiLCBGYyB9IH0sCQkvKiBGYSxGYixGYyAgKG9yZmcsIHhvcmZnKSAqLwotICB7IFNIT1JUX0YsIDIsIHsgRmEsIEZiLCBJTU02IH0gfSwJCS8qIEZhLEZiLGltbTYgKi8KLSAgeyBTSE9SVF9BRiwgMCwgeyBGYSwgUmIsIFJjIH0gfSwJCS8qIEZhLFJiLFJjICovCi0gIHsgU0hPUlRfQUYsIDIsIHsgRmEsIFJiLCBJTU02IH0gfSwJCS8qIEZhLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9ULCAyLCB7IElNTTUgfSB9LAkJCS8qIGltbTVzMyAgICh0cmFwKSAqLwotICB7IFNIT1JUX0E1LCAwLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BNSwgMiwgeyBSYSwgUmIsIElNTTUgfSB9LAkJLyogUmEsUmIsaW1tNSAgICAoc2F0KikgKi8KLSAgeyBTSE9SVF9DTVAsIDAsIHsgQ0MsIEZhMiwgUmIsIFJjfSB9LAkJLyogQ0MgIEZhMixSYixSYyAqLwotICB7IFNIT1JUX0NNUCwgMiwgeyBDQywgRmEyLCBSYiwgSU1NNn0gfSwJLyogQ0MgIEZhMixSYixpbW02ICovCi0gIHsgU0hPUlRfQ01QVSwgMCwgeyBDQywgRmEyLCBSYiwgUmN9IH0sCS8qIENDICBGYTIsUmIsUmMgKi8KLSAgeyBTSE9SVF9DTVBVLCAyLCB7IENDLCBGYTIsIFJiLCBJTU02VTJ9IH0sCS8qIENDICBGYTIsUmIsaW1tNiAqLwotICB7IFNIT1JUX0ExLCAxLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgZm9yIE1BQyB3aGVyZSBhPTEgKi8KLSAgeyBTSE9SVF9BMSwgMywgeyBSYSwgUmIsIElNTTYgfSB9LAkJLyogUmEsUmIsaW1tNiBmb3IgTUFDIHdoZXJlIGE9MSAqLwotICB7IFNIT1JUX0FBLCAwLCB7IEFhLCBSYiwgUmMgfSB9LAkJLyogQWEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BQSwgMiwgeyBBYSwgUmIsIElNTTYgfSB9LAkJLyogQWEsUmIsaW1tNiAqLwotICB7IFNIT1JUX1JBLCAwLCB7IFJhLCBBYiwgUmMgfSB9LAkJLyogUmEsQWIsUmMgKi8KLSAgeyBTSE9SVF9SQSwgMiwgeyBSYSwgQWIsIElNTTZVMiB9IH0sCQkvKiBSYSxBYixpbW02dSAqLwotICB7IFNIT1JUX01PRElOQywgMSwgeyBSYiwgSU1NNSB9IH0sCQkvKiBSYixpbW01IChtb2RpbmMpICovCi0gIHsgU0hPUlRfTU9EREVDLCAzLCB7IFJiLCBJTU01IH0gfSwJCS8qIFJiLGltbTUgKG1vZGRlYykgKi8KLSAgeyBTSE9SVF9DMSwgMCwgeyBSYSwgQ2IsIEZha2UgfSB9LAkJLyogUmEsQ2IgKG12ZnN5cykgKi8KLSAgeyBTSE9SVF9DMiwgMCwgeyBDYSwgUmIsIEZha2UgfSB9LAkJLyogQ2EsUmIgKG12dHN5cykgKi8KLSAgeyBTSE9SVF9VRiwgMCwgeyBGYSwgRmIgfSB9LAkJCS8qIEZhLEZiICAobm90ZmcpICovCi0gIHsgU0hPUlRfQTIsIDAsIHsgUmEyLCBSYiwgUmMgfSB9LAkJLyogUmEyLFJiLFJjICovCi0gIHsgU0hPUlRfQTIsIDIsIHsgUmEyLCBSYiwgSU1NNiB9IH0sCQkvKiBSYTIsUmIsaW1tNiAqLwotICB7IFNIT1JUX0E1UywgMCwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjICovCi0gIHsgU0hPUlRfQTVTLCAyLCB7IFJhLCBSYiwgSU1NNVUgfSB9LAkJLyogUmEsUmIsaW1tNXUgICAoc2hpZnRzKSAqLwotICB7IFNIT1JUX05PTkUsIDAsIHsgMCB9IH0sCQkJLyogbm8gb3BlcmFuZHMgKG5vcCwgcmVpdCkgKi8KLSAgeyBMT05HLCAyLCB7IFJhLCBSYiwgSU1NMzIgfSB9LAkJLyogUmEsUmIsaW1tMzIgKi8KLSAgeyBMT05HX1UsIDIsIHsgSU1NMzIgfSB9LAkJCS8qIGltbTMyICovCi0gIHsgTE9OR19BRiwgMiwgeyBGYSwgUmIsIElNTTMyIH0gfSwJCS8qIEZhLFJiLGltbTMyICovCi0gIHsgTE9OR19DTVAsIDIsIHsgQ0MsIEZhMiwgUmIsIElNTTMyfSB9LAkvKiBDQyAgRmEyLFJiLGltbTMyICovCi0gIHsgTE9OR19NLCAyLCB7IFJhLCBBVFBBUiwgUmIsIElNTTMyIH0gfSwJLyogUmEsQChSYixpbW0zMikgKi8KLSAgeyBMT05HX00yLCAyLCB7IFJhMiwgQVRQQVIsIFJiLCBJTU0zMiB9IH0sCS8qIFJhLEAoUmIsaW1tMzIpICovCi0gIHsgTE9OR18yLCAyLCB7IFJhMywgSU1NMzIgfSB9LAkJLyogUmEsaW1tMzIgKi8KLSAgeyBMT05HXzJiLCAzLCB7IFJhMywgSU1NMzIgfSB9LAkJLyogUmEsaW1tMzIgKi8KLSAgeyBMT05HX0QsIDIsIHsgSU1NNlMzLCBJTU0zMiB9IH0sCQkvKiBpbW02czMsaW1tMzIgKi8KLSAgeyBMT05HX0RiLCAyLCB7IElNTTZVLCBJTU0zMiB9IH0sCQkvKiBpbW02LGltbTMyICovCi0gIHsgMCwgMCwgeyAwIH0gfSwKLX07Ci0KLWNvbnN0IGNoYXIgKmQzMHZfZWNjX25hbWVzW10gPQotewotICAiYWwiLAotICAidHgiLAotICAiZngiLAotICAieHQiLAotICAieGYiLAotICAidHQiLAotICAidGYiLAotICAicmVzIgotfTsKLQotY29uc3QgY2hhciAqZDMwdl9jY19uYW1lc1tdID0KLXsKLSAgImVxIiwKLSAgIm5lIiwKLSAgImd0IiwKLSAgImdlIiwKLSAgImx0IiwKLSAgImxlIiwKLSAgInBzIiwKLSAgIm5nIiwKLSAgTlVMTAotfTsKZGlmZiAtLWdpdCBhL29wY29kZXMvZGVwLWluLnNlZCBiL29wY29kZXMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwZGVlNTYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotcy9cXFxuICovIC9nCi10IGxvb3AKLQotcyFcLm86IS5sbzohCi1zISBAQkZEX0hAISAkKEJGRF9IKSFnCi1zIUBJTkNESVJAISQoSU5DRElSKSFnCi1zIUBCRkRESVJAISQoQkZERElSKSFnCi1zIUBTUkNESVJALyEhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi1zLyAqOi86L2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9vcGNvZGVzL2Rpcy1idWYuYyBiL29wY29kZXMvZGlzLWJ1Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzZiZTJlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZGlzLWJ1Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGZyb20gYSBidWZmZXIsIGZvciBHTlUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogR2V0IExFTkdUSCBieXRlcyBmcm9tIGluZm8ncyBidWZmZXIsIGF0IHRhcmdldCBhZGRyZXNzIG1lbWFkZHIuCi0gICBUcmFuc2ZlciB0aGVtIHRvIG15YWRkci4gICovCi1pbnQKLWJ1ZmZlcl9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW5ndGgsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgYmZkX2J5dGUgKm15YWRkcjsKLSAgICAgaW50IGxlbmd0aDsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmIChtZW1hZGRyIDwgaW5mby0+YnVmZmVyX3ZtYQotICAgICAgfHwgbWVtYWRkciArIGxlbmd0aCA+IGluZm8tPmJ1ZmZlcl92bWEgKyBpbmZvLT5idWZmZXJfbGVuZ3RoKQotICAgIC8qIE91dCBvZiBib3VuZHMuICBVc2UgRUlPIGJlY2F1c2UgR0RCIHVzZXMgaXQuICAqLwotICAgIHJldHVybiBFSU87Ci0gIG1lbWNweSAobXlhZGRyLCBpbmZvLT5idWZmZXIgKyAobWVtYWRkciAtIGluZm8tPmJ1ZmZlcl92bWEpLCBsZW5ndGgpOwotICByZXR1cm4gMDsKLX0KLQotLyogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvCi0gICBhbiBlcnJvciByZXR1cm4gZnJvbSBidWZmZXJfcmVhZF9tZW1vcnkuICAqLwotdm9pZAotcGVycm9yX21lbW9yeSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKQotICAgICBpbnQgc3RhdHVzOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAoc3RhdHVzICE9IEVJTykKLSAgICAvKiBDYW4ndCBoYXBwZW4uICAqLwotICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCBfKCJVbmtub3duIGVycm9yICVkXG4iKSwgc3RhdHVzKTsKLSAgZWxzZQotICAgIC8qIEFjdHVhbGx5LCBhZGRyZXNzIGJldHdlZW4gbWVtYWRkciBhbmQgbWVtYWRkciArIGxlbiB3YXMKLSAgICAgICBvdXQgb2YgYm91bmRzLiAgKi8KLSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwKLQkJCV8oIkFkZHJlc3MgMHgleCBpcyBvdXQgb2YgYm91bmRzLlxuIiksIG1lbWFkZHIpOwotfQotCi0vKiBUaGlzIGNvdWxkIGJlIGluIGEgc2VwYXJhdGUgZmlsZSwgdG8gc2F2ZSBtaW5pc2N1bGUgYW1vdW50cyBvZiBzcGFjZQotICAgaW4gc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuICAqLwotCi0vKiBKdXN0IHByaW50IHRoZSBhZGRyZXNzIGlzIGhleC4gIFRoaXMgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBldmVuCi0gICB0aG91Z2ggYm90aCBHREIgYW5kIG9iamR1bXAgcHJvdmlkZSB0aGVpciBvd24gKHRvIHByaW50IHN5bWJvbGljCi0gICBhZGRyZXNzZXMpLiAgKi8KLQotdm9pZAotZ2VuZXJpY19wcmludF9hZGRyZXNzIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBhZGRyKTsKLX0KLQotLyogSnVzdCBjb25jYXRlbmF0ZSB0aGUgYWRkcmVzcyBhcyBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvcgotICAgY29tcGxldGVuZXNzIGV2ZW4gdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0bwotICAgcHJpbnQgc3ltYm9saWMgYWRkcmVzc2VzKS4gICovCi0KLXZvaWQKLWdlbmVyaWNfc3RyY2F0X2FkZHJlc3MgKGFkZHIsIGJ1ZiwgbGVuKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbjsKLXsKLSAgaWYgKGJ1ZiAhPSAoY2hhciAqKU5VTEwgJiYgbGVuID4gMCkKLSAgICB7Ci0gICAgICBjaGFyIHRtcEJ1ZlszMF07Ci0KLSAgICAgIHNwcmludGZfdm1hICh0bXBCdWYsIGFkZHIpOwotICAgICAgaWYgKChzdHJsZW4gKGJ1ZikgKyBzdHJsZW4gKHRtcEJ1ZikpIDw9IGxlbikKLQlzdHJjYXQgKGJ1ZiwgdG1wQnVmKTsKLSAgICAgIGVsc2UKLQlzdHJuY2F0IChidWYsIHRtcEJ1ZiwgKGxlbiAtIHN0cmxlbihidWYpKSk7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLS8qIEp1c3QgcmV0dXJuIHRoZSBnaXZlbiBhZGRyZXNzLiAgKi8KLQotaW50Ci1nZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMgYi9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmQ1ZDUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qIFNlbGVjdCBkaXNhc3NlbWJseSByb3V0aW5lIGZvciBzcGVjaWZpZWQgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLSNpZmRlZiBBUkNIX2FsbAotI2RlZmluZSBBUkNIX2EyOWsKLSNkZWZpbmUgQVJDSF9hbHBoYQotI2RlZmluZSBBUkNIX2FyYwotI2RlZmluZSBBUkNIX2FybQotI2RlZmluZSBBUkNIX2QxMHYKLSNkZWZpbmUgQVJDSF9kMzB2Ci0jZGVmaW5lIEFSQ0hfaDgzMDAKLSNkZWZpbmUgQVJDSF9oODUwMAotI2RlZmluZSBBUkNIX2hwcGEKLSNkZWZpbmUgQVJDSF9pMzg2Ci0jZGVmaW5lIEFSQ0hfaTk2MAotI2RlZmluZSBBUkNIX2ZyMzAKLSNkZWZpbmUgQVJDSF9tMzJyCi0jZGVmaW5lIEFSQ0hfbTY4awotI2RlZmluZSBBUkNIX204OGsKLSNkZWZpbmUgQVJDSF9tY29yZQotI2RlZmluZSBBUkNIX21pcHMKLSNkZWZpbmUgQVJDSF9tbjEwMjAwCi0jZGVmaW5lIEFSQ0hfbW4xMDMwMAotI2RlZmluZSBBUkNIX25zMzJrCi0jZGVmaW5lIEFSQ0hfcG93ZXJwYwotI2RlZmluZSBBUkNIX3JzNjAwMAotI2RlZmluZSBBUkNIX3NoCi0jZGVmaW5lIEFSQ0hfc3BhcmMKLSNkZWZpbmUgQVJDSF90aWMzMAotI2RlZmluZSBBUkNIX3RpYzgwCi0jZGVmaW5lIEFSQ0hfdjg1MAotI2RlZmluZSBBUkNIX3ZheAotI2RlZmluZSBBUkNIX3c2NQotI2RlZmluZSBBUkNIX3o4awotI2VuZGlmCi0KLQotZGlzYXNzZW1ibGVyX2Z0eXBlCi1kaXNhc3NlbWJsZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGEgPSBiZmRfZ2V0X2FyY2ggKGFiZmQpOwotICBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGU7Ci0KLSAgc3dpdGNoIChhKQotICAgIHsKLSAgICAgIC8qIElmIHlvdSBhZGQgYSBjYXNlIHRvIHRoaXMgdGFibGUsIGFsc28gYWRkIGl0IHRvIHRoZQotCSBBUkNIX2FsbCBkZWZpbml0aW9uIHJpZ2h0IGFib3ZlIHRoaXMgZnVuY3Rpb24uICAqLwotI2lmZGVmIEFSQ0hfYTI5awotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIC8qIEFzIGZhciBhcyBJIGtub3cgd2Ugb25seSBoYW5kbGUgYmlnLWVuZGlhbiAyOWsgb2JqZWN0cy4gICovCi0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX2EyOWs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfYWxwaGEKLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2FscGhhOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2FyYwotICAgIGNhc2UgYmZkX2FyY2hfYXJjOgotICAgICAgewotCWRpc2Fzc2VtYmxlID0gYXJjX2dldF9kaXNhc3NlbWJsZXIgKGJmZF9nZXRfbWFjaCAoYWJmZCksCi0JCQkJCSAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkpOwotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0jaWZkZWYgQVJDSF9hcm0KLSAgICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19hcm07Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9hcm07Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZDEwdgotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9kMTB2OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2QzMHYKLSAgICBjYXNlIGJmZF9hcmNoX2QzMHY6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fZDMwdjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9oODMwMAotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaCkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDBoOwotICAgICAgZWxzZSBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDBzOwotICAgICAgZWxzZSAKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaDg1MDAKLSAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4NTAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2hwcGEKLSAgICBjYXNlIGJmZF9hcmNoX2hwcGE6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faHBwYTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9pMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCkKLSAgICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2kzODZfaW50ZWw7Ci0gICAgICBlbHNlCi0gICAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9pMzg2X2F0dDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9pOTYwCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2k5NjA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZnIzMAotICAgIGNhc2UgYmZkX2FyY2hfZnIzMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9mcjMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX20zMnIKLSAgICBjYXNlIGJmZF9hcmNoX20zMnI6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbTMycjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tNjhrCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX202OGs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbTg4awotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tODhrOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX25zMzJrCi0gICAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9uczMyazsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tY29yZQotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbWNvcmU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbWlwcwotICAgIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19taXBzOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9saXR0bGVfbWlwczsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tbjEwMjAwCi0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX21uMTAyMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbW4xMDMwMAotICAgIGNhc2UgYmZkX2FyY2hfbW4xMDMwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tbjEwMzAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3Bvd2VycGMKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfcG93ZXJwYzsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbGl0dGxlX3Bvd2VycGM7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfcnM2MDAwCi0gICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fcnM2MDAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3NoCi0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NoOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9zaGw7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfc3BhcmMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NwYXJjOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3RpYzMwCi0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl90aWMzMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF90aWM4MAotICAgIGNhc2UgYmZkX2FyY2hfdGljODA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdGljODA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdjg1MAotICAgIGNhc2UgYmZkX2FyY2hfdjg1MDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl92ODUwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3c2NQotICAgIGNhc2UgYmZkX2FyY2hfdzY1OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3c2NTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF96OGsKLSAgICBjYXNlIGJmZF9hcmNoX3o4azoKLSAgICAgIGlmIChiZmRfZ2V0X21hY2goYWJmZCkgPT0gYmZkX21hY2hfejgwMDEpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3o4MDAxOwotICAgICAgZWxzZSAKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fejgwMDI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdmF4Ci0gICAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdmF4OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gZGlzYXNzZW1ibGU7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtYXNtLmMgYi9vcGNvZGVzL2ZyMzAtYXNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNWNjZGMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWFzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qIEFzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCi0gICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1hc20uaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHBhcnNlX2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBjb25zdCBjaGFyICoqLCBDR0VOX0ZJRUxEUyAqKSk7Ci0MCi0vKiAtLSBhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLwotCi0vKiAtLSBhc20uYyAqLwotLyogSGFuZGxlIHJlZ2lzdGVyIGxpc3RzIGZvciBMRE14IGFuZCBTVE14ICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9yZWdpc3Rlcl9udW1iZXIgKHN0cnApCi0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotewotICBpbnQgcmVnbm87Ci0gIGlmICgqKnN0cnAgPCAnMCcgfHwgKipzdHJwID4gJzknKQotICAgIHJldHVybiAtMTsgLyogZXJyb3IgKi8KLSAgcmVnbm8gPSAqKnN0cnAgLSAnMCc7Ci0gICsrKnN0cnA7Ci0KLSAgaWYgKCoqc3RycCA+PSAnMCcgJiYgKipzdHJwIDw9ICc5JykKLSAgICB7Ci0gICAgICByZWdubyA9IHJlZ25vICogMTAgKyAoKipzdHJwIC0gJzAnKTsKLSAgICAgICsrKnN0cnA7Ci0gICAgfQotCi0gIHJldHVybiByZWdubzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgaGlnaF9sb3csIGxvYWRfc3RvcmUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotICAgICBpbnQgaGlnaF9sb3c7ICAgLyogMCA9PSBoaWdoLCAxID09IGxvdyAqLwotICAgICBpbnQgbG9hZF9zdG9yZTsgLyogMCA9PSBsb2FkLCAxID09IHN0b3JlICovCi17Ci0gIGludCByZWdubzsKLSAgKnZhbHVlcCA9IDA7Ci0gIHdoaWxlICgqKnN0cnAgJiYgKipzdHJwICE9ICcpJykKLSAgICB7Ci0gICAgICBpZiAoKipzdHJwICE9ICdSJyAmJiAqKnN0cnAgIT0gJ3InKQotCWJyZWFrOwotICAgICAgKysqc3RycDsKLQotICAgICAgcmVnbm8gPSBwYXJzZV9yZWdpc3Rlcl9udW1iZXIgKHN0cnApOwotICAgICAgaWYgKHJlZ25vID09IC0xKQotCXJldHVybiAiUmVnaXN0ZXIgbnVtYmVyIGlzIG5vdCB2YWxpZCI7Ci0gICAgICBpZiAocmVnbm8gPiA3ICYmICFoaWdoX2xvdykKLQlyZXR1cm4gIlJlZ2lzdGVyIG11c3QgYmUgYmV0d2VlbiByMCBhbmQgcjciOwotICAgICAgaWYgKHJlZ25vIDwgOCAmJiBoaWdoX2xvdykKLQlyZXR1cm4gIlJlZ2lzdGVyIG11c3QgYmUgYmV0d2VlbiByOCBhbmQgcjE1IjsKLQotICAgICAgaWYgKGhpZ2hfbG93KQotCXJlZ25vIC09IDg7Ci0KLSAgICAgIGlmIChsb2FkX3N0b3JlKSAvKiBtYXNrIGlzIHJldmVyc2VkIGZvciBzdG9yZSAqLwotCSp2YWx1ZXAgfD0gMHg4MCA+PiByZWdubzsKLSAgICAgIGVsc2UKLQkqdmFsdWVwIHw9IDEgPDwgcmVnbm87Ci0KLSAgICAgIGlmICgqKnN0cnAgPT0gJywnKQotCXsKLQkgIGlmICgqKCpzdHJwICsgMSkgPT0gJyknKQotCSAgICBicmVhazsKLQkgICsrKnN0cnA7Ci0JfQotICAgIH0KLQotICBpZiAoISpzdHJwIHx8ICoqc3RycCAhPSAnKScpCi0gICAgcmV0dXJuICJSZWdpc3RlciBsaXN0IGlzIG5vdCB2YWxpZCI7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDAvKmxvdyovLCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDEvKmhpZ2gqLywgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICByZXR1cm4gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMC8qbG93Ki8sIDEvKnN0b3JlKi8pOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oaV9yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDEvKmhpZ2gqLywgMS8qc3RvcmUqLyk7Ci19Ci0KLS8qIC0tICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgcGFyc2luZy4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotY29uc3QgY2hhciAqCi1mcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHN0cnAsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IGNoYXIgKiogc3RycDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2c7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsICYgZmllbGRzLT5mX0NSaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsICYgZmllbGRzLT5mX0NSaik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTMsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTQsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTUsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SaWMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmpjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgJiBmaWVsZHMtPmZfUnMxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgJiBmaWVsZHMtPmZfUnMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9DQywgJmZpZWxkcy0+Zl9jYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0NDQywgJmZpZWxkcy0+Zl9jY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJUjEwLCAmZmllbGRzLT5mX2RpcjEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJUjgsICZmaWVsZHMtPmZfZGlyOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVI5LCAmZmllbGRzLT5mX2RpcjkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElTUDEwLCAmZmllbGRzLT5mX2Rpc3AxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJU1A4LCAmZmllbGRzLT5mX2Rpc3A4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElTUDksICZmaWVsZHMtPmZfZGlzcDkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JMjAsICZmaWVsZHMtPmZfaTIwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfSTMyLCAmZmllbGRzLT5mX2kzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfSTgsICZmaWVsZHMtPmZfaTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9MQUJFTDEyLCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWwxMiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0xBQkVMOSwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9NNCwgJmZpZWxkcy0+Zl9tNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3BzLCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQsICZmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xELCAmZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NULCAmZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1MxMCwgJmZpZWxkcy0+Zl9zMTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VMTAsICZmaWVsZHMtPmZfdTEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VNCwgJmZpZWxkcy0+Zl91NCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1U0QywgJmZpZWxkcy0+Zl91NGMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1U4LCAmZmllbGRzLT5mX3U4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVURJU1A2LCAmZmllbGRzLT5mX3VkaXNwNik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHBhcnNpbmcuXG4iKSwgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLWNnZW5fcGFyc2VfZm4gKiBjb25zdCBmcjMwX2NnZW5fcGFyc2VfaGFuZGxlcnNbXSA9IAotewotICBwYXJzZV9pbnNuX25vcm1hbCwKLX07Ci0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X2FzbSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGZyMzBfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBmcjMwX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wYXJzZV9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX3BhcnNlX2hhbmRsZXJzWzBdOwotICBjZC0+cGFyc2Vfb3BlcmFuZCA9IGZyMzBfY2dlbl9wYXJzZV9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IGluc24gcGFyc2VyLgotCi0gICBUaGUgc3ludGF4IHN0cmluZyBpcyBzY2FubmVkIGFuZCBvcGVyYW5kcyBhcmUgcGFyc2VkIGFuZCBzdG9yZWQgaW4gRklFTERTLgotICAgUmVsb2NzIGFyZSBxdWV1ZWQgYXMgd2UgZ28gdmlhIG90aGVyIGNhbGxiYWNrcy4KLQotICAgPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBhbiBhbGwtb3Itbm90aGluZyBwYXJzZXIuICBJZiB3ZSBmYWlsIHRvCi0gICBwYXJzZSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHJldHVybiAwIGFuZCB0aGUgY2FsbGVyIHdpbGwgc3RhcnQgb3ZlciBmcm9tCi0gICB0aGUgYmVnaW5uaW5nLiAgQmFja3RyYWNraW5nIHdpbGwgYmUgbmVjZXNzYXJ5IGluIHBhcnNpbmcgc3ViZXhwcmVzc2lvbnMsCi0gICBidXQgdGhhdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS4gIE5vdCBoYW5kbGluZyBiYWNrdHJhY2tpbmcgaGVyZSBtYXkgZ2V0Ci0gICBleHBlbnNpdmUgaW4gdGhlIGNhc2Ugb2YgdGhlIG02OGsuICBEZWFsIHdpdGggbGF0ZXIuCi0KLSAgIFJldHVybnMgTlVMTCBmb3Igc3VjY2VzcywgYW4gZXJyb3IgbWVzc2FnZSBmb3IgZmFpbHVyZS4KLSovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2luc25fbm9ybWFsIChjZCwgaW5zbiwgc3RycCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotewotICAvKiA/Pz8gUnVudGltZSBhZGRlZCBpbnNucyBub3QgaGFuZGxlZCB5ZXQuICAqLwotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGNvbnN0IGNoYXIgKnN0ciA9ICpzdHJwOwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICAvKiBGSVhNRTogd2lwICovCi0gIGludCBwYXN0X29wY29kZV9wOwotI2VuZGlmCi0KLSAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhlIG1uZW1vbmljIGlzIGZpcnN0ICh0aGVyZSBhcmUgbm8gbGVhZGluZyBvcGVyYW5kcykuCi0gICAgIFdlIGNhbiBwYXJzZSBpdCB3aXRob3V0IG5lZWRpbmcgdG8gc2V0IHVwIG9wZXJhbmQgcGFyc2luZy4KLSAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCBlbnN1cmUgbW5lbW9uaWNzIGFyZSBsb3dlcmNhc2UsIGJ1dCB3ZSBtYXkKLSAgICAgbm90IGJlIGNhbGxlZCBmcm9tIEdBUy4gICovCi0gIHAgPSBDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pOwotICB3aGlsZSAoKnAgJiYgdG9sb3dlciAoKnApID09IHRvbG93ZXIgKCpzdHIpKQotICAgICsrcCwgKytzdHI7Ci0gIAotICBpZiAoKiBwIHx8ICgqIHN0ciAmJiAhaXNzcGFjZSAoKiBzdHIpKSkKLSAgICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci0KLSAgQ0dFTl9JTklUX1BBUlNFIChjZCk7Ci0gIGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIChjZCk7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICBwYXN0X29wY29kZV9wID0gMDsKLSNlbmRpZgotCi0gIC8qIFdlIGRvbid0IGNoZWNrIGZvciAoKnN0ciAhPSAnXDAnKSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0byBwYXJzZQotICAgICBhbnkgdHJhaWxpbmcgZmFrZSBhcmd1bWVudHMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLwotICBzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7Ci0KLSAgLyogTW5lbW9uaWNzIGNvbWUgZmlyc3QgZm9yIG5vdywgZW5zdXJlIHZhbGlkIHN0cmluZy4gICovCi0gIGlmICghIENHRU5fU1lOVEFYX01ORU1PTklDX1AgKCogc3luKSkKLSAgICBhYm9ydCAoKTsKLQotICArK3N5bjsKLQotICB3aGlsZSAoKiBzeW4gIT0gMCkKLSAgICB7Ci0gICAgICAvKiBOb24gb3BlcmFuZCBjaGFycyBtdXN0IG1hdGNoIGV4YWN0bHkuICAqLwotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCXsKLQkgIGlmICgqc3RyID09IENHRU5fU1lOVEFYX0NIQVIgKCogc3luKSkKLQkgICAgewotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLQkgICAgICBpZiAoKiBzeW4gPT0gJyAnKQotCQlwYXN0X29wY29kZV9wID0gMTsKLSNlbmRpZgotCSAgICAgICsrIHN5bjsKLQkgICAgICArKyBzdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFN5bnRheCBjaGFyIGRpZG4ndCBtYXRjaC4gIENhbid0IGJlIHRoaXMgaW5zbi4gICovCi0JICAgICAgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gcmV0dXJuIHNvbWV0aGluZyBsaWtlCi0JCSAiZXhwZWN0ZWQgY2hhciBgYyciICovCi0JICAgICAgcmV0dXJuIF8oInN5bnRheCBlcnJvciIpOwotCSAgICB9Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZCBvZiBzb21lIHNvcnQuICAqLwotICAgICAgZXJybXNnID0gZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCSAgJnN0ciwgZmllbGRzKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLQotICAgICAgLyogRG9uZSB3aXRoIHRoaXMgb3BlcmFuZCwgY29udGludWUgd2l0aCBuZXh0IG9uZS4gICovCi0gICAgICArKyBzeW47Ci0gICAgfQotCi0gIC8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHN5bnRheCBzdHJpbmcsIHdlJ3JlIGRvbmUuICAqLwotICBpZiAoKiBzeW4gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogRm9yIHRoZSBtb21lbnQgd2UgYXNzdW1lIGEgdmFsaWQgYHN0cicgY2FuIG9ubHkgY29udGFpbgotCSBibGFua3Mgbm93LiAgSUU6IFdlIG5lZWRuJ3QgdHJ5IGFnYWluIHdpdGggYSBsb25nZXIgdmVyc2lvbiBvZgotCSB0aGUgaW5zbiBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IGxvbmdlciB2ZXJzaW9ucyBvZiBpbnNucyBhcHBlYXIKLQkgYmVmb3JlIHNob3J0ZXIgb25lcyAoZWc6IGxzciByMixyMywxIHZzIGxzciByMixyMykuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLQkrKyBzdHI7Ci0KLSAgICAgIGlmICgqIHN0ciAhPSAnXDAnKQotCXJldHVybiBfKCJqdW5rIGF0IGVuZCBvZiBsaW5lIik7IC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgYHN0cicgKi8KLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGNvdWxkbid0IHBhcnNlIGl0LiAgKi8KLSAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotfQotDAotLyogTWFpbiBlbnRyeSBwb2ludC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLgotICAgU1RSIHBvaW50cyB0byB0aGUgaW5zbiB0byBiZSBhc3NlbWJsZWQuCi0gICBXZSBhc3N1bWUgYWxsIG5lY2Vzc2FyeSB0YWJsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgVGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiwgbGVzcyBhbnkgZml4dXBzLCBpcyBzdG9yZWQgaW4gQlVGLgotICAgUmVtZW1iZXIgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgdGhlbiBCVUYgaXMgYW4gaW50IGFuZCB0aHVzIHRoZSB2YWx1ZQotICAgc3RpbGwgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIHRhcmdldCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGIGlzIGFuIGFycmF5Ci0gICBvZiBieXRlcyBpbiB0YXJnZXQgYnl0ZSBvcmRlci4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuJ3MgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSwKLSAgIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJlZCAoYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuCi0gICBwcmludGVkKS4KLQotICAgTm90ZSB0aGF0IHdoZW4gcHJvY2Vzc2luZyAobm9uLWFsaWFzKSBtYWNyby1pbnNucywKLSAgIHRoaXMgZnVuY3Rpb24gcmVjdXJzZXMuCi0KLSAgID8/PyBJdCdzIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBjcHUtaW5kZXBlbmRlbnQuCi0gICBPbmUgd291bGQgaGF2ZSB0byBkZWFsIHdpdGggYSBmZXcgbWlub3IgdGhpbmdzLgotICAgQXQgdGhpcyBwb2ludCBpbiB0aW1lIGRvaW5nIHNvIHdvdWxkIGJlIG1vcmUgb2YgYSBjdXJpb3NpdHkgdGhhbiB1c2VmdWwKLSAgIFtmb3IgZXhhbXBsZSB0aGlzIGZpbGUgaXNuJ3QgX3RoYXRfIGJpZ10sIGJ1dCBrZWVwaW5nIHRoZSBwb3NzaWJpbGl0eSBpbgotICAgbWluZCBoZWxwcyBrZWVwIHRoZSBkZXNpZ24gY2xlYW4uICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotZnIzMF9jZ2VuX2Fzc2VtYmxlX2luc24gKGNkLCBzdHIsIGZpZWxkcywgYnVmLCBlcnJtc2cpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLSAgICArKyBzdHI7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2hlZCBsaXN0cy4KLSAgICAgR2V0IHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4gICovCi0gIGlsaXN0ID0gQ0dFTl9BU01fTE9PS1VQX0lOU04gKGNkLCBzdHIpOwotCi0gIC8qIEtlZXAgbG9va2luZyB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guICAqLwotCi0gIHN0YXJ0ID0gc3RyOwotICBmb3IgKCA7IGlsaXN0ICE9IE5VTEwgOyBpbGlzdCA9IENHRU5fQVNNX05FWFRfSU5TTiAoaWxpc3QpKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGlsaXN0LT5pbnNuOwotCi0jaWYgMCAvKiBub3QgbmVlZGVkIGFzIHVuc3VwcG9ydGVkIG9wY29kZXMgc2hvdWxkbid0IGJlIGluIHRoZSBoYXNoIGxpc3RzICovCi0gICAgICAvKiBJcyB0aGlzIGluc24gc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBjcHU/ICAqLwotICAgICAgaWYgKCEgZnIzMF9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogSWYgdGhlIFJFTEFYIGF0dHJpYnV0ZSBpcyBzZXQsIHRoaXMgaXMgYW4gaW5zbiB0aGF0IHNob3VsZG4ndCBiZQotCSBjaG9zZW4gaW1tZWRpYXRlbHkuICBJbnN0ZWFkLCBpdCBpcyB1c2VkIGR1cmluZyBhc3NlbWJsZXIvbGlua2VyCi0JIHJlbGF4YXRpb24gaWYgcG9zc2libGUuICAqLwotICAgICAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN0ciA9IHN0YXJ0OwotCi0gICAgICAvKiBBbGxvdyBwYXJzZS9pbnNlcnQgaGFuZGxlcnMgdG8gb2J0YWluIGxlbmd0aCBvZiBpbnNuLiAgKi8KLSAgICAgIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci0KLSAgICAgIGlmICghIENHRU5fUEFSU0VfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sICYgc3RyLCBmaWVsZHMpKQotCXsKLQkgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotCSAgaWYgKENHRU5fSU5TRVJUX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZiwgKGJmZF92bWEpIDApCi0JICAgICAgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JICAvKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGFjdHVhbGx5IG91dHB1dCB0aGUgaW5zbiBhbmQgYW55Ci0JICAgICBxdWV1ZWQgcmVsb2NzLiAgKi8KLQkgIHJldHVybiBpbnNuOwotCX0KLQotICAgICAgLyogVHJ5IHRoZSBuZXh0IGVudHJ5LiAgKi8KLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIGNhbiByZXR1cm4gYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGFuIHRoaXMuCi0gICAgIE5lZWQgdG8gdHJhY2sgd2h5IGl0IGZhaWxlZCBhbmQgcGljayB0aGUgcmlnaHQgb25lLiAgKi8KLSAgewotICAgIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDBdOwotICAgIGlmIChzdHJsZW4gKHN0YXJ0KSA+IDUwKQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcy4uLiciKSwgc3RhcnQpOwotICAgIGVsc2UgCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzJyIpLCBzdGFydCk7Ci0gICAgICAKLSAgICAqZXJybXNnID0gZXJyYnVmOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0MCi0jaWYgMCAvKiBUaGlzIGNhbGxzIGJhY2sgdG8gR0FTIHdoaWNoIHdlIGNhbid0IGRvIHdpdGhvdXQgY2FyZS4gICovCi0KLS8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KLSAgIFRoaXMgbGV0cyBHQVMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4KLSAgID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCi0gICBGSVhNRTogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2FzbV9oYXNoX2tleXdvcmRzIChjZCwgb3B2YWxzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0tFWVdPUkQgKm9wdmFsczsKLXsKLSAgQ0dFTl9LRVlXT1JEX1NFQVJDSCBzZWFyY2ggPSBjZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKG9wdmFscywgTlVMTCk7Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqIGtlOwotCi0gIHdoaWxlICgoa2UgPSBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQgKCYgc2VhcmNoKSkgIT0gTlVMTCkKLSAgICB7Ci0jaWYgMCAvKiBVbm5lY2Vzc2FyeSwgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIHNlYXJjaCByb3V0aW5lLiAgKi8KLSAgICAgIGlmICghIGZyMzBfY2dlbl9vcHZhbF9zdXBwb3J0ZWQgKGtlKSkKLQljb250aW51ZTsKLSNlbmRpZgotICAgICAgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIChjZCwga2UtPm5hbWUsIGtlLT52YWx1ZSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWRlc2MuYyBiL29wY29kZXMvZnIzMC1kZXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGYwNGIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWRlc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NDMgKzAsMCBAQAotLyogQ1BVIGRhdGEgZm9yIGZyMzAuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBib29sX2F0dHJbXSA9Ci17Ci0gIHsgIiNmIiwgMCB9LAotICB7ICIjdCIsIDEgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgTUFDSF9hdHRyW10gPQotewotICB7ICJiYXNlIiwgTUFDSF9CQVNFIH0sCi0gIHsgImZyMzAiLCBNQUNIX0ZSMzAgfSwKLSAgeyAibWF4IiwgTUFDSF9NQVggfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgSVNBX2F0dHJbXSA9Ci17Ci0gIHsgImZyMzAiLCBJU0FfRlIzMCB9LAotICB7ICJtYXgiLCBJU0FfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFU0VSVkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ0FDSEUtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUEMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBST0ZJTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDUkVMLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkFCUy1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJORUdBVElWRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNFTS1PTkxZIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJIQVNILVBSRUZJWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faW5zbl9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiQUxJQVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlVOQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkNPTkQtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTS0lQLUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiREVMQVktU0xPVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVhBQkxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTk8tRElTIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQkIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5PVC1JTi1ERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSVNBIGZyMzBfY2dlbl9pc2FfdGFibGVbXSA9IHsKLSAgeyAiZnIzMCIsIDE2LCAxNiwgMTYsIDQ4LCAgfSwKLSAgeyAwIH0KLX07Ci0KLS8qIE1hY2hpbmUgdmFyaWFudHMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIIGZyMzBfY2dlbl9tYWNoX3RhYmxlW10gPSB7Ci0gIHsgImZyMzAiLCAiZnIzMCIsIE1BQ0hfRlIzMCB9LAotICB7IDAgfQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAicjAiLCAwIH0sCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0gIHsgInIxMCIsIDEwIH0sCi0gIHsgInIxMSIsIDExIH0sCi0gIHsgInIxMiIsIDEyIH0sCi0gIHsgInIxMyIsIDEzIH0sCi0gIHsgInIxNCIsIDE0IH0sCi0gIHsgInIxNSIsIDE1IH0sCi0gIHsgImFjIiwgMTMgfSwKLSAgeyAiZnAiLCAxNCB9LAotICB7ICJzcCIsIDE1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzWzBdLAotICAxOQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAiY3IwIiwgMCB9LAotICB7ICJjcjEiLCAxIH0sCi0gIHsgImNyMiIsIDIgfSwKLSAgeyAiY3IzIiwgMyB9LAotICB7ICJjcjQiLCA0IH0sCi0gIHsgImNyNSIsIDUgfSwKLSAgeyAiY3I2IiwgNiB9LAotICB7ICJjcjciLCA3IH0sCi0gIHsgImNyOCIsIDggfSwKLSAgeyAiY3I5IiwgOSB9LAotICB7ICJjcjEwIiwgMTAgfSwKLSAgeyAiY3IxMSIsIDExIH0sCi0gIHsgImNyMTIiLCAxMiB9LAotICB7ICJjcjEzIiwgMTMgfSwKLSAgeyAiY3IxNCIsIDE0IH0sCi0gIHsgImNyMTUiLCAxNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1swXSwKLSAgMTYKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgInRiciIsIDAgfSwKLSAgeyAicnAiLCAxIH0sCi0gIHsgInNzcCIsIDIgfSwKLSAgeyAidXNwIiwgMyB9LAotICB7ICJtZGgiLCA0IH0sCi0gIHsgIm1kbCIsIDUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcyA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzX2VudHJpZXNbMF0sCi0gIDYKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgZnIzMF9jZ2VuX29wdmFsX2hfcHNfZW50cmllc1tdID0KLXsKLSAgeyAicHMiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9wcyA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2hfcHNfZW50cmllc1swXSwKLSAgMQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfaF9yMTNfZW50cmllc1tdID0KLXsKLSAgeyAicjEzIiwgMCB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjEzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTNfZW50cmllc1swXSwKLSAgMQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfaF9yMTRfZW50cmllc1tdID0KLXsKLSAgeyAicjE0IiwgMCB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjE0ID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTRfZW50cmllc1swXSwKLSAgMQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfaF9yMTVfZW50cmllc1tdID0KLXsKLSAgeyAicjE1IiwgMCB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjE1ID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTVfZW50cmllc1swXSwKLSAgMQotfTsKLQotCi0KLS8qIFRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0hXXyxhKSkKLQotY29uc3QgQ0dFTl9IV19FTlRSWSBmcjMwX2NnZW5faHdfdGFibGVbXSA9Ci17Ci0gIHsgImgtbWVtb3J5IiwgSFdfSF9NRU1PUlksIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1zaW50IiwgSFdfSF9TSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdWludCIsIEhXX0hfVUlOVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWFkZHIiLCBIV19IX0FERFIsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1pYWRkciIsIEhXX0hfSUFERFIsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1wYyIsIEhXX0hfUEMsIENHRU5fQVNNX05PTkUsIDAsIHsgMHxBKFBST0ZJTEUpfEEoUEMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWdyIiwgSFdfSF9HUiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIHsgMHxBKENBQ0hFX0FERFIpfEEoUFJPRklMRSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtY3IiLCBIV19IX0NSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWRyIiwgSFdfSF9EUiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1wcyIsIEhXX0hfUFMsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2hfcHMsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1yMTMiLCBIV19IX1IxMywgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTMsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1yMTQiLCBIV19IX1IxNCwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1yMTUiLCBIV19IX1IxNSwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTUsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1uYml0IiwgSFdfSF9OQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtemJpdCIsIEhXX0hfWkJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXZiaXQiLCBIV19IX1ZCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jYml0IiwgSFdfSF9DQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaWJpdCIsIEhXX0hfSUJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNiaXQiLCBIV19IX1NCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC10Yml0IiwgSFdfSF9UQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZDBiaXQiLCBIV19IX0QwQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZDFiaXQiLCBIV19IX0QxQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtY2NyIiwgSFdfSF9DQ1IsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1zY3IiLCBIV19IX1NDUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWlsbSIsIEhXX0hfSUxNLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gZmllbGQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JRkxEXyxhKSkKLQotY29uc3QgQ0dFTl9JRkxEIGZyMzBfY2dlbl9pZmxkX3RhYmxlW10gPQotewotICB7IEZSMzBfRl9OSUwsICJmLW5pbCIsIDAsIDAsIDAsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX09QMSwgImYtb3AxIiwgMCwgMTYsIDAsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX09QMiwgImYtb3AyIiwgMCwgMTYsIDQsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX09QMywgImYtb3AzIiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX09QNCwgImYtb3A0IiwgMCwgMTYsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9PUDUsICJmLW9wNSIsIDAsIDE2LCA0LCAxLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9DQywgImYtY2MiLCAwLCAxNiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfQ0NDLCAiZi1jY2MiLCAxNiwgMTYsIDAsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JKLCAiZi1SaiIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SSSwgImYtUmkiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JTMSwgImYtUnMxIiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JTMiwgImYtUnMyIiwgMCwgMTYsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SSkMsICJmLVJqYyIsIDE2LCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUklDLCAiZi1SaWMiLCAxNiwgMTYsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9DUkosICJmLUNSaiIsIDE2LCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfQ1JJLCAiZi1DUmkiLCAxNiwgMTYsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VNCwgImYtdTQiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfVTRDLCAiZi11NGMiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0k0LCAiZi1pNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9NNCwgImYtbTQiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfVTgsICJmLXU4IiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0k4LCAiZi1pOCIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9JMjBfNCwgImYtaTIwLTQiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTIwXzE2LCAiZi1pMjAtMTYiLCAxNiwgMTYsIDAsIDE2LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9JMzIsICJmLWkzMiIsIDE2LCAzMiwgMCwgMzIsIHsgMHxBKFNJR05fT1BUKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1VESVNQNiwgImYtdWRpc3A2IiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJU1A4LCAiZi1kaXNwOCIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVNQOSwgImYtZGlzcDkiLCAwLCAxNiwgNCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElTUDEwLCAiZi1kaXNwMTAiLCAwLCAxNiwgNCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUzEwLCAiZi1zMTAiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfVTEwLCAiZi11MTAiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVMOSwgImYtcmVsOSIsIDAsIDE2LCA4LCA4LCB7IDB8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJUjgsICJmLWRpcjgiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElSOSwgImYtZGlyOSIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVIxMCwgImYtZGlyMTAiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVMMTIsICJmLXJlbDEyIiwgMCwgMTYsIDUsIDExLCB7IDB8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JFR0xJU1RfSElfU1QsICJmLXJlZ2xpc3RfaGlfc3QiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVHTElTVF9MT1dfU1QsICJmLXJlZ2xpc3RfbG93X3N0IiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JFR0xJU1RfSElfTEQsICJmLXJlZ2xpc3RfaGlfbGQiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVHTElTVF9MT1dfTEQsICJmLXJlZ2xpc3RfbG93X2xkIiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgb3BlcmFuZCB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX09QRVJBTkRfLGEpKQotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChGUjMwX09QRVJBTkRfLG9wKQotCi1jb25zdCBDR0VOX09QRVJBTkQgZnIzMF9jZ2VuX29wZXJhbmRfdGFibGVbXSA9Ci17Ci0vKiBwYzogcHJvZ3JhbSBjb3VudGVyICovCi0gIHsgInBjIiwgRlIzMF9PUEVSQU5EX1BDLCBIV19IX1BDLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSaTogZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLSAgeyAiUmkiLCBGUjMwX09QRVJBTkRfUkksIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSajogc291cmNlIHJlZ2lzdGVyICovCi0gIHsgIlJqIiwgRlIzMF9PUEVSQU5EX1JKLCBIV19IX0dSLCA4LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSaWM6IHRhcmdldCByZWdpc3RlciBjb3Byb2MgaW5zbiAqLwotICB7ICJSaWMiLCBGUjMwX09QRVJBTkRfUklDLCBIV19IX0dSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUmpjOiBzb3VyY2UgcmVnaXN0ZXIgY29wcm9jIGluc24gKi8KLSAgeyAiUmpjIiwgRlIzMF9PUEVSQU5EX1JKQywgSFdfSF9HUiwgOCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogQ1JpOiBjb3Byb2Nlc3NvciByZWdpc3RlciAqLwotICB7ICJDUmkiLCBGUjMwX09QRVJBTkRfQ1JJLCBIV19IX0NSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogQ1JqOiBjb3Byb2Nlc3NvciByZWdpc3RlciAqLwotICB7ICJDUmoiLCBGUjMwX09QRVJBTkRfQ1JKLCBIV19IX0NSLCA4LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSczE6IGRlZGljYXRlZCByZWdpc3RlciAqLwotICB7ICJSczEiLCBGUjMwX09QRVJBTkRfUlMxLCBIV19IX0RSLCA4LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSczI6IGRlZGljYXRlZCByZWdpc3RlciAqLwotICB7ICJSczIiLCBGUjMwX09QRVJBTkRfUlMyLCBIV19IX0RSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUjEzOiBHZW5lcmFsIFJlZ2lzdGVyIDEzICovCi0gIHsgIlIxMyIsIEZSMzBfT1BFUkFORF9SMTMsIEhXX0hfUjEzLCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSMTQ6IEdlbmVyYWwgUmVnaXN0ZXIgMTQgKi8KLSAgeyAiUjE0IiwgRlIzMF9PUEVSQU5EX1IxNCwgSFdfSF9SMTQsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFIxNTogR2VuZXJhbCBSZWdpc3RlciAxNSAqLwotICB7ICJSMTUiLCBGUjMwX09QRVJBTkRfUjE1LCBIV19IX1IxNSwgMCwgMCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcHM6IFByb2dyYW0gU3RhdHVzIHJlZ2lzdGVyICovCi0gIHsgInBzIiwgRlIzMF9PUEVSQU5EX1BTLCBIV19IX1BTLCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1NDogNCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1NCIsIEZSMzBfT1BFUkFORF9VNCwgSFdfSF9VSU5ULCA4LCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1NGM6IDQgIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidTRjIiwgRlIzMF9PUEVSQU5EX1U0QywgSFdfSF9VSU5ULCAxMiwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdTg6IDggIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidTgiLCBGUjMwX09QRVJBTkRfVTgsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaTg6IDggIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAiaTgiLCBGUjMwX09QRVJBTkRfSTgsIEhXX0hfVUlOVCwgNCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWRpc3A2OiA2ICBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInVkaXNwNiIsIEZSMzBfT1BFUkFORF9VRElTUDYsIEhXX0hfVUlOVCwgOCwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDg6IDggIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KLSAgeyAiZGlzcDgiLCBGUjMwX09QRVJBTkRfRElTUDgsIEhXX0hfU0lOVCwgNCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDk6IDkgIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KLSAgeyAiZGlzcDkiLCBGUjMwX09QRVJBTkRfRElTUDksIEhXX0hfU0lOVCwgNCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDEwOiAxMCBiaXQgc2lnbmVkICAgaW1tZWRpYXRlICovCi0gIHsgImRpc3AxMCIsIEZSMzBfT1BFUkFORF9ESVNQMTAsIEhXX0hfU0lOVCwgNCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogczEwOiAxMCBiaXQgc2lnbmVkICAgaW1tZWRpYXRlICovCi0gIHsgInMxMCIsIEZSMzBfT1BFUkFORF9TMTAsIEhXX0hfU0lOVCwgOCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdTEwOiAxMCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInUxMCIsIEZSMzBfT1BFUkFORF9VMTAsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaTMyOiAzMiBiaXQgaW1tZWRpYXRlICovCi0gIHsgImkzMiIsIEZSMzBfT1BFUkFORF9JMzIsIEhXX0hfVUlOVCwgMCwgMzIsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoU0lHTl9PUFQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIG00OiA0ICBiaXQgbmVnYXRpdmUgaW1tZWRpYXRlICovCi0gIHsgIm00IiwgRlIzMF9PUEVSQU5EX000LCBIV19IX1NJTlQsIDgsIDQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGkyMDogMjAgYml0IGltbWVkaWF0ZSAqLwotICB7ICJpMjAiLCBGUjMwX09QRVJBTkRfSTIwLCBIV19IX1VJTlQsIDAsIDIwLAotICAgIHsgMHxBKEhBU0hfUFJFRklYKXxBKFZJUlRVQUwpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpcjg6IDggIGJpdCBkaXJlY3QgYWRkcmVzcyAqLwotICB7ICJkaXI4IiwgRlIzMF9PUEVSQU5EX0RJUjgsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlyOTogOSAgYml0IGRpcmVjdCBhZGRyZXNzICovCi0gIHsgImRpcjkiLCBGUjMwX09QRVJBTkRfRElSOSwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXIxMDogMTAgYml0IGRpcmVjdCBhZGRyZXNzICovCi0gIHsgImRpcjEwIiwgRlIzMF9PUEVSQU5EX0RJUjEwLCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGxhYmVsOTogOSAgYml0IHBjIHJlbGF0aXZlIGFkZHJlc3MgKi8KLSAgeyAibGFiZWw5IiwgRlIzMF9PUEVSQU5EX0xBQkVMOSwgSFdfSF9JQUREUiwgOCwgOCwKLSAgICB7IDB8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBsYWJlbDEyOiAxMiBiaXQgcGMgcmVsYXRpdmUgYWRkcmVzcyAqLwotICB7ICJsYWJlbDEyIiwgRlIzMF9PUEVSQU5EX0xBQkVMMTIsIEhXX0hfSUFERFIsIDUsIDExLAotICAgIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHJlZ2xpc3RfbG93X2xkOiA4IGJpdCBsb3cgcmVnaXN0ZXIgbWFzayBmb3IgbGRtICovCi0gIHsgInJlZ2xpc3RfbG93X2xkIiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xELCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHJlZ2xpc3RfaGlfbGQ6IDggYml0IGhpZ2ggcmVnaXN0ZXIgbWFzayBmb3IgbGRtICovCi0gIHsgInJlZ2xpc3RfaGlfbGQiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiByZWdsaXN0X2xvd19zdDogOCBiaXQgbG93IHJlZ2lzdGVyIG1hc2sgZm9yIHN0bSAqLwotICB7ICJyZWdsaXN0X2xvd19zdCIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiByZWdsaXN0X2hpX3N0OiA4IGJpdCBoaWdoIHJlZ2lzdGVyIG1hc2sgZm9yIHN0bSAqLwotICB7ICJyZWdsaXN0X2hpX3N0IiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY2M6IGNvbmRpdGlvbiBjb2RlcyAqLwotICB7ICJjYyIsIEZSMzBfT1BFUkFORF9DQywgSFdfSF9VSU5ULCA0LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBjY2M6IGNvcHJvY2Vzc29yIGNhbGMgKi8KLSAgeyAiY2NjIiwgRlIzMF9PUEVSQU5EX0NDQywgSFdfSF9VSU5ULCAwLCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBuYml0OiBuZWdhdGl2ZSAgIGJpdCAqLwotICB7ICJuYml0IiwgRlIzMF9PUEVSQU5EX05CSVQsIEhXX0hfTkJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdmJpdDogb3ZlcmZsb3cgICBiaXQgKi8KLSAgeyAidmJpdCIsIEZSMzBfT1BFUkFORF9WQklULCBIV19IX1ZCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHpiaXQ6IHplcm8gICAgICAgYml0ICovCi0gIHsgInpiaXQiLCBGUjMwX09QRVJBTkRfWkJJVCwgSFdfSF9aQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBjYml0OiBjYXJyeSAgICAgIGJpdCAqLwotICB7ICJjYml0IiwgRlIzMF9PUEVSQU5EX0NCSVQsIEhXX0hfQ0JJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaWJpdDogaW50ZXJydXB0ICBiaXQgKi8KLSAgeyAiaWJpdCIsIEZSMzBfT1BFUkFORF9JQklULCBIV19IX0lCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNiaXQ6IHN0YWNrICAgICAgYml0ICovCi0gIHsgInNiaXQiLCBGUjMwX09QRVJBTkRfU0JJVCwgSFdfSF9TQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB0Yml0OiB0cmFjZSB0cmFwIGJpdCAqLwotICB7ICJ0Yml0IiwgRlIzMF9PUEVSQU5EX1RCSVQsIEhXX0hfVEJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZDBiaXQ6IGRpdmlzaW9uIDAgYml0ICovCi0gIHsgImQwYml0IiwgRlIzMF9PUEVSQU5EX0QwQklULCBIV19IX0QwQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkMWJpdDogZGl2aXNpb24gMSBiaXQgKi8KLSAgeyAiZDFiaXQiLCBGUjMwX09QRVJBTkRfRDFCSVQsIEhXX0hfRDFCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNjcjogY29uZGl0aW9uIGNvZGUgYml0cyAqLwotICB7ICJjY3IiLCBGUjMwX09QRVJBTkRfQ0NSLCBIV19IX0NDUiwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2NyOiBzeXN0ZW0gY29uZGl0aW9uIGJpdHMgKi8KLSAgeyAic2NyIiwgRlIzMF9PUEVSQU5EX1NDUiwgSFdfSF9TQ1IsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGlsbTogaW50ZXJydXB0IGxldmVsIG1hc2sgKi8KLSAgeyAiaWxtIiwgRlIzMF9PUEVSQU5EX0lMTSwgSFdfSF9JTE0sIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBmcjMwX2NnZW5faW5zbl90YWJsZVtNQVhfSU5TTlNdID0KLXsKLSAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgotICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgotICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLwotICB7IDAsIDAsIDAgfSwKLS8qIGFkZCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQURELCAiYWRkIiwgImFkZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZCAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQURESSwgImFkZGkiLCAiYWRkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkMiAkbTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQUREMiwgImFkZDIiLCAiYWRkMiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZGMgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FEREMsICJhZGRjIiwgImFkZGMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRuICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREROLCAiYWRkbiIsICJhZGRuIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkbiAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQURETkksICJhZGRuaSIsICJhZGRuIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkbjIgJG00LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERE4yLCAiYWRkbjIiLCAiYWRkbjIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWIgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NVQiwgInN1YiIsICJzdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWJjICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVUJDLCAic3ViYyIsICJzdWJjIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3VibiAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1VCTiwgInN1Ym4iLCAic3VibiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ01QLCAiY21wIiwgImNtcCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcCAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ01QSSwgImNtcGkiLCAiY21wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wMiAkbTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ01QMiwgImNtcDIiLCAiY21wMiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5ELCAiYW5kIiwgImFuZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUiwgIm9yIiwgIm9yIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW9yICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FT1IsICJlb3IiLCAiZW9yIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5ETSwgImFuZG0iLCAiYW5kIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kaCAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FOREgsICJhbmRoIiwgImFuZGgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRiICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5EQiwgImFuZGIiLCAiYW5kYiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fT1JNLCAib3JtIiwgIm9yIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3JoICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fT1JILCAib3JoIiwgIm9yaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yYiAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09SQiwgIm9yYiIsICJvcmIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBlb3IgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FT1JNLCAiZW9ybSIsICJlb3IiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBlb3JoICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRU9SSCwgImVvcmgiLCAiZW9yaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVvcmIgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FT1JCLCAiZW9yYiIsICJlb3JiIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmFuZGwgJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CQU5ETCwgImJhbmRsIiwgImJhbmRsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm9ybCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JPUkwsICJib3JsIiwgImJvcmwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZW9ybCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JFT1JMLCAiYmVvcmwiLCAiYmVvcmwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYW5kaCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JBTkRILCAiYmFuZGgiLCAiYmFuZGgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBib3JoICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk9SSCwgImJvcmgiLCAiYm9yaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlb3JoICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVPUkgsICJiZW9yaCIsICJiZW9yaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJ0c3RsICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlRTVEwsICJidHN0bCIsICJidHN0bCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJ0c3RoICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlRTVEgsICJidHN0aCIsICJidHN0aCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG11bCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTVVMLCAibXVsIiwgIm11bCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG11bHUgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01VTFUsICJtdWx1IiwgIm11bHUiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWxoICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NVUxILCAibXVsaCIsICJtdWxoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsdWggJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01VTFVILCAibXVsdWgiLCAibXVsdWgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXYwcyAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYwUywgImRpdjBzIiwgImRpdjBzIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MHUgJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRElWMFUsICJkaXYwdSIsICJkaXYwdSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdjEgJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRElWMSwgImRpdjEiLCAiZGl2MSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdjIgJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRElWMiwgImRpdjIiLCAiZGl2MiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdjMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYzLCAiZGl2MyIsICJkaXYzIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2NHMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVY0UywgImRpdjRzIiwgImRpdjRzIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbHNsICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MU0wsICJsc2wiLCAibHNsIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbHNsICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MU0xJLCAibHNsaSIsICJsc2wiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc2wyICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MU0wyLCAibHNsMiIsICJsc2wyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbHNyICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MU1IsICJsc3IiLCAibHNyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbHNyICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MU1JJLCAibHNyaSIsICJsc3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc3IyICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MU1IyLCAibHNyMiIsICJsc3IyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYXNyICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BU1IsICJhc3IiLCAiYXNyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYXNyICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BU1JJLCAiYXNyaSIsICJhc3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhc3IyICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BU1IyLCAiYXNyMiIsICJhc3IyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpOjggJGk4LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xESTgsICJsZGk4IiwgImxkaTo4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpOjIwICRpMjAsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERJMjAsICJsZGkyMCIsICJsZGk6MjAiLCAzMiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk6MzIgJGkzMiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MREkzMiwgImxkaTMyIiwgImxkaTozMiIsIDQ4LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTEQsICJsZCIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggQCRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFVILCAibGR1aCIsICJsZHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1YiBAJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEVUIsICJsZHViIiwgImxkdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxMywgImxkcjEzIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1aCBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxM1VILCAibGRyMTN1aCIsICJsZHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1YiBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxM1VCLCAibGRyMTN1YiIsICJsZHViIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCgkUjE0LCRkaXNwMTApLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE0LCAibGRyMTQiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoIEAoJFIxNCwkZGlzcDkpLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE0VUgsICJsZHIxNHVoIiwgImxkdWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE0VUIsICJsZHIxNHViIiwgImxkdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAKCRSMTUsJHVkaXNwNiksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTUsICJsZHIxNSIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNUdSLCAibGRyMTVnciIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkUnMyICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTVEUiwgImxkcjE1ZHIiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJHBzICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTVQUywgImxkcjE1cHMiLCAibGQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQCRSaiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NULCAic3QiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGggJFJpLEAkUmogKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVEgsICJzdGgiLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRSaSxAJFJqICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RCLCAic3RiIiwgInN0YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjEzLCAic3RyMTMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGggJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTNILCAic3RyMTNoIiwgInN0aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0YiAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxM0IsICJzdHIxM2IiLCAic3RiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJFJpLEAoJFIxNCwkZGlzcDEwKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE0LCAic3RyMTQiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGggJFJpLEAoJFIxNCwkZGlzcDkpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTRILCAic3RyMTRoIiwgInN0aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0YiAkUmksQCgkUjE0LCRkaXNwOCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNEIsICJzdHIxNGIiLCAic3RiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJFJpLEAoJFIxNSwkdWRpc3A2KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE1LCAic3RyMTUiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQC0kUjE1ICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTVHUiwgInN0cjE1Z3IiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUnMyLEAtJFIxNSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE1RFIsICJzdHIxNWRyIiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHBzLEAtJFIxNSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE1UFMsICJzdHIxNXBzIiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92ICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1YsICJtb3YiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92ICRSczEsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTU9WRFIsICJtb3ZkciIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJHBzLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01PVlBTLCAibW92cHMiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92ICRSaSwkUnMxICovCi0gIHsKLSAgICBGUjMwX0lOU05fTU9WMkRSLCAibW92MmRyIiwgIm1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdiAkUmksJHBzICovCi0gIHsKLSAgICBGUjMwX0lOU05fTU9WMlBTLCAibW92MnBzIiwgIm1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGptcCBAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fSk1QLCAiam1wIiwgImptcCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogam1wOmQgQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0pNUEQsICJqbXBkIiwgImptcDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNhbGwgQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTExSLCAiY2FsbHIiLCAiY2FsbCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbDpkIEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DQUxMUkQsICJjYWxscmQiLCAiY2FsbDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNhbGwgJGxhYmVsMTIgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DQUxMLCAiY2FsbCIsICJjYWxsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjYWxsOmQgJGxhYmVsMTIgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DQUxMRCwgImNhbGxkIiwgImNhbGw6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZXQgKi8KLSAgewotICAgIEZSMzBfSU5TTl9SRVQsICJyZXQiLCAicmV0IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZXQ6ZCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1JFVF9ELCAicmV0OmQiLCAicmV0OmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogaW50ICR1OCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0lOVCwgImludCIsICJpbnQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGludGUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9JTlRFLCAiaW50ZSIsICJpbnRlIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZXRpICovCi0gIHsKLSAgICBGUjMwX0lOU05fUkVUSSwgInJldGkiLCAicmV0aSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYTpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CUkFELCAiYnJhZCIsICJicmE6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBicmEgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JSQSwgImJyYSIsICJicmEiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJubzpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTk9ELCAiYm5vZCIsICJibm86ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5vICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTk8sICJibm8iLCAiYm5vIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmVxOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JFUUQsICJiZXFkIiwgImJlcTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZXEgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JFUSwgImJlcSIsICJiZXEiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5FRCwgImJuZWQiLCAiYm5lOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuZSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5FLCAiYm5lIiwgImJuZSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJjOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JDRCwgImJjZCIsICJiYzpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYyAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkMsICJiYyIsICJiYyIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuYzpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkNELCAiYm5jZCIsICJibmM6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkMsICJibmMiLCAiYm5jIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm46ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5ELCAiYm5kIiwgImJuOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTiwgImJuIiwgImJuIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnA6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlBELCAiYnBkIiwgImJwOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJwICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CUCwgImJwIiwgImJwIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlZELCAiYnZkIiwgImJ2OmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJ2ICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CViwgImJ2IiwgImJ2IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm52OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOVkQsICJibnZkIiwgImJudjpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibnYgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOViwgImJudiIsICJibnYiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibHQ6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxURCwgImJsdGQiLCAiYmx0OmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsdCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxULCAiYmx0IiwgImJsdCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJnZTpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CR0VELCAiYmdlZCIsICJiZ2U6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmdlICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CR0UsICJiZ2UiLCAiYmdlIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmxlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMRUQsICJibGVkIiwgImJsZTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibGUgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMRSwgImJsZSIsICJibGUiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZ3Q6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkdURCwgImJndGQiLCAiYmd0OmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJndCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkdULCAiYmd0IiwgImJndCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsczpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTFNELCAiYmxzZCIsICJibHM6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmxzICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTFMsICJibHMiLCAiYmxzIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmhpOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JISUQsICJiaGlkIiwgImJoaTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiaGkgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JISSwgImJoaSIsICJiaGkiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92ICRSMTMsQCRkaXIxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1ZSMTMsICJkbW92cjEzIiwgImRtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92aCAkUjEzLEAkZGlyOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1ZSMTNILCAiZG1vdnIxM2giLCAiZG1vdmgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92YiAkUjEzLEAkZGlyOCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1ZSMTNCLCAiZG1vdnIxM2IiLCAiZG1vdmIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92IEAkUjEzKyxAJGRpcjEwICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM1BJLCAiZG1vdnIxM3BpIiwgImRtb3YiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92aCBAJFIxMyssQCRkaXI5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM1BJSCwgImRtb3ZyMTNwaWgiLCAiZG1vdmgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92YiBAJFIxMyssQCRkaXI4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM1BJQiwgImRtb3ZyMTNwaWIiLCAiZG1vdmIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92IEAkUjE1KyxAJGRpcjEwICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxNVBJLCAiZG1vdnIxNXBpIiwgImRtb3YiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsJFIxMyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzLCAiZG1vdjJyMTMiLCAiZG1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZoIEAkZGlyOSwkUjEzICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTNILCAiZG1vdjJyMTNoIiwgImRtb3ZoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmIgQCRkaXI4LCRSMTMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM0IsICJkbW92MnIxM2IiLCAiZG1vdmIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsQCRSMTMrICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTNQSSwgImRtb3YycjEzcGkiLCAiZG1vdiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZoIEAkZGlyOSxAJFIxMysgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM1BJSCwgImRtb3YycjEzcGloIiwgImRtb3ZoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmIgQCRkaXI4LEAkUjEzKyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzUElCLCAiZG1vdjJyMTNwaWIiLCAiZG1vdmIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsQC0kUjE1ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTVQRCwgImRtb3YycjE1cGQiLCAiZG1vdiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkcmVzIEAkUmkrLCR1NCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUkVTLCAibGRyZXMiLCAibGRyZXMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdHJlcyAkdTQsQCRSaSsgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFJFUywgInN0cmVzIiwgInN0cmVzIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY29wb3AgJHU0YywkY2NjLCRDUmosJENSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NPUE9QLCAiY29wb3AiLCAiY29wb3AiLCAzMiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjb3BsZCAkdTRjLCRjY2MsJFJqYywkQ1JpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ09QTEQsICJjb3BsZCIsICJjb3BsZCIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNvcHN0ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DT1BTVCwgImNvcHN0IiwgImNvcHN0IiwgMzIsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY29wc3YgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NPUFNWLCAiY29wc3YiLCAiY29wc3YiLCAzMiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIEZSMzBfSU5TTl9OT1AsICJub3AiLCAibm9wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kY2NyICR1OCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FORENDUiwgImFuZGNjciIsICJhbmRjY3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvcmNjciAkdTggKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUkNDUiwgIm9yY2NyIiwgIm9yY2NyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RpbG0gJHU4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RJTE0sICJzdGlsbSIsICJzdGlsbSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZHNwICRzMTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BRERTUCwgImFkZHNwIiwgImFkZHNwIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZXh0c2IgJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRVhUU0IsICJleHRzYiIsICJleHRzYiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGV4dHViICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VYVFVCLCAiZXh0dWIiLCAiZXh0dWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBleHRzaCAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FWFRTSCwgImV4dHNoIiwgImV4dHNoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZXh0dWggJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRVhUVUgsICJleHR1aCIsICJleHR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkbTAgKCRyZWdsaXN0X2xvd19sZCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRE0wLCAibGRtMCIsICJsZG0wIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRtMSAoJHJlZ2xpc3RfaGlfbGQpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERNMSwgImxkbTEiLCAibGRtMSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0bTAgKCRyZWdsaXN0X2xvd19zdCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVE0wLCAic3RtMCIsICJzdG0wIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RtMSAoJHJlZ2xpc3RfaGlfc3QpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RNMSwgInN0bTEiLCAic3RtMSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVudGVyICR1MTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FTlRFUiwgImVudGVyIiwgImVudGVyIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGVhdmUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRUFWRSwgImxlYXZlIiwgImxlYXZlIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogeGNoYiBAJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1hDSEIsICJ4Y2hiIiwgInhjaGIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUAotCi0vKiBJbml0aWFsaXplIGFueXRoaW5nIG5lZWRlZCB0byBiZSBkb25lIG9uY2UsIGJlZm9yZSBhbnkgY3B1X29wZW4gY2FsbC4gICovCi0KLXN0YXRpYyB2b2lkCi1pbml0X3RhYmxlcyAoKQotewotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBsb29rIHVwIGEgbWFjaCB2aWEgaXRzIGJmZCBuYW1lLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fTUFDSCAqCi1sb29rdXBfbWFjaF92aWFfYmZkX25hbWUgKHRhYmxlLCBuYW1lKQotICAgICBjb25zdCBDR0VOX01BQ0ggKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICB3aGlsZSAodGFibGUtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgdGFibGUtPmJmZF9uYW1lKSA9PSAwKQotCXJldHVybiB0YWJsZTsKLSAgICAgICsrdGFibGU7Ci0gICAgfQotICBhYm9ydCAoKTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2h3X3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgaW50IG1hY2hzID0gY2QtPm1hY2hzOwotICBjb25zdCBDR0VOX0hXX0VOVFJZICppbml0ID0gJiBmcjMwX2NnZW5faHdfdGFibGVbMF07Ci0gIC8qIE1BWF9IVyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KLSAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgotICAgICB0aGUgdGFibGUuICAqLwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqc2VsZWN0ZWQgPQotICAgIChjb25zdCBDR0VOX0hXX0VOVFJZICoqKSB4bWFsbG9jIChNQVhfSFcgKiBzaXplb2YgKENHRU5fSFdfRU5UUlkgKikpOwotCi0gIGNkLT5od190YWJsZS5pbml0X2VudHJpZXMgPSBpbml0OwotICBjZC0+aHdfdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9IV19FTlRSWSk7Ci0gIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7Ci0gIC8qID8/PyBGb3Igbm93IHdlIGp1c3QgdXNlIG1hY2hzIHRvIGRldGVybWluZSB3aGljaCBvbmVzIHdlIHdhbnQuICAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLm5hbWUgIT0gTlVMTDsgKytpKQotICAgIGlmIChDR0VOX0hXX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX0hXX01BQ0gpCi0JJiBtYWNocykKLSAgICAgIHNlbGVjdGVkW2luaXRbaV0udHlwZV0gPSAmaW5pdFtpXTsKLSAgY2QtPmh3X3RhYmxlLmVudHJpZXMgPSBzZWxlY3RlZDsKLSAgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX0hXOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaWZpZWxkX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBjZC0+aWZsZF90YWJsZSA9ICYgZnIzMF9jZ2VuX2lmbGRfdGFibGVbMF07Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9vcGVyYW5kX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgaW50IG1hY2hzID0gY2QtPm1hY2hzOwotICBjb25zdCBDR0VOX09QRVJBTkQgKmluaXQgPSAmIGZyMzBfY2dlbl9vcGVyYW5kX3RhYmxlWzBdOwotICAvKiBNQVhfT1BFUkFORFMgaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVudHJpZXMuCi0gICAgIEhvd2V2ZXIgZWFjaCBlbnRyeSBpcyBpbmRleGVkIGJ5IGl0J3MgZW51bSBzbyB0aGVyZSBjYW4gYmUgaG9sZXMgaW4KLSAgICAgdGhlIHRhYmxlLiAgKi8KLSAgY29uc3QgQ0dFTl9PUEVSQU5EICoqc2VsZWN0ZWQgPQotICAgIChjb25zdCBDR0VOX09QRVJBTkQgKiopIHhtYWxsb2MgKE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKLQotICBjZC0+b3BlcmFuZF90YWJsZS5pbml0X2VudHJpZXMgPSBpbml0OwotICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX09QRVJBTkQpOwotICBtZW1zZXQgKHNlbGVjdGVkLCAwLCBNQVhfT1BFUkFORFMgKiBzaXplb2YgKENHRU5fT1BFUkFORCAqKSk7Ci0gIC8qID8/PyBGb3Igbm93IHdlIGp1c3QgdXNlIG1hY2ggdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCi0gICAgaWYgKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFICgmaW5pdFtpXSwgQ0dFTl9PUEVSQU5EX01BQ0gpCi0JJiBtYWNocykKLSAgICAgIHNlbGVjdGVkW2luaXRbaV0udHlwZV0gPSAmaW5pdFtpXTsKLSAgY2QtPm9wZXJhbmRfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOwotICBjZC0+b3BlcmFuZF90YWJsZS5udW1fZW50cmllcyA9IE1BWF9PUEVSQU5EUzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLgotICAgPz8/IFRoaXMgY291bGQgbGVhdmUgb3V0IGluc25zIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNwZWNpZmllZCBtYWNoL2lzYSwKLSAgIGJ1dCB0aGF0IHdvdWxkIGNhdXNlIGVycm9ycyBsaWtlICJmb28gb25seSBzdXBwb3J0ZWQgYnkgYmFyIiB0byBiZWNvbWUKLSAgICJ1bmtub3duIGluc24iLCBzbyBmb3Igbm93IHdlIGluY2x1ZGUgYWxsIGluc25zIGFuZCByZXF1aXJlIHRoZSBhcHAgdG8KLSAgIGRvIHRoZSBjaGVja2luZyBsYXRlci4KLSAgID8/PyBPbiB0aGUgb3RoZXIgaGFuZCwgcGFyc2luZyBvZiBzdWNoIGluc25zIG1heSByZXF1aXJlIHRoZWlyIGhhcmR3YXJlIG9yCi0gICBvcGVyYW5kIGVsZW1lbnRzIHRvIGJlIGluIHRoZSB0YWJsZSBbd2hpY2ggdGhleSBtaWdodG4ndCBiZV0uICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaW5zbl90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBmcjMwX2NnZW5faW5zbl90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAoTUFYX0lOU05TICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLQotICBtZW1zZXQgKGluc25zLCAwLCBNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0uYmFzZSA9ICZpYltpXTsKLSAgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7Ci0gIGNkLT5pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOwotICBjZC0+aW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gTUFYX0lOU05TOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byByZWJ1aWxkIHRoZSB0YWJsZXMuICAqLwotCi1zdGF0aWMgdm9pZAotZnIzMF9jZ2VuX3JlYnVpbGRfdGFibGVzIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaSxuX2lzYXMsbl9tYWNoczsKLSAgdW5zaWduZWQgaW50IGlzYXMgPSBjZC0+aXNhczsKLSAgdW5zaWduZWQgaW50IG1hY2hzID0gY2QtPm1hY2hzOwotCi0gIGNkLT5pbnRfaW5zbl9wID0gQ0dFTl9JTlRfSU5TTl9QOwotCi0gIC8qIERhdGEgZGVyaXZlZCBmcm9tIHRoZSBpc2Egc3BlYy4gICovCi0jZGVmaW5lIFVOU0VUIChDR0VOX1NJWkVfVU5LTk9XTiArIDEpCi0gIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IFVOU0VUOwotICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBVTlNFVDsKLSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSA2NTUzNTsgLyogc29tZSByaWRpY3Vsb3VzbHkgYmlnIG51bWJlciAqLwotICBjZC0+bWF4X2luc25fYml0c2l6ZSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSVNBUzsgKytpKQotICAgIGlmICgoKDEgPDwgaSkgJiBpc2FzKSAhPSAwKQotICAgICAgewotCWNvbnN0IENHRU5fSVNBICppc2EgPSAmIGZyMzBfY2dlbl9pc2FfdGFibGVbaV07Ci0KLQkvKiBEZWZhdWx0IGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKLQkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KLQlpZiAoY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID09IFVOU0VUKQotCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gaXNhLT5kZWZhdWx0X2luc25fYml0c2l6ZTsKLQllbHNlIGlmIChpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplID09IGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSkKLQkgIDsgLyogdGhpcyBpcyBvayAqLwotCWVsc2UKLQkgIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOwotCi0JLyogQmFzZSBpbnNuIHNpemVzIG9mIGFsbCBzZWxlY3RlZCBpc2FzIG11c3QgYmUgZXF1YWwgb3Igd2Ugc2V0Ci0JICAgdGhlIHJlc3VsdCB0byAwLCBtZWFuaW5nICJ1bmtub3duIi4gICovCi0JaWYgKGNkLT5iYXNlX2luc25fYml0c2l6ZSA9PSBVTlNFVCkKLQkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IGlzYS0+YmFzZV9pbnNuX2JpdHNpemU7Ci0JZWxzZSBpZiAoaXNhLT5iYXNlX2luc25fYml0c2l6ZSA9PSBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0JICA7IC8qIHRoaXMgaXMgb2sgKi8KLQllbHNlCi0JICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBDR0VOX1NJWkVfVU5LTk9XTjsKLQotCS8qIFNldCBtaW4sbWF4IGluc24gc2l6ZXMuICAqLwotCWlmIChpc2EtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+bWluX2luc25fYml0c2l6ZSkKLQkgIGNkLT5taW5faW5zbl9iaXRzaXplID0gaXNhLT5taW5faW5zbl9iaXRzaXplOwotCWlmIChpc2EtPm1heF9pbnNuX2JpdHNpemUgPiBjZC0+bWF4X2luc25fYml0c2l6ZSkKLQkgIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gaXNhLT5tYXhfaW5zbl9iaXRzaXplOwotCi0JKytuX2lzYXM7Ci0gICAgICB9Ci0KLSAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIG1hY2ggc3BlYy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBNQVhfTUFDSFM7ICsraSkKLSAgICBpZiAoKCgxIDw8IGkpICYgbWFjaHMpICE9IDApCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9NQUNIICptYWNoID0gJiBmcjMwX2NnZW5fbWFjaF90YWJsZVtpXTsKLQotCSsrbl9tYWNoczsKLSAgICAgIH0KLQotICAvKiBEZXRlcm1pbmUgd2hpY2ggaHcgZWxlbWVudHMgYXJlIHVzZWQgYnkgTUFDSC4gICovCi0gIGJ1aWxkX2h3X3RhYmxlIChjZCk7Ci0KLSAgLyogQnVpbGQgdGhlIGlmaWVsZCB0YWJsZS4gICovCi0gIGJ1aWxkX2lmaWVsZF90YWJsZSAoY2QpOwotCi0gIC8qIERldGVybWluZSB3aGljaCBvcGVyYW5kcyBhcmUgdXNlZCBieSBNQUNIL0lTQS4gICovCi0gIGJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKTsKLQotICAvKiBCdWlsZCB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotICBidWlsZF9pbnNuX3RhYmxlIChjZCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBjcHUgdGFibGUgYW5kIHJldHVybiBhIGRlc2NyaXB0b3IuCi0gICBJdCdzIG11Y2ggbGlrZSBvcGVuaW5nIGEgZmlsZSwgYW5kIG11c3QgYmUgdGhlIGZpcnN0IGZ1bmN0aW9uIGNhbGxlZC4KLSAgIFRoZSBhcmd1bWVudHMgYXJlIGEgc2V0IG9mICh0eXBlL3ZhbHVlKSBwYWlycywgdGVybWluYXRlZCB3aXRoCi0gICBDR0VOX0NQVV9PUEVOX0VORC4KLQotICAgQ3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXM6Ci0gICBDR0VOX0NQVV9PUEVOX0lTQVM6ICAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBpc2FfYXR0cgotICAgQ0dFTl9DUFVfT1BFTl9NQUNIUzogICBiaXRtYXAgb2YgdmFsdWVzIGluIGVudW0gbWFjaF9hdHRyCi0gICBDR0VOX0NQVV9PUEVOX0JGRE1BQ0g6IHNwZWNpZnkgMSBtYWNoIHVzaW5nIGJmZCBuYW1lCi0gICBDR0VOX0NQVV9PUEVOX0VORElBTjogIHNwZWNpZnkgZW5kaWFuIGNob2ljZQotICAgQ0dFTl9DUFVfT1BFTl9FTkQ6ICAgICB0ZXJtaW5hdGVzIGFyZ3VtZW50cwotCi0gICA/Pz8gU2ltdWx0YW5lb3VzIG11bHRpcGxlIGlzYXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UsIGJ1dCBpdCdzIG5vdCAoeWV0KQotICAgcHJlY2x1ZGVkLgotCi0gICA/Pz8gV2Ugb25seSBzdXBwb3J0IElTTyBDIHN0ZGFyZ3MgaGVyZSwgbm90IEsmUi4KLSAgIExhemluZXNzLCBwbHVzIGV4cGVyaW1lbnQgdG8gc2VlIGlmIGFueXRoaW5nIHJlcXVpcmVzIEsmUiAtIGV2ZW50dWFsbHkKLSAgIEsmUiB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgLSBlLmcuIEdEQiBpcyBjdXJyZW50bHkgdHJ5aW5nIHRoaXMuICAqLwotCi1DR0VOX0NQVV9ERVNDCi1mcjMwX2NnZW5fY3B1X29wZW4gKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcgYXJnX3R5cGUsIC4uLikKLXsKLSAgQ0dFTl9DUFVfVEFCTEUgKmNkID0gKENHRU5fQ1BVX1RBQkxFICopIHhtYWxsb2MgKHNpemVvZiAoQ0dFTl9DUFVfVEFCTEUpKTsKLSAgc3RhdGljIGludCBpbml0X3A7Ci0gIHVuc2lnbmVkIGludCBpc2FzID0gMDsgIC8qIDAgPSAidW5zcGVjaWZpZWQiICovCi0gIHVuc2lnbmVkIGludCBtYWNocyA9IDA7IC8qIDAgPSAidW5zcGVjaWZpZWQiICovCi0gIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuID0gQ0dFTl9FTkRJQU5fVU5LTk9XTjsKLSAgdmFfbGlzdCBhcDsKLQotICBpZiAoISBpbml0X3ApCi0gICAgewotICAgICAgaW5pdF90YWJsZXMgKCk7Ci0gICAgICBpbml0X3AgPSAxOwotICAgIH0KLQotICBtZW1zZXQgKGNkLCAwLCBzaXplb2YgKCpjZCkpOwotCi0gIHZhX3N0YXJ0IChhcCwgYXJnX3R5cGUpOwotICB3aGlsZSAoYXJnX3R5cGUgIT0gQ0dFTl9DUFVfT1BFTl9FTkQpCi0gICAgewotICAgICAgc3dpdGNoIChhcmdfdHlwZSkKLQl7Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX0lTQVMgOgotCSAgaXNhcyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7Ci0JICBicmVhazsKLQljYXNlIENHRU5fQ1BVX09QRU5fTUFDSFMgOgotCSAgbWFjaHMgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCBpbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0ggOgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lID0gdmFfYXJnIChhcCwgY29uc3QgY2hhciAqKTsKLQkgICAgY29uc3QgQ0dFTl9NQUNIICptYWNoID0KLQkgICAgICBsb29rdXBfbWFjaF92aWFfYmZkX25hbWUgKGZyMzBfY2dlbl9tYWNoX3RhYmxlLCBuYW1lKTsKLQotCSAgICBtYWNocyB8PSBtYWNoLT5udW0gPDwgMTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX0VORElBTiA6Ci0JICBlbmRpYW4gPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fZW5kaWFuKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQgOgotCSAgZnByaW50ZiAoc3RkZXJyLCAiZnIzMF9jZ2VuX2NwdV9vcGVuOiB1bnN1cHBvcnRlZCBhcmd1bWVudCBgJWQnXG4iLAotCQkgICBhcmdfdHlwZSk7Ci0JICBhYm9ydCAoKTsgLyogPz8/IHJldHVybiBOVUxMPyAqLwotCX0KLSAgICAgIGFyZ190eXBlID0gdmFfYXJnIChhcCwgZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyk7Ci0gICAgfQotICB2YV9lbmQgKGFwKTsKLQotICAvKiBtYWNoIHVuc3BlY2lmaWVkIG1lYW5zICJhbGwiICovCi0gIGlmIChtYWNocyA9PSAwKQotICAgIG1hY2hzID0gKDEgPDwgTUFYX01BQ0hTKSAtIDE7Ci0gIC8qIGJhc2UgbWFjaCBpcyBhbHdheXMgc2VsZWN0ZWQgKi8KLSAgbWFjaHMgfD0gMTsKLSAgLyogaXNhIHVuc3BlY2lmaWVkIG1lYW5zICJhbGwiICovCi0gIGlmIChpc2FzID09IDApCi0gICAgaXNhcyA9ICgxIDw8IE1BWF9JU0FTKSAtIDE7Ci0gIGlmIChlbmRpYW4gPT0gQ0dFTl9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAvKiA/Pz8gSWYgdGFyZ2V0IGhhcyBvbmx5IG9uZSwgY291bGQgaGF2ZSBhIGRlZmF1bHQuICAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZnIzMF9jZ2VuX2NwdV9vcGVuOiBubyBlbmRpYW5uZXNzIHNwZWNpZmllZFxuIik7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgY2QtPmlzYXMgPSBpc2FzOwotICBjZC0+bWFjaHMgPSBtYWNoczsKLSAgY2QtPmVuZGlhbiA9IGVuZGlhbjsKLSAgLyogRklYTUU6IGZvciB0aGUgc3BhcmMgY2FzZSB3ZSBjYW4gZGV0ZXJtaW5lIGluc24tZW5kaWFubmVzcyBzdGF0aWNhbGx5LgotICAgICBUaGUgd29ycnkgaGVyZSBpcyB3aGVyZSBib3RoIGRhdGEgYW5kIGluc24gZW5kaWFuIGNhbiBiZSBpbmRlcGVuZGVudGx5Ci0gICAgIGNob3NlbiwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmVlZCBhbm90aGVyIGFyZ3VtZW50LgotICAgICBBY3R1YWxseSwgd2lsbCB3YW50IHRvIGFsbG93IGZvciBtb3JlIGFyZ3VtZW50cyBpbiB0aGUgZnV0dXJlIGFueXdheS4gICovCi0gIGNkLT5pbnNuX2VuZGlhbiA9IGVuZGlhbjsKLQotICAvKiBUYWJsZSAocmUpYnVpbGRlci4gICovCi0gIGNkLT5yZWJ1aWxkX3RhYmxlcyA9IGZyMzBfY2dlbl9yZWJ1aWxkX3RhYmxlczsKLSAgZnIzMF9jZ2VuX3JlYnVpbGRfdGFibGVzIChjZCk7Ci0KLSAgcmV0dXJuIChDR0VOX0NQVV9ERVNDKSBjZDsKLX0KLQotLyogQ292ZXIgZm4gdG8gZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugb2YgMSBpc2EsIDEgbWFjaC4KLSAgIE1BQ0hfTkFNRSBpcyB0aGUgYmZkIG5hbWUgb2YgdGhlIG1hY2guICAqLwotCi1DR0VOX0NQVV9ERVNDCi1mcjMwX2NnZW5fY3B1X29wZW5fMSAobWFjaF9uYW1lLCBlbmRpYW4pCi0gICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKLSAgICAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47Ci17Ci0gIHJldHVybiBmcjMwX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5ESUFOLCBlbmRpYW4sCi0JCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkQpOwotfQotCi0vKiBDbG9zZSBhIGNwdSB0YWJsZS4KLSAgID8/PyBUaGlzIGNhbiBsaXZlIGluIGEgbWFjaGluZSBpbmRlcGVuZGVudCBmaWxlLCBidXQgdGhlcmUncyBjdXJyZW50bHkKLSAgIG5vIHBsYWNlIHRvIHB1dCB0aGlzIGZpbGUgKHRoZXJlJ3Mgbm8gbGliY2dlbikuICBsaWJvcGNvZGVzIGlzIHRoZSB3cm9uZwotICAgcGxhY2UgYXMgc29tZSBzaW11bGF0b3IgcG9ydHMgdXNlIHRoaXMgYnV0IHRoZXkgZG9uJ3QgdXNlIGxpYm9wY29kZXMuICAqLwotCi12b2lkCi1mcjMwX2NnZW5fY3B1X2Nsb3NlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaWYgKGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcykKLSAgICBmcmVlICgoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyk7Ci0gIGlmIChjZC0+aHdfdGFibGUuZW50cmllcykKLSAgICBmcmVlICgoQ0dFTl9IV19FTlRSWSAqKSBjZC0+aHdfdGFibGUuZW50cmllcyk7Ci0gIGZyZWUgKGNkKTsKLX0KLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWRlc2MuaCBiL29wY29kZXMvZnIzMC1kZXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODkxNTYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWRlc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBDUFUgZGF0YSBoZWFkZXIgZm9yIGZyMzAuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgRlIzMF9DUFVfSAotI2RlZmluZSBGUjMwX0NQVV9ICi0KLSNkZWZpbmUgQ0dFTl9BUkNIIGZyMzAKLQotLyogR2l2ZW4gc3ltYm9sIFMsIHJldHVybiBmcjMwX2NnZW5fPFM+LiAgKi8KLSNkZWZpbmUgQ0dFTl9TWU0ocykgQ09OQ0FUMyAoZnIzMCxfY2dlbl8scykKLQotLyogU2VsZWN0ZWQgY3B1IGZhbWlsaWVzLiAgKi8KLSNkZWZpbmUgSEFWRV9DUFVfRlIzMEJGCi0KLSNkZWZpbmUgQ0dFTl9JTlNOX0xTQjBfUCAwCi0KLS8qIE1heGltdW0gc2l6ZSBvZiBhbnkgaW5zbiAoaW4gYnl0ZXMpLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9TSVpFIDYKLQotI2RlZmluZSBDR0VOX0lOVF9JTlNOX1AgMAotCi0vKiBGSVhNRTogTmVlZCB0byBjb21wdXRlIENHRU5fTUFYX1NZTlRBWF9CWVRFUy4gICovCi0KLS8qIENHRU5fTU5FTU9OSUNfT1BFUkFORFMgaXMgZGVmaW5lZCBpZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcy4KLSAgIGUuZy4gSW4gImIsYSBmb28iIHRoZSAiLGEiIGlzIGFuIG9wZXJhbmQuICBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcwotICAgd2UgY2FuJ3QgaGFzaCBvbiBldmVyeXRoaW5nIHVwIHRvIHRoZSBzcGFjZS4gICovCi0jZGVmaW5lIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGFueSBpbnNuIG9yIG1hY3JvLWluc24gaGFzLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9PUEVSQU5EUyAxNgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBmaWVsZHMgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIDcKLQotLyogRW51bXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wMSBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDEgewotICBPUDFfMCwgT1AxXzEsIE9QMV8yLCBPUDFfMwotICwgT1AxXzQsIE9QMV81LCBPUDFfNiwgT1AxXzcKLSAsIE9QMV84LCBPUDFfOSwgT1AxX0EsIE9QMV9CCi0gLCBPUDFfQywgT1AxX0QsIE9QMV9FLCBPUDFfRgotfSBJTlNOX09QMTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDIgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AyIHsKLSAgT1AyXzAsIE9QMl8xLCBPUDJfMiwgT1AyXzMKLSAsIE9QMl80LCBPUDJfNSwgT1AyXzYsIE9QMl83Ci0gLCBPUDJfOCwgT1AyXzksIE9QMl9BLCBPUDJfQgotICwgT1AyX0MsIE9QMl9ELCBPUDJfRSwgT1AyX0YKLX0gSU5TTl9PUDI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3AzIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMyB7Ci0gIE9QM18wLCBPUDNfMSwgT1AzXzIsIE9QM18zCi0gLCBPUDNfNCwgT1AzXzUsIE9QM182LCBPUDNfNwotICwgT1AzXzgsIE9QM185LCBPUDNfQSwgT1AzX0IKLSAsIE9QM19DLCBPUDNfRCwgT1AzX0UsIE9QM19GCi19IElOU05fT1AzOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wNCBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDQgewotICBPUDRfMAotfSBJTlNOX09QNDsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDUgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3A1IHsKLSAgT1A1XzAsIE9QNV8xCi19IElOU05fT1A1OwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGNjIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX2NjIHsKLSAgQ0NfUkEsIENDX05PLCBDQ19FUSwgQ0NfTkUKLSAsIENDX0MsIENDX05DLCBDQ19OLCBDQ19QCi0gLCBDQ19WLCBDQ19OViwgQ0NfTFQsIENDX0dFCi0gLCBDQ19MRSwgQ0NfR1QsIENDX0xTLCBDQ19ISQotfSBJTlNOX0NDOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGdyX25hbWVzIHsKLSAgSF9HUl9SMCA9IDAsIEhfR1JfUjEgPSAxLCBIX0dSX1IyID0gMiwgSF9HUl9SMyA9IDMKLSAsIEhfR1JfUjQgPSA0LCBIX0dSX1I1ID0gNSwgSF9HUl9SNiA9IDYsIEhfR1JfUjcgPSA3Ci0gLCBIX0dSX1I4ID0gOCwgSF9HUl9SOSA9IDksIEhfR1JfUjEwID0gMTAsIEhfR1JfUjExID0gMTEKLSAsIEhfR1JfUjEyID0gMTIsIEhfR1JfUjEzID0gMTMsIEhfR1JfUjE0ID0gMTQsIEhfR1JfUjE1ID0gMTUKLSAsIEhfR1JfQUMgPSAxMywgSF9HUl9GUCA9IDE0LCBIX0dSX1NQID0gMTUKLX0gR1JfTkFNRVM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gY3JfbmFtZXMgewotICBIX0NSX0NSMCwgSF9DUl9DUjEsIEhfQ1JfQ1IyLCBIX0NSX0NSMwotICwgSF9DUl9DUjQsIEhfQ1JfQ1I1LCBIX0NSX0NSNiwgSF9DUl9DUjcKLSAsIEhfQ1JfQ1I4LCBIX0NSX0NSOSwgSF9DUl9DUjEwLCBIX0NSX0NSMTEKLSAsIEhfQ1JfQ1IxMiwgSF9DUl9DUjEzLCBIX0NSX0NSMTQsIEhfQ1JfQ1IxNQotfSBDUl9OQU1FUzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBkcl9uYW1lcyB7Ci0gIEhfRFJfVEJSLCBIX0RSX1JQLCBIX0RSX1NTUCwgSF9EUl9VU1AKLSAsIEhfRFJfTURILCBIX0RSX01ETAotfSBEUl9OQU1FUzsKLQotLyogQXR0cmlidXRlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1hY2hpbmUgdHlwZSBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIG1hY2hfYXR0ciB7Ci0gIE1BQ0hfQkFTRSwgTUFDSF9GUjMwLCBNQUNIX01BWAotfSBNQUNIX0FUVFI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc3RydWN0aW9uIHNldCBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIGlzYV9hdHRyIHsKLSAgSVNBX0ZSMzAsIElTQV9NQVgKLX0gSVNBX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBhcmNoaXRlY3R1cmUgdmFyaWFudHMuICAqLwotI2RlZmluZSBNQVhfSVNBUyAgMQotI2RlZmluZSBNQVhfTUFDSFMgKChpbnQpIE1BQ0hfTUFYKQotCi0vKiBJZmllbGQgc3VwcG9ydC4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgY2dlbl9pZmxkIGZyMzBfY2dlbl9pZmxkX3RhYmxlW107Ci0KLS8qIElmaWVsZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faWZsZCBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pZmxkX2F0dHIgewotICBDR0VOX0lGTERfVklSVFVBTCwgQ0dFTl9JRkxEX1BDUkVMX0FERFIsIENHRU5fSUZMRF9BQlNfQUREUiwgQ0dFTl9JRkxEX1JFU0VSVkVECi0gLCBDR0VOX0lGTERfU0lHTl9PUFQsIENHRU5fSUZMRF9TSUdORUQsIENHRU5fSUZMRF9FTkRfQk9PTFMsIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgPSAzMQotICwgQ0dFTl9JRkxEX01BQ0gsIENHRU5fSUZMRF9FTkRfTkJPT0xTCi19IENHRU5fSUZMRF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pZmxkX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lGTERfTkJPT0xfQVRUUlMgKENHRU5fSUZMRF9FTkRfTkJPT0xTIC0gQ0dFTl9JRkxEX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaWZpZWxkIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBpZmllbGRfdHlwZSB7Ci0gIEZSMzBfRl9OSUwsIEZSMzBfRl9PUDEsIEZSMzBfRl9PUDIsIEZSMzBfRl9PUDMKLSAsIEZSMzBfRl9PUDQsIEZSMzBfRl9PUDUsIEZSMzBfRl9DQywgRlIzMF9GX0NDQwotICwgRlIzMF9GX1JKLCBGUjMwX0ZfUkksIEZSMzBfRl9SUzEsIEZSMzBfRl9SUzIKLSAsIEZSMzBfRl9SSkMsIEZSMzBfRl9SSUMsIEZSMzBfRl9DUkosIEZSMzBfRl9DUkkKLSAsIEZSMzBfRl9VNCwgRlIzMF9GX1U0QywgRlIzMF9GX0k0LCBGUjMwX0ZfTTQKLSAsIEZSMzBfRl9VOCwgRlIzMF9GX0k4LCBGUjMwX0ZfSTIwXzQsIEZSMzBfRl9JMjBfMTYKLSAsIEZSMzBfRl9JMjAsIEZSMzBfRl9JMzIsIEZSMzBfRl9VRElTUDYsIEZSMzBfRl9ESVNQOAotICwgRlIzMF9GX0RJU1A5LCBGUjMwX0ZfRElTUDEwLCBGUjMwX0ZfUzEwLCBGUjMwX0ZfVTEwCi0gLCBGUjMwX0ZfUkVMOSwgRlIzMF9GX0RJUjgsIEZSMzBfRl9ESVI5LCBGUjMwX0ZfRElSMTAKLSAsIEZSMzBfRl9SRUwxMiwgRlIzMF9GX1JFR0xJU1RfSElfU1QsIEZSMzBfRl9SRUdMSVNUX0xPV19TVCwgRlIzMF9GX1JFR0xJU1RfSElfTEQKLSAsIEZSMzBfRl9SRUdMSVNUX0xPV19MRCwgRlIzMF9GX01BWAotfSBJRklFTERfVFlQRTsKLQotI2RlZmluZSBNQVhfSUZMRCAoKGludCkgRlIzMF9GX01BWCkKLQotLyogSGFyZHdhcmUgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2h3IGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X2F0dHIgewotICBDR0VOX0hXX1ZJUlRVQUwsIENHRU5fSFdfQ0FDSEVfQUREUiwgQ0dFTl9IV19QQywgQ0dFTl9IV19QUk9GSUxFCi0gLCBDR0VOX0hXX0VORF9CT09MUywgQ0dFTl9IV19TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9IV19NQUNILCBDR0VOX0hXX0VORF9OQk9PTFMKLX0gQ0dFTl9IV19BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9od19hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9IV19OQk9PTF9BVFRSUyAoQ0dFTl9IV19FTkRfTkJPT0xTIC0gQ0dFTl9IV19TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIGhhcmR3YXJlIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X3R5cGUgewotICBIV19IX01FTU9SWSwgSFdfSF9TSU5ULCBIV19IX1VJTlQsIEhXX0hfQUREUgotICwgSFdfSF9JQUREUiwgSFdfSF9QQywgSFdfSF9HUiwgSFdfSF9DUgotICwgSFdfSF9EUiwgSFdfSF9QUywgSFdfSF9SMTMsIEhXX0hfUjE0Ci0gLCBIV19IX1IxNSwgSFdfSF9OQklULCBIV19IX1pCSVQsIEhXX0hfVkJJVAotICwgSFdfSF9DQklULCBIV19IX0lCSVQsIEhXX0hfU0JJVCwgSFdfSF9UQklUCi0gLCBIV19IX0QwQklULCBIV19IX0QxQklULCBIV19IX0NDUiwgSFdfSF9TQ1IKLSAsIEhXX0hfSUxNLCBIV19NQVgKLX0gQ0dFTl9IV19UWVBFOwotCi0jZGVmaW5lIE1BWF9IVyAoKGludCkgSFdfTUFYKQotCi0vKiBPcGVyYW5kIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9vcGVyYW5kIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfYXR0ciB7Ci0gIENHRU5fT1BFUkFORF9WSVJUVUFMLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUiwgQ0dFTl9PUEVSQU5EX0FCU19BRERSLCBDR0VOX09QRVJBTkRfU0lHTl9PUFQKLSAsIENHRU5fT1BFUkFORF9TSUdORUQsIENHRU5fT1BFUkFORF9ORUdBVElWRSwgQ0dFTl9PUEVSQU5EX1JFTEFYLCBDR0VOX09QRVJBTkRfU0VNX09OTFkKLSAsIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCwgQ0dFTl9PUEVSQU5EX0VORF9CT09MUywgQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX09QRVJBTkRfTUFDSAotICwgQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMKLX0gQ0dFTl9PUEVSQU5EX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX29wZXJhbmRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAoQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMgLSBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBvcGVyYW5kIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7Ci0gIEZSMzBfT1BFUkFORF9QQywgRlIzMF9PUEVSQU5EX1JJLCBGUjMwX09QRVJBTkRfUkosIEZSMzBfT1BFUkFORF9SSUMKLSAsIEZSMzBfT1BFUkFORF9SSkMsIEZSMzBfT1BFUkFORF9DUkksIEZSMzBfT1BFUkFORF9DUkosIEZSMzBfT1BFUkFORF9SUzEKLSAsIEZSMzBfT1BFUkFORF9SUzIsIEZSMzBfT1BFUkFORF9SMTMsIEZSMzBfT1BFUkFORF9SMTQsIEZSMzBfT1BFUkFORF9SMTUKLSAsIEZSMzBfT1BFUkFORF9QUywgRlIzMF9PUEVSQU5EX1U0LCBGUjMwX09QRVJBTkRfVTRDLCBGUjMwX09QRVJBTkRfVTgKLSAsIEZSMzBfT1BFUkFORF9JOCwgRlIzMF9PUEVSQU5EX1VESVNQNiwgRlIzMF9PUEVSQU5EX0RJU1A4LCBGUjMwX09QRVJBTkRfRElTUDkKLSAsIEZSMzBfT1BFUkFORF9ESVNQMTAsIEZSMzBfT1BFUkFORF9TMTAsIEZSMzBfT1BFUkFORF9VMTAsIEZSMzBfT1BFUkFORF9JMzIKLSAsIEZSMzBfT1BFUkFORF9NNCwgRlIzMF9PUEVSQU5EX0kyMCwgRlIzMF9PUEVSQU5EX0RJUjgsIEZSMzBfT1BFUkFORF9ESVI5Ci0gLCBGUjMwX09QRVJBTkRfRElSMTAsIEZSMzBfT1BFUkFORF9MQUJFTDksIEZSMzBfT1BFUkFORF9MQUJFTDEyLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQKLSAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NULCBGUjMwX09QRVJBTkRfQ0MKLSAsIEZSMzBfT1BFUkFORF9DQ0MsIEZSMzBfT1BFUkFORF9OQklULCBGUjMwX09QRVJBTkRfVkJJVCwgRlIzMF9PUEVSQU5EX1pCSVQKLSAsIEZSMzBfT1BFUkFORF9DQklULCBGUjMwX09QRVJBTkRfSUJJVCwgRlIzMF9PUEVSQU5EX1NCSVQsIEZSMzBfT1BFUkFORF9UQklUCi0gLCBGUjMwX09QRVJBTkRfRDBCSVQsIEZSMzBfT1BFUkFORF9EMUJJVCwgRlIzMF9PUEVSQU5EX0NDUiwgRlIzMF9PUEVSQU5EX1NDUgotICwgRlIzMF9PUEVSQU5EX0lMTSwgRlIzMF9PUEVSQU5EX01BWAotfSBDR0VOX09QRVJBTkRfVFlQRTsKLQotLyogTnVtYmVyIG9mIG9wZXJhbmRzIHR5cGVzLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRTICgoaW50KSBGUjMwX09QRVJBTkRfTUFYKQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyByZWZlcmVuY2VkIGJ5IGFueSBpbnNuLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRfSU5TVEFOQ0VTIDgKLQotLyogSW5zbiBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faW5zbiBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMsIENHRU5fSU5TTl9WSVJUVUFMLCBDR0VOX0lOU05fVU5DT05EX0NUSSwgQ0dFTl9JTlNOX0NPTkRfQ1RJCi0gLCBDR0VOX0lOU05fU0tJUF9DVEksIENHRU5fSU5TTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fUkVMQVhBQkxFLCBDR0VOX0lOU05fUkVMQVgKLSAsIENHRU5fSU5TTl9OT19ESVMsIENHRU5fSU5TTl9QQkIsIENHRU5fSU5TTl9OT1RfSU5fREVMQVlfU0xPVCwgQ0dFTl9JTlNOX0VORF9CT09MUwotICwgQ0dFTl9JTlNOX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0lOU05fTUFDSCwgQ0dFTl9JTlNOX0VORF9OQk9PTFMKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2luc25fYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAoQ0dFTl9JTlNOX0VORF9OQk9PTFMgLSBDR0VOX0lOU05fU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogY2dlbi5oIHVzZXMgdGhpbmdzIHdlIGp1c3QgZGVmaW5lZC4gICovCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogQXR0cmlidXRlcy4gICovCi1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXTsKLQotLyogSGFyZHdhcmUgZGVjbHMuICAqLwotCi1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3BzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxNDsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjE1OwotCi0KLQotCi0jZW5kaWYgLyogRlIzMF9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWRpcy5jIGIvb3Bjb2Rlcy9mcjMwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdjMThjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tZGlzLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRGVmYXVsdCB0ZXh0IHRvIHByaW50IGlmIGFuIGluc3RydWN0aW9uIGlzbid0IHJlY29nbml6ZWQuICAqLwotI2RlZmluZSBVTktOT1dOX0lOU05fTVNHIF8oIip1bmtub3duKiIpCi0KLXN0YXRpYyB2b2lkIHByaW50X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyZXNzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2tleXdvcmQKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBDR0VOX0tFWVdPUkQgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0ZJRUxEUyAqLAotCSAgICAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsCi0JCQkgICAgICAgZGlzYXNzZW1ibGVfaW5mbyAqLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBkZWZhdWx0X3ByaW50X2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0MCi0vKiAtLSBkaXNhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLwotCi0vKiAtLSBkaXMuYyAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCBvZmZzZXQsIGxvYWRfc3RvcmUpCi0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGludCBsb2FkX3N0b3JlOyAvKiAwID09IGxvYWQsIDEgPT0gc3RvcmUgKi8KLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IGRpc19pbmZvOwotICBpbnQgbWFzazsKLSAgaW50IGluZGV4ID0gMDsKLSAgY2hhciogY29tbWEgPSAiIjsKLQotICBpZiAobG9hZF9zdG9yZSkKLSAgICBtYXNrID0gMHg4MDsKLSAgZWxzZQotICAgIG1hc2sgPSAxOwotCi0gIGlmICh2YWx1ZSAmIG1hc2spCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWkiLCBpbmRleCArIG9mZnNldCk7Ci0gICAgICBjb21tYSA9ICIsIjsKLSAgICB9Ci0gICAgCi0gIGZvciAoaW5kZXggPSAxOyBpbmRleCA8PSA3OyArK2luZGV4KQotICAgIHsKLSAgICAgIGlmIChsb2FkX3N0b3JlKQotCW1hc2sgPj49IDE7Ci0gICAgICBlbHNlCi0JbWFzayA8PD0gMTsKLQotICAgICAgaWYgKHZhbHVlICYgbWFzaykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzciVpIiwgY29tbWEsIGluZGV4ICsgb2Zmc2V0KTsKLQkgIGNvbW1hID0gIiwiOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgOCwgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgMCwgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCA4LCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgMCwgMS8qc3RvcmUqLyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9tNCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotfQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3IgcHJpbnRpbmcgb3BlcmFuZHMuCi0gICBYSU5GTyBpcyBhIGB2b2lkIConIGFuZCBub3QgYSBgZGlzYXNzZW1ibGVfaW5mbyAqJyB0byBub3QgcHV0IGEgcmVxdWlyZW1lbnQKLSAgIG9mIGRpcy1hc20uaCBvbiBjZ2VuLmguCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLXZvaWQKLWZyMzBfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgeGluZm8sIGZpZWxkcywgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBQVFIgeGluZm87Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIHZvaWQgY29uc3QgKmF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSB4aW5mbzsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9DUmksIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX0NSaiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcjEzLCBmaWVsZHMtPmZfbmlsLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTQsIGZpZWxkcy0+Zl9uaWwsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgZmllbGRzLT5mX25pbCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SaSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmljLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JqLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SamMsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgZmllbGRzLT5mX1JzMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCBmaWVsZHMtPmZfUnMyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9jYywgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2NjYywgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyMTAsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyOCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXI5LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDEwLCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDgsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOSwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pMjAsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9WSVJUVUFMKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2kzMiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1NJR05fT1BUKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaTgsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX3JlbDEyLCAwfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVsOSwgMHwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHByaW50X200IChjZCwgaW5mbywgZmllbGRzLT5mX200LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgZmllbGRzLT5mX25pbCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHByaW50X2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHByaW50X2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBwcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBwcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3MxMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91MTAsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3U0LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTRjLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91OCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VkaXNwNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotY2dlbl9wcmludF9mbiAqIGNvbnN0IGZyMzBfY2dlbl9wcmludF9oYW5kbGVyc1tdID0gCi17Ci0gIHByaW50X2luc25fbm9ybWFsLAotfTsKLQotCi12b2lkCi1mcjMwX2NnZW5faW5pdF9kaXMgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBmcjMwX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cHJpbnRfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9wcmludF9oYW5kbGVyc1swXTsKLSAgY2QtPnByaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fcHJpbnRfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBwcmludCBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X25vcm1hbCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0KLSNpZmRlZiBDR0VOX1BSSU5UX05PUk1BTAotICBDR0VOX1BSSU5UX05PUk1BTCAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgdmFsdWUpOwotfQotCi0vKiBEZWZhdWx0IGFkZHJlc3MgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyZXNzIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfQUREUkVTUwotICBDR0VOX1BSSU5UX0FERFJFU1MgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLwotICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQotICAgIDsgLyogbm90aGluZyB0byBkbyAqLwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSkKLSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfQUJTX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgKGxvbmcpIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCAobG9uZykgdmFsdWUpOwotfQotCi0vKiBLZXl3b3JkIHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfa2V5d29yZCAoY2QsIGRpc19pbmZvLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZSwgYXR0cnMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgQ0dFTl9LRVlXT1JEICprZXl3b3JkX3RhYmxlOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLQotICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGtleXdvcmRfdGFibGUsIHZhbHVlKTsKLSAgaWYgKGtlICE9IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGtlLT5uYW1lKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPz8/Iik7Ci19Ci0MCi0vKiBEZWZhdWx0IGluc24gcHJpbnRlci4KLQotICAgRElTX0lORk8gaXMgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGUgZGlzYXNzZW1ibGVyIG5lZWRuJ3Qga25vdyBhbnl0aGluZwotICAgYWJvdXQgZGlzYXNzZW1ibGVfaW5mby4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuX25vcm1hbCAoY2QsIGRpc19pbmZvLCBpbnNuLCBmaWVsZHMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fSU5JVF9QUklOVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIENHRU5fU1lOVEFYX0NIQVIgKCpzeW4pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgKi8KLSAgICAgIGZyMzBfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLCBpbmZvLAotCQkJCSBmaWVsZHMsIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIHBjLCBsZW5ndGgpOwotICAgIH0KLX0KLQwKLS8qIFV0aWxpdHkgdG8gcHJpbnQgYW4gaW5zbi4KLSAgIEJVRiBpcyB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLCB0YXJnZXQgYnl0ZSBvcmRlciwgQlVGTEVOIGJ5dGVzIGxvbmcuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGJ1ZmxlbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgYnVmbGVuOwotewotICB1bnNpZ25lZCBsb25nIGluc25fdmFsdWU7Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7Ci0gIENHRU5fRVhUUkFDVF9JTkZPIGV4X2luZm87Ci0KLSAgZXhfaW5mby5kaXNfaW5mbyA9IGluZm87Ci0gIGV4X2luZm8udmFsaWQgPSAoMSA8PCAoY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCkpIC0gMTsKLSAgZXhfaW5mby5pbnNuX2J5dGVzID0gYnVmOwotCi0gIHN3aXRjaCAoYnVmbGVuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbnNuX3ZhbHVlID0gYnVmWzBdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMTYgKGJ1ZikgOiBiZmRfZ2V0bDE2IChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMzIgKGJ1ZikgOiBiZmRfZ2V0bDMyIChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaCBsaXN0cy4KLSAgICAgUGljayB0aGUgZmlyc3Qgb25lIGFuZCBrZWVwIHRyeWluZyB1bnRpbCB3ZSBmaW5kIHRoZSByaWdodCBvbmUuICAqLwotCi0gIGluc25fbGlzdCA9IENHRU5fRElTX0xPT0tVUF9JTlNOIChjZCwgYnVmLCBpbnNuX3ZhbHVlKTsKLSAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKLSAgICAgIENHRU5fRklFTERTIGZpZWxkczsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgaW5zbiBzaG91bGRuJ3QgYmUgaW4gaGFzaCBsaXN0cyBpZiBub3Qgc3VwcG9ydGVkICovCi0gICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLwotICAgICAgaWYgKCEgZnIzMF9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUgZXh0cmFjdAotCSBoYW5kbGVyLiAgKi8KLSAgICAgIGlmICgoaW5zbl92YWx1ZSAmIENHRU5fSU5TTl9CQVNFX01BU0sgKGluc24pKQotCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQotCXsKLQkgIC8qIFByaW50aW5nIGlzIGhhbmRsZWQgaW4gdHdvIHBhc3Nlcy4gIFRoZSBmaXJzdCBwYXNzIHBhcnNlcyB0aGUKLQkgICAgIG1hY2hpbmUgaW5zbiBhbmQgZXh0cmFjdHMgdGhlIGZpZWxkcy4gIFRoZSBzZWNvbmQgcGFzcyBwcmludHMKLQkgICAgIHRoZW0uICAqLwotCi0JICBsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCSAgICAoY2QsIGluc24sICZleF9pbmZvLCBpbnNuX3ZhbHVlLCAmZmllbGRzLCBwYyk7Ci0JICAvKiBsZW5ndGggPCAwIC0+IGVycm9yICovCi0JICBpZiAobGVuZ3RoIDwgMCkKLQkgICAgcmV0dXJuIGxlbmd0aDsKLQkgIGlmIChsZW5ndGggPiAwKQotCSAgICB7Ci0JICAgICAgQ0dFTl9QUklOVF9GTiAoY2QsIGluc24pIChjZCwgaW5mbywgaW5zbiwgJmZpZWxkcywgcGMsIGxlbmd0aCk7Ci0JICAgICAgLyogbGVuZ3RoIGlzIGluIGJpdHMsIHJlc3VsdCBpcyBpbiBieXRlcyAqLwotCSAgICAgIHJldHVybiBsZW5ndGggLyA4OwotCSAgICB9Ci0JfQotCi0gICAgICBpbnNuX2xpc3QgPSBDR0VOX0RJU19ORVhUX0lOU04gKGluc25fbGlzdCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBEZWZhdWx0IHZhbHVlIGZvciBDR0VOX1BSSU5UX0lOU04uCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJlZCBmZXRjaGluZyBieXRlcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9QUklOVF9JTlNOCi0jZGVmaW5lIENHRU5fUFJJTlRfSU5TTiBkZWZhdWx0X3ByaW50X2luc24KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X3ByaW50X2luc24gKGNkLCBwYywgaW5mbykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY2hhciBidWZbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBSZWFkIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24uICAqLwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoaW4gYnl0ZXMpLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2ZyMzAgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgQ0dFTl9DUFVfREVTQyBjZCA9IDA7Ci0gIHN0YXRpYyBwcmV2X2lzYSxwcmV2X21hY2gscHJldl9lbmRpYW47Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpc2EsbWFjaDsKLSAgaW50IGVuZGlhbiA9IChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJPyBDR0VOX0VORElBTl9CSUcKLQkJOiBDR0VOX0VORElBTl9MSVRUTEUpOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiA/Pz8gZ2RiIHdpbGwgc2V0IG1hY2ggYnV0IGxlYXZlIHRoZSBhcmNoaXRlY3R1cmUgYXMgInVua25vd24iICovCi0jaWZuZGVmIENHRU5fQkZEX0FSQ0gKLSNkZWZpbmUgQ0dFTl9CRkRfQVJDSCBiZmRfYXJjaF9mcjMwCi0jZW5kaWYKLSAgYXJjaCA9IGluZm8tPmFyY2g7Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYXJjaCA9IENHRU5fQkZEX0FSQ0g7Ci0gICAgICAKLSAgLyogVGhlcmUncyBubyBzdGFuZGFyZCB3YXkgdG8gY29tcHV0ZSB0aGUgaXNhIG51bWJlciAoZS5nLiBmb3IgYXJtIHRodW1iKQotICAgICBzbyB3ZSBsZWF2ZSBpdCB0byB0aGUgdGFyZ2V0LiAgKi8KLSNpZmRlZiBDR0VOX0NPTVBVVEVfSVNBCi0gIGlzYSA9IENHRU5fQ09NUFVURV9JU0EgKGluZm8pOwotI2Vsc2UKLSAgaXNhID0gMDsKLSNlbmRpZgotCi0gIG1hY2ggPSBpbmZvLT5tYWNoOwotCi0gIC8qIElmIHdlJ3ZlIHN3aXRjaGVkIGNwdSdzLCBjbG9zZSB0aGUgY3VycmVudCB0YWJsZSBhbmQgb3BlbiBhIG5ldyBvbmUuICAqLwotICBpZiAoY2QKLSAgICAgICYmIChpc2EgIT0gcHJldl9pc2EKLQkgIHx8IG1hY2ggIT0gcHJldl9tYWNoCi0JICB8fCBlbmRpYW4gIT0gcHJldl9lbmRpYW4pKQotICAgIHsKLSAgICAgIGZyMzBfY2dlbl9jcHVfY2xvc2UgKGNkKTsKLSAgICAgIGNkID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB5ZXQsIGluaXRpYWxpemUgdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIGlmICghIGNkKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaF90eXBlID0gYmZkX2xvb2t1cF9hcmNoIChhcmNoLCBtYWNoKTsKLSAgICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKLQotICAgICAgaWYgKCFhcmNoX3R5cGUpCi0JYWJvcnQgKCk7Ci0gICAgICBtYWNoX25hbWUgPSBhcmNoX3R5cGUtPnByaW50YWJsZV9uYW1lOwotCi0gICAgICBwcmV2X2lzYSA9IGlzYTsKLSAgICAgIHByZXZfbWFjaCA9IG1hY2g7Ci0gICAgICBwcmV2X2VuZGlhbiA9IGVuZGlhbjsKLSAgICAgIGNkID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0lTQVMsIHByZXZfaXNhLAotCQkJCSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIHByZXZfZW5kaWFuLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gICAgICBpZiAoIWNkKQotCWFib3J0ICgpOwotICAgICAgZnIzMF9jZ2VuX2luaXRfZGlzIChjZCk7Ci0gICAgfQotCi0gIC8qIFdlIHRyeSB0byBoYXZlIGFzIG11Y2ggY29tbW9uIGNvZGUgYXMgcG9zc2libGUuCi0gICAgIEJ1dCBhdCB0aGlzIHBvaW50IHNvbWUgdGFyZ2V0cyBuZWVkIHRvIHRha2Ugb3Zlci4gICovCi0gIC8qID8/PyBTb21lIHRhcmdldHMgbWF5IG5lZWQgYSBob29rIGVsc2V3aGVyZS4gIFRyeSB0byBhdm9pZCB0aGlzLAotICAgICBidXQgaWYgbm90IHBvc3NpYmxlIHRyeSB0byBtb3ZlIHRoaXMgaG9vayBlbHNld2hlcmUgcmF0aGVyIHRoYW4KLSAgICAgaGF2ZSB0d28gaG9va3MuICAqLwotICBsZW5ndGggPSBDR0VOX1BSSU5UX0lOU04gKGNkLCBwYywgaW5mbyk7Ci0gIGlmIChsZW5ndGggPiAwKQotICAgIHJldHVybiBsZW5ndGg7Ci0gIGlmIChsZW5ndGggPCAwKQotICAgIHJldHVybiAtMTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0gIHJldHVybiBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgLyA4OwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWlibGQuYyBiL29wY29kZXMvZnIzMC1pYmxkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjYxM2QuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWlibGQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MDYgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gYnVpbGRpbmcvZXh0cmFjdGlvbiBzdXBwb3J0IGZvciBmcjMwLiAtKi0gQyAtKi0KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWlibGQuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotLyogVXNlZCBieSB0aGUgaWZpZWxkIHJ0eCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEZMRChmKSAoZmllbGRzLT5mKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgbG9uZywgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBDR0VOX0lOU05fQllURVNfUFRSKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwKLQkgICAgICBDR0VOX0ZJRUxEUyAqLCBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBpbnQgZXh0cmFjdF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGxvbmcgKikpOwotc3RhdGljIGludCBleHRyYWN0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLAotCSAgICAgIENHRU5fSU5TTl9JTlQsIENHRU5fRklFTERTICosIGJmZF92bWEpKTsKLQwKLS8qIE9wZXJhbmQgaW5zZXJ0aW9uLiAgKi8KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLS8qIFN1YnJvdXRpbmUgb2YgaW5zZXJ0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSB2b2lkCi1pbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKLXsKLSAgdW5zaWduZWQgbG9uZyB4LG1hc2s7Ci0gIGludCBzaGlmdDsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgeCA9ICpidWZwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIxNiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIzMiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0gIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICB4ID0gKHggJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgKmJ1ZnAgPSB4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQliZmRfcHV0YjE2ICh4LCBidWZwKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDE2ICh4LCBidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl7Ci0JICBidWZwWzBdID0geCA+PiAxNjsKLQkgIGJmZF9wdXRiMTYgKHgsIGJ1ZnAgKyAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dGwxNiAoeCwgYnVmcCk7Ci0JICBidWZwWzJdID0geCA+PiAxNjsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMzIgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGluc2VydGlvbiByb3V0aW5lLgotCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotLyogPz8/IFRoaXMgZHVwbGljYXRlcyBmdW5jdGlvbmFsaXR5IHdpdGggYmZkJ3MgaG93dG8gdGFibGUgYW5kCi0gICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwKLQkgICAgICAgdG90YWxfbGVuZ3RoLCBidWZmZXIpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLXsKLSAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChDR0VOX0lOVF9JTlNOX1AKLSAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGJhc2UtaW5zbi1iaXRzaXplLAotICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCi0gIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAotCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0Jd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0gICAgfQotCi0gIC8qIEVuc3VyZSBWQUxVRSB3aWxsIGZpdC4gICovCi0gIGlmICghIENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBtYXh2YWwgPSBtYXNrOwotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgc3ByaW50ZiAoZXJyYnVmLAotCQkgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuIDAgYW5kICVsdSkiKSwKLQkJICAgdmFsdWUsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIG1pbnZhbCA9IC0gKDFMIDw8IChsZW5ndGggLSAxKSk7Ci0gICAgICBsb25nIG1heHZhbCA9ICgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMTsKLSAgICAgIGlmICh2YWx1ZSA8IG1pbnZhbCB8fCB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICBzcHJpbnRmCi0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIChlcnJidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIiksCi0JICAgICB2YWx1ZSwgbWludmFsLCBtYXh2YWwpOwotCSAgcmV0dXJuIGVycmJ1ZjsKLQl9Ci0gICAgfQotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgewotICAgIGludCBzaGlmdDsKLQotICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgICBlbHNlCi0gICAgICBzaGlmdCA9IHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKTsKLSAgICAqYnVmZmVyID0gKCpidWZmZXIgJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0gIH0KLQotI2Vsc2UgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlciArIHdvcmRfb2Zmc2V0IC8gODsKLQotICAgIGluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKTsKLSAgfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGJ1aWxkZXIgKGluc2VydCBoYW5kbGVyKS4KLSAgIFRoZSBpbnN0cnVjdGlvbiBpcyByZWNvcmRlZCBpbiBDR0VOX0lOVF9JTlNOX1AgYnl0ZSBvcmRlcgotICAgKG1lYW5pbmcgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgQlVGRkVSIGlzIGFuIGludCAqIGFuZCB0aHVzIHRoZSB2YWx1ZSBpcwotICAgcmVjb3JkZWQgaW4gaG9zdCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGRkVSIGlzIGFuIGFycmF5IG9mIGJ5dGVzIGFuZCB0aGUKLSAgIHZhbHVlIGlzIHJlY29yZGVkIGluIHRhcmdldCBieXRlIG9yZGVyKS4KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbnNlcnRfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotCi0gIENHRU5fSU5JVF9JTlNFUlQgKGNkKTsKLSAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbik7Ci0KLSAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKLSAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbGF0ZXIuICAqLwotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgKmJ1ZmZlciA9IHZhbHVlOwotCi0jZWxzZQotCi0gIGNnZW5fcHV0X2luc25fdmFsdWUgKGNkLCBidWZmZXIsIG1pbiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplLAotCQkJCQlDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpKSwKLQkJICAgICAgIHZhbHVlKTsKLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgLyogPz8/IEl0IHdvdWxkIGJlIGJldHRlciB0byBzY2FuIHRoZSBmb3JtYXQncyBmaWVsZHMuCi0gICAgIFN0aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBpbnNlcnQgYSB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCB0aG91Z2g7Ci0gICAgIGUuZy4gc3RvcmluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgdGhhdCBnb3QgcmVzb2x2ZWQgbGF0ZXIuCi0gICAgIE5lZWRzIG1vcmUgdGhvdWdodCBmaXJzdC4gICovCi0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICogc3luICE9ICdcMCc7ICsrIHN5bikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQljb250aW51ZTsKLQotICAgICAgZXJybXNnID0gKCogY2QtPmluc2VydF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkgICAgICAgZmllbGRzLCBidWZmZXIsIHBjKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0vKiBPcGVyYW5kIGV4dHJhY3Rpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4KLSAgIEVuc3VyZSBzdWZmaWNpZW50IGJ5dGVzIGFyZSBjYWNoZWQgaW4gRVhfSU5GTy4KLSAgIE9GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIEJZVEVTIGlzIHRoZSBsZW5ndGggb2YgdGhlIG5lZWRlZCB2YWx1ZS4KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBpbnQKLWZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCBvZmZzZXQsIGJ5dGVzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBvZmZzZXQsIGJ5dGVzOwotICAgICBiZmRfdm1hIHBjOwotewotICAvKiBJdCdzIGRvdWJ0ZnVsIHRoYXQgdGhlIG1pZGRsZSBwYXJ0IGhhcyBhbHJlYWR5IGJlZW4gZmV0Y2hlZCBzbwotICAgICB3ZSBkb24ndCBvcHRpbWl6ZSB0aGF0IGNhc2UuICBraXNzLiAgKi8KLSAgaW50IG1hc2s7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBleF9pbmZvLT5kaXNfaW5mbzsKLQotICAvKiBGaXJzdCBkbyBhIHF1aWNrIGNoZWNrLiAgKi8KLSAgbWFzayA9ICgxIDw8IGJ5dGVzKSAtIDE7Ci0gIGlmICgoKGV4X2luZm8tPnZhbGlkID4+IG9mZnNldCkgJiBtYXNrKSA9PSBtYXNrKQotICAgIHJldHVybiAxOwotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGJ5dGUgd2UgbmVlZCB0byByZWFkLiAgKi8KLSAgZm9yIChtYXNrID0gMSA8PCBvZmZzZXQ7IGJ5dGVzID4gMDsgLS1ieXRlcywgKytvZmZzZXQsIG1hc2sgPDw9IDEpCi0gICAgaWYgKCEgKG1hc2sgJiBleF9pbmZvLT52YWxpZCkpCi0gICAgICBicmVhazsKLQotICBpZiAoYnl0ZXMpCi0gICAgewotICAgICAgaW50IHN0YXR1czsKLQotICAgICAgcGMgKz0gb2Zmc2V0OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShwYywgZXhfaW5mby0+aW5zbl9ieXRlcyArIG9mZnNldCwgYnl0ZXMsIGluZm8pOwotCi0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBleF9pbmZvLT52YWxpZCB8PSAoKDEgPDwgYnl0ZXMpIC0gMSkgPDwgb2Zmc2V0OwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBsb25nCi1leHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotICAgICBiZmRfdm1hIHBjOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHJldHVybiAoeCA+PiBzaGlmdCkgJiBtYXNrOwotfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotLyogRGVmYXVsdCBleHRyYWN0aW9uIHJvdXRpbmUuCi0KLSAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgb2YgdGhlIGluc24gaW4gaG9zdCBvcmRlciwKLSAgIG9yIHNvbWV0aW1lcyBsZXNzIGZvciBjYXNlcyBsaWtlIHRoZSBtMzJyIHdoZXJlIHRoZSBiYXNlIGluc24gc2l6ZSBpcyAzMgotICAgYnV0IHNvbWUgaW5zbnMgYXJlIDE2IGJpdHMuCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4gIFdlIG9ubHkgbmVlZCBgU0lHTkVEJywKLSAgIGJ1dCBmb3IgZ2VuZXJhbGl0eSB3ZSB0YWtlIGEgYml0bWFzayBvZiBhbGwgb2YgdGhlbS4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi0vKiA/Pz8gVGhlIHJldHVybiBjb2RlIGlzbid0IHByb3Blcmx5IHVzZWQuICB3aXAuICAqLwotCi0vKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwKLQkJd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aCwgcGMsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUKLSAgICAgc28gZ2l2ZSBpdCBhIHN0YW5kYXJkIHZhbHVlIG9mIHplcm8uICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgewotICAgICAgKnZhbHVlcCA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgaW5zbi1iYXNlLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRG9lcyB0aGUgdmFsdWUgcmVzaWRlIGluIElOU05fVkFMVUU/ICAqLwotCi0gIGlmICh3b3JkX29mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gICAgICBDR0VOX0lOU05fSU5UIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0gICAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKChzdGFydCArIDEpIC0gbGVuZ3RoKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gICAgICB2YWx1ZSAmPSBtYXNrOwotICAgICAgLyogc2lnbiBleHRlbmQ/ICovCi0gICAgICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgKDFMIDw8IChsZW5ndGggLSAxKSkpKQotCXZhbHVlIHw9IH5tYXNrOwotICAgIH0KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSBleF9pbmZvLT5pbnNuX2J5dGVzICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgICBpZiAod29yZF9sZW5ndGggPiAzMikKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKGZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCB3b3JkX29mZnNldCAvIDgsIHdvcmRfbGVuZ3RoIC8gOCwgcGMpID09IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAgIHZhbHVlID0gZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gICp2YWx1ZXAgPSB2YWx1ZTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGV4dHJhY3Rvci4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cywgdHJhbnNsYXRlZCB0byBob3N0IG9yZGVyLgotICAgVGhlIGV4dHJhY3RlZCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBFWF9JTkZPIGlzIHVzZWQgdG8gaGFuZGxlIHJlYWRpbmcgdmFyaWFibGUgbGVuZ3RoIGluc25zLgotICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cywgb3IgMCBpZiBubyBtYXRjaCwKLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycyBmZXRjaGluZyBkYXRhIChtZW1vcnlfZXJyb3JfZnVuYyB3aWxsIGhhdmUKLSAgIGJlZW4gY2FsbGVkKS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci0KLSAgQ0dFTl9JTklUX0VYVFJBQ1QgKGNkKTsKLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKnN5bjsgKytzeW4pCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JY29udGludWU7Ci0KLSAgICAgIGxlbmd0aCA9ICgqIGNkLT5leHRyYWN0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQlleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKTsKLSAgICAgIGlmIChsZW5ndGggPD0gMCkKLQlyZXR1cm4gbGVuZ3RoOwotICAgIH0KLQotICAvKiBXZSByZWNvZ25pemVkIGFuZCBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkIHRoaXMgaW5zbi4gICovCi0gIHJldHVybiBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci19Ci0MCi0vKiBtYWNoaW5lIGdlbmVyYXRlZCBjb2RlIGFkZGVkIGhlcmUgKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBpbnNlcnRpb24uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4gIEl0J3MgYWxzbyBuZWVkZWQgYnkgR0FTIHRvIGluc2VydCBvcGVyYW5kcyB0aGF0IGNvdWxkbid0IGJlCi0gICByZXNvbHZlZCBkdXJpbmcgcGFyc2luZy4KLSovCi0KLWNvbnN0IGNoYXIgKgotZnIzMF9jZ2VuX2luc2VydF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCBidWZmZXIsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBjaGFyICogZXJybXNnOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX0NSaSwgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfQ1JqLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX25pbCwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfbmlsLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9uaWwsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmksIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmljLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JqLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmpjLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JzMSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JzMiwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2NjLCAwLCAwLCA0LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfY2NjLCAwLCAxNiwgMCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXIxMDsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfZGlyOCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpcjk7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTA7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfZGlzcDgsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A5OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgewotewotICBGTEQgKGZfaTIwXzQpID0gKCh1bnNpZ25lZCBpbnQpIChGTEQgKGZfaTIwKSkgPj4gKDE2KSk7Ci0gIEZMRCAoZl9pMjBfMTYpID0gKChGTEQgKGZfaTIwKSkgJiAoNjU1MzUpKTsKLX0KLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMjBfNCwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgICAgaWYgKGVycm1zZykKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMjBfMTYsIDAsIDE2LCAwLCAxNiwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgICAgaWYgKGVycm1zZykKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2kzMiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMTYsIDAsIDMyLCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pOCwgMCwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3JlbDEyOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgKyAoMikpKSkpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgNSwgMTEsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3JlbDk7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtICgoKHBjKSArICgyKSkpKSkgPj4gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX200OwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpICYgKDE1KSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfbmlsLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91NCwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U0YywgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U4LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGV4dHJhY3Rpb24uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWludAotZnIzMF9jZ2VuX2V4dHJhY3Rfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgaW50IGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9DUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9DUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9Saik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JqYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUnMxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUnMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAwLCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfY2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX2RpcjEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2RpcjgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgxKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXI5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2Rpc3A4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgxKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTIwXzQpOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAwLCAxNiwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2kyMF8xNik7Ci17Ci0gIEZMRCAoZl9pMjApID0gKCgoKEZMRCAoZl9pMjBfNCkpIDw8ICgxNikpKSB8IChGTEQgKGZfaTIwXzE2KSkpOwotfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMTYsIDAsIDMyLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2k4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDUsIDExLCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMSkpKSArICgoKHBjKSArICgyKSkpKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOwotICAgICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSB8ICgoKC0xKSA8PCAoNCkpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3MxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91NGMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLWNnZW5faW5zZXJ0X2ZuICogY29uc3QgZnIzMF9jZ2VuX2luc2VydF9oYW5kbGVyc1tdID0gCi17Ci0gIGluc2VydF9pbnNuX25vcm1hbCwKLX07Ci0KLWNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0IGZyMzBfY2dlbl9leHRyYWN0X2hhbmRsZXJzW10gPSAKLXsKLSAgZXh0cmFjdF9pbnNuX25vcm1hbCwKLX07Ci0KLS8qIEdldHRpbmcgdmFsdWVzIGZyb20gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSByZXR1cm4uCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIHJlc3VsdCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi1pbnQKLWZyMzBfY2dlbl9nZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgaW50IHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaWM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SamM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2k4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NGM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWJmZF92bWEKLWZyMzBfY2dlbl9nZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JqOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmljOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmpjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9jYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9jY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXIxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kyMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVsMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVsOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX200OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTRjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWRpc3A2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBTdHVmZmluZyB2YWx1ZXMgaW4gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSBhY2NlcHQuCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIGFyZ3VtZW50IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9zZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgZmllbGRzLT5mX0NSaSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGZpZWxkcy0+Zl9DUmogPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGZpZWxkcy0+Zl9SaSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGZpZWxkcy0+Zl9SaWMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGZpZWxkcy0+Zl9SaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGZpZWxkcy0+Zl9SamMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBmaWVsZHMtPmZfUnMxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZmllbGRzLT5mX1JzMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZmllbGRzLT5mX2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgZmllbGRzLT5mX2NjYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgZmllbGRzLT5mX2RpcjEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXI4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXI5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgZmllbGRzLT5mX2Rpc3AxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICBmaWVsZHMtPmZfaTIwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZmllbGRzLT5mX2kzMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZmllbGRzLT5mX2k4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWwxMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBmaWVsZHMtPmZfbTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgZmllbGRzLT5mX3MxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIGZpZWxkcy0+Zl91MTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIGZpZWxkcy0+Zl91NCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGZpZWxkcy0+Zl91NGMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGZpZWxkcy0+Zl91OCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIGZpZWxkcy0+Zl91ZGlzcDYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi12b2lkCi1mcjMwX2NnZW5fc2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBmaWVsZHMtPmZfQ1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgZmllbGRzLT5mX0NSaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZmllbGRzLT5mX1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZmllbGRzLT5mX1JpYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZmllbGRzLT5mX1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZmllbGRzLT5mX1JqYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGZpZWxkcy0+Zl9SczEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBmaWVsZHMtPmZfUnMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBmaWVsZHMtPmZfY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBmaWVsZHMtPmZfY2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgZmllbGRzLT5mX2RpcjggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIGZpZWxkcy0+Zl9pMjAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBmaWVsZHMtPmZfaTMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBmaWVsZHMtPmZfaTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZmllbGRzLT5mX3U0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgZmllbGRzLT5mX3U0YyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgZmllbGRzLT5mX3U4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBpbnN0cnVjdGlvbiBidWlsZGVyIHRhYmxlcy4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBjZC0+aW5zZXJ0X2hhbmRsZXJzID0gJiBmcjMwX2NnZW5faW5zZXJ0X2hhbmRsZXJzWzBdOwotICBjZC0+ZXh0cmFjdF9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbMF07Ci0KLSAgY2QtPmluc2VydF9vcGVyYW5kID0gZnIzMF9jZ2VuX2luc2VydF9vcGVyYW5kOwotICBjZC0+ZXh0cmFjdF9vcGVyYW5kID0gZnIzMF9jZ2VuX2V4dHJhY3Rfb3BlcmFuZDsKLQotICBjZC0+Z2V0X2ludF9vcGVyYW5kID0gZnIzMF9jZ2VuX2dldF9pbnRfb3BlcmFuZDsKLSAgY2QtPnNldF9pbnRfb3BlcmFuZCA9IGZyMzBfY2dlbl9zZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5nZXRfdm1hX29wZXJhbmQgPSBmcjMwX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kOwotICBjZC0+c2V0X3ZtYV9vcGVyYW5kID0gZnIzMF9jZ2VuX3NldF92bWFfb3BlcmFuZDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1vcGMuYyBiL29wY29kZXMvZnIzMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyMTAwZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY4ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIG9wY29kZSB0YWJsZSBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLQotLyogVGhlIGhhc2ggZnVuY3Rpb25zIGFyZSByZWNvcmRlZCBoZXJlIHRvIGhlbHAga2VlcCBhc3NlbWJsZXIgY29kZSBvdXQgb2YKLSAgIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHZpY2UgdmVyc2EuICAqLwotCi1zdGF0aWMgaW50IGFzbV9oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBhc21faGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBkaXNfaGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGlzX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotLyogSW5zdHJ1Y3Rpb24gZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgRihmKSAmIGZyMzBfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKEZSMzBfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZW1wdHkgPSB7Ci0gIDAsIDAsIDB4MCwgeyAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JKKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZGkgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1U0KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZDIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX000KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2RpdjBzID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZGl2MyA9IHsKLSAgMTYsIDE2LCAweGZmZmYsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9PUDQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4ID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfSTgpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMjAgPSB7Ci0gIDE2LCAzMiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JMjApLCBGIChGX09QMiksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkzMiA9IHsKLSAgMTYsIDQ4LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0kzMiksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTQgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9ESVNQMTApLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTR1aCA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1A5KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE0dWIgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9ESVNQOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNSA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVURJU1A2KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE1ZHIgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUlMyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbW92ZHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JTMSksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jYWxsID0gewotICAxNiwgMTYsIDB4ZjgwMCwgeyBGIChGX09QMSksIEYgKEZfT1A1KSwgRiAoRl9SRUwxMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2ludCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmFkID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfQ0MpLCBGIChGX1JFTDkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kbW92cjEzID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9ESVIxMCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2Rtb3ZyMTNoID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9ESVI5KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZG1vdnIxM2IgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BvcCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX0NSSiksIEYgKEZfVTRDKSwgRiAoRl9DUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BsZCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JKQyksIEYgKEZfVTRDKSwgRiAoRl9DUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BzdCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX0NSSiksIEYgKEZfVTRDKSwgRiAoRl9SSUMpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGRzcCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUzEwKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRtMCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9MT1dfTEQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZG0xID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0hJX0xEKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RtMCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9MT1dfU1QpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdG0xID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0hJX1NUKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZW50ZXIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1UxMCksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChGUjMwX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgZnIzMF9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgeyAwIH0gfSwKLS8qIGFkZCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhNjAwIH0KLSAgfSwKLS8qIGFkZCAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTQwMCB9Ci0gIH0sCi0vKiBhZGQyICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhNTAwIH0KLSAgfSwKLS8qIGFkZGMgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTcwMCB9Ci0gIH0sCi0vKiBhZGRuICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGEyMDAgfQotICB9LAotLyogYWRkbiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTAwMCB9Ci0gIH0sCi0vKiBhZGRuMiAkbTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQyLCB7IDB4YTEwMCB9Ci0gIH0sCi0vKiBzdWIgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWMwMCB9Ci0gIH0sCi0vKiBzdWJjICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFkMDAgfQotICB9LAotLyogc3VibiAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhZTAwIH0KLSAgfSwKLS8qIGNtcCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYTAwIH0KLSAgfSwKLS8qIGNtcCAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTgwMCB9Ci0gIH0sCi0vKiBjbXAyICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhOTAwIH0KLSAgfSwKLS8qIGFuZCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4MjAwIH0KLSAgfSwKLS8qIG9yICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDkyMDAgfQotICB9LAotLyogZW9yICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDlhMDAgfQotICB9LAotLyogYW5kICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDg0MDAgfQotICB9LAotLyogYW5kaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4NTAwIH0KLSAgfSwKLS8qIGFuZGIgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODYwMCB9Ci0gIH0sCi0vKiBvciAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NDAwIH0KLSAgfSwKLS8qIG9yaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NTAwIH0KLSAgfSwKLS8qIG9yYiAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NjAwIH0KLSAgfSwKLS8qIGVvciAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5YzAwIH0KLSAgfSwKLS8qIGVvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWQwMCB9Ci0gIH0sCi0vKiBlb3JiICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDllMDAgfQotICB9LAotLyogYmFuZGwgJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDgwMDAgfQotICB9LAotLyogYm9ybCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4OTAwMCB9Ci0gIH0sCi0vKiBiZW9ybCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4OTgwMCB9Ci0gIH0sCi0vKiBiYW5kaCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4ODEwMCB9Ci0gIH0sCi0vKiBib3JoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5MTAwIH0KLSAgfSwKLS8qIGJlb3JoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5OTAwIH0KLSAgfSwKLS8qIGJ0c3RsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4ODAwIH0KLSAgfSwKLS8qIGJ0c3RoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4OTAwIH0KLSAgfSwKLS8qIG11bCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhZjAwIH0KLSAgfSwKLS8qIG11bHUgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWIwMCB9Ci0gIH0sCi0vKiBtdWxoICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGJmMDAgfQotICB9LAotLyogbXVsdWggJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmIwMCB9Ci0gIH0sCi0vKiBkaXYwcyAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NDAgfQotICB9LAotLyogZGl2MHUgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzUwIH0KLSAgfSwKLS8qIGRpdjEgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzYwIH0KLSAgfSwKLS8qIGRpdjIgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzcwIH0KLSAgfSwKLS8qIGRpdjMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmNjAgfQotICB9LAotLyogZGl2NHMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmNzAgfQotICB9LAotLyogbHNsICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGI2MDAgfQotICB9LAotLyogbHNsICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiNDAwIH0KLSAgfSwKLS8qIGxzbDIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI1MDAgfQotICB9LAotLyogbHNyICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGIyMDAgfQotICB9LAotLyogbHNyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiMDAwIH0KLSAgfSwKLS8qIGxzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGIxMDAgfQotICB9LAotLyogYXNyICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGJhMDAgfQotICB9LAotLyogYXNyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiODAwIH0KLSAgfSwKLS8qIGFzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI5MDAgfQotICB9LAotLyogbGRpOjggJGk4LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEk4KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpOCwgeyAweGMwMDAgfQotICB9LAotLyogbGRpOjIwICRpMjAsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTIwKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMjAsIHsgMHg5YjAwIH0KLSAgfSwKLS8qIGxkaTozMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEkzMiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTMyLCB7IDB4OWY4MCB9Ci0gIH0sCi0vKiBsZCBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg0MDAgfQotICB9LAotLyogbGR1aCBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg1MDAgfQotICB9LAotLyogbGR1YiBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg2MDAgfQotICB9LAotLyogbGQgQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgwIH0KLSAgfSwKLS8qIGxkdWggQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAgfQotICB9LAotLyogbGR1YiBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTQsJGRpc3AxMCksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1AxMCksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTQsIHsgMHgyMDAwIH0KLSAgfSwKLS8qIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A5KSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNHVoLCB7IDB4NDAwMCB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOCksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1YiwgeyAweDYwMDAgfQotICB9LAotLyogbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTUpLCAnLCcsIE9QIChVRElTUDYpLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1LCB7IDB4MzAwIH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg3MDAgfQotICB9LAotLyogbGQgQCRSMTUrLCRSczIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCBPUCAoUlMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1ZHIsIHsgMHg3ODAgfQotICB9LAotLyogbGQgQCRSMTUrLCRwcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChQUyksIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4NzkwIH0KLSAgfSwKLS8qIHN0ICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE0MDAgfQotICB9LAotLyogc3RoICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE1MDAgfQotICB9LAotLyogc3RiICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE2MDAgfQotICB9LAotLyogc3QgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAwIH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDExMDAgfQotICB9LAotLyogc3RiICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTIwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDEwKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTQsIHsgMHgzMDAwIH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjE0LCRkaXNwOSkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOSksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWgsIHsgMHg1MDAwIH0KLSAgfSwKLS8qIHN0YiAkUmksQCgkUjE0LCRkaXNwOCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWIsIHsgMHg3MDAwIH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTUsJHVkaXNwNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTUpLCAnLCcsIE9QIChVRElTUDYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNSwgeyAweDEzMDAgfQotICB9LAotLyogc3QgJFJpLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDE3MDAgfQotICB9LAotLyogc3QgJFJzMixALSRSMTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSUzIpLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1ZHIsIHsgMHgxNzgwIH0KLSAgfSwKLS8qIHN0ICRwcyxALSRSMTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChQUyksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDE3OTAgfQotICB9LAotLyogbW92ICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDhiMDAgfQotICB9LAotLyogbW92ICRSczEsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUlMxKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbW92ZHIsIHsgMHhiNzAwIH0KLSAgfSwKLS8qIG1vdiAkcHMsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUFMpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDE3MTAgfQotICB9LAotLyogbW92ICRSaSwkUnMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsIE9QIChSUzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbW92ZHIsIHsgMHhiMzAwIH0KLSAgfSwKLS8qIG1vdiAkUmksJHBzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsIE9QIChQUyksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDcxMCB9Ci0gIH0sCi0vKiBqbXAgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzAwIH0KLSAgfSwKLS8qIGptcDpkIEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OWYwMCB9Ci0gIH0sCi0vKiBjYWxsIEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTcxMCB9Ci0gIH0sCi0vKiBjYWxsOmQgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5ZjEwIH0KLSAgfSwKLS8qIGNhbGwgJGxhYmVsMTIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDEyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NhbGwsIHsgMHhkMDAwIH0KLSAgfSwKLS8qIGNhbGw6ZCAkbGFiZWwxMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMMTIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY2FsbCwgeyAweGQ4MDAgfQotICB9LAotLyogcmV0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5NzIwIH0KLSAgfSwKLS8qIHJldDpkICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZjIwIH0KLSAgfSwKLS8qIGludCAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHgxZjAwIH0KLSAgfSwKLS8qIGludGUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmMzAgfQotICB9LAotLyogcmV0aSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OTczMCB9Ci0gIH0sCi0vKiBicmE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMDAwIH0KLSAgfSwKLS8qIGJyYSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMDAwIH0KLSAgfSwKLS8qIGJubzpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYxMDAgfQotICB9LAotLyogYm5vICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUxMDAgfQotICB9LAotLyogYmVxOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjIwMCB9Ci0gIH0sCi0vKiBiZXEgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTIwMCB9Ci0gIH0sCi0vKiBibmU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMzAwIH0KLSAgfSwKLS8qIGJuZSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMzAwIH0KLSAgfSwKLS8qIGJjOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjQwMCB9Ci0gIH0sCi0vKiBiYyAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlNDAwIH0KLSAgfSwKLS8qIGJuYzpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY1MDAgfQotICB9LAotLyogYm5jICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU1MDAgfQotICB9LAotLyogYm46ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNjAwIH0KLSAgfSwKLS8qIGJuICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU2MDAgfQotICB9LAotLyogYnA6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNzAwIH0KLSAgfSwKLS8qIGJwICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU3MDAgfQotICB9LAotLyogYnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmODAwIH0KLSAgfSwKLS8qIGJ2ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU4MDAgfQotICB9LAotLyogYm52OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjkwMCB9Ci0gIH0sCi0vKiBibnYgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTkwMCB9Ci0gIH0sCi0vKiBibHQ6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmYTAwIH0KLSAgfSwKLS8qIGJsdCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlYTAwIH0KLSAgfSwKLS8qIGJnZTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZiMDAgfQotICB9LAotLyogYmdlICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGViMDAgfQotICB9LAotLyogYmxlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmMwMCB9Ci0gIH0sCi0vKiBibGUgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWMwMCB9Ci0gIH0sCi0vKiBiZ3Q6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmZDAwIH0KLSAgfSwKLS8qIGJndCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlZDAwIH0KLSAgfSwKLS8qIGJsczpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZlMDAgfQotICB9LAotLyogYmxzICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVlMDAgfQotICB9LAotLyogYmhpOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmYwMCB9Ci0gIH0sCi0vKiBiaGkgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWYwMCB9Ci0gIH0sCi0vKiBkbW92ICRSMTMsQCRkaXIxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFIxMyksICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDE4MDAgfQotICB9LAotLyogZG1vdmggJFIxMyxAJGRpcjkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSMTMpLCAnLCcsICdAJywgT1AgKERJUjkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHgxOTAwIH0KLSAgfSwKLS8qIGRtb3ZiICRSMTMsQCRkaXI4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUjEzKSwgJywnLCAnQCcsIE9QIChESVI4KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4MWEwMCB9Ci0gIH0sCi0vKiBkbW92IEAkUjEzKyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTMpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDFjMDAgfQotICB9LAotLyogZG1vdmggQCRSMTMrLEAkZGlyOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAnLCcsICdAJywgT1AgKERJUjkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHgxZDAwIH0KLSAgfSwKLS8qIGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxMyksICcrJywgJywnLCAnQCcsIE9QIChESVI4KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4MWUwMCB9Ci0gIH0sCi0vKiBkbW92IEAkUjE1KyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDFiMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjEwKSwgJywnLCBPUCAoUjEzKSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHg4MDAgfQotICB9LAotLyogZG1vdmggQCRkaXI5LCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjkpLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHg5MDAgfQotICB9LAotLyogZG1vdmIgQCRkaXI4LCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjgpLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHhhMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsICdAJywgT1AgKFIxMyksICcrJywgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHhjMDAgfQotICB9LAotLyogZG1vdmggQCRkaXI5LEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOSksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHhkMDAgfQotICB9LAotLyogZG1vdmIgQCRkaXI4LEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOCksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHhlMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHhiMDAgfQotICB9LAotLyogbGRyZXMgQCRSaSssJHU0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksICcrJywgJywnLCBPUCAoVTQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGJjMDAgfQotICB9LAotLyogc3RyZXMgJHU0LEAkUmkrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGJkMDAgfQotICB9LAotLyogY29wb3AgJHU0YywkY2NjLCRDUmosJENSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKENSSSksIDAgfSB9LAotICAgICYgaWZtdF9jb3BvcCwgeyAweDlmYzAgfQotICB9LAotLyogY29wbGQgJHU0YywkY2NjLCRSamMsJENSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKFJKQyksICcsJywgT1AgKENSSSksIDAgfSB9LAotICAgICYgaWZtdF9jb3BsZCwgeyAweDlmZDAgfQotICB9LAotLyogY29wc3QgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKFJJQyksIDAgfSB9LAotICAgICYgaWZtdF9jb3BzdCwgeyAweDlmZTAgfQotICB9LAotLyogY29wc3YgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKFJJQyksIDAgfSB9LAotICAgICYgaWZtdF9jb3BzdCwgeyAweDlmZjAgfQotICB9LAotLyogbm9wICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZmEwIH0KLSAgfSwKLS8qIGFuZGNjciAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHg4MzAwIH0KLSAgfSwKLS8qIG9yY2NyICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDkzMDAgfQotICB9LAotLyogc3RpbG0gJHU4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfaW50LCB7IDB4ODcwMCB9Ci0gIH0sCi0vKiBhZGRzcCAkczEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUzEwKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHNwLCB7IDB4YTMwMCB9Ci0gIH0sCi0vKiBleHRzYiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3ODAgfQotICB9LAotLyogZXh0dWIgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzkwIH0KLSAgfSwKLS8qIGV4dHNoICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTdhMCB9Ci0gIH0sCi0vKiBleHR1aCAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3YjAgfQotICB9LAotLyogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9MT1dfTEQpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZG0wLCB7IDB4OGMwMCB9Ci0gIH0sCi0vKiBsZG0xICgkcmVnbGlzdF9oaV9sZCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfSElfTEQpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZG0xLCB7IDB4OGQwMCB9Ci0gIH0sCi0vKiBzdG0wICgkcmVnbGlzdF9sb3dfc3QpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0xPV19TVCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0bTAsIHsgMHg4ZTAwIH0KLSAgfSwKLS8qIHN0bTEgKCRyZWdsaXN0X2hpX3N0KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9ISV9TVCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0bTEsIHsgMHg4ZjAwIH0KLSAgfSwKLS8qIGVudGVyICR1MTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZW50ZXIsIHsgMHhmMDAgfQotICB9LAotLyogbGVhdmUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmOTAgfQotICB9LAotLyogeGNoYiBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4YTAwIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0vKiBGb3JtYXRzIGZvciBBTElBUyBtYWNyby1pbnNucy4gICovCi0KLSNkZWZpbmUgRihmKSAmIGZyMzBfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKEZSMzBfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpOG0gPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkyMG0gPSB7Ci0gIDE2LCAzMiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JMjApLCBGIChGX09QMiksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkzMm0gPSB7Ci0gIDE2LCA0OCwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9JMzIpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSSksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotLyogRWFjaCBub24tc2ltcGxlIG1hY3JvIGVudHJ5IHBvaW50cyB0byBhbiBhcnJheSBvZiBleHBhbnNpb24gcG9zc2liaWxpdGllcy4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoRlIzMF9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGVbXSA9Ci17Ci0vKiBsZGk4ICRpOCwkUmkgKi8KLSAgewotICAgIC0xLCAibGRpOG0iLCAibGRpOCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkyMCAkaTIwLCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGkyMG0iLCAibGRpMjAiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpMzIgJGkzMiwkUmkgKi8KLSAgewotICAgIC0xLCAibGRpMzJtIiwgImxkaTMyIiwgNDgsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLX07Ci0KLS8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgZnIzMF9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlW10gPQotewotLyogbGRpOCAkaTgsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTgpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGk4bSwgeyAweGMwMDAgfQotICB9LAotLyogbGRpMjAgJGkyMCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMjApLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkyMG0sIHsgMHg5YjAwIH0KLSAgfSwKLS8qIGxkaTMyICRpMzIsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTMyKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMzJtLCB7IDB4OWY4MCB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNIX1AKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9QKGluc24pIDEKLSNlbmRpZgotCi0jaWZuZGVmIENHRU5fRElTX0hBU0hfUAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLS8qIFJldHVybiBub24temVybyBpZiBJTlNOIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIX1AgaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyBpbnQKLWFzbV9oYXNoX2luc25fcCAoaW5zbikKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSF9QIChpbnNuKTsKLX0KLQotc3RhdGljIGludAotZGlzX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIC8qIElmIGJ1aWxkaW5nIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgTk8tRElTIGF0dHJpYnV0ZSBpcyBwcmVzZW50LAotICAgICBpZ25vcmUuICAqLwotICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9OT19ESVMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gQ0dFTl9ESVNfSEFTSF9QIChpbnNuKTsKLX0KLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNICi0jZGVmaW5lIENHRU5fQVNNX0hBU0hfU0laRSAxMjcKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpCi0jZWxzZQotI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKSAvKkZJWE1FKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIEl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGhlcmUsCi0gICBidXQgd2hpbGUgdGhpcyBpcyB1bmRlciBkZXZlbG9wbWVudCB3ZSBkby4KLSAgIEJVRkZFUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmLCB2YWx1ZSkgKCoodW5zaWduZWQgY2hhciAqKSAoYnVmKSkKLSNlbmRpZgotCi0vKiBUaGUgcmVzdWx0IGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIIGluIHRoZSAub3BjIGZpbGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1hc21faGFzaF9pbnNuIChtbmVtKQotICAgICBjb25zdCBjaGFyICogbW5lbTsKLXsKLSAgcmV0dXJuIENHRU5fQVNNX0hBU0ggKG1uZW0pOwotfQotCi0vKiBCVUYgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgotICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kaXNfaGFzaF9pbnNuIChidWYsIHZhbHVlKQotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICByZXR1cm4gQ0dFTl9ESVNfSEFTSCAoYnVmLCB2YWx1ZSk7Ci19Ci0KLS8qIFNldCB0aGUgcmVjb3JkZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIHRoZSBDR0VOX0ZJRUxEUyBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2ZpZWxkc19iaXRzaXplIChmaWVsZHMsIHNpemUpCi0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBzaXplOwotewotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gc2l6ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuCi0gICBUaGlzIHBsdWdzIHRoZSBvcGNvZGUgZW50cmllcyBhbmQgbWFjcm8gaW5zdHJ1Y3Rpb25zIGludG8gdGhlIGNwdSB0YWJsZS4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbnVtX21hY3JvcyA9IChzaXplb2YgKGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlKSAvCi0JCSAgICBzaXplb2YgKGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdKSk7Ci0gIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXTsKLSAgY29uc3QgQ0dFTl9PUENPREUgKm9jID0gJiBmcjMwX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBtZW1zZXQgKGluc25zLCAwLCBudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9tYWNyb3M7ICsraSkKLSAgICB7Ci0gICAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICAgICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotICAgIH0KLSAgY2QtPm1hY3JvX2luc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOwotICBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gbnVtX21hY3JvczsKLQotICBvYyA9ICYgZnIzMF9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlWzBdOwotICBpbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotCi0gIGNkLT5zaXplb2ZfZmllbGRzID0gc2l6ZW9mIChDR0VOX0ZJRUxEUyk7Ci0gIGNkLT5zZXRfZmllbGRzX2JpdHNpemUgPSBzZXRfZmllbGRzX2JpdHNpemU7Ci0KLSAgY2QtPmFzbV9oYXNoX3AgPSBhc21faGFzaF9pbnNuX3A7Ci0gIGNkLT5hc21faGFzaCA9IGFzbV9oYXNoX2luc247Ci0gIGNkLT5hc21faGFzaF9zaXplID0gQ0dFTl9BU01fSEFTSF9TSVpFOwotCi0gIGNkLT5kaXNfaGFzaF9wID0gZGlzX2hhc2hfaW5zbl9wOwotICBjZC0+ZGlzX2hhc2ggPSBkaXNfaGFzaF9pbnNuOwotICBjZC0+ZGlzX2hhc2hfc2l6ZSA9IENHRU5fRElTX0hBU0hfU0laRTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1vcGMuaCBiL29wY29kZXMvZnIzMC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4N2VkNS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBGUjMwX09QQ19ICi0jZGVmaW5lIEZSMzBfT1BDX0gKLQotLyogLS0gb3BjLmggKi8KLQotLyogPz8/IFRoaXMgY2FuIGJlIGltcHJvdmVkIHVwb24uICAqLwotI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMTYKLSN1bmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmZmVyLCB2YWx1ZSkgKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMF0gPj4gNCkKLQotLyogLS0gKi8KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaW5zdHJ1Y3Rpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl90eXBlIHsKLSAgRlIzMF9JTlNOX0lOVkFMSUQsIEZSMzBfSU5TTl9BREQsIEZSMzBfSU5TTl9BRERJLCBGUjMwX0lOU05fQUREMgotICwgRlIzMF9JTlNOX0FEREMsIEZSMzBfSU5TTl9BREROLCBGUjMwX0lOU05fQURETkksIEZSMzBfSU5TTl9BREROMgotICwgRlIzMF9JTlNOX1NVQiwgRlIzMF9JTlNOX1NVQkMsIEZSMzBfSU5TTl9TVUJOLCBGUjMwX0lOU05fQ01QCi0gLCBGUjMwX0lOU05fQ01QSSwgRlIzMF9JTlNOX0NNUDIsIEZSMzBfSU5TTl9BTkQsIEZSMzBfSU5TTl9PUgotICwgRlIzMF9JTlNOX0VPUiwgRlIzMF9JTlNOX0FORE0sIEZSMzBfSU5TTl9BTkRILCBGUjMwX0lOU05fQU5EQgotICwgRlIzMF9JTlNOX09STSwgRlIzMF9JTlNOX09SSCwgRlIzMF9JTlNOX09SQiwgRlIzMF9JTlNOX0VPUk0KLSAsIEZSMzBfSU5TTl9FT1JILCBGUjMwX0lOU05fRU9SQiwgRlIzMF9JTlNOX0JBTkRMLCBGUjMwX0lOU05fQk9STAotICwgRlIzMF9JTlNOX0JFT1JMLCBGUjMwX0lOU05fQkFOREgsIEZSMzBfSU5TTl9CT1JILCBGUjMwX0lOU05fQkVPUkgKLSAsIEZSMzBfSU5TTl9CVFNUTCwgRlIzMF9JTlNOX0JUU1RILCBGUjMwX0lOU05fTVVMLCBGUjMwX0lOU05fTVVMVQotICwgRlIzMF9JTlNOX01VTEgsIEZSMzBfSU5TTl9NVUxVSCwgRlIzMF9JTlNOX0RJVjBTLCBGUjMwX0lOU05fRElWMFUKLSAsIEZSMzBfSU5TTl9ESVYxLCBGUjMwX0lOU05fRElWMiwgRlIzMF9JTlNOX0RJVjMsIEZSMzBfSU5TTl9ESVY0UwotICwgRlIzMF9JTlNOX0xTTCwgRlIzMF9JTlNOX0xTTEksIEZSMzBfSU5TTl9MU0wyLCBGUjMwX0lOU05fTFNSCi0gLCBGUjMwX0lOU05fTFNSSSwgRlIzMF9JTlNOX0xTUjIsIEZSMzBfSU5TTl9BU1IsIEZSMzBfSU5TTl9BU1JJCi0gLCBGUjMwX0lOU05fQVNSMiwgRlIzMF9JTlNOX0xESTgsIEZSMzBfSU5TTl9MREkyMCwgRlIzMF9JTlNOX0xESTMyCi0gLCBGUjMwX0lOU05fTEQsIEZSMzBfSU5TTl9MRFVILCBGUjMwX0lOU05fTERVQiwgRlIzMF9JTlNOX0xEUjEzCi0gLCBGUjMwX0lOU05fTERSMTNVSCwgRlIzMF9JTlNOX0xEUjEzVUIsIEZSMzBfSU5TTl9MRFIxNCwgRlIzMF9JTlNOX0xEUjE0VUgKLSAsIEZSMzBfSU5TTl9MRFIxNFVCLCBGUjMwX0lOU05fTERSMTUsIEZSMzBfSU5TTl9MRFIxNUdSLCBGUjMwX0lOU05fTERSMTVEUgotICwgRlIzMF9JTlNOX0xEUjE1UFMsIEZSMzBfSU5TTl9TVCwgRlIzMF9JTlNOX1NUSCwgRlIzMF9JTlNOX1NUQgotICwgRlIzMF9JTlNOX1NUUjEzLCBGUjMwX0lOU05fU1RSMTNILCBGUjMwX0lOU05fU1RSMTNCLCBGUjMwX0lOU05fU1RSMTQKLSAsIEZSMzBfSU5TTl9TVFIxNEgsIEZSMzBfSU5TTl9TVFIxNEIsIEZSMzBfSU5TTl9TVFIxNSwgRlIzMF9JTlNOX1NUUjE1R1IKLSAsIEZSMzBfSU5TTl9TVFIxNURSLCBGUjMwX0lOU05fU1RSMTVQUywgRlIzMF9JTlNOX01PViwgRlIzMF9JTlNOX01PVkRSCi0gLCBGUjMwX0lOU05fTU9WUFMsIEZSMzBfSU5TTl9NT1YyRFIsIEZSMzBfSU5TTl9NT1YyUFMsIEZSMzBfSU5TTl9KTVAKLSAsIEZSMzBfSU5TTl9KTVBELCBGUjMwX0lOU05fQ0FMTFIsIEZSMzBfSU5TTl9DQUxMUkQsIEZSMzBfSU5TTl9DQUxMCi0gLCBGUjMwX0lOU05fQ0FMTEQsIEZSMzBfSU5TTl9SRVQsIEZSMzBfSU5TTl9SRVRfRCwgRlIzMF9JTlNOX0lOVAotICwgRlIzMF9JTlNOX0lOVEUsIEZSMzBfSU5TTl9SRVRJLCBGUjMwX0lOU05fQlJBRCwgRlIzMF9JTlNOX0JSQQotICwgRlIzMF9JTlNOX0JOT0QsIEZSMzBfSU5TTl9CTk8sIEZSMzBfSU5TTl9CRVFELCBGUjMwX0lOU05fQkVRCi0gLCBGUjMwX0lOU05fQk5FRCwgRlIzMF9JTlNOX0JORSwgRlIzMF9JTlNOX0JDRCwgRlIzMF9JTlNOX0JDCi0gLCBGUjMwX0lOU05fQk5DRCwgRlIzMF9JTlNOX0JOQywgRlIzMF9JTlNOX0JORCwgRlIzMF9JTlNOX0JOCi0gLCBGUjMwX0lOU05fQlBELCBGUjMwX0lOU05fQlAsIEZSMzBfSU5TTl9CVkQsIEZSMzBfSU5TTl9CVgotICwgRlIzMF9JTlNOX0JOVkQsIEZSMzBfSU5TTl9CTlYsIEZSMzBfSU5TTl9CTFRELCBGUjMwX0lOU05fQkxUCi0gLCBGUjMwX0lOU05fQkdFRCwgRlIzMF9JTlNOX0JHRSwgRlIzMF9JTlNOX0JMRUQsIEZSMzBfSU5TTl9CTEUKLSAsIEZSMzBfSU5TTl9CR1RELCBGUjMwX0lOU05fQkdULCBGUjMwX0lOU05fQkxTRCwgRlIzMF9JTlNOX0JMUwotICwgRlIzMF9JTlNOX0JISUQsIEZSMzBfSU5TTl9CSEksIEZSMzBfSU5TTl9ETU9WUjEzLCBGUjMwX0lOU05fRE1PVlIxM0gKLSAsIEZSMzBfSU5TTl9ETU9WUjEzQiwgRlIzMF9JTlNOX0RNT1ZSMTNQSSwgRlIzMF9JTlNOX0RNT1ZSMTNQSUgsIEZSMzBfSU5TTl9ETU9WUjEzUElCCi0gLCBGUjMwX0lOU05fRE1PVlIxNVBJLCBGUjMwX0lOU05fRE1PVjJSMTMsIEZSMzBfSU5TTl9ETU9WMlIxM0gsIEZSMzBfSU5TTl9ETU9WMlIxM0IKLSAsIEZSMzBfSU5TTl9ETU9WMlIxM1BJLCBGUjMwX0lOU05fRE1PVjJSMTNQSUgsIEZSMzBfSU5TTl9ETU9WMlIxM1BJQiwgRlIzMF9JTlNOX0RNT1YyUjE1UEQKLSAsIEZSMzBfSU5TTl9MRFJFUywgRlIzMF9JTlNOX1NUUkVTLCBGUjMwX0lOU05fQ09QT1AsIEZSMzBfSU5TTl9DT1BMRAotICwgRlIzMF9JTlNOX0NPUFNULCBGUjMwX0lOU05fQ09QU1YsIEZSMzBfSU5TTl9OT1AsIEZSMzBfSU5TTl9BTkRDQ1IKLSAsIEZSMzBfSU5TTl9PUkNDUiwgRlIzMF9JTlNOX1NUSUxNLCBGUjMwX0lOU05fQUREU1AsIEZSMzBfSU5TTl9FWFRTQgotICwgRlIzMF9JTlNOX0VYVFVCLCBGUjMwX0lOU05fRVhUU0gsIEZSMzBfSU5TTl9FWFRVSCwgRlIzMF9JTlNOX0xETTAKLSAsIEZSMzBfSU5TTl9MRE0xLCBGUjMwX0lOU05fU1RNMCwgRlIzMF9JTlNOX1NUTTEsIEZSMzBfSU5TTl9FTlRFUgotICwgRlIzMF9JTlNOX0xFQVZFLCBGUjMwX0lOU05fWENIQiwgRlIzMF9JTlNOX01BWAotfSBDR0VOX0lOU05fVFlQRTsKLQotLyogSW5kZXggb2YgYGludmFsaWQnIGluc24gcGxhY2UgaG9sZGVyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSUQgRlIzMF9JTlNOX0lOVkFMSUQKLQotLyogVG90YWwgbnVtYmVyIG9mIGluc25zIGluIHRhYmxlLiAgKi8KLSNkZWZpbmUgTUFYX0lOU05TICgoaW50KSBGUjMwX0lOU05fTUFYKQotCi0vKiBUaGlzIHN0cnVjdCByZWNvcmRzIGRhdGEgcHJpb3IgdG8gaW5zZXJ0aW9uIG9yIGFmdGVyIGV4dHJhY3Rpb24uICAqLwotc3RydWN0IGNnZW5fZmllbGRzCi17Ci0gIGludCBsZW5ndGg7Ci0gIGxvbmcgZl9uaWw7Ci0gIGxvbmcgZl9vcDE7Ci0gIGxvbmcgZl9vcDI7Ci0gIGxvbmcgZl9vcDM7Ci0gIGxvbmcgZl9vcDQ7Ci0gIGxvbmcgZl9vcDU7Ci0gIGxvbmcgZl9jYzsKLSAgbG9uZyBmX2NjYzsKLSAgbG9uZyBmX1JqOwotICBsb25nIGZfUmk7Ci0gIGxvbmcgZl9SczE7Ci0gIGxvbmcgZl9SczI7Ci0gIGxvbmcgZl9SamM7Ci0gIGxvbmcgZl9SaWM7Ci0gIGxvbmcgZl9DUmo7Ci0gIGxvbmcgZl9DUmk7Ci0gIGxvbmcgZl91NDsKLSAgbG9uZyBmX3U0YzsKLSAgbG9uZyBmX2k0OwotICBsb25nIGZfbTQ7Ci0gIGxvbmcgZl91ODsKLSAgbG9uZyBmX2k4OwotICBsb25nIGZfaTIwXzQ7Ci0gIGxvbmcgZl9pMjBfMTY7Ci0gIGxvbmcgZl9pMjA7Ci0gIGxvbmcgZl9pMzI7Ci0gIGxvbmcgZl91ZGlzcDY7Ci0gIGxvbmcgZl9kaXNwODsKLSAgbG9uZyBmX2Rpc3A5OwotICBsb25nIGZfZGlzcDEwOwotICBsb25nIGZfczEwOwotICBsb25nIGZfdTEwOwotICBsb25nIGZfcmVsOTsKLSAgbG9uZyBmX2Rpcjg7Ci0gIGxvbmcgZl9kaXI5OwotICBsb25nIGZfZGlyMTA7Ci0gIGxvbmcgZl9yZWwxMjsKLSAgbG9uZyBmX3JlZ2xpc3RfaGlfc3Q7Ci0gIGxvbmcgZl9yZWdsaXN0X2xvd19zdDsKLSAgbG9uZyBmX3JlZ2xpc3RfaGlfbGQ7Ci0gIGxvbmcgZl9yZWdsaXN0X2xvd19sZDsKLX07Ci0KLSNkZWZpbmUgQ0dFTl9JTklUX1BBUlNFKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfSU5TRVJUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfRVhUUkFDVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX1BSSU5UKG9kKSBcCi17XAotfQotCi0KLSNlbmRpZiAvKiBGUjMwX09QQ19IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4MzAwLWRpcy5jIGIvb3Bjb2Rlcy9oODMwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTNhOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4MzAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGg4MzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2RlZmluZSBoOF9vcGNvZGVzIGg4b3BzCi0jaW5jbHVkZSAib3Bjb2RlL2g4MzAwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0KLS8qIFJ1biB0aHJvdWdoIHRoZSBvcGNvZGVzIGFuZCBzb3J0IHRoZW0gaW50byBvcmRlciB0byBtYWtlIHRoZW0gZWFzeQotICAgdG8gZGlzYXNzZW1ibGUKLSAqLwotc3RhdGljIHZvaWQKLWJmZF9oOF9kaXNhc3NlbWJsZV9pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0KLSAgc3RydWN0IGg4X29wY29kZSAqcDsKLQotICBmb3IgKHAgPSBoOF9vcGNvZGVzOyBwLT5uYW1lOyBwKyspCi0gICAgewotICAgICAgaW50IG4xID0gMDsKLSAgICAgIGludCBuMiA9IDA7Ci0KLSAgICAgIGlmICgoaW50KSBwLT5kYXRhLm5pYlswXSA8IDE2KQotCXsKLQkgIG4xID0gKGludCkgcC0+ZGF0YS5uaWJbMF07Ci0JfQotICAgICAgZWxzZQotCW4xID0gMDsKLSAgICAgIGlmICgoaW50KSBwLT5kYXRhLm5pYlsxXSA8IDE2KQotCXsKLQkgIG4yID0gKGludCkgcC0+ZGF0YS5uaWJbMV07Ci0JfQotICAgICAgZWxzZQotCW4yID0gMDsKLQotICAgICAgLyogSnVzdCBtYWtlIHN1cmUgdGhlcmUgYXJlIGFuIGV2ZW4gbnVtYmVyIG9mIG5pYmJsZXMgaW4gaXQsIGFuZAotCSB0aGF0IHRoZSBjb3VudCBpcyB0aGUgc2FtZSBzIHRoZSBsZW5ndGggKi8KLSAgICAgIGZvciAoaSA9IDA7IHAtPmRhdGEubmliW2ldICE9IEU7IGkrKykKLQkvKkVNUFRZKi8gOwotICAgICAgaWYgKGkgJiAxKQotCWFib3J0ICgpOwotICAgICAgcC0+bGVuZ3RoID0gaSAvIDI7Ci0gICAgfQotCi19Ci0KLQotdW5zaWduZWQgaW50Ci1iZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8sIG1vZGUpCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG1vZGU7Ci17Ci0gIC8qIEZpbmQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZSBmb3IgdGhpcyBvcGNvZGUgKi8KLSAgc3RhdGljIENPTlNUIGNoYXIgKnJlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJyMGgiLCAicjFoIiwgInIyaCIsICJyM2giLCAicjRoIiwgInI1aCIsICJyNmgiLCAicjdoIiwKLSAgICAgICJyMGwiLCAicjFsIiwgInIybCIsICJyM2wiLCAicjRsIiwgInI1bCIsICJyNmwiLCAicjdsIn07Ci0gIAotICBzdGF0aWMgQ09OU1QgY2hhciAqd3JlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCi0gICAgICAiZTAiLCAiZTEiLCAiZTIiLCAiZTMiLCAiZTQiLCAiZTUiLCAiZTYiLCAiZTciCi0gICAgICB9OwotICAKLSAgc3RhdGljIENPTlNUIGNoYXIgKmxyZWduYW1lc1tdID0KLSAgICB7Ci0gICAgICAiZXIwIiwgImVyMSIsICJlcjIiLCAiZXIzIiwgImVyNCIsICJlcjUiLCAiZXI2IiwgImVyNyIsCi0gICAgICAiZXIwIiwgImVyMSIsICJlcjIiLCAiZXIzIiwgImVyNCIsICJlcjUiLCAiZXI2IiwgImVyNyIKLSAgICAgIH0KLSAgOwotCi0gIGludCBycyA9IDA7Ci0gIGludCByZCA9IDA7Ci0gIGludCByZGlzcCA9IDA7Ci0gIGludCBhYnMgPSAwOwotICBpbnQgYml0ID0gMDsKLSAgaW50IHBsZW4gPSAwOwotICBzdGF0aWMgYm9vbGVhbiBpbml0ID0gMDsKLSAgc3RydWN0IGg4X29wY29kZSAqcSA9IGg4X29wY29kZXM7Ci0gIGNoYXIgQ09OU1QgKipwcmVnbmFtZXMgPSBtb2RlICE9IDAgPyBscmVnbmFtZXMgOiB3cmVnbmFtZXM7Ci0gIGludCBzdGF0dXM7Ci0gIGludCBsOwotICAKLSAgdW5zaWduZWQgY2hhciBkYXRhWzIwXTsgIAotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgZnByaW50ZiA9IGluZm8tPmZwcmludGZfZnVuYzsKLQotICBpZiAoIWluaXQpCi0gICAgewotICAgICAgYmZkX2g4X2Rpc2Fzc2VtYmxlX2luaXQgKCk7Ci0gICAgICBpbml0ID0gMTsKLSAgICB9Ci0KLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhhZGRyLCBkYXRhLCAyLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSAKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyhzdGF0dXMsIGFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgZm9yIChsID0gMjsgc3RhdHVzID09IDAgJiYgbCA8IDEwOyBsKz0yKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMoYWRkcitsLCBkYXRhK2wsIDIsIGluZm8pOwotICAgIH0KLSAgCi0gIAotCi0gIC8qIEZpbmQgdGhlIGV4YWN0IG9wY29kZS9hcmcgY29tYm8gKi8KLSAgd2hpbGUgKHEtPm5hbWUpCi0gICAgewotICAgICAgb3BfdHlwZSAqbmliOwotICAgICAgdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0KLSAgICAgIG5pYiA9IHEtPmRhdGEubmliOwotICAgICAgCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBvcF90eXBlIGxvb2tpbmdfZm9yID0gKm5pYjsKLQkgIGludCB0aGlzbmliID0gZGF0YVtsZW4gPj4gMV07Ci0JICAKLQkgIHRoaXNuaWIgPSAobGVuICYgMSkgPyAodGhpc25pYiAmIDB4ZikgOiAoKHRoaXNuaWIgPj4gNCkgJiAweGYpOwotCSAgCi0JICBpZiAobG9va2luZ19mb3IgPCAxNiAmJiBsb29raW5nX2ZvciA+PTApIAotCSAgICB7Ci0JICAgICAgCi0JICAgICAgaWYgKGxvb2tpbmdfZm9yICE9IHRoaXNuaWIpIAotCQlnb3RvIGZhaWw7Ci0JICAgIH0KLQkgIAotCSAgZWxzZSAKLQkgICAgewotCSAgICAgIAotCSAgICAgIGlmICgoaW50KSBsb29raW5nX2ZvciAmIChpbnQpIEIzMSkKLQkJewotCQkgIGlmICghICgoKGludCkgdGhpc25pYiAmIDB4OCkgIT0gMCkpIAotCQkgICAgZ290byBmYWlsOwotCQkgIGxvb2tpbmdfZm9yID0gKG9wX3R5cGUpICgoaW50KSBsb29raW5nX2ZvciAmIH4oaW50KSBCMzEpOwotCQl9Ci0JICAgICAgaWYgKChpbnQpIGxvb2tpbmdfZm9yICYgKGludCkgQjMwKQotCQl7Ci0JCSAgaWYgKCEoKChpbnQpIHRoaXNuaWIgJiAweDgpID09IDApKSAKLQkJICAgIGdvdG8gZmFpbDsKLQkJICBsb29raW5nX2ZvciA9IChvcF90eXBlKSAoKGludCkgbG9va2luZ19mb3IgJiB+KGludCkgQjMwKTsKLQkJfQotCi0JICAgICAgaWYgKGxvb2tpbmdfZm9yICYgREJJVCkKLQkJewotCQkgIGlmICgobG9va2luZ19mb3IgJiA1KSAhPSAodGhpc25pYiAmNSkpIGdvdG8gZmFpbDsKLQkJICBhYnMgPSAodGhpc25pYiAmIDB4OCkgPyAyIDogMTsKLQkJfQkJICAKLQkgICAgICAKLQkgICAgICBlbHNlICBpZiAobG9va2luZ19mb3IgJiAoUkVHIHwgSU5EfElOQ3xERUMpKQotCQl7Ci0JCSAgaWYgKGxvb2tpbmdfZm9yICYgU1JDKQotCQkgICAgewotCQkgICAgICBycyA9IHRoaXNuaWI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICByZCA9IHRoaXNuaWI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMTYpCi0JCXsKLQkJICBhYnMgPSAoZGF0YVtsZW4gPj4gMV0pICogMjU2ICsgZGF0YVsobGVuICsgMikgPj4gMV07Ci0JCSAgcGxlbiA9IDE2OwotCSAgICAgIAotCQl9Ci0JICAgICAgZWxzZSBpZihsb29raW5nX2ZvciAmIEFCU0pNUCkKLQkJewotCQkgIGFicyA9Ci0JCSAgICAoZGF0YVsxXSA8PCAxNikKLQkJICAgICAgfCAoZGF0YVsyXSA8PCA4KQotCQkJfCAoZGF0YVszXSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmKGxvb2tpbmdfZm9yICYgTUVNSU5EKQotCQl7Ci0JCSAgYWJzID0gZGF0YVsxXTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8zMikKLQkJewotCQkgIGludCBpID0gbGVuID4+IDE7Ci0JCSAgYWJzID0gKGRhdGFbaV0gPDwgMjQpCi0JCSAgICB8IChkYXRhW2kgKyAxXSA8PCAxNikKLQkJICAgICAgfCAoZGF0YVtpICsgMl0gPDwgOCkKLQkJCXwgKGRhdGFbaSsgM10pOwotCi0JCSAgcGxlbiA9MzI7Ci0JICAgICAgCi0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMjQpCi0JCXsKLQkJICBpbnQgaSA9IGxlbiA+PiAxOwotCQkgIGFicyA9IChkYXRhW2ldIDw8IDE2KSB8IChkYXRhW2kgKyAxXSA8PCA4KXwgIChkYXRhW2krMl0pOwotCQkgIHBsZW4gPTI0OwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBJR05PUkUpCi0JCXsKLQkJICAKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgRElTUFJFRykKLQkJewotCQkgIHJkaXNwID0gdGhpc25pYjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgS0JJVCkKLQkJewotCQkgIHN3aXRjaCAodGhpc25pYikgCi0JCSAgICB7Ci0JCSAgICBjYXNlIDk6Ci0JCSAgICAgIGFicyA9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA4OgotCQkgICAgICBhYnMgPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgYWJzID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBnb3RvIGZhaWw7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfOCkKLQkJewotCQkgIHBsZW4gPSA4OwkJICAKLQkJICBhYnMgPSBkYXRhW2xlbiA+PiAxXTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8zKQotCQl7Ci0JCSAgYml0ID0gdGhpc25pYiAmIDB4NzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8yKQotCQl7Ci0JCSAgcGxlbiA9IDI7Ci0JCSAgYWJzID0gdGhpc25pYiAmIDB4MzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTUFDUkVHKQotCQl7Ci0JCSAgYWJzID0gKHRoaXNuaWIgPT0gMyk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciA9PSBFKQotCQl7Ci0KLQkJICB7Ci0JCSAgICBpbnQgaTsKLQotCQkgICAgZm9yIChpID0gMDsgaSA8IHEtPmxlbmd0aDsgaSsrKQotCQkgICAgICB7Ci0JCQlmcHJpbnRmIChzdHJlYW0sICIlMDJ4ICIsIGRhdGFbaV0pOwotCQkgICAgICB9Ci0JCSAgICBmb3IgKDsgaSA8IDY7IGkrKykKLQkJICAgICAgewotCQkJZnByaW50ZiAoc3RyZWFtLCAiICAgIik7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCSAgZnByaW50ZiAoc3RyZWFtLCAiJXNcdCIsIHEtPm5hbWUpOwotCi0JCSAgLyogR3Jvc3MuICBEaXNndXN0aW5nLiAgKi8KLQkJICBpZiAoc3RyY21wIChxLT5uYW1lLCAibGRtLmwiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBpbnQgY291bnQsIGhpZ2g7Ci0KLQkJICAgICAgY291bnQgPSAoZGF0YVsxXSA+PiA0KSAmIDB4MzsKLQkJICAgICAgaGlnaCA9IGRhdGFbM10gJiAweDc7Ci0KLQkJICAgICAgZnByaW50ZiAoc3RyZWFtLCAiQHNwKyxlciVkLWVyJWQiLCBoaWdoIC0gY291bnQsIGhpZ2gpOwotCQkgICAgICByZXR1cm4gcS0+bGVuZ3RoOwotCQkgICAgfQotCi0JCSAgaWYgKHN0cmNtcCAocS0+bmFtZSwgInN0bS5sIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaW50IGNvdW50LCBsb3c7Ci0KLQkJICAgICAgY291bnQgPSAoZGF0YVsxXSA+PiA0KSAmIDB4MzsKLQkJICAgICAgbG93ID0gZGF0YVszXSAmIDB4NzsKLQotCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJlciVkLWVyJWQsQC1zcCIsIGxvdywgbG93ICsgY291bnQpOwotCQkgICAgICByZXR1cm4gcS0+bGVuZ3RoOwotCQkgICAgfQotCi0JCSAgLyogRmlsbCBpbiB0aGUgYXJncyAqLwotCQkgIHsKLQkJICAgIG9wX3R5cGUgKmFyZ3MgPSBxLT5hcmdzLm5pYjsKLQkJICAgIGludCBoYWRvbmUgPSAwOwotCi0KLQkJICAgIHdoaWxlICgqYXJncyAhPSBFKQotCQkgICAgICB7Ci0JCQlpbnQgeCA9ICphcmdzOwotCQkJaWYgKGhhZG9uZSkKLQkJCSAgZnByaW50ZiAoc3RyZWFtLCAiLCIpOwotCi0KLQkJCWlmICh4ICYgTF8zKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiIzB4JXgiLCAodW5zaWduZWQpIGJpdCk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiAoSU1NfEtCSVR8REJJVCkpCi0JCQkgIHsKLQkJCSAgICAvKiBCbGV0Y2guICBGb3Igc2hhbCAjMixlcjAgYW5kIGZyaWVuZHMuICAqLwotCQkJICAgIGlmICgqKGFyZ3MrMSkgJiBTUkNfSU5fRFNUKQotCQkJICAgICAgYWJzID0gMjsKLQotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIiMweCV4IiwgKHVuc2lnbmVkKSBhYnMpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgUkVHKQotCQkJICB7Ci0JCQkgICAgaW50IHJuID0gKHggJiBEU1QpID8gcmQgOiByczsKLQkJCSAgICBzd2l0Y2ggKHggJiBTSVpFKQotCQkJICAgICAgewotCQkJICAgICAgY2FzZSBMXzg6Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiJXMiLCByZWduYW1lc1tybl0pOwotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSBMXzE2OgotCQkJCWZwcmludGYgKHN0cmVhbSwgIiVzIiwgd3JlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlIExfUDoKLQkJCSAgICAgIGNhc2UgTF8zMjoKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIlcyIsIGxyZWduYW1lc1tybl0pOwotCQkJCWJyZWFrOwotCQkgICAgCi0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBNQUNSRUcpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJtYWMlYyIsIGFicyA/ICdsJyA6ICdoJyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBJTkMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAJXMrIiwgcHJlZ25hbWVzW3JzXSk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBERUMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJALSVzIiwgcHJlZ25hbWVzW3JkXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIElORCkKLQkJCSAgewotCQkJICAgIGludCBybiA9ICh4ICYgRFNUKSA/IHJkIDogcnM7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQCVzIiwgcHJlZ25hbWVzW3JuXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIEFCUzhNRU0pCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAMHgleDo4IiwgKHVuc2lnbmVkKSBhYnMpOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiAoQUJTfEFCU0pNUCkpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAMHgleDolZCIsICh1bnNpZ25lZCkgYWJzLCBwbGVuKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgTUVNSU5EKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQEAlZCAoJXgpIiwgYWJzLCBhYnMpOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiBQQ1JFTCkKLQkJCSAgewotCQkJICAgIGlmICh4ICYgTF8xNikgCi0JCQkgICAgICB7Ci0JCQkJYWJzICArPTI7Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiLiVzJWQgKCV4KSIsIChzaG9ydCkgYWJzID4gMCA/ICIrIiA6ICIiLCAoc2hvcnQpIGFicywKLQkJCQkJIGFkZHIgKyAoc2hvcnQpIGFicyArIDIpOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UgewotCQkJICAgICAgZnByaW50ZiAoc3RyZWFtLCAiLiVzJWQgKCV4KSIsIChjaGFyKSBhYnMgPiAwID8gIisiIDogIiIsIChjaGFyKSBhYnMsCi0JCQkJICAgICAgIGFkZHIgKyAoY2hhcikgYWJzICsgMik7Ci0JCQkgICAgfQotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgRElTUCkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAoMHgleDolZCwlcykiLCBhYnMscGxlbiwgcHJlZ25hbWVzW3JkaXNwXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIENDUikKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgImNjciIpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgRVhSKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiZXhyIik7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCSAgZnByaW50ZiAoc3RyZWFtLCBfKCJIbW1tbSAleCIpLCB4KTsKLQkJCWhhZG9uZSA9IDE7Ci0JCQlhcmdzKys7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCSAgcmV0dXJuIHEtPmxlbmd0aDsKLQkJfQotCi0gICAgICAKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIGZwcmludGYgKHN0cmVhbSwgXygiRG9uJ3QgdW5kZXJzdGFuZCAleCBcbiIpLCBsb29raW5nX2Zvcik7Ci0JCX0KLQkgICAgfQotCSAgCi0JICBsZW4rKzsKLQkgIG5pYisrOwotCX0KLSAgICAgIAotICAgIGZhaWw6Ci0gICAgICBxKys7Ci0gICAgfQotCi0gIC8qIEZlbGwgb2YgdGhlIGVuZCAqLwotICBmcHJpbnRmIChzdHJlYW0sICIlMDJ4ICUwMnggICAgICAgIC53b3JkXHRIJyV4LEgnJXgiLAotCSAgIGRhdGFbMF0sIGRhdGFbMV0sCi0JICAgZGF0YVswXSwgZGF0YVsxXSk7Ci0gIHJldHVybiAyOwotfQotCi1pbnQgCi1wcmludF9pbnNuX2g4MzAwIChhZGRyLCBpbmZvKQotYmZkX3ZtYSBhZGRyOyAKLWRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBiZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8gLCAwKTsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9oODMwMGggKGFkZHIsIGluZm8pCi1iZmRfdm1hIGFkZHI7Ci1kaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gYmZkX2g4X2Rpc2Fzc2VtYmxlIChhZGRyLCBpbmZvICwgMSk7Ci19Ci0KLWludCAKLXByaW50X2luc25faDgzMDBzIChhZGRyLCBpbmZvKQotYmZkX3ZtYSBhZGRyOwotZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbyAsIDIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9oODUwMC1kaXMuYyBiL29wY29kZXMvaDg1MDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODU4YzkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9oODUwMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBoODUwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgRElTQVNTRU1CTEVSX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAiaDg1MDAtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1BWExFTiA4Ci0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopIGluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqY3JuYW1lW10gPQoteyJzciIsICJjY3IiLCAiKiIsICJiciIsICJlcCIsICJkcCIsICIqIiwgInRwIn07Ci0KLWludAotcHJpbnRfaW5zbl9oODUwMCAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgZnVuYyA9IGluZm8tPmZwcmludGZfZnVuYzsKLQotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICYgcHJpdjsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gYWRkcjsKLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgcmV0dXJuIC0xOwotCi1pZiAoMCkgIHsKLSAgICBzdGF0aWMgICAgaW50IG9uZTsKLSAgICBpZiAoIW9uZSApIAotICAgICAgewotCW9uZSA9IDE7Ci0JZm9yIChvcGNvZGUgPSBoODUwMF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLQkgIHsKLQkgICAgaWYgKChvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzICYgMHg4KSA9PSAwKQotCSAgICAgIHByaW50ZigiJXNcbiIsIG9wY29kZS0+bmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotCi0gIC8qIFJ1biBkb3duIHRoZSB0YWJsZSB0byBmaW5kIHRoZSBvbmUgd2hpY2ggbWF0Y2hlcyAqLwotICBmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGludCBieXRlOwotICAgICAgaW50IHJuID0gMDsKLSAgICAgIGludCByZCA9IDA7Ci0gICAgICBpbnQgcnMgPSAwOwotICAgICAgaW50IGRpc3AgPSAwOwotICAgICAgaW50IGFicyA9IDA7Ci0gICAgICBpbnQgaW1tID0gMDsKLSAgICAgIGludCBwY3JlbCA9IDA7Ci0gICAgICBpbnQgcWltID0gMDsKLSAgICAgIGludCBpOwotICAgICAgaW50IGNyID0gMDsKLSAgICAgIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBvcGNvZGUtPmxlbmd0aDsgYnl0ZSsrKQotCXsKLQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAxKTsKLQkgIGlmICgoYnVmZmVyW2J5dGVdICYgb3Bjb2RlLT5ieXRlc1tieXRlXS5tYXNrKQotCSAgICAgICE9IChvcGNvZGUtPmJ5dGVzW2J5dGVdLmNvbnRlbnRzKSkKLQkgICAgewotCSAgICAgIGdvdG8gbmV4dDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogZXh0cmFjdCBhbnkgaW5mbyBwYXJ0cyAqLwotCSAgICAgIHN3aXRjaCAob3Bjb2RlLT5ieXRlc1tieXRlXS5pbnNlcnQpCi0JCXsKLQkJY2FzZSAwOgotCQljYXNlIEZQOgotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgZnVuYyAoc3RyZWFtLCBfKCJjYW4ndCBjb3BlIHdpdGggaW5zZXJ0ICVkXG4iKSwKLQkJCW9wY29kZS0+Ynl0ZXNbYnl0ZV0uaW5zZXJ0KTsKLQkJICBicmVhazsKLQkJY2FzZSBSTjoKLQkJICBybiA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBicmVhazsKLQkJY2FzZSBSUzoKLQkJICBycyA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBicmVhazsKLQkJY2FzZSBDUkI6Ci0JCSAgY3IgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgaWYgKGNyID09IDApCi0JCSAgICBnb3RvIG5leHQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ1JXOgotCQkgIGNyID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGlmIChjciAhPSAwKQotCQkgICAgZ290byBuZXh0OwotCQkgIGJyZWFrOwotCQljYXNlIERJU1AxNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgZGlzcCA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRlBJTkRfRDg6Ci0JCWNhc2UgRElTUDg6Ci0JCSAgZGlzcCA9ICgoY2hhcikgKGJ1ZmZlcltieXRlXSkpOwotCQkgIGJyZWFrOwotCQljYXNlIFJEOgotCQljYXNlIFJESU5EOgotCQkgIHJkID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzI0OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAzKTsKLQkJICBhYnMgPQotCQkgICAgKGJ1ZmZlcltieXRlXSA8PCAxNikKLQkJICAgIHwgKGJ1ZmZlcltieXRlICsgMV0gPDwgOCkKLQkJICAgIHwgKGJ1ZmZlcltieXRlICsgMl0pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzE2OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKLQkJICBhYnMgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzg6Ci0JCSAgYWJzID0gKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgSU1NMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgSU1NNDoKLQkJICBpbW0gPSAoYnVmZmVyW2J5dGVdKSAmIDB4ZjsKLQkJICBicmVhazsKLQkJY2FzZSBJTU04OgotCQljYXNlIFJMSVNUOgotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIHBjcmVsID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBQQ1JFTDg6Ci0JCSAgcGNyZWwgPSAoYnVmZmVyW2J5dGVdKTsKLQkJICBicmVhazsKLQkJY2FzZSBRSU06Ci0JCSAgc3dpdGNoIChidWZmZXJbYnl0ZV0gJiAweDcpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIHFpbSA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAxOgotCQkgICAgICBxaW0gPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgNDoKLQkJICAgICAgcWltID0gLTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA1OgotCQkgICAgICBxaW0gPSAtMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgLyogV2UgZ2V0IGhlcmUgd2hlbiBhbGwgdGhlIG1hc2tzIGhhdmUgcGFzc2VkIHNvIHdlIGNhbiBvdXRwdXQgdGhlCi0JIG9wZXJhbmRzKi8KLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIG9wY29kZS0+bGVuZ3RoKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBvcGNvZGUtPmxlbmd0aDsgaSsrKQotCXsKLQkgIChmdW5jKSAoc3RyZWFtLCAiJTAyeCAiLCBidWZmZXJbaV0pOwotCX0KLSAgICAgIGZvciAoOyBpIDwgNjsgaSsrKQotCXsKLQkgIChmdW5jKSAoc3RyZWFtLCAiICAgIik7Ci0JfQotICAgICAgKGZ1bmMpIChzdHJlYW0sICIlc1x0Iiwgb3Bjb2RlLT5uYW1lKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBvcGNvZGUtPm5hcmdzOyBpKyspCi0JewotCSAgaWYgKGkpCi0JICAgIChmdW5jKSAoc3RyZWFtLCAiLCIpOwotCSAgc3dpdGNoIChvcGNvZGUtPmFyZ190eXBlW2ldKQotCSAgICB7Ci0JICAgIGNhc2UgRlA6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiZnAiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORF9EMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjE2LHIlZCkiLCBkaXNwLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSxyJWQpIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjE2LHIlZCkiLCBkaXNwLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSwgciVkKSIsIGRpc3AgJiAweGZmLCBkaXNwLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRlBJTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSwgZnApIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUkI6Ci0JICAgIGNhc2UgQ1JXOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgY3JuYW1lW2NyXSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk46Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJEOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgInIlZCIsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSUzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJyJWQiLCBycyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5ERUM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQC1yJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHIlZCsiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkIiwgcmQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQSU5DOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkBzcCsiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUERFQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJALXNwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMjQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQDB4JTB4OjI0IiwgYWJzKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6MTYiLCBhYnMgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQDB4JTB4OjgiLCBhYnMgJiAweGZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU0xNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6MTYiLCBpbW0gJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJMSVNUOgotCSAgICAgIHsKLQkJaW50IGk7Ci0JCWludCBuYyA9IDA7Ci0JCWZ1bmMgKHN0cmVhbSwgIigiKTsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJICB7Ci0JCSAgICBpZiAoaW1tICYgKDEgPDwgaSkpCi0JCSAgICAgIHsKLQkJCWZ1bmMgKHN0cmVhbSwgInIlZCIsIGkpOwotCQkJaWYgKG5jKQotCQkJICBmdW5jIChzdHJlYW0sICIsIik7Ci0JCQluYyA9IDE7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWZ1bmMgKHN0cmVhbSwgIikiKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NODoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6OCIsIGltbSAmIDB4ZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiMHglMHg6MTYiLCAocGNyZWwgKyBhZGRyICsgb3Bjb2RlLT5sZW5ndGgpICYgMHhmZmZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiIzB4JTB4OjgiLAotCQkgICAgKChjaGFyKSBwY3JlbCArIGFkZHIgKyBvcGNvZGUtPmxlbmd0aCkgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFFJTToKLQkgICAgICBmdW5jIChzdHJlYW0sICIjJWQ6cSIsIHFpbSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NNDoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjJWQ6NCIsIGltbSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gb3Bjb2RlLT5sZW5ndGg7Ci0gICAgbmV4dDo7Ci0gICAgfQotCi0gIC8qIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcgKi8KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnVuYyAoc3RyZWFtLCBfKCIlMDJ4XHRcdCp1bmtub3duKiIpLCBidWZmZXJbMF0pOwotICByZXR1cm4gMTsKLQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9oODUwMC1vcGMuaCBiL29wY29kZXMvaDg1MDAtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTQ5YWYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9oODUwMC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4MzYgKzAsMCBAQAotdHlwZWRlZiBlbnVtCi17Ci0gIEdSMCxHUjEsR1IyLEdSMyxHUjQsR1I1LEdSNixHUjcsCi0gIEdQUjAsIEdQUjEsIEdQUjIsIEdQUjMsIEdQUjQsIEdQUjUsIEdQUjYsIEdQUjcsCi0gIEdDQ1IsIEdQQywgCi0gIEdTRUdDLCBHU0VHRCwgR1NFR0UsIEdTRUdULEdMQVNUCi19IGdkYnJlZ190eXBlOwotI2RlZmluZSBPX1hPUkMgMQotI2RlZmluZSBPX1hPUiAyCi0jZGVmaW5lIE9fWENIIDMKLSNkZWZpbmUgT19VTkxLIDQKLSNkZWZpbmUgT19UU1QgNQotI2RlZmluZSBPX1RSQVBBIDYKLSNkZWZpbmUgT19UUkFQX1ZTIDcKLSNkZWZpbmUgT19UQVMgOAotI2RlZmluZSBPX1NXQVAgOQotI2RlZmluZSBPX1NVQlggMTAKLSNkZWZpbmUgT19TVUJTIDExCi0jZGVmaW5lIE9fU1VCIDEyCi0jZGVmaW5lIE9fU1RNIDEzCi0jZGVmaW5lIE9fU1RDIDE0Ci0jZGVmaW5lIE9fU0xFRVAgMTUKLSNkZWZpbmUgT19TSExSIDE2Ci0jZGVmaW5lIE9fU0hMTCAxNwotI2RlZmluZSBPX1NIQVIgMTgKLSNkZWZpbmUgT19TSEFMIDE5Ci0jZGVmaW5lIE9fU0NCX05FIDIwCi0jZGVmaW5lIE9fU0NCX0YgMjEKLSNkZWZpbmUgT19TQ0JfRVEgMjIKLSNkZWZpbmUgT19SVFMgMjMKLSNkZWZpbmUgT19SVEQgMjQKLSNkZWZpbmUgT19ST1RYUiAyNQotI2RlZmluZSBPX1JPVFhMIDI2Ci0jZGVmaW5lIE9fUk9UUiAyNwotI2RlZmluZSBPX1JPVEwgMjgKLSNkZWZpbmUgT19QUlRTIDI5Ci0jZGVmaW5lIE9fUFJURCAzMAotI2RlZmluZSBPX1BKU1IgMzEKLSNkZWZpbmUgT19QSk1QIDMyCi0jZGVmaW5lIE9fT1JDIDMzCi0jZGVmaW5lIE9fT1IgMzQKLSNkZWZpbmUgT19OT1QgMzUKLSNkZWZpbmUgT19OT1AgMzYKLSNkZWZpbmUgT19ORUcgMzcKLSNkZWZpbmUgT19NVUxYVSAzOAotI2RlZmluZSBPX01PVlRQRSAzOQotI2RlZmluZSBPX01PVkZQRSA0MAotI2RlZmluZSBPX01PViA0MQotI2RlZmluZSBPX0xJTksgNDIKLSNkZWZpbmUgT19MRE0gNDMKLSNkZWZpbmUgT19MREMgNDQKLSNkZWZpbmUgT19KU1IgNDUKLSNkZWZpbmUgT19KTVAgNDYKLSNkZWZpbmUgT19FWFRVIDQ3Ci0jZGVmaW5lIE9fRVhUUyA0OAotI2RlZmluZSBPX0RTVUIgNDkKLSNkZWZpbmUgT19ESVZYVSA1MAotI2RlZmluZSBPX0RBREQgNTEKLSNkZWZpbmUgT19DTVAgNTIKLSNkZWZpbmUgT19DTFIgNTMKLSNkZWZpbmUgT19CVlMgNTQKLSNkZWZpbmUgT19CVkMgNTUKLSNkZWZpbmUgT19CVFNUIDU2Ci0jZGVmaW5lIE9fQlQgNTcKLSNkZWZpbmUgT19CU1IgNTgKLSNkZWZpbmUgT19CU0VUIDU5Ci0jZGVmaW5lIE9fQlJOIDYwCi0jZGVmaW5lIE9fQlJBIDYxCi0jZGVmaW5lIE9fQlBUIDYyCi0jZGVmaW5lIE9fQlBMIDYzCi0jZGVmaW5lIE9fQk5PVCA2NAotI2RlZmluZSBPX0JORSA2NQotI2RlZmluZSBPX0JNSSA2NgotI2RlZmluZSBPX0JMVCA2NwotI2RlZmluZSBPX0JMUyA2OAotI2RlZmluZSBPX0JMTyA2OQotI2RlZmluZSBPX0JMRSA3MAotI2RlZmluZSBPX0JIUyA3MQotI2RlZmluZSBPX0JISSA3MgotI2RlZmluZSBPX0JHVCA3MwotI2RlZmluZSBPX0JHRSA3NAotI2RlZmluZSBPX0JGIDc1Ci0jZGVmaW5lIE9fQkVRIDc2Ci0jZGVmaW5lIE9fQkNTIDc3Ci0jZGVmaW5lIE9fQkNMUiA3OAotI2RlZmluZSBPX0JDQyA3OQotI2RlZmluZSBPX0FOREMgODAKLSNkZWZpbmUgT19BTkQgODEKLSNkZWZpbmUgT19BRERYIDgyCi0jZGVmaW5lIE9fQUREUyA4MwotI2RlZmluZSBPX0FERCA4NAotI2RlZmluZSBPX0JZVEUgMTI4Ci0jZGVmaW5lIE9fV09SRCAweDAwMAotI2RlZmluZSBPX1VOU1ogMHgwMDAKLSNkZWZpbmUgRlBJTkRfRDgJMTAKLSNkZWZpbmUgUkRJTkRfRDE2CTExCi0jZGVmaW5lIFJESU5EX0Q4CTEyCi0jZGVmaW5lIFNQREVDCTEzCi0jZGVmaW5lIFJESU5ECTE0Ci0jZGVmaW5lIFJOCTE1Ci0jZGVmaW5lIFJOSU5EX0Q4CTE2Ci0jZGVmaW5lIFJOSU5EX0QxNgkxNwotI2RlZmluZSBSTkRFQwkxOAotI2RlZmluZSBSTklOQwkxOQotI2RlZmluZSBSTklORAkyMAotI2RlZmluZSBTUElOQwkyMQotI2RlZmluZSBBQlMxNgkyMgotI2RlZmluZSBBQlMyNAkyMwotI2RlZmluZSBQQ1JFTDE2CTI0Ci0jZGVmaW5lIFBDUkVMOAkyNQotI2RlZmluZSBBQlM4CTI2Ci0jZGVmaW5lIENSQgkyNwotI2RlZmluZSBDUgkyOAotI2RlZmluZSBDUlcJMjkKLSNkZWZpbmUgRElTUDE2CTMwCi0jZGVmaW5lIERJU1A4CTMxCi0jZGVmaW5lIEZQCTMyCi0jZGVmaW5lIElNTTE2CTMzCi0jZGVmaW5lIElNTTQJMzQKLSNkZWZpbmUgSU1NOAkzNQotI2RlZmluZSBSTElTVAkzNgotI2RlZmluZSBRSU0JMzcKLSNkZWZpbmUgUkQJMzgKLSNkZWZpbmUgUlMJMzkKLSNkZWZpbmUgU1AJNDAKLXR5cGVkZWYgZW51bSB7IEFDX0JBRCwgQUNfRUksIEFDX1JJLCBBQ19ELCBBQ18sQUNfRVJSLCBBQ19YLEFDX0IsIEFDX0VFLEFDX1JSLEFDX0lFLAotIEFDX1JFLEFDX0UsIEFDX0ksIEFDX0VSLEFDX0lSUiwgQUNfSVIsIEFDX1JFUiwgQUNfRVJFLEFDX0VJRSB9IGFkZHJfY2xhc3NfdHlwZTsgCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc2hvcnQgaW50IGlkeDsKLQljaGFyIGZsYWdzLHNyYzEsc3JjMixkc3Q7Ci0JdW5zaWduZWQgY2hhciBmbGF2b3I7Ci0JY2hhciAqbmFtZTsKLQlpbnQgbmFyZ3M7Ci0JaW50IGFyZ190eXBlWzJdOwotCWludCBsZW5ndGg7Ci0Jc3RydWN0IHsgdW5zaWduZWQgY2hhciBjb250ZW50czt1bnNpZ25lZCBjaGFyIG1hc2s7IGNoYXIgaW5zZXJ0OyB9IGJ5dGVzWzZdOwotfSBoODUwMF9vcGNvZGVfaW5mbzsKLWg4NTAwX29wY29kZV9pbmZvIGg4NTAwX3RhYmxlW10KLSNpZmRlZiBBU1NFTUJMRVJfVEFCTEUKLSNpZmRlZiBERUZJTkVfVEFCTEUKLT17Ci0vKgotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LAotCQkJCQkJCQkgICB7MHgwMCwweDAwLEFCUzE2IH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsIH0sCi0JCQkJCQkJCSAgIHsweDA3LDB4ZmYsIH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sKi8KLQotezEsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX1dPUkQsInhvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LENSVyB9fX0sCi17MiwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fQllURSwieG9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NiwnLScsJ1gnLCchJywnIScsT19YQ0h8T19XT1JELCJ4Y2gudyIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17NywnLScsJ1gnLCchJywnIScsT19YQ0h8T19VTlNaLCJ4Y2giLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAotezgsJy0nLCdCJywnIScsJyEnLE9fVU5MS3xPX1VOU1osInVubGsiLDEse0ZQLDB9LDEsCXt7MHgwZiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMiwnLScsJ0knLCchJywnIScsT19UUkFQQXxPX1VOU1osInRyYXBhIiwxLHtJTU00LDB9LDIsCXt7MHgwOCwweGZmLCB9LHsweDEwLDB4ZjAsSU1NNCB9fX0sCi17MTMsJy0nLCdCJywnIScsJyEnLE9fVFJBUF9WU3xPX1VOU1osInRyYXAvdnMiLDAsezAsMH0sMSwJe3sweDA5LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezE2LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19CWVRFLCJzd2FwLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE3LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19VTlNaLCJzd2FwIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNywnLScsJ0knLCchJywnRScsT19TVE18T19VTlNaLCJzdG0iLDIse1JMSVNULFNQREVDfSwyLAl7ezB4MTIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk59LDIsCQl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzEsJy0nLCchJywnIScsJyEnLE9fU0xFRVB8T19VTlNaLCJzbGVlcCIsMCx7MCwwfSwxLAl7ezB4MWEsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDQsJy0nLCdCJywnUycsJ1MnLE9fU0NCX05FfE9fVU5TWiwic2NiL25lIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNiwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDUsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0Z8T19VTlNaLCJzY2IvZiIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDEsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ2LCctJywnQicsJ1MnLCdTJyxPX1NDQl9FUXxPX1VOU1osInNjYi9lcSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDcsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ3LCctJywnQicsJyEnLCchJyxPX1JUU3xPX1VOU1osInJ0cyIsMCx7MCwwfSwxLAl7ezB4MTksMHhmZiwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NOCwwfSwyLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NMTYsMH0sMywJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYxLCctJywnQicsJyEnLCchJyxPX1BSVFN8T19VTlNaLCJwcnRzIiwwLHswLDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweDFjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzgsMHhmOCxSRElORCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse0FCUzI0LDB9LDQsCXt7MHgwMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzAsMHhmOCxSRElORCB9fX0sCi17NjQsJy0nLCdKJywnIScsJyEnLE9fUEpNUHxPX1VOU1osInBqbXAiLDEse0FCUzI0LDB9LDQsCXt7MHgxMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2NSwncycsJ0knLCdDJywnQycsT19PUkN8T19XT1JELCJvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCi17NjYsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fQllURSwib3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NjcsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fVU5TWiwib3JjIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAotezY3LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1VOU1osIm9yYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezc0LCctJywnIScsJyEnLCchJyxPX05PUHxPX1VOU1osIm5vcCIsMCx7MCwwfSwxLAl7ezB4MDAsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOLFJEfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5ELFJEfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOREVDLFJEfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0Q4LFJEfSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDE2LFJEfSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklORCxSRH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtBQlM4LFJEfSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5EX0QxNixSRH0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6cy53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OnMuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpzIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODgsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmwudyIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg5LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpsLmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs5MCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6bCIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezkxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTIsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmkiLCAgMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUse3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk4LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpmIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTksJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMCwnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZSIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi0vKnsxMDMsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJEfSwyLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sKi8KLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORH0sMywJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklOQ30sMywJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NOH0sMiwJe3sweDE3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTE2fSwzLAl7ezB4MWYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNSwnLScsJ0UnLCchJywnQycsT19MRE18T19VTlNaLCJsZG0iLDIse1NQSU5DLFJMSVNUfSwyLAl7ezB4MDIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOLENSV30sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkQsQ1JXfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5DLENSV30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTkRFQyxDUld9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7QUJTOCxDUld9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5EX0Q4LENSV30sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtBQlMxNixDUld9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5EX0QxNixDUld9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOLENSQn0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5DLENSQn0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORCxDUkJ9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzgsQ1JCfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzE2LENSQn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOLENSV30sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk4sQ1JCfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklOQyxDUld9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5ELENSQn0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5ERUMsQ1JXfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORCxDUld9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkMsQ1JCfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlM4LENSV30sMywJCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlM4LENSQn0sMywJCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtJTU04LENSQn0sMywJCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EOCxDUld9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlMxNixDUkJ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlMxNixDUld9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EMTYsQ1JXfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQ4LDB4ZjgsUkQgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse0FCUzE2LDB9LDMsCXt7MHgxOCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTgsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjgsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhkMCwweGY4LFJEIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTAsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGUwLDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweGYwLDB4ZjgsUkRJTkRfRDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17MTExLCdzJywnRCcsJyEnLCdEJyxPX0VYVFV8T19CWVRFLCJleHR1LmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTIsMHhmZiwgfX19LAotezExMiwncycsJ0QnLCchJywnRCcsT19FWFRVfE9fVU5TWiwiZXh0dSIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTEzLCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19CWVRFLCJleHRzLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTEsMHhmZiwgfX19LAotezExNCwncycsJ0QnLCchJywnRCcsT19FWFRTfE9fVU5TWiwiZXh0cyIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMSwweGZmLCB9fX0sCi17MTE1LCdzJywnRCcsJyEnLCchJyxPX0RTVUJ8T19VTlNaLCJkc3ViIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE5LCdzJywnRCcsJyEnLCchJyxPX0RBRER8T19VTlNaLCJkYWRkIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezEyMCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6aSIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LHt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI1LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjYsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmUiLDIse0lNTTgsUkR9LDIsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTixSRH0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTgsUkR9LDIsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtBQlM4LFJEfSwzLAkJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk59LDQsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMywnLScsJ0InLCchJywnIScsT19CVlN8T19XT1JELCJidnMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTM0LCctJywnQicsJyEnLCchJyxPX0JWU3xPX0JZVEUsImJ2cy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzNSwnLScsJ0InLCchJywnIScsT19CVlN8T19VTlNaLCJidnMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM1LCctJywnQicsJyEnLCchJyxPX0JWU3xPX1VOU1osImJ2cyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTM2LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1dPUkQsImJ2Yy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzcsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fQllURSwiYnZjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM4LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1VOU1osImJ2YyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzgsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fVU5TWiwiYnZjIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQyLCctJywnQicsJyEnLCchJyxPX0JUfE9fV09SRCwiYnQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQzLCctJywnQicsJyEnLCchJyxPX0JUfE9fQllURSwiYnQuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDQsJy0nLCdCJywnIScsJyEnLE9fQlR8T19VTlNaLCJidCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDQsJy0nLCdCJywnIScsJyEnLE9fQlR8T19VTlNaLCJidCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQ1LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1dPUkQsImJzci53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDYsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fQllURSwiYnNyLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MGUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ3LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1VOU1osImJzciIsMSx7UENSRUw4LDB9LDIsCXt7MHgwZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDcsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fVU5TWiwiYnNyIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUxLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1dPUkQsImJybi53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTIsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fQllURSwiYnJuLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTUzLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1VOU1osImJybiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTMsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fVU5TWiwiYnJuIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTQsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fV09SRCwiYnJhLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NSwnLScsJ0InLCchJywnIScsT19CUkF8T19CWVRFLCJicmEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTYsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fVU5TWiwiYnJhIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1NiwnLScsJ0InLCchJywnIScsT19CUkF8T19VTlNaLCJicmEiLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NywnLScsJyEnLCchJywnIScsT19CUFR8T19VTlNaLCJicHQiLDAsezAsMH0sMSwJe3sweDBiLDB4ZmYsIH19fSwKLXsxNTgsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fV09SRCwiYnBsLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1OSwnLScsJ0InLCchJywnIScsT19CUEx8T19CWVRFLCJicGwuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjAsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fVU5TWiwiYnBsIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2MCwnLScsJ0InLCchJywnIScsT19CUEx8T19VTlNaLCJicGwiLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjQsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fV09SRCwiYm5lLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2NSwnLScsJ0InLCchJywnIScsT19CTkV8T19CWVRFLCJibmUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjYsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fVU5TWiwiYm5lIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NiwnLScsJ0InLCchJywnIScsT19CTkV8T19VTlNaLCJibmUiLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2NywnLScsJ0InLCchJywnIScsT19CTUl8T19XT1JELCJibWkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY4LCctJywnQicsJyEnLCchJyxPX0JNSXxPX0JZVEUsImJtaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2OSwnLScsJ0InLCchJywnIScsT19CTUl8T19VTlNaLCJibWkiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY5LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1VOU1osImJtaSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTcwLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1dPUkQsImJsdC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzEsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fQllURSwiYmx0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTcyLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1VOU1osImJsdCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzIsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fVU5TWiwiYmx0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzMsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fV09SRCwiYmxzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3NCwnLScsJ0InLCchJywnIScsT19CTFN8T19CWVRFLCJibHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzUsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fVU5TWiwiYmxzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NSwnLScsJ0InLCchJywnIScsT19CTFN8T19VTlNaLCJibHMiLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3NiwnLScsJ0InLCchJywnIScsT19CTE98T19XT1JELCJibG8udyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc3LCctJywnQicsJyEnLCchJyxPX0JMT3xPX0JZVEUsImJsby5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3OCwnLScsJ0InLCchJywnIScsT19CTE98T19VTlNaLCJibG8iLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc4LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1VOU1osImJsbyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc5LCctJywnQicsJyEnLCchJyxPX0JMRXxPX1dPUkQsImJsZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODAsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fQllURSwiYmxlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTgxLCctJywnQicsJyEnLCchJyxPX0JMRXxPX1VOU1osImJsZSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODEsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fVU5TWiwiYmxlIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODIsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fV09SRCwiYmhzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MywnLScsJ0InLCchJywnIScsT19CSFN8T19CWVRFLCJiaHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODQsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fVU5TWiwiYmhzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NCwnLScsJ0InLCchJywnIScsT19CSFN8T19VTlNaLCJiaHMiLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4NSwnLScsJ0InLCchJywnIScsT19CSEl8T19XT1JELCJiaGkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg2LCctJywnQicsJyEnLCchJyxPX0JISXxPX0JZVEUsImJoaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NywnLScsJ0InLCchJywnIScsT19CSEl8T19VTlNaLCJiaGkiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg3LCctJywnQicsJyEnLCchJyxPX0JISXxPX1VOU1osImJoaSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg4LCctJywnQicsJyEnLCchJyxPX0JHVHxPX1dPUkQsImJndC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODksJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fQllURSwiYmd0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkwLCctJywnQicsJyEnLCchJyxPX0JHVHxPX1VOU1osImJndCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTAsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fVU5TWiwiYmd0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTEsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fV09SRCwiYmdlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MiwnLScsJ0InLCchJywnIScsT19CR0V8T19CWVRFLCJiZ2UuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTMsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fVU5TWiwiYmdlIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MywnLScsJ0InLCchJywnIScsT19CR0V8T19VTlNaLCJiZ2UiLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NCwnLScsJ0InLCchJywnIScsT19CRnxPX1dPUkQsImJmLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NSwnLScsJ0InLCchJywnIScsT19CRnxPX0JZVEUsImJmLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk2LCctJywnQicsJyEnLCchJyxPX0JGfE9fVU5TWiwiYmYiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk2LCctJywnQicsJyEnLCchJyxPX0JGfE9fVU5TWiwiYmYiLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NywnLScsJ0InLCchJywnIScsT19CRVF8T19XT1JELCJiZXEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk4LCctJywnQicsJyEnLCchJyxPX0JFUXxPX0JZVEUsImJlcS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5OSwnLScsJ0InLCchJywnIScsT19CRVF8T19VTlNaLCJiZXEiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk5LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1VOU1osImJlcSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjAwLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1dPUkQsImJjcy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDEsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fQllURSwiYmNzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjAyLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1VOU1osImJjcyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDIsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fVU5TWiwiYmNzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA2LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1dPUkQsImJjYy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDcsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fQllURSwiYmNjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjA4LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1VOU1osImJjYyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDgsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fVU5TWiwiYmNjIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDksJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1dPUkQsImFuZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjEwLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19CWVRFLCJhbmRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1OCwweGY4LENSQiB9fX0sCi17MjExLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19VTlNaLCJhbmRjIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTgsMHhmOCxDUkIgfX19LAotezIxMSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fVU5TWiwiYW5kYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLTAsMCwwfQotI2VuZGlmCi07Ci0jZW5kaWYKLSNpZmRlZiBESVNBU1NFTUJMRVJfVEFCTEUKLSNpZmRlZiBERUZJTkVfVEFCTEUKLT17Ci17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzMCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezYsJy0nLCdYJywnIScsJyEnLE9fWENIfE9fV09SRCwieGNoLnciLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxNiwnbScsJ0QnLCchJywnRCcsT19TV0FQfE9fV09SRCwic3dhcC5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezIsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX0JZVEUsInhvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDY4LDB4ZjgsQ1JCIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNiwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAotezEyLCctJywnSScsJyEnLCchJyxPX1RSQVBBfE9fVU5TWiwidHJhcGEiLDEse0lNTTQsMH0sMiwJe3sweDA4LDB4ZmYsIH0sezB4MTAsMHhmMCxJTU00IH19fSwKLXsxMywnLScsJ0InLCchJywnIScsT19UUkFQX1ZTfE9fVU5TWiwidHJhcC92cyIsMCx7MCwwfSwxLAl7ezB4MDksMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsxLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19XT1JELCJ4b3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxDUlcgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezgsJy0nLCdCJywnIScsJyEnLE9fVU5MS3xPX1VOU1osInVubGsiLDEse0ZQLDB9LDEsCXt7MHgwZiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyNywnLScsJ0knLCchJywnRScsT19TVE18T19VTlNaLCJzdG0iLDIse1JMSVNULFNQREVDfSwyLAl7ezB4MTIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMSwnLScsJyEnLCchJywnIScsT19TTEVFUHxPX1VOU1osInNsZWVwIiwwLHswLDB9LDEsCXt7MHgxYSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOCwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0NSwnLScsJ0InLCdTJywnUycsT19TQ0JfRnxPX1VOU1osInNjYi9mIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwMSwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0NCwnLScsJ0InLCdTJywnUycsT19TQ0JfTkV8T19VTlNaLCJzY2IvbmUiLDIse1JTLFBDUkVMOH0sMywJe3sweDA2LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0NiwnLScsJ0InLCdTJywnUycsT19TQ0JfRVF8T19VTlNaLCJzY2IvZXEiLDIse1JTLFBDUkVMOH0sMywJe3sweDA3LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NMTYsMH0sMywJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs0OCwnLScsJ0InLCchJywnIScsT19SVER8T19VTlNaLCJydGQiLDEse0lNTTgsMH0sMiwJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDcsJy0nLCdCJywnIScsJyEnLE9fUlRTfE9fVU5TWiwicnRzIiwwLHswLDB9LDEsCXt7MHgxOSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezk5LCdtJywnSScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDgwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NywnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDkwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezg5LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpsLmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6bC53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OnMuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpzLnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse0FCUzI0LDB9LDQsCXt7MHgwMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY2LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX0JZVEUsIm9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNSwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezc0LCctJywnIScsJyEnLCchJyxPX05PUHxPX1VOU1osIm5vcCIsMCx7MCwwfSwxLAl7ezB4MDAsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY1LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1dPUkQsIm9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzAsMHhmOCxSRElORCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGM4LDB4ZjgsUkRJTkQgfX19LAotezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU04LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs2MSwnLScsJ0InLCchJywnIScsT19QUlRTfE9fVU5TWiwicHJ0cyIsMCx7MCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHgxOSwweGZmLCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweDFjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7QUJTMjQsMH0sNCwJe3sweDEzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkQsUkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EMTYsUkR9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLQotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTMTYsUkR9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17MTI1LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk4sQ1JCfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMjAsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTksJ3MnLCdEJywnIScsJyEnLE9fREFERHxPX1VOU1osImRhZGQiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTE1LCdzJywnRCcsJyEnLCchJyxPX0RTVUJ8T19VTlNaLCJkc3ViIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezExMywncycsJ0QnLCchJywnRCcsT19FWFRTfE9fQllURSwiZXh0cy5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDExLDB4ZmYsIH19fSwKLXsxMTEsJ3MnLCdEJywnIScsJ0QnLE9fRVhUVXxPX0JZVEUsImV4dHUuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0QxNixDUkJ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTAsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQwLDB4ZjgsUkQgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQ4LDB4ZjgsUkQgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGUwLDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTgsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjAsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjgsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTgsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTMTYsQ1JCfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklOQyxDUkJ9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkQsQ1JCfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlM4LENSQn0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTA1LCctJywnRScsJyEnLCdDJyxPX0xETXxPX1VOU1osImxkbSIsMix7U1BJTkMsUkxJU1R9LDIsCXt7MHgwMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTE2fSwzLAl7ezB4MWYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NOH0sMiwJe3sweDE3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzcsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fQllURSwiYnZjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM0LCctJywnQicsJyEnLCchJyxPX0JWU3xPX0JZVEUsImJ2cy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzNiwnLScsJ0InLCchJywnIScsT19CVkN8T19XT1JELCJidmMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTMzLCctJywnQicsJyEnLCchJyxPX0JWU3xPX1dPUkQsImJ2cy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ2LCctJywnQicsJyEnLCchJyxPX0JTUnxPX0JZVEUsImJzci5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDBlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDUsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fV09SRCwiYnNyLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTAsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX0JZVEUsImFuZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDU4LDB4ZjgsQ1JCIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA5LCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19XT1JELCJhbmRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxDUlcgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezE1NywnLScsJyEnLCchJywnIScsT19CUFR8T19VTlNaLCJicHQiLDAsezAsMH0sMSwJe3sweDBiLDB4ZmYsIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNTUsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fQllURSwiYnJhLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNTIsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fQllURSwiYnJuLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg2LCctJywnQicsJyEnLCchJyxPX0JISXxPX0JZVEUsImJoaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NCwnLScsJ0InLCchJywnIScsT19CTFN8T19CWVRFLCJibHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDcsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fQllURSwiYmNjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjAxLCctJywnQicsJyEnLCchJyxPX0JDU3xPX0JZVEUsImJjcy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NSwnLScsJ0InLCchJywnIScsT19CTkV8T19CWVRFLCJibmUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTgsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fQllURSwiYmVxLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU5LCctJywnQicsJyEnLCchJyxPX0JQTHxPX0JZVEUsImJwbC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2OCwnLScsJ0InLCchJywnIScsT19CTUl8T19CWVRFLCJibWkuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTIsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fQllURSwiYmdlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTcxLCctJywnQicsJyEnLCchJyxPX0JMVHxPX0JZVEUsImJsdC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4OSwnLScsJ0InLCchJywnIScsT19CR1R8T19CWVRFLCJiZ3QuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODAsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fQllURSwiYmxlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU0LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1dPUkQsImJyYS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTEsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fV09SRCwiYnJuLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4NSwnLScsJ0InLCchJywnIScsT19CSEl8T19XT1JELCJiaGkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTczLCctJywnQicsJyEnLCchJyxPX0JMU3xPX1dPUkQsImJscy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDYsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fV09SRCwiYmNjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMCwnLScsJ0InLCchJywnIScsT19CQ1N8T19XT1JELCJiY3MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY0LCctJywnQicsJyEnLCchJyxPX0JORXxPX1dPUkQsImJuZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTcsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fV09SRCwiYmVxLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1OCwnLScsJ0InLCchJywnIScsT19CUEx8T19XT1JELCJicGwudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY3LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1dPUkQsImJtaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTEsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fV09SRCwiYmdlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MCwnLScsJ0InLCchJywnIScsT19CTFR8T19XT1JELCJibHQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2QsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg4LCctJywnQicsJyEnLCchJyxPX0JHVHxPX1dPUkQsImJndC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzksJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fV09SRCwiYmxlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotLyogCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk4gICdzJywnQycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOREVDICAncycsJ0MnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkQgICdzJywnQycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUlMsUkQgICctJywnWCcsJyEnLCchJwotUk4sMCAgJ2EnLCdFJywnIScsJyEnCi1SUyxSRCAgJy0nLCdYJywnIScsJyEnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQywwICAnYScsJ0UnLCchJywnIScKLVJOSU5DLDAgICdhJywnRScsJyEnLCchJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOREVDLDAgICdhJywnRScsJyEnLCchJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1SRCwwICAnbScsJ0QnLCchJywnRCcKLUFCUzE2LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCchJwotUk4sMCAgJ3MnLCdFJywnIScsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQywwICAncycsJ0UnLCchJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdzJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAncycsJ0UnLCchJywnRScKLVJOLDAgICdzJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklOQywwICAncycsJ0UnLCchJywnRScKLVJOREVDLDAgICdzJywnRScsJyEnLCdFJwotSU1NOCwwICAncycsJ0UnLCchJywnRScKLUFCUzgsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAncycsJ0UnLCchJywnRScKLUFCUzE2LDAgICdzJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdzJywnRScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotUkQsMCAgJ20nLCdEJywnIScsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LDAgICdzJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICctJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdFJywnQycsJ0MnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsMCAgJ2EnLCdFJywnIScsJyEnCi1JTU04LDAgICdzJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLEFCUzggICdzJywnQycsJyEnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotQUJTOCwwICAncycsJ0UnLCchJywnRScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTQsMCAgJy0nLCdJJywnIScsJyEnCi0wLDAgICctJywnQicsJyEnLCchJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0UnLCdDJywnQycKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LDAgICdhJywnRScsJyEnLCchJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotRlAsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsQUJTMTYgICdzJywnQycsJyEnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUkxJU1QsU1BERUMgICctJywnSScsJyEnLCdFJwotQ1JXLFJOICAncycsJ0MnLCchJywnRScKLUNSVyxSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSVyxBQlM4ICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsQUJTMTYgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnIScKLUFCUzE2LDAgICdzJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1DUlcsUk4gICdzJywnQycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsUk5ERUMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSVyxSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5ERUMgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSQixSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotQ1JCLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLUNSVyxBQlM4ICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EMTYgICdzJywnQycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsQUJTMTYgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQ1JXLEFCUzE2ICAncycsJ0MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsUk4gICdzJywnQycsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi0wLDAgICctJywnIScsJyEnLCchJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1SUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICctJywnQicsJyEnLCchJwotSU1NOCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STixSRCAgJy0nLCdFJywnIScsJ0QnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTiAgJy0nLCdTJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdwJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STiwwICAnbScsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdwJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STiwwICAnbScsJ0UnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOREVDICAnLScsJ1MnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ20nLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQywwICAnbScsJ0UnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdhJywnRScsJyEnLCdFJwotSU1NOCxDUkIgICdzJywnSScsJ0MnLCdDJwotSU1NMTYsQ1JXICAncycsJ0knLCdDJywnQycKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzI0LDAgICctJywnSicsJyEnLCchJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnQycsJ0MnCi1JTU04LDAgICdhJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLTAsMCAgJy0nLCchJywnIScsJyEnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0knLCdDJywnQycKLUlNTTE2LDAgICdhJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCwwICAnYScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUkRJTkQsMCAgJy0nLCdKJywnIScsJyEnCi1SRElORCwwICAnLScsJ0onLCchJywnIScKLUlNTTgsMCAgJy0nLCdCJywnIScsJyEnCi0wLDAgICctJywnQicsJyEnLCchJwotSU1NMTYsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMyNCwwICAnLScsJ0onLCchJywnIScKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOLDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOREVDLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1BQlMxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1SUyxSTklOQyAgJy0nLCdTJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOSU5EICAnLScsJ1MnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkRfRDggICctJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJy0nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnLScsJ1MnLCchJywnRScKLVJTLFJOICAnLScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnLScsJ1MnLCchJywnRScKLVJTLFJOSU5EICAnLScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnLScsJ1MnLCchJywnRScKLVJTLEFCUzggICctJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICctJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnLScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnLScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICctJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1STixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnLScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICctJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJyEnLCdEJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklOQyxSRCAgJy0nLCdFJywnIScsJ0QnCi1JTU04LFJOREVDICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOREVDICAnbScsJ0knLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICctJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICctJywnUycsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotQUJTMTYsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk4gICdhJywnRScsJ0knLCchJwotUk4sQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5ELENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5ERUMsQ1JXICAncycsJ0UnLCchJywnQycKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1JTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STixDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUlcgICdzJywnRScsJyEnLCdDJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUlMsUkQgICdzJywnRCcsJyEnLCchJwotUlMsUkQgICdzJywnRCcsJyEnLCchJwotUkQsMCAgJ3MnLCdEJywnIScsJ0QnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJOLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STixDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkMsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5ELENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JXICAncycsJ0UnLCchJywnQycKLVJOREVDLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUlcgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDgsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0Q4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNixDUkIgICdzJywnRScsJyEnLCdDJwotQUJTMTYsQ1JXICAncycsJ0UnLCchJywnQycKLUlNTTE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0QxNixDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNiwwICAnLScsJ0InLCchJywnIScKLVJESU5ELDAgICctJywnQicsJyEnLCchJwotUkRJTkQsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EOCwwICAnLScsJ0InLCchJywnIScKLVJESU5EX0Q4LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDE2LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDE2LDAgICctJywnQicsJyEnLCchJwotQUJTMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLUFCUzE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJOLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklOQyxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncycsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKLVJOLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAncycsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsQ1JCICAncycsJ0UnLCchJywnQycKLUlNTTgsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotU1BJTkMsUkxJU1QgICctJywnRScsJyEnLCdDJwotSU1NOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotRlAsSU1NMTYgICctJywnUycsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotRlAsSU1NOCAgJy0nLCdTJywnSScsJyEnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk5JTkMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTiAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTgsUk5JTkMgICdhJywnRScsJ0knLCchJwotSU1NOCxSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlM4ICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NOCxSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUk4sMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUk5ERUMsMCAgJ2MnLCchJywnIScsJ0UnCi1STklOQywwICAnYycsJyEnLCchJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDgsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJwotSU1NOCwwICAnYycsJyEnLCchJywnRScKLUFCUzgsMCAgJ2MnLCchJywnIScsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotUk5JTkMsMCAgJ2MnLCchJywnIScsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLUFCUzgsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EOCwwICAnYycsJyEnLCchJywnRScKLUlNTTE2LDAgICdjJywnIScsJyEnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0Q4LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTE2LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUFCUzE2LDAgICdjJywnIScsJyEnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJOSU5DLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnSScsJ1MnLCdTJwotSU1NMTYsQ1JXICAncycsJ0knLCdTJywnUycKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICctJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnUycsJ1MnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0knLCdTJywnUycKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotMCwwICAnLScsJyEnLCchJywnIScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi0qLyAKLXswLDAsMH19Ci0jZW5kaWYKLTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9ocHBhLWRpcy5jIGIvb3Bjb2Rlcy9ocHBhLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ1ZDVlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaHBwYS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZXIgZm9yIHRoZSBQQS1SSVNDLiBTb21ld2hhdCBkZXJpdmVkIGZyb20gc3BhcmMtcGluc24uYy4KLSAgIENvcHlyaWdodCAxOTg5LCAxOTkwLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJsaWJocHBhLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2hwcGEuaCIKLQotLyogSW50ZWdlciByZWdpc3RlciBuYW1lcywgaW5kZXhlZCBieSB0aGUgbnVtYmVycyB3aGljaCBhcHBlYXIgaW4gdGhlCi0gICBvcGNvZGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IAotIHsiZmxhZ3MiLCAicjEiLCAicnAiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiLAotICAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLCAicjE2IiwgInIxNyIsICJyMTgiLCAicjE5IiwKLSAgInIyMCIsICJyMjEiLCAicjIyIiwgInIyMyIsICJyMjQiLCAicjI1IiwgInIyNiIsICJkcCIsICJyZXQwIiwgInJldDEiLAotICAic3AiLCAicjMxIn07Ci0KLS8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG5hbWVzLCBpbmRleGVkIGJ5IHRoZSBudW1iZXJzIHdoaWNoIGFwcGVhciBpbiB0aGUKLSAgIG9wY29kZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZwX3JlZ19uYW1lc1tdID0gCi0geyJmcHNyIiwgImZwZTIiLCAiZnBlNCIsICJmcGU2IiwgCi0gICJmcjQiLCAiZnI1IiwgImZyNiIsICJmcjciLCAiZnI4IiwgCi0gICJmcjkiLCAiZnIxMCIsICJmcjExIiwgImZyMTIiLCAiZnIxMyIsICJmcjE0IiwgImZyMTUiLCAKLSAgImZyMTYiLCAiZnIxNyIsICJmcjE4IiwgImZyMTkiLCAiZnIyMCIsICJmcjIxIiwgImZyMjIiLCAiZnIyMyIsCi0gICJmcjI0IiwgImZyMjUiLCAiZnIyNiIsICJmcjI3IiwgImZyMjgiLCAiZnIyOSIsICJmcjMwIiwgImZyMzEifTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgQ09SRV9BRERSOwotCi0vKiBHZXQgYXQgdmFyaW91cyByZWxldmVudCBmaWVsZHMgb2YgYW4gaW5zdHJ1Y3Rpb24gd29yZC4gKi8KLQotI2RlZmluZSBNQVNLXzUgMHgxZgotI2RlZmluZSBNQVNLXzExIDB4N2ZmCi0jZGVmaW5lIE1BU0tfMTQgMHgzZmZmCi0jZGVmaW5lIE1BU0tfMjEgMHgxZmZmZmYKLQotLyogVGhpcyBtYWNybyBnZXRzIGJpdCBmaWVsZHMgdXNpbmcgSFAncyBudW1iZXJpbmcgKE1TQiA9IDApICovCi0KLSNkZWZpbmUgR0VUX0ZJRUxEKFgsIEZST00sIFRPKSBcCi0gICgoWCkgPj4gKDMxIC0gKFRPKSkgJiAoKDEgPDwgKChUTykgLSAoRlJPTSkgKyAxKSkgLSAxKSkKLQotLyogU29tZSBvZiB0aGVzZSBoYXZlIGJlZW4gY29udmVydGVkIHRvIDItZCBhcnJheXMgYmVjYXVzZSB0aGV5Ci0gICBjb25zdW1lIGxlc3Mgc3RvcmFnZSB0aGlzIHdheS4gIElmIHRoZSBtYWludGVuYW5jZSBiZWNvbWVzIGEKLSAgIHByb2JsZW0sIGNvbnZlcnQgdGhlbSBiYWNrIHRvIGNvbnN0IDEtZCBwb2ludGVyIGFycmF5cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBjb250cm9sX3JlZ1tdWzZdID0gewotICAicmN0ciIsICJjcjEiLCAiY3IyIiwgImNyMyIsICJjcjQiLCAiY3I1IiwgImNyNiIsICJjcjciLAotICAicGlkcjEiLCAicGlkcjIiLCAiY2NyIiwgInNhciIsICJwaWRyMyIsICJwaWRyNCIsCi0gICJpdmEiLCAiZWllbSIsICJpdG1yIiwgInBjc3EiLCAicGNvcSIsICJpaXIiLCAiaXNyIiwKLSAgImlvciIsICJpcHN3IiwgImVpcnIiLCAidHIwIiwgInRyMSIsICJ0cjIiLCAidHIzIiwKLSAgInRyNCIsICJ0cjUiLCAidHI2IiwgInRyNyIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGNvbXBhcmVfY29uZF9uYW1lc1tdWzVdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsICIsPDwiLCAiLDw8PSIsICIsc3YiLAotICAiLG9kIiwgIix0ciIsICIsPD4iLCAiLD49IiwgIiw+IiwgIiw+Pj0iLAotICAiLD4+IiwgIixuc3YiLCAiLGV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyIGFkZF9jb25kX25hbWVzW11bNV0gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgIixudXYiLCAiLHpudiIsICIsc3YiLAotICAiLG9kIiwgIix0ciIsICIsPD4iLCAiLD49IiwgIiw+IiwgIix1diIsCi0gICIsdm56IiwgIixuc3YiLCAiLGV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsb2dpY2FsX2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAwLCAwLCAwLCAiLG9kIiwKLSAgIix0ciIsICIsPD4iLCAiLD49IiwgIiw+IiwgMCwgMCwgMCwgIixldiJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHVuaXRfY29uZF9uYW1lc1tdID0gewotICAiIiwgMCwgIixzYnoiLCAiLHNoeiIsICIsc2RjIiwgMCwgIixzYmMiLCAiLHNoYyIsCi0gICIsdHIiLCAwLCAiLG5ieiIsICIsbmh6IiwgIixuZGMiLCAwLCAiLG5iYyIsICIsbmhjIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyIHNoaWZ0X2NvbmRfbmFtZXNbXVs0XSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsb2QiLCAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLGV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyIGluZGV4X2NvbXBsX25hbWVzW11bNF0gPSB7IiIsICIsbSIsICIscyIsICIsc20ifTsKLXN0YXRpYyBjb25zdCBjaGFyIHNob3J0X2xkc3RfY29tcGxfbmFtZXNbXVs0XSA9IHsiIiwgIixtYSIsICIiLCAiLG1iIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2hvcnRfYnl0ZXNfY29tcGxfbmFtZXNbXSA9IHsKLSAgIiIsICIsYixtIiwgIixlIiwgIixlLG0iCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZsb2F0X2Zvcm1hdF9uYW1lc1tdID0geyIsc2dsIiwgIixkYmwiLCAiIiwgIixxdWFkIn07Ci1zdGF0aWMgY29uc3QgY2hhciBmbG9hdF9jb21wX25hbWVzW11bOF0gPQotewotICAiLGZhbHNlPyIsICIsZmFsc2UiLCAiLD8iLCAiLCE8PT4iLCAiLD0iLCAiLD10IiwgIiw/PSIsICIsITw+IiwKLSAgIiwhPz49IiwgIiw8IiwgIiw/PCIsICIsIT49IiwgIiwhPz4iLCAiLDw9IiwgIiw/PD0iLCAiLCE+IiwKLSAgIiwhPzw9IiwgIiw+IiwgIiw/PiIsICIsITw9IiwgIiwhPzwiLCAiLD49IiwgIiw/Pj0iLCAiLCE8IiwKLSAgIiwhPz0iLCAiLDw+IiwgIiwhPSIsICIsIT10IiwgIiwhPyIsICIsPD0+IiwgIix0cnVlPyIsICIsdHJ1ZSIKLX07Ci0KLS8qIEZvciBhIGJ1bmNoIG9mIGRpZmZlcmVudCBpbnN0cnVjdGlvbnMgZm9ybSBhbiBpbmRleCBpbnRvIGEgCi0gICBjb21wbGV0ZXIgbmFtZSB0YWJsZS4gKi8KLSNkZWZpbmUgR0VUX0NPTVBMKGluc24pIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgfCBcCi0JCQkgR0VUX0ZJRUxEIChpbnNuLCAxOCwgMTgpIDw8IDEpCi0KLSNkZWZpbmUgR0VUX0NPTkQoaW5zbikgKEdFVF9GSUVMRCAoKGluc24pLCAxNiwgMTgpICsgXAotCQkJKEdFVF9GSUVMRCAoKGluc24pLCAxOSwgMTkpID8gOCA6IDApKQotCi0vKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IHJlZ2lzdGVycy4gIFB1dCB0aGVzZSBmaXJzdCwgc28gZ2NjJ3MgZnVuY3Rpb24KLSAgIGlubGluaW5nIGNhbiBkbyBpdHMgc3R1ZmYuICAqLwotCi0jZGVmaW5lIGZwdXRzX2ZpbHRlcmVkKFNUUixGKQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgU1RSKQotCi1zdGF0aWMgdm9pZAotZnB1dF9yZWcgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgcmVnID8gcmVnX25hbWVzW3JlZ10gOiAicjAiKTsKLX0KLQotc3RhdGljIHZvaWQKLWZwdXRfZnBfcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHJlZyA/IGZwX3JlZ19uYW1lc1tyZWddIDogImZyMCIpOwotfQotCi1zdGF0aWMgdm9pZAotZnB1dF9mcF9yZWdfciAocmVnLCBpbmZvKQotICAgICB1bnNpZ25lZCByZWc7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIC8qIFNwZWNpYWwgY2FzZSBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gcmVnaXN0ZXJzLiAgKi8KLSAgaWYgKHJlZyA8IDQpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmcGUlZCIsIHJlZyAqIDIgKyAxKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNSIiwgcmVnID8gZnBfcmVnX25hbWVzW3JlZ10gCi0JCQkJCQkgICAgOiAiZnIwIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcHV0X2NyZWcgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgY29udHJvbF9yZWdbcmVnXSk7Ci19Ci0KLS8qIHByaW50IGNvbnN0YW50cyB3aXRoIHNpZ24gKi8KLQotc3RhdGljIHZvaWQKLWZwdXRfY29uc3QgKG51bSwgaW5mbykKLSAgICAgdW5zaWduZWQgbnVtOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAoKGludCludW0gPCAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSV4IiwgLShpbnQpbnVtKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXgiLCBudW0pOwotfQotCi0vKiBSb3V0aW5lcyB0byBleHRyYWN0IHZhcmlvdXMgc2l6ZWQgY29uc3RhbnRzIG91dCBvZiBocHBhCi0gICBpbnN0cnVjdGlvbnMuICovCi0KLS8qIGV4dHJhY3QgYSAzLWJpdCBzcGFjZSByZWdpc3RlciBudW1iZXIgZnJvbSBhIGJlLCBibGUsIG10c3Agb3IgbWZzcCAqLwotc3RhdGljIGludAotZXh0cmFjdF8zICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gR0VUX0ZJRUxEICh3b3JkLCAxOCwgMTgpIDw8IDIgfCBHRVRfRklFTEQgKHdvcmQsIDE2LCAxNyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfNV9sb2FkICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkID4+IDE2ICYgTUFTS181LCA1KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBzdHtiaHd9cyBpbnN0cnVjdGlvbiAqLwotc3RhdGljIGludAotZXh0cmFjdF81X3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS181LCA1KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBicmVhayBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0XzVyX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgJiBNQVNLXzUpOwotfQotCi0vKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIHtzcn1zbSBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0XzVSX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgPj4gMTYgJiBNQVNLXzUpOwotfQotCi0vKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIGJiIGluc3RydWN0aW9uICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfNVFfc3RvcmUgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiAod29yZCA+PiAyMSAmIE1BU0tfNSk7Ci19Ci0KLS8qIGV4dHJhY3QgYW4gMTEgYml0IGltbWVkaWF0ZSBmaWVsZCAqLwotc3RhdGljIGludAotZXh0cmFjdF8xMSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfMTEsIDExKTsKLX0KLQotLyogZXh0cmFjdCBhIDE0IGJpdCBpbW1lZGlhdGUgZmllbGQgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTQgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgJiBNQVNLXzE0LCAxNCk7Ci19Ci0KLS8qIGV4dHJhY3QgYSAyMSBiaXQgY29uc3RhbnQgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF8yMSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgaW50IHZhbDsKLQotICB3b3JkICY9IE1BU0tfMjE7Ci0gIHdvcmQgPDw9IDExOwotICB2YWwgPSBHRVRfRklFTEQgKHdvcmQsIDIwLCAyMCk7Ci0gIHZhbCA8PD0gMTE7Ci0gIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDksIDE5KTsKLSAgdmFsIDw8PSAyOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA1LCA2KTsKLSAgdmFsIDw8PSA1OwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCAwLCA0KTsKLSAgdmFsIDw8PSAyOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA3LCA4KTsKLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICh2YWwsIDIxKSA8PCAxMTsKLX0KLQotLyogZXh0cmFjdCBhIDEyIGJpdCBjb25zdGFudCBmcm9tIGJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF8xMiAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIHNpZ25fZXh0ZW5kIChHRVRfRklFTEQgKHdvcmQsIDE5LCAyOCkgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMjksIDI5KSA8PCAxMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgKHdvcmQgJiAweDEpIDw8IDExLCAxMikgPDwgMjsKLX0KLQotLyogZXh0cmFjdCBhIDE3IGJpdCBjb25zdGFudCBmcm9tIGJyYW5jaCBpbnN0cnVjdGlvbnMsIHJldHVybmluZyB0aGUKLSAgIDE5IGJpdCBzaWduZWQgdmFsdWUuICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTcgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBzaWduX2V4dGVuZCAoR0VUX0ZJRUxEICh3b3JkLCAxOSwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMTEsIDE1KSA8PCAxMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKHdvcmQgJiAweDEpIDw8IDE2LCAxNykgPDwgMjsKLX0KLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uLiAgKi8KLWludAotcHJpbnRfaW5zbl9ocHBhIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgaW50IGluc24sIGk7Ci0KLSAgewotICAgIGludCBzdGF0dXMgPQotICAgICAgKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLQkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0gIH0KLQotICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNT1BDT0RFUzsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwYV9vcGNvZGUgKm9wY29kZSA9ICZwYV9vcGNvZGVzW2ldOwotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSA9PSBvcGNvZGUtPm1hdGNoKQotCXsKLQkgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0JICAKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcGNvZGUtPm5hbWUpOwotCi0JICBpZiAoIXN0cmNociAoImNmQ1k8PyFALSsmVT5+bkhOWkZJTWFkdXwiLCBvcGNvZGUtPmFyZ3NbMF0pKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqcykKLQkJewotCQljYXNlICd4JzoKLQkJICBmcHV0X3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnWCc6Ci0gICAgICAgICAgICAgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkgICAgICBmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICAgZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2InOgotCQkgIGZwdXRfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ14nOgotCQkgIGZwdXRfY3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdFJzoKLSAgICAgICAgICAgICAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCSAgICAgIGZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3QnOgotCQkgIGZwdXRfcmVnIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd2JzoKLSAgICAgICAgICAgICAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCSAgICAgIGZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAneSc6Ci0JCSAgZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzQnOgotCQkgIHsKLQkJICAgIGludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDYsIDEwKTsKLQotCQkgICAgcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCSAgICBmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnNic6Ci0JCSAgewotCQkgICAgaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KTsKLQotCQkgICAgcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCSAgICBmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnNyc6Ci0JCSAgewotCQkgICAgaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKTsKLQotCQkgICAgcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCSAgICBmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnOCc6Ci0JCSAgewotCQkgICAgaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMTYsIDIwKTsKLQotCQkgICAgcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCSAgICBmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnOSc6Ci0JCSAgewotCQkgICAgaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMjEsIDI1KTsKLQotCQkgICAgcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCSAgICBmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnNSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81X2xvYWQgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAncyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCi0JCQkJCSAic3IlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE3KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1MnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3IlZCIsIGV4dHJhY3RfMyAoaW5zbikpOwotCQkgIGJyZWFrOwotCQljYXNlICdjJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIGluZGV4X2NvbXBsX25hbWVzW0dFVF9DT01QTCAoaW5zbildKTsKLQkJICBicmVhazsKLQkJY2FzZSAnQyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBzaG9ydF9sZHN0X2NvbXBsX25hbWVzW0dFVF9DT01QTCAoaW5zbildKTsKLQkJICBicmVhazsKLQkJY2FzZSAnWSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBzaG9ydF9ieXRlc19jb21wbF9uYW1lc1tHRVRfQ09NUEwgKGluc24pXSk7Ci0JCSAgYnJlYWs7Ci0JCS8qIHRoZXNlIGZvdXIgY29uZGl0aW9ucyBhcmUgZm9yIHRoZSBzZXQgb2YgaW5zdHJ1Y3Rpb25zCi0JCSAgIHdoaWNoIGRpc3Rpbmd1aXNoIHRydWUvZmFsc2UgY29uZGl0aW9ucyBieSBvcGNvZGUgcmF0aGVyCi0JCSAgIHRoYW4gYnkgdGhlICdmJyBiaXQgKHNpZ2gpOiBjb21iLCBjb21pYiwgYWRkYiwgYWRkaWIgKi8KLQkJY2FzZSAnPCc6Ci0JCSAgZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCldLAotCQkJCSAgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkgIGZwdXRzX2ZpbHRlcmVkIChjb21wYXJlX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpCi0JCQkJICArIEdFVF9GSUVMRCAoaW5zbiwgNCwgNCkgKiA4XSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0AnOgotCQkgIGZwdXRzX2ZpbHRlcmVkIChhZGRfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkgICsgR0VUX0ZJRUxEIChpbnNuLCA0LCA0KSAqIDhdLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnYSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgY29tcGFyZV9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkgIGJyZWFrOwotCQljYXNlICdkJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSBhZGRfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJICBicmVhazsKLQkJY2FzZSAnISc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkJICAgIGFkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJyYnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgbG9naWNhbF9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkgIGJyZWFrOwotCQljYXNlICdVJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIHVuaXRfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJICBicmVhazsKLQkJY2FzZSAnfCc6Ci0JCWNhc2UgJz4nOgotCQljYXNlICd+JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJICAgIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCSAgICAgc2hpZnRfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCldKTsKLQotCQkgIC8qIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpbiBhcmdzIGlzICduJywgaXQgd2lsbCBoYW5kbGUKLQkJICAgICBwdXR0aW5nIG91dCB0aGUgc3BhY2UuICAqLwotCQkgIGlmIChzWzFdICE9ICduJykKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkgIGJyZWFrOwotCQljYXNlICdWJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVfc3RvcmUgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAncic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81cl9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdSJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVSX3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1EnOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNVFfc3RvcmUgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnaSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8xMSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdqJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzE0IChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2snOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMjEgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnbic6Ci0JCSAgaWYgKGluc24gJiAweDIpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixuICIpOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkgIGJyZWFrOwotCQljYXNlICdOJzoKLQkJICBpZiAoKGluc24gJiAweDIwKSAmJiBzWzFdKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbiAiKTsKLQkJICBlbHNlIGlmIChpbnNuICYgMHgyMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG4iKTsKLQkJICBlbHNlIGlmIChzWzFdKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3cnOgotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIDggKyBleHRyYWN0XzEyIChpbnNuKSwKLQkJCQkJICAgICAgIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdXJzoKLQkJICAvKiAxNyBiaXQgUEMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyICsgOCAKLQkJCQkJCSsgZXh0cmFjdF8xNyAoaW5zbikpLAotCQkJCQkgICAgICAgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3onOgotCQkgIC8qIDE3IGJpdCBkaXNwbGFjZW1lbnQuICBUaGlzIGlzIGFuIG9mZnNldCBmcm9tIGEgcmVnaXN0ZXIKLQkJICAgICBzbyBpdCBnZXRzIGRpc2Fzc3NlbWJsZWQgYXMganVzdCBhIG51bWJlciwgbm90IGFueSBzb3J0Ci0JCSAgICAgb2YgYWRkcmVzcy4gICovCi0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8xNyAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdwJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgMzEgLSBHRVRfRklFTEQgKGluc24sIDIyLCAyNikpOwotCQkgIGJyZWFrOwotCQljYXNlICdQJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjYpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnVCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIDMyIC0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnQSc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxOCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdaJzoKLQkJICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbSAiKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICBicmVhazsKLQkJY2FzZSAnRCc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCA2LCAzMSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdmJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMjMsIDI1KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ08nOgotCQkgIGZwdXRfY29uc3QgKChHRVRfRklFTEQgKGluc24sIDYsMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdvJzoKLQkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDIwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzMnOgotCQkgIHsKLQkJICAgIGludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDIxLCAyMik7Ci0JCSAgICByZWcgfD0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpIDw8IDI7Ci0JCSAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMywgMjMpICE9IDApCi0JCSAgICAgIGZwdXRfZnBfcmVnX3IgKHJlZywgaW5mbyk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWNhc2UgJzInOgotCQkgIGZwdXRfY29uc3QgKChHRVRfRklFTEQgKGluc24sIDYsIDIyKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMSc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDIwKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMCc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgMTYsIDIwKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAndSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJWQiLCBHRVRfRklFTEQgKGluc24sIDIzLCAyNSkpOwotCQkgIGJyZWFrOwotCQljYXNlICdGJzoKLQkJICAvKiBpZiBubyBkZXN0aW5hdGlvbiBjb21wbGV0ZXIgYW5kIG5vdCBiZWZvcmUgYSBjb21wbGV0ZXIKLQkJICAgICBmb3IgZmNtcCwgbmVlZCBhIHNwYWNlIGhlcmUgKi8KLQkJICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjIpID09IDEgfHwgc1sxXSA9PSAnTScpCi0JCSAgICBmcHV0c19maWx0ZXJlZCAoZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTksIDIwKV0sCi0JCQkJICAgIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgIChpbnNuLCAxOSwgMjApXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0cnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwKLQkJCQkJCQkJICAxNywgMTgpXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0gnOgotCQkgIGlmIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPT0gMSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzWzBdKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIGZsb2F0X2Zvcm1hdF9uYW1lc1sxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0knOgotCQkgIC8qIGlmIG5vIGRlc3RpbmF0aW9uIGNvbXBsZXRlciBhbmQgbm90IGJlZm9yZSBhIGNvbXBsZXRlcgotCQkgICAgIGZvciBmY21wLCBuZWVkIGEgc3BhY2UgaGVyZSAqLwotCQkgIGlmIChHRVRfRklFTEQgKGluc24sIDIxLCAyMikgPT0gMSB8fCBzWzFdID09ICdNJykKLQkJICAgIGZwdXRzX2ZpbHRlcmVkIChmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApXSwKLQkJCQkgICAgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgKGluc24sIDIwLCAyMCldKTsKLQkJICBicmVhazsKLQkJY2FzZSAnSic6Ci0gICAgICAgICAgICAgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNCwgMjQpKQotCQkgICAgICBmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgICAgICAKLQkJICBicmVhazsKLQkJY2FzZSAnSyc6Ci0gICAgICAgICAgICAgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAxOSwgMTkpKQotCQkgICAgICBmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICAgZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ00nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICBmbG9hdF9jb21wX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgIChpbnNuLCAyNywgMzEpXSk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsICpzKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICByZXR1cm4gc2l6ZW9mKGluc24pOwotCX0KLSAgICB9Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyU4eCIsIGluc24pOwotICByZXR1cm4gc2l6ZW9mKGluc24pOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pMzg2LWRpcy5jIGIvb3Bjb2Rlcy9pMzg2LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWQ4ZjdlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaTM4Ni1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ODggKzAsMCBAQAotLyogUHJpbnQgaTM4NiBpbnN0cnVjdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwgODksIDkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogODAzODYgaW5zdHJ1Y3Rpb24gcHJpbnRlciBieSBQYWNlIFdpbGxpc3NvbiAocGFjZUBwcmVwLmFpLm1pdC5lZHUpCi0gKiBKdWx5IDE5ODgKLSAqICBtb2RpZmllZCBieSBKb2huIEhhc3NleSAoaGFzc2V5QGRnLXJ0cC5kZy5jb20pCi0gKi8KLQotLyoKLSAqIFRoZSBtYWluIHRhYmxlcyBkZXNjcmliaW5nIHRoZSBpbnN0cnVjdGlvbnMgaXMgZXNzZW50aWFsbHkgYSBjb3B5Ci0gKiBvZiB0aGUgIk9wY29kZSBNYXAiIGNoYXB0ZXIgKEFwcGVuZGl4IEEpIG9mIHRoZSBJbnRlbCA4MDM4NgotICogUHJvZ3JhbW1lcnMgTWFudWFsLiAgVXN1YWxseSwgdGhlcmUgaXMgYSBjYXBpdGFsIGxldHRlciwgZm9sbG93ZWQKLSAqIGJ5IGEgc21hbGwgbGV0dGVyLiAgVGhlIGNhcGl0YWwgbGV0dGVyIHRlbGwgdGhlIGFkZHJlc3NpbmcgbW9kZSwKLSAqIGFuZCB0aGUgc21hbGwgbGV0dGVyIHRlbGxzIGFib3V0IHRoZSBvcGVyYW5kIHNpemUuICBSZWZlciB0bwotICogdGhlIEludGVsIG1hbnVhbCBmb3IgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jZGVmaW5lIE1BWExFTiAyMAotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLSNpZm5kZWYgVU5JWFdBUkVfQ09NUEFUCi0vKiBTZXQgbm9uLXplcm8gZm9yIGJyb2tlbiwgY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMuICBTZXQgdG8gemVybyBmb3IKLSAgIG5vbi1icm9rZW4gb3Bjb2Rlcy4gICovCi0jZGVmaW5lIFVOSVhXQVJFX0NPTVBBVCAxCi0jZW5kaWYKLQotc3RhdGljIGludCBmZXRjaF9kYXRhIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF9ieXRlICopKTsKLQotc3RydWN0IGRpc19wcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotLyogVGhlIG9wY29kZSBmb3IgdGhlIGZ3YWl0IGluc3RydWN0aW9uLCB3aGljaCB3ZSB0cmVhdCBhcyBhIHByZWZpeAotICAgd2hlbiB3ZSBjYW4uICAqLwotI2RlZmluZSBGV0FJVF9PUENPREUgKDB4OWIpCi0KLS8qIEZsYWdzIGZvciB0aGUgcHJlZml4ZXMgZm9yIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgU2VlIGJlbG93LiAgKi8KLXN0YXRpYyBpbnQgcHJlZml4ZXM7Ci0KLS8qIEZsYWdzIGZvciBwcmVmaXhlcyB3aGljaCB3ZSBzb21laG93IGhhbmRsZWQgd2hlbiBwcmludGluZyB0aGUKLSAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIGludCB1c2VkX3ByZWZpeGVzOwotCi0vKiBGbGFncyBzdG9yZWQgaW4gUFJFRklYRVMuICAqLwotI2RlZmluZSBQUkVGSVhfUkVQWiAxCi0jZGVmaW5lIFBSRUZJWF9SRVBOWiAyCi0jZGVmaW5lIFBSRUZJWF9MT0NLIDQKLSNkZWZpbmUgUFJFRklYX0NTIDgKLSNkZWZpbmUgUFJFRklYX1NTIDB4MTAKLSNkZWZpbmUgUFJFRklYX0RTIDB4MjAKLSNkZWZpbmUgUFJFRklYX0VTIDB4NDAKLSNkZWZpbmUgUFJFRklYX0ZTIDB4ODAKLSNkZWZpbmUgUFJFRklYX0dTIDB4MTAwCi0jZGVmaW5lIFBSRUZJWF9EQVRBIDB4MjAwCi0jZGVmaW5lIFBSRUZJWF9BRERSIDB4NDAwCi0jZGVmaW5lIFBSRUZJWF9GV0FJVCAweDgwMAotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgZGlzX3ByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgZGlzX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGRpc19wcml2YXRlICopaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGRpZCBtYW5hZ2UgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSwgdGhlbgotICAgICAgICAgcHJpbnRfaW5zbl9pMzg2IHdpbGwgZG8gc29tZXRoaW5nIHNlbnNpYmxlLiAgT3RoZXJ3aXNlLCBwcmludAotICAgICAgICAgYW4gZXJyb3IuICBXZSBkbyB0aGF0IGhlcmUgYmVjYXVzZSB0aGlzIGlzIHdoZXJlIHdlIGtub3cKLSAgICAgICAgIFNUQVRVUy4gICovCi0gICAgICBpZiAocHJpdi0+bWF4X2ZldGNoZWQgPT0gcHJpdi0+dGhlX2J1ZmZlcikKLQkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotCi0jZGVmaW5lIEViIE9QX0UsIGJfbW9kZQotI2RlZmluZSBpbmRpckViIE9QX2luZGlyRSwgYl9tb2RlCi0jZGVmaW5lIEdiIE9QX0csIGJfbW9kZQotI2RlZmluZSBFdiBPUF9FLCB2X21vZGUKLSNkZWZpbmUgRWQgT1BfRSwgZF9tb2RlCi0jZGVmaW5lIGluZGlyRXYgT1BfaW5kaXJFLCB2X21vZGUKLSNkZWZpbmUgRXcgT1BfRSwgd19tb2RlCi0jZGVmaW5lIE1hIE9QX0UsIHZfbW9kZQotI2RlZmluZSBNIE9QX0UsIDAJCS8qIGxlYSAqLwotI2RlZmluZSBNcCBPUF9FLCAwCQkvKiAzMiBvciA0OCBiaXQgbWVtb3J5IG9wZXJhbmQgZm9yIExEUywgTEVTIGV0YyAqLwotI2RlZmluZSBHdiBPUF9HLCB2X21vZGUKLSNkZWZpbmUgR3cgT1BfRywgd19tb2RlCi0jZGVmaW5lIFJkIE9QX1JkLCBkX21vZGUKLSNkZWZpbmUgSWIgT1BfSSwgYl9tb2RlCi0jZGVmaW5lIHNJYiBPUF9zSSwgYl9tb2RlCS8qIHNpZ24gZXh0ZW5lZCBieXRlICovCi0jZGVmaW5lIEl2IE9QX0ksIHZfbW9kZQotI2RlZmluZSBJdyBPUF9JLCB3X21vZGUKLSNkZWZpbmUgSmIgT1BfSiwgYl9tb2RlCi0jZGVmaW5lIEp2IE9QX0osIHZfbW9kZQotI2RlZmluZSBDZCBPUF9DLCBkX21vZGUKLSNkZWZpbmUgRGQgT1BfRCwgZF9tb2RlCi0jZGVmaW5lIFRkIE9QX1QsIGRfbW9kZQotCi0jZGVmaW5lIGVBWCBPUF9SRUcsIGVBWF9yZWcKLSNkZWZpbmUgZUJYIE9QX1JFRywgZUJYX3JlZwotI2RlZmluZSBlQ1ggT1BfUkVHLCBlQ1hfcmVnCi0jZGVmaW5lIGVEWCBPUF9SRUcsIGVEWF9yZWcKLSNkZWZpbmUgZVNQIE9QX1JFRywgZVNQX3JlZwotI2RlZmluZSBlQlAgT1BfUkVHLCBlQlBfcmVnCi0jZGVmaW5lIGVTSSBPUF9SRUcsIGVTSV9yZWcKLSNkZWZpbmUgZURJIE9QX1JFRywgZURJX3JlZwotI2RlZmluZSBBTCBPUF9SRUcsIGFsX3JlZwotI2RlZmluZSBDTCBPUF9SRUcsIGNsX3JlZwotI2RlZmluZSBETCBPUF9SRUcsIGRsX3JlZwotI2RlZmluZSBCTCBPUF9SRUcsIGJsX3JlZwotI2RlZmluZSBBSCBPUF9SRUcsIGFoX3JlZwotI2RlZmluZSBDSCBPUF9SRUcsIGNoX3JlZwotI2RlZmluZSBESCBPUF9SRUcsIGRoX3JlZwotI2RlZmluZSBCSCBPUF9SRUcsIGJoX3JlZwotI2RlZmluZSBBWCBPUF9SRUcsIGF4X3JlZwotI2RlZmluZSBEWCBPUF9SRUcsIGR4X3JlZwotI2RlZmluZSBpbmRpckRYIE9QX1JFRywgaW5kaXJfZHhfcmVnCi0KLSNkZWZpbmUgU3cgT1BfU0VHLCB3X21vZGUKLSNkZWZpbmUgQXAgT1BfRElSLCAwCi0jZGVmaW5lIE9iIE9QX09GRiwgYl9tb2RlCi0jZGVmaW5lIE92IE9QX09GRiwgdl9tb2RlCi0jZGVmaW5lIFhiIE9QX0RTcmVnLCBlU0lfcmVnCi0jZGVmaW5lIFh2IE9QX0RTcmVnLCBlU0lfcmVnCi0jZGVmaW5lIFliIE9QX0VTcmVnLCBlRElfcmVnCi0jZGVmaW5lIFl2IE9QX0VTcmVnLCBlRElfcmVnCi0jZGVmaW5lIERTQlggT1BfRFNyZWcsIGVCWF9yZWcKLQotI2RlZmluZSBlcyBPUF9SRUcsIGVzX3JlZwotI2RlZmluZSBzcyBPUF9SRUcsIHNzX3JlZwotI2RlZmluZSBjcyBPUF9SRUcsIGNzX3JlZwotI2RlZmluZSBkcyBPUF9SRUcsIGRzX3JlZwotI2RlZmluZSBmcyBPUF9SRUcsIGZzX3JlZwotI2RlZmluZSBncyBPUF9SRUcsIGdzX3JlZwotCi0jZGVmaW5lIE1YIE9QX01NWCwgMAotI2RlZmluZSBYTSBPUF9YTU0sIDAKLSNkZWZpbmUgRU0gT1BfRU0sIHZfbW9kZQotI2RlZmluZSBFWCBPUF9FWCwgdl9tb2RlCi0jZGVmaW5lIE1TIE9QX01TLCB2X21vZGUKLSNkZWZpbmUgTm9uZSBPUF9FLCAwCi0jZGVmaW5lIE9QU1VGIE9QXzNETm93U3VmZml4LCAwCi0jZGVmaW5lIE9QU0lNRCBPUF9TSU1EX1N1ZmZpeCwgMAotCi0vKiBiaXRzIGluIHNpemVmbGFnICovCi0jaWYgMCAvKiBsZWF2ZSB1bmRlZmluZWQgdW50aWwgc29tZW9uZSBhZGRzIHRoZSBleHRyYSBmbGFnIHRvIG9iamR1bXAgKi8KLSNkZWZpbmUgU1VGRklYX0FMV0FZUyA0Ci0jZW5kaWYKLSNkZWZpbmUgQUZMQUcgMgotI2RlZmluZSBERkxBRyAxCi0KLXR5cGVkZWYgdm9pZCAoKm9wX3J0bikgUEFSQU1TICgoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpKTsKLQotc3RhdGljIHZvaWQgT1BfRSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfSSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfaW5kaXJFIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9zSSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfUkVHIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9KIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9ESVIgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX09GRiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRVNyZWcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0RTcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TRUcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0MgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1JkIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TVCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU1RpICBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfTU1YIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9YTU0gUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0VNIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9FWCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfTVMgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QXzNETm93U3VmZml4IFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TSU1EX1N1ZmZpeCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgU0lNRF9GaXh1cCBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZCBhcHBlbmRfc2VnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNldF9vcCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgb3ApKTsKLXN0YXRpYyB2b2lkIHB1dG9wIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnRlbXBsYXRlLCBpbnQgc2l6ZWZsYWcpKTsKLXN0YXRpYyB2b2lkIGRvZmxvYXQgUEFSQU1TICgoaW50IHNpemVmbGFnKSk7Ci1zdGF0aWMgaW50IGdldDE2IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0MzIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2twcmVmaXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeF9uYW1lIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwdHJfcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBCYWRPcCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgYl9tb2RlIDEKLSNkZWZpbmUgdl9tb2RlIDIKLSNkZWZpbmUgd19tb2RlIDMKLSNkZWZpbmUgZF9tb2RlIDQKLSNkZWZpbmUgeF9tb2RlIDUKLQotI2RlZmluZSBlc19yZWcgMTAwCi0jZGVmaW5lIGNzX3JlZyAxMDEKLSNkZWZpbmUgc3NfcmVnIDEwMgotI2RlZmluZSBkc19yZWcgMTAzCi0jZGVmaW5lIGZzX3JlZyAxMDQKLSNkZWZpbmUgZ3NfcmVnIDEwNQotCi0jZGVmaW5lIGVBWF9yZWcgMTA4Ci0jZGVmaW5lIGVDWF9yZWcgMTA5Ci0jZGVmaW5lIGVEWF9yZWcgMTEwCi0jZGVmaW5lIGVCWF9yZWcgMTExCi0jZGVmaW5lIGVTUF9yZWcgMTEyCi0jZGVmaW5lIGVCUF9yZWcgMTEzCi0jZGVmaW5lIGVTSV9yZWcgMTE0Ci0jZGVmaW5lIGVESV9yZWcgMTE1Ci0KLSNkZWZpbmUgYWxfcmVnIDExNgotI2RlZmluZSBjbF9yZWcgMTE3Ci0jZGVmaW5lIGRsX3JlZyAxMTgKLSNkZWZpbmUgYmxfcmVnIDExOQotI2RlZmluZSBhaF9yZWcgMTIwCi0jZGVmaW5lIGNoX3JlZyAxMjEKLSNkZWZpbmUgZGhfcmVnIDEyMgotI2RlZmluZSBiaF9yZWcgMTIzCi0KLSNkZWZpbmUgYXhfcmVnIDEyNAotI2RlZmluZSBjeF9yZWcgMTI1Ci0jZGVmaW5lIGR4X3JlZyAxMjYKLSNkZWZpbmUgYnhfcmVnIDEyNwotI2RlZmluZSBzcF9yZWcgMTI4Ci0jZGVmaW5lIGJwX3JlZyAxMjkKLSNkZWZpbmUgc2lfcmVnIDEzMAotI2RlZmluZSBkaV9yZWcgMTMxCi0KLSNkZWZpbmUgaW5kaXJfZHhfcmVnIDE1MAotCi0jZGVmaW5lIFVTRV9HUk9VUFMgMQotI2RlZmluZSBVU0VfUFJFRklYX1VTRVJfVEFCTEUgMgotCi0jZGVmaW5lIEdSUDFiIE5VTEwsIE5VTEwsIDAsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMVMgTlVMTCwgTlVMTCwgMSwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAxU3MgTlVMTCwgTlVMTCwgMiwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAyYiBOVUxMLCBOVUxMLCAzLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDJTIE5VTEwsIE5VTEwsIDQsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMmJfb25lIE5VTEwsIE5VTEwsIDUsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMlNfb25lIE5VTEwsIE5VTEwsIDYsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMmJfY2wgTlVMTCwgTlVMTCwgNywgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAyU19jbCBOVUxMLCBOVUxMLCA4LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDNiIE5VTEwsIE5VTEwsIDksIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQM1MgTlVMTCwgTlVMTCwgMTAsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQNCAgTlVMTCwgTlVMTCwgMTEsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQNSAgTlVMTCwgTlVMTCwgMTIsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQNiAgTlVMTCwgTlVMTCwgMTMsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQNyBOVUxMLCBOVUxMLCAxNCwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlA4IE5VTEwsIE5VTEwsIDE1LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDkgTlVMTCwgTlVMTCwgMTYsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMTAgTlVMTCwgTlVMTCwgMTcsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMTEgTlVMTCwgTlVMTCwgMTgsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMTIgTlVMTCwgTlVMTCwgMTksIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMTMgTlVMTCwgTlVMTCwgMjAsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMTQgTlVMTCwgTlVMTCwgMjEsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQQU1EIE5VTEwsIE5VTEwsIDIyLCBOVUxMLCBVU0VfR1JPVVBTCi0KLSNkZWZpbmUgUFJFR1JQMCBOVUxMLCBOVUxMLCAwLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQMSBOVUxMLCBOVUxMLCAxLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQMiBOVUxMLCBOVUxMLCAyLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQMyBOVUxMLCBOVUxMLCAzLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQNCBOVUxMLCBOVUxMLCA0LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQNSBOVUxMLCBOVUxMLCA1LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQNiBOVUxMLCBOVUxMLCA2LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQNyBOVUxMLCBOVUxMLCA3LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQOCBOVUxMLCBOVUxMLCA4LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQOSBOVUxMLCBOVUxMLCA5LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQMTAgTlVMTCwgTlVMTCwgMTAsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlAxMSBOVUxMLCBOVUxMLCAxMSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDEyIE5VTEwsIE5VTEwsIDEyLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQMTMgTlVMTCwgTlVMTCwgMTMsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlAxNCBOVUxMLCBOVUxMLCAxNCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0KLSNkZWZpbmUgRkxPQVRDT0RFIDUwCi0jZGVmaW5lIEZMT0FUIE5VTEwsIE5VTEwsIEZMT0FUQ09ERQotCi1zdHJ1Y3QgZGlzMzg2IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgb3BfcnRuIG9wMTsKLSAgaW50IGJ5dGVtb2RlMTsKLSAgb3BfcnRuIG9wMjsKLSAgaW50IGJ5dGVtb2RlMjsKLSAgb3BfcnRuIG9wMzsKLSAgaW50IGJ5dGVtb2RlMzsKLX07Ci0KLS8qIFVwcGVyIGNhc2UgbGV0dGVycyBpbiB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaGVyZSBhcmUgbWFjcm9zLgotICAgJ0EnID0+IHByaW50ICdiJyBpZiBubyByZWdpc3RlciBvcGVyYW5kcyBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdCJyA9PiBwcmludCAnYicgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnRScgPT4gcHJpbnQgJ2UnIGlmIDMyLWJpdCBmb3JtIG9mIGpjeHoKLSAgICdMJyA9PiBwcmludCAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnTicgPT4gcHJpbnQgJ24nIGlmIGluc3RydWN0aW9uIGhhcyBubyB3YWl0ICJwcmVmaXgiCi0gICAnUCcgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBpbnN0cnVjdGlvbiBoYXMgYW4gb3BlcmFuZCBzaXplIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ1EnID0+IHByaW50ICd3JyBvciAnbCcgaWYgbm8gcmVnaXN0ZXIgb3BlcmFuZHMgb3Igc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnUicgPT4gcHJpbnQgJ3cnIG9yICdsJyAoIndkIiBvciAiZHEiIGluIGludGVsIG1vZGUpCi0gICAnUycgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdXJyA9PiBwcmludCAnYicgb3IgJ3cnICgidyIgb3IgImRlIiBpbiBpbnRlbCBtb2RlKQotKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X2F0dFtdID0gewotICAvKiAwMCAqLwotICB7ICJhZGRCIiwJRWIsIEdiIH0sCi0gIHsgImFkZFMiLAlFdiwgR3YgfSwKLSAgeyAiYWRkQiIsCUdiLCBFYiB9LAotICB7ICJhZGRTIiwJR3YsIEV2IH0sCi0gIHsgImFkZEIiLAlBTCwgSWIgfSwKLSAgeyAiYWRkUyIsCWVBWCwgSXYgfSwKLSAgeyAicHVzaFAiLAllcyB9LAotICB7ICJwb3BQIiwJZXMgfSwKLSAgLyogMDggKi8KLSAgeyAib3JCIiwJRWIsIEdiIH0sCi0gIHsgIm9yUyIsCUV2LCBHdiB9LAotICB7ICJvckIiLAlHYiwgRWIgfSwKLSAgeyAib3JTIiwJR3YsIEV2IH0sCi0gIHsgIm9yQiIsCUFMLCBJYiB9LAotICB7ICJvclMiLAllQVgsIEl2IH0sCi0gIHsgInB1c2hQIiwJY3MgfSwKLSAgeyAiKGJhZCkiIH0sCS8qIDB4MGYgZXh0ZW5kZWQgb3Bjb2RlIGVzY2FwZSAqLwotICAvKiAxMCAqLwotICB7ICJhZGNCIiwJRWIsIEdiIH0sCi0gIHsgImFkY1MiLAlFdiwgR3YgfSwKLSAgeyAiYWRjQiIsCUdiLCBFYiB9LAotICB7ICJhZGNTIiwJR3YsIEV2IH0sCi0gIHsgImFkY0IiLAlBTCwgSWIgfSwKLSAgeyAiYWRjUyIsCWVBWCwgSXYgfSwKLSAgeyAicHVzaFAiLAlzcyB9LAotICB7ICJwb3BQIiwJc3MgfSwKLSAgLyogMTggKi8KLSAgeyAic2JiQiIsCUViLCBHYiB9LAotICB7ICJzYmJTIiwJRXYsIEd2IH0sCi0gIHsgInNiYkIiLAlHYiwgRWIgfSwKLSAgeyAic2JiUyIsCUd2LCBFdiB9LAotICB7ICJzYmJCIiwJQUwsIEliIH0sCi0gIHsgInNiYlMiLAllQVgsIEl2IH0sCi0gIHsgInB1c2hQIiwJZHMgfSwKLSAgeyAicG9wUCIsCWRzIH0sCi0gIC8qIDIwICovCi0gIHsgImFuZEIiLAlFYiwgR2IgfSwKLSAgeyAiYW5kUyIsCUV2LCBHdiB9LAotICB7ICJhbmRCIiwJR2IsIEViIH0sCi0gIHsgImFuZFMiLAlHdiwgRXYgfSwKLSAgeyAiYW5kQiIsCUFMLCBJYiB9LAotICB7ICJhbmRTIiwJZUFYLCBJdiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgRVMgcHJlZml4ICovCi0gIHsgImRhYSIgfSwKLSAgLyogMjggKi8KLSAgeyAic3ViQiIsCUViLCBHYiB9LAotICB7ICJzdWJTIiwJRXYsIEd2IH0sCi0gIHsgInN1YkIiLAlHYiwgRWIgfSwKLSAgeyAic3ViUyIsCUd2LCBFdiB9LAotICB7ICJzdWJCIiwJQUwsIEliIH0sCi0gIHsgInN1YlMiLAllQVgsIEl2IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBDUyBwcmVmaXggKi8KLSAgeyAiZGFzIiB9LAotICAvKiAzMCAqLwotICB7ICJ4b3JCIiwJRWIsIEdiIH0sCi0gIHsgInhvclMiLAlFdiwgR3YgfSwKLSAgeyAieG9yQiIsCUdiLCBFYiB9LAotICB7ICJ4b3JTIiwJR3YsIEV2IH0sCi0gIHsgInhvckIiLAlBTCwgSWIgfSwKLSAgeyAieG9yUyIsCWVBWCwgSXYgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIFNTIHByZWZpeCAqLwotICB7ICJhYWEiIH0sCi0gIC8qIDM4ICovCi0gIHsgImNtcEIiLAlFYiwgR2IgfSwKLSAgeyAiY21wUyIsCUV2LCBHdiB9LAotICB7ICJjbXBCIiwJR2IsIEViIH0sCi0gIHsgImNtcFMiLAlHdiwgRXYgfSwKLSAgeyAiY21wQiIsCUFMLCBJYiB9LAotICB7ICJjbXBTIiwJZUFYLCBJdiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgRFMgcHJlZml4ICovCi0gIHsgImFhcyIgfSwKLSAgLyogNDAgKi8KLSAgeyAiaW5jUyIsCWVBWCB9LAotICB7ICJpbmNTIiwJZUNYIH0sCi0gIHsgImluY1MiLAllRFggfSwKLSAgeyAiaW5jUyIsCWVCWCB9LAotICB7ICJpbmNTIiwJZVNQIH0sCi0gIHsgImluY1MiLAllQlAgfSwKLSAgeyAiaW5jUyIsCWVTSSB9LAotICB7ICJpbmNTIiwJZURJIH0sCi0gIC8qIDQ4ICovCi0gIHsgImRlY1MiLAllQVggfSwKLSAgeyAiZGVjUyIsCWVDWCB9LAotICB7ICJkZWNTIiwJZURYIH0sCi0gIHsgImRlY1MiLAllQlggfSwKLSAgeyAiZGVjUyIsCWVTUCB9LAotICB7ICJkZWNTIiwJZUJQIH0sCi0gIHsgImRlY1MiLAllU0kgfSwKLSAgeyAiZGVjUyIsCWVESSB9LAotICAvKiA1MCAqLwotICB7ICJwdXNoUyIsCWVBWCB9LAotICB7ICJwdXNoUyIsCWVDWCB9LAotICB7ICJwdXNoUyIsCWVEWCB9LAotICB7ICJwdXNoUyIsCWVCWCB9LAotICB7ICJwdXNoUyIsCWVTUCB9LAotICB7ICJwdXNoUyIsCWVCUCB9LAotICB7ICJwdXNoUyIsCWVTSSB9LAotICB7ICJwdXNoUyIsCWVESSB9LAotICAvKiA1OCAqLwotICB7ICJwb3BTIiwJZUFYIH0sCi0gIHsgInBvcFMiLAllQ1ggfSwKLSAgeyAicG9wUyIsCWVEWCB9LAotICB7ICJwb3BTIiwJZUJYIH0sCi0gIHsgInBvcFMiLAllU1AgfSwKLSAgeyAicG9wUyIsCWVCUCB9LAotICB7ICJwb3BTIiwJZVNJIH0sCi0gIHsgInBvcFMiLAllREkgfSwKLSAgLyogNjAgKi8KLSAgeyAicHVzaGFQIiB9LAotICB7ICJwb3BhUCIgfSwKLSAgeyAiYm91bmRTIiwJR3YsIE1hIH0sCi0gIHsgImFycGwiLAlFdywgR3cgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogc2VnIGZzICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIHNlZyBncyAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiBvcCBzaXplIHByZWZpeCAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiBhZHIgc2l6ZSBwcmVmaXggKi8KLSAgLyogNjggKi8KLSAgeyAicHVzaFAiLAlJdiB9LAkJLyogMzg2IGJvb2sgd3JvbmcgKi8KLSAgeyAiaW11bFMiLAlHdiwgRXYsIEl2IH0sCi0gIHsgInB1c2hQIiwJc0liIH0sCQkvKiBwdXNoIG9mIGJ5dGUgcmVhbGx5IHB1c2hlcyAyIG9yIDQgYnl0ZXMgKi8KLSAgeyAiaW11bFMiLAlHdiwgRXYsIHNJYiB9LAotICB7ICJpbnNiIiwJWWIsIGluZGlyRFggfSwKLSAgeyAiaW5zUiIsCVl2LCBpbmRpckRYIH0sCi0gIHsgIm91dHNiIiwJaW5kaXJEWCwgWGIgfSwKLSAgeyAib3V0c1IiLAlpbmRpckRYLCBYdiB9LAotICAvKiA3MCAqLwotICB7ICJqbyIsCUpiIH0sCi0gIHsgImpubyIsCUpiIH0sCi0gIHsgImpiIiwJSmIgfSwKLSAgeyAiamFlIiwJSmIgfSwKLSAgeyAiamUiLAlKYiB9LAotICB7ICJqbmUiLAlKYiB9LAotICB7ICJqYmUiLAlKYiB9LAotICB7ICJqYSIsCUpiIH0sCi0gIC8qIDc4ICovCi0gIHsgImpzIiwJSmIgfSwKLSAgeyAiam5zIiwJSmIgfSwKLSAgeyAianAiLAlKYiB9LAotICB7ICJqbnAiLAlKYiB9LAotICB7ICJqbCIsCUpiIH0sCi0gIHsgImpnZSIsCUpiIH0sCi0gIHsgImpsZSIsCUpiIH0sCi0gIHsgImpnIiwJSmIgfSwKLSAgLyogODAgKi8KLSAgeyBHUlAxYiB9LAotICB7IEdSUDFTIH0sCi0gIHsgIihiYWQpIiB9LAotICB7IEdSUDFTcyB9LAotICB7ICJ0ZXN0QiIsCUViLCBHYiB9LAotICB7ICJ0ZXN0UyIsCUV2LCBHdiB9LAotICB7ICJ4Y2hnQiIsCUViLCBHYiB9LAotICB7ICJ4Y2hnUyIsCUV2LCBHdiB9LAotICAvKiA4OCAqLwotICB7ICJtb3ZCIiwJRWIsIEdiIH0sCi0gIHsgIm1vdlMiLAlFdiwgR3YgfSwKLSAgeyAibW92QiIsCUdiLCBFYiB9LAotICB7ICJtb3ZTIiwJR3YsIEV2IH0sCi0gIHsgIm1vdlEiLAlFdiwgU3cgfSwKLSAgeyAibGVhUyIsCUd2LCBNIH0sCi0gIHsgIm1vdlEiLAlTdywgRXYgfSwKLSAgeyAicG9wUSIsCUV2IH0sCi0gIC8qIDkwICovCi0gIHsgIm5vcCIgfSwKLSAgeyAieGNoZ1MiLAllQ1gsIGVBWCB9LAotICB7ICJ4Y2hnUyIsCWVEWCwgZUFYIH0sCi0gIHsgInhjaGdTIiwJZUJYLCBlQVggfSwKLSAgeyAieGNoZ1MiLAllU1AsIGVBWCB9LAotICB7ICJ4Y2hnUyIsCWVCUCwgZUFYIH0sCi0gIHsgInhjaGdTIiwJZVNJLCBlQVggfSwKLSAgeyAieGNoZ1MiLAllREksIGVBWCB9LAotICAvKiA5OCAqLwotICB7ICJjV3RSIiB9LAotICB7ICJjUnRkIiB9LAotICB7ICJsY2FsbFAiLAlBcCB9LAotICB7ICIoYmFkKSIgfSwJCS8qIGZ3YWl0ICovCi0gIHsgInB1c2hmUCIgfSwKLSAgeyAicG9wZlAiIH0sCi0gIHsgInNhaGYiIH0sCi0gIHsgImxhaGYiIH0sCi0gIC8qIGEwICovCi0gIHsgIm1vdkIiLAlBTCwgT2IgfSwKLSAgeyAibW92UyIsCWVBWCwgT3YgfSwKLSAgeyAibW92QiIsCU9iLCBBTCB9LAotICB7ICJtb3ZTIiwJT3YsIGVBWCB9LAotICB7ICJtb3ZzYiIsCVliLCBYYiB9LAotICB7ICJtb3ZzUiIsCVl2LCBYdiB9LAotICB7ICJjbXBzYiIsCVhiLCBZYiB9LAotICB7ICJjbXBzUiIsCVh2LCBZdiB9LAotICAvKiBhOCAqLwotICB7ICJ0ZXN0QiIsCUFMLCBJYiB9LAotICB7ICJ0ZXN0UyIsCWVBWCwgSXYgfSwKLSAgeyAic3Rvc0IiLAlZYiwgQUwgfSwKLSAgeyAic3Rvc1MiLAlZdiwgZUFYIH0sCi0gIHsgImxvZHNCIiwJQUwsIFhiIH0sCi0gIHsgImxvZHNTIiwJZUFYLCBYdiB9LAotICB7ICJzY2FzQiIsCUFMLCBZYiB9LAotICB7ICJzY2FzUyIsCWVBWCwgWXYgfSwKLSAgLyogYjAgKi8KLSAgeyAibW92QiIsCUFMLCBJYiB9LAotICB7ICJtb3ZCIiwJQ0wsIEliIH0sCi0gIHsgIm1vdkIiLAlETCwgSWIgfSwKLSAgeyAibW92QiIsCUJMLCBJYiB9LAotICB7ICJtb3ZCIiwJQUgsIEliIH0sCi0gIHsgIm1vdkIiLAlDSCwgSWIgfSwKLSAgeyAibW92QiIsCURILCBJYiB9LAotICB7ICJtb3ZCIiwJQkgsIEliIH0sCi0gIC8qIGI4ICovCi0gIHsgIm1vdlMiLAllQVgsIEl2IH0sCi0gIHsgIm1vdlMiLAllQ1gsIEl2IH0sCi0gIHsgIm1vdlMiLAllRFgsIEl2IH0sCi0gIHsgIm1vdlMiLAllQlgsIEl2IH0sCi0gIHsgIm1vdlMiLAllU1AsIEl2IH0sCi0gIHsgIm1vdlMiLAllQlAsIEl2IH0sCi0gIHsgIm1vdlMiLAllU0ksIEl2IH0sCi0gIHsgIm1vdlMiLAllREksIEl2IH0sCi0gIC8qIGMwICovCi0gIHsgR1JQMmIgfSwKLSAgeyBHUlAyUyB9LAotICB7ICJyZXRQIiwJSXcgfSwKLSAgeyAicmV0UCIgfSwKLSAgeyAibGVzUyIsCUd2LCBNcCB9LAotICB7ICJsZHNTIiwJR3YsIE1wIH0sCi0gIHsgIm1vdkEiLAlFYiwgSWIgfSwKLSAgeyAibW92USIsCUV2LCBJdiB9LAotICAvKiBjOCAqLwotICB7ICJlbnRlclAiLAlJdywgSWIgfSwKLSAgeyAibGVhdmVQIiB9LAotICB7ICJscmV0UCIsCUl3IH0sCi0gIHsgImxyZXRQIiB9LAotICB7ICJpbnQzIiB9LAotICB7ICJpbnQiLAlJYiB9LAotICB7ICJpbnRvIiB9LAotICB7ICJpcmV0UCIgfSwKLSAgLyogZDAgKi8KLSAgeyBHUlAyYl9vbmUgfSwKLSAgeyBHUlAyU19vbmUgfSwKLSAgeyBHUlAyYl9jbCB9LAotICB7IEdSUDJTX2NsIH0sCi0gIHsgImFhbSIsCXNJYiB9LAotICB7ICJhYWQiLAlzSWIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInhsYXQiLAlEU0JYIH0sCi0gIC8qIGQ4ICovCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICAvKiBlMCAqLwotICB7ICJsb29wbmUiLAlKYiB9LAotICB7ICJsb29wZSIsCUpiIH0sCi0gIHsgImxvb3AiLAlKYiB9LAotICB7ICJqRWN4eiIsCUpiIH0sCi0gIHsgImluQiIsCUFMLCBJYiB9LAotICB7ICJpblMiLAllQVgsIEliIH0sCi0gIHsgIm91dEIiLAlJYiwgQUwgfSwKLSAgeyAib3V0UyIsCUliLCBlQVggfSwKLSAgLyogZTggKi8KLSAgeyAiY2FsbFAiLAlKdiB9LAotICB7ICJqbXBQIiwJSnYgfSwKLSAgeyAibGptcFAiLAlBcCB9LAotICB7ICJqbXAiLAlKYiB9LAotICB7ICJpbkIiLAlBTCwgaW5kaXJEWCB9LAotICB7ICJpblMiLAllQVgsIGluZGlyRFggfSwKLSAgeyAib3V0QiIsCWluZGlyRFgsIEFMIH0sCi0gIHsgIm91dFMiLAlpbmRpckRYLCBlQVggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogbG9jayBwcmVmaXggKi8KLSAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIHJlcG5lICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIHJlcHogKi8KLSAgeyAiaGx0IiB9LAotICB7ICJjbWMiIH0sCi0gIHsgR1JQM2IgfSwKLSAgeyBHUlAzUyB9LAotICAvKiBmOCAqLwotICB7ICJjbGMiIH0sCi0gIHsgInN0YyIgfSwKLSAgeyAiY2xpIiB9LAotICB7ICJzdGkiIH0sCi0gIHsgImNsZCIgfSwKLSAgeyAic3RkIiB9LAotICB7IEdSUDQgfSwKLSAgeyBHUlA1IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBkaXMzODZfaW50ZWxbXSA9IHsKLSAgLyogMDAgKi8KLSAgeyAiYWRkIiwJRWIsIEdiIH0sCi0gIHsgImFkZCIsCUV2LCBHdiB9LAotICB7ICJhZGQiLAlHYiwgRWIgfSwKLSAgeyAiYWRkIiwJR3YsIEV2IH0sCi0gIHsgImFkZCIsCUFMLCBJYiB9LAotICB7ICJhZGQiLAllQVgsIEl2IH0sCi0gIHsgInB1c2giLAllcyB9LAotICB7ICJwb3AiLAllcyB9LAotICAvKiAwOCAqLwotICB7ICJvciIsCUViLCBHYiB9LAotICB7ICJvciIsCUV2LCBHdiB9LAotICB7ICJvciIsCUdiLCBFYiB9LAotICB7ICJvciIsCUd2LCBFdiB9LAotICB7ICJvciIsCUFMLCBJYiB9LAotICB7ICJvciIsCWVBWCwgSXYgfSwKLSAgeyAicHVzaCIsCWNzIH0sCi0gIHsgIihiYWQpIiB9LAkvKiAweDBmIGV4dGVuZGVkIG9wY29kZSBlc2NhcGUgKi8KLSAgLyogMTAgKi8KLSAgeyAiYWRjIiwJRWIsIEdiIH0sCi0gIHsgImFkYyIsCUV2LCBHdiB9LAotICB7ICJhZGMiLAlHYiwgRWIgfSwKLSAgeyAiYWRjIiwJR3YsIEV2IH0sCi0gIHsgImFkYyIsCUFMLCBJYiB9LAotICB7ICJhZGMiLAllQVgsIEl2IH0sCi0gIHsgInB1c2giLAlzcyB9LAotICB7ICJwb3AiLAlzcyB9LAotICAvKiAxOCAqLwotICB7ICJzYmIiLAlFYiwgR2IgfSwKLSAgeyAic2JiIiwJRXYsIEd2IH0sCi0gIHsgInNiYiIsCUdiLCBFYiB9LAotICB7ICJzYmIiLAlHdiwgRXYgfSwKLSAgeyAic2JiIiwJQUwsIEliIH0sCi0gIHsgInNiYiIsCWVBWCwgSXYgfSwKLSAgeyAicHVzaCIsCWRzIH0sCi0gIHsgInBvcCIsCWRzIH0sCi0gIC8qIDIwICovCi0gIHsgImFuZCIsCUViLCBHYiB9LAotICB7ICJhbmQiLAlFdiwgR3YgfSwKLSAgeyAiYW5kIiwJR2IsIEViIH0sCi0gIHsgImFuZCIsCUd2LCBFdiB9LAotICB7ICJhbmQiLAlBTCwgSWIgfSwKLSAgeyAiYW5kIiwJZUFYLCBJdiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgRVMgcHJlZml4ICovCi0gIHsgImRhYSIgfSwKLSAgLyogMjggKi8KLSAgeyAic3ViIiwJRWIsIEdiIH0sCi0gIHsgInN1YiIsCUV2LCBHdiB9LAotICB7ICJzdWIiLAlHYiwgRWIgfSwKLSAgeyAic3ViIiwJR3YsIEV2IH0sCi0gIHsgInN1YiIsCUFMLCBJYiB9LAotICB7ICJzdWIiLAllQVgsIEl2IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBDUyBwcmVmaXggKi8KLSAgeyAiZGFzIiB9LAotICAvKiAzMCAqLwotICB7ICJ4b3IiLAlFYiwgR2IgfSwKLSAgeyAieG9yIiwJRXYsIEd2IH0sCi0gIHsgInhvciIsCUdiLCBFYiB9LAotICB7ICJ4b3IiLAlHdiwgRXYgfSwKLSAgeyAieG9yIiwJQUwsIEliIH0sCi0gIHsgInhvciIsCWVBWCwgSXYgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIFNTIHByZWZpeCAqLwotICB7ICJhYWEiIH0sCi0gIC8qIDM4ICovCi0gIHsgImNtcCIsCUViLCBHYiB9LAotICB7ICJjbXAiLAlFdiwgR3YgfSwKLSAgeyAiY21wIiwJR2IsIEViIH0sCi0gIHsgImNtcCIsCUd2LCBFdiB9LAotICB7ICJjbXAiLAlBTCwgSWIgfSwKLSAgeyAiY21wIiwJZUFYLCBJdiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgRFMgcHJlZml4ICovCi0gIHsgImFhcyIgfSwKLSAgLyogNDAgKi8KLSAgeyAiaW5jIiwJZUFYIH0sCi0gIHsgImluYyIsCWVDWCB9LAotICB7ICJpbmMiLAllRFggfSwKLSAgeyAiaW5jIiwJZUJYIH0sCi0gIHsgImluYyIsCWVTUCB9LAotICB7ICJpbmMiLAllQlAgfSwKLSAgeyAiaW5jIiwJZVNJIH0sCi0gIHsgImluYyIsCWVESSB9LAotICAvKiA0OCAqLwotICB7ICJkZWMiLAllQVggfSwKLSAgeyAiZGVjIiwJZUNYIH0sCi0gIHsgImRlYyIsCWVEWCB9LAotICB7ICJkZWMiLAllQlggfSwKLSAgeyAiZGVjIiwJZVNQIH0sCi0gIHsgImRlYyIsCWVCUCB9LAotICB7ICJkZWMiLAllU0kgfSwKLSAgeyAiZGVjIiwJZURJIH0sCi0gIC8qIDUwICovCi0gIHsgInB1c2giLAllQVggfSwKLSAgeyAicHVzaCIsCWVDWCB9LAotICB7ICJwdXNoIiwJZURYIH0sCi0gIHsgInB1c2giLAllQlggfSwKLSAgeyAicHVzaCIsCWVTUCB9LAotICB7ICJwdXNoIiwJZUJQIH0sCi0gIHsgInB1c2giLAllU0kgfSwKLSAgeyAicHVzaCIsCWVESSB9LAotICAvKiA1OCAqLwotICB7ICJwb3AiLAllQVggfSwKLSAgeyAicG9wIiwJZUNYIH0sCi0gIHsgInBvcCIsCWVEWCB9LAotICB7ICJwb3AiLAllQlggfSwKLSAgeyAicG9wIiwJZVNQIH0sCi0gIHsgInBvcCIsCWVCUCB9LAotICB7ICJwb3AiLAllU0kgfSwKLSAgeyAicG9wIiwJZURJIH0sCi0gIC8qIDYwICovCi0gIHsgInB1c2hhIiB9LAotICB7ICJwb3BhIiB9LAotICB7ICJib3VuZCIsCUd2LCBNYSB9LAotICB7ICJhcnBsIiwJRXcsIEd3IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIHNlZyBmcyAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiBzZWcgZ3MgKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogb3Agc2l6ZSBwcmVmaXggKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogYWRyIHNpemUgcHJlZml4ICovCi0gIC8qIDY4ICovCi0gIHsgInB1c2giLAlJdiB9LAkJLyogMzg2IGJvb2sgd3JvbmcgKi8KLSAgeyAiaW11bCIsCUd2LCBFdiwgSXYgfSwKLSAgeyAicHVzaCIsCXNJYiB9LAkJLyogcHVzaCBvZiBieXRlIHJlYWxseSBwdXNoZXMgMiBvciA0IGJ5dGVzICovCi0gIHsgImltdWwiLAlHdiwgRXYsIHNJYiB9LAotICB7ICJpbnMiLAlZYiwgaW5kaXJEWCB9LAotICB7ICJpbnMiLAlZdiwgaW5kaXJEWCB9LAotICB7ICJvdXRzIiwJaW5kaXJEWCwgWGIgfSwKLSAgeyAib3V0cyIsCWluZGlyRFgsIFh2IH0sCi0gIC8qIDcwICovCi0gIHsgImpvIiwJSmIgfSwKLSAgeyAiam5vIiwJSmIgfSwKLSAgeyAiamIiLAlKYiB9LAotICB7ICJqYWUiLAlKYiB9LAotICB7ICJqZSIsCUpiIH0sCi0gIHsgImpuZSIsCUpiIH0sCi0gIHsgImpiZSIsCUpiIH0sCi0gIHsgImphIiwJSmIgfSwKLSAgLyogNzggKi8KLSAgeyAianMiLAlKYiB9LAotICB7ICJqbnMiLAlKYiB9LAotICB7ICJqcCIsCUpiIH0sCi0gIHsgImpucCIsCUpiIH0sCi0gIHsgImpsIiwJSmIgfSwKLSAgeyAiamdlIiwJSmIgfSwKLSAgeyAiamxlIiwJSmIgfSwKLSAgeyAiamciLAlKYiB9LAotICAvKiA4MCAqLwotICB7IEdSUDFiIH0sCi0gIHsgR1JQMVMgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgR1JQMVNzIH0sCi0gIHsgInRlc3QiLAlFYiwgR2IgfSwKLSAgeyAidGVzdCIsCUV2LCBHdiB9LAotICB7ICJ4Y2hnIiwJRWIsIEdiIH0sCi0gIHsgInhjaGciLAlFdiwgR3YgfSwKLSAgLyogODggKi8KLSAgeyAibW92IiwJRWIsIEdiIH0sCi0gIHsgIm1vdiIsCUV2LCBHdiB9LAotICB7ICJtb3YiLAlHYiwgRWIgfSwKLSAgeyAibW92IiwJR3YsIEV2IH0sCi0gIHsgIm1vdiIsCUV2LCBTdyB9LAotICB7ICJsZWEiLAlHdiwgTSB9LAotICB7ICJtb3YiLAlTdywgRXYgfSwKLSAgeyAicG9wIiwJRXYgfSwKLSAgLyogOTAgKi8KLSAgeyAibm9wIiB9LAotICB7ICJ4Y2hnIiwJZUNYLCBlQVggfSwKLSAgeyAieGNoZyIsCWVEWCwgZUFYIH0sCi0gIHsgInhjaGciLAllQlgsIGVBWCB9LAotICB7ICJ4Y2hnIiwJZVNQLCBlQVggfSwKLSAgeyAieGNoZyIsCWVCUCwgZUFYIH0sCi0gIHsgInhjaGciLAllU0ksIGVBWCB9LAotICB7ICJ4Y2hnIiwJZURJLCBlQVggfSwKLSAgLyogOTggKi8KLSAgeyAiY1ciIH0sCQkvKiBjd2RlIGFuZCBjYncgKi8KLSAgeyAiY1IiIH0sCQkvKiBjZHEgYW5kIGN3ZCAqLwotICB7ICJsY2FsbCIsCUFwIH0sCi0gIHsgIihiYWQpIiB9LAkJLyogZndhaXQgKi8KLSAgeyAicHVzaGYiIH0sCi0gIHsgInBvcGYiIH0sCi0gIHsgInNhaGYiIH0sCi0gIHsgImxhaGYiIH0sCi0gIC8qIGEwICovCi0gIHsgIm1vdiIsCUFMLCBPYiB9LAotICB7ICJtb3YiLAllQVgsIE92IH0sCi0gIHsgIm1vdiIsCU9iLCBBTCB9LAotICB7ICJtb3YiLAlPdiwgZUFYIH0sCi0gIHsgIm1vdnMiLAlZYiwgWGIgfSwKLSAgeyAibW92cyIsCVl2LCBYdiB9LAotICB7ICJjbXBzIiwJWGIsIFliIH0sCi0gIHsgImNtcHMiLAlYdiwgWXYgfSwKLSAgLyogYTggKi8KLSAgeyAidGVzdCIsCUFMLCBJYiB9LAotICB7ICJ0ZXN0IiwJZUFYLCBJdiB9LAotICB7ICJzdG9zIiwJWWIsIEFMIH0sCi0gIHsgInN0b3MiLAlZdiwgZUFYIH0sCi0gIHsgImxvZHMiLAlBTCwgWGIgfSwKLSAgeyAibG9kcyIsCWVBWCwgWHYgfSwKLSAgeyAic2NhcyIsCUFMLCBZYiB9LAotICB7ICJzY2FzIiwJZUFYLCBZdiB9LAotICAvKiBiMCAqLwotICB7ICJtb3YiLAlBTCwgSWIgfSwKLSAgeyAibW92IiwJQ0wsIEliIH0sCi0gIHsgIm1vdiIsCURMLCBJYiB9LAotICB7ICJtb3YiLAlCTCwgSWIgfSwKLSAgeyAibW92IiwJQUgsIEliIH0sCi0gIHsgIm1vdiIsCUNILCBJYiB9LAotICB7ICJtb3YiLAlESCwgSWIgfSwKLSAgeyAibW92IiwJQkgsIEliIH0sCi0gIC8qIGI4ICovCi0gIHsgIm1vdiIsCWVBWCwgSXYgfSwKLSAgeyAibW92IiwJZUNYLCBJdiB9LAotICB7ICJtb3YiLAllRFgsIEl2IH0sCi0gIHsgIm1vdiIsCWVCWCwgSXYgfSwKLSAgeyAibW92IiwJZVNQLCBJdiB9LAotICB7ICJtb3YiLAllQlAsIEl2IH0sCi0gIHsgIm1vdiIsCWVTSSwgSXYgfSwKLSAgeyAibW92IiwJZURJLCBJdiB9LAotICAvKiBjMCAqLwotICB7IEdSUDJiIH0sCi0gIHsgR1JQMlMgfSwKLSAgeyAicmV0IiwJSXcgfSwKLSAgeyAicmV0IiB9LAotICB7ICJsZXMiLAlHdiwgTXAgfSwKLSAgeyAibGRzIiwJR3YsIE1wIH0sCi0gIHsgIm1vdiIsCUViLCBJYiB9LAotICB7ICJtb3YiLAlFdiwgSXYgfSwKLSAgLyogYzggKi8KLSAgeyAiZW50ZXIiLAlJdywgSWIgfSwKLSAgeyAibGVhdmUiIH0sCi0gIHsgImxyZXQiLAlJdyB9LAotICB7ICJscmV0IiB9LAotICB7ICJpbnQzIiB9LAotICB7ICJpbnQiLAlJYiB9LAotICB7ICJpbnRvIiB9LAotICB7ICJpcmV0IiB9LAotICAvKiBkMCAqLwotICB7IEdSUDJiX29uZSB9LAotICB7IEdSUDJTX29uZSB9LAotICB7IEdSUDJiX2NsIH0sCi0gIHsgR1JQMlNfY2wgfSwKLSAgeyAiYWFtIiwJc0liIH0sCi0gIHsgImFhZCIsCXNJYiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAieGxhdCIsCURTQlggfSwKLSAgLyogZDggKi8KLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIC8qIGUwICovCi0gIHsgImxvb3BuZSIsCUpiIH0sCi0gIHsgImxvb3BlIiwJSmIgfSwKLSAgeyAibG9vcCIsCUpiIH0sCi0gIHsgImpFY3h6IiwJSmIgfSwKLSAgeyAiaW4iLAlBTCwgSWIgfSwKLSAgeyAiaW4iLAllQVgsIEliIH0sCi0gIHsgIm91dCIsCUliLCBBTCB9LAotICB7ICJvdXQiLAlJYiwgZUFYIH0sCi0gIC8qIGU4ICovCi0gIHsgImNhbGwiLAlKdiB9LAotICB7ICJqbXAiLAlKdiB9LAotICB7ICJsam1wIiwJQXAgfSwKLSAgeyAiam1wIiwJSmIgfSwKLSAgeyAiaW4iLAlBTCwgaW5kaXJEWCB9LAotICB7ICJpbiIsCWVBWCwgaW5kaXJEWCB9LAotICB7ICJvdXQiLAlpbmRpckRYLCBBTCB9LAotICB7ICJvdXQiLAlpbmRpckRYLCBlQVggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogbG9jayBwcmVmaXggKi8KLSAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIHJlcG5lICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIHJlcHogKi8KLSAgeyAiaGx0IiB9LAotICB7ICJjbWMiIH0sCi0gIHsgR1JQM2IgfSwKLSAgeyBHUlAzUyB9LAotICAvKiBmOCAqLwotICB7ICJjbGMiIH0sCi0gIHsgInN0YyIgfSwKLSAgeyAiY2xpIiB9LAotICB7ICJzdGkiIH0sCi0gIHsgImNsZCIgfSwKLSAgeyAic3RkIiB9LAotICB7IEdSUDQgfSwKLSAgeyBHUlA1IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBkaXMzODZfdHdvYnl0ZV9hdHRbXSA9IHsKLSAgLyogMDAgKi8KLSAgeyBHUlA2IH0sCi0gIHsgR1JQNyB9LAotICB7ICJsYXJTIiwgR3YsIEV3IH0sCi0gIHsgImxzbFMiLCBHdiwgRXcgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJjbHRzIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgLyogMDggKi8KLSAgeyAiaW52ZCIgfSwKLSAgeyAid2JpbnZkIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAidWQyYSIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgR1JQQU1EIH0sCi0gIHsgImZlbW1zIiB9LAotICB7ICIiLCBNWCwgRU0sIE9QU1VGIH0sIC8qIFNlZSBPUF8zRE5vd1N1ZmZpeCAqLwotICAvKiAxMCAqLwotICB7IFBSRUdSUDggfSwKLSAgeyBQUkVHUlA5IH0sCi0gIHsgIm1vdmxwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2gnIH0sICAvKiByZWFsbHkgb25seSAyIG9wZXJhbmRzICovCi0gIHsgIm1vdmxwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2gnIH0sCi0gIHsgInVucGNrbHBzIiwgWE0sIEVYIH0sCi0gIHsgInVucGNraHBzIiwgWE0sIEVYIH0sCi0gIHsgIm1vdmhwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIHsgIm1vdmhwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIC8qIDE4ICovCi0gIHsgR1JQMTQgfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgLyogMjAgKi8KLSAgLyogdGhlc2UgYXJlIGFsbCBiYWNrd2FyZCBpbiBhcHBlbmRpeCBBIG9mIHRoZSBpbnRlbCBib29rICovCi0gIHsgIm1vdkwiLCBSZCwgQ2QgfSwKLSAgeyAibW92TCIsIFJkLCBEZCB9LAotICB7ICJtb3ZMIiwgQ2QsIFJkIH0sCi0gIHsgIm1vdkwiLCBEZCwgUmQgfSwKLSAgeyAibW92TCIsIFJkLCBUZCB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAibW92TCIsIFRkLCBSZCB9LAotICB7ICIoYmFkKSIgfSwKLSAgLyogMjggKi8KLSAgeyAibW92YXBzIiwgWE0sIEVYIH0sCi0gIHsgIm1vdmFwcyIsIEVYLCBYTSB9LAotICB7IFBSRUdSUDIgfSwKLSAgeyAibW92bnRwcyIsIEV2LCBYTSB9LAotICB7IFBSRUdSUDQgfSwKLSAgeyBQUkVHUlAzIH0sCi0gIHsgInVjb21pc3MiLCBYTSwgRVggfSwKLSAgeyAiY29taXNzIiwgWE0sIEVYIH0sCi0gIC8qIDMwICovCi0gIHsgIndybXNyIiB9LCAgeyAicmR0c2MiIH0sICB7ICJyZG1zciIgfSwgIHsgInJkcG1jIiB9LAotICB7ICJzeXNlbnRlciIgfSwgIHsgInN5c2V4aXQiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICAvKiAzOCAqLwotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIC8qIDQwICovCi0gIHsgImNtb3ZvIiwgR3YsRXYgfSwgeyAiY21vdm5vIiwgR3YsRXYgfSwgeyAiY21vdmIiLCBHdixFdiB9LCB7ICJjbW92YWUiLCBHdixFdiB9LAotICB7ICJjbW92ZSIsIEd2LEV2IH0sIHsgImNtb3ZuZSIsIEd2LEV2IH0sIHsgImNtb3ZiZSIsIEd2LEV2IH0sIHsgImNtb3ZhIiwgR3YsRXYgfSwKLSAgLyogNDggKi8KLSAgeyAiY21vdnMiLCBHdixFdiB9LCB7ICJjbW92bnMiLCBHdixFdiB9LCB7ICJjbW92cCIsIEd2LEV2IH0sIHsgImNtb3ZucCIsIEd2LEV2IH0sCi0gIHsgImNtb3ZsIiwgR3YsRXYgfSwgeyAiY21vdmdlIiwgR3YsRXYgfSwgeyAiY21vdmxlIiwgR3YsRXYgfSwgeyAiY21vdmciLCBHdixFdiB9LAotICAvKiA1MCAqLwotICB7ICJtb3Ztc2twcyIsIEd2LCBFWCB9LAotICB7IFBSRUdSUDEzIH0sCi0gIHsgUFJFR1JQMTIgfSwKLSAgeyBQUkVHUlAxMSB9LAotICB7ICJhbmRwcyIsIFhNLCBFWCB9LAotICB7ICJhbmRucHMiLCBYTSwgRVggfSwKLSAgeyAib3JwcyIsIFhNLCBFWCB9LAotICB7ICJ4b3JwcyIsIFhNLCBFWCB9LAotICAvKiA1OCAqLwotICB7IFBSRUdSUDAgfSwKLSAgeyBQUkVHUlAxMCB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgUFJFR1JQMTQgfSwKLSAgeyBQUkVHUlA3IH0sCi0gIHsgUFJFR1JQNSB9LAotICB7IFBSRUdSUDYgfSwKLSAgLyogNjAgKi8KLSAgeyAicHVucGNrbGJ3IiwgTVgsIEVNIH0sCi0gIHsgInB1bnBja2x3ZCIsIE1YLCBFTSB9LAotICB7ICJwdW5wY2tsZHEiLCBNWCwgRU0gfSwKLSAgeyAicGFja3Nzd2IiLCBNWCwgRU0gfSwKLSAgeyAicGNtcGd0YiIsIE1YLCBFTSB9LAotICB7ICJwY21wZ3R3IiwgTVgsIEVNIH0sCi0gIHsgInBjbXBndGQiLCBNWCwgRU0gfSwKLSAgeyAicGFja3Vzd2IiLCBNWCwgRU0gfSwKLSAgLyogNjggKi8KLSAgeyAicHVucGNraGJ3IiwgTVgsIEVNIH0sCi0gIHsgInB1bnBja2h3ZCIsIE1YLCBFTSB9LAotICB7ICJwdW5wY2toZHEiLCBNWCwgRU0gfSwKLSAgeyAicGFja3NzZHciLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAibW92ZCIsIE1YLCBFZCB9LAotICB7ICJtb3ZxIiwgTVgsIEVNIH0sCi0gIC8qIDcwICovCi0gIHsgInBzaHVmdyIsIE1YLCBFTSwgSWIgfSwKLSAgeyBHUlAxMCB9LAotICB7IEdSUDExIH0sCi0gIHsgR1JQMTIgfSwKLSAgeyAicGNtcGVxYiIsIE1YLCBFTSB9LAotICB7ICJwY21wZXF3IiwgTVgsIEVNIH0sCi0gIHsgInBjbXBlcWQiLCBNWCwgRU0gfSwKLSAgeyAiZW1tcyIgfSwKLSAgLyogNzggKi8KLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIm1vdmQiLCBFZCwgTVggfSwKLSAgeyAibW92cSIsIEVNLCBNWCB9LAotICAvKiA4MCAqLwotICB7ICJqbyIsIEp2IH0sCi0gIHsgImpubyIsIEp2IH0sCi0gIHsgImpiIiwgSnYgfSwKLSAgeyAiamFlIiwgSnYgfSwKLSAgeyAiamUiLCBKdiB9LAotICB7ICJqbmUiLCBKdiB9LAotICB7ICJqYmUiLCBKdiB9LAotICB7ICJqYSIsIEp2IH0sCi0gIC8qIDg4ICovCi0gIHsgImpzIiwgSnYgfSwKLSAgeyAiam5zIiwgSnYgfSwKLSAgeyAianAiLCBKdiB9LAotICB7ICJqbnAiLCBKdiB9LAotICB7ICJqbCIsIEp2IH0sCi0gIHsgImpnZSIsIEp2IH0sCi0gIHsgImpsZSIsIEp2IH0sCi0gIHsgImpnIiwgSnYgfSwKLSAgLyogOTAgKi8KLSAgeyAic2V0byIsIEViIH0sCi0gIHsgInNldG5vIiwgRWIgfSwKLSAgeyAic2V0YiIsIEViIH0sCi0gIHsgInNldGFlIiwgRWIgfSwKLSAgeyAic2V0ZSIsIEViIH0sCi0gIHsgInNldG5lIiwgRWIgfSwKLSAgeyAic2V0YmUiLCBFYiB9LAotICB7ICJzZXRhIiwgRWIgfSwKLSAgLyogOTggKi8KLSAgeyAic2V0cyIsIEViIH0sCi0gIHsgInNldG5zIiwgRWIgfSwKLSAgeyAic2V0cCIsIEViIH0sCi0gIHsgInNldG5wIiwgRWIgfSwKLSAgeyAic2V0bCIsIEViIH0sCi0gIHsgInNldGdlIiwgRWIgfSwKLSAgeyAic2V0bGUiLCBFYiB9LAotICB7ICJzZXRnIiwgRWIgfSwKLSAgLyogYTAgKi8KLSAgeyAicHVzaFAiLCBmcyB9LAotICB7ICJwb3BQIiwgZnMgfSwKLSAgeyAiY3B1aWQiIH0sCi0gIHsgImJ0UyIsIEV2LCBHdiB9LAotICB7ICJzaGxkUyIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hsZFMiLCBFdiwgR3YsIENMIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgLyogYTggKi8KLSAgeyAicHVzaFAiLCBncyB9LAotICB7ICJwb3BQIiwgZ3MgfSwKLSAgeyAicnNtIiB9LAotICB7ICJidHNTIiwgRXYsIEd2IH0sCi0gIHsgInNocmRTIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaHJkUyIsIEV2LCBHdiwgQ0wgfSwKLSAgeyBHUlAxMyB9LAotICB7ICJpbXVsUyIsIEd2LCBFdiB9LAotICAvKiBiMCAqLwotICB7ICJjbXB4Y2hnQiIsIEViLCBHYiB9LAotICB7ICJjbXB4Y2hnUyIsIEV2LCBHdiB9LAotICB7ICJsc3NTIiwgR3YsIE1wIH0sCi0gIHsgImJ0clMiLCBFdiwgR3YgfSwKLSAgeyAibGZzUyIsIEd2LCBNcCB9LAotICB7ICJsZ3NTIiwgR3YsIE1wIH0sCi0gIHsgIm1vdnpiUiIsIEd2LCBFYiB9LAotICB7ICJtb3Z6d1IiLCBHdiwgRXcgfSwgLyogeWVzLCB0aGVyZSByZWFsbHkgaXMgbW92end3ICEgKi8KLSAgLyogYjggKi8KLSAgeyAiKGJhZCkiIH0sCi0gIHsgInVkMmIiIH0sCi0gIHsgR1JQOCB9LAotICB7ICJidGNTIiwgRXYsIEd2IH0sCi0gIHsgImJzZlMiLCBHdiwgRXYgfSwKLSAgeyAiYnNyUyIsIEd2LCBFdiB9LAotICB7ICJtb3ZzYlIiLCBHdiwgRWIgfSwKLSAgeyAibW92c3dSIiwgR3YsIEV3IH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnN3dyAhICovCi0gIC8qIGMwICovCi0gIHsgInhhZGRCIiwgRWIsIEdiIH0sCi0gIHsgInhhZGRTIiwgRXYsIEd2IH0sCi0gIHsgUFJFR1JQMSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicGluc3J3IiwgTVgsIEV2LCBJYiB9LAotICB7ICJwZXh0cnciLCBFdiwgTVgsIEliIH0sCi0gIHsgInNodWZwcyIsIFhNLCBFWCwgSWIgfSwKLSAgeyBHUlA5IH0sCi0gIC8qIGM4ICovCi0gIHsgImJzd2FwIiwgZUFYIH0sCS8qIGJzd2FwIGRvZXNuJ3Qgc3VwcG9ydCAxNiBiaXQgcmVncyAqLwotICB7ICJic3dhcCIsIGVDWCB9LAotICB7ICJic3dhcCIsIGVEWCB9LAotICB7ICJic3dhcCIsIGVCWCB9LAotICB7ICJic3dhcCIsIGVTUCB9LAotICB7ICJic3dhcCIsIGVCUCB9LAotICB7ICJic3dhcCIsIGVTSSB9LAotICB7ICJic3dhcCIsIGVESSB9LAotICAvKiBkMCAqLwotICB7ICIoYmFkKSIgfSwKLSAgeyAicHNybHciLCBNWCwgRU0gfSwKLSAgeyAicHNybGQiLCBNWCwgRU0gfSwKLSAgeyAicHNybHEiLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBtdWxsdyIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicG1vdm1za2IiLCBFdiwgTVggfSwKLSAgLyogZDggKi8KLSAgeyAicHN1YnVzYiIsIE1YLCBFTSB9LAotICB7ICJwc3VidXN3IiwgTVgsIEVNIH0sCi0gIHsgInBtaW51YiIsIE1YLCBFTSB9LAotICB7ICJwYW5kIiwgTVgsIEVNIH0sCi0gIHsgInBhZGR1c2IiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHVzdyIsIE1YLCBFTSB9LAotICB7ICJwbWF4dWIiLCBNWCwgRU0gfSwKLSAgeyAicGFuZG4iLCBNWCwgRU0gfSwKLSAgLyogZTAgKi8KLSAgeyAicGF2Z2IiLCBNWCwgRU0gfSwKLSAgeyAicHNyYXciLCBNWCwgRU0gfSwKLSAgeyAicHNyYWQiLCBNWCwgRU0gfSwKLSAgeyAicGF2Z3ciLCBNWCwgRU0gfSwKLSAgeyAicG11bGh1dyIsIE1YLCBFTSB9LAotICB7ICJwbXVsaHciLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIm1vdm50cSIsIEV2LCBNWCB9LAotICAvKiBlOCAqLwotICB7ICJwc3Vic2IiLCBNWCwgRU0gfSwKLSAgeyAicHN1YnN3IiwgTVgsIEVNIH0sCi0gIHsgInBtaW5zdyIsIE1YLCBFTSB9LAotICB7ICJwb3IiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHNiIiwgTVgsIEVNIH0sCi0gIHsgInBhZGRzdyIsIE1YLCBFTSB9LAotICB7ICJwbWF4c3ciLCBNWCwgRU0gfSwKLSAgeyAicHhvciIsIE1YLCBFTSB9LAotICAvKiBmMCAqLwotICB7ICIoYmFkKSIgfSwKLSAgeyAicHNsbHciLCBNWCwgRU0gfSwKLSAgeyAicHNsbGQiLCBNWCwgRU0gfSwKLSAgeyAicHNsbHEiLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBtYWRkd2QiLCBNWCwgRU0gfSwKLSAgeyAicHNhZGJ3IiwgTVgsIEVNIH0sCi0gIHsgIm1hc2ttb3ZxIiwgTVgsIEVNIH0sCi0gIC8qIGY4ICovCi0gIHsgInBzdWJiIiwgTVgsIEVNIH0sCi0gIHsgInBzdWJ3IiwgTVgsIEVNIH0sCi0gIHsgInBzdWJkIiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwYWRkYiIsIE1YLCBFTSB9LAotICB7ICJwYWRkdyIsIE1YLCBFTSB9LAotICB7ICJwYWRkZCIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X3R3b2J5dGVfaW50ZWxbXSA9IHsKLSAgLyogMDAgKi8KLSAgeyBHUlA2IH0sCi0gIHsgR1JQNyB9LAotICB7ICJsYXIiLCBHdiwgRXcgfSwKLSAgeyAibHNsIiwgR3YsIEV3IH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAiY2x0cyIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIC8qIDA4ICovCi0gIHsgImludmQiIH0sCi0gIHsgIndiaW52ZCIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInVkMmEiIH0sCi0gIHsgIihiYWQpIiB9LAotICB7IEdSUEFNRCB9LAotICB7ICJmZW1tcyIgfSwKLSAgeyAiIiwgTVgsIEVNLCBPUFNVRiB9LCAvKiBTZWUgT1BfM0ROb3dTdWZmaXggKi8KLSAgLyogMTAgKi8KLSAgeyBQUkVHUlA4IH0sCi0gIHsgUFJFR1JQOSB9LAotICB7ICJtb3ZscHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdoJyB9LCAgLyogcmVhbGx5IG9ubHkgMiBvcGVyYW5kcyAqLwotICB7ICJtb3ZscHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdoJyB9LAotICB7ICJ1bnBja2xwcyIsIFhNLCBFWCB9LAotICB7ICJ1bnBja2hwcyIsIFhNLCBFWCB9LAotICB7ICJtb3ZocHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdsJyB9LAotICB7ICJtb3ZocHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdsJyB9LAotICAvKiAxOCAqLwotICB7IEdSUDE0IH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIC8qIDIwICovCi0gIC8qIHRoZXNlIGFyZSBhbGwgYmFja3dhcmQgaW4gYXBwZW5kaXggQSBvZiB0aGUgaW50ZWwgYm9vayAqLwotICB7ICJtb3YiLCBSZCwgQ2QgfSwKLSAgeyAibW92IiwgUmQsIERkIH0sCi0gIHsgIm1vdiIsIENkLCBSZCB9LAotICB7ICJtb3YiLCBEZCwgUmQgfSwKLSAgeyAibW92IiwgUmQsIFRkIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJtb3YiLCBUZCwgUmQgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIC8qIDI4ICovCi0gIHsgIm1vdmFwcyIsIFhNLCBFWCB9LAotICB7ICJtb3ZhcHMiLCBFWCwgWE0gfSwKLSAgeyBQUkVHUlAyIH0sCi0gIHsgIm1vdm50cHMiLCBFdiwgWE0gfSwKLSAgeyBQUkVHUlA0IH0sCi0gIHsgUFJFR1JQMyB9LAotICB7ICJ1Y29taXNzIiwgWE0sIEVYIH0sCi0gIHsgImNvbWlzcyIsIFhNLCBFWCB9LAotICAvKiAzMCAqLwotICB7ICJ3cm1zciIgfSwgIHsgInJkdHNjIiB9LCAgeyAicmRtc3IiIH0sICB7ICJyZHBtYyIgfSwKLSAgeyAic3lzZW50ZXIiIH0sICB7ICJzeXNleGl0IiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgLyogMzggKi8KLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICAvKiA0MCAqLwotICB7ICJjbW92byIsIEd2LEV2IH0sIHsgImNtb3ZubyIsIEd2LEV2IH0sIHsgImNtb3ZiIiwgR3YsRXYgfSwgeyAiY21vdmFlIiwgR3YsRXYgfSwKLSAgeyAiY21vdmUiLCBHdixFdiB9LCB7ICJjbW92bmUiLCBHdixFdiB9LCB7ICJjbW92YmUiLCBHdixFdiB9LCB7ICJjbW92YSIsIEd2LEV2IH0sCi0gIC8qIDQ4ICovCi0gIHsgImNtb3ZzIiwgR3YsRXYgfSwgeyAiY21vdm5zIiwgR3YsRXYgfSwgeyAiY21vdnAiLCBHdixFdiB9LCB7ICJjbW92bnAiLCBHdixFdiB9LAotICB7ICJjbW92bCIsIEd2LEV2IH0sIHsgImNtb3ZnZSIsIEd2LEV2IH0sIHsgImNtb3ZsZSIsIEd2LEV2IH0sIHsgImNtb3ZnIiwgR3YsRXYgfSwKLSAgLyogNTAgKi8KLSAgeyAibW92bXNrcHMiLCBHdiwgRVggfSwKLSAgeyBQUkVHUlAxMyB9LAotICB7IFBSRUdSUDEyIH0sCi0gIHsgUFJFR1JQMTEgfSwKLSAgeyAiYW5kcHMiLCBYTSwgRVggfSwKLSAgeyAiYW5kbnBzIiwgWE0sIEVYIH0sCi0gIHsgIm9ycHMiLCBYTSwgRVggfSwKLSAgeyAieG9ycHMiLCBYTSwgRVggfSwKLSAgLyogNTggKi8KLSAgeyBQUkVHUlAwIH0sCi0gIHsgUFJFR1JQMTAgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LAotICB7IFBSRUdSUDE0IH0sCi0gIHsgUFJFR1JQNyB9LAotICB7IFBSRUdSUDUgfSwKLSAgeyBQUkVHUlA2IH0sCi0gIC8qIDYwICovCi0gIHsgInB1bnBja2xidyIsIE1YLCBFTSB9LAotICB7ICJwdW5wY2tsd2QiLCBNWCwgRU0gfSwKLSAgeyAicHVucGNrbGRxIiwgTVgsIEVNIH0sCi0gIHsgInBhY2tzc3diIiwgTVgsIEVNIH0sCi0gIHsgInBjbXBndGIiLCBNWCwgRU0gfSwKLSAgeyAicGNtcGd0dyIsIE1YLCBFTSB9LAotICB7ICJwY21wZ3RkIiwgTVgsIEVNIH0sCi0gIHsgInBhY2t1c3diIiwgTVgsIEVNIH0sCi0gIC8qIDY4ICovCi0gIHsgInB1bnBja2hidyIsIE1YLCBFTSB9LAotICB7ICJwdW5wY2tod2QiLCBNWCwgRU0gfSwKLSAgeyAicHVucGNraGRxIiwgTVgsIEVNIH0sCi0gIHsgInBhY2tzc2R3IiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIm1vdmQiLCBNWCwgRWQgfSwKLSAgeyAibW92cSIsIE1YLCBFTSB9LAotICAvKiA3MCAqLwotICB7ICJwc2h1ZnciLCBNWCwgRU0sIEliIH0sCi0gIHsgR1JQMTAgfSwKLSAgeyBHUlAxMSB9LAotICB7IEdSUDEyIH0sCi0gIHsgInBjbXBlcWIiLCBNWCwgRU0gfSwKLSAgeyAicGNtcGVxdyIsIE1YLCBFTSB9LAotICB7ICJwY21wZXFkIiwgTVgsIEVNIH0sCi0gIHsgImVtbXMiIH0sCi0gIC8qIDc4ICovCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICJtb3ZkIiwgRWQsIE1YIH0sCi0gIHsgIm1vdnEiLCBFTSwgTVggfSwKLSAgLyogODAgKi8KLSAgeyAiam8iLCBKdiB9LAotICB7ICJqbm8iLCBKdiB9LAotICB7ICJqYiIsIEp2IH0sCi0gIHsgImphZSIsIEp2IH0sCi0gIHsgImplIiwgSnYgfSwKLSAgeyAiam5lIiwgSnYgfSwKLSAgeyAiamJlIiwgSnYgfSwKLSAgeyAiamEiLCBKdiB9LAotICAvKiA4OCAqLwotICB7ICJqcyIsIEp2IH0sCi0gIHsgImpucyIsIEp2IH0sCi0gIHsgImpwIiwgSnYgfSwKLSAgeyAiam5wIiwgSnYgfSwKLSAgeyAiamwiLCBKdiB9LAotICB7ICJqZ2UiLCBKdiB9LAotICB7ICJqbGUiLCBKdiB9LAotICB7ICJqZyIsIEp2IH0sCi0gIC8qIDkwICovCi0gIHsgInNldG8iLCBFYiB9LAotICB7ICJzZXRubyIsIEViIH0sCi0gIHsgInNldGIiLCBFYiB9LAotICB7ICJzZXRhZSIsIEViIH0sCi0gIHsgInNldGUiLCBFYiB9LAotICB7ICJzZXRuZSIsIEViIH0sCi0gIHsgInNldGJlIiwgRWIgfSwKLSAgeyAic2V0YSIsIEViIH0sCi0gIC8qIDk4ICovCi0gIHsgInNldHMiLCBFYiB9LAotICB7ICJzZXRucyIsIEViIH0sCi0gIHsgInNldHAiLCBFYiB9LAotICB7ICJzZXRucCIsIEViIH0sCi0gIHsgInNldGwiLCBFYiB9LAotICB7ICJzZXRnZSIsIEViIH0sCi0gIHsgInNldGxlIiwgRWIgfSwKLSAgeyAic2V0ZyIsIEViIH0sCi0gIC8qIGEwICovCi0gIHsgInB1c2giLCBmcyB9LAotICB7ICJwb3AiLCBmcyB9LAotICB7ICJjcHVpZCIgfSwKLSAgeyAiYnQiLCBFdiwgR3YgfSwKLSAgeyAic2hsZCIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hsZCIsIEV2LCBHdiwgQ0wgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LAotICAvKiBhOCAqLwotICB7ICJwdXNoIiwgZ3MgfSwKLSAgeyAicG9wIiwgZ3MgfSwKLSAgeyAicnNtIiB9LAotICB7ICJidHMiLCBFdiwgR3YgfSwKLSAgeyAic2hyZCIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hyZCIsIEV2LCBHdiwgQ0wgfSwKLSAgeyBHUlAxMyB9LAotICB7ICJpbXVsIiwgR3YsIEV2IH0sCi0gIC8qIGIwICovCi0gIHsgImNtcHhjaGciLCBFYiwgR2IgfSwKLSAgeyAiY21weGNoZyIsIEV2LCBHdiB9LAotICB7ICJsc3MiLCBHdiwgTXAgfSwKLSAgeyAiYnRyIiwgRXYsIEd2IH0sCi0gIHsgImxmcyIsIEd2LCBNcCB9LAotICB7ICJsZ3MiLCBHdiwgTXAgfSwKLSAgeyAibW92engiLCBHdiwgRWIgfSwKLSAgeyAibW92engiLCBHdiwgRXcgfSwKLSAgLyogYjggKi8KLSAgeyAiKGJhZCkiIH0sCi0gIHsgInVkMmIiIH0sCi0gIHsgR1JQOCB9LAotICB7ICJidGMiLCBFdiwgR3YgfSwKLSAgeyAiYnNmIiwgR3YsIEV2IH0sCi0gIHsgImJzciIsIEd2LCBFdiB9LAotICB7ICJtb3ZzeCIsIEd2LCBFYiB9LAotICB7ICJtb3ZzeCIsIEd2LCBFdyB9LAotICAvKiBjMCAqLwotICB7ICJ4YWRkIiwgRWIsIEdiIH0sCi0gIHsgInhhZGQiLCBFdiwgR3YgfSwKLSAgeyBQUkVHUlAxIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwaW5zcnciLCBNWCwgRXYsIEliIH0sCi0gIHsgInBleHRydyIsIEV2LCBNWCwgSWIgfSwKLSAgeyAic2h1ZnBzIiwgWE0sIEVYLCBJYiB9LAotICB7IEdSUDkgfSwKLSAgLyogYzggKi8KLSAgeyAiYnN3YXAiLCBlQVggfSwJLyogYnN3YXAgZG9lc24ndCBzdXBwb3J0IDE2IGJpdCByZWdzICovCi0gIHsgImJzd2FwIiwgZUNYIH0sCi0gIHsgImJzd2FwIiwgZURYIH0sCi0gIHsgImJzd2FwIiwgZUJYIH0sCi0gIHsgImJzd2FwIiwgZVNQIH0sCi0gIHsgImJzd2FwIiwgZUJQIH0sCi0gIHsgImJzd2FwIiwgZVNJIH0sCi0gIHsgImJzd2FwIiwgZURJIH0sCi0gIC8qIGQwICovCi0gIHsgIihiYWQpIiB9LAotICB7ICJwc3JsdyIsIE1YLCBFTSB9LAotICB7ICJwc3JsZCIsIE1YLCBFTSB9LAotICB7ICJwc3JscSIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicG11bGx3IiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwbW92bXNrYiIsIEV2LCBNWCB9LAotICAvKiBkOCAqLwotICB7ICJwc3VidXNiIiwgTVgsIEVNIH0sCi0gIHsgInBzdWJ1c3ciLCBNWCwgRU0gfSwKLSAgeyAicG1pbnViIiwgTVgsIEVNIH0sCi0gIHsgInBhbmQiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHVzYiIsIE1YLCBFTSB9LAotICB7ICJwYWRkdXN3IiwgTVgsIEVNIH0sCi0gIHsgInBtYXh1YiIsIE1YLCBFTSB9LAotICB7ICJwYW5kbiIsIE1YLCBFTSB9LAotICAvKiBlMCAqLwotICB7ICJwYXZnYiIsIE1YLCBFTSB9LAotICB7ICJwc3JhdyIsIE1YLCBFTSB9LAotICB7ICJwc3JhZCIsIE1YLCBFTSB9LAotICB7ICJwYXZndyIsIE1YLCBFTSB9LAotICB7ICJwbXVsaHV3IiwgTVgsIEVNIH0sCi0gIHsgInBtdWxodyIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAibW92bnRxIiwgRXYsIE1YIH0sCi0gIC8qIGU4ICovCi0gIHsgInBzdWJzYiIsIE1YLCBFTSB9LAotICB7ICJwc3Vic3ciLCBNWCwgRU0gfSwKLSAgeyAicG1pbnN3IiwgTVgsIEVNIH0sCi0gIHsgInBvciIsIE1YLCBFTSB9LAotICB7ICJwYWRkc2IiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHN3IiwgTVgsIEVNIH0sCi0gIHsgInBtYXhzdyIsIE1YLCBFTSB9LAotICB7ICJweG9yIiwgTVgsIEVNIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiB9LAotICB7ICJwc2xsdyIsIE1YLCBFTSB9LAotICB7ICJwc2xsZCIsIE1YLCBFTSB9LAotICB7ICJwc2xscSIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicG1hZGR3ZCIsIE1YLCBFTSB9LAotICB7ICJwc2FkYnciLCBNWCwgRU0gfSwKLSAgeyAibWFza21vdnEiLCBNWCwgRU0gfSwKLSAgLyogZjggKi8KLSAgeyAicHN1YmIiLCBNWCwgRU0gfSwKLSAgeyAicHN1YnciLCBNWCwgRU0gfSwKLSAgeyAicHN1YmQiLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBhZGRiIiwgTVgsIEVNIH0sCi0gIHsgInBhZGR3IiwgTVgsIEVNIH0sCi0gIHsgInBhZGRkIiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvbmVieXRlX2hhc19tb2RybVsyNTZdID0gewotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAwMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAwMCAqLwotICAvKiAxMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAxMCAqLwotICAvKiAyMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAyMCAqLwotICAvKiAzMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAzMCAqLwotICAvKiA0MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0MCAqLwotICAvKiA1MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA1MCAqLwotICAvKiA2MCAqLyAwLDAsMSwxLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLCAvKiA2MCAqLwotICAvKiA3MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA3MCAqLwotICAvKiA4MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiA4MCAqLwotICAvKiA5MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5MCAqLwotICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBhMCAqLwotICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBiMCAqLwotICAvKiBjMCAqLyAxLDEsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLCAvKiBjMCAqLwotICAvKiBkMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLCAvKiBkMCAqLwotICAvKiBlMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlMCAqLwotICAvKiBmMCAqLyAwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwxICAvKiBmMCAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHdvYnl0ZV9oYXNfbW9kcm1bMjU2XSA9IHsKLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogMDAgKi8gMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwgLyogMGYgKi8KLSAgLyogMTAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwgLyogMWYgKi8KLSAgLyogMjAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogMmYgKi8KLSAgLyogMzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogM2YgKi8KLSAgLyogNDAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogNGYgKi8KLSAgLyogNTAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwgLyogNWYgKi8KLSAgLyogNjAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwgLyogNmYgKi8KLSAgLyogNzAgKi8gMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDEsMSwgLyogN2YgKi8KLSAgLyogODAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOGYgKi8KLSAgLyogOTAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogOWYgKi8KLSAgLyogYTAgKi8gMCwwLDAsMSwxLDEsMSwxLDAsMCwwLDEsMSwxLDEsMSwgLyogYWYgKi8KLSAgLyogYjAgKi8gMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwxLDEsMSwgLyogYmYgKi8KLSAgLyogYzAgKi8gMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwgLyogY2YgKi8KLSAgLyogZDAgKi8gMCwxLDEsMSwwLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwgLyogZGYgKi8KLSAgLyogZTAgKi8gMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwgLyogZWYgKi8KLSAgLyogZjAgKi8gMCwxLDEsMSwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMCAgLyogZmYgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHR3b2J5dGVfdXNlc19mM19wcmVmaXhbMjU2XSA9IHsKLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogMDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogMGYgKi8KLSAgLyogMTAgKi8gMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogMWYgKi8KLSAgLyogMjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsMCwgLyogMmYgKi8KLSAgLyogMzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogM2YgKi8KLSAgLyogNDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNGYgKi8KLSAgLyogNTAgKi8gMCwxLDEsMSwwLDAsMCwwLDEsMSwwLDAsMSwxLDEsMSwgLyogNWYgKi8KLSAgLyogNjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNmYgKi8KLSAgLyogNzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogN2YgKi8KLSAgLyogODAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOGYgKi8KLSAgLyogOTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOWYgKi8KLSAgLyogYTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYWYgKi8KLSAgLyogYjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYmYgKi8KLSAgLyogYzAgKi8gMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogY2YgKi8KLSAgLyogZDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZGYgKi8KLSAgLyogZTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZWYgKi8KLSAgLyogZjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCAgLyogZmYgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBjaGFyIG9idWZbMTAwXTsKLXN0YXRpYyBjaGFyICpvYnVmcDsKLXN0YXRpYyBjaGFyIHNjcmF0Y2hidWZbMTAwXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpzdGFydF9jb2RlcDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnNuX2NvZGVwOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmNvZGVwOwotc3RhdGljIGRpc2Fzc2VtYmxlX2luZm8gKnRoZV9pbmZvOwotc3RhdGljIGludCBtb2Q7Ci1zdGF0aWMgaW50IHJtOwotc3RhdGljIGludCByZWc7Ci1zdGF0aWMgdm9pZCBvYXBwZW5kIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnMpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzMzJbXT17Ci0gICIlZWF4IiwiJWVjeCIsIiVlZHgiLCIlZWJ4IiwgIiVlc3AiLCIlZWJwIiwiJWVzaSIsIiVlZGkiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lczE2W10gPSB7Ci0gICIlYXgiLCIlY3giLCIlZHgiLCIlYngiLCIlc3AiLCIlYnAiLCIlc2kiLCIlZGkiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lczhbXSA9IHsKLSAgIiVhbCIsIiVjbCIsIiVkbCIsIiVibCIsIiVhaCIsIiVjaCIsIiVkaCIsIiViaCIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzX3NlZ1tdID0gewotICAiJWVzIiwiJWNzIiwiJXNzIiwiJWRzIiwiJWZzIiwiJWdzIiwiJT8iLCIlPyIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmluZGV4MTZbXSA9IHsKLSAgIiVieCwlc2kiLCIlYngsJWRpIiwiJWJwLCVzaSIsIiVicCwlZGkiLCIlc2kiLCIlZGkiLCIlYnAiLCIlYngiCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBncnBzW11bOF0gPSB7Ci0gIC8qIEdSUDFiICovCi0gIHsKLSAgICB7ICJhZGRBIiwJRWIsIEliIH0sCi0gICAgeyAib3JBIiwJRWIsIEliIH0sCi0gICAgeyAiYWRjQSIsCUViLCBJYiB9LAotICAgIHsgInNiYkEiLAlFYiwgSWIgfSwKLSAgICB7ICJhbmRBIiwJRWIsIEliIH0sCi0gICAgeyAic3ViQSIsCUViLCBJYiB9LAotICAgIHsgInhvckEiLAlFYiwgSWIgfSwKLSAgICB7ICJjbXBBIiwJRWIsIEliIH0KLSAgfSwKLSAgLyogR1JQMVMgKi8KLSAgewotICAgIHsgImFkZFEiLAlFdiwgSXYgfSwKLSAgICB7ICJvclEiLAlFdiwgSXYgfSwKLSAgICB7ICJhZGNRIiwJRXYsIEl2IH0sCi0gICAgeyAic2JiUSIsCUV2LCBJdiB9LAotICAgIHsgImFuZFEiLAlFdiwgSXYgfSwKLSAgICB7ICJzdWJRIiwJRXYsIEl2IH0sCi0gICAgeyAieG9yUSIsCUV2LCBJdiB9LAotICAgIHsgImNtcFEiLAlFdiwgSXYgfQotICB9LAotICAvKiBHUlAxU3MgKi8KLSAgewotICAgIHsgImFkZFEiLAlFdiwgc0liIH0sCi0gICAgeyAib3JRIiwJRXYsIHNJYiB9LAotICAgIHsgImFkY1EiLAlFdiwgc0liIH0sCi0gICAgeyAic2JiUSIsCUV2LCBzSWIgfSwKLSAgICB7ICJhbmRRIiwJRXYsIHNJYiB9LAotICAgIHsgInN1YlEiLAlFdiwgc0liIH0sCi0gICAgeyAieG9yUSIsCUV2LCBzSWIgfSwKLSAgICB7ICJjbXBRIiwJRXYsIHNJYiB9Ci0gIH0sCi0gIC8qIEdSUDJiICovCi0gIHsKLSAgICB7ICJyb2xBIiwJRWIsIEliIH0sCi0gICAgeyAicm9yQSIsCUViLCBJYiB9LAotICAgIHsgInJjbEEiLAlFYiwgSWIgfSwKLSAgICB7ICJyY3JBIiwJRWIsIEliIH0sCi0gICAgeyAic2hsQSIsCUViLCBJYiB9LAotICAgIHsgInNockEiLAlFYiwgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJzYXJBIiwJRWIsIEliIH0sCi0gIH0sCi0gIC8qIEdSUDJTICovCi0gIHsKLSAgICB7ICJyb2xRIiwJRXYsIEliIH0sCi0gICAgeyAicm9yUSIsCUV2LCBJYiB9LAotICAgIHsgInJjbFEiLAlFdiwgSWIgfSwKLSAgICB7ICJyY3JRIiwJRXYsIEliIH0sCi0gICAgeyAic2hsUSIsCUV2LCBJYiB9LAotICAgIHsgInNoclEiLAlFdiwgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJzYXJRIiwJRXYsIEliIH0sCi0gIH0sCi0gIC8qIEdSUDJiX29uZSAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViIH0sCi0gICAgeyAicm9yQSIsCUViIH0sCi0gICAgeyAicmNsQSIsCUViIH0sCi0gICAgeyAicmNyQSIsCUViIH0sCi0gICAgeyAic2hsQSIsCUViIH0sCi0gICAgeyAic2hyQSIsCUViIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAic2FyQSIsCUViIH0sCi0gIH0sCi0gIC8qIEdSUDJTX29uZSAqLwotICB7Ci0gICAgeyAicm9sUSIsCUV2IH0sCi0gICAgeyAicm9yUSIsCUV2IH0sCi0gICAgeyAicmNsUSIsCUV2IH0sCi0gICAgeyAicmNyUSIsCUV2IH0sCi0gICAgeyAic2hsUSIsCUV2IH0sCi0gICAgeyAic2hyUSIsCUV2IH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAic2FyUSIsCUV2IH0sCi0gIH0sCi0gIC8qIEdSUDJiX2NsICovCi0gIHsKLSAgICB7ICJyb2xBIiwJRWIsIENMIH0sCi0gICAgeyAicm9yQSIsCUViLCBDTCB9LAotICAgIHsgInJjbEEiLAlFYiwgQ0wgfSwKLSAgICB7ICJyY3JBIiwJRWIsIENMIH0sCi0gICAgeyAic2hsQSIsCUViLCBDTCB9LAotICAgIHsgInNockEiLAlFYiwgQ0wgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJzYXJBIiwJRWIsIENMIH0sCi0gIH0sCi0gIC8qIEdSUDJTX2NsICovCi0gIHsKLSAgICB7ICJyb2xRIiwJRXYsIENMIH0sCi0gICAgeyAicm9yUSIsCUV2LCBDTCB9LAotICAgIHsgInJjbFEiLAlFdiwgQ0wgfSwKLSAgICB7ICJyY3JRIiwJRXYsIENMIH0sCi0gICAgeyAic2hsUSIsCUV2LCBDTCB9LAotICAgIHsgInNoclEiLAlFdiwgQ0wgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJzYXJRIiwJRXYsIENMIH0KLSAgfSwKLSAgLyogR1JQM2IgKi8KLSAgewotICAgIHsgInRlc3RBIiwJRWIsIEliIH0sCi0gICAgeyAiKGJhZCkiLAlFYiB9LAotICAgIHsgIm5vdEEiLAlFYiB9LAotICAgIHsgIm5lZ0EiLAlFYiB9LAotICAgIHsgIm11bEIiLAlBTCwgRWIgfSwKLSAgICB7ICJpbXVsQiIsCUFMLCBFYiB9LAotICAgIHsgImRpdkIiLAlBTCwgRWIgfSwKLSAgICB7ICJpZGl2QiIsCUFMLCBFYiB9Ci0gIH0sCi0gIC8qIEdSUDNTICovCi0gIHsKLSAgICB7ICJ0ZXN0USIsCUV2LCBJdiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIm5vdFEiLAlFdiB9LAotICAgIHsgIm5lZ1EiLAlFdiB9LAotICAgIHsgIm11bFMiLAllQVgsIEV2IH0sCi0gICAgeyAiaW11bFMiLAllQVgsIEV2IH0sCi0gICAgeyAiZGl2UyIsCWVBWCwgRXYgfSwKLSAgICB7ICJpZGl2UyIsCWVBWCwgRXYgfSwKLSAgfSwKLSAgLyogR1JQNCAqLwotICB7Ci0gICAgeyAiaW5jQSIsIEViIH0sCi0gICAgeyAiZGVjQSIsIEViIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gIH0sCi0gIC8qIEdSUDUgKi8KLSAgewotICAgIHsgImluY1EiLAlFdiB9LAotICAgIHsgImRlY1EiLAlFdiB9LAotICAgIHsgImNhbGxQIiwJaW5kaXJFdiB9LAotICAgIHsgImNhbGxQIiwJaW5kaXJFdiB9LAotICAgIHsgImptcFAiLAlpbmRpckV2IH0sCi0gICAgeyAibGptcFAiLAlpbmRpckV2IH0sCi0gICAgeyAicHVzaFEiLAlFdiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBHUlA2ICovCi0gIHsKLSAgICB7ICJzbGR0IiwJRXcgfSwKLSAgICB7ICJzdHIiLAlFdyB9LAotICAgIHsgImxsZHQiLAlFdyB9LAotICAgIHsgImx0ciIsCUV3IH0sCi0gICAgeyAidmVyciIsCUV3IH0sCi0gICAgeyAidmVydyIsCUV3IH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0KLSAgfSwKLSAgLyogR1JQNyAqLwotICB7Ci0gICAgeyAic2dkdCIsIEV3IH0sCi0gICAgeyAic2lkdCIsIEV3IH0sCi0gICAgeyAibGdkdCIsIEV3IH0sCi0gICAgeyAibGlkdCIsIEV3IH0sCi0gICAgeyAic21zdyIsIEV3IH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAibG1zdyIsIEV3IH0sCi0gICAgeyAiaW52bHBnIiwgRXcgfSwKLSAgfSwKLSAgLyogR1JQOCAqLwotICB7Ci0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiYnRRIiwJRXYsIEliIH0sCi0gICAgeyAiYnRzUSIsCUV2LCBJYiB9LAotICAgIHsgImJ0clEiLAlFdiwgSWIgfSwKLSAgICB7ICJidGNRIiwJRXYsIEliIH0sCi0gIH0sCi0gIC8qIEdSUDkgKi8KLSAgewotICAgIHsgIihiYWQpIiB9LAotICAgIHsgImNtcHhjaGc4YiIsIEV2IH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gIH0sCi0gIC8qIEdSUDEwICovCi0gIHsKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJwc3JsdyIsIE1TLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInBzcmF3IiwgTVMsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAicHNsbHciLCBNUywgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogR1JQMTEgKi8KLSAgewotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInBzcmxkIiwgTVMsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAicHNyYWQiLCBNUywgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJwc2xsZCIsIE1TLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBHUlAxMiAqLwotICB7Ci0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAicHNybHEiLCBNUywgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJwc2xscSIsIE1TLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBHUlAxMyAqLwotICB7Ci0gICAgeyAiZnhzYXZlIiwgRXYgfSwKLSAgICB7ICJmeHJzdG9yIiwgRXYgfSwKLSAgICB7ICJsZG14Y3NyIiwgRXYgfSwKLSAgICB7ICJzdG14Y3NyIiwgRXYgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJzZmVuY2UiLCBOb25lIH0sCi0gIH0sCi0gIC8qIEdSUDE0ICovCi0gIHsKLSAgICB7ICJwcmVmZXRjaG50YSIsIEV2IH0sCi0gICAgeyAicHJlZmV0Y2h0MCIsIEV2IH0sCi0gICAgeyAicHJlZmV0Y2h0MSIsIEV2IH0sCi0gICAgeyAicHJlZmV0Y2h0MiIsIEV2IH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gIH0sCi0gIC8qIEdSUEFNRCAqLwotICB7Ci0gICAgeyAicHJlZmV0Y2giLCBFYiB9LAotICAgIHsgInByZWZldGNodyIsIEViIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gIH0KLQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgcHJlZml4X3VzZXJfdGFibGVbXVsyXSA9IHsKLSAgLyogUFJFR1JQMCAqLwotICB7Ci0gICAgeyAiYWRkcHMiLCBYTSwgRVggfSwKLSAgICB7ICJhZGRzcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlAxICovCi0gIHsKLSAgICB7ICIiLCBYTSwgRVgsIE9QU0lNRCB9LAkvKiBTZWUgT1BfU0lNRF9TVUZGSVggKi8KLSAgICB7ICIiLCBYTSwgRVgsIE9QU0lNRCB9LAotICB9LAotICAvKiBQUkVHUlAyICovCi0gIHsKLSAgICB7ICJjdnRwaTJwcyIsIFhNLCBFTSB9LAotICAgIHsgImN2dHNpMnNzIiwgWE0sIEV2IH0sCi0gIH0sCi0gIC8qIFBSRUdSUDMgKi8KLSAgewotICAgIHsgImN2dHBzMnBpIiwgTVgsIEVYIH0sCi0gICAgeyAiY3Z0c3Myc2kiLCBHdiwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQNCAqLwotICB7Ci0gICAgeyAiY3Z0dHBzMnBpIiwgTVgsIEVYIH0sCi0gICAgeyAiY3Z0dHNzMnNpIiwgR3YsIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDUgKi8KLSAgewotICAgIHsgImRpdnBzIiwgWE0sIEVYIH0sCi0gICAgeyAiZGl2c3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQNiAqLwotICB7Ci0gICAgeyAibWF4cHMiLCBYTSwgRVggfSwKLSAgICB7ICJtYXhzcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlA3ICovCi0gIHsKLSAgICB7ICJtaW5wcyIsIFhNLCBFWCB9LAotICAgIHsgIm1pbnNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDggKi8KLSAgewotICAgIHsgIm1vdnVwcyIsIFhNLCBFWCB9LAotICAgIHsgIm1vdnNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDkgKi8KLSAgewotICAgIHsgIm1vdnVwcyIsIEVYLCBYTSB9LAotICAgIHsgIm1vdnNzIiwgRVgsIFhNIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDEwICovCi0gIHsKLSAgICB7ICJtdWxwcyIsIFhNLCBFWCB9LAotICAgIHsgIm11bHNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDExICovCi0gIHsKLSAgICB7ICJyY3BwcyIsIFhNLCBFWCB9LAotICAgIHsgInJjcHNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDEyICovCi0gIHsKLSAgICB7ICJyc3FydHBzIiwgWE0sIEVYIH0sCi0gICAgeyAicnNxcnRzcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlAxMyAqLwotICB7Ci0gICAgeyAic3FydHBzIiwgWE0sIEVYIH0sCi0gICAgeyAic3FydHNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDE0ICovCi0gIHsKLSAgICB7ICJzdWJwcyIsIFhNLCBFWCB9LAotICAgIHsgInN1YnNzIiwgWE0sIEVYIH0sCi0gIH0KLX07Ci0KLSNkZWZpbmUgSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SIF8oIjxpbnRlcm5hbCBkaXNhc3NlbWJsZXIgZXJyb3I+IikKLQotc3RhdGljIHZvaWQKLWNrcHJlZml4ICgpCi17Ci0gIHByZWZpeGVzID0gMDsKLSAgdXNlZF9wcmVmaXhlcyA9IDA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgc3dpdGNoICgqY29kZXApCi0JewotCWNhc2UgMHhmMzoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYyOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX1JFUE5aOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYwOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0xPQ0s7Ci0JICBicmVhazsKLQljYXNlIDB4MmU6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfQ1M7Ci0JICBicmVhazsKLQljYXNlIDB4MzY6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfU1M7Ci0JICBicmVhazsKLQljYXNlIDB4M2U6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7Ci0JICBicmVhazsKLQljYXNlIDB4MjY6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfRVM7Ci0JICBicmVhazsKLQljYXNlIDB4NjQ6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfRlM7Ci0JICBicmVhazsKLQljYXNlIDB4NjU6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfR1M7Ci0JICBicmVhazsKLQljYXNlIDB4NjY6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfREFUQTsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NzoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9BRERSOwotCSAgYnJlYWs7Ci0JY2FzZSBGV0FJVF9PUENPREU6Ci0JICAvKiBmd2FpdCBpcyByZWFsbHkgYW4gaW5zdHJ1Y3Rpb24uICBJZiB0aGVyZSBhcmUgcHJlZml4ZXMKLQkgICAgIGJlZm9yZSB0aGUgZndhaXQsIHRoZXkgYmVsb25nIHRvIHRoZSBmd2FpdCwgKm5vdCogdG8gdGhlCi0JICAgICBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uICAqLwotCSAgaWYgKHByZWZpeGVzKQotCSAgICB7Ci0JICAgICAgcHJlZml4ZXMgfD0gUFJFRklYX0ZXQUlUOwotCSAgICAgIGNvZGVwKys7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBwcmVmaXhlcyA9IFBSRUZJWF9GV0FJVDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR1cm47Ci0JfQotICAgICAgY29kZXArKzsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJlZml4IGJ5dGUgUFJFRiwgb3IgTlVMTCBpZiBQUkVGIGlzIG5vdCBhCi0gICBwcmVmaXggYnl0ZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXByZWZpeF9uYW1lIChwcmVmLCBzaXplZmxhZykKLSAgICAgaW50IHByZWY7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgc3dpdGNoIChwcmVmKQotICAgIHsKLSAgICBjYXNlIDB4ZjM6Ci0gICAgICByZXR1cm4gInJlcHoiOwotICAgIGNhc2UgMHhmMjoKLSAgICAgIHJldHVybiAicmVwbnoiOwotICAgIGNhc2UgMHhmMDoKLSAgICAgIHJldHVybiAibG9jayI7Ci0gICAgY2FzZSAweDJlOgotICAgICAgcmV0dXJuICJjcyI7Ci0gICAgY2FzZSAweDM2OgotICAgICAgcmV0dXJuICJzcyI7Ci0gICAgY2FzZSAweDNlOgotICAgICAgcmV0dXJuICJkcyI7Ci0gICAgY2FzZSAweDI2OgotICAgICAgcmV0dXJuICJlcyI7Ci0gICAgY2FzZSAweDY0OgotICAgICAgcmV0dXJuICJmcyI7Ci0gICAgY2FzZSAweDY1OgotICAgICAgcmV0dXJuICJncyI7Ci0gICAgY2FzZSAweDY2OgotICAgICAgcmV0dXJuIChzaXplZmxhZyAmIERGTEFHKSA/ICJkYXRhMTYiIDogImRhdGEzMiI7Ci0gICAgY2FzZSAweDY3OgotICAgICAgcmV0dXJuIChzaXplZmxhZyAmIEFGTEFHKSA/ICJhZGRyMTYiIDogImFkZHIzMiI7Ci0gICAgY2FzZSBGV0FJVF9PUENPREU6Ci0gICAgICByZXR1cm4gImZ3YWl0IjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciBvcDFvdXRbMTAwXSwgb3Ayb3V0WzEwMF0sIG9wM291dFsxMDBdOwotc3RhdGljIGludCBvcF9hZCwgb3BfaW5kZXhbM107Ci1zdGF0aWMgdW5zaWduZWQgaW50IG9wX2FkZHJlc3NbM107Ci1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0X3BjOwotCi0MCi0vKgotICogICBPbiB0aGUgMzg2J3Mgb2YgMTk4OCwgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uIGlzIDE1IGJ5dGVzLgotICogICAoc2VlIHRvcGljICJSZWR1bmRhbnQgcHJlZml4ZXMiIGluIHRoZSAiRGlmZmVyZW5jZXMgZnJvbSA4MDg2IgotICogICBzZWN0aW9uIG9mIHRoZSAiVmlydHVhbCA4MDg2IE1vZGUiIGNoYXB0ZXIuKQotICogJ3BjJyBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgdGhpcyBpbnN0cnVjdGlvbiwgaXQgd2lsbAotICogICBiZSB1c2VkIHRvIHByaW50IHRoZSB0YXJnZXQgYWRkcmVzcyBpZiB0aGlzIGlzIGEgcmVsYXRpdmUganVtcCBvciBjYWxsCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCi0gKi8KLQotc3RhdGljIGludCBwcmludF9pbnNuX2kzODYKLSAgUEFSQU1TICgoYmZkX3ZtYSBwYywgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi1zdGF0aWMgY2hhciBpbnRlbF9zeW50YXg7Ci1zdGF0aWMgY2hhciBvcGVuX2NoYXI7Ci1zdGF0aWMgY2hhciBjbG9zZV9jaGFyOwotc3RhdGljIGNoYXIgc2VwYXJhdG9yX2NoYXI7Ci1zdGF0aWMgY2hhciBzY2FsZV9jaGFyOwotCi1pbnQKLXByaW50X2luc25faTM4Nl9hdHQgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnRlbF9zeW50YXggPSAwOwotICBvcGVuX2NoYXIgPSAnKCc7Ci0gIGNsb3NlX2NoYXIgPSAgJyknOwotICBzZXBhcmF0b3JfY2hhciA9ICcsJzsKLSAgc2NhbGVfY2hhciA9ICcsJzsKLQotICByZXR1cm4gcHJpbnRfaW5zbl9pMzg2IChwYywgaW5mbyk7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9pMzg2X2ludGVsIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50ZWxfc3ludGF4ID0gMTsKLSAgb3Blbl9jaGFyID0gJ1snOwotICBjbG9zZV9jaGFyID0gJ10nOwotICBzZXBhcmF0b3JfY2hhciA9ICcrJzsKLSAgc2NhbGVfY2hhciA9ICcqJzsKLQotICByZXR1cm4gcHJpbnRfaW5zbl9pMzg2IChwYywgaW5mbyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25faTM4NiAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBkaXMzODYgKmRwOwotICBpbnQgaTsKLSAgaW50IHR3b19zb3VyY2Vfb3BzOwotICBjaGFyICpmaXJzdCwgKnNlY29uZCwgKnRoaXJkOwotICBpbnQgbmVlZGNvbW1hOwotICB1bnNpZ25lZCBjaGFyIG5lZWRfbW9kcm07Ci0gIHVuc2lnbmVkIGNoYXIgdXNlc19mM19wcmVmaXg7Ci0gIGludCBzaXplZmxhZywgb3JpZ19zaXplZmxhZzsKLQotICBzdHJ1Y3QgZGlzX3ByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmluYnVmID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGlmIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTM4NgotICAgICAgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQotICAgIHNpemVmbGFnID0gQUZMQUd8REZMQUc7Ci0gIGVsc2UgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pODA4NikKLSAgICBzaXplZmxhZyA9IDA7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgb3JpZ19zaXplZmxhZyA9IHNpemVmbGFnOwotCi0gIC8qIFRoZSBvdXRwdXQgbG9va3MgYmV0dGVyIGlmIHdlIHB1dCA2IGJ5dGVzIG9uIGEgbGluZSwgc2luY2UgdGhhdAotICAgICBwdXRzIG1vc3QgbG9uZyB3b3JkIGluc3RydWN0aW9ucyBvbiBhIHNpbmdsZSBsaW5lLiAgKi8KLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA2OwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBwYzsKLQotICBvYnVmWzBdID0gMDsKLSAgb3Axb3V0WzBdID0gMDsKLSAgb3Ayb3V0WzBdID0gMDsKLSAgb3Azb3V0WzBdID0gMDsKLQotICBvcF9pbmRleFswXSA9IG9wX2luZGV4WzFdID0gb3BfaW5kZXhbMl0gPSAtMTsKLQotICB0aGVfaW5mbyA9IGluZm87Ci0gIHN0YXJ0X3BjID0gcGM7Ci0gIHN0YXJ0X2NvZGVwID0gaW5idWY7Ci0gIGNvZGVwID0gaW5idWY7Ci0KLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIEdldHRpbmcgaGVyZSBtZWFucyB3ZSB0cmllZCBmb3IgZGF0YSBidXQgZGlkbid0IGdldCBpdC4gIFRoYXQKLSAgICAgICAgIG1lYW5zIHdlIGhhdmUgYW4gaW5jb21wbGV0ZSBpbnN0cnVjdGlvbiBvZiBzb21lIHNvcnQuICBKdXN0Ci0gICAgICAgICBwcmludCB0aGUgZmlyc3QgYnl0ZSBhcyBhIHByZWZpeCBvciBhIC5ieXRlIHBzZXVkby1vcC4gICovCi0gICAgICBpZiAoY29kZXAgPiBpbmJ1ZikKLQl7Ci0JICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEp1c3QgcHJpbnQgdGhlIGZpcnN0IGJ5dGUgYXMgYSAuYnl0ZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIuYnl0ZSAweCV4IiwKLQkJCQkgICAgICh1bnNpZ25lZCBpbnQpIGluYnVmWzBdKTsKLQkgICAgfQotCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgY2twcmVmaXggKCk7Ci0KLSAgaW5zbl9jb2RlcCA9IGNvZGVwOwotCi0gIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMSk7Ci0gIHR3b19zb3VyY2Vfb3BzID0gKCpjb2RlcCA9PSAweDYyKSB8fCAoKmNvZGVwID09IDB4YzgpOwotCi0gIG9idWZwID0gb2J1ZjsKLQotICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0ZXQUlUKQotICAgICAgJiYgKCgqY29kZXAgPCAweGQ4KSB8fCAoKmNvZGVwID4gMHhkZikpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIGZ3YWl0IG5vdCBmb2xsb3dlZCBieSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbi4gIFByaW50IHRoZQotICAgICAgICAgZmlyc3QgcHJlZml4LCB3aGljaCBpcyBwcm9iYWJseSBmd2FpdCBpdHNlbGYuICAqLwotICAgICAgbmFtZSA9IHByZWZpeF9uYW1lIChpbmJ1ZlswXSwgb3JpZ19zaXplZmxhZyk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1I7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKCpjb2RlcCA9PSAweDBmKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMik7Ci0gICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICBkcCA9ICZkaXMzODZfdHdvYnl0ZV9pbnRlbFsqKytjb2RlcF07Ci0gICAgICBlbHNlCi0gICAgICAgIGRwID0gJmRpczM4Nl90d29ieXRlX2F0dFsqKytjb2RlcF07Ci0gICAgICBuZWVkX21vZHJtID0gdHdvYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKLSAgICAgIHVzZXNfZjNfcHJlZml4ID0gdHdvYnl0ZV91c2VzX2YzX3ByZWZpeFsqY29kZXBdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIGRwID0gJmRpczM4Nl9pbnRlbFsqY29kZXBdOwotICAgICAgZWxzZQotICAgICAgICBkcCA9ICZkaXMzODZfYXR0Wypjb2RlcF07Ci0gICAgICBuZWVkX21vZHJtID0gb25lYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKLSAgICAgIHVzZXNfZjNfcHJlZml4ID0gMDsKLSAgICB9Ci0gIGNvZGVwKys7Ci0KLSAgaWYgKCF1c2VzX2YzX3ByZWZpeCAmJiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWikpCi0gICAgewotICAgICAgb2FwcGVuZCAoInJlcHogIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUE5aKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCJyZXBueiAiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX1JFUE5aOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0xPQ0spCi0gICAgewotICAgICAgb2FwcGVuZCAoImxvY2sgIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9MT0NLOwotICAgIH0KLQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKLSAgICBzaXplZmxhZyBePSBERkxBRzsKLQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQUREUikKLSAgICB7Ci0gICAgICBzaXplZmxhZyBePSBBRkxBRzsKLSAgICAgIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgICAgICBvYXBwZW5kICgiYWRkcjMyICIpOwotICAgICAgZWxzZQotCW9hcHBlbmQgKCJhZGRyMTYgIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9BRERSOwotICAgIH0KLQotICBpZiAobmVlZF9tb2RybSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBjb2RlcCArIDEpOwotICAgICAgbW9kID0gKCpjb2RlcCA+PiA2KSAmIDM7Ci0gICAgICByZWcgPSAoKmNvZGVwID4+IDMpICYgNzsKLSAgICAgIHJtID0gKmNvZGVwICYgNzsKLSAgICB9Ci0KLSAgaWYgKGRwLT5uYW1lID09IE5VTEwgJiYgZHAtPmJ5dGVtb2RlMSA9PSBGTE9BVENPREUpCi0gICAgewotICAgICAgZG9mbG9hdCAoc2l6ZWZsYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChkcC0+bmFtZSA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaChkcC0+Ynl0ZW1vZGUyKQotCSAgICB7Ci0JICAgICAgY2FzZSBVU0VfR1JPVVBTOgotCSAgICAgICAgZHAgPSAmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtyZWddOwotCQlicmVhazsKLQkgICAgICBjYXNlIFVTRV9QUkVGSVhfVVNFUl9UQUJMRToKLQkJZHAgPSAmcHJlZml4X3VzZXJfdGFibGVbZHAtPmJ5dGVtb2RlMV1bcHJlZml4ZXMgJiBQUkVGSVhfUkVQWiA/IDEgOiAwXTsKLQkJdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWik7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCW9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBwdXRvcCAoZHAtPm5hbWUsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBvcF9hZCA9IDI7Ci0gICAgICBpZiAoZHAtPm9wMSkKLQkoKmRwLT5vcDEpKGRwLT5ieXRlbW9kZTEsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDJvdXQ7Ci0gICAgICBvcF9hZCA9IDE7Ci0gICAgICBpZiAoZHAtPm9wMikKLQkoKmRwLT5vcDIpKGRwLT5ieXRlbW9kZTIsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDNvdXQ7Ci0gICAgICBvcF9hZCA9IDA7Ci0gICAgICBpZiAoZHAtPm9wMykKLQkoKmRwLT5vcDMpKGRwLT5ieXRlbW9kZTMsIHNpemVmbGFnKTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIGFueSBwcmVmaXhlcyB3ZXJlIG5vdCB1c2VkLiAgSWYgc28sIHByaW50IHRoZSBmaXJzdCBvbmUKLSAgICAgc2VwYXJhdGVseS4gIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlJ2xsIHdpbmQgdXAgcHJpbnRpbmcgYW4KLSAgICAgaW5zdHJ1Y3Rpb24gc3RyZWFtIHdoaWNoIGRvZXMgbm90IHByZWNpc2VseSBjb3JyZXNwb25kIHRvIHRoZQotICAgICBieXRlcyB3ZSBhcmUgZGlzYXNzZW1ibGluZy4gICovCi0gIGlmICgocHJlZml4ZXMgJiB+dXNlZF9wcmVmaXhlcykgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9IElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBvYnVmcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpOwotICBmb3IgKGkgPSBzdHJsZW4gKG9idWYpOyBpIDwgNjsgaSsrKQotICAgIG9hcHBlbmQgKCIgIik7Ci0gIG9hcHBlbmQgKCIgIik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvYnVmKTsKLQotICAvKiBUaGUgZW50ZXIgYW5kIGJvdW5kIGluc3RydWN0aW9ucyBhcmUgcHJpbnRlZCB3aXRoIG9wZXJhbmRzIGluIHRoZSBzYW1lCi0gICAgIG9yZGVyIGFzIHRoZSBpbnRlbCBib29rOyBldmVyeXRoaW5nIGVsc2UgaXMgcHJpbnRlZCBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgaWYgKGludGVsX3N5bnRheCB8fCB0d29fc291cmNlX29wcykKLSAgICB7Ci0gICAgICBmaXJzdCA9IG9wMW91dDsKLSAgICAgIHNlY29uZCA9IG9wMm91dDsKLSAgICAgIHRoaXJkID0gb3Azb3V0OwotICAgICAgb3BfYWQgPSBvcF9pbmRleFswXTsKLSAgICAgIG9wX2luZGV4WzBdID0gb3BfaW5kZXhbMl07Ci0gICAgICBvcF9pbmRleFsyXSA9IG9wX2FkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpcnN0ID0gb3Azb3V0OwotICAgICAgc2Vjb25kID0gb3Ayb3V0OwotICAgICAgdGhpcmQgPSBvcDFvdXQ7Ci0gICAgfQotICBuZWVkY29tbWEgPSAwOwotICBpZiAoKmZpcnN0KQotICAgIHsKLSAgICAgIGlmIChvcF9pbmRleFswXSAhPSAtMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSBvcF9hZGRyZXNzW29wX2luZGV4WzBdXSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGZpcnN0KTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnNlY29uZCkKLSAgICB7Ci0gICAgICBpZiAobmVlZGNvbW1hKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgICAgaWYgKG9wX2luZGV4WzFdICE9IC0xKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbMV1dLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2Vjb25kKTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnRoaXJkKQotICAgIHsKLSAgICAgIGlmIChuZWVkY29tbWEpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgICBpZiAob3BfaW5kZXhbMl0gIT0gLTEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgb3BfYWRkcmVzc1tvcF9pbmRleFsyXV0sIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCB0aGlyZCk7Ci0gICAgfQotICByZXR1cm4gY29kZXAgLSBpbmJ1ZjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZsb2F0X21lbV9hdHRbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGRzIiwKLSAgImZtdWxzIiwKLSAgImZjb21zIiwKLSAgImZjb21wcyIsCi0gICJmc3VicyIsCi0gICJmc3VicnMiLAotICAiZmRpdnMiLAotICAiZmRpdnJzIiwKLSAgLyogIGQ5ICovCi0gICJmbGRzIiwKLSAgIihiYWQpIiwKLSAgImZzdHMiLAotICAiZnN0cHMiLAotICAiZmxkZW52IiwKLSAgImZsZGN3IiwKLSAgImZOc3RlbnYiLAotICAiZk5zdGN3IiwKLSAgLyogZGEgKi8KLSAgImZpYWRkbCIsCi0gICJmaW11bGwiLAotICAiZmljb21sIiwKLSAgImZpY29tcGwiLAotICAiZmlzdWJsIiwKLSAgImZpc3VicmwiLAotICAiZmlkaXZsIiwKLSAgImZpZGl2cmwiLAotICAvKiBkYiAqLwotICAiZmlsZGwiLAotICAiKGJhZCkiLAotICAiZmlzdGwiLAotICAiZmlzdHBsIiwKLSAgIihiYWQpIiwKLSAgImZsZHQiLAotICAiKGJhZCkiLAotICAiZnN0cHQiLAotICAvKiBkYyAqLwotICAiZmFkZGwiLAotICAiZm11bGwiLAotICAiZmNvbWwiLAotICAiZmNvbXBsIiwKLSAgImZzdWJsIiwKLSAgImZzdWJybCIsCi0gICJmZGl2bCIsCi0gICJmZGl2cmwiLAotICAvKiBkZCAqLwotICAiZmxkbCIsCi0gICIoYmFkKSIsCi0gICJmc3RsIiwKLSAgImZzdHBsIiwKLSAgImZyc3RvciIsCi0gICIoYmFkKSIsCi0gICJmTnNhdmUiLAotICAiZk5zdHN3IiwKLSAgLyogZGUgKi8KLSAgImZpYWRkIiwKLSAgImZpbXVsIiwKLSAgImZpY29tIiwKLSAgImZpY29tcCIsCi0gICJmaXN1YiIsCi0gICJmaXN1YnIiLAotICAiZmlkaXYiLAotICAiZmlkaXZyIiwKLSAgLyogZGYgKi8KLSAgImZpbGQiLAotICAiKGJhZCkiLAotICAiZmlzdCIsCi0gICJmaXN0cCIsCi0gICJmYmxkIiwKLSAgImZpbGRsbCIsCi0gICJmYnN0cCIsCi0gICJmaXN0cGxsIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpmbG9hdF9tZW1faW50ZWxbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGQiLAotICAiZm11bCIsCi0gICJmY29tIiwKLSAgImZjb21wIiwKLSAgImZzdWIiLAotICAiZnN1YnIiLAotICAiZmRpdiIsCi0gICJmZGl2ciIsCi0gIC8qICBkOSAqLwotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdCIsCi0gICJmc3RwIiwKLSAgImZsZGVudiIsCi0gICJmbGRjdyIsCi0gICJmTnN0ZW52IiwKLSAgImZOc3RjdyIsCi0gIC8qIGRhICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRiICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiKGJhZCkiLAotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdHAiLAotICAvKiBkYyAqLwotICAiZmFkZCIsCi0gICJmbXVsIiwKLSAgImZjb20iLAotICAiZmNvbXAiLAotICAiZnN1YiIsCi0gICJmc3ViciIsCi0gICJmZGl2IiwKLSAgImZkaXZyIiwKLSAgLyogZGQgKi8KLSAgImZsZCIsCi0gICIoYmFkKSIsCi0gICJmc3QiLAotICAiZnN0cCIsCi0gICJmcnN0b3IiLAotICAiKGJhZCkiLAotICAiZk5zYXZlIiwKLSAgImZOc3RzdyIsCi0gIC8qIGRlICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRmICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiZmJsZCIsCi0gICJmaWxkIiwKLSAgImZic3RwIiwKLSAgImZpc3RwbGwiLAotfTsKLQotI2RlZmluZSBTVCBPUF9TVCwgMAotI2RlZmluZSBTVGkgT1BfU1RpLCAwCi0KLSNkZWZpbmUgRkdSUGQ5XzIgTlVMTCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNCBOVUxMLCBOVUxMLCAxCi0jZGVmaW5lIEZHUlBkOV81IE5VTEwsIE5VTEwsIDIKLSNkZWZpbmUgRkdSUGQ5XzYgTlVMTCwgTlVMTCwgMwotI2RlZmluZSBGR1JQZDlfNyBOVUxMLCBOVUxMLCA0Ci0jZGVmaW5lIEZHUlBkYV81IE5VTEwsIE5VTEwsIDUKLSNkZWZpbmUgRkdSUGRiXzQgTlVMTCwgTlVMTCwgNgotI2RlZmluZSBGR1JQZGVfMyBOVUxMLCBOVUxMLCA3Ci0jZGVmaW5lIEZHUlBkZl80IE5VTEwsIE5VTEwsIDgKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZmxvYXRfcmVnW11bOF0gPSB7Ci0gIC8qIGQ4ICovCi0gIHsKLSAgICB7ICJmYWRkIiwJU1QsIFNUaSB9LAotICAgIHsgImZtdWwiLAlTVCwgU1RpIH0sCi0gICAgeyAiZmNvbSIsCVNUaSB9LAotICAgIHsgImZjb21wIiwJU1RpIH0sCi0gICAgeyAiZnN1YiIsCVNULCBTVGkgfSwKLSAgICB7ICJmc3ViciIsCVNULCBTVGkgfSwKLSAgICB7ICJmZGl2IiwJU1QsIFNUaSB9LAotICAgIHsgImZkaXZyIiwJU1QsIFNUaSB9LAotICB9LAotICAvKiBkOSAqLwotICB7Ci0gICAgeyAiZmxkIiwJU1RpIH0sCi0gICAgeyAiZnhjaCIsCVNUaSB9LAotICAgIHsgRkdSUGQ5XzIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7IEZHUlBkOV80IH0sCi0gICAgeyBGR1JQZDlfNSB9LAotICAgIHsgRkdSUGQ5XzYgfSwKLSAgICB7IEZHUlBkOV83IH0sCi0gIH0sCi0gIC8qIGRhICovCi0gIHsKLSAgICB7ICJmY21vdmIiLAlTVCwgU1RpIH0sCi0gICAgeyAiZmNtb3ZlIiwJU1QsIFNUaSB9LAotICAgIHsgImZjbW92YmUiLFNULCBTVGkgfSwKLSAgICB7ICJmY21vdnUiLAlTVCwgU1RpIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyBGR1JQZGFfNSB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBkYiAqLwotICB7Ci0gICAgeyAiZmNtb3ZuYiIsU1QsIFNUaSB9LAotICAgIHsgImZjbW92bmUiLFNULCBTVGkgfSwKLSAgICB7ICJmY21vdm5iZSIsU1QsIFNUaSB9LAotICAgIHsgImZjbW92bnUiLFNULCBTVGkgfSwKLSAgICB7IEZHUlBkYl80IH0sCi0gICAgeyAiZnVjb21pIiwJU1QsIFNUaSB9LAotICAgIHsgImZjb21pIiwJU1QsIFNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBkYyAqLwotICB7Ci0gICAgeyAiZmFkZCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmbXVsIiwJU1RpLCBTVCB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAotICAgIHsgImZzdWIiLAlTVGksIFNUIH0sCi0gICAgeyAiZnN1YnIiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdiIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2ciIsCVNUaSwgU1QgfSwKLSNlbHNlCi0gICAgeyAiZnN1YnIiLAlTVGksIFNUIH0sCi0gICAgeyAiZnN1YiIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2ciIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2IiwJU1RpLCBTVCB9LAotI2VuZGlmCi0gIH0sCi0gIC8qIGRkICovCi0gIHsKLSAgICB7ICJmZnJlZSIsCVNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgImZzdCIsCVNUaSB9LAotICAgIHsgImZzdHAiLAlTVGkgfSwKLSAgICB7ICJmdWNvbSIsCVNUaSB9LAotICAgIHsgImZ1Y29tcCIsCVNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBkZSAqLwotICB7Ci0gICAgeyAiZmFkZHAiLAlTVGksIFNUIH0sCi0gICAgeyAiZm11bHAiLAlTVGksIFNUIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyBGR1JQZGVfMyB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAotICAgIHsgImZzdWJwIiwJU1RpLCBTVCB9LAotICAgIHsgImZzdWJycCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2cCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2cnAiLAlTVGksIFNUIH0sCi0jZWxzZQotICAgIHsgImZzdWJycCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2cnAiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdnAiLAlTVGksIFNUIH0sCi0jZW5kaWYKLSAgfSwKLSAgLyogZGYgKi8KLSAgewotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgRkdSUGRmXzQgfSwKLSAgICB7ICJmdWNvbWlwIixTVCwgU1RpIH0sCi0gICAgeyAiZmNvbWlwIiwgU1QsIFNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotfTsKLQotCi1zdGF0aWMgY2hhciAqZmdycHNbXVs4XSA9IHsKLSAgLyogZDlfMiAgMCAqLwotICB7Ci0gICAgImZub3AiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZDlfNCAgMSAqLwotICB7Ci0gICAgImZjaHMiLCJmYWJzIiwiKGJhZCkiLCIoYmFkKSIsImZ0c3QiLCJmeGFtIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZDlfNSAgMiAqLwotICB7Ci0gICAgImZsZDEiLCJmbGRsMnQiLCJmbGRsMmUiLCJmbGRwaSIsImZsZGxnMiIsImZsZGxuMiIsImZsZHoiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZDlfNiAgMyAqLwotICB7Ci0gICAgImYyeG0xIiwiZnlsMngiLCJmcHRhbiIsImZwYXRhbiIsImZ4dHJhY3QiLCJmcHJlbTEiLCJmZGVjc3RwIiwiZmluY3N0cCIsCi0gIH0sCi0KLSAgLyogZDlfNyAgNCAqLwotICB7Ci0gICAgImZwcmVtIiwiZnlsMnhwMSIsImZzcXJ0IiwiZnNpbmNvcyIsImZybmRpbnQiLCJmc2NhbGUiLCJmc2luIiwiZmNvcyIsCi0gIH0sCi0KLSAgLyogZGFfNSAgNSAqLwotICB7Ci0gICAgIihiYWQpIiwiZnVjb21wcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZGJfNCAgNiAqLwotICB7Ci0gICAgImZlbmkoMjg3IG9ubHkpIiwiZmRpc2koMjg3IG9ubHkpIiwiZk5jbGV4IiwiZk5pbml0IiwKLSAgICAiZk5zZXRwbSgyODcgb25seSkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGRlXzMgIDcgKi8KLSAgewotICAgICIoYmFkKSIsImZjb21wcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZGZfNCAgOCAqLwotICB7Ci0gICAgImZOc3RzdyIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1kb2Zsb2F0IChzaXplZmxhZykKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBzdHJ1Y3QgZGlzMzg2ICpkcDsKLSAgdW5zaWduZWQgY2hhciBmbG9hdG9wOwotCi0gIGZsb2F0b3AgPSBjb2RlcFstMV07Ci0KLSAgaWYgKG1vZCAhPSAzKQotICAgIHsKLSAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIHB1dG9wIChmbG9hdF9tZW1faW50ZWxbKGZsb2F0b3AgLSAweGQ4ICkgKiA4ICsgcmVnXSwgc2l6ZWZsYWcpOwotICAgICAgZWxzZQotICAgICAgICBwdXRvcCAoZmxvYXRfbWVtX2F0dFsoZmxvYXRvcCAtIDB4ZDggKSAqIDggKyByZWddLCBzaXplZmxhZyk7Ci0gICAgICBvYnVmcCA9IG9wMW91dDsKLSAgICAgIGlmIChmbG9hdG9wID09IDB4ZGIpCi0gICAgICAgIE9QX0UgKHhfbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgZWxzZSBpZiAoZmxvYXRvcCA9PSAweGRkKQotICAgICAgICBPUF9FIChkX21vZGUsIHNpemVmbGFnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgT1BfRSAodl9tb2RlLCBzaXplZmxhZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBjb2RlcCsrOwotCi0gIGRwID0gJmZsb2F0X3JlZ1tmbG9hdG9wIC0gMHhkOF1bcmVnXTsKLSAgaWYgKGRwLT5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgcHV0b3AgKGZncnBzW2RwLT5ieXRlbW9kZTFdW3JtXSwgc2l6ZWZsYWcpOwotCi0gICAgICAvKiBpbnN0cnVjdGlvbiBmbnN0c3cgaXMgb25seSBvbmUgd2l0aCBzdHJhbmdlIGFyZyAqLwotICAgICAgaWYgKGZsb2F0b3AgPT0gMHhkZiAmJiBjb2RlcFstMV0gPT0gMHhlMCkKLQlzdHJjcHkgKG9wMW91dCwgbmFtZXMxNlswXSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHV0b3AgKGRwLT5uYW1lLCBzaXplZmxhZyk7Ci0KLSAgICAgIG9idWZwID0gb3Axb3V0OwotICAgICAgaWYgKGRwLT5vcDEpCi0JKCpkcC0+b3AxKShkcC0+Ynl0ZW1vZGUxLCBzaXplZmxhZyk7Ci0gICAgICBvYnVmcCA9IG9wMm91dDsKLSAgICAgIGlmIChkcC0+b3AyKQotCSgqZHAtPm9wMikoZHAtPmJ5dGVtb2RlMiwgc2l6ZWZsYWcpOwotICAgIH0KLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9TVCAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBvYXBwZW5kICgiJXN0Iik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU1RpIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXN0KCVkKSIsIHJtKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLQotLyogY2FwaXRhbCBsZXR0ZXJzIGluIHRlbXBsYXRlIGFyZSBtYWNyb3MgKi8KLXN0YXRpYyB2b2lkCi1wdXRvcCAodGVtcGxhdGUsIHNpemVmbGFnKQotICAgICBjb25zdCBjaGFyICp0ZW1wbGF0ZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICpwOwotCi0gIGZvciAocCA9IHRlbXBsYXRlOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKnApCi0JewotCWRlZmF1bHQ6Ci0JICAqb2J1ZnArKyA9ICpwOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotCSAgaWYgKG1vZCAhPSAzCi0jaWZkZWYgU1VGRklYX0FMV0FZUwotCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0jZW5kaWYKLQkgICAgICApCi0JICAgICpvYnVmcCsrID0gJ2InOwotCSAgYnJlYWs7Ci0JY2FzZSAnQic6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgICpvYnVmcCsrID0gJ2InOwotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdFJzoJCS8qIEZvciBqY3h6L2plY3h6ICovCi0JICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLQkgICAgKm9idWZwKysgPSAnZSc7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgU1VGRklYX0FMV0FZUwotCSAgaWYgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLQkgICAgKm9idWZwKysgPSAnbCc7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9GV0FJVCkgPT0gMCkKLQkgICAgKm9idWZwKysgPSAnbic7Ci0JICBlbHNlCi0JICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0ZXQUlUOwotCSAgYnJlYWs7Ci0JY2FzZSAnUCc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKQotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgICAgICB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotI2VuZGlmCi0JICAgICAgKQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ1EnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmIChtb2QgIT0gMwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgICAgICB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotI2VuZGlmCi0JICAgICAgKQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJewotCQkgICpvYnVmcCsrID0gJ2QnOwotCQkgICpvYnVmcCsrID0gJ3EnOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKm9idWZwKysgPSAndyc7Ci0JCSAgKm9idWZwKysgPSAnZCc7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgIH0KLQkgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJKm9idWZwKysgPSAnbCc7Ci0JICAgICAgZWxzZQotCQkqb2J1ZnArKyA9ICd3JzsKLQkgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLQkgICAgfQotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdXJzoKLQkgIC8qIG9wZXJhbmQgc2l6ZSBmbGFnIGZvciBjd3RsLCBjYnR3ICovCi0JICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkgICAgKm9idWZwKysgPSAndyc7Ci0JICBlbHNlCi0JICAgICpvYnVmcCsrID0gJ2InOwotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJewotCQkgICpvYnVmcCsrID0gJ2QnOwotCQkgICpvYnVmcCsrID0gJ2UnOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKm9idWZwKysgPSAndyc7Ci0JCX0KLQkgICAgfQotCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAqb2J1ZnAgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotb2FwcGVuZCAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgc3RyY3B5IChvYnVmcCwgcyk7Ci0gIG9idWZwICs9IHN0cmxlbiAocyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcHBlbmRfc2VnICgpCi17Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9DUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJWNzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfQ1M7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRFMpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVkczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0RTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX1NTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlc3M6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9TUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9FUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJWVzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfRVM7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRlMpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVmczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0ZTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0dTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZ3M6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9HUzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9pbmRpckUgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmICghaW50ZWxfc3ludGF4KQotICAgIG9hcHBlbmQgKCIqIik7Ci0gIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgZGlzcDsKLQotICAvKiBza2lwIG1vZC9ybSBieXRlICovCi0gIGNvZGVwKys7Ci0KLSAgaWYgKG1vZCA9PSAzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYnl0ZW1vZGUpCi0JewotCWNhc2UgYl9tb2RlOgotCSAgb2FwcGVuZCAobmFtZXM4W3JtXSk7Ci0JICBicmVhazsKLQljYXNlIHdfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzMTZbcm1dKTsKLQkgIGJyZWFrOwotCWNhc2UgZF9tb2RlOgotCSAgb2FwcGVuZCAobmFtZXMzMltybV0pOwotCSAgYnJlYWs7Ci0JY2FzZSB2X21vZGU6Ci0JICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkgICAgb2FwcGVuZCAobmFtZXMzMltybV0pOwotCSAgZWxzZQotCSAgICBvYXBwZW5kIChuYW1lczE2W3JtXSk7Ci0JICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLQkgIGJyZWFrOwotCWNhc2UgMDoKLQkgIGlmICggIShjb2RlcFstMl0gPT0gMHhBRSAmJiBjb2RlcFstMV0gPT0gMHhGOCAvKiBzZmVuY2UgKi8pKQotCSAgICBCYWRPcCgpOwkvKiBiYWQgc2ZlbmNlLGxlYSxsZHMsbGVzLGxmcyxsZ3MsbHNzIG1vZHJtICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGlzcCA9IDA7Ci0gIGFwcGVuZF9zZWcgKCk7Ci0KLSAgaWYgKHNpemVmbGFnICYgQUZMQUcpIC8qIDMyIGJpdCBhZGRyZXNzIG1vZGUgKi8KLSAgICB7Ci0gICAgICBpbnQgaGF2ZXNpYjsKLSAgICAgIGludCBoYXZlYmFzZTsKLSAgICAgIGludCBiYXNlOwotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIGludCBzY2FsZSA9IDA7Ci0KLSAgICAgIGhhdmVzaWIgPSAwOwotICAgICAgaGF2ZWJhc2UgPSAxOwotICAgICAgYmFzZSA9IHJtOwotCi0gICAgICBpZiAoYmFzZSA9PSA0KQotCXsKLQkgIGhhdmVzaWIgPSAxOwotCSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0JICBzY2FsZSA9ICgqY29kZXAgPj4gNikgJiAzOwotCSAgaW5kZXggPSAoKmNvZGVwID4+IDMpICYgNzsKLQkgIGJhc2UgPSAqY29kZXAgJiA3OwotCSAgY29kZXArKzsKLQl9Ci0KLSAgICAgIHN3aXRjaCAobW9kKQotCXsKLQljYXNlIDA6Ci0JICBpZiAoYmFzZSA9PSA1KQotCSAgICB7Ci0JICAgICAgaGF2ZWJhc2UgPSAwOwotCSAgICAgIGRpc3AgPSBnZXQzMiAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0JICBkaXNwID0gKmNvZGVwKys7Ci0JICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQotCSAgICBkaXNwIC09IDB4MTAwOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgZGlzcCA9IGdldDMyICgpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoIWludGVsX3N5bnRheCkKLSAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIGRpc3ApOwotICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgfQotCi0gICAgICBpZiAoaGF2ZWJhc2UgfHwgKGhhdmVzaWIgJiYgKGluZGV4ICE9IDQgfHwgc2NhbGUgIT0gMCkpKQotCXsKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIGJfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIkJZVEUgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB3X21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Ugdl9tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiRFdPUkQgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBkX21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJRV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIHhfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIlhXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotCSAgKm9idWZwKysgPSBvcGVuX2NoYXI7Ci0gICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQkgIGlmIChoYXZlYmFzZSkKLQkgICAgb2FwcGVuZCAobmFtZXMzMltiYXNlXSk7Ci0JICBpZiAoaGF2ZXNpYikKLQkgICAgewotCSAgICAgIGlmIChpbmRleCAhPSA0KQotCQl7Ci0gICAgICAgICAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmViYXNlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAqb2J1ZnArKyA9IHNlcGFyYXRvcl9jaGFyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlcyIsIG5hbWVzMzJbaW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotCQkgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiwlcyIsIG5hbWVzMzJbaW5kZXhdKTsKLQkJICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLQkJfQotICAgICAgICAgICAgICBpZiAoIWludGVsX3N5bnRheAotICAgICAgICAgICAgICAgICAgfHwgKGludGVsX3N5bnRheAotICAgICAgICAgICAgICAgICAgICAgICYmIGJ5dGVtb2RlICE9IGJfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICYmIGJ5dGVtb2RlICE9IHdfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICYmIGJ5dGVtb2RlICE9IHZfbW9kZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKm9idWZwKysgPSBzY2FsZV9jaGFyOwotICAgICAgICAgICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQkgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgMSA8PCBzY2FsZSk7Ci0JICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgICAgIH0KLQkgICAgfQotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBpZiAobW9kICE9IDAgfHwgYmFzZSA9PSA1KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRG9uJ3QgcHJpbnQgemVybyBkaXNwbGFjZW1lbnRzICovCi0gICAgICAgICAgICAgICAgaWYgKGRpc3AgPiAwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiKyVkIiwgZGlzcCk7Ci0gICAgICAgICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpc3AgPCAwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJWQiLCBkaXNwKTsKLSAgICAgICAgICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotCSAgKm9idWZwKysgPSBjbG9zZV9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JfQotICAgICAgZWxzZSBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKLSAgICAgICAgICAgIHsKLQkgICAgICBpZiAocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX1NTIHwgUFJFRklYX0RTCi0JCQkgICAgICB8IFBSRUZJWF9FUyB8IFBSRUZJWF9GUyB8IFBSRUZJWF9HUykpCi0JCTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBvYXBwZW5kIChuYW1lc19zZWdbM10pOwotCQkgIG9hcHBlbmQgKCI6Iik7Ci0JCX0KLSAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7IC8qIDE2IGJpdCBhZGRyZXNzIG1vZGUgKi8KLSAgICAgIHN3aXRjaCAobW9kKQotCXsKLQljYXNlIDA6Ci0JICBpZiAocm0gPT0gNikKLQkgICAgewotCSAgICAgIGRpc3AgPSBnZXQxNiAoKTsKLQkgICAgICBpZiAoKGRpc3AgJiAweDgwMDApICE9IDApCi0JCWRpc3AgLT0gMHgxMDAwMDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0JICBkaXNwID0gKmNvZGVwKys7Ci0JICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQotCSAgICBkaXNwIC09IDB4MTAwOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgZGlzcCA9IGdldDE2ICgpOwotCSAgaWYgKChkaXNwICYgMHg4MDAwKSAhPSAwKQotCSAgICBkaXNwIC09IDB4MTAwMDA7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghaW50ZWxfc3ludGF4KQotICAgICAgICBpZiAobW9kICE9IDAgfHwgcm0gPT0gNikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJWQiLCBkaXNwKTsKLSAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgIH0KLQotICAgICAgaWYgKG1vZCAhPSAwIHx8IHJtICE9IDYpCi0JewotCSAgKm9idWZwKysgPSBvcGVuX2NoYXI7Ci0gICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQkgIG9hcHBlbmQgKGluZGV4MTZbcm1dKTsKLSAgICAgICAgICAqb2J1ZnArKyA9IGNsb3NlX2NoYXI7Ci0gICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotT1BfRyAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgc3dpdGNoIChieXRlbW9kZSkKLSAgICB7Ci0gICAgY2FzZSBiX21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczhbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHdfbW9kZToKLSAgICAgIG9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGRfbW9kZToKLSAgICAgIG9hcHBlbmQgKG5hbWVzMzJbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCW9hcHBlbmQgKG5hbWVzMzJbcmVnXSk7Ci0gICAgICBlbHNlCi0Jb2FwcGVuZCAobmFtZXMxNltyZWddKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWdldDMyICgpCi17Ci0gIGludCB4ID0gMDsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyA0KTsKLSAgeCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDE2OwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDI0OwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGludAotZ2V0MTYgKCkKLXsKLSAgaW50IHggPSAwOwotCi0gIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDIpOwotICB4ID0gKmNvZGVwKysgJiAweGZmOwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDg7Ci0gIHJldHVybiB4OwotfQotCi1zdGF0aWMgdm9pZAotc2V0X29wIChvcCkKLSAgICAgdW5zaWduZWQgaW50IG9wOwotewotICBvcF9pbmRleFtvcF9hZF0gPSBvcF9hZDsKLSAgb3BfYWRkcmVzc1tvcF9hZF0gPSBvcDsKLX0KLQotc3RhdGljIHZvaWQKLU9QX1JFRyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIGluZGlyX2R4X3JlZzoKLSAgICAgIHMgPSAiKCVkeCkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBheF9yZWc6IGNhc2UgY3hfcmVnOiBjYXNlIGR4X3JlZzogY2FzZSBieF9yZWc6Ci0gICAgY2FzZSBzcF9yZWc6IGNhc2UgYnBfcmVnOiBjYXNlIHNpX3JlZzogY2FzZSBkaV9yZWc6Ci0gICAgICBzID0gbmFtZXMxNltjb2RlIC0gYXhfcmVnXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZXNfcmVnOiBjYXNlIHNzX3JlZzogY2FzZSBjc19yZWc6Ci0gICAgY2FzZSBkc19yZWc6IGNhc2UgZnNfcmVnOiBjYXNlIGdzX3JlZzoKLSAgICAgIHMgPSBuYW1lc19zZWdbY29kZSAtIGVzX3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGFsX3JlZzogY2FzZSBhaF9yZWc6IGNhc2UgY2xfcmVnOiBjYXNlIGNoX3JlZzoKLSAgICBjYXNlIGRsX3JlZzogY2FzZSBkaF9yZWc6IGNhc2UgYmxfcmVnOiBjYXNlIGJoX3JlZzoKLSAgICAgIHMgPSBuYW1lczhbY29kZSAtIGFsX3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGVBWF9yZWc6IGNhc2UgZUNYX3JlZzogY2FzZSBlRFhfcmVnOiBjYXNlIGVCWF9yZWc6Ci0gICAgY2FzZSBlU1BfcmVnOiBjYXNlIGVCUF9yZWc6IGNhc2UgZVNJX3JlZzogY2FzZSBlRElfcmVnOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JcyA9IG5hbWVzMzJbY29kZSAtIGVBWF9yZWddOwotICAgICAgZWxzZQotCXMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHMgPSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1I7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIG9hcHBlbmQgKHMpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfSSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IG9wOwotCi0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBvcCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugdl9tb2RlOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0Jb3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQlvcCA9IGdldDE2ICgpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHdfbW9kZToKLSAgICAgIG9wID0gZ2V0MTYgKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGludGVsX3N5bnRheCkKLSAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9wKTsKLSAgZWxzZQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCIsIG9wKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gIHNjcmF0Y2hidWZbMF0gPSAnXDAnOwotfQotCi1zdGF0aWMgdm9pZAotT1Bfc0kgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvcDsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgb3AgPSAqY29kZXArKzsKLSAgICAgIGlmICgob3AgJiAweDgwKSAhPSAwKQotCW9wIC09IDB4MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlvcCA9IGdldDMyICgpOwotICAgICAgZWxzZQotCXsKLQkgIG9wID0gZ2V0MTYoKTsKLQkgIGlmICgob3AgJiAweDgwMDApICE9IDApCi0JICAgIG9wIC09IDB4MTAwMDA7Ci0JfQotICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHdfbW9kZToKLSAgICAgIG9wID0gZ2V0MTYgKCk7Ci0gICAgICBpZiAoKG9wICYgMHg4MDAwKSAhPSAwKQotCW9wIC09IDB4MTAwMDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgb3ApOwotICBlbHNlCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiQweCV4Iiwgb3ApOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0ogKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBkaXNwOwotICBpbnQgbWFzayA9IC0xOwotCi0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBkaXNwID0gKmNvZGVwKys7Ci0gICAgICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQotCWRpc3AgLT0gMHgxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCWRpc3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBkaXNwID0gZ2V0MTYgKCk7Ci0JICAvKiBmb3Igc29tZSByZWFzb24sIGEgZGF0YTE2IHByZWZpeCBvbiBhIGp1bXAgaW5zdHJ1Y3Rpb24KLQkgICAgIG1lYW5zIHRoYXQgdGhlIHBjIGlzIG1hc2tlZCB0byAxNiBiaXRzIGFmdGVyIHRoZQotCSAgICAgZGlzcGxhY2VtZW50IGlzIGFkZGVkISAgKi8KLQkgIG1hc2sgPSAweGZmZmY7Ci0JfQotICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGRpc3AgPSAoc3RhcnRfcGMgKyBjb2RlcCAtIHN0YXJ0X2NvZGVwICsgZGlzcCkgJiBtYXNrOwotICBzZXRfb3AgKGRpc3ApOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIGRpc3ApOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9TRUcgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15OwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHN0YXRpYyBjaGFyICpzcmVnW10gPSB7Ci0gICAgIiVlcyIsIiVjcyIsIiVzcyIsIiVkcyIsIiVmcyIsIiVncyIsIiU/IiwiJT8iLAotICB9OwotCi0gIG9hcHBlbmQgKHNyZWdbcmVnXSk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfRElSIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgc2VnLCBvZmZzZXQ7Ci0KLSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0gICAgewotICAgICAgb2Zmc2V0ID0gZ2V0MzIgKCk7Ci0gICAgICBzZWcgPSBnZXQxNiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXQgPSBnZXQxNiAoKTsKLSAgICAgIHNlZyA9IGdldDE2ICgpOwotICAgIH0KLSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCwkMHgleCIsIHNlZywgb2Zmc2V0KTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfT0ZGIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvZmY7Ci0KLSAgYXBwZW5kX3NlZyAoKTsKLQotICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLSAgICBvZmYgPSBnZXQzMiAoKTsKLSAgZWxzZQotICAgIG9mZiA9IGdldDE2ICgpOwotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgewotICAgICAgaWYgKCEocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX1NTIHwgUFJFRklYX0RTCi0JCSAgICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKSkKLQl7Ci0JICBvYXBwZW5kIChuYW1lc19zZWdbM10pOwotCSAgb2FwcGVuZCAoIjoiKTsKLQl9Ci0gICAgfQotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9mZik7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIG9hcHBlbmQgKCIoIik7Ci0gIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgIHMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgZWxzZQotICAgIHMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKLSAgb2FwcGVuZCAocyk7Ci0gIG9hcHBlbmQgKCIpIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FU3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIG9hcHBlbmQgKCIlZXM6Iik7Ci0gIHB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0RTcmVnIChjb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKChwcmVmaXhlcwotICAgICAgICYgKFBSRUZJWF9DUwotCSAgfCBQUkVGSVhfRFMKLQkgIHwgUFJFRklYX1NTCi0JICB8IFBSRUZJWF9FUwotCSAgfCBQUkVGSVhfRlMKLQkgIHwgUFJFRklYX0dTKSkgPT0gMCkKLSAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7Ci0gIGFwcGVuZF9zZWcoKTsKLSAgcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX0MgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15OwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJWNyJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9EIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVkYiVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfVCAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXk7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUldHIlZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfUmQgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgPT0gMykKLSAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICBlbHNlCi0gICAgQmFkT3AoKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX01NWCAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVtbSVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9YTU0gKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXhtbSVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FTSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKG1vZCAhPSAzKQotICAgIHsKLSAgICAgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvZGVwKys7Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJW1tJWQiLCBybSk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRVggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgIT0gMykKLSAgICB7Ci0gICAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2RlcCsrOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSV4bW0lZCIsIHJtKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9NUyAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKG1vZCA9PSAzKQotICAgIE9QX0VNIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICBlbHNlCi0gICAgQmFkT3AoKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKlN1ZmZpeDNETm93W10gPSB7Ci0vKiAwMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMDQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDA4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAwQyAqLwlOVUxMLAkJInBpMmZkIiwJTlVMTCwJCU5VTEwsCi0vKiAxMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDE4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAxQyAqLwlOVUxMLAkJInBmMmlkIiwJTlVMTCwJCU5VTEwsCi0vKiAyMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAyQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAzOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogM0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA0NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDRDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA2OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDcwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA3NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDdDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogODQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDg4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogOTAgKi8JInBmY21wZ2UiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA5NCAqLwkicGZtaW4iLAlOVUxMLAkJInBmcmNwIiwJInBmcnNxcnQiLAotLyogOTggKi8JTlVMTCwJCU5VTEwsCQkicGZzdWIiLAlOVUxMLAotLyogOUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhZGQiLAlOVUxMLAotLyogQTAgKi8JInBmY21wZ3QiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBBNCAqLwkicGZtYXgiLAlOVUxMLAkJInBmcmNwaXQxIiwJInBmcnNxaXQxIiwKLS8qIEE4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViciIsCU5VTEwsCi0vKiBBQyAqLwlOVUxMLAkJTlVMTCwJCSJwZmFjYyIsCU5VTEwsCi0vKiBCMCAqLwkicGZjbXBlcSIsCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEI0ICovCSJwZm11bCIsCU5VTEwsCQkicGZyY3BpdDIiLAkicGZtdWxocnciLAotLyogQjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEJDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCSJwYXZndXNiIiwKLS8qIEMwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBDNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIENDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBEMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRDQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEQ4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBEQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEU0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRUMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEYwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEZDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi19OwotCi1zdGF0aWMgdm9pZAotT1BfM0ROb3dTdWZmaXggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKm1uZW1vbmljOwotCi0gIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAvKiBBTUQgM0ROb3chIGluc3RydWN0aW9ucyBhcmUgc3BlY2lmaWVkIGJ5IGFuIG9wY29kZSBzdWZmaXggaW4gdGhlCi0gICAgIHBsYWNlIHdoZXJlIGFuIDgtYml0IGltbWVkaWF0ZSB3b3VsZCBub3JtYWxseSBnby4gIGllLiB0aGUgbGFzdAotICAgICBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgbW5lbW9uaWMgPSBTdWZmaXgzRE5vd1sqY29kZXArKyAmIDB4ZmZdOwotICBpZiAobW5lbW9uaWMpCi0gICAgb2FwcGVuZCAobW5lbW9uaWMpOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2luY2UgYSB2YXJpYWJsZSBzaXplZCBtb2RybS9zaWIgY2h1bmsgaXMgYmV0d2VlbiB0aGUgc3RhcnQKLQkgb2YgdGhlIG9wY29kZSAoMHgwZjBmKSBhbmQgdGhlIG9wY29kZSBzdWZmaXgsIHdlIG5lZWQgdG8gZG8KLQkgYWxsIHRoZSBtb2RybSBwcm9jZXNzaW5nIGZpcnN0LCBhbmQgZG9uJ3Qga25vdyB1bnRpbCBub3cgdGhhdAotCSB3ZSBoYXZlIGEgYmFkIG9wY29kZS4gIFRoaXMgbmVjZXNzaXRhdGVzIHNvbWUgY2xlYW5pbmcgdXAuICAqLwotICAgICAgb3Axb3V0WzBdID0gJ1wwJzsKLSAgICAgIG9wMm91dFswXSA9ICdcMCc7Ci0gICAgICBCYWRPcCgpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2ltZF9jbXBfb3AgW10gPSB7Ci0gICJlcSIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJ1bm9yZCIsCi0gICJuZXEiLAotICAibmx0IiwKLSAgIm5sZSIsCi0gICJvcmQiCi19OwotCi1zdGF0aWMgdm9pZAotT1BfU0lNRF9TdWZmaXggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHVuc2lnbmVkIGludCBjbXBfdHlwZTsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgb2J1ZnAgPSBvYnVmICsgc3RybGVuKG9idWYpOwotICBjbXBfdHlwZSA9ICpjb2RlcCsrICYgMHhmZjsKLSAgaWYgKGNtcF90eXBlIDwgOCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiY21wJXMlY3MiLAotCSAgICAgICBzaW1kX2NtcF9vcFtjbXBfdHlwZV0sCi0JICAgICAgIHByZWZpeGVzICYgUFJFRklYX1JFUFogPyAncycgOiAncCcpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWik7Ci0gICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgYmFkIGV4dGVuc2lvbiBieXRlLiAgQ2xlYW4gdXAuICAqLwotICAgICAgb3Axb3V0WzBdID0gJ1wwJzsKLSAgICAgIG9wMm91dFswXSA9ICdcMCc7Ci0gICAgICBCYWRPcCgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLVNJTURfRml4dXAgKGV4dHJhY2hhciwgc2l6ZWZsYWcpCi0gICAgIGludCBleHRyYWNoYXI7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgLyogQ2hhbmdlIG1vdmxwcy9tb3ZocHMgdG8gbW92aGxwcy9tb3ZsaHBzIGZvciAyIHJlZ2lzdGVyIG9wZXJhbmQKLSAgICAgZm9ybXMgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgaWYgKG1vZCA9PSAzKQotICAgIHsKLSAgICAgIGNoYXIgKnAgPSBvYnVmICsgc3RybGVuKG9idWYpOwotICAgICAgKihwKzEpID0gJ1wwJzsKLSAgICAgICpwICAgICA9ICoocC0xKTsKLSAgICAgICoocC0xKSA9ICoocC0yKTsKLSAgICAgICoocC0yKSA9ICoocC0zKTsKLSAgICAgICoocC0zKSA9IGV4dHJhY2hhcjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEJhZE9wICh2b2lkKQotewotICBjb2RlcCA9IGluc25fY29kZXAgKyAxOwkvKiB0aHJvdyBhd2F5IHByZWZpeGVzIGFuZCAxc3QuIG9wY29kZSBieXRlICovCi0gIG9hcHBlbmQgKCIoYmFkKSIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pOTYwLWRpcy5jIGIvb3Bjb2Rlcy9pOTYwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJkODQ4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaTk2MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBpODA5NjAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IHsKLS8qICAwICovCSJwZnAiLCAic3AiLCAgInJpcCIsICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLCAKLS8qICA4ICovCSJyOCIsICAicjkiLCAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwKLS8qIDE2ICovCSJnMCIsICAiZzEiLCAgImcyIiwgICJnMyIsICAiZzQiLCAgImc1IiwgICJnNiIsICAiZzciLCAKLS8qIDI0ICovCSJnOCIsICAiZzkiLCAgImcxMCIsICJnMTEiLCAiZzEyIiwgImcxMyIsICJnMTQiLCAiZnAiLCAKLS8qIDMyICovCSJwYyIsICAiYWMiLCAgImlwIiwgICJ0YyIsICAiZnAwIiwgImZwMSIsICJmcDIiLCAiZnAzIiAKLX07Ci0KLQotc3RhdGljIEZJTEUgKnN0cmVhbTsJCS8qIE91dHB1dCBnb2VzIGhlcmUgKi8KLXN0YXRpYyBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHIoKTsKLXN0YXRpYyB2b2lkIGN0cmwoKTsKLXN0YXRpYyB2b2lkIGNvYnIoKTsKLXN0YXRpYyB2b2lkIHJlZygpOwotc3RhdGljIGludCBtZW0oKTsKLXN0YXRpYyB2b2lkIGVhKCk7Ci1zdGF0aWMgdm9pZCBkc3RvcCgpOwotc3RhdGljIHZvaWQgcmVnb3AoKTsKLXN0YXRpYyB2b2lkIGludmFsaWQoKTsKLXN0YXRpYyBpbnQgcGluc24oKTsKLXN0YXRpYyB2b2lkIHB1dF9hYnMoKTsKLQotCi0vKiBQcmludCB0aGUgaTk2MCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICdtZW1hZGRyJyBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2k5NjAgKG1lbWFkZHIsIGluZm9fYXJnKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mb19hcmc7Ci17Ci0gIHVuc2lnbmVkIGludCB3b3JkMSwgd29yZDIgPSAweGRlYWRiZWVmOwotICBiZmRfYnl0ZSBidWZmZXJbOF07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaW5mbyA9IGluZm9fYXJnOwotICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0KLSAgLyogUmVhZCB3b3JkMS4gIE9ubHkgcmVhZCB3b3JkMiBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgbmVlZHMgaXQsIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCAoYmZkX2J5dGUgKikgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICB3b3JkMSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLSAgLyogRGl2aWRlIGluc3RydWN0aW9uIHNldCBpbnRvIGNsYXNzZXMgYmFzZWQgb24gaGlnaCA0IGJpdHMgb2Ygb3Bjb2RlLiAgKi8KLSAgc3dpdGNoICggKHdvcmQxID4+IDI4KSAmIDB4ZiApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODoKLSAgICBjYXNlIDB4OToKLSAgICBjYXNlIDB4YToKLSAgICBjYXNlIDB4YjoKLSAgICBjYXNlIDB4YzoKLSAgICAgIC8qIFJlYWQgd29yZDIuICAqLwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShtZW1hZGRyICsgNCwgKGJmZF9ieXRlICopIChidWZmZXIgKyA0KSwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgd29yZDIgPSBiZmRfZ2V0bDMyIChidWZmZXIgKyA0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcGluc24oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApOwotfQotDAotI2RlZmluZSBJTl9HREIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglBbGwgY29kZSBiZWxvdyB0aGlzIHBvaW50IHNob3VsZCBiZSBpZGVudGljYWwgd2l0aCB0aGF0IG9mCi0gKgl0aGUgZGlzYXNzZW1ibGVyIGluIGdkbXA5NjAuCi0KLSBBIG5vYmxlIHNlbnRpbWVudCwgYnV0IGF0IGxlYXN0IGluIGNvc21ldGljIHdheXMgKGluZm8tPmZwcmludGZfZnVuYyksIGl0Ci0ganVzdCBhaW4ndCBzby4gLWtpbmdkb24sIDMxIE1hciA5MwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgdGFiZW50IHsKLSAgY2hhciAqbmFtZTsKLSAgc2hvcnQgbnVtb3BzOwotfTsKLQotc3RydWN0IHNwYXJzZV90YWJlbnQgewotICBpbnQgb3Bjb2RlOwotICBjaGFyICpuYW1lOwotICBzaG9ydCBudW1vcHM7Ci19OwotCi1zdGF0aWMgaW50Ci1waW5zbiggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IGluc3RyX2xlbjsKLQotCWluc3RyX2xlbiA9IDQ7Ci0JcHV0X2Ficyggd29yZDEsIHdvcmQyICk7Ci0KLQkvKiBEaXZpZGUgaW5zdHJ1Y3Rpb24gc2V0IGludG8gY2xhc3NlcyBiYXNlZCBvbiBoaWdoIDQgYml0cyBvZiBvcGNvZGUqLwotCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKLQljYXNlIDB4MDoKLQljYXNlIDB4MToKLQkJY3RybCggbWVtYWRkciwgd29yZDEsIHdvcmQyICk7Ci0JCWJyZWFrOwotCWNhc2UgMHgyOgotCWNhc2UgMHgzOgotCQljb2JyKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDU6Ci0JY2FzZSAweDY6Ci0JY2FzZSAweDc6Ci0JCXJlZyggd29yZDEgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDg6Ci0JY2FzZSAweDk6Ci0JY2FzZSAweGE6Ci0JY2FzZSAweGI6Ci0JY2FzZSAweGM6Ci0JCWluc3RyX2xlbiA9IG1lbSggbWVtYWRkciwgd29yZDEsIHdvcmQyLCAwICk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGludmFsaWQgaW5zdHJ1Y3Rpb24sIHByaW50IGFzIGRhdGEgd29yZCAqLyAKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBpbnN0cl9sZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ1RSTCBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWN0cmwoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotCWludCBpOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFiZW50IGN0cmxfdGFiW10gPSB7Ci0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAwICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAxICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAyICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAzICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA0ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA1ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA2ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA3ICovCi0JICB7ICJiIiwJCTEsIH0sCS8qIDB4MDggKi8KLQkgIHsgImNhbGwiLAkJMSwgfSwJLyogMHgwOSAqLwotCSAgeyAicmV0IiwJCTAsIH0sCS8qIDB4MGEgKi8KLQkgIHsgImJhbCIsCQkxLCB9LAkvKiAweDBiICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBjICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBkICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBlICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBmICovCi0JICB7ICJibm8iLAkJMSwgfSwJLyogMHgxMCAqLwotCSAgeyAiYmciLAkJMSwgfSwJLyogMHgxMSAqLwotCSAgeyAiYmUiLAkJMSwgfSwJLyogMHgxMiAqLwotCSAgeyAiYmdlIiwJCTEsIH0sCS8qIDB4MTMgKi8KLQkgIHsgImJsIiwJCTEsIH0sCS8qIDB4MTQgKi8KLQkgIHsgImJuZSIsCQkxLCB9LAkvKiAweDE1ICovCi0JICB7ICJibGUiLAkJMSwgfSwJLyogMHgxNiAqLwotCSAgeyAiYm8iLAkJMSwgfSwJLyogMHgxNyAqLwotCSAgeyAiZmF1bHRubyIsCQkwLCB9LAkvKiAweDE4ICovCi0JICB7ICJmYXVsdGciLAkJMCwgfSwJLyogMHgxOSAqLwotCSAgeyAiZmF1bHRlIiwJCTAsIH0sCS8qIDB4MWEgKi8KLQkgIHsgImZhdWx0Z2UiLAkJMCwgfSwJLyogMHgxYiAqLwotCSAgeyAiZmF1bHRsIiwJCTAsIH0sCS8qIDB4MWMgKi8KLQkgIHsgImZhdWx0bmUiLAkJMCwgfSwJLyogMHgxZCAqLwotCSAgeyAiZmF1bHRsZSIsCQkwLCB9LAkvKiAweDFlICovCi0JICB7ICJmYXVsdG8iLAkJMCwgfSwJLyogMHgxZiAqLwotCX07Ci0KLQlpID0gKHdvcmQxID4+IDI0KSAmIDB4ZmY7Ci0JaWYgKCAoY3RybF90YWJbaV0ubmFtZSA9PSBOVUxMKSB8fCAoKHdvcmQxICYgMSkgIT0gMCkgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgY3RybF90YWJbaV0ubmFtZSApOwotCWlmICggd29yZDEgJiAyICl7CQkvKiBQcmVkaWN0cyBicmFuY2ggbm90IHRha2VuICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgIi5mIiApOwotCX0KLQotCWlmICggY3RybF90YWJbaV0ubnVtb3BzID09IDEgKXsKLQkJLyogRVhUUkFDVCBESVNQTEFDRU1FTlQgQU5EIENPTlZFUlQgVE8gQUREUkVTUyAqLwotCQl3b3JkMSAmPSAweDAwZmZmZmZmOwotCQlpZiAoIHdvcmQxICYgMHgwMDgwMDAwMCApewkJLyogU2lnbiBiaXQgaXMgc2V0ICovCi0JCQl3b3JkMSB8PSAoLTEgJiB+MHhmZmZmZmYpOwkvKiBTaWduIGV4dGVuZCAqLwotCQl9Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0JCXByaW50X2FkZHIoIHdvcmQxICsgbWVtYWRkciApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBDT0JSIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY29iciggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IHNyYzE7Ci0JaW50IHNyYzI7Ci0JaW50IGk7Ci0KLQlzdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudCBjb2JyX3RhYltdID0gewotCSAgeyAidGVzdG5vIiwJMSwgfSwJLyogMHgyMCAqLwotCSAgeyAidGVzdGciLAkxLCB9LAkvKiAweDIxICovCi0JICB7ICJ0ZXN0ZSIsCTEsIH0sCS8qIDB4MjIgKi8KLQkgIHsgInRlc3RnZSIsCTEsIH0sCS8qIDB4MjMgKi8KLQkgIHsgInRlc3RsIiwJMSwgfSwJLyogMHgyNCAqLwotCSAgeyAidGVzdG5lIiwJMSwgfSwJLyogMHgyNSAqLwotCSAgeyAidGVzdGxlIiwJMSwgfSwJLyogMHgyNiAqLwotCSAgeyAidGVzdG8iLAkxLCB9LAkvKiAweDI3ICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MjggKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyOSAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJhICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmIgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyYyAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJkICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmUgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyZiAqLwotCSAgeyAiYmJjIiwJMywgfSwJLyogMHgzMCAqLwotCSAgeyAiY21wb2JnIiwJMywgfSwJLyogMHgzMSAqLwotCSAgeyAiY21wb2JlIiwJMywgfSwJLyogMHgzMiAqLwotCSAgeyAiY21wb2JnZSIsCTMsIH0sCS8qIDB4MzMgKi8KLQkgIHsgImNtcG9ibCIsCTMsIH0sCS8qIDB4MzQgKi8KLQkgIHsgImNtcG9ibmUiLAkzLCB9LAkvKiAweDM1ICovCi0JICB7ICJjbXBvYmxlIiwJMywgfSwJLyogMHgzNiAqLwotCSAgeyAiYmJzIiwJMywgfSwJLyogMHgzNyAqLwotCSAgeyAiY21waWJubyIsCTMsIH0sCS8qIDB4MzggKi8KLQkgIHsgImNtcGliZyIsCTMsIH0sCS8qIDB4MzkgKi8KLQkgIHsgImNtcGliZSIsCTMsIH0sCS8qIDB4M2EgKi8KLQkgIHsgImNtcGliZ2UiLAkzLCB9LAkvKiAweDNiICovCi0JICB7ICJjbXBpYmwiLAkzLCB9LAkvKiAweDNjICovCi0JICB7ICJjbXBpYm5lIiwJMywgfSwJLyogMHgzZCAqLwotCSAgeyAiY21waWJsZSIsCTMsIH0sCS8qIDB4M2UgKi8KLQkgIHsgImNtcGlibyIsCTMsIH0sCS8qIDB4M2YgKi8KLQl9OwotCi0JaSA9ICgod29yZDEgPj4gMjQpICYgMHhmZikgLSAweDIwOwotCWlmICggY29icl90YWJbaV0ubmFtZSA9PSBOVUxMICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sIGNvYnJfdGFiW2ldLm5hbWUgKTsKLQlpZiAoIHdvcmQxICYgMiApewkJLyogUHJlZGljdHMgYnJhbmNoIG5vdCB0YWtlbiAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sICIuZiIgKTsKLQl9Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJcdCIgKTsKLQotCXNyYzEgPSAod29yZDEgPj4gMTkpICYgMHgxZjsKLQlzcmMyID0gKHdvcmQxID4+IDE0KSAmIDB4MWY7Ci0KLQlpZiAoIHdvcmQxICYgMHgwMjAwMCApewkJLyogTTEgaXMgMSAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVkIiwgc3JjMSApOwotCX0gZWxzZSB7CQkJLyogTTEgaXMgMCAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3NyYzFdICk7Ci0JfQotCi0JaWYgKCBjb2JyX3RhYltpXS5udW1vcHMgPiAxICl7Ci0JCWlmICggd29yZDEgJiAxICl7CQkvKiBTMiBpcyAxICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIixzZiVkLCIsIHNyYzIgKTsKLQkJfSBlbHNlIHsJCQkvKiBTMSBpcyAwICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwlcywiLCByZWdfbmFtZXNbc3JjMl0gKTsKLQkJfQotCi0JCS8qIEV4dHJhY3QgZGlzcGxhY2VtZW50IGFuZCBjb252ZXJ0IHRvIGFkZHJlc3MKLQkJICovCi0JCXdvcmQxICY9IDB4MDAwMDFmZmM7Ci0JCWlmICggd29yZDEgJiAweDAwMDAxMDAwICl7CS8qIE5lZ2F0aXZlIGRpc3BsYWNlbWVudCAqLwotCQkJd29yZDEgfD0gKC0xICYgfjB4MWZmZik7CS8qIFNpZ24gZXh0ZW5kICovCi0JCX0KLQkJcHJpbnRfYWRkciggbWVtYWRkciArIHdvcmQxICk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE1FTSBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAkJCQkvKiByZXR1cm5zIGluc3RydWN0aW9uIGxlbmd0aDogNCBvciA4ICovCi1tZW0oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiwgbm9wcmludCApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotICAgIGludCBub3ByaW50OwkJLyogSWYgVFJVRSwgcmV0dXJuIGluc3RydWN0aW9uIGxlbmd0aCwgYnV0Ci0JCQkJICogZG9uJ3Qgb3V0cHV0IGFueSB0ZXh0LgotCQkJCSAqLwotewotCWludCBpLCBqOwotCWludCBsZW47Ci0JaW50IG1vZGU7Ci0JaW50IG9mZnNldDsKLQljb25zdCBjaGFyICpyZWcxLCAqcmVnMiwgKnJlZzM7Ci0KLQkvKiBUaGlzIGxvb2t1cCB0YWJsZSBpcyB0b28gc3BhcnNlIHRvIG1ha2UgaXQgd29ydGggdHlwaW5nIGluLCBidXQgbm90Ci0JICAgc28gbGFyZ2UgYXMgdG8gbWFrZSBhIHNwYXJzZSBhcnJheSBuZWNlc3NhcnkuICBXZSBjcmVhdGUgdGhlIHRhYmxlCi0JICAgYXQgcnVudGltZS4gICovCi0KLQkvKgotCSAqIE5PVEU6IEluIHRoaXMgdGFibGUsIHRoZSBtZWFuaW5nIG9mICdudW1vcHMnIGlzOgotCSAqCSAxOiBzaW5nbGUgb3BlcmFuZAotCSAqCSAyOiAyIG9wZXJhbmRzLCBsb2FkIGluc3RydWN0aW9uCi0JICoJLTI6IDIgb3BlcmFuZHMsIHN0b3JlIGluc3RydWN0aW9uCi0JICovCi0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgKm1lbV90YWI7Ci0vKiBPcGNvZGVzIG9mIDB4OFgsIDlYLCBhWCwgYlgsIGFuZCBjWCBtdXN0IGJlIGluIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIE1FTV9NSU4JMHg4MAotI2RlZmluZSBNRU1fTUFYCTB4Y2YKLSNkZWZpbmUgTUVNX1NJWgkoICogc2l6ZW9mKHN0cnVjdCB0YWJlbnQpKQotCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyc2VfdGFiZW50IG1lbV9pbml0W10gPSB7Ci0JICB7IDB4ODAsCSJsZG9iIiwJIDIgfSwKLQkgIHsgMHg4MiwJInN0b2IiLAktMiB9LAotCSAgeyAweDg0LAkiYngiLAkgMSB9LAotCSAgeyAweDg1LAkiYmFseCIsCSAyIH0sCi0JICB7IDB4ODYsCSJjYWxseCIsIDEgfSwKLQkgIHsgMHg4OCwJImxkb3MiLAkgMiB9LAotCSAgeyAweDhhLAkic3RvcyIsCS0yIH0sCi0JICB7IDB4OGMsCSJsZGEiLAkgMiB9LAotCSAgeyAweDkwLAkibGQiLAkgMiB9LAotCSAgeyAweDkyLAkic3QiLAktMiB9LAotCSAgeyAweDk4LAkibGRsIiwJIDIgfSwKLQkgIHsgMHg5YSwJInN0bCIsCS0yIH0sCi0JICB7IDB4YTAsCSJsZHQiLAkgMiB9LAotCSAgeyAweGEyLAkic3R0IiwJLTIgfSwKLQkgIHsgMHhhYywJImRjaW52YSIsIDEgfSwKLQkgIHsgMHhiMCwJImxkcSIsCSAyIH0sCi0JICB7IDB4YjIsCSJzdHEiLAktMiB9LAotCSAgeyAweGMwLAkibGRpYiIsCSAyIH0sCi0JICB7IDB4YzIsCSJzdGliIiwJLTIgfSwKLQkgIHsgMHhjOCwJImxkaXMiLAkgMiB9LAotCSAgeyAweGNhLAkic3RpcyIsCS0yIH0sCi0JICB7IDAsCQlOVUxMLAkwIH0KLQl9OwotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50IG1lbV90YWJfYnVmW01FTV9NQVggLSBNRU1fTUlOICsgMV07Ci0KLQlpZiAoIG1lbV90YWIgPT0gTlVMTCApewotCQltZW1fdGFiID0gbWVtX3RhYl9idWY7Ci0JCWZvciAoIGkgPSAwOyBtZW1faW5pdFtpXS5vcGNvZGUgIT0gMDsgaSsrICl7Ci0JCQlqID0gbWVtX2luaXRbaV0ub3Bjb2RlIC0gTUVNX01JTjsKLQkJCW1lbV90YWJbal0ubmFtZSA9IG1lbV9pbml0W2ldLm5hbWU7Ci0JCQltZW1fdGFiW2pdLm51bW9wcyA9IG1lbV9pbml0W2ldLm51bW9wczsKLQkJfQotCX0KLQotCWkgPSAoKHdvcmQxID4+IDI0KSAmIDB4ZmYpIC0gTUVNX01JTjsKLQltb2RlID0gKHdvcmQxID4+IDEwKSAmIDB4ZjsKLQotCWlmICggKG1lbV90YWJbaV0ubmFtZSAhPSBOVUxMKQkJLyogVmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLQkmJiAgICgobW9kZSA9PSA1KSB8fCAobW9kZSA+PTEyKSkgKXsJLyogV2l0aCAzMi1iaXQgZGlzcGxhY2VtZW50ICovCi0JCWxlbiA9IDg7Ci0JfSBlbHNlIHsKLQkJbGVuID0gNDsKLQl9Ci0KLQlpZiAoIG5vcHJpbnQgKXsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlpZiAoIChtZW1fdGFiW2ldLm5hbWUgPT0gTlVMTCkgfHwgKG1vZGUgPT0gNikgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVzXHQiLCBtZW1fdGFiW2ldLm5hbWUgKTsKLQotCXJlZzEgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxOSkgJiAweDFmIF07CS8qIE1FTUIgb25seSAqLwotCXJlZzIgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxNCkgJiAweDFmIF07Ci0JcmVnMyA9IHJlZ19uYW1lc1sgd29yZDEgJiAweDFmIF07CQkvKiBNRU1CIG9ubHkgKi8KLQlvZmZzZXQgPSB3b3JkMSAmIDB4ZmZmOwkJCQkvKiBNRU1BIG9ubHkgICovCi0KLQlzd2l0Y2ggKCBtZW1fdGFiW2ldLm51bW9wcyApewotCi0JY2FzZSAyOiAvKiBMT0FEIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSAmIDQgKXsJCQkvKiBNRU1CIEZPUk1BVCAqLwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIC0yOiAvKiBTVE9SRSBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgJiA0ICl7CQkJLyogTUVNQiBGT1JNQVQgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJXMsIiwgcmVnMSApOwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlcywweCV4IiwgcmVnMSwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKLQkJCWlmIChtb2RlICYgOCkgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgMTogLyogQlgvQ0FMTFggSU5TVFJVQ1RJT04gKi8KLQkJaWYgKCBtb2RlICYgNCApewkJCS8qIE1FTUIgRk9STUFUICovCi0JCQllYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUkVHIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcmVnKCB3b3JkMSApCi0gICAgdW5zaWduZWQgbG9uZyB3b3JkMTsKLXsKLQlpbnQgaSwgajsKLQlpbnQgb3Bjb2RlOwotCWludCBmcDsKLQlpbnQgbTEsIG0yLCBtMzsKLQlpbnQgczEsIHMyOwotCWludCBzcmMsIHNyYzIsIGRzdDsKLQljaGFyICptbmVtcDsKLQotCS8qIFRoaXMgbG9va3VwIHRhYmxlIGlzIHRvbyBzcGFyc2UgdG8gbWFrZSBpdCB3b3J0aCB0eXBpbmcgaW4sIGJ1dCBub3QKLQkgICBzbyBsYXJnZSBhcyB0byBtYWtlIGEgc3BhcnNlIGFycmF5IG5lY2Vzc2FyeS4gIFdlIGNyZWF0ZSB0aGUgdGFibGUKLQkgICBhdCBydW50aW1lLiAgKi8KLQotCS8qCi0JICogTk9URTogSW4gdGhpcyB0YWJsZSwgdGhlIG1lYW5pbmcgb2YgJ251bW9wcycgaXM6Ci0JICoJIDE6IHNpbmdsZSBvcGVyYW5kLCB3aGljaCBpcyBOT1QgYSBkZXN0aW5hdGlvbi4KLQkgKgktMTogc2luZ2xlIG9wZXJhbmQsIHdoaWNoIElTIGEgZGVzdGluYXRpb24uCi0JICoJIDI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggaXMgTk9UIGEgZGVzdGluYXRpb24uCi0JICoJLTI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggSVMgYSBkZXN0aW5hdGlvbi4KLQkgKgkgMzogMyBvcGVyYW5kcwotCSAqCi0JICoJSWYgYW4gb3Bjb2RlIG1uZW1vbmljIGJlZ2lucyB3aXRoICJGIiwgaXQgaXMgYSBmbG9hdGluZy1wb2ludAotCSAqCW9wY29kZSAodGhlICJGIiBpcyBub3QgcHJpbnRlZCkuCi0JICovCi0KLQlzdGF0aWMgc3RydWN0IHRhYmVudCAqcmVnX3RhYjsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJzZV90YWJlbnQgcmVnX2luaXRbXSA9IHsKLSNkZWZpbmUgUkVHX01JTgkweDU4MAotCSAgeyAweDU4MCwJIm5vdGJpdCIsCTMgfSwKLQkgIHsgMHg1ODEsCSJhbmQiLAkJMyB9LAotCSAgeyAweDU4MiwJImFuZG5vdCIsCTMgfSwKLQkgIHsgMHg1ODMsCSJzZXRiaXQiLAkzIH0sCi0JICB7IDB4NTg0LAkibm90YW5kIiwJMyB9LAotCSAgeyAweDU4NiwJInhvciIsCQkzIH0sCi0JICB7IDB4NTg3LAkib3IiLAkJMyB9LAotCSAgeyAweDU4OCwJIm5vciIsCQkzIH0sCi0JICB7IDB4NTg5LAkieG5vciIsCQkzIH0sCi0JICB7IDB4NThhLAkibm90IiwJCS0yIH0sCi0JICB7IDB4NThiLAkib3Jub3QiLAkzIH0sCi0JICB7IDB4NThjLAkiY2xyYml0IiwJMyB9LAotCSAgeyAweDU4ZCwJIm5vdG9yIiwJMyB9LAotCSAgeyAweDU4ZSwJIm5hbmQiLAkJMyB9LAotCSAgeyAweDU4ZiwJImFsdGVyYml0IiwJMyB9LAotCSAgeyAweDU5MCwgCSJhZGRvIiwJCTMgfSwKLQkgIHsgMHg1OTEsIAkiYWRkaSIsCQkzIH0sCi0JICB7IDB4NTkyLCAJInN1Ym8iLAkJMyB9LAotCSAgeyAweDU5MywgCSJzdWJpIiwJCTMgfSwKLQkgIHsgMHg1OTQsCSJjbXBvYiIsCTIgfSwKLQkgIHsgMHg1OTUsCSJjbXBpYiIsCTIgfSwKLQkgIHsgMHg1OTYsCSJjbXBvcyIsCTIgfSwKLQkgIHsgMHg1OTcsCSJjbXBpcyIsCTIgfSwKLQkgIHsgMHg1OTgsIAkic2hybyIsCQkzIH0sCi0JICB7IDB4NTlhLCAJInNocmRpIiwJMyB9LAotCSAgeyAweDU5YiwgCSJzaHJpIiwJCTMgfSwKLQkgIHsgMHg1OWMsIAkic2hsbyIsCQkzIH0sCi0JICB7IDB4NTlkLCAJInJvdGF0ZSIsCTMgfSwKLQkgIHsgMHg1OWUsIAkic2hsaSIsCQkzIH0sCi0JICB7IDB4NWEwLCAJImNtcG8iLAkJMiB9LAotCSAgeyAweDVhMSwgCSJjbXBpIiwJCTIgfSwKLQkgIHsgMHg1YTIsIAkiY29uY21wbyIsCTIgfSwKLQkgIHsgMHg1YTMsIAkiY29uY21waSIsCTIgfSwKLQkgIHsgMHg1YTQsIAkiY21waW5jbyIsCTMgfSwKLQkgIHsgMHg1YTUsIAkiY21waW5jaSIsCTMgfSwKLQkgIHsgMHg1YTYsIAkiY21wZGVjbyIsCTMgfSwKLQkgIHsgMHg1YTcsIAkiY21wZGVjaSIsCTMgfSwKLQkgIHsgMHg1YWMsIAkic2NhbmJ5dGUiLAkyIH0sCi0JICB7IDB4NWFkLAkiYnN3YXAiLAktMiB9LAotCSAgeyAweDVhZSwgCSJjaGtiaXQiLAkyIH0sCi0JICB7IDB4NWIwLCAJImFkZGMiLAkJMyB9LAotCSAgeyAweDViMiwgCSJzdWJjIiwJCTMgfSwKLQkgIHsgMHg1YjQsCSJpbnRkaXMiLAkwIH0sCi0JICB7IDB4NWI1LAkiaW50ZW4iLAkwIH0sCi0JICB7IDB4NWNjLAkibW92IiwJCS0yIH0sCi0JICB7IDB4NWQ4LAkiZXNocm8iLAkzIH0sCi0JICB7IDB4NWRjLAkibW92bCIsCQktMiB9LAotCSAgeyAweDVlYywJIm1vdnQiLAkJLTIgfSwKLQkgIHsgMHg1ZmMsCSJtb3ZxIiwJCS0yIH0sCi0JICB7IDB4NjAwLAkic3lubW92IiwJMiB9LAotCSAgeyAweDYwMSwJInN5bm1vdmwiLAkyIH0sCi0JICB7IDB4NjAyLAkic3lubW92cSIsCTIgfSwKLQkgIHsgMHg2MDMsCSJjbXBzdHIiLAkzIH0sCi0JICB7IDB4NjA0LAkibW92cXN0ciIsCTMgfSwKLQkgIHsgMHg2MDUsCSJtb3ZzdHIiLAkzIH0sCi0JICB7IDB4NjEwLAkiYXRtb2QiLAkzIH0sCi0JICB7IDB4NjEyLAkiYXRhZGQiLAkzIH0sCi0JICB7IDB4NjEzLAkiaW5zcGFjYyIsCS0yIH0sCi0JICB7IDB4NjE0LAkibGRwaHkiLAktMiB9LAotCSAgeyAweDYxNSwJInN5bmxkIiwJLTIgfSwKLQkgIHsgMHg2MTcsCSJmaWxsIiwJCTMgfSwKLQkgIHsgMHg2MzAsCSJzZG1hIiwJCTMgfSwKLQkgIHsgMHg2MzEsCSJ1ZG1hIiwJCTAgfSwKLQkgIHsgMHg2NDAsCSJzcGFuYml0IiwJLTIgfSwKLQkgIHsgMHg2NDEsCSJzY2FuYml0IiwJLTIgfSwKLQkgIHsgMHg2NDIsCSJkYWRkYyIsCTMgfSwKLQkgIHsgMHg2NDMsCSJkc3ViYyIsCTMgfSwKLQkgIHsgMHg2NDQsCSJkbW92dCIsCS0yIH0sCi0JICB7IDB4NjQ1LAkibW9kYWMiLAkzIH0sCi0JICB7IDB4NjQ2LAkiY29uZHJlYyIsCS0yIH0sCi0JICB7IDB4NjUwLAkibW9kaWZ5IiwJMyB9LAotCSAgeyAweDY1MSwJImV4dHJhY3QiLAkzIH0sCi0JICB7IDB4NjU0LAkibW9kdGMiLAkzIH0sCi0JICB7IDB4NjU1LAkibW9kcGMiLAkzIH0sCi0JICB7IDB4NjU2LAkicmVjZWl2ZSIsCS0yIH0sCi0JICB7IDB4NjU4LAkiaW50Y3RsIiwJLTIgfSwKLQkgIHsgMHg2NTksCSJzeXNjdGwiLAkzIH0sCi0JICB7IDB4NjViLAkiaWNjdGwiLAkzIH0sCi0JICB7IDB4NjVjLAkiZGNjdGwiLAkzIH0sCi0JICB7IDB4NjVkLAkiaGFsdCIsCQkwIH0sCi0JICB7IDB4NjYwLAkiY2FsbHMiLAkxIH0sCi0JICB7IDB4NjYyLAkic2VuZCIsCQkzIH0sCi0JICB7IDB4NjYzLAkic2VuZHNlcnYiLAkxIH0sCi0JICB7IDB4NjY0LAkicmVzdW1wcmNzIiwJMSB9LAotCSAgeyAweDY2NSwJInNjaGVkcHJjcyIsCTEgfSwKLQkgIHsgMHg2NjYsCSJzYXZlcHJjcyIsCTAgfSwKLQkgIHsgMHg2NjgsCSJjb25kd2FpdCIsCTEgfSwKLQkgIHsgMHg2NjksCSJ3YWl0IiwJCTEgfSwKLQkgIHsgMHg2NmEsCSJzaWduYWwiLAkxIH0sCi0JICB7IDB4NjZiLAkibWFyayIsCQkwIH0sCi0JICB7IDB4NjZjLAkiZm1hcmsiLAkwIH0sCi0JICB7IDB4NjZkLAkiZmx1c2hyZWciLAkwIH0sCi0JICB7IDB4NjZmLAkic3luY2YiLAkwIH0sCi0JICB7IDB4NjcwLAkiZW11bCIsCQkzIH0sCi0JICB7IDB4NjcxLAkiZWRpdiIsCQkzIH0sCi0JICB7IDB4NjczLCAJImxkdGltZSIsCS0xIH0sCi0JICB7IDB4Njc0LAkiRmN2dGlyIiwJLTIgfSwKLQkgIHsgMHg2NzUsCSJGY3Z0aWxyIiwJLTIgfSwKLQkgIHsgMHg2NzYsCSJGc2NhbGVybCIsCTMgfSwKLQkgIHsgMHg2NzcsCSJGc2NhbGVyIiwJMyB9LAotCSAgeyAweDY4MCwJIkZhdGFuciIsCTMgfSwKLQkgIHsgMHg2ODEsCSJGbG9nZXByIiwJMyB9LAotCSAgeyAweDY4MiwJIkZsb2dyIiwJMyB9LAotCSAgeyAweDY4MywJIkZyZW1yIiwJMyB9LAotCSAgeyAweDY4NCwJIkZjbXBvciIsCTIgfSwKLQkgIHsgMHg2ODUsCSJGY21wciIsCTIgfSwKLQkgIHsgMHg2ODgsCSJGc3FydHIiLAktMiB9LAotCSAgeyAweDY4OSwJIkZleHByIiwJLTIgfSwKLQkgIHsgMHg2OGEsCSJGbG9nYm5yIiwJLTIgfSwKLQkgIHsgMHg2OGIsCSJGcm91bmRyIiwJLTIgfSwKLQkgIHsgMHg2OGMsCSJGc2luciIsCS0yIH0sCi0JICB7IDB4NjhkLAkiRmNvc3IiLAktMiB9LAotCSAgeyAweDY4ZSwJIkZ0YW5yIiwJLTIgfSwKLQkgIHsgMHg2OGYsCSJGY2xhc3NyIiwJMSB9LAotCSAgeyAweDY5MCwJIkZhdGFucmwiLAkzIH0sCi0JICB7IDB4NjkxLAkiRmxvZ2VwcmwiLAkzIH0sCi0JICB7IDB4NjkyLAkiRmxvZ3JsIiwJMyB9LAotCSAgeyAweDY5MywJIkZyZW1ybCIsCTMgfSwKLQkgIHsgMHg2OTQsCSJGY21wb3JsIiwJMiB9LAotCSAgeyAweDY5NSwJIkZjbXBybCIsCTIgfSwKLQkgIHsgMHg2OTgsCSJGc3FydHJsIiwJLTIgfSwKLQkgIHsgMHg2OTksCSJGZXhwcmwiLAktMiB9LAotCSAgeyAweDY5YSwJIkZsb2dibnJsIiwJLTIgfSwKLQkgIHsgMHg2OWIsCSJGcm91bmRybCIsCS0yIH0sCi0JICB7IDB4NjljLAkiRnNpbnJsIiwJLTIgfSwKLQkgIHsgMHg2OWQsCSJGY29zcmwiLAktMiB9LAotCSAgeyAweDY5ZSwJIkZ0YW5ybCIsCS0yIH0sCi0JICB7IDB4NjlmLAkiRmNsYXNzcmwiLAkxIH0sCi0JICB7IDB4NmMwLAkiRmN2dHJpIiwJLTIgfSwKLQkgIHsgMHg2YzEsCSJGY3Z0cmlsIiwJLTIgfSwKLQkgIHsgMHg2YzIsCSJGY3Z0enJpIiwJLTIgfSwKLQkgIHsgMHg2YzMsCSJGY3Z0enJpbCIsCS0yIH0sCi0JICB7IDB4NmM5LAkiRm1vdnIiLAktMiB9LAotCSAgeyAweDZkOSwJIkZtb3ZybCIsCS0yIH0sCi0JICB7IDB4NmUxLCAJIkZtb3ZyZSIsCS0yIH0sCi0JICB7IDB4NmUyLCAJIkZjcHlzcmUiLAkzIH0sCi0JICB7IDB4NmUzLCAJIkZjcHlyc3JlIiwJMyB9LAotCSAgeyAweDcwMSwJIm11bG8iLAkJMyB9LAotCSAgeyAweDcwOCwJInJlbW8iLAkJMyB9LAotCSAgeyAweDcwYiwJImRpdm8iLAkJMyB9LAotCSAgeyAweDc0MSwJIm11bGkiLAkJMyB9LAotCSAgeyAweDc0OCwJInJlbWkiLAkJMyB9LAotCSAgeyAweDc0OSwJIm1vZGkiLAkJMyB9LAotCSAgeyAweDc0YiwJImRpdmkiLAkJMyB9LAotCSAgeyAweDc4MCwJImFkZG9ubyIsCTMgfSwKLQkgIHsgMHg3ODEsCSJhZGRpbm8iLAkzIH0sCi0JICB7IDB4NzgyLAkic3Vib25vIiwJMyB9LAotCSAgeyAweDc4MywJInN1YmlubyIsCTMgfSwKLQkgIHsgMHg3ODQsCSJzZWxubyIsCTMgfSwKLQkgIHsgMHg3OGIsCSJGZGl2ciIsCTMgfSwKLQkgIHsgMHg3OGMsCSJGbXVsciIsCTMgfSwKLQkgIHsgMHg3OGQsCSJGc3ViciIsCTMgfSwKLQkgIHsgMHg3OGYsCSJGYWRkciIsCTMgfSwKLQkgIHsgMHg3OTAsCSJhZGRvZyIsCTMgfSwKLQkgIHsgMHg3OTEsCSJhZGRpZyIsICAgICAgICAzIH0sCi0JICB7IDB4NzkyLAkic3Vib2ciLAkzIH0sCi0JICB7IDB4NzkzLAkic3ViaWciLAkzIH0sCi0JICB7IDB4Nzk0LAkic2VsZyIsCQkzIH0sCi0JICB7IDB4NzliLAkiRmRpdnJsIiwJMyB9LAotCSAgeyAweDc5YywJIkZtdWxybCIsCTMgfSwKLQkgIHsgMHg3OWQsCSJGc3VicmwiLAkzIH0sCi0JICB7IDB4NzlmLAkiRmFkZHJsIiwJMyB9LAotCSAgeyAweDdhMCwJImFkZG9lIiwJMyB9LAotCSAgeyAweDdhMSwJImFkZGllIiwgICAgICAgIDMgfSwKLQkgIHsgMHg3YTIsCSJzdWJvZSIsCTMgfSwKLQkgIHsgMHg3YTMsCSJzdWJpZSIsCTMgfSwKLQkgIHsgMHg3YTQsCSJzZWxlIiwJCTMgfSwKLQkgIHsgMHg3YjAsCSJhZGRvZ2UiLAkzIH0sCi0JICB7IDB4N2IxLAkiYWRkaWdlIiwJMyB9LAotCSAgeyAweDdiMiwJInN1Ym9nZSIsCTMgfSwKLQkgIHsgMHg3YjMsCSJzdWJpZ2UiLAkzIH0sCi0JICB7IDB4N2I0LAkic2VsZ2UiLAkzIH0sCi0JICB7IDB4N2MwLAkiYWRkb2wiLAkzIH0sCi0JICB7IDB4N2MxLAkiYWRkaWwiLAkzIH0sCi0JICB7IDB4N2MyLAkic3Vib2wiLAkzIH0sCi0JICB7IDB4N2MzLAkic3ViaWwiLAkzIH0sCi0JICB7IDB4N2M0LAkic2VsbCIsCQkzIH0sCi0JICB7IDB4N2QwLAkiYWRkb25lIiwJMyB9LAotCSAgeyAweDdkMSwJImFkZGluZSIsCTMgfSwKLQkgIHsgMHg3ZDIsCSJzdWJvbmUiLAkzIH0sCi0JICB7IDB4N2QzLAkic3ViaW5lIiwJMyB9LAotCSAgeyAweDdkNCwJInNlbG5lIiwJMyB9LAotCSAgeyAweDdlMCwJImFkZG9sZSIsCTMgfSwKLQkgIHsgMHg3ZTEsCSJhZGRpbGUiLAkzIH0sCi0JICB7IDB4N2UyLAkic3Vib2xlIiwJMyB9LAotCSAgeyAweDdlMywJInN1YmlsZSIsCTMgfSwKLQkgIHsgMHg3ZTQsCSJzZWxsZSIsCTMgfSwKLQkgIHsgMHg3ZjAsCSJhZGRvbyIsCTMgfSwKLQkgIHsgMHg3ZjEsCSJhZGRpbyIsCTMgfSwKLQkgIHsgMHg3ZjIsCSJzdWJvbyIsCTMgfSwKLQkgIHsgMHg3ZjMsCSJzdWJpbyIsCTMgfSwKLQkgIHsgMHg3ZjQsCSJzZWxvIiwJCTMgfSwKLSNkZWZpbmUgUkVHX01BWCAweDdmNAotCSAgeyAwLAkJTlVMTCwJCTAgfQotCX07Ci0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgcmVnX3RhYl9idWZbUkVHX01BWCAtIFJFR19NSU4gKyAxXTsKLQotCWlmICggcmVnX3RhYiA9PSBOVUxMICl7Ci0JCXJlZ190YWIgPSByZWdfdGFiX2J1ZjsKLQkJZm9yICggaSA9IDA7IHJlZ19pbml0W2ldLm9wY29kZSAhPSAwOyBpKysgKXsKLQkJCWogPSByZWdfaW5pdFtpXS5vcGNvZGUgLSBSRUdfTUlOOwotCQkJcmVnX3RhYltqXS5uYW1lID0gcmVnX2luaXRbaV0ubmFtZTsKLQkJCXJlZ190YWJbal0ubnVtb3BzID0gcmVnX2luaXRbaV0ubnVtb3BzOwotCQl9Ci0JfQotCi0Jb3Bjb2RlID0gKCh3b3JkMSA+PiAyMCkgJiAweGZmMCkgfCAoKHdvcmQxID4+IDcpICYgMHhmKTsKLQlpID0gb3Bjb2RlIC0gUkVHX01JTjsKLQotCWlmICggKG9wY29kZTxSRUdfTUlOKSB8fCAob3Bjb2RlPlJFR19NQVgpIHx8IChyZWdfdGFiW2ldLm5hbWU9PU5VTEwpICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQltbmVtcCA9IHJlZ190YWJbaV0ubmFtZTsKLQlpZiAoICptbmVtcCA9PSAnRicgKXsKLQkJZnAgPSAxOwotCQltbmVtcCsrOwotCX0gZWxzZSB7Ci0JCWZwID0gMDsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgbW5lbXAgKTsKLQotCXMxICAgPSAod29yZDEgPj4gNSkgICYgMTsKLQlzMiAgID0gKHdvcmQxID4+IDYpICAmIDE7Ci0JbTEgICA9ICh3b3JkMSA+PiAxMSkgJiAxOwotCW0yICAgPSAod29yZDEgPj4gMTIpICYgMTsKLQltMyAgID0gKHdvcmQxID4+IDEzKSAmIDE7Ci0Jc3JjICA9ICB3b3JkMSAgICAgICAgJiAweDFmOwotCXNyYzIgPSAod29yZDEgPj4gMTQpICYgMHgxZjsKLQlkc3QgID0gKHdvcmQxID4+IDE5KSAmIDB4MWY7Ci0KLQlpZiAgKCByZWdfdGFiW2ldLm51bW9wcyAhPSAwICl7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0KLQkJc3dpdGNoICggcmVnX3RhYltpXS5udW1vcHMgKXsKLQkJY2FzZSAxOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTE6Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTI6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi0vKgotICogUHJpbnQgb3V0IGVmZmVjdGl2ZSBhZGRyZXNzIGZvciBtZW1iIGluc3RydWN0aW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGludCBtb2RlOwotICAgICBjaGFyICpyZWcyLCAqcmVnMzsKLSAgICAgaW50IHdvcmQxOwotICAgICB1bnNpZ25lZCBpbnQgd29yZDI7Ci17Ci0JaW50IHNjYWxlOwotCXN0YXRpYyBjb25zdCBpbnQgc2NhbGVfdGFiW10gPSB7IDEsIDIsIDQsIDgsIDE2IH07Ci0KLQlzY2FsZSA9ICh3b3JkMSA+PiA3KSAmIDB4MDc7Ci0JaWYgKCAoc2NhbGUgPiA0KSB8fCAoKCh3b3JkMSA+PiA1KSAmIDB4MDMpICE9IDApICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0Jc2NhbGUgPSBzY2FsZV90YWJbc2NhbGVdOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSA0OgkgCQkJCQkvKiAocmVnKSAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCWJyZWFrOwotCWNhc2UgNToJCQkJCQkvKiBkaXNwbCs4KGlwKSAqLwotCQlwcmludF9hZGRyKCB3b3JkMis4K21lbWFkZHIgKTsKLQkJYnJlYWs7Ci0JY2FzZSA3OgkJCQkJCS8qIChyZWcpW2luZGV4KnNjYWxlXSAqLwotCQlpZiAoc2NhbGUgPT0gMSkgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzXSIsIHJlZzIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslcyolZF0iLHJlZzIscmVnMyxzY2FsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxMjoJCQkJCS8qIGRpc3BsYWNlbWVudCAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQlicmVhazsKLQljYXNlIDEzOgkJCQkJLyogZGlzcGwocmVnKSAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCWJyZWFrOwotCWNhc2UgMTQ6CQkJCQkvKiBkaXNwbFtpbmRleCpzY2FsZV0gKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzXSIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzKiVkXSIsIHJlZzMsIHNjYWxlICk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxNToJCQkJLyogZGlzcGwocmVnKVtpbmRleCpzY2FsZV0gKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslc10iLCByZWcyLCByZWczICk7Ci0JCX0gZWxzZSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXMqJWRdIixyZWcyLHJlZzMsc2NhbGUgKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSZWdpc3RlciBJbnN0cnVjdGlvbiBPcGVyYW5kICAJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJlZ29wKCBtb2RlLCBzcGVjLCByZWcsIGZwICkKLSAgICBpbnQgbW9kZSwgc3BlYywgcmVnLCBmcDsKLXsKLQlpZiAoIGZwICl7CQkJCS8qIEZMT0FUSU5HIFBPSU5UIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSA9PSAxICl7CQkJLyogRlAgb3BlcmFuZCAqLwotCQkJc3dpdGNoICggcmVnICl7Ci0JCQljYXNlIDA6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMCIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMSIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMiIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDM6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMyIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE2OiAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjBmMC4wIiApOwotCQkJICBicmVhazsKLQkJCWNhc2UgMjI6ICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiMGYxLjAiICk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDogKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICI/IiApOwotCQkJICBicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsJCQkJLyogTm9uLUZQIHJlZ2lzdGVyICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3JlZ10gKTsKLQkJfQotCX0gZWxzZSB7CQkJCS8qIE5PVCBGTE9BVElORyBQT0lOVCAqLwotCQlpZiAoIG1vZGUgPT0gMSApewkJCS8qIExpdGVyYWwgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJWQiLCByZWcgKTsKLQkJfSBlbHNlIHsJCQkJLyogUmVnaXN0ZXIgKi8KLQkJCWlmICggc3BlYyA9PSAwICl7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tyZWddICk7Ci0JCQl9IGVsc2UgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAic2YlZCIsIHJlZyApOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUmVnaXN0ZXIgSW5zdHJ1Y3Rpb24gRGVzdGluYXRpb24gT3BlcmFuZAkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1kc3RvcCggbW9kZSwgcmVnLCBmcCApCi0gICAgaW50IG1vZGUsIHJlZywgZnA7Ci17Ci0JLyogJ2RzdCcgb3BlcmFuZCBjYW4ndCBiZSBhIGxpdGVyYWwuIE9uIG5vbi1GUCBpbnN0cnVjdGlvbnMsICByZWdpc3RlcgotCSAqIG1vZGUgaXMgYXNzdW1lZCBhbmQgIm0zIiBhY3RzIGFzIGlmIHdlcmUgInMzIjsgIG9uIEZQLWluc3RydWN0aW9ucywKLQkgKiBzZiByZWdpc3RlcnMgYXJlIG5vdCBhbGxvd2VkIHNvIG0zIGFjdHMgbm9ybWFsbHkuCi0JICovCi0JIGlmICggZnAgKXsKLQkJcmVnb3AoIG1vZGUsIDAsIHJlZywgZnAgKTsKLQkgfSBlbHNlIHsKLQkJcmVnb3AoIDAsIG1vZGUsIHJlZywgZnAgKTsKLQkgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnZhbGlkKCB3b3JkMSApCi0gICAgaW50IHdvcmQxOwotewotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLndvcmRcdDB4JTA4eCIsICh1bnNpZ25lZCkgd29yZDEgKTsKLX0JCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyKGEpCi1iZmRfdm1hIGE7Ci17Ci0gICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYSwgaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdXRfYWJzKCB3b3JkMSwgd29yZDIgKQotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotI2lmZGVmIElOX0dEQgotCXJldHVybjsKLSNlbHNlCi0JaW50IGxlbjsKLQotCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKLQljYXNlIDB4ODoKLQljYXNlIDB4OToKLQljYXNlIDB4YToKLQljYXNlIDB4YjoKLQljYXNlIDB4YzoKLQkJLyogTUVNIGZvcm1hdCBpbnN0cnVjdGlvbiAqLwotCQlsZW4gPSBtZW0oIDAsIHdvcmQxLCB3b3JkMiwgMSApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSA0OwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIGxlbiA9PSA4ICl7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJTA4eCAlMDh4XHQiLCB3b3JkMSwgd29yZDIgKTsKLQl9IGVsc2UgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiUwOHggICAgICAgICBcdCIsIHdvcmQxICk7Ci0JfQotOwotCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMjAwLWRpcy5jIGIvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmM3ZTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgTU4xMDIwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMjAwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIHZvaWQgZGlzYXNzZW1ibGUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgdW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nLAotCQkJCSB1bnNpZ25lZCBpbnQpKTsKLQotaW50IAotcHJpbnRfaW5zbl9tbjEwMjAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOwotICB1bnNpZ25lZCBpbnQgY29uc3VtZTsKLQotICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIG9wY29kZSBpcy4gICovCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaW5zbiA9ICoodW5zaWduZWQgY2hhciAqKSBidWZmZXI7Ci0KLSAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLiAgKi8KLSAgaWYgKChpbnNuICYgMHhmMCkgPT0gMHgwMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDEwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MjAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgzMAotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhhMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweGIwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZWIKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNgotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZlCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmYpCi0gICAgewotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAxOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4NDAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NzAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZTAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZTQKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZTgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZTkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZWEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjIKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjMpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gMjsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMgd2l0aCBhIDE2Yml0IG9wZXJhbmQgaW4gbGl0dGxlCi0gICAgIGVuZGlhbiBmb3JtLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGYwKSA9PSAweGMwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGRjCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGVjCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY5Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZjCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZkKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPDw9IDE2OwotICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMgdG9vLCBidXQgd2UgZG9uJ3QgaGF2ZSB0byBtZXNzIHdpdGgKLSAgICAgZW5kaWFubmVzcyBzdHVmZi4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIDw8PSAxNjsKLSAgICAgIGluc24gfD0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gMzsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZvdXIgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgaW5zbiA8PD0gMTY7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgY29uc3VtZSA9IDQ7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmaXZlIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjQpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDE2OwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNCwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICgqKHVuc2lnbmVkIGNoYXIgKilidWZmZXIgPDwgOCkgJiAweGZmMDA7Ci0KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAzLCBidWZmZXIsIDEsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gfD0gKCoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcikgJiAweGZmOwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBleHRlbnNpb24gPSAoKih1bnNpZ25lZCBjaGFyICopYnVmZmVyKSAmIDB4ZmY7Ci0gICAgICBjb25zdW1lID0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDJ4IiksIGluc24pOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuLCBleHRlbnNpb24sIGNvbnN1bWUpOwotCi0gIHJldHVybiBjb25zdW1lOwotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIGV4dGVuc2lvbiwgc2l6ZSkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIGV4dGVuc2lvbjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3AgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopbW4xMDIwMF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICBpbnQgbWF0Y2ggPSAwOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZS4gICovCi0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpbnQgbXlzaXplLCBleHRyYV9zaGlmdDsKLQotICAgICAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzEpCi0JbXlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzIKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNCkKLQlteXNpemUgPSAyOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMwotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF81KQotCW15c2l6ZSA9IDM7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF82KQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF83KQotCW15c2l6ZSA9IDU7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0JCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcC0+Zm9ybWF0ID09IEZNVF81KQotCWV4dHJhX3NoaWZ0ID0gODsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzMKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF83KQotCWV4dHJhX3NoaWZ0ID0gMTY7Ci0gICAgICBlbHNlCi0JZXh0cmFfc2hpZnQgPSAwOwotCi0gICAgICBpZiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZQotCSAgJiYgc2l6ZSA9PSAodW5zaWduZWQgaW50KSBteXNpemUpCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0JICB1bnNpZ25lZCBpbnQgbm9jb21tYTsKLQkgIGludCBwYXJlbiA9IDA7Ci0JICAKLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLQotCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBub2NvbW1hID0gMTsKLQkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgICAgIG9waW5kZXhfcHRyKyspCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0JICAgICAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoaW5zbiAmIDB4ZmZmZikgPDwgODsKLQkJICB2YWx1ZSB8PSBleHRlbnNpb247Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQpKQotCQkJICAgJiAoKDFMIDw8IG9wZXJhbmQtPmJpdHMpIC0gMUwpKTsKLQkJfQotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JCXZhbHVlID0gKChsb25nKSh2YWx1ZSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkKLQkJCSAgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpOwotCi0JICAgICAgaWYgKCFub2NvbW1hCi0JCSAgJiYgKCFwYXJlbgotCQkgICAgICB8fCAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BBUkVOKSA9PSAwKSkpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCi0JICAgICAgbm9jb21tYSA9IDA7Ci0JCQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRFJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZCVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfQVJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUFNXKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInBzdyIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX01EUikgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJtZHIiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikgIT0gMCkKLQkJewotCQkgIGlmIChwYXJlbikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JCSAgICAgIG5vY29tbWEgPSAxOwotCQkgICAgfQotCQkgIHBhcmVuID0gIXBhcmVuOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUENSRUwpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKHZhbHVlICsgbWVtYWRkciArIG15c2l6ZSkgJiAweGZmZmZmZiwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTUVNQUREUikgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIAotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLQkgICAgfQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDRseCIpLCBpbnNuKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDIwMC1vcGMuYyBiL29wY29kZXMvbTEwMjAwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjcwYjkwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMjAwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qIEFzc2VtYmxlIE1hdHN1c2hpdGEgTU4xMDIwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMjAwLmgiCi0KLQwKLWNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgbW4xMDIwMF9vcGVyYW5kc1tdID0gewotI2RlZmluZSBVTlVTRUQJMAotICB7MCwgMCwgMH0sIAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMCAgICAgIChVTlVTRUQrMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4xICAgICAgKEROMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMCAgICAgIChETjErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE0xICAgICAgKERNMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMCAgICAgIChETTErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4xICAgICAgKEFOMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMCAgICAgIChBTjErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0xICAgICAgKEFNMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NOCAgICAoQU0xKzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTYgICAgKElNTTgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBwYy1yZWxhdGl2ZSBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgcGMtcmVsYXRpdmUgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTZfUENSRUwgICAgKElNTTE2KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDE2Yml0IHVuc2lnbmVkIGRpc3BhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU0xNl9NRU0gICAgKElNTTE2X1BDUkVMKzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMjAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDI0IGltbWVkaWF0ZSwgbG93IDE2IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLiAgKi8KLQotI2RlZmluZSBJTU0yNCAgICAoSU1NMTZfTUVNKzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEfSwKLQotLyogMzJiaXQgcGMtcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMjRfUENSRUwgICAgKElNTTI0KzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDMyYml0IG1lbW9yeSBvZmZzZXQuICAqLwotI2RlZmluZSBJTU0yNF9NRU0gICAgKElNTTI0X1BDUkVMKzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDIwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiBQcm9jZXNzb3Igc3RhdHVzIHdvcmQuICAqLwotI2RlZmluZSBQU1cgICAgKElNTTI0X01FTSsxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BTV30sCi0KLS8qIE1EUiByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1EUiAgICAoUFNXKzEpCi0gIHswLCAwLCBNTjEwMjAwX09QRVJBTkRfTURSfSwKLQotLyogSW5kZXggcmVnaXN0ZXIuICAqLwotI2RlZmluZSBESSAoTURSKzEpCi0gIHsyLCA0LCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBkaXNwYWNlbWVudC4gICovCi0jZGVmaW5lIFNEOCAgICAoREkrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAzMmJpdCBkaXNwYWNlbWVudC4gICovCi0jZGVmaW5lIFNEMTYgICAgKFNEOCsxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDggYml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIFNEOE5fUENSRUwgICAgKFNEMTYrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUENSRUwgfCBNTjEwMjAwX09QRVJBTkRfUkVMQVh9LAotCi0vKiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NOCAgICAoU0Q4Tl9QQ1JFTCsxKQotICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gMzJiaXQgIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIFNJTU0xNiAgICAoU0lNTTgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgbm90IHByb21vdGUuICAqLwotI2RlZmluZSBTSU1NMTZOICAgIChTSU1NMTYrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0t9LAotCi0vKiBFaXRoZXIgYW4gb3BlbiBwYXJlbiBvciBjbG9zZSBwYXJlbi4gICovCi0jZGVmaW5lIFBBUkVOCShTSU1NMTZOKzEpCi0gIHswLCAwLCBNTjEwMjAwX09QRVJBTkRfUEFSRU59LCAKLQotLyogZG4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEROMDEgICAgIChQQVJFTisxKQotICB7MiwgMCwgTU4xMDIwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMjAwX09QRVJBTkRfUkVQRUFURUR9LAotCi0vKiBhbiByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIgcG9zaXRpb25zLiAgKi8KLSNkZWZpbmUgQU4wMSAgICAgKEROMDErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHIHwgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLX0gOyAKLQotI2RlZmluZSBNRU0oQUREUikgUEFSRU4sIEFERFIsIFBBUkVOIAotI2RlZmluZSBNRU0yKEFERFIxLEFERFIyKSBQQVJFTiwgQUREUjEsIEFERFIyLCBQQVJFTiAKLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkJT1BDT0RFCQlNQVNLCQl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLQotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCi0gICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLiAgKi8KLQotY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlIG1uMTAyMDBfb3Bjb2Rlc1tdID0gewoteyAibW92IiwJMHg4MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtTSU1NOCwgRE4wMX19LAoteyAibW92IiwJMHg4MCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJtb3YiLAkweGYyMzAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJtb3YiLAkweGYyZjAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJtb3YiLAkweGYyNzAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJtb3YiLAkweGYzZjAsCQkweGZmZmMsCQlGTVRfNCwge1BTVywgRE4wfX0sCi17ICJtb3YiLAkweGYzZDAsCQkweGZmZjMsCQlGTVRfNCwge0ROMSwgUFNXfX0sCi17ICJtb3YiLAkweGYzZTAsCQkweGZmZmMsCQlGTVRfNCwge01EUiwgRE4wfX0sCi17ICJtb3YiLAkweGYzYzAsCQkweGZmZjMsCQlGTVRfNCwge0ROMSwgTURSfX0sCi17ICJtb3YiLAkweDIwLAkJMHhmMCwJCUZNVF8xLCB7TUVNKEFOMSksIERNMH19LAoteyAibW92IiwJMHg2MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGY3YzAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGY0ODAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGYxNDAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92IiwJMHhjODAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjRjMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAoteyAibW92IiwJMHg3MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtNRU0yKFNEOCxBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4NzAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNKEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmN2IwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmNGYwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmMTAwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjczMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7TUVNKElNTTE2X01FTSksIEFOMH19LAoteyAibW92IiwJMHhmNGQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtNRU0oSU1NMjRfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweDAwLAkJMHhmMCwJCUZNVF8xLCB7RE0wLCBNRU0oQU4xKX19LAoteyAibW92IiwJMHg0MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3YiLAkweGY3ODAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3YiLAkweGY0MDAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge0RNMCwgTUVNMihJTU0yNCwgQU4xKX19LAoteyAibW92IiwJMHhmMWMwLAkJMHhmZmMwLAkJRk1UXzQsIHtETTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdiIsCTB4YzAwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtETjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweGY0NDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0ROMCwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdiIsCTB4NTAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7QU0wLCBNRU0yKFNEOCwgQU4xKX19LAoteyAibW92IiwJMHg1MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtBTTAsIE1FTShBTjEpfX0sCi17ICJtb3YiLAkweGY3YTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0FNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3YiLAkweGY0MTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge0FNMCwgTUVNMihJTU0yNCxBTjEpfX0sCi17ICJtb3YiLAkweGYxODAsCQkweGZmYzAsCQlGTVRfNCwge0FNMCwgTUVNMihESSwgQU4xKX19LAoteyAibW92IiwJMHhmNzIwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtBTjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweGY0NTAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0FOMCwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdiIsCTB4ZjgwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtTSU1NMTYsIEROMH19LAoteyAibW92IiwJMHhmNDcwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJtb3YiLAkweGRjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7SU1NMTYsIEFOMH19LAoteyAibW92IiwJMHhmNDc0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi0KLXsgIm1vdngiLAkweGY1NzAwMCwJMHhmZmYwMDAsCUZNVF81LCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92eCIsCTB4Zjc3MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdngiLAkweGY0YjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3Z4IiwJMHhmNTUwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge0RNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdngiLAkweGY3NjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3Z4IiwJMHhmNDMwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLQoteyAibW92YiIsCTB4ZjUyMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3ZiIiwJMHhmN2QwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjRhMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGYwNDAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjRjNDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAoteyAibW92YiIsCTB4MTAsCQkweGYwLAkJRk1UXzEsIHtETTAsIE1FTShBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNTEwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge0RNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdmIiLAkweGY3OTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNDIwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLXsgIm1vdmIiLAkweGYwYzAsCQkweGZmYzAsCQlGTVRfNCwge0RNMCwgTUVNMihESSwgQU4xKX19LAoteyAibW92YiIsCTB4YzQwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtETjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3ZiIiwJMHhmNDQ0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtETjAsIE1FTShJTU0yNF9NRU0pfX0sCi0KLXsgIm1vdmJ1IiwJMHgzMCwJCTB4ZjAsCQlGTVRfMSwge01FTShBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNTMwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNzUwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGY0OTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4ZjA4MCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4Y2MwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZjRjODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAotCi17ICJleHQiLAkweGYzYzEsCQkweGZmZjMsCQlGTVRfNCwge0ROMX19LAoteyAiZXh0eCIsCTB4YjAsIAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCi17ICJleHR4dSIsCTB4YjQsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLXsgImV4dHhiIiwJMHhiOCwJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAoteyAiZXh0eGJ1IiwJMHhiYywJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAotCi17ICJhZGQiLAkweDkwLAkJMHhmMCwJCUZNVF8xLCB7RE4xLCBETTB9fSwKLXsgImFkZCIsCTB4ZjIwMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0xLCBBTjB9fSwKLXsgImFkZCIsCTB4ZjJjMCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBETTB9fSwKLXsgImFkZCIsCTB4ZjI0MCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBBTTB9fSwKLXsgImFkZCIsCTB4ZDQwMCwJCTB4ZmMwMCwJCUZNVF8yLCB7U0lNTTgsIEROMH19LAoteyAiYWRkIiwJMHhmNzE4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTYsIEROMH19LAoteyAiYWRkIiwJMHhmNDYwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJhZGQiLAkweGQwMDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBBTjB9fSwKLXsgImFkZCIsCTB4ZjcwODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBBTjB9fSwKLXsgImFkZCIsCTB4ZjQ2NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAoteyAiYWRkYyIsCTB4ZjI4MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImFkZG5mIiwJMHhmNTBjMDAsCTB4ZmZmYzAwLAlGTVRfNSwge1NJTU04LCBBTjB9fSwKLQoteyAic3ViIiwJMHhhMCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJzdWIiLAkweGYyMTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgQU4wfX0sCi17ICJzdWIiLAkweGYyZDAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJzdWIiLAkweGYyNTAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJzdWIiLAkweGY3MWMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge0lNTTE2LCBETjB9fSwKLXsgInN1YiIsCTB4ZjQ2ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAic3ViIiwJMHhmNzBjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtJTU0xNiwgQU4wfX0sCi17ICJzdWIiLAkweGY0NmMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKLXsgInN1YmMiLAkweGYyOTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgIm11bCIsCTB4ZjM0MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgIm11bHUiLAkweGYzNTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgImRpdnUiLAkweGYzNjAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgImNtcCIsCTB4ZjM5MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImNtcCIsCTB4ZjIyMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0xLCBBTjB9fSwKLXsgImNtcCIsCTB4ZjJlMCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBETTB9fSwKLXsgImNtcCIsCTB4ZjI2MCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBBTTB9fSwKLXsgImNtcCIsCTB4ZDgwMCwJCTB4ZmMwMCwJCUZNVF8yLCB7U0lNTTgsIEROMH19LAoteyAiY21wIiwJMHhmNzQ4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTYsIEROMH19LAoteyAiY21wIiwJMHhmNDc4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJjbXAiLAkweGVjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7SU1NMTYsIEFOMH19LAoteyAiY21wIiwJMHhmNDdjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi0KLXsgImFuZCIsCTB4ZjMwMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImFuZCIsCTB4ZjUwMDAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgImFuZCIsCTB4ZjcwMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCi17ICJhbmQiLAkweGY3MTAwMDAwLAkweGZmZmYwMDAwLAlGTVRfNiwge1NJTU0xNk4sIFBTV319LAoteyAib3IiLAkJMHhmMzEwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAib3IiLAkJMHhmNTA4MDAsCTB4ZmZmYzAwLAlGTVRfNSwge0lNTTgsIEROMH19LAoteyAib3IiLAkJMHhmNzQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgIm9yIiwJCTB4ZjcxNDAwMDAsCTB4ZmZmZjAwMDAsCUZNVF82LCB7U0lNTTE2TiwgUFNXfX0sCi17ICJ4b3IiLAkweGYzMjAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJ4b3IiLAkweGY3NGMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAibm90IiwJMHhmM2U0LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLQoteyAiYXNyIiwJMHhmMzM4LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLXsgImxzciIsCTB4ZjMzYywJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi17ICJyb3IiLAkweGYzMzQsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAoteyAicm9sIiwJMHhmMzMwLAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLQoteyAiYnRzdCIsCTB4ZjUwNDAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgImJ0c3QiLAkweGY3MDQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAiYnNldCIsCTB4ZjAyMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0wLCBNRU0oQU4xKX19LAoteyAiYmNsciIsCTB4ZjAzMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0wLCBNRU0oQU4xKX19LAotCi17ICJiZXEiLAkweGU4MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJuZSIsCTB4ZTkwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmx0IiwJMHhlMDAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibGUiLAkweGUzMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJnZSIsCTB4ZTIwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmd0IiwJMHhlMTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiY3MiLAkweGU0MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJscyIsCTB4ZTcwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNjIiwJMHhlNjAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiaGkiLAkweGU1MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJ2YyIsCTB4ZjVmYzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidnMiLAkweGY1ZmQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5jIiwJMHhmNWZlMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJucyIsCTB4ZjVmZjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJicmEiLAkweGVhMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLQoteyAiYmVxeCIsCTB4ZjVlODAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibmV4IiwJMHhmNWU5MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJsdHgiLAkweGY1ZTAwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxleCIsCTB4ZjVlMzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ2V4IiwJMHhmNWUyMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJndHgiLAkweGY1ZTEwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNzeCIsCTB4ZjVlNDAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibHN4IiwJMHhmNWU3MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJjY3giLAkweGY1ZTYwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmhpeCIsCTB4ZjVlNTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidmN4IiwJMHhmNWVjMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJ2c3giLAkweGY1ZWQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5jeCIsCTB4ZjVlZTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibnN4IiwJMHhmNWVmMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLQoteyAiam1wIiwJMHhmYzAwMDAsCTB4ZmYwMDAwLAlGTVRfMywge0lNTTE2X1BDUkVMfX0sCi17ICJqbXAiLAkweGY0ZTAwMDAwLAkweGZmZmYwMDAwLAlGTVRfNywge0lNTTI0X1BDUkVMfX0sCi17ICJqbXAiLAkweGYwMDAsCQkweGZmZjMsCQlGTVRfNCwge1BBUkVOLEFOMSxQQVJFTn19LAoteyAianNyIiwJMHhmZDAwMDAsCTB4ZmYwMDAwLAlGTVRfMywge0lNTTE2X1BDUkVMfX0sCi17ICJqc3IiLAkweGY0ZTEwMDAwLAkweGZmZmYwMDAwLAlGTVRfNywge0lNTTI0X1BDUkVMfX0sCi17ICJqc3IiLAkweGYwMDEsCQkweGZmZjMsCQlGTVRfNCwge1BBUkVOLEFOMSxQQVJFTn19LAotCi17ICJub3AiLAkweGY2LAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi0KLXsgInJ0cyIsCTB4ZmUsCQkweGZmLAkJRk1UXzEsIHtVTlVTRUR9fSwKLXsgInJ0aSIsCTB4ZWIsCQkweGZmLAkJRk1UXzEsIHtVTlVTRUR9fSwKLQotLyogRXh0ZW5zaW9uLiAgV2UgbmVlZCBzb21lIGluc3RydWN0aW9uIHRvIHRyaWdnZXIgImVtdWxhdGVkIHN5c2NhbGxzIgotICAgZm9yIG91ciBzaW11bGF0b3IuICAqLwoteyAic3lzY2FsbCIsCTB4ZjAxMCwJCTB4ZmZmZiwJCUZNVF80LCB7VU5VU0VEfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdoZW4gdGFsa2luZyB0byB0aGUgc2ltdWxhdG9yLCBnZGIgcmVxdWlyZXMgc29tZSBpbnN0cnVjdGlvbgotICAgdGhhdCB3aWxsIHRyaWdnZXIgYSAiYnJlYWtwb2ludCIgKHJlYWxseSBqdXN0IGFuIGluc3RydWN0aW9uIHRoYXQgaXNuJ3QKLSAgIG90aGVyd2lzZSB1c2VkIGJ5IHRoZSB0b29scy4gIFRoaXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSB0aGUgc2FtZSBzaXplCi0gICBhcyB0aGUgc21hbGxlc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIHRhcmdldCBtYWNoaW5lLiAgSW4gdGhlIGNhc2Ugb2YgdGhlCi0gICBtbjEweDAwIHRoZSAiYnJlYWsiIGluc3RydWN0aW9uIG11c3QgYmUgb25lIGJ5dGUuICAweGZmIGlzIGF2YWlsYWJsZSBvbgotICAgYm90aCBtbjEweDAwIGFyY2hpdGVjdHVyZXMuICAqLwoteyAiYnJlYWsiLCAgICAgIDB4ZmYsICAgICAgICAgICAweGZmLCAgICAgICAgICAgRk1UXzEsIHtVTlVTRUR9fSwKLQoteyAwLCAwLCAwLCAwLCB7MH19LAotCi19IDsKLQotY29uc3QgaW50IG1uMTAyMDBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKG1uMTAyMDBfb3Bjb2RlcykgLyBzaXplb2YgKG1uMTAyMDBfb3Bjb2Rlc1swXSk7Ci0KLQwKZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMzAwLWRpcy5jIGIvb3Bjb2Rlcy9tMTAzMDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNWJmZmMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAzMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgTU4xMDMwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIHZvaWQgZGlzYXNzZW1ibGUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgdW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBpbnQpKTsKLQotaW50IAotcHJpbnRfaW5zbl9tbjEwMzAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgaW50IGNvbnN1bWU7Ci0KLSAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLwotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDEsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbnNuID0gKih1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKLQotICAvKiBUaGVzZSBhcmUgb25lIGJ5dGUgaW5zbnMuICAqLwotICBpZiAoKGluc24gJiAweGYzKSA9PSAweDAwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MTAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgzYwotICAgICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQxCi0gICAgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1MAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweDU0Ci0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg3MAotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweDkwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4YTAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHhiMAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2IKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkMAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ0Ci0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhlMAotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZmKQotICAgIHsKLSAgICAgIGNvbnN1bWUgPSAxOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YjAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjgKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDMKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDIKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NTgKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NWMKLQkgICB8fCAoKGluc24gJiAweGYwKSA9PSAweGMwCi0JICAgICAgICYmIChpbnNuICYgMHhmZikgIT0gMHhjYgotCSAgICAgICAmJiAoaW5zbiAmIDB4ZmYpICE9IDB4Y2MKLQkgICAgICAgJiYgKGluc24gJiAweGZmKSAhPSAweGNkKQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMgotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMwotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNikKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSAyOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmOAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhjYyAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDEKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDIKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MmMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGUKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGYKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2MpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDg7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGZhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNDsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZpdmUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhjZAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhkYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDU7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBzaXggYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmZAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNjsKLSAgICB9Ci0KLSAgLyogRWxzZSBpdHMgYSBzZXZlbiBieXRlIGluc25zIChpbiB0aGVvcnkpLiAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSA3OwotICAgIH0KLQotICBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgY29uc3VtZSk7Ci0KLSAgcmV0dXJuIGNvbnN1bWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgc2l6ZSkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiltbjEwMzAwX29wY29kZXM7Ci0gIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOwotICBpbnQgc3RhdHVzLCBtYXRjaCA9IDA7Ci0KLSAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGludCBteXNpemUsIGV4dHJhX3NoaWZ0OwotCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzApCi0JbXlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1MxCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QwKQotCW15c2l6ZSA9IDI7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TMgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EMSkKLQlteXNpemUgPSAzOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzQpCi0JbXlzaXplID0gNTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QyKQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9ENCkKLQlteXNpemUgPSA2OwotICAgICAgZWxzZQotCW15c2l6ZSA9IDc7Ci0JCi0gICAgICBpZiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZQotCSAgJiYgc2l6ZSA9PSAodW5zaWduZWQgaW50KSBteXNpemUKLQkgICYmIChvcC0+bWFjaGluZSA9PSAwCi0JICAgICAgfHwgb3AtPm1hY2hpbmUgPT0gaW5mby0+bWFjaCkpCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0JICB1bnNpZ25lZCBpbnQgbm9jb21tYTsKLQkgIGludCBwYXJlbiA9IDA7Ci0JICAKLQkgIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9EMSB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TMSkKLQkgICAgZXh0cmFfc2hpZnQgPSA4OwotCSAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDIgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDQKLQkJICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzIgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzQKLQkJICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzYgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDUpCi0JICAgIGV4dHJhX3NoaWZ0ID0gMTY7Ci0JICBlbHNlCi0JICAgIGV4dHJhX3NoaWZ0ID0gMDsKLQotCSAgaWYgKHNpemUgPT0gMSB8fCBzaXplID09IDIpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDMKLQkJICAgJiYgKG9wLT5mb3JtYXQgPT0gRk1UX0QxCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZGYwMDAwCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZGUwMDAwKSkKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gMykKLQkgICAgewotCSAgICAgIGluc24gJj0gMHhmZjAwMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA0Ci0JCSAgICYmIChvcC0+b3Bjb2RlID09IDB4ZmFmODAwMDAKLQkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhmYWYwMDAwMAotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGZhZjQwMDAwKSkKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNCkKLQkgICAgewotCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAyLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQotCSAgICAgIGluc24gfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDUgJiYgb3AtPm9wY29kZSA9PSAweGRjMDAwMDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCAmIDB4ZmZmZmZmMDApID4+IDg7Ci0JICAgICAgZXh0ZW5zaW9uID0gdGVtcCAmIDB4ZmY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMGZmOwotCSAgICAgIGluc24gfD0gdGVtcCA8PCA4OwotCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDQsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uID0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDYpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKLQkgICAgICBpbnNuIHw9ICh0ZW1wID4+IDE2KSAmIDB4ZmZmZjsKLQkgICAgICBleHRlbnNpb24gPSB0ZW1wICYgMHhmZmZmOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDcgJiYgb3AtPm9wY29kZSA9PSAweGRkMDAwMDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCA+PiA4KSAmIDB4ZmZmZmZmOwotCSAgICAgIGV4dGVuc2lvbiA9ICh0ZW1wICYgMHhmZikgPDwgMTY7Ci0JICAgICAgCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDUsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uIHw9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmZmYwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgPj4gMTYpICYgMHhmZmZmOwotCSAgICAgIGV4dGVuc2lvbiA9ICh0ZW1wICYgMHhmZmZmKSA8PCA4OwotCSAgICAgIAotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA2LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiB8PSAqKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7Ci0JICAgIH0KLQotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOwotCi0JICAvKiBOb3cgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KLQkgIGZvciAob3BpbmRleF9wdHIgPSBvcC0+b3BlcmFuZHMsIG5vY29tbWEgPSAxOwotCSAgICAgICAqb3BpbmRleF9wdHIgIT0gMDsKLQkgICAgICAgb3BpbmRleF9wdHIrKykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQkgICAgICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUExJVCkgIT0gMCkKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQkJICB2YWx1ZSA9IGluc24gJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkJICB2YWx1ZSA8PD0gKDMyIC0gb3BlcmFuZC0+Yml0cyk7Ci0JCSAgdGVtcCA9IGV4dGVuc2lvbiA+PiBvcGVyYW5kLT5zaGlmdDsKLQkJICB0ZW1wICY9ICgoMSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKTsKLQkJICB2YWx1ZSB8PSB0ZW1wOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGV4dGVuc2lvbiA+PiAob3BlcmFuZC0+c2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCX0KLQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JCSAgKQotCQl2YWx1ZSA9ICgobG9uZykodmFsdWUgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpCi0JCQkgID4+ICgzMiAtIG9wZXJhbmQtPmJpdHMpKTsKLQotCSAgICAgIGlmICghbm9jb21tYQotCQkgICYmICghcGFyZW4KLQkJICAgICAgfHwgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikgPT0gMCkpKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQotCSAgICAgIG5vY29tbWEgPSAwOwotCQkKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0RSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQlZCIsIHZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0FSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImElZCIsIHZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInNwIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUFNXKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInBzdyIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX01EUikgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJtZHIiKTsKLQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BBUkVOKSAhPSAwKQotCQl7Ci0JCSAgaWYgKHBhcmVuKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIigiKTsKLQkJICAgICAgbm9jb21tYSA9IDE7Ci0JCSAgICB9Ci0JCSAgcGFyZW4gPSAhcGFyZW47Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCkgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobG9uZykgdmFsdWUgKyBtZW1hZGRyLCBpbmZvKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NRU1BRERSKSAhPSAwKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCkgIT0gMCkKLQkJewotCQkgIGludCBjb21tYSA9IDA7Ci0KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlsiKTsKLQkJICBpZiAodmFsdWUgJiAweDgwKQotCQkgICAgewotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQyIik7Ci0JCSAgICAgIGNvbW1hID0gMTsKLQkJICAgIH0KLQotCQkgIGlmICh2YWx1ZSAmIDB4NDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb21tYSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQzIik7Ci0JCSAgICAgIGNvbW1hID0gMTsKLQkJICAgIH0KLQotCQkgIGlmICh2YWx1ZSAmIDB4MjApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb21tYSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImEyIik7Ci0JCSAgICAgIGNvbW1hID0gMTsKLQkJICAgIH0KLQotCQkgIGlmICh2YWx1ZSAmIDB4MTApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb21tYSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImEzIik7Ci0JCSAgICAgIGNvbW1hID0gMTsKLQkJICAgIH0KLQotCQkgIGlmICh2YWx1ZSAmIDB4MDgpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb21tYSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm90aGVyIik7Ci0JCSAgICAgIGNvbW1hID0gMTsKLQkJICAgIH0KLQotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXSIpOwotCQl9Ci0KLQkgICAgICBlbHNlIAotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOwotCSAgICB9Ci0JICAvKiBBbGwgZG9uZS4gKi8KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwNHgiKSwgaW5zbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMgYi9vcGNvZGVzL20xMDMwMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwYzBmMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDMwMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKiBBc3NlbWJsZSBNYXRzdXNoaXRhIE1OMTAzMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgZm9ybWF0dGVkIGF0ID4gODAgY29sdW1ucy4gIEF0dGVtcHRpbmcgdG8gcmVhZCBpdCBvbiBhCi0gICBzY3JlZWVuIHdpdGggbGVzcyB0aGFuIDgwIGNvbHVtbnMgd2lsbCBiZSBkaWZmaWN1bHQuICAqLwotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAzMDAuaCIKLQotDAotY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCBtbjEwMzAwX29wZXJhbmRzW10gPSB7Ci0jZGVmaW5lIFVOVVNFRAkwCi0gIHswLCAwLCAwfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4wICAgICAgKFVOVVNFRCsxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETjEgICAgICAoRE4wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4yICAgICAgKEROMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMCAgICAgIChETjIrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE0xICAgICAgKERNMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMiAgICAgIChETTErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjAgICAgICAoRE0yKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMSAgICAgIChBTjArMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjIgICAgICAoQU4xKzEpCi0gIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0wICAgICAgKEFOMisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTTEgICAgICAoQU0wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0yICAgICAgKEFNMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NOCAgICAoQU0yKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTYgICAgKElNTTgrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBwYy1yZWxhdGl2ZSBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgcGMtcmVsYXRpdmUgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTZfUENSRUwgICAgKElNTTE2KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDE2Yml0IHVuc2lnbmVkIGRpc3BhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU0xNl9NRU0gICAgKElNTTE2X1BDUkVMKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCAxNmJpdHMgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLiAKLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyICAgIChJTU0xNl9NRU0rMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVR9LAotCi0vKiAzMmJpdCBwYy1yZWxhdGl2ZSBvZmZzZXQuICAqLwotI2RlZmluZSBJTU0zMl9QQ1JFTCAgICAoSU1NMzIrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUx9LAotCi0vKiAzMmJpdCBtZW1vcnkgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMzJfTUVNICAgIChJTU0zMl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDE2IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDE2Yml0cyBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQsIGxvdyAxNmJpdHMgYXJlIGxlZnQKLSAgIHNoaWZ0ZWQgOCBwbGFjZXMuIAotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfTE9XU0hJRlQ4ICAgIChJTU0zMl9NRU0rMSkKLSAgezE2LCA4LCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAyNCBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZC4KLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyX0hJR0gyNCAgICAoSU1NMzJfTE9XU0hJRlQ4KzEpCi0gIHsyNCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMfSwKLQotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDI0IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLCBsb3cgOCBiaXRzIGFyZSBsZWZ0Ci0gICBzaGlmdGVkIDE2IHBsYWNlcy4gCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMl9ISUdIMjRfTE9XU0hJRlQxNiAgICAoSU1NMzJfSElHSDI0KzEpCi0gIHsyNCwgMTYsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTH0sCi0KLS8qIFN0YWNrIHBvaW50ZXIuICAqLwotI2RlZmluZSBTUCAgICAoSU1NMzJfSElHSDI0X0xPV1NISUZUMTYrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TUH0sCi0KLS8qIFByb2Nlc3NvciBzdGF0dXMgd29yZC4gICovCi0jZGVmaW5lIFBTVyAgICAoU1ArMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9QU1d9LAotCi0vKiBNRFIgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNRFIgICAgKFBTVysxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX01EUn0sCi0KLS8qIEluZGV4IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgREkgKE1EUisxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDggICAgKERJKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMzJiaXQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDE2ICAgIChTRDgrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50IHRoYXQgY2FuIG5vdCBwcm9tb3RlLiAgKi8KLSNkZWZpbmUgU0Q4TiAgICAoU0QxNisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDggYml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIFNEOE5fUENSRUwgICAgKFNEOE4rMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUwgfCBNTjEwMzAwX09QRVJBTkRfUkVMQVh9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50IHNoaWZ0ZWQgbGVmdCA4IGJpdHMgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0Q4Tl9TSElGVDggICAgKFNEOE5fUENSRUwrMSkKLSAgezgsIDgsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NOCAgICAoU0Q4Tl9TSElGVDgrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDMyYml0ICBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NMTYgICAgKFNJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogRWl0aGVyIGFuIG9wZW4gcGFyZW4gb3IgY2xvc2UgcGFyZW4uICAqLwotI2RlZmluZSBQQVJFTgkoU0lNTTE2KzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUEFSRU59LCAKLQotLyogZG4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEROMDEgICAgIChQQVJFTisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUR9LAotCi0vKiBhbiByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIgcG9zaXRpb25zLiAgKi8KLSNkZWZpbmUgQU4wMSAgICAgKEROMDErMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9BUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogMTZiaXQgcGMtcmVsYXRpdmUgZGlzcGxhY2VtZW50IHdoaWNoIG1heSBwcm9tb3RlIHRvIDMyYml0IHBjLXJlbGF0aXZlCi0gICBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBEMTZfU0hJRlQgKEFOMDErMSkKLSAgezE2LCA4LCBNTjEwMzAwX09QRVJBTkRfUENSRUwgfCBNTjEwMzAwX09QRVJBTkRfUkVMQVggfCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogOCBiaXQgaW1tZWRpYXRlIGZvdW5kIGluIHRoZSBleHRlbnNpb24gd29yZC4gICovCi0jZGVmaW5lIElNTThFICAgIChEMTZfU0hJRlQrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRH0sCi0KLS8qIFJlZ2lzdGVyIGxpc3QgZm91bmQgaW4gdGhlIGV4dGVuc2lvbiB3b3JkIHNoaWZ0ZWQgOCBiaXRzIGxlZnQuICAqLwotI2RlZmluZSBSRUdTRV9TSElGVDggICAgKElNTThFKzEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQgfCBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1R9LAotCi0vKiBSZWdpc3RlciBsaXN0IHNoaWZ0ZWQgOCBiaXRzIGxlZnQuICAqLwotI2RlZmluZSBSRUdTX1NISUZUOCAoUkVHU0VfU0hJRlQ4ICsgMSkKLSAgezgsIDgsIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVH0sCi0KLS8qIFJlaWdzdGVyIGxpc3QuICAqLwotI2RlZmluZSBSRUdTICAgIChSRUdTX1NISUZUOCsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUfSwKLQotCi19IDsgCi0KLSNkZWZpbmUgTUVNKEFERFIpIFBBUkVOLCBBRERSLCBQQVJFTiAKLSNkZWZpbmUgTUVNSU5DKEFERFIpIFBBUkVOLCBBRERSLCBQTFVTLCBQQVJFTiAKLSNkZWZpbmUgTUVNSU5DMihBRERSLElOQykgUEFSRU4sIEFERFIsIFBMVVMsIElOQywgUEFSRU4gCi0jZGVmaW5lIE1FTTIoQUREUjEsQUREUjIpIFBBUkVOLCBBRERSMSwgQUREUjIsIFBBUkVOIAotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCQlPUENPREUJCU1BU0sJTUFUQ0hfTUFTSywgRk9STUFULCBQUk9DRVNTT1IJeyBPUEVSQU5EUyB9Ci0KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0gICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCi0KLWNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSBtbjEwMzAwX29wY29kZXNbXSA9IHsKLXsgIm1vdiIsCTB4ODAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEROMDF9fSwKLXsgIm1vdiIsCTB4ODAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtETTEsIEROMH19LAoteyAibW92IiwJMHhmMWUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoteyAibW92IiwJMHhmMWQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoteyAibW92IiwJMHg5MDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtJTU04LCBBTjAxfX0sCi17ICJtb3YiLAkweDkwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7QU0xLCBBTjB9fSwKLXsgIm1vdiIsCTB4M2MsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtTUCwgQU4wfX0sCi17ICJtb3YiLAkweGYyZjAsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgU1B9fSwKLXsgIm1vdiIsCTB4ZjJlNCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7UFNXLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjJmMywJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBQU1d9fSwKLXsgIm1vdiIsCTB4ZjJlMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7TURSLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjJmMiwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRFJ9fSwKLXsgIm1vdiIsCTB4NzAsCSAgICAgMHhmMCwJICAwLCAgICBGTVRfUzAsIDAsCXtNRU0oQU0wKSwgRE4xfX0sCi17ICJtb3YiLAkweDU4MDAsCSAgICAgMHhmY2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92IiwJMHgzMDAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3YiLAkweGYwMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTShBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4NWMwMCwJICAgICAweGZjZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNKFNQKSwgQU4wfX0sCi17ICJtb3YiLAkweGZhYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTShJTU0xNl9NRU0pLCBBTjB9fSwKLXsgIm1vdiIsCTB4NjAsCSAgICAgMHhmMCwJICAwLCAgICBGTVRfUzAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3YiLAkweDQyMDAsCSAgICAgMHhmM2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe0RNMSwgTUVNKFNQKX19LAoteyAibW92IiwJMHgwMTAwMDAsICAgIDB4ZjMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtETTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweGYwMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgTUVNKEFOMCl9fSwKLXsgIm1vdiIsCTB4NDMwMCwJICAgICAweGYzZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7QU0xLCBNRU0oU1ApfX0sCi17ICJtb3YiLAkweGZhODAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0FNMSwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdiIsCTB4NWMwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNMihJTU04LCBTUCksIEFOMH19LAoteyAibW92IiwJMHhmODAwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCwgQU0wKSwgRE4xfX0sCi17ICJtb3YiLAkweGZhMDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgRE4xfX0sCi17ICJtb3YiLAkweDU4MDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4ZmFiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjMwMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgRE4yfX0sCi17ICJtb3YiLAkweGY4MjAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LEFNMCksIEFOMX19LAoteyAibW92IiwJMHhmYTIwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEFOMX19LAoteyAibW92IiwJMHhmYWIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEFOMH19LAoteyAibW92IiwJMHhmMzgwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBBTjJ9fSwKLXsgIm1vdiIsCTB4NDMwMCwJICAgICAweGYzMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7QU0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92IiwJMHhmODEwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3YiLAkweGZhMTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3YiLAkweDQyMDAsCSAgICAgMHhmMzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0RNMSwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZmE5MTAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKElNTTE2LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZjM0MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3YiLAkweGY4MzAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0FNMSwgTUVNMihTRDgsIEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmEzMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7QU0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmE5MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7QU0xLCBNRU0yKElNTTE2LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZjNjMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0yLCBNRU0yKERJLCBBTjApfX0sCi0KLS8qIFRoZXNlIG11c3QgY29tZSBhZnRlciBtb3N0IG9mIHRoZSBvdGhlciBtb3ZlIGluc3RydWN0aW9ucyB0byBhdm9pZCBtYXRjaGluZwotICAgYSBzeW1ib2xpYyBuYW1lIHdpdGggSU1NeHggb3BlcmFuZHMuICBVZ2guICAqLwoteyAibW92IiwJMHgyYzAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAibW92IiwJMHhmY2NjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJtb3YiLAkweDI0MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0lNTTE2LCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmNkYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAibW92IiwJMHhmY2E0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgRE4wfX0sCi17ICJtb3YiLAkweGZjYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTShJTU0zMl9NRU0pLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmM4MTAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0oSU1NMzJfTUVNKX19LAoteyAibW92IiwJMHhmYzgwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtBTTEsIE1FTShJTU0zMl9NRU0pfX0sCi17ICJtb3YiLAkweGZjMDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCi17ICJtb3YiLAkweGZjYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweGZjMjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweGZjYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgQU4wfX0sCi17ICJtb3YiLAkweGZjMTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3YiLAkweGZjOTEwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMiwgU1ApfX0sCi17ICJtb3YiLAkweGZjMzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0FNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3YiLAkweGZjOTAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0FNMSwgTUVNMihJTU0zMiwgU1ApfX0sCi0vKiBUaGVzZSBub24tcHJvbW90aW5nIHZhcmlhbnRzIG5lZWQgdG8gY29tZSBhZnRlciBhbGwgdGhlIG90aGVyIG1lbW9yeQotICAgbW92ZXMuICAqLwoteyAibW92IiwJMHhmOGYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtNRU0yKFNEOE4sIEFNMCksIFNQfX0sCi17ICJtb3YiLAkweGY4ZjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe1NQLCBNRU0yKFNEOE4sIEFOMCl9fSwKLQotCi0KLXsgIm1vdmJ1IiwJMHhmMDQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4Zjg0MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsIEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGZhNDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4ZjhiODAwLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNKFNQKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZjhiODAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihJTU04LCBTUCksIEROMH19LAoteyAibW92YnUiLAkweGZhYjgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZjQwMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgRE4yfX0sCi17ICJtb3ZidSIsCTB4MzQwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92YnUiLAkweGYwNTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmODUwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3ZidSIsCTB4ZmE1MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmODkyMDAsICAgIDB4ZmZmM2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTShTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmODkyMDAsICAgIDB4ZmZmMzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZmE5MjAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKElNTTE2LCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmNDQwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTIsIE1FTTIoREksIEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHgwMjAwMDAsICAgIDB4ZjMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtETTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3ZidSIsCTB4ZmM0MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBETjF9fSwKLXsgIm1vdmJ1IiwJMHhmY2I4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEROMH19LAoteyAibW92YnUiLAkweGZjYTgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTShJTU0zMl9NRU0pLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmYzUwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsQU4wKX19LAoteyAibW92YnUiLAkweGZjOTIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMiwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZmM4MjAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0oSU1NMzJfTUVNKX19LAotCi17ICJtb3ZodSIsCTB4ZjA2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGY4NjAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdmh1IiwJMHhmYTYwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGY4YmMwMCwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92aHUiLAkweGY4YmMwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmYWJjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92aHUiLAkweGY0ODAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92aHUiLAkweDM4MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmMDcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3ZodSIsCTB4Zjg3MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92aHUiLAkweGZhNzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3ZodSIsCTB4Zjg5MzAwLCAgICAweGZmZjNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3ZodSIsCTB4Zjg5MzAwLCAgICAweGZmZjMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92aHUiLAkweGZhOTMwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZjRjMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3ZodSIsCTB4MDMwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92aHUiLAkweGZjNjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCi17ICJtb3ZodSIsCTB4ZmNiYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmY2FjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZmM3MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYzkzMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92aHUiLAkweGZjODMwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLQoteyAiZXh0IiwJMHhmMmQwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLQoteyAiZXh0YiIsCTB4MTAsIAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi0KLXsgImV4dGJ1IiwJMHgxNCwJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAotCi17ICJleHRoIiwJMHgxOCwJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAotCi17ICJleHRodSIsCTB4MWMsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLQoteyAibW92bSIsCTB4Y2UwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNKFNQKSwgUkVHU319LAoteyAibW92bSIsCTB4Y2YwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7UkVHUywgTUVNKFNQKX19LAotCi17ICJjbHIiLAkweDAwLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4xfX0sCi0KLXsgImFkZCIsCTB4ZTAsCSAgICAgMHhmMCwJICAwLCAgICBGTVRfUzAsIDAsCXtETTEsIEROMH19LAoteyAiYWRkIiwJMHhmMTYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoteyAiYWRkIiwJMHhmMTUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoteyAiYWRkIiwJMHhmMTcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEFOMH19LAoteyAiYWRkIiwJMHgyODAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJhZGQiLAkweGZhYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJhZGQiLAkweDIwMDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBBTjB9fSwKLXsgImFkZCIsCTB4ZmFkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7U0lNTTE2LCBBTjB9fSwKLXsgImFkZCIsCTB4ZjhmZTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIFNQfX0sCi17ICJhZGQiLAkweGZhZmUwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgU1B9fSwKLXsgImFkZCIsCTB4ZmNjMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAiYWRkIiwJMHhmY2QwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCi17ICJhZGQiLAkweGZjZmUwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBTUH19LAotCi17ICJhZGRjIiwJMHhmMTQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAotCi17ICJzdWIiLAkweGYxMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJzdWIiLAkweGYxMjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJzdWIiLAkweGYxMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJzdWIiLAkweGYxMzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJzdWIiLAkweGZjYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInN1YiIsCTB4ZmNkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAotCi17ICJzdWJjIiwJMHhmMTgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAotCi17ICJtdWwiLAkweGYyNDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi0KLXsgIm11bHUiLAkweGYyNTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi0KLXsgImRpdiIsCTB4ZjI2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLQoteyAiZGl2dSIsCTB4ZjI3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLQoteyAiaW5jIiwJMHg0MCwJICAgICAweGYzLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMX19LAoteyAiaW5jIiwJMHg0MSwJICAgICAweGYzLAkgIDAsICAgIEZNVF9TMCwgMCwJe0FOMX19LAotCi17ICJpbmM0IiwJMHg1MCwJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0FOMH19LAotCi17ICJjbXAiLAkweGEwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBETjAxfX0sCi17ICJjbXAiLAkweGEwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgImNtcCIsCTB4ZjFhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgImNtcCIsCTB4ZjE5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgImNtcCIsCTB4YjAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7SU1NOCwgQU4wMX19LAoteyAiY21wIiwJMHhiMCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJjbXAiLAkweGZhYzgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJjbXAiLAkweGZhZDgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBBTjB9fSwKLXsgImNtcCIsCTB4ZmNjODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAiY21wIiwJMHhmY2Q4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCi0KLXsgImFuZCIsCTB4ZjIwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFuZCIsCTB4ZjhlMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJhbmQiLAkweGZhZTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgImFuZCIsCTB4ZmFmYzAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIFBTV319LAoteyAiYW5kIiwJMHhmY2UwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi0KLXsgIm9yIiwJCTB4ZjIxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgIm9yIiwJCTB4ZjhlNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJvciIsCQkweGZhZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgIm9yIiwJCTB4ZmFmZDAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIFBTV319LAoteyAib3IiLAkJMHhmY2U0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi0KLXsgInhvciIsCTB4ZjIyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInhvciIsCTB4ZmFlODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoteyAieG9yIiwJMHhmY2U4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi0KLXsgIm5vdCIsCTB4ZjIzMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi0KLXsgImJ0c3QiLAkweGY4ZWMwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYnRzdCIsCTB4ZmFlYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoteyAiYnRzdCIsCTB4ZmNlYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAiYnRzdCIsCTB4ZmUwMjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q1LCAwLAl7SU1NOEUsIE1FTShJTU0zMl9MT1dTSElGVDgpfX0sCi17ICJidHN0IiwJMHhmYWY4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsIAl7SU1NOCwgTUVNMihTRDhOX1NISUZUOCwgQU4wKX19LAotCi17ICJic2V0IiwJMHhmMDgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJic2V0IiwJMHhmZTAwMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDUsIDAsCXtJTU04RSwgTUVNKElNTTMyX0xPV1NISUZUOCl9fSwKLXsgImJzZXQiLAkweGZhZjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTgsIE1FTTIoU0Q4Tl9TSElGVDgsIEFOMCl9fSwKLQoteyAiYmNsciIsCTB4ZjA5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAiYmNsciIsCTB4ZmUwMTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q1LCAwLAl7SU1NOEUsIE1FTShJTU0zMl9MT1dTSElGVDgpfX0sCi17ICJiY2xyIiwJMHhmYWY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU04LCBNRU0yKFNEOE5fU0hJRlQ4LEFOMCl9fSwKLQoteyAiYXNyIiwJMHhmMmIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiYXNyIiwJMHhmOGM4MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImFzciIsCTB4ZjhjODAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCi0KLXsgImxzciIsCTB4ZjJhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImxzciIsCTB4ZjhjNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJsc3IiLAkweGY4YzQwMSwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0ROMH19LAotCi17ICJhc2wiLAkweGYyOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhc2wiLAkweGY4YzAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYXNsIiwJMHhmOGMwMDEsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETjB9fSwKLQoteyAiYXNsMiIsCTB4NTQsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLQoteyAicm9yIiwJMHhmMjg0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLQoteyAicm9sIiwJMHhmMjgwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLQoteyAiYmVxIiwJMHhjODAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibmUiLAkweGM5MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJndCIsCTB4YzEwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmdlIiwJMHhjMjAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibGUiLAkweGMzMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJsdCIsCTB4YzAwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmhpIiwJMHhjNTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiY2MiLAkweGM2MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJscyIsCTB4YzcwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmNzIiwJMHhjNDAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJidmMiLAkweGY4ZTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJ2cyIsCTB4ZjhlOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5jIiwJMHhmOGVhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibnMiLAkweGY4ZWIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJyYSIsCTB4Y2EwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAotCi17ICJsZXEiLAkweGQ4LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsbmUiLAkweGQ5LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsZ3QiLAkweGQxLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsZ2UiLAkweGQyLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsbGUiLAkweGQzLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsbHQiLAkweGQwLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsaGkiLAkweGQ1LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsY2MiLAkweGQ2LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsbHMiLAkweGQ3LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsY3MiLAkweGQ0LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJscmEiLAkweGRhLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJzZXRsYiIsCTB4ZGIsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLQoteyAiam1wIiwJMHhmMGY0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQQVJFTixBTjAsUEFSRU59fSwKLXsgImptcCIsCTB4Y2MwMDAwLCAgICAweGZmMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7SU1NMTZfUENSRUx9fSwKLXsgImptcCIsCTB4ZGMwMDAwMDAsICAweGZmMDAwMDAwLCAgMCwgICAgRk1UX1M0LCAwLAl7SU1NMzJfSElHSDI0fX0sCi17ICJjYWxsIiwJMHhjZDAwMDAwMCwgIDB4ZmYwMDAwMDAsICAwLCAgICBGTVRfUzQsIDAsCXtEMTZfU0hJRlQsUkVHUyxJTU04RX19LAoteyAiY2FsbCIsCTB4ZGQwMDAwMDAsICAweGZmMDAwMDAwLCAgMCwgICAgRk1UX1M2LCAwLAl7SU1NMzJfSElHSDI0X0xPV1NISUZUMTYsIFJFR1NFX1NISUZUOCxJTU04RX19LAoteyAiY2FsbHMiLAkweGYwZjAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe1BBUkVOLEFOMCxQQVJFTn19LAoteyAiY2FsbHMiLAkweGZhZmYwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2X1BDUkVMfX0sCi17ICJjYWxscyIsCTB4ZmNmZjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzJfUENSRUx9fSwKLQoteyAicmV0IiwJMHhkZjAwMDAsICAgIDB4ZmYwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtSRUdTX1NISUZUOCwgSU1NOH19LAoteyAicmV0ZiIsCTB4ZGUwMDAwLCAgICAweGZmMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7UkVHU19TSElGVDgsIElNTTh9fSwKLXsgInJldHMiLAkweGYwZmMsCSAgICAgMHhmZmZmLAkgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAoteyAicnRpIiwJMHhmMGZkLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInRyYXAiLAkweGYwZmUsCSAgICAgMHhmZmZmLAkgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAoteyAicnRtIiwJMHhmMGZmLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgIm5vcCIsCTB4Y2IsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLQotLyogVURGIGluc3RydWN0aW9ucy4gICovCi17ICJ1ZGYwMCIsCTB4ZjYwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAwIiwJMHhmOTAwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMCIsCTB4ZmIwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDAiLAkweGZkMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjAxIiwJMHhmNjEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDEiLAkweGY5MTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjAxIiwJMHhmYjEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZmQxMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDIiLAkweGY2MjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMiIsCTB4ZjkyMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDIiLAkweGZiMjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAyIiwJMHhmZDIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZjYzMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAzIiwJMHhmOTMwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZmIzMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDMiLAkweGZkMzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA0IiwJMHhmNjQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDQiLAkweGY5NDAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA0IiwJMHhmYjQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZmQ0MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDUiLAkweGY2NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwNSIsCTB4Zjk1MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDUiLAkweGZiNTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA1IiwJMHhmZDUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4ZjY2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA2IiwJMHhmOTYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4ZmI2MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDYiLAkweGZkNjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA3IiwJMHhmNjcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDciLAkweGY5NzAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA3IiwJMHhmYjcwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZmQ3MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDgiLAkweGY2ODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwOCIsCTB4Zjk4MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDgiLAkweGZiODAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA4IiwJMHhmZDgwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4ZjY5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA5IiwJMHhmOTkwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4ZmI5MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDkiLAkweGZkOTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjEwIiwJMHhmNmEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTAiLAkweGY5YTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjEwIiwJMHhmYmEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZmRhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTEiLAkweGY2YjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxMSIsCTB4ZjliMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTEiLAkweGZiYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjExIiwJMHhmZGIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZjZjMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEyIiwJMHhmOWMwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZmJjMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTIiLAkweGZkYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjEzIiwJMHhmNmQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTMiLAkweGY5ZDAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjEzIiwJMHhmYmQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZmRkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTQiLAkweGY2ZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxNCIsCTB4ZjllMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTQiLAkweGZiZTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjE0IiwJMHhmZGUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZjZmMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjE1IiwJMHhmOWYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZmJmMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTUiLAkweGZkZjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjIwIiwJMHhmNTAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjEiLAkweGY1MTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyMiIsCTB4ZjUyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjIzIiwJMHhmNTMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjQiLAkweGY1NDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyNSIsCTB4ZjU1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI2IiwJMHhmNTYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjciLAkweGY1NzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyOCIsCTB4ZjU4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI5IiwJMHhmNTkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzAiLAkweGY1YTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzMSIsCTB4ZjViMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMyIiwJMHhmNWMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzMiLAkweGY1ZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzNCIsCTB4ZjVlMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjM1IiwJMHhmNWYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmdTAwIiwJMHhmOTA0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMCIsCTB4ZmIwNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDAiLAkweGZkMDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwMSIsCTB4ZjkxNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDEiLAkweGZiMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAxIiwJMHhmZDE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDIiLAkweGY5MjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTAyIiwJMHhmYjI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwMiIsCTB4ZmQyNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTAzIiwJMHhmOTM0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMyIsCTB4ZmIzNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDMiLAkweGZkMzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNCIsCTB4Zjk0NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDQiLAkweGZiNDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA0IiwJMHhmZDQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDUiLAkweGY5NTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA1IiwJMHhmYjU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNSIsCTB4ZmQ1NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA2IiwJMHhmOTY0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwNiIsCTB4ZmI2NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDYiLAkweGZkNjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNyIsCTB4Zjk3NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDciLAkweGZiNzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA3IiwJMHhmZDc0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDgiLAkweGY5ODQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA4IiwJMHhmYjg0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwOCIsCTB4ZmQ4NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA5IiwJMHhmOTk0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwOSIsCTB4ZmI5NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDkiLAkweGZkOTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMCIsCTB4ZjlhNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTAiLAkweGZiYTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTEwIiwJMHhmZGE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTEiLAkweGY5YjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTExIiwJMHhmYmI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMSIsCTB4ZmRiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTEyIiwJMHhmOWM0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxMiIsCTB4ZmJjNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTIiLAkweGZkYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMyIsCTB4ZjlkNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTMiLAkweGZiZDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTEzIiwJMHhmZGQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTQiLAkweGY5ZTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTE0IiwJMHhmYmU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxNCIsCTB4ZmRlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTE1IiwJMHhmOWY0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxNSIsCTB4ZmJmNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTUiLAkweGZkZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLQoteyAicHV0eCIsCTB4ZjUwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE4wMX19LAoteyAiZ2V0eCIsCTB4ZjZmMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE4wMX19LAoteyAibXVscSIsCTB4ZjYwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLXsgIm11bHEiLAkweGY5MDAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe1NJTU04LCBETjB9fSwKLXsgIm11bHEiLAkweGZiMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgQU0zMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJtdWxxIiwJMHhmZDAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIEFNMzAsCXtJTU0zMiwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZjYxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLXsgIm11bHF1IiwJMHhmOTE0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTSU1NOCwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZmIxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCBBTTMwLAl7U0lNTTE2LCBETjB9fSwKLXsgIm11bHF1IiwJMHhmZDE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIEFNMzAsCXtJTU0zMiwgRE4wfX0sCi17ICJzYXQxNiIsCTB4ZjY0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLQoteyAic2F0MjQiLAkweGY2NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi0KLXsgImJzY2giLAkweGY2NzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdlIG5lZWQgc29tZSBpbnN0cnVjdGlvbiB0byB0cmlnZ2VyICJlbXVsYXRlZCBzeXNjYWxscyIKLSAgIGZvciBvdXIgc2ltdWxhdG9yLiAgKi8KLXsgInN5c2NhbGwiLCAgICAweGYwYzAsICAgICAgMHhmZmZmLCAgICAgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAotCi0vKiBFeHRlbnNpb24uICBXaGVuIHRhbGtpbmcgdG8gdGhlIHNpbXVsYXRvciwgZ2RiIHJlcXVpcmVzIHNvbWUgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgd2lsbCB0cmlnZ2VyIGEgImJyZWFrcG9pbnQiIChyZWFsbHkganVzdCBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzbid0Ci0gICBvdGhlcndpc2UgdXNlZCBieSB0aGUgdG9vbHMuICBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgdGhlIHNhbWUgc2l6ZQotICAgYXMgdGhlIHNtYWxsZXN0IGluc3RydWN0aW9uIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gIEluIHRoZSBjYXNlIG9mIHRoZQotICAgbW4xMHgwMCB0aGUgImJyZWFrIiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9uZSBieXRlLiAgMHhmZiBpcyBhdmFpbGFibGUgb24KLSAgIGJvdGggbW4xMHgwMCBhcmNoaXRlY3R1cmVzLiAgKi8KLXsgImJyZWFrIiwJMHhmZiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAotCi0gCi17IDAsIDAsIDAsIDAsIDAsIDAsIHswfX0sCi0KLX0gOwotCi1jb25zdCBpbnQgbW4xMDMwMF9udW1fb3Bjb2RlcyA9Ci0gIHNpemVvZiAobW4xMDMwMF9vcGNvZGVzKSAvIHNpemVvZiAobW4xMDMwMF9vcGNvZGVzWzBdKTsKLQotDApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWFzbS5jIGIvb3Bjb2Rlcy9tMzJyLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzhjZDczLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tYXNtLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwYXJzZV9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgY29uc3QgY2hhciAqKiwgQ0dFTl9GSUVMRFMgKikpOwotDAotLyogLS0gYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gYXNtLmMgKi8KLQotLyogSGFuZGxlICcjJyBwcmVmaXhlcyAoaS5lLiBza2lwIG92ZXIgdGhlbSkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oYXNoIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEhhbmRsZSBzaGlnaCgpLCBoaWdoKCkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oaTE2IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLQotICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAiaGlnaCgiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDU7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTywKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLSAgCSAgJiYgcmVzdWx0X3R5cGUgPT0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIpCi0JdmFsdWUgPj49IDE2OwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgInNoaWdoKCIsIDYpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNjsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPLAotIAkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlID0gKHZhbHVlID4+IDE2KSArICh2YWx1ZSAmIDB4ODAwMCA/IDEgOiAwKTsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiBIYW5kbGUgbG93KCkgaW4gYSBzaWduZWQgY29udGV4dC4gIEFsc28gaGFuZGxlIHNkYSgpLgotICAgVGhlIHNpZ25lZG5lc3Mgb2YgdGhlIHZhbHVlIGRvZXNuJ3QgbWF0dGVyIHRvIGxvdygpLCBidXQgdGhpcyBhbHNvCi0gICBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGxvdygpIGlzbid0IHByZXNlbnQuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9zbG8xNiAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBsb25nICp2YWx1ZXA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgImxvdygiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDQ7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9MTzE2LAotCQkJCSAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgIGlmIChlcnJtc2cgPT0gTlVMTAotCSAgJiYgcmVzdWx0X3R5cGUgPT0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIpCi0JdmFsdWUgJj0gMHhmZmZmOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgInNkYSgiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDQ7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9TREExNiwKLQkJCQkgICBOVUxMLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiBIYW5kbGUgbG93KCkgaW4gYW4gdW5zaWduZWQgY29udGV4dC4KLSAgIFRoZSBzaWduZWRuZXNzIG9mIHRoZSB2YWx1ZSBkb2Vzbid0IG1hdHRlciB0byBsb3coKSwgYnV0IHRoaXMgYWxzbwotICAgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBsb3coKSBpc24ndCBwcmVzZW50LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfdWxvMTYgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBpZiAoKipzdHJwID09ICcjJykKLSAgICArKypzdHJwOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJsb3coIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfTE8xNiwKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlICY9IDB4ZmZmZjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIHBhcnNpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWNvbnN0IGNoYXIgKgotbTMycl9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBvcGluZGV4LCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBjaGFyICoqIHN0cnA7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotewotICBjb25zdCBjaGFyICogZXJybXNnOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfRElTUDE2LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9ESVNQMjQsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfRElTUDgsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9oYXNoIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0hBU0gsICZmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgZXJybXNnID0gcGFyc2VfaGkxNiAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9ISTE2LCAmZmllbGRzLT5mX2hpMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9TSU1NMTYsICZmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0lNTTgsICZmaWVsZHMtPmZfc2ltbTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZXJybXNnID0gcGFyc2Vfc2xvMTYgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0xPMTYsICZmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU0xNiwgJmZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfVUlNTTQsICZmaWVsZHMtPmZfdWltbTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU01LCAmZmllbGRzLT5mX3VpbW01KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX3VsbzE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VMTzE2LCAmZmllbGRzLT5mX3VpbW0xNik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHBhcnNpbmcuXG4iKSwgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLWNnZW5fcGFyc2VfZm4gKiBjb25zdCBtMzJyX2NnZW5fcGFyc2VfaGFuZGxlcnNbXSA9IAotewotICBwYXJzZV9pbnNuX25vcm1hbCwKLX07Ci0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X2FzbSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIG0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBtMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wYXJzZV9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX3BhcnNlX2hhbmRsZXJzWzBdOwotICBjZC0+cGFyc2Vfb3BlcmFuZCA9IG0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IGluc24gcGFyc2VyLgotCi0gICBUaGUgc3ludGF4IHN0cmluZyBpcyBzY2FubmVkIGFuZCBvcGVyYW5kcyBhcmUgcGFyc2VkIGFuZCBzdG9yZWQgaW4gRklFTERTLgotICAgUmVsb2NzIGFyZSBxdWV1ZWQgYXMgd2UgZ28gdmlhIG90aGVyIGNhbGxiYWNrcy4KLQotICAgPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBhbiBhbGwtb3Itbm90aGluZyBwYXJzZXIuICBJZiB3ZSBmYWlsIHRvCi0gICBwYXJzZSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHJldHVybiAwIGFuZCB0aGUgY2FsbGVyIHdpbGwgc3RhcnQgb3ZlciBmcm9tCi0gICB0aGUgYmVnaW5uaW5nLiAgQmFja3RyYWNraW5nIHdpbGwgYmUgbmVjZXNzYXJ5IGluIHBhcnNpbmcgc3ViZXhwcmVzc2lvbnMsCi0gICBidXQgdGhhdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS4gIE5vdCBoYW5kbGluZyBiYWNrdHJhY2tpbmcgaGVyZSBtYXkgZ2V0Ci0gICBleHBlbnNpdmUgaW4gdGhlIGNhc2Ugb2YgdGhlIG02OGsuICBEZWFsIHdpdGggbGF0ZXIuCi0KLSAgIFJldHVybnMgTlVMTCBmb3Igc3VjY2VzcywgYW4gZXJyb3IgbWVzc2FnZSBmb3IgZmFpbHVyZS4KLSovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2luc25fbm9ybWFsIChjZCwgaW5zbiwgc3RycCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotewotICAvKiA/Pz8gUnVudGltZSBhZGRlZCBpbnNucyBub3QgaGFuZGxlZCB5ZXQuICAqLwotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGNvbnN0IGNoYXIgKnN0ciA9ICpzdHJwOwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICAvKiBGSVhNRTogd2lwICovCi0gIGludCBwYXN0X29wY29kZV9wOwotI2VuZGlmCi0KLSAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhlIG1uZW1vbmljIGlzIGZpcnN0ICh0aGVyZSBhcmUgbm8gbGVhZGluZyBvcGVyYW5kcykuCi0gICAgIFdlIGNhbiBwYXJzZSBpdCB3aXRob3V0IG5lZWRpbmcgdG8gc2V0IHVwIG9wZXJhbmQgcGFyc2luZy4KLSAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCBlbnN1cmUgbW5lbW9uaWNzIGFyZSBsb3dlcmNhc2UsIGJ1dCB3ZSBtYXkKLSAgICAgbm90IGJlIGNhbGxlZCBmcm9tIEdBUy4gICovCi0gIHAgPSBDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pOwotICB3aGlsZSAoKnAgJiYgdG9sb3dlciAoKnApID09IHRvbG93ZXIgKCpzdHIpKQotICAgICsrcCwgKytzdHI7Ci0gIAotICBpZiAoKiBwIHx8ICgqIHN0ciAmJiAhaXNzcGFjZSAoKiBzdHIpKSkKLSAgICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci0KLSAgQ0dFTl9JTklUX1BBUlNFIChjZCk7Ci0gIGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIChjZCk7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICBwYXN0X29wY29kZV9wID0gMDsKLSNlbmRpZgotCi0gIC8qIFdlIGRvbid0IGNoZWNrIGZvciAoKnN0ciAhPSAnXDAnKSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0byBwYXJzZQotICAgICBhbnkgdHJhaWxpbmcgZmFrZSBhcmd1bWVudHMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLwotICBzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7Ci0KLSAgLyogTW5lbW9uaWNzIGNvbWUgZmlyc3QgZm9yIG5vdywgZW5zdXJlIHZhbGlkIHN0cmluZy4gICovCi0gIGlmICghIENHRU5fU1lOVEFYX01ORU1PTklDX1AgKCogc3luKSkKLSAgICBhYm9ydCAoKTsKLQotICArK3N5bjsKLQotICB3aGlsZSAoKiBzeW4gIT0gMCkKLSAgICB7Ci0gICAgICAvKiBOb24gb3BlcmFuZCBjaGFycyBtdXN0IG1hdGNoIGV4YWN0bHkuICAqLwotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCXsKLQkgIGlmICgqc3RyID09IENHRU5fU1lOVEFYX0NIQVIgKCogc3luKSkKLQkgICAgewotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLQkgICAgICBpZiAoKiBzeW4gPT0gJyAnKQotCQlwYXN0X29wY29kZV9wID0gMTsKLSNlbmRpZgotCSAgICAgICsrIHN5bjsKLQkgICAgICArKyBzdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFN5bnRheCBjaGFyIGRpZG4ndCBtYXRjaC4gIENhbid0IGJlIHRoaXMgaW5zbi4gICovCi0JICAgICAgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gcmV0dXJuIHNvbWV0aGluZyBsaWtlCi0JCSAiZXhwZWN0ZWQgY2hhciBgYyciICovCi0JICAgICAgcmV0dXJuIF8oInN5bnRheCBlcnJvciIpOwotCSAgICB9Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZCBvZiBzb21lIHNvcnQuICAqLwotICAgICAgZXJybXNnID0gbTMycl9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCSAgJnN0ciwgZmllbGRzKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLQotICAgICAgLyogRG9uZSB3aXRoIHRoaXMgb3BlcmFuZCwgY29udGludWUgd2l0aCBuZXh0IG9uZS4gICovCi0gICAgICArKyBzeW47Ci0gICAgfQotCi0gIC8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHN5bnRheCBzdHJpbmcsIHdlJ3JlIGRvbmUuICAqLwotICBpZiAoKiBzeW4gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogRm9yIHRoZSBtb21lbnQgd2UgYXNzdW1lIGEgdmFsaWQgYHN0cicgY2FuIG9ubHkgY29udGFpbgotCSBibGFua3Mgbm93LiAgSUU6IFdlIG5lZWRuJ3QgdHJ5IGFnYWluIHdpdGggYSBsb25nZXIgdmVyc2lvbiBvZgotCSB0aGUgaW5zbiBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IGxvbmdlciB2ZXJzaW9ucyBvZiBpbnNucyBhcHBlYXIKLQkgYmVmb3JlIHNob3J0ZXIgb25lcyAoZWc6IGxzciByMixyMywxIHZzIGxzciByMixyMykuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLQkrKyBzdHI7Ci0KLSAgICAgIGlmICgqIHN0ciAhPSAnXDAnKQotCXJldHVybiBfKCJqdW5rIGF0IGVuZCBvZiBsaW5lIik7IC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgYHN0cicgKi8KLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGNvdWxkbid0IHBhcnNlIGl0LiAgKi8KLSAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotfQotDAotLyogTWFpbiBlbnRyeSBwb2ludC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLgotICAgU1RSIHBvaW50cyB0byB0aGUgaW5zbiB0byBiZSBhc3NlbWJsZWQuCi0gICBXZSBhc3N1bWUgYWxsIG5lY2Vzc2FyeSB0YWJsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgVGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiwgbGVzcyBhbnkgZml4dXBzLCBpcyBzdG9yZWQgaW4gQlVGLgotICAgUmVtZW1iZXIgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgdGhlbiBCVUYgaXMgYW4gaW50IGFuZCB0aHVzIHRoZSB2YWx1ZQotICAgc3RpbGwgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIHRhcmdldCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGIGlzIGFuIGFycmF5Ci0gICBvZiBieXRlcyBpbiB0YXJnZXQgYnl0ZSBvcmRlci4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuJ3MgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSwKLSAgIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJlZCAoYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuCi0gICBwcmludGVkKS4KLQotICAgTm90ZSB0aGF0IHdoZW4gcHJvY2Vzc2luZyAobm9uLWFsaWFzKSBtYWNyby1pbnNucywKLSAgIHRoaXMgZnVuY3Rpb24gcmVjdXJzZXMuCi0KLSAgID8/PyBJdCdzIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBjcHUtaW5kZXBlbmRlbnQuCi0gICBPbmUgd291bGQgaGF2ZSB0byBkZWFsIHdpdGggYSBmZXcgbWlub3IgdGhpbmdzLgotICAgQXQgdGhpcyBwb2ludCBpbiB0aW1lIGRvaW5nIHNvIHdvdWxkIGJlIG1vcmUgb2YgYSBjdXJpb3NpdHkgdGhhbiB1c2VmdWwKLSAgIFtmb3IgZXhhbXBsZSB0aGlzIGZpbGUgaXNuJ3QgX3RoYXRfIGJpZ10sIGJ1dCBrZWVwaW5nIHRoZSBwb3NzaWJpbGl0eSBpbgotICAgbWluZCBoZWxwcyBrZWVwIHRoZSBkZXNpZ24gY2xlYW4uICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24gKGNkLCBzdHIsIGZpZWxkcywgYnVmLCBlcnJtc2cpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLSAgICArKyBzdHI7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2hlZCBsaXN0cy4KLSAgICAgR2V0IHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4gICovCi0gIGlsaXN0ID0gQ0dFTl9BU01fTE9PS1VQX0lOU04gKGNkLCBzdHIpOwotCi0gIC8qIEtlZXAgbG9va2luZyB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guICAqLwotCi0gIHN0YXJ0ID0gc3RyOwotICBmb3IgKCA7IGlsaXN0ICE9IE5VTEwgOyBpbGlzdCA9IENHRU5fQVNNX05FWFRfSU5TTiAoaWxpc3QpKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGlsaXN0LT5pbnNuOwotCi0jaWYgMCAvKiBub3QgbmVlZGVkIGFzIHVuc3VwcG9ydGVkIG9wY29kZXMgc2hvdWxkbid0IGJlIGluIHRoZSBoYXNoIGxpc3RzICovCi0gICAgICAvKiBJcyB0aGlzIGluc24gc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBjcHU/ICAqLwotICAgICAgaWYgKCEgbTMycl9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogSWYgdGhlIFJFTEFYIGF0dHJpYnV0ZSBpcyBzZXQsIHRoaXMgaXMgYW4gaW5zbiB0aGF0IHNob3VsZG4ndCBiZQotCSBjaG9zZW4gaW1tZWRpYXRlbHkuICBJbnN0ZWFkLCBpdCBpcyB1c2VkIGR1cmluZyBhc3NlbWJsZXIvbGlua2VyCi0JIHJlbGF4YXRpb24gaWYgcG9zc2libGUuICAqLwotICAgICAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN0ciA9IHN0YXJ0OwotCi0gICAgICAvKiBBbGxvdyBwYXJzZS9pbnNlcnQgaGFuZGxlcnMgdG8gb2J0YWluIGxlbmd0aCBvZiBpbnNuLiAgKi8KLSAgICAgIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci0KLSAgICAgIGlmICghIENHRU5fUEFSU0VfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sICYgc3RyLCBmaWVsZHMpKQotCXsKLQkgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotCSAgaWYgKENHRU5fSU5TRVJUX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZiwgKGJmZF92bWEpIDApCi0JICAgICAgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JICAvKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGFjdHVhbGx5IG91dHB1dCB0aGUgaW5zbiBhbmQgYW55Ci0JICAgICBxdWV1ZWQgcmVsb2NzLiAgKi8KLQkgIHJldHVybiBpbnNuOwotCX0KLQotICAgICAgLyogVHJ5IHRoZSBuZXh0IGVudHJ5LiAgKi8KLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIGNhbiByZXR1cm4gYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGFuIHRoaXMuCi0gICAgIE5lZWQgdG8gdHJhY2sgd2h5IGl0IGZhaWxlZCBhbmQgcGljayB0aGUgcmlnaHQgb25lLiAgKi8KLSAgewotICAgIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDBdOwotICAgIGlmIChzdHJsZW4gKHN0YXJ0KSA+IDUwKQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcy4uLiciKSwgc3RhcnQpOwotICAgIGVsc2UgCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzJyIpLCBzdGFydCk7Ci0gICAgICAKLSAgICAqZXJybXNnID0gZXJyYnVmOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0MCi0jaWYgMCAvKiBUaGlzIGNhbGxzIGJhY2sgdG8gR0FTIHdoaWNoIHdlIGNhbid0IGRvIHdpdGhvdXQgY2FyZS4gICovCi0KLS8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KLSAgIFRoaXMgbGV0cyBHQVMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4KLSAgID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCi0gICBGSVhNRTogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2FzbV9oYXNoX2tleXdvcmRzIChjZCwgb3B2YWxzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0tFWVdPUkQgKm9wdmFsczsKLXsKLSAgQ0dFTl9LRVlXT1JEX1NFQVJDSCBzZWFyY2ggPSBjZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKG9wdmFscywgTlVMTCk7Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqIGtlOwotCi0gIHdoaWxlICgoa2UgPSBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQgKCYgc2VhcmNoKSkgIT0gTlVMTCkKLSAgICB7Ci0jaWYgMCAvKiBVbm5lY2Vzc2FyeSwgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIHNlYXJjaCByb3V0aW5lLiAgKi8KLSAgICAgIGlmICghIG0zMnJfY2dlbl9vcHZhbF9zdXBwb3J0ZWQgKGtlKSkKLQljb250aW51ZTsKLSNlbmRpZgotICAgICAgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIChjZCwga2UtPm5hbWUsIGtlLT52YWx1ZSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWRlc2MuYyBiL29wY29kZXMvbTMyci1kZXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjU0NjIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWRlc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDExNTAgKzAsMCBAQAotLyogQ1BVIGRhdGEgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBib29sX2F0dHJbXSA9Ci17Ci0gIHsgIiNmIiwgMCB9LAotICB7ICIjdCIsIDEgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgTUFDSF9hdHRyW10gPQotewotICB7ICJiYXNlIiwgTUFDSF9CQVNFIH0sCi0gIHsgIm0zMnIiLCBNQUNIX00zMlIgfSwKLSAgeyAibWF4IiwgTUFDSF9NQVggfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgSVNBX2F0dHJbXSA9Ci17Ci0gIHsgIm0zMnIiLCBJU0FfTTMyUiB9LAotICB7ICJtYXgiLCBJU0FfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFU0VSVkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxPQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkNBQ0hFLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQUk9GSUxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTkVHQVRJVkUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTRU0tT05MWSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMT0MiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkhBU0gtUFJFRklYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiRklMTC1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSVNBIG0zMnJfY2dlbl9pc2FfdGFibGVbXSA9IHsKLSAgeyAibTMyciIsIDMyLCAzMiwgMTYsIDMyLCAgfSwKLSAgeyAwIH0KLX07Ci0KLS8qIE1hY2hpbmUgdmFyaWFudHMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIIG0zMnJfY2dlbl9tYWNoX3RhYmxlW10gPSB7Ci0gIHsgIm0zMnIiLCAibTMyciIsIE1BQ0hfTTMyUiB9LAotICB7IDAgfQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAiZnAiLCAxMyB9LAotICB7ICJsciIsIDE0IH0sCi0gIHsgInNwIiwgMTUgfSwKLSAgeyAicjAiLCAwIH0sCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0gIHsgInIxMCIsIDEwIH0sCi0gIHsgInIxMSIsIDExIH0sCi0gIHsgInIxMiIsIDEyIH0sCi0gIHsgInIxMyIsIDEzIH0sCi0gIHsgInIxNCIsIDE0IH0sCi0gIHsgInIxNSIsIDE1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMgPQotewotICAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzWzBdLAotICAxOQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAicHN3IiwgMCB9LAotICB7ICJjYnIiLCAxIH0sCi0gIHsgInNwaSIsIDIgfSwKLSAgeyAic3B1IiwgMyB9LAotICB7ICJicGMiLCA2IH0sCi0gIHsgImJicHN3IiwgOCB9LAotICB7ICJiYnBjIiwgMTQgfSwKLSAgeyAiY3IwIiwgMCB9LAotICB7ICJjcjEiLCAxIH0sCi0gIHsgImNyMiIsIDIgfSwKLSAgeyAiY3IzIiwgMyB9LAotICB7ICJjcjQiLCA0IH0sCi0gIHsgImNyNSIsIDUgfSwKLSAgeyAiY3I2IiwgNiB9LAotICB7ICJjcjciLCA3IH0sCi0gIHsgImNyOCIsIDggfSwKLSAgeyAiY3I5IiwgOSB9LAotICB7ICJjcjEwIiwgMTAgfSwKLSAgeyAiY3IxMSIsIDExIH0sCi0gIHsgImNyMTIiLCAxMiB9LAotICB7ICJjcjEzIiwgMTMgfSwKLSAgeyAiY3IxNCIsIDE0IH0sCi0gIHsgImNyMTUiLCAxNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzID0KLXsKLSAgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1swXSwKLSAgMjMKLX07Ci0KLQotCi0vKiBUaGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9IV18sYSkpCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgbTMycl9jZ2VuX2h3X3RhYmxlW10gPQotewotICB7ICJoLW1lbW9yeSIsIEhXX0hfTUVNT1JZLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2ludCIsIEhXX0hfU0lOVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXVpbnQiLCBIV19IX1VJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1hZGRyIiwgSFdfSF9BRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaWFkZHIiLCBIV19IX0lBRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcGMiLCBIV19IX1BDLCBDR0VOX0FTTV9OT05FLCAwLCB7IDB8QShQUk9GSUxFKXxBKFBDKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1oaTE2IiwgSFdfSF9ISTE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdWxvMTYiLCBIV19IX1VMTzE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZ3IiLCBIV19IX0dSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jciIsIEhXX0hfQ1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtY29uZCIsIEhXX0hfQ09ORCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBzdyIsIEhXX0hfUFNXLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWJicHN3IiwgSFdfSF9CQlBTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWxvY2siLCBIV19IX0xPQ0ssIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lGTERfLGEpKQotCi1jb25zdCBDR0VOX0lGTEQgbTMycl9jZ2VuX2lmbGRfdGFibGVbXSA9Ci17Ci0gIHsgTTMyUl9GX05JTCwgImYtbmlsIiwgMCwgMCwgMCwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfT1AxLCAiZi1vcDEiLCAwLCAzMiwgMCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfT1AyLCAiZi1vcDIiLCAwLCAzMiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQ09ORCwgImYtY29uZCIsIDAsIDMyLCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9SMSwgImYtcjEiLCAwLCAzMiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfUjIsICJmLXIyIiwgMCwgMzIsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9TSU1NOCwgImYtc2ltbTgiLCAwLCAzMiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0lNTTE2LCAiZi1zaW1tMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9TSElGVF9PUDIsICJmLXNoaWZ0LW9wMiIsIDAsIDMyLCA4LCAzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NNCwgImYtdWltbTQiLCAwLCAzMiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1VJTU01LCAiZi11aW1tNSIsIDAsIDMyLCAxMSwgNSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTE2LCAiZi11aW1tMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NMjQsICJmLXVpbW0yNCIsIDAsIDMyLCA4LCAyNCwgeyAwfEEoUkVMT0MpfEEoQUJTX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfSEkxNiwgImYtaGkxNiIsIDAsIDMyLCAxNiwgMTYsIHsgMHxBKFNJR05fT1BUKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0RJU1A4LCAiZi1kaXNwOCIsIDAsIDMyLCA4LCA4LCB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0RJU1AxNiwgImYtZGlzcDE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQMjQsICJmLWRpc3AyNCIsIDAsIDMyLCA4LCAyNCwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotLyogVGhlIG9wZXJhbmQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9PUEVSQU5EXyxhKSkKLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLQotY29uc3QgQ0dFTl9PUEVSQU5EIG0zMnJfY2dlbl9vcGVyYW5kX3RhYmxlW10gPQotewotLyogcGM6IHByb2dyYW0gY291bnRlciAqLwotICB7ICJwYyIsIE0zMlJfT1BFUkFORF9QQywgSFdfSF9QQywgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3I6IHNvdXJjZSByZWdpc3RlciAqLwotICB7ICJzciIsIE0zMlJfT1BFUkFORF9TUiwgSFdfSF9HUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRyOiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotICB7ICJkciIsIE0zMlJfT1BFUkFORF9EUiwgSFdfSF9HUiwgNCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3JjMTogc291cmNlIHJlZ2lzdGVyIDEgKi8KLSAgeyAic3JjMSIsIE0zMlJfT1BFUkFORF9TUkMxLCBIV19IX0dSLCA0LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzcmMyOiBzb3VyY2UgcmVnaXN0ZXIgMiAqLwotICB7ICJzcmMyIiwgTTMyUl9PUEVSQU5EX1NSQzIsIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzY3I6IHNvdXJjZSBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgInNjciIsIE0zMlJfT1BFUkFORF9TQ1IsIEhXX0hfQ1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkY3I6IGRlc3RpbmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyAiZGNyIiwgTTMyUl9PUEVSQU5EX0RDUiwgSFdfSF9DUiwgNCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2ltbTg6IDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAic2ltbTgiLCBNMzJSX09QRVJBTkRfU0lNTTgsIEhXX0hfU0lOVCwgOCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2ltbTE2OiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJzaW1tMTYiLCBNMzJSX09QRVJBTkRfU0lNTTE2LCBIV19IX1NJTlQsIDE2LCAxNiwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWltbTQ6IDQgYml0IHRyYXAgbnVtYmVyICovCi0gIHsgInVpbW00IiwgTTMyUl9PUEVSQU5EX1VJTU00LCBIV19IX1VJTlQsIDEyLCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tNTogNSBiaXQgc2hpZnQgY291bnQgKi8KLSAgeyAidWltbTUiLCBNMzJSX09QRVJBTkRfVUlNTTUsIEhXX0hfVUlOVCwgMTEsIDUsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW0xNjogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1aW1tMTYiLCBNMzJSX09QRVJBTkRfVUlNTTE2LCBIV19IX1VJTlQsIDE2LCAxNiwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaGFzaDogIyBwcmVmaXggKi8KLSAgeyAiaGFzaCIsIE0zMlJfT1BFUkFORF9IQVNILCBIV19IX1NJTlQsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGhpMTY6IGhpZ2ggMTYgYml0IGltbWVkaWF0ZSwgc2lnbiBvcHRpb25hbCAqLwotICB7ICJoaTE2IiwgTTMyUl9PUEVSQU5EX0hJMTYsIEhXX0hfSEkxNiwgMTYsIDE2LAotICAgIHsgMHxBKFNJR05fT1BUKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzbG8xNjogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUsIGZvciBsb3coKSAqLwotICB7ICJzbG8xNiIsIE0zMlJfT1BFUkFORF9TTE8xNiwgSFdfSF9TTE8xNiwgMTYsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1bG8xNjogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSwgZm9yIGxvdygpICovCi0gIHsgInVsbzE2IiwgTTMyUl9PUEVSQU5EX1VMTzE2LCBIV19IX1VMTzE2LCAxNiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW0yNDogMjQgYml0IGFkZHJlc3MgKi8KLSAgeyAidWltbTI0IiwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgSFdfSF9BRERSLCA4LCAyNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCl8QShSRUxPQyl8QShBQlNfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDg6IDggYml0IGRpc3BsYWNlbWVudCAqLwotICB7ICJkaXNwOCIsIE0zMlJfT1BFUkFORF9ESVNQOCwgSFdfSF9JQUREUiwgOCwgOCwKLSAgICB7IDB8QShSRUxBWCl8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMTY6IDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDE2IiwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgSFdfSF9JQUREUiwgMTYsIDE2LAotICAgIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3AyNDogMjQgYml0IGRpc3BsYWNlbWVudCAqLwotICB7ICJkaXNwMjQiLCBNMzJSX09QRVJBTkRfRElTUDI0LCBIV19IX0lBRERSLCA4LCAyNCwKLSAgICB7IDB8QShSRUxBWCl8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBjb25kYml0OiBjb25kaXRpb24gYml0ICovCi0gIHsgImNvbmRiaXQiLCBNMzJSX09QRVJBTkRfQ09OREJJVCwgSFdfSF9DT05ELCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBhY2N1bTogYWNjdW11bGF0b3IgKi8KLSAgeyAiYWNjdW0iLCBNMzJSX09QRVJBTkRfQUNDVU0sIEhXX0hfQUNDVU0sIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBtMzJyX2NnZW5faW5zbl90YWJsZVtNQVhfSU5TTlNdID0KLXsKLSAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgotICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgotICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLwotICB7IDAsIDAsIDAgfSwKLS8qIGFkZCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQURELCAiYWRkIiwgImFkZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZDMgJGRyLCRzciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERDMsICJhZGQzIiwgImFkZDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FORCwgImFuZCIsICJhbmQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FORDMsICJhbmQzIiwgImFuZDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvciAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fT1IsICJvciIsICJvciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yMyAkZHIsJHNyLCRoYXNoJHVsbzE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fT1IzLCAib3IzIiwgIm9yMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHhvciAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fWE9SLCAieG9yIiwgInhvciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHhvcjMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fWE9SMywgInhvcjMiLCAieG9yMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FEREksICJhZGRpIiwgImFkZGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGR2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERWLCAiYWRkdiIsICJhZGR2IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREVjMsICJhZGR2MyIsICJhZGR2MyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZHggJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERFgsICJhZGR4IiwgImFkZHgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYy5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JDOCwgImJjOCIsICJiYy5zIiwgMTYsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkMyNCwgImJjMjQiLCAiYmMubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkVRLCAiYmVxIiwgImJlcSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlcXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JFUVosICJiZXF6IiwgImJlcXoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZ2V6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CR0VaLCAiYmdleiIsICJiZ2V6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmd0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkdUWiwgImJndHoiLCAiYmd0eiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JMRVosICJibGV6IiwgImJsZXoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibHR6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTFRaLCAiYmx0eiIsICJibHR6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5leiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5FWiwgImJuZXoiLCAiYm5leiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkw4LCAiYmw4IiwgImJsLnMiLCAxNiwKLSAgICB7IDB8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibC5sICRkaXNwMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTDI0LCAiYmwyNCIsICJibC5sIiwgMzIsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmMucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkM4LCAiYm5jOCIsICJibmMucyIsIDE2LAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuYy5sICRkaXNwMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkMyNCwgImJuYzI0IiwgImJuYy5sIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQlJBOCwgImJyYTgiLCAiYnJhLnMiLCAxNiwKLSAgICB7IDB8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBicmEubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQlJBMjQsICJicmEyNCIsICJicmEubCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QLCAiY21wIiwgImNtcCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcGkgJHNyYzIsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUEksICJjbXBpIiwgImNtcGkiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXB1ICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QVSwgImNtcHUiLCAiY21wdSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcHVpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBVSSwgImNtcHVpIiwgImNtcHVpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9ESVYsICJkaXYiLCAiZGl2IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2dSAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fRElWVSwgImRpdnUiLCAiZGl2dSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJlbSAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkVNLCAicmVtIiwgInJlbSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJlbXUgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JFTVUsICJyZW11IiwgInJlbXUiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBqbCAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9KTCwgImpsIiwgImpsIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogam1wICRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0pNUCwgImptcCIsICJqbXAiLCAxNiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTEQsICJsZCIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERfRCwgImxkLWQiLCAibGQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREIsICJsZGIiLCAibGRiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRiICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERCX0QsICJsZGItZCIsICJsZGIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGggJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREgsICJsZGgiLCAibGRoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERIX0QsICJsZGgtZCIsICJsZGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVQiwgImxkdWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVCX0QsICJsZHViLWQiLCAibGR1YiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVILCAibGR1aCIsICJsZHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEVUhfRCwgImxkdWgtZCIsICJsZHVoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgJGRyLEAkc3IrICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERfUExVUywgImxkLXBsdXMiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZDI0ICRkciwkdWltbTI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fTEQyNCwgImxkMjQiLCAibGQyNCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTggJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xESTgsICJsZGk4IiwgImxkaTgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkxNiAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREkxNiwgImxkaTE2IiwgImxkaTE2IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbG9jayAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xPQ0ssICJsb2NrIiwgImxvY2siLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtYWNoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0hJLCAibWFjaGkiLCAibWFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtYWNsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0xPLCAibWFjbG8iLCAibWFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtYWN3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXSEksICJtYWN3aGkiLCAibWFjd2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0xPLCAibWFjd2xvIiwgIm1hY3dsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG11bCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMLCAibXVsIiwgIm11bCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG11bGhpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMSEksICJtdWxoaSIsICJtdWxoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMTE8sICJtdWxsbyIsICJtdWxsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG11bHdoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTFdISSwgIm11bHdoaSIsICJtdWx3aGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdWx3bG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXTE8sICJtdWx3bG8iLCAibXVsd2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXYgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WLCAibXYiLCAibXYiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDSEksICJtdmZhY2hpIiwgIm12ZmFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdmZhY2xvICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDTE8sICJtdmZhY2xvIiwgIm12ZmFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdmZhY21pICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDTUksICJtdmZhY21pIiwgIm12ZmFjbWkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdmZjICRkciwkc2NyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQywgIm12ZmMiLCAibXZmYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG12dGFjaGkgJHNyYzEgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0hJLCAibXZ0YWNoaSIsICJtdnRhY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZ0YWNsbyAkc3JjMSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEFDTE8sICJtdnRhY2xvIiwgIm12dGFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdnRjICRzciwkZGNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQywgIm12dGMiLCAibXZ0YyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5lZyAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTkVHLCAibmVnIiwgIm5lZyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vcCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX05PUCwgIm5vcCIsICJub3AiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3QgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX05PVCwgIm5vdCIsICJub3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByYWMgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SQUMsICJyYWMiLCAicmFjIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogcmFjaCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JBQ0gsICJyYWNoIiwgInJhY2giLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBydGUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SVEUsICJydGUiLCAicnRlIiwgMTYsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzZXRoICRkciwkaGFzaCRoaTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0VUSCwgInNldGgiLCAic2V0aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNsbCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0xMLCAic2xsIiwgInNsbCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0xMMywgInNsbDMiLCAic2xsMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNsbGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTEksICJzbGxpIiwgInNsbGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzcmEgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSQSwgInNyYSIsICJzcmEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzcmEzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSQTMsICJzcmEzIiwgInNyYTMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzcmFpICRkciwkdWltbTUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkFJLCAic3JhaSIsICJzcmFpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JsICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkwsICJzcmwiLCAic3JsIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkwzLCAic3JsMyIsICJzcmwzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMSSwgInNybGkiLCAic3JsaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NULCAic3QiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVF9ELCAic3QtZCIsICJzdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEIsICJzdGIiLCAic3RiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUQl9ELCAic3RiLWQiLCAic3RiIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUSCwgInN0aCIsICJzdGgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RIX0QsICJzdGgtZCIsICJzdGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKyRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RfUExVUywgInN0LXBsdXMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxALSRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RfTUlOVVMsICJzdC1taW51cyIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1YiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1VCLCAic3ViIiwgInN1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1YnYgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NVQlYsICJzdWJ2IiwgInN1YnYiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWJ4ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVUJYLCAic3VieCIsICJzdWJ4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogdHJhcCAkdWltbTQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9UUkFQLCAidHJhcCIsICJ0cmFwIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogdW5sb2NrICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1VOTE9DSywgInVubG9jayIsICJ1bmxvY2siLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUAotCi0vKiBJbml0aWFsaXplIGFueXRoaW5nIG5lZWRlZCB0byBiZSBkb25lIG9uY2UsIGJlZm9yZSBhbnkgY3B1X29wZW4gY2FsbC4gICovCi0KLXN0YXRpYyB2b2lkCi1pbml0X3RhYmxlcyAoKQotewotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBsb29rIHVwIGEgbWFjaCB2aWEgaXRzIGJmZCBuYW1lLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fTUFDSCAqCi1sb29rdXBfbWFjaF92aWFfYmZkX25hbWUgKHRhYmxlLCBuYW1lKQotICAgICBjb25zdCBDR0VOX01BQ0ggKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICB3aGlsZSAodGFibGUtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgdGFibGUtPmJmZF9uYW1lKSA9PSAwKQotCXJldHVybiB0YWJsZTsKLSAgICAgICsrdGFibGU7Ci0gICAgfQotICBhYm9ydCAoKTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2h3X3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgaW50IG1hY2hzID0gY2QtPm1hY2hzOwotICBjb25zdCBDR0VOX0hXX0VOVFJZICppbml0ID0gJiBtMzJyX2NnZW5faHdfdGFibGVbMF07Ci0gIC8qIE1BWF9IVyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KLSAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgotICAgICB0aGUgdGFibGUuICAqLwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqc2VsZWN0ZWQgPQotICAgIChjb25zdCBDR0VOX0hXX0VOVFJZICoqKSB4bWFsbG9jIChNQVhfSFcgKiBzaXplb2YgKENHRU5fSFdfRU5UUlkgKikpOwotCi0gIGNkLT5od190YWJsZS5pbml0X2VudHJpZXMgPSBpbml0OwotICBjZC0+aHdfdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9IV19FTlRSWSk7Ci0gIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7Ci0gIC8qID8/PyBGb3Igbm93IHdlIGp1c3QgdXNlIG1hY2hzIHRvIGRldGVybWluZSB3aGljaCBvbmVzIHdlIHdhbnQuICAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLm5hbWUgIT0gTlVMTDsgKytpKQotICAgIGlmIChDR0VOX0hXX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX0hXX01BQ0gpCi0JJiBtYWNocykKLSAgICAgIHNlbGVjdGVkW2luaXRbaV0udHlwZV0gPSAmaW5pdFtpXTsKLSAgY2QtPmh3X3RhYmxlLmVudHJpZXMgPSBzZWxlY3RlZDsKLSAgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX0hXOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaWZpZWxkX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBjZC0+aWZsZF90YWJsZSA9ICYgbTMycl9jZ2VuX2lmbGRfdGFibGVbMF07Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9vcGVyYW5kX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgaW50IG1hY2hzID0gY2QtPm1hY2hzOwotICBjb25zdCBDR0VOX09QRVJBTkQgKmluaXQgPSAmIG0zMnJfY2dlbl9vcGVyYW5kX3RhYmxlWzBdOwotICAvKiBNQVhfT1BFUkFORFMgaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVudHJpZXMuCi0gICAgIEhvd2V2ZXIgZWFjaCBlbnRyeSBpcyBpbmRleGVkIGJ5IGl0J3MgZW51bSBzbyB0aGVyZSBjYW4gYmUgaG9sZXMgaW4KLSAgICAgdGhlIHRhYmxlLiAgKi8KLSAgY29uc3QgQ0dFTl9PUEVSQU5EICoqc2VsZWN0ZWQgPQotICAgIChjb25zdCBDR0VOX09QRVJBTkQgKiopIHhtYWxsb2MgKE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKLQotICBjZC0+b3BlcmFuZF90YWJsZS5pbml0X2VudHJpZXMgPSBpbml0OwotICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX09QRVJBTkQpOwotICBtZW1zZXQgKHNlbGVjdGVkLCAwLCBNQVhfT1BFUkFORFMgKiBzaXplb2YgKENHRU5fT1BFUkFORCAqKSk7Ci0gIC8qID8/PyBGb3Igbm93IHdlIGp1c3QgdXNlIG1hY2ggdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCi0gICAgaWYgKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFICgmaW5pdFtpXSwgQ0dFTl9PUEVSQU5EX01BQ0gpCi0JJiBtYWNocykKLSAgICAgIHNlbGVjdGVkW2luaXRbaV0udHlwZV0gPSAmaW5pdFtpXTsKLSAgY2QtPm9wZXJhbmRfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOwotICBjZC0+b3BlcmFuZF90YWJsZS5udW1fZW50cmllcyA9IE1BWF9PUEVSQU5EUzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLgotICAgPz8/IFRoaXMgY291bGQgbGVhdmUgb3V0IGluc25zIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNwZWNpZmllZCBtYWNoL2lzYSwKLSAgIGJ1dCB0aGF0IHdvdWxkIGNhdXNlIGVycm9ycyBsaWtlICJmb28gb25seSBzdXBwb3J0ZWQgYnkgYmFyIiB0byBiZWNvbWUKLSAgICJ1bmtub3duIGluc24iLCBzbyBmb3Igbm93IHdlIGluY2x1ZGUgYWxsIGluc25zIGFuZCByZXF1aXJlIHRoZSBhcHAgdG8KLSAgIGRvIHRoZSBjaGVja2luZyBsYXRlci4KLSAgID8/PyBPbiB0aGUgb3RoZXIgaGFuZCwgcGFyc2luZyBvZiBzdWNoIGluc25zIG1heSByZXF1aXJlIHRoZWlyIGhhcmR3YXJlIG9yCi0gICBvcGVyYW5kIGVsZW1lbnRzIHRvIGJlIGluIHRoZSB0YWJsZSBbd2hpY2ggdGhleSBtaWdodG4ndCBiZV0uICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaW5zbl90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBtMzJyX2NnZW5faW5zbl90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAoTUFYX0lOU05TICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLQotICBtZW1zZXQgKGluc25zLCAwLCBNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0uYmFzZSA9ICZpYltpXTsKLSAgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7Ci0gIGNkLT5pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOwotICBjZC0+aW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gTUFYX0lOU05TOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byByZWJ1aWxkIHRoZSB0YWJsZXMuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9jZ2VuX3JlYnVpbGRfdGFibGVzIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaSxuX2lzYXMsbl9tYWNoczsKLSAgdW5zaWduZWQgaW50IGlzYXMgPSBjZC0+aXNhczsKLSAgdW5zaWduZWQgaW50IG1hY2hzID0gY2QtPm1hY2hzOwotCi0gIGNkLT5pbnRfaW5zbl9wID0gQ0dFTl9JTlRfSU5TTl9QOwotCi0gIC8qIERhdGEgZGVyaXZlZCBmcm9tIHRoZSBpc2Egc3BlYy4gICovCi0jZGVmaW5lIFVOU0VUIChDR0VOX1NJWkVfVU5LTk9XTiArIDEpCi0gIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IFVOU0VUOwotICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBVTlNFVDsKLSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSA2NTUzNTsgLyogc29tZSByaWRpY3Vsb3VzbHkgYmlnIG51bWJlciAqLwotICBjZC0+bWF4X2luc25fYml0c2l6ZSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSVNBUzsgKytpKQotICAgIGlmICgoKDEgPDwgaSkgJiBpc2FzKSAhPSAwKQotICAgICAgewotCWNvbnN0IENHRU5fSVNBICppc2EgPSAmIG0zMnJfY2dlbl9pc2FfdGFibGVbaV07Ci0KLQkvKiBEZWZhdWx0IGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKLQkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KLQlpZiAoY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID09IFVOU0VUKQotCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gaXNhLT5kZWZhdWx0X2luc25fYml0c2l6ZTsKLQllbHNlIGlmIChpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplID09IGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSkKLQkgIDsgLyogdGhpcyBpcyBvayAqLwotCWVsc2UKLQkgIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOwotCi0JLyogQmFzZSBpbnNuIHNpemVzIG9mIGFsbCBzZWxlY3RlZCBpc2FzIG11c3QgYmUgZXF1YWwgb3Igd2Ugc2V0Ci0JICAgdGhlIHJlc3VsdCB0byAwLCBtZWFuaW5nICJ1bmtub3duIi4gICovCi0JaWYgKGNkLT5iYXNlX2luc25fYml0c2l6ZSA9PSBVTlNFVCkKLQkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IGlzYS0+YmFzZV9pbnNuX2JpdHNpemU7Ci0JZWxzZSBpZiAoaXNhLT5iYXNlX2luc25fYml0c2l6ZSA9PSBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0JICA7IC8qIHRoaXMgaXMgb2sgKi8KLQllbHNlCi0JICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBDR0VOX1NJWkVfVU5LTk9XTjsKLQotCS8qIFNldCBtaW4sbWF4IGluc24gc2l6ZXMuICAqLwotCWlmIChpc2EtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+bWluX2luc25fYml0c2l6ZSkKLQkgIGNkLT5taW5faW5zbl9iaXRzaXplID0gaXNhLT5taW5faW5zbl9iaXRzaXplOwotCWlmIChpc2EtPm1heF9pbnNuX2JpdHNpemUgPiBjZC0+bWF4X2luc25fYml0c2l6ZSkKLQkgIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gaXNhLT5tYXhfaW5zbl9iaXRzaXplOwotCi0JKytuX2lzYXM7Ci0gICAgICB9Ci0KLSAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIG1hY2ggc3BlYy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBNQVhfTUFDSFM7ICsraSkKLSAgICBpZiAoKCgxIDw8IGkpICYgbWFjaHMpICE9IDApCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9NQUNIICptYWNoID0gJiBtMzJyX2NnZW5fbWFjaF90YWJsZVtpXTsKLQotCSsrbl9tYWNoczsKLSAgICAgIH0KLQotICAvKiBEZXRlcm1pbmUgd2hpY2ggaHcgZWxlbWVudHMgYXJlIHVzZWQgYnkgTUFDSC4gICovCi0gIGJ1aWxkX2h3X3RhYmxlIChjZCk7Ci0KLSAgLyogQnVpbGQgdGhlIGlmaWVsZCB0YWJsZS4gICovCi0gIGJ1aWxkX2lmaWVsZF90YWJsZSAoY2QpOwotCi0gIC8qIERldGVybWluZSB3aGljaCBvcGVyYW5kcyBhcmUgdXNlZCBieSBNQUNIL0lTQS4gICovCi0gIGJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKTsKLQotICAvKiBCdWlsZCB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotICBidWlsZF9pbnNuX3RhYmxlIChjZCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBjcHUgdGFibGUgYW5kIHJldHVybiBhIGRlc2NyaXB0b3IuCi0gICBJdCdzIG11Y2ggbGlrZSBvcGVuaW5nIGEgZmlsZSwgYW5kIG11c3QgYmUgdGhlIGZpcnN0IGZ1bmN0aW9uIGNhbGxlZC4KLSAgIFRoZSBhcmd1bWVudHMgYXJlIGEgc2V0IG9mICh0eXBlL3ZhbHVlKSBwYWlycywgdGVybWluYXRlZCB3aXRoCi0gICBDR0VOX0NQVV9PUEVOX0VORC4KLQotICAgQ3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXM6Ci0gICBDR0VOX0NQVV9PUEVOX0lTQVM6ICAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBpc2FfYXR0cgotICAgQ0dFTl9DUFVfT1BFTl9NQUNIUzogICBiaXRtYXAgb2YgdmFsdWVzIGluIGVudW0gbWFjaF9hdHRyCi0gICBDR0VOX0NQVV9PUEVOX0JGRE1BQ0g6IHNwZWNpZnkgMSBtYWNoIHVzaW5nIGJmZCBuYW1lCi0gICBDR0VOX0NQVV9PUEVOX0VORElBTjogIHNwZWNpZnkgZW5kaWFuIGNob2ljZQotICAgQ0dFTl9DUFVfT1BFTl9FTkQ6ICAgICB0ZXJtaW5hdGVzIGFyZ3VtZW50cwotCi0gICA/Pz8gU2ltdWx0YW5lb3VzIG11bHRpcGxlIGlzYXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UsIGJ1dCBpdCdzIG5vdCAoeWV0KQotICAgcHJlY2x1ZGVkLgotCi0gICA/Pz8gV2Ugb25seSBzdXBwb3J0IElTTyBDIHN0ZGFyZ3MgaGVyZSwgbm90IEsmUi4KLSAgIExhemluZXNzLCBwbHVzIGV4cGVyaW1lbnQgdG8gc2VlIGlmIGFueXRoaW5nIHJlcXVpcmVzIEsmUiAtIGV2ZW50dWFsbHkKLSAgIEsmUiB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgLSBlLmcuIEdEQiBpcyBjdXJyZW50bHkgdHJ5aW5nIHRoaXMuICAqLwotCi1DR0VOX0NQVV9ERVNDCi1tMzJyX2NnZW5fY3B1X29wZW4gKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcgYXJnX3R5cGUsIC4uLikKLXsKLSAgQ0dFTl9DUFVfVEFCTEUgKmNkID0gKENHRU5fQ1BVX1RBQkxFICopIHhtYWxsb2MgKHNpemVvZiAoQ0dFTl9DUFVfVEFCTEUpKTsKLSAgc3RhdGljIGludCBpbml0X3A7Ci0gIHVuc2lnbmVkIGludCBpc2FzID0gMDsgIC8qIDAgPSAidW5zcGVjaWZpZWQiICovCi0gIHVuc2lnbmVkIGludCBtYWNocyA9IDA7IC8qIDAgPSAidW5zcGVjaWZpZWQiICovCi0gIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuID0gQ0dFTl9FTkRJQU5fVU5LTk9XTjsKLSAgdmFfbGlzdCBhcDsKLQotICBpZiAoISBpbml0X3ApCi0gICAgewotICAgICAgaW5pdF90YWJsZXMgKCk7Ci0gICAgICBpbml0X3AgPSAxOwotICAgIH0KLQotICBtZW1zZXQgKGNkLCAwLCBzaXplb2YgKCpjZCkpOwotCi0gIHZhX3N0YXJ0IChhcCwgYXJnX3R5cGUpOwotICB3aGlsZSAoYXJnX3R5cGUgIT0gQ0dFTl9DUFVfT1BFTl9FTkQpCi0gICAgewotICAgICAgc3dpdGNoIChhcmdfdHlwZSkKLQl7Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX0lTQVMgOgotCSAgaXNhcyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7Ci0JICBicmVhazsKLQljYXNlIENHRU5fQ1BVX09QRU5fTUFDSFMgOgotCSAgbWFjaHMgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCBpbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0ggOgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lID0gdmFfYXJnIChhcCwgY29uc3QgY2hhciAqKTsKLQkgICAgY29uc3QgQ0dFTl9NQUNIICptYWNoID0KLQkgICAgICBsb29rdXBfbWFjaF92aWFfYmZkX25hbWUgKG0zMnJfY2dlbl9tYWNoX3RhYmxlLCBuYW1lKTsKLQotCSAgICBtYWNocyB8PSBtYWNoLT5udW0gPDwgMTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX0VORElBTiA6Ci0JICBlbmRpYW4gPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fZW5kaWFuKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQgOgotCSAgZnByaW50ZiAoc3RkZXJyLCAibTMycl9jZ2VuX2NwdV9vcGVuOiB1bnN1cHBvcnRlZCBhcmd1bWVudCBgJWQnXG4iLAotCQkgICBhcmdfdHlwZSk7Ci0JICBhYm9ydCAoKTsgLyogPz8/IHJldHVybiBOVUxMPyAqLwotCX0KLSAgICAgIGFyZ190eXBlID0gdmFfYXJnIChhcCwgZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyk7Ci0gICAgfQotICB2YV9lbmQgKGFwKTsKLQotICAvKiBtYWNoIHVuc3BlY2lmaWVkIG1lYW5zICJhbGwiICovCi0gIGlmIChtYWNocyA9PSAwKQotICAgIG1hY2hzID0gKDEgPDwgTUFYX01BQ0hTKSAtIDE7Ci0gIC8qIGJhc2UgbWFjaCBpcyBhbHdheXMgc2VsZWN0ZWQgKi8KLSAgbWFjaHMgfD0gMTsKLSAgLyogaXNhIHVuc3BlY2lmaWVkIG1lYW5zICJhbGwiICovCi0gIGlmIChpc2FzID09IDApCi0gICAgaXNhcyA9ICgxIDw8IE1BWF9JU0FTKSAtIDE7Ci0gIGlmIChlbmRpYW4gPT0gQ0dFTl9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAvKiA/Pz8gSWYgdGFyZ2V0IGhhcyBvbmx5IG9uZSwgY291bGQgaGF2ZSBhIGRlZmF1bHQuICAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAibTMycl9jZ2VuX2NwdV9vcGVuOiBubyBlbmRpYW5uZXNzIHNwZWNpZmllZFxuIik7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgY2QtPmlzYXMgPSBpc2FzOwotICBjZC0+bWFjaHMgPSBtYWNoczsKLSAgY2QtPmVuZGlhbiA9IGVuZGlhbjsKLSAgLyogRklYTUU6IGZvciB0aGUgc3BhcmMgY2FzZSB3ZSBjYW4gZGV0ZXJtaW5lIGluc24tZW5kaWFubmVzcyBzdGF0aWNhbGx5LgotICAgICBUaGUgd29ycnkgaGVyZSBpcyB3aGVyZSBib3RoIGRhdGEgYW5kIGluc24gZW5kaWFuIGNhbiBiZSBpbmRlcGVuZGVudGx5Ci0gICAgIGNob3NlbiwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmVlZCBhbm90aGVyIGFyZ3VtZW50LgotICAgICBBY3R1YWxseSwgd2lsbCB3YW50IHRvIGFsbG93IGZvciBtb3JlIGFyZ3VtZW50cyBpbiB0aGUgZnV0dXJlIGFueXdheS4gICovCi0gIGNkLT5pbnNuX2VuZGlhbiA9IGVuZGlhbjsKLQotICAvKiBUYWJsZSAocmUpYnVpbGRlci4gICovCi0gIGNkLT5yZWJ1aWxkX3RhYmxlcyA9IG0zMnJfY2dlbl9yZWJ1aWxkX3RhYmxlczsKLSAgbTMycl9jZ2VuX3JlYnVpbGRfdGFibGVzIChjZCk7Ci0KLSAgcmV0dXJuIChDR0VOX0NQVV9ERVNDKSBjZDsKLX0KLQotLyogQ292ZXIgZm4gdG8gbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugb2YgMSBpc2EsIDEgbWFjaC4KLSAgIE1BQ0hfTkFNRSBpcyB0aGUgYmZkIG5hbWUgb2YgdGhlIG1hY2guICAqLwotCi1DR0VOX0NQVV9ERVNDCi1tMzJyX2NnZW5fY3B1X29wZW5fMSAobWFjaF9uYW1lLCBlbmRpYW4pCi0gICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKLSAgICAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47Ci17Ci0gIHJldHVybiBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5ESUFOLCBlbmRpYW4sCi0JCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkQpOwotfQotCi0vKiBDbG9zZSBhIGNwdSB0YWJsZS4KLSAgID8/PyBUaGlzIGNhbiBsaXZlIGluIGEgbWFjaGluZSBpbmRlcGVuZGVudCBmaWxlLCBidXQgdGhlcmUncyBjdXJyZW50bHkKLSAgIG5vIHBsYWNlIHRvIHB1dCB0aGlzIGZpbGUgKHRoZXJlJ3Mgbm8gbGliY2dlbikuICBsaWJvcGNvZGVzIGlzIHRoZSB3cm9uZwotICAgcGxhY2UgYXMgc29tZSBzaW11bGF0b3IgcG9ydHMgdXNlIHRoaXMgYnV0IHRoZXkgZG9uJ3QgdXNlIGxpYm9wY29kZXMuICAqLwotCi12b2lkCi1tMzJyX2NnZW5fY3B1X2Nsb3NlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaWYgKGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcykKLSAgICBmcmVlICgoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyk7Ci0gIGlmIChjZC0+aHdfdGFibGUuZW50cmllcykKLSAgICBmcmVlICgoQ0dFTl9IV19FTlRSWSAqKSBjZC0+aHdfdGFibGUuZW50cmllcyk7Ci0gIGZyZWUgKGNkKTsKLX0KLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWRlc2MuaCBiL29wY29kZXMvbTMyci1kZXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzYzNmMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWRlc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKiBDUFUgZGF0YSBoZWFkZXIgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgTTMyUl9DUFVfSAotI2RlZmluZSBNMzJSX0NQVV9ICi0KLSNkZWZpbmUgQ0dFTl9BUkNIIG0zMnIKLQotLyogR2l2ZW4gc3ltYm9sIFMsIHJldHVybiBtMzJyX2NnZW5fPFM+LiAgKi8KLSNkZWZpbmUgQ0dFTl9TWU0ocykgQ09OQ0FUMyAobTMycixfY2dlbl8scykKLQotLyogU2VsZWN0ZWQgY3B1IGZhbWlsaWVzLiAgKi8KLSNkZWZpbmUgSEFWRV9DUFVfTTMyUkJGCi0KLSNkZWZpbmUgQ0dFTl9JTlNOX0xTQjBfUCAwCi0KLS8qIE1heGltdW0gc2l6ZSBvZiBhbnkgaW5zbiAoaW4gYnl0ZXMpLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9TSVpFIDQKLQotI2RlZmluZSBDR0VOX0lOVF9JTlNOX1AgMQotCi0vKiBGSVhNRTogTmVlZCB0byBjb21wdXRlIENHRU5fTUFYX1NZTlRBWF9CWVRFUy4gICovCi0KLS8qIENHRU5fTU5FTU9OSUNfT1BFUkFORFMgaXMgZGVmaW5lZCBpZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcy4KLSAgIGUuZy4gSW4gImIsYSBmb28iIHRoZSAiLGEiIGlzIGFuIG9wZXJhbmQuICBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcwotICAgd2UgY2FuJ3QgaGFzaCBvbiBldmVyeXRoaW5nIHVwIHRvIHRoZSBzcGFjZS4gICovCi0jZGVmaW5lIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGFueSBpbnNuIG9yIG1hY3JvLWluc24gaGFzLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9PUEVSQU5EUyAxNgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBmaWVsZHMgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIDcKLQotLyogRW51bXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGZvcm1hdCBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDEgewotICBPUDFfMCwgT1AxXzEsIE9QMV8yLCBPUDFfMwotICwgT1AxXzQsIE9QMV81LCBPUDFfNiwgT1AxXzcKLSAsIE9QMV84LCBPUDFfOSwgT1AxXzEwLCBPUDFfMTEKLSAsIE9QMV8xMiwgT1AxXzEzLCBPUDFfMTQsIE9QMV8xNQotfSBJTlNOX09QMTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3Igb3AyIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMiB7Ci0gIE9QMl8wLCBPUDJfMSwgT1AyXzIsIE9QMl8zCi0gLCBPUDJfNCwgT1AyXzUsIE9QMl82LCBPUDJfNwotICwgT1AyXzgsIE9QMl85LCBPUDJfMTAsIE9QMl8xMQotICwgT1AyXzEyLCBPUDJfMTMsIE9QMl8xNCwgT1AyXzE1Ci19IElOU05fT1AyOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGdyX25hbWVzIHsKLSAgSF9HUl9GUCA9IDEzLCBIX0dSX0xSID0gMTQsIEhfR1JfU1AgPSAxNSwgSF9HUl9SMCA9IDAKLSAsIEhfR1JfUjEgPSAxLCBIX0dSX1IyID0gMiwgSF9HUl9SMyA9IDMsIEhfR1JfUjQgPSA0Ci0gLCBIX0dSX1I1ID0gNSwgSF9HUl9SNiA9IDYsIEhfR1JfUjcgPSA3LCBIX0dSX1I4ID0gOAotICwgSF9HUl9SOSA9IDksIEhfR1JfUjEwID0gMTAsIEhfR1JfUjExID0gMTEsIEhfR1JfUjEyID0gMTIKLSAsIEhfR1JfUjEzID0gMTMsIEhfR1JfUjE0ID0gMTQsIEhfR1JfUjE1ID0gMTUKLX0gR1JfTkFNRVM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gY3JfbmFtZXMgewotICBIX0NSX1BTVyA9IDAsIEhfQ1JfQ0JSID0gMSwgSF9DUl9TUEkgPSAyLCBIX0NSX1NQVSA9IDMKLSAsIEhfQ1JfQlBDID0gNiwgSF9DUl9CQlBTVyA9IDgsIEhfQ1JfQkJQQyA9IDE0LCBIX0NSX0NSMCA9IDAKLSAsIEhfQ1JfQ1IxID0gMSwgSF9DUl9DUjIgPSAyLCBIX0NSX0NSMyA9IDMsIEhfQ1JfQ1I0ID0gNAotICwgSF9DUl9DUjUgPSA1LCBIX0NSX0NSNiA9IDYsIEhfQ1JfQ1I3ID0gNywgSF9DUl9DUjggPSA4Ci0gLCBIX0NSX0NSOSA9IDksIEhfQ1JfQ1IxMCA9IDEwLCBIX0NSX0NSMTEgPSAxMSwgSF9DUl9DUjEyID0gMTIKLSAsIEhfQ1JfQ1IxMyA9IDEzLCBIX0NSX0NSMTQgPSAxNCwgSF9DUl9DUjE1ID0gMTUKLX0gQ1JfTkFNRVM7Ci0KLS8qIEF0dHJpYnV0ZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtYWNoaW5lIHR5cGUgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBtYWNoX2F0dHIgewotICBNQUNIX0JBU0UsIE1BQ0hfTTMyUgotICwgTUFDSF9NQVgKLX0gTUFDSF9BVFRSOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbiBzZXQgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBpc2FfYXR0ciB7Ci0gIElTQV9NMzJSLCBJU0FfTUFYCi19IElTQV9BVFRSOwotCi0vKiBOdW1iZXIgb2YgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzLiAgKi8KLSNkZWZpbmUgTUFYX0lTQVMgIDEKLSNkZWZpbmUgTUFYX01BQ0hTICgoaW50KSBNQUNIX01BWCkKLQotLyogSWZpZWxkIHN1cHBvcnQuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGNnZW5faWZsZCBtMzJyX2NnZW5faWZsZF90YWJsZVtdOwotCi0vKiBJZmllbGQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2lmbGQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faWZsZF9hdHRyIHsKLSAgQ0dFTl9JRkxEX1ZJUlRVQUwsIENHRU5fSUZMRF9QQ1JFTF9BRERSLCBDR0VOX0lGTERfQUJTX0FERFIsIENHRU5fSUZMRF9SRVNFUlZFRAotICwgQ0dFTl9JRkxEX1NJR05fT1BULCBDR0VOX0lGTERfU0lHTkVELCBDR0VOX0lGTERfUkVMT0MsIENHRU5fSUZMRF9FTkRfQk9PTFMKLSAsIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9JRkxEX01BQ0gsIENHRU5fSUZMRF9FTkRfTkJPT0xTCi19IENHRU5fSUZMRF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pZmxkX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lGTERfTkJPT0xfQVRUUlMgKENHRU5fSUZMRF9FTkRfTkJPT0xTIC0gQ0dFTl9JRkxEX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgaWZpZWxkIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBpZmllbGRfdHlwZSB7Ci0gIE0zMlJfRl9OSUwsIE0zMlJfRl9PUDEsIE0zMlJfRl9PUDIsIE0zMlJfRl9DT05ECi0gLCBNMzJSX0ZfUjEsIE0zMlJfRl9SMiwgTTMyUl9GX1NJTU04LCBNMzJSX0ZfU0lNTTE2Ci0gLCBNMzJSX0ZfU0hJRlRfT1AyLCBNMzJSX0ZfVUlNTTQsIE0zMlJfRl9VSU1NNSwgTTMyUl9GX1VJTU0xNgotICwgTTMyUl9GX1VJTU0yNCwgTTMyUl9GX0hJMTYsIE0zMlJfRl9ESVNQOCwgTTMyUl9GX0RJU1AxNgotICwgTTMyUl9GX0RJU1AyNAotICwgTTMyUl9GX01BWAotfSBJRklFTERfVFlQRTsKLQotI2RlZmluZSBNQVhfSUZMRCAoKGludCkgTTMyUl9GX01BWCkKLQotLyogSGFyZHdhcmUgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2h3IGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X2F0dHIgewotICBDR0VOX0hXX1ZJUlRVQUwsIENHRU5fSFdfQ0FDSEVfQUREUiwgQ0dFTl9IV19QQywgQ0dFTl9IV19QUk9GSUxFCi0gLCBDR0VOX0hXX0VORF9CT09MUywgQ0dFTl9IV19TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9IV19NQUNILCBDR0VOX0hXX0VORF9OQk9PTFMKLX0gQ0dFTl9IV19BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9od19hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9IV19OQk9PTF9BVFRSUyAoQ0dFTl9IV19FTkRfTkJPT0xTIC0gQ0dFTl9IV19TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGhhcmR3YXJlIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X3R5cGUgewotICBIV19IX01FTU9SWSwgSFdfSF9TSU5ULCBIV19IX1VJTlQsIEhXX0hfQUREUgotICwgSFdfSF9JQUREUiwgSFdfSF9QQywgSFdfSF9ISTE2LCBIV19IX1NMTzE2Ci0gLCBIV19IX1VMTzE2LCBIV19IX0dSLCBIV19IX0NSLCBIV19IX0FDQ1VNCi0gLCBIV19IX0NPTkQsIEhXX0hfUFNXLCBIV19IX0JQU1csIEhXX0hfQkJQU1cKLSAsIEhXX0hfTE9DSywgSFdfTUFYCi19IENHRU5fSFdfVFlQRTsKLQotI2RlZmluZSBNQVhfSFcgKChpbnQpIEhXX01BWCkKLQotLyogT3BlcmFuZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5fb3BlcmFuZCBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX2F0dHIgewotICBDR0VOX09QRVJBTkRfVklSVFVBTCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIsIENHRU5fT1BFUkFORF9BQlNfQUREUiwgQ0dFTl9PUEVSQU5EX1NJR05fT1BUCi0gLCBDR0VOX09QRVJBTkRfU0lHTkVELCBDR0VOX09QRVJBTkRfTkVHQVRJVkUsIENHRU5fT1BFUkFORF9SRUxBWCwgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZCi0gLCBDR0VOX09QRVJBTkRfUkVMT0MsIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCwgQ0dFTl9PUEVSQU5EX0VORF9CT09MUywgQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyA9IDMxCi0gLCBDR0VOX09QRVJBTkRfTUFDSCwgQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMKLX0gQ0dFTl9PUEVSQU5EX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX29wZXJhbmRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAoQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMgLSBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBvcGVyYW5kIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7Ci0gIE0zMlJfT1BFUkFORF9QQywgTTMyUl9PUEVSQU5EX1NSLCBNMzJSX09QRVJBTkRfRFIsIE0zMlJfT1BFUkFORF9TUkMxCi0gLCBNMzJSX09QRVJBTkRfU1JDMiwgTTMyUl9PUEVSQU5EX1NDUiwgTTMyUl9PUEVSQU5EX0RDUiwgTTMyUl9PUEVSQU5EX1NJTU04Ci0gLCBNMzJSX09QRVJBTkRfU0lNTTE2LCBNMzJSX09QRVJBTkRfVUlNTTQsIE0zMlJfT1BFUkFORF9VSU1NNSwgTTMyUl9PUEVSQU5EX1VJTU0xNgotICwgTTMyUl9PUEVSQU5EX0hBU0gsIE0zMlJfT1BFUkFORF9ISTE2LCBNMzJSX09QRVJBTkRfU0xPMTYsIE0zMlJfT1BFUkFORF9VTE8xNgotICwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgTTMyUl9PUEVSQU5EX0RJU1A4LCBNMzJSX09QRVJBTkRfRElTUDE2LCBNMzJSX09QRVJBTkRfRElTUDI0Ci0gLCBNMzJSX09QRVJBTkRfQ09OREJJVCwgTTMyUl9PUEVSQU5EX0FDQ1VNLCBNMzJSX09QRVJBTkRfTUFYCi19IENHRU5fT1BFUkFORF9UWVBFOwotCi0vKiBOdW1iZXIgb2Ygb3BlcmFuZHMgdHlwZXMuICAqLwotI2RlZmluZSBNQVhfT1BFUkFORFMgKChpbnQpIE0zMlJfT1BFUkFORF9NQVgpCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIHJlZmVyZW5jZWQgYnkgYW55IGluc24uICAqLwotI2RlZmluZSBNQVhfT1BFUkFORF9JTlNUQU5DRVMgMTEKLQotLyogSW5zbiBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faW5zbiBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMsIENHRU5fSU5TTl9WSVJUVUFMLCBDR0VOX0lOU05fVU5DT05EX0NUSSwgQ0dFTl9JTlNOX0NPTkRfQ1RJCi0gLCBDR0VOX0lOU05fU0tJUF9DVEksIENHRU5fSU5TTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fUkVMQVhBQkxFLCBDR0VOX0lOU05fUkVMQVgKLSAsIENHRU5fSU5TTl9OT19ESVMsIENHRU5fSU5TTl9QQkIsIENHRU5fSU5TTl9GSUxMX1NMT1QsIENHRU5fSU5TTl9TUEVDSUFMCi0gLCBDR0VOX0lOU05fRU5EX0JPT0xTLCBDR0VOX0lOU05fU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSU5TTl9NQUNILCBDR0VOX0lOU05fUElQRQotICwgQ0dFTl9JTlNOX0VORF9OQk9PTFMKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2luc25fYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAoQ0dFTl9JTlNOX0VORF9OQk9PTFMgLSBDR0VOX0lOU05fU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogY2dlbi5oIHVzZXMgdGhpbmdzIHdlIGp1c3QgZGVmaW5lZC4gICovCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogQXR0cmlidXRlcy4gICovCi1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pbnNuX2F0dHJfdGFibGVbXTsKLQotLyogSGFyZHdhcmUgZGVjbHMuICAqLwotCi1leHRlcm4gQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzOwotCi0KLQotCi0jZW5kaWYgLyogTTMyUl9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWRpcy5jIGIvb3Bjb2Rlcy9tMzJyLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGM1OTFhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tZGlzLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRGVmYXVsdCB0ZXh0IHRvIHByaW50IGlmIGFuIGluc3RydWN0aW9uIGlzbid0IHJlY29nbml6ZWQuICAqLwotI2RlZmluZSBVTktOT1dOX0lOU05fTVNHIF8oIip1bmtub3duKiIpCi0KLXN0YXRpYyB2b2lkIHByaW50X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyZXNzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2tleXdvcmQKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBDR0VOX0tFWVdPUkQgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0ZJRUxEUyAqLAotCSAgICAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsCi0JCQkgICAgICAgZGlzYXNzZW1ibGVfaW5mbyAqLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBkZWZhdWx0X3ByaW50X2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0MCi0vKiAtLSBkaXNhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLwotCi0vKiAtLSBkaXMuYyAqLwotCi0vKiBJbW1lZGlhdGUgdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICcjJy4gICovCi0KLSNkZWZpbmUgQ0dFTl9QUklOVF9OT1JNQUwoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkgXAotZG8geyBcCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoKGF0dHJzKSwgQ0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSkgXAotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyIpOyBcCi19IHdoaWxlICgwKQotCi0vKiBIYW5kbGUgJyMnIHByZWZpeGVzIGFzIG9wZXJhbmRzLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2hhc2ggKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMiKTsKLX0KLQotI3VuZGVmIENHRU5fUFJJTlRfSU5TTgotI2RlZmluZSBDR0VOX1BSSU5UX0lOU04gbXlfcHJpbnRfaW5zbgotCi1zdGF0aWMgaW50Ci1teV9wcmludF9pbnNuIChjZCwgcGMsIGluZm8pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNoYXIgYnVmZmVyW0NHRU5fTUFYX0lOU05fU0laRV07Ci0gIGNoYXIgKmJ1ZiA9IGJ1ZmZlcjsKLSAgaW50IHN0YXR1czsKLSAgaW50IGJ1ZmxlbiA9IChwYyAmIDMpID09IDAgPyA0IDogMjsKLQotICAvKiBSZWFkIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24uICAqLwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWYsIGJ1ZmxlbiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIDMyIGJpdCBpbnNuPyAgKi8KLSAgaWYgKChwYyAmIDMpID09IDAgJiYgKGJ1ZlswXSAmIDB4ODApICE9IDApCi0gICAgcmV0dXJuIHByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCBidWZsZW4pOwotCi0gIC8qIFByaW50IHRoZSBmaXJzdCBpbnNuLiAgKi8KLSAgaWYgKChwYyAmIDMpID09IDApCi0gICAgewotICAgICAgaWYgKHByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCAyKSA9PSAwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLSAgICAgIGJ1ZiArPSAyOwotICAgIH0KLQotICBpZiAoYnVmWzBdICYgMHg4MCkKLSAgICB7Ci0gICAgICAvKiBQYXJhbGxlbC4gICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiB8fCAiKTsKLSAgICAgIGJ1ZlswXSAmPSAweDdmOwotICAgIH0KLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIC0+ICIpOwotCi0gIC8qIFRoZSAiJiAzIiBpcyB0byBwYXNzIGEgY29uc2lzdGVudCBhZGRyZXNzLgotICAgICBQYXJhbGxlbCBpbnNucyBhcmd1YWJseSBib3RoIGJlZ2luIG9uIHRoZSB3b3JkIGJvdW5kYXJ5LgotICAgICBBbHNvLCBicmFuY2ggaW5zbnMgYXJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAocHJpbnRfaW5zbiAoY2QsIHBjICYgfiAoYmZkX3ZtYSkgMywgaW5mbywgYnVmLCAyKSA9PSAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLQotICByZXR1cm4gKHBjICYgMykgPyAyIDogNDsKLX0KLQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3IgcHJpbnRpbmcgb3BlcmFuZHMuCi0gICBYSU5GTyBpcyBhIGB2b2lkIConIGFuZCBub3QgYSBgZGlzYXNzZW1ibGVfaW5mbyAqJyB0byBub3QgcHV0IGEgcmVxdWlyZW1lbnQKLSAgIG9mIGRpcy1hc20uaCBvbiBjZ2VuLmguCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLXZvaWQKLW0zMnJfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgeGluZm8sIGZpZWxkcywgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBQVFIgeGluZm87Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIHZvaWQgY29uc3QgKmF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSB4aW5mbzsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9yMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMTYsIDB8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMjQsIDB8KDE8PENHRU5fT1BFUkFORF9SRUxBWCl8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3A4LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMQVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBwcmludF9oYXNoIChjZCwgaW5mbywgZmllbGRzLT5mX25pbCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaGkxNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05fT1BUKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfcjIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zaW1tOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW0yNCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1JFTE9DKXwoMTw8Q0dFTl9PUEVSQU5EX0FCU19BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW01LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tMTYsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwcmludGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLWNnZW5fcHJpbnRfZm4gKiBjb25zdCBtMzJyX2NnZW5fcHJpbnRfaGFuZGxlcnNbXSA9IAotewotICBwcmludF9pbnNuX25vcm1hbCwKLX07Ci0KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfZGlzIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgbTMycl9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCk7Ci0gIG0zMnJfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKTsKLSAgY2QtPnByaW50X2hhbmRsZXJzID0gJiBtMzJyX2NnZW5fcHJpbnRfaGFuZGxlcnNbMF07Ci0gIGNkLT5wcmludF9vcGVyYW5kID0gbTMycl9jZ2VuX3ByaW50X29wZXJhbmQ7Ci19Ci0KLQwKLS8qIERlZmF1bHQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9ub3JtYWwgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9OT1JNQUwKLSAgQ0dFTl9QUklOVF9OT1JNQUwgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLwotICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQotICAgIDsgLyogbm90aGluZyB0byBkbyAqLwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIHZhbHVlKTsKLX0KLQotLyogRGVmYXVsdCBhZGRyZXNzIGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYWRkcmVzcyAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0KLSNpZmRlZiBDR0VOX1BSSU5UX0FERFJFU1MKLSAgQ0dFTl9QUklOVF9BRERSRVNTIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX0FCU19BRERSKSkKLSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIChsb25nKSB2YWx1ZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgKGxvbmcpIHZhbHVlKTsKLX0KLQotLyogS2V5d29yZCBwcmludCBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2tleXdvcmQgKGNkLCBkaXNfaW5mbywga2V5d29yZF90YWJsZSwgdmFsdWUsIGF0dHJzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIENHRU5fS0VZV09SRCAqa2V5d29yZF90YWJsZTsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci0KLSAga2UgPSBjZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlIChrZXl3b3JkX3RhYmxlLCB2YWx1ZSk7Ci0gIGlmIChrZSAhPSBOVUxMKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBrZS0+bmFtZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIj8/PyIpOwotfQotDAotLyogRGVmYXVsdCBpbnNuIHByaW50ZXIuCi0KLSAgIERJU19JTkZPIGlzIGRlZmluZWQgYXMgYFBUUicgc28gdGhlIGRpc2Fzc2VtYmxlciBuZWVkbid0IGtub3cgYW55dGhpbmcKLSAgIGFib3V0IGRpc2Fzc2VtYmxlX2luZm8uICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbl9ub3JtYWwgKGNkLCBkaXNfaW5mbywgaW5zbiwgZmllbGRzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN5bjsKLQotICBDR0VOX0lOSVRfUFJJTlQgKGNkKTsKLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKnN5bjsgKytzeW4pCi0gICAgewotICAgICAgaWYgKENHRU5fU1lOVEFYX01ORU1PTklDX1AgKCpzeW4pKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCpzeW4pKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCBDR0VOX1NZTlRBWF9DSEFSICgqc3luKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZC4gICovCi0gICAgICBtMzJyX2NnZW5fcHJpbnRfb3BlcmFuZCAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwgaW5mbywKLQkJCQkgZmllbGRzLCBDR0VOX0lOU05fQVRUUlMgKGluc24pLCBwYywgbGVuZ3RoKTsKLSAgICB9Ci19Ci0MCi0vKiBVdGlsaXR5IHRvIHByaW50IGFuIGluc24uCi0gICBCVUYgaXMgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbiwgdGFyZ2V0IGJ5dGUgb3JkZXIsIEJVRkxFTiBieXRlcyBsb25nLgotICAgVGhlIHJlc3VsdCBpcyB0aGUgc2l6ZSBvZiB0aGUgaW5zbiBpbiBieXRlcyBvciB6ZXJvIGZvciBhbiB1bmtub3duIGluc24KLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycyBmZXRjaGluZyBkYXRhIChtZW1vcnlfZXJyb3JfZnVuYyB3aWxsIGhhdmUKLSAgIGJlZW4gY2FsbGVkKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCBidWZsZW4pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGJ1ZmxlbjsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuX3ZhbHVlOwotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbl9saXN0OwotICBDR0VOX0VYVFJBQ1RfSU5GTyBleF9pbmZvOwotCi0gIGV4X2luZm8uZGlzX2luZm8gPSBpbmZvOwotICBleF9pbmZvLnZhbGlkID0gKDEgPDwgKGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpKSAtIDE7Ci0gIGV4X2luZm8uaW5zbl9ieXRlcyA9IGJ1ZjsKLQotICBzd2l0Y2ggKGJ1ZmxlbikKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5zbl92YWx1ZSA9IGJ1ZlswXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGluc25fdmFsdWUgPSBpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgPyBiZmRfZ2V0YjE2IChidWYpIDogYmZkX2dldGwxNiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGluc25fdmFsdWUgPSBpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgPyBiZmRfZ2V0YjMyIChidWYpIDogYmZkX2dldGwzMiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2ggbGlzdHMuCi0gICAgIFBpY2sgdGhlIGZpcnN0IG9uZSBhbmQga2VlcCB0cnlpbmcgdW50aWwgd2UgZmluZCB0aGUgcmlnaHQgb25lLiAgKi8KLQotICBpbnNuX2xpc3QgPSBDR0VOX0RJU19MT09LVVBfSU5TTiAoY2QsIGJ1ZiwgaW5zbl92YWx1ZSk7Ci0gIHdoaWxlIChpbnNuX2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpbnNuX2xpc3QtPmluc247Ci0gICAgICBDR0VOX0ZJRUxEUyBmaWVsZHM7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0jaWYgMCAvKiBub3QgbmVlZGVkIGFzIGluc24gc2hvdWxkbid0IGJlIGluIGhhc2ggbGlzdHMgaWYgbm90IHN1cHBvcnRlZCAqLwotICAgICAgLyogU3VwcG9ydGVkIGJ5IHRoaXMgY3B1PyAgKi8KLSAgICAgIGlmICghIG0zMnJfY2dlbl9pbnNuX3N1cHBvcnRlZCAoY2QsIGluc24pKQotCWNvbnRpbnVlOwotI2VuZGlmCi0KLSAgICAgIC8qIEJhc2ljIGJpdCBtYXNrIG11c3QgYmUgY29ycmVjdC4gICovCi0gICAgICAvKiA/Pz8gTWF5IHdpc2ggdG8gYWxsb3cgdGFyZ2V0IHRvIGRlZmVyIHRoaXMgY2hlY2sgdW50aWwgdGhlIGV4dHJhY3QKLQkgaGFuZGxlci4gICovCi0gICAgICBpZiAoKGluc25fdmFsdWUgJiBDR0VOX0lOU05fQkFTRV9NQVNLIChpbnNuKSkKLQkgID09IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKSkKLQl7Ci0JICAvKiBQcmludGluZyBpcyBoYW5kbGVkIGluIHR3byBwYXNzZXMuICBUaGUgZmlyc3QgcGFzcyBwYXJzZXMgdGhlCi0JICAgICBtYWNoaW5lIGluc24gYW5kIGV4dHJhY3RzIHRoZSBmaWVsZHMuICBUaGUgc2Vjb25kIHBhc3MgcHJpbnRzCi0JICAgICB0aGVtLiAgKi8KLQotCSAgbGVuZ3RoID0gQ0dFTl9FWFRSQUNUX0ZOIChjZCwgaW5zbikKLQkgICAgKGNkLCBpbnNuLCAmZXhfaW5mbywgaW5zbl92YWx1ZSwgJmZpZWxkcywgcGMpOwotCSAgLyogbGVuZ3RoIDwgMCAtPiBlcnJvciAqLwotCSAgaWYgKGxlbmd0aCA8IDApCi0JICAgIHJldHVybiBsZW5ndGg7Ci0JICBpZiAobGVuZ3RoID4gMCkKLQkgICAgewotCSAgICAgIENHRU5fUFJJTlRfRk4gKGNkLCBpbnNuKSAoY2QsIGluZm8sIGluc24sICZmaWVsZHMsIHBjLCBsZW5ndGgpOwotCSAgICAgIC8qIGxlbmd0aCBpcyBpbiBiaXRzLCByZXN1bHQgaXMgaW4gYnl0ZXMgKi8KLQkgICAgICByZXR1cm4gbGVuZ3RoIC8gODsKLQkgICAgfQotCX0KLQotICAgICAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTkVYVF9JTlNOIChpbnNuX2xpc3QpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogRGVmYXVsdCB2YWx1ZSBmb3IgQ0dFTl9QUklOVF9JTlNOLgotICAgVGhlIHJlc3VsdCBpcyB0aGUgc2l6ZSBvZiB0aGUgaW5zbiBpbiBieXRlcyBvciB6ZXJvIGZvciBhbiB1bmtub3duIGluc24KLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VyZWQgZmV0Y2hpbmcgYnl0ZXMuICAqLwotCi0jaWZuZGVmIENHRU5fUFJJTlRfSU5TTgotI2RlZmluZSBDR0VOX1BSSU5UX0lOU04gZGVmYXVsdF9wcmludF9pbnNuCi0jZW5kaWYKLQotc3RhdGljIGludAotZGVmYXVsdF9wcmludF9pbnNuIChjZCwgcGMsIGluZm8pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNoYXIgYnVmW0NHRU5fTUFYX0lOU05fU0laRV07Ci0gIGludCBzdGF0dXM7Ci0KLSAgLyogUmVhZCB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmLCBjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCBjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KTsKLX0KLQotLyogTWFpbiBlbnRyeSBwb2ludC4KLSAgIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGluIGJ5dGVzKS4gICovCi0KLWludAotcHJpbnRfaW5zbl9tMzJyIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3RhdGljIENHRU5fQ1BVX0RFU0MgY2QgPSAwOwotICBzdGF0aWMgcHJldl9pc2EscHJldl9tYWNoLHByZXZfZW5kaWFuOwotICBpbnQgbGVuZ3RoOwotICBpbnQgaXNhLG1hY2g7Ci0gIGludCBlbmRpYW4gPSAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCi0JCT8gQ0dFTl9FTkRJQU5fQklHCi0JCTogQ0dFTl9FTkRJQU5fTElUVExFKTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0KLSAgLyogPz8/IGdkYiB3aWxsIHNldCBtYWNoIGJ1dCBsZWF2ZSB0aGUgYXJjaGl0ZWN0dXJlIGFzICJ1bmtub3duIiAqLwotI2lmbmRlZiBDR0VOX0JGRF9BUkNICi0jZGVmaW5lIENHRU5fQkZEX0FSQ0ggYmZkX2FyY2hfbTMycgotI2VuZGlmCi0gIGFyY2ggPSBpbmZvLT5hcmNoOwotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAgIGFyY2ggPSBDR0VOX0JGRF9BUkNIOwotICAgICAgCi0gIC8qIFRoZXJlJ3Mgbm8gc3RhbmRhcmQgd2F5IHRvIGNvbXB1dGUgdGhlIGlzYSBudW1iZXIgKGUuZy4gZm9yIGFybSB0aHVtYikKLSAgICAgc28gd2UgbGVhdmUgaXQgdG8gdGhlIHRhcmdldC4gICovCi0jaWZkZWYgQ0dFTl9DT01QVVRFX0lTQQotICBpc2EgPSBDR0VOX0NPTVBVVEVfSVNBIChpbmZvKTsKLSNlbHNlCi0gIGlzYSA9IDA7Ci0jZW5kaWYKLQotICBtYWNoID0gaW5mby0+bWFjaDsKLQotICAvKiBJZiB3ZSd2ZSBzd2l0Y2hlZCBjcHUncywgY2xvc2UgdGhlIGN1cnJlbnQgdGFibGUgYW5kIG9wZW4gYSBuZXcgb25lLiAgKi8KLSAgaWYgKGNkCi0gICAgICAmJiAoaXNhICE9IHByZXZfaXNhCi0JICB8fCBtYWNoICE9IHByZXZfbWFjaAotCSAgfHwgZW5kaWFuICE9IHByZXZfZW5kaWFuKSkKLSAgICB7Ci0gICAgICBtMzJyX2NnZW5fY3B1X2Nsb3NlIChjZCk7Ci0gICAgICBjZCA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgeWV0LCBpbml0aWFsaXplIHRoZSBvcGNvZGUgdGFibGUuICAqLwotICBpZiAoISBjZCkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2hfdHlwZSA9IGJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaCk7Ci0gICAgICBjb25zdCBjaGFyICptYWNoX25hbWU7Ci0KLSAgICAgIGlmICghYXJjaF90eXBlKQotCWFib3J0ICgpOwotICAgICAgbWFjaF9uYW1lID0gYXJjaF90eXBlLT5wcmludGFibGVfbmFtZTsKLQotICAgICAgcHJldl9pc2EgPSBpc2E7Ci0gICAgICBwcmV2X21hY2ggPSBtYWNoOwotICAgICAgcHJldl9lbmRpYW4gPSBlbmRpYW47Ci0gICAgICBjZCA9IG0zMnJfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9JU0FTLCBwcmV2X2lzYSwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9CRkRNQUNILCBtYWNoX25hbWUsCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5ESUFOLCBwcmV2X2VuZGlhbiwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9FTkQpOwotICAgICAgaWYgKCFjZCkKLQlhYm9ydCAoKTsKLSAgICAgIG0zMnJfY2dlbl9pbml0X2RpcyAoY2QpOwotICAgIH0KLQotICAvKiBXZSB0cnkgdG8gaGF2ZSBhcyBtdWNoIGNvbW1vbiBjb2RlIGFzIHBvc3NpYmxlLgotICAgICBCdXQgYXQgdGhpcyBwb2ludCBzb21lIHRhcmdldHMgbmVlZCB0byB0YWtlIG92ZXIuICAqLwotICAvKiA/Pz8gU29tZSB0YXJnZXRzIG1heSBuZWVkIGEgaG9vayBlbHNld2hlcmUuICBUcnkgdG8gYXZvaWQgdGhpcywKLSAgICAgYnV0IGlmIG5vdCBwb3NzaWJsZSB0cnkgdG8gbW92ZSB0aGlzIGhvb2sgZWxzZXdoZXJlIHJhdGhlciB0aGFuCi0gICAgIGhhdmUgdHdvIGhvb2tzLiAgKi8KLSAgbGVuZ3RoID0gQ0dFTl9QUklOVF9JTlNOIChjZCwgcGMsIGluZm8pOwotICBpZiAobGVuZ3RoID4gMCkKLSAgICByZXR1cm4gbGVuZ3RoOwotICBpZiAobGVuZ3RoIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIFVOS05PV05fSU5TTl9NU0cpOwotICByZXR1cm4gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplIC8gODsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1pYmxkLmMgYi9vcGNvZGVzL20zMnItaWJsZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTE1ZDdlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1pYmxkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIwICswLDAgQEAKLS8qIEluc3RydWN0aW9uIGJ1aWxkaW5nL2V4dHJhY3Rpb24gc3VwcG9ydCBmb3IgbTMyci4gLSotIEMgLSotCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1pYmxkLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jdW5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0KLS8qIFVzZWQgYnkgdGhlIGlmaWVsZCBydHggZnVuY3Rpb24uICAqLwotI2RlZmluZSBGTEQoZikgKGZpZWxkcy0+ZikKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBpbnNlcnRfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGxvbmcsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgQ0dFTl9JTlNOX0JZVEVTX1BUUikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBpbnNlcnRfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosCi0JICAgICAgQ0dFTl9GSUVMRFMgKiwgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgaW50IGV4dHJhY3Rfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIENHRU5fRVhUUkFDVF9JTkZPICosIENHRU5fSU5TTl9JTlQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBsb25nICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9FWFRSQUNUX0lORk8gKiwKLQkgICAgICBDR0VOX0lOU05fSU5ULCBDR0VOX0ZJRUxEUyAqLCBiZmRfdm1hKSk7Ci0MCi0vKiBPcGVyYW5kIGluc2VydGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGluc2VydF9ub3JtYWwuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgdm9pZAotaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgeCA9ICh4ICYgfihtYXNrIDw8IHNoaWZ0KSkgfCAoKHZhbHVlICYgbWFzaykgPDwgc2hpZnQpOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgICpidWZwID0geDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIxNiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwxNiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JewotCSAgYnVmcFswXSA9IHggPj4gMTY7Ci0JICBiZmRfcHV0YjE2ICh4LCBidWZwICsgMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotCSAgYnVmcFsyXSA9IHggPj4gMTY7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQliZmRfcHV0YjMyICh4LCBidWZwKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICh4LCBidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotLyogRGVmYXVsdCBpbnNlcnRpb24gcm91dGluZS4KLQotICAgQVRUUlMgaXMgYSBtYXNrIG9mIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuCi0gICBXT1JEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJpdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgV09SRF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBiaXRzIGluIHdoaWNoIHRoZSB2YWx1ZSByZXNpZGVzLgotICAgU1RBUlQgaXMgdGhlIHN0YXJ0aW5nIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQsIGFyY2hpdGVjdHVyZSBvcmlnaW4uCi0gICBMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBWQUxVRSBpbiBiaXRzLgotICAgVE9UQUxfTEVOR1RIIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cy4KLQotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLS8qID8/PyBUaGlzIGR1cGxpY2F0ZXMgZnVuY3Rpb25hbGl0eSB3aXRoIGJmZCdzIGhvd3RvIHRhYmxlIGFuZAotICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gICovCi0vKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsCi0JICAgICAgIHRvdGFsX2xlbmd0aCwgYnVmZmVyKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci17Ci0gIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDBdOwotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZS4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBiYXNlLWluc24tYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBFbnN1cmUgVkFMVUUgd2lsbCBmaXQuICAqLwotICBpZiAoISBDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbWF4dmFsID0gbWFzazsKLSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgdmFsdWUgPiBtYXh2YWwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIHNwcmludGYgKGVycmJ1ZiwKLQkJICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAwIGFuZCAlbHUpIiksCi0JCSAgIHZhbHVlLCBtYXh2YWwpOwotCSAgcmV0dXJuIGVycmJ1ZjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBtaW52YWwgPSAtICgxTCA8PCAobGVuZ3RoIC0gMSkpOwotICAgICAgbG9uZyBtYXh2YWwgPSAoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDE7Ci0gICAgICBpZiAodmFsdWUgPCBtaW52YWwgfHwgdmFsdWUgPiBtYXh2YWwpCi0JewotCSAgc3ByaW50ZgotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAoZXJyYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWxkIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpLAotCSAgICAgdmFsdWUsIG1pbnZhbCwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLQotI2lmIENHRU5fSU5UX0lOU05fUAotCi0gIHsKLSAgICBpbnQgc2hpZnQ7Ci0KLSAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gICAgZWxzZQotICAgICAgc2hpZnQgPSB3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCk7Ci0gICAgKmJ1ZmZlciA9ICgqYnVmZmVyICYgfihtYXNrIDw8IHNoaWZ0KSkgfCAoKHZhbHVlICYgbWFzaykgPDwgc2hpZnQpOwotICB9Ci0KLSNlbHNlIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgewotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSAodW5zaWduZWQgY2hhciAqKSBidWZmZXIgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICBpbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCk7Ci0gIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIERlZmF1bHQgaW5zbiBidWlsZGVyIChpbnNlcnQgaGFuZGxlcikuCi0gICBUaGUgaW5zdHJ1Y3Rpb24gaXMgcmVjb3JkZWQgaW4gQ0dFTl9JTlRfSU5TTl9QIGJ5dGUgb3JkZXIKLSAgIChtZWFuaW5nIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIEJVRkZFUiBpcyBhbiBpbnQgKiBhbmQgdGh1cyB0aGUgdmFsdWUgaXMKLSAgIHJlY29yZGVkIGluIGhvc3QgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRkZFUiBpcyBhbiBhcnJheSBvZiBieXRlcyBhbmQgdGhlCi0gICB2YWx1ZSBpcyByZWNvcmRlZCBpbiB0YXJnZXQgYnl0ZSBvcmRlcikuCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X2luc25fbm9ybWFsIChjZCwgaW5zbiwgZmllbGRzLCBidWZmZXIsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKiBpbnNuOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKLQotICBDR0VOX0lOSVRfSU5TRVJUIChjZCk7Ci0gIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pOwotCi0gIC8qIElmIHdlJ3JlIHJlY29yZGluZyBpbnNucyBhcyBudW1iZXJzIChyYXRoZXIgdGhhbiBhIHN0cmluZyBvZiBieXRlcyksCi0gICAgIHRhcmdldCBieXRlIG9yZGVyIGhhbmRsaW5nIGlzIGRlZmVycmVkIHVudGlsIGxhdGVyLiAgKi8KLQotI2lmIENHRU5fSU5UX0lOU05fUAotCi0gICpidWZmZXIgPSB2YWx1ZTsKLQotI2Vsc2UKLQotICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmZmVyLCBtaW4gKGNkLT5iYXNlX2luc25fYml0c2l6ZSwKLQkJCQkJQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSksCi0JCSAgICAgICB2YWx1ZSk7Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIC8qID8/PyBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gc2NhbiB0aGUgZm9ybWF0J3MgZmllbGRzLgotICAgICBTdGlsbCBuZWVkIHRvIGJlIGFibGUgdG8gaW5zZXJ0IGEgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgdGhvdWdoOwotICAgICBlLmcuIHN0b3JpbmcgYSBicmFuY2ggZGlzcGxhY2VtZW50IHRoYXQgZ290IHJlc29sdmVkIGxhdGVyLgotICAgICBOZWVkcyBtb3JlIHRob3VnaHQgZmlyc3QuICAqLwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqIHN5biAhPSAnXDAnOyArKyBzeW4pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqIHN5bikpCi0JY29udGludWU7Ci0KLSAgICAgIGVycm1zZyA9ICgqIGNkLT5pbnNlcnRfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJICAgICAgIGZpZWxkcywgYnVmZmVyLCBwYyk7Ci0gICAgICBpZiAoZXJybXNnKQotCXJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogT3BlcmFuZCBleHRyYWN0aW9uLiAgKi8KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLS8qIFN1YnJvdXRpbmUgb2YgZXh0cmFjdF9ub3JtYWwuCi0gICBFbnN1cmUgc3VmZmljaWVudCBieXRlcyBhcmUgY2FjaGVkIGluIEVYX0lORk8uCi0gICBPRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBCWVRFUyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBuZWVkZWQgdmFsdWUuCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgaW50Ci1maWxsX2NhY2hlIChjZCwgZXhfaW5mbywgb2Zmc2V0LCBieXRlcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBpbnQgb2Zmc2V0LCBieXRlczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgLyogSXQncyBkb3VidGZ1bCB0aGF0IHRoZSBtaWRkbGUgcGFydCBoYXMgYWxyZWFkeSBiZWVuIGZldGNoZWQgc28KLSAgICAgd2UgZG9uJ3Qgb3B0aW1pemUgdGhhdCBjYXNlLiAga2lzcy4gICovCi0gIGludCBtYXNrOwotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZXhfaW5mby0+ZGlzX2luZm87Ci0KLSAgLyogRmlyc3QgZG8gYSBxdWljayBjaGVjay4gICovCi0gIG1hc2sgPSAoMSA8PCBieXRlcykgLSAxOwotICBpZiAoKChleF9pbmZvLT52YWxpZCA+PiBvZmZzZXQpICYgbWFzaykgPT0gbWFzaykKLSAgICByZXR1cm4gMTsKLQotICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBieXRlIHdlIG5lZWQgdG8gcmVhZC4gICovCi0gIGZvciAobWFzayA9IDEgPDwgb2Zmc2V0OyBieXRlcyA+IDA7IC0tYnl0ZXMsICsrb2Zmc2V0LCBtYXNrIDw8PSAxKQotICAgIGlmICghIChtYXNrICYgZXhfaW5mby0+dmFsaWQpKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGJ5dGVzKQotICAgIHsKLSAgICAgIGludCBzdGF0dXM7Ci0KLSAgICAgIHBjICs9IG9mZnNldDsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkocGMsIGV4X2luZm8tPmluc25fYnl0ZXMgKyBvZmZzZXQsIGJ5dGVzLCBpbmZvKTsKLQotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgZXhfaW5mby0+dmFsaWQgfD0gKCgxIDw8IGJ5dGVzKSAtIDEpIDw8IG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZXh0cmFjdF9ub3JtYWwuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgbG9uZwotZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgdW5zaWduZWQgbG9uZyB4LG1hc2s7Ci0gIGludCBzaGlmdDsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgeCA9ICpidWZwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIxNiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIzMiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0gIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICByZXR1cm4gKHggPj4gc2hpZnQpICYgbWFzazsKLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgZXh0cmFjdGlvbiByb3V0aW5lLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIG9mIHRoZSBpbnNuIGluIGhvc3Qgb3JkZXIsCi0gICBvciBzb21ldGltZXMgbGVzcyBmb3IgY2FzZXMgbGlrZSB0aGUgbTMyciB3aGVyZSB0aGUgYmFzZSBpbnNuIHNpemUgaXMgMzIKLSAgIGJ1dCBzb21lIGluc25zIGFyZSAxNiBiaXRzLgotICAgQVRUUlMgaXMgYSBtYXNrIG9mIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuICBXZSBvbmx5IG5lZWQgYFNJR05FRCcsCi0gICBidXQgZm9yIGdlbmVyYWxpdHkgd2UgdGFrZSBhIGJpdG1hc2sgb2YgYWxsIG9mIHRoZW0uCi0gICBXT1JEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJpdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgV09SRF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBiaXRzIGluIHdoaWNoIHRoZSB2YWx1ZSByZXNpZGVzLgotICAgU1RBUlQgaXMgdGhlIHN0YXJ0aW5nIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQsIGFyY2hpdGVjdHVyZSBvcmlnaW4uCi0gICBMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBWQUxVRSBpbiBiaXRzLgotICAgVE9UQUxfTEVOR1RIIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cy4KLQotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotLyogPz8/IFRoZSByZXR1cm4gY29kZSBpc24ndCBwcm9wZXJseSB1c2VkLiAgd2lwLiAgKi8KLQotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsCi0JCXdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGgsIHBjLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOwotICAgICBiZmRfdm1hIHBjOwotICAgICBsb25nICp2YWx1ZXA7Ci17Ci0gIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci0KLSAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlCi0gICAgIHNvIGdpdmUgaXQgYSBzdGFuZGFyZCB2YWx1ZSBvZiB6ZXJvLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgICp2YWx1ZXAgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChDR0VOX0lOVF9JTlNOX1AKLSAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGluc24tYmFzZS1iaXRzaXplLAotICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCi0gIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAotCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0Jd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0gICAgfQotCi0gIC8qIERvZXMgdGhlIHZhbHVlIHJlc2lkZSBpbiBJTlNOX1ZBTFVFPyAgKi8KLQotICBpZiAod29yZF9vZmZzZXQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICAgICAgQ0dFTl9JTlNOX0lOVCBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAgICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0JdmFsdWUgPSBpbnNuX3ZhbHVlID4+ICgoc3RhcnQgKyAxKSAtIGxlbmd0aCk7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSBpbnNuX3ZhbHVlID4+ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICAgICAgdmFsdWUgJj0gbWFzazsKLSAgICAgIC8qIHNpZ24gZXh0ZW5kPyAqLwotICAgICAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkKLQkgICYmICh2YWx1ZSAmICgxTCA8PCAobGVuZ3RoIC0gMSkpKSkKLQl2YWx1ZSB8PSB+bWFzazsKLSAgICB9Ci0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gZXhfaW5mby0+aW5zbl9ieXRlcyArIHdvcmRfb2Zmc2V0IC8gODsKLQotICAgICAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChmaWxsX2NhY2hlIChjZCwgZXhfaW5mbywgd29yZF9vZmZzZXQgLyA4LCB3b3JkX2xlbmd0aCAvIDgsIHBjKSA9PSAwKQotCXJldHVybiAwOwotCi0gICAgICB2YWx1ZSA9IGV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYyk7Ci0gICAgfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAqdmFsdWVwID0gdmFsdWU7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlZmF1bHQgaW5zbiBleHRyYWN0b3IuCi0KLSAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMsIHRyYW5zbGF0ZWQgdG8gaG9zdCBvcmRlci4KLSAgIFRoZSBleHRyYWN0ZWQgZmllbGRzIGFyZSBzdG9yZWQgaW4gRklFTERTLgotICAgRVhfSU5GTyBpcyB1c2VkIHRvIGhhbmRsZSByZWFkaW5nIHZhcmlhYmxlIGxlbmd0aCBpbnNucy4KLSAgIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMsIG9yIDAgaWYgbm8gbWF0Y2gsCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X2luc25fbm9ybWFsIChjZCwgaW5zbiwgZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN5bjsKLQotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotCi0gIENHRU5fSU5JVF9FWFRSQUNUIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCpzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBsZW5ndGggPSAoKiBjZC0+ZXh0cmFjdF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkJZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYyk7Ci0gICAgICBpZiAobGVuZ3RoIDw9IDApCi0JcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgLyogV2UgcmVjb2duaXplZCBhbmQgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCB0aGlzIGluc24uICAqLwotICByZXR1cm4gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotfQotDAotLyogbWFjaGluZSBnZW5lcmF0ZWQgY29kZSBhZGRlZCBoZXJlICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgaW5zZXJ0aW9uLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuICBJdCdzIGFsc28gbmVlZGVkIGJ5IEdBUyB0byBpbnNlcnQgb3BlcmFuZHMgdGhhdCBjb3VsZG4ndCBiZQotICAgcmVzb2x2ZWQgZHVyaW5nIHBhcnNpbmcuCi0qLwotCi1jb25zdCBjaGFyICoKLW0zMnJfY2dlbl9pbnNlcnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgY2hhciAqIGVycm1zZzsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAocGMpKSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKHBjKSkpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtICgoKHBjKSAmICgtNCkpKSkpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjEsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfbmlsLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaGkxNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9zaW1tOCwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0xNiwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTI0LCAwfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfQUJTX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTQsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tNSwgMCwgMCwgMTEsIDUsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0xNiwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGV4dHJhY3Rpb24uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWludAotbTMycl9jZ2VuX2V4dHJhY3Rfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgaW50IGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgyKSkpICsgKHBjKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgyKSkpICsgKHBjKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArICgoKHBjKSAmICgtNCkpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaGkxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3NpbW04KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX0FCU19BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMjQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW00KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTEsIDUsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tNSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW0xNik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotY2dlbl9pbnNlcnRfZm4gKiBjb25zdCBtMzJyX2NnZW5faW5zZXJ0X2hhbmRsZXJzW10gPSAKLXsKLSAgaW5zZXJ0X2luc25fbm9ybWFsLAotfTsKLQotY2dlbl9leHRyYWN0X2ZuICogY29uc3QgbTMycl9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbXSA9IAotewotICBleHRyYWN0X2luc25fbm9ybWFsLAotfTsKLQotLyogR2V0dGluZyB2YWx1ZXMgZnJvbSBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IHJldHVybi4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgcmVzdWx0IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLWludAotbTMycl9jZ2VuX2dldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBpbnQgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaGkxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0yNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW00OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWJmZF92bWEKLW0zMnJfY2dlbl9nZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9oaTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW04OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogU3R1ZmZpbmcgdmFsdWVzIGluIGNnZW5fZmllbGRzIGlzIGhhbmRsZWQgYnkgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucy4KLSAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFZBTFVFIGFyZ3VtZW50IHRoZXkgYWNjZXB0LgotICAgVE9ETzogZmxvYXRpbmcgcG9pbnQsIGlubGluaW5nIHN1cHBvcnQsIHJlbW92ZSBjYXNlcyB3aGVyZSBhcmd1bWVudCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi12b2lkCi1tMzJyX2NnZW5fc2V0X2ludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9oaTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgZmllbGRzLT5mX3NpbW04ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tNSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLXZvaWQKLW0zMnJfY2dlbl9zZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9oaTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgZmllbGRzLT5mX3NpbW04ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tNSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBpbnN0cnVjdGlvbiBidWlsZGVyIHRhYmxlcy4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBjZC0+aW5zZXJ0X2hhbmRsZXJzID0gJiBtMzJyX2NnZW5faW5zZXJ0X2hhbmRsZXJzWzBdOwotICBjZC0+ZXh0cmFjdF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbMF07Ci0KLSAgY2QtPmluc2VydF9vcGVyYW5kID0gbTMycl9jZ2VuX2luc2VydF9vcGVyYW5kOwotICBjZC0+ZXh0cmFjdF9vcGVyYW5kID0gbTMycl9jZ2VuX2V4dHJhY3Rfb3BlcmFuZDsKLQotICBjZC0+Z2V0X2ludF9vcGVyYW5kID0gbTMycl9jZ2VuX2dldF9pbnRfb3BlcmFuZDsKLSAgY2QtPnNldF9pbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9zZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5nZXRfdm1hX29wZXJhbmQgPSBtMzJyX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kOwotICBjZC0+c2V0X3ZtYV9vcGVyYW5kID0gbTMycl9jZ2VuX3NldF92bWFfb3BlcmFuZDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGMuYyBiL29wY29kZXMvbTMyci1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlZGY5YS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMxICswLDAgQEAKLS8qIEluc3RydWN0aW9uIG9wY29kZSB0YWJsZSBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLQotLyogVGhlIGhhc2ggZnVuY3Rpb25zIGFyZSByZWNvcmRlZCBoZXJlIHRvIGhlbHAga2VlcCBhc3NlbWJsZXIgY29kZSBvdXQgb2YKLSAgIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHZpY2UgdmVyc2EuICAqLwotCi1zdGF0aWMgaW50IGFzbV9oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBhc21faGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBkaXNfaGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGlzX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotLyogSW5zdHJ1Y3Rpb24gZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgRihmKSAmIG0zMnJfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKE0zMlJfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZW1wdHkgPSB7Ci0gIDAsIDAsIDB4MCwgeyAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZDMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FuZDMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1VJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X29yMyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfVUlNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkaSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9TSU1NOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZHYzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzggPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzI0ID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iZXEgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX0RJU1AxNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JlcXogPSB7Ci0gIDMyLCAzMiwgMHhmZmYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX0RJU1AxNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NtcCA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY21waSA9IHsKLSAgMzIsIDMyLCAweGZmZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZGl2ID0gewotICAzMiwgMzIsIDB4ZjBmMGZmZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9qbCA9IHsKLSAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGQyNCA9IHsKLSAgMzIsIDMyLCAweGYwMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfVUlNTTI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMTYgPSB7Ci0gIDMyLCAzMiwgMHhmMGZmMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212ZmFjaGkgPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212ZmMgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212dGFjaGkgPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212dGMgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X25vcCA9IHsKLSAgMTYsIDE2LCAweGZmZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc2V0aCA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfSEkxNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3NsbGkgPSB7Ci0gIDE2LCAxNiwgMHhmMGUwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfU0hJRlRfT1AyKSwgRiAoRl9VSU1NNSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0X2QgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3RyYXAgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9VSU1NNCksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgbTMycl9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgeyAwIH0gfSwKLS8qIGFkZCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhMCB9Ci0gIH0sCi0vKiBhZGQzICRkciwkc3IsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoSEFTSCksIE9QIChTTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4ODBhMDAwMDAgfQotICB9LAotLyogYW5kICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGMwIH0KLSAgfSwKLS8qIGFuZDMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFVJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hbmQzLCB7IDB4ODBjMDAwMDAgfQotICB9LAotLyogb3IgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ZTAgfQotICB9LAotLyogb3IzICRkciwkc3IsJGhhc2gkdWxvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoSEFTSCksIE9QIChVTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9vcjMsIHsgMHg4MGUwMDAwMCB9Ci0gIH0sCi0vKiB4b3IgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ZDAgfQotICB9LAotLyogeG9yMyAkZHIsJHNyLCR1aW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoVUlNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FuZDMsIHsgMHg4MGQwMDAwMCB9Ci0gIH0sCi0vKiBhZGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNJTU04KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg0MDAwIH0KLSAgfSwKLS8qIGFkZHYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODAgfQotICB9LAotLyogYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDgwODAwMDAwIH0KLSAgfSwKLS8qIGFkZHggJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTAgfQotICB9LAotLyogYmMucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3YzAwIH0KLSAgfSwKLS8qIGJjLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmMwMDAwMDAgfQotICB9LAotLyogYmVxICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXEsIHsgMHhiMDAwMDAwMCB9Ci0gIH0sCi0vKiBiZXF6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMDgwMDAwMCB9Ci0gIH0sCi0vKiBiZ2V6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGIwMDAwMCB9Ci0gIH0sCi0vKiBiZ3R6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGQwMDAwMCB9Ci0gIH0sCi0vKiBibGV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGMwMDAwMCB9Ci0gIH0sCi0vKiBibHR6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGEwMDAwMCB9Ci0gIH0sCi0vKiBibmV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMDkwMDAwMCB9Ci0gIH0sCi0vKiBibC5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdlMDAgfQotICB9LAotLyogYmwubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmZTAwMDAwMCB9Ci0gIH0sCi0vKiBibmMucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ZDAwIH0KLSAgfSwKLS8qIGJuYy5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGZkMDAwMDAwIH0KLSAgfSwKLS8qIGJuZSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxLCB7IDB4YjAxMDAwMDAgfQotICB9LAotLyogYnJhLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2YwMCB9Ci0gIH0sCi0vKiBicmEubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmZjAwMDAwMCB9Ci0gIH0sCi0vKiBjbXAgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg0MCB9Ci0gIH0sCi0vKiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcGksIHsgMHg4MDQwMDAwMCB9Ci0gIH0sCi0vKiBjbXB1ICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NTAgfQotICB9LAotLyogY21wdWkgJHNyYzIsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21waSwgeyAweDgwNTAwMDAwIH0KLSAgfSwKLS8qIGRpdiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDAwMDAwMCB9Ci0gIH0sCi0vKiBkaXZ1ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMTAwMDAwIH0KLSAgfSwKLS8qIHJlbSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDIwMDAwMCB9Ci0gIH0sCi0vKiByZW11ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMzAwMDAwIH0KLSAgfSwKLS8qIGpsICRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2psLCB7IDB4MWVjMCB9Ci0gIH0sCi0vKiBqbXAgJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfamwsIHsgMHgxZmMwIH0KLSAgfSwKLS8qIGxkICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwYzAgfQotICB9LAotLyogbGQgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwYzAwMDAwIH0KLSAgfSwKLS8qIGxkYiAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMDgwIH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTA4MDAwMDAgfQotICB9LAotLyogbGRoICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwYTAgfQotICB9LAotLyogbGRoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMGEwMDAwMCB9Ci0gIH0sCi0vKiBsZHViICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwOTAgfQotICB9LAotLyogbGR1YiAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTA5MDAwMDAgfQotICB9LAotLyogbGR1aCAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGIwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwYjAwMDAwIH0KLSAgfSwKLS8qIGxkICRkcixAJHNyKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksICcrJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwZTAgfQotICB9LAotLyogbGQyNCAkZHIsJHVpbW0yNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkMjQsIHsgMHhlMDAwMDAwMCB9Ci0gIH0sCi0vKiBsZGk4ICRkciwkc2ltbTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNJTU04KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg2MDAwIH0KLSAgfSwKLS8qIGxkaTE2ICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoSEFTSCksIE9QIChTTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9sZGkxNiwgeyAweDkwZjAwMDAwIH0KLSAgfSwKLS8qIGxvY2sgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBkMCB9Ci0gIH0sCi0vKiBtYWNoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwNDAgfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDUwIH0KLSAgfSwKLS8qIG1hY3doaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwNjAgfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA3MCB9Ci0gIH0sCi0vKiBtdWwgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTA2MCB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwMDAgfQotICB9LAotLyogbXVsbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDEwIH0KLSAgfSwKLS8qIG11bHdoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwMjAgfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAzMCB9Ci0gIH0sCi0vKiBtdiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDgwIH0KLSAgfSwKLS8qIG12ZmFjaGkgJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaSwgeyAweDUwZjAgfQotICB9LAotLyogbXZmYWNsbyAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpLCB7IDB4NTBmMSB9Ci0gIH0sCi0vKiBtdmZhY21pICRkciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGksIHsgMHg1MGYyIH0KLSAgfSwKLS8qIG12ZmMgJGRyLCRzY3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNDUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZjLCB7IDB4MTA5MCB9Ci0gIH0sCi0vKiBtdnRhY2hpICRzcmMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksIDAgfSB9LAotICAgICYgaWZtdF9tdnRhY2hpLCB7IDB4NTA3MCB9Ci0gIH0sCi0vKiBtdnRhY2xvICRzcmMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksIDAgfSB9LAotICAgICYgaWZtdF9tdnRhY2hpLCB7IDB4NTA3MSB9Ci0gIH0sCi0vKiBtdnRjICRzciwkZGNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAnLCcsIE9QIChEQ1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YywgeyAweDEwYTAgfQotICB9LAotLyogbmVnICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDMwIH0KLSAgfSwKLS8qIG5vcCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg3MDAwIH0KLSAgfSwKLS8qIG5vdCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiMCB9Ci0gIH0sCi0vKiByYWMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NTA5MCB9Ci0gIH0sCi0vKiByYWNoICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDUwODAgfQotICB9LAotLyogcnRlICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDEwZDYgfQotICB9LAotLyogc2V0aCAkZHIsJGhhc2gkaGkxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoSEFTSCksIE9QIChISTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X3NldGgsIHsgMHhkMGMwMDAwMCB9Ci0gIH0sCi0vKiBzbGwgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTA0MCB9Ci0gIH0sCi0vKiBzbGwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg5MGMwMDAwMCB9Ci0gIH0sCi0vKiBzbGxpICRkciwkdWltbTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU01KSwgMCB9IH0sCi0gICAgJiBpZm10X3NsbGksIHsgMHg1MDQwIH0KLSAgfSwKLS8qIHNyYSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDIwIH0KLSAgfSwKLS8qIHNyYTMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDkwYTAwMDAwIH0KLSAgfSwKLS8qIHNyYWkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2xsaSwgeyAweDUwMjAgfQotICB9LAotLyogc3JsICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMDAgfQotICB9LAotLyogc3JsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHYzLCB7IDB4OTA4MDAwMDAgfQotICB9LAotLyogc3JsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NNSksIDAgfSB9LAotICAgICYgaWZtdF9zbGxpLCB7IDB4NTAwMCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNDAgfQotICB9LAotLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF9kLCB7IDB4YTA0MDAwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjAwMCB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF9kLCB7IDB4YTAwMDAwMDAgfQotICB9LAotLyogc3RoICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjAyMCB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF9kLCB7IDB4YTAyMDAwMDAgfQotICB9LAotLyogc3QgJHNyYzEsQCskc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJysnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDYwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAtJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICctJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA3MCB9Ci0gIH0sCi0vKiBzdWIgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjAgfQotICB9LAotLyogc3VidiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgwIH0KLSAgfSwKLS8qIHN1YnggJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAgfQotICB9LAotLyogdHJhcCAkdWltbTQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVSU1NNCksIDAgfSB9LAotICAgICYgaWZtdF90cmFwLCB7IDB4MTBmMCB9Ci0gIH0sCi0vKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDUwIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0vKiBGb3JtYXRzIGZvciBBTElBUyBtYWNyby1pbnNucy4gICovCi0KLSNkZWZpbmUgRihmKSAmIG0zMnJfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKE0zMlJfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmM4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibDhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmwyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuYzhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYm5jMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmE4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JyYTI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkYl8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGhfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWJfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1Yl9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1aF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHVoX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9wb3AgPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaThhID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1NJTU04KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMTZhID0gewotICAzMiwgMzIsIDB4ZjBmZjAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RiXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0Yl9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RoXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0aF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcHVzaCA9IHsKLSAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0vKiBFYWNoIG5vbi1zaW1wbGUgbWFjcm8gZW50cnkgcG9pbnRzIHRvIGFuIGFycmF5IG9mIGV4cGFuc2lvbiBwb3NzaWJpbGl0aWVzLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZVtdID0KLXsKLS8qIGJjICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJiYzhyIiwgImJjIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJjICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYmMyNHIiLCAiYmMiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibCAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYmw4ciIsICJibCIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibCAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJsMjRyIiwgImJsIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmMgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJuYzhyIiwgImJuYyIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmMgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJibmMyNHIiLCAiYm5jIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJicmE4ciIsICJicmEiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYnJhMjRyIiwgImJyYSIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZC0yIiwgImxkIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkLWQyIiwgImxkIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkYi0yIiwgImxkYiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGRiLWQyIiwgImxkYiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZGgtMiIsICJsZGgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkaC1kMiIsICJsZGgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkdWItMiIsICJsZHViIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGR1Yi1kMiIsICJsZHViIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZHVoLTIiLCAibGR1aCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkdWgtZDIiLCAibGR1aCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBwb3AgJGRyICovCi0gIHsKLSAgICAtMSwgInBvcCIsICJwb3AiLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgLTEsICJsZGk4YSIsICJsZGkiLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICAtMSwgImxkaTE2YSIsICJsZGkiLCAzMiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgLTEsICJzdC0yIiwgInN0IiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJzdC1kMiIsICJzdCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIC0xLCAic3RiLTIiLCAic3RiIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAic3RiLWQyIiwgInN0YiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIC0xLCAic3RoLTIiLCAic3RoIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAic3RoLWQyIiwgInN0aCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBwdXNoICRzcmMxICovCi0gIHsKLSAgICAtMSwgInB1c2giLCAicHVzaCIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLX07Ci0KLS8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgbTMycl9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlW10gPQotewotLyogYmMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4ciwgeyAweDdjMDAgfQotICB9LAotLyogYmMgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0ciwgeyAweGZjMDAwMDAwIH0KLSAgfSwKLS8qIGJsICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JsOHIsIHsgMHg3ZTAwIH0KLSAgfSwKLS8qIGJsICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmwyNHIsIHsgMHhmZTAwMDAwMCB9Ci0gIH0sCi0vKiBibmMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYm5jOHIsIHsgMHg3ZDAwIH0KLSAgfSwKLS8qIGJuYyAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JuYzI0ciwgeyAweGZkMDAwMDAwIH0KLSAgfSwKLS8qIGJyYSAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9icmE4ciwgeyAweDdmMDAgfQotICB9LAotLyogYnJhICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhMjRyLCB7IDB4ZmYwMDAwMDAgfQotICB9LAotLyogbGQgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRfMiwgeyAweDIwYzAgfQotICB9LAotLyogbGQgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRfZDIsIHsgMHhhMGMwMDAwMCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRiXzIsIHsgMHgyMDgwIH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZGJfZDIsIHsgMHhhMDgwMDAwMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRoXzIsIHsgMHgyMGEwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZGhfZDIsIHsgMHhhMGEwMDAwMCB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkdWJfMiwgeyAweDIwOTAgfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHViX2QyLCB7IDB4YTA5MDAwMDAgfQotICB9LAotLyogbGR1aCAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHVoXzIsIHsgMHgyMGIwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1aF9kMiwgeyAweGEwYjAwMDAwIH0KLSAgfSwKLS8qIHBvcCAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9wb3AsIHsgMHgyMGVmIH0KLSAgfSwKLS8qIGxkaSAkZHIsJHNpbW04ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTSU1NOCksIDAgfSB9LAotICAgICYgaWZtdF9sZGk4YSwgeyAweDYwMDAgfQotICB9LAotLyogbGRpICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoSEFTSCksIE9QIChTTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9sZGkxNmEsIHsgMHg5MGYwMDAwMCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0XzIsIHsgMHgyMDQwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZDIsIHsgMHhhMDQwMDAwMCB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdGJfMiwgeyAweDIwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RiX2QyLCB7IDB4YTAwMDAwMDAgfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RoXzIsIHsgMHgyMDIwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0aF9kMiwgeyAweGEwMjAwMDAwIH0KLSAgfSwKLS8qIHB1c2ggJHNyYzEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCi0gICAgJiBpZm10X3B1c2gsIHsgMHgyMDdmIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0hfUAotI2RlZmluZSBDR0VOX0FTTV9IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSF9QCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfUChpbnNuKSAxCi0jZW5kaWYKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0hfUCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KLQotc3RhdGljIGludAotYXNtX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIHJldHVybiBDR0VOX0FTTV9IQVNIX1AgKGluc24pOwotfQotCi1zdGF0aWMgaW50Ci1kaXNfaGFzaF9pbnNuX3AgKGluc24pCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLXsKLSAgLyogSWYgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBOTy1ESVMgYXR0cmlidXRlIGlzIHByZXNlbnQsCi0gICAgIGlnbm9yZS4gICovCi0gIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX05PX0RJUykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIX1AgKGluc24pOwotfQotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0gKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9TSVpFIDEyNwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkKLSNlbHNlCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpIC8qRklYTUUqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogSXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gcHJvdmlkZSBhIGRlZmF1bHQgaGVyZSwKLSAgIGJ1dCB3aGlsZSB0aGlzIGlzIHVuZGVyIGRldmVsb3BtZW50IHdlIGRvLgotICAgQlVGRkVSIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KLSAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KLQotI2lmbmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWYsIHZhbHVlKSAoKih1bnNpZ25lZCBjaGFyICopIChidWYpKQotI2VuZGlmCi0KLS8qIFRoZSByZXN1bHQgaXMgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGluc24uCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0ggaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWFzbV9oYXNoX2luc24gKG1uZW0pCi0gICAgIGNvbnN0IGNoYXIgKiBtbmVtOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSCAobW5lbSk7Ci19Ci0KLS8qIEJVRiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWRpc19oYXNoX2luc24gKGJ1ZiwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIIChidWYsIHZhbHVlKTsKLX0KLQotLyogU2V0IHRoZSByZWNvcmRlZCBsZW5ndGggb2YgdGhlIGluc24gaW4gdGhlIENHRU5fRklFTERTIHN0cnVjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZmllbGRzX2JpdHNpemUgKGZpZWxkcywgc2l6ZSkKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgaW50IHNpemU7Ci17Ci0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBzaXplOwotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4KLSAgIFRoaXMgcGx1Z3MgdGhlIG9wY29kZSBlbnRyaWVzIGFuZCBtYWNybyBpbnN0cnVjdGlvbnMgaW50byB0aGUgY3B1IHRhYmxlLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBudW1fbWFjcm9zID0gKHNpemVvZiAobTMycl9jZ2VuX21hY3JvX2luc25fdGFibGUpIC8KLQkJICAgIHNpemVvZiAobTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbMF0pKTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdOwotICBjb25zdCBDR0VOX09QQ09ERSAqb2MgPSAmIG0zMnJfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAobnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIG1lbXNldCAoaW5zbnMsIDAsIG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hY3JvczsgKytpKQotICAgIHsKLSAgICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gICAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0gICAgfQotICBjZC0+bWFjcm9faW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPm1hY3JvX2luc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBudW1fbWFjcm9zOwotCi0gIG9jID0gJiBtMzJyX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIGluc25zID0gKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXM7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0KLSAgY2QtPnNpemVvZl9maWVsZHMgPSBzaXplb2YgKENHRU5fRklFTERTKTsKLSAgY2QtPnNldF9maWVsZHNfYml0c2l6ZSA9IHNldF9maWVsZHNfYml0c2l6ZTsKLQotICBjZC0+YXNtX2hhc2hfcCA9IGFzbV9oYXNoX2luc25fcDsKLSAgY2QtPmFzbV9oYXNoID0gYXNtX2hhc2hfaW5zbjsKLSAgY2QtPmFzbV9oYXNoX3NpemUgPSBDR0VOX0FTTV9IQVNIX1NJWkU7Ci0KLSAgY2QtPmRpc19oYXNoX3AgPSBkaXNfaGFzaF9pbnNuX3A7Ci0gIGNkLT5kaXNfaGFzaCA9IGRpc19oYXNoX2luc247Ci0gIGNkLT5kaXNfaGFzaF9zaXplID0gQ0dFTl9ESVNfSEFTSF9TSVpFOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLW9wYy5oIGIvb3Bjb2Rlcy9tMzJyLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzU3ZGFhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgaGVhZGVyIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJfT1BDX0gKLSNkZWZpbmUgTTMyUl9PUENfSAotCi0vKiAtLSBvcGMuaCAqLwotCi0jdW5kZWYgQ0dFTl9ESVNfSEFTSF9TSVpFCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSN1bmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIFgoYikgKCgodW5zaWduZWQgY2hhciAqKSAoYikpWzBdICYgMHhmMCkKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWZmZXIsIHZhbHVlKSBcCi0oWCAoYnVmZmVyKSB8IFwKLSAoWCAoYnVmZmVyKSA9PSAweDQwIHx8IFggKGJ1ZmZlcikgPT0gMHhlMCB8fCBYIChidWZmZXIpID09IDB4NjAgfHwgWCAoYnVmZmVyKSA9PSAweDUwID8gMCBcCi0gIDogWCAoYnVmZmVyKSA9PSAweDcwIHx8IFggKGJ1ZmZlcikgPT0gMHhmMCA/ICgoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzBdICYgMHhmKSBcCi0gIDogWCAoYnVmZmVyKSA9PSAweDMwID8gKCgoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzFdICYgMHg3MCkgPj4gNCkgXAotICA6ICgoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVsxXSAmIDB4ZjApID4+IDQpKSkKLQotLyogLS0gKi8KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgaW5zdHJ1Y3Rpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl90eXBlIHsKLSAgTTMyUl9JTlNOX0lOVkFMSUQsIE0zMlJfSU5TTl9BREQsIE0zMlJfSU5TTl9BREQzLCBNMzJSX0lOU05fQU5ECi0gLCBNMzJSX0lOU05fQU5EMywgTTMyUl9JTlNOX09SLCBNMzJSX0lOU05fT1IzLCBNMzJSX0lOU05fWE9SCi0gLCBNMzJSX0lOU05fWE9SMywgTTMyUl9JTlNOX0FEREksIE0zMlJfSU5TTl9BRERWLCBNMzJSX0lOU05fQUREVjMKLSAsIE0zMlJfSU5TTl9BRERYLCBNMzJSX0lOU05fQkM4LCBNMzJSX0lOU05fQkMyNCwgTTMyUl9JTlNOX0JFUQotICwgTTMyUl9JTlNOX0JFUVosIE0zMlJfSU5TTl9CR0VaLCBNMzJSX0lOU05fQkdUWiwgTTMyUl9JTlNOX0JMRVoKLSAsIE0zMlJfSU5TTl9CTFRaLCBNMzJSX0lOU05fQk5FWiwgTTMyUl9JTlNOX0JMOCwgTTMyUl9JTlNOX0JMMjQKLSAsIE0zMlJfSU5TTl9CTkM4LCBNMzJSX0lOU05fQk5DMjQsIE0zMlJfSU5TTl9CTkUsIE0zMlJfSU5TTl9CUkE4Ci0gLCBNMzJSX0lOU05fQlJBMjQKLSAsIE0zMlJfSU5TTl9DTVAsIE0zMlJfSU5TTl9DTVBJLCBNMzJSX0lOU05fQ01QVSwgTTMyUl9JTlNOX0NNUFVJCi0gLCBNMzJSX0lOU05fRElWLCBNMzJSX0lOU05fRElWVSwgTTMyUl9JTlNOX1JFTSwgTTMyUl9JTlNOX1JFTVUKLSAsIE0zMlJfSU5TTl9KTCwgTTMyUl9JTlNOX0pNUCwgTTMyUl9JTlNOX0xELCBNMzJSX0lOU05fTERfRAotICwgTTMyUl9JTlNOX0xEQiwgTTMyUl9JTlNOX0xEQl9ELCBNMzJSX0lOU05fTERILCBNMzJSX0lOU05fTERIX0QKLSAsIE0zMlJfSU5TTl9MRFVCLCBNMzJSX0lOU05fTERVQl9ELCBNMzJSX0lOU05fTERVSCwgTTMyUl9JTlNOX0xEVUhfRAotICwgTTMyUl9JTlNOX0xEX1BMVVMsIE0zMlJfSU5TTl9MRDI0LCBNMzJSX0lOU05fTERJOCwgTTMyUl9JTlNOX0xESTE2Ci0gLCBNMzJSX0lOU05fTE9DSywgTTMyUl9JTlNOX01BQ0hJCi0gLCBNMzJSX0lOU05fTUFDTE8KLSAsIE0zMlJfSU5TTl9NQUNXSEkKLSAsIE0zMlJfSU5TTl9NQUNXTE8KLSAsIE0zMlJfSU5TTl9NVUwsIE0zMlJfSU5TTl9NVUxISQotICwgTTMyUl9JTlNOX01VTExPCi0gLCBNMzJSX0lOU05fTVVMV0hJCi0gLCBNMzJSX0lOU05fTVVMV0xPCi0gLCBNMzJSX0lOU05fTVYsIE0zMlJfSU5TTl9NVkZBQ0hJCi0gLCBNMzJSX0lOU05fTVZGQUNMTwotICwgTTMyUl9JTlNOX01WRkFDTUkKLSAsIE0zMlJfSU5TTl9NVkZDLCBNMzJSX0lOU05fTVZUQUNISQotICwgTTMyUl9JTlNOX01WVEFDTE8KLSAsIE0zMlJfSU5TTl9NVlRDLCBNMzJSX0lOU05fTkVHLCBNMzJSX0lOU05fTk9QLCBNMzJSX0lOU05fTk9UCi0gLCBNMzJSX0lOU05fUkFDCi0gLCBNMzJSX0lOU05fUkFDSAotICwgTTMyUl9JTlNOX1JURSwgTTMyUl9JTlNOX1NFVEgsIE0zMlJfSU5TTl9TTEwsIE0zMlJfSU5TTl9TTEwzCi0gLCBNMzJSX0lOU05fU0xMSSwgTTMyUl9JTlNOX1NSQSwgTTMyUl9JTlNOX1NSQTMsIE0zMlJfSU5TTl9TUkFJCi0gLCBNMzJSX0lOU05fU1JMLCBNMzJSX0lOU05fU1JMMywgTTMyUl9JTlNOX1NSTEksIE0zMlJfSU5TTl9TVAotICwgTTMyUl9JTlNOX1NUX0QsIE0zMlJfSU5TTl9TVEIsIE0zMlJfSU5TTl9TVEJfRCwgTTMyUl9JTlNOX1NUSAotICwgTTMyUl9JTlNOX1NUSF9ELCBNMzJSX0lOU05fU1RfUExVUywgTTMyUl9JTlNOX1NUX01JTlVTLCBNMzJSX0lOU05fU1VCCi0gLCBNMzJSX0lOU05fU1VCViwgTTMyUl9JTlNOX1NVQlgsIE0zMlJfSU5TTl9UUkFQLCBNMzJSX0lOU05fVU5MT0NLCi0gLCBNMzJSX0lOU05fTUFYCi19IENHRU5fSU5TTl9UWVBFOwotCi0vKiBJbmRleCBvZiBgaW52YWxpZCcgaW5zbiBwbGFjZSBob2xkZXIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRCBNMzJSX0lOU05fSU5WQUxJRAotCi0vKiBUb3RhbCBudW1iZXIgb2YgaW5zbnMgaW4gdGFibGUuICAqLwotI2RlZmluZSBNQVhfSU5TTlMgKChpbnQpIE0zMlJfSU5TTl9NQVgpCi0KLS8qIFRoaXMgc3RydWN0IHJlY29yZHMgZGF0YSBwcmlvciB0byBpbnNlcnRpb24gb3IgYWZ0ZXIgZXh0cmFjdGlvbi4gICovCi1zdHJ1Y3QgY2dlbl9maWVsZHMKLXsKLSAgaW50IGxlbmd0aDsKLSAgbG9uZyBmX25pbDsKLSAgbG9uZyBmX29wMTsKLSAgbG9uZyBmX29wMjsKLSAgbG9uZyBmX2NvbmQ7Ci0gIGxvbmcgZl9yMTsKLSAgbG9uZyBmX3IyOwotICBsb25nIGZfc2ltbTg7Ci0gIGxvbmcgZl9zaW1tMTY7Ci0gIGxvbmcgZl9zaGlmdF9vcDI7Ci0gIGxvbmcgZl91aW1tNDsKLSAgbG9uZyBmX3VpbW01OwotICBsb25nIGZfdWltbTE2OwotICBsb25nIGZfdWltbTI0OwotICBsb25nIGZfaGkxNjsKLSAgbG9uZyBmX2Rpc3A4OwotICBsb25nIGZfZGlzcDE2OwotICBsb25nIGZfZGlzcDI0OwotfTsKLQotI2RlZmluZSBDR0VOX0lOSVRfUEFSU0Uob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9JTlNFUlQob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9FWFRSQUNUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfUFJJTlQob2QpIFwKLXtcCi19Ci0KLQotI2VuZGlmIC8qIE0zMlJfT1BDX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGluc3QuYyBiL29wY29kZXMvbTMyci1vcGluc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzYTQ5Zi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItb3BpbnN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyogU2VtYW50aWMgb3BlcmFuZCBpbnN0YW5jZXMgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0KLS8qIE9wZXJhbmQgcmVmZXJlbmNlcy4gICovCi0KLSNkZWZpbmUgSU5QVVQgQ0dFTl9PUElOU1RfSU5QVVQKLSNkZWZpbmUgT1VUUFVUIENHRU5fT1BJTlNUX09VVFBVVAotI2RlZmluZSBFTkQgQ0dFTl9PUElOU1RfRU5ECi0jZGVmaW5lIENPTkRfUkVGIENHRU5fT1BJTlNUX0NPTkRfUkVGCi0jZGVmaW5lIE9QX0VOVChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9lbXB0eV9vcHNbXSA9IHsKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9hZGRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZDNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9hbmQzX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1aW1tMTYiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVJTU0xNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9vcjNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInVsbzE2IiwgSFdfSF9VTE8xNiwgQ0dFTl9NT0RFX1VJTlQsIE9QX0VOVCAoVUxPMTYpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic2ltbTgiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTgpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkdl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkdjNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzaW1tMTYiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkeF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9iYzhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2JjMjRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImRpc3AyNCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDI0KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYmVxX29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDE2IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMTYpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9iZXF6X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDE2IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMTYpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9ibDhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwOCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDgpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2dyXzE0IiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCAwLCAxNCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2JsMjRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYnJhOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9icmEyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AyNCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDI0KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2NtcF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9jbXBpX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9kaXZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfamxfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfam1wX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZF9kX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkYl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9RSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkYl9kX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkaF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9ISSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkaF9kX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkX3BsdXNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZDI0X29wc1tdID0gewotICB7IElOUFVULCAidWltbTI0IiwgSFdfSF9BRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFVJTU0yNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGk4X29wc1tdID0gewotICB7IElOUFVULCAic2ltbTgiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTgpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGRpMTZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbG9ja19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbWFjaGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbXVsaGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X212ZmFjaGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X212ZmNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzY3IiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNDUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdnRhY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X212dGNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkY3IiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERDUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9ub3Bfb3BzW10gPSB7Ci0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfcmFjX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3J0ZV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfMTQiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCAxNCwgMCB9LAotICB7IElOUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBPVVRQVVQsICJoX3BzdyIsIEhXX0hfUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc2V0aF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhpMTYiLCBIV19IX0hJMTYsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChISTE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3NsbDNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzaW1tMTYiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTSU1NMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zbGxpX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1aW1tNSIsIEhXX0hfVUlOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChVSU1NNSksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdF9kX29wc1tdID0gewotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdGJfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1FJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1FJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RiX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1FJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcmMyX3NsbzE2IiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9RSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3N0aF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfSEksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdGhfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfSEksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX1ZNX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX0hJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RfcGx1c19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9uZXdfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfdHJhcF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IElOUFVULCAiaF9wc3ciLCBIV19IX1BTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1aW1tNCIsIEhXX0hfVUlOVCwgQ0dFTl9NT0RFX1VJTlQsIE9QX0VOVCAoVUlNTTQpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9iYnBzdyIsIEhXX0hfQkJQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2NyXzE0IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2NyXzYiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCA2LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9wc3ciLCBIV19IX1BTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfdW5sb2NrX29wc1tdID0gewotICB7IElOUFVULCAiaF9sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBPVVRQVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi0jdW5kZWYgSU5QVVQKLSN1bmRlZiBPVVRQVVQKLSN1bmRlZiBFTkQKLSN1bmRlZiBDT05EX1JFRgotI3VuZGVmIE9QX0VOVAotCi0vKiBPcGVyYW5kIGluc3RhbmNlIGxvb2t1cCB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCAqbTMycl9jZ2VuX29waW5zdF90YWJsZVtNQVhfSU5TTlNdID0gewotICAwLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9hZGQzX29wc1swXSwKLSAgJiBmbXRfYWRkX29wc1swXSwKLSAgJiBmbXRfYW5kM19vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X29yM19vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X2FuZDNfb3BzWzBdLAotICAmIGZtdF9hZGRpX29wc1swXSwKLSAgJiBmbXRfYWRkdl9vcHNbMF0sCi0gICYgZm10X2FkZHYzX29wc1swXSwKLSAgJiBmbXRfYWRkeF9vcHNbMF0sCi0gICYgZm10X2JjOF9vcHNbMF0sCi0gICYgZm10X2JjMjRfb3BzWzBdLAotICAmIGZtdF9iZXFfb3BzWzBdLAotICAmIGZtdF9iZXF6X29wc1swXSwKLSAgJiBmbXRfYmVxel9vcHNbMF0sCi0gICYgZm10X2JlcXpfb3BzWzBdLAotICAmIGZtdF9iZXF6X29wc1swXSwKLSAgJiBmbXRfYmVxel9vcHNbMF0sCi0gICYgZm10X2JlcXpfb3BzWzBdLAotICAmIGZtdF9ibDhfb3BzWzBdLAotICAmIGZtdF9ibDI0X29wc1swXSwKLSAgJiBmbXRfYmM4X29wc1swXSwKLSAgJiBmbXRfYmMyNF9vcHNbMF0sCi0gICYgZm10X2JlcV9vcHNbMF0sCi0gICYgZm10X2JyYThfb3BzWzBdLAotICAmIGZtdF9icmEyNF9vcHNbMF0sCi0gICYgZm10X2NtcF9vcHNbMF0sCi0gICYgZm10X2NtcGlfb3BzWzBdLAotICAmIGZtdF9jbXBfb3BzWzBdLAotICAmIGZtdF9jbXBpX29wc1swXSwKLSAgJiBmbXRfZGl2X29wc1swXSwKLSAgJiBmbXRfZGl2X29wc1swXSwKLSAgJiBmbXRfZGl2X29wc1swXSwKLSAgJiBmbXRfZGl2X29wc1swXSwKLSAgJiBmbXRfamxfb3BzWzBdLAotICAmIGZtdF9qbXBfb3BzWzBdLAotICAmIGZtdF9sZF9vcHNbMF0sCi0gICYgZm10X2xkX2Rfb3BzWzBdLAotICAmIGZtdF9sZGJfb3BzWzBdLAotICAmIGZtdF9sZGJfZF9vcHNbMF0sCi0gICYgZm10X2xkaF9vcHNbMF0sCi0gICYgZm10X2xkaF9kX29wc1swXSwKLSAgJiBmbXRfbGRiX29wc1swXSwKLSAgJiBmbXRfbGRiX2Rfb3BzWzBdLAotICAmIGZtdF9sZGhfb3BzWzBdLAotICAmIGZtdF9sZGhfZF9vcHNbMF0sCi0gICYgZm10X2xkX3BsdXNfb3BzWzBdLAotICAmIGZtdF9sZDI0X29wc1swXSwKLSAgJiBmbXRfbGRpOF9vcHNbMF0sCi0gICYgZm10X2xkaTE2X29wc1swXSwKLSAgJiBmbXRfbG9ja19vcHNbMF0sCi0gICYgZm10X21hY2hpX29wc1swXSwKLSAgJiBmbXRfbWFjaGlfb3BzWzBdLAotICAmIGZtdF9tYWNoaV9vcHNbMF0sCi0gICYgZm10X21hY2hpX29wc1swXSwKLSAgJiBmbXRfYWRkX29wc1swXSwKLSAgJiBmbXRfbXVsaGlfb3BzWzBdLAotICAmIGZtdF9tdWxoaV9vcHNbMF0sCi0gICYgZm10X211bGhpX29wc1swXSwKLSAgJiBmbXRfbXVsaGlfb3BzWzBdLAotICAmIGZtdF9tdl9vcHNbMF0sCi0gICYgZm10X212ZmFjaGlfb3BzWzBdLAotICAmIGZtdF9tdmZhY2hpX29wc1swXSwKLSAgJiBmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgZm10X212ZmNfb3BzWzBdLAotICAmIGZtdF9tdnRhY2hpX29wc1swXSwKLSAgJiBmbXRfbXZ0YWNoaV9vcHNbMF0sCi0gICYgZm10X212dGNfb3BzWzBdLAotICAmIGZtdF9tdl9vcHNbMF0sCi0gICYgZm10X25vcF9vcHNbMF0sCi0gICYgZm10X212X29wc1swXSwKLSAgJiBmbXRfcmFjX29wc1swXSwKLSAgJiBmbXRfcmFjX29wc1swXSwKLSAgJiBmbXRfcnRlX29wc1swXSwKLSAgJiBmbXRfc2V0aF9vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X3NsbDNfb3BzWzBdLAotICAmIGZtdF9zbGxpX29wc1swXSwKLSAgJiBmbXRfYWRkX29wc1swXSwKLSAgJiBmbXRfc2xsM19vcHNbMF0sCi0gICYgZm10X3NsbGlfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9zbGwzX29wc1swXSwKLSAgJiBmbXRfc2xsaV9vcHNbMF0sCi0gICYgZm10X3N0X29wc1swXSwKLSAgJiBmbXRfc3RfZF9vcHNbMF0sCi0gICYgZm10X3N0Yl9vcHNbMF0sCi0gICYgZm10X3N0Yl9kX29wc1swXSwKLSAgJiBmbXRfc3RoX29wc1swXSwKLSAgJiBmbXRfc3RoX2Rfb3BzWzBdLAotICAmIGZtdF9zdF9wbHVzX29wc1swXSwKLSAgJiBmbXRfc3RfcGx1c19vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X2FkZHZfb3BzWzBdLAotICAmIGZtdF9hZGR4X29wc1swXSwKLSAgJiBmbXRfdHJhcF9vcHNbMF0sCi0gICYgZm10X3VubG9ja19vcHNbMF0sCi19OwotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X29waW5zdF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX09QSU5TVCAqKm9pID0gJiBtMzJyX2NnZW5fb3BpbnN0X3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXM7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5vcGluc3QgPSBvaVtpXTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTY4ay1kaXMuYyBiL29wY29kZXMvbTY4ay1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkM2E4MjEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tNjhrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwOCArMCwwIEBACi0vKiBQcmludCBNb3Rvcm9sYSA2OGsgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL202OGsuaCIKLQotLyogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF9ieXRlICopKTsKLQotc3RhdGljIHZvaWQKLWR1bW15X3ByaW50X2FkZHJlc3MgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1mZXRjaF9hcmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQsIGludCwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9iYXNlIFBBUkFNUyAoKGludCwgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcHJpbnRfaW5kZXhlZCBQQVJBTVMgKChpbnQsIHVuc2lnbmVkIGNoYXIgKiwgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQliZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotQ09OU1QgY2hhciAqIENPTlNUIGZwY3JfbmFtZXNbXSA9IHsKLSAgIiIsICIlZnBpYXIiLCAiJWZwc3IiLCAiJWZwaWFyLyVmcHNyIiwgIiVmcGNyIiwKLSAgIiVmcGlhci8lZnBjciIsICIlZnBzci8lZnBjciIsICIlZnBpYXIvJWZwc3IvJWZwY3IifTsKLQotc3RhdGljIGNoYXIgKmNvbnN0IHJlZ19uYW1lc1tdID0gewotICAiJWQwIiwgIiVkMSIsICIlZDIiLCAiJWQzIiwgIiVkNCIsICIlZDUiLCAiJWQ2IiwgIiVkNyIsCi0gICIlYTAiLCAiJWExIiwgIiVhMiIsICIlYTMiLCAiJWE0IiwgIiVhNSIsICIlZnAiLCAiJXNwIiwKLSAgIiVwcyIsICIlcGMifTsKLQotLyogU2lnbi1leHRlbmQgYW4gKHVuc2lnbmVkIGNoYXIpLiAqLwotI2lmIF9fU1REQ19fID09IDEKLSNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKHNpZ25lZCBjaGFyKShjaCkpCi0jZWxzZQotI2RlZmluZSBDT0VSQ0VfU0lHTkVEX0NIQVIoY2gpICgoaW50KSgoKGNoKSBeIDB4ODApICYgMHhGRikgLSAxMjgpCi0jZW5kaWYKLQotLyogR2V0IGEgMSBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgTkVYVEJZVEUocCkgIChwICs9IDIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBDT0VSQ0VfU0lHTkVEX0NIQVIocFstMV0pKQotCi0vKiBHZXQgYSAyIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBDT0VSQ0UxNih4KSAoKGludCkgKCgoeCkgXiAweDgwMDApIC0gMHg4MDAwKSkKLSNkZWZpbmUgTkVYVFdPUkQocCkgIFwKLSAgKHAgKz0gMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIENPRVJDRTE2ICgocFstMl0gPDwgOCkgKyBwWy0xXSkpCi0KLS8qIEdldCBhIDQgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIENPRVJDRTMyKHgpICgoYmZkX3NpZ25lZF92bWEpICgoeCkgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDApCi0jZGVmaW5lIE5FWFRMT05HKHApICBcCi0gIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICAoQ09FUkNFMzIgKCgoKCgocFstNF0gPDwgOCkgKyBwWy0zXSkgPDwgOCkgKyBwWy0yXSkgPDwgOCkgKyBwWy0xXSkpKQotCi0vKiBHZXQgYSA0IGJ5dGUgdW5zaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIE5FWFRVTE9ORyhwKSAgXAotICAocCArPSA0LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgKHVuc2lnbmVkIGludCkgKCgoKCgocFstNF0gPDwgOCkgKyBwWy0zXSkgPDwgOCkgKyBwWy0yXSkgPDwgOCkgKyBwWy0xXSkpCi0KLS8qIEdldCBhIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQuICAqLwotI2RlZmluZSBORVhUU0lOR0xFKHZhbCwgcCkgXAotICAocCArPSA0LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnLCAoY2hhciAqKSBwIC0gNCwgJnZhbCkpCi0KLS8qIEdldCBhIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQuICAqLwotI2RlZmluZSBORVhURE9VQkxFKHZhbCwgcCkgXAotICAocCArPSA4LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnLCAoY2hhciAqKSBwIC0gOCwgJnZhbCkpCi0KLS8qIEdldCBhbiBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQuICAqLwotI2RlZmluZSBORVhURVhURU5EKHZhbCwgcCkgXAotICAocCArPSAxMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X202ODg4MV9leHQsIChjaGFyICopIHAgLSAxMiwgJnZhbCkpCi0KLS8qIE5lZWQgYSBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gcGFja2VkIHRvIGRvdWJsZQotICAgcHJlY2lzaW9uLiAgIEFjdHVhbGx5LCBpdCdzIGVhc2llciB0byBwcmludCBhCi0gICBwYWNrZWQgbnVtYmVyIHRoYW4gYSBkb3VibGUgYW55d2F5LCBzbyBtYXliZQotICAgdGhlcmUgc2hvdWxkIGJlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSB0aGlzLi4uICovCi0jZGVmaW5lIE5FWFRQQUNLRUQocCkgXAotICAocCArPSAxMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIDAuMCkKLQotDAotLyogTWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNQVhMRU4gMjIKLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi1zdHJ1Y3QgcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotICByZXR1cm4gMTsKLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwcmludCB0byB0aGUgYml0LWJ1Y2tldC4gKi8KLXN0YXRpYyBpbnQKLSNpZmRlZiBfX1NURENfXwotZHVtbXlfcHJpbnRlciAoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBmb3JtYXQsIC4uLikKLSNlbHNlCi1kdW1teV9wcmludGVyIChmaWxlKSBGSUxFICpmaWxlOwotI2VuZGlmCi0geyByZXR1cm4gMDsgfQotCi1zdGF0aWMgdm9pZAotZHVtbXlfcHJpbnRfYWRkcmVzcyAodm1hLCBpbmZvKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci19Ci0KLS8qIFByaW50IHRoZSBtNjhrIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX202OGsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGNoYXIgKnNhdmVfcDsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBiZXN0bWFzazsKLSAgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICpiZXN0ID0gMDsKLSAgdW5zaWduZWQgaW50IGFyY2hfbWFzazsKLSAgc3RydWN0IHByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmJ1ZmZlciA9IHByaXYudGhlX2J1ZmZlcjsKLSAgZnByaW50Zl9mdHlwZSBzYXZlX3ByaW50ZXIgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKCpzYXZlX3ByaW50X2FkZHJlc3MpIFBBUkFNUygoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8qKSkKLSAgICA9IGluZm8tPnByaW50X2FkZHJlc3NfZnVuYzsKLSAgaW50IG1ham9yX29wY29kZTsKLSAgc3RhdGljIGludCBudW1vcGNvZGVzWzE2XTsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqKm9wY29kZXNbMTZdOwotCi0gIGlmICghb3Bjb2Rlc1swXSkKLSAgICB7Ci0gICAgICAvKiBTcGVlZCB1cCB0aGUgbWF0Y2hpbmcgYnkgc29ydGluZyB0aGUgb3Bjb2RlIHRhYmxlIG9uIHRoZSB1cHBlcgotCSBmb3VyIGJpdHMgb2YgdGhlIG9wY29kZS4gICovCi0gICAgICBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKipvcGNfcG9pbnRlclsxNl07Ci0KLSAgICAgIC8qIEZpcnN0IGNvdW50IGhvdyBtYW55IG9wY29kZXMgYXJlIGluIGVhY2ggb2YgdGhlIHNpeHRlZW4gYnVja2V0cy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1vcGNvZGVzOyBpKyspCi0JbnVtb3Bjb2Rlc1sobTY4a19vcGNvZGVzW2ldLm9wY29kZSA+PiAyOCkgJiAxNV0rKzsKLQotICAgICAgLyogVGhlbiBjcmVhdGUgYSBzb3J0ZWQgdGFibGUgb2YgcG9pbnRlcnMgdGhhdCBwb2ludCBpbnRvIHRoZQotCSB1bnNvcnRlZCB0YWJsZS4gICovCi0gICAgICBvcGNfcG9pbnRlclswXSA9ICgoY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICoqKQotCQkJeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbTY4a19vcGNvZGUgKikKLQkJCQkgKiBtNjhrX251bW9wY29kZXMpKTsKLSAgICAgIG9wY29kZXNbMF0gPSBvcGNfcG9pbnRlclswXTsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQotCXsKLQkgIG9wY19wb2ludGVyW2ldID0gb3BjX3BvaW50ZXJbaSAtIDFdICsgbnVtb3Bjb2Rlc1tpIC0gMV07Ci0JICBvcGNvZGVzW2ldID0gb3BjX3BvaW50ZXJbaV07Ci0JfQotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1vcGNvZGVzOyBpKyspCi0JKm9wY19wb2ludGVyWyhtNjhrX29wY29kZXNbaV0ub3Bjb2RlID4+IDI4KSAmIDE1XSsrID0gJm02OGtfb3Bjb2Rlc1tpXTsKLQotICAgIH0KLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmcHJpdjsKLSAgLyogVGVsbCBvYmpkdW1wIHRvIHVzZSB0d28gYnl0ZXMgcGVyIGNodW5rIGFuZCBzaXggYnl0ZXMgcGVyIGxpbmUgZm9yCi0gICAgIGRpc3BsYXlpbmcgcmF3IGRhdGEuICAqLwotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDY7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotICBzd2l0Y2ggKGluZm8tPm1hY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYXJjaF9tYXNrID0gKHVuc2lnbmVkIGludCkgLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAwMDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDA4OgotICAgICAgYXJjaF9tYXNrID0gbTY4MDA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAyMDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAyMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDMwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDMwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwNDA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwNDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODA2MDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODA2MDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhcmNoX21hc2sgfD0gbTY4ODgxIHwgbTY4ODUxOwotCi0gIGJlc3RtYXNrID0gMDsKLSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMik7Ci0gIG1ham9yX29wY29kZSA9IChidWZmZXJbMF0gPj4gNCkgJiAxNTsKLSAgZm9yIChpID0gMDsgaSA8IG51bW9wY29kZXNbbWFqb3Jfb3Bjb2RlXTsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqb3BjID0gb3Bjb2Rlc1ttYWpvcl9vcGNvZGVdW2ldOwotICAgICAgdW5zaWduZWQgbG9uZyBvcGNvZGUgPSBvcGMtPm9wY29kZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbWF0Y2ggPSBvcGMtPm1hdGNoOwotCi0gICAgICBpZiAoKCgweGZmICYgYnVmZmVyWzBdICYgKG1hdGNoID4+IDI0KSkgPT0gKDB4ZmYgJiAob3Bjb2RlID4+IDI0KSkpCi0JICAmJiAoKDB4ZmYgJiBidWZmZXJbMV0gJiAobWF0Y2ggPj4gMTYpKSA9PSAoMHhmZiAmIChvcGNvZGUgPj4gMTYpKSkKLQkgIC8qIE9ubHkgZmV0Y2ggdGhlIG5leHQgdHdvIGJ5dGVzIGlmIHdlIG5lZWQgdG8uICAqLwotCSAgJiYgKCgoMHhmZmZmICYgbWF0Y2gpID09IDApCi0JICAgICAgfHwKLQkgICAgICAoRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgNCkKLQkgICAgICAgJiYgKCgweGZmICYgYnVmZmVyWzJdICYgKG1hdGNoID4+IDgpKSA9PSAoMHhmZiAmIChvcGNvZGUgPj4gOCkpKQotCSAgICAgICAmJiAoKDB4ZmYgJiBidWZmZXJbM10gJiBtYXRjaCkgPT0gKDB4ZmYgJiBvcGNvZGUpKSkKLQkgICAgICApCi0JICAmJiAob3BjLT5hcmNoICYgYXJjaF9tYXNrKSAhPSAwKQotCXsKLQkgIC8qIERvbid0IHVzZSBmb3IgcHJpbnRvdXQgdGhlIHZhcmlhbnRzIG9mIGRpdnVsIGFuZCBkaXZzbAotCSAgICAgdGhhdCBoYXZlIHRoZSBzYW1lIHJlZ2lzdGVyIG51bWJlciBpbiB0d28gcGxhY2VzLgotCSAgICAgVGhlIG1vcmUgZ2VuZXJhbCB2YXJpYW50cyB3aWxsIG1hdGNoIGluc3RlYWQuICAqLwotCSAgZm9yIChkID0gb3BjLT5hcmdzOyAqZDsgZCArPSAyKQotCSAgICBpZiAoZFsxXSA9PSAnRCcpCi0JICAgICAgYnJlYWs7Ci0KLQkgIC8qIERvbid0IHVzZSBmb3IgcHJpbnRvdXQgdGhlIHZhcmlhbnRzIG9mIG1vc3QgZmxvYXRpbmcKLQkgICAgIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB3aGljaCB1c2UgdGhlIHNhbWUKLQkgICAgIHJlZ2lzdGVyIG51bWJlciBpbiB0d28gcGxhY2VzLCBhcyBhYm92ZS4gKi8KLQkgIGlmICgqZCA9PSAnXDAnKQotCSAgICBmb3IgKGQgPSBvcGMtPmFyZ3M7ICpkOyBkICs9IDIpCi0JICAgICAgaWYgKGRbMV0gPT0gJ3QnKQotCQlicmVhazsKLQotCSAgLyogRG9uJ3QgbWF0Y2ggZm1vdmVsIHdpdGggbW9yZSB0aGFuIG9uZSByZWdpc3Rlcjsgd2FpdCBmb3IKLSAgICAgICAgICAgICBmbW92ZW1sLiAgKi8KLQkgIGlmICgqZCA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgZm9yIChkID0gb3BjLT5hcmdzOyAqZDsgZCArPSAyKQotCQl7Ci0JCSAgaWYgKGRbMF0gPT0gJ3MnICYmIGRbMV0gPT0gJzgnKQotCQkgICAgewotCQkgICAgICBpbnQgdmFsOwotCi0JCSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBkWzFdLCAzLCBpbmZvKTsKLQkJICAgICAgaWYgKCh2YWwgJiAodmFsIC0gMSkpICE9IDApCi0JCQlicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmICgqZCA9PSAnXDAnICYmIG1hdGNoID4gYmVzdG1hc2spCi0JICAgIHsKLQkgICAgICBiZXN0ID0gb3BjOwotCSAgICAgIGJlc3RtYXNrID0gbWF0Y2g7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChiZXN0ID09IDApCi0gICAgZ290byBpbnZhbGlkOwotCi0gIC8qIFBvaW50IGF0IGZpcnN0IHdvcmQgb2YgYXJndW1lbnQgZGF0YSwKLSAgICAgYW5kIGF0IGRlc2NyaXB0b3IgZm9yIGZpcnN0IGFyZ3VtZW50LiAgKi8KLSAgcCA9IGJ1ZmZlciArIDI7Ci0gIAotICAvKiBGaWd1cmUgb3V0IGhvdyBsb25nIHRoZSBmaXhlZC1zaXplIHBvcnRpb24gb2YgdGhlIGluc3RydWN0aW9uIGlzLgotICAgICBUaGUgb25seSBwbGFjZSB0aGlzIGlzIHN0b3JlZCBpbiB0aGUgb3Bjb2RlIHRhYmxlIGlzCi0gICAgIGluIHRoZSBhcmd1bWVudHMtLWxvb2sgZm9yIGFyZ3VtZW50cyB3aGljaCBzcGVjaWZ5IGZpZWxkcyBpbiB0aGUgMm5kCi0gICAgIG9yIDNyZCB3b3JkcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmb3IgKGQgPSBiZXN0LT5hcmdzOyAqZDsgZCArPSAyKQotICAgIHsKLSAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgaXQgaXMgbmVjZXNzYXJ5IHRvIGJlIGNoZWNraW5nIGRbMF0gaGVyZTsgSSBzdXNwZWN0Ci0JIGFsbCB0aGlzIGNvdWxkIGJlIG1vdmVkIHRvIHRoZSBjYXNlIHN0YXRlbWVudCBiZWxvdy4gICovCi0gICAgICBpZiAoZFswXSA9PSAnIycpCi0JewotCSAgaWYgKGRbMV0gPT0gJ2wnICYmIHAgLSBidWZmZXIgPCA2KQotCSAgICBwID0gYnVmZmVyICsgNjsKLQkgIGVsc2UgaWYgKHAgLSBidWZmZXIgPCA0ICYmIGRbMV0gIT0gJ0MnICYmIGRbMV0gIT0gJzgnICkKLQkgICAgcCA9IGJ1ZmZlciArIDQ7Ci0JfQotICAgICAgaWYgKChkWzBdID09ICdMJyB8fCBkWzBdID09ICdsJykgJiYgZFsxXSA9PSAndycgJiYgcCAtIGJ1ZmZlciA8IDQpCi0JcCA9IGJ1ZmZlciArIDQ7Ci0gICAgICBzd2l0Y2ggKGRbMV0pCi0JewotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzcnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCWNhc2UgJ2knOgotCSAgaWYgKHAgLSBidWZmZXIgPCA0KQotCSAgICBwID0gYnVmZmVyICsgNDsKLQkgIGJyZWFrOwotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCSAgaWYgKHAgLSBidWZmZXIgPCA2KQotCSAgICBwID0gYnVmZmVyICsgNjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIHBmbHVzaGEgaXMgYW4gZXhjZXB0aW9ucy4gIEl0IHRha2VzIG5vIGFyZ3VtZW50cyBidXQgaXMgdHdvIHdvcmRzCi0gICAgIGxvbmcuICBSZWNvZ25pemUgaXQgYnkgbG9va2luZyBhdCB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgbWFzay4gICovCi0gIGlmIChwIC0gYnVmZmVyIDwgNCAmJiAoYmVzdC0+bWF0Y2ggJiAweEZGRkYpICE9IDApCi0gICAgcCA9IGJ1ZmZlciArIDQ7Ci0KLSAgLyogbHBzdG9wIGlzIGFub3RoZXIgZXhjZXB0aW9uLiAgSXQgdGFrZXMgYSBvbmUgd29yZCBhcmd1bWVudCBidXQgaXMKLSAgICAgdGhyZWUgd29yZHMgbG9uZy4gICovCi0gIGlmIChwIC0gYnVmZmVyIDwgNgotICAgICAgJiYgKGJlc3QtPm1hdGNoICYgMHhmZmZmKSA9PSAweGZmZmYKLSAgICAgICYmIGJlc3QtPmFyZ3NbMF0gPT0gJyMnCi0gICAgICAmJiBiZXN0LT5hcmdzWzFdID09ICd3JykKLSAgICB7Ci0gICAgICAvKiBDb3B5IHRoZSBvbmUgd29yZCBhcmd1bWVudCBpbnRvIHRoZSB1c3VhbCBsb2NhdGlvbiBmb3IgYSBvbmUKLQkgd29yZCBhcmd1bWVudCwgdG8gc2ltcGxpZnkgcHJpbnRpbmcgaXQuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aAotCSB0aGlzIGJlY2F1c2Ugd2Uga25vdyBleGFjdGx5IHdoYXQgdGhlIHNlY29uZCB3b3JkIGlzLCBhbmQgd2UKLQkgYXJlbid0IGdvaW5nIHRvIHByaW50IGFueXRoaW5nIGJhc2VkIG9uIGl0LiAgKi8KLSAgICAgIHAgPSBidWZmZXIgKyA2OwotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgcCk7Ci0gICAgICBidWZmZXJbMl0gPSBidWZmZXJbNF07Ci0gICAgICBidWZmZXJbM10gPSBidWZmZXJbNV07Ci0gICAgfQotCi0gIEZFVENIX0RBVEEgKGluZm8sIHApOwotICAKLSAgZCA9IGJlc3QtPmFyZ3M7Ci0KLSAgLyogV2UgY2FuIHRoZSBvcGVyYW5kcyB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lIHdlIGRvbid0IHByaW50IGFueXRoaW5nLAotICAgICBidXQgbG9vayBmb3IgZXJyb3JzLiAqLwotCi0gIHNhdmVfcCA9IHA7Ci0gIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyA9IGR1bW15X3ByaW50X2FkZHJlc3M7Ci0gIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKWR1bW15X3ByaW50ZXI7Ci0gIGZvciAoIDsgKmQ7IGQgKz0gMikKLSAgICB7Ci0gICAgICBpbnQgZWF0ZW4gPSBwcmludF9pbnNuX2FyZyAoZCwgYnVmZmVyLCBwLCBtZW1hZGRyICsgKHAgLSBidWZmZXIpLCBpbmZvKTsKLSAgICAgIGlmIChlYXRlbiA+PSAwKQotCXAgKz0gZWF0ZW47Ci0gICAgICBlbHNlIGlmIChlYXRlbiA9PSAtMSkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICBlbHNlCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKGluZm8tPnN0cmVhbSwKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCV8oIjxpbnRlcm5hbCBlcnJvciBpbiBvcGNvZGUgdGFibGU6ICVzICVzPlxuIiksCi0JCQkJYmVzdC0+bmFtZSwKLQkJCQliZXN0LT5hcmdzKTsKLQkgIGdvdG8gaW52YWxpZDsKLQl9Ci0KLSAgICB9Ci0gIHAgPSBzYXZlX3A7Ci0gIGluZm8tPmZwcmludGZfZnVuYyA9IHNhdmVfcHJpbnRlcjsKLSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jID0gc2F2ZV9wcmludF9hZGRyZXNzOwotCi0gIGQgPSBiZXN0LT5hcmdzOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBiZXN0LT5uYW1lKTsKLQotICBpZiAoKmQpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0KLSAgd2hpbGUgKCpkKQotICAgIHsKLSAgICAgIHAgKz0gcHJpbnRfaW5zbl9hcmcgKGQsIGJ1ZmZlciwgcCwgbWVtYWRkciArIChwIC0gYnVmZmVyKSwgaW5mbyk7Ci0gICAgICBkICs9IDI7Ci0gICAgICBpZiAoKmQgJiYgKihkIC0gMikgIT0gJ0knICYmICpkICE9ICdrJykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLSAgICB9Ci0gIHJldHVybiBwIC0gYnVmZmVyOwotCi0gaW52YWxpZDoKLSAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgPSBzYXZlX3ByaW50ZXI7Ci0gIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyA9IHNhdmVfcHJpbnRfYWRkcmVzczsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwJW8iLAotCQkJIChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV0pOwotICByZXR1cm4gMjsKLX0KLQotLyogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgImVhdGVuIiBieSB0aGUgb3BlcmFuZCwgb3IKLSAgIHJldHVybiAtMSBpZiBhbiBpbnZhbGlkIG9wZXJhbmQgd2FzIGZvdW5kLCBvciAtMiBpZgotICAgYW4gb3Bjb2RlIHRhYmUgZXJyb3Igd2FzIGZvdW5kLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyAoZCwgYnVmZmVyLCBwMCwgYWRkciwgaW5mbykKLSAgICAgY29uc3QgY2hhciAqZDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICB1bnNpZ25lZCBjaGFyICpwMDsKLSAgICAgYmZkX3ZtYSBhZGRyOwkJLyogUEMgZm9yIHRoaXMgYXJnIHRvIGJlIHJlbGF0aXZlIHRvICovCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGludCB2YWwgPSAwOwotICByZWdpc3RlciBpbnQgcGxhY2UgPSBkWzFdOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwID0gcDA7Ci0gIGludCByZWdubzsKLSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqcmVnbmFtZTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDE7Ci0gIGRvdWJsZSBmbHZhbDsKLSAgaW50IGZsdF9wOwotICBiZmRfc2lnbmVkX3ZtYSBkaXNwOwotICB1bnNpZ25lZCBpbnQgdXZhbDsKLQotICBzd2l0Y2ggKCpkKQotICAgIHsKLSAgICBjYXNlICdjJzoJCS8qIGNhY2hlIGlkZW50aWZpZXIgKi8KLSAgICAgIHsKLSAgICAgICAgc3RhdGljIGNoYXIgKmNvbnN0IGNhY2hlRmllbGROYW1lW10gPSB7ICJuYyIsICJkYyIsICJpYyIsICJiYyIgfTsKLSAgICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAyLCBpbmZvKTsKLSAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIGNhY2hlRmllbGROYW1lW3ZhbF0pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgJ2EnOgkJLyogYWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiBDZi4gY2FzZSAnKycuICovCi0gICAgICB7Ci0gICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCSAgKGluZm8tPnN0cmVhbSwKLQkgICAiJXNAIiwKLQkgICByZWdfbmFtZXMgW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAnXyc6CQkvKiAzMi1iaXQgYWJzb2x1dGUgYWRkcmVzcyBmb3IgbW92ZTE2LiAqLwotICAgICAgewotICAgICAgICB1dmFsID0gTkVYVFVMT05HIChwKTsKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHV2YWwsIGluZm8pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgJ0MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWNjciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVzciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdVJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSV1c3AiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlYWNjIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJW1hY3NyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJW1hc2siKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSic6Ci0gICAgICB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCB7IGNoYXIgKm5hbWU7IGludCB2YWx1ZTsgfSBuYW1lc1tdCi0JICA9IHt7IiVzZmMiLCAweDAwMH0sIHsiJWRmYyIsIDB4MDAxfSwgeyIlY2FjciIsIDB4MDAyfSwKLQkgICAgIHsiJXRjIiwgIDB4MDAzfSwgeyIlaXR0MCIsMHgwMDR9LCB7IiVpdHQxIiwgMHgwMDV9LAotICAgICAgICAgICAgIHsiJWR0dDAiLDB4MDA2fSwgeyIlZHR0MSIsMHgwMDd9LCB7IiVidXNjciIsMHgwMDh9LAotCSAgICAgeyIldXNwIiwgMHg4MDB9LCB7IiV2YnIiLCAweDgwMX0sIHsiJWNhYXIiLCAweDgwMn0sCi0JICAgICB7IiVtc3AiLCAweDgwM30sIHsiJWlzcCIsIDB4ODA0fSwKLQotCSAgICAgLyogU2hvdWxkIHdlIGJlIGNhbGxpbmcgdGhpcyBwc3IgbGlrZSB3ZSBkbyBpbiBjYXNlICdZJz8gICovCi0JICAgICB7IiVtbXVzciIsMHg4MDV9LAotCi0gICAgICAgICAgICAgeyIldXJwIiwgMHg4MDZ9LCB7IiVzcnAiLCAweDgwN30sIHsiJXBjciIsIDB4ODA4fX07Ci0KLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDEyLCBpbmZvKTsKLQlmb3IgKHJlZ25vID0gc2l6ZW9mIG5hbWVzIC8gc2l6ZW9mIG5hbWVzWzBdIC0gMTsgcmVnbm8gPj0gMDsgcmVnbm8tLSkKLQkgIGlmIChuYW1lc1tyZWdub10udmFsdWUgPT0gdmFsKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWVzW3JlZ25vXS5uYW1lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWlmIChyZWdubyA8IDApCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUSc6Ci0gICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pOwotICAgICAgLyogMCBtZWFucyA4LCBleGNlcHQgZm9yIHRoZSBia3B0IGluc3RydWN0aW9uLi4uICovCi0gICAgICBpZiAodmFsID09IDAgJiYgZFsxXSAhPSAncycpCi0JdmFsID0gODsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgICBpZiAocGxhY2UgPT0gJ2gnKQotCXsKLQkgIHN0YXRpYyBjaGFyICpjb25zdCBzY2FsZWZhY3Rvcl9uYW1lW10gPSB7ICI8PCIsICI+PiIgfTsKLQkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMSwgaW5mbyk7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc2NhbGVmYWN0b3JfbmFtZVt2YWxdKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA4LCBpbmZvKTsKLQkgIGlmICh2YWwgJiAweDgwKQotCSAgICB2YWwgPSB2YWwgLSAweDEwMDsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCSAgICAgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXMiLAotCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSArIDAxMF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlcyIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3InOgotICAgICAgcmVnbm8gPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pOwotICAgICAgaWYgKHJlZ25vID4gNykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCIsIHJlZ19uYW1lc1tyZWdub10pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCglcykiLCByZWdfbmFtZXNbcmVnbm9dKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJSVmcCVkIiwKLQkgZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ08nOgotICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA2LCBpbmZvKTsKLSAgICAgIGlmICh2YWwgJiAweDIwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXMgW3ZhbCAmIDddKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXNAKyIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICctJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlc0AtIiwKLQkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgaWYgKHBsYWNlID09ICdrJykKLQkoKmluZm8tPmZwcmludGZfZnVuYykKLQkgIChpbmZvLT5zdHJlYW0sICJ7JXN9IiwKLQkgICByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKV0pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ0MnKQotCXsKLQkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNywgaW5mbyk7Ci0JICBpZiAoIHZhbCA+IDYzICkJCS8qIFRoaXMgaXMgYSBzaWduZWQgY29uc3RhbnQuICovCi0JICAgIHZhbCAtPSAxMjg7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInsjJWR9IiwgdmFsKTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICdeJzoKLSAgICAgIHAxID0gYnVmZmVyICsgKCpkID09ICcjJyA/IDIgOiA0KTsKLSAgICAgIGlmIChwbGFjZSA9PSAncycpCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdDJykKLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDcsIGluZm8pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJzgnKQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnMycpCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA4LCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdiJykKLQl2YWwgPSBORVhUQllURSAocDEpOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ3cnIHx8IHBsYWNlID09ICdXJykKLQl2YWwgPSBORVhUV09SRCAocDEpOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2wnKQotCXZhbCA9IE5FWFRMT05HIChwMSk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0yOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdCJzoKLSAgICAgIGlmIChwbGFjZSA9PSAnYicpCi0JZGlzcCA9IE5FWFRCWVRFIChwKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdCJykKLQlkaXNwID0gQ09FUkNFX1NJR05FRF9DSEFSKGJ1ZmZlclsxXSk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAndycgfHwgcGxhY2UgPT0gJ1cnKQotCWRpc3AgPSBORVhUV09SRCAocCk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnbCcgfHwgcGxhY2UgPT0gJ0wnIHx8IHBsYWNlID09ICdDJykKLQlkaXNwID0gTkVYVExPTkcgKHApOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2cnKQotCXsKLQkgIGRpc3AgPSBORVhUQllURSAoYnVmZmVyKTsKLQkgIGlmIChkaXNwID09IDApCi0JICAgIGRpc3AgPSBORVhUV09SRCAocCk7Ci0JICBlbHNlIGlmIChkaXNwID09IC0xKQotCSAgICBkaXNwID0gTkVYVExPTkcgKHApOwotCX0KLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdjJykKLQl7Ci0JICBpZiAoYnVmZmVyWzFdICYgMHg0MCkJCS8qIElmIGJpdCBzaXggaXMgb25lLCBsb25nIG9mZnNldCAqLwotCSAgICBkaXNwID0gTkVYVExPTkcgKHApOwotCSAgZWxzZQotCSAgICBkaXNwID0gTkVYVFdPUkQgKHApOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gLTI7Ci0KLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIGRpc3AsIGluZm8pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHZhbCA9IE5FWFRXT1JEIChwKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlc0AoJWQpIiwKLQkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCSAgICAgZnBjcl9uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0knOgotICAgICAgLyogR2V0IGNvcHJvY2Vzc29yIElELi4uICovCi0gICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgJ2QnLCAzLCBpbmZvKTsKLSAgICAgIAotICAgICAgaWYgKHZhbCAhPSAxKQkJCQkvKiBVbnVzdWFsIGNvcHJvY2Vzc29yIElEPyAqLwotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKGNwaWQ9JWQpICIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyonOgotICAgIGNhc2UgJ34nOgotICAgIGNhc2UgJyUnOgotICAgIGNhc2UgJzsnOgotICAgIGNhc2UgJ0AnOgotICAgIGNhc2UgJyEnOgotICAgIGNhc2UgJyQnOgotICAgIGNhc2UgJz8nOgotICAgIGNhc2UgJy8nOgotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ3wnOgotICAgIGNhc2UgJzwnOgotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJ20nOgotICAgIGNhc2UgJ24nOgotICAgIGNhc2UgJ28nOgotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ3EnOgotICAgIGNhc2UgJ3YnOgotCi0gICAgICBpZiAocGxhY2UgPT0gJ2QnKQotCXsKLQkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCAneCcsIDYsIGluZm8pOwotCSAgdmFsID0gKCh2YWwgJiA3KSA8PCAzKSArICgodmFsID4+IDMpICYgNyk7Ci0JfQotICAgICAgZWxzZQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCAncycsIDYsIGluZm8pOwotCi0gICAgICAvKiBHZXQgcmVnaXN0ZXIgbnVtYmVyIGFzc3VtaW5nIGFkZHJlc3MgcmVnaXN0ZXIuICAqLwotICAgICAgcmVnbm8gPSAodmFsICYgNykgKyA4OwotICAgICAgcmVnbmFtZSA9IHJlZ19uYW1lc1tyZWdub107Ci0gICAgICBzd2l0Y2ggKHZhbCA+PiAzKQotCXsKLQljYXNlIDA6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnX25hbWVzW3ZhbF0pOwotCSAgYnJlYWs7Ci0KLQljYXNlIDE6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZSk7Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAIiwgcmVnbmFtZSk7Ci0JICBicmVhazsKLQotCWNhc2UgMzoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAKyIsIHJlZ25hbWUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDQ6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQC0iLCByZWduYW1lKTsKLQkgIGJyZWFrOwotCi0JY2FzZSA1OgotCSAgdmFsID0gTkVYVFdPUkQgKHApOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AoJWQpIiwgcmVnbmFtZSwgdmFsKTsKLQkgIGJyZWFrOwotCi0JY2FzZSA2OgotCSAgcCA9IHByaW50X2luZGV4ZWQgKHJlZ25vLCBwLCBhZGRyLCBpbmZvKTsKLQkgIGJyZWFrOwotCi0JY2FzZSA3OgotCSAgc3dpdGNoICh2YWwgJiA3KQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICB2YWwgPSBORVhUV09SRCAocCk7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMToKLQkgICAgICB1dmFsID0gTkVYVFVMT05HIChwKTsKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHV2YWwsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMjoKLQkgICAgICB2YWwgPSBORVhUV09SRCAocCk7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXBjQCgiKTsKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyB2YWwsIGluZm8pOwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMzoKLQkgICAgICBwID0gcHJpbnRfaW5kZXhlZCAoLTEsIHAsIGFkZHIsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgNDoKLQkgICAgICBmbHRfcCA9IDE7CS8qIEFzc3VtZSBpdCdzIGEgZmxvYXQuLi4gKi8KLQkgICAgICBzd2l0Y2goIHBsYWNlICkKLQkgICAgICB7Ci0JCWNhc2UgJ2InOgotCQkgIHZhbCA9IE5FWFRCWVRFIChwKTsKLQkJICBmbHRfcCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAndyc6Ci0JCSAgdmFsID0gTkVYVFdPUkQgKHApOwotCQkgIGZsdF9wID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlICdsJzoKLQkJICB2YWwgPSBORVhUTE9ORyAocCk7Ci0JCSAgZmx0X3AgPSAwOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2YnOgotCQkgIE5FWFRTSU5HTEUoZmx2YWwsIHApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0YnOgotCQkgIE5FWFRET1VCTEUoZmx2YWwsIHApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3gnOgotCQkgIE5FWFRFWFRFTkQoZmx2YWwsIHApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3AnOgotCQkgIGZsdmFsID0gTkVYVFBBQ0tFRChwKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIHJldHVybiAtMTsKLQkgICAgICB9Ci0JICAgICAgaWYgKCBmbHRfcCApCS8qIFByaW50IGEgZmxvYXQ/ICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVnIiwgZmx2YWwpOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdMJzoKLSAgICBjYXNlICdsJzoKLQlpZiAocGxhY2UgPT0gJ3cnKQotCSAgewotCSAgICBjaGFyIGRvbmVhbnk7Ci0JICAgIHAxID0gYnVmZmVyICsgMjsKLQkgICAgdmFsID0gTkVYVFdPUkQgKHAxKTsKLQkgICAgLyogTW92ZSB0aGUgcG9pbnRlciBhaGVhZCBpZiB0aGlzIHBvaW50IGlzIGZhcnRoZXIgYWhlYWQKLQkgICAgICAgdGhhbiB0aGUgbGFzdC4gICovCi0JICAgIHAgPSBwMSA+IHAgPyBwMSA6IHA7Ci0JICAgIGlmICh2YWwgPT0gMCkKLQkgICAgICB7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIzAiKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoKmQgPT0gJ2wnKQotCSAgICAgIHsKLQkJcmVnaXN0ZXIgaW50IG5ld3ZhbCA9IDA7Ci0JCWZvciAocmVnbm8gPSAwOyByZWdubyA8IDE2OyArK3JlZ25vKQotCQkgIGlmICh2YWwgJiAoMHg4MDAwID4+IHJlZ25vKSkKLQkJICAgIG5ld3ZhbCB8PSAxIDw8IHJlZ25vOwotCQl2YWwgPSBuZXd2YWw7Ci0JICAgICAgfQotCSAgICB2YWwgJj0gMHhmZmZmOwotCSAgICBkb25lYW55ID0gMDsKLQkgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgMTY7ICsrcmVnbm8pCi0JICAgICAgaWYgKHZhbCAmICgxIDw8IHJlZ25vKSkKLQkJewotCQkgIGludCBmaXJzdF9yZWdubzsKLQkJICBpZiAoZG9uZWFueSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLyIpOwotCQkgIGRvbmVhbnkgPSAxOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXNbcmVnbm9dKTsKLQkJICBmaXJzdF9yZWdubyA9IHJlZ25vOwotCQkgIHdoaWxlICh2YWwgJiAoMSA8PCAocmVnbm8gKyAxKSkpCi0JCSAgICArK3JlZ25vOwotCQkgIGlmIChyZWdubyA+IGZpcnN0X3JlZ25vKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXMiLAotCQkJCQkgICByZWdfbmFtZXNbcmVnbm9dKTsKLQkJfQotCSAgfQotCWVsc2UgaWYgKHBsYWNlID09ICczJykKLQkgIHsKLQkgICAgLyogYGZtb3ZlbScgaW5zbi4gICovCi0JICAgIGNoYXIgZG9uZWFueTsKLQkgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA4LCBpbmZvKTsKLQkgICAgaWYgKHZhbCA9PSAwKQotCSAgICAgIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjMCIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGlmICgqZCA9PSAnbCcpCi0JICAgICAgewotCQlyZWdpc3RlciBpbnQgbmV3dmFsID0gMDsKLQkJZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgODsgKytyZWdubykKLQkJICBpZiAodmFsICYgKDB4ODAgPj4gcmVnbm8pKQotCQkgICAgbmV3dmFsIHw9IDEgPDwgcmVnbm87Ci0JCXZhbCA9IG5ld3ZhbDsKLQkgICAgICB9Ci0JICAgIHZhbCAmPSAweGZmOwotCSAgICBkb25lYW55ID0gMDsKLQkgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgODsgKytyZWdubykKLQkgICAgICBpZiAodmFsICYgKDEgPDwgcmVnbm8pKQotCQl7Ci0JCSAgaW50IGZpcnN0X3JlZ25vOwotCQkgIGlmIChkb25lYW55KQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIvIik7Ci0JCSAgZG9uZWFueSA9IDE7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWZwJWQiLCByZWdubyk7Ci0JCSAgZmlyc3RfcmVnbm8gPSByZWdubzsKLQkJICB3aGlsZSAodmFsICYgKDEgPDwgKHJlZ25vICsgMSkpKQotCQkgICAgKytyZWdubzsKLQkJICBpZiAocmVnbm8gPiBmaXJzdF9yZWdubykKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSUlZnAlZCIsIHJlZ25vKTsKLQkJfQotCSAgfQotCWVsc2UgaWYgKHBsYWNlID09ICc4JykKLQkgIHsKLQkgICAgLyogZm1vdmVtbCBmb3IgRlAgc3RhdHVzIHJlZ2lzdGVycyAqLwotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCQkgICBmcGNyX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywKLQkJCQkJCQkgaW5mbyldKTsKLQkgIH0KLQllbHNlCi0JICByZXR1cm4gLTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgcGxhY2UgPSAnOCc7Ci0gICAgY2FzZSAnWSc6Ci0gICAgY2FzZSAnWic6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgICB7Ci0JaW50IHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNSwgaW5mbyk7Ci0JY2hhciAqbmFtZSA9IDA7Ci0Jc3dpdGNoICh2YWwpCi0JICB7Ci0JICBjYXNlIDI6IG5hbWUgPSAiJXR0MCI7IGJyZWFrOwotCSAgY2FzZSAzOiBuYW1lID0gIiV0dDEiOyBicmVhazsKLQkgIGNhc2UgMHgxMDogbmFtZSA9ICIldGMiOyBicmVhazsKLQkgIGNhc2UgMHgxMTogbmFtZSA9ICIlZHJwIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTI6IG5hbWUgPSAiJXNycCI7IGJyZWFrOwotCSAgY2FzZSAweDEzOiBuYW1lID0gIiVjcnAiOyBicmVhazsKLQkgIGNhc2UgMHgxNDogbmFtZSA9ICIlY2FsIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTU6IG5hbWUgPSAiJXZhbCI7IGJyZWFrOwotCSAgY2FzZSAweDE2OiBuYW1lID0gIiVzY2MiOyBicmVhazsKLQkgIGNhc2UgMHgxNzogbmFtZSA9ICIlYWMiOyBicmVhazsKLSAJICBjYXNlIDB4MTg6IG5hbWUgPSAiJXBzciI7IGJyZWFrOwotCSAgY2FzZSAweDE5OiBuYW1lID0gIiVwY3NyIjsgYnJlYWs7Ci0JICBjYXNlIDB4MWM6Ci0JICBjYXNlIDB4MWQ6Ci0JICAgIHsKLQkgICAgICBpbnQgYnJlYWtfcmVnID0gKChidWZmZXJbM10gPj4gMikgJiA3KTsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJKGluZm8tPnN0cmVhbSwgdmFsID09IDB4MWMgPyAiJSViYWQlZCIgOiAiJSViYWMlZCIsCi0JCSBicmVha19yZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI8bW11IHJlZ2lzdGVyICVkPiIsIHZhbCk7Ci0JICB9Ci0JaWYgKG5hbWUpCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgICAgewotCWludCBmYyA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNSwgaW5mbyk7Ci0JaWYgKGZjID09IDEpCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlZGZjIik7Ci0JZWxzZSBpZiAoZmMgPT0gMCkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVzZmMiKTsKLQllbHNlCi0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oIjxmdW5jdGlvbiBjb2RlICVkPiIpLCBmYyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXZhbCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIHsKLQlpbnQgbGV2ZWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pOwotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBsZXZlbCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3UnOgotICAgICAgewotCXNob3J0IGlzX3VwcGVyID0gMDsKLQlpbnQgcmVnID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA1LCBpbmZvKTsKLQkKLQlpZiAocmVnICYgMHgxMCkKLQkgIHsKLQkgICAgaXNfdXBwZXIgPSAxOwotCSAgICByZWcgJj0gMHhmOwotCSAgfQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMlcyIsCi0JCQkgICAgICAgcmVnX25hbWVzW3JlZ10sCi0JCQkgICAgICAgaXNfdXBwZXIgPyAidSIgOiAibCIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0JCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0KLSAgcmV0dXJuIHAgLSBwMDsKLX0KLQotLyogRmV0Y2ggQklUUyBiaXRzIGZyb20gYSBwb3NpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5IENPREUuCi0gICBDT0RFIGlzIGEgInBsYWNlIHRvIHB1dCBhbiBhcmd1bWVudCIsIG9yICd4JyBmb3IgYSBkZXN0aW5hdGlvbgotICAgdGhhdCBpcyBhIGdlbmVyYWwgYWRkcmVzcyAobW9kZSBhbmQgcmVnaXN0ZXIpLgotICAgQlVGRkVSIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLWZldGNoX2FyZyAoYnVmZmVyLCBjb2RlLCBiaXRzLCBpbmZvKQotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBjb2RlOwotICAgICBpbnQgYml0czsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgaW50IHZhbCA9IDA7Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB2YWwgPSBidWZmZXJbMV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgkJCS8qIERlc3RpbmF0aW9uLCBmb3IgcmVnaXN0ZXIgb3IgcXVpY2suICAqLwotICAgICAgdmFsID0gKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXTsKLSAgICAgIHZhbCA+Pj0gOTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6CQkJLyogRGVzdGluYXRpb24sIGZvciBnZW5lcmFsIGFyZyAqLwotICAgICAgdmFsID0gKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXTsKLSAgICAgIHZhbCA+Pj0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnayc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbM10gPj4gNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSBidWZmZXJbM107Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzEnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMic6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJ2onOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc0JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOwotICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKLSAgICAgIHZhbCA+Pj0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzUnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgNSk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzRdIDw8IDgpICsgYnVmZmVyWzVdOwotICAgICAgdmFsID4+PSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc2JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOwotICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnNyc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDc7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgJzgnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnOSc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2UnOgotICAgICAgdmFsID0gKGJ1ZmZlclsxXSA+PiA2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbSc6IAotICAgICAgdmFsID0gKGJ1ZmZlclsxXSAmIDB4NDAgPyAweDggOiAwKQotCXwgKChidWZmZXJbMF0gPj4gMSkgJiAweDcpCi0JfCAoYnVmZmVyWzNdICYgMHg4MCA/IDB4MTAgOiAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbic6IAotICAgICAgdmFsID0gKGJ1ZmZlclsxXSAmIDB4NDAgPyAweDggOiAwKSB8ICgoYnVmZmVyWzBdID4+IDEpICYgMHg3KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbyc6Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdID4+IDQpIHwgKGJ1ZmZlclszXSAmIDB4ODAgPyAweDEwIDogMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgICAgdmFsID0gYnVmZmVyWzFdIHwgKGJ1ZmZlclszXSAmIDB4NDAgPyAweDEwIDogMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ04nOgotICAgICAgdmFsID0gYnVmZmVyWzNdIHwgKGJ1ZmZlclszXSAmIDB4NDAgPyAweDEwIDogMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgdmFsID0gYnVmZmVyWzJdID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChiaXRzKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gdmFsICYgMTsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gdmFsICYgMzsKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gdmFsICYgNzsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gdmFsICYgMDE3OwotICAgIGNhc2UgNToKLSAgICAgIHJldHVybiB2YWwgJiAwMzc7Ci0gICAgY2FzZSA2OgotICAgICAgcmV0dXJuIHZhbCAmIDA3NzsKLSAgICBjYXNlIDc6Ci0gICAgICByZXR1cm4gdmFsICYgMDE3NzsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gdmFsICYgMDM3NzsKLSAgICBjYXNlIDEyOgotICAgICAgcmV0dXJuIHZhbCAmIDA3Nzc3OwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGFuIGluZGV4ZWQgYXJndW1lbnQuICBUaGUgYmFzZSByZWdpc3RlciBpcyBCQVNFUkVHICgtMSBmb3IgcGMpLgotICAgUCBwb2ludHMgdG8gZXh0ZW5zaW9uIHdvcmQsIGluIGJ1ZmZlci4KLSAgIEFERFIgaXMgdGhlIG5vbWluYWwgY29yZSBhZGRyZXNzIG9mIHRoYXQgZXh0ZW5zaW9uIHdvcmQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1wcmludF9pbmRleGVkIChiYXNlcmVnLCBwLCBhZGRyLCBpbmZvKQotICAgICBpbnQgYmFzZXJlZzsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciBpbnQgd29yZDsKLSAgc3RhdGljIGNoYXIgKmNvbnN0IHNjYWxlc1tdID0geyIiLCAiOjIiLCAiOjQiLCAiOjgifTsKLSAgYmZkX3ZtYSBiYXNlX2Rpc3A7Ci0gIGJmZF92bWEgb3V0ZXJfZGlzcDsKLSAgY2hhciBidWZbNDBdOwotICBjaGFyIHZtYWJ1Zls1MF07Ci0KLSAgd29yZCA9IE5FWFRXT1JEIChwKTsKLQotICAvKiBHZW5lcmF0ZSB0aGUgdGV4dCBmb3IgdGhlIGluZGV4IHJlZ2lzdGVyLgotICAgICBXaGVyZSB0aGlzIHdpbGwgYmUgb3V0cHV0IGlzIG5vdCB5ZXQgZGV0ZXJtaW5lZC4gICovCi0gIHNwcmludGYgKGJ1ZiwgIiVzOiVjJXMiLAotCSAgIHJlZ19uYW1lc1sod29yZCA+PiAxMikgJiAweGZdLAotCSAgICh3b3JkICYgMHg4MDApID8gJ2wnIDogJ3cnLAotCSAgIHNjYWxlc1sod29yZCA+PiA5KSAmIDNdKTsKLQotICAvKiBIYW5kbGUgdGhlIDY4MDAwIHN0eWxlIG9mIGluZGV4aW5nLiAgKi8KLQotICBpZiAoKHdvcmQgJiAweDEwMCkgPT0gMCkKLSAgICB7Ci0gICAgICBiYXNlX2Rpc3AgPSB3b3JkICYgMHhmZjsKLSAgICAgIGlmICgoYmFzZV9kaXNwICYgMHg4MCkgIT0gMCkKLQliYXNlX2Rpc3AgLT0gMHgxMDA7Ci0gICAgICBpZiAoYmFzZXJlZyA9PSAtMSkKLQliYXNlX2Rpc3AgKz0gYWRkcjsKLSAgICAgIHByaW50X2Jhc2UgKGJhc2VyZWcsIGJhc2VfZGlzcCwgaW5mbyk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcykiLCBidWYpOwotICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgZ2VuZXJhbGl6ZWQga2luZC4gICovCi0gIC8qIEZpcnN0LCBjb21wdXRlIHRoZSBkaXNwbGFjZW1lbnQgdG8gYWRkIHRvIHRoZSBiYXNlIHJlZ2lzdGVyLiAgKi8KLQotICBpZiAod29yZCAmIDAyMDApCi0gICAgewotICAgICAgaWYgKGJhc2VyZWcgPT0gLTEpCi0JYmFzZXJlZyA9IC0zOwotICAgICAgZWxzZQotCWJhc2VyZWcgPSAtMjsKLSAgICB9Ci0gIGlmICh3b3JkICYgMDEwMCkKLSAgICBidWZbMF0gPSAnXDAnOwotICBiYXNlX2Rpc3AgPSAwOwotICBzd2l0Y2ggKCh3b3JkID4+IDQpICYgMykKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgYmFzZV9kaXNwID0gTkVYVFdPUkQgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgYmFzZV9kaXNwID0gTkVYVExPTkcgKHApOwotICAgIH0KLSAgaWYgKGJhc2VyZWcgPT0gLTEpCi0gICAgYmFzZV9kaXNwICs9IGFkZHI7Ci0KLSAgLyogSGFuZGxlIHNpbmdsZS1sZXZlbCBjYXNlIChub3QgaW5kaXJlY3QpICovCi0KLSAgaWYgKCh3b3JkICYgNykgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9iYXNlIChiYXNlcmVnLCBiYXNlX2Rpc3AsIGluZm8pOwotICAgICAgaWYgKGJ1ZlswXSAhPSAnXDAnKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgYnVmKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gIC8qIFR3byBsZXZlbC4gIENvbXB1dGUgZGlzcGxhY2VtZW50IHRvIGFkZCBhZnRlciBpbmRpcmVjdGlvbi4gICovCi0KLSAgb3V0ZXJfZGlzcCA9IDA7Ci0gIHN3aXRjaCAod29yZCAmIDMpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIG91dGVyX2Rpc3AgPSBORVhUV09SRCAocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBvdXRlcl9kaXNwID0gTkVYVExPTkcgKHApOwotICAgIH0KLQotICBwcmludF9iYXNlIChiYXNlcmVnLCBiYXNlX2Rpc3AsIGluZm8pOwotICBpZiAoKHdvcmQgJiA0KSA9PSAwICYmIGJ1ZlswXSAhPSAnXDAnKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgYnVmKTsKLSAgICAgIGJ1ZlswXSA9ICdcMCc7Ci0gICAgfQotICBzcHJpbnRmX3ZtYSAodm1hYnVmLCBvdXRlcl9kaXNwKTsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpQCglcyIsIHZtYWJ1Zik7Ci0gIGlmIChidWZbMF0gIT0gJ1wwJykKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcyIsIGJ1Zik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCi0gIHJldHVybiBwOwotfQotCi0vKiBQcmludCBhIGJhc2UgcmVnaXN0ZXIgUkVHTk8gYW5kIGRpc3BsYWNlbWVudCBESVNQLCBvbiBJTkZPLT5TVFJFQU0uCi0gICBSRUdOTyA9IC0xIGZvciBwYywgLTIgZm9yIG5vbmUgKHN1cHByZXNzZWQpLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2Jhc2UgKHJlZ25vLCBkaXNwLCBpbmZvKQotICAgICBpbnQgcmVnbm87Ci0gICAgIGJmZF92bWEgZGlzcDsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKHJlZ25vID09IC0xKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVwY0AoIik7Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGRpc3AsIGluZm8pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzUwXTsKLQotICAgICAgaWYgKHJlZ25vID09IC0yKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsKLSAgICAgIGVsc2UgaWYgKHJlZ25vID09IC0zKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSV6cGNAKCIpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAKCIsIHJlZ19uYW1lc1tyZWdub10pOwotCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBkaXNwKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBidWYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTY4ay1vcGMuYyBiL29wY29kZXMvbTY4ay1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3YWQ3Yy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL202OGstb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTg3ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgbTY4MFswMTIzNDZdMC9tNjg4OFsxMl0vbTY4ODUxL21jZjUyMDAuCi0gICBDb3B5cmlnaHQgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbTY4ay5oIgotCi0jZGVmaW5lIG9uZSh4KSAoKHVuc2lnbmVkIGludCkgKHgpIDw8IDE2KQotI2RlZmluZSB0d28oeCwgeSkgKCgodW5zaWduZWQgaW50KSAoeCkgPDwgMTYpICsgKHkpKQotCi0vKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0Ci0gICBiZSBjb25zZWN1dGl2ZS4gIElmIHRoZXkgYXJlbid0LCB0aGUgYXNzZW1ibGVyIHdpbGwgYm9tYiBhdAotICAgcnVudGltZS4gICovCi0KLWNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSBtNjhrX29wY29kZXNbXSA9Ci17Ci17ImFiY2QiLAlvbmUoMDE0MDQwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJhYmNkIiwJb25lKDAxNDA0MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQoteyJhZGRhdyIsCW9uZSgwMTUwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17ImFkZGFsIiwJb25lKDAxNTA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJhZGRpYiIsCW9uZSgwMDAzMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImFkZGl3IiwJb25lKDAwMDMxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkaWwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJhZGRpbCIsCW9uZSgwMDAzMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAotCi17ImFkZHFiIiwJb25lKDAwNTAwMDApLAlvbmUoMDE3MDcwMCksICJRZCRiIiwgbTY4MDAwdXAgfSwKLXsiYWRkcXciLAlvbmUoMDA1MDEwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXciLCBtNjgwMDB1cCB9LAoteyJhZGRxbCIsCW9uZSgwMDUwMjAwKSwJb25lKDAxNzA3MDApLCAiUWQlbCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLS8qIFRoZSBhZGQgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgYWRkYSwgYWRkaSwgYW5kIGFkZHEgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsiYWRkYiIsCW9uZSgwMDUwMDAwKSwJb25lKDAxNzA3MDApLCAiUWQkYiIsIG02ODAwMHVwIH0sCi17ImFkZGIiLAlvbmUoMDAwMzAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhZGRiIiwJb25lKDAxNTAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsiYWRkYiIsCW9uZSgwMTUwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+YiIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDA1MDEwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXciLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAxNTAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMDAzMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDE1MDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAxNTA1MDApLAlvbmUoMDE3MDcwMCksICJEZH53IiwgbTY4MDAwdXAgfSwKLXsiYWRkbCIsCW9uZSgwMDUwMjAwKSwJb25lKDAxNzA3MDApLCAiUWQlbCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFkZGwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJhZGRsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImFkZGwiLAlvbmUoMDE1MDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhZGRsIiwJb25lKDAxNTAyMDApLAlvbmUoMDE3MDcwMCksICIqbERkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYWRkbCIsCW9uZSgwMTUwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR+bCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYWRkeGIiLAlvbmUoMDE1MDQwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJhZGR4YiIsCW9uZSgwMTUwNDEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi17ImFkZHh3IiwJb25lKDAxNTA1MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsiYWRkeHciLAlvbmUoMDE1MDUxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJhZGR4bCIsCW9uZSgwMTUwNjAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFkZHhsIiwJb25lKDAxNTA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQoteyJhbmRpYiIsCW9uZSgwMDAxMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImFuZGliIiwJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaXciLAlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpdyIsCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImFuZGlsIiwJb25lKDAwMDEyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaWwiLAlvbmUoMDAwMTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiYW5kaSIsCW9uZSgwMDAxMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFuZGkiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJhbmRpIiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLQotLyogVGhlIGFuZCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBhbmRpIGluc3RydWN0aW9uLiAgKi8KLXsiYW5kYiIsCW9uZSgwMDAxMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImFuZGIiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJhbmRiIiwJb25lKDAxNDAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsiYW5kYiIsCW9uZSgwMTQwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+YiIsIG02ODAwMHVwIH0sCi17ImFuZHciLAlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiYW5kdyIsCW9uZSgwMTQwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImFuZHciLAlvbmUoMDE0MDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnciLCBtNjgwMDB1cCB9LAoteyJhbmRsIiwJb25lKDAwMDEyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJhbmRsIiwJb25lKDAxNDAyMDApLAlvbmUoMDE3MDcwMCksICI7bERkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYW5kbCIsCW9uZSgwMTQwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR+bCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFuZCIsCQlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHciLCBtNjgwMDB1cCB9LAoteyJhbmQiLAkJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImFuZCIsCQlvbmUoMDE0MDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJhbmQiLAkJb25lKDAxNDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH53IiwgbTY4MDAwdXAgfSwKLQoteyJhc2xiIiwJb25lKDAxNjA0MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNsYiIsCW9uZSgwMTYwNDQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzbHciLAlvbmUoMDE2MDUwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJhc2x3IiwJb25lKDAxNjA1NDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNsdyIsCW9uZSgwMTYwNzAwKSwJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17ImFzbGwiLAlvbmUoMDE2MDYwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhc2xsIiwJb25lKDAxNjA2NDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJhc3JiIiwJb25lKDAxNjAwMDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNyYiIsCW9uZSgwMTYwMDQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzcnciLAlvbmUoMDE2MDEwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJhc3J3IiwJb25lKDAxNjAxNDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNydyIsCW9uZSgwMTYwMzAwKSwJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17ImFzcmwiLAlvbmUoMDE2MDIwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhc3JsIiwJb25lKDAxNjAyNDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJiaGl3IiwJb25lKDAwNjEwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJsc3ciLAlvbmUoMDA2MTQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmNjdyIsCW9uZSgwMDYyMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY3N3IiwJb25lKDAwNjI0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJuZXciLAlvbmUoMDA2MzAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmVxdyIsCW9uZSgwMDYzNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidmN3IiwJb25lKDAwNjQwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJ2c3ciLAlvbmUoMDA2NDQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnBsdyIsCW9uZSgwMDY1MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibWl3IiwJb25lKDAwNjU0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJnZXciLAlvbmUoMDA2NjAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmx0dyIsCW9uZSgwMDY2NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZ3R3IiwJb25lKDAwNjcwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJsZXciLAlvbmUoMDA2NzQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJiaGlsIiwJb25lKDAwNjEzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmxzbCIsCW9uZSgwMDYxNzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJjY2wiLAlvbmUoMDA2MjM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiY3NsIiwJb25lKDAwNjI3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYm5lbCIsCW9uZSgwMDYzMzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJlcWwiLAlvbmUoMDA2Mzc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJidmNsIiwJb25lKDAwNjQzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnZzbCIsCW9uZSgwMDY0Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJwbGwiLAlvbmUoMDA2NTM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJibWlsIiwJb25lKDAwNjU3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmdlbCIsCW9uZSgwMDY2Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJsdGwiLAlvbmUoMDA2Njc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiZ3RsIiwJb25lKDAwNjczNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmxlbCIsCW9uZSgwMDY3Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsiYmhpcyIsCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibHNzIiwJb25lKDAwNjE0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjY3MiLAlvbmUoMDA2MjAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmNzcyIsCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibmVzIiwJb25lKDAwNjMwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJlcXMiLAlvbmUoMDA2MzQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnZjcyIsCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidnNzIiwJb25lKDAwNjQ0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJwbHMiLAlvbmUoMDA2NTAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYm1pcyIsCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZ2VzIiwJb25lKDAwNjYwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJsdHMiLAlvbmUoMDA2NjQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmd0cyIsCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibGVzIiwJb25lKDAwNjc0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiamhpIiwJCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqbHMiLAkJb25lKDAwNjE0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpjYyIsCQlvbmUoMDA2MjAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamNzIiwJCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqbmUiLAkJb25lKDAwNjMwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImplcSIsCQlvbmUoMDA2MzQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsianZjIiwJCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqdnMiLAkJb25lKDAwNjQ0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpwbCIsCQlvbmUoMDA2NTAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiam1pIiwJCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqZ2UiLAkJb25lKDAwNjYwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpsdCIsCQlvbmUoMDA2NjQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamd0IiwJCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqbGUiLAkJb25lKDAwNjc0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYmNoZyIsCW9uZSgwMDAwNTAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjaGciLAlvbmUoMDAwNDEwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJiY2hnIiwJb25lKDAwMDQxMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmIH0sCi0KLXsiYmNsciIsCW9uZSgwMDAwNjAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImJjbHIiLAlvbmUoMDAwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkdnMiLCBtY2YgfSwKLXsiYmNsciIsCW9uZSgwMDA0MjAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImJjbHIiLAlvbmUoMDAwNDIwMCksCW9uZSgwMTc3NzAwKSwgIiNicXMiLCBtY2YgfSwKLQoteyJiZmNoZyIsCXR3bygwMTY1MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzAwMDApLAkiP3NPMk8zIiwgICBtNjgwMjB1cCB9LAoteyJiZmNsciIsCXR3bygwMTY2MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzAwMDApLAkiP3NPMk8zIiwgICBtNjgwMjB1cCB9LAoteyJiZmV4dHMiLAl0d28oMDE2NTcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIi9zTzJPM0QxIiwgbTY4MDIwdXAgfSwKLXsiYmZleHR1IiwJdHdvKDAxNjQ3MDAsIDApLCB0d28oMDE3NzcwMCwgMDEwMDAwMCksCSIvc08yTzNEMSIsIG02ODAyMHVwIH0sCi17ImJmZmZvIiwJdHdvKDAxNjY3MDAsIDApLCB0d28oMDE3NzcwMCwgMDEwMDAwMCksCSIvc08yTzNEMSIsIG02ODAyMHVwIH0sCi17ImJmaW5zIiwJdHdvKDAxNjc3MDAsIDApLCB0d28oMDE3NzcwMCwgMDEwMDAwMCksCSJEMT9zTzJPMyIsIG02ODAyMHVwIH0sCi17ImJmc2V0IiwJdHdvKDAxNjczMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3MDAwMCksCSI/c08yTzMiLCAgIG02ODAyMHVwIH0sCi17ImJmdHN0IiwJdHdvKDAxNjQzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3MDAwMCksCSIvc08yTzMiLCAgIG02ODAyMHVwIH0sCi0KLXsiYmduZCIsCW9uZSgwMDQ1MzcyKSwJCW9uZSgwMTc3Nzc3KSwgIiIsIGNwdTMyIH0sCi0KLXsiYmtwdCIsCW9uZSgwMDQ0MTEwKSwJCW9uZSgwMTc3NzcwKSwgInRzIiwgbTY4MDEwdXAgfSwKLQoteyJicmF3IiwJb25lKDAwNjAwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJyYWwiLAlvbmUoMDA2MDM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJicmFzIiwJb25lKDAwNjAwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYnNldCIsCW9uZSgwMDAwNzAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImJzZXQiLAlvbmUoMDAwMDcwMCksCW9uZSgwMTcwNzAwKSwgIkRkdnMiLCBtY2YgfSwKLXsiYnNldCIsCW9uZSgwMDA0MzAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImJzZXQiLAlvbmUoMDAwNDMwMCksCW9uZSgwMTc3NzAwKSwgIiNicXMiLCBtY2YgfSwKLQoteyJic3J3IiwJb25lKDAwNjA0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJzcmwiLAlvbmUoMDA2MDc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJic3JzIiwJb25lKDAwNjA0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYnRzdCIsCW9uZSgwMDAwNDAwKSwJb25lKDAxNzA3MDApLCAiRGQ7YiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJ0c3QiLAlvbmUoMDAwNDAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJidHN0IiwJb25lKDAwMDQwMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmIH0sCi0KLXsiY2FsbG0iLAlvbmUoMDAwMzMwMCksCQlvbmUoMDE3NzcwMCksICIjYiFzIiwgbTY4MDIwIH0sCi0KLXsiY2FzMnciLCAgICAgdHdvKDAwMDYzNzQsMCksIHR3bygwMTc3Nzc3LDAwMDcwNzApLCAiRDNENkQyRDVyMXI0IiwgbTY4MDIwdXAgfSwKLXsiY2FzMnciLCAgICAgdHdvKDAwMDYzNzQsMCksIHR3bygwMTc3Nzc3LDAwMDcwNzApLCAiRDNENkQyRDVSMVI0IiwgbTY4MDIwdXAgfSwKLXsiY2FzMmwiLCAgICAgdHdvKDAwMDczNzQsMCksIHR3bygwMTc3Nzc3LDAwMDcwNzApLCAiRDNENkQyRDVyMXI0IiwgbTY4MDIwdXAgfSwKLXsiY2FzMmwiLCAgICAgdHdvKDAwMDczNzQsMCksIHR3bygwMTc3Nzc3LDAwMDcwNzApLCAiRDNENkQyRDVSMVI0IiwgbTY4MDIwdXAgfSwKLQoteyJjYXNiIiwJdHdvKDAwMDUzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3NzA3MCksCSJEM0QyfnMiLCBtNjgwMjB1cCB9LAoteyJjYXN3IiwJdHdvKDAwMDYzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3NzA3MCksCSJEM0QyfnMiLCBtNjgwMjB1cCB9LAoteyJjYXNsIiwJdHdvKDAwMDczMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3NzA3MCksCSJEM0QyfnMiLCBtNjgwMjB1cCB9LAotCi17ImNoazJiIiwgdHdvKDAwMDAzMDAsMDAwNDAwMCksIHR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImNoazJ3IiwgdHdvKDAwMDEzMDAsMDAwNDAwMCksCXR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImNoazJsIiwgdHdvKDAwMDIzMDAsMDAwNDAwMCksCXR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsiY2hrbCIsCW9uZSgwMDQwNDAwKSwJCW9uZSgwMTcwNzAwKSwgIjtsRGQiLCBtNjgwMDB1cCB9LAoteyJjaGt3IiwJb25lKDAwNDA2MDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi0KLSNkZWZpbmUgU0NPUEVfTElORSAoMHgxIDw8IDMpCi0jZGVmaW5lIFNDT1BFX1BBR0UgKDB4MiA8PCAzKQotI2RlZmluZSBTQ09QRV9BTEwgICgweDMgPDwgMykKLQoteyJjaW52YSIsCW9uZSgweGY0MDB8U0NPUEVfQUxMKSwgIG9uZSgweGZmMzgpLCAiY2UiLCAgIG02ODA0MHVwIH0sCi17ImNpbnZsIiwJb25lKDB4ZjQwMHxTQ09QRV9MSU5FKSwgb25lKDB4ZmYzOCksICJjZWFzIiwgbTY4MDQwdXAgfSwKLXsiY2ludnAiLAlvbmUoMHhmNDAwfFNDT1BFX1BBR0UpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAotCi17ImNwdXNoYSIsCW9uZSgweGY0MjB8U0NPUEVfQUxMKSwgIG9uZSgweGZmMzgpLCAiY2UiLCAgIG02ODA0MHVwIH0sCi17ImNwdXNobCIsCW9uZSgweGY0MjB8U0NPUEVfTElORSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCi17ImNwdXNobCIsCW9uZSgweDA0ZTgpLAkJb25lKDB4ZmZmOCksICJhcyIsICAgbWNmIH0sCi17ImNwdXNocCIsCW9uZSgweGY0MjB8U0NPUEVfUEFHRSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCi0KLSN1bmRlZiBTQ09QRV9MSU5FCi0jdW5kZWYgU0NPUEVfUEFHRQotI3VuZGVmIFNDT1BFX0FMTAotCi17ImNscmIiLAlvbmUoMDA0MTAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiY2xydyIsCW9uZSgwMDQxMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJjbHJsIiwJb25lKDAwNDEyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiY21wMmIiLAl0d28oMDAwMDMwMCwwKSwgdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiY21wMnciLAl0d28oMDAwMTMwMCwwKSwJdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiY21wMmwiLAl0d28oMDAwMjMwMCwwKSwJdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLQoteyJjbXBhdyIsCW9uZSgwMTMwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17ImNtcGFsIiwJb25lKDAxMzA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJjbXBpYiIsCW9uZSgwMDA2MDAwKSwJb25lKDAxNzc3MDApLCAiI2JAcyIsIG02ODAwMHVwIH0sCi17ImNtcGl3IiwJb25lKDAwMDYxMDApLAlvbmUoMDE3NzcwMCksICIjd0BzIiwgbTY4MDAwdXAgfSwKLXsiY21waWwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBpbCIsCW9uZSgwMDA2MjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAotCi17ImNtcG1iIiwJb25lKDAxMzA0MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wbXciLAlvbmUoMDEzMDUxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoteyJjbXBtbCIsCW9uZSgwMTMwNjEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBjbXAgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgY21wYSwgY21wbSwgYW5kIGNtcGkgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsiY21wYiIsCW9uZSgwMDA2MDAwKSwJb25lKDAxNzc3MDApLCAiI2JAcyIsIG02ODAwMHVwIH0sCi17ImNtcGIiLAlvbmUoMDEzMDQxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoteyJjbXBiIiwJb25lKDAxMzAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsiY21wdyIsCW9uZSgwMTMwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDAwNjEwMCksCW9uZSgwMTc3NzAwKSwgIiN3QHMiLCBtNjgwMDB1cCB9LAoteyJjbXB3IiwJb25lKDAxMzA1MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wdyIsCW9uZSgwMTMwMTAwKSwJb25lKDAxNzA3MDApLCAiKndEZCIsIG02ODAwMHVwIH0sCi17ImNtcGwiLAlvbmUoMDEzMDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJjbXBsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbEBzIiwgbTY4MDAwdXAgfSwKLXsiY21wbCIsCW9uZSgwMDA2MjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJjbXBsIiwJb25lKDAxMzA2MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wbCIsCW9uZSgwMTMwMjAwKSwJb25lKDAxNzA3MDApLCAiKmxEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiZGJjYyIsCW9uZSgwMDUyMzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiY3MiLAlvbmUoMDA1MjcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmVxIiwJb25lKDAwNTM3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJmIiwJCW9uZSgwMDUwNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiZ2UiLAlvbmUoMDA1NjMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmd0IiwJb25lKDAwNTczMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJoaSIsCW9uZSgwMDUxMzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibGUiLAlvbmUoMDA1NzcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmxzIiwJb25lKDAwNTE3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJsdCIsCW9uZSgwMDU2NzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibWkiLAlvbmUoMDA1NTcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYm5lIiwJb25lKDAwNTMzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJwbCIsCW9uZSgwMDU1MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRidCIsCQlvbmUoMDA1MDMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYnZjIiwJb25lKDAwNTQzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJ2cyIsCW9uZSgwMDU0NzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi0KLXsiZGl2c3ciLAlvbmUoMDEwMDcwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLXsiZGl2c3ciLAlvbmUoMDEwMDcwMCksICAgb25lKDAxNzA3MDApLCAidnNEZCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17ImRpdnNsIiwgdHdvKDAwNDYxMDAsMDAwNjAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnNsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnNsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksInZzREQiLCAgIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17ImRpdnNsbCIsIHR3bygwMDQ2MTAwLDAwMDQwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEQzRDEiLG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnNsbCIsIHR3bygwMDQ2MTAwLDAwMDQwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEREIiwgIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsiZGl2dXciLAlvbmUoMDEwMDMwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLXsiZGl2dXciLAlvbmUoMDEwMDMwMCksCQlvbmUoMDE3MDcwMCksICJ2c0RkIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsiZGl2dWwiLCB0d28oMDA0NjEwMCwwMDAyMDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xEM0QxIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsiZGl2dWwiLCB0d28oMDA0NjEwMCwwMDAwMDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xERCIsICAgbTY4MDIwdXB8Y3B1MzIgfSwKLXsiZGl2dWwiLCB0d28oMDA0NjEwMCwwMDAwMDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwidnNERCIsICAgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsiZGl2dWxsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLXsiZGl2dWxsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJlb3JpYiIsCW9uZSgwMDA1MDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImVvcmliIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaXciLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3JpdyIsCW9uZSgwMDA1MTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImVvcmlsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaWwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiZW9yaSIsCW9uZSgwMDA1MDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImVvcmkiLAlvbmUoMDAwNTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpIiwJb25lKDAwMDUxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLQotLyogVGhlIGVvciBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBlb3JpIGluc3RydWN0aW9uLiAgKi8KLXsiZW9yYiIsCW9uZSgwMDA1MDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImVvcmIiLAlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJlb3JiIiwJb25lKDAxMzA0MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfSwKLXsiZW9ydyIsCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImVvcnciLAlvbmUoMDAwNTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJlb3J3IiwJb25lKDAxMzA1MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfSwKLXsiZW9ybCIsCW9uZSgwMDA1MjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImVvcmwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiZW9ybCIsCW9uZSgwMTMwNjAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImVvciIsCQlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJlb3IiLAkJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9yIiwJCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImVvciIsCQlvbmUoMDEzMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAotCi17ImV4ZyIsCQlvbmUoMDE0MDUwMCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJleGciLAkJb25lKDAxNDA1MTApLAlvbmUoMDE3MDc3MCksICJBZEFzIiwgbTY4MDAwdXAgfSwKLXsiZXhnIiwJCW9uZSgwMTQwNjEwKSwJb25lKDAxNzA3NzApLCAiRGRBcyIsIG02ODAwMHVwIH0sCi17ImV4ZyIsCQlvbmUoMDE0MDYxMCksCW9uZSgwMTcwNzcwKSwgIkFzRGQiLCBtNjgwMDB1cCB9LAotCi17ImV4dHciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzcwKSwgIkRzIiwgbTY4MDAwdXB8bWNmIH0sCi17ImV4dGwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzcwKSwgIkRzIiwgbTY4MDAwdXB8bWNmIH0sCi17ImV4dGJsIiwJb25lKDAwNDQ3MDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAyMHVwfGNwdTMyfG1jZiB9LAotCi0vKiBmbG9hdCBzdHVmZiBzdGFydHMgaGVyZSAqLwotCi17ImZhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYWJzZCIsCXR3bygweEYwMDAsIDB4NTQxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFic2wiLAl0d28oMHhGMDAwLCAweDQwMTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYWJzcyIsCXR3bygweEYwMDAsIDB4NDQxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFic3ciLAl0d28oMHhGMDAwLCAweDUwMTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYWJzeCIsCXR3bygweEYwMDAsIDB4NDgxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmFic3giLAl0d28oMHhGMDAwLCAweDAwMTgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzZCIsCXR3bygweEYwMDAsIDB4NTQ1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic2wiLAl0d28oMHhGMDAwLCAweDQwNTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzcyIsCXR3bygweEYwMDAsIDB4NDQ1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3ciLAl0d28oMHhGMDAwLCAweDUwNTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDU4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzeCIsCXR3bygweEYwMDAsIDB4NDg1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3giLAl0d28oMHhGMDAwLCAweDAwNTgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmZGFic2IiLAl0d28oMHhGMDAwLCAweDU4NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXB9LAoteyJmZGFic2QiLAl0d28oMHhGMDAwLCAweDU0NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXB9LAoteyJmZGFic2wiLAl0d28oMHhGMDAwLCAweDQwNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3AiLAl0d28oMHhGMDAwLCAweDRDNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3MiLAl0d28oMHhGMDAwLCAweDQ0NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3ciLAl0d28oMHhGMDAwLCAweDUwNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXB9LAoteyJmZGFic3giLAl0d28oMHhGMDAwLCAweDAwNWMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3giLAl0d28oMHhGMDAwLCAweDQ4NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3giLAl0d28oMHhGMDAwLCAweDAwNWMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXB9LAotCi17ImZhY29zYiIsCXR3bygweEYwMDAsIDB4NTgxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFjb3NkIiwJdHdvKDB4RjAwMCwgMHg1NDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYWNvc2wiLAl0d28oMHhGMDAwLCAweDQwMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhY29zcCIsCXR3bygweEYwMDAsIDB4NEMxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFjb3NzIiwJdHdvKDB4RjAwMCwgMHg0NDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3ciLAl0d28oMHhGMDAwLCAweDUwMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhY29zeCIsCXR3bygweEYwMDAsIDB4MDAxQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFjb3N4IiwJdHdvKDB4RjAwMCwgMHg0ODFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3giLAl0d28oMHhGMDAwLCAweDAwMUMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmFkZGIiLAl0d28oMHhGMDAwLCAweDU4MjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYWRkbCIsCXR3bygweEYwMDAsIDB4NDAyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmFkZHAiLAl0d28oMHhGMDAwLCAweDRDMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYWRkdyIsCXR3bygweEYwMDAsIDB4NTAyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmFkZHgiLAl0d28oMHhGMDAwLCAweDAwMjIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZzYWRkYiIsCXR3bygweEYwMDAsIDB4NTg2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZGQiLAl0d28oMHhGMDAwLCAweDU0NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRsIiwJdHdvKDB4RjAwMCwgMHg0MDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkcCIsCXR3bygweEYwMDAsIDB4NEM2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHMiLAl0d28oMHhGMDAwLCAweDQ0NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGR3IiwJdHdvKDB4RjAwMCwgMHg1MDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkeCIsCXR3bygweEYwMDAsIDB4MDA2MiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHgiLAl0d28oMHhGMDAwLCAweDQ4NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmZGFkZGIiLAl0d28oMHhGMDAwLCAweDU4NjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkbCIsCXR3bygweEYwMDAsIDB4NDA2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHAiLAl0d28oMHhGMDAwLCAweDRDNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkdyIsCXR3bygweEYwMDAsIDB4NTA2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHgiLAl0d28oMHhGMDAwLCAweDAwNjYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmFzaW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYXNpbmQiLAl0d28oMHhGMDAwLCAweDU0MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhc2lubCIsCXR3bygweEYwMDAsIDB4NDAwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYXNpbnMiLAl0d28oMHhGMDAwLCAweDQ0MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhc2ludyIsCXR3bygweEYwMDAsIDB4NTAwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmFzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBDKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYXNpbngiLAl0d28oMHhGMDAwLCAweDQ4MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhc2lueCIsCXR3bygweEYwMDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmYXRhbmIiLAl0d28oMHhGMDAwLCAweDU4MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhdGFuZCIsCXR3bygweEYwMDAsIDB4NTQwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYXRhbnAiLAl0d28oMHhGMDAwLCAweDRDMEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhdGFucyIsCXR3bygweEYwMDAsIDB4NDQwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmF0YW53IiwJdHdvKDB4RjAwMCwgMHg1MDBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYXRhbngiLAl0d28oMHhGMDAwLCAweDAwMEEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhdGFueCIsCXR3bygweEYwMDAsIDB4NDgwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmF0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZhdGFuaGIiLAl0d28oMHhGMDAwLCAweDU4MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaGQiLAl0d28oMHhGMDAwLCAweDU0MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaGwiLAl0d28oMHhGMDAwLCAweDQwMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHAiLAl0d28oMHhGMDAwLCAweDRDMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHMiLAl0d28oMHhGMDAwLCAweDQ0MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHciLAl0d28oMHhGMDAwLCAweDUwMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDQ4MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmJlcSIsCW9uZSgweEYwODEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZiIsCQlvbmUoMHhGMDgwKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmdlIiwJb25lKDB4RjA5MyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJnbCIsCW9uZSgweEYwOTYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ2xlIiwJb25lKDB4RjA5NyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJndCIsCW9uZSgweEYwOTIpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibGUiLAlvbmUoMHhGMDk1KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmx0IiwJb25lKDB4RjA5NCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZSIsCW9uZSgweEYwOEUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmdlIiwJb25lKDB4RjA5QyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ2wiLAlvbmUoMHhGMDk5KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5nbGUiLAlvbmUoMHhGMDk4KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5ndCIsCW9uZSgweEYwOUQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmxlIiwJb25lKDB4RjA5QSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJubHQiLAlvbmUoMHhGMDlCKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9nZSIsCW9uZSgweEYwODMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2dsIiwJb25lKDB4RjA4NiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvZ3QiLAlvbmUoMHhGMDgyKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9sZSIsCW9uZSgweEYwODUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2x0IiwJb25lKDB4RjA4NCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvciIsCW9uZSgweEYwODcpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic2VxIiwJb25lKDB4RjA5MSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJzZiIsCW9uZSgweEYwOTApLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic25lIiwJb25lKDB4RjA5RSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJzdCIsCW9uZSgweEYwOUYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidCIsCQlvbmUoMHhGMDhGKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVlcSIsCW9uZSgweEYwODkpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWdlIiwJb25lKDB4RjA4QiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1Z3QiLAlvbmUoMHhGMDhBKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVsZSIsCW9uZSgweEYwOEQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWx0IiwJb25lKDB4RjA4QyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1biIsCW9uZSgweEYwODgpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi0KLXsiZmJlcWwiLAlvbmUoMHhGMEMxKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmZsIiwJb25lKDB4RjBDMCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJnZWwiLAlvbmUoMHhGMEQzKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmdsbCIsCW9uZSgweEYwRDYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZ2xlbCIsCW9uZSgweEYwRDcpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZ3RsIiwJb25lKDB4RjBEMiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJsZWwiLAlvbmUoMHhGMEQ1KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmx0bCIsCW9uZSgweEYwRDQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmVsIiwJb25lKDB4RjBDRSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJuZ2VsIiwJb25lKDB4RjBEQyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJuZ2xsIiwJb25lKDB4RjBEOSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJuZ2xlbCIsCW9uZSgweEYwRDgpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmd0bCIsCW9uZSgweEYwREQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmxlbCIsCW9uZSgweEYwREEpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmx0bCIsCW9uZSgweEYwREIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2dlbCIsCW9uZSgweEYwQzMpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2dsbCIsCW9uZSgweEYwQzYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2d0bCIsCW9uZSgweEYwQzIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2xlbCIsCW9uZSgweEYwQzUpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2x0bCIsCW9uZSgweEYwQzQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib3JsIiwJb25lKDB4RjBDNyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzZXFsIiwJb25lKDB4RjBEMSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzZmwiLAlvbmUoMHhGMEQwKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnNuZWwiLAlvbmUoMHhGMERFKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnN0bCIsCW9uZSgweEYwREYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZidGwiLAlvbmUoMHhGMENGKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVlcWwiLAlvbmUoMHhGMEM5KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVnZWwiLAlvbmUoMHhGMENCKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVndGwiLAlvbmUoMHhGMENBKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVsZWwiLAlvbmUoMHhGMENEKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVsdGwiLAlvbmUoMHhGMENDKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVubCIsCW9uZSgweEYwQzgpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi0KLXsiZmplcSIsCW9uZSgweEYwODEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZiIsCQlvbmUoMHhGMDgwKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamdlIiwJb25lKDB4RjA5MyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpnbCIsCW9uZSgweEYwOTYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ2xlIiwJb25lKDB4RjA5NyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpndCIsCW9uZSgweEYwOTIpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbGUiLAlvbmUoMHhGMDk1KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamx0IiwJb25lKDB4RjA5NCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZSIsCW9uZSgweEYwOEUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmdlIiwJb25lKDB4RjA5QyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ2wiLAlvbmUoMHhGMDk5KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5nbGUiLAlvbmUoMHhGMDk4KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5ndCIsCW9uZSgweEYwOUQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmxlIiwJb25lKDB4RjA5QSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpubHQiLAlvbmUoMHhGMDlCKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9nZSIsCW9uZSgweEYwODMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2dsIiwJb25lKDB4RjA4NiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvZ3QiLAlvbmUoMHhGMDgyKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9sZSIsCW9uZSgweEYwODUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2x0IiwJb25lKDB4RjA4NCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvciIsCW9uZSgweEYwODcpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc2VxIiwJb25lKDB4RjA5MSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpzZiIsCW9uZSgweEYwOTApLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc25lIiwJb25lKDB4RjA5RSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpzdCIsCW9uZSgweEYwOUYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdCIsCQlvbmUoMHhGMDhGKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVlcSIsCW9uZSgweEYwODkpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWdlIiwJb25lKDB4RjA4QiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1Z3QiLAlvbmUoMHhGMDhBKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVsZSIsCW9uZSgweEYwOEQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWx0IiwJb25lKDB4RjA4QyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1biIsCW9uZSgweEYwODgpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi0KLXsiZmNtcGIiLAl0d28oMHhGMDAwLCAweDU4MzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZjbXBkIiwJdHdvKDB4RjAwMCwgMHg1NDM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmY21wbCIsCXR3bygweEYwMDAsIDB4NDAzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmNtcHAiLAl0d28oMHhGMDAwLCAweDRDMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZjbXBzIiwJdHdvKDB4RjAwMCwgMHg0NDM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmY21wdyIsCXR3bygweEYwMDAsIDB4NTAzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmNtcHgiLAl0d28oMHhGMDAwLCAweDAwMzgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZjbXB4IiwJdHdvKDB4RjAwMCwgMHg0ODM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZjb3NiIiwJdHdvKDB4RjAwMCwgMHg1ODFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmY29zZCIsCXR3bygweEYwMDAsIDB4NTQxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmNvc2wiLAl0d28oMHhGMDAwLCAweDQwMUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZjb3NwIiwJdHdvKDB4RjAwMCwgMHg0QzFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmY29zcyIsCXR3bygweEYwMDAsIDB4NDQxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmNvc3ciLAl0d28oMHhGMDAwLCAweDUwMUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmY29zeCIsCXR3bygweEYwMDAsIDB4NDgxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmNvc3giLAl0d28oMHhGMDAwLCAweDAwMUQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmNvc2hiIiwJdHdvKDB4RjAwMCwgMHg1ODE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmY29zaGQiLAl0d28oMHhGMDAwLCAweDU0MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZjb3NobCIsCXR3bygweEYwMDAsIDB4NDAxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hwIiwJdHdvKDB4RjAwMCwgMHg0QzE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmY29zaHMiLAl0d28oMHhGMDAwLCAweDQ0MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZjb3NodyIsCXR3bygweEYwMDAsIDB4NTAxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmNvc2h4IiwJdHdvKDB4RjAwMCwgMHgwMDE5KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmY29zaHgiLAl0d28oMHhGMDAwLCAweDQ4MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZjb3NoeCIsCXR3bygweEYwMDAsIDB4MDAxOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmZGJlcSIsCXR3bygweEYwNDgsIDB4MDAwMSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZiIsCXR3bygweEYwNDgsIDB4MDAwMCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZ2UiLAl0d28oMHhGMDQ4LCAweDAwMTMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmdsIiwJdHdvKDB4RjA0OCwgMHgwMDE2KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJnbGUiLAl0d28oMHhGMDQ4LCAweDAwMTcpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmd0IiwJdHdvKDB4RjA0OCwgMHgwMDEyKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJsZSIsCXR3bygweEYwNDgsIDB4MDAxNSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibHQiLAl0d28oMHhGMDQ4LCAweDAwMTQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5lIiwJdHdvKDB4RjA0OCwgMHgwMDBFKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZ2UiLAl0d28oMHhGMDQ4LCAweDAwMUMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5nbCIsCXR3bygweEYwNDgsIDB4MDAxOSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmdsZSIsCXR3bygweEYwNDgsIDB4MDAxOCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmd0IiwJdHdvKDB4RjA0OCwgMHgwMDFEKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJubGUiLAl0d28oMHhGMDQ4LCAweDAwMUEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5sdCIsCXR3bygweEYwNDgsIDB4MDAxQiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2dlIiwJdHdvKDB4RjA0OCwgMHgwMDAzKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvZ2wiLAl0d28oMHhGMDQ4LCAweDAwMDYpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9ndCIsCXR3bygweEYwNDgsIDB4MDAwMiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2xlIiwJdHdvKDB4RjA0OCwgMHgwMDA1KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvbHQiLAl0d28oMHhGMDQ4LCAweDAwMDQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9yIiwJdHdvKDB4RjA0OCwgMHgwMDA3KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzZXEiLAl0d28oMHhGMDQ4LCAweDAwMTEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnNmIiwJdHdvKDB4RjA0OCwgMHgwMDEwKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzbmUiLAl0d28oMHhGMDQ4LCAweDAwMUUpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnN0IiwJdHdvKDB4RjA0OCwgMHgwMDFGKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ0IiwJdHdvKDB4RjA0OCwgMHgwMDBGKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1ZXEiLAl0d28oMHhGMDQ4LCAweDAwMDkpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVnZSIsCXR3bygweEYwNDgsIDB4MDAwQiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWd0IiwJdHdvKDB4RjA0OCwgMHgwMDBBKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1bGUiLAl0d28oMHhGMDQ4LCAweDAwMEQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVsdCIsCXR3bygweEYwNDgsIDB4MDAwQyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidW4iLAl0d28oMHhGMDQ4LCAweDAwMDgpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi0KLXsiZmRpdmIiLAl0d28oMHhGMDAwLCAweDU4MjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZGl2bCIsCXR3bygweEYwMDAsIDB4NDAyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmRpdnAiLAl0d28oMHhGMDAwLCAweDRDMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZGl2dyIsCXR3bygweEYwMDAsIDB4NTAyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmRpdngiLAl0d28oMHhGMDAwLCAweDAwMjApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZzZGl2YiIsCXR3bygweEYwMDAsIDB4NTg2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdmQiLAl0d28oMHhGMDAwLCAweDU0NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZsIiwJdHdvKDB4RjAwMCwgMHg0MDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2cCIsCXR3bygweEYwMDAsIDB4NEM2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdnMiLAl0d28oMHhGMDAwLCAweDQ0NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZ3IiwJdHdvKDB4RjAwMCwgMHg1MDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2eCIsCXR3bygweEYwMDAsIDB4MDA2MCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdngiLAl0d28oMHhGMDAwLCAweDQ4NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmZGRpdmIiLAl0d28oMHhGMDAwLCAweDU4NjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2bCIsCXR3bygweEYwMDAsIDB4NDA2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdnAiLAl0d28oMHhGMDAwLCAweDRDNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2dyIsCXR3bygweEYwMDAsIDB4NTA2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdngiLAl0d28oMHhGMDAwLCAweDAwNjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmV0b3hiIiwJdHdvKDB4RjAwMCwgMHg1ODEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZXRveGQiLAl0d28oMHhGMDAwLCAweDU0MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZldG94bCIsCXR3bygweEYwMDAsIDB4NDAxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hwIiwJdHdvKDB4RjAwMCwgMHg0QzEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZXRveHMiLAl0d28oMHhGMDAwLCAweDQ0MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZldG94dyIsCXR3bygweEYwMDAsIDB4NTAxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmV0b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDEwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZXRveHgiLAl0d28oMHhGMDAwLCAweDQ4MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZldG94eCIsCXR3bygweEYwMDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmZXRveG0xYiIsCXR3bygweEYwMDAsIDB4NTgwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMWQiLAl0d28oMHhGMDAwLCAweDU0MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFsIiwJdHdvKDB4RjAwMCwgMHg0MDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xcCIsCXR3bygweEYwMDAsIDB4NEMwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXMiLAl0d28oMHhGMDAwLCAweDQ0MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZldG94bTF3IiwJdHdvKDB4RjAwMCwgMHg1MDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xeCIsCXR3bygweEYwMDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXgiLAl0d28oMHhGMDAwLCAweDQ4MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTF4IiwJdHdvKDB4RjAwMCwgMHgwMDA4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZnZXRleHBiIiwJdHdvKDB4RjAwMCwgMHg1ODFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwZCIsCXR3bygweEYwMDAsIDB4NTQxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cGwiLAl0d28oMHhGMDAwLCAweDQwMUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHBwIiwJdHdvKDB4RjAwMCwgMHg0QzFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwcyIsCXR3bygweEYwMDAsIDB4NDQxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHciLAl0d28oMHhGMDAwLCAweDUwMUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB4IiwJdHdvKDB4RjAwMCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhweCIsCXR3bygweEYwMDAsIDB4NDgxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHgiLAl0d28oMHhGMDAwLCAweDAwMUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmdldG1hbmIiLAl0d28oMHhGMDAwLCAweDU4MUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW5kIiwJdHdvKDB4RjAwMCwgMHg1NDFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFubCIsCXR3bygweEYwMDAsIDB4NDAxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbnAiLAl0d28oMHhGMDAwLCAweDRDMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW5zIiwJdHdvKDB4RjAwMCwgMHg0NDFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFudyIsCXR3bygweEYwMDAsIDB4NTAxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbngiLAl0d28oMHhGMDAwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW54IiwJdHdvKDB4RjAwMCwgMHg0ODFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFueCIsCXR3bygweEYwMDAsIDB4MDAxRiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmaW50YiIsCXR3bygweEYwMDAsIDB4NTgwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmludGQiLAl0d28oMHhGMDAwLCAweDU0MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZpbnRsIiwJdHdvKDB4RjAwMCwgMHg0MDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmaW50cCIsCXR3bygweEYwMDAsIDB4NEMwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmludHMiLAl0d28oMHhGMDAwLCAweDQ0MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZpbnR3IiwJdHdvKDB4RjAwMCwgMHg1MDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmaW50eCIsCXR3bygweEYwMDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmludHgiLAl0d28oMHhGMDAwLCAweDQ4MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZpbnR4IiwJdHdvKDB4RjAwMCwgMHgwMDAxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZpbnRyemIiLAl0d28oMHhGMDAwLCAweDU4MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZpbnRyemQiLAl0d28oMHhGMDAwLCAweDU0MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZpbnRyemwiLAl0d28oMHhGMDAwLCAweDQwMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZpbnRyenAiLAl0d28oMHhGMDAwLCAweDRDMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZpbnRyenMiLAl0d28oMHhGMDAwLCAweDQ0MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZpbnRyenciLAl0d28oMHhGMDAwLCAweDUwMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDQ4MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmxvZzEwYiIsCXR3bygweEYwMDAsIDB4NTgxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwZCIsCXR3bygweEYwMDAsIDB4NTQxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwbCIsCXR3bygweEYwMDAsIDB4NDAxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwcCIsCXR3bygweEYwMDAsIDB4NEMxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwcyIsCXR3bygweEYwMDAsIDB4NDQxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwdyIsCXR3bygweEYwMDAsIDB4NTAxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmxvZzEweCIsCXR3bygweEYwMDAsIDB4MDAxNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmxvZzEweCIsCXR3bygweEYwMDAsIDB4NDgxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZzEweCIsCXR3bygweEYwMDAsIDB4MDAxNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbG9nMmIiLAl0d28oMHhGMDAwLCAweDU4MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2cyZCIsCXR3bygweEYwMDAsIDB4NTQxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJsIiwJdHdvKDB4RjAwMCwgMHg0MDE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbG9nMnAiLAl0d28oMHhGMDAwLCAweDRDMTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2cycyIsCXR3bygweEYwMDAsIDB4NDQxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJ3IiwJdHdvKDB4RjAwMCwgMHg1MDE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbG9nMngiLAl0d28oMHhGMDAwLCAweDAwMTYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2cyeCIsCXR3bygweEYwMDAsIDB4NDgxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZzJ4IiwJdHdvKDB4RjAwMCwgMHgwMDE2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2duYiIsCXR3bygweEYwMDAsIDB4NTgxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25kIiwJdHdvKDB4RjAwMCwgMHg1NDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nbmwiLAl0d28oMHhGMDAwLCAweDQwMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducCIsCXR3bygweEYwMDAsIDB4NEMxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25zIiwJdHdvKDB4RjAwMCwgMHg0NDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnciLAl0d28oMHhGMDAwLCAweDUwMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2dueCIsCXR3bygweEYwMDAsIDB4MDAxNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ254IiwJdHdvKDB4RjAwMCwgMHg0ODE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbG9nbngiLAl0d28oMHhGMDAwLCAweDAwMTQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmxvZ25wMWIiLAl0d28oMHhGMDAwLCAweDU4MDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDFkIiwJdHdvKDB4RjAwMCwgMHg1NDA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxbCIsCXR3bygweEYwMDAsIDB4NDAwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXAiLAl0d28oMHhGMDAwLCAweDRDMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDFzIiwJdHdvKDB4RjAwMCwgMHg0NDA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxdyIsCXR3bygweEYwMDAsIDB4NTAwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXgiLAl0d28oMHhGMDAwLCAweDAwMDYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDF4IiwJdHdvKDB4RjAwMCwgMHg0ODA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxeCIsCXR3bygweEYwMDAsIDB4MDAwNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbW9kYiIsCXR3bygweEYwMDAsIDB4NTgyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm1vZGQiLAl0d28oMHhGMDAwLCAweDU0MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZtb2RsIiwJdHdvKDB4RjAwMCwgMHg0MDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbW9kcCIsCXR3bygweEYwMDAsIDB4NEMyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm1vZHMiLAl0d28oMHhGMDAwLCAweDQ0MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZtb2R3IiwJdHdvKDB4RjAwMCwgMHg1MDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbW9keCIsCXR3bygweEYwMDAsIDB4MDAyMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm1vZHgiLAl0d28oMHhGMDAwLCAweDQ4MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZm1vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbW92ZWIiLAl0d28oMHhGMDAwLCAweDc4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyRiIiwgbWZsb2F0IH0sCi17ImZtb3ZlZCIsCXR3bygweEYwMDAsIDB4NTQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZm1vdmVkIiwJdHdvKDB4RjAwMCwgMHg3NDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjd+RiIsIG1mbG9hdCB9LAoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlbCIsCXR3bygweEYwMDAsIDB4NjAwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JGwiLCBtZmxvYXQgfSwKLS8qIEZJWE1FOiB0aGUgbmV4dCB0d28gdmFyaWFudHMgc2hvdWxkIG5vdCBwZXJtaXQgbW92aW5nIGFuIGFkZHJlc3MKLSAgIHJlZ2lzdGVyIHRvIGFueXRoaW5nIGJ1dCB0aGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIuICAqLwoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlzOCVzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbCIsCXR3bygweEYwMDAsIDB4ODAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaSpsczgiLCBtZmxvYXQgfSwKLXsiZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXAiLAl0d28oMHhGMDAwLCAweDZDMDApLCB0d28oMHhGMUMwLCAweEZDMDApLCAiSWlGN35wa0MiLCBtZmxvYXQgfSwKLXsiZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg3QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzBGKSwgIklpRjd+cERrIiwgbWZsb2F0IH0sCi17ImZtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZm1vdmVzIiwJdHdvKDB4RjAwMCwgMHg2NDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjckZiIsIG1mbG9hdCB9LAoteyJmbW92ZXciLAl0d28oMHhGMDAwLCAweDUwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZtb3ZldyIsCXR3bygweEYwMDAsIDB4NzAwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JHciLCBtZmxvYXQgfSwKLXsiZm1vdmV4IiwJdHdvKDB4RjAwMCwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXgiLAl0d28oMHhGMDAwLCAweDQ4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZtb3ZleCIsCXR3bygweEYwMDAsIDB4NjgwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3fngiLCBtZmxvYXQgfSwKLQoteyJmc21vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0NDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZlbCIsCXR3bygweEYwMDAsIDB4NDA0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVzIiwJdHdvKDB4RjAwMCwgMHg0NDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXciLAl0d28oMHhGMDAwLCAweDUwNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZleCIsCXR3bygweEYwMDAsIDB4MDA0MCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXAiLAl0d28oMHhGMDAwLCAweDRDNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmZG1vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0NDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZlbCIsCXR3bygweEYwMDAsIDB4NDA0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVzIiwJdHdvKDB4RjAwMCwgMHg0NDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXciLAl0d28oMHhGMDAwLCAweDUwNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZleCIsCXR3bygweEYwMDAsIDB4MDA0NCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXAiLAl0d28oMHhGMDAwLCAweDRDNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmbW92ZWNyeCIsCXR3bygweEYwMDAsIDB4NUMwMCksIHR3bygweEYxRkYsIDB4RkMwMCksICJJaSNDRjciLCBtZmxvYXQgfSwKLQoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpRGsmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpRGstcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpJnNEayIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpK3NEayIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkbDMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkIzMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnNsMyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnMjMyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkTDMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkIzMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkK3NsMyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkK3MjMyIsIG1mbG9hdCB9LAotCi17ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlzOCVzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlMOH5zIiwgbWZsb2F0IH0sCi0vKiBGSVhNRTogSW4gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHdlIHNob3VsZCBvbmx5IHBlcm1pdCAlZG4gaWYgdGhlCi0gICB0YXJnZXQgaXMgYSBzaW5nbGUgcmVnaXN0ZXIuICBXZSBzaG91bGQgb25seSBwZXJtaXQgJWFuIGlmIHRoZQotICAgdGFyZ2V0IGlzIGEgc2luZ2xlICVmcGlhci4gICovCi17ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqbEw4IiwgbWZsb2F0IH0sCi0KLXsiZm1vdmVtIiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkTDMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEYwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWRsMyZzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnNsMyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDIwLCAweEUwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQjMy1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMjAsIDB4RTgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaURrLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkIzMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEY4MDApLCB0d28oMHhGMUMwLCAweEZGOEYpLCAiSWlEayZzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzIzMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAxOCwgMHhEODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpK3NEayIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEQwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWQmcyMzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RDgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaSZzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqc3M4IiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaUw4fnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjJDMCwgMHhFM0ZGKSwgIklpKnNMOCIsIG1mbG9hdCB9LAotCi17ImZtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbXVsZCIsCXR3bygweEYwMDAsIDB4NTQyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZm11bGwiLAl0d28oMHhGMDAwLCAweDQwMjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbXVscyIsCXR3bygweEYwMDAsIDB4NDQyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZm11bHciLAl0d28oMHhGMDAwLCAweDUwMjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDIzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbXVseCIsCXR3bygweEYwMDAsIDB4NDgyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmc211bGIiLAl0d28oMHhGMDAwLCAweDU4NjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWxkIiwJdHdvKDB4RjAwMCwgMHg1NDYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVsbCIsCXR3bygweEYwMDAsIDB4NDA2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc211bHAiLAl0d28oMHhGMDAwLCAweDRDNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWxzIiwJdHdvKDB4RjAwMCwgMHg0NDYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVsdyIsCXR3bygweEYwMDAsIDB4NTA2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc211bHgiLAl0d28oMHhGMDAwLCAweDAwNjMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWx4IiwJdHdvKDB4RjAwMCwgMHg0ODYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVsZCIsCXR3bygweEYwMDAsIDB4NTQ2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bGwiLAl0d28oMHhGMDAwLCAweDQwNjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVscyIsCXR3bygweEYwMDAsIDB4NDQ2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHciLAl0d28oMHhGMDAwLCAweDUwNjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDY3KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVseCIsCXR3bygweEYwMDAsIDB4NDg2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbmVnZCIsCXR3bygweEYwMDAsIDB4NTQxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZm5lZ2wiLAl0d28oMHhGMDAwLCAweDQwMUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbmVncyIsCXR3bygweEYwMDAsIDB4NDQxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZm5lZ3ciLAl0d28oMHhGMDAwLCAweDUwMUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbmVneCIsCXR3bygweEYwMDAsIDB4NDgxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZm5lZ3giLAl0d28oMHhGMDAwLCAweDAwMUEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVnZCIsCXR3bygweEYwMDAsIDB4NTQ1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ2wiLAl0d28oMHhGMDAwLCAweDQwNUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVncyIsCXR3bygweEYwMDAsIDB4NDQ1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3ciLAl0d28oMHhGMDAwLCAweDUwNUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVneCIsCXR3bygweEYwMDAsIDB4NDg1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3giLAl0d28oMHhGMDAwLCAweDAwNUEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmZG5lZ2IiLAl0d28oMHhGMDAwLCAweDU4NUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWdkIiwJdHdvKDB4RjAwMCwgMHg1NDVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVnbCIsCXR3bygweEYwMDAsIDB4NDA1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3AiLAl0d28oMHhGMDAwLCAweDRDNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWdzIiwJdHdvKDB4RjAwMCwgMHg0NDVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVndyIsCXR3bygweEYwMDAsIDB4NTA1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3giLAl0d28oMHhGMDAwLCAweDAwNUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWd4IiwJdHdvKDB4RjAwMCwgMHg0ODVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVneCIsCXR3bygweEYwMDAsIDB4MDA1RSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZub3AiLAl0d28oMHhGMjgwLCAweDAwMDApLCB0d28oMHhGRkZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLQoteyJmcmVtYiIsCXR3bygweEYwMDAsIDB4NTgyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnJlbWQiLAl0d28oMHhGMDAwLCAweDU0MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZyZW1sIiwJdHdvKDB4RjAwMCwgMHg0MDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmcmVtcCIsCXR3bygweEYwMDAsIDB4NEMyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnJlbXMiLAl0d28oMHhGMDAwLCAweDQ0MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZyZW13IiwJdHdvKDB4RjAwMCwgMHg1MDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmcmVteCIsCXR3bygweEYwMDAsIDB4MDAyNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnJlbXgiLAl0d28oMHhGMDAwLCAweDQ4MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZnJlc3RvcmUiLAlvbmUoMHhGMTQwKSwJCW9uZSgweEYxQzApLCAiSWQ8cyIsIG1mbG9hdCB9LAotCi17ImZzYXZlIiwJb25lKDB4RjEwMCksCQlvbmUoMHhGMUMwKSwgIklkPnMiLCBtZmxvYXQgfSwKLQoteyJmc2NhbGViIiwJdHdvKDB4RjAwMCwgMHg1ODI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGVkIiwJdHdvKDB4RjAwMCwgMHg1NDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGVsIiwJdHdvKDB4RjAwMCwgMHg0MDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGVwIiwJdHdvKDB4RjAwMCwgMHg0QzI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGVzIiwJdHdvKDB4RjAwMCwgMHg0NDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGV3IiwJdHdvKDB4RjAwMCwgMHg1MDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGV4IiwJdHdvKDB4RjAwMCwgMHgwMDI2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGV4IiwJdHdvKDB4RjAwMCwgMHg0ODI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi0vKiAkIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IHRoZSBhc3NlbWJsZXIgZnJvbSB1c2luZyBQQy1yZWxhdGl2ZS4KLSAgIElmIEAgd2VyZSB1c2VkLCAibGFiZWw6IGZzZXEgbGFiZWwiIGNvdWxkIHByb2R1Y2UgImZ0cmFwZXEiLAotICAgYmVjYXVzZSAibGFiZWwiIGJlY2FtZSAicGNAbGFiZWwiLiAgKi8KLXsiZnNlcSIsCXR3bygweEYwNDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZiIsCQl0d28oMHhGMDQwLCAweDAwMDApLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2dlIiwJdHdvKDB4RjA0MCwgMHgwMDEzKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNnbCIsCXR3bygweEYwNDAsIDB4MDAxNiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE3KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNndCIsCXR3bygweEYwNDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbGUiLAl0d28oMHhGMDQwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2x0IiwJdHdvKDB4RjA0MCwgMHgwMDE0KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZSIsCXR3bygweEYwNDAsIDB4MDAwRSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmdlIiwJdHdvKDB4RjA0MCwgMHgwMDFDKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ2wiLAl0d28oMHhGMDQwLCAweDAwMTkpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25nbGUiLAl0d28oMHhGMDQwLCAweDAwMTgpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25ndCIsCXR3bygweEYwNDAsIDB4MDAxRCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmxlIiwJdHdvKDB4RjA0MCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNubHQiLAl0d28oMHhGMDQwLCAweDAwMUIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29nZSIsCXR3bygweEYwNDAsIDB4MDAwMyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2dsIiwJdHdvKDB4RjA0MCwgMHgwMDA2KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvZ3QiLAl0d28oMHhGMDQwLCAweDAwMDIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29sZSIsCXR3bygweEYwNDAsIDB4MDAwNSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2x0IiwJdHdvKDB4RjA0MCwgMHgwMDA0KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvciIsCXR3bygweEYwNDAsIDB4MDAwNyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc2VxIiwJdHdvKDB4RjA0MCwgMHgwMDExKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNzZiIsCXR3bygweEYwNDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc25lIiwJdHdvKDB4RjA0MCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNzdCIsCXR3bygweEYwNDAsIDB4MDAxRiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdCIsCQl0d28oMHhGMDQwLCAweDAwMEYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VlcSIsCXR3bygweEYwNDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWdlIiwJdHdvKDB4RjA0MCwgMHgwMDBCKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1Z3QiLAl0d28oMHhGMDQwLCAweDAwMEEpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VsZSIsCXR3bygweEYwNDAsIDB4MDAwRCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWx0IiwJdHdvKDB4RjA0MCwgMHgwMDBDKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1biIsCXR3bygweEYwNDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi0KLXsiZnNnbGRpdmIiLAl0d28oMHhGMDAwLCAweDU4MjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2bCIsCXR3bygweEYwMDAsIDB4NDAyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdnAiLAl0d28oMHhGMDAwLCAweDRDMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2dyIsCXR3bygweEYwMDAsIDB4NTAyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdngiLAl0d28oMHhGMDAwLCAweDAwMjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2eCIsCXR3bygweEYwMDAsIDB4MDAyNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc2dsbXVsYiIsCXR3bygweEYwMDAsIDB4NTgyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bGQiLAl0d28oMHhGMDAwLCAweDU0MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVscCIsCXR3bygweEYwMDAsIDB4NEMyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHMiLAl0d28oMHhGMDAwLCAweDQ0MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVseCIsCXR3bygweEYwMDAsIDB4MDAyNyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHgiLAl0d28oMHhGMDAwLCAweDQ4MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDI3KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzaW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2luZCIsCXR3bygweEYwMDAsIDB4NTQwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNpbmwiLAl0d28oMHhGMDAwLCAweDQwMEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzaW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2lucyIsCXR3bygweEYwMDAsIDB4NDQwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNpbnciLAl0d28oMHhGMDAwLCAweDUwMEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2lueCIsCXR3bygweEYwMDAsIDB4NDgwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNpbngiLAl0d28oMHhGMDAwLCAweDAwMEUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNpbmNvc2IiLAl0d28oMHhGMDAwLCAweDU4MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7YkYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc2QiLAl0d28oMHhGMDAwLCAweDU0MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7RkYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc2wiLAl0d28oMHhGMDAwLCAweDQwMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7bEYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3AiLAl0d28oMHhGMDAwLCAweDRDMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7cEYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3MiLAl0d28oMHhGMDAwLCAweDQ0MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7ZkYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3ciLAl0d28oMHhGMDAwLCAweDUwMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7d0YzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3giLAl0d28oMHhGMDAwLCAweDAwMzApLCB0d28oMHhGMUMwLCAweEUwNzgpLCAiSWlGOEYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3giLAl0d28oMHhGMDAwLCAweDQ4MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7eEYzRjciLCBtZmxvYXQgfSwKLQoteyJmc2luaGIiLAl0d28oMHhGMDAwLCAweDU4MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzaW5oZCIsCXR3bygweEYwMDAsIDB4NTQwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNpbmhsIiwJdHdvKDB4RjAwMCwgMHg0MDAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2luaHAiLAl0d28oMHhGMDAwLCAweDRDMDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzaW5ocyIsCXR3bygweEYwMDAsIDB4NDQwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNpbmh3IiwJdHdvKDB4RjAwMCwgMHg1MDAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2luaHgiLAl0d28oMHhGMDAwLCAweDAwMDIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzaW5oeCIsCXR3bygweEYwMDAsIDB4NDgwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNpbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTgwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc3FydGwiLAl0d28oMHhGMDAwLCAweDQwMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEMwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc3FydHciLAl0d28oMHhGMDAwLCAweDUwMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDAwNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc3FydHgiLAl0d28oMHhGMDAwLCAweDAwMDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTg0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydGwiLAl0d28oMHhGMDAwLCAweDQwNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEM0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHciLAl0d28oMHhGMDAwLCAweDUwNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0MSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmZHNxcnRiIiwJdHdvKDB4RjAwMCwgMHg1ODQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydGQiLAl0d28oMHhGMDAwLCAweDU0NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0bCIsCXR3bygweEYwMDAsIDB4NDA0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRwIiwJdHdvKDB4RjAwMCwgMHg0QzQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHMiLAl0d28oMHhGMDAwLCAweDQ0NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0dyIsCXR3bygweEYwMDAsIDB4NTA0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDQ1KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHgiLAl0d28oMHhGMDAwLCAweDQ4NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0NSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc3ViZCIsCXR3bygweEYwMDAsIDB4NTQyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnN1YmwiLAl0d28oMHhGMDAwLCAweDQwMjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc3VicyIsCXR3bygweEYwMDAsIDB4NDQyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnN1YnciLAl0d28oMHhGMDAwLCAweDUwMjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDI4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc3VieCIsCXR3bygweEYwMDAsIDB4NDgyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnN1YngiLAl0d28oMHhGMDAwLCAweDAwMjgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzc3ViZCIsCXR3bygweEYwMDAsIDB4NTQ2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YmwiLAl0d28oMHhGMDAwLCAweDQwNjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VicyIsCXR3bygweEYwMDAsIDB4NDQ2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YnciLAl0d28oMHhGMDAwLCAweDUwNjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDY4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VieCIsCXR3bygweEYwMDAsIDB4NDg2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YngiLAl0d28oMHhGMDAwLCAweDAwNjgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmZHN1YmIiLAl0d28oMHhGMDAwLCAweDU4NmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJkIiwJdHdvKDB4RjAwMCwgMHg1NDZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VibCIsCXR3bygweEYwMDAsIDB4NDA2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YnAiLAl0d28oMHhGMDAwLCAweDRDNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJzIiwJdHdvKDB4RjAwMCwgMHg0NDZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VidyIsCXR3bygweEYwMDAsIDB4NTA2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YngiLAl0d28oMHhGMDAwLCAweDAwNmMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJ4IiwJdHdvKDB4RjAwMCwgMHg0ODZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VieCIsCXR3bygweEYwMDAsIDB4MDA2YyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZ0YW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmdGFuZCIsCXR3bygweEYwMDAsIDB4NTQwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnRhbmwiLAl0d28oMHhGMDAwLCAweDQwMEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmdGFucyIsCXR3bygweEYwMDAsIDB4NDQwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnRhbnciLAl0d28oMHhGMDAwLCAweDUwMEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmdGFueCIsCXR3bygweEYwMDAsIDB4NDgwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnRhbngiLAl0d28oMHhGMDAwLCAweDAwMEYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnRhbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmdGFuaGQiLAl0d28oMHhGMDAwLCAweDU0MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5obCIsCXR3bygweEYwMDAsIDB4NDAwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHMiLAl0d28oMHhGMDAwLCAweDQ0MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5odyIsCXR3bygweEYwMDAsIDB4NTAwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDA5KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHgiLAl0d28oMHhGMDAwLCAweDQ4MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5oeCIsCXR3bygweEYwMDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmdGVudG94YiIsCXR3bygweEYwMDAsIDB4NTgxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveGQiLAl0d28oMHhGMDAwLCAweDU0MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hsIiwJdHdvKDB4RjAwMCwgMHg0MDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94cCIsCXR3bygweEYwMDAsIDB4NEMxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHMiLAl0d28oMHhGMDAwLCAweDQ0MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3h3IiwJdHdvKDB4RjAwMCwgMHg1MDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94eCIsCXR3bygweEYwMDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHgiLAl0d28oMHhGMDAwLCAweDQ4MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDEyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZ0cmFwZXEiLAl0d28oMHhGMDdDLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBmIiwJdHdvKDB4RjA3QywgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2UiLAl0d28oMHhGMDdDLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbCIsCXR3bygweEYwN0MsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGdsZSIsCXR3bygweEYwN0MsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGd0IiwJdHdvKDB4RjA3QywgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbGUiLAl0d28oMHhGMDdDLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBsdCIsCXR3bygweEYwN0MsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5lIiwJdHdvKDB4RjA3QywgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdlIiwJdHdvKDB4RjA3QywgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsIiwJdHdvKDB4RjA3QywgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsZSIsCXR3bygweEYwN0MsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5ndCIsCXR3bygweEYwN0MsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5sZSIsCXR3bygweEYwN0MsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5sdCIsCXR3bygweEYwN0MsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9nZSIsCXR3bygweEYwN0MsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9nbCIsCXR3bygweEYwN0MsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9ndCIsCXR3bygweEYwN0MsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9sZSIsCXR3bygweEYwN0MsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9sdCIsCXR3bygweEYwN0MsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9yIiwJdHdvKDB4RjA3QywgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2VxIiwJdHdvKDB4RjA3QywgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2YiLAl0d28oMHhGMDdDLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBzbmUiLAl0d28oMHhGMDdDLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBzdCIsCXR3bygweEYwN0MsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHQiLAl0d28oMHhGMDdDLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1ZXEiLAl0d28oMHhGMDdDLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z2UiLAl0d28oMHhGMDdDLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z3QiLAl0d28oMHhGMDdDLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bGUiLAl0d28oMHhGMDdDLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bHQiLAl0d28oMHhGMDdDLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1biIsCXR3bygweEYwN0MsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAotICAgICAgICAKLXsiZnRyYXBlcXciLAl0d28oMHhGMDdBLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGZ3IiwJdHdvKDB4RjA3QSwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBnZXciLAl0d28oMHhGMDdBLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGdsdyIsCXR3bygweEYwN0EsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2xldyIsCXR3bygweEYwN0EsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZ3R3IiwJdHdvKDB4RjA3QSwgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBsZXciLAl0d28oMHhGMDdBLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGx0dyIsCXR3bygweEYwN0EsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmV3IiwJdHdvKDB4RjA3QSwgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2V3IiwJdHdvKDB4RjA3QSwgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2x3IiwJdHdvKDB4RjA3QSwgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2xldyIsCXR3bygweEYwN0EsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmd0dyIsCXR3bygweEYwN0EsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmxldyIsCXR3bygweEYwN0EsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmx0dyIsCXR3bygweEYwN0EsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dldyIsCXR3bygweEYwN0EsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dsdyIsCXR3bygweEYwN0EsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2d0dyIsCXR3bygweEYwN0EsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2xldyIsCXR3bygweEYwN0EsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2x0dyIsCXR3bygweEYwN0EsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb3J3IiwJdHdvKDB4RjA3QSwgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzZnciLAl0d28oMHhGMDdBLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHNuZXciLAl0d28oMHhGMDdBLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHN0dyIsCXR3bygweEYwN0EsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwdHciLAl0d28oMHhGMDdBLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVlcXciLAl0d28oMHhGMDdBLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVnZXciLAl0d28oMHhGMDdBLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVndHciLAl0d28oMHhGMDdBLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVsZXciLAl0d28oMHhGMDdBLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVsdHciLAl0d28oMHhGMDdBLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVudyIsCXR3bygweEYwN0EsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi0KLXsiZnRyYXBlcWwiLAl0d28oMHhGMDdCLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGZsIiwJdHdvKDB4RjA3QiwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBnZWwiLAl0d28oMHhGMDdCLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGdsbCIsCXR3bygweEYwN0IsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2xlbCIsCXR3bygweEYwN0IsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ3RsIiwJdHdvKDB4RjA3QiwgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBsZWwiLAl0d28oMHhGMDdCLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGx0bCIsCXR3bygweEYwN0IsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmVsIiwJdHdvKDB4RjA3QiwgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2VsIiwJdHdvKDB4RjA3QiwgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2xsIiwJdHdvKDB4RjA3QiwgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2xlbCIsCXR3bygweEYwN0IsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmd0bCIsCXR3bygweEYwN0IsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmxlbCIsCXR3bygweEYwN0IsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmx0bCIsCXR3bygweEYwN0IsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dlbCIsCXR3bygweEYwN0IsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dsbCIsCXR3bygweEYwN0IsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2d0bCIsCXR3bygweEYwN0IsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2xlbCIsCXR3bygweEYwN0IsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2x0bCIsCXR3bygweEYwN0IsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb3JsIiwJdHdvKDB4RjA3QiwgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzZmwiLAl0d28oMHhGMDdCLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHNuZWwiLAl0d28oMHhGMDdCLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHN0bCIsCXR3bygweEYwN0IsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwdGwiLAl0d28oMHhGMDdCLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVlcWwiLAl0d28oMHhGMDdCLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVnZWwiLAl0d28oMHhGMDdCLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVndGwiLAl0d28oMHhGMDdCLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVsZWwiLAl0d28oMHhGMDdCLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVsdGwiLAl0d28oMHhGMDdCLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVubCIsCXR3bygweEYwN0IsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi0KLXsiZnRzdGIiLAl0d28oMHhGMDAwLCAweDU4M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YiIsIG1mbG9hdCB9LAoteyJmdHN0ZCIsCXR3bygweEYwMDAsIDB4NTQzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGIiwgbWZsb2F0IH0sCi17ImZ0c3RsIiwJdHdvKDB4RjAwMCwgMHg0MDNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2wiLCBtZmxvYXQgfSwKLXsiZnRzdHAiLAl0d28oMHhGMDAwLCAweDRDM0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cCIsIG1mbG9hdCB9LAoteyJmdHN0cyIsCXR3bygweEYwMDAsIDB4NDQzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmIiwgbWZsb2F0IH0sCi17ImZ0c3R3IiwJdHdvKDB4RjAwMCwgMHg1MDNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3ciLCBtZmxvYXQgfSwKLXsiZnRzdHgiLAl0d28oMHhGMDAwLCAweDAwM0EpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOCIsIG1mbG9hdCB9LAoteyJmdHN0eCIsCXR3bygweEYwMDAsIDB4NDgzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4IiwgbWZsb2F0IH0sCi0KLXsiZnR3b3RveGIiLAl0d28oMHhGMDAwLCAweDU4MTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94bCIsCXR3bygweEYwMDAsIDB4NDAxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHAiLAl0d28oMHhGMDAwLCAweDRDMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94dyIsCXR3bygweEYwMDAsIDB4NTAxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHgiLAl0d28oMHhGMDAwLCAweDAwMTEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94eCIsCXR3bygweEYwMDAsIDB4MDAxMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJoYWx0IiwJb25lKDAwNDUzMTApLAlvbmUoMDE3Nzc3NyksICIiLCAgICAgbTY4MDYwIHwgbWNmIH0sCi0KLXsiaWxsZWdhbCIsCW9uZSgwMDQ1Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgICAgIG02ODAwMHVwIH0sCi0KLXsiam1wIiwJCW9uZSgwMDQ3MzAwKSwJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImpyYSIsCQlvbmUoMDA2MDAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsianJhIiwJCW9uZSgwMDQ3MzAwKSwJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImpzciIsCQlvbmUoMDA0NzIwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJqYnNyIiwJb25lKDAwNjA0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17Impic3IiLAlvbmUoMDA0NzIwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJsZWEiLAkJb25lKDAwNDA3MDApLAlvbmUoMDE3MDcwMCksICIhc0FkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJscHN0b3AiLAl0d28oMDE3NDAwMCwwMDAwNzAwKSx0d28oMDE3Nzc3NywwMTc3Nzc3KSwiI3ciLCBjcHUzMnxtNjgwNjAgfSwKLQoteyJsaW5rdyIsCW9uZSgwMDQ3MTIwKSwJb25lKDAxNzc3NzApLCAiQXMjdyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImxpbmtsIiwJb25lKDAwNDQwMTApLAlvbmUoMDE3Nzc3MCksICJBcyNsIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJsaW5rIiwJb25lKDAwNDcxMjApLAlvbmUoMDE3Nzc3MCksICJBcyNXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibGluayIsCW9uZSgwMDQ0MDEwKSwJb25lKDAxNzc3NzApLCAiQXMjbCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLQoteyJsc2xiIiwJb25lKDAxNjA0MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNsYiIsCW9uZSgwMTYwNDUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzbHciLAlvbmUoMDE2MDUxMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJsc2x3IiwJb25lKDAxNjA1NTApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsibHNsdyIsCW9uZSgwMTYxNzAwKSwJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17ImxzbGwiLAlvbmUoMDE2MDYxMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJsc2xsIiwJb25lKDAxNjA2NTApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJsc3JiIiwJb25lKDAxNjAwMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNyYiIsCW9uZSgwMTYwMDUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzcnciLAlvbmUoMDE2MDExMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJsc3J3IiwJb25lKDAxNjAxNTApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsibHNydyIsCW9uZSgwMTYxMzAwKSwJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17ImxzcmwiLAlvbmUoMDE2MDIxMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJsc3JsIiwJb25lKDAxNjAyNTApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQotICAvKiBGSVhNRTogYWRkIE1BTSBtb2RlIChgJicgYWZ0ZXIgPGVhPiBvcGVyYW5kKSAvIHJlbW92ZSBNQUNNICovCi17Im1hY3ciLCAgdHdvKDAxMjAwMDAsIDAwMDAwMDApLCB0d28oMDE3MDY2MCwgMDAwNTQwMCksICJ1TXVtIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAwMDAsIDAwMDEwMDApLCB0d28oMDE3MDY2MCwgMDAwNTQwMCksICJ1TXVtTWgiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDIyMCwgMDAwMDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9hc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyMzAsIDAwMDAwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjQwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51by1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDI1MCwgMDAwMDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9kc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyMjAsIDAwMDEwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWhhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyMzAsIDAwMDEwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgrc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyNDAsIDAwMDEwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyNTAsIDAwMDEwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWhkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyMjAsIDAwMDAwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjMwLCAwMDAwMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDI0MCwgMDAwMDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8tc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyNTAsIDAwMDAwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjIwLCAwMDAxMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjMwLCAwMDAxMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjQwLCAwMDAxMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjUwLCAwMDAxMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17Im1hY2wiLCAgdHdvKDAxMjAwMDAsIDAwMDQwMDApLCB0d28oMDE3MDY2MCwgMDAwNTQwMCksICJSc1JtIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAwMDAsIDAwMDUwMDApLCB0d28oMDE3MDY2MCwgMDAwNTQwMCksICJSc1JtTWgiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDIyMCwgMDAwNDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyMzAsIDAwMDQwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjQwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMS1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDI1MCwgMDAwNDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyMjAsIDAwMDUwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWhhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyMzAsIDAwMDUwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgrc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyNDAsIDAwMDUwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyNTAsIDAwMDUwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWhkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyMjAsIDAwMDQwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjMwLCAwMDA0MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDI0MCwgMDAwNDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjEtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyNTAsIDAwMDQwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjIwLCAwMDA1MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjMwLCAwMDA1MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjQwLCAwMDA1MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjUwLCAwMDA1MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi0vKiBOT1RFOiBUaGUgbWNmNTIwMCBmYW1pbHkgcHJvZ3JhbW1lcidzIHJlZmVyZW5jZSBtYW51YWwgZG9lcyBub3QgCi0gICBpbmRpY2F0ZSB0aGUgYnl0ZSBmb3JtIG9mIHRoZSBtb3ZlYSBpbnN0cnVjdGlvbiBpcyBpbnZhbGlkIChhcyBpdAotICAgaXMgb24gNjgwMDAgZmFtaWx5IGNwdXMpLiAgSG93ZXZlciwgZXhwZXJpbWVudHMgb24gdGhlIDUyMDIgeWVpbGQKLSAgIHVuZXhwZWN0ZWQgcmVzdWx0cy4gIFRoZSB2YWx1ZSBpcyBjb3BpZWQsIGJ1dCBpdCBpcyBub3Qgc2lnbiBleHRlbmRlZAotICAgKGFzIGlzIGRvbmUgd2l0aCBtb3ZlYS53KSBhbmQgdGhlIHRvcCB0aHJlZSBieXRlcyBpbiB0aGUgYWRkcmVzcyAKLSAgIHJlZ2lzdGVyIGFyZSBub3QgZGlzdHVyYmVkLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgdGhlIGludGVuZGVkCi0gICBiZWhhdmlvciAtLS0gaXQgY291bGQgYmUgYSBob2xlIGluIGluc3RydWN0aW9uIGRlY29kaW5nIChNb3Rvcm9sYQotICAgZGVjaWRlZCBub3QgdG8gdHJhcCBhbGwgaW52YWxpZCBpbnN0cnVjdGlvbnMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMpCi0gICAtLS0gYnV0IEkgc3VzcGVjdCB0aGF0IGl0IGlzIG5vdC4gICAKLQotICAgSSByZXBvcnRlZCB0aGlzIHRvIE1vdG9yb2xhIElTRCBUZWNobmljYWwgQ29tbXVuaWNhdGlvbnMgU3VwcG9ydCwgCi0gICB3aGljaCByZXBsaWVkIHRoYXQgb3RoZXIgY29sZGZpcmUgYXNzZW1ibGVycyByZWplY3QgbW92ZWEuYi4gIEZvciAKLSAgIHRoaXMgcmVhc29uIEkndmUgZGVjaWRlZCB0byBub3QgYWxsb3cgbW92ZWFiLiAKLQotCWp0Y0BjeWdudXMuY29tIC0gOTcvMDEvMjQKLSAqLwotCi17Im1vdmVhbCIsCW9uZSgwMDIwMTAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im1vdmVhdyIsCW9uZSgwMDMwMTAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibW92ZWMiLAlvbmUoMDA0NzE3MyksCW9uZSgwMTc3Nzc3KSwgIlIxSmoiLCBtNjgwMTB1cCB8IG1jZiB9LAoteyJtb3ZlYyIsCW9uZSgwMDQ3MTczKSwJb25lKDAxNzc3NzcpLCAiUjEjaiIsIG02ODAxMHVwIHwgbWNmIH0sCi17Im1vdmVjIiwJb25lKDAwNDcxNzIpLAlvbmUoMDE3Nzc3NyksICJKalIxIiwgbTY4MDEwdXAgfSwKLXsibW92ZWMiLAlvbmUoMDA0NzE3MiksCW9uZSgwMTc3Nzc3KSwgIiNqUjEiLCBtNjgwMTB1cCB9LAotCi17Im1vdmVtdyIsCW9uZSgwMDQ0MjAwKSwJb25lKDAxNzc3MDApLCAiTHcmcyIsIG02ODAwMHVwIH0sCi17Im1vdmVtdyIsCW9uZSgwMDQ0MjQwKSwJb25lKDAxNzc3NzApLCAibHctcyIsIG02ODAwMHVwIH0sCi17Im1vdmVtdyIsCW9uZSgwMDQ0MjAwKSwJb25lKDAxNzc3MDApLCAiI3c+cyIsIG02ODAwMHVwIH0sCi17Im1vdmVtdyIsCW9uZSgwMDQ2MjAwKSwJb25lKDAxNzc3MDApLCAiPHNMdyIsIG02ODAwMHVwIH0sCi17Im1vdmVtdyIsCW9uZSgwMDQ2MjAwKSwJb25lKDAxNzc3MDApLCAiPHMjdyIsIG02ODAwMHVwIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzAwKSwJb25lKDAxNzc3MDApLCAiTHcmcyIsIG02ODAwMHVwIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzQwKSwJb25lKDAxNzc3NzApLCAibHctcyIsIG02ODAwMHVwIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzAwKSwJb25lKDAxNzc3MDApLCAiI3c+cyIsIG02ODAwMHVwIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzAwKSwJb25lKDAxNzc3MDApLCAiPHNMdyIsIG02ODAwMHVwIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzAwKSwJb25lKDAxNzc3MDApLCAiPHMjdyIsIG02ODAwMHVwIH0sCi0vKiBGSVhNRTogbmVlZCBzcGVjaWZpZXIgZm9yIG1vZGUgMiBhbmQgNSB0byBzaW1wbGlmeSBiZWxvdyBpbnNuIHBhdHRlcm5zICovCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzIwKSwJb25lKDAxNzc3NzApLCAiTHdhcyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMyMCksCW9uZSgwMTc3NzcwKSwgIiN3YXMiLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzNTApLAlvbmUoMDE3Nzc3MCksICJMd2RzIiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzUwKSwJb25lKDAxNzc3NzApLCAiI3dkcyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMyMCksCW9uZSgwMTc3NzcwKSwgImFzTHciLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzMjApLAlvbmUoMDE3Nzc3MCksICJhcyN3IiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzUwKSwJb25lKDAxNzc3NzApLCAiZHNMdyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjM1MCksCW9uZSgwMTc3NzcwKSwgImRzI3ciLCBtY2YgfSwKLQoteyJtb3ZlcHciLAlvbmUoMDAwMDQxMCksCW9uZSgwMTcwNzcwKSwgImRzRGQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlcHciLAlvbmUoMDAwMDYxMCksCW9uZSgwMTcwNzcwKSwgIkRkZHMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlcGwiLAlvbmUoMDAwMDUxMCksCW9uZSgwMTcwNzcwKSwgImRzRGQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlcGwiLAlvbmUoMDAwMDcxMCksCW9uZSgwMTcwNzcwKSwgIkRkZHMiLCBtNjgwMDB1cCB9LAotCi17Im1vdmVxIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICJNc0RkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibW92ZXEiLAlvbmUoMDA3MDAwMCksCW9uZSgwMTcwNDAwKSwgIiNCRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi0vKiBUaGUgbW92ZSBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBtb3ZlYSBhbmQgbW92ZXEgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIjtiJGQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlYiIsCW9uZSgwMDEwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZiB9LAoteyJtb3ZlYiIsCW9uZSgwMDEwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZiB9LAoteyJtb3ZlYiIsCW9uZSgwMDEwMDAwKSwJb25lKDAxNzAwMDApLCAib2JtZCIsIG1jZiB9LAotCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICIqdyVkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXciLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm93bWQiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzAwKSwgIlNzJHMiLCBtNjgwMDB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDQwMzAwKSwJb25lKDAxNzc3NzApLCAiU3NEcyIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDQxMzAwKSwJb25lKDAxNzc3MDApLCAiQ3MkcyIsIG02ODAxMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDEzMDApLAlvbmUoMDE3Nzc3MCksICJDc0RzIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICI7d0NkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXciLAlvbmUoMDA0MjMwMCksCW9uZSgwMTc3NzAwKSwgIkRzQ2QiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MjM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3Q2QiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIjt3U2QiLCBtNjgwMDB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiRHNTZCIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDQzMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dTZCIsIG1jZiB9LAotCi17Im1vdmVsIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICJNc0RkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIipsJWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbCIsCW9uZSgwMDIwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZiB9LAoteyJtb3ZlbCIsCW9uZSgwMDIwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZiB9LAoteyJtb3ZlbCIsCW9uZSgwMDIwMDAwKSwJb25lKDAxNzAwMDApLCAib2xtZCIsIG1jZiB9LAoteyJtb3ZlbCIsCW9uZSgwMDQ3MTQwKSwJb25lKDAxNzc3NzApLCAiQXNVZCIsIG02ODAwMHVwIH0sCi17Im1vdmVsIiwJb25lKDAwNDcxNTApLAlvbmUoMDE3Nzc3MCksICJVZEFzIiwgbTY4MDAwdXAgfSwKLXsibW92ZWwiLAlvbmUoMDEyMDYwMCksCW9uZSgwMTc3NzYwKSwgIkVzUnMiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyMDQwMCksCW9uZSgwMTc3NzYwKSwgIlJzRXMiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyMDQ3NCksCW9uZSgwMTc3Nzc3KSwgIiNsRXMiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyNDYwMCksCW9uZSgwMTc3NzYwKSwgIkdzUnMiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyNDQwMCksCW9uZSgwMTc3NzYwKSwgIlJzR3MiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyNDQ3NCksCW9uZSgwMTc3Nzc3KSwgIiNsR3MiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyNjYwMCksCW9uZSgwMTc3NzYwKSwgIkhzUnMiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyNjQwMCksCW9uZSgwMTc3NzYwKSwgIlJzSHMiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyNjQ3NCksCW9uZSgwMTc3Nzc3KSwgIiNsSHMiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibW92ZWwiLAlvbmUoMDEyNDcwMCksCW9uZSgwMTc3Nzc3KSwgIkdzQ3MiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJtb3ZlIiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICIqdyVkIiwgbTY4MDAwdXAgfSwKLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJuc3BkIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm93bWQiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQwMzAwKSwJb25lKDAxNzc3MDApLCAiU3MkcyIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzcwKSwgIlNzRHMiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQxMzAwKSwJb25lKDAxNzc3MDApLCAiQ3MkcyIsIG02ODAxMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzcwKSwgIkNzRHMiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiO3dDZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0MjMwMCksCW9uZSgwMTc3NzAwKSwgIkRzQ2QiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQyMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dDZCIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwNDMzMDApLAlvbmUoMDE3NzcwMCksICI7d1NkIiwgbTY4MDAwdXAgfSwKLXsibW92ZSIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiRHNTZCIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwNDMzNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NkIiwgbWNmIH0sCi0KLXsibW92ZSIsCW9uZSgwMDQ3MTQwKSwJb25lKDAxNzc3NzApLCAiQXNVZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0NzE1MCksCW9uZSgwMTc3NzcwKSwgIlVkQXMiLCBtNjgwMDB1cCB9LAotCi17Im1vdmVzYiIsCXR3bygwMDA3MDAwLCAwKSwgICAgIHR3bygwMTc3NzAwLCAwNzc3NyksICJ+c1IxIiwgbTY4MDEwdXAgfSwKLXsibW92ZXNiIiwJdHdvKDAwMDcwMDAsIDA0MDAwKSwgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIlIxfnMiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc3ciLAl0d28oMDAwNzEwMCwgMCksICAgICB0d28oMDE3NzcwMCwgMDc3NzcpLCAifnNSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVzdyIsCXR3bygwMDA3MTAwLCAwNDAwMCksIHR3bygwMTc3NzAwLCAwNzc3NyksICJSMX5zIiwgbTY4MDEwdXAgfSwKLXsibW92ZXNsIiwJdHdvKDAwMDcyMDAsIDApLCAgICAgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIn5zUjEiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc2wiLAl0d28oMDAwNzIwMCwgMDQwMDApLCB0d28oMDE3NzcwMCwgMDc3NzcpLCAiUjF+cyIsIG02ODAxMHVwIH0sCi0KLXsibW92ZTE2IiwJdHdvKDB4ZjYyMCwgMHg4MDAwKSwgdHdvKDB4ZmZmOCwgMHg4ZmZmKSwgIitzKzEiLCBtNjgwNDB1cCB9LAoteyJtb3ZlMTYiLAlvbmUoMHhmNjAwKSwJCW9uZSgweGZmZjgpLCAiK3NfTCIsIG02ODA0MHVwIH0sCi17Im1vdmUxNiIsCW9uZSgweGY2MDgpLAkJb25lKDB4ZmZmOCksICJfTCtzIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYxMCksCQlvbmUoMHhmZmY4KSwgImFzX0wiLCBtNjgwNDB1cCB9LAoteyJtb3ZlMTYiLAlvbmUoMHhmNjE4KSwJCW9uZSgweGZmZjgpLCAiX0xhcyIsIG02ODA0MHVwIH0sCi0KLSAgLyogRklYTUU6IGFkZCBNQU0gbW9kZSAoYCYnIGFmdGVyIDxlYT4gb3BlcmFuZCkgLyByZW1vdmUgTVNBQ00gKi8KLXsibXNhY3ciLCAgdHdvKDAxMjAwMDAsIDAwMDA0MDApLCB0d28oMDE3MDY2MCwgMDAwNTQwMCksICJ1TXVtIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bU1oIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjIwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2FzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyMzAsIDAwMDA0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDI0MCwgMDAwMDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8tc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjUwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2RzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyMjAsIDAwMDE0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWhhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDI0MCwgMDAwMTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyNTAsIDAwMDE0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWhkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjIwLCAwMDAwNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2FzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyMzAsIDAwMDA0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDI0MCwgMDAwMDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8tc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjUwLCAwMDAwNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2RzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyMjAsIDAwMDE0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWhhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjMwLCAwMDAxNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDI0MCwgMDAwMTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyNTAsIDAwMDE0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWhkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsibXNhY2wiLCAgdHdvKDAxMjAwMDAsIDAwMDQ0MDApLCB0d28oMDE3MDY2MCwgMDAwNTQwMCksICJSc1JtIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbU1oIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjIwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyMzAsIDAwMDQ0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDI0MCwgMDAwNDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjEtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjUwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyMjAsIDAwMDU0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWhhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDI0MCwgMDAwNTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyNTAsIDAwMDU0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWhkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjIwLCAwMDA0NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyMzAsIDAwMDQ0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDI0MCwgMDAwNDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjEtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjUwLCAwMDA0NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyMjAsIDAwMDU0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWhhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjMwLCAwMDA1NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDI0MCwgMDAwNTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyNTAsIDAwMDU0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWhkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsibXVsc3ciLAlvbmUoMDE0MDcwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXB8bWNmIH0sCi17Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA0MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICI7bEQxIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsibXVsc2wiLAl0d28oMDA0NjAwMCwwMDQwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgInFzRDEiLCBtY2YgfSwKLXsibXVsc2wiLAl0d28oMDA0NjAwMCwwMDYwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJtdWx1dyIsCW9uZSgwMTQwMzAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cHxtY2YgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDAwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDEiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJtdWx1bCIsCXR3bygwMDQ2MDAwLDAwMDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAicXNEMSIsIG1jZiB9LAoteyJtdWx1bCIsCXR3bygwMDQ2MDAwLDAwMjAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEM0QxIixtNjgwMjB1cHxjcHUzMiB9LAotCi17Im5iY2QiLAlvbmUoMDA0NDAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLQoteyJuZWdiIiwJb25lKDAwNDIwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3ciLAlvbmUoMDA0MjEwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVnbCIsCW9uZSgwMDQyMjAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWdsIiwJb25lKDAwNDIyMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZn0sCi0KLXsibmVneGIiLAlvbmUoMDA0MDAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVneHciLAlvbmUoMDA0MDEwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVneGwiLAlvbmUoMDA0MDIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVneGwiLAlvbmUoMDA0MDIwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmfSwKLQoteyJub3AiLAkJb25lKDAwNDcxNjEpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB8IG1jZn0sCi0KLXsibm90YiIsCW9uZSgwMDQzMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJub3R3IiwJb25lKDAwNDMxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5vdGwiLAlvbmUoMDA0MzIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibm90bCIsCW9uZSgwMDQzMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Z9LAotCi17Im9yaWIiLAlvbmUoMDAwMDAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJvcmliIiwJb25lKDAwMDAwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsib3JpdyIsCW9uZSgwMDAwMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17Im9yaXciLAlvbmUoMDAwMDE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJvcmlsIiwJb25lKDAwMDAyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsib3JpbCIsCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJvcmkiLAkJb25lKDAwMDAwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsib3JpIiwJCW9uZSgwMDAwMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17Im9yaSIsCQlvbmUoMDAwMDE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAotCi0vKiBUaGUgb3Igb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgb3JpIGluc3RydWN0aW9uLiAgKi8KLXsib3JiIiwJCW9uZSgwMDAwMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17Im9yYiIsCQlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJvcmIiLAkJb25lKDAxMDAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsib3JiIiwJCW9uZSgwMTAwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi17Im9ydyIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsib3J3IiwJCW9uZSgwMTAwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17Im9ydyIsCQlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAoteyJvcmwiLAkJb25lKDAwMDAyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsib3JsIiwJCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJvcmwiLAkJb25lKDAxMDAyMDApLAlvbmUoMDE3MDcwMCksICI7bERkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsib3JsIiwJCW9uZSgwMTAwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im9yIiwJCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yIiwJCW9uZSgwMDAwMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17Im9yIiwJCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17Im9yIiwJCW9uZSgwMTAwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17Im9yIiwJCW9uZSgwMTAwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi0KLXsicGFjayIsCW9uZSgwMTAwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCN3IiwgbTY4MDIwdXAgfSwKLXsicGFjayIsCW9uZSgwMTAwNTEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCN3IiwgbTY4MDIwdXAgfSwKLQoteyJwYmFjIiwJb25lKDB4ZjA4NyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiYWN3IiwJb25lKDB4ZjA4NyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiYXMiLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJhc3ciLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJiYyIsCW9uZSgweGYwODEpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmJjdyIsCW9uZSgweGYwODEpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmJzIiwJb25lKDB4ZjA4MCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiYnN3IiwJb25lKDB4ZjA4MCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiY2MiLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJjY3ciLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJjcyIsCW9uZSgweGYwOGUpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmNzdyIsCW9uZSgweGYwOGUpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmdjIiwJb25lKDB4ZjA4ZCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiZ2N3IiwJb25lKDB4ZjA4ZCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiZ3MiLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJnc3ciLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJpYyIsCW9uZSgweGYwOGIpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmljdyIsCW9uZSgweGYwOGIpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmlzIiwJb25lKDB4ZjA4YSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiaXN3IiwJb25lKDB4ZjA4YSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBibGMiLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJsY3ciLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJscyIsCW9uZSgweGYwODIpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmxzdyIsCW9uZSgweGYwODIpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYnNjIiwJb25lKDB4ZjA4NSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBic2N3IiwJb25lKDB4ZjA4NSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBic3MiLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJzc3ciLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJ3YyIsCW9uZSgweGYwODkpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYndjdyIsCW9uZSgweGYwODkpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYndzIiwJb25lKDB4ZjA4OCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBid3N3IiwJb25lKDB4ZjA4OCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi0KLXsicGRiYWMiLAl0d28oMHhmMDQ4LCAweDAwMDcpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJhcyIsCXR3bygweGYwNDgsIDB4MDAwNiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmJjIiwJdHdvKDB4ZjA0OCwgMHgwMDAxKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiYnMiLAl0d28oMHhmMDQ4LCAweDAwMDApLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJjYyIsCXR3bygweGYwNDgsIDB4MDAwZiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmNzIiwJdHdvKDB4ZjA0OCwgMHgwMDBlKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiZ2MiLAl0d28oMHhmMDQ4LCAweDAwMGQpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJncyIsCXR3bygweGYwNDgsIDB4MDAwYyksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmljIiwJdHdvKDB4ZjA0OCwgMHgwMDBiKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiaXMiLAl0d28oMHhmMDQ4LCAweDAwMGEpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJsYyIsCXR3bygweGYwNDgsIDB4MDAwMyksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmxzIiwJdHdvKDB4ZjA0OCwgMHgwMDAyKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRic2MiLAl0d28oMHhmMDQ4LCAweDAwMDUpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJzcyIsCXR3bygweGYwNDgsIDB4MDAwNCksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYndjIiwJdHdvKDB4ZjA0OCwgMHgwMDA5KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRid3MiLAl0d28oMHhmMDQ4LCAweDAwMDgpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAotCi17InBlYSIsCQlvbmUoMDA0NDEwMCksCQlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwfG1jZiB9LAotCi17InBmbHVzaGEiLAlvbmUoMHhmNTE4KSwJCW9uZSgweGZmZjgpLCAiIiwgbTY4MDQwdXAgfSwKLXsicGZsdXNoYSIsCXR3bygweGYwMDAsMHgyNDAwKSwgdHdvKDB4ZmZmZiwweGZmZmYpLCAiIiwgbTY4MDMwIHwgbTY4ODUxIH0sCi0KLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzAxMCksIHR3bygweGZmYzAsMHhmZTEwKSwgIlQzVDkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDM4MTApLCB0d28oMHhmZmMwLDB4ZmUxMCksICJUM1Q5JnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDMwMDgpLCB0d28oMHhmZmMwLDB4ZmUxOCksICJEM1Q5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzODA4KSwgdHdvKDB4ZmZjMCwweGZlMTgpLCAiRDNUOSZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzMDAwKSwgdHdvKDB4ZmZjMCwweGZlMWUpLCAiZjNUOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzgwMCksIHR3bygweGZmYzAsMHhmZTFlKSwgImYzVDkmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwJb25lKDB4ZjUwOCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwdXAgfSwKLXsicGZsdXNoIiwJb25lKDB4ZjUwOCksCQlvbmUoMHhmZmY4KSwgIkFzIiwgbTY4MDQwdXAgfSwKLQoteyJwZmx1c2hhbiIsCW9uZSgweGY1MTApLAkJb25lKDB4ZmZmOCksICIiLCBtNjgwNDB1cCB9LAoteyJwZmx1c2huIiwJb25lKDB4ZjUwMCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwdXAgfSwKLXsicGZsdXNobiIsCW9uZSgweGY1MDApLAkJb25lKDB4ZmZmOCksICJBcyIsIG02ODA0MHVwIH0sCi0KLXsicGZsdXNociIsCXR3bygweGYwMDAsIDB4YTAwMCksIHR3bygweGZmYzAsIDB4ZmZmZiksICJ8cyIsIG02ODg1MSB9LAotCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MTApLCB0d28oMHhmZmY4LCAweGZlMTApLCAiVDNUOSIsIG02ODg1MSB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzEwKSwgdHdvKDB4ZmZmOCwgMHhmZTEwKSwgIlQzVDkmcyIsIG02ODg1MSB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDA4KSwgdHdvKDB4ZmZmOCwgMHhmZTE4KSwgIkQzVDkiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MwOCksIHR3bygweGZmZjgsIDB4ZmUxOCksICJEM1Q5JnMiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwMCksIHR3bygweGZmZjgsIDB4ZmUxZSksICJmM1Q5IiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDApLCB0d28oMHhmZmY4LCAweGZlMWUpLCAiZjNUOSZzIiwgbTY4ODUxIH0sCi0KLXsicGxvYWRyIiwgICAgIHR3bygweGYwMDAsMHgyMjEwKSwgdHdvKDB4ZmZjMCwweGZmZjApLCAiVDMmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGxvYWRyIiwgICAgIHR3bygweGYwMDAsMHgyMjA4KSwgdHdvKDB4ZmZjMCwweGZmZjgpLCAiRDMmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGxvYWRyIiwgICAgIHR3bygweGYwMDAsMHgyMjAwKSwgdHdvKDB4ZmZjMCwweGZmZmUpLCAiZjMmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGxvYWR3IiwgICAgIHR3bygweGYwMDAsMHgyMDEwKSwgdHdvKDB4ZmZjMCwweGZmZjApLCAiVDMmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGxvYWR3IiwgICAgIHR3bygweGYwMDAsMHgyMDA4KSwgdHdvKDB4ZmZjMCwweGZmZjgpLCAiRDMmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGxvYWR3IiwgICAgIHR3bygweGYwMDAsMHgyMDAwKSwgdHdvKDB4ZmZjMCwweGZmZmUpLCAiZjMmcyIsIG02ODAzMHxtNjg4NTEgfSwKLQoteyJwbHBhciIsCW9uZSgweGY1YzgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA2MCB9LAoteyJwbHBhdyIsCW9uZSgweGY1ODgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA2MCB9LAotCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhmZmZmKSwgIipsMDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NWMwMCksIHR3bygweGZmYzAsMHhmZmZmKSwgIip3MTgiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MDAwKSwgdHdvKDB4ZmZjMCwweGUzZmYpLCAiKmIyOCIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQyMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIwOCVzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDVlMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIxOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDIwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIjI4JXMiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MDAwKSwgdHdvKDB4ZmZjMCwweGUzZmYpLCAifHNXOCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MjAwKSwgdHdvKDB4ZmZjMCwweGUzZmYpLCAiVzh+cyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2MjAwKSwgdHdvKDB4ZmZjMCwweGUzZTMpLCAiKndYMyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYwMDApLCB0d28oMHhmZmMwLDB4ZTNlMyksICJYMyVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjAwMCksIHR3bygweGZmYzAsMHhmZmZmKSwgIip3WTgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjIwMCksIHR3bygweGZmYzAsMHhmZmZmKSwgIlk4JXMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjYwMCksIHR3bygweGZmYzAsMHhmZmZmKSwgIlo4JXMiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHgwODAwKSwgdHdvKDB4ZmZjMCwweGZiZmYpLCAiKmwzOCIsIG02ODAzMCB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDBhMDApLCB0d28oMHhmZmMwLDB4ZmJmZiksICIzOCVzIiwgbTY4MDMwIH0sCi0KLXsicG1vdmVmZCIsCXR3bygweGYwMDAsIDB4NDEwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksICIqbDA4IiwgbTY4MDMwIH0sCi17InBtb3ZlZmQiLAl0d28oMHhmMDAwLCAweDQxMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLCAifHNXOCIsIG02ODAzMCB9LAoteyJwbW92ZWZkIiwJdHdvKDB4ZjAwMCwgMHgwOTAwKSwJdHdvKDB4ZmZjMCwgMHhmYmZmKSwgIipsMzgiLCBtNjgwMzAgfSwKLQoteyJwcmVzdG9yZSIsCW9uZSgweGYxNDApLAkJb25lKDB4ZmZjMCksICI8cyIsIG02ODg1MSB9LAotCi17InBzYXZlIiwJb25lKDB4ZjEwMCksCQlvbmUoMHhmZmMwKSwgIj5zIiwgbTY4ODUxIH0sCi0KLXsicHNhYyIsCXR3bygweGYwNDAsIDB4MDAwNyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2FzIiwJdHdvKDB4ZjA0MCwgMHgwMDA2KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzYmMiLAl0d28oMHhmMDQwLCAweDAwMDEpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNicyIsCXR3bygweGYwNDAsIDB4MDAwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2NjIiwJdHdvKDB4ZjA0MCwgMHgwMDBmKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzY3MiLAl0d28oMHhmMDQwLCAweDAwMGUpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNnYyIsCXR3bygweGYwNDAsIDB4MDAwZCksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2dzIiwJdHdvKDB4ZjA0MCwgMHgwMDBjKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzaWMiLAl0d28oMHhmMDQwLCAweDAwMGIpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNpcyIsCXR3bygweGYwNDAsIDB4MDAwYSksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2xjIiwJdHdvKDB4ZjA0MCwgMHgwMDAzKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzbHMiLAl0d28oMHhmMDQwLCAweDAwMDIpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNzYyIsCXR3bygweGYwNDAsIDB4MDAwNSksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc3NzIiwJdHdvKDB4ZjA0MCwgMHgwMDA0KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzd2MiLAl0d28oMHhmMDQwLCAweDAwMDkpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHN3cyIsCXR3bygweGYwNDAsIDB4MDAwOCksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAotCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MjEwKSwgdHdvKDB4ZmZjMCwgMHhlM2YwKSwgIlQzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgzMTApLCB0d28oMHhmZmMwLDB4ZTMxMCksICJUMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgyMDgpLCB0d28oMHhmZmMwLDB4ZTNmOCksICJEMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MzA4KSwgdHdvKDB4ZmZjMCwweGUzMTgpLCAiRDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MjAwKSwgdHdvKDB4ZmZjMCwweGUzZmUpLCAiZjMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODMwMCksIHR3bygweGZmYzAsMHhlMzFlKSwgImYzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLAlvbmUoMHhmNTY4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNDAgfSwKLQoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODAxMCksIHR3bygweGZmYzAsMHhlM2YwKSwgIlQzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgxMTApLCB0d28oMHhmZmMwLDB4ZTMxMCksICJUMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgwMDgpLCB0d28oMHhmZmMwLDB4ZTNmOCksICJEMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MTA4KSwgdHdvKDB4ZmZjMCwweGUzMTgpLCAiRDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MDAwKSwgdHdvKDB4ZmZjMCwweGUzZmUpLCAiZjMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODEwMCksIHR3bygweGZmYzAsMHhlMzFlKSwgImYzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLAlvbmUoMHhmNTQ4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNDAgfSwKLQoteyJwdHJhcGFjdyIsCXR3bygweGYwN2EsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGFjbCIsCXR3bygweGYwN2IsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGFjIiwJdHdvKDB4ZjA3YywgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBhc3ciLAl0d28oMHhmMDdhLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBhc2wiLAl0d28oMHhmMDdiLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBhcyIsCXR3bygweGYwN2MsIDB4MDAwNiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwYmN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwYmNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwYmMiLAl0d28oMHhmMDdjLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGJzdyIsCXR3bygweGYwN2EsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGJzbCIsCXR3bygweGYwN2IsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGJzIiwJdHdvKDB4ZjA3YywgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBjY3ciLAl0d28oMHhmMDdhLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBjY2wiLAl0d28oMHhmMDdiLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBjYyIsCXR3bygweGYwN2MsIDB4MDAwZiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwY3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwY3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwY3MiLAl0d28oMHhmMDdjLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGdjdyIsCXR3bygweGYwN2EsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGdjbCIsCXR3bygweGYwN2IsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGdjIiwJdHdvKDB4ZjA3YywgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBnc3ciLAl0d28oMHhmMDdhLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBnc2wiLAl0d28oMHhmMDdiLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBncyIsCXR3bygweGYwN2MsIDB4MDAwYyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwaWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwaWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwaWMiLAl0d28oMHhmMDdjLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGlzdyIsCXR3bygweGYwN2EsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGlzbCIsCXR3bygweGYwN2IsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGlzIiwJdHdvKDB4ZjA3YywgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBsY3ciLAl0d28oMHhmMDdhLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBsY2wiLAl0d28oMHhmMDdiLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBsYyIsCXR3bygweGYwN2MsIDB4MDAwMyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwbHN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwbHNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwbHMiLAl0d28oMHhmMDdjLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcHNjdyIsCXR3bygweGYwN2EsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcHNjbCIsCXR3bygweGYwN2IsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcHNjIiwJdHdvKDB4ZjA3YywgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBzc3ciLAl0d28oMHhmMDdhLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBzc2wiLAl0d28oMHhmMDdiLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBzcyIsCXR3bygweGYwN2MsIDB4MDAwNCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwd2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwd2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwd2MiLAl0d28oMHhmMDdjLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcHdzdyIsCXR3bygweGYwN2EsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcHdzbCIsCXR3bygweGYwN2IsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcHdzIiwJdHdvKDB4ZjA3YywgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHVsc2UiLAlvbmUoMDA0NTMxNCksCQlvbmUoMDE3Nzc3NyksICIiLCBtNjgwNjAgfCBtY2YgfSwKLQoteyJwdmFsaWQiLAl0d28oMHhmMDAwLCAweDI4MDApLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiVnMmcyIsIG02ODg1MSB9LAoteyJwdmFsaWQiLAl0d28oMHhmMDAwLCAweDJjMDApLAl0d28oMHhmZmMwLCAweGZmZjgpLCAiQTMmcyIsIG02ODg1MSB9LAotCi0gIC8qIEZJWE1FOiBkb24ndCBhbGxvdyBEdz09RHguICovCi17InJlbXNsIiwgICAgICAgdHdvKDB4NGM0MCwgMHgwODAwKSwgICAgdHdvKDB4ZmZjMCwgMHg4ZmY4KSwgInZzRDNEMSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJyZW11bCIsICAgICAgIHR3bygweDRjNDAsIDB4MDAwMCksICAgIHR3bygweGZmYzAsIDB4OGZmOCksICJ2c0QzRDEiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJyZXNldCIsCW9uZSgwMDQ3MTYwKSwJCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAwMHVwIH0sCi0KLXsicm9sYiIsCW9uZSgwMTYwNDMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2xiIiwJb25lKDAxNjA0NzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJvbHciLAlvbmUoMDE2MDUzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sdyIsCW9uZSgwMTYwNTcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2x3IiwJb25lKDAxNjM3MDApLAkJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17InJvbGwiLAlvbmUoMDE2MDYzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sbCIsCW9uZSgwMTYwNjcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAotCi17InJvcmIiLAlvbmUoMDE2MDAzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9yYiIsCW9uZSgwMTYwMDcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3J3IiwJb25lKDAxNjAxMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvcnciLAlvbmUoMDE2MDE3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9ydyIsCW9uZSgwMTYzMzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb3JsIiwJb25lKDAxNjAyMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvcmwiLAlvbmUoMDE2MDI3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJyb3hsYiIsCW9uZSgwMTYwNDIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsYiIsCW9uZSgwMTYwNDYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsdyIsCW9uZSgwMTYwNTIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsdyIsCW9uZSgwMTYwNTYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsdyIsCW9uZSgwMTYyNzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb3hsbCIsCW9uZSgwMTYwNjIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsbCIsCW9uZSgwMTYwNjYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAotCi17InJveHJiIiwJb25lKDAxNjAwMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveHJiIiwJb25lKDAxNjAwNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJveHJ3IiwJb25lKDAxNjAxMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveHJ3IiwJb25lKDAxNjAxNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJveHJ3IiwJb25lKDAxNjIzMDApLAkJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17InJveHJsIiwJb25lKDAxNjAyMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveHJsIiwJb25lKDAxNjAyNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi0KLXsicnRkIiwJCW9uZSgwMDQ3MTY0KSwJCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDEwdXAgfSwKLQoteyJydGUiLAkJb25lKDAwNDcxNjMpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cHxtY2YgfSwKLQoteyJydG0iLAkJb25lKDAwMDMzMDApLAkJb25lKDAxNzc3NjApLCAiUnMiLCBtNjgwMjAgfSwKLQoteyJydHIiLAkJb25lKDAwNDcxNjcpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cCB9LAotCi17InJ0cyIsCQlvbmUoMDA0NzE2NSksCQlvbmUoMDE3Nzc3NyksICIiLCAgIG02ODAwMHVwfG1jZiB9LAotCi17InNiY2QiLAlvbmUoMDEwMDQwMCksCQlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsic2JjZCIsCW9uZSgwMTAwNDEwKSwJCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAotCi0KLXsic2NjIiwJCW9uZSgwMDUyMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzY2MiLAkJb25lKDAwNTIzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzY3MiLAkJb25lKDAwNTI3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNjcyIsCQlvbmUoMDA1MjcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNlcSIsCQlvbmUoMDA1MzcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2VxIiwJCW9uZSgwMDUzNzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2YiLAkJb25lKDAwNTA3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNmIiwJCW9uZSgwMDUwNzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2dlIiwJCW9uZSgwMDU2MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZ2UiLAkJb25lKDAwNTYzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzZ3QiLAkJb25lKDAwNTczMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNndCIsCQlvbmUoMDA1NzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNoaSIsCQlvbmUoMDA1MTMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2hpIiwJCW9uZSgwMDUxMzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2xlIiwJCW9uZSgwMDU3NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbGUiLAkJb25lKDAwNTc3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzbHMiLAkJb25lKDAwNTE3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNscyIsCQlvbmUoMDA1MTcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNsdCIsCQlvbmUoMDA1NjcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2x0IiwJCW9uZSgwMDU2NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic21pIiwJCW9uZSgwMDU1NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbWkiLAkJb25lKDAwNTU3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzbmUiLAkJb25lKDAwNTMzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNuZSIsCQlvbmUoMDA1MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNwbCIsCQlvbmUoMDA1NTMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic3BsIiwJCW9uZSgwMDU1MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic3QiLAkJb25lKDAwNTAzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InN0IiwJCW9uZSgwMDUwMzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic3ZjIiwJCW9uZSgwMDU0MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzdmMiLAkJb25lKDAwNTQzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzdnMiLAkJb25lKDAwNTQ3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InN2cyIsCQlvbmUoMDA1NDcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi0KLXsic3RvcCIsCW9uZSgwMDQ3MTYyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17InN1YmFsIiwJb25lKDAxMTA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsic3ViYXciLAlvbmUoMDExMDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAotCi17InN1YmliIiwJb25lKDAwMDIwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsic3ViaXciLAlvbmUoMDAwMjEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJzdWJpbCIsCW9uZSgwMDAyMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17InN1YmlsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi0KLXsic3VicWIiLAlvbmUoMDA1MDQwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJxdyIsCW9uZSgwMDUwNTAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCi17InN1YnFsIiwJb25lKDAwNTA2MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQotLyogVGhlIHN1YiBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBzdWJhLCBzdWJpLCBhbmQgc3VicSBpbnN0cnVjdGlvbnMuICAqLwoteyJzdWJiIiwJb25lKDAwNTA0MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfSwKLXsic3ViYiIsCW9uZSgwMDAyMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17InN1YmIiLAlvbmUoMDExMDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoteyJzdWJiIiwJb25lKDAxMTA0MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsic3VidyIsCW9uZSgwMDUwNTAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDAwMjEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAxMTAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLXsic3VidyIsCW9uZSgwMTEwMTAwKSwJb25lKDAxNzA3MDApLCAiKndEZCIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDExMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAoteyJzdWJsIiwJb25lKDAwNTA2MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsic3VibCIsCW9uZSgwMDAyMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17InN1YmwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsic3VibCIsCW9uZSgwMTEwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YmwiLAlvbmUoMDExMDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJzdWJsIiwJb25lKDAxMTA2MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJzdWJ4YiIsCW9uZSgwMTEwNDAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17InN1YnhiIiwJb25lKDAxMTA0MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLXsic3VieHciLAlvbmUoMDExMDUwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4dyIsCW9uZSgwMTEwNTEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi17InN1YnhsIiwJb25lKDAxMTA2MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsic3VieGwiLAlvbmUoMDExMDYxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAotCi17InN3YXAiLAlvbmUoMDA0NDEwMCksCW9uZSgwMTc3NzcwKSwgIkRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQotLyogc3diZWcgYW5kIHN3YmVnbCBhcmUgbWFnaWMgY29uc3RhbnRzIHVzZWQgb24gc3lzVjY4LiAgVGhlIGNvbXBpbGVyCi0gICBnZW5lcmF0ZXMgdGhlbSBiZWZvcmUgYSBzd2l0Y2ggdGFibGUuICBUaGV5IHRlbGwgdGhlIGRlYnVnZ2VyIGFuZAotICAgZGlzYXNzZW1ibGVyIHRoYXQgYSBzd2l0Y2ggdGFibGUgZm9sbG93cy4gIFRoZSBwYXJhbWV0ZXIgaXMgdGhlCi0gICBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRhYmxlLiAgc3diZWcgbWVhbnMgdGhhdCB0aGUgZW50cmllcyBpbgotICAgdGhlIHRhYmxlIGFyZSB3b3JkICgyIGJ5dGUpIHNpemVkLCBhbmQgc3diZWdsIG1lYW5zIHRoYXQgdGhlCi0gICBlbnRyaWVzIGluIHRoZSB0YWJsZSBhcmUgbG9uZ3dvcmQgKDQgYnl0ZSkgc2l6ZWQuICAqLwoteyJzd2JlZyIsCW9uZSgwMDQ1Mzc0KSwJb25lKDAxNzc3NzcpLCAiI3ciLCAgIG02ODAwMHVwIHwgbWNmIH0sCi17InN3YmVnbCIsCW9uZSgwMDQ1Mzc1KSwJb25lKDAxNzc3NzcpLCAiI2wiLCAgIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsidGFzIiwJCW9uZSgwMDQ1MzAwKSwJCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLQotI2RlZmluZSBUQkwxKG5hbWUsc2lnbmVkLHJvdW5kLHNpemUpCQkJCQlcCi0gIHtuYW1lLCB0d28oMDE3NDAwMCwgKHNpZ25lZDw8MTEpfCghcm91bmQ8PDEwKXwoc2l6ZTw8Nil8MDAwMDQwMCksCVwKLSAgICAgdHdvKDAxNzc3MDAsMDEwNzc3NyksICIhc0QxIiwgY3B1MzIgfSwJCQkJXAotICB7bmFtZSwgdHdvKDAxNzQwMDAsIChzaWduZWQ8PDExKXwoIXJvdW5kPDwxMCl8KHNpemU8PDYpKSwJCVwKLSAgICAgdHdvKDAxNzc3NzAsMDEwNzc3MCksICJEc0QzRDEiLCBjcHUzMiB9Ci0jZGVmaW5lIFRCTChuYW1lMSwgbmFtZTIsIG5hbWUzLCBzLCByKSBcCi0gIFRCTDEobmFtZTEsIHMsIHIsIDApLCBUQkwxKG5hbWUyLCBzLCByLCAxKSwgVEJMMShuYW1lMywgcywgciwgMikKLVRCTCgidGJsc2IiLCAidGJsc3ciLCAidGJsc2wiLCAxLCAxKSwKLVRCTCgidGJsc25iIiwgInRibHNudyIsICJ0YmxzbmwiLCAxLCAwKSwKLVRCTCgidGJsdWIiLCAidGJsdXciLCAidGJsdWwiLCAwLCAxKSwKLVRCTCgidGJsdW5iIiwgInRibHVudyIsICJ0Ymx1bmwiLCAwLCAwKSwKLQoteyJ0cmFwIiwJb25lKDAwNDcxMDApLAlvbmUoMDE3Nzc2MCksICJUcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsidHJhcGNjIiwJb25lKDAwNTIzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBjcyIsCW9uZSgwMDUyNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwZXEiLAlvbmUoMDA1Mzc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGYiLAlvbmUoMDA1MDc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfCBtY2YgfSwKLXsidHJhcGdlIiwJb25lKDAwNTYzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBndCIsCW9uZSgwMDU3Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwaGkiLAlvbmUoMDA1MTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGxlIiwJb25lKDAwNTc3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBscyIsCW9uZSgwMDUxNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbHQiLAlvbmUoMDA1Njc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcG1pIiwJb25lKDAwNTU3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBuZSIsCW9uZSgwMDUzMzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwcGwiLAlvbmUoMDA1NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcHQiLAlvbmUoMDA1MDM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcHZjIiwJb25lKDAwNTQzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXB2cyIsCW9uZSgwMDU0Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17InRyYXBjY3ciLAlvbmUoMDA1MjM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGNzdyIsCW9uZSgwMDUyNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZXF3IiwJb25lKDAwNTM3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBmdyIsCW9uZSgwMDUwNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMnxtY2Z9LAoteyJ0cmFwZ2V3IiwJb25lKDAwNTYzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBndHciLAlvbmUoMDA1NzM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGhpdyIsCW9uZSgwMDUxMzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbGV3IiwJb25lKDAwNTc3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsc3ciLAlvbmUoMDA1MTc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGx0dyIsCW9uZSgwMDU2NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbWl3IiwJb25lKDAwNTU3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBuZXciLAlvbmUoMDA1MzM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHBsdyIsCW9uZSgwMDU1MzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdHciLAlvbmUoMDA1MDM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZjdyIsCW9uZSgwMDU0MzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdnN3IiwJb25lKDAwNTQ3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsidHJhcGNjbCIsCW9uZSgwMDUyMzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwY3NsIiwJb25lKDAwNTI3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBlcWwiLAlvbmUoMDA1Mzc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGZsIiwJb25lKDAwNTA3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyfG1jZn0sCi17InRyYXBnZWwiLAlvbmUoMDA1NjM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGd0bCIsCW9uZSgwMDU3MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwaGlsIiwJb25lKDAwNTEzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsZWwiLAlvbmUoMDA1Nzc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGxzbCIsCW9uZSgwMDUxNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbHRsIiwJb25lKDAwNTY3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBtaWwiLAlvbmUoMDA1NTc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcG5lbCIsCW9uZSgwMDUzMzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwcGxsIiwJb25lKDAwNTUzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB0bCIsCW9uZSgwMDUwMzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdmNsIiwJb25lKDAwNTQzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB2c2wiLAlvbmUoMDA1NDc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJ0cmFwdiIsCW9uZSgwMDQ3MTY2KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDAwdXAgfSwKLQoteyJ0c3RiIiwJb25lKDAwNDUwMDApLAlvbmUoMDE3NzcwMCksICI7YiIsIG02ODAyMHVwfGNwdTMyfG1jZiB9LAoteyJ0c3RiIiwJb25lKDAwNDUwMDApLAlvbmUoMDE3NzcwMCksICIkYiIsIG02ODAwMHVwIH0sCi17InRzdHciLAlvbmUoMDA0NTEwMCksCW9uZSgwMTc3NzAwKSwgIip3IiwgbTY4MDIwdXB8Y3B1MzJ8bWNmIH0sCi17InRzdHciLAlvbmUoMDA0NTEwMCksCW9uZSgwMTc3NzAwKSwgIiR3IiwgbTY4MDAwdXAgfSwKLXsidHN0bCIsCW9uZSgwMDQ1MjAwKSwJb25lKDAxNzc3MDApLCAiKmwiLCBtNjgwMjB1cHxjcHUzMnxtY2YgfSwKLXsidHN0bCIsCW9uZSgwMDQ1MjAwKSwJb25lKDAxNzc3MDApLCAiJGwiLCBtNjgwMDB1cCB9LAotCi17InVubGsiLAlvbmUoMDA0NzEzMCksCW9uZSgwMTc3NzcwKSwgIkFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJ1bnBrIiwJb25lKDAxMDA2MDApLAlvbmUoMDE3MDc3MCksICJEc0RkI3ciLCBtNjgwMjB1cCB9LAoteyJ1bnBrIiwJb25lKDAxMDA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kI3ciLCBtNjgwMjB1cCB9LAotCi17IndkZGF0YWIiLAlvbmUoMDE3MjAwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2YgfSwKLXsid2RkYXRhdyIsCW9uZSgwMTcyMTAwKSwgICBvbmUoMDE3NzcwMCksICJ+cyIsIG1jZiB9LAoteyJ3ZGRhdGFsIiwJb25lKDAxNzIyMDApLCAgIG9uZSgwMTc3NzAwKSwgIn5zIiwgbWNmIH0sCi0KLX07Ci0KLWNvbnN0IGludCBtNjhrX251bW9wY29kZXMgPSBzaXplb2YgbTY4a19vcGNvZGVzIC8gc2l6ZW9mIG02OGtfb3Bjb2Rlc1swXTsKLQotLyogVGhlc2UgYWxpYXNlcyB1c2VkIHRvIGJlIGluIHRoZSBhYm92ZSB0YWJsZSwgZWFjaCBvbmUgZHVwbGljYXRpbmcKLSAgIGFsbCBvZiB0aGUgZW50cmllcyBmb3IgaXRzIHByaW1hcnkgZXhhY3RseS4gIFRoaXMgdGFibGUgd2FzCi0gICBjb25zdHJ1Y3RlZCBieSBtZWNoYW5pY2FsIHByb2Nlc3Npbmcgb2YgdGhlIG9wY29kZSB0YWJsZSwgd2l0aCBhCi0gICBzbWFsbCBudW1iZXIgb2YgdHdlYWtzIGRvbmUgYnkgaGFuZC4gIFRoZXJlIGFyZSBwcm9iYWJseSBhIGxvdCBtb3JlCi0gICBhbGlhc2VzIGFib3ZlIHRoYXQgY291bGQgYmUgbW92ZWQgZG93biBoZXJlLCBleGNlcHQgZm9yIHZlcnkgbWlub3IKLSAgIGRpZmZlcmVuY2VzLiAgKi8KLQotY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzIG02OGtfb3Bjb2RlX2FsaWFzZXNbXSA9Ci17Ci0gIHsgImFkZCIsCSJhZGR3IiwgfSwKLSAgeyAiYWRkYSIsCSJhZGRhdyIsIH0sCi0gIHsgImFkZGkiLAkiYWRkaXciLCB9LAotICB7ICJhZGRxIiwJImFkZHF3IiwgfSwKLSAgeyAiYWRkeCIsCSJhZGR4dyIsIH0sCi0gIHsgImFzbCIsCSJhc2x3IiwgfSwKLSAgeyAiYXNyIiwJImFzcnciLCB9LAotICB7ICJiaGkiLAkiYmhpdyIsIH0sCi0gIHsgImJscyIsCSJibHN3IiwgfSwKLSAgeyAiYmNjIiwJImJjY3ciLCB9LAotICB7ICJiY3MiLAkiYmNzdyIsIH0sCi0gIHsgImJuZSIsCSJibmV3IiwgfSwKLSAgeyAiYmVxIiwJImJlcXciLCB9LAotICB7ICJidmMiLAkiYnZjdyIsIH0sCi0gIHsgImJ2cyIsCSJidnN3IiwgfSwKLSAgeyAiYnBsIiwJImJwbHciLCB9LAotICB7ICJibWkiLAkiYm1pdyIsIH0sCi0gIHsgImJnZSIsCSJiZ2V3IiwgfSwKLSAgeyAiYmx0IiwJImJsdHciLCB9LAotICB7ICJiZ3QiLAkiYmd0dyIsIH0sCi0gIHsgImJsZSIsCSJibGV3IiwgfSwKLSAgeyAiYnJhIiwJImJyYXciLCB9LAotICB7ICJic3IiLAkiYnNydyIsIH0sCi0gIHsgImJoaWIiLAkiYmhpcyIsIH0sCi0gIHsgImJsc2IiLAkiYmxzcyIsIH0sCi0gIHsgImJjY2IiLAkiYmNjcyIsIH0sCi0gIHsgImJjc2IiLAkiYmNzcyIsIH0sCi0gIHsgImJuZWIiLAkiYm5lcyIsIH0sCi0gIHsgImJlcWIiLAkiYmVxcyIsIH0sCi0gIHsgImJ2Y2IiLAkiYnZjcyIsIH0sCi0gIHsgImJ2c2IiLAkiYnZzcyIsIH0sCi0gIHsgImJwbGIiLAkiYnBscyIsIH0sCi0gIHsgImJtaWIiLAkiYm1pcyIsIH0sCi0gIHsgImJnZWIiLAkiYmdlcyIsIH0sCi0gIHsgImJsdGIiLAkiYmx0cyIsIH0sCi0gIHsgImJndGIiLAkiYmd0cyIsIH0sCi0gIHsgImJsZWIiLAkiYmxlcyIsIH0sCi0gIHsgImJyYWIiLAkiYnJhcyIsIH0sCi0gIHsgImJzcmIiLAkiYnNycyIsIH0sCi0gIHsgImJocyIsCSJiY2N3IiB9LAotICB7ICJiaHNzIiwJImJjY3MiIH0sCi0gIHsgImJoc2IiLAkiYmNjcyIgfSwKLSAgeyAiYmhzdyIsCSJiY2N3IiB9LAotICB7ICJiaHNsIiwJImJjY2wiIH0sCi0gIHsgImJsbyIsCSJiY3N3IiB9LAotICB7ICJibG9zIiwJImJjc3MiIH0sCi0gIHsgImJsb2IiLAkiYmNzcyIgfSwKLSAgeyAiYmxvdyIsCSJiY3N3IiB9LAotICB7ICJibG9sIiwJImJjc2wiIH0sCi0gIHsgImJyIiwJImJyYXciLCB9LAotICB7ICJicnMiLAkiYnJhcyIsIH0sCi0gIHsgImJyYiIsCSJicmFzIiwgfSwKLSAgeyAiYnJ3IiwJImJyYXciLCB9LAotICB7ICJicmwiLAkiYnJhbCIsIH0sCi0gIHsgImpmbmx0IiwJImJjYyIsIH0sCS8qIGFwcGFyZW50bHkgYSBzdW4gYWxpYXMgKi8KLSAgeyAiamZuZ3QiLAkiYmxlIiwgfSwJLyogYXBwYXJlbnRseSBhIHN1biBhbGlhcyAqLwotICB7ICJqZmVxIiwJImJlcXMiLCB9LAkvKiBhcHBhcmVudGx5IGEgc3VuIGFsaWFzICovCi0gIHsgImJjaGdiIiwJImJjaGciLCB9LAotICB7ICJiY2hnbCIsCSJiY2hnIiwgfSwKLSAgeyAiYmNscmIiLAkiYmNsciIsIH0sCi0gIHsgImJjbHJsIiwJImJjbHIiLCB9LAotICB7ICJic2V0YiIsCSJic2V0IiwgfSwKLSAgeyAiYnNldGwiLAkiYnNldCIsIH0sCi0gIHsgImJ0c3RiIiwJImJ0c3QiLCB9LAotICB7ICJidHN0bCIsCSJidHN0IiwgfSwKLSAgeyAiY2FzMiIsCSJjYXMydyIsIH0sCi0gIHsgImNhcyIsCSJjYXN3IiwgfSwKLSAgeyAiY2hrMiIsCSJjaGsydyIsIH0sCi0gIHsgImNoayIsCSJjaGt3IiwgfSwKLSAgeyAiY2xyIiwJImNscnciLCB9LAotICB7ICJjbXAyIiwJImNtcDJ3IiwgfSwKLSAgeyAiY21wYSIsCSJjbXBhdyIsIH0sCi0gIHsgImNtcGkiLAkiY21waXciLCB9LAotICB7ICJjbXBtIiwJImNtcG13IiwgfSwKLSAgeyAiY21wIiwJImNtcHciLCB9LAotICB7ICJkYmNjdyIsCSJkYmNjIiwgfSwKLSAgeyAiZGJjc3ciLAkiZGJjcyIsIH0sCi0gIHsgImRiZXF3IiwJImRiZXEiLCB9LAotICB7ICJkYmZ3IiwJImRiZiIsIH0sCi0gIHsgImRiZ2V3IiwJImRiZ2UiLCB9LAotICB7ICJkYmd0dyIsCSJkYmd0IiwgfSwKLSAgeyAiZGJoaXciLAkiZGJoaSIsIH0sCi0gIHsgImRibGV3IiwJImRibGUiLCB9LAotICB7ICJkYmxzdyIsCSJkYmxzIiwgfSwKLSAgeyAiZGJsdHciLAkiZGJsdCIsIH0sCi0gIHsgImRibWl3IiwJImRibWkiLCB9LAotICB7ICJkYm5ldyIsCSJkYm5lIiwgfSwKLSAgeyAiZGJwbHciLAkiZGJwbCIsIH0sCi0gIHsgImRidHciLAkiZGJ0IiwgfSwKLSAgeyAiZGJ2Y3ciLAkiZGJ2YyIsIH0sCi0gIHsgImRidnN3IiwJImRidnMiLCB9LAotICB7ICJkYmhzIiwJImRiY2MiLCB9LAotICB7ICJkYmhzdyIsCSJkYmNjIiwgfSwKLSAgeyAiZGJyYSIsCSJkYmYiLCB9LAotICB7ICJkYnJhdyIsCSJkYmYiLCB9LAotICB7ICJ0ZGl2c2wiLAkiZGl2c2wiLCB9LAotICB7ICJkaXZzIiwJImRpdnN3IiwgfSwKLSAgeyAiZGl2dSIsCSJkaXZ1dyIsIH0sCi0gIHsgImV4dCIsCSJleHR3IiwgfSwKLSAgeyAiZXh0YnciLAkiZXh0dyIsIH0sCi0gIHsgImV4dHdsIiwJImV4dGwiLCB9LAotICB7ICJmYm5lcSIsCSJmYm5lIiwgfSwKLSAgeyAiZmJzbmVxIiwJImZic25lIiwgfSwKLSAgeyAiZmRibmVxIiwJImZkYm5lIiwgfSwKLSAgeyAiZmRic25lcSIsCSJmZGJzbmUiLCB9LAotICB7ICJmbW92ZWNyIiwJImZtb3ZlY3J4IiwgfSwKLSAgeyAiZm1vdm0iLAkiZm1vdmVtIiwgfSwKLSAgeyAiZnNuZXEiLAkiZnNuZSIsIH0sCi0gIHsgImZzc25lcSIsCSJmc3NuZSIsIH0sCi0gIHsgImZ0cmFwbmVxIiwJImZ0cmFwbmUiLCB9LAotICB7ICJmdHJhcHNuZXEiLCAiZnRyYXBzbmUiLCB9LAotICB7ICJmam5lcSIsCSJmam5lIiwgfSwKLSAgeyAiZmpzbmVxIiwJImZqc25lIiwgfSwKLSAgeyAiam1wbCIsCSJqbXAiLCB9LAotICB7ICJqbXBzIiwJImptcCIsIH0sCi0gIHsgImpzcmwiLAkianNyIiwgfSwKLSAgeyAianNycyIsCSJqc3IiLCB9LAotICB7ICJsZWFsIiwJImxlYSIsIH0sCi0gIHsgImxzbCIsCSJsc2x3IiwgfSwKLSAgeyAibHNyIiwJImxzcnciLCB9LAotICB7ICJtYWMiLAkibWFjdyIgfSwKLSAgeyAibW92ZWEiLAkibW92ZWF3IiwgfSwKLSAgeyAibW92ZW0iLAkibW92ZW13IiwgfSwKLSAgeyAibW92bWwiLAkibW92ZW1sIiwgfSwKLSAgeyAibW92bXciLAkibW92ZW13IiwgfSwKLSAgeyAibW92bSIsCSJtb3ZlbXciLCB9LAotICB7ICJtb3ZlcCIsCSJtb3ZlcHciLCB9LAotICB7ICJtb3ZwdyIsCSJtb3ZlcHciLCB9LAotICB7ICJtb3ZlcyIsCSJtb3Zlc3ciIH0sCi0gIHsgIm11bHMiLAkibXVsc3ciLCB9LAotICB7ICJtdWx1IiwJIm11bHV3IiwgfSwKLSAgeyAibXNhYyIsCSJtc2FjdyIgfSwKLSAgeyAibmJjZGIiLAkibmJjZCIgfSwKLSAgeyAibmVnIiwJIm5lZ3ciLCB9LAotICB7ICJuZWd4IiwJIm5lZ3h3IiwgfSwKLSAgeyAibm90IiwJIm5vdHciLCB9LAotICB7ICJwZWFsIiwJInBlYSIsIH0sCi0gIHsgInJvbCIsCSJyb2x3IiwgfSwKLSAgeyAicm9yIiwJInJvcnciLCB9LAotICB7ICJyb3hsIiwJInJveGx3IiwgfSwKLSAgeyAicm94ciIsCSJyb3hydyIsIH0sCi0gIHsgInNiY2RiIiwJInNiY2QiLCB9LAotICB7ICJzY2NiIiwJInNjYyIsIH0sCi0gIHsgInNjc2IiLAkic2NzIiwgfSwKLSAgeyAic2VxYiIsCSJzZXEiLCB9LAotICB7ICJzZmIiLAkic2YiLCB9LAotICB7ICJzZ2ViIiwJInNnZSIsIH0sCi0gIHsgInNndGIiLAkic2d0IiwgfSwKLSAgeyAic2hpYiIsCSJzaGkiLCB9LAotICB7ICJzbGViIiwJInNsZSIsIH0sCi0gIHsgInNsc2IiLAkic2xzIiwgfSwKLSAgeyAic2x0YiIsCSJzbHQiLCB9LAotICB7ICJzbWliIiwJInNtaSIsIH0sCi0gIHsgInNuZWIiLAkic25lIiwgfSwKLSAgeyAic3BsYiIsCSJzcGwiLCB9LAotICB7ICJzdGIiLAkic3QiLCB9LAotICB7ICJzdmNiIiwJInN2YyIsIH0sCi0gIHsgInN2c2IiLAkic3ZzIiwgfSwKLSAgeyAic2ZnZSIsCSJzZ2UiLCB9LAotICB7ICJzZmd0IiwJInNndCIsIH0sCi0gIHsgInNmbGUiLAkic2xlIiwgfSwKLSAgeyAic2ZsdCIsCSJzbHQiLCB9LAotICB7ICJzZm5lcSIsCSJzbmUiLCB9LAotICB7ICJzdWJhIiwJInN1YmF3IiwgfSwKLSAgeyAic3ViaSIsCSJzdWJpdyIsIH0sCi0gIHsgInN1YnEiLAkic3VicXciLCB9LAotICB7ICJzdWIiLAkic3VidyIsIH0sCi0gIHsgInN1YngiLAkic3VieHciLCB9LAotICB7ICJzd2FwdyIsCSJzd2FwIiwgfSwKLSAgeyAidGFzYiIsCSJ0YXMiLCB9LAotICB7ICJ0cGNjIiwJInRyYXBjYyIsIH0sCi0gIHsgInRjYyIsCSJ0cmFwY2MiLCB9LAotICB7ICJ0c3QiLAkidHN0dyIsIH0sCi0gIHsgImpicmEiLAkianJhIiwgfSwKLSAgeyAiamJoaSIsCSJqaGkiLCB9LAotICB7ICJqYmxzIiwJImpscyIsIH0sCi0gIHsgImpiY2MiLAkiamNjIiwgfSwKLSAgeyAiamJjcyIsCSJqY3MiLCB9LAotICB7ICJqYm5lIiwJImpuZSIsIH0sCi0gIHsgImpiZXEiLAkiamVxIiwgfSwKLSAgeyAiamJ2YyIsCSJqdmMiLCB9LAotICB7ICJqYnZzIiwJImp2cyIsIH0sCi0gIHsgImpicGwiLAkianBsIiwgfSwKLSAgeyAiamJtaSIsCSJqbWkiLCB9LAotICB7ICJqYmdlIiwJImpnZSIsIH0sCi0gIHsgImpibHQiLAkiamx0IiwgfSwKLSAgeyAiamJndCIsCSJqZ3QiLCB9LAotICB7ICJqYmxlIiwJImpsZSIsIH0sCi0gIHsgIm1vdnFsIiwJIm1vdmVxIiwgfSwKLSAgeyAibW92ZXFsIiwJIm1vdmVxIiwgfSwKLSAgeyAibW92bCIsCSJtb3ZlbCIsIH0sCi0gIHsgIm1vdnEiLAkibW92ZXEiLCB9LAotICB7ICJtb3ZhbCIsCSJtb3ZlYWwiLCB9LAotICB7ICJtb3ZhdyIsCSJtb3ZlYXciLCB9LAotICB7ICJtb3ZiIiwJIm1vdmViIiwgfSwKLSAgeyAibW92YyIsCSJtb3ZlYyIsIH0sCi0gIHsgIm1vdmVjbCIsCSJtb3ZlYyIsIH0sCi0gIHsgIm1vdnBsIiwJIm1vdmVwbCIsIH0sCi0gIHsgIm1vdnciLAkibW92ZXciLCB9LAotICB7ICJtb3ZzYiIsCSJtb3Zlc2IiLCB9LAotICB7ICJtb3ZzbCIsCSJtb3Zlc2wiLCB9LAotICB7ICJtb3ZzdyIsCSJtb3Zlc3ciLCB9LAotCi0gIHsgInRkaXZ1bCIsCSJkaXZ1bCIsIH0sCS8qIGZvciBtNjhrLXN2cjQgKi8KLSAgeyAiZm1vdmIiLAkiZm1vdmViIiwgfSwKLSAgeyAiZnNtb3ZiIiwJImZzbW92ZWIiLCB9LAotICB7ICJmZG1vdmIiLAkiZmRtb3ZlYiIsIH0sCi0gIHsgImZtb3ZkIiwJImZtb3ZlZCIsIH0sCi0gIHsgImZzbW92ZCIsCSJmc21vdmVkIiwgfSwKLSAgeyAiZm1vdmwiLAkiZm1vdmVsIiwgfSwKLSAgeyAiZnNtb3ZsIiwJImZzbW92ZWwiLCB9LAotICB7ICJmZG1vdmwiLAkiZmRtb3ZlbCIsIH0sCi0gIHsgImZtb3ZwIiwJImZtb3ZlcCIsIH0sCi0gIHsgImZzbW92cCIsCSJmc21vdmVwIiwgfSwKLSAgeyAiZmRtb3ZwIiwJImZkbW92ZXAiLCB9LAotICB7ICJmbW92cyIsCSJmbW92ZXMiLCB9LAotICB7ICJmc21vdnMiLAkiZnNtb3ZlcyIsIH0sCi0gIHsgImZkbW92cyIsCSJmZG1vdmVzIiwgfSwKLSAgeyAiZm1vdnciLAkiZm1vdmV3IiwgfSwKLSAgeyAiZnNtb3Z3IiwJImZzbW92ZXciLCB9LAotICB7ICJmZG1vdnciLAkiZmRtb3ZldyIsIH0sCi0gIHsgImZtb3Z4IiwJImZtb3ZleCIsIH0sCi0gIHsgImZzbW92eCIsCSJmc21vdmV4IiwgfSwKLSAgeyAiZmRtb3Z4IiwJImZkbW92ZXgiLCB9LAotICB7ICJmbW92Y3IiLAkiZm1vdmVjciIsIH0sCi0gIHsgImZtb3ZjcngiLAkiZm1vdmVjcngiLCB9LAotICB7ICJmdGVzdGIiLAkiZnRzdGIiLCB9LAotICB7ICJmdGVzdGQiLAkiZnRzdGQiLCB9LAotICB7ICJmdGVzdGwiLAkiZnRzdGwiLCB9LAotICB7ICJmdGVzdHAiLAkiZnRzdHAiLCB9LAotICB7ICJmdGVzdHMiLAkiZnRzdHMiLCB9LAotICB7ICJmdGVzdHciLAkiZnRzdHciLCB9LAotICB7ICJmdGVzdHgiLAkiZnRzdHgiLCB9LAotfTsKLQotY29uc3QgaW50IG02OGtfbnVtYWxpYXNlcyA9Ci0gIHNpemVvZiBtNjhrX29wY29kZV9hbGlhc2VzIC8gc2l6ZW9mIG02OGtfb3Bjb2RlX2FsaWFzZXNbMF07CmRpZmYgLS1naXQgYS9vcGNvZGVzL204OGstZGlzLmMgYi9vcGNvZGVzL204OGstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjZiODcuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tODhrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qIFByaW50IGluc3RydWN0aW9ucyBmb3IgdGhlIE1vdG9yb2xhIDg4MDAwLCBmb3IgR0RCIGFuZCBHTlUgQmludXRpbHMuCi0gICBDb3B5cmlnaHQgKGMpIDE5ODYsIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF0YSBHZW5lcmFsIENvcnBvcmF0aW9uLCBOb3ZlbWJlciAxOTg5LgotICAgUGFydGlhbGx5IGRlcml2ZWQgZnJvbSBhbiBlYXJsaWVyIHByaW50Y21kLmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgdGhlIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvbTg4ay5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1JTlNUQUIgICpoYXNodGFibGVbSEFTSFZBTF0gPSB7MH07Ci0KLXN0YXRpYyBpbnQKLW04OGtkaXMgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgbG9uZywgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRvcCBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBPUFNQRUMgKiwKLQkJIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEsIGludCkpOwotCi1zdGF0aWMgdm9pZAotaW5pdF9kaXNhc20gUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotaW5zdGFsbCBQQVJBTVMgKChJTlNUQUIgKmluc3RwdHIpKTsKLQotLyoKLSoJCURpc2Fzc2VtYmxlIGFuIE04ODAwMCBJbnN0cnVjdGlvbgotKgotKgotKiAgICAgICBUaGlzIG1vZHVsZSBkZWNvZGVzIHRoZSBpbnN0cnVjdGlvbiBhdCBtZW1hZGRyLgotKgotKgkJCVJldmlzaW9uIEhpc3RvcnkKLSoKLSogICAgICAgUmV2aXNpb24gMS4wICAgIDExLzA4Lzg1ICAgICAgICBDcmVhdGlvbiBkYXRlIGJ5IE1vdG9yb2xhCi0qCQkJMDUvMTEvODkJUi4gVHJhd2ljayBhZGFwdGVkIHRvIEdEQiBpbnRlcmZhY2UuCi0qCQkJMDcvMTIvOTMJSWFuIExhbmNlIFRheWxvciB1cGRhdGVkIHRvCi0qCQkJCQliaW51dGlscyBpbnRlcmZhY2UuCi0qLwotCi1pbnQKLXByaW50X2luc25fbTg4ayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIEluc3RydWN0aW9uIGFkZHJlc3NlcyBtYXkgaGF2ZSBsb3cgdHdvIGJpdHMgc2V0LiBDbGVhciB0aGVtLgkqLwotICBtZW1hZGRyICY9fiAoYmZkX3ZtYSkgMzsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBtODhrZGlzIChtZW1hZGRyLCBiZmRfZ2V0YjMyIChidWZmZXIpLCBpbmZvKTsKLX0KLQotLyoKLSAqIGRpc2Fzc2VtYmxlIHRoZSBpbnN0cnVjdGlvbiBpbiAnaW5zdHJ1Y3Rpb24nLgotICogJ3BjJyBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgdGhpcyBpbnN0cnVjdGlvbiwgaXQgd2lsbAotICogICBiZSB1c2VkIHRvIHByaW50IHRoZSB0YXJnZXQgYWRkcmVzcyBpZiB0aGlzIGlzIGEgcmVsYXRpdmUganVtcCBvciBjYWxsCi0gKiB0aGUgZGlzYXNzZW1ibGVkIGluc3RydWN0aW9uIGlzIHdyaXR0ZW4gdG8gJ2luZm8nLgotICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIGluc3RydWN0aW9uIGluIGJ5dGVzLgotICovCi0KLXN0YXRpYyBpbnQKLW04OGtkaXMgKHBjLCBpbnN0cnVjdGlvbiwgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN0YXRpYyBpbnQgaWhhc2h0YWJfaW5pdGlhbGl6ZWQgPSAwOwotICB1bnNpZ25lZCBpbnQgb3Bjb2RlOwotICBJTlNUQUIgKmVudHJ5X3B0cjsKLSAgaW50IG9wbWFzazsKLSAgdW5zaWduZWQgaW50IGNsYXNzOwotCi0gIGlmICghIGloYXNodGFiX2luaXRpYWxpemVkKQotICAgIGluaXRfZGlzYXNtICgpOwotCi0gIC8qIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgbWFzayB0byBpc29sYXRlIHRoZSBvcGNvZGUgKi8KLSAgb3BtYXNrID0gREVGTUFTSzsKLSAgY2xhc3MgPSBpbnN0cnVjdGlvbiAmIERFRk1BU0s7Ci0gIGlmICgoY2xhc3MgPj0gU0ZVMCkgJiYgKGNsYXNzIDw9IFNGVTcpKQotICAgIHsKLSAgICAgIGlmIChpbnN0cnVjdGlvbiA8IFNGVTEpCi0Jb3BtYXNrID0gQ1RSTE1BU0s7Ci0gICAgICBlbHNlCi0Jb3BtYXNrID0gU0ZVTUFTSzsKLSAgICB9Ci0gIGVsc2UgaWYgKGNsYXNzID09IFJSUikKLSAgICBvcG1hc2sgPSBSUlJNQVNLOwotICBlbHNlIGlmIChjbGFzcyA9PSBSUkkxMCkKLSAgICBvcG1hc2sgPSBSUkkxME1BU0s7Ci0KLSAgLyogaXNvbGF0ZSB0aGUgb3Bjb2RlICovCi0gIG9wY29kZSA9IGluc3RydWN0aW9uICYgb3BtYXNrOwotCi0gIC8qIHNlYXJjaCB0aGUgaGFzaCB0YWJsZSB3aXRoIHRoZSBpc29sYXRlZCBvcGNvZGUgKi8KLSAgZm9yIChlbnRyeV9wdHIgPSBoYXNodGFibGVbb3Bjb2RlICUgSEFTSFZBTF07Ci0gICAgICAgKGVudHJ5X3B0ciAhPSBOVUxMKSAmJiAoZW50cnlfcHRyLT5vcGNvZGUgIT0gb3Bjb2RlKTsKLSAgICAgICBlbnRyeV9wdHIgPSBlbnRyeV9wdHItPm5leHQpCi0gICAgOwotCi0gIGlmIChlbnRyeV9wdHIgPT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIndvcmRcdCUwOHgiLCBpbnN0cnVjdGlvbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgZW50cnlfcHRyLT5tbmVtb25pYyk7Ci0gICAgICBwcmludG9wIChpbmZvLCAmKGVudHJ5X3B0ci0+b3AxKSwgaW5zdHJ1Y3Rpb24sIHBjLCAxKTsKLSAgICAgIHByaW50b3AgKGluZm8sICYoZW50cnlfcHRyLT5vcDIpLCBpbnN0cnVjdGlvbiwgcGMsIDApOwotICAgICAgcHJpbnRvcCAoaW5mbywgJihlbnRyeV9wdHItPm9wMyksIGluc3RydWN0aW9uLCBwYywgMCk7Ci0gICAgfQotCi0gIHJldHVybiA0OwotfQotDAotLyoKLSogICAgICAgICAgICAgICAgICAgICAgRGVjb2RlIGFuIE9wZXJhbmQgb2YgYW4gSW5zdHJ1Y3Rpb24KLSoKLSoJCQlGdW5jdGlvbmFsIERlc2NyaXB0aW9uCi0qCi0qICAgICAgIFRoaXMgbW9kdWxlIGZvcm1hdHMgYW5kIHdyaXRlcyBhbiBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uIHRvIGluZm8KLSogICAgICAgYmFzZWQgb24gdGhlIG9wZXJhbmQgc3BlY2lmaWNhdGlvbi4gIFdoZW4gdGhlIGZpcnN0IGZsYWcgaXMgc2V0IHRoaXMKLSogICAgICAgaXMgdGhlIGZpcnN0IG9wZXJhbmQgb2YgYW4gaW5zdHJ1Y3Rpb24uICBVbmRlZmluZWQgb3BlcmFuZCB0eXBlcwotKiAgICAgICBjYXVzZSBhIDxkaXMgZXJyb3I+IG1lc3NhZ2UuCi0qCi0qCQkJUGFyYW1ldGVycwotKglkaXNhc3NlbWJsZV9pbmZvCXdoZXJlIHRoZSBvcGVyYW5kIG1heSBiZSBwcmludGVkCi0qICAgICAgIE9QU1BFQyAgKm9wcHRyICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3BlcmFuZCBzcGVjaWZpY2F0aW9uCi0qICAgICAgIFVJTlQgICAgaW5zdCAgICAgICAgICAgIEluc3RydWN0aW9uIGZyb20gd2hpY2ggb3BlcmFuZCBpcyBleHRyYWN0ZWQKLSoJVUlOVCAgICBwYwkJUEMgb2YgaW5zdHJ1Y3Rpb247IHVzZWQgZm9yIHBjLXJlbGF0aXZlIGRpc3AuCi0qICAgICAgIGludCAgICAgZmlyc3QgICAgICAgICAgIEZsYWcgd2hpY2ggaWYgbm9uemVybyBpbmRpY2F0ZXMgdGhlIGZpcnN0Ci0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmQgb2YgYW4gaW5zdHJ1Y3Rpb24KLSoKLSoJCQlPdXRwdXQKLSoKLSogICAgICAgVGhlIG9wZXJhbmQgc3BlY2lmaWVkIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnN0cnVjdGlvbiBhbmQgaXMKLSogICAgICAgd3JpdHRlbiB0byBidWYgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQuIFRoZSBvcGVyYW5kIGlzIHByZWNlZGVkCi0qICAgICAgIGJ5IGEgY29tbWEgaWYgaXQgaXMgbm90IHRoZSBmaXJzdCBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uIGFuZCBpdAotKiAgICAgICBpcyBub3QgYSByZWdpc3RlciBpbmRpcmVjdCBmb3JtLiAgUmVnaXN0ZXJzIGFyZSBwcmVjZWRlZCBieSAncicgYW5kCi0qICAgICAgIGhleCB2YWx1ZXMgYnkgJzB4Jy4KLSoKLSoJCQlSZXZpc2lvbiBIaXN0b3J5Ci0qCi0qICAgICAgIFJldmlzaW9uIDEuMCAgICAxMS8wOC84NSAgICAgICAgQ3JlYXRpb24gZGF0ZQotKi8KLQotc3RhdGljIHZvaWQKLXByaW50b3AgKGluZm8sIG9wcHRyLCBpbnN0LCBwYywgZmlyc3QpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBPUFNQRUMgKm9wcHRyOwotICAgICB1bnNpZ25lZCBsb25nIGluc3Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBmaXJzdDsKLXsKLSAgaW50IGV4dHJhY3RlZF9maWVsZDsKLSAgY2hhciAqY29uZF9tYXNrX3N5bTsKLQotICBpZiAob3BwdHItPndpZHRoID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmICghIGZpcnN0KQotICAgIHsKLSAgICAgIHN3aXRjaCAob3BwdHItPnR5cGUpCi0JewotCWNhc2UgUkVHU0M6Ci0JY2FzZSBDT05UOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKG9wcHRyLT50eXBlKQotICAgIHsKLSAgICBjYXNlIENSUkVHOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJjciVkIiwKLQkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRkNSUkVHOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmY3IlZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFR1NDOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbciVkXSIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFRzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciVkIiwKLQkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgWFJFRzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAieCVkIiwKLQkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSEVYOgotICAgICAgZXh0cmFjdGVkX2ZpZWxkID0gVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKTsKLSAgICAgIGlmIChleHRyYWN0ZWRfZmllbGQgPT0gMCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjAiKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JTAyeCIsIGV4dHJhY3RlZF9maWVsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVDOgotICAgICAgZXh0cmFjdGVkX2ZpZWxkID0gVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBleHRyYWN0ZWRfZmllbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPTkRNQVNLOgotICAgICAgZXh0cmFjdGVkX2ZpZWxkID0gVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKTsKLSAgICAgIHN3aXRjaCAoZXh0cmFjdGVkX2ZpZWxkICYgMHgwZikKLQl7Ci0JY2FzZSAweDE6IGNvbmRfbWFza19zeW0gPSAiZ3QwIjsgYnJlYWs7Ci0JY2FzZSAweDI6IGNvbmRfbWFza19zeW0gPSAiZXEwIjsgYnJlYWs7Ci0JY2FzZSAweDM6IGNvbmRfbWFza19zeW0gPSAiZ2UwIjsgYnJlYWs7Ci0JY2FzZSAweGM6IGNvbmRfbWFza19zeW0gPSAibHQwIjsgYnJlYWs7Ci0JY2FzZSAweGQ6IGNvbmRfbWFza19zeW0gPSAibmUwIjsgYnJlYWs7Ci0JY2FzZSAweGU6IGNvbmRfbWFza19zeW0gPSAibGUwIjsgYnJlYWs7Ci0JZGVmYXVsdDogY29uZF9tYXNrX3N5bSA9IE5VTEw7IGJyZWFrOwotCX0KLSAgICAgIGlmIChjb25kX21hc2tfc3ltICE9IE5VTEwpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGNvbmRfbWFza19zeW0pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXgiLCBleHRyYWN0ZWRfZmllbGQpOwotICAgICAgYnJlYWs7Ci0JCQkKLSAgICBjYXNlIFBDUkVMOgotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JKHBjICsgKDQgKiAoU0VYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKSkpLAotCSBpbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT05UOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCxyJWQiLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCA1KSwKLQkJCSAgICAgVUVYVCAoaW5zdCwgKG9wcHRyLT5vZmZzZXQpICsgNSwgNSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZDwlZD4iLAotCQkJICAgICAgVUVYVCAoaW5zdCwgKG9wcHRyLT5vZmZzZXQpICsgNSwgNSksCi0JCQkgICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCA1KSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oIiMgPGRpcyBlcnJvcjogJTA4eD4iKSwgaW5zdCk7Ci0gICAgfQotfQotCi0vKgotKiAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgRGlzYXNzZW1ibGVyIEluc3RydWN0aW9uIFRhYmxlCi0qCi0qICAgICAgIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUgYW5kIGluc3RydWN0aW9uIHRhYmxlIGZvciB0aGUgZGlzYXNzZW1ibGVyLgotKiAgICAgICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgb25jZSBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gZGlzYXNtKCkuCi0qCi0qCQkJUGFyYW1ldGVycwotKgotKgkJCU91dHB1dAotKgotKiAgICAgICBJZiB0aGUgZGVidWcgb3B0aW9uIGlzIHNlbGVjdGVkLCBjZXJ0YWluIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGhhc2hpbmcKLSogICAgICAgZGlzdHJpYnV0aW9uIGFyZSB3cml0dGVuIHRvIHN0ZG91dC4KLSoKLSoJCQlSZXZpc2lvbiBIaXN0b3J5Ci0qCi0qICAgICAgIFJldmlzaW9uIDEuMCAgICAxMS8wOC84NSAgICAgICAgQ3JlYXRpb24gZGF0ZQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfZGlzYXNtICgpCi17Ci0gICBpbnQgaSwgc2l6ZTsKLQotICAgZm9yIChpID0gMDsgaSA8IEhBU0hWQUw7IGkrKykKLSAgICAgaGFzaHRhYmxlW2ldID0gTlVMTDsKLQotICAgc2l6ZSA9IHNpemVvZiAoaW5zdHJ1Y3Rpb25zKSAvIHNpemVvZiAoSU5TVEFCKTsKLSAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgIGluc3RhbGwgKCZpbnN0cnVjdGlvbnNbaV0pOwotfQotCi0vKgotKiAgICAgICBJbnNlcnQgYW4gaW5zdHJ1Y3Rpb24gaW50byB0aGUgZGlzYXNzZW1ibGVyIHRhYmxlIGJ5IGhhc2hpbmcgdGhlCi0qICAgICAgIG9wY29kZSBhbmQgaW5zZXJ0aW5nIGl0IGludG8gdGhlIGxpbmtlZCBsaXN0IGZvciB0aGF0IGhhc2ggdmFsdWUuCi0qCi0qCQkJUGFyYW1ldGVycwotKgotKiAgICAgICBJTlNUQUIgKmluc3RwdHIgICAgICAgICBQb2ludGVyIHRvIHRoZSBlbnRyeSBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgaW5zdGFsbGVkCi0qCi0qICAgICAgIFJldmlzaW9uIDEuMCAgICAxMS8wOC84NSAgICAgICAgQ3JlYXRpb24gZGF0ZQotKgkJCTA1LzExLzg5CVIuIFRSQVdJQ0sgQURBUFRFRCBGUk9NIE1PVE9ST0xBCi0qLwotCi1zdGF0aWMgdm9pZAotaW5zdGFsbCAoaW5zdHB0cikKLSAgICAgSU5TVEFCICppbnN0cHRyOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpID0gKGluc3RwdHItPm9wY29kZSkgJSBIQVNIVkFMOwotICBpbnN0cHRyLT5uZXh0ID0gaGFzaHRhYmxlW2ldOwotICBoYXNodGFibGVbaV0gPSBpbnN0cHRyOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tYWtlZmlsZS52bXMgYi9vcGNvZGVzL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4NzA0OC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGxpYm9wY29kZXMgdW5kZXIgb3BlblZNUyBWQVggYW5kIEFscGhhCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQotIwotIwotaWZlcSAoJChBUkNIKSxhbHBoYSkKLU9CSlM9YWxwaGEtZGlzLm9iaixhbHBoYS1vcGMub2JqLGRpcy1idWYub2JqLGRpc2Fzc2VtYmxlLm9iagotRk9STUFUPU9CSl9FVkFYCi1BUkNIREVGPSJBUkNIX2FscGhhIgotZWxzZQotT0JKUz12YXgtZGlzLm9iaixkaXMtYnVmLm9iaixkaXNhc3NlbWJsZS5vYmoKLUZPUk1BVD1PQkpfVkFYCi1BUkNIREVGPSJBUkNIX3ZheCIKLWVuZGlmCi0KLWlmZXEgKCQoQ0MpLGdjYykKLURFRlM9L2RlZmluZT0oJChGT1JNQVQpKQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSxbLS5iZmRdKSQoREVGUykKLWVsc2UKLURFRlM9L2RlZmluZT0oJChGT1JNQVQpLCJjb25zdD0iKQotQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSxbLS5iZmRdKSQoREVGUylcCi0vd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMsbG9uZ2V4dGVybikKLWVuZGlmCi0KLWxpYm9wY29kZXMub2xiOiBzeXNkZXAuaCAkKE9CSlMpCi0JcHVyZ2UKLQlsaWIvY3JlYXRlIGxpYm9wY29kZXMgKi5vYmoKLQotZGlzYXNzZW1ibGUub2JqOiBkaXNhc3NlbWJsZS5jCi0JJChDQykkKENGTEFHUykvZGVmaW5lPSgkKEFSQ0hERUYpKSAkPAotCi1zeXNkZXAuaDogWy0uYmZkLmhvc3RzXSQoQVJDSCl2bXMuaAotCSQoQ1ApICQ8ICRACi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgKi5vYmo7Ci0JJChSTSkgc3lzZGVwLmg7Ci0JJChSTSkgbGlib3Bjb2Rlcy5vbGI7CmRpZmYgLS1naXQgYS9vcGNvZGVzL21jb3JlLWRpcy5jIGIvb3Bjb2Rlcy9tY29yZS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2MTJhMi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21jb3JlLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIE1vdG9yb2xsYSBNKkNvcmUgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIFNUQVRJQ19UQUJMRQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2luY2x1ZGUgIm1jb3JlLW9wYy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotLyogTWFzayBmb3IgZWFjaCBtY29yZV9vcGNsYXNzOiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGltc2tbXSA9Ci17Ci0gICAgLyogTzAgICovIDB4RkZGRiwKLSAgICAvKiBPVCAgKi8gMHhGRkZDLAotICAgIC8qIE8xICAqLyAweEZGRjAsCi0gICAgLyogT0MgICovIDB4RkZFMCwKLSAgICAvKiBPMiAgKi8gMHhGRjAwLAotICAgIC8qIFgxICAqLyAweEZGRjAsCi0gICAgLyogT0kgICovIDB4RkUwMCwKLSAgICAvKiBPQiAgKi8gMHhGRTAwLAotCSAgICAgIAotICAgIC8qIE9NYSAqLyAweEZGRjAsCi0gICAgLyogU0kgICovIDB4RkUwMCwKLSAgICAvKiBJNyAgKi8gMHhGODAwLAotICAgIC8qIExTICAqLyAweEYwMDAsCi0gICAgLyogQlIgICovIDB4RjgwMCwKLSAgICAvKiBCTCAgKi8gMHhGRjAwLAotICAgIC8qIExSICAqLyAweEYwMDAsCi0gICAgLyogTEogICovIDB4RkYwMCwKLQkgICAgICAKLSAgICAvKiBSTSAgKi8gMHhGRkYwLAotICAgIC8qIFJRICAqLyAweEZGRjAsCi0gICAgLyogSlNSICovIDB4RkZGMCwKLSAgICAvKiBKTVAgKi8gMHhGRkYwLAotICAgIC8qIE9CUmEqLyAweEZGRjAsCi0gICAgLyogT0JSYiovIDB4RkY4MCwKLSAgICAvKiBPQlJjKi8gMHhGRjAwLAotICAgIC8qIE9CUjIqLyAweEZFMDAsCi0JICAgICAgCi0gICAgLyogTzFSMSovIDB4RkZGMCwKLSAgICAvKiBPTWIgKi8gMHhGRjgwLAotICAgIC8qIE9NYyAqLyAweEZGMDAsCi0gICAgLyogU0lhICovIDB4RkUwMCwKLQotLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLwotICAvKiBNVUxTSCAqLyAweEZGMDAsCi0vKiBlbmQtc2FuaXRpemUtbTM0MCAqLwotCQkgCi0gICAgLyogSkMgICovIDAsCQkvKiBKQyxKVSxKTCBkb24ndCBhcHBlYXIgaW4gb2JqZWN0ICovCi0gICAgLyogSlUgICovIDAsCi0gICAgLyogSkwgICovIDAsCi0gICAgLyogUlNJICovIDAsCi0gICAgLyogRE8yMSovIDAsCi0gICAgLyogT0IyICovIDAgCQkvKiBPQjIgd29uJ3QgYXBwZWFyIGluIG9iamVjdC4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogZ3JuYW1lW10gPQotewotICJyMCIsICAicjEiLCAgInIyIiwgICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLAotICJyOCIsICAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciBYW10gPSAiPz8iOwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNybmFtZVtdID0KLXsKLSAgInBzciIsICAidmJyIiwgImVwc3IiLCAiZnBzciIsICJlcGMiLCAgImZwYyIsICAic3MwIiwgICJzczEiLAotICAic3MyIiwgICJzczMiLCAic3M0IiwgICJnY3IiLCAgImdzciIsICAgICBYLCAgICAgIFgsICAgICAgWCwKLSAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgWCwgICAgICBYLCAgICAgIFgsCi0gICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgIFgsICAgICAgWCwgICAgICBYCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaXNpeltdID0geyAyLCAwLCAxLCAwIH07Ci0KLWludCAKLXByaW50X2luc25fbWNvcmUgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICB1bnNpZ25lZCBjaGFyICAgICAgIGlieXRlc1s0XTsKLSAgZnByaW50Zl9mdHlwZSAgICAgICBmcHJpbnRmID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICB2b2lkICogICAgICAgICAgICAgIHN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgdW5zaWduZWQgc2hvcnQgICAgICBpbnN0OwotICBtY29yZV9vcGNvZGVfaW5mbyAqIG9wOwotICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKLQotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotCi0gIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGlieXRlcywgMiwgaW5mbyk7Ci0KLSAgaWYgKHN0YXR1cyAhPSAwKSAKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLS8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8KLSAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLS8qIGVuZC1zYW5pdGl6ZS1tMzQwICovCi0gICAgaW5zdCA9IChpYnl0ZXNbMF0gPDwgOCkgfCBpYnl0ZXNbMV07Ci0vKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovCi0gIGVsc2UgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSAgICBpbnN0ID0gKGlieXRlc1sxXSA8PCA4KSB8IGlieXRlc1swXTsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotLyogZW5kLXNhbml0aXplLW0zNDAgKi8KLQotICAvKiBKdXN0IGEgbGluZWFyIHNlYXJjaCBvZiB0aGUgdGFibGUuICAqLwotICBmb3IgKG9wID0gbWNvcmVfdGFibGU7IG9wLT5uYW1lICE9IDA7IG9wICsrKQotICAgIGlmIChvcC0+aW5zdCA9PSAoaW5zdCAmIGltc2tbb3AtPm9wY2xhc3NdKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChvcC0+bmFtZSA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgIi5zaG9ydCAweCUwNHgiLCBpbnN0KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lID0gZ3JuYW1lW2luc3QgJiAweDBGXTsKLSAgICAgIAotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAob3AtPm9wY2xhc3MpCi0JewotCWNhc2UgTzA6IGJyZWFrOwotCWNhc2UgT1Q6IGZwcmludGYgKHN0cmVhbSwgIlx0JWQiLCBpbnN0ICYgMHgzKTsgYnJlYWs7Ci0JY2FzZSBPMToKLQljYXNlIEpNUDoKLQljYXNlIEpTUjogZnByaW50ZiAoc3RyZWFtLCAiXHQlcyIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9DOiAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJXMiLCBuYW1lLCBjcm5hbWVbKGluc3QgPj4gNCkgJiAweDFGXSk7IGJyZWFrOwotCWNhc2UgTzFSMTogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgcjEiLCBuYW1lKTsgYnJlYWs7Ci0vKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovCi0JY2FzZSBNVUxTSDoKLS8qIGVuZC1zYW5pdGl6ZS1tMzQwICovCi0JY2FzZSBPMjogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJXMiLCBuYW1lLCBncm5hbWVbKGluc3QgPj4gNCkgJiAweEZdKTsgYnJlYWs7Ci0JY2FzZSBYMTogZnByaW50ZiAoc3RyZWFtLCAiXHRyMSwgJXMiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBPSTogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJWQiLCBuYW1lLCAoKGluc3QgPj4gNCkgJiAweDFGKSArIDEpOyBicmVhazsKLQljYXNlIFJNOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLXIxNSwgKHIwKSIsIG5hbWUpOyBicmVhazsKLQljYXNlIFJROiBmcHJpbnRmIChzdHJlYW0sICJcdHI0LXI3LCAoJXMpIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgT0I6Ci0JY2FzZSBPQlJhOgotCWNhc2UgT0JSYjoKLQljYXNlIE9CUmM6Ci0JY2FzZSBTSToKLQljYXNlIFNJYToKLQljYXNlIE9NYToKLQljYXNlIE9NYjoKLQljYXNlIE9NYzogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJWQiLCBuYW1lLCAoaW5zdCA+PiA0KSAmIDB4MUYpOyBicmVhazsKLQljYXNlIEk3OiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsIChpbnN0ID4+IDQpICYgMHg3Rik7IGJyZWFrOwotCWNhc2UgTFM6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICglcywgJWQpIiwgZ3JuYW1lWyhpbnN0ID4+IDgpICYgMHhGXSwKLQkJCSAgbmFtZSwgKChpbnN0ID4+IDQpICYgMHhGKSA8PCBpc2l6WyhpbnN0ID4+IDEzKSAmIDNdKTsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBCUjoKLQkgIHsKLQkgICAgbG9uZyB2YWwgPSBpbnN0ICYgMHgzRkY7Ci0JICAgIAotCSAgICBpZiAoaW5zdCAmIDB4NDAwKQotCSAgICAgIHZhbCB8PSAweEZGRkZGQzAwOwotCSAgICAKLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQweCV4IiwgbWVtYWRkciArIDIgKyAodmFsPDwxKSk7Ci0JICAgIAotCSAgICBpZiAoc3RyY21wIChvcC0+bmFtZSwgImJzciIpID09IDApCi0JICAgICAgewotCQkvKiBmb3IgYnNyLCB3ZSdsbCB0cnkgdG8gZ2V0IGEgc3ltYm9sIGZvciB0aGUgdGFyZ2V0ICovCi0JCXZhbCA9IG1lbWFkZHIgKyAyICsgKHZhbCA8PCAxKTsKLQkJCi0JCWlmIChpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgJiYgdmFsICE9IDApCi0JCSAgewotCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQvLyAiKTsKLQkJICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAodmFsLCBpbmZvKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEJMOgotCSAgewotCSAgICBsb25nIHZhbDsKLQkgICAgdmFsID0gKGluc3QgJiAweDAwMEYpOwotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAweCV4IiwKLQkJICAgIGdybmFtZVsoaW5zdCA+PiA0KSAmIDB4Rl0sIG1lbWFkZHIgLSAodmFsIDw8IDEpKTsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBMUjoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICAgIAotCSAgICB2YWwgPSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDOwotCSAgICAKLQkgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAodmFsLCBpYnl0ZXMsIDQsIGluZm8pOwotCSAgICBpZiAoc3RhdHVzICE9IDApIAotCSAgICAgIHsKLQkJaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgCi0vKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovCi0JICAgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0JICAgICAgdmFsID0gKGlieXRlc1szXSA8PCAyNCkgfCAoaWJ5dGVzWzJdIDw8IDE2KQotCQl8IChpYnl0ZXNbMV0gPDwgOCkgfCAoaWJ5dGVzWzBdKTsKLQkgICAgZWxzZQotLyogZW5kLXNhbml0aXplLW0zNDAgKi8KLQkgICAgICB2YWwgPSAoaWJ5dGVzWzBdIDw8IDI0KSB8IChpYnl0ZXNbMV0gPDwgMTYpCi0JCXwgKGlieXRlc1syXSA8PCA4KSB8IChpYnl0ZXNbM10pOwotCSAgICAKLQkgICAgLyogUmVtb3ZlZCBbXSBhcm91bmQgbGl0ZXJhbCB2YWx1ZSB0byBtYXRjaCBBQkkgc3ludGF4IDEyLzk1LiAgKi8KLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgMHglWCIsIGdybmFtZVsoaW5zdCA+PiA4KSAmIDB4Rl0sIHZhbCk7Ci0KLQkgICAgaWYgKHZhbCA9PSAwKQotCSAgICAgIGZwcmludGYgKHN0cmVhbSwgIlx0Ly8gZnJvbSBhZGRyZXNzIHBvb2wgYXQgMHgleCIsCi0JCSAgICAgICAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKTsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBMSjoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICAgIAotCSAgICB2YWwgPSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDOwotCSAgICAKLQkgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAodmFsLCBpYnl0ZXMsIDQsIGluZm8pOwotCSAgICBpZiAoc3RhdHVzICE9IDApIAotCSAgICAgIHsKLQkJaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLwotCSAgICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCSAgICAgIHZhbCA9IChpYnl0ZXNbM10gPDwgMjQpIHwgKGlieXRlc1syXSA8PCAxNikKLQkJfCAoaWJ5dGVzWzFdIDw8IDgpIHwgKGlieXRlc1swXSk7Ci0JICAgIGVsc2UKLS8qIGVuZC1zYW5pdGl6ZS1tMzQwICovCi0JICAgICAgdmFsID0gKGlieXRlc1swXSA8PCAyNCkgfCAoaWJ5dGVzWzFdIDw8IDE2KQotCQl8IChpYnl0ZXNbMl0gPDwgOCkgfCAoaWJ5dGVzWzNdKTsKLQkgICAgCi0JICAgIC8qIFJlbW92ZWQgW10gYXJvdW5kIGxpdGVyYWwgdmFsdWUgdG8gbWF0Y2ggQUJJIHN5bnRheCAxMi85NS4gICovCi0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0MHglWCIsIHZhbCk7Ci0JICAgIC8qIEZvciBqbXBpL2pzcmksIHdlJ2xsIHRyeSB0byBnZXQgYSBzeW1ib2wgZm9yIHRoZSB0YXJnZXQuICAqLwotCSAgICBpZiAoaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICYmIHZhbCAhPSAwKQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RyZWFtLCAiXHQvLyAiKTsKLQkJaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGluZm8pOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RyZWFtLCAiXHQvLyBmcm9tIGFkZHJlc3MgcG9vbCBhdCAweCV4IiwKLQkJCSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWRlZmF1bHQ6Ci0JICAvKiBpZiB0aGUgZGlzYXNzZW1ibGVyIGxhZ3MgdGhlIGluc3RydWN0aW9uIHNldCAqLwotCSAgZnByaW50ZiAoc3RyZWFtLCAiXHR1bmRlY29kZWQgb3BlcmFuZHMsIGluc3QgaXMgMHglMDR4IiwgaW5zdCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAKLSAgLyogU2F5IGhvdyBtYW55IGJ5dGVzIHdlIGNvbnN1bWVkPyAqLwotICByZXR1cm4gMjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWNvcmUtb3BjLmggYi9vcGNvZGVzL21jb3JlLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTZmNzhiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWNvcmUtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyogQXNzZW1ibGVyIGluc3RydWN0aW9ucyBmb3IgTW90b3JvbGxhJ3MgTWNvcmUgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLXR5cGVkZWYgZW51bQotewotICBPMCwgICAgT1QsICAgTzEsICAgT0MsICAgTzIsICAgIFgxLCAgICBPSSwgICAgT0IsCi0gIE9NYSwgICBTSSwgICBJNywgICBMUywgICBCUiwgICAgQkwsICAgIExSLCAgICBMSiwKLSAgUk0sICAgIFJRLCAgIEpTUiwgIEpNUCwgIE9CUmEsICBPQlJiLCAgT0JSYywgIE9CUjIsCi0gIE8xUjEsICBPTWIsICBPTWMsICBTSWEsCi0gIC8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8gIAotICBNVUxTSCwKLSAgLyogZW5kLXNhbml0aXplLW0zNDAgKi8gIAotICBKQywgICAgSlUsICAgSkwsICAgUlNJLCAgRE8yMSwgIE9CMgotfQotbWNvcmVfb3BjbGFzczsKLQotdHlwZWRlZiBzdHJ1Y3QgaW5zdAotewotICBjaGFyICogICAgICAgICBuYW1lOwotICBtY29yZV9vcGNsYXNzICBvcGNsYXNzOwotICB1bnNpZ25lZCBjaGFyICB0cmFuc2ZlcjsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdDsKLX0KLW1jb3JlX29wY29kZV9pbmZvOwotCi0jaWZkZWYgREVGSU5FX1RBQkxFCi1tY29yZV9vcGNvZGVfaW5mbyBtY29yZV90YWJsZVtdID0KLXsKLSAgeyAiYmtwdCIsCU8wLAkwLAkweDAwMDAgfSwKLSAgeyAic3luYyIsCU8wLAkwLAkweDAwMDEgfSwKLSAgeyAicnRlIiwJTzAsCTEsCTB4MDAwMiB9LAotICB7ICJyZmUiLAlPMCwJMSwJMHgwMDAyIH0sCi0gIHsgInJmaSIsCU8wLAkxLAkweDAwMDMgfSwKLSAgeyAic3RvcCIsCU8wLAkwLAkweDAwMDQgfSwKLSAgeyAid2FpdCIsCU8wLAkwLAkweDAwMDUgfSwKLSAgeyAiZG96ZSIsCU8wLAkwLAkweDAwMDYgfSwKLSAgLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLwotICB7ICJpZGx5NCIsICAgIE8wLCAgICAgMCwgICAgICAweDAwMDcgfSwKLSAgLyogZW5kLXNhbml0aXplLW0zNDAgKi8KLSAgeyAidHJhcCIsCU9ULAkwLAkweDAwMDggfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBDIC0gMHgwMDBGICovCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAtIDB4MDAxRiAqLwotICB7ICJtdmMiLAlPMSwJMCwJMHgwMDIwIH0sCi0gIHsgIm12Y3YiLAlPMSwJMCwJMHgwMDMwIH0sCi0gIHsgImxkcSIsCVJRLAkwLAkweDAwNDAgfSwKLSAgeyAic3RxIiwJUlEsCTAsCTB4MDA1MCB9LAotICB7ICJsZG0iLAlSTSwJMCwJMHgwMDYwIH0sCi0gIHsgInN0bSIsCVJNLAkwLAkweDAwNzAgfSwKLSAgeyAiZGVjdCIsCU8xLAkwLAkweDAwODAgfSwKLSAgeyAiZGVjZiIsCU8xLAkwLAkweDAwOTAgfSwKLSAgeyAiaW5jdCIsCU8xLAkwLAkweDAwQTAgfSwKLSAgeyAiaW5jZiIsCU8xLAkwLAkweDAwQjAgfSwKLSAgeyAiam1wIiwJSk1QLAkyLAkweDAwQzAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KTVAJMHgwMEMwCi0gIHsgImpzciIsCUpTUiwJMCwJMHgwMEQwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSlNSCTB4MDBFMAotICB7ICJmZjEiLAlPMSwJMCwJMHgwMEUwIH0sCi0gIHsgImJyZXYiLAlPMSwJMCwJMHgwMEYwIH0sCi0gIHsgInh0cmIzIiwJWDEsCTAsCTB4MDEwMCB9LAotICB7ICJ4dHJiMiIsCVgxLAkwLAkweDAxMTAgfSwKLSAgeyAieHRyYjEiLAlYMSwJMCwJMHgwMTIwIH0sCi0gIHsgInh0cmIwIiwJWDEsCTAsCTB4MDEzMCB9LAotICB7ICJ6ZXh0YiIsCU8xLAkwLAkweDAxNDAgfSwKLSAgeyAic2V4dGIiLAlPMSwJMCwJMHgwMTUwIH0sCi0gIHsgInpleHRoIiwJTzEsCTAsCTB4MDE2MCB9LAotICB7ICJzZXh0aCIsCU8xLAkwLAkweDAxNzAgfSwKLSAgeyAiZGVjbHQiLAlPMSwJMCwJMHgwMTgwIH0sCi0gIHsgInRzdG5ieiIsCU8xLAkwLAkweDAxOTAgfSwKLSAgeyAiZGVjZ3QiLAlPMSwJMCwJMHgwMUEwIH0sCi0gIHsgImRlY25lIiwJTzEsCTAsCTB4MDFCMCB9LAotICB7ICJjbHJ0IiwJTzEsCTAsCTB4MDFDMCB9LAotICB7ICJjbHJmIiwJTzEsCTAsCTB4MDFEMCB9LAotICB7ICJhYnMiLAlPMSwJMCwJMHgwMUUwIH0sCi0gIHsgIm5vdCIsCU8xLAkwLAkweDAxRjAgfSwKLSAgeyAibW92dCIsCU8yLAkwLAkweDAyMDAgfSwKLSAgeyAibXVsdCIsCU8yLAkwLAkweDAzMDAgfSwKLSAgeyAibG9vcHQiLAlCTCwJMCwJMHgwNDAwIH0sCi0gIHsgInN1YnUiLAlPMiwJMCwJMHgwNTAwIH0sCi0gIHsgInN1YiIsCU8yLAkwLAkweDA1MDAgfSwgLyogT2ZmaWNpYWwgYWxpYXMuICAqLwotICB7ICJhZGRjIiwJTzIsCTAsCTB4MDYwMCB9LAotICB7ICJzdWJjIiwJTzIsCTAsCTB4MDcwMCB9LAotLyogU1BBQ0U6IDB4MDgwMC0weDA4ZmYgZm9yIGEgZGlhZGljIG9wZXJhdGlvbiAqLwotLyogU1BBQ0U6IDB4MDkwMC0weDA5ZmYgZm9yIGEgZGlhZGljIG9wZXJhdGlvbiAqLwotICB7ICJtb3ZmIiwJTzIsCTAsCTB4MEEwMCB9LAotICB7ICJsc3IiLAlPMiwJMCwJMHgwQjAwIH0sCi0gIHsgImNtcGhzIiwJTzIsCTAsCTB4MEMwMCB9LAotICB7ICJjbXBsdCIsCU8yLAkwLAkweDBEMDAgfSwKLSAgeyAidHN0IiwJTzIsCTAsCTB4MEUwMCB9LAotICB7ICJjbXBuZSIsCU8yLAkwLAkweDBGMDAgfSwKLSAgeyAibWZjciIsCU9DLAkwLAkweDEwMDAgfSwKLSAgeyAibW92IiwJTzIsCTAsCTB4MTIwMCB9LAotICB7ICJiZ2VuciIsCU8yLAkwLAkweDEzMDAgfSwKLSAgeyAicnN1YiIsCU8yLAkwLAkweDE0MDAgfSwKLSAgeyAiaXh3IiwJTzIsCTAsCTB4MTUwMCB9LAotICB7ICJhbmQiLAlPMiwJMCwJMHgxNjAwIH0sCi0gIHsgInhvciIsCU8yLAkwLAkweDE3MDAgfSwKLSAgeyAibXRjciIsCU9DLAkwLAkweDE4MDAgfSwKLSAgeyAiYXNyIiwJTzIsCTAsCTB4MUEwMCB9LAotICB7ICJsc2wiLAlPMiwJMCwJMHgxQjAwIH0sCi0gIHsgImFkZHUiLAlPMiwJMCwJMHgxQzAwIH0sCi0gIHsgIml4aCIsCU8yLAkwLAkweDFEMDAgfSwKLSAgeyAib3IiLAlPMiwJMCwJMHgxRTAwIH0sCi0gIHsgImFuZG4iLAlPMiwJMCwJMHgxRjAwIH0sCi0gIHsgImFkZGkiLAlPSSwJMCwJMHgyMDAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfQURESQkweDIwMDAKLSAgeyAiY21wbHRpIiwJT0ksCTAsCTB4MjIwMCB9LAotICB7ICJzdWJpIiwJT0ksCTAsCTB4MjQwMCB9LAotLyogU1BBQ0U6IDB4MjYwMC0weDI3ZmYgb3BlbiBmb3IgYSByZWdpc3RlcitpbW1lZGlhdGUgIG9wZXJhdGlvbiAqLwotICB7ICJyc3ViaSIsCU9CLAkwLAkweDI4MDAgfSwKLSAgeyAiY21wbmVpIiwJT0IsCTAsCTB4MkEwMCB9LAotICB7ICJibWFza2kiLAlPTWEsCTAsCTB4MkMwMCB9LAotICB7ICJkaXZ1IiwJTzFSMSwJMCwJMHgyQzEwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MmMyMCAtIDB4MmM3ZiAqLyAgCi0gIHsgImJtYXNraSIsCU9NYiwJMCwJMHgyQzgwIH0sCi0gIHsgImJtYXNraSIsCU9NYywJMCwJMHgyRDAwIH0sCi0gIHsgImFuZGkiLAlPQiwJMCwJMHgyRTAwIH0sCi0gIHsgImJjbHJpIiwJT0IsCTAsCTB4MzAwMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDMyMDAgLSAweDMyMGYgKi8KLSAgeyAiZGl2cyIsCU8xUjEsCTAsCTB4MzIxMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDMyMjAgLSAweDMyNmYgKi8gIAotICB7ICJiZ2VuaSIsCU9CUmEsCTAsCTB4MzI3MCB9LAotICB7ICJiZ2VuaSIsCU9CUmIsCTAsCTB4MzI4MCB9LAotICB7ICJiZ2VuaSIsCU9CUmMsCTAsCTB4MzMwMCB9LAotICB7ICJic2V0aSIsCU9CLAkwLAkweDM0MDAgfSwKLSAgeyAiYnRzdGkiLAlPQiwJMCwJMHgzNjAwIH0sCi0gIHsgInhzciIsCU8xLAkwLAkweDM4MDAgfSwKLSAgeyAicm90bGkiLAlTSWEsCTAsCTB4MzgwMCB9LAotICB7ICJhc3JjIiwJTzEsCTAsCTB4M0EwMCB9LAotICB7ICJhc3JpIiwJU0lhLAkwLAkweDNBMDAgfSwKLSAgeyAibHNsYyIsCU8xLAkwLAkweDNDMDAgfSwKLSAgeyAibHNsaSIsCVNJYSwJMCwJMHgzQzAwIH0sCi0gIHsgImxzcmMiLAlPMSwJMCwJMHgzRTAwIH0sCi0gIHsgImxzcmkiLAlTSWEsCTAsCTB4M0UwMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgLSAweDVmZmYgKi8KLSAgeyAibW92aSIsCUk3LAkwLAkweDYwMDAgfSwKLSNkZWZpbmUgTUNPUkVfSU5TVF9CTUFTS0lfQUxUCTB4NjAwMAotI2RlZmluZSBNQ09SRV9JTlNUX0JHRU5JX0FMVAkweDYwMDAKLS8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8KLSAgeyAibXVsc2giLCAgICBNVUxTSCwgIDAsICAgICAgMHg2ODAwIH0sCi0gIHsgIm11bHMuaCIsICAgTVVMU0gsICAwLCAgICAgIDB4NjgwMCB9LAotLyogZW5kLXNhbml0aXplLW0zNDAgKi8KLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHg2OTAwIC0gMHg2RkZGICovCi0gIHsgImptcGkiLAlMSiwJMSwJMHg3MDAwIH0sCi0gIHsgImpzcmkiLAlMSiwJMCwJMHg3RjAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSk1QSQkweDcwMDAKLSAgeyAibHJ3IiwJTFIsCTAsCTB4NzAwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0pTUkkJMHg3RjAwCi0gIHsgImxkIiwJTFMsCTAsCTB4ODAwMCB9LAotICB7ICJsZHciLAlMUywJMCwJMHg4MDAwIH0sCi0gIHsgImxkLnciLAlMUywJMCwJMHg4MDAwIH0sCi0gIHsgInN0IiwJTFMsCTAsCTB4OTAwMCB9LAotICB7ICJzdHciLAlMUywJMCwJMHg5MDAwIH0sCi0gIHsgInN0LnciLAlMUywJMCwJMHg5MDAwIH0sCi0gIHsgImxkYiIsCUxTLAkwLAkweEEwMDAgfSwKLSAgeyAibGQuYiIsCUxTLAkwLAkweEEwMDAgfSwKLSAgeyAic3RiIiwJTFMsCTAsCTB4QjAwMCB9LAotICB7ICJzdC5iIiwJTFMsCTAsCTB4QjAwMCB9LAotICB7ICJsZGgiLAlMUywJMCwJMHhDMDAwIH0sCi0gIHsgImxkLmgiLAlMUywJMCwJMHhDMDAwIH0sCi0gIHsgInN0aCIsCUxTLAkwLAkweEQwMDAgfSwKLSAgeyAic3QuaCIsCUxTLAkwLAkweEQwMDAgfSwKLSAgeyAiYnQiLAlCUiwJMCwJMHhFMDAwIH0sCi0gIHsgImJmIiwJQlIsCTAsCTB4RTgwMCB9LAotICB7ICJiciIsCUJSLAkxLAkweEYwMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9CUgkweEYwMDAKLSAgeyAiYnNyIiwJQlIsCTAsCTB4RjgwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0JTUgkweEY4MDAKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgcmVsYXhhYmxlIGJyYW5jaGVzICovCi0gIHsgImpidCIsCUpDLAkwLAkweEUwMDAgfSwKLSAgeyAiamJmIiwJSkMsCTAsCTB4RTgwMCB9LAotICB7ICJqYnIiLAlKVSwJMSwJMHhGMDAwIH0sCi0gIHsgImpic3IiLAlKTCwJMCwJMHhGODAwIH0sCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsaWFzZXMgZm9yIG90aGVyIGluc3RydWN0aW9ucyAqLwotICB7ICJydHMiLAlPMCwJMiwJMHgwMENGIH0sICAvKiBqbXAgcjE1ICovCi0gIHsgInJvbGMiLAlETzIxLAkwLAkweDA2MDAgfSwgIC8qIGFkZGMgcmQscmQgKi8KLSAgeyAicm90bGMiLAlETzIxLCAgIDAsCTB4MDYwMCB9LCAgLyogYWRkYyByZCxyZCAqLwotICB7ICJzZXRjIiwJTzAsCTAsCTB4MEMwMCB9LCAgLyogY21waHMgcjAscjAgKi8KLSAgeyAiY2xyYyIsCU8wLAkwLAkweDBGMDAgfSwgIC8qIGNtcG5lIHIwLHIwICovCi0gIHsgInRzdGxlIiwJTzEsCTAsCTB4MjIwMCB9LCAgLyogY21wbHRpIHJkLDEgKi8KLSAgeyAiY21wbGVpIiwJT0IsCTAsCTB4MjIwMCB9LCAgLyogY21wbGVpIHJkLFggLT4gY21wbHRpIHJkLFgrMSAqLwotICB7ICJuZWciLAlPMSwJMCwJMHgyODAwIH0sICAvKiByc3ViaSByZCwwICovCi0gIHsgInRzdG5lIiwJTzEsCTAsCTB4MkEwMCB9LCAgLyogY21wbmVpIHJkLDAgKi8KLSAgeyAidHN0bHQiLAlPMSwJMCwJMHgzN0YwIH0sICAvKiBidHN0aSByeCwzMSAqLwotICB7ICJtY2xyaSIsCU9CMiwJMCwJMHgzMDAwIH0sICAvKiBiY2xyaSByeCxsb2cyKGltbSkgKi8KLSAgeyAibWdlbmkiLAlPQlIyLAkwLAkweDMyMDAgfSwgIC8qIGJnZW5pIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJtc2V0aSIsCU9CMiwJMCwJMHgzNDAwIH0sICAvKiBic2V0aSByeCxsb2cyKGltbSkgKi8KLSAgeyAibXRzdGkiLAlPQjIsCTAsCTB4MzYwMCB9LCAgLyogYnRzdGkgcngsbG9nMihpbW0pICovCi0gIHsgInJvcmkiLAlSU0ksCTAsCTB4MzgwMCB9LAotICB7ICJyb3RyaSIsCVJTSSwgICAgMCwJMHgzODAwIH0sCi0gIHsgIm5vcCIsCU8wLCAgICAgMCwJMHgxMjAwIH0sICAvKiBtb3YgcjAsIHIwICovCi0gIHsgMCwJCTAsCTAsICAgICAgMCB9Ci19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL21pcHMtZGlzLmMgYi9vcGNvZGVzL21pcHMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzU3N2MuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9taXBzLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2OCArMCwwIEBACi0vKiBQcmludCBtaXBzIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBvciBmb3Igb2JqZHVtcC4KLSAgIENvcHlyaWdodCAoYykgMTk4OSwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBOb2J1eXVraSBIaWtpY2hpKGhpa2ljaGlAc3JhLmNvLmpwKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRklYTUU6IFRoZXNlIGFyZSBuZWVkZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgY29kZSBpcyBtaXBzMTYgb3IKLSAgIG5vdC4gVGhlIGxvdyBiaXQgb2YgdGhlIGFkZHJlc3MgaXMgb2Z0ZW4gYSBnb29kIGluZGljYXRvci4gIE5vCi0gICBzeW1ib2wgdGFibGUgaXMgYXZhaWxhYmxlIHdoZW4gdGhpcyBjb2RlIHJ1bnMgb3V0IGluIGFuIGVtYmVkZGVkCi0gICBzeXN0ZW0gYXMgd2hlbiBpdCBpcyB1c2VkIGZvciBkaXNhc3NlbWJsZXIgc3VwcG9ydCBpbiBhIG1vbml0b3IuICovCi0KLSNpZiAhZGVmaW5lZChFTUJFRERFRF9FTlYpCi0jZGVmaW5lIFNZTVRBQl9BVkFJTEFCTEUgMQotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbWlwcy5oIgotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9taXBzMTYgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIHZvaWQgcHJpbnRfbWlwczE2X2luc25fYXJnCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICosIGludCwgYm9vbGVhbiwgaW50LCBiZmRfdm1hLAotCSAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogTWlwcyBpbnN0cnVjdGlvbnMgYXJlIG5ldmVyIGxvbmdlciB0aGFuIHRoaXMgbWFueSBieXRlcy4gICovCi0jZGVmaW5lIE1BWExFTiA0Ci0KLXN0YXRpYyB2b2lkIHByaW50X2luc25fYXJnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSwKLQkJCQkgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIGludCBfcHJpbnRfaW5zbl9taXBzIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGxvbmcgaW50LAotCQkJCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0MCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgc2hhcmVkIHdpdGggZ2RiIHNvbWVob3cuICAqLwotI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAJXAotICAgIHsJInplcm8iLAkiYXQiLAkidjAiLAkidjEiLAkiYTAiLAkiYTEiLAkiYTIiLAkiYTMiLCBcCi0JInQwIiwJInQxIiwJInQyIiwJInQzIiwJInQ0IiwJInQ1IiwJInQ2IiwJInQ3IiwgXAotCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsIFwKLQkidDgiLAkidDkiLAkiazAiLAkiazEiLAkiZ3AiLAkic3AiLAkiczgiLAkicmEiLCBcCi0JInNyIiwJImxvIiwJImhpIiwJImJhZCIsCSJjYXVzZSIsInBjIiwgICAgXAotCSJmMCIsICAgImYxIiwgICAiZjIiLCAgICJmMyIsICAgImY0IiwgICAiZjUiLCAgICJmNiIsICAgImY3IiwgXAotCSJmOCIsICAgImY5IiwgICAiZjEwIiwgICJmMTEiLCAgImYxMiIsICAiZjEzIiwgICJmMTQiLCAgImYxNSIsIFwKLQkiZjE2IiwgICJmMTciLCAgImYxOCIsICAiZjE5IiwgICJmMjAiLCAgImYyMSIsICAiZjIyIiwgICJmMjMiLFwKLQkiZjI0IiwgICJmMjUiLCAgImYyNiIsICAiZjI3IiwgICJmMjgiLCAgImYyOSIsICAiZjMwIiwgICJmMzEiLFwKLQkiZnNyIiwgICJmaXIiLCAgImZwIiwgICAiaW54IiwgICJyYW5kIiwgInRsYmxvIiwiY3R4dCIsICJ0bGJoaSIsXAotCSJlcGMiLCAgInByaWQiXAotICAgIH0KLQotc3RhdGljIENPTlNUIGNoYXIgKiBDT05TVCByZWdfbmFtZXNbXSA9IFJFR0lTVEVSX05BTUVTOwotCi0vKiBUaGUgbWlwczE2IHJlZ2lzdGVyIG5hbWVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwczE2X3JlZ19uYW1lc1tdID0KLXsKLSAgInMwIiwgInMxIiwgInYwIiwgInYxIiwgImEwIiwgImExIiwgImEyIiwgImEzIgotfTsKLQwKLS8qIHN1YnJvdXRpbmUgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuX2FyZyAoZCwgbCwgcGMsIGluZm8pCi0gICAgIGNvbnN0IGNoYXIgKmQ7Ci0gICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IGw7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgZGVsdGE7Ci0KLSAgc3dpdGNoICgqZCkKLSAgICB7Ci0gICAgY2FzZSAnLCc6Ci0gICAgY2FzZSAnKCc6Ci0gICAgY2FzZSAnKSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKmQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICd2JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWyhsID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlNdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1sobCA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2knOgotICAgIGNhc2UgJ3UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCShsID4+IE9QX1NIX0lNTUVESUFURSkgJiBPUF9NQVNLX0lNTUVESUFURSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2onOiAvKiBzYW1lIGFzIGksIGJ1dCBzaWduLWV4dGVuZGVkICovCi0gICAgY2FzZSAnbyc6Ci0gICAgICBkZWx0YSA9IChsID4+IE9QX1NIX0RFTFRBKSAmIE9QX01BU0tfREVMVEE7Ci0gICAgICBpZiAoZGVsdGEgJiAweDgwMDApCi0JZGVsdGEgfD0gfjB4ZmZmZjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJICAgICBkZWx0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKHVuc2lnbmVkIGludCkgKChsID4+IE9QX1NIX1BSRUZYKQotCQkJCQkgICAgICYgT1BfTUFTS19QUkVGWCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgICh1bnNpZ25lZCBpbnQpICgobCA+PiBPUF9TSF9DQUNIRSkKLQkJCQkJICAgICAmIE9QX01BU0tfQ0FDSEUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkoKChwYyAmIDB4RjAwMDAwMDApIHwgKCgobCA+PiBPUF9TSF9UQVJHRVQpICYgT1BfTUFTS19UQVJHRVQpIDw8IDIpKSwKLQkgaW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgLyogc2lnbiBleHRlbmQgdGhlIGRpc3BsYWNlbWVudCAqLwotICAgICAgZGVsdGEgPSAobCA+PiBPUF9TSF9ERUxUQSkgJiBPUF9NQVNLX0RFTFRBOwotICAgICAgaWYgKGRlbHRhICYgMHg4MDAwKQotCWRlbHRhIHw9IH4weGZmZmY7Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkoKGRlbHRhIDw8IDIpICsgcGMgKyA0LAotCSBpbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1sobCA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3onOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc8JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1NIQU1UKSAmIE9QX01BU0tfU0hBTVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0NPREUpICYgT1BfTUFTS19DT0RFKTsKLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlICdxJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0NPREUyKSAmIE9QX01BU0tfQ09ERTIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0NPUFopICYgT1BfTUFTS19DT1BaKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9TWVNDQUxMKSAmIE9QX01BU0tfU1lTQ0FMTCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgIGNhc2UgJ1YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfRlMpICYgT1BfTUFTS19GUyk7Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSAnVCc6Ci0gICAgY2FzZSAnVyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9GVCkgJiBPUF9NQVNLX0ZUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9GRCkgJiBPUF9NQVNLX0ZEKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9GUikgJiBPUF9NQVNLX0ZSKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ04nOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZmNjJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9CQ0MpICYgT1BfTUFTS19CQ0MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGZjYyVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQ0NDKSAmIE9QX01BU0tfQ0NDKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfUEVSRlJFRykgJiBPUF9NQVNLX1BFUkZSRUcpOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCi0JCQkgICAgIF8oIiMgaW50ZXJuYWwgZXJyb3IsIHVuZGVmaW5lZCBtb2RpZmllciglYykiKSwKLQkJCSAgICAgKmQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotI2lmIFNZTVRBQl9BVkFJTEFCTEUKLQotLyogRmlndXJlIG91dCB0aGUgTUlQUyBJU0EgYW5kIENQVSBiYXNlZCBvbiB0aGUgbWFjaGluZSBudW1iZXIuCi0gICBGSVhNRTogV2hhdCBkb2VzIHRoaXMgaGF2ZSB0byBkbyB3aXRoIFNZTVRBQl9BVkFJTEFCTEU/ICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X21pcHNfaXNhX3R5cGUgKG1hY2gsIGlzYSwgY3B1dHlwZSkKLSAgICAgaW50IG1hY2g7Ci0gICAgIGludCAqaXNhOwotICAgICBpbnQgKmNwdXR5cGU7Ci17Ci0gIGludCB0YXJnZXRfcHJvY2Vzc29yID0gMDsKLSAgaW50IG1pcHNfaXNhID0gMDsKLQotICBzd2l0Y2ggKG1hY2gpCi0gICAgewotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMzAwMDsKLQltaXBzX2lzYSA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSAzOTAwOwotCW1pcHNfaXNhID0gMTsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQwMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDAxMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDAxMDsKLQltaXBzX2lzYSA9IDI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MTAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMTE6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQxMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDMwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDMwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0NDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0NDAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2MDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQ2MDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDY1MDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDY1MDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM1MDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA1MDAwOwotCW1pcHNfaXNhID0gNDsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDYwMDA7Ci0JbWlwc19pc2EgPSAyOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gODAwMDsKLQltaXBzX2lzYSA9IDQ7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHMxMDAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMTAwMDA7Ci0JbWlwc19pc2EgPSA0OwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMTY6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDE2OwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDMwMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotCi0gICAgfQotCi0gICppc2EgPSBtaXBzX2lzYTsKLSAgKmNwdXR5cGUgPSB0YXJnZXRfcHJvY2Vzc29yOwotfQotCi0jZW5kaWYgLyogU1lNVEFCX0FWQUlMQUJMRSAqLwotCi0vKiBQcmludCB0aGUgbWlwcyBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gdXNpbmcgSU5GTy4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMsIHdoaWNoIGlzCi0gICBhbHdheXMgNC4gIEJJR0VORElBTiBtdXN0IGJlIDEgaWYgdGhpcyBpcyBiaWctZW5kaWFuIGNvZGUsIDAgaWYKLSAgIHRoaXMgaXMgbGl0dGxlLWVuZGlhbiBjb2RlLiAgKi8KLQotc3RhdGljIGludAotX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgd29yZCwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICB1bnNpZ25lZCBsb25nIGludCB3b3JkOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcDsKLSAgaW50IHRhcmdldF9wcm9jZXNzb3IsIG1pcHNfaXNhOwotICBzdGF0aWMgYm9vbGVhbiBpbml0ID0gMDsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqbWlwc19oYXNoW09QX01BU0tfT1AgKyAxXTsKLQotICAvKiBCdWlsZCBhIGhhc2ggdGFibGUgdG8gc2hvcnRlbiB0aGUgc2VhcmNoIHRpbWUuICAqLwotICBpZiAoISBpbml0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDw9IE9QX01BU0tfT1A7IGkrKykKLQl7Ci0JICBmb3IgKG9wID0gbWlwc19vcGNvZGVzOyBvcCA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU107IG9wKyspCi0JICAgIHsKLQkgICAgICBpZiAob3AtPnBpbmZvID09IElOU05fTUFDUk8pCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChpID09ICgob3AtPm1hdGNoID4+IE9QX1NIX09QKSAmIE9QX01BU0tfT1ApKQotCQl7Ci0JCSAgbWlwc19oYXNoW2ldID0gb3A7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotICAgICAgICB9Ci0KLSAgICAgIGluaXQgPSAxOwotICAgIH0KLQotI2lmICEgU1lNVEFCX0FWQUlMQUJMRQotICAvKiBUaGlzIGlzIHJ1bm5pbmcgb3V0IG9uIGEgdGFyZ2V0IG1hY2hpbmUsIG5vdCBpbiBhIGhvc3QgdG9vbC4KLSAgICAgRklYTUU6IFdoZXJlIGRvZXMgbWlwc190YXJnZXRfaW5mbyBjb21lIGZyb20/ICAqLwotICB0YXJnZXRfcHJvY2Vzc29yID0gbWlwc190YXJnZXRfaW5mby5wcm9jZXNzb3I7Ci0gIG1pcHNfaXNhID0gbWlwc190YXJnZXRfaW5mby5pc2E7Ci0jZWxzZSAgCi0gIHNldF9taXBzX2lzYV90eXBlIChpbmZvLT5tYWNoLCAmbWlwc19pc2EsICZ0YXJnZXRfcHJvY2Vzc29yKTsKLSNlbmRpZiAgCi0KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBpbmZvLT5lbmRpYW47Ci0KLSAgb3AgPSBtaXBzX2hhc2hbKHdvcmQgPj4gT1BfU0hfT1ApICYgT1BfTUFTS19PUF07Ci0gIGlmIChvcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoOyBvcCA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU107IG9wKyspCi0JewotCSAgaWYgKG9wLT5waW5mbyAhPSBJTlNOX01BQ1JPICYmICh3b3JkICYgb3AtPm1hc2spID09IG9wLT5tYXRjaCkKLQkgICAgewotCSAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmQ7Ci0JICAgICAgaW50IGluc25faXNhOwotCi0JICAgICAgaWYgKChvcC0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTEpCi0JCWluc25faXNhID0gMTsKLQkgICAgICBlbHNlIGlmICgob3AtPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0EyKQotCQlpbnNuX2lzYSA9IDI7Ci0JICAgICAgZWxzZSBpZiAoKG9wLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMykKLQkJaW5zbl9pc2EgPSAzOwotCSAgICAgIGVsc2UgaWYgKChvcC0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTQpCi0JCWluc25faXNhID0gNDsKLQkgICAgICBlbHNlCi0JCWluc25faXNhID0gMTU7Ci0KLQkgICAgICBpZiAoaW5zbl9pc2EgPiBtaXBzX2lzYQotCQkgICYmICh0YXJnZXRfcHJvY2Vzc29yID09IDQ2NTAKLQkJICAgICAgJiYgb3AtPm1lbWJlcnNoaXAgJiBJTlNOXzQ2NTApID09IDAKLQkJICAmJiAodGFyZ2V0X3Byb2Nlc3NvciA9PSA0MDEwCi0JCSAgICAgICYmIG9wLT5tZW1iZXJzaGlwICYgSU5TTl80MDEwKSA9PSAwCi0JCSAgJiYgKHRhcmdldF9wcm9jZXNzb3IgPT0gNDEwMAotCQkgICAgICAmJiBvcC0+bWVtYmVyc2hpcCAmIElOU05fNDEwMCkgPT0gMAotCQkgICYmICh0YXJnZXRfcHJvY2Vzc29yID09IDM5MDAKLQkJICAgICAgJiYgb3AtPm1lbWJlcnNoaXAgJiBJTlNOXzM5MDApID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKLQotCSAgICAgIGQgPSBvcC0+YXJnczsKLQkgICAgICBpZiAoZCAhPSBOVUxMICYmICpkICE9ICdcMCcpCi0JCXsKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQkJICBmb3IgKDsgKmQgIT0gJ1wwJzsgZCsrKQotCQkgICAgICBwcmludF9pbnNuX2FyZyAoZCwgd29yZCwgbWVtYWRkciwgaW5mbyk7Ci0JCX0KLQotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIHdvcmQpOwotICByZXR1cm4gNDsKLX0KLQotCi0vKiBJbiBhbiBlbnZpcm9ubWVudCB3aGVyZSB3ZSBkbyBub3Qga25vdyB0aGUgc3ltYm9sIHR5cGUgb2YgdGhlCi0gICBpbnN0cnVjdGlvbiB3ZSBhcmUgZm9yY2VkIHRvIGFzc3VtZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0IG9mIHRoZQotICAgaW5zdHJ1Y3Rpb25zJyBhZGRyZXNzIG1heSBtYXJrIGl0IGFzIGEgbWlwczE2IGluc3RydWN0aW9uLiAgSWYgd2UKLSAgIGFyZSBzaW5nbGUgc3RlcHBpbmcsIG9yIHRoZSBwYyBpcyB3aXRoaW4gdGhlIGRpc2Fzc2VtYmxlZCBmdW5jdGlvbiwKLSAgIHRoaXMgd29ya3MuICBPdGhlcndpc2UsIHdlIG5lZWQgYSBjbHVlLiAgU29tZXRpbWVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2JpZ19taXBzIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLSNpZiAxCi0gIC8qIEZJWE1FOiBJZiBvZGQgYWRkcmVzcywgdGhpcyBpcyBDTEVBUkxZIGEgbWlwcyAxNiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIE9ubHkgYSBmZXcgdG9vbHMgd2lsbCB3b3JrIHRoaXMgd2F5LiAgKi8KLSAgaWYgKG1lbWFkZHIgJiAweDAxKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0jaWYgU1lNVEFCX0FWQUlMQUJMRQotICBpZiAoaW5mby0+bWFjaCA9PSAxNgotICAgICAgfHwgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgaW5mby0+c3ltYm9scyAhPSBOVUxMCi0JICAmJiAoKCooZWxmX3N5bWJvbF90eXBlICoqKSBpbmZvLT5zeW1ib2xzKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcgotCSAgICAgID09IFNUT19NSVBTMTYpKSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgcmV0dXJuIF9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0YjMyIChidWZmZXIpLAotCQkJICAgICBpbmZvKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotaW50Ci1wcmludF9pbnNuX2xpdHRsZV9taXBzIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLQotI2lmIDEKLSAgaWYgKG1lbWFkZHIgJiAweDAxKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0jaWYgU1lNVEFCX0FWQUlMQUJMRQotICBpZiAoaW5mby0+bWFjaCA9PSAxNgotICAgICAgfHwgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgaW5mby0+c3ltYm9scyAhPSBOVUxMCi0JICAmJiAoKCooZWxmX3N5bWJvbF90eXBlICoqKSBpbmZvLT5zeW1ib2xzKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcgotCSAgICAgID09IFNUT19NSVBTMTYpKSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgcmV0dXJuIF9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0bDMyIChidWZmZXIpLAotCQkJICAgICBpbmZvKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQwKLS8qIERpc2Fzc2VtYmxlIG1pcHMxNiBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotICBpbnQgbGVuZ3RoOwotICBpbnQgaW5zbjsKLSAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICBpbnQgZXh0ZW5kID0gMDsKLSAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcCwgKm9wZW5kOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gaW5mby0+ZW5kaWFuOwotCi0gIGluZm8tPmluc25faW5mb192YWxpZCA9IDE7Ci0gIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDA7Ci0gIGluZm8tPmRhdGFfc2l6ZSA9IDA7Ci0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25icmFuY2g7Ci0gIGluZm8tPnRhcmdldCA9IDA7Ci0gIGluZm8tPnRhcmdldDIgPSAwOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgbGVuZ3RoID0gMjsKLQotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICBlbHNlCi0gICAgaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLSAgLyogSGFuZGxlIHRoZSBleHRlbmQgb3Bjb2RlIHNwZWNpYWxseS4gICovCi0gIHVzZV9leHRlbmQgPSBmYWxzZTsKLSAgaWYgKChpbnNuICYgMHhmODAwKSA9PSAweGYwMDApCi0gICAgewotICAgICAgdXNlX2V4dGVuZCA9IHRydWU7Ci0gICAgICBleHRlbmQgPSBpbnNuICYgMHg3ZmY7Ci0KLSAgICAgIG1lbWFkZHIgKz0gMjsKLQotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKLQkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLQlpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotICAgICAgLyogQ2hlY2sgZm9yIGFuIGV4dGVuZCBvcGNvZGUgZm9sbG93ZWQgYnkgYW4gZXh0ZW5kIG9wY29kZS4gICovCi0gICAgICBpZiAoKGluc24gJiAweGY4MDApID09IDB4ZjAwMCkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKLQkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKLQkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwotCSAgcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLSAgICAgIGxlbmd0aCArPSAyOwotICAgIH0KLQotICAvKiBGSVhNRTogU2hvdWxkIHByb2JhYmx5IHVzZSBhIGhhc2ggdGFibGUgb24gdGhlIG1ham9yIG9wY29kZSBoZXJlLiAgKi8KLQotICBvcGVuZCA9IG1pcHMxNl9vcGNvZGVzICsgYmZkX21pcHMxNl9udW1fb3Bjb2RlczsKLSAgZm9yIChvcCA9IG1pcHMxNl9vcGNvZGVzOyBvcCA8IG9wZW5kOyBvcCsrKQotICAgIHsKLSAgICAgIGlmIChvcC0+cGluZm8gIT0gSU5TTl9NQUNSTyAmJiAoaW5zbiAmIG9wLT5tYXNrKSA9PSBvcC0+bWF0Y2gpCi0JewotCSAgY29uc3QgY2hhciAqczsKLQotCSAgaWYgKHN0cmNociAob3AtPmFyZ3MsICdhJykgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICh1c2VfZXh0ZW5kKQotCQl7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCi0JCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOwotCQkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwotCQkgIHJldHVybiBsZW5ndGggLSAyOwotCQl9Ci0KLQkgICAgICB1c2VfZXh0ZW5kID0gZmFsc2U7Ci0KLQkgICAgICBtZW1hZGRyICs9IDI7Ci0KLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsCi0JCQkJCQkgIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQkJewotCQkgIHVzZV9leHRlbmQgPSB0cnVlOwotCQkgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0JCSAgICBleHRlbmQgPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotCQkgIGVsc2UKLQkJICAgIGV4dGVuZCA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JCSAgbGVuZ3RoICs9IDI7Ci0JCX0KLQkgICAgfQotCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOwotCSAgaWYgKG9wLT5hcmdzWzBdICE9ICdcMCcpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotCSAgZm9yIChzID0gb3AtPmFyZ3M7ICpzICE9ICdcMCc7IHMrKykKLQkgICAgewotCSAgICAgIGlmICgqcyA9PSAnLCcKLQkJICAmJiBzWzFdID09ICd3JwotCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWCkKLQkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlkpKSkKLQkJewotCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLwotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmICgqcyA9PSAnLCcKLQkJICAmJiBzWzFdID09ICd2JwotCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWikKLQkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlgpKSkKLQkJewotCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLwotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIHByaW50X21pcHMxNl9pbnNuX2FyZyAoKnMsIG9wLCBpbnNuLCB1c2VfZXh0ZW5kLCBleHRlbmQsIG1lbWFkZHIsCi0JCQkJICAgICBpbmZvKTsKLQkgICAgfQotCi0JICBpZiAoKG9wLT5waW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkgIT0gMCkKLQkgICAgewotCSAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7Ci0JICAgICAgaWYgKGluZm8tPmluc25fdHlwZSAhPSBkaXNfanNyKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOwotCSAgICB9Ci0KLQkgIHJldHVybiBsZW5ndGg7Ci0JfQotICAgIH0KLQotICBpZiAodXNlX2V4dGVuZCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBleHRlbmQgfCAweGYwMDApOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuKTsKLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotLyogRGlzYXNzZW1ibGUgYW4gb3BlcmFuZCBmb3IgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbWlwczE2X2luc25fYXJnICh0eXBlLCBvcCwgbCwgdXNlX2V4dGVuZCwgZXh0ZW5kLCBtZW1hZGRyLCBpbmZvKQotICAgICBpbnQgdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcDsKLSAgICAgaW50IGw7Ci0gICAgIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgICAgaW50IGV4dGVuZDsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICcpJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneSc6Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JZKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JZKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICd2JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUlgpCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlgpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3onOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SWikKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX01PVkUzMlopCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfTU9WRTMyWildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1swXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMjldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRwYyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzMxXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JFR1IzMikKLQkJCQkJJiBNSVBTMTZPUF9NQVNLX1JFR1IzMildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1tNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAobCldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPCc6Ci0gICAgY2FzZSAnPic6Ci0gICAgY2FzZSAnWyc6Ci0gICAgY2FzZSAnXSc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnSCc6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnaic6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnVic6Ci0gICAgY2FzZSAnQyc6Ci0gICAgY2FzZSAnVSc6Ci0gICAgY2FzZSAnayc6Ci0gICAgY2FzZSAnSyc6Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAncSc6Ci0gICAgY2FzZSAnQSc6Ci0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnRSc6Ci0gICAgICB7Ci0JaW50IGltbWVkLCBuYml0cywgc2hpZnQsIHNpZ25lZHAsIGV4dGJpdHMsIHBjcmVsLCBleHR1LCBicmFuY2g7Ci0KLQlzaGlmdCA9IDA7Ci0Jc2lnbmVkcCA9IDA7Ci0JZXh0Yml0cyA9IDE2OwotCXBjcmVsID0gMDsKLQlleHR1ID0gMDsKLQlicmFuY2ggPSAwOwotCXN3aXRjaCAodHlwZSkKLQkgIHsKLQkgIGNhc2UgJzwnOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKLQkgICAgZXh0Yml0cyA9IDU7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJz4nOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKLQkgICAgZXh0Yml0cyA9IDU7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1snOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKLQkgICAgZXh0Yml0cyA9IDY7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ10nOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKLQkgICAgZXh0Yml0cyA9IDY7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJzQnOgotCSAgICBuYml0cyA9IDQ7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNCkgJiBNSVBTMTZPUF9NQVNLX0lNTTQ7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBleHRiaXRzID0gMTU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnNSc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnSCc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAxOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gMjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdXJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGlmICgob3AtPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9QQykgPT0gMAotCQkmJiAob3AtPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9TUCkgPT0gMCkKLQkgICAgICB7Ci0JCWluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCQlpbmZvLT5kYXRhX3NpemUgPSA0OwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICBjYXNlICdEJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2onOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJzYnOgotCSAgICBuYml0cyA9IDY7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNikgJiBNSVBTMTZPUF9NQVNLX0lNTTY7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnOCc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdWJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIC8qIEZJWE1FOiBUaGlzIG1pZ2h0IGJlIGx3LCBvciBpdCBtaWdodCBiZSBhZGRpdSB0byAkc3Agb3IKLSAgICAgICAgICAgICAgICRwYy4gIFdlIGFzc3VtZSBpdCdzIGxvYWQuICAqLwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gNDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdDJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1UnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2snOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0snOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAncCc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgYnJhbmNoID0gMTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2NvbmRicmFuY2g7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAncSc6Ci0JICAgIG5iaXRzID0gMTE7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NMTEpICYgTUlQUzE2T1BfTUFTS19JTU0xMTsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgYnJhbmNoID0gMTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdBJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgLyogRklYTUU6IFRoaXMgY2FuIGJlIGx3IG9yIGxhLiAgV2UgYXNzdW1lIGl0IGlzIGx3LiAgKi8KLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnQic6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0UnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotCi0JaWYgKCEgdXNlX2V4dGVuZCkKLQkgIHsKLQkgICAgaWYgKHNpZ25lZHAgJiYgaW1tZWQgPj0gKDEgPDwgKG5iaXRzIC0gMSkpKQotCSAgICAgIGltbWVkIC09IDEgPDwgbmJpdHM7Ci0JICAgIGltbWVkIDw8PSBzaGlmdDsKLQkgICAgaWYgKCh0eXBlID09ICc8JyB8fCB0eXBlID09ICc+JyB8fCB0eXBlID09ICdbJyB8fCB0eXBlID09ICddJykKLQkJJiYgaW1tZWQgPT0gMCkKLQkgICAgICBpbW1lZCA9IDg7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoZXh0Yml0cyA9PSAxNikKLQkgICAgICBpbW1lZCB8PSAoKGV4dGVuZCAmIDB4MWYpIDw8IDExKSB8IChleHRlbmQgJiAweDdlMCk7Ci0JICAgIGVsc2UgaWYgKGV4dGJpdHMgPT0gMTUpCi0JICAgICAgaW1tZWQgfD0gKChleHRlbmQgJiAweGYpIDw8IDExKSB8IChleHRlbmQgJiAweDdmMCk7Ci0JICAgIGVsc2UKLQkgICAgICBpbW1lZCA9ICgoZXh0ZW5kID4+IDYpICYgMHgxZikgfCAoZXh0ZW5kICYgMHgyMCk7Ci0JICAgIGltbWVkICY9ICgxIDw8IGV4dGJpdHMpIC0gMTsKLQkgICAgaWYgKCEgZXh0dSAmJiBpbW1lZCA+PSAoMSA8PCAoZXh0Yml0cyAtIDEpKSkKLQkgICAgICBpbW1lZCAtPSAxIDw8IGV4dGJpdHM7Ci0JICB9Ci0KLQlpZiAoISBwY3JlbCkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbW1lZCk7Ci0JZWxzZQotCSAgewotCSAgICBiZmRfdm1hIGJhc2VhZGRyOwotCSAgICBiZmRfdm1hIHZhbDsKLQotCSAgICBpZiAoYnJhbmNoKQotCSAgICAgIHsKLQkJaW1tZWQgKj0gMjsKLQkJYmFzZWFkZHIgPSBtZW1hZGRyICsgMjsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHVzZV9leHRlbmQpCi0JICAgICAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gMjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IHN0YXR1czsKLQkJYmZkX2J5dGUgYnVmZmVyWzJdOwotCi0JCWJhc2VhZGRyID0gbWVtYWRkcjsKLQotCQkvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGEganIKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICBqciBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGphbHIKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICBqYWxyIGluc3RydWN0aW9uLiAgVGhpcyB0ZXN0IGlzIHVucmVsaWFibGU6IHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgICBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBwcmV2aW91cyB3b3JkIGlzCi0gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gb3IgZGF0YS4gICovCi0JCXN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LCBidWZmZXIsIDIsCi0JCQkJCQkgICAgaW5mbyk7Ci0JCWlmIChzdGF0dXMgPT0gMAotCQkgICAgJiYgKCgoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCi0JCQkgID8gYmZkX2dldGIxNiAoYnVmZmVyKQotCQkJICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCi0JCQkgJiAweGY4MDApID09IDB4MTgwMCkpCi0JCSAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gNDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSAyLCBidWZmZXIsCi0JCQkJCQkJMiwgaW5mbyk7Ci0JCSAgICBpZiAoc3RhdHVzID09IDAKLQkJCSYmICgoKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQkJICAgICAgPyBiZmRfZ2V0YjE2IChidWZmZXIpCi0JCQkgICAgICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCi0JCQkgICAgICYgMHhmODFmKSA9PSAweGU4MDApKQotCQkgICAgICBiYXNlYWRkciA9IG1lbWFkZHIgLSAyOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIHZhbCA9IChiYXNlYWRkciAmIH4gKCgxIDw8IHNoaWZ0KSAtIDEpKSArIGltbWVkOwotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7Ci0JICAgIGluZm8tPnRhcmdldCA9IHZhbDsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICBpZiAoISB1c2VfZXh0ZW5kKQotCWV4dGVuZCA9IDA7Ci0gICAgICBsID0gKChsICYgMHgxZikgPDwgMjMpIHwgKChsICYgMHgzZTApIDw8IDEzKSB8IChleHRlbmQgPDwgMik7Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyICYgMHhmMDAwMDAwMCkgfCBsLCBpbmZvKTsKLSAgICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19qc3I7Ci0gICAgICBpbmZvLT50YXJnZXQgPSAobWVtYWRkciAmIDB4ZjAwMDAwMDApIHwgbDsKLSAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2wnOgotICAgIGNhc2UgJ0wnOgotICAgICAgewotCWludCBuZWVkX2NvbW1hLCBhbWFzaywgc21hc2s7Ci0KLQluZWVkX2NvbW1hID0gMDsKLQotCWwgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU02KSAmIE1JUFMxNk9QX01BU0tfSU1NNjsKLQotCWFtYXNrID0gKGwgPj4gMykgJiA3OwotCi0JaWYgKGFtYXNrID4gMCAmJiBhbWFzayA8IDUpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzRdKTsKLQkgICAgaWYgKGFtYXNrID4gMSkKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kJXMiLAotCQkJCSAgICAgcmVnX25hbWVzW2FtYXNrICsgM10pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCXNtYXNrID0gKGwgPj4gMSkgJiAzOwotCWlmIChzbWFzayA9PSAzKQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzPz8iLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIik7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCWVsc2UgaWYgKHNtYXNrID4gMCkKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyQlcyIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAotCQkJCSAgIHJlZ19uYW1lc1sxNl0pOwotCSAgICBpZiAoc21hc2sgPiAxKQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSQlcyIsCi0JCQkJICAgICByZWdfbmFtZXNbc21hc2sgKyAxNV0pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCWlmIChsICYgMSkKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyQlcyIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAotCQkJCSAgIHJlZ19uYW1lc1szMV0pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCWlmIChhbWFzayA9PSA1IHx8IGFtYXNrID09IDYpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMkZjAiLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIik7Ci0JICAgIGlmIChhbWFzayA9PSA2KQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSRmMSIpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzLW9wYy5jIGIvb3Bjb2Rlcy9taXBzLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODY0NjE5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWlwcy1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi0vKiBtaXBzLmguICBNaXBzIG9wY29kZSBsaXN0IGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJhbHBoIENhbXBiZWxsIGFuZCBPU0YKLSAgIENvbW1lbnRlZCBhbmQgbW9kaWZpZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotCi0vKiBTaG9ydCBoYW5kIHNvIHRoZSBsaW5lcyBhcmVuJ3QgdG9vIGxvbmcuICAqLwotCi0jZGVmaW5lIExERCAgICAgSU5TTl9MT0FEX01FTU9SWV9ERUxBWQotI2RlZmluZSBMQ0QJSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotI2RlZmluZSBVQkQgICAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBDQkQJSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBDT0QgICAgIElOU05fQ09QUk9DX01PVkVfREVMQVkKLSNkZWZpbmUgQ0xECUlOU05fQ09QUk9DX01FTU9SWV9ERUxBWQotI2RlZmluZSBDQkwJSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkKLSNkZWZpbmUgVFJBUAlJTlNOX1RSQVAKLSNkZWZpbmUgU00JSU5TTl9TVE9SRV9NRU1PUlkKLQotI2RlZmluZSBXUl9kICAgIElOU05fV1JJVEVfR1BSX0QKLSNkZWZpbmUgV1JfdCAgICBJTlNOX1dSSVRFX0dQUl9UCi0jZGVmaW5lIFdSXzMxICAgSU5TTl9XUklURV9HUFJfMzEgICAgICAgCi0jZGVmaW5lIFdSX0QgICAgSU5TTl9XUklURV9GUFJfRCAgICAgICAgCi0jZGVmaW5lIFdSX1QJSU5TTl9XUklURV9GUFJfVAotI2RlZmluZSBXUl9TCUlOU05fV1JJVEVfRlBSX1MKLSNkZWZpbmUgUkRfcyAgICBJTlNOX1JFQURfR1BSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfYiAgICBJTlNOX1JFQURfR1BSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfdCAgICBJTlNOX1JFQURfR1BSX1QgICAgICAgICAKLSNkZWZpbmUgUkRfUyAgICBJTlNOX1JFQURfRlBSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfVCAgICBJTlNOX1JFQURfRlBSX1QgICAgICAgICAKLSNkZWZpbmUgUkRfUglJTlNOX1JFQURfRlBSX1IKLSNkZWZpbmUgV1JfQ0MJSU5TTl9XUklURV9DT05EX0NPREUKLSNkZWZpbmUgUkRfQ0MJSU5TTl9SRUFEX0NPTkRfQ09ERQotI2RlZmluZSBSRF9DMCAgIElOU05fQ09QCi0jZGVmaW5lIFJEX0MxCUlOU05fQ09QCi0jZGVmaW5lIFJEX0MyICAgSU5TTl9DT1AKLSNkZWZpbmUgUkRfQzMgICBJTlNOX0NPUAotI2RlZmluZSBXUl9DMCAgIElOU05fQ09QCi0jZGVmaW5lIFdSX0MxCUlOU05fQ09QCi0jZGVmaW5lIFdSX0MyICAgSU5TTl9DT1AKLSNkZWZpbmUgV1JfQzMgICBJTlNOX0NPUAotCi0jZGVmaW5lIFdSX0hJCUlOU05fV1JJVEVfSEkKLSNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCi0jZGVmaW5lIE1PRF9ISSAgV1JfSEl8UkRfSEkKLQotI2RlZmluZSBXUl9MTwlJTlNOX1dSSVRFX0xPCi0jZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTwotI2RlZmluZSBNT0RfTE8gIFdSX0xPfFJEX0xPCi0KLSNkZWZpbmUgV1JfSElMTyBXUl9ISXxXUl9MTwotI2RlZmluZSBSRF9ISUxPIFJEX0hJfFJEX0xPCi0jZGVmaW5lIE1PRF9ISUxPIFdSX0hJTE98UkRfSElMTwotCi0jZGVmaW5lIElTX00gICAgSU5TTl9NVUxUCi0KLSNkZWZpbmUgSTEJSU5TTl9JU0ExCi0jZGVmaW5lIEkyCUlOU05fSVNBMgotI2RlZmluZSBJMwlJTlNOX0lTQTMKLSNkZWZpbmUgSTQJSU5TTl9JU0E0Ci0jZGVmaW5lIFAzCUlOU05fNDY1MAotI2RlZmluZSBMMQlJTlNOXzQwMTAKLSNkZWZpbmUgVjEgICAgICBJTlNOXzQxMDAKLSNkZWZpbmUgVDMgICAgICBJTlNOXzM5MDAKLQotI2RlZmluZSBHMSAgICAgIChUMyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICkKLQotI2RlZmluZSBHMiAgICAgIChUMyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICkKLQotI2RlZmluZSBHMyAoSTQgICAgICAgICAgICAgXAotICAgICAgICAgICAgKQotCi0vKiBUaGUgb3JkZXIgb2Ygb3ZlcmxvYWRlZCBpbnN0cnVjdGlvbnMgbWF0dGVycy4gIExhYmVsIGFyZ3VtZW50cyBhbmQKLSAgIHJlZ2lzdGVyIGFyZ3VtZW50cyBsb29rIHRoZSBzYW1lLiBJbnN0cnVjdGlvbnMgdGhhdCBjYW4gaGF2ZSBlaXRoZXIKLSAgIGZvciBhcmd1bWVudHMgbXVzdCBhcGVhciBpbiB0aGUgY29ycmVjdCBvcmRlciBpbiB0aGlzIHRhYmxlIGZvciB0aGUKLSAgIGFzc2VtYmxlciB0byBwaWNrIHRoZSByaWdodCBvbmUuIEluIG90aGVyIHdvcmRzLCBlbnRyaWVzIHdpdGgKLSAgIGltbWVkaWF0ZSBvcGVyYW5kcyBtdXN0IGFwZWFyIGFmdGVyIHRoZSBzYW1lIGluc3RydWN0aW9uIHdpdGgKLSAgIHJlZ2lzdGVycy4KLQotICAgTWFueSBpbnN0cnVjdGlvbnMgYXJlIHNob3J0IGhhbmQgZm9yIG90aGVyIGluc3RydWN0aW9ucyAoaS5lLiwgVGhlCi0gICBqYWwgPHJlZ2lzdGVyPiBpbnN0cnVjdGlvbiBpcyBzaG9ydCBmb3IgamFsciA8cmVnaXN0ZXI+KS4gICovCi0KLWNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBtaXBzX2J1aWx0aW5fb3Bjb2Rlc1tdID0gewotLyogVGhlc2UgaW5zdHJ1Y3Rpb25zIGFwcGVhciBmaXJzdCBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBmaW5kCi0gICB0aGVtIGZpcnN0LiAgVGhlIGFzc2VtYmxlcnMgdXNlcyBhIGhhc2ggdGFibGUgYmFzZWQgb24gdGhlCi0gICBpbnN0cnVjdGlvbiBuYW1lIGFueWhvdy4gICovCi0vKiBuYW1lLAlhcmdzLAltYXNrLAkJbWF0Y2gsCXBpbmZvICovCi17Im5vcCIsICAgICAiIiwJCTB4MDAwMDAwMDAsIDB4ZmZmZmZmZmYsCTAsCQlJMQl9LAoteyJsaSIsICAgICAgInQsaiIsICAgICAgMHgyNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJCUkxCX0sIC8qIGFkZGl1ICovCi17ImxpIiwJICAgICJ0LGkiLAkweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAkJSTEJfSwgLyogb3JpICovCi17ImxpIiwgICAgICAidCxJIiwJMCwgICAgKGludCkgTV9MSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibW92ZSIsICAgICJkLHMiLAkweDAwMDAwMDJkLCAweGZjMWYwN2ZmLCBXUl9kfFJEX3MsCUkzCX0sLyogZGFkZHUgKi8KLXsibW92ZSIsICAgICJkLHMiLAkweDAwMDAwMDIxLCAweGZjMWYwN2ZmLCBXUl9kfFJEX3MsCUkxCX0sLyogYWRkdSAqLwoteyJtb3ZlIiwgICAgImQscyIsCTB4MDAwMDAwMjUsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfcywJSTEJfSwvKiBvciAqLwoteyJiIiwgICAgICAgInAiLAkweDEwMDAwMDAwLCAweGZmZmYwMDAwLAlVQkQsCQlJMQl9LC8qIGJlcSAwLDAgKi8KLXsiYiIsICAgICAgICJwIiwJMHgwNDAxMDAwMCwgMHhmZmZmMDAwMCwJVUJELAkJSTEJfSwvKiBiZ2V6IDAgKi8KLXsiYmFsIiwgICAgICJwIiwJMHgwNDExMDAwMCwgMHhmZmZmMDAwMCwJVUJEfFdSXzMxLAlJMQl9LC8qIGJnZXphbCAwKi8KLQoteyJhYnMiLCAgICAgImQsdiIsCTAsICAgIChpbnQpIE1fQUJTLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJhYnMucyIsICAgIkQsViIsCTB4NDYwMDAwMDUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJhYnMuZCIsICAgIkQsViIsCTB4NDYyMDAwMDUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJhZGQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyMCwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17ImFkZCIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0FERF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJhZGQucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTF9LAoteyJhZGQuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTF9LAoteyJhZGRpIiwgICAgInQscixqIiwJMHgyMDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJhZGRpdSIsICAgInQscixqIiwJMHgyNDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJhZGR1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyMSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17ImFkZHUiLCAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0FERFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYW5kIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhbmQiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BTkRfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYW5kaSIsICAgICJ0LHIsaSIsCTB4MzAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLS8qIGIgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLwotLyogYmFsIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KLXsiYmMwZiIsICAgICJwIiwJMHg0MTAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzBmbCIsICAgInAiLAkweDQxMDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjMWYiLCAgICAicCIsCTB4NDUwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJMQl9LAoteyJiYzFmIiwgICAgIk4scCIsCTB4NDUwMDAwMDAsIDB4ZmZlMzAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJNAl9LAoteyJiYzFmbCIsICAgInAiLAkweDQ1MDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTJ8VDMJfSwKLXsiYmMxZmwiLCAgICJOLHAiLAkweDQ1MDIwMDAwLCAweGZmZTMwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTQJfSwKLXsiYmMyZiIsICAgICJwIiwJMHg0OTAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzJmbCIsICAgInAiLAkweDQ5MDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjM2YiLCAgICAicCIsCTB4NGQwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMzZmwiLCAgICJwIiwJMHg0ZDAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzB0IiwgICAgInAiLAkweDQxMDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMHRsIiwgICAicCIsCTB4NDEwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMxdCIsICAgICJwIiwJMHg0NTAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUkxCX0sCi17ImJjMXQiLCAgICAiTixwIiwJMHg0NTAxMDAwMCwgMHhmZmUzMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUk0CX0sCi17ImJjMXRsIiwgICAicCIsCTB4NDUwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJMnxUMwl9LAoteyJiYzF0bCIsICAgIk4scCIsCTB4NDUwMzAwMDAsIDB4ZmZlMzAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJNAl9LAoteyJiYzJ0IiwgICAgInAiLAkweDQ5MDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMnRsIiwgICAicCIsCTB4NDkwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMzdCIsICAgICJwIiwJMHg0ZDAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzN0bCIsICAgInAiLAkweDRkMDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJlcXoiLCAgICAicyxwIiwJMHgxMDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJlcXpsIiwgICAicyxwIiwJMHg1MDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJlcSIsICAgICAicyx0LHAiLAkweDEwMDAwMDAwLCAweGZjMDAwMDAwLAlDQkR8UkRfc3xSRF90LAlJMQl9LAoteyJiZXEiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CRVFfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmVxbCIsICAgICJzLHQscCIsCTB4NTAwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCTHxSRF9zfFJEX3QsCUkyfFQzCX0sCi17ImJlcWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JFUUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdlIiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2UiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdlbCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdlbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2V1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0VVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2V1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZXVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRVVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2V1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2V6IiwgICAgInMscCIsCTB4MDQwMTAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJiZ2V6bCIsICAgInMscCIsCTB4MDQwMzAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJiZ2V6YWwiLCAgInMscCIsCTB4MDQxMTAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zfFdSXzMxLAlJMQl9LAoteyJiZ2V6YWxsIiwgInMscCIsCTB4MDQxMzAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJiZ3QiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1QsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndCIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3RsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ3RsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndHUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVFUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndHUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0dWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdUVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndHVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVFVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndHoiLCAgICAicyxwIiwJMHgxYzAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJndHpsIiwgICAicyxwIiwJMHg1YzAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJsZSIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxlIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZWwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsZWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMRUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxldSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxldSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGV1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEVVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxldWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxleiIsICAgICJzLHAiLAkweDE4MDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmxlemwiLCAgICJzLHAiLAkweDU4MDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmx0IiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxULAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHQiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0bCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxUTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmx0bCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHR1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFRVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHR1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdHVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVFVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHR1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHR6IiwgICAgInMscCIsCTB4MDQwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJibHR6bCIsICAgInMscCIsCTB4MDQwMjAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibHR6YWwiLCAgInMscCIsCTB4MDQxMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zfFdSXzMxLAlJMQl9LAoteyJibHR6YWxsIiwgInMscCIsCTB4MDQxMjAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibmV6IiwgICAgInMscCIsCTB4MTQwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJibmV6bCIsICAgInMscCIsCTB4NTQwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibmUiLCAgICAgInMsdCxwIiwJMHgxNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JEfFJEX3N8UkRfdCwJSTEJfSwKLXsiYm5lIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQk5FX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJuZWwiLCAgICAicyx0LHAiLAkweDU0MDAwMDAwLCAweGZjMDAwMDAwLAlDQkx8UkRfc3xSRF90LCAJSTJ8VDMJfSwKLXsiYm5lbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQk5FTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJicmVhayIsICAgIiIsCQkweDAwMDAwMDBkLCAweGZmZmZmZmZmLAlUUkFQLAkJSTEJfSwKLXsiYnJlYWsiLCAgICJjIiwJMHgwMDAwMDAwZCwgMHhmYzAwZmZmZiwJVFJBUCwJCUkxCX0sCi17ImJyZWFrIiwgICAiYyxxIiwJMHgwMDAwMDAwZCwgMHhmYzAwMDAzZiwJVFJBUCwJCUkxCX0sCi17ImMuZi5kIiwgICAiUyxUIiwJMHg0NjIwMDAzMCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuZi5kIiwgICAiTSxTLFQiLAkweDQ2MjAwMDMwLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5mLnMiLCAgICJTLFQiLAkweDQ2MDAwMDMwLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5mLnMiLCAgICJNLFMsVCIsCTB4NDYwMDAwMzAsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnVuLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzEsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVuLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzMSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMudW4ucyIsICAiUyxUIiwJMHg0NjAwMDAzMSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudW4ucyIsICAiTSxTLFQiLAkweDQ2MDAwMDMxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5lcS5kIiwgICJTLFQiLAkweDQ2MjAwMDMyLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5lcS5kIiwgICJNLFMsVCIsCTB4NDYyMDAwMzIsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLmVxLnMiLCAgIlMsVCIsCTB4NDYwMDAwMzIsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmVxLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzMiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMudWVxLmQiLCAiUyxUIiwJMHg0NjIwMDAzMywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudWVxLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDMzLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy51ZXEucyIsICJTLFQiLAkweDQ2MDAwMDMzLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51ZXEucyIsICJNLFMsVCIsCTB4NDYwMDAwMzMsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm9sdC5kIiwgIlMsVCIsCTB4NDYyMDAwMzQsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm9sdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMub2x0LnMiLCAiUyxUIiwJMHg0NjAwMDAzNCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMub2x0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy51bHQuZCIsICJTLFQiLAkweDQ2MjAwMDM1LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51bHQuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzUsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnVsdC5zIiwgIlMsVCIsCTB4NDYwMDAwMzUsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVsdC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMub2xlLmQiLCAiUyxUIiwJMHg0NjIwMDAzNiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMub2xlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM2LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5vbGUucyIsICJTLFQiLAkweDQ2MDAwMDM2LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5vbGUucyIsICJNLFMsVCIsCTB4NDYwMDAwMzYsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnVsZS5kIiwgIlMsVCIsCTB4NDYyMDAwMzcsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVsZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMudWxlLnMiLCAiUyxUIiwJMHg0NjAwMDAzNywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudWxlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5zZi5kIiwgICJTLFQiLAkweDQ2MjAwMDM4LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5zZi5kIiwgICJNLFMsVCIsCTB4NDYyMDAwMzgsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnNmLnMiLCAgIlMsVCIsCTB4NDYwMDAwMzgsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnNmLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzOCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubmdsZS5kIiwiUyxUIiwJMHg0NjIwMDAzOSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmdsZS5kIiwiTSxTLFQiLAkweDQ2MjAwMDM5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5uZ2xlLnMiLCJTLFQiLAkweDQ2MDAwMDM5LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ2xlLnMiLCJNLFMsVCIsCTB4NDYwMDAwMzksIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnNlcS5kIiwgIlMsVCIsCTB4NDYyMDAwM2EsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnNlcS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzYSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMuc2VxLnMiLCAiUyxUIiwJMHg0NjAwMDAzYSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMuc2VxLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNhLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5uZ2wuZCIsICJTLFQiLAkweDQ2MjAwMDNiLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ2wuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2IsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm5nbC5zIiwgIlMsVCIsCTB4NDYwMDAwM2IsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5nbC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzYiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubHQuZCIsICAiUyxUIiwJMHg0NjIwMDAzYywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubHQuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDNjLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5sdC5zIiwgICJTLFQiLAkweDQ2MDAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5sdC5zIiwgICJNLFMsVCIsCTB4NDYwMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm5nZS5kIiwgIlMsVCIsCTB4NDYyMDAwM2QsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5nZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzZCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubmdlLnMiLCAiUyxUIiwJMHg0NjAwMDAzZCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmdlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNkLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5sZS5kIiwgICJTLFQiLAkweDQ2MjAwMDNlLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5sZS5kIiwgICJNLFMsVCIsCTB4NDYyMDAwM2UsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLmxlLnMiLCAgIlMsVCIsCTB4NDYwMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmxlLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzZSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubmd0LmQiLCAiUyxUIiwJMHg0NjIwMDAzZiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmd0LmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNmLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5uZ3QucyIsICJTLFQiLAkweDQ2MDAwMDNmLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ3QucyIsICJNLFMsVCIsCTB4NDYwMDAwM2YsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjYWNoZSIsICAgImssbyhiKSIsCTB4YmMwMDAwMDAsIDB4ZmMwMDAwMDAsIFJEX2IsCQlJM3xUMwl9LAoteyJjZWlsLmwuZCIsICJELFMiLAkweDQ2MjAwMDBhLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiY2VpbC5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwYSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImNlaWwudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJjZWlsLncucyIsICJELFMiLAkweDQ2MDAwMDBlLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsiY2ZjMCIsICAgICJ0LEciLAkweDQwNDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMCwJSTEJfSwKLXsiY2ZjMSIsICAgICJ0LEciLAkweDQ0NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMXxGUF9TLAlJMQl9LAoteyJjZmMxIiwgICAgInQsUyIsCTB4NDQ0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MxfEZQX1MsCUkxCX0sCi17ImNmYzIiLCAgICAidCxHIiwJMHg0ODQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzIsCUkxCX0sCi17ImNmYzMiLCAgICAidCxHIiwJMHg0YzQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzMsCUkxCX0sCi17ImN0YzAiLCAgICAidCxHIiwJMHg0MGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCi17ImN0YzEiLCAgICAidCxHIiwJMHg0NGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiY3RjMSIsICAgICJ0LFMiLAkweDQ0YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjdGMyIiwgICAgInQsRyIsCTB4NDhjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAlJMQl9LAoteyJjdGMzIiwgICAgInQsRyIsCTB4NGNjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAlJMQl9LAoteyJjdnQuZC5sIiwgIkQsUyIsCTB4NDZhMDAwMjEsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJjdnQuZC5zIiwgIkQsUyIsCTB4NDYwMDAwMjEsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9EfEZQX1MsCUkxCX0sCi17ImN2dC5kLnciLCAiRCxTIiwJMHg0NjgwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17ImN2dC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAyNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImN2dC5sLnMiLCAiRCxTIiwJMHg0NjAwMDAyNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImN2dC5zLmwiLCAiRCxTIiwJMHg0NmEwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImN2dC5zLmQiLCAiRCxTIiwJMHg0NjIwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1N8RlBfRCwJSTEJfSwKLXsiY3Z0LnMudyIsICJELFMiLAkweDQ2ODAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsiY3Z0LncuZCIsICJELFMiLAkweDQ2MjAwMDI0LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsiY3Z0LncucyIsICJELFMiLAkweDQ2MDAwMDI0LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsiZGFicyIsICAgICJkLHYiLAkwLCAgICAoaW50KSBNX0RBQlMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRhZGQiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJjLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZGFkZCIsICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fREFERF9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkYWRkaSIsICAgInQscixqIiwJMHg2MDAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9zLAlJMwl9LAoteyJkYWRkaXUiLCAgInQscixqIiwJMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9zLAlJMwl9LAoteyJkYWRkdSIsICAgImQsdix0IiwJMHgwMDAwMDAyZCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRhZGR1IiwgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0RBRERVX0ksCUlOU05fTUFDUk8sCUkzCX0sCi0vKiBkY3RyIGFuZCBkY3R3IGFyZSB1c2VkIG9uIHRoZSByNTAwMC4gICovCi17ImRjdHIiLCAgICAibyhiKSIsCTB4YmMwNTAwMDAsIDB4ZmMxZjAwMDAsIFJEX2IsCUkzCX0sCi17ImRjdHciLCAgICAibyhiKSIsCTB4YmMwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX2IsCUkzCX0sCi17ImRlcmV0IiwgICAiIiwgICAgICAgICAweDQyMDAwMDFmLCAweGZmZmZmZmZmLCAgICAwLAlHMgl9LAotLyogRm9yIGRkaXYsIHNlZSB0aGUgY29tbWVudHMgYWJvdXQgZGl2LiAgKi8KLXsiZGRpdiIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZGRpdiIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRERJVl8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkZGl2IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ERElWXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAotLyogRm9yIGRkaXZ1LCBzZWUgdGhlIGNvbW1lbnRzIGFib3V0IGRpdi4gICovCi17ImRkaXZ1IiwgICAieixzLHQiLAkweDAwMDAwMDFmLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRkaXZ1IiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RESVZVXzMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRkaXZ1IiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RESVZVXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAotLyogVGhlIE1JUFMgYXNzZW1ibGVyIHRyZWF0cyB0aGUgZGl2IG9wY29kZSB3aXRoIHR3byBvcGVyYW5kcyBhcwotICAgdGhvdWdoIHRoZSBmaXJzdCBvcGVyYW5kIGFwcGVhcmVkIHR3aWNlICh0aGUgZmlyc3Qgb3BlcmFuZCBpcyBib3RoCi0gICBhIHNvdXJjZSBhbmQgYSBkZXN0aW5hdGlvbikuICBUbyBnZXQgdGhlIGRpdiBtYWNoaW5lIGluc3RydWN0aW9uLAotICAgeW91IG11c3QgdXNlIGFuIGV4cGxpY2l0IGRlc3RpbmF0aW9uIG9mICQwLiAgKi8KLXsiZGl2IiwgICAgICJ6LHMsdCIsCTB4MDAwMDAwMWEsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2IiwgICAgICJ6LHQiLAkweDAwMDAwMDFhLCAweGZmZTBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdiIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RJVl8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkaXYiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ESVZfM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImRpdi5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAzLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMQl9LAoteyJkaXYucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTEJfSwKLS8qIEZvciBkaXZ1LCBzZWUgdGhlIGNvbW1lbnRzIGFib3V0IGRpdi4gICovCi17ImRpdnUiLCAgICAieixzLHQiLAkweDAwMDAwMDFiLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdnUiLCAgICAieix0IiwJMHgwMDAwMDAxYiwgMHhmZmUwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXZ1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ESVZVXzMsCUlOU05fTUFDUk8sCUkxCX0sCi17ImRpdnUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RJVlVfM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImRsYSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9ETEFfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRsaSIsICAgICAidCxqIiwgICAgICAweDI0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAlJMwl9LCAvKiBhZGRpdSAqLwoteyJkbGkiLAkgICAgInQsaSIsCTB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCUkzCX0sIC8qIG9yaSAqLwoteyJkbGkiLCAgICAgInQsSSIsCTAsICAgIChpbnQpIE1fRExJLAlJTlNOX01BQ1JPLAlJMwl9LAotCi17ImRtYWRkMTYiLCAicyx0IiwgICAgICAweDAwMDAwMDI5LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfTE98UkRfTE8sCVYxCX0sCi17ImRtZmMwIiwgICAidCxHIiwJMHg0MDIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfQzAsCUkzCX0sCi17ImRtdGMwIiwgICAidCxHIiwJMHg0MGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfQzB8V1JfQ0MsCUkzCX0sCi17ImRtZmMxIiwgICAidCxTIiwJMHg0NDIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfU3xGUF9TLAlJMwl9LAoteyJkbXRjMSIsICAgInQsUyIsCTB4NDRhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX1N8RlBfUywJSTMJfSwKLXsiZG1mYzIiLCAgICJ0LFMiLAkweDQ4MjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9TfEZQX1MsCUkzCX0sCi17ImRtdGMyIiwgICAidCxTIiwJMHg0OGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfU3xGUF9TLAlJMwl9LAoteyJkbXVsIiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ETVVMLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ETVVMX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvIiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUxPLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsbyIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ETVVMT19JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsb3UiLCAgImQsdix0IiwJMCwgICAgKGludCkgTV9ETVVMT1UsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvdSIsICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxPVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsdCIsICAgInMsdCIsCTB4MDAwMDAwMWMsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJICAgIEkzfSwKLXsiZG11bHR1IiwgICJzLHQiLAkweDAwMDAwMDFkLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sICAgICAgSTN9LAoteyJkbmVnIiwgICAgImQsdyIsCTB4MDAwMDAwMmUsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTMJfSwgLyogZHN1YiAwICovCi17ImRuZWd1IiwgICAiZCx3IiwJMHgwMDAwMDAyZiwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMwl9LCAvKiBkc3VidSAwKi8KLXsiZHJlbSIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZHJlbSIsICAgICJkLHYsdCIsCTMsICAgIChpbnQpIE1fRFJFTV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtIiwgICAgImQsdixJIiwJMywgICAgKGludCkgTV9EUkVNXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtdSIsICAgInoscyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkcmVtdSIsICAgImQsdix0IiwJMywgICAgKGludCkgTV9EUkVNVV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtdSIsICAgImQsdixJIiwJMywgICAgKGludCkgTV9EUkVNVV8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHNsbHYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LAoteyJkc2xsMzIiLCAgImQsdyw8IiwJMHgwMDAwMDAzYywgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LAoteyJkc2xsIiwgICAgImQsdyxzIiwJMHgwMDAwMDAxNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sIC8qIGRzbGx2ICovCi17ImRzbGwiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNjLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sIC8qIGRzbGwzMiAqLwoteyJkc2xsIiwgICAgImQsdyw8IiwJMHgwMDAwMDAzOCwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMwl9LAoteyJkc3JhdiIsICAgImQsdCxzIiwJMHgwMDAwMDAxNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sCi17ImRzcmEzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNmLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmEiLCAgICAiZCx3LHMiLAkweDAwMDAwMDE3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwgLyogZHNyYXYgKi8KLXsiZHNyYSIsICAgICJkLHcsPiIsCTB4MDAwMDAwM2YsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwgLyogZHNyYTMyICovCi17ImRzcmEiLCAgICAiZCx3LDwiLAkweDAwMDAwMDNiLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmx2IiwgICAiZCx0LHMiLAkweDAwMDAwMDE2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwKLXsiZHNybDMyIiwgICJkLHcsPCIsCTB4MDAwMDAwM2UsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwKLXsiZHNybCIsICAgICJkLHcscyIsCTB4MDAwMDAwMTYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LCAvKiBkc3JsdiAqLwoteyJkc3JsIiwgICAgImQsdyw+IiwJMHgwMDAwMDAzZSwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LCAvKiBkc3JsMzIgKi8KLXsiZHNybCIsICAgICJkLHcsPCIsCTB4MDAwMDAwM2EsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTMJfSwKLXsiZHN1YiIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkc3ViIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9EU1VCX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRzdWJ1IiwgICAiZCx2LHQiLAkweDAwMDAwMDJmLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZHN1YnUiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRFNVQlVfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZXJldCIsICAgICIiLAkJMHg0MjAwMDAxOCwgMHhmZmZmZmZmZiwJMCwJSTMJfSwKLXsiZmxvb3IubC5kIiwgIkQsUyIsCTB4NDYyMDAwMGIsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJmbG9vci5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwYiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImZsb29yLncuZCIsICJELFMiLAkweDQ2MjAwMDBmLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsiZmxvb3Iudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJmbHVzaGkiLCAgIiIsCQkweGJjMDEwMDAwLCAweGZmZmZmZmZmLCAwLAkJTDEJfSwKLXsiZmx1c2hkIiwgICIiLAkJMHhiYzAyMDAwMCwgMHhmZmZmZmZmZiwgMCwgTDEJCX0sCi17ImZsdXNoaWQiLCAiIiwJCTB4YmMwMzAwMDAsIDB4ZmZmZmZmZmYsIDAsIEwxCQl9LAoteyJoaWJlcm5hdGUiLCIiLCAgICAgICAgMHg0MjAwMDAyMywgMHhmZmZmZmZmZiwJMCwgVjEJfSwKLXsianIiLCAgICAgICJzIiwJMHgwMDAwMDAwOCwgMHhmYzFmZmZmZiwJVUJEfFJEX3MsCUkxCX0sCi17ImoiLCAgICAgICAicyIsCTB4MDAwMDAwMDgsIDB4ZmMxZmZmZmYsCVVCRHxSRF9zLAlJMQl9LCAvKiBqciAqLwotLyogU1ZSNCBQSUMgY29kZSByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBqLCBzbyBpdCBtdXN0IGJlIGEKLSAgIG1hY3JvLiAgKi8KLXsiaiIsCSAgICAiYSIsCTAsICAgICAoaW50KSBNX0pfQSwJSU5TTl9NQUNSTywJSTEJfSwKLS8qIFRoaXMgZm9ybSBvZiBqIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBhbmQgaW50ZXJuYWxseSBieSB0aGUKLSAgIGFzc2VtYmxlciwgYnV0IHdpbGwgbmV2ZXIgbWF0Y2ggdXNlciBpbnB1dCAoYmVjYXVzZSB0aGUgbGluZSBhYm92ZQotICAgd2lsbCBtYXRjaCBmaXJzdCkuICAqLwoteyJqIiwgICAgICAgImEiLAkweDA4MDAwMDAwLCAweGZjMDAwMDAwLAlVQkQsCQlJMQl9LAoteyJqYWxyIiwgICAgInMiLAkweDAwMDBmODA5LCAweGZjMWZmZmZmLAlVQkR8UkRfc3xXUl9kLAlJMQl9LAoteyJqYWxyIiwgICAgImQscyIsCTB4MDAwMDAwMDksIDB4ZmMxZjA3ZmYsCVVCRHxSRF9zfFdSX2QsCUkxCX0sCi0vKiBTVlI0IFBJQyBjb2RlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGphbCwgc28gaXQgbXVzdCBiZSBhCi0gICBtYWNyby4gICovCi17ImphbCIsICAgICAiZCxzIiwJMCwgICAgIChpbnQpIE1fSkFMXzIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImphbCIsICAgICAicyIsCTAsICAgICAoaW50KSBNX0pBTF8xLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJqYWwiLCAgICAgImEiLAkwLCAgICAgKGludCkgTV9KQUxfQSwJSU5TTl9NQUNSTywJSTEJfSwKLS8qIFRoaXMgZm9ybSBvZiBqYWwgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBpbnRlcm5hbGx5IGJ5IHRoZQotICAgYXNzZW1ibGVyLCBidXQgd2lsbCBuZXZlciBtYXRjaCB1c2VyIGlucHV0IChiZWNhdXNlIHRoZSBsaW5lIGFib3ZlCi0gICB3aWxsIG1hdGNoIGZpcnN0KS4gICovCi17ImphbCIsICAgICAiYSIsCTB4MGMwMDAwMDAsIDB4ZmMwMDAwMDAsCVVCRHxXUl8zMSwJSTEJfSwKLSAgLyogamFseCByZWFsbHkgc2hvdWxkIG9ubHkgYmUgYXZhbGlhYmxlIGlmIG1pcHMxNiBpcyBhdmFpbGFibGUsCi0gICAgIGJ1dCBmb3Igbm93IG1ha2UgaXQgSTEuICovCi17ImphbHgiLCAgICAiYSIsCTB4NzQwMDAwMDAsIDB4ZmMwMDAwMDAsIFVCRHxXUl8zMSwJSTEgICAgICB9LAoteyJsYSIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxiIiwgICAgICAidCxvKGIpIiwJMHg4MDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibGIiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xCX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsYnUiLCAgICAgInQsbyhiKSIsCTB4OTAwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxidSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQlVfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkIiwJICAgICJ0LG8oYikiLCAgIDB4ZGMwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfYiwJSTMJfSwKLXsibGQiLCAgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX0xEX09CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkYzEiLCAgICAiVCxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAlJMgl9LAoteyJsZGMxIiwgICAgIkUsbyhiKSIsCTB4ZDQwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX1R8RlBfRCwJSTIJfSwKLXsibGRjMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImxkYzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsLmQiLCAgICAgIlQsbyhiKSIsCTB4ZDQwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX1R8RlBfRCwJSTIJfSwgLyogbGRjMSAqLwoteyJsLmQiLCAgICAgIlQsbyhiKSIsCTAsICAgIChpbnQpIE1fTF9ET0IsCUlOU05fTUFDUk8sCUkxCX0sCi17ImwuZCIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MX0RBQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGRjMiIsICAgICJFLG8oYikiLAkweGQ4MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9DQywJSTIJfSwKLXsibGRjMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzJfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImxkYzMiLCAgICAiRSxvKGIpIiwJMHhkYzAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfQ0MsCUkyCX0sCi17ImxkYzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MREMzX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsZGwiLAkgICAgInQsbyhiKSIsCTB4NjgwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxXUl90fFJEX2IsCUkzCX0sCi17ImxkbCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MRExfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17ImxkciIsCSAgICAidCxvKGIpIiwJMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFdSX3R8UkRfYiwJSTMJfSwKLXsibGRyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xEUl9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsibGR4YzEiLCAgICJELHQoYikiLAkweDRjMDAwMDAxLCAweGZjMDBmODNmLCBMRER8V1JfRHxSRF90fFJEX2IsCUk0CX0sCi17ImxoIiwgICAgICAidCxvKGIpIiwJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibGgiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xIX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaHUiLCAgICAgInQsbyhiKSIsCTB4OTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxodSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MSFVfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi0vKiBsaSBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlLiAgKi8KLXsibGkuZCIsICAgICJ0LEYiLAkwLCAgICAoaW50KSBNX0xJX0QsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxpLmQiLCAgICAiVCxMIiwJMCwgICAgKGludCkgTV9MSV9ERCwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGkucyIsICAgICJ0LGYiLAkwLCAgICAoaW50KSBNX0xJX1MsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxpLnMiLCAgICAiVCxsIiwJMCwgICAgKGludCkgTV9MSV9TUywJSU5TTl9NQUNSTywJSTEJfSwKLXsibGwiLAkgICAgInQsbyhiKSIsCTB4YzAwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxSRF9ifFdSX3QsCUkyCX0sCi17ImxsIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xMX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsbGQiLAkgICAgInQsbyhiKSIsCTB4ZDAwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxSRF9ifFdSX3QsCUkzCX0sCi17ImxsZCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MTERfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17Imx1aSIsICAgICAidCx1IiwJMHgzYzAwMDAwMCwgMHhmZmUwMDAwMCwJV1JfdCwJCUkxCX0sCi17Imx3IiwgICAgICAidCxvKGIpIiwJMHg4YzAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibHciLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MwIiwgICAgIkUsbyhiKSIsCTB4YzAwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAlJMQl9LAoteyJsd2MwIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMSIsICAgICJULG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sCi17Imx3YzEiLCAgICAiRSxvKGIpIiwJMHhjNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfVHxGUF9TLAlJMQl9LAoteyJsd2MxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImwucyIsICAgICAiVCxvKGIpIiwJMHhjNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfVHxGUF9TLAlJMQl9LCAvKiBsd2MxICovCi17ImwucyIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MyIiwgICAgIkUsbyhiKSIsCTB4YzgwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAlJMQl9LAoteyJsd2MyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMyIsICAgICJFLG8oYikiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9DQywJSTEJfSwKLXsibHdjMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzNfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3bCIsICAgICAidCxvKGIpIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibHdsIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXTF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGNhY2hlIiwgICJ0LG8oYikiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMgl9LCAvKiBzYW1lICovCi17ImxjYWNoZSIsICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0xfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIGx3bCAqLwoteyJsd3IiLCAgICAgInQsbyhiKSIsCTB4OTgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17Imx3ciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1JfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImZsdXNoIiwgICAidCxvKGIpIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTIJfSwgLyogc2FtZSAqLwoteyJmbHVzaCIsICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdSX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBsd3IgKi8KLXsibHd1IiwgICAgICJ0LG8oYikiLAkweDljMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMwl9LAoteyJsd3UiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdVX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsd3hjMSIsICAgIkQsdChiKSIsCTB4NGMwMDAwMDAsIDB4ZmMwMGY4M2YsIExERHxXUl9EfFJEX3R8UkRfYiwJSTQJfSwKLQotCi17Im1hZCIsCSAgICAicyx0IiwJMHg3MDAwMDAwMCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlQMwl9LAoteyJtYWR1IiwgICAgInMsdCIsCTB4NzAwMDAwMDEsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xSRF9ISXxSRF9MTywJUDMJfSwKLXsibWFkZC5kIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyMSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoteyJtYWRkLnMiLCAgIkQsUixTLFQiLAkweDRjMDAwMDIwLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCi17Im1hZGQiLCAgICAicyx0IiwJMHgwMDAwMDAxYywgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAkJTDEJfSwKLXsibWFkZCIsICAgICJzLHQiLAkweDcwMDAwMDAwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJICAgICAgICBHMQl9LAoteyJtYWRkIiwgICAgImQscyx0IiwJMHg3MDAwMDAwMCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwJRzEJfSwKLXsibWFkZHUiLCAgICJzLHQiLAkweDAwMDAwMDFkLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCQlMMQl9LAoteyJtYWRkdSIsICAgInMsdCIsCTB4NzAwMDAwMDEsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAlHMX0sCi17Im1hZGR1IiwgICAiZCxzLHQiLAkweDcwMDAwMDAxLCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLAlHMX0sCi17Im1hZGQxNiIsICAicyx0IiwgICAgICAweDAwMDAwMDI4LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE98UkRfSEl8UkRfTE8sCVYxCX0sCi17Im1mYzAiLCAgICAidCxHIiwJMHg0MDAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzAsCUkxCX0sCi17Im1mYzEiLCAgICAidCxTIiwJMHg0NDAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfU3xGUF9TLAlJMQl9LAoteyJtZmMxIiwgICAgInQsRyIsCTB4NDQwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX1N8RlBfUywJSTEJfSwKLXsibWZjMiIsICAgICJ0LEciLAkweDQ4MDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMiwJSTEJfSwKLXsibWZjMyIsICAgICJ0LEciLAkweDRjMDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMywJSTEJfSwKLXsibWZoaSIsICAgICJkIiwJMHgwMDAwMDAxMCwgMHhmZmZmMDdmZiwJV1JfZHxSRF9ISSwJSTEJfSwKLXsibWZsbyIsICAgICJkIiwJMHgwMDAwMDAxMiwgMHhmZmZmMDdmZiwJV1JfZHxSRF9MTywJSTEJfSwKLXsibW92LmQiLCAgICJELFMiLAkweDQ2MjAwMDA2LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsibW92LnMiLCAgICJELFMiLAkweDQ2MDAwMDA2LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsibW92ZiIsICAgICJkLHMsTiIsCTB4MDAwMDAwMDEsIDB4ZmMwMzA3ZmYsIFdSX2R8UkRfc3xSRF9DQ3xGUF9EfEZQX1MsCUk0CX0sCi17Im1vdmYuZCIsICAiRCxTLE4iLAkweDQ2MjAwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwJSTQJfSwKLXsibW92Zi5zIiwgICJELFMsTiIsCTB4NDYwMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9TLAlJNAl9LAoteyJtb3ZuIiwgICAgImQsdix0IiwJMHgwMDAwMDAwYiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUk0CX0sCi17ImZmYyIsICAgICAiZCx2IiwJMHgwMDAwMDAwYiwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLEwxCX0sCi17Im1vdm4uZCIsICAiRCxTLHQiLAkweDQ2MjAwMDEzLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9ELAlJNAl9LAoteyJtb3ZuLnMiLCAgIkQsUyx0IiwJMHg0NjAwMDAxMywgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfUywJSTQJfSwKLXsibW92dCIsICAgICJkLHMsTiIsCTB4MDAwMTAwMDEsIDB4ZmMwMzA3ZmYsIFdSX2R8UkRfc3xSRF9DQywJSTQJfSwKLXsibW92dC5kIiwgICJELFMsTiIsCTB4NDYyMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNAl9LAoteyJtb3Z0LnMiLCAgIkQsUyxOIiwJMHg0NjAxMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX1MsCUk0CX0sCi17Im1vdnoiLCAgICAiZCx2LHQiLAkweDAwMDAwMDBhLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTQJfSwKLXsiZmZzIiwgICAgICJkLHYiLAkweDAwMDAwMDBhLCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsTDEJfSwKLXsibW92ei5kIiwgICJELFMsdCIsCTB4NDYyMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsCUk0CX0sCi17Im1vdnoucyIsICAiRCxTLHQiLAkweDQ2MDAwMDEyLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9TLAlJNAl9LAotLyogbW92ZSBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCi17Im1zdWIuZCIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjksIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibXN1Yi5zIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyOCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJtc3ViIiwgICAgInMsdCIsCTB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTyxMMQl9LAoteyJtc3VidSIsICAgInMsdCIsCTB4MDAwMDAwMWYsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTyxMMQl9LAoteyJtdGMwIiwgICAgInQsRyIsCTB4NDA4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MwfFdSX0NDLAlJMQl9LAoteyJtdGMxIiwgICAgInQsUyIsCTB4NDQ4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX1N8RlBfUywJSTEJfSwKLXsibXRjMSIsICAgICJ0LEciLAkweDQ0ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9TfEZQX1MsCUkxCX0sCi17Im10YzIiLCAgICAidCxHIiwJMHg0ODgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzJ8V1JfQ0MsCUkxCX0sCi17Im10YzMiLCAgICAidCxHIiwJMHg0YzgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzN8V1JfQ0MsCUkxCX0sCi17Im10aGkiLCAgICAicyIsCTB4MDAwMDAwMTEsIDB4ZmMxZmZmZmYsCVJEX3N8V1JfSEksCUkxCX0sCi17Im10bG8iLCAgICAicyIsCTB4MDAwMDAwMTMsIDB4ZmMxZmZmZmYsCVJEX3N8V1JfTE8sCUkxCX0sCi17Im11bC5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAyLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMQl9LAoteyJtdWwucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTEJfSwKLXsibXVsIiwgICAgICJkLHYsdCIsCTB4NzAwMDAwMDIsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90fFdSX0hJfFdSX0xPLFAzfSwKLXsibXVsIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fTVVMLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWwiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9NVUxfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsbyIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fTVVMTywJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsbyIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMT19JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWxvdSIsICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUxPVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsb3UiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMT1VfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsdCIsICAgICJzLHQiLAkweDAwMDAwMDE4LCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJSTF9LAoteyJtdWx0IiwgICAgImQscyx0IiwJMHgwMDAwMDAxOCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwgRzF9LAoteyJtdWx0dSIsICAgInMsdCIsCTB4MDAwMDAwMTksIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAlJMX0sCi17Im11bHR1IiwgICAiZCxzLHQiLAkweDAwMDAwMDE5LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLCBHMX0sCi17Im5lZyIsICAgICAiZCx3IiwJMHgwMDAwMDAyMiwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMQl9LCAvKiBzdWIgMCAqLwoteyJuZWd1IiwgICAgImQsdyIsCTB4MDAwMDAwMjMsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTEJfSwgLyogc3VidSAwICovCi17Im5lZy5kIiwgICAiRCxWIiwJMHg0NjIwMDAwNywgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17Im5lZy5zIiwgICAiRCxWIiwJMHg0NjAwMDAwNywgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17Im5tYWRkLmQiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzEsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibm1hZGQucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzMCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJubXN1Yi5kIiwgIkQsUixTLFQiLAkweDRjMDAwMDM5LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im5tc3ViLnMiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzgsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLS8qIG5vcCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlLiAgKi8KLXsibm9yIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJub3IiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9OT1JfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibm90IiwgICAgICJkLHYiLAkweDAwMDAwMDI3LCAweGZjMWYwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwvKm5vciBkLHMsMCovCi17Im9yIiwgICAgICAiZCx2LHQiLAkweDAwMDAwMDI1LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsib3IiLCAgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fT1JfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsib3JpIiwgICAgICJ0LHIsaSIsCTB4MzQwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLQotCi17InByZWYiLCAgICAiayxvKGIpIiwJMHhjYzAwMDAwMCwgMHhmYzAwMDAwMCwgUkRfYiwJCUczCX0sCi17InByZWZ4IiwgICAiaCx0KGIpIiwJMHg0YzAwMDAwZiwgMHhmYzAwMDdmZiwgUkRfYnxSRF90LAlJNAl9LAotCi0KLXsicmVjaXAuZCIsICJELFMiLAkweDQ2MjAwMDE1LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTQJfSwKLXsicmVjaXAucyIsICJELFMiLAkweDQ2MDAwMDE1LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTQJfSwKLXsicmVtIiwgICAgICJ6LHMsdCIsCTB4MDAwMDAwMWEsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEgfSwKLXsicmVtIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUkVNXzMsCUlOU05fTUFDUk8sCUkxCX0sCi17InJlbSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JFTV8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicmVtdSIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWIsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEgfSwKLXsicmVtdSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUkVNVV8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZW11IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9SRU1VXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZmUiLCAgICAgIiIsCQkweDQyMDAwMDEwLCAweGZmZmZmZmZmLAkwLAlJMXxUMwkJfSwKLXsicm9sIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUk9MLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyb2wiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ST0xfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm9yIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUk9SLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyb3IiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ST1JfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm91bmQubC5kIiwgIkQsUyIsCTB4NDYyMDAwMDgsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJyb3VuZC5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwOCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17InJvdW5kLncuZCIsICJELFMiLAkweDQ2MjAwMDBjLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsicm91bmQudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGMsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJyc3FydC5kIiwgIkQsUyIsCTB4NDYyMDAwMTYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJNAl9LAoteyJyc3FydC5zIiwgIkQsUyIsCTB4NDYwMDAwMTYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJNAl9LAoteyJzYiIsICAgICAgInQsbyhiKSIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic2IiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NCX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzYyIsCSAgICAidCxvKGIpIiwJMHhlMDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfdHxXUl90fFJEX2IsCUkyCX0sCi17InNjIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NDX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzY2QiLAkgICAgInQsbyhiKSIsCTB4ZjAwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX3R8V1JfdHxSRF9iLAlJMwl9LAoteyJzY2QiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0NEX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJzZCIsCSAgICAidCxvKGIpIiwJMHhmYzAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMwl9LAoteyJzZCIsICAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fU0RfT0IsCUlOU05fTUFDUk8sCUkxCX0sCi17InNkIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TRF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2RiYnAiLCAgICIiLAkJMHgwMDAwMDAwZSwgMHhmZmZmZmZmZiwJVFJBUCwgICAgICAgICAgIEcyCX0sCi17InNkYmJwIiwgICAiYyIsCTB4MDAwMDAwMGUsIDB4ZmMwMGZmZmYsCVRSQVAsCQlHMgl9LAoteyJzZGJicCIsICAgImMscSIsCTB4MDAwMDAwMGUsIDB4ZmMwMDAwM2YsCVRSQVAsCQlHMgl9LAoteyJzZGMxIiwgICAgIlQsbyhiKSIsCTB4ZjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX1R8UkRfYnxGUF9ELAlJMgl9LAoteyJzZGMxIiwgICAgIkUsbyhiKSIsCTB4ZjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX1R8UkRfYnxGUF9ELAlJMgl9LAoteyJzZGMxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2RjMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNkYzIiLCAgICAiRSxvKGIpIiwJMHhmODAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfQzJ8UkRfYiwJSTIJfSwKLXsic2RjMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzJfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNkYzMiLCAgICAiRSxvKGIpIiwJMHhmYzAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfQzN8UkRfYiwJSTIJfSwKLXsic2RjMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzNfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InMuZCIsICAgICAiVCxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCUkyCX0sCi17InMuZCIsICAgICAiVCxvKGIpIiwJMCwgICAgKGludCkgTV9TX0RPQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsicy5kIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NfREFCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZGwiLCAgICAgInQsbyhiKSIsCTB4YjAwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTMJfSwKLXsic2RsIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NETF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsic2RyIiwgICAgICJ0LG8oYikiLAkweGI0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkzCX0sCi17InNkciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TRFJfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17InNkeGMxIiwgICAiUyx0KGIpIiwgICAweDRjMDAwMDA5LCAweGZjMDAwN2ZmLCBTTXxSRF9TfFJEX3R8UkRfYiwJSTQJfSwKLXsic2Vsc2wiLCAgICJkLHYsdCIsCTB4MDAwMDAwMDUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LEwxCX0sCi17InNlbHNyIiwgICAiZCx2LHQiLAkweDAwMDAwMDAxLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCxMMQl9LAoteyJzZXEiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TRVEsCUlOU05fTUFDUk8sCUkxCX0sCi17InNlcSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NFUV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2UiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR0UsCUlOU05fTUFDUk8sCUkxCX0sCi17InNnZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2V1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR0VVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2V1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR0VVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNndCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHVCwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2d0IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNndHUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHVFUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNndHUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2giLCAgICAgICJ0LG8oYikiLAkweGE0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InNoIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TSF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xlIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0xFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGUiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTEVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xldSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0xFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xldSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGx2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sCi17InNsbCIsICAgICAiZCx3LHMiLAkweDAwMDAwMDA0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwgLyogc2xsdiAqLwoteyJzbGwiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMCwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMQl9LAoteyJzbHQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyYSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InNsdCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbHRpIiwgICAgInQscixqIiwJMHgyODAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJzbHRpdSIsICAgInQscixqIiwJMHgyYzAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJzbHR1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyYiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InNsdHUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic25lIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU05FLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbmUiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTkVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3FydC5kIiwgICJELFMiLAkweDQ2MjAwMDA0LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsic3FydC5zIiwgICJELFMiLAkweDQ2MDAwMDA0LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsic3JhdiIsICAgICJkLHQscyIsCTB4MDAwMDAwMDcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LAoteyJzcmEiLCAgICAgImQsdyxzIiwJMHgwMDAwMDAwNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sIC8qIHNyYXYgKi8KLXsic3JhIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTEJfSwKLXsic3JsdiIsICAgICJkLHQscyIsCTB4MDAwMDAwMDYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LAoteyJzcmwiLCAgICAgImQsdyxzIiwJMHgwMDAwMDAwNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sIC8qIHNybHYgKi8KLXsic3JsIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTEJfSwKLXsic3RhbmRieSIsICIiLCAgICAgICAgIDB4NDIwMDAwMjEsIDB4ZmZmZmZmZmYsCTAsCQlWMQl9LAoteyJzdWIiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyMiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InN1YiIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NVQl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzdWIuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTEJfSwgICAgIAoteyJzdWIucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTEJfSwKLXsic3VidSIsICAgICJkLHYsdCIsCTB4MDAwMDAwMjMsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzdWJ1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TVUJVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InN1c3BlbmQiLCAiIiwgICAgICAgICAweDQyMDAwMDIyLCAweGZmZmZmZmZmLAkwLAkJVjEJfSwKLXsic3ciLCAgICAgICJ0LG8oYikiLAkweGFjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InN3IiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMCIsICAgICJFLG8oYikiLAkweGUwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9DMHxSRF9iLAlJMQl9LAoteyJzd2MwIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMSIsICAgICJULG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJSTEJfSwKLXsic3djMSIsICAgICJFLG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJSTEJfSwKLXsic3djMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzLnMiLCAgICAgIlQsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LCAvKiBzd2MxICovCi17InMucyIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MyIiwgICAgIkUsbyhiKSIsCTB4ZTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MyfFJEX2IsCUkxCX0sCi17InN3YzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MyX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MzIiwgICAgIkUsbyhiKSIsCTB4ZWMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MzfFJEX2IsCUkxCX0sCi17InN3YzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MzX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2wiLCAgICAgInQsbyhiKSIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic3dsIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXTF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2NhY2hlIiwgICJ0LG8oYikiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLAlSRF90fFJEX2IsCUkyCX0sIC8qIHNhbWUgKi8KLXsic2NhY2hlIiwgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgc3dsICovCi17InN3ciIsICAgICAidCxvKGIpIiwJMHhiODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzd3IiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dSX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJpbnZhbGlkYXRlIiwgInQsbyhiKSIsMHhiODAwMDAwMCwgMHhmYzAwMDAwMCwJUkRfdHxSRF9iLAlJMgl9LCAvKiBzYW1lICovCi17ImludmFsaWRhdGUiLCAidCxBKGIpIiwwLCAgICAoaW50KSBNX1NXUl9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgc3dyICovCi17InN3eGMxIiwgICAiUyx0KGIpIiwgICAweDRjMDAwMDA4LCAweGZjMDAwN2ZmLCBTTXxSRF9TfFJEX3R8UkRfYiwJSTQJfSwKLXsic3luYyIsICAgICIiLAkJMHgwMDAwMDAwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAlJMnxHMQl9LAoteyJzeW5jLnAiLCAgIiIsCQkweDAwMDAwNDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCUkyCX0sCi17InN5bmMubCIsICAiIiwJCTB4MDAwMDAwMGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJSTIJfSwKLXsic3lzY2FsbCIsICIiLAkJMHgwMDAwMDAwYywgMHhmZmZmZmZmZiwJVFJBUCwJSTEJCX0sCi17InN5c2NhbGwiLCAiQiIsCTB4MDAwMDAwMGMsIDB4ZmMwMDAwM2YsCVRSQVAsCUkxCQl9LAoteyJ0ZXFpIiwgICAgInMsaiIsCTB4MDQwYzAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwKLXsidGVxIiwJICAgICJzLHQiLAkweDAwMDAwMDM0LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGVxIiwJICAgICJzLHQscSIsCTB4MDAwMDAwMzQsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0ZXEiLCAgICAgInMsaiIsCTB4MDQwYzAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwgLyogdGVxaSAqLwoteyJ0ZXEiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEVRX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRnZWkiLCAgICAicyxqIiwJMHgwNDA4MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LAoteyJ0Z2UiLAkgICAgInMsdCIsCTB4MDAwMDAwMzAsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0Z2UiLAkgICAgInMsdCxxIiwJMHgwMDAwMDAzMCwgMHhmYzAwMDAzZiwJUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRnZSIsICAgICAicyxqIiwJMHgwNDA4MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LCAvKiB0Z2VpICovCi17InRnZSIsCSAgICAicyxJIiwJMCwgICAgKGludCkgTV9UR0VfSSwgICAgSU5TTl9NQUNSTywJSTIJfSwKLXsidGdlaXUiLCAgICJzLGoiLAkweDA0MDkwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LAoteyJ0Z2V1IiwgICAgInMsdCIsCTB4MDAwMDAwMzEsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGdldSIsICAgICJzLHQscSIsCTB4MDAwMDAwMzEsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGdldSIsICAgICJzLGoiLAkweDA0MDkwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LCAvKiB0Z2VpdSAqLwoteyJ0Z2V1IiwgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEdFVV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0bGJwIiwgICAgIiIsCQkweDQyMDAwMDA4LCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTEJfSwKLXsidGxiciIsICAgICIiLAkJMHg0MjAwMDAwMSwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxCX0sCi17InRsYndpIiwgICAiIiwJCTB4NDIwMDAwMDIsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMQl9LAoteyJ0bGJ3ciIsICAgIiIsCQkweDQyMDAwMDA2LCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTEJfSwKLXsidGx0aSIsICAgICJzLGoiLAkweDA0MGEwMDAwLCAweGZjMWYwMDAwLAlSRF9zfFRSQVAsCUkyCQl9LAoteyJ0bHQiLCAgICAgInMsdCIsCTB4MDAwMDAwMzIsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0IiwgICAgICJzLHQscSIsCTB4MDAwMDAwMzIsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0IiwgICAgICJzLGoiLAkweDA0MGEwMDAwLCAweGZjMWYwMDAwLAlSRF9zfFRSQVAsCUkyCQl9LCAvKiB0bHRpICovCi17InRsdCIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTFRfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidGx0aXUiLCAgICJzLGoiLAkweDA0MGIwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LAoteyJ0bHR1IiwgICAgInMsdCIsCTB4MDAwMDAwMzMsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0dSIsICAgICJzLHQscSIsCTB4MDAwMDAwMzMsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0dSIsICAgICJzLGoiLAkweDA0MGIwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LCAvKiB0bHRpdSAqLwoteyJ0bHR1IiwgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVExUVV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0bmVpIiwgICAgInMsaiIsCTB4MDQwZTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCi17InRuZSIsICAgICAicyx0IiwJMHgwMDAwMDAzNiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bmUiLCAgICAgInMsdCxxIiwJMHgwMDAwMDAzNiwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bmUiLCAgICAgInMsaiIsCTB4MDQwZTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRuZWkgKi8KLXsidG5lIiwgICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RORV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0cnVuYy5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwOSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17InRydW5jLmwucyIsICJELFMiLAkweDQ2MDAwMDA5LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsidHJ1bmMudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJ0cnVuYy53LmQiLCAiRCxTLHgiLAkweDQ2MjAwMDBkLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsidHJ1bmMudy5kIiwgIkQsUyx0IiwJMCwgICAgKGludCkgTV9UUlVOQ1dELAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ0cnVuYy53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InRydW5jLncucyIsICJELFMseCIsCTB4NDYwMDAwMGQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJ0cnVuYy53LnMiLCAiRCxTLHQiLAkwLCAgICAoaW50KSBNX1RSVU5DV1MsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsZCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEQsCUlOU05fTUFDUk8sCUkzCX0sCi17InVsZCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTERfQSwJSU5TTl9NQUNSTywJSTMJfSwKLXsidWxoIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMSCwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxoIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMSF9BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGh1IiwgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxIVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxodSIsICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMSFVfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWx3IiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMVywJSU5TTl9NQUNSTywJSTEJfSwKLXsidWx3IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMV19BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c2QiLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVVNELAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1c2QiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNEX0EsCUlOU05fTUFDUk8sCUkzCX0sCi17InVzaCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VU0gsCUlOU05fTUFDUk8sCUkxCX0sCi17InVzaCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VU0hfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidXN3IiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTVywJSU5TTl9NQUNSTywJSTEJfSwKLXsidXN3IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VTV19BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ4b3IiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InhvciIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX1hPUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ4b3JpIiwgICAgInQscixpIiwJMHgzODAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJ3YWl0IiwgICAgIiIsCQkweDQyMDAwMDIwLCAweGZmZmZmZmZmLAlUUkFQLAlJMwl9LAoteyJ3YWl0aSIsICAgIiIsCQkweDQyMDAwMDIwLCAweGZmZmZmZmZmLAlUUkFQLAlMMQl9LAoteyJ3YiIsIAkgICAgIm8oYikiLAkweGJjMDQwMDAwLCAweGZjMWYwMDAwLCBTTXxSRF9iLAlMMQl9LAotLyogTm8gaGF6YXJkIHByb3RlY3Rpb24gb24gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLS10aGV5IHNob3VsZG4ndAotICAgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIGFuZCBpZiB0aGV5IGRvIGl0J3MgdXAgdG8gdGhlCi0gICB1c2VyIHRvIHB1dCBpbiBub3BzIGFzIG5lY2Vzc2FyeS4gIFRoZXNlIGFyZSBhdCB0aGUgZW5kIHNvIHRoYXQgdGhlCi0gICBkaXNhc2VtYmxlciByZWNvZ25pemVzIG1vcmUgc3BlY2lmaWMgdmVyc2lvbnMgZmlyc3QuICAqLwoteyJjMCIsICAgICAgIkMiLAkweDQyMDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiYzEiLCAgICAgICJDIiwJMHg0NjAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImMyIiwgICAgICAiQyIsCTB4NGEwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjMyIsICAgICAgIkMiLAkweDRlMDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiY29wMCIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMCwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMSIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMiIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMyIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMywJSU5TTl9NQUNSTywJSTEJfSwKLQotICAvKiBDb25mbGljdHMgd2l0aCB0aGUgNDY1MCdzICJtdWwiIGluc3RydWN0aW9uLiAgTm9ib2R5J3MgdXNpbmcgdGhlCi0gICAgIDQwMTAgYW55IG1vcmUsIHNvIG1vdmUgdGhpcyBpbnNuIG91dCBvZiB0aGUgd2F5LiAgSWYgdGhlIG9iamVjdAotICAgICBmb3JtYXQgZ2F2ZSB1cyBtb3JlIGluZm8sIHdlIGNvdWxkIGRvIHRoaXMgcmlnaHQuICAqLwoteyJhZGRjaXUiLCAgInQscixqIiwJMHg3MDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLEwxCX0sCi19OwotCi0jZGVmaW5lIE1JUFNfTlVNX09QQ09ERVMgXAotCSgoc2l6ZW9mIG1pcHNfYnVpbHRpbl9vcGNvZGVzKSAvIChzaXplb2YgKG1pcHNfYnVpbHRpbl9vcGNvZGVzWzBdKSkpCi1jb25zdCBpbnQgYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2RlcyA9IE1JUFNfTlVNX09QQ09ERVM7Ci0KLS8qIGNvbnN0IHJlbW92ZWQgZnJvbSB0aGUgZm9sbG93aW5nIHRvIGFsbG93IGZvciBkeW5hbWljIGV4dGVuc2lvbnMgdG8gdGhlIAotICogYnVpbHQtaW4gaW5zdHJ1Y3Rpb24gc2V0LiAqLwotc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX29wY29kZXMgPQotICAoc3RydWN0IG1pcHNfb3Bjb2RlICopIG1pcHNfYnVpbHRpbl9vcGNvZGVzOwotaW50IGJmZF9taXBzX251bV9vcGNvZGVzID0gTUlQU19OVU1fT1BDT0RFUzsKLSN1bmRlZiBNSVBTX05VTV9PUENPREVTCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWlwczE2LW9wYy5jIGIvb3Bjb2Rlcy9taXBzMTYtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDJkYmIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9taXBzMTYtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogbWlwczE2LW9wYy5jLiAgTWlwczE2IG9wY29kZSB0YWJsZS4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLQotLyogVGhpcyBpcyB0aGUgb3Bjb2RlcyB0YWJsZSBmb3IgdGhlIG1pcHMxNiBwcm9jZXNzb3IuICBUaGUgZm9ybWF0IG9mCi0gICB0aGlzIHRhYmxlIGlzIGludGVudGlvbmFsbHkgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaW4gbWlwcy1vcGMuYy4KLSAgIEhvd2V2ZXIsIHRoZSBzcGVjaWFsIGxldHRlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIGFyZ3VtZW50IHN0cmluZyBhcmUKLSAgIGRpZmZlcmVudCwgYW5kIHRoZSB0YWJsZSB1c2VzIHNvbWUgZGlmZmVyZW50IGZsYWdzLiAgKi8KLQotLyogVXNlIHNvbWUgc2hvcnQgaGFuZCBtYWNyb3MgdG8ga2VlcCBkb3duIHRoZSBsZW5ndGggb2YgdGhlIGxpbmVzIGluCi0gICB0aGUgb3Bjb2RlcyB0YWJsZS4gICovCi0KLSNkZWZpbmUgVUJEICAgICBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLSNkZWZpbmUgQlIgICAgICBNSVBTMTZfSU5TTl9CUkFOQ0gKLQotI2RlZmluZSBXUl94CU1JUFMxNl9JTlNOX1dSSVRFX1gKLSNkZWZpbmUgV1JfeQlNSVBTMTZfSU5TTl9XUklURV9ZCi0jZGVmaW5lIFdSX3oJTUlQUzE2X0lOU05fV1JJVEVfWgotI2RlZmluZSBXUl9UCU1JUFMxNl9JTlNOX1dSSVRFX1QKLSNkZWZpbmUgV1JfU1AJTUlQUzE2X0lOU05fV1JJVEVfU1AKLSNkZWZpbmUgV1JfMzEJTUlQUzE2X0lOU05fV1JJVEVfMzEKLSNkZWZpbmUgV1JfWQlNSVBTMTZfSU5TTl9XUklURV9HUFJfWQotCi0jZGVmaW5lIFJEX3gJTUlQUzE2X0lOU05fUkVBRF9YCi0jZGVmaW5lIFJEX3kJTUlQUzE2X0lOU05fUkVBRF9ZCi0jZGVmaW5lIFJEX1oJTUlQUzE2X0lOU05fUkVBRF9aCi0jZGVmaW5lIFJEX1QJTUlQUzE2X0lOU05fUkVBRF9UCi0jZGVmaW5lIFJEX1NQCU1JUFMxNl9JTlNOX1JFQURfU1AKLSNkZWZpbmUgUkRfMzEJTUlQUzE2X0lOU05fUkVBRF8zMQotI2RlZmluZSBSRF9QQwlNSVBTMTZfSU5TTl9SRUFEX1BDCi0jZGVmaW5lIFJEX1gJTUlQUzE2X0lOU05fUkVBRF9HUFJfWAotCi0jZGVmaW5lIFdSX0hJCUlOU05fV1JJVEVfSEkKLSNkZWZpbmUgV1JfTE8JSU5TTl9XUklURV9MTwotI2RlZmluZSBSRF9ISQlJTlNOX1JFQURfSEkKLSNkZWZpbmUgUkRfTE8JSU5TTl9SRUFEX0xPCi0KLSNkZWZpbmUgVFJBUAlJTlNOX1RSQVAKLQotI2RlZmluZSBJMwlJTlNOX0lTQTMKLQotI2RlZmluZSBUMyAgICAgIElOU05fMzkwMAotCi1jb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwczE2X29wY29kZXNbXSA9IHsKLXsibm9wIiwJICAgICIiLAkJMHg2NTAwLCAweGZmZmYsIFJEX1ogfSwgLyogbW92ZSAkMCwkWiAqLwoteyJsYSIsCSAgICAieCxBIiwJMHgwODAwLCAweGY4MDAsIFdSX3h8UkRfUEMgfSwKLXsiYWJzIiwJICAgICJ4LHciLAkwLCAoaW50KSBNX0FCUywgSU5TTl9NQUNSTyB9LAoteyJhZGRpdSIsICAgInkseCw0IiwJMHg0MDAwLCAweGY4MTAsIFdSX3l8UkRfeCB9LAoteyJhZGRpdSIsICAgIngsayIsCTB4NDgwMCwgMHhmODAwLCBXUl94fFJEX3ggfSwKLXsiYWRkaXUiLCAgICJTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKLXsiYWRkaXUiLCAgICJTLFMsSyIsCTB4NjMwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCB9LAoteyJhZGRpdSIsICAgIngsUCxWIiwJMHgwODAwLCAweGY4MDAsIFdSX3h8UkRfUEMgfSwKLXsiYWRkaXUiLCAgICJ4LFMsViIsCTB4MDAwMCwgMHhmODAwLCBXUl94fFJEX1NQIH0sCi17ImFkZHUiLCAgICAieix2LHkiLAkweGUwMDEsIDB4ZjgwMywgV1JfenxSRF94fFJEX3kgfSwKLXsiYWRkdSIsICAgICJ5LHgsNCIsCTB4NDAwMCwgMHhmODEwLCBXUl95fFJEX3ggfSwKLXsiYWRkdSIsICAgICJ4LGsiLAkweDQ4MDAsIDB4ZjgwMCwgV1JfeHxSRF94IH0sCi17ImFkZHUiLCAgICAiUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZHUiLCAgICAiUyxTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKLXsiYWRkdSIsICAgICJ4LFAsViIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17ImFkZHUiLCAgICAieCxTLFYiLAkweDAwMDAsIDB4ZjgwMCwgV1JfeHxSRF9TUCB9LAoteyJhbmQiLAkgICAgIngseSIsCTB4ZTgwYywgMHhmODFmLCBXUl94fFJEX3h8UkRfeSB9LAoteyJiIiwJICAgICJxIiwJMHgxMDAwLCAweGY4MDAsIEJSfSwKLXsiYmVxIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkVRLCBJTlNOX01BQ1JPIH0sCi17ImJlcSIsICAgICAieCxVLHAiLAkwLCAoaW50KSBNX0JFUV9JLCBJTlNOX01BQ1JPIH0sCi17ImJlcXoiLCAgICAieCxwIiwJMHgyMDAwLCAweGY4MDAsIEJSfFJEX3ggfSwKLXsiYmdlIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkdFLCBJTlNOX01BQ1JPIH0sCi17ImJnZSIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHRV9JLCBJTlNOX01BQ1JPIH0sCi17ImJnZXUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHRVUsIElOU05fTUFDUk8gfSwKLXsiYmdldSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkdFVV9JLCBJTlNOX01BQ1JPIH0sCi17ImJndCIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHVCwgSU5TTl9NQUNSTyB9LAoteyJiZ3QiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR1RfSSwgSU5TTl9NQUNSTyB9LAoteyJiZ3R1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CR1RVLCBJTlNOX01BQ1JPIH0sCi17ImJndHUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHVFVfSSwgSU5TTl9NQUNSTyB9LAoteyJibGUiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CTEUsIElOU05fTUFDUk8gfSwKLXsiYmxlIiwgICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxFX0ksIElOU05fTUFDUk8gfSwKLXsiYmxldSIsICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxFVSwgSU5TTl9NQUNSTyB9LAoteyJibGV1IiwgICAgIngsOCxwIiwJMCwgKGludCkgTV9CTEVVX0ksIElOU05fTUFDUk8gfSwKLXsiYmx0IiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxULCBJTlNOX01BQ1JPIH0sCi17ImJsdCIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMVF9JLCBJTlNOX01BQ1JPIH0sCi17ImJsdHUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMVFUsIElOU05fTUFDUk8gfSwKLXsiYmx0dSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxUVV9JLCBJTlNOX01BQ1JPIH0sCi17ImJuZSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JORSwgSU5TTl9NQUNSTyB9LAoteyJibmUiLCAgICAgIngsVSxwIiwJMCwgKGludCkgTV9CTkVfSSwgSU5TTl9NQUNSTyB9LAoteyJibmV6IiwgICAgIngscCIsCTB4MjgwMCwgMHhmODAwLCBCUnxSRF94IH0sCi17ImJyZWFrIiwgICAiNiIsCTB4ZTgwNSwgMHhmODFmLCBUUkFQIH0sCi17ImJ0ZXF6IiwgICAicCIsCTB4NjAwMCwgMHhmZjAwLCBCUnxSRF9UIH0sCi17ImJ0bmV6IiwgICAicCIsCTB4NjEwMCwgMHhmZjAwLCBCUnxSRF9UIH0sCi17ImNtcGkiLCAgICAieCxVIiwJMHg3MDAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJjbXAiLAkgICAgIngseSIsCTB4ZTgwYSwgMHhmODFmLCBXUl9UfFJEX3h8UkRfeSB9LAoteyJjbXAiLCAgICAgIngsVSIsCTB4NzAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsiZGxhIiwJICAgICJ5LEUiLAkweGZlMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsiZGFkZGl1IiwgICJ5LHgsNCIsCTB4NDAxMCwgMHhmODEwLCBXUl95fFJEX3gsIEkzIH0sCi17ImRhZGRpdSIsICAieSxqIiwJMHhmZDAwLCAweGZmMDAsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZGFkZGl1IiwgICJTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGRpdSIsICAiUyxTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGRpdSIsICAieSxQLFciLAkweGZlMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsiZGFkZGl1IiwgICJ5LFMsVyIsCTB4ZmYwMCwgMHhmZjAwLCBXUl95fFJEX1NQLCBJMyB9LAoteyJkYWRkdSIsICAgInosdix5IiwJMHhlMDAwLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95LCBJMyB9LAoteyJkYWRkdSIsICAgInkseCw0IiwJMHg0MDEwLCAweGY4MTAsIFdSX3l8UkRfeCwgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LGoiLAkweGZkMDAsIDB4ZmYwMCwgV1JfeXxSRF95LCBJMyB9LAoteyJkYWRkdSIsICAgIlMsSyIsCTB4ZmIwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCwgSTMgfSwKLXsiZGFkZHUiLCAgICJTLFMsSyIsCTB4ZmIwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCwgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LFAsVyIsCTB4ZmUwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJkYWRkdSIsICAgInksUyxXIiwJMHhmZjAwLCAweGZmMDAsIFdSX3l8UkRfU1AsIEkzIH0sCi17ImRkaXYiLCAgICAiMCx4LHkiLAkweGU4MWUsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkZGl2IiwgICAgInosdix5IiwJMCwgKGludCkgTV9ERElWXzMsIElOU05fTUFDUk8gfSwKLXsiZGRpdnUiLCAgICIwLHgseSIsCTB4ZTgxZiwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRkaXZ1IiwgICAieix2LHkiLAkwLCAoaW50KSBNX0RESVZVXzMsIElOU05fTUFDUk8gfSwKLXsiZGl2IiwgICAgICIwLHgseSIsCTB4ZTgxYSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsiZGl2IiwgICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRElWXzMsIElOU05fTUFDUk8gfSwKLXsiZGl2dSIsICAgICIwLHgseSIsCTB4ZTgxYiwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsiZGl2dSIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRElWVV8zLCBJTlNOX01BQ1JPIH0sCi17ImRtdWwiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RNVUwsIElOU05fTUFDUk8sIEkzIH0sCi17ImRtdWx0IiwgICAieCx5IiwJMHhlODFjLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZG11bHR1IiwgICJ4LHkiLAkweGU4MWQsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkcmVtIiwgICAgIjAseCx5IiwJMHhlODFlLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZHJlbSIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRFJFTV8zLCBJTlNOX01BQ1JPIH0sCi17ImRyZW11IiwgICAiMCx4LHkiLAkweGU4MWYsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkcmVtdSIsICAgInosdix5IiwJMCwgKGludCkgTV9EUkVNVV8zLCBJTlNOX01BQ1JPIH0sCi17ImRzbGx2IiwgICAieSx4IiwJMHhlODE0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc2xsIiwgICAgIngsdyxbIiwJMHgzMDAxLCAweGY4MDMsIFdSX3h8UkRfeSwgSTMgfSwKLXsiZHNsbCIsICAgICJ5LHgiLAkweGU4MTQsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzcmF2IiwgICAieSx4IiwJMHhlODE3LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3JhIiwgICAgInksXSIsCTB4ZTgxMywgMHhmODFmLCBXUl95fFJEX3ksIEkzIH0sCi17ImRzcmEiLCAgICAieSx4IiwJMHhlODE3LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3JsdiIsICAgInkseCIsCTB4ZTgxNiwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNybCIsICAgICJ5LF0iLAkweGU4MDgsIDB4ZjgxZiwgV1JfeXxSRF95LCBJMyB9LAoteyJkc3JsIiwgICAgInkseCIsCTB4ZTgxNiwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHN1YnUiLCAgICJ6LHYseSIsCTB4ZTAwMiwgMHhmODAzLCBXUl96fFJEX3h8UkRfeSwgSTMgfSwKLXsiZHN1YnUiLCAgICJ5LHgsNCIsCTAsIChpbnQpIE1fRFNVQlVfSSwgSU5TTl9NQUNSTyB9LAoteyJkc3VidSIsICAgInksaiIsCTAsIChpbnQpIE1fRFNVQlVfSV8yLCBJTlNOX01BQ1JPIH0sCi17ImV4aXQiLCAgICAiTCIsCTB4ZWQwOSwgMHhmZjFmLCBUUkFQIH0sCi17ImV4aXQiLCAgICAiTCIsCTB4ZWUwOSwgMHhmZjFmLCBUUkFQIH0sCi17ImV4aXQiLCAgICAiTCIsCTB4ZWYwOSwgMHhmZjFmLCBUUkFQIH0sCi17ImVudHJ5IiwgICAibCIsCTB4ZTgwOSwgMHhmODFmLCBUUkFQIH0sCi17ImV4dGVuZCIsICAiZSIsCTB4ZjAwMCwgMHhmODAwLCAwIH0sCi17ImphbHIiLCAgICAieCIsCTB4ZTg0MCwgMHhmOGZmLCBVQkR8V1JfMzF8UkRfeCB9LAoteyJqYWxyIiwgICAgIlIseCIsCTB4ZTg0MCwgMHhmOGZmLCBVQkR8V1JfMzF8UkRfeCB9LAoteyJqYWwiLCAgICAgIngiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsIiwgICAgICJSLHgiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsIiwJICAgICJhIiwJMHgxODAwLCAweGZjMDAsIFVCRHxXUl8zMSB9LAoteyJqYWx4IiwgICAgImEiLAkweDFjMDAsIDB4ZmMwMCwgVUJEfFdSXzMxIH0sCi17ImpyIiwJICAgICJ4IiwJMHhlODAwLCAweGY4ZmYsIFVCRHxSRF94IH0sCi17ImpyIiwJICAgICJSIiwJMHhlODIwLCAweGZmZmYsIFVCRHxSRF8zMSB9LAoteyJqIiwJICAgICJ4IiwJMHhlODAwLCAweGY4ZmYsIFVCRHxSRF94IH0sCi17ImoiLAkgICAgIlIiLAkweGU4MjAsIDB4ZmZmZiwgVUJEfFJEXzMxIH0sCi17ImxiIiwJICAgICJ5LDUoeCkiLAkweDgwMDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17ImxidSIsCSAgICAieSw1KHgpIiwJMHhhMDAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsZCIsCSAgICAieSxEKHgpIiwJMHgzODAwLCAweGY4MDAsIFdSX3l8UkRfeCwgSTMgfSwKLXsibGQiLAkgICAgInksQiIsCTB4ZmMwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJsZCIsCSAgICAieSxEKFApIiwJMHhmYzAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImxkIiwJICAgICJ5LEQoUykiLAkweGY4MDAsIDB4ZmYwMCwgV1JfeXxSRF9TUCwgSTMgfSwKLXsibGgiLAkgICAgInksSCh4KSIsCTB4ODgwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibGh1IiwJICAgICJ5LEgoeCkiLAkweGE4MDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17ImxpIiwJICAgICJ4LFUiLAkweDY4MDAsIDB4ZjgwMCwgV1JfeCB9LAoteyJsdyIsCSAgICAieSxXKHgpIiwJMHg5ODAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsdyIsCSAgICAieCxBIiwJMHhiMDAwLCAweGY4MDAsIFdSX3h8UkRfUEMgfSwKLXsibHciLAkgICAgIngsVihQKSIsCTB4YjAwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17Imx3IiwJICAgICJ4LFYoUykiLAkweDkwMDAsIDB4ZjgwMCwgV1JfeHxSRF9TUCB9LAoteyJsd3UiLCAgICAgInksVyh4KSIsCTB4YjgwMCwgMHhmODAwLCBXUl95fFJEX3gsIEkzIH0sCi17Im1maGkiLCAgICAieCIsCTB4ZTgxMCwgMHhmOGZmLCBXUl94fFJEX0hJIH0sCi17Im1mbG8iLCAgICAieCIsCTB4ZTgxMiwgMHhmOGZmLCBXUl94fFJEX0xPIH0sCi17Im1vdmUiLCAgICAieSxYIiwJMHg2NzAwLCAweGZmMDAsIFdSX3l8UkRfWCB9LAoteyJtb3ZlIiwgICAgIlksWiIsCTB4NjUwMCwgMHhmZjAwLCBXUl9ZfFJEX1ogfSwKLXsibXVsIiwgICAgICJ6LHYseSIsCTAsIChpbnQpIE1fTVVMLCBJTlNOX01BQ1JPIH0sCi17Im11bHQiLCAgICAieCx5IiwJMHhlODE4LCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJtdWx0dSIsICAgIngseSIsCTB4ZTgxOSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsibmVnIiwJICAgICJ4LHciLAkweGU4MGIsIDB4ZjgxZiwgV1JfeHxSRF95IH0sCi17Im5vdCIsCSAgICAieCx3IiwJMHhlODBmLCAweGY4MWYsIFdSX3h8UkRfeSB9LAoteyJvciIsCSAgICAieCx5IiwJMHhlODBkLCAweGY4MWYsIFdSX3h8UkRfeHxSRF95IH0sCi17InJlbSIsICAgICAiMCx4LHkiLAkweGU4MWEsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17InJlbSIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX1JFTV8zLCBJTlNOX01BQ1JPIH0sCi17InJlbXUiLCAgICAiMCx4LHkiLAkweGU4MWIsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17InJlbXUiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX1JFTVVfMywgSU5TTl9NQUNSTyB9LAoteyJzYiIsCSAgICAieSw1KHgpIiwJMHhjMDAwLCAweGY4MDAsIFJEX3l8UkRfeCB9LAoteyJzZCIsCSAgICAieSxEKHgpIiwJMHg3ODAwLCAweGY4MDAsIFJEX3l8UkRfeCwgSTMgfSwKLXsic2QiLAkgICAgInksRChTKSIsCTB4ZjkwMCwgMHhmZjAwLCBSRF95fFJEX1BDLCBJMyB9LAoteyJzZCIsCSAgICAiUixDKFMpIiwJMHhmYTAwLCAweGZmMDAsIFJEXzMxfFJEX1BDIH0sCi17InNoIiwJICAgICJ5LEgoeCkiLAkweGM4MDAsIDB4ZjgwMCwgUkRfeXxSRF94IH0sCi17InNsbHYiLCAgICAieSx4IiwJMHhlODA0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94IH0sCi17InNsbCIsCSAgICAieCx3LDwiLAkweDMwMDAsIDB4ZjgwMywgV1JfeHxSRF95IH0sCi17InNsbCIsICAgICAieSx4IiwJMHhlODA0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94IH0sCi17InNsdGkiLCAgICAieCw4IiwJMHg1MDAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJzbHQiLAkgICAgIngseSIsCTB4ZTgwMiwgMHhmODFmLCBXUl9UfFJEX3h8UkRfeSB9LAoteyJzbHQiLCAgICAgIngsOCIsCTB4NTAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic2x0aXUiLCAgICJ4LDgiLAkweDU4MDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17InNsdHUiLCAgICAieCx5IiwJMHhlODAzLCAweGY4MWYsIFdSX1R8UkRfeHxSRF95IH0sCi17InNsdHUiLCAgICAieCw4IiwJMHg1ODAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJzcmF2IiwgICAgInkseCIsCTB4ZTgwNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzcmEiLAkgICAgIngsdyw8IiwJMHgzMDAzLCAweGY4MDMsIFdSX3h8UkRfeSB9LAoteyJzcmEiLCAgICAgInkseCIsCTB4ZTgwNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzcmx2IiwgICAgInkseCIsCTB4ZTgwNiwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzcmwiLAkgICAgIngsdyw8IiwJMHgzMDAyLCAweGY4MDMsIFdSX3h8UkRfeSB9LAoteyJzcmwiLCAgICAgInkseCIsCTB4ZTgwNiwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzdWJ1IiwgICAgInosdix5IiwJMHhlMDAzLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95IH0sCi17InN1YnUiLCAgICAieSx4LDQiLAkwLCAoaW50KSBNX1NVQlVfSSwgSU5TTl9NQUNSTyB9LAoteyJzdWJ1IiwgICAgIngsayIsCTAsIChpbnQpIE1fU1VCVV9JXzIsIElOU05fTUFDUk8gfSwKLXsic3ciLAkgICAgInksVyh4KSIsCTB4ZDgwMCwgMHhmODAwLCBSRF95fFJEX3ggfSwKLXsic3ciLAkgICAgIngsVihTKSIsCTB4ZDAwMCwgMHhmODAwLCBSRF94fFJEX1NQIH0sCi17InN3IiwJICAgICJSLFYoUykiLAkweDYyMDAsIDB4ZmYwMCwgUkRfMzF8UkRfU1AgfSwKLXsieG9yIiwJICAgICJ4LHkiLAkweGU4MGUsIDB4ZjgxZiwgV1JfeHxSRF94fFJEX3kgfSwKLX07Ci0KLWNvbnN0IGludCBiZmRfbWlwczE2X251bV9vcGNvZGVzID0KLSAgKChzaXplb2YgbWlwczE2X29wY29kZXMpIC8gKHNpemVvZiAobWlwczE2X29wY29kZXNbMF0pKSk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL21wdy1jb25maWcuaW4gYi9vcGNvZGVzL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOWJlOWQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBvcGNvZGVzLgotCi1TZXQgdGFyZ2V0X2FyY2ggYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy0uKi0uKi8vJ2AKLQotU2V0IGFyY2huYW1lIEFSQ0hfe3RhcmdldF9hcmNofQotCi1JZiAie3RhcmdldF9hcmNofSIgPX4gL202OGsvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30ibTY4ay1kaXMuYy5vICJ7b30ibTY4ay1vcGMuYy5vJwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL3Bvd2VycGMvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30icHBjLWRpcy5jLm8gIntvfSJwcGMtb3BjLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9pMzg2LwotCVNldCBCRkRfTUFDSElORVMgICcie299ImkzODYtZGlzLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9taXBzLwotCVNldCBCRkRfTUFDSElORVMgICcie299Im1pcHMtZGlzLmMubyAie299Im1pcHMtb3BjLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9zaC8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJzaC1kaXMuYy5vJwotRW5kIElmCi0KLUVjaG8gJyMgU3RhcnQgZnJvbSBtcHctY29uZmlnLmluJwkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJCRkRfTUFDSElORVMgPSAiIHtCRkRfTUFDSElORVN9CQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkFSQ0hERUZTID0gLWQiIHthcmNobmFtZX0JCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkgCQkJPj4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tcHctbWFrZS5zZWQgYi9vcGNvZGVzL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2MDQ4Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgb3Bjb2RlcyBNYWtlZmlsZS5pbiBpbnRvIE1QVyBzeW50YXguCi0KLSMgRW1wdHkgSERFRklORVMuCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLQotIyBGaXggcGF0aG5hbWVzIHRvIGluY2x1ZGUgZGlyZWN0b3JpZXMuCi0vXklOQ0RJUiA9IC9zL15JTkNESVIgPSAuKiQvSU5DRElSID0gInt0b3BzcmNkaXJ9ImluY2x1ZGUvCi0vXkNTRUFSQ0ggPSAvcy8kLyAtaSAie0lOQ0RJUn0iOm1wdzogLWkgOjpleHRyYS1pbmNsdWRlOi8KLQotL0JGRF9NQUNISU5FUy9zL0BCRkRfTUFDSElORVNAL3tCRkRfTUFDSElORVN9LwotL2FyY2hkZWZzL3MvQGFyY2hkZWZzQC97QVJDSERFRlN9LwotCi0jIE5vIFBJQyBmb29sZXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCi0vQEFMTExJQlNAL3MvQEFMTExJQlNAL3tUQVJHRVRMSUJ9LwotL0BQSUNMSVNUQC9zL0BQSUNMSVNUQC8vCi0vQFBJQ0ZMQUdAL3MvQFBJQ0ZMQUdALy8KLS9ee09GSUxFU30gXFxPcHRpb24tZiBzdGFtcC1waWNkaXIvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBwaWMgdHJpY2tlcnkgZnJvbSB0aGUgZGVmYXVsdCBidWlsZCBydWxlLgotL15cLmNcLm8gXFxPcHRpb24tZiAvLC9FbmQgSWYvY1wKLS5jLm8gXFxPcHRpb24tZiAuYwotCi0jIFJlbW92ZSBwaWMgdHJpY2tlcnkgZnJvbSBvdGhlciBydWxlcyAtIGFpbWVkIGF0IHRoZSBydWxlCi0jIGZvciBkaXNhc3NlbWJsZS5vIGluIHBhcnRpY3VsYXIuCi0vLW4gIntQSUNGTEFHfSIvLC9FbmQgSWYvZApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9uczMyay1kaXMuYyBiL29wY29kZXMvbnMzMmstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDI2NmIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9uczMyay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDg5NCArMCwwIEBACi0vKiBQcmludCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIDMyMDAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoYykgMTk4NiwgODgsIDkxLCA5MiwgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBvcGNvZGVzIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpZiAhZGVmaW5lZChjb25zdCkgJiYgIWRlZmluZWQoX19TVERDX18pCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNpbmNsdWRlICJvcGNvZGUvbnMzMmsuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIGRpc2Fzc2VtYmxlX2luZm8gKmRpc19pbmZvOwotCi0vKgotICogSGFja3MgdG8gZ2V0IGl0IHRvIGNvbXBpbGUgPD0gUkVBRCBUSEVTRSBBUyBGSVhFUyBORUVERUQKLSAqLwotI2RlZmluZSBJTlZBTElEX0ZMT0FUKHZhbCwgc2l6ZSkgaW52YWxpZF9mbG9hdCgoY2hhciAqKXZhbCwgc2l6ZSkKLQotc3RhdGljIGludCBwcmludF9pbnNuX2FyZwotICBQQVJBTVMgKChpbnQsIGludCwgaW50ICosIGNoYXIgKiwgYmZkX3ZtYSwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZ2V0X2Rpc3BsYWNlbWVudCBQQVJBTVMgKChjaGFyICosIGludCAqKSk7Ci1zdGF0aWMgaW50IGludmFsaWRfZmxvYXQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIGxvbmcgcmVhZF9tZW1vcnlfaW50ZWdlcihhZGRyLCBucikKLSAgICAgdW5zaWduZWQgY2hhciAqYWRkcjsKLSAgICAgaW50IG5yOwotewotICBsb25nIHZhbDsKLSAgaW50IGk7Ci0gIGZvciAodmFsID0gMCwgaSA9IG5yIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICB2YWwgPSAgKHZhbCA8PCA4KTsKLSAgICB2YWwgfD0gKDB4ZmYgJiAqKGFkZHIgKyBpKSk7Ci0gIH0KLSAgcmV0dXJuIHZhbDsKLX0KLQotLyogMzIwMDAgaW5zdHJ1Y3Rpb25zIGFyZSBuZXZlciBsb25nZXIgdGhhbiB0aGlzLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDYyCi0KLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi1zdHJ1Y3QgcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKWluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotI2RlZmluZSBOT1BDT0RFUyAoc2l6ZW9mIG5zMzJrX29wY29kZXMgLyBzaXplb2YgbnMzMmtfb3Bjb2Rlc1swXSkKLQotI2RlZmluZSBORVhUX0lTX0FERFIJJ3wnCi0KLQwKLXN0cnVjdCBuczMya19vcHRpb24gewotICBjaGFyICpwYXR0ZXJuOwkJLyogdGhlIG9wdGlvbiBpdHNlbGYgKi8KLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsJCS8qIGJpbmFyeSB2YWx1ZSBvZiB0aGUgb3B0aW9uICovCi0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CQkvKiB0aGVzZSBiaXRzIG11c3QgbWF0Y2ggKi8KLX07Ci0KLQwKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF91W109IC8qIHJlc3RvcmUsIGV4aXQgKi8KLXsKLSAgeyAicjAiLAkweDgwLAkweDgwCX0sCi0gIHsgInIxIiwJMHg0MCwJMHg0MAl9LAotICB7ICJyMiIsCTB4MjAsCTB4MjAJfSwKLSAgeyAicjMiLAkweDEwLAkweDEwCX0sCi0gIHsgInI0IiwJMHgwOCwJMHgwOAl9LAotICB7ICJyNSIsCTB4MDQsCTB4MDQJfSwKLSAgeyAicjYiLAkweDAyLAkweDAyCX0sCi0gIHsgInI3IiwJMHgwMSwJMHgwMQl9LAotICB7ICAwICwJMHgwMCwJMHgwMAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfVVtdPSAvKiBzYXZlLCBlbnRlciAqLwotewotICB7ICJyMCIsCTB4MDEsCTB4MDEJfSwKLSAgeyAicjEiLAkweDAyLAkweDAyCX0sCi0gIHsgInIyIiwJMHgwNCwJMHgwNAl9LAotICB7ICJyMyIsCTB4MDgsCTB4MDgJfSwKLSAgeyAicjQiLAkweDEwLAkweDEwCX0sCi0gIHsgInI1IiwJMHgyMCwJMHgyMAl9LAotICB7ICJyNiIsCTB4NDAsCTB4NDAJfSwKLSAgeyAicjciLAkweDgwLAkweDgwCX0sCi0gIHsgIDAgLAkweDAwLAkweDAwCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF9PW109IC8qIHNldGNmZyAqLwotewotICB7ICJjIiwJMHg4LAkweDgJfSwKLSAgeyAibSIsCTB4NCwJMHg0CX0sCi0gIHsgImYiLAkweDIsCTB4Mgl9LAotICB7ICJpIiwJMHgxLAkweDEJfSwKLSAgeyAgMCAsCTB4MCwJMHgwCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF9DW109IC8qIGNpbnYgKi8KLXsKLSAgeyAiYSIsCTB4NCwJMHg0CX0sCi0gIHsgImkiLAkweDIsCTB4Mgl9LAotICB7ICJkIiwJMHgxLAkweDEJfSwKLSAgeyAgMCAsCTB4MCwJMHgwCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF9TW109IC8qIHN0cmluZyBpbnN0ICovCi17Ci0gIHsgImIiLAkweDEsCTB4MQl9LAotICB7ICJ1IiwJMHg2LAkweDYJfSwKLSAgeyAidyIsCTB4MiwJMHgyCX0sCi0gIHsgIDAgLAkweDAsCTB4MAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBsaXN0X1A1MzJbXT0gLyogbHByIHNwciAqLwotewotICB7ICJ1cyIsCTB4MCwJMHhmCX0sCi0gIHsgImRjciIsCTB4MSwJMHhmCX0sCi0gIHsgImJwYyIsCTB4MiwJMHhmCX0sCi0gIHsgImRzciIsCTB4MywJMHhmCX0sCi0gIHsgImNhciIsCTB4NCwJMHhmCX0sCi0gIHsgImZwIiwJMHg4LAkweGYJfSwKLSAgeyAic3AiLAkweDksCTB4Zgl9LAotICB7ICJzYiIsCTB4YSwJMHhmCX0sCi0gIHsgInVzcCIsCTB4YiwJMHhmCX0sCi0gIHsgImNmZyIsCTB4YywJMHhmCX0sCi0gIHsgInBzciIsCTB4ZCwJMHhmCX0sCi0gIHsgImludGJhc2UiLAkweGUsCTB4Zgl9LAotICB7ICJtb2QiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwMCwJMHhmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfTTUzMltdPSAvKiBsbXIgc21yICovCi17Ci0gIHsgIm1jciIsCTB4OSwJMHhmCX0sCi0gIHsgIm1zciIsCTB4YSwJMHhmCX0sCi0gIHsgInRlYXIiLAkweGIsCTB4Zgl9LAotICB7ICJwdGIwIiwJMHhjLAkweGYJfSwKLSAgeyAicHRiMSIsCTB4ZCwJMHhmCX0sCi0gIHsgIml2YXIwIiwJMHhlLAkweGYJfSwKLSAgeyAiaXZhcjEiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwLAkweGYJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9QMDMyW109IC8qIGxwciBzcHIgKi8KLXsKLSAgeyAidXBzciIsCTB4MCwJMHhmCX0sCi0gIHsgImZwIiwJMHg4LAkweGYJfSwKLSAgeyAic3AiLAkweDksCTB4Zgl9LAotICB7ICJzYiIsCTB4YSwJMHhmCX0sCi0gIHsgInBzciIsCTB4YiwJMHhmCX0sCi0gIHsgImludGJhc2UiLAkweGUsCTB4Zgl9LAotICB7ICJtb2QiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwLAkweGYJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9NMDMyW109IC8qIGxtciBzbXIgKi8KLXsKLSAgeyAiYnByMCIsCTB4MCwJMHhmCX0sCi0gIHsgImJwcjEiLAkweDEsCTB4Zgl9LAotICB7ICJwZjAiLAkweDQsCTB4Zgl9LAotICB7ICJwZjEiLAkweDUsCTB4Zgl9LAotICB7ICJzYyIsCTB4OCwJMHhmCX0sCi0gIHsgIm1zciIsCTB4YSwJMHhmCX0sCi0gIHsgImJjbnQiLAkweGIsCTB4Zgl9LAotICB7ICJwdGIwIiwJMHhjLAkweGYJfSwKLSAgeyAicHRiMSIsCTB4ZCwJMHhmCX0sCi0gIHsgImVpYSIsCTB4ZiwJMHhmCX0sCi0gIHsgIDAgLAkweDAsCTB4Zgl9Ci19OwotCi0KLS8qCi0gKiBmaWd1cmUgb3V0IHdoaWNoIG9wdGlvbnMgYXJlIHByZXNlbnQKLSAqLwotc3RhdGljIHZvaWQKLW9wdGxpc3Qob3B0aW9ucywgb3B0aW9uUCwgcmVzdWx0KQotICAgICBpbnQgb3B0aW9uczsKLSAgICAgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiAqb3B0aW9uUDsKLSAgICAgY2hhciAqcmVzdWx0OwotewotICAgIGlmIChvcHRpb25zID09IDApIHsKLQlzcHJpbnRmKHJlc3VsdCwgIltdIik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBzcHJpbnRmKHJlc3VsdCwgIlsiKTsKLQotICAgIGZvciAoOyAob3B0aW9ucyAhPSAwKSAmJiBvcHRpb25QLT5wYXR0ZXJuOyBvcHRpb25QKyspIHsKLQlpZiAoKG9wdGlvbnMgJiBvcHRpb25QLT5tYXRjaCkgPT0gb3B0aW9uUC0+dmFsdWUpIHsKLQkgICAgLyogd2UgZm91bmQgYSBtYXRjaCwgdXBkYXRlIHJlc3VsdCBhbmQgb3B0aW9ucyAqLwotCSAgICBzdHJjYXQocmVzdWx0LCBvcHRpb25QLT5wYXR0ZXJuKTsKLQkgICAgb3B0aW9ucyAmPSB+b3B0aW9uUC0+dmFsdWU7Ci0JICAgIGlmIChvcHRpb25zICE9IDApCS8qIG1vcmUgb3B0aW9ucyB0byBjb21lICovCi0JCXN0cmNhdChyZXN1bHQsICIsIik7Ci0JfQotICAgIH0KLSAgICBpZiAob3B0aW9ucyAhPSAwKQotCXN0cmNhdChyZXN1bHQsICJ1bmRlZmluZWQiKTsKLQotICAgIHN0cmNhdChyZXN1bHQsICJdIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1saXN0X3NlYXJjaCAocmVnX3ZhbHVlLCBvcHRpb25QLCByZXN1bHQpCi0gICAgIGludCByZWdfdmFsdWU7Ci0gICAgIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLXsKLSAgICBmb3IgKDsgb3B0aW9uUC0+cGF0dGVybjsgb3B0aW9uUCsrKSB7Ci0JaWYgKChyZWdfdmFsdWUgJiBvcHRpb25QLT5tYXRjaCkgPT0gb3B0aW9uUC0+dmFsdWUpIHsKLQkgICAgc3ByaW50ZihyZXN1bHQsICIlcyIsIG9wdGlvblAtPnBhdHRlcm4pOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLSAgICBzcHJpbnRmKHJlc3VsdCwgInVuZGVmaW5lZCIpOwotfQotDAotLyoKLSAqIGV4dHJhY3QgImNvdW50IiBiaXRzIHN0YXJ0aW5nICJvZmZzZXQiIGJpdHMKLSAqIGludG8gYnVmZmVyCi0gKi8KLQotc3RhdGljIGludAotYml0X2V4dHJhY3QgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGNvdW50OwotewotICBpbnQgcmVzdWx0OwotICBpbnQgYml0OwotCi0gIGJ1ZmZlciArPSBvZmZzZXQgPj4gMzsKLSAgb2Zmc2V0ICY9IDc7Ci0gIGJpdCA9IDE7Ci0gIHJlc3VsdCA9IDA7Ci0gIHdoaWxlIChjb3VudC0tKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEoZGlzX2luZm8sIGJ1ZmZlciArIDEpOwotICAgICAgaWYgKCgqYnVmZmVyICYgKDEgPDwgb2Zmc2V0KSkpCi0JcmVzdWx0IHw9IGJpdDsKLSAgICAgIGlmICgrK29mZnNldCA9PSA4KQotCXsKLQkgIG9mZnNldCA9IDA7Ci0JICBidWZmZXIrKzsKLQl9Ci0gICAgICBiaXQgPDw9IDE7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBMaWtlIGJpdCBleHRyYWN0IGJ1dCB0aGUgYnVmZmVyIGlzIHZhbGlkIGFuZCBkb2VuJ3QgbmVlZCB0byBiZQotICogZmV0Y2hlZAotICovCi1zdGF0aWMgaW50Ci1iaXRfZXh0cmFjdF9zaW1wbGUgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGNvdW50OwotewotICBpbnQgcmVzdWx0OwotICBpbnQgbWFzazsKLSAgaW50IGJpdDsKLQotICBidWZmZXIgKz0gb2Zmc2V0ID4+IDM7Ci0gIG9mZnNldCAmPSA3OwotICBiaXQgPSAxOwotICByZXN1bHQgPSAwOwotICB3aGlsZSAoY291bnQtLSkKLSAgICB7Ci0gICAgICBpZiAoKCpidWZmZXIgJiAoMSA8PCBvZmZzZXQpKSkKLQlyZXN1bHQgfD0gYml0OwotICAgICAgaWYgKCsrb2Zmc2V0ID09IDgpCi0JewotCSAgb2Zmc2V0ID0gMDsKLQkgIGJ1ZmZlcisrOwotCX0KLSAgICAgIGJpdCA8PD0gMTsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iaXRfY29weSAoYnVmZmVyLCBvZmZzZXQsIGNvdW50LCB0bykKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBpbnQgb2Zmc2V0OwotICAgICBpbnQgY291bnQ7Ci0gICAgIGNoYXIgKnRvOwotewotICBmb3IoOyBjb3VudCA+IDg7IGNvdW50IC09IDgsIHRvKyssIG9mZnNldCArPSA4KQotICAgICp0byA9IGJpdF9leHRyYWN0IChidWZmZXIsIG9mZnNldCwgOCk7Ci0gICp0byA9IGJpdF9leHRyYWN0IChidWZmZXIsIG9mZnNldCwgY291bnQpOwotfQotCi0KLXN0YXRpYyBpbnQKLXNpZ25fZXh0ZW5kICh2YWx1ZSwgYml0cykKLSAgICAgaW50IHZhbHVlLCBiaXRzOwotewotICB2YWx1ZSA9IHZhbHVlICYgKCgxIDw8IGJpdHMpIC0gMSk7Ci0gIHJldHVybiAodmFsdWUgJiAoMSA8PCAoYml0cy0xKSkKLQkgID8gdmFsdWUgfCAofigoMSA8PCBiaXRzKSAtIDEpKQotCSAgOiB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mbGlwX2J5dGVzIChwdHIsIGNvdW50KQotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgY2hhciB0bXA7Ci0KLSAgd2hpbGUgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICB0bXAgPSBwdHJbMF07Ci0gICAgICBwdHJbMF0gPSBwdHJbY291bnQtMV07Ci0gICAgICBwdHJbY291bnQtMV0gPSB0bXA7Ci0gICAgICBwdHIrKzsKLSAgICAgIGNvdW50IC09IDI7Ci0gICAgfQotfQotDAotLyogR2l2ZW4gYSBjaGFyYWN0ZXIgQywgZG9lcyBpdCByZXByZXNlbnQgYSBnZW5lcmFsIGFkZHJlc3NpbmcgbW9kZT8gICovCi0jZGVmaW5lIElzX2dlbihjKSBcCi0gICgoYykgPT0gJ0YnIHx8IChjKSA9PSAnTCcgfHwgKGMpID09ICdCJyBcCi0gICB8fCAoYykgPT0gJ1cnIHx8IChjKSA9PSAnRCcgfHwgKGMpID09ICdBJyB8fCAoYykgPT0gJ0knIHx8IChjKSA9PSAnWicpCi0KLS8qIEFkcmVzc2luZyBtb2Rlcy4gICovCi0jZGVmaW5lIEFkcm1vZF9pbmRleF9ieXRlIDB4MWMKLSNkZWZpbmUgQWRybW9kX2luZGV4X3dvcmQgMHgxZAotI2RlZmluZSBBZHJtb2RfaW5kZXhfZG91Ymxld29yZCAweDFlCi0jZGVmaW5lIEFkcm1vZF9pbmRleF9xdWFkd29yZCAweDFmCi0KLS8qIElzIE1PREUgYW4gaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGU/ICAqLwotI2RlZmluZSBBZHJtb2RfaXNfaW5kZXgobW9kZSkgXAotICAobW9kZSA9PSBBZHJtb2RfaW5kZXhfYnl0ZSBcCi0gICB8fCBtb2RlID09IEFkcm1vZF9pbmRleF93b3JkIFwKLSAgIHx8IG1vZGUgPT0gQWRybW9kX2luZGV4X2RvdWJsZXdvcmQgXAotICAgfHwgbW9kZSA9PSBBZHJtb2RfaW5kZXhfcXVhZHdvcmQpCi0KLQwKLS8qIFByaW50IHRoZSAzMjAwMCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gU1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCi0KLWludAotcHJpbnRfaW5zbl9uczMyayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLSAgcmVnaXN0ZXIgY2hhciAqZDsKLSAgdW5zaWduZWQgc2hvcnQgZmlyc3Rfd29yZDsKLSAgaW50IGlvZmZzZXQ7CQkvKiBiaXRzIGludG8gaW5zdHJ1Y3Rpb24gKi8KLSAgaW50IGFvZmZzZXQ7CQkvKiBiaXRzIGludG8gYXJndW1lbnRzICovCi0gIGNoYXIgYXJnX2J1ZnNbTUFYX0FSR1MrMV1bQVJHX0xFTl07Ci0gIGludCBhcmdudW07Ci0gIGludCBtYXhhcmc7Ci0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0gIGRpc19pbmZvID0gaW5mbzsKLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmcHJpdjsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gbWVtYWRkcjsKLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIExvb2sgZm9yIDhiaXQgb3Bjb2RlcyBmaXJzdC4gT3RoZXIgd2lzZSwgZmV0Y2hpbmcgdHdvIGJ5dGVzIGNvdWxkIHRha2UKLSAgICogdXMgb3ZlciB0aGUgZW5kIG9mIGFjY2Vzc2libGUgZGF0YSB1bm5lY2Vzc2FyaWxseQotICAgKi8KLSAgRkVUQ0hfREFUQShpbmZvLCBidWZmZXIgKyAxKTsKLSAgZm9yIChpID0gMDsgaSA8IE5PUENPREVTOyBpKyspCi0gICAgaWYgKG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUgPD0gOAotCSYmICgoYnVmZmVyWzBdCi0JICAgICAmICgoKHVuc2lnbmVkIGxvbmcpIDEgPDwgbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfaWRfc2l6ZSkgLSAxKSkKLQkgICAgPT0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfc2VlZCkpCi0gICAgICBicmVhazsKLSAgaWYgKGkgPT0gTk9QQ09ERVMpIHsKLSAgICAvKiBNYXliZSBpdCBpcyA5IHRvIDE2IGJpdHMgYmlnICovCi0gICAgRkVUQ0hfREFUQShpbmZvLCBidWZmZXIgKyAyKTsKLSAgICBmaXJzdF93b3JkID0gcmVhZF9tZW1vcnlfaW50ZWdlcihidWZmZXIsIDIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE5PUENPREVTOyBpKyspCi0gICAgICBpZiAoKGZpcnN0X3dvcmQKLQkgICAmICgoKHVuc2lnbmVkIGxvbmcpIDEgPDwgbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfaWRfc2l6ZSkgLSAxKSkKLQkgID09IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NlZWQpCi0JYnJlYWs7Ci0KLSAgICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gICovCi0gICAgaWYgKGkgPT0gTk9QQ09ERVMpCi0gICAgICB7Ci0JKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiMCVvIiwgYnVmZmVyWzBdKTsKLQlyZXR1cm4gMTsKLSAgICAgIH0KLSAgfQotCi0gICgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIiVzIiwgbnMzMmtfb3Bjb2Rlc1tpXS5uYW1lKTsKLQotICBpb2Zmc2V0ID0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfc2l6ZTsKLSAgYW9mZnNldCA9IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NpemU7Ci0gIGQgPSBuczMya19vcGNvZGVzW2ldLm9wZXJhbmRzOwotCi0gIGlmICgqZCkKLSAgICB7Ci0gICAgICAvKiBPZmZzZXQgaW4gYml0cyBvZiB0aGUgZmlyc3QgdGhpbmcgYmV5b25kIGVhY2ggaW5kZXggYnl0ZS4KLQkgRWxlbWVudCAwIGlzIGZvciBvcGVyYW5kIEEgYW5kIGVsZW1lbnQgMSBpcyBmb3Igb3BlcmFuZCBCLgotCSBUaGUgcmVzdCBhcmUgaXJyZWxldmFudCwgYnV0IHdlIHB1dCB0aGVtIGhlcmUgc28gd2UgZG9uJ3QKLQkgaW5kZXggb3V0c2lkZSB0aGUgYXJyYXkuICAqLwotICAgICAgaW50IGluZGV4X29mZnNldFtNQVhfQVJHU107Ci0KLSAgICAgIC8qIDAgZm9yIG9wZXJhbmQgQSwgMSBmb3Igb3BlcmFuZCBCLCBncmVhdGVyIGZvciBvdGhlciBhcmdzLiAgKi8KLSAgICAgIGludCB3aGljaGFyZyA9IDA7Ci0gICAgICAKLSAgICAgICgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgICAgIG1heGFyZyA9IDA7Ci0KLSAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gZmluZCBhbmQga2VlcCB0cmFjayBvZiB0aGUgaW5kZXggYnl0ZXMsCi0JIGlmIHdlIGFyZSB1c2luZyBzY2FsZWQgaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUsIHNpbmNlIHRoZSBpbmRleAotCSBieXRlcyBvY2N1ciByaWdodCBhZnRlciB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24sIG5vdCBhcyBwYXJ0Ci0JIG9mIHRoZSBhZGRyZXNzaW5nIGV4dGVuc2lvbi4gICovCi0gICAgICBpZiAoSXNfZ2VuKGRbMV0pKQotCXsKLQkgIGludCBhZGRyX21vZGUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0IC0gNSwgNSk7Ci0KLQkgIGlmIChBZHJtb2RfaXNfaW5kZXggKGFkZHJfbW9kZSkpCi0JICAgIHsKLQkgICAgICBhb2Zmc2V0ICs9IDg7Ci0JICAgICAgaW5kZXhfb2Zmc2V0WzBdID0gYW9mZnNldDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChkWzJdICYmIElzX2dlbihkWzNdKSkKLQl7Ci0JICBpbnQgYWRkcl9tb2RlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldCAtIDEwLCA1KTsKLQotCSAgaWYgKEFkcm1vZF9pc19pbmRleCAoYWRkcl9tb2RlKSkKLQkgICAgewotCSAgICAgIGFvZmZzZXQgKz0gODsKLQkgICAgICBpbmRleF9vZmZzZXRbMV0gPSBhb2Zmc2V0OwotCSAgICB9Ci0JfQotCi0gICAgICB3aGlsZSAoKmQpCi0JewotCSAgYXJnbnVtID0gKmQgLSAnMSc7Ci0JICBkKys7Ci0JICBpZiAoYXJnbnVtID4gbWF4YXJnICYmIGFyZ251bSA8IE1BWF9BUkdTKQotCSAgICBtYXhhcmcgPSBhcmdudW07Ci0JICBpb2Zmc2V0ID0gcHJpbnRfaW5zbl9hcmcgKCpkLCBpb2Zmc2V0LCAmYW9mZnNldCwgYnVmZmVyLAotCQkJCSAgICBtZW1hZGRyLCBhcmdfYnVmc1thcmdudW1dLAotCQkJCSAgICBpbmRleF9vZmZzZXRbd2hpY2hhcmddKTsKLQkgIGQrKzsKLQkgIHdoaWNoYXJnKys7Ci0JfQotICAgICAgZm9yIChhcmdudW0gPSAwOyBhcmdudW0gPD0gbWF4YXJnOyBhcmdudW0rKykKLQl7Ci0JICBiZmRfdm1hIGFkZHI7Ci0JICBjaGFyICpjaDsKLQkgIGZvciAoY2ggPSBhcmdfYnVmc1thcmdudW1dOyAqY2g7KQotCSAgICB7Ci0JICAgICAgaWYgKCpjaCA9PSBORVhUX0lTX0FERFIpCi0JCXsKLQkJICArK2NoOwotCQkgIGFkZHIgPSBiZmRfc2Nhbl92bWEgKGNoLCBOVUxMLCAxNik7Ci0JCSAgKCpkaXNfaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciwgZGlzX2luZm8pOwotCQkgIHdoaWxlICgqY2ggJiYgKmNoICE9IE5FWFRfSVNfQUREUikKLQkJICAgICsrY2g7Ci0JCSAgaWYgKCpjaCkKLQkJICAgICsrY2g7Ci0JCX0KLQkgICAgICBlbHNlCi0JCSgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIiVjIiwgKmNoKyspOwotCSAgICB9Ci0JICBpZiAoYXJnbnVtIDwgbWF4YXJnKQotCSAgICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIsICIpOwotCX0KLSAgICB9Ci0gIHJldHVybiBhb2Zmc2V0IC8gODsKLX0KLQotLyogUHJpbnQgYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCBvZiBjYXRlZ29yeSBnaXZlbiBieSBkLiAgSU9GRlNFVCBpcwotICAgdGhlIGJpdCBwb3NpdGlvbiBiZWxvdyB3aGljaCBzbWFsbCAoPDEgYnl0ZSkgcGFydHMgb2YgdGhlIG9wZXJhbmQgY2FuCi0gICBiZSBmb3VuZCAodXN1YWxseSBpbiB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24sIGJ1dCBmb3IgaW5kZXhlZAotICAgYWRkcmVzc2luZyBpdCBjYW4gYmUgaW4gdGhlIGluZGV4IGJ5dGUpLiAgQU9GRlNFVFAgaXMgYSBwb2ludGVyIHRvIHRoZQotICAgYml0IHBvc2l0aW9uIG9mIHRoZSBhZGRyZXNzaW5nIGV4dGVuc2lvbi4gIEJVRkZFUiBjb250YWlucyB0aGUKLSAgIGluc3RydWN0aW9uLiAgQUREUiBpcyB3aGVyZSBCVUZGRVIgd2FzIHJlYWQgZnJvbS4gIFB1dCB0aGUgZGlzYXNzZW1ibGVkCi0gICB2ZXJzaW9uIG9mIHRoZSBvcGVyYW5kIGluIFJFU1VMVC4gIElOREVYX09GRlNFVCBpcyB0aGUgYml0IHBvc2l0aW9uCi0gICBvZiB0aGUgaW5kZXggYnl0ZSAoaXQgY29udGFpbnMgZ2FyYmFnZSBpZiB0aGlzIG9wZXJhbmQgaXMgbm90IGEKLSAgIGdlbmVyYWwgb3BlcmFuZCB1c2luZyBzY2FsZWQgaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUpLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgKGQsIGlvZmZzZXQsIGFvZmZzZXRwLCBidWZmZXIsIGFkZHIsIHJlc3VsdCwgaW5kZXhfb2Zmc2V0KQotICAgICBpbnQgZDsKLSAgICAgaW50IGlvZmZzZXQsICphb2Zmc2V0cDsKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLSAgICAgaW50IGluZGV4X29mZnNldDsKLXsKLSAgaW50IGFkZHJfbW9kZTsKLSAgZmxvYXQgRnZhbHVlOwotICBkb3VibGUgTHZhbHVlOwotICBpbnQgSXZhbHVlOwotICBpbnQgZGlzcDEsIGRpc3AyOwotICBpbnQgaW5kZXg7Ci0gIGludCBzaXplOwotCi0gIHN3aXRjaCAoZCkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAvKiBhICJnZW4iIG9wZXJhbmQgYnV0IDUgYml0cyBmcm9tIHRoZSBlbmQgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlvZmZzZXQgLT0gNTsKLSAgICBjYXNlICdaJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdMJzoKLSAgICBjYXNlICdJJzoKLSAgICBjYXNlICdCJzoKLSAgICBjYXNlICdXJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdBJzoKLSAgICAgIGFkZHJfbW9kZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQtNSwgNSk7Ci0gICAgICBpb2Zmc2V0IC09IDU7Ci0gICAgICBzd2l0Y2ggKGFkZHJfbW9kZSkKLQl7Ci0JY2FzZSAweDA6IGNhc2UgMHgxOiBjYXNlIDB4MjogY2FzZSAweDM6Ci0JY2FzZSAweDQ6IGNhc2UgMHg1OiBjYXNlIDB4NjogY2FzZSAweDc6Ci0JICAvKiByZWdpc3RlciBtb2RlIFIwIC0tIFI3ICovCi0JICBzd2l0Y2ggKGQpCi0JICAgIHsKLQkgICAgY2FzZSAnRic6Ci0JICAgIGNhc2UgJ0wnOgotCSAgICBjYXNlICdaJzoKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICJmJWQiLCBhZGRyX21vZGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHNwcmludGYgKHJlc3VsdCwgInIlZCIsIGFkZHJfbW9kZSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHg4OiBjYXNlIDB4OTogY2FzZSAweGE6IGNhc2UgMHhiOgotCWNhc2UgMHhjOiBjYXNlIDB4ZDogY2FzZSAweGU6IGNhc2UgMHhmOgotCSAgLyogUmVnaXN0ZXIgcmVsYXRpdmUgZGlzcChSMCAtLSBSNykgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICIlZChyJWQpIiwgZGlzcDEsIGFkZHJfbW9kZSAmIDcpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDEwOgotCWNhc2UgMHgxMToKLQljYXNlIDB4MTI6Ci0JICAvKiBNZW1vcnkgcmVsYXRpdmUgZGlzcDIoZGlzcDEoRlAsIFNQLCBTQikpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgZGlzcDIgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKCVkKCVzKSkiLCBkaXNwMiwgZGlzcDEsCi0JCSAgIGFkZHJfbW9kZT09MHgxMD8iZnAiOmFkZHJfbW9kZT09MHgxMT8ic3AiOiJzYiIpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDEzOgotCSAgLyogcmVzZXJ2ZWQgKi8KLQkgIHNwcmludGYgKHJlc3VsdCwgInJlc2VydmVkIik7Ci0JICBicmVhazsKLQljYXNlIDB4MTQ6Ci0JICAvKiBJbW1lZGlhdGUgKi8KLQkgIHN3aXRjaCAoZCkKLQkgICAgewotCSAgICBjYXNlICdJJzogY2FzZSAnWic6IGNhc2UgJ0EnOgotCSAgICAgIC8qIEkgYW5kIFogYXJlIG91dHB1dCBvcGVyYW5kcyBhbmQgY2FuYHQgYmUgaW1tZWRpYXRlCi0JICAgICAgICogQSBpcyBhbiBhZGRyZXNzIGFuZCB3ZSBjYW5gdCBoYXZlIHRoZSBhZGRyZXNzIG9mCi0JICAgICAgICogYW4gaW1tZWRpYXRlIGVpdGhlci4gV2UgZG9uJ3Qga25vdyBob3cgbXVjaCB0byBpbmNyZWFzZQotCSAgICAgICAqIGFvZmZzZXRwIGJ5IHNpbmNlIHdoYXRldmVyIGdlbmVyYXRlZCB0aGlzIGlzIGJyb2tlbgotCSAgICAgICAqIGFueXdheSEKLQkgICAgICAgKi8KLQkgICAgICBzcHJpbnRmIChyZXN1bHQsIF8oIiQ8dW5kZWZpbmVkPiIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLQkgICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCA4KTsKLQkgICAgICAqYW9mZnNldHAgKz0gODsKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICIkJWQiLCBJdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdXJzoKLQkgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDE2KTsKLQkgICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCAyKTsKLQkgICAgICAqYW9mZnNldHAgKz0gMTY7Ci0JICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgMTYpOwotCSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiQlZCIsIEl2YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0QnOgotCSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgMzIpOwotCSAgICAgIGZsaXBfYnl0ZXMgKCZJdmFsdWUsIDQpOwotCSAgICAgICphb2Zmc2V0cCArPSAzMjsKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICIkJWQiLCBJdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdGJzoKLQkgICAgICBiaXRfY29weSAoYnVmZmVyLCAqYW9mZnNldHAsIDMyLCAoY2hhciAqKSAmRnZhbHVlKTsKLQkgICAgICBmbGlwX2J5dGVzICgmRnZhbHVlLCA0KTsKLQkgICAgICAqYW9mZnNldHAgKz0gMzI7Ci0JICAgICAgaWYgKElOVkFMSURfRkxPQVQgKCZGdmFsdWUsIDQpKQotCQlzcHJpbnRmIChyZXN1bHQsICI8PGludmFsaWQgZmxvYXQgMHglLjh4Pj4iLCAqKGludCAqKSAmRnZhbHVlKTsKLQkgICAgICBlbHNlIC8qIGFzc3VtZSBob3N0IGhhcyBpZWVlIGZsb2F0ICovCi0JCXNwcmludGYgKHJlc3VsdCwgIiQlZyIsIEZ2YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0wnOgotCSAgICAgIGJpdF9jb3B5IChidWZmZXIsICphb2Zmc2V0cCwgNjQsIChjaGFyICopICZMdmFsdWUpOwotCSAgICAgIGZsaXBfYnl0ZXMgKCZMdmFsdWUsIDgpOwotCSAgICAgICphb2Zmc2V0cCArPSA2NDsKLQkgICAgICBpZiAoSU5WQUxJRF9GTE9BVCAoJkx2YWx1ZSwgOCkpCi0JCXNwcmludGYgKHJlc3VsdCwgIjw8aW52YWxpZCBsb25nIDB4JS44eCUuOHg+PiIsCi0JCQkgKigoKGludCAqKSAmTHZhbHVlKSArIDEpLCAqKGludCAqKSAmTHZhbHVlKTsKLQkgICAgICBlbHNlIC8qIGFzc3VtZSBob3N0IGhhcyBpZWVlIGZsb2F0ICovCi0JCXNwcmludGYgKHJlc3VsdCwgIiQlZyIsIEx2YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHgxNToKLQkgIC8qIEFic29sdXRlIEBkaXNwICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiQHwlZHwiLCBkaXNwMSk7Ci0JICBicmVhazsKLQljYXNlIDB4MTY6Ci0JICAvKiBFeHRlcm5hbCBFWFQoZGlzcDEpICsgZGlzcDIgKE1vZCB0YWJsZSBzdHVmZikgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBkaXNwMiA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiRVhUKCVkKSArICVkIiwgZGlzcDEsIGRpc3AyKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxNzoKLQkgIC8qIFRvcCBvZiBzdGFjayB0b3MgKi8KLQkgIHNwcmludGYgKHJlc3VsdCwgInRvcyIpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE4OgotCSAgLyogTWVtb3J5IHNwYWNlIGRpc3AoRlApICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQoZnApIiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE5OgotCSAgLyogTWVtb3J5IHNwYWNlIGRpc3AoU1ApICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQoc3ApIiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDFhOgotCSAgLyogTWVtb3J5IHNwYWNlIGRpc3AoU0IpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQoc2IpIiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDFiOgotCSAgLyogTWVtb3J5IHNwYWNlIGRpc3AoUEMpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotCSAgc3ByaW50Zl92bWEgKHJlc3VsdCwgYWRkciArIGRpc3AxKTsKLQkgIHJlc3VsdCArPSBzdHJsZW4gKHJlc3VsdCk7Ci0JICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7Ci0JICAqcmVzdWx0ID0gJ1wwJzsKLQkgIGJyZWFrOwotCWNhc2UgMHgxYzoKLQljYXNlIDB4MWQ6Ci0JY2FzZSAweDFlOgotCWNhc2UgMHgxZjoKLQkgIC8qIFNjYWxlZCBpbmRleCBiYXNlbW9kZVtSMCAtLSBSNzpCLFcsRCxRXSAqLwotCSAgaW5kZXggPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpbmRleF9vZmZzZXQgLSA4LCAzKTsKLQkgIHByaW50X2luc25fYXJnIChkLCBpbmRleF9vZmZzZXQsIGFvZmZzZXRwLCBidWZmZXIsIGFkZHIsCi0JCQkgIHJlc3VsdCwgMCk7Ci0JICB7Ci0JICAgIHN0YXRpYyBjb25zdCBjaGFyICppbmQgPSAiYndkcSI7Ci0JICAgIGNoYXIgKm9mZjsKLQotCSAgICBvZmYgPSByZXN1bHQgKyBzdHJsZW4gKHJlc3VsdCk7Ci0JICAgIHNwcmludGYgKG9mZiwgIltyJWQ6JWNdIiwgaW5kZXgsCi0JCSAgICAgaW5kW2FkZHJfbW9kZSAmIDNdKTsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0gnOgotICAgIGNhc2UgJ3EnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldC00LCA0KTsKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDQpOwotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCBJdmFsdWUpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncic6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0LTMsIDMpOwotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiciVkIiwgSXZhbHVlJjcpOwotICAgICAgaW9mZnNldCAtPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBzcHJpbnRmIChyZXN1bHQsICIlZCIsIGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgICAgSXZhbHVlID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0gICAgICAvKgotICAgICAgICogV2FybmluZyEhICBIQUNLIEFMRVJUIQotICAgICAgICogT3BlcmFuZCB0eXBlICdiJyBpcyBvbmx5IHVzZWQgYnkgdGhlIGNtcHtiLHcsZH0gYW5kCi0gICAgICAgKiBtb3Zte2IsdyxkfSBpbnN0cnVjdGlvbnM7IHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyCi0gICAgICAgKiBpdCdzIGEgYGInIG9yIGB3JyBvciBgZCcgaW5zdHJ1Y3Rpb247IGFuZCBmb3IgYm90aAotICAgICAgICogY21wbSBhbmQgbW92bSBpdCdzIHN0b3JlZCBhdCB0aGUgc2FtZSBwbGFjZSBzbyB3ZQotICAgICAgICoganVzdCBncmFiIHR3byBiaXRzIG9mIHRoZSBvcGNvZGUgYW5kIGxvb2sgYXQgaXQuLi4KLSAgICAgICAqIAotICAgICAgICovCi0gICAgICBzaXplID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTYsIDIpOwotICAgICAgaWYgKHNpemUgPT0gMCkJCS8qIDAwID0+IGIgKi8KLQlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gMSkJLyogMDEgPT4gdyAqLwotCXNpemUgPSAyOwotICAgICAgZWxzZQotCXNpemUgPSA0OwkJLyogMTEgPT4gZCAqLwotCi0gICAgICBzcHJpbnRmIChyZXN1bHQsICIlZCIsIChJdmFsdWUgLyBzaXplKSArIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7Ci0gICAgICBzcHJpbnRmX3ZtYSAocmVzdWx0LCBhZGRyICsgZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCkpOwotICAgICAgcmVzdWx0ICs9IHN0cmxlbiAocmVzdWx0KTsKLSAgICAgICpyZXN1bHQrKyA9IE5FWFRfSVNfQUREUjsKLSAgICAgICpyZXN1bHQgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDgpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBzcHJpbnRmIChyZXN1bHQsICIweCV4IiwgSXZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3UnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfdSwgcmVzdWx0KTsKLSAgICAgICphb2Zmc2V0cCArPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnVSc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X1UsIHJlc3VsdCk7Ci0gICAgICAqYW9mZnNldHAgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ08nOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTksIDkpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9PLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X0MsIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdTJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldCAtIDgsIDgpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9TLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnTSc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBsaXN0X3NlYXJjaChJdmFsdWUsIDAgPyBsaXN0X00wMzIgOiBsaXN0X001MzIsIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdQJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC00LCA0KTsKLSAgICAgIGxpc3Rfc2VhcmNoKEl2YWx1ZSwgMCA/IGxpc3RfUDAzMiA6IGxpc3RfUDUzMiwgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCAqYW9mZnNldHAsIDMpOwotICAgICAgc3ByaW50ZihyZXN1bHQsICIlZCIsIEl2YWx1ZSk7Ci0gICAgICAqYW9mZnNldHAgKz0gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0cnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCAqYW9mZnNldHAsIDUpOwotICAgICAgc3ByaW50ZihyZXN1bHQsICIlZCIsIEl2YWx1ZSArIDEpOwotICAgICAgKmFvZmZzZXRwICs9IDU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBpb2Zmc2V0OwotfQotCi1zdGF0aWMgaW50Ci1nZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKQotICAgICBjaGFyICpidWZmZXI7Ci0gICAgIGludCAqYW9mZnNldHA7Ci17Ci0gIGludCBJdmFsdWU7Ci0gIHNob3J0IEl2YWx1ZTI7Ci0KLSAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLSAgc3dpdGNoIChJdmFsdWUgJiAweGMwKQotICAgIHsKLSAgICBjYXNlIDB4MDA6Ci0gICAgY2FzZSAweDQwOgotICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgNyk7Ci0gICAgICAqYW9mZnNldHAgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg4MDoKLSAgICAgIEl2YWx1ZTIgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDE2KTsKLSAgICAgIGZsaXBfYnl0ZXMgKCZJdmFsdWUyLCAyKTsKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUyLCAxNCk7Ci0gICAgICAqYW9mZnNldHAgKz0gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4YzA6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDMyKTsKLSAgICAgIGZsaXBfYnl0ZXMgKCZJdmFsdWUsIDQpOwotICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgMzApOwotICAgICAgKmFvZmZzZXRwICs9IDMyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gSXZhbHVlOwotfQotDAotCi0jaWYgMSAvKiBhIHZlcnNpb24gdGhhdCBzaG91bGQgd29yayBvbiBuczMyayBmJ3MmZCdzIG9uIGFueSBtYWNoaW5lICovCi1zdGF0aWMgaW50Ci1pbnZhbGlkX2Zsb2F0IChwLCBsZW4pCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gICAgIHJlZ2lzdGVyIGludCBsZW47Ci17Ci0gIHJlZ2lzdGVyIGludCB2YWw7Ci0KLSAgaWYgKCBsZW4gPT0gNCApCi0gICAgdmFsID0gKGJpdF9leHRyYWN0X3NpbXBsZShwLCAyMywgOCkvKmV4cG9uZW50Ki8gPT0gMHhmZgotCSAgIHx8IChiaXRfZXh0cmFjdF9zaW1wbGUocCwgMjMsIDgpLypleHBvbmVudCovID09IDAgJiYKLQkgICAgICAgYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDAsIDIzKS8qbWFudGlzYSovICE9IDApKTsKLSAgZWxzZSBpZiAoIGxlbiA9PSA4ICkKLSAgICB2YWwgPSAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDUyLCAxMSkvKmV4cG9uZW50Ki8gPT0gMHg3ZmYKLQkgICB8fCAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDUyLCAxMSkvKmV4cG9uZW50Ki8gPT0gMAotCSAgICAgICAmJiAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDAsIDMyKS8qbG93IG1hbnRpc2EqLyAhPSAwCi0JCSAgIHx8IGJpdF9leHRyYWN0X3NpbXBsZShwLCAzMiwgMjApLypoaWdoIG1hbnRpc2EqLyAhPSAwKSkpOwotICBlbHNlCi0gICAgdmFsID0gMTsKLSAgcmV0dXJuICh2YWwpOwotfQotI2Vsc2UKLQotLyogYXNzdW1lcyB0aGUgYnl0ZXMgaGF2ZSBiZWVuIHN3YXBwZWQgdG8gbG9jYWwgb3JkZXIgKi8KLXR5cGVkZWYgdW5pb24geyBkb3VibGUgZDsKLQkJZmxvYXQgZjsKLQkJc3RydWN0IHsgdW5zaWduZWQgbToyMywgZTo4LCA6MTt9IHNmOwotCQlzdHJ1Y3QgeyB1bnNpZ25lZCBsbTsgdW5zaWduZWQgbToyMCwgZToxMSwgOjE7fSBzZDsKLQkgICAgICB9IGZsb2F0X3R5cGVfdTsKLQotc3RhdGljIGludAotaW52YWxpZF9mbG9hdCAocCwgbGVuKQotICAgICByZWdpc3RlciBmbG9hdF90eXBlX3UgKnA7Ci0gICAgIHJlZ2lzdGVyIGludCBsZW47Ci17Ci0gIHJlZ2lzdGVyIGludCB2YWw7Ci0gIGlmICggbGVuID09IHNpemVvZiAoZmxvYXQpICkKLSAgICB2YWwgPSAocC0+c2YuZSA9PSAweGZmCi0JICAgfHwgKHAtPnNmLmUgPT0gMCAmJiBwLT5zZi5tICE9IDApKTsKLSAgZWxzZSBpZiAoIGxlbiA9PSBzaXplb2YgKGRvdWJsZSkgKQotICAgIHZhbCA9IChwLT5zZC5lID09IDB4N2ZmCi0JICAgfHwgKHAtPnNkLmUgPT0gMCAmJiAocC0+c2QubSAhPSAwIHx8IHAtPnNkLmxtICE9IDApKSk7Ci0gIGVsc2UKLSAgICB2YWwgPSAxOwotICByZXR1cm4gKHZhbCk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvb3BpbnRsLmggYi9vcGNvZGVzL29waW50bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTkwMTYwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvb3BpbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBvcGludGwuaCAtIG9wY29kZXMgc3BlY2lmaWMgaGVhZGVyIGZvciBnZXR0ZXh0IGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBvcGNvZGVzIGxpYnJhcnkgdXNlZCBieSBHQVMgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vTWFrZS1pbiBiL29wY29kZXMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbiBiL29wY29kZXMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzU5MTAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLWEyOWstZGlzLmMKLWFscGhhLWRpcy5jCi1hbHBoYS1vcGMuYwotYXJtLWRpcy5jCi1hcm0tb3BjLmgKLWNnZW4tYXNtLmMKLWNnZW4tZGlzLmMKLWNnZW4tb3BjLmMKLWQxMHYtZGlzLmMKLWQxMHYtb3BjLmMKLWQzMHYtZGlzLmMKLWQzMHYtb3BjLmMKLWRpcy1idWYuYwotZGlzYXNzZW1ibGUuYwotZnIzMC1hc20uYwotZnIzMC1kZXNjLmMKLWZyMzAtZGVzYy5oCi1mcjMwLWRpcy5jCi1mcjMwLWlibGQuYwotZnIzMC1vcGMuYwotZnIzMC1vcGMuaAotaDgzMDAtZGlzLmMKLWg4NTAwLWRpcy5jCi1oODUwMC1vcGMuaAotaHBwYS1kaXMuYwotaTM4Ni1kaXMuYwotaTk2MC1kaXMuYwotbTEwMjAwLWRpcy5jCi1tMTAyMDAtb3BjLmMKLW0xMDMwMC1kaXMuYwotbTEwMzAwLW9wYy5jCi1tMzJyLWFzbS5jCi1tMzJyLWRlc2MuYwotbTMyci1kZXNjLmgKLW0zMnItZGlzLmMKLW0zMnItaWJsZC5jCi1tMzJyLW9wYy5jCi1tMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5jCi1tNjhrLWRpcy5jCi1tNjhrLW9wYy5jCi1tODhrLWRpcy5jCi1tY29yZS1kaXMuYwotbWNvcmUtb3BjLmgKLW1pcHMtZGlzLmMKLW1pcHMtb3BjLmMKLW1pcHMxNi1vcGMuYwotbnMzMmstZGlzLmMKLXBwYy1kaXMuYwotcHBjLW9wYy5jCi1zaC1kaXMuYwotc2gtb3BjLmgKLXNwYXJjLWRpcy5jCi1zcGFyYy1vcGMuYwotc3lzZGVwLmgKLXRpYzMwLWRpcy5jCi10aWM4MC1kaXMuYwotdGljODAtb3BjLmMKLXZheC1kaXMuYwotdzY1LWRpcy5jCi13NjUtb3BjLmgKLXo4ay1kaXMuYwotejhrLW9wYy5oCi16OGtnZW4uYwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wby9vcGNvZGVzLnBvdCBiL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTNmMGYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wby9vcGNvZGVzLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wNC0xOCAxOTowMS0wNDAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogYWxwaGEtb3BjLmM6MzM1Ci1tc2dpZCAiYnJhbmNoIG9wZXJhbmQgdW5hbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IGFscGhhLW9wYy5jOjM1OCBhbHBoYS1vcGMuYzozODAKLW1zZ2lkICJqdW1wIGhpbnQgdW5hbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IGFybS1kaXMuYzozODgKLW1zZ2lkICI8aWxsZWdhbCBwcmVjaXNpb24+IgotbXNnc3RyICIiCi0KLSM6IGNnZW4tYXNtLmM6MjI0Ci1tc2dpZCAidW5yZWNvZ25pemVkIGtleXdvcmQvcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjMzMiBmcjMwLWlibGQuYzoyMjMgbTMyci1pYmxkLmM6MjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIgotbXNnc3RyICIiCi0KLSM6IGNnZW4tYXNtLmM6MzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gJWx1IGFuZCAlbHUpIgotbXNnc3RyICIiCi0KLSM6IGQzMHYtZGlzLmM6MzA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duIHJlZ2lzdGVyICVkPiIKLW1zZ3N0ciAiIgotCi0jLiBDYW4ndCBoYXBwZW4uCi0jOiBkaXMtYnVmLmM6NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBlcnJvciAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGRpcy1idWYuYzo1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJBZGRyZXNzIDB4JXggaXMgb3V0IG9mIGJvdW5kcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjMwMyBtMzJyLWFzbS5jOjMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcGFyc2luZy5cbiIKLW1zZ3N0ciAiIgotCi0jLiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4KLSM6IGZyMzAtYXNtLmM6MzY3IGZyMzAtYXNtLmM6NDM2IG0zMnItYXNtLmM6MzgzIG0zMnItYXNtLmM6NDUyCi1tc2dpZCAidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSMuIFN5bnRheCBjaGFyIGRpZG4ndCBtYXRjaC4gIENhbid0IGJlIHRoaXMgaW5zbi4KLSMuIEZJWE1FOiB3b3VsZCBsaWtlIHRvIHJldHVybiBzb21ldGhpbmcgbGlrZQotIy4gImV4cGVjdGVkIGNoYXIgYGMnIgotIzogZnIzMC1hc20uYzo0MDQgbTMyci1hc20uYzo0MjAKLW1zZ2lkICJzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzo0MzAgbTMyci1hc20uYzo0NDYKLW1zZ2lkICJqdW5rIGF0IGVuZCBvZiBsaW5lIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtYXNtLmM6NTIzIG0zMnItYXNtLmM6NTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbnN0cnVjdGlvbiBgJS41MHMuLi4nIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtYXNtLmM6NTI2IG0zMnItYXNtLmM6NTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbnN0cnVjdGlvbiBgJS41MHMnIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtZGlzLmM6MzAwIG0zMnItZGlzLmM6MjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwcmludGluZyBpbnNuLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjIxMCBtMzJyLWlibGQuYzoyMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAwIGFuZCAlbHUpIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjc0OSBtMzJyLWlibGQuYzo2ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGJ1aWxkaW5nIGluc24uXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6OTUyIG0zMnItaWJsZC5jOjgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZGVjb2RpbmcgaW5zbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxMDk2IG0zMnItaWJsZC5jOjkzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyBpbnQgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxMjI1IG0zMnItaWJsZC5jOjEwMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgdm1hIG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTM1OCBtMzJyLWlibGQuYzoxMTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIGludCBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjE0ODQgbTMyci1pYmxkLmM6MTIyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyB2bWEgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBoODMwMC1kaXMuYzo0MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSG1tbW0gJXgiCi1tc2dzdHIgIiIKLQotIzogaDgzMDAtZGlzLmM6NDE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkRvbid0IHVuZGVyc3RhbmQgJXggXG4iCi1tc2dzdHIgIiIKLQotIzogaDg1MDAtZGlzLmM6MTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IGNvcGUgd2l0aCBpbnNlcnQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jLiBDb3VsZG4ndCB1bmRlcnN0YW5kIGFueXRoaW5nCi0jOiBoODUwMC1kaXMuYzozNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTAyeFx0XHQqdW5rbm93bioiCi1tc2dzdHIgIiIKLQotIzogbTEwMjAwLWRpcy5jOjE5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duXHQweCUwMngiCi1tc2dzdHIgIiIKLQotIzogbTEwMjAwLWRpcy5jOjMzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duXHQweCUwNGx4IgotbXNnc3RyICIiCi0KLSM6IG0xMDMwMC1kaXMuYzo3MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDR4IgotbXNnc3RyICIiCi0KLSM6IG02OGstZGlzLmM6NDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIjxpbnRlcm5hbCBlcnJvciBpbiBvcGNvZGUgdGFibGU6ICVzICVzPlxuIgotbXNnc3RyICIiCi0KLSM6IG02OGstZGlzLmM6OTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjxmdW5jdGlvbiBjb2RlICVkPiIKLW1zZ3N0ciAiIgotCi0jOiBtODhrLWRpcy5jOjI3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIjIDxkaXMgZXJyb3I6ICUwOHg+IgotbXNnc3RyICIiCi0KLSM6IG1pcHMtZGlzLmM6MzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiMgaW50ZXJuYWwgZXJyb3IsIHVuZGVmaW5lZCBtb2RpZmllciglYykiCi1tc2dzdHIgIiIKLQotIy4gSSBhbmQgWiBhcmUgb3V0cHV0IG9wZXJhbmRzIGFuZCBjYW5gdCBiZSBpbW1lZGlhdGUKLSMuICogQSBpcyBhbiBhZGRyZXNzIGFuZCB3ZSBjYW5gdCBoYXZlIHRoZSBhZGRyZXNzIG9mCi0jLiAqIGFuIGltbWVkaWF0ZSBlaXRoZXIuIFdlIGRvbid0IGtub3cgaG93IG11Y2ggdG8gaW5jcmVhc2UKLSMuICogYW9mZnNldHAgYnkgc2luY2Ugd2hhdGV2ZXIgZ2VuZXJhdGVkIHRoaXMgaXMgYnJva2VuCi0jLiAqIGFueXdheSEKLSMuCi0jOiBuczMyay1kaXMuYzo2MTgKLW1zZ2lkICIkPHVuZGVmaW5lZD4iCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjU4NiBwcGMtb3BjLmM6NjE3Ci1tc2dpZCAiaW52YWxpZCBjb25kaXRpb25hbCBvcHRpb24iCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjYxOQotbXNnaWQgImF0dGVtcHQgdG8gc2V0IHkgYml0IHdoZW4gdXNpbmcgKyBvciAtIG1vZGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo2NzQKLW1zZ2lkICJpZ25vcmluZyBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGluIGJyYW5jaCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjcwOSBwcGMtb3BjLmM6NzQ2Ci1tc2dpZCAiaWxsZWdhbCBiaXRtYXNrIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo4MTUKLW1zZ2lkICJ2YWx1ZSBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjg4OQotbXNnaWQgImluZGV4IHJlZ2lzdGVyIGluIGxvYWQgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjkwNAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgb3BlcmFuZCB3aGVuIHVwZGF0aW5nIgotbXNnc3RyICIiCi0KLSMuIE1hcmsgYXMgbm9uLXZhbGlkIGluc3RydWN0aW9uCi0jOiBzcGFyYy1kaXMuYzo3MzkKLW1zZ2lkICJ1bmtub3duIgotbXNnc3RyICIiCi0KLSM6IHNwYXJjLWRpcy5jOjgxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogIGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIgotbXNnc3RyICIiCi0KLSM6IHNwYXJjLWRpcy5jOjgyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iCi1tc2dzdHIgIiIKLQotIzogc3BhcmMtZGlzLmM6ODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiA9PSBcIiVzXCJcbiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wcGMtZGlzLmMgYi9vcGNvZGVzL3BwYy1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3MTZlYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BwYy1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKiBwcGMtZGlzLmMgLS0gRGlzYXNzZW1ibGUgUG93ZXJQQyBpbnN0cnVjdGlvbnMKLSAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvcHBjLmgiCi0KLS8qIFRoaXMgZmlsZSBwcm92aWRlcyBzZXZlcmFsIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMsIGFsbCBvZiB3aGljaCB1c2UKLSAgIHRoZSBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGRlZmluZWQgaW4gZGlzLWFzbS5oLiAgU2V2ZXJhbCBmdW5jdGlvbnMKLSAgIGFyZSBwcm92aWRlZCBiZWNhdXNlIHRoaXMgZmlsZSBoYW5kbGVzIGRpc2Fzc2VtYmx5IGZvciB0aGUgUG93ZXJQQwotICAgaW4gYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gbW9kZSBhbmQgYWxzbyBmb3IgdGhlIFBPV0VSIChSUy82MDAwKQotICAgY2hpcC4gICovCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9wb3dlcnBjIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosCi0JCQkJICAgICAgIGludCBiaWdlbmRpYW4sIGludCBkaWFsZWN0KSk7Ci0KLS8qIFByaW50IGEgYmlnIGVuZGlhbiBQb3dlclBDIGluc3RydWN0aW9uLiAgRm9yIGNvbnZlbmllbmNlLCBhbHNvCi0gICBkaXNhc3NlbWJsZSBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMS4gICovCi0KLWludAotcHJpbnRfaW5zbl9iaWdfcG93ZXJwYyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc25fcG93ZXJwYyAobWVtYWRkciwgaW5mbywgMSwKLQkJCSAgICAgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzYwMSk7Ci19Ci0KLS8qIFByaW50IGEgbGl0dGxlIGVuZGlhbiBQb3dlclBDIGluc3RydWN0aW9uLiAgRm9yIGNvbnZlbmllbmNlLCBhbHNvCi0gICBkaXNhc3NlbWJsZSBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMS4gICovCi0KLWludAotcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc25fcG93ZXJwYyAobWVtYWRkciwgaW5mbywgMCwKLQkJCSAgICAgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzYwMSk7Ci19Ci0KLS8qIFByaW50IGEgUE9XRVIgKFJTLzYwMDApIGluc3RydWN0aW9uLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX3JzNjAwMCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc25fcG93ZXJwYyAobWVtYWRkciwgaW5mbywgMSwgUFBDX09QQ09ERV9QT1dFUik7Ci19Ci0KLS8qIFByaW50IGEgUG93ZXJQQyBvciBQT1dFUiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fcG93ZXJwYyAobWVtYWRkciwgaW5mbywgYmlnZW5kaWFuLCBkaWFsZWN0KQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgYmlnZW5kaWFuOwotICAgICBpbnQgZGlhbGVjdDsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBpbnQgc3RhdHVzOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3Bjb2RlOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZV9lbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgb3A7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoYmlnZW5kaWFuKQotICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICBlbHNlCi0gICAgaW5zbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLSAgLyogR2V0IHRoZSBtYWpvciBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgb3AgPSBQUENfT1AgKGluc24pOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBvcGNvZGUgdGFibGUuICBXZSBjb3VsZCBzcGVlZCB0aGlzIHVwCi0gICAgIGEgYml0IGJ5IGRvaW5nIGEgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbWFqb3Igb3Bjb2RlLiAgKi8KLSAgb3Bjb2RlX2VuZCA9IHBvd2VycGNfb3Bjb2RlcyArIHBvd2VycGNfbnVtX29wY29kZXM7Ci0gIGZvciAob3Bjb2RlID0gcG93ZXJwY19vcGNvZGVzOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX29wOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBpbnQgaW52YWxpZDsKLSAgICAgIGludCBuZWVkX2NvbW1hOwotICAgICAgaW50IG5lZWRfcGFyZW47Ci0KLSAgICAgIHRhYmxlX29wID0gUFBDX09QIChvcGNvZGUtPm9wY29kZSk7Ci0gICAgICBpZiAob3AgPCB0YWJsZV9vcCkKLQlicmVhazsKLSAgICAgIGlmIChvcCA+IHRhYmxlX29wKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKGluc24gJiBvcGNvZGUtPm1hc2spICE9IG9wY29kZS0+b3Bjb2RlCi0JICB8fCAob3Bjb2RlLT5mbGFncyAmIGRpYWxlY3QpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE1ha2UgdHdvIHBhc3NlcyBvdmVyIHRoZSBvcGVyYW5kcy4gIEZpcnN0IHNlZSBpZiBhbnkgb2YgdGhlbQotCSBoYXZlIGV4dHJhY3Rpb24gZnVuY3Rpb25zLCBhbmQsIGlmIHRoZXkgZG8sIG1ha2Ugc3VyZSB0aGUKLQkgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotICAgICAgaW52YWxpZCA9IDA7Ci0gICAgICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0JewotCSAgb3BlcmFuZCA9IHBvd2VycGNfb3BlcmFuZHMgKyAqb3BpbmRleDsKLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAmaW52YWxpZCk7Ci0JfQotICAgICAgaWYgKGludmFsaWQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3Bjb2RlLT5uYW1lKTsKLSAgICAgIGlmIChvcGNvZGUtPm9wZXJhbmRzWzBdICE9IDApCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gICAgICAvKiBOb3cgZXh0cmFjdCBhbmQgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KLSAgICAgIG5lZWRfY29tbWEgPSAwOwotICAgICAgbmVlZF9wYXJlbiA9IDA7Ci0gICAgICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0JewotCSAgbG9uZyB2YWx1ZTsKLQotCSAgb3BlcmFuZCA9IHBvd2VycGNfb3BlcmFuZHMgKyAqb3BpbmRleDsKLQotCSAgLyogT3BlcmFuZHMgdGhhdCBhcmUgbWFya2VkIEZBS0UgYXJlIHNpbXBseSBpZ25vcmVkLiAgV2UKLQkgICAgIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgdGhlIGV4dHJhY3QgZnVuY3Rpb24gY29uc2lkZXJlZAotCSAgICAgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZhbGlkLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9GQUtFKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JICAgIHZhbHVlID0gKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgKGludCAqKSBOVUxMKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgIT0gMAotCQkgICYmICh2YWx1ZSAmICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKSAhPSAwKQotCQl2YWx1ZSAtPSAxIDw8IG9wZXJhbmQtPmJpdHM7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIG9wZXJhbmQgaXMgb3B0aW9uYWwsIGFuZCB0aGUgdmFsdWUgaXMgemVybywgZG9uJ3QKLQkgICAgIHByaW50IGFueXRoaW5nLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9PUFRJT05BTCkgIT0gMAotCSAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX05FWFQpID09IDAKLQkgICAgICAmJiB2YWx1ZSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKG5lZWRfY29tbWEpCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkgICAgICBuZWVkX2NvbW1hID0gMDsKLQkgICAgfQotCi0JICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0dQUikgIT0gMCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWxkIiwgdmFsdWUpOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRlBSKSAhPSAwKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImYlbGQiLCB2YWx1ZSk7Ci0JICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9SRUxBVElWRSkgIT0gMCkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgdmFsdWUsIGluZm8pOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQUJTT0xVVEUpICE9IDApCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIHZhbHVlICYgMHhmZmZmZmZmZiwgaW5mbyk7Ci0JICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9DUikgPT0gMAotCQkgICB8fCAoZGlhbGVjdCAmIFBQQ19PUENPREVfUFBDKSA9PSAwKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChvcGVyYW5kLT5iaXRzID09IDMpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiY3IlZCIsIHZhbHVlKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdGF0aWMgY29uc3QgY2hhciAqY2JuYW1lc1s0XSA9IHsgImx0IiwgImd0IiwgImVxIiwgInNvIiB9OwotCQkgIGludCBjcjsKLQkJICBpbnQgY2M7Ci0KLQkJICBjciA9IHZhbHVlID4+IDI7Ci0JCSAgaWYgKGNyICE9IDApCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjQqY3IlZCIsIGNyKTsKLQkJICBjYyA9IHZhbHVlICYgMzsKLQkJICBpZiAoY2MgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNyICE9IDApCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGNibmFtZXNbY2NdKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChuZWVkX3BhcmVuKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JICAgICAgbmVlZF9wYXJlbiA9IDA7Ci0JICAgIH0KLQotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgPT0gMCkKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIigiKTsKLQkgICAgICBuZWVkX3BhcmVuID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2UgaGF2ZSBmb3VuZCBhbmQgcHJpbnRlZCBhbiBpbnN0cnVjdGlvbjsgcmV0dXJuLiAgKi8KLSAgICAgIHJldHVybiA0OwotICAgIH0KLQotICAvKiBXZSBjb3VsZCBub3QgZmluZCBhIG1hdGNoLiAgKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZyAweCVseCIsIGluc24pOwotCi0gIHJldHVybiA0OwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wcGMtb3BjLmMgYi9vcGNvZGVzL3BwYy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyMTg4MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BwYy1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMjQgKzAsMCBAQAotLyogcHBjLW9wYy5jIC0tIFBvd2VyUEMgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFBvd2VyUEMgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZQotICAgaW5jbHVkZXMgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcwotICAgcGVybWl0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyCi0gICBsb2dpYywgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcwotICAgc3RyaWN0bHkgY29uc3RhbnQgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbgotICAgdGhlIC50ZXh0IHNlY3Rpb24uCi0KLSAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dAotICAgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcwotICAgZmlsZS4gICovCi0MCi0vKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JhdCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JhdCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JiYSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JiYSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JkIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iZG0gUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iZG0gUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iZHAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iZHAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyBpbnQgdmFsaWRfYm8gUEFSQU1TICgobG9uZykpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JvIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYm8gUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9ib2UgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9ib2UgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9kcyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2RzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbGkgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9saSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X21iZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X21iZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X21iNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X21iNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X25iIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbmIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9uc2kgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9uc2kgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYWwgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JhbSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmFzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYnMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9yYnMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9zaDYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9zaDYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9zcHIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9zcHIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF90YnIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF90YnIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZS4KLQotICAgVGhlIGZpZWxkcyBhcmUgYml0cywgc2hpZnQsIGluc2VydCwgZXh0cmFjdCwgZmxhZ3MuCi0KLSAgIFdlIHVzZWQgdG8gcHV0IHBhcmVucyBhcm91bmQgdGhlIHZhcmlvdXMgYWRkaXRpb25zLCBsaWtlIHRoZSBvbmUKLSAgIGZvciBCQSBqdXN0IGJlbG93LiAgSG93ZXZlciwgdGhhdCBjYXVzZWQgdHJvdWJsZSB3aXRoIGZlZWJsZQotICAgY29tcGlsZXJzIHdpdGggYSBsaW1pdCBvbiBkZXB0aCBvZiBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiwgbGlrZQotICAgKHJlcG9ydGVkbHkpIHRoZSBjb21waWxlciBpbiBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyA1LiAgU28gd2UKLSAgIG9taXQgdGhlIHBhcmVucywgc2luY2UgdGhlIG1hY3JvcyBhcmUgbmV2ZXIgdXNlZCBpbiBhIGNvbnRleHQgd2hlcmUKLSAgIHRoZSBhZGRpdGlvbiB3aWxsIGJlIGFtYmlndW91cy4gICovCi0KLWNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgcG93ZXJwY19vcGVyYW5kc1tdID0KLXsKLSAgLyogVGhlIHplcm8gaW5kZXggaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mCi0gICAgIG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgVU5VU0VEIDAKLSAgeyAwLCAwLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCQSBVTlVTRUQgKyAxCi0jZGVmaW5lIEJBX01BU0sgKDB4MWYgPDwgMTYpCi0gIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lCi0gICAgIGFzIHRoZSBCVCBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJBVCBCQSArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X2JhdCwgZXh0cmFjdF9iYXQsIFBQQ19PUEVSQU5EX0ZBS0UgfSwKLQotICAvKiBUaGUgQkIgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJCIEJBVCArIDEKLSNkZWZpbmUgQkJfTUFTSyAoMHgxZiA8PCAxMSkKLSAgeyA1LCAxMSwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgQkIgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUKLSAgICAgYXMgdGhlIEJBIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkJBIEJCICsgMQotICB7IDUsIDExLCBpbnNlcnRfYmJhLCBleHRyYWN0X2JiYSwgUFBDX09QRVJBTkRfRkFLRSB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKLSAgICAgZm9yY2VkIHRvIHplcm8uICAqLwotI2RlZmluZSBCRCBCQkEgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZCwgZXh0cmFjdF9iZCwgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBhYnNvbHV0ZSBhZGRyZXNzaW5nIGlzCi0gICAgIHVzZWQuICAqLwotI2RlZmluZSBCREEgQkQgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZCwgZXh0cmFjdF9iZCwgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkLgotICAgICBUaGlzIHNldHMgdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KLSNkZWZpbmUgQkRNIEJEQSArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkbSwgZXh0cmFjdF9iZG0sCi0gICAgICBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSAtIG1vZGlmaWVyIGlzIHVzZWQKLSAgICAgYW5kIGFic29sdXRlIGFkZHJlc3MgaXMgdXNlZC4gICovCi0jZGVmaW5lIEJETUEgQkRNICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmRtLCBleHRyYWN0X2JkbSwKLSAgICAgIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZC4KLSAgICAgVGhpcyBzZXRzIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgYXBwcm9wcmlhdGVseS4gICovCi0jZGVmaW5lIEJEUCBCRE1BICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmRwLCBleHRyYWN0X2JkcCwKLSAgICAgIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZAotICAgICBhbmQgYWJzb2x1dGUgYWRkcmVzc2luZyBpcyB1c2VkLiAgKi8KLSNkZWZpbmUgQkRQQSBCRFAgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZHAsIGV4dHJhY3RfYmRwLAotICAgICAgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkYgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkYgQkRQQSArIDEKLSAgeyAzLCAyMywgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBBbiBvcHRpb25hbCBCRiBmaWVsZC4gIFRoaXMgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMsCi0gICAgIGluIHdoaWNoIGFuIG9taXR0ZWQgQkYgZmllbGQgaXMgdGFrZW4gYXMgemVyby4gICovCi0jZGVmaW5lIE9CRiBCRiArIDEKLSAgeyAzLCAyMywgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAotCi0gIC8qIFRoZSBCRkEgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkZBIE9CRiArIDEKLSAgeyAzLCAxOCwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgQkkgZmllbGQgaW4gYSBCIGZvcm0gb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJJIEJGQSArIDEKLSNkZWZpbmUgQklfTUFTSyAoMHgxZiA8PCAxNikKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBDZXJ0YWluIHZhbHVlcyBhcmUKLSAgICAgaWxsZWdhbC4gICovCi0jZGVmaW5lIEJPIEJJICsgMQotI2RlZmluZSBCT19NQVNLICgweDFmIDw8IDIxKQotICB7IDUsIDIxLCBpbnNlcnRfYm8sIGV4dHJhY3RfYm8sIDAgfSwKLQotICAvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBvciAtIG1vZGlmaWVyIGlzCi0gICAgIHVzZWQuICBUaGlzIGlzIGxpa2UgdGhlIEJPIGZpZWxkLCBidXQgaXQgbXVzdCBiZSBldmVuLiAgKi8KLSNkZWZpbmUgQk9FIEJPICsgMQotICB7IDUsIDIxLCBpbnNlcnRfYm9lLCBleHRyYWN0X2JvZSwgMCB9LAotCi0gIC8qIFRoZSBCVCBmaWVsZCBpbiBhbiBYIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCVCBCT0UgKyAxCi0gIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIGNvbmRpdGlvbiByZWdpc3RlciBudW1iZXIgcG9ydGlvbiBvZiB0aGUgQkkgZmllbGQgaW4gYSBCIGZvcm0KLSAgICAgb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGV4dGVuZGVkCi0gICAgIGNvbmRpdGlvbmFsIGJyYW5jaCBtbmVtb25pY3MsIHdoaWNoIHNldCB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlCi0gICAgIEJJIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gICovCi0jZGVmaW5lIENSIEJUICsgMQotICB7IDMsIDE4LCAwLCAwLCBQUENfT1BFUkFORF9DUiB8IFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCi0KLSAgLyogVGhlIEQgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGEgZGlzcGxhY2VtZW50IG9mZgotICAgICBhIHJlZ2lzdGVyLCBhbmQgaW1wbGllcyB0aGF0IHRoZSBuZXh0IG9wZXJhbmQgaXMgYSByZWdpc3RlciBpbgotICAgICBwYXJlbnRoZXNlcy4gICovCi0jZGVmaW5lIEQgQ1IgKyAxCi0gIHsgMTYsIDAsIDAsIDAsIFBQQ19PUEVSQU5EX1BBUkVOUyB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBEUyBmaWVsZCBpbiBhIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgRCwgYnV0IHRoZQotICAgICBsb3dlciB0d28gYml0cyBhcmUgZm9yY2VkIHRvIHplcm8uICAqLwotI2RlZmluZSBEUyBEICsgMQotICB7IDE2LCAwLCBpbnNlcnRfZHMsIGV4dHJhY3RfZHMsIFBQQ19PUEVSQU5EX1BBUkVOUyB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBFIGZpZWxkIGluIGEgd3J0ZWVpIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRSBEUyArIDEKLSAgeyAxLCAxNSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGTDEgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRkwxIEUgKyAxCi0gIHsgNCwgMTIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgRkwyIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZMMiBGTDEgKyAxCi0gIHsgMywgMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGTE0gZmllbGQgaW4gYW4gWEZMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGTE0gRkwyICsgMQotICB7IDgsIDE3LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEZSQSBmaWVsZCBpbiBhbiBYIG9yIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZSQSBGTE0gKyAxCi0jZGVmaW5lIEZSQV9NQVNLICgweDFmIDw8IDE2KQotICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKLQotICAvKiBUaGUgRlJCIGZpZWxkIGluIGFuIFggb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlJCIEZSQSArIDEKLSNkZWZpbmUgRlJCX01BU0sgKDB4MWYgPDwgMTEpCi0gIHsgNSwgMTEsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAotCi0gIC8qIFRoZSBGUkMgZmllbGQgaW4gYW4gQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlJDIEZSQiArIDEKLSNkZWZpbmUgRlJDX01BU0sgKDB4MWYgPDwgNikKLSAgeyA1LCA2LCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKLQotICAvKiBUaGUgRlJTIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbiBvciB0aGUgRlJUIGZpZWxkIGluIGEgRCwgWAotICAgICBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGUlMgRlJDICsgMQotI2RlZmluZSBGUlQgRlJTCi0gIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAotCi0gIC8qIFRoZSBGWE0gZmllbGQgaW4gYW4gWEZYIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlhNIEZSUyArIDEKLSNkZWZpbmUgRlhNX01BU0sgKDB4ZmYgPDwgMTIpCi0gIHsgOCwgMTIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgTCBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTCBGWE0gKyAxCi0gIHsgMSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCi0KLSAgLyogVGhlIExFViBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBMRVYgTCArIDEKLSAgeyA3LCA1LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKLSAgICAgZm9yY2VkIHRvIHplcm8uICAqLwotI2RlZmluZSBMSSBMRVYgKyAxCi0gIHsgMjYsIDAsIGluc2VydF9saSwgZXh0cmFjdF9saSwgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uIHdoZW4gdXNlZCBhcyBhbiBhYnNvbHV0ZQotICAgICBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgTElBIExJICsgMQotICB7IDI2LCAwLCBpbnNlcnRfbGksIGV4dHJhY3RfbGksIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIE1CIGZpZWxkIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1CIExJQSArIDEKLSNkZWZpbmUgTUJfTUFTSyAoMHgxZiA8PCA2KQotICB7IDUsIDYsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgTUUgZmllbGQgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUUgTUIgKyAxCi0jZGVmaW5lIE1FX01BU0sgKDB4MWYgPDwgMSkKLSAgeyA1LCAxLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIE1CIGFuZCBNRSBmaWVsZHMgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uIGV4cHJlc3NlZCBhIHNpbmdsZQotICAgICBvcGVyYW5kIHdoaWNoIGlzIGEgYml0bWFzayBpbmRpY2F0aW5nIHdoaWNoIGJpdHMgdG8gc2VsZWN0LiAgVGhpcwotICAgICBpcyBhIHR3byBvcGVyYW5kIGZvcm0gdXNpbmcgUFBDX09QRVJBTkRfTkVYVC4gIFNlZSB0aGUKLSAgICAgZGVzY3JpcHRpb24gaW4gb3Bjb2RlL3BwYy5oIGZvciB3aGF0IHRoaXMgbWVhbnMuICAqLwotI2RlZmluZSBNQkUgTUUgKyAxCi0gIHsgNSwgNiwgMCwgMCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfCBQUENfT1BFUkFORF9ORVhUIH0sCi0gIHsgMzIsIDAsIGluc2VydF9tYmUsIGV4dHJhY3RfbWJlLCAwIH0sCi0KLSAgLyogVGhlIE1CIG9yIE1FIGZpZWxkIGluIGFuIE1EIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGhpZ2gKLSAgICAgYml0IGlzIHdyYXBwZWQgdG8gdGhlIGxvdyBlbmQuICAqLwotI2RlZmluZSBNQjYgTUJFICsgMgotI2RlZmluZSBNRTYgTUI2Ci0jZGVmaW5lIE1CNl9NQVNLICgweDNmIDw8IDUpCi0gIHsgNiwgNSwgaW5zZXJ0X21iNiwgZXh0cmFjdF9tYjYsIDAgfSwKLQotICAvKiBUaGUgTkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgVGhlIHZhbHVlIDMyIGlzIHN0b3JlZCBhcwotICAgICAwLiAgKi8KLSNkZWZpbmUgTkIgTUI2ICsgMQotICB7IDYsIDExLCBpbnNlcnRfbmIsIGV4dHJhY3RfbmIsIDAgfSwKLQotICAvKiBUaGUgTlNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUKLSAgICAgU0kgZmllbGQsIG9ubHkgbmVnYXRlZC4gICovCi0jZGVmaW5lIE5TSSBOQiArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X25zaSwgZXh0cmFjdF9uc2ksCi0gICAgICBQUENfT1BFUkFORF9ORUdBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBSQSBmaWVsZCBpbiBhbiBELCBEUywgWCwgWE8sIE0sIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUkEgTlNJICsgMQotI2RlZmluZSBSQV9NQVNLICgweDFmIDw8IDE2KQotICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgICBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQSBmaWVsZCBtYXkgbm90IGJlIHplcm8gYW5kIG1heSBub3QKLSAgICAgZXF1YWwgdGhlIFJUIGZpZWxkLiAgKi8KLSNkZWZpbmUgUkFMIFJBICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFsLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkEgZmllbGQgaW4gYW4gbG13IGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbCB2YWx1ZQotICAgICByZXN0cmljdGlvbnMuICAqLwotI2RlZmluZSBSQU0gUkFMICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFtLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgICBzdG9yZSBvciBhbiB1cGRhdGluZyBmbG9hdGluZyBwb2ludCBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQQotICAgICBmaWVsZCBtYXkgbm90IGJlIHplcm8uICAqLwotI2RlZmluZSBSQVMgUkFNICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFzLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCwgWE8sIE0sIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUkIgUkFTICsgMQotI2RlZmluZSBSQl9NQVNLICgweDFmIDw8IDExKQotICB7IDUsIDExLCAwLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcwotICAgICB0aGUgUlMgZmllbGQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZAotICAgICBtbmVtb25pY3MgbGlrZSBtci4gICovCi0jZGVmaW5lIFJCUyBSQiArIDEKLSAgeyA1LCAxLCBpbnNlcnRfcmJzLCBleHRyYWN0X3JicywgUFBDX09QRVJBTkRfRkFLRSB9LAotCi0gIC8qIFRoZSBSUyBmaWVsZCBpbiBhIEQsIERTLCBYLCBYRlgsIFhTLCBNLCBNRCBvciBNRFMgZm9ybQotICAgICBpbnN0cnVjdGlvbiBvciB0aGUgUlQgZmllbGQgaW4gYSBELCBEUywgWCwgWEZYIG9yIFhPIGZvcm0KLSAgICAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUyBSQlMgKyAxCi0jZGVmaW5lIFJUIFJTCi0jZGVmaW5lIFJUX01BU0sgKDB4MWYgPDwgMjEpCi0gIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBTSCBmaWVsZCBpbiBhbiBYIG9yIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNIIFJTICsgMQotI2RlZmluZSBTSF9NQVNLICgweDFmIDw8IDExKQotICB7IDUsIDExLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFNIIGZpZWxkIGluIGFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHNwbGl0LiAgKi8KLSNkZWZpbmUgU0g2IFNIICsgMQotI2RlZmluZSBTSDZfTUFTSyAoKDB4MWYgPDwgMTEpIHwgKDEgPDwgMSkpCi0gIHsgNiwgMSwgaW5zZXJ0X3NoNiwgZXh0cmFjdF9zaDYsIDAgfSwKLQotICAvKiBUaGUgU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSSBTSDYgKyAxCi0gIHsgMTYsIDAsIDAsIDAsIFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHdlIGFjY2VwdCBhIHdpZGUgcmFuZ2UKLSAgICAgb2YgcG9zaXRpdmUgdmFsdWVzLiAgKi8KLSNkZWZpbmUgU0lTSUdOT1BUIFNJICsgMQotICB7IDE2LCAwLCAwLCAwLCBQUENfT1BFUkFORF9TSUdORUQgfCBQUENfT1BFUkFORF9TSUdOT1BUIH0sCi0KLSAgLyogVGhlIFNQUiBmaWVsZCBpbiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZmxpcHBlZC0tdGhlCi0gICAgIGxvd2VyIDUgYml0cyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciA1IGFuZCB2aWNlLSB2ZXJzYS4gICovCi0jZGVmaW5lIFNQUiBTSVNJR05PUFQgKyAxCi0jZGVmaW5lIFNQUl9NQVNLICgweDNmZiA8PCAxMSkKLSAgeyAxMCwgMTEsIGluc2VydF9zcHIsIGV4dHJhY3Rfc3ByLCAwIH0sCi0KLSAgLyogVGhlIEJBVCBpbmRleCBudW1iZXIgaW4gYW4gWEZYIGZvcm0gbVtmdF1pYmF0W2x1XSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNQUkJBVCBTUFIgKyAxCi0jZGVmaW5lIFNQUkJBVF9NQVNLICgweDMgPDwgMTcpCi0gIHsgMiwgMTcsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgU1BSRyByZWdpc3RlciBudW1iZXIgaW4gYW4gWEZYIGZvcm0gbVtmdF1zcHJnIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1BSRyBTUFJCQVQgKyAxCi0jZGVmaW5lIFNQUkdfTUFTSyAoMHgzIDw8IDE2KQotICB7IDIsIDE2LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFNSIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNSIFNQUkcgKyAxCi0gIHsgNCwgMTYsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgU1YgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1YgU1IgKyAxCi0gIHsgMTQsIDIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgVEJSIGZpZWxkIGluIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIHRoZSBTUFIKLSAgICAgZmllbGQsIGJ1dCBpdCBpcyBvcHRpb25hbC4gICovCi0jZGVmaW5lIFRCUiBTViArIDEKLSAgeyAxMCwgMTEsIGluc2VydF90YnIsIGV4dHJhY3RfdGJyLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAotCi0gIC8qIFRoZSBUTyBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVE8gVEJSICsgMQotI2RlZmluZSBUT19NQVNLICgweDFmIDw8IDIxKQotICB7IDUsIDIxLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFUgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVSBUTyArIDEKLSAgeyA0LCAxMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBVSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVJIFUgKyAxCi0gIHsgMTYsIDAsIDAsIDAsIDAgfSwKLX07Ci0KLS8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbnNlcnQgYW5kIGV4dHJhY3QgY29tcGxpY2F0ZWQgb3BlcmFuZHMuICAqLwotCi0vKiBUaGUgQkEgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKLSAgIHRoZSBCVCBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgRkFLRS4KLSAgIFRoZSBpbnNlcnRpb24gZnVuY3Rpb24ganVzdCBjb3BpZXMgdGhlIEJUIGZpZWxkIGludG8gdGhlIEJBIGZpZWxkLAotICAgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlCi0gICBzYW1lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JhdCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgoKGluc24gPj4gMjEpICYgMHgxZikgPDwgMTYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9iYXQgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoKGluc24gPj4gMTYpICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogVGhlIEJCIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICB0aGUgQkEgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuCi0gICBUaGUgaW5zZXJ0aW9uIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCQSBmaWVsZCBpbnRvIHRoZSBCQiBmaWVsZCwKLSAgIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZQotICAgc2FtZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iYmEgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDE2KSAmIDB4MWYpIDw8IDExKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmJhIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMTYpICYgMHgxZikgIT0gKChpbnNuID4+IDExKSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKLSAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JkIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9iZCAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkLgotICAgVGhpcyBtb2RpZmllciBtZWFucyB0aGF0IHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLgotICAgV2UgbXVzdCBzZXQgdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCB0byAxIGlmIHRoZSBvZmZzZXQgaXMKLSAgIG5lZ2F0aXZlLiAgV2hlbiBleHRyYWN0aW5nLCB3ZSByZXF1aXJlIHRoYXQgdGhlIHkgYml0IGJlIDEgYW5kIHRoYXQKLSAgIHRoZSBvZmZzZXQgYmUgcG9zaXRpdmUsIHNpbmNlIGlmIHRoZSB5IGJpdCBpcyAwIHdlIGp1c3Qgd2FudCB0bwotICAgcHJpbnQgdGhlIG5vcm1hbCBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iZG0gKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKCh2YWx1ZSAmIDB4ODAwMCkgIT0gMCkKLSAgICBpbnNuIHw9IDEgPDwgMjE7Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmRtIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gJiAoMSA8PCAyMSkpID09IDAKLQkgIHx8IChpbnNuICYgKDEgPDwgMTUpKSA9PSAwKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBtb2RpZmllciBpcyB1c2VkLgotICAgVGhpcyBpcyBsaWtlIEJETSwgYWJvdmUsIGV4Y2VwdCB0aGF0IHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUKLSAgIHRha2VuLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JkcCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoKHZhbHVlICYgMHg4MDAwKSA9PSAwKQotICAgIGluc24gfD0gMSA8PCAyMTsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9iZHAgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiAmICgxIDw8IDIxKSkgPT0gMAotCSAgfHwgKGluc24gJiAoMSA8PCAxNSkpICE9IDApKQotICAgICppbnZhbGlkID0gMTsKLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldHVybiAoaW5zbiAmIDB4ZmZmYykgLSAweDEwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluc24gJiAweGZmZmM7Ci19Ci0KLS8qIENoZWNrIGZvciBsZWdhbCB2YWx1ZXMgb2YgYSBCTyBmaWVsZC4gICovCi0KLXN0YXRpYyBpbnQKLXZhbGlkX2JvICh2YWx1ZSkKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgLyogQ2VydGFpbiBlbmNvZGluZ3MgaGF2ZSBiaXRzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIHplcm8uICBUaGVzZQotICAgICBhcmUgKHogbXVzdCBiZSB6ZXJvLCB5IG1heSBiZSBhbnl0aGluZyk6Ci0gICAgICAgICAwMDF6eQotCSAwMTF6eQotCSAxejAweQotCSAxejAxeQotCSAxejF6egotICAgICAqLwotICBzd2l0Y2ggKHZhbHVlICYgMHgxNCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIDB4NDoKLSAgICAgIHJldHVybiAodmFsdWUgJiAweDIpID09IDA7Ci0gICAgY2FzZSAweDEwOgotICAgICAgcmV0dXJuICh2YWx1ZSAmIDB4OCkgPT0gMDsKLSAgICBjYXNlIDB4MTQ6Ci0gICAgICByZXR1cm4gdmFsdWUgPT0gMHgxNDsKLSAgICB9Ci19Ci0KLS8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFdhcm4gYWJvdXQgYXR0ZW1wdHMgdG8gc2V0Ci0gICB0aGUgZmllbGQgdG8gYW4gaWxsZWdhbCB2YWx1ZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYm8gKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTAotICAgICAgJiYgISB2YWxpZF9ibyAodmFsdWUpKQotICAgICplcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAyMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JvIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyB2YWx1ZTsKLQotICB2YWx1ZSA9IChpbnNuID4+IDIxKSAmIDB4MWY7Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgISB2YWxpZF9ibyAodmFsdWUpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBvciAtIG1vZGlmaWVyIGlzCi0gICB1c2VkLiAgVGhpcyBpcyBsaWtlIHRoZSBCTyBmaWVsZCwgYnV0IGl0IG11c3QgYmUgZXZlbi4gIFdoZW4KLSAgIGV4dHJhY3RpbmcgaXQsIHdlIGZvcmNlIGl0IHRvIGJlIGV2ZW4uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JvZSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHZhbGlkX2JvICh2YWx1ZSkpCi0JKmVycm1zZyA9IF8oImludmFsaWQgY29uZGl0aW9uYWwgb3B0aW9uIik7Ci0gICAgICBlbHNlIGlmICgodmFsdWUgJiAxKSAhPSAwKQotCSplcnJtc2cgPSBfKCJhdHRlbXB0IHRvIHNldCB5IGJpdCB3aGVuIHVzaW5nICsgb3IgLSBtb2RpZmllciIpOwotICAgIH0KLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMjEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9ib2UgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIHZhbHVlOwotCi0gIHZhbHVlID0gKGluc24gPj4gMjEpICYgMHgxZjsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAhIHZhbGlkX2JvICh2YWx1ZSkpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gdmFsdWUgJiAweDFlOwotfQotCi0vKiBUaGUgRFMgZmllbGQgaW4gYSBEUyBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIEQsIGJ1dCB0aGUKLSAgIGxvd2VyIHR3byBiaXRzIGFyZSBmb3JjZWQgdG8gemVyby4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kcyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfZHMgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKLSAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2xpIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICgodmFsdWUgJiAzKSAhPSAwICYmIGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLSAgICAqZXJybXNnID0gXygiaWdub3JpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBicmFuY2ggb2Zmc2V0Iik7Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHgzZmZmZmZjKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9saSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmICgoaW5zbiAmIDB4MjAwMDAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweDNmZmZmZmMpIC0gMHg0MDAwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluc24gJiAweDNmZmZmZmM7Ci19Ci0KLS8qIFRoZSBNQiBhbmQgTUUgZmllbGRzIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbiBleHByZXNzZWQgYXMgYSBzaW5nbGUKLSAgIG9wZXJhbmQgd2hpY2ggaXMgaXRzZWxmIGEgYml0bWFzay4gIFRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGFsd2F5cwotICAgbWFya3MgaXQgYXMgaW52YWxpZCwgc2luY2Ugd2UgbmV2ZXIgd2FudCB0byByZWNvZ25pemUgYW4KLSAgIGluc3RydWN0aW9uIHdoaWNoIHVzZXMgYSBmaWVsZCBvZiB0aGlzIHR5cGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X21iZSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICB1bnNpZ25lZCBsb25nIHV2YWwsIG1hc2s7Ci0gIGludCBtYiwgbWUsIG14LCBjb3VudCwgbGFzdDsKLQotICB1dmFsID0gdmFsdWU7Ci0KLSAgaWYgKHV2YWwgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQotCSplcnJtc2cgPSBfKCJpbGxlZ2FsIGJpdG1hc2siKTsKLSAgICAgIHJldHVybiBpbnNuOwotICAgIH0KLQotICBtYiA9IDA7Ci0gIG1lID0gMzI7Ci0gIGlmICgodXZhbCAmIDEpICE9IDApCi0gICAgbGFzdCA9IDE7Ci0gIGVsc2UKLSAgICBsYXN0ID0gMDsKLSAgY291bnQgPSAwOwotCi0gIC8qIG1iOiBsb2NhdGlvbiBvZiBsYXN0IDAtPjEgdHJhbnNpdGlvbiAqLwotICAvKiBtZTogbG9jYXRpb24gb2YgbGFzdCAxLT4wIHRyYW5zaXRpb24gKi8KLSAgLyogY291bnQ6ICMgdHJhbnNpdGlvbnMgKi8KLQotICBmb3IgKG14ID0gMCwgbWFzayA9IDEgPDwgMzE7IG14IDwgMzI7ICsrbXgsIG1hc2sgPj49IDEpCi0gICAgewotICAgICAgaWYgKCh1dmFsICYgbWFzaykgJiYgIWxhc3QpCi0JewotCSAgKytjb3VudDsKLQkgIG1iID0gbXg7Ci0JICBsYXN0ID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICghKHV2YWwgJiBtYXNrKSAmJiBsYXN0KQotCXsKLQkgICsrY291bnQ7Ci0JICBtZSA9IG14OwotCSAgbGFzdCA9IDA7Ci0JfQotICAgIH0KLSAgaWYgKG1lID09IDApCi0gICAgbWUgPSAzMjsKLQotICBpZiAoY291bnQgIT0gMiAmJiAoY291bnQgIT0gMCB8fCAhIGxhc3QpKQotICAgIHsKLSAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwpCi0JKmVycm1zZyA9IF8oImlsbGVnYWwgYml0bWFzayIpOwotICAgIH0KLQotICByZXR1cm4gaW5zbiB8IChtYiA8PCA2KSB8ICgobWUgLSAxKSA8PCAxKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfbWJlIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyByZXQ7Ci0gIGludCBtYiwgbWU7Ci0gIGludCBpOwotCi0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCkKLSAgICAqaW52YWxpZCA9IDE7Ci0KLSAgbWIgPSAoaW5zbiA+PiA2KSAmIDB4MWY7Ci0gIG1lID0gKGluc24gPj4gMSkgJiAweDFmOwotICBpZiAobWIgPCBtZSArIDEpCi0gICAgewotICAgICAgcmV0ID0gMDsKLSAgICAgIGZvciAoaSA9IG1iOyBpIDw9IG1lOyBpKyspCi0JcmV0IHw9IChsb25nKSAxIDw8ICgzMSAtIGkpOwotICAgIH0KLSAgZWxzZSBpZiAobWIgPT0gbWUgKyAxKQotICAgIHJldCA9IH4wOwotICBlbHNlIC8qIChtYiA+IG1lICsgMSkgKi8KLSAgICB7Ci0gICAgICByZXQgPSB+IChsb25nKSAwOwotICAgICAgZm9yIChpID0gbWUgKyAxOyBpIDwgbWI7IGkrKykKLQlyZXQgJj0gfiAoKGxvbmcpIDEgPDwgKDMxIC0gaSkpOwotICAgIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIE1CIG9yIE1FIGZpZWxkIGluIGFuIE1EIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggYml0Ci0gICBpcyB3cmFwcGVkIHRvIHRoZSBsb3cgZW5kLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X21iNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCA2KSB8ICh2YWx1ZSAmIDB4MjApOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X21iNiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiAoKGluc24gPj4gNikgJiAweDFmKSB8IChpbnNuICYgMHgyMCk7Ci19Ci0KLS8qIFRoZSBOQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgdmFsdWUgMzIgaXMgc3RvcmVkIGFzCi0gICAwLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9uYiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMzIpCi0gICAgKmVycm1zZyA9IF8oInZhbHVlIG91dCBvZiByYW5nZSIpOwotICBpZiAodmFsdWUgPT0gMzIpCi0gICAgdmFsdWUgPSAwOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxMSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfbmIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIHJldDsKLQotICByZXQgPSAoaW5zbiA+PiAxMSkgJiAweDFmOwotICBpZiAocmV0ID09IDApCi0gICAgcmV0ID0gMzI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBOU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBTSQotICAgZmllbGQsIG9ubHkgbmVnYXRlZC4gIFRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGFsd2F5cyBtYXJrcyBpdCBhcwotICAgaW52YWxpZCwgc2luY2Ugd2UgbmV2ZXIgd2FudCB0byByZWNvZ25pemUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcwotICAgYSBmaWVsZCBvZiB0aGlzIHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbnNpIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgtIHZhbHVlKSAmIDB4ZmZmZik7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X25zaSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gLSAoKGxvbmcpKGluc24gJiAweGZmZmYpIC0gMHgxMDAwMCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gLSAobG9uZykoaW5zbiAmIDB4ZmZmZik7Ci19Ci0KLS8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCi0gICBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQSBmaWVsZCBtYXkgbm90IGJlIHplcm8gYW5kIG1heSBub3QKLSAgIGVxdWFsIHRoZSBSVCBmaWVsZC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfcmFsIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA9PSAwCi0gICAgICB8fCAodW5zaWduZWQgbG9uZykgdmFsdWUgPT0gKChpbnNuID4+IDIxKSAmIDB4MWYpKQotICAgICplcnJtc2cgPSAiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Ci19Ci0KLS8qIFRoZSBSQSBmaWVsZCBpbiBhbiBsbXcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsIHZhbHVlCi0gICByZXN0cmljdGlvbnMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3JhbSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID49ICgoaW5zbiA+PiAyMSkgJiAweDFmKSkKLSAgICAqZXJybXNnID0gXygiaW5kZXggcmVnaXN0ZXIgaW4gbG9hZCByYW5nZSIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Ci19Ci0KLS8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCi0gICBzdG9yZSBvciBhbiB1cGRhdGluZyBmbG9hdGluZyBwb2ludCBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQQotICAgZmllbGQgbWF5IG5vdCBiZSB6ZXJvLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYXMgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID09IDApCi0gICAgKmVycm1zZyA9IF8oImludmFsaWQgcmVnaXN0ZXIgb3BlcmFuZCB3aGVuIHVwZGF0aW5nIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotLyogVGhlIFJCIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKLSAgIHRoZSBSUyBmaWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkCi0gICBtbmVtb25pY3MgbGlrZSBtci4gIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgRkFLRS4gIFRoZSBpbnNlcnRpb24KLSAgIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCVCBmaWVsZCBpbnRvIHRoZSBCQSBmaWVsZCwgYW5kIHRoZQotICAgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZSBzYW1lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3JicyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgoKGluc24gPj4gMjEpICYgMHgxZikgPDwgMTEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9yYnMgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoKGluc24gPj4gMTEpICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogVGhlIFNIIGZpZWxkIGluIGFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHNwbGl0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3NoNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxMSkgfCAoKHZhbHVlICYgMHgyMCkgPj4gNCk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3Rfc2g2IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgcmV0dXJuICgoaW5zbiA+PiAxMSkgJiAweDFmKSB8ICgoaW5zbiA8PCA0KSAmIDB4MjApOwotfQotCi0vKiBUaGUgU1BSIGZpZWxkIGluIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBmbGlwcGVkLS10aGUKLSAgIGxvd2VyIDUgYml0cyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciA1IGFuZCB2aWNlLSB2ZXJzYS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfc3ByIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNlMCkgPDwgNik7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X3NwciAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiAoKGluc24gPj4gMTYpICYgMHgxZikgfCAoKGluc24gPj4gNikgJiAweDNlMCk7Ci19Ci0KLS8qIFRoZSBUQlIgZmllbGQgaW4gYW4gWEZYIGluc3RydWN0aW9uLiAgVGhpcyBpcyBqdXN0IGxpa2UgU1BSLCBidXQgaXQKLSAgIGlzIG9wdGlvbmFsLiAgV2hlbiBUQlIgaXMgb21pdHRlZCwgaXQgbXVzdCBiZSBpbnNlcnRlZCBhcyAyNjggKHRoZQotICAgbWFnaWMgbnVtYmVyIG9mIHRoZSBUQiByZWdpc3RlcikuICBUaGVzZSBmdW5jdGlvbnMgdHJlYXQgMAotICAgKGluZGljYXRpbmcgYW4gb21pdHRlZCBvcHRpb25hbCBvcGVyYW5kKSBhcyAyNjguICBUaGlzIG1lYW5zIHRoYXQKLSAgIGBgbWZ0YiA0LDAnJyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICBUaGlzIGRvZXMgbm90IG1hdHRlciB2ZXJ5Ci0gICBtdWNoLCBzaW5jZSB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBkb2VzIG5vdCBkZWZpbmUgbWZ0YiBhcwotICAgYWNjZXB0aW5nIGFueSB2YWx1ZXMgb3RoZXIgdGhhbiAyNjggb3IgMjY5LiAgKi8KLQotI2RlZmluZSBUQiAoMjY4KQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3RiciAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgPT0gMCkKLSAgICB2YWx1ZSA9IFRCOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNikgfCAoKHZhbHVlICYgMHgzZTApIDw8IDYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF90YnIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIHJldDsKLQotICByZXQgPSAoKGluc24gPj4gMTYpICYgMHgxZikgfCAoKGluc24gPj4gNikgJiAweDNlMCk7Ci0gIGlmIChyZXQgPT0gVEIpCi0gICAgcmV0ID0gMDsKLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIE1hY3JvcyB1c2VkIHRvIGZvcm0gb3Bjb2Rlcy4gICovCi0KLS8qIFRoZSBtYWluIG9wY29kZS4gICovCi0jZGVmaW5lIE9QKHgpICgoKCh1bnNpZ25lZCBsb25nKSh4KSkgJiAweDNmKSA8PCAyNikKLSNkZWZpbmUgT1BfTUFTSyBPUCAoMHgzZikKLQotLyogVGhlIG1haW4gb3Bjb2RlIGNvbWJpbmVkIHdpdGggYSB0cmFwIGNvZGUgaW4gdGhlIFRPIGZpZWxkIG9mIGEgRAotICAgZm9ybSBpbnN0cnVjdGlvbi4gIFVzZWQgZm9yIGV4dGVuZGVkIG1uZW1vbmljcyBmb3IgdGhlIHRyYXAKLSAgIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIE9QVE8oeCx0bykgKE9QICh4KSB8ICgoKCh1bnNpZ25lZCBsb25nKSh0bykpICYgMHgxZikgPDwgMjEpKQotI2RlZmluZSBPUFRPX01BU0sgKE9QX01BU0sgfCBUT19NQVNLKQotCi0vKiBUaGUgbWFpbiBvcGNvZGUgY29tYmluZWQgd2l0aCBhIGNvbXBhcmlzb24gc2l6ZSBiaXQgaW4gdGhlIEwgZmllbGQKLSAgIG9mIGEgRCBmb3JtIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gIFVzZWQgZm9yIGV4dGVuZGVkIG1uZW1vbmljcyBmb3IKLSAgIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIE9QTCh4LGwpIChPUCAoeCkgfCAoKCgodW5zaWduZWQgbG9uZykobCkpICYgMSkgPDwgMjEpKQotI2RlZmluZSBPUExfTUFTSyBPUEwgKDB4M2YsMSkKLQotLyogQW4gQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQShvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmKSA8PCAxKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKLSNkZWZpbmUgQV9NQVNLIEEgKDB4M2YsIDB4MWYsIDEpCi0KLS8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBBRlJCX01BU0sgKEFfTUFTSyB8IEZSQl9NQVNLKQotCi0vKiBBbiBBX01BU0sgd2l0aCB0aGUgRlJDIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgQUZSQ19NQVNLIChBX01BU0sgfCBGUkNfTUFTSykKLQotLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQSBhbmQgRlJDIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIEFGUkFGUkNfTUFTSyAoQV9NQVNLIHwgRlJBX01BU0sgfCBGUkNfTUFTSykKLQotLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCKG9wLCBhYSwgbGspIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGFhKSkgJiAxKSA8PCAxKSB8ICgobGspICYgMSkpCi0jZGVmaW5lIEJfTUFTSyBCICgweDNmLCAxLCAxKQotCi0vKiBBIEIgZm9ybSBpbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBCTyBmaWVsZC4gICovCi0jZGVmaW5lIEJCTyhvcCwgYm8sIGFhLCBsaykgKEIgKChvcCksIChhYSksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGJvKSkgJiAweDFmKSA8PCAyMSkpCi0jZGVmaW5lIEJCT19NQVNLIEJCTyAoMHgzZiwgMHgxZiwgMSwgMSkKLQotLyogQSBCQk9fTUFTSyB3aXRoIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgcmVtb3ZlZC4gIFRoaXMgcGVybWl0cwotICAgbWF0Y2hpbmcgYSBjb25kaXRpb25hbCBicmFuY2ggcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiB0aGUgeQotICAgYml0LiAgKi8KLSNkZWZpbmUgWV9NQVNLICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjEpCi0jZGVmaW5lIEJCT1lfTUFTSyAoQkJPX01BU0sgJn4gWV9NQVNLKQotCi0vKiBBIEIgZm9ybSBpbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBCTyBmaWVsZCBhbmQgdGhlIGNvbmRpdGlvbiBiaXRzIG9mCi0gICB0aGUgQkkgZmllbGQuICAqLwotI2RlZmluZSBCQk9DQihvcCwgYm8sIGNiLCBhYSwgbGspIFwKLSAgKEJCTyAoKG9wKSwgKGJvKSwgKGFhKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoY2IpKSAmIDB4MykgPDwgMTYpKQotI2RlZmluZSBCQk9DQl9NQVNLIEJCT0NCICgweDNmLCAweDFmLCAweDMsIDEsIDEpCi0KLS8qIEEgQkJPQ0JfTUFTSyB3aXRoIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgcmVtb3ZlZC4gICovCi0jZGVmaW5lIEJCT1lDQl9NQVNLIChCQk9DQl9NQVNLICZ+IFlfTUFTSykKLQotLyogQSBCQk9ZQ0JfTUFTSyBpbiB3aGljaCB0aGUgQkkgZmllbGQgaXMgZml4ZWQuICAqLwotI2RlZmluZSBCQk9ZQklfTUFTSyAoQkJPWUNCX01BU0sgfCBCSV9NQVNLKQotCi0vKiBUaGUgbWFpbiBvcGNvZGUgbWFzayB3aXRoIHRoZSBSQSBmaWVsZCBjbGVhci4gICovCi0jZGVmaW5lIERSQV9NQVNLIChPUF9NQVNLIHwgUkFfTUFTSykKLQotLyogQSBEUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRFNPKG9wLCB4b3ApIChPUCAob3ApIHwgKCh4b3ApICYgMHgzKSkKLSNkZWZpbmUgRFNfTUFTSyBEU08gKDB4M2YsIDMpCi0KLS8qIEFuIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE0ob3AsIHJjKSAoT1AgKG9wKSB8ICgocmMpICYgMSkpCi0jZGVmaW5lIE1fTUFTSyBNICgweDNmLCAxKQotCi0vKiBBbiBNIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTUUgZmllbGQgc3BlY2lmaWVkLiAgKi8KLSNkZWZpbmUgTU1FKG9wLCBtZSwgcmMpIChNICgob3ApLCAocmMpKSB8ICgoKCh1bnNpZ25lZCBsb25nKShtZSkpICYgMHgxZikgPDwgMSkpCi0KLS8qIEFuIE1fTUFTSyB3aXRoIHRoZSBNQiBhbmQgTUUgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgTU1CTUVfTUFTSyAoTV9NQVNLIHwgTUJfTUFTSyB8IE1FX01BU0spCi0KLS8qIEFuIE1fTUFTSyB3aXRoIHRoZSBTSCBhbmQgTUUgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgTVNITUVfTUFTSyAoTV9NQVNLIHwgU0hfTUFTSyB8IE1FX01BU0spCi0KLS8qIEFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNRChvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDcpIDw8IDIpIHwgKChyYykgJiAxKSkKLSNkZWZpbmUgTURfTUFTSyBNRCAoMHgzZiwgMHg3LCAxKQotCi0vKiBBbiBNRF9NQVNLIHdpdGggdGhlIE1CIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgTURNQl9NQVNLIChNRF9NQVNLIHwgTUI2X01BU0spCi0KLS8qIEFuIE1EX01BU0sgd2l0aCB0aGUgU0ggZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBNRFNIX01BU0sgKE1EX01BU0sgfCBTSDZfTUFTSykKLQotLyogQW4gTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNRFMob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHhmKSA8PCAxKSB8ICgocmMpICYgMSkpCi0jZGVmaW5lIE1EU19NQVNLIE1EUyAoMHgzZiwgMHhmLCAxKQotCi0vKiBBbiBNRFNfTUFTSyB3aXRoIHRoZSBNQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIE1EU01CX01BU0sgKE1EU19NQVNLIHwgTUI2X01BU0spCi0KLS8qIEFuIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTQyhvcCwgc2EsIGxrKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKShzYSkpICYgMSkgPDwgMSkgfCAoKGxrKSAmIDEpKQotI2RlZmluZSBTQ19NQVNLIChPUF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykweDNmZikgPDwgMTYpIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAxKSB8IDEpCi0KLS8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFgob3AsIHhvcCkgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkpCi0KLS8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBSQyBiaXQgc3BlY2lmaWVkLiAgKi8KLSNkZWZpbmUgWFJDKG9wLCB4b3AsIHJjKSAoWCAoKG9wKSwgKHhvcCkpIHwgKChyYykgJiAxKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhfTUFTSyBYUkMgKDB4M2YsIDB4M2ZmLCAxKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUkEgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYUkFfTUFTSyAoWF9NQVNLIHwgUkFfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWFJCX01BU0sgKFhfTUFTSyB8IFJCX01BU0spCi0KLS8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSVCBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhSVF9NQVNLIChYX01BU0sgfCBSVF9NQVNLKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUkEgYW5kIFJCIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhSQVJCX01BU0sgKFhfTUFTSyB8IFJBX01BU0sgfCBSQl9NQVNLKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUlQgYW5kIFJBIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhSVFJBX01BU0sgKFhfTUFTSyB8IFJUX01BU0sgfCBSQV9NQVNLKQotCi0vKiBBbiBYIGZvcm0gY29tcGFyaXNvbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhDTVBMKG9wLCB4b3AsIGwpIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykobCkpICYgMSkgPDwgMjEpKQotCi0vKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYQ01QX01BU0sgKFhfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjIpKQotCi0vKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTCBmaWVsZAotICAgZml4ZWQuICAqLwotI2RlZmluZSBYQ01QTF9NQVNLIChYQ01QX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIxKSkKLQotLyogQW4gWCBmb3JtIHRyYXAgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgVE8gZmllbGQgc3BlY2lmaWVkLiAgKi8KLSNkZWZpbmUgWFRPKG9wLCB4b3AsIHRvKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHRvKSkgJiAweDFmKSA8PCAyMSkpCi0jZGVmaW5lIFhUT19NQVNLIChYX01BU0sgfCBUT19NQVNLKQotCi0vKiBBbiBYRkwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhGTChvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIFhGTF9NQVNLIChYRkwgKDB4M2YsIDB4M2ZmLCAxKSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjUpIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAxNikpCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTEsgZmllbGQgc2V0IHRvIDAuICAqLwotI2RlZmluZSBYTChvcCwgeG9wKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4M2ZmKSA8PCAxKSkKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIHRoZSBMSyBmaWVsZC4gICovCi0jZGVmaW5lIFhMTEsob3AsIHhvcCwgbGspIChYTCAoKG9wKSwgKHhvcCkpIHwgKChsaykgJiAxKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYTF9NQVNLIFhMTEsgKDB4M2YsIDB4M2ZmLCAxKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGV4cGxpY2l0bHkgc2V0cyB0aGUgQk8gZmllbGQuICAqLwotI2RlZmluZSBYTE8ob3AsIGJvLCB4b3AsIGxrKSBcCi0gIChYTExLICgob3ApLCAoeG9wKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoYm8pKSAmIDB4MWYpIDw8IDIxKSkKLSNkZWZpbmUgWExPX01BU0sgKFhMX01BU0sgfCBCT19NQVNLKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGV4cGxpY2l0bHkgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPCi0gICBmaWVsZC4gICovCi0jZGVmaW5lIFhMWUxLKG9wLCB4b3AsIHksIGxrKSAoWExMSyAoKG9wKSwgKHhvcCksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHkpKSAmIDEpIDw8IDIxKSkKLSNkZWZpbmUgWExZTEtfTUFTSyAoWExfTUFTSyB8IFlfTUFTSykKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBzZXRzIHRoZSBCTyBmaWVsZCBhbmQgdGhlIGNvbmRpdGlvbgotICAgYml0cyBvZiB0aGUgQkkgZmllbGQuICAqLwotI2RlZmluZSBYTE9DQihvcCwgYm8sIGNiLCB4b3AsIGxrKSBcCi0gIChYTE8gKChvcCksIChibyksICh4b3ApLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShjYikpICYgMykgPDwgMTYpKQotI2RlZmluZSBYTE9DQl9NQVNLIFhMT0NCICgweDNmLCAweDFmLCAweDMsIDB4M2ZmLCAxKQotCi0vKiBBbiBYTF9NQVNLIG9yIFhMWUxLX01BU0sgb3IgWExPQ0JfTUFTSyB3aXRoIHRoZSBCQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhMQkJfTUFTSyAoWExfTUFTSyB8IEJCX01BU0spCi0jZGVmaW5lIFhMWUJCX01BU0sgKFhMWUxLX01BU0sgfCBCQl9NQVNLKQotI2RlZmluZSBYTEJPQ0JCQl9NQVNLIChYTE9DQl9NQVNLIHwgQkJfTUFTSykKLQotLyogQW4gWExfTUFTSyB3aXRoIHRoZSBCTyBhbmQgQkIgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgWExCT0JCX01BU0sgKFhMX01BU0sgfCBCT19NQVNLIHwgQkJfTUFTSykKLQotLyogQW4gWExfTUFTSyB3aXRoIHRoZSBCTywgQkkgYW5kIEJCIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhMQk9CSUJCX01BU0sgKFhMX01BU0sgfCBCT19NQVNLIHwgQklfTUFTSyB8IEJCX01BU0spCi0KLS8qIEFuIFhPIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYTyhvcCwgeG9wLCBvZSwgcmMpIFwKLSAgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmZikgPDwgMSkgfCAoKCgodW5zaWduZWQgbG9uZykob2UpKSAmIDEpIDw8IDEwKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKLSNkZWZpbmUgWE9fTUFTSyBYTyAoMHgzZiwgMHgxZmYsIDEsIDEpCi0KLS8qIEFuIFhPX01BU0sgd2l0aCB0aGUgUkIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYT1JCX01BU0sgKFhPX01BU0sgfCBSQl9NQVNLKQotCi0vKiBBbiBYUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWFMob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZmYpIDw8IDIpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQotI2RlZmluZSBYU19NQVNLIFhTICgweDNmLCAweDFmZiwgMSkKLQotLyogQSBtYXNrIGZvciB0aGUgRlhNIHZlcnNpb24gb2YgYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYRlhGWE1fTUFTSyAoWF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMCkgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDExKSkKLQotLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgRlhNIGZpZWxkIGZpbGxlZCBpbi4gICovCi0jZGVmaW5lIFhGWE0ob3AsIHhvcCwgZnhtKSBcCi0gIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykoZnhtKSkgJiAweGZmKSA8PCAxMikpCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYU1BSKG9wLCB4b3AsIHNwcikgXAotICAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNwcikpICYgMHgxZikgPDwgMTYpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNwcikpICYgMHgzZTApIDw8IDYpKQotI2RlZmluZSBYU1BSX01BU0sgKFhfTUFTSyB8IFNQUl9NQVNLKQotCi0vKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluIGV4Y2VwdCBmb3IgdGhlCi0gICBTUFJCQVQgZmllbGQuICAqLwotI2RlZmluZSBYU1BSQkFUX01BU0sgKFhTUFJfTUFTSyAmfiBTUFJCQVRfTUFTSykKLQotLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbiBleGNlcHQgZm9yIHRoZQotICAgU1BSRyBmaWVsZC4gICovCi0jZGVmaW5lIFhTUFJHX01BU0sgKFhTUFJfTUFTSyAmfiBTUFJHX01BU0spCi0KLS8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcgZmlsbGVkIGluIGV4Y2VwdCB0aGUgRSBmaWVsZC4gICovCi0jZGVmaW5lIFhFX01BU0sgKDB4ZmZmZjdmZmYpCi0KLS8qIFRoZSBCTyBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCBjb25kaXRpb25hbCBicmFuY2ggbW5lbW9uaWNzLiAgKi8KLSNkZWZpbmUgQk9ETlpGCSgweDApCi0jZGVmaW5lIEJPRE5aRlAJKDB4MSkKLSNkZWZpbmUgQk9EWkYJKDB4MikKLSNkZWZpbmUgQk9EWkZQCSgweDMpCi0jZGVmaW5lIEJPRgkoMHg0KQotI2RlZmluZSBCT0ZQCSgweDUpCi0jZGVmaW5lIEJPRE5aVAkoMHg4KQotI2RlZmluZSBCT0ROWlRQCSgweDkpCi0jZGVmaW5lIEJPRFpUCSgweGEpCi0jZGVmaW5lIEJPRFpUUAkoMHhiKQotI2RlZmluZSBCT1QJKDB4YykKLSNkZWZpbmUgQk9UUAkoMHhkKQotI2RlZmluZSBCT0ROWgkoMHgxMCkKLSNkZWZpbmUgQk9ETlpQCSgweDExKQotI2RlZmluZSBCT0RaCSgweDEyKQotI2RlZmluZSBCT0RaUAkoMHgxMykKLSNkZWZpbmUgQk9VCSgweDE0KQotCi0vKiBUaGUgQkkgY29uZGl0aW9uIGJpdCBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCBjb25kaXRpb25hbCBicmFuY2gKLSAgIG1uZW1vbmljcy4gICovCi0jZGVmaW5lIENCTFQJKDApCi0jZGVmaW5lIENCR1QJKDEpCi0jZGVmaW5lIENCRVEJKDIpCi0jZGVmaW5lIENCU08JKDMpCi0KLS8qIFRoZSBUTyBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCB0cmFwIG1uZW1vbmljcy4gICovCi0jZGVmaW5lIFRPTEdUCSgweDEpCi0jZGVmaW5lIFRPTExUCSgweDIpCi0jZGVmaW5lIFRPRVEJKDB4NCkKLSNkZWZpbmUgVE9MR0UJKDB4NSkKLSNkZWZpbmUgVE9MTkwJKDB4NSkKLSNkZWZpbmUgVE9MTEUJKDB4NikKLSNkZWZpbmUgVE9MTkcJKDB4NikKLSNkZWZpbmUgVE9HVAkoMHg4KQotI2RlZmluZSBUT0dFCSgweGMpCi0jZGVmaW5lIFRPTkwJKDB4YykKLSNkZWZpbmUgVE9MVAkoMHgxMCkKLSNkZWZpbmUgVE9MRQkoMHgxNCkKLSNkZWZpbmUgVE9ORwkoMHgxNCkKLSNkZWZpbmUgVE9ORQkoMHgxOCkKLSNkZWZpbmUgVE9VCSgweDFmKQotDAotLyogU21hbGxlciBuYW1lcyBmb3IgdGhlIGZsYWdzIHNvIGVhY2ggZW50cnkgaW4gdGhlIG9wY29kZXMgdGFibGUgd2lsbAotICAgZml0IG9uIGEgc2luZ2xlIGxpbmUuICAqLwotI3VuZGVmCVBQQwotI2RlZmluZSBQUEMgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDQ09NCVBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQUEMzMiAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV8zMiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQzY0ICAgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzY0IHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDT05MWQlQUENfT1BDT0RFX1BQQwotI2RlZmluZSBQUEM0MDMJUFBDCi0jZGVmaW5lIFBQQzc1MAlQUEMKLSNkZWZpbmUgUFBDODYwCVBQQwotI2RlZmluZQlQT1dFUiAgIFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlQT1dFUjIJUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUE9XRVIyIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDUFdSMglQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lCVBPV0VSMzIJUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfQU5ZIHwgUFBDX09QQ09ERV8zMgotI2RlZmluZQlDT00gICAgIFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUJQ09NMzIgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZIHwgUFBDX09QQ09ERV8zMgotI2RlZmluZQlNNjAxICAgIFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFXzYwMSB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBXUkNPTQlQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV82MDEgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lCU1GREVDMQlQUENfT1BDT0RFX1BPV0VSCi0jZGVmaW5lCU1GREVDMglQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUJICAgICBPUENPREUJTUFTSwkJRkxBR1MJCXsgT1BFUkFORFMgfQotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIEZMQUdTIGFyZSBmbGFncyBpbmRpY2F0ZWQgd2hhdCBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9uLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCi0KLWNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSBwb3dlcnBjX29wY29kZXNbXSA9IHsKLXsgInRkbGd0aSIsICBPUFRPKDIsVE9MR1QpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsbHRpIiwgIE9QVE8oMixUT0xMVCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGVxaSIsICAgT1BUTygyLFRPRVEpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsZ2VpIiwgIE9QVE8oMixUT0xHRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxubGkiLCAgT1BUTygyLFRPTE5MKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGxlaSIsICBPUFRPKDIsVE9MTEUpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsbmdpIiwgIE9QVE8oMixUT0xORyksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGd0aSIsICAgT1BUTygyLFRPR1QpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRnZWkiLCAgIE9QVE8oMixUT0dFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbmxpIiwgICBPUFRPKDIsVE9OTCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGx0aSIsICAgT1BUTygyLFRPTFQpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsZWkiLCAgIE9QVE8oMixUT0xFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbmdpIiwgICBPUFRPKDIsVE9ORyksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5laSIsICAgT1BUTygyLFRPTkUpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRpIiwgICAgIE9QKDIpLAlPUF9NQVNLLAlQUEM2NCwJCXsgVE8sIFJBLCBTSSB9IH0sCi0KLXsgInR3bGd0aSIsICBPUFRPKDMsVE9MR1QpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRsZ3RpIiwgICBPUFRPKDMsVE9MR1QpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bGx0aSIsICBPUFRPKDMsVE9MTFQpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRsbHRpIiwgICBPUFRPKDMsVE9MTFQpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3ZXFpIiwgICBPUFRPKDMsVE9FUSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGVxaSIsICAgIE9QVE8oMyxUT0VRKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xnZWkiLCAgT1BUTygzLFRPTEdFKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGdlaSIsICAgT1BUTygzLFRPTEdFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xubGkiLCAgT1BUTygzLFRPTE5MKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bG5saSIsICAgT1BUTygzLFRPTE5MKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xsZWkiLCAgT1BUTygzLFRPTExFKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGxlaSIsICAgT1BUTygzLFRPTExFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xuZ2kiLCAgT1BUTygzLFRPTE5HKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bG5naSIsICAgT1BUTygzLFRPTE5HKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2d0aSIsICAgT1BUTygzLFRPR1QpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRndGkiLCAgICBPUFRPKDMsVE9HVCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdnZWkiLCAgIE9QVE8oMyxUT0dFKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0Z2VpIiwgICAgT1BUTygzLFRPR0UpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bmxpIiwgICBPUFRPKDMsVE9OTCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidG5saSIsICAgIE9QVE8oMyxUT05MKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2x0aSIsICAgT1BUTygzLFRPTFQpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRsdGkiLCAgICBPUFRPKDMsVE9MVCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsZWkiLCAgIE9QVE8oMyxUT0xFKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGVpIiwgICAgT1BUTygzLFRPTEUpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bmdpIiwgICBPUFRPKDMsVE9ORyksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidG5naSIsICAgIE9QVE8oMyxUT05HKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25laSIsICAgT1BUTygzLFRPTkUpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRuZWkiLCAgICBPUFRPKDMsVE9ORSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdpIiwgICAgIE9QKDMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFRPLCBSQSwgU0kgfSB9LAoteyAidGkiLCAgICAgIE9QKDMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFRPLCBSQSwgU0kgfSB9LAotCi17ICJtdWxsaSIsICAgT1AoNyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJtdWxpIiwgICAgT1AoNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi0KLXsgInN1YmZpYyIsICBPUCg4KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgInNmaSIsICAgICBPUCg4KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLQoteyAiZG96aSIsICAgIE9QKDkpLAlPUF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFNJIH0gfSwKLQoteyAiY21wbHdpIiwgIE9QTCgxMCwwKSwJT1BMX01BU0ssCVBQQ0NPTSwJCXsgT0JGLCBSQSwgVUkgfSB9LAoteyAiY21wbGRpIiwgIE9QTCgxMCwxKSwgT1BMX01BU0ssCVBQQzY0LAkJeyBPQkYsIFJBLCBVSSB9IH0sCi17ICJjbXBsaSIsICAgT1AoMTApLAlPUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgVUkgfSB9LAoteyAiY21wbGkiLCAgIE9QKDEwKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFVJIH0gfSwKLQoteyAiY21wd2kiLCAgIE9QTCgxMSwwKSwJT1BMX01BU0ssCVBQQ0NPTSwJCXsgT0JGLCBSQSwgU0kgfSB9LAoteyAiY21wZGkiLCAgIE9QTCgxMSwxKSwJT1BMX01BU0ssCVBQQzY0LAkJeyBPQkYsIFJBLCBTSSB9IH0sCi17ICJjbXBpIiwgICAgT1AoMTEpLAlPUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgU0kgfSB9LAoteyAiY21waSIsICAgIE9QKDExKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFNJIH0gfSwKLQoteyAiYWRkaWMiLCAgIE9QKDEyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgImFpIiwJICAgICBPUCgxMiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJzdWJpYyIsICAgT1AoMTIpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKLQoteyAiYWRkaWMuIiwgIE9QKDEzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgImFpLiIsICAgICBPUCgxMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJzdWJpYy4iLCAgT1AoMTMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKLQoteyAibGkiLAkgICAgIE9QKDE0KSwJRFJBX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFNJIH0gfSwKLXsgImxpbCIsICAgICBPUCgxNCksCURSQV9NQVNLLAlQV1JDT00sCQl7IFJULCBTSSB9IH0sCi17ICJhZGRpIiwgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAiY2FsIiwgICAgIE9QKDE0KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoteyAic3ViaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi17ICJsYSIsCSAgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxpcyIsICAgICBPUCgxNSksCURSQV9NQVNLLAlQUENDT00sCQl7IFJULCBTSVNJR05PUFQgfSB9LAoteyAibGl1IiwgICAgIE9QKDE1KSwJRFJBX01BU0ssCVBXUkNPTSwJCXsgUlQsIFNJU0lHTk9QVCB9IH0sCi17ICJhZGRpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULFJBLFNJU0lHTk9QVCB9IH0sCi17ICJjYXUiLCAgICAgT1AoMTUpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULFJBLFNJU0lHTk9QVCB9IH0sCi17ICJzdWJpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKLQoteyAiYmRuei0iLCAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJETSB9IH0sCi17ICJiZG56KyIsICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQIH0gfSwKLXsgImJkbnoiLCAgICBCQk8oMTYsQk9ETlosMCwwKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRCB9IH0sCi17ICJiZG4iLCAgICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkQgfSB9LAoteyAiYmRuemwtIiwgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJETSB9IH0sCi17ICJiZG56bCsiLCAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQIH0gfSwKLXsgImJkbnpsIiwgICBCQk8oMTYsQk9ETlosMCwxKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRCB9IH0sCi17ICJiZG5sIiwgICAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkQgfSB9LAoteyAiYmRuemEtIiwgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJETUEgfSB9LAoteyAiYmRuemErIiwgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUEEgfSB9LAoteyAiYmRuemEiLCAgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEQSB9IH0sCi17ICJiZG5hIiwgICAgQkJPKDE2LEJPRE5aLDEsMCksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkRBIH0gfSwKLXsgImJkbnpsYS0iLCBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKLXsgImJkbnpsYSsiLCBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKLXsgImJkbnpsYSIsICBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCREEgfSB9LAoteyAiYmRubGEiLCAgIEJCTygxNixCT0ROWiwxLDEpLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEQSB9IH0sCi17ICJiZHotIiwgICAgQkJPKDE2LEJPRFosMCwwKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNIH0gfSwKLXsgImJkeisiLCAgICBCQk8oMTYsQk9EWiwwLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFAgfSB9LAoteyAiYmR6IiwgICAgIEJCTygxNixCT0RaLDAsMCksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEIH0gfSwKLXsgImJkemwtIiwgICBCQk8oMTYsQk9EWiwwLDEpLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoteyAiYmR6bCsiLCAgIEJCTygxNixCT0RaLDAsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCi17ICJiZHpsIiwgICAgQkJPKDE2LEJPRFosMCwxKSwgIEJCT1lCSV9NQVNLLCBDT00sCXsgQkQgfSB9LAoteyAiYmR6YS0iLCAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETUEgfSB9LAoteyAiYmR6YSsiLCAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUEEgfSB9LAoteyAiYmR6YSIsICAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEQSB9IH0sCi17ICJiZHpsYS0iLCAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNQSB9IH0sCi17ICJiZHpsYSsiLCAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQQSB9IH0sCi17ICJiZHpsYSIsICAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBDT00sCXsgQkRBIH0gfSwKLXsgImJsdC0iLCAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmx0KyIsICAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibHQiLCAgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmx0bC0iLCAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibHRsKyIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJsdGwiLCAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibHRhLSIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibHRhKyIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibHRhIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJsdGxhLSIsICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJsdGxhKyIsICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJsdGxhIiwgICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmd0LSIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZ3QrIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJndCIsICAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZ3RsLSIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJndGwrIiwgICBCQk9DQigxNixCT1QsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmd0bCIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJndGEtIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJndGErIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJndGEiLCAgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmd0bGEtIiwgIEJCT0NCKDE2LEJPVCxDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmd0bGErIiwgIEJCT0NCKDE2LEJPVCxDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmd0bGEiLCAgIEJCT0NCKDE2LEJPVCxDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJiZXEtIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJlcSsiLCAgICBCQk9DQigxNixCT1QsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmVxIiwgICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJlcWwtIiwgICBCQk9DQigxNixCT1QsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmVxbCsiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJiZXFsIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmVxYS0iLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmVxYSsiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmVxYSIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJiZXFsYS0iLCAgQkJPQ0IoMTYsQk9ULENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJiZXFsYSsiLCAgQkJPQ0IoMTYsQk9ULENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJiZXFsYSIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJzby0iLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYnNvKyIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJic28iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYnNvbC0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJic29sKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJzb2wiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJic29hLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJic29hKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJic29hIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJzb2xhLSIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJzb2xhKyIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJzb2xhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYnVuLSIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJidW4rIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJ1biIsICAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCi17ICJidW5sLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJ1bmwrIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYnVubCIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEIH0gfSwKLXsgImJ1bmEtIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJ1bmErIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJ1bmEiLCAgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoteyAiYnVubGEtIiwgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYnVubGErIiwgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYnVubGEiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEQSB9IH0sCi17ICJiZ2UtIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJnZSsiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmdlIiwgICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJnZWwtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmdlbCsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJiZ2VsIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmdlYS0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmdlYSsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmdlYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJiZ2VsYS0iLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJiZ2VsYSsiLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJiZ2VsYSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJubC0iLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5sKyIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmwiLCAgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5sbC0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibmxsKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJubGwiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibmxhLSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmxhKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmxhIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJubGxhLSIsICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJubGxhKyIsICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJubGxhIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmxlLSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibGUrIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJsZSIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibGVsLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJsZWwrIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmxlbCIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJsZWEtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJsZWErIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJsZWEiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmxlbGEtIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmxlbGErIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmxlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmctIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuZysiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5nIiwgICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuZ2wtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5nbCsiLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmdsIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5nYS0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5nYSsiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5nYSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmdsYS0iLCAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmdsYSsiLCAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmdsYSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJuZS0iLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5lKyIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmUiLCAgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5lbC0iLCAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibmVsKyIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuZWwiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibmVhLSIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmVhKyIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmVhIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJuZWxhLSIsICBCQk9DQigxNixCT0YsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuZWxhKyIsICBCQk9DQigxNixCT0YsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuZWxhIiwgICBCQk9DQigxNixCT0YsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5zLSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibnMrIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJucyIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibnNsLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuc2wrIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5zbCIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuc2EtIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuc2ErIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuc2EiLCAgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5zbGEtIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5zbGErIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5zbGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibnUtIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJudSsiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm51IiwgICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEIH0gfSwKLXsgImJudWwtIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm51bCsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibnVsIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkQgfSB9LAoteyAiYm51YS0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm51YSsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm51YSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEQSB9IH0sCi17ICJibnVsYS0iLCAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibnVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibnVsYSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkRBIH0gfSwKLXsgImJkbnp0LSIsICBCQk8oMTYsQk9ETlpULDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuenQrIiwgIEJCTygxNixCT0ROWlQsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCi17ICJiZG56dCIsICAgQkJPKDE2LEJPRE5aVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuenRsLSIsIEJCTygxNixCT0ROWlQsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETSB9IH0sCi17ICJiZG56dGwrIiwgQkJPKDE2LEJPRE5aVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQIH0gfSwKLXsgImJkbnp0bCIsICBCQk8oMTYsQk9ETlpULDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZG56dGEtIiwgQkJPKDE2LEJPRE5aVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56dGErIiwgQkJPKDE2LEJPRE5aVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56dGEiLCAgQkJPKDE2LEJPRE5aVCwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnp0bGEtIixCQk8oMTYsQk9ETlpULDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJkbnp0bGErIixCQk8oMTYsQk9ETlpULDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJkbnp0bGEiLCBCQk8oMTYsQk9ETlpULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmRuemYtIiwgIEJCTygxNixCT0ROWkYsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETSB9IH0sCi17ICJiZG56ZisiLCAgQkJPKDE2LEJPRE5aRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQIH0gfSwKLXsgImJkbnpmIiwgICBCQk8oMTYsQk9ETlpGLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZG56ZmwtIiwgQkJPKDE2LEJPRE5aRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNIH0gfSwKLXsgImJkbnpmbCsiLCBCQk8oMTYsQk9ETlpGLDAsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFAgfSB9LAoteyAiYmRuemZsIiwgIEJCTygxNixCT0ROWkYsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkbnpmYS0iLCBCQk8oMTYsQk9ETlpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJkbnpmYSsiLCBCQk8oMTYsQk9ETlpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJkbnpmYSIsICBCQk8oMTYsQk9ETlpGLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmRuemZsYS0iLEJCTygxNixCT0ROWkYsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETUEgfSB9LAoteyAiYmRuemZsYSsiLEJCTygxNixCT0ROWkYsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUEEgfSB9LAoteyAiYmRuemZsYSIsIEJCTygxNixCT0ROWkYsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJidC0iLCAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJidCsiLCAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJidCIsCSAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmJ0IiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKLXsgImJ0bC0iLCAgICBCQk8oMTYsQk9ULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJ0bCsiLCAgICBCQk8oMTYsQk9ULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJ0bCIsICAgICBCQk8oMTYsQk9ULDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiYnRsIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoteyAiYnRhLSIsICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJ0YSsiLCAgICBCQk8oMTYsQk9ULDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJidGEiLCAgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJidGEiLCAgICBCQk8oMTYsQk9ULDEsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYnRsYS0iLCAgIEJCTygxNixCT1QsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJ0bGErIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJidGxhIiwgICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJidGxhIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmYtIiwgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmYrIiwgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmYiLAkgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJiZiIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZmwtIiwgICAgQkJPKDE2LEJPRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZmwrIiwgICAgQkJPKDE2LEJPRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJiZmwiLCAgICAgQkJPKDE2LEJPRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmJmbCIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKLXsgImJmYS0iLCAgICBCQk8oMTYsQk9GLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZmErIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYmZhIiwgICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYmZhIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJmbGEtIiwgICBCQk8oMTYsQk9GLDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZmxhKyIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYmZsYSIsICAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYmZsYSIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkenQtIiwgICBCQk8oMTYsQk9EWlQsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmR6dCsiLCAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJiZHp0IiwgICAgQkJPKDE2LEJPRFpULDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZHp0bC0iLCAgQkJPKDE2LEJPRFpULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJkenRsKyIsICBCQk8oMTYsQk9EWlQsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmR6dGwiLCAgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmR6dGEtIiwgIEJCTygxNixCT0RaVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmR6dGErIiwgIEJCTygxNixCT0RaVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYmR6dGEiLCAgIEJCTygxNixCT0RaVCwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkenRsYS0iLCBCQk8oMTYsQk9EWlQsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJkenRsYSsiLCBCQk8oMTYsQk9EWlQsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJkenRsYSIsICBCQk8oMTYsQk9EWlQsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZHpmLSIsICAgQkJPKDE2LEJPRFpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJkemYrIiwgICBCQk8oMTYsQk9EWkYsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmR6ZiIsICAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmR6ZmwtIiwgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZHpmbCsiLCAgQkJPKDE2LEJPRFpGLDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJkemZsIiwgICBCQk8oMTYsQk9EWkYsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkemZhLSIsICBCQk8oMTYsQk9EWkYsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJkemZhKyIsICBCQk8oMTYsQk9EWkYsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJkemZhIiwgICBCQk8oMTYsQk9EWkYsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZHpmbGEtIiwgQkJPKDE2LEJPRFpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHpmbGErIiwgQkJPKDE2LEJPRFpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHpmbGEiLCAgQkJPKDE2LEJPRFpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmMtIiwgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRE0gfSB9LAoteyAiYmMrIiwgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRFAgfSB9LAoteyAiYmMiLAkgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEIH0gfSwKLXsgImJjbC0iLCAgICBCKDE2LDAsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNIH0gfSwKLXsgImJjbCsiLCAgICBCKDE2LDAsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQIH0gfSwKLXsgImJjbCIsICAgICBCKDE2LDAsMSksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCRCB9IH0sCi17ICJiY2EtIiwgICAgQigxNiwxLDApLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJETUEgfSB9LAoteyAiYmNhKyIsICAgIEIoMTYsMSwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRFBBIH0gfSwKLXsgImJjYSIsICAgICBCKDE2LDEsMCksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCREEgfSB9LAoteyAiYmNsYS0iLCAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRE1BIH0gfSwKLXsgImJjbGErIiwgICBCKDE2LDEsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQQSB9IH0sCi17ICJiY2xhIiwgICAgQigxNiwxLDEpLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkRBIH0gfSwKLQoteyAic2MiLCAgICAgIFNDKDE3LDEsMCksIDB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCi17ICJzdmMiLCAgICAgU0MoMTcsMCwwKSwgU0NfTUFTSywJUE9XRVIsCQl7IExFViwgRkwxLCBGTDIgfSB9LAoteyAic3ZjbCIsICAgIFNDKDE3LDAsMSksIFNDX01BU0ssCVBPV0VSLAkJeyBMRVYsIEZMMSwgRkwyIH0gfSwKLXsgInN2Y2EiLCAgICBTQygxNywxLDApLCBTQ19NQVNLLAlQV1JDT00sCQl7IFNWIH0gfSwKLXsgInN2Y2xhIiwgICBTQygxNywxLDEpLCBTQ19NQVNLLAlQT1dFUiwJCXsgU1YgfSB9LAotCi17ICJiIiwJICAgICBCKDE4LDAsMCksCUJfTUFTSywJCUNPTSwJeyBMSSB9IH0sCi17ICJibCIsICAgICAgQigxOCwwLDEpLAlCX01BU0ssCQlDT00sCXsgTEkgfSB9LAoteyAiYmEiLCAgICAgIEIoMTgsMSwwKSwJQl9NQVNLLAkJQ09NLAl7IExJQSB9IH0sCi17ICJibGEiLCAgICAgQigxOCwxLDEpLAlCX01BU0ssCQlDT00sCXsgTElBIH0gfSwKLQoteyAibWNyZiIsICAgIFhMKDE5LDApLAlYTEJCX01BU0t8KDM8PDIxKXwoMzw8MTYpLCBDT00sCXsgQkYsIEJGQSB9IH0sCi0KLXsgImJsciIsICAgICBYTE8oMTksQk9VLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiciIsICAgICAgWExPKDE5LEJPVSwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFdSQ09NLAl7IDAgfSB9LAoteyAiYmxybCIsICAgIFhMTygxOSxCT1UsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJybCIsICAgICBYTE8oMTksQk9VLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQV1JDT00sCXsgMCB9IH0sCi17ICJiZG56bHIiLCAgWExPKDE5LEJPRE5aLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZG56bHItIiwgWExPKDE5LEJPRE5aLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZG56bHIrIiwgWExPKDE5LEJPRE5aUCwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmRuemxybCIsIFhMTygxOSxCT0ROWiwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYmRuemxybC0iLFhMTygxOSxCT0ROWiwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmRuemxybCsiLFhMTygxOSxCT0ROWlAsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkemxyIiwgICBYTE8oMTksQk9EWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYmR6bHItIiwgIFhMTygxOSxCT0RaLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZHpscisiLCAgWExPKDE5LEJPRFpQLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZHpscmwiLCAgWExPKDE5LEJPRFosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkemxybC0iLCBYTE8oMTksQk9EWiwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmR6bHJsKyIsIFhMTygxOSxCT0RaUCwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmx0bHIiLCAgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmx0bHItIiwgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmx0bHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsdHIiLCAgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJsdGxybCIsICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsdGxybC0iLCBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsdGxybCsiLCBYTE9DQigxOSxCT1RQLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibHRybCIsICAgWExPQ0IoMTksQk9ULENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJiZ3RsciIsICAgWExPQ0IoMTksQk9ULENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ3Rsci0iLCAgWExPQ0IoMTksQk9ULENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ3RscisiLCAgWExPQ0IoMTksQk9UUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmd0ciIsICAgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmd0bHJsIiwgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmd0bHJsLSIsIFhMT0NCKDE5LEJPVCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmd0bHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJndHJsIiwgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJlcWxyIiwgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJlcWxyLSIsICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJlcWxyKyIsICBYTE9DQigxOSxCT1RQLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZXFyIiwgICAgWExPQ0IoMTksQk9ULENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJiZXFscmwiLCAgWExPQ0IoMTksQk9ULENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZXFscmwtIiwgWExPQ0IoMTksQk9ULENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZXFscmwrIiwgWExPQ0IoMTksQk9UUCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmVxcmwiLCAgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYnNvbHIiLCAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnNvbHItIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnNvbHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJzb3IiLCAgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJzb2xybCIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJzb2xybC0iLCBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJzb2xybCsiLCBYTE9DQigxOSxCT1RQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJic29ybCIsICAgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJidW5sciIsICAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJidW5sci0iLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJidW5scisiLCAgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnVubHJsIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnVubHJsLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnVubHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJnZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJnZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJnZWxyKyIsICBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VyIiwgICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJiZ2VscmwiLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ2VscmwtIiwgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VscmwrIiwgWExPQ0IoMTksQk9GUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlcmwiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5sbHIiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5sbHItIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5sbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJubHIiLCAgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJubGxybCIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJubGxybC0iLCBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJubGxybCsiLCBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmxybCIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibGVsciIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibGVsci0iLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibGVscisiLCAgWExPQ0IoMTksQk9GUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmxlciIsICAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmxlbHJsIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmxlbHJsLSIsIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmxlbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuZ2xyIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZ2xyLSIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZ2xyKyIsICBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmdyIiwgICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmdscmwiLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmdscmwtIiwgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmdscmwrIiwgWExPQ0IoMTksQk9GUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5ncmwiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5lbHIiLCAgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5lbHItIiwgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5lbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuZWxybCIsICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZWxybCsiLCBYTE9DQigxOSxCT0ZQLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmVybCIsICAgWExPQ0IoMTksQk9GLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibnNsciIsICAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnNsci0iLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnNscisiLCAgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5zciIsICAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5zbHJsIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5zbHJsLSIsIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5zbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuc3JsIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJudWxyIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJudWxyLSIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJudWxyKyIsICBYTE9DQigxOSxCT0ZQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnVscmwiLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnVscmwtIiwgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnVscmwrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnRsciIsICAgIFhMTygxOSxCT1QsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYnRsci0iLCAgIFhMTygxOSxCT1QsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRscisiLCAgIFhMTygxOSxCT1RQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJidHIiLCAgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKLXsgImJ0bHJsIiwgICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0bHJsLSIsICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJ0bHJsKyIsICBYTE8oMTksQk9UUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiYnRybCIsICAgWExPKDE5LEJPVCwxNiwxKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJiZmxyIiwgICAgWExPKDE5LEJPRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZmxyLSIsICAgWExPKDE5LEJPRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmxyKyIsICAgWExPKDE5LEJPRlAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmJmciIsICAgIFhMTygxOSxCT0YsMTYsMCksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoteyAiYmZscmwiLCAgIFhMTygxOSxCT0YsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmZscmwtIiwgIFhMTygxOSxCT0YsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZscmwrIiwgIFhMTygxOSxCT0ZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJiZnJsIiwgICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKLXsgImJkbnp0bHIiLCBYTE8oMTksQk9ETlpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnp0bHItIixYTE8oMTksQk9ETlpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnp0bHIrIixYTE8oMTksQk9ETlpUUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56dGxybCIsWExPKDE5LEJPRE5aVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZG56dGxybC0iLFhMTygxOSxCT0ROWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuenRscmwrIixYTE8oMTksQk9ETlpUUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56ZmxyIiwgWExPKDE5LEJPRE5aRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZG56ZmxyLSIsWExPKDE5LEJPRE5aRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56ZmxyKyIsWExPKDE5LEJPRE5aRlAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuemZscmwiLFhMTygxOSxCT0ROWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuemZscmwtIixYTE8oMTksQk9ETlpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsKyIsWExPKDE5LEJPRE5aRlAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6dGxyIiwgIFhMTygxOSxCT0RaVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHp0bHItIiwgWExPKDE5LEJPRFpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkenRscisiLCBYTE8oMTksQk9EWlRQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkenRscmwiLCBYTE8oMTksQk9EWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6dGxybC0iLFhMTygxOSxCT0RaVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHp0bHJsKyIsWExPKDE5LEJPRFpUUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHpmbHIiLCAgWExPKDE5LEJPRFpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkemZsci0iLCBYTE8oMTksQk9EWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6ZmxyKyIsIFhMTygxOSxCT0RaRlAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6ZmxybCIsIFhMTygxOSxCT0RaRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHpmbHJsLSIsWExPKDE5LEJPRFpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkemZscmwrIixYTE8oMTksQk9EWkZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJjbHIiLCAgICBYTExLKDE5LDE2LDApLCBYTFlCQl9NQVNLLAlQUENDT00sCQl7IEJPLCBCSSB9IH0sCi17ICJiY2xybCIsICAgWExMSygxOSwxNiwxKSwgWExZQkJfTUFTSywJUFBDQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNscisiLCAgIFhMWUxLKDE5LDE2LDEsMCksIFhMWUJCX01BU0ssIFBQQywJCXsgQk9FLCBCSSB9IH0sCi17ICJiY2xybCsiLCAgWExZTEsoMTksMTYsMSwxKSwgWExZQkJfTUFTSywgUFBDLAkJeyBCT0UsIEJJIH0gfSwKLXsgImJjbHItIiwgICBYTFlMSygxOSwxNiwwLDApLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoteyAiYmNscmwtIiwgIFhMWUxLKDE5LDE2LDAsMSksIFhMWUJCX01BU0ssIFBQQywJCXsgQk9FLCBCSSB9IH0sCi17ICJiY3IiLCAgICAgWExMSygxOSwxNiwwKSwgWExCQl9NQVNLLAlQV1JDT00sCQl7IEJPLCBCSSB9IH0sCi17ICJiY3JsIiwgICAgWExMSygxOSwxNiwxKSwgWExCQl9NQVNLLAlQV1JDT00sCQl7IEJPLCBCSSB9IH0sCi0KLXsgImNybm90IiwgICBYTCgxOSwzMyksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBLCBCQkEgfSB9LAoteyAiY3Jub3IiLCAgIFhMKDE5LDMzKSwJWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAicmZpIiwgICAgIFhMKDE5LDUwKSwJMHhmZmZmZmZmZiwJQ09NLAkJeyAwIH0gfSwKLXsgInJmY2kiLCAgICBYTCgxOSw1MSksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCi0KLXsgInJmc3ZjIiwgICBYTCgxOSw4MiksCTB4ZmZmZmZmZmYsCVBPV0VSLAkJeyAwIH0gfSwKLQoteyAiY3JhbmRjIiwgIFhMKDE5LDEyOSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImlzeW5jIiwgICBYTCgxOSwxNTApLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAiaWNzIiwgICAgIFhMKDE5LDE1MCksIDB4ZmZmZmZmZmYsCVBXUkNPTSwJCXsgMCB9IH0sCi0KLXsgImNyY2xyIiwgICBYTCgxOSwxOTMpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQVQsIEJCQSB9IH0sCi17ICJjcnhvciIsICAgWEwoMTksMTkzKSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3JuYW5kIiwgIFhMKDE5LDIyNSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNyYW5kIiwgICBYTCgxOSwyNTcpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcnNldCIsICAgWEwoMTksMjg5KSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkFULCBCQkEgfSB9LAoteyAiY3JlcXYiLCAgIFhMKDE5LDI4OSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNyb3JjIiwgICBYTCgxOSw0MTcpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcm1vdmUiLCAgWEwoMTksNDQ5KSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkEsIEJCQSB9IH0sCi17ICJjcm9yIiwgICAgWEwoMTksNDQ5KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiYmN0ciIsICAgIFhMTygxOSxCT1UsNTI4LDApLCBYTEJPQklCQl9NQVNLLCBDT00sCXsgMCB9IH0sCi17ICJiY3RybCIsICAgWExPKDE5LEJPVSw1MjgsMSksIFhMQk9CSUJCX01BU0ssIENPTSwJeyAwIH0gfSwKLXsgImJsdGN0ciIsICBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmx0Y3RyLSIsIFhMT0NCKDE5LEJPVCxDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibHRjdHIrIiwgWExPQ0IoMTksQk9UUCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJsdGN0cmwiLCBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmx0Y3RybC0iLFhMT0NCKDE5LEJPVCxDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibHRjdHJsKyIsWExPQ0IoMTksQk9UUCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJndGN0ciIsICBYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmd0Y3RyLSIsIFhMT0NCKDE5LEJPVCxDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ3RjdHIrIiwgWExPQ0IoMTksQk9UUCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJndGN0cmwiLCBYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmd0Y3RybC0iLFhMT0NCKDE5LEJPVCxDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ3RjdHJsKyIsWExPQ0IoMTksQk9UUCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJlcWN0ciIsICBYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmVxY3RyLSIsIFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZXFjdHIrIiwgWExPQ0IoMTksQk9UUCxDQkVRLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJlcWN0cmwiLCBYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmVxY3RybC0iLFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZXFjdHJsKyIsWExPQ0IoMTksQk9UUCxDQkVRLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJzb2N0ciIsICBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnNvY3RyLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJic29jdHIrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJzb2N0cmwiLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnNvY3RybC0iLFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJic29jdHJsKyIsWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJ1bmN0ciIsICBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnVuY3RyLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidW5jdHIrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJ1bmN0cmwiLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnVuY3RybC0iLFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidW5jdHJsKyIsWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJnZWN0ciIsICBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmdlY3RyLSIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ2VjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJnZWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmdlY3RybC0iLFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ2VjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJubGN0ciIsICBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5sY3RyLSIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmxjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJubGN0cmwiLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5sY3RybC0iLFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmxjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJsZWN0ciIsICBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmxlY3RyLSIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibGVjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJsZWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmxlY3RybC0iLFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibGVjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuZ2N0ciIsICBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5nY3RyLSIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmdjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuZ2N0cmwiLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5nY3RybC0iLFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmdjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuZWN0ciIsICBYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5lY3RyLSIsIFhMT0NCKDE5LEJPRixDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmVjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkVRLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuZWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5lY3RybC0iLFhMT0NCKDE5LEJPRixDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmVjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkVRLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuc2N0ciIsICBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5zY3RyLSIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnNjdHIrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJuc2N0cmwiLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5zY3RybC0iLFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnNjdHJsKyIsWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJudWN0ciIsICBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm51Y3RyLSIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnVjdHIrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJudWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm51Y3RybC0iLFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnVjdHJsKyIsWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKLXsgImJ0Y3RyIiwgICBYTE8oMTksQk9ULDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYnRjdHItIiwgIFhMTygxOSxCT1QsNTI4LDApLCAgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGN0cisiLCAgWExPKDE5LEJPVFAsNTI4LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJ0Y3RybCIsICBYTE8oMTksQk9ULDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYnRjdHJsLSIsIFhMTygxOSxCT1QsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGN0cmwrIiwgWExPKDE5LEJPVFAsNTI4LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJmY3RyIiwgICBYTE8oMTksQk9GLDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmZjdHItIiwgIFhMTygxOSxCT0YsNTI4LDApLCAgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmN0cisiLCAgWExPKDE5LEJPRlAsNTI4LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJmY3RybCIsICBYTE8oMTksQk9GLDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmZjdHJsLSIsIFhMTygxOSxCT0YsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmN0cmwrIiwgWExPKDE5LEJPRlAsNTI4LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJjY3RyIiwgICBYTExLKDE5LDUyOCwwKSwgICAgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk8sIEJJIH0gfSwKLXsgImJjY3RyLSIsICBYTFlMSygxOSw1MjgsMCwwKSwgIFhMWUJCX01BU0ssICBQUEMsCXsgQk9FLCBCSSB9IH0sCi17ICJiY2N0cisiLCAgWExZTEsoMTksNTI4LDEsMCksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjdHJsIiwgIFhMTEsoMTksNTI4LDEpLCAgICAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCTywgQkkgfSB9LAoteyAiYmNjdHJsLSIsIFhMWUxLKDE5LDUyOCwwLDEpLCAgWExZQkJfTUFTSywgIFBQQywJeyBCT0UsIEJJIH0gfSwKLXsgImJjY3RybCsiLCBYTFlMSygxOSw1MjgsMSwxKSwgIFhMWUJCX01BU0ssICBQUEMsCXsgQk9FLCBCSSB9IH0sCi17ICJiY2MiLCAgICAgWExMSygxOSw1MjgsMCksICAgICBYTEJCX01BU0ssICAgUFdSQ09NLAl7IEJPLCBCSSB9IH0sCi17ICJiY2NsIiwgICAgWExMSygxOSw1MjgsMSksICAgICBYTEJCX01BU0ssICAgUFdSQ09NLAl7IEJPLCBCSSB9IH0sCi0KLXsgInJsd2ltaSIsICBNKDIwLDApLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJybGltaSIsICAgTSgyMCwwKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAotCi17ICJybHdpbWkuIiwgTSgyMCwxKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicmxpbWkuIiwgIE0oMjAsMSksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLQoteyAicm90bHdpIiwgIE1NRSgyMSwzMSwwKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgImNscmx3aSIsICBNTUUoMjEsMzEsMCksIE1TSE1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBNQiB9IH0sCi17ICJybHdpbm0iLCAgTSgyMSwwKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicmxpbm0iLCAgIE0oMjEsMCksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJvdGx3aS4iLCBNTUUoMjEsMzEsMSksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsUlMsU0ggfSB9LAoteyAiY2xybHdpLiIsIE1NRSgyMSwzMSwxKSwgTVNITUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIE1CIH0gfSwKLXsgInJsd2lubS4iLCBNKDIxLDEpLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJybGlubS4iLCAgTSgyMSwxKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAotCi17ICJybG1pIiwgICAgTSgyMiwwKSwJTV9NQVNLLAkJTTYwMSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLXsgInJsbWkuIiwgICBNKDIyLDEpLAlNX01BU0ssCQlNNjAxLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAotCi17ICJyb3RsdyIsICAgTU1FKDIzLDMxLDApLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAicmx3bm0iLCAgIE0oMjMsMCksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLXsgInJsbm0iLCAgICBNKDIzLDApLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJyb3Rsdy4iLCAgTU1FKDIzLDMxLDEpLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAicmx3bm0uIiwgIE0oMjMsMSksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLXsgInJsbm0uIiwgICBNKDIzLDEpLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi0KLXsgIm5vcCIsICAgICBPUCgyNCksCTB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCi17ICJvcmkiLCAgICAgT1AoMjQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAib3JpbCIsICAgIE9QKDI0KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAib3JpcyIsICAgIE9QKDI1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgIm9yaXUiLCAgICBPUCgyNSksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgInhvcmkiLCAgICBPUCgyNiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJ4b3JpbCIsICAgT1AoMjYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJ4b3JpcyIsICAgT1AoMjcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAieG9yaXUiLCAgIE9QKDI3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAiYW5kaS4iLCAgIE9QKDI4KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgImFuZGlsLiIsICBPUCgyOCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgImFuZGlzLiIsICBPUCgyOSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJhbmRpdS4iLCAgT1AoMjkpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJyb3RsZGkiLCAgTUQoMzAsMCwwKSwgTURNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAoteyAiY2xybGRpIiwgIE1EKDMwLDAsMCksIE1EU0hfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgTUI2IH0gfSwKLXsgInJsZGljbCIsICBNRCgzMCwwLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi17ICJyb3RsZGkuIiwgTUQoMzAsMCwxKSwgTURNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAoteyAiY2xybGRpLiIsIE1EKDMwLDAsMSksIE1EU0hfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgTUI2IH0gfSwKLXsgInJsZGljbC4iLCBNRCgzMCwwLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi0KLXsgInJsZGljciIsICBNRCgzMCwxLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1FNiB9IH0sCi17ICJybGRpY3IuIiwgTUQoMzAsMSwxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNRTYgfSB9LAotCi17ICJybGRpYyIsICAgTUQoMzAsMiwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAoteyAicmxkaWMuIiwgIE1EKDMwLDIsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLQoteyAicmxkaW1pIiwgIE1EKDMwLDMsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLXsgInJsZGltaS4iLCBNRCgzMCwzLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi0KLXsgInJvdGxkIiwgICBNRFMoMzAsOCwwKSwgTURTTUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAicmxkY2wiLCAgIE1EUygzMCw4LDApLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1CNiB9IH0sCi17ICJyb3RsZC4iLCAgTURTKDMwLDgsMSksIE1EU01CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsZGNsLiIsICBNRFMoMzAsOCwxKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNQjYgfSB9LAotCi17ICJybGRjciIsICAgTURTKDMwLDksMCksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUU2IH0gfSwKLXsgInJsZGNyLiIsICBNRFMoMzAsOSwxKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNRTYgfSB9LAotCi17ICJjbXB3IiwgICAgWENNUEwoMzEsMCwwKSwgWENNUExfTUFTSywgUFBDQ09NLAkJeyBPQkYsIFJBLCBSQiB9IH0sCi17ICJjbXBkIiwgICAgWENNUEwoMzEsMCwxKSwgWENNUExfTUFTSywgUFBDNjQsCQl7IE9CRiwgUkEsIFJCIH0gfSwKLXsgImNtcCIsICAgICBYKDMxLDApLAlYQ01QX01BU0ssCVBQQ09OTFksCXsgQkYsIEwsIFJBLCBSQiB9IH0sCi17ICJjbXAiLCAgICAgWCgzMSwwKSwJWENNUExfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFJCIH0gfSwKLQoteyAidHdsZ3QiLCAgIFhUTygzMSw0LFRPTEdUKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsZ3QiLCAgICBYVE8oMzEsNCxUT0xHVCksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xsdCIsICAgWFRPKDMxLDQsVE9MTFQpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxsdCIsICAgIFhUTygzMSw0LFRPTExUKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3ZXEiLCAgICBYVE8oMzEsNCxUT0VRKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRlcSIsICAgICBYVE8oMzEsNCxUT0VRKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bGdlIiwgICBYVE8oMzEsNCxUT0xHRSksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGdlIiwgICAgWFRPKDMxLDQsVE9MR0UpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbmwiLCAgIFhUTygzMSw0LFRPTE5MKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbmwiLCAgICBYVE8oMzEsNCxUT0xOTCksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xsZSIsICAgWFRPKDMxLDQsVE9MTEUpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxsZSIsICAgIFhUTygzMSw0LFRPTExFKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bG5nIiwgICBYVE8oMzEsNCxUT0xORyksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bG5nIiwgICAgWFRPKDMxLDQsVE9MTkcpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdndCIsICAgIFhUTygzMSw0LFRPR1QpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGd0IiwgICAgIFhUTygzMSw0LFRPR1QpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdnZSIsICAgIFhUTygzMSw0LFRPR0UpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGdlIiwgICAgIFhUTygzMSw0LFRPR0UpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdubCIsICAgIFhUTygzMSw0LFRPTkwpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidG5sIiwgICAgIFhUTygzMSw0LFRPTkwpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsdCIsICAgIFhUTygzMSw0LFRPTFQpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGx0IiwgICAgIFhUTygzMSw0LFRPTFQpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsZSIsICAgIFhUTygzMSw0LFRPTEUpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxlIiwgICAgIFhUTygzMSw0LFRPTEUpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHduZyIsICAgIFhUTygzMSw0LFRPTkcpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidG5nIiwgICAgIFhUTygzMSw0LFRPTkcpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHduZSIsICAgIFhUTygzMSw0LFRPTkUpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidG5lIiwgICAgIFhUTygzMSw0LFRPTkUpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHJhcCIsICAgIFhUTygzMSw0LFRPVSksIDB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCi17ICJ0dyIsICAgICAgWCgzMSw0KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBUTywgUkEsIFJCIH0gfSwKLXsgInQiLCAgICAgICBYKDMxLDQpLAlYX01BU0ssCQlQV1JDT00sCQl7IFRPLCBSQSwgUkIgfSB9LAotCi17ICJzdWJmYyIsICAgWE8oMzEsOCwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2YiLCAgICAgIFhPKDMxLDgsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YmMiLCAgICBYTygzMSw4LDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmYy4iLCAgWE8oMzEsOCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2YuIiwgICAgIFhPKDMxLDgsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YmMuIiwgICBYTygzMSw4LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmY28iLCAgWE8oMzEsOCwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2ZvIiwgICAgIFhPKDMxLDgsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YmNvIiwgICBYTygzMSw4LDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmY28uIiwgWE8oMzEsOCwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2ZvLiIsICAgIFhPKDMxLDgsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YmNvLiIsICBYTygzMSw4LDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi0KLXsgIm11bGhkdSIsICBYTygzMSw5LDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGhkdS4iLCBYTygzMSw5LDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiYWRkYyIsICAgIFhPKDMxLDEwLDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhIiwgICAgICAgWE8oMzEsMTAsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGMuIiwgICBYTygzMSwxMCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYS4iLCAgICAgIFhPKDMxLDEwLDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRjbyIsICAgWE8oMzEsMTAsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFvIiwgICAgICBYTygzMSwxMCwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkY28uIiwgIFhPKDMxLDEwLDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhby4iLCAgICAgWE8oMzEsMTAsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXVsaHd1IiwgIFhPKDMxLDExLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxod3UuIiwgWE8oMzEsMTEsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibWZjciIsICAgIFgoMzEsMTkpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJUIH0gfSwKLQoteyAibHdhcngiLCAgIFgoMzEsMjApLAlYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsZHgiLCAgICAgWCgzMSwyMSksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibHd6eCIsICAgIFgoMzEsMjMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibHgiLCAgICAgIFgoMzEsMjMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzbHciLCAgICAgWFJDKDMxLDI0LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbCIsICAgICAgWFJDKDMxLDI0LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbHcuIiwgICAgWFJDKDMxLDI0LDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbC4iLCAgICAgWFJDKDMxLDI0LDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImNudGx6dyIsICBYUkMoMzEsMjYsMCksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJjbnRseiIsICAgWFJDKDMxLDI2LDApLCBYUkJfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHp3LiIsIFhSQygzMSwyNiwxKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImNudGx6LiIsICBYUkMoMzEsMjYsMSksIFhSQl9NQVNLLCAJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAotCi17ICJzbGQiLCAgICAgWFJDKDMxLDI3LDApLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsZC4iLCAgICBYUkMoMzEsMjcsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJhbmQiLCAgICAgWFJDKDMxLDI4LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJhbmQuIiwgICAgWFJDKDMxLDI4LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIm1hc2tnIiwgICBYUkMoMzEsMjksMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJtYXNrZy4iLCAgWFJDKDMxLDI5LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJjbXBsdyIsICAgWENNUEwoMzEsMzIsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJeyBPQkYsIFJBLCBSQiB9IH0sCi17ICJjbXBsZCIsICAgWENNUEwoMzEsMzIsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCi17ICJjbXBsIiwgICAgWCgzMSwzMiksCVhDTVBfTUFTSywJIFBQQ09OTFksCXsgQkYsIEwsIFJBLCBSQiB9IH0sCi17ICJjbXBsIiwgICAgWCgzMSwzMiksCVhDTVBMX01BU0ssCSBQV1JDT00sCXsgQkYsIFJBLCBSQiB9IH0sCi0KLXsgInN1YmYiLCAgICBYTygzMSw0MCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViIiwgICAgIFhPKDMxLDQwLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmLiIsICAgWE8oMzEsNDAsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1Yi4iLCAgICBYTygzMSw0MCwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZm8iLCAgIFhPKDMxLDQwLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJvIiwgICAgWE8oMzEsNDAsMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZvLiIsICBYTygzMSw0MCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3Viby4iLCAgIFhPKDMxLDQwLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi0KLXsgImxkdXgiLCAgICBYKDMxLDUzKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAiZGNic3QiLCAgIFgoMzEsNTQpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJsd3p1eCIsICAgWCgzMSw1NSksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAoteyAibHV4IiwgICAgIFgoMzEsNTUpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJjbnRsemQiLCAgWFJDKDMxLDU4LDApLCBYUkJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUyB9IH0sCi17ICJjbnRsemQuIiwgWFJDKDMxLDU4LDEpLCBYUkJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUyB9IH0sCi0KLXsgImFuZGMiLCAgICBYUkMoMzEsNjAsMCksIFhfTUFTSywJQ09NLAl7IFJBLCBSUywgUkIgfSB9LAoteyAiYW5kYy4iLCAgIFhSQygzMSw2MCwxKSwgWF9NQVNLLAlDT00sCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInRkbGd0IiwgICBYVE8oMzEsNjgsVE9MR1QpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxsdCIsICAgWFRPKDMxLDY4LFRPTExUKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRlcSIsICAgIFhUTygzMSw2OCxUT0VRKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGdlIiwgICBYVE8oMzEsNjgsVE9MR0UpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxubCIsICAgWFRPKDMxLDY4LFRPTE5MKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbGUiLCAgIFhUTygzMSw2OCxUT0xMRSksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbG5nIiwgICBYVE8oMzEsNjgsVE9MTkcpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGd0IiwgICAgWFRPKDMxLDY4LFRPR1QpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRnZSIsICAgIFhUTygzMSw2OCxUT0dFKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbmwiLCAgICBYVE8oMzEsNjgsVE9OTCksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGx0IiwgICAgWFRPKDMxLDY4LFRPTFQpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsZSIsICAgIFhUTygzMSw2OCxUT0xFKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbmciLCAgICBYVE8oMzEsNjgsVE9ORyksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZG5lIiwgICAgWFRPKDMxLDY4LFRPTkUpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGQiLAkgICAgIFgoMzEsNjgpLAlYX01BU0ssCQkgUFBDNjQsCQl7IFRPLCBSQSwgUkIgfSB9LAotCi17ICJtdWxoZCIsICAgWE8oMzEsNzMsMCwwKSwgWE9fTUFTSywJIFBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGhkLiIsICBYTygzMSw3MywwLDEpLCBYT19NQVNLLAkgUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtdWxodyIsICAgWE8oMzEsNzUsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGh3LiIsICBYTygzMSw3NSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtZm1zciIsICAgWCgzMSw4MyksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlQgfSB9LAotCi17ICJsZGFyeCIsICAgWCgzMSw4NCksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGNiZiIsICAgIFgoMzEsODYpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJsYnp4IiwgICAgWCgzMSw4NyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm5lZyIsICAgICBYTygzMSwxMDQsMCwwKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCi17ICJuZWcuIiwgICAgWE8oMzEsMTA0LDAsMSksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAibmVnbyIsICAgIFhPKDMxLDEwNCwxLDApLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5lZ28uIiwgICBYTygzMSwxMDQsMSwxKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCi0KLXsgIm11bCIsICAgICBYTygzMSwxMDcsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWwuIiwgICAgWE8oMzEsMTA3LDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbyIsICAgIFhPKDMxLDEwNywxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bG8uIiwgICBYTygzMSwxMDcsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImNsZiIsICAgICBYKDMxLDExOCksIFhSQl9NQVNLLAlQT1dFUiwJCXsgUlQsIFJBIH0gfSwKLQoteyAibGJ6dXgiLCAgIFgoMzEsMTE5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgIm5vdCIsICAgICBYUkMoMzEsMTI0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQlMgfSB9LAoteyAibm9yIiwgICAgIFhSQygzMSwxMjQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm5vdC4iLCAgICBYUkMoMzEsMTI0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQlMgfSB9LAoteyAibm9yLiIsICAgIFhSQygzMSwxMjQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAid3J0ZWUiLCAgIFgoMzEsMTMxKSwJWFJBUkJfTUFTSywJUFBDNDAzLAkJeyBSUyB9IH0sCi0KLXsgInN1YmZlIiwgICBYTygzMSwxMzYsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmZSIsICAgICBYTygzMSwxMzYsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YmZlLiIsICBYTygzMSwxMzYsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmZS4iLCAgICBYTygzMSwxMzYsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YmZlbyIsICBYTygzMSwxMzYsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmZW8iLCAgICBYTygzMSwxMzYsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YmZlby4iLCBYTygzMSwxMzYsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmZW8uIiwgICBYTygzMSwxMzYsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiYWRkZSIsICAgIFhPKDMxLDEzOCwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWUiLCAgICAgIFhPKDMxLDEzOCwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkZS4iLCAgIFhPKDMxLDEzOCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWUuIiwgICAgIFhPKDMxLDEzOCwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkZW8iLCAgIFhPKDMxLDEzOCwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWVvIiwgICAgIFhPKDMxLDEzOCwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkZW8uIiwgIFhPKDMxLDEzOCwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWVvLiIsICAgIFhPKDMxLDEzOCwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtdGNyIiwgICAgWEZYTSgzMSwxNDQsMHhmZiksIFhGWEZYTV9NQVNLfEZYTV9NQVNLLCBDT00sCXsgUlMgfX0sCi17ICJtdGNyZiIsICAgWCgzMSwxNDQpLAlYRlhGWE1fTUFTSywJQ09NLAkJeyBGWE0sIFJTIH0gfSwKLQoteyAibXRtc3IiLCAgIFgoMzEsMTQ2KSwJWFJBUkJfTUFTSywJQ09NLAkJeyBSUyB9IH0sCi0KLXsgInN0ZHgiLCAgICBYKDMxLDE0OSksIFhfTUFTSywJCVBQQzY0LAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3R3Y3guIiwgIFhSQygzMSwxNTAsMSksIFhfTUFTSywJUFBDLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3R3eCIsICAgIFgoMzEsMTUxKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLXsgInN0eCIsICAgICBYKDMxLDE1MSksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNscSIsICAgICBYUkMoMzEsMTUyLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xxLiIsICAgIFhSQygzMSwxNTIsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNsZSIsICAgICBYUkMoMzEsMTUzLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xlLiIsICAgIFhSQygzMSwxNTMsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIndydGVlaSIsICBYKDMxLDE2MyksCVhFX01BU0ssCVBQQzQwMywJCXsgRSB9IH0sCi0KLXsgInN0ZHV4IiwgICBYKDMxLDE4MSksCVhfTUFTSywJCVBQQzY0LAkJeyBSUywgUkFTLCBSQiB9IH0sCi0KLXsgInN0d3V4IiwgICBYKDMxLDE4MyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBUywgUkIgfSB9LAoteyAic3R1eCIsICAgIFgoMzEsMTgzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic2xpcSIsICAgIFhSQygzMSwxODQsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzbGlxLiIsICAgWFJDKDMxLDE4NCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAic3ViZnplIiwgIFhPKDMxLDIwMCwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmemUiLCAgICBYTygzMSwyMDAsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmemUuIiwgWE8oMzEsMjAwLDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2Z6ZS4iLCAgIFhPKDMxLDIwMCwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZ6ZW8iLCBYTygzMSwyMDAsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplbyIsICAgWE8oMzEsMjAwLDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZnplby4iLFhPKDMxLDIwMCwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmemVvLiIsICBYTygzMSwyMDAsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi0KLXsgImFkZHplIiwgICBYTygzMSwyMDIsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhemUiLCAgICAgWE8oMzEsMjAyLDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkemUuIiwgIFhPKDMxLDIwMiwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImF6ZS4iLCAgICBYTygzMSwyMDIsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGR6ZW8iLCAgWE8oMzEsMjAyLDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplbyIsICAgIFhPKDMxLDIwMiwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZHplby4iLCBYTygzMSwyMDIsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhemVvLiIsICAgWE8oMzEsMjAyLDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdHNyIiwgICAgWCgzMSwyMTApLAlYUkJfTUFTS3woMTw8MjApLCBDT00zMiwJeyBTUiwgUlMgfSB9LAotCi17ICJzdGRjeC4iLCAgWFJDKDMxLDIxNCwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0YngiLCAgICBYKDMxLDIxNSksCVhfTUFTSywJCUNPTSwJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic2xscSIsICAgIFhSQygzMSwyMTYsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbGxxLiIsICAgWFJDKDMxLDIxNiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic2xlcSIsICAgIFhSQygzMSwyMTcsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbGVxLiIsICAgWFJDKDMxLDIxNywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3ViZm1lIiwgIFhPKDMxLDIzMiwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmbWUiLCAgICBYTygzMSwyMzIsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmbWUuIiwgWE8oMzEsMjMyLDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2ZtZS4iLCAgIFhPKDMxLDIzMiwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZtZW8iLCBYTygzMSwyMzIsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lbyIsICAgWE8oMzEsMjMyLDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZm1lby4iLFhPKDMxLDIzMiwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmbWVvLiIsICBYTygzMSwyMzIsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi0KLXsgIm11bGxkIiwgICBYTygzMSwyMzMsMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbGQuIiwgIFhPKDMxLDIzMywwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsZG8iLCAgWE8oMzEsMjMzLDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGxkby4iLCBYTygzMSwyMzMsMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJhZGRtZSIsICAgWE8oMzEsMjM0LDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYW1lIiwgICAgIFhPKDMxLDIzNCwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZG1lLiIsICBYTygzMSwyMzQsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhbWUuIiwgICAgWE8oMzEsMjM0LDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkbWVvIiwgIFhPKDMxLDIzNCwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZW8iLCAgICBYTygzMSwyMzQsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGRtZW8uIiwgWE8oMzEsMjM0LDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYW1lby4iLCAgIFhPKDMxLDIzNCwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibXVsbHciLCAgIFhPKDMxLDIzNSwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVscyIsICAgIFhPKDMxLDIzNSwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbHcuIiwgIFhPKDMxLDIzNSwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVscy4iLCAgIFhPKDMxLDIzNSwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbHdvIiwgIFhPKDMxLDIzNSwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsc28iLCAgIFhPKDMxLDIzNSwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbHdvLiIsIFhPKDMxLDIzNSwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsc28uIiwgIFhPKDMxLDIzNSwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtdHNyaW4iLCAgWCgzMSwyNDIpLAlYUkFfTUFTSywJUFBDMzIsCQl7IFJTLCBSQiB9IH0sCi17ICJtdHNyaSIsICAgWCgzMSwyNDIpLAlYUkFfTUFTSywJUE9XRVIzMiwJeyBSUywgUkIgfSB9LAotCi17ICJkY2J0c3QiLCAgWCgzMSwyNDYpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJzdGJ1eCIsICAgWCgzMSwyNDcpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKLQoteyAic2xsaXEiLCAgIFhSQygzMSwyNDgsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzbGxpcS4iLCAgWFJDKDMxLDI0OCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAiZG96IiwgICAgIFhPKDMxLDI2NCwwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRvei4iLCAgICBYTygzMSwyNjQsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkb3pvIiwgICAgWE8oMzEsMjY0LDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZG96by4iLCAgIFhPKDMxLDI2NCwxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiYWRkIiwgICAgIFhPKDMxLDI2NiwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiY2F4IiwgICAgIFhPKDMxLDI2NiwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkLiIsICAgIFhPKDMxLDI2NiwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiY2F4LiIsICAgIFhPKDMxLDI2NiwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkbyIsICAgIFhPKDMxLDI2NiwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiY2F4byIsICAgIFhPKDMxLDI2NiwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkby4iLCAgIFhPKDMxLDI2NiwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiY2F4by4iLCAgIFhPKDMxLDI2NiwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsc2NieCIsICAgWFJDKDMxLDI3NywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImxzY2J4LiIsICBYUkMoMzEsMjc3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkY2J0IiwgICAgWCgzMSwyNzgpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJsaHp4IiwgICAgWCgzMSwyNzkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJpY2J0IiwgICAgWCgzMSwyNjIpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJlcXYiLCAgICAgWFJDKDMxLDI4NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAiZXF2LiIsICAgIFhSQygzMSwyODQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAidGxiaWUiLCAgIFgoMzEsMzA2KSwJWFJUUkFfTUFTSywJUFBDLAkJeyBSQiB9IH0sCi17ICJ0bGJpIiwgICAgWCgzMSwzMDYpLAlYUlRfTUFTSywJUE9XRVIsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImVjaXd4IiwgICBYKDMxLDMxMCksIFhfTUFTSywJCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxoenV4IiwgICBYKDMxLDMxMSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJ4b3IiLCAgICAgWFJDKDMxLDMxNiwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAieG9yLiIsICAgIFhSQygzMSwzMTYsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAibWZleGlzciIsIFhTUFIoMzEsMzIzLDY0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZleGllciIsIFhTUFIoMzEsMzIzLDY2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjAiLCAgIFhTUFIoMzEsMzIzLDEyOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIxIiwgICBYU1BSKDMxLDMyMywxMjkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyMiIsICAgWFNQUigzMSwzMjMsMTMwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjMiLCAgIFhTUFIoMzEsMzIzLDEzMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnI0IiwgICBYU1BSKDMxLDMyMywxMzIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNSIsICAgWFNQUigzMSwzMjMsMTMzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjYiLCAgIFhTUFIoMzEsMzIzLDEzNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnI3IiwgICBYU1BSKDMxLDMyMywxMzUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJlYXIiLCAgWFNQUigzMSwzMjMsMTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZiZXNyIiwgIFhTUFIoMzEsMzIzLDE0NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maW9jciIsICBYU1BSKDMxLDMyMywxNjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNyMCIsIFhTUFIoMzEsMzIzLDE5MiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3QwIiwgWFNQUigzMSwzMjMsMTkzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFkYTAiLCBYU1BSKDMxLDMyMywxOTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNhMCIsIFhTUFIoMzEsMzIzLDE5NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY2MwIiwgWFNQUigzMSwzMjMsMTk2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjEiLCBYU1BSKDMxLDMyMywyMDApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MSIsIFhTUFIoMzEsMzIzLDIwMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGExIiwgWFNQUigzMSwzMjMsMjAyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTEiLCBYU1BSKDMxLDMyMywyMDMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMSIsIFhTUFIoMzEsMzIzLDIwNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3IyIiwgWFNQUigzMSwzMjMsMjA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjdDIiLCBYU1BSKDMxLDMyMywyMDkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWRhMiIsIFhTUFIoMzEsMzIzLDIxMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc2EyIiwgWFNQUigzMSwzMjMsMjExKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjYzIiLCBYU1BSKDMxLDMyMywyMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNyMyIsIFhTUFIoMzEsMzIzLDIxNiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3QzIiwgWFNQUigzMSwzMjMsMjE3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFkYTMiLCBYU1BSKDMxLDMyMywyMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNhMyIsIFhTUFIoMzEsMzIzLDIxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY2MzIiwgWFNQUigzMSwzMjMsMjIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzciIsIFhTUFIoMzEsMzIzLDIyNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGNyIiwgICBYKDMxLDMyMyksCVhfTUFTSywJCVBQQywJCXsgUlQsIFNQUiB9IH0sCi0KLXsgImRpdiIsICAgICBYTygzMSwzMzEsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXYuIiwgICAgWE8oMzEsMzMxLDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2byIsICAgIFhPKDMxLDMzMSwxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdm8uIiwgICBYTygzMSwzMzEsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mbXEiLCAgICAgWFNQUigzMSwzMzksMCksICAgWFNQUl9NQVNLLCBNNjAxLAl7IFJUIH0gfSwKLXsgIm1meGVyIiwgICAgWFNQUigzMSwzMzksMSksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mcnRjdSIsICAgWFNQUigzMSwzMzksNCksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mcnRjbCIsICAgWFNQUigzMSwzMzksNSksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mZGVjIiwgICAgWFNQUigzMSwzMzksNiksICAgWFNQUl9NQVNLLCBNRkRFQzEsCXsgUlQgfSB9LAoteyAibWZsciIsICAgICBYU1BSKDMxLDMzOSw4KSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZjdHIiLCAgICBYU1BSKDMxLDMzOSw5KSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZ0aWQiLCAgICBYU1BSKDMxLDMzOSwxNyksICBYU1BSX01BU0ssIFBPV0VSLAl7IFJUIH0gfSwKLXsgIm1mZHNpc3IiLCAgWFNQUigzMSwzMzksMTgpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mZGFyIiwgICAgWFNQUigzMSwzMzksMTkpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mZGVjIiwgICAgWFNQUigzMSwzMzksMjIpLCAgWFNQUl9NQVNLLCBNRkRFQzIsCXsgUlQgfSB9LAoteyAibWZzZHIwIiwgICBYU1BSKDMxLDMzOSwyNCksICBYU1BSX01BU0ssIFBPV0VSLAl7IFJUIH0gfSwKLXsgIm1mc2RyMSIsICAgWFNQUigzMSwzMzksMjUpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mc3JyMCIsICAgWFNQUigzMSwzMzksMjYpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mc3JyMSIsICAgWFNQUigzMSwzMzksMjcpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mY21wYSIsICAgWFNQUigzMSwzMzksMTQ0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBiIiwgICBYU1BSKDMxLDMzOSwxNDUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGMiLCAgIFhTUFIoMzEsMzM5LDE0NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wZCIsICAgWFNQUigzMSwzMzksMTQ3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZpY3IiLCAgICBYU1BSKDMxLDMzOSwxNDgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRlciIsICAgIFhTUFIoMzEsMzM5LDE0OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY291bnRhIiwgWFNQUigzMSwzMzksMTUwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjb3VudGIiLCBYU1BSKDMxLDMzOSwxNTEpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGUiLCAgIFhTUFIoMzEsMzM5LDE1MiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wZiIsICAgWFNQUigzMSwzMzksMTUzKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBnIiwgICBYU1BSKDMxLDMzOSwxNTQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGgiLCAgIFhTUFIoMzEsMzM5LDE1NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbGN0cmwxIiwgWFNQUigzMSwzMzksMTU2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZsY3RybDIiLCBYU1BSKDMxLDMzOSwxNTcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmljdHJsIiwgIFhTUFIoMzEsMzM5LDE1OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mYmFyIiwgICAgWFNQUigzMSwzMzksMTU5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZzcHJnIiwgICBYU1BSKDMxLDMzOSwyNzIpLCBYU1BSR19NQVNLLCBQUEMsCXsgUlQsIFNQUkcgfSB9LAoteyAibWZzcHJnMCIsICBYU1BSKDMxLDMzOSwyNzIpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZzcHJnMSIsICBYU1BSKDMxLDMzOSwyNzMpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZzcHJnMiIsICBYU1BSKDMxLDMzOSwyNzQpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZzcHJnMyIsICBYU1BSKDMxLDMzOSwyNzUpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZhc3IiLCAgICBYU1BSKDMxLDMzOSwyODApLCBYU1BSX01BU0ssIFBQQzY0LAl7IFJUIH0gfSwKLXsgIm1mZWFyIiwgICAgWFNQUigzMSwzMzksMjgyKSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mcHZyIiwgICAgWFNQUigzMSwzMzksMjg3KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1maWJhdHUiLCAgWFNQUigzMSwzMzksNTI4KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCi17ICJtZmliYXRsIiwgIFhTUFIoMzEsMzM5LDUyOSksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZkYmF0dSIsICBYU1BSKDMxLDMzOSw1MzYpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKLXsgIm1mZGJhdGwiLCAgWFNQUigzMSwzMzksNTM3KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCi17ICJtZmljX2NzdCIsIFhTUFIoMzEsMzM5LDU2MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWNfYWRyIiwgWFNQUigzMSwzMzksNTYxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZpY19kYXQiLCBYU1BSKDMxLDMzOSw1NjIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRjX2NzdCIsIFhTUFIoMzEsMzM5LDU2OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGNfYWRyIiwgWFNQUigzMSwzMzksNTY5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkY19kYXQiLCBYU1BSKDMxLDMzOSw1NzApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRwZHIiLCAgIFhTUFIoMzEsMzM5LDYzMCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZHBpciIsICAgWFNQUigzMSwzMzksNjMxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZpbW1yIiwgICBYU1BSKDMxLDMzOSw2MzgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2N0ciIsIFhTUFIoMzEsMzM5LDc4NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfYXAiLCAgWFNQUigzMSwzMzksNzg2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9lcG4iLCBYU1BSKDMxLDMzOSw3ODcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX3R3YyIsIFhTUFIoMzEsMzM5LDc4OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfcnBuIiwgWFNQUigzMSwzMzksNzkwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9jdHIiLCBYU1BSKDMxLDMzOSw3OTIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1fY2FzaWQiLFhTUFIoMzEsMzM5LDc5MyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfYXAiLCAgWFNQUigzMSwzMzksNzk0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9lcG4iLCBYU1BSKDMxLDMzOSw3OTUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX3R3YiIsIFhTUFIoMzEsMzM5LDc5NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfdHdjIiwgWFNQUigzMSwzMzksNzk3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9ycG4iLCBYU1BSKDMxLDMzOSw3OTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1fdHciLCAgIFhTUFIoMzEsMzM5LDc5OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfZGJjYW0iLFhTUFIoMzEsMzM5LDgxNiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfZGJyYW0wIixYU1BSKDMxLDMzOSw4MTcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2RicmFtMSIsWFNQUigzMSwzMzksODE4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9kYmNhbSIsIFhTUFIoMzEsMzM5LDgyNCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZGJyYW0wIixYU1BSKDMxLDMzOSw4MjUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2RicmFtMSIsWFNQUigzMSwzMzksODI2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZ6cHIiLCAgIFhTUFIoMzEsMzM5LDk0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGlkIiwgICBYU1BSKDMxLDMzOSw5NDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmljZGJkciIsWFNQUigzMSwzMzksOTc5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZ1bW1jcjAiLAlYU1BSKDMxLDMzOSw5MzYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jMSIsCVhTUFIoMzEsMzM5LDkzNyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVwbWMyIiwJWFNQUigzMSwzMzksOTM4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXNpYSIsCVhTUFIoMzEsMzM5LDkzOSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVtbWNyMSIsCVhTUFIoMzEsMzM5LDk0MCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVwbWMzIiwJWFNQUigzMSwzMzksOTQxKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXBtYzQiLAlYU1BSKDMxLDMzOSw5NDIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZtbWNyMCIsCVhTUFIoMzEsMzM5LDk1MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnBtYzEiLAlYU1BSKDMxLDMzOSw5NTMpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZwbWMyIiwJWFNQUigzMSwzMzksOTU0KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mc2lhIiwJWFNQUigzMSwzMzksOTU1KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mbW1jcjEiLAlYU1BSKDMxLDMzOSw5NTYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZwbWMzIiwJWFNQUigzMSwzMzksOTU3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jNCIsCVhTUFIoMzEsMzM5LDk1OCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZmVzciIsICAgWFNQUigzMSwzMzksOTgwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkZWFyIiwgIFhTUFIoMzEsMzM5LDk4MSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZXZwciIsICBYU1BSKDMxLDMzOSw5ODIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmNkYmNyIiwgWFNQUigzMSwzMzksOTgzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZ0c3IiLCAgIFhTUFIoMzEsMzM5LDk4NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdGNyIiwgICBYU1BSKDMxLDMzOSw5ODYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBpdCIsICAgWFNQUigzMSwzMzksOTg3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZ0YmhpIiwgIFhTUFIoMzEsMzM5LDk4OCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdGJsbyIsICBYU1BSKDMxLDMzOSw5ODkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnNycjIiLCAgWFNQUigzMSwzMzksOTkwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZzcnIzIiwgIFhTUFIoMzEsMzM5LDk5MSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGJzciIsICBYU1BSKDMxLDMzOSwxMDA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpYWMxIiwgIFhTUFIoMzEsMzM5LDEwMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmlhYzIiLCAgWFNQUigzMSwzMzksMTAxMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGFjMSIsICBYU1BSKDMxLDMzOSwxMDE0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkYWMyIiwgIFhTUFIoMzEsMzM5LDEwMTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRjY3IiLCAgWFNQUigzMSwzMzksMTAxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maWNjciIsICBYU1BSKDMxLDMzOSwxMDE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwYmwxIiwgIFhTUFIoMzEsMzM5LDEwMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBidTEiLCAgWFNQUigzMSwzMzksMTAyMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJsMiIsICBYU1BSKDMxLDMzOSwxMDIyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwYnUyIiwgIFhTUFIoMzEsMzM5LDEwMjMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmwyY3IiLAlYU1BSKDMxLDMzOSwxMDE3KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZpY3RjIiwJWFNQUigzMSwzMzksMTAxOSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdGhybTEiLAlYU1BSKDMxLDMzOSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ0aHJtMiIsCVhTUFIoMzEsMzM5LDEwMjEpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnRocm0zIiwJWFNQUigzMSwzMzksMTAyMiksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mc3ByIiwgICBYKDMxLDMzOSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFNQUiB9IH0sCi0KLXsgImx3YXgiLCAgICBYKDMxLDM0MSksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibGhheCIsICAgIFgoMzEsMzQzKSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGNjY2kiLCAgIFgoMzEsNDU0KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAiYWJzIiwgICAgIFhPKDMxLDM2MCwwLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJhYnMuIiwgICAgWE8oMzEsMzYwLDAsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgImFic28iLCAgICBYTygzMSwzNjAsMSwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAiYWJzby4iLCAgIFhPKDMxLDM2MCwxLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi0KLXsgImRpdnMiLCAgICBYTygzMSwzNjMsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZzLiIsICAgWE8oMzEsMzYzLDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2c28iLCAgIFhPKDMxLDM2MywxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnNvLiIsICBYTygzMSwzNjMsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInRsYmlhIiwgICBYKDMxLDM3MCksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCi0KLXsgIm1mdGJ1IiwgICBYU1BSKDMxLDM3MSwyNjkpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZ0YiIsICAgIFgoMzEsMzcxKSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgVEJSIH0gfSwKLQoteyAibHdhdXgiLCAgIFgoMzEsMzczKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAibGhhdXgiLCAgIFgoMzEsMzc1KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgInN0aHgiLCAgICBYKDMxLDQwNyksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgImxmcXgiLCAgICBYKDMxLDc5MSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJULCBSQSwgUkIgfSB9LAotCi17ICJsZnF1eCIsICAgWCgzMSw4MjMpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAic3RmcXgiLCAgIFgoMzEsOTE5KSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0ZnF1eCIsICBYKDMxLDk1MSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJvcmMiLCAgICAgWFJDKDMxLDQxMiwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAib3JjLiIsICAgIFhSQygzMSw0MTIsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JhZGkiLCAgIFhTKDMxLDQxMywwKSwgWFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLXsgInNyYWRpLiIsICBYUygzMSw0MTMsMSksIFhTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCi0KLXsgInNsYmllIiwgICBYKDMxLDQzNCksCVhSVFJBX01BU0ssCVBQQzY0LAkJeyBSQiB9IH0sCi0KLXsgImVjb3d4IiwgICBYKDMxLDQzOCksCVhfTUFTSywJCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInN0aHV4IiwgICBYKDMxLDQzOSksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBUywgUkIgfSB9LAotCi17ICJtciIsCSAgICAgWFJDKDMxLDQ0NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKLXsgIm9yIiwgICAgICBYUkMoMzEsNDQ0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJtci4iLCAgICAgWFJDKDMxLDQ0NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKLXsgIm9yLiIsICAgICBYUkMoMzEsNDQ0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIm10ZXhpc3IiLCBYU1BSKDMxLDQ1MSw2NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZXhpZXIiLCBYU1BSKDMxLDQ1MSw2NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnIwIiwgICBYU1BSKDMxLDQ1MSwxMjgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMSIsICAgWFNQUigzMSw0NTEsMTI5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjIiLCAgIFhTUFIoMzEsNDUxLDEzMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnIzIiwgICBYU1BSKDMxLDQ1MSwxMzEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyNCIsICAgWFNQUigzMSw0NTEsMTMyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjUiLCAgIFhTUFIoMzEsNDUxLDEzMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnI2IiwgICBYU1BSKDMxLDQ1MSwxMzQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyNyIsICAgWFNQUigzMSw0NTEsMTM1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRiZWFyIiwgIFhTUFIoMzEsNDUxLDE0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YmVzciIsICBYU1BSKDMxLDQ1MSwxNDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGlvY3IiLCAgWFNQUigzMSw0NTEsMTYwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjcjAiLCBYU1BSKDMxLDQ1MSwxOTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWN0MCIsIFhTUFIoMzEsNDUxLDE5MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hZGEwIiwgWFNQUigzMSw0NTEsMTk0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzYTAiLCBYU1BSKDMxLDQ1MSwxOTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNjMCIsIFhTUFIoMzEsNDUxLDE5NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IxIiwgWFNQUigzMSw0NTEsMjAwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDEiLCBYU1BSKDMxLDQ1MSwyMDEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMSIsIFhTUFIoMzEsNDUxLDIwMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2ExIiwgWFNQUigzMSw0NTEsMjAzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzEiLCBYU1BSKDMxLDQ1MSwyMDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNyMiIsIFhTUFIoMzEsNDUxLDIwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3QyIiwgWFNQUigzMSw0NTEsMjA5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFkYTIiLCBYU1BSKDMxLDQ1MSwyMTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNhMiIsIFhTUFIoMzEsNDUxLDIxMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY2MyIiwgWFNQUigzMSw0NTEsMjEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjcjMiLCBYU1BSKDMxLDQ1MSwyMTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWN0MyIsIFhTUFIoMzEsNDUxLDIxNyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hZGEzIiwgWFNQUigzMSw0NTEsMjE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzYTMiLCBYU1BSKDMxLDQ1MSwyMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNjMyIsIFhTUFIoMzEsNDUxLDIyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc3IiLCBYU1BSKDMxLDQ1MSwyMjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHVtbWNyMCIsCVhTUFIoMzEsNDUxLDkzNiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWMxIiwJWFNQUigzMSw0NTEsOTM3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXBtYzIiLAlYU1BSKDMxLDQ1MSw5MzgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1c2lhIiwJWFNQUigzMSw0NTEsOTM5KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dW1tY3IxIiwJWFNQUigzMSw0NTEsOTQwKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXBtYzMiLAlYU1BSKDMxLDQ1MSw5NDEpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1cG1jNCIsCVhTUFIoMzEsNDUxLDk0MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdG1tY3IwIiwJWFNQUigzMSw0NTEsOTUyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10cG1jMSIsCVhTUFIoMzEsNDUxLDk1MyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHBtYzIiLAlYU1BSKDMxLDQ1MSw5NTQpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRzaWEiLAlYU1BSKDMxLDQ1MSw5NTUpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRtbWNyMSIsCVhTUFIoMzEsNDUxLDk1NiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHBtYzMiLAlYU1BSKDMxLDQ1MSw5NTcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWM0IiwJWFNQUigzMSw0NTEsOTU4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10bDJjciIsCVhTUFIoMzEsNDUxLDEwMTcpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdGljdGMiLAlYU1BSKDMxLDQ1MSwxMDE5KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR0aHJtMSIsCVhTUFIoMzEsNDUxLDEwMjApLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHRocm0yIiwJWFNQUigzMSw0NTEsMTAyMSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dGhybTMiLAlYU1BSKDMxLDQ1MSwxMDIyKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRkY3IiLCAgIFgoMzEsNDUxKSwJWF9NQVNLLAkJUFBDLAkJeyBTUFIsIFJTIH0gfSwKLQoteyAiZGl2ZHUiLCAgIFhPKDMxLDQ1NywwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkdS4iLCAgWE8oMzEsNDU3LDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmR1byIsICBYTygzMSw0NTcsMSwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZHVvLiIsIFhPKDMxLDQ1NywxLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRpdnd1IiwgICBYTygzMSw0NTksMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnd1LiIsICBYTygzMSw0NTksMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnd1byIsICBYTygzMSw0NTksMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnd1by4iLCBYTygzMSw0NTksMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXRtcSIsICAgIFhTUFIoMzEsNDY3LDApLCAgIFhTUFJfTUFTSywgICAgTTYwMSwJeyBSUyB9IH0sCi17ICJtdHhlciIsICAgWFNQUigzMSw0NjcsMSksICAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRsciIsICAgIFhTUFIoMzEsNDY3LDgpLCAgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10Y3RyIiwgICBYU1BSKDMxLDQ2Nyw5KSwgICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHRpZCIsICAgWFNQUigzMSw0NjcsMTcpLCAgWFNQUl9NQVNLLCAgICBQT1dFUiwJeyBSUyB9IH0sCi17ICJtdGRzaXNyIiwgWFNQUigzMSw0NjcsMTgpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRkYXIiLCAgIFhTUFIoMzEsNDY3LDE5KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10cnRjdSIsICBYU1BSKDMxLDQ2NywyMCksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHJ0Y2wiLCAgWFNQUigzMSw0NjcsMjEpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRkZWMiLCAgIFhTUFIoMzEsNDY3LDIyKSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10c2RyMCIsICBYU1BSKDMxLDQ2NywyNCksICBYU1BSX01BU0ssICAgIFBPV0VSLAl7IFJTIH0gfSwKLXsgIm10c2RyMSIsICBYU1BSKDMxLDQ2NywyNSksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHNycjAiLCAgWFNQUigzMSw0NjcsMjYpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRzcnIxIiwgIFhTUFIoMzEsNDY3LDI3KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10Y21wYSIsICAgWFNQUigzMSw0NjcsMTQ0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBiIiwgICBYU1BSKDMxLDQ2NywxNDUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGMiLCAgIFhTUFIoMzEsNDY3LDE0NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wZCIsICAgWFNQUigzMSw0NjcsMTQ3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRpY3IiLCAgICBYU1BSKDMxLDQ2NywxNDgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGRlciIsICAgIFhTUFIoMzEsNDY3LDE0OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y291bnRhIiwgWFNQUigzMSw0NjcsMTUwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjb3VudGIiLCBYU1BSKDMxLDQ2NywxNTEpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGUiLCAgIFhTUFIoMzEsNDY3LDE1MiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wZiIsICAgWFNQUigzMSw0NjcsMTUzKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBnIiwgICBYU1BSKDMxLDQ2NywxNTQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGgiLCAgIFhTUFIoMzEsNDY3LDE1NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10bGN0cmwxIiwgWFNQUigzMSw0NjcsMTU2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRsY3RybDIiLCBYU1BSKDMxLDQ2NywxNTcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGljdHJsIiwgIFhTUFIoMzEsNDY3LDE1OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10YmFyIiwgICAgWFNQUigzMSw0NjcsMTU5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRzcHJnIiwgIFhTUFIoMzEsNDY3LDI3MiksIFhTUFJHX01BU0ssICAgUFBDLAl7IFNQUkcsIFJTIH0gfSwKLXsgIm10c3ByZzAiLCBYU1BSKDMxLDQ2NywyNzIpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCi17ICJtdHNwcmcxIiwgWFNQUigzMSw0NjcsMjczKSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRzcHJnMiIsIFhTUFIoMzEsNDY3LDI3NCksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKLXsgIm10c3ByZzMiLCBYU1BSKDMxLDQ2NywyNzUpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCi17ICJtdGFzciIsICAgWFNQUigzMSw0NjcsMjgwKSwgWFNQUl9NQVNLLCAgICBQUEM2NCwJeyBSUyB9IH0sCi17ICJtdGVhciIsICAgWFNQUigzMSw0NjcsMjgyKSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlMgfSB9LAoteyAibXR0YmwiLCAgIFhTUFIoMzEsNDY3LDI4NCksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJTIH0gfSwKLXsgIm10dGJ1IiwgICBYU1BSKDMxLDQ2NywyODUpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSUyB9IH0sCi17ICJtdGliYXR1IiwgWFNQUigzMSw0NjcsNTI4KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCi17ICJtdGliYXRsIiwgWFNQUigzMSw0NjcsNTI5KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCi17ICJtdGRiYXR1IiwgWFNQUigzMSw0NjcsNTM2KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCi17ICJtdGRiYXRsIiwgWFNQUigzMSw0NjcsNTM3KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCi17ICJtdHpwciIsICAgWFNQUigzMSw0NjcsOTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwaWQiLCAgIFhTUFIoMzEsNDY3LDk0NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aWNkYmRyIixYU1BSKDMxLDQ2Nyw5NzkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGVzciIsICAgWFNQUigzMSw0NjcsOTgwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRldnByIiwgIFhTUFIoMzEsNDY3LDk4MiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10Y2RiY3IiLCBYU1BSKDMxLDQ2Nyw5ODMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHRzciIsICAgWFNQUigzMSw0NjcsOTg0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR0Y3IiLCAgIFhTUFIoMzEsNDY3LDk4NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGl0IiwgICBYU1BSKDMxLDQ2Nyw5ODcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHRiaGkiLCAgWFNQUigzMSw0NjcsOTg4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR0YmxvIiwgIFhTUFIoMzEsNDY3LDk4OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10c3JyMiIsICBYU1BSKDMxLDQ2Nyw5OTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHNycjMiLCAgWFNQUigzMSw0NjcsOTkxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkYnNyIiwgIFhTUFIoMzEsNDY3LDEwMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGlhYzEiLCAgWFNQUigzMSw0NjcsMTAxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aWFjMiIsICBYU1BSKDMxLDQ2NywxMDEzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkYWMxIiwgIFhTUFIoMzEsNDY3LDEwMTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRhYzIiLCAgWFNQUigzMSw0NjcsMTAxNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGNjciIsICBYU1BSKDMxLDQ2NywxMDE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpY2NyIiwgIFhTUFIoMzEsNDY3LDEwMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBibDEiLCAgWFNQUigzMSw0NjcsMTAyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGJ1MSIsICBYU1BSKDMxLDQ2NywxMDIxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYmwyIiwgIFhTUFIoMzEsNDY3LDEwMjIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBidTIiLCAgWFNQUigzMSw0NjcsMTAyMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10c3ByIiwgICBYKDMxLDQ2NyksCSAgICAgICBYX01BU0ssCSAgICAgQ09NLAl7IFNQUiwgUlMgfSB9LAotCi17ICJkY2JpIiwgICAgWCgzMSw0NzApLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJuYW5kIiwgICAgWFJDKDMxLDQ3NiwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibmFuZC4iLCAgIFhSQygzMSw0NzYsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiZGNyZWFkIiwgIFgoMzEsNDg2KSwJWFJUX01BU0ssCVBQQzQwMywJCXsgUkEsIFJCIH0gfSwKLQoteyAibmFicyIsICAgIFhPKDMxLDQ4OCwwLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJuYWJzLiIsICAgWE8oMzEsNDg4LDAsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5hYnNvIiwgICBYTygzMSw0ODgsMSwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAibmFic28uIiwgIFhPKDMxLDQ4OCwxLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi0KLXsgImRpdmQiLCAgICBYTygzMSw0ODksMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZC4iLCAgIFhPKDMxLDQ4OSwwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkbyIsICAgWE8oMzEsNDg5LDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmRvLiIsICBYTygzMSw0ODksMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkaXZ3IiwgICAgWE8oMzEsNDkxLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3LiIsICAgWE8oMzEsNDkxLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3byIsICAgWE8oMzEsNDkxLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3by4iLCAgWE8oMzEsNDkxLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNsYmlhIiwgICBYKDMxLDQ5OCksCTB4ZmZmZmZmZmYsCVBQQzY0LAkJeyAwIH0gfSwKLQoteyAiY2xpIiwgICAgIFgoMzEsNTAyKSwgWFJCX01BU0ssCVBPV0VSLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtY3J4ciIsICAgWCgzMSw1MTIpLAlYUkFSQl9NQVNLfCgzPDwyMSksIENPTSwJeyBCRiB9IH0sCi0KLXsgImNsY3MiLCAgICBYKDMxLDUzMSksIFhSQl9NQVNLLAlNNjAxLAkJeyBSVCwgUkEgfSB9LAotCi17ICJsc3d4IiwgICAgWCgzMSw1MzMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibHN4IiwgICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibHdicngiLCAgIFgoMzEsNTM0KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImxicngiLCAgICBYKDMxLDUzNCksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxmc3giLCAgICBYKDMxLDUzNSksCVhfTUFTSywJCUNPTSwJCXsgRlJULCBSQSwgUkIgfSB9LAotCi17ICJzcnciLCAgICAgWFJDKDMxLDUzNiwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3IiLCAgICAgIFhSQygzMSw1MzYsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNydy4iLCAgICBYUkMoMzEsNTM2LDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzci4iLCAgICAgWFJDKDMxLDUzNiwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJycmliIiwgICAgWFJDKDMxLDUzNywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJyaWIuIiwgICBYUkMoMzEsNTM3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmQiLCAgICAgWFJDKDMxLDUzOSwwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmQuIiwgICAgWFJDKDMxLDUzOSwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIm1hc2tpciIsICBYUkMoMzEsNTQxLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibWFza2lyLiIsIFhSQygzMSw1NDEsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInRsYnN5bmMiLCBYKDMxLDU2NiksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCi0KLXsgImxmc3V4IiwgICBYKDMxLDU2NyksCVhfTUFTSywJCUNPTSwJCXsgRlJULCBSQVMsIFJCIH0gfSwKLQoteyAibWZzciIsICAgIFgoMzEsNTk1KSwJWFJCX01BU0t8KDE8PDIwKSwgQ09NMzIsCXsgUlQsIFNSIH0gfSwKLQoteyAibHN3aSIsICAgIFgoMzEsNTk3KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIE5CIH0gfSwKLXsgImxzaSIsICAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBOQiB9IH0sCi0KLXsgInN5bmMiLCAgICBYKDMxLDU5OCksIDB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCi17ICJkY3MiLCAgICAgWCgzMSw1OTgpLCAweGZmZmZmZmZmLAlQV1JDT00sCQl7IDAgfSB9LAotCi17ICJsZmR4IiwgICAgWCgzMSw1OTkpLCBYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAibWZzcmkiLCAgIFgoMzEsNjI3KSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGNsc3QiLCAgIFgoMzEsNjMwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUlMsIFJBIH0gfSwKLQoteyAibGZkdXgiLCAgIFgoMzEsNjMxKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBUywgUkIgfSB9LAotCi17ICJtZnNyaW4iLCAgWCgzMSw2NTkpLCBYUkFfTUFTSywJUFBDMzIsCQl7IFJULCBSQiB9IH0sCi0KLXsgInN0c3d4IiwgICBYKDMxLDY2MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi17ICJzdHN4IiwgICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdHdicngiLCAgWCgzMSw2NjIpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoteyAic3RicngiLCAgIFgoMzEsNjYyKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3Rmc3giLCAgIFgoMzEsNjYzKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNycSIsICAgICBYUkMoMzEsNjY0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JxLiIsICAgIFhSQygzMSw2NjQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyZSIsICAgICBYUkMoMzEsNjY1LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JlLiIsICAgIFhSQygzMSw2NjUsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInN0ZnN1eCIsICBYKDMxLDY5NSksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQVMsIFJCIH0gfSwKLQoteyAic3JpcSIsICAgIFhSQygzMSw2OTYsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmlxLiIsICAgWFJDKDMxLDY5NiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAic3Rzd2kiLCAgIFgoMzEsNzI1KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIE5CIH0gfSwKLXsgInN0c2kiLCAgICBYKDMxLDcyNSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBOQiB9IH0sCi0KLXsgInN0ZmR4IiwgICBYKDMxLDcyNyksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJzcmxxIiwgICAgWFJDKDMxLDcyOCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNybHEuIiwgICBYUkMoMzEsNzI4LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmVxIiwgICAgWFJDKDMxLDcyOSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyZXEuIiwgICBYUkMoMzEsNzI5LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzdGZkdXgiLCAgWCgzMSw3NTkpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkFTLCBSQiB9IH0sCi0KLXsgInNybGlxIiwgICBYUkMoMzEsNzYwLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JsaXEuIiwgIFhSQygzMSw3NjAsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImxoYnJ4IiwgICBYKDMxLDc5MCksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNyYXciLCAgICBYUkMoMzEsNzkyLDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmEiLCAgICAgWFJDKDMxLDc5MiwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3Jhdy4iLCAgIFhSQygzMSw3OTIsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYS4iLCAgICBYUkMoMzEsNzkyLDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyYWQiLCAgICBYUkMoMzEsNzk0LDApLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYWQuIiwgICBYUkMoMzEsNzk0LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAicmFjIiwgICAgIFgoMzEsODE4KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic3Jhd2kiLCAgIFhSQygzMSw4MjQsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNyYWkiLCAgICBYUkMoMzEsODI0LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmF3aS4iLCAgWFJDKDMxLDgyNCwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JhaS4iLCAgIFhSQygzMSw4MjQsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAiZWllaW8iLCAgIFgoMzEsODU0KSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLQoteyAidGxic3giLCAgIFhSQygzMSw5MTQsMCksIFhfTUFTSywgUFBDNDAzLAl7IFJULCBSQSwgUkIgfSB9LAoteyAidGxic3guIiwgIFhSQygzMSw5MTQsMSksIFhfTUFTSywgUFBDNDAzLAl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzdGhicngiLCAgWCgzMSw5MTgpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzcmFxIiwgICAgWFJDKDMxLDkyMCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYXEuIiwgICBYUkMoMzEsOTIwLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmVhIiwgICAgWFJDKDMxLDkyMSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyZWEuIiwgICBYUkMoMzEsOTIxLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJleHRzaCIsICAgWFJDKDMxLDkyMiwwKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHMiLCAgICBYUkMoMzEsOTIyLDApLCBYUkJfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiZXh0c2guIiwgIFhSQygzMSw5MjIsMSksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJleHRzLiIsICAgWFJDKDMxLDkyMiwxKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLQoteyAidGxicmUiLCAgIFgoMzEsOTQ2KSwJWF9NQVNLLAkJUFBDNDAzLAkJeyBSVCwgUkEsIFNIIH0gfSwKLQoteyAic3JhaXEiLCAgIFhSQygzMSw5NTIsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmFpcS4iLCAgWFJDKDMxLDk1MiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAiZXh0c2IiLCAgIFhSQygzMSw5NTQsMCksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSU30gfSwKLXsgImV4dHNiLiIsICBYUkMoMzEsOTU0LDEpLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlN9IH0sCi0KLXsgImljY2NpIiwgICBYKDMxLDk2NiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInRsYmxkIiwgICBYKDMxLDk3OCksCVhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAoteyAidGxid2UiLCAgIFgoMzEsOTc4KSwJWF9NQVNLLAkJUFBDNDAzLAkJeyBSUywgUkEsIFNIIH0gfSwKLQoteyAiaWNiaSIsICAgIFgoMzEsOTgyKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAic3RmaXd4IiwgIFgoMzEsOTgzKSwJWF9NQVNLLAkJUFBDLAkJeyBGUlMsIFJBLCBSQiB9IH0sCi0KLXsgImV4dHN3IiwgICBYUkMoMzEsOTg2LDApLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlMgfSB9LAoteyAiZXh0c3cuIiwgIFhSQygzMSw5ODYsMSksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSUyB9IH0sCi0KLXsgImljcmVhZCIsICBYKDMxLDk5OCksCVhSVF9NQVNLLAlQUEM0MDMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInRsYmxpIiwgICBYKDMxLDEwMTApLCBYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKLQoteyAiZGNieiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi17ICJkY2x6IiwgICAgWCgzMSwxMDE0KSwgWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibHd6IiwgICAgIE9QKDMyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoteyAibCIsCSAgICAgT1AoMzIpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImx3enUiLCAgICBPUCgzMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi17ICJsdSIsICAgICAgT1AoMzMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxieiIsICAgICBPUCgzNCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGJ6dSIsICAgIE9QKDM1KSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLQoteyAic3R3IiwgICAgIE9QKDM2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSUywgRCwgUkEgfSB9LAoteyAic3QiLCAgICAgIE9QKDM2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdHd1IiwgICAgT1AoMzcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQVMgfSB9LAoteyAic3R1IiwgICAgIE9QKDM3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdGIiLCAgICAgT1AoMzgpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgInN0YnUiLCAgICBPUCgzOSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxoeiIsICAgICBPUCg0MCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGh6dSIsICAgIE9QKDQxKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLQoteyAibGhhIiwgICAgIE9QKDQyKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsaGF1IiwgICAgT1AoNDMpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQUwgfSB9LAotCi17ICJzdGgiLCAgICAgT1AoNDQpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgInN0aHUiLCAgICBPUCg0NSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxtdyIsICAgICBPUCg0NiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTSB9IH0sCi17ICJsbSIsICAgICAgT1AoNDYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgInN0bXciLCAgICBPUCg0NyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLXsgInN0bSIsICAgICBPUCg0NyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAibGZzIiwgICAgIE9QKDQ4KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBIH0gfSwKLQoteyAibGZzdSIsICAgIE9QKDQ5KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBUyB9IH0sCi0KLXsgImxmZCIsICAgICBPUCg1MCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxmZHUiLCAgICBPUCg1MSksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQVMgfSB9LAotCi17ICJzdGZzIiwgICAgT1AoNTIpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGZzdSIsICAgT1AoNTMpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkFTIH0gfSwKLQoteyAic3RmZCIsICAgIE9QKDU0KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3RmZHUiLCAgIE9QKDU1KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxmcSIsICAgICBPUCg1NiksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxmcXUiLCAgICBPUCg1NyksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxkIiwgICAgICBEU08oNTgsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBIH0gfSwKLQoteyAibGR1IiwgICAgIERTTyg1OCwxKSwgRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkFMIH0gfSwKLQoteyAibHdhIiwgICAgIERTTyg1OCwyKSwgRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkEgfSB9LAotCi17ICJmZGl2cyIsICAgQSg1OSwxOCwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmRpdnMuIiwgIEEoNTksMTgsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnN1YnMiLCAgIEEoNTksMjAsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzdWJzLiIsICBBKDU5LDIwLDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZhZGRzIiwgICBBKDU5LDIxLDApLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYWRkcy4iLCAgQSg1OSwyMSwxKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3FydHMiLCAgQSg1OSwyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZzcXJ0cy4iLCBBKDU5LDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmcmVzIiwgICAgQSg1OSwyNCwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZyZXMuIiwgICBBKDU5LDI0LDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmbXVscyIsICAgQSg1OSwyNSwwKSwgQUZSQl9NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm11bHMuIiwgIEEoNTksMjUsMSksIEFGUkJfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLQoteyAiZm1zdWJzIiwgIEEoNTksMjgsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1zdWJzLiIsIEEoNTksMjgsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbWFkZHMiLCAgQSg1OSwyOSwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbWFkZHMuIiwgQSg1OSwyOSwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubXN1YnMiLCBBKDU5LDMwLDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubXN1YnMuIixBKDU5LDMwLDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm5tYWRkcyIsIEEoNTksMzEsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tYWRkcy4iLEEoNTksMzEsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJzdGZxIiwgICAgT1AoNjApLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGZxdSIsICAgT1AoNjEpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGQiLCAgICAgRFNPKDYyLDApLAlEU19NQVNLLAlQUEM2NCwJCXsgUlMsIERTLCBSQSB9IH0sCi0KLXsgInN0ZHUiLCAgICBEU08oNjIsMSksCURTX01BU0ssCVBQQzY0LAkJeyBSUywgRFMsIFJBUyB9IH0sCi0KLXsgImZjbXB1IiwgICBYKDYzLDApLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAotCi17ICJmcnNwIiwgICAgWFJDKDYzLDEyLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmcnNwLiIsICAgWFJDKDYzLDEyLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjdGl3IiwgICBYUkMoNjMsMTQsMCksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXIiLCAgICBYUkMoNjMsMTQsMCksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGl3LiIsICBYUkMoNjMsMTQsMSksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXIuIiwgICBYUkMoNjMsMTQsMSksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmN0aXd6IiwgIFhSQyg2MywxNSwwKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNpcnoiLCAgIFhSQyg2MywxNSwwKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmN0aXd6LiIsIFhSQyg2MywxNSwxKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNpcnouIiwgIFhSQyg2MywxNSwxKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmZGl2IiwgICAgQSg2MywxOCwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmQiLCAgICAgIEEoNjMsMTgsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZkaXYuIiwgICBBKDYzLDE4LDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmZC4iLCAgICAgQSg2MywxOCwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3ViIiwgICAgQSg2MywyMCwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZnMiLCAgICAgIEEoNjMsMjAsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzdWIuIiwgICBBKDYzLDIwLDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmcy4iLCAgICAgQSg2MywyMCwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmYWRkIiwgICAgQSg2MywyMSwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmEiLCAgICAgIEEoNjMsMjEsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZhZGQuIiwgICBBKDYzLDIxLDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYS4iLCAgICAgQSg2MywyMSwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3FydCIsICAgQSg2MywyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUENQV1IyLAl7IEZSVCwgRlJCIH0gfSwKLXsgImZzcXJ0LiIsICBBKDYzLDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQ1BXUjIsCXsgRlJULCBGUkIgfSB9LAotCi17ICJmc2VsIiwgICAgQSg2MywyMywwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmc2VsLiIsICAgQSg2MywyMywxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZtdWwiLCAgICBBKDYzLDI1LDApLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi17ICJmbSIsICAgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm11bC4iLCAgIEEoNjMsMjUsMSksIEFGUkJfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLXsgImZtLiIsICAgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi0KLXsgImZyc3FydGUiLCBBKDYzLDI2LDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoteyAiZnJzcXJ0ZS4iLEEoNjMsMjYsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZtc3ViIiwgICBBKDYzLDI4LDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtcyIsICAgICBBKDYzLDI4LDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtc3ViLiIsICBBKDYzLDI4LDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtcy4iLCAgICBBKDYzLDI4LDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm1hZGQiLCAgIEEoNjMsMjksMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hIiwgICAgIEEoNjMsMjksMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hZGQuIiwgIEEoNjMsMjksMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hLiIsICAgIEEoNjMsMjksMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbm1zdWIiLCAgQSg2MywzMCwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zIiwgICAgQSg2MywzMCwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zdWIuIiwgQSg2MywzMCwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zLiIsICAgQSg2MywzMCwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubWFkZCIsICBBKDYzLDMxLDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWEiLCAgICBBKDYzLDMxLDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWFkZC4iLCBBKDYzLDMxLDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWEuIiwgICBBKDYzLDMxLDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZmNtcG8iLCAgIFgoNjMsMzIpLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAotCi17ICJtdGZzYjEiLCAgWFJDKDYzLDM4LDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKLXsgIm10ZnNiMS4iLCBYUkMoNjMsMzgsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAotCi17ICJmbmVnIiwgICAgWFJDKDYzLDQwLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmbmVnLiIsICAgWFJDKDYzLDQwLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgIm1jcmZzIiwgICBYKDYzLDY0KSwJWFJCX01BU0t8KDM8PDIxKXwoMzw8MTYpLCBDT00sCXsgQkYsIEJGQSB9IH0sCi0KLXsgIm10ZnNiMCIsICBYUkMoNjMsNzAsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAoteyAibXRmc2IwLiIsIFhSQyg2Myw3MCwxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCi0KLXsgImZtciIsICAgICBYUkMoNjMsNzIsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZtci4iLCAgICBYUkMoNjMsNzIsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAibXRmc2ZpIiwgIFhSQyg2MywxMzQsMCksIFhSQV9NQVNLfCgzPDwyMSl8KDE8PDExKSwgQ09NLCB7IEJGLCBVIH0gfSwKLXsgIm10ZnNmaS4iLCBYUkMoNjMsMTM0LDEpLCBYUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRiwgVSB9IH0sCi0KLXsgImZuYWJzIiwgICBYUkMoNjMsMTM2LDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmbmFicy4iLCAgWFJDKDYzLDEzNiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmYWJzIiwgICAgWFJDKDYzLDI2NCwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmFicy4iLCAgIFhSQyg2MywyNjQsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAibWZmcyIsICAgIFhSQyg2Myw1ODMsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgRlJUIH0gfSwKLXsgIm1mZnMuIiwgICBYUkMoNjMsNTgzLDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEZSVCB9IH0sCi0KLXsgIm10ZnNmIiwgICBYRkwoNjMsNzExLDApLCBYRkxfTUFTSywJQ09NLAkJeyBGTE0sIEZSQiB9IH0sCi17ICJtdGZzZi4iLCAgWEZMKDYzLDcxMSwxKSwgWEZMX01BU0ssCUNPTSwJCXsgRkxNLCBGUkIgfSB9LAotCi17ICJmY3RpZCIsICAgWFJDKDYzLDgxNCwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY3RpZC4iLCAgWFJDKDYzLDgxNCwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjdGlkeiIsICBYUkMoNjMsODE1LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGlkei4iLCBYUkMoNjMsODE1LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmNmaWQiLCAgIFhSQyg2Myw4NDYsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNmaWQuIiwgIFhSQyg2Myw4NDYsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAotCi19OwotCi1jb25zdCBpbnQgcG93ZXJwY19udW1fb3Bjb2RlcyA9Ci0gIHNpemVvZiAocG93ZXJwY19vcGNvZGVzKSAvIHNpemVvZiAocG93ZXJwY19vcGNvZGVzWzBdKTsKLQwKLS8qIFRoZSBtYWNybyB0YWJsZS4gIFRoaXMgaXMgb25seSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotCi0vKiBUaGUgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0gKC14ICEgMzEpICYgKHggfCAzMSkgaGF2ZSB0aGUgdmFsdWUgMAotICAgd2hlbiB4PTA7IDMyLXggd2hlbiB4IGlzIGJldHdlZW4gMSBhbmQgMzE7IGFyZSBuZWdhdGl2ZSBpZiB4IGlzCi0gICBuZWdhdGl2ZTsgYW5kIGFyZSAzMiBvciBtb3JlIG90aGVyd2lzZS4gIFRoaXMgaXMgd2hhdCB5b3Ugd2FudAotICAgd2hlbiwgZm9yIGluc3RhbmNlLCB5b3UgYXJlIGVtdWxhdGluZyBhIHJpZ2h0IHNoaWZ0IGJ5IGEKLSAgIHJvdGF0ZS1sZWZ0LWFuZC1tYXNrLCBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIGluc3RydWN0aW9ucyBzdXBwb3J0Ci0gICBzaGlmdHMgb2Ygc2l6ZSAwIGJ1dCBub3Qgc2hpZnRzIG9mIHNpemUgMzIuICBCeSBjb21wYXJpc29uLCB3aGVuCi0gICBleHRyYWN0aW5nIHggYml0cyBmcm9tIHNvbWUgd29yZCB5b3Ugd2FudCB0byB1c2UganVzdCAzMi14LCBiZWNhdXNlCi0gICB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbnMgZG9uJ3Qgc3VwcG9ydCBleHRyYWN0aW5nIDAgYml0cyBidXQgZG8KLSAgIHN1cHBvcnQgZXh0cmFjdGluZyB0aGUgd2hvbGUgd29yZCAoMzIgYml0cyBpbiB0aGlzIGNhc2UpLiAgKi8KLQotY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gcG93ZXJwY19tYWNyb3NbXSA9IHsKLXsgImV4dGxkaSIsICA0LCAgIFBQQzY0LAkicmxkaWNyICUwLCUxLCUzLCglMiktMSIgfSwKLXsgImV4dGxkaS4iLCA0LCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwlMywoJTIpLTEiIH0sCi17ICJleHRyZGkiLCAgNCwgICBQUEM2NCwJInJsZGljbCAlMCwlMSwoJTIpKyglMyksNjQtKCUyKSIgfSwKLXsgImV4dHJkaS4iLCA0LCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoJTIpKyglMyksNjQtKCUyKSIgfSwKLXsgImluc3JkaSIsICA0LCAgIFBQQzY0LAkicmxkaW1pICUwLCUxLDY0LSgoJTIpKyglMykpLCUzIiB9LAoteyAiaW5zcmRpLiIsIDQsICAgUFBDNjQsCSJybGRpbWkuICUwLCUxLDY0LSgoJTIpKyglMykpLCUzIiB9LAoteyAicm90cmRpIiwgIDMsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksMCIgfSwKLXsgInJvdHJkaS4iLCAzLCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwwIiB9LAoteyAic2xkaSIsICAgIDMsICAgUFBDNjQsCSJybGRpY3IgJTAsJTEsJTIsNjMtKCUyKSIgfSwKLXsgInNsZGkuIiwgICAzLCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwlMiw2My0oJTIpIiB9LAoteyAic3JkaSIsICAgIDMsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksJTIiIH0sCi17ICJzcmRpLiIsICAgMywgICBQUEM2NCwJInJsZGljbC4gJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksJTIiIH0sCi17ICJjbHJyZGkiLCAgMywgICBQUEM2NCwJInJsZGljciAlMCwlMSwwLDYzLSglMikiIH0sCi17ICJjbHJyZGkuIiwgMywgICBQUEM2NCwJInJsZGljci4gJTAsJTEsMCw2My0oJTIpIiB9LAoteyAiY2xybHNsZGkiLDQsICAgUFBDNjQsCSJybGRpYyAlMCwlMSwlMywoJTIpLSglMykiIH0sCi17ICJjbHJsc2xkaS4iLDQsICBQUEM2NCwJInJsZGljLiAlMCwlMSwlMywoJTIpLSglMykiIH0sCi0KLXsgImV4dGx3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMywwLCglMiktMSIgfSwKLXsgImV4dGx3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTMsMCwoJTIpLTEiIH0sCi17ICJleHRyd2kiLCAgNCwgICBQUENDT00sCSJybHdpbm0gJTAsJTEsKCUyKSsoJTMpLDMyLSglMiksMzEiIH0sCi17ICJleHRyd2kuIiwgNCwgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCglMikrKCUzKSwzMi0oJTIpLDMxIiB9LAoteyAiaW5zbHdpIiwgIDQsICAgUFBDQ09NLAkicmx3aW1pICUwLCUxLCgtKCUzKSEzMSkmKCglMyl8MzEpLCUzLCglMikrKCUzKS0xIiB9LAoteyAiaW5zbHdpLiIsIDQsICAgUFBDQ09NLAkicmx3aW1pLiAlMCwlMSwoLSglMykhMzEpJigoJTMpfDMxKSwlMywoJTIpKyglMyktMSJ9LAoteyAiaW5zcndpIiwgIDQsICAgUFBDQ09NLAkicmx3aW1pICUwLCUxLDMyLSgoJTIpKyglMykpLCUzLCglMikrKCUzKS0xIiB9LAoteyAiaW5zcndpLiIsIDQsICAgUFBDQ09NLAkicmx3aW1pLiAlMCwlMSwzMi0oKCUyKSsoJTMpKSwlMywoJTIpKyglMyktMSJ9LAoteyAicm90cndpIiwgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLDAsMzEiIH0sCi17ICJyb3Ryd2kuIiwgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLDAsMzEiIH0sCi17ICJzbHdpIiwgICAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic2xpIiwgICAgIDMsICAgUFdSQ09NLAkicmxpbm0gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic2x3aS4iLCAgIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwlMiwwLDMxLSglMikiIH0sCi17ICJzbGkuIiwgICAgMywgICBQV1JDT00sCSJybGlubS4gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic3J3aSIsICAgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAic3JpIiwgICAgIDMsICAgUFdSQ09NLAkicmxpbm0gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCi17ICJzcndpLiIsICAgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAic3JpLiIsICAgIDMsICAgUFdSQ09NLAkicmxpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAiY2xycndpIiwgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLDAsMCwzMS0oJTIpIiB9LAoteyAiY2xycndpLiIsIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwwLDAsMzEtKCUyKSIgfSwKLXsgImNscmxzbHdpIiw0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMywoJTIpLSglMyksMzEtKCUzKSIgfSwKLXsgImNscmxzbHdpLiIsNCwgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTMsKCUyKS0oJTMpLDMxLSglMykiIH0sCi0KLX07Ci0KLWNvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3MgPQotICBzaXplb2YgKHBvd2VycGNfbWFjcm9zKSAvIHNpemVvZiAocG93ZXJwY19tYWNyb3NbMF0pOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zaC1kaXMuYyBiL29wY29kZXMvc2gtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmZkYjYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zaC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBTSCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgU1RBVElDX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAic2gtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0jZGVmaW5lIExJVFRMRV9CSVQgMgotCi1zdGF0aWMgaW50IAotcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGZwcmludGZfZnR5cGUgZnByaW50Zl9mbiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICB1bnNpZ25lZCBjaGFyIGluc25bMl07Ci0gIHVuc2lnbmVkIGNoYXIgbmlic1s0XTsKLSAgaW50IHN0YXR1czsKLSAgYmZkX3ZtYSByZWxtYXNrID0gfiAoYmZkX3ZtYSkgMDsKLSAgc2hfb3Bjb2RlX2luZm8gKm9wOwotCi0gIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGluc24sIDIsIGluZm8pOwotCi0gIGlmIChzdGF0dXMgIT0gMCkgCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpIAotICAgIHsKLSAgICAgIG5pYnNbMF0gPSAoaW5zblsxXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbMV0gPSBpbnNuWzFdICYgMHhmOwotCi0gICAgICBuaWJzWzJdID0gKGluc25bMF0gPj4gNCkgJiAweGY7Ci0gICAgICBuaWJzWzNdID0gaW5zblswXSAmIDB4ZjsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgbmlic1swXSA9IChpbnNuWzBdID4+IDQpICYgMHhmOwotICAgICAgbmlic1sxXSA9IGluc25bMF0gJiAweGY7Ci0KLSAgICAgIG5pYnNbMl0gPSAoaW5zblsxXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbM10gPSBpbnNuWzFdICYgMHhmOwotICAgIH0KLQotICBmb3IgKG9wID0gc2hfdGFibGU7IG9wLT5uYW1lOyBvcCsrKSAKLSAgICB7Ci0gICAgICBpbnQgbjsKLSAgICAgIGludCBpbW0gPSAwOwotICAgICAgaW50IHJuID0gMDsKLSAgICAgIGludCBybSA9IDA7Ci0gICAgICBpbnQgcmIgPSAwOwotICAgICAgaW50IGRpc3BfcGM7Ci0gICAgICBiZmRfdm1hIGRpc3BfcGNfYWRkciA9IDA7Ci0KLSAgICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspCi0JewotCSAgaW50IGkgPSBvcC0+bmliYmxlc1tuXTsKLQotCSAgaWYgKGkgPCAxNikgCi0JICAgIHsKLQkgICAgICBpZiAobmlic1tuXSA9PSBpKQotCQljb250aW51ZTsKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIH0KLQkgIHN3aXRjaCAoaSkKLQkgICAgewotCSAgICBjYXNlIEJSQU5DSF84OgotCSAgICAgIGltbSA9IChuaWJzWzJdIDw8IDQpIHwgKG5pYnNbM10pOwkgIAotCSAgICAgIGlmIChpbW0gJiAweDgwKQotCQlpbW0gfD0gfjB4ZmY7Ci0JICAgICAgaW1tID0gKChjaGFyKWltbSkgKiAyICsgNCA7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBCUkFOQ0hfMTI6Ci0JICAgICAgaW1tID0gKChuaWJzWzFdKSA8PCA4KSB8IChuaWJzWzJdIDw8IDQpIHwgKG5pYnNbM10pOwotCSAgICAgIGlmIChpbW0gJiAweDgwMCkKLQkJaW1tIHw9IH4weGZmZjsKLQkgICAgICBpbW0gPSBpbW0gKiAyICsgNDsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTV80OgotCSAgICAgIGltbSA9IG5pYnNbM107Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fNEJZMjoKLQkgICAgICBpbW0gPSBuaWJzWzNdIDw8MTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTV80Qlk0OgotCSAgICAgIGltbSA9IG5pYnNbM10gPDwyOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NXzg6Ci0JICAgICAgaW1tID0gKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZMjoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDE7Ci0JICAgICAgcmVsbWFzayA9IH4gKGJmZF92bWEpIDE7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBQQ1JFTElNTV84Qlk0OgotCSAgICAgIGltbSA9ICgobmlic1syXSA8PCA0KSB8IG5pYnNbM10pIDw8MjsKLQkgICAgICByZWxtYXNrID0gfiAoYmZkX3ZtYSkgMzsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTV84QlkyOgotCSAgICAgIGltbSA9ICgobmlic1syXSA8PCA0KSB8IG5pYnNbM10pIDw8MTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTV84Qlk0OgotCSAgICAgIGltbSA9ICgobmlic1syXSA8PCA0KSB8IG5pYnNbM10pIDw8MjsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIERJU1BfODoKLQkgICAgICBpbW0gPSAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsJICAKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIERJU1BfNDoKLQkgICAgICBpbW0gPSBuaWJzWzNdOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgUkVHX046Ci0JICAgICAgcm4gPSBuaWJzW25dOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19NOgotCSAgICAgIHJtID0gbmlic1tuXTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRUdfTk06Ci0JICAgICAgcm4gPSAobmlic1tuXSAmIDB4YykgPj4gMjsKLQkgICAgICBybSA9IChuaWJzW25dICYgMHgzKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRUdfQjoKLQkgICAgICByYiA9IG5pYnNbbl0gJiAweDA3OwotCSAgICAgIGJyZWFrOwkKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JfQotCi0gICAgb2s6Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sIiVzXHQiLCBvcC0+bmFtZSk7Ci0gICAgICBkaXNwX3BjID0gMDsKLSAgICAgIGZvciAobiA9IDA7IG4gPCAzICYmIG9wLT5hcmdbbl0gIT0gQV9FTkQ7IG4rKykgCi0JewotCSAgaWYgKG4gJiYgb3AtPmFyZ1sxXSAhPSBBX0VORCkKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiLCIpOwotCSAgc3dpdGNoIChvcC0+YXJnW25dKSAKLQkgICAgewotCSAgICBjYXNlIEFfSU1NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiMlZCIsIChjaGFyKShpbW0pKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9JTkNfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkKyIsIHJuKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ERUNfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJALXIlZCIsIHJuKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9JTkRfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkIiwgcm4pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RJU1BfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQCglZCxyJWQpIiwgaW1tLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiciVkIiwgcm0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5DX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCsiLCBybSk7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfREVDX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQC1yJWQiLCBybSk7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5EX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCIsIHJtKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAoJWQsciVkKSIsIGltbSwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1JFR19COgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIlZF9iYW5rIiwgcmIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfRElTUF9QQzoKLQkgICAgICBkaXNwX3BjID0gMTsKLQkgICAgICBkaXNwX3BjX2FkZHIgPSBpbW0gKyA0ICsgKG1lbWFkZHIgJiByZWxtYXNrKTsKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGRpc3BfcGNfYWRkciwgaW5mbyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQChyMCxyJWQpIiwgcm4pOwotCSAgICAgIGJyZWFrOyAKLQkgICAgY2FzZSBBX0lORF9SMF9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKHIwLHIlZCkiLCBybSk7Ci0JICAgICAgYnJlYWs7IAotCSAgICBjYXNlIEFfRElTUF9HQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQCglZCxnYnIpIixpbW0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUjBfR0JSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAocjAsZ2JyKSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfQkRJU1AxMjoKLQkgICAgY2FzZSBBX0JESVNQODoKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGltbSArIG1lbWFkZHIsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfU1I6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0dCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJnYnIiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1ZCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ2YnIiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NTUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJzc3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NQQzoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJzcGMiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX01BQ0g6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAibWFjaCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfTUFDTDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0gLCJtYWNsIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9QUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJwciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfU0dSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNnciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfREJSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImRiciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZEX1JFR19OOgotCSAgICAgIGlmICgwKQotCQlnb3RvIGRfcmVnX247Ci0JICAgIGNhc2UgRl9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnIlZCIsIHJtKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEWF9SRUdfTjoKLQkgICAgICBpZiAocm4gJiAxKQotCQl7Ci0JCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAieGQlZCIsIHJuICYgfjEpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIGRfcmVnX246Ci0JICAgIGNhc2UgRF9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJkciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERYX1JFR19NOgotCSAgICAgIGlmIChybSAmIDEpCi0JCXsKLQkJICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4ZCVkIiwgcm0gJiB+MSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgY2FzZSBEX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImRyJWQiLCBybSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRlBTQ1JfTToKLQkgICAgY2FzZSBGUFNDUl9OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZwc2NyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRlBVTF9NOgotCSAgICBjYXNlIEZQVUxfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmcHVsIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRl9GUjA6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnIwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVl9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmdiVkIiwgcm4qNCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVl9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmdiVkIiwgcm0qNCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgWE1UUlhfTTQ6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAieG10cngiKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JfQotCi0jaWYgMAotICAgICAgLyogVGhpcyBjb2RlIHByaW50cyBpbnN0cnVjdGlvbnMgaW4gZGVsYXkgc2xvdHMgb24gdGhlIHNhbWUgbGluZQotICAgICAgICAgYXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIG5lZWRzIHRoZSBkZWxheSBzbG90cy4gIFRoaXMgY2FuIGJlCi0gICAgICAgICBjb25mdXNpbmcsIHNpbmNlIG90aGVyIGRpc2Fzc2VtYmxlciBkb24ndCB3b3JrIHRoaXMgd2F5LCBhbmQKLSAgICAgICAgIGl0IG1lYW5zIHRoYXQgdGhlIGluc3RydWN0aW9ucyBhcmUgbm90IGFsbCBpbiBhIGxpbmUuICBTbyBJCi0gICAgICAgICBkaXNhYmxlZCBpdC4gIElhbi4gICovCi0gICAgICBpZiAoIShpbmZvLT5mbGFncyAmIDEpCi0JICAmJiAob3AtPm5hbWVbMF0gPT0gJ2onCi0JICAgICAgfHwgKG9wLT5uYW1lWzBdID09ICdiJwotCQkgICYmIChvcC0+bmFtZVsxXSA9PSAncicgCi0JCSAgICAgIHx8IG9wLT5uYW1lWzFdID09ICdzJykpCi0JICAgICAgfHwgKG9wLT5uYW1lWzBdID09ICdyJyAmJiBvcC0+bmFtZVsxXSA9PSAndCcpCi0JICAgICAgfHwgKG9wLT5uYW1lWzBdID09ICdiJyAmJiBvcC0+bmFtZVsyXSA9PSAnLicpKSkKLQl7Ci0JICBpbmZvLT5mbGFncyB8PSAxOwotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiXHQoc2xvdCAiKTsKLQkgIHByaW50X2luc25fc2h4IChtZW1hZGRyICsgMiwgaW5mbyk7Ci0JICBpbmZvLT5mbGFncyAmPSB+MTsKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIikiKTsKLQkgIHJldHVybiA0OwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoZGlzcF9wYyAmJiBzdHJjbXAgKG9wLT5uYW1lLCAibW92YSIpICE9IDApCi0JewotCSAgaW50IHNpemU7Ci0JICBiZmRfYnl0ZSBieXRlc1s0XTsKLQotCSAgaWYgKHJlbG1hc2sgPT0gfiAoYmZkX3ZtYSkgMSkKLQkgICAgc2l6ZSA9IDI7Ci0JICBlbHNlCi0JICAgIHNpemUgPSA0OwotCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoZGlzcF9wY19hZGRyLCBieXRlcywgc2l6ZSwgaW5mbyk7Ci0JICBpZiAoc3RhdHVzID09IDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgdmFsOwotCi0JICAgICAgaWYgKHNpemUgPT0gMikKLQkJewotCQkgIGlmICgoaW5mby0+ZmxhZ3MgJiBMSVRUTEVfQklUKSAhPSAwKQotCQkgICAgdmFsID0gYmZkX2dldGwxNiAoYnl0ZXMpOwotCQkgIGVsc2UKLQkJICAgIHZhbCA9IGJmZF9nZXRiMTYgKGJ5dGVzKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoaW5mby0+ZmxhZ3MgJiBMSVRUTEVfQklUKSAhPSAwKQotCQkgICAgdmFsID0gYmZkX2dldGwzMiAoYnl0ZXMpOwotCQkgIGVsc2UKLQkJICAgIHZhbCA9IGJmZF9nZXRiMzIgKGJ5dGVzKTsKLQkJfQotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIlx0ISAweCV4IiwgdmFsKTsKLQkgICAgfQotCX0KLQotICAgICAgcmV0dXJuIDI7Ci0gICAgZmFpbDoKLSAgICAgIDsKLQotICAgIH0KLSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiLndvcmQgMHgleCV4JXgleCIsIG5pYnNbMF0sIG5pYnNbMV0sIG5pYnNbMl0sIG5pYnNbM10pOwotICByZXR1cm4gMjsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9zaGwgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCByOwotCi0gIGluZm8tPmZsYWdzID0gTElUVExFX0JJVDsKLSAgciA9IHByaW50X2luc25fc2h4IChtZW1hZGRyLCBpbmZvKTsKLSAgcmV0dXJuIHI7Ci19Ci0KLWludCAKLXByaW50X2luc25fc2ggKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCByOwotCi0gIGluZm8tPmZsYWdzID0gMDsKLSAgciA9IHByaW50X2luc25fc2h4IChtZW1hZGRyLCBpbmZvKTsKLSAgcmV0dXJuIHI7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3NoLW9wYy5oIGIvb3Bjb2Rlcy9zaC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxYWFlNS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NoLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8qIERlZmluaXRpb25zIGZvciBTSCBvcGNvZGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi10eXBlZGVmIGVudW0gewotCUhFWF8wLAotCUhFWF8xLAotCUhFWF8yLAotCUhFWF8zLAotCUhFWF80LAotCUhFWF81LAotCUhFWF82LAotCUhFWF83LAotCUhFWF84LAotCUhFWF85LAotCUhFWF9BLAotCUhFWF9CLAotCUhFWF9DLAotCUhFWF9ELAotCUhFWF9FLAotCUhFWF9GLAotCVJFR19OLAotCVJFR19NLAotCVJFR19OTSwKLSAgICAgICAgUkVHX0IsCi0JQlJBTkNIXzEyLAotCUJSQU5DSF84LAotCURJU1BfOCwKLQlESVNQXzQsCi0JSU1NXzQsCi0JSU1NXzRCWTIsCi0JSU1NXzRCWTQsCi0JUENSRUxJTU1fOEJZMiwKLQlQQ1JFTElNTV84Qlk0LAotCUlNTV84LAotCUlNTV84QlkyLAotCUlNTV84Qlk0Ci19IHNoX25pYmJsZV90eXBlOwotCi10eXBlZGVmIGVudW0gewotCUFfRU5ELAotCUFfQkRJU1AxMiwKLQlBX0JESVNQOCwKLQlBX0RFQ19NLAotCUFfREVDX04sCi0JQV9ESVNQX0dCUiwKLQlBX0RJU1BfUEMsCi0JQV9ESVNQX1JFR19NLAotCUFfRElTUF9SRUdfTiwKLQlBX0dCUiwKLQlBX0lNTSwKLQlBX0lOQ19NLAotCUFfSU5DX04sCi0JQV9JTkRfTSwKLQlBX0lORF9OLAotCUFfSU5EX1IwX1JFR19NLAotCUFfSU5EX1IwX1JFR19OLAotCUFfTUFDSCwKLQlBX01BQ0wsCi0JQV9QUiwKLQlBX1IwLAotCUFfUjBfR0JSLAotCUFfUkVHX00sCi0JQV9SRUdfTiwKLQlBX1JFR19CLAotCUFfU1IsCi0JQV9WQlIsCi0JQV9TU1IsCi0JQV9TUEMsCi0JQV9TR1IsCi0JQV9EQlIsCi0JRl9SRUdfTiwKLQlGX1JFR19NLAotCURfUkVHX04sCi0JRF9SRUdfTSwKLQlYX1JFR19OLCAvKiBPbmx5IHVzZWQgZm9yIGFyZ3VtZW50IHBhcnNpbmcgKi8KLQlYX1JFR19NLCAvKiBPbmx5IHVzZWQgZm9yIGFyZ3VtZW50IHBhcnNpbmcgKi8KLQlEWF9SRUdfTiwKLQlEWF9SRUdfTSwKLQlWX1JFR19OLAotCVZfUkVHX00sCi0JRkRfUkVHX04sCi0JWE1UUlhfTTQsCi0JRl9GUjAsCi0JRlBVTF9OLAotCUZQVUxfTSwKLQlGUFNDUl9OLAotCUZQU0NSX00KLX0gc2hfYXJnX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqbmFtZTsKLSAgc2hfYXJnX3R5cGUgYXJnWzRdOwotICBzaF9uaWJibGVfdHlwZSBuaWJibGVzWzRdOwotfSBzaF9vcGNvZGVfaW5mbzsKLQotI2lmZGVmIERFRklORV9UQUJMRQotCi1zaF9vcGNvZGVfaW5mbyBzaF90YWJsZVtdID0gewotCi0vKiAwMTExbm5ubmk4KjEuLi4uIGFkZCAjPGltbT4sPFJFR19OPiAgKi97ImFkZCIse0FfSU1NLEFfUkVHX059LHtIRVhfNyxSRUdfTixJTU1fOH19LAotCi0vKiAwMDExbm5ubm1tbW0xMTAwIGFkZCA8UkVHX00+LDxSRUdfTj4gKi97ImFkZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfQ319LAotCi0vKiAwMDExbm5ubm1tbW0xMTEwIGFkZGMgPFJFR19NPiw8UkVHX04+Ki97ImFkZGMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0V9fSwKLQotLyogMDAxMW5ubm5tbW1tMTExMSBhZGR2IDxSRUdfTT4sPFJFR19OPioveyJhZGR2Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9GfX0sCi0KLS8qIDExMDAxMDAxaTgqMS4uLi4gYW5kICM8aW1tPixSMCAgICAgICAqL3siYW5kIix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF85LElNTV84fX0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMDEgYW5kIDxSRUdfTT4sPFJFR19OPiAqL3siYW5kIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF85fX0sCi0KLS8qIDExMDAxMTAxaTgqMS4uLi4gYW5kLmIgIzxpbW0+LEAoUjAsR0JSKSoveyJhbmQuYiIse0FfSU1NLEFfUjBfR0JSfSx7SEVYX0MsSEVYX0QsSU1NXzh9fSwKLQotLyogMTAxMGkxMi4uLi4uLi4uLiBicmEgPGJkaXNwMTI+ICAgICAgICoveyJicmEiLHtBX0JESVNQMTJ9LHtIRVhfQSxCUkFOQ0hfMTJ9fSwKLQotLyogMTAxMWkxMi4uLi4uLi4uLiBic3IgPGJkaXNwMTI+ICAgICAgICoveyJic3IiLHtBX0JESVNQMTJ9LHtIRVhfQixCUkFOQ0hfMTJ9fSwKLQotLyogMTAwMDEwMDFpOHAxLi4uLiBidCA8YmRpc3A4PiAgICAgICAgICoveyJidCIse0FfQkRJU1A4fSx7SEVYXzgsSEVYXzksQlJBTkNIXzh9fSwKLQotLyogMTAwMDEwMTFpOHAxLi4uLiBiZiA8YmRpc3A4PiAgICAgICAgICoveyJiZiIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0IsQlJBTkNIXzh9fSwKLQotLyogMTAwMDExMDFpOHAxLi4uLiBidC5zIDxiZGlzcDg+ICAgICAgICoveyJidC5zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRCxCUkFOQ0hfOH19LAotCi0vKiAxMDAwMTEwMWk4cDEuLi4uIGJ0L3MgPGJkaXNwOD4gICAgICAgKi97ImJ0L3MiLHtBX0JESVNQOH0se0hFWF84LEhFWF9ELEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMTExaThwMS4uLi4gYmYucyA8YmRpc3A4PiAgICAgICAqL3siYmYucyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0YsQlJBTkNIXzh9fSwKLQotLyogMTAwMDExMTFpOHAxLi4uLiBiZi9zIDxiZGlzcDg+ICAgICAgICoveyJiZi9zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRixCUkFOQ0hfOH19LAotCi0vKiAwMDAwMDAwMDAwMTAxMDAwIGNscm1hYyAgICAgICAgICAgICAgKi97ImNscm1hYyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMixIRVhfOH19LAotCi0vKiAwMDAwMDAwMDAxMDAxMDAwIGNscnMgICAgICAgICAgICAgICAgKi97ImNscnMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzQsSEVYXzh9fSwKLQotLyogMDAwMDAwMDAwMDAwMTAwMCBjbHJ0ICAgICAgICAgICAgICAgICoveyJjbHJ0Iix7MH0se0hFWF8wLEhFWF8wLEhFWF8wLEhFWF84fX0sCi0KLS8qIDEwMDAxMDAwaTgqMS4uLi4gY21wL2VxICM8aW1tPixSMCAgICAqL3siY21wL2VxIix7QV9JTU0sQV9SMH0se0hFWF84LEhFWF84LElNTV84fX0sCi0KLS8qIDAwMTFubm5ubW1tbTAwMDAgY21wL2VxIDxSRUdfTT4sPFJFR19OPioveyJjbXAvZXEiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzB9fSwKLQotLyogMDAxMW5ubm5tbW1tMDAxMSBjbXAvZ2UgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9nZSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfM319LAotCi0vKiAwMDExbm5ubm1tbW0wMTExIGNtcC9ndCA8UkVHX00+LDxSRUdfTj4qL3siY21wL2d0Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDAwMTFubm5ubW1tbTAxMTAgY21wL2hpIDxSRUdfTT4sPFJFR19OPioveyJjbXAvaGkiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMDAxMW5ubm5tbW1tMDAxMCBjbXAvaHMgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9ocyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfMn19LAotCi0vKiAwMTAwbm5ubjAwMDEwMTAxIGNtcC9wbCA8UkVHX04+ICAgICAgKi97ImNtcC9wbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfNX19LAotCi0vKiAwMTAwbm5ubjAwMDEwMDAxIGNtcC9weiA8UkVHX04+ICAgICAgKi97ImNtcC9weiIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfMX19LAotCi0vKiAwMDEwbm5ubm1tbW0xMTAwIGNtcC9zdHIgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9zdHIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDAxMG5ubm5tbW1tMDExMSBkaXYwcyA8UkVHX00+LDxSRUdfTj4qL3siZGl2MHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMDAwMDAwMDAwMDAxMTAwMSBkaXYwdSAgICAgICAgICAgICAgICoveyJkaXYwdSIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMSxIRVhfOX19LAotCi0vKiAwMDExbm5ubm1tbW0wMTAwIGRpdjEgPFJFR19NPiw8UkVHX04+Ki97ImRpdjEiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzR9fSwKLQotLyogMDExMG5ubm5tbW1tMTExMCBleHRzLmIgPFJFR19NPiw8UkVHX04+Ki97ImV4dHMuYiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRX19LAotCi0vKiAwMTEwbm5ubm1tbW0xMTExIGV4dHMudyA8UkVHX00+LDxSRUdfTj4qL3siZXh0cy53Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9GfX0sCi0KLS8qIDAxMTBubm5ubW1tbTExMDAgZXh0dS5iIDxSRUdfTT4sPFJFR19OPioveyJleHR1LmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDExMG5ubm5tbW1tMTEwMSBleHR1LncgPFJFR19NPiw8UkVHX04+Ki97ImV4dHUudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRH19LAotCi0vKiAwMTAwbm5ubjAwMTAxMDExIGptcCBAPFJFR19OPiAgICAgICAgKi97ImptcCIse0FfSU5EX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfQn19LAotCi0vKiAwMTAwbm5ubjAwMDAxMDExIGpzciBAPFJFR19OPiAgICAgICAgKi97ImpzciIse0FfSU5EX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfQn19LAotCi0vKiAwMTAwbm5ubjAwMDAxMTEwIGxkYyA8UkVHX04+LFNSICAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TUn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMDAwMTExMTAgbGRjIDxSRUdfTj4sR0JSICAgICAqL3sibGRjIix7QV9SRUdfTixBX0dCUn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMDAxMDExMTAgbGRjIDxSRUdfTj4sVkJSICAgICAqL3sibGRjIix7QV9SRUdfTixBX1ZCUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMDAxMTExMTAgbGRjIDxSRUdfTj4sU1NSICAgICAqL3sibGRjIix7QV9SRUdfTixBX1NTUn0se0hFWF80LFJFR19OLEhFWF8zLEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMDEwMDExMTAgbGRjIDxSRUdfTj4sU1BDICAgICAqL3sibGRjIix7QV9SRUdfTixBX1NQQ30se0hFWF80LFJFR19OLEhFWF80LEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMDExMTExMTAgbGRjIDxSRUdfTj4sREJSICAgICAqL3sibGRjIix7QV9SRUdfTixBX0RCUn0se0hFWF80LFJFR19OLEhFWF83LEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMXh4eDExMTAgbGRjIDxSRUdfTj4sUm5fQkFOSyAqL3sibGRjIix7QV9SRUdfTixBX1JFR19CfSx7SEVYXzQsUkVHX04sUkVHX0IsSEVYX0V9fSwKLQotLyogMDEwMG5ubm4wMDAwMDExMSBsZGMubCBAPFJFR19OPissU1IgICoveyJsZGMubCIse0FfSU5DX04sQV9TUn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDAwMTAxMTEgbGRjLmwgQDxSRUdfTj4rLEdCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfR0JSfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMDEwMDExMSBsZGMubCBAPFJFR19OPissVkJSICoveyJsZGMubCIse0FfSU5DX04sQV9WQlJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfN319LAotCi0vKiAwMTAwbm5ubjAwMTEwMTExIGxkYy5sIEA8UkVHX04+KyxTU1IgKi97ImxkYy5sIix7QV9JTkNfTixBX1NTUn0se0hFWF80LFJFR19OLEhFWF8zLEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDEwMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFNQQyAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1BDfSx7SEVYXzQsUkVHX04sSEVYXzQsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMTExMDExMSBsZGMubCBAPFJFR19OPissREJSICoveyJsZGMubCIse0FfSU5DX04sQV9EQlJ9LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfN319LAotCi0vKiAwMTAwbm5ubjF4eHgwMTExIGxkYy5sIDxSRUdfTj4sUm5fQkFOSyAqL3sibGRjLmwiLHtBX0lOQ19OLEFfUkVHX0J9LHtIRVhfNCxSRUdfTixSRUdfQixIRVhfN319LAotCi0vKiAwMTAwbm5ubjAwMDAxMDEwIGxkcyA8UkVHX04+LE1BQ0ggICAgKi97ImxkcyIse0FfUkVHX04sQV9NQUNIfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYX0F9fSwKLQotLyogMDEwMG5ubm4wMDAxMTAxMCBsZHMgPFJFR19OPixNQUNMICAgICoveyJsZHMiLHtBX1JFR19OLEFfTUFDTH0se0hFWF80LFJFR19OLEhFWF8xLEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDAxMDEwMTAgbGRzIDxSRUdfTj4sUFIgICAgICAqL3sibGRzIix7QV9SRUdfTixBX1BSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYX0F9fSwKLQotLyogMDEwMG5ubm4wMTAxMTAxMCBsZHMgPFJFR19OPixGUFVMICAgICoveyJsZHMiLHtBX1JFR19NLEZQVUxfTn0se0hFWF80LFJFR19NLEhFWF81LEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDExMDEwMTAgbGRzIDxSRUdfTT4sRlBTQ1IgICAqL3sibGRzIix7QV9SRUdfTSxGUFNDUl9OfSx7SEVYXzQsUkVHX00sSEVYXzYsSEVYX0F9fSwKLQotLyogMDEwMG5ubm4wMDAwMDExMCBsZHMubCBAPFJFR19OPissTUFDSCoveyJsZHMubCIse0FfSU5DX04sQV9NQUNIfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzZ9fSwKLQotLyogMDEwMG5ubm4wMDAxMDExMCBsZHMubCBAPFJFR19OPissTUFDTCoveyJsZHMubCIse0FfSU5DX04sQV9NQUNMfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzZ9fSwKLQotLyogMDEwMG5ubm4wMDEwMDExMCBsZHMubCBAPFJFR19OPissUFIgICoveyJsZHMubCIse0FfSU5DX04sQV9QUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF82fX0sCi0KLS8qIDAxMDBubm5uMDEwMTAxMTAgbGRzLmwgQDxSRUdfTT4rLEZQVUwqL3sibGRzLmwiLHtBX0lOQ19NLEZQVUxfTn0se0hFWF80LFJFR19NLEhFWF81LEhFWF82fX0sCi0KLS8qIDAxMDBubm5uMDExMDAxMTAgbGRzLmwgQDxSRUdfTT4rLEZQU0NSKi97Imxkcy5sIix7QV9JTkNfTSxGUFNDUl9OfSx7SEVYXzQsUkVHX00sSEVYXzYsSEVYXzZ9fSwKLQotLyogMDAwMDAwMDAwMDExMTAwMCBsZHRsYiAgICAgICAgICAgICAgICoveyJsZHRsYiIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMyxIRVhfOH19LAotCi0vKiAwMTAwbm5ubm1tbW0xMTExIG1hYy53IEA8UkVHX00+KyxAPFJFR19OPisqL3sibWFjLnciLHtBX0lOQ19NLEFfSU5DX059LHtIRVhfNCxSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAxMTEwbm5ubmk4KjEuLi4uIG1vdiAjPGltbT4sPFJFR19OPiAgKi97Im1vdiIse0FfSU1NLEFfUkVHX059LHtIRVhfRSxSRUdfTixJTU1fOH19LAotCi0vKiAwMTEwbm5ubm1tbW0wMDExIG1vdiA8UkVHX00+LDxSRUdfTj4gKi97Im1vdiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfM319LAotCi0vKiAwMDAwbm5ubm1tbW0wMTAwIG1vdi5iIDxSRUdfTT4sQChSMCw8UkVHX04+KSoveyJtb3YuYiIseyBBX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzR9fSwKLQotLyogMDAxMG5ubm5tbW1tMDEwMCBtb3YuYiA8UkVHX00+LEAtPFJFR19OPioveyJtb3YuYiIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNH19LAotCi0vKiAwMDEwbm5ubm1tbW0wMDAwIG1vdi5iIDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LmIiLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzB9fSwKLQotLyogMTAwMDAxMDBtbW1taTQqMSBtb3YuYiBAKDxkaXNwPiw8UkVHX00+KSxSMCoveyJtb3YuYiIse0FfRElTUF9SRUdfTSxBX1IwfSx7SEVYXzgsSEVYXzQsUkVHX00sSU1NXzR9fSwKLQotLyogMTEwMDAxMDBpOCoxLi4uLiBtb3YuYiBAKDxkaXNwPixHQlIpLFIwKi97Im1vdi5iIix7QV9ESVNQX0dCUixBX1IwfSx7SEVYX0MsSEVYXzQsSU1NXzh9fSwKLQotLyogMDAwMG5ubm5tbW1tMTEwMCBtb3YuYiBAKFIwLDxSRUdfTT4pLDxSRUdfTj4qL3sibW92LmIiLHtBX0lORF9SMF9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDExMG5ubm5tbW1tMDEwMCBtb3YuYiBAPFJFR19NPissPFJFR19OPioveyJtb3YuYiIse0FfSU5DX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDAxMTBubm5ubW1tbTAwMDAgbW92LmIgQDxSRUdfTT4sPFJFR19OPioveyJtb3YuYiIse0FfSU5EX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF8wfX0sCi0KLS8qIDEwMDAwMDAwbW1tbWk0KjEgbW92LmIgUjAsQCg8ZGlzcD4sPFJFR19NPikqL3sibW92LmIiLHtBX1IwLEFfRElTUF9SRUdfTX0se0hFWF84LEhFWF8wLFJFR19NLElNTV80fX0sCi0KLS8qIDExMDAwMDAwaTgqMS4uLi4gbW92LmIgUjAsQCg8ZGlzcD4sR0JSKSoveyJtb3YuYiIse0FfUjAsQV9ESVNQX0dCUn0se0hFWF9DLEhFWF8wLElNTV84fX0sCi0KLS8qIDAwMDFubm5ubW1tbWk0KjQgbW92LmwgPFJFR19NPixAKDxkaXNwPiw8UkVHX04+KSoveyJtb3YubCIseyBBX1JFR19NLEFfRElTUF9SRUdfTn0se0hFWF8xLFJFR19OLFJFR19NLElNTV80Qlk0fX0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMTAgbW92LmwgPFJFR19NPixAKFIwLDxSRUdfTj4pKi97Im1vdi5sIix7IEFfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAwMDEwbm5ubm1tbW0wMTEwIG1vdi5sIDxSRUdfTT4sQC08UkVHX04+Ki97Im1vdi5sIix7IEFfUkVHX00sQV9ERUNfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDAwMTBubm5ubW1tbTAwMTAgbW92LmwgPFJFR19NPixAPFJFR19OPioveyJtb3YubCIseyBBX1JFR19NLEFfSU5EX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfMn19LAotCi0vKiAwMTAxbm5ubm1tbW1pNCo0IG1vdi5sIEAoPGRpc3A+LDxSRUdfTT4pLDxSRUdfTj4qL3sibW92LmwiLHtBX0RJU1BfUkVHX00sQV9SRUdfTn0se0hFWF81LFJFR19OLFJFR19NLElNTV80Qlk0fX0sCi0KLS8qIDExMDAwMTEwaTgqNC4uLi4gbW92LmwgQCg8ZGlzcD4sR0JSKSxSMCoveyJtb3YubCIse0FfRElTUF9HQlIsQV9SMH0se0hFWF9DLEhFWF82LElNTV84Qlk0fX0sCi0KLS8qIDExMDFubm5uaThwNC4uLi4gbW92LmwgQCg8ZGlzcD4sUEMpLDxSRUdfTj4qL3sibW92LmwiLHtBX0RJU1BfUEMsQV9SRUdfTn0se0hFWF9ELFJFR19OLFBDUkVMSU1NXzhCWTR9fSwKLQotLyogMDAwMG5ubm5tbW1tMTExMCBtb3YubCBAKFIwLDxSRUdfTT4pLDxSRUdfTj4qL3sibW92LmwiLHtBX0lORF9SMF9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0V9fSwKLQotLyogMDExMG5ubm5tbW1tMDExMCBtb3YubCBAPFJFR19NPissPFJFR19OPioveyJtb3YubCIse0FfSU5DX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDAxMTBubm5ubW1tbTAwMTAgbW92LmwgQDxSRUdfTT4sPFJFR19OPioveyJtb3YubCIse0FfSU5EX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF8yfX0sCi0KLS8qIDExMDAwMDEwaTgqNC4uLi4gbW92LmwgUjAsQCg8ZGlzcD4sR0JSKSoveyJtb3YubCIse0FfUjAsQV9ESVNQX0dCUn0se0hFWF9DLEhFWF8yLElNTV84Qlk0fX0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMDEgbW92LncgPFJFR19NPixAKFIwLDxSRUdfTj4pKi97Im1vdi53Iix7IEFfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfNX19LAotCi0vKiAwMDEwbm5ubm1tbW0wMTAxIG1vdi53IDxSRUdfTT4sQC08UkVHX04+Ki97Im1vdi53Iix7IEFfUkVHX00sQV9ERUNfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF81fX0sCi0KLS8qIDAwMTBubm5ubW1tbTAwMDEgbW92LncgPFJFR19NPixAPFJFR19OPioveyJtb3YudyIseyBBX1JFR19NLEFfSU5EX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfMX19LAotCi0vKiAxMDAwMDEwMW1tbW1pNCoyIG1vdi53IEAoPGRpc3A+LDxSRUdfTT4pLFIwKi97Im1vdi53Iix7QV9ESVNQX1JFR19NLEFfUjB9LHtIRVhfOCxIRVhfNSxSRUdfTSxJTU1fNEJZMn19LAotCi0vKiAxMTAwMDEwMWk4KjIuLi4uIG1vdi53IEAoPGRpc3A+LEdCUiksUjAqL3sibW92LnciLHtBX0RJU1BfR0JSLEFfUjB9LHtIRVhfQyxIRVhfNSxJTU1fOEJZMn19LAotCi0vKiAxMDAxbm5ubmk4cDIuLi4uIG1vdi53IEAoPGRpc3A+LFBDKSw8UkVHX04+Ki97Im1vdi53Iix7QV9ESVNQX1BDLEFfUkVHX059LHtIRVhfOSxSRUdfTixQQ1JFTElNTV84QlkyfX0sCi0KLS8qIDAwMDBubm5ubW1tbTExMDEgbW92LncgQChSMCw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi53Iix7QV9JTkRfUjBfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9EfX0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMDEgbW92LncgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LnciLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNX19LAotCi0vKiAwMTEwbm5ubm1tbW0wMDAxIG1vdi53IEA8UkVHX00+LDxSRUdfTj4qL3sibW92LnciLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMX19LAotCi0vKiAxMDAwMDAwMW1tbW1pNCoyIG1vdi53IFIwLEAoPGRpc3A+LDxSRUdfTT4pKi97Im1vdi53Iix7QV9SMCxBX0RJU1BfUkVHX019LHtIRVhfOCxIRVhfMSxSRUdfTSxJTU1fNEJZMn19LAotCi0vKiAxMTAwMDAwMWk4KjIuLi4uIG1vdi53IFIwLEAoPGRpc3A+LEdCUikqL3sibW92LnciLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMSxJTU1fOEJZMn19LAotCi0vKiAxMTAwMDExMWk4cDQuLi4uIG1vdmEgQCg8ZGlzcD4sUEMpLFIwKi97Im1vdmEiLHtBX0RJU1BfUEMsQV9SMH0se0hFWF9DLEhFWF83LFBDUkVMSU1NXzhCWTR9fSwKLS8qIDAwMDBubm5uMTEwMDAwMTEgbW92Y2EubCBSMCxAPFJFR19OPiAqL3sibW92Y2EubCIse0FfUjAsQV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF9DLEhFWF8zfX0sCi0KLQotLyogMDAwMG5ubm4wMDEwMTAwMSBtb3Z0IDxSRUdfTj4gICAgICAgICoveyJtb3Z0Iix7QV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8yLEhFWF85fX0sCi0KLS8qIDAwMTBubm5ubW1tbTExMTEgbXVscyA8UkVHX00+LDxSRUdfTj4qL3sibXVscyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAwMDAwbm5ubm1tbW0wMTExIG11bC5sIDxSRUdfTT4sPFJFR19OPioveyJtdWwubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAwMDEwbm5ubm1tbW0xMTEwIG11bHUgPFJFR19NPiw8UkVHX04+Ki97Im11bHUiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0V9fSwKLQotLyogMDExMG5ubm5tbW1tMTAxMSBuZWcgPFJFR19NPiw8UkVHX04+ICoveyJuZWciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0J9fSwKLQotLyogMDExMG5ubm5tbW1tMTAxMCBuZWdjIDxSRUdfTT4sPFJFR19OPioveyJuZWdjIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9BfX0sCi0KLS8qIDAwMDAwMDAwMDAwMDEwMDEgbm9wICAgICAgICAgICAgICAgICAqL3sibm9wIix7MH0se0hFWF8wLEhFWF8wLEhFWF8wLEhFWF85fX0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMTEgbm90IDxSRUdfTT4sPFJFR19OPiAqL3sibm90Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF83fX0sCi0vKiAwMDAwbm5ubjEwMDEwMDExIG9jYmkgQDxSRUdfTj4gICAgICAgKi97Im9jYmkiLHtBX0lORF9OfSx7SEVYXzAsUkVHX04sSEVYXzksSEVYXzN9fSwKLQotLyogMDAwMG5ubm4xMDEwMDAxMSBvY2JwIEA8UkVHX04+ICAgICAgICoveyJvY2JwIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF9BLEhFWF8zfX0sCi0KLS8qIDAwMDBubm5uMTAxMTAwMTEgb2Nid2IgQDxSRUdfTj4gICAgICAqL3sib2Nid2IiLHtBX0lORF9OfSx7SEVYXzAsUkVHX04sSEVYX0IsSEVYXzN9fSwKLQotCi0vKiAxMTAwMTAxMWk4KjEuLi4uIG9yICM8aW1tPixSMCAgICAgICAgKi97Im9yIix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF9CLElNTV84fX0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMTEgb3IgPFJFR19NPiw8UkVHX04+ICAqL3sib3IiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0J9fSwKLQotLyogMTEwMDExMTFpOCoxLi4uLiBvci5iICM8aW1tPixAKFIwLEdCUikqL3sib3IuYiIse0FfSU1NLEFfUjBfR0JSfSx7SEVYX0MsSEVYX0YsSU1NXzh9fSwKLQotLyogMDAwMG5ubm4xMDAwMDAxMSBwcmVmIEA8UkVHX04+ICAgICAgICoveyJwcmVmIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF84LEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMDAgcm90Y2wgPFJFR19OPiAgICAgICAqL3sicm90Y2wiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzR9fSwKLQotLyogMDEwMG5ubm4wMDEwMDEwMSByb3RjciA8UkVHX04+ICAgICAgICoveyJyb3RjciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfNX19LAotCi0vKiAwMTAwbm5ubjAwMDAwMTAwIHJvdGwgPFJFR19OPiAgICAgICAgKi97InJvdGwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzR9fSwKLQotLyogMDEwMG5ubm4wMDAwMDEwMSByb3RyIDxSRUdfTj4gICAgICAgICoveyJyb3RyIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF81fX0sCi0KLS8qIDAwMDAwMDAwMDAxMDEwMTEgcnRlICAgICAgICAgICAgICAgICAqL3sicnRlIix7MH0se0hFWF8wLEhFWF8wLEhFWF8yLEhFWF9CfX0sCi0KLS8qIDAwMDAwMDAwMDAwMDEwMTEgcnRzICAgICAgICAgICAgICAgICAqL3sicnRzIix7MH0se0hFWF8wLEhFWF8wLEhFWF8wLEhFWF9CfX0sCi0KLS8qIDAwMDAwMDAwMDEwMTEwMDAgc2V0cyAgICAgICAgICAgICAgICAqL3sic2V0cyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfNSxIRVhfOH19LAotLyogMDAwMDAwMDAwMDAxMTAwMCBzZXR0ICAgICAgICAgICAgICAgICoveyJzZXR0Iix7MH0se0hFWF8wLEhFWF8wLEhFWF8xLEhFWF84fX0sCi0KLS8qIDAxMDBubm5ubW1tbTExMDAgc2hhZCA8UkVHX00+LDxSRUdfTj4qL3sic2hhZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNCxSRUdfTixSRUdfTSxIRVhfQ319LAotCi0vKiAwMTAwbm5ubm1tbW0xMTAxIHNobGQgPFJFR19NPiw8UkVHX04+Ki97InNobGQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0R9fSwKLQotLyogMDEwMG5ubm4wMDEwMDAwMCBzaGFsIDxSRUdfTj4gICAgICAgICoveyJzaGFsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8wfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAwMDEgc2hhciA8UkVHX04+ICAgICAgICAqL3sic2hhciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfMX19LAotCi0vKiAwMTAwbm5ubjAwMDAwMDAwIHNobGwgPFJFR19OPiAgICAgICAgKi97InNobGwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzB9fSwKLQotLyogMDEwMG5ubm4wMDEwMTAwMCBzaGxsMTYgPFJFR19OPiAgICAgICoveyJzaGxsMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzh9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAwMCBzaGxsMiA8UkVHX04+ICAgICAgICoveyJzaGxsMiIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfOH19LAotCi0vKiAwMTAwbm5ubjAwMDExMDAwIHNobGw4IDxSRUdfTj4gICAgICAgKi97InNobGw4Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF84fX0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMDEgc2hsciA8UkVHX04+ICAgICAgICAqL3sic2hsciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMX19LAotCi0vKiAwMTAwbm5ubjAwMTAxMDAxIHNobHIxNiA8UkVHX04+ICAgICAgKi97InNobHIxNiIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfOX19LAotCi0vKiAwMTAwbm5ubjAwMDAxMDAxIHNobHIyIDxSRUdfTj4gICAgICAgKi97InNobHIyIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF85fX0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMDEgc2hscjggPFJFR19OPiAgICAgICAqL3sic2hscjgiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzl9fSwKLQotLyogMDAwMDAwMDAwMDAxMTAxMSBzbGVlcCAgICAgICAgICAgICAgICoveyJzbGVlcCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMSxIRVhfQn19LAotCi0vKiAwMDAwbm5ubjAwMDAwMDEwIHN0YyBTUiw8UkVHX04+ICAgICAgKi97InN0YyIse0FfU1IsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8wLEhFWF8yfX0sCi0KLS8qIDAwMDBubm5uMDAwMTAwMTAgc3RjIEdCUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9HQlIsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8xLEhFWF8yfX0sCi0KLS8qIDAwMDBubm5uMDAxMDAwMTAgc3RjIFZCUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9WQlIsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8yLEhFWF8yfX0sCi0KLS8qIDAwMDBubm5uMDAxMTAwMTAgc3RjIFNTUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9TU1IsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8zLEhFWF8yfX0sCi0KLS8qIDAwMDBubm5uMDEwMDAwMTAgc3RjIFNQQyw8UkVHX04+ICAgICAqL3sic3RjIix7QV9TUEMsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF80LEhFWF8yfX0sCi0KLS8qIDAwMDBubm5uMDExMDAwMTAgc3RjIFNHUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9TR1IsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF82LEhFWF8yfX0sCi0KLS8qIDAwMDBubm5uMDExMTAwMTAgc3RjIERCUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9EQlIsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF83LEhFWF8yfX0sCi0KLS8qIDAwMDBubm5uMXh4eDAwMTIgc3RjIFJuX0JBTkssPFJFR19OPiAqL3sic3RjIix7QV9SRUdfQixBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX0IsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMDAwMDAxMSBzdGMubCBTUixALTxSRUdfTj4gICoveyJzdGMubCIse0FfU1IsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDAwMTAwMTEgc3RjLmwgR0JSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX0dCUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMDEwMDAxMSBzdGMubCBWQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfVkJSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMTEwMDExIHN0Yy5sIFNTUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9TU1IsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8zLEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDEwMDAwMTEgc3RjLmwgU1BDLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1NQQyxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzQsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMTEwMDAxMSBzdGMubCBTR1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU0dSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfM319LAotCi0vKiAwMTAwbm5ubjAxMTEwMDExIHN0Yy5sIERCUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9EQlIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF83LEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMXh4eDAwMTIgc3RjLmwgUm5fQkFOSyxALTxSRUdfTj4gKi97InN0Yy5sIix7QV9SRUdfQixBX0RFQ19OfSx7SEVYXzQsUkVHX04sUkVHX0IsSEVYXzN9fSwKLQotLyogMDAwMG5ubm4wMDAwMTAxMCBzdHMgTUFDSCw8UkVHX04+ICAgICoveyJzdHMiLHtBX01BQ0gsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8wLEhFWF9BfX0sCi0KLS8qIDAwMDBubm5uMDAwMTEwMTAgc3RzIE1BQ0wsPFJFR19OPiAgICAqL3sic3RzIix7QV9NQUNMLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMSxIRVhfQX19LAotCi0vKiAwMDAwbm5ubjAwMTAxMDEwIHN0cyBQUiw8UkVHX04+ICAgICAgKi97InN0cyIse0FfUFIsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8yLEhFWF9BfX0sCi0KLS8qIDAwMDBubm5uMDEwMTEwMTAgc3RzIEZQVUwsPFJFR19OPiAgICAqL3sic3RzIix7RlBVTF9NLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNSxIRVhfQX19LAotCi0vKiAwMDAwbm5ubjAxMTAxMDEwIHN0cyBGUFNDUiw8UkVHX04+ICAgKi97InN0cyIse0ZQU0NSX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF82LEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMTAgc3RzLmwgTUFDSCxALTxSRUdfTj4qL3sic3RzLmwiLHtBX01BQ0gsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMDAwMTAwMTAgc3RzLmwgTUFDTCxALTxSRUdfTj4qL3sic3RzLmwiLHtBX01BQ0wsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAwMTAgc3RzLmwgUFIsQC08UkVHX04+ICAqL3sic3RzLmwiLHtBX1BSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfMn19LAotCi0vKiAwMTAwbm5ubjAxMDEwMDEwIHN0cy5sIEZQVUwsQC08UkVHX04+Ki97InN0cy5sIix7RlBVTF9NLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNSxIRVhfMn19LAotCi0vKiAwMTAwbm5ubjAxMTAwMDEwIHN0cy5sIEZQU0NSLEAtPFJFR19OPioveyJzdHMubCIse0ZQU0NSX00sQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF82LEhFWF8yfX0sCi0KLS8qIDAwMTFubm5ubW1tbTEwMDAgc3ViIDxSRUdfTT4sPFJFR19OPiAqL3sic3ViIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDAwMTFubm5ubW1tbTEwMTAgc3ViYyA8UkVHX00+LDxSRUdfTj4qL3sic3ViYyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAwMDExbm5ubm1tbW0xMDExIHN1YnYgPFJFR19NPiw8UkVHX04+Ki97InN1YnYiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0J9fSwKLQotLyogMDExMG5ubm5tbW1tMTAwMCBzd2FwLmIgPFJFR19NPiw8UkVHX04+Ki97InN3YXAuYiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfOH19LAotCi0vKiAwMTEwbm5ubm1tbW0xMDAxIHN3YXAudyA8UkVHX00+LDxSRUdfTj4qL3sic3dhcC53Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF85fX0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMTEgdGFzLmIgQDxSRUdfTj4gICAgICAqL3sidGFzLmIiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYX0J9fSwKLQotLyogMTEwMDAwMTFpOCoxLi4uLiB0cmFwYSAjPGltbT4gICAgICAgICoveyJ0cmFwYSIse0FfSU1NfSx7SEVYX0MsSEVYXzMsSU1NXzh9fSwKLQotLyogMTEwMDEwMDBpOCoxLi4uLiB0c3QgIzxpbW0+LFIwICAgICAgICoveyJ0c3QiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYXzgsSU1NXzh9fSwKLQotLyogMDAxMG5ubm5tbW1tMTAwMCB0c3QgPFJFR19NPiw8UkVHX04+ICoveyJ0c3QiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzh9fSwKLQotLyogMTEwMDExMDBpOCoxLi4uLiB0c3QuYiAjPGltbT4sQChSMCxHQlIpKi97InRzdC5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfQyxJTU1fOH19LAotCi0vKiAxMTAwMTAxMGk4KjEuLi4uIHhvciAjPGltbT4sUjAgICAgICAgKi97InhvciIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfQSxJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMDEwIHhvciA8UkVHX00+LDxSRUdfTj4gKi97InhvciIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAxMTAwMTExMGk4KjEuLi4uIHhvci5iICM8aW1tPixAKFIwLEdCUikqL3sieG9yLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9FLElNTV84fX0sCi0KLS8qIDAwMTBubm5ubW1tbTExMDEgeHRyY3QgPFJFR19NPiw8UkVHX04+Ki97Inh0cmN0Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9EfX0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMTEgbXVsLmwgPFJFR19NPiw8UkVHX04+Ki97Im11bC5sIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDAwMTAwMDAgZHQgPFJFR19OPiAgICAgICAgICAqL3siZHQiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzB9fSwKLQotLyogMDAxMW5ubm5tbW1tMTEwMSBkbXVscy5sIDxSRUdfTT4sPFJFR19OPioveyJkbXVscy5sIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9EfX0sCi0KLS8qIDAwMTFubm5ubW1tbTAxMDEgZG11bHUubCA8UkVHX00+LDxSRUdfTj4qL3siZG11bHUubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfNX19LAotCi0vKiAwMDAwbm5ubm1tbW0xMTExIG1hYy5sIEA8UkVHX00+KyxAPFJFR19OPisqL3sibWFjLmwiLHtBX0lOQ19NLEFfSU5DX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAwMDAwbm5ubjAwMTAwMDExIGJyYWYgPFJFR19OPiAgICAgICAqL3siYnJhZiIse0FfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfM319LAotCi0vKiAwMDAwbm5ubjAwMDAwMDExIGJzcmYgPFJFR19OPiAgICAgICAqL3siYnNyZiIse0FfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMCxIRVhfM319LAotCi0vKiAxMTExbm5ubjAxMDExMTAxIGZhYnMgPEZfUkVHX04+ICAgICAqL3siZmFicyIse0ZEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzUsSEVYX0R9fSwKLQotLyogMTExMW5ubm5tbW1tMDAwMCBmYWRkIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZmFkZCIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8wfX0sCi0vKiAxMTExbm5uMG1tbTAwMDAwIGZhZGQgPERfUkVHX00+LDxEX1JFR19OPioveyJmYWRkIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzB9fSwKLQotLyogMTExMW5ubm5tbW1tMDEwMCBmY21wL2VxIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZmNtcC9lcSIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF80fX0sCi0vKiAxMTExbm5uMG1tbTAwMTAwIGZjbXAvZXEgPERfUkVHX00+LDxEX1JFR19OPioveyJmY21wL2VxIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzR9fSwKLQotLyogMTExMW5ubm5tbW1tMDEwMSBmY21wL2d0IDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZmNtcC9ndCIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF81fX0sCi0vKiAxMTExbm5uMG1tbTAwMTAxIGZjbXAvZ3QgPERfUkVHX00+LDxEX1JFR19OPioveyJmY21wL2d0Iix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzV9fSwKLQotLyogMTExMW5ubjAxMDExMTEwMSBmY252ZHMgPERfUkVHX04+LEZQVUwqL3siZmNudmRzIix7RF9SRUdfTixGUFVMX019LHtIRVhfRixSRUdfTixIRVhfQixIRVhfRH19LAotCi0vKiAxMTExbm5uMDEwMTAxMTAxIGZjbnZzZCBGUFVMLDxEX1JFR19OPioveyJmY252c2QiLHtGUFVMX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF9BLEhFWF9EfX0sCi0KLS8qIDExMTFubm5ubW1tbTAwMTEgZmRpdiA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZkaXYiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfM319LAotLyogMTExMW5ubjBtbW0wMDAxMSBmZGl2IDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmRpdiIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8zfX0sCi0KLS8qIDExMTFubm1tMTExMDExMDEgZmlwciA8Vl9SRUdfTT4sPFZfUkVHX04+Ki97ImZpcHIiLHtWX1JFR19NLFZfUkVHX059LHtIRVhfRixSRUdfTk0sSEVYX0UsSEVYX0R9fSwKLQotLyogMTExMW5ubm4xMDAwMTEwMSBmbGRpMCA8Rl9SRUdfTj4gICAgKi97ImZsZGkwIix7Rl9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF84LEhFWF9EfX0sCi0KLS8qIDExMTFubm5uMTAwMTExMDEgZmxkaTEgPEZfUkVHX04+ICAgICoveyJmbGRpMSIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfOSxIRVhfRH19LAotCi0vKiAxMTExbm5ubjAwMDExMTAxIGZsZHMgPEZfUkVHX04+LEZQVUwqL3siZmxkcyIse0ZfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYXzEsSEVYX0R9fSwKLQotLyogMTExMW5ubm4wMDEwMTEwMSBmbG9hdCBGUFVMLDxGRF9SRUdfTj4qL3siZmxvYXQiLHtGUFVMX00sRkRfUkVHX059LHtIRVhfRixSRUdfTixIRVhfMixIRVhfRH19LAotCi0vKiAxMTExbm5ubm1tbW0xMTEwIGZtYWMgRlIwLDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZm1hYyIse0ZfRlIwLEZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDExMTFubm5ubW1tbTExMDAgZm1vdiA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZtb3YiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQ319LAotLyogMTExMW5ubm5tbW1tMTEwMCBmbW92IDxEWF9SRUdfTT4sPERYX1JFR19OPioveyJmbW92Iix7RFhfUkVHX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQ319LAotCi0vKiAxMTExbm5ubm1tbW0xMDAwIGZtb3YgQDxSRUdfTT4sPEZfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOH19LAotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92IEA8UkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdiIse0FfSU5EX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOH19LAotCi0vKiAxMTExbm5ubm1tbW0xMDEwIGZtb3YgPEZfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YiLHtGX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX19LAotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92IDxEWF9SRUdfTT4sQDxSRUdfTj4qL3siZm1vdiIse0RYX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YgQDxSRUdfTT4rLDxGX1JFR19OPioveyJmbW92Iix7QV9JTkNfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzl9fSwKLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdiBAPFJFR19NPissPERYX1JFR19OPioveyJmbW92Iix7QV9JTkNfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTEgZm1vdiA8Rl9SRUdfTT4sQC08UkVHX04+Ki97ImZtb3YiLHtGX1JFR19NLEFfREVDX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQn19LAotLyogMTExMW5ubm5tbW1tMTAxMSBmbW92IDxEWF9SRUdfTT4sQC08UkVHX04+Ki97ImZtb3YiLHtEWF9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMCBmbW92IEAoUjAsPFJFR19NPiksPEZfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9SMF9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzZ9fSwKLS8qIDExMTFubm5ubW1tbTAxMTAgZm1vdiBAKFIwLDxSRUdfTT4pLDxEWF9SRUdfTj4qL3siZm1vdiIse0FfSU5EX1IwX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMSBmbW92IDxGX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YiLHtGX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9fSwKLS8qIDExMTFubm5ubW1tbTAxMTEgZm1vdiA8RFhfUkVHX00+LEAoUjAsPFJFR19OPikqL3siZm1vdiIse0RYX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92LmQgQDxSRUdfTT4sPERYX1JFR19OPioveyJmbW92LmQiLHtBX0lORF9NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9fSwKLQotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92LmQgPERYX1JFR19NPixAPFJFR19OPioveyJmbW92LmQiLHtEWF9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMSBmbW92LmQgQDxSRUdfTT4rLDxEWF9SRUdfTj4qL3siZm1vdi5kIix7QV9JTkNfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTEgZm1vdi5kIDxEWF9SRUdfTT4sQC08UkVHX04+Ki97ImZtb3YuZCIse0RYX1JFR19NLEFfREVDX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQn19LAotCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YuZCBAKFIwLDxSRUdfTT4pLDxEWF9SRUdfTj4qL3siZm1vdi5kIix7QV9JTkRfUjBfUkVHX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YuZCA8RFhfUkVHX00+LEAoUjAsPFJFR19OPikqL3siZm1vdi5kIix7RFhfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAxMTExbm5ubm1tbW0xMDAwIGZtb3YucyBAPFJFR19NPiw8Rl9SRUdfTj4qL3siZm1vdi5zIix7QV9JTkRfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9fSwKLQotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92LnMgPEZfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YucyIse0ZfUkVHX00sQV9JTkRfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9BfX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdi5zIEA8UkVHX00+Kyw8Rl9SRUdfTj4qL3siZm1vdi5zIix7QV9JTkNfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzl9fSwKLQotLyogMTExMW5ubm5tbW1tMTAxMSBmbW92LnMgPEZfUkVHX00+LEAtPFJFR19OPioveyJmbW92LnMiLHtGX1JFR19NLEFfREVDX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQn19LAotCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YucyBAKFIwLDxSRUdfTT4pLDxGX1JFR19OPioveyJmbW92LnMiLHtBX0lORF9SMF9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMSBmbW92LnMgPEZfUkVHX00+LEAoUjAsPFJFR19OPikqL3siZm1vdi5zIix7Rl9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDExMTFubm5ubW1tbTAwMTAgZm11bCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZtdWwiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMn19LAotLyogMTExMW5ubjBtbW0wMDAxMCBmbXVsIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZm11bCIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8yfX0sCi0KLS8qIDExMTFubm5uMDEwMDExMDEgZm5lZyA8RkRfUkVHX04+ICAgICAqL3siZm5lZyIse0ZEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzQsSEVYX0R9fSwKLQotLyogMTExMTEwMTExMTExMTEwMSBmcmNoZyAgICAgICAgICAgICAgICoveyJmcmNoZyIsezB9LHtIRVhfRixIRVhfQixIRVhfRixIRVhfRH19LAotCi0vKiAxMTExMDAxMTExMTExMTAxIGZzY2hnICAgICAgICAgICAgICAgKi97ImZzY2hnIix7MH0se0hFWF9GLEhFWF8zLEhFWF9GLEhFWF9EfX0sCi0KLS8qIDExMTFubm5uMDExMDExMDEgZnNxcnQgPEZEX1JFR19OPiAgICAqL3siZnNxcnQiLHtGRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF82LEhFWF9EfX0sCi0KLS8qIDExMTFubm5uMDAwMDExMDEgZnN0cyBGUFVMLDxGX1JFR19OPioveyJmc3RzIix7RlBVTF9NLEZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfMCxIRVhfRH19LAotCi0vKiAxMTExbm5ubm1tbW0wMDAxIGZzdWIgPEZfUkVHX00+LDxGX1JFR19OPioveyJmc3ViIix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzF9fSwKLS8qIDExMTFubm4wbW1tMDAwMDEgZnN1YiA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZzdWIiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMX19LAotCi0vKiAxMTExbm5ubjAwMTExMTAxIGZ0cmMgPEZEX1JFR19OPixGUFVMKi97ImZ0cmMiLHtGRF9SRUdfTixGUFVMX019LHtIRVhfRixSRUdfTixIRVhfMyxIRVhfRH19LAotCi0vKiAxMTExbm4wMTExMTExMTAxIGZ0cnYgWE1UUlhfTTQsPFZfUkVHX24+Ki97ImZ0cnYiLHtYTVRSWF9NNCxWX1JFR19OfSx7SEVYX0YsUkVHX05NLEhFWF9GLEhFWF9EfX0sCi0KLXsgMCB9IAotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL3NwYXJjLWRpcy5jIGIvb3Bjb2Rlcy9zcGFyYy1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3NWIyOC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NwYXJjLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY5ICswLDAgQEAKLS8qIFByaW50IFNQQVJDIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEJpdG1hc2sgb2YgdjkgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIE1BU0tfVjkgKCgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5KSBcCi0JCSB8ICgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkpCi0vKiAxIGlmIElOU04gaXMgZm9yIHY5IG9ubHkuICAqLwotI2RlZmluZSBWOV9PTkxZX1AoaW5zbikgKCEgKChpbnNuKS0+YXJjaGl0ZWN0dXJlICYgfk1BU0tfVjkpKQotLyogMSBpZiBJTlNOIGlzIGZvciB2OS4gICovCi0jZGVmaW5lIFY5X1AoaW5zbikgKCgoaW5zbiktPmFyY2hpdGVjdHVyZSAmIE1BU0tfVjkpICE9IDApCi0KLS8qIFRoZSBzb3J0ZWQgb3Bjb2RlIHRhYmxlLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqc29ydGVkX29wY29kZXM7Ci0KLS8qIEZvciBmYXN0ZXIgbG9va3VwLCBhZnRlciBpbnNucyBhcmUgc29ydGVkIHRoZXkgYXJlIGhhc2hlZC4gICovCi0vKiA/Pz8gSSB0aGluayB0aGVyZSBpcyByb29tIGZvciBldmVuIG1vcmUgaW1wcm92ZW1lbnQuICAqLwotCi0jZGVmaW5lIEhBU0hfU0laRSAyNTYKLS8qIEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIG9ubHkgbG9vayBhdCBpbnNuIGNvZGUgYml0cyBhcyB0aGF0IGlzIGhvdyB0aGUKLSAgIG9wY29kZSB0YWJsZSBpcyBoYXNoZWQuICBPUENPREVfQklUUyBpcyBhIHRhYmxlIG9mIHZhbGlkIGJpdHMgZm9yIGVhY2gKLSAgIG9mIHRoZSBtYWluIHR5cGVzICgwLDEsMiwzKS4gICovCi1zdGF0aWMgaW50IG9wY29kZV9iaXRzWzRdID0geyAweDAxYzAwMDAwLCAweDAsIDB4MDFmODAwMDAsIDB4MDFmODAwMDAgfTsKLSNkZWZpbmUgSEFTSF9JTlNOKElOU04pIFwKLSAgKCgoKElOU04pID4+IDI0KSAmIDB4YzApIHwgKCgoSU5TTikgJiBvcGNvZGVfYml0c1soKElOU04pID4+IDMwKSAmIDNdKSA+PiAxOSkpCi1zdHJ1Y3Qgb3Bjb2RlX2hhc2ggewotICBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm5leHQ7Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wY29kZTsKLX07Ci1zdGF0aWMgc3RydWN0IG9wY29kZV9oYXNoICpvcGNvZGVfaGFzaF90YWJsZVtIQVNIX1NJWkVdOwotCi1zdGF0aWMgdm9pZCBidWlsZF9oYXNoX3RhYmxlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiosIHN0cnVjdCBvcGNvZGVfaGFzaCAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGlzX2RlbGF5ZWRfYnJhbmNoIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9vcGNvZGVzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgaW50IGNvbXB1dGVfYXJjaF9tYXNrIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLQotLyogU2lnbi1leHRlbmQgYSB2YWx1ZSB3aGljaCBpcyBOIGJpdHMgbG9uZy4gICovCi0jZGVmaW5lCVNFWCh2YWx1ZSwgYml0cykgXAotCSgoKChpbnQpKHZhbHVlKSkgPDwgKCg4ICogc2l6ZW9mIChpbnQpKSAtIGJpdHMpKQlcCi0JCQkgPj4gKCg4ICogc2l6ZW9mIChpbnQpKSAtIGJpdHMpICkKLQotc3RhdGljICBjaGFyICpyZWdfbmFtZXNbXSA9Ci17ICJnMCIsICJnMSIsICJnMiIsICJnMyIsICJnNCIsICJnNSIsICJnNiIsICJnNyIsCQotICAibzAiLCAibzEiLCAibzIiLCAibzMiLCAibzQiLCAibzUiLCAic3AiLCAibzciLAkKLSAgImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwJCi0gICJpMCIsICJpMSIsICJpMiIsICJpMyIsICJpNCIsICJpNSIsICJmcCIsICJpNyIsCQotICAiZjAiLCAiZjEiLCAiZjIiLCAiZjMiLCAiZjQiLCAiZjUiLCAiZjYiLCAiZjciLAkKLSAgImY4IiwgImY5IiwgImYxMCIsICJmMTEiLCAiZjEyIiwgImYxMyIsICJmMTQiLCAiZjE1IiwJCi0gICJmMTYiLCAiZjE3IiwgImYxOCIsICJmMTkiLCAiZjIwIiwgImYyMSIsICJmMjIiLCAiZjIzIiwKLSAgImYyNCIsICJmMjUiLCAiZjI2IiwgImYyNyIsICJmMjgiLCAiZjI5IiwgImYzMCIsICJmMzEiLAotICAiZjMyIiwgImYzMyIsICJmMzQiLCAiZjM1IiwgImYzNiIsICJmMzciLCAiZjM4IiwgImYzOSIsCQotICAiZjQwIiwgImY0MSIsICJmNDIiLCAiZjQzIiwgImY0NCIsICJmNDUiLCAiZjQ2IiwgImY0NyIsCQotICAiZjQ4IiwgImY0OSIsICJmNTAiLCAiZjUxIiwgImY1MiIsICJmNTMiLCAiZjU0IiwgImY1NSIsCi0gICJmNTYiLCAiZjU3IiwgImY1OCIsICJmNTkiLCAiZjYwIiwgImY2MSIsICJmNjIiLCAiZjYzIiwKLS8qIHBzciwgd2ltLCB0YnIsIGZwc3IsIGNwc3IgYXJlIHY4IG9ubHkuICAqLwotICAieSIsICJwc3IiLCAid2ltIiwgInRiciIsICJwYyIsICJucGMiLCAiZnBzciIsICJjcHNyIgotfTsKLQotI2RlZmluZQlmcmVnX25hbWVzCSgmcmVnX25hbWVzWzQgKiA4XSkKLQotLyogVGhlc2UgYXJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZXJlIHJlZ2lzdGVyIG51bWJlciBpbgotICAgcmRwciBhbmQgd3JwciBpbnNucy4gICovCi1zdGF0aWMgY2hhciAqdjlfcHJpdl9yZWdfbmFtZXNbXSA9Ci17Ci0gICJ0cGMiLCAidG5wYyIsICJ0c3RhdGUiLCAidHQiLCAidGljayIsICJ0YmEiLCAicHN0YXRlIiwgInRsIiwKLSAgInBpbCIsICJjd3AiLCAiY2Fuc2F2ZSIsICJjYW5yZXN0b3JlIiwgImNsZWFud2luIiwgIm90aGVyd2luIiwKLSAgIndzdGF0ZSIsICJmcSIKLSAgLyogInZlciIgLSBzcGVjaWFsIGNhc2VkICovCi19OwotCi0vKiBUaGVzZSBhcmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlcmUgcmVnaXN0ZXIgbnVtYmVyIGluCi0gICByZCBhbmQgd3IgaW5zbnMgKC0xNikuICAqLwotc3RhdGljIGNoYXIgKnY5YV9hc3JfcmVnX25hbWVzW10gPQotewotICAicGNyIiwgInBpYyIsICJkY3IiLCAiZ3NyIiwgInNldF9zb2Z0aW50IiwgImNsZWFyX3NvZnRpbnQiLAotICAic29mdGludCIsICJ0aWNrX2NtcHIiCi19OwotCi0vKiBNYWNyb3MgdXNlZCB0byBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcy4gIE5vdCBhbGwgZmllbGRzIGhhdmUKLSAgIG1hY3JvcyBkZWZpbmVkIGhlcmUsIG9ubHkgdGhvc2Ugd2hpY2ggYXJlIGFjdHVhbGx5IHVzZWQuICAqLwotCi0jZGVmaW5lIFhfUkQoaSkgKCgoaSkgPj4gMjUpICYgMHgxZikKLSNkZWZpbmUgWF9SUzEoaSkgKCgoaSkgPj4gMTQpICYgMHgxZikKLSNkZWZpbmUgWF9MRFNUX0koaSkgKCgoaSkgPj4gMTMpICYgMSkKLSNkZWZpbmUgWF9BU0koaSkgKCgoaSkgPj4gNSkgJiAweGZmKQotI2RlZmluZSBYX1JTMihpKSAoKChpKSA+PiAwKSAmIDB4MWYpCi0jZGVmaW5lIFhfSU1NKGksbikgKCgoaSkgPj4gMCkgJiAoKDEgPDwgKG4pKSAtIDEpKQotI2RlZmluZSBYX1NJTU0oaSxuKSBTRVggKFhfSU1NICgoaSksIChuKSksIChuKSkKLSNkZWZpbmUgWF9ESVNQMjIoaSkgKCgoaSkgPj4gMCkgJiAweDNmZmZmZikKLSNkZWZpbmUgWF9JTU0yMihpKSBYX0RJU1AyMiAoaSkKLSNkZWZpbmUgWF9ESVNQMzAoaSkgKCgoaSkgPj4gMCkgJiAweDNmZmZmZmZmKQotCi0vKiBUaGVzZSBhcmUgZm9yIHY5LiAgKi8KLSNkZWZpbmUgWF9ESVNQMTYoaSkgKCgoKChpKSA+PiAyMCkgJiAzKSA8PCAxNCkgfCAoKChpKSA+PiAwKSAmIDB4M2ZmZikpCi0jZGVmaW5lIFhfRElTUDE5KGkpICgoKGkpID4+IDApICYgMHg3ZmZmZikKLSNkZWZpbmUgWF9NRU1CQVIoaSkgKChpKSAmIDB4N2YpCi0KLS8qIEhlcmUgaXMgdGhlIHVuaW9uIHdoaWNoIHdhcyB1c2VkIHRvIGV4dHJhY3QgaW5zdHJ1Y3Rpb24gZmllbGRzCi0gICBiZWZvcmUgdGhlIHNoaWZ0IGFuZCBtYXNrIG1hY3JvcyB3ZXJlIHdyaXR0ZW4uCi0KLSAgIHVuaW9uIHNwYXJjX2luc24KLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGNvZGU7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOwotCSAgICNkZWZpbmUJb3AJbGRzdC5hbm9wCi0JICAgdW5zaWduZWQgaW50IGFucmQ6NTsKLQkgICAjZGVmaW5lCXJkCWxkc3QuYW5yZAotCSAgIHVuc2lnbmVkIGludCBvcDM6NjsKLQkgICB1bnNpZ25lZCBpbnQgYW5yczE6NTsKLQkgICAjZGVmaW5lCXJzMQlsZHN0LmFucnMxCi0JICAgdW5zaWduZWQgaW50IGk6MTsKLQkgICB1bnNpZ25lZCBpbnQgYW5hc2k6ODsKLQkgICAjZGVmaW5lCWFzaQlsZHN0LmFuYXNpCi0JICAgdW5zaWduZWQgaW50IGFucnMyOjU7Ci0JICAgI2RlZmluZQlyczIJbGRzdC5hbnJzMgotCSAgICNkZWZpbmUJc2hjbnQJcnMyCi0JIH0gbGRzdDsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjIsIGFucmQ6NSwgb3AzOjYsIGFucnMxOjUsIGk6MTsKLQkgICB1bnNpZ25lZCBpbnQgSU1NMTM6MTM7Ci0JICAgI2RlZmluZQlpbW0xMwlJTU0xMy5JTU0xMwotCSB9IElNTTEzOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYToxOwotCSAgIHVuc2lnbmVkIGludCBjb25kOjQ7Ci0JICAgdW5zaWduZWQgaW50IG9wMjozOwotCSAgIHVuc2lnbmVkIGludCBESVNQMjI6MjI7Ci0JICAgI2RlZmluZQlkaXNwMjIJYnJhbmNoLkRJU1AyMgotCSAgICNkZWZpbmUJaW1tMjIJZGlzcDIyCi0JIH0gYnJhbmNoOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYToxOwotCSAgIHVuc2lnbmVkIGludCB6OjE7Ci0JICAgdW5zaWduZWQgaW50IHJjb25kOjM7Ci0JICAgdW5zaWduZWQgaW50IG9wMjozOwotCSAgIHVuc2lnbmVkIGludCBESVNQMTZISToyOwotCSAgIHVuc2lnbmVkIGludCBwOjE7Ci0JICAgdW5zaWduZWQgaW50IF9yczE6NTsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDE2TE86MTQ7Ci0JIH0gYnJhbmNoMTY7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOwotCSAgIHVuc2lnbmVkIGludCBhZGlzcDMwOjMwOwotCSAgICNkZWZpbmUJZGlzcDMwCWNhbGwuYWRpc3AzMAotCSB9IGNhbGw7Ci0gICAgIH07Ci0KLSAgICovCi0KLS8qIE5vbnplcm8gaWYgSU5TTiBpcyB0aGUgb3Bjb2RlIGZvciBhIGRlbGF5ZWQgYnJhbmNoLiAgKi8KLXN0YXRpYyBpbnQKLWlzX2RlbGF5ZWRfYnJhbmNoIChpbnNuKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci17Ci0gIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3A7Ci0KLSAgZm9yIChvcCA9IG9wY29kZV9oYXNoX3RhYmxlW0hBU0hfSU5TTiAoaW5zbildOyBvcDsgb3AgPSBvcC0+bmV4dCkKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcGNvZGUgPSBvcC0+b3Bjb2RlOwotICAgICAgaWYgKChvcGNvZGUtPm1hdGNoICYgaW5zbikgPT0gb3Bjb2RlLT5tYXRjaAotCSAgJiYgKG9wY29kZS0+bG9zZSAmIGluc24pID09IDApCi0JcmV0dXJuIChvcGNvZGUtPmZsYWdzICYgRl9ERUxBWUVEKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBleHRlcm4gdm9pZCBxc29ydCAoKTsgKi8KLQotLyogUmVjb3JkcyBjdXJyZW50IG1hc2sgb2YgU1BBUkNfT1BDT0RFX0FSQ0hfRk9PIHZhbHVlcywgdXNlZCB0byBwYXNzIHZhbHVlCi0gICB0byBjb21wYXJlX29wY29kZXMuICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjdXJyZW50X2FyY2hfbWFzazsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gTUVNQUREUiBvbiBJTkZPLT5TVFJFQU0uCi0KLSAgIFdlIHN1ZmZpeCB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCBhIGNvbW1lbnQgdGhhdCBnaXZlcyB0aGUgYWJzb2x1dGUKLSAgIGFkZHJlc3MgaW52b2x2ZWQsIGFzIHdlbGwgYXMgaXRzIHN5bWJvbGljIGZvcm0sIGlmIHRoZSBpbnN0cnVjdGlvbgotICAgaXMgcHJlY2VkZWQgYnkgYSBmaW5kYWJsZSBgc2V0aGknIGFuZCBpdCBlaXRoZXIgYWRkcyBhbiBpbW1lZGlhdGUKLSAgIGRpc3BsYWNlbWVudCB0byB0aGF0IHJlZ2lzdGVyLCBvciBpdCBpcyBhbiBgYWRkJyBvciBgb3InIGluc3RydWN0aW9uCi0gICBvbiB0aGF0IHJlZ2lzdGVyLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX3NwYXJjIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIEZJTEUgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHJlZ2lzdGVyIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3A7Ci0gIC8qIE5vbnplcm8gb2Ygb3Bjb2RlIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgKi8KLSAgc3RhdGljIGludCBvcGNvZGVzX2luaXRpYWxpemVkID0gMDsKLSAgLyogYmZkIG1hY2ggbnVtYmVyIG9mIGxhc3QgY2FsbC4gICovCi0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfbWFjaCA9IDA7Ci0gIGJmZF92bWEgKCpnZXR3b3JkKSBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLQotICBpZiAoIW9wY29kZXNfaW5pdGlhbGl6ZWQKLSAgICAgIHx8IGluZm8tPm1hY2ggIT0gY3VycmVudF9tYWNoKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBjdXJyZW50X2FyY2hfbWFzayA9IGNvbXB1dGVfYXJjaF9tYXNrIChpbmZvLT5tYWNoKTsKLQotICAgICAgaWYgKCFvcGNvZGVzX2luaXRpYWxpemVkKQotCXNvcnRlZF9vcGNvZGVzID0gKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiopCi0JICB4bWFsbG9jIChzcGFyY19udW1fb3Bjb2RlcyAqIHNpemVvZiAoc3RydWN0IHNwYXJjX29wY29kZSAqKSk7Ci0gICAgICAvKiBSZXNldCB0aGUgc29ydGVkIHRhYmxlIHNvIHdlIGNhbiByZXNvcnQgaXQuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IHNwYXJjX251bV9vcGNvZGVzOyArK2kpCi0Jc29ydGVkX29wY29kZXNbaV0gPSAmc3BhcmNfb3Bjb2Rlc1tpXTsKLSAgICAgIHFzb3J0ICgoY2hhciAqKSBzb3J0ZWRfb3Bjb2Rlcywgc3BhcmNfbnVtX29wY29kZXMsCi0JICAgICBzaXplb2YgKHNvcnRlZF9vcGNvZGVzWzBdKSwgY29tcGFyZV9vcGNvZGVzKTsKLQotICAgICAgYnVpbGRfaGFzaF90YWJsZSAoc29ydGVkX29wY29kZXMsIG9wY29kZV9oYXNoX3RhYmxlLCBzcGFyY19udW1fb3Bjb2Rlcyk7Ci0gICAgICBjdXJyZW50X21hY2ggPSBpbmZvLT5tYWNoOwotICAgICAgb3Bjb2Rlc19pbml0aWFsaXplZCA9IDE7Ci0gICAgfQotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgLyogT24gU1BBUkNsaXRlIHZhcmlhbnRzIHN1Y2ggYXMgREFObGl0ZSAoc3BhcmM4NngpLCBpbnN0cnVjdGlvbnMKLSAgICAgYXJlIGFsd2F5cyBiaWctZW5kaWFuIGV2ZW4gd2hlbiB0aGUgbWFjaGluZSBpcyBpbiBsaXR0bGUtZW5kaWFuIG1vZGUuICovCi0gIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUpCi0gICAgZ2V0d29yZCA9IGJmZF9nZXRiMzI7Ci0gIGVsc2UKLSAgICBnZXR3b3JkID0gYmZkX2dldGwzMjsKLQotICBpbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQotICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAxOwkJCS8qIFdlIGRvIHJldHVybiB0aGlzIGluZm8gKi8KLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmJyYW5jaDsJCS8qIEFzc3VtZSBub24gYnJhbmNoIGluc24gKi8KLSAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMDsJCQkvKiBBc3N1bWUgbm8gZGVsYXkgKi8KLSAgaW5mby0+dGFyZ2V0ID0gMDsJCQkJLyogQXNzdW1lIG5vIHRhcmdldCBrbm93biAqLwotCi0gIGZvciAob3AgPSBvcGNvZGVfaGFzaF90YWJsZVtIQVNIX0lOU04gKGluc24pXTsgb3A7IG9wID0gb3AtPm5leHQpCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IHNwYXJjX29wY29kZSAqb3Bjb2RlID0gb3AtPm9wY29kZTsKLQotICAgICAgLyogSWYgdGhlIGluc24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSwgc2tpcCBpdC4gICovCi0gICAgICBpZiAoISAob3Bjb2RlLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgob3Bjb2RlLT5tYXRjaCAmIGluc24pID09IG9wY29kZS0+bWF0Y2gKLQkgICYmIChvcGNvZGUtPmxvc2UgJiBpbnNuKSA9PSAwKQotCXsKLQkgIC8qIE5vbnplcm8gbWVhbnMgdGhhdCB3ZSBoYXZlIGZvdW5kIGFuIGluc3RydWN0aW9uIHdoaWNoIGhhcwotCSAgICAgdGhlIGVmZmVjdCBvZiBhZGRpbmcgb3Igb3InaW5nIHRoZSBpbW0xMyBmaWVsZCB0byByczEuICAqLwotCSAgaW50IGltbV9hZGRlZF90b19yczEgPSAwOwotCi0JICAvKiBOb256ZXJvIG1lYW5zIHRoYXQgd2UgaGF2ZSBmb3VuZCBhIHBsdXMgc2lnbiBpbiB0aGUgYXJncwotCSAgICAgZmllbGQgb2YgdGhlIG9wY29kZSB0YWJsZS4gICovCi0JICBpbnQgZm91bmRfcGx1cyA9IDA7Ci0JICAKLQkgIC8qIE5vbnplcm8gbWVhbnMgd2UgaGF2ZSBhbiBhbm51bGxlZCBicmFuY2guICAqLwotCSAgaW50IGlzX2FubnVsbGVkID0gMDsKLQotCSAgLyogRG8gd2UgaGF2ZSBhbiBgYWRkJyBvciBgb3InIGluc3RydWN0aW9uIGNvbWJpbmluZyBhbgotICAgICAgICAgICAgIGltbWVkaWF0ZSB3aXRoIHJzMT8gICovCi0JICBpZiAob3Bjb2RlLT5tYXRjaCA9PSAweDgwMTAyMDAwIHx8IG9wY29kZS0+bWF0Y2ggPT0gMHg4MDAwMjAwMCkKLQkgIC8qCQkJICAob3IpCQkJCSAoYWRkKSAgKi8KLQkgICAgaW1tX2FkZGVkX3RvX3JzMSA9IDE7Ci0KLQkgIGlmIChYX1JTMSAoaW5zbikgIT0gWF9SRCAoaW5zbikKLQkgICAgICAmJiBzdHJjaHIgKG9wY29kZS0+YXJncywgJ3InKSAhPSAwKQotCSAgICAgIC8qIENhbid0IGRvIHNpbXBsZSBmb3JtYXQgaWYgc291cmNlIGFuZCBkZXN0IGFyZSBkaWZmZXJlbnQuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgaWYgKFhfUlMyIChpbnNuKSAhPSBYX1JEIChpbnNuKQotCSAgICAgICYmIHN0cmNociAob3Bjb2RlLT5hcmdzLCAnTycpICE9IDApCi0JICAgICAgLyogQ2FuJ3QgZG8gc2ltcGxlIGZvcm1hdCBpZiBzb3VyY2UgYW5kIGRlc3QgYXJlIGRpZmZlcmVudC4gICovCi0JICAgICAgY29udGludWU7Ci0KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCBvcGNvZGUtPm5hbWUpOwotCi0JICB7Ci0JICAgIHJlZ2lzdGVyIENPTlNUIGNoYXIgKnM7Ci0KLQkgICAgaWYgKG9wY29kZS0+YXJnc1swXSAhPSAnLCcpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIgIik7Ci0JICAgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQotCSAgICAgIHsKLQkJd2hpbGUgKCpzID09ICcsJykKLQkJICB7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiwiKTsKLQkJICAgICsrczsKLQkJICAgIHN3aXRjaCAoKnMpIHsKLQkJICAgIGNhc2UgJ2EnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgImEiKTsKLQkJICAgICAgaXNfYW5udWxsZWQgPSAxOwotCQkgICAgICArK3M7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgY2FzZSAnTic6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAicG4iKTsKLQkJICAgICAgKytzOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnVCc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAicHQiKTsKLQkJICAgICAgKytzOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9CQkvKiBzd2l0Y2ggb24gYXJnICovCi0JCSAgfQkJLyogd2hpbGUgdGhlcmUgYXJlIGNvbW1hIHN0YXJ0ZWQgYXJncyAqLwotCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiICIpOwotCQkJCi0JCXN3aXRjaCAoKnMpCi0JCSAgewotCQkgIGNhc2UgJysnOgotCQkgICAgZm91bmRfcGx1cyA9IDE7Ci0KLQkJICAgIC8qIG5vdGUgZmFsbC10aHJvdWdoICovCi0JCSAgZGVmYXVsdDoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWMiLCAqcyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyMnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIwIik7Ci0JCSAgICBicmVhazsKLQotI2RlZmluZQlyZWcobikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwgcmVnX25hbWVzW25dKQotCQkgIGNhc2UgJzEnOgotCQkgIGNhc2UgJ3InOgotCQkgICAgcmVnIChYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICcyJzoKLQkJICBjYXNlICdPJzoKLQkJICAgIHJlZyAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZCc6Ci0JCSAgICByZWcgKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotI3VuZGVmCXJlZwotCi0jZGVmaW5lCWZyZWcobikJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIGZyZWdfbmFtZXNbbl0pCi0jZGVmaW5lCWZyZWd4KG4pCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIGZyZWdfbmFtZXNbKChuKSAmIH4xKSB8ICgoKG4pICYgMSkgPDwgNSldKQotCQkgIGNhc2UgJ2UnOgotCQkgICAgZnJlZyAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJ3YnOgkvKiBkb3VibGUvZXZlbiAqLwotCQkgIGNhc2UgJ1YnOgkvKiBxdWFkL211bHRpcGxlIG9mIDQgKi8KLQkJICAgIGZyZWd4IChYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdmJzoKLQkJICAgIGZyZWcgKFhfUlMyIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdCJzoJLyogZG91YmxlL2V2ZW4gKi8KLQkJICBjYXNlICdSJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCi0JCSAgICBmcmVneCAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZyc6Ci0JCSAgICBmcmVnIChYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdIJzoJLyogZG91YmxlL2V2ZW4gKi8KLQkJICBjYXNlICdKJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCi0JCSAgICBmcmVneCAoWF9SRCAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0jdW5kZWYJZnJlZwotI3VuZGVmCWZyZWd4Ci0KLSNkZWZpbmUJY3JlZyhuKQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYyV1IiwgKHVuc2lnbmVkIGludCkgKG4pKQotCQkgIGNhc2UgJ2InOgotCQkgICAgY3JlZyAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnYyc6Ci0JCSAgICBjcmVnIChYX1JTMiAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdEJzoKLQkJICAgIGNyZWcgKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotI3VuZGVmCWNyZWcKLQotCQkgIGNhc2UgJ2gnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWhpKCUjeCkiLAotCQkJCQkgICAoMHhGRkZGRkZGRgotCQkJCQkgICAgJiAoKGludCkgWF9JTU0yMiAoaW5zbikgPDwgMTApKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2knOgkvKiAxMyBiaXQgaW1tZWRpYXRlICovCi0JCSAgY2FzZSAnSSc6CS8qIDExIGJpdCBpbW1lZGlhdGUgKi8KLQkJICBjYXNlICdqJzoJLyogMTAgYml0IGltbWVkaWF0ZSAqLwotCQkgICAgewotCQkgICAgICBpbnQgaW1tOwotCi0JCSAgICAgIGlmICgqcyA9PSAnaScpCi0JCSAgICAgICAgaW1tID0gWF9TSU1NIChpbnNuLCAxMyk7Ci0JCSAgICAgIGVsc2UgaWYgKCpzID09ICdJJykKLQkJCWltbSA9IFhfU0lNTSAoaW5zbiwgMTEpOwotCQkgICAgICBlbHNlCi0JCQlpbW0gPSBYX1NJTU0gKGluc24sIDEwKTsKLQotCQkgICAgICAvKiBDaGVjayB0byBzZWUgd2hldGhlciB3ZSBoYXZlIGEgMStpLCBhbmQgdGFrZQotCQkJIG5vdGUgb2YgdGhhdCBmYWN0LgotCi0JCQkgTm90ZTogYmVjYXVzZSBvZiB0aGUgd2F5IHdlIHNvcnQgdGhlIHRhYmxlLAotCQkJIHdlIHdpbGwgYmUgbWF0Y2hpbmcgMStpIHJhdGhlciB0aGFuIGkrMSwKLQkJCSBzbyBpdCBpcyBPSyB0byBhc3N1bWUgdGhhdCBpIGlzIGFmdGVyICssCi0JCQkgbm90IGJlZm9yZSBpdC4gICovCi0JCSAgICAgIGlmIChmb3VuZF9wbHVzKQotCQkJaW1tX2FkZGVkX3RvX3JzMSA9IDE7Ci0JCSAgICAgIAotCQkgICAgICBpZiAoaW1tIDw9IDkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwgaW1tKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlI3giLCBpbW0pOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdYJzoJLyogNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0JCSAgY2FzZSAnWSc6CS8qIDYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotCQkgICAgewotCQkgICAgICBpbnQgaW1tID0gWF9JTU0gKGluc24sICpzID09ICdYJyA/IDUgOiA2KTsKLQotCQkgICAgICBpZiAoaW1tIDw9IDkpCi0JCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBpbW0pOwotCQkgICAgICBlbHNlCi0JCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSN4IiwgKHVuc2lnbmVkKSBpbW0pOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdLJzoKLQkJICAgIHsKLQkJICAgICAgaW50IG1hc2sgPSBYX01FTUJBUiAoaW5zbik7Ci0JCSAgICAgIGludCBiaXQgPSAweDQwLCBwcmludGVkX29uZSA9IDA7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICAgICAgaWYgKG1hc2sgPT0gMCkKLQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIwIik7Ci0JCSAgICAgIGVsc2UKLQkJCXdoaWxlIChiaXQpCi0JCQkgIHsKLQkJCSAgICBpZiAobWFzayAmIGJpdCkKLQkJCSAgICAgIHsKLQkJCQlpZiAocHJpbnRlZF9vbmUpCi0JCQkJICAoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAifCIpOwotCQkJCW5hbWUgPSBzcGFyY19kZWNvZGVfbWVtYmFyIChiaXQpOwotCQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkJCXByaW50ZWRfb25lID0gMTsKLQkJCSAgICAgIH0KLQkJCSAgICBiaXQgPj49IDE7Ci0JCQkgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBjYXNlICdrJzoKLQkJICAgIGluZm8tPnRhcmdldCA9IG1lbWFkZHIgKyBTRVggKFhfRElTUDE2IChpbnNuKSwgMTYpICogNDsKLQkJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRyc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AxOSAoaW5zbiksIDE5KSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJzYnOgotCQkgIGNhc2UgJzcnOgotCQkgIGNhc2UgJzgnOgotCQkgIGNhc2UgJzknOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWZjYyVjIiwgKnMgLSAnNicgKyAnMCcpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd6JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVpY2MiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnWic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUleGNjIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0UnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWNjciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdzJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmcHJzIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ28nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWFzaSIpOwotCQkgICAgYnJlYWs7Ci0JCSAgICAKLQkJICBjYXNlICdXJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV0aWNrIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ1AnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXBjIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJz8nOgotCQkgICAgaWYgKFhfUlMxIChpbnNuKSA9PSAzMSkKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXZlciIpOwotCQkgICAgZWxzZSBpZiAoKHVuc2lnbmVkKSBYX1JTMSAoaW5zbikgPCAxNikKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OV9wcml2X3JlZ19uYW1lc1tYX1JTMSAoaW5zbildKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXJlc2VydmVkIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyEnOgotCQkgICAgaWYgKCh1bnNpZ25lZCkgWF9SRCAoaW5zbikgPCAxNSkKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OV9wcml2X3JlZ19uYW1lc1tYX1JEIChpbnNuKV0pOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnLyc6Ci0JCSAgICBpZiAoWF9SUzEgKGluc24pIDwgMTYgfHwgWF9SUzEgKGluc24pID4gMjMpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAotCQkJCQkgICAgIHY5YV9hc3JfcmVnX25hbWVzW1hfUlMxIChpbnNuKS0xNl0pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdfJzoKLQkJICAgIGlmIChYX1JEIChpbnNuKSA8IDE2IHx8IFhfUkQgKGluc24pID4gMjMpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAotCQkJCQkgICAgIHY5YV9hc3JfcmVnX25hbWVzW1hfUkQgKGluc24pLTE2XSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyonOgotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX3ByZWZldGNoIChYX1JEIChpbnNuKSk7Ci0KLQkJICAgICAgaWYgKG5hbWUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBYX1JEIChpbnNuKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgICAgCi0JCSAgY2FzZSAnTSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYXNyJWQiLCBYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgICAKLQkJICBjYXNlICdtJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVhc3IlZCIsIFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgICAgCi0JCSAgY2FzZSAnTCc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AzMCAoaW5zbiksIDMwKSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ24nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAgIChzdHJlYW0sICIlI3giLCBTRVggKFhfRElTUDIyIChpbnNuKSwgMjIpKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnbCc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AyMiAoaW5zbiksIDIyKSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0EnOgotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX2FzaSAoWF9BU0kgKGluc24pKTsKLQotCQkgICAgICBpZiAobmFtZSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIoJWQpIiwgWF9BU0kgKGluc24pKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBjYXNlICdDJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjc3IiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZnNyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3AnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXBzciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdxJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmcSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdRJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjcSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd0JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV0YnIiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAndyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUld2ltIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3gnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlZCIsCi0JCQkJCSAgICgoWF9MRFNUX0kgKGluc24pIDw8IDgpCi0JCQkJCSAgICArIFhfQVNJIChpbnNuKSkpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd5JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV5Iik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3UnOgotCQkgIGNhc2UgJ1UnOgotCQkgICAgewotCQkgICAgICBpbnQgdmFsID0gKnMgPT0gJ1UnID8gWF9SUzEgKGluc24pIDogWF9SRCAoaW5zbik7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzcGFyY19kZWNvZGVfc3BhcmNsZXRfY3ByZWcgKHZhbCk7Ci0KLQkJICAgICAgaWYgKG5hbWUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjcHJlZyglZCkiLCB2YWwpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCi0JICAvKiBJZiB3ZSBhcmUgYWRkaW5nIG9yIG9yJ2luZyBzb21ldGhpbmcgdG8gcnMxLCB0aGVuCi0JICAgICBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzCi0JICAgICBhIHNldGhpIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIGluIHRoZSBzZXRoaS4KLQkgICAgIElmIHNvLCBhdHRlbXB0IHRvIHByaW50IHRoZSByZXN1bHQgb2YgdGhlIGFkZCBvcgotCSAgICAgb3IgKGluIHRoaXMgY29udGV4dCBhZGQgYW5kIG9yIGRvIHRoZSBzYW1lIHRoaW5nKQotCSAgICAgYW5kIGl0cyBzeW1ib2xpYyB2YWx1ZS4gICovCi0JICBpZiAoaW1tX2FkZGVkX3RvX3JzMSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgcHJldl9pbnNuOwotCSAgICAgIGludCBlcnJjb2RlOwotCi0JICAgICAgZXJyY29kZSA9Ci0JCSgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkJICAobWVtYWRkciAtIDQsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLQkgICAgICBwcmV2X2luc24gPSBnZXR3b3JkIChidWZmZXIpOwotCi0JICAgICAgaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkgIC8qIElmIGl0IGlzIGEgZGVsYXllZCBicmFuY2gsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUKLQkJICAgICBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGRlbGF5ZWQgYnJhbmNoLiAgVGhpcyBoYW5kbGVzCi0JCSAgICAgc2VxdWVuY2VzIHN1Y2ggYXMKLQotCQkgICAgIHNldGhpICVvMSwgJWhpKF9mb28pLCAlbzEKLQkJICAgICBjYWxsIF9wcmludGYKLQkJICAgICBvciAlbzEsICVsbyhfZm9vKSwgJW8xCi0JCSAgICAgKi8KLQotCQkgIGlmIChpc19kZWxheWVkX2JyYW5jaCAocHJldl9pbnNuKSkKLQkJICAgIHsKLQkJICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkJCShtZW1hZGRyIC0gOCwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksIGluZm8pOwotCQkgICAgICBwcmV2X2luc24gPSBnZXR3b3JkIChidWZmZXIpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlYWRpbmcgbWVtb3J5LCB0aGVuIGFzc3VtZQotCQkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBub3Qgc2V0aGkuICAqLwotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJcyBpdCBzZXRoaSB0byB0aGUgc2FtZSByZWdpc3Rlcj8gICovCi0JCSAgaWYgKChwcmV2X2luc24gJiAweGMxYzAwMDAwKSA9PSAweDAxMDAwMDAwCi0JCSAgICAgICYmIFhfUkQgKHByZXZfaW5zbikgPT0gWF9SUzEgKGluc24pKQotCQkgICAgewotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIlx0ISAiKTsKLQkJICAgICAgaW5mby0+dGFyZ2V0ID0gCi0JCQkoMHhGRkZGRkZGRiAmIChpbnQpIFhfSU1NMjIgKHByZXZfaW5zbikgPDwgMTApCi0JCQl8IFhfU0lNTSAoaW5zbiwgMTMpOwotCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCQkgICAgICBpbmZvLT5kYXRhX3NpemUgPSA0OyAgLyogRklYTUUhISEgKi8KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChvcGNvZGUtPmZsYWdzICYgKEZfVU5CUnxGX0NPTkRCUnxGX0pTUikpCi0JICAgIHsKLQkJLyogRklYTUUgLS0gY2hlY2sgaXNfYW5udWxsZWQgZmxhZyAqLwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9VTkJSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9DT05EQlIpCi0JCWluZm8tPmluc25fdHlwZSA9IGRpc19jb25kYnJhbmNoOwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9KU1IpCi0JCWluZm8tPmluc25fdHlwZSA9IGRpc19qc3I7Ci0JICAgICAgaWYgKG9wY29kZS0+ZmxhZ3MgJiBGX0RFTEFZRUQpCi0JCWluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7Ci0JICAgIH0KLQotCSAgcmV0dXJuIHNpemVvZiAoYnVmZmVyKTsKLQl9Ci0gICAgfQotCi0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwkvKiBNYXJrIGFzIG5vbi12YWxpZCBpbnN0cnVjdGlvbiAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgXygidW5rbm93biIpKTsKLSAgcmV0dXJuIHNpemVvZiAoYnVmZmVyKTsKLX0KLQotLyogR2l2ZW4gQkZEIG1hY2ggbnVtYmVyLCByZXR1cm4gYSBtYXNrIG9mIFNQQVJDX09QQ09ERV9BUkNIX0ZPTyB2YWx1ZXMuICAqLwotCi1zdGF0aWMgaW50Ci1jb21wdXRlX2FyY2hfbWFzayAobWFjaCkKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotewotICBzd2l0Y2ggKG1hY2gpCi0gICAgewotICAgIGNhc2UgMCA6Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyYyA6Ci0gICAgICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSA6Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUgOgotICAgICAgLyogc3BhcmNsaXRlcyBpbnNucyBhcmUgcmVjb2duaXplZCBieSBkZWZhdWx0IChiZWNhdXNlIHRoYXQncyBob3cKLQkgdGhleSd2ZSBhbHdheXMgYmVlbiB0cmVhdGVkLCBmb3IgYmV0dGVyIG9yIHdvcnNlKS4gIEtsdWRnZSB0aGlzIGJ5Ci0JIGluZGljYXRpbmcgZ2VuZXJpYyB2OCBpcyBhbHNvIHNlbGVjdGVkLiAgKi8KLSAgICAgIHJldHVybiAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMSVRFKQotCSAgICAgIHwgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpKTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyA6Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OSA6Ci0gICAgICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjkpOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSA6Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OWEgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5QSk7Ci0gICAgfQotICBhYm9ydCAoKTsKLX0KLQotLyogQ29tcGFyZSBvcGNvZGVzIEEgYW5kIEIuICAqLwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX29wY29kZXMgKGEsIGIpCi0gICAgIGNvbnN0IFBUUiBhOwotICAgICBjb25zdCBQVFIgYjsKLXsKLSAgc3RydWN0IHNwYXJjX29wY29kZSAqb3AwID0gKiAoc3RydWN0IHNwYXJjX29wY29kZSAqKikgYTsKLSAgc3RydWN0IHNwYXJjX29wY29kZSAqb3AxID0gKiAoc3RydWN0IHNwYXJjX29wY29kZSAqKikgYjsKLSAgdW5zaWduZWQgbG9uZyBpbnQgbWF0Y2gwID0gb3AwLT5tYXRjaCwgbWF0Y2gxID0gb3AxLT5tYXRjaDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgbG9zZTAgPSBvcDAtPmxvc2UsIGxvc2UxID0gb3AxLT5sb3NlOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBJZiBvbmUgKGFuZCBvbmx5IG9uZSkgaW5zbiBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLAotICAgICBwcmVmZXIgdGhlIG9uZSB0aGF0IGlzLiAgSWYgbmVpdGhlciBhcmUgc3VwcG9ydGVkLCBidXQgdGhleSdyZSBib3RoIGZvcgotICAgICB0aGUgc2FtZSBhcmNoaXRlY3R1cmUsIGNvbnRpbnVlIHByb2Nlc3NpbmcuICBPdGhlcndpc2UgKGJvdGggdW5zdXBwb3J0ZWQKLSAgICAgYW5kIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcyksIHByZWZlciBsb3dlciBudW1iZXJlZCBhcmNoJ3MgKGZ1ZGdlZAotICAgICBieSBjb21wYXJpbmcgdGhlIGJpdG1hc2tzKS4gICovCi0gIGlmIChvcDAtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKQotICAgIHsKLSAgICAgIGlmICghIChvcDEtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKSkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9wMS0+YXJjaGl0ZWN0dXJlICYgY3VycmVudF9hcmNoX21hc2spCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmIChvcDAtPmFyY2hpdGVjdHVyZSAhPSBvcDEtPmFyY2hpdGVjdHVyZSkKLQlyZXR1cm4gb3AwLT5hcmNoaXRlY3R1cmUgLSBvcDEtPmFyY2hpdGVjdHVyZTsKLSAgICB9Ci0KLSAgLyogSWYgYSBiaXQgaXMgc2V0IGluIGJvdGggbWF0Y2ggYW5kIGxvc2UsIHRoZXJlIGlzIHNvbWV0aGluZwotICAgICB3cm9uZyB3aXRoIHRoZSBvcGNvZGUgdGFibGUuICAqLwotICBpZiAobWF0Y2gwICYgbG9zZTApCi0gICAgewotICAgICAgZnByaW50ZgotCShzdGRlcnIsCi0JIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JIF8oIkludGVybmFsIGVycm9yOiAgYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iKSwKLQkgb3AwLT5uYW1lLCBtYXRjaDAsIGxvc2UwKTsKLSAgICAgIG9wMC0+bG9zZSAmPSB+b3AwLT5tYXRjaDsKLSAgICAgIGxvc2UwID0gb3AwLT5sb3NlOwotICAgIH0KLQotICBpZiAobWF0Y2gxICYgbG9zZTEpCi0gICAgewotICAgICAgZnByaW50ZgotCShzdGRlcnIsCi0JIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JIF8oIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIpLAotCSBvcDEtPm5hbWUsIG1hdGNoMSwgbG9zZTEpOwotICAgICAgb3AxLT5sb3NlICY9IH5vcDEtPm1hdGNoOwotICAgICAgbG9zZTEgPSBvcDEtPmxvc2U7Ci0gICAgfQotCi0gIC8qIEJlY2F1c2UgdGhlIGJpdHMgdGhhdCBhcmUgdmFyaWFibGUgaW4gb25lIG9wY29kZSBhcmUgY29uc3RhbnQgaW4KLSAgICAgYW5vdGhlciwgaXQgaXMgaW1wb3J0YW50IHRvIG9yZGVyIHRoZSBvcGNvZGVzIGluIHRoZSByaWdodCBvcmRlci4gICovCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHggPSAxIDw8IGk7Ci0gICAgICBpbnQgeDAgPSAobWF0Y2gwICYgeCkgIT0gMDsKLSAgICAgIGludCB4MSA9IChtYXRjaDEgJiB4KSAhPSAwOwotCi0gICAgICBpZiAoeDAgIT0geDEpCi0JcmV0dXJuIHgxIC0geDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHggPSAxIDw8IGk7Ci0gICAgICBpbnQgeDAgPSAobG9zZTAgJiB4KSAhPSAwOwotICAgICAgaW50IHgxID0gKGxvc2UxICYgeCkgIT0gMDsKLQotICAgICAgaWYgKHgwICE9IHgxKQotCXJldHVybiB4MSAtIHgwOwotICAgIH0KLQotICAvKiBUaGV5IGFyZSBmdW5jdGlvbmFsbHkgZXF1YWwuICBTbyBhcyBsb25nIGFzIHRoZSBvcGNvZGUgdGFibGUgaXMKLSAgICAgdmFsaWQsIHdlIGNhbiBwdXQgd2hpY2hldmVyIG9uZSBmaXJzdCB3ZSB3YW50LCBvbiBhZXN0aGV0aWMgZ3JvdW5kcy4gICovCi0KLSAgLyogT3VyIGZpcnN0IGFlc3RoZXRpYyBncm91bmQgaXMgdGhhdCBhbGlhc2VzIGRlZmVyIHRvIHJlYWwgaW5zbnMuICAqLwotICB7Ci0gICAgaW50IGFsaWFzX2RpZmYgPSAob3AwLT5mbGFncyAmIEZfQUxJQVMpIC0gKG9wMS0+ZmxhZ3MgJiBGX0FMSUFTKTsKLSAgICBpZiAoYWxpYXNfZGlmZiAhPSAwKQotICAgICAgLyogUHV0IHRoZSBvbmUgdGhhdCBpc24ndCBhbiBhbGlhcyBmaXJzdC4gICovCi0gICAgICByZXR1cm4gYWxpYXNfZGlmZjsKLSAgfQotCi0gIC8qIEV4Y2VwdCBmb3IgYWxpYXNlcywgdHdvICJpZGVudGljYWwiIGluc3RydWN0aW9ucyBoYWQKLSAgICAgYmV0dGVyIGhhdmUgdGhlIHNhbWUgb3Bjb2RlLiAgVGhpcyBpcyBhIHNhbml0eSBjaGVjayBvbiB0aGUgdGFibGUuICAqLwotICBpID0gc3RyY21wIChvcDAtPm5hbWUsIG9wMS0+bmFtZSk7Ci0gIGlmIChpKQotICAgIHsKLSAgICAgIGlmIChvcDAtPmZsYWdzICYgRl9BTElBUykgLyogSWYgdGhleSdyZSBib3RoIGFsaWFzZXMsIGJlIGFyYml0cmFyeS4gKi8KLQlyZXR1cm4gaTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsCi0JCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgXygiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiID09IFwiJXNcIlxuIiksCi0JCSBvcDAtPm5hbWUsIG9wMS0+bmFtZSk7Ci0gICAgfQotCi0gIC8qIEZld2VyIGFyZ3VtZW50cyBhcmUgcHJlZmVycmVkLiAgKi8KLSAgewotICAgIGludCBsZW5ndGhfZGlmZiA9IHN0cmxlbiAob3AwLT5hcmdzKSAtIHN0cmxlbiAob3AxLT5hcmdzKTsKLSAgICBpZiAobGVuZ3RoX2RpZmYgIT0gMCkKLSAgICAgIC8qIFB1dCB0aGUgb25lIHdpdGggZmV3ZXIgYXJndW1lbnRzIGZpcnN0LiAgKi8KLSAgICAgIHJldHVybiBsZW5ndGhfZGlmZjsKLSAgfQotCi0gIC8qIFB1dCAxK2kgYmVmb3JlIGkrMS4gICovCi0gIHsKLSAgICBjaGFyICpwMCA9IChjaGFyICopIHN0cmNociAob3AwLT5hcmdzLCAnKycpOwotICAgIGNoYXIgKnAxID0gKGNoYXIgKikgc3RyY2hyIChvcDEtPmFyZ3MsICcrJyk7Ci0KLSAgICBpZiAocDAgJiYgcDEpCi0gICAgICB7Ci0JLyogVGhlcmUgaXMgYSBwbHVzIGluIGJvdGggb3BlcmFuZHMuICBOb3RlIHRoYXQgYSBwbHVzCi0JICAgc2lnbiBjYW5ub3QgYmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBhcmdzLAotCSAgIHNvIHRoZSBmb2xsb3dpbmcgWy0xXSdzIGFyZSB2YWxpZC4gICovCi0JaWYgKHAwWy0xXSA9PSAnaScgJiYgcDFbMV0gPT0gJ2knKQotCSAgLyogb3AwIGlzIGkrMSBhbmQgb3AxIGlzIDEraSwgc28gb3AxIGdvZXMgZmlyc3QuICAqLwotCSAgcmV0dXJuIDE7Ci0JaWYgKHAwWzFdID09ICdpJyAmJiBwMVstMV0gPT0gJ2knKQotCSAgLyogb3AwIGlzIDEraSBhbmQgb3AxIGlzIGkrMSwgc28gb3AwIGdvZXMgZmlyc3QuICAqLwotCSAgcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgLyogUHV0IDEsaSBiZWZvcmUgaSwxLiAgKi8KLSAgewotICAgIGludCBpMCA9IHN0cm5jbXAgKG9wMC0+YXJncywgImksMSIsIDMpID09IDA7Ci0gICAgaW50IGkxID0gc3RybmNtcCAob3AxLT5hcmdzLCAiaSwxIiwgMykgPT0gMDsKLQotICAgIGlmIChpMCBeIGkxKQotICAgICAgcmV0dXJuIGkwIC0gaTE7Ci0gIH0KLQotICAvKiBUaGV5IGFyZSwgYXMgZmFyIGFzIHdlIGNhbiB0ZWxsLCBpZGVudGljYWwuCi0gICAgIFNpbmNlIHFzb3J0IG1heSBoYXZlIHJlYXJyYW5nZWQgdGhlIHRhYmxlIHBhcnRpYWxseSwgdGhlcmUgaXMKLSAgICAgbm8gd2F5IHRvIHRlbGwgd2hpY2ggb25lIHdhcyBmaXJzdCBpbiB0aGUgb3Bjb2RlIHRhYmxlIGFzCi0gICAgIHdyaXR0ZW4sIHNvIGp1c3Qgc2F5IHRoZXJlIGFyZSBlcXVhbC4gICovCi0gIC8qID8/PyBUaGlzIGlzIG5vIGxvbmdlciB0cnVlIG5vdyB0aGF0IHdlIHNvcnQgYSB2ZWN0b3Igb2YgcG9pbnRlcnMsCi0gICAgIG5vdCB0aGUgdGFibGUgaXRzZWxmLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEJ1aWxkIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBvcGNvZGUgdGFibGUuCi0gICBPUENPREVfVEFCTEUgaXMgYSBzb3J0ZWQgbGlzdCBvZiBwb2ludGVycyBpbnRvIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaGFzaF90YWJsZSAob3Bjb2RlX3RhYmxlLCBoYXNoX3RhYmxlLCBudW1fb3Bjb2RlcykKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKm9wY29kZV90YWJsZTsKLSAgICAgc3RydWN0IG9wY29kZV9oYXNoICoqaGFzaF90YWJsZTsKLSAgICAgaW50IG51bV9vcGNvZGVzOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IGhhc2hfY291bnRbSEFTSF9TSVpFXTsKLSAgc3RhdGljIHN0cnVjdCBvcGNvZGVfaGFzaCAqaGFzaF9idWYgPSBOVUxMOwotCi0gIC8qIFN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIGFuZCB3b3JrIGJhY2t3YXJkcyBzbyB0aGF0IGVhY2gKLSAgICAgY2hhaW4gaXMgc29ydGVkLiAgKi8KLQotICBtZW1zZXQgKGhhc2hfdGFibGUsIDAsIEhBU0hfU0laRSAqIHNpemVvZiAoaGFzaF90YWJsZVswXSkpOwotICBtZW1zZXQgKGhhc2hfY291bnQsIDAsIEhBU0hfU0laRSAqIHNpemVvZiAoaGFzaF9jb3VudFswXSkpOwotICBpZiAoaGFzaF9idWYgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX2J1Zik7Ci0gIGhhc2hfYnVmID0gKHN0cnVjdCBvcGNvZGVfaGFzaCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcGNvZGVfaGFzaCkgKiBudW1fb3Bjb2Rlcyk7Ci0gIGZvciAoaSA9IG51bV9vcGNvZGVzIC0gMTsgaSA+PSAwOyAtLWkpCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGhhc2ggPSBIQVNIX0lOU04gKG9wY29kZV90YWJsZVtpXS0+bWF0Y2gpOwotICAgICAgcmVnaXN0ZXIgc3RydWN0IG9wY29kZV9oYXNoICpoID0gJmhhc2hfYnVmW2ldOwotICAgICAgaC0+bmV4dCA9IGhhc2hfdGFibGVbaGFzaF07Ci0gICAgICBoLT5vcGNvZGUgPSBvcGNvZGVfdGFibGVbaV07Ci0gICAgICBoYXNoX3RhYmxlW2hhc2hdID0gaDsKLSAgICAgICsraGFzaF9jb3VudFtoYXNoXTsKLSAgICB9Ci0KLSNpZiAwIC8qIGZvciBkZWJ1Z2dpbmcgKi8KLSAgewotICAgIGludCBtaW5fY291bnQgPSBudW1fb3Bjb2RlcywgbWF4X2NvdW50ID0gMDsKLSAgICBpbnQgdG90YWw7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyArK2kpCi0gICAgICB7Ci0gICAgICAgIGlmIChoYXNoX2NvdW50W2ldIDwgbWluX2NvdW50KQotCSAgbWluX2NvdW50ID0gaGFzaF9jb3VudFtpXTsKLQlpZiAoaGFzaF9jb3VudFtpXSA+IG1heF9jb3VudCkKLQkgIG1heF9jb3VudCA9IGhhc2hfY291bnRbaV07Ci0JdG90YWwgKz0gaGFzaF9jb3VudFtpXTsKLSAgICAgIH0KLQotICAgIHByaW50ZiAoIk9wY29kZSBoYXNoIHRhYmxlIHN0YXRzOiBtaW4gJWQsIG1heCAlZCwgYXZlICVmXG4iLAotCSAgICBtaW5fY291bnQsIG1heF9jb3VudCwgKGRvdWJsZSkgdG90YWwgLyBIQVNIX1NJWkUpOwotICB9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvc3BhcmMtb3BjLmMgYi9vcGNvZGVzL3NwYXJjLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQ5ZDE4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvc3BhcmMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMwICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBzcGFyYy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1CRkQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCi12ZXJzaW9uLgotCi1CRkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCi1XQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCSovCi0KLS8qIEZJWE1FLXNvbWVkYXk6IHBlcmhhcHMgdGhlICxhJ3MgYW5kIHN1Y2ggc2hvdWxkIGJlIGVtYmVkZGVkIGluIHRoZQotICAgaW5zdHJ1Y3Rpb24ncyBuYW1lIHJhdGhlciB0aGFuIHRoZSBhcmdzLiAgVGhpcyB3b3VsZCBtYWtlIGdhcyBmYXN0ZXIsIHBpbnNuCi0gICBzbG93ZXIsIGJ1dCB3b3VsZCBtZXNzIHVwIHNvbWUgbWFjcm9zIGEgYml0LiAgeG94b3JpY2guICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3NwYXJjLmgiCi0KLS8qIFNvbWUgZGVmaW5lcyB0byBtYWtlIGxpZmUgZWFzeS4gICovCi0jZGVmaW5lIE1BU0tfVjYJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y2KQotI2RlZmluZSBNQVNLX1Y3CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WNykKLSNkZWZpbmUgTUFTS19WOAkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpCi0jZGVmaW5lIE1BU0tfU1BBUkNMRVQJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQpCi0jZGVmaW5lIE1BU0tfU1BBUkNMSVRFCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSkKLSNkZWZpbmUgTUFTS19WOQkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjkpCi0jZGVmaW5lIE1BU0tfVjlBCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKLQotLyogQml0IG1hc2tzIG9mIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGluZyB0aGUgaW5zbi4gICovCi0KLSNkZWZpbmUgdjYJCShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIFwKLQkJCSB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotLyogdjYgaW5zbnMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BhcmNsZXQgKi8KLSNkZWZpbmUgdjZub3RsZXQJKE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCBcCi0JCQkgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLSNkZWZpbmUgdjcJCShNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgXAotCQkJIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0vKiBBbHRob3VnaCBub3QgYWxsIGluc25zIGFyZSBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZSwgc3BhcmNsaXRlIGlzIGRlZmluZWQKLSAgIHRvIGJlIGEgc3VwZXJzZXQgb2YgdjguICBVbmltcGxlbWVudGVkIGluc25zIHRyYXAgYW5kIGFyZSB0aGVuIHRoZW9yZXRpY2FsbHkKLSAgIGltcGxlbWVudGVkIGluIHNvZnR3YXJlLgotICAgSXQncyBub3QgY2xlYXIgdGhhdCB0aGUgc2FtZSBpcyB0cnVlIGZvciBzcGFyY2xldCwgYWx0aG91Z2ggdGhlIGRvY3MKLSAgIHN1Z2dlc3QgaXQgaXMuICBSYXRoZXIgdGhhbiBjb21wbGljYXRpbmcgdGhpbmdzLCB0aGUgc3BhcmNsZXQgYXNzZW1ibGVyCi0gICByZWNvZ25pemVzIGFsbCB2OCBpbnNucy4gICovCi0jZGVmaW5lIHY4CQkoTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLSNkZWZpbmUgc3BhcmNsZXQJKE1BU0tfU1BBUkNMRVQpCi0jZGVmaW5lIHNwYXJjbGl0ZQkoTUFTS19TUEFSQ0xJVEUpCi0jZGVmaW5lIHY5CQkoTUFTS19WOSB8IE1BU0tfVjlBKQotI2RlZmluZSB2OWEJCShNQVNLX1Y5QSkKLS8qIHY2IGluc25zIG5vdCBzdXBwb3J0ZWQgYnkgdjkgKi8KLSNkZWZpbmUgdjZub3R2OQkJKE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCBcCi0JCQkgfCBNQVNLX1NQQVJDTEVUIHwgTUFTS19TUEFSQ0xJVEUpCi0vKiB2OWEgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdvdWxkIGFwcGVhciB0byBiZSBhbGlhc2VzIHRvIHY5J3MgaW1wZGVwJ3MKLSAgIG90aGVyd2lzZSAqLwotI2RlZmluZSB2OW5vdHY5YQkoTUFTS19WOSkKLQotLyogVGFibGUgb2Ygb3Bjb2RlIGFyY2hpdGVjdHVyZXMuCi0gICBUaGUgb3JkZXIgaXMgZGVmaW5lZCBpbiBvcGNvZGUvc3BhcmMuaC4gICovCi0KLWNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGVfYXJjaCBzcGFyY19vcGNvZGVfYXJjaHNbXSA9IHsKLSAgeyAidjYiLCBNQVNLX1Y2IH0sCi0gIHsgInY3IiwgTUFTS19WNiB8IE1BU0tfVjcgfSwKLSAgeyAidjgiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfSwKLSAgeyAic3BhcmNsZXQiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIH0sCi0gIHsgInNwYXJjbGl0ZSIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMSVRFIH0sCi0gIC8qID8/PyBEb24ndCBzb21lIHY4IHByaXZpbGVkZ2VkIGluc25zIGNvbmZsaWN0IHdpdGggdjk/ICAqLwotICB7ICJ2OSIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfVjkgfSwKLSAgLyogdjkgd2l0aCB1bHRyYXNwYXJjIGFkZGl0aW9ucyAqLwotICB7ICJ2OWEiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1Y5IHwgTUFTS19WOUEgfSwKLSAgeyBOVUxMLCAwIH0KLX07Ci0KLS8qIEdpdmVuIE5BTUUsIHJldHVybiBpdCdzIGFyY2hpdGVjdHVyZSBlbnRyeS4gICovCi0KLWVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsCi1zcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGVfYXJjaCAqcDsKLQotICBmb3IgKHAgPSAmc3BhcmNfb3Bjb2RlX2FyY2hzWzBdOyBwLT5uYW1lOyArK3ApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+bmFtZSkgPT0gMCkKLQlyZXR1cm4gKGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsKSAocCAtICZzcGFyY19vcGNvZGVfYXJjaHNbMF0pOwotICAgIH0KLQotICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfQkFEOwotfQotDAotLyogQnJhbmNoIGNvbmRpdGlvbiBmaWVsZC4gICovCi0jZGVmaW5lIENPTkQoeCkJCSgoKHgpJjB4Zik8PDI1KQotCi0vKiB2OTogTW92ZSAoTU9WY2MgYW5kIEZNT1ZjYykgY29uZGl0aW9uIGZpZWxkLiAgKi8KLSNkZWZpbmUgTUNPTkQoeCxpX29yX2YpCSgoKChpX29yX2YpJjEpPDwxOCl8KCgoeCk+PjExKSYoMHhmPDwxNCkpKSAvKiB2OSAqLwotCi0vKiB2OTogTW92ZSByZWdpc3RlciAoTU9WUmNjIGFuZCBGTU9WUmNjKSBjb25kaXRpb24gZmllbGQuICAqLwotI2RlZmluZSBSQ09ORCh4KQkoKCh4KSYweDcpPDwxMCkJLyogdjkgKi8KLQotI2RlZmluZSBDT05EQQkoQ09ORCgweDgpKQotI2RlZmluZSBDT05EQ0MJKENPTkQoMHhkKSkKLSNkZWZpbmUgQ09ORENTCShDT05EKDB4NSkpCi0jZGVmaW5lIENPTkRFCShDT05EKDB4MSkpCi0jZGVmaW5lIENPTkRHCShDT05EKDB4YSkpCi0jZGVmaW5lIENPTkRHRQkoQ09ORCgweGIpKQotI2RlZmluZSBDT05ER1UJKENPTkQoMHhjKSkKLSNkZWZpbmUgQ09OREwJKENPTkQoMHgzKSkKLSNkZWZpbmUgQ09ORExFCShDT05EKDB4MikpCi0jZGVmaW5lIENPTkRMRVUJKENPTkQoMHg0KSkKLSNkZWZpbmUgQ09ORE4JKENPTkQoMHgwKSkKLSNkZWZpbmUgQ09ORE5FCShDT05EKDB4OSkpCi0jZGVmaW5lIENPTkRORUcJKENPTkQoMHg2KSkKLSNkZWZpbmUgQ09ORFBPUwkoQ09ORCgweGUpKQotI2RlZmluZSBDT05EVkMJKENPTkQoMHhmKSkKLSNkZWZpbmUgQ09ORFZTCShDT05EKDB4NykpCi0KLSNkZWZpbmUgQ09ORE5aCUNPTkRORQotI2RlZmluZSBDT05EWglDT05ERQotI2RlZmluZSBDT05ER0VVCUNPTkRDQwotI2RlZmluZSBDT05ETFUJQ09ORENTCi0KLSNkZWZpbmUgRkNPTkRBCQkoQ09ORCgweDgpKQotI2RlZmluZSBGQ09OREUJCShDT05EKDB4OSkpCi0jZGVmaW5lIEZDT05ERwkJKENPTkQoMHg2KSkKLSNkZWZpbmUgRkNPTkRHRQkJKENPTkQoMHhiKSkKLSNkZWZpbmUgRkNPTkRMCQkoQ09ORCgweDQpKQotI2RlZmluZSBGQ09ORExFCQkoQ09ORCgweGQpKQotI2RlZmluZSBGQ09ORExHCQkoQ09ORCgweDIpKQotI2RlZmluZSBGQ09ORE4JCShDT05EKDB4MCkpCi0jZGVmaW5lIEZDT05ETkUJCShDT05EKDB4MSkpCi0jZGVmaW5lIEZDT05ETwkJKENPTkQoMHhmKSkKLSNkZWZpbmUgRkNPTkRVCQkoQ09ORCgweDcpKQotI2RlZmluZSBGQ09ORFVFCQkoQ09ORCgweGEpKQotI2RlZmluZSBGQ09ORFVHCQkoQ09ORCgweDUpKQotI2RlZmluZSBGQ09ORFVHRQkoQ09ORCgweGMpKQotI2RlZmluZSBGQ09ORFVMCQkoQ09ORCgweDMpKQotI2RlZmluZSBGQ09ORFVMRQkoQ09ORCgweGUpKQotCi0jZGVmaW5lIEZDT05ETloJRkNPTkRORQotI2RlZmluZSBGQ09ORFoJRkNPTkRFCi0KLSNkZWZpbmUgSUNDICgwKQkvKiB2OSAqLwotI2RlZmluZSBYQ0MgKDE8PDEyKSAvKiB2OSAqLwotI2RlZmluZSBGQ0MoeCkJKCgoeCkmMHgzKTw8MTEpIC8qIHY5ICovCi0jZGVmaW5lIEZCRkNDKHgpCSgoKHgpJjB4Myk8PDIwKQkvKiB2OSAqLwotDAotLyogVGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzIGluIHRoZSB0YWJsZSBpcyBzaWduaWZpY2FudDoKLQkKLQkqIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QKLQliZSBjb25zZWN1dGl2ZS4JSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0IHJ1bnRpbWUuCi0KLQkqIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIG5vdCBjYXJlIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgb3Bjb2Rlcy4KLQotKi8KLQotLyogRW50cmllcyBmb3IgY29tbXV0YXRpdmUgYXJpdGhtZXRpYyBvcGVyYXRpb25zLiAgKi8KLS8qID8/PyBNb3JlIGVudHJpZXMgY2FuIG1ha2UgdXNlIG9mIHRoaXMuICAqLwotI2RlZmluZSBDT01NVVRFT1Aob3Bjb2RlLCBvcDMsIGFyY2hfbWFzaykgXAoteyBvcGNvZGUsCUYzKDIsIG9wMywgMCksIEYzKH4yLCB+b3AzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgYXJjaF9tYXNrIH0sIFwKLXsgb3Bjb2RlLAlGMygyLCBvcDMsIDEpLCBGMyh+Miwgfm9wMywgfjEpLAkJIjEsaSxkIiwgMCwgYXJjaF9tYXNrIH0sIFwKLXsgb3Bjb2RlLAlGMygyLCBvcDMsIDEpLCBGMyh+Miwgfm9wMywgfjEpLAkJImksMSxkIiwgMCwgYXJjaF9tYXNrIH0KLQotY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSBzcGFyY19vcGNvZGVzW10gPSB7Ci0KLXsgImxkIiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApLAkJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCl8UlMyX0cwLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkIFtyczErMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDIwLCAwKSwgRjMofjMsIH4weDIwLCB+MCksCQkiWzErMl0sZyIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjAsIDApLCBGMyh+MywgfjB4MjAsIH4wKXxSUzJfRzAsCSJbMV0sZyIsIDAsIHY2IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKSwJCSJbMStpXSxnIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpLAkJIltpKzFdLGciLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSl8UlMxX0cwLAkiW2ldLGciLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxnIiwgMCwgdjYgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkIiwJRjMoMywgMHgyMSwgMCksIEYzKH4zLCB+MHgyMSwgfjApfFJEKH4wKSwJIlsxKzJdLEYiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIxLCAwKSwgRjMofjMsIH4weDIxLCB+MCl8UlMyX0cwfFJEKH4wKSwiWzFdLEYiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjApLAkiWzEraV0sRiIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSRCh+MCksCSJbaSsxXSxGIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJTMV9HMHxSRCh+MCksIltpXSxGIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFNJTU0xMyh+MCl8UkQofjApLCJbMV0sRiIsIDAsIHY2IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZCIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKSwJCSJbMSsyXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCl8UlMyX0cwLAkiWzFdLEQiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbMStpXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiW2krMV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFJTMV9HMCwJIltpXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgzMSwgMCksIEYzKH4zLCB+MHgzMSwgfjApLAkJIlsxKzJdLEMiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzEsIDApLCBGMyh+MywgfjB4MzEsIH4wKXxSUzJfRzAsCSJbMV0sQyIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpLAkJIlsxK2ldLEMiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKSwJCSJbaSsxXSxDIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSl8UlMxX0cwLAkiW2ldLEMiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKXxTSU1NMTMofjApLAkiWzFdLEMiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi0vKiBUaGUgdjkgTERVVyBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkICdsZCcgb3Bjb2RlLCBpdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlCi0gICAnbGQnIHBzZXVkby1vcCBpbiB2OS4gICovCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApLAkJIlsxKzJdLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKXxSUzJfRzAsCSJbMV0sZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIlsxK2ldLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbaSsxXSxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRkIiwJRjMoMywgMHgwMywgMCksIEYzKH4zLCB+MHgwMywgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MDMsIDApLCBGMyh+MywgfjB4MDMsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZGQiLAlGMygzLCAweDAzLCAxKSwgRjMofjMsIH4weDAzLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDAzLCAxKSwgRjMofjMsIH4weDAzLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDAzLCAxKSwgRjMofjMsIH4weDAzLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLXsgImxkZCIsCUYzKDMsIDB4MjMsIDApLCBGMyh+MywgfjB4MjMsIH4wKXxBU0kofjApLAkiWzErMl0sSCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDIzLCAwKSwgRjMofjMsIH4weDIzLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sSCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRkIiwJRjMoMywgMHgyMywgMSksIEYzKH4zLCB+MHgyMywgfjEpLAkJIlsxK2ldLEgiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgyMywgMSksIEYzKH4zLCB+MHgyMywgfjEpLAkJIltpKzFdLEgiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgyMywgMSksIEYzKH4zLCB+MHgyMywgfjEpfFJTMV9HMCwJIltpXSxIIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKXxTSU1NMTMofjApLAkiWzFdLEgiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSswXSxkICovCi0KLXsgImxkZCIsCUYzKDMsIDB4MzMsIDApLCBGMyh+MywgfjB4MzMsIH4wKXxBU0kofjApLAkiWzErMl0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkZCIsCUYzKDMsIDB4MzMsIDApLCBGMyh+MywgfjB4MzMsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbMStpXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIltpKzFdLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8UlMxX0cwLAkiW2ldLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZGQgW3JzMSswXSxkICovCi0KLXsgImxkcSIsCUYzKDMsIDB4MjIsIDApLCBGMyh+MywgfjB4MjIsIH4wKXxBU0kofjApLAkiWzErMl0sSiIsIDAsIHY5IH0sCi17ICJsZHEiLAlGMygzLCAweDIyLCAwKSwgRjMofjMsIH4weDIyLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sSiIsIDAsIHY5IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRxIiwJRjMoMywgMHgyMiwgMSksIEYzKH4zLCB+MHgyMiwgfjEpLAkJIlsxK2ldLEoiLCAwLCB2OSB9LAoteyAibGRxIiwJRjMoMywgMHgyMiwgMSksIEYzKH4zLCB+MHgyMiwgfjEpLAkJIltpKzFdLEoiLCAwLCB2OSB9LAoteyAibGRxIiwJRjMoMywgMHgyMiwgMSksIEYzKH4zLCB+MHgyMiwgfjEpfFJTMV9HMCwJIltpXSxKIiwgMCwgdjkgfSwKLXsgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKXxTSU1NMTMofjApLAkiWzFdLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSswXSxkICovCi0KLXsgImxkc2IiLAlGMygzLCAweDA5LCAwKSwgRjMofjMsIH4weDA5LCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGRzYiIsCUYzKDMsIDB4MDksIDApLCBGMyh+MywgfjB4MDksIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzYiBbcnMxKyVnMF0sZCAqLwoteyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzYiBbcnMxKzBdLGQgKi8KLQoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDApLCBGMyh+MywgfjB4MGEsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzaCBbcnMxKyVnMF0sZCAqLwoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDApLCBGMyh+MywgfjB4MGEsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHNoIFtyczErMF0sZCAqLwotCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAwKSwgRjMofjMsIH4weDBkLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMCksIEYzKH4zLCB+MHgwZCwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHN0dWIgW3JzMSslZzBdLGQgKi8KLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDEpLCBGMyh+MywgfjB4MGQsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDEpLCBGMyh+MywgfjB4MGQsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDEpLCBGMyh+MywgfjB4MGQsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzdHViIFtyczErMF0sZCAqLwotCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMCksIEYzKH4zLCB+MHgwOCwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjkgfSwKLXsgImxkc3ciLAlGMygzLCAweDA4LCAwKSwgRjMofjMsIH4weDA4LCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkc3cgW3JzMSslZzBdLGQgKi8KLXsgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSksCQkiWzEraV0sZCIsIDAsIHY5IH0sCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpLAkJIltpKzFdLGQiLCAwLCB2OSB9LAoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY5IH0sCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkc3cgW3JzMSswXSxkICovCi0KLXsgImxkdWIiLAlGMygzLCAweDAxLCAwKSwgRjMofjMsIH4weDAxLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDApLCBGMyh+MywgfjB4MDEsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1YiBbcnMxKyVnMF0sZCAqLwoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1YiBbcnMxKzBdLGQgKi8KLQoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDApLCBGMyh+MywgfjB4MDIsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMCksIEYzKH4zLCB+MHgwMiwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHVoIFtyczErJWcwXSxkICovCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHVoIFtyczErMF0sZCAqLwotCi17ICJsZHgiLAlGMygzLCAweDBiLCAwKSwgRjMofjMsIH4weDBiLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgwYiwgMCksIEYzKH4zLCB+MHgwYiwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHggW3JzMSslZzBdLGQgKi8KLXsgImxkeCIsCUYzKDMsIDB4MGIsIDEpLCBGMyh+MywgfjB4MGIsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MGIsIDEpLCBGMyh+MywgfjB4MGIsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MGIsIDEpLCBGMyh+MywgfjB4MGIsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGR4IFtyczErMF0sZCAqLwotCi17ICJsZHgiLAlGMygzLCAweDIxLCAwKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MCl8UkQofjEpLAkiWzErMl0sRiIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDIxLCAwKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MCl8UlMyX0cwfFJEKH4xKSwJIlsxXSxGIiwgMCwgdjkgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSRCh+MSksCSJbMStpXSxGIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSRCh+MSksCSJbaSsxXSxGIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSUzFfRzB8UkQofjEpLAkiW2ldLEYiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgyMSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjEpfFNJTU0xMyh+MCl8UkQofjEpLCJbMV0sRiIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZGEiLAlGMygzLCAweDEwLCAwKSwgRjMofjMsIH4weDEwLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi17ICJsZGEiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCksCQkiWzErMl1BLGciLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApfFJTMl9HMCwJIlsxXUEsZyIsIDAsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIlsxK2ldbyxnIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbaSsxXW8sZyIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8UlMxX0cwLAkiW2ldbyxnIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxnIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkZGEiLAlGMygzLCAweDEzLCAwKSwgRjMofjMsIH4weDEzLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDApLCBGMyh+MywgfjB4MTMsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZGRhIFtyczErJWcwXSxkICovCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkZGEiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCksCQkiWzErMl1BLEgiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDApLCBGMyh+MywgfjB4MzMsIH4wKXxSUzJfRzAsCSJbMV1BLEgiLCAwLCB2OSB9LCAvKiBsZGRhIFtyczErJWcwXSxkICovCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIlsxK2ldbyxIIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiW2krMV1vLEgiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKXxSUzFfRzAsCSJbaV1vLEgiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxIIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkcWEiLAlGMygzLCAweDMyLCAwKSwgRjMofjMsIH4weDMyLCB+MCksCQkiWzErMl1BLEoiLCAwLCB2OSB9LAoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDApLCBGMyh+MywgfjB4MzIsIH4wKXxSUzJfRzAsCSJbMV1BLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSksCQkiWzEraV1vLEoiLCAwLCB2OSB9LAoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKSwJCSJbaSsxXW8sSiIsIDAsIHY5IH0sCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpfFJTMV9HMCwJIltpXW8sSiIsIDAsIHY5IH0sCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSswXSxkICovCi0KLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMCksIEYzKH4zLCB+MHgxOSwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMCksIEYzKH4zLCB+MHgxOSwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkc2JhIFtyczErJWcwXSxkICovCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDEpLCBGMyh+MywgfjB4MTksIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDEpLCBGMyh+MywgfjB4MTksIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDEpLCBGMyh+MywgfjB4MTksIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDApLCBGMyh+MywgfjB4MWEsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDApLCBGMyh+MywgfjB4MWEsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHNoYSBbcnMxKyVnMF0sZCAqLwoteyAibGRzaGEiLAlGMygzLCAweDFhLCAxKSwgRjMofjMsIH4weDFhLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRzaGEiLAlGMygzLCAweDFhLCAxKSwgRjMofjMsIH4weDFhLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRzaGEiLAlGMygzLCAweDFhLCAxKSwgRjMofjMsIH4weDFhLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDApLCBGMyh+MywgfjB4MWQsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMCksIEYzKH4zLCB+MHgxZCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkc3R1YmEgW3JzMSslZzBdLGQgKi8KLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzd2EiLAlGMygzLCAweDE4LCAwKSwgRjMofjMsIH4weDE4LCB+MCksCQkiWzErMl1BLGQiLCAwLCB2OSB9LAoteyAibGRzd2EiLAlGMygzLCAweDE4LCAwKSwgRjMofjMsIH4weDE4LCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDEpLCBGMyh+MywgfjB4MTgsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDEpLCBGMyh+MywgfjB4MTgsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDEpLCBGMyh+MywgfjB4MTgsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDApLCBGMyh+MywgfjB4MTEsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDApLCBGMyh+MywgfjB4MTEsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHViYSBbcnMxKyVnMF0sZCAqLwoteyAibGR1YmEiLAlGMygzLCAweDExLCAxKSwgRjMofjMsIH4weDExLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGR1YmEiLAlGMygzLCAweDExLCAxKSwgRjMofjMsIH4weDExLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGR1YmEiLAlGMygzLCAweDExLCAxKSwgRjMofjMsIH4weDExLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGR1aGEiLAlGMygzLCAweDEyLCAwKSwgRjMofjMsIH4weDEyLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGR1aGEiLAlGMygzLCAweDEyLCAwKSwgRjMofjMsIH4weDEyLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGR1aGEgW3JzMSslZzBdLGQgKi8KLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMSksIEYzKH4zLCB+MHgxMiwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMSksIEYzKH4zLCB+MHgxMiwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMSksIEYzKH4zLCB+MHgxMiwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApLAkJIlsxKzJdQSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGR1d2EgPT09IGxkYSAqLwoteyAibGR1d2EiLAlGMygzLCAweDEwLCAwKSwgRjMofjMsIH4weDEwLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbMStpXW8sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbaSsxXW8sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMCksIEYzKH4zLCB+MHgxYiwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjkgfSwKLXsgImxkeGEiLAlGMygzLCAweDFiLCAwKSwgRjMofjMsIH4weDFiLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgInN0IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCQkiZCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCQkiZCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCQkiZCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCQkiZCxbaV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3QiLAlGMygzLCAweDI0LCAwKSwgRjMofjMsIH4weDI0LCB+MCl8QVNJKH4wKSwJCSJnLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNCwgMCksIEYzKH4zLCB+MHgyNCwgfjApfEFTSV9SUzIofjApLAkJImcsWzFdIiwgMCwgdjYgfSwgLyogc3QgZFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSksCQkJImcsWzEraV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSksCQkJImcsW2krMV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSl8UlMxX0cwLAkJImcsW2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpfFNJTU0xMyh+MCksCQkiZyxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3QiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCl8QVNJKH4wKSwJCSJELFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCl8QVNJX1JTMih+MCksCQkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCQkiRCxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJCSJELFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8UlMxX0cwLAkJIkQsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8U0lNTTEzKH4wKSwJCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdCIsCUYzKDMsIDB4MzUsIDApLCBGMyh+MywgfjB4MzUsIH4wKXxBU0kofjApLAkJIkMsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDApLCBGMyh+MywgfjB4MzUsIH4wKXxBU0lfUlMyKH4wKSwJCSJDLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpLAkJCSJDLFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSksCQkJIkMsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKXxSUzFfRzAsCQkiQyxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKXxTSU1NMTMofjApLAkJIkMsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3QiLAlGMygzLCAweDI1LCAwKSwgRjMofjMsIH4weDI1LCB+MCl8UkRfRzB8QVNJKH4wKSwJIkYsWzErMl0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAwKSwgRjMofjMsIH4weDI1LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJGLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMCwJCSJGLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwLAkJIkYsW2krMV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzB8UlMxX0cwLAkJIkYsW2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJGLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdHciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0c3ciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0c3ciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3BpbGwiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGEiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGEiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCksCQkiZyxbMSsyXUEiLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApfFJTMih+MCksCSJnLFsxXUEiLCAwLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCSJnLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkiZyxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFJTMV9HMCwJImcsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8U0lNTTEzKH4wKSwJImcsWzFdbyIsIDAsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2OSB9LAoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0YiBkLFtyczErJWcwXSAqLwoteyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsWzEraV0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsW2krMV0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0c2IiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiIGQsW3JzMSslZzBdICovCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2IiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiBkLFtyczErJWcwXSAqLwoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0YmEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGJhIGQsW3JzMSslZzBdICovCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzYmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGJhIGQsW3JzMSslZzBdICovCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLQoteyAic3RkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+MywgfjB4MDcsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSksCQkiZCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSksCQkiZCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RkIiwJRjMoMywgMHgyNiwgMCksIEYzKH4zLCB+MHgyNiwgfjApfEFTSSh+MCksCSJxLFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgyNiwgMCksIEYzKH4zLCB+MHgyNiwgfjApfEFTSV9SUzIofjApLAkicSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpLAkJInEsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkicSxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxSUzFfRzAsCSJxLFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxTSU1NMTMofjApLAkicSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDApLCBGMyh+MywgfjB4MjcsIH4wKXxBU0kofjApLAkiSCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDI3LCAwKSwgRjMofjMsIH4weDI3LCB+MCl8QVNJX1JTMih+MCksCSJILFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpLAkJIkgsWzEraV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpLAkJIkgsW2krMV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpfFJTMV9HMCwJIkgsW2ldIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDEpLCBGMyh+MywgfjB4MjcsIH4xKXxTSU1NMTMofjApLAkiSCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0kofjApLAkiUSxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0lfUlMyKH4wKSwJIlEsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKSwJCSJRLFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIlEsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSl8UlMxX0cwLAkiUSxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSl8U0lNTTEzKH4wKSwJIlEsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi17ICJzdGQiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCl8QVNJKH4wKSwJIkQsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCl8QVNJX1JTMih+MCksCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiRCxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJELFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpfFJTMV9HMCwJIkQsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpfFNJTU0xMyh+MCksCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMCksIEYzKH4zLCB+MHgxNywgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAwKSwgRjMofjMsIH4weDE3LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0ZGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApLAkJIkgsWzErMl1BIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCl8UlMyKH4wKSwJIkgsWzFdQSIsIDAsIHY5IH0sIC8qIHN0ZGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiSCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJILFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpfFJTMV9HMCwJIkgsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpfFNJTU0xMyh+MCksCSJILFsxXW8iLCAwLCB2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInN0aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0aCBkLFtyczErJWcwXSAqLwoteyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsWzEraV0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsW2krMV0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGggZCxbcnMxKzBdICovCi0KLXsgInN0c2giLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoIGQsW3JzMSslZzBdICovCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2giLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggZCxbcnMxKzBdICovCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCBkLFtyczErJWcwXSAqLwoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0aGEgLFtyczErJWcwXSAqLwoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3RzaGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aGEgLFtyczErJWcwXSAqLwoteyAic3RzaGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzaGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzaGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGggZCxbcnMxKzBdICovCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjYgfSwgLyogc3RoYSAsW3JzMSslZzBdICovCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3R4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+MHgwZSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSslZzBdICovCi17ICJzdHgiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSksCQkiZCxbMStpXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSksCQkiZCxbaSsxXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErMF0gKi8KLQoteyAic3R4IiwJRjMoMywgMHgyNSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjApfEFTSSh+MCl8UkQofjEpLAkiRixbMSsyXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDI1LCAwKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MCl8QVNJX1JTMih+MCl8UkQofjEpLCJGLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErJWcwXSAqLwoteyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEKH4xKSwJCSJGLFsxK2ldIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRCh+MSksCQkiRixbaSsxXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8UlMxX0cwfFJEKH4xKSwJIkYsW2ldIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxTSU1NMTMofjApfFJEKH4xKSwiRixbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKzBdICovCi0KLXsgInN0eGEiLAlGMygzLCAweDFlLCAwKSwgRjMofjMsIH4weDFlLCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2OSB9LAoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDApLCBGMyh+MywgfjB4MWUsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjkgfSwgLyogc3R4YSBkLFtyczErJWcwXSAqLwoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErMF0gKi8KLQoteyAic3RxIiwJRjMoMywgMHgyNiwgMCksIEYzKH4zLCB+MHgyNiwgfjApfEFTSSh+MCksCSJKLFsxKzJdIiwgMCwgdjkgfSwKLXsgInN0cSIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0lfUlMyKH4wKSwJIkosWzFdIiwgMCwgdjkgfSwgLyogc3RxIFtyczErJWcwXSAqLwoteyAic3RxIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpLAkJIkosWzEraV0iLCAwLCB2OSB9LAoteyAic3RxIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpLAkJIkosW2krMV0iLCAwLCB2OSB9LAoteyAic3RxIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFJTMV9HMCwJIkosW2ldIiwgMCwgdjkgfSwKLXsgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxTSU1NMTMofjApLAkiSixbMV0iLCAwLCB2OSB9LCAvKiBzdHEgW3JzMSswXSAqLwotCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSSh+MCksCSJKLFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSV9SUzIofjApLAkiSixbMV1BIiwgMCwgdjkgfSwgLyogc3RxYSBbcnMxKyVnMF0gKi8KLXsgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiSixbMStpXW8iLCAwLCB2OSB9LAoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKSwJCSJKLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpfFJTMV9HMCwJIkosW2ldbyIsIDAsIHY5IH0sCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpfFNJTU0xMyh+MCksCSJKLFsxXW8iLCAwLCB2OSB9LCAvKiBzdHFhIFtyczErMF0gKi8KLQoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDApLCBGMyh+MywgfjB4MGYsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY3IH0sCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMCksIEYzKH4zLCB+MHgwZiwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NyB9LCAvKiBzd2FwIFtyczErJWcwXSxkICovCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NyB9LAoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjcgfSwKLXsgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NyB9LAoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NyB9LCAvKiBzd2FwIFtyczErMF0sZCAqLwotCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDApLCBGMyh+MywgfjB4MWYsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY3IH0sCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDApLCBGMyh+MywgfjB4MWYsIH4wKXxSUzIofjApLAkiWzFdQSxkIiwgMCwgdjcgfSwgLyogc3dhcGEgW3JzMSslZzBdLGQgKi8KLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMSksIEYzKH4zLCB+MHgxZiwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMSksIEYzKH4zLCB+MHgxZiwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMSksIEYzKH4zLCB+MHgxZiwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogc3dhcCBbcnMxKzBdLGQgKi8KLQoteyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDApLCBGMyh+MiwgfjB4M2QsIH4wKXxBU0kofjApLAkJCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMCksIEYzKH4yLCB+MHgzZCwgfjApfFJEX0cwfFJTMV9HMHxBU0lfUlMyKH4wKSwJIiIsIDAsIHY2IH0sIC8qIHJlc3RvcmUgJWcwLCVnMCwlZzAgKi8KLXsgInJlc3RvcmUiLAlGMygyLCAweDNkLCAxKSwgRjMofjIsIH4weDNkLCB+MSksCQkJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMSksIEYzKH4yLCB+MHgzZCwgfjEpfFJEX0cwfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjYgfSwgLyogcmVzdG9yZSAlZzAsMCwlZzAgKi8KLQoteyAicmV0dCIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxSRF9HMHxBU0kofjApLAkiMSsyIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCByczErcnMyICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sCS8qIHJldHQgcnMxLCVnMCAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMCwJCSIxK2kiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IHJzMStYICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwLAkJImkrMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgWCtyczEgKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzB8UlMxX0cwLAkJImkiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IFgrcnMxICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwJLyogcmV0dCBYICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwJLyogcmV0dCByczErMCAqLwotCi17ICJzYXZlIiwJRjMoMiwgMHgzYywgMCksIEYzKH4yLCB+MHgzYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzYXZlIiwJRjMoMiwgMHgzYywgMSksIEYzKH4yLCB+MHgzYywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInNhdmUiLAkweDgxZTAwMDAwLAl+MHg4MWUwMDAwMCwJCQkiIiwgRl9BTElBUywgdjYgfSwKLQoteyAicmV0IiwgIEYzKDIsIDB4MzgsIDEpfFJTMSgweDFmKXxTSU1NMTMoOCksIEYzKH4yLCB+MHgzOCwgfjEpfFNJTU0xMyh+OCksCSAgICAgICAiIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlaTcrOCwlZzAgKi8KLXsgInJldGwiLCBGMygyLCAweDM4LCAxKXxSUzEoMHgwZil8U0lNTTEzKDgpLCBGMyh+MiwgfjB4MzgsIH4xKXxSUzEofjB4MGYpfFNJTU0xMyh+OCksICIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVvNys4LCVnMCAqLwotCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfEFTSSh+MCksCSIxKzIsZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImptcGwiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8QVNJX1JTMih+MCksCSIxLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKyVnMCxkICovCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFNJTU0xMyh+MCksCSIxLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKzAsZCAqLwoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSUzFfRzAsCSJpLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWcwK2ksZCAqLwoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKSwJCSIxK2ksZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSksCQkiaSsxLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi0KLXsgImRvbmUiLAlGMygyLCAweDNlLCAwKXxSRCgwKSwgRjMofjIsIH4weDNlLCB+MCl8UkQofjApfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKLXsgInJldHJ5IiwJRjMoMiwgMHgzZSwgMCl8UkQoMSksIEYzKH4yLCB+MHgzZSwgfjApfFJEKH4xKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCi17ICJzYXZlZCIsCUYzKDIsIDB4MzEsIDApfFJEKDApLCBGMyh+MiwgfjB4MzEsIH4wKXxSRCh+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoteyAicmVzdG9yZWQiLAlGMygyLCAweDMxLCAwKXxSRCgxKSwgRjMofjIsIH4weDMxLCB+MCl8UkQofjEpfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKLXsgInNpciIsCUYzKDIsIDB4MzAsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzMCwgfjEpfFJEKH4weGYpfFJTMV9HMCwJCSJpIiwgMCwgdjkgfSwKLQoteyAiZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJKH4wKSwJIjErMiIsIDAsIHY4IH0sCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0lfUlMyKH4wKSwJIjEiLCAwLCB2OCB9LCAvKiBmbHVzaCByczErJWcwICovCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKXxTSU1NMTMofjApLAkiMSIsIDAsIHY4IH0sIC8qIGZsdXNoIHJzMSswICovCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKXxSUzFfRzAsCSJpIiwgMCwgdjggfSwgLyogZmx1c2ggJWcwK2kgKi8KLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJIjEraSIsIDAsIHY4IH0sCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSJpKzEiLCAwLCB2OCB9LAotCi0vKiBJRkxVU0ggd2FzIHJlbmFtZWQgdG8gRkxVU0ggaW4gdjguICAqLwoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSSh+MCksCSIxKzIiLCBGX0FMSUFTLCB2NiB9LAoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSV9SUzIofjApLAkiMSIsIEZfQUxJQVMsIHY2IH0sIC8qIGZsdXNoIHJzMSslZzAgKi8KLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKXxTSU1NMTMofjApLAkiMSIsIEZfQUxJQVMsIHY2IH0sIC8qIGZsdXNoIHJzMSswICovCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8UlMxX0cwLAkiaSIsIEZfQUxJQVMsIHY2IH0sCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiMStpIiwgRl9BTElBUywgdjYgfSwKLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSJpKzEiLCBGX0FMSUFTLCB2NiB9LAotCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8QVNJKH4wKSwJIjErMiIsIDAsIHY5IH0sCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8QVNJX1JTMih+MCksCSIxIiwgMCwgdjkgfSwgLyogcmV0dXJuIHJzMSslZzAgKi8KLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxTSU1NMTMofjApLAkiMSIsIDAsIHY5IH0sIC8qIHJldHVybiByczErMCAqLwoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJTMV9HMCwJImkiLCAwLCB2OSB9LCAvKiByZXR1cm4gJWcwK2kgKi8KLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKSwJCSIxK2kiLCAwLCB2OSB9LAoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpLAkJImkrMSIsIDAsIHY5IH0sCi0KLXsgImZsdXNodyIsCUYzKDIsIDB4MmIsIDApLCBGMyh+MiwgfjB4MmIsIH4wKXxSRF9HMHxSUzFfRzB8QVNJX1JTMih+MCksCSIiLCAwLCB2OSB9LAotCi17ICJtZW1iYXIiLAlGMygyLCAweDI4LCAxKXxSUzEoMHhmKSwgRjMofjIsIH4weDI4LCB+MSl8UkRfRzB8UlMxKH4weGYpfFNJTU0xMyh+MTI3KSwgIksiLCAwLCB2OSB9LAoteyAic3RiYXIiLAlGMygyLCAweDI4LCAwKXxSUzEoMHhmKSwgRjMofjIsIH4weDI4LCB+MCl8UkRfRzB8UlMxKH4weGYpfFNJTU0xMyh+MCksICIiLCAwLCB2OCB9LAotCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDApLCBGMyh+MywgfjB4MmQsIH4wKSwJCSJbMSsyXSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMCksIEYzKH4zLCB+MHgyZCwgfjApfFJTMl9HMCwJIlsxXSwqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2ggW3JzMSslZzBdLHByZWZldGNoX2ZjbiAqLwoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSksCQkiWzEraV0sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKSwJCSJbaSsxXSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpfFJTMV9HMCwJIltpXSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoIFtyczErMF0scHJlZmV0Y2hfZmNuICovCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAwKSwgRjMofjMsIH4weDNkLCB+MCksCQkiWzErMl1BLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMCksIEYzKH4zLCB+MHgzZCwgfjApfFJTMl9HMCwJIlsxXUEsKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoYSBbcnMxKyVnMF0scHJlZmV0Y2hfZmNuICovCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSksCQkiWzEraV1vLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpLAkJIltpKzFdbywqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKXxSUzFfRzAsCSJbaV1vLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaGEgW3JzMSswXSxkICovCi0KLXsgInNsbCIsCUYzKDIsIDB4MjUsIDApLCBGMyh+MiwgfjB4MjUsIH4wKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInNsbCIsCUYzKDIsIDB4MjUsIDEpLCBGMyh+MiwgfjB4MjUsIH4xKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsWCxkIiwgMCwgdjYgfSwKLXsgInNyYSIsCUYzKDIsIDB4MjcsIDApLCBGMyh+MiwgfjB4MjcsIH4wKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInNyYSIsCUYzKDIsIDB4MjcsIDEpLCBGMyh+MiwgfjB4MjcsIH4xKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsWCxkIiwgMCwgdjYgfSwKLXsgInNybCIsCUYzKDIsIDB4MjYsIDApLCBGMyh+MiwgfjB4MjYsIH4wKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInNybCIsCUYzKDIsIDB4MjYsIDEpLCBGMyh+MiwgfjB4MjYsIH4xKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsWCxkIiwgMCwgdjYgfSwKLQoteyAic2xseCIsCUYzKDIsIDB4MjUsIDApfCgxPDwxMiksIEYzKH4yLCB+MHgyNSwgfjApfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInNsbHgiLAlGMygyLCAweDI1LCAxKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjUsIH4xKXwoMHgzZjw8NiksCSIxLFksZCIsIDAsIHY5IH0sCi17ICJzcmF4IiwJRjMoMiwgMHgyNywgMCl8KDE8PDEyKSwgRjMofjIsIH4weDI3LCB+MCl8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic3JheCIsCUYzKDIsIDB4MjcsIDEpfCgxPDwxMiksIEYzKH4yLCB+MHgyNywgfjEpfCgweDNmPDw2KSwJIjEsWSxkIiwgMCwgdjkgfSwKLXsgInNybHgiLAlGMygyLCAweDI2LCAwKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjYsIH4wKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzcmx4IiwJRjMoMiwgMHgyNiwgMSl8KDE8PDEyKSwgRjMofjIsIH4weDI2LCB+MSl8KDB4M2Y8PDYpLAkiMSxZLGQiLCAwLCB2OSB9LAotCi17ICJtdWxzY2MiLAlGMygyLCAweDI0LCAwKSwgRjMofjIsIH4weDI0LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm11bHNjYyIsCUYzKDIsIDB4MjQsIDEpLCBGMyh+MiwgfjB4MjQsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgImRpdnNjYyIsCUYzKDIsIDB4MWQsIDApLCBGMyh+MiwgfjB4MWQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBzcGFyY2xpdGUgfSwKLXsgImRpdnNjYyIsCUYzKDIsIDB4MWQsIDEpLCBGMyh+MiwgfjB4MWQsIH4xKSwJCSIxLGksZCIsIDAsIHNwYXJjbGl0ZSB9LAotCi17ICJzY2FuIiwJRjMoMiwgMHgyYywgMCksIEYzKH4yLCB+MHgyYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHNwYXJjbGV0fHNwYXJjbGl0ZSB9LAoteyAic2NhbiIsCUYzKDIsIDB4MmMsIDEpLCBGMyh+MiwgfjB4MmMsIH4xKSwJCSIxLGksZCIsIDAsIHNwYXJjbGV0fHNwYXJjbGl0ZSB9LAotCi17ICJwb3BjIiwJRjMoMiwgMHgyZSwgMCksIEYzKH4yLCB+MHgyZSwgfjApfFJTMl9HMHxBU0kofjApLCIyLGQiLCAwLCB2OSB9LAoteyAicG9wYyIsCUYzKDIsIDB4MmUsIDEpLCBGMyh+MiwgfjB4MmUsIH4xKXxSUzJfRzAsCSJpLGQiLCAwLCB2OSB9LAotCi17ICJjbHIiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8UkRfRzB8UlMxX0cwfEFTSV9SUzIofjApLAkiZCIsIEZfQUxJQVMsIHY2IH0sIC8qIG9yICVnMCwlZzAsZCAqLwoteyAiY2xyIiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpfFJTMV9HMHxTSU1NMTMofjApLAkJImQiLCBGX0FMSUFTLCB2NiB9LCAvKiBvciAlZzAsMCxkCSovCi17ICJjbHIiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8UkRfRzB8QVNJKH4wKSwJCSJbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHIiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCQkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgJWcwLFtyczErJWcwXSAqLwoteyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwLAkJCSJbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzAsCQkJIltpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMHxSUzFfRzAsCQkJIltpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdCAlZzAsW3JzMSswXSAqLwotCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfFJEX0cwfEFTSSh+MCksCSJbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiICVnMCxbcnMxKyVnMF0gKi8KLXsgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzAsCQkiWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMCwJCSJbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiICVnMCxbcnMxKzBdICovCi0KLXsgImNscmgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8UkRfRzB8QVNJKH4wKSwJIlsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggJWcwLFtyczErJWcwXSAqLwoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMCwJCSJbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwLAkJIltpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzB8UlMxX0cwLAkJIltpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggJWcwLFtyczErMF0gKi8KLQoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxSRF9HMHxBU0kofjApLAkiWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0eCAlZzAsW3JzMSslZzBdICovCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwLAkJIlsxK2ldIiwgRl9BTElBUywgdjkgfSwKLXsgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzAsCQkiW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMHxSUzFfRzAsCQkiW2ldIiwgRl9BTElBUywgdjkgfSwKLXsgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0eCAlZzAsW3JzMSswXSAqLwotCi17ICJvcmNjIiwJRjMoMiwgMHgxMiwgMCksIEYzKH4yLCB+MHgxMiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJvcmNjIiwJRjMoMiwgMHgxMiwgMSksIEYzKH4yLCB+MHgxMiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgIm9yY2MiLAlGMygyLCAweDEyLCAxKSwgRjMofjIsIH4weDEyLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi0vKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgIm9ybmNjIiwJRjMoMiwgMHgxNiwgMCksIEYzKH4yLCB+MHgxNiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJvcm5jYyIsCUYzKDIsIDB4MTYsIDEpLCBGMyh+MiwgfjB4MTYsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLS8qIFRoaXMgaXMgbm90IGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAib3JuIiwJRjMoMiwgMHgwNiwgMCksIEYzKH4yLCB+MHgwNiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJvcm4iLAlGMygyLCAweDA2LCAxKSwgRjMofjIsIH4weDA2LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJ0c3QiLAlGMygyLCAweDEyLCAwKSwgRjMofjIsIH4weDEyLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxIiwgMCwgdjYgfSwgLyogb3JjYyByczEsICVnMCwgJWcwICovCi17ICJ0c3QiLAlGMygyLCAweDEyLCAwKSwgRjMofjIsIH4weDEyLCB+MCl8UkRfRzB8UlMxX0cwfEFTSSh+MCksCSIyIiwgMCwgdjYgfSwgLyogb3JjYyAlZzAsIHJzMiwgJWcwICovCi17ICJ0c3QiLAlGMygyLCAweDEyLCAxKSwgRjMofjIsIH4weDEyLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEiLCAwLCB2NiB9LCAvKiBvcmNjIHJzMSwgMCwgJWcwICovCi0KLXsgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxBU0kofjApLAkJIjEsMixtIiwgMCwgdjggfSwgLyogd3IgcixyLCVhc3JYICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDEpLAkJRjMofjIsIH4weDMwLCB+MSksCQkJIjEsaSxtIiwgMCwgdjggfSwgLyogd3IgcixpLCVhc3JYICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8QVNJX1JTMih+MCksCQkiMSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcnMxLCVnMCwlYXNyWCAqLwoteyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIseSIsIDAsIHY2IH0sIC8qIHdyIHIsciwleSAqLwoteyAid3IiLAlGMygyLCAweDMwLCAxKSwJCUYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwLAkJIjEsaSx5IiwgMCwgdjYgfSwgLyogd3IgcixpLCV5ICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByczEsJWcwLCV5ICovCi17ICJ3ciIsCUYzKDIsIDB4MzEsIDApLAkJRjMofjIsIH4weDMxLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMixwIiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLHIsJXBzciAqLwoteyAid3IiLAlGMygyLCAweDMxLCAxKSwJCUYzKH4yLCB+MHgzMSwgfjEpfFJEX0cwLAkJIjEsaSxwIiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLGksJXBzciAqLwoteyAid3IiLAlGMygyLCAweDMxLCAwKSwJCUYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCVwc3IgKi8KLXsgIndyIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHciLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwld2ltICovCi17ICJ3ciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSl8UkRfRzAsCQkiMSxpLHciLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwld2ltICovCi17ICJ3ciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXdpbSAqLwoteyAid3IiLAlGMygyLCAweDMzLCAwKSwJCUYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixyLCV0YnIgKi8KLXsgIndyIiwJRjMoMiwgMHgzMywgMSksCQlGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMCwJCSIxLGksdCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixpLCV0YnIgKi8KLXsgIndyIiwJRjMoMiwgMHgzMywgMCksCQlGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwldGJyICovCi0KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yKXxBU0kofjApLAkiMSwyLEUiLCAwLCB2OSB9LCAvKiB3ciByLHIsJWNjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIpLAkJIjEsaSxFIiwgMCwgdjkgfSwgLyogd3IgcixpLCVjY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMyksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4zKXxBU0kofjApLAkiMSwyLG8iLCAwLCB2OSB9LCAvKiB3ciByLHIsJWFzaSAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgzKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjMpLAkJIjEsaSxvIiwgMCwgdjkgfSwgLyogd3IgcixpLCVhc2kgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoNiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH42KXxBU0kofjApLAkiMSwyLHMiLCAwLCB2OSB9LCAvKiB3ciByLHIsJWZwcnMgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoNiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH42KSwJCSIxLGkscyIsIDAsIHY5IH0sIC8qIHdyIHIsaSwlZnBycyAqLwotCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDE2KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjE2KXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVwY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMTYpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MTYpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlcGNyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDE3KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjE3KXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVwaWMgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMTcpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MTcpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlcGljICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDE4KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjE4KXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVkY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMTgpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MTgpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlZGNyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDE5KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjE5KXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVnc3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMTkpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MTkpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlZ3NyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIwKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIwKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVzZXRfc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMCksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMCksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVzZXRfc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMSksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMSl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlY2xlYXJfc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMSksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMSksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVjbGVhcl9zb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIyKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIyKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVzb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIyKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIyKSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXNvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjMpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjMpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXRpY2tfY21wciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMyksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMyksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCV0aWNrX2NtcHIgKi8KLQoteyAicmQiLAlGMygyLCAweDI4LCAwKSwJCQlGMyh+MiwgfjB4MjgsIH4wKXxTSU1NMTMofjApLAkJIk0sZCIsIDAsIHY4IH0sIC8qIHJkICVhc3JYLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCksCQkJRjMofjIsIH4weDI4LCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ5LGQiLCAwLCB2NiB9LCAvKiByZCAleSxyICovCi17ICJyZCIsCUYzKDIsIDB4MjksIDApLAkJCUYzKH4yLCB+MHgyOSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkicCxkIiwgMCwgdjZub3R2OSB9LCAvKiByZCAlcHNyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyYSwgMCksCQkJRjMofjIsIH4weDJhLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ3LGQiLCAwLCB2Nm5vdHY5IH0sIC8qIHJkICV3aW0sciAqLwoteyAicmQiLAlGMygyLCAweDJiLCAwKSwJCQlGMyh+MiwgfjB4MmIsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInQsZCIsIDAsIHY2bm90djkgfSwgLyogcmQgJXRicixyICovCi0KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDIpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4yKXxTSU1NMTMofjApLAkiRSxkIiwgMCwgdjkgfSwgLyogcmQgJWNjcixyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgzKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+Myl8U0lNTTEzKH4wKSwJIm8sZCIsIDAsIHY5IH0sIC8qIHJkICVhc2ksciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoNCksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjQpfFNJTU0xMyh+MCksCSJXLGQiLCAwLCB2OSB9LCAvKiByZCAldGljayxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSg1KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+NSl8U0lNTTEzKH4wKSwJIlAsZCIsIDAsIHY5IH0sIC8qIHJkICVwYyxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSg2KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+Nil8U0lNTTEzKH4wKSwJInMsZCIsIDAsIHY5IH0sIC8qIHJkICVmcHJzLHIgKi8KLQoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTYpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xNil8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlcGNyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE3KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTcpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXBpYyxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxOCksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE4KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVkY3IsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTkpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xOSl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlZ3NyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDIyKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MjIpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXNvZnRpbnQsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMjMpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4yMyl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAldGlja19jbXByLHIgKi8KLQoteyAicmRwciIsCUYzKDIsIDB4MmEsIDApLAkJRjMofjIsIH4weDJhLCB+MCl8U0lNTTEzKH4wKSwJIj8sZCIsIDAsIHY5IH0sICAgLyogcmRwciAlcHJpdixyICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKSwJCSIxLDIsISIsIDAsIHY5IH0sIC8qIHdycHIgcjEscjIsJXByaXYgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApfFNJTU0xMyh+MCksCSIxLCEiLCAwLCB2OSB9LCAgIC8qIHdycHIgcjEsJXByaXYgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpLAkJIjEsaSwhIiwgMCwgdjkgfSwgLyogd3JwciByMSxpLCVwcml2ICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKSwJCSJpLDEsISIsIEZfQUxJQVMsIHY5IH0sIC8qIHdycHIgaSxyMSwlcHJpdiAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSl8UlMxKH4wKSwJImksISIsIDAsIHY5IH0sICAgLyogd3JwciBpLCVwcml2ICovCi0KLS8qID8/PyBUaGlzIGdyb3VwIHNlZW1zIHdyb25nLiAgQSB0aHJlZSBvcGVyYW5kIG1vdmU/ICAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMCksIEYzKH4yLCB+MHgzMCwgfjApfEFTSSh+MCksCQkiMSwyLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByLHIsJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKSwJCQkiMSxpLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByLGksJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByLHIsJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMCwJCSIxLGkseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHIsaSwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMCksIEYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixyLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDEpLCBGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMCwJCSIxLGkscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixpLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDApLCBGMyh+MiwgfjB4MzIsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAxKSwgRjMofjIsIH4weDMyLCB+MSl8UkRfRzAsCQkiMSxpLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAwKSwgRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLHIsJXRiciAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMSksIEYzKH4yLCB+MHgzMywgfjEpfFJEX0cwLAkJIjEsaSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLGksJXRiciAqLwotCi17ICJtb3YiLAlGMygyLCAweDI4LCAwKSwgRjMofjIsIH4weDI4LCB+MCl8U0lNTTEzKH4wKSwJCSJNLGQiLCBGX0FMSUFTLCB2OCB9LCAvKiByZCAlYXNyMSxyICovCi17ICJtb3YiLAlGMygyLCAweDI4LCAwKSwgRjMofjIsIH4weDI4LCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ5LGQiLCBGX0FMSUFTLCB2NiB9LCAvKiByZCAleSxyICovCi17ICJtb3YiLAlGMygyLCAweDI5LCAwKSwgRjMofjIsIH4weDI5LCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJwLGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHJkICVwc3IsciAqLwoteyAibW92IiwJRjMoMiwgMHgyYSwgMCksIEYzKH4yLCB+MHgyYSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidyxkIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiByZCAld2ltLHIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MmIsIDApLCBGMyh+MiwgfjB4MmIsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInQsZCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogcmQgJXRicixyICovCi0KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxBU0lfUlMyKH4wKSwJCSIxLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByczEsJWcwLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSksCQkJImksbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyICVnMCxpLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8U0lNTTEzKH4wKSwJCSIxLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByczEsMCwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMCksIEYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcnMxLCVnMCwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwLAkJImkseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyICVnMCxpLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHJzMSwwLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAwKSwgRjMofjIsIH4weDMxLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMSksIEYzKH4yLCB+MHgzMSwgfjEpfFJEX0cwLAkJImkscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgJWcwLGksJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMSksIEYzKH4yLCB+MHgzMSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwwLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDApLCBGMyh+MiwgfjB4MzIsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAxKSwgRjMofjIsIH4weDMyLCB+MSl8UkRfRzAsCQkiaSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciAlZzAsaSwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAxKSwgRjMofjIsIH4weDMyLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEsdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLDAsJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMCksIEYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV0YnIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDEpLCBGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMCwJCSJpLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyICVnMCxpLCV0YnIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDEpLCBGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsMCwldGJyICovCi0KLXsgIm1vdiIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxSUzFfRzB8QVNJKH4wKSwJIjIsZCIsIDAsIHY2IH0sIC8qIG9yICVnMCxyczIsZCAqLwoteyAibW92IiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpfFJTMV9HMCwJCSJpLGQiLCAwLCB2NiB9LCAvKiBvciAlZzAsaSxkCSovCi17ICJtb3YiLCAgICAgICAgRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfEFTSV9SUzIofjApLAkJIjEsZCIsIDAsIHY2IH0sIC8qIG9yIHJzMSwlZzAsZCAgICovCi17ICJtb3YiLCAgICAgICAgRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpfFNJTU0xMyh+MCksCQkiMSxkIiwgMCwgdjYgfSwgLyogb3IgcnMxLDAsZCAqLwotCi17ICJvciIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAib3IiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAib3IiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJic2V0IiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfEFTSSh+MCksCSIyLHIiLCBGX0FMSUFTLCB2NiB9LAkvKiBvciByZCxyczIscmQgKi8KLXsgImJzZXQiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSksCQkiaSxyIiwgRl9BTElBUywgdjYgfSwJLyogb3IgcmQsaSxyZCAqLwotCi0vKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgImFuZG4iLAlGMygyLCAweDA1LCAwKSwgRjMofjIsIH4weDA1LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFuZG4iLAlGMygyLCAweDA1LCAxKSwgRjMofjIsIH4weDA1LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi0vKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgImFuZG5jYyIsCUYzKDIsIDB4MTUsIDApLCBGMyh+MiwgfjB4MTUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYW5kbmNjIiwJRjMoMiwgMHgxNSwgMSksIEYzKH4yLCB+MHgxNSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAiYmNsciIsCUYzKDIsIDB4MDUsIDApLCBGMyh+MiwgfjB4MDUsIH4wKXxBU0kofjApLAkiMixyIiwgRl9BTElBUywgdjYgfSwJLyogYW5kbiByZCxyczIscmQgKi8KLXsgImJjbHIiLAlGMygyLCAweDA1LCAxKSwgRjMofjIsIH4weDA1LCB+MSksCQkiaSxyIiwgRl9BTElBUywgdjYgfSwJLyogYW5kbiByZCxpLHJkICovCi0KLXsgImNtcCIsCUYzKDIsIDB4MTQsIDApLCBGMyh+MiwgfjB4MTQsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyIiwgMCwgdjYgfSwJLyogc3ViY2MgcnMxLHJzMiwlZzAgKi8KLXsgImNtcCIsCUYzKDIsIDB4MTQsIDEpLCBGMyh+MiwgfjB4MTQsIH4xKXxSRF9HMCwJCSIxLGkiLCAwLCB2NiB9LAkvKiBzdWJjYyByczEsaSwlZzAgKi8KLQoteyAic3ViIiwJRjMoMiwgMHgwNCwgMCksIEYzKH4yLCB+MHgwNCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzdWIiLAlGMygyLCAweDA0LCAxKSwgRjMofjIsIH4weDA0LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJzdWJjYyIsCUYzKDIsIDB4MTQsIDApLCBGMyh+MiwgfjB4MTQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic3ViY2MiLAlGMygyLCAweDE0LCAxKSwgRjMofjIsIH4weDE0LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJzdWJ4IiwJRjMoMiwgMHgwYywgMCksIEYzKH4yLCB+MHgwYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2bm90djkgfSwKLXsgInN1YngiLAlGMygyLCAweDBjLCAxKSwgRjMofjIsIH4weDBjLCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJzdWJjIiwJRjMoMiwgMHgwYywgMCksIEYzKH4yLCB+MHgwYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzdWJjIiwJRjMoMiwgMHgwYywgMSksIEYzKH4yLCB+MHgwYywgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLQoteyAic3VieGNjIiwJRjMoMiwgMHgxYywgMCksIEYzKH4yLCB+MHgxYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2bm90djkgfSwKLXsgInN1YnhjYyIsCUYzKDIsIDB4MWMsIDEpLCBGMyh+MiwgfjB4MWMsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKLXsgInN1YmNjYyIsCUYzKDIsIDB4MWMsIDApLCBGMyh+MiwgfjB4MWMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic3ViY2NjIiwJRjMoMiwgMHgxYywgMSksIEYzKH4yLCB+MHgxYywgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLQoteyAiYW5kIiwJRjMoMiwgMHgwMSwgMCksIEYzKH4yLCB+MHgwMSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhbmQiLAlGMygyLCAweDAxLCAxKSwgRjMofjIsIH4weDAxLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAiYW5kIiwJRjMoMiwgMHgwMSwgMSksIEYzKH4yLCB+MHgwMSwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAiYW5kY2MiLAlGMygyLCAweDExLCAwKSwgRjMofjIsIH4weDExLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFuZGNjIiwJRjMoMiwgMHgxMSwgMSksIEYzKH4yLCB+MHgxMSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgImFuZGNjIiwJRjMoMiwgMHgxMSwgMSksIEYzKH4yLCB+MHgxMSwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAiZGVjIiwJRjMoMiwgMHgwNCwgMSl8U0lNTTEzKDB4MSksIEYzKH4yLCB+MHgwNCwgfjEpfFNJTU0xMyh+MHgwMDAxKSwgInIiLCBGX0FMSUFTLCB2NiB9LAkvKiBzdWIgcmQsMSxyZCAqLwoteyAiZGVjIiwJRjMoMiwgMHgwNCwgMSksCQkgICAgRjMofjIsIH4weDA0LCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIHN1YiByZCxpbW0scmQgKi8KLXsgImRlY2NjIiwJRjMoMiwgMHgxNCwgMSl8U0lNTTEzKDB4MSksIEYzKH4yLCB+MHgxNCwgfjEpfFNJTU0xMyh+MHgwMDAxKSwgInIiLCBGX0FMSUFTLCB2NiB9LAkvKiBzdWJjYyByZCwxLHJkICovCi17ICJkZWNjYyIsCUYzKDIsIDB4MTQsIDEpLAkJICAgIEYzKH4yLCB+MHgxNCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBzdWJjYyByZCxpbW0scmQgKi8KLXsgImluYyIsCUYzKDIsIDB4MDAsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MDAsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogYWRkIHJkLDEscmQgKi8KLXsgImluYyIsCUYzKDIsIDB4MDAsIDEpLAkJICAgIEYzKH4yLCB+MHgwMCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBhZGQgcmQsaW1tLHJkICovCi17ICJpbmNjYyIsCUYzKDIsIDB4MTAsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MTAsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogYWRkY2MgcmQsMSxyZCAqLwoteyAiaW5jY2MiLAlGMygyLCAweDEwLCAxKSwJCSAgICBGMyh+MiwgfjB4MTAsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogYWRkY2MgcmQsaW1tLHJkICovCi0KLXsgImJ0c3QiLAlGMygyLCAweDExLCAwKSwgRjMofjIsIH4weDExLCB+MCl8UkRfRzB8QVNJKH4wKSwgIjEsMiIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZGNjIHJzMSxyczIsJWcwICovCi17ICJidHN0IiwJRjMoMiwgMHgxMSwgMSksIEYzKH4yLCB+MHgxMSwgfjEpfFJEX0cwLCAiaSwxIiwgRl9BTElBUywgdjYgfSwJLyogYW5kY2MgcnMxLGksJWcwICovCi0KLXsgIm5lZyIsCUYzKDIsIDB4MDQsIDApLCBGMyh+MiwgfjB4MDQsIH4wKXxSUzFfRzB8QVNJKH4wKSwgIjIsZCIsIEZfQUxJQVMsIHY2IH0sIC8qIHN1YiAlZzAscnMyLHJkICovCi17ICJuZWciLAlGMygyLCAweDA0LCAwKSwgRjMofjIsIH4weDA0LCB+MCl8UlMxX0cwfEFTSSh+MCksICJPIiwgRl9BTElBUywgdjYgfSwgLyogc3ViICVnMCxyZCxyZCAqLwotCi17ICJhZGQiLAlGMygyLCAweDAwLCAwKSwgRjMofjIsIH4weDAwLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFkZCIsCUYzKDIsIDB4MDAsIDEpLCBGMyh+MiwgfjB4MDAsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJhZGQiLAlGMygyLCAweDAwLCAxKSwgRjMofjIsIH4weDAwLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoteyAiYWRkY2MiLAlGMygyLCAweDEwLCAwKSwgRjMofjIsIH4weDEwLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFkZGNjIiwJRjMoMiwgMHgxMCwgMSksIEYzKH4yLCB+MHgxMCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgImFkZGNjIiwJRjMoMiwgMHgxMCwgMSksIEYzKH4yLCB+MHgxMCwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAiYWRkeCIsCUYzKDIsIDB4MDgsIDApLCBGMyh+MiwgfjB4MDgsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGR4IiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkeCIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSJpLDEsZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZGMiLAlGMygyLCAweDA4LCAwKSwgRjMofjIsIH4weDA4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgImFkZGMiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoteyAiYWRkYyIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSJpLDEsZCIsIDAsIHY5IH0sCi0KLXsgImFkZHhjYyIsCUYzKDIsIDB4MTgsIDApLCBGMyh+MiwgfjB4MTgsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGR4Y2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGR4Y2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiaSwxLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGRjY2MiLAlGMygyLCAweDE4LCAwKSwgRjMofjIsIH4weDE4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgImFkZGNjYyIsCUYzKDIsIDB4MTgsIDEpLCBGMyh+MiwgfjB4MTgsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi17ICJhZGRjY2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiaSwxLGQiLCAwLCB2OSB9LAotCi17ICJzbXVsIiwJRjMoMiwgMHgwYiwgMCksIEYzKH4yLCB+MHgwYiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJzbXVsIiwJRjMoMiwgMHgwYiwgMSksIEYzKH4yLCB+MHgwYiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInNtdWwiLAlGMygyLCAweDBiLCAxKSwgRjMofjIsIH4weDBiLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAic211bGNjIiwJRjMoMiwgMHgxYiwgMCksIEYzKH4yLCB+MHgxYiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJzbXVsY2MiLAlGMygyLCAweDFiLCAxKSwgRjMofjIsIH4weDFiLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAic211bGNjIiwJRjMoMiwgMHgxYiwgMSksIEYzKH4yLCB+MHgxYiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInVtdWwiLAlGMygyLCAweDBhLCAwKSwgRjMofjIsIH4weDBhLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInVtdWwiLAlGMygyLCAweDBhLCAxKSwgRjMofjIsIH4weDBhLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAidW11bCIsCUYzKDIsIDB4MGEsIDEpLCBGMyh+MiwgfjB4MGEsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJ1bXVsY2MiLAlGMygyLCAweDFhLCAwKSwgRjMofjIsIH4weDFhLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInVtdWxjYyIsCUYzKDIsIDB4MWEsIDEpLCBGMyh+MiwgfjB4MWEsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJ1bXVsY2MiLAlGMygyLCAweDFhLCAxKSwgRjMofjIsIH4weDFhLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAic2RpdiIsCUYzKDIsIDB4MGYsIDApLCBGMyh+MiwgfjB4MGYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAic2RpdiIsCUYzKDIsIDB4MGYsIDEpLCBGMyh+MiwgfjB4MGYsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJzZGl2IiwJRjMoMiwgMHgwZiwgMSksIEYzKH4yLCB+MHgwZiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInNkaXZjYyIsCUYzKDIsIDB4MWYsIDApLCBGMyh+MiwgfjB4MWYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAic2RpdmNjIiwJRjMoMiwgMHgxZiwgMSksIEYzKH4yLCB+MHgxZiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInNkaXZjYyIsCUYzKDIsIDB4MWYsIDEpLCBGMyh+MiwgfjB4MWYsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJ1ZGl2IiwJRjMoMiwgMHgwZSwgMCksIEYzKH4yLCB+MHgwZSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJ1ZGl2IiwJRjMoMiwgMHgwZSwgMSksIEYzKH4yLCB+MHgwZSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInVkaXYiLAlGMygyLCAweDBlLCAxKSwgRjMofjIsIH4weDBlLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAidWRpdmNjIiwJRjMoMiwgMHgxZSwgMCksIEYzKH4yLCB+MHgxZSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJ1ZGl2Y2MiLAlGMygyLCAweDFlLCAxKSwgRjMofjIsIH4weDFlLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAidWRpdmNjIiwJRjMoMiwgMHgxZSwgMSksIEYzKH4yLCB+MHgxZSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLQoteyAibXVseCIsCUYzKDIsIDB4MDksIDApLCBGMyh+MiwgfjB4MDksIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAibXVseCIsCUYzKDIsIDB4MDksIDEpLCBGMyh+MiwgfjB4MDksIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi17ICJzZGl2eCIsCUYzKDIsIDB4MmQsIDApLCBGMyh+MiwgfjB4MmQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic2RpdngiLAlGMygyLCAweDJkLCAxKSwgRjMofjIsIH4weDJkLCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoteyAidWRpdngiLAlGMygyLCAweDBkLCAwKSwgRjMofjIsIH4weDBkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInVkaXZ4IiwJRjMoMiwgMHgwZCwgMSksIEYzKH4yLCB+MHgwZCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLQoteyAiY2FsbCIsCUYxKDB4MSksIEYxKH4weDEpLCAiTCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMSgweDEpLCBGMSh+MHgxKSwgIkwsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLQoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSSh+MCksCSIxKzIiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK3JzMiwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0kofjApLAkiMSsyLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJX1JTMih+MCksCSIxIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSslZzAsJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJX1JTMih+MCksCSIxLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiMStpIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStpLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJIjEraSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJImkrMSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCBpK3JzMSwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSJpKzEsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxSUzFfRzAsCSJpIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVnMCtpLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpfFJTMV9HMCwJImksIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxTSU1NMTMofjApLAkiMSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErMCwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxTSU1NMTMofjApLAkiMSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAotCi0KLS8qIENvbmRpdGlvbmFsIGluc3RydWN0aW9ucy4KLQotICAgQmVjYXVzZSB0aGlzIHBhcnQgb2YgdGhlIHRhYmxlIHdhcyBzdWNoIGEgbWVzcyBlYXJsaWVyLCBJIGhhdmUKLSAgIG1hY3JvZmllZCBpdCBzbyB0aGF0IGFsbCB0aGUgYnJhbmNoZXMgYW5kIHRyYXBzIGFyZSBnZW5lcmF0ZWQgZnJvbQotICAgYSBzaW5nbGUtbGluZSBkZXNjcmlwdGlvbiBvZiBlYWNoIGNvbmRpdGlvbiB2YWx1ZS4gIEpvaG4gR2lsbW9yZS4gKi8KLQotLyogRGVmaW5lIGJyYW5jaGVzIC0tIG9uZSBhbm51bGxlZCwgb25lIHdpdGhvdXQsIGV0Yy4gKi8KLSNkZWZpbmUgYnIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIChsb3NlKSwgICAgICAgIixhIGwiLCAgIChmbGFncyksIHY2IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spICAgICAgLCAobG9zZSl8QU5OVUwsICJsIiwgICAgIChmbGFncyksIHY2IH0KLQotI2RlZmluZSBicngob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiWixHIiwgICAgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVELCBBTk5VTHwobG9zZSksICIsVCBaLEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhIFosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEsVCBaLEciLCAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApLCBBTk5VTHxCUFJFRHwobG9zZSksICIsTiBaLEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QU5OVUwsIEJQUkVEfChsb3NlKSwgIixhLE4gWixHIiwgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKXwoMjw8MjApLCAieixHIiwgICAgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpfCgyPDwyMCksICIsVCB6LEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSl8KDI8PDIwKSwgIixhIHosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUR8QU5OVUwsIChsb3NlKXwoMjw8MjApLCAiLGEsVCB6LEciLCAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8QlBSRUR8KGxvc2UpfCgyPDwyMCksICIsTiB6LEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCBCUFJFRHwobG9zZSl8KDI8PDIwKSwgIixhLE4geixHIiwgKGZsYWdzKSwgdjkgfQotCi0vKiBEZWZpbmUgZm91ciB0cmFwczogcmVnK3JlZywgcmVnICsgaW1tZWRpYXRlLCBpbW1lZGlhdGUgYWxvbmUsIHJlZyBhbG9uZS4gKi8KLSNkZWZpbmUgdHIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDExKXxJTU1FRCwgKGxvc2UpfFJTMV9HMCwJIlosaSIsICAgKGZsYWdzKSwgdjkgfSwgLyogJWcwICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSl8SU1NRUQsIChsb3NlKSwJIlosMStpIiwgKGZsYWdzKSwgdjkgfSwgLyogcnMxICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSksIElNTUVEfChsb3NlKSwJIlosMSsyIiwgKGZsYWdzKSwgdjkgfSwgLyogcnMxICsgcnMyICovIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSksIElNTUVEfChsb3NlKXxSUzJfRzAsCSJaLDEiLCAgIChmbGFncyksIHY5IH0sIC8qIHJzMSArICVnMCAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpfFJTMV9HMCwJInosaSIsICAgKGZsYWdzKXxGX0FMSUFTLCB2OSB9LCAvKiAlZzAgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKSwJInosMStpIiwgKGZsYWdzKXxGX0FMSUFTLCB2OSB9LCAvKiByczEgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKSwJInosMSsyIiwgKGZsYWdzKXxGX0FMSUFTLCB2OSB9LCAvKiByczEgKyByczIgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKXxSUzJfRzAsCSJ6LDEiLCAgIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogcnMxICsgJWcwICovIFwKLSB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSl8UlMxX0cwLAkJImkiLCAgICAgKGZsYWdzKSwgdjYgfSwgLyogJWcwICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSksCQkiMStpIiwgICAoZmxhZ3MpLCB2NiB9LCAvKiByczEgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKSwJCSIxKzIiLCAgIChmbGFncyksIHY2IH0sIC8qIHJzMSArIHJzMiAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgSU1NRUR8KGxvc2UpfFJTMl9HMCwJCSIxIiwgICAgIChmbGFncyksIHY2IH0gLyogcnMxICsgJWcwICovCi0KLS8qIHY5OiBXZSBtdXN0IHB1dCBgYnJ4JyBiZWZvcmUgYGJyJywgdG8gZW5zdXJlIHRoYXQgd2UgbmV2ZXIgbWF0Y2ggc29tZXRoaW5nCi0gICB2OTogYWdhaW5zdCBhbiBleHByZXNzaW9uIHVubGVzcyBpdCBpcyBhbiBleHByZXNzaW9uLiAgT3RoZXJ3aXNlLCB3ZSBlbmQKLSAgIHY5OiB1cCB3aXRoIHVuZGVmaW5lZCBzeW1ib2wgdGFibGVzIGVudHJpZXMsIGJlY2F1c2UgdGhleSBnZXQgYWRkZWQsIGJ1dAotICAgdjk6IGFyZSBub3QgZGVsZXRlZCBpZiB0aGUgcGF0dGVybiBmYWlscyB0byBtYXRjaC4gICovCi0KLS8qIERlZmluZSBib3RoIGJyYW5jaGVzIGFuZCB0cmFwcyBiYXNlZCBvbiBjb25kaXRpb24gbWFzayAqLwotI2RlZmluZSBjb25kKGJvcCwgdG9wLCBtYXNrLCBmbGFncykgXAotICBicngoYm9wLCBGMigwLCAxKXwobWFzayksIEYyKH4wLCB+MSl8KCh+bWFzaykmQ09ORCh+MCkpLCBGX0RFTEFZRUR8KGZsYWdzKSksIC8qIHY5ICovIFwKLSAgYnIoYm9wLCAgRjIoMCwgMil8KG1hc2spLCBGMih+MCwgfjIpfCgofm1hc2spJkNPTkQofjApKSwgRl9ERUxBWUVEfChmbGFncykpLCBcCi0gIHRyKHRvcCwgIEYzKDIsIDB4M2EsIDApfChtYXNrKSwgRjMofjIsIH4weDNhLCAwKXwoKH5tYXNrKSZDT05EKH4wKSksICgoZmxhZ3MpICYgfihGX1VOQlJ8Rl9DT05EQlIpKSkKLQotLyogRGVmaW5lIGFsbCB0aGUgY29uZGl0aW9ucywgYWxsIHRoZSBicmFuY2hlcywgYWxsIHRoZSB0cmFwcy4gICovCi0KLS8qIFN0YW5kYXJkIGJyYW5jaCwgdHJhcCBtbmVtb25pY3MgKi8KLWNvbmQgKCJiIiwJInRhIiwgICBDT05EQSwgRl9VTkJSKSwKLS8qIEFsdGVybmF0aXZlIGZvcm0gKGp1c3QgZm9yIGFzc2VtYmx5LCBub3QgZm9yIGRpc2Fzc2VtYmx5KSAqLwotY29uZCAoImJhIiwJInQiLCAgICBDT05EQSwgRl9VTkJSfEZfQUxJQVMpLAotCi1jb25kICgiYmNjIiwJInRjYyIsICBDT05EQ0MsIEZfQ09OREJSKSwKLWNvbmQgKCJiY3MiLAkidGNzIiwgIENPTkRDUywgRl9DT05EQlIpLAotY29uZCAoImJlIiwJInRlIiwgICBDT05ERSwgRl9DT05EQlIpLAotY29uZCAoImJlcSIsCSJ0ZXEiLCAgQ09OREUsIEZfQ09OREJSfEZfQUxJQVMpLAotY29uZCAoImJnIiwJInRnIiwgICBDT05ERywgRl9DT05EQlIpLAotY29uZCAoImJndCIsCSJ0Z3QiLCAgQ09OREcsIEZfQ09OREJSfEZfQUxJQVMpLAotY29uZCAoImJnZSIsCSJ0Z2UiLCAgQ09OREdFLCBGX0NPTkRCUiksCi1jb25kICgiYmdldSIsCSJ0Z2V1IiwgQ09OREdFVSwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBjYyAqLwotY29uZCAoImJndSIsCSJ0Z3UiLCAgQ09OREdVLCBGX0NPTkRCUiksCi1jb25kICgiYmwiLAkidGwiLCAgIENPTkRMLCBGX0NPTkRCUiksCi1jb25kICgiYmx0IiwJInRsdCIsICBDT05ETCwgRl9DT05EQlJ8Rl9BTElBUyksCi1jb25kICgiYmxlIiwJInRsZSIsICBDT05ETEUsIEZfQ09OREJSKSwKLWNvbmQgKCJibGV1IiwJInRsZXUiLCBDT05ETEVVLCBGX0NPTkRCUiksCi1jb25kICgiYmx1IiwJInRsdSIsICBDT05ETFUsIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgY3MgKi8KLWNvbmQgKCJibiIsCSJ0biIsICAgQ09ORE4sIEZfQ09OREJSKSwKLWNvbmQgKCJibmUiLAkidG5lIiwgIENPTkRORSwgRl9DT05EQlIpLAotY29uZCAoImJuZWciLAkidG5lZyIsIENPTkRORUcsIEZfQ09OREJSKSwKLWNvbmQgKCJibnoiLAkidG56IiwgIENPTkROWiwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBuZSAqLwotY29uZCAoImJwb3MiLAkidHBvcyIsIENPTkRQT1MsIEZfQ09OREJSKSwKLWNvbmQgKCJidmMiLAkidHZjIiwgIENPTkRWQywgRl9DT05EQlIpLAotY29uZCAoImJ2cyIsCSJ0dnMiLCAgQ09ORFZTLCBGX0NPTkRCUiksCi1jb25kICgiYnoiLAkidHoiLCAgIENPTkRaLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIGUgKi8KLQotI3VuZGVmIGNvbmQKLSN1bmRlZiBicgotI3VuZGVmIGJyciAvKiB2OSAqLwotI3VuZGVmIHRyCi0KLSNkZWZpbmUgYnJyKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSksICIxLGsiLCAgICAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiLFQgMSxrIiwgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhIDEsayIsICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSxUIDEsayIsIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8QlBSRUR8KGxvc2UpLCAiLE4gMSxrIiwgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIEJQUkVEfChsb3NlKSwgIixhLE4gMSxrIiwgRl9ERUxBWUVEfChmbGFncyksIHY5IH0KLQotI2RlZmluZSBjb25kcihib3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0gIGJycihib3AsIEYyKDAsIDMpfENPTkQobWFzayksIEYyKH4wLCB+Myl8Q09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KLQotLyogdjkgKi8gY29uZHIoImJybnoiLCAweDUsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicnoiLCAweDEsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicmdleiIsIDB4NywgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJybHoiLCAweDMsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicmxleiIsIDB4MiwgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJyZ3oiLCAweDYsIEZfQ09OREJSKSwKLQotI3VuZGVmIGNvbmRyIC8qIHY5ICovCi0jdW5kZWYgYnJyIC8qIHY5ICovCi0KLSNkZWZpbmUgbW92cihvcGNvZGUsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIEYzKDIsIDB4MmYsIDApfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MmYsIH4wKXxSQ09ORCh+KG1hc2spKSwgIjEsMixkIiwgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGMygyLCAweDJmLCAxKXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDJmLCB+MSl8UkNPTkQofihtYXNrKSksICIxLGosZCIsIChmbGFncyksIHY5IH0KLQotI2RlZmluZSBmbXJycyhvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgKGxvc2UpLCAiMSxmLGciLCAoZmxhZ3MpIHwgRl9GTE9BVCwgdjkgfQotI2RlZmluZSBmbXJyZChvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgKGxvc2UpLCAiMSxCLEgiLCAoZmxhZ3MpIHwgRl9GTE9BVCwgdjkgfQotI2RlZmluZSBmbXJycShvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgKGxvc2UpLCAiMSxSLEoiLCAoZmxhZ3MpIHwgRl9GTE9BVCwgdjkgfQotCi0jZGVmaW5lIGZtb3Zycyhtb3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0gIGZtcnJzKG1vcCwgRjMoMiwgMHgzNSwgMCl8T1BGX0xPVzUoNSl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgzNSwgMCl8T1BGX0xPVzUofjUpfFJDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLwotI2RlZmluZSBmbW92cmQobW9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotICBmbXJyZChtb3AsIEYzKDIsIDB4MzUsIDApfE9QRl9MT1c1KDYpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MzUsIDApfE9QRl9MT1c1KH42KXxSQ09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KLSNkZWZpbmUgZm1vdnJxKG1vcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSAgZm1ycnEobW9wLCBGMygyLCAweDM1LCAwKXxPUEZfTE9XNSg3KXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDM1LCAwKXxPUEZfTE9XNSh+Nyl8UkNPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCi0KLS8qIHY5ICovIG1vdnIoIm1vdnJuZSIsIDB4NSwgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZyZSIsIDB4MSwgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZyZ2V6IiwgMHg3LCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJseiIsIDB4MywgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZybGV6IiwgMHgyLCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJneiIsIDB4NiwgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZybnoiLCAweDUsIEZfQUxJQVMpLAotLyogdjkgKi8gbW92cigibW92cnoiLCAweDEsIEZfQUxJQVMpLAotCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc25lIiwgMHg1LCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzZSIsIDB4MSwgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2dleiIsIDB4NywgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2x6IiwgMHgzLCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzbGV6IiwgMHgyLCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzZ3oiLCAweDYsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNueiIsIDB4NSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc3oiLCAweDEsIEZfQUxJQVMpLAotCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZG5lIiwgMHg1LCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkZSIsIDB4MSwgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGdleiIsIDB4NywgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGx6IiwgMHgzLCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbGV6IiwgMHgyLCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkZ3oiLCAweDYsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRueiIsIDB4NSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZHoiLCAweDEsIEZfQUxJQVMpLAotCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycW5lIiwgMHg1LCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxZSIsIDB4MSwgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWdleiIsIDB4NywgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWx6IiwgMHgzLCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbGV6IiwgMHgyLCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxZ3oiLCAweDYsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFueiIsIDB4NSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycXoiLCAweDEsIEZfQUxJQVMpLAotCi0jdW5kZWYgbW92ciAvKiB2OSAqLwotI3VuZGVmIGZtb3ZyIC8qIHY5ICovCi0jdW5kZWYgZm1yciAvKiB2OSAqLwotCi0jZGVmaW5lIG1vdmljYyhvcGNvZGUsIGNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxNQ09ORChjb25kLDEpfElDQywgRjMofjIsIH4weDJjLCB+MCl8TUNPTkQofmNvbmQsfjEpfFhDQ3woMTw8MTEpLCAieiwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8TUNPTkQoY29uZCwxKXxJQ0MsIEYzKH4yLCB+MHgyYywgfjEpfE1DT05EKH5jb25kLH4xKXxYQ0N8KDE8PDExKSwgInosSSxkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfE1DT05EKGNvbmQsMSl8WENDLCBGMyh+MiwgfjB4MmMsIH4wKXxNQ09ORCh+Y29uZCx+MSl8KDE8PDExKSwgICAgICJaLDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxNQ09ORChjb25kLDEpfFhDQywgRjMofjIsIH4weDJjLCB+MSl8TUNPTkQofmNvbmQsfjEpfCgxPDwxMSksICAgICAiWixJLGQiLCBmbGFncywgdjkgfQotCi0jZGVmaW5lIG1vdmZjYyhvcGNvZGUsIGZjb25kLCBmbGFncykgLyogdjkgKi8gXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDApfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MCl8RjMofjIsIH4weDJjLCB+MCksICI2LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMCl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4wKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjYsSSxkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygxKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjEpfEYzKH4yLCB+MHgyYywgfjApLCAiNywyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDEpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MSl8RjMofjIsIH4weDJjLCB+MSksICI3LEksZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMil8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4yKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjgsMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygyKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjIpfEYzKH4yLCB+MHgyYywgfjEpLCAiOCxJLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDMpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Myl8RjMofjIsIH4weDJjLCB+MCksICI5LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMyl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4zKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjksSSxkIiwgZmxhZ3MsIHY5IH0KLQotI2RlZmluZSBtb3ZjYyhvcGNvZGUsIGNvbmQsIGZjb25kLCBmbGFncykgLyogdjkgKi8gXAotICBtb3ZmY2MgKG9wY29kZSwgZmNvbmQsIGZsYWdzKSwgLyogdjkgKi8gXAotICBtb3ZpY2MgKG9wY29kZSwgY29uZCwgZmxhZ3MpIC8qIHY5ICovCi0KLS8qIHY5ICovIG1vdmNjICAoIm1vdmEiLAlDT05EQSwgRkNPTkRBLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmNjIiwJQ09ORENDLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmdldSIsCUNPTkRHRVUsIEZfQUxJQVMpLAotLyogdjkgKi8gbW92aWNjICgibW92Y3MiLAlDT05EQ1MsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92bHUiLAlDT05ETFUsIEZfQUxJQVMpLAotLyogdjkgKi8gbW92Y2MgICgibW92ZSIsCUNPTkRFLCBGQ09OREUsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92ZyIsCUNPTkRHLCBGQ09OREcsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92Z2UiLAlDT05ER0UsIEZDT05ER0UsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92Z3UiLAlDT05ER1UsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92bCIsCUNPTkRMLCBGQ09OREwsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92bGUiLAlDT05ETEUsIEZDT05ETEUsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92bGV1IiwJQ09ORExFVSwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3ZsZyIsCUZDT05ETEcsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92biIsCUNPTkROLCBGQ09ORE4sIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92bmUiLAlDT05ETkUsIEZDT05ETkUsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92bmVnIiwJQ09ORE5FRywgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZueiIsCUNPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3ZvIiwJRkNPTkRPLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdnBvcyIsCUNPTkRQT1MsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dSIsCUZDT05EVSwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1ZSIsCUZDT05EVUUsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWciLAlGQ09ORFVHLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVnZSIsCUZDT05EVUdFLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVsIiwJRkNPTkRVTCwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1bGUiLAlGQ09ORFVMRSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3Z2YyIsCUNPTkRWQywgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3Z2cyIsCUNPTkRWUywgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3Z6IiwJQ09ORFosIEZDT05EWiwgRl9BTElBUyksCi0KLSN1bmRlZiBtb3ZpY2MgLyogdjkgKi8KLSN1bmRlZiBtb3ZmY2MgLyogdjkgKi8KLSN1bmRlZiBtb3ZjYyAvKiB2OSAqLwotCi0jZGVmaW5lIEZNX1NGIDEJCS8qIHY5IC0gdmFsdWVzIGZvciBmcHNpemUgKi8KLSNkZWZpbmUgRk1fREYgMgkJLyogdjkgKi8KLSNkZWZpbmUgRk1fUUYgMwkJLyogdjkgKi8KLQotI2RlZmluZSBmbW92aWNjKG9wY29kZSwgZnBzaXplLCBjb25kLCBmbGFncykgLyogdjkgKi8gXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDEwMCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTAwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJ6LGYsZyIsIGZsYWdzLCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTgwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxODArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgIlosZixnIiwgZmxhZ3MsIHY5IH0KLQotI2RlZmluZSBmbW92ZmNjKG9wY29kZSwgZnBzaXplLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwMDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDAwMCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNixmLGciLCBmbGFncywgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA0MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDQwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI3LGYsZyIsIGZsYWdzLCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDgwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwODArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjgsZixnIiwgZmxhZ3MsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwYzArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDBjMCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiOSxmLGciLCBmbGFncywgdjkgfQotCi0vKiBGSVhNRTogdXNlIGZtb3ZpY2MvZm1vdmZjYz8gKi8gLyogdjkgKi8KLSNkZWZpbmUgZm1vdmNjKG9wY29kZSwgZnBzaXplLCBjb25kLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxMDArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDEwMCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAieixmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwMDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDAwMCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNixmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxODArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDE4MCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAiWixmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwNDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA0MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNyxmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwODArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA4MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiOCxmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwYzArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDBjMCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiOSxmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0KLQotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkYSIsCUZNX0RGLCBDT05EQSwgRkNPTkRBLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWEiLAlGTV9RRiwgQ09OREEsIEZDT05EQSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNhIiwJRk1fU0YsIENPTkRBLCBGQ09OREEsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkY2MiLAlGTV9ERiwgQ09ORENDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWNjIiwJRk1fUUYsIENPTkRDQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNjYyIsCUZNX1NGLCBDT05EQ0MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkY3MiLAlGTV9ERiwgQ09ORENTLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWNzIiwJRk1fUUYsIENPTkRDUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNjcyIsCUZNX1NGLCBDT05EQ1MsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkZSIsCUZNX0RGLCBDT05ERSwgRkNPTkRFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWUiLAlGTV9RRiwgQ09OREUsIEZDT05ERSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNlIiwJRk1fU0YsIENPTkRFLCBGQ09OREUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkZyIsCUZNX0RGLCBDT05ERywgRkNPTkRHLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWciLAlGTV9RRiwgQ09OREcsIEZDT05ERywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNnIiwJRk1fU0YsIENPTkRHLCBGQ09OREcsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkZ2UiLAlGTV9ERiwgQ09OREdFLCBGQ09OREdFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWdlIiwJRk1fUUYsIENPTkRHRSwgRkNPTkRHRSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNnZSIsCUZNX1NGLCBDT05ER0UsIEZDT05ER0UsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkZ2V1IiwJRk1fREYsIENPTkRHRVUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxZ2V1IiwJRk1fUUYsIENPTkRHRVUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzZ2V1IiwJRk1fU0YsIENPTkRHRVUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkZ3UiLAlGTV9ERiwgQ09OREdVLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWd1IiwJRk1fUUYsIENPTkRHVSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNndSIsCUZNX1NGLCBDT05ER1UsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbCIsCUZNX0RGLCBDT05ETCwgRkNPTkRMLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWwiLAlGTV9RRiwgQ09OREwsIEZDT05ETCwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNsIiwJRk1fU0YsIENPTkRMLCBGQ09OREwsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbGUiLAlGTV9ERiwgQ09ORExFLCBGQ09ORExFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWxlIiwJRk1fUUYsIENPTkRMRSwgRkNPTkRMRSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNsZSIsCUZNX1NGLCBDT05ETEUsIEZDT05ETEUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkbGV1IiwJRk1fREYsIENPTkRMRVUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxbGV1IiwJRk1fUUYsIENPTkRMRVUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzbGV1IiwJRk1fU0YsIENPTkRMRVUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkbGciLAlGTV9ERiwgRkNPTkRMRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnFsZyIsCUZNX1FGLCBGQ09ORExHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c2xnIiwJRk1fU0YsIEZDT05ETEcsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkbHUiLAlGTV9ERiwgQ09ORExVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWx1IiwJRk1fUUYsIENPTkRMVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNsdSIsCUZNX1NGLCBDT05ETFUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbiIsCUZNX0RGLCBDT05ETiwgRkNPTkROLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cW4iLAlGTV9RRiwgQ09ORE4sIEZDT05ETiwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNuIiwJRk1fU0YsIENPTkROLCBGQ09ORE4sIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbmUiLAlGTV9ERiwgQ09ORE5FLCBGQ09ORE5FLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cW5lIiwJRk1fUUYsIENPTkRORSwgRkNPTkRORSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNuZSIsCUZNX1NGLCBDT05ETkUsIEZDT05ETkUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkbmVnIiwJRk1fREYsIENPTkRORUcsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxbmVnIiwJRk1fUUYsIENPTkRORUcsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzbmVnIiwJRk1fU0YsIENPTkRORUcsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbnoiLAlGTV9ERiwgQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cW56IiwJRk1fUUYsIENPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNueiIsCUZNX1NGLCBDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkbyIsCUZNX0RGLCBGQ09ORE8sIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxbyIsCUZNX1FGLCBGQ09ORE8sIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzbyIsCUZNX1NGLCBGQ09ORE8sIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkcG9zIiwJRk1fREYsIENPTkRQT1MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxcG9zIiwJRk1fUUYsIENPTkRQT1MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzcG9zIiwJRk1fU0YsIENPTkRQT1MsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdSIsCUZNX0RGLCBGQ09ORFUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdSIsCUZNX1FGLCBGQ09ORFUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdSIsCUZNX1NGLCBGQ09ORFUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWUiLAlGTV9ERiwgRkNPTkRVRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1ZSIsCUZNX1FGLCBGQ09ORFVFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VlIiwJRk1fU0YsIEZDT05EVUUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWciLAlGTV9ERiwgRkNPTkRVRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1ZyIsCUZNX1FGLCBGQ09ORFVHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VnIiwJRk1fU0YsIEZDT05EVUcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWdlIiwJRk1fREYsIEZDT05EVUdFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVnZSIsCUZNX1FGLCBGQ09ORFVHRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1Z2UiLAlGTV9TRiwgRkNPTkRVR0UsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWwiLAlGTV9ERiwgRkNPTkRVTCwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1bCIsCUZNX1FGLCBGQ09ORFVMLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VsIiwJRk1fU0YsIEZDT05EVUwsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWxlIiwJRk1fREYsIEZDT05EVUxFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVsZSIsCUZNX1FGLCBGQ09ORFVMRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1bGUiLAlGTV9TRiwgRkNPTkRVTEUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkdmMiLAlGTV9ERiwgQ09ORFZDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cXZjIiwJRk1fUUYsIENPTkRWQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnN2YyIsCUZNX1NGLCBDT05EVkMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkdnMiLAlGTV9ERiwgQ09ORFZTLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cXZzIiwJRk1fUUYsIENPTkRWUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnN2cyIsCUZNX1NGLCBDT05EVlMsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkeiIsCUZNX0RGLCBDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cXoiLAlGTV9RRiwgQ09ORFosIEZDT05EWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnN6IiwJRk1fU0YsIENPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAotCi0jdW5kZWYgZm1vdmljYyAvKiB2OSAqLwotI3VuZGVmIGZtb3ZmY2MgLyogdjkgKi8KLSN1bmRlZiBmbW92Y2MgLyogdjkgKi8KLSN1bmRlZiBGTV9ERiAvKiB2OSAqLwotI3VuZGVmIEZNX1FGIC8qIHY5ICovCi0jdW5kZWYgRk1fU0YgLyogdjkgKi8KLQotLyogQ29wcm9jZXNzb3IgYnJhbmNoZXMuICAqLwotI2RlZmluZSBDQlIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncywgYXJjaCkgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfChsb3NlKSwgImwiLCAgICBmbGFnc3xGX0RFTEFZRUQsIGFyY2ggfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIChsb3NlKSwgIixhIGwiLCBmbGFnc3xGX0RFTEFZRUQsIGFyY2ggfQotCi0vKiBGbG9hdGluZyBwb2ludCBicmFuY2hlcy4gICovCi0jZGVmaW5lIEZCUihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8KGxvc2UpLCAibCIsICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjYgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIChsb3NlKSwgIixhIGwiLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY2IH0KLQotLyogVjkgZXh0ZW5kZWQgZmxvYXRpbmcgcG9pbnQgYnJhbmNoZXMuICAqLwotI2RlZmluZSBGQlJYKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+MCl8KGxvc2UpLCAiNixHIiwgICAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+MCl8KGxvc2UpLCAiLFQgNixHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+MCl8KGxvc2UpLCAiLGEgNixHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+MCl8KGxvc2UpLCAiLGEsVCA2LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spLCBBTk5VTHxCUFJFRHxGQkZDQyh+MCl8KGxvc2UpLCAiLE4gNixHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEFOTlVMLCBCUFJFRHxGQkZDQyh+MCl8KGxvc2UpLCAiLGEsTiA2LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+MSl8KGxvc2UpLCAiNyxHIiwgICAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+MSl8KGxvc2UpLCAiLFQgNyxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+MSl8KGxvc2UpLCAiLGEgNyxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+MSl8KGxvc2UpLCAiLGEsVCA3LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spLCBBTk5VTHxCUFJFRHxGQkZDQyh+MSl8KGxvc2UpLCAiLE4gNyxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEFOTlVMLCBCUFJFRHxGQkZDQyh+MSl8KGxvc2UpLCAiLGEsTiA3LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+Mil8KGxvc2UpLCAiOCxHIiwgICAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+Mil8KGxvc2UpLCAiLFQgOCxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+Mil8KGxvc2UpLCAiLGEgOCxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+Mil8KGxvc2UpLCAiLGEsVCA4LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spLCBBTk5VTHxCUFJFRHxGQkZDQyh+Mil8KGxvc2UpLCAiLE4gOCxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEFOTlVMLCBCUFJFRHxGQkZDQyh+Mil8KGxvc2UpLCAiLGEsTiA4LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+Myl8KGxvc2UpLCAiOSxHIiwgICAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+Myl8KGxvc2UpLCAiLFQgOSxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+Myl8KGxvc2UpLCAiLGEgOSxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+Myl8KGxvc2UpLCAiLGEsVCA5LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spLCBBTk5VTHxCUFJFRHxGQkZDQyh+Myl8KGxvc2UpLCAiLE4gOSxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEFOTlVMLCBCUFJFRHxGQkZDQyh+Myl8KGxvc2UpLCAiLGEsTiA5LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0KLQotLyogdjk6IFdlIG11c3QgcHV0IGBGQlJYJyBiZWZvcmUgYEZCUicsIHRvIGVuc3VyZSB0aGF0IHdlIG5ldmVyIG1hdGNoCi0gICB2OTogc29tZXRoaW5nIGFnYWluc3QgYW4gZXhwcmVzc2lvbiB1bmxlc3MgaXQgaXMgYW4gZXhwcmVzc2lvbi4gIE90aGVyd2lzZSwKLSAgIHY5OiB3ZSBlbmQgdXAgd2l0aCB1bmRlZmluZWQgc3ltYm9sIHRhYmxlcyBlbnRyaWVzLCBiZWNhdXNlIHRoZXkgZ2V0IGFkZGVkLAotICAgdjk6IGJ1dCBhcmUgbm90IGRlbGV0ZWQgaWYgdGhlIHBhdHRlcm4gZmFpbHMgdG8gbWF0Y2guICAqLwotCi0jZGVmaW5lIENPTkRGQyhmb3AsIGNvcCwgbWFzaywgZmxhZ3MpIFwKLSAgRkJSWChmb3AsIEYyKDAsIDUpfENPTkQobWFzayksIEYyKH4wLCB+NSl8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCAvKiB2OSAqLyBcCi0gIEZCUihmb3AsIEYyKDAsIDYpfENPTkQobWFzayksIEYyKH4wLCB+Nil8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCBcCi0gIENCUihjb3AsIEYyKDAsIDcpfENPTkQobWFzayksIEYyKH4wLCB+Nyl8Q09ORCh+KG1hc2spKSwgZmxhZ3MsIHY2bm90bGV0KQotCi0jZGVmaW5lIENPTkRGQ0woZm9wLCBjb3AsIG1hc2ssIGZsYWdzKSBcCi0gIEZCUlgoZm9wLCBGMigwLCA1KXxDT05EKG1hc2spLCBGMih+MCwgfjUpfENPTkQofihtYXNrKSksIGZsYWdzKSwgLyogdjkgKi8gXAotICBGQlIoZm9wLCBGMigwLCA2KXxDT05EKG1hc2spLCBGMih+MCwgfjYpfENPTkQofihtYXNrKSksIGZsYWdzKSwgXAotICBDQlIoY29wLCBGMigwLCA3KXxDT05EKG1hc2spLCBGMih+MCwgfjcpfENPTkQofihtYXNrKSksIGZsYWdzLCB2NikKLQotI2RlZmluZSBDT05ERihmb3AsIG1hc2ssIGZsYWdzKSBcCi0gIEZCUlgoZm9wLCBGMigwLCA1KXxDT05EKG1hc2spLCBGMih+MCwgfjUpfENPTkQofihtYXNrKSksIGZsYWdzKSwgLyogdjkgKi8gXAotICBGQlIoZm9wLCBGMigwLCA2KXxDT05EKG1hc2spLCBGMih+MCwgfjYpfENPTkQofihtYXNrKSksIGZsYWdzKQotCi1DT05ERkMgICgiZmIiLCAgICAiY2IiLCAgICAweDgsIDApLAotQ09OREZDTCAoImZiYSIsCSAgImNiYSIsICAgMHg4LCBGX0FMSUFTKSwKLUNPTkRGQyAgKCJmYmUiLAkgICJjYjAiLCAgIDB4OSwgMCksCi1DT05ERiAgICgiZmJ6IiwgICAgICAgICAgICAweDksIEZfQUxJQVMpLAotQ09OREZDICAoImZiZyIsCSAgImNiMiIsICAgMHg2LCAwKSwKLUNPTkRGQyAgKCJmYmdlIiwgICJjYjAyIiwgIDB4YiwgMCksCi1DT05ERkMgICgiZmJsIiwJICAiY2IxIiwgICAweDQsIDApLAotQ09OREZDICAoImZibGUiLCAgImNiMDEiLCAgMHhkLCAwKSwKLUNPTkRGQyAgKCJmYmxnIiwgICJjYjEyIiwgIDB4MiwgMCksCi1DT05ERkNMICgiZmJuIiwJICAiY2JuIiwgICAweDAsIDApLAotQ09OREZDICAoImZibmUiLCAgImNiMTIzIiwgMHgxLCAwKSwKLUNPTkRGICAgKCJmYm56IiwgICAgICAgICAgIDB4MSwgRl9BTElBUyksCi1DT05ERkMgICgiZmJvIiwJICAiY2IwMTIiLCAweGYsIDApLAotQ09OREZDICAoImZidSIsCSAgImNiMyIsICAgMHg3LCAwKSwKLUNPTkRGQyAgKCJmYnVlIiwgICJjYjAzIiwgIDB4YSwgMCksCi1DT05ERkMgICgiZmJ1ZyIsICAiY2IyMyIsICAweDUsIDApLAotQ09OREZDICAoImZidWdlIiwgImNiMDIzIiwgMHhjLCAwKSwKLUNPTkRGQyAgKCJmYnVsIiwgICJjYjEzIiwgIDB4MywgMCksCi1DT05ERkMgICgiZmJ1bGUiLCAiY2IwMTMiLCAweGUsIDApLAotCi0jdW5kZWYgQ09OREZDCi0jdW5kZWYgQ09OREZDTAotI3VuZGVmIENPTkRGCi0jdW5kZWYgQ0JSCi0jdW5kZWYgRkJSCi0jdW5kZWYgRkJSWAkvKiB2OSAqLwotCi17ICJqbXAiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8UkRfRzB8QVNJKH4wKSwJIjErMiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK3JzMiwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSslZzAsJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzAsCQkiMStpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczEraSwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMCwJCSJpKzEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIGkrcnMxLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwfFJTMV9HMCwJCSJpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlZzAraSwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKzAsJWcwICovCi0KLXsgIm5vcCIsCUYyKDAsIDQpLCAweGZlZmZmZmZmLCAiIiwgMCwgdjYgfSwgLyogc2V0aGkgMCwgJWcwICovCi0KLXsgInNldCIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCxkIiwgRl9BTElBUywgdjYgfSwKLXsgInNldHV3IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlMwLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAic2V0c3ciLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiUzAsZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJzZXR4IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlMwLDEsZCIsIEZfQUxJQVMsIHY5IH0sCi0KLXsgInNldGhpIiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgImgsZCIsIDAsIHY2IH0sCi0KLXsgInRhZGRjYyIsCUYzKDIsIDB4MjAsIDApLCBGMyh+MiwgfjB4MjAsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjIiwJRjMoMiwgMHgyMCwgMSksIEYzKH4yLCB+MHgyMCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInRhZGRjYyIsCUYzKDIsIDB4MjAsIDEpLCBGMyh+MiwgfjB4MjAsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2N0diIsCUYzKDIsIDB4MjIsIDApLCBGMyh+MiwgfjB4MjIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjdHYiLAlGMygyLCAweDIyLCAxKSwgRjMofjIsIH4weDIyLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjdHYiLAlGMygyLCAweDIyLCAxKSwgRjMofjIsIH4weDIyLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJ0c3ViY2MiLAlGMygyLCAweDIxLCAwKSwgRjMofjIsIH4weDIxLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInRzdWJjYyIsCUYzKDIsIDB4MjEsIDEpLCBGMyh+MiwgfjB4MjEsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ0c3ViY2N0diIsCUYzKDIsIDB4MjMsIDApLCBGMyh+MiwgfjB4MjMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAidHN1YmNjdHYiLAlGMygyLCAweDIzLCAxKSwgRjMofjIsIH4weDIzLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJ1bmltcCIsCUYyKDB4MCwgMHgwKSwgMHhmZmMwMDAwMCwgIm4iLCAwLCB2Nm5vdHY5IH0sCi17ICJpbGx0cmFwIiwJRjIoMCwgMCksIEYyKH4wLCB+MCl8UkRfRzAsICJuIiwgMCwgdjkgfSwKLQotLyogVGhpcyAqaXMqIGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAieG5vciIsCUYzKDIsIDB4MDcsIDApLCBGMyh+MiwgfjB4MDcsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAieG5vciIsCUYzKDIsIDB4MDcsIDEpLCBGMyh+MiwgfjB4MDcsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ4bm9yIiwJRjMoMiwgMHgwNywgMSksIEYzKH4yLCB+MHgwNywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLS8qIFRoaXMgKmlzKiBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgInhub3JjYyIsCUYzKDIsIDB4MTcsIDApLCBGMyh+MiwgfjB4MTcsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAieG5vcmNjIiwJRjMoMiwgMHgxNywgMSksIEYzKH4yLCB+MHgxNywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInhub3JjYyIsCUYzKDIsIDB4MTcsIDEpLCBGMyh+MiwgfjB4MTcsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi17ICJ4b3IiLAlGMygyLCAweDAzLCAwKSwgRjMofjIsIH4weDAzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInhvciIsCUYzKDIsIDB4MDMsIDEpLCBGMyh+MiwgfjB4MDMsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ4b3IiLAlGMygyLCAweDAzLCAxKSwgRjMofjIsIH4weDAzLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoteyAieG9yY2MiLAlGMygyLCAweDEzLCAwKSwgRjMofjIsIH4weDEzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInhvcmNjIiwJRjMoMiwgMHgxMywgMSksIEYzKH4yLCB+MHgxMywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInhvcmNjIiwJRjMoMiwgMHgxMywgMSksIEYzKH4yLCB+MHgxMywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAibm90IiwJRjMoMiwgMHgwNywgMCksIEYzKH4yLCB+MHgwNywgfjApfEFTSSh+MCksICIxLGQiLCBGX0FMSUFTLCB2NiB9LCAvKiB4bm9yIHJzMSwlMCxyZCAqLwoteyAibm90IiwJRjMoMiwgMHgwNywgMCksIEYzKH4yLCB+MHgwNywgfjApfEFTSSh+MCksICJyIiwgRl9BTElBUywgdjYgfSwgLyogeG5vciByZCwlMCxyZCAqLwotCi17ICJidG9nIiwJRjMoMiwgMHgwMywgMCksIEYzKH4yLCB+MHgwMywgfjApfEFTSSh+MCksCSIyLHIiLCBGX0FMSUFTLCB2NiB9LCAvKiB4b3IgcmQscnMyLHJkICovCi17ICJidG9nIiwJRjMoMiwgMHgwMywgMSksIEYzKH4yLCB+MHgwMywgfjEpLAkJImksciIsIEZfQUxJQVMsIHY2IH0sIC8qIHhvciByZCxpLHJkICovCi0KLS8qIEZQb3AxIGFuZCBGUG9wMiBhcmUgbm90IGluc3RydWN0aW9ucy4gIERvbid0IGFjY2VwdCB0aGVtLiAgKi8KLQoteyAiZmR0b2kiLAlGM0YoMiwgMHgzNCwgMHgwZDIpLCBGM0YofjIsIH4weDM0LCB+MHgwZDIpfFJTMV9HMCwgIkIsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3RvaSIsCUYzRigyLCAweDM0LCAweDBkMSksIEYzRih+MiwgfjB4MzQsIH4weDBkMSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZxdG9pIiwJRjNGKDIsIDB4MzQsIDB4MGQzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGQzKXxSUzFfRzAsICJSLGciLCBGX0ZMT0FULCB2OCB9LAotCi17ICJmZHRveCIsCUYzRigyLCAweDM0LCAweDA4MiksIEYzRih+MiwgfjB4MzQsIH4weDA4Mil8UlMxX0cwLCAiQixnIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZzdG94IiwJRjNGKDIsIDB4MzQsIDB4MDgxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDgxKXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2OSB9LAoteyAiZnF0b3giLAlGM0YoMiwgMHgzNCwgMHgwODMpLCBGM0YofjIsIH4weDM0LCB+MHgwODMpfFJTMV9HMCwgIlIsZyIsIEZfRkxPQVQsIHY5IH0sCi0KLXsgImZpdG9kIiwJRjNGKDIsIDB4MzQsIDB4MGM4KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM4KXxSUzFfRzAsICJmLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZml0b3MiLAlGM0YoMiwgMHgzNCwgMHgwYzQpLCBGM0YofjIsIH4weDM0LCB+MHgwYzQpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmaXRvcSIsCUYzRigyLCAweDM0LCAweDBjYyksIEYzRih+MiwgfjB4MzQsIH4weDBjYyl8UlMxX0cwLCAiZixKIiwgRl9GTE9BVCwgdjggfSwKLQoteyAiZnh0b2QiLAlGM0YoMiwgMHgzNCwgMHgwODgpLCBGM0YofjIsIH4weDM0LCB+MHgwODgpfFJTMV9HMCwgImYsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmeHRvcyIsCUYzRigyLCAweDM0LCAweDA4NCksIEYzRih+MiwgfjB4MzQsIH4weDA4NCl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZ4dG9xIiwJRjNGKDIsIDB4MzQsIDB4MDhjKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDhjKXxSUzFfRzAsICJmLEoiLCBGX0ZMT0FULCB2OSB9LAotCi17ICJmZHRvcSIsCUYzRigyLCAweDM0LCAweDBjZSksIEYzRih+MiwgfjB4MzQsIH4weDBjZSl8UlMxX0cwLCAiQixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZkdG9zIiwJRjNGKDIsIDB4MzQsIDB4MGM2KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM2KXxSUzFfRzAsICJCLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZnF0b2QiLAlGM0YoMiwgMHgzNCwgMHgwY2IpLCBGM0YofjIsIH4weDM0LCB+MHgwY2IpfFJTMV9HMCwgIlIsSCIsIEZfRkxPQVQsIHY4IH0sCi17ICJmcXRvcyIsCUYzRigyLCAweDM0LCAweDBjNyksIEYzRih+MiwgfjB4MzQsIH4weDBjNyl8UlMxX0cwLCAiUixnIiwgRl9GTE9BVCwgdjggfSwKLXsgImZzdG9kIiwJRjNGKDIsIDB4MzQsIDB4MGM5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM5KXxSUzFfRzAsICJmLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZnN0b3EiLAlGM0YoMiwgMHgzNCwgMHgwY2QpLCBGM0YofjIsIH4weDM0LCB+MHgwY2QpfFJTMV9HMCwgImYsSiIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZkaXZkIiwJRjNGKDIsIDB4MzQsIDB4MDRlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRlKSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZkaXZxIiwJRjNGKDIsIDB4MzQsIDB4MDRmKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRmKSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZkaXZ4IiwJRjNGKDIsIDB4MzQsIDB4MDRmKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRmKSwgIlYsUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZmRpdnMiLAlGM0YoMiwgMHgzNCwgMHgwNGQpLCBGM0YofjIsIH4weDM0LCB+MHgwNGQpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZm11bGQiLAlGM0YoMiwgMHgzNCwgMHgwNGEpLCBGM0YofjIsIH4weDM0LCB+MHgwNGEpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZm11bHEiLAlGM0YoMiwgMHgzNCwgMHgwNGIpLCBGM0YofjIsIH4weDM0LCB+MHgwNGIpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZm11bHgiLAlGM0YoMiwgMHgzNCwgMHgwNGIpLCBGM0YofjIsIH4weDM0LCB+MHgwNGIpLCAiVixSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmbXVscyIsCUYzRigyLCAweDM0LCAweDA0OSksIEYzRih+MiwgfjB4MzQsIH4weDA0OSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi0KLXsgImZkbXVscSIsCUYzRigyLCAweDM0LCAweDA2ZSksIEYzRih+MiwgfjB4MzQsIH4weDA2ZSksICJ2LEIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmZG11bHgiLAlGM0YoMiwgMHgzNCwgMHgwNmUpLCBGM0YofjIsIH4weDM0LCB+MHgwNmUpLCAidixCLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmc211bGQiLAlGM0YoMiwgMHgzNCwgMHgwNjkpLCBGM0YofjIsIH4weDM0LCB+MHgwNjkpLCAiZSxmLEgiLCBGX0ZMT0FULCB2OCB9LAotCi17ICJmc3FydGQiLAlGM0YoMiwgMHgzNCwgMHgwMmEpLCBGM0YofjIsIH4weDM0LCB+MHgwMmEpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY3IH0sCi17ICJmc3FydHEiLAlGM0YoMiwgMHgzNCwgMHgwMmIpLCBGM0YofjIsIH4weDM0LCB+MHgwMmIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmc3FydHgiLAlGM0YoMiwgMHgzNCwgMHgwMmIpLCBGM0YofjIsIH4weDM0LCB+MHgwMmIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZzcXJ0cyIsCUYzRigyLCAweDM0LCAweDAyOSksIEYzRih+MiwgfjB4MzQsIH4weDAyOSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjcgfSwKLQoteyAiZmFic2QiLAlGM0YoMiwgMHgzNCwgMHgwMGEpLCBGM0YofjIsIH4weDM0LCB+MHgwMGEpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmYWJzcSIsCUYzRigyLCAweDM0LCAweDAwYiksIEYzRih+MiwgfjB4MzQsIH4weDAwYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZhYnN4IiwJRjNGKDIsIDB4MzQsIDB4MDBiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDBiKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmYWJzcyIsCUYzRigyLCAweDM0LCAweDAwOSksIEYzRih+MiwgfjB4MzQsIH4weDAwOSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZtb3ZkIiwJRjNGKDIsIDB4MzQsIDB4MDAyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAyKXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoteyAiZm1vdnEiLAlGM0YoMiwgMHgzNCwgMHgwMDMpLCBGM0YofjIsIH4weDM0LCB+MHgwMDMpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbW92eCIsCUYzRigyLCAweDM0LCAweDAwMyksIEYzRih+MiwgfjB4MzQsIH4weDAwMyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZm1vdnMiLAlGM0YoMiwgMHgzNCwgMHgwMDEpLCBGM0YofjIsIH4weDM0LCB+MHgwMDEpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmbmVnZCIsCUYzRigyLCAweDM0LCAweDAwNiksIEYzRih+MiwgfjB4MzQsIH4weDAwNil8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZuZWdxIiwJRjNGKDIsIDB4MzQsIDB4MDA3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA3KXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FULCB2OSB9LAoteyAiZm5lZ3giLAlGM0YoMiwgMHgzNCwgMHgwMDcpLCBGM0YofjIsIH4weDM0LCB+MHgwMDcpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZuZWdzIiwJRjNGKDIsIDB4MzQsIDB4MDA1KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA1KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAotCi17ICJmYWRkZCIsCUYzRigyLCAweDM0LCAweDA0MiksIEYzRih+MiwgfjB4MzQsIH4weDA0MiksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmYWRkcSIsCUYzRigyLCAweDM0LCAweDA0MyksIEYzRih+MiwgfjB4MzQsIH4weDA0MyksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmYWRkeCIsCUYzRigyLCAweDM0LCAweDA0MyksIEYzRih+MiwgfjB4MzQsIH4weDA0MyksICJWLFIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZhZGRzIiwJRjNGKDIsIDB4MzQsIDB4MDQxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQxKSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZzdWJkIiwJRjNGKDIsIDB4MzQsIDB4MDQ2KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ2KSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZzdWJxIiwJRjNGKDIsIDB4MzQsIDB4MDQ3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ3KSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZzdWJ4IiwJRjNGKDIsIDB4MzQsIDB4MDQ3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ3KSwgIlYsUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZnN1YnMiLAlGM0YoMiwgMHgzNCwgMHgwNDUpLCBGM0YofjIsIH4weDM0LCB+MHgwNDUpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAotCi0jZGVmaW5lIENNUEZDQyh4KQkoKCh4KSYweDMpPDwyNSkKLQoteyAiZmNtcGQiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUyKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTIpfFJEX0cwLCAgInYsQiIsICAgRl9GTE9BVCwgdjYgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI2LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiNyx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjgsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI5LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU2KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTYpfFJEX0cwLCAgInYsQiIsICAgRl9GTE9BVCwgdjYgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiNix2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI3LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjgsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiOSx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUzKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTMpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmY21wcSIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNixWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjcsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI4LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOSxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU3KXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI2LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjcsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOCxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI5LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21weCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTMpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Myl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZmNtcHgiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjYsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcHgiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjcsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcHgiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjgsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcHgiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjksVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcGV4IiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU3KXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmY21wZXgiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjYsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcGV4IiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI3LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBleCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOCxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wZXgiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjksVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcHMiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUxKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTEpfFJEX0cwLCAiZSxmIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcHMiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjYsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBzIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI3LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcyIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiOCxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHMiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjksZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcyIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTUpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1NSl8UkRfRzAsICJlLGYiLCAgIEZfRkxPQVQsIHY2IH0sCi17ICJmY21wZXMiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjYsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcyIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiNyxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVzIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI4LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXMiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjksZSxmIiwgRl9GTE9BVCwgdjkgfSwKLQotLyogVGhlc2UgRXh0ZW5kZWQgRlBvcCAoRklGTykgaW5zdHJ1Y3Rpb25zIGFyZSBuZXcgaW4gdGhlIEZ1aml0c3UKLSAgIE1CODY5MzQsIHJlcGxhY2luZyB0aGUgQ1BvcCBpbnN0cnVjdGlvbnMgZnJvbSB2NiBhbmQgbGF0ZXIKLSAgIHByb2Nlc3NvcnMuICAqLwotCi0jZGVmaW5lIEVGUE9QMV8yKG5hbWUsIG9wLCBhcmdzKSB7IG5hbWUsIEYzRigyLCAweDM2LCBvcCksIEYzRih+MiwgfjB4MzYsIH5vcCl8UlMxX0cwLCBhcmdzLCAwLCBzcGFyY2xpdGUgfQotI2RlZmluZSBFRlBPUDFfMyhuYW1lLCBvcCwgYXJncykgeyBuYW1lLCBGM0YoMiwgMHgzNiwgb3ApLCBGM0YofjIsIH4weDM2LCB+b3ApLCAgICAgICAgYXJncywgMCwgc3BhcmNsaXRlIH0KLSNkZWZpbmUgRUZQT1AyXzIobmFtZSwgb3AsIGFyZ3MpIHsgbmFtZSwgRjNGKDIsIDB4MzcsIG9wKSwgRjNGKH4yLCB+MHgzNywgfm9wKXxSRF9HMCwgIGFyZ3MsIDAsIHNwYXJjbGl0ZSB9Ci0KLUVGUE9QMV8yICgiZWZpdG9kIiwJMHgwYzgsICJmLEgiKSwKLUVGUE9QMV8yICgiZWZpdG9zIiwJMHgwYzQsICJmLGciKSwKLUVGUE9QMV8yICgiZWZkdG9pIiwJMHgwZDIsICJCLGciKSwKLUVGUE9QMV8yICgiZWZzdG9pIiwJMHgwZDEsICJmLGciKSwKLUVGUE9QMV8yICgiZWZzdG9kIiwJMHgwYzksICJmLEgiKSwKLUVGUE9QMV8yICgiZWZkdG9zIiwJMHgwYzYsICJCLGciKSwKLUVGUE9QMV8yICgiZWZtb3ZzIiwJMHgwMDEsICJmLGciKSwKLUVGUE9QMV8yICgiZWZuZWdzIiwJMHgwMDUsICJmLGciKSwKLUVGUE9QMV8yICgiZWZhYnNzIiwJMHgwMDksICJmLGciKSwKLUVGUE9QMV8yICgiZWZzcXJ0ZCIsCTB4MDJhLCAiQixIIiksCi1FRlBPUDFfMiAoImVmc3FydHMiLAkweDAyOSwgImYsZyIpLAotRUZQT1AxXzMgKCJlZmFkZGQiLAkweDA0MiwgInYsQixIIiksCi1FRlBPUDFfMyAoImVmYWRkcyIsCTB4MDQxLCAiZSxmLGciKSwKLUVGUE9QMV8zICgiZWZzdWJkIiwJMHgwNDYsICJ2LEIsSCIpLAotRUZQT1AxXzMgKCJlZnN1YnMiLAkweDA0NSwgImUsZixnIiksCi1FRlBPUDFfMyAoImVmZGl2ZCIsCTB4MDRlLCAidixCLEgiKSwKLUVGUE9QMV8zICgiZWZkaXZzIiwJMHgwNGQsICJlLGYsZyIpLAotRUZQT1AxXzMgKCJlZm11bGQiLAkweDA0YSwgInYsQixIIiksCi1FRlBPUDFfMyAoImVmbXVscyIsCTB4MDQ5LCAiZSxmLGciKSwKLUVGUE9QMV8zICgiZWZzbXVsZCIsCTB4MDY5LCAiZSxmLEgiKSwKLUVGUE9QMl8yICgiZWZjbXBkIiwJMHgwNTIsICJ2LEIiKSwKLUVGUE9QMl8yICgiZWZjbXBlZCIsCTB4MDU2LCAidixCIiksCi1FRlBPUDJfMiAoImVmY21wcyIsCTB4MDUxLCAiZSxmIiksCi1FRlBPUDJfMiAoImVmY21wZXMiLAkweDA1NSwgImUsZiIpLAotCi0jdW5kZWYgRUZQT1AxXzIKLSN1bmRlZiBFRlBPUDFfMwotI3VuZGVmIEVGUE9QMl8yCi0KLS8qIFRoZXNlIGFyZSBtYXJrZWQgRl9BTElBUywgc28gdGhhdCB0aGV5IHdvbid0IGNvbmZsaWN0IHdpdGggc3BhcmNsaXRlIGluc25zCi0gICBwcmVzZW50LiAgT3RoZXJ3aXNlLCB0aGUgRl9BTElBUyBmbGFnIGlzIGlnbm9yZWQuICAqLwoteyAiY3BvcDEiLAlGMygyLCAweDM2LCAwKSwgRjMofjIsIH4weDM2LCB+MSksICJbMSsyXSxkIiwgRl9BTElBUywgdjZub3R2OSB9LAoteyAiY3BvcDIiLAlGMygyLCAweDM3LCAwKSwgRjMofjIsIH4weDM3LCB+MSksICJbMSsyXSxkIiwgRl9BTElBUywgdjZub3R2OSB9LAotCi0vKiBzcGFyY2xldCBzcGVjaWZpYyBpbnNucyAqLwotCi1DT01NVVRFT1AgKCJ1bWFjIiwgMHgzZSwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgic21hYyIsIDB4M2YsIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInVtYWNkIiwgMHgyZSwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgic21hY2QiLCAweDJmLCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJ1bXVsZCIsIDB4MDksIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInNtdWxkIiwgMHgwZCwgc3BhcmNsZXQpLAotCi17ICJzaHVmZmxlIiwJRjMoMiwgMHgyZCwgMCksIEYzKH4yLCB+MHgyZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHNwYXJjbGV0IH0sCi17ICJzaHVmZmxlIiwJRjMoMiwgMHgyZCwgMSksIEYzKH4yLCB+MHgyZCwgfjEpLAkJIjEsaSxkIiwgMCwgc3BhcmNsZXQgfSwKLQotLyogVGhlIG1hbnVhbCBpc24ndCBjb21wbGV0ZWx5IGFjY3VyYXRlIG9uIHRoZXNlIGluc25zLiAgVGhlIGByczInIGZpZWxkIGlzCi0gICB0cmVhdGVkIGFzIGJlaW5nIDYgYml0cyB0byBhY2NvdW50IGZvciA2IGJpdCBpbW1lZGlhdGVzIHRvIGNwdXNoLiAgSXQgaXMKLSAgIGFzc3VtZWQgdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IGJpdCA1IGlzIDAgd2hlbiByczIgY29udGFpbnMgYSByZWcuICAqLwotI2RlZmluZSBCSVQ1ICgxPDw1KQoteyAiY3JkY3h0IiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDQpLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjQpfEJJVDV8UlMyKH4wKSwJIlUsZCIsIDAsIHNwYXJjbGV0IH0sCi17ICJjd3JjeHQiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMyksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+Myl8QklUNXxSUzIofjApLAkiMSx1IiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdXNoIiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDApLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjApfEJJVDV8UkQofjApLAkiMSwyIiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdXNoIiwJRjMoMiwgMHgzNiwgMSl8U0xDUE9QKDApLCBGMyh+MiwgfjB4MzYsIH4xKXxTTENQT1AofjApfFJEKH4wKSwJCSIxLFkiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1c2hhIiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDEpLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjEpfEJJVDV8UkQofjApLAkiMSwyIiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdXNoYSIsCUYzKDIsIDB4MzYsIDEpfFNMQ1BPUCgxKSwgRjMofjIsIH4weDM2LCB+MSl8U0xDUE9QKH4xKXxSRCh+MCksCQkiMSxZIiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdWxsIiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDIpLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjIpfEJJVDV8UlMxKH4wKXxSUzIofjApLCAiZCIsIDAsIHNwYXJjbGV0IH0sCi0jdW5kZWYgQklUNQotCi0vKiBzcGFyY2xldCBjb3Byb2Nlc3NvciBicmFuY2ggaW5zbnMgKi8KLSNkZWZpbmUgU0xDQkNDMihvcGNvZGUsIG1hc2ssIGxvc2UpIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHwobG9zZSksICJsIiwgICAgRl9ERUxBWUVEfEZfQ09OREJSLCBzcGFyY2xldCB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgKGxvc2UpLCAiLGEgbCIsIEZfREVMQVlFRHxGX0NPTkRCUiwgc3BhcmNsZXQgfQotI2RlZmluZSBTTENCQ0Mob3Bjb2RlLCBtYXNrKSBcCi0gIFNMQ0JDQzIob3Bjb2RlLCBGMigwLCA3KXxDT05EKG1hc2spLCBGMih+MCwgfjcpfENPTkQofihtYXNrKSkpCi0KLS8qIGNibixjYmEgY2FuJ3QgYmUgZGVmaW5lZCBoZXJlIGJlY2F1c2UgdGhleSdyZSBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgR0FTCi0gICByZXF1aXJlcyBhbGwgbW5lbW9uaWNzIG9mIHRoZSBzYW1lIG5hbWUgdG8gYmUgY29uc2VjdXRpdmUuICAqLwotLypTTENCQ0MoImNibiIsIDApLCAtIGFscmVhZHkgZGVmaW5lZCAqLwotU0xDQkNDKCJjYmUiLCAxKSwKLVNMQ0JDQygiY2JmIiwgMiksCi1TTENCQ0MoImNiZWYiLCAzKSwKLVNMQ0JDQygiY2JyIiwgNCksCi1TTENCQ0MoImNiZXIiLCA1KSwKLVNMQ0JDQygiY2JmciIsIDYpLAotU0xDQkNDKCJjYmVmciIsIDcpLAotLypTTENCQ0MoImNiYSIsIDgpLCAtIGFscmVhZHkgZGVmaW5lZCAqLwotU0xDQkNDKCJjYm5lIiwgOSksCi1TTENCQ0MoImNibmYiLCAxMCksCi1TTENCQ0MoImNibmVmIiwgMTEpLAotU0xDQkNDKCJjYm5yIiwgMTIpLAotU0xDQkNDKCJjYm5lciIsIDEzKSwKLVNMQ0JDQygiY2JuZnIiLCAxNCksCi1TTENCQ0MoImNibmVmciIsIDE1KSwKLQotI3VuZGVmIFNMQ0JDQzIKLSN1bmRlZiBTTENCQ0MKLQoteyAiY2FzYSIsCUYzKDMsIDB4M2MsIDApLCBGMyh+MywgfjB4M2MsIH4wKSwgIlsxXUEsMixkIiwgMCwgdjkgfSwKLXsgImNhc2EiLAlGMygzLCAweDNjLCAxKSwgRjMofjMsIH4weDNjLCB+MSksICJbMV1vLDIsZCIsIDAsIHY5IH0sCi17ICJjYXN4YSIsCUYzKDMsIDB4M2UsIDApLCBGMyh+MywgfjB4M2UsIH4wKSwgIlsxXUEsMixkIiwgMCwgdjkgfSwKLXsgImNhc3hhIiwJRjMoMywgMHgzZSwgMSksIEYzKH4zLCB+MHgzZSwgfjEpLCAiWzFdbywyLGQiLCAwLCB2OSB9LAotCi0vKiB2OSBzeW50aGV0aWMgaW5zbnMgKi8KLXsgImlwcmVmZXRjaCIsCUYyKDAsIDEpfCgyPDwyMCl8QlBSRUQsIEYyKH4wLCB+MSl8KDE8PDIwKXxBTk5VTHxDT05EKH4wKSwgIkciLCAwLCB2OSB9LCAvKiBibixhLHB0ICV4Y2MsbGFiZWwgKi8KLXsgInNpZ254IiwJRjMoMiwgMHgyNywgMCksIEYzKH4yLCB+MHgyNywgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICIxLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmEgcnMxLCVnMCxyZCAqLwoteyAic2lnbngiLAlGMygyLCAweDI3LCAwKSwgRjMofjIsIH4weDI3LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgInIiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmEgcmQsJWcwLHJkICovCi17ICJjbHJ1dyIsCUYzKDIsIDB4MjYsIDApLCBGMyh+MiwgfjB4MjYsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiMSxkIiwgRl9BTElBUywgdjkgfSwgLyogc3JsIHJzMSwlZzAscmQgKi8KLXsgImNscnV3IiwJRjMoMiwgMHgyNiwgMCksIEYzKH4yLCB+MHgyNiwgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICJyIiwgRl9BTElBUywgdjkgfSwgLyogc3JsIHJkLCVnMCxyZCAqLwoteyAiY2FzIiwJRjMoMywgMHgzYywgMCl8QVNJKDB4ODApLCBGMyh+MywgfjB4M2MsIH4wKXxBU0kofjB4ODApLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc2EgW3JzMV1BU0lfUCxyczIscmQgKi8KLXsgImNhc2wiLAlGMygzLCAweDNjLCAwKXxBU0koMHg4OCksIEYzKH4zLCB+MHgzYywgfjApfEFTSSh+MHg4OCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzYSBbcnMxXUFTSV9QX0wscnMyLHJkICovCi17ICJjYXN4IiwJRjMoMywgMHgzZSwgMCl8QVNJKDB4ODApLCBGMyh+MywgfjB4M2UsIH4wKXxBU0kofjB4ODApLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc3hhIFtyczFdQVNJX1AscnMyLHJkICovCi17ICJjYXN4bCIsCUYzKDMsIDB4M2UsIDApfEFTSSgweDg4KSwgRjMofjMsIH4weDNlLCB+MCl8QVNJKH4weDg4KSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXN4YSBbcnMxXUFTSV9QX0wscnMyLHJkICovCi0KLS8qIFVsdHJhc3BhcmMgZXh0ZW5zaW9ucyAqLwoteyAic2h1dGRvd24iLAlGM0YoMiwgMHgzNiwgMHgwODApLCBGM0YofjIsIH4weDM2LCB+MHgwODApfFJEX0cwfFJTMV9HMHxSUzJfRzAsICIiLCAwLCB2OWEgfSwKLQotLyogRklYTUU6IERvIHdlIHdhbnQgdG8gbWFyayB0aGVzZSBhcyBGX0ZMT0FULCBvciBzb21ldGhpbmcgc2ltaWxhcj8gICovCi17ICJmcGFkZDE2IiwJRjNGKDIsIDB4MzYsIDB4MDUwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUwKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcGFkZDE2cyIsCUYzRigyLCAweDM2LCAweDA1MSksIEYzRih+MiwgfjB4MzYsIH4weDA1MSksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnBhZGQzMiIsCUYzRigyLCAweDM2LCAweDA1MiksIEYzRih+MiwgfjB4MzYsIH4weDA1MiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBhZGQzMnMiLAlGM0YoMiwgMHgzNiwgMHgwNTMpLCBGM0YofjIsIH4weDM2LCB+MHgwNTMpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZwc3ViMTYiLAlGM0YoMiwgMHgzNiwgMHgwNTQpLCBGM0YofjIsIH4weDM2LCB+MHgwNTQpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwc3ViMTZzIiwJRjNGKDIsIDB4MzYsIDB4MDU1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU1KSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmcHN1YjMyIiwJRjNGKDIsIDB4MzYsIDB4MDU2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU2KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcHN1YjMycyIsCUYzRigyLCAweDM2LCAweDA1NyksIEYzRih+MiwgfjB4MzYsIH4weDA1NyksICJlLGYsZyIsIDAsIHY5YSB9LAotCi17ICJmcGFjazMyIiwJRjNGKDIsIDB4MzYsIDB4MDNhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDNhKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcGFjazE2IiwJRjNGKDIsIDB4MzYsIDB4MDNiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDNiKXxSUzFfRzAsICJCLGciLCAwLCB2OWEgfSwKLXsgImZwYWNrZml4IiwJRjNGKDIsIDB4MzYsIDB4MDNkKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDNkKXxSUzFfRzAsICJCLGciLCAwLCB2OWEgfSwKLXsgImZleHBhbmQiLAlGM0YoMiwgMHgzNiwgMHgwNGQpLCBGM0YofjIsIH4weDM2LCB+MHgwNGQpfFJTMV9HMCwgImYsSCIsIDAsIHY5YSB9LAoteyAiZnBtZXJnZSIsCUYzRigyLCAweDM2LCAweDA0YiksIEYzRih+MiwgfjB4MzYsIH4weDA0YiksICJlLGYsSCIsIDAsIHY5YSB9LAotCi0vKiBOb3RlIHRoYXQgdGhlIG1peGluZyBvZiAzMi82NCBiaXQgcmVncyBpcyBpbnRlbnRpb25hbC4gICovCi17ICJmbXVsOHgxNiIsCQlGM0YoMiwgMHgzNiwgMHgwMzEpLCBGM0YofjIsIH4weDM2LCB+MHgwMzEpLCAiZSxCLEgiLCAwLCB2OWEgfSwKLXsgImZtdWw4eDE2YXUiLAkJRjNGKDIsIDB4MzYsIDB4MDMzKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDMzKSwgImUsZixIIiwgMCwgdjlhIH0sCi17ICJmbXVsOHgxNmFsIiwJCUYzRigyLCAweDM2LCAweDAzNSksIEYzRih+MiwgfjB4MzYsIH4weDAzNSksICJlLGYsSCIsIDAsIHY5YSB9LAoteyAiZm11bDhzdXgxNiIsCQlGM0YoMiwgMHgzNiwgMHgwMzYpLCBGM0YofjIsIH4weDM2LCB+MHgwMzYpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZtdWw4dWx4MTYiLAkJRjNGKDIsIDB4MzYsIDB4MDM3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM3KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmbXVsZDhzdXgxNiIsCUYzRigyLCAweDM2LCAweDAzOCksIEYzRih+MiwgfjB4MzYsIH4weDAzOCksICJlLGYsSCIsIDAsIHY5YSB9LAoteyAiZm11bGQ4dWx4MTYiLAlGM0YoMiwgMHgzNiwgMHgwMzkpLCBGM0YofjIsIH4weDM2LCB+MHgwMzkpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLQoteyAiYWxpZ25hZGRyIiwJRjNGKDIsIDB4MzYsIDB4MDE4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDE4KSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJhbGlnbmFkZHJsIiwJRjNGKDIsIDB4MzYsIDB4MDFhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDFhKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJmYWxpZ25kYXRhIiwJRjNGKDIsIDB4MzYsIDB4MDQ4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDQ4KSwgInYsQixIIiwgMCwgdjlhIH0sCi0KLXsgImZ6ZXJvIiwJRjNGKDIsIDB4MzYsIDB4MDYwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYwKSwgIkgiLCAwLCB2OWEgfSwKLXsgImZ6ZXJvcyIsCUYzRigyLCAweDM2LCAweDA2MSksIEYzRih+MiwgfjB4MzYsIH4weDA2MSksICJnIiwgMCwgdjlhIH0sCi17ICJmb25lIiwJRjNGKDIsIDB4MzYsIDB4MDdlKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdlKSwgIkgiLCAwLCB2OWEgfSwKLXsgImZvbmVzIiwJRjNGKDIsIDB4MzYsIDB4MDdmKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdmKSwgImciLCAwLCB2OWEgfSwKLXsgImZzcmMxIiwJRjNGKDIsIDB4MzYsIDB4MDc0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc0KSwgInYsSCIsIDAsIHY5YSB9LAoteyAiZnNyYzFzIiwJRjNGKDIsIDB4MzYsIDB4MDc1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc1KSwgImUsZyIsIDAsIHY5YSB9LAoteyAiZnNyYzIiLAlGM0YoMiwgMHgzNiwgMHgwNzgpLCBGM0YofjIsIH4weDM2LCB+MHgwNzgpLCAiQixIIiwgMCwgdjlhIH0sCi17ICJmc3JjMnMiLAlGM0YoMiwgMHgzNiwgMHgwNzkpLCBGM0YofjIsIH4weDM2LCB+MHgwNzkpLCAiZixnIiwgMCwgdjlhIH0sCi17ICJmbm90MSIsCUYzRigyLCAweDM2LCAweDA2YSksIEYzRih+MiwgfjB4MzYsIH4weDA2YSksICJ2LEgiLCAwLCB2OWEgfSwKLXsgImZub3QxcyIsCUYzRigyLCAweDM2LCAweDA2YiksIEYzRih+MiwgfjB4MzYsIH4weDA2YiksICJlLGciLCAwLCB2OWEgfSwKLXsgImZub3QyIiwJRjNGKDIsIDB4MzYsIDB4MDY2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY2KSwgIkIsSCIsIDAsIHY5YSB9LAoteyAiZm5vdDJzIiwJRjNGKDIsIDB4MzYsIDB4MDY3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY3KSwgImYsZyIsIDAsIHY5YSB9LAoteyAiZm9yIiwJRjNGKDIsIDB4MzYsIDB4MDdjKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdjKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmb3JzIiwJRjNGKDIsIDB4MzYsIDB4MDdkKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdkKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmbm9yIiwJRjNGKDIsIDB4MzYsIDB4MDYyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYyKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmbm9ycyIsCUYzRigyLCAweDM2LCAweDA2MyksIEYzRih+MiwgfjB4MzYsIH4weDA2MyksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZmFuZCIsCUYzRigyLCAweDM2LCAweDA3MCksIEYzRih+MiwgfjB4MzYsIH4weDA3MCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZmFuZHMiLAlGM0YoMiwgMHgzNiwgMHgwNzEpLCBGM0YofjIsIH4weDM2LCB+MHgwNzEpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZuYW5kIiwJRjNGKDIsIDB4MzYsIDB4MDZlKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZlKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmbmFuZHMiLAlGM0YoMiwgMHgzNiwgMHgwNmYpLCBGM0YofjIsIH4weDM2LCB+MHgwNmYpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZ4b3IiLAlGM0YoMiwgMHgzNiwgMHgwNmMpLCBGM0YofjIsIH4weDM2LCB+MHgwNmMpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZ4b3JzIiwJRjNGKDIsIDB4MzYsIDB4MDZkKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZkKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmeG5vciIsCUYzRigyLCAweDM2LCAweDA3MiksIEYzRih+MiwgfjB4MzYsIH4weDA3MiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnhub3JzIiwJRjNGKDIsIDB4MzYsIDB4MDczKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDczKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmb3Jub3QxIiwJRjNGKDIsIDB4MzYsIDB4MDdhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdhKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmb3Jub3QxcyIsCUYzRigyLCAweDM2LCAweDA3YiksIEYzRih+MiwgfjB4MzYsIH4weDA3YiksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZm9ybm90MiIsCUYzRigyLCAweDM2LCAweDA3NiksIEYzRih+MiwgfjB4MzYsIH4weDA3NiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm9ybm90MnMiLAlGM0YoMiwgMHgzNiwgMHgwNzcpLCBGM0YofjIsIH4weDM2LCB+MHgwNzcpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZhbmRub3QxIiwJRjNGKDIsIDB4MzYsIDB4MDY4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY4KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmYW5kbm90MXMiLAlGM0YoMiwgMHgzNiwgMHgwNjkpLCBGM0YofjIsIH4weDM2LCB+MHgwNjkpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZhbmRub3QyIiwJRjNGKDIsIDB4MzYsIDB4MDY0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY0KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmYW5kbm90MnMiLAlGM0YoMiwgMHgzNiwgMHgwNjUpLCBGM0YofjIsIH4weDM2LCB+MHgwNjUpLCAiZSxmLGciLCAwLCB2OWEgfSwKLQoteyAiZmNtcGd0MTYiLAlGM0YoMiwgMHgzNiwgMHgwMjgpLCBGM0YofjIsIH4weDM2LCB+MHgwMjgpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBndDMyIiwJRjNGKDIsIDB4MzYsIDB4MDJjKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDJjKSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wbGUxNiIsCUYzRigyLCAweDM2LCAweDAyMCksIEYzRih+MiwgfjB4MzYsIH4weDAyMCksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGxlMzIiLAlGM0YoMiwgMHgzNiwgMHgwMjQpLCBGM0YofjIsIH4weDM2LCB+MHgwMjQpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBuZTE2IiwJRjNGKDIsIDB4MzYsIDB4MDIyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDIyKSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wbmUzMiIsCUYzRigyLCAweDM2LCAweDAyNiksIEYzRih+MiwgfjB4MzYsIH4weDAyNiksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGVxMTYiLAlGM0YoMiwgMHgzNiwgMHgwMmEpLCBGM0YofjIsIH4weDM2LCB+MHgwMmEpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBlcTMyIiwJRjNGKDIsIDB4MzYsIDB4MDJlKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDJlKSwgInYsQixkIiwgMCwgdjlhIH0sCi0KLXsgImVkZ2U4IiwJRjNGKDIsIDB4MzYsIDB4MDAwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDAwKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlOGwiLAlGM0YoMiwgMHgzNiwgMHgwMDIpLCBGM0YofjIsIH4weDM2LCB+MHgwMDIpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2UxNiIsCUYzRigyLCAweDM2LCAweDAwNCksIEYzRih+MiwgfjB4MzYsIH4weDAwNCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZTE2bCIsCUYzRigyLCAweDM2LCAweDAwNiksIEYzRih+MiwgfjB4MzYsIH4weDAwNiksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZTMyIiwJRjNGKDIsIDB4MzYsIDB4MDA4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDA4KSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlMzJsIiwJRjNGKDIsIDB4MzYsIDB4MDBhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDBhKSwgIjEsMixkIiwgMCwgdjlhIH0sCi0KLXsgInBkaXN0IiwJRjNGKDIsIDB4MzYsIDB4MDNlKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDNlKSwgInYsQixIIiwgMCwgdjlhIH0sCi0KLXsgImFycmF5OCIsCUYzRigyLCAweDM2LCAweDAxMCksIEYzRih+MiwgfjB4MzYsIH4weDAxMCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiYXJyYXkxNiIsCUYzRigyLCAweDM2LCAweDAxMiksIEYzRih+MiwgfjB4MzYsIH4weDAxMiksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiYXJyYXkzMiIsCUYzRigyLCAweDM2LCAweDAxNCksIEYzRih+MiwgfjB4MzYsIH4weDAxNCksICIxLDIsZCIsIDAsIHY5YSB9LAotCi0vKiBNb3JlIHY5IHNwZWNpZmljIGluc25zLCB0aGVzZSBuZWVkIHRvIGNvbWUgbGFzdCBzbyB0aGV5IGRvIG5vdCBjbGFzaAotICAgd2l0aCB2OWEgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgImVkZ2U4IiB3aGljaCBsb29rcyBsaWtlIGltcGRlcDEuICovCi0KLSNkZWZpbmUgSU1QREVQKG5hbWUsIGNvZGUpIFwKLXsgbmFtZSwJRjMoMiwgY29kZSwgMCksIEYzKH4yLCB+Y29kZSwgfjApfEFTSSh+MCksICIxLDIsZCIsIDAsIHY5bm90djlhIH0sIFwKLXsgbmFtZSwJRjMoMiwgY29kZSwgMSksIEYzKH4yLCB+Y29kZSwgfjEpLAkgICAiMSxpLGQiLCAwLCB2OW5vdHY5YSB9LCBcCi17IG5hbWUsIEYzKDIsIGNvZGUsIDApLCBGMyh+MiwgfmNvZGUsIH4wKSwgICAgICAgICAieCwxLDIsZCIsIDAsIHY5bm90djlhIH0sIFwKLXsgbmFtZSwgRjMoMiwgY29kZSwgMCksIEYzKH4yLCB+Y29kZSwgfjApLCAgICAgICAgICJ4LGUsZixnIiwgMCwgdjlub3R2OWEgfQotCi1JTVBERVAgKCJpbXBkZXAxIiwgMHgzNiksCi1JTVBERVAgKCJpbXBkZXAyIiwgMHgzNyksCi0KLSN1bmRlZiBJTVBERVAKLQotfTsKLQotY29uc3QgaW50IHNwYXJjX251bV9vcGNvZGVzID0gKChzaXplb2Ygc3BhcmNfb3Bjb2RlcykvKHNpemVvZiBzcGFyY19vcGNvZGVzWzBdKSk7Ci0MCi0vKiBVdGlsaXRpZXMgZm9yIGFyZ3VtZW50IHBhcnNpbmcuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBpbnQgdmFsdWU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19IGFyZzsKLQotLyogTG9vayB1cCBOQU1FIGluIFRBQkxFLiAgKi8KLQotc3RhdGljIGludCBsb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBhcmcgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbG9va3VwX3ZhbHVlIFBBUkFNUyAoKGNvbnN0IGFyZyAqLCBpbnQpKTsKLQotc3RhdGljIGludAotbG9va3VwX25hbWUgKHRhYmxlLCBuYW1lKQotICAgICBjb25zdCBhcmcgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBhcmcgKnA7Ci0KLSAgZm9yIChwID0gdGFibGU7IHAtPm5hbWU7ICsrcCkKLSAgICBpZiAoc3RyY21wIChuYW1lLCBwLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIHAtPnZhbHVlOwotCi0gIHJldHVybiAtMTsKLX0KLQotLyogTG9vayB1cCBWQUxVRSBpbiBUQUJMRS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWxvb2t1cF92YWx1ZSAodGFibGUsIHZhbHVlKQotICAgICBjb25zdCBhcmcgKnRhYmxlOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGNvbnN0IGFyZyAqcDsKLQotICBmb3IgKHAgPSB0YWJsZTsgcC0+bmFtZTsgKytwKQotICAgIGlmICh2YWx1ZSA9PSBwLT52YWx1ZSkKLSAgICAgIHJldHVybiBwLT5uYW1lOwotCi0gIHJldHVybiAoY2hhciAqKSAwOwotfQotDAotLyogSGFuZGxlIEFTSSdzLiAgKi8KLQotc3RhdGljIGFyZyBhc2lfdGFibGVbXSA9Ci17Ci0gIC8qIFRoZXNlIGFyZSBpbiB0aGUgdjkgYXJjaGl0ZWN0dXJlIG1hbnVhbC4gICovCi0gIC8qIFRoZSBzaG9ydGVyIHZlcnNpb25zIGFwcGVhciBmaXJzdCwgdGhleSdyZSBoZXJlIGJlY2F1c2UgU3VuJ3MgYXMgaGFzIHRoZW0uCi0gICAgIFN1bidzIGFzIHVzZXMgI0FTSV9QX0wgaW5zdGVhZCBvZiAjQVNJX1BMICh3aGljaCBhcHBlYXJzIGluIHRoZQotICAgICBVbHRyYVNQQVJDIGFyY2hpdGVjdHVyZSBtYW51YWwpLiAgKi8KLSAgeyAweDA0LCAiI0FTSV9OIiB9LAotICB7IDB4MGMsICIjQVNJX05fTCIgfSwKLSAgeyAweDEwLCAiI0FTSV9BSVVQIiB9LAotICB7IDB4MTEsICIjQVNJX0FJVVMiIH0sCi0gIHsgMHgxOCwgIiNBU0lfQUlVUF9MIiB9LAotICB7IDB4MTksICIjQVNJX0FJVVNfTCIgfSwKLSAgeyAweDgwLCAiI0FTSV9QIiB9LAotICB7IDB4ODEsICIjQVNJX1MiIH0sCi0gIHsgMHg4MiwgIiNBU0lfUE5GIiB9LAotICB7IDB4ODMsICIjQVNJX1NORiIgfSwKLSAgeyAweDg4LCAiI0FTSV9QX0wiIH0sCi0gIHsgMHg4OSwgIiNBU0lfU19MIiB9LAotICB7IDB4OGEsICIjQVNJX1BORl9MIiB9LAotICB7IDB4OGIsICIjQVNJX1NORl9MIiB9LAotICB7IDB4MDQsICIjQVNJX05VQ0xFVVMiIH0sCi0gIHsgMHgwYywgIiNBU0lfTlVDTEVVU19MSVRUTEUiIH0sCi0gIHsgMHgxMCwgIiNBU0lfQVNfSUZfVVNFUl9QUklNQVJZIiB9LAotICB7IDB4MTEsICIjQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZIiB9LAotICB7IDB4MTgsICIjQVNJX0FTX0lGX1VTRVJfUFJJTUFSWV9MSVRUTEUiIH0sCi0gIHsgMHgxOSwgIiNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUllfTElUVExFIiB9LAotICB7IDB4ODAsICIjQVNJX1BSSU1BUlkiIH0sCi0gIHsgMHg4MSwgIiNBU0lfU0VDT05EQVJZIiB9LAotICB7IDB4ODIsICIjQVNJX1BSSU1BUllfTk9GQVVMVCIgfSwKLSAgeyAweDgzLCAiI0FTSV9TRUNPTkRBUllfTk9GQVVMVCIgfSwKLSAgeyAweDg4LCAiI0FTSV9QUklNQVJZX0xJVFRMRSIgfSwKLSAgeyAweDg5LCAiI0FTSV9TRUNPTkRBUllfTElUVExFIiB9LAotICB7IDB4OGEsICIjQVNJX1BSSU1BUllfTk9GQVVMVF9MSVRUTEUiIH0sCi0gIHsgMHg4YiwgIiNBU0lfU0VDT05EQVJZX05PRkFVTFRfTElUVExFIiB9LAotICAvKiBUaGVzZSBhcmUgVWx0cmFTUEFSQyBleHRlbnNpb25zLiAgKi8KLSAgLyogRklYTUU6IFRoZXJlIGFyZSBkb3plbnMgb2YgdGhlbS4gIE5vdCBzdXJlIHdlIHdhbnQgdGhlbSBhbGwuCi0gICAgIE1vc3QgYXJlIGZvciBrZXJuZWwgYnVpbGRpbmcgYnV0IHNvbWUgYXJlIGZvciB2aXMgdHlwZSBzdHVmZi4gICovCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBBU0kgTkFNRSwgb3IgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1zcGFyY19lbmNvZGVfYXNpIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbG9va3VwX25hbWUgKGFzaV90YWJsZSwgbmFtZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBmb3IgQVNJIHZhbHVlIFZBTFVFIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY19kZWNvZGVfYXNpICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICByZXR1cm4gbG9va3VwX3ZhbHVlIChhc2lfdGFibGUsIHZhbHVlKTsKLX0KLQwKLS8qIEhhbmRsZSBtZW1iYXIgbWFza3MuICAqLwotCi1zdGF0aWMgYXJnIG1lbWJhcl90YWJsZVtdID0KLXsKLSAgeyAweDQwLCAiI1N5bmMiIH0sCi0gIHsgMHgyMCwgIiNNZW1Jc3N1ZSIgfSwKLSAgeyAweDEwLCAiI0xvb2thc2lkZSIgfSwKLSAgeyAweDA4LCAiI1N0b3JlU3RvcmUiIH0sCi0gIHsgMHgwNCwgIiNMb2FkU3RvcmUiIH0sCi0gIHsgMHgwMiwgIiNTdG9yZUxvYWQiIH0sCi0gIHsgMHgwMSwgIiNMb2FkTG9hZCIgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLS8qIFJldHVybiB0aGUgdmFsdWUgZm9yIG1lbWJhciBhcmcgTkFNRSwgb3IgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1zcGFyY19lbmNvZGVfbWVtYmFyIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbG9va3VwX25hbWUgKG1lbWJhcl90YWJsZSwgbmFtZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBmb3IgbWVtYmFyIHZhbHVlIFZBTFVFIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY19kZWNvZGVfbWVtYmFyICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICByZXR1cm4gbG9va3VwX3ZhbHVlIChtZW1iYXJfdGFibGUsIHZhbHVlKTsKLX0KLQwKLS8qIEhhbmRsZSBwcmVmZXRjaCBhcmdzLiAgKi8KLQotc3RhdGljIGFyZyBwcmVmZXRjaF90YWJsZVtdID0KLXsKLSAgeyAwLCAiI25fcmVhZHMiIH0sCi0gIHsgMSwgIiNvbmVfcmVhZCIgfSwKLSAgeyAyLCAiI25fd3JpdGVzIiB9LAotICB7IDMsICIjb25lX3dyaXRlIiB9LAotICB7IDQsICIjcGFnZSIgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLS8qIFJldHVybiB0aGUgdmFsdWUgZm9yIHByZWZldGNoIGFyZyBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLXNwYXJjX2VuY29kZV9wcmVmZXRjaCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF9uYW1lIChwcmVmZXRjaF90YWJsZSwgbmFtZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBmb3IgcHJlZmV0Y2ggdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2RlY29kZV9wcmVmZXRjaCAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF92YWx1ZSAocHJlZmV0Y2hfdGFibGUsIHZhbHVlKTsKLX0KLQwKLS8qIEhhbmRsZSBzcGFyY2xldCBjb3Byb2Nlc3NvciByZWdpc3RlcnMuICAqLwotCi1zdGF0aWMgYXJnIHNwYXJjbGV0X2NwcmVnX3RhYmxlW10gPQotewotICB7IDAsICIlY2NzciIgfSwKLSAgeyAxLCAiJWNjZnIiIH0sCi0gIHsgMiwgIiVjY2NyY3IiIH0sCi0gIHsgMywgIiVjY3ByIiB9LAotICB7IDQsICIlY2NzcjIiIH0sCi0gIHsgNSwgIiVjY2NyciIgfSwKLSAgeyA2LCAiJWNjcnN0ciIgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLS8qIFJldHVybiB0aGUgdmFsdWUgZm9yIHNwYXJjbGV0IGNwcmVnIGFyZyBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLXNwYXJjX2VuY29kZV9zcGFyY2xldF9jcHJlZyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF9uYW1lIChzcGFyY2xldF9jcHJlZ190YWJsZSwgbmFtZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBmb3Igc3BhcmNsZXQgY3ByZWcgdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF92YWx1ZSAoc3BhcmNsZXRfY3ByZWdfdGFibGUsIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvc3RhbXAtaC5pbiBiL29wY29kZXMvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL29wY29kZXMvc3lzZGVwLmggYi9vcGNvZGVzL3N5c2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzZTVmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvc3lzZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSYW5kb20gaG9zdC1kZXBlbmRlbnQgc3VwcG9ydCBjb2RlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlib3Bjb2RlcywgdGhlIG9wY29kZXMgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRG8gc3lzdGVtLWRlcGVuZGVudCBzdHVmZiwgbWFpbmx5IGRyaXZlbiBieSBhdXRvY29uZi1kZXRlY3RlZCBpbmZvLgotCi0gICBXZWxsLCBzb21lIGdlbmVyaWMgY29tbW9uIHN0dWZmIGlzIGRvbmUgaGVyZSB0b28sIGxpa2UgaW5jbHVkaW5nCi0gICBhbnNpZGVjbC5oLiAgVGhhdCdzIGJlY2F1c2UgdGhlIC5oIGZpbGVzIGluIGJmZC9ob3N0cyBmaWxlcyBJJ20KLSAgIHRyeWluZyB0byByZXBsYWNlIG9mdGVuIGRpZCB0aGF0LiAgSWYgaXQgY2FuIGJlIGRyb3BwZWQgZnJvbSB0aGlzCi0gICBmaWxlIChjaGVjayBpbiBhIG5vbi1BTlNJIGVudmlyb25tZW50ISksIGl0IHNob3VsZCBiZS4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWMzMC1kaXMuYyBiL29wY29kZXMvdGljMzAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2Y4OTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy90aWMzMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDcxMCArMCwwIEBACi0vKiBEaXNhc3NlbWJseSByb3V0aW5lcyBmb3IgVE1TMzIwQzMwIGFyY2hpdGVjdHVyZQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzMwLmgiCi0KLSNkZWZpbmUgTk9STUFMX0lOU04gICAxCi0jZGVmaW5lIFBBUkFMTEVMX0lOU04gMgotCi0vKiBHZXRzIHRoZSB0eXBlIG9mIGluc3RydWN0aW9uIGJhc2VkIG9uIHRoZSB0b3AgMiBvciAzIGJpdHMgb2YgdGhlCi0gICBpbnN0cnVjdGlvbiB3b3JkLiAqLwotI2RlZmluZSBHRVRfVFlQRShpbnNuKSAoaW5zbiAmIDB4ODAwMDAwMDAgPyBpbnNuICYgMHhDMDAwMDAwMCA6IGluc24gJiAweEUwMDAwMDAwKQotCi0vKiBJbnN0cnVjdGlvbiB0eXBlcy4gKi8KLSNkZWZpbmUgVFdPX09QRVJBTkRfMSAweDAwMDAwMDAwCi0jZGVmaW5lIFRXT19PUEVSQU5EXzIgMHg0MDAwMDAwMAotI2RlZmluZSBUSFJFRV9PUEVSQU5EIDB4MjAwMDAwMDAKLSNkZWZpbmUgUEFSX1NUT1JFICAgICAweEMwMDAwMDAwCi0jZGVmaW5lIE1VTF9BRERTICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBCUkFOQ0hFUyAgICAgIDB4NjAwMDAwMDAKLQotLyogU3BlY2lmaWMgaW5zdHJ1Y3Rpb24gaWQgYml0cy4gKi8KLSNkZWZpbmUgTk9STUFMX0lERU4gICAgMHgxRjgwMDAwMAotI2RlZmluZSBQQVJfU1RPUkVfSURFTiAweDNFMDAwMDAwCi0jZGVmaW5lIE1VTF9BRERfSURFTiAgIDB4MkMwMDAwMDAKLSNkZWZpbmUgQlJfSU1NX0lERU4gICAgMHgxRjAwMDAwMAotI2RlZmluZSBCUl9DT05EX0lERU4gICAweDFDM0YwMDAwCi0KLS8qIEFkZHJlc3NpbmcgbW9kZXMuICovCi0jZGVmaW5lIEFNX1JFR0lTVEVSIDB4MDAwMDAwMDAKLSNkZWZpbmUgQU1fRElSRUNUICAgMHgwMDIwMDAwMAotI2RlZmluZSBBTV9JTkRJUkVDVCAweDAwNDAwMDAwCi0jZGVmaW5lIEFNX0lNTSAgICAgIDB4MDA2MDAwMDAKLQotI2RlZmluZSBQX0ZJRUxEIDB4MDMwMDAwMDAKLQotI2RlZmluZSBSRUdfQVIwIDB4MDgKLSNkZWZpbmUgTERQX0lOU04gMHgwODcwMDAwMAotCi0vKiBUTVMzMjBDMzAgcHJvZ3JhbSBjb3VudGVyIGZvciBjdXJyZW50IGluc3RydWN0aW9uLiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfcGM7Ci0KLXN0cnVjdCBpbnN0cnVjdGlvbgotICB7Ci0gICAgaW50IHR5cGU7Ci0gICAgdGVtcGxhdGUgKnRtOwotICAgIHBhcnRlbXBsYXRlICpwdG07Ci0gIH07Ci0KLWludCBnZXRfdGljMzBfaW5zdHJ1Y3Rpb24gUEFSQU1TICgodW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF90d29fb3BlcmFuZAotICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfdGhyZWVfb3BlcmFuZAotICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfcGFyX2luc24KLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X2JyYW5jaAotICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgZ2V0X2luZGlyZWN0X29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgc2hvcnQsIGludCwgY2hhciAqKSk7Ci1pbnQgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgY2hhciwgY2hhciAqKSk7Ci1pbnQgY252dF90bXNmbG9hdF9pZWVlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCwgZmxvYXQgKikpOwotCi1pbnQKLXByaW50X2luc25fdGljMzAgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgc3RydWN0IGluc3RydWN0aW9uIGluc24gPQotICB7MCwgTlVMTCwgTlVMTH07Ci0gIGJmZF92bWEgYnVmYWRkciA9IHBjIC0gaW5mby0+YnVmZmVyX3ZtYTsKLSAgLyogT2J0YWluIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdvcmQgZnJvbSB0aGUgYnVmZmVyLiAqLwotICBpbnNuX3dvcmQgPSAoKihpbmZvLT5idWZmZXIgKyBidWZhZGRyKSA8PCAyNCkgfCAoKihpbmZvLT5idWZmZXIgKyBidWZhZGRyICsgMSkgPDwgMTYpIHwKLSAgICAoKihpbmZvLT5idWZmZXIgKyBidWZhZGRyICsgMikgPDwgOCkgfCAqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIgKyAzKTsKLSAgX3BjID0gcGMgLyA0OwotICAvKiBHZXQgdGhlIGluc3RydWN0aW9uIHJlZmVyZWQgdG8gYnkgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd29yZAotICAgICBhbmQgcHJpbnQgaXQgb3V0IGJhc2VkIG9uIGl0cyB0eXBlLiAqLwotICBpZiAoIWdldF90aWMzMF9pbnN0cnVjdGlvbiAoaW5zbl93b3JkLCAmaW5zbikpCi0gICAgcmV0dXJuIC0xOwotICBzd2l0Y2ggKEdFVF9UWVBFIChpbnNuX3dvcmQpKQotICAgIHsKLSAgICBjYXNlIFRXT19PUEVSQU5EXzE6Ci0gICAgY2FzZSBUV09fT1BFUkFORF8yOgotICAgICAgaWYgKCFwcmludF90d29fb3BlcmFuZCAoaW5mbywgaW5zbl93b3JkLCAmaW5zbikpCi0JcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUSFJFRV9PUEVSQU5EOgotICAgICAgaWYgKCFwcmludF90aHJlZV9vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBBUl9TVE9SRToKLSAgICBjYXNlIE1VTF9BRERTOgotICAgICAgaWYgKCFwcmludF9wYXJfaW5zbiAoaW5mbywgaW5zbl93b3JkLCAmaW5zbikpCi0JcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCUkFOQ0hFUzoKLSAgICAgIGlmICghcHJpbnRfYnJhbmNoIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiA0OwotfQotCi1pbnQKLWdldF90aWMzMF9pbnN0cnVjdGlvbiAoaW5zbl93b3JkLCBpbnNuKQotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBzd2l0Y2ggKEdFVF9UWVBFIChpbnNuX3dvcmQpKQotICAgIHsKLSAgICBjYXNlIFRXT19PUEVSQU5EXzE6Ci0gICAgY2FzZSBUV09fT1BFUkFORF8yOgotICAgIGNhc2UgVEhSRUVfT1BFUkFORDoKLSAgICAgIGluc24tPnR5cGUgPSBOT1JNQUxfSU5TTjsKLSAgICAgIHsKLQl0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9ICh0ZW1wbGF0ZSAqKSB0aWMzMF9vcHRhYjsKLQlmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX29wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotCSAgewotCSAgICBpZiAoR0VUX1RZUEUgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlKSA9PSBHRVRfVFlQRSAoaW5zbl93b3JkKSkKLQkgICAgICB7Ci0JCWlmIChjdXJyZW50X29wdGFiLT5vcGVyYW5kcyA9PSAwKQotCQkgIHsKLQkJICAgIGlmIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSA9PSBpbnNuX3dvcmQpCi0JCSAgICAgIHsKLQkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlIGlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBOT1JNQUxfSURFTikgPT0gKGluc25fd29yZCAmIE5PUk1BTF9JREVOKSkKLQkJICB7Ci0JCSAgICBpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQVJfU1RPUkU6Ci0gICAgICBpbnNuLT50eXBlID0gUEFSQUxMRUxfSU5TTjsKLSAgICAgIHsKLQlwYXJ0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9IChwYXJ0ZW1wbGF0ZSAqKSB0aWMzMF9wYXJvcHRhYjsKLQlmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX3Bhcm9wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotCSAgewotCSAgICBpZiAoR0VUX1RZUEUgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlKSA9PSBHRVRfVFlQRSAoaW5zbl93b3JkKSkKLQkgICAgICB7Ci0JCWlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBQQVJfU1RPUkVfSURFTikgPT0gKGluc25fd29yZCAmIFBBUl9TVE9SRV9JREVOKSkKLQkJICB7Ci0JCSAgICBpbnNuLT5wdG0gPSBjdXJyZW50X29wdGFiOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTVVMX0FERFM6Ci0gICAgICBpbnNuLT50eXBlID0gUEFSQUxMRUxfSU5TTjsKLSAgICAgIHsKLQlwYXJ0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9IChwYXJ0ZW1wbGF0ZSAqKSB0aWMzMF9wYXJvcHRhYjsKLQlmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX3Bhcm9wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotCSAgewotCSAgICBpZiAoR0VUX1RZUEUgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlKSA9PSBHRVRfVFlQRSAoaW5zbl93b3JkKSkKLQkgICAgICB7Ci0JCWlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBNVUxfQUREX0lERU4pID09IChpbnNuX3dvcmQgJiBNVUxfQUREX0lERU4pKQotCQkgIHsKLQkJICAgIGluc24tPnB0bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCUkFOQ0hFUzoKLSAgICAgIGluc24tPnR5cGUgPSBOT1JNQUxfSU5TTjsKLSAgICAgIHsKLQl0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9ICh0ZW1wbGF0ZSAqKSB0aWMzMF9vcHRhYjsKLQlmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX29wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotCSAgewotCSAgICBpZiAoR0VUX1RZUEUgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlKSA9PSBHRVRfVFlQRSAoaW5zbl93b3JkKSkKLQkgICAgICB7Ci0JCWlmIChjdXJyZW50X29wdGFiLT5vcGVyYW5kX3R5cGVzWzBdICYgSW1tMjQpCi0JCSAgewotCQkgICAgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIEJSX0lNTV9JREVOKSA9PSAoaW5zbl93b3JkICYgQlJfSU1NX0lERU4pKQotCQkgICAgICB7Ci0JCQlpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZSBpZiAoY3VycmVudF9vcHRhYi0+b3BlcmFuZHMgPiAwKQotCQkgIHsKLQkJICAgIGlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBCUl9DT05EX0lERU4pID09IChpbnNuX3dvcmQgJiBCUl9DT05EX0lERU4pKQotCQkgICAgICB7Ci0JCQlpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiAoQlJfQ09ORF9JREVOIHwgMHgwMDgwMDAwMCkpID09IChpbnNuX3dvcmQgJiAoQlJfQ09ORF9JREVOIHwgMHgwMDgwMDAwMCkpKQotCQkgICAgICB7Ci0JCQlpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1wcmludF90d29fb3BlcmFuZCAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBjaGFyIG5hbWVbMTJdOwotICBjaGFyIG9wZXJhbmRbMl1bMTNdID0KLSAgewotICAgIHswfSwKLSAgICB7MH19OwotICBmbG9hdCBmX251bWJlcjsKLQotICBpZiAoaW5zbi0+dG0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgc3RyY3B5IChuYW1lLCBpbnNuLT50bS0+bmFtZSk7Ci0gIGlmIChpbnNuLT50bS0+b3Bjb2RlX21vZGlmaWVyID09IEFkZHJlc3NNb2RlKQotICAgIHsKLSAgICAgIGludCBzcmNfb3AsIGRlc3Rfb3A7Ci0gICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciBpbnN0cnVjdGlvbiBpcyBhIHN0b3JlIG9yIGEgbm9ybWFsIGluc3RydWN0aW9uLiAqLwotICAgICAgaWYgKChpbnNuLT50bS0+b3BlcmFuZF90eXBlc1sxXSAmIChEaXJlY3QgfCBJbmRpcmVjdCkpID09IChEaXJlY3QgfCBJbmRpcmVjdCkpCi0JewotCSAgc3JjX29wID0gMTsKLQkgIGRlc3Rfb3AgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzcmNfb3AgPSAwOwotCSAgZGVzdF9vcCA9IDE7Ci0JfQotICAgICAgLyogR2V0IHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4gKi8KLSAgICAgIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMikKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAxRjAwMDApID4+IDE2LCBvcGVyYW5kW2Rlc3Rfb3BdKTsKLSAgICAgIC8qIEdldCB0aGUgc291cmNlIG9wZXJhbmQgYmFzZWQgb24gYWRkcmVzc2luZyBtb2RlLiAqLwotICAgICAgc3dpdGNoIChpbnNuX3dvcmQgJiBBZGRyZXNzTW9kZSkKLQl7Ci0JY2FzZSBBTV9SRUdJU1RFUjoKLQkgIC8qIENoZWNrIGZvciB0aGUgTk9QIGluc3RydWN0aW9uIGJlZm9yZSBnZXR0aW5nIHRoZSBvcGVyYW5kLiAqLwotCSAgaWYgKChpbnNuLT50bS0+b3BlcmFuZF90eXBlc1swXSAmIE5vdFJlcSkgPT0gMCkKLQkgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMDFGKSwgb3BlcmFuZFtzcmNfb3BdKTsKLQkgIGJyZWFrOwotCWNhc2UgQU1fRElSRUNUOgotCSAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiQDB4JWxYIiwgKGluc25fd29yZCAmIDB4MDAwMEZGRkYpKTsKLQkgIGJyZWFrOwotCWNhc2UgQU1fSU5ESVJFQ1Q6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGRkYpLCAyLCBvcGVyYW5kW3NyY19vcF0pOwotCSAgYnJlYWs7Ci0JY2FzZSBBTV9JTU06Ci0JICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBpbW1lZGlhdGUgb3BlcmFuZCBiYXNlZCBvbiB2YXJpYWJsZSB0eXBlLiAqLwotCSAgc3dpdGNoIChpbnNuLT50bS0+aW1tX2FyZ190eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgSW1tX0Zsb2F0OgotCSAgICAgIGNudnRfdG1zZmxvYXRfaWVlZSAoKGluc25fd29yZCAmIDB4MDAwMEZGRkYpLCAyLCAmZl9udW1iZXIpOwotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbc3JjX29wXSwgIiUyLjJmIiwgZl9udW1iZXIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEltbV9TSW50OgotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbc3JjX29wXSwgIiVkIiwgKHNob3J0KSAoaW5zbl93b3JkICYgMHgwMDAwRkZGRikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEltbV9VSW50OgotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbc3JjX29wXSwgIiVsdSIsIChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIExEUCBpbnN0cnVjdGlvbi4gKi8KLQkgIGlmICgoaW5zbl93b3JkICYgMHhGRkZGRkYwMCkgPT0gTERQX0lOU04pCi0JICAgIHsKLQkgICAgICBzdHJjcHkgKG5hbWUsICJsZHAiKTsKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiMHglMDZsWCIsIChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSA8PCAxNik7Ci0JICAgICAgb3BlcmFuZFsxXVswXSA9ICdcMCc7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBIYW5kbGUgY2FzZSBmb3Igc3RhY2sgYW5kIHJvdGF0ZSBpbnN0cnVjdGlvbnMuICovCi0gIGVsc2UgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAxKQotICAgIHsKLSAgICAgIGlmIChpbnNuLT50bS0+b3Bjb2RlX21vZGlmaWVyID09IFN0YWNrT3ApCi0JewotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMUYwMDAwKSA+PiAxNiwgb3BlcmFuZFswXSk7Ci0JfQotICAgIH0KLSAgLyogT3V0cHV0IGluc3RydWN0aW9uIHRvIHN0cmVhbS4gKi8KLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcyVjJXMiLCBuYW1lLAotCQkgICAgICBvcGVyYW5kWzBdWzBdID8gb3BlcmFuZFswXSA6ICIiLAotCQkgICAgICBvcGVyYW5kWzFdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzFdWzBdID8gb3BlcmFuZFsxXSA6ICIiKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotcHJpbnRfdGhyZWVfb3BlcmFuZCAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBjaGFyIG9wZXJhbmRbM11bMTNdID0KLSAgewotICAgIHswfSwKLSAgICB7MH0sCi0gICAgezB9fTsKLQotICBpZiAoaW5zbi0+dG0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgc3dpdGNoIChpbnNuX3dvcmQgJiBBZGRyZXNzTW9kZSkKLSAgICB7Ci0gICAgY2FzZSBBTV9SRUdJU1RFUjoKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIG9wZXJhbmRbMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCBvcGVyYW5kWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQU1fRElSRUNUOgotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgb3BlcmFuZFswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBTV9JTkRJUkVDVDoKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCBvcGVyYW5kWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQU1fSU1NOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAzKQotICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDFGMDAwMCkgPj4gMTYsIG9wZXJhbmRbMl0pOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzLCVzJWMlcyIsIGluc24tPnRtLT5uYW1lLAotCQkgICAgICBvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLAotCQkgICAgICBvcGVyYW5kWzJdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzJdWzBdID8gb3BlcmFuZFsyXSA6ICIiKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotcHJpbnRfcGFyX2luc24gKGluZm8sIGluc25fd29yZCwgaW5zbikKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgc2l6ZV90IGksIGxlbjsKLSAgY2hhciAqbmFtZTEsICpuYW1lMjsKLSAgY2hhciBvcGVyYW5kWzJdWzNdWzEzXSA9Ci0gIHsKLSAgICB7Ci0gICAgICB7MH0sCi0gICAgICB7MH0sCi0gICAgICB7MH19LAotICAgIHsKLSAgICAgIHswfSwKLSAgICAgIHswfSwKLSAgICAgIHswfX19OwotCi0gIGlmIChpbnNuLT5wdG0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgLyogUGFyc2Ugb3V0IHRoZSBuYW1lcyBvZiBlYWNoIG9mIHRoZSBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgZnJvbSB0aGUKLSAgICAgcV9pbnNuMV9pbnNuMiBmb3JtYXQuICovCi0gIG5hbWUxID0gKGNoYXIgKikgc3RyZHVwIChpbnNuLT5wdG0tPm5hbWUgKyAyKTsKLSAgbmFtZTIgPSAiIjsKLSAgbGVuID0gc3RybGVuIChuYW1lMSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmFtZTFbaV0gPT0gJ18nKQotCXsKLQkgIG5hbWUyID0gJm5hbWUxW2kgKyAxXTsKLQkgIG5hbWUxW2ldID0gJ1wwJzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIC8qIEdldCB0aGUgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uIGJhc2VkIG9uIHRoZSBvcGVyYW5kIG9yZGVyLiAqLwotICBzd2l0Y2ggKGluc24tPnB0bS0+b3BvcmRlcikKLSAgICB7Ci0gICAgY2FzZSBPT180b3AxOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fNG9wMjoKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PXzRvcDM6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT181b3AxOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMl0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT181b3AyOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMl0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT19QRmllbGQ6Ci0gICAgICBpZiAoaW5zbl93b3JkICYgMHgwMDgwMDAwMCkKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMSwgb3BlcmFuZFswXVsyXSk7Ci0gICAgICBlbHNlCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDAsIG9wZXJhbmRbMF1bMl0pOwotICAgICAgaWYgKGluc25fd29yZCAmIDB4MDA0MDAwMDApCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDMsIG9wZXJhbmRbMV1bMl0pOwotICAgICAgZWxzZQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAyLCBvcGVyYW5kWzFdWzJdKTsKLSAgICAgIHN3aXRjaCAoaW5zbl93b3JkICYgUF9GSUVMRCkKLQl7Ci0JY2FzZSAweDAwMDAwMDAwOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVsxXSk7Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMF1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVsxXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMTAwMDAwMDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMV1bMF0pOwotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzBdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMV0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0JICBicmVhazsKLQljYXNlIDB4MDIwMDAwMDA6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzFdWzFdKTsKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMF0pOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAzMDAwMDAwOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMF1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMsJXMlYyVzIiwgbmFtZTEsCi0JCSAgICAgIG9wZXJhbmRbMF1bMF0sIG9wZXJhbmRbMF1bMV0sCi0JCSAgICAgIG9wZXJhbmRbMF1bMl1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMF1bMl1bMF0gPyBvcGVyYW5kWzBdWzJdIDogIiIpOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIlxuXHRcdFx0fHwgJXMgJXMsJXMlYyVzIiwgbmFtZTIsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0sIG9wZXJhbmRbMV1bMV0sCi0JCSAgICAgIG9wZXJhbmRbMV1bMl1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMV1bMl1bMF0gPyBvcGVyYW5kWzFdWzJdIDogIiIpOwotICBmcmVlIChuYW1lMSk7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXByaW50X2JyYW5jaCAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBjaGFyIG9wZXJhbmRbMl1bMTNdID0KLSAgewotICAgIHswfSwKLSAgICB7MH19OwotICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0gIGludCBwcmludF9sYWJlbCA9IDA7Ci0KLSAgaWYgKGluc24tPnRtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIEdldCB0aGUgb3BlcmFuZHMgZm9yIDI0LWJpdCBpbW1lZGlhdGUganVtcHMuICovCi0gIGlmIChpbnNuLT50bS0+b3BlcmFuZF90eXBlc1swXSAmIEltbTI0KQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBpbnNuX3dvcmQgJiAweDAwRkZGRkZGOwotICAgICAgc3ByaW50ZiAob3BlcmFuZFswXSwgIjB4JWxYIiwgYWRkcmVzcyk7Ci0gICAgICBwcmludF9sYWJlbCA9IDE7Ci0gICAgfQotICAvKiBHZXQgdGhlIG9wZXJhbmQgZm9yIHRoZSB0cmFwIGluc3RydWN0aW9uLiAqLwotICBlbHNlIGlmIChpbnNuLT50bS0+b3BlcmFuZF90eXBlc1swXSAmIElWZWN0b3IpCi0gICAgewotICAgICAgYWRkcmVzcyA9IGluc25fd29yZCAmIDB4MDAwMDAwMUY7Ci0gICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiMHglbFgiLCBhZGRyZXNzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gaW5zbl93b3JkICYgMHgwMDAwRkZGRjsKLSAgICAgIC8qIEdldCB0aGUgb3BlcmFuZHMgZm9yIHRoZSBEQiBpbnN0cnVjdGlvbnMuICovCi0gICAgICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDIpCi0JewotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKCgoaW5zbl93b3JkICYgMHgwMUMwMDAwMCkgPj4gMjIpICsgUkVHX0FSMCwgb3BlcmFuZFswXSk7Ci0JICBpZiAoaW5zbl93b3JkICYgUENSZWwpCi0JICAgIHsKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kWzFdLCAiJWQiLCAoc2hvcnQpIGFkZHJlc3MpOwotCSAgICAgIHByaW50X2xhYmVsID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoaW5zbl93b3JkICYgMHgwMDAwMDAxRiwgb3BlcmFuZFsxXSk7Ci0JfQotICAgICAgLyogR2V0IHRoZSBvcGVyYW5kcyBmb3IgdGhlIHN0YW5kYXJkIGJyYW5jaGVzLiAqLwotICAgICAgZWxzZSBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDEpCi0JewotCSAgaWYgKGluc25fd29yZCAmIFBDUmVsKQotCSAgICB7Ci0JICAgICAgYWRkcmVzcyA9IChzaG9ydCkgYWRkcmVzczsKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiJWxkIiwgYWRkcmVzcyk7Ci0JICAgICAgcHJpbnRfbGFiZWwgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kIChpbnNuX3dvcmQgJiAweDAwMDAwMDFGLCBvcGVyYW5kWzBdKTsKLQl9Ci0gICAgfQotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzJWMlcyIsIGluc24tPnRtLT5uYW1lLAotCQkgICAgICBvcGVyYW5kWzBdWzBdID8gb3BlcmFuZFswXSA6ICIiLAotCQkgICAgICBvcGVyYW5kWzFdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzFdWzBdID8gb3BlcmFuZFsxXSA6ICIiKTsKLSAgLyogUHJpbnQgZGVzdGluYXRpb24gb2YgYnJhbmNoIGluIHJlbGF0aW9uIHRvIGN1cnJlbnQgc3ltYm9sLiAqLwotICBpZiAocHJpbnRfbGFiZWwgJiYgaW5mby0+c3ltYm9scykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW0gPSAqaW5mby0+c3ltYm9sczsKLQotICAgICAgaWYgKChpbnNuLT50bS0+b3Bjb2RlX21vZGlmaWVyID09IFBDUmVsKSAmJiAoaW5zbl93b3JkICYgUENSZWwpKQotCXsKLQkgIGFkZHJlc3MgPSAoX3BjICsgMSArIChzaG9ydCkgYWRkcmVzcykgLSAoKHN5bS0+c2VjdGlvbi0+dm1hICsgc3ltLT52YWx1ZSkgLyA0KTsKLQkgIC8qIENoZWNrIGZvciBkZWxheWVkIGluc3RydWN0aW9uLCBpZiBzbyBhZGp1c3QgZGVzdGluYXRpb24uICovCi0JICBpZiAoaW5zbl93b3JkICYgMHgwMDIwMDAwMCkKLQkgICAgYWRkcmVzcyArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhZGRyZXNzIC09ICgoc3ltLT5zZWN0aW9uLT52bWEgKyBzeW0tPnZhbHVlKSAvIDQpOwotCX0KLSAgICAgIGlmIChhZGRyZXNzID09IDApCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgPCVzPiIsIHN5bS0+bmFtZSk7Ci0gICAgICBlbHNlCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgPCVzICVjICVkPiIsIHN5bS0+bmFtZSwKLQkJCSAgICAoKHNob3J0KSBhZGRyZXNzIDwgMCkgPyAnLScgOiAnKycsCi0JCQkgICAgYWJzIChhZGRyZXNzKSk7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1nZXRfaW5kaXJlY3Rfb3BlcmFuZCAoZnJhZ21lbnQsIHNpemUsIGJ1ZmZlcikKLSAgICAgdW5zaWduZWQgc2hvcnQgZnJhZ21lbnQ7Ci0gICAgIGludCBzaXplOwotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbW9kOwotICB1bnNpZ25lZCBhcm51bTsKLSAgdW5zaWduZWQgY2hhciBkaXNwOwotCi0gIGlmIChidWZmZXIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgLyogRGV0ZXJtaW5lIHdoaWNoIGJpdHMgaWRlbnRpZnkgdGhlIHNlY3Rpb25zIG9mIHRoZSBpbmRpcmVjdCBvcGVyYW5kIGJhc2VkIG9uIHRoZQotICAgICBzaXplIGluIGJ5dGVzLiAqLwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIG1vZCA9IChmcmFnbWVudCAmIDB4MDBGOCkgPj4gMzsKLSAgICAgIGFybnVtID0gKGZyYWdtZW50ICYgMHgwMDA3KTsKLSAgICAgIGRpc3AgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbW9kID0gKGZyYWdtZW50ICYgMHhGODAwKSA+PiAxMTsKLSAgICAgIGFybnVtID0gKGZyYWdtZW50ICYgMHgwNzAwKSA+PiA4OwotICAgICAgZGlzcCA9IChmcmFnbWVudCAmIDB4MDBGRik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB7Ci0gICAgY29uc3QgaW5kX2FkZHJfdHlwZSAqY3VycmVudF9pbmQgPSB0aWMzMF9pbmRhZGRyX3RhYjsKLSAgICBmb3IgKDsgY3VycmVudF9pbmQgPCB0aWMzMF9pbmRhZGRydGFiX2VuZDsgY3VycmVudF9pbmQrKykKLSAgICAgIHsKLQlpZiAoY3VycmVudF9pbmQtPm1vZGZpZWxkID09IG1vZCkKLQkgIHsKLQkgICAgaWYgKGN1cnJlbnRfaW5kLT5kaXNwbGFjZW1lbnQgPT0gSU1QTElFRF9ESVNQICYmIHNpemUgPT0gMikKLQkgICAgICB7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc2l6ZV90IGksIGxlbjsKLQkJaW50IGJ1ZmNudDsKLQkJCi0JCWxlbiA9IHN0cmxlbiAoY3VycmVudF9pbmQtPnN5bnRheCk7Ci0JCWZvciAoaSA9IDAsIGJ1ZmNudCA9IDA7IGkgPCBsZW47IGkrKywgYnVmY250KyspCi0JCSAgewotCQkgICAgYnVmZmVyW2J1ZmNudF0gPSBjdXJyZW50X2luZC0+c3ludGF4W2ldOwotCQkgICAgaWYgKGJ1ZmZlcltidWZjbnQgLSAxXSA9PSAnYScgJiYgYnVmZmVyW2J1ZmNudF0gPT0gJ3InKQotCQkgICAgICBidWZmZXJbKytidWZjbnRdID0gYXJudW0gKyAnMCc7Ci0JCSAgICBpZiAoYnVmZmVyW2J1ZmNudF0gPT0gJygnICYmIGN1cnJlbnRfaW5kLT5kaXNwbGFjZW1lbnQgPT0gRElTUF9SRVFVSVJFRCkKLQkJICAgICAgewotCQkJc3ByaW50ZiAoJmJ1ZmZlcltidWZjbnQgKyAxXSwgIiV1IiwgZGlzcCk7Ci0JCQlidWZjbnQgKz0gc3RybGVuICgmYnVmZmVyW2J1ZmNudCArIDFdKTsKLQkJICAgICAgfQotCQkgIH0KLQkJYnVmZmVyW2J1ZmNudCArIDFdID0gJ1wwJzsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLWdldF9yZWdpc3Rlcl9vcGVyYW5kIChmcmFnbWVudCwgYnVmZmVyKQotICAgICB1bnNpZ25lZCBjaGFyIGZyYWdtZW50OwotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gIGNvbnN0IHJlZyAqY3VycmVudF9yZWcgPSB0aWMzMF9yZWd0YWI7Ci0KLSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBmb3IgKDsgY3VycmVudF9yZWcgPCB0aWMzMF9yZWd0YWJfZW5kOyBjdXJyZW50X3JlZysrKQotICAgIHsKLSAgICAgIGlmICgoZnJhZ21lbnQgJiAweDFGKSA9PSBjdXJyZW50X3JlZy0+b3Bjb2RlKQotCXsKLQkgIHN0cmNweSAoYnVmZmVyLCBjdXJyZW50X3JlZy0+bmFtZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1jbnZ0X3Rtc2Zsb2F0X2llZWUgKHRtc2Zsb2F0LCBzaXplLCBpZWVlZmxvYXQpCi0gICAgIHVuc2lnbmVkIGxvbmcgdG1zZmxvYXQ7Ci0gICAgIGludCBzaXplOwotICAgICBmbG9hdCAqaWVlZWZsb2F0OwotewotICB1bnNpZ25lZCBsb25nIGV4cCwgc2lnbiwgbWFudDsKLQotICBpZiAoc2l6ZSA9PSAyKQotICAgIHsKLSAgICAgIGlmICgodG1zZmxvYXQgJiAweDAwMDBGMDAwKSA9PSAweDAwMDA4MDAwKQotCXRtc2Zsb2F0ID0gMHg4MDAwMDAwMDsKLSAgICAgIGVsc2UKLQl7Ci0JICB0bXNmbG9hdCA8PD0gMTY7Ci0JICB0bXNmbG9hdCA9IChsb25nKSB0bXNmbG9hdCA+PiA0OwotCX0KLSAgICB9Ci0gIGV4cCA9IHRtc2Zsb2F0ICYgMHhGRjAwMDAwMDsKLSAgaWYgKGV4cCA9PSAweDgwMDAwMDAwKQotICAgIHsKLSAgICAgICppZWVlZmxvYXQgPSAwLjA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cCArPSAweDdGMDAwMDAwOwotICBzaWduID0gKHRtc2Zsb2F0ICYgMHgwMDgwMDAwMCkgPDwgODsKLSAgbWFudCA9IHRtc2Zsb2F0ICYgMHgwMDdGRkZGRjsKLSAgaWYgKGV4cCA9PSAweEZGMDAwMDAwKQotICAgIHsKLSAgICAgIGlmIChtYW50ID09IDApCi0JKmllZWVmbG9hdCA9IEVSQU5HRTsKLSAgICAgIGlmIChzaWduID09IDApCi0JKmllZWVmbG9hdCA9IDEuMCAvIDAuMDsKLSAgICAgIGVsc2UKLQkqaWVlZWZsb2F0ID0gLTEuMCAvIDAuMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwID4+PSAxOwotICBpZiAoc2lnbikKLSAgICB7Ci0gICAgICBtYW50ID0gKH5tYW50KSAmIDB4MDA3RkZGRkY7Ci0gICAgICBtYW50ICs9IDE7Ci0gICAgICBleHAgKz0gbWFudCAmIDB4MDA4MDAwMDA7Ci0gICAgICBleHAgJj0gMHg3RjgwMDAwMDsKLSAgICAgIG1hbnQgJj0gMHgwMDdGRkZGRjsKLSAgICB9Ci0gIGlmICh0bXNmbG9hdCA9PSAweDgwMDAwMDAwKQotICAgIHNpZ24gPSBtYW50ID0gZXhwID0gMDsKLSAgdG1zZmxvYXQgPSBzaWduIHwgZXhwIHwgbWFudDsKLSAgKmllZWVmbG9hdCA9ICooKGZsb2F0ICopICZ0bXNmbG9hdCk7Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWM4MC1kaXMuYyBiL29wY29kZXMvdGljODAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNmJjMTIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy90aWM4MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKiBQcmludCBUSSBUTVMzMjBDODAgKE1WUCkgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS90aWM4MC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotc3RhdGljIGludCBsZW5ndGg7Ci0KLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfYml0bnVtIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZF9jb250cm9sX3JlZ2lzdGVyIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfZmxvYXQgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmQgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJCQkgICBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50IHByaW50X29uZV9pbnN0cnVjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKikpOwotc3RhdGljIGludCBwcmludF9pbnN0cnVjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLCB1bnNpZ25lZCBsb25nLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKikpOwotc3RhdGljIGludCBmaWxsX2luc3RydWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF92bWEsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nICopKTsKLQotDAotLyogUHJpbnQgYW4gaW50ZWdlciBvcGVyYW5kLiAgVHJ5IHRvIGJlIHNvbWV3aGF0IHNtYXJ0IGFib3V0IHRoZQotICAgZm9ybWF0IGJ5IGFzc3VtaW5nIHRoYXQgc21hbGwgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW50ZWdlcnMgYXJlCi0gICBwcm9iYWJseSBsb29wIGluY3JlbWVudCB2YWx1ZXMsIHN0cnVjdHVyZSBvZmZzZXRzLCBvciBzaW1pbGFyCi0gICB2YWx1ZXMgdGhhdCBhcmUgbW9yZSBtZWFuaW5nZnVsIHByaW50ZWQgYXMgc2lnbmVkIGRlY2ltYWwgdmFsdWVzLgotICAgTGFyZ2VyIG51bWJlcnMgYXJlIHByb2JhYmx5IGJldHRlciBwcmludGVkIGFzIGhleCB2YWx1ZXMuICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2ludGVnZXIgKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgaWYgKCh2YWx1ZSA+IDk5OTkgfHwgdmFsdWUgPCAtOTk5OSkpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJSNseCIsIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gICAgfQotfQotCi0MCi0vKiBGSVhNRTogZGVwZW5kcyB1cG9uIHNpemVvZiAobG9uZykgPT0gc2l6ZW9mIChmbG9hdCkgYW5kCi0gICBhbHNvIHVwb24gaG9zdCBmbG9hdGluZyBwb2ludCBmb3JtYXQgbWF0Y2hpbmcgdGFyZ2V0Ci0gICBmbG9hdGluZyBwb2ludCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2Zsb2F0IChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIHVuaW9uIHsgZmxvYXQgZjsgbG9uZyBsOyB9IGZ2YWw7Ci0KLSAgZnZhbC5sID0gdmFsdWU7Ci0gICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVnIiwgZnZhbC5mKTsKLX0KLQotDAotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICBjb25zdCBjaGFyICp0bXA7Ci0KLSAgdG1wID0gdGljODBfdmFsdWVfdG9fc3ltYm9sICh2YWx1ZSwgVElDODBfT1BFUkFORF9DUik7Ci0gIGlmICh0bXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlcyIsIHRtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJSNseCIsIHZhbHVlKTsKLSAgICB9Ci19Ci0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnRtcDsKLQotICB0bXAgPSB0aWM4MF92YWx1ZV90b19zeW1ib2wgKHZhbHVlLCBUSUM4MF9PUEVSQU5EX0NDKTsKLSAgaWYgKHRtcCAhPSBOVUxMKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVzIiwgdG1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9iaXRudW0gKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgaW50IGJpdG51bTsKLSAgY29uc3QgY2hhciAqdG1wOwotCi0gIGJpdG51bSA9IH52YWx1ZSAmIDB4MUY7Ci0gIHRtcCA9IHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAoYml0bnVtLCBUSUM4MF9PUEVSQU5EX0JJVE5VTSk7Ci0gIGlmICh0bXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlcyIsIHRtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgYml0bnVtKTsKLSAgICB9Ci19Ci0KLQwKLS8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBmbGFncy4gICovCi0KLSNkZWZpbmUgTV9TSShpbnNuLG9wKSAoKCgob3ApIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9NX1NJKSAhPSAwKSAmJiAoKGluc24pICYgKDEgPDwgMTcpKSkKLSNkZWZpbmUgTV9MSShpbnNuLG9wKSAoKCgob3ApIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9NX0xJKSAhPSAwKSAmJiAoKGluc24pICYgKDEgPDwgMTUpKSkKLSNkZWZpbmUgUl9TQ0FMRUQoaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSAhPSAwKSAmJiAoKGluc24pICYgKDEgPDwgMTEpKSkKLQotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmQgKGluZm8sIHZhbHVlLCBpbnNuLCBvcGVyYW5kLCBtZW1hZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotewotICBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0dQUikgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICJyJWxkIiwgdmFsdWUpOwotICAgICAgaWYgKE1fU0kgKGluc24sIG9wZXJhbmQpIHx8IE1fTEkgKGluc24sIG9wZXJhbmQpKQotCXsKLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIjptIik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZQQSkgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICJhJWxkIiwgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKSAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBwcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgNCAqIHZhbHVlLCBpbmZvKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9CQVNFUkVMKSAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBwcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQklUTlVNKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfYml0bnVtIChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQ0MpICE9IDApCi0gICAgewotICAgICAgcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSAoaW5mbywgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NSKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciAoaW5mbywgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZMT0FUKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfZmxvYXQgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9CSVRGSUVMRCkpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJSNseCIsIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2ludGVnZXIgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHNjYWxlZCBvcGVyYW5kLCB0aGVuIHByaW50IHRoZSBtb2RpZmllciAqLwotCi0gIGlmIChSX1NDQUxFRCAoaW5zbiwgb3BlcmFuZCkpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiOnMiKTsKLSAgICB9Ci19Ci0KLQwKLS8qIFdlIGhhdmUgY2hvc2VuIGFuIG9wY29kZSB0YWJsZSBlbnRyeSAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9vbmVfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIG9wY29kZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci17Ci0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kICpvcGVyYW5kOwotICBsb25nIHZhbHVlOwotICBpbnQgc3RhdHVzOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4OwotICBpbnQgY2xvc2VfcGFyZW47Ci0KLSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJS0xMHMiLCBvcGNvZGUgLT4gbmFtZSk7Ci0KLSAgZm9yIChvcGluZGV4ID0gb3Bjb2RlIC0+IG9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0gICAgewotICAgICAgb3BlcmFuZCA9IHRpYzgwX29wZXJhbmRzICsgKm9waW5kZXg7Ci0KLSAgICAgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmIChvcGVyYW5kIC0+IGV4dHJhY3QpCi0JewotCSAgdmFsdWUgPSAoKm9wZXJhbmQgLT4gZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3BlcmFuZCAtPiBiaXRzID09IDMyKQotCXsKLQkgIHN0YXR1cyA9IGZpbGxfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsICh1bnNpZ25lZCBsb25nICopICZ2YWx1ZSk7Ci0JICBpZiAoc3RhdHVzID09IC0xKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIChzdGF0dXMpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZCAtPiBzaGlmdCkgJiAoKDEgPDwgb3BlcmFuZCAtPiBiaXRzKSAtIDEpOwotCSAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZCAtPiBiaXRzIC0gMSkpKSAhPSAwKQotCSAgICB7Ci0JICAgICAgdmFsdWUgLT0gMSA8PCBvcGVyYW5kIC0+IGJpdHM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBpcyBlbmNsb3NlZCBpbiBwYXJlbnRoZXNpcywgdGhlbiBwcmludAotCSB0aGUgb3BlbiBwYXJlbiwgb3RoZXJ3aXNlIGp1c3QgcHJpbnQgdGhlIHJlZ3VsYXIgY29tbWEKLQkgc2VwYXJhdG9yLCBleGNlcHQgZm9yIHRoZSBmaXJzdCBvcGVyYW5kLiAqLwotCi0gICAgICBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BBUkVOUykgPT0gMCkKLQl7Ci0JICBjbG9zZV9wYXJlbiA9IDA7Ci0JICBpZiAob3BpbmRleCAhPSBvcGNvZGUgLT4gb3BlcmFuZHMpCi0JICAgIHsKLQkgICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIsIik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2xvc2VfcGFyZW4gPSAxOwotCSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiKCIpOwotCX0KLQotICAgICAgcHJpbnRfb3BlcmFuZCAoaW5mbywgdmFsdWUsIGluc24sIG9wZXJhbmQsIG1lbWFkZHIpOwotCi0gICAgICAvKiBJZiB3ZSBwcmludGVkIGFuIG9wZW4gcGFyZW4gYmVmb3JlIHByaW50aW5nIHRoaXMgb3BlcmFuZCwgY2xvc2UKLQkgaXQgbm93LiBUaGUgZmxhZyBnZXRzIHJlc2V0IG9uIGVhY2ggbG9vcC4gKi8KLQotICAgICAgaWYgKGNsb3NlX3BhcmVuKQotCXsKLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIikiKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGxlbmd0aCk7Ci19Ci0KLQwKLQotLyogVGhlcmUgYXJlIG5vIHNwZWNpZmljIGJpdHMgdGhhdCB0ZWxsIHVzIGZvciBjZXJ0YWluIHdoZXRoZXIgYSB2ZWN0b3IKLSAgIGluc3RydWN0aW9uIG9wY29kZSBjb250YWlucyBvbmUgb3IgdHdvIGluc3RydWN0aW9ucy4gIEhvd2V2ZXIgc2luY2UKLSAgIGEgZGVzdGluYXRpb24gcmVnaXN0ZXIgb2YgcjAgaXMgaWxsZWdhbCwgd2UgY2FuIGNoZWNrIGZvciBub256ZXJvCi0gICB2YWx1ZXMgaW4gYm90aCBkZXN0aW5hdGlvbiByZWdpc3RlciBmaWVsZHMuICBPbmx5IG9wY29kZXMgdGhhdCBoYXZlCi0gICB0d28gdmFsaWQgaW5zdHJ1Y3Rpb25zIHdpbGwgaGF2ZSBub24temVybyBpbiBib3RoICovCi0KLSNkZWZpbmUgVFdPX0lOU04oaW5zbikgKCgoKGluc24pICYgKDB4MUYgPDwgMjcpKSAhPSAwKSAmJiAoKChpbnNuKSAmICgweDFGIDw8IDIyKSkgIT0gMCkpCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCB2ZWNfb3Bjb2RlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKnZlY19vcGNvZGU7Ci17Ci0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlX2VuZDsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBvcGNvZGUgbWF0Y2ggaW4gdGhlIG9wY29kZXMgdGFibGUuICBGb3IgdmVjdG9yCi0gICAgIG9wY29kZXMgKHZlY19vcGNvZGUgIT0gTlVMTCkgZmluZCB0aGUgZmlyc3QgbWF0Y2ggdGhhdCBpcyBub3QgdGhlCi0gICAgIHByZXZpb3VzbHkgZm91bmQgbWF0Y2guICBGSVhNRTogdGhlcmUgc2hvdWxkIGJlIGZhc3RlciB3YXlzIHRvCi0gICAgIHNlYXJjaCAoaGFzaCB0YWJsZSBvciBiaW5hcnkgc2VhcmNoKSwgYnV0IGRvbid0IHdvcnJ5IHRvbyBtdWNoCi0gICAgIGFib3V0IGl0IHVudGlsIG90aGVyIFRJYzgwIHN1cHBvcnQgaXMgZmluaXNoZWQuICovCi0KLSAgb3Bjb2RlX2VuZCA9IHRpYzgwX29wY29kZXMgKyB0aWM4MF9udW1fb3Bjb2RlczsKLSAgZm9yIChvcGNvZGUgPSB0aWM4MF9vcGNvZGVzOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoKGluc24gJiBvcGNvZGUgLT4gbWFzaykgPT0gb3Bjb2RlIC0+IG9wY29kZSAmJgotCSAgb3Bjb2RlICE9IHZlY19vcGNvZGUpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAob3Bjb2RlID09IG9wY29kZV9lbmQpCi0gICAgewotICAgICAgLyogTm8gbWF0Y2ggZm91bmQsIGp1c3QgcHJpbnQgdGhlIGJpdHMgYXMgYSAud29yZCBkaXJlY3RpdmUgKi8KLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIi53b3JkICUjMDhseCIsIGluc24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE1hdGNoIGZvdW5kLCBkZWNvZGUgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGxlbmd0aCA9IHByaW50X29uZV9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgb3Bjb2RlKTsKLSAgICAgIGlmIChvcGNvZGUgLT4gZmxhZ3MgJiBUSUM4MF9WRUNUT1IgJiYgdmVjX29wY29kZSA9PSBOVUxMICYmIFRXT19JTlNOIChpbnNuKSkKLQl7Ci0JICAvKiBUaGVyZSBpcyBhbm90aGVyIGluc3RydWN0aW9uIHRvIHByaW50IGZyb20gdGhlIHNhbWUgb3Bjb2RlLgotCSAgICAgUHJpbnQgdGhlIHNlcGFyYXRvciBhbmQgdGhlbiBmaW5kIGFuZCBwcmludCB0aGUgb3RoZXIKLQkgICAgIGluc3RydWN0aW9uLiAqLwotCSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiICAgfHwgICAiKTsKLQkgIGxlbmd0aCA9IHByaW50X2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCBvcGNvZGUpOwotCX0KLSAgICB9Ci0gIHJldHVybiAobGVuZ3RoKTsKLX0KLQotLyogR2V0IHRoZSBuZXh0IDMyIGJpdCB3b3JkIGZyb20gdGhlIGluc3RydWN0aW9uIHN0cmVhbSBhbmQgY29udmVydCBpdAotICAgaW50byBpbnRlcm5hbCBmb3JtYXQgaW4gdGhlIHVuc2lnbmVkIGxvbmcgSU5TTiwgZm9yIHdoaWNoIHdlIGFyZQotICAgcGFzc2VkIHRoZSBhZGRyZXNzLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICovCi0KLXN0YXRpYyBpbnQKLWZpbGxfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc25wKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICB1bnNpZ25lZCBsb25nICppbnNucDsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIEdldCB0aGUgYml0cyBmb3IgdGhlIG5leHQgMzIgYml0IHdvcmQgYW5kIHB1dCBpbiBidWZmZXIgKi8KLQotICBzdGF0dXMgPSAoKmluZm8gLT4gcmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyBsZW5ndGgsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gbWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotCi0gIC8qIFJlYWQgd2FzIHN1Y2Nlc3NmdWwsIHNvIGluY3JlbWVudCBjb3VudCBvZiBieXRlcyByZWFkIGFuZCBjb252ZXJ0Ci0gICAgIHRoZSBiaXRzIGludG8gaW50ZXJuYWwgZm9ybWF0LiAqLwotICAgICAKLSAgbGVuZ3RoICs9IDQ7Ci0gIGlmIChpbmZvIC0+IGVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSAgICB7Ci0gICAgICAqaW5zbnAgPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5mbyAtPiBlbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0gICAgewotICAgICAgKmluc25wID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogU2hvdWxkIHByb2JhYmx5IGp1c3QgZGVmYXVsdCB0byBvbmUgb3IgdGhlIG90aGVyICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLQwKLWludCAKLXByaW50X2luc25fdGljODAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgaW50IHN0YXR1czsKLQotICBsZW5ndGggPSAwOwotICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7Ci0gIHN0YXR1cyA9IGZpbGxfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSAtMSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBwcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgTlVMTCk7Ci0gICAgfQotICByZXR1cm4gKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3RpYzgwLW9wYy5jIGIvb3Bjb2Rlcy90aWM4MC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1YzMwOC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3RpYzgwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNiArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKS4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHZhcmlvdXMgdGFibGVzIGZvciB0aGUgVE1TMzIwQzgwIChNVlApLgotCi0gICBUaGUgb3Bjb2RlIHRhYmxlIGlzIHN0cmljdGx5IGNvbnN0YW50IGRhdGEsIHNvIHRoZSBjb21waWxlciBzaG91bGQKLSAgIGJlIGFibGUgdG8gcHV0IGl0IGluIHRoZSAudGV4dCBzZWN0aW9uLgotCi0gICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQKLSAgIGluc2VydGluZyBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMKLSAgIGZpbGUuCi0KLSAgIFRoZSBwcmVkZWZpbmVkIHJlZ2lzdGVyIHRhYmxlIG1hcHMgZnJvbSByZWdpc3RlciBuYW1lcyB0byByZWdpc3RlcgotICAgdmFsdWVzLiAgKi8KLQotDAotLyogVGFibGUgb2YgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMsIHN1Y2ggYXMgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycywKLSAgIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgY29uZGl0aW9uIGNvZGVzLCBjb250cm9sIHJlZ2lzdGVycywgYW5kIGJpdAotICAgbnVtYmVycy4KLQotICAgVGhlIHRhYmxlIGlzIHNvcnRlZCBjYXNlIGluZGVwZW5kZW50bHkgYnkgbmFtZSBzbyB0aGF0IGl0IGlzIHN1aXRhYmxlIGZvcgotICAgc2VhcmNoaW5nIHZpYSBhIGJpbmFyeSBzZWFyY2ggdXNpbmcgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24KLSAgIGZ1bmN0aW9uLgotCi0gICBOb3RlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHN5bWJvbCBpcyBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YgdGhlIHZhbHVlCi0gICBmaWVsZCwgd2hpY2ggYWxsb3dzIHRoZSB2YWx1ZSBhbmQgdHlwZSB0byBiZSBwYXNzZWQgYXJvdW5kIGFzIGEgdW5pdCBpbiBhCi0gICBzaW5nbGUgaW50LiAgVGhlIHR5cGVzIGhhdmUgdG8gYmUgbWFza2VkIG9mZiBiZWZvcmUgdXNpbmcgdGhlIG51bWVyaWMKLSAgIHZhbHVlIGFzIGEgbnVtYmVyLgotKi8KLQotY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1tdID0KLXsKLSAgeyAiYTAiLAlUSUM4MF9PUEVSQU5EX0ZQQSB8IDAgfSwKLSAgeyAiYTEiLAlUSUM4MF9PUEVSQU5EX0ZQQSB8IDEgfSwKLSAgeyAiYWx3LmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNyB9LAotICB7ICJhbHcuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNSB9LAotICB7ICJhbHcudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMyB9LAotICB7ICJBTkFTVEFUIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzQgfSwKLSAgeyAiQlJLMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDM5IH0sCi0gIHsgIkJSSzIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzQSB9LAotICB7ICJDT05GSUciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMiB9LAotICB7ICJETFJVIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NTAwIH0sCi0gIHsgIkRUQUcwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwIH0sCi0gIHsgIkRUQUcxIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAxIH0sCi0gIHsgIkRUQUcxMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwQSB9LAotICB7ICJEVEFHMTEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEIgfSwKLSAgeyAiRFRBRzEyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBDIH0sCi0gIHsgIkRUQUcxMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwRCB9LAotICB7ICJEVEFHMTQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEUgfSwKLSAgeyAiRFRBRzE1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBGIH0sCi0gIHsgIkRUQUcyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAyIH0sCi0gIHsgIkRUQUczIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAzIH0sCi0gIHsgIkRUQUc0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA0IH0sCi0gIHsgIkRUQUc1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA1IH0sCi0gIHsgIkRUQUc2IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA2IH0sCi0gIHsgIkRUQUc3IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA3IH0sCi0gIHsgIkRUQUc4IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA4IH0sCi0gIHsgIkRUQUc5IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA5IH0sCi0gIHsgIkVDT01DTlRMIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzMgfSwKLSAgeyAiRUlQIiwJVElDODBfT1BFUkFORF9DUiB8IDEgfSwKLSAgeyAiRVBDIiwJVElDODBfT1BFUkFORF9DUiB8IDAgfSwKLSAgeyAiZXEuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDAgfSwKLSAgeyAiZXEuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIwIH0sCi0gIHsgImVxLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMCB9LAotICB7ICJlcS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjAgfSwKLSAgeyAiZXEwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMiB9LAotICB7ICJlcTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMCB9LAotICB7ICJlcTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxOCB9LAotICB7ICJGTFRBRFIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMSB9LAotICB7ICJGTFREVEgiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxNCB9LAotICB7ICJGTFREVEwiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMyB9LAotICB7ICJGTFRPUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDEwIH0sCi0gIHsgIkZMVFRBRyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDEyIH0sCi0gIHsgIkZQU1QiLAlUSUM4MF9PUEVSQU5EX0NSIHwgOCB9LAotICB7ICJnZS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNSB9LAotICB7ICJnZS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjUgfSwKLSAgeyAiZ2UuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE1IH0sCi0gIHsgImdlLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNSB9LAotICB7ICJnZTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAzIH0sCi0gIHsgImdlMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDExIH0sCi0gIHsgImdlMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDE5IH0sCi0gIHsgImd0LmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyIH0sCi0gIHsgImd0LmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMiB9LAotICB7ICJndC5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTIgfSwKLSAgeyAiZ3QudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIyIH0sCi0gIHsgImd0MC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDEgfSwKLSAgeyAiZ3QwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgOSB9LAotICB7ICJndDAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNyB9LAotICB7ICJoaS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNiB9LAotICB7ICJoaS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTYgfSwKLSAgeyAiaGkudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI2IH0sCi0gIHsgImhzLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA5IH0sCi0gIHsgImhzLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxOSB9LAotICB7ICJocy53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjkgfSwKLSAgeyAiaWIuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI4IH0sCi0gIHsgIklFIiwJVElDODBfT1BFUkFORF9DUiB8IDYgfSwKLSAgeyAiSUxSVSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMwMCB9LAotICB7ICJpbi5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjcgfSwKLSAgeyAiSU4wUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMDAgfSwKLSAgeyAiSU4xUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMDEgfSwKLSAgeyAiSU5UUEVOIiwJVElDODBfT1BFUkFORF9DUiB8IDQgfSwKLSAgeyAiSVRBRzAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDAgfSwKLSAgeyAiSVRBRzEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDEgfSwKLSAgeyAiSVRBRzEwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBBIH0sCi0gIHsgIklUQUcxMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwQiB9LAotICB7ICJJVEFHMTIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEMgfSwKLSAgeyAiSVRBRzEzIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBEIH0sCi0gIHsgIklUQUcxNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwRSB9LAotICB7ICJJVEFHMTUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEYgfSwKLSAgeyAiSVRBRzIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDIgfSwKLSAgeyAiSVRBRzMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDMgfSwKLSAgeyAiSVRBRzQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDQgfSwKLSAgeyAiSVRBRzUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDUgfSwKLSAgeyAiSVRBRzYiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDYgfSwKLSAgeyAiSVRBRzciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDcgfSwKLSAgeyAiSVRBRzgiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDggfSwKLSAgeyAiSVRBRzkiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDkgfSwKLSAgeyAibGUuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDMgfSwKLSAgeyAibGUuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIzIH0sCi0gIHsgImxlLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMyB9LAotICB7ICJsZS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjMgfSwKLSAgeyAibGUwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNiB9LAotICB7ICJsZTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNCB9LAotICB7ICJsZTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMiB9LAotICB7ICJsby5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgOCB9LAotICB7ICJsby5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTggfSwKLSAgeyAibG8udyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI4IH0sCi0gIHsgImxzLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA3IH0sCi0gIHsgImxzLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNyB9LAotICB7ICJscy53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjcgfSwKLSAgeyAibHQuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDQgfSwKLSAgeyAibHQuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI0IH0sCi0gIHsgImx0LmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNCB9LAotICB7ICJsdC53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjQgfSwKLSAgeyAibHQwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNCB9LAotICB7ICJsdDAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMiB9LAotICB7ICJsdDAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMCB9LAotICB7ICJNSVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMSB9LAotICB7ICJNUEMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMCB9LAotICB7ICJuZS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMSB9LAotICB7ICJuZS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjEgfSwKLSAgeyAibmUuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDExIH0sCi0gIHsgIm5lLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMSB9LAotICB7ICJuZTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA1IH0sCi0gIHsgIm5lMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDEzIH0sCi0gIHsgIm5lMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDIxIH0sCi0gIHsgIm5ldi5iIiwJVElDODBfT1BFUkFORF9DQyB8IDAgfSwKLSAgeyAibmV2LmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgOCB9LAotICB7ICJuZXYudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNiB9LAotICB7ICJvYi5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjkgfSwKLSAgeyAib3IuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDMxIH0sCi0gIHsgIm91LmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNiB9LAotICB7ICJPVVRQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwMiB9LAotICB7ICJQS1RSRVEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhEIH0sCi0gIHsgIlBQRVJST1IiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhBIH0sCi0gIHsgInIwIiwJVElDODBfT1BFUkFORF9HUFIgfCAwIH0sCi0gIHsgInIxIiwJVElDODBfT1BFUkFORF9HUFIgfCAxIH0sCi0gIHsgInIxMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTAgfSwKLSAgeyAicjExIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMSB9LAotICB7ICJyMTIiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEyIH0sCi0gIHsgInIxMyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTMgfSwKLSAgeyAicjE0IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNCB9LAotICB7ICJyMTUiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE1IH0sCi0gIHsgInIxNiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTYgfSwKLSAgeyAicjE3IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNyB9LAotICB7ICJyMTgiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE4IH0sCi0gIHsgInIxOSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTkgfSwKLSAgeyAicjIiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIgfSwKLSAgeyAicjIwIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMCB9LAotICB7ICJyMjEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIxIH0sCi0gIHsgInIyMiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjIgfSwKLSAgeyAicjIzIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMyB9LAotICB7ICJyMjQiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI0IH0sCi0gIHsgInIyNSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjUgfSwKLSAgeyAicjI2IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNiB9LAotICB7ICJyMjciLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI3IH0sCi0gIHsgInIyOCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjggfSwKLSAgeyAicjI5IiwJVElDODBfT1BFUkFORF9HUFIgfCAyOSB9LAotICB7ICJyMyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMyB9LAotICB7ICJyMzAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDMwIH0sCi0gIHsgInIzMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMzEgfSwKLSAgeyAicjQiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDQgfSwKLSAgeyAicjUiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDUgfSwKLSAgeyAicjYiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDYgfSwKLSAgeyAicjciLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDcgfSwKLSAgeyAicjgiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDggfSwKLSAgeyAicjkiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDkgfSwKLSAgeyAiU1lTU1RLIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAgfSwKLSAgeyAiU1lTVE1QIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjEgfSwKLSAgeyAiVENPVU5UIiwJVElDODBfT1BFUkFORF9DUiB8IDB4RSB9LAotICB7ICJUU0NBTEUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhGIH0sCi0gIHsgInVvLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAzMCB9LAotfTsKLQotY29uc3QgaW50IHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMgPSBzaXplb2YgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scykgLyBzaXplb2YgKHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lIGluIE5BTUUsIHN5bWJvbCBjbGFzcwotICAgaW4gQ0xBU1MsIGFuZCB0cmFuc2xhdGVzIGl0IHRvIGEgbnVtZXJpYyB2YWx1ZSwgd2hpY2ggaXQgcmV0dXJucy4KLQotICAgSWYgQ0xBU1MgaXMgemVybywgYW55IHN5bWJvbCB0aGF0IG1hdGNoZXMgTkFNRSBpcyB0cmFuc2xhdGVkLiAgSWYKLSAgIENMQVNTIGlzIG5vbi16ZXJvLCB0aGVuIG9ubHkgYSBzeW1ib2wgdGhhdCBoYXMgY2xhc3MgQ0xBU1MgaXMKLSAgIG1hdGNoZWQuCi0KLSAgIElmIG5vIHRyYW5zbGF0aW9uIGlzIHBvc3NpYmxlLCBpdCByZXR1cm5zIC0xLCBhIHZhbHVlIG5vdCB1c2VkIGJ5Ci0gICBhbnkgcHJlZGVmaW5lZCBzeW1ib2wuIE5vdGUgdGhhdCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgYXJyYXkgaXMKLSAgIHByZXNvcnRlZCBjYXNlIGluZGVwZW5kZW50bHkgYnkgbmFtZS4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlcmUgYXJlIG5vCi0gICBkdXBsaWNhdGUgbmFtZXMgaW4gdGhlIHByZWRlZmluZWQgc3ltYm9sIGFycmF5LCB3aGljaCBoYXBwZW5zIHRvIGJlCi0gICB0cnVlIGF0IHRoZSBtb21lbnQuCi0KLSAqLwotCi1pbnQKLXRpYzgwX3N5bWJvbF90b192YWx1ZSAobmFtZSwgY2xhc3MpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBjbGFzczsKLXsKLSAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotICBpbnQgbG93ID0gMDsKLSAgaW50IG1pZGRsZTsKLSAgaW50IGhpZ2ggPSB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzIC0gMTsKLSAgaW50IGNtcDsKLSAgaW50IHJ0bnZhbCA9IC0xOwotCi0gIHdoaWxlIChsb3cgPD0gaGlnaCkKLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQl7Ci0JICBoaWdoID0gbWlkZGxlIC0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCXsKLQkgIGxvdyA9IG1pZGRsZSArIDE7Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICBwZHNwID0gJnRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1ttaWRkbGVdOwotCSAgaWYgKChjbGFzcyA9PSAwKSB8fCAoY2xhc3MgJiBQRFNfVkFMVUUgKHBkc3ApKSkKLQkgICAgewotCSAgICAgIHJ0bnZhbCA9IFBEU19WQUxVRSAocGRzcCk7Ci0JICAgIH0KLQkgIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBuYW1lcyAqLwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChydG52YWwpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgdmFsdWUgVkFMIGFuZCBmaW5kcyBhIG1hdGNoaW5nIHByZWRlZmluZWQKLSAgIHN5bWJvbCB0aGF0IGlzIGluIHRoZSBvcGVyYW5kIGNsYXNzIHNwZWNpZmllZCBieSBDTEFTUy4gIElmIENMQVNTCi0gICBpcyB6ZXJvLCB0aGUgZmlyc3QgbWF0Y2hpbmcgc3ltYm9sIGlzIHJldHVybmVkLiAqLwotCi1jb25zdCBjaGFyICoKLXRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAodmFsLCBjbGFzcykKLSAgICAgaW50IHZhbDsKLSAgICAgaW50IGNsYXNzOwotewotICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7Ci0gIGludCBpdmFsOwotICBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBOVUxMOwotICBmb3IgKHBkc3AgPSB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHM7Ci0gICAgICAgcGRzcCA8IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyArIHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHM7Ci0gICAgICAgcGRzcCsrKQotICAgIHsKLSAgICAgIGl2YWwgPSBQRFNfVkFMVUUgKHBkc3ApICYgflRJQzgwX09QRVJBTkRfTUFTSzsKLSAgICAgIGlmIChpdmFsID09IHZhbCkKLQl7Ci0JICBpZiAoKGNsYXNzID09IDApIHx8IChjbGFzcyAmIFBEU19WQUxVRSAocGRzcCkpKQotCSAgICB7Ci0JICAgICAgLyogRm91bmQgdGhlIGRlc2lyZWQgbWF0Y2ggKi8KLQkgICAgICBuYW1lID0gUERTX05BTUUgKHBkc3ApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIChuYW1lKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzeW1ib2wgaW4gdGhlIHByZWRlZmluZWQKLSAgIHN5bWJvbCB0YWJsZSBhZnRlciBQRFNQLCBvciBOVUxMIGlmIFBEU1AgcG9pbnRzIHRvIHRoZSBsYXN0IHN5bWJvbC4gIElmCi0gICBQRFNQIGlzIE5VTEwsIGl0IHJldHVybnMgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgdGFibGUuICBUaHVzIGl0IGNhbiBiZQotICAgdXNlZCB0byB3YWxrIHRocm91Z2ggdGhlIHRhYmxlIGJ5IGZpcnN0IGNhbGxpbmcgaXQgd2l0aCBOVUxMIGFuZCB0aGVuCi0gICBjYWxsaW5nIGl0IHdpdGggZWFjaCB2YWx1ZSBpdCByZXR1cm5lZCBvbiB0aGUgcHJldmlvdXMgY2FsbCwgdW50aWwgaXQKLSAgIHJldHVybnMgTlVMTC4gKi8KLQotY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICoKLXRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgKHBkc3ApCi0gICAgIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKLXsKLSAgaWYgKHBkc3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwZHNwID0gdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzOwotICAgIH0KLSAgZWxzZSBpZiAocGRzcCA+PSB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMgJiYKLQkgICBwZHNwIDwgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzICsgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyAtIDEpCi0gICAgewotICAgICAgcGRzcCsrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBkc3AgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIChwZHNwKTsKLX0KLQotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUuICBUaGUgZmllbGRzIGFyZToKLQotCWJpdHMsIHNoaWZ0LCBpbnNlcnRpb24gZnVuY3Rpb24sIGV4dHJhY3Rpb24gZnVuY3Rpb24sIGZsYWdzCi0gKi8KLQotY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgdGljODBfb3BlcmFuZHNbXSA9Ci17Ci0KLSAgLyogVGhlIHplcm8gaW5kZXggaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIG9wZXJhbmRzLiAgKi8KLQotI2RlZmluZSBVTlVTRUQgKDApCi0gIHsgMCwgMCwgMCwgMCwgMCB9LAotCi0gIC8qIFNob3J0IHNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgaW4gYml0cyAxNC0wLiAqLwotCi0jZGVmaW5lIFNTSSAoVU5VU0VEICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBTaG9ydCB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgaW4gYml0cyAxNC0wICovCi0KLSNkZWZpbmUgU1VJIChTU0kgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLSAgLyogU2hvcnQgdW5zaWduZWQgYml0ZmllbGQgaW4gYml0cyAxNC0wLiAgV2UgZGlzdGluZ3Vpc2ggdGhpcwotICAgICBmcm9tIGEgcmVndWxhciB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgb25seSBmb3IgdGhlIGNvbnZlbmllbmNlCi0gICAgIG9mIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHRoZSB1c2VyLiAqLwotCi0jZGVmaW5lIFNVQkYgKFNVSSArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQklURklFTEQgfSwKLQotICAvKiBMb25nIHNpZ25lZCBpbW1lZGlhdGUgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgTFNJIChTVUJGICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBMb25nIHVuc2lnbmVkIGltbWVkaWF0ZSBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBMVUkgKExTSSArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIDAgfSwKLQotICAvKiBMb25nIHVuc2lnbmVkIGJpdGZpZWxkIGluIGZvbGxvd2luZyAzMiBiaXQgd29yZC4gIFdlIGRpc3Rpbmd1aXNoCi0gICAgIHRoaXMgZnJvbSBhIHJlZ3VsYXIgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlIG9ubHkgZm9yIHRoZQotICAgICBjb252ZW5pZW5jZSBvZiB0aGUgZGlzYXNzZW1ibGVyIGFuZCB0aGUgdXNlci4gKi8KLQotI2RlZmluZSBMVUJGIChMVUkgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JJVEZJRUxEIH0sCi0KLSAgLyogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgaW4gZm9sbG93aW5nIDMyIGJpdAotICAgICB3b3JkLiAqLwotCi0jZGVmaW5lIFNQRkkgKExVQkYgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0ZMT0FUIH0sCi0KLSAgLyogUmVnaXN0ZXIgaW4gYml0cyA0LTAgKi8KLQotI2RlZmluZSBSRUdfMCAoU1BGSSArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfSwKLQotICAvKiBFdmVuIHJlZ2lzdGVyIGluIGJpdHMgNC0wICovCi0KLSNkZWZpbmUgUkVHXzBfRSAoUkVHXzAgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9FVkVOIH0sCi0KLSAgLyogUmVnaXN0ZXIgaW4gYml0cyAyNi0yMiAqLwotCi0jZGVmaW5lIFJFR18yMiAoUkVHXzBfRSArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogRXZlbiByZWdpc3RlciBpbiBiaXRzIDI2LTIyICovCi0KLSNkZWZpbmUgUkVHXzIyX0UgKFJFR18yMiArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9FVkVOIH0sCi0KLSAgLyogUmVnaXN0ZXIgaW4gYml0cyAzMS0yNyAqLwotCi0jZGVmaW5lIFJFR19ERVNUIChSRUdfMjJfRSArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogRXZlbiByZWdpc3RlciBpbiBiaXRzIDMxLTI3ICovCi0KLSNkZWZpbmUgUkVHX0RFU1RfRSAoUkVHX0RFU1QgKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRVZFTiB9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IGFjY3VtdWxhdG9yIHJlZ2lzdGVyIChhMC1hMykgc3BlY2lmaWVkIGJ5IGJpdCAxNiAoTVNCKQotICAgICBhbmQgYml0IDExIChMU0IpICovCi0gIC8qIEZJWE1FISAgTmVlZHMgdG8gdXNlIGZ1bmN0aW9ucyB0byBpbnNlcnQgYW5kIGV4dHJhY3QgdGhlIHJlZ2lzdGVyCi0gICAgIG51bWJlciBpbiBiaXRzIDE2IGFuZCAxMS4gKi8KLQotI2RlZmluZSBSRUdfRlBBIChSRUdfREVTVF9FICsgMSkKLSAgeyAwLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0ZQQSB9LAotCi0gIC8qIFNob3J0IHNpZ25lZCBQQyB3b3JkIG9mZnNldCBpbiBiaXRzIDE0LTAgKi8KLQotI2RlZmluZSBPRkZfU1NfUEMgKFJFR19GUEEgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1BDUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBMb25nIHNpZ25lZCBQQyB3b3JkIG9mZnNldCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBPRkZfU0xfUEMgKE9GRl9TU19QQyArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfUENSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFNob3J0IHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGJpdHMgMTQtMCAqLwotCi0jZGVmaW5lIE9GRl9TU19CUiAoT0ZGX1NMX1BDICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CQVNFUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBMb25nIHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIE9GRl9TTF9CUiAoT0ZGX1NTX0JSICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CQVNFUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBMb25nIHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGZvbGxvd2luZyAzMiBiaXQgd29yZAotICAgICB3aXRoIG9wdGlvbmFsICI6cyIgbW9kaWZpZXIgZmxhZyBpbiBiaXQgMTEgKi8KLQotI2RlZmluZSBPRkZfU0xfQlJfU0NBTEVEIChPRkZfU0xfQlIgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JBU0VSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB8IFRJQzgwX09QRVJBTkRfU0NBTEVEIH0sCi0KLSAgLyogQklUTlVNIGluIGJpdHMgMzEtMjcgKi8KLQotI2RlZmluZSBCSVROVU0gKE9GRl9TTF9CUl9TQ0FMRUQgKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JJVE5VTSB9LAotCi0gIC8qIENvbmRpdGlvbiBjb2RlIGluIGJpdHMgMzEtMjcgKi8KLQotI2RlZmluZSBDQyAoQklUTlVNICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9DQyB9LAotCi0gIC8qIENvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyIGluIGJpdHMgMTQtMCAqLwotCi0jZGVmaW5lIENSX1NJIChDQyArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQ1IgfSwKLQotICAvKiBDb250cm9sIHJlZ2lzdGVyIG51bWJlciBpbiBuZXh0IDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgQ1JfTEkgKENSX1NJICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9DUiB9LAotCi0gIC8qIEEgYmFzZSByZWdpc3RlciBpbiBiaXRzIDI2LTIyLCBlbmNsb3NlZCBpbiBwYXJlbnMgKi8KLQotI2RlZmluZSBSRUdfQkFTRSAoQ1JfTEkgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIH0sCi0KLSAgLyogQSBiYXNlIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIsIGVuY2xvc2VkIGluIHBhcmVucywgd2l0aCBvcHRpb25hbCAiOm0iCi0gICAgIGZsYWcgaW4gYml0IDE3IChzaG9ydCBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zIG9ubHkpICovCi0KLSNkZWZpbmUgUkVHX0JBU0VfTV9TSSAoUkVHX0JBU0UgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIHwgVElDODBfT1BFUkFORF9NX1NJIH0sCi0KLSAgLyogQSBiYXNlIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIsIGVuY2xvc2VkIGluIHBhcmVucywgd2l0aCBvcHRpb25hbCAiOm0iCi0gICBmbGFnIGluIGJpdCAxNSAobG9uZyBpbW1lZGlhdGUgYW5kIHJlZ2lzdGVyIGluc3RydWN0aW9ucyBvbmx5KSAqLwotCi0jZGVmaW5lIFJFR19CQVNFX01fTEkgKFJFR19CQVNFX01fU0kgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIHwgVElDODBfT1BFUkFORF9NX0xJIH0sCi0KLSAgLyogU2NhbGVkIHJlZ2lzdGVyIGluIGJpdHMgNC0wLCB3aXRoIG9wdGlvbmFsICI6cyIgbW9kaWZpZXIgZmxhZyBpbiBiaXQgMTEgKi8KLQotI2RlZmluZSBSRUdfU0NBTEVEIChSRUdfQkFTRV9NX0xJICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfU0NBTEVEIH0sCi0KLSAgLyogVW5zaWduZWQgaW1tZWRpYXRlIGluIGJpdHMgNC0wLCB1c2VkIG9ubHkgZm9yIHNoaWZ0IGluc3RydWN0aW9ucyAqLwotCi0jZGVmaW5lIFJPVEFURSAoUkVHX1NDQUxFRCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgMCB9LAotCi0gIC8qIFVuc2lnbmVkIGltbWVkaWF0ZSBpbiBiaXRzIDktNSwgdXNlZCBvbmx5IGZvciBzaGlmdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgRU5ETUFTSyAoUk9UQVRFICsgMSkKLSAgeyA1LCA1LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0VORE1BU0sgfSwKLQotfTsKLQotY29uc3QgaW50IHRpYzgwX251bV9vcGVyYW5kcyA9IHNpemVvZiAodGljODBfb3BlcmFuZHMpL3NpemVvZigqdGljODBfb3BlcmFuZHMpOwotCi0MCi0vKiBNYWNyb3MgdXNlZCB0byBnZW5lcmF0ZSBlbnRyaWVzIGZvciB0aGUgb3Bjb2RlcyB0YWJsZS4gKi8KLQotI2RlZmluZSBGSVhNRSAwCi0KLS8qIFNob3J0LUltbWVkaWF0ZSBGb3JtYXQgSW5zdHJ1Y3Rpb25zIC0gYmFzaWMgb3Bjb2RlICovCi0jZGVmaW5lIE9QX1NJKHgpCSgoKHgpICYgMHg3RikgPDwgMTUpCi0jZGVmaW5lIE1BU0tfU0kJCU9QX1NJKDB4N0YpCi0KLS8qIExvbmctSW1tZWRpYXRlIEZvcm1hdCBJbnN0cnVjdGlvbnMgLSBiYXNpYyBvcGNvZGUgKi8KLSNkZWZpbmUgT1BfTEkoeCkJKCgoeCkgJiAweDNGRikgPDwgMTIpCi0jZGVmaW5lIE1BU0tfTEkJCU9QX0xJKDB4M0ZGKQotCi0vKiBSZWdpc3RlciBGb3JtYXQgSW5zdHJ1Y3Rpb25zIC0gYmFzaWMgb3Bjb2RlICovCi0jZGVmaW5lIE9QX1JFRyh4KQlPUF9MSSh4KQkvKiBGb3IgcmVhZGFiaWxpdHkgKi8KLSNkZWZpbmUgTUFTS19SRUcJTUFTS19MSQkJLyogRm9yIHJlYWRhYmlsaXR5ICovCi0KLS8qIFRoZSAnbicgYml0IGF0IGJpdCAxMCAqLwotI2RlZmluZSBuKHgpCQkoKHgpIDw8IDEwKQotCi0vKiBUaGUgJ2knIGJpdCBhdCBiaXQgMTEgKi8KLSNkZWZpbmUgaSh4KQkJKCh4KSA8PCAxMSkKLQotLyogVGhlICdGJyBiaXQgYXQgYml0IDI3ICovCi0jZGVmaW5lIEYoeCkJCSgoeCkgPDwgMjcpCi0KLS8qIFRoZSAnRScgYml0IGF0IGJpdCAyNyAqLwotI2RlZmluZSBFKHgpCQkoKHgpIDw8IDI3KQotCi0vKiBUaGUgJ00nIGJpdCBhdCBiaXQgMTUgaW4gcmVnaXN0ZXIgYW5kIGxvbmcgaW1tZWRpYXRlIG9wY29kZXMgKi8KLSNkZWZpbmUgTV9SRUcoeCkJKCh4KSA8PCAxNSkKLSNkZWZpbmUgTV9MSSh4KQkJKCh4KSA8PCAxNSkKLQotLyogVGhlICdNJyBiaXQgYXQgYml0IDE3IGluIHNob3J0IGltbWVkaWF0ZSBvcGNvZGVzICovCi0jZGVmaW5lIE1fU0koeCkJCSgoeCkgPDwgMTcpCi0KLS8qIFRoZSAnU1onIGZpZWxkIGF0IGJpdHMgMTQtMTMgaW4gcmVnaXN0ZXIgYW5kIGxvbmcgaW1tZWRpYXRlIG9wY29kZXMgKi8KLSNkZWZpbmUgU1pfUkVHKHgpCSgoeCkgPDwgMTMpCi0jZGVmaW5lIFNaX0xJKHgpCSgoeCkgPDwgMTMpCi0KLS8qIFRoZSAnU1onIGZpZWxkIGF0IGJpdHMgMTYtMTUgaW4gc2hvcnQgaW1tZWRpYXRlIG9wY29kZXMgKi8KLSNkZWZpbmUgU1pfU0koeCkJKCh4KSA8PCAxNSkKLQotLyogVGhlICdEJyAoZGlyZWN0IGV4dGVybmFsIG1lbW9yeSBhY2Nlc3MpIGJpdCBhdCBiaXQgMTAgaW4gbG9uZyBpbW1lZGlhdGUKLSAgIGFuZCByZWdpc3RlciBvcGNvZGVzLiAqLwotI2RlZmluZSBEKHgpCQkoKHgpIDw8IDEwKQotCi0vKiBUaGUgJ1MnIChzY2FsZSBvZmZzZXQgYnkgZGF0YSBzaXplKSBiaXQgYXQgYml0IDExIGluIGxvbmcgaW1tZWRpYXRlCi0gICBhbmQgcmVnaXN0ZXIgb3Bjb2Rlcy4gKi8KLSNkZWZpbmUgUyh4KQkJKCh4KSA8PCAxMSkKLQotLyogVGhlICdQRCcgZmllbGQgYXQgYml0cyAxMC05IGluIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBQRCh4KQkJKCh4KSA8PCA5KQotCi0vKiBUaGUgJ1AyJyBmaWVsZCBhdCBiaXRzIDgtNyBpbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgUDIoeCkJCSgoeCkgPDwgNykKLQotLyogVGhlICdQMScgZmllbGQgYXQgYml0cyA2LTUgaW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFAxKHgpCQkoKHgpIDw8IDUpCi0KLS8qIFRoZSAnYScgZmllbGQgYXQgYml0IDE2IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9hMSh4KQkJKCh4KSA8PCAxNikKLQotLyogVGhlICdhJyBmaWVsZCBhdCBiaXQgMTEgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX2EwKHgpCQkoKHgpIDw8IDExKQotCi0vKiBUaGUgJ20nIGZpZWxkIGF0IGJpdCAxMCBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfbSh4KQkJKCh4KSA8PCAxMCkKLQotLyogVGhlICdTJyBmaWVsZCBhdCBiaXQgOSBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfUyh4KQkJKCh4KSA8PCA5KQotCi0vKiBUaGUgJ1onIGZpZWxkIGF0IGJpdCA4IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9aKHgpCQkoKHgpIDw8IDgpCi0KLS8qIFRoZSAncCcgZmllbGQgYXQgYml0IDYgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX3AoeCkJCSgoeCkgPDwgNikKLQotLyogVGhlIG9wY29kZSBmaWVsZCBhdCBiaXRzIDIxLTE3IGZvciB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIE9QX1YoeCkJCSgoeCkgPDwgMTcpCi0jZGVmaW5lIE1BU0tfVgkJT1BfVigweDFGKQotCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLiAgRm9ybWF0dGVkIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgb24gYSB3aWRlIHNjcmVlbi4gIEFsc28sIGFsbAotIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBtbmVtb25pYyBhcmUgc29ydGVkIHNvIHRoYXQgdGhleSBhcmUgYWRqYWNlbnQgaW4gdGhlIHRhYmxlLAotIGFsbG93aW5nIHRoZSB1c2Ugb2YgYSBoYXNoIHRhYmxlIHRvIGxvY2F0ZSB0aGUgZmlyc3Qgb2YgYSBzZXF1ZW5jZSBvZiBvcGNvZGVzIHRoYXQgaGF2ZQotIGEgcGFydGljdWxhciBuYW1lLiAgVGhlIHNob3J0IGltbWVkaWF0ZSBmb3JtcyBhbHNvIGNvbWUgYmVmb3JlIHRoZSBsb25nIGltbWVkaWF0ZSBmb3JtcwotIHNvIHRoYXQgdGhlIGFzc2VtYmxlciB3aWxsIHBpY2sgdGhlICJiZXN0IGZpdCIgZm9yIHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kLCBleGNlcHQgZm9yCi0gdGhlIGNhc2Ugb2YgdGhlIFBDIHJlbGF0aXZlIGZvcm1zLCB3aGVyZSB0aGUgbG9uZyBmb3JtcyBjb21lIGZpcnN0IGFuZCBhcmUgdGhlIGRlZmF1bHQKLSBmb3Jtcy4gKi8KLQotY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSB0aWM4MF9vcGNvZGVzW10gPSB7Ci0KLSAgLyogVGhlICJub3AiIGluc3RydWN0aW9uIGlzIHJlYWxseSAicmRjciAwLHIwIi4gIFdlIHB1dCBpdCBmaXJzdCBzbyB0aGF0IHRoaXMKLSAgICAgc3BlY2lmaWMgYml0IHBhdHRlcm4gd2lsbCBnZXQgZGlzYXNzZW1ibGVkIGFzIGEgbm9wIHJhdGhlciB0aGFuIGFuIHJkY3IuIFRoZQotICAgICBtYXNrIG9mIGFsbCBvbmVzIGVuc3VyZXMgdGhhdCB0aGlzIHdpbGwgaGFwcGVuLiAqLwotCi0gIHsibm9wIiwJT1BfU0koMHg0KSwJfjAsCQkwLAkJezB9CQkJfSwKLQotICAvKiBUaGUgImJyIiBpbnN0cnVjdGlvbiBpcyByZWFsbHkgImJieiB0YXJnZXQscjAsMzEiLiAgV2UgcHV0IGl0IGZpcnN0IHNvIHRoYXQKLSAgICAgdGhpcyBzcGVjaWZpYyBiaXQgcGF0dGVybiB3aWxsIGdldCBkaXNhc3NlbWJsZWQgYXMgYSBiciByYXRoZXIgdGhhbiBiYnouICovCi0KLSAgeyJiciIsCU9QX1NJKDB4NDgpLAkweEZGRkY4MDAwLAkwLAl7T0ZGX1NTX1BDfQl9LAotICB7ImJyIiwJT1BfTEkoMHgzOTEpLAkweEZGRkZGMDAwLAkwLAl7T0ZGX1NMX1BDfQl9LAotICB7ImJyIiwJT1BfUkVHKDB4MzkwKSwJMHhGRkZGRjAwMCwJMCwJe1JFR18wfQkJfSwKLSAgeyJici5hIiwJT1BfU0koMHg0OSksCTB4RkZGRjgwMDAsCTAsCXtPRkZfU1NfUEN9CX0sCi0gIHsiYnIuYSIsCU9QX0xJKDB4MzkzKSwJMHhGRkZGRjAwMCwJMCwJe09GRl9TTF9QQ30JfSwKLSAgeyJici5hIiwJT1BfUkVHKDB4MzkyKSwJMHhGRkZGRjAwMCwJMCwJe1JFR18wfQkJfSwKLQotICAvKiBTaWduZWQgaW50ZWdlciBBREQgKi8KLQotICB7ImFkZCIsCU9QX1NJKDB4NTgpLAlNQVNLX1NJLAkwLAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJhZGQiLAlPUF9MSSgweDNCMSksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImFkZCIsCU9QX1JFRygweDNCMCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogVW5zaWduZWQgaW50ZWdlciBBREQgKi8KLQotICB7ImFkZHUiLAlPUF9TSSgweDU5KSwJTUFTS19TSSwJMCwJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiYWRkdSIsCU9QX0xJKDB4M0IzKSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiYWRkdSIsCU9QX1JFRygweDNCMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBBTkQgKi8KLQotICB7ImFuZCIsCU9QX1NJKDB4MTEpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQiLAlPUF9MSSgweDMyMyksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZCIsCU9QX1JFRygweDMyMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnR0IiwJT1BfU0koMHgxMSksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50dCIsCU9QX0xJKDB4MzIzKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnR0IiwJT1BfUkVHKDB4MzIyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIEFORCB3aXRoIG9uZXMgY29tcGxlbWVudCBvZiBib3RoIHNvdXJjZXMgKi8KLQotICB7ImFuZC5mZiIsCU9QX1NJKDB4MTgpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQuZmYiLAlPUF9MSSgweDMzMSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC5mZiIsCU9QX1JFRygweDMzMCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBBTkQgd2l0aCBvbmVzIGNvbXBsZW1lbnQgb2Ygc291cmNlIDEgKi8KLQotICB7ImFuZC5mdCIsCU9QX1NJKDB4MTQpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQuZnQiLAlPUF9MSSgweDMyOSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC5mdCIsCU9QX1JFRygweDMyOCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBBTkQgd2l0aCBvbmVzIGNvbXBsZW1lbnQgb2Ygc291cmNlIDIgKi8KLQotICB7ImFuZC50ZiIsCU9QX1NJKDB4MTIpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudGYiLAlPUF9MSSgweDMyNSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50ZiIsCU9QX1JFRygweDMyNCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQnJhbmNoIEJpdCBPbmUgLSBub25hbm51bGxlZCAqLwotCi0gIHsiYmJvIiwJT1BfU0koMHg0QSksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYm8iLAlPUF9MSSgweDM5NSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYm8iLAlPUF9SRUcoMHgzOTQpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCi0KLSAgLyogQnJhbmNoIEJpdCBPbmUgLSBhbm51bGxlZCAqLwotCi0gIHsiYmJvLmEiLAlPUF9TSSgweDRCKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJiby5hIiwJT1BfTEkoMHgzOTcpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJvLmEiLAlPUF9SRUcoMHgzOTYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCi0KLSAgLyogQnJhbmNoIEJpdCBaZXJvIC0gbm9uYW5udWxsZWQgKi8KLQotICB7ImJieiIsCU9QX1NJKDB4NDgpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJ6IiwJT1BfTEkoMHgzOTEpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJ6IiwJT1BfUkVHKDB4MzkwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAotCi0gIC8qIEJyYW5jaCBCaXQgWmVybyAtIGFubnVsbGVkICovCi0KLSAgeyJiYnouYSIsCU9QX1NJKDB4NDkpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJ6LmEiLAlPUF9MSSgweDM5MyksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYnouYSIsCU9QX1JFRygweDM5MiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKLQotICAvKiBCcmFuY2ggQ29uZGl0aW9uYWwgLSBub25hbm51bGxlZCAqLwotCi0gIHsiYmNuZCIsCU9QX1NJKDB4NEMpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBDQ30JfSwKLSAgeyJiY25kIiwJT1BfTEkoMHgzOTkpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBDQ30JfSwKLSAgeyJiY25kIiwJT1BfUkVHKDB4Mzk4KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBDQ30JfSwKLQotICAvKiBCcmFuY2ggQ29uZGl0aW9uYWwgLSBhbm51bGxlZCAqLwotCi0gIHsiYmNuZC5hIiwJT1BfU0koMHg0RCksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIENDfQl9LAotICB7ImJjbmQuYSIsCU9QX0xJKDB4MzlCKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQ0N9CX0sCi0gIHsiYmNuZC5hIiwJT1BfUkVHKDB4MzlBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBDQ30JfSwKLQotICAvKiBCcmFuY2ggQ29udHJvbCBSZWdpc3RlciAqLwotCi0gIHsiYnJjciIsCU9QX1NJKDB4NiksCU1BU0tfU0ksCTAsCXtDUl9TSX0JfSwKLSAgeyJicmNyIiwJT1BfTEkoMHgzMEQpLAlNQVNLX0xJLAkwLAl7Q1JfTEl9CX0sCi0gIHsiYnJjciIsCU9QX1JFRygweDMwQyksCU1BU0tfUkVHLAkwLAl7UkVHXzB9CX0sCi0KLSAgLyogQnJhbmNoIGFuZCBzYXZlIHJldHVybiAtIG5vbmFubnVsbGVkICovCi0KLSAgeyJic3IiLAlPUF9TSSgweDQwKSwJTUFTS19TSSwJMCwJe09GRl9TU19QQywgUkVHX0RFU1R9CX0sCi0gIHsiYnNyIiwJT1BfTEkoMHgzODEpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHX0RFU1R9CX0sCi0gIHsiYnNyIiwJT1BfUkVHKDB4MzgwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQnJhbmNoIGFuZCBzYXZlIHJldHVybiAtIGFubnVsbGVkICovCi0KLSAgeyJic3IuYSIsCU9QX1NJKDB4NDEpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHX0RFU1R9CX0sCi0gIHsiYnNyLmEiLAlPUF9MSSgweDM4MyksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfREVTVH0JfSwKLSAgeyJic3IuYSIsCU9QX1JFRygweDM4MiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNlbmQgY29tbWFuZCAqLwotCi0gIHsiY21uZCIsCU9QX1NJKDB4MiksCU1BU0tfU0ksCTAsIAl7U1VJfQl9LAotICB7ImNtbmQiLAlPUF9MSSgweDMwNSksCU1BU0tfTEksCTAsIAl7TFVJfQl9LAotICB7ImNtbmQiLAlPUF9SRUcoMHgzMDQpLAlNQVNLX1JFRywJMCwJe1JFR18wfQl9LAotCi0gIC8qIEludGVnZXIgY29tcGFyZSAqLwotCi0gIHsiY21wIiwJT1BfU0koMHg1MCksCU1BU0tfU0ksCTAsIAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJjbXAiLAlPUF9MSSgweDNBMSksCU1BU0tfTEksCTAsIAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJjbXAiLAlPUF9SRUcoMHgzQTApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsdXNoIGRhdGEgY2FjaGUgc3ViYmxvY2sgLSBkb24ndCBjbGVhciBzdWJibG9jayBwcmVzZXQgZmxhZyAqLwotCi0gIHsiZGNhY2hlYyIsCU9QX1NJKDB4MzgpLAlGKDEpIHwgKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJCTAsIHtTU0ksIFJFR19CQVNFX01fU0l9CQl9LAotICB7ImRjYWNoZWMiLAlPUF9MSSgweDM3MSksCUYoMSkgfCAoTUFTS19MSSAgJiB+TV9MSSgxKSkgIHwgUygxKSB8IEQoMSksCTAsIHtMU0ksIFJFR19CQVNFX01fTEl9CQl9LAotICB7ImRjYWNoZWMiLAlPUF9SRUcoMHgzNzApLAlGKDEpIHwgKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IFMoMSkgfCBEKDEpLAkwLCB7UkVHXzAsIFJFR19CQVNFX01fTEl9CX0sCi0KLSAgLyogRmx1c2ggZGF0YSBjYWNoZSBzdWJibG9jayAtIGNsZWFyIHN1YmJsb2NrIHByZXNldCBmbGFnICovCi0KLSAgeyJkY2FjaGVmIiwJT1BfU0koMHgzOCkgICB8IEYoMSksCUYoMSkgfCAoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkJMCwge1NTSSwgUkVHX0JBU0VfTV9TSX0JCX0sCi0gIHsiZGNhY2hlZiIsCU9QX0xJKDB4MzcxKSAgfCBGKDEpLAlGKDEpIHwgKE1BU0tfTEkgICYgfk1fTEkoMSkpICAgfCBTKDEpIHwgRCgxKSwJMCwge0xTSSwgUkVHX0JBU0VfTV9MSX0JCX0sCi0gIHsiZGNhY2hlZiIsCU9QX1JFRygweDM3MCkgfCBGKDEpLAlGKDEpIHwgKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IFMoMSkgfCBEKDEpLAkwLCB7UkVHXzAsIFJFR19CQVNFX01fTEl9CX0sCi0KLSAgLyogRGlyZWN0IGxvYWQgc2lnbmVkIGRhdGEgaW50byByZWdpc3RlciAqLwotCi0gIHsiZGxkIiwJT1BfTEkoMHgzNDUpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkIiwJT1BfUkVHKDB4MzQ0KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRsZC5iIiwJT1BfTEkoMHgzNDEpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkLmIiLAlPUF9SRUcoMHgzNDApIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZGxkLmQiLAlPUF9MSSgweDM0NykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAotICB7ImRsZC5kIiwJT1BfUkVHKDB4MzQ2KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsiZGxkLmgiLAlPUF9MSSgweDM0MykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQuaCIsCU9QX1JFRygweDM0MikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBEaXJlY3QgbG9hZCB1bnNpZ25lZCBkYXRhIGludG8gcmVnaXN0ZXIgKi8KLQotICB7ImRsZC51YiIsCU9QX0xJKDB4MzUxKSAgfCBEKDEpLAkoTUFTS19MSSAgJiAgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQudWIiLAlPUF9SRUcoMHgzNTApIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSAgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRsZC51aCIsCU9QX0xJKDB4MzUzKSAgfCBEKDEpLAkoTUFTS19MSSAgJiAgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQudWgiLAlPUF9SRUcoMHgzNTIpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSAgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIERpcmVjdCBzdG9yZSBkYXRhIGludG8gbWVtb3J5ICovCi0KLSAgeyJkc3QiLAlPUF9MSSgweDM2NSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkc3QiLAlPUF9SRUcoMHgzNjQpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZHN0LmIiLAlPUF9MSSgweDM2MSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkc3QuYiIsCU9QX1JFRygweDM2MCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkc3QuZCIsCU9QX0xJKDB4MzY3KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCi0gIHsiZHN0LmQiLAlPUF9SRUcoMHgzNjYpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJkc3QuaCIsCU9QX0xJKDB4MzYzKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRzdC5oIiwJT1BfUkVHKDB4MzYyKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIEVtdWxhdGlvbiBzdG9wICovCi0KLSAgeyJlc3RvcCIsCU9QX0xJKDB4M0ZDKSwJTUFTS19MSSwJMCwJCXswfQl9LAotCi0gIC8qIEVtdWxhdGlvbiB0cmFwICovCi0KLSAgeyJldHJhcCIsCU9QX1NJKDB4MSkgICAgfCBFKDEpLAlNQVNLX1NJICB8IEUoMSksCTAsCXtTVUl9CX0sCi0gIHsiZXRyYXAiLAlPUF9MSSgweDMwMykgIHwgRSgxKSwJTUFTS19MSSAgfCBFKDEpLAkwLAl7TFVJfQl9LAotICB7ImV0cmFwIiwJT1BfUkVHKDB4MzAyKSB8IEUoMSksCU1BU0tfUkVHIHwgRSgxKSwJMCwJe1JFR18wfQl9LAotCi0gIC8qIEZsb2F0aW5nLXBvaW50IGFkZGl0aW9uICovCi0KLSAgeyJmYWRkLmRkZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuZHNkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc2RkIiwJT1BfTEkoMHgzRTEpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zZGQiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zc2QiLAlPUF9MSSgweDNFMSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zc2QiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc3NzIiwJT1BfTEkoMHgzRTEpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmYWRkLnNzcyIsCU9QX1JFRygweDNFMCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IGNvbXBhcmUgKi8KLQotICB7ImZjbXAuZGQiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuZHMiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLnNkIiwJT1BfTEkoMHgzRUIpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLnNkIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5zcyIsCU9QX0xJKDB4M0VCKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuc3MiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgZGl2aWRlICovCi0KLSAgeyJmZGl2LmRkZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuZHNkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc2RkIiwJT1BfTEkoMHgzRTcpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zZGQiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zc2QiLAlPUF9MSSgweDNFNykgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zc2QiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc3NzIiwJT1BfTEkoMHgzRTcpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmZGl2LnNzcyIsCU9QX1JFRygweDNFNikgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IG11bHRpcGx5ICovCi0KLSAgeyJmbXB5LmRkZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuZHNkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuaWlpIiwJT1BfTEkoMHgzRTUpICB8IFBEKDIpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkuaWlpIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDIpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS5zZGQiLAlPUF9MSSgweDNFNSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LnNkZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LnNzZCIsCU9QX0xJKDB4M0U1KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LnNzZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5zc3MiLAlPUF9MSSgweDNFNSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkuc3NzIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS51dXUiLAlPUF9MSSgweDNFNSkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMVUksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS51dXUiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBDb252ZXJ0L1JvdW5kIHRvIE1pbnVzIEluZmluaXR5ICovCi0KLSAgeyJmcm5kbS5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0udWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0udWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0udXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQ29udmVydC9Sb3VuZCB0byBOZWFyZXN0ICovCi0KLSAgeyJmcm5kbi5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4udWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4udWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4udXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQ29udmVydC9Sb3VuZCB0byBQb3NpdGl2ZSBJbmZpbml0eSAqLwotCi0gIHsiZnJuZHAuZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAudXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIENvbnZlcnQvUm91bmQgdG8gWmVybyAqLwotCi0gIHsiZnJuZHouZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHoudXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IHNxdWFyZSByb290ICovCi0KLSAgeyJmc3FydC5kZCIsCU9QX1JFRygweDNFRSkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnNxcnQuc2QiLAlPUF9MSSgweDNFRikgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZzcXJ0LnNkIiwJT1BfUkVHKDB4M0VFKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnNxcnQuc3MiLAlPUF9MSSgweDNFRikgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmc3FydC5zcyIsCU9QX1JFRygweDNFRSkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBzdWJ0cmFjdGlvbiAqLwotCi0gIHsgImZzdWIuZGRkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuZHNkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNkZCIsCU9QX0xJKDB4M0UzKSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNkZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zc2QiLAlPUF9MSSgweDNFMykgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc3NkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zc3MiLAlPUF9MSSgweDNFMykgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ICJmc3ViLnNzcyIsCU9QX1JFRygweDNFMikgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIElsbGVnYWwgaW5zdHJ1Y3Rpb25zICovCi0KLSAgeyJpbGxvcDAiLAlPUF9TSSgweDApLAlNQVNLX1NJLAkwLAl7MH0JfSwKLSAgeyJpbGxvcEYiLAkweDFGRiA8PCAxMywJMHgxRkYgPDwgMTMsCTAsCXswfQl9LAotCi0gIC8qIEp1bXAgYW5kIHNhdmUgcmV0dXJuICovCi0KLSAgeyJqc3IiLAlPUF9TSSgweDQ0KSwJTUFTS19TSSwJMCwJe09GRl9TU19CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7ImpzciIsCU9QX0xJKDB4Mzg5KSwJTUFTS19MSSwJMCwJe09GRl9TTF9CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7ImpzciIsCU9QX1JFRygweDM4OCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IuYSIsCU9QX1NJKDB4NDUpLAlNQVNLX1NJLAkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyLmEiLAlPUF9MSSgweDM4QiksCU1BU0tfTEksCTAsCXtPRkZfU0xfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IuYSIsCU9QX1JFRygweDM4QSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLQotICAvKiBMb2FkIFNpZ25lZCBEYXRhIEludG8gUmVnaXN0ZXIgKi8KLQotICB7ImxkIiwJT1BfU0koMHgyMiksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQiLAlPUF9MSSgweDM0NSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZCIsCU9QX1JFRygweDM0NCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC5iIiwJT1BfU0koMHgyMCksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQuYiIsCU9QX0xJKDB4MzQxKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkLmIiLAlPUF9SRUcoMHgzNDApIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQuZCIsCU9QX1NJKDB4MjMpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsibGQuZCIsCU9QX0xJKDB4MzQ3KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCi0gIHsibGQuZCIsCU9QX1JFRygweDM0NikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAotICB7ImxkLmgiLAlPUF9TSSgweDIxKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC5oIiwJT1BfTEkoMHgzNDMpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQuaCIsCU9QX1JFRygweDM0MikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBMb2FkIFVuc2lnbmVkIERhdGEgSW50byBSZWdpc3RlciAqLwotCi0gIHsibGQudWIiLAlPUF9TSSgweDI4KSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC51YiIsCU9QX0xJKDB4MzUxKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkLnViIiwJT1BfUkVHKDB4MzUwKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLnVoIiwJT1BfU0koMHgyOSksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQudWgiLAlPUF9MSSgweDM1MykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZC51aCIsCU9QX1JFRygweDM1MikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBMZWZ0bW9zdCBvbmUgKi8KLQotICB7ImxtbyIsCU9QX0xJKDB4M0YwKSwJTUFTS19MSSwJMCwJe1JFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBsb2dpY2FsIE9SLiAgTm90ZSB0aGF0ICJvci50dCIgYW5kICJvciIgYXJlIHRoZSBzYW1lIGluc3RydWN0aW9ucy4gKi8KLQotICB7Im9yLmZmIiwJT1BfU0koMHgxRSksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLmZmIiwJT1BfTEkoMHgzM0QpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci5mZiIsCU9QX1JFRygweDMzQyksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsib3IuZnQiLAlPUF9TSSgweDFEKSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IuZnQiLAlPUF9MSSgweDMzQiksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLmZ0IiwJT1BfUkVHKDB4MzNBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJvci50ZiIsCU9QX1NJKDB4MUIpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci50ZiIsCU9QX0xJKDB4MzM3KSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IudGYiLAlPUF9SRUcoMHgzMzYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7Im9yLnR0IiwJT1BfU0koMHgxNyksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLnR0IiwJT1BfTEkoMHgzMkYpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci50dCIsCU9QX1JFRygweDMyRSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsib3IiLAlPUF9TSSgweDE3KSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IiLAlPUF9MSSgweDMyRiksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yIiwJT1BfUkVHKDB4MzJFKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBSZWFkIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotICB7InJkY3IiLAlPUF9TSSgweDQpLAlNQVNLX1NJICB8ICgweDFGIDw8IDIyKSwJMCwJe0NSX1NJLCBSRUdfREVTVH0JfSwKLSAgeyJyZGNyIiwJT1BfTEkoMHgzMDkpLAlNQVNLX0xJICB8ICgweDFGIDw8IDIyKSwJMCwJe0NSX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJyZGNyIiwJT1BfUkVHKDB4MzA4KSwJTUFTS19SRUcgfCAoMHgxRiA8PCAyMiksCTAsCXtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogUmlnaHRtb3N0IG9uZSAqLwotCi0gIHsicm1vIiwJT1BfTEkoMHgzRjIpLAlNQVNLX0xJLAkwLAkJe1JFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2hpZnQgUmVnaXN0ZXIgTGVmdCAtIG5vdGUgdGhhdCByb3RsLCBzaGwsIGFuZCBpbnMgYXJlIGFsbCBhbHRlcm5hdGUgbmFtZXMgZm9yIG9uZSBvZiB0aGUgc2hpZnQgaW5zdHJ1Y3Rpb25zLgotICAgICBUaGV5IGFwcGVhciBwcmlvciB0byB0aGVpciBzbCBlcXVpdmFsZW50IHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpYXNzZW1ibGVkIGFzIHRoZSBhbHRlcm5hdGUgbmFtZS4gKi8KLQotCi0gIHsiaW5zIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiaW5zIiwJT1BfU0koMHhGKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InJvdGwiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJyb3RsIiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNobCIsCU9QX1JFRygweDMxQykgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzaGwiLAlPUF9TSSgweEUpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5peiIsCU9QX1JFRygweDMxQykgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2hpZnQgUmVnaXN0ZXIgTGVmdCBXaXRoIEludmVydGVkIEVuZG1hc2sgKi8KLQotICB7InNsaS5kbSIsCU9QX1JFRygweDMxMikgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTaGlmdCBSZWdpc3RlciBSaWdodCAtIG5vdGUgdGhhdCBleHRzLCBleHR1LCByb3RyLCBzcmEsIGFuZCBzcmwgYXJlIGFsbCBhbHRlcm5hdGUgbmFtZXMgZm9yIG9uZSBvZiB0aGUgc2hpZnQgaW5zdHJ1Y3Rpb25zLgotICAgICBUaGV5IGFwcGVhciBwcmlvciB0byB0aGVpciBzciBlcXVpdmFsZW50IHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpYXNzZW1ibGVkIGFzIHRoZSBhbHRlcm5hdGUgbmFtZS4gKi8KLQotICB7ImV4dHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJleHRzIiwJT1BfU0koMHhBKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJleHR1IiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZXh0dSIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsicm90ciIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InJvdHIiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JhIiwJT1BfUkVHKDB4MzFBKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JhIiwJT1BfU0koMHhEKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmwiLAlPUF9SRUcoMHgzMTYpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmwiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNoaWZ0IFJlZ2lzdGVyIFJpZ2h0IFdpdGggSW52ZXJ0ZWQgRW5kbWFzayAqLwotCi0gIHsic3JpLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5keiIsCU9QX1JFRygweDMxMCkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5leiIsCU9QX1JFRygweDMxNikgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5leiIsCU9QX1NJKDB4QikgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFN0b3JlIERhdGEgaW50byBNZW1vcnkgKi8KLQotICB7InN0IiwJT1BfU0koMHgzMiksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7InN0IiwJT1BfTEkoMHgzNjUpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsic3QiLAlPUF9SRUcoMHgzNjQpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QuYiIsCU9QX1NJKDB4MzApLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJzdC5iIiwJT1BfTEkoMHgzNjEpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsic3QuYiIsCU9QX1JFRygweDM2MCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJzdC5kIiwJT1BfU0koMHgzMyksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsic3QuZCIsCU9QX0xJKDB4MzY3KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCi0gIHsic3QuZCIsCU9QX1JFRygweDM2NikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAotICB7InN0LmgiLAlPUF9TSSgweDMxKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QuaCIsCU9QX0xJKDB4MzYzKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7InN0LmgiLAlPUF9SRUcoMHgzNjIpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogU2lnbmVkIEludGVnZXIgU3VidHJhY3QgKi8KLQotICB7InN1YiIsCU9QX1NJKDB4NUEpLAlNQVNLX1NJLAkwLCAJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsic3ViIiwJT1BfTEkoMHgzQjUpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJzdWIiLAlPUF9SRUcoMHgzQjQpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFVuc2lnbmVkIEludGVnZXIgU3VidHJhY3QgKi8KLQotICB7InN1YnUiLAlPUF9TSSgweDVCKSwJTUFTS19TSSwJMCwgCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7InN1YnUiLAlPUF9MSSgweDNCNyksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7InN1YnUiLAlPUF9SRUcoMHgzQjYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFdyaXRlIENvbnRyb2wgUmVnaXN0ZXIKLSAgICAgSXMgYSBzcGVjaWFsIGZvcm0gb2YgdGhlICJzd2NyIiBpbnN0cnVjdGlvbiBzbyBjb21lcyBiZWZvcmUgaXQgaW4gdGhlIHRhYmxlLiAqLwotCi0gIHsid3JjciIsCU9QX1NJKDB4NSksCU1BU0tfU0kgfCAoMHgxRiA8PCAyNyksCQkwLAl7Q1JfU0ksIFJFR18yMn0JfSwKLSAgeyJ3cmNyIiwJT1BfTEkoMHgzMEIpLAlNQVNLX0xJIHwgKDB4MUYgPDwgMjcpLAkJMCwJe0NSX0xJLCBSRUdfMjJ9CX0sCi0gIHsid3JjciIsCU9QX1JFRygweDMwQSksCU1BU0tfUkVHIHwgKDB4MUYgPDwgMjcpLAkwLAl7UkVHXzAsIFJFR18yMn0JfSwKLQotICAvKiBTd2FwIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotICB7InN3Y3IiLAlPUF9TSSgweDUpLAlNQVNLX1NJLAkwLAl7Q1JfU0ksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3djciIsCU9QX0xJKDB4MzBCKSwJTUFTS19MSSwJMCwJe0NSX0xJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InN3Y3IiLAlPUF9SRUcoMHgzMEEpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFRyYXAgKi8KLQotICB7InRyYXAiLAlPUF9TSSgweDEpICAgIHwgRSgwKSwJTUFTS19TSSAgfCBFKDEpLAkwLAl7U1VJfQl9LAotICB7InRyYXAiLAlPUF9MSSgweDMwMykgIHwgRSgwKSwJTUFTS19MSSAgfCBFKDEpLAkwLAl7TFVJfQl9LAotICB7InRyYXAiLAlPUF9SRUcoMHgzMDIpIHwgRSgwKSwJTUFTS19SRUcgfCBFKDEpLAkwLAl7UkVHXzB9CX0sCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IEFkZCAqLwotCi0gIHsidmFkZC5kZCIsCU9QX1JFRygweDNDMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidmFkZC5zZCIsCU9QX0xJKDB4M0MxKSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidmFkZC5zZCIsCU9QX1JFRygweDNDMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZhZGQuc3MiLAlPUF9MSSgweDNDMSkgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0gIHsidmFkZC5zcyIsCU9QX1JFRygweDNDMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IE11bHRpcGx5IGFuZCBBZGQgdG8gQWNjdW11bGF0b3IgRklYTUUhIFRoaXMgaXMgbm90IHlldCBmdWxseSBpbXBsZW1lbnRlZC4KLSAgIEZyb20gdGhlIGRvY3VtZW50YXRpb24gdGhlcmUgYXBwZWFycyB0byBiZSBubyB3YXkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvcGNvZGVzIGZvcgotICAgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSByZWdpc3RlciBkZXN0aW5hdGlvbnMgYW5kIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYWNjdW11bGF0b3IgZGVzdGluYXRpb25zLgotICAgRnVydGhlciBpbnZlc3RpZ2F0aW9uIGlzIG5lY2Vzc2FyeS4gIFNpbmNlIHRoaXMgaXNuJ3QgY3JpdGljYWwgdG8gZ2V0dGluZyBhIFRJQzgwIHRvb2xjaGFpbiB1cAotICAgYW5kIHJ1bm5pbmcsIGl0IGlzIGRlZmVyZWQgdW50aWwgbGF0ZXIuICovCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IE11bHRpcGx5Ci0gICBOb3RlOiBJZiByMCBpcyBpbiB0aGUgZGVzdGluYXRpb24gcmVnLCB0aGVuIHRoaXMgaXMgYSAidmVjdG9yIG5vcCIgaW5zdHJ1Y3Rpb24uICovCi0KLSAgeyJ2bXB5LmRkIiwJT1BfUkVHKDB4M0M0KSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHXzIyX0V9IH0sCi0gIHsidm1weS5zZCIsCU9QX0xJKDB4M0M1KSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7U1BGSSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZtcHkuc2QiLAlPUF9SRUcoMHgzQzQpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1JFR18wLCBSRUdfMjJfRSwgUkVHXzIyX0V9IH0sCi0gIHsidm1weS5zcyIsCU9QX0xJKDB4M0M1KSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7U1BGSSwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0gIHsidm1weS5zcyIsCU9QX1JFRygweDNDNCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7UkVHXzAsIFJFR18yMiwgUkVHXzIyfSB9LAotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBNdWx0aXBseSBhbmQgU3VidHJhY3QgZnJvbSBBY2N1bXVsYXRvcgotICAgICBGSVhNRTogU2VlIG5vdGUgYWJvdmUgZm9yIHZtYWMgaW5zdHJ1Y3Rpb24gKi8KLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgU3VidHJhY3QgQWNjdW11bGF0b3IgRnJvbSBTb3VyY2UKLSAgICAgRklYTUU6IFNlZSBub3RlIGFib3ZlIGZvciB2bWFjIGluc3RydWN0aW9uICovCi0KLSAgLyogVmVjdG9yIFJvdW5kIFdpdGggRmxvYXRpbmctUG9pbnQgSW5wdXQKLSAgICAgRklYTUU6IFNlZSBub3RlIGFib3ZlIGZvciB2bWFjIGluc3RydWN0aW9uICovCi0KLSAgLyogVmVjdG9yIFJvdW5kIHdpdGggSW50ZWdlciBJbnB1dCAqLwotCi0gIHsidnJuZC5pZCIsCU9QX0xJICgweDNDQikgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFNJLCBSRUdfMjJfRX19LAotICB7InZybmQuaWQiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJfRX19LAotICB7InZybmQuaXMiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xTSSwgUkVHXzIyfX0sCi0gIHsidnJuZC5pcyIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMn19LAotICB7InZybmQudWQiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDEpIHwgUDEoMSksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xVSSwgUkVHXzIyX0V9fSwKLSAgeyJ2cm5kLnVkIiwJT1BfUkVHICgweDNDQSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyX0V9fSwKLSAgeyJ2cm5kLnVzIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigwKSB8IFAxKDEpLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMVUksIFJFR18yMn19LAotICB7InZybmQudXMiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJ9fSwKLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgU3VidHJhY3QgKi8KLQotICB7InZzdWIuZGQiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZzdWIuc2QiLAlPUF9MSSgweDNDMykgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZzdWIuc2QiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2c3ViLnNzIiwJT1BfTEkoMHgzQzMpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMiwgUkVHXzIyfQl9LAotICB7InZzdWIuc3MiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMiwgUkVHXzIyfQl9LAotCi0gIC8qIFZlY3RvciBMb2FkIERhdGEgSW50byBSZWdpc3RlciAtIE5vdGUgdGhhdCB0aGUgdmVjdG9yIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIGNvbWUgYWZ0ZXIgdGhlIG90aGVyCi0gICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGFsd2F5cyBwcmludCB0aGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBzZWNvbmQgZm9yCi0gICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSB0d28gaW5zdHJ1Y3Rpb25zIGluIHRoZSBzYW1lIG9wY29kZS4gKi8KLQotICB7InZsZDAuZCIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMCksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1RfRX0gfSwKLSAgeyJ2bGQwLnMiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDApIHwgVl9wKDApLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAotICB7InZsZDEuZCIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1RfRX0gfSwKLSAgeyJ2bGQxLnMiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDApIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAotCi0gIC8qIFZlY3RvciBTdG9yZSBEYXRhIEludG8gTWVtb3J5IC0gTm90ZSB0aGF0IHRoZSB2ZWN0b3IgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgY29tZSBhZnRlciB0aGUgb3RoZXIKLSAgIHZlY3RvciBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgYWx3YXlzIHByaW50IHRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIHNlY29uZCBmb3IKLSAgIHZlY3RvciBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIHR3byBpbnN0cnVjdGlvbnMgaW4gdGhlIHNhbWUgb3Bjb2RlLiAqLwotCi0gIHsidnN0LmQiLAlPUF9WKDB4MUUpIHwgVl9tKDApIHwgVl9TKDEpIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUX0V9IH0sCi0gIHsidnN0LnMiLAlPUF9WKDB4MUUpIHwgVl9tKDApIHwgVl9TKDApIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAotCi0gIHsieG5vciIsCU9QX1NJKDB4MTkpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLSAgeyJ4bm9yIiwJT1BfTEkoMHgzMzMpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLSAgeyJ4bm9yIiwJT1BfUkVHKDB4MzMyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLQotICB7InhvciIsCU9QX1NJKDB4MTYpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLSAgeyJ4b3IiLAlPUF9MSSgweDMyRCksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotICB7InhvciIsCU9QX1JFRygweDMyQyksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0KLX07Ci0KLWNvbnN0IGludCB0aWM4MF9udW1fb3Bjb2RlcyA9IHNpemVvZiAodGljODBfb3Bjb2RlcykgLyBzaXplb2YgKHRpYzgwX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy92ODUwLWRpcy5jIGIvb3Bjb2Rlcy92ODUwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTA2MjViLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdjg1MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBWODUwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIgCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9yZWdfbmFtZXNbXSA9Ci17ICJyMCIsICJyMSIsICJyMiIsICJzcCIsICJncCIsICJyNSIsICJyNiIsICJyNyIsIAotICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLCAKLSAgInIxNiIsICJyMTciLCAicjE4IiwgInIxOSIsICJyMjAiLCAicjIxIiwgInIyMiIsICJyMjMiLCAKLSAgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsICJyMjgiLCAicjI5IiwgImVwIiwgImxwIiB9OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9zcmVnX25hbWVzW10gPQoteyAiZWlwYyIsICJlaXBzdyIsICJmZXBjIiwgImZlcHN3IiwgImVjciIsICJwc3ciLCAic3I2IiwgInNyNyIsIAotICAic3I4IiwgInNyOSIsICJzcjEwIiwgInNyMTEiLCAic3IxMiIsICJzcjEzIiwgInNyMTQiLCAic3IxNSIsCi0gICJjdHBjIiwgImN0cHN3IiwgImRicGMiLCAiZGJwc3ciLCAiY3RicCIsICJzcjIxIiwgInNyMjIiLCAic3IyMyIsIAotICAic3IyNCIsICJzcjI1IiwgInNyMjYiLCAic3IyNyIsICJzcjI4IiwgInNyMjkiLCAic3IzMCIsICJzcjMxIiwKLSAgInNyMTYiLCAic3IxNyIsICJzcjE4IiwgInNyMTkiLCAic3IyMCIsICJzcjIxIiwgInNyMjIiLCAic3IyMyIsIAotICAic3IyNCIsICJzcjI1IiwgInNyMjYiLCAic3IyNyIsICJzcjI4IiwgInNyMjkiLCAic3IzMCIsICJzcjMxIiB9OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9jY19uYW1lc1tdID0KLXsgInYiLCAiYy9sIiwgInoiLCAibmgiLCAicy9uIiwgInQiLCAibHQiLCAibGUiLCAKLSAgIm52IiwgIm5jL25sIiwgIm56IiwgImgiLCAibnMvcCIsICJzYSIsICJnZSIsICJndCIgfTsKLQotc3RhdGljIGludAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLXsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICogICAgICAgICAgb3AgPSAoc3RydWN0IHY4NTBfb3Bjb2RlICopdjg1MF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogICBvcGVyYW5kOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IDA7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgICAJc2hvcnRfb3AgPSAoKGluc24gJiAweDA2MDApICE9IDB4MDYwMCk7Ci0gIGludAkJCQlieXRlc19yZWFkOwotICBpbnQJCQkJdGFyZ2V0X3Byb2Nlc3NvcjsKLSAgCi0gIC8qIFNwZWNpYWwgY2FzZTogMzIgYml0IE1PViAqLwotICBpZiAoKGluc24gJiAweGZmZTApID09IDB4MDYyMCkKLSAgICBzaG9ydF9vcCA9IHRydWU7Ci0gIAotICBieXRlc19yZWFkID0gc2hvcnRfb3AgPyAyIDogNDsKLSAgCi0gIC8qIElmIHRoaXMgaXMgYSB0d28gYnl0ZSBpbnNuLCB0aGVuIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuICovCi0gIGlmIChzaG9ydF9vcCkKLSAgICBpbnNuICY9IDB4ZmZmZjsKLQotICBzd2l0Y2ggKGluZm8tPm1hY2gpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICBkZWZhdWx0OgotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOgotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF92ODUwZWE6IAotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwRUE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICAvKiBGaW5kIHRoZSBvcGNvZGUuICAqLwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUKLQkgICYmIChvcC0+cHJvY2Vzc29ycyAmIHRhcmdldF9wcm9jZXNzb3IpKQotCXsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBvcGluZGV4X3B0cjsKLQkgIHVuc2lnbmVkIGludCAgICAgICAgICBvcG51bTsKLQkgIHVuc2lnbmVkIGludCAgICAgICAgICBtZW1vcDsKLQotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOwotLypmcHJpbnRmIChzdGRlcnIsICJtYXRjaDogbWFzazogJXggaW5zbjogJXgsIG9wY29kZTogJXgsIG5hbWU6ICVzXG4iLCBvcC0+bWFzaywgaW5zbiwgb3AtPm9wY29kZSwgb3AtPm5hbWUgKTsqLwotCi0JICBtZW1vcCA9IG9wLT5tZW1vcDsKLQkgIC8qIE5vdyBwcmludCB0aGUgb3BlcmFuZHMuCi0KLQkgICAgIE1FTU9QIGlzIHRoZSBvcGVyYW5kIG51bWJlciBhdCB3aGljaCBhIG1lbW9yeQotCSAgICAgYWRkcmVzcyBzcGVjaWZpY2F0aW9uIHN0YXJ0cywgb3IgemVybyBpZiB0aGlzCi0JICAgICBpbnN0cnVjdGlvbiBoYXMgbm8gbWVtb3J5IGFkZHJlc3Nlcy4KLQotCSAgICAgQSBtZW1vcnkgYWRkcmVzcyBpcyBhbHdheXMgdHdvIGFyZ3VtZW50cy4KLQotCSAgICAgVGhpcyBpbmZvcm1hdGlvbiBhbGxvd3MgdXMgdG8gZGV0ZXJtaW5lIHdoZW4gdG8KLQkgICAgIGluc2VydCBjb21tYXMgaW50byB0aGUgb3V0cHV0IHN0cmVhbSBhcyB3ZWxsIGFzCi0JICAgICB3aGVuIHRvIGluc2VydCBkaXNwW3JlZ10gZXhwcmVzc2lvbnMgb250byB0aGUKLQkgICAgIG91dHB1dCBzdHJlYW0uICAqLwotCSAgCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBvcG51bSA9IDE7Ci0JICAgICAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgICAgICBvcGluZGV4X3B0cisrLCBvcG51bSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyAJdmFsdWU7Ci0JICAgICAgaW50ICAJZmxhZzsKLQkgICAgICBpbnQgICAgICAgc3RhdHVzOwotCSAgICAgIGJmZF9ieXRlCWJ1ZmZlclsgNCBdOwotCSAgICAgIAotCSAgICAgIG9wZXJhbmQgPSAmdjg1MF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotCSAgICAgIAotCSAgICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCQl2YWx1ZSA9IChvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgMCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gLTEpCi0JCSAgICB2YWx1ZSA9IChpbnNuICYgb3BlcmFuZC0+c2hpZnQpOwotCQkgIGVsc2UKLQkJICAgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0KLQkJICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCQkgICAgdmFsdWUgPSAoKGxvbmcpKHZhbHVlIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKQotCQkJICAgICA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSk7Ci0JCX0KLQotCSAgICAgIC8qIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGFsd2F5cyBvdXRwdXQgd2l0aG91dCBhbnkKLQkJIHNwZWNpYWwgaGFuZGxpbmcuCi0KLQkJIEZvciB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKLQotCQkgICBJZiBtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDEsIHRoZW4gd2UgbmVlZCAnWycgc2luY2UKLQkJICAgd2UncmUgYWJvdXQgdG8gb3V0cHV0IHRoZSByZWdpc3RlciB1c2VkIGluIGEgbWVtb3J5Ci0JCSAgIHJlZmVyZW5jZS4KLQotCQkgICBJZiBtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDIsIHRoZW4gd2UgbmVlZCAnXScgc2luY2UKLQkJICAgd2UganVzdCBmaW5pc2hlZCB0aGUgcmVnaXN0ZXIgaW4gYSBtZW1vcnkgcmVmZXJlbmNlLiAgV2UKLQkJICAgYWxzbyBuZWVkIGEgJywnIGJlZm9yZSB0aGlzIG9wZXJhbmQuCi0KLQkJICAgRWxzZSB3ZSBqdXN0IG5lZWQgYSBjb21tYS4KLQotCQkgICBXZSBtYXkgbmVlZCB0byBvdXRwdXQgYSB0cmFpbGluZyAnXScgaWYgdGhlIGxhc3Qgb3BlcmFuZAotCQkgICBpbiBhbiBpbnN0cnVjdGlvbiBpcyB0aGUgcmVnaXN0ZXIgZm9yIGEgbWVtb3J5IGFkZHJlc3MuIAotCi0JCSAgIFRoZSBleGNlcHRpb24gKGFuZCB0aGVyZSdzIGFsd2F5cyBhbiBleGNlcHRpb24pIGlzIHRoZQotCQkgICAiam1wIiBpbnNuIHdoaWNoIG5lZWRzIHNxdWFyZSBicmFja2V0cyBhcm91bmQgaXQncyBvbmx5Ci0JCSAgIHJlZ2lzdGVyIGFyZ3VtZW50LiAgKi8KLQotCSAgICAgICAgICAgaWYgKG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMSkgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JICAgICAgZWxzZSBpZiAobWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAyKSBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIl0sIik7Ci0JICAgICAgZWxzZSBpZiAobWVtb3AgPT0gMSAmJiBvcG51bSA9PSAxCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSkKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JICAgICAgZWxzZSBpZiAob3BudW0gPiAxKQkgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiwgIik7Ci0KLQkgICAgICAvKiBleHRyYWN0IHRoZSBmbGFncywgaWdub3JuZyBvbmVzIHdoaWNoIGRvIG5vdCBlZmZlY3QgZGlzYXNzZW1ibHkgb3V0cHV0LiAqLwotCSAgICAgIGZsYWcgPSBvcGVyYW5kLT5mbGFnczsKLQkgICAgICBmbGFnICY9IH4gVjg1MF9PUEVSQU5EX1NJR05FRDsKLQkgICAgICBmbGFnICY9IH4gVjg1MF9PUEVSQU5EX1JFTEFYOwotCSAgICAgIGZsYWcgJj0gLSBmbGFnOwotCSAgICAgIAotCSAgICAgIHN3aXRjaCAoZmxhZykKLQkJewotCQljYXNlIFY4NTBfT1BFUkFORF9SRUc6ICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzIiwgdjg1MF9yZWdfbmFtZXNbdmFsdWVdKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX1NSRzogIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCB2ODUwX3NyZWdfbmFtZXNbdmFsdWVdKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX0NDOiAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCB2ODUwX2NjX25hbWVzW3ZhbHVlXSk7IGJyZWFrOwotCQljYXNlIFY4NTBfT1BFUkFORF9FUDogICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgImVwIik7IGJyZWFrOwotCQlkZWZhdWx0OiAgICAgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOyBicmVhazsKLQkJY2FzZSBWODUwX09QRVJBTkRfRElTUDoKLQkJICB7Ci0JCSAgICBiZmRfdm1hIGFkZHIgPSB2YWx1ZSArIG1lbWFkZHI7Ci0JCSAgICAKLQkJICAgIC8qIE9uIHRoZSB2ODUwIHRoZSB0b3AgOCBiaXRzIG9mIGFuIGFkZHJlc3MgYXJlIHVzZWQgYnkgYW4gb3ZlcmxheSBtYW5hZ2VyLgotCQkgICAgICAgVGh1cyBpdCBtYXkgaGFwcGVuIHRoYXQgd2hlbiB3ZSBhcmUgbG9va2luZyBmb3IgYSBzeW1ib2wgdG8gbWF0Y2gKLQkJICAgICAgIGFnYWluc3QgYW4gYWRkcmVzcyB3aXRoIHNvbWUgb2YgaXRzIHRvcCBiaXRzIHNldCwgdGhlIHNlYXJjaCBmYWlscyB0bwotCQkgICAgICAgdHVybiB1cCBhbiBleGFjdCBtYXRjaC4gIEluIHRoaXMgY2FzZSB3ZSB0cnkgdG8gZmluZCBhbiBleGFjdCBtYXRjaAotCQkgICAgICAgYWdhaW5zdCBhIHN5bWJvbCBpbiB0aGUgbG93ZXIgYWRkcmVzcyBzcGFjZSwgYW5kIGlmIHdlIGZpbmQgb25lLCB3ZQotCQkgICAgICAgdXNlIHRoYXQgYWRkcmVzcy4gICBXZSBvbmx5IGRvIHRoaXMgZm9yIEpBUkwgaW5zdHJ1Y3Rpb25zIGhvd2V2ZXIsIGFzCi0JCSAgICAgICB3ZSBkbyBub3Qgd2FudCB0byBtaXNpbnRlcnByZXQgYnJhbmNoIGluc3RydWN0aW9ucy4gICovCi0JCSAgICBpZiAob3BlcmFuZC0+Yml0cyA9PSAyMikKLQkJICAgICAgewotCQkJaWYgKCAhIGluZm8tPnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgKGFkZHIsIGluZm8pCi0JCQkgICAgJiYgKChhZGRyICYgMHhGRjAwMDAwMCkgIT0gMCkKLQkJCSAgICAmJiBpbmZvLT5zeW1ib2xfYXRfYWRkcmVzc19mdW5jIChhZGRyICYgMHgwMEZGRkZGRiwgaW5mbykpCi0JCQkgIHsKLQkJCSAgICBhZGRyICY9IDB4MDBGRkZGRkY7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChhZGRyLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJICAgIAotCQljYXNlIFY4NTBFX1BVU0hfUE9QOgotCQkgIHsKLQkJICAgIHN0YXRpYyBpbnQgbGlzdDEyX3JlZ3NbMzJdICAgPSB7IDMwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotCQkgICAgc3RhdGljIGludCBsaXN0MThfaF9yZWdzWzMyXSA9IHsgMTksIDE4LCAxNywgMTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAzMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07Ci0JCSAgICBzdGF0aWMgaW50IGxpc3QxOF9sX3JlZ3NbMzJdID0geyAgMywgIDIsICAxLCAtMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDE0LCAxNSwgMTMsIDEyLCAgNywgIDYsICA1LCAgNCwgMTEsIDEwLCAgOSwgIDggfTsKLQkJICAgIGludCAqICAgICAgICAgICAgIHJlZ3M7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBpOwotCQkgICAgdW5zaWduZWQgbG9uZyBpbnQgbWFzayA9IDA7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBwYyAgID0gZmFsc2U7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBzciAgID0gZmFsc2U7Ci0JCSAgICAKLQkJICAgIAotCQkgICAgc3dpdGNoIChvcGVyYW5kLT5zaGlmdCkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDB4ZmZlMDAwMDE6IHJlZ3MgPSBsaXN0MTJfcmVnczsgYnJlYWs7Ci0JCSAgICAgIGNhc2UgMHhmZmY4MDAwZjogcmVncyA9IGxpc3QxOF9oX3JlZ3M7IGJyZWFrOwotCQkgICAgICBjYXNlIDB4ZmZmODAwMWY6IHJlZ3MgPSBsaXN0MThfbF9yZWdzOyB2YWx1ZSAmPSB+MHgxMDsgYnJlYWs7ICAvKiBEbyBub3QgaW5jbHVkZSBtYWdpYyBiaXQgKi8KLQkJICAgICAgZGVmYXVsdDoKLQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQlmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIpLCBvcGVyYW5kLT5zaGlmdCApOwotCQkJYWJvcnQoKTsKLQkJICAgICAgfQotCi0JCSAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICAgICAgewotCQkJaWYgKHZhbHVlICYgKDEgPDwgaSkpCi0JCQkgIHsKLQkJCSAgICBzd2l0Y2ggKHJlZ3NbIGkgXSkKLQkJCSAgICAgIHsKLQkJCSAgICAgIGRlZmF1bHQ6IG1hc2sgfD0gKDEgPDwgcmVnc1sgaSBdKTsgYnJlYWs7Ci0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCSAgICAgIGNhc2UgMDogIGZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBwb3AgcmVnOiAlZFxuIiksIGkgKTsgYWJvcnQoKTsKLQkJCSAgICAgIGNhc2UgLTE6IHBjID0gdHJ1ZTsgYnJlYWs7Ci0JCQkgICAgICBjYXNlIC0yOiBzciA9IHRydWU7IGJyZWFrOwotCQkJICAgICAgfQotCQkJICB9Ci0JCSAgICAgIH0KLQotCQkgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJ7Iik7Ci0JCSAgICAKLQkJICAgIGlmIChtYXNrIHx8IHBjIHx8IHNyKQotCQkgICAgICB7Ci0JCQlpZiAobWFzaykKLQkJCSAgewotCQkJICAgIHVuc2lnbmVkIGludCBiaXQ7Ci0JCQkgICAgaW50ICAgICAgICAgIHNob3duX29uZSA9IGZhbHNlOwotCQkJICAgIAotCQkJICAgIGZvciAoYml0ID0gMDsgYml0IDwgMzI7IGJpdCsrKQotCQkJICAgICAgaWYgKG1hc2sgJiAoMSA8PCBiaXQpKQotCQkJCXsKLQkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IGZpcnN0ID0gYml0OwotCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgbGFzdDsKLQotCQkJCSAgaWYgKHNob3duX29uZSkKLQkJCQkgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIsICIpOwotCQkJCSAgZWxzZQotCQkJCSAgICBzaG93bl9vbmUgPSB0cnVlOwotCQkJCSAgCi0JCQkJICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgdjg1MF9yZWdfbmFtZXNbZmlyc3RdKTsKLQkJCQkgIAotCQkJCSAgZm9yIChiaXQrKzsgYml0IDwgMzI7IGJpdCsrKQotCQkJCSAgICBpZiAoKG1hc2sgJiAoMSA8PCBiaXQpKSA9PSAwKQotCQkJCSAgICAgIGJyZWFrOwotCi0JCQkJICBsYXN0ID0gYml0OwotCi0JCQkJICBpZiAobGFzdCA+IGZpcnN0ICsgMSkKLQkJCQkgICAgewotCQkJCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiIC0gJXMiLCB2ODUwX3JlZ19uYW1lc1sgbGFzdCAtIDEgXSk7Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkgIH0KLQkJCQotCQkJaWYgKHBjKQotCQkJICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzUEMiLCBtYXNrID8gIiwgIiA6ICIiKTsKLQkJCWlmIChzcikKLQkJCSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlc1NSIiwgKG1hc2sgfHwgcGMpID8gIiwgIiA6ICIiKTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIn0iKTsKLQkJICB9Ci0JCWJyZWFrOwotCQkgIAotCQljYXNlIFY4NTBFX0lNTUVESUFURTE2OgotCQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIgKyBieXRlc19yZWFkLCBidWZmZXIsIDIsIGluZm8pOwotCQkgIGlmIChzdGF0dXMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgYnl0ZXNfcmVhZCArPSAyOwotCQkgICAgICB2YWx1ZSA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLQkJICAgICAgLyogSWYgdGhpcyBpcyBhIERJU1BPU0UgaW5zdHJ1Y3Rpb24gd2l0aCBmZiBzZXQgdG8gMHgxMCwgdGhlbiBzaGlmdCB2YWx1ZSB1cCBieSAxNi4gICovCi0JCSAgICAgIGlmICgoaW5zbiAmIDB4MDAxZmZmYzApID09IDB4MDAxMzA3ODApCi0JCQl2YWx1ZSA8PD0gMTY7Ci0KLQkJICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIweCV4IiwgdmFsdWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciArIGJ5dGVzX3JlYWQsIGluZm8pOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIFY4NTBFX0lNTUVESUFURTMyOgotCQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIgKyBieXRlc19yZWFkLCBidWZmZXIsIDQsIGluZm8pOwotCQkgIGlmIChzdGF0dXMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgYnl0ZXNfcmVhZCArPSA0OwotCQkgICAgICB2YWx1ZSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyICsgYnl0ZXNfcmVhZCwgaW5mbyk7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0JCSAgCi0KLQkgICAgICAvKiBIYW5kbGUgam1wIGNvcnJlY3RseS4gICovCi0JICAgICAgaWYgKG1lbW9wID09IDEgJiYgb3BudW0gPT0gMQotCQkgICYmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSAhPSAwKSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJdIik7Ci0JICAgIH0KLQotCSAgLyogQ2xvc2UgYW55IHNxdWFyZSBicmFja2V0IHdlIGxlZnQgb3Blbi4gICovCi0JICBpZiAobWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAyKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIl0iKTsKLQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLSAgICAgIGlmIChzaG9ydF9vcCkKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIi5zaG9ydFx0MHglMDR4IiwgaW5zbik7Ci0gICAgICBlbHNlCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHglMDh4IiwgaW5zbik7Ci0gICAgfQotCi0gIHJldHVybiBieXRlc19yZWFkOwotfQotCi1pbnQgCi1wcmludF9pbnNuX3Y4NTAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICBpbnQgICAgICAgICAgIHN0YXR1czsKLSAgYmZkX2J5dGUgICAgICBidWZmZXJbIDQgXTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuID0gMDsKLQotICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIG9wY29kZSBpcy4gICovCi0gIAotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgewotICAgICAgaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0gICAgICAKLSAgICAgIGlmICggICAoaW5zbiAmIDB4MDYwMCkgPT0gMHgwNjAwCi0JICAmJiAoaW5zbiAmIDB4ZmZlMCkgIT0gMHgwNjIwKQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSA0IGJ5dGUgaW5zbiwgcmVhZCA0IGJ5dGVzIG9mIHN0dWZmLiAgKi8KLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0KLQkgIGlmIChzdGF0dXMgPT0gMCkKLQkgICAgaW5zbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JfQotICAgIH0KLSAgCi0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIHRlbGwgb3VyIGNhbGxlciBob3cgbWFueSBieXRlcyB3ZSBjb25zdW1lZC4gICovCi0gIHJldHVybiBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3Y4NTAtb3BjLmMgYi9vcGNvZGVzL3Y4NTAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDg1N2UuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy92ODUwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLS8qIEFzc2VtYmxlIFY4NTAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvdjg1MC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIHJlZ3VsYXIgb3Bjb2RlICovCi0jZGVmaW5lIE9QKHgpCQkoKHggJiAweDNmKSA8PCA1KQotI2RlZmluZSBPUF9NQVNLCQlPUCAoMHgzZikKLQotLyogY29uZGl0aW9uYWwgYnJhbmNoIG9wY29kZSAqLwotI2RlZmluZSBCT1AoeCkJCSgoMHgwYiA8PCA3KSB8ICh4ICYgMHgwZikpCi0jZGVmaW5lIEJPUF9NQVNLCSgoMHgwZiA8PCA3KSB8IDB4MGYpCi0KLS8qIG9uZS13b3JkIG9wY29kZXMgKi8KLSNkZWZpbmUgb25lKHgpCQkoKHVuc2lnbmVkIGludCkgKHgpKQotCi0vKiB0d28td29yZCBvcGNvZGVzICovCi0jZGVmaW5lIHR3byh4LHkpCSgodW5zaWduZWQgaW50KSAoeCkgfCAoKHVuc2lnbmVkIGludCkgKHkpIDw8IDE2KSkKLQotCi0MCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KLQotLyogTm90ZTogVGhlcmUgaXMgYSBjb25zcGlyYWN5IGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zIGFuZAotICAgdjg1MF9pbnNlcnRfb3BlcmFuZCgpIGluIGdhcy9jb25maWcvdGMtdjg1MC5jLiAgRXJyb3IgbWVzc2FnZXMKLSAgIGNvbnRhaW5pbmcgdGhlIHN0cmluZyAnb3V0IG9mIHJhbmdlJyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIGEKLSAgIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZ2l2ZW4gdG8gR0FTLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBub3RfdmFsaWQgICAgPSBOXyAoImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBub3QgaW4gcmFuZ2UgYW5kIGlzIG5vdCBhbGlnbmVkIik7Ci1zdGF0aWMgY29uc3QgY2hhciAqIG91dF9vZl9yYW5nZSA9IE5fICgiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG91dCBvZiByYW5nZSIpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBub3RfYWxpZ25lZCAgPSBOXyAoImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBub3QgYWxpZ25lZCIpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UgPSBOXyAoImltbWVkaWF0ZSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UiKTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kOSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHhmZiB8fCB2YWx1ZSA8IC0weDEwMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIG9kZCBvZmZzZXQiKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKCJicmFuY2ggdG8gb2RkIG9mZnNldCIpOwotCi0gIHJldHVybiAoaW5zbiB8ICgodmFsdWUgJiAweDFmMCkgPDwgNykgfCAoKHZhbHVlICYgMHgwZSkgPDwgMykpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kOSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gKChpbnNuICYgMHhmODAwKSA+PiA3KSB8ICgoaW5zbiAmIDB4MDA3MCkgPj4gMyk7Ci0KLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldCAtPSAweDAyMDA7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kMjIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4MWZmZmZmIHx8IHZhbHVlIDwgLTB4MjAwMDAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSAyKSAhPSAwKQotCSogZXJybXNnID0gXygiYnJhbmNoIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgdG8gYW4gb2RkIG9mZnNldCIpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXygiYnJhbmNoIHZhbHVlIG91dCBvZiByYW5nZSIpOwotICAgIH0KLSAgZWxzZSBpZiAoKHZhbHVlICUgMikgIT0gMCkKLSAgICAqIGVycm1zZyA9IF8oImJyYW5jaCB0byBvZGQgb2Zmc2V0Iik7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKCh2YWx1ZSAmIDB4ZmZmZSkgPDwgMTYpIHwgKCh2YWx1ZSAmIDB4M2YwMDAwKSA+PiAxNikpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kMjIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSAoKGluc24gJiAweGZmZmUwMDAwKSA+PiAxNikgfCAoKGluc24gJiAweDNmKSA8PCAxNik7Ci0KLSAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAoKHJldCA8PCAxMCkgPj4gMTApOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2QxNl8xNSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHg3ZmZmIHx8IHZhbHVlIDwgLTB4ODAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8obm90X3ZhbGlkKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweGZmZmUpIDw8IDE2KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDE2XzE1IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgc2lnbmVkIGxvbmcgcmV0ID0gKGluc24gJiAweGZmZmUwMDAwKTsKLQotICByZXR1cm4gcmV0ID4+IDE2OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2Q4XzcgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSAyKSAhPSAwKQotCSogZXJybXNnID0gXyhub3RfdmFsaWQpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXyhvdXRfb2ZfcmFuZ2UpOwotICAgIH0KLSAgZWxzZSBpZiAoKHZhbHVlICUgMikgIT0gMCkKLSAgICAqIGVycm1zZyA9IF8obm90X2FsaWduZWQpOwotCi0gIHZhbHVlID4+PSAxOwotCi0gIHJldHVybiAoaW5zbiB8ICh2YWx1ZSAmIDB4N2YpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDhfNyAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gKGluc24gJiAweDdmKTsKLQotICByZXR1cm4gcmV0IDw8IDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDhfNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHhmZiB8fCB2YWx1ZSA8IDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDQpICE9IDApCi0JKmVycm1zZyA9IF8obm90X3ZhbGlkKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDQpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICB2YWx1ZSA+Pj0gMTsKLQotICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDdlKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q4XzYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHg3ZSk7Ci0KLSAgcmV0dXJuIHJldCA8PCAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2Q1XzQgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4MWYgfHwgdmFsdWUgPCAwKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSAmIDEpCi0JKiBlcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKmVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlICYgMSkKLSAgICAqIGVycm1zZyA9IF8obm90X2FsaWduZWQpOwotCi0gIHZhbHVlID4+PSAxOwotCi0gIHJldHVybiAoaW5zbiB8ICh2YWx1ZSAmIDB4MGYpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDVfNCAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gKGluc24gJiAweDBmKTsKLQotICByZXR1cm4gcmV0IDw8IDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDE2XzE2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHNpZ25lZCBsb25nICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDdmZmYgfHwgdmFsdWUgPCAtMHg4MDAwKQotICAgICogZXJybXNnID0gXyhvdXRfb2ZfcmFuZ2UpOwotCi0gIHJldHVybiAoaW5zbiB8ICgodmFsdWUgJiAweGZmZmUpIDw8IDE2KSB8ICgodmFsdWUgJiAxKSA8PCA1KSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2QxNl8xNiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweGZmZmUwMDAwOwotCi0gIHJldCA+Pj0gMTY7Ci0KLSAgcmV0IHw9ICgoaW5zbiAmIDB4MjApID4+IDUpOwotICAKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9pOSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzaWduZWQgbG9uZyAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHhmZiB8fCB2YWx1ZSA8IC0weDEwMCkKLSAgICAqIGVycm1zZyA9IF8oaW1tZWRpYXRlX291dF9vZl9yYW5nZSk7Ci0KLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZTApIDw8IDEzKSB8ICh2YWx1ZSAmIDB4MWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9pOSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweDAwM2MwMDAwOwotCi0gIHJldCA8PD0gMTA7Ci0gIHJldCA+Pj0gMjM7Ci0KLSAgcmV0IHw9IChpbnNuICYgMHgxZik7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3U5IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmZikKLSAgICAqIGVycm1zZyA9IF8oaW1tZWRpYXRlX291dF9vZl9yYW5nZSk7Ci0KLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZTApIDw8IDEzKSB8ICh2YWx1ZSAmIDB4MWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF91OSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gaW5zbiAmIDB4MDAzYzAwMDA7Ci0KLSAgcmV0ID4+PSAxMzsKLQotICByZXQgfD0gKGluc24gJiAweDFmKTsKLSAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfc3BlIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgIT0gMykKLSAgICAqIGVycm1zZyA9IF8oImludmFsaWQgcmVnaXN0ZXIgZm9yIHN0YWNrIGFkanVzdG1lbnQiKTsKLQotICByZXR1cm4gaW5zbiAmICh+IDB4MTgwMDAwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3Rfc3BlIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgcmV0dXJuIDM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfaTVkaXYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4MWZmKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSAmIDEpCi0JKiBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgdmFsdWUgbm90IGluIHJhbmdlIGFuZCBub3QgZXZlbiIpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXyhpbW1lZGlhdGVfb3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlICYgMSkKLSAgICAqIGVycm1zZyA9IF8oImltbWVkaWF0ZSB2YWx1ZSBtdXN0IGJlIGV2ZW4iKTsKLQotICB2YWx1ZSA9IDMyIC0gdmFsdWU7Ci0gIAotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFlKSA8PCAxNyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2k1ZGl2IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHgzYzAwMDA7Ci0KLSAgcmV0ID4+PSAxNzsKLQotICByZXQgPSAzMiAtIHJldDsKLSAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLQwKLS8qIFdhcm5pbmc6IGNvZGUgaW4gZ2FzL2NvbmZpZy90Yy12ODUwLmMgZXhhbWluZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkuCi0gICBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGUgdmFsdWVzIGhlcmUsIGJlIHN1cmUgdG8gbG9vayBmb3Igc2lkZSBlZmZlY3RzIGluCi0gICB0aGF0IGNvZGUuICovCi1jb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kIHY4NTBfb3BlcmFuZHNbXSA9Ci17Ci0jZGVmaW5lIFVOVVNFRAkwCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgMCB9LCAKLQotLyogVGhlIFIxIGZpZWxkIGluIGEgZm9ybWF0IDEsIDYsIDcsIG9yIDkgaW5zbi4gKi8KLSNkZWZpbmUgUjEJKFVOVVNFRCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB9LCAKLQotLyogQXMgYWJvdmUsIGJ1dCByZWdpc3RlciAwIGlzIG5vdCBhbGxvd2VkLiAgKi8KLSNkZWZpbmUgUjFfTk9UUjAgKFIxICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9OT1RfUjAgfSwgCi0KLS8qIFRoZSBSMiBmaWVsZCBpbiBhIGZvcm1hdCAxLCAyLCA0LCA1LCA2LCA3LCA5IGluc24uICovCi0jZGVmaW5lIFIyCShSMV9OT1RSMCArIDEpCi0gIHsgNSwgMTEsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfSwKLQotLyogQXMgYWJvdmUsIGJ1dCByZWdpc3RlciAwIGlzIG5vdCBhbGxvd2VkLiAgKi8KLSNkZWZpbmUgUjJfTk9UUjAgKFIyICsgMSkKLSAgeyA1LCAxMSwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfTk9UX1IwIH0sCi0KLS8qIFRoZSBpbW01IGZpZWxkIGluIGEgZm9ybWF0IDIgaW5zbi4gKi8KLSNkZWZpbmUgSTUJKFIyX05PVFIwICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgdW5zaWduZWQgaW1tNSBmaWVsZCBpbiBhIGZvcm1hdCAyIGluc24uICovCi0jZGVmaW5lIEk1VQkoSTUgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIDAgfSwKLQotLyogVGhlIGltbTE2IGZpZWxkIGluIGEgZm9ybWF0IDYgaW5zbi4gKi8KLSNkZWZpbmUgSTE2CShJNVUgKyAxKQotICB7IDE2LCAxNiwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIHNpZ25lZCBkaXNwNyBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ3CShJMTYgKyAxKQotICB7IDcsIDAsIE5VTEwsIE5VTEwsIDB9LAotCi0vKiBUaGUgZGlzcDE2IGZpZWxkIGluIGEgZm9ybWF0IDYgaW5zbi4gKi8KLSNkZWZpbmUgRDE2XzE1CShENyArIDEpCi0gIHsgMTUsIDE3LCBpbnNlcnRfZDE2XzE1LCBleHRyYWN0X2QxNl8xNSwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIDMgYml0IGltbWVkaWF0ZSBmaWVsZCBpbiBmb3JtYXQgOCBpbnNuLiAgKi8KLSNkZWZpbmUgQjMJKEQxNl8xNSArIDEpCi0gIHsgMywgMTEsIE5VTEwsIE5VTEwsIDAgfSwKLQotLyogVGhlIDQgYml0IGNvbmRpdGlvbiBjb2RlIGluIGEgc2V0ZiBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBDQ0NDCShCMyArIDEpCi0gIHsgNCwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX0NDIH0sCi0KLS8qIFRoZSB1bnNpZ25lZCBESVNQOCBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ4XzcJKENDQ0MgKyAxKQotICB7IDcsIDAsIGluc2VydF9kOF83LCBleHRyYWN0X2Q4XzcsIDAgfSwKLQotLyogVGhlIHVuc2lnbmVkIERJU1A4IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KLSNkZWZpbmUgRDhfNgkoRDhfNyArIDEpCi0gIHsgNiwgMSwgaW5zZXJ0X2Q4XzYsIGV4dHJhY3RfZDhfNiwgMCB9LAotCi0vKiBTeXN0ZW0gcmVnaXN0ZXIgb3BlcmFuZHMuICAqLwotI2RlZmluZSBTUjEJKEQ4XzYgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TUkcgfSwKLQotLyogRVAgUmVnaXN0ZXIuICAqLwotI2RlZmluZSBFUAkoU1IxICsgMSkKLSAgeyAwLCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfRVAgfSwKLQotLyogVGhlIGltbTE2IGZpZWxkICh1bnNpZ25lZCkgaW4gYSBmb3JtYXQgNiBpbnNuLiAqLwotI2RlZmluZSBJMTZVCShFUCArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCAwfSwgCi0KLS8qIFRoZSBSMiBmaWVsZCBhcyBhIHN5c3RlbSByZWdpc3Rlci4gICovCi0jZGVmaW5lIFNSMgkoSTE2VSArIDEpCi0gIHsgNSwgMTEsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TUkcgfSwKLQotLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhIGZvcm1hdCA4IGluc24uICovCi0jZGVmaW5lIEQxNgkoU1IyICsgMSkKLSAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSBESVNQOSBmaWVsZCBpbiBhIGZvcm1hdCAzIGluc24sIHJlbGF4YWJsZS4gKi8KLSNkZWZpbmUgRDlfUkVMQVgJKEQxNiArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X2Q5LCBleHRyYWN0X2Q5LCBWODUwX09QRVJBTkRfUkVMQVggfCBWODUwX09QRVJBTkRfU0lHTkVEIHwgVjg1MF9PUEVSQU5EX0RJU1AgfSwKLQotLyogVGhlIERJU1AyMiBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24sIHJlbGF4YWJsZS4KLSAgIFRoaXMgX211c3RfIGZvbGxvdyBEOV9SRUxBWDsgdGhlIGFzc2VtYmxlciBhc3N1bWVzIHRoYXQgdGhlIGxvbmdlcgotICAgdmVyc2lvbiBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBzaG9ydGVyIHZlcnNpb24gZm9yIHJlbGF4aW5nLiAgKi8KLSNkZWZpbmUgRDIyCShEOV9SRUxBWCArIDEpCi0gIHsgMjIsIDAsIGluc2VydF9kMjIsIGV4dHJhY3RfZDIyLCBWODUwX09QRVJBTkRfU0lHTkVEIHwgVjg1MF9PUEVSQU5EX0RJU1AgfSwKLQotLyogVGhlIHNpZ25lZCBkaXNwNCBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ0CShEMjIgKyAxKQotICB7IDQsIDAsIE5VTEwsIE5VTEwsIDB9LAotCi0vKiBUaGUgdW5zaWduZWQgZGlzcDUgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBENV80CShENCArIDEpCi0gIHsgNCwgMCwgaW5zZXJ0X2Q1XzQsIGV4dHJhY3RfZDVfNCwgMCB9LAotCi0vKiBUaGUgZGlzcDE2IGZpZWxkIGluIGFuIGZvcm1hdCA3IHVuc2lnbmVkIGJ5dGUgbG9hZCBpbnNuLiAqLwotI2RlZmluZSBEMTZfMTYJKEQ1XzQgKyAxKQotICB7IC0xLCAweGZmZmUwMDIwLCBpbnNlcnRfZDE2XzE2LCBleHRyYWN0X2QxNl8xNiwgMCB9LCAKLQotLyogVGhpcmQgcmVnaXN0ZXIgaW4gY29uZGl0aW9uYWwgbW92ZXMuICovCi0jZGVmaW5lIFIzCShEMTZfMTYgKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIH0sCi0KLS8qIENvbmRpdGlvbiBjb2RlIGluIGNvbmRpdGlvbmFsIG1vdmVzLiAgKi8KLSNkZWZpbmUgTU9WQ0MJKFIzICsgMSkKLSAgeyA0LCAxNywgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX0NDIH0sCi0KLS8qIFRoZSBpbW05IGZpZWxkIGluIGEgbXVsdGlwbHkgd29yZC4gKi8KLSNkZWZpbmUgSTkJKE1PVkNDICsgMSkKLSAgeyA5LCAwLCBpbnNlcnRfaTksIGV4dHJhY3RfaTksIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSB1bnNpZ25lZCBpbW05IGZpZWxkIGluIGEgbXVsdGlwbHkgd29yZC4gKi8KLSNkZWZpbmUgVTkJKEk5ICsgMSkKLSAgeyA5LCAwLCBpbnNlcnRfdTksIGV4dHJhY3RfdTksIDAgfSwgCi0KLS8qIEEgbGlzdCBvZiByZWdpc3RlcnMgaW4gYSBwcmVwYXJlL2Rpc3Bvc2UgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBMSVNUMTIJKFU5ICsgMSkKLSAgeyAtMSwgMHhmZmUwMDAwMSwgTlVMTCwgTlVMTCwgVjg1MEVfUFVTSF9QT1AgfSwgCi0KLS8qIFRoZSBJTU02IGZpZWxkIGluIGEgY2FsbCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSTYJKExJU1QxMiArIDEpCi0gIHsgNiwgMCwgTlVMTCwgTlVMTCwgMCB9LCAKLQotLyogVGhlIDE2IGJpdCBpbW1lZGlhdGUgZm9sbG93aW5nIGEgMzIgYml0IGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU1NMTYJKEk2ICsgMSkKLSAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfCBWODUwRV9JTU1FRElBVEUxNiB9LCAKLQotLyogVGhlIDMyIGJpdCBpbW1lZGlhdGUgZm9sbG93aW5nIGEgMzIgYml0IGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU1NMzIJKElNTTE2ICsgMSkKLSAgeyAwLCAwLCBOVUxMLCBOVUxMLCBWODUwRV9JTU1FRElBVEUzMiB9LCAKLQotLyogVGhlIGltbTUgZmllbGQgaW4gYSBwdXNoL3BvcCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSU1NNQkoSU1NMzIgKyAxKQotICB7IDUsIDEsIE5VTEwsIE5VTEwsIDAgfSwgCi0KLS8qIFJlZzIgaW4gZGlzcG9zZSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgUjJESVNQT1NFCShJTU01ICsgMSkKLSAgeyA1LCAxNiwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfTk9UX1IwIH0sCi0KLS8qIFN0YWNrIHBvaW50ZXIgaW4gcHJlcGFyZSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgU1AJKFIyRElTUE9TRSArIDEpCi0gIHsgMiwgMTksIGluc2VydF9zcGUsIGV4dHJhY3Rfc3BlLCBWODUwX09QRVJBTkRfUkVHIH0sCi0KLS8qIFRoZSBJTU01IGZpZWxkIGluIGEgZGl2aWRlIE4gc3RlcCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSTVESVYJKFNQICsgMSkKLSAgeyA5LCAwLCBpbnNlcnRfaTVkaXYsIGV4dHJhY3RfaTVkaXYsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLSAgLyogVGhlIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIGEgUFVTSE1IL1BPUE1IIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTElTVDE4X0ggKEk1RElWICsgMSkKLSAgeyAtMSwgMHhmZmY4MDAwZiwgTlVMTCwgTlVMTCwgVjg1MEVfUFVTSF9QT1AgfSwgCi0KLSAgLyogVGhlIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIGEgUFVTSE1ML1BPUE1MIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTElTVDE4X0wgKExJU1QxOF9IICsgMSkKLSAgeyAtMSwgMHhmZmY4MDAxZiwgTlVMTCwgTlVMTCwgVjg1MEVfUFVTSF9QT1AgfSwgLyogVGhlIHNldHRpbmcgb2YgdGhlIDR0aCBiaXQgaXMgYSBmbGFnIHRvIGRpc2Fzc21ibGUoKSBpbiB2ODUwLWRpcy5jICovCi19IDsgCi0KLQwKLS8qIHJlZy1yZWcgaW5zdHJ1Y3Rpb24gZm9ybWF0IChGb3JtYXQgSSkgKi8KLSNkZWZpbmUgSUYxCXtSMSwgUjJ9Ci0KLS8qIGltbS1yZWcgaW5zdHJ1Y3Rpb24gZm9ybWF0IChGb3JtYXQgSUkpICovCi0jZGVmaW5lIElGMgl7STUsIFIyfQotCi0vKiBjb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybWF0IChGb3JtYXQgSUlJKSAqLwotI2RlZmluZSBJRjMJe0Q5X1JFTEFYfQotCi0vKiAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb24gKEZvcm1hdCBWSSkgKi8KLSNkZWZpbmUgSUY2CXtJMTYsIFIxLCBSMn0KLQotLyogMyBvcGVyYW5kIGluc3RydWN0aW9uIChGb3JtYXQgVkkpICovCi0jZGVmaW5lIElGNlUJe0kxNlUsIFIxLCBSMn0KLQotCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUJCU9QQ09ERQkJCU1BU0sJCSAgICAgICB7IE9QRVJBTkRTIH0JICAgTUVNT1AgICAgUFJPQ0VTU09SCi0KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0gICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0gICBNRU1PUCBzcGVjaWZpZXMgd2hpY2ggb3BlcmFuZCAoaWYgYW55KSBpcyBhIG1lbW9yeSBvcGVyYW5kLgotICAgUFJPQ0VTU09SUyBzcGVjaWZpZXMgd2hpY2ggQ1BVKHMpIHN1cHBvcnQgdGhlIG9wY29kZS4KLSAgIAotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCi0gICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLgotCi0gICBUaGUgdGFibGUgaXMgYWxzbyBzb3J0ZWQgYnkgbmFtZS4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLgotICAgV2hlbiBwYXJzaW5nIGFuIGluc3RydWN0aW9uIHRoZSBhc3NlbWJsZXIgZmluZHMgdGhlIGZpcnN0IG9jY3VyYW5jZQotICAgb2YgdGhlIG5hbWUgb2YgdGhlIGluc3RydWNpdG9uIGluIHRoaXMgdGFibGUgYW5kIHRoZW4gYXR0ZW1wdHMgdG8KLSAgIG1hdGNoIHRoZSBpbnN0cnVjdGlvbidzIGFyZ3VtZW50cyB3aXRoIGRlc2NyaXB0aW9uIG9mIHRoZSBvcGVyYW5kcwotICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeSBpdCBoYXMganVzdCBmb3VuZCBpbiB0aGlzIHRhYmxlLiAgSWYgdGhlCi0gICBtYXRjaCBmYWlscyB0aGUgYXNzZW1ibGVyIGxvb2tzIGF0IHRoZSBuZXh0IGVudHJ5IGluIHRoaXMgdGFibGUuCi0gICBJZiB0aGF0IGVudHJ5IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmV2aW91cyBlbnRyeSwgdGhlbiBpdAotICAgdHJpZXMgdG8gbWF0Y2ggdGhlIGluc3RydWN0aW9uIGFnYWluc3QgdGhhdCBlbnRyeSBhbmQgc28gb24uICBUaGlzCi0gICBpcyBob3cgdGhlIGFzc2VtYmxlciBjb3BlcyB3aXRoIG11bHRpcGxlLCBkaWZmZXJlbnQgZm9ybWF0cyBvZiB0aGUKLSAgIHNhbWUgaW5zdHJ1Y3Rpb24uICAqLwotCi1jb25zdCBzdHJ1Y3Qgdjg1MF9vcGNvZGUgdjg1MF9vcGNvZGVzW10gPQotewoteyAiYnJlYWtwb2ludCIsCTB4ZmZmZiwJCQkweGZmZmYsCQkgICAgICAJe1VOVVNFRH0sICAgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0KLXsgImptcCIsCW9uZSAoMHgwMDYwKSwJCW9uZSAoMHhmZmUwKSwJICAgICAgCXtSMX0sIAkJCTEsIFBST0NFU1NPUl9BTEwgfSwKLSAgCi0vKiBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyAqLwoteyAic2xkLmJ1IiwJb25lICgweDAzMDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q3LCAgIEVQLCAgIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2xkLmJ1IiwgICAgIG9uZSAoMHgwMDYwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q0LCAgIEVQLCAgIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX1Y4NTBFIH0sCi0KLXsgInNsZC5odSIsCW9uZSAoMHgwNDAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtEOF83LCBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5odSIsICAgICBvbmUgKDB4MDA3MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENV80LCBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRSB9LAotCi17ICJzbGQuYiIsICAgICAgb25lICgweDAwNjApLAkJb25lICgweDA3ZjApLCAgICAgICAgIAl7RDQsICAgRVAsICAgUjJ9LCAJMSwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2xkLmIiLAlvbmUgKDB4MDMwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDcsICAgRVAsICAgUjJ9LAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLXsgInNsZC5iIiwJb25lICgweDAzMDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q3LCAgIEVQLCAgIFIyfSwJMSwgUFJPQ0VTU09SX1Y4NTAgfSwKLQoteyAic2xkLmgiLCAgICAgIG9uZSAoMHgwMDcwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q1XzQsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5oIiwJb25lICgweDA0MDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q4XzcsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwRSB9LAoteyAic2xkLmgiLAlvbmUgKDB4MDQwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDhfNywgRVAsICAgUjJ9LCAJMSwgUFJPQ0VTU09SX1Y4NTAgfSwKLXsgInNsZC53IiwJb25lICgweDA1MDApLAkJb25lICgweDA3ODEpLAkgICAgICAJe0Q4XzYsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNzdC5iIiwJb25lICgweDAzODApLAkJb25lICgweDA3ODApLAkgICAgICAJe1IyLCAgIEQ3LCAgIEVQfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNzdC5oIiwJb25lICgweDA0ODApLAkJb25lICgweDA3ODApLAkgICAgICAJe1IyLCAgIEQ4XzcsIEVQfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNzdC53IiwJb25lICgweDA1MDEpLAkJb25lICgweDA3ODEpLAkgICAgICAJe1IyLCAgIEQ4XzYsIEVQfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLQoteyAicHVzaG1sIiwJdHdvICgweDA3ZTAsIDB4MDAwMSksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9MfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJwdXNobWgiLAl0d28gKDB4MDdlMCwgMHgwMDAzKSwJdHdvICgweGZmZjAsIDB4MDAwNyksIAl7TElTVDE4X0h9LCAJCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInBvcG1sIiwJdHdvICgweDA3ZjAsIDB4MDAwMSksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9MfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJwb3BtaCIsCXR3byAoMHgwN2YwLCAweDAwMDMpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfSH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMDMpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTUsIFNQfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMGIpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTUsIElNTTE2fSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMTMpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTUsIElNTTE2fSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMWIpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTUsIElNTTMyfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAicHJlcGFyZSIsICAgIHR3byAoMHgwNzgwLCAweDAwMDEpLAl0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtMSVNUMTIsIElNTTV9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXNwb3NlIiwJb25lICgweDA2NDApLCAgICAgICAgICAgb25lICgweGZmYzApLCAgICAgICAgIAl7SU1NNSwgTElTVDEyLCBSMkRJU1BPU0V9LDAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGlzcG9zZSIsCXR3byAoMHgwNjQwLCAweDAwMDApLCAgIHR3byAoMHhmZmMwLCAweDAwMWYpLCAJe0lNTTUsIExJU1QxMn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQoteyAibGQuYiIsCXR3byAoMHgwNzAwLCAweDAwMDApLAl0d28gKDB4MDdlMCwgMHgwMDAwKSwgCXtEMTYsIFIxLCBSMn0sIAkJMSwgUFJPQ0VTU09SX0FMTCB9LAoteyAibGQuaCIsCXR3byAoMHgwNzIwLCAweDAwMDApLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtEMTZfMTUsIFIxLCBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJsZC53IiwJdHdvICgweDA3MjAsIDB4MDAwMSksCXR3byAoMHgwN2UwLCAweDAwMDEpLCAJe0QxNl8xNSwgUjEsIFIyfSwgCTEsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkLmJ1IiwJdHdvICgweDA3ODAsIDB4MDAwMSksICAgdHdvICgweDA3YzAsIDB4MDAwMSksIAl7RDE2XzE2LCBSMSwgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImxkLmh1IiwJdHdvICgweDA3ZTAsIDB4MDAwMSksICAgdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7RDE2XzE1LCBSMSwgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwgIAoteyAic3QuYiIsCXR3byAoMHgwNzQwLCAweDAwMDApLAl0d28gKDB4MDdlMCwgMHgwMDAwKSwgCXtSMiwgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3QuaCIsCXR3byAoMHgwNzYwLCAweDAwMDApLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtSMiwgRDE2XzE1LCBSMX0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdC53IiwJdHdvICgweDA3NjAsIDB4MDAwMSksCXR3byAoMHgwN2UwLCAweDAwMDEpLCAJe1IyLCBEMTZfMTUsIFIxfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLQotLyogYnl0ZSBzd2FwL2V4dGVuZCBpbnN0cnVjdGlvbnMgKi8KLXsgInp4YiIsCW9uZSAoMHgwMDgwKSwJCW9uZSAoMHhmZmUwKSwgCSAgICAgIAl7UjFfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJ6eGgiLAlvbmUgKDB4MDBjMCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInN4YiIsCW9uZSAoMHgwMGEwKSwJCW9uZSAoMHhmZmUwKSwgCSAgICAgIAl7UjFfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJzeGgiLAlvbmUgKDB4MDBlMCksCQlvbmUgKDB4ZmZlMCksCSAgICAgIAl7UjFfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJic2giLAl0d28gKDB4MDdlMCwgMHgwMzQyKSwJdHdvICgweDA3ZmYsIDB4MDdmZiksIAl7UjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImJzdyIsCXR3byAoMHgwN2UwLCAweDAzNDApLAl0d28gKDB4MDdmZiwgMHgwN2ZmKSwgCXtSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiaHN3IiwJdHdvICgweDA3ZTAsIDB4MDM0NCksCXR3byAoMHgwN2ZmLCAweDA3ZmYpLCAJe1IyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIGp1bXAgdGFibGUgaW5zdHJ1Y3Rpb25zICovCi17ICJzd2l0Y2giLAlvbmUgKDB4MDA0MCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxfSwgCQkJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjYWxsdCIsCW9uZSAoMHgwMjAwKSwJCW9uZSAoMHhmZmMwKSwgCSAgICAgIAl7STZ9LCAJCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImN0cmV0IiwgCXR3byAoMHgwN2UwLCAweDAxNDQpLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwgCXswfSwgCQkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIGFyaXRobWV0aWMgb3BlcmF0aW9uIGluc3RydWN0aW9ucyAqLwoteyAic2V0ZiIsCXR3byAoMHgwN2UwLCAweDAwMDApLAl0d28gKDB4MDdmMCwgMHhmZmZmKSwgCXtDQ0NDLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY21vdiIsCXR3byAoMHgwN2UwLCAweDAzMjApLAl0d28gKDB4MDdlMCwgMHgwN2UxKSwgCXtNT1ZDQywgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImNtb3YiLAl0d28gKDB4MDdlMCwgMHgwMzAwKSwJdHdvICgweDA3ZTAsIDB4MDdlMSksIAl7TU9WQ0MsIEk1LCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLXsgIm11bCIsCXR3byAoMHgwN2UwLCAweDAyMjApLAl0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm11bCIsCXR3byAoMHgwN2UwLCAweDAyNDApLAl0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJOSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm11bHUiLAl0d28gKDB4MDdlMCwgMHgwMjIyKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtdWx1IiwJdHdvICgweDA3ZTAsIDB4MDI0MiksCXR3byAoMHgwN2UwLCAweDA3YzMpLCAJe1U5LCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi17ICJkaXYiLAl0d28gKDB4MDdlMCwgMHgwMmMwKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZ1IiwJdHdvICgweDA3ZTAsIDB4MDJjMiksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGl2aHUiLAl0d28gKDB4MDdlMCwgMHgwMjgyKSwgICB0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpdmgiLAl0d28gKDB4MDdlMCwgMHgwMjgwKSwgICB0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpdmgiLAlPUCAgKDB4MDIpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAotICAKLXsgImRpdmhuIiwJdHdvICgweDA3ZTAsIDB4MDI4MCksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAiZGl2aHVuIiwJdHdvICgweDA3ZTAsIDB4MDI4MiksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAiZGl2biIsCXR3byAoMHgwN2UwLCAweDAyYzApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgImRpdnVuIiwJdHdvICgweDA3ZTAsIDB4MDJjMiksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2RpdmhuIiwJdHdvICgweDA3ZTAsIDB4MDE4MCksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2Rpdmh1biIsCXR3byAoMHgwN2UwLCAweDAxODIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZuIiwJdHdvICgweDA3ZTAsIDB4MDFjMCksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2RpdnVuIiwJdHdvICgweDA3ZTAsIDB4MDFjMiksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAotICAKLXsgIm5vcCIsCW9uZSAoMHgwMCksCQlvbmUgKDB4ZmZmZiksCQl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm1vdiIsCU9QICAoMHgxMCksCQlPUF9NQVNLLAkJe0k1LCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3YiLAlvbmUgKDB4MDYyMCksCQlvbmUgKDB4ZmZlMCksCQl7SU1NMzIsIFIxX05PVFIwfSwJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtb3YiLCAgICAgICAgT1AgICgweDAwKSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm1vdmVhIiwJT1AgICgweDMxKSwJCU9QX01BU0ssCQl7STE2LCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3ZoaSIsCU9QICAoMHgzMiksCQlPUF9NQVNLLAkJe0kxNlUsIFIxLCBSMl9OT1RSMH0sCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImFkZCIsCU9QICAoMHgwZSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhZGQiLAlPUCAgKDB4MTIpLAkJT1BfTUFTSywJCUlGMiwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYWRkaSIsCU9QICAoMHgzMCksCQlPUF9NQVNLLAkJSUY2LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdWIiLAlPUCAgKDB4MGQpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3ViciIsIAlPUCAgKDB4MGMpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibXVsaCIsCU9QICAoMHgxNyksCQlPUF9NQVNLLAkJe0k1LCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtdWxoIiwJT1AgICgweDA3KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm11bGhpIiwJT1AgICgweDM3KSwJCU9QX01BU0ssCQl7STE2LCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJjbXAiLAlPUCAgKDB4MGYpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY21wIiwJT1AgICgweDEzKSwJCU9QX01BU0ssCQlJRjIsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLSAgCi0vKiBzYXR1cmF0ZWQgb3BlcmF0aW9uIGluc3RydWN0aW9ucyAqLwoteyAic2F0YWRkIiwJT1AgKDB4MTEpLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0YWRkIiwJT1AgKDB4MDYpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0c3ViIiwJT1AgKDB4MDUpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0c3ViaSIsCU9QICgweDMzKSwJCU9QX01BU0ssCQl7STE2LCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXRzdWJyIiwJT1AgKDB4MDQpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCi0vKiBsb2dpY2FsIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInRzdCIsCU9QICgweDBiKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm9yIiwJCU9QICgweDA4KSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm9yaSIsCU9QICgweDM0KSwJCU9QX01BU0ssCQlJRjZVLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhbmQiLAlPUCAoMHgwYSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhbmRpIiwJT1AgKDB4MzYpLAkJT1BfTUFTSywJCUlGNlUsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInhvciIsCU9QICgweDA5KSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInhvcmkiLAlPUCAoMHgzNSksCQlPUF9NQVNLLAkJSUY2VSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibm90IiwJT1AgKDB4MDEpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2FyIiwJT1AgKDB4MTUpLAkJT1BfTUFTSywJCXtJNVUsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXIiLAl0d28gKDB4MDdlMCwgMHgwMGEwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksIAl7UjEsICBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2hsIiwJT1AgICgweDE2KSwJCU9QX01BU0ssCSAgICAgIAl7STVVLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2hsIiwJdHdvICgweDA3ZTAsIDB4MDBjMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLCAJe1IxLCAgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNociIsCU9QICAoMHgxNCksCQlPUF9NQVNLLAkgICAgICAJe0k1VSwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNociIsCXR3byAoMHgwN2UwLCAweDAwODApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgCXtSMSwgIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXNmIiwgICAgICAgdHdvICgweDA3ZTAsIDB4MDIwMCksCXR3byAoMHgwN2YwLCAweGZmZmYpLCAJe0NDQ0MsIFIyfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQotLyogYnJhbmNoIGluc3RydWN0aW9ucyAqLwotCS8qIHNpZ25lZCBpbnRlZ2VyICovCi17ICJiZ3QiLAlCT1AgKDB4ZiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmdlIiwJQk9QICgweGUpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJsdCIsCUJPUCAoMHg2KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibGUiLAlCT1AgKDB4NyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIHVuc2lnbmVkIGludGVnZXIgKi8KLXsgImJoIiwJCUJPUCAoMHhiKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibmgiLAlCT1AgKDB4MyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmwiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJubCIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogY29tbW9uICovCi17ICJiZSIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm5lIiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiBvdGhlcnMgKi8KLXsgImJ2IiwJCUJPUCAoMHgwKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibnYiLAlCT1AgKDB4OCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm4iLAkJQk9QICgweDQpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJwIiwJCUJPUCAoMHhjKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJiYyIsCQlCT1AgKDB4MSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm5jIiwJQk9QICgweDkpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJ6IiwJCUJPUCAoMHgyKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibnoiLAlCT1AgKDB4YSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYnIiLAkJQk9QICgweDUpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJzYSIsCUJPUCAoMHhkKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0KLS8qIEJyYW5jaCBtYWNyb3MuCi0KLSAgIFdlIHVzZSB0aGUgc2hvcnQgZm9ybSBpbiB0aGUgb3Bjb2RlL21hc2sgZmllbGRzLiAgVGhlIGFzc2VtYmxlcgotICAgd2lsbCB0d2lkZGxlIGJpdHMgYXMgbmVjZXNzYXJ5IGlmIHRoZSBsb25nIGZvcm0gaXMgbmVlZGVkLiAgKi8KLQotCS8qIHNpZ25lZCBpbnRlZ2VyICovCi17ICJqZ3QiLAlCT1AgKDB4ZiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamdlIiwJQk9QICgweGUpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpsdCIsCUJPUCAoMHg2KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbGUiLAlCT1AgKDB4NyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIHVuc2lnbmVkIGludGVnZXIgKi8KLXsgImpoIiwJCUJPUCAoMHhiKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbmgiLAlCT1AgKDB4MyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamwiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpubCIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogY29tbW9uICovCi17ICJqZSIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam5lIiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiBvdGhlcnMgKi8KLXsgImp2IiwJCUJPUCAoMHgwKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbnYiLAlCT1AgKDB4OCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam4iLAkJQk9QICgweDQpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpwIiwJCUJPUCAoMHhjKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqYyIsCQlCT1AgKDB4MSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam5jIiwJQk9QICgweDkpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImp6IiwJCUJPUCAoMHgyKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbnoiLAlCT1AgKDB4YSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAianNhIiwJQk9QICgweGQpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpiciIsCUJPUCAoMHg1KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAoteyAianIiLAkJb25lICgweDA3ODApLAkJdHdvICgweGZmYzAsIDB4MDAwMSksCXtEMjJ9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqYXJsIiwJb25lICgweDA3ODApLAkJdHdvICgweDA3YzAsIDB4MDAwMSksCXtEMjIsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMfSwgCi0KLS8qIGJpdCBtYW5pcHVsYXRpb24gaW5zdHJ1Y3Rpb25zICovCi17ICJzZXQxIiwJdHdvICgweDA3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNldDEiLAl0d28gKDB4MDdlMCwgMHgwMGUwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMiwgUjF9LCAgICAJCTIsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibm90MSIsCXR3byAoMHg0N2MwLCAweDAwMDApLAl0d28gKDB4YzdlMCwgMHgwMDAwKSwJe0IzLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJub3QxIiwJdHdvICgweDA3ZTAsIDB4MDBlMiksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImNscjEiLAl0d28gKDB4ODdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY2xyMSIsCXR3byAoMHgwN2UwLCAweDAwZTQpLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgICB7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInRzdDEiLAl0d28gKDB4YzdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAidHN0MSIsCXR3byAoMHgwN2UwLCAweDAwZTYpLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zICovCi17ICJkaSIsCQl0d28gKDB4MDdlMCwgMHgwMTYwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiZWkiLAkJdHdvICgweDg3ZTAsIDB4MDE2MCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImhhbHQiLAl0d28gKDB4MDdlMCwgMHgwMTIwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAicmV0aSIsCXR3byAoMHgwN2UwLCAweDAxNDApLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ0cmFwIiwJdHdvICgweDA3ZTAsIDB4MDEwMCksCXR3byAoMHhmZmUwLCAweGZmZmYpLAl7STVVfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibGRzciIsCXR3byAoMHgwN2UwLCAweDAwMjApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IxLCBTUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN0c3IiLAl0d28gKDB4MDdlMCwgMHgwMDQwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtTUjEsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17IDAsIDAsIDAsIHswfSwgMCwgMCB9LAotCi19IDsKLQotY29uc3QgaW50IHY4NTBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKHY4NTBfb3Bjb2RlcykgLyBzaXplb2YgKHY4NTBfb3Bjb2Rlc1swXSk7Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvdmF4LWRpcy5jIGIvb3Bjb2Rlcy92YXgtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjU5ZjMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy92YXgtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyogUHJpbnQgVkFYIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFBhdWxpbmUgTWlkZGVsaW5rIDxtaWRkZWxpbkBwb2x5d2FyZS5pYWYubmw+Ci0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJvcGNvZGUvdmF4LmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0vKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgYmZkX3ZtYSwKLQkJCWRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX21vZGUgUEFSQU1TICgoaW50LCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgY2hhciAqcmVnX25hbWVzW10gPQotewotICAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAotICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJhcCIsICJmcCIsICJzcCIsICJwYyIKLX07Ci0KLS8qIFNpZ24tZXh0ZW5kIGFuICh1bnNpZ25lZCBjaGFyKS4gKi8KLSNpZiBfX1NURENfXyA9PSAxCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChzaWduZWQgY2hhcikoY2gpKQotI2Vsc2UKLSNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKGludCkoKChjaCkgXiAweDgwKSAmIDB4RkYpIC0gMTI4KQotI2VuZGlmCi0KLS8qIEdldCBhIDEgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIE5FWFRCWVRFKHApICBcCi0gIChwICs9IDEsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gIENPRVJDRV9TSUdORURfQ0hBUihwWy0xXSkpCi0KLS8qIEdldCBhIDIgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIENPRVJDRTE2KHgpICgoaW50KSAoKCh4KSBeIDB4ODAwMCkgLSAweDgwMDApKQotI2RlZmluZSBORVhUV09SRChwKSAgXAotICAocCArPSAyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgQ09FUkNFMTYgKChwWy0xXSA8PCA4KSArIHBbLTJdKSkKLQotLyogR2V0IGEgNCBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgQ09FUkNFMzIoeCkgKChpbnQpICgoKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKSkKLSNkZWZpbmUgTkVYVExPTkcocCkgIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIChDT0VSQ0UzMiAoKCgoKChwWy0xXSA8PCA4KSArIHBbLTJdKSA8PCA4KSArIHBbLTNdKSA8PCA4KSArIHBbLTRdKSkpCi0KLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDI1Ci0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopIGluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFByaW50IHRoZSB2YXggaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIElORk8tPlNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLwotCi1pbnQKLXByaW50X2luc25fdmF4IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCB2b3QgKnZvdHA7Ci0gIGNvbnN0IGNoYXIgKmFyZ3AgPSBOVUxMOwotICB1bnNpZ25lZCBjaGFyICphcmc7Ci0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAyKTsKLSAgZm9yICh2b3RwID0gJnZvdHN0cnNbMF07IHZvdHAtPm5hbWVbMF07IHZvdHArKykKLSAgICB7Ci0gICAgICByZWdpc3RlciB2YXhfb3Bjb2RlVCBvcGNvZGUgPSB2b3RwLT5kZXRhaWwuY29kZTsKLQotICAgICAgLyogMiBieXRlIGNvZGVzIG1hdGNoIDIgYnVmZmVyIHBvcy4gKi8KLSAgICAgIGlmICgoYmZkX2J5dGUpIG9wY29kZSA9PSBidWZmZXJbMF0KLQkgICYmIChvcGNvZGUgPj4gOCA9PSAwIHx8IG9wY29kZSA+PiA4ID09IGJ1ZmZlclsxXSkpCi0JewotCSAgYXJncCA9IHZvdHAtPmRldGFpbC5hcmdzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKGFyZ3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLndvcmQgMHgleCIsCi0JCQkgICAgIChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV0pOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gIC8qIFBvaW50IGF0IGZpcnN0IGJ5dGUgb2YgYXJndW1lbnQgZGF0YSwgYW5kIGF0IGRlc2NyaXB0b3IgZm9yIGZpcnN0Ci0gICAgIGFyZ3VtZW50LiAgKi8KLSAgYXJnID0gYnVmZmVyICsgKCh2b3RwLT5kZXRhaWwuY29kZSA+PiA4KSA/IDIgOiAxKTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBpdCBpbiBtZW0gKi8KLSAgRkVUQ0hfREFUQSAoaW5mbywgYXJnKTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgdm90cC0+bmFtZSk7Ci0gIGlmICgqYXJncCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQotICB3aGlsZSAoKmFyZ3ApCi0gICAgewotICAgICAgYXJnICs9IHByaW50X2luc25fYXJnIChhcmdwLCBhcmcsIG1lbWFkZHIgKyBhcmcgLSBidWZmZXIsIGluZm8pOwotICAgICAgYXJncCArPSAyOwotICAgICAgaWYgKCphcmdwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgIH0KLQotICByZXR1cm4gYXJnIC0gYnVmZmVyOwotfQotCi0vKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyAiZWF0ZW4iIGJ5IHRoZSBvcGVyYW5kLCBvciByZXR1cm4gLTEgaWYgYW4KLSAgIGludmFsaWQgb3BlcmFuZCB3YXMgZm91bmQsIG9yIC0yIGlmIGFuIG9wY29kZSB0YWJlbCBlcnJvciB3YXMKLSAgIGZvdW5kLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyAoZCwgcDAsIGFkZHIsIGluZm8pCi0gICAgIGNvbnN0IGNoYXIgKmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnAwOwotICAgICBiZmRfdm1hIGFkZHI7CQkvKiBQQyBmb3IgdGhpcyBhcmcgdG8gYmUgcmVsYXRpdmUgdG8gKi8KLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGFyZ19sZW47Ci0KLSAgLyogY2hlY2sgdmFsaWRpdHkgb2YgYWRkcmVzc2luZyBsZW5ndGggKi8KLSAgc3dpdGNoIChkWzFdKQotICAgIHsKLSAgICBjYXNlICdiJyA6IGFyZ19sZW4gPSAxOwlicmVhazsKLSAgICBjYXNlICdkJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKLSAgICBjYXNlICdmJyA6IGFyZ19sZW4gPSA0OwlicmVhazsKLSAgICBjYXNlICdnJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKLSAgICBjYXNlICdoJyA6IGFyZ19sZW4gPSAxNjsJYnJlYWs7Ci0gICAgY2FzZSAnbCcgOiBhcmdfbGVuID0gNDsJYnJlYWs7Ci0gICAgY2FzZSAnbycgOiBhcmdfbGVuID0gMTY7CWJyZWFrOwotICAgIGNhc2UgJ3cnIDogYXJnX2xlbiA9IDI7CWJyZWFrOwotICAgIGNhc2UgJ3EnIDogYXJnX2xlbiA9IDg7CWJyZWFrOwotICAgIGRlZmF1bHQgIDogYWJvcnQoKTsKLSAgICB9Ci0KLSAgLyogYnJhbmNoZXMgaGF2ZSBubyBtb2RlIGJ5dGUgKi8KLSAgaWYgKGRbMF0gPT0gJ2InKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBwMDsKLQotICAgICAgaWYgKGFyZ19sZW4gPT0gMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAxICsgTkVYVEJZVEUgKHApLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAyICsgTkVYVFdPUkQgKHApLCBpbmZvKTsKLQotICAgICAgcmV0dXJuIHAgLSBwMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHByaW50X2luc25fbW9kZSAoYXJnX2xlbiwgcDAsIGFkZHIsIGluZm8pOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX21vZGUgKHNpemUsIHAwLCBhZGRyLCBpbmZvKQotICAgICBpbnQgc2l6ZTsKLSAgICAgdW5zaWduZWQgY2hhciAqcDA7Ci0gICAgIGJmZF92bWEgYWRkcjsJCS8qIFBDIGZvciB0aGlzIGFyZyB0byBiZSByZWxhdGl2ZSB0byAqLwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBjaGFyICpwID0gcDA7Ci0gIHVuc2lnbmVkIGNoYXIgbW9kZSwgcmVnOwotCi0gIC8qIGZldGNoIGFuZCBpbnRlcnByZXQgbW9kZSBieXRlICovCi0gIG1vZGUgPSAodW5zaWduZWQgY2hhcikgTkVYVEJZVEUgKHApOwotICByZWcgPSBtb2RlICYgMHhGOwotICBzd2l0Y2ggKG1vZGUgJiAweEYwKQotICAgIHsKLSAgICBjYXNlIDB4MDA6Ci0gICAgY2FzZSAweDEwOgotICAgIGNhc2UgMHgyMDoKLSAgICBjYXNlIDB4MzA6IC8qIGxpdGVyYWwgbW9kZQkJCSRudW1iZXIgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJDB4JXgiLCBtb2RlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg0MDogLyogaW5kZXg6CQkJYmFzZS1hZGRyW1JuXSAqLwotICAgICAgcCArPSBwcmludF9pbnNuX21vZGUgKHNpemUsIHAwICsgMSwgYWRkciArIDEsIGluZm8pOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbJXNdIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDUwOiAvKiByZWdpc3RlcjoJCQlSbiAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg2MDogLyogcmVnaXN0ZXIgZGVmZXJyZWQ6CQkoUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiglcykiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NzA6IC8qIGF1dG9kZWNyZW1lbnQ6CQktKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItKCVzKSIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg4MDogLyogYXV0b2luY3JlbWVudDoJCShSbikrICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQl7CS8qIGltbWVkaWF0ZT8gKi8KLQkgIGludCBpOwotCi0JICBGRVRDSF9EQVRBIChpbmZvLCBwICsgc2l6ZSk7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQweCIpOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlMDJ4IiwgcFtzaXplIC0gaSAtIDFdKTsKLQkgIHAgKz0gc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoJXMpKyIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg5MDogLyogYXV0b2luY3JlbWVudCBkZWZlcnJlZDoJQChSbikrICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioweCV4IiwgTkVYVExPTkcgKHApKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoJXMpKyIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhCMDogLyogZGlzcGxhY2VtZW50IGJ5dGUgZGVmZXJyZWQ6CSpkaXNwbChSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKiIpOwotICAgIGNhc2UgMHhBMDogLyogZGlzcGxhY2VtZW50IGJ5dGU6CQlkaXNwbChSbikgKi8KLSAgICAgIGlmIChyZWcgPT0gMHhGKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDIgKyBORVhUQllURSAocCksIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCglcykiLCBORVhUQllURSAocCksCi0JCQkgICAgICAgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweEQwOiAvKiBkaXNwbGFjZW1lbnQgd29yZCBkZWZlcnJlZDoJKmRpc3BsKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqIik7Ci0gICAgY2FzZSAweEMwOiAvKiBkaXNwbGFjZW1lbnQgd29yZDoJCWRpc3BsKFJuKSAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMyArIE5FWFRXT1JEIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4KCVzKSIsIE5FWFRXT1JEIChwKSwKLQkJCSAgICAgICByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4RjA6IC8qIGRpc3BsYWNlbWVudCBsb25nIGRlZmVycmVkOgkqZGlzcGwoUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioiKTsKLSAgICBjYXNlIDB4RTA6IC8qIGRpc3BsYWNlbWVudCBsb25nOgkJZGlzcGwoUm4pICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyA1ICsgTkVYVExPTkcgKHApLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgoJXMpIiwgTkVYVExPTkcgKHApLAotCQkJICAgICAgIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcCAtIHAwOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy93NjUtZGlzLmMgYi9vcGNvZGVzL3c2NS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyZTg5Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3c2NS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBXREMgNjU4MTYgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgU1RBVElDX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAidzY1LW9wYy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotc3RhdGljICAgZnByaW50Zl9mdHlwZSBmcHI7Ci1zdGF0aWMgICB2b2lkICpzdHJlYW07Ci1zdGF0aWMgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqbG9jYWxfaW5mbzsKLSNpZiAwCi1zdGF0aWMgY2hhciAqbG5hbWVbXSA9ICB7InIwIiwicjEiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiwicjciLCJzMCJ9OwotCi1zdGF0aWMgY2hhciAqZmluZG5hbWUgKHZhbCkKLSAgICAgdW5zaWduZWQgaW50IHZhbDsKLXsKLSAgaWYgKHZhbCA+PSAweDEwICYmIHZhbCA8PSAweDIwKQotICAgIHJldHVybiBsbmFtZVsodmFsIC0gMHgxMCkgLyAyXTsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChsb29rdXAsIGZvcm1hdCwgYXJncykKLSAgICAgaW50IGxvb2t1cDsKLSAgICAgY2hhciAqZm9ybWF0OwotICAgICB1bnNpZ25lZCAgICAgaW50ICphcmdzOwotewotICBpbnQgdmFsOwotICBpbnQgYzsKLQotICB3aGlsZSAoKmZvcm1hdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCBjID0gKmZvcm1hdCsrKSAKLQl7Ci0JY2FzZSAnJCc6Ci0JICB2YWwgPSBhcmdzWygqZm9ybWF0KyspIC0gJzAnXTsKLQkgIGlmIChsb29rdXApIAotCSAgICB7Ci0jaWYgMAotCSAgICAgIG5hbWUgPSBmaW5kbmFtZSh2YWwpOwotCSAgICAgIGlmIChuYW1lKQotCQlmcHIoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkgICAgICBlbHNlCi0jZW5kaWYKLQkJbG9jYWxfaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGxvY2FsX2luZm8pOyAgCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgZnByIChzdHJlYW0sICIweCV4IiwgdmFsKTsKLQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGZwcihzdHJlYW0sIiVjIiwgYyk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotaW50IAotcHJpbnRfaW5zbl93NjUobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLQotCi0gIGludCBzdGF0dXMgPSAwOwotICB1bnNpZ25lZCBjaGFyIGluc25bNF07Ci0gIHJlZ2lzdGVyIHN0cnVjdCBvcGluZm8gKm9wOwotICBpbnQgaTsKLSAgaW50IFggPTA7Ci0gIGludCBNID0gMDsKLSAgaW50IGFyZ3NbMl07Ci1zdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwciA9IGluZm8tPmZwcmludGZfZnVuYzsKLWxvY2FsX2luZm8gPSAgICBpbmZvOwotICBmb3IgKGkgPSAwOyBpIDw0ICYmIHN0YXR1cyA9PSAwOyBpKyspIAotICAgIHsKLSAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKG1lbWFkZHIraSwgaW5zbiArIGksIDEsIGluZm8pOwotICB9Ci0KLQotICBmb3IgKG9wID0gb3B0YWJsZTsgb3AtPnZhbCAhPSBpbnNuWzBdOyBvcCsrKSAKLSAgICA7Ci0KLSAgZnByKHN0cmVhbSwiJXMiLCBvcC0+bmFtZSk7Ci0gIAotICAvKiBQcmVwYXJlIGFsbCB0aGUgcG9zaWJsZSBvcGVyYW5kIHZhbHVlcyAqLwotICB7Ci0gICAgaW50IHNpemUgPSAxOwotICAgIGludCBhc1JfVzY1X0FCUzggPSBpbnNuWzFdOwotICAgIGludCBhc1JfVzY1X0FCUzE2ID0gKGluc25bMl0gPDwgOCkgKyBhc1JfVzY1X0FCUzg7Ci0gICAgaW50IGFzUl9XNjVfQUJTMjQgPSAoaW5zblszXSA8PCAxNikgKyBhc1JfVzY1X0FCUzE2OwotICAgIGludCBhc1JfVzY1X1BDUjggPSAoKGNoYXIpKGFzUl9XNjVfQUJTOCkpICsgbWVtYWRkciArIDI7Ci0gICAgaW50IGFzUl9XNjVfUENSMTYgPSAoKHNob3J0KShhc1JfVzY1X0FCUzE2KSkgKyBtZW1hZGRyICsgMzsKLQotICAgIHN3aXRjaCAob3AtPmFtb2RlKSB7Ci0gICAgICBESVNBU00oKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHNpemU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy93NjUtb3BjLmggYi9vcGNvZGVzL3c2NS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjMzUzNS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3c2NS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0OCArMCwwIEBACi0JCQkvKiBXREMgNjU4MTYgQXNzZW1ibGVyIG9wY29kZSB0YWJsZSAqLwotCQkJLyogICAoZ2VuZXJhdGVkIGJ5IHRoZSBwcm9ncmFtIHNpbS93NjUvZ2VuY29kZSAtYSkgKi8KLSNkZWZpbmUgQUREUl9JTU1UT0EgICAgICAgICAgICAgIDEJIC8qICNhICAgICAgKi8KLSNkZWZpbmUgQUREUl9JTU1DT1AgICAgICAgICAgICAgIDIJIC8qICNjICAgICAgKi8KLSNkZWZpbmUgQUREUl9JTU1UT0kgICAgICAgICAgICAgIDMJIC8qICNpICAgICAgKi8KLSNkZWZpbmUgQUREUl9BQ0MgICAgICAgICAgICAgICAgIDQJIC8qIEEgICAgICAgKi8KLSNkZWZpbmUgQUREUl9QQ19SRUwgICAgICAgICAgICAgIDUJIC8qIHIgICAgICAgKi8KLSNkZWZpbmUgQUREUl9QQ19SRUxfTE9ORyAgICAgICAgIDYJIC8qIHJsICAgICAgKi8KLSNkZWZpbmUgQUREUl9JTVBMSUVEICAgICAgICAgICAgIDcJIC8qIGkgICAgICAgKi8KLSNkZWZpbmUgQUREUl9TVEFDSyAgICAgICAgICAgICAgIDgJIC8qIHMgICAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVIgICAgICAgICAgICAgICAgIDkJIC8qIGQgICAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSURYX1ggICAgICAgICAgIDEwCSAvKiBkLHggICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lEWF9ZICAgICAgICAgICAxMQkgLyogZCx5ICAgICAqLwotI2RlZmluZSBBRERSX0RJUl9JTkQgICAgICAgICAgICAgMTIJIC8qIChkKSAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSURYX0lORF9YICAgICAgIDEzCSAvKiAoZCx4KSAgICovCi0jZGVmaW5lIEFERFJfRElSX0lORF9JRFhfWSAgICAgICAxNAkgLyogKGQpLHkgICAqLwotI2RlZmluZSBBRERSX0RJUl9JTkRfTE9ORyAgICAgICAgMTUJIC8qIFtkXSAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkcgIDE2CSAvKiBbZF0seSAgICovCi0jZGVmaW5lIEFERFJfQUJTICAgICAgICAgICAgICAgICAxNwkgLyogYSAgICAgICAqLwotI2RlZmluZSBBRERSX0FCU19JRFhfWCAgICAgICAgICAgMTgJIC8qIGEseCAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSURYX1kgICAgICAgICAgIDE5CSAvKiBhLHkgICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0xPTkcgICAgICAgICAgICAyMAkgLyogYWwgICAgICAqLwotI2RlZmluZSBBRERSX0FCU19JTkRfTE9ORyAgICAgICAgMjEJIC8qIFthXSAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfTE9OR19JRFhfWCAgICAgIDIyCSAvKiBhbCx4ICAgICovCi0jZGVmaW5lIEFERFJfU1RBQ0tfUkVMICAgICAgICAgICAyMwkgLyogZCxzICAgICAqLwotI2RlZmluZSBBRERSX1NUQUNLX1JFTF9JTkRYX0lEWCAgMjQJIC8qIChkLHMpLHkgKi8KLSNkZWZpbmUgQUREUl9BQlNfSU5EICAgICAgICAgICAgIDI1CSAvKiAoYSkgICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0lORF9JRFggICAgICAgICAyNgkgLyogKGEseCkgICAqLwotI2RlZmluZSBBRERSX0JMT0NLX01PVkUgICAgICAgICAgMjcJIC8qIHh5eiAgICAgKi8KLXN0cnVjdCBvcGluZm8gewotCWludCB2YWw7Ci0JaW50IGNvZGU7Ci0JY2hhciAqbmFtZTsKLQlpbnQgYW1vZGU7Ci19Owotc3RydWN0IG9waW5mbyBvcHRhYmxlWzI1N109ewotI2RlZmluZSBPX2FkYyAxCi0jZGVmaW5lIE9fYW5kIDIKLSNkZWZpbmUgT19hc2wgMwotI2RlZmluZSBPX2JjYyA0Ci0jZGVmaW5lIE9fYmNzIDUKLSNkZWZpbmUgT19iZXEgNgotI2RlZmluZSBPX2JpdCA3Ci0jZGVmaW5lIE9fYm1pIDgKLSNkZWZpbmUgT19ibmUgOQotI2RlZmluZSBPX2JwbCAxMAotI2RlZmluZSBPX2JyYSAxMQotI2RlZmluZSBPX2JyayAxMgotI2RlZmluZSBPX2JybCAxMwotI2RlZmluZSBPX2J2YyAxNAotI2RlZmluZSBPX2J2cyAxNQotI2RlZmluZSBPX2NsYyAxNgotI2RlZmluZSBPX2NsZCAxNwotI2RlZmluZSBPX2NsaSAxOAotI2RlZmluZSBPX2NsdiAxOQotI2RlZmluZSBPX2NtcCAyMAotI2RlZmluZSBPX2NvcCAyMQotI2RlZmluZSBPX2NweCAyMgotI2RlZmluZSBPX2NweSAyMwotI2RlZmluZSBPX2RlYyAyNAotI2RlZmluZSBPX2RleCAyNQotI2RlZmluZSBPX2RleSAyNgotI2RlZmluZSBPX2VvciAyNwotI2RlZmluZSBPX2luYyAyOAotI2RlZmluZSBPX2lueCAyOQotI2RlZmluZSBPX2lueSAzMAotI2RlZmluZSBPX2ptcCAzMQotI2RlZmluZSBPX2pzciAzMgotI2RlZmluZSBPX2xkYSAzMwotI2RlZmluZSBPX2xkeCAzNAotI2RlZmluZSBPX2xkeSAzNQotI2RlZmluZSBPX2xzciAzNgotI2RlZmluZSBPX212biAzNwotI2RlZmluZSBPX212cCAzOAotI2RlZmluZSBPX25vcCAzOQotI2RlZmluZSBPX29yYSA0MAotI2RlZmluZSBPX3BlYSA0MQotI2RlZmluZSBPX3BlaSA0MgotI2RlZmluZSBPX3BlciA0MwotI2RlZmluZSBPX3BoYSA0NAotI2RlZmluZSBPX3BoYiA0NQotI2RlZmluZSBPX3BoZCA0NgotI2RlZmluZSBPX3BoayA0NwotI2RlZmluZSBPX3BocCA0OAotI2RlZmluZSBPX3BoeCA0OQotI2RlZmluZSBPX3BoeSA1MAotI2RlZmluZSBPX3BsYSA1MQotI2RlZmluZSBPX3BsYiA1MgotI2RlZmluZSBPX3BsZCA1MwotI2RlZmluZSBPX3BscCA1NAotI2RlZmluZSBPX3BseCA1NQotI2RlZmluZSBPX3BseSA1NgotI2RlZmluZSBPX3JlcCA1NwotI2RlZmluZSBPX3JvbCA1OAotI2RlZmluZSBPX3JvciA1OQotI2RlZmluZSBPX3J0aSA2MAotI2RlZmluZSBPX3J0bCA2MQotI2RlZmluZSBPX3J0cyA2MgotI2RlZmluZSBPX3NiYyA2MwotI2RlZmluZSBPX3NlYyA2NAotI2RlZmluZSBPX3NlZCA2NQotI2RlZmluZSBPX3NlaSA2NgotI2RlZmluZSBPX3NlcCA2NwotI2RlZmluZSBPX3N0YSA2OAotI2RlZmluZSBPX3N0cCA2OQotI2RlZmluZSBPX3N0eCA3MAotI2RlZmluZSBPX3N0eSA3MQotI2RlZmluZSBPX3N0eiA3MgotI2RlZmluZSBPX3RheCA3MwotI2RlZmluZSBPX3RheSA3NAotI2RlZmluZSBPX3RjZCA3NQotI2RlZmluZSBPX3RjcyA3NgotI2RlZmluZSBPX3RkYyA3NwotI2RlZmluZSBPX3RyYiA3OAotI2RlZmluZSBPX3RzYiA3OQotI2RlZmluZSBPX3RzYyA4MAotI2RlZmluZSBPX3RzeCA4MQotI2RlZmluZSBPX3R4YSA4MgotI2RlZmluZSBPX3R4cyA4MwotI2RlZmluZSBPX3R4eSA4NAotI2RlZmluZSBPX3R5YSA4NQotI2RlZmluZSBPX3R5eCA4NgotI2RlZmluZSBPX3dhaSA4NwotI2RlZmluZSBPX3dkbSA4OAotI2RlZmluZSBPX3hiYSA4OQotI2RlZmluZSBPX3hjZSA5MAotI2lmZGVmIERFRklORV9UQUJMRQotCXsweDY5LAlPX2FkYywJImFkYyIsCUFERFJfSU1NVE9BfSwKLQl7MHg3MiwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkR9LAotCXsweDcxLAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4NzMsCU9fYWRjLAkiYWRjIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweDYxLAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4NjcsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweDc3LAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHg2RCwJT19hZGMsCSJhZGMiLAlBRERSX0FCU30sCi0JezB4N0QsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDc5LAlPX2FkYywJImFkYyIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHg2RiwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19MT05HfSwKLQl7MHg3RiwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHg2NSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUn0sCi0JezB4NjMsCU9fYWRjLAkiYWRjIiwJQUREUl9TVEFDS19SRUx9LAotCXsweDc1LAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHgyOSwJT19hbmQsCSJhbmQiLAlBRERSX0lNTVRPQX0sCi0JezB4MzIsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EfSwKLQl7MHgzMSwJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDMzLAlPX2FuZCwJImFuZCIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHgyMSwJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDI3LAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHgzNywJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4MkQsCU9fYW5kLAkiYW5kIiwJQUREUl9BQlN9LAotCXsweDNELAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHgzOSwJT19hbmQsCSJhbmQiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4MkYsCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfTE9OR30sCi0JezB4M0YsCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4MjUsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJ9LAotCXsweDIzLAlPX2FuZCwJImFuZCIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHgzNSwJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MEEsCU9fYXNsLAkiYXNsIiwJQUREUl9BQ0N9LAotCXsweDBFLAlPX2FzbCwJImFzbCIsCUFERFJfQUJTfSwKLQl7MHgxRSwJT19hc2wsCSJhc2wiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MDYsCU9fYXNsLAkiYXNsIiwJQUREUl9ESVJ9LAotCXsweDE2LAlPX2FzbCwJImFzbCIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg5MCwJT19iY2MsCSJiY2MiLAlBRERSX1BDX1JFTH0sCi0JezB4QjAsCU9fYmNzLAkiYmNzIiwJQUREUl9QQ19SRUx9LAotCXsweEYwLAlPX2JlcSwJImJlcSIsCUFERFJfUENfUkVMfSwKLQl7MHg4OSwJT19iaXQsCSJiaXQiLAlBRERSX0lNTVRPQX0sCi0JezB4MjQsCU9fYml0LAkiYml0IiwJQUREUl9ESVJfSU5EfSwKLQl7MHgzNCwJT19iaXQsCSJiaXQiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDJDLAlPX2JpdCwJImJpdCIsCUFERFJfQUJTfSwKLQl7MHgzQywJT19iaXQsCSJiaXQiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MzAsCU9fYm1pLAkiYm1pIiwJQUREUl9QQ19SRUx9LAotCXsweEQwLAlPX2JuZSwJImJuZSIsCUFERFJfUENfUkVMfSwKLQl7MHgxMCwJT19icGwsCSJicGwiLAlBRERSX1BDX1JFTH0sCi0JezB4ODAsCU9fYnJhLAkiYnJhIiwJQUREUl9QQ19SRUx9LAotCXsweDAwLAlPX2JyaywJImJyayIsCUFERFJfU1RBQ0t9LAotCXsweDgyLAlPX2JybCwJImJybCIsCUFERFJfUENfUkVMX0xPTkd9LAotCXsweDUwLAlPX2J2YywJImJ2YyIsCUFERFJfUENfUkVMfSwKLQl7MHg3MCwJT19idnMsCSJidnMiLAlBRERSX1BDX1JFTH0sCi0JezB4MTgsCU9fY2xjLAkiY2xjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhEOCwJT19jbGQsCSJjbGQiLAlBRERSX0lNUExJRUR9LAotCXsweDU4LAlPX2NsaSwJImNsaSIsCUFERFJfSU1QTElFRH0sCi0JezB4QjgsCU9fY2x2LAkiY2x2IiwJQUREUl9JTVBMSUVEfSwKLQl7MHhDOSwJT19jbXAsCSJjbXAiLAlBRERSX0lNTVRPQX0sCi0JezB4RDIsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EfSwKLQl7MHhEMSwJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweEQzLAlPX2NtcCwJImNtcCIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHhDMSwJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweEM3LAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHhENywJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4Q0QsCU9fY21wLAkiY21wIiwJQUREUl9BQlN9LAotCXsweERELAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhEOSwJT19jbXAsCSJjbXAiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4Q0YsCU9fY21wLAkiY21wIiwJQUREUl9BQlNfTE9OR30sCi0JezB4REYsCU9fY21wLAkiY21wIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4QzUsCU9fY21wLAkiY21wIiwJQUREUl9ESVJ9LAotCXsweEMzLAlPX2NtcCwJImNtcCIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHhENSwJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MDIsCU9fY29wLAkiY29wIiwJQUREUl9JTU1DT1B9LAotCXsweEUwLAlPX2NweCwJImNweCIsCUFERFJfSU1NVE9JfSwKLQl7MHhFQywJT19jcHgsCSJjcHgiLAlBRERSX0FCU30sCi0JezB4RTQsCU9fY3B4LAkiY3B4IiwJQUREUl9ESVJ9LAotCXsweEMwLAlPX2NweSwJImNweSIsCUFERFJfSU1NVE9JfSwKLQl7MHhDQywJT19jcHksCSJjcHkiLAlBRERSX0FCU30sCi0JezB4QzQsCU9fY3B5LAkiY3B5IiwJQUREUl9ESVJ9LAotCXsweDNBLAlPX2RlYywJImRlYyIsCUFERFJfQUNDfSwKLQl7MHhDRSwJT19kZWMsCSJkZWMiLAlBRERSX0FCU30sCi0JezB4REUsCU9fZGVjLAkiZGVjIiwJQUREUl9BQlNfSURYX1h9LAotCXsweEM2LAlPX2RlYywJImRlYyIsCUFERFJfRElSfSwKLQl7MHhENiwJT19kZWMsCSJkZWMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4Q0EsCU9fZGV4LAkiZGV4IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg4OCwJT19kZXksCSJkZXkiLAlBRERSX0lNUExJRUR9LAotCXsweDQ5LAlPX2VvciwJImVvciIsCUFERFJfSU1NVE9BfSwKLQl7MHg1MiwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkR9LAotCXsweDUxLAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4NTMsCU9fZW9yLAkiZW9yIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweDQxLAlPX2VvciwJImVvciIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4NDcsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweDU3LAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHg0RCwJT19lb3IsCSJlb3IiLAlBRERSX0FCU30sCi0JezB4NUQsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDU5LAlPX2VvciwJImVvciIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHg0RiwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19MT05HfSwKLQl7MHg1RiwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHg0NSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUn0sCi0JezB4NDMsCU9fZW9yLAkiZW9yIiwJQUREUl9TVEFDS19SRUx9LAotCXsweDU1LAlPX2VvciwJImVvciIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHgxQSwJT19pbmMsCSJpbmMiLAlBRERSX0FDQ30sCi0JezB4RUUsCU9faW5jLAkiaW5jIiwJQUREUl9BQlN9LAotCXsweEZFLAlPX2luYywJImluYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhFNiwJT19pbmMsCSJpbmMiLAlBRERSX0RJUn0sCi0JezB4RjYsCU9faW5jLAkiaW5jIiwJQUREUl9ESVJfSURYX1h9LAotCXsweEU4LAlPX2lueCwJImlueCIsCUFERFJfSU1QTElFRH0sCi0JezB4QzgsCU9faW55LAkiaW55IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg2QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkR9LAotCXsweDdDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0lORF9JRFh9LAotCXsweERDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0lORF9MT05HfSwKLQl7MHg0QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU30sCi0JezB4NUMsCU9fam1wLAkiam1wIiwJQUREUl9BQlNfTE9OR30sCi0JezB4RkMsCU9fanNyLAkianNyIiwJQUREUl9BQlNfSU5EX0lEWH0sCi0JezB4MjAsCU9fanNyLAkianNyIiwJQUREUl9BQlN9LAotCXsweDIyLAlPX2pzciwJImpzciIsCUFERFJfQUJTX0xPTkd9LAotCXsweEE5LAlPX2xkYSwJImxkYSIsCUFERFJfSU1NVE9BfSwKLQl7MHhCMiwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkR9LAotCXsweEIxLAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4QjMsCU9fbGRhLAkibGRhIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweEExLAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4QTcsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweEI3LAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHhBRCwJT19sZGEsCSJsZGEiLAlBRERSX0FCU30sCi0JezB4QkQsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfSURYX1h9LAotCXsweEI5LAlPX2xkYSwJImxkYSIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHhBRiwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19MT05HfSwKLQl7MHhCRiwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHhBNSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUn0sCi0JezB4QTMsCU9fbGRhLAkibGRhIiwJQUREUl9TVEFDS19SRUx9LAotCXsweEI1LAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhBMiwJT19sZHgsCSJsZHgiLAlBRERSX0lNTVRPSX0sCi0JezB4QUUsCU9fbGR4LAkibGR4IiwJQUREUl9BQlN9LAotCXsweEJFLAlPX2xkeCwJImxkeCIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHhBNiwJT19sZHgsCSJsZHgiLAlBRERSX0RJUn0sCi0JezB4QjYsCU9fbGR4LAkibGR4IiwJQUREUl9ESVJfSURYX1l9LAotCXsweEEwLAlPX2xkeSwJImxkeSIsCUFERFJfSU1NVE9JfSwKLQl7MHhBQywJT19sZHksCSJsZHkiLAlBRERSX0FCU30sCi0JezB4QkMsCU9fbGR5LAkibGR5IiwJQUREUl9BQlNfSURYX1h9LAotCXsweEE0LAlPX2xkeSwJImxkeSIsCUFERFJfRElSfSwKLQl7MHhCNCwJT19sZHksCSJsZHkiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NEEsCU9fbHNyLAkibHNyIiwJQUREUl9BQ0N9LAotCXsweDRFLAlPX2xzciwJImxzciIsCUFERFJfQUJTfSwKLQl7MHg1RSwJT19sc3IsCSJsc3IiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4NDYsCU9fbHNyLAkibHNyIiwJQUREUl9ESVJ9LAotCXsweDU2LAlPX2xzciwJImxzciIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg1NCwJT19tdm4sCSJtdm4iLAlBRERSX0JMT0NLX01PVkV9LAotCXsweDQ0LAlPX212cCwJIm12cCIsCUFERFJfQkxPQ0tfTU9WRX0sCi0JezB4RUEsCU9fbm9wLAkibm9wIiwJQUREUl9JTVBMSUVEfSwKLQl7MHgwOSwJT19vcmEsCSJvcmEiLAlBRERSX0lNTVRPQX0sCi0JezB4MTIsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EfSwKLQl7MHgxMSwJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDEzLAlPX29yYSwJIm9yYSIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHgwMSwJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDA3LAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHgxNywJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4MEQsCU9fb3JhLAkib3JhIiwJQUREUl9BQlN9LAotCXsweDFELAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHgxOSwJT19vcmEsCSJvcmEiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4MEYsCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfTE9OR30sCi0JezB4MUYsCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4MDUsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJ9LAotCXsweDAzLAlPX29yYSwJIm9yYSIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHgxNSwJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4RjQsCU9fcGVhLAkicGVhIiwJQUREUl9BQlN9LAotCXsweEQ0LAlPX3BlaSwJInBlaSIsCUFERFJfRElSfSwKLQl7MHg2MiwJT19wZXIsCSJwZXIiLAlBRERSX1BDX1JFTF9MT05HfSwKLQl7MHg0OCwJT19waGEsCSJwaGEiLAlBRERSX1NUQUNLfSwKLQl7MHg4QiwJT19waGIsCSJwaGIiLAlBRERSX1NUQUNLfSwKLQl7MHgwQiwJT19waGQsCSJwaGQiLAlBRERSX1NUQUNLfSwKLQl7MHg0QiwJT19waGssCSJwaGsiLAlBRERSX1NUQUNLfSwKLQl7MHgwOCwJT19waHAsCSJwaHAiLAlBRERSX1NUQUNLfSwKLQl7MHhEQSwJT19waHgsCSJwaHgiLAlBRERSX1NUQUNLfSwKLQl7MHg1QSwJT19waHksCSJwaHkiLAlBRERSX1NUQUNLfSwKLQl7MHg2OCwJT19wbGEsCSJwbGEiLAlBRERSX1NUQUNLfSwKLQl7MHhBQiwJT19wbGIsCSJwbGIiLAlBRERSX1NUQUNLfSwKLQl7MHgyQiwJT19wbGQsCSJwbGQiLAlBRERSX1NUQUNLfSwKLQl7MHgyOCwJT19wbHAsCSJwbHAiLAlBRERSX1NUQUNLfSwKLQl7MHhGQSwJT19wbHgsCSJwbHgiLAlBRERSX1NUQUNLfSwKLQl7MHg3QSwJT19wbHksCSJwbHkiLAlBRERSX1NUQUNLfSwKLQl7MHhDMiwJT19yZXAsCSJyZXAiLAlBRERSX0lNTUNPUH0sCi0JezB4MkEsCU9fcm9sLAkicm9sIiwJQUREUl9BQ0N9LAotCXsweDJFLAlPX3JvbCwJInJvbCIsCUFERFJfQUJTfSwKLQl7MHgzRSwJT19yb2wsCSJyb2wiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MjYsCU9fcm9sLAkicm9sIiwJQUREUl9ESVJ9LAotCXsweDM2LAlPX3JvbCwJInJvbCIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg2QSwJT19yb3IsCSJyb3IiLAlBRERSX0FDQ30sCi0JezB4NkUsCU9fcm9yLAkicm9yIiwJQUREUl9BQlN9LAotCXsweDdFLAlPX3JvciwJInJvciIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg2NiwJT19yb3IsCSJyb3IiLAlBRERSX0RJUn0sCi0JezB4NzYsCU9fcm9yLAkicm9yIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDQwLAlPX3J0aSwJInJ0aSIsCUFERFJfU1RBQ0t9LAotCXsweDZCLAlPX3J0bCwJInJ0bCIsCUFERFJfU1RBQ0t9LAotCXsweDYwLAlPX3J0cywJInJ0cyIsCUFERFJfU1RBQ0t9LAotCXsweEU5LAlPX3NiYywJInNiYyIsCUFERFJfSU1NVE9BfSwKLQl7MHhGMiwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkR9LAotCXsweEYxLAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4RjMsCU9fc2JjLAkic2JjIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweEUxLAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4RTcsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweEY3LAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHhFRCwJT19zYmMsCSJzYmMiLAlBRERSX0FCU30sCi0JezB4RkQsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfSURYX1h9LAotCXsweEY5LAlPX3NiYywJInNiYyIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHhFRiwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19MT05HfSwKLQl7MHhGRiwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHhFNSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUn0sCi0JezB4RTMsCU9fc2JjLAkic2JjIiwJQUREUl9TVEFDS19SRUx9LAotCXsweEY1LAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHgzOCwJT19zZWMsCSJzZWMiLAlBRERSX0lNUExJRUR9LAotCXsweEY4LAlPX3NlZCwJInNlZCIsCUFERFJfSU1QTElFRH0sCi0JezB4NzgsCU9fc2VpLAkic2VpIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhFMiwJT19zZXAsCSJzZXAiLAlBRERSX0lNTUNPUH0sCi0JezB4OTIsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EfSwKLQl7MHg5MSwJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDkzLAlPX3N0YSwJInN0YSIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHg4MSwJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDg3LAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHg5NywJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4OEQsCU9fc3RhLAkic3RhIiwJQUREUl9BQlN9LAotCXsweDlELAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg5OSwJT19zdGEsCSJzdGEiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4OEYsCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfTE9OR30sCi0JezB4OUYsCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4ODUsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJ9LAotCXsweDgzLAlPX3N0YSwJInN0YSIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHg5NSwJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4REIsCU9fc3RwLAkic3RwIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg4RSwJT19zdHgsCSJzdHgiLAlBRERSX0FCU30sCi0JezB4ODYsCU9fc3R4LAkic3R4IiwJQUREUl9ESVJ9LAotCXsweDk2LAlPX3N0eCwJInN0eCIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg4QywJT19zdHksCSJzdHkiLAlBRERSX0FCU30sCi0JezB4ODQsCU9fc3R5LAkic3R5IiwJQUREUl9ESVJ9LAotCXsweDk0LAlPX3N0eSwJInN0eSIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg5QywJT19zdHosCSJzdHoiLAlBRERSX0FCU30sCi0JezB4OUUsCU9fc3R6LAkic3R6IiwJQUREUl9BQlNfSURYX1h9LAotCXsweDY0LAlPX3N0eiwJInN0eiIsCUFERFJfRElSfSwKLQl7MHg3NCwJT19zdHosCSJzdHoiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4QUEsCU9fdGF4LAkidGF4IiwJQUREUl9JTVBMSUVEfSwKLQl7MHhBOCwJT190YXksCSJ0YXkiLAlBRERSX0lNUExJRUR9LAotCXsweDVCLAlPX3RjZCwJInRjZCIsCUFERFJfSU1QTElFRH0sCi0JezB4MUIsCU9fdGNzLAkidGNzIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg3QiwJT190ZGMsCSJ0ZGMiLAlBRERSX0lNUExJRUR9LAotCXsweDFDLAlPX3RyYiwJInRyYiIsCUFERFJfQUJTfSwKLQl7MHgxNCwJT190cmIsCSJ0cmIiLAlBRERSX0RJUn0sCi0JezB4MEMsCU9fdHNiLAkidHNiIiwJQUREUl9BQlN9LAotCXsweDA0LAlPX3RzYiwJInRzYiIsCUFERFJfRElSfSwKLQl7MHgzQiwJT190c2MsCSJ0c2MiLAlBRERSX0lNUExJRUR9LAotCXsweEJBLAlPX3RzeCwJInRzeCIsCUFERFJfSU1QTElFRH0sCi0JezB4OEEsCU9fdHhhLAkidHhhIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg5QSwJT190eHMsCSJ0eHMiLAlBRERSX0lNUExJRUR9LAotCXsweDlCLAlPX3R4eSwJInR4eSIsCUFERFJfSU1QTElFRH0sCi0JezB4OTgsCU9fdHlhLAkidHlhIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhCQiwJT190eXgsCSJ0eXgiLAlBRERSX0lNUExJRUR9LAotCXsweENCLAlPX3dhaSwJIndhaSIsCUFERFJfSU1QTElFRH0sCi0JezB4NDIsCU9fd2RtLAkid2RtIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhFQiwJT194YmEsCSJ4YmEiLAlBRERSX0lNUExJRUR9LAotCXsweEZCLAlPX3hjZSwJInhjZSIsCUFERFJfSU1QTElFRH0sCi0JeyAwIH0KLX07Ci0jZW5kaWYKLSNkZWZpbmUgRElTQVNNKClcCi0gIGNhc2UgQUREUl9JTU1UT0E6XAotCWFyZ3NbMF0gPSBNPT0wID8gYXNSX1c2NV9BQlMxNiA6IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkjJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSBNPT0wID8gMjoxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9JTU1DT1A6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJIyQwIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfSU1NVE9JOlwKLQlhcmdzWzBdID0gWD09MCA/IGFzUl9XNjVfQUJTMTYgOiBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJIyQwIiwgYXJncyk7XAotCXNpemUgKz0gWD09MCA/IDI6MTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUNDOlwKLQlwcmludF9vcGVyYW5kICgwLCAiCWEiLCAwKTtcCi0Jc2l6ZSArPSAwO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9QQ19SRUw6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X1BDUjg7XAotCXByaW50X29wZXJhbmQgKDAsICIJJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9QQ19SRUxfTE9ORzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfUENSMTY7XAotCXByaW50X29wZXJhbmQgKDAsICIJJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9JTVBMSUVEOlwKLQkJc2l6ZSArPSAwO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9TVEFDSzpcCi0JCXNpemUgKz0gMDtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCTwkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JRFhfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk8JDAseCIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JRFhfWTpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk8JDAseSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JTkQ6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJKDwkMCkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSURYX0lORF9YOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSg8JDAseCkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSg8JDApLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJWyQwXSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JTkRfSURYX1lfTE9ORzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIglbJDBdLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlM6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSEkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19JRFhfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJISQwLHgiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSURYX1k6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSEkMCx5IiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzI0O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCT4kMCIsIGFyZ3MpO1wKLQlzaXplICs9IDM7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19JTkRfTE9ORzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJWz4kMF0iLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfTE9OR19JRFhfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMjQ7XAotCXByaW50X29wZXJhbmQgKDEsICIJPiQwLHgiLCBhcmdzKTtcCi0Jc2l6ZSArPSAzO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9TVEFDS19SRUw6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJJDAscyIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX1NUQUNLX1JFTF9JTkRYX0lEWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkoJDAscykseSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19JTkQ6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSgkMCkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSU5EX0lEWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJKCQwLHgpIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQkxPQ0tfTU9WRTpcCi0JYXJnc1swXSA9IChhc1JfVzY1X0FCUzE2ID4+OCkgJjB4ZmY7XAotCWFyZ3NbMV0gPSAoIGFzUl9XNjVfQUJTMTYgJiAweGZmKTtcCi0JcHJpbnRfb3BlcmFuZCAoMCwiCSQwLCQxIixhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0KLSNkZWZpbmUgR0VUSU5GTyhzaXplLHR5cGUscGNyZWwpXAotCWNhc2UgQUREUl9JTU1UT0E6IHNpemUgPSBNPT0wID8gMjoxO3R5cGU9TT09MCA/IFJfVzY1X0FCUzE2IDogUl9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfSU1NQ09QOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0lNTVRPSTogc2l6ZSA9IFg9PTAgPyAyOjE7dHlwZT1YPT0wID8gUl9XNjVfQUJTMTYgOiBSX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQ0M6IHNpemUgPSAwO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1BDX1JFTDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9QQ1I4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9QQ19SRUxfTE9ORzogc2l6ZSA9IDI7dHlwZT1SX1c2NV9QQ1IxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfSU1QTElFRDogc2l6ZSA9IDA7dHlwZT0tMTtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfU1RBQ0s6IHNpemUgPSAwO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUjogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSURYX1g6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lEWF9ZOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JTkQ6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lEWF9JTkRfWDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JTkRfTE9ORzogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkc6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSURYX1g6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JRFhfWTogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0xPTkc6IHNpemUgPSAzO3R5cGU9Ul9XNjVfQUJTMjQ7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JTkRfTE9ORzogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0xPTkdfSURYX1g6IHNpemUgPSAzO3R5cGU9Ul9XNjVfQUJTMjQ7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1NUQUNLX1JFTDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9TVEFDS19SRUxfSU5EWF9JRFg6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lORDogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lORF9JRFg6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0JMT0NLX01PVkU6IHNpemUgPSAyO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvejhrLWRpcy5jIGIvb3Bjb2Rlcy96OGstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjM2MjIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy96OGstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgejgwMDAgY29kZS4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlICJ6OGstb3BjLmgiCi0KLQwKLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotDAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlc2UgYXJlIGFsbCBpbmRleGVkIGJ5IG5pYmJsZSBudW1iZXIgKGkuZSBvbmx5IGV2ZXJ5IG90aGVyIGVudHJ5Ci0gICAgIG9mIGJ5dGVzIGlzIHVzZWQsIGFuZCBldmVyeSA0dGggZW50cnkgb2Ygd29yZHMpLiAgKi8KLSAgdW5zaWduZWQgY2hhciBuaWJibGVzWzI0XTsKLSAgdW5zaWduZWQgY2hhciBieXRlc1syNF07Ci0gIHVuc2lnbmVkIHNob3J0IHdvcmRzWzI0XTsKLQotICAvKiBOaWJibGUgbnVtYmVyIG9mIGZpcnN0IHdvcmQgbm90IHlldCBmZXRjaGVkLiAgKi8KLSAgaW50IG1heF9mZXRjaGVkOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLQotICBsb25nIHRhYmxfaW5kZXg7Ci0gIGNoYXIgaW5zdHJfYXNtc3JjWzgwXTsKLSAgdW5zaWduZWQgbG9uZyBhcmdfcmVnWzB4MGZdOwotICB1bnNpZ25lZCBsb25nIGltbWVkaWF0ZTsKLSAgdW5zaWduZWQgbG9uZyBkaXNwbGFjZW1lbnQ7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgdW5zaWduZWQgbG9uZyBjb25kX2NvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgY3RybF9jb2RlOwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICB1bnNpZ25lZCBsb25nIGludGVycnVwdHM7Ci19Ci1pbnN0cl9kYXRhX3M7Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIG5pYmJsZSkgXAotICAoKG5pYmJsZSkgPCAoKGluc3RyX2RhdGFfcyAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAobmliYmxlKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIG5pYmJsZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBuaWJibGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbXlidWZbMjBdOwotICBpbnQgc3RhdHVzOwotICBpbnN0cl9kYXRhX3MgKnByaXYgPSAoaW5zdHJfZGF0YV9zICopaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0gIGlmICgobmliYmxlICUgNCkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwcml2LT5pbnNuX3N0YXJ0LAotCQkJCSAgICAgIChiZmRfYnl0ZSAqKSBteWJ1ZiwKLQkJCQkgICAgICBuaWJibGUgLyAyLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcHJpdi0+aW5zbl9zdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0KLSAgewotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBteWJ1ZiA7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IG5pYmJsZTspCi0gICAgICB7Ci0JcHJpdi0+d29yZHNbaV0gPSAocFswXSA8PCA4KSB8IHBbMV07Ci0JCi0JcHJpdi0+Ynl0ZXNbaV0gPSAqcDsKLQlwcml2LT5uaWJibGVzW2krK10gPSAqcCA+PiA0OwotCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwICYweGY7Ci0KLQkrK3A7Ci0JcHJpdi0+Ynl0ZXNbaV0gPSAqcDsKLQlwcml2LT5uaWJibGVzW2krK10gPSAqcCA+PiA0OwotCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwICYgMHhmOwotCi0JKytwOwotICAgICAgfQotICB9Ci0gIHByaXYtPm1heF9mZXRjaGVkID0gbmliYmxlOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKmNvZGVzWzE2XSA9Ci17Ci0gICJmIiwKLSAgImx0IiwKLSAgImxlIiwKLSAgInVsZSIsCi0gICJvdi9wZSIsCi0gICJtaSIsCi0gICJlcSIsCi0gICJjL3VsdCIsCi0gICJ0IiwKLSAgImdlIiwKLSAgImd0IiwKLSAgInVndCIsCi0gICJub3YvcG8iLAotICAicGwiLAotICAibmUiLAotICAibmMvdWdlIgotfTsKLQotaW50IHo4a19sb29rdXBfaW5zdHIgUEFSQU1TICgodW5zaWduZWQgY2hhciosIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIHZvaWQgb3V0cHV0X2luc3RyCi0gIFBBUkFNUyAoKGluc3RyX2RhdGFfcyAqLCB1bnNpZ25lZCBsb25nLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyB2b2lkIHVucGFja19pbnN0ciBQQVJBTVMgKChpbnN0cl9kYXRhX3MgKiwgaW50LCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyB2b2lkIHVucGFyc2VfaW5zdHIgUEFSQU1TICgoaW5zdHJfZGF0YV9zICopKTsKLQotc3RhdGljIGludAotcHJpbnRfaW5zbl96OGsgKGFkZHIsIGluZm8sIGlzX3NlZ21lbnRlZCkKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgaXNfc2VnbWVudGVkOwotewotICBpbnN0cl9kYXRhX3MgaW5zdHJfZGF0YTsKLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmaW5zdHJfZGF0YTsKLSAgaW5zdHJfZGF0YS5tYXhfZmV0Y2hlZCA9IDA7Ci0gIGluc3RyX2RhdGEuaW5zbl9zdGFydCA9IGFkZHI7Ci0gIGlmIChzZXRqbXAgKGluc3RyX2RhdGEuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotICBpbnN0cl9kYXRhLnRhYmxfaW5kZXggPSB6OGtfbG9va3VwX2luc3RyIChpbnN0cl9kYXRhLm5pYmJsZXMsIGluZm8pOwotICBpZiAoaW5zdHJfZGF0YS50YWJsX2luZGV4ID4gMCkKLSAgICB7Ci0gICAgICB1bnBhY2tfaW5zdHIgKCZpbnN0cl9kYXRhLCBpc19zZWdtZW50ZWQsIGluZm8pOwotICAgICAgdW5wYXJzZV9pbnN0ciAoJmluc3RyX2RhdGEpOwotICAgICAgb3V0cHV0X2luc3RyICgmaW5zdHJfZGF0YSwgYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gejhrX3RhYmxlW2luc3RyX2RhdGEudGFibF9pbmRleF0ubGVuZ3RoOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIDQpOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIud29yZCAlMDJ4JTAyeCIsCi0JCQkgICAgIGluc3RyX2RhdGEuYnl0ZXNbMF0sIGluc3RyX2RhdGEuYnl0ZXNbMl0pOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotfQotCi1pbnQKLXByaW50X2luc25fejgwMDEgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc25fejhrIChhZGRyLCBpbmZvLCAxKTsKLX0KLQotaW50Ci1wcmludF9pbnNuX3o4MDAyIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3o4ayAoYWRkciwgaW5mbywgMCk7Ci19Ci0KLWludAotejhrX2xvb2t1cF9pbnN0ciAobmliYmxlcywgaW5mbykKLSAgICAgdW5zaWduZWQgY2hhciAqbmliYmxlczsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLQotICBpbnQgbmlibF9pbmRleCwgdGFibF9pbmRleDsKLSAgaW50IG5pYmxfbWF0Y2hlZDsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdHJfbmlibDsKLSAgdW5zaWduZWQgc2hvcnQgdGFibF9kYXR1bSwgZGF0dW1fY2xhc3MsIGRhdHVtX3ZhbHVlOwotCi0gIG5pYmxfbWF0Y2hlZCA9IDA7Ci0gIHRhYmxfaW5kZXggPSAwOwotICB3aGlsZSAoIW5pYmxfbWF0Y2hlZCAmJiB6OGtfdGFibGVbdGFibF9pbmRleF0ubmFtZSkKLSAgICB7Ci0gICAgICBuaWJsX21hdGNoZWQgPSAxOwotICAgICAgZm9yIChuaWJsX2luZGV4ID0gMDsgbmlibF9pbmRleCA8IHo4a190YWJsZVt0YWJsX2luZGV4XS5sZW5ndGggKiAyICYmIG5pYmxfbWF0Y2hlZDsgbmlibF9pbmRleCsrKQotCXsKLQkgIGlmICgobmlibF9pbmRleCAlIDQpID09IDApCi0JICAgIC8qIEZldGNoIG9uZSB3b3JkIGF0IGEgdGltZS4gICovCi0JICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfaW5kZXggKyA0KTsKLQkgIGluc3RyX25pYmwgPSBuaWJibGVzW25pYmxfaW5kZXhdOwotCi0JICB0YWJsX2RhdHVtID0gejhrX3RhYmxlW3RhYmxfaW5kZXhdLmJ5dGVfaW5mb1tuaWJsX2luZGV4XTsKLQkgIGRhdHVtX2NsYXNzID0gdGFibF9kYXR1bSAmIENMQVNTX01BU0s7Ci0JICBkYXR1bV92YWx1ZSA9IH5DTEFTU19NQVNLICYgdGFibF9kYXR1bTsKLQotCSAgc3dpdGNoIChkYXR1bV9jbGFzcykKLQkgICAgewotCSAgICBjYXNlIENMQVNTX0JJVDoKLQkgICAgICBpZiAoZGF0dW1fdmFsdWUgIT0gaW5zdHJfbmlibCkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18wMElJOgotCSAgICAgIGlmICghKCh+aW5zdHJfbmlibCkgJiAweDQpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzAxSUk6Ci0JICAgICAgaWYgKCEoaW5zdHJfbmlibCAmIDB4NCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMENDQzoKLQkgICAgICBpZiAoISgofmluc3RyX25pYmwpICYgMHg4KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18xQ0NDOgotCSAgICAgIGlmICghKGluc3RyX25pYmwgJiAweDgpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzBESVNQNzoKLQkgICAgICBpZiAoISgofmluc3RyX25pYmwpICYgMHg4KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBuaWJsX2luZGV4ICs9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMURJU1A3OgotCSAgICAgIGlmICghKGluc3RyX25pYmwgJiAweDgpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIG5pYmxfaW5kZXggKz0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU19SRUdOMDoKLQkgICAgICBpZiAoaW5zdHJfbmlibCA9PSAwKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTX0JJVF8xT1IyOgotCSAgICAgIGlmICgoaW5zdHJfbmlibCB8IDB4MikgIT0gKGRhdHVtX3ZhbHVlIHwgMHgyKSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChuaWJsX21hdGNoZWQpCi0JewotCSAgcmV0dXJuIHRhYmxfaW5kZXg7Ci0JfQotCi0gICAgICB0YWJsX2luZGV4Kys7Ci0gICAgfQotICByZXR1cm4gLTE7Ci0KLX0KLQotc3RhdGljIHZvaWQKLW91dHB1dF9pbnN0ciAoaW5zdHJfZGF0YSwgYWRkciwgaW5mbykKLSAgICAgaW5zdHJfZGF0YV9zICppbnN0cl9kYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBsb29wLCBsb29wX2xpbWl0OwotICBjaGFyIHRtcF9zdHJbMjBdOwotICBjaGFyIG91dF9zdHJbMTAwXTsKLQotICBzdHJjcHkgKG91dF9zdHIsICJcdCIpOwotCi0gIGxvb3BfbGltaXQgPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0ubGVuZ3RoICogMjsKLSAgRkVUQ0hfREFUQSAoaW5mbywgbG9vcF9saW1pdCk7Ci0gIGZvciAobG9vcCA9IDA7IGxvb3AgPCBsb29wX2xpbWl0OyBsb29wKyspCi0gICAgewotICAgICAgc3ByaW50ZiAodG1wX3N0ciwgIiV4IiwgaW5zdHJfZGF0YS0+bmliYmxlc1tsb29wXSk7Ci0gICAgICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotICAgIH0KLQotICB3aGlsZSAobG9vcCsrIDwgOCkKLSAgICB7Ci0gICAgICBzdHJjYXQgKG91dF9zdHIsICIgIik7Ci0gICAgfQotCi0gIHN0cmNhdCAob3V0X3N0ciwgaW5zdHJfZGF0YS0+aW5zdHJfYXNtc3JjKTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3V0X3N0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi11bnBhY2tfaW5zdHIgKGluc3RyX2RhdGEsIGlzX3NlZ21lbnRlZCwgaW5mbykKLSAgICAgaW5zdHJfZGF0YV9zICppbnN0cl9kYXRhOwotICAgICBpbnQgaXNfc2VnbWVudGVkOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgbmlibF9jb3VudCwgbG9vcDsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdHJfbmlibCwgaW5zdHJfYnl0ZSwgaW5zdHJfd29yZDsKLSAgbG9uZyBpbnN0cl9sb25nOwotICB1bnNpZ25lZCBzaG9ydCB0YWJsX2RhdHVtLCBkYXR1bV9jbGFzcywgZGF0dW1fdmFsdWU7Ci0KLSAgbmlibF9jb3VudCA9IDA7Ci0gIGxvb3AgPSAwOwotICB3aGlsZSAoejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmJ5dGVfaW5mb1tsb29wXSAhPSAwKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfY291bnQgKyA0IC0gKG5pYmxfY291bnQgJSA0KSk7Ci0gICAgICBpbnN0cl9uaWJsID0gaW5zdHJfZGF0YS0+bmliYmxlc1tuaWJsX2NvdW50XTsKLSAgICAgIGluc3RyX2J5dGUgPSBpbnN0cl9kYXRhLT5ieXRlc1tuaWJsX2NvdW50XTsKLSAgICAgIGluc3RyX3dvcmQgPSBpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50XTsKLQotICAgICAgdGFibF9kYXR1bSA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5ieXRlX2luZm9bbG9vcF07Ci0gICAgICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOwotICAgICAgZGF0dW1fdmFsdWUgPSB0YWJsX2RhdHVtICYgfkNMQVNTX01BU0s7Ci0KLSAgICAgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCi0JewotCWNhc2UgQ0xBU1NfWDoKLQkgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CQToKLQkgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JYOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19ESVNQOgotCSAgc3dpdGNoIChkYXR1bV92YWx1ZSkKLQkgICAgewotCSAgICBjYXNlIEFSR19ESVNQMTY6Ci0JICAgICAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfd29yZDsKLQkgICAgICBuaWJsX2NvdW50ICs9IDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0RJU1AxMjoKLQkgICAgICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl93b3JkICYgMHgwZmZmOwotCSAgICAgIG5pYmxfY291bnQgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JTU06Ci0JICBzd2l0Y2ggKGRhdHVtX3ZhbHVlKQotCSAgICB7Ci0JICAgIGNhc2UgQVJHX0lNTTQ6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfTklNODoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSAoLWluc3RyX2J5dGUpOwotCSAgICAgIG5pYmxfY291bnQgKz0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NODoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9ieXRlOwotCSAgICAgIG5pYmxfY291bnQgKz0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NMTY6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfd29yZDsKLQkgICAgICBuaWJsX2NvdW50ICs9IDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTMyOgotCSAgICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfY291bnQgKyA4KTsKLQkgICAgICBpbnN0cl9sb25nID0gKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnRdIDw8IDE2KQotCQl8IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50ICsgNF0pOwotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX2xvbmc7Ci0JICAgICAgbmlibF9jb3VudCArPSA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU1OOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmwgLSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU00TTE6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibCArIDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTV8xOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTV8yOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTI6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibCAmIDB4MzsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DQzoKLQkgIGluc3RyX2RhdGEtPmNvbmRfY29kZSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NUUkw6Ci0JICBpbnN0cl9kYXRhLT5jdHJsX2NvZGUgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19EQToKLQljYXNlIENMQVNTX0FERFJFU1M6Ci0JICBpZiAoaXNfc2VnbWVudGVkKQotCSAgICB7Ci0JICAgICAgaWYgKGluc3RyX25pYmwgJiAweDgpCi0JCXsKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2NvdW50ICsgOCk7Ci0JCSAgaW5zdHJfbG9uZyA9IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50XSA8PCAxNikKLQkJICAgIHwgKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnQgKyA0XSk7Ci0JCSAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9ICgoaW5zdHJfd29yZCAmIDB4N2YwMCkgPDwgOCkgKwotCQkgICAgKGluc3RyX2xvbmcgJiAweGZmZmYpOwotCQkgIG5pYmxfY291bnQgKz0gNzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSAoKGluc3RyX3dvcmQgJiAweDdmMDApIDw8IDgpICsKLQkJICAgIChpbnN0cl93b3JkICYgMHgwMGZmKTsKLQkJICBuaWJsX2NvdW50ICs9IDM7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9IGluc3RyX3dvcmQ7Ci0JICAgICAgbmlibF9jb3VudCArPSAzOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzBDQ0M6Ci0JICBpbnN0cl9kYXRhLT5jb25kX2NvZGUgPSBpbnN0cl9uaWJsICYgMHg3OwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18xQ0NDOgotCSAgaW5zdHJfZGF0YS0+Y29uZF9jb2RlID0gaW5zdHJfbmlibCAmIDB4NzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMERJU1A3OgotCSAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfYnl0ZSAmIDB4N2Y7Ci0JICBuaWJsX2NvdW50ICs9IDE7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzFESVNQNzoKLQkgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX2J5dGUgJiAweDdmOwotCSAgbmlibF9jb3VudCArPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wMUlJOgotCSAgaW5zdHJfZGF0YS0+aW50ZXJydXB0cyA9IGluc3RyX25pYmwgJiAweDM7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzAwSUk6Ci0JICBpbnN0cl9kYXRhLT5pbnRlcnJ1cHRzID0gaW5zdHJfbmlibCAmIDB4MzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQklUOgotCSAgLyogZG8gbm90aGluZyAqLwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JUjoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRkxBR1M6Ci0JICBpbnN0cl9kYXRhLT5mbGFncyA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFRzoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX0JZVEU6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19XT1JEOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfUVVBRDoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR04wOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbG9vcCArPSAxOwotICAgICAgbmlibF9jb3VudCArPSAxOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXVucGFyc2VfaW5zdHIgKGluc3RyX2RhdGEpCi0gICAgIGluc3RyX2RhdGFfcyAqaW5zdHJfZGF0YTsKLXsKLSAgdW5zaWduZWQgc2hvcnQgdGFibF9kYXR1bSwgZGF0dW1fY2xhc3MsIGRhdHVtX3ZhbHVlOwotICBpbnQgbG9vcCwgbG9vcF9saW1pdDsKLSAgY2hhciBvdXRfc3RyWzgwXSwgdG1wX3N0clsyNV07Ci0KLSAgc3ByaW50ZiAob3V0X3N0ciwgIlx0JXNcdCIsIHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5uYW1lKTsKLQotICBsb29wX2xpbWl0ID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLm5vcGVyYW5kczsKLSAgZm9yIChsb29wID0gMDsgbG9vcCA8IGxvb3BfbGltaXQ7IGxvb3ArKykKLSAgICB7Ci0gICAgICBpZiAobG9vcCkKLQlzdHJjYXQgKG91dF9zdHIsICIsIik7Ci0KLSAgICAgIHRhYmxfZGF0dW0gPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0uYXJnX2luZm9bbG9vcF07Ci0gICAgICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOwotICAgICAgZGF0dW1fdmFsdWUgPSB0YWJsX2RhdHVtICYgfkNMQVNTX01BU0s7Ci0KLSAgICAgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCi0JewotCWNhc2UgQ0xBU1NfWDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIweCUwbHgoUiVsZCkiLCBpbnN0cl9kYXRhLT5hZGRyZXNzLAotCQkgICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CQToKLQkgIHNwcmludGYgKHRtcF9zdHIsICJyJWxkKCMlbHgpIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0sCi0JCSAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CWDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJyJWxkKFIlbGQpIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0sCi0JCSAgIGluc3RyX2RhdGEtPmFyZ19yZWdbQVJHX1JYXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19ESVNQOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIiMweCUwbHgiLCBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSU1NOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIiMweCUwbHgiLCBpbnN0cl9kYXRhLT5pbW1lZGlhdGUpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ0M6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiJXMiLCBjb2Rlc1tpbnN0cl9kYXRhLT5jb25kX2NvZGVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NUUkw6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiMHglMGx4IiwgaW5zdHJfZGF0YS0+Y3RybF9jb2RlKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RBOgotCWNhc2UgQ0xBU1NfQUREUkVTUzoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIjMHglMGx4IiwgaW5zdHJfZGF0YS0+YWRkcmVzcyk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JUjoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJAUiVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0ZMQUdTOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIjB4JTBseCIsIGluc3RyX2RhdGEtPmZsYWdzKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19CWVRFOgotCSAgaWYgKGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID49IDB4OCkKLQkgICAgewotCSAgICAgIHNwcmludGYgKHRtcF9zdHIsICJybCVsZCIsCi0JCSAgICAgICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSAtIDB4OCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNwcmludGYgKHRtcF9zdHIsICJyaCVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgICAgfQotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiciVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19RVUFEOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInJxJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAicnIlbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgc3RyY3B5IChpbnN0cl9kYXRhLT5pbnN0cl9hc21zcmMsIG91dF9zdHIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy96OGstb3BjLmggYi9vcGNvZGVzL3o4ay1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5YTNhMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3o4ay1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MzggKzAsMCBAQAotCQkJLyogVEhJUyBGSUxFIElTIEFVVE9NQUdJQ0FMTFkgR0VORVJBVEVELCBET04nVCBFRElUIElUICovCi0jZGVmaW5lIEFSR19NQVNLIDB4MGYKLSNkZWZpbmUgQVJHX1NSQyAweDAxCi0jZGVmaW5lIEFSR19EU1QgMHgwMgotI2RlZmluZSBBUkdfUlMgMHgwMQotI2RlZmluZSBBUkdfUkQgMHgwMgotI2RlZmluZSBBUkdfUkEgMHgwMwotI2RlZmluZSBBUkdfUkIgMHgwNAotI2RlZmluZSBBUkdfUlIgMHgwNQotI2RlZmluZSBBUkdfUlggMHgwNgotI2RlZmluZSBBUkdfSU1NNCAweDAxCi0jZGVmaW5lIEFSR19JTU04IDB4MDIKLSNkZWZpbmUgQVJHX0lNTTE2IDB4MDMKLSNkZWZpbmUgQVJHX0lNTTMyIDB4MDQKLSNkZWZpbmUgQVJHX0lNTU4gMHgwNQotI2RlZmluZSBBUkdfSU1NTk1JTlVTMSAweDA1Ci0jZGVmaW5lIEFSR19JTU1fMSAweDA2Ci0jZGVmaW5lIEFSR19JTU1fMiAweDA3Ci0jZGVmaW5lIEFSR19ESVNQMTYgMHgwOAotI2RlZmluZSBBUkdfTklNOCAweDA5Ci0jZGVmaW5lIEFSR19JTU0yIDB4MGEKLSNkZWZpbmUgQVJHX0lNTTFPUjIgMHgwYgotI2RlZmluZSBBUkdfRElTUDEyIDB4MGIKLSNkZWZpbmUgQVJHX0RJU1A4IDB4MGMKLSNkZWZpbmUgQVJHX0lNTTRNMSAweDBkCi0jZGVmaW5lIENMQVNTX01BU0sgMHgxZmZmMAotI2RlZmluZSBDTEFTU19YIDB4MTAKLSNkZWZpbmUgQ0xBU1NfQkEgMHgyMAotI2RlZmluZSBDTEFTU19EQSAweDMwCi0jZGVmaW5lIENMQVNTX0JYIDB4NDAKLSNkZWZpbmUgQ0xBU1NfRElTUCAweDUwCi0jZGVmaW5lIENMQVNTX0lNTSAweDYwCi0jZGVmaW5lIENMQVNTX0NDIDB4NzAKLSNkZWZpbmUgQ0xBU1NfQ1RSTCAweDgwCi0jZGVmaW5lIENMQVNTX0FERFJFU1MgMHhkMAotI2RlZmluZSBDTEFTU18wQ0NDIDB4ZTAKLSNkZWZpbmUgQ0xBU1NfMUNDQyAweGYwCi0jZGVmaW5lIENMQVNTXzBESVNQNyAweDEwMAotI2RlZmluZSBDTEFTU18xRElTUDcgMHgyMDAKLSNkZWZpbmUgQ0xBU1NfMDFJSSAweDMwMAotI2RlZmluZSBDTEFTU18wMElJIDB4NDAwCi0jZGVmaW5lIENMQVNTX0JJVCAweDUwMAotI2RlZmluZSBDTEFTU19GTEFHUyAweDYwMAotI2RlZmluZSBDTEFTU19JUiAweDcwMAotI2RlZmluZSBDTEFTU19ESVNQOCAweDgwMAotI2RlZmluZSBDTEFTU19CSVRfMU9SMiAweDkwMAotI2RlZmluZSBDTEFTU19SRUcgMHg3MDAwCi0jZGVmaW5lIENMQVNTX1JFR19CWVRFIDB4MjAwMAotI2RlZmluZSBDTEFTU19SRUdfV09SRCAweDMwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHX1FVQUQgMHg0MDAwCi0jZGVmaW5lIENMQVNTX1JFR19MT05HIDB4NTAwMAotI2RlZmluZSBDTEFTU19SRUdOMCAweDgwMDAKLSNkZWZpbmUgQ0xBU1NfUFIgMHgxMDAwMAotI2RlZmluZSBPUENfYWRjIDAKLSNkZWZpbmUgT1BDX2FkY2IgMQotI2RlZmluZSBPUENfYWRkIDIKLSNkZWZpbmUgT1BDX2FkZGIgMwotI2RlZmluZSBPUENfYWRkbCA0Ci0jZGVmaW5lIE9QQ19hbmQgNQotI2RlZmluZSBPUENfYW5kYiA2Ci0jZGVmaW5lIE9QQ19iaXQgNwotI2RlZmluZSBPUENfYml0YiA4Ci0jZGVmaW5lIE9QQ19jYWxsIDkKLSNkZWZpbmUgT1BDX2NhbHIgMTAKLSNkZWZpbmUgT1BDX2NsciAxMQotI2RlZmluZSBPUENfY2xyYiAxMgotI2RlZmluZSBPUENfY29tIDEzCi0jZGVmaW5lIE9QQ19jb21iIDE0Ci0jZGVmaW5lIE9QQ19jb21mbGcgMTUKLSNkZWZpbmUgT1BDX2NwIDE2Ci0jZGVmaW5lIE9QQ19jcGIgMTcKLSNkZWZpbmUgT1BDX2NwZCAxOAotI2RlZmluZSBPUENfY3BkYiAxOQotI2RlZmluZSBPUENfY3BkciAyMAotI2RlZmluZSBPUENfY3BkcmIgMjEKLSNkZWZpbmUgT1BDX2NwaSAyMgotI2RlZmluZSBPUENfY3BpYiAyMwotI2RlZmluZSBPUENfY3BpciAyNAotI2RlZmluZSBPUENfY3BpcmIgMjUKLSNkZWZpbmUgT1BDX2NwbCAyNgotI2RlZmluZSBPUENfY3BzZCAyNwotI2RlZmluZSBPUENfY3BzZGIgMjgKLSNkZWZpbmUgT1BDX2Nwc2RyIDI5Ci0jZGVmaW5lIE9QQ19jcHNkcmIgMzAKLSNkZWZpbmUgT1BDX2Nwc2kgMzEKLSNkZWZpbmUgT1BDX2Nwc2liIDMyCi0jZGVmaW5lIE9QQ19jcHNpciAzMwotI2RlZmluZSBPUENfY3BzaXJiIDM0Ci0jZGVmaW5lIE9QQ19kYWIgMzUKLSNkZWZpbmUgT1BDX2Riam56IDM2Ci0jZGVmaW5lIE9QQ19kZWMgMzcKLSNkZWZpbmUgT1BDX2RlY2IgMzgKLSNkZWZpbmUgT1BDX2RpIDM5Ci0jZGVmaW5lIE9QQ19kaXYgNDAKLSNkZWZpbmUgT1BDX2RpdmwgNDEKLSNkZWZpbmUgT1BDX2RqbnogNDIKLSNkZWZpbmUgT1BDX2VpIDQzCi0jZGVmaW5lIE9QQ19leCA0NAotI2RlZmluZSBPUENfZXhiIDQ1Ci0jZGVmaW5lIE9QQ19leHRzIDQ2Ci0jZGVmaW5lIE9QQ19leHRzYiA0NwotI2RlZmluZSBPUENfZXh0c2wgNDgKLSNkZWZpbmUgT1BDX2hhbHQgNDkKLSNkZWZpbmUgT1BDX2luIDUwCi0jZGVmaW5lIE9QQ19pbmIgNTEKLSNkZWZpbmUgT1BDX2luYyA1MgotI2RlZmluZSBPUENfaW5jYiA1MwotI2RlZmluZSBPUENfaW5kIDU0Ci0jZGVmaW5lIE9QQ19pbmRiIDU1Ci0jZGVmaW5lIE9QQ19pbmliIDU2Ci0jZGVmaW5lIE9QQ19pbmliciA1NwotI2RlZmluZSBPUENfaXJldCA1OAotI2RlZmluZSBPUENfanAgNTkKLSNkZWZpbmUgT1BDX2pyIDYwCi0jZGVmaW5lIE9QQ19sZCA2MQotI2RlZmluZSBPUENfbGRhIDYyCi0jZGVmaW5lIE9QQ19sZGFyIDYzCi0jZGVmaW5lIE9QQ19sZGIgNjQKLSNkZWZpbmUgT1BDX2xkY3RsIDY1Ci0jZGVmaW5lIE9QQ19sZGlyIDY2Ci0jZGVmaW5lIE9QQ19sZGlyYiA2NwotI2RlZmluZSBPUENfbGRrIDY4Ci0jZGVmaW5lIE9QQ19sZGwgNjkKLSNkZWZpbmUgT1BDX2xkbSA3MAotI2RlZmluZSBPUENfbGRwcyA3MQotI2RlZmluZSBPUENfbGRyIDcyCi0jZGVmaW5lIE9QQ19sZHJiIDczCi0jZGVmaW5lIE9QQ19sZHJsIDc0Ci0jZGVmaW5lIE9QQ19tYml0IDc1Ci0jZGVmaW5lIE9QQ19tcmVxIDc2Ci0jZGVmaW5lIE9QQ19tcmVzIDc3Ci0jZGVmaW5lIE9QQ19tc2V0IDc4Ci0jZGVmaW5lIE9QQ19tdWx0IDc5Ci0jZGVmaW5lIE9QQ19tdWx0bCA4MAotI2RlZmluZSBPUENfbmVnIDgxCi0jZGVmaW5lIE9QQ19uZWdiIDgyCi0jZGVmaW5lIE9QQ19ub3AgODMKLSNkZWZpbmUgT1BDX29yIDg0Ci0jZGVmaW5lIE9QQ19vcmIgODUKLSNkZWZpbmUgT1BDX291dCA4NgotI2RlZmluZSBPUENfb3V0YiA4NwotI2RlZmluZSBPUENfb3V0ZCA4OAotI2RlZmluZSBPUENfb3V0ZGIgODkKLSNkZWZpbmUgT1BDX291dGliIDkwCi0jZGVmaW5lIE9QQ19vdXRpYnIgOTEKLSNkZWZpbmUgT1BDX3BvcCA5MgotI2RlZmluZSBPUENfcG9wbCA5MwotI2RlZmluZSBPUENfcHVzaCA5NAotI2RlZmluZSBPUENfcHVzaGwgOTUKLSNkZWZpbmUgT1BDX3JlcyA5NgotI2RlZmluZSBPUENfcmVzYiA5NwotI2RlZmluZSBPUENfcmVzZmxnIDk4Ci0jZGVmaW5lIE9QQ19yZXQgOTkKLSNkZWZpbmUgT1BDX3JsIDEwMAotI2RlZmluZSBPUENfcmxiIDEwMQotI2RlZmluZSBPUENfcmxjIDEwMgotI2RlZmluZSBPUENfcmxjYiAxMDMKLSNkZWZpbmUgT1BDX3JsZGIgMTA0Ci0jZGVmaW5lIE9QQ19yciAxMDUKLSNkZWZpbmUgT1BDX3JyYiAxMDYKLSNkZWZpbmUgT1BDX3JyYyAxMDcKLSNkZWZpbmUgT1BDX3JyY2IgMTA4Ci0jZGVmaW5lIE9QQ19ycmRiIDEwOQotI2RlZmluZSBPUENfc2JjIDExMAotI2RlZmluZSBPUENfc2JjYiAxMTEKLSNkZWZpbmUgT1BDX3NkYSAxMTIKLSNkZWZpbmUgT1BDX3NkYWIgMTEzCi0jZGVmaW5lIE9QQ19zZGFsIDExNAotI2RlZmluZSBPUENfc2RsIDExNQotI2RlZmluZSBPUENfc2RsYiAxMTYKLSNkZWZpbmUgT1BDX3NkbGwgMTE3Ci0jZGVmaW5lIE9QQ19zZXQgMTE4Ci0jZGVmaW5lIE9QQ19zZXRiIDExOQotI2RlZmluZSBPUENfc2V0ZmxnIDEyMAotI2RlZmluZSBPUENfc2luYiAxMjEKLSNkZWZpbmUgT1BDX3NpbmQgMTIyCi0jZGVmaW5lIE9QQ19zaW5kYiAxMjMKLSNkZWZpbmUgT1BDX3NpbmliIDEyNAotI2RlZmluZSBPUENfc2luaWJyIDEyNQotI2RlZmluZSBPUENfc2xhIDEyNgotI2RlZmluZSBPUENfc2xhYiAxMjcKLSNkZWZpbmUgT1BDX3NsYWwgMTI4Ci0jZGVmaW5lIE9QQ19zbGwgMTI5Ci0jZGVmaW5lIE9QQ19zbGxiIDEzMAotI2RlZmluZSBPUENfc2xsbCAxMzEKLSNkZWZpbmUgT1BDX3NvdXQgMTMyCi0jZGVmaW5lIE9QQ19zb3V0YiAxMzMKLSNkZWZpbmUgT1BDX3NvdXRkIDEzNAotI2RlZmluZSBPUENfc291dGRiIDEzNQotI2RlZmluZSBPUENfc291dGliIDEzNgotI2RlZmluZSBPUENfc291dGliciAxMzcKLSNkZWZpbmUgT1BDX3NyYSAxMzgKLSNkZWZpbmUgT1BDX3NyYWIgMTM5Ci0jZGVmaW5lIE9QQ19zcmFsIDE0MAotI2RlZmluZSBPUENfc3JsIDE0MQotI2RlZmluZSBPUENfc3JsYiAxNDIKLSNkZWZpbmUgT1BDX3NybGwgMTQzCi0jZGVmaW5lIE9QQ19zdWIgMTQ0Ci0jZGVmaW5lIE9QQ19zdWJiIDE0NQotI2RlZmluZSBPUENfc3VibCAxNDYKLSNkZWZpbmUgT1BDX3RjYyAxNDcKLSNkZWZpbmUgT1BDX3RjY2IgMTQ4Ci0jZGVmaW5lIE9QQ190ZXN0IDE0OQotI2RlZmluZSBPUENfdGVzdGIgMTUwCi0jZGVmaW5lIE9QQ190ZXN0bCAxNTEKLSNkZWZpbmUgT1BDX3RyZGIgMTUyCi0jZGVmaW5lIE9QQ190cmRyYiAxNTMKLSNkZWZpbmUgT1BDX3RyaWIgMTU0Ci0jZGVmaW5lIE9QQ190cmlyYiAxNTUKLSNkZWZpbmUgT1BDX3RydGRyYiAxNTYKLSNkZWZpbmUgT1BDX3RydGliIDE1NwotI2RlZmluZSBPUENfdHJ0aXJiIDE1OAotI2RlZmluZSBPUENfdHJ0ZGIgMTU5Ci0jZGVmaW5lIE9QQ190c2V0IDE2MAotI2RlZmluZSBPUENfdHNldGIgMTYxCi0jZGVmaW5lIE9QQ194b3IgMTYyCi0jZGVmaW5lIE9QQ194b3JiIDE2MwotI2RlZmluZSBPUENfbGRkICAxNjQgCi0jZGVmaW5lIE9QQ19sZGRiICAxNjUgCi0jZGVmaW5lIE9QQ19sZGRyICAxNjYgCi0jZGVmaW5lIE9QQ19sZGRyYiAxNjcgIAotI2RlZmluZSBPUENfbGRpICAxNjggCi0jZGVmaW5lIE9QQ19sZGliIDE2OSAgCi0jZGVmaW5lIE9QQ19zYyAgIDE3MAotI2RlZmluZSBPUENfYnB0ICAgMTcxCi0jZGVmaW5lIE9QQ19leHQwZSAxNzIKLSNkZWZpbmUgT1BDX2V4dDBmIDE3MgotI2RlZmluZSBPUENfZXh0OGUgMTcyCi0jZGVmaW5lIE9QQ19leHQ4ZiAxNzIKLSNkZWZpbmUgT1BDX3JzdmQzNiAxNzIKLSNkZWZpbmUgT1BDX3JzdmQzOCAxNzIKLSNkZWZpbmUgT1BDX3JzdmQ3OCAxNzIKLSNkZWZpbmUgT1BDX3JzdmQ3ZSAxNzIKLSNkZWZpbmUgT1BDX3JzdmQ5ZCAxNzIKLSNkZWZpbmUgT1BDX3JzdmQ5ZiAxNzIKLSNkZWZpbmUgT1BDX3JzdmRiOSAxNzIKLSNkZWZpbmUgT1BDX3JzdmRiZiAxNzIKLSNkZWZpbmUgT1BDX291dGkgMTczCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWZkZWYgTklDRU5BTUVTCi1jaGFyICpuaWNlbmFtZTsKLWludCB0eXBlOwotaW50IGN5Y2xlczsKLWludCBmbGFnczsKLSNlbmRpZgotY2hhciAqbmFtZTsKLXVuc2lnbmVkIGNoYXIgb3Bjb2RlOwotdm9pZCAoKmZ1bmMpKCk7Ci11bnNpZ25lZCBpbnQgYXJnX2luZm9bNF07Ci11bnNpZ25lZCBpbnQgYnl0ZV9pbmZvWzEwXTsKLWludCBub3BlcmFuZHM7Ci1pbnQgbGVuZ3RoOwotaW50IGlkeDsKLX0gb3Bjb2RlX2VudHJ5X3R5cGU7Ci0jaWZkZWYgREVGSU5FX1RBQkxFCi1vcGNvZGVfZW50cnlfdHlwZSB6OGtfdGFibGVbXSA9IHsKLQotCi0vKiAxMDExIDAxMDEgc3NzcyBkZGRkICoqKiBhZGMgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGMgcmQscnMiLDE2LDUsCi0weDNjLAotI2VuZGlmCi0iYWRjIixPUENfYWRjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMH0sCi0KLQotLyogMTAxMSAwMTAwIHNzc3MgZGRkZCAqKiogYWRjYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRjYiByYmQscmJzIiw4LDUsCi0weDNmLAotI2VuZGlmCi0iYWRjYiIsT1BDX2FkY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxfSwKLQotCi0vKiAwMDAwIDAwMDEgc3NOMCBkZGRkICoqKiBhZGQgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLEBycyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyfSwKLQotCi0vKiAwMTAwIDAwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGQgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzfSwKLQotCi0vKiAwMTAwIDAwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGQgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNH0sCi0KLQotLyogMDAwMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogYWRkIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLGltbTE2IiwxNiw3LAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDV9LAotCi0KLS8qIDEwMDAgMDAwMSBzc3NzIGRkZGQgKioqIGFkZCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxycyIsMTYsNCwKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNn0sCi0KLQotLyogMDAwMCAwMDAwIHNzTjAgZGRkZCAqKiogYWRkYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQsQHJzIiw4LDcsCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw3fSwKLQotCi0vKiAwMTAwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDh9LAotCi0KLS8qIDAxMDAgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDl9LAotCi0KLS8qIDAwMDAgMDAwMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBhZGRiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQsaW1tOCIsOCw3LAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwxMH0sCi0KLQotLyogMTAwMCAwMDAwIHNzc3MgZGRkZCAqKiogYWRkYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQscmJzIiw4LDQsCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTF9LAotCi0KLS8qIDAwMDEgMDExMCBzc04wIGRkZGQgKioqIGFkZGwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLEBycyIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMn0sCi0KLQotLyogMDEwMSAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkbCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTUsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEzfSwKLQotCi0vKiAwMTAxIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDE2LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTR9LAotCi0KLS8qIDAwMDEgMDExMCAwMDAwIGRkZGQgaW1tMzIgKioqIGFkZGwgcnJkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQsaW1tMzIiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMTV9LAotCi0KLS8qIDEwMDEgMDExMCBzc3NzIGRkZGQgKioqIGFkZGwgcnJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLHJycyIsMzIsOCwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxNn0sCi0KLQotLyogMDAwMCAwMTExIHNzTjAgZGRkZCAqKiogYW5kIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxAcnMiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTd9LAotCi0KLS8qIDAxMDAgMDExMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE4fSwKLQotCi0vKiAwMTAwIDAxMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmQgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTl9LAotCi0KLS8qIDAwMDAgMDExMSAwMDAwIGRkZGQgaW1tMTYgKioqIGFuZCByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxpbW0xNiIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyMH0sCi0KLQotLyogMTAwMCAwMTExIHNzc3MgZGRkZCAqKiogYW5kIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLHJzIiwxNiw0LAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMX0sCi0KLQotLyogMDAwMCAwMTEwIHNzTjAgZGRkZCAqKiogYW5kYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQsQHJzIiw4LDcsCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMn0sCi0KLQotLyogMDEwMCAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyM30sCi0KLQotLyogMDEwMCAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjR9LAotCi0KLS8qIDAwMDAgMDExMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBhbmRiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQsaW1tOCIsOCw3LAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwyNX0sCi0KLQotLyogMTAwMCAwMTEwIHNzc3MgZGRkZCAqKiogYW5kYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQscmJzIiw4LDQsCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjZ9LAotCi0KLS8qIDAwMTAgMDExMSBkZE4wIGltbTQgKioqIGJpdCBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCBAcmQsaW1tNCIsMTYsOCwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyN30sCi0KLQotLyogMDExMCAwMTExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogYml0IGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IGFkZHJlc3NfZHN0KHJkKSxpbW00IiwxNiwxMSwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOH0sCi0KLQotLyogMDExMCAwMTExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogYml0IGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgYWRkcmVzc19kc3QsaW1tNCIsMTYsMTAsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOX0sCi0KLQotLyogMTAxMCAwMTExIGRkZGQgaW1tNCAqKiogYml0IHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgcmQsaW1tNCIsMTYsNCwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMH0sCi0KLQotLyogMDAxMCAwMTExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiBiaXQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgcmQscnMiLDE2LDEwLAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzF9LAotCi0KLS8qIDAwMTAgMDExMCBkZE4wIGltbTQgKioqIGJpdGIgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIEByZCxpbW00Iiw4LDgsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMn0sCi0KLQotLyogMDExMCAwMTEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogYml0YiBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgYWRkcmVzc19kc3QocmQpLGltbTQiLDgsMTEsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzM30sCi0KLQotLyogMDExMCAwMTEwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogYml0YiBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiBhZGRyZXNzX2RzdCxpbW00Iiw4LDEwLAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzNH0sCi0KLQotLyogMTAxMCAwMTEwIGRkZGQgaW1tNCAqKiogYml0YiByYmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgcmJkLGltbTQiLDgsNCwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDM1fSwKLQotCi0vKiAwMDEwIDAxMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIGJpdGIgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiByYmQscnMiLDgsMTAsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDM2fSwKLQotCi0vKiAwMDExIDAxMTAgMDAwMCAwMDAwICoqKiBicHQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJicHQiLDgsMiwKLTB4MDAsCi0jZW5kaWYKLSJicHQiLE9QQ19icHQsMCx7MH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDAsMiwzN30sCi0KLQotLyogMDAwMSAxMTExIGRkTjAgMDAwMCAqKiogY2FsbCBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjYWxsIEByZCIsMzIsMTAsCi0weDAwLAotI2VuZGlmCi0iY2FsbCIsT1BDX2NhbGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsMzh9LAotCi0KLS8qIDAxMDEgMTExMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QgKioqIGNhbGwgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjYWxsIGFkZHJlc3NfZHN0IiwzMiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJjYWxsIixPUENfY2FsbCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM5fSwKLQotCi0vKiAwMTAxIDExMTEgZGROMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjYWxsIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNhbGwgYWRkcmVzc19kc3QocmQpIiwzMiwxMywKLTB4MDAsCi0jZW5kaWYKLSJjYWxsIixPUENfY2FsbCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MH0sCi0KLQotLyogMTEwMSBkaXNwMTIgKioqIGNhbHIgZGlzcDEyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2FsciBkaXNwMTIiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotImNhbHIiLE9QQ19jYWxyLDAse0NMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzB4ZCxDTEFTU19ESVNQKyhBUkdfRElTUDEyKSwwLDAsMCwwLDAsMCwwLH0sMSwyLDQxfSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAxMDAwICoqKiBjbHIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyIEByZCIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDJ9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDEwMDAgYWRkcmVzc19kc3QgKioqIGNsciBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNsciBhZGRyZXNzX2RzdCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0iY2xyIixPUENfY2xyLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDN9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDEwMDAgYWRkcmVzc19kc3QgKioqIGNsciBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHIgYWRkcmVzc19kc3QocmQpIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDR9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDEwMDAgKioqIGNsciByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNsciByZCIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDQ1fSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAxMDAwICoqKiBjbHJiIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNscmIgQHJkIiw4LDgsCi0weDAwLAotI2VuZGlmCi0iY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDZ9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QgKioqIGNscmIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHJiIGFkZHJlc3NfZHN0Iiw4LDExLAotMHgwMCwKLSNlbmRpZgotImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDd9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QgKioqIGNscmIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyYiBhZGRyZXNzX2RzdChyZCkiLDgsMTIsCi0weDAwLAotI2VuZGlmCi0iY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDh9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDEwMDAgKioqIGNscmIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyYiByYmQiLDgsNywKLTB4MDAsCi0jZW5kaWYKLSJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDl9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAwMDAgKioqIGNvbSBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb20gQHJkIiwxNiwxMiwKLTB4MTgsCi0jZW5kaWYKLSJjb20iLE9QQ19jb20sMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTB9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbSBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbSBhZGRyZXNzX2RzdCIsMTYsMTUsCi0weDE4LAotI2VuZGlmCi0iY29tIixPUENfY29tLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTF9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbSBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb20gYWRkcmVzc19kc3QocmQpIiwxNiwxNiwKLTB4MTgsCi0jZW5kaWYKLSJjb20iLE9QQ19jb20sMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTJ9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDAwMDAgKioqIGNvbSByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbSByZCIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJjb20iLE9QQ19jb20sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDUzfSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMDAwICoqKiBjb21iIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWIgQHJkIiw4LDEyLAotMHgxYywKLSNlbmRpZgotImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDU0fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjb21iIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tYiBhZGRyZXNzX2RzdCIsOCwxNSwKLTB4MWMsCi0jZW5kaWYKLSJjb21iIixPUENfY29tYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDU1fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjb21iIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWIgYWRkcmVzc19kc3QocmQpIiw4LDE2LAotMHgxYywKLSNlbmRpZgotImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDU2fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAwMDAwICoqKiBjb21iIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWIgcmJkIiw4LDcsCi0weDFjLAotI2VuZGlmCi0iY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDU3fSwKLQotCi0vKiAxMDAwIDExMDEgZmxhZ3MgMDEwMSAqKiogY29tZmxnIGZsYWdzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tZmxnIGZsYWdzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotImNvbWZsZyIsT1BDX2NvbWZsZywwLHtDTEFTU19GTEFHUyx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0ZMQUdTLENMQVNTX0JJVCs1LDAsMCwwLDAsMCx9LDEsMiw1OH0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDAwMSBpbW0xNiAqKiogY3AgQHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgQHJkLGltbTE2IiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDU5fSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBjcCBhZGRyZXNzX2RzdChyZCksaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCBhZGRyZXNzX2RzdChyZCksaW1tMTYiLDE2LDE1LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsNjB9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGNwIGFkZHJlc3NfZHN0LGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgYWRkcmVzc19kc3QsaW1tMTYiLDE2LDE0LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiw2MX0sCi0KLQotLyogMDAwMCAxMDExIHNzTjAgZGRkZCAqKiogY3AgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQsQHJzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDYyfSwKLQotCi0vKiAwMTAwIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNjN9LAotCi0KLS8qIDAxMDAgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNjR9LAotCi0KLS8qIDAwMDAgMTAxMSAwMDAwIGRkZGQgaW1tMTYgKioqIGNwIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQsaW1tMTYiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNjV9LAotCi0KLS8qIDEwMDAgMTAxMSBzc3NzIGRkZGQgKioqIGNwIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQscnMiLDE2LDQsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDY2fSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMDAxIGltbTggaW1tOCAqKiogY3BiIEByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIEByZCxpbW04Iiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDY3fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogY3BiIGFkZHJlc3NfZHN0KHJkKSxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIGFkZHJlc3NfZHN0KHJkKSxpbW04Iiw4LDE1LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDY4fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogY3BiIGFkZHJlc3NfZHN0LGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgYWRkcmVzc19kc3QsaW1tOCIsOCwxNCwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDY5fSwKLQotCi0vKiAwMDAwIDEwMTAgc3NOMCBkZGRkICoqKiBjcGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQsQHJzIiw4LDcsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw3MH0sCi0KLQotLyogMDEwMCAxMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNzF9LAotCi0KLS8qIDAxMDAgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw3Mn0sCi0KLQotLyogMDAwMCAxMDEwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIGNwYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQsaW1tOCIsOCw3LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCw3M30sCi0KLQotLyogMTAwMCAxMDEwIHNzc3MgZGRkZCAqKiogY3BiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLHJicyIsOCw0LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDc0fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZCByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGQgcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGQiLE9QQ19jcGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3NX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGRiIHJiZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGRiIHJiZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BkYiIsT1BDX2NwZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3Nn0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGRyIHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwZHIgcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGRyIixPUENfY3BkciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzd9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkcmIgcmJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwZHJiIHJiZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BkcmIiLE9QQ19jcGRyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzh9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpIHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwaSByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwaSIsT1BDX2NwaSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc5fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwaWIgcmJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwaWIgcmJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGliIixPUENfY3BpYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDgwfSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwaXIgcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BpciByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwaXIiLE9QQ19jcGlyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODF9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpcmIgcmJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwaXJiIHJiZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BpcmIiLE9QQ19jcGlyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDgyfSwKLQotCi0vKiAwMDAxIDAwMDAgc3NOMCBkZGRkICoqKiBjcGwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQsQHJzIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw4M30sCi0KLQotLyogMDEwMSAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BsIHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQsYWRkcmVzc19zcmMiLDMyLDE1LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsODR9LAotCi0KLS8qIDAxMDEgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwbCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDE2LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDg1fSwKLQotCi0vKiAwMDAxIDAwMDAgMDAwMCBkZGRkIGltbTMyICoqKiBjcGwgcnJkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxpbW0zMiIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsODZ9LAotCi0KLS8qIDEwMDEgMDAwMCBzc3NzIGRkZGQgKioqIGNwbCBycmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxycnMiLDMyLDgsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDg3fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2QgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2QgQHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzZCIsT1BDX2Nwc2QsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODh9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZGIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2RiIEByZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzZGIiLE9QQ19jcHNkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4OX0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkciBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzZHIgQHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzZHIiLE9QQ19jcHNkciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5MH0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkcmIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2RyYiBAcmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwc2RyYiIsT1BDX2Nwc2RyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5MX0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNpIEByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwc2kiLE9QQ19jcHNpLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5Mn0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpYiBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzaWIgQHJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNpYiIsT1BDX2Nwc2liLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5M30sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpciBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzaXIgQHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzaXIiLE9QQ19jcHNpciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTR9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAxMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzaXJiIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNpcmIgQHJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNpcmIiLE9QQ19jcHNpcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDk1fSwKLQotCi0vKiAxMDExIDAwMDAgZGRkZCAwMDAwICoqKiBkYWIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGFiIHJiZCIsOCw1LAotMHgzOCwKLSNlbmRpZgotImRhYiIsT1BDX2RhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsOTZ9LAotCi0KLS8qIDExMTEgZGRkZCAwZGlzcDcgKioqIGRiam56IHJiZCxkaXNwNyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRiam56IHJiZCxkaXNwNyIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0iZGJqbnoiLE9QQ19kYmpueiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCsweGYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTXzBESVNQNywwLDAsMCwwLDAsMCx9LDIsMiw5N30sCi0KLQotLyogMDAxMCAxMDExIGRkTjAgaW1tNG0xICoqKiBkZWMgQHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlYyBAcmQsaW1tNG0xIiwxNiwxMSwKLTB4MWMsCi0jZW5kaWYKLSJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiw5OH0sCi0KLQotLyogMDExMCAxMDExIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWMgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwxNiwxNCwKLTB4MWMsCi0jZW5kaWYKLSJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCw5OX0sCi0KLQotLyogMDExMCAxMDExIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWMgYWRkcmVzc19kc3QsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjIGFkZHJlc3NfZHN0LGltbTRtMSIsMTYsMTMsCi0weDFjLAotI2VuZGlmCi0iZGVjIixPUENfZGVjLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxMDB9LAotCi0KLS8qIDEwMTAgMTAxMSBkZGRkIGltbTRtMSAqKiogZGVjIHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlYyByZCxpbW00bTEiLDE2LDQsCi0weDFjLAotI2VuZGlmCi0iZGVjIixPUENfZGVjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTAxfSwKLQotCi0vKiAwMDEwIDEwMTAgZGROMCBpbW00bTEgKioqIGRlY2IgQHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlY2IgQHJkLGltbTRtMSIsOCwxMSwKLTB4MWMsCi0jZW5kaWYKLSJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDEwMn0sCi0KLQotLyogMDExMCAxMDEwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDgsMTQsCi0weDFjLAotI2VuZGlmCi0iZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxMDN9LAotCi0KLS8qIDAxMTAgMTAxMCAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogZGVjYiBhZGRyZXNzX2RzdCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWNiIGFkZHJlc3NfZHN0LGltbTRtMSIsOCwxMywKLTB4MWMsCi0jZW5kaWYKLSJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTA0fSwKLQotCi0vKiAxMDEwIDEwMTAgZGRkZCBpbW00bTEgKioqIGRlY2IgcmJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlY2IgcmJkLGltbTRtMSIsOCw0LAotMHgxYywKLSNlbmRpZgotImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTA1fSwKLQotCi0vKiAwMTExIDExMDAgMDAwMCAwMGlpICoqKiBkaSBpMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpIGkyIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImRpIixPUENfZGksMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMiksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU18wMElJLDAsMCwwLDAsMCx9LDEsMiwxMDZ9LAotCi0KLS8qIDAwMDEgMTAxMSBzc04wIGRkZGQgKioqIGRpdiBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxAcnMiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEwN30sCi0KLQotLyogMDEwMSAxMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZGl2IHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQsYWRkcmVzc19zcmMiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTA4fSwKLQotCi0vKiAwMTAxIDEwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXYgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMDl9LAotCi0KLS8qIDAwMDEgMTAxMSAwMDAwIGRkZGQgaW1tMTYgKioqIGRpdiBycmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLGltbTE2IiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxMTB9LAotCi0KLS8qIDEwMDEgMTAxMSBzc3NzIGRkZGQgKioqIGRpdiBycmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLHJzIiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTExfSwKLQotCi0vKiAwMDAxIDEwMTAgc3NOMCBkZGRkICoqKiBkaXZsIHJxZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxAcnMiLDMyLDc0NCwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTEyfSwKLQotCi0vKiAwMTAxIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXZsIHJxZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLGFkZHJlc3Nfc3JjIiwzMiw3NDUsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTEzfSwKLQotCi0vKiAwMTAxIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXZsIHJxZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxhZGRyZXNzX3NyYyhycykiLDMyLDc0NiwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTE0fSwKLQotCi0vKiAwMDAxIDEwMTAgMDAwMCBkZGRkIGltbTMyICoqKiBkaXZsIHJxZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLGltbTMyIiwzMiw3NDQsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDExNX0sCi0KLQotLyogMTAwMSAxMDEwIHNzc3MgZGRkZCAqKiogZGl2bCBycWQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQscnJzIiwzMiw3NDQsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTZ9LAotCi0KLS8qIDExMTEgZGRkZCAxZGlzcDcgKioqIGRqbnogcmQsZGlzcDcgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkam56IHJkLGRpc3A3IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJkam56IixPUENfZGpueiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCsweGYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTXzFESVNQNywwLDAsMCwwLDAsMCx9LDIsMiwxMTd9LAotCi0KLS8qIDAxMTEgMTEwMCAwMDAwIDAxaWkgKioqIGVpIGkyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZWkgaTIiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0iZWkiLE9QQ19laSwwLHtDTEFTU19JTU0rKEFSR19JTU0yKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTXzAxSUksMCwwLDAsMCwwLH0sMSwyLDExOH0sCi0KLQotLyogMDAxMCAxMTAxIHNzTjAgZGRkZCAqKiogZXggcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXggcmQsQHJzIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJleCIsT1BDX2V4LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTl9LAotCi0KLS8qIDAxMTAgMTEwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4IHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXggcmQsYWRkcmVzc19zcmMiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTIwfSwKLQotCi0vKiAwMTEwIDExMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBleCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDE2LAotMHgwMCwKLSNlbmRpZgotImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyMX0sCi0KLQotLyogMTAxMCAxMTAxIHNzc3MgZGRkZCAqKiogZXggcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleCByZCxycyIsMTYsNiwKLTB4MDAsCi0jZW5kaWYKLSJleCIsT1BDX2V4LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMjJ9LAotCi0KLS8qIDAwMTAgMTEwMCBzc04wIGRkZGQgKioqIGV4YiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXhiIHJiZCxAcnMiLDgsMTIsCi0weDAwLAotI2VuZGlmCi0iZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMjN9LAotCi0KLS8qIDAxMTAgMTEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4YiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDE1LAotMHgwMCwKLSNlbmRpZgotImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjR9LAotCi0KLS8qIDAxMTAgMTEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4YiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXhiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTYsCi0weDAwLAotI2VuZGlmCi0iZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjV9LAotCi0KLS8qIDEwMTAgMTEwMCBzc3NzIGRkZGQgKioqIGV4YiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXhiIHJiZCxyYnMiLDgsNiwKLTB4MDAsCi0jZW5kaWYKLSJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyNn0sCi0KLQotLyogMDAwMCAxMTEwIGltbTggKioqIGV4dDBlIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHQwZSBpbW04Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImV4dDBlIixPUENfZXh0MGUsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMjd9LAotCi0KLS8qIDAwMDAgMTExMSBpbW04ICoqKiBleHQwZiBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0MGYgaW1tOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJleHQwZiIsT1BDX2V4dDBmLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTI4fSwKLQotCi0vKiAxMDAwIDExMTAgaW1tOCAqKiogZXh0OGUgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dDhlIGltbTgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iZXh0OGUiLE9QQ19leHQ4ZSwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhlLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEyOX0sCi0KLQotLyogMTAwMCAxMTExIGltbTggKioqIGV4dDhmIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHQ4ZiBpbW04Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImV4dDhmIixPUENfZXh0OGYsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMzB9LAotCi0KLS8qIDEwMTEgMDAwMSBkZGRkIDEwMTAgKioqIGV4dHMgcnJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0cyBycmQiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImV4dHMiLE9QQ19leHRzLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGEsMCwwLDAsMCwwLH0sMSwyLDEzMX0sCi0KLQotLyogMTAxMSAwMDAxIGRkZGQgMDAwMCAqKiogZXh0c2IgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHRzYiByZCIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJleHRzYiIsT1BDX2V4dHNiLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiwxMzJ9LAotCi0KLS8qIDEwMTEgMDAwMSBkZGRkIDAxMTEgKioqIGV4dHNsIHJxZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dHNsIHJxZCIsMzIsMTEsCi0weDAwLAotI2VuZGlmCi0iZXh0c2wiLE9QQ19leHRzbCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNywwLDAsMCwwLDAsfSwxLDIsMTMzfSwKLQotCi0vKiAwMTExIDEwMTAgMDAwMCAwMDAwICoqKiBoYWx0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaGFsdCIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJoYWx0IixPUENfaGFsdCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwwLDIsMTM0fSwKLQotCi0vKiAwMDExIDExMDEgc3NOMCBkZGRkICoqKiBpbiByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbiByZCxAcnMiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotImluIixPUENfaW4sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEzNX0sCi0KLQotLyogMDAxMSAxMTAxIGRkZGQgMDEwMCBpbW0xNiAqKiogaW4gcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbiByZCxpbW0xNiIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0iaW4iLE9QQ19pbiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTM2fSwKLQotCi0vKiAwMDExIDExMDAgc3NOMCBkZGRkICoqKiBpbmIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYiByYmQsQHJzIiw4LDEyLAotMHgwMCwKLSNlbmRpZgotImluYiIsT1BDX2luYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTM3fSwKLQotCi0vKiAwMDExIDEwMTAgZGRkZCAwMTAwIGltbTE2ICoqKiBpbmIgcmJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5iIHJiZCxpbW0xNiIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJpbmIiLE9QQ19pbmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDEzOH0sCi0KLQotLyogMDAxMCAxMDAxIGRkTjAgaW1tNG0xICoqKiBpbmMgQHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYyBAcmQsaW1tNG0xIiwxNiwxMSwKLTB4MWMsCi0jZW5kaWYKLSJpbmMiLE9QQ19pbmMsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTM5fSwKLQotCi0vKiAwMTEwIDEwMDEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDE2LDE0LAotMHgxYywKLSNlbmRpZgotImluYyIsT1BDX2luYywwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDB9LAotCi0KLS8qIDAxMTAgMTAwMSAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jIGFkZHJlc3NfZHN0LGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYyBhZGRyZXNzX2RzdCxpbW00bTEiLDE2LDEzLAotMHgxYywKLSNlbmRpZgotImluYyIsT1BDX2luYywwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0MX0sCi0KLQotLyogMTAxMCAxMDAxIGRkZGQgaW1tNG0xICoqKiBpbmMgcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jIHJkLGltbTRtMSIsMTYsNCwKLTB4MWMsCi0jZW5kaWYKLSJpbmMiLE9QQ19pbmMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrOSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTQyfSwKLQotCi0vKiAwMDEwIDEwMDAgZGROMCBpbW00bTEgKioqIGluY2IgQHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluY2IgQHJkLGltbTRtMSIsOCwxMSwKLTB4MWMsCi0jZW5kaWYKLSJpbmNiIixPUENfaW5jYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxNDN9LAotCi0KLS8qIDAxMTAgMTAwMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiw4LDE0LAotMHgxYywKLSNlbmRpZgotImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0NH0sCi0KLQotLyogMDExMCAxMDAwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmNiIGFkZHJlc3NfZHN0LGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluY2IgYWRkcmVzc19kc3QsaW1tNG0xIiw4LDEzLAotMHgxYywKLSNlbmRpZgotImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQ1fSwKLQotCi0vKiAxMDEwIDEwMDAgZGRkZCBpbW00bTEgKioqIGluY2IgcmJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluY2IgcmJkLGltbTRtMSIsOCw0LAotMHgxYywKLSNlbmRpZgotImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDE0Nn0sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBpbmQgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluZCBAcmQsQHJzLHJhIiwxNiwyMSwKLTB4MDQsCi0jZW5kaWYKLSJpbmQiLE9QQ19pbmQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxNDd9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDEwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogaW5kYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluZGIgQHJkLEBycyxyYmEiLDgsMjEsCi0weDA0LAotI2VuZGlmCi0iaW5kYiIsT1BDX2luZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxNDh9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogaW5pYiBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5pYiBAcmQsQHJzLHJhIiw4LDIxLAotMHgwNCwKLSNlbmRpZgotImluaWIiLE9QQ19pbmliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTQ5fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDAwIDAwMDAgYWFhYSBkZE4wIDAwMDAgKioqIGluaWJyIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmliciBAcmQsQHJzLHJhIiwxNiwyMSwKLTB4MDQsCi0jZW5kaWYKLSJpbmliciIsT1BDX2luaWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTUwfSwKLQotCi0vKiAwMTExIDEwMTEgMDAwMCAwMDAwICoqKiBpcmV0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaXJldCIsMTYsMTMsCi0weDNmLAotI2VuZGlmCi0iaXJldCIsT1BDX2lyZXQsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMCwyLDE1MX0sCi0KLQotLyogMDAwMSAxMTEwIGRkTjAgY2NjYyAqKioganAgY2MsQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ianAgY2MsQHJkIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJqcCIsT1BDX2pwLDAse0NMQVNTX0NDLENMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCwwLDAsMCwwLH0sMiwyLDE1Mn0sCi0KLQotLyogMDEwMSAxMTEwIDAwMDAgY2NjYyBhZGRyZXNzX2RzdCAqKioganAgY2MsYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJqcCBjYyxhZGRyZXNzX2RzdCIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJqcCIsT1BDX2pwLDAse0NMQVNTX0NDLENMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX0NDLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTUzfSwKLQotCi0vKiAwMTAxIDExMTAgZGROMCBjY2NjIGFkZHJlc3NfZHN0ICoqKiBqcCBjYyxhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJqcCBjYyxhZGRyZXNzX2RzdChyZCkiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0ianAiLE9QQ19qcCwwLHtDTEFTU19DQyxDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNTR9LAotCi0KLS8qIDExMTAgY2NjYyBkaXNwOCAqKioganIgY2MsZGlzcDggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJqciBjYyxkaXNwOCIsMTYsNiwKLTB4MDAsCi0jZW5kaWYKLSJqciIsT1BDX2pyLDAse0NMQVNTX0NDLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzB4ZSxDTEFTU19DQyxDTEFTU19ESVNQOCwwLDAsMCwwLDAsMCx9LDIsMiwxNTV9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAxMDEgaW1tMTYgKioqIGxkIEByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIEByZCxpbW0xNiIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE1Nn0sCi0KLQotLyogMDAxMCAxMTExIGRkTjAgc3NzcyAqKiogbGQgQHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgQHJkLHJzIiwxNiw4LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDE1N30sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDEwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogbGQgYWRkcmVzc19kc3QocmQpLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgYWRkcmVzc19kc3QocmQpLGltbTE2IiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDE1OH0sCi0KLQotLyogMDExMCAxMTExIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGQgYWRkcmVzc19kc3QocmQpLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgYWRkcmVzc19kc3QocmQpLHJzIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNTl9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGxkIGFkZHJlc3NfZHN0LGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgYWRkcmVzc19kc3QsaW1tMTYiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiwxNjB9LAotCi0KLS8qIDAxMTAgMTExMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkIGFkZHJlc3NfZHN0LHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgYWRkcmVzc19kc3QscnMiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTYxfSwKLQotCi0vKiAwMDExIDAwMTEgZGROMCBzc3NzIGltbTE2ICoqKiBsZCByZChpbW0xNikscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZChpbW0xNikscnMiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfQkErKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE2Mn0sCi0KLQotLyogMDExMSAwMDExIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZCByZChyeCkscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZChyeCkscnMiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfQlgrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE2M30sCi0KLQotLyogMDAxMCAwMDAxIHNzTjAgZGRkZCAqKiogbGQgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQsQHJzIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxNjR9LAotCi0KLS8qIDAxMTAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTY1fSwKLQotCi0vKiAwMTEwIDAwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNjZ9LAotCi0KLS8qIDAwMTAgMDAwMSAwMDAwIGRkZGQgaW1tMTYgKioqIGxkIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQsaW1tMTYiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE2N30sCi0KLQotLyogMTAxMCAwMDAxIHNzc3MgZGRkZCAqKiogbGQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxycyIsMTYsMywKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTY4fSwKLQotCi0vKiAwMDExIDAwMDEgc3NOMCBkZGRkIGltbTE2ICoqKiBsZCByZCxycyhpbW0xNikgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxycyhpbW0xNikiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfQkErKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE2OX0sCi0KLQotLyogMDExMSAwMDAxIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZCByZCxycyhyeCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxycyhyeCkiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfQlgrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE3MH0sCi0KLQotLyogMDExMSAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRhIHByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYSBwcmQsYWRkcmVzc19zcmMiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTcxfSwKLQotCi0vKiAwMTExIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGEgcHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYSBwcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMywKLTB4MDAsCi0jZW5kaWYKLSJsZGEiLE9QQ19sZGEsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNzJ9LAotCi0KLS8qIDAwMTEgMDEwMCBzc04wIGRkZGQgaW1tMTYgKioqIGxkYSBwcmQscnMoaW1tMTYpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhIHByZCxycyhpbW0xNikiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTczfSwKLQotCi0vKiAwMTExIDAxMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkYSBwcmQscnMocngpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhIHByZCxycyhyeCkiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTc0fSwKLQotCi0vKiAwMDExIDAxMDAgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRhciBwcmQsZGlzcDE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhciBwcmQsZGlzcDE2IiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGFyIixPUENfbGRhciwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDE3NX0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDEwMSBpbW04IGltbTggKioqIGxkYiBAcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBAcmQsaW1tOCIsOCw3LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDE3Nn0sCi0KLQotLyogMDAxMCAxMTEwIGRkTjAgc3NzcyAqKiogbGRiIEByZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgQHJkLHJicyIsOCw4LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMTc3fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogbGRiIGFkZHJlc3NfZHN0KHJkKSxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIGFkZHJlc3NfZHN0KHJkKSxpbW04Iiw4LDE1LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDE3OH0sCi0KLQotLyogMDExMCAxMTEwIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRiIGFkZHJlc3NfZHN0KHJkKSxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgYWRkcmVzc19kc3QocmQpLHJicyIsOCwxMiwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE3OX0sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDEwMSBhZGRyZXNzX2RzdCBpbW04IGltbTggKioqIGxkYiBhZGRyZXNzX2RzdCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIGFkZHJlc3NfZHN0LGltbTgiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNiwxODB9LAotCi0KLS8qIDAxMTAgMTExMCAwMDAwIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkYiBhZGRyZXNzX2RzdCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgYWRkcmVzc19kc3QscmJzIiw4LDExLAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxODF9LAotCi0KLS8qIDAwMTAgMDAwMCBzc04wIGRkZGQgKioqIGxkYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxAcnMiLDgsNywKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxODJ9LAotCi0KLS8qIDAxMTAgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxODN9LAotCi0KLS8qIDAxMTAgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTg0fSwKLQotCi0vKiAxMTAwIGRkZGQgaW1tOCAqKiogbGRiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxpbW04Iiw4LDUsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMiwyLDE4NX0sCi0KLQotLyogMTAxMCAwMDAwIHNzc3MgZGRkZCAqKiogbGRiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLHJicyIsOCwzLAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE4Nn0sCi0KLQotLyogMDAxMSAwMDAwIHNzTjAgZGRkZCBpbW0xNiAqKiogbGRiIHJiZCxycyhpbW0xNikgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLHJzKGltbTE2KSIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfQkErKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE4N30sCi0KLQotLyogMDExMSAwMDAwIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGIgcmJkLHJzKHJ4KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQscnMocngpIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTg4fSwKLQotCi0vKiAwMDExIDAwMTAgZGROMCBzc3NzIGltbTE2ICoqKiBsZGIgcmQoaW1tMTYpLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByZChpbW0xNikscmJzIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19CQSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTg5fSwKLQotCi0vKiAwMTExIDAwMTAgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkYiByZChyeCkscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJkKHJ4KSxyYnMiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0JYKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxOTB9LAotCi0KLS8qIDAxMTEgMTEwMSBzc3NzIDFjY2MgKioqIGxkY3RsIGN0cmwscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGN0bCBjdHJsLHJzIiwzMiw3LAotMHgwMCwKLSNlbmRpZgotImxkY3RsIixPUENfbGRjdGwsMCx7Q0xBU1NfQ1RSTCxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU18xQ0NDLDAsMCwwLDAsMCx9LDIsMiwxOTF9LAotCi0KLS8qIDAxMTEgMTEwMSBkZGRkIDBjY2MgKioqIGxkY3RsIHJkLGN0cmwgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGN0bCByZCxjdHJsIiwzMiw3LAotMHgwMCwKLSNlbmRpZgotImxkY3RsIixPUENfbGRjdGwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfQ1RSTCx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU18wQ0NDLDAsMCwwLDAsMCx9LDIsMiwxOTJ9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCAqKiogbGRkIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGQgQHJkLEBycyxyciIsMTYsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRkIixPUENfbGRkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxOTN9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCAqKiogbGRkYiBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRkYiBAcmQsQHJzLHJyIiw4LDExLAotMHgwNCwKLSNlbmRpZgotImxkZGIiLE9QQ19sZGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxOTR9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRkciBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRkciBAcmQsQHJzLHJyIiwxNiwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGRyIixPUENfbGRkciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTk1fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkZHJiIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGRyYiBAcmQsQHJzLHJyIiw4LDExLAotMHgwNCwKLSNlbmRpZgotImxkZHJiIixPUENfbGRkcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE5Nn0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGkgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkaSBAcmQsQHJzLHJyIiwxNiwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGkiLE9QQ19sZGksMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5N30sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGliIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGliIEByZCxAcnMscnIiLDgsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRpYiIsT1BDX2xkaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5OH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGlyIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGlyIEByZCxAcnMscnIiLDE2LDExLAotMHgwNCwKLSNlbmRpZgotImxkaXIiLE9QQ19sZGlyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxOTl9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRpcmIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkaXJiIEByZCxAcnMscnIiLDgsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRpcmIiLE9QQ19sZGlyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMjAwfSwKLQotCi0vKiAxMDExIDExMDEgZGRkZCBpbW00ICoqKiBsZGsgcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkayByZCxpbW00IiwxNiw1LAotMHgwMCwKLSNlbmRpZgotImxkayIsT1BDX2xkaywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjAxfSwKLQotCi0vKiAwMDAxIDExMDEgZGROMCBzc3NzICoqKiBsZGwgQHJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBAcmQscnJzIiwzMiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDIwMn0sCi0KLQotLyogMDEwMSAxMTAxIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRsIGFkZHJlc3NfZHN0KHJkKSxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgYWRkcmVzc19kc3QocmQpLHJycyIsMzIsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyMDN9LAotCi0KLS8qIDAxMDEgMTEwMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkbCBhZGRyZXNzX2RzdCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgYWRkcmVzc19kc3QscnJzIiwzMiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjA0fSwKLQotCi0vKiAwMDExIDAxMTEgZGROMCBzc3NzIGltbTE2ICoqKiBsZGwgcmQoaW1tMTYpLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCByZChpbW0xNikscnJzIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfQkErKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIwNX0sCi0KLQotLyogMDExMSAwMTExIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGwgcmQocngpLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCByZChyeCkscnJzIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfQlgrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDIwNn0sCi0KLQotLyogMDAwMSAwMTAwIHNzTjAgZGRkZCAqKiogbGRsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLEBycyIsMzIsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjA3fSwKLQotCi0vKiAwMTAxIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGwgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTIsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMDh9LAotCi0KLS8qIDAxMDEgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkbCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDEzLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIwOX0sCi0KLQotLyogMDAwMSAwMTAwIDAwMDAgZGRkZCBpbW0zMiAqKiogbGRsIHJyZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQsaW1tMzIiLDMyLDExLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDIxMH0sCi0KLQotLyogMTAwMSAwMTAwIHNzc3MgZGRkZCAqKiogbGRsIHJyZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLHJycyIsMzIsNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjExfSwKLQotCi0vKiAwMDExIDAxMDEgc3NOMCBkZGRkIGltbTE2ICoqKiBsZGwgcnJkLHJzKGltbTE2KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQscnMoaW1tMTYpIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfQkErKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIxMn0sCi0KLQotLyogMDExMSAwMTAxIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGwgcnJkLHJzKHJ4KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQscnMocngpIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfQlgrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDIxM30sCi0KLQotLyogMDAwMSAxMTAwIGRkTjAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxICoqKiBsZG0gQHJkLHJzLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gQHJkLHJzLG4iLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLDAsfSwzLDQsMjE0fSwKLQotCi0vKiAwMTAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEgYWRkcmVzc19kc3QgKioqIGxkbSBhZGRyZXNzX2RzdChyZCkscnMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSBhZGRyZXNzX2RzdChyZCkscnMsbiIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSx9LDMsNiwyMTV9LAotCi0KLS8qIDAxMDEgMTEwMCAwMDAwIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCAqKiogbGRtIGFkZHJlc3NfZHN0LHJzLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gYWRkcmVzc19kc3QscnMsbiIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLH0sMyw2LDIxNn0sCi0KLQotLyogMDAwMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxICoqKiBsZG0gcmQsQHJzLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gcmQsQHJzLG4iLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLDAsfSwzLDQsMjE3fSwKLQotCi0vKiAwMTAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgYWRkcmVzc19zcmMgKioqIGxkbSByZCxhZGRyZXNzX3NyYyhycyksbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSByZCxhZGRyZXNzX3NyYyhycyksbiIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSx9LDMsNiwyMTh9LAotCi0KLS8qIDAxMDEgMTEwMCAwMDAwIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyAqKiogbGRtIHJkLGFkZHJlc3Nfc3JjLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gcmQsYWRkcmVzc19zcmMsbiIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLH0sMyw2LDIxOX0sCi0KLQotLyogMDAxMSAxMDAxIHNzTjAgMDAwMCAqKiogbGRwcyBAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHBzIEBycyIsMTYsMTIsCi0weDNmLAotI2VuZGlmCi0ibGRwcyIsT1BDX2xkcHMsMCx7Q0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDIyMH0sCi0KLQotLyogMDExMSAxMDAxIDAwMDAgMDAwMCBhZGRyZXNzX3NyYyAqKiogbGRwcyBhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcHMgYWRkcmVzc19zcmMiLDE2LDE2LAotMHgzZiwKLSNlbmRpZgotImxkcHMiLE9QQ19sZHBzLDAse0NMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMSw0LDIyMX0sCi0KLQotLyogMDExMSAxMDAxIHNzTjAgMDAwMCBhZGRyZXNzX3NyYyAqKiogbGRwcyBhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHBzIGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTcsCi0weDNmLAotI2VuZGlmCi0ibGRwcyIsT1BDX2xkcHMsMCx7Q0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMSw0LDIyMn0sCi0KLQotLyogMDAxMSAwMDExIDAwMDAgc3NzcyBkaXNwMTYgKioqIGxkciBkaXNwMTYscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHIgZGlzcDE2LHJzIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZHIiLE9QQ19sZHIsMCx7Q0xBU1NfRElTUCxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjN9LAotCi0KLS8qIDAwMTEgMDAwMSAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZHIgcmQsZGlzcDE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRyIHJkLGRpc3AxNiIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRyIixPUENfbGRyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI0fSwKLQotCi0vKiAwMDExIDAwMTAgMDAwMCBzc3NzIGRpc3AxNiAqKiogbGRyYiBkaXNwMTYscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRyYiBkaXNwMTYscmJzIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkcmIiLE9QQ19sZHJiLDAse0NMQVNTX0RJU1AsQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI1fSwKLQotCi0vKiAwMDExIDAwMDAgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRyYiByYmQsZGlzcDE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRyYiByYmQsZGlzcDE2Iiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkcmIiLE9QQ19sZHJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI2fSwKLQotCi0vKiAwMDExIDAxMTEgMDAwMCBzc3NzIGRpc3AxNiAqKiogbGRybCBkaXNwMTYscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRybCBkaXNwMTYscnJzIiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZHJsIixPUENfbGRybCwwLHtDTEFTU19ESVNQLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyN30sCi0KLQotLyogMDAxMSAwMTAxIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkcmwgcnJkLGRpc3AxNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcmwgcnJkLGRpc3AxNiIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRybCIsT1BDX2xkcmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjh9LAotCi0KLS8qIDAxMTEgMTAxMSAwMDAwIDEwMTAgKioqIG1iaXQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtYml0IiwxNiw3LAotMHgzOCwKLSNlbmRpZgotIm1iaXQiLE9QQ19tYml0LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0JJVCsweGEsMCwwLDAsMCwwLH0sMCwyLDIyOX0sCi0KLQotLyogMDExMSAxMDExIGRkZGQgMTEwMSAqKiogbXJlcSByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm1yZXEgcmQiLDE2LDEyLAotMHgxOCwKLSNlbmRpZgotIm1yZXEiLE9QQ19tcmVxLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGQsMCwwLDAsMCwwLH0sMSwyLDIzMH0sCi0KLQotLyogMDExMSAxMDExIDAwMDAgMTAwMSAqKiogbXJlcyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm1yZXMiLDE2LDUsCi0weDAwLAotI2VuZGlmCi0ibXJlcyIsT1BDX21yZXMsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzksMCwwLDAsMCwwLH0sMCwyLDIzMX0sCi0KLQotLyogMDExMSAxMDExIDAwMDAgMTAwMCAqKiogbXNldCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm1zZXQiLDE2LDUsCi0weDAwLAotI2VuZGlmCi0ibXNldCIsT1BDX21zZXQsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMCwyLDIzMn0sCi0KLQotLyogMDAwMSAxMDAxIHNzTjAgZGRkZCAqKiogbXVsdCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQsQHJzIiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIzM30sCi0KLQotLyogMDEwMSAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxhZGRyZXNzX3NyYyIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzNH0sCi0KLQotLyogMDEwMSAxMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQsYWRkcmVzc19zcmMocnMpIiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzNX0sCi0KLQotLyogMDAwMSAxMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogbXVsdCBycmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxpbW0xNiIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyMzZ9LAotCi0KLS8qIDEwMDEgMTAwMSBzc3NzIGRkZGQgKioqIG11bHQgcnJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQscnMiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs5LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIzN30sCi0KLQotLyogMDAwMSAxMDAwIHNzTjAgZGRkZCAqKiogbXVsdGwgcnFkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxAcnMiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjM4fSwKLQotCi0vKiAwMTAxIDEwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0bCBycWQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQsYWRkcmVzc19zcmMiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMzl9LAotCi0KLS8qIDAxMDEgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHRsIHJxZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQsYWRkcmVzc19zcmMocnMpIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI0MH0sCi0KLQotLyogMDAwMSAxMDAwIDAwMDAgZGRkZCBpbW0zMiAqKiogbXVsdGwgcnFkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLGltbTMyIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDI0MX0sCi0KLQotLyogMTAwMSAxMDAwIHNzc3MgZGRkZCAqKiogbXVsdGwgcnFkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxycnMiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI0Mn0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDAxMCAqKiogbmVnIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZyBAcmQiLDE2LDEyLAotMHgzYywKLSNlbmRpZgotIm5lZyIsT1BDX25lZywwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNDN9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZyBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZyBhZGRyZXNzX2RzdCIsMTYsMTUsCi0weDNjLAotI2VuZGlmCi0ibmVnIixPUENfbmVnLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ0fSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWcgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnIGFkZHJlc3NfZHN0KHJkKSIsMTYsMTYsCi0weDNjLAotI2VuZGlmCi0ibmVnIixPUENfbmVnLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0NX0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMDAxMCAqKiogbmVnIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnIHJkIiwxNiw3LAotMHgzYywKLSNlbmRpZgotIm5lZyIsT1BDX25lZywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjQ2fSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMDEwICoqKiBuZWdiIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZ2IgQHJkIiw4LDEyLAotMHgzYywKLSNlbmRpZgotIm5lZ2IiLE9QQ19uZWdiLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI0N30sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnYiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZ2IgYWRkcmVzc19kc3QiLDgsMTUsCi0weDNjLAotI2VuZGlmCi0ibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDh9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZ2IgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnYiBhZGRyZXNzX2RzdChyZCkiLDgsMTYsCi0weDNjLAotI2VuZGlmCi0ibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ5fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAwMDEwICoqKiBuZWdiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZ2IgcmJkIiw4LDcsCi0weDNjLAotI2VuZGlmCi0ibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI1MH0sCi0KLQotLyogMTAwMCAxMTAxIDAwMDAgMDExMSAqKiogbm9wICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibm9wIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotIm5vcCIsT1BDX25vcCwwLHswfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNywwLDAsMCwwLDAsfSwwLDIsMjUxfSwKLQotCi0vKiAwMDAwIDAxMDEgc3NOMCBkZGRkICoqKiBvciByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxAcnMiLDE2LDcsCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI1Mn0sCi0KLQotLyogMDEwMCAwMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3IgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTN9LAotCi0KLS8qIDAxMDAgMDEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1NH0sCi0KLQotLyogMDAwMCAwMTAxIDAwMDAgZGRkZCBpbW0xNiAqKiogb3IgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxpbW0xNiIsMTYsNywKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjU1fSwKLQotCi0vKiAxMDAwIDAxMDEgc3NzcyBkZGRkICoqKiBvciByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLHJzIiwxNiw0LAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjU2fSwKLQotCi0vKiAwMDAwIDAxMDAgc3NOMCBkZGRkICoqKiBvcmIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQsQHJzIiw4LDcsCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjU3fSwKLQotCi0vKiAwMTAwIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvcmIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjU4fSwKLQotCi0vKiAwMTAwIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1OX0sCi0KLQotLyogMDAwMCAwMTAwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIG9yYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQsaW1tOCIsOCw3LAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMjYwfSwKLQotCi0vKiAxMDAwIDAxMDAgc3NzcyBkZGRkICoqKiBvcmIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQscmJzIiw4LDQsCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI2MX0sCi0KLQotLyogMDAxMSAxMTExIGRkTjAgc3NzcyAqKiogb3V0IEByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dCBAcmQscnMiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0IixPUENfb3V0LDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyNjJ9LAotCi0KLS8qIDAwMTEgMTAxMSBzc3NzIDAxMTAgaW1tMTYgKioqIG91dCBpbW0xNixycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dCBpbW0xNixycyIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXQiLE9QQ19vdXQsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI2M30sCi0KLQotLyogMDAxMSAxMTEwIGRkTjAgc3NzcyAqKiogb3V0YiBAcmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0YiBAcmQscmJzIiw4LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0YiIsT1BDX291dGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI2NH0sCi0KLQotLyogMDAxMSAxMDEwIHNzc3MgMDExMCBpbW0xNiAqKiogb3V0YiBpbW0xNixyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRiIGltbTE2LHJicyIsOCwwLAotMHgwNCwKLSNlbmRpZgotIm91dGIiLE9QQ19vdXRiLDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyNjV9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0ZCBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0ZCBAcmQsQHJzLHJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGQiLE9QQ19vdXRkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjZ9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0ZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRkYiBAcmQsQHJzLHJiYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRkYiIsT1BDX291dGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjd9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0aSBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0aSBAcmQsQHJzLHJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGkiLE9QQ19vdXRpLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMjY4fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIG91dGliIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRpYiBAcmQsQHJzLHJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGliIixPUENfb3V0aWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjl9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogb3V0aWJyIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRpYnIgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRpYnIiLE9QQ19vdXRpYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwyNzB9LAotCi0KLS8qIDAwMDEgMDExMSBzc04wIGRkTjAgKioqIHBvcCBAcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wIEByZCxAcnMiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotInBvcCIsT1BDX3BvcCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjcxfSwKLQotCi0vKiAwMTAxIDAxMTEgc3NOMCBkZE4wIGFkZHJlc3NfZHN0ICoqKiBwb3AgYWRkcmVzc19kc3QocmQpLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcCBhZGRyZXNzX2RzdChyZCksQHJzIiwxNiwxNiwKLTB4MDAsCi0jZW5kaWYKLSJwb3AiLE9QQ19wb3AsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3Mn0sCi0KLQotLyogMDEwMSAwMTExIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogcG9wIGFkZHJlc3NfZHN0LEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcCBhZGRyZXNzX2RzdCxAcnMiLDE2LDE2LAotMHgwMCwKLSNlbmRpZgotInBvcCIsT1BDX3BvcCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyNzN9LAotCi0KLS8qIDEwMDEgMDExMSBzc04wIGRkZGQgKioqIHBvcCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3AgcmQsQHJzIiwxNiw4LAotMHgwMCwKLSNlbmRpZgotInBvcCIsT1BDX3BvcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI3NH0sCi0KLQotLyogMDAwMSAwMTAxIHNzTjAgZGROMCAqKiogcG9wbCBAcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wbCBAcmQsQHJzIiwzMiwxOSwKLTB4MDAsCi0jZW5kaWYKLSJwb3BsIixPUENfcG9wbCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjc1fSwKLQotCi0vKiAwMTAxIDAxMDEgc3NOMCBkZE4wIGFkZHJlc3NfZHN0ICoqKiBwb3BsIGFkZHJlc3NfZHN0KHJkKSxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3BsIGFkZHJlc3NfZHN0KHJkKSxAcnMiLDMyLDIzLAotMHgwMCwKLSNlbmRpZgotInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyNzZ9LAotCi0KLS8qIDAxMDEgMDEwMSBzc04wIDAwMDAgYWRkcmVzc19kc3QgKioqIHBvcGwgYWRkcmVzc19kc3QsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wbCBhZGRyZXNzX2RzdCxAcnMiLDMyLDIzLAotMHgwMCwKLSNlbmRpZgotInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3N30sCi0KLQotLyogMTAwMSAwMTAxIHNzTjAgZGRkZCAqKiogcG9wbCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wbCBycmQsQHJzIiwzMiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJwb3BsIixPUENfcG9wbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI3OH0sCi0KLQotLyogMDAwMSAwMDExIGRkTjAgc3NOMCAqKiogcHVzaCBAcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQsQHJzIiwxNiwxMywKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUdOMCsoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjc5fSwKLQotCi0vKiAwMTAxIDAwMTEgZGROMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBwdXNoIEByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLGFkZHJlc3Nfc3JjIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODB9LAotCi0KLS8qIDAxMDEgMDAxMSBkZE4wIHNzTjAgYWRkcmVzc19zcmMgKioqIHB1c2ggQHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4MX0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMTAwMSBpbW0xNiAqKiogcHVzaCBAcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxpbW0xNiIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjgyfSwKLQotCi0vKiAxMDAxIDAwMTEgZGROMCBzc3NzICoqKiBwdXNoIEByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLHJzIiwxNiw5LAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjgzfSwKLQotCi0vKiAwMDAxIDAwMDEgZGROMCBzc04wICoqKiBwdXNobCBAcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaGwgQHJkLEBycyIsMzIsMjAsCi0weDAwLAotI2VuZGlmCi0icHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUdOMCsoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjg0fSwKLQotCi0vKiAwMTAxIDAwMDEgZGROMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBwdXNobCBAcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNobCBAcmQsYWRkcmVzc19zcmMiLDMyLDIxLAotMHgwMCwKLSNlbmRpZgotInB1c2hsIixPUENfcHVzaGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjg1fSwKLQotCi0vKiAwMTAxIDAwMDEgZGROMCBzc04wIGFkZHJlc3Nfc3JjICoqKiBwdXNobCBAcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaGwgQHJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMjEsCi0weDAwLAotI2VuZGlmCi0icHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjg2fSwKLQotCi0vKiAxMDAxIDAwMDEgZGROMCBzc3NzICoqKiBwdXNobCBAcmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaGwgQHJkLHJycyIsMzIsMTIsCi0weDAwLAotI2VuZGlmCi0icHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI4N30sCi0KLQotLyogMDAxMCAwMDExIGRkTjAgaW1tNCAqKiogcmVzIEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIEByZCxpbW00IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyODh9LAotCi0KLS8qIDAxMTAgMDAxMSBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIHJlcyBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyBhZGRyZXNzX2RzdChyZCksaW1tNCIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjg5fSwKLQotCi0vKiAwMTEwIDAwMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiByZXMgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyBhZGRyZXNzX2RzdCxpbW00IiwxNiwxMywKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5MH0sCi0KLQotLyogMTAxMCAwMDExIGRkZGQgaW1tNCAqKiogcmVzIHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgcmQsaW1tNCIsMTYsNCwKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyOTF9LAotCi0KLS8qIDAwMTAgMDAxMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogcmVzIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIHJkLHJzIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDI5Mn0sCi0KLQotLyogMDAxMCAwMDEwIGRkTjAgaW1tNCAqKiogcmVzYiBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgQHJkLGltbTQiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyOTN9LAotCi0KLS8qIDAxMTAgMDAxMCBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIHJlc2IgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIGFkZHJlc3NfZHN0KHJkKSxpbW00Iiw4LDE0LAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjk0fSwKLQotCi0vKiAwMTEwIDAwMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiByZXNiIGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIGFkZHJlc3NfZHN0LGltbTQiLDgsMTMsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5NX0sCi0KLQotLyogMTAxMCAwMDEwIGRkZGQgaW1tNCAqKiogcmVzYiByYmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgcmJkLGltbTQiLDgsNCwKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI5Nn0sCi0KLQotLyogMDAxMCAwMDEwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiByZXNiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgcmJkLHJzIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwyOTd9LAotCi0KLS8qIDEwMDAgMTEwMSBmbGFncyAwMDExICoqKiByZXNmbGcgZmxhZ3MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNmbGcgZmxhZ3MiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0icmVzZmxnIixPUENfcmVzZmxnLDAse0NMQVNTX0ZMQUdTLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfRkxBR1MsQ0xBU1NfQklUKzMsMCwwLDAsMCwwLH0sMSwyLDI5OH0sCi0KLQotLyogMTAwMSAxMTEwIDAwMDAgY2NjYyAqKiogcmV0IGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmV0IGNjIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyZXQiLE9QQ19yZXQsMCx7Q0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19DQywwLDAsMCwwLDAsfSwxLDIsMjk5fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMEkwICoqKiBybCByZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmwgcmQsaW1tMW9yMiIsMTYsNiwKLTB4M2MsCi0jZW5kaWYKLSJybCIsT1BDX3JsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzAsMCwwLDAsMCwwLH0sMiwyLDMwMH0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDBJMCAqKiogcmxiIHJiZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmxiIHJiZCxpbW0xb3IyIiw4LDYsCi0weDNjLAotI2VuZGlmCi0icmxiIixPUENfcmxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzAsMCwwLDAsMCwwLH0sMiwyLDMwMX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTBJMCAqKiogcmxjIHJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybGMgcmQsaW1tMW9yMiIsMTYsNiwKLTB4M2MsCi0jZW5kaWYKLSJybGMiLE9QQ19ybGMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrOCwwLDAsMCwwLDAsfSwyLDIsMzAyfSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMEkwICoqKiBybGNiIHJiZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmxjYiByYmQsaW1tMW9yMiIsOCw5LAotMHgxMCwKLSNlbmRpZgotInJsY2IiLE9QQ19ybGNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzgsMCwwLDAsMCwwLH0sMiwyLDMwM30sCi0KLQotLyogMTAxMSAxMTEwIGFhYWEgYmJiYiAqKiogcmxkYiByYmIscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmxkYiByYmIscmJhIiw4LDksCi0weDEwLAotI2VuZGlmCi0icmxkYiIsT1BDX3JsZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhlLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUcrKEFSR19SQiksMCwwLDAsMCwwLH0sMiwyLDMwNH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDFJMCAqKiogcnIgcmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyIHJkLGltbTFvcjIiLDE2LDYsCi0weDNjLAotI2VuZGlmCi0icnIiLE9QQ19yciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis0LDAsMCwwLDAsMCx9LDIsMiwzMDV9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAxSTAgKioqIHJyYiByYmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyYiByYmQsaW1tMW9yMiIsOCw2LAotMHgzYywKLSNlbmRpZgotInJyYiIsT1BDX3JyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis0LDAsMCwwLDAsMCx9LDIsMiwzMDZ9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDExSTAgKioqIHJyYyByZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnJjIHJkLGltbTFvcjIiLDE2LDYsCi0weDNjLAotI2VuZGlmCi0icnJjIixPUENfcnJjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzB4YywwLDAsMCwwLDAsfSwyLDIsMzA3fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMUkwICoqKiBycmNiIHJiZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnJjYiByYmQsaW1tMW9yMiIsOCw5LAotMHgxMCwKLSNlbmRpZgotInJyY2IiLE9QQ19ycmNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzB4YywwLDAsMCwwLDAsfSwyLDIsMzA4fSwKLQotCi0vKiAxMDExIDExMDAgYWFhYSBiYmJiICoqKiBycmRiIHJiYixyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJycmRiIHJiYixyYmEiLDgsOSwKLTB4MTAsCi0jZW5kaWYKLSJycmRiIixPUENfcnJkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFRysoQVJHX1JCKSwwLDAsMCwwLDAsfSwyLDIsMzA5fSwKLQotCi0vKiAwMDExIDAxMTAgaW1tOCAqKiogcnN2ZDM2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDM2Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQzNiIsT1BDX3JzdmQzNiwwLHswfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzEwfSwKLQotCi0vKiAwMDExIDEwMDAgaW1tOCAqKiogcnN2ZDM4ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDM4Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQzOCIsT1BDX3JzdmQzOCwwLHswfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzgsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzExfSwKLQotCi0vKiAwMTExIDEwMDAgaW1tOCAqKiogcnN2ZDc4ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDc4Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQ3OCIsT1BDX3JzdmQ3OCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzgsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzEyfSwKLQotCi0vKiAwMTExIDExMTAgaW1tOCAqKiogcnN2ZDdlICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDdlIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQ3ZSIsT1BDX3JzdmQ3ZSwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4ZSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTN9LAotCi0KLS8qIDEwMDEgMTEwMSBpbW04ICoqKiByc3ZkOWQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkOWQiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDlkIixPUENfcnN2ZDlkLDAsezB9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhkLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxNH0sCi0KLQotLyogMTAwMSAxMTExIGltbTggKioqIHJzdmQ5ZiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQ5ZiIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkOWYiLE9QQ19yc3ZkOWYsMCx7MH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE1fSwKLQotCi0vKiAxMDExIDEwMDEgaW1tOCAqKiogcnN2ZGI5ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZGI5Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmRiOSIsT1BDX3JzdmRiOSwwLHswfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTZ9LAotCi0KLS8qIDEwMTEgMTExMSBpbW04ICoqKiByc3ZkYmYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkYmYiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZGJmIixPUENfcnN2ZGJmLDAsezB9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE3fSwKLQotCi0vKiAxMDExIDAxMTEgc3NzcyBkZGRkICoqKiBzYmMgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzYmMgcmQscnMiLDE2LDUsCi0weDNjLAotI2VuZGlmCi0ic2JjIixPUENfc2JjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzE4fSwKLQotCi0vKiAxMDExIDAxMTAgc3NzcyBkZGRkICoqKiBzYmNiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzYmNiIHJiZCxyYnMiLDgsNSwKLTB4M2YsCi0jZW5kaWYKLSJzYmNiIixPUENfc2JjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDMxOX0sCi0KLQotLyogMDExMSAxMTExIGltbTggKioqIHNjIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzYyBpbW04Iiw4LDMzLAotMHgzZiwKLSNlbmRpZgotInNjIixPUENfc2MsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwzMjB9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RhIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RhIHJkLHJzIiwxNiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJzZGEiLE9QQ19zZGEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjF9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RhYiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGFiIHJiZCxycyIsOCwxNSwKLTB4M2MsCi0jZW5kaWYKLSJzZGFiIixPUENfc2RhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyMn0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTExMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGFsIHJyZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkYWwgcnJkLHJzIiwzMiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJzZGFsIixPUENfc2RhbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyM30sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGwgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGwgcmQscnMiLDE2LDE1LAotMHgzOCwKLSNlbmRpZgotInNkbCIsT1BDX3NkbCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjR9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RsYiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGxiIHJiZCxycyIsOCwxNSwKLTB4MzgsCi0jZW5kaWYKLSJzZGxiIixPUENfc2RsYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjV9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAxMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RsbCBycmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGxsIHJyZCxycyIsMzIsMTUsCi0weDM4LAotI2VuZGlmCi0ic2RsbCIsT1BDX3NkbGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzI2fSwKLQotCi0vKiAwMDEwIDAxMDEgZGROMCBpbW00ICoqKiBzZXQgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgQHJkLGltbTQiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMyN30sCi0KLQotLyogMDExMCAwMTAxIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0IGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IGFkZHJlc3NfZHN0KHJkKSxpbW00IiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMjh9LAotCi0KLS8qIDAxMTAgMDEwMSAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHNldCBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IGFkZHJlc3NfZHN0LGltbTQiLDE2LDEzLAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzI5fSwKLQotCi0vKiAxMDEwIDAxMDEgZGRkZCBpbW00ICoqKiBzZXQgcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCByZCxpbW00IiwxNiw0LAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMzMH0sCi0KLQotLyogMDAxMCAwMTAxIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiBzZXQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgcmQscnMiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzMxfSwKLQotCi0vKiAwMDEwIDAxMDAgZGROMCBpbW00ICoqKiBzZXRiIEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiBAcmQsaW1tNCIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMzMn0sCi0KLQotLyogMDExMCAwMTAwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0YiBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgYWRkcmVzc19kc3QocmQpLGltbTQiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMzN9LAotCi0KLS8qIDAxMTAgMDEwMCAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHNldGIgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgYWRkcmVzc19kc3QsaW1tNCIsOCwxMywKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzM0fSwKLQotCi0vKiAxMDEwIDAxMDAgZGRkZCBpbW00ICoqKiBzZXRiIHJiZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiByYmQsaW1tNCIsOCw0LAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzM1fSwKLQotCi0vKiAwMDEwIDAxMDAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHNldGIgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiByYmQscnMiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMzNn0sCi0KLQotLyogMTAwMCAxMTAxIGZsYWdzIDAwMDEgKioqIHNldGZsZyBmbGFncyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGZsZyBmbGFncyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJzZXRmbGciLE9QQ19zZXRmbGcsMCx7Q0xBU1NfRkxBR1MsfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19GTEFHUyxDTEFTU19CSVQrMSwwLDAsMCwwLDAsfSwxLDIsMzM3fSwKLQotCi0vKiAwMDExIDEwMTAgZGRkZCAwMTAxIGltbTE2ICoqKiBzaW5iIHJiZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmIgcmJkLGltbTE2Iiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic2luYiIsT1BDX3NpbmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDMzOH0sCi0KLQotLyogMDAxMSAxMDExIGRkZGQgMDEwMSBpbW0xNiAqKiogc2luYiByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmIgcmQsaW1tMTYiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5iIixPUENfc2luYiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzM5fSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAgKioqIHNpbmQgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmQgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5kIixPUENfc2luZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM0MH0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAxIGFhYWEgZGROMCAxMDAwICoqKiBzaW5kYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmRiIEByZCxAcnMscmJhIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic2luZGIiLE9QQ19zaW5kYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM0MX0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBzaW5pYiBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luaWIgQHJkLEBycyxyYSIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNpbmliIixPUENfc2luaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNDJ9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogc2luaWJyIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5pYnIgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5pYnIiLE9QQ19zaW5pYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwzNDN9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDEwMDEgMDAwMCAwMDAwIGltbTggKioqIHNsYSByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xhIHJkLGltbTgiLDE2LDEzLAotMHgzYywKLSNlbmRpZgotInNsYSIsT1BDX3NsYSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ0fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMDAxICAwMDAwIDAwMDAgaW1tOCAqKiogc2xhYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsYWIgcmJkLGltbTgiLDgsMTMsCi0weDNjLAotI2VuZGlmCi0ic2xhYiIsT1BDX3NsYWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0NX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTEwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xhbCBycmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsYWwgcnJkLGltbTgiLDMyLDEzLAotMHgzYywKLSNlbmRpZgotInNsYWwiLE9QQ19zbGFsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0Nn0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDAwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xsIHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGwgcmQsaW1tOCIsMTYsMTMsCi0weDM4LAotI2VuZGlmCi0ic2xsIixPUENfc2xsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDd9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAwMDEgIDAwMDAgMDAwMCBpbW04ICoqKiBzbGxiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xsYiByYmQsaW1tOCIsOCwxMywKLTB4MzgsCi0jZW5kaWYKLSJzbGxiIixPUENfc2xsYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ4fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMTAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGxsIHJyZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xsbCBycmQsaW1tOCIsMzIsMTMsCi0weDM4LAotI2VuZGlmCi0ic2xsbCIsT1BDX3NsbGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0OX0sCi0KLQotLyogMDAxMSAxMDExIHNzc3MgMDExMSBpbW0xNiAqKiogc291dCBpbW0xNixycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXQgaW1tMTYscnMiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic291dCIsT1BDX3NvdXQsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs3LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDM1MH0sCi0KLQotLyogMDAxMSAxMDEwIHNzc3MgMDExMSBpbW0xNiAqKiogc291dGIgaW1tMTYscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGIgaW1tMTYscmJzIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGIiLE9QQ19zb3V0YiwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzcsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzUxfSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNvdXRkIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0ZCBAcmQsQHJzLHJhIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRkIixPUENfc291dGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM1Mn0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBzb3V0ZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0ZGIgQHJkLEBycyxyYmEiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0ZGIiLE9QQ19zb3V0ZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM1M30sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBzb3V0aWIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRpYiBAcmQsQHJzLHJhIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGliIixPUENfc291dGliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzU0fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDExIDAwMDAgYWFhYSBkZE4wIDAwMDAgKioqIHNvdXRpYnIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRpYnIgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0aWJyIixPUENfc291dGliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM1NX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTAwMSAxMTExIDExMTEgbmltOCAqKiogc3JhIHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmEgcmQsaW1tOCIsMTYsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JhIixPUENfc3JhLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU2fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMDAxIDAwMDAgMDAwMCBuaW04ICoqKiBzcmFiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JhYiByYmQsaW1tOCIsOCwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmFiIixPUENfc3JhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU3fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMTAxIDExMTEgMTExMSBuaW04ICoqKiBzcmFsIHJyZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JhbCBycmQsaW1tOCIsMzIsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JhbCIsT1BDX3NyYWwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM1OH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDAwMSAxMTExIDExMTEgbmltOCAqKiogc3JsIHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmwgcmQsaW1tOCIsMTYsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JsIixPUENfc3JsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU5fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMDAxIDAwMDAgMDAwMCBuaW04ICoqKiBzcmxiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JsYiByYmQsaW1tOCIsOCwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmxiIixPUENfc3JsYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzYwfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMTAxIDExMTEgMTExMSBuaW04ICoqKiBzcmxsIHJyZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JsbCBycmQsaW1tOCIsMzIsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JsbCIsT1BDX3NybGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNjF9LAotCi0KLS8qIDAwMDAgMDAxMSBzc04wIGRkZGQgKioqIHN1YiByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQsQHJzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM2Mn0sCi0KLQotLyogMDEwMCAwMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzYzfSwKLQotCi0vKiAwMTAwIDAwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWIgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzY0fSwKLQotCi0vKiAwMDAwIDAwMTEgMDAwMCBkZGRkIGltbTE2ICoqKiBzdWIgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQsaW1tMTYiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzY1fSwKLQotCi0vKiAxMDAwIDAwMTEgc3NzcyBkZGRkICoqKiBzdWIgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQscnMiLDE2LDQsCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM2Nn0sCi0KLQotLyogMDAwMCAwMDEwIHNzTjAgZGRkZCAqKiogc3ViYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQsQHJzIiw4LDcsCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNjd9LAotCi0KLS8qIDAxMDAgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzY4fSwKLQotCi0vKiAwMTAwIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjl9LAotCi0KLS8qIDAwMDAgMDAxMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBzdWJiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQsaW1tOCIsOCw3LAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwzNzB9LAotCi0KLS8qIDEwMDAgMDAxMCBzc3NzIGRkZGQgKioqIHN1YmIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLHJicyIsOCw0LAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM3MX0sCi0KLQotLyogMDAwMSAwMDEwIHNzTjAgZGRkZCAqKiogc3VibCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQsQHJzIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM3Mn0sCi0KLQotLyogMDEwMSAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3VibCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTUsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM3M30sCi0KLQotLyogMDEwMSAwMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3VibCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQsYWRkcmVzc19zcmMocnMpIiwzMiwxNiwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM3NH0sCi0KLQotLyogMDAwMSAwMDEwIDAwMDAgZGRkZCBpbW0zMiAqKiogc3VibCBycmQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxpbW0zMiIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwzNzV9LAotCi0KLS8qIDEwMDEgMDAxMCBzc3NzIGRkZGQgKioqIHN1YmwgcnJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLHJycyIsMzIsOCwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNzZ9LAotCi0KLS8qIDEwMTAgMTExMSBkZGRkIGNjY2MgKioqIHRjYyBjYyxyZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRjYyBjYyxyZCIsMTYsNSwKLTB4MDAsCi0jZW5kaWYKLSJ0Y2MiLE9QQ190Y2MsMCx7Q0xBU1NfQ0MsQ0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhmLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLDAsMCwwLDAsfSwyLDIsMzc3fSwKLQotCi0vKiAxMDEwIDExMTAgZGRkZCBjY2NjICoqKiB0Y2NiIGNjLHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRjY2IgY2MscmJkIiw4LDUsCi0weDAwLAotI2VuZGlmCi0idGNjYiIsT1BDX3RjY2IsMCx7Q0xBU1NfQ0MsQ0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhlLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLDAsMCwwLDAsfSwyLDIsMzc4fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMTAwICoqKiB0ZXN0IEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3QgQHJkIiwxNiw4LAotMHgxOCwKLSNlbmRpZgotInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM3OX0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdCBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3QgYWRkcmVzc19kc3QiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzgwfSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0IGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3QgYWRkcmVzc19kc3QocmQpIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJ0ZXN0IixPUENfdGVzdCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODF9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDAxMDAgKioqIHRlc3QgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0IHJkIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzODJ9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAxMDAgKioqIHRlc3RiIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RiIEByZCIsOCw4LAotMHgxYywKLSNlbmRpZgotInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzgzfSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0YiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RiIGFkZHJlc3NfZHN0Iiw4LDExLAotMHgxYywKLSNlbmRpZgotInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODR9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3RiIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RiIGFkZHJlc3NfZHN0KHJkKSIsOCwxMiwKLTB4MWMsCi0jZW5kaWYKLSJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4NX0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMDEwMCAqKiogdGVzdGIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGIgcmJkIiw4LDcsCi0weDFjLAotI2VuZGlmCi0idGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzg2fSwKLQotCi0vKiAwMDAxIDExMDAgZGROMCAxMDAwICoqKiB0ZXN0bCBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0bCBAcmQiLDMyLDEzLAotMHgxOCwKLSNlbmRpZgotInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsMzg3fSwKLQotCi0vKiAwMTAxIDExMDAgMDAwMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0bCBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RsIGFkZHJlc3NfZHN0IiwzMiwxNiwKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0bCIsT1BDX3Rlc3RsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg4fSwKLQotCi0vKiAwMTAxIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0bCBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0bCBhZGRyZXNzX2RzdChyZCkiLDMyLDE3LAotMHgxOCwKLSNlbmRpZgotInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg5fSwKLQotCi0vKiAxMDAxIDExMDAgZGRkZCAxMDAwICoqKiB0ZXN0bCBycmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0bCBycmQiLDMyLDEzLAotMHgxOCwKLSNlbmRpZgotInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDM5MH0sCi0KLQotLyogMTAxMSAxMDAwIGRkTjAgMTAwMCAwMDAwIGFhYWEgc3NOMCAwMDAwICoqKiB0cmRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJkYiBAcmQsQHJzLHJiYSIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cmRiIixPUENfdHJkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5MX0sCi0KLQotLyogMTAxMSAxMDAwIGRkTjAgMTEwMCAwMDAwIGFhYWEgc3NOMCAwMDAwICoqKiB0cmRyYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRyZHJiIEByZCxAcnMscmJhIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRyZHJiIixPUENfdHJkcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5Mn0sCi0KLQotLyogMTAxMSAxMDAwIGRkTjAgMDAwMCAwMDAwIHJycnIgc3NOMCAwMDAwICoqKiB0cmliIEByZCxAcnMscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJpYiBAcmQsQHJzLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cmliIixPUENfdHJpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5M30sCi0KLQotLyogMTAxMSAxMDAwIGRkTjAgMDEwMCAwMDAwIHJycnIgc3NOMCAwMDAwICoqKiB0cmlyYiBAcmQsQHJzLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRyaXJiIEByZCxAcnMscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRyaXJiIixPUENfdHJpcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTR9LAotCi0KLS8qIDEwMTEgMTAwMCBhYU4wIDEwMTAgMDAwMCBycnJyIGJiTjAgMDAwMCAqKiogdHJ0ZGIgQHJhLEByYixyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cnRkYiBAcmEsQHJiLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cnRkYiIsT1BDX3RydGRiLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTV9LAotCi0KLS8qIDEwMTEgMTAwMCBhYU4wIDExMTAgMDAwMCBycnJyIGJiTjAgMTExMCAqKiogdHJ0ZHJiIEByYSxAcmIscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJ0ZHJiIEByYSxAcmIscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRydGRyYiIsT1BDX3RydGRyYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkIpLENMQVNTX0JJVCsweGUsMCx9LDMsNCwzOTZ9LAotCi0KLS8qIDEwMTEgMTAwMCBhYU4wIDAwMTAgMDAwMCBycnJyIGJiTjAgMDAwMCAqKiogdHJ0aWIgQHJhLEByYixyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cnRpYiBAcmEsQHJiLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cnRpYiIsT1BDX3RydGliLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkIpLENMQVNTX0JJVCswLDAsfSwzLDQsMzk3fSwKLQotCi0vKiAxMDExIDEwMDAgYWFOMCAwMTEwIDAwMDAgcnJyciBiYk4wIDExMTAgKioqIHRydGlyYiBAcmEsQHJiLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRydGlyYiBAcmEsQHJiLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cnRpcmIiLE9QQ190cnRpcmIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzB4ZSwwLH0sMyw0LDM5OH0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDExMCAqKiogdHNldCBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0IEByZCIsMTYsMTEsCi0weDA4LAotI2VuZGlmCi0idHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsMzk5fSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMTEwIGFkZHJlc3NfZHN0ICoqKiB0c2V0IGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldCBhZGRyZXNzX2RzdCIsMTYsMTQsCi0weDA4LAotI2VuZGlmCi0idHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MDB9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXQgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldCBhZGRyZXNzX2RzdChyZCkiLDE2LDE1LAotMHgwOCwKLSNlbmRpZgotInRzZXQiLE9QQ190c2V0LDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwMX0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMDExMCAqKiogdHNldCByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXQgcmQiLDE2LDcsCi0weDA4LAotI2VuZGlmCi0idHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzYsMCwwLDAsMCwwLH0sMSwyLDQwMn0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDExMCAqKiogdHNldGIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldGIgQHJkIiw4LDExLAotMHgwOCwKLSNlbmRpZgotInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsNDAzfSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMTEwIGFkZHJlc3NfZHN0ICoqKiB0c2V0YiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXRiIGFkZHJlc3NfZHN0Iiw4LDE0LAotMHgwOCwKLSNlbmRpZgotInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MDR9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXRiIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXRiIGFkZHJlc3NfZHN0KHJkKSIsOCwxNSwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwNX0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMDExMCAqKiogdHNldGIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldGIgcmJkIiw4LDcsCi0weDA4LAotI2VuZGlmCi0idHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsNDA2fSwKLQotCi0vKiAwMDAwIDEwMDEgc3NOMCBkZGRkICoqKiB4b3IgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLEBycyIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MDd9LAotCi0KLS8qIDAxMDAgMTAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvciByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDQwOH0sCi0KLQotLyogMDEwMCAxMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDQwOX0sCi0KLQotLyogMDAwMCAxMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogeG9yIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLGltbTE2IiwxNiw3LAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDQxMH0sCi0KLQotLyogMTAwMCAxMDAxIHNzc3MgZGRkZCAqKiogeG9yIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLHJzIiwxNiw0LAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrOSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTF9LAotCi0KLS8qIDAwMDAgMTAwMCBzc04wIGRkZGQgKioqIHhvcmIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLEBycyIsOCw3LAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDEyfSwKLQotCi0vKiAwMTAwIDEwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3JiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDQxM30sCi0KLQotLyogMDEwMCAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDE0fSwKLQotCi0vKiAwMDAwIDEwMDAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogeG9yYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLGltbTgiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsNDE1fSwKLQotCi0vKiAxMDAwIDEwMDAgc3NzcyBkZGRkICoqKiB4b3JiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxyYnMiLDgsNCwKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTZ9LAotCi0KLS8qIDEwMDAgMTAwMCBzc3NzIGRkZGQgKioqIHhvcmIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLHJicyIsOCw0LAotMHgwMSwKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxN30sCi0wLDB9OwotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL3o4a2dlbi5jIGIvb3Bjb2Rlcy96OGtnZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NmJiYi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3o4a2dlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxMyArMCwwIEBACi0vKgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgejhrLW9wYy5oICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIEJZVEVfSU5GT19MRU4gMTAKLQotc3RydWN0IG9wCi17Ci0gIGNoYXIgKmZsYWdzOwotICBpbnQgY3ljbGVzOwotICBjaGFyIHR5cGU7Ci0gIGNoYXIgKmJpdHM7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKmZsYXZvcjsKLX07Ci0KLSNkZWZpbmUgaXN3aGl0ZSh4KSAoKHgpID09ICcgJyB8fCAoeCkgPT0gJ1x0JykKLXN0cnVjdCBvcCBvcHRbXSA9Ci17Ci0gICItLS0tLS0iLCAxMCwgOCwgIjAwMDAgMTExMCBpbW04IiwgImV4dDBlIGltbTgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMDAwIDExMTEgaW1tOCIsICJleHQwZiBpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMCAxMTEwIGltbTgiLCAiZXh0OGUgaW1tOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDAgMTExMSBpbW04IiwgImV4dDhmIGltbTgiLCAwLAotCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMDExMCBpbW04IiwgInJzdmQzNiIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMTAwMCBpbW04IiwgInJzdmQzOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAxMTEgMTAwMCBpbW04IiwgInJzdmQ3OCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAxMTEgMTExMCBpbW04IiwgInJzdmQ3ZSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMSAxMTAxIGltbTgiLCAicnN2ZDlkIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMSAxMTExIGltbTgiLCAicnN2ZDlmIiwgMCwKLQotICAiLS0tLS0tIiwgMTAsIDgsICIxMDExIDEwMDEgaW1tOCIsICJyc3ZkYjkiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIxMDExIDExMTEgaW1tOCIsICJyc3ZkYmYiLCAwLAotCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRkIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwIiwgImxkZHIgQHJzLEByZCxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgOCwgIjEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGRyYiBAcnMsQHJkLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGlyIEByZCxAcnMscnIiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaSByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaXIgcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRyIHJkLEBycyxycixjYyIsIDAsCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRpIEByZCxAcnMscnIiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwZCByZCxAcnMscnIsY2MiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRpcmIgQHJkLEBycyxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCIsICJsZGRiIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRpYiBAcmQsQHJzLHJyIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwZGIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRyYiByYmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaWIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGlyYiByYmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNkIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZGIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZHIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDExMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNkcmIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzaSBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2liIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2lyIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzaXJiIEByZCxAcnMscnIsY2MiLCAwLAotCi0gICItLS0tLS0iLCAyLCA4LCAiMDAxMSAwMTEwIDAwMDAgMDAwMCIsICJicHQiLCAwLAotICAiQ1pTVi0tIiwgNSwgMTYsICIxMDExIDAxMDEgc3NzcyBkZGRkIiwgImFkYyByZCxycyIsIDAsCi0gICJDWlNWREgiLCA1LCA4LCAiMTAxMSAwMTAwIHNzc3MgZGRkZCIsICJhZGNiIHJiZCxyYnMiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMDEgc3NOMCBkZGRkIiwgImFkZCByZCxAcnMiLCAwLAotIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGQgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGQgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiIsICJhZGQgcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDAwMDEgc3NzcyBkZGRkIiwgImFkZCByZCxycyIsIDAsCi0gICJDWlNWREgiLCA3LCA4LCAiMDAwMCAwMDAwIHNzTjAgZGRkZCIsICJhZGRiIHJiZCxAcnMiLCAwLAotIkNaU1ZESCIsIDksIDgsICIwMTAwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1ZESCIsIDEwLCA4LCAiMDEwMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAwMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImFkZGIgcmJkLGltbTgiLCAwLAotICAiQ1pTVkRIIiwgNCwgOCwgIjEwMDAgMDAwMCBzc3NzIGRkZGQiLCAiYWRkYiByYmQscmJzIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDExMCBzc04wIGRkZGQiLCAiYWRkbCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkbCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDMyLCAiMDEwMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMTEwIDAwMDAgZGRkZCBpbW0zMiIsICJhZGRsIHJyZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDExMCBzc3NzIGRkZGQiLCAiYWRkbCBycmQscnJzIiwgMCwKLQotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDAxMTEgc3NOMCBkZGRkIiwgImFuZCByZCxAcnMiLCAwLAotIi1aUy0tLSIsIDksIDE2LCAiMDEwMCAwMTExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmQgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLVpTLS0tIiwgMTAsIDE2LCAiMDEwMCAwMTExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmQgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTExIDAwMDAgZGRkZCBpbW0xNiIsICJhbmQgcmQsaW1tMTYiLCAwLAotICAiLVpTLS0tIiwgNCwgMTYsICIxMDAwIDAxMTEgc3NzcyBkZGRkIiwgImFuZCByZCxycyIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMDAwMCAwMTEwIHNzTjAgZGRkZCIsICJhbmRiIHJiZCxAcnMiLCAwLAotIi1aU1AtLSIsIDksIDgsICIwMTAwIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFuZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi1aU1AtLSIsIDEwLCA4LCAiMDEwMCAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMDExMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImFuZGIgcmJkLGltbTgiLCAwLAotICAiLVpTUC0tIiwgNCwgOCwgIjEwMDAgMDExMCBzc3NzIGRkZGQiLCAiYW5kYiByYmQscmJzIiwgMCwKLQotICAiLVotLS0tIiwgOCwgMTYsICIwMDEwIDAxMTEgZGROMCBpbW00IiwgImJpdCBAcmQsaW1tNCIsIDAsCi0gICItWi0tLS0iLCAxMSwgMTYsICIwMTEwIDAxMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdCBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItWi0tLS0iLCAxMCwgMTYsICIwMTEwIDAxMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdCBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDQsIDE2LCAiMTAxMCAwMTExIGRkZGQgaW1tNCIsICJiaXQgcmQsaW1tNCIsIDAsCi0iLVotLS0tIiwgMTAsIDE2LCAiMDAxMCAwMTExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgImJpdCByZCxycyIsIDAsCi0KLSAgIi1aLS0tLSIsIDgsIDgsICIwMDEwIDAxMTAgZGROMCBpbW00IiwgImJpdGIgQHJkLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTEsIDgsICIwMTEwIDAxMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdGIgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTAsIDgsICIwMTEwIDAxMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdGIgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItWi0tLS0iLCA0LCA4LCAiMTAxMCAwMTEwIGRkZGQgaW1tNCIsICJiaXRiIHJiZCxpbW00IiwgMCwKLSItWi0tLS0iLCAxMCwgOCwgIjAwMTAgMDExMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJiaXRiIHJiZCxycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCAzMiwgIjAwMDEgMTExMSBkZE4wIDAwMDAiLCAiY2FsbCBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTIsIDMyLCAiMDEwMSAxMTExIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCIsICJjYWxsIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAzMiwgIjAxMDEgMTExMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY2FsbCBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMTEwMSBkaXNwMTIiLCAiY2FsciBkaXNwMTIiLCAwLAotCi0gICItLS0tLS0iLCA4LCAxNiwgIjAwMDAgMTEwMSBkZE4wIDEwMDAiLCAiY2xyIEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMTAwIDExMDEgMDAwMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNsciBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTAwIDExMDEgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNsciBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAxMDAwIiwgImNsciByZCIsIDAsCi0gICItLS0tLS0iLCA4LCA4LCAiMDAwMCAxMTAwIGRkTjAgMTAwMCIsICJjbHJiIEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjAxMDAgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QiLCAiY2xyYiBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMiwgOCwgIjAxMDAgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QiLCAiY2xyYiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDEwMDAiLCAiY2xyYiByYmQiLCAwLAotICAiLVpTLS0tIiwgMTIsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDAwMCIsICJjb20gQHJkIiwgMCwKLSAgIi1aUy0tLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi1aUy0tLSIsIDE2LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlMtLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAwMDAiLCAiY29tIHJkIiwgMCwKLSAgIi1aU1AtLSIsIDEyLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDAwMCIsICJjb21iIEByZCIsIDAsCi0gICItWlNQLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tYiBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlNQLS0iLCAxNiwgOCwgIjAxMDAgMTEwMCBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tYiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAwMDAiLCAiY29tYiByYmQiLCAwLAotICAiQ1pTUC0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMTAxIiwgImNvbWZsZyBmbGFncyIsIDAsCi0KLSAgIkNaU1YtLSIsIDExLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMDEgaW1tMTYiLCAiY3AgQHJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAiY3AgYWRkcmVzc19kc3QocmQpLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAiY3AgYWRkcmVzc19kc3QsaW1tMTYiLCAwLAotCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMTAxMSBzc04wIGRkZGQiLCAiY3AgcmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAxMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgMTYsICIwMTAwIDEwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMTAxMSAwMDAwIGRkZGQgaW1tMTYiLCAiY3AgcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDEwMTEgc3NzcyBkZGRkIiwgImNwIHJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgMTEsIDgsICIwMDAwIDExMDAgZGROMCAwMDAxIGltbTggaW1tOCIsICJjcGIgQHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDgsICIwMTAwIDExMDAgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJjcGIgYWRkcmVzc19kc3QocmQpLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJjcGIgYWRkcmVzc19kc3QsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCA3LCA4LCAiMDAwMCAxMDEwIHNzTjAgZGRkZCIsICJjcGIgcmJkLEBycyIsIDAsCi0iQ1pTVi0tIiwgOSwgOCwgIjAxMDAgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgOCwgIjAxMDAgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgOCwgIjAwMDAgMTAxMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImNwYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCA0LCA4LCAiMTAwMCAxMDEwIHNzc3MgZGRkZCIsICJjcGIgcmJkLHJicyIsIDAsCi0KLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAwMCBzc04wIGRkZGQiLCAiY3BsIHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDMyLCAiMDEwMSAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcGwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMDAwIDAwMDAgZGRkZCBpbW0zMiIsICJjcGwgcnJkLGltbTMyIiwgMCwKLSAgIkNaU1YtLSIsIDgsIDMyLCAiMTAwMSAwMDAwIHNzc3MgZGRkZCIsICJjcGwgcnJkLHJycyIsIDAsCi0KLSAgIkNaUy0tLSIsIDUsIDgsICIxMDExIDAwMDAgZGRkZCAwMDAwIiwgImRhYiByYmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDE2LCAiMTExMSBkZGRkIDFkaXNwNyIsICJkYmpueiByYmQsZGlzcDciLCAwLAotICAiLVpTVi0tIiwgMTEsIDE2LCAiMDAxMCAxMDExIGRkTjAgaW1tNG0xIiwgImRlYyBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCAxNiwgIjAxMTAgMTAxMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJkZWMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgMTYsICIwMTEwIDEwMTEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCAxNiwgIjEwMTAgMTAxMSBkZGRkIGltbTRtMSIsICJkZWMgcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDExLCA4LCAiMDAxMCAxMDEwIGRkTjAgaW1tNG0xIiwgImRlY2IgQHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxNCwgOCwgIjAxMTAgMTAxMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJkZWNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTMsIDgsICIwMTEwIDEwMTAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjYiBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgNCwgOCwgIjEwMTAgMTAxMCBkZGRkIGltbTRtMSIsICJkZWNiIHJiZCxpbW00bTEiLCAwLAotCi0gICItLS0tLS0iLCA3LCAxNiwgIjAxMTEgMTEwMCAwMDAwIDAwaWkiLCAiZGkgaTIiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAwMDEgMTAxMSBzc04wIGRkZGQiLCAiZGl2IHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAxMDEgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiZGl2IHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMDEwMSAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXYgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMDAwMSAxMDExIDAwMDAgZGRkZCBpbW0xNiIsICJkaXYgcnJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIxMDAxIDEwMTEgc3NzcyBkZGRkIiwgImRpdiBycmQscnMiLCAwLAotICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjAwMDEgMTAxMCBzc04wIGRkZGQiLCAiZGl2bCBycWQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDc0NSwgMzIsICIwMTAxIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdmwgcnFkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDc0NiwgMzIsICIwMTAxIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3NDQsIDMyLCAiMDAwMSAxMDEwIDAwMDAgZGRkZCBpbW0zMiIsICJkaXZsIHJxZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA3NDQsIDMyLCAiMTAwMSAxMDEwIHNzc3MgZGRkZCIsICJkaXZsIHJxZCxycnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIxMTExIGRkZGQgMGRpc3A3IiwgImRqbnogcmQsZGlzcDciLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIwMTExIDExMDAgMDAwMCAwMWlpIiwgImVpIGkyIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDE2LCAiMTAxMCAxMTAxIHNzc3MgZGRkZCIsICJleCByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDEwIDExMDEgc3NOMCBkZGRkIiwgImV4IHJkLEBycyIsIDAsCi0iLS0tLS0tIiwgMTUsIDE2LCAiMDExMCAxMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJleCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxNiwgMTYsICIwMTEwIDExMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4IHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDAxMCAxMTAwIHNzTjAgZGRkZCIsICJleGIgcmJkLEBycyIsIDAsCi0iLS0tLS0tIiwgMTUsIDgsICIwMTEwIDExMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4YiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDgsICIwMTEwIDExMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4YiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDgsICIxMDEwIDExMDAgc3NzcyBkZGRkIiwgImV4YiByYmQscmJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMTAxMSAwMDAxIGRkZGQgMTAxMCIsICJleHRzIHJyZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjEwMTEgMDAwMSBkZGRkIDAwMDAiLCAiZXh0c2IgcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDMyLCAiMTAxMSAwMDAxIGRkZGQgMDExMSIsICJleHRzbCBycWQiLCAwLAotCi0gICItLS0tLS0iLCA4LCAxNiwgIjAxMTEgMTAxMCAwMDAwIDAwMDAiLCAiaGFsdCIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIwMDExIDExMDEgc3NOMCBkZGRkIiwgImluIHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDExIDExMDEgZGRkZCAwMTAwIGltbTE2IiwgImluIHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDAxMSAxMTAwIHNzTjAgZGRkZCIsICJpbmIgcmJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMTEwMCBkZGRkIDAxMDAgaW1tMTYiLCAiaW5iIHJiZCxpbW0xNiIsIDAsCi0gICItWlNWLS0iLCAxMSwgMTYsICIwMDEwIDEwMDEgZGROMCBpbW00bTEiLCAiaW5jIEByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTQsIDE2LCAiMDExMCAxMDAxIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImluYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDEzLCAxNiwgIjAxMTAgMTAwMSAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmMgYWRkcmVzc19kc3QsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDQsIDE2LCAiMTAxMCAxMDAxIGRkZGQgaW1tNG0xIiwgImluYyByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTEsIDgsICIwMDEwIDEwMDAgZGROMCBpbW00bTEiLCAiaW5jYiBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCA4LCAiMDExMCAxMDAwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImluY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgOCwgIjAxMTAgMTAwMCAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmNiIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCA4LCAiMTAxMCAxMDAwIGRkZGQgaW1tNG0xIiwgImluY2IgcmJkLGltbTRtMSIsIDAsCi0gICItLS1WLS0iLCAyMSwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5kIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDgsICIwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5kYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS1WLS0iLCAyMSwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJpbmliIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAwMDAwIiwgImluaWJyIEByZCxAcnMscmEiLCAwLAotICAiQ1pTVkRIIiwgMTMsIDE2LCAiMDExMSAxMDExIDAwMDAgMDAwMCIsICJpcmV0IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjAwMDEgMTExMCBkZE4wIGNjY2MiLCAianAgY2MsQHJkIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDEwMSAxMTEwIDAwMDAgY2NjYyBhZGRyZXNzX2RzdCIsICJqcCBjYyxhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCA4LCAxNiwgIjAxMDEgMTExMCBkZE4wIGNjY2MgYWRkcmVzc19kc3QiLCAianAgY2MsYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDE2LCAiMTExMCBjY2NjIGRpc3A4IiwgImpyIGNjLGRpc3A4IiwgMCwKLQotICAiLS0tLS0tIiwgNywgMTYsICIwMDAwIDExMDEgZGROMCAwMTAxIGltbTE2IiwgImxkIEByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCA4LCAxNiwgIjAwMTAgMTExMSBkZE4wIHNzc3MiLCAibGQgQHJkLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAibGQgYWRkcmVzc19kc3QocmQpLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAxMTAgMTExMSBkZE4wIHNzc3MgYWRkcmVzc19kc3QiLCAibGQgYWRkcmVzc19kc3QocmQpLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAibGQgYWRkcmVzc19kc3QsaW1tMTYiLCAwLAotIi0tLS0tLSIsIDExLCAxNiwgIjAxMTAgMTExMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGQgYWRkcmVzc19kc3QscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDExIGRkTjAgc3NzcyBpbW0xNiIsICJsZCByZChpbW0xNikscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMSAwMDExIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkIHJkKHJ4KSxycyIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAwMTAgMDAwMSBzc04wIGRkZGQiLCAibGQgcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDksIDE2LCAiMDExMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIwMTEwIDAwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAwMTAgMDAwMSAwMDAwIGRkZGQgaW1tMTYiLCAibGQgcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMywgMTYsICIxMDEwIDAwMDEgc3NzcyBkZGRkIiwgImxkIHJkLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAwMSBzc04wIGRkZGQgaW1tMTYiLCAibGQgcmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTEgMDAwMSBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZCByZCxycyhyeCkiLCAwLAotCi0gICItLS0tLS0iLCA3LCA4LCAiMDAwMCAxMTAwIGRkTjAgMDEwMSBpbW04IGltbTgiLCAibGRiIEByZCxpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDgsIDgsICIwMDEwIDExMTAgZGROMCBzc3NzIiwgImxkYiBAcmQscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDEwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAibGRiIGFkZHJlc3NfZHN0KHJkKSxpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDEwMCAxMTEwIGRkTjAgc3NOMCBhZGRyZXNzX2RzdCIsICJsZGIgYWRkcmVzc19kc3QocmQpLHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04IiwgImxkYiBhZGRyZXNzX2RzdCxpbW04IiwgMCwKLSItLS0tLS0iLCAxMSwgOCwgIjAxMTAgMTExMCAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGRiIGFkZHJlc3NfZHN0LHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAxMCBkZE4wIHNzc3MgaW1tMTYiLCAibGRiIHJkKGltbTE2KSxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTExIDAwMTAgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRiIHJkKHJ4KSxyYnMiLCAwLAotICAiLS0tLS0tIiwgNywgOCwgIjAwMTAgMDAwMCBzc04wIGRkZGQiLCAibGRiIHJiZCxAcnMiLCAwLAotIi0tLS0tLSIsIDksIDgsICIwMTEwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMTEwIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDgsICIxMTAwIGRkZGQgaW1tOCIsICJsZGIgcmJkLGltbTgiLCAwLAotICAiLS0tLS0tIiwgMywgOCwgIjEwMTAgMDAwMCBzc3NzIGRkZGQiLCAibGRiIHJiZCxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMDExIDAwMDAgc3NOMCBkZGRkIGltbTE2IiwgImxkYiByYmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDExMSAwMDAwIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkYiByYmQscnMocngpIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDMyLCAiMDAwMSAxMTAxIGRkTjAgc3NzcyIsICJsZGwgQHJkLHJycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMzIsICIwMTAxIDExMDEgZGROMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkbCBhZGRyZXNzX2RzdChyZCkscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAzMiwgIjAxMDEgMTEwMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGRsIGFkZHJlc3NfZHN0LHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMTEgZGROMCBzc3NzIGltbTE2IiwgImxkbCByZChpbW0xNikscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAxMTEgMDExMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGwgcmQocngpLHJycyIsIDAsCi0gICItLS0tLS0iLCAxMSwgMzIsICIwMDAxIDAxMDAgc3NOMCBkZGRkIiwgImxkbCBycmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjAxMDEgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibGRsIHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMywgMzIsICIwMTAxIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAzMiwgIjAwMDEgMDEwMCAwMDAwIGRkZGQgaW1tMzIiLCAibGRsIHJyZCxpbW0zMiIsIDAsCi0gICItLS0tLS0iLCA1LCAzMiwgIjEwMDEgMDEwMCBzc3NzIGRkZGQiLCAibGRsIHJyZCxycnMiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTAxIHNzTjAgZGRkZCBpbW0xNiIsICJsZGwgcnJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMTExIDAxMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRsIHJyZCxycyhyeCkiLCAwLAotCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTExIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYSBwcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGEgcHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMDExIDAxMDAgc3NOMCBkZGRkIGltbTE2IiwgImxkYSBwcmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMTEgMDEwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGEgcHJkLHJzKHJ4KSIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMDExIDAxMDAgMDAwMCBkZGRkIGRpc3AxNiIsICJsZGFyIHByZCxkaXNwMTYiLCAwLAotICAiLS0tLS0tIiwgNywgMzIsICIwMTExIDExMDEgc3NzcyAxY2NjIiwgImxkY3RsIGN0cmwscnMiLCAwLAotICAiLS0tLS0tIiwgNywgMzIsICIwMTExIDExMDEgZGRkZCAwY2NjIiwgImxkY3RsIHJkLGN0cmwiLCAwLAotCi0gICItLS0tLS0iLCA1LCAxNiwgIjEwMTEgMTEwMSBkZGRkIGltbTQiLCAibGRrIHJkLGltbTQiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEiLCAibGRtIEByZCxycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc04wIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCIsICJsZG0gYWRkcmVzc19kc3QocmQpLHJzLG4iLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAxMTAwIDAwMDAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0IiwgImxkbSBhZGRyZXNzX2RzdCxycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAwMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSIsICJsZG0gcmQsQHJzLG4iLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDEwMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjIiwgImxkbSByZCxhZGRyZXNzX3NyYyhycyksbiIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAxIDExMDAgMDAwMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgYWRkcmVzc19zcmMiLCAibGRtIHJkLGFkZHJlc3Nfc3JjLG4iLCAwLAotCi0gICJDWlNWREgiLCAxMiwgMTYsICIwMDExIDEwMDEgc3NOMCAwMDAwIiwgImxkcHMgQHJzIiwgMCwKLSAgIkNaU1ZESCIsIDE2LCAxNiwgIjAxMTEgMTAwMSAwMDAwIDAwMDAgYWRkcmVzc19zcmMiLCAibGRwcyBhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWREgiLCAxNywgMTYsICIwMTExIDEwMDEgc3NOMCAwMDAwIGFkZHJlc3Nfc3JjIiwgImxkcHMgYWRkcmVzc19zcmMocnMpIiwgMCwKLQotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDExIDAwMDAgc3NzcyBkaXNwMTYiLCAibGRyIGRpc3AxNixycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMDExIDAwMDEgMDAwMCBkZGRkIGRpc3AxNiIsICJsZHIgcmQsZGlzcDE2IiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDEwIDAwMDAgc3NzcyBkaXNwMTYiLCAibGRyYiBkaXNwMTYscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDAwIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRyYiByYmQsZGlzcDE2IiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAwMTEgMDExMSAwMDAwIHNzc3MgZGlzcDE2IiwgImxkcmwgZGlzcDE2LHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMDEgMDAwMCBkZGRkIGRpc3AxNiIsICJsZHJsIHJyZCxkaXNwMTYiLCAwLAotCi0gICJDWlMtLS0iLCA3LCAxNiwgIjAxMTEgMTAxMSAwMDAwIDEwMTAiLCAibWJpdCIsIDAsCi0gICItWlMtLS0iLCAxMiwgMTYsICIwMTExIDEwMTEgZGRkZCAxMTAxIiwgIm1yZXEgcmQiLCAwLAotICAiLS0tLS0tIiwgNSwgMTYsICIwMTExIDEwMTEgMDAwMCAxMDAxIiwgIm1yZXMiLCAwLAotICAiLS0tLS0tIiwgNSwgMTYsICIwMTExIDEwMTEgMDAwMCAxMDAwIiwgIm1zZXQiLCAwLAotCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMDAxIDEwMDEgc3NOMCBkZGRkIiwgIm11bHQgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMTAxIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHQgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjAxMDEgMTAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibXVsdCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjAwMDEgMTAwMSAwMDAwIGRkZGQgaW1tMTYiLCAibXVsdCBycmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMTAwMSAxMDAxIHNzc3MgZGRkZCIsICJtdWx0IHJyZCxycyIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDAwMSAxMDAwIHNzTjAgZGRkZCIsICJtdWx0bCBycWQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIwMTAxIDEwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHRsIHJxZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDEwMSAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0bCBycWQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIwMDAxIDEwMDAgMDAwMCBkZGRkIGltbTMyIiwgIm11bHRsIHJxZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMTAwMSAxMDAwIHNzc3MgZGRkZCIsICJtdWx0bCBycWQscnJzIiwgMCwKLSAgIkNaU1YtLSIsIDEyLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMTAiLCAibmVnIEByZCIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZyBhZGRyZXNzX2RzdCIsIDAsCi0gICJDWlNWLS0iLCAxNiwgMTYsICIwMTAwIDExMDEgZGROMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZyBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMDEwIiwgIm5lZyByZCIsIDAsCi0gICJDWlNWLS0iLCAxMiwgOCwgIjAwMDAgMTEwMCBkZE4wIDAwMTAiLCAibmVnYiBAcmQiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDgsICIwMTAwIDExMDAgMDAwMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZ2IgYWRkcmVzc19kc3QiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDgsICIwMTAwIDExMDAgZGROMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZ2IgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAwMDEwIiwgIm5lZ2IgcmJkIiwgMCwKLQotICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgMDAwMCAwMTExIiwgIm5vcCIsIDAsCi0KLSAgIkNaUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTAxIHNzTjAgZGRkZCIsICJvciByZCxAcnMiLCAwLAotICAiQ1pTLS0tIiwgOSwgMTYsICIwMTAwIDAxMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaUy0tLSIsIDEwLCAxNiwgIjAxMDAgMDEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAib3IgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTAxIDAwMDAgZGRkZCBpbW0xNiIsICJvciByZCxpbW0xNiIsIDAsCi0gICJDWlMtLS0iLCA0LCAxNiwgIjEwMDAgMDEwMSBzc3NzIGRkZGQiLCAib3IgcmQscnMiLCAwLAotCi0gICJDWlNQLS0iLCA3LCA4LCAiMDAwMCAwMTAwIHNzTjAgZGRkZCIsICJvcmIgcmJkLEBycyIsIDAsCi0iQ1pTUC0tIiwgOSwgOCwgIjAxMDAgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAib3JiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNQLS0iLCAxMCwgOCwgIjAxMDAgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAib3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTUC0tIiwgNywgOCwgIjAwMDAgMDEwMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgIm9yYiByYmQsaW1tOCIsIDAsCi0gICJDWlNQLS0iLCA0LCA4LCAiMTAwMCAwMTAwIHNzc3MgZGRkZCIsICJvcmIgcmJkLHJicyIsIDAsCi0KLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMTExIGRkTjAgc3NzcyIsICJvdXQgQHJkLHJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzc3MgMDExMCBpbW0xNiIsICJvdXQgaW1tMTYscnMiLCAwLAotICAiLS0tVi0tIiwgMCwgOCwgIjAwMTEgMTExMCBkZE4wIHNzc3MiLCAib3V0YiBAcmQscmJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDEwMTAgc3NzcyAwMTEwIGltbTE2IiwgIm91dGIgaW1tMTYscmJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGQgQHJkLEBycyxyYSIsIDAsCi0gICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGRiIEByZCxAcnMscmJhIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDExMDAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAib3V0aWIgQHJkLEBycyxyYSIsIDAsCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJvdXRpYnIgQHJkLEBycyxyYSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAwMDEgMDExMSBzc04wIGRkTjAiLCAicG9wIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDE2LCAiMDEwMSAwMTExIHNzTjAgZGROMCBhZGRyZXNzX2RzdCIsICJwb3AgYWRkcmVzc19kc3QocmQpLEBycyIsIDAsCi0gICItLS0tLS0iLCAxNiwgMTYsICIwMTAxIDAxMTEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0IiwgInBvcCBhZGRyZXNzX2RzdCxAcnMiLCAwLAotICAiLS0tLS0tIiwgOCwgMTYsICIxMDAxIDAxMTEgc3NOMCBkZGRkIiwgInBvcCByZCxAcnMiLCAwLAotCi0gICItLS0tLS0iLCAxOSwgMzIsICIwMDAxIDAxMDEgc3NOMCBkZE4wIiwgInBvcGwgQHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMywgMzIsICIwMTAxIDAxMDEgc3NOMCBkZE4wIGFkZHJlc3NfZHN0IiwgInBvcGwgYWRkcmVzc19kc3QocmQpLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMywgMzIsICIwMTAxIDAxMDEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0IiwgInBvcGwgYWRkcmVzc19kc3QsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjEwMDEgMDEwMSBzc04wIGRkZGQiLCAicG9wbCBycmQsQHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDAwMSAwMDExIGRkTjAgc3NOMCIsICJwdXNoIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAwMDExIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJwdXNoIEByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAxIDAwMTEgZGROMCBzc04wIGFkZHJlc3Nfc3JjIiwgInB1c2ggQHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDAwIDExMDEgZGROMCAxMDAxIGltbTE2IiwgInB1c2ggQHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDksIDE2LCAiMTAwMSAwMDExIGRkTjAgc3NzcyIsICJwdXNoIEByZCxycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDIwLCAzMiwgIjAwMDEgMDAwMSBkZE4wIHNzTjAiLCAicHVzaGwgQHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMSwgMzIsICIwMTAxIDAwMDEgZGROMCBzc04wIGFkZHJlc3Nfc3JjIiwgInB1c2hsIEByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgMjEsIDMyLCAiMDEwMSAwMDAxIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJwdXNobCBAcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDMyLCAiMTAwMSAwMDAxIGRkTjAgc3NzcyIsICJwdXNobCBAcmQscnJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAxMCAwMDExIGRkTjAgaW1tNCIsICJyZXMgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMCAwMDExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJyZXMgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMCAwMDExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJyZXMgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCAxNiwgIjEwMTAgMDAxMSBkZGRkIGltbTQiLCAicmVzIHJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDAxMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJyZXMgcmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgOCwgIjAwMTAgMDAxMCBkZE4wIGltbTQiLCAicmVzYiBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTAgMDAxMCBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAicmVzYiBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgOCwgIjAxMTAgMDAxMCAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAicmVzYiBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDgsICIxMDEwIDAwMTAgZGRkZCBpbW00IiwgInJlc2IgcmJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCA4LCAiMDAxMCAwMDEwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInJlc2IgcmJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMDExIiwgInJlc2ZsZyBpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjEwMDEgMTExMCAwMDAwIGNjY2MiLCAicmV0IGNjIiwgMCwKLQotICAiQ1pTVi0tIiwgNiwgMTYsICIxMDExIDAwMTEgZGRkZCAwMEkwIiwgInJsIHJkLGltbTFvcjIiLCAwLAotICAiQ1pTVi0tIiwgNiwgOCwgIjEwMTEgMDAxMCBkZGRkIDAwSTAiLCAicmxiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTBJMCIsICJybGMgcmQsaW1tMW9yMiIsIDAsCi0KLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDAwMTAgZGRkZCAxMEkwIiwgInJsY2IgcmJkLGltbTFvcjIiLCAwLAotICAiLVotLS0tIiwgOSwgOCwgIjEwMTEgMTExMCBhYWFhIGJiYmIiLCAicmxkYiByYmIscmJhIiwgMCwKLQotICAiQ1pTVi0tIiwgNiwgMTYsICIxMDExIDAwMTEgZGRkZCAwMUkwIiwgInJyIHJkLGltbTFvcjIiLCAwLAotICAiQ1pTVi0tIiwgNiwgOCwgIjEwMTEgMDAxMCBkZGRkIDAxSTAiLCAicnJiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTFJMCIsICJycmMgcmQsaW1tMW9yMiIsIDAsCi0KLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDAwMTAgZGRkZCAxMUkwIiwgInJyY2IgcmJkLGltbTFvcjIiLCAwLAotICAiLVotLS0tIiwgOSwgOCwgIjEwMTEgMTEwMCBhYWFhIGJiYmIiLCAicnJkYiByYmIscmJhIiwgMCwKLSAgIkNaU1YtLSIsIDUsIDE2LCAiMTAxMSAwMTExIHNzc3MgZGRkZCIsICJzYmMgcmQscnMiLCAwLAotICAiQ1pTVkRIIiwgNSwgOCwgIjEwMTEgMDExMCBzc3NzIGRkZGQiLCAic2JjYiByYmQscmJzIiwgMCwKLQotICAiQ1pTVkRIIiwgMzMsIDgsICIwMTExIDExMTEgaW1tOCIsICJzYyBpbW04IiwgMCwKLQotIkNaU1YtLSIsIDE1LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGEgcmQscnMiLCAwLAotIkNaU1YtLSIsIDE1LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkYWIgcmJkLHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjEwMTEgMDAxMSBkZGRkIDExMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGFsIHJyZCxycyIsIDAsCi0KLSJDWlMtLS0iLCAxNSwgMTYsICIxMDExIDAwMTEgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsIHJkLHJzIiwgMCwKLSJDWlMtLS0iLCAxNSwgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGxiIHJiZCxycyIsIDAsCi0gICJDWlMtLS0iLCAxNSwgMzIsICIxMDExIDAwMTEgZGRkZCAwMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsbCBycmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDEwIDAxMDEgZGROMCBpbW00IiwgInNldCBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTEwIDAxMDEgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldCBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgMTYsICIwMTEwIDAxMDEgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldCBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDE2LCAiMTAxMCAwMTAxIGRkZGQgaW1tNCIsICJzZXQgcmQsaW1tNCIsIDAsCi0iLS0tLS0tIiwgMTAsIDE2LCAiMDAxMCAwMTAxIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInNldCByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjAwMTAgMDEwMCBkZE4wIGltbTQiLCAic2V0YiBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTAgMDEwMCBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAic2V0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgOCwgIjAxMTAgMDEwMCAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAic2V0YiBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDgsICIxMDEwIDAxMDAgZGRkZCBpbW00IiwgInNldGIgcmJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCA4LCAiMDAxMCAwMTAwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInNldGIgcmJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMDAxIiwgInNldGZsZyBpbW00IiwgMCwKLQotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBkZGRkIDAxMDEgaW1tMTYiLCAic2luYiByYmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMSBkZGRkIDAxMDEgaW1tMTYiLCAic2luYiByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCIsICJzaW5kIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCIsICJzaW5kYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNpbmliIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDExMDAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDAwMDAiLCAic2luaWJyIEByZCxAcnMscmEiLCAwLAotCi0gICJDWlNWLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAxMDAxIDAwMDAgMDAwMCBpbW04IiwgInNsYSByZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAwMSAgMDAwMCAwMDAwIGltbTgiLCAic2xhYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAxMTAxIDAwMDAgMDAwMCBpbW04IiwgInNsYWwgcnJkLGltbTgiLCAwLAotCi0gICJDWlMtLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAwMDAxIDAwMDAgMDAwMCBpbW04IiwgInNsbCByZCxpbW04IiwgMCwKLSAgIkNaUy0tLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMDAwMSAgMDAwMCAwMDAwIGltbTgiLCAic2xsYiByYmQsaW1tOCIsIDAsCi0gICJDWlMtLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAwMTAxIDAwMDAgMDAwMCBpbW04IiwgInNsbGwgcnJkLGltbTgiLCAwLAotCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc3NzIDAxMTEgaW1tMTYiLCAic291dCBpbW0xNixycyIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzc3MgMDExMSBpbW0xNiIsICJzb3V0YiBpbW0xNixyYnMiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAic291dGQgQHJkLEBycyxyYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRkYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRpYiBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAwMDAwIiwgInNvdXRpYnIgQHJkLEBycyxyYSIsIDAsCi0KLSAgIkNaU1YtLSIsIDEzLCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwMDEgMTExMSAxMTExIG5pbTgiLCAic3JhIHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDgsICIxMDExIDAwMTAgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04IiwgInNyYWIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMTEwMSAxMTExIDExMTEgbmltOCIsICJzcmFsIHJyZCxpbW04IiwgMCwKLQotICAiQ1pTVi0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAwMSAxMTExIDExMTEgbmltOCIsICJzcmwgcmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMDEgMTExMSAxMTExIG5pbTgiLCAic3JsYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAwMTAxIDExMTEgMTExMSBuaW04IiwgInNybGwgcnJkLGltbTgiLCAwLAotCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMDAxMSBzc04wIGRkZGQiLCAic3ViIHJkLEBycyIsIDAsCi0iQ1pTVi0tIiwgOSwgMTYsICIwMTAwIDAwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YiByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgMTYsICIwMTAwIDAwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YiByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMTAgMDAwMCBkZGRkIGltbTE2IiwgInN1YiByZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCA0LCAxNiwgIjEwMDAgMDAxMSBzc3NzIGRkZGQiLCAic3ViIHJkLHJzIiwgMCwKLQotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAxMCBzc04wIGRkZGQiLCAic3ViYiByYmQsQHJzIiwgMCwKLSJDWlNWREgiLCA5LCA4LCAiMDEwMCAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWJiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWREgiLCAxMCwgOCwgIjAxMDAgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAic3ViYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJzdWJiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1ZESCIsIDQsIDgsICIxMDAwIDAwMTAgc3NzcyBkZGRkIiwgInN1YmIgcmJkLHJicyIsIDAsCi0KLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAxMCBzc04wIGRkZGQiLCAic3VibCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAic3VibCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDMyLCAiMDEwMSAwMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMDEwIDAwMDAgZGRkZCBpbW0zMiIsICJzdWJsIHJyZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDAxMCBzc3NzIGRkZGQiLCAic3VibCBycmQscnJzIiwgMCwKLQotICAiLS0tLS0tIiwgNSwgMTYsICIxMDEwIDExMTEgZGRkZCBjY2NjIiwgInRjYyBjYyxyZCIsIDAsCi0gICItLS0tLS0iLCA1LCA4LCAiMTAxMCAxMTEwIGRkZGQgY2NjYyIsICJ0Y2NiIGNjLHJiZCIsIDAsCi0KLSAgIi1aUy0tLSIsIDgsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDEwMCIsICJ0ZXN0IEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3QgYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0IGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAxMDAiLCAidGVzdCByZCIsIDAsCi0KLSAgIi1aU1AtLSIsIDgsIDgsICIwMDAwIDExMDAgZGROMCAwMTAwIiwgInRlc3RiIEByZCIsIDAsCi0gICItWlNQLS0iLCAxMSwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMDAgYWRkcmVzc19kc3QiLCAidGVzdGIgYWRkcmVzc19kc3QiLCAwLAotICAiLVpTUC0tIiwgMTIsIDgsICIwMTAwIDExMDAgZGROMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3RiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDEwMCIsICJ0ZXN0YiByYmQiLCAwLAotCi0gICItWlMtLS0iLCAxMywgMzIsICIwMDAxIDExMDAgZGROMCAxMDAwIiwgInRlc3RsIEByZCIsIDAsCi0iLVpTLS0tIiwgMTYsIDMyLCAiMDEwMSAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0bCBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlMtLS0iLCAxNywgMzIsICIwMTAxIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgInRlc3RsIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlMtLS0iLCAxMywgMzIsICIxMDAxIDExMDAgZGRkZCAxMDAwIiwgInRlc3RsIHJyZCIsIDAsCi0KLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMTAwMCAwMDAwIGFhYWEgc3NOMCAwMDAwIiwgInRyZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAxMTAwIDAwMDAgYWFhYSBzc04wIDAwMDAiLCAidHJkcmIgQHJkLEBycyxyYmEiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAwMDAwIDAwMDAgcnJyciBzc04wIDAwMDAiLCAidHJpYiBAcmQsQHJzLHJiciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBkZE4wIDAxMDAgMDAwMCBycnJyIHNzTjAgMDAwMCIsICJ0cmlyYiBAcmQsQHJzLHJiciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBhYU4wIDExMTAgMDAwMCBycnJyIGJiTjAgMTExMCIsICJ0cnRkcmIgQHJhLEByYixyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAwMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAiLCAidHJ0aWIgQHJhLEByYixyciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBhYU4wIDAxMTAgMDAwMCBycnJyIGJiTjAgMTExMCIsICJ0cnRpcmIgQHJhLEByYixyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAxMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAiLCAidHJ0cmIgQHJhLEByYixyYnIiLCAwLAotCi0gICItLVMtLS0iLCAxMSwgMTYsICIwMDAwIDExMDEgZGROMCAwMTEwIiwgInRzZXQgQHJkIiwgMCwKLSAgIi0tUy0tLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAxMTAgYWRkcmVzc19kc3QiLCAidHNldCBhZGRyZXNzX2RzdCIsIDAsCi0gICItLVMtLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXQgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tUy0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMDExMCIsICJ0c2V0IHJkIiwgMCwKLQotICAiLS1TLS0tIiwgMTEsIDgsICIwMDAwIDExMDAgZGROMCAwMTEwIiwgInRzZXRiIEByZCIsIDAsCi0gICItLVMtLS0iLCAxNCwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMTAgYWRkcmVzc19kc3QiLCAidHNldGIgYWRkcmVzc19kc3QiLCAwLAotICAiLS1TLS0tIiwgMTUsIDgsICIwMTAwIDExMDAgZGROMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXRiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLVMtLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDExMCIsICJ0c2V0YiByYmQiLCAwLAotCi0gICItWlMtLS0iLCA3LCAxNiwgIjAwMDAgMTAwMSBzc04wIGRkZGQiLCAieG9yIHJkLEBycyIsIDAsCi0iLVpTLS0tIiwgOSwgMTYsICIwMTAwIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvciByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlMtLS0iLCAxMCwgMTYsICIwMTAwIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvciByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDEwMDEgMDAwMCBkZGRkIGltbTE2IiwgInhvciByZCxpbW0xNiIsIDAsCi0gICItWlMtLS0iLCA0LCAxNiwgIjEwMDAgMTAwMSBzc3NzIGRkZGQiLCAieG9yIHJkLHJzIiwgMCwKLQotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMTAwMCBzc04wIGRkZGQiLCAieG9yYiByYmQsQHJzIiwgMCwKLSItWlNQLS0iLCA5LCA4LCAiMDEwMCAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3JiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlNQLS0iLCAxMCwgOCwgIjAxMDAgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAieG9yYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDEwMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJ4b3JiIHJiZCxpbW04IiwgMCwKLSAgIi1aU1AtLSIsIDQsIDgsICIxMDAwIDEwMDAgc3NzcyBkZGRkIiwgInhvcmIgcmJkLHJicyIsIDAsCi0gICIqIiwgNCwgOCwgIjEwMDAgMTAwMCBzc3NzIGRkZGQiLCAieG9yYiByYmQscmJzIiwgMCwKLSAgIioiLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi1pbnQKLWNvdW50ICgpCi17Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLSAgaW50IHIgPSAwOwotCi0gIHdoaWxlIChwLT5uYW1lKQotICAgIHsKLSAgICAgIHIrKzsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHJldHVybiByOwotCi19Ci0KLXN0YXRpYwotaW50Ci1mdW5jIChhLCBiKQotICAgICBzdHJ1Y3Qgb3AgKmE7Ci0gICAgIHN0cnVjdCBvcCAqYjsKLXsKLSAgcmV0dXJuIHN0cmNtcCAoKGEpLT5uYW1lLCAoYiktPm5hbWUpOwotfQotCi0KLS8qIG9wY29kZQotCi0gbGl0ZXJhbCAgMDAwMCBubm5uIGluc2VydCBubm4gaW50byBzdHJlYW0KLSBvcGVyYW5kICAwMDAxIG5ubm4gIGluc2VydCBvcGVyYW5kIHJlZyBubm4gaW50byBzdHJlYW0KLSovCi0KLXN0cnVjdCB0b2tfc3RydWN0Ci17Ci0KLSAgY2hhciAqbWF0Y2g7Ci0gIGNoYXIgKnRva2VuOwotICBpbnQgbGVuZ3RoOwotfTsKLQotc3RydWN0IHRva19zdHJ1Y3QgYXJnc1tdID0KLXsKLQotICB7ImFkZHJlc3Nfc3JjKHJzKSIsICJDTEFTU19YKyhBUkdfUlMpIix9LAotICB7ImFkZHJlc3NfZHN0KHJkKSIsICJDTEFTU19YKyhBUkdfUkQpIix9LAotCi0gIHsicnMoaW1tMTYpIiwgIkNMQVNTX0JBKyhBUkdfUlMpIix9LAotICB7InJkKGltbTE2KSIsICJDTEFTU19CQSsoQVJHX1JEKSIsfSwKLSAgeyJwcmQiLCAgICAgICAiQ0xBU1NfUFIrKEFSR19SRCkiLH0sCi0gIHsiYWRkcmVzc19zcmMiLCAiQ0xBU1NfREErKEFSR19TUkMpIix9LAotICB7ImFkZHJlc3NfZHN0IiwgIkNMQVNTX0RBKyhBUkdfRFNUKSIsfSwKLSAgeyJyZChyeCkiLCAiQ0xBU1NfQlgrKEFSR19SRCkiLH0sCi0gIHsicnMocngpIiwgIkNMQVNTX0JYKyhBUkdfUlMpIix9LAotCi0gIHsiZGlzcDE2IiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZGlzcDEyIiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZGlzcDciLCAiQ0xBU1NfRElTUCIsfSwKLSAgeyJkaXNwOCIsICJDTEFTU19ESVNQIix9LAotICB7ImZsYWdzIiwgIkNMQVNTX0ZMQUdTIix9LAotCi0gIHsiaW1tMTYiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMTYpIix9LAotICB7ImltbTFvcjIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMikiLH0sCi0gIHsiaW1tMzIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMzIpIix9LAotICB7ImltbTRtMSIsICJDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSIsfSwKLSAgeyJpbW00IiwgIkNMQVNTX0lNTSArKEFSR19JTU00KSIsfSwKLSAgeyJuIiwgIkNMQVNTX0lNTSArIChBUkdfSU1NTikiLH0sCi0gIHsiY3RybCIsICJDTEFTU19DVFJMIix9LAotICB7InJiYSIsICJDTEFTU19SRUdfQllURSsoQVJHX1JBKSIsfSwKLSAgeyJyYmIiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SQikiLH0sCi0gIHsicmJkIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUkQpIix9LAotICB7InJicyIsICJDTEFTU19SRUdfQllURSsoQVJHX1JTKSIsfSwKLSAgeyJyYnIiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SUikiLH0sCi0KLSAgeyJycmQiLCAiQ0xBU1NfUkVHX0xPTkcrKEFSR19SRCkiLH0sCi0gIHsicnJzIiwgIkNMQVNTX1JFR19MT05HKyhBUkdfUlMpIix9LAotCi0gIHsicnFkIiwgIkNMQVNTX1JFR19RVUFEKyhBUkdfUkQpIix9LAotCi0gIHsicmQiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SRCkiLH0sCi0gIHsicnMiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUykiLH0sCi0KLSAgeyJAcmQiLCAiQ0xBU1NfSVIrKEFSR19SRCkiLH0sCi0gIHsiQHJhIiwgIkNMQVNTX0lSKyhBUkdfUkEpIix9LAotICB7IkByYiIsICJDTEFTU19JUisoQVJHX1JCKSIsfSwKLSAgeyJAcnMiLCAiQ0xBU1NfSVIrKEFSR19SUykiLH0sCi0KLSAgeyJpbW04IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTgpIix9LAotICB7ImkyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTIpIix9LAotICB7ImNjIiwgIkNMQVNTX0NDIix9LAotCi0gIHsicnIiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUikiLH0sCi0gIHsicmEiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSkiLH0sCi0gIHsicnMiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUykiLH0sCi0KLSAgeyIxIiwgIkNMQVNTX0lNTSsoQVJHX0lNTV8xKSIsfSwKLSAgeyIyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTV8yKSIsfSwKLQotICAwLCAwCi19OwotCi1zdHJ1Y3QgdG9rX3N0cnVjdCB0b2tzW10gPQotewotICAiMDAwMCIsICJDTEFTU19CSVQrMCIsIDEsCi0gICIwMDAxIiwgIkNMQVNTX0JJVCsxIiwgMSwKLSAgIjAwMTAiLCAiQ0xBU1NfQklUKzIiLCAxLAotICAiMDAxMSIsICJDTEFTU19CSVQrMyIsIDEsCi0gICIwMTAwIiwgIkNMQVNTX0JJVCs0IiwgMSwKLSAgIjAxMDEiLCAiQ0xBU1NfQklUKzUiLCAxLAotICAiMDExMCIsICJDTEFTU19CSVQrNiIsIDEsCi0gICIwMTExIiwgIkNMQVNTX0JJVCs3IiwgMSwKLSAgIjEwMDAiLCAiQ0xBU1NfQklUKzgiLCAxLAotICAiMTAwMSIsICJDTEFTU19CSVQrOSIsIDEsCi0gICIxMDEwIiwgIkNMQVNTX0JJVCsweGEiLCAxLAotICAiMTAxMSIsICJDTEFTU19CSVQrMHhiIiwgMSwKLSAgIjExMDAiLCAiQ0xBU1NfQklUKzB4YyIsIDEsCi0gICIxMTAxIiwgIkNMQVNTX0JJVCsweGQiLCAxLAotICAiMTExMCIsICJDTEFTU19CSVQrMHhlIiwgMSwKLSAgIjExMTEiLCAiQ0xBU1NfQklUKzB4ZiIsIDEsCi0KLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMCIsIDEsCi0gICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzEiLCAxLAotICAiMDBJMCIsICJDTEFTU19CSVRfMU9SMisyIiwgMSwKLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMyIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzQiLCAxLAotICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis1IiwgMSwKLSAgIjAxSTAiLCAiQ0xBU1NfQklUXzFPUjIrNiIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzciLCAxLAotICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMis4IiwgMSwKLSAgIjEwSTAiLCAiQ0xBU1NfQklUXzFPUjIrOSIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YSIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YiIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YyIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZCIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZSIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZiIsIDEsCi0KLSAgInNzc3MiLCAiQ0xBU1NfUkVHKyhBUkdfUlMpIiwgMSwKLSAgImRkZGQiLCAiQ0xBU1NfUkVHKyhBUkdfUkQpIiwgMSwKLSAgImFhYWEiLCAiQ0xBU1NfUkVHKyhBUkdfUkEpIiwgMSwKLSAgImJiYmIiLCAiQ0xBU1NfUkVHKyhBUkdfUkIpIiwgMSwKLSAgInJycnIiLCAiQ0xBU1NfUkVHKyhBUkdfUlIpIiwgMSwKLQotICAic3NOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JTKSIsIDEsCi0gICJkZE4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUkQpIiwgMSwKLSAgImFhTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SQSkiLCAxLAotICAiYmJOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JCKSIsIDEsCi0gICJyck4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUlIpIiwgMSwKLQotICAiY2NjYyIsICJDTEFTU19DQyIsIDEsCi0gICJubm5uIiwgIkNMQVNTX0lNTSsoQVJHX0lNTU4pIiwgMSwKLSAgInh4eHgiLCAiQ0xBU1NfUkVHKyhBUkdfUlgpIiwgMSwKLSAgInh4TjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SWCkiLCAxLAotICAibm1pbnVzMSIsICJDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSIsIDEsCi0KLSAgImRpc3AxNiIsICJDTEFTU19ESVNQKyhBUkdfRElTUDE2KSIsIDQsCi0gICJkaXNwMTIiLCAiQ0xBU1NfRElTUCsoQVJHX0RJU1AxMikiLCAzLAotICAiZmxhZ3MiLCAiQ0xBU1NfRkxBR1MiLCAxLAotICAiYWRkcmVzc19kc3QiLCAiQ0xBU1NfQUREUkVTUysoQVJHX0RTVCkiLCA0LAotICAiYWRkcmVzc19zcmMiLCAiQ0xBU1NfQUREUkVTUysoQVJHX1NSQykiLCA0LAotICAiaW1tNG0xIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTRNMSkiLCAxLAotICAiaW1tNCIsICJDTEFTU19JTU0rKEFSR19JTU00KSIsIDEsCi0KLSAgImltbTgiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NOCkiLCAyLAotICAiaW1tMTYiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMTYpIiwgNCwKLSAgImltbTMyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTMyKSIsIDgsCi0gICJuaW04IiwgIkNMQVNTX0lNTSsoQVJHX05JTTgpIiwgMiwKLSAgIjBjY2MiLCAiQ0xBU1NfMENDQyIsIDEsCi0gICIxY2NjIiwgIkNMQVNTXzFDQ0MiLCAxLAotICAiZGlzcDgiLCAiQ0xBU1NfRElTUDgiLCAyLAotICAiMGRpc3A3IiwgIkNMQVNTXzBESVNQNyIsIDIsCi0gICIxZGlzcDciLCAiQ0xBU1NfMURJU1A3IiwgMiwKLSAgIjAxaWkiLCAiQ0xBU1NfMDFJSSIsIDEsCi0gICIwMGlpIiwgIkNMQVNTXzAwSUkiLCAxLAotICAwLCAwCi0KLX07Ci0KLWNoYXIgKgotdHJhbnNsYXRlICh0YWJsZSwgeCwgbGVuZ3RoKQotICAgICBzdHJ1Y3QgdG9rX3N0cnVjdCAqdGFibGU7Ci0gICAgIGNoYXIgKng7Ci0gICAgIGludCAqbGVuZ3RoOwotewotCi0gIGludCBmb3VuZDsKLQotICBmb3VuZCA9IDA7Ci0gIHdoaWxlICh0YWJsZS0+bWF0Y2gpCi0gICAgewotICAgICAgaW50IGwgPSBzdHJsZW4gKHRhYmxlLT5tYXRjaCk7Ci0KLSAgICAgIGlmIChzdHJuY21wICh0YWJsZS0+bWF0Y2gsIHgsIGwpID09IDApCi0JewotCSAgLyogR290IGEgaGl0ICovCi0JICBwcmludGYgKCIlcyIsIHRhYmxlLT50b2tlbik7Ci0JICAqbGVuZ3RoICs9IHRhYmxlLT5sZW5ndGg7Ci0JICByZXR1cm4geCArIGw7Ci0JfQotCi0gICAgICB0YWJsZSsrOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3QgZmluZCAlc1xuIiwgeCk7Ci0gIHByaW50ZiAoIioqKiogQ2FuJ3QgZmluZCAlc1xuIiwgeCk7Ci0gIHdoaWxlICgqeCkKLSAgICB4Kys7Ci0gIHJldHVybiB4OwotfQotCi12b2lkCi1jaGV3Yml0cyAoYml0cywgbGVuZ3RoKQotICAgICBjaGFyICpiaXRzOwotICAgICBpbnQgKmxlbmd0aDsKLXsKLSAgaW50IG4gPSAwOwotCi0gICpsZW5ndGggPSAwOwotICBwcmludGYgKCJ7Iik7Ci0gIHdoaWxlICgqYml0cykKLSAgICB7Ci0gICAgICB3aGlsZSAoKmJpdHMgPT0gJyAnKQotCXsKLQkgIGJpdHMrKzsKLQl9Ci0gICAgICBiaXRzID0gdHJhbnNsYXRlICh0b2tzLCBiaXRzLCBsZW5ndGgpOwotICAgICAgbisrOwotICAgICAgcHJpbnRmICgiLCIpOwotCi0gICAgfQotICB3aGlsZSAobiA8IEJZVEVfSU5GT19MRU4gLSAxKQotICAgIHsKLSAgICAgIHByaW50ZiAoIjAsIik7Ci0gICAgICBuKys7Ci0gICAgfQotICBwcmludGYgKCJ9Iik7Ci19Ci0KLQotc3RhdGljCi1pbnQKLWNoZXduYW1lIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBjaGFyICpuOwotICBpbnQgbmFyZ3MgPSAwOwotCi0gIG4gPSBuYW1lOwotICBwcmludGYgKCJcIiIpOwotICB3aGlsZSAoKm4gJiYgIWlzd2hpdGUgKCpuKSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlYyIsICpuKTsKLSAgICAgIG4rKzsKLSAgICB9Ci0gIHByaW50ZiAoIlwiLCIpOwkJLyogU2NhbiB0aGUgb3BlcmFuZHMgYW5kIG1ha2UgZW50aXJlcyBmb3IKLQkJCQkgICB0aGVtIC1yZW1lbWJlciBpbmRpcmVjdCB0aGluZ3MgKi8KLQotICBuID0gbmFtZTsKLSAgcHJpbnRmICgiT1BDXyIpOwotICB3aGlsZSAoKm4gJiYgIWlzd2hpdGUgKCpuKSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlYyIsICpuKTsKLSAgICAgIG4rKzsKLSAgICB9Ci0gIHByaW50ZiAoIiwwLHsiKTsKLQotICB3aGlsZSAoKm4pCi0gICAgewotICAgICAgaW50IGQ7Ci0KLSAgICAgIHdoaWxlICgqbiA9PSAnLCcgfHwgaXN3aGl0ZSAoKm4pKQotCW4rKzsKLSAgICAgIG5hcmdzKys7Ci0gICAgICBuID0gdHJhbnNsYXRlIChhcmdzLCBuLCAmZCk7Ci0gICAgICBwcmludGYgKCIsIik7Ci0gICAgfQotICBpZiAobmFyZ3MgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIwIik7Ci0gICAgfQotICBwcmludGYgKCJ9LCIpOwotICByZXR1cm4gbmFyZ3M7Ci19Ci0KLXN0YXRpYyAKLXZvaWQKLXN1YiAoeCwgYykKLSAgICAgY2hhciAqeDsKLSAgICAgY2hhciBjOwotewotICB3aGlsZSAoKngpCi0gICAgewotICAgICAgaWYgKHhbMF0gPT0gYyAmJiB4WzFdID09IGMgJiYKLQkgIHhbMl0gPT0gYyAmJiB4WzNdID09IGMpCi0JewotCSAgeFsyXSA9ICdOJzsKLQkgIHhbM10gPSAnMCc7Ci0JfQotICAgICAgeCsrOwotICAgIH0KLX0KLQotCi0jaWYgMAotI2RlZmluZSBEKHgpICgoeCkgPT0gJzEnIHx8ICh4KSA9PScwJykKLSNkZWZpbmUgTSh5KSAoc3RybmNtcCh5LHgsNCk9PTApCi1wcmludG1hbmdsZWQgKHgpCi0gICAgIGNoYXIgKng7Ci17Ci0gIHJldHVybjsKLSAgd2hpbGUgKCp4KQotICAgIHsKLSAgICAgIGlmIChEICh4WzBdKSAmJiBEICh4WzFdKSAmJiBEICh4WzJdKSAmJiBEICh4WzNdKSkKLQl7Ci0JICBwcmludGYgKCJYWFhYIik7Ci0JfQotICAgICAgZWxzZSBpZiAoTSAoInNzc3MiKSkKLQl7Ci0JICBwcmludGYgKCJzc3NzIik7Ci0JfQotICAgICAgZWxzZSBpZiAoTSAoImRkZGQiKSkKLQl7Ci0JICBwcmludGYgKCJkZGRkIik7Ci0JfQotICAgICAgZWxzZQotCXByaW50ZiAoIl9fX18iKTsKLQotICAgICAgeCArPSA0OwotCi0gICAgICBpZiAoeFswXSA9PSAnICcpCi0JewotCSAgcHJpbnRmICgiXyIpOwotCSAgeCsrOwotCX0KLSAgICB9Ci0KLX0KLQotI2VuZGlmCi0vKiNkZWZpbmUgV09SS19UWVBFKi8KLXZvaWQKLXByaW50X3R5cGUgKG4pCi0gICAgIHN0cnVjdCBvcCAqbjsKLXsKLSNpZmRlZiBXT1JLX1RZUEUKLSAgd2hpbGUgKCpzICYmICFpc3doaXRlICgqcykpCi0gICAgewotICAgICAgbCA9ICpzOwotICAgICAgcysrOwotICAgIH0KLSAgc3dpdGNoIChsKQotICAgIHsKLSAgICBjYXNlICdsJzoKLSAgICAgIHByaW50ZiAoIjMyLCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICBwcmludGYgKCI4LCIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoIjE2LCIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2Vsc2UKLSAgcHJpbnRmICgiJTJkLCIsIG4tPnR5cGUpOwotI2VuZGlmCi19Ci0KLQotdm9pZAotaW50ZXJuYWwgKCkKLXsKLSAgaW50IGMgPSBjb3VudCAoKTsKLSAgc3RydWN0IG9wICpuZXcgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcCkgKiBjKTsKLSAgc3RydWN0IG9wICpwID0gb3B0OwotICBtZW1jcHkgKG5ldywgcCwgYyAqIHNpemVvZiAoc3RydWN0IG9wKSk7Ci0KLSAgLyogc29ydCBhbGwgbmFtZXMgaW4gdGFibGUgYWxwaGFiZXRpY2FsbHkgKi8KLSAgcXNvcnQgKG5ldywgYywgc2l6ZW9mIChzdHJ1Y3Qgb3ApLCBmdW5jKTsKLQotICBwID0gbmV3OwotICB3aGlsZSAocC0+ZmxhZ3NbMF0gIT0gJyonKQotICB7Ci0gICAgLyogSWYgdGhlcmUgYXJlIGFueSBAcnMsIHN1YiB0aGUgc3NzcyBpbnRvIGEgc3NuMCwKLSAgICAgICAocnMpLCAoc3NuMCkKLSAgICAgICAqLwotICAgIGludCBsb29wID0gMTsKLQotICAgIHByaW50ZiAoIlwiJXNcIiwlMmQsICIsIHAtPmZsYWdzLCBwLT5jeWNsZXMpOwotICAgIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIGNoYXIgKnMgPSBwLT5uYW1lOwotCi0gICAgICBsb29wID0gMDsKLSAgICAgIHdoaWxlICgqcykKLSAgICAgIHsKLQlpZiAoc1swXSA9PSAnQCcpCi0JewotCSAgY2hhciBjOwotCi0JICAvKiBza2lwIHRoZSByIGFuZCBzdWIgdGhlIHN0cmluZyAqLwotCSAgcysrOwotCSAgYyA9IHNbMV07Ci0JICBzdWIgKHAtPmJpdHMsIGMpOwotCX0KLQlpZiAoc1swXSA9PSAnKCcgJiYgc1szXSA9PSAnKScpCi0JewotCSAgc3ViIChwLT5iaXRzLCBzWzJdKTsKLQl9Ci0JaWYgKHNbMF0gPT0gJygnKQotCXsKLQkgIHN1YiAocC0+Yml0cywgc1stMV0pOwotCX0KLQotCXMrKzsKLSAgICAgIH0KLQotICAgIH0KLSAgICBwcmludF90eXBlIChwKTsKLSAgICBwcmludGYgKCJcIiVzXCIsXCIlc1wiLDAsXG4iLCBwLT5iaXRzLCBwLT5uYW1lKTsKLSAgICBwKys7Ci0gIH0KLX0KLQotc3RhdGljIAotdm9pZAotZ2FzICgpCi17Ci0gIGludCBjID0gY291bnQgKCk7Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLSAgaW50IGlkeCA9IDA7Ci0gIGNoYXIgKm9sZG5hbWUgPSAiIjsKLSAgc3RydWN0IG9wICpuZXcgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcCkgKiBjKTsKLQotICBtZW1jcHkgKG5ldywgcCwgYyAqIHNpemVvZiAoc3RydWN0IG9wKSk7Ci0KLSAgLyogc29ydCBhbGwgbmFtZXMgaW4gdGFibGUgYWxwaGFiZXRpY2FsbHkgKi8KLSAgcXNvcnQgKG5ldywgYywgc2l6ZW9mIChzdHJ1Y3Qgb3ApLCBmdW5jKTsKLQotICBwcmludGYgKCIJCQkvKiBUSElTIEZJTEUgSVMgQVVUT01BR0lDQUxMWSBHRU5FUkFURUQsIERPTidUIEVESVQgSVQgKi9cbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX01BU0sgMHgwZlxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfU1JDIDB4MDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19EU1QgMHgwMlxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUlMgMHgwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JEIDB4MDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SQSAweDAzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUkIgMHgwNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JSIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SWCAweDA2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NNCAweDAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NOCAweDAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMTYgMHgwM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTMyIDB4MDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1OIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1OTUlOVVMxIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1fMSAweDA2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NXzIgMHgwN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0RJU1AxNiAweDA4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfTklNOCAweDA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMiAweDBhXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMU9SMiAweDBiXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQMTIgMHgwYlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0RJU1A4IDB4MGNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU00TTEgMHgwZFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfTUFTSyAweDFmZmYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19YIDB4MTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JBIDB4MjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0RBIDB4MzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JYIDB4NDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0RJU1AgMHg1MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfSU1NIDB4NjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0NDIDB4NzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0NUUkwgMHg4MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQUREUkVTUyAweGQwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wQ0NDIDB4ZTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzFDQ0MgMHhmMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMERJU1A3IDB4MTAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18xRElTUDcgMHgyMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzAxSUkgMHgzMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzAwSUkgMHg0MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JJVCAweDUwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfRkxBR1MgMHg2MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0lSIDB4NzAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19ESVNQOCAweDgwMFxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CSVRfMU9SMiAweDkwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHIDB4NzAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX0JZVEUgMHgyMDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdfV09SRCAweDMwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19RVUFEIDB4NDAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX0xPTkcgMHg1MDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdOMCAweDgwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1BSIDB4MTAwMDBcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkYyAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRjYiAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkIDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGRiIDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGRsIDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hbmQgNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FuZGIgNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JpdCA3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYml0YiA4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY2FsbCA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY2FsciAxMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NsciAxMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NscmIgMTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jb20gMTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jb21iIDE0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tZmxnIDE1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3AgMTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGIgMTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGQgMThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGRiIDE5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkciAyMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwZHJiIDIxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpIDIyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpYiAyM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaXIgMjRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGlyYiAyNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwbCAyNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2QgMjdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkYiAyOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2RyIDI5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzZHJiIDMwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaSAzMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2liIDMyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaXIgMzNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNpcmIgMzRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kYWIgMzVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kYmpueiAzNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RlYyAzN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RlY2IgMzhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaSAzOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RpdiA0MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RpdmwgNDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kam56IDQyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZWkgNDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leCA0NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4YiA0NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dHMgNDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzYiA0N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dHNsIDQ4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaGFsdCA0OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luIDUwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5iIDUxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5jIDUyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5jYiA1M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luZCA1NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luZGIgNTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmliIDU2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5pYnIgNTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pcmV0IDU4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfanAgNTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19qciA2MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkIDYxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRhIDYyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRhciA2M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYiA2NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkY3RsIDY1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpciA2NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaXJiIDY3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRrIDY4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRsIDY5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRtIDcwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRwcyA3MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkciA3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkcmIgNzNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHJsIDc0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbWJpdCA3NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX21yZXEgNzZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tcmVzIDc3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXNldCA3OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX211bHQgNzlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tdWx0bCA4MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX25lZyA4MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX25lZ2IgODJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ub3AgODNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vciA4NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX29yYiA4NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dCA4NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGIgODdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRkIDg4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0ZGIgODlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRpYiA5MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGliciA5MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3BvcCA5MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3BvcGwgOTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19wdXNoIDk0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcHVzaGwgOTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yZXMgOTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yZXNiIDk3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzZmxnIDk4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmV0IDk5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmwgMTAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmxiIDEwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsYyAxMDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGNiIDEwM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsZGIgMTA0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnIgMTA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnJiIDEwNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyYyAxMDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmNiIDEwOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyZGIgMTA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2JjIDExMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NiY2IgMTExXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RhIDExMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYWIgMTEzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RhbCAxMTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGwgMTE1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsYiAxMTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGxsIDExN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NldCAxMThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXRiIDExOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NldGZsZyAxMjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5iIDEyMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmQgMTIyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luZGIgMTIzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luaWIgMTI0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luaWJyIDEyNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsYSAxMjZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGFiIDEyN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsYWwgMTI4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xsIDEyOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbGIgMTMwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xsbCAxMzFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0IDEzMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRiIDEzM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRkIDEzNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRkYiAxMzVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0aWIgMTM2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGliciAxMzdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmEgMTM4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhYiAxMzlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmFsIDE0MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NybCAxNDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmxiIDE0MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NybGwgMTQzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3ViIDE0NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YmIgMTQ1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3VibCAxNDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190Y2MgMTQ3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGNjYiAxNDhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0IDE0OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Rlc3RiIDE1MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Rlc3RsIDE1MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyZGIgMTUyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJkcmIgMTUzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJpYiAxNTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cmlyYiAxNTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cnRkcmIgMTU2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0aWIgMTU3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0aXJiIDE1OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydHJiIDE1OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RzZXQgMTYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHNldGIgMTYxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfeG9yIDE2MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3hvcmIgMTYzXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGQgIDE2NCBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGRiICAxNjUgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkciAgMTY2IFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkZHJiIDE2NyAgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpICAxNjggXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpYiAxNjkgIFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NjICAgMTcwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYnB0ICAgMTcxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0MGUgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0MGYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0OGUgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0OGYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDM2IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQzOCAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkNzggMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDdlIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQ5ZCAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkOWYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZGI5IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmRiZiAxNzJcbiIpOwotI2lmIDAKLSAgZm9yIChpID0gMDsgdG9rc1tpXS50b2tlbjsgaSsrKQotICAgIHByaW50ZiAoIiNkZWZpbmUgJXNcdDB4JXhcbiIsIHRva3NbaV0udG9rZW4sIGkgKiAxNik7Ci0jZW5kaWYKLSAgcHJpbnRmICgidHlwZWRlZiBzdHJ1Y3Qge1xuIik7Ci0KLSAgcHJpbnRmICgiI2lmZGVmIE5JQ0VOQU1FU1xuIik7Ci0gIHByaW50ZiAoImNoYXIgKm5pY2VuYW1lO1xuIik7Ci0gIHByaW50ZiAoImludCB0eXBlO1xuIik7Ci0gIHByaW50ZiAoImludCBjeWNsZXM7XG4iKTsKLSAgcHJpbnRmICgiaW50IGZsYWdzO1xuIik7Ci0gIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0gIHByaW50ZiAoImNoYXIgKm5hbWU7XG4iKTsKLSAgcHJpbnRmICgidW5zaWduZWQgY2hhciBvcGNvZGU7XG4iKTsKLSAgcHJpbnRmICgidm9pZCAoKmZ1bmMpKCk7XG4iKTsKLSAgcHJpbnRmICgidW5zaWduZWQgaW50IGFyZ19pbmZvWzRdO1xuIik7Ci0gIHByaW50ZiAoInVuc2lnbmVkIGludCBieXRlX2luZm9bJWRdO1xuIiwgQllURV9JTkZPX0xFTik7Ci0gIHByaW50ZiAoImludCBub3BlcmFuZHM7XG4iKTsKLSAgcHJpbnRmICgiaW50IGxlbmd0aDtcbiIpOwotICBwcmludGYgKCJpbnQgaWR4O1xuIik7Ci0gIHByaW50ZiAoIn0gb3Bjb2RlX2VudHJ5X3R5cGU7XG4iKTsKLSAgcHJpbnRmICgiI2lmZGVmIERFRklORV9UQUJMRVxuIik7Ci0gIHByaW50ZiAoIm9wY29kZV9lbnRyeV90eXBlIHo4a190YWJsZVtdID0ge1xuIik7Ci0KLSAgd2hpbGUgKG5ldy0+ZmxhZ3MgJiYgbmV3LT5mbGFnc1swXSkKLSAgICB7Ci0gICAgICBpbnQgbmFyZ3M7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBwcmludGYgKCJcblxuLyogJXMgKioqICVzICovXG4iLCBuZXctPmJpdHMsIG5ldy0+bmFtZSk7Ci0gICAgICBwcmludGYgKCJ7XG4iKTsKLQotICAgICAgcHJpbnRmICgiI2lmZGVmIE5JQ0VOQU1FU1xuIik7Ci0gICAgICBwcmludGYgKCJcIiVzXCIsJWQsJWQsXG4iLCBuZXctPm5hbWUsIG5ldy0+dHlwZSwgbmV3LT5jeWNsZXMpOwotICAgICAgewotCWludCBhbnN3ZXIgPSAwOwotCWNoYXIgKnAgPSBuZXctPmZsYWdzOwotCi0Jd2hpbGUgKCpwKQotCSAgewotCSAgICBhbnN3ZXIgPDw9IDE7Ci0KLQkgICAgaWYgKCpwICE9ICctJykKLQkgICAgICBhbnN3ZXIgfD0gMTsKLQkgICAgcCsrOwotCSAgfQotCXByaW50ZiAoIjB4JTAyeCxcbiIsIGFuc3dlcik7Ci0gICAgICB9Ci0KLSAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0KLSAgICAgIG5hcmdzID0gY2hld25hbWUgKG5ldy0+bmFtZSk7Ci0KLSAgICAgIHByaW50ZiAoIlxuXHQiKTsKLSAgICAgIGNoZXdiaXRzIChuZXctPmJpdHMsICZsZW5ndGgpOwotICAgICAgbGVuZ3RoIC89IDI7Ci0gICAgICBpZiAobGVuZ3RoICYgMSkKLQlhYm9ydCgpOwotCi0gICAgICBwcmludGYgKCIsJWQsJWQsJWQiLCBuYXJncywgbGVuZ3RoLCBpZHgpOwotICAgICAgaWR4Kys7Ci0gICAgICBvbGRuYW1lID0gbmV3LT5uYW1lOwotICAgICAgcHJpbnRmICgifSxcbiIpOwotICAgICAgbmV3Kys7Ci0gICAgfQotICBwcmludGYgKCIwLDB9O1xuIik7Ci0gIHByaW50ZiAoIiNlbmRpZlxuIik7Ci19Ci0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqKmF2OwotewotICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7Ci0KLSAgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi10IikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbCAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1oIikgPT0gMCkKLSAgICB7Ci0gICAgICB3aGlsZSAocC0+bmFtZSkKLQl7Ci0JICBwcmludGYgKCIlLTI1c1x0JXNcbiIsIHAtPm5hbWUsIHAtPmJpdHMpOwotCSAgcCsrOwotCX0KLSAgICB9Ci0KLSAgZWxzZSBpZiAoYWMgPT0gMiAmJiBzdHJjbXAgKGF2WzFdLCAiLWEiKSA9PSAwKQotICAgIHsKLSAgICAgIGdhcyAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1kIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKmRpcygpOyovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiVXNhZ2U6ICVzIC10XG4iLCBhdlswXSk7Ci0gICAgICBwcmludGYgKCItdCA6IGdlbmVyYXRlIG5ldyB6OC5jIGludGVybmFsIHRhYmxlXG4iKTsKLSAgICAgIHByaW50ZiAoIi1hIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBnYXNcbiIpOwotICAgICAgcHJpbnRmICgiLWQgOiBnZW5lcmF0ZSBuZXcgdGFibGUgZm9yIGRpc2Fzc2VtYmxlXG4iKTsKLSAgICAgIHByaW50ZiAoIi1oIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBodW1hbnNcbiIpOwotICAgIH0KLXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvQ2hhbmdlTG9nIGIvcmVhZGxpbmUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzhmY2YzLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDk4MiArMCwwIEBACi0xOTk5LTA0LTIyICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogTWFrZSBjb21tZW50IGFib3V0IHRoaXMgY2hhbmdlIG1vcmUgZXhwbGljaXQuCi0KLTE5OTktMDQtMjIgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotICAgICAgICAqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCB0aGUgZmluYWwgbGlicmVhZGxpbmUuYQotICAgICAgICBvciAuaCBmaWxlcy4KLQotVHVlIE1hciAyMyAxMDo1NjowOCAxOTk5ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBnbXgubmV0PjoKLSAJCi0JKiBkaXNwbGF5LmM6IENoYW5nZSBzb21lIHRlcm1pbmFsIGNhbGxzIHRvIHdvcmsgb24gREpHUFAuCi0JKiB0ZXJtaW5hbC5jOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgLiBmcm9tIHRoZSBWUEFUSCBkaXJlY3RpdmUuCi0JCi1UdWUgTWFyICA5IDE0OjU4OjEzIDE5OTkgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHN1cHBvcnQvY29uZmlnLnN1YjogUmVjb2duaXplIGN5Z3dpbiosIG5vdCBqdXN0IGN5Z3dpbjMyLgotCi1UdWUgRmViICA5IDEwOjM4OjU3IDE5OTkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEbyBub3QgdXNlIHRoZSAuL3N1cHBvcnQgZGlyZWN0b3J5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1XZWQgSmFuICA2IDEyOjI0OjE5IDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIExPQ0FMX0NGTEFHUyByYXRoZXIgdGhhbiBDRkxBR1MgZm9yCi0Jc2VhcmNoaW5nIGxpYnRlcm1jYXAgZGlyZWN0b3J5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgRGVjIDMxIDEyOjA3OjAxIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2VhcmNoIGRldm8gbGlidGVybWNhcCBkaXJlY3RvcnkgZm9yIHRlcm1jYXAuaAotCXdoZW4gY29tcGlsaW5nIGZvciBjeWd3aW4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTEyLTMwICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBPbmx5IHRyeSB0byBjb3B5IGxpYnJlYWRsaW5lLmEgYW5kCi0JbGliaGlzdG9yeS5hIGlmIHRoZXkgZXhpc3QuCi0KLVR1ZSBEZWMgMjkgMjM6NDk6MjAgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY3Jvc3MtYnVpbGQvY3lnd2luLmNhY2hlOiBBZGQgYSBjb3VwbGUgbW9yZSBrbm93biBzZXR0aW5ncy4KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRGVjIDI5IDE4OjExOjI4IDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogY3Jvc3MtYnVpbGQ6IG5ldyBkaXJlY3RvcnkuCi0JCi0JKiBjcm9zcy1idWlsZC9jeWd3aW4uY2FjaGU6IG5ldyBmaWxlLiBVc2VkIGZvciBDeWd3aW4gY3Jvc3MgYnVpbGRzLgotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIHRlc3RzIGZvciBjcm9zcy1idWlsZCBmb3IgQ3lnd2luLgotCi0xOTk4LTEyLTI0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgQ1lHTlVTIExPQ0FMIGNvbW1lbnQuCi0JKiBhY2NvbmZpZy5oOiBBZGQgbWlzc2luZyBkZWZpbmVzLgotCSogY29uZmlnLmguYm90OiBBZGQgbWlzc2luZyBjb250ZW50LgotCSogY29uZmlndXJlLCBjb25maWcuaC5pbjogUmVnZW5lcmF0ZWQuCi0KLVdlZCBEZWMgMjMgMTY6MjE6NDEgMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogY29tbWVudCBvdXQgdGhlIHJ1bGUgdG8gcmVidWlsZCBjb25maWd1cmUgYnkgCi0JcnVubmluZyBhdXRvY29uZi4gCi0KLVR1ZSBEZWMgMjIgMTA6MDA6MzAgMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBzaGVsbC5jIChzYXZlc3RyaW5nKTogaWZkZWYnZCBpdCBvdXQuIAotCi0JKiBJbXBvcnRlZCBuZXcgdmVyc2lvbiBvZiBSZWFkbGluZSAyLjIuMS4gUmVtb3ZlZCBhbGwgdGhlIEN5Z251cwotCWxvY2FsIGNoYW5nZXMuCi0KLQlOZXcgZmlsZXM6IGFjY29uZmlnLmgsIGFjbG9jYWwubTQsIGFuc2lfc3RkbGliLmgsIGNhbGxiYWNrLmMsCi0gCWNvbmZpZy5oLmluLCBjb25maWd1cmUsIGhpc3RleHBhbmQuYywgaGlzdGZpbGUuYywgaGlzdGxpYi5oLAotIAloaXN0c2VhcmNoLmMsIGlucHV0LmMsIGtpbGwuYywgbWFjcm8uYywgbmxzLmMsIHBvc2l4ZGlyLmgsCi0gCXBvc2l4am1wLmgsIHBvc2l4c3RhdC5oLCBybGNvbmYuaCwgcmx0dHkuaCwgcmx3aW5zaXplLmgsIHNoZWxsLmMsCi0gCXRjYXAuaCwgdGVybWluYWwuYywgdW5kby5jLCB1dGlsLmMsIHN1cHBvcnQgZGlyZWN0b3J5LgotCi0JUmVtb3ZlZCBmaWxlczogc3lzZGVwKiwgY29uZmlnIGRpcmVjdG9yeS4KLQkKLQotRnJpIERlYyAgNCAxNToyNTo0MSAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkgSmltIEJsYW5keQotIAk8amltYkB6d2luZ2xpLmN5Z251cy5jb20+IGFuZCBEYXZpZCBUYXlsb3IKLSAJPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbiBjaGFuZ2VzCi0gCW1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgotCi0JKiBjb25maWcvbXAtZW5hYmxlLXR1aTogTmV3IGZpbGUuCi0JKFRVSV9DRkxBR1MpOiBTZWFyY2ggZGV2bydzIGluY2x1ZGUgZGlyZWN0b3J5LCBhcyBsb25nIGFzIHdlJ3JlCi0gCXRvdGFsbHkgcnVpbmluZyBtb2R1bGFyaXR5LgotCShJTkNMVURFX1NSQ0RJUik6IE5ldyB2YXIuCi0JKEdEQl9UVUlfU1JDRElSKTogRml4IHN5bnRheCBlcnJvci4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayB0aGUgLS1lbmFibGUtdHVpIGZsYWc7IGlmIGl0J3Mgc2V0LCBpbmNsdWRlCi0gCWEgbWFrZWZpbGUgZnJhZ21lbnQgdGhhdCAjZGVmaW5lcyBUVUkgYW5kIGFkZHMgdGhlIG5lZWRlZCAjaW5jbHVkZQotIAlkaXJlY3Rvcmllcy4KLQkoKi0qLWhwdXgqKTogTmV3IGhvc3Q7IHVzZSBzeXNkZXAtaHB1eC5oLgotCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IENoZWNrIHRoZSB2YXJpYWJsZSBzZXQgaW4gdGhlIG1ha2VmaWxlCi0JZnJhZ21lbnQgYWJvdmUuCi0KLQkqIGRpc3BsYXkuYyAodGVybV9nb3RvKTogZGVjbGFyZSBpdC4KLQkoaW5zZXJ0X3NvbWVfY2hhcnMpOiBzZXQgaXQuCi0JKGRlbGV0ZV9jaGFycyk6IHNldCBpdC4KLQotCSogcmVhZGxpbmUuYzogYWRkIHR1aSBpbmNsdWRlIGZpbGVzIHN1cnJvdW5kZWQgYnkgVFVJLgotCShybF9yZXNldCk6IG5ldyBmdW5jdGlvbiwgbW92ZSBzb21lIG9mIHJsX2Fib3J0IGZ1bmN0aW9uYWxpdHkgdG8KLSAJaGVyZS4KLQkocmxfYWJvcnQpOiBjYWxsIHJsX3Jlc2V0LgotCShybF9nZXRjKTogdHVpIGNoYW5nZXMuCi0JKGluaXRfdGVybWluYWxfaW8pOiB0dWkgY2hhbmdlcy4KLQotCSogcmVhZGxpbmUuaCAodHVpX3ZlcnNpb24sIGZwdXRjX3VuZmlsdGVyZWQsIGZwdXRzX3VuZmlsdGVyZWQsCi0JdHVpX3RwdXRzKTogZGVjbGFyZSBpZiBUVUkgaXMgZGVmaW5lZC4KLQotCSogcmx0dHkuYyAocHJlcGFyZV90ZXJtaW5hbF9zZXR0aW5ncyk6IGFkZGl0aW9uYWwgY29tbWVudC4KLQotCSogc2lnbmFscy5jOiBhZGQgdHVpIGluY2x1ZGUgZmlsZXMgc3Vycm91bmRlZCBieSBUVUkuICBtb3ZlICNpZgotIAlhbmQgI2VuZGlmIHRvIGNvbHVtbiAxIHNvIEhQJ3MgY29tcGlsZXIgd2lsbCBhY2NlcHQgdGhlbS4gIFJlbW92ZQotIAlkZWNsYXJhdGlvbiBvZiB0dWlEb0FuZFJldHVyblRvVG9wIHNpbmNlIGl0J3MgZGVjbGFyZWQgaW4gdHVpLmguCi0JKHJsX2hhbmRsZV9zaWd3aW5jaCk6IGNhbGwgdHVpRG9BbmRSZXR1cm5Ub1RvcCBpZiBUVUkgZGVmaW5lZC4KLSAgCShybF9oYW5kbGVfc2lnd2luY2hfb25fY2xlYXIpOiBkZWZpbmUgaWYgVFVJIGRlZmluZWQuCi0JKHJsX3NldF9zaWduYWxzKTogaWYgVFVJLCBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uCi0JKHJsX2NsZWFyX3NpZ25hbHMpOiBpbnN0YWxsIHJsX2hhbmRsZV9zaWd3aW5jaF9vbl9jbGVhci4KLQotCSogc3lzZGVwLWhwdXguaDogTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDIgMTU6MjY6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KLQotVHVlIEp1bCAyOCAwOTo0MzoyNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1ocHV4MTEuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKCotKi0qLWhwdXgxMSopOiBVc2Ugc3lzZGVwLWhwdXgxMS5oLgotCi1UaHUgSnVsIDIzIDE3OjQ4OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlIG9ic29sZXRlIGZpbGUuCi0JKiBleGFtcGxlcy9jb25maWd1cmUuYmF0OiBSZW1vdmUgb2Jzb2xldGUgZmlsZS4KLQotV2VkIE1heSAxMyAxMzo0MTo1MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5c2RlcC02aXJpeC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWlyaXg2Kik6IE5ldyBob3N0OyB1c2Ugc3lzZGVwLTZpcml4LmguCi0KLQkqIE1ha2VmaWxlLmluIChpc2VhcmNoLm8sIHNlYXJjaC5vKTogRGVwZW5kIHVwb24gc3lzZGVwLmguCi0JKE1ha2VmaWxlKTogRGVwZW5kIHVwb24gJChzcmNkaXIpL2NvbmZpZ3VyZS5pbi4KLQotVGh1IEFwciAgOSAxMTo1OTozOCAxOTk4ICBJYW4gRGFsbCAoPElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09bmV0YnNkKTogSW5jbHVkZSBjb25maWcvbWgtYnNkNDQuCi0JKiBjb25maWcvbWgtYnNkNDQ6IE5ldyBmaWxlLgotCi1XZWQgRGVjICAzIDE2OjQ4OjIwIDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCi0KLQkqIHJsdHR5LmM6IGZpeCB0eXBvcy4KLQotVHVlIE9jdCAgOCAwODo1OToyNCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB0aWxkZS5jICh0aWxkZV93b3JkX2V4cGFuZCk6ICBfX01TRE9TX19fIC0+IF9fTVNET1NfXwotCi1TYXQgT2N0IDA1IDExOjI0OjM0IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogcmxkZWZzLmg6IE9uIExpbnV4LCBpbmNsdWRlIDx0ZXJtaW9zLmg+IHRvIGZpeCBjb21waWxlIGVycm9yCi0JaW4gPHRlcm1jYXAuaD4uCi0KLVdlZCBTZXAgIDQgMTg6MDY6NTEgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogcmxkZWZzLmg6ICBFbmFibGUgSEFORExFX1NJR05BTFMgZm9yIGN5Z3dpbjMyLgotCi1UaHUgQXVnIDI5IDE2OjU5OjQ1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0KLUZyaSBBdWcgMTYgMTc6NDk6NTcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29tcGxldGUuYzogIEluY2x1ZGUgPHB3ZC5oPiBpZiBub3QgRE9TLCBhbmQgaWYgY3lnd2luMzIgb3Igbm90Ci0Jd2luMzIuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgdGVzdCBmb3IgKi0qLWN5Z3dpbjMyKiB0byB1c2UgY29uZmlnL21oLXBvc2l4LgotCSogcmVhZGxpbmUuYzogIE1vdmUgZGVjbCBvZiB0Z2V0c3RyIHRvIHJsZGVmcy5oLgotCSogKF9ybF9zZXRfc2NyZWVuX3NpemUpOiAgUmVtb3ZlIHJlZHVuZGFudCBpZmRlZiBNSU5JTUFMcy4KLQkqIHJsZGVmcy5oOiAgRG9uJ3QgZG8gTUlOSU1BTCBmb3IgY3lnd2luMzIuICBDeWd3aW4zMiBub3cgdXNlcwotCWZ1bGwtYmxvd24gcmVhZGxpbmUsIGV4Y2VwdCBmb3IgdGVybWNhcC4KLQotU3VuIEF1ZyAxMSAyMTowNjoyNiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBybGRlZnMuYzogIEdldCByaWQgb2YgZGVmaW5lIG9mIFNJR0FMUk0gaWYgX1dJTjMyIG9yIF9fTVNET1NfXy4KLQkqIERvbid0IGRlZmluZSBTY3JlZW5Db2xzL1NjcmVlblJvd3MvLi4uIGlmIGN5Z3dpbjMyLgotCSogc3lzZGVwLW5vcm0uaDogIERvbid0IGluY2x1ZGUgPG1hbGxvYy5oPiBpZiBjeWd3aW4zMi4KLQotU3VuIEF1ZyAxMSAxNDo1OTowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmxkZWZzLmg6ICBJZiBfX29zZl9faXMgZGVmaW5lZCwgaW5jbHVkZSA8dGVybWlvLmg+IGluc3RlYWQgb2YKLQk8c2d0dHkuaD4uCi0KLUZyaSBBdWcgIDkgMDg6NTQ6MjYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYmluZC5jIGNvbXBsZXRlLmMgaGlzdG9yeS5jIHJlYWRsaW5lLmM6ICBEb24ndCBpbmNsdWRlIHN5cy9maWxlLmguCi0JKiBjb21wbGV0ZS5jIGRpc3BsYXkuYyBwYXJlbnMuYyByZWFkbGluZS5jIHJsZGVmcy5oIHJsdHR5LmMKLQlzaWduYWxzLmMgdGlsZGUuYzogIENoYW5nZSByZWZzIHRvIF9NU0NfVkVSIGFuZCBfX1dJTjMyX18gdG8gX1dJTjMyLgotCSogc2lnbmFscy5jIChybF9zaWduYWxfaGFuZGxlcik6ICBJZmRlZiBvdXQga2lsbCBpZiBfV0lOMzIuCi0JKiBzeXNkZXAtbm9ybS5oOiAgSWZkZWYgb3V0IGluY2x1ZGUgb2YgZGlyZW50LmggaWYgX1dJTjMyLgotCUluY2x1ZGUgbWFsbG9jLmggaWYgX1dJTjMyLgotCi1UaHUgSnVsIDE4IDE1OjU5OjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmxkZWZzLmggKHN5cy91aW8uaCkgQmVmb3JlIHN5cy9zdHJlYW0uaCBpcyBpbmNsdWRlZCB1bmRlciBBSVgsCi0JaW5jbHVkZSBzeXMvdWlvLmgsIHdoaWNoIHByZXZlbnRzIGFuIHVuZGVmaW5lZCBzdHJ1Y3R1cmUgdXNlZCBpbiBhCi0JcHJvdG90eXBlIG1lc3NhZ2UgZnJvbSBiZWluZyBnZW5lcmF0ZWQuCi0KLVR1ZSBKdW4gMjUgMjM6MDU6NTUgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotICAgICAgICAqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogU2V0IHRvICQocHJlZml4KS9zaGFyZS4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQotU3VuIE1heSAyNiAxNToxNDo0MiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCUZyb206IERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIHN5c2RlcC1saW51eC5oOiBOZXcgZmlsZS4KLQkqIGRpc3BsYXkuYzogQWRkIGluY2x1ZGUgb2YgInN5c2RlcC5oIiB0byBnZXQgSEFWRV9WQVJBUkdTX0guCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBwYXR0ZXJuIGlbMzQ1XTg2LSotbGludXgqIGludG8gKi0qLWxpbnV4KiB0bwotCXN1cHBvcnQgbm9uLXg4NiBiYXNlZCBMaW51eCBwbGF0Zm9ybXMuCi0KLVN1biBBcHIgIDcgMjI6MDY6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQlGcm9tOiBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgotCSogY29uZmlnL21oLWdudTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKCotKi1nbnUqKTogTmV3IGhvc3QuCi0KLVN1biBBcHIgIDcgMTM6MjE6NTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQlGcm9tOiBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQkqIGNvbmZpZ3VyZS5pbjogU0NPIE9wZW5TZXJ2ZXIgNSAoYS5rLmEgMy4ydjUqKSBpcyBtb3JlIGxpa2UKLQlTQ08gMy4ydjQgdGhhbiAzLjJ2Mi4KLQotV2VkIEphbiAgMyAxODoyMjoxMCAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiByZWFkbGluZS5jLCBkaXNwbGF5LmMsIGNvbXBsZXRlLmM6IEFkZCBfTVNDX1ZFUiB0byBsaXN0IG9mCi0JdGhpbmdzIHdoaWNoIGNhbid0IGRvIG1vc3QgdGhpbmdzLgotCi1UaHUgTm92IDE2IDE1OjM5OjA1IDE5OTUgIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29tcGxldGUuYzogQ2hhbmdlIFdJTjMyIHRvIF9fV0lOMzJfXywgYWRkZWQgI2Vsc2UgcmV0dXJuIE5VTEwKLQl0byBlbmQgb2YgdGhhdCBkZWZpbmUuCi0KLVR1ZSBPY3QgMzEgMTA6Mzg6NTggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGlzcGxheS5jLCBwYXJlbnMuYywgcmVhZGxpbmUuYywgcmxkZWZzLmg6IENoYW5nZSB1c2Ugb2YKLQlXSU4zMiB0byBfX1dJTjMyX18uCi0KLVR1ZSBPY3QgMTAgMTE6MDc6MjMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IFJlbW92ZSBtYWNyby4KLQotVHVlIE9jdCAxMCAwODo0OTowMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb21wbGV0ZS5jIChmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRW5hYmxlIGZvcgotCXdpbjMyIHdoZW4gbm90IE1TQy4KLQotU3VuIE9jdCAgOCAwNDoxNzoxOSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBwb3dlcnBjLWlibS1haXgqIGxpa2UgcnM2MDAwLWlibS1haXgqLgotCi1TYXQgT2N0ICA3IDIwOjM2OjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBybHR0eS5jIChvdXRjaGFyKTogUmV0dXJuIGFuIGludCwgbGlrZSB0cHV0cyBleHBlY3RzLgotCSogc2lnbmFscy5jIChfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik6IERpdHRvLgotCi1GcmkgU2VwIDI5IDE1OjE5OjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlGaXhlcyBmb3Igd2hlbiB0aGUgaG9zdCBXSU4zMiwgYnV0IG5vdCBNU0MuCi0JKiBjb21wbGV0ZS5jOiBTb21ldGltZXMgaGF2ZSBwd2QuaAotCSogcGFyZW5zLmM6IFdJTjMyIGhhcyBzaW1pbGFyIHJlc3RyaWN0aW9ucyB0byBfX0dPMzJfXy4KLQkqIHJlYWRsaW5lLmMgKF9fR08zMl9fKTogU29tZSBvZiB0aGlzIG1vdmVkIGludG8gcmxkZWZzLmgKLQkqIHNpZ25hbHMuYyAoX19HTzMyX18pOiBMaWtld2lzZS4KLQkqIHJsZGVmcy5oIChNU0RPU3x8V0lOMzIpIGJlY29tZXMgTVNET1N8fE1TQy4KLQkoV0lOMzImJiFXSU4zMik6IE5ldyBkZWZpbml0aW9ucy4KLQotV2VkIFNlcCAyMCAxMjo1NzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotV2VkIE1hciAgMSAxMzozMzo0MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJsdHR5LmMgKG91dGNoYXIpOiBQcm92aWRlIHByb3RvdHlwZSBmb3Igb3V0Y2hhciwgdG8gc2lsZW5jZQotCXR5cGUgd2FybmluZ3MgaW4gcGFzc2luZyBvdXRjaGFyIHRvIHRwdXRzIG9uIHN5c3RlbXMgbGlrZSBMaW51eAotCXRoYXQgaGF2ZSBmdWxsIHByb3RvdHlwZXMuCi0KLQkqIHNpZ25hbHMuYyAoX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOiBQcm92aWRlIHByb3RvdHlwZSB0bwotCXNpbGVuY2UgdHlwZSB3YXJuaW5ncy4KLQotU3VuIEphbiAxNSAxNDoxMDozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogcmxkZWZzLmg6IERlZmluZSBNSU5JTUFMIGZvciBfX0dPMzJfXyBhbmQgV0lOMzIuCi0JKiBjb21wbGV0ZS5jLCBkaXNwbGF5LmMsIHJlYWRsaW5lLmMsIHJsdHR5LmM6IFRlc3QgTUlOSU1BTAotCWluc3RlYWQgb2YgX19HTzMyX18uCi0KLVdlZCBBdWcgMjQgMTM6MDQ6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCi1TYXQgSnVsIDE2IDEzOjI2OjMxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtODgqLWhhcnJpcy1jeHV4NyopOiBSZWNvZ25pemUuCi0JKiBzeXNkZXAtY3h1eDcuaDogTmV3IGZpbGUuCi0KLUZyaSBKdWwgIDggMTM6MTg6MzMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogcnR0dHkuYyAoY29udHJvbF9tZXRhX2tleV9vbik6IFJlbW92ZSBzdXBlcmZsdW91cyB0ZXN0aW5nIG9mCi0JX19HTzMyX18uCi0KLVRodSBKdW4gMzAgMTU6MjE6NTQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogcmx0dHkuYyAoY29udHJvbF9tZXRhX2tleV9vbik6IERvbid0IGNvbXBpbGUgaWYgX19HTzMyX18gaXMKLQlkZWZpbmVkLgotCShybHR0eV9zZXRfZGVmYXVsdF9iaW5kaW5ncyk6IExpa2V3aXNlLgotCSogZGlzcGxheS5jIChpbnNlcnRfc29tZV9jaGFycywgZGVsZXRlX2NoYXJzKTogcm93X3N0YXJ0IHNob3VsZCBiZQotCWEgc2hvcnQuCi0JKiBwYXJlbnMuYyAocmxfaW5zZXJ0X2Nsb3NlKTogTm8gRkRfU0VUIGlmIHVzaW5nIF9fR08zMl9fLgotCSogcmVhZGxpbmUuYyAocmxfZ2F0aGVyX3R5aSk6IFN0cmlwIG9mZiBzcHVyaW91cyBoaWdoIGJpdHMuCi0KLVN1biBKdW4gMTIgMDM6NTE6NTIgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBoaXN0b3J5LmM6ICBTd2FwIGluY2x1c2lvbiBvZiBybGRlZnMuaCBhbmQgY2hhcmRlZnMuaCB0byBhdm9pZAotCUNUUkwgbWFjcm8gcmVkZWZpbml0aW9uLgotCi1Nb24gTWF5ICA5IDE4OjI5OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmVhZGxpbmVfZGVmYXVsdF9iaW5kaW5ncyk6IERvbid0IGNvbXBpbGUgaWYKLQlfX0dPMzJfXyBpcyBkZWZpbmVkLgotCShfcmxfc2V0X3NjcmVlbl9zaXplKTogTGlrZXdpc2UuCi0JKiBybHR0eS5jIChybHR0eV9zZXRfZGVmYXVsdF9iaW5kaW5ncyk6IExpa2V3aXNlLgotCShjb250cm9sX21ldGFfa2V5KTogTGlrZXdpc2UuCi0JKiBkaXNwbGF5LmM6IElmIF9fR08zMl9fIGlzIGRlZmluZWQsIGluY2x1ZGUgPHN5cy9wYy5oPi4KLQkqIHBhcmVucy5jOiBJZiBfX0dPMzJfXyBpcyBkZWZpbmVkLCB1bmRlZmluZSBGRF9TRVQuCi0JKiBzaWduYWxzLmM6IEluY2x1ZGUgU0lHV0lOQ0ggaGFuZGxpbmcgaW4gdGhlIHNldCBvZiB0aGluZ3Mgd2hpY2gKLQlpcyBub3QgZG9uZSBpZiBIQU5ETEVfU0lHTkFMUyBpcyBub3Qgc2V0LgotCi1GcmkgTWF5ICA2IDEzOjM4OjM5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvbWgtZ28zMjogTmV3IGZyYWdtZW50LgotCSogY29uZmlndXJlLmluIChob3N0PT1nbzMyKTogVXNlIGdvMzIgZnJhZ21lbnQuCi0KLVdlZCBNYXkgIDQgMTQ6MzY6NTMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY2hhcmRlZnMuaCwgcmxkZWZzLmg6ICBNb3ZlIGRlY2xzIG9mIHN0cmluZyBmdW5jcyBmcm9tIGNoYXJkZWZzLmgKLQl0byBybGRlZnMuaCBzbyB0aGF0IHRoZXkgZG9uJ3QgcG9sbHV0ZSBhcHBzIHRoYXQgaW5jbHVkZQotCXJlYWRsaW5lLmguCi0JKiBoaXN0b3J5LmM6ICBpbmNsdWRlIHJsZGVmcy5oIHRvIGdldCBkZWNscyBvZiBzdHJpbmcgZnVuY3MuCi0KLVdlZCBNYXkgIDQgMTI6MTU6MTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwMC1idWxsLWJvc3gqKTogTmV3IGNvbmZpZ3VyYXRpb24sIFJTLzYwMDAKLQl2YXJpYW50LgotCi1XZWQgQXByIDIwIDEwOjQzOjUyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1wb3NpeCBmb3Igc3Vub3M0LjEqLgotCi1XZWQgQXByIDEzIDIxOjI4OjQ0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBybHR0eS5jIChzZXRfdHR5X3NldHRpbmdzKTogRG9uJ3Qgc2V0IHJlYWRsaW5lX2VjaG9pbmdfcC4KLQkocmxfZGVwcmVwX3Rlcm1pbmFsKSBbTkVXX1RUWV9EUklWRVJdOiBTZXQgcmVhZGxpbmVfZWNob2luZ19wLgotCi1TdW4gTWFyIDEzIDA5OjEzOjEyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIFRBR1MgdGFyZ2V0LgotCi1XZWQgTWFyICA5IDE4OjAxOjMxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpc2VhcmNoLmMsIHNlYXJjaC5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCi1UaHUgTWFyICAzIDE3OjQwOjAzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciBJU0MsIHVzZSBtaC1zeXN2LCBub3QgbWgtaXNjLgotCi1UaHUgRmViIDI0IDA0OjEzOjUzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGJhc2gtMS4xMy41LiBNZXJnZSBjaGFuZ2VzIGZyb20gZ2xvYi90aWxkZS5jCi0JaW50byB0aWxkZS5jIGFuZCB1c2UgaXQuIEFkZCBzeXN0ZW0gZnVuY3Rpb24gZGVjbGFyYXRpb25zIHdoZXJlCi0JbmVjZXNzYXJ5LiBDaGVjayBmb3IgX19HTzMyX18sIG5vdCBfR08zMl8gY29uc2lzdGVudGx5LgotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogcmx0dHkuYzogIEluY2x1ZGUgPHN5cy9maWxlLmg+IHRvIG1hdGNoIGluY2x1ZGUgZmlsZSBzZXR1cAotCWluIHJlYWRsaW5lLmMgZm9yIHJsZGVmcy5oLiBPdGhlcndpc2Ugd2UgZ2V0IGluY29uc2lzdGVudAotCVRUWV9EUklWRVIgZGVmaW5pdGlvbnMgaW4gcmVhZGxpbmUuYyBhbmQgcmx0dHkuYy4KLQkqIGJpbmQuYywgY29tcGxldGUuYzogIERvIG5vdCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4sIGl0IGlzIGFscmVhZHkKLQlpbmNsdWRlZCB2aWEgc3lzZGVwLmgsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBpZiA8c3lzL3R5cGVzLmg+IGhhcwotCW5vIG11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0aW9uLgotCSogcmVhZGxpbmUuYyAoX3JsX3NldF9zY3JlZW5fc2l6ZSk6ICBSZWVzdGFibGlzaCB0ZXN0IGZvcgotCVRJT0NHV0lOU1pfQlJPS0VOLgotCSogcmxkZWZzLmg6ICBEZWZpbmUgU19JU1JFRyBpZiBuZWNlc3NhcnkuCi0KLUZyaSBGZWIgMTggMDg6NTY6MzUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc2VhcmNoLm8gcnVsZSBmb3IgU3VuIG1ha2UuCi0KLVdlZCBGZWIgMTYgMTY6MzU6NDkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHJsdHR5LmM6ICAjaWYgb3V0IHNvbWUgY29kZSBpZiBfX0dPMzJfXy4KLQotVHVlIEZlYiAxNSAxNDowNzowOCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pLCBkaXNwbGF5LmM6Ci0JUmV0dXJuIGludCwgbm90IHZvaWQsIHRvIGNvbmZvcm0gd2l0aCB0aGUgZXhwZWN0ZWQgYXJnIG9mIHRwdXRzLgotCSogcmVhZGxpbmUuYyAoaW5pdF90ZXJtaW5hbF9pbyk6ICB0Z2V0ZmxhZyBvbmx5IHRha2VzIDEgYXJnLgotCSogcmVhZGxpbmUuYyAoX3JsX3NhdmVzdHJpbmcpOiAgTmV3IGZ1bmN0aW9uLgotCSogY2hhcmRlZnMuaDogIFRvIGF2b2lkIGNvbmZsaWN0cyBhbmQvb3Igd2FybmluZ3MsIGRlZmluZQotCXNhdmVzdHJpbmcgYXMgYSBtYWNybyB3cmFwcGVyIGZvciBfcmxfc2F2ZXN0cmluZy4KLQkqIGRpc3BsYXkuYyAoZXh0ZXJuIHRlcm1feG4pOiAgSXQncyBhbiBpbnQgZmxhZywgbm90IGEgc3RyaW5nLgotCSogY2hhcnNkZWZzLmgsIHJsZGVmcy5oOiAgUmVtb3ZlIEhBVkVfU1RSSU5HX0gtcmVsYXRlZCBqdW5rLgotCi1TYXQgRmViICA1IDA4OjMyOjMwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIG9ic29sZXRlIHJ1bGVzIGZvciBoaXN0b3J5LmluZm8gYW5kCi0JcmVhZGxpbmUuaW5mby4KLQotVGh1IEphbiAyNyAxNzowNDowMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY2hhcmRlZnMuaDogT25seSBkZWNsYXJlIHN0cnJjaHIgaWYgaXQgaXMgbm90ICNkZWZpbmUnZC4KLQotVHVlIEphbiAyNSAxMTozMDowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogcmxkZWZzLmg6IEFjY2VwdCBfX2hwdXggYXMgd2VsbCBhcyBocHV4IGZvciBIUCBjb21waWxlciBpbiBBTlNJIG1vZGUuCi0KLUZyaSBKYW4gMjEgMTc6MzE6MjYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY2hhcmRlZnMuaCwgdGlsZGUuYzogSnVzdCBkZWNsYXJlIHN0cnJjaHIgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvCi0JaW5jbHVkZSBhIHN5c3RlbSBoZWFkZXIuCi0KLUZyaSBKYW4gMjEgMTQ6NDA6NDMgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6ICBFeHBhbmQgbG9jYWwtZGlzdGNsZWFuCi0JaW5saW5lIGFmdGVyIGRvaW5nIHJlY3Vyc2lvbi4gIFlvdSBjYW4ndCByZWN1cnNlIGFmdGVyIHJlbW92aW5nCi0JTWFrZWZpbGUuICBNYWtlIHRoZW0gZGVwZW5kIG9uIGxvY2FsLWNsZWFuLgotCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6ICBSZW1vdmUgbm93IHN1cGVyZmx1b3VzIHRhcmdldC4KLQotTW9uIEphbiAxNyAxMjo0MjowNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChkb2luZ19hbl91bmRvKTogRGVsZXRlIHNlY29uZCBkZWNsYXJhdGlvbiwgc2luY2UgaXQKLQljb25mdXNlcyB0aGUgYWxwaGEtb3NmMSBuYXRpdmUgY29tcGlsZXIuCi0KLVN1biBKYW4gMTYgMTI6MzM6MTEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbXBsZXRlLmMsIGJpbmQuYzogSW5jbHVkZSA8c3lzL3N0YXQuaD4uCi0JKiBjb21wbGV0ZS5jOiBEZWZpbmUgWF9PSyBpZiBub3QgZGVmaW5lZCBieSBhIHN5c3RlbSBoZWFkZXIuCi0KLQkqIGNoYXJkZWZzLmg6IERvbid0IGRlY2xhcmUgeG1hbGxvYy4KLQotCSoga2V5bWFwcy5oOiBJbmNsdWRlICJjaGFyZGVmcy5oIiBub3QgPHJlYWRsaW5lL2NoYXJkZWZzLmg+LgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIHJlYWxjbGVhbik6IFJlY3Vyc2UKLQlpbnRvIHN1YmRpcmVjdG9yaWVzIGFzIHdlbGwgYXMgZG9pbmcgdGhpcyBkaXJlY3RvcnkuICBBZGQgY2xlYW4tZHZpCi0JdGFyZ2V0LgotCi1TYXQgSmFuIDE1IDE5OjM2OjEyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jLCBkaXNwbGF5LmM6ICBQYXRjaGVzIHRvIGFsbG93IHVzZSBvZiBhbGwgODAKLQljb2x1bW5zIG9uIG1vc3QgdGVybWluYWxzICh0aG9zZSB3aXRoIGFtIGFuZCB4bikuCi0KLQlNZXJnZSBpbiBjaGFuZ2VzIGZyb20gYmFzaC0xLjEzLiAgVGhlIG1vc3Qgb2J2aW91cyBvbmUgaXMKLQl0aGF0IHRoZSBmaWxlIHJlYWRsaW5lLmMgaGFzIGJlZW4gc3BsaXQgaW50byBtdWx0aXBsZSBmaWxlcy4KLQkqIGJpbmQuYywgY29tcGxldGUuYywgZGlzcGF5LmMsIGlzZWFyY2guYywgcGFyZW5zLmMsIHJsZGVmcy5oLAotCXJsdHR5LmMsIHNlYXJjaC5jIHNpZ25hbHMuYywgdGlsZGUuYywgdGlsZGUuaCwgeG1hbGxvYy5jOiAgTmV3IGZpbGVzLgotCi1TYXQgRGVjIDExIDE2OjI5OjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChybF9nZXRjKTogSWYgR08zMiwgdHJpbSBoaWdoIGJpdCBmcm9tIGdldGtleSwKLQlvdGhlcndpc2UgZmFuY3kgUEMga2V5cyBjYXVzZSBncmllZi4KLQotRnJpIE5vdiAgNSAxMTo0OTo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgZG9jIHRvIGNvbmZpZ2RpcnMuCi0JKiBNYWtlZmlsZS5pbiAoaW5mbyBkdmkgaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8pOiBSZWN1cnNlIGludG8gZG9jLgotCi1GcmkgT2N0IDIyIDA3OjU1OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCi0KLVR1ZSBPY3QgIDUgMTI6MzM6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmM6IEFkZCBzdHVmZiBmb3IgSElVWCB0byBwbGFjZSB3aGVyZSB3ZSBkZXRlY3QgdGVybWlvCi0JdnMuIHNndHR5ICh1Z2gsIGJ1dCBJIGRvbid0IHNlZSBhIHNpbXBsZSBiZXR0ZXIgd2F5KS4KLQotV2VkIFNlcCAyOSAxMTowMjo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocGFyc2VyX2lmKTogRnJlZSB0bmFtZSB3aGVuIGRvbmUgd2l0aCBpdCAoY2hhbmdlCi0JaW1wb3J0ZWQgZnJvbSBmcm9tIGJhc2gJMS4xMiByZWFkbGluZSkuCi0KLVR1ZSBTZXAgIDcgMTc6MTU6MzcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTg4ay0qLXN5c3ZyNCopOiBDb21tZW50IG91dCBwcmV2aW91cyBjaGFuZ2UuCi0KLUZyaSBKdWwgIDIgMTE6MDU6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1yaXNjb3MqKTogTmV3IGVudHJ5OyB1c2UgbWgtc3lzdi4KLQotV2VkIEp1biAyMyAxMzowMDoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudC4KLQotTW9uIEp1biAxNCAxNDoyODo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZXJpYykKLQotCSogY29uZmlndXJlLmluIChtODhrLSotc3lzdnI0Kik6IFVzZSBzeXNkZXAtbm9ybS5oLgotCi1TdW4gSnVuIDEzIDEzOjA0OjA5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoe3JlYWwsZGlzdH1jbGVhbik6IFJlbW92ZSBzeXNkZXAuaC4KLQotVGh1IEp1biAxMCAxMToyMjo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBtb3N0bHljbGVhbiwgZGlzdGNsZWFuLCBhbmQgcmVhbGNsZWFuIHRhcmdldHMuCi0KLUZyaSBNYXkgMjEgMTc6MDk6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1pc2M6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBVc2UgaXQuCi0KLVNhdCBBcHIgMTcgMDA6NDA6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGNhbHZpbikKLQotCSogcmVhZGxpbmUuYywgaGlzdG9yeS5jOiBEb24ndCBpbmNsdWRlIHN5cy90eXBlcy5oOyBzeXNkZXAuaCBkb2VzLgotCi0JKiBjb25maWcvbWgtc3lzdjogRGVmaW5lIFRJT0NHV0lOU1pfQlJPS0VOLgotCXJlYWRsaW5lLmM6IENoZWNrIGl0LgotCi1XZWQgTWFyIDI0IDAyOjA2OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayAmIGR2aSB0YXJnZXRzCi0KLUZyaSBNYXIgMTIgMTg6MzY6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSAqLSotc29sYXJpczIqIGluc3RlYWQgb2YgKi0qLXNvbGFyaXMqIChhCi0JbnVtYmVyIG9mIHBlb3BsZSB3YW50IHRvIGNhbGwgU3VuT1MgNC4xLjIgInNvbGFyaXMxLjAiCi0JYW5kIGdldCBpdCByaWdodCkKLQotVHVlIE1hciAgMiAyMToyNTozNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLXN5c3Y0Lmg6ICBOZXcgZmlsZSBmb3IgU1ZSNC4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLXN5c3Y0Kik6ICBVc2Ugc3lzZGVwLXN5c3Y0LmguCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLXVsdHJpeDIpOiAgQWRkIHRyaXBsZXQgZnJvbSBNaWNoYWVsIFJlbmRlbGwKLQkobWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYSkKLQotVHVlIERlYyAxNSAxMjozODoxNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNjbzMuMnY0Kik6IHVzZSBtaC1zY280LgotCSogY29uZmlnL21oLXNjbzQ6IE5ldyBmaWxlLCBsaWtlIG1oLXNjbyBidXQgd2l0aG91dCBkZWZpbmluZwotCV9QT1NJWF9TT1VSQ0UuCi0KLVdlZCBOb3YgMTEgMjE6MjA6MTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlZm9ybWF0IHRvIG9uZS1jYXNlLXBlci1saW5lLgotCUhhbmRsZSBTdW5PUyAzLjUsIGFzIHBlciBLYXJsIEJlcnJ5LCA8a2FybEBjbGF1ZGUuY3MudW1iLmVkdT4uCi0KLVdlZCBOb3YgIDQgMTU6MzI6MzEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLW5vcm0uaDogIFJlbW92ZSBzb21lIGNydWQsIGluc3RhbGwgZGlyZSB3YXJuaW5nLgotCi1UaHUgT2N0IDIyIDAxOjA4OjEzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgU0NPIHdvcmsgYWdhaW4uLi4KLQotTW9uIE9jdCAxMiAxNTowNDowNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGluaXRfdGVybWluYWxfaW8pOiBpZiB0Z2V0ZW50IHJldHVybnMgMCwgdGhlCi0JdGVybWluYWwgdHlwZSBpcyB1bmtub3duLgotCi1UaHUgT2N0ICAxIDIzOjQ0OjE0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKLQotV2VkIFNlcCAzMCAxMjo1ODo1NyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChybF9jb21wbGV0ZV9pbnRlcm5hbCk6ICBDYXN0IGFsbG9jYSB0byAoY2hhciAqKSB0bwotCWF2b2lkIHdhcm5pbmcuCi0KLUZyaSBTZXAgMjUgMTI6NDU6MDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoY2xlYXJfdG9fZW9sLCBybF9nZW5lcmljX2JpbmQpOiAgTWFrZSBzdGF0aWMuCi0JKHJsX2RpZ2l0X2xvb3ApOiAgQWRkIGFyZyB0byBjYWxsIHRvIHJsX21lc3NhZ2UoKS4KLQkqIHZpX21vZGUuYyAocmxfdmlfZmlyc3RfcHJpbnQpOiAgQWRkIGFyZyB0byBjYWxsIHRvCi0JcmxfYmFja190b19pbmRlbnQoKS4KLQotV2VkIEF1ZyAxOSAxNDo1OTowNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcywgdXNlIGZ1bGwKLQlmaWxlIG5hbWUgZm9yIGluc3RhbGwgdGFyZ2V0LgotCi1XZWQgQXVnIDEyIDE1OjUwOjU3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChsYXN0X3JlYWRsaW5lX2luaXRfZmlsZSk6ICBGaXggdHlwbyBtYWRlIGJ5IFN0ZXZlCi0JQ2hhbWJlcmxhaW4vREogRGVsb3JpZS4gIFByb3BlciBjb250cm9sIGZpbGUgbmFtZSBpcyB+Ly5pbnB1dHJjLAotCW5vdCB+L2lucHV0cmMuCi0KLVRodSBKdW4gMjUgMTY6MTU6MjcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgTWFrZSBic2QgYmFzZWQgc3lzdGVtcyB1c2Ugc3lzZGVwLW9ic2QuaC4KLQotVHVlIEp1biAyMyAyMzoyMjo1MyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXBvc2l4OiAgTmV3IGZpbGUsIGZvciBQb3NpeC1jb21wbGlhbnQgc3lzdGVtcy4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBtaC1wb3NpeCBmb3IgTGludXggKGZyZWUgVW5peCBjbG9uZSkuCi0KLVR1ZSBKdW4gMjMgMjE6NTk6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1ub3JtLmggKGFsbG9jYSk6ICBQcm90ZWN0IGFnYWluc3QgcHJldmlvdXMgZGVmaW5pdGlvbiBhcwotCWEgbWFjcm8gd2l0aCBhcmd1bWVudHMuCi0KLUZyaSBKdW4gMTkgMTU6NDg6NTQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLW9ic2QuaDogICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gdG8gbWFrZSB0aGlzIG1vcmUgS29zaGVyLgotCi1GcmkgSnVuIDE5IDEyOjUzOjI4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYXBvbGxvNjh2LCBtaC1zY28sIG1oLXN5c3YsIG1oLXN5c3Y0fTogUkFOTElCPXRydWUuCi0KLU1vbiBKdW4gMTUgMTM6NTA6MzQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBtaC1zeXN2NCBvbiBzb2xhcmlzMgotCi1Nb24gSnVuIDE1IDEyOjI4OjI0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoSU5TVEFMTCk6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCBpcyBicm9rZW4gb24gbmNyIDMwMDAncy4KLQkqIGNvbmZpZy9taC1uY3IzMDAwIChSQU5MSUIpOiAgVXNlIFJBTkxJQj10cnVlLgotCi1Nb24gSnVuIDE1IDAxOjM1OjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jOiBNYWtlIG5ldyBTSUdOQUxTXyogbWFjcm9zIHRvIHBhcmFtZXRlcml6ZSB0aGUgCi0JdWdseSBjaGFuZ2VzIGluIHNpZ25hbCBibG9ja2luZy4gIFVzZSB0aGVtIHRocm91Z2hvdXQsCi0JcmVkdWNpbmcgI2lmZGVmIEhBVkVfUE9TSVhfU0lHTkFMUyBhbmQgSEFWRV9CU0RfU0lHTkFMUyBjbHV0dGVyCi0Jc2lnbmlmaWNhbnRseS4gIE1ha2UgYWxsIHN1Y2ggcGxhY2VzIHVzZSBQT1NJWCBpZiBhdmFpbGFibGUsCi0JdG8gYXZvaWQgbG9zaW5nIHdpdGggcG9vciBgc2lnc2V0bWFzaycgZW11bGF0aW9uIGZyb20gbGliaWJlcnR5LgotCi1TdW4gSnVuIDE0IDE1OjE5OjUxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGluc2VydF9zb21lX2NoYXJzKTogIFJldHVybiB2b2lkLgotCi1UaHUgSnVuIDExIDAxOjI3OjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jOiAgI3VuZGVmIFBDLCB3aGljaCBTb2xhcmlzMiBkZWZpbmVzIGluIHN5cy90eXBlcy5oLAotCWNsb2JiZXJpbmcgdGhlIHRlcm1jYXAgZ2xvYmFsIHZhcmlhYmxlIFBDLgotCi1UdWUgSnVuICA5IDE3OjMwOjIzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIENoYW5nZSBJTlNUQUxMIHRvIHVzZQotCS91c3IvdWNiL2luc3RhbGwuCi0KLU1vbiBKdW4gIDggMjM6MTA6MDcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmggKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzKTogIEFkZCBkZWNsYXJhdGlvbi4KLQkqIHJlYWRsaW5lLmMgKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzKTogIEFkZCBnbG9iYWwgdmFyLgotCSogcmVhZGxpbmUuYyAoc3RycGJyayk6ICBBZGQgcHJvdG90eXBlIGFuZCBmdW5jdGlvbi4KLQkqIHJlYWRsaW5lLmMgKHJsX2NvbXBsZXRlX2ludGVybmFsKTogIEFkZCBjb2RlIHRvIGhhbmRsZQotCWV4cGFuc2lvbiBvZiBxdW90ZWQgc3RyaW5ncy4KLQotTW9uIE1heSAxMSAxMjozOTozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYzogIENhbid0IGluaXRpYWxpemUgRklMRSAqJ3Mgd2l0aCBzdGRpbiBhbmQgc3Rkb3V0LAotCWJlY2F1c2UgdGhleSBtaWdodCBub3QgYmUgY29uc3RhbnQuICBQYXRjaCBmcm9tIFRvbSBRdWlubiwKLQl0cnFAZGlub3lzb3MudGhwaHlzLm94LmFjLnVrLgotCi1UdWUgQXByIDI4IDIxOjUyOjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5oOiAgRGVjbGFyZSBybF9ldmVudF9ob29rICh3aGljaCBhbHJlYWR5IGV4aXN0ZWQpLgotCVN1Z2dlc3RlZCBieSBDaHJpc3RvcGggVGlldHogPHRpZXR6QHppLmdtZC5kYnAuZGU+LgotCi1XZWQgQXByIDIyIDE4OjA4OjAxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgc3ViZGlycyBkZWNsYXJhdGlvbi4gIFRoZSBvYnNvbGV0ZSBzZW1hbnRpYwotCSAgZm9yIHN1YmRpcnMgaGFzIGJlZW4gdXN1cnBlZCBieSBwZXIncyBuZXcgbWVhbmluZy4KLQotVHVlIEFwciAyMSAxMTo1NDoyMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJld29yayBDRkxBR1Mgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgb24gdGhlCi0JICBjb21tYW5kIGxpbmUgdG8gbWFrZS4gIFJlbW92ZSBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0KLUZyaSBBcHIgMTAgMjM6MDI6MjcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuZXcgbmNyMzAwMCBjb25maWcuCi0JKiBjb25maWcvbWgtbmNyMzAwMDogIE5ldyBOQ1IgMzAwMCBjb25maWcgZmlsZS4KLQotV2VkIE1hciAyNSAxMDo0NjozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaGlzdG9yeS5jIChzdGlmbGVfaGlzdG9yeSk6ICBOZWdhdGl2ZSBhcmcgdHJlYXRlZCBhcyB6ZXJvLgotCi1UdWUgTWFyIDI0IDIzOjQ2OjIwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3lzdjogSU5TVEFMTF9QUk9HIC0+IElOU1RBTEwuCi0KLU1vbiBGZWIgMTAgMDE6NDE6MzUgMTk5MiAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIGhpc3RvcnkuYyAoaGlzdG9yeV9kb193cml0ZSkgQnVpbGQgYSBidWZmZXIgb2YgYWxsIG9mIHRoZSBsaW5lcwotCXRvIHdyaXRlIGFuZCB3cml0ZSB0aGVtIGluIG9uZSBmZWxsIHN3b29wIChsb3dlciBvdmVyaGVhZCB0aGFuCi0JY2FsbGluZyB3cml0ZSAoKSBmb3IgZWFjaCBsaW5lKS4gIFN1Z2dlc3RlZCBieSBQZXRlciBIby4KLQotCSogdmlfbW9kZS5jIChybF92aV9zdWJzdCkgRG9uJ3QgZm9yZ2V0IHRvIGVuZCB0aGUgdW5kbyBncm91cC4KLQotU2F0IE1hciAgNyAwMDoxNTozNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgRklYTUUncyBvbiBpbmZvIGFuZCBpbnN0YWxsLWluZm8gdGFyZ2V0cy4KLQotRnJpIE1hciAgNiAyMjowMjowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLUZyaSBGZWIgMjEgMTQ6Mzc6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMsIGV4YW1wbGVzL2ZpbGVtYW4uYzogcGF0Y2hlcyBmcm9tIERKIHRvIHN1cHBvcnQgRE9TCi0KLVRodSBGZWIgMjAgMjM6MjM6MTYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmxfcmVhZF9pbml0X2ZpbGUpOiAgTWFrZSBzdXJlIHRoYXQgbnVsbCBmaWxlbmFtZSBpcwotCW5vdCBwYXNzZWQgdG8gb3BlbigpIG9yIGVsc2Ugd2UgZW5kIHVwIG9wZW5pbmcgdGhlIGRpcmVjdG9yeSwgYW5kCi0JcmVhZCBhIGJ1bmNoIG9mIGdhcmJhZ2UgaW50byBrZXltYXBbXS4KLQotTW9uIEZlYiAxNyAxNzoxNTowOSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmVhZGxpbmVfZGVmYXVsdF9iaW5kaW5ncyk6ICBPbmx5IG1ha2UgdXNlIG9mIFZMTkVYVAotCXdoZW4gYm90aCBWTE5FWFQgYW5kIFRFUk1JT1NfVFRZX0RSSVZFUiBpcyBkZWZpbmVkLiAgT24gU1ZSNAotCTx0ZXJtaW8uaD4gaW5jbHVkZXMgPHRlcm1pb3MuaD4sIHNvIFZMTkVYVCBpcyBhbHdheXMgZGVmaW5lZC4KLQotCSogc3lzZGVwLW5vcm0uaCAoX1BPU0lYX1ZFUlNJT04pOiAgRGVmaW5lIHRoaXMgZm9yIGFsbCBTVlI0Ci0Jc3lzdGVtcyBzbyB0aGF0IDx0ZXJtaW9zLmg+IGdldHMgdXNlZCwgaW5zdGVhZCBvZiA8dGVybWlvLmg+LgotCi1GcmkgRGVjIDIwIDEyOjA0OjMxIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDaGFuZ2Ugc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LgotCi1UdWUgRGVjIDEwIDA0OjA3OjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1GcmkgRGVjICA2IDIzOjIzOjE0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMsIGJzZCBtYWtlIGNhbid0Ci0JICBjb3BlLiBhZGRlZCBjbGVhbi1pbmZvLiAgYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydC4gIERvbid0Ci0JICBrbm93IGhvdyB0byBtYWtlIGluZm8gYW55bW9yZS4KLQotCSogY29uZmlndXJlLmluOiBjb21tb250YXJnZXRzIGlzIG5vIGxvbmdlciBhIHJlY29nbml6ZWQgaG9vaywgc28KLQkgIHJlbW92ZSBpdC4gIG5ldyBzdWJkaXIgY2FsbGVkIGRvYy4KLQotVGh1IERlYyAgNSAyMjo0NjoxMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLUZyaSBOb3YgMjIgMDk6MDI6MzIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1vYnNkLmg6ICBSZW5hbWUgZnJvbSBzeXNkZXAtbmV3c29zLmguCi0JKiBjb25maWd1cmUuaW46ICBVc2Ugc3lzZGVwLW9ic2QgZm9yIE1hY2ggYXMgd2VsbCBhcyBORVdzLgotCi0JKiBzeXNkZXAtbm9ybS5oLCBzeXNkZXAtYWl4Lmg6ICBBZGQgPHN5cy90eXBlcy5oPiwgd2hpY2ggUE9TSVgKLQlyZXF1aXJlcyB0byBtYWtlIDxkaXJlbnQuaD4gd29yay4gIEltcHJvdmUgU3VuIGFsbG9jYSBkZWNsLgotCi1UaHUgTm92IDIxIDE4OjQ4OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENsZWFuIHVwIC4uL2dsb2IvdGlsZGUuYyAtPiB0aWxkZS5vIHBhdGguCi0JQ2xlYW4gdXAgbWFrZWZpbGUgYSBiaXQgaW4gZ2VuZXJhbC4KLQotVGh1IE5vdiAyMSAxNDo0MDoyOSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1zdnI0OiAgTWFrZSBTVlI0IHdvcmsuCi0KLQkqIHJlYWRsaW5lLmM6ICBNb3ZlIGNvbmZpZyBzdHVmZiB0byBzeXNkZXAuaCwgdXNlIHR5cGVkZWYgZGlyZW50Ci0JY29uc2lzdGVudGx5LCByZW1vdmUgcmVmcyB0byBkX25hbWxlbiAoJiBEX05BTUxFTikgdG8gaW1wcm92ZQotCXBvcnRhYmlsaXR5LiAgQWxzbywgdXBkYXRlIGNvcHlyaWdodCBub3RpY2UuCi0JcmVhZGxpbmUuaDogIHJlbW92ZSBjb25maWcgc3R1ZmYgdGhhdCBJIGFkZGVkIGVycm9uZW91c2x5IGluIHRoZQotCWZpcnN0IHBsYWNlLgotCi0JKiBlbWFjc19rZXltYXAuYywgZnVubWFwLmMsIGhpc3RvcnkuYywga2V5bWFwcy5jLCB2aV9rZXltYXAuYywKLQl2aV9tb2RlLmM6ICBtb3ZlIGNvbmZpZyBzdHVmZiB0byBzeXNkZXAuaCwgdXBkYXRlIGNvcHlyaWdodCBub3RpY2VzLgotCi1UdWUgTm92IDE5IDE1OjAyOjEzIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhpc3RvcnkuYzogICNpbmNsdWRlICJzeXNkZXAuaCIuCi0KLVR1ZSBOb3YgMTkgMTA6NDk6MTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcvaG0tc3lzdiwgY29uZmlnL2htLXNjbzogIENoYW5nZSBTWVNWIHRvCi0JVVNHIHRvIG1hdGNoIGN1cnJlbnQgdXNhZ2UuCi0KLQkqIHJlYWRsaW5lLmM6ICBBZGQgVVNHcjQgdG8gbGlzdCBvZiBkZWZpbmVkIHRoaW5ncyB0byBjaGVjayBmb3IKLQl0byB1c2UgPGRpcmVudC5oPiBzdHlsZSBkaXJlY3RvcnkgYWNjZXNzLgotCi0JKiBjb25maWcvaG0tc3ZyNDogIE5ldyBmaWxlIGZvciBTeXN0ZW0gViBSZWxlYXNlIDQgKFVTR3I0KS4KLQotTW9uIE5vdiAxOCAyMzo1OTo1MiAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uKTogIHVzZSBzdHJ1Y3QgZGlyZW50Ci0JaW5zdGVhZAlvZiBzdHJ1Y3QgZGlyZWN0LgotCi1GcmkgTm92ICAxIDA3OjAyOjEzIDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jIChybF90cmFuc2xhdGVfa2V5c2VxKSBNYWtlIEMtPyB0cmFuc2xhdGUgdG8gUlVCT1VUCi0JdW5jb25kaXRpb25hbGx5LgotCi1Nb24gT2N0IDI4IDExOjM0OjUyIDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOyBVc2UgUG9zaXggZGlyZWN0b3J5IHJvdXRpbmVzIGFuZCBtYWNyb3MuCi0KLQkqIGZ1bm1hcC5jOyBBZGQgZW50cnkgZm9yIGNhbGwtbGFzdC1rYmQtbWFjcm8uCi0KLQkqIHJlYWRsaW5lLmMgKHJsX3ByZXBfdGVybSk7IFVzZSBzeXN0ZW0gRU9GIGNoYXJhY3RlciBvbiBQT1NJWAotCXN5c3RlbXMgYWxzby4KLQotVGh1IE9jdCAgMyAxNjoxOTo1MyAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzsgTWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gaGF2aW5nIGEgVEVSTUlPUyB0dHkKLQlkcml2ZXIsIGFuZCBoYXZpbmcgUE9TSVggc2lnbmFsIGhhbmRsaW5nLiAgWW91IG1pZ2h0IG9uZSB3aXRob3V0Ci0JdGhlIG90aGVyLiAgTmV3IGRlZmluZXMgdXNlZCBIQVZFX1BPU0lYX1NJR05BTFMsIGFuZAotCVRFUk1JT1NfVFRZX0RSSVZFUi4KLQotVHVlIEp1bCAzMCAyMjozNzoyNiAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogcmxfZ2V0YyAoKSBJZiBhIGNhbGwgdG8gcmVhZCAoKSByZXR1cm5zIHdpdGhvdXQgYW4KLQllcnJvciwgYnV0IHdpdGggemVybyBjaGFyYWN0ZXJzLCB0aGUgZmlsZSBpcyBlbXB0eSwgc28gcmV0dXJuIEVPRi4KLQotVGh1IEp1bCAxMSAyMDo1ODozOCAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogKHJsX2dldF9uZXh0X2hpc3RvcnksIHJsX2dldF9wcmV2aW91c19oaXN0b3J5KQotCVJlYWxsb2NhdGUgdGhlIGJ1ZmZlciBzcGFjZSBpZiB0aGUgbGluZSBiZWluZyBtb3ZlZCB0byBpcyBsb25nZXIKLQl0aGUgdGhlIGN1cnJlbnQgc3BhY2UgYWxsb2NhdGVkLiAgQW1hemluZyB0aGF0IG5vIG9uZSBoYXMgZm91bmQKLQl0aGlzIGJ1ZyB1bnRpbCBub3cuCi0KLVN1biBKdWwgIDcgMDI6Mzc6MDUgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6KHJsX3BhcnNlX2FuZF9iaW5kKSBBbGxvdyBsZWFkaW5nIHdoaXRlc3BhY2UuCi0JICBNYWtlIHN1cmUgVEVSTUlPIGFuZCBURVJNSU9TIHN5c3RlbXMgdHJlYXQgQ1IgYW5kIE5MCi0JICBkaXNjdGluY3RseS4KLQkKLVR1ZSBKdW4gMjUgMDQ6MDk6MjcgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IFJld29yayBwYXJzaW5nIGNvbmRpdGlvbmFscyB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZQotCXByaW9yIHN0YXRlcyBvZiB0aGUgY29uZGl0aW9uYWwgc3RhY2suICBUaGlzIG1ha2VzICRpZiBzdGF0ZW1lbnRzCi0Jd29yayBjb3JyZWN0bHkuCi0KLU1vbiBKdW4gMjQgMjA6NDU6NTkgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHN1cHBvcnQgZm9yIGRpc3BsYXlpbmcga2V5IGJpbmRpbmcgaW5mb3JtYXRpb24KLQlpbmNsdWRlcyB0aGUgZnVuY3Rpb25zIHJsX2xpc3RfZnVubWFwX25hbWVzICgpLAotCWludm9raW5nX2tleXNlcXNfaW5fbWFwICgpLCBybF9pbnZva2luZ19rZXlzZXFzICgpLAotCXJsX2R1bXBfZnVuY3Rpb25zICgpLCBhbmQgcmxfZnVuY3Rpb25fZHVtcGVyICgpLgotCi0JZnVubWFwLmM6IHN1cHBvcnQgZm9yIHNhbWUgaW5jbHVkZXMgcmxfZnVubWFwX25hbWVzICgpLgotCi0JcmVhZGxpbmUuYywgZnVubWFwLmM6IG5vIGxvbmdlciBkZWZpbmUgU1RBVElDX01BTExPQy4gIEhvd2V2ZXIsCi0JdXBkYXRlIGJvdGggdmVyc2lvbiBvZiB4cmVhbGxvYyAoKSB0byBoYW5kbGUgYSBudWxsIHBvaW50ZXIuCi0KLVRodSBBcHIgMjUgMTI6MDM6NDkgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHZpX21vZGUuYyAocmxfdmlfZndvcmQsIGZXb3JkLCBldGMuICBBbGwgZnVuY3Rpb25zIHVzZQotCXRoZSBtYWNybyBgaXNpZGVudCgpJy4gIEZpeGVkIG1vdmVtZW50IGJ1ZyB3aGljaCBwcmV2ZW50cwotCWNvbnRpbmlvdXMgbW92ZW1lbnQgdGhyb3VnaCB0aGUgdGV4dC4KLQotRnJpIEp1bCAyNyAxNjo0NzowMSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYyAocGFyc2VyX2lmKSBBbGxvdyAiJGlmIHRlcm09Zm9vIiBjb25zdHJ1Y3QuCi0KLVdlZCBNYXkgMjMgMTY6MTA6MzMgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmMgKHJsX2Rpc3BhdGNoKSBDb3JyZWN0bHkgcmVtZW1iZXIgdGhlIGxhc3QgY29tbWFuZAotCWV4ZWN1dGVkLiAgRml4ZWQgdHlwbyBpbiB1c2VybmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uICgpLgotCi1Nb24gQXByICA5IDE5OjU1OjQ4IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiB1c2VybmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uICgpOyBGb3IgdGV4dCBwYXNzZWQgaW4KLQl3aXRoIGEgbGVhZGluZyBgficsIHJlbWVtYmVyIHRoYXQgdGhpcyBjb3VsZCBiZSBhIGZpbGVuYW1lIChhZnRlcgotCWl0IGlzIGNvbXBsZXRlZCkuCi0KLVRodSBBcHIgIDUgMTM6NDQ6MjQgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHJsX3NlYXJjaF9oaXN0b3J5ICgpOiBDb3JyZWN0bHkgaGFuZGxlIGNhc2Ugb2YgYW4KLQl1bmZvdW5kIHNlYXJjaCBzdHJpbmcsIGJ1dCBhIGdyYWNlZnVsIGV4aXQgKGFzIHdpdGggRVNDKS4KLQotCSogcmVhZGxpbmUuYzogcmxfcmVzdGFydF9vdXRwdXQgKCk7ICBUaGUgQXBvbGxvIHBhc3NlcyB0aGUgYWRkcmVzcwotCW9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gVElPQ1NUQVJULCBub3QgdGhlIGRlc2NyaXB0b3IgaXRzZWxmLgotCi1UdWUgTWFyIDIwIDA1OjM4OjU1IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBybF9jb21wbGV0ZSAoKTsgc2Vjb25kIGNhbGwgaW4gYSByb3cgY2F1c2VzIHBvc3NpYmxlCi0JY29tcGxldGlvbnMgdG8gYmUgbGlzdGVkLgotCi0JKiByZWFkbGluZS5jOiBybF9yZWRpc3BsYXkgKCksIGFkZGVkIHByb21wdF90aGlzX2xpbmUgdmFyaWFibGUKLQl3aGljaCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNoYXJhY3RlciBmb2xsb3dpbmcgXG4gaW4gcHJvbXB0LgotCi1TdW4gTWFyIDExIDA0OjMyOjAzIDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiBTaWduYWxzIGFyZSBub3cgc3VwcG9zZWRseSBoYW5kbGVkIGluc2lkZSBvZiBTWVNWIGNvbXBpbGF0aW9uLgotCi1XZWQgSmFuIDE3IDE5OjI0OjA5IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgc2JwaHkudWNzYi5lZHUpCi0KLQkqIGhpc3RvcnkuYzogaGlzdG9yeV9leHBhbmQgKCk7IGZpeGVkIG92ZXJ3cml0aW5nIG1lbW9yeSBlcnJvciwKLQlhZGRlZCBuZWVkZWQgYXJndW1lbnQgdG8gY2FsbCB0byBnZXRfaGlzdG9yeV9ldmVudCAoKS4KLQotVGh1IEphbiAxMSAxMDo1NDowNCAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IHNicGh5LnVjc2IuZWR1KQotCi0JKiByZWFkbGluZS5jOiBhZGRlZCBtYXJrX21vZGlmaWVkX2xpbmVzIHRvIGNvbnRyb2wgdGhlCi0JZGlzcGxheSBvZiBhbiBhc3RlcmlzayBvbiBtb2RpZmllZCBoaXN0b3J5IGxpbmVzLiAgQWxzbwotCWFkZGVkIGEgdXNlciB2YXJpYWJsZSBjYWxsZWQgbWFyay1tb2RpZmllZC1saW5lcyB0byB0aGUKLQlgc2V0JyBjb21tYW5kLgotCi1UaHUgSmFuICA0IDEwOjM4OjA1IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgc2JwaHkudWNzYi5lZHUpCi0KLQkqIHJlYWRsaW5lLmM6IHN0YXJ0X2luc2VydCAoKS4gIE9ubHkgdXNlIElDIGlmIHdlIGRvbid0IGhhdmUgYW4gaW0KLQljYXBhYmlsaXR5LgotCi1GcmkgU2VwICA4IDA5OjAwOjQ1IDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJlYWRsaW5lLmM6IHJsX3ByZXBfdGVybWluYWwgKCkuICBPbmx5IHR1cm4gb24gOHRoIGJpdAotCSAgYXMgbWV0YS1iaXQgaWZmIHRoZSB0ZXJtaW5hbCBpcyBub3QgdXNpbmcgcGFyaXR5LgotCi1TdW4gU2VwICAzIDA4OjU3OjQwIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJlYWRsaW5lLmM6IHN0YXJ0X2luc2VydCAoKS4gIFVzZXMgbXVsdGlwbGUKLQkgIGluc2VydGlvbiBjYWxsIGluIGNhc2VzIHdoZXJlIHRoYXQgbWFrZXMgc2Vuc2UuCi0KLQkgIHJsX2luc2VydCAoKS4gIFJlYWQgdHlwZS1haGVhZCBidWZmZXIgZm9yIGFkZGl0aW9uYWwKLQkgIGtleXMgdGhhdCBhcmUgYm91bmQgdG8gcmxfaW5zZXJ0LCBhbmQgaW5zZXJ0IHRoZW0KLQkgIGFsbCBhdCBvbmNlLiAgTWFrZSBpbnNlcnRpb24gb2Ygc2luZ2xlIGtleXMgZ2l2ZW4KLQkgIHdpdGggYW4gYXJndW1lbnQgbXVjaCBtb3JlIGVmZmljaWVudC4KLQotVHVlIEF1ZyAgOCAxODoxMzo1NyAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiByZWFkbGluZS5jOiBDaGFuZ2VkIGhhbmRsaW5nIG9mIEVPRi4gIHJlYWRsaW5lICgpIHJldHVybnMKLQkgKGNoYXIgKilFT0Ygb3IgY29uc2VkIHN0cmluZy4gIFRoZSBFT0YgY2hhcmFjdGVyIGlzIHJlYWQgZnJvbSB0aGUKLQkgdHR5LCBvciBpZiB0aGUgdHR5IGRvZXNuJ3QgaGF2ZSBvbmUsIGRlZmF1bHRzIHRvIEMtZC4KLQotCSogcmVhZGxpbmUuYzogQWRkZWQgc3VwcG9ydCBmb3IgZXZlbnQgZHJpdmVuIHByb2dyYW1zLgotCSAgcmxfZXZlbnRfaG9vayBpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHlvdSB3YW50IGNhbGxlZAotCSAgd2hpbGUgUmVhZGxpbmUgaXMgd2FpdGluZyBmb3IgaW5wdXQuCi0KLQkqIHJlYWRsaW5lLmM6IENsZWFudXAgdGltZS4gIEZ1bmN0aW9ucyB3aXRob3V0IHR5cGUgZGVjbGFyYXRpb25zCi0JICBkbyBub3QgdXNlIHJldHVybiB3aXRoIGEgdmFsdWUuCi0KLQkqIGhpc3RvcnkuYzogaGlzdG9yeV9leHBhbmQgKCkgaGFzIG5ldyB2YXJpYWJsZSB3aGljaCBpcyB0aGUKLQkgIGNoYXJhY3RlcnMgdG8gaWdub3JlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBoaXN0b3J5X2V4cGFuc2lvbl9jaGFyLgotCi1TdW4gSnVsIDE2IDA4OjE0OjAwIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJsX3ByZXBfdGVybWluYWwgKCkKLQkgIEJTRCB2ZXJzaW9uIHR1cm5zIG9mZiBDLXMsIEMtcSwgQy15LCBDLXYuCi0KLQkqIHJlYWRsaW5lLmMgLS0gcmxfcHJlcF90ZXJtaW5hbCAoKQotCSAgU1lTViB2ZXJzaW9uIGhhY2tzIHJlYWRsaW5lX2VjaG9pbmdfcC4KLQkgIEJTRCB2ZXJzaW9uIHR1cm5zIG9uIHBhc3Npbmcgb2YgdGhlIDh0aCBiaXQgZm9yIHRoZSBkdXJhdGlvbgotCSAgb2YgcmVhZGluZyB0aGUgbGluZS4KLQotVHVlIEp1bCAxMSAwNjoyNTowMSAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiByZWFkbGluZS5jOiBuZXcgdmFyaWFibGUgcmxfdGlsZGVfZXhwYW5kZXIuCi0JICBJZiBub24tbnVsbCwgdGhpcyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgaWYKLQkgIHRoZSBzdGFuZGFyZCBtZWFuaW5nIGZvciBleHBhbmRpbmcgYSB0aWxkZSBmYWlscy4gIFRoZSBmdW5jdGlvbiBpcwotCSAgY2FsbGVkIHdpdGggdGhlIHRleHQgc2FucyB0aWxkZSAoYXMgaW4gImZvbyIpLCBhbmQgcmV0dXJucyBhCi0JICBtYWxsb2MoKSdlZCBzdHJpbmcgd2hpY2ggaXMgdGhlIGV4cGFuc2lvbiwgb3IgYSBOVUxMIHBvaW50ZXIgaWYKLQkgIHRoZXJlIGlzIG5vIGV4cGFuc2lvbi4gCi0KLQkqIHJlYWRsaW5lLmggLSBuZXcgZmlsZSBjaGFyZGVmcy5oCi0JICBTZXBhcmF0ZXMgdGhpbmdzIHRoYXQgb25seSByZWFkbGluZS5jIG5lZWRzIGZyb20gdGhlIHN0YW5kYXJkCi0JICBoZWFkZXIgZmlsZSBwdWJsaXNoaW5nIGludGVyZXN0aW5nIHRoaW5ncyBhYm91dCByZWFkbGluZS4KLQotCSogcmVhZGxpbmUuYzoKLQkgIHJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MgKCkgbm93IGxvb2tzIGF0IHRlcm1pbmFsIGNoYXJhcmFjdGVycwotCSAgYW5kIGJpbmRzIHRob3NlIGFzIHdlbGwuCi0KLVdlZCBKdW4gMjggMjA6MjA6NTEgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogTWFkZSByZWFkbGluZSBhbmQgaGlzdG9yeSBpbnRvIGluZGVwZW5kZW50IGxpYnJhcmllcy4KLQpkaWZmIC0tZ2l0IGEvc2V0dXAuY29tIGIvc2V0dXAuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNhZmQ1Li4wMDAwMDAwCi0tLSBhL3NldHVwLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotJCEgc2V0dXAgZmlsZXMgZm9yIG9wZW5WTVMvQWxwaGEKLSQhCi0kIGRlZmluZSBhb3V0IFstLklOQ0xVREUuQU9VVF0KLSQgZGVmaW5lIGNvZmYgWy0uSU5DTFVERS5DT0ZGXQotJCBkZWZpbmUgZWxmIFstLklOQ0xVREUuRUxGXQotJCBkZWZpbmUgbXB3IFstLklOQ0xVREUuTVBXXQotJCBkZWZpbmUgbmxtIFstLklOQ0xVREUuTkxNXQotJCBkZWZpbmUgb3Bjb2RlIFstLklOQ0xVREUuT1BDT0RFXQpkaWZmIC0tZ2l0IGEvc3ltbGluay10cmVlIGIvc3ltbGluay10cmVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTY1ODJkLi4wMDAwMDAwCi0tLSBhL3N5bWxpbmstdHJlZQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBDcmVhdGUgYSBzeW1saW5rIHRyZWUuCi0jCi0jIFN5bnRheDogc3ltbGluay10cmVlIHNyY2RpciAiaWdub3JlMSBpZ25vcmUyIC4uLiIKLSMKLSMgd2hlcmUgc3JjZGlyIGlzIHRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlIGEgc3ltbGluayB0cmVlIHRvLAotIyBhbmQgImlnbm9yZU4iIGlzIGEgbGlzdCBvZiBmaWxlcy9kaXJlY3RvcmllcyB0byBpZ25vcmUuCi0KLXByb2c9JDAKLXNyY2Rpcj0kMQotaWdub3JlPSIkMiIKLQotaWdub3JlX2FkZGl0aW9uYWw9Ii4gLi4gQ1ZTIgotCi0jIElmIHdlIHdlcmUgaW52b2tlZCB3aXRoIGEgcmVsYXRpdmUgcGF0aCBuYW1lLCBhZGp1c3QgJHtwcm9nfSB0byB3b3JrCi0jIGluIHN1YmRpcnMuCi1jYXNlICR7cHJvZ30gaW4KLS8qKSA7OwotKikgcHJvZz0uLi8ke3Byb2d9IDs7Ci1lc2FjCi0KLSMgU2V0IG5ld3NyY2RpciB0byBzb21ldGhpbmcgc3ViZGlyZWN0b3JpZXMgY2FuIHVzZS4KLWNhc2UgJHtzcmNkaXJ9IGluCi0vKikgbmV3c3JjZGlyPSR7c3JjZGlyfSA7OwotKikgbmV3c3JjZGlyPS4uLyR7c3JjZGlyfSA7OwotZXNhYwotCi1mb3IgZiBpbiBgbHMgLWEgJHtzcmNkaXJ9YDsgZG8KLSAgaWYgWyAtZCAke3NyY2Rpcn0vJGYgXTsgdGhlbgotICAgIGZvdW5kPQotICAgIGZvciBpIGluICR7aWdub3JlfSAke2lnbm9yZV9hZGRpdGlvbmFsfTsgZG8KLSAgICAgIGlmIFsgIiRmIiA9ICIkaSIgXTsgdGhlbgotCWZvdW5kPXllcwotICAgICAgZmkKLSAgICBkb25lCi0gICAgaWYgWyAteiAiJHtmb3VuZH0iIF07IHRoZW4KLSAgICAgIGVjaG8gIiRmCQkuLndvcmtpbmcgaW4iCi0gICAgICBpZiBbIC1kICRmIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAkZjsgZmkKLSAgICAgIChjZCAkZjsgJHtwcm9nfSAke25ld3NyY2Rpcn0vJGYgIiR7aWdub3JlfSIpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRmCQkuLmxpbmtlZCIKLSAgICBybSAtZiAkZgotICAgIGxuIC1zICR7c3JjZGlyfS8kZiAuCi0gIGZpCi1kb25lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGV4aW5mby90ZXhpbmZvLnRleCBiL3RleGluZm8vdGV4aW5mby50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkM2EzM2MuLjAwMDAwMDAKLS0tIGEvdGV4aW5mby90ZXhpbmZvLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU0MzEgKzAsMCBAQAotJSB0ZXhpbmZvLnRleCAtLSBUZVggbWFjcm9zIHRvIGhhbmRsZSBUZXhpbmZvIGZpbGVzLgotJSAkSWQkCi0lCi0lIENvcHlyaWdodCAoQykgMTk4NSwgODYsIDg4LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4Ci0lIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotJQotJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0lIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0lIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSUgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotJQotJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0lIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSUgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotJQotJSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotJSBhbG9uZyB3aXRoIHRoaXMgdGV4aW5mby50ZXggZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCi0lIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSUgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0lCi0lIEluIG90aGVyIHdvcmRzLCB5b3UgYXJlIHdlbGNvbWUgdG8gdXNlLCBzaGFyZSBhbmQgaW1wcm92ZSB0aGlzIHByb2dyYW0uCi0lIFlvdSBhcmUgZm9yYmlkZGVuIHRvIGZvcmJpZCBhbnlvbmUgZWxzZSB0byB1c2UsIHNoYXJlIGFuZCBpbXByb3ZlCi0lIHdoYXQgeW91IGdpdmUgdGhlbS4gICBIZWxwIHN0YW1wIG91dCBzb2Z0d2FyZS1ob2FyZGluZyEKLSUKLSUgUGxlYXNlIHRyeSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGV4aW5mby50ZXggYmVmb3JlIHN1Ym1pdHRpbmcgYnVnCi0lIHJlcG9ydHM7IHlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tOgotJSAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvdGV4aW5mby50ZXgKLSUgICAvaG9tZS9nZC9nbnUvZG9jL3RleGluZm8udGV4IG9uIHRoZSBHTlUgbWFjaGluZXMuCi0lICAgKGFuZCBhbGwgR05VIG1pcnJvcnMsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvb3JkZXIvZnRwLmh0bWwpCi0lICAgZnRwOi8vdHVnLm9yZy90ZXgvdGV4aW5mby50ZXgKLSUgICBmdHA6Ly9jdGFuLm9yZy9tYWNyb3MvdGV4aW5mby90ZXhpbmZvLnRleAotJSAgIChhbmQgYWxsIENUQU4gbWlycm9ycywgZmluZ2VyIGN0YW5AY3Rhbi5vcmcgZm9yIGEgbGlzdCkuCi0lIFRoZSB0ZXhpbmZvLnRleCBpbiB0aGUgdGV4aW5mbyBkaXN0cmlidXRpb24gaXRzZWxmIGNvdWxkIHdlbGwgYmUgb3V0Ci0lIG9mIGRhdGUsIHNvIGlmIHRoYXQncyB3aGF0IHlvdSdyZSB1c2luZywgcGxlYXNlIGNoZWNrLgotJSAKLSUgU2VuZCBidWcgcmVwb3J0cyB0byBidWctdGV4aW5mb0BnbnUub3JnLgotJSBQbGVhc2UgaW5jbHVkZSBhIHByZWNpc2UgdGVzdCBjYXNlIGluIGVhY2ggYnVnIHJlcG9ydCwKLSUgaW5jbHVkaW5nIGEgY29tcGxldGUgZG9jdW1lbnQgd2l0aCB3aGljaCB3ZSBjYW4gcmVwcm9kdWNlIHRoZSBwcm9ibGVtLgotJSAKLSUgVG8gcHJvY2VzcyBhIFRleGluZm8gbWFudWFsIHdpdGggVGVYLCBpdCdzIG1vc3QgcmVsaWFibGUgdG8gdXNlIHRoZQotJSB0ZXhpMmR2aSBzaGVsbCBzY3JpcHQgdGhhdCBjb21lcyB3aXRoIHRoZSBkaXN0cmlidXRpb24uICBGb3Igc2ltcGxlCi0lIG1hbnVhbHMsIGhvd2V2ZXIsIHlvdSBjYW4gZ2V0IGF3YXkgd2l0aDoKLSUgICB0ZXggZm9vLnRleGkKLSUgICB0ZXhpbmRleCBmb28uPz8KLSUgICB0ZXggZm9vLnRleGkKLSUgICB0ZXggZm9vLnRleGkKLSUgICBkdmlwcyBmb28uZHZpIC1vICMgb3Igd2hhdGV2ZXIsIHRvIHByb2Nlc3MgdGhlIGR2aSBmaWxlLgotJSBUaGUgZXh0cmEgcnVucyBvZiBUZVggZ2V0IHRoZSBjcm9zcy1yZWZlcmVuY2UgaW5mb3JtYXRpb24gY29ycmVjdC4KLSUgU29tZXRpbWVzIG9uZSBydW4gYWZ0ZXIgdGV4aW5kZXggc3VmZmljZXMsIGFuZCBzb21ldGltZXMgeW91IG5lZWQgbW9yZQotJSB0aGFuIHR3bzsgdGV4aTJkdmkgZG9lcyBpdCBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeS4KLQotCi0lIE1ha2UgaXQgcG9zc2libGUgdG8gY3JlYXRlIGEgLmZtdCBmaWxlIGp1c3QgYnkgbG9hZGluZyB0aGlzIGZpbGU6Ci0lIGlmIHRoZSB1bmRlcmx5aW5nIGZvcm1hdCBpcyBub3QgbG9hZGVkLCBzdGFydCBieSBsb2FkaW5nIGl0IG5vdy4KLSUgQWRkZWQgYnkgZ2lsZGVhIE5vdmVtYmVyIDE5OTMuCi1cZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBmbXRuYW1lXGVuZGNzbmFtZVxyZWxheFxpbnB1dCBwbGFpblxmaQotCi0lIFRoaXMgYXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSB2ZXJzaW9uIG51bWJlciBiYXNlZCBvbiBSQ1MuCi1cZGVmXGRlZnRleGluZm92ZXJzaW9uJCMxOiAjMiAke1xkZWZcdGV4aW5mb3ZlcnNpb257IzJ9fQotXGRlZnRleGluZm92ZXJzaW9uJFJldmlzaW9uJAotXG1lc3NhZ2V7TG9hZGluZyB0ZXhpbmZvIHBhY2thZ2UgW1ZlcnNpb24gXHRleGluZm92ZXJzaW9uXTp9Ci0KLSUgSWYgaW4gYSAuZm10IGZpbGUsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlcgotJSBhbmQgdHVybiBvbiBhY3RpdmUgY2hhcmFjdGVycyB0aGF0IHdlIGNvdWxkbid0IGRvIGVhcmxpZXIgYmVjYXVzZQotJSB0aGV5IG1pZ2h0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIGlucHV0IGZpbGUgbmFtZS4KLVxldmVyeWpvYntcbWVzc2FnZXtbVGV4aW5mbyB2ZXJzaW9uIFx0ZXhpbmZvdmVyc2lvbl19XG1lc3NhZ2V7fQotICBcY2F0Y29kZWArPVxhY3RpdmUgXGNhdGNvZGVgXF89XGFjdGl2ZX0KLQotJSBTYXZlIHNvbWUgcGFydHMgb2YgcGxhaW4gdGV4IHdob3NlIG5hbWVzIHdlIHdpbGwgcmVkZWZpbmUuCi0KLVxsZXRccHRleGI9XGIKLVxsZXRccHRleGJ1bGxldD1cYnVsbGV0Ci1cbGV0XHB0ZXhjPVxjCi1cbGV0XHB0ZXhjb21tYT1cLAotXGxldFxwdGV4ZG90PVwuCi1cbGV0XHB0ZXhkb3RzPVxkb3RzCi1cbGV0XHB0ZXhlbmQ9XGVuZAotXGxldFxwdGV4ZXF1aXY9XGVxdWl2Ci1cbGV0XHB0ZXhleGNsYW09XCEKLVxsZXRccHRleGk9XGkKLVxsZXRccHRleGxicmFjZT1cewotXGxldFxwdGV4cmJyYWNlPVx9Ci1cbGV0XHB0ZXhzdGFyPVwqCi1cbGV0XHB0ZXh0PVx0Ci0KLSUgV2UgbmV2ZXIgd2FudCBwbGFpbidzIG91dGVyIFwrIGRlZmluaXRpb24gaW4gVGV4aW5mby4KLSUgRm9yIEB0ZXgsIHdlIGNhbiB1c2UgXHRhYmFsaWduLgotXGxldFwrID0gXHJlbGF4Ci0KLQotXG1lc3NhZ2V7QmFzaWNzLH0KLVxjaGFyZGVmXG90aGVyPTEyCi0KLSUgSWYgdGhpcyBjaGFyYWN0ZXIgYXBwZWFycyBpbiBhbiBlcnJvciBtZXNzYWdlIG9yIGhlbHAgc3RyaW5nLCBpdAotJSBzdGFydHMgYSBuZXcgbGluZSBpbiB0aGUgb3V0cHV0LgotXG5ld2xpbmVjaGFyID0gYF5eSgotCi0lIFNldCB1cCBmaXhlZCB3b3JkcyBmb3IgRW5nbGlzaCBpZiBub3QgYWxyZWFkeSBzZXQuCi1caWZ4XHB1dHdvcmRBcHBlbmRpeFx1bmRlZmluZWQgXGdkZWZccHV0d29yZEFwcGVuZGl4e0FwcGVuZGl4fVxmaQotXGlmeFxwdXR3b3JkQ2hhcHRlclx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRDaGFwdGVye0NoYXB0ZXJ9XGZpCi1caWZ4XHB1dHdvcmRmaWxlXHVuZGVmaW5lZCAgICAgXGdkZWZccHV0d29yZGZpbGV7ZmlsZX1cZmkKLVxpZnhccHV0d29yZEluZm9cdW5kZWZpbmVkICAgICBcZ2RlZlxwdXR3b3JkSW5mb3tJbmZvfVxmaQotXGlmeFxwdXR3b3JkTWV0aG9kb25cdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNZXRob2RvbntNZXRob2Qgb259XGZpCi1caWZ4XHB1dHdvcmRvblx1bmRlZmluZWQgICAgICAgXGdkZWZccHV0d29yZG9ue29ufVxmaQotXGlmeFxwdXR3b3JkcGFnZVx1bmRlZmluZWQgICAgIFxnZGVmXHB1dHdvcmRwYWdle3BhZ2V9XGZpCi1caWZ4XHB1dHdvcmRzZWN0aW9uXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZHNlY3Rpb257c2VjdGlvbn1cZmkKLVxpZnhccHV0d29yZFNlY3Rpb25cdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkU2VjdGlvbntTZWN0aW9ufVxmaQotXGlmeFxwdXR3b3Jkc2VlXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRzZWV7c2VlfVxmaQotXGlmeFxwdXR3b3JkU2VlXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRTZWV7U2VlfVxmaQotXGlmeFxwdXR3b3JkU2hvcnRDb250ZW50c1x1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRTaG9ydENvbnRlbnRze1Nob3J0IENvbnRlbnRzfVxmaQotXGlmeFxwdXR3b3JkVGFibGVvZkNvbnRlbnRzXHVuZGVmaW5lZFxnZGVmXHB1dHdvcmRUYWJsZW9mQ29udGVudHN7VGFibGUgb2YgQ29udGVudHN9XGZpCi0KLSUgSWdub3JlIGEgdG9rZW4uCi0lCi1cZGVmXGdvYmJsZSMxe30KLQotXGh5cGhlbmF0aW9ue2FwLXBlbi1kaXh9Ci1caHlwaGVuYXRpb257bWluaS1idWYtZmVyIG1pbmktYnVmLWZlcnN9Ci1caHlwaGVuYXRpb257ZXNoZWxsfQotXGh5cGhlbmF0aW9ue3doaXRlLXNwYWNlfQotCi0lIE1hcmdpbiB0byBhZGQgdG8gcmlnaHQgb2YgZXZlbiBwYWdlcywgdG8gbGVmdCBvZiBvZGQgcGFnZXMuCi1cbmV3ZGltZW4gXGJpbmRpbmdvZmZzZXQKLVxuZXdkaW1lbiBcbm9ybWFsb2Zmc2V0Ci1cbmV3ZGltZW5ccGFnZXdpZHRoIFxuZXdkaW1lblxwYWdlaGVpZ2h0Ci0KLSUgU29tZXRpbWVzIGl0IGlzIGNvbnZlbmllbnQgdG8gaGF2ZSBldmVyeXRoaW5nIGluIHRoZSB0cmFuc2NyaXB0IGZpbGUKLSUgYW5kIG5vdGhpbmcgb24gdGhlIHRlcm1pbmFsLiAgV2UgZG9uJ3QganVzdCBjYWxsIFx0cmFjaW5nYWxsIGhlcmUsCi0lIHNpbmNlIHRoYXQgcHJvZHVjZXMgc29tZSB1c2VsZXNzIG91dHB1dCBvbiB0aGUgdGVybWluYWwuCi0lCi1cZGVmXGdsb2dnaW5nYWxse1xiZWdpbmdyb3VwIFxnbG9iYWxkZWZzID0gMSBcbG9nZ2luZ2FsbCBcZW5kZ3JvdXB9JQotXGlmeFxlVGVYdmVyc2lvblx1bmRlZmluZWQKLVxkZWZcbG9nZ2luZ2FsbHtcdHJhY2luZ2NvbW1hbmRzMiBcdHJhY2luZ3N0YXRzMgotICAgXHRyYWNpbmdwYWdlczEgXHRyYWNpbmdvdXRwdXQxIFx0cmFjaW5nbG9zdGNoYXJzMQotICAgXHRyYWNpbmdtYWNyb3MyIFx0cmFjaW5ncGFyYWdyYXBoczEgXHRyYWNpbmdyZXN0b3JlczEKLSAgIFxzaG93Ym94YnJlYWR0aFxtYXhkaW1lblxzaG93Ym94ZGVwdGhcbWF4ZGltZW4KLX0lCi1cZWxzZQotXGRlZlxsb2dnaW5nYWxse1x0cmFjaW5nY29tbWFuZHMzIFx0cmFjaW5nc3RhdHMyCi0gICBcdHJhY2luZ3BhZ2VzMSBcdHJhY2luZ291dHB1dDEgXHRyYWNpbmdsb3N0Y2hhcnMxCi0gICBcdHJhY2luZ21hY3JvczIgXHRyYWNpbmdwYXJhZ3JhcGhzMSBcdHJhY2luZ3Jlc3RvcmVzMQotICAgXHRyYWNpbmdzY2FudG9rZW5zMSBcdHJhY2luZ2Fzc2lnbnMxIFx0cmFjaW5naWZzMQotICAgXHRyYWNpbmdncm91cHMxIFx0cmFjaW5nbmVzdGluZzIKLSAgIFxzaG93Ym94YnJlYWR0aFxtYXhkaW1lblxzaG93Ym94ZGVwdGhcbWF4ZGltZW4KLX0lCi1cZmkKLQotJSBGb3IgQGNyb3BtYXJrcyBjb21tYW5kLgotJSBEbyBAY3JvcG1hcmtzIHRvIGdldCBjcm9wIG1hcmtzLgotJSAKLVxuZXdpZlxpZmNyb3BtYXJrcwotXGxldFxjcm9wbWFya3MgPSBcY3JvcG1hcmtzdHJ1ZQotJQotJSBEaW1lbnNpb25zIHRvIGFkZCBjcm9wbWFya3MgYXQgY29ybmVycy4KLSUgQWRkZWQgYnkgUC4gQS4gTWFjS2F5LCAxMiBOb3YuIDE5ODYKLSUKLVxuZXdkaW1lblxvdXRlcmhzaXplIFxuZXdkaW1lblxvdXRlcnZzaXplICUgc2V0IGJ5IHRoZSBwYXBlciBzaXplIHJvdXRpbmVzCi1cbmV3ZGltZW5cY29ybmVybG9uZyAgXGNvcm5lcmxvbmc9MXBjCi1cbmV3ZGltZW5cY29ybmVydGhpY2sgXGNvcm5lcnRoaWNrPS4zcHQKLVxuZXdkaW1lblx0b3BhbmRib3R0b21tYXJnaW4gXHRvcGFuZGJvdHRvbW1hcmdpbj0uNzVpbgotCi0lIE1haW4gb3V0cHV0IHJvdXRpbmUuCi1cY2hhcmRlZlxQQUdFID0gMjU1Ci1cb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19Ci0KLVxuZXdib3hcaGVhZGxpbmVib3gKLVxuZXdib3hcZm9vdGxpbmVib3gKLQotJSBcb25lcGFnZW91dCB0YWtlcyBhIHZib3ggYXMgYW4gYXJndW1lbnQuICBOb3RlIHRoYXQgXHBhZ2Vjb250ZW50cwotJSBkb2VzIGluc2VydGlvbnMsIGJ1dCB5b3UgaGF2ZSB0byBjYWxsIGl0IHlvdXJzZWxmLgotXGRlZlxvbmVwYWdlb3V0IzF7JQotICBcaWZjcm9wbWFya3MgXGhvZmZzZXQ9MHB0IFxlbHNlIFxob2Zmc2V0PVxub3JtYWxvZmZzZXQgXGZpCi0gICUKLSAgXGlmb2RkXHBhZ2VubyAgXGFkdmFuY2VcaG9mZnNldCBieSBcYmluZGluZ29mZnNldAotICBcZWxzZSBcYWR2YW5jZVxob2Zmc2V0IGJ5IC1cYmluZGluZ29mZnNldFxmaQotICAlCi0gICUgRG8gdGhpcyBvdXRzaWRlIG9mIHRoZSBcc2hpcG91dCBzbyBAY29kZSBldGMuIHdpbGwgYmUgZXhwYW5kZWQgaW4KLSAgJSB0aGUgaGVhZGxpbmUgYXMgdGhleSBzaG91bGQgYmUsIG5vdCB0YWtlbiBsaXRlcmFsbHkgKG91dHB1dHRpbmcgJydjb2RlKS4KLSAgXHNldGJveFxoZWFkbGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWhlYWRsaW5lfSUKLSAgXHNldGJveFxmb290bGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWZvb3RsaW5lfSUKLSAgJQotICB7JQotICAgICUgSGF2ZSB0byBkbyB0aGlzIHN0dWZmIG91dHNpZGUgdGhlIFxzaGlwb3V0IGJlY2F1c2Ugd2Ugd2FudCBpdCB0bwotICAgICUgdGFrZSBlZmZlY3QgaW4gXHdyaXRlJ3MsIHlldCB0aGUgZ3JvdXAgZGVmaW5lZCBieSB0aGUgXHZib3ggZW5kcwotICAgICUgYmVmb3JlIHRoZSBcc2hpcG91dCBydW5zLgotICAgICUKLSAgICBcZXNjYXBlY2hhciA9IGBcXCAgICAgJSB1c2UgYmFja3NsYXNoIGluIG91dHB1dCBmaWxlcy4KLSAgICBcaW5kZXhkdW1taWVzICAgICAgICAgJSBkb24ndCBleHBhbmQgY29tbWFuZHMgaW4gdGhlIG91dHB1dC4KLSAgICBcbm9ybWFsdHVybm9mZmFjdGl2ZSAgJSBcIGluIGluZGV4IGVudHJpZXMgbXVzdCBub3Qgc3RheSBcLCBlLmcuLCBpZgotICAgICAgICAgICAgICAgICAgICUgdGhlIHBhZ2UgYnJlYWsgaGFwcGVucyB0byBiZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4YW1wbGUuCi0gICAgXHNoaXBvdXRcdmJveHslCi0gICAgICBcaWZjcm9wbWFya3MgXHZib3ggdG8gXG91dGVydnNpemVcYmdyb3VwCi0gICAgICAgIFxoc2l6ZSA9IFxvdXRlcmhzaXplCi0gICAgICAgIFxsaW5le1xld3RvcFxoZmlsXGV3dG9wfSUKLSAgICAgICAgXG5vaW50ZXJsaW5lc2tpcAotICAgICAgICBcbGluZXslCi0gICAgICAgICAgXHZib3h7XG1vdmVsZWZ0XGNvcm5lcnRoaWNrXG5zdG9wfSUKLSAgICAgICAgICBcaGZpbGwKLSAgICAgICAgICBcdmJveHtcbW92ZXJpZ2h0XGNvcm5lcnRoaWNrXG5zdG9wfSUKLSAgICAgICAgfSUKLSAgICAgICAgXHZza2lwXHRvcGFuZGJvdHRvbW1hcmdpbgotICAgICAgICBcbGluZVxiZ3JvdXAKLSAgICAgICAgICBcaGZpbCAlIGNlbnRlciB0aGUgcGFnZSB3aXRoaW4gdGhlIG91dGVyIChwYWdlKSBoc2l6ZS4KLSAgICAgICAgICBcaWZvZGRccGFnZW5vXGhza2lwXGJpbmRpbmdvZmZzZXRcZmkKLSAgICAgICAgICBcdmJveFxiZ3JvdXAKLSAgICAgIFxmaQotICAgICAgJQotICAgICAgXHVudmJveFxoZWFkbGluZWJveAotICAgICAgXHBhZ2Vib2R5eyMxfSUKLSAgICAgIFxpZmRpbVxodFxmb290bGluZWJveCA+IDBwdAotICAgICAgICAlIE9ubHkgbGVhdmUgdGhpcyBzcGFjZSBpZiB0aGUgZm9vdGxpbmUgaXMgbm9uZW1wdHkuCi0gICAgICAgICUgKFdlIGxlc3NlbmVkIFx2c2l6ZSBmb3IgaXQgaW4gXG9kZGZvb3Rpbmd4eHguKQotICAgICAgICAlIFRoZSBcYmFzZWxpbmVza2lwPTI0cHQgaW4gcGxhaW4ncyBcbWFrZWZvb3RsaW5lIGhhcyBubyBlZmZlY3QuCi0gICAgICAgIFx2c2tpcCAyXGJhc2VsaW5lc2tpcAotICAgICAgICBcdW52Ym94XGZvb3RsaW5lYm94Ci0gICAgICBcZmkKLSAgICAgICUKLSAgICAgIFxpZmNyb3BtYXJrcwotICAgICAgICAgIFxlZ3JvdXAgJSBlbmQgb2YgXHZib3hcYmdyb3VwCi0gICAgICAgIFxoZmlsXGVncm91cCAlIGVuZCBvZiAoY2VudGVyaW5nKSBcbGluZVxiZ3JvdXAKLSAgICAgICAgXHZza2lwXHRvcGFuZGJvdHRvbW1hcmdpbiBwbHVzMWZpbGwgbWludXMxZmlsbAotICAgICAgICBcYm94bWF4ZGVwdGggPSBcY29ybmVydGhpY2sKLSAgICAgICAgXGxpbmV7JQotICAgICAgICAgIFx2Ym94e1xtb3ZlbGVmdFxjb3JuZXJ0aGlja1xuc2JvdH0lCi0gICAgICAgICAgXGhmaWxsCi0gICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc2JvdH0lCi0gICAgICAgIH0lCi0gICAgICAgIFxub2ludGVybGluZXNraXAKLSAgICAgICAgXGxpbmV7XGV3Ym90XGhmaWxcZXdib3R9JQotICAgICAgXGVncm91cCAlIFx2Ym94IGZyb20gZmlyc3QgY3JvcG1hcmtzIGNsYXVzZQotICAgICAgXGZpCi0gICAgfSUgZW5kIG9mIFxzaGlwb3V0XHZib3gKLSAgfSUgZW5kIG9mIGdyb3VwIHdpdGggXHR1cm5vZmZhY3RpdmUKLSAgXGFkdmFuY2VwYWdlbm8KLSAgXGlmbnVtXG91dHB1dHBlbmFsdHk+LTIwMDAwIFxlbHNlXGRvc3VwZXJlamVjdFxmaQotfQotCi1cbmV3aW5zZXJ0XG1hcmdpbiBcZGltZW5cbWFyZ2luPVxtYXhkaW1lbgotCi1cZGVmXHBhZ2Vib2R5IzF7XHZib3ggdG9ccGFnZWhlaWdodHtcYm94bWF4ZGVwdGg9XG1heGRlcHRoICMxfX0KLXtcY2F0Y29kZWBcQCA9MTEKLVxnZGVmXHBhZ2Vjb250ZW50cyMxe1xpZnZvaWRcdG9waW5zXGVsc2VcdW52Ym94XHRvcGluc1xmaQotJSBtYXJnaW5hbCBoYWNrcywganVoYUB2aWlzYS51dWNwIChKdWhhIFRha2FsYSkKLVxpZnZvaWRcbWFyZ2luXGVsc2UgJSBtYXJnaW5hbCBpbmZvIGlzIHByZXNlbnQKLSAgXHJsYXB7XGtlcm5caHNpemVcdmJveCB0b1x6QHtca2VybjFwdFxib3hcbWFyZ2luIFx2c3N9fVxmaQotXGRpbWVuQD1cZHAjMSBcdW52Ym94IzEKLVxpZnZvaWRcZm9vdGluc1xlbHNlXHZza2lwXHNraXBcZm9vdGluc1xmb290bm90ZXJ1bGUgXHVudmJveFxmb290aW5zXGZpCi1caWZyQGdnZWRib3R0b20gXGtlcm4tXGRpbWVuQCBcdmZpbCBcZml9Ci19Ci0KLSUgSGVyZSBhcmUgdGhlIHJ1bGVzIGZvciB0aGUgY3JvcG1hcmtzLiAgTm90ZSB0aGF0IHRoZXkgYXJlCi0lIG9mZnNldCBzbyB0aGF0IHRoZSBzcGFjZSBiZXR3ZWVuIHRoZW0gaXMgdHJ1bHkgXG91dGVyaHNpemUgb3IgXG91dGVydnNpemUKLSUgKFAuIEEuIE1hY0theSwgMTIgTm92ZW1iZXIsIDE5ODYpCi0lCi1cZGVmXGV3dG9we1x2cnVsZSBoZWlnaHRcY29ybmVydGhpY2sgZGVwdGgwcHQgd2lkdGhcY29ybmVybG9uZ30KLVxkZWZcbnN0b3B7XHZib3gKLSAge1xocnVsZSBoZWlnaHRcY29ybmVydGhpY2sgZGVwdGhcY29ybmVybG9uZyB3aWR0aFxjb3JuZXJ0aGlja319Ci1cZGVmXGV3Ym90e1x2cnVsZSBoZWlnaHQwcHQgZGVwdGhcY29ybmVydGhpY2sgd2lkdGhcY29ybmVybG9uZ30KLVxkZWZcbnNib3R7XHZib3gKLSAge1xocnVsZSBoZWlnaHRcY29ybmVybG9uZyBkZXB0aFxjb3JuZXJ0aGljayB3aWR0aFxjb3JuZXJ0aGlja319Ci0KLSUgUGFyc2UgYW4gYXJndW1lbnQsIHRoZW4gcGFzcyBpdCB0byAjMS4gIFRoZSBhcmd1bWVudCBpcyB0aGUgcmVzdCBvZgotJSB0aGUgaW5wdXQgbGluZSAoZXhjZXB0IHdlIHJlbW92ZSBhIHRyYWlsaW5nIGNvbW1lbnQpLiAgIzEgc2hvdWxkIGJlIGEKLSUgbWFjcm8gd2hpY2ggZXhwZWN0cyBhbiBvcmRpbmFyeSB1bmRlbGltaXRlZCBUZVggYXJndW1lbnQuCi0lCi1cZGVmXHBhcnNlYXJnIzF7JQotICBcbGV0XG5leHQgPSAjMSUKLSAgXGJlZ2luZ3JvdXAKLSAgICBcb2JleWxpbmVzCi0gICAgXGZ1dHVyZWxldFx0ZW1wXHBhcnNlYXJneAotfQotCi0lIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIG9iZXllZCBzcGFjZSAoZnJvbSBhbiBAZXhhbXBsZSBlbnZpcm9ubWVudCBvcgotJSB0aGUgbGlrZSksIHJlbW92ZSBpdCBhbmQgcmVjdXJzZS4gIE90aGVyd2lzZSwgd2UncmUgZG9uZS4KLVxkZWZccGFyc2Vhcmd4eyUKLSAgJSBcb2JleWVkc3BhY2UgaXMgZGVmaW5lZCBmYXIgYmVsb3csIGFmdGVyIHRoZSBkZWZpbml0aW9uIG9mIFxzZXBzcGFjZXMuCi0gIFxpZnhcb2JleWVkc3BhY2VcdGVtcAotICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZ2Rpc2NhcmRzcGFjZQotICBcZWxzZQotICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZ2xpbmUKLSAgXGZpCi19Ci0KLSUgUmVtb3ZlIGEgc2luZ2xlIHNwYWNlIChhcyB0aGUgZGVsaW1pdGVyIHRva2VuIHRvIHRoZSBtYWNybyBjYWxsKS4KLXtcb2JleXNwYWNlcyAlCi0gXGdkZWZccGFyc2VhcmdkaXNjYXJkc3BhY2Uge1xmdXR1cmVsZXRcdGVtcFxwYXJzZWFyZ3h9fQotCi17XG9iZXlsaW5lcyAlCi0gIFxnZGVmXHBhcnNlYXJnbGluZSMxXl5NeyUKLSAgICBcZW5kZ3JvdXAgJSBFbmQgb2YgdGhlIGdyb3VwIHN0YXJ0ZWQgaW4gXHBhcnNlYXJnLgotICAgICUKLSAgICAlIEZpcnN0IHJlbW92ZSBhbnkgQGMgY29tbWVudCwgdGhlbiBhbnkgQGNvbW1lbnQuCi0gICAgJSBSZXN1bHQgb2YgZWFjaCBtYWNybyBpcyBwdXQgaW4gXHRva3MwLgotICAgIFxhcmdyZW1vdmVjICMxXGNccmVsYXggJQotICAgIFxleHBhbmRhZnRlclxhcmdyZW1vdmVjb21tZW50IFx0aGVcdG9rczAgXGNvbW1lbnRccmVsYXggJQotICAgICUKLSAgICAlIENhbGwgdGhlIGNhbGxlcidzIG1hY3JvLCBzYXZlZCBhcyBcbmV4dCBpbiBccGFyc2VhcmcuCi0gICAgXGV4cGFuZGFmdGVyXG5leHRcZXhwYW5kYWZ0ZXJ7XHRoZVx0b2tzMH0lCi0gIH0lCi19Ci0KLSUgU2luY2UgYWxsIFxjeyxvbW1lbnR9IGRvZXMgaXMgdGhyb3cgYXdheSB0aGUgYXJndW1lbnQsIHdlIGNhbiBsZXQgVGVYCi0lIGRvIHRoYXQgZm9yIHVzLiAgVGhlIFxyZWxheCBoZXJlIGlzIG1hdGNoZWQgYnkgdGhlIFxyZWxheCBpbiB0aGUgY2FsbAotJSBpbiBccGFyc2VhcmdsaW5lOyBpdCBjb3VsZCBiZSBtb3JlIG9yIGxlc3MgYW55dGhpbmcsIGl0cyBwdXJwb3NlIGlzCi0lIGp1c3QgdG8gZGVsaW1pdCB0aGUgYXJndW1lbnQgdG8gdGhlIFxjLgotXGRlZlxhcmdyZW1vdmVjIzFcYyMyXHJlbGF4e1x0b2tzMCA9IHsjMX19Ci1cZGVmXGFyZ3JlbW92ZWNvbW1lbnQjMVxjb21tZW50IzJccmVsYXh7XHRva3MwID0geyMxfX0KLQotJSBcYXJncmVtb3ZlY3ssb21tZW50fSBtaWdodCBsZWF2ZSB1cyB3aXRoIHRyYWlsaW5nIHNwYWNlcywgdGhvdWdoOyBlLmcuLAotJSAgICBAZW5kIGl0ZW1pemUgIEBjIGZvbwotJSB3aWxsIGhhdmUgdHdvIGFjdGl2ZSBzcGFjZXMgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQgd2l0aCB0aGUKLSUgYGl0ZW1pemUnLiAgSGVyZSB3ZSByZW1vdmUgYWxsIGFjdGl2ZSBzcGFjZXMgZnJvbSAjMSwgYW5kIGFzc2lnbiB0aGUKLSUgcmVzdWx0IHRvIFx0b2tzMC4KLSUKLSUgVGhpcyBsb3NlcyBpZiB0aGVyZSBhcmUgYW55ICpvdGhlciogYWN0aXZlIGNoYXJhY3RlcnMgYmVzaWRlcyBzcGFjZXMKLSUgaW4gdGhlIGFyZ3VtZW50IC0tIF8gXiArLCBmb3IgZXhhbXBsZSAtLSBzaW5jZSB0aGV5IGdldCBleHBhbmRlZC4KLSUgRm9ydHVuYXRlbHksIFRleGluZm8gZG9lcyBub3QgZGVmaW5lIGFueSBzdWNoIGNvbW1hbmRzLiAgKElmIGl0IGV2ZXIKLSUgZG9lcywgdGhlIGNhdGNvZGUgb2YgdGhlIGNoYXJhY3RlcnMgaW4gcXVlc3Rpb253aWxsIGhhdmUgdG8gYmUgY2hhbmdlZAotJSBoZXJlLikgIEJ1dCB0aGlzIG1lYW5zIHdlIGNhbm5vdCBjYWxsIFxyZW1vdmVhY3RpdmVzcGFjZXMgYXMgcGFydCBvZgotJSBcYXJncmVtb3ZlY3ssb21tZW50fSwgc2luY2UgQGMgdXNlcyBccGFyc2VhcmcsIGFuZCB0aHVzIHRoZSBhcmd1bWVudAotJSB0aGF0IFxwYXJzZWFyZyBnZXRzIG1pZ2h0IHdlbGwgaGF2ZSBhbnkgY2hhcmFjdGVyIGF0IGFsbCBpbiBpdC4KLSUKLVxkZWZccmVtb3ZlYWN0aXZlc3BhY2VzIzF7JQotICBcYmVnaW5ncm91cAotICAgIFxpZ25vcmVhY3RpdmVzcGFjZXMKLSAgICBcZWRlZlx0ZW1weyMxfSUKLSAgICBcZ2xvYmFsXHRva3MwID0gXGV4cGFuZGFmdGVye1x0ZW1wfSUKLSAgXGVuZGdyb3VwCi19Ci0KLSUgQ2hhbmdlIHRoZSBhY3RpdmUgc3BhY2UgdG8gZXhwYW5kIHRvIG5vdGhpbmcuCi0lCi1cYmVnaW5ncm91cAotICBcb2JleXNwYWNlcwotICBcZ2RlZlxpZ25vcmVhY3RpdmVzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cZW1wdHl9Ci1cZW5kZ3JvdXAKLQotCi1cZGVmXGZsdXNoY3J7XGlmeFxwYXJcbGlzcHBhciBcZGVmXG5leHQjIzF7fVxlbHNlIFxsZXRcbmV4dD1ccmVsYXggXGZpIFxuZXh0fQotCi0lJSBUaGVzZSBhcmUgdXNlZCB0byBrZWVwIEBiZWdpbi9AZW5kIGxldmVscyBmcm9tIHJ1bm5pbmcgYXdheQotJSUgQ2FsbCBcaW5FTlYgd2l0aGluIGVudmlyb25tZW50cyAoYWZ0ZXIgYSBcYmVnaW5ncm91cCkKLVxuZXdpZlxpZkVOViBcRU5WZmFsc2UgXGRlZlxpbkVOVntcaWZFTlZccmVsYXhcZWxzZVxFTlZ0cnVlXGZpfQotXGRlZlxFTlZjaGVja3slCi1caWZFTlZcZXJybWVzc2FnZXtTdGlsbCB3aXRoaW4gYW4gZW52aXJvbm1lbnQ7IHByZXNzIFJFVFVSTiB0byBjb250aW51ZX0KLVxlbmRncm91cFxmaX0gJSBUaGlzIGlzIG5vdCBwZXJmZWN0LCBidXQgaXQgc2hvdWxkIHJlZHVjZSBsb3NzYWdlCi0KLSUgQGJlZ2luIGZvbyAgaXMgdGhlIHNhbWUgYXMgQGZvbywgZm9yIG5vdy4KLVxuZXdoZWxwXEVNc2ltcGxle1ByZXNzIFJFVFVSTiB0byBjb250aW51ZS59Ci0KLVxvdXRlclxkZWZcYmVnaW57XHBhcnNlYXJnXGJlZ2lueHh4fQotCi1cZGVmXGJlZ2lueHh4ICMxeyUKLVxleHBhbmRhZnRlclxpZnhcY3NuYW1lICMxXGVuZGNzbmFtZVxyZWxheAote1xlcnJoZWxwPVxFTXNpbXBsZSBcZXJybWVzc2FnZXtVbmRlZmluZWQgY29tbWFuZCBAYmVnaW4gIzF9fVxlbHNlCi1cY3NuYW1lICMxXGVuZGNzbmFtZVxmaX0KLQotJSBAZW5kIGZvbyBleGVjdXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBcRWZvby4KLSUKLVxkZWZcZW5ke1xwYXJzZWFyZ1xlbmR4eHh9Ci1cZGVmXGVuZHh4eCAjMXslCi0gIFxyZW1vdmVhY3RpdmVzcGFjZXN7IzF9JQotICBcZWRlZlxlbmR0aGluZ3tcdGhlXHRva3MwfSUKLSAgJQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBFXGVuZHRoaW5nXGVuZGNzbmFtZVxyZWxheAotICAgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFxlbmR0aGluZ1xlbmRjc25hbWVccmVsYXgKLSAgICAgICUgVGhlcmUncyBubyBcZm9vLCBpLmUuLCBubyBgYGVudmlyb25tZW50JycgZm9vLgotICAgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKLSAgICAgIFxlcnJtZXNzYWdle1VuZGVmaW5lZCBjb21tYW5kIGBAZW5kIFxlbmR0aGluZyd9JQotICAgIFxlbHNlCi0gICAgICBcdW5tYXRjaGVkZW5kZXJyb3JcZW5kdGhpbmcKLSAgICBcZmkKLSAgXGVsc2UKLSAgICAlIEV2ZXJ5dGhpbmcncyBvazsgdGhlIHJpZ2h0IGVudmlyb25tZW50IGhhcyBiZWVuIHN0YXJ0ZWQuCi0gICAgXGNzbmFtZSBFXGVuZHRoaW5nXGVuZGNzbmFtZQotICBcZmkKLX0KLQotJSBUaGVyZSBpcyBhbiBlbnZpcm9ubWVudCAjMSwgYnV0IGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQuICBHaXZlIGFuIGVycm9yLgotJQotXGRlZlx1bm1hdGNoZWRlbmRlcnJvciMxeyUKLSAgXGVycmhlbHAgPSBcRU1zaW1wbGUKLSAgXGVycm1lc3NhZ2V7VGhpcyBgQGVuZCAjMScgZG9lc24ndCBoYXZlIGEgbWF0Y2hpbmcgYEAjMSd9JQotfQotCi0lIERlZmluZSB0aGUgY29udHJvbCBzZXF1ZW5jZSBcRSMxIHRvIGdpdmUgYW4gdW5tYXRjaGVkIEBlbmQgZXJyb3IuCi0lCi1cZGVmXGRlZmluZXVubWF0Y2hlZGVuZCMxeyUKLSAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgRSMxXGVuZGNzbmFtZXtcdW5tYXRjaGVkZW5kZXJyb3J7IzF9fSUKLX0KLQotCi0lIFNpbmdsZS1zcGFjaW5nIGlzIGRvbmUgYnkgdmFyaW91cyBlbnZpcm9ubWVudHMgKHNwZWNpZmljYWxseSwgaW4KLSUgXG5vbmZpbGxzdGFydCBhbmQgXHF1b3RhdGlvbnMpLgotXG5ld3NraXBcc2luZ2xlc3BhY2Vza2lwIFxzaW5nbGVzcGFjZXNraXAgPSAxMi41cHQKLVxkZWZcc2luZ2xlc3BhY2V7JQotICAlIFdoeSB3YXMgdGhpcyBrZXJuIGhlcmU/ICBJdCBtZXNzZXMgdXAgZXF1YWxpemluZyBzcGFjZSBhYm92ZSBhbmQgYmVsb3cKLSAgJSBlbnZpcm9ubWVudHMuICAtLWthcmwsIDZtYXk5MwotICAle1xhZHZhbmNlIFxiYXNlbGluZXNraXAgYnkgLVxzaW5nbGVzcGFjZXNraXAKLSAgJVxrZXJuIFxiYXNlbGluZXNraXB9JQotICBcc2V0bGVhZGluZyBcc2luZ2xlc3BhY2Vza2lwCi19Ci0KLSUlIFNpbXBsZSBzaW5nbGUtY2hhcmFjdGVyIEAgY29tbWFuZHMKLQotJSBAQCBwcmludHMgYW4gQAotJSBLbHVkZ2UgdGhpcyB1bnRpbCB0aGUgZm9udHMgYXJlIHJpZ2h0IChncnIpLgotXGRlZlxAe3tcdHRcY2hhcjY0fX0KLQotJSBUaGlzIGlzIHR1cm5lZCBvZmYgYmVjYXVzZSBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZAotJSBhbmQgeW91IGNhbiB1c2UgQHd7Li4ufSBhcm91bmQgYSBxdW90ZSB0byBzdXBwcmVzcyBsaWdhdHVyZXMuCi0lJSBEZWZpbmUgQGAgYW5kIEAnIHRvIGJlIHRoZSBzYW1lIGFzIGAgYW5kICcKLSUlIGJ1dCBzdXBwcmVzc2luZyBsaWdhdHVyZXMuCi0lXGRlZlxge3tgfX0KLSVcZGVmXCd7eyd9fQotCi0lIFVzZWQgdG8gZ2VuZXJhdGUgcXVvdGVkIGJyYWNlcy4KLVxkZWZcbXlsYnJhY2Uge3tcdHRcY2hhcjEyM319Ci1cZGVmXG15cmJyYWNlIHt7XHR0XGNoYXIxMjV9fQotXGxldFx7PVxteWxicmFjZQotXGxldFx9PVxteXJicmFjZQotXGJlZ2luZ3JvdXAKLSAgJSBEZWZpbml0aW9ucyB0byBwcm9kdWNlIGFjdHVhbCBceyAmIFx9IGNvbW1hbmQgaW4gYW4gaW5kZXguCi0gIFxjYXRjb2RlYFx7ID0gMTIgXGNhdGNvZGVgXH0gPSAxMgotICBcY2F0Y29kZWBcWyA9IDEgXGNhdGNvZGVgXF0gPSAyCi0gIFxjYXRjb2RlYFxAID0gMCBcY2F0Y29kZWBcXCA9IDEyCi0gIEBnZGVmQGxicmFjZWNtZFtce10lCi0gIEBnZGVmQHJicmFjZWNtZFtcfV0lCi1AZW5kZ3JvdXAKLQotJSBBY2NlbnRzOiBALCBAZG90YWNjZW50IEByaW5nYWNjZW50IEB1YmFyYWNjZW50IEB1ZG90YWNjZW50Ci0lIE90aGVycyBhcmUgZGVmaW5lZCBieSBwbGFpbiBUZVg6IEBgIEAnIEAiIEBeIEB+IEA9IEB2IEBILgotXGxldFwsID0gXGMKLVxsZXRcZG90YWNjZW50ID0gXC4KLVxkZWZccmluZ2FjY2VudCMxe3tcYWNjZW50MjMgIzF9fQotXGxldFx0aWVhY2NlbnQgPSBcdAotXGxldFx1YmFyYWNjZW50ID0gXGIKLVxsZXRcdWRvdGFjY2VudCA9IFxkCi0KLSUgT3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzOiBAcXVlc3Rpb25kb3duIEBleGNsYW1kb3duCi0lIFBsYWluIFRlWCBkZWZpbmVzOiBAQUEgQEFFIEBPIEBPRSBATCAoYW5kIGxvd2VyY2FzZSB2ZXJzaW9ucykgQHNzLgotXGRlZlxxdWVzdGlvbmRvd257P2B9Ci1cZGVmXGV4Y2xhbWRvd257IWB9Ci0KLSUgRG90bGVzcyBpIGFuZCBkb3RsZXNzIGosIHVzZWQgZm9yIGFjY2VudHMuCi1cZGVmXGltYWNyb3tpfQotXGRlZlxqbWFjcm97an0KLVxkZWZcZG90bGVzcyMxeyUKLSAgXGRlZlx0ZW1weyMxfSUKLSAgXGlmeFx0ZW1wXGltYWNybyBccHRleGkKLSAgXGVsc2VcaWZ4XHRlbXBcam1hY3JvIFxqCi0gIFxlbHNlIFxlcnJtZXNzYWdle0Bkb3RsZXNzIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBpIG9yIGp9JQotICBcZmlcZmkKLX0KLQotJSBCZSBzdXJlIHdlJ3JlIGluIGhvcml6b250YWwgbW9kZSB3aGVuIGRvaW5nIGEgdGllLCBzaW5jZSB3ZSBtYWtlIHNwYWNlCi0lIGVxdWl2YWxlbnQgdG8gdGhpcyBpbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50cy4gT3RoZXJ3aXNlLCBhIHNwYWNlCi0lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpbGwgc3RhcnQgd2l0aCBccGVuYWx0eSAtLSBhbmQKLSUgc2luY2UgXHBlbmFsdHkgaXMgdmFsaWQgaW4gdmVydGljYWwgbW9kZSwgd2UnZCBlbmQgdXAgcHV0dGluZyB0aGUKLSUgcGVuYWx0eSBvbiB0aGUgdmVydGljYWwgbGlzdCBpbnN0ZWFkIG9mIGluIHRoZSBuZXcgcGFyYWdyYXBoLgote1xjYXRjb2RlYEAgPSAxMQotICUgQXZvaWQgdXNpbmcgXEBNIGRpcmVjdGx5LCBiZWNhdXNlIHRoYXQgY2F1c2VzIHRyb3VibGUKLSAlIGlmIHRoZSBkZWZpbml0aW9uIGlzIHdyaXR0ZW4gaW50byBhbiBpbmRleCBmaWxlLgotIFxnbG9iYWxcbGV0XHRpZXBlbmFsdHkgPSBcQE0KLSBcZ2RlZlx0aWV7XGxlYXZldm1vZGVccGVuYWx0eVx0aWVwZW5hbHR5XCB9Ci19Ci0KLSUgQDogZm9yY2VzIG5vcm1hbCBzaXplIHdoaXRlc3BhY2UgZm9sbG93aW5nLgotXGRlZlw6e1xzcGFjZWZhY3Rvcj0xMDAwIH0KLQotJSBAKiBmb3JjZXMgYSBsaW5lIGJyZWFrLgotXGRlZlwqe1xoZmlsXGJyZWFrXGhib3h7fVxpZ25vcmVzcGFjZXN9Ci0KLSUgQC4gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHBlcmlvZC4KLVxkZWZcLnsuXHNwYWNlZmFjdG9yPTMwMDAgfQotCi0lIEAhIGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBiYW5nLgotXGRlZlwheyFcc3BhY2VmYWN0b3I9MzAwMCB9Ci0KLSUgQD8gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHF1ZXJ5LgotXGRlZlw/ez9cc3BhY2VmYWN0b3I9MzAwMCB9Ci0KLSUgQHcgcHJldmVudHMgYSB3b3JkIGJyZWFrLiAgV2l0aG91dCB0aGUgXGxlYXZldm1vZGUsIEB3IGF0IHRoZQotJSBiZWdpbm5pbmcgb2YgYSBwYXJhZ3JhcGgsIHdoZW4gVGVYIGlzIHN0aWxsIGluIHZlcnRpY2FsIG1vZGUsIHdvdWxkCi0lIHByb2R1Y2UgYSB3aG9sZSBsaW5lIG9mIG91dHB1dCBpbnN0ZWFkIG9mIHN0YXJ0aW5nIHRoZSBwYXJhZ3JhcGguCi1cZGVmXHcjMXtcbGVhdmV2bW9kZVxoYm94eyMxfX0KLQotJSBAZ3JvdXAgLi4uIEBlbmQgZ3JvdXAgZm9yY2VzIC4uLiB0byBiZSBhbGwgb24gb25lIHBhZ2UsIGJ5IGVuY2xvc2luZwotJSBpdCBpbiBhIFRlWCB2Ym94LiAgV2UgdXNlIFx2dG9wIGluc3RlYWQgb2YgXHZib3ggdG8gY29uc3RydWN0IHRoZSBib3gKLSUgdG8ga2VlcCBpdHMgaGVpZ2h0IHRoYXQgb2YgYSBub3JtYWwgbGluZS4gIEFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yCi0lIFx0b3Bza2lwIChwLjExNCBvZiB0aGUgVGVYYm9vayksIHRoZSBnbHVlIGluc2VydGVkIGlzCi0lIG1heCAoXHRvcHNraXAgLSBcaHQgKGZpcnN0IGl0ZW0pLCAwKS4gIElmIHRoYXQgaGVpZ2h0IGlzIGxhcmdlLAotJSB0aGVyZWZvcmUsIG5vIGdsdWUgaXMgaW5zZXJ0ZWQsIGFuZCB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgaGVhZGxpbmUgYW5kCi0lIHRoZSB0ZXh0IGlzIHNtYWxsLCB3aGljaCBsb29rcyBiYWQuCi0lCi1cZGVmXGdyb3Vwe1xiZWdpbmdyb3VwCi0gIFxpZm51bVxjYXRjb2RlMTM9XGFjdGl2ZSBcZWxzZQotICAgIFxlcnJoZWxwID0gXGdyb3VwaW52YWxpZGhlbHAKLSAgICBcZXJybWVzc2FnZXtAZ3JvdXAgaW52YWxpZCBpbiBjb250ZXh0IHdoZXJlIGZpbGxpbmcgaXMgZW5hYmxlZH0lCi0gIFxmaQotICAlCi0gICUgVGhlIFx2dG9wIHdlIHN0YXJ0IGJlbG93IHByb2R1Y2VzIGEgYm94IHdpdGggbm9ybWFsIGhlaWdodCBhbmQgbGFyZ2UKLSAgJSBkZXB0aDsgdGh1cywgVGVYIHB1dHMgXGJhc2VsaW5lc2tpcCBnbHVlIGJlZm9yZSBpdCwgYW5kICh3aGVuIHRoZQotICAlIG5leHQgbGluZSBvZiB0ZXh0IGlzIGRvbmUpIFxsaW5lc2tpcCBnbHVlIGFmdGVyIGl0LiAgKFNlZSBwLjgyIG9mCi0gICUgdGhlIFRlWGJvb2suKSAgVGh1cywgc3BhY2UgYmVsb3cgaXMgbm90IHF1aXRlIGVxdWFsIHRvIHNwYWNlCi0gICUgYWJvdmUuICBCdXQgaXQncyBwcmV0dHkgY2xvc2UuCi0gIFxkZWZcRWdyb3VweyUKLSAgICBcZWdyb3VwICAgICAgICAgICAlIEVuZCB0aGUgXHZ0b3AuCi0gICAgXGVuZGdyb3VwICAgICAgICAgJSBFbmQgdGhlIFxncm91cC4KLSAgfSUKLSAgJQotICBcdnRvcFxiZ3JvdXAKLSAgICAlIFdlIGhhdmUgdG8gcHV0IGEgc3RydXQgb24gdGhlIGxhc3QgbGluZSBpbiBjYXNlIHRoZSBAZ3JvdXAgaXMgaW4KLSAgICAlIHRoZSBtaWRzdCBvZiBhbiBleGFtcGxlLCByYXRoZXIgdGhhbiBjb21wbGV0ZWx5IGVuY2xvc2luZyBpdC4KLSAgICAlIE90aGVyd2lzZSwgdGhlIGludGVybGluZSBzcGFjZSBiZXR3ZWVuIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGdyb3VwCi0gICAgJSBhbmQgdGhlIGZpcnN0IGxpbmUgYWZ0ZXJ3YXJkcyBpcyB0b28gc21hbGwuICBCdXQgd2UgY2FuJ3QgcHV0IHRoZQotICAgICUgc3RydXQgaW4gXEVncm91cCwgc2luY2UgdGhlcmUgaXQgd291bGQgYmUgb24gYSBsaW5lIGJ5IGl0c2VsZi4KLSAgICAlIEhlbmNlIHRoaXMganVzdCBpbnNlcnRzIGEgc3RydXQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUuCi0gICAgXGV2ZXJ5cGFyID0ge1xzdHJ1dH0lCi0gICAgJQotICAgICUgU2luY2Ugd2UgaGF2ZSBhIHN0cnV0IG9uIGV2ZXJ5IGxpbmUsIHdlIGRvbid0IG5lZWQgYW55IG9mIFRlWCdzCi0gICAgJSBub3JtYWwgaW50ZXJsaW5lIHNwYWNpbmcuCi0gICAgXG9mZmludGVybGluZXNraXAKLSAgICAlCi0gICAgJSBPSywgYnV0IG5vdyB3ZSBoYXZlIHRvIGRvIHNvbWV0aGluZyBhYm91dCBibGFuawotICAgICUgbGluZXMgaW4gdGhlIGlucHV0IGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzLCB3aGljaCBub3JtYWxseQotICAgICUganVzdCB0dXJuIGludG8gXGxpc3BwYXIsIHdoaWNoIHdpbGwgaW5zZXJ0IG5vIHNwYWNlIG5vdyB0aGF0IHdlJ3ZlCi0gICAgJSB0dXJuZWQgb2ZmIHRoZSBpbnRlcmxpbmUgc3BhY2UuICBTaW1wbGVzdCBpcyB0byBtYWtlIHRoZW0gYmUgYW4KLSAgICAlIGVtcHR5IHBhcmFncmFwaC4KLSAgICBcaWZ4XHBhclxsaXNwcGFyCi0gICAgICBcZWRlZlxwYXJ7XGxlYXZldm1vZGUgXHBhcn0lCi0gICAgICAlCi0gICAgICAlIFJlc2V0IF5eTSdzIGRlZmluaXRpb24gdG8gbmV3IGRlZmluaXRpb24gb2YgXHBhci4KLSAgICAgIFxvYmV5bGluZXMKLSAgICBcZmkKLSAgICAlCi0gICAgJSBEbyBAY29tbWVudCBzaW5jZSB3ZSBhcmUgY2FsbGVkIGluc2lkZSBhbiBlbnZpcm9ubWVudCBzdWNoIGFzCi0gICAgJSBAZXhhbXBsZSwgd2hlcmUgZWFjaCBlbmQtb2YtbGluZSBpbiB0aGUgaW5wdXQgY2F1c2VzIGFuCi0gICAgJSBlbmQtb2YtbGluZSBpbiB0aGUgb3V0cHV0LiAgV2UgZG9uJ3Qgd2FudCB0aGUgZW5kLW9mLWxpbmUgYWZ0ZXIKLSAgICAlIHRoZSBgQGdyb3VwJyB0byBwdXQgZXh0cmEgc3BhY2UgaW4gdGhlIG91dHB1dC4gIFNpbmNlIEBncm91cAotICAgICUgc2hvdWxkIGFwcGVhciBvbiBhIGxpbmUgYnkgaXRzZWxmIChhY2NvcmRpbmcgdG8gdGhlIFRleGluZm8KLSAgICAlIG1hbnVhbCksIHdlIGRvbid0IHdvcnJ5IGFib3V0IGVhdGluZyBhbnkgdXNlciB0ZXh0LgotICAgIFxjb21tZW50Ci19Ci0lCi0lIFRlWCBwdXRzIGluIGFuIFxlc2NhcGVjaGFyIChpLmUuLCBgQCcpIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlbHAKLSUgbWVzc2FnZSwgc28gdGhpcyBlbmRzIHVwIHByaW50aW5nIGBAZ3JvdXAgY2FuIG9ubHkgLi4uJy4KLSUKLVxuZXdoZWxwXGdyb3VwaW52YWxpZGhlbHB7JQotZ3JvdXAgY2FuIG9ubHkgYmUgdXNlZCBpbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZXhhbXBsZSxeXkolCi13aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQgcHJvZHVjZXMgYSBsaW5lIG9mIG91dHB1dC59Ci0KLSUgQG5lZWQgc3BhY2UtaW4tbWlscwotJSBmb3JjZXMgYSBwYWdlIGJyZWFrIGlmIHRoZXJlIGlzIG5vdCBzcGFjZS1pbi1taWxzIHJlbWFpbmluZy4KLQotXG5ld2RpbWVuXG1pbCAgXG1pbD0wLjAwMWluCi0KLVxkZWZcbmVlZHtccGFyc2VhcmdcbmVlZHh9Ci0KLSUgT2xkIGRlZmluaXRpb24tLWRpZG4ndCB3b3JrLgotJVxkZWZcbmVlZHggIzF7XHBhciAlCi0lJSBUaGlzIG1ldGhvZCB0cmllcyB0byBtYWtlIFRlWCBicmVhayB0aGUgcGFnZSBuYXR1cmFsbHkKLSUlIGlmIHRoZSBkZXB0aCBvZiB0aGUgYm94IGRvZXMgbm90IGZpdC4KLSV7XGJhc2VsaW5lc2tpcD0wcHQlCi0lXHZ0b3AgdG8gIzFcbWlse1x2ZmlsfVxrZXJuIC0jMVxtaWxcbm9icmVhawotJVxwcmV2ZGVwdGg9LTEwMDBwdAotJX19Ci0KLVxkZWZcbmVlZHgjMXslCi0gICUgR28gaW50byB2ZXJ0aWNhbCBtb2RlLCBzbyB3ZSBkb24ndCBtYWtlIGEgYmlnIGJveCBpbiB0aGUgbWlkZGxlIG9mIGEKLSAgJSBwYXJhZ3JhcGguCi0gIFxwYXIKLSAgJQotICAlIERvbid0IGFkZCBhbnkgbGVhZGluZyBiZWZvcmUgb3VyIGJpZyBlbXB0eSBib3gsIGJ1dCBhbGxvdyBhIHBhZ2UKLSAgJSBicmVhaywgc2luY2UgdGhlIGJlc3QgYnJlYWsgbWlnaHQgYmUgcmlnaHQgaGVyZS4KLSAgXGFsbG93YnJlYWsKLSAgXG5vaW50ZXJsaW5lc2tpcAotICBcdnRvcCB0byAjMVxtaWx7XHZmaWx9JQotICAlCi0gICUgVGVYIGRvZXMgbm90IGV2ZW4gY29uc2lkZXIgcGFnZSBicmVha3MgaWYgYSBwZW5hbHR5IGFkZGVkIHRvIHRoZQotICAlIG1haW4gdmVydGljYWwgbGlzdCBpcyAxMDAwMCBvciBtb3JlLiAgQnV0IGluIG9yZGVyIHRvIHNlZSBpZiB0aGUKLSAgJSBlbXB0eSBib3ggd2UganVzdCBhZGRlZCBmaXRzIG9uIHRoZSBwYWdlLCB3ZSBtdXN0IG1ha2UgaXQgY29uc2lkZXIKLSAgJSBwYWdlIGJyZWFrcy4gIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBkb24ndCB3YW50IHRvIGFjdHVhbGx5IGJyZWFrIHRoZQotICAlIHBhZ2UgYWZ0ZXIgdGhlIGVtcHR5IGJveC4gIFNvIHdlIHVzZSBhIHBlbmFsdHkgb2YgOTk5OS4KLSAgJQotICAlIFRoZXJlIGlzIGFuIGV4dHJlbWVseSBzbWFsbCBjaGFuY2UgdGhhdCBUZVggd2lsbCBhY3R1YWxseSBicmVhayB0aGUKLSAgJSBwYWdlIGF0IHRoaXMgXHBlbmFsdHksIGlmIHRoZXJlIGFyZSBubyBvdGhlciBmZWFzaWJsZSBicmVha3BvaW50cyBpbgotICAlIHNpZ2h0LiAgKElmIHRoZSB1c2VyIGlzIHVzaW5nIGxvdHMgb2YgYmlnIEBncm91cCBjb21tYW5kcywgd2hpY2gKLSAgJSBhbG1vc3QtYnV0LW5vdC1xdWl0ZSBmaWxsIHVwIGEgcGFnZSwgVGVYIHdpbGwgaGF2ZSBhIGhhcmQgdGltZSBkb2luZwotICAlIGdvb2QgcGFnZSBicmVha2luZywgZm9yIGV4YW1wbGUuKSAgSG93ZXZlciwgSSBjb3VsZCBub3QgY29uc3RydWN0IGFuCi0gICUgZXhhbXBsZSB3aGVyZSBhIHBhZ2UgYnJva2UgYXQgdGhpcyBccGVuYWx0eTsgaWYgaXQgaGFwcGVucyBpbiBhIHJlYWwKLSAgJSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gcmVjb25zaWRlciBvdXIgc3RyYXRlZ3kuCi0gIFxwZW5hbHR5OTk5OQotICAlCi0gICUgQmFjayB1cCBieSB0aGUgc2l6ZSBvZiB0aGUgYm94LCB3aGV0aGVyIHdlIGRpZCBhIHBhZ2UgYnJlYWsgb3Igbm90LgotICBca2VybiAtIzFcbWlsCi0gICUKLSAgJSBEbyBub3QgYWxsb3cgYSBwYWdlIGJyZWFrIHJpZ2h0IGFmdGVyIHRoaXMga2Vybi4KLSAgXG5vYnJlYWsKLX0KLQotJSBAYnIgICBmb3JjZXMgcGFyYWdyYXBoIGJyZWFrCi0KLVxsZXRcYnIgPSBccGFyCi0KLSUgQGRvdHN7fSBvdXRwdXQgYW4gZWxsaXBzaXMgdXNpbmcgdGhlIGN1cnJlbnQgZm9udC4KLSUgV2UgZG8gLjVlbSBwZXIgcGVyaW9kIHNvIHRoYXQgaXQgaGFzIHRoZSBzYW1lIHNwYWNpbmcgaW4gYSB0eXBld3JpdGVyCi0lIGZvbnQgYXMgdGhyZWUgYWN0dWFsIHBlcmlvZCBjaGFyYWN0ZXJzLgotJQotXGRlZlxkb3RzeyUKLSAgXGxlYXZldm1vZGUKLSAgXGhib3ggdG8gMS41ZW17JQotICAgIFxoc2tpcCAwcHQgcGx1cyAwLjI1ZmlsIG1pbnVzIDAuMjVmaWwKLSAgICAuXGhzcy5caHNzLiUKLSAgICBcaHNraXAgMHB0IHBsdXMgMC41ZmlsIG1pbnVzIDAuNWZpbAotICB9JQotfQotCi0lIEBlbmRkb3Rze30gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIGVsbGlwc2lzLgotJSAKLVxkZWZcZW5kZG90c3slCi0gIFxsZWF2ZXZtb2RlCi0gIFxoYm94IHRvIDJlbXslCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuMjVmaWwgbWludXMgMC4yNWZpbAotICAgIC5caHNzLlxoc3MuXGhzcy4lCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuNWZpbCBtaW51cyAwLjVmaWwKLSAgfSUKLSAgXHNwYWNlZmFjdG9yPTMwMDAKLX0KLQotCi0lIEBwYWdlICAgIGZvcmNlcyB0aGUgc3RhcnQgb2YgYSBuZXcgcGFnZQotJQotXGRlZlxwYWdle1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KLQotJSBAZXhkZW50IHRleHQuLi4uCi0lIG91dHB1dHMgdGV4dCBvbiBzZXBhcmF0ZSBsaW5lIGluIHJvbWFuIGZvbnQsIHN0YXJ0aW5nIGF0IHN0YW5kYXJkIHBhZ2UgbWFyZ2luCi0KLSUgVGhpcyByZWNvcmRzIHRoZSBhbW91bnQgb2YgaW5kZW50IGluIHRoZSBpbm5lcm1vc3QgZW52aXJvbm1lbnQuCi0lIFRoYXQncyBob3cgbXVjaCBcZXhkZW50IHNob3VsZCB0YWtlIG91dC4KLVxuZXdza2lwXGV4ZGVudGFtb3VudAotCi0lIFRoaXMgZGVmbiBpcyB1c2VkIGluc2lkZSBmaWxsIGVudmlyb25tZW50cyBzdWNoIGFzIEBkZWZ1bi4KLVxkZWZcZXhkZW50e1xwYXJzZWFyZ1xleGRlbnR5eXl9Ci1cZGVmXGV4ZGVudHl5eSAjMXt7XGhmaWxcYnJlYWtcaGJveHtca2VybiAtXGV4ZGVudGFtb3VudHtccm0jMX19XGhmaWxcYnJlYWt9fQotCi0lIFRoaXMgZGVmbiBpcyB1c2VkIGluc2lkZSBub2ZpbGwgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGV4YW1wbGUuCi1cZGVmXG5vZmlsbGV4ZGVudHtccGFyc2Vhcmdcbm9maWxsZXhkZW50eXl5fQotXGRlZlxub2ZpbGxleGRlbnR5eXkgIzF7e1xhZHZhbmNlIFxsZWZ0c2tpcCBieSAtXGV4ZGVudGFtb3VudAotXGxlZnRsaW5le1xoc2tpcFxsZWZ0c2tpcHtccm0jMX19fX0KLQotJSBAaW5tYXJnaW57VEVYVH0gcHV0cyBURVhUIGluIHRoZSBtYXJnaW4gbmV4dCB0byB0aGUgY3VycmVudCBwYXJhZ3JhcGguCi0KLVxkZWZcaW5tYXJnaW4jMXslCi1cc3RydXRcdmFkanVzdHtcbm9icmVha1xrZXJuLVxzdHJ1dGRlcHRoCi0gIFx2dG9wIHRvIFxzdHJ1dGRlcHRoe1xiYXNlbGluZXNraXBcc3RydXRkZXB0aFx2c3MKLSAgXGxsYXB7XHJpZ2h0c2tpcD1caW5tYXJnaW5zcGFjaW5nIFx2Ym94e1xub2luZGVudCAjMX19XG51bGx9fX0KLVxuZXdza2lwXGlubWFyZ2luc3BhY2luZyBcaW5tYXJnaW5zcGFjaW5nPTFjbQotXGRlZlxzdHJ1dGRlcHRoe1xkcFxzdHJ1dGJveH0KLQotJVxoYm94e3tccm0jMX19XGhmaWxcYnJlYWt9fQotCi0lIEBpbmNsdWRlIGZpbGUgICAgaW5zZXJ0IHRleHQgb2YgdGhhdCBmaWxlIGFzIGlucHV0LgotJSBBbGxvdyBub3JtYWwgY2hhcmFjdGVycyB0aGF0ICB3ZSBtYWtlIGFjdGl2ZSBpbiB0aGUgYXJndW1lbnQgKGEgZmlsZSBuYW1lKS4KLVxkZWZcaW5jbHVkZXtcYmVnaW5ncm91cAotICBcY2F0Y29kZWBcXD0xMgotICBcY2F0Y29kZWB+PTEyCi0gIFxjYXRjb2RlYF49MTIKLSAgXGNhdGNvZGVgXz0xMgotICBcY2F0Y29kZWB8PTEyCi0gIFxjYXRjb2RlYDw9MTIKLSAgXGNhdGNvZGVgPj0xMgotICBcY2F0Y29kZWArPTEyCi0gIFxwYXJzZWFyZ1xpbmNsdWRlenp6fQotJSBSZXN0b3JlIGFjdGl2ZSBjaGFycyBmb3IgaW5jbHVkZWQgZmlsZS4KLVxkZWZcaW5jbHVkZXp6eiMxe1xlbmRncm91cFxiZWdpbmdyb3VwCi0gICUgUmVhZCB0aGUgaW5jbHVkZWQgZmlsZSBpbiBhIGdyb3VwIHNvIG5lc3RlZCBAaW5jbHVkZSdzIHdvcmsuCi0gIFxkZWZcdGhpc2ZpbGV7IzF9JQotICBcaW5wdXRcdGhpc2ZpbGUKLVxlbmRncm91cH0KLQotXGRlZlx0aGlzZmlsZXt9Ci0KLSUgQGNlbnRlciBsaW5lICAgb3V0cHV0cyB0aGF0IGxpbmUsIGNlbnRlcmVkCi0KLVxkZWZcY2VudGVye1xwYXJzZWFyZ1xjZW50ZXJ6enp9Ci1cZGVmXGNlbnRlcnp6eiAjMXt7XGFkdmFuY2VcaHNpemUgYnkgLVxsZWZ0c2tpcAotXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKLVxjZW50ZXJsaW5leyMxfX19Ci0KLSUgQHNwIG4gICBvdXRwdXRzIG4gbGluZXMgb2YgdmVydGljYWwgc3BhY2UKLQotXGRlZlxzcHtccGFyc2Vhcmdcc3B4eHh9Ci1cZGVmXHNweHh4ICMxe1x2c2tpcCAjMVxiYXNlbGluZXNraXB9Ci0KLSUgQGNvbW1lbnQgLi4ubGluZSB3aGljaCBpcyBpZ25vcmVkLi4uCi0lIEBjIGlzIHRoZSBzYW1lIGFzIEBjb21tZW50Ci0lIEBpZ25vcmUgLi4uIEBlbmQgaWdub3JlICBpcyBhbm90aGVyIHdheSB0byB3cml0ZSBhIGNvbW1lbnQKLQotXGRlZlxjb21tZW50e1xiZWdpbmdyb3VwIFxjYXRjb2RlYFxeXk09XG90aGVyJQotXGNhdGNvZGVgXEA9XG90aGVyIFxjYXRjb2RlYFx7PVxvdGhlciBcY2F0Y29kZWBcfT1cb3RoZXIlCi1cY29tbWVudHh4eH0KLXtcY2F0Y29kZWBcXl5NPVxvdGhlciBcZ2RlZlxjb21tZW50eHh4IzFeXk17XGVuZGdyb3VwfX0KLQotXGxldFxjPVxjb21tZW50Ci0KLSUgQHBhcmFncmFwaGluZGVudCAgaXMgZGVmaW5lZCBmb3IgdGhlIEluZm8gZm9ybWF0dGluZyBjb21tYW5kcyBvbmx5LgotXGxldFxwYXJhZ3JhcGhpbmRlbnQ9XGNvbW1lbnQKLQotJSBQcmV2ZW50IGVycm9ycyBmb3Igc2VjdGlvbiBjb21tYW5kcy4KLSUgVXNlZCBpbiBAaWdub3JlIGFuZCBpbiBmYWlsaW5nIGNvbmRpdGlvbmFscy4KLVxkZWZcaWdub3Jlc2VjdGlvbnN7JQotXGxldFxjaGFwdGVyPVxyZWxheAotXGxldFx1bm51bWJlcmVkPVxyZWxheAotXGxldFx0b3A9XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzZWM9XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzZWN0aW9uPVxyZWxheAotXGxldFx1bm51bWJlcmVkc3Vic2VjPVxyZWxheAotXGxldFx1bm51bWJlcmVkc3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHN1YnN1YnNlYz1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHN1YnN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XHNlY3Rpb249XHJlbGF4Ci1cbGV0XHN1YnNlYz1ccmVsYXgKLVxsZXRcc3Vic3Vic2VjPVxyZWxheAotXGxldFxzdWJzZWN0aW9uPVxyZWxheAotXGxldFxzdWJzdWJzZWN0aW9uPVxyZWxheAotXGxldFxhcHBlbmRpeD1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzZWM9XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c2VjdGlvbj1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzdWJzZWM9XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzdWJzdWJzZWM9XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c3Vic3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcY29udGVudHM9XHJlbGF4Ci1cbGV0XHNtYWxsYm9vaz1ccmVsYXgKLVxsZXRcdGl0bGVwYWdlPVxyZWxheAotfQotCi0lIFVzZWQgaW4gbmVzdGVkIGNvbmRpdGlvbmFscywgd2hlcmUgd2UgaGF2ZSB0byBwYXJzZSB0aGUgVGV4aW5mbyBzb3VyY2UKLSUgYW5kIHNvIHdhbnQgdG8gdHVybiBvZmYgbW9zdCBjb21tYW5kcywgaW4gY2FzZSB0aGV5IGFyZSB1c2VkCi0lIGluY29ycmVjdGx5LgotJQotXGRlZlxpZ25vcmVtb3JlY29tbWFuZHN7JQotICBcbGV0XGRlZmNvZGVpbmRleCA9IFxyZWxheAotICBcbGV0XGRlZmN2ID0gXHJlbGF4Ci0gIFxsZXRcZGVmZm4gPSBccmVsYXgKLSAgXGxldFxkZWZmbnggPSBccmVsYXgKLSAgXGxldFxkZWZpbmRleCA9IFxyZWxheAotICBcbGV0XGRlZml2YXIgPSBccmVsYXgKLSAgXGxldFxkZWZtYWMgPSBccmVsYXgKLSAgXGxldFxkZWZtZXRob2QgPSBccmVsYXgKLSAgXGxldFxkZWZvcCA9IFxyZWxheAotICBcbGV0XGRlZm9wdCA9IFxyZWxheAotICBcbGV0XGRlZnNwZWMgPSBccmVsYXgKLSAgXGxldFxkZWZ0cCA9IFxyZWxheAotICBcbGV0XGRlZnR5cGVmbiA9IFxyZWxheAotICBcbGV0XGRlZnR5cGVmdW4gPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBldmFyID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHlwZXZyID0gXHJlbGF4Ci0gIFxsZXRcZGVmdW4gPSBccmVsYXgKLSAgXGxldFxkZWZ2YXIgPSBccmVsYXgKLSAgXGxldFxkZWZ2ciA9IFxyZWxheAotICBcbGV0XHJlZiA9IFxyZWxheAotICBcbGV0XHhyZWYgPSBccmVsYXgKLSAgXGxldFxwcmludGluZGV4ID0gXHJlbGF4Ci0gIFxsZXRccHhyZWYgPSBccmVsYXgKLSAgXGxldFxzZXR0aXRsZSA9IFxyZWxheAotICBcbGV0XHNldGNoYXB0ZXJuZXdwYWdlID0gXHJlbGF4Ci0gIFxsZXRcc2V0Y2hhcHRlcnN0eWxlID0gXHJlbGF4Ci0gIFxsZXRcZXZlcnloZWFkaW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlbmhlYWRpbmcgPSBccmVsYXgKLSAgXGxldFxvZGRoZWFkaW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlcnlmb290aW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlbmZvb3RpbmcgPSBccmVsYXgKLSAgXGxldFxvZGRmb290aW5nID0gXHJlbGF4Ci0gIFxsZXRcaGVhZGluZ3MgPSBccmVsYXgKLSAgXGxldFxpbmNsdWRlID0gXHJlbGF4Ci0gIFxsZXRcbG93ZXJzZWN0aW9ucyA9IFxyZWxheAotICBcbGV0XGRvd24gPSBccmVsYXgKLSAgXGxldFxyYWlzZXNlY3Rpb25zID0gXHJlbGF4Ci0gIFxsZXRcdXAgPSBccmVsYXgKLSAgXGxldFxzZXQgPSBccmVsYXgKLSAgXGxldFxjbGVhciA9IFxyZWxheAotICBcbGV0XGl0ZW0gPSBccmVsYXgKLX0KLQotJSBJZ25vcmUgQGlnbm9yZSAuLi4gQGVuZCBpZ25vcmUuCi0lCi1cZGVmXGlnbm9yZXtcZG9pZ25vcmV7aWdub3JlfX0KLQotJSBJZ25vcmUgQGlmaW5mbywgQGlmaHRtbCwgQGlmbm90dGV4LCBAaHRtbCwgQG1lbnUsIGFuZCBAZGlyZW50cnkgdGV4dC4KLSUKLVxkZWZcaWZpbmZve1xkb2lnbm9yZXtpZmluZm99fQotXGRlZlxpZmh0bWx7XGRvaWdub3Jle2lmaHRtbH19Ci1cZGVmXGlmbm90dGV4e1xkb2lnbm9yZXtpZm5vdHRleH19Ci1cZGVmXGh0bWx7XGRvaWdub3Jle2h0bWx9fQotXGRlZlxtZW51e1xkb2lnbm9yZXttZW51fX0KLVxkZWZcZGlyZW50cnl7XGRvaWdub3Jle2RpcmVudHJ5fX0KLQotJSBAZGlyY2F0ZWdvcnkgQ0FURUdPUlkgIC0tIHNwZWNpZnkgYSBjYXRlZ29yeSBvZiB0aGUgZGlyIGZpbGUKLSUgd2hpY2ggdGhpcyBmaWxlIHNob3VsZCBiZWxvbmcgdG8uICBJZ25vcmUgdGhpcyBpbiBUZVguCi1cbGV0XGRpcmNhdGVnb3J5ID0gXGNvbW1lbnQKLQotJSBJZ25vcmUgdGV4dCB1bnRpbCBhIGxpbmUgYEBlbmQgIzEnLgotJQotXGRlZlxkb2lnbm9yZSMxe1xiZWdpbmdyb3VwCi0gICUgRG9uJ3QgY29tcGxhaW4gYWJvdXQgY29udHJvbCBzZXF1ZW5jZXMgd2UgaGF2ZSBkZWNsYXJlZCBcb3V0ZXIuCi0gIFxpZ25vcmVzZWN0aW9ucwotICAlCi0gICUgRGVmaW5lIGEgY29tbWFuZCB0byBzd2FsbG93IHRleHQgdW50aWwgd2UgcmVhY2ggYEBlbmQgIzEnLgotICAlIFRoaXMgQCBpcyBhIGNhdGNvZGUgMTIgdG9rZW4gKHRoYXQgaXMgdGhlIG5vcm1hbCBjYXRjb2RlIG9mIEAgaW4KLSAgJSB0aGlzIHRleGluZm8udGV4IGZpbGUpLiAgV2UgY2hhbmdlIHRoZSBjYXRjb2RlIG9mIEAgYmVsb3cgdG8gbWF0Y2guCi0gIFxsb25nXGRlZlxkb2lnbm9yZXRleHQjIzFAZW5kICMxe1xlbmRkb2lnbm9yZX0lCi0gICUKLSAgJSBNYWtlIHN1cmUgdGhhdCBzcGFjZXMgdHVybiBpbnRvIHRva2VucyB0aGF0IG1hdGNoIHdoYXQgXGRvaWdub3JldGV4dCB3YW50cy4KLSAgXGNhdGNvZGUzMiA9IDEwCi0gICUKLSAgJSBJZ25vcmUgYnJhY2VzLCB0b28sIHNvIG1pc21hdGNoZWQgYnJhY2VzIGRvbid0IGNhdXNlIHRyb3VibGUuCi0gIFxjYXRjb2RlYFx7ID0gOQotICBcY2F0Y29kZWBcfSA9IDkKLSAgJQotICAlIFdlIG11c3Qgbm90IGhhdmUgQGMgaW50ZXJwcmV0ZWQgYXMgYSBjb250cm9sIHNlcXVlbmNlLgotICBcY2F0Y29kZWBcQCA9IDEyCi0gICUKLSAgJSBNYWtlIHRoZSBsZXR0ZXIgYyBhIGNvbW1lbnQgY2hhcmFjdGVyIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUKLSAgJSB3aWxsIGJlIGlnbm9yZWQuIFRoaXMgd2F5LCB0aGUgZG9jdW1lbnQgY2FuIGhhdmUgKGZvciBleGFtcGxlKQotICAlICAgQGMgQGVuZCBpZmluZm8KLSAgJSBhbmQgdGhlIEBlbmQgaWZpbmZvIHdpbGwgYmUgcHJvcGVybHkgaWdub3JlZC4KLSAgJSAoV2UndmUganVzdCBjaGFuZ2VkIEAgdG8gY2F0Y29kZSAxMi4pCi0gIFxjYXRjb2RlYFxjID0gMTQKLSAgJQotICAlIEFuZCBub3cgZXhwYW5kIHRoYXQgY29tbWFuZC4KLSAgXGRvaWdub3JldGV4dAotfQotCi0lIFdoYXQgd2UgZG8gdG8gZmluaXNoIG9mZiBpZ25vcmVkIHRleHQuCi0lCi1cZGVmXGVuZGRvaWdub3Jle1xlbmRncm91cFxpZ25vcmVzcGFjZXN9JQotCi1cbmV3aWZcaWZ3YXJuZWRvYnNcd2FybmVkb2JzZmFsc2UKLVxkZWZcb2JzdGV4d2FybnslCi0gIFxpZndhcm5lZG9ic1xyZWxheFxlbHNlCi0gICUgV2UgbmVlZCB0byB3YXJuIGZvbGtzIHRoYXQgdGhleSBtYXkgaGF2ZSB0cm91YmxlIHdpdGggVGVYIDMuMC4KLSAgJSBUaGlzIHVzZXMgXGltbWVkaWF0ZVx3cml0ZTE2IHJhdGhlciB0aGFuIFxtZXNzYWdlIHRvIGdldCBuZXdsaW5lcy4KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7fQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsqKipXQVJOSU5HKioqIGZvciB1c2VycyBvZiBVbml4IFRlWCAzLjAhfQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntUaGlzIG1hbnVhbCB0cmlwcyBhIGJ1ZyBpbiBUZVggdmVyc2lvbiAzLjAgKHRleCBoYW5ncykufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntJZiB5b3UgYXJlIHJ1bm5pbmcgYW5vdGhlciB2ZXJzaW9uIG9mIFRlWCwgcmVsYXgufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntJZiB5b3UgYXJlIHJ1bm5pbmcgVW5peCBUZVggMy4wLCBraWxsIHRoaXMgVGVYIHByb2Nlc3MufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsgIFRoZW4gdXBncmFkZSB5b3VyIFRlWCBpbnN0YWxsYXRpb24gaWYgeW91IGNhbi59Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2eyAgKFNlZSBmdHA6Ly9mdHAuZ251LmFpLm1pdC5lZHUvcHViL2dudS9UZVguUkVBRE1FLil9Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e0lmIHlvdSBhcmUgc3R1Y2sgd2l0aCB2ZXJzaW9uIDMuMCwgcnVuIHRoZX0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICBzY3JpcHQgYGB0ZXgzcGF0Y2gnJyBmcm9tIHRoZSBUZXhpbmZvIGRpc3RyaWJ1dGlvbn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICB0byB1c2UgYSB3b3JrYXJvdW5kLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7fQotICAgIFxnbG9iYWxcd2FybmVkb2JzdHJ1ZQotICAgIFxmaQotfQotCi0lICoqSW4gVGVYIDMuMCwgc2V0dGluZyB0ZXh0IGluIFxudWxsZm9udCBoYW5ncyB0ZXguICBGb3IgYQotJSB3b3JrYXJvdW5kICh3aGljaCByZXF1aXJlcyB0aGUgZmlsZSBgYGR1bW15LnRmbScnIHRvIGJlIGluc3RhbGxlZCksCi0lIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmU6Ci0lJSUlJVxmb250XG51bGxmb250PWR1bW15XGxldFxvYnN0ZXh3YXJuPVxyZWxheAotCi0lIElnbm9yZSB0ZXh0LCBleGNlcHQgdGhhdCB3ZSBrZWVwIHRyYWNrIG9mIGNvbmRpdGlvbmFsIGNvbW1hbmRzIGZvcgotJSBwdXJwb3NlcyBvZiBuZXN0aW5nLCB1cCB0byBhbiBgQGVuZCAjMScgY29tbWFuZC4KLSUKLVxkZWZcbmVzdGVkaWdub3JlIzF7JQotICBcb2JzdGV4d2FybgotICAlIFdlIG11c3QgYWN0dWFsbHkgZXhwYW5kIHRoZSBpZ25vcmVkIHRleHQgdG8gbG9vayBmb3IgdGhlIEBlbmQKLSAgJSBjb21tYW5kLCBzbyB0aGF0IG5lc3RlZCBpZ25vcmUgY29uc3RydWN0cyB3b3JrLiAgVGh1cywgd2UgcHV0IHRoZQotICAlIHRleHQgaW50byBhIFx2Ym94IGFuZCB0aGVuIGRvIG5vdGhpbmcgd2l0aCB0aGUgcmVzdWx0LiAgVG8gbWluaW1pemUKLSAgJSB0aGUgY2hhbmdlIG9mIG1lbW9yeSBvdmVyZmxvdywgd2UgZm9sbG93IHRoZSBhcHByb2FjaCBvdXRsaW5lZCBvbgotICAlIHBhZ2UgNDAxIG9mIHRoZSBUZVhib29rOiBtYWtlIHRoZSBjdXJyZW50IGZvbnQgYmUgYSBkdW1teSBmb250LgotICAlCi0gIFxzZXRib3gwID0gXHZib3hcYmdyb3VwCi0gICAgJSBEb24ndCBjb21wbGFpbiBhYm91dCBjb250cm9sIHNlcXVlbmNlcyB3ZSBoYXZlIGRlY2xhcmVkIFxvdXRlci4KLSAgICBcaWdub3Jlc2VjdGlvbnMKLSAgICAlCi0gICAgJSBEZWZpbmUgYEBlbmQgIzEnIHRvIGVuZCB0aGUgYm94LCB3aGljaCB3aWxsIGluIHR1cm4gdW5kZWZpbmUgdGhlCi0gICAgJSBAZW5kIGNvbW1hbmQgYWdhaW4uCi0gICAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgRSMxXGVuZGNzbmFtZXtcZWdyb3VwXGlnbm9yZXNwYWNlc30lCi0gICAgJQotICAgICUgV2UgYXJlIGdvaW5nIHRvIGJlIHBhcnNpbmcgVGV4aW5mbyBjb21tYW5kcy4gIE1vc3QgY2F1c2Ugbm8KLSAgICAlIHRyb3VibGUgd2hlbiB0aGV5IGFyZSB1c2VkIGluY29ycmVjdGx5LCBidXQgc29tZSBjb21tYW5kcyBkbwotICAgICUgY29tcGxpY2F0ZWQgYXJndW1lbnQgcGFyc2luZyBvciBvdGhlcndpc2UgZ2V0IGNvbmZ1c2VkLCBzbyB3ZQotICAgICUgdW5kZWZpbmUgdGhlbS4KLSAgICAlCi0gICAgJSBXZSBjYW4ndCBkbyBhbnl0aGluZyBhYm91dCBzdHJheSBALXNpZ25zLCB1bmZvcnR1bmF0ZWx5OwotICAgICUgdGhleSdsbCBwcm9kdWNlIGB1bmRlZmluZWQgY29udHJvbCBzZXF1ZW5jZScgZXJyb3JzLgotICAgIFxpZ25vcmVtb3JlY29tbWFuZHMKLSAgICAlCi0gICAgJSBTZXQgdGhlIGN1cnJlbnQgZm9udCB0byBiZSBcbnVsbGZvbnQsIGEgVGVYIHByaW1pdGl2ZSwgYW5kIGRlZmluZQotICAgICUgYWxsIHRoZSBmb250IGNvbW1hbmRzIHRvIGFsc28gdXNlIFxudWxsZm9udC4gIFdlIGRvbid0IHVzZQotICAgICUgZHVtbXkudGZtLCBhcyBzdWdnZXN0ZWQgaW4gdGhlIFRlWGJvb2ssIGJlY2F1c2Ugbm90IGFsbCBzaXRlcwotICAgICUgbWlnaHQgaGF2ZSB0aGF0IGluc3RhbGxlZC4gIFRoZXJlZm9yZSwgbWF0aCBtb2RlIHdpbGwgc3RpbGwKLSAgICAlIHByb2R1Y2Ugb3V0cHV0LCBidXQgdGhhdCBzaG91bGQgYmUgYW4gZXh0cmVtZWx5IHNtYWxsIGFtb3VudCBvZgotICAgICUgc3R1ZmYgY29tcGFyZWQgdG8gdGhlIG1haW4gaW5wdXQuCi0gICAgJQotICAgIFxudWxsZm9udAotICAgIFxsZXRcdGVucm0gPSBcbnVsbGZvbnQgIFxsZXRcdGVuaXQgPSBcbnVsbGZvbnQgIFxsZXRcdGVuc2wgPSBcbnVsbGZvbnQKLSAgICBcbGV0XHRlbmJmID0gXG51bGxmb250ICBcbGV0XHRlbnR0ID0gXG51bGxmb250ICBcbGV0XHNtYWxsY2FwcyA9IFxudWxsZm9udAotICAgIFxsZXRcdGVuc2YgPSBcbnVsbGZvbnQKLSAgICAlIFNpbWlsYXJseSBmb3IgaW5kZXggZm9udHMgKG1vc3RseSBmb3IgdGhlaXIgdXNlIGluCi0gICAgJSBzbWFsbGV4YW1wbGUpCi0gICAgXGxldFxpbmRybSA9IFxudWxsZm9udCAgXGxldFxpbmRpdCA9IFxudWxsZm9udCAgXGxldFxpbmRzbCA9IFxudWxsZm9udAotICAgIFxsZXRcaW5kYmYgPSBcbnVsbGZvbnQgIFxsZXRcaW5kdHQgPSBcbnVsbGZvbnQgIFxsZXRcaW5kc2MgPSBcbnVsbGZvbnQKLSAgICBcbGV0XGluZHNmID0gXG51bGxmb250Ci0gICAgJQotICAgICUgRG9uJ3QgY29tcGxhaW4gd2hlbiBjaGFyYWN0ZXJzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGZvbnRzLgotICAgIFx0cmFjaW5nbG9zdGNoYXJzID0gMAotICAgICUKLSAgICAlIERvbid0IGJvdGhlciB0byBkbyBzcGFjZSBmYWN0b3IgY2FsY3VsYXRpb25zLgotICAgIFxmcmVuY2hzcGFjaW5nCi0gICAgJQotICAgICUgRG9uJ3QgcmVwb3J0IHVuZGVyZnVsbCBoYm94ZXMuCi0gICAgXGhiYWRuZXNzID0gMTAwMDAKLSAgICAlCi0gICAgJSBEbyBtaW5pbWFsIGxpbmUtYnJlYWtpbmcuCi0gICAgXHByZXRvbGVyYW5jZSA9IDEwMDAwCi0gICAgJQotICAgICUgRG8gbm90IGV4ZWN1dGUgaW5zdHJ1Y3Rpb25zIGluIEB0ZXgKLSAgICBcZGVmXHRleHtcZG9pZ25vcmV7dGV4fX0lCi0gICAgJSBEbyBub3QgZXhlY3V0ZSBtYWNybyBkZWZpbml0aW9ucy4KLSAgICAlIGBjJyBpcyBhIGNvbW1lbnQgY2hhcmFjdGVyLCBzbyB0aGUgd29yZCBgbWFjcm8nIHdpbGwgZ2V0IGN1dCBvZmYuCi0gICAgXGRlZlxtYWNyb3tcZG9pZ25vcmV7bWF9fSUKLX0KLQotJSBAc2V0IFZBUiBzZXRzIHRoZSB2YXJpYWJsZSBWQVIgdG8gYW4gZW1wdHkgdmFsdWUuCi0lIEBzZXQgVkFSIFJFU1QtT0YtTElORSBzZXRzIFZBUiB0byB0aGUgdmFsdWUgUkVTVC1PRi1MSU5FLgotJQotJSBTaW5jZSB3ZSB3YW50IHRvIHNlcGFyYXRlIFZBUiBmcm9tIFJFU1QtT0YtTElORSAod2hpY2ggbWlnaHQgYmUKLSUgZW1wdHkpLCB3ZSBjYW4ndCBqdXN0IHVzZSBccGFyc2Vhcmc7IHdlIGhhdmUgdG8gaW5zZXJ0IGEgc3BhY2Ugb2Ygb3VyCi0lIG93biB0byBkZWxpbWl0IHRoZSByZXN0IG9mIHRoZSBsaW5lLCBhbmQgdGhlbiB0YWtlIGl0IG91dCBhZ2FpbiBpZiB3ZQotJSBkaWRuJ3QgbmVlZCBpdC4gIE1ha2Ugc3VyZSB0aGUgY2F0Y29kZSBvZiBzcGFjZSBpcyBjb3JyZWN0IHRvIGF2b2lkCi0lIGxvc2luZyBpbnNpZGUgQGV4YW1wbGUsIGZvciBpbnN0YW5jZS4KLSUKLVxkZWZcc2V0e1xiZWdpbmdyb3VwXGNhdGNvZGVgID0xMAotICBcY2F0Y29kZWBcLT0xMiBcY2F0Y29kZWBcXz0xMiAlIEFsbG93IC0gYW5kIF8gaW4gVkFSLgotICBccGFyc2Vhcmdcc2V0eHh4fQotXGRlZlxzZXR4eHgjMXtcc2V0eXl5IzEgXGVuZHNldHl5eX0KLVxkZWZcc2V0eXl5IzEgIzJcZW5kc2V0eXl5eyUKLSAgXGRlZlx0ZW1weyMyfSUKLSAgXGlmeFx0ZW1wXGVtcHR5IFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVQjMVxlbmRjc25hbWUgPSBcZW1wdHkKLSAgXGVsc2UgXHNldHp6ensjMX0jMlxlbmRzZXR6enogJSBSZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlIFxzZXR4eHggaW5zZXJ0ZWQuCi0gIFxmaQotICBcZW5kZ3JvdXAKLX0KLSUgQ2FuJ3QgdXNlIFx4ZGVmIHRvIHByZS1leHBhbmQgIzIgYW5kIHNhdmUgc29tZSB0aW1lLCBzaW5jZSBcdGVtcCBvcgotJSBcbmV4dCBvciBvdGhlciBjb250cm9sIHNlcXVlbmNlcyB0aGF0IHdlJ3ZlIGRlZmluZWQgbWlnaHQgZ2V0IHVzIGludG8KLSUgYW4gaW5maW5pdGUgbG9vcC4gQ29uc2lkZXIgYEBzZXQgZm9vIEBjaXRle2Jhcn0nLgotXGRlZlxzZXR6enojMSMyIFxlbmRzZXR6enp7XGV4cGFuZGFmdGVyXGdkZWZcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZXsjMn19Ci0KLSUgQGNsZWFyIFZBUiBjbGVhcnMgKGkuZS4sIHVuc2V0cykgdGhlIHZhcmlhYmxlIFZBUi4KLSUKLVxkZWZcY2xlYXJ7XHBhcnNlYXJnXGNsZWFyeHh4fQotXGRlZlxjbGVhcnh4eCMxe1xnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVQjMVxlbmRjc25hbWU9XHJlbGF4fQotCi0lIEB2YWx1ZXtmb299IGdldHMgdGhlIHRleHQgc2F2ZWQgaW4gdmFyaWFibGUgZm9vLgotJQotewotICBcY2F0Y29kZWBcXyA9IFxhY3RpdmUKLSAgJQotICAlIFdlIG1pZ2h0IGVuZCB1cCB3aXRoIGFjdGl2ZSBfIG9yIC0gY2hhcmFjdGVycyBpbiB0aGUgYXJndW1lbnQgaWYKLSAgJSB3ZSdyZSBjYWxsZWQgZnJvbSBAY29kZSwgYXMgQGNvZGV7QHZhbHVle2Zvby1iYXJffX0uICBTbyBcbGV0IGFueQotICAlIHN1Y2ggYWN0aXZlIGNoYXJhY3RlcnMgdG8gdGhlaXIgbm9ybWFsIGVxdWl2YWxlbnRzLgotICBcZ2RlZlx2YWx1ZXtcYmVnaW5ncm91cAotICAgIFxjYXRjb2RlYFwtPTEyIFxjYXRjb2RlYFxfPTEyCi0gICAgXGluZGV4YnJlYWtzIFxsZXRfXG5vcm1hbHVuZGVyc2NvcmUKLSAgICBcdmFsdWV4eHh9Ci19Ci1cZGVmXHZhbHVleHh4IzF7XGV4cGFuZGFibGV2YWx1ZXsjMX1cZW5kZ3JvdXB9Ci0KLSUgV2UgaGF2ZSB0aGlzIHN1YnJvdXRpbmUgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGF0IGxlYXN0IHNvbWUgQHZhbHVlJ3MKLSUgcHJvcGVybHkgaW4gaW5kZXhlcyAod2UgXGxldFx2YWx1ZSB0byB0aGlzIGluIFxpbmRleGR1bW1pZXMpLiAgT25lcwotJSB3aG9zZSBuYW1lcyBjb250YWluIC0gb3IgXyBzdGlsbCB3b24ndCB3b3JrLCBidXQgd2UgY2FuJ3QgZG8gYW55dGhpbmcKLSUgYWJvdXQgdGhhdC4gIFRoZSBjb21tYW5kIGhhcyB0byBiZSBmdWxseSBleHBhbmRhYmxlLCBzaW5jZSB0aGUgcmVzdWx0Ci0lIHdpbmRzIHVwIGluIHRoZSBpbmRleCBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IGlmIHRoZSB2YXJpYWJsZSdzIHZhbHVlCi0lIGNvbnRhaW5zIG90aGVyIFRleGluZm8gY29tbWFuZHMsIGl0J3MgYWxtb3N0IGNlcnRhaW4gaXQgd2lsbCBmYWlsCi0lIChhbHRob3VnaCBwZXJoYXBzIHdlIGNvdWxkIGZpeCB0aGF0IHdpdGggc3VmZmljaWVudCB3b3JrIHRvIGRvIGEKLSUgb25lLWxldmVsIGV4cGFuc2lvbiBvbiB0aGUgcmVzdWx0LCBpbnN0ZWFkIG9mIGNvbXBsZXRlKS4KLSUgCi1cZGVmXGV4cGFuZGFibGV2YWx1ZSMxeyUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lXHJlbGF4Ci0gICAge1tObyB2YWx1ZSBmb3IgYGAjMScnXXZ9JQotICBcZWxzZQotICAgIFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lCi0gIFxmaQotfQotCi0lIEBpZnNldCBWQVIgLi4uIEBlbmQgaWZzZXQgcmVhZHMgdGhlIGAuLi4nIGlmZiBWQVIgaGFzIGJlZW4gZGVmaW5lZAotJSB3aXRoIEBzZXQuCi0lCi1cZGVmXGlmc2V0e1xwYXJzZWFyZ1xpZnNldHh4eH0KLVxkZWZcaWZzZXR4eHggIzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKLSAgICBcZXhwYW5kYWZ0ZXJcaWZzZXRmYWlsCi0gIFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGlmc2V0c3VjY2VlZAotICBcZmkKLX0KLVxkZWZcaWZzZXRzdWNjZWVke1xjb25kaXRpb25hbHN1Y2NlZWR7aWZzZXR9fQotXGRlZlxpZnNldGZhaWx7XG5lc3RlZGlnbm9yZXtpZnNldH19Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmc2V0fQotCi0lIEBpZmNsZWFyIFZBUiAuLi4gQGVuZCBpZmNsZWFyIHJlYWRzIHRoZSBgLi4uJyBpZmYgVkFSIGhhcyBuZXZlciBiZWVuCi0lIGRlZmluZWQgd2l0aCBAc2V0LCBvciBoYXMgYmVlbiB1bmRlZmluZWQgd2l0aCBAY2xlYXIuCi0lCi1cZGVmXGlmY2xlYXJ7XHBhcnNlYXJnXGlmY2xlYXJ4eHh9Ci1cZGVmXGlmY2xlYXJ4eHggIzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKLSAgICBcZXhwYW5kYWZ0ZXJcaWZjbGVhcnN1Y2NlZWQKLSAgXGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcaWZjbGVhcmZhaWwKLSAgXGZpCi19Ci1cZGVmXGlmY2xlYXJzdWNjZWVke1xjb25kaXRpb25hbHN1Y2NlZWR7aWZjbGVhcn19Ci1cZGVmXGlmY2xlYXJmYWlse1xuZXN0ZWRpZ25vcmV7aWZjbGVhcn19Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmY2xlYXJ9Ci0KLSUgQGlmdGV4LCBAaWZub3RodG1sLCBAaWZub3RpbmZvIGFsd2F5cyBzdWNjZWVkOyB3ZSByZWFkIHRoZSB0ZXh0Ci0lIGZvbGxvd2luZywgdGhyb3VnaCB0aGUgZmlyc3QgQGVuZCBpZnRleCAoZXRjLikuICBNYWtlIGBAZW5kIGlmdGV4JwotJSAoZXRjLikgdmFsaWQgb25seSBhZnRlciBhbiBAaWZ0ZXguCi0lCi1cZGVmXGlmdGV4e1xjb25kaXRpb25hbHN1Y2NlZWR7aWZ0ZXh9fQotXGRlZlxpZm5vdGh0bWx7XGNvbmRpdGlvbmFsc3VjY2VlZHtpZm5vdGh0bWx9fQotXGRlZlxpZm5vdGluZm97XGNvbmRpdGlvbmFsc3VjY2VlZHtpZm5vdGluZm99fQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZnRleH0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZub3RodG1sfQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZm5vdGluZm99Ci0KLSUgV2UgY2FuJ3QganVzdCB3YW50IHRvIHN0YXJ0IGEgZ3JvdXAgYXQgQGlmdGV4IChmb3IgZXhhbXBsZSkgYW5kIGVuZCBpdAotJSBhdCBAZW5kIGlmdGV4LCBzaW5jZSB0aGVuIEBzZXQgY29tbWFuZHMgaW5zaWRlIHRoZSBjb25kaXRpb25hbCBoYXZlIG5vCi0lIGVmZmVjdCAodGhleSdkIGdldCByZXZlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBncm91cCkuICBTbyB3ZSBtdXN0Ci0lIGRlZmluZSBcRWlmdGV4IHRvIHJlZGVmaW5lIGl0c2VsZiB0byBiZSBpdHMgcHJldmlvdXMgdmFsdWUuICAoV2UgY2FuJ3QKLSUganVzdCBkZWZpbmUgaXQgdG8gZmFpbCBhZ2FpbiB3aXRoIGFuIGBgdW5tYXRjaGVkIGVuZCcnIGVycm9yLCBzaW5jZQotJSB0aGUgQGlmc2V0IG1pZ2h0IGJlIG5lc3RlZC4pCi0lCi1cZGVmXGNvbmRpdGlvbmFsc3VjY2VlZCMxeyUKLSAgXGVkZWZcdGVtcHslCi0gICAgJSBSZW1lbWJlciB0aGUgY3VycmVudCB2YWx1ZSBvZiBcRSMxLgotICAgIFxsZXRcbmVjZXtwcmV2RSMxfSA9IFxuZWNle0UjMX0lCi0gICAgJQotICAgICUgQXQgdGhlIGBAZW5kICMxJywgcmVkZWZpbmUgXEUjMSB0byBiZSBpdHMgcHJldmlvdXMgdmFsdWUuCi0gICAgXGRlZlxuZWNle0UjMX17XGxldFxuZWNle0UjMX0gPSBcbmVjZXtwcmV2RSMxfX0lCi0gIH0lCi0gIFx0ZW1wCi19Ci0KLSUgV2UgbmVlZCB0byBleHBhbmQgbG90cyBvZiBcY3NuYW1lJ3MsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGV4cGFuZCB0aGUKLSUgY29udHJvbCBzZXF1ZW5jZXMgYWZ0ZXIgd2UndmUgY29uc3RydWN0ZWQgdGhlbS4KLSUKLVxkZWZcbmVjZSMxe1xleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWUjMVxlbmRjc25hbWV9Ci0KLSUgQGFzaXMganVzdCB5aWVsZHMgaXRzIGFyZ3VtZW50LiAgVXNlZCB3aXRoIEB0YWJsZSwgZm9yIGV4YW1wbGUuCi0lCi1cZGVmXGFzaXMjMXsjMX0KLQotJSBAbWF0aCBtZWFucyBvdXRwdXQgaW4gbWF0aCBtb2RlLgotJSBXZSBkb24ndCB1c2UgJCdzIGRpcmVjdGx5IGluIHRoZSBkZWZpbml0aW9uIG9mIFxtYXRoIGJlY2F1c2UgY29udHJvbAotJSBzZXF1ZW5jZXMgbGlrZSBcbWF0aCBhcmUgZXhwYW5kZWQgd2hlbiB0aGUgdG9jIGZpbGUgaXMgd3JpdHRlbi4gIFRoZW4sCi0lIHdlIHJlYWQgdGhlIHRvYyBmaWxlIGJhY2ssIHRoZSAkJ3Mgd2lsbCBiZSBub3JtYWwgY2hhcmFjdGVycyAoYXMgdGhleQotJSBzaG91bGQgYmUsIGFjY29yZGluZyB0byB0aGUgZGVmaW5pdGlvbiBvZiBUZXhpbmZvKS4gIFNvIHdlIG11c3QgdXNlIGEKLSUgY29udHJvbCBzZXF1ZW5jZSB0byBzd2l0Y2ggaW50byBhbmQgb3V0IG9mIG1hdGggbW9kZS4KLSUKLSUgVGhpcyBpc24ndCBxdWl0ZSBlbm91Z2ggZm9yIEBtYXRoIHRvIHdvcmsgcHJvcGVybHkgaW4gaW5kaWNlcywgYnV0IGl0Ci0lIHNlZW1zIHVubGlrZWx5IGl0IHdpbGwgZXZlciBiZSBuZWVkZWQgdGhlcmUuCi0lCi1cbGV0XGltcGxpY2l0bWF0aCA9ICQKLVxkZWZcbWF0aCMxe1xpbXBsaWNpdG1hdGggIzFcaW1wbGljaXRtYXRofQotCi0lIEBidWxsZXQgYW5kIEBtaW51cyBuZWVkIHRoZSBzYW1lIHRyZWF0bWVudCBhcyBAbWF0aCwganVzdCBhYm92ZS4KLVxkZWZcYnVsbGV0e1xpbXBsaWNpdG1hdGhccHRleGJ1bGxldFxpbXBsaWNpdG1hdGh9Ci1cZGVmXG1pbnVze1xpbXBsaWNpdG1hdGgtXGltcGxpY2l0bWF0aH0KLQotJSBAcmVmaWxsIGlzIGEgbm8tb3AuCi1cbGV0XHJlZmlsbD1ccmVsYXgKLQotJSBJZiB3b3JraW5nIG9uIGEgbGFyZ2UgZG9jdW1lbnQgaW4gY2hhcHRlcnMsIGl0IGlzIGNvbnZlbmllbnQgdG8KLSUgYmUgYWJsZSB0byBkaXNhYmxlIGluZGV4aW5nLCBjcm9zcy1yZWZlcmVuY2luZywgYW5kIGNvbnRlbnRzLCBmb3IgdGVzdCBydW5zLgotJSBUaGlzIGlzIGRvbmUgd2l0aCBAbm92YWxpZGF0ZSAoYmVmb3JlIEBzZXRmaWxlbmFtZSkuCi0lCi1cbmV3aWZcaWZsaW5rcyBcbGlua3N0cnVlICUgYnkgZGVmYXVsdCB3ZSB3YW50IHRoZSBhdXggZmlsZXMuCi1cbGV0XG5vdmFsaWRhdGUgPSBcbGlua3NmYWxzZQotCi0lIEBzZXRmaWxlbmFtZSBpcyBkb25lIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgdGV4aW5mbyBmaWxlLgotJSBTbyBvcGVuIGhlcmUgdGhlIGZpbGVzIHdlIG5lZWQgdG8gaGF2ZSBvcGVuIHdoaWxlIHJlYWRpbmcgdGhlIGlucHV0LgotJSBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG1ha2UgYSAuZm10IGZpbGUgZm9yIHRleGluZm8uCi1cZGVmXHNldGZpbGVuYW1leyUKLSAgIFxpZmxpbmtzIAotICAgICBccmVhZGF1eGZpbGUKLSAgIFxmaSAlIFxvcGVuaW5kaWNlcyBuZWVkcyB0byBkbyBzb21lIHdvcmsgaW4gYW55IGNhc2UuCi0gICBcb3BlbmluZGljZXMKLSAgIFxmaXhiYWNrc2xhc2ggICUgVHVybiBvZmYgaGFjayB0byBzd2FsbG93IGBcaW5wdXQgdGV4aW5mbycuCi0gICBcZ2xvYmFsXGxldFxzZXRmaWxlbmFtZT1cY29tbWVudCAlIElnbm9yZSBleHRyYSBAc2V0ZmlsZW5hbWUgY21kcy4KLSAgICUKLSAgICUgSWYgdGV4aW5mby5jbmYgaXMgcHJlc2VudCBvbiB0aGUgc3lzdGVtLCByZWFkIGl0LgotICAgJSBVc2VmdWwgZm9yIHNpdGUtd2lkZSBAYWZvdXJwYXBlciwgZXRjLgotICAgJSBKdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUsIGNsb3NlIHRoZSBpbnB1dCBzdHJlYW0gYmVmb3JlIHRoZSBcaW5wdXQuCi0gICBcb3BlbmluIDEgdGV4aW5mby5jbmYKLSAgIFxpZmVvZjEgXGxldFx0ZW1wPVxyZWxheCBcZWxzZSBcZGVmXHRlbXB7XGlucHV0IHRleGluZm8uY25mIH1cZmkKLSAgIFxjbG9zZWluMQotICAgXHRlbXAKLSAgICUKLSAgIFxjb21tZW50ICUgSWdub3JlIHRoZSBhY3R1YWwgZmlsZW5hbWUuCi19Ci0KLSUgQ2FsbGVkIGZyb20gXHNldGZpbGVuYW1lLgotJSAKLVxkZWZcb3BlbmluZGljZXN7JQotICBcbmV3aW5kZXh7Y3B9JQotICBcbmV3Y29kZWluZGV4e2ZufSUKLSAgXG5ld2NvZGVpbmRleHt2cn0lCi0gIFxuZXdjb2RlaW5kZXh7dHB9JQotICBcbmV3Y29kZWluZGV4e2t5fSUKLSAgXG5ld2NvZGVpbmRleHtwZ30lCi19Ci0KLSUgQGJ5ZS4KLVxvdXRlclxkZWZcYnlle1xwYWdlYWxpZ25tYWNyb1x0cmFjaW5nc3RhdHM9MVxwdGV4ZW5kfQotCi0KLVxtZXNzYWdle2ZvbnRzLH0KLSUgRm9udC1jaGFuZ2UgY29tbWFuZHMuCi0KLSUgVGV4aW5mbyBzb3J0IG9mIHN1cHBvcnRzIHRoZSBzYW5zIHNlcmlmIGZvbnQgc3R5bGUsIHdoaWNoIHBsYWluIFRlWCBkb2VzIG5vdC4KLSUgU28gd2Ugc2V0IHVwIGEgXHNmIGFuYWxvZ291cyB0byBwbGFpbidzIFxybSwgZXRjLgotXG5ld2ZhbVxzZmZhbQotXGRlZlxzZntcZmFtPVxzZmZhbSBcdGVuc2Z9Ci1cbGV0XGxpID0gXHNmICUgU29tZXRpbWVzIHdlIGNhbGwgaXQgXGxpLCBub3QgXHNmLgotCi0lIFdlIGRvbid0IG5lZWQgbWF0aCBmb3IgdGhpcyBvbmUuCi1cZGVmXHR0c2x7XHRlbnR0c2x9Ci0KLSUgVXNlIENvbXB1dGVyIE1vZGVybiBmb250cyBhdCBcbWFnc3RlcGhhbGYgKDExcHQpLgotXG5ld2NvdW50XG1haW5tYWdzdGVwCi1cbWFpbm1hZ3N0ZXA9XG1hZ3N0ZXBoYWxmCi0KLSUgU2V0IHRoZSBmb250IG1hY3JvICMxIHRvIHRoZSBmb250IG5hbWVkICMyLCBhZGRpbmcgb24gdGhlCi0lIHNwZWNpZmllZCBmb250IHByZWZpeCAobm9ybWFsbHkgYGNtJykuCi0lICMzIGlzIHRoZSBmb250J3MgZGVzaWduIHNpemUsICM0IGlzIGEgc2NhbGUgZmFjdG9yCi1cZGVmXHNldGZvbnQjMSMyIzMjNHtcZm9udCMxPVxmb250cHJlZml4IzIjMyBzY2FsZWQgIzR9Ci0KLSUgVXNlIGNtIGFzIHRoZSBkZWZhdWx0IGZvbnQgcHJlZml4LgotJSBUbyBzcGVjaWZ5IHRoZSBmb250IHByZWZpeCwgeW91IG11c3QgZGVmaW5lIFxmb250cHJlZml4Ci0lIGJlZm9yZSB5b3UgcmVhZCBpbiB0ZXhpbmZvLnRleC4KLVxpZnhcZm9udHByZWZpeFx1bmRlZmluZWQKLVxkZWZcZm9udHByZWZpeHtjbX0KLVxmaQotJSBTdXBwb3J0IGZvbnQgZmFtaWxpZXMgdGhhdCBkb24ndCB1c2UgdGhlIHNhbWUgbmFtaW5nIHNjaGVtZSBhcyBDTS4KLVxkZWZccm1zaGFwZXtyfQotXGRlZlxybWJzaGFwZXtieH0gICAgICAgICAgICAgICAld2hlcmUgdGhlIG5vcm1hbCBmYWNlIGlzIGJvbGQKLVxkZWZcYmZzaGFwZXtifQotXGRlZlxieHNoYXBle2J4fQotXGRlZlx0dHNoYXBle3R0fQotXGRlZlx0dGJzaGFwZXt0dH0KLVxkZWZcdHRzbHNoYXBle3NsdHR9Ci1cZGVmXGl0c2hhcGV7dGl9Ci1cZGVmXGl0YnNoYXBle2J4dGl9Ci1cZGVmXHNsc2hhcGV7c2x9Ci1cZGVmXHNsYnNoYXBle2J4c2x9Ci1cZGVmXHNmc2hhcGV7c3N9Ci1cZGVmXHNmYnNoYXBle3NzfQotXGRlZlxzY3NoYXBle2NzY30KLVxkZWZcc2Nic2hhcGV7Y3NjfQotCi1caWZ4XGJpZ2dlclxyZWxheAotXGxldFxtYWlubWFnc3RlcD1cbWFnc3RlcDEKLVxzZXRmb250XHRleHRybVxybXNoYXBlezEyfXsxMDAwfQotXHNldGZvbnRcdGV4dHR0XHR0c2hhcGV7MTJ9ezEwMDB9Ci1cZWxzZQotXHNldGZvbnRcdGV4dHJtXHJtc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHR0dFx0dHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cZmkKLSUgSW5zdGVhZCBvZiBjbWIxMCwgeW91IG1hbnkgd2FudCB0byB1c2UgY21ieDEwLgotJSBjbWJ4MTAgaXMgYSBwcmV0dGllciBmb250IG9uIGl0cyBvd24sIGJ1dCBjbWIxMAotJSBsb29rcyBiZXR0ZXIgd2hlbiBlbWJlZGRlZCBpbiBhIGxpbmUgd2l0aCBjbXIxMC4KLVxzZXRmb250XHRleHRiZlxiZnNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0aXRcaXRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHNsXHNsc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRzZlxzZnNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0c2Ncc2NzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHR0c2xcdHRzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cZm9udFx0ZXh0aT1jbW1pMTAgc2NhbGVkIFxtYWlubWFnc3RlcAotXGZvbnRcdGV4dHN5PWNtc3kxMCBzY2FsZWQgXG1haW5tYWdzdGVwCi0KLSUgQSBmZXcgZm9udHMgZm9yIEBkZWZ1biwgZXRjLgotXHNldGZvbnRcZGVmYmZcYnhzaGFwZXsxMH17XG1hZ3N0ZXAxfSAld2FzIDEzMTQKLVxzZXRmb250XGRlZnR0XHR0c2hhcGV7MTB9e1xtYWdzdGVwMX0KLVxkZWZcZGZ7XGxldFx0ZW50dD1cZGVmdHQgXGxldFx0ZW5iZiA9IFxkZWZiZiBcYmZ9Ci0KLSUgRm9udHMgZm9yIGluZGljZXMgYW5kIHNtYWxsIGV4YW1wbGVzICg5cHQpLgotJSBXZSBhY3R1YWxseSB1c2UgdGhlIHNsYW50ZWQgZm9udCByYXRoZXIgdGhhbiB0aGUgaXRhbGljLAotJSBiZWNhdXNlIHRleGluZm8gbm9ybWFsbHkgdXNlcyB0aGUgc2xhbnRlZCBmb250cyBmb3IgdGhhdC4KLSUgRG8gbm90IG1ha2UgbWFueSBmb250IGRpc3RpbmN0aW9ucyBpbiBnZW5lcmFsIGluIHRoZSBpbmRleCwgc2luY2UgdGhleQotJSBhcmVuJ3QgdmVyeSB1c2VmdWwuCi1cc2V0Zm9udFxuaW5ldHRcdHRzaGFwZXs5fXsxMDAwfQotXHNldGZvbnRcbmluZXR0c2xcdHRzbHNoYXBlezEwfXs5MDB9Ci1cc2V0Zm9udFxpbmRybVxybXNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxpbmRpdFxpdHNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxpbmRzbFxzbHNoYXBlezl9ezEwMDB9Ci1cbGV0XGluZHR0PVxuaW5ldHQKLVxsZXRcaW5kdHRzbD1cbmluZXR0c2wKLVxsZXRcaW5kc2Y9XGluZHJtCi1cbGV0XGluZGJmPVxpbmRybQotXHNldGZvbnRcaW5kc2Ncc2NzaGFwZXsxMH17OTAwfQotXGZvbnRcaW5kaT1jbW1pOQotXGZvbnRcaW5kc3k9Y21zeTkKLQotJSBGb250cyBmb3IgdGl0bGUgcGFnZToKLVxzZXRmb250XHRpdGxlcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwM30KLVxzZXRmb250XHRpdGxlaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxlc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxldHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwM30KLVxzZXRmb250XHRpdGxldHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxlc2Zcc2Zic2hhcGV7MTd9e1xtYWdzdGVwMX0KLVxsZXRcdGl0bGViZj1cdGl0bGVybQotXHNldGZvbnRcdGl0bGVzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXA0fQotXGZvbnRcdGl0bGVpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAzCi1cZm9udFx0aXRsZXN5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXA0Ci1cZGVmXGF1dGhvcnJte1xzZWNybX0KLQotJSBDaGFwdGVyIChhbmQgdW5udW1iZXJlZCkgZm9udHMgKDE3LjI4cHQpLgotXHNldGZvbnRcY2hhcHJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxjaGFwaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwM30KLVxzZXRmb250XGNoYXBzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXHNldGZvbnRcY2hhcHR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxjaGFwdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwM30KLVxzZXRmb250XGNoYXBzZlxzZmJzaGFwZXsxN317MTAwMH0KLVxsZXRcY2hhcGJmPVxjaGFwcm0KLVxzZXRmb250XGNoYXBzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXGZvbnRcY2hhcGk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDIKLVxmb250XGNoYXBzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMwotCi0lIFNlY3Rpb24gZm9udHMgKDE0LjRwdCkuCi1cc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXHNldGZvbnRcc2VjaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3NsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXHNldGZvbnRcc2VjdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcDF9Ci1cbGV0XHNlY2JmXHNlY3JtCi1cc2V0Zm9udFxzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAyfQotXGZvbnRcc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMQotXGZvbnRcc2Vjc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDIKLQotJSBcc2V0Zm9udFxzc2Vjcm1cYnhzaGFwZXsxMH17XG1hZ3N0ZXAxfSAgICAlIFRoaXMgc2l6ZSBhbiBmb250IGxvb2tlZCBiYWQuCi0lIFxzZXRmb250XHNzZWNpdFxpdHNoYXBlezEwfXtcbWFnc3RlcDF9ICAgICUgVGhlIGxldHRlcnMgd2VyZSB0b28gY3Jvd2RlZC4KLSUgXHNldGZvbnRcc3NlY3NsXHNsc2hhcGV7MTB9e1xtYWdzdGVwMX0KLSUgXHNldGZvbnRcc3NlY3R0XHR0c2hhcGV7MTB9e1xtYWdzdGVwMX0KLSUgXHNldGZvbnRcc3NlY3NmXHNmc2hhcGV7MTB9e1xtYWdzdGVwMX0KLQotJVxzZXRmb250XHNzZWNybVxiZnNoYXBlezEwfXsxMzE1fSAgICAgICUgTm90ZSB0aGUgdXNlIG9mIGNtYiByYXRoZXIgdGhhbiBjbWJ4LgotJVxzZXRmb250XHNzZWNpdFxpdHNoYXBlezEwfXsxMzE1fSAgICAgICUgQWxzbywgdGhlIHNpemUgaXMgYSBsaXR0bGUgbGFyZ2VyIHRoYW4KLSVcc2V0Zm9udFxzc2Vjc2xcc2xzaGFwZXsxMH17MTMxNX0gICAgICAlIGJlaW5nIHNjYWxlZCBtYWdzdGVwMS4KLSVcc2V0Zm9udFxzc2VjdHRcdHRzaGFwZXsxMH17MTMxNX0KLSVcc2V0Zm9udFxzc2Vjc2Zcc2ZzaGFwZXsxMH17MTMxNX0KLQotJVxsZXRcc3NlY2JmPVxzc2Vjcm0KLQotJSBTdWJzZWN0aW9uIGZvbnRzICgxMy4xNXB0KS4KLVxzZXRmb250XHNzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQotXHNldGZvbnRcc3NlY2l0XGl0YnNoYXBlezEwfXsxMzE1fQotXHNldGZvbnRcc3NlY3NsXHNsYnNoYXBlezEwfXsxMzE1fQotXHNldGZvbnRcc3NlY3R0XHR0YnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Ci1cc2V0Zm9udFxzc2VjdHRzbFx0dHNsc2hhcGV7MTB9ezEzMTV9Ci1cc2V0Zm9udFxzc2Vjc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KLVxsZXRcc3NlY2JmXHNzZWNybQotXHNldGZvbnRcc3NlY3NjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDF9Ci1cZm9udFxzc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwaGFsZgotXGZvbnRcc3NlY3N5PWNtc3kxMCBzY2FsZWQgMTMxNQotJSBUaGUgc21hbGxjYXBzIGFuZCBzeW1ib2wgZm9udHMgc2hvdWxkIGFjdHVhbGx5IGJlIHNjYWxlZCBcbWFnc3RlcDEuNSwKLSUgYnV0IHRoYXQgaXMgbm90IGEgc3RhbmRhcmQgbWFnbmlmaWNhdGlvbi4KLQotJSBJbiBvcmRlciBmb3IgdGhlIGZvbnQgY2hhbmdlcyB0byBhZmZlY3QgbW9zdCBtYXRoIHN5bWJvbHMgYW5kIGxldHRlcnMsCi0lIHdlIGhhdmUgdG8gZGVmaW5lIHRoZSBcdGV4dGZvbnQgb2YgdGhlIHN0YW5kYXJkIGZhbWlsaWVzLiAgU2luY2UKLSUgdGV4aW5mbyBkb2Vzbid0IGFsbG93IGZvciBwcm9kdWNpbmcgc3Vic2NyaXB0cyBhbmQgc3VwZXJzY3JpcHRzLCB3ZQotJSBkb24ndCBib3RoZXIgdG8gcmVzZXQgXHNjcmlwdGZvbnQgYW5kIFxzY3JpcHRzY3JpcHRmb250ICh3aGljaCB3b3VsZAotJSBhbHNvIHJlcXVpcmUgbG9hZGluZyBhIGxvdCBtb3JlIGZvbnRzKS4KLSUKLVxkZWZccmVzZXRtYXRoZm9udHN7JQotICBcdGV4dGZvbnQwID0gXHRlbnJtIFx0ZXh0Zm9udDEgPSBcdGVuaSBcdGV4dGZvbnQyID0gXHRlbnN5Ci0gIFx0ZXh0Zm9udFxpdGZhbSA9IFx0ZW5pdCBcdGV4dGZvbnRcc2xmYW0gPSBcdGVuc2wgXHRleHRmb250XGJmZmFtID0gXHRlbmJmCi0gIFx0ZXh0Zm9udFx0dGZhbSA9IFx0ZW50dCBcdGV4dGZvbnRcc2ZmYW0gPSBcdGVuc2YKLX0KLQotCi0lIFRoZSBmb250LWNoYW5naW5nIGNvbW1hbmRzIHJlZGVmaW5lIHRoZSBtZWFuaW5ncyBvZiBcdGVuU1RZTEUsIGluc3RlYWQKLSUgb2YganVzdCBcU1RZTEUuICBXZSBkbyB0aGlzIHNvIHRoYXQgZm9udCBjaGFuZ2VzIHdpbGwgY29udGludWUgdG8gd29yawotJSBpbiBtYXRoIG1vZGUsIHdoZXJlIGl0IGlzIHRoZSBjdXJyZW50IFxmYW0gdGhhdCBpcyByZWxldmFudCBpbiBtb3N0Ci0lIGNhc2VzLCBub3QgdGhlIGN1cnJlbnQgZm9udC4gIFBsYWluIFRlWCBkb2VzIFxkZWZcYmZ7XGZhbT1cYmZmYW0KLSUgXHRlbmJmfSwgZm9yIGV4YW1wbGUuICBCeSByZWRlZmluaW5nIFx0ZW5iZiwgd2Ugb2J2aWF0ZSB0aGUgbmVlZCB0bwotJSByZWRlZmluZSBcYmYgaXRzZWxmLgotXGRlZlx0ZXh0Zm9udHN7JQotICBcbGV0XHRlbnJtPVx0ZXh0cm0gXGxldFx0ZW5pdD1cdGV4dGl0IFxsZXRcdGVuc2w9XHRleHRzbAotICBcbGV0XHRlbmJmPVx0ZXh0YmYgXGxldFx0ZW50dD1cdGV4dHR0IFxsZXRcc21hbGxjYXBzPVx0ZXh0c2MKLSAgXGxldFx0ZW5zZj1cdGV4dHNmIFxsZXRcdGVuaT1cdGV4dGkgXGxldFx0ZW5zeT1cdGV4dHN5IFxsZXRcdGVudHRzbD1cdGV4dHR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzfQotXGRlZlx0aXRsZWZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cdGl0bGVybSBcbGV0XHRlbml0PVx0aXRsZWl0IFxsZXRcdGVuc2w9XHRpdGxlc2wKLSAgXGxldFx0ZW5iZj1cdGl0bGViZiBcbGV0XHRlbnR0PVx0aXRsZXR0IFxsZXRcc21hbGxjYXBzPVx0aXRsZXNjCi0gIFxsZXRcdGVuc2Y9XHRpdGxlc2YgXGxldFx0ZW5pPVx0aXRsZWkgXGxldFx0ZW5zeT1cdGl0bGVzeQotICBcbGV0XHRlbnR0c2w9XHRpdGxldHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MjVwdH19Ci1cZGVmXHRpdGxlZm9udCMxe3tcdGl0bGVmb250c1xybSAjMX19Ci1cZGVmXGNoYXBmb250c3slCi0gIFxsZXRcdGVucm09XGNoYXBybSBcbGV0XHRlbml0PVxjaGFwaXQgXGxldFx0ZW5zbD1cY2hhcHNsCi0gIFxsZXRcdGVuYmY9XGNoYXBiZiBcbGV0XHRlbnR0PVxjaGFwdHQgXGxldFxzbWFsbGNhcHM9XGNoYXBzYwotICBcbGV0XHRlbnNmPVxjaGFwc2YgXGxldFx0ZW5pPVxjaGFwaSBcbGV0XHRlbnN5PVxjaGFwc3kgXGxldFx0ZW50dHNsPVxjaGFwdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTlwdH19Ci1cZGVmXHNlY2ZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cc2Vjcm0gXGxldFx0ZW5pdD1cc2VjaXQgXGxldFx0ZW5zbD1cc2Vjc2wKLSAgXGxldFx0ZW5iZj1cc2VjYmYgXGxldFx0ZW50dD1cc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNlY3NjCi0gIFxsZXRcdGVuc2Y9XHNlY3NmIFxsZXRcdGVuaT1cc2VjaSBcbGV0XHRlbnN5PVxzZWNzeSBcbGV0XHRlbnR0c2w9XHNlY3R0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE2cHR9fQotXGRlZlxzdWJzZWNmb250c3slCi0gIFxsZXRcdGVucm09XHNzZWNybSBcbGV0XHRlbml0PVxzc2VjaXQgXGxldFx0ZW5zbD1cc3NlY3NsCi0gIFxsZXRcdGVuYmY9XHNzZWNiZiBcbGV0XHRlbnR0PVxzc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNzZWNzYwotICBcbGV0XHRlbnNmPVxzc2Vjc2YgXGxldFx0ZW5pPVxzc2VjaSBcbGV0XHRlbnN5PVxzc2Vjc3kgXGxldFx0ZW50dHNsPVxzc2VjdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTVwdH19Ci1cbGV0XHN1YnN1YnNlY2ZvbnRzID0gXHN1YnNlY2ZvbnRzICUgTWF5YmUgbWFrZSBzc3NlYyBmb250cyBzY2FsZWQgbWFnc3RlcGhhbGY/Ci1cZGVmXGluZGV4Zm9udHN7JQotICBcbGV0XHRlbnJtPVxpbmRybSBcbGV0XHRlbml0PVxpbmRpdCBcbGV0XHRlbnNsPVxpbmRzbAotICBcbGV0XHRlbmJmPVxpbmRiZiBcbGV0XHRlbnR0PVxpbmR0dCBcbGV0XHNtYWxsY2Fwcz1caW5kc2MKLSAgXGxldFx0ZW5zZj1caW5kc2YgXGxldFx0ZW5pPVxpbmRpIFxsZXRcdGVuc3k9XGluZHN5IFxsZXRcdGVudHRzbD1caW5kdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTJwdH19Ci0KLSUgU2V0IHVwIHRoZSBkZWZhdWx0IGZvbnRzLCBzbyB3ZSBjYW4gdXNlIHRoZW0gZm9yIGNyZWF0aW5nIGJveGVzLgotJQotXHRleHRmb250cwotCi0lIERlZmluZSB0aGVzZSBzbyB0aGV5IGNhbiBiZSBlYXNpbHkgY2hhbmdlZCBmb3Igb3RoZXIgZm9udHMuCi1cZGVmXGFuZ2xlbGVmdHskXGxhbmdsZSR9Ci1cZGVmXGFuZ2xlcmlnaHR7JFxyYW5nbGUkfQotCi0lIENvdW50IGRlcHRoIGluIGZvbnQtY2hhbmdlcywgZm9yIGVycm9yIGNoZWNrcwotXG5ld2NvdW50XGZvbnRkZXB0aCBcZm9udGRlcHRoPTAKLQotJSBGb250cyBmb3Igc2hvcnQgdGFibGUgb2YgY29udGVudHMuCi1cc2V0Zm9udFxzaG9ydGNvbnRybVxybXNoYXBlezEyfXsxMDAwfQotXHNldGZvbnRcc2hvcnRjb250YmZcYnhzaGFwZXsxMn17MTAwMH0KLVxzZXRmb250XHNob3J0Y29udHNsXHNsc2hhcGV7MTJ9ezEwMDB9Ci0KLSUlIEFkZCBzY3JpYmUtbGlrZSBmb250IGVudmlyb25tZW50cywgcGx1cyBAbCBmb3IgaW5saW5lIGxpc3AgKHVzdWFsbHkgc2FucwotJSUgc2VyaWYpIGFuZCBAaWkgZm9yIFRlWCBpdGFsaWMKLQotJSBcc21hcnRpdGFsaWN7QVJHfSBvdXRwdXRzIGFyZyBpbiBpdGFsaWNzLCBmb2xsb3dlZCBieSBhbiBpdGFsaWMgY29ycmVjdGlvbgotJSB1bmxlc3MgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgaXMgc3VjaCBhcyBub3QgdG8gbmVlZCBvbmUuCi1cZGVmXHNtYXJ0aXRhbGljeHtcaWZ4XG5leHQsXGVsc2VcaWZ4XG5leHQtXGVsc2VcaWZ4XG5leHQuXGVsc2VcL1xmaVxmaVxmaX0KLVxkZWZcc21hcnRzbGFudGVkIzF7e1xzbCAjMX1cZnV0dXJlbGV0XG5leHRcc21hcnRpdGFsaWN4fQotXGRlZlxzbWFydGl0YWxpYyMxe3tcaXQgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KLQotXGxldFxpPVxzbWFydGl0YWxpYwotXGxldFx2YXI9XHNtYXJ0c2xhbnRlZAotXGxldFxkZm49XHNtYXJ0c2xhbnRlZAotXGxldFxlbXBoPVxzbWFydGl0YWxpYwotXGxldFxjaXRlPVxzbWFydHNsYW50ZWQKLQotXGRlZlxiIzF7e1xiZiAjMX19Ci1cbGV0XHN0cm9uZz1cYgotCi0lIFdlIGNhbid0IGp1c3QgdXNlIFxleGh5cGhlbnBlbmFsdHksIGJlY2F1c2UgdGhhdCBvbmx5IGhhcyBlZmZlY3QgYXQKLSUgdGhlIGVuZCBvZiBhIHBhcmFncmFwaC4gIFJlc3RvcmUgbm9ybWFsIGh5cGhlbmF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlCi0lIGdyb3VwIHdpdGhpbiB3aGljaCBcbm9oeXBoZW5hdGlvbiBpcyBwcmVzdW1hYmx5IGNhbGxlZC4KLSUKLVxkZWZcbm9oeXBoZW5hdGlvbntcaHlwaGVuY2hhclxmb250ID0gLTEgIFxhZnRlcmdyb3VwXHJlc3RvcmVoeXBoZW5hdGlvbn0KLVxkZWZccmVzdG9yZWh5cGhlbmF0aW9ue1xoeXBoZW5jaGFyXGZvbnQgPSBgLSB9Ci0KLVxkZWZcdCMxeyUKLSAge1x0dCBccmF3YmFja3NsYXNoIFxmcmVuY2hzcGFjaW5nICMxfSUKLSAgXG51bGwKLX0KLVxsZXRcdHRmb250PVx0Ci1cZGVmXHNhbXAjMXtgXHRjbG9zZXsjMX0nXG51bGx9Ci1cc2V0Zm9udFxzbWFsbHJtXHJtc2hhcGV7OH17MTAwMH0KLVxmb250XHNtYWxsc3k9Y21zeTkKLVxkZWZca2V5IzF7e1xzbWFsbHJtXHRleHRmb250Mj1cc21hbGxzeSBcbGVhdmV2bW9kZVxoYm94eyUKLSAgXHJhaXNlMC40cHRcaGJveHtcYW5nbGVsZWZ0fVxrZXJuLS4wOGVtXHZ0b3B7JQotICAgIFx2Ym94e1xocnVsZVxrZXJuLTAuNHB0Ci0gICAgIFxoYm94e1xyYWlzZTAuNHB0XGhib3h7XHZwaGFudG9te1xhbmdsZWxlZnR9fSMxfX0lCi0gICAgXGtlcm4tMC40cHRcaHJ1bGV9JQotICBca2Vybi0uMDZlbVxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlcmlnaHR9fX19Ci0lIFRoZSBvbGQgZGVmaW5pdGlvbiwgd2l0aCBubyBsb3plbmdlOgotJVxkZWZca2V5ICMxe3tcdHRzbCBcbm9oeXBoZW5hdGlvbiBcdXBwZXJjYXNleyMxfX1cbnVsbH0KLVxkZWZcY3RybCAjMXt7XHR0IFxyYXdiYWNrc2xhc2ggXGhhdH0jMX0KLQotJSBAZmlsZSwgQG9wdGlvbiBhcmUgdGhlIHNhbWUgYXMgQHNhbXAuCi1cbGV0XGZpbGU9XHNhbXAKLVxsZXRcb3B0aW9uPVxzYW1wCi0KLSUgQGNvZGUgaXMgYSBtb2RpZmljYXRpb24gb2YgQHQsCi0lIHdoaWNoIG1ha2VzIHNwYWNlcyB0aGUgc2FtZSBzaXplIGFzIG5vcm1hbCBpbiB0aGUgc3Vycm91bmRpbmcgdGV4dC4KLVxkZWZcdGNsb3NlIzF7JQotICB7JQotICAgICUgQ2hhbmdlIG5vcm1hbCBpbnRlcndvcmQgc3BhY2UgdG8gYmUgc2FtZSBhcyBmb3IgdGhlIGN1cnJlbnQgZm9udC4KLSAgICBcc3BhY2Vza2lwID0gXGZvbnRkaW1lbjJcZm9udAotICAgICUKLSAgICAlIFN3aXRjaCB0byB0eXBld3JpdGVyLgotICAgIFx0dAotICAgICUKLSAgICAlIEJ1dCBgXCAnIHByb2R1Y2VzIHRoZSBsYXJnZSB0eXBld3JpdGVyIGludGVyd29yZCBzcGFjZS4KLSAgICBcZGVmXCB7e1xzcGFjZXNraXAgPSAwcHR7fSB9fSUKLSAgICAlCi0gICAgJSBUdXJuIG9mZiBoeXBoZW5hdGlvbi4KLSAgICBcbm9oeXBoZW5hdGlvbgotICAgICUKLSAgICBccmF3YmFja3NsYXNoCi0gICAgXGZyZW5jaHNwYWNpbmcKLSAgICAjMSUKLSAgfSUKLSAgXG51bGwKLX0KLQotJSBXZSAqbXVzdCogdHVybiBvbiBoeXBoZW5hdGlvbiBhdCBgLScgYW5kIGBfJyBpbiBcY29kZS4KLSUgT3RoZXJ3aXNlLCBpdCBpcyB0b28gaGFyZCB0byBhdm9pZCBvdmVyZnVsbCBoYm94ZXMKLSUgaW4gdGhlIEVtYWNzIG1hbnVhbCwgdGhlIExpYnJhcnkgbWFudWFsLCBldGMuCi0KLSUgVW5mb3J0dW5hdGVseSwgVGVYIHVzZXMgb25lIHBhcmFtZXRlciAoXGh5cGhlbmNoYXIpIHRvIGNvbnRyb2wKLSUgYm90aCBoeXBoZW5hdGlvbiBhdCAtIGFuZCBoeXBoZW5hdGlvbiB3aXRoaW4gd29yZHMuCi0lIFdlIG11c3QgdGhlcmVmb3JlIHR1cm4gdGhlbSBib3RoIG9mZiAoXHRjbG9zZSBkb2VzIHRoYXQpCi0lIGFuZCBhcnJhbmdlIGV4cGxpY2l0bHkgdG8gaHlwaGVuYXRlIGF0IGEgZGFzaC4KLSUgIC0tIHJtcy4KLXsKLSAgXGNhdGNvZGVgXC09XGFjdGl2ZQotICBcY2F0Y29kZWBcXz1cYWN0aXZlCi0gICUKLSAgXGdsb2JhbFxkZWZcY29kZXtcYmVnaW5ncm91cAotICAgIFxjYXRjb2RlYFwtPVxhY3RpdmUgXGxldC1cY29kZWRhc2gKLSAgICBcY2F0Y29kZWBcXz1cYWN0aXZlIFxsZXRfXGNvZGV1bmRlcgotICAgIFxjb2RleAotICB9Ci0gICUKLSAgJSBJZiB3ZSBlbmQgdXAgd2l0aCBhbnkgYWN0aXZlIC0gY2hhcmFjdGVycyB3aGVuIGhhbmRsaW5nIHRoZSBpbmRleCwKLSAgJSBqdXN0IHRyZWF0IHRoZW0gYXMgYSBub3JtYWwgLS4KLSAgXGdsb2JhbFxkZWZcaW5kZXhicmVha3N7XGNhdGNvZGVgXC09XGFjdGl2ZSBcbGV0LVxyZWFsZGFzaH0KLX0KLQotXGRlZlxyZWFsZGFzaHstfQotXGRlZlxjb2RlZGFzaHstXGRpc2NyZXRpb25hcnl7fXt9e319Ci1cZGVmXGNvZGV1bmRlcntcaWZ1c2luZ3R0e1xub3JtYWx1bmRlcnNjb3JlXGRpc2NyZXRpb25hcnl7fXt9e319e1xffX0KLVxkZWZcY29kZXggIzF7XHRjbG9zZXsjMX1cZW5kZ3JvdXB9Ci0KLSVcbGV0XGV4cD1cdGNsb3NlICAlV2FzIHRlbXBvcmFyeQotCi0lIEBrYmQgaXMgbGlrZSBAY29kZSwgZXhjZXB0IHRoYXQgaWYgdGhlIGFyZ3VtZW50IGlzIGp1c3Qgb25lIEBrZXkgY29tbWFuZCwKLSUgdGhlbiBAa2JkIGhhcyBubyBlZmZlY3QuCi0KLSUgQGtiZGlucHV0c3R5bGUgLS0gYXJnIGlzIGBkaXN0aW5jdCcgKEBrYmQgdXNlcyBzbGFudGVkIHR0eSBmb250IGFsd2F5cyksCi0lICAgYGV4YW1wbGUnIChAa2JkIHVzZXMgdHRzbCBvbmx5IGluc2lkZSBvZiBAZXhhbXBsZSBhbmQgZnJpZW5kcyksCi0lICAgb3IgYGNvZGUnIChAa2JkIHVzZXMgbm9ybWFsIHR0eSBmb250IGFsd2F5cykuCi1cZGVmXGtiZGlucHV0c3R5bGV7XHBhcnNlYXJnXGtiZGlucHV0c3R5bGV4eHh9Ci1cZGVmXGtiZGlucHV0c3R5bGV4eHgjMXslCi0gIFxkZWZcYXJneyMxfSUKLSAgXGlmeFxhcmdcd29yZGRpc3RpbmN0Ci0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHRzbH0lCi0gIFxlbHNlXGlmeFxhcmdcd29yZGV4YW1wbGUKLSAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dH0lCi0gIFxlbHNlXGlmeFxhcmdcd29yZGNvZGUKLSAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHR9XGdkZWZca2JkZm9udHtcdHR9JQotICBcZmlcZmlcZmkKLX0KLVxkZWZcd29yZGRpc3RpbmN0e2Rpc3RpbmN0fQotXGRlZlx3b3JkZXhhbXBsZXtleGFtcGxlfQotXGRlZlx3b3JkY29kZXtjb2RlfQotCi0lIERlZmF1bHQgaXMga2JkaW5wdXRkaXN0aW5jdC4gIChUb28gbXVjaCBvZiBhIGhhc3NsZSB0byBjYWxsIHRoZSBtYWNybywKLSUgdGhlIGNhdGNvZGVzIGFyZSB3cm9uZyBmb3IgcGFyc2VhcmcgdG8gd29yay4pCi1cZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dHNsfQotCi1cZGVmXHhrZXl7XGtleX0KLVxkZWZca2JkZm9vIzEjMiMzXHBhcntcZGVmXG9uZXsjMX1cZGVmXHRocmVleyMzfVxkZWZcdGhyZWV4ez8/fSUKLVxpZnhcb25lXHhrZXlcaWZ4XHRocmVleFx0aHJlZSBca2V5eyMyfSUKLVxlbHNle1x0Y2xvc2V7XGtiZGZvbnRcbG9va319XGZpCi1cZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaX0KLQotJSBGb3IgQHVybCwgQGVudiwgQGNvbW1hbmQgcXVvdGVzIHNlZW0gdW5uZWNlc3NhcnksIHNvIHVzZSBcY29kZS4KLVxsZXRcdXJsPVxjb2RlCi1cbGV0XGVudj1cY29kZQotXGxldFxjb21tYW5kPVxjb2RlCi0KLSUgQHVyZWYgKGFiYnJldmlhdGlvbiBmb3IgYHVybHJlZicpIHRha2VzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudAotJSBzcGVjaWZ5aW5nIHRoZSB0ZXh0IHRvIGRpc3BsYXkuICBGaXJzdCAobWFuZGF0b3J5KSBhcmcgaXMgdGhlIHVybC4KLSUgUGVyaGFwcyBldmVudHVhbGx5IHB1dCBpbiBhIGh5cGVydGV4IFxzcGVjaWFsIGhlcmUuCi0lIAotXGRlZlx1cmVmIzF7XHVyZWZ4eHggIzEsLFxmaW5pc2h9Ci1cZGVmXHVyZWZ4eHgjMSwjMiwjM1xmaW5pc2h7JQotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQotICBcaWZkaW1cd2QwID4gMHB0Ci0gICAgXHVuaGJveDBcIChcY29kZXsjMX0pJQotICBcZWxzZQotICAgIFxjb2RleyMxfSUKLSAgXGZpCi19Ci0KLSUgcm1zIGRvZXMgbm90IGxpa2UgdGhlIGFuZ2xlIGJyYWNrZXRzIC0ta2FybCwgMTdtYXk5Ny4KLSUgU28gbm93IEBlbWFpbCBpcyBqdXN0IGxpa2UgQHVyZWYuCi0lXGRlZlxlbWFpbCMxe1xhbmdsZWxlZnR7XHR0ICMxfVxhbmdsZXJpZ2h0fQotXGxldFxlbWFpbD1cdXJlZgotCi0lIENoZWNrIGlmIHdlIGFyZSBjdXJyZW50bHkgdXNpbmcgYSB0eXBld3JpdGVyIGZvbnQuICBTaW5jZSBhbGwgdGhlCi0lIENvbXB1dGVyIE1vZGVybiB0eXBld3JpdGVyIGZvbnRzIGhhdmUgemVybyBpbnRlcndvcmQgc3RyZXRjaCAoYW5kCi0lIHNocmluayksIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdCBhbGwgdHlwZXdyaXRlciBmb250cyB0byBoYXZlCi0lIHRoaXMgcHJvcGVydHksIHdlIGNhbiBjaGVjayB0aGF0IGZvbnQgcGFyYW1ldGVyLgotJQotXGRlZlxpZm1vbm9zcGFjZXtcaWZkaW1cZm9udGRpbWVuM1xmb250PTBwdCB9Ci0KLSUgVHlwZXNldCBhIGRpbWVuc2lvbiwgZS5nLiwgYGluJyBvciBgcHQnLiAgVGhlIG9ubHkgcmVhc29uIGZvciB0aGUKLSUgYXJndW1lbnQgaXMgdG8gbWFrZSB0aGUgaW5wdXQgbG9vayByaWdodDogQGRtbntwdH0gaW5zdGVhZCBvZiBAZG1ue31wdC4KLSUKLVxkZWZcZG1uIzF7XHRoaW5zcGFjZSAjMX0KLQotXGRlZlxrYmQjMXtcZGVmXGxvb2t7IzF9XGV4cGFuZGFmdGVyXGtiZGZvb1xsb29rPz9ccGFyfQotCi0lIEBsIHdhcyBuZXZlciBkb2N1bWVudGVkIHRvIG1lYW4gYGBzd2l0Y2ggdG8gdGhlIExpc3AgZm9udCcnLAotJSBhbmQgaXQgaXMgbm90IHVzZWQgYXMgc3VjaCBpbiBhbnkgbWFudWFsIEkgY2FuIGZpbmQuICBXZSBuZWVkIGl0IGZvcgotJSBQb2xpc2ggc3VwcHJlc3NlZC1sLiAgLS1rYXJsLCAyMnNlcDk2LgotJVxkZWZcbCMxe3tcbGkgIzF9XG51bGx9Ci0KLSUgRXhwbGljaXQgZm9udCBjaGFuZ2VzOiBAciwgQHNjLCB1bmRvY3VtZW50ZWQgQGlpLgotXGRlZlxyIzF7e1xybSAjMX19ICAgICAgICAgICAgICAlIHJvbWFuIGZvbnQKLVxkZWZcc2MjMXt7XHNtYWxsY2FwcyMxfX0gICAgICAgJSBzbWFsbGNhcHMgZm9udAotXGRlZlxpaSMxe3tcaXQgIzF9fSAgICAgICAgICAgICAlIGl0YWxpYyBmb250Ci0KLSUgQGFjcm9ueW0gZG93bmNhc2VzIHRoZSBhcmd1bWVudCBhbmQgcHJpbnRzIGluIHNtYWxsY2Fwcy4KLVxkZWZcYWNyb255bSMxe3tcc21hbGxjYXBzIFxsb3dlcmNhc2V7IzF9fX0KLQotJSBAcG91bmRze30gaXMgYSBzdGVybGluZyBzaWduLgotXGRlZlxwb3VuZHN7e1xpdFwkfX0KLQotCi1cbWVzc2FnZXtwYWdlIGhlYWRpbmdzLH0KLQotXG5ld3NraXBcdGl0bGVwYWdldG9wZ2x1ZSBcdGl0bGVwYWdldG9wZ2x1ZSA9IDEuNWluCi1cbmV3c2tpcFx0aXRsZXBhZ2Vib3R0b21nbHVlIFx0aXRsZXBhZ2Vib3R0b21nbHVlID0gMnBjCi0KLSUgRmlyc3QgdGhlIHRpdGxlIHBhZ2UuICBNdXN0IGRvIEBzZXR0aXRsZSBiZWZvcmUgQHRpdGxlcGFnZS4KLVxuZXdpZlxpZnNlZW5hdXRob3IKLVxuZXdpZlxpZmZpbmlzaGVkdGl0bGVwYWdlCi0KLSUgRG8gYW4gaW1wbGljaXQgQGNvbnRlbnRzIG9yIEBzaG9ydGNvbnRlbnRzIGFmdGVyIEBlbmQgdGl0bGVwYWdlIGlmIHRoZQotJSB1c2VyIHNheXMgQGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2Ugb3IgQHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZS4KLSUgCi1cbmV3aWZcaWZzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gXGxldFxzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlID0gXHNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2V0cnVlCi1cbmV3aWZcaWZzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKLSBcbGV0XHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZSA9IFxzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2V0cnVlCi0KLVxkZWZcc2hvcnR0aXRsZXBhZ2V7XHBhcnNlYXJnXHNob3J0dGl0bGVwYWdlenp6fQotXGRlZlxzaG9ydHRpdGxlcGFnZXp6eiAjMXtcYmVnaW5ncm91cFxoYm94e31cdnNraXAgMS41aW4gXGNoYXBybSBcY2VudGVybGluZXsjMX0lCi0gICAgICAgIFxlbmRncm91cFxwYWdlXGhib3h7fVxwYWdlfQotCi1cZGVmXHRpdGxlcGFnZXtcYmVnaW5ncm91cCBccGFyaW5kZW50PTBwdCBcdGV4dGZvbnRzCi0gICBcbGV0XHN1YnRpdGxlcm09XHRlbnJtCi0gICBcZGVmXHN1YnRpdGxlZm9udHtcc3VidGl0bGVybSBcbm9ybWFsYmFzZWxpbmVza2lwID0gMTNwdCBcbm9ybWFsYmFzZWxpbmVzfSUKLSAgICUKLSAgIFxkZWZcYXV0aG9yZm9udHtcYXV0aG9ycm0gXG5vcm1hbGJhc2VsaW5lc2tpcCA9IDE2cHQgXG5vcm1hbGJhc2VsaW5lc30lCi0gICAlCi0gICAlIExlYXZlIHNvbWUgc3BhY2UgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBwYWdlLgotICAgXHZnbHVlXHRpdGxlcGFnZXRvcGdsdWUKLSAgICUKLSAgICUgTm93IHlvdSBjYW4gcHJpbnQgdGhlIHRpdGxlIHVzaW5nIEB0aXRsZS4KLSAgIFxkZWZcdGl0bGV7XHBhcnNlYXJnXHRpdGxlenp6fSUKLSAgIFxkZWZcdGl0bGV6enojIzF7XGxlZnRsaW5le1x0aXRsZWZvbnRzXHJtICMjMX0KLSAgICAgICAgICAgICAgICAgICAgJSBwcmludCBhIHJ1bGUgYXQgdGhlIHBhZ2UgYm90dG9tIGFsc28uCi0gICAgICAgICAgICAgICAgICAgIFxmaW5pc2hlZHRpdGxlcGFnZWZhbHNlCi0gICAgICAgICAgICAgICAgICAgIFx2c2tpcDRwdCBcaHJ1bGUgaGVpZ2h0IDRwdCB3aWR0aCBcaHNpemUgXHZza2lwNHB0fSUKLSAgICUgTm8gcnVsZSBhdCBwYWdlIGJvdHRvbSB1bmxlc3Mgd2UgcHJpbnQgb25lIGF0IHRoZSB0b3Agd2l0aCBAdGl0bGUuCi0gICBcZmluaXNoZWR0aXRsZXBhZ2V0cnVlCi0gICAlCi0gICAlIE5vdyB5b3UgY2FuIHB1dCB0ZXh0IHVzaW5nIEBzdWJ0aXRsZS4KLSAgIFxkZWZcc3VidGl0bGV7XHBhcnNlYXJnXHN1YnRpdGxlenp6fSUKLSAgIFxkZWZcc3VidGl0bGV6enojIzF7e1xzdWJ0aXRsZWZvbnQgXHJpZ2h0bGluZXsjIzF9fX0lCi0gICAlCi0gICAlIEBhdXRob3Igc2hvdWxkIGNvbWUgbGFzdCwgYnV0IG1heSBjb21lIG1hbnkgdGltZXMuCi0gICBcZGVmXGF1dGhvcntccGFyc2VhcmdcYXV0aG9yenp6fSUKLSAgIFxkZWZcYXV0aG9yenp6IyMxe1xpZnNlZW5hdXRob3JcZWxzZVx2c2tpcCAwcHQgcGx1cyAxZmlsbGxcc2VlbmF1dGhvcnRydWVcZmkKLSAgICAgIHtcYXV0aG9yZm9udCBcbGVmdGxpbmV7IyMxfX19JQotICAgJQotICAgJSBNb3N0IHRpdGxlIGBgcGFnZXMnJyBhcmUgYWN0dWFsbHkgdHdvIHBhZ2VzIGxvbmcsIHdpdGggc3BhY2UKLSAgICUgYXQgdGhlIHRvcCBvZiB0aGUgc2Vjb25kLiAgV2UgZG9uJ3Qgd2FudCB0aGUgcmFnZ2VkIGxlZnQgb24gdGhlIHNlY29uZC4KLSAgIFxsZXRcb2xkcGFnZSA9IFxwYWdlCi0gICBcZGVmXHBhZ2V7JQotICAgICAgXGlmZmluaXNoZWR0aXRsZXBhZ2VcZWxzZQotICAgICAgICAgXGZpbmlzaHRpdGxlcGFnZQotICAgICAgXGZpCi0gICAgICBcb2xkcGFnZQotICAgICAgXGxldFxwYWdlID0gXG9sZHBhZ2UKLSAgICAgIFxoYm94e319JQotJSAgIFxkZWZccGFnZXtcb2xkcGFnZSBcaGJveHt9fQotfQotCi1cZGVmXEV0aXRsZXBhZ2V7JQotICAgXGlmZmluaXNoZWR0aXRsZXBhZ2VcZWxzZQotICAgICAgXGZpbmlzaHRpdGxlcGFnZQotICAgXGZpCi0gICAlIEl0IGlzIGltcG9ydGFudCB0byBkbyB0aGUgcGFnZSBicmVhayBiZWZvcmUgZW5kaW5nIHRoZSBncm91cCwKLSAgICUgYmVjYXVzZSB0aGUgaGVhZGxpbmUgYW5kIGZvb3RsaW5lIGFyZSBvbmx5IGVtcHR5IGluc2lkZSB0aGUgZ3JvdXAuCi0gICAlIElmIHdlIHVzZSB0aGUgbmV3IGRlZmluaXRpb24gb2YgXHBhZ2UsIHdlIGFsd2F5cyBnZXQgYSBibGFuayBwYWdlCi0gICAlIGFmdGVyIHRoZSB0aXRsZSBwYWdlLCB3aGljaCB3ZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudC4KLSAgIFxvbGRwYWdlCi0gICBcZW5kZ3JvdXAKLSAgICUKLSAgICUgSWYgdGhleSB3YW50IHNob3J0LCB0aGV5IGNlcnRhaW5seSB3YW50IGxvbmcgdG9vLgotICAgXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gICAgIFxzaG9ydGNvbnRlbnRzCi0gICAgIFxjb250ZW50cwotICAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4Ci0gICAgIFxnbG9iYWxcbGV0XGNvbnRlbnRzID0gXHJlbGF4Ci0gICBcZmkKLSAgICUKLSAgIFxpZnNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKLSAgICAgXGNvbnRlbnRzCi0gICAgIFxnbG9iYWxcbGV0XGNvbnRlbnRzID0gXHJlbGF4Ci0gICAgIFxnbG9iYWxcbGV0XHNob3J0Y29udGVudHMgPSBccmVsYXgKLSAgIFxmaQotICAgJQotICAgXEhFQURJTkdTb24KLX0KLQotXGRlZlxmaW5pc2h0aXRsZXBhZ2V7JQotICAgXHZza2lwNHB0IFxocnVsZSBoZWlnaHQgMnB0IHdpZHRoIFxoc2l6ZQotICAgXHZza2lwXHRpdGxlcGFnZWJvdHRvbWdsdWUKLSAgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKLX0KLQotJSUlIFNldCB1cCBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncy4KLQotXGxldFx0aGlzcGFnZT1cZm9saW8KLQotXG5ld3Rva3NcZXZlbmhlYWRsaW5lICAgICUgaGVhZGxpbmUgb24gZXZlbiBwYWdlcwotXG5ld3Rva3Ncb2RkaGVhZGxpbmUgICAgICUgaGVhZGxpbmUgb24gb2RkIHBhZ2VzCi1cbmV3dG9rc1xldmVuZm9vdGxpbmUgICAgJSBmb290bGluZSBvbiBldmVuIHBhZ2VzCi1cbmV3dG9rc1xvZGRmb290bGluZSAgICAgJSBmb290bGluZSBvbiBvZGQgcGFnZXMKLQotJSBOb3cgbWFrZSBUZXggdXNlIHRob3NlIHZhcmlhYmxlcwotXGhlYWRsaW5lPXt7XHRleHRmb250c1xybSBcaWZvZGRccGFnZW5vIFx0aGVcb2RkaGVhZGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZWxzZSBcdGhlXGV2ZW5oZWFkbGluZSBcZml9fQotXGZvb3RsaW5lPXt7XHRleHRmb250c1xybSBcaWZvZGRccGFnZW5vIFx0aGVcb2RkZm9vdGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZWxzZSBcdGhlXGV2ZW5mb290bGluZSBcZml9XEhFQURJTkdTaG9va30KLVxsZXRcSEVBRElOR1Nob29rPVxyZWxheAotCi0lIENvbW1hbmRzIHRvIHNldCB0aG9zZSB2YXJpYWJsZXMuCi0lIEZvciBleGFtcGxlLCB0aGlzIGlzIHdoYXQgIEBoZWFkaW5ncyBvbiAgZG9lcwotJSBAZXZlbmhlYWRpbmcgQHRoaXN0aXRsZXxAdGhpc3BhZ2V8QHRoaXNjaGFwdGVyCi0lIEBvZGRoZWFkaW5nIEB0aGlzY2hhcHRlcnxAdGhpc3BhZ2V8QHRoaXN0aXRsZQotJSBAZXZlbmZvb3RpbmcgQHRoaXNmaWxlfHwKLSUgQG9kZGZvb3RpbmcgfHxAdGhpc2ZpbGUKLQotXGRlZlxldmVuaGVhZGluZ3tccGFyc2VhcmdcZXZlbmhlYWRpbmd4eHh9Ci1cZGVmXG9kZGhlYWRpbmd7XHBhcnNlYXJnXG9kZGhlYWRpbmd4eHh9Ci1cZGVmXGV2ZXJ5aGVhZGluZ3tccGFyc2VhcmdcZXZlcnloZWFkaW5neHh4fQotCi1cZGVmXGV2ZW5mb290aW5ne1xwYXJzZWFyZ1xldmVuZm9vdGluZ3h4eH0KLVxkZWZcb2RkZm9vdGluZ3tccGFyc2Vhcmdcb2RkZm9vdGluZ3h4eH0KLVxkZWZcZXZlcnlmb290aW5ne1xwYXJzZWFyZ1xldmVyeWZvb3Rpbmd4eHh9Ci0KLXtcY2F0Y29kZWBcQD0wICUKLQotXGdkZWZcZXZlbmhlYWRpbmd4eHggIzF7XGV2ZW5oZWFkaW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQotXGdkZWZcZXZlbmhlYWRpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19Ci0KLVxnZGVmXG9kZGhlYWRpbmd4eHggIzF7XG9kZGhlYWRpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxvZGRoZWFkaW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCi1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19Ci0KLVxnZGVmXGV2ZXJ5aGVhZGluZ3h4eCMxe1xvZGRoZWFkaW5neHh4eyMxfVxldmVuaGVhZGluZ3h4eHsjMX19JQotCi1cZ2RlZlxldmVuZm9vdGluZ3h4eCAjMXtcZXZlbmZvb3Rpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxldmVuZm9vdGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KLQotXGdkZWZcb2RkZm9vdGluZ3h4eCAjMXtcb2RkZm9vdGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KLVxnZGVmXG9kZGZvb3Rpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLSAgXGdsb2JhbFxvZGRmb290bGluZSA9IHtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX0lCi0gICUKLSAgJSBMZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgZm9vdGxpbmUuICBIb3BlZnVsbHkgb2sgdG8gYXNzdW1lCi0gICUgQGV2ZW5mb290aW5nIHdpbGwgbm90IGJlIHVzZWQgYnkgaXRzZWxmLgotICBcZ2xvYmFsXGFkdmFuY2VccGFnZWhlaWdodCBieSAtXGJhc2VsaW5lc2tpcAotICBcZ2xvYmFsXGFkdmFuY2VcdnNpemUgYnkgLVxiYXNlbGluZXNraXAKLX0KLQotXGdkZWZcZXZlcnlmb290aW5neHh4IzF7XG9kZGZvb3Rpbmd4eHh7IzF9XGV2ZW5mb290aW5neHh4eyMxfX0KLSUKLX0lIHVuYmluZCB0aGUgY2F0Y29kZSBvZiBALgotCi0lIEBoZWFkaW5ncyBkb3VibGUgICAgICB0dXJucyBoZWFkaW5ncyBvbiBmb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLgotJSBAaGVhZGluZ3Mgc2luZ2xlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIHNpbmdsZS1zaWRlZCBwcmludGluZy4KLSUgQGhlYWRpbmdzIG9mZiAgICAgICAgIHR1cm5zIHRoZW0gb2ZmLgotJSBAaGVhZGluZ3Mgb24gICAgICAgICAgc2FtZSBhcyBAaGVhZGluZ3MgZG91YmxlLCByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4KLSUgQGhlYWRpbmdzIGFmdGVyICAgICAgIHR1cm5zIG9uIGRvdWJsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCi0lIEBoZWFkaW5ncyBkb3VibGVhZnRlciB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgotJSBAaGVhZGluZ3Mgc2luZ2xlYWZ0ZXIgdHVybnMgb24gc2luZ2xlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KLSUgQnkgZGVmYXVsdCwgdGhleSBhcmUgb2ZmIGF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50LAotJSBhbmQgdHVybmVkIGBvbicgYWZ0ZXIgQGVuZCB0aXRsZXBhZ2UuCi0KLVxkZWZcaGVhZGluZ3MgIzEge1xjc25hbWUgSEVBRElOR1MjMVxlbmRjc25hbWV9Ci0KLVxkZWZcSEVBRElOR1NvZmZ7Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGhmaWx9IFxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH19Ci1cSEVBRElOR1NvZmYKLSUgV2hlbiB3ZSB0dXJuIGhlYWRpbmdzIG9uLCBzZXQgdGhlIHBhZ2UgbnVtYmVyIHRvIDEuCi0lIEZvciBkb3VibGUtc2lkZWQgcHJpbnRpbmcsIHB1dCBjdXJyZW50IGZpbGUgbmFtZSBpbiBsb3dlciBsZWZ0IGNvcm5lciwKLSUgY2hhcHRlciBuYW1lIG9uIGluc2lkZSB0b3Agb2YgcmlnaHQgaGFuZCBwYWdlcywgZG9jdW1lbnQKLSUgdGl0bGUgb24gaW5zaWRlIHRvcCBvZiBsZWZ0IGhhbmQgcGFnZXMsIGFuZCBwYWdlIG51bWJlcnMgb24gb3V0c2lkZSB0b3AKLSUgZWRnZSBvZiBhbGwgcGFnZXMuCi1cZGVmXEhFQURJTkdTZG91YmxlewotXGdsb2JhbFxwYWdlbm89MQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XGZvbGlvXGhmaWxcdGhpc3RpdGxlfX0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQotfQotXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi0KLSUgRm9yIHNpbmdsZS1zaWRlZCBwcmludGluZywgY2hhcHRlciB0aXRsZSBnb2VzIGFjcm9zcyB0b3AgbGVmdCBvZiBwYWdlLAotJSBwYWdlIG51bWJlciBvbiB0b3AgcmlnaHQuCi1cZGVmXEhFQURJTkdTc2luZ2xlewotXGdsb2JhbFxwYWdlbm89MQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotfQotXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU2RvdWJsZX0KLQotXGRlZlxIRUFESU5HU2FmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU2RvdWJsZXh9Ci1cbGV0XEhFQURJTkdTZG91YmxlYWZ0ZXI9XEhFQURJTkdTYWZ0ZXIKLVxkZWZcSEVBRElOR1Nkb3VibGV4eyUKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1xmb2xpb1xoZmlsXHRoaXN0aXRsZX19Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKLX0KLQotXGRlZlxIRUFESU5HU3NpbmdsZWFmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU3NpbmdsZXh9Ci1cZGVmXEhFQURJTkdTc2luZ2xleHslCi1cZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi19Ci0KLSUgU3Vicm91dGluZXMgdXNlZCBpbiBnZW5lcmF0aW5nIGhlYWRpbmdzCi0lIFByb2R1Y2VzIERheSBNb250aCBZZWFyIHN0eWxlIG9mIG91dHB1dC4KLVxkZWZcdG9kYXl7XG51bWJlclxkYXlcc3BhY2UKLVxpZmNhc2VcbW9udGhcb3IKLUphbnVhcnlcb3IgRmVicnVhcnlcb3IgTWFyY2hcb3IgQXByaWxcb3IgTWF5XG9yIEp1bmVcb3IKLUp1bHlcb3IgQXVndXN0XG9yIFNlcHRlbWJlclxvciBPY3RvYmVyXG9yIE5vdmVtYmVyXG9yIERlY2VtYmVyXGZpCi1cc3BhY2VcbnVtYmVyXHllYXJ9Ci0KLSUgVXNlIHRoaXMgaWYgeW91IHdhbnQgdGhlIE1vbnRoIERheSwgWWVhciBzdHlsZSBvZiBvdXRwdXQuCi0lXGRlZlx0b2RheXtcaWZjYXNlXG1vbnRoXG9yCi0lSmFudWFyeVxvciBGZWJydWFyeVxvciBNYXJjaFxvciBBcHJpbFxvciBNYXlcb3IgSnVuZVxvcgotJUp1bHlcb3IgQXVndXN0XG9yIFNlcHRlbWJlclxvciBPY3RvYmVyXG9yIE5vdmVtYmVyXG9yIERlY2VtYmVyXGZpCi0lXHNwYWNlXG51bWJlclxkYXksIFxudW1iZXJceWVhcn0KLQotJSBAc2V0dGl0bGUgbGluZS4uLiAgc3BlY2lmaWVzIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQsIGZvciBoZWFkaW5ncwotJSBJdCBnZW5lcmF0ZXMgbm8gb3V0cHV0IG9mIGl0cyBvd24KLQotXGRlZlx0aGlzdGl0bGV7Tm8gVGl0bGV9Ci1cZGVmXHNldHRpdGxle1xwYXJzZWFyZ1xzZXR0aXRsZXp6en0KLVxkZWZcc2V0dGl0bGV6enogIzF7XGdkZWZcdGhpc3RpdGxleyMxfX0KLQotCi1cbWVzc2FnZXt0YWJsZXMsfQotJSBUYWJsZXMgLS0gQHRhYmxlLCBAZnRhYmxlLCBAdnRhYmxlLCBAaXRlbSh4KSwgQGtpdGVtKHgpLCBAeGl0ZW0oeCkuCi0KLSUgZGVmYXVsdCBpbmRlbnRhdGlvbiBvZiB0YWJsZSB0ZXh0Ci1cbmV3ZGltZW5cdGFibGVpbmRlbnQgXHRhYmxlaW5kZW50PS44aW4KLSUgZGVmYXVsdCBpbmRlbnRhdGlvbiBvZiBAaXRlbWl6ZSBhbmQgQGVudW1lcmF0ZSB0ZXh0Ci1cbmV3ZGltZW5caXRlbWluZGVudCAgXGl0ZW1pbmRlbnQ9LjNpbgotJSBtYXJnaW4gYmV0d2VlbiBlbmQgb2YgdGFibGUgaXRlbSBhbmQgc3RhcnQgb2YgdGFibGUgdGV4dC4KLVxuZXdkaW1lblxpdGVtbWFyZ2luICBcaXRlbW1hcmdpbj0uMWluCi0KLSUgdXNlZCBpbnRlcm5hbGx5IGZvciBcaXRlbWluZGVudCBtaW51cyBcaXRlbW1hcmdpbgotXG5ld2RpbWVuXGl0ZW1tYXgKLQotJSBOb3RlIEB0YWJsZSwgQHZ0YWJsZSwgYW5kIEB2dGFibGUgZGVmaW5lIEBpdGVtLCBAaXRlbXgsIGV0Yy4sIHdpdGgKLSUgdGhlc2UgZGVmcy4KLSUgVGhleSBhbHNvIGRlZmluZSBcaXRlbWluZGV4Ci0lIHRvIGluZGV4IHRoZSBpdGVtIG5hbWUgaW4gd2hhdGV2ZXIgbWFubmVyIGlzIGRlc2lyZWQgKHBlcmhhcHMgbm9uZSkuCi0KLVxuZXdpZlxpZml0ZW14bmVlZHNuZWdhdGl2ZXZza2lwCi0KLVxkZWZcaXRlbXhwYXJ7XHBhclxpZml0ZW14bmVlZHNuZWdhdGl2ZXZza2lwXG5vYnJlYWtcdnNraXAtXHBhcnNraXBcbm9icmVha1xmaX0KLQotXGRlZlxpbnRlcm5hbEJpdGVte1xzbWFsbGJyZWFrIFxwYXJzZWFyZ1xpdGVtenp6fQotXGRlZlxpbnRlcm5hbEJpdGVteHtcaXRlbXhwYXIgXHBhcnNlYXJnXGl0ZW16enp9Ci0KLVxkZWZcaW50ZXJuYWxCeGl0ZW0gIiMxIntcZGVmXHhpdGVtc3VidG9waXh7IzF9IFxzbWFsbGJyZWFrIFxwYXJzZWFyZ1x4aXRlbXp6en0KLVxkZWZcaW50ZXJuYWxCeGl0ZW14ICIjMSJ7XGRlZlx4aXRlbXN1YnRvcGl4eyMxfSBcaXRlbXhwYXIgXHBhcnNlYXJnXHhpdGVtenp6fQotCi1cZGVmXGludGVybmFsQmtpdGVte1xzbWFsbGJyZWFrIFxwYXJzZWFyZ1xraXRlbXp6en0KLVxkZWZcaW50ZXJuYWxCa2l0ZW14e1xpdGVteHBhciBccGFyc2Vhcmdca2l0ZW16enp9Ci0KLVxkZWZca2l0ZW16enogIzF7XGRvc3ViaW5kIHtrd317XGNvZGV7IzF9fXtmb3Ige1xiZiBcbGFzdGZ1bmN0aW9ufX0lCi0gICAgICAgICAgICAgICAgIFxpdGVtenp6IHsjMX19Ci0KLVxkZWZceGl0ZW16enogIzF7XGRvc3ViaW5kIHtrd317XGNvZGV7IzF9fXtmb3Ige1xiZiBceGl0ZW1zdWJ0b3BpY319JQotICAgICAgICAgICAgICAgICBcaXRlbXp6eiB7IzF9fQotCi1cZGVmXGl0ZW16enogIzF7XGJlZ2luZ3JvdXAgJQotICBcYWR2YW5jZVxoc2l6ZSBieSAtXHJpZ2h0c2tpcAotICBcYWR2YW5jZVxoc2l6ZSBieSAtXHRhYmxlaW5kZW50Ci0gIFxzZXRib3gwPVxoYm94e1xpdGVtZm9udHsjMX19JQotICBcaXRlbWluZGV4eyMxfSUKLSAgXG5vYnJlYWsgJSBUaGlzIHByZXZlbnRzIGEgYnJlYWsgYmVmb3JlIEBpdGVteC4KLSAgJQotICAlIElmIHRoZSBpdGVtIHRleHQgZG9lcyBub3QgZml0IGluIHRoZSBzcGFjZSB3ZSBoYXZlLCBwdXQgaXQgb24gYSBsaW5lCi0gICUgYnkgaXRzZWxmLCBhbmQgZG8gbm90IGFsbG93IGEgcGFnZSBicmVhayBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoYXQKLSAgJSBsaW5lLiAgV2UgZG8gbm90IHN0YXJ0IGEgcGFyYWdyYXBoIGhlcmUgYmVjYXVzZSB0aGVuIGlmIHRoZSBuZXh0Ci0gICUgY29tbWFuZCBpcywgZS5nLiwgQGtpbmRleCwgdGhlIHdoYXRzaXQgd291bGQgZ2V0IHB1dCBpbnRvIHRoZQotICAlIGhvcml6b250YWwgbGlzdCBvbiBhIGxpbmUgYnkgaXRzZWxmLCByZXN1bHRpbmcgaW4gZXh0cmEgYmxhbmsgc3BhY2UuCi0gIFxpZmRpbSBcd2QwPlxpdGVtbWF4Ci0gICAgJQotICAgICUgTWFrZSB0aGlzIGEgcGFyYWdyYXBoIHNvIHdlIGdldCB0aGUgXHBhcnNraXAgZ2x1ZSBhbmQgd3JhcHBpbmcsCi0gICAgJSBidXQgbGVhdmUgaXQgcmFnZ2VkLXJpZ2h0LgotICAgIFxiZWdpbmdyb3VwCi0gICAgICBcYWR2YW5jZVxsZWZ0c2tpcCBieS1cdGFibGVpbmRlbnQKLSAgICAgIFxhZHZhbmNlXGhzaXplIGJ5XHRhYmxlaW5kZW50Ci0gICAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkwcHQgcGx1czFmaWwKLSAgICAgIFxsZWF2ZXZtb2RlXHVuaGJveDBccGFyCi0gICAgXGVuZGdyb3VwCi0gICAgJQotICAgICUgV2UncmUgZ29pbmcgdG8gYmUgc3RhcnRpbmcgYSBwYXJhZ3JhcGgsIGJ1dCB3ZSBkb24ndCB3YW50IHRoZQotICAgICUgXHBhcnNraXAgZ2x1ZSAtLSBsb2dpY2FsbHkgaXQncyBwYXJ0IG9mIHRoZSBAaXRlbSB3ZSBqdXN0IHN0YXJ0ZWQuCi0gICAgXG5vYnJlYWsgXHZza2lwLVxwYXJza2lwCi0gICAgJQotICAgICUgU3RvcCBhIHBhZ2UgYnJlYWsgYXQgdGhlIFxwYXJza2lwIGdsdWUgY29taW5nIHVwLiAgVW5mb3J0dW5hdGVseQotICAgICUgd2UgY2FuJ3QgcHJldmVudCBhIHBvc3NpYmxlIHBhZ2UgYnJlYWsgYXQgdGhlIGZvbGxvd2luZwotICAgICUgXGJhc2VsaW5lc2tpcCBnbHVlLgotICAgIFxub2JyZWFrCi0gICAgXGVuZGdyb3VwCi0gICAgXGl0ZW14bmVlZHNuZWdhdGl2ZXZza2lwZmFsc2UKLSAgXGVsc2UKLSAgICAlIFRoZSBpdGVtIHRleHQgZml0cyBpbnRvIHRoZSBzcGFjZS4gIFN0YXJ0IGEgcGFyYWdyYXBoLCBzbyB0aGF0IHRoZQotICAgICUgZm9sbG93aW5nIHRleHQgKGlmIGFueSkgd2lsbCBlbmQgdXAgb24gdGhlIHNhbWUgbGluZS4gIAotICAgIFxub2luZGVudAotICAgICUgRG8gdGhpcyB3aXRoIGtlcm5zIGFuZCBcdW5oYm94IHNvIHRoYXQgaWYgdGhlcmUgaXMgYSBmb290bm90ZSBpbgotICAgICUgdGhlIGl0ZW0gdGV4dCwgaXQgY2FuIG1pZ3JhdGUgdG8gdGhlIG1haW4gdmVydGljYWwgbGlzdCBhbmQKLSAgICAlIGV2ZW50dWFsbHkgYmUgcHJpbnRlZC4KLSAgICBcbm9icmVha1xrZXJuLVx0YWJsZWluZGVudAotICAgIFxkaW1lbjAgPSBcaXRlbW1heCAgXGFkdmFuY2VcZGltZW4wIGJ5IFxpdGVtbWFyZ2luIFxhZHZhbmNlXGRpbWVuMCBieSAtXHdkMAotICAgIFx1bmhib3gwCi0gICAgXG5vYnJlYWtca2VyblxkaW1lbjAKLSAgICBcZW5kZ3JvdXAKLSAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXB0cnVlCi0gIFxmaQotfQotCi1cZGVmXGl0ZW17XGVycm1lc3NhZ2V7QGl0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxpdGVteHtcZXJybWVzc2FnZXtAaXRlbXggd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxraXRlbXtcZXJybWVzc2FnZXtAa2l0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxraXRlbXh7XGVycm1lc3NhZ2V7QGtpdGVteCB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXHhpdGVte1xlcnJtZXNzYWdle0B4aXRlbSB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXHhpdGVteHtcZXJybWVzc2FnZXtAeGl0ZW14IHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLQotJSBDb250YWlucyBhIGtsdWRnZSB0byBnZXQgQGVuZFtkZXNjcmlwdGlvbl0gdG8gd29yay4KLVxkZWZcZGVzY3JpcHRpb257XHRhYmxlentcZG9udGluZGV4fXsxfXt9e317fXt9fQotCi0lIEB0YWJsZSwgQGZ0YWJsZSwgQHZ0YWJsZS4KLVxkZWZcdGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcdGFibGV4fQote1xvYmV5bGluZXNcb2JleXNwYWNlcyUKLVxnZGVmXHRhYmxleCAjMV5eTXslCi1cdGFibGV5XGRvbnRpbmRleCMxICAgICAgICBcZW5kdGFibGV5fX0KLQotXGRlZlxmdGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcZnRhYmxleH0KLXtcb2JleWxpbmVzXG9iZXlzcGFjZXMlCi1cZ2RlZlxmdGFibGV4ICMxXl5NeyUKLVx0YWJsZXlcZm5pdGVtaW5kZXgjMSAgICAgICAgXGVuZHRhYmxleQotXGRlZlxFZnRhYmxle1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGxldFxFdGFibGU9XHJlbGF4fX0KLQotXGRlZlx2dGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcdnRhYmxleH0KLXtcb2JleWxpbmVzXG9iZXlzcGFjZXMlCi1cZ2RlZlx2dGFibGV4ICMxXl5NeyUKLVx0YWJsZXlcdnJpdGVtaW5kZXgjMSAgICAgICAgXGVuZHRhYmxleQotXGRlZlxFdnRhYmxle1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGxldFxFdGFibGU9XHJlbGF4fX0KLQotXGRlZlxkb250aW5kZXggIzF7fQotXGRlZlxmbml0ZW1pbmRleCAjMXtcZG9pbmQge2ZufXtcY29kZXsjMX19fSUKLVxkZWZcdnJpdGVtaW5kZXggIzF7XGRvaW5kIHt2cn17XGNvZGV7IzF9fX0lCi0KLXtcb2JleXNwYWNlcyAlCi1cZ2RlZlx0YWJsZXkjMSMyICMzICM0ICM1ICM2ICM3XGVuZHRhYmxleXtcZW5kZ3JvdXAlCi1cdGFibGV6eyMxfXsjMn17IzN9eyM0fXsjNX17IzZ9fX0KLQotXGRlZlx0YWJsZXogIzEjMiMzIzQjNSM2eyUKLVxhYm92ZWVudmJyZWFrICUKLVxiZWdpbmdyb3VwICUKLVxkZWZcRWRlc2NyaXB0aW9ue1xFdGFibGV9JSBOZWNlc3Nhcnkga2x1ZGdlLgotXGxldFxpdGVtaW5kZXg9IzElCi1caWZudW0gMCMzPjAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5ICMzXG1pbCBcZmkgJQotXGlmbnVtIDAjND4wIFx0YWJsZWluZGVudD0jNFxtaWwgXGZpICUKLVxpZm51bSAwIzU+MCBcYWR2YW5jZSBccmlnaHRza2lwIGJ5ICM1XG1pbCBcZmkgJQotXGRlZlxpdGVtZm9udHsjMn0lCi1caXRlbW1heD1cdGFibGVpbmRlbnQgJQotXGFkdmFuY2UgXGl0ZW1tYXggYnkgLVxpdGVtbWFyZ2luICUKLVxhZHZhbmNlIFxsZWZ0c2tpcCBieSBcdGFibGVpbmRlbnQgJQotXGV4ZGVudGFtb3VudD1cdGFibGVpbmRlbnQKLVxwYXJpbmRlbnQgPSAwcHQKLVxwYXJza2lwID0gXHNtYWxsc2tpcGFtb3VudAotXGlmZGltIFxwYXJza2lwPTBwdCBccGFyc2tpcD0ycHQgXGZpJQotXGRlZlxFdGFibGV7XGVuZGdyYWZcYWZ0ZXJlbnZicmVha1xlbmRncm91cH0lCi1cbGV0XGl0ZW0gPSBcaW50ZXJuYWxCaXRlbSAlCi1cbGV0XGl0ZW14ID0gXGludGVybmFsQml0ZW14ICUKLVxsZXRca2l0ZW0gPSBcaW50ZXJuYWxCa2l0ZW0gJQotXGxldFxraXRlbXggPSBcaW50ZXJuYWxCa2l0ZW14ICUKLVxsZXRceGl0ZW0gPSBcaW50ZXJuYWxCeGl0ZW0gJQotXGxldFx4aXRlbXggPSBcaW50ZXJuYWxCeGl0ZW14ICUKLX0KLQotJSBUaGlzIGlzIHRoZSBjb3VudGVyIHVzZWQgYnkgQGVudW1lcmF0ZSwgd2hpY2ggaXMgcmVhbGx5IEBpdGVtaXplCi0KLVxuZXdjb3VudCBcaXRlbW5vCi0KLVxkZWZcaXRlbWl6ZXtccGFyc2VhcmdcaXRlbWl6ZXp6en0KLQotXGRlZlxpdGVtaXplenp6ICMxeyUKLSAgXGJlZ2luZ3JvdXAgJSBlbmRlZCBieSB0aGUgQGVuZCBpdGVtaXplCi0gIFxpdGVtaXpleSB7IzF9e1xFaXRlbWl6ZX0KLX0KLQotXGRlZlxpdGVtaXpleSAjMSMyeyUKLVxhYm92ZWVudmJyZWFrICUKLVxpdGVtbWF4PVxpdGVtaW5kZW50ICUKLVxhZHZhbmNlIFxpdGVtbWF4IGJ5IC1caXRlbW1hcmdpbiAlCi1cYWR2YW5jZSBcbGVmdHNraXAgYnkgXGl0ZW1pbmRlbnQgJQotXGV4ZGVudGFtb3VudD1caXRlbWluZGVudAotXHBhcmluZGVudCA9IDBwdCAlCi1ccGFyc2tpcCA9IFxzbWFsbHNraXBhbW91bnQgJQotXGlmZGltIFxwYXJza2lwPTBwdCBccGFyc2tpcD0ycHQgXGZpJQotXGRlZiMye1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGRlZlxpdGVtY29udGVudHN7IzF9JQotXGxldFxpdGVtPVxpdGVtaXplaXRlbX0KLQotJSBTZXQgc2Zjb2RlIHRvIG5vcm1hbCBmb3IgdGhlIGNoYXJzIHRoYXQgdXN1YWxseSBoYXZlIGFub3RoZXIgdmFsdWUuCi0lIFRoZXNlIGFyZSBgLj8hOjssJwotXGRlZlxmcmVuY2hzcGFjaW5ne1xzZmNvZGU0Nj0xMDAwIFxzZmNvZGU2Mz0xMDAwIFxzZmNvZGUzMz0xMDAwCi0gIFxzZmNvZGU1OD0xMDAwIFxzZmNvZGU1OT0xMDAwIFxzZmNvZGU0ND0xMDAwIH0KLQotJSBcc3BsaXRvZmYgVE9LRU5TXGVuZG1hcmsgZGVmaW5lcyBcZmlyc3QgdG8gYmUgdGhlIGZpcnN0IHRva2VuIGluCi0lIFRPS0VOUywgYW5kIFxyZXN0IHRvIGJlIHRoZSByZW1haW5kZXIuCi0lCi1cZGVmXHNwbGl0b2ZmIzEjMlxlbmRtYXJre1xkZWZcZmlyc3R7IzF9XGRlZlxyZXN0eyMyfX0lCi0KLSUgQWxsb3cgYW4gb3B0aW9uYWwgYXJndW1lbnQgb2YgYW4gdXBwZXJjYXNlIGxldHRlciwgbG93ZXJjYXNlIGxldHRlciwKLSUgb3IgbnVtYmVyLCB0byBzcGVjaWZ5IHRoZSBmaXJzdCBsYWJlbCBpbiB0aGUgZW51bWVyYXRlZCBsaXN0LiAgTm8KLSUgYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMgYDEnLgotJQotXGRlZlxlbnVtZXJhdGV7XHBhcnNlYXJnXGVudW1lcmF0ZXp6en0KLVxkZWZcZW51bWVyYXRlenp6ICMxe1xlbnVtZXJhdGV5ICMxICBcZW5kZW51bWVyYXRleX0KLVxkZWZcZW51bWVyYXRleSAjMSAjMlxlbmRlbnVtZXJhdGV5eyUKLSAgXGJlZ2luZ3JvdXAgJSBlbmRlZCBieSB0aGUgQGVuZCBlbnVtZXJhdGUKLSAgJQotICAlIElmIHdlIHdlcmUgZ2l2ZW4gbm8gYXJndW1lbnQsIHByZXRlbmQgd2Ugd2VyZSBnaXZlbiBgMScuCi0gIFxkZWZcdGhlYXJneyMxfSUKLSAgXGlmeFx0aGVhcmdcZW1wdHkgXGRlZlx0aGVhcmd7MX1cZmkKLSAgJQotICAlIERldGVjdCBpZiB0aGUgYXJndW1lbnQgaXMgYSBzaW5nbGUgdG9rZW4uICBJZiBzbywgaXQgbWlnaHQgYmUgYQotICAlIGxldHRlci4gIE90aGVyd2lzZSwgdGhlIG9ubHkgdmFsaWQgdGhpbmcgaXQgY2FuIGJlIGlzIGEgbnVtYmVyLgotICAlIChXZSB3aWxsIGFsd2F5cyBoYXZlIG9uZSB0b2tlbiwgYmVjYXVzZSBvZiB0aGUgdGVzdCB3ZSBqdXN0IG1hZGUuCi0gICUgVGhpcyBpcyBhIGdvb2QgdGhpbmcsIHNpbmNlIFxzcGxpdG9mZiBkb2Vzbid0IHdvcmsgZ2l2ZW4gbm90aGluZyBhdAotICAlIGFsbCAtLSB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHVuZGVsaW1pdGVkLikKLSAgXGV4cGFuZGFmdGVyXHNwbGl0b2ZmXHRoZWFyZ1xlbmRtYXJrCi0gIFxpZnhccmVzdFxlbXB0eQotICAgICUgT25seSBvbmUgdG9rZW4gaW4gdGhlIGFyZ3VtZW50LiAgSXQgY291bGQgc3RpbGwgYmUgYW55dGhpbmcuCi0gICAgJSBBIGBgbG93ZXJjYXNlIGxldHRlcicnIGlzIG9uZSB3aG9zZSBcbGNjb2RlIGlzIG5vbnplcm8uCi0gICAgJSBBbiBgYHVwcGVyY2FzZSBsZXR0ZXInJyBpcyBvbmUgd2hvc2UgXGxjY29kZSBpcyBib3RoIG5vbnplcm8sIGFuZAotICAgICUgICBub3QgZXF1YWwgdG8gaXRzZWxmLgotICAgICUgT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgaXQncyBhIG51bWJlci4KLSAgICAlCi0gICAgJSBXZSBuZWVkIHRoZSBccmVsYXggYXQgdGhlIGVuZCBvZiB0aGUgXGlmbnVtIGxpbmVzIHRvIHN0b3AgVGVYIGZyb20KLSAgICAlIGNvbnRpbnVpbmcgdG8gbG9vayBmb3IgYSA8bnVtYmVyPi4KLSAgICAlCi0gICAgXGlmbnVtXGxjY29kZVxleHBhbmRhZnRlcmBcdGhlYXJnPTBccmVsYXgKLSAgICAgIFxudW1lcmljZW51bWVyYXRlICUgYSBudW1iZXIgKHdlIGhvcGUpCi0gICAgXGVsc2UKLSAgICAgICUgSXQncyBhIGxldHRlci4KLSAgICAgIFxpZm51bVxsY2NvZGVcZXhwYW5kYWZ0ZXJgXHRoZWFyZz1cZXhwYW5kYWZ0ZXJgXHRoZWFyZ1xyZWxheAotICAgICAgICBcbG93ZXJjYXNlZW51bWVyYXRlICUgbG93ZXJjYXNlIGxldHRlcgotICAgICAgXGVsc2UKLSAgICAgICAgXHVwcGVyY2FzZWVudW1lcmF0ZSAlIHVwcGVyY2FzZSBsZXR0ZXIKLSAgICAgIFxmaQotICAgIFxmaQotICBcZWxzZQotICAgICUgTXVsdGlwbGUgdG9rZW5zIGluIHRoZSBhcmd1bWVudC4gIFdlIGhvcGUgaXQncyBhIG51bWJlci4KLSAgICBcbnVtZXJpY2VudW1lcmF0ZQotICBcZmkKLX0KLQotJSBBbiBAZW51bWVyYXRlIHdob3NlIGxhYmVscyBhcmUgaW50ZWdlcnMuICBUaGUgc3RhcnRpbmcgaW50ZWdlciBpcwotJSBnaXZlbiBpbiBcdGhlYXJnLgotJQotXGRlZlxudW1lcmljZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFx0aGVhcmcKLSAgXHN0YXJ0ZW51bWVyYXRpb257XHRoZVxpdGVtbm99JQotfQotCi0lIFRoZSBzdGFydGluZyAobG93ZXJjYXNlKSBsZXR0ZXIgaXMgaW4gXHRoZWFyZy4KLVxkZWZcbG93ZXJjYXNlZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFxleHBhbmRhZnRlcmBcdGhlYXJnCi0gIFxzdGFydGVudW1lcmF0aW9ueyUKLSAgICAlIEJlIHN1cmUgd2UncmUgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhbHBoYWJldC4KLSAgICBcaWZudW1caXRlbW5vPTAKLSAgICAgIFxlcnJtZXNzYWdle05vIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMgaW4gQGVudW1lcmF0ZTsgZ2V0IGEgYmlnZ2VyCi0gICAgICAgICAgICAgICAgICBhbHBoYWJldH0lCi0gICAgXGZpCi0gICAgXGNoYXJcbGNjb2RlXGl0ZW1ubwotICB9JQotfQotCi0lIFRoZSBzdGFydGluZyAodXBwZXJjYXNlKSBsZXR0ZXIgaXMgaW4gXHRoZWFyZy4KLVxkZWZcdXBwZXJjYXNlZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFxleHBhbmRhZnRlcmBcdGhlYXJnCi0gIFxzdGFydGVudW1lcmF0aW9ueyUKLSAgICAlIEJlIHN1cmUgd2UncmUgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhbHBoYWJldC4KLSAgICBcaWZudW1caXRlbW5vPTAKLSAgICAgIFxlcnJtZXNzYWdle05vIG1vcmUgdXBwZXJjYXNlIGxldHRlcnMgaW4gQGVudW1lcmF0ZTsgZ2V0IGEgYmlnZ2VyCi0gICAgICAgICAgICAgICAgICBhbHBoYWJldH0KLSAgICBcZmkKLSAgICBcY2hhclx1Y2NvZGVcaXRlbW5vCi0gIH0lCi19Ci0KLSUgQ2FsbCBpdGVtaXpleSwgYWRkaW5nIGEgcGVyaW9kIHRvIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgc3VwcGx5aW5nIHRoZQotJSBjb21tb24gbGFzdCB0d28gYXJndW1lbnRzLiAgQWxzbyBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgaW5pdGlhbCB2YWx1ZSBpbgotJSBcaXRlbW5vLCBzaW5jZSBAaXRlbSBpbmNyZW1lbnRzIFxpdGVtbm8uCi0lCi1cZGVmXHN0YXJ0ZW51bWVyYXRpb24jMXslCi0gIFxhZHZhbmNlXGl0ZW1ubyBieSAtMQotICBcaXRlbWl6ZXl7IzEufVxFZW51bWVyYXRlXGZsdXNoY3IKLX0KLQotJSBAYWxwaGFlbnVtZXJhdGUgYW5kIEBjYXBzZW51bWVyYXRlIGFyZSBhYmJyZXZpYXRpb25zIGZvciBnaXZpbmcgYW4gYXJnCi0lIHRvIEBlbnVtZXJhdGUuCi0lCi1cZGVmXGFscGhhZW51bWVyYXRle1xlbnVtZXJhdGV7YX19Ci1cZGVmXGNhcHNlbnVtZXJhdGV7XGVudW1lcmF0ZXtBfX0KLVxkZWZcRWFscGhhZW51bWVyYXRle1xFZW51bWVyYXRlfQotXGRlZlxFY2Fwc2VudW1lcmF0ZXtcRWVudW1lcmF0ZX0KLQotJSBEZWZpbml0aW9uIG9mIEBpdGVtIHdoaWxlIGluc2lkZSBAaXRlbWl6ZS4KLQotXGRlZlxpdGVtaXplaXRlbXslCi1cYWR2YW5jZVxpdGVtbm8gYnkgMQote1xsZXRccGFyPVxlbmRncmFmIFxzbWFsbGJyZWFrfSUKLVxpZmhtb2RlIFxlcnJtZXNzYWdle0luIGhtb2RlIGF0IGl0ZW1pemVpdGVtfVxmaQote1xwYXJza2lwPTBpbiBcaHNraXAgMHB0Ci1caGJveCB0byAwcHR7XGhzcyBcaXRlbWNvbnRlbnRzXGhza2lwIFxpdGVtbWFyZ2lufSUKLVx2YWRqdXN0e1xwZW5hbHR5IDEyMDB9fSUKLVxmbHVzaGNyfQotCi0lIEBtdWx0aXRhYmxlIG1hY3JvcwotJSBBbXkgSGVuZHJpY2tzb24sIDgvMTgvOTQsIDMvNi85NgotJQotJSBAbXVsdGl0YWJsZSAuLi4gQGVuZCBtdWx0aXRhYmxlIHdpbGwgbWFrZSBhcyBtYW55IGNvbHVtbnMgYXMgZGVzaXJlZC4KLSUgQ29udGVudHMgb2YgZWFjaCBjb2x1bW4gd2lsbCB3cmFwIGF0IHdpZHRoIGdpdmVuIGluIHByZWFtYmxlLiAgV2lkdGgKLSUgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgd2l0aCBzYW1wbGUgdGV4dCBnaXZlbiBpbiBhIHRlbXBsYXRlIGxpbmUsCi0lIG9yIGluIHBlcmNlbnQgb2YgXGhzaXplLCB0aGUgY3VycmVudCB3aWR0aCBvZiB0ZXh0IG9uIHBhZ2UuCi0KLSUgVGFibGUgY2FuIGNvbnRpbnVlIG92ZXIgcGFnZXMgYnV0IHdpbGwgb25seSBicmVhayBiZXR3ZWVuIGxpbmVzLgotCi0lIFRvIG1ha2UgcHJlYW1ibGU6Ci0lCi0lIEVpdGhlciBkZWZpbmUgd2lkdGhzIG9mIGNvbHVtbnMgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemU6Ci0lICAgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMjUgLjMgLjQ1Ci0lICAgQGl0ZW0gLi4uCi0lCi0lICAgTnVtYmVycyBmb2xsb3dpbmcgQGNvbHVtbmZyYWN0aW9ucyBhcmUgdGhlIHBlcmNlbnQgb2YgdGhlIHRvdGFsCi0lICAgY3VycmVudCBoc2l6ZSB0byBiZSB1c2VkIGZvciBlYWNoIGNvbHVtbi4gWW91IG1heSB1c2UgYXMgbWFueQotJSAgIGNvbHVtbnMgYXMgZGVzaXJlZC4KLQotCi0lIE9yIHVzZSBhIHRlbXBsYXRlOgotJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9Ci0lICAgQGl0ZW0gLi4uCi0lICAgdXNpbmcgdGhlIHdpZGVzdCB0ZXJtIGRlc2lyZWQgaW4gZWFjaCBjb2x1bW4uCi0lCi0lIEZvciB0aG9zZSB3aG8gd2FudCB0byB1c2UgbW9yZSB0aGFuIG9uZSBsaW5lJ3Mgd29ydGggb2Ygd29yZHMgaW4KLSUgdGhlIHByZWFtYmxlLCBicmVhayB0aGUgbGluZSB3aXRoaW4gb25lIGFyZ3VtZW50IGFuZCBpdAotJSB3aWxsIHBhcnNlIGNvcnJlY3RseSwgaS5lLiwKLSUKLSUgICAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMKLSUgICAgICB0ZW1wbGF0ZX0KLSUgTm90OgotJSAgICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9Ci0lICAgICAge0NvbHVtbiAzIHRlbXBsYXRlfQotCi0lIEVhY2ggbmV3IHRhYmxlIGxpbmUgc3RhcnRzIHdpdGggQGl0ZW0sIGVhY2ggc3Vic2VxdWVudCBuZXcgY29sdW1uCi0lIHN0YXJ0cyB3aXRoIEB0YWIuIEVtcHR5IGNvbHVtbnMgbWF5IGJlIHByb2R1Y2VkIGJ5IHN1cHBseWluZyBAdGFiJ3MKLSUgd2l0aCBub3RoaW5nIGJldHdlZW4gdGhlbSBmb3IgYXMgbWFueSB0aW1lcyBhcyBlbXB0eSBjb2x1bW5zIGFyZSBuZWVkZWQsCi0lIGllLCBAdGFiQHRhYkB0YWIgd2lsbCBwcm9kdWNlIHR3byBlbXB0eSBjb2x1bW5zLgotCi0lIEBpdGVtLCBAdGFiLCBAbXVsdGl0YWJsZSBvciBAZW5kIG11bHRpdGFibGUgZG8gbm90IG5lZWQgdG8gYmUgb24gdGhlaXIKLSUgb3duIGxpbmVzLCBidXQgaXQgd2lsbCBub3QgaHVydCBpZiB0aGV5IGFyZS4KLQotJSBTYW1wbGUgbXVsdGl0YWJsZToKLQotJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9Ci0lICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZiBAdGFiIHRoaXJkIGNvbAotJSAgIEBpdGVtCi0lICAgZmlyc3QgY29sIHN0dWZmCi0lICAgQHRhYgotJSAgIHNlY29uZCBjb2wgc3R1ZmYKLSUgICBAdGFiCi0lICAgdGhpcmQgY29sCi0lICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZgotJSAgIEB0YWIgTWFueSBwYXJhZ3JhcGhzIG9mIHRleHQgbWF5IGJlIHVzZWQgaW4gYW55IGNvbHVtbi4KLSUKLSUgICAgICAgICBUaGV5IHdpbGwgd3JhcCBhdCB0aGUgd2lkdGggZGV0ZXJtaW5lZCBieSB0aGUgdGVtcGxhdGUuCi0lICAgQGl0ZW1AdGFiQHRhYiBUaGlzIHdpbGwgYmUgaW4gdGhpcmQgY29sdW1uLgotJSAgIEBlbmQgbXVsdGl0YWJsZQotCi0lIERlZmF1bHQgZGltZW5zaW9ucyBtYXkgYmUgcmVzZXQgYnkgdXNlci4KLSUgQG11bHRpdGFibGVwYXJza2lwIGlzIHZlcnRpY2FsIHNwYWNlIGJldHdlZW4gcGFyYWdyYXBocyBpbiB0YWJsZS4KLSUgQG11bHRpdGFibGVwYXJpbmRlbnQgaXMgcGFyYWdyYXBoIGluZGVudCBpbiB0YWJsZS4KLSUgQG11bHRpdGFibGVjb2xtYXJnaW4gaXMgaG9yaXpvbnRhbCBzcGFjZSB0byBiZSBsZWZ0IGJldHdlZW4gY29sdW1ucy4KLSUgQG11bHRpdGFibGVsaW5lc3BhY2UgaXMgc3BhY2UgdG8gbGVhdmUgYmV0d2VlbiB0YWJsZSBpdGVtcywgYmFzZWxpbmUKLSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiYXNlbGluZS4KLSUgICAwcHQgbWVhbnMgaXQgZGVwZW5kcyBvbiBjdXJyZW50IG5vcm1hbCBsaW5lIHNwYWNpbmcuCi0lCi1cbmV3c2tpcFxtdWx0aXRhYmxlcGFyc2tpcAotXG5ld3NraXBcbXVsdGl0YWJsZXBhcmluZGVudAotXG5ld2RpbWVuXG11bHRpdGFibGVjb2xzcGFjZQotXG5ld3NraXBcbXVsdGl0YWJsZWxpbmVzcGFjZQotXG11bHRpdGFibGVwYXJza2lwPTBwdAotXG11bHRpdGFibGVwYXJpbmRlbnQ9NnB0Ci1cbXVsdGl0YWJsZWNvbHNwYWNlPTEycHQKLVxtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAotCi0lIE1hY3JvcyB1c2VkIHRvIHNldCB1cCBoYWxpZ24gcHJlYW1ibGU6Ci0lIAotXGxldFxlbmRzZXR1cHRhYmxlXHJlbGF4Ci1cZGVmXHhlbmRzZXR1cHRhYmxle1xlbmRzZXR1cHRhYmxlfQotXGxldFxjb2x1bW5mcmFjdGlvbnNccmVsYXgKLVxkZWZceGNvbHVtbmZyYWN0aW9uc3tcY29sdW1uZnJhY3Rpb25zfQotXG5ld2lmXGlmc2V0cGVyY2VudAotCi0lIDIvMS85NiwgdG8gYWxsb3cgZnJhY3Rpb25zIHRvIGJlIGdpdmVuIHdpdGggbW9yZSB0aGFuIG9uZSBkaWdpdC4KLVxkZWZccGlja3Vwd2hvbGVmcmFjdGlvbiMxIHtcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkxICUKLVxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZXsuIzFcaHNpemV9JQotXHNldHVwdGFibGV9Ci0KLVxuZXdjb3VudFxjb2xjb3VudAotXGRlZlxzZXR1cHRhYmxlIzF7XGRlZlxmaXJzdGFyZ3sjMX0lCi1caWZ4XGZpcnN0YXJnXHhlbmRzZXR1cHRhYmxlXGxldFxnb1xyZWxheCUKLVxlbHNlCi0gIFxpZnhcZmlyc3RhcmdceGNvbHVtbmZyYWN0aW9uc1xnbG9iYWxcc2V0cGVyY2VudHRydWUlCi0gIFxlbHNlCi0gICAgXGlmc2V0cGVyY2VudAotICAgICAgIFxsZXRcZ29ccGlja3Vwd2hvbGVmcmFjdGlvbiAgICUgSW4gdGhpcyBjYXNlIGFyZyBvZiBzZXR1cHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBpcyB0aGUgZGVjaW1hbCBwb2ludCBiZWZvcmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBudW1iZXIgZ2l2ZW4gaW4gcGVyY2VudCBvZiBoc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIFdlIGRvbid0IG5lZWQgdGhpcyBzbyB3ZSBkb24ndCB1c2UgaXQuCi0gICAgXGVsc2UKLSAgICAgICBcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkxCi0gICAgICAgXHNldGJveDA9XGhib3h7IzEgfSUgQWRkIGEgbm9ybWFsIHdvcmQgc3BhY2UgYXMgYSBzZXBhcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICUgdHlwaWNhbGx5IHRoYXQgaXMgYWx3YXlzIGluIHRoZSBpbnB1dCwgYW55d2F5LgotICAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZXtcdGhlXHdkMH0lCi0gICAgXGZpJQotICBcZmklCi1caWZ4XGdvXHBpY2t1cHdob2xlZnJhY3Rpb25cZWxzZVxsZXRcZ29cc2V0dXB0YWJsZVxmaSUKLVxmaVxnb30KLQotJSBtdWx0aXRhYmxlIHN5bnRheAotXGRlZlx0YWJ7Jlxoc2tpcDFzcFxyZWxheH0gJSAyLzIvOTYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdGlueSBza2lwIGhlcmUgbWFrZXMgc3VyZSB0aGlzIGNvbHVtbiBzcGFjZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBtYWludGFpbmVkLCBldmVuIGlmIGl0IGlzIG5ldmVyIHVzZWQuCi0KLSUgQG11bHRpdGFibGUgLi4uIEBlbmQgbXVsdGl0YWJsZSBkZWZpbml0aW9uczoKLQotXGRlZlxtdWx0aXRhYmxle1xwYXJzZWFyZ1xkb3RhYmxlfQotXGRlZlxkb3RhYmxlIzF7XGJncm91cAotICBcdnNraXBccGFyc2tpcAotICBcbGV0XGl0ZW1cY3JjcgotICBcdG9sZXJhbmNlPTk1MDAKLSAgXGhiYWRuZXNzPTk1MDAKLSAgXHNldG11bHRpdGFibGVzcGFjaW5nCi0gIFxwYXJza2lwPVxtdWx0aXRhYmxlcGFyc2tpcAotICBccGFyaW5kZW50PVxtdWx0aXRhYmxlcGFyaW5kZW50Ci0gIFxvdmVyZnVsbHJ1bGU9MHB0Ci0gIFxnbG9iYWxcY29sY291bnQ9MAotICBcZGVmXEVtdWx0aXRhYmxle1xnbG9iYWxcc2V0cGVyY2VudGZhbHNlXGNyXGVncm91cFxlZ3JvdXB9JQotICAlCi0gICUgVG8gcGFyc2UgZXZlcnl0aGluZyBiZXR3ZWVuIEBtdWx0aXRhYmxlIGFuZCBAaXRlbToKLSAgXHNldHVwdGFibGUjMSBcZW5kc2V0dXB0YWJsZQotICAlCi0gICUgXGV2ZXJ5Y3Igd2lsbCByZXNldCBjb2x1bW4gY291bnRlciwgXGNvbGNvdW50LCBhdCB0aGUgZW5kIG9mCi0gICUgZWFjaCBsaW5lLiBFdmVyeSBjb2x1bW4gZW50cnkgd2lsbCBjYXVzZSBcY29sY291bnQgdG8gYWR2YW5jZSBieSBvbmUuCi0gICUgVGhlIHRhYmxlIHByZWFtYmxlCi0gICUgbG9va3MgYXQgdGhlIGN1cnJlbnQgXGNvbGNvdW50IHRvIGZpbmQgdGhlIGNvcnJlY3QgY29sdW1uIHdpZHRoLgotICBcZXZlcnljcntcbm9hbGlnbnslCi0gICUKLSAgJSBcZmlsYnJlYWslJSBrZWVwcyB1bmRlcmZ1bGwgYm94IG1lc3NhZ2VzIG9mZiB3aGVuIHRhYmxlIGJyZWFrcyBvdmVyIHBhZ2VzLgotICAlIE1heWJlIHNvLCBidXQgaXQgYWxzbyBjcmVhdGVzIHJlYWxseSB3ZWlyZCBwYWdlIGJyZWFrcyB3aGVuIHRoZSB0YWJsZQotICAlIGJyZWFrcyBvdmVyIHBhZ2VzLiBXb3VsZG4ndCBcdmZpbCBiZSBiZXR0ZXI/ICBXYWl0IHVudGlsIHRoZSBwcm9ibGVtCi0gICUgbWFuaWZlc3RzIGl0c2VsZiwgc28gaXQgY2FuIGJlIGZpeGVkIGZvciByZWFsIC0ta2FybC4KLSAgICBcZ2xvYmFsXGNvbGNvdW50PTBccmVsYXh9fSUKLSAgJQotICAlIFRoaXMgcHJlYW1ibGUgc2V0cyB1cCBhIGdlbmVyaWMgY29sdW1uIGRlZmluaXRpb24sIHdoaWNoIHdpbGwKLSAgJSBiZSB1c2VkIGFzIG1hbnkgdGltZXMgYXMgdXNlciBjYWxscyBmb3IgY29sdW1ucy4KLSAgJSBcdnRvcCB3aWxsIHNldCBhIHNpbmdsZSBsaW5lIGFuZCB3aWxsIGFsc28gbGV0IHRleHQgd3JhcCBhbmQKLSAgJSBjb250aW51ZSBmb3IgbWFueSBwYXJhZ3JhcGhzIGlmIGRlc2lyZWQuCi0gIFxoYWxpZ25cYmdyb3VwJlxnbG9iYWxcYWR2YW5jZVxjb2xjb3VudCBieSAxXHJlbGF4Ci0gICAgXG11bHRpc3RydXRcdnRvcHtcaHNpemU9XGV4cGFuZGFmdGVyXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZQotICAlCi0gICUgSW4gb3JkZXIgdG8ga2VlcCBlbnRyaWVzIGZyb20gYnVtcGluZyBpbnRvIGVhY2ggb3RoZXIKLSAgJSB3ZSB3aWxsIGFkZCBhIFxsZWZ0c2tpcCBvZiBcbXVsdGl0YWJsZWNvbHNwYWNlIHRvIGFsbCBjb2x1bW5zIGFmdGVyCi0gICUgdGhlIGZpcnN0IG9uZS4KLSAgJSAKLSAgJSBJZiBhIHRlbXBsYXRlIGhhcyBiZWVuIHVzZWQsIHdlIHdpbGwgYWRkIFxtdWx0aXRhYmxlY29sc3BhY2UKLSAgJSB0byB0aGUgd2lkdGggb2YgZWFjaCB0ZW1wbGF0ZSBlbnRyeS4KLSAgJSAKLSAgJSBJZiB0aGUgdXNlciBoYXMgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplIHdlIHdpbGwKLSAgJSB1c2UgdGhhdCBkaW1lbnNpb24gYXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4sIGFuZCB0aGUgXGxlZnRza2lwCi0gICUgd2lsbCBrZWVwIGVudHJpZXMgZnJvbSBidW1waW5nIGludG8gZWFjaCBvdGhlci4gIFRhYmxlIHdpbGwgc3RhcnQgYXQKLSAgJSBsZWZ0IG1hcmdpbiBhbmQgZmluYWwgY29sdW1uIHdpbGwganVzdGlmeSBhdCByaWdodCBtYXJnaW4uCi0gICUgCi0gICUgTWFrZSBzdXJlIHdlIGRvbid0IGluaGVyaXQgXHJpZ2h0c2tpcCBmcm9tIHRoZSBvdXRlciBlbnZpcm9ubWVudC4KLSAgXHJpZ2h0c2tpcD0wcHQKLSAgXGlmbnVtXGNvbGNvdW50PTEKLSAgICAlIFRoZSBmaXJzdCBjb2x1bW4gd2lsbCBiZSBpbmRlbnRlZCB3aXRoIHRoZSBzdXJyb3VuZGluZyB0ZXh0LgotICAgIFxhZHZhbmNlXGhzaXplIGJ5XGxlZnRza2lwCi0gIFxlbHNlCi0gICAgXGlmc2V0cGVyY2VudCBcZWxzZQotICAgICAgJSBJZiB1c2VyIGhhcyBub3Qgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplCi0gICAgICAlIHdlIHdpbGwgYWR2YW5jZSBcaHNpemUgYnkgXG11bHRpdGFibGVjb2xzcGFjZS4KLSAgICAgIFxhZHZhbmNlXGhzaXplIGJ5IFxtdWx0aXRhYmxlY29sc3BhY2UKLSAgICBcZmkKLSAgICUgSW4gZWl0aGVyIGNhc2Ugd2Ugd2lsbCBtYWtlIFxsZWZ0c2tpcD1cbXVsdGl0YWJsZWNvbHNwYWNlOgotICBcbGVmdHNraXA9XG11bHRpdGFibGVjb2xzcGFjZQotICBcZmkKLSAgJSBJZ25vcmluZyBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgYXZvaWRzIGFuIG9jY2FzaW9uYWwgc3B1cmlvdXMKLSAgJSBibGFuayBsaW5lLCB3aGVuIFRlWCBkZWNpZGVzIHRvIGJyZWFrIHRoZSBsaW5lIGF0IHRoZSBzcGFjZSBiZWZvcmUgdGhlCi0gICUgYm94IGZyb20gdGhlIG11bHRpc3RydXQsIHNvIHRoZSBzdHJ1dCBlbmRzIHVwIG9uIGEgbGluZSBieSBpdHNlbGYuCi0gICUgRm9yIGV4YW1wbGU6Ci0gICUgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMTEgLjg5Ci0gICUgQGl0ZW0gQGNvZGV7I30KLSAgJSBAdGFiIExlZ2FsIGhvbGlkYXkgd2hpY2ggaXMgdmFsaWQgaW4gbWFqb3IgcGFydHMgb2YgdGhlIHdob2xlIGNvdW50cnkuCi0gICUgSXMgYXV0b21hdGljYWxseSBwcm92aWRlZCB3aXRoIGhpZ2hsaWdodGluZyBzZXF1ZW5jZXMgcmVzcGVjdGl2ZWx5IG1hcmtpbmcKLSAgJSBjaGFyYWN0ZXJzLgotICBcbm9pbmRlbnRcaWdub3Jlc3BhY2VzIyNcdW5za2lwXG11bHRpc3RydXR9XGNyCi19Ci0KLVxkZWZcc2V0bXVsdGl0YWJsZXNwYWNpbmd7JSB0ZXN0IHRvIHNlZSBpZiB1c2VyIGhhcyBzZXQgXG11bHRpdGFibGVsaW5lc3BhY2UuCi0lIElmIHNvLCBkbyBub3RoaW5nLiBJZiBub3QsIGdpdmUgaXQgYW4gYXBwcm9wcmlhdGUgZGltZW5zaW9uIGJhc2VkIG9uCi0lIGN1cnJlbnQgYmFzZWxpbmVza2lwLgotXGlmZGltXG11bHRpdGFibGVsaW5lc3BhY2U9MHB0Ci0lJSBzdHJ1dCB0byBwdXQgaW4gdGFibGUgaW4gY2FzZSBzb21lIGVudHJ5IGRvZXNuJ3QgaGF2ZSBkZXNjZW5kZXJzLAotJSUgdG8ga2VlcCBsaW5lcyBlcXVhbGx5IHNwYWNlZAotXGxldFxtdWx0aXN0cnV0ID0gXHN0cnV0Ci0lJSBUZXN0IHRvIHNlZSBpZiBwYXJza2lwIGlzIGxhcmdlciB0aGFuIHNwYWNlIGJldHdlZW4gbGluZXMgb2YKLSUlIHRhYmxlLiBJZiBub3QsIGRvIG5vdGhpbmcuCi0lJSAgICAgICAgSWYgc28sIHNldCB0byBzYW1lIGRpbWVuc2lvbiBhcyBtdWx0aXRhYmxlbGluZXNwYWNlLgotXGVsc2UKLVxnZGVmXG11bHRpc3RydXR7XHZydWxlIGhlaWdodFxtdWx0aXRhYmxlbGluZXNwYWNlIGRlcHRoXGRwMAotd2lkdGgwcHRccmVsYXh9IFxmaQotXGlmZGltXG11bHRpdGFibGVwYXJza2lwPlxtdWx0aXRhYmxlbGluZXNwYWNlCi1cZ2xvYmFsXG11bHRpdGFibGVwYXJza2lwPVxtdWx0aXRhYmxlbGluZXNwYWNlCi1cZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlIHRoYW4gc2tpcCBiZXR3ZWVuIGxpbmVzIGluIHRoZSB0YWJsZS4KLVxmaSUKLVxpZmRpbVxtdWx0aXRhYmxlcGFyc2tpcD0wcHQKLVxnbG9iYWxcbXVsdGl0YWJsZXBhcnNraXA9XG11bHRpdGFibGVsaW5lc3BhY2UKLVxnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlcGFyc2tpcC03cHQgJSUgdG8ga2VlcCBwYXJza2lwIHNvbWV3aGF0IHNtYWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSUgdGhhbiBza2lwIGJldHdlZW4gbGluZXMgaW4gdGhlIHRhYmxlLgotXGZpfQotCi0KLVxtZXNzYWdle2luZGV4aW5nLH0KLSUgSW5kZXggZ2VuZXJhdGlvbiBmYWNpbGl0aWVzCi0KLSUgRGVmaW5lIFxuZXd3cml0ZSB0byBiZSBpZGVudGljYWwgdG8gcGxhaW4gdGV4J3MgXG5ld3dyaXRlCi0lIGV4Y2VwdCBub3QgXG91dGVyLCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gXG5ld2luZGV4Lgote1xjYXRjb2RlYFxAPTExCi1cZ2RlZlxuZXd3cml0ZXtcYWxsb2NAN1x3cml0ZVxjaGFyZGVmXHNpeHRAQG59fQotCi0lIFxuZXdpbmRleCB7Zm9vfSBkZWZpbmVzIGFuIGluZGV4IG5hbWVkIGZvby4KLSUgSXQgYXV0b21hdGljYWxseSBkZWZpbmVzIFxmb29pbmRleCBzdWNoIHRoYXQKLSUgXGZvb2luZGV4IC4uLnJlc3Qgb2YgbGluZS4uLiBwdXRzIGFuIGVudHJ5IGluIHRoZSBpbmRleCBmb28uCi0lIEl0IGFsc28gZGVmaW5lcyBcZm9vaW5kZmlsZSB0byBiZSB0aGUgbnVtYmVyIG9mIHRoZSBvdXRwdXQgY2hhbm5lbCBmb3IKLSUgdGhlIGZpbGUgdGhhdCBhY2N1bXVsYXRlcyB0aGlzIGluZGV4LiAgVGhlIGZpbGUncyBleHRlbnNpb24gaXMgZm9vLgotJSBUaGUgbmFtZSBvZiBhbiBpbmRleCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIDIgY2hhcmFjdGVycyBsb25nCi0lIGZvciB0aGUgc2FrZSBvZiB2bXMuCi0lCi1cZGVmXG5ld2luZGV4IzF7JQotICBcaWZsaW5rcwotICAgIFxleHBhbmRhZnRlclxuZXd3cml0ZSBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQotICAgIFxvcGVub3V0IFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lIFxqb2JuYW1lLiMxICUgT3BlbiB0aGUgZmlsZQotICBcZmkKLSAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JSAgICAgJSBEZWZpbmUgQCMxaW5kZXgKLSAgICBcbm9leHBhbmRcZG9pbmRleHsjMX19Ci19Ci0KLSUgQGRlZmluZGV4IGZvbyAgPT0gIFxuZXdpbmRleHtmb299Ci0KLVxkZWZcZGVmaW5kZXh7XHBhcnNlYXJnXG5ld2luZGV4fQotCi0lIERlZmluZSBAZGVmY29kZWluZGV4LCBsaWtlIEBkZWZpbmRleCBleGNlcHQgcHV0IGFsbCBlbnRyaWVzIGluIEBjb2RlLgotCi1cZGVmXG5ld2NvZGVpbmRleCMxeyUKLSAgXGlmbGlua3MKLSAgICBcZXhwYW5kYWZ0ZXJcbmV3d3JpdGUgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKLSAgICBcb3Blbm91dCBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZSBcam9ibmFtZS4jMQotICBcZmkKLSAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JQotICAgIFxub2V4cGFuZFxkb2NvZGVpbmRleHsjMX19Ci19Ci0KLVxkZWZcZGVmY29kZWluZGV4e1xwYXJzZWFyZ1xuZXdjb2RlaW5kZXh9Ci0KLSUgQHN5bmluZGV4IGZvbyBiYXIgICAgbWFrZXMgaW5kZXggZm9vIGZlZWQgaW50byBpbmRleCBiYXIuCi0lIERvIHRoaXMgaW5zdGVhZCBvZiBAZGVmaW5kZXggZm9vIGlmIHlvdSBkb24ndCB3YW50IGl0IGFzIGEgc2VwYXJhdGUgaW5kZXguCi0lIFRoZSBcY2xvc2VvdXQgaGVscHMgcmVkdWNlIHVubmVjZXNzYXJ5IG9wZW4gZmlsZXM7IHRoZSBsaW1pdCBvbiB0aGUKLSUgQWNvcm4gUklTQyBPUyBpcyBhIG1lcmUgMTYgZmlsZXMuCi1cZGVmXHN5bmluZGV4IzEgIzIgeyUKLSAgXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclxzeW5pbmRleGZvb1xleHBhbmRhZnRlcj1cY3NuYW1lIzJpbmRmaWxlXGVuZGNzbmFtZQotICBcZXhwYW5kYWZ0ZXJcY2xvc2VvdXRcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQotICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWU9XHN5bmluZGV4Zm9vCi0gIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUgZGVmaW5lIFx4eHhpbmRleAotICAgIFxub2V4cGFuZFxkb2luZGV4eyMyfX0lCi19Ci0KLSUgQHN5bmNvZGVpbmRleCBmb28gYmFyICAgc2ltaWxhciwgYnV0IHB1dCBhbGwgZW50cmllcyBtYWRlIGZvciBpbmRleCBmb28KLSUgaW5zaWRlIEBjb2RlLgotXGRlZlxzeW5jb2RlaW5kZXgjMSAjMiB7JQotICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXHN5bmluZGV4Zm9vXGV4cGFuZGFmdGVyPVxjc25hbWUjMmluZGZpbGVcZW5kY3NuYW1lCi0gIFxleHBhbmRhZnRlclxjbG9zZW91dFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCi0gIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZT1cc3luaW5kZXhmb28KLSAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JSBkZWZpbmUgXHh4eGluZGV4Ci0gICAgXG5vZXhwYW5kXGRvY29kZWluZGV4eyMyfX0lCi19Ci0KLSUgRGVmaW5lIFxkb2luZGV4LCB0aGUgZHJpdmVyIGZvciBhbGwgXGZvb2luZGV4IG1hY3Jvcy4KLSUgQXJndW1lbnQgIzEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsaW5nIFxmb29pbmRleCBtYWNybywKLSUgIGFuZCBpdCBpcyAiZm9vIiwgdGhlIG5hbWUgb2YgdGhlIGluZGV4LgotCi0lIFxkb2luZGV4IGp1c3QgdXNlcyBccGFyc2Vhcmc7IGl0IGNhbGxzIFxkb2luZCBmb3IgdGhlIGFjdHVhbCB3b3JrLgotJSBUaGlzIGlzIGJlY2F1c2UgXGRvaW5kIGlzIG1vcmUgdXNlZnVsIHRvIGNhbGwgZnJvbSBvdGhlciBtYWNyb3MuCi0KLSUgVGhlcmUgaXMgYWxzbyBcZG9zdWJpbmQge2luZGV4fXt0b3BpY317c3VidG9waWN9Ci0lIHdoaWNoIG1ha2VzIGFuIGVudHJ5IGluIGEgdHdvLWxldmVsIGluZGV4IHN1Y2ggYXMgdGhlIG9wZXJhdGlvbiBpbmRleC4KLQotXGRlZlxkb2luZGV4IzF7XGVkZWZcaW5kZXhuYW1leyMxfVxwYXJzZWFyZ1xzaW5nbGVpbmRleGVyfQotXGRlZlxzaW5nbGVpbmRleGVyICMxe1xkb2luZHtcaW5kZXhuYW1lfXsjMX19Ci0KLSUgbGlrZSB0aGUgcHJldmlvdXMgdHdvLCBidXQgdGhleSBwdXQgQGNvZGUgYXJvdW5kIHRoZSBhcmd1bWVudC4KLVxkZWZcZG9jb2RlaW5kZXgjMXtcZWRlZlxpbmRleG5hbWV7IzF9XHBhcnNlYXJnXHNpbmdsZWNvZGVpbmRleGVyfQotXGRlZlxzaW5nbGVjb2RlaW5kZXhlciAjMXtcZG9pbmR7XGluZGV4bmFtZX17XGNvZGV7IzF9fX0KLQotXGRlZlxpbmRleGR1bW1pZXN7JQotXGRlZlwgeyB9JQotJSBUYWtlIGNhcmUgb2YgdGhlIHBsYWluIHRleCBhY2NlbnQgY29tbWFuZHMuCi1cZGVmXCJ7XHJlYWxiYWNrc2xhc2ggIn0lCi1cZGVmXGB7XHJlYWxiYWNrc2xhc2ggYH0lCi1cZGVmXCd7XHJlYWxiYWNrc2xhc2ggJ30lCi1cZGVmXF57XHJlYWxiYWNrc2xhc2ggXn0lCi1cZGVmXH57XHJlYWxiYWNrc2xhc2ggfn0lCi1cZGVmXD17XHJlYWxiYWNrc2xhc2ggPX0lCi1cZGVmXGJ7XHJlYWxiYWNrc2xhc2ggYn0lCi1cZGVmXGN7XHJlYWxiYWNrc2xhc2ggY30lCi1cZGVmXGR7XHJlYWxiYWNrc2xhc2ggZH0lCi1cZGVmXHV7XHJlYWxiYWNrc2xhc2ggdX0lCi1cZGVmXHZ7XHJlYWxiYWNrc2xhc2ggdn0lCi1cZGVmXEh7XHJlYWxiYWNrc2xhc2ggSH0lCi0lIFRha2UgY2FyZSBvZiB0aGUgcGxhaW4gdGV4IHNwZWNpYWwgRXVyb3BlYW4gbW9kaWZpZWQgbGV0dGVycy4KLVxkZWZcb2V7XHJlYWxiYWNrc2xhc2ggb2V9JQotXGRlZlxhZXtccmVhbGJhY2tzbGFzaCBhZX0lCi1cZGVmXGFhe1xyZWFsYmFja3NsYXNoIGFhfSUKLVxkZWZcT0V7XHJlYWxiYWNrc2xhc2ggT0V9JQotXGRlZlxBRXtccmVhbGJhY2tzbGFzaCBBRX0lCi1cZGVmXEFBe1xyZWFsYmFja3NsYXNoIEFBfSUKLVxkZWZcb3tccmVhbGJhY2tzbGFzaCBvfSUKLVxkZWZcT3tccmVhbGJhY2tzbGFzaCBPfSUKLVxkZWZcbHtccmVhbGJhY2tzbGFzaCBsfSUKLVxkZWZcTHtccmVhbGJhY2tzbGFzaCBMfSUKLVxkZWZcc3N7XHJlYWxiYWNrc2xhc2ggc3N9JQotJSBUYWtlIGNhcmUgb2YgdGV4aW5mbyBjb21tYW5kcyBsaWtlbHkgdG8gYXBwZWFyIGluIGFuIGluZGV4IGVudHJ5LgotJSAoTXVzdCBiZSBhIHdheSB0byBhdm9pZCBkb2luZyBleHBhbnNpb24gYXQgYWxsLCBhbmQgdGh1cyBub3QgaGF2ZSB0bwotJSBsYWJvcmlvdXNseSBsaXN0IGV2ZXJ5IHNpbmdsZSBjb21tYW5kIGhlcmUuKQotXGRlZlxAe0B9JSB3aWxsIGJlIEBAIHdoZW4gd2Ugc3dpdGNoIHRvIEAgYXMgZXNjYXBlIGNoYXIuCi0lXGxldFx7ID0gXGxicmFjZWNtZAotJVxsZXRcfSA9IFxyYnJhY2VjbWQKLVxkZWZcX3t7XHJlYWxiYWNrc2xhc2ggX319JQotXGRlZlx3e1xyZWFsYmFja3NsYXNoIHcgfSUKLVxkZWZcYmZ7XHJlYWxiYWNrc2xhc2ggYmYgfSUKLSVcZGVmXHJte1xyZWFsYmFja3NsYXNoIHJtIH0lCi1cZGVmXHNse1xyZWFsYmFja3NsYXNoIHNsIH0lCi1cZGVmXHNme1xyZWFsYmFja3NsYXNoIHNmfSUKLVxkZWZcdHR7XHJlYWxiYWNrc2xhc2ggdHR9JQotXGRlZlxndHJ7XHJlYWxiYWNrc2xhc2ggZ3RyfSUKLVxkZWZcbGVzc3tccmVhbGJhY2tzbGFzaCBsZXNzfSUKLVxkZWZcaGF0e1xyZWFsYmFja3NsYXNoIGhhdH0lCi1cZGVmXFRlWHtccmVhbGJhY2tzbGFzaCBUZVh9JQotXGRlZlxkb3Rze1xyZWFsYmFja3NsYXNoIGRvdHMgfSUKLVxkZWZccmVzdWx0e1xyZWFsYmFja3NsYXNoIHJlc3VsdH0lCi1cZGVmXGVxdWl2e1xyZWFsYmFja3NsYXNoIGVxdWl2fSUKLVxkZWZcZXhwYW5zaW9ue1xyZWFsYmFja3NsYXNoIGV4cGFuc2lvbn0lCi1cZGVmXHByaW50e1xyZWFsYmFja3NsYXNoIHByaW50fSUKLVxkZWZcZXJyb3J7XHJlYWxiYWNrc2xhc2ggZXJyb3J9JQotXGRlZlxwb2ludHtccmVhbGJhY2tzbGFzaCBwb2ludH0lCi1cZGVmXGNvcHlyaWdodHtccmVhbGJhY2tzbGFzaCBjb3B5cmlnaHR9JQotXGRlZlx0Y2xvc2UjIzF7XHJlYWxiYWNrc2xhc2ggdGNsb3NlIHsjIzF9fSUKLVxkZWZcY29kZSMjMXtccmVhbGJhY2tzbGFzaCBjb2RlIHsjIzF9fSUKLVxkZWZcZG90bGVzcyMjMXtccmVhbGJhY2tzbGFzaCBkb3RsZXNzIHsjIzF9fSUKLVxkZWZcc2FtcCMjMXtccmVhbGJhY2tzbGFzaCBzYW1wIHsjIzF9fSUKLVxkZWZcLCMjMXtccmVhbGJhY2tzbGFzaCAseyMjMX19JQotXGRlZlx0IyMxe1xyZWFsYmFja3NsYXNoIHQgeyMjMX19JQotXGRlZlxyIyMxe1xyZWFsYmFja3NsYXNoIHIgeyMjMX19JQotXGRlZlxpIyMxe1xyZWFsYmFja3NsYXNoIGkgeyMjMX19JQotXGRlZlxiIyMxe1xyZWFsYmFja3NsYXNoIGIgeyMjMX19JQotXGRlZlxzYyMjMXtccmVhbGJhY2tzbGFzaCBzYyB7IyMxfX0lCi1cZGVmXGNpdGUjIzF7XHJlYWxiYWNrc2xhc2ggY2l0ZSB7IyMxfX0lCi1cZGVmXGtleSMjMXtccmVhbGJhY2tzbGFzaCBrZXkgeyMjMX19JQotXGRlZlxmaWxlIyMxe1xyZWFsYmFja3NsYXNoIGZpbGUgeyMjMX19JQotXGRlZlx2YXIjIzF7XHJlYWxiYWNrc2xhc2ggdmFyIHsjIzF9fSUKLVxkZWZca2JkIyMxe1xyZWFsYmFja3NsYXNoIGtiZCB7IyMxfX0lCi1cZGVmXGRmbiMjMXtccmVhbGJhY2tzbGFzaCBkZm4geyMjMX19JQotXGRlZlxlbXBoIyMxe1xyZWFsYmFja3NsYXNoIGVtcGggeyMjMX19JQotJQotJSBIYW5kbGUgc29tZSBjYXNlcyBvZiBAdmFsdWUgLS0gd2hlcmUgdGhlIHZhcmlhYmxlIG5hbWUgZG9lcyBub3QKLSUgY29udGFpbiAtIG9yIF8sIGFuZCB0aGUgdmFsdWUgZG9lcyBub3QgY29udGFpbiBhbnkKLSUgKG5vbi1mdWxseS1leHBhbmRhYmxlKSBjb21tYW5kcy4KLVxsZXRcdmFsdWUgPSBcZXhwYW5kYWJsZXZhbHVlCi0lCi1cdW5zZXBzcGFjZXMKLX0KLQotJSBJZiBhbiBpbmRleCBjb21tYW5kIGlzIHVzZWQgaW4gYW4gQGV4YW1wbGUgZW52aXJvbm1lbnQsIGFueSBzcGFjZXMKLSUgdGhlcmVpbiBzaG91bGQgYmVjb21lIHJlZ3VsYXIgc3BhY2VzIGluIHRoZSByYXcgaW5kZXggZmlsZSwgbm90IHRoZQotJSBleHBhbnNpb24gb2YgXHRpZSAoXFxsZWF2ZXZtb2RlIFxwZW5hbHR5IFxATSBcICkuCi17XG9iZXlzcGFjZXMKLSBcZ2RlZlx1bnNlcHNwYWNlc3tcb2JleXNwYWNlc1xsZXQgPVxzcGFjZX19Ci0KLSUgXGluZGV4bm9mb250cyBuby1vcHMgYWxsIGZvbnQtY2hhbmdlIGNvbW1hbmRzLgotJSBUaGlzIGlzIHVzZWQgd2hlbiBvdXRwdXR0aW5nIHRoZSBzdHJpbmdzIHRvIHNvcnQgdGhlIGluZGV4IGJ5LgotXGRlZlxpbmRleGR1bW15Zm9udCMxeyMxfQotXGRlZlxpbmRleGR1bW15dGV4e1RlWH0KLVxkZWZcaW5kZXhkdW1teWRvdHN7Li4ufQotCi1cZGVmXGluZGV4bm9mb250c3slCi0lIEp1c3QgaWdub3JlIGFjY2VudHMuCi1cbGV0XCw9XGluZGV4ZHVtbXlmb250Ci1cbGV0XCI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGA9XGluZGV4ZHVtbXlmb250Ci1cbGV0XCc9XGluZGV4ZHVtbXlmb250Ci1cbGV0XF49XGluZGV4ZHVtbXlmb250Ci1cbGV0XH49XGluZGV4ZHVtbXlmb250Ci1cbGV0XD09XGluZGV4ZHVtbXlmb250Ci1cbGV0XGI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGM9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHU9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHY9XGluZGV4ZHVtbXlmb250Ci1cbGV0XEg9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGRvdGxlc3M9XGluZGV4ZHVtbXlmb250Ci0lIFRha2UgY2FyZSBvZiB0aGUgcGxhaW4gdGV4IHNwZWNpYWwgRXVyb3BlYW4gbW9kaWZpZWQgbGV0dGVycy4KLVxkZWZcb2V7b2V9JQotXGRlZlxhZXthZX0lCi1cZGVmXGFhe2FhfSUKLVxkZWZcT0V7T0V9JQotXGRlZlxBRXtBRX0lCi1cZGVmXEFBe0FBfSUKLVxkZWZcb3tvfSUKLVxkZWZcT3tPfSUKLVxkZWZcbHtsfSUKLVxkZWZcTHtMfSUKLVxkZWZcc3N7c3N9JQotXGxldFx3PVxpbmRleGR1bW15Zm9udAotXGxldFx0PVxpbmRleGR1bW15Zm9udAotXGxldFxyPVxpbmRleGR1bW15Zm9udAotXGxldFxpPVxpbmRleGR1bW15Zm9udAotXGxldFxiPVxpbmRleGR1bW15Zm9udAotXGxldFxlbXBoPVxpbmRleGR1bW15Zm9udAotXGxldFxzdHJvbmc9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGNpdGU9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHNjPVxpbmRleGR1bW15Zm9udAotJURvbid0IG5vLW9wIFx0dCwgc2luY2UgaXQgaXNuJ3QgYSB1c2VyLWxldmVsIGNvbW1hbmQKLSUgYW5kIGlzIHVzZWQgaW4gdGhlIGRlZmluaXRpb25zIG9mIHRoZSBhY3RpdmUgY2hhcnMgbGlrZSA8LCA+LCB8Li4uCi0lXGxldFx0dD1caW5kZXhkdW1teWZvbnQKLVxsZXRcdGNsb3NlPVxpbmRleGR1bW15Zm9udAotXGxldFxjb2RlPVxpbmRleGR1bW15Zm9udAotXGxldFxmaWxlPVxpbmRleGR1bW15Zm9udAotXGxldFxzYW1wPVxpbmRleGR1bW15Zm9udAotXGxldFxrYmQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGtleT1caW5kZXhkdW1teWZvbnQKLVxsZXRcdmFyPVxpbmRleGR1bW15Zm9udAotXGxldFxUZVg9XGluZGV4ZHVtbXl0ZXgKLVxsZXRcZG90cz1caW5kZXhkdW1teWRvdHMKLVxkZWZcQHtAfSUKLX0KLQotJSBUbyBkZWZpbmUgXHJlYWxiYWNrc2xhc2gsIHdlIG11c3QgbWFrZSBcIG5vdCBiZSBhbiBlc2NhcGUuCi0lIFdlIG11c3QgZmlyc3QgbWFrZSBhbm90aGVyIGNoYXJhY3RlciAoQCkgYW4gZXNjYXBlCi0lIHNvIHdlIGRvIG5vdCBiZWNvbWUgdW5hYmxlIHRvIGRvIGEgZGVmaW5pdGlvbi4KLQote1xjYXRjb2RlYFxAPTAgXGNhdGNvZGVgXFw9XG90aGVyCi0gQGdkZWZAcmVhbGJhY2tzbGFzaHtcfX0KLQotXGxldFxpbmRleGJhY2tzbGFzaD0wICAlb3ZlcnJpZGRlbiBkdXJpbmcgXHByaW50aW5kZXguCi1cbGV0XFNFVG1hcmdpbmluZGV4PVxyZWxheCAlIHB1dCBpbmRleCBlbnRyaWVzIGluIG1hcmdpbiAodW5kb2N1bWVudGVkKT8KLQotJSBGb3IgXGlmeCBjb21wYXJpc29ucy4KLVxkZWZcZW1wdHltYWNyb3tcZW1wdHl9Ci0KLSUgTW9zdCBpbmRleCBlbnRyaWVzIGdvIHRocm91Z2ggaGVyZSwgYnV0IFxkb3N1YmluZCBpcyB0aGUgZ2VuZXJhbCBjYXNlLgotJSAKLVxkZWZcZG9pbmQjMSMye1xkb3N1YmluZHsjMX17IzJ9XGVtcHR5fQotCi0lIFdvcmtob3JzZSBmb3IgYWxsIFxmb29pbmRleGVzLgotJSAjMSBpcyBuYW1lIG9mIGluZGV4LCAjMiBpcyBzdHVmZiB0byBwdXQgdGhlcmUsICMzIGlzIHN1YmVudHJ5IC0tCi0lIFxlbXB0eSBpZiBjYWxsZWQgZnJvbSBcZG9pbmQsIGFzIHdlIHVzdWFsbHkgYXJlLiAgVGhlIG1haW4gZXhjZXB0aW9uCi0lIGlzIHdpdGggZGVmdW5zLCB3aGljaCBjYWxsIHVzIGRpcmVjdGx5LgotJSAKLVxkZWZcZG9zdWJpbmQjMSMyIzN7JQotICAlIFB1dCB0aGUgaW5kZXggZW50cnkgaW4gdGhlIG1hcmdpbiBpZiBkZXNpcmVkLgotICBcaWZ4XFNFVG1hcmdpbmluZGV4XHJlbGF4XGVsc2UKLSAgICBcaW5zZXJ0XG1hcmdpbntcaGJveHtcdnJ1bGUgaGVpZ2h0OHB0IGRlcHRoM3B0IHdpZHRoMHB0ICMyfX0lCi0gIFxmaQotICB7JQotICAgIFxjb3VudDI1NT1cbGFzdHBlbmFsdHkKLSAgICB7JQotICAgICAgXGluZGV4ZHVtbWllcyAlIE11c3QgZG8gdGhpcyBoZXJlLCBzaW5jZSBcYmYsIGV0YyBleHBhbmQgYXQgdGhpcyBzdGFnZQotICAgICAgXGVzY2FwZWNoYXI9YFxcCi0gICAgICB7JQotICAgICAgICBcbGV0XGZvbGlvID0gMCUgV2Ugd2lsbCBleHBhbmQgYWxsIG1hY3JvcyBub3cgRVhDRVBUIFxmb2xpby4KLSAgICAgICAgXGRlZlxyYXdiYWNrc2xhc2h4eHtcaW5kZXhiYWNrc2xhc2h9JSBcaW5kZXhiYWNrc2xhc2ggaXNuJ3QgZGVmaW5lZCBub3cKLSAgICAgICAgJSBzbyBpdCB3aWxsIGJlIG91dHB1dCBhcyBpczsgYW5kIGl0IHdpbGwgcHJpbnQgYXMgYmFja3NsYXNoLgotICAgICAgICAlCi0gICAgICAgIFxkZWZcdGhpcmRhcmd7IzN9JQotICAgICAgICAlCi0gICAgICAgICUgSWYgdGhpcmQgYXJnIGlzIHByZXNlbnQsIHByZWNlZGUgaXQgd2l0aCBzcGFjZSBpbiBzb3J0IGtleS4KLSAgICAgICAgXGlmeFx0aGlyZGFyZ1xlbXB0eW1hY3JvCi0gICAgICAgICAgXGxldFxzdWJlbnRyeSA9IFxlbXB0eQotICAgICAgICBcZWxzZQotICAgICAgICAgIFxkZWZcc3ViZW50cnl7ICMzfSUKLSAgICAgICAgXGZpCi0gICAgICAgICUKLSAgICAgICAgJSBGaXJzdCBwcm9jZXNzIHRoZSBpbmRleC1zdHJpbmcgd2l0aCBhbGwgZm9udCBjb21tYW5kcyB0dXJuZWQgb2ZmCi0gICAgICAgICUgdG8gZ2V0IHRoZSBzdHJpbmcgdG8gc29ydCBieS4KLSAgICAgICAge1xpbmRleG5vZm9udHMgXHhkZWZcaW5kZXhzb3J0dG1weyMyXHN1YmVudHJ5fX0lCi0gICAgICAgICUKLSAgICAgICAgJSBOb3cgcHJvZHVjZSB0aGUgY29tcGxldGUgaW5kZXggZW50cnksIHdpdGggYm90aCB0aGUgc29ydCBrZXkgYW5kIHRoZQotICAgICAgICAlIG9yaWdpbmFsIHRleHQsIGluY2x1ZGluZyBhbnkgZm9udCBjb21tYW5kcy4KLSAgICAgICAgXHRva3MwID0geyMyfSUKLSAgICAgICAgXGVkZWZcdGVtcHslCi0gICAgICAgICAgXHdyaXRlXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWV7JQotICAgICAgICAgICAgXHJlYWxiYWNrc2xhc2ggZW50cnl7XGluZGV4c29ydHRtcH17XGZvbGlvfXtcdGhlXHRva3MwfX0lCi0gICAgICAgIH0lCi0gICAgICAgICUKLSAgICAgICAgJSBJZiB0aGlyZCAoc3ViZW50cnkpIGFyZyBpcyBwcmVzZW50LCBhZGQgaXQgdG8gdGhlIGluZGV4IHN0cmluZy4KLSAgICAgICAgXGlmeFx0aGlyZGFyZ1xlbXB0eW1hY3JvIFxlbHNlCi0gICAgICAgICAgXHRva3MwID0geyMzfSUKLSAgICAgICAgICBcZWRlZlx0ZW1we1x0ZW1we1x0aGVcdG9rczB9fSUKLSAgICAgICAgXGZpCi0gICAgICAgICUKLSAgICAgICAgJSBJZiBhIHNraXAgaXMgdGhlIGxhc3QgdGhpbmcgb24gdGhlIGxpc3Qgbm93LCBwcmVzZXJ2ZSBpdAotICAgICAgICAlIGJ5IGJhY2tpbmcgdXAgYnkgXGxhc3Rza2lwLCBkb2luZyB0aGUgXHdyaXRlLCB0aGVuIGluc2VydGluZwotICAgICAgICAlIHRoZSBza2lwIGFnYWluLiAgT3RoZXJ3aXNlLCB0aGUgd2hhdHNpdCBnZW5lcmF0ZWQgYnkgdGhlCi0gICAgICAgICUgXHdyaXRlIHdpbGwgbWFrZSBcbGFzdHNraXAgemVyby4gIFRoZSByZXN1bHQgaXMgdGhhdCBzZXF1ZW5jZXMKLSAgICAgICAgJSBsaWtlIHRoaXM6Ci0gICAgICAgICUgQGVuZCBkZWZ1bgotICAgICAgICAlIEB0aW5kZXggd2hhdGV2ZXIKLSAgICAgICAgJSBAZGVmdW4gLi4uCi0gICAgICAgICUgd2lsbCBoYXZlIGV4dHJhIHNwYWNlIGluc2VydGVkLCBiZWNhdXNlIHRoZSBcbWVkYnJlYWsgaW4gdGhlCi0gICAgICAgICUgc3RhcnQgb2YgdGhlIEBkZWZ1biB3b24ndCBzZWUgdGhlIHNraXAgaW5zZXJ0ZWQgYnkgdGhlIEBlbmQgb2YKLSAgICAgICAgJSB0aGUgcHJldmlvdXMgZGVmdW4uCi0gICAgICAgICUgCi0gICAgICAgICUgQnV0IGRvbid0IGRvIGFueSBvZiB0aGlzIGlmIHdlJ3JlIG5vdCBpbiB2ZXJ0aWNhbCBtb2RlLiAgV2UKLSAgICAgICAgJSBkb24ndCB3YW50IHRvIGRvIGEgXHZza2lwIGFuZCBwcmVtYXR1cmVseSBlbmQgYSBwYXJhZ3JhcGguCi0gICAgICAgICUgCi0gICAgICAgICUgQXZvaWQgcGFnZSBicmVha3MgZHVlIHRvIHRoZXNlIGV4dHJhIHNraXBzLCB0b28uCi0gICAgICAgICUgCi0gICAgICAgIFxpZmxpbmtzCi0gICAgICAgICAgXGlmdm1vZGUKLSAgICAgICAgICAgIFxza2lwMCA9IFxsYXN0c2tpcAotICAgICAgICAgICAgXGlmZGltXGxhc3Rza2lwID0gMHB0IFxlbHNlIFxub2JyZWFrXHZza2lwLVxsYXN0c2tpcCBcZmkKLSAgICAgICAgICBcZmkKLSAgICAgICAgICAlCi0gICAgICAgICAgXHRlbXAgJSBkbyB0aGUgd3JpdGUKLSAgICAgICAgICAlCi0gICAgICAgICAgJSAKLSAgICAgICAgICBcaWZ2bW9kZSBcaWZkaW1cc2tpcDAgPSAwcHQgXGVsc2UgXG5vYnJlYWtcdnNraXBcc2tpcDAgXGZpIFxmaQotICAgICAgICBcZmkKLSAgICAgIH0lCi0gICAgfSUKLSAgICBccGVuYWx0eVxjb3VudDI1NQotICB9JQotfQotCi0lIFRoZSBpbmRleCBlbnRyeSB3cml0dGVuIGluIHRoZSBmaWxlIGFjdHVhbGx5IGxvb2tzIGxpa2UKLSUgIFxlbnRyeSB7c29ydHN0cmluZ317cGFnZX17dG9waWN9Ci0lIG9yCi0lICBcZW50cnkge3NvcnRzdHJpbmd9e3BhZ2V9e3RvcGljfXtzdWJ0b3BpY30KLSUgVGhlIHRleGluZGV4IHByb2dyYW0gcmVhZHMgaW4gdGhlc2UgZmlsZXMgYW5kIHdyaXRlcyBmaWxlcwotJSBjb250YWluaW5nIHRoZXNlIGtpbmRzIG9mIGxpbmVzOgotJSAgXGluaXRpYWwge2N9Ci0lICAgICBiZWZvcmUgdGhlIGZpcnN0IHRvcGljIHdob3NlIGluaXRpYWwgaXMgYwotJSAgXGVudHJ5IHt0b3BpY317cGFnZWxpc3R9Ci0lICAgICBmb3IgYSB0b3BpYyB0aGF0IGlzIHVzZWQgd2l0aG91dCBzdWJ0b3BpY3MKLSUgIFxwcmltYXJ5IHt0b3BpY30KLSUgICAgIGZvciB0aGUgYmVnaW5uaW5nIG9mIGEgdG9waWMgdGhhdCBpcyB1c2VkIHdpdGggc3VidG9waWNzCi0lICBcc2Vjb25kYXJ5IHtzdWJ0b3BpY317cGFnZWxpc3R9Ci0lICAgICBmb3IgZWFjaCBzdWJ0b3BpYy4KLQotJSBEZWZpbmUgdGhlIHVzZXItYWNjZXNzaWJsZSBpbmRleGluZyBjb21tYW5kcwotJSBAZmluZGV4LCBAdmluZGV4LCBAa2luZGV4LCBAY2luZGV4LgotCi1cZGVmXGZpbmRleCB7XGZuaW5kZXh9Ci1cZGVmXGtpbmRleCB7XGt5aW5kZXh9Ci1cZGVmXGNpbmRleCB7XGNwaW5kZXh9Ci1cZGVmXHZpbmRleCB7XHZyaW5kZXh9Ci1cZGVmXHRpbmRleCB7XHRwaW5kZXh9Ci1cZGVmXHBpbmRleCB7XHBnaW5kZXh9Ci0KLVxkZWZcY2luZGV4c3ViIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcY2luZGV4c3VifQote1xvYmV5bGluZXMgJQotXGdkZWZcY2luZGV4c3ViICIjMSIgIzJeXk17XGVuZGdyb3VwICUKLVxkb3N1YmluZHtjcH17IzJ9eyMxfX19Ci0KLSUgRGVmaW5lIHRoZSBtYWNyb3MgdXNlZCBpbiBmb3JtYXR0aW5nIG91dHB1dCBvZiB0aGUgc29ydGVkIGluZGV4IG1hdGVyaWFsLgotCi0lIEBwcmludGluZGV4IGNhdXNlcyBhIHBhcnRpY3VsYXIgaW5kZXggKHRoZSA/P3MgZmlsZSkgdG8gZ2V0IHByaW50ZWQuCi0lIEl0IGRvZXMgbm90IHByaW50IGFueSBjaGFwdGVyIGhlYWRpbmcgKHVzdWFsbHkgYW4gQHVubnVtYmVyZWQpLgotJQotXGRlZlxwcmludGluZGV4e1xwYXJzZWFyZ1xkb3ByaW50aW5kZXh9Ci1cZGVmXGRvcHJpbnRpbmRleCMxe1xiZWdpbmdyb3VwCi0gIFxkb2JyZWFrIFxjaGFwaGVhZGluZ3NraXB7MTAwMDB9JQotICAlCi0gIFxpbmRleGZvbnRzIFxybQotICBcdG9sZXJhbmNlID0gOTUwMAotICBcaW5kZXhicmVha3MKLSAgJQotICAlIFNlZSBpZiB0aGUgaW5kZXggZmlsZSBleGlzdHMgYW5kIGlzIG5vbmVtcHR5LgotICAlIENoYW5nZSBjYXRjb2RlIG9mIEAgaGVyZSBzbyB0aGF0IGlmIHRoZSBpbmRleCBmaWxlIGNvbnRhaW5zCi0gICUgXGluaXRpYWwge0B9Ci0gICUgYXMgaXRzIGZpcnN0IGxpbmUsIFRlWCBkb2Vzbid0IGNvbXBsYWluIGFib3V0IG1pc21hdGNoZWQgYnJhY2VzCi0gICUgKGJlY2F1c2UgaXQgdGhpbmtzIEB9IGlzIGEgY29udHJvbCBzZXF1ZW5jZSkuCi0gIFxjYXRjb2RlYFxAID0gMTEKLSAgXG9wZW5pbiAxIFxqb2JuYW1lLiMxcwotICBcaWZlb2YgMQotICAgICUgXGVuZGRvdWJsZWNvbHVtbnMgZ2V0cyBjb25mdXNlZCBpZiB0aGVyZSBpcyBubyB0ZXh0IGluIHRoZSBpbmRleCwKLSAgICAlIGFuZCBpdCBsb3NlcyB0aGUgY2hhcHRlciB0aXRsZSBhbmQgdGhlIGF1eCBmaWxlIGVudHJpZXMgZm9yIHRoZQotICAgICUgaW5kZXguICBUaGUgZWFzaWVzdCB3YXkgdG8gcHJldmVudCB0aGlzIHByb2JsZW0gaXMgdG8gbWFrZSBzdXJlCi0gICAgJSB0aGVyZSBpcyBzb21lIHRleHQuCi0gICAgKEluZGV4IGlzIG5vbmV4aXN0ZW50KQotICBcZWxzZQotICAgICUKLSAgICAlIElmIHRoZSBpbmRleCBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHksIHRoZW4gXG9wZW5pbiBsZWF2ZXMgXGlmZW9mCi0gICAgJSBmYWxzZS4gIFdlIGhhdmUgdG8gbWFrZSBUZVggdHJ5IHRvIHJlYWQgc29tZXRoaW5nIGZyb20gdGhlIGZpbGUsIHNvCi0gICAgJSBpdCBjYW4gZGlzY292ZXIgaWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gaXQuCi0gICAgXHJlYWQgMSB0byBcdGVtcAotICAgIFxpZmVvZiAxCi0gICAgICAoSW5kZXggaXMgZW1wdHkpCi0gICAgXGVsc2UKLSAgICAgICUgSW5kZXggZmlsZXMgYXJlIGFsbW9zdCBUZXhpbmZvIHNvdXJjZSwgYnV0IHdlIHVzZSBcIGFzIHRoZSBlc2NhcGUKLSAgICAgICUgY2hhcmFjdGVyLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBALCBidXQgdGhhdCdzIHRvbyBiaWcgYSBjaGFuZ2UKLSAgICAgICUgdG8gbWFrZSByaWdodCBub3cuCi0gICAgICBcZGVmXGluZGV4YmFja3NsYXNoe1xyYXdiYWNrc2xhc2h4eH0lCi0gICAgICBcY2F0Y29kZWBcXCA9IDAKLSAgICAgIFxlc2NhcGVjaGFyID0gYFxcCi0gICAgICBcYmVnaW5kb3VibGVjb2x1bW5zCi0gICAgICBcaW5wdXQgXGpvYm5hbWUuIzFzCi0gICAgICBcZW5kZG91YmxlY29sdW1ucwotICAgIFxmaQotICBcZmkKLSAgXGNsb3NlaW4gMQotXGVuZGdyb3VwfQotCi0lIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBieSB0aGUgc29ydGVkIGluZGV4IGZpbGUgaXRzZWxmLgotJSBDaGFuZ2UgdGhlbSB0byBjb250cm9sIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbmRleC4KLQotXGRlZlxpbml0aWFsIzF7eyUKLSAgJSBTb21lIG1pbm9yIGZvbnQgY2hhbmdlcyBmb3IgdGhlIHNwZWNpYWwgY2hhcmFjdGVycy4KLSAgXGxldFx0ZW50dD1cc2VjdHQgXGxldFx0dD1cc2VjdHQgXGxldFxzZj1cc2VjdHQKLSAgJQotICAlIFJlbW92ZSBhbnkgZ2x1ZSB3ZSBtYXkgaGF2ZSwgd2UnbGwgYmUgaW5zZXJ0aW5nIG91ciBvd24uCi0gIFxyZW1vdmVsYXN0c2tpcAotICAlIAotICAlIFdlIGxpa2UgYnJlYWtzIGJlZm9yZSB0aGUgaW5kZXggaW5pdGlhbHMsIHNvIGluc2VydCBhIGJvbnVzLgotICBccGVuYWx0eSAtMzAwCi0gICUKLSAgJSBUeXBlc2V0IHRoZSBpbml0aWFsLiAgTWFraW5nIHRoaXMgYWRkIHVwIHRvIGEgd2hvbGUgbnVtYmVyIG9mCi0gICUgYmFzZWxpbmVza2lwcyBpbmNyZWFzZXMgdGhlIGNoYW5jZSBvZiB0aGUgZG90cyBsaW5pbmcgdXAgZnJvbSBjb2x1bW4KLSAgJSB0byBjb2x1bW4uICBJdCBzdGlsbCB3b24ndCBvZnRlbiBiZSBwZXJmZWN0LCBiZWNhdXNlIG9mIHRoZSBzdHJldGNoCi0gICUgd2UgbmVlZCBiZWZvcmUgZWFjaCBlbnRyeSwgYnV0IGl0J3MgYmV0dGVyLgotICAlIAotICAlIE5vIHNocmluayBiZWNhdXNlIGl0IGNvbmZ1c2VzIFxiYWxhbmNlY29sdW1ucy4KLSAgXHZza2lwIDEuNjdcYmFzZWxpbmVza2lwIHBsdXMgLjVcYmFzZWxpbmVza2lwCi0gIFxsZWZ0bGluZXtcc2VjYmYgIzF9JQotICBcdnNraXAgLjMzXGJhc2VsaW5lc2tpcCBwbHVzIC4xXGJhc2VsaW5lc2tpcAotICAlCi0gICUgRG8gb3VyIGJlc3Qgbm90IHRvIGJyZWFrIGFmdGVyIHRoZSBpbml0aWFsLgotICBcbm9icmVhawotfX0KLQotJSBUaGlzIHR5cGVzZXRzIGEgcGFyYWdyYXBoIGNvbnNpc3Rpbmcgb2YgIzEsIGRvdCBsZWFkZXJzLCBhbmQgdGhlbiAjMgotJSBmbHVzaCB0byB0aGUgcmlnaHQgbWFyZ2luLiAgSXQgaXMgdXNlZCBmb3IgaW5kZXggYW5kIHRhYmxlIG9mIGNvbnRlbnRzCi0lIGVudHJpZXMuICBUaGUgcGFyYWdyYXBoIGlzIGluZGVudGVkIGJ5IFxsZWZ0c2tpcC4KLSUKLVxkZWZcZW50cnkjMSMye1xiZWdpbmdyb3VwCi0gICUKLSAgJSBTdGFydCBhIG5ldyBwYXJhZ3JhcGggaWYgbmVjZXNzYXJ5LCBzbyBvdXIgYXNzaWdubWVudHMgYmVsb3cgY2FuJ3QKLSAgJSBhZmZlY3QgcHJldmlvdXMgdGV4dC4KLSAgXHBhcgotICAlCi0gICUgRG8gbm90IGZpbGwgb3V0IHRoZSBsYXN0IGxpbmUgd2l0aCB3aGl0ZSBzcGFjZS4KLSAgXHBhcmZpbGxza2lwID0gMGluCi0gICUKLSAgJSBObyBleHRyYSBzcGFjZSBhYm92ZSB0aGlzIHBhcmFncmFwaC4KLSAgXHBhcnNraXAgPSAwaW4KLSAgJQotICAlIERvIG5vdCBwcmVmZXIgYSBzZXBhcmF0ZSBsaW5lIGVuZGluZyB3aXRoIGEgaHlwaGVuIHRvIGZld2VyIGxpbmVzLgotICBcZmluYWxoeXBoZW5kZW1lcml0cyA9IDAKLSAgJQotICAlIFxoYW5naW5kZW50IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgZW50cnkgdGV4dCBhbmQgcGFnZSBudW1iZXIKLSAgJSBkb24ndCBib3RoIGZpdCBvbiBvbmUgbGluZS4gIEluIHRoYXQgY2FzZSwgYm9iIHN1Z2dlc3RzIHN0YXJ0aW5nIHRoZQotICAlIGRvdHMgcHJldHR5IGZhciBvdmVyIG9uIHRoZSBsaW5lLiAgVW5mb3J0dW5hdGVseSwgYSBsYXJnZQotICAlIGluZGVudGF0aW9uIGxvb2tzIHdyb25nIHdoZW4gdGhlIGVudHJ5IHRleHQgaXRzZWxmIGlzIGJyb2tlbiBhY3Jvc3MKLSAgJSBsaW5lcy4gIFNvIHdlIHVzZSBhIHNtYWxsIGluZGVudGF0aW9uIGFuZCBwdXQgdXAgd2l0aCBsb25nIGxlYWRlcnMuCi0gICUKLSAgJSBcaGFuZ2FmdGVyIGlzIHJlc2V0IHRvIDEgKHdoaWNoIGlzIHRoZSB2YWx1ZSB3ZSB3YW50KSBhdCB0aGUgc3RhcnQKLSAgJSBvZiBlYWNoIHBhcmFncmFwaCwgc28gd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGF0LgotICBcaGFuZ2luZGVudCA9IDJlbQotICAlCi0gICUgV2hlbiB0aGUgZW50cnkgdGV4dCBuZWVkcyB0byBiZSBicm9rZW4sIGp1c3QgZmlsbCBvdXQgdGhlIGZpcnN0IGxpbmUKLSAgJSB3aXRoIGJsYW5rIHNwYWNlLgotICBccmlnaHRza2lwID0gMHB0IHBsdXMxZmlsCi0gICUKLSAgJSBBIGJpdCBvZiBzdHJldGNoIGJlZm9yZSBlYWNoIGVudHJ5IGZvciB0aGUgYmVuZWZpdCBvZiBiYWxhbmNpbmcgY29sdW1ucy4KLSAgXHZza2lwIDBwdCBwbHVzMXB0Ci0gICUKLSAgJSBTdGFydCBhIGBgcGFyYWdyYXBoJycgZm9yIHRoZSBpbmRleCBlbnRyeSBzbyB0aGUgbGluZSBicmVha2luZwotICAlIHBhcmFtZXRlcnMgd2UndmUgc2V0IGFib3ZlIHdpbGwgaGF2ZSBhbiBlZmZlY3QuCi0gIFxub2luZGVudAotICAlCi0gICUgSW5zZXJ0IHRoZSB0ZXh0IG9mIHRoZSBpbmRleCBlbnRyeS4gIFRlWCB3aWxsIGRvIGxpbmUtYnJlYWtpbmcgb24gaXQuCi0gICMxJQotICAlIFRoZSBmb2xsb3dpbmcgaXMga2x1ZGdlZCB0byBub3Qgb3V0cHV0IGEgbGluZSBvZiBkb3RzIGluIHRoZSBpbmRleCBpZgotICAlIHRoZXJlIGFyZSBubyBwYWdlIG51bWJlcnMuICBUaGUgbmV4dCBwZXJzb24gd2hvIGJyZWFrcyB0aGlzIHdpbGwgYmUKLSAgJSBjdXJzZWQgYnkgYSBVbml4IGRhZW1vbi4KLSAgXGRlZlx0ZW1wYXt7XHJtIH19JQotICBcZGVmXHRlbXBieyMyfSUKLSAgXGVkZWZcdGVtcGN7XHRlbXBhfSUKLSAgXGVkZWZcdGVtcGR7XHRlbXBifSUKLSAgXGlmeFx0ZW1wY1x0ZW1wZFwgXGVsc2UlCi0gICAgJQotICAgICUgSWYgd2UgbXVzdCwgcHV0IHRoZSBwYWdlIG51bWJlciBvbiBhIGxpbmUgb2YgaXRzIG93biwgYW5kIGZpbGwgb3V0Ci0gICAgJSB0aGlzIGxpbmUgd2l0aCBibGFuayBzcGFjZS4gIChUaGUgXGhmaWwgaXMgb3ZlcndoZWxtZWQgd2l0aCB0aGUKLSAgICAlIGZpbGwgbGVhZGVycyBnbHVlIGluIFxpbmRleGRvdGZpbGwgaWYgdGhlIHBhZ2UgbnVtYmVyIGRvZXMgZml0LikKLSAgICBcaGZpbFxwZW5hbHR5NTAKLSAgICBcbnVsbFxub2JyZWFrXGluZGV4ZG90ZmlsbCAlIEhhdmUgbGVhZGVycyBiZWZvcmUgdGhlIHBhZ2UgbnVtYmVyLgotICAgICUKLSAgICAlIFRoZSBgXCAnIGhlcmUgaXMgcmVtb3ZlZCBieSB0aGUgaW1wbGljaXQgXHVuc2tpcCB0aGF0IFRlWCBkb2VzIGFzCi0gICAgJSBwYXJ0IG9mICh0aGUgcHJpbWl0aXZlKSBccGFyLiAgV2l0aG91dCBpdCwgYSBzcHVyaW91cyB1bmRlcmZ1bGwKLSAgICAlIFxoYm94IGVuc3Vlcy4KLSAgICBcICMyJSBUaGUgcGFnZSBudW1iZXIgZW5kcyB0aGUgcGFyYWdyYXBoLgotICBcZmklCi0gIFxwYXIKLVxlbmRncm91cH0KLQotJSBMaWtlIFxkb3RmaWxsIGV4Y2VwdCB0YWtlcyBhdCBsZWFzdCAxIGVtLgotXGRlZlxpbmRleGRvdGZpbGx7XGNsZWFkZXJzCi0gIFxoYm94eyRcbWF0aHN1cnJvdW5kPTBwdCBcbWtlcm4xLjVtdSAke1xpdCAufSQgXG1rZXJuMS41bXUkfVxoc2tpcCAxZW0gcGx1cyAxZmlsbH0KLQotXGRlZlxwcmltYXJ5ICMxe1xsaW5leyMxXGhmaWx9fQotCi1cbmV3c2tpcFxzZWNvbmRhcnlpbmRlbnQgXHNlY29uZGFyeWluZGVudD0wLjVjbQotCi1cZGVmXHNlY29uZGFyeSAjMSMyewote1xwYXJmaWxsc2tpcD0waW4gXHBhcnNraXA9MGluCi1caGFuZ2luZGVudCA9MWluIFxoYW5nYWZ0ZXI9MQotXG5vaW5kZW50XGhza2lwXHNlY29uZGFyeWluZGVudFxoYm94eyMxfVxpbmRleGRvdGZpbGwgIzJccGFyCi19fQotCi0lIERlZmluZSB0d28tY29sdW1uIG1vZGUsIHdoaWNoIHdlIHVzZSB0byB0eXBlc2V0IGluZGV4ZXMuCi0lIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaywgcGFnZSA0MTYsIHdoaWNoIGlzIHRvIHNheSwKLSUgdGhlIG1hbm1hYy50ZXggZm9ybWF0IHVzZWQgdG8gcHJpbnQgdGhlIFRlWGJvb2sgaXRzZWxmLgotXGNhdGNvZGVgXEA9MTEKLQotXG5ld2JveFxwYXJ0aWFscGFnZQotXG5ld2RpbWVuXGRvdWJsZWNvbHVtbmhzaXplCi0KLVxkZWZcYmVnaW5kb3VibGVjb2x1bW5ze1xiZWdpbmdyb3VwICUgZW5kZWQgYnkgXGVuZGRvdWJsZWNvbHVtbnMKLSAgJSBHcmFiIGFueSBzaW5nbGUtY29sdW1uIG1hdGVyaWFsIGFib3ZlIHVzLgotICBcb3V0cHV0ID0ge1xnbG9iYWxcc2V0Ym94XHBhcnRpYWxwYWdlID0gXHZib3h7JQotICAgICUgCi0gICAgJSBIZXJlIGlzIGEgcG9zc2liaWxpdHkgbm90IGZvcmVzZWVuIGluIG1hbm1hYzogaWYgd2UgYWNjdW11bGF0ZSBhCi0gICAgJSB3aG9sZSBsb3Qgb2YgbWF0ZXJpYWwsIHdlIG1pZ2h0IGVuZCB1cCBjYWxsaW5nIHRoaXMgXG91dHB1dAotICAgICUgcm91dGluZSB0d2ljZSBpbiBhIHJvdyAoc2VlIHRoZSBkb3VibGVjb2wtbG9zZSB0ZXN0LCB3aGljaCBpcwotICAgICUgZXNzZW50aWFsbHkgYSBjb3VwbGUgb2YgaW5kZXhlcyB3aXRoIEBzZXRjaGFwdGVybmV3cGFnZSBvZmYpLiAgSW4KLSAgICAlIHRoYXQgY2FzZSwgd2UgbXVzdCBwcmV2ZW50IHRoZSBzZWNvbmQgXHBhcnRpYWxwYWdlIGZyb20KLSAgICAlIHNpbXBseSBvdmVyd3JpdGluZyB0aGUgZmlyc3QsIGNhdXNpbmcgdXMgdG8gbG9zZSB0aGUgcGFnZS4KLSAgICAlIFRoaXMgd2lsbCBwcmVzZXJ2ZSBpdCB1bnRpbCBhIHJlYWwgb3V0cHV0IHJvdXRpbmUgY2FuIHNoaXAgaXQKLSAgICAlIG91dC4gIEdlbmVyYWxseSwgXHBhcnRpYWxwYWdlIHdpbGwgYmUgZW1wdHkgd2hlbiB0aGlzIHJ1bnMgYW5kCi0gICAgJSB0aGlzIHdpbGwgYmUgYSBuby1vcC4KLSAgICBcdW52Ym94XHBhcnRpYWxwYWdlCi0gICAgJQotICAgICUgVW52Ym94IHRoZSBtYWluIG91dHB1dCBwYWdlLgotICAgIFx1bnZib3gyNTUKLSAgICBca2Vybi1cdG9wc2tpcCBca2VyblxiYXNlbGluZXNraXAKLSAgfX0lCi0gIFxlamVjdAotICAlCi0gICUgVXNlIHRoZSBkb3VibGUtY29sdW1uIG91dHB1dCByb3V0aW5lIGZvciBzdWJzZXF1ZW50IHBhZ2VzLgotICBcb3V0cHV0ID0ge1xkb3VibGVjb2x1bW5vdXR9JQotICAlCi0gICUgQ2hhbmdlIHRoZSBwYWdlIHNpemUgcGFyYW1ldGVycy4gIFdlIGNvdWxkIGRvIHRoaXMgb25jZSBvdXRzaWRlIHRoaXMKLSAgJSByb3V0aW5lLCBpbiBlYWNoIG9mIEBzbWFsbGJvb2ssIEBhZm91cnBhcGVyLCBhbmQgdGhlIGRlZmF1bHQgOC41eDExCi0gICUgZm9ybWF0LCBidXQgdGhlbiB3ZSByZXBlYXQgdGhlIHNhbWUgY29tcHV0YXRpb24uICBSZXBlYXRpbmcgYSBjb3VwbGUKLSAgJSBvZiBhc3NpZ25tZW50cyBvbmNlIHBlciBpbmRleCBpcyBjbGVhcmx5IG1lYW5pbmdsZXNzIGZvciB0aGUKLSAgJSBleGVjdXRpb24gdGltZSwgc28gd2UgbWF5IGFzIHdlbGwgZG8gaXQgaW4gb25lIHBsYWNlLgotICAlCi0gICUgRmlyc3Qgd2UgaGFsdmUgdGhlIGxpbmUgbGVuZ3RoLCBsZXNzIGEgbGl0dGxlIGZvciB0aGUgZ3V0dGVyIGJldHdlZW4KLSAgJSB0aGUgY29sdW1ucy4gIFdlIGNvbXB1dGUgdGhlIGd1dHRlciBiYXNlZCBvbiB0aGUgbGluZSBsZW5ndGgsIHNvIGl0Ci0gICUgY2hhbmdlcyBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIHBhcGVyIGZvcm1hdC4gIFRoZSBtYWdpYyBjb25zdGFudAotICAlIGJlbG93IGlzIGNob3NlbiBzbyB0aGF0IHRoZSBndXR0ZXIgaGFzIHRoZSBzYW1lIHZhbHVlICh3ZWxsLCArLTwxcHQpCi0gICUgYXMgaXQgZGlkIHdoZW4gd2UgaGFyZC1jb2RlZCBpdC4KLSAgJQotICAlIFdlIHB1dCB0aGUgcmVzdWx0IGluIGEgc2VwYXJhdGUgcmVnaXN0ZXIsIFxkb3VibGVjb2x1bWhzaXplLCBzbyB3ZQotICAlIGNhbiByZXN0b3JlIGl0IGluIFxwYWdlc29mYXIsIGFmdGVyIFxoc2l6ZSBpdHNlbGYgaGFzIChwb3RlbnRpYWxseSkKLSAgJSBiZWVuIGNsb2JiZXJlZC4KLSAgJQotICBcZG91YmxlY29sdW1uaHNpemUgPSBcaHNpemUKLSAgICBcYWR2YW5jZVxkb3VibGVjb2x1bW5oc2l6ZSBieSAtLjA0MTU0XGhzaXplCi0gICAgXGRpdmlkZVxkb3VibGVjb2x1bW5oc2l6ZSBieSAyCi0gIFxoc2l6ZSA9IFxkb3VibGVjb2x1bW5oc2l6ZQotICAlCi0gICUgRG91YmxlIHRoZSBcdnNpemUgYXMgd2VsbC4gIChXZSBkb24ndCBuZWVkIGEgc2VwYXJhdGUgcmVnaXN0ZXIgaGVyZSwKLSAgJSBzaW5jZSBub2JvZHkgY2xvYmJlcnMgXHZzaXplLikKLSAgXGFkdmFuY2VcdnNpemUgYnkgLVxodFxwYXJ0aWFscGFnZQotICBcdnNpemUgPSAyXHZzaXplCi19Ci0KLSUgVGhlIGRvdWJsZS1jb2x1bW4gb3V0cHV0IHJvdXRpbmUgZm9yIGFsbCBkb3VibGUtY29sdW1uIHBhZ2VzIGV4Y2VwdAotJSB0aGUgbGFzdC4KLSUgCi1cZGVmXGRvdWJsZWNvbHVtbm91dHslCi0gIFxzcGxpdHRvcHNraXA9XHRvcHNraXAgXHNwbGl0bWF4ZGVwdGg9XG1heGRlcHRoCi0gICUgR2V0IHRoZSBhdmFpbGFibGUgc3BhY2UgZm9yIHRoZSBkb3VibGUgY29sdW1ucyAtLSB0aGUgbm9ybWFsCi0gICUgKHVuZG91YmxlZCkgcGFnZSBoZWlnaHQgbWludXMgYW55IG1hdGVyaWFsIGxlZnQgb3ZlciBmcm9tIHRoZQotICAlIHByZXZpb3VzIHBhZ2UuCi0gIFxkaW1lbkAgPSBcdnNpemUKLSAgXGRpdmlkZVxkaW1lbkAgYnkgMgotICAlCi0gICUgYm94MCB3aWxsIGJlIHRoZSBsZWZ0LWhhbmQgY29sdW1uLCBib3gyIHRoZSByaWdodC4KLSAgXHNldGJveDA9XHZzcGxpdDI1NSB0b1xkaW1lbkAgXHNldGJveDI9XHZzcGxpdDI1NSB0b1xkaW1lbkAKLSAgXG9uZXBhZ2VvdXRccGFnZXNvZmFyCi0gIFx1bnZib3gyNTUKLSAgXHBlbmFsdHlcb3V0cHV0cGVuYWx0eQotfQotXGRlZlxwYWdlc29mYXJ7JQotICAlIFJlLW91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG91dHB1dCBwYWdlIC0tIGFueSBwcmV2aW91cyBtYXRlcmlhbCwKLSAgJSBmb2xsb3dlZCBieSB0aGUgdHdvIGJveGVzIHdlIGp1c3Qgc3BsaXQsIGluIGJveDAgYW5kIGJveDIuCi0gIFxhZHZhbmNlXHZzaXplIGJ5IFxodFxwYXJ0aWFscGFnZQotICBcdW52Ym94XHBhcnRpYWxwYWdlCi0gICUKLSAgXGhzaXplID0gXGRvdWJsZWNvbHVtbmhzaXplCi0gIFx3ZDA9XGhzaXplIFx3ZDI9XGhzaXplCi0gIFxoYm94IHRvXHBhZ2V3aWR0aHtcYm94MFxoZmlsXGJveDJ9JQotfQotXGRlZlxlbmRkb3VibGVjb2x1bW5zeyUKLSAgXG91dHB1dCA9IHslCi0gICAgJSBTcGxpdCB0aGUgbGFzdCBvZiB0aGUgZG91YmxlLWNvbHVtbiBtYXRlcmlhbC4gIExlYXZlIG9uIHRoZQotICAgICUgY3VycmVudCBwYWdlLCBubyBhdXRvbWF0aWMgcGFnZSBicmVhay4KLSAgICBcYmFsYW5jZWNvbHVtbnMKLSAgICAlCi0gICAgJSBJZiB3ZSBlbmQgdXAgc3BsaXR0aW5nIHRvbyBtdWNoIG1hdGVyaWFsIGZvciB0aGUgY3VycmVudCBwYWdlLAotICAgICUgdGhvdWdoLCB0aGVyZSB3aWxsIGJlIGFub3RoZXIgcGFnZSBicmVhayByaWdodCBhZnRlciB0aGlzIFxvdXRwdXQKLSAgICAlIGludm9jYXRpb24gZW5kcy4gIEhhdmluZyBjYWxsZWQgXGJhbGFuY2Vjb2x1bW5zIG9uY2UsIHdlIGRvIG5vdAotICAgICUgd2FudCB0byBjYWxsIGl0IGFnYWluLiAgVGhlcmVmb3JlLCByZXNldCBcb3V0cHV0IHRvIGl0cyBub3JtYWwKLSAgICAlIGRlZmluaXRpb24gcmlnaHQgYXdheS4gIChXZSBob3BlIFxiYWxhbmNlY29sdW1ucyB3aWxsIG5ldmVyIGJlCi0gICAgJSBjYWxsZWQgb24gdG8gYmFsYW5jZSB0b28gbXVjaCBtYXRlcmlhbCwgYnV0IGlmIGl0IGlzLCB0aGlzIG1ha2VzCi0gICAgJSB0aGUgb3V0cHV0IHNvbWV3aGF0IG1vcmUgcGFsYXRhYmxlLikKLSAgICBcZ2xvYmFsXG91dHB1dCA9IHtcb25lcGFnZW91dHtccGFnZWNvbnRlbnRzXFBBR0V9fSUKLSAgICAlCi0gICAgJSBccGFnZWdvYWwgd2FzIHNldCB0byB0aGUgZG91YmxlZCBcdnNpemUgYWJvdmUsIHNpbmNlIHdlIHJlc3RhcnRlZAotICAgICUgdGhlIGN1cnJlbnQgcGFnZS4gIFdlJ3JlIG5vdyBiYWNrIHRvIG5vcm1hbCBzaW5nbGUtY29sdW1uCi0gICAgJSB0eXBlc2V0dGluZywgc28gcmVzZXQgXHBhZ2Vnb2FsIHRvIHRoZSBub3JtYWwgXHZzaXplLgotICAgIFxwYWdlZ29hbCA9IFx2c2l6ZQotICB9JQotICBcZWplY3QKLSAgXGVuZGdyb3VwICUgc3RhcnRlZCBpbiBcYmVnaW5kb3VibGVjb2x1bW5zCi19Ci1cZGVmXGJhbGFuY2Vjb2x1bW5zeyUKLSAgJSBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZG91YmxlIGNvbHVtbiBtYXRlcmlhbC4KLSAgXHNldGJveDAgPSBcdmJveHtcdW52Ym94MjU1fSUgbGlrZSBcYm94MjU1IGJ1dCBtb3JlIGVmZmljaWVudCwgc2VlIHAuMTIwLgotICBcZGltZW5AID0gXGh0MAotICBcYWR2YW5jZVxkaW1lbkAgYnkgXHRvcHNraXAKLSAgXGFkdmFuY2VcZGltZW5AIGJ5LVxiYXNlbGluZXNraXAKLSAgXGRpdmlkZVxkaW1lbkAgYnkgMiAlIHRhcmdldCB0byBzcGxpdCB0bwotICAlZGVidWdcbWVzc2FnZXtmaW5hbCAyLWNvbHVtbiBtYXRlcmlhbCBoZWlnaHQ9XHRoZVxodDAsIHRhcmdldD1cdGhlXGRpbWVuQC59JQotICBcc3BsaXR0b3Bza2lwID0gXHRvcHNraXAKLSAgJSBMb29wIHVudGlsIHdlIGdldCBhIGRlY2VudCBicmVha3BvaW50LgotICB7JQotICAgIFx2YmFkbmVzcyA9IDEwMDAwCi0gICAgXGxvb3AKLSAgICAgIFxnbG9iYWxcc2V0Ym94MyA9IFxjb3B5MAotICAgICAgXGdsb2JhbFxzZXRib3gxID0gXHZzcGxpdDMgdG8gXGRpbWVuQAotICAgIFxpZmRpbVxodDM+XGRpbWVuQAotICAgICAgXGdsb2JhbFxhZHZhbmNlXGRpbWVuQCBieSAxcHQKLSAgICBccmVwZWF0Ci0gIH0lCi0gICVkZWJ1Z1xtZXNzYWdle3NwbGl0IHRvIFx0aGVcZGltZW5ALCBjb2x1bW4gaGVpZ2h0czogXHRoZVxodDEsIFx0aGVcaHQzLn0lCi0gIFxzZXRib3gwPVx2Ym94IHRvXGRpbWVuQHtcdW52Ym94MX0lCi0gIFxzZXRib3gyPVx2Ym94IHRvXGRpbWVuQHtcdW52Ym94M30lCi0gICUKLSAgXHBhZ2Vzb2ZhcgotfQotXGNhdGNvZGVgXEAgPSBcb3RoZXIKLQotCi1cbWVzc2FnZXtzZWN0aW9uaW5nLH0KLSUgRGVmaW5lIGNoYXB0ZXJzLCBzZWN0aW9ucywgZXRjLgotCi1cbmV3Y291bnRcY2hhcG5vCi1cbmV3Y291bnRcc2Vjbm8gICAgICAgIFxzZWNubz0wCi1cbmV3Y291bnRcc3Vic2Vjbm8gICAgIFxzdWJzZWNubz0wCi1cbmV3Y291bnRcc3Vic3Vic2Vjbm8gIFxzdWJzdWJzZWNubz0wCi0KLSUgVGhpcyBjb3VudGVyIGlzIGZ1bm55IHNpbmNlIGl0IGNvdW50cyB0aHJvdWdoIGNoYXJjb2RlcyBvZiBsZXR0ZXJzIEEsIEIsIC4uLgotXG5ld2NvdW50XGFwcGVuZGl4bm8gIFxhcHBlbmRpeG5vID0gYFxACi1cZGVmXGFwcGVuZGl4bGV0dGVye1xjaGFyXHRoZVxhcHBlbmRpeG5vfQotCi0lIEVhY2ggQGNoYXB0ZXIgZGVmaW5lcyB0aGlzIGFzIHRoZSBuYW1lIG9mIHRoZSBjaGFwdGVyLgotJSBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncyBjYW4gdXNlIGl0LiAgQHNlY3Rpb24gZG9lcyBsaWtld2lzZS4KLVxkZWZcdGhpc2NoYXB0ZXJ7fQotXGRlZlx0aGlzc2VjdGlvbnt9Ci0KLVxuZXdjb3VudFxhYnNzZWNsZXZlbCAlIHVzZWQgdG8gY2FsY3VsYXRlIHByb3BlciBoZWFkaW5nIGxldmVsCi1cbmV3Y291bnRcc2VjYmFzZVxzZWNiYXNlPTAgJSBAcmFpc2UvbG93ZXJzZWN0aW9ucyBtb2RpZnkgdGhpcyBjb3VudAotCi0lIEByYWlzZXNlY3Rpb25zOiB0cmVhdCBAc2VjdGlvbiBhcyBjaGFwdGVyLCBAc3Vic2VjdGlvbiBhcyBzZWN0aW9uLCBldGMuCi1cZGVmXHJhaXNlc2VjdGlvbnN7XGdsb2JhbFxhZHZhbmNlXHNlY2Jhc2UgYnkgLTF9Ci1cbGV0XHVwPVxyYWlzZXNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCi0KLSUgQGxvd2Vyc2VjdGlvbnM6IHRyZWF0IEBjaGFwdGVyIGFzIHNlY3Rpb24sIEBzZWN0aW9uIGFzIHN1YnNlY3Rpb24sIGV0Yy4KLVxkZWZcbG93ZXJzZWN0aW9uc3tcZ2xvYmFsXGFkdmFuY2Vcc2VjYmFzZSBieSAxfQotXGxldFxkb3duPVxsb3dlcnNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCi0KLSUgQ2hvb3NlIGEgbnVtYmVyZWQtaGVhZGluZyBtYWNybwotJSAjMSBpcyBoZWFkaW5nIGxldmVsIGlmIHVubW9kaWZpZWQgYnkgQHJhaXNlc2VjdGlvbnMgb3IgQGxvd2Vyc2VjdGlvbnMKLSUgIzIgaXMgdGV4dCBmb3IgaGVhZGluZwotXGRlZlxudW1oZWFkIzEjMntcYWJzc2VjbGV2ZWw9XHNlY2Jhc2VcYWR2YW5jZVxhYnNzZWNsZXZlbCBieSAjMQotXGlmY2FzZVxhYnNzZWNsZXZlbAotICBcY2hhcHRlcnp6ensjMn0KLVxvcgotICBcc2Vjenp6eyMyfQotXG9yCi0gIFxudW1iZXJlZHN1YnNlY3p6ensjMn0KLVxvcgotICBcbnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci1cZWxzZQotICBcaWZudW0gXGFic3NlY2xldmVsPDAKLSAgICBcY2hhcHRlcnp6ensjMn0KLSAgXGVsc2UKLSAgICBcbnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci0gIFxmaQotXGZpCi19Ci0KLSUgbGlrZSBcbnVtaGVhZCwgYnV0IGNob29zZXMgYXBwZW5kaXggaGVhZGluZyBsZXZlbHMKLVxkZWZcYXBwaGVhZCMxIzJ7XGFic3NlY2xldmVsPVxzZWNiYXNlXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgIzEKLVxpZmNhc2VcYWJzc2VjbGV2ZWwKLSAgXGFwcGVuZGl4enp6eyMyfQotXG9yCi0gIFxhcHBlbmRpeHNlY3Rpb256enp7IzJ9Ci1cb3IKLSAgXGFwcGVuZGl4c3Vic2Vjenp6eyMyfQotXG9yCi0gIFxhcHBlbmRpeHN1YnN1YnNlY3p6ensjMn0KLVxlbHNlCi0gIFxpZm51bSBcYWJzc2VjbGV2ZWw8MAotICAgIFxhcHBlbmRpeHp6ensjMn0KLSAgXGVsc2UKLSAgICBcYXBwZW5kaXhzdWJzdWJzZWN6enp7IzJ9Ci0gIFxmaQotXGZpCi19Ci0KLSUgbGlrZSBcbnVtaGVhZCwgYnV0IGNob29zZXMgbnVtYmVybGVzcyBoZWFkaW5nIGxldmVscwotXGRlZlx1bm5taGVhZCMxIzJ7XGFic3NlY2xldmVsPVxzZWNiYXNlXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgIzEKLVxpZmNhc2VcYWJzc2VjbGV2ZWwKLSAgXHVubnVtYmVyZWR6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzZWN6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzdWJzZWN6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci1cZWxzZQotICBcaWZudW0gXGFic3NlY2xldmVsPDAKLSAgICBcdW5udW1iZXJlZHp6ensjMn0KLSAgXGVsc2UKLSAgICBcdW5udW1iZXJlZHN1YnN1YnNlY3p6ensjMn0KLSAgXGZpCi1cZmkKLX0KLQotJSBAY2hhcHRlciwgQGFwcGVuZGl4LCBAdW5udW1iZXJlZC4KLVxkZWZcdGhpc2NoYXB0ZXJuYW1le05vIENoYXB0ZXIgVGl0bGV9Ci1cb3V0ZXJcZGVmXGNoYXB0ZXJ7XHBhcnNlYXJnXGNoYXB0ZXJ5eXl9Ci1cZGVmXGNoYXB0ZXJ5eXkgIzF7XG51bWhlYWQweyMxfX0gJSBub3JtYWxseSBudW1oZWFkMCBjYWxscyBjaGFwdGVyenp6Ci1cZGVmXGNoYXB0ZXJ6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLVxnbG9iYWxcYWR2YW5jZSBcY2hhcG5vIGJ5IDEgXG1lc3NhZ2V7XHB1dHdvcmRDaGFwdGVyXHNwYWNlIFx0aGVcY2hhcG5vfSUKLVxjaGFwbWFjcm8geyMxfXtcdGhlXGNoYXBub30lCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cZ2RlZlx0aGlzY2hhcHRlcm5hbWV7IzF9JQotJSBXZSBkb24ndCBzdWJzdGl0dXRlIHRoZSBhY3R1YWwgY2hhcHRlciBuYW1lIGludG8gXHRoaXNjaGFwdGVyCi0lIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBpdHMgbWFjcm9zIGV2YWx1YXRlZCBub3cuCi1ceGRlZlx0aGlzY2hhcHRlcntccHV0d29yZENoYXB0ZXJ7fSBcdGhlXGNoYXBubzogXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBjaGFwZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcbnVtYmVyZWRzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzdWJzZWMKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHtccGFyc2VhcmdcYXBwZW5kaXh5eXl9Ci1cZGVmXGFwcGVuZGl4eXl5ICMxe1xhcHBoZWFkMHsjMX19ICUgbm9ybWFsbHkgYXBwaGVhZDAgY2FsbHMgYXBwZW5kaXh6enoKLVxkZWZcYXBwZW5kaXh6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLVxnbG9iYWxcYWR2YW5jZSBcYXBwZW5kaXhubyBieSAxCi1cbWVzc2FnZXtccHV0d29yZEFwcGVuZGl4XHNwYWNlIFxhcHBlbmRpeGxldHRlcn0lCi1cY2hhcG1hY3JvIHsjMX17XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcn0lCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cZ2RlZlx0aGlzY2hhcHRlcm5hbWV7IzF9JQotXHhkZWZcdGhpc2NoYXB0ZXJ7XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcjogXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBjaGFwZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgIHtccHV0d29yZEFwcGVuZGl4e30gXGFwcGVuZGl4bGV0dGVyfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcYXBwZW5kaXhzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzdWJzZWMKLX0KLQotJSBAY2VudGVyY2hhcCBpcyBsaWtlIEB1bm51bWJlcmVkLCBidXQgdGhlIGhlYWRpbmcgaXMgY2VudGVyZWQuCi1cb3V0ZXJcZGVmXGNlbnRlcmNoYXB7XHBhcnNlYXJnXGNlbnRlcmNoYXB5eXl9Ci1cZGVmXGNlbnRlcmNoYXB5eXkgIzF7e1xsZXRcdW5udW1iY2hhcG1hY3JvPVxjZW50ZXJjaGFwbWFjcm8gXHVubnVtYmVyZWR5eXl7IzF9fX0KLQotJSBAdG9wIGlzIGxpa2UgQHVubnVtYmVyZWQuCi1cb3V0ZXJcZGVmXHRvcHtccGFyc2VhcmdcdW5udW1iZXJlZHl5eX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVke1xwYXJzZWFyZ1x1bm51bWJlcmVkeXl5fQotXGRlZlx1bm51bWJlcmVkeXl5ICMxe1x1bm5taGVhZDB7IzF9fSAlIG5vcm1hbGx5IHVubm1oZWFkMCBjYWxscyB1bm51bWJlcmVkenp6Ci1cZGVmXHVubnVtYmVyZWR6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLSUKLSUgVGhpcyB1c2VkIHRvIGJlIHNpbXBseSBcbWVzc2FnZXsjMX0sIGJ1dCBUZVggZnVsbHkgZXhwYW5kcyB0aGUKLSUgYXJndW1lbnQgdG8gXG1lc3NhZ2UuICBUaGVyZWZvcmUsIGlmICMxIGNvbnRhaW5lZCBALWNvbW1hbmRzLCBUZVgKLSUgZXhwYW5kZWQgdGhlbS4gIEZvciBleGFtcGxlLCBpbiBgQHVubnVtYmVyZWQgVGhlIEBjaXRle0Jvb2t9JywgVGVYCi0lIGV4cGFuZGVkIEBjaXRlICh3aGljaCB0dXJucyBvdXQgdG8gY2F1c2UgZXJyb3JzIGJlY2F1c2UgXGNpdGUgaXMgbWVhbnQKLSUgdG8gYmUgZXhlY3V0ZWQsIG5vdCBleHBhbmRlZCkuCi0lCi0lIEFueXdheSwgd2UgZG9uJ3Qgd2FudCB0aGUgZnVsbHktZXhwYW5kZWQgZGVmaW5pdGlvbiBvZiBAY2l0ZSB0byBhcHBlYXIKLSUgYXMgYSByZXN1bHQgb2YgdGhlIFxtZXNzYWdlLCB3ZSBqdXN0IHdhbnQgYEBjaXRlJyBpdHNlbGYuICBXZSB1c2UKLSUgXHRoZTx0b2tzIHJlZ2lzdGVyPiB0byBhY2hpZXZlIHRoaXM6IFRlWCBleHBhbmRzIFx0aGU8dG9rcz4gb25seSBvbmNlLAotJSBzaW1wbHkgeWllbGRpbmcgdGhlIGNvbnRlbnRzIG9mIDx0b2tzIHJlZ2lzdGVyPi4gIChXZSBhbHNvIGRvIHRoaXMgZm9yCi0lIHRoZSB0b2MgZW50cmllcy4pCi1cdG9rczAgPSB7IzF9XG1lc3NhZ2V7KFx0aGVcdG9rczApfSUKLSUKLVx1bm51bWJjaGFwbWFjcm8geyMxfSUKLVxnZGVmXHRoaXNjaGFwdGVyeyMxfVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHVubnVtYmNoYXBlbnRyeXtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXHVubnVtYmVyZWRzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcdW5udW1iZXJlZHN1YnNlYwotXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFx1bm51bWJlcmVkc3Vic3Vic2VjCi19Ci0KLSUgU2VjdGlvbnMuCi1cb3V0ZXJcZGVmXG51bWJlcmVkc2Vje1xwYXJzZWFyZ1xzZWN5eXl9Ci1cZGVmXHNlY3l5eSAjMXtcbnVtaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHNlY3p6egotXGRlZlxzZWN6enogIzF7JQotXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzZWNubyBieSAxICUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzZWNoZWFkaW5nIHsjMX17XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXhzZWN0aW9ue1xwYXJzZWFyZ1xhcHBlbmRpeHNlY3l5eX0KLVxvdXRlclxkZWZcYXBwZW5kaXhzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c2VjeXl5fQotXGRlZlxhcHBlbmRpeHNlY3l5eSAjMXtcYXBwaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c2VjdGlvbnp6egotXGRlZlxhcHBlbmRpeHNlY3Rpb256enogIzF7JQotXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzZWNubyBieSAxICUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzZWNoZWFkaW5nIHsjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99fX0lCi1cdGVtcAotXGFwcGVuZGl4bm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVkc2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc2VjeXl5fQotXGRlZlx1bm51bWJlcmVkc2VjeXl5ICMxe1x1bm5taGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzZWN6enoKLVxkZWZcdW5udW1iZXJlZHNlY3p6eiAjMXslCi1ccGxhaW5zZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJzZWNlbnRyeXtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cbm9icmVhawotfQotCi0lIFN1YnNlY3Rpb25zLgotXG91dGVyXGRlZlxudW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcbnVtYmVyZWRzdWJzZWN5eXl9Ci1cZGVmXG51bWJlcmVkc3Vic2VjeXl5ICMxe1xudW1oZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgbnVtYmVyZWRzdWJzZWN6enoKLVxkZWZcbnVtYmVyZWRzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzdWJzZWNubyBieSAxICUKLVxzdWJzZWNoZWFkaW5nIHsjMX17XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc3Vic2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99fX0lCi1cdGVtcAotXGRvbm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzZWN5eXl9Ci1cZGVmXGFwcGVuZGl4c3Vic2VjeXl5ICMxe1xhcHBoZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgYXBwZW5kaXhzdWJzZWN6enoKLVxkZWZcYXBwZW5kaXhzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzdWJzZWNubyBieSAxICUKLVxzdWJzZWNoZWFkaW5nIHsjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcdW5udW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnNlY3l5eX0KLVxkZWZcdW5udW1iZXJlZHN1YnNlY3l5eSAjMXtcdW5ubWhlYWQyeyMxfX0gJW5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzdWJzZWN6enoKLVxkZWZcdW5udW1iZXJlZHN1YnNlY3p6eiAjMXslCi1ccGxhaW5zdWJzZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJzdWJzZWNlbnRyeSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cbm9icmVhawotfQotCi0lIFN1YnN1YnNlY3Rpb25zLgotXG91dGVyXGRlZlxudW1iZXJlZHN1YnN1YnNlY3tccGFyc2VhcmdcbnVtYmVyZWRzdWJzdWJzZWN5eXl9Ci1cZGVmXG51bWJlcmVkc3Vic3Vic2VjeXl5ICMxe1xudW1oZWFkM3sjMX19ICUgbm9ybWFsbHkgbnVtYmVyZWRzdWJzdWJzZWN6enoKLVxkZWZcbnVtYmVyZWRzdWJzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XGdsb2JhbFxhZHZhbmNlIFxzdWJzdWJzZWNubyBieSAxICUKLVxzdWJzdWJzZWNoZWFkaW5nIHsjMX0KLSAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICB7XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99e1x0aGVcc3Vic3Vic2Vjbm99fX0lCi1cdGVtcAotXGRvbm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzdWJzZWN5eXl9Ci1cZGVmXGFwcGVuZGl4c3Vic3Vic2VjeXl5ICMxe1xhcHBoZWFkM3sjMX19ICUgbm9ybWFsbHkgYXBwZW5kaXhzdWJzdWJzZWN6enoKLVxkZWZcYXBwZW5kaXhzdWJzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XGdsb2JhbFxhZHZhbmNlIFxzdWJzdWJzZWNubyBieSAxICUKLVxzdWJzdWJzZWNoZWFkaW5nIHsjMX0KLSAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzdWJzdWJzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub319fSUKLVx0ZW1wCi1cYXBwZW5kaXhub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzdWJzZWN5eXl9Ci1cZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN5eXkgIzF7XHVubm1oZWFkM3sjMX19ICVub3JtYWxseSB1bm51bWJlcmVkc3Vic3Vic2Vjenp6Ci1cZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN6enogIzF7JQotXHBsYWluc3Vic3Vic2VjaGVhZGluZyB7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggdW5udW1ic3Vic3Vic2VjZW50cnklCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXG5vYnJlYWsKLX0KLQotJSBUaGVzZSBhcmUgdmFyaWFudHMgd2hpY2ggYXJlIG5vdCAib3V0ZXIiLCBzbyB0aGV5IGNhbiBhcHBlYXIgaW4gQGlmaW5mby4KLSUgQWN0dWFsbHksIHRoZXkgc2hvdWxkIG5vdyBiZSBvYnNvbGV0ZTsgb3JkaW5hcnkgc2VjdGlvbiBjb21tYW5kcyBzaG91bGQgd29yay4KLVxkZWZcaW5mb3RvcHtccGFyc2VhcmdcdW5udW1iZXJlZHp6en0KLVxkZWZcaW5mb3VubnVtYmVyZWR7XHBhcnNlYXJnXHVubnVtYmVyZWR6enp9Ci1cZGVmXGluZm91bm51bWJlcmVkc2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc2Vjenp6fQotXGRlZlxpbmZvdW5udW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnNlY3p6en0KLVxkZWZcaW5mb3VubnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzdWJzZWN6enp9Ci0KLVxkZWZcaW5mb2FwcGVuZGl4e1xwYXJzZWFyZ1xhcHBlbmRpeHp6en0KLVxkZWZcaW5mb2FwcGVuZGl4c2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHNlY3p6en0KLVxkZWZcaW5mb2FwcGVuZGl4c3Vic2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHN1YnNlY3p6en0KLVxkZWZcaW5mb2FwcGVuZGl4c3Vic3Vic2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHN1YnN1YnNlY3p6en0KLQotXGRlZlxpbmZvY2hhcHRlcntccGFyc2VhcmdcY2hhcHRlcnp6en0KLVxkZWZcaW5mb3NlY3Rpb257XHBhcnNlYXJnXHNlY3Rpb256enp9Ci1cZGVmXGluZm9zdWJzZWN0aW9ue1xwYXJzZWFyZ1xzdWJzZWN0aW9uenp6fQotXGRlZlxpbmZvc3Vic3Vic2VjdGlvbntccGFyc2Vhcmdcc3Vic3Vic2VjdGlvbnp6en0KLQotJSBUaGVzZSBtYWNyb3MgY29udHJvbCB3aGF0IHRoZSBzZWN0aW9uIGNvbW1hbmRzIGRvLCBhY2NvcmRpbmcKLSUgdG8gd2hhdCBraW5kIG9mIGNoYXB0ZXIgd2UgYXJlIGluIChvcmRpbmFyeSwgYXBwZW5kaXgsIG9yIHVubnVtYmVyZWQpLgotJSBEZWZpbmUgdGhlbSBieSBkZWZhdWx0IGZvciBhIG51bWJlcmVkIGNoYXB0ZXIuCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXG51bWJlcmVkc2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic2VjCi1cZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCi0KLSUgRGVmaW5lIEBtYWpvcmhlYWRpbmcsIEBoZWFkaW5nIGFuZCBAc3ViaGVhZGluZwotCi0lIE5PVEUgb24gdXNlIG9mIFx2Ym94IGZvciBjaGFwdGVyIGhlYWRpbmdzLCBzZWN0aW9uIGhlYWRpbmdzLCBhbmQgc3VjaDoKLSUgICAgICAgMSkgV2UgdXNlIFx2Ym94IHJhdGhlciB0aGFuIHRoZSBlYXJsaWVyIFxsaW5lIHRvIHBlcm1pdAotJSAgICAgICAgICBvdmVybG9uZyBoZWFkaW5ncyB0byBmb2xkLgotJSAgICAgICAyKSBcaHlwaGVucGVuYWx0eSBpcyBzZXQgdG8gMTAwMDAgYmVjYXVzZSBoeXBoZW5hdGlvbiBpbiBhCi0lICAgICAgICAgIGhlYWRpbmcgaXMgb2Jub3hpb3VzOyB0aGlzIGZvcmJpZHMgaXQuCi0lICAgICAgIDMpIExpa2V3aXNlLCBoZWFkaW5ncyBsb29rIGJlc3QgaWYgbm8gXHBhcmluZGVudCBpcyB1c2VkLCBhbmQKLSUgICAgICAgICAgaWYganVzdGlmaWNhdGlvbiBpcyBub3QgYXR0ZW1wdGVkLiAgSGVuY2UgXHJhZ2dlZHJpZ2h0LgotCi0KLVxkZWZcbWFqb3JoZWFkaW5ne1xwYXJzZWFyZ1xtYWpvcmhlYWRpbmd6enp9Ci1cZGVmXG1ham9yaGVhZGluZ3p6eiAjMXslCi17XGFkdmFuY2VcY2hhcGhlYWRpbmdza2lwIGJ5IDEwcHQgXGNoYXBicmVhayB9JQote1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKLSAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJccGVuYWx0eSAyMDB9Ci0KLVxkZWZcY2hhcGhlYWRpbmd7XHBhcnNlYXJnXGNoYXBoZWFkaW5nenp6fQotXGRlZlxjaGFwaGVhZGluZ3p6eiAjMXtcY2hhcGJyZWFrICUKLXtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAotICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXHBlbmFsdHkgMjAwfQotCi0lIEBoZWFkaW5nLCBAc3ViaGVhZGluZywgQHN1YnN1YmhlYWRpbmcuCi1cZGVmXGhlYWRpbmd7XHBhcnNlYXJnXHBsYWluc2VjaGVhZGluZ30KLVxkZWZcc3ViaGVhZGluZ3tccGFyc2VhcmdccGxhaW5zdWJzZWNoZWFkaW5nfQotXGRlZlxzdWJzdWJoZWFkaW5ne1xwYXJzZWFyZ1xwbGFpbnN1YnN1YnNlY2hlYWRpbmd9Ci0KLSUgVGhlc2UgbWFjcm9zIGdlbmVyYXRlIGEgY2hhcHRlciwgc2VjdGlvbiwgZXRjLiBoZWFkaW5nIG9ubHkKLSUgKGluY2x1ZGluZyB3aGl0ZXNwYWNlLCBsaW5lYnJlYWtpbmcsIGV0Yy4gYXJvdW5kIGl0KSwKLSUgZ2l2ZW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiBjb252ZW5pZW50LCBwYXJzZWQgZm9ybS4KLQotJSUlIEFyZ3MgYXJlIHRoZSBza2lwIGFuZCBwZW5hbHR5ICh1c3VhbGx5IG5lZ2F0aXZlKQotXGRlZlxkb2JyZWFrIzEjMntccGFyXGlmZGltXGxhc3Rza2lwPCMxXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHkjMlx2c2tpcCMxXGZpfQotCi1cZGVmXHNldGNoYXB0ZXJzdHlsZSAjMSB7XGNzbmFtZSBDSEFQRiMxXGVuZGNzbmFtZX0KLQotJSUlIERlZmluZSBwbGFpbiBjaGFwdGVyIHN0YXJ0cywgYW5kIHBhZ2Ugb24vb2ZmIHN3aXRjaGluZyBmb3IgaXQKLSUgUGFyYW1ldGVyIGNvbnRyb2xsaW5nIHNraXAgYmVmb3JlIGNoYXB0ZXIgaGVhZGluZ3MgKGlmIG5lZWRlZCkKLQotXG5ld3NraXBcY2hhcGhlYWRpbmdza2lwCi0KLVxkZWZcY2hhcGJyZWFre1xkb2JyZWFrIFxjaGFwaGVhZGluZ3NraXAgey00MDAwfX0KLVxkZWZcY2hhcHBhZ2Vye1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KLVxkZWZcY2hhcG9kZHBhZ2V7XGNoYXBwYWdlciBcaWZvZGRccGFnZW5vIFxlbHNlIFxoYm94IHRvIDBwdHt9IFxjaGFwcGFnZXJcZml9Ci0KLVxkZWZcc2V0Y2hhcHRlcm5ld3BhZ2UgIzEge1xjc25hbWUgQ0hBUFBBRyMxXGVuZGNzbmFtZX0KLQotXGRlZlxDSEFQUEFHb2ZmeyUKLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLVxnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBicmVhawotXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBwYWdlcn0KLQotXGRlZlxDSEFQUEFHb257JQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcHBhZ2VyCi1cZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcHBhZ2VyCi1cZ2xvYmFsXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU3NpbmdsZX19Ci0KLVxkZWZcQ0hBUFBBR29kZHsKLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQotXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcG9kZHBhZ2UKLVxnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwb2RkcGFnZQotXGdsb2JhbFxkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9fQotCi1cQ0hBUFBBR29uCi0KLVxkZWZcQ0hBUEZwbGFpbnsKLVxnbG9iYWxcbGV0XGNoYXBtYWNybz1cY2hmcGxhaW4KLVxnbG9iYWxcbGV0XHVubnVtYmNoYXBtYWNybz1cdW5uY2hmcGxhaW4KLVxnbG9iYWxcbGV0XGNlbnRlcmNoYXBtYWNybz1cY2VudGVyY2hmcGxhaW59Ci0KLSUgUGxhaW4gY2hhcHRlciBvcGVuaW5nLgotJSAjMSBpcyB0aGUgdGV4dCwgIzIgdGhlIGNoYXB0ZXIgbnVtYmVyIG9yIGVtcHR5IGlmIHVubnVtYmVyZWQuCi1cZGVmXGNoZnBsYWluIzEjMnslCi0gIFxwY2hhcHNlcG1hY3JvCi0gIHslCi0gICAgXGNoYXBmb250cyBccm0KLSAgICBcZGVmXGNoYXBudW17IzJ9JQotICAgIFxzZXRib3gwID0gXGhib3h7IzJcaWZ4XGNoYXBudW1cZW1wdHlcZWxzZVxlbnNwYWNlXGZpfSUKLSAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgXGhhbmdpbmRlbnQgPSBcd2QwIFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUKLSAgICAgICAgICBcdW5oYm94MCAjMVxwYXJ9JQotICB9JQotICBcbm9icmVha1xiaWdza2lwICUgbm8gcGFnZSBicmVhayBhZnRlciBhIGNoYXB0ZXIgdGl0bGUKLSAgXG5vYnJlYWsKLX0KLQotJSBQbGFpbiBvcGVuaW5nIGZvciB1bm51bWJlcmVkLgotXGRlZlx1bm5jaGZwbGFpbiMxe1xjaGZwbGFpbnsjMX17fX0KLQotJSBAY2VudGVyY2hhcCAtLSBjZW50ZXJlZCBhbmQgdW5udW1iZXJlZC4KLVxsZXRcY2VudGVycGFyYW1ldGVyc21heWJlID0gXHJlbGF4Ci1cZGVmXGNlbnRlcmNoZnBsYWluIzF7eyUKLSAgXGRlZlxjZW50ZXJwYXJhbWV0ZXJzbWF5YmV7JQotICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSAzXHJpZ2h0c2tpcAotICAgIFxsZWZ0c2tpcCA9IFxyaWdodHNraXAKLSAgICBccGFyZmlsbHNraXAgPSAwcHQKLSAgfSUKLSAgXGNoZnBsYWlueyMxfXt9JQotfX0KLQotXENIQVBGcGxhaW4gJSBUaGUgZGVmYXVsdAotCi1cZGVmXHVubmNoZm9wZW4gIzF7JQotXGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxub2JyZWFrCi19Ci0KLVxkZWZcY2hmb3BlbiAjMSMye1xjaGFwb2RkcGFnZSB7XGNoYXBmb250cwotXHZib3ggdG8gM2lue1x2ZmlsIFxoYm94IHRvXGhzaXple1xoZmlsICMyfSBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMX0gXHZmaWx9fSUKLVxwYXJccGVuYWx0eSA1MDAwICUKLX0KLQotXGRlZlxjZW50ZXJjaGZvcGVuICMxeyUKLVxjaGFwb2RkcGFnZSB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAotICAgICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdAotICAgICAgICAgICAgICAgICAgICAgICBcaGZpbGwge1xybSAjMX1caGZpbGx9fVxiaWdza2lwIFxwYXJcbm9icmVhawotfQotCi1cZGVmXENIQVBGb3BlbnsKLVxnbG9iYWxcbGV0XGNoYXBtYWNybz1cY2hmb3BlbgotXGdsb2JhbFxsZXRcdW5udW1iY2hhcG1hY3JvPVx1bm5jaGZvcGVuCi1cZ2xvYmFsXGxldFxjZW50ZXJjaGFwbWFjcm89XGNlbnRlcmNoZm9wZW59Ci0KLQotJSBTZWN0aW9uIHRpdGxlcy4KLVxuZXdza2lwXHNlY2hlYWRpbmdza2lwCi1cZGVmXHNlY2hlYWRpbmdicmVha3tcZG9icmVhayBcc2VjaGVhZGluZ3NraXAgey0xMDAwfX0KLVxkZWZcc2VjaGVhZGluZyMxIzIjM3tcc2VjdGlvbmhlYWRpbmd7c2VjfXsjMi4jM317IzF9fQotXGRlZlxwbGFpbnNlY2hlYWRpbmcjMXtcc2VjdGlvbmhlYWRpbmd7c2VjfXt9eyMxfX0KLQotJSBTdWJzZWN0aW9uIHRpdGxlcy4KLVxuZXdza2lwIFxzdWJzZWNoZWFkaW5nc2tpcAotXGRlZlxzdWJzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHN1YnNlY2hlYWRpbmdza2lwIHstNTAwfX0KLVxkZWZcc3Vic2VjaGVhZGluZyMxIzIjMyM0e1xzZWN0aW9uaGVhZGluZ3tzdWJzZWN9eyMyLiMzLiM0fXsjMX19Ci1cZGVmXHBsYWluc3Vic2VjaGVhZGluZyMxe1xzZWN0aW9uaGVhZGluZ3tzdWJzZWN9e317IzF9fQotCi0lIFN1YnN1YnNlY3Rpb24gdGl0bGVzLgotXGxldFxzdWJzdWJzZWNoZWFkaW5nc2tpcCA9IFxzdWJzZWNoZWFkaW5nc2tpcAotXGxldFxzdWJzdWJzZWNoZWFkaW5nYnJlYWsgPSBcc3Vic2VjaGVhZGluZ2JyZWFrCi1cZGVmXHN1YnN1YnNlY2hlYWRpbmcjMSMyIzMjNCM1e1xzZWN0aW9uaGVhZGluZ3tzdWJzdWJzZWN9eyMyLiMzLiM0LiM1fXsjMX19Ci1cZGVmXHBsYWluc3Vic3Vic2VjaGVhZGluZyMxe1xzZWN0aW9uaGVhZGluZ3tzdWJzdWJzZWN9e317IzF9fQotCi0KLSUgUHJpbnQgYW55IHNpemUgc2VjdGlvbiB0aXRsZS4KLSUKLSUgIzEgaXMgdGhlIHNlY3Rpb24gdHlwZSAoc2VjL3N1YnNlYy9zdWJzdWJzZWMpLCAjMiBpcyB0aGUgc2VjdGlvbgotJSBudW1iZXIgKG1heWJlIGVtcHR5KSwgIzMgdGhlIHRleHQuCi1cZGVmXHNlY3Rpb25oZWFkaW5nIzEjMiMzeyUKLSAgeyUKLSAgICBcZXhwYW5kYWZ0ZXJcYWR2YW5jZVxjc25hbWUgIzFoZWFkaW5nc2tpcFxlbmRjc25hbWUgYnkgXHBhcnNraXAKLSAgICBcY3NuYW1lICMxaGVhZGluZ2JyZWFrXGVuZGNzbmFtZQotICB9JQotICB7JQotICAgICUgU3dpdGNoIHRvIHRoZSByaWdodCBzZXQgb2YgZm9udHMuCi0gICAgXGNzbmFtZSAjMWZvbnRzXGVuZGNzbmFtZSBccm0KLSAgICAlCi0gICAgJSBPbmx5IGluc2VydCB0aGUgc2VwYXJhdGluZyBzcGFjZSBpZiB3ZSBoYXZlIGEgc2VjdGlvbiBudW1iZXIuCi0gICAgXGRlZlxzZWNudW17IzJ9JQotICAgIFxzZXRib3gwID0gXGhib3h7IzJcaWZ4XHNlY251bVxlbXB0eVxlbHNlXGVuc3BhY2VcZml9JQotICAgICUKLSAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgXGhhbmdpbmRlbnQgPSBcd2QwICUgemVybyBpZiBubyBzZWN0aW9uIG51bWJlcgotICAgICAgICAgIFx1bmhib3gwICMzfSUKLSAgfSUKLSAgXGlmZGltXHBhcnNraXA8MTBwdCBcbm9icmVha1xrZXJuMTBwdFxub2JyZWFrXGtlcm4tXHBhcnNraXBcZmkgXG5vYnJlYWsKLX0KLQotCi1cbWVzc2FnZXt0b2MsfQotXG5ld3dyaXRlXHRvY2ZpbGUKLQotJSBXcml0ZSBhbiBlbnRyeSB0byB0aGUgdG9jIGZpbGUsIG9wZW5pbmcgaXQgaWYgbmVjZXNzYXJ5LgotJSBDYWxsZWQgZnJvbSBAY2hhcHRlciwgZXRjLiAgV2Ugc3VwcGx5IHtcZm9saW99IGF0IHRoZSBlbmQgb2YgdGhlCi0lIGFyZ3VtZW50LCB3aGljaCB3aWxsIGVuZCB1cCBhcyB0aGUgbGFzdCBhcmd1bWVudCB0byB0aGUgXC4uLmVudHJ5IG1hY3JvLgotJSAKLSUgV2Ugb3BlbiB0aGUgLnRvYyBmaWxlIGhlcmUgaW5zdGVhZCBvZiBhdCBAc2V0ZmlsZW5hbWUgb3IgYW55IG90aGVyCi0lIGdpdmVuIHRpbWUgc28gdGhhdCBAY29udGVudHMgY2FuIGJlIHB1dCBpbiB0aGUgZG9jdW1lbnQgYW55d2hlcmUuCi0lIAotXG5ld2lmXGlmdG9jZmlsZW9wZW5lZAotXGRlZlx3cml0ZXRvY2VudHJ5IzF7JQotICBcaWZ0b2NmaWxlb3BlbmVkXGVsc2UKLSAgICBcaW1tZWRpYXRlXG9wZW5vdXRcdG9jZmlsZSA9IFxqb2JuYW1lLnRvYwotICAgIFxnbG9iYWxcdG9jZmlsZW9wZW5lZHRydWUKLSAgXGZpCi0gIFxpZmxpbmtzIFx3cml0ZVx0b2NmaWxleyMxe1xmb2xpb319XGZpCi19Ci0KLVxuZXdza2lwXGNvbnRlbnRzcmlnaHRtYXJnaW4gXGNvbnRlbnRzcmlnaHRtYXJnaW49MWluCi1cbmV3Y291bnRcc2F2ZXBhZ2VubwotXG5ld2NvdW50XGxhc3RuZWdhdGl2ZXBhZ2VubyBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gLTEKLQotJSBGaW5pc2ggdXAgdGhlIG1haW4gdGV4dCBhbmQgcHJlcGFyZSB0byByZWFkIHdoYXQgd2UndmUgd3JpdHRlbgotJSB0byBcdG9jZmlsZS4KLSUgCi1cZGVmXHN0YXJ0Y29udGVudHMjMXslCi0gICAlIElmIEBzZXRjaGFwdGVybmV3cGFnZSBvbiwgYW5kIEBoZWFkaW5ncyBkb3VibGUsIHRoZSBjb250ZW50cyBzaG91bGQKLSAgICUgc3RhcnQgb24gYW4gb2RkIHBhZ2UsIHVubGlrZSBjaGFwdGVycy4gIFRodXMsIHdlIG1haW50YWluCi0gICAlIFxjb250ZW50c2FsaWdubWFjcm8gaW4gcGFyYWxsZWwgd2l0aCBccGFnZWFsaWdubWFjcm8uCi0gICAlIEZyb206IFRvcmJqb3JuIEdyYW5sdW5kIDx0ZWdlQG1hdGVtYXRpay5zdS5zZT4KLSAgIFxjb250ZW50c2FsaWdubWFjcm8KLSAgIFxpbW1lZGlhdGVcY2xvc2VvdXRcdG9jZmlsZQotICAgJQotICAgJSBEb24ndCBuZWVkIHRvIHB1dCBgQ29udGVudHMnIG9yIGBTaG9ydCBDb250ZW50cycgaW4gdGhlIGhlYWRsaW5lLgotICAgJSBJdCBpcyBhYnVuZGFudGx5IGNsZWFyIHdoYXQgdGhleSBhcmUuCi0gICBcdW5udW1iY2hhcG1hY3JveyMxfVxkZWZcdGhpc2NoYXB0ZXJ7fSUKLSAgIFxzYXZlcGFnZW5vID0gXHBhZ2VubwotICAgXGJlZ2luZ3JvdXAgICAgICAgICAgICAgICAgICAlIFNldCB1cCB0byBoYW5kbGUgY29udGVudHMgZmlsZXMgcHJvcGVybHkuCi0gICAgICBcY2F0Y29kZWBcXD0wICBcY2F0Y29kZWBcez0xICBcY2F0Y29kZWBcfT0yICBcY2F0Y29kZWBcQD0xMQotICAgICAgJSBXZSBjYW4ndCBkbyB0aGlzLCBiZWNhdXNlIHRoZW4gYW4gYWN0dWFsIF4gaW4gYSBzZWN0aW9uCi0gICAgICAlIHRpdGxlIGZhaWxzLCBlLmcuLCBAY2hhcHRlciBeIC0tIGV4cG9uZW50aWF0aW9uLiAgLS1rYXJsLCA5anVsOTcuCi0gICAgICAlXGNhdGNvZGVgXF49NyAlIHRvIHNlZSBeXmU0IGFzIFwiYSBldGMuIGp1aGFAcGl1aGEueWRpLnZ0dC5maQotICAgICAgXHJhZ2dlZGJvdHRvbSAgICAgICAgICAgICAlIFdvcnJ5IG1vcmUgYWJvdXQgYnJlYWtwb2ludHMgdGhhbiB0aGUgYm90dG9tLgotICAgICAgXGFkdmFuY2VcaHNpemUgYnkgLVxjb250ZW50c3JpZ2h0bWFyZ2luICUgRG9uJ3QgdXNlIHRoZSBmdWxsIGxpbmUgbGVuZ3RoLgotICAgICAgJQotICAgICAgJSBSb21hbiBudW1lcmFscyBmb3IgcGFnZSBudW1iZXJzLgotICAgICAgXGlmbnVtIFxwYWdlbm8+MCBccGFnZW5vID0gXGxhc3RuZWdhdGl2ZXBhZ2VubyBcZmkKLX0KLQotCi0lIE5vcm1hbCAobG9uZykgdG9jLgotXGRlZlxjb250ZW50c3slCi0gICBcc3RhcnRjb250ZW50c3tccHV0d29yZFRhYmxlb2ZDb250ZW50c30lCi0gICAgIFxvcGVuaW4gMSBcam9ibmFtZS50b2MKLSAgICAgXGlmZW9mIDEgXGVsc2UKLSAgICAgICBcY2xvc2VpbiAxCi0gICAgICAgXGlucHV0IFxqb2JuYW1lLnRvYwotICAgICBcZmkKLSAgICAgXHZmaWxsIFxlamVjdAotICAgXGVuZGdyb3VwCi0gICBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gXHBhZ2VubwotICAgXHBhZ2VubyA9IFxzYXZlcGFnZW5vCi19Ci0KLSUgQW5kIGp1c3QgdGhlIGNoYXB0ZXJzLgotXGRlZlxzdW1tYXJ5Y29udGVudHN7JQotICAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRTaG9ydENvbnRlbnRzfSUKLSAgICAgICUKLSAgICAgIFxsZXRcY2hhcGVudHJ5ID0gXHNob3J0Y2hhcGVudHJ5Ci0gICAgICBcbGV0XHVubnVtYmNoYXBlbnRyeSA9IFxzaG9ydHVubnVtYmVyZWRlbnRyeQotICAgICAgJSBXZSB3YW50IGEgdHJ1ZSByb21hbiBoZXJlIGZvciB0aGUgcGFnZSBudW1iZXJzLgotICAgICAgXHNlY2ZvbnRzCi0gICAgICBcbGV0XHJtPVxzaG9ydGNvbnRybSBcbGV0XGJmPVxzaG9ydGNvbnRiZiBcbGV0XHNsPVxzaG9ydGNvbnRzbAotICAgICAgXHJtCi0gICAgICBcaHlwaGVucGVuYWx0eSA9IDEwMDAwCi0gICAgICBcYWR2YW5jZVxiYXNlbGluZXNraXAgYnkgMXB0ICUgT3BlbiBpdCB1cCBhIGxpdHRsZS4KLSAgICAgIFxkZWZcc2VjZW50cnkgIyMxIyMyIyMzIyM0e30KLSAgICAgIFxkZWZcdW5udW1ic2VjZW50cnkgIyMxIyMye30KLSAgICAgIFxkZWZcc3Vic2VjZW50cnkgIyMxIyMyIyMzIyM0IyM1e30KLSAgICAgIFxkZWZcdW5udW1ic3Vic2VjZW50cnkgIyMxIyMye30KLSAgICAgIFxkZWZcc3Vic3Vic2VjZW50cnkgIyMxIyMyIyMzIyM0IyM1IyM2e30KLSAgICAgIFxkZWZcdW5udW1ic3Vic3Vic2VjZW50cnkgIyMxIyMye30KLSAgICAgIFxvcGVuaW4gMSBcam9ibmFtZS50b2MKLSAgICAgIFxpZmVvZiAxIFxlbHNlCi0gICAgICAgIFxjbG9zZWluIDEKLSAgICAgICAgXGlucHV0IFxqb2JuYW1lLnRvYwotICAgICAgXGZpCi0gICAgIFx2ZmlsbCBcZWplY3QKLSAgIFxlbmRncm91cAotICAgXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IFxwYWdlbm8KLSAgIFxwYWdlbm8gPSBcc2F2ZXBhZ2VubwotfQotXGxldFxzaG9ydGNvbnRlbnRzID0gXHN1bW1hcnljb250ZW50cwotCi0lIFRoZXNlIG1hY3JvcyBnZW5lcmF0ZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlIHRhYmxlIG9mIGNvbnRlbnRzLgotJSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNoYXB0ZXIgb3Igc2VjdGlvbiBuYW1lLgotJSBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgcGFnZSBudW1iZXIuCi0lIFRoZSBhcmd1bWVudHMgaW4gYmV0d2VlbiBhcmUgdGhlIGNoYXB0ZXIgbnVtYmVyLCBzZWN0aW9uIG51bWJlciwgLi4uCi0KLSUgQ2hhcHRlci1sZXZlbCB0aGluZ3MsIGZvciBib3RoIHRoZSBsb25nIGFuZCBzaG9ydCBjb250ZW50cy4KLVxkZWZcY2hhcGVudHJ5IzEjMiMze1xkb2NoYXBlbnRyeXsjMlxsYWJlbHNwYWNlIzF9eyMzfX0KLQotJSBTZWUgY29tbWVudHMgaW4gXGRvY2hhcGVudHJ5IHJlIHZib3ggYW5kIHJlbGF0ZWQgc2V0dGluZ3MKLVxkZWZcc2hvcnRjaGFwZW50cnkjMSMyIzN7JQotICBcdG9jZW50cnl7XHNob3J0Y2hhcGxhYmVseyMyfVxsYWJlbHNwYWNlICMxfXtcZG9zaG9ydHBhZ2Vub3sjM319JQotfQotCi0lIFR5cGVzZXQgdGhlIGxhYmVsIGZvciBhIGNoYXB0ZXIgb3IgYXBwZW5kaXggZm9yIHRoZSBzaG9ydCBjb250ZW50cy4KLSUgVGhlIGFyZyBpcywgZS5nLiBgQXBwZW5kaXggQScgZm9yIGFuIGFwcGVuZGl4LCBvciBgMycgZm9yIGEgY2hhcHRlci4KLSUgV2UgY291bGQgc2ltcGxpZnkgdGhlIGNvZGUgaGVyZSBieSB3cml0aW5nIG91dCBhbiBcYXBwZW5kaXhlbnRyeQotJSBjb21tYW5kIGluIHRoZSB0b2MgZmlsZSBmb3IgYXBwZW5kaWNlcywgaW5zdGVhZCBvZiB1c2luZyBcY2hhcGVudHJ5Ci0lIGZvciBib3RoLCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIGl0LgotXHNldGJveDAgPSBcaGJveHtcc2hvcnRjb250cm0gXHB1dHdvcmRBcHBlbmRpeCB9Ci1cbmV3ZGltZW5cc2hvcnRhcHBlbmRpeHdpZHRoIFxzaG9ydGFwcGVuZGl4d2lkdGggPSBcd2QwCi0KLVxkZWZcc2hvcnRjaGFwbGFiZWwjMXslCi0gICUgV2UgdHlwZXNldCAjMSBpbiBhIGJveCBvZiBjb25zdGFudCB3aWR0aCwgcmVnYXJkbGVzcyBvZiB0aGUgdGV4dCBvZgotICAlICMxLCBzbyB0aGUgY2hhcHRlciB0aXRsZXMgd2lsbCBjb21lIG91dCBhbGlnbmVkLgotICBcc2V0Ym94MCA9IFxoYm94eyMxfSUKLSAgXGRpbWVuMCA9IFxpZmRpbVx3ZDAgPiBcc2hvcnRhcHBlbmRpeHdpZHRoIFxzaG9ydGFwcGVuZGl4d2lkdGggXGVsc2UgMHB0IFxmaQotICAlCi0gICUgVGhpcyBzcGFjZSBzaG91bGQgYmUgcGxlbnR5LCBzaW5jZSBhIHNpbmdsZSBudW1iZXIgaXMgLjVlbSwgYW5kIHRoZQotICAlIHdpZGVzdCBsZXR0ZXIgKE0pIGlzIDFlbSwgYXQgbGVhc3QgaW4gdGhlIENvbXB1dGVyIE1vZGVybiBmb250cy4KLSAgJSAoVGhpcyBzcGFjZSBkb2Vzbid0IGluY2x1ZGUgdGhlIGV4dHJhIHNwYWNlIHRoYXQgZ2V0cyBhZGRlZCBhZnRlcgotICAlIHRoZSBsYWJlbDsgdGhhdCBnZXRzIHB1dCBpbiBieSBcc2hvcnRjaGFwZW50cnkgYWJvdmUuKQotICBcYWR2YW5jZVxkaW1lbjAgYnkgMS4xZW0KLSAgXGhib3ggdG8gXGRpbWVuMHsjMVxoZmlsfSUKLX0KLQotXGRlZlx1bm51bWJjaGFwZW50cnkjMSMye1xkb2NoYXBlbnRyeXsjMX17IzJ9fQotXGRlZlxzaG9ydHVubnVtYmVyZWRlbnRyeSMxIzJ7XHRvY2VudHJ5eyMxfXtcZG9zaG9ydHBhZ2Vub3sjMn19fQotCi0lIFNlY3Rpb25zLgotXGRlZlxzZWNlbnRyeSMxIzIjMyM0e1xkb3NlY2VudHJ5eyMyLiMzXGxhYmVsc3BhY2UjMX17IzR9fQotXGRlZlx1bm51bWJzZWNlbnRyeSMxIzJ7XGRvc2VjZW50cnl7IzF9eyMyfX0KLQotJSBTdWJzZWN0aW9ucy4KLVxkZWZcc3Vic2VjZW50cnkjMSMyIzMjNCM1e1xkb3N1YnNlY2VudHJ5eyMyLiMzLiM0XGxhYmVsc3BhY2UjMX17IzV9fQotXGRlZlx1bm51bWJzdWJzZWNlbnRyeSMxIzJ7XGRvc3Vic2VjZW50cnl7IzF9eyMyfX0KLQotJSBBbmQgc3Vic3Vic2VjdGlvbnMuCi1cZGVmXHN1YnN1YnNlY2VudHJ5IzEjMiMzIzQjNSM2eyUKLSAgXGRvc3Vic3Vic2VjZW50cnl7IzIuIzMuIzQuIzVcbGFiZWxzcGFjZSMxfXsjNn19Ci1cZGVmXHVubnVtYnN1YnN1YnNlY2VudHJ5IzEjMntcZG9zdWJzdWJzZWNlbnRyeXsjMX17IzJ9fQotCi0lIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBsZXZlbHMuCi1cbmV3ZGltZW5cdG9jaW5kZW50IFx0b2NpbmRlbnQgPSAzcGMKLQotJSBOb3cgZm9yIHRoZSBhY3R1YWwgdHlwZXNldHRpbmcuIEluIGFsbCB0aGVzZSwgIzEgaXMgdGhlIHRleHQgYW5kICMyIGlzIHRoZQotJSBwYWdlIG51bWJlci4KLSUKLSUgSWYgdGhlIHRvYyBoYXMgdG8gYmUgYnJva2VuIG92ZXIgcGFnZXMsIHdlIHdhbnQgaXQgdG8gYmUgYXQgY2hhcHRlcnMKLSUgaWYgYXQgYWxsIHBvc3NpYmxlOyBoZW5jZSB0aGUgXHBlbmFsdHkuCi1cZGVmXGRvY2hhcGVudHJ5IzEjMnslCi0gICBccGVuYWx0eS0zMDAgXHZza2lwMVxiYXNlbGluZXNraXAgcGx1cy4zM1xiYXNlbGluZXNraXAgbWludXMuMjVcYmFzZWxpbmVza2lwCi0gICBcYmVnaW5ncm91cAotICAgICBcY2hhcGVudHJ5Zm9udHMKLSAgICAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm97IzJ9fSUKLSAgIFxlbmRncm91cAotICAgXG5vYnJlYWtcdnNraXAgLjI1XGJhc2VsaW5lc2tpcCBwbHVzLjFcYmFzZWxpbmVza2lwCi19Ci0KLVxkZWZcZG9zZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPVx0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm97IzJ9fSUKLVxlbmRncm91cH0KLQotXGRlZlxkb3N1YnNlY2VudHJ5IzEjMntcYmVnaW5ncm91cAotICBcc3Vic2VjZW50cnlmb250cyBcbGVmdHNraXA9Mlx0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm97IzJ9fSUKLVxlbmRncm91cH0KLQotXGRlZlxkb3N1YnN1YnNlY2VudHJ5IzEjMntcYmVnaW5ncm91cAotICBcc3Vic3Vic2VjZW50cnlmb250cyBcbGVmdHNraXA9M1x0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm97IzJ9fSUKLVxlbmRncm91cH0KLQotJSBGaW5hbCB0eXBlc2V0dGluZyBvZiBhIHRvYyBlbnRyeTsgd2UgdXNlIHRoZSBzYW1lIFxlbnRyeSBtYWNybyBhcyBmb3IKLSUgdGhlIGluZGV4IGVudHJpZXMsIGJ1dCB3ZSB3YW50IHRvIHN1cHByZXNzIGh5cGhlbmF0aW9uIGhlcmUuICAoV2UKLSUgY2FuJ3QgZG8gdGhhdCBpbiB0aGUgXGVudHJ5IG1hY3JvLCBzaW5jZSBpbmRleCBlbnRyaWVzIG1pZ2h0IGNvbnNpc3QKLSUgb2YgaHlwaGVuYXRlZC1pZGVudGlmaWVycy10aGF0LWRvLW5vdC1maXQtb24tYS1saW5lLWFuZC1ub3RoaW5nLWVsc2UuKQotXGRlZlx0b2NlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHZza2lwIDBwdCBwbHVzMXB0ICUgYWxsb3cgYSBsaXR0bGUgc3RyZXRjaCBmb3IgdGhlIHNha2Ugb2YgbmljZSBwYWdlIGJyZWFrcwotICAlIERvIG5vdCB1c2UgXHR1cm5vZmZhY3RpdmUgaW4gdGhlc2UgYXJndW1lbnRzLiAgU2luY2UgdGhlIHRvYyBpcwotICAlIHR5cGVzZXQgaW4gY21yLCBzbyBjaGFyYWN0ZXJzIHN1Y2ggYXMgXyB3b3VsZCBjb21lIG91dCB3cm9uZzsgd2UKLSAgJSBoYXZlIHRvIGRvIHRoZSB1c3VhbCB0cmFuc2xhdGlvbiB0cmlja3MuCi0gIFxlbnRyeXsjMX17IzJ9JQotXGVuZGdyb3VwfQotCi0lIFNwYWNlIGJldHdlZW4gY2hhcHRlciAob3Igd2hhdGV2ZXIpIG51bWJlciBhbmQgdGhlIHRpdGxlLgotXGRlZlxsYWJlbHNwYWNle1xoc2tpcDFlbSBccmVsYXh9Ci0KLVxkZWZcZG9wYWdlbm8jMXt7XHJtICMxfX0KLVxkZWZcZG9zaG9ydHBhZ2VubyMxe3tccm0gIzF9fQotCi1cZGVmXGNoYXBlbnRyeWZvbnRze1xzZWNmb250cyBccm19Ci1cZGVmXHNlY2VudHJ5Zm9udHN7XHRleHRmb250c30KLVxsZXRcc3Vic2VjZW50cnlmb250cyA9IFx0ZXh0Zm9udHMKLVxsZXRcc3Vic3Vic2VjZW50cnlmb250cyA9IFx0ZXh0Zm9udHMKLQotCi1cbWVzc2FnZXtlbnZpcm9ubWVudHMsfQotCi0lIFNpbmNlIHRoZXNlIGNoYXJhY3RlcnMgYXJlIHVzZWQgaW4gZXhhbXBsZXMsIGl0IHNob3VsZCBiZSBhbiBldmVuIG51bWJlciBvZgotJSBcdHQgd2lkdGhzLiBFYWNoIFx0dCBjaGFyYWN0ZXIgaXMgMWVuLCBzbyB0d28gbWFrZXMgaXQgMWVtLgotJSBGdXJ0aGVybW9yZSwgdGhlc2UgZGVmaW5pdGlvbnMgbXVzdCBjb21lIGFmdGVyIHdlIGRlZmluZSBvdXIgZm9udHMuCi1cbmV3Ym94XGRibGFycm93Ym94ICAgIFxuZXdib3hcbG9uZ2RibGFycm93Ym94Ci1cbmV3Ym94XHB1c2hjaGFyYm94ICAgIFxuZXdib3hcYnVsbGJveAotXG5ld2JveFxlcXVpdmJveCAgICAgICBcbmV3Ym94XGVycm9yYm94Ci0KLSV7XHRlbnR0Ci0lXGdsb2JhbFxzZXRib3hcZGJsYXJyb3dib3ggPSBcaGJveCB0byAxZW17XGhmaWwkXFJpZ2h0YXJyb3ckXGhmaWx9Ci0lXGdsb2JhbFxzZXRib3hcbG9uZ2RibGFycm93Ym94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxtYXBzdG8kXGhmaWx9Ci0lXGdsb2JhbFxzZXRib3hccHVzaGNoYXJib3ggPSBcaGJveCB0byAxZW17XGhmaWwkXGRhc2h2JFxoZmlsfQotJVxnbG9iYWxcc2V0Ym94XGVxdWl2Ym94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxwdGV4ZXF1aXYkXGhmaWx9Ci0lIEFkYXB0ZWQgZnJvbSB0aGUgbWFubWFjIGZvcm1hdCAocC40MjAgb2YgVGVYYm9vaykKLSVcZ2xvYmFsXHNldGJveFxidWxsYm94ID0gXGhib3ggdG8gMWVte1xrZXJuLjE1ZW1cdnJ1bGUgaGVpZ2h0IC43NWV4IHdpZHRoIC44NWV4Ci0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCAuMWV4XGhmaWx9Ci0lfQotCi0lIEBwb2ludHt9LCBAcmVzdWx0e30sIEBleHBhbnNpb257fSwgQHByaW50e30sIEBlcXVpdnt9LgotXGRlZlxwb2ludHskXHN0YXIkfQotXGRlZlxyZXN1bHR7XGxlYXZldm1vZGVccmFpc2UuMTVleFxoYm94IHRvIDFlbXtcaGZpbCRcUmlnaHRhcnJvdyRcaGZpbH19Ci1cZGVmXGV4cGFuc2lvbntcbGVhdmV2bW9kZVxyYWlzZS4xZXhcaGJveCB0byAxZW17XGhmaWwkXG1hcHN0byRcaGZpbH19Ci1cZGVmXHByaW50e1xsZWF2ZXZtb2RlXGxvd2VyLjFleFxoYm94IHRvIDFlbXtcaGZpbCRcZGFzaHYkXGhmaWx9fQotXGRlZlxlcXVpdntcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXHB0ZXhlcXVpdiRcaGZpbH19Ci0KLSUgQWRhcHRlZCBmcm9tIHRoZSBUZVhib29rJ3MgXGJveGl0Lgote1x0ZW50dCBcZ2xvYmFsXGRpbWVuMCA9IDNlbX0lIFdpZHRoIG9mIHRoZSBib3guCi1cZGltZW4yID0gLjU1cHQgJSBUaGlja25lc3Mgb2YgcnVsZXMKLSUgVGhlIHRleHQuIChgcicgaXMgb3BlbiBvbiB0aGUgcmlnaHQsIGBlJyBzb21ld2hhdCBsZXNzIHNvIG9uIHRoZSBsZWZ0LikKLVxzZXRib3gwID0gXGhib3h7XGtlcm4tLjc1cHQgXHRlbnNmIGVycm9yXGtlcm4tMS41cHR9Ci0KLVxnbG9iYWxcc2V0Ym94XGVycm9yYm94PVxoYm94IHRvIFxkaW1lbjB7XGhmaWwKLSAgIFxoc2l6ZSA9IFxkaW1lbjAgXGFkdmFuY2VcaHNpemUgYnkgLTUuOHB0ICUgU3BhY2UgdG8gbGVmdCtyaWdodC4KLSAgIFxhZHZhbmNlXGhzaXplIGJ5IC0yXGRpbWVuMiAlIFJ1bGVzLgotICAgXHZib3h7Ci0gICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMgotICAgICAgXGhib3h7XHZydWxlIHdpZHRoXGRpbWVuMiBca2VybjNwdCAgICAgICAgICAlIFNwYWNlIHRvIGxlZnQgb2YgdGV4dC4KLSAgICAgICAgIFx2dG9we1xrZXJuMi40cHQgXGJveDAgXGtlcm4yLjRwdH0lIFNwYWNlIGFib3ZlL2JlbG93LgotICAgICAgICAgXGtlcm4zcHRcdnJ1bGUgd2lkdGhcZGltZW4yfSUgU3BhY2UgdG8gcmlnaHQuCi0gICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMn0KLSAgICBcaGZpbH0KLQotJSBUaGUgQGVycm9ye30gY29tbWFuZC4KLVxkZWZcZXJyb3J7XGxlYXZldm1vZGVcbG93ZXIuN2V4XGNvcHlcZXJyb3Jib3h9Ci0KLSUgQHRleCAuLi4gQGVuZCB0ZXggICAgZXNjYXBlcyBpbnRvIHJhdyBUZXggdGVtcG9yYXJpbHkuCi0lIE9uZSBleGNlcHRpb246IEAgaXMgc3RpbGwgYW4gZXNjYXBlIGNoYXJhY3Rlciwgc28gdGhhdCBAZW5kIHRleCB3b3Jrcy4KLSUgQnV0IFxAIG9yIEBAIHdpbGwgZ2V0IGEgcGxhaW4gdGV4IEAgY2hhcmFjdGVyLgotCi1cZGVmXHRleHtcYmVnaW5ncm91cAotICBcY2F0Y29kZSBgXFw9MCBcY2F0Y29kZSBgXHs9MSBcY2F0Y29kZSBgXH09MgotICBcY2F0Y29kZSBgXCQ9MyBcY2F0Y29kZSBgXCY9NCBcY2F0Y29kZSBgXCM9NgotICBcY2F0Y29kZSBgXF49NyBcY2F0Y29kZSBgXF89OCBcY2F0Y29kZSBgXH49MTMgXGxldH49XHRpZQotICBcY2F0Y29kZSBgXCU9MTQKLSAgXGNhdGNvZGUgNDM9MTIgJSBwbHVzCi0gIFxjYXRjb2RlYFwiPTEyCi0gIFxjYXRjb2RlYFw9PTEyCi0gIFxjYXRjb2RlYFx8PTEyCi0gIFxjYXRjb2RlYFw8PTEyCi0gIFxjYXRjb2RlYFw+PTEyCi0gIFxlc2NhcGVjaGFyPWBcXAotICAlCi0gIFxsZXRcYj1ccHRleGIKLSAgXGxldFxidWxsZXQ9XHB0ZXhidWxsZXQKLSAgXGxldFxjPVxwdGV4YwotICBcbGV0XCw9XHB0ZXhjb21tYQotICBcbGV0XC49XHB0ZXhkb3QKLSAgXGxldFxkb3RzPVxwdGV4ZG90cwotICBcbGV0XGVxdWl2PVxwdGV4ZXF1aXYKLSAgXGxldFwhPVxwdGV4ZXhjbGFtCi0gIFxsZXRcaT1ccHRleGkKLSAgXGxldFx7PVxwdGV4bGJyYWNlCi0gIFxsZXRcKz1cdGFiYWxpZ24KLSAgXGxldFx9PVxwdGV4cmJyYWNlCi0gIFxsZXRcKj1ccHRleHN0YXIKLSAgXGxldFx0PVxwdGV4dAotICAlCi0gIFxkZWZcZW5kbGRvdHN7XG1hdGhpbm5lcntcbGRvdHNcbGRvdHNcbGRvdHNcbGRvdHN9fSUKLSAgXGRlZlxlbmRkb3Rze1xyZWxheFxpZm1tb2RlXGVuZGxkb3RzXGVsc2UkXG1hdGhzdXJyb3VuZD0wcHQgXGVuZGxkb3RzXCwkXGZpfSUKLSAgXGRlZlxAe0B9JQotXGxldFxFdGV4PVxlbmRncm91cH0KLQotJSBEZWZpbmUgQGxpc3AgLi4uIEBlbmRsaXNwLgotJSBAbGlzcCBkb2VzIGEgXGJlZ2luZ3JvdXAgc28gaXQgY2FuIHJlYmluZCB0aGluZ3MsCi0lIGluY2x1ZGluZyB0aGUgZGVmaW5pdGlvbiBvZiBAZW5kbGlzcCAod2hpY2ggbm9ybWFsbHkgaXMgZXJyb25lb3VzKS4KLQotJSBBbW91bnQgdG8gbmFycm93IHRoZSBtYXJnaW5zIGJ5IGZvciBAbGlzcC4KLVxuZXdza2lwXGxpc3BuYXJyb3dpbmcgXGxpc3BuYXJyb3dpbmc9MC40aW4KLQotJSBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIHRoYXQgXl5NIGdldHMgaW5zaWRlIEBsaXNwLCBAZXhhbXBsZSwgYW5kIG90aGVyCi0lIHN1Y2ggZW52aXJvbm1lbnRzLiAgXG51bGwgaXMgYmV0dGVyIHRoYW4gYSBzcGFjZSwgc2luY2UgaXQgZG9lc24ndAotJSBoYXZlIGFueSB3aWR0aC4KLVxkZWZcbGlzcHBhcntcbnVsbFxlbmRncmFmfQotCi0lIE1ha2UgZWFjaCBzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0IHByb2R1Y2UgYSBub3JtYWwgaW50ZXJ3b3JkCi0lIHNwYWNlIGluIHRoZSBvdXRwdXQuICBEb24ndCBhbGxvdyBhIGxpbmUgYnJlYWsgYXQgdGhpcyBzcGFjZSwgYXMgdGhpcwotJSBpcyB1c2VkIG9ubHkgaW4gZW52aXJvbm1lbnRzIGxpa2UgQGV4YW1wbGUsIHdoZXJlIGVhY2ggbGluZSBvZiBpbnB1dAotJSBzaG91bGQgcHJvZHVjZSBhIGxpbmUgb2Ygb3V0cHV0IGFueXdheS4KLSUKLXtcb2JleXNwYWNlcyAlCi1cZ2RlZlxzZXBzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cdGllfX0KLQotJSBEZWZpbmUgXG9iZXllZHNwYWNlIHRvIGJlIG91ciBhY3RpdmUgc3BhY2UsIHdoYXRldmVyIGl0IGlzLiAgVGhpcyBpcwotJSBmb3IgdXNlIGluIFxwYXJzZWFyZy4KLXtcc2Vwc3BhY2VzJQotXGdsb2JhbFxsZXRcb2JleWVkc3BhY2U9IH0KLQotJSBUaGlzIHNwYWNlIGlzIGFsd2F5cyBwcmVzZW50IGFib3ZlIGFuZCBiZWxvdyBlbnZpcm9ubWVudHMuCi1cbmV3c2tpcFxlbnZza2lwYW1vdW50IFxlbnZza2lwYW1vdW50ID0gMHB0Ci0KLSUgTWFrZSBzcGFjaW5nIGFuZCBiZWxvdyBlbnZpcm9ubWVudCBzeW1tZXRyaWNhbC4gIFdlIHVzZSBccGFyc2tpcCBoZXJlCi0lIHRvIGhlbHAgaW4gZG9pbmcgdGhhdCwgc2luY2UgaW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudHMgXHBhcnNraXAKLSUgaXMgcmVzZXQgdG8gemVybzsgdGh1cyB0aGUgXGFmdGVyZW52YnJlYWsgaW5zZXJ0cyBubyBzcGFjZSAtLSBidXQgdGhlCi0lIHN0YXJ0IG9mIHRoZSBuZXh0IHBhcmFncmFwaCB3aWxsIGluc2VydCBccGFyc2tpcAotJQotXGRlZlxhYm92ZWVudmJyZWFre3tcYWR2YW5jZVxlbnZza2lwYW1vdW50IGJ5IFxwYXJza2lwCi1cZW5kZ3JhZiBcaWZkaW1cbGFzdHNraXA8XGVudnNraXBhbW91bnQKLVxyZW1vdmVsYXN0c2tpcCBccGVuYWx0eS01MCBcdnNraXBcZW52c2tpcGFtb3VudCBcZml9fQotCi1cbGV0XGFmdGVyZW52YnJlYWsgPSBcYWJvdmVlbnZicmVhawotCi0lIFxub25hcnJvd2luZyBpcyBhIGZsYWcuICBJZiAic2V0IiwgQGxpc3AgZXRjIGRvbid0IG5hcnJvdyBtYXJnaW5zLgotXGxldFxub25hcnJvd2luZz1ccmVsYXgKLQotJSBAY2FydG91Y2hlIC4uLiBAZW5kIGNhcnRvdWNoZTogZHJhdyByZWN0YW5nbGUgdy9yb3VuZGVkIGNvcm5lcnMgYXJvdW5kCi0lIGVudmlyb25tZW50IGNvbnRlbnRzLgotXGZvbnRcY2lyY2xlPWxjaXJjbGUxMAotXG5ld2RpbWVuXGNpcmN0aGljawotXG5ld2RpbWVuXGNhcnRvdXRlclxuZXdkaW1lblxjYXJ0aW5uZXIKLVxuZXdza2lwXG5vcm1ic2tpcFxuZXdza2lwXG5vcm1wc2tpcFxuZXdza2lwXG5vcm1sc2tpcAotXGNpcmN0aGljaz1cZm9udGRpbWVuOFxjaXJjbGUKLSUKLVxkZWZcY3Rse3tcY2lyY2xlXGNoYXInMDEzXGhza2lwIC02cHR9fSUgNnB0IGZyb20gcGwgZmlsZTogMS8yY2hhcndpZHRoCi1cZGVmXGN0cnt7XGhza2lwIDZwdFxjaXJjbGVcY2hhcicwMTB9fQotXGRlZlxjYmx7e1xjaXJjbGVcY2hhcicwMTJcaHNraXAgLTZwdH19Ci1cZGVmXGNicnt7XGhza2lwIDZwdFxjaXJjbGVcY2hhcicwMTF9fQotXGRlZlxjYXJ0dG9we1xoYm94IHRvIFxjYXJ0b3V0ZXJ7XGhza2lwXGxza2lwCi0gICAgICAgIFxjdGxcbGVhZGVyc1xocnVsZSBoZWlnaHRcY2lyY3RoaWNrXGhmaWxcY3RyCi0gICAgICAgIFxoc2tpcFxyc2tpcH19Ci1cZGVmXGNhcnRib3R7XGhib3ggdG8gXGNhcnRvdXRlcntcaHNraXBcbHNraXAKLSAgICAgICAgXGNibFxsZWFkZXJzXGhydWxlIGhlaWdodFxjaXJjdGhpY2tcaGZpbFxjYnIKLSAgICAgICAgXGhza2lwXHJza2lwfX0KLSUKLVxuZXdza2lwXGxza2lwXG5ld3NraXBccnNraXAKLQotXGxvbmdcZGVmXGNhcnRvdWNoZXslCi1cYmVnaW5ncm91cAotICAgICAgICBcbHNraXA9XGxlZnRza2lwIFxyc2tpcD1ccmlnaHRza2lwCi0gICAgICAgIFxsZWZ0c2tpcD0wcHRccmlnaHRza2lwPTBwdCAld2Ugd2FudCB0aGVzZSAqb3V0c2lkZSouCi0gICAgICAgIFxjYXJ0aW5uZXI9XGhzaXplIFxhZHZhbmNlXGNhcnRpbm5lciBieS1cbHNraXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgXGFkdmFuY2VcY2FydGlubmVyIGJ5LVxyc2tpcAotICAgICAgICBcY2FydG91dGVyPVxoc2l6ZQotICAgICAgICBcYWR2YW5jZVxjYXJ0b3V0ZXIgYnkgMTguNHB0ICUgYWxsb3cgZm9yIDNwdCBrZXJucyBvbiBlaXRoZXIKLSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlLCBhbmQgZm9yIDZwdCB3YXN0ZSBmcm9tCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBjb3JuZXIgY2hhciwgYW5kIHJ1bGUgdGhpY2tuZXNzCi0gICAgICAgIFxub3JtYnNraXA9XGJhc2VsaW5lc2tpcCBcbm9ybXBza2lwPVxwYXJza2lwIFxub3JtbHNraXA9XGxpbmVza2lwCi0gICAgICAgICUgRmxhZyB0byB0ZWxsIEBsaXNwLCBldGMuLCBub3QgdG8gbmFycm93IG1hcmdpbi4KLSAgICAgICAgXGxldFxub25hcnJvd2luZz1cY29tbWVudAotICAgICAgICBcdmJveFxiZ3JvdXAKLSAgICAgICAgICAgICAgICBcYmFzZWxpbmVza2lwPTBwdFxwYXJza2lwPTBwdFxsaW5lc2tpcD0wcHQKLSAgICAgICAgICAgICAgICBcY2FydHRvcAotICAgICAgICAgICAgICAgIFxoYm94XGJncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgXGhza2lwXGxza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICBcdnJ1bGVca2VybjNwdAotICAgICAgICAgICAgICAgICAgICAgICAgXHZib3hcYmdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxoc2l6ZT1cY2FydGlubmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxrZXJuM3B0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxiZWdpbmdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGJhc2VsaW5lc2tpcD1cbm9ybWJza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGxpbmVza2lwPVxub3JtbHNraXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBccGFyc2tpcD1cbm9ybXBza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHZza2lwIC1ccGFyc2tpcAotXGRlZlxFY2FydG91Y2hleyUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVuZGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxrZXJuM3B0Ci0gICAgICAgICAgICAgICAgICAgICAgICBcZWdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICBca2VybjNwdFx2cnVsZQotICAgICAgICAgICAgICAgICAgICAgICAgXGhza2lwXHJza2lwCi0gICAgICAgICAgICAgICAgXGVncm91cAotICAgICAgICAgICAgICAgIFxjYXJ0Ym90Ci0gICAgICAgIFxlZ3JvdXAKLVxlbmRncm91cAotfX0KLQotCi0lIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIHRoZSBAZXhhbXBsZSB2YXJpYW50cywKLSUgaW5zaWRlIGEgZ3JvdXAuCi1cZGVmXG5vbmZpbGxzdGFydHslCi0gIFxhYm92ZWVudmJyZWFrCi0gIFxpbkVOViAlIFRoaXMgZ3JvdXAgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBib2R5Ci0gIFxoZnV6eiA9IDEycHQgJSBEb24ndCBiZSBmdXNzeQotICBcc2Vwc3BhY2VzICUgTWFrZSBzcGFjZXMgYmUgd29yZC1zZXBhcmF0b3JzIHJhdGhlciB0aGFuIHNwYWNlIHRva2Vucy4KLSAgXHNpbmdsZXNwYWNlCi0gIFxsZXRccGFyID0gXGxpc3BwYXIgJSBkb24ndCBpZ25vcmUgYmxhbmsgbGluZXMKLSAgXG9iZXlsaW5lcyAlIGVhY2ggbGluZSBvZiBpbnB1dCBpcyBhIGxpbmUgb2Ygb3V0cHV0Ci0gIFxwYXJza2lwID0gMHB0Ci0gIFxwYXJpbmRlbnQgPSAwcHQKLSAgXGVtZXJnZW5jeXN0cmV0Y2ggPSAwcHQgJSBkb24ndCB0cnkgdG8gYXZvaWQgb3ZlcmZ1bGwgYm94ZXMKLSAgJSBAY2FydG91Y2hlIGRlZmluZXMgXG5vbmFycm93aW5nIHRvIGluaGliaXQgbmFycm93aW5nCi0gICUgYXQgbmV4dCBsZXZlbCBkb3duLgotICBcaWZ4XG5vbmFycm93aW5nXHJlbGF4Ci0gICAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nCi0gICAgXGV4ZGVudGFtb3VudD1cbGlzcG5hcnJvd2luZwotICAgIFxsZXRcZXhkZW50PVxub2ZpbGxleGRlbnQKLSAgICBcbGV0XG5vbmFycm93aW5nPVxyZWxheAotICBcZmkKLX0KLQotJSBEZWZpbmUgdGhlIFxFLi4uIGNvbnRyb2wgc2VxdWVuY2Ugb25seSBpZiB3ZSBhcmUgaW5zaWRlIHRoZSBwYXJ0aWN1bGFyCi0lIGVudmlyb25tZW50LCBzbyB0aGUgZXJyb3IgY2hlY2tpbmcgaW4gXGVuZCB3aWxsIHdvcmsuCi0lIAotJSBUbyBlbmQgYW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudCwgd2UgZmlyc3QgZW5kIHRoZSBwYXJhZ3JhcGggKHZpYQotJSBcYWZ0ZXJlbnZicmVhaydzIHZlcnRpY2FsIGdsdWUpLCBhbmQgdGhlbiB0aGUgZ3JvdXAuICBUaGF0IHdheSB3ZSBrZWVwCi0lIHRoZSB6ZXJvIFxwYXJza2lwIHRoYXQgdGhlIGVudmlyb25tZW50cyBzZXQgLS0gXHBhcnNraXAgZ2x1ZSB3aWxsIGJlCi0lIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcGFyYWdyYXBoIGluIHRoZSBkb2N1bWVudCwgYWZ0ZXIKLSUgdGhlIGVudmlyb25tZW50LgotJQotXGRlZlxub25maWxsZmluaXNoe1xhZnRlcmVudmJyZWFrXGVuZGdyb3VwfQotCi0lIEBsaXNwOiBpbmRlbnRlZCwgbmFycm93ZWQsIHR5cGV3cml0ZXIgZm9udC4KLVxkZWZcbGlzcHtcYmVnaW5ncm91cAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWxpc3AgPSBcbm9uZmlsbGZpbmlzaAotICBcdHQKLSAgXGxldFxrYmRmb250ID0gXGtiZGV4YW1wbGVmb250ICUgQWxsb3cgQGtiZCB0byBkbyBzb21ldGhpbmcgc3BlY2lhbC4KLSAgXGdvYmJsZSAgICAgICAlIGVhdCByZXR1cm4KLX0KLQotJSBAZXhhbXBsZTogU2FtZSBhcyBAbGlzcC4KLVxkZWZcZXhhbXBsZXtcYmVnaW5ncm91cCBcZGVmXEVleGFtcGxle1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxsaXNwfQotCi0lIEBzbWFsbC4uLiBpcyB1c3VhbGx5IGVxdWl2YWxlbnQgdG8gdGhlIG5vbi1zbWFsbCAoQHNtYWxsYm9vawotJSByZWRlZmluZXMpLiAgV2UgbXVzdCBjYWxsIFxleGFtcGxlIChvciB3aGF0ZXZlcikgbGFzdCBpbiB0aGUKLSUgZGVmaW5pdGlvbiwgc2luY2UgaXQgcmVhZHMgdGhlIHJldHVybiBmb2xsb3dpbmcgdGhlIEBleGFtcGxlIChvcgotJSB3aGF0ZXZlcikgY29tbWFuZC4KLSUgCi0lIFRoaXMgYWN0dWFsbHkgYWxsb3dzIChmb3IgZXhhbXBsZSkgQGVuZCBkaXNwbGF5IGluc2lkZSBhbgotJSBAc21hbGxkaXNwbGF5LiAgVG9vIGJhZCwgYnV0IG1ha2VpbmZvIHdpbGwgY2F0Y2ggdGhlIGVycm9yIGFueXdheS4KLSUKLVxkZWZcc21hbGxkaXNwbGF5e1xiZWdpbmdyb3VwXGRlZlxFc21hbGxkaXNwbGF5e1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxkaXNwbGF5fQotXGRlZlxzbWFsbGV4YW1wbGV7XGJlZ2luZ3JvdXBcZGVmXEVzbWFsbGV4YW1wbGV7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGxpc3B9Ci1cZGVmXHNtYWxsZm9ybWF0e1xiZWdpbmdyb3VwXGRlZlxFc21hbGxmb3JtYXR7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGZvcm1hdH0KLVxkZWZcc21hbGxsaXNwe1xiZWdpbmdyb3VwXGRlZlxFc21hbGxsaXNwe1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxsaXNwfQotCi0lIFJlYWwgQHNtYWxsZXhhbXBsZSBhbmQgQHNtYWxsbGlzcCAod2hlbiBAc21hbGxib29rKTogdXNlIHNtYWxsZXIgZm9udHMuCi0lIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgUGF2ZWxAeGVyb3guCi1cZGVmXHNtYWxsbGlzcHh7XGJlZ2luZ3JvdXAKLSAgXGRlZlxFc21hbGxsaXNwe1xub25maWxsZmluaXNoXGVuZGdyb3VwfSUKLSAgXGRlZlxFc21hbGxleGFtcGxle1xub25maWxsZmluaXNoXGVuZGdyb3VwfSUKLSAgXGluZGV4Zm9udHMKLSAgXGxpc3AKLX0KLQotJSBAZGlzcGxheTogc2FtZSBhcyBAbGlzcCBleGNlcHQga2VlcCBjdXJyZW50IGZvbnQuCi0lCi1cZGVmXGRpc3BsYXl7XGJlZ2luZ3JvdXAKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVkaXNwbGF5ID0gXG5vbmZpbGxmaW5pc2gKLSAgXGdvYmJsZQotfQotCi0lIEBzbWFsbGRpc3BsYXkgKHdoZW4gQHNtYWxsYm9vayk6IEBkaXNwbGF5IHBsdXMgc21hbGxlciBmb250cy4KLSUKLVxkZWZcc21hbGxkaXNwbGF5eHtcYmVnaW5ncm91cAotICBcZGVmXEVzbWFsbGRpc3BsYXl7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9JQotICBcaW5kZXhmb250cyBccm0KLSAgXGRpc3BsYXkKLX0KLQotJSBAZm9ybWF0OiBzYW1lIGFzIEBkaXNwbGF5IGV4Y2VwdCBkb24ndCBuYXJyb3cgbWFyZ2lucy4KLSUKLVxkZWZcZm9ybWF0e1xiZWdpbmdyb3VwCi0gIFxsZXRcbm9uYXJyb3dpbmcgPSB0Ci0gIFxub25maWxsc3RhcnQKLSAgXGxldFxFZm9ybWF0ID0gXG5vbmZpbGxmaW5pc2gKLSAgXGdvYmJsZQotfQotCi0lIEBzbWFsbGZvcm1hdCAod2hlbiBAc21hbGxib29rKTogQGZvcm1hdCBwbHVzIHNtYWxsZXIgZm9udHMuCi0lCi1cZGVmXHNtYWxsZm9ybWF0eHtcYmVnaW5ncm91cAotICBcZGVmXEVzbWFsbGZvcm1hdHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH0lCi0gIFxpbmRleGZvbnRzIFxybQotICBcZm9ybWF0Ci19Ci0KLSUgQGZsdXNobGVmdCAoc2FtZSBhcyBAZm9ybWF0KS4KLSUKLVxkZWZcZmx1c2hsZWZ0e1xiZWdpbmdyb3VwIFxkZWZcRWZsdXNobGVmdHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cZm9ybWF0fQotCi0lIEBmbHVzaHJpZ2h0LgotJSAKLVxkZWZcZmx1c2hyaWdodHtcYmVnaW5ncm91cAotICBcbGV0XG5vbmFycm93aW5nID0gdAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWZsdXNocmlnaHQgPSBcbm9uZmlsbGZpbmlzaAotICBcYWR2YW5jZVxsZWZ0c2tpcCBieSAwcHQgcGx1cyAxZmlsbAotICBcZ29iYmxlCi19Ci0KLSUgQHF1b3RhdGlvbiBkb2VzIG5vcm1hbCBsaW5lYnJlYWtpbmcgKGhlbmNlIHdlIGNhbid0IHVzZSBcbm9uZmlsbHN0YXJ0KQotJSBhbmQgbmFycm93cyB0aGUgbWFyZ2lucy4KLSUKLVxkZWZccXVvdGF0aW9ueyUKLSAgXGJlZ2luZ3JvdXBcaW5FTlYgJVRoaXMgZ3JvdXAgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBAcXVvdGF0aW9uIGJvZHkKLSAge1xwYXJza2lwPTBwdCBcYWJvdmVlbnZicmVha30lIGJlY2F1c2UgXGFib3ZlZW52YnJlYWsgaW5zZXJ0cyBccGFyc2tpcAotICBcc2luZ2xlc3BhY2UKLSAgXHBhcmluZGVudD0wcHQKLSAgJSBXZSBoYXZlIHJldGFpbmVkIGEgbm9uemVybyBwYXJza2lwIGZvciB0aGUgZW52aXJvbm1lbnQsIHNpbmNlIHdlJ3JlCi0gICUgZG9pbmcgbm9ybWFsIGZpbGxpbmcuIFNvIHRvIGF2b2lkIGV4dHJhIHNwYWNlIGJlbG93IHRoZSBlbnZpcm9ubWVudC4uLgotICBcZGVmXEVxdW90YXRpb257XHBhcnNraXAgPSAwcHQgXG5vbmZpbGxmaW5pc2h9JQotICAlCi0gICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZyBhdCBuZXh0IGxldmVsIGRvd24uCi0gIFxpZnhcbm9uYXJyb3dpbmdccmVsYXgKLSAgICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZwotICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSBcbGlzcG5hcnJvd2luZwotICAgIFxleGRlbnRhbW91bnQgPSBcbGlzcG5hcnJvd2luZwotICAgIFxsZXRcbm9uYXJyb3dpbmcgPSBccmVsYXgKLSAgXGZpCi19Ci0KLQotXG1lc3NhZ2V7ZGVmdW5zLH0KLSUgRGVmaW5lIGZvcm1hdHRlciBmb3IgZGVmdW5zCi0lIEZpcnN0LCBhbGxvdyB1c2VyIHRvIGNoYW5nZSBkZWZpbml0aW9uIG9iamVjdCBmb250IChcZGYpIGludGVybmFsbHkKLVxkZWZcc2V0ZGVmZm9udCAjMSB7XGNzbmFtZSBERUYjMVxlbmRjc25hbWV9Ci0KLVxuZXdza2lwXGRlZmJvZHlpbmRlbnQgXGRlZmJvZHlpbmRlbnQ9LjRpbgotXG5ld3NraXBcZGVmYXJnc2luZGVudCBcZGVmYXJnc2luZGVudD01MHB0Ci1cbmV3c2tpcFxkZWZ0eXBlbWFyZ2luIFxkZWZ0eXBlbWFyZ2luPTEycHQKLVxuZXdza2lwXGRlZmxhc3RhcmdtYXJnaW4gXGRlZmxhc3RhcmdtYXJnaW49MThwdAotCi1cbmV3Y291bnRccGFyZW5jb3VudAotJSBkZWZpbmUgXGZ1bmN0aW9ucGFyZW5zLCB3aGljaCBtYWtlcyAoIGFuZCApIGFuZCAmIGRvIHNwZWNpYWwgdGhpbmdzLgotJSBcZnVuY3Rpb25wYXJlbnMgYWZmZWN0cyB0aGUgZ3JvdXAgaXQgaXMgY29udGFpbmVkIGluLgotXGRlZlxhY3RpdmVwYXJlbnN7JQotXGNhdGNvZGVgXCg9XGFjdGl2ZSBcY2F0Y29kZWBcKT1cYWN0aXZlIFxjYXRjb2RlYFwmPVxhY3RpdmUKLVxjYXRjb2RlYFxbPVxhY3RpdmUgXGNhdGNvZGVgXF09XGFjdGl2ZX0KLQotJSBNYWtlIGNvbnRyb2wgc2VxdWVuY2VzIHdoaWNoIGFjdCBsaWtlIG5vcm1hbCBwYXJlbnRoZXNpcyBjaGFycy4KLVxsZXRcbHBhcmVuID0gKCBcbGV0XHJwYXJlbiA9ICkKLQote1xhY3RpdmVwYXJlbnMgJSBOb3csIHNtYXJ0IHBhcmVucyBkb24ndCB0dXJuIG9uIHVudGlsICZmb28gKHNlZSBcYW1wcm0pCi0KLSUgQmUgc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGEgZGVmaW5pdGlvbiBmb3IgYCgnLCBldGMuICBGb3IgZXhhbXBsZSwKLSUgaWYgdGhlIGZuIG5hbWUgaGFzIHBhcmVucyBpbiBpdCwgXGJvbGRicmF4IHdpbGwgbm90IGJlIGluIGVmZmVjdCB5ZXQsCi0lIHNvIFRlWCB3b3VsZCBvdGhlcndpc2UgY29tcGxhaW4gYWJvdXQgdW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2UuCi1cZ2xvYmFsXGxldCg9XGxwYXJlbiBcZ2xvYmFsXGxldCk9XHJwYXJlbgotXGdsb2JhbFxsZXRbPVxsYnJhY2sgXGdsb2JhbFxsZXRdPVxyYnJhY2sKLQotXGdkZWZcZnVuY3Rpb25wYXJlbnN7XGJvbGRicmF4XGxldCY9XGFtcHJtXHBhcmVuY291bnQ9MCB9Ci1cZ2RlZlxib2xkYnJheHtcbGV0KD1cb3BuclxsZXQpPVxjbG5yXGxldFs9XGxicmJcbGV0XT1ccmJyYn0KLSUgVGhpcyBpcyB1c2VkIHRvIHR1cm4gb24gc3BlY2lhbCBwYXJlbnMKLSUgYnV0IG1ha2UgJiBhY3Qgb3JkaW5hcnkgKGdpdmVuIHRoYXQgaXQncyBhY3RpdmUpLgotXGdkZWZcYm9sZGJyYXhub2FtcHtcbGV0KD1cb3BuclxsZXQpPVxjbG5yXGxldFs9XGxicmJcbGV0XT1ccmJyYlxsZXQmPVxhbXBucn0KLQotJSBEZWZpbml0aW9ucyBvZiAoLCApIGFuZCAmIHVzZWQgaW4gYXJncyBmb3IgZnVuY3Rpb25zLgotJSBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIG9mICggb3V0c2lkZSBvZiBhbGwgcGFyZW50aGVzZXMuCi1cZ2RlZlxvcHJtIzEge3tccm1cY2hhcmBcKH0jMSBcYmYgXGxldCg9XG9wbmVzdGVkCi0gIFxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IDEKLX0KLSUKLSUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBvZiAoIHdoZW4gYWxyZWFkeSBpbnNpZGUgYSBsZXZlbCBvZiBwYXJlbnMuCi1cZ2RlZlxvcG5lc3RlZHtcY2hhcmBcKFxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IDEgfQotJQotXGdkZWZcY2xybXslIFByaW50IGEgcGFyZW4gaW4gcm9tYW4gaWYgaXQgaXMgdGFraW5nIHVzIGJhY2sgdG8gZGVwdGggb2YgMC4KLSAgJSBhbHNvIGluIHRoYXQgY2FzZSByZXN0b3JlIHRoZSBvdXRlci1sZXZlbCBkZWZpbml0aW9uIG9mICguCi0gIFxpZm51bSBccGFyZW5jb3VudD0xIHtccm0gXGNoYXIgYFwpfVxzbCBcbGV0KD1cb3BybSBcZWxzZSBcY2hhciBgXCkgXGZpCi0gIFxnbG9iYWxcYWR2YW5jZSBccGFyZW5jb3VudCBieSAtMSB9Ci0lIElmIHdlIGVuY291bnRlciAmZm9vLCB0aGVuIHR1cm4gb24gKCktaGFja2luZyBhZnRlcndhcmRzCi1cZ2RlZlxhbXBybSMxIHt7XHJtXCYjMX1cbGV0KD1cb3BybSBcbGV0KT1cY2xybVwgfQotJQotXGdkZWZcbm9ybWFscGFyZW5ze1xib2xkYnJheFxsZXQmPVxhbXBucn0KLX0gJSBFbmQgb2YgZGVmaW5pdGlvbiBpbnNpZGUgXGFjdGl2ZXBhcmVucwotJSUgVGhlc2UgcGFyZW5zIChpbiBcYm9sZGJyYXgpIGFjdHVhbGx5IGFyZSBhIGxpdHRsZSBib2xkZXIgdGhhbiB0aGUKLSUlIGNvbnRhaW5lZCB0ZXh0LiAgVGhpcyBpcyBlc3BlY2lhbGx5IG5lZWRlZCBmb3IgWyBhbmQgXQotXGRlZlxvcG5ye3tcc2ZcY2hhcmBcKH1cZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxIH0KLVxkZWZcY2xucnt7XHNmXGNoYXJgXCl9XGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgLTEgfQotXGRlZlxhbXBucntcJn0KLVxkZWZcbGJyYnt7XGJmXGNoYXJgXFt9fQotXGRlZlxyYnJie3tcYmZcY2hhcmBcXX19Ci0KLSUgRmlyc3QsIGRlZm5hbWUsIHdoaWNoIGZvcm1hdHMgdGhlIGhlYWRlciBsaW5lIGl0c2VsZi4KLSUgIzEgc2hvdWxkIGJlIHRoZSBmdW5jdGlvbiBuYW1lLgotJSAjMiBzaG91bGQgYmUgdGhlIHR5cGUgb2YgZGVmaW5pdGlvbiwgc3VjaCBhcyAiRnVuY3Rpb24iLgotCi1cZGVmXGRlZm5hbWUgIzEjMnslCi0lIEdldCB0aGUgdmFsdWVzIG9mIFxsZWZ0c2tpcCBhbmQgXHJpZ2h0c2tpcCBhcyB0aGV5IHdlcmUKLSUgb3V0c2lkZSB0aGUgQGRlZi4uLgotXGRpbWVuMj1cbGVmdHNraXAKLVxhZHZhbmNlXGRpbWVuMiBieSAtXGRlZmJvZHlpbmRlbnQKLVxub2luZGVudAotXHNldGJveDA9XGhib3h7XGhza2lwIFxkZWZsYXN0YXJnbWFyZ2lue1xybSAjMn1caHNraXAgXGRlZnR5cGVtYXJnaW59JQotXGRpbWVuMD1caHNpemUgXGFkdmFuY2UgXGRpbWVuMCBieSAtXHdkMCAlIGNvbXB1dGUgc2l6ZSBmb3IgZmlyc3QgbGluZQotXGRpbWVuMT1caHNpemUgXGFkdmFuY2UgXGRpbWVuMSBieSAtXGRlZmFyZ3NpbmRlbnQgJXNpemUgZm9yIGNvbnRpbnVhdGlvbnMKLVxwYXJzaGFwZSAyIDBpbiBcZGltZW4wIFxkZWZhcmdzaW5kZW50IFxkaW1lbjEKLSUgTm93IG91dHB1dCBhcmcgMiAoIkZ1bmN0aW9uIiBvciBzb21lIHN1Y2gpCi0lIGVuZGluZyBhdCBcZGVmdHlwZW1hcmdpbiBmcm9tIHRoZSByaWdodCBtYXJnaW4sCi0lIGJ1dCBzdHVjayBpbnNpZGUgYSBib3ggb2Ygd2lkdGggMCBzbyBpdCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBsaW5lYnJlYWtpbmcKLXslIEFkanVzdCBcaHNpemUgdG8gZXhjbHVkZSB0aGUgYW1iaWVudCBtYXJnaW5zLAotJSBzbyB0aGF0IFxyaWdodGxpbmUgd2lsbCBvYmV5IHRoZW0uCi1cYWR2YW5jZSBcaHNpemUgYnkgLVxkaW1lbjIKLVxybGFwe1xyaWdodGxpbmV7e1xybSAjMn1caHNraXAgLTEuMjVwYyB9fX0lCi0lIE1ha2UgYWxsIGxpbmVzIHVuZGVyZnVsbCBhbmQgbm8gY29tcGxhaW50czoKLVx0b2xlcmFuY2U9MTAwMDAgXGhiYWRuZXNzPTEwMDAwCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSAtXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLXtcZGYgIzF9XGVuc2tpcCAgICAgICAgJSBHZW5lcmF0ZSBmdW5jdGlvbiBuYW1lCi19Ci0KLSUgQWN0dWFsbHkgcHJvY2VzcyB0aGUgYm9keSBvZiBhIGRlZmluaXRpb24KLSUgIzEgc2hvdWxkIGJlIHRoZSB0ZXJtaW5hdGluZyBjb250cm9sIHNlcXVlbmNlLCBzdWNoIGFzIFxFZGVmdW4uCi0lICMyIHNob3VsZCBiZSB0aGUgImFub3RoZXIgbmFtZSIgY29udHJvbCBzZXF1ZW5jZSwgc3VjaCBhcyBcZGVmdW54LgotJSAjMyBzaG91bGQgYmUgdGhlIGNvbnRyb2wgc2VxdWVuY2UgdGhhdCBhY3R1YWxseSBwcm9jZXNzZXMgdGhlIGhlYWRlciwKLSUgICAgc3VjaCBhcyBcZGVmdW5oZWFkZXIuCi0KLVxkZWZcZGVmcGFyc2Vib2R5ICMxIzIjM3tcYmVnaW5ncm91cFxpbkVOViUgRW52aXJvbm1lbnQgZm9yIGRlZmluaXRpb25ib2R5Ci1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMntcYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXQjM30lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwICUKLVxjYXRjb2RlIDYxPVxhY3RpdmUgJSA2MSBpcyBgPScKLVxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXQjM30KLQotJSAjMSBpcyB0aGUgXEUuLi4gY29udHJvbCBzZXF1ZW5jZSB0byBlbmQgdGhlIGRlZmluaXRpb24gKHdoaWNoIHdlIGRlZmluZSkuCi0lICMyIGlzIHRoZSBcLi4ueCBjb250cm9sIHNlcXVlbmNlIGZvciBjb25zZWN1dGl2ZSBmbnMgKHdoaWNoIHdlIGRlZmluZSkuCi0lICMzIGlzIHRoZSBjb250cm9sIHNlcXVlbmNlIHRvIGNhbGwgdG8gcmVzdW1lIHByb2Nlc3NpbmcuCi0lICM0LCBkZWxpbWl0ZWQgYnkgdGhlIHNwYWNlLCBpcyB0aGUgY2xhc3MgbmFtZS4KLSUgCi1cZGVmXGRlZm1ldGhwYXJzZWJvZHkjMSMyIzMjNCB7XGJlZ2luZ3JvdXBcaW5FTlYgJQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzIjIzEge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjIzF9fX0lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjNH19fQotCi0lIEBkZWZ0eXBlbWV0aG9kIGhhcyBhbiBleHRyYSBhcmd1bWVudCB0aGF0IG5vdGhpbmcgZWxzZSBkb2VzLiAgU2lnaC4KLSUgIzEgaXMgdGhlIFxFLi4uIGNvbnRyb2wgc2VxdWVuY2UgdG8gZW5kIHRoZSBkZWZpbml0aW9uICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMiBpcyB0aGUgXC4uLnggY29udHJvbCBzZXF1ZW5jZSBmb3IgY29uc2VjdXRpdmUgZm5zICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMyBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSB0byBjYWxsIHRvIHJlc3VtZSBwcm9jZXNzaW5nLgotJSAjNCwgZGVsaW1pdGVkIGJ5IHRoZSBzcGFjZSwgaXMgdGhlIGNsYXNzIG5hbWUuCi0lICM1IGlzIHRoZSBtZXRob2QncyByZXR1cm4gdHlwZS4KLSUgCi1cZGVmXGRlZnR5cGVtZXRocGFyc2Vib2R5IzEjMiMzIzQgIzUge1xiZWdpbmdyb3VwXGluRU5WICUKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMyIyMxICMjMiB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyMjMX17IyMyfX19JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IzR9eyM1fX19Ci0KLVxkZWZcZGVmb3BwYXJzZWJvZHkgIzEjMiMzIzQjNSB7XGJlZ2luZ3JvdXBcaW5FTlYgJQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzIjIzEgIyMyIHtcZGVmIzR7IyMxfSUKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjIzJ9fX0lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjNX19fQotCi0lIFRoZXNlIHBhcnNpbmcgZnVuY3Rpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBwcmVjZWRpbmcgb25lcwotJSBleGNlcHQgdGhhdCB0aGV5IGRvIG5vdCBtYWtlIHBhcmVucyBpbnRvIGFjdGl2ZSBjaGFyYWN0ZXJzLgotJSBUaGVzZSBhcmUgdXNlZCBmb3IgInZhcmlhYmxlcyIgc2luY2UgdGhleSBoYXZlIG5vIGFyZ3VtZW50cy4KLQotXGRlZlxkZWZ2YXJwYXJzZWJvZHkgIzEjMiMze1xiZWdpbmdyb3VwXGluRU5WJSBFbnZpcm9ubWVudCBmb3IgZGVmaW5pdGlvbmJvZHkKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMye1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xzcGFjZXNwbGl0IzN9JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cCAlCi1cY2F0Y29kZSA2MT1cYWN0aXZlICUKLVxvYmV5bGluZXNcc3BhY2VzcGxpdCMzfQotCi0lIFRoaXMgaXMgdXNlZCBmb3IgXGRlZnt0cCx2cn1wYXJzZWJvZHkuICBJdCBjb3VsZCBwcm9iYWJseSBiZSB1c2VkIGZvcgotJSBzb21lIG9mIHRoZSBvdGhlcnMsIHRvbywgd2l0aCBzb21lIGp1ZGljaW91cyBjb25kaXRpb25hbHMuCi0lCi1cZGVmXHBhcnNlYm9keWNvbW1vbiMxIzIjM3slCi0gIFxiZWdpbmdyb3VwXGluRU5WICUKLSAgXG1lZGJyZWFrICUKLSAgJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotICAlIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi0gIFxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi0gIFxkZWYjMiMjMSB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXHNwYWNlc3BsaXR7IzN7IyMxfX19JQotICBccGFyaW5kZW50PTBpbgotICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotICBcZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci0gIFxiZWdpbmdyb3VwXG9iZXlsaW5lcwotfQotCi1cZGVmXGRlZnZycGFyc2Vib2R5IzEjMiMzIzQgeyUKLSAgXHBhcnNlYm9keWNvbW1vbnsjMX17IzJ9eyMzfSUKLSAgXHNwYWNlc3BsaXR7IzN7IzR9fSUKLX0KLQotJSBUaGlzIGxvc2VzIG9uIGBAZGVmdHAge0RhdGEgVHlwZX0ge3N0cnVjdCB0ZXJtaW9zfScgLS0gaXQgdGhpbmtzIHRoZQotJSB0eXBlIGlzIGp1c3QgYHN0cnVjdCcsIGJlY2F1c2Ugd2UgbG9zZSB0aGUgYnJhY2VzIGluIGB7c3RydWN0Ci0lIHRlcm1pb3N9JyB3aGVuIFxzcGFjZXNwbGl0IHJlYWRzIGl0cyB1bmRlbGltaXRlZCBhcmd1bWVudC4gIFNpZ2guCi0lIFxsZXRcZGVmdHBwYXJzZWJvZHk9XGRlZnZycGFyc2Vib2R5Ci0lCi0lIFNvLCB0byBnZXQgYXJvdW5kIHRoaXMsIHdlIHB1dCBcZW1wdHkgaW4gd2l0aCB0aGUgdHlwZSBuYW1lLiAgVGhhdAotJSB3YXksIFRlWCB3b24ndCBmaW5kIGV4YWN0bHkgYHsuLi59JyBhcyBhbiB1bmRlbGltaXRlZCBhcmd1bWVudCwgYW5kCi0lIHdvbid0IHN0cmlwIG9mZiB0aGUgYnJhY2VzLgotJQotXGRlZlxkZWZ0cHBhcnNlYm9keSAjMSMyIzMjNCB7JQotICBccGFyc2Vib2R5Y29tbW9ueyMxfXsjMn17IzN9JQotICBcc3BhY2VzcGxpdHtccGFyc2V0cGhlYWRlcmxpbmV7IzN7IzR9fX1cZW1wdHkKLX0KLQotJSBGaW5lLCBidXQgdGhlbiB3ZSBoYXZlIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoZSBcZW1wdHkgKmFuZCogdGhlCi0lIGJyYWNlcyAoaWYgYW55KS4gIFRoYXQncyB3aGF0IHRoaXMgZG9lcy4KLSUKLVxkZWZccmVtb3ZlZW1wdHlicmFjZXNcZW1wdHkjMVxyZWxheHsjMX0KLQotJSBBZnRlciBcc3BhY2VzcGxpdCBoYXMgZG9uZSBpdHMgd29yaywgdGhpcyBpcyBjYWxsZWQgLS0gIzEgaXMgdGhlIGZpbmFsCi0lIHRoaW5nIHRvIGNhbGwsICMyIHRoZSB0eXBlIG5hbWUgKHdoaWNoIHN0YXJ0cyB3aXRoIFxlbXB0eSksIGFuZCAjMwotJSAod2hpY2ggbWlnaHQgYmUgZW1wdHkpIHRoZSBhcmd1bWVudHMuCi0lCi1cZGVmXHBhcnNldHBoZWFkZXJsaW5lIzEjMiMzeyUKLSAgIzF7XHJlbW92ZWVtcHR5YnJhY2VzIzJccmVsYXh9eyMzfSUKLX0lCi0KLVxkZWZcZGVmb3B2YXJwYXJzZWJvZHkgIzEjMiMzIzQjNSB7XGJlZ2luZ3JvdXBcaW5FTlYgJQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzIjIzEgIyMyIHtcZGVmIzR7IyMxfSUKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xzcGFjZXNwbGl0eyMzeyMjMn19fSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXHNwYWNlc3BsaXR7IzN7IzV9fX0KLQotJSBTcGxpdCB1cCAjMiBhdCB0aGUgZmlyc3Qgc3BhY2UgdG9rZW4uCi0lIGNhbGwgIzEgd2l0aCB0d28gYXJndW1lbnRzOgotJSAgdGhlIGZpcnN0IGlzIGFsbCBvZiAjMiBiZWZvcmUgdGhlIHNwYWNlIHRva2VuLAotJSAgdGhlIHNlY29uZCBpcyBhbGwgb2YgIzIgYWZ0ZXIgdGhhdCBzcGFjZSB0b2tlbi4KLSUgSWYgIzIgY29udGFpbnMgbm8gc3BhY2UgdG9rZW4sIGFsbCBvZiBpdCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZwotJSBhbmQgdGhlIHNlY29uZCBpcyBwYXNzZWQgYXMgZW1wdHkuCi0KLXtcb2JleWxpbmVzCi1cZ2RlZlxzcGFjZXNwbGl0IzEjMl5eTXtcZW5kZ3JvdXBcc3BhY2VzcGxpdGZvb3sjMX0jMiBccmVsYXhcc3BhY2VzcGxpdGZvb30lCi1cbG9uZ1xnZGVmXHNwYWNlc3BsaXRmb28jMSMyICMzIzRcc3BhY2VzcGxpdGZvb3slCi1caWZ4XHJlbGF4ICMzJQotIzF7IzJ9e31cZWxzZSAjMXsjMn17IzMjNH1cZml9fQotCi0lIFNvIG11Y2ggZm9yIHRoZSB0aGluZ3MgY29tbW9uIHRvIGFsbCBraW5kcyBvZiBkZWZpbml0aW9ucy4KLQotJSBEZWZpbmUgQGRlZnVuLgotCi0lIEZpcnN0LCBkZWZpbmUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyB3YW50ZWQgZm9yIGFyZ3VtZW50cyBvZiBcZGVmdW4KLSUgVXNlIHRoaXMgdG8gZXhwYW5kIHRoZSBhcmdzIGFuZCB0ZXJtaW5hdGUgdGhlIHBhcmFncmFwaCB0aGV5IG1ha2UgdXAKLQotXGRlZlxkZWZ1bmFyZ3MgIzF7XGZ1bmN0aW9ucGFyZW5zIFxzbAotJSBFeHBhbmQsIHByZXZlbnRpbmcgaHlwaGVuYXRpb24gYXQgYC0nIGNoYXJzLgotJSBOb3RlIHRoYXQgZ3JvdXBzIGRvbid0IGFmZmVjdCBjaGFuZ2VzIGluIFxoeXBoZW5jaGFyLgotXGh5cGhlbmNoYXJcdGVuc2w9MAotIzElCi1caHlwaGVuY2hhclx0ZW5zbD00NQotXGlmbnVtXHBhcmVuY291bnQ9MCBcZWxzZSBcZXJybWVzc2FnZXtVbmJhbGFuY2VkIHBhcmVudGhlc2VzIGluIEBkZWZ9XGZpJQotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxhZHZhbmNlXHJpZ2h0c2tpcCBieSAwcHQgcGx1cyAxZmlsCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi19Ci0KLVxkZWZcZGVmdHlwZWZ1bmFyZ3MgIzF7JQotJSBFeHBhbmQsIHByZXZlbnRpbmcgaHlwaGVuYXRpb24gYXQgYC0nIGNoYXJzLgotJSBOb3RlIHRoYXQgZ3JvdXBzIGRvbid0IGFmZmVjdCBjaGFuZ2VzIGluIFxoeXBoZW5jaGFyLgotJSBVc2UgXGJvbGRicmF4bm9hbXAsIG5vdCBcZnVuY3Rpb25wYXJlbnMsIHNvIHRoYXQgJiBpcyBub3Qgc3BlY2lhbC4KLVxib2xkYnJheG5vYW1wCi1cdGNsb3NleyMxfSUgYXZvaWQgXGNvZGUgYmVjYXVzZSBvZiBzaWRlIGVmZmVjdHMgb24gYWN0aXZlIGNoYXJzCi1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGFkdmFuY2VccmlnaHRza2lwIGJ5IDBwdCBwbHVzIDFmaWwKLVxlbmRncmFmXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwXG5vYnJlYWsKLX0KLQotJSBEbyBjb21wbGV0ZSBwcm9jZXNzaW5nIG9mIG9uZSBAZGVmdW4gb3IgQGRlZnVueCBsaW5lIGFscmVhZHkgcGFyc2VkLgotCi0lIEBkZWZmbiBDb21tYW5kIGZvcndhcmQtY2hhciBuY2hhcnMKLQotXGRlZlxkZWZmbntcZGVmbWV0aHBhcnNlYm9keVxFZGVmZm5cZGVmZm54XGRlZmZuaGVhZGVyfQotCi1cZGVmXGRlZmZuaGVhZGVyICMxIzIjM3tcZG9pbmQge2ZufXtcY29kZXsjMn19JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9eyMxfVxkZWZ1bmFyZ3N7IzN9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBAZGVmdW4gPT0gQGRlZmZuIEZ1bmN0aW9uCi0KLVxkZWZcZGVmdW57XGRlZnBhcnNlYm9keVxFZGVmdW5cZGVmdW54XGRlZnVuaGVhZGVyfQotCi1cZGVmXGRlZnVuaGVhZGVyICMxIzJ7XGRvaW5kIHtmbn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e0Z1bmN0aW9ufSUKLVxkZWZ1bmFyZ3MgeyMyfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnR5cGVmdW4gaW50IGZvb2JhciAoaW50IEB2YXJ7Zm9vfSwgZmxvYXQgQHZhcntiYXJ9KQotCi1cZGVmXGRlZnR5cGVmdW57XGRlZnBhcnNlYm9keVxFZGVmdHlwZWZ1blxkZWZ0eXBlZnVueFxkZWZ0eXBlZnVuaGVhZGVyfQotCi0lICMxIGlzIHRoZSBkYXRhIHR5cGUuICAjMiBpcyB0aGUgbmFtZSBhbmQgYXJncy4KLVxkZWZcZGVmdHlwZWZ1bmhlYWRlciAjMSMye1xkZWZ0eXBlZnVuaGVhZGVyeHsjMX0jMiBccmVsYXh9Ci0lICMxIGlzIHRoZSBkYXRhIHR5cGUsICMyIHRoZSBuYW1lLCAjMyB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZWZ1bmhlYWRlcnggIzEjMiAjM1xyZWxheHslCi1cZG9pbmQge2ZufXtcY29kZXsjMn19JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHtcZGVmaGVhZGVyeGNvbmQjMVxyZWxheCQkJCMyfXtGdW5jdGlvbn0lCi1cZGVmdHlwZWZ1bmFyZ3MgeyMzfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnR5cGVmbiB7TGlicmFyeSBGdW5jdGlvbn0gaW50IGZvb2JhciAoaW50IEB2YXJ7Zm9vfSwgZmxvYXQgQHZhcntiYXJ9KQotCi1cZGVmXGRlZnR5cGVmbntcZGVmbWV0aHBhcnNlYm9keVxFZGVmdHlwZWZuXGRlZnR5cGVmbnhcZGVmdHlwZWZuaGVhZGVyfQotCi0lIFxkZWZoZWFkZXJ4Y29uZCMxXHJlbGF4JCQkCi0lIHB1dHMgIzEgaW4gQGNvZGUsIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGJ1dCBkb2VzIG5vdGhpbmcgaWYgIzEgaXMgbnVsbC4KLVxkZWZcZGVmaGVhZGVyeGNvbmQjMSMyJCQke1xpZngjMVxyZWxheFxlbHNlXGNvZGV7IzEjMn0gXGZpfQotCi0lICMxIGlzIHRoZSBjbGFzc2lmaWNhdGlvbi4gICMyIGlzIHRoZSBkYXRhIHR5cGUuICAjMyBpcyB0aGUgbmFtZSBhbmQgYXJncy4KLVxkZWZcZGVmdHlwZWZuaGVhZGVyICMxIzIjM3tcZGVmdHlwZWZuaGVhZGVyeHsjMX17IzJ9IzMgXHJlbGF4fQotJSAjMSBpcyB0aGUgY2xhc3NpZmljYXRpb24sICMyIHRoZSBkYXRhIHR5cGUsICMzIHRoZSBuYW1lLCAjNCB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZWZuaGVhZGVyeCAjMSMyIzMgIzRccmVsYXh7JQotXGRvaW5kIHtmbn17XGNvZGV7IzN9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXAKLVxub3JtYWxwYXJlbnMgJSBub3RhYmx5LCB0dXJuIG9mZiBgJicgbWFnaWMsIHdoaWNoIHByZXZlbnRzCi0lICAgICAgICAgICAgICAgYXQgbGVhc3Qgc29tZSBDKysgdGV4dCBmcm9tIHdvcmtpbmcKLVxkZWZuYW1lIHtcZGVmaGVhZGVyeGNvbmQjMlxyZWxheCQkJCMzfXsjMX0lCi1cZGVmdHlwZWZ1bmFyZ3MgeyM0fVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZm1hYyA9PSBAZGVmZm4gTWFjcm8KLQotXGRlZlxkZWZtYWN7XGRlZnBhcnNlYm9keVxFZGVmbWFjXGRlZm1hY3hcZGVmbWFjaGVhZGVyfQotCi1cZGVmXGRlZm1hY2hlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtNYWNyb30lCi1cZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZzcGVjID09IEBkZWZmbiBTcGVjaWFsIEZvcm0KLQotXGRlZlxkZWZzcGVje1xkZWZwYXJzZWJvZHlcRWRlZnNwZWNcZGVmc3BlY3hcZGVmc3BlY2hlYWRlcn0KLQotXGRlZlxkZWZzcGVjaGVhZGVyICMxIzJ7XGRvaW5kIHtmbn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1NwZWNpYWwgRm9ybX0lCi1cZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIFRoaXMgZGVmaW5pdGlvbiBpcyBydW4gaWYgeW91IHVzZSBAZGVmdW54Ci0lIGFueXdoZXJlIG90aGVyIHRoYW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBAZGVmdW4gb3IgQGRlZnVueC4KLQotXGRlZlxkZWZmbnggIzEge1xlcnJtZXNzYWdle0BkZWZmbnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdW54ICMxIHtcZXJybWVzc2FnZXtAZGVmdW54IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZm1hY3ggIzEge1xlcnJtZXNzYWdle0BkZWZtYWN4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnNwZWN4ICMxIHtcZXJybWVzc2FnZXtAZGVmc3BlY3ggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZWZueCAjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGVmbnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZW1ldGhvZHggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBlbWV0aG9keCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBlZnVueCAjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGVmdW54IGluIGludmFsaWQgY29udGV4dH19Ci0KLSUgQGRlZm1ldGhvZCwgYW5kIHNvIG9uCi0KLSUgQGRlZm9wIENBVEVHT1JZIENMQVNTIE9QRVJBVElPTiBBUkcuLi4KLQotXGRlZlxkZWZvcCAjMSB7XGRlZlxkZWZvcHR5cGV7IzF9JQotXGRlZm9wcGFyc2Vib2R5XEVkZWZvcFxkZWZvcHhcZGVmb3BoZWFkZXJcZGVmb3B0eXBlfQotCi1cZGVmXGRlZm9waGVhZGVyICMxIzIjM3slCi1cZG9zdWJpbmQge2ZufXtcY29kZXsjMn19e1xwdXR3b3Jkb25cICMxfSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9e1xkZWZvcHR5cGV7fSBvbiAjMX0lCi1cZGVmdW5hcmdzIHsjM31cZW5kZ3JvdXAgJQotfQotCi0lIEBkZWZ0eXBlbWV0aG9kIENMQVNTIFJFVFVSTi1UWVBFIE1FVEhPRCBBUkcuLi4KLSUKLVxkZWZcZGVmdHlwZW1ldGhvZHslCi0gIFxkZWZ0eXBlbWV0aHBhcnNlYm9keVxFZGVmdHlwZW1ldGhvZFxkZWZ0eXBlbWV0aG9keFxkZWZ0eXBlbWV0aG9kaGVhZGVyfQotJQotJSAjMSBpcyB0aGUgY2xhc3MgbmFtZSwgIzIgdGhlIGRhdGEgdHlwZSwgIzMgdGhlIG1ldGhvZCBuYW1lLCAjNCB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZW1ldGhvZGhlYWRlciMxIzIjMyM0eyUKLSAgXGRvc3ViaW5ke2ZufXtcY29kZXsjM319e1xwdXR3b3Jkb25cIFxjb2RleyMxfX0lIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci0gIFxiZWdpbmdyb3VwCi0gICAgXGRlZm5hbWV7XGRlZmhlYWRlcnhjb25kIzJccmVsYXgkJCQjM317XHB1dHdvcmRNZXRob2RvblwgXGNvZGV7IzF9fSUKLSAgICBcZGVmdHlwZWZ1bmFyZ3N7IzR9JQotICBcZW5kZ3JvdXAKLX0KLQotJSBAZGVmbWV0aG9kID09IEBkZWZvcCBNZXRob2QKLSUKLVxkZWZcZGVmbWV0aG9ke1xkZWZtZXRocGFyc2Vib2R5XEVkZWZtZXRob2RcZGVmbWV0aG9keFxkZWZtZXRob2RoZWFkZXJ9Ci0lCi0lICMxIGlzIHRoZSBjbGFzcyBuYW1lLCAjMiB0aGUgbWV0aG9kIG5hbWUsICMzIHRoZSBhcmdzLgotXGRlZlxkZWZtZXRob2RoZWFkZXIjMSMyIzN7JQotICBcZG9zdWJpbmR7Zm59e1xjb2RleyMyfX17XHB1dHdvcmRvblwgXGNvZGV7IzF9fSUgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLSAgXGJlZ2luZ3JvdXAKLSAgICBcZGVmbmFtZXsjMn17XHB1dHdvcmRNZXRob2RvblwgXGNvZGV7IzF9fSUKLSAgICBcZGVmdW5hcmdzeyMzfSUKLSAgXGVuZGdyb3VwCi19Ci0KLSUgQGRlZmN2IHtDbGFzcyBPcHRpb259IGZvby1jbGFzcyBmb28tZmxhZwotCi1cZGVmXGRlZmN2ICMxIHtcZGVmXGRlZmN2dHlwZXsjMX0lCi1cZGVmb3B2YXJwYXJzZWJvZHlcRWRlZmN2XGRlZmN2eFxkZWZjdmFyaGVhZGVyXGRlZmN2dHlwZX0KLQotXGRlZlxkZWZjdmFyaGVhZGVyICMxIzIjM3slCi1cZG9zdWJpbmQge3ZyfXtcY29kZXsjMn19e29mICMxfSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtcZGVmY3Z0eXBle30gb2YgIzF9JQotXGRlZnZhcmFyZ3MgeyMzfVxlbmRncm91cCAlCi19Ci0KLSUgQGRlZml2YXIgPT0gQGRlZmN2IHtJbnN0YW5jZSBWYXJpYWJsZX0KLQotXGRlZlxkZWZpdmFye1xkZWZ2cnBhcnNlYm9keVxFZGVmaXZhclxkZWZpdmFyeFxkZWZpdmFyaGVhZGVyfQotCi1cZGVmXGRlZml2YXJoZWFkZXIgIzEjMiMzeyUKLVxkb3N1YmluZCB7dnJ9e1xjb2RleyMyfX17b2YgIzF9JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9e0luc3RhbmNlIFZhcmlhYmxlIG9mICMxfSUKLVxkZWZ2YXJhcmdzIHsjM31cZW5kZ3JvdXAgJQotfQotCi0lIFRoZXNlIGRlZmluaXRpb25zIGFyZSBydW4gaWYgeW91IHVzZSBAZGVmbWV0aG9keCwgZXRjLiwKLSUgYW55d2hlcmUgb3RoZXIgdGhhbiBpbW1lZGlhdGVseSBhZnRlciBhIEBkZWZtZXRob2QsIGV0Yy4KLQotXGRlZlxkZWZvcHggIzEge1xlcnJtZXNzYWdle0BkZWZvcHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmbWV0aG9keCAjMSB7XGVycm1lc3NhZ2V7QGRlZm1ldGhvZHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmY3Z4ICMxIHtcZXJybWVzc2FnZXtAZGVmY3Z4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZml2YXJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmaXZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KLQotJSBOb3cgQGRlZnZhcgotCi0lIEZpcnN0LCBkZWZpbmUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyB3YW50ZWQgZm9yIGFyZ3VtZW50cyBvZiBAZGVmdmFyLgotJSBUaGlzIGlzIGFjdHVhbGx5IHNpbXBsZToganVzdCBwcmludCB0aGVtIGluIHJvbWFuLgotJSBUaGlzIG11c3QgZXhwYW5kIHRoZSBhcmdzIGFuZCB0ZXJtaW5hdGUgdGhlIHBhcmFncmFwaCB0aGV5IG1ha2UgdXAKLVxkZWZcZGVmdmFyYXJncyAjMXtcbm9ybWFscGFyZW5zICMxJQotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxlbmRncmFmXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwXG5vYnJlYWt9Ci0KLSUgQGRlZnZyIENvdW50ZXIgZm9vLWNvdW50Ci0KLVxkZWZcZGVmdnJ7XGRlZnZycGFyc2Vib2R5XEVkZWZ2clxkZWZ2cnhcZGVmdnJoZWFkZXJ9Ci0KLVxkZWZcZGVmdnJoZWFkZXIgIzEjMiMze1xkb2luZCB7dnJ9e1xjb2RleyMyfX0lCi1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17IzF9XGRlZnZhcmFyZ3N7IzN9XGVuZGdyb3VwfQotCi0lIEBkZWZ2YXIgPT0gQGRlZnZyIFZhcmlhYmxlCi0KLVxkZWZcZGVmdmFye1xkZWZ2YXJwYXJzZWJvZHlcRWRlZnZhclxkZWZ2YXJ4XGRlZnZhcmhlYWRlcn0KLQotXGRlZlxkZWZ2YXJoZWFkZXIgIzEjMntcZG9pbmQge3ZyfXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1ZhcmlhYmxlfSUKLVxkZWZ2YXJhcmdzIHsjMn1cZW5kZ3JvdXAgJQotfQotCi0lIEBkZWZvcHQgPT0gQGRlZnZyIHtVc2VyIE9wdGlvbn0KLQotXGRlZlxkZWZvcHR7XGRlZnZhcnBhcnNlYm9keVxFZGVmb3B0XGRlZm9wdHhcZGVmb3B0aGVhZGVyfQotCi1cZGVmXGRlZm9wdGhlYWRlciAjMSMye1xkb2luZCB7dnJ9e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gdmFyIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMX17VXNlciBPcHRpb259JQotXGRlZnZhcmFyZ3MgeyMyfVxlbmRncm91cCAlCi19Ci0KLSUgQGRlZnR5cGV2YXIgaW50IGZvb2JhcgotCi1cZGVmXGRlZnR5cGV2YXJ7XGRlZnZhcnBhcnNlYm9keVxFZGVmdHlwZXZhclxkZWZ0eXBldmFyeFxkZWZ0eXBldmFyaGVhZGVyfQotCi0lICMxIGlzIHRoZSBkYXRhIHR5cGUuICAjMiBpcyB0aGUgbmFtZSwgcGVyaGFwcyBmb2xsb3dlZCBieSB0ZXh0IHRoYXQKLSUgaXMgYWN0dWFsbHkgcGFydCBvZiB0aGUgZGF0YSB0eXBlLCB3aGljaCBzaG91bGQgbm90IGJlIHB1dCBpbnRvIHRoZSBpbmRleC4KLVxkZWZcZGVmdHlwZXZhcmhlYWRlciAjMSMyeyUKLVxkb3ZhcmluZCMyIFxyZWxheCUgTWFrZSBlbnRyeSBpbiB2YXJpYWJsZXMgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUge1xkZWZoZWFkZXJ4Y29uZCMxXHJlbGF4JCQkIzJ9e1ZhcmlhYmxlfSUKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi1cZW5kZ3JvdXB9Ci1cZGVmXGRvdmFyaW5kIzEgIzJccmVsYXh7XGRvaW5ke3ZyfXtcY29kZXsjMX19fQotCi0lIEBkZWZ0eXBldnIge0dsb2JhbCBGbGFnfSBpbnQgZW5hYmxlCi0KLVxkZWZcZGVmdHlwZXZye1xkZWZ2cnBhcnNlYm9keVxFZGVmdHlwZXZyXGRlZnR5cGV2cnhcZGVmdHlwZXZyaGVhZGVyfQotCi1cZGVmXGRlZnR5cGV2cmhlYWRlciAjMSMyIzN7XGRvdmFyaW5kIzMgXHJlbGF4JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzJccmVsYXgkJCQjM317IzF9Ci1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotXGVuZGdyb3VwfQotCi0lIFRoaXMgZGVmaW5pdGlvbiBpcyBydW4gaWYgeW91IHVzZSBAZGVmdmFyeAotJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnZhciBvciBAZGVmdmFyeC4KLQotXGRlZlxkZWZ2cnggIzEge1xlcnJtZXNzYWdle0BkZWZ2cnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdmFyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmb3B0eCAjMSB7XGVycm1lc3NhZ2V7QGRlZm9wdHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZXZhcnggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBldmFyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBldnJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZXZyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotCi0lIE5vdyBkZWZpbmUgQGRlZnRwCi0lIEFyZ3MgYXJlIHByaW50ZWQgaW4gYm9sZCwgYSBzbGlnaHQgZGlmZmVyZW5jZSBmcm9tIEBkZWZ2YXIuCi0KLVxkZWZcZGVmdHBhcmdzICMxe1xiZiBcZGVmdmFyYXJnc3sjMX19Ci0KLSUgQGRlZnRwIENsYXNzIHdpbmRvdyBoZWlnaHQgd2lkdGggLi4uCi0KLVxkZWZcZGVmdHB7XGRlZnRwcGFyc2Vib2R5XEVkZWZ0cFxkZWZ0cHhcZGVmdHBoZWFkZXJ9Ci0KLVxkZWZcZGVmdHBoZWFkZXIgIzEjMiMze1xkb2luZCB7dHB9e1xjb2RleyMyfX0lCi1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17IzF9XGRlZnRwYXJnc3sjM31cZW5kZ3JvdXB9Ci0KLSUgVGhpcyBkZWZpbml0aW9uIGlzIHJ1biBpZiB5b3UgdXNlIEBkZWZ0cHgsIGV0YwotJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnRwLCBldGMuCi0KLVxkZWZcZGVmdHB4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHB4IGluIGludmFsaWQgY29udGV4dH19Ci0KLQotXG1lc3NhZ2V7bWFjcm9zLH0KLSUgQG1hY3JvLgotCi0lIFRvIGRvIHRoaXMgcmlnaHQgd2UgbmVlZCBhIGZlYXR1cmUgb2YgZS1UZVgsIFxzY2FudG9rZW5zLCAKLSUgd2hpY2ggd2UgYXJyYW5nZSB0byBlbXVsYXRlIHdpdGggYSB0ZW1wb3JhcnkgZmlsZSBpbiBvcmRpbmFyeSBUZVguCi1caWZ4XGVUZVh2ZXJzaW9uXHVuZGVmaW5lZAotIFxuZXd3cml0ZVxtYWNzY3JpYmJsZQotIFxkZWZcc2Nhbm1hY3JvIzF7JQotICAgXGJlZ2luZ3JvdXAgXG5ld2xpbmVjaGFyYFxeXk0KLSAgIFxpbW1lZGlhdGVcb3Blbm91dFxtYWNzY3JpYmJsZT1cam9ibmFtZS50bXAKLSAgIFxpbW1lZGlhdGVcd3JpdGVcbWFjc2NyaWJibGV7IzF9JQotICAgXGltbWVkaWF0ZVxjbG9zZW91dFxtYWNzY3JpYmJsZQotICAgXGxldFx4ZWF0c3BhY2VzXGVhdHNwYWNlcwotICAgXGlucHV0IFxqb2JuYW1lLnRtcAotICAgXGVuZGdyb3VwCi19Ci1cZWxzZQotXGRlZlxzY2FubWFjcm8jMXslCi1cYmVnaW5ncm91cCBcbmV3bGluZWNoYXJgXF5eTQotXGxldFx4ZWF0c3BhY2VzXGVhdHNwYWNlc1xzY2FudG9rZW5zeyMxfVxlbmRncm91cH0KLVxmaQotCi1cbmV3Y291bnRccGFyYW1ubyAgICUgQ291bnQgb2YgcGFyYW1ldGVycwotXG5ld3Rva3NcbWFjbmFtZSAgICAlIE1hY3JvIG5hbWUKLVxuZXdpZlxpZnJlY3Vyc2l2ZSAgJSBJcyBpdCByZWN1cnNpdmU/Ci0KLSUgVXRpbGl0eSByb3V0aW5lcy4KLSUgVGhpc2RvZXMgXGxldCAjMSA9ICMyLCBleGNlcHQgd2l0aCBcY3NuYW1lcy4KLVxkZWZcY3NsZXQjMSMyeyUKLVxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotXGV4cGFuZGFmdGVyXGxldAotXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi1cY3NuYW1lIzFcZW5kY3NuYW1lCi1cY3NuYW1lIzJcZW5kY3NuYW1lfQotCi0lIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIG9mZiBhIHN0cmluZy4KLSUgQ29uY2VwdHMgZnJvbSBhcm8tYmVuZCBwcm9ibGVtIDE1IChzZWUgQ1RBTikuCi17XGNhdGNvZGVgXEA9MTEKLVxnZGVmXGVhdHNwYWNlcyAjMXtcZXhwYW5kYWZ0ZXJcdHJpbUBcZXhwYW5kYWZ0ZXJ7IzEgfX0KLVxnZGVmXHRyaW1AICMxe1x0cmltQEAgQCMxIEAgIzEgQCBAQH0KLVxnZGVmXHRyaW1AQCAjMUAgIzJAICMzQEB7XHRyaW1AQEBcZW1wdHkgIzIgQH0KLVxkZWZcdW5icmFjZSMxeyMxfQotXHVuYnJhY2V7XGdkZWZcdHJpbUBAQCAjMSB9ICMyQHsjMX0KLX0KLQotJSBUcmltIGEgc2luZ2xlIHRyYWlsaW5nIF5eTSBvZmYgYSBzdHJpbmcuCi17XGNhdGNvZGVgXF5eTT0xMlxjYXRjb2RlYFxRPTMlCi1cZ2RlZlxlYXRjciAjMXtcZWF0Y3JhICMxUV5eTVF9JQotXGdkZWZcZWF0Y3JhIzFeXk1Re1xlYXRjcmIjMVF9JQotXGdkZWZcZWF0Y3JiIzFRIzJReyMxfSUKLX0KLQotJSBNYWNybyBib2RpZXMgYXJlIGFic29yYmVkIGFzIGFuIGFyZ3VtZW50IGluIGEgY29udGV4dCB3aGVyZQotJSBhbGwgY2hhcmFjdGVycyBhcmUgY2F0Y29kZSAxMCwgMTEgb3IgMTIsIGV4Y2VwdCBcIHdoaWNoIGlzIGFjdGl2ZQotJSAoYXMgaW4gbm9ybWFsIHRleGluZm8pLiBJdCBpcyBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIFwuCi0KLSUgSXQncyBuZWNlc3NhcnkgdG8gaGF2ZSBoYXJkIENScyB3aGVuIHRoZSBtYWNybyBpcyBleGVjdXRlZC4gVGhpcyBpcyAKLSUgZG9uZSBieSAgbWFraW5nIF5eTSAoXGVuZGxpbmVjaGFyKSBjYXRjb2RlIDEyIHdoZW4gcmVhZGluZyB0aGUgbWFjcm8gCi0lIGJvZHksIGFuZCB0aGVuIG1ha2luZyBpdCB0aGUgXG5ld2xpbmVjaGFyIGluIFxzY2FubWFjcm8uCi0KLVxkZWZcbWFjcm9ib2R5Y3R4dHslCi0gIFxjYXRjb2RlYFx+PTEyCi0gIFxjYXRjb2RlYFxePTEyCi0gIFxjYXRjb2RlYFxfPTEyCi0gIFxjYXRjb2RlYFx8PTEyCi0gIFxjYXRjb2RlYFw8PTEyCi0gIFxjYXRjb2RlYFw+PTEyCi0gIFxjYXRjb2RlYFwrPTEyCi0gIFxjYXRjb2RlYFx7PTEyCi0gIFxjYXRjb2RlYFx9PTEyCi0gIFxjYXRjb2RlYFxAPTEyCi0gIFxjYXRjb2RlYFxeXk09MTIKLSAgXHVzZW1ib2R5YmFja3NsYXNofQotCi0lIFxtYm9keWJhY2tzbGFzaCBpcyB0aGUgZGVmaW5pdGlvbiBvZiBcIGluIEBtYWNybyBib2RpZXMuCi0lIEl0IG1hcHMgXGZvb1wgPT4gXGNzbmFtZSBtYWNhcmcuZm9vXGVuZGNzbmFtZSA9PiAjTiAKLSUgd2hlcmUgTiBpcyB0aGUgbWFjcm8gcGFyYW1ldGVyIG51bWJlci4KLSUgV2UgZGVmaW5lIFxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWUgdG8gYmUgXHJlYWxiYWNrc2xhc2gsIHNvCi0lIFxcIGluIG1hY3JvIHJlcGxhY2VtZW50IHRleHQgZ2V0cyB5b3UgYSBiYWNrc2xhc2guCi0KLXtcY2F0Y29kZWBAPTAgQGNhdGNvZGVgQFw9QGFjdGl2ZQotIEBnZGVmQHVzZW1ib2R5YmFja3NsYXNoe0BsZXRcPUBtYm9keWJhY2tzbGFzaH0KLSBAZ2RlZkBtYm9keWJhY2tzbGFzaCMxXHtAY3NuYW1lIG1hY2FyZy4jMUBlbmRjc25hbWV9Ci19Ci1cZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSBtYWNhcmcuXGVuZGNzbmFtZXtccmVhbGJhY2tzbGFzaH0KLQotXGRlZlxtYWNyb3tccmVjdXJzaXZlZmFsc2VccGFyc2VhcmdcbWFjcm94eHh9Ci1cZGVmXHJtYWNyb3tccmVjdXJzaXZldHJ1ZVxwYXJzZWFyZ1xtYWNyb3h4eH0KLQotXGRlZlxtYWNyb3h4eCMxeyUKLSAgXGdldGFyZ3N7IzF9JSAgICAgICAgICAgbm93IFxtYWNuYW1lIGlzIHRoZSBtYWNuYW1lIGFuZCBcYXJnbCB0aGUgYXJnbGlzdAotICBcaWZ4XGFyZ2xcZW1wdHkgICAgICAgJSBubyBhcmd1bWVudHMKLSAgICAgXHBhcmFtbm89MCUKLSAgXGVsc2UKLSAgICAgXGV4cGFuZGFmdGVyXHBhcnNlbWFyZ2RlZiBcYXJnbDslIAotICBcZmkKLSAgXGV4cGFuZGFmdGVyXGlmeCBcY3NuYW1lIG1hY3NhdmUuXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSBccmVsYXgKLSAgICAgXGNzbGV0e21hY3NhdmUuXHRoZVxtYWNuYW1lfXtcdGhlXG1hY25hbWV9JQotICBcZWxzZQotICAgICBcbWVzc2FnZXtXYXJuaW5nOiByZWRlZmluaW5nIFx0aGVcbWFjbmFtZX0lCi0gIFxmaQotICBcYmVnaW5ncm91cCBcbWFjcm9ib2R5Y3R4dAotICBcaWZyZWN1cnNpdmUgXGV4cGFuZGFmdGVyXHBhcnNlcm1hY2JvZHkKLSAgXGVsc2UgXGV4cGFuZGFmdGVyXHBhcnNlbWFjYm9keSAKLSAgXGZpfQotCi1cZGVmXHVubWFjcm97XHBhcnNlYXJnXHVubWFjcm94eHh9Ci1cZGVmXHVubWFjcm94eHgjMXslCi0gIFxleHBhbmRhZnRlclxpZnggXGNzbmFtZSBtYWNzYXZlLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUgXHJlbGF4Ci0gICAgXGVycm1lc3NhZ2V7TWFjcm8gXHRoZVxtYWNuYW1lXCBub3QgZGVmaW5lZC59JQotICBcZWxzZQotICAgIFxjc2xldHsjMX17bWFjc2F2ZS4jMX0lCi0gICAgXGV4cGFuZGFmdGVyXGxldCBcY3NuYW1lIG1hY3NhdmUuXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSBcdW5kZWZpbmVkCi0gIFxmaQotfQotCi0lIFRoaXMgbWFrZXMgdXNlIG9mIHRoZSBvYnNjdXJlIGZlYXR1cmUgdGhhdCBpZiB0aGUgbGFzdCB0b2tlbiBvZiBhCi0lIDxwYXJhbWV0ZXIgbGlzdD4gaXMgIywgdGhlbiB0aGUgcHJlY2VkaW5nIGFyZ3VtZW50IGlzIGRlbGltaXRlZCBieQotJSBhbiBvcGVuaW5nIGJyYWNlLCBhbmQgdGhhdCBvcGVuaW5nIGJyYWNlIGlzIG5vdCBjb25zdW1lZC4KLVxkZWZcZ2V0YXJncyMxe1xnZXRhcmdzeHh4IzF7fX0KLVxkZWZcZ2V0YXJnc3h4eCMxI3tcZ2V0bWFjbmFtZSAjMSBccmVsYXhcZ2V0bWFjYXJnc30KLVxkZWZcZ2V0bWFjbmFtZSAjMSAjMlxyZWxheHtcbWFjbmFtZT17IzF9fQotXGRlZlxnZXRtYWNhcmdzIzF7XGRlZlxhcmdseyMxfX0KLQotJSBQYXJzZSB0aGUgb3B0aW9uYWwge3BhcmFtc30gbGlzdC4gIFNldCB1cCBccGFyYW1ubyBhbmQgXHBhcmFtbGlzdAotJSBzbyBcZGVmbWFjcm8ga25vd3Mgd2hhdCB0byBkby4gIERlZmluZSBcbWFjYXJnLmJsYWggZm9yIGVhY2ggYmxhaAotJSBpbiB0aGUgcGFyYW1zIGxpc3QsIHRvIGJlICMjTiB3aGVyZSBOIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGF0IGxpc3QuCi0lIFRoYXQgZ2V0cyB1c2VkIGJ5IFxtYm9keWJhY2tzbGFzaCAoYWJvdmUpLgotCi0lIFdlIG5lZWQgdG8gZ2V0IGBtYWNybyBwYXJhbWV0ZXIgY2hhciAjJyBpbnRvIHNldmVyYWwgZGVmaW5pdGlvbnMuCi0lIFRoZSB0ZWNobmlxdWUgdXNlZCBpcyBzdG9sZW4gZnJvbSBMYVRlWDogIGxldCBcaGFzaCBiZSBzb21ldGhpbmcKLSUgdW5leHBhbmRhYmxlLCBpbnNlcnQgdGhhdCB3aGVyZXZlciB5b3UgbmVlZCBhICMsIGFuZCB0aGVuIHJlZGVmaW5lCi0lIGl0IHRvICMganVzdCBiZWZvcmUgdXNpbmcgdGhlIHRva2VuIGxpc3QgcHJvZHVjZWQuCi0lCi0lIFRoZSBzYW1lIHRlY2huaXF1ZSBpcyB1c2VkIHRvIHByb3RlY3QgXGVhdHNwYWNlcyB0aWxsIGp1c3QgYmVmb3JlCi0lIHRoZSBtYWNybyBpcyB1c2VkLgotCi1cZGVmXHBhcnNlbWFyZ2RlZiMxO3tccGFyYW1ubz0wXGRlZlxwYXJhbWxpc3R7fSUKLSAgICAgICAgXGxldFxoYXNoXHJlbGF4XGxldFx4ZWF0c3BhY2VzXHJlbGF4XHBhcnNlbWFyZ2RlZnh4eCMxLDssfQotXGRlZlxwYXJzZW1hcmdkZWZ4eHgjMSx7JQotICBcaWYjMTtcbGV0XG5leHQ9XHJlbGF4Ci0gIFxlbHNlIFxsZXRcbmV4dD1ccGFyc2VtYXJnZGVmeHh4Ci0gICAgXGFkdmFuY2VccGFyYW1ubyBieSAxJQotICAgIFxleHBhbmRhZnRlclxlZGVmXGNzbmFtZSBtYWNhcmcuXGVhdHNwYWNlc3sjMX1cZW5kY3NuYW1lCi0gICAgICAgIHtceGVhdHNwYWNlc3tcaGFzaFx0aGVccGFyYW1ub319JQotICAgIFxlZGVmXHBhcmFtbGlzdHtccGFyYW1saXN0XGhhc2hcdGhlXHBhcmFtbm8sfSUKLSAgXGZpXG5leHR9Ci0KLSUgVGhlc2UgdHdvIGNvbW1hbmRzIHJlYWQgcmVjdXJzaXZlIGFuZCBub25yZWN1cnNpdmUgbWFjcm8gYm9kaWVzLgotJSAoVGhleSdyZSBkaWZmZXJlbnQgc2luY2UgcmVjIGFuZCBub25yZWMgbWFjcm9zIGVuZCBkaWZmZXJlbnRseS4pCi0KLVxsb25nXGRlZlxwYXJzZW1hY2JvZHkjMUBlbmQgbWFjcm8lCi17XHhkZWZcdGVtcHtcZWF0Y3J7IzF9fVxlbmRncm91cFxkZWZtYWNyb30lCi1cbG9uZ1xkZWZccGFyc2VybWFjYm9keSMxQGVuZCBybWFjcm8lCi17XHhkZWZcdGVtcHtcZWF0Y3J7IzF9fVxlbmRncm91cFxkZWZtYWNyb30lCi0KLSUgVGhpcyBkZWZpbmVzIHRoZSBtYWNybyBpdHNlbGYuIFRoZXJlIGFyZSBzaXggY2FzZXM6IHJlY3Vyc2l2ZSBhbmQKLSUgbm9ucmVjdXJzaXZlIG1hY3JvcyBvZiB6ZXJvLCBvbmUsIGFuZCBtYW55IGFyZ3VtZW50cy4KLSUgTXVjaCBtYWdpYyB3aXRoIFxleHBhbmRhZnRlciBoZXJlLgotJSBceGRlZiBpcyB1c2VkIHNvIHRoYXQgbWFjcm8gZGVmaW5pdGlvbnMgd2lsbCBzdXJ2aXZlIHRoZSBmaWxlCi0lIHRoZXkncmUgZGVmaW5lZCBpbjsgQGluY2x1ZGUgcmVhZHMgdGhlIGZpbGUgaW5zaWRlIGEgZ3JvdXAuCi1cZGVmXGRlZm1hY3JveyUKLSAgXGxldFxoYXNoPSMjJSBjb252ZXJ0IHBsYWNlaG9sZGVycyB0byBtYWNybyBwYXJhbWV0ZXIgY2hhcnMKLSAgXGlmcmVjdXJzaXZlCi0gICAgXGlmY2FzZVxwYXJhbW5vCi0gICAgJSAwCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQotICAgIFxvciAlIDEKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQotICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lfSUKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lIyMxeyUKLSAgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKLSAgICBcZWxzZSAlIG1hbnkKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWUjIzF7JQotICAgICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgCi0gICAgICAgICAgXHBhcmFtbGlzdHtcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgXGlmY2FzZVxwYXJhbW5vCi0gICAgJSAwCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQotICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQotICAgIFxvciAlIDEKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQotICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lfSUKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lIyMxeyUKLSAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQotICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQotICAgIFxlbHNlICUgbWFueQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSMjMXslCi0gICAgICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lICMjMSx9JQotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZgotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUKLSAgICAgIFxwYXJhbWxpc3R7JQotICAgICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKLSAgICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQotICAgIFxmaQotICBcZml9Ci0KLVxkZWZcbm9yZWN1cnNlIzF7XGJncm91cFxjc2xldHsjMX17bWFjc2F2ZS4jMX19Ci0KLSUgXGJyYWNlb3JsaW5lIGRlY2lkZXMgd2hldGhlciB0aGUgbmV4dCBub253aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhCi0lIHsuICBJZiBzbyBpdCByZWFkcyB1cCB0byB0aGUgY2xvc2luZyB9LCBpZiBub3QsIGl0IHJlYWRzIHRoZSB3aG9sZQotJSBsaW5lLiAgV2hhdGV2ZXIgd2FzIHJlYWQgaXMgdGhlbiBmZWQgdG8gdGhlIG5leHQgY29udHJvbCBzZXF1ZW5jZQotJSBhcyBhbiBhcmd1bWVudCAoYnkgXHBhcnNlYnJhY2Ugb3IgXHBhcnNlYXJnKQotXGRlZlxicmFjZW9ybGluZSMxe1xsZXRcbmV4dD0jMVxmdXR1cmVsZXRcbmNoYXJcYnJhY2VvcmxpbmV4eHh9Ci1cZGVmXGJyYWNlb3JsaW5leHh4eyUKLSAgXGlmeFxuY2hhclxiZ3JvdXBcZWxzZQotICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZyAKLSAgXGZpIFxuZXh0fQotCi0KLVxtZXNzYWdle2Nyb3NzIHJlZmVyZW5jZXMsfQotXG5ld3dyaXRlXGF1eGZpbGUKLQotXG5ld2lmXGlmaGF2ZXhyZWZzICAgICUgVHJ1ZSBpZiB4cmVmIHZhbHVlcyBhcmUga25vd24uCi1cbmV3aWZcaWZ3YXJuZWR4cmVmcyAgJSBUcnVlIGlmIHdlIHdhcm5lZCBvbmNlIHRoYXQgdGhleSBhcmVuJ3Qga25vd24uCi0KLSUgQGluZm9yZWYgaXMgcmVsYXRpdmVseSBzaW1wbGUuCi1cZGVmXGluZm9yZWYgIzF7XGluZm9yZWZ6enogIzEsLCwsKip9Ci1cZGVmXGluZm9yZWZ6enogIzEsIzIsIzMsIzQqKntccHV0d29yZFNlZXt9IFxwdXR3b3JkSW5mb3t9IFxwdXR3b3JkZmlsZXt9IFxmaWxle1xpZ25vcmVzcGFjZXMgIzN7fX0sCi0gIG5vZGUgXHNhbXB7XGlnbm9yZXNwYWNlcyMxe319fQotCi0lIEBub2RlJ3Mgam9iIGlzIHRvIGRlZmluZSBcbGFzdG5vZGUuCi1cZGVmXG5vZGV7XEVOVmNoZWNrXHBhcnNlYXJnXG5vZGV6enp9Ci1cZGVmXG5vZGV6enojMXtcbm9kZXh4eCBbIzEsXX0KLVxkZWZcbm9kZXh4eFsjMSwjMl17XGdkZWZcbGFzdG5vZGV7IzF9fQotXGxldFxud25vZGU9XG5vZGUKLVxsZXRcbGFzdG5vZGU9XHJlbGF4Ci0KLSUgVGhlIHNlY3Rpb25pbmcgY29tbWFuZHMgKEBjaGFwdGVyLCBldGMuKSBjYWxsIHRoZXNlLgotXGRlZlxkb25vZGVyZWZ7JQotICBcaWZ4XGxhc3Rub2RlXHJlbGF4XGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcc2V0cmVme1xsYXN0bm9kZX0lCi0gICAgICB7WXNlY3Rpb25udW1iZXJhbmR0eXBlfSUKLSAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1ccmVsYXgKLSAgXGZpCi19Ci1cZGVmXHVubnVtYm5vZGVyZWZ7JQotICBcaWZ4XGxhc3Rub2RlXHJlbGF4XGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcc2V0cmVme1xsYXN0bm9kZX17WW5vdGhpbmd9JQotICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxyZWxheAotICBcZmkKLX0KLVxkZWZcYXBwZW5kaXhub2RlcmVmeyUKLSAgXGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXHNldHJlZntcbGFzdG5vZGV9JQotICAgICAge1lhcHBlbmRpeGxldHRlcmFuZHR5cGV9JQotICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxyZWxheAotICBcZmkKLX0KLQotCi0lIEBhbmNob3J7TkFNRX0gLS0gZGVmaW5lIHhyZWYgdGFyZ2V0IGF0IGFyYml0cmFyeSBwb2ludC4KLSUgCi1cZGVmXGFuY2hvciMxe1xzZXRyZWZ7IzF9e1lub3RoaW5nfX0KLQotCi0lIFxzZXRyZWZ7TkFNRX17U05UfSBkZWZpbmVzIGEgY3Jvc3MtcmVmZXJlbmNlIHBvaW50IE5BTUUsIG5hbWVseQotJSBOQU1FLXRpdGxlLCBOQU1FLXBnLCBhbmQgTkFNRS1TTlQuICBDYWxsZWQgZnJvbSBcZm9vbm9kZXJlZi4gIFdlIGhhdmUKLSUgdG8gc2V0IFxpbmRleGR1bW1pZXMgc28gY29tbWFuZHMgc3VjaCBhcyBAY29kZSBpbiBhIHNlY3Rpb24gdGl0bGUKLSUgYXJlbid0IGV4cGFuZGVkLiAgSXQgd291bGQgYmUgbmljZXIgbm90IHRvIGV4cGFuZCB0aGUgdGl0bGVzIGluIHRoZQotJSBmaXJzdCBwbGFjZSwgYnV0IHRoZXJlJ3Mgc28gbWFueSBsYXllcnMgdGhhdCB0aGF0IGlzIGhhcmQgdG8gZG8uCi0lIAotXGRlZlxzZXRyZWYjMSMye3slCi0gIFxpbmRleGR1bW1pZXMKLSAgXGRvc2V0cXsjMS10aXRsZX17WXRpdGxlfSUKLSAgXGRvc2V0cXsjMS1wZ317WXBhZ2VudW1iZXJ9JQotICBcZG9zZXRxeyMxLXNudH17IzJ9Ci19fQotCi0lIEB4cmVmLCBAcHhyZWYsIGFuZCBAcmVmIGdlbmVyYXRlIGNyb3NzLXJlZmVyZW5jZXMuICBGb3IgXHhyZWZYLCAjMSBpcwotJSB0aGUgbm9kZSBuYW1lLCAjMiB0aGUgbmFtZSBvZiB0aGUgSW5mbyBjcm9zcy1yZWZlcmVuY2UsICMzIHRoZSBwcmludGVkCi0lIG5vZGUgbmFtZSwgIzQgdGhlIG5hbWUgb2YgdGhlIEluZm8gZmlsZSwgIzUgdGhlIG5hbWUgb2YgdGhlIHByaW50ZWQKLSUgbWFudWFsLiAgQWxsIGJ1dCB0aGUgbm9kZSBuYW1lIGNhbiBiZSBvbWl0dGVkLgotJQotXGRlZlxweHJlZiMxe1xwdXR3b3Jkc2Vle30gXHhyZWZYWyMxLCwsLCwsLF19Ci1cZGVmXHhyZWYjMXtccHV0d29yZFNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQotXGRlZlxyZWYjMXtceHJlZlhbIzEsLCwsLCwsXX0KLVxkZWZceHJlZlhbIzEsIzIsIzMsIzQsIzUsIzZde1xiZWdpbmdyb3VwCi0gIFxkZWZccHJpbnRlZG1hbnVhbHtcaWdub3Jlc3BhY2VzICM1fSUKLSAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjM30lCi0gIFxzZXRib3gxPVxoYm94e1xwcmludGVkbWFudWFsfSUKLSAgXHNldGJveDA9XGhib3h7XHByaW50ZWRub2RlbmFtZX0lCi0gIFxpZmRpbSBcd2QwID0gMHB0Ci0gICAgJSBObyBwcmludGVkIG5vZGUgbmFtZSB3YXMgZXhwbGljaXRseSBnaXZlbi4KLSAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVR4cmVmLWF1dG9tYXRpYy1zZWN0aW9uLXRpdGxlXGVuZGNzbmFtZVxyZWxheAotICAgICAgJSBVc2UgdGhlIG5vZGUgbmFtZSBpbnNpZGUgdGhlIHNxdWFyZSBicmFja2V0cy4KLSAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQotICAgIFxlbHNlCi0gICAgICAlIFVzZSB0aGUgYWN0dWFsIGNoYXB0ZXIvc2VjdGlvbiB0aXRsZSBhcHBlYXIgaW5zaWRlCi0gICAgICAlIHRoZSBzcXVhcmUgYnJhY2tldHMuICBVc2UgdGhlIHJlYWwgc2VjdGlvbiB0aXRsZSBpZiB3ZSBoYXZlIGl0LgotICAgICAgXGlmZGltIFx3ZDEgPiAwcHQKLSAgICAgICAgJSBJdCBpcyBpbiBhbm90aGVyIG1hbnVhbCwgc28gd2UgZG9uJ3QgaGF2ZSBpdC4KLSAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCi0gICAgICBcZWxzZQotICAgICAgICBcaWZoYXZleHJlZnMKLSAgICAgICAgICAlIFdlIGtub3cgdGhlIHJlYWwgdGl0bGUgaWYgd2UgaGF2ZSB0aGUgeHJlZiB2YWx1ZXMuCi0gICAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XHJlZnh7IzEtdGl0bGV9e319JQotICAgICAgICBcZWxzZQotICAgICAgICAgICUgT3RoZXJ3aXNlIGp1c3QgY29weSB0aGUgSW5mbyBub2RlIG5hbWUuCi0gICAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCi0gICAgICAgIFxmaSUKLSAgICAgIFxmaQotICAgIFxmaQotICBcZmkKLSAgJQotICAlIElmIHdlIHVzZSBcdW5oYm94MCBhbmQgXHVuaGJveDEgdG8gcHJpbnQgdGhlIG5vZGUgbmFtZXMsIFRlWCBkb2VzIG5vdAotICAlIGluc2VydCBlbXB0eSBkaXNjcmV0aW9uYXJpZXMgYWZ0ZXIgaHlwaGVucywgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsCi0gICUgbm90IGZpbmQgYSBsaW5lIGJyZWFrIGF0IGEgaHlwaGVuIGluIGEgbm9kZSBuYW1lcy4gIFNpbmNlIHNvbWUgbWFudWFscwotICAlIGFyZSBiZXN0IHdyaXR0ZW4gd2l0aCBmYWlybHkgbG9uZyBub2RlIG5hbWVzLCBjb250YWluaW5nIGh5cGhlbnMsIHRoaXMKLSAgJSBpcyBhIGxvc3MuICBUaGVyZWZvcmUsIHdlIGdpdmUgdGhlIHRleHQgb2YgdGhlIG5vZGUgbmFtZSBhZ2Fpbiwgc28gaXQKLSAgJSBpcyBhcyBpZiBUZVggaXMgc2VlaW5nIGl0IGZvciB0aGUgZmlyc3QgdGltZS4KLSAgXGlmZGltIFx3ZDEgPiAwcHQKLSAgICBccHV0d29yZHNlY3Rpb257fSBgYFxwcmludGVkbm9kZW5hbWUnJyBpbiBcY2l0ZXtccHJpbnRlZG1hbnVhbH0lCi0gIFxlbHNlCi0gICAgJSBfIChmb3IgZXhhbXBsZSkgaGFzIHRvIGJlIHRoZSBjaGFyYWN0ZXIgXyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZQotICAgICUgY29udHJvbCBzZXF1ZW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlLCBidXQgaXQgaGFzIHRvIGV4cGFuZAotICAgICUgaW50byB0aGUgdXN1YWwgXGxlYXZldm1vZGUuLi5cdnJ1bGUgc3R1ZmYgZm9yIHB1cnBvc2VzIG9mCi0gICAgJSBwcmludGluZy4gU28gd2UgXHR1cm5vZmZhY3RpdmUgZm9yIHRoZSBccmVmeC1zbnQsIGJhY2sgb24gZm9yIHRoZQotICAgICUgcHJpbnRpbmcsIGJhY2sgb2ZmIGZvciB0aGUgXHJlZngtcGcuCi0gICAge1xub3JtYWx0dXJub2ZmYWN0aXZlCi0gICAgICUgT25seSBvdXRwdXQgYSBmb2xsb3dpbmcgc3BhY2UgaWYgdGhlIC1zbnQgcmVmIGlzIG5vbmVtcHR5OyBmb3IKLSAgICAgJSBAdW5udW1iZXJlZCBhbmQgQGFuY2hvciwgaXQgd29uJ3QgYmUuCi0gICAgIFxzZXRib3gyID0gXGhib3h7XGlnbm9yZXNwYWNlcyBccmVmeHsjMS1zbnR9e319JQotICAgICBcaWZkaW0gXHdkMiA+IDBwdCBccmVmeHsjMS1zbnR9XHNwYWNlXGZpCi0gICAgfSUKLSAgICAlIFtteW5vZGVdLCAKLSAgICBbXHByaW50ZWRub2RlbmFtZV0sXHNwYWNlCi0gICAgJSBwYWdlIDMKLSAgICBcdHVybm9mZmFjdGl2ZSBccHV0d29yZHBhZ2VcdGllXHJlZnh7IzEtcGd9e30lCi0gIFxmaQotXGVuZGdyb3VwfQotCi0lIFxkb3NldHEgaXMgdGhlIGludGVyZmFjZSBmb3IgY2FsbHMgZnJvbSBvdGhlciBtYWNyb3MKLQotJSBVc2UgXG5vcm1hbHR1cm5vZmZhY3RpdmUgc28gdGhhdCBwdW5jdHVhdGlvbiBjaGFycyBzdWNoIGFzIHVuZGVyc2NvcmUKLSUgYW5kIGJhY2tzbGFzaCB3b3JrIGluIG5vZGUgbmFtZXMuICAoXHR1cm5vZmZhY3RpdmUgZG9lc24ndCBkbyBcLikKLVxkZWZcZG9zZXRxIzEjMnslCi0gIHtcbGV0XGZvbGlvPTAKLSAgIFxub3JtYWx0dXJub2ZmYWN0aXZlCi0gICBcZWRlZlxuZXh0e1x3cml0ZVxhdXhmaWxle1xpbnRlcm5hbHNldHF7IzF9eyMyfX19JQotICAgXGlmbGlua3MKLSAgICAgXG5leHQKLSAgIFxmaQotICB9JQotfQotCi0lIFxpbnRlcm5hbHNldHEge2Zvb317cGFnZX0gZXhwYW5kcyBpbnRvCi0lIENIQVJBQ1RFUlMgJ3hyZGVmIHtmb299ey4uLmV4cGFuc2lvbiBvZiBcWXBhZ2UuLi59Ci0lIFdoZW4gdGhlIGF1eCBmaWxlIGlzIHJlYWQsICcgaXMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIKLQotXGRlZlxpbnRlcm5hbHNldHEgIzEjMnsneHJkZWYgeyMxfXtcY3NuYW1lICMyXGVuZGNzbmFtZX19Ci0KLSUgVGhpbmdzIHRvIGJlIGV4cGFuZGVkIGJ5IFxpbnRlcm5hbHNldHEKLQotXGRlZlxZcGFnZW51bWJlcntcZm9saW99Ci0KLVxkZWZcWXRpdGxle1x0aGlzc2VjdGlvbn0KLQotXGRlZlxZbm90aGluZ3t9Ci0KLVxkZWZcWXNlY3Rpb25udW1iZXJhbmR0eXBleyUKLVxpZm51bVxzZWNubz0wIFxwdXR3b3JkQ2hhcHRlclx4cmVmdGllXHRoZVxjaGFwbm8gJQotXGVsc2UgXGlmbnVtIFxzdWJzZWNubz0wIFxwdXR3b3JkU2VjdGlvblx4cmVmdGllXHRoZVxjaGFwbm8uXHRoZVxzZWNubyAlCi1cZWxzZSBcaWZudW0gXHN1YnN1YnNlY25vPTAgJQotXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWVcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8gJQotXGVsc2UgJQotXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWVcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNubyAlCi1cZmkgXGZpIFxmaSB9Ci0KLVxkZWZcWWFwcGVuZGl4bGV0dGVyYW5kdHlwZXslCi1caWZudW1cc2Vjbm89MCBccHV0d29yZEFwcGVuZGl4XHhyZWZ0aWUnY2hhclx0aGVcYXBwZW5kaXhub3t9JQotXGVsc2UgXGlmbnVtIFxzdWJzZWNubz0wIFxwdXR3b3JkU2VjdGlvblx4cmVmdGllJ2NoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNubyAlCi1cZWxzZSBcaWZudW0gXHN1YnN1YnNlY25vPTAgJQotXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWUnY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8gJQotXGVsc2UgJQotXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWUnY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNubyAlCi1cZmkgXGZpIFxmaSB9Ci0KLVxnZGVmXHhyZWZ0aWV7J3RpZX0KLQotJSBVc2UgVGVYIDMuMCdzIFxpbnB1dGxpbmVubyB0byBnZXQgdGhlIGxpbmUgbnVtYmVyLCBmb3IgYmV0dGVyIGVycm9yCi0lIG1lc3NhZ2VzLCBidXQgaWYgd2UncmUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YgVGVYLCBkb24ndCBkbyBhbnl0aGluZy4KLSUKLVxpZnhcaW5wdXRsaW5lbm9cdGhpc2lzdW5kZWZpbmVkCi0gIFxsZXRcbGluZW51bWJlciA9IFxlbXB0eSAlIE5vbi0zLjAuCi1cZWxzZQotICBcZGVmXGxpbmVudW1iZXJ7XHRoZVxpbnB1dGxpbmVubzpcc3BhY2V9Ci1cZmkKLQotJSBEZWZpbmUgXHJlZnh7TkFNRX17U1VGRklYfSB0byByZWZlcmVuY2UgYSBjcm9zcy1yZWZlcmVuY2Ugc3RyaW5nIG5hbWVkIE5BTUUuCi0lIElmIGl0cyB2YWx1ZSBpcyBub25lbXB0eSwgU1VGRklYIGlzIG91dHB1dCBhZnRlcndhcmQuCi0KLVxkZWZccmVmeCMxIzJ7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBYIzFcZW5kY3NuYW1lXHJlbGF4Ci0gICAgJSBJZiBub3QgZGVmaW5lZCwgc2F5IHNvbWV0aGluZyBhdCBsZWFzdC4KLSAgICBcYW5nbGVsZWZ0IHVuXC1kZVwtZmluZWRcYW5nbGVyaWdodAotICAgIFxpZmxpbmtzCi0gICAgICBcaWZoYXZleHJlZnMKLSAgICAgICAgXG1lc3NhZ2V7XGxpbmVudW1iZXIgVW5kZWZpbmVkIGNyb3NzIHJlZmVyZW5jZSBgIzEnLn0lCi0gICAgICBcZWxzZQotICAgICAgICBcaWZ3YXJuZWR4cmVmc1xlbHNlCi0gICAgICAgICAgXGdsb2JhbFx3YXJuZWR4cmVmc3RydWUKLSAgICAgICAgICBcbWVzc2FnZXtDcm9zcyByZWZlcmVuY2UgdmFsdWVzIHVua25vd247IHlvdSBtdXN0IHJ1biBUZVggYWdhaW4ufSUKLSAgICAgICAgXGZpCi0gICAgICBcZmkKLSAgICBcZmkKLSAgXGVsc2UKLSAgICAlIEl0J3MgZGVmaW5lZCwgc28ganVzdCB1c2UgaXQuCi0gICAgXGNzbmFtZSBYIzFcZW5kY3NuYW1lCi0gIFxmaQotICAjMiUgT3V0cHV0IHRoZSBzdWZmaXggaW4gYW55IGNhc2UuCi19Ci0KLSUgVGhpcyBpcyB0aGUgbWFjcm8gaW52b2tlZCBieSBlbnRyaWVzIGluIHRoZSBhdXggZmlsZS4KLSUgCi1cZGVmXHhyZGVmIzF7XGJlZ2luZ3JvdXAKLSAgJSBSZWVuYWJsZSBcIGFzIGFuIGVzY2FwZSB3aGlsZSByZWFkaW5nIHRoZSBzZWNvbmQgYXJndW1lbnQuCi0gIFxjYXRjb2RlYFxcID0gMAotICBcYWZ0ZXJhc3NpZ25tZW50XGVuZGdyb3VwCi0gIFxleHBhbmRhZnRlclxnZGVmXGNzbmFtZSBYIzFcZW5kY3NuYW1lCi19Ci0KLSUgUmVhZCB0aGUgbGFzdCBleGlzdGluZyBhdXggZmlsZSwgaWYgYW55LiAgTm8gZXJyb3IgaWYgbm9uZSBleGlzdHMuCi1cZGVmXHJlYWRhdXhmaWxle1xiZWdpbmdyb3VwCi0gIFxjYXRjb2RlYFxeXkA9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkE9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkI9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkM9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkQ9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkU9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkY9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkc9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkg9XG90aGVyCi0gIFxjYXRjb2RlYFxeXks9XG90aGVyCi0gIFxjYXRjb2RlYFxeXkw9XG90aGVyCi0gIFxjYXRjb2RlYFxeXk49XG90aGVyCi0gIFxjYXRjb2RlYFxeXlA9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlE9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlI9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlM9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlQ9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlU9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlY9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlc9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlg9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlo9XG90aGVyCi0gIFxjYXRjb2RlYFxeXls9XG90aGVyCi0gIFxjYXRjb2RlYFxeXlw9XG90aGVyCi0gIFxjYXRjb2RlYFxeXl09XG90aGVyCi0gIFxjYXRjb2RlYFxeXl49XG90aGVyCi0gIFxjYXRjb2RlYFxeXl89XG90aGVyCi0gIFxjYXRjb2RlYFxAPVxvdGhlcgotICBcY2F0Y29kZWBcXj1cb3RoZXIKLSAgJSBJdCB3YXMgc3VnZ2VzdGVkIHRvIGRlZmluZSB0aGlzIGFzIDcsIHdoaWNoIHdvdWxkIGFsbG93IF5eZTQgZXRjLgotICAlIGluIHhyZWYgdGFncywgaS5lLiwgbm9kZSBuYW1lcy4gIEJ1dCBzaW5jZSBeXmU0IG5vdGF0aW9uIGlzbid0Ci0gICUgc3VwcG9ydGVkIGluIHRoZSBtYWluIHRleHQsIGl0IGRvZXNuJ3Qgc2VlbSBkZXNpcmFibGUuICBGdXJ0aGVybW9yZSwKLSAgJSB0aGF0IGlzIG5vdCBlbm91Z2g6IGZvciBub2RlIG5hbWVzIHRoYXQgYWN0dWFsbHkgY29udGFpbiBhIF4KLSAgJSBjaGFyYWN0ZXIsIHdlIHdvdWxkIGVuZCB1cCB3cml0aW5nIGEgbGluZSBsaWtlIHRoaXM6ICd4cmRlZiB7J2hhdAotICAlIGItdGl0bGV9eydoYXQgYn0gYW5kIFx4cmRlZiBkb2VzIGEgXGNzbmFtZS4uLlxlbmRjc25hbWUgb24gdGhlIGZpcnN0Ci0gICUgYXJndW1lbnQsIGFuZCBcaGF0IGlzIG5vdCBhbiBleHBhbmRhYmxlIGNvbnRyb2wgc2VxdWVuY2UuICBJdCBjb3VsZAotICAlIGFsbCBiZSB3b3JrZWQgb3V0LCBidXQgd2h5PyAgRWl0aGVyIHdlIHN1cHBvcnQgXl4gb3Igd2UgZG9uJ3QuCi0gICUKLSAgJSBUaGUgb3RoZXIgY2hhbmdlIG5lY2Vzc2FyeSBmb3IgdGhpcyB3YXMgdG8gZGVmaW5lIFxhdXhoYXQ6Ci0gICUgXGRlZlxhdXhoYXR7XGRlZl57J2hhdCB9fSUgZXh0cmEgc3BhY2Ugc28gb2sgaWYgZm9sbG93ZWQgYnkgbGV0dGVyCi0gICUgYW5kIHRoZW4gdG8gY2FsbCBcYXV4aGF0IGluIFxzZXRxLgotICAlCi0gIFxjYXRjb2RlYFx+PVxvdGhlcgotICBcY2F0Y29kZWBcWz1cb3RoZXIKLSAgXGNhdGNvZGVgXF09XG90aGVyCi0gIFxjYXRjb2RlYFwiPVxvdGhlcgotICBcY2F0Y29kZWBcXz1cb3RoZXIKLSAgXGNhdGNvZGVgXHw9XG90aGVyCi0gIFxjYXRjb2RlYFw8PVxvdGhlcgotICBcY2F0Y29kZWBcPj1cb3RoZXIKLSAgXGNhdGNvZGVgXCQ9XG90aGVyCi0gIFxjYXRjb2RlYFwjPVxvdGhlcgotICBcY2F0Y29kZWBcJj1cb3RoZXIKLSAgXGNhdGNvZGVgKz1cb3RoZXIgJSBhdm9pZCBcKyBmb3IgcGFyYW5vaWEgZXZlbiB0aG91Z2ggd2UndmUgdHVybmVkIGl0IG9mZgotICAlIE1ha2UgdGhlIGNoYXJhY3RlcnMgMTI4LTI1NSBiZSBwcmludGluZyBjaGFyYWN0ZXJzCi0gIHslCi0gICAgXGNvdW50IDE9MTI4Ci0gICAgXGRlZlxsb29weyUKLSAgICAgIFxjYXRjb2RlXGNvdW50IDE9XG90aGVyCi0gICAgICBcYWR2YW5jZVxjb3VudCAxIGJ5IDEKLSAgICAgIFxpZm51bSBcY291bnQgMTwyNTYgXGxvb3AgXGZpCi0gICAgfSUKLSAgfSUKLSAgJSBUaGUgYXV4IGZpbGUgdXNlcyAnIGFzIHRoZSBlc2NhcGUgKGZvciBub3cpLgotICAlIFR1cm4gb2ZmIFwgYXMgYW4gZXNjYXBlIHNvIHdlIGRvIG5vdCBsb3NlIG9uCi0gICUgZW50cmllcyB3aGljaCB3ZXJlIGR1bXBlZCB3aXRoIGNvbnRyb2wgc2VxdWVuY2VzIGluIHRoZWlyIG5hbWVzLgotICAlIEZvciBleGFtcGxlLCAneHJkZWYgeyRcbGVxICQtZnVufXtwYWdlIC4uLn0gbWFkZSBieSBAZGVmdW4gXl4KLSAgJSBSZWZlcmVuY2UgdG8gc3VjaCBlbnRyaWVzIHN0aWxsIGRvZXMgbm90IHdvcmsgdGhlIHdheSBvbmUgd291bGQgd2lzaCwKLSAgJSBidXQgYXQgbGVhc3QgdGhleSBkbyBub3QgYm9tYiBvdXQgd2hlbiB0aGUgYXV4IGZpbGUgaXMgcmVhZCBpbi4KLSAgXGNhdGNvZGVgXHs9MQotICBcY2F0Y29kZWBcfT0yCi0gIFxjYXRjb2RlYFwlPVxvdGhlcgotICBcY2F0Y29kZWBcJz0wCi0gIFxjYXRjb2RlYFxcPVxvdGhlcgotICAlCi0gIFxvcGVuaW4gMSBcam9ibmFtZS5hdXgKLSAgXGlmZW9mIDEgXGVsc2UKLSAgICBcY2xvc2VpbiAxCi0gICAgXGlucHV0IFxqb2JuYW1lLmF1eAotICAgIFxnbG9iYWxcaGF2ZXhyZWZzdHJ1ZQotICAgIFxnbG9iYWxcd2FybmVkb2JzdHJ1ZQotICBcZmkKLSAgJSBPcGVuIHRoZSBuZXcgYXV4IGZpbGUuICBUZVggd2lsbCBjbG9zZSBpdCBhdXRvbWF0aWNhbGx5IGF0IGV4aXQuCi0gIFxvcGVub3V0XGF1eGZpbGU9XGpvYm5hbWUuYXV4Ci1cZW5kZ3JvdXB9Ci0KLQotJSBGb290bm90ZXMuCi0KLVxuZXdjb3VudCBcZm9vdG5vdGVubwotCi0lIFRoZSB0cmFpbGluZyBzcGFjZSBpbiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb24gZm9yIHN1cGVyZWplY3QgaXMKLSUgdml0YWwgZm9yIHByb3BlciBmaWxsaW5nOyBwYWdlcyBjb21lIG91dCB1bmFsaWduZWQgd2hlbiB5b3UgZG8gYQotJSBwYWdlYWxpZ25tYWNybyBjYWxsIGlmIHRoYXQgc3BhY2UgYmVmb3JlIHRoZSBjbG9zaW5nIGJyYWNlIGlzCi0lIHJlbW92ZWQuIChHZW5lcmFsbHksIG51bWVyaWMgY29uc3RhbnRzIHNob3VsZCBhbHdheXMgYmUgZm9sbG93ZWQgYnkgYQotJSBzcGFjZSB0byBwcmV2ZW50IHN0cmFuZ2UgZXhwYW5zaW9uIGVycm9ycy4pCi1cZGVmXHN1cGVyZWplY3R7XHBhclxwZW5hbHR5IC0yMDAwMFxmb290bm90ZW5vID0wIH0KLQotJSBAZm9vdG5vdGVzdHlsZSBpcyBtZWFuaW5nZnVsIGZvciBpbmZvIG91dHB1dCBvbmx5LgotXGxldFxmb290bm90ZXN0eWxlPVxjb21tZW50Ci0KLVxsZXRccHRleGZvb3Rub3RlPVxmb290bm90ZQotCi17XGNhdGNvZGUgYFxAPTExCi0lCi0lIEF1dG8tbnVtYmVyIGZvb3Rub3Rlcy4gIE90aGVyd2lzZSBsaWtlIHBsYWluLgotXGdkZWZcZm9vdG5vdGV7JQotICBcZ2xvYmFsXGFkdmFuY2VcZm9vdG5vdGVubyBieSBcQG5lCi0gIFxlZGVmXHRoaXNmb290bm97JF57XHRoZVxmb290bm90ZW5vfSR9JQotICAlCi0gICUgSW4gY2FzZSB0aGUgZm9vdG5vdGUgY29tZXMgYXQgdGhlIGVuZCBvZiBhIHNlbnRlbmNlLCBwcmVzZXJ2ZSB0aGUKLSAgJSBleHRyYSBzcGFjaW5nIGFmdGVyIHdlIGRvIHRoZSBmb290bm90ZSBudW1iZXIuCi0gIFxsZXRcQHNmXGVtcHR5Ci0gIFxpZmhtb2RlXGVkZWZcQHNme1xzcGFjZWZhY3Rvclx0aGVcc3BhY2VmYWN0b3J9XC9cZmkKLSAgJQotICAlIFJlbW92ZSBpbmFkdmVydGVudCBibGFuayBzcGFjZSBiZWZvcmUgdHlwZXNldHRpbmcgdGhlIGZvb3Rub3RlIG51bWJlci4KLSAgXHVuc2tpcAotICBcdGhpc2Zvb3Rub1xAc2YKLSAgXGZvb3Rub3Rlenp6Ci19JQotCi0lIERvbid0IGJvdGhlciB3aXRoIHRoZSB0cmlja2VyeSBpbiBwbGFpbi50ZXggdG8gbm90IHJlcXVpcmUgdGhlCi0lIGZvb3Rub3RlIHRleHQgYXMgYSBwYXJhbWV0ZXIuICBPdXIgZm9vdG5vdGVzIGRvbid0IG5lZWQgdG8gYmUgc28gZ2VuZXJhbC4KLSUKLSUgT2ggeWVzLCB0aGV5IGRvOyBvdGhlcndpc2UsIEBpZnNldCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IHVzZXMKLSUgXHBhcnNlYXJnbGluZSBmYWlsIGluc2lkZSBmb290bm90ZXMgYmVjYXVzZSB0aGUgdG9rZW5zIGFyZSBmaXhlZCB3aGVuCi0lIHRoZSBmb290bm90ZSBpcyByZWFkLiAgLS1rYXJsLCAxNm5vdjk2LgotJQotXGxvbmdcZ2RlZlxmb290bm90ZXp6entcaW5zZXJ0XGZvb3RpbnNcYmdyb3VwCi0gICUgV2Ugd2FudCB0byB0eXBlc2V0IHRoaXMgdGV4dCBhcyBhIG5vcm1hbCBwYXJhZ3JhcGgsIGV2ZW4gaWYgdGhlCi0gICUgZm9vdG5vdGUgcmVmZXJlbmNlIG9jY3VycyBpbiAoZm9yIGV4YW1wbGUpIGEgZGlzcGxheSBlbnZpcm9ubWVudC4KLSAgJSBTbyByZXNldCBzb21lIHBhcmFtZXRlcnMuCi0gIFxpbnRlcmxpbmVwZW5hbHR5XGludGVyZm9vdG5vdGVsaW5lcGVuYWx0eQotICBcc3BsaXR0b3Bza2lwXGh0XHN0cnV0Ym94ICUgdG9wIGJhc2VsaW5lIGZvciBicm9rZW4gZm9vdG5vdGVzCi0gIFxzcGxpdG1heGRlcHRoXGRwXHN0cnV0Ym94Ci0gIFxmbG9hdGluZ3BlbmFsdHlcQE1NCi0gIFxsZWZ0c2tpcFx6QHNraXAKLSAgXHJpZ2h0c2tpcFx6QHNraXAKLSAgXHNwYWNlc2tpcFx6QHNraXAKLSAgXHhzcGFjZXNraXBcekBza2lwCi0gIFxwYXJpbmRlbnRcZGVmYXVsdHBhcmluZGVudAotICAlCi0gICUgSGFuZyB0aGUgZm9vdG5vdGUgdGV4dCBvZmYgdGhlIG51bWJlci4KLSAgXGhhbmcKLSAgXHRleHRpbmRlbnR7XHRoaXNmb290bm99JQotICAlCi0gICUgRG9uJ3QgY3Jhc2ggaW50byB0aGUgbGluZSBhYm92ZSB0aGUgZm9vdG5vdGUgdGV4dC4gIFNpbmNlIHRoaXMKLSAgJSBleHBhbmRzIGludG8gYSBib3gsIGl0IG11c3QgY29tZSB3aXRoaW4gdGhlIHBhcmFncmFwaCwgbGVzdCBpdAotICAlIHByb3ZpZGUgYSBwbGFjZSB3aGVyZSBUZVggY2FuIHNwbGl0IHRoZSBmb290bm90ZS4KLSAgXGZvb3RzdHJ1dAotICBcZnV0dXJlbGV0XG5leHRcZm9AdAotfQotXGRlZlxmb0B0e1xpZmNhdFxiZ3JvdXBcbm9leHBhbmRcbmV4dCBcbGV0XG5leHRcZkBAdAotICBcZWxzZVxsZXRcbmV4dFxmQHRcZmkgXG5leHR9Ci1cZGVmXGZAQHR7XGJncm91cFxhZnRlcmdyb3VwXEBmb290XGxldFxuZXh0fQotXGRlZlxmQHQjMXsjMVxAZm9vdH0KLVxkZWZcQGZvb3R7XHN0cnV0XGVncm91cH0KLQotfSVlbmQgXGNhdGNvZGUgYFxAPTExCi0KLSUgU2V0IHRoZSBiYXNlbGluZXNraXAgdG8gIzEsIGFuZCB0aGUgbGluZXNraXAgYW5kIHN0cnV0IHNpemUKLSUgY29ycmVzcG9uZGluZ2x5LiAgVGhlcmUgaXMgbm8gZGVlcCBtZWFuaW5nIGJlaGluZCB0aGVzZSBtYWdpYyBudW1iZXJzCi0lIHVzZWQgYXMgZmFjdG9yczsgdGhleSBqdXN0IG1hdGNoIChjbG9zZWx5IGVub3VnaCkgd2hhdCBLbnV0aCBkZWZpbmVkLgotJQotXGRlZlxsaW5lc2tpcGZhY3RvcnsuMDgzMzN9Ci1cZGVmXHN0cnV0aGVpZ2h0cGVyY2VudHsuNzA4MzN9Ci1cZGVmXHN0cnV0ZGVwdGhwZXJjZW50IHsuMjkxNjd9Ci0lCi1cZGVmXHNldGxlYWRpbmcjMXslCi0gIFxub3JtYWxiYXNlbGluZXNraXAgPSAjMVxyZWxheAotICBcbm9ybWFsbGluZXNraXAgPSBcbGluZXNraXBmYWN0b3Jcbm9ybWFsYmFzZWxpbmVza2lwCi0gIFxub3JtYWxiYXNlbGluZXMKLSAgXHNldGJveFxzdHJ1dGJveCA9XGhib3h7JQotICAgIFx2cnVsZSB3aWR0aDBwdCBoZWlnaHRcc3RydXRoZWlnaHRwZXJjZW50XGJhc2VsaW5lc2tpcAotICAgICAgICAgICAgICAgICAgICBkZXB0aCBcc3RydXRkZXB0aHBlcmNlbnQgXGJhc2VsaW5lc2tpcAotICB9JQotfQotCi0lIEB8IGluc2VydHMgYSBjaGFuZ2ViYXIgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgbGluZS4gIEl0IHNob3VsZAotJSBzdXJyb3VuZCBhbnkgY2hhbmdlZCB0ZXh0LiAgVGhpcyBhcHByb2FjaCBkb2VzICpub3QqIHdvcmsgaWYgdGhlCi0lIGNoYW5nZSBzcGFucyBtb3JlIHRoYW4gdHdvIGxpbmVzIG9mIG91dHB1dC4gIFRvIGhhbmRsZSB0aGF0LCB3ZSB3b3VsZAotJSBoYXZlIGFkb3B0IGEgbXVjaCBtb3JlIGRpZmZpY3VsdCBhcHByb2FjaCAocHV0dGluZyBtYXJrcyBpbnRvIHRoZSBtYWluCi0lIHZlcnRpY2FsIGxpc3QgZm9yIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBlYWNoIGNoYW5nZSkuCi0lCi1cZGVmXHx7JQotICAlIFx2YWRqdXN0IGNhbiBvbmx5IGJlIHVzZWQgaW4gaG9yaXpvbnRhbCBtb2RlLgotICBcbGVhdmV2bW9kZQotICAlCi0gICUgQXBwZW5kIHRoaXMgdmVydGljYWwgbW9kZSBtYXRlcmlhbCBhZnRlciB0aGUgY3VycmVudCBsaW5lIGluIHRoZSBvdXRwdXQuCi0gIFx2YWRqdXN0eyUKLSAgICAlIFdlIHdhbnQgdG8gaW5zZXJ0IGEgcnVsZSB3aXRoIHRoZSBoZWlnaHQgYW5kIGRlcHRoIG9mIHRoZSBjdXJyZW50Ci0gICAgJSBsZWFkaW5nOyB0aGF0IGlzIGV4YWN0bHkgd2hhdCBcc3RydXRib3ggaXMgc3VwcG9zZWQgdG8gcmVjb3JkLgotICAgIFx2c2tpcC1cYmFzZWxpbmVza2lwCi0gICAgJQotICAgICUgXHZhZGp1c3QtaXRlbXMgYXJlIGluc2VydGVkIGF0IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHR5cGUuICBTbwotICAgICUgdGhlIFxsbGFwIGhlcmUgbW92ZXMgb3V0IGludG8gdGhlIGxlZnQtaGFuZCBtYXJnaW4uCi0gICAgXGxsYXB7JQotICAgICAgJQotICAgICAgJSBGb3IgYSB0aGlja2VyIG9yIHRoaW5uZXIgYmFyLCBjaGFuZ2UgdGhlIGAxcHQnLgotICAgICAgXHZydWxlIGhlaWdodFxiYXNlbGluZXNraXAgd2lkdGgxcHQKLSAgICAgICUKLSAgICAgICUgVGhpcyBpcyB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgYmFyIGFuZCB0aGUgdGV4dC4KLSAgICAgIFxoc2tpcCAxMnB0Ci0gICAgfSUKLSAgfSUKLX0KLQotJSBGb3IgYSBmaW5hbCBjb3B5LCB0YWtlIG91dCB0aGUgcmVjdGFuZ2xlcwotJSB0aGF0IG1hcmsgb3ZlcmZ1bGwgYm94ZXMgKGluIGNhc2UgeW91IGhhdmUgZGVjaWRlZAotJSB0aGF0IHRoZSB0ZXh0IGxvb2tzIG9rIGV2ZW4gdGhvdWdoIGl0IHBhc3NlcyB0aGUgbWFyZ2luKS4KLSUKLVxkZWZcZmluYWxvdXR7XG92ZXJmdWxscnVsZT0wcHR9Ci0KLSUgQGltYWdlLiAgV2UgdXNlIHRoZSBtYWNyb3MgZnJvbSBlcHNmLnRleCB0byBzdXBwb3J0IHRoaXMuCi0lIElmIGVwc2YudGV4IGlzIG5vdCBpbnN0YWxsZWQgYW5kIEBpbWFnZSBpcyB1c2VkLCB3ZSBjb21wbGFpbi4KLSUgCi0lIENoZWNrIGZvciBhbmQgcmVhZCBlcHNmLnRleCB1cCBmcm9udC4gIElmIHdlIHJlYWQgaXQgb25seSBhdCBAaW1hZ2UKLSUgdGltZSwgd2UgbWlnaHQgYmUgaW5zaWRlIGEgZ3JvdXAsIGFuZCB0aGVuIGl0cyBkZWZpbml0aW9ucyB3b3VsZCBnZXQKLSUgdW5kb25lIGFuZCB0aGUgbmV4dCBpbWFnZSB3b3VsZCBmYWlsLgotXG9wZW5pbiAxID0gZXBzZi50ZXgKLVxpZmVvZiAxIFxlbHNlCi0gIFxjbG9zZWluIDEKLSAgJSBEbyBub3QgYm90aGVyIHNob3dpbmcgYmFubmVyIHdpdGggcG9zdC12Mi43IGVwc2YudGV4IChhdmFpbGFibGUgaW4KLSAgJSBkb2MvZXBzZi50ZXggdW50aWwgaXQgc2hvd3MgdXAgb24gY3RhbikuCi0gIFxkZWZcZXBzZmFubm91bmNle1x0b2tzMCA9IH0lCi0gIFxpbnB1dCBlcHNmLnRleAotXGZpCi0lCi1cbmV3aWZcaWZ3YXJuZWRub2Vwc2YKLVxuZXdoZWxwXG5vZXBzZmhlbHB7ZXBzZi50ZXggbXVzdCBiZSBpbnN0YWxsZWQgZm9yIGltYWdlcyB0bwotICB3b3JrLiAgSXQgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgVGV4aW5mbyBkaXN0cmlidXRpb24sIG9yIHlvdSBjYW4gZ2V0Ci0gIGl0IGZyb20gZnRwOi8vZnRwLnR1Zy5vcmcvdGV4L2Vwc2YudGV4Ln0KLSUKLSUgT25seSBjb21wbGFpbiBvbmNlIGFib3V0IGxhY2sgb2YgZXBzZi50ZXguCi1cZGVmXGltYWdlIzF7JQotICBcaWZ4XGVwc2Zib3hcdW5kZWZpbmVkCi0gICAgXGlmd2FybmVkbm9lcHNmIFxlbHNlCi0gICAgICBcZXJyaGVscCA9IFxub2Vwc2ZoZWxwCi0gICAgICBcZXJybWVzc2FnZXtlcHNmLnRleCBub3QgZm91bmQsIGltYWdlcyB3aWxsIGJlIGlnbm9yZWR9JQotICAgICAgXGdsb2JhbFx3YXJuZWRub2Vwc2Z0cnVlCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgXGltYWdleHh4ICMxLCwsXGZpbmlzaAotICBcZmkKLX0KLSUKLSUgQXJndW1lbnRzIHRvIEBpbWFnZToKLSUgIzEgaXMgKG1hbmRhdG9yeSkgaW1hZ2UgZmlsZW5hbWU7IHdlIHRhY2sgb24gLmVwcyBleHRlbnNpb24uCi0lICMyIGlzIChvcHRpb25hbCkgd2lkdGgsICMzIGlzIChvcHRpb25hbCkgaGVpZ2h0LgotJSAjNCBpcyBqdXN0IHRoZSB1c3VhbCBleHRyYSBpZ25vcmVkIGFyZyBmb3IgcGFyc2luZyB0aGlzIHN0dWZmLgotXGRlZlxpbWFnZXh4eCMxLCMyLCMzLCM0XGZpbmlzaHslCi0gICUgXGVwc2Zib3ggaXRzZWxmIHJlc2V0cyBcZXBzZj9zaXplIGF0IGVhY2ggZmlndXJlLgotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9XGlmZGltXHdkMCA+IDBwdCBcZXBzZnhzaXplPSMyXHJlbGF4IFxmaQotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzN9XGlmZGltXHdkMCA+IDBwdCBcZXBzZnlzaXplPSMzXHJlbGF4IFxmaQotICAlIElmIHRoZSBpbWFnZSBpcyBieSBpdHNlbGYsIGNlbnRlciBpdC4KLSAgXGlmdm1vZGUKLSAgICBcbm9icmVha1xtZWRza2lwCi0gICAgXG5vYnJlYWsKLSAgICBcY2VudGVybGluZXtcZXBzZmJveHsjMS5lcHN9fSUKLSAgICBcYmlnYnJlYWsKLSAgXGVsc2UKLSAgICBcZXBzZmJveHsjMS5lcHN9JQotICBcZmkKLX0KLQotCi1cbWVzc2FnZXtwYXBlciBzaXplcyx9Ci0lIEFuZCBvdGhlciByZWxhdGVkIHBhcmFtZXRlcnMuCi0KLVxuZXdkaW1lblxkZWZhdWx0cGFyaW5kZW50IFxkZWZhdWx0cGFyaW5kZW50ID0gMTVwdAotCi1cY2hhcGhlYWRpbmdza2lwID0gMTVwdCBwbHVzIDRwdCBtaW51cyAycHQKLVxzZWNoZWFkaW5nc2tpcCA9IDEycHQgcGx1cyAzcHQgbWludXMgMnB0Ci1cc3Vic2VjaGVhZGluZ3NraXAgPSA5cHQgcGx1cyAycHQgbWludXMgMnB0Ci0KLSUgUHJldmVudCB1bmRlcmZ1bGwgdmJveCBlcnJvciBtZXNzYWdlcy4KLVx2YmFkbmVzcyA9IDEwMDAwCi0KLSUgRG9uJ3QgYmUgc28gZmluaWNreSBhYm91dCB1bmRlcmZ1bGwgaGJveGVzLCBlaXRoZXIuCi1caGJhZG5lc3MgPSAyMDAwCi0KLSUgRm9sbG93aW5nIEdlb3JnZSBCdXNoLCBqdXN0IGdldCByaWQgb2Ygd2lkb3dzIGFuZCBvcnBoYW5zLgotXHdpZG93cGVuYWx0eT0xMDAwMAotXGNsdWJwZW5hbHR5PTEwMDAwCi0KLSUgVXNlIFRlWCAzLjAncyBcZW1lcmdlbmN5c3RyZXRjaCB0byBoZWxwIGxpbmUgYnJlYWtpbmcsIGJ1dCBpZiB3ZSdyZQotJSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBUZVgsIGRvbid0IGRvIGFueXRoaW5nLiAgV2Ugd2FudCB0aGUgYW1vdW50IG9mCi0lIHN0cmV0Y2ggYWRkZWQgdG8gZGVwZW5kIG9uIHRoZSBsaW5lIGxlbmd0aCwgaGVuY2UgdGhlIGRlcGVuZGVuY2Ugb24KLSUgXGhzaXplLiAgVGhpcyBtYWtlcyBpdCBjb21lIHRvIGFib3V0IDlwdCBmb3IgdGhlIDguNXgxMSBmb3JtYXQuICBXZQotJSBjYWxsIHRoaXMgd2hlbmV2ZXIgdGhlIHBhcGVyIHNpemUgaXMgc2V0LgotJQotXGRlZlxzZXRlbWVyZ2VuY3lzdHJldGNoeyUKLSAgXGlmeFxlbWVyZ2VuY3lzdHJldGNoXHRoaXNpc3VuZGVmaW5lZAotICAgICUgQWxsb3cgdXMgdG8gYXNzaWduIHRvIFxlbWVyZ2VuY3lzdHJldGNoIGFueXdheS4KLSAgICBcZGVmXGVtZXJnZW5jeXN0cmV0Y2h7XGRpbWVuMH0lCi0gIFxlbHNlCi0gICAgXGVtZXJnZW5jeXN0cmV0Y2ggPSBcaHNpemUKLSAgICBcZGl2aWRlXGVtZXJnZW5jeXN0cmV0Y2ggYnkgNDUKLSAgXGZpCi19Ci0KLSUgUGFyYW1ldGVycyBpbiBvcmRlcjogMSkgdGV4dGhlaWdodDsgMikgdGV4dHdpZHRoOyAzKSB2b2Zmc2V0OwotJSA0KSBob2Zmc2V0OyA1KSBiaW5kaW5nIG9mZnNldDsgNikgdG9wc2tpcC4gIFRoZW4gd2hvZXZlciBjYWxscyB1cyBjYW4KLSUgc2V0IFxwYXJza2lwIGFuZCBjYWxsIFxzZXRsZWFkaW5nIGZvciBcYmFzZWxpbmVza2lwLgotJQotXGRlZlxpbnRlcm5hbHBhZ2VzaXplcyMxIzIjMyM0IzUjNnslCi0gIFx2b2Zmc2V0ID0gIzNccmVsYXgKLSAgXHRvcHNraXAgPSAjNlxyZWxheAotICBcc3BsaXR0b3Bza2lwID0gXHRvcHNraXAKLSAgJQotICBcdnNpemUgPSAjMVxyZWxheAotICBcYWR2YW5jZVx2c2l6ZSBieSBcdG9wc2tpcAotICBcb3V0ZXJ2c2l6ZSA9IFx2c2l6ZQotICBcYWR2YW5jZVxvdXRlcnZzaXplIGJ5IDAuNmluCi0gIFxwYWdlaGVpZ2h0ID0gXHZzaXplCi0gICUKLSAgXGhzaXplID0gIzJccmVsYXgKLSAgXG91dGVyaHNpemUgPSBcaHNpemUKLSAgXGFkdmFuY2Vcb3V0ZXJoc2l6ZSBieSAwLjVpbgotICBccGFnZXdpZHRoID0gXGhzaXplCi0gICUKLSAgXG5vcm1hbG9mZnNldCA9ICM0XHJlbGF4Ci0gIFxiaW5kaW5nb2Zmc2V0ID0gIzVccmVsYXgKLSAgJQotICBccGFyaW5kZW50ID0gXGRlZmF1bHRwYXJpbmRlbnQKLSAgXHNldGVtZXJnZW5jeXN0cmV0Y2gKLX0KLQotJSBAbGV0dGVycGFwZXIgKHRoZSBkZWZhdWx0KS4KLVxkZWZcbGV0dGVycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQotICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKLSAgXHNldGxlYWRpbmd7MTMuMnB0fSUKLSAgJQotICAlIElmIHBhZ2UgaXMgbm90aGluZyBidXQgdGV4dCwgbWFrZSBpdCBjb21lIG91dCBldmVuLgotICBcaW50ZXJuYWxwYWdlc2l6ZXN7NDZcYmFzZWxpbmVza2lwfXs2aW59e1x2b2Zmc2V0fXsuMjVpbn17XGJpbmRpbmdvZmZzZXR9ezM2cHR9JQotfX0KLQotJSBVc2UgQHNtYWxsYm9vayB0byByZXNldCBwYXJhbWV0ZXJzIGZvciA3eDkuNSAob3Igc28pIGZvcm1hdC4KLVxkZWZcc21hbGxib29re3tcZ2xvYmFsZGVmcyA9IDEKLSAgXHBhcnNraXAgPSAycHQgcGx1cyAxcHQKLSAgXHNldGxlYWRpbmd7MTJwdH0lCi0gICUKLSAgXGludGVybmFscGFnZXNpemVzezcuNWlufXs1LmlufXtcdm9mZnNldH17LjI1aW59e1xiaW5kaW5nb2Zmc2V0fXsxNnB0fSUKLSAgJQotICBcbGlzcG5hcnJvd2luZyA9IDAuM2luCi0gIFx0b2xlcmFuY2UgPSA3MDAKLSAgXGhmdXp6ID0gMXB0Ci0gIFxjb250ZW50c3JpZ2h0bWFyZ2luID0gMHB0Ci0gIFxkZWZ0eXBlbWFyZ2luID0gMHB0Ci0gIFxkZWZib2R5aW5kZW50ID0gLjVjbQotICAlCi0gIFxsZXRcc21hbGxkaXNwbGF5ID0gXHNtYWxsZGlzcGxheXgKLSAgXGxldFxzbWFsbGV4YW1wbGUgPSBcc21hbGxsaXNweAotICBcbGV0XHNtYWxsZm9ybWF0ID0gXHNtYWxsZm9ybWF0eAotICBcbGV0XHNtYWxsbGlzcCA9IFxzbWFsbGxpc3B4Ci19fQotCi0lIFVzZSBAYWZvdXJwYXBlciB0byBwcmludCBvbiBFdXJvcGVhbiBBNCBwYXBlci4KLVxkZWZcYWZvdXJwYXBlcnt7XGdsb2JhbGRlZnMgPSAxCi0gIFxzZXRsZWFkaW5nezEycHR9JQotICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKLSAgJQotICBcaW50ZXJuYWxwYWdlc2l6ZXN7NTNcYmFzZWxpbmVza2lwfXsxNjBtbX17XHZvZmZzZXR9ezRtbX17XGJpbmRpbmdvZmZzZXR9ezQ0cHR9JQotICAlCi0gIFx0b2xlcmFuY2UgPSA3MDAKLSAgXGhmdXp6ID0gMXB0Ci19fQotCi0lIEEgc3BlY2lmaWMgdGV4dCBsYXlvdXQsIDI0eDE1Y20gb3ZlcmFsbCwgaW50ZW5kZWQgZm9yIEE0IHBhcGVyLiAgVG9wIG1hcmdpbgotJSAyOW1tLCBoZW5jZSBib3R0b20gbWFyZ2luIDI4bW0sIG5vbWluYWwgc2lkZSBtYXJnaW4gM2NtLgotXGRlZlxhZm91cmxhdGV4e3tcZ2xvYmFsZGVmcyA9IDEKLSAgXHNldGxlYWRpbmd7MTMuNnB0fSUKLSAgJQotICBcYWZvdXJwYXBlcgotICBcaW50ZXJuYWxwYWdlc2l6ZXN7MjM3bW19ezE1MG1tfXszLjZtbX17My42bW19ezNtbX17N21tfSUKLSAgJQotICBcZ2xvYmFsZGVmcyA9IDAKLX19Ci0KLSUgVXNlIEBhZm91cndpZGUgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTQgcGFwZXIgaW4gd2lkZSBmb3JtYXQuCi1cZGVmXGFmb3Vyd2lkZXslCi0gIFxhZm91cnBhcGVyCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3s5LjVpbn17Ni41aW59e1xob2Zmc2V0fXtcbm9ybWFsb2Zmc2V0fXtcYmluZGluZ29mZnNldH17N21tfSUKLSAgJQotICBcZ2xvYmFsZGVmcyA9IDAKLX0KLQotJSBAcGFnZXNpemVzIFRFWFRIRUlHSFRbLFRFWFRXSURUSF0KLSUgUGVyaGFwcyB3ZSBzaG91bGQgYWxsb3cgc2V0dGluZyB0aGUgbWFyZ2lucywgXHRvcHNraXAsIFxwYXJza2lwLAotJSBhbmQvb3IgbGVhZGluZywgYWxzby4gT3IgcGVyaGFwcyB3ZSBzaG91bGQgY29tcHV0ZSB0aGVtIHNvbWVob3cuCi0lIAotXGRlZlxwYWdlc2l6ZXN7XHBhcnNlYXJnXHBhZ2VzaXplc3h4eH0KLVxkZWZccGFnZXNpemVzeHh4IzF7XHBhZ2VzaXplc3l5eSAjMSwsXGZpbmlzaH0KLVxkZWZccGFnZXNpemVzeXl5IzEsIzIsIzNcZmluaXNoe3slCi0gIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn1caWZkaW1cd2QwID4gMHB0IFxoc2l6ZT0jMlxyZWxheCBcZmkKLSAgXGdsb2JhbGRlZnMgPSAxCi0gICUKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEzLjJwdH0lCi0gICUKLSAgXGludGVybmFscGFnZXNpemVzeyMxfXtcaHNpemV9e1x2b2Zmc2V0fXtcbm9ybWFsb2Zmc2V0fXtcYmluZGluZ29mZnNldH17NDRwdH0lCi19fQotCi0lIFNldCBkZWZhdWx0IHRvIGxldHRlci4KLSUgCi1cbGV0dGVycGFwZXIKLQotXG1lc3NhZ2V7YW5kIHR1cm5pbmcgb24gdGV4aW5mbyBpbnB1dCBmb3JtYXQufQotCi0lIERlZmluZSBtYWNyb3MgdG8gb3V0cHV0IHZhcmlvdXMgY2hhcmFjdGVycyB3aXRoIGNhdGNvZGUgZm9yIG5vcm1hbCB0ZXh0LgotXGNhdGNvZGVgXCI9XG90aGVyCi1cY2F0Y29kZWBcfj1cb3RoZXIKLVxjYXRjb2RlYFxePVxvdGhlcgotXGNhdGNvZGVgXF89XG90aGVyCi1cY2F0Y29kZWBcfD1cb3RoZXIKLVxjYXRjb2RlYFw8PVxvdGhlcgotXGNhdGNvZGVgXD49XG90aGVyCi1cY2F0Y29kZWBcKz1cb3RoZXIKLVxkZWZcbm9ybWFsZG91YmxlcXVvdGV7In0KLVxkZWZcbm9ybWFsdGlsZGV7fn0KLVxkZWZcbm9ybWFsY2FyZXR7Xn0KLVxkZWZcbm9ybWFsdW5kZXJzY29yZXtffQotXGRlZlxub3JtYWx2ZXJ0aWNhbGJhcnt8fQotXGRlZlxub3JtYWxsZXNzezx9Ci1cZGVmXG5vcm1hbGdyZWF0ZXJ7Pn0KLVxkZWZcbm9ybWFscGx1c3srfQotCi0lIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBtYWtlIGEgY2hhcmFjdGVyIHByaW50IG9uZSB3YXkgaW4gdHRmb250Ci0lIHdoZXJlIGl0IGNhbiBwcm9iYWJseSBqdXN0IGJlIG91dHB1dCwgYW5kIGFub3RoZXIgd2F5IGluIG90aGVyIGZvbnRzLAotJSB3aGVyZSBzb21ldGhpbmcgaGFpcmllciBwcm9iYWJseSBuZWVkcyB0byBiZSBkb25lLgotJQotJSAjMSBpcyB3aGF0IHRvIHByaW50IGlmIHdlIGFyZSBpbmRlZWQgdXNpbmcgXHR0OyAjMiBpcyB3aGF0IHRvIHByaW50Ci0lIG90aGVyd2lzZS4gIFNpbmNlIGFsbCB0aGUgQ29tcHV0ZXIgTW9kZXJuIHR5cGV3cml0ZXIgZm9udHMgaGF2ZSB6ZXJvCi0lIGludGVyd29yZCBzdHJldGNoIChhbmQgc2hyaW5rKSwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0IGFsbAotJSB0eXBld3JpdGVyIGZvbnRzIHRvIGhhdmUgdGhpcywgd2UgY2FuIGNoZWNrIHRoYXQgZm9udCBwYXJhbWV0ZXIuCi0lCi1cZGVmXGlmdXNpbmd0dCMxIzJ7XGlmZGltIFxmb250ZGltZW4zXHRoZVxmb250PTBwdCAjMVxlbHNlICMyXGZpfQotCi0lIFR1cm4gb2ZmIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMgZXhjZXB0IEAKLSUgKGFuZCB0aG9zZSB3aGljaCB0aGUgdXNlciBjYW4gdXNlIGFzIGlmIHRoZXkgd2VyZSBvcmRpbmFyeSkuCi0lIE1vc3Qgb2YgdGhlc2Ugd2Ugc2ltcGx5IHByaW50IGZyb20gdGhlIFx0dCBmb250LCBidXQgZm9yIHNvbWUsIHdlIGNhbgotJSB1c2UgbWF0aCBvciBvdGhlciB2YXJpYW50cyB0aGF0IGxvb2sgYmV0dGVyIGluIG5vcm1hbCB0ZXh0LgotCi1cY2F0Y29kZWBcIj1cYWN0aXZlCi1cZGVmXGFjdGl2ZWRvdWJsZXF1b3Rle3tcdHRcY2hhcjM0fX0KLVxsZXQiPVxhY3RpdmVkb3VibGVxdW90ZQotXGNhdGNvZGVgXH49XGFjdGl2ZQotXGRlZn57e1x0dFxjaGFyMTI2fX0KLVxjaGFyZGVmXGhhdD1gXF4KLVxjYXRjb2RlYFxePVxhY3RpdmUKLVxkZWZee3tcdHQgXGhhdH19Ci0KLVxjYXRjb2RlYFxfPVxhY3RpdmUKLVxkZWZfe1xpZnVzaW5ndHRcbm9ybWFsdW5kZXJzY29yZVxffQotJSBTdWJyb3V0aW5lIGZvciB0aGUgcHJldmlvdXMgbWFjcm8uCi1cZGVmXF97XGxlYXZldm1vZGUgXGtlcm4uMDZlbSBcdmJveHtcaHJ1bGUgd2lkdGguM2VtIGhlaWdodC4xZXh9fQotCi1cY2F0Y29kZWBcfD1cYWN0aXZlCi1cZGVmfHt7XHR0XGNoYXIxMjR9fQotXGNoYXJkZWYgXGxlc3M9YFw8Ci1cY2F0Y29kZWBcPD1cYWN0aXZlCi1cZGVmPHt7XHR0IFxsZXNzfX0KLVxjaGFyZGVmIFxndHI9YFw+Ci1cY2F0Y29kZWBcPj1cYWN0aXZlCi1cZGVmPnt7XHR0IFxndHJ9fQotXGNhdGNvZGVgXCs9XGFjdGl2ZQotXGRlZit7e1x0dCBcY2hhciA0M319Ci0lXGNhdGNvZGUgMjc9XGFjdGl2ZQotJVxkZWZeXlt7JFxkaWFtb25kc3VpdCR9Ci0KLSUgU2V0IHVwIGFuIGFjdGl2ZSBkZWZpbml0aW9uIGZvciA9LCBidXQgZG9uJ3QgZW5hYmxlIGl0IG1vc3Qgb2YgdGhlIHRpbWUuCi17XGNhdGNvZGVgXD09XGFjdGl2ZQotXGdsb2JhbFxkZWY9e3tcdHQgXGNoYXIgNjF9fX0KLQotXGNhdGNvZGVgKz1cYWN0aXZlCi1cY2F0Y29kZWBcXz1cYWN0aXZlCi0KLSUgSWYgYSAuZm10IGZpbGUgaXMgYmVpbmcgdXNlZCwgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGFwcGVhciBpbiBhIGZpbGUKLSUgbmFtZSBjYW5ub3QgYmUgYWN0aXZlIHVudGlsIHdlIGhhdmUgcGFyc2VkIHRoZSBjb21tYW5kIGxpbmUuCi0lIFNvIHR1cm4gdGhlbSBvZmYgYWdhaW4sIGFuZCBoYXZlIFxldmVyeWpvYiAob3IgQHNldGZpbGVuYW1lKSB0dXJuIHRoZW0gb24uCi0lIFxvdGhlcmlmeWFjdGl2ZSBpcyBjYWxsZWQgbmVhciB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KLVxkZWZcb3RoZXJpZnlhY3RpdmV7XGNhdGNvZGVgKz1cb3RoZXIgXGNhdGNvZGVgXF89XG90aGVyfQotCi1cY2F0Y29kZWBcQD0wCi0KLSUgXHJhd2JhY2tzbGFzaHh4IG91dHB1dCBvbmUgYmFja3NsYXNoIGNoYXJhY3RlciBpbiBjdXJyZW50IGZvbnQKLVxnbG9iYWxcY2hhcmRlZlxyYXdiYWNrc2xhc2h4eD1gXFwKLSV7XGNhdGNvZGVgXFw9XG90aGVyCi0lQGdkZWZAcmF3YmFja3NsYXNoeHh7XH19Ci0KLSUgXHJhd2JhY2tzbGFzaCByZWRlZmluZXMgXCBhcyBpbnB1dCB0byBkbyBccmF3YmFja3NsYXNoeHguCi17XGNhdGNvZGVgXFw9XGFjdGl2ZQotQGdkZWZAcmF3YmFja3NsYXNoe0BsZXRcPUByYXdiYWNrc2xhc2h4eCB9fQotCi0lIFxub3JtYWxiYWNrc2xhc2ggb3V0cHV0cyBvbmUgYmFja3NsYXNoIGluIGZpeGVkIHdpZHRoIGZvbnQuCi1cZGVmXG5vcm1hbGJhY2tzbGFzaHt7XHR0XHJhd2JhY2tzbGFzaHh4fX0KLQotJSBTYXkgQGZvbywgbm90IFxmb28sIGluIGVycm9yIG1lc3NhZ2VzLgotXGVzY2FwZWNoYXI9YFxACi0KLSUgXGNhdGNvZGUgMTc9MCAgICUgRGVmaW5lIGNvbnRyb2wtcQotXGNhdGNvZGVgXFw9XGFjdGl2ZQotCi0lIFVzZWQgc29tZXRpbWVzIHRvIHR1cm4gb2ZmIChlZmZlY3RpdmVseSkgdGhlIGFjdGl2ZSBjaGFyYWN0ZXJzCi0lIGV2ZW4gYWZ0ZXIgcGFyc2luZyB0aGVtLgotQGRlZkB0dXJub2ZmYWN0aXZle0BsZXQiPUBub3JtYWxkb3VibGVxdW90ZQotQGxldFw9QHJlYWxiYWNrc2xhc2gKLUBsZXR+PUBub3JtYWx0aWxkZQotQGxldF49QG5vcm1hbGNhcmV0Ci1AbGV0Xz1Abm9ybWFsdW5kZXJzY29yZQotQGxldHw9QG5vcm1hbHZlcnRpY2FsYmFyCi1AbGV0PD1Abm9ybWFsbGVzcwotQGxldD49QG5vcm1hbGdyZWF0ZXIKLUBsZXQrPUBub3JtYWxwbHVzfQotCi1AZGVmQG5vcm1hbHR1cm5vZmZhY3RpdmV7QGxldCI9QG5vcm1hbGRvdWJsZXF1b3RlCi1AbGV0XD1Abm9ybWFsYmFja3NsYXNoCi1AbGV0fj1Abm9ybWFsdGlsZGUKLUBsZXRePUBub3JtYWxjYXJldAotQGxldF89QG5vcm1hbHVuZGVyc2NvcmUKLUBsZXR8PUBub3JtYWx2ZXJ0aWNhbGJhcgotQGxldDw9QG5vcm1hbGxlc3MKLUBsZXQ+PUBub3JtYWxncmVhdGVyCi1AbGV0Kz1Abm9ybWFscGx1c30KLQotJSBNYWtlIF8gYW5kICsgXG90aGVyIGNoYXJhY3RlcnMsIHRlbXBvcmFyaWx5LgotJSBUaGlzIGlzIGNhbmNlbGVkIGJ5IEBmaXhiYWNrc2xhc2guCi1Ab3RoZXJpZnlhY3RpdmUKLQotJSBJZiBhIC5mbXQgZmlsZSBpcyBiZWluZyB1c2VkLCB3ZSBkb24ndCB3YW50IHRoZSBgXGlucHV0IHRleGluZm8nIHRvIHNob3cgdXAuCi0lIFRoYXQgaXMgd2hhdCBcZWF0aW5wdXQgaXMgZm9yOyBhZnRlciB0aGF0LCB0aGUgYFwnIHNob3VsZCByZXZlcnQgdG8gcHJpbnRpbmcKLSUgYSBiYWNrc2xhc2guCi0lCi1AZ2RlZkBlYXRpbnB1dCBpbnB1dCB0ZXhpbmZve0BmaXhiYWNrc2xhc2h9Ci1AZ2xvYmFsQGxldFwgPSBAZWF0aW5wdXQKLQotJSBPbiB0aGUgb3RoZXIgaGFuZCwgcGVyaGFwcyB0aGUgZmlsZSBkaWQgbm90IGhhdmUgYSBgXGlucHV0IHRleGluZm8nLiBUaGVuCi0lIHRoZSBmaXJzdCBgXHsgaW4gdGhlIGZpbGUgd291bGQgY2F1c2UgYW4gZXJyb3IuIFRoaXMgbWFjcm8gdHJpZXMgdG8gZml4Ci0lIHRoYXQsIGFzc3VtaW5nIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGBcJyBjb3VsZCBwbGF1c2libHkgb2NjdXIuCi0lIEFsc28gYmFjayB0dXJuIG9uIGFjdGl2ZSBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYXBwZWFyIGluIHRoZSBpbnB1dAotJSBmaWxlIG5hbWUsIGluIGNhc2Ugbm90IHVzaW5nIGEgcHJlLWR1bXBlZCBmb3JtYXQuCi0lCi1AZ2RlZkBmaXhiYWNrc2xhc2h7QGlmeFxAZWF0aW5wdXQgQGxldFwgPSBAbm9ybWFsYmFja3NsYXNoIEBmaQotICBAY2F0Y29kZWArPUBhY3RpdmUgQGNhdGNvZGVgQF89QGFjdGl2ZX0KLQotJSBUaGVzZSBsb29rIG9rIGluIGFsbCBmb250cywgc28ganVzdCBtYWtlIHRoZW0gbm90IHNwZWNpYWwuICBUaGUgQHJtIGJlbG93Ci0lIG1ha2VzIHN1cmUgdGhhdCB0aGUgY3VycmVudCBmb250IHN0YXJ0cyBvdXQgYXMgdGhlIG5ld2x5IGxvYWRlZCBjbXIxMAotQGNhdGNvZGVgQCQ9QG90aGVyIEBjYXRjb2RlYEAlPUBvdGhlciBAY2F0Y29kZWBAJj1Ab3RoZXIgQGNhdGNvZGVgQCM9QG90aGVyCi0KLUB0ZXh0Zm9udHMKLUBybQotCi1AYyBMb2NhbCB2YXJpYWJsZXM6Ci1AYyBwYWdlLWRlbGltaXRlcjogIl5cXFxcbWVzc2FnZSIKLUBjIEVuZDoKZGlmZiAtLWdpdCBhL3lsd3JhcCBiL3lsd3JhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjI4OGNjZC4uMDAwMDAwMAotLS0gYS95bHdyYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyB5bHdyYXAgLSB3cmFwcGVyIGZvciBsZXgveWFjYyBpbnZvY2F0aW9ucy4KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBVc2FnZToKLSMgICAgIHlsd3JhcCBQUk9HUkFNIElOUFVUIFtPVVRQVVQgREVTSVJFRF0uLi4gLS0gW0FSR1NdLi4uCi0jICogUFJPR1JBTSBpcyBwcm9ncmFtIHRvIHJ1bi4KLSMgKiBJTlBVVCBpcyB0aGUgaW5wdXQgZmlsZQotIyAqIE9VVFBVVCBpcyBmaWxlIFBST0cgZ2VuZXJhdGVzCi0jICogREVTSVJFRCBpcyBmaWxlIHdlIGFjdHVhbGx5IHdhbnQKLSMgKiBBUkdTIGFyZSBwYXNzZWQgdG8gUFJPRwotIyBBbnkgbnVtYmVyIG9mIE9VVFBVVCxERVNJUkVEIHBhaXJzIG1heSBiZSB1c2VkLgotCi0jIFRoZSBwcm9ncmFtIHRvIHJ1bi4KLXByb2c9IiQxIgotc2hpZnQKLSMgTWFrZSBhbnkgcmVsYXRpdmUgcGF0aCBpbiAkcHJvZyBhYnNvbHV0ZS4KLWNhc2UgIiRwcm9nIiBpbgotIC8qIHwgW0EtWmEtel06XFwqKSA7OwotICovKikgcHJvZz0iYHB3ZGAvJHByb2ciIDs7Ci1lc2FjCi0KLSMgVGhlIGlucHV0LgotaW5wdXQ9IiQxIgotc2hpZnQKLWNhc2UgIiRpbnB1dCIgaW4KLSAvKiB8IFtBLVphLXpdOlxcKikKLSAgICAjIEFic29sdXRlIHBhdGg7IGRvIG5vdGhpbmcuCi0gICAgOzsKLSAqKQotICAgICMgUmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUuICBXaHk/ICBCZWNhdXNlIG90aGVyd2lzZSBhbnkKLSAgICAjIGRlYnVnZ2luZyBpbmZvIGluIHRoZSBnZW5lcmF0ZWQgZmlsZSB3aWxsIHBvaW50IHRvIHRoZSB3cm9uZwotICAgICMgcGxhY2UuICBUaGlzIGlzIHJlYWxseSBncm9zcy4KLSAgICBpbnB1dD0iYHB3ZGAvJGlucHV0IgotICAgIDs7Ci1lc2FjCi0KLSMgV2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGFic29sdXRlIHBhdGggaWYgdGhlIGlucHV0IGluIHRoZSBjdXJyZW50Ci0jIGRpcmVjdG9yeSBsaWtlIHdoZW4gbWFraW5nIGEgdGFyIGJhbGwuCi1pbnB1dF9iYXNlPWBlY2hvICRpbnB1dCB8IHNlZCAtZSAnc3wuKi98fCdgCi1pZiB0ZXN0IC1mICRpbnB1dF9iYXNlICYmIGNtcCAkaW5wdXRfYmFzZSAkaW5wdXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGlucHV0PSRpbnB1dF9iYXNlCi1maQotCi1wYWlybGlzdD0KLXdoaWxlIHRlc3QgIiQjIiAtbmUgMDsgZG8KLSAgIGlmIHRlc3QgIiQxIiA9ICItLSI7IHRoZW4KLSAgICAgIHNoaWZ0Ci0gICAgICBicmVhawotICAgZmkKLSAgIHBhaXJsaXN0PSIkcGFpcmxpc3QgJDEiCi0gICBzaGlmdAotZG9uZQotCi0jIEZJWE1FOiBhZGQgaG9zdG5hbWUgaGVyZSBmb3IgcGFyYWxsZWwgbWFrZXMgdGhhdCBydW4gY29tbWFuZHMgb24KLSMgb3RoZXIgbWFjaGluZXMuICBCdXQgdGhhdCBtaWdodCB0YWtlIHVzIG92ZXIgdGhlIDE0LWNoYXIgbGltaXQuCi1kaXJuYW1lPXlsd3JhcCQkCi10cmFwICJjZCBgcHdkYDsgcm0gLXJmICRkaXJuYW1lID4gL2Rldi9udWxsIDI+JjEiIDEgMiAzIDE1Ci1ta2RpciAkZGlybmFtZSB8fCBleGl0IDEKLQotY2QgJGRpcm5hbWUKLWNhc2UgIiRpbnB1dCIgaW4KLSAvKiB8IFtBLVphLXpdOlxcKikKLSAgICAjIEFic29sdXRlIHBhdGg7IGRvIG5vdGhpbmcuCi0gICAgOzsKLSAqKQotICAgICMgTWFrZSBhIHN5bWJvbGljIGxpbmssIGhhcmQgbGluayBvciBoYXJkY29weS4KLSAgICBsbiAtcyAuLi8iJGlucHV0IiAuID4gL2Rldi9udWxsIDI+JjEgfHwgbG4gLi4vIiRpbnB1dCIgLiA+IC9kZXYvbnVsbCAyPiYxIHx8IGNwIC4uLyIkaW5wdXQiIC4KLSAgICA7OwotZXNhYwotJHByb2cgJHsxKyIkQCJ9ICIkaW5wdXQiCi1zdGF0dXM9JD8KLQotaWYgdGVzdCAkc3RhdHVzIC1lcSAwOyB0aGVuCi0gICBzZXQgWCAkcGFpcmxpc3QKLSAgIHNoaWZ0Ci0gICBmaXJzdD15ZXMKLSAgIHdoaWxlIHRlc3QgIiQjIiAtbmUgMDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiQxIjsgdGhlbgotICAgICAgICAgIyBJZiAkMiBpcyBhbiBhYnNvbHV0ZSBwYXRoIG5hbWUsIHRoZW4ganVzdCB1c2UgdGhhdCwKLSAgICAgICAgICMgb3RoZXJ3aXNlIHByZXBlbmQgYC4uLycuCi0gICAgICAgICBjYXNlICIkMiIgaW4KLQkgICAvKiB8IFtBLVphLXpdOlxcKikgdGFyZ2V0PSIkMiI7OwotCSAgICopIHRhcmdldD0iLi4vJDIiOzsKLQkgZXNhYwotCSBtdiAiJDEiICIkdGFyZ2V0IiB8fCBzdGF0dXM9JD8KLSAgICAgIGVsc2UKLQkgIyBBIG1pc3NpbmcgZmlsZSBpcyBvbmx5IGFuIGVycm9yIGZvciB0aGUgZmlyc3QgZmlsZS4gIFRoaXMKLQkgIyBpcyBhIGJsYXRhbnQgaGFjayB0byBsZXQgdXMgc3VwcG9ydCB1c2luZyAieWFjYyAtZCIuICBJZiAtZAotCSAjIGlzIG5vdCBzcGVjaWZpZWQsIHdlIGRvbid0IHdhbnQgYW4gZXJyb3Igd2hlbiB0aGUgaGVhZGVyCi0JICMgZmlsZSBpcyAibWlzc2luZyIuCi0JIGlmIHRlc3QgJGZpcnN0ID0geWVzOyB0aGVuCi0JICAgIHN0YXR1cz0xCi0JIGZpCi0gICAgICBmaQotICAgICAgc2hpZnQKLSAgICAgIHNoaWZ0Ci0gICAgICBmaXJzdD1ubwotICAgZG9uZQotZWxzZQotICAgc3RhdHVzPSQ/Ci1maQotCi0jIFJlbW92ZSB0aGUgZGlyZWN0b3J5LgotY2QgLi4KLXJtIC1yZiAkZGlybmFtZQotCi1leGl0ICRzdGF0dXMK